summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS12
-rw-r--r--LICENSE27
-rw-r--r--core/include/fdrm/fx_crypt.h43
-rw-r--r--core/include/fpdfapi/fpdf_module.h205
-rw-r--r--core/include/fpdfapi/fpdf_objects.h785
-rw-r--r--core/include/fpdfapi/fpdf_page.h249
-rw-r--r--core/include/fpdfapi/fpdf_pageobj.h721
-rw-r--r--core/include/fpdfapi/fpdf_parser.h1149
-rw-r--r--core/include/fpdfapi/fpdf_render.h318
-rw-r--r--core/include/fpdfapi/fpdf_resource.h960
-rw-r--r--core/include/fpdfapi/fpdf_serial.h203
-rw-r--r--core/include/fpdfapi/fpdfapi.h15
-rw-r--r--core/include/fpdfdoc/fpdf_ap.h92
-rw-r--r--core/include/fpdfdoc/fpdf_doc.h1792
-rw-r--r--core/include/fpdfdoc/fpdf_tagged.h99
-rw-r--r--core/include/fpdfdoc/fpdf_vt.h444
-rw-r--r--core/include/fpdftext/fpdf_text.h173
-rw-r--r--core/include/fxcodec/fx_codec.h288
-rw-r--r--core/include/fxcodec/fx_codec_def.h71
-rw-r--r--core/include/fxcodec/fx_codec_provider.h53
-rw-r--r--core/include/fxcrt/fx_arb.h20
-rw-r--r--core/include/fxcrt/fx_basic.h1642
-rw-r--r--core/include/fxcrt/fx_coordinates.h900
-rw-r--r--core/include/fxcrt/fx_ext.h103
-rw-r--r--core/include/fxcrt/fx_memory.h300
-rw-r--r--core/include/fxcrt/fx_stream.h200
-rw-r--r--core/include/fxcrt/fx_string.h870
-rw-r--r--core/include/fxcrt/fx_system.h279
-rw-r--r--core/include/fxcrt/fx_ucd.h112
-rw-r--r--core/include/fxcrt/fx_xml.h209
-rw-r--r--core/include/fxge/fpf.h55
-rw-r--r--core/include/fxge/fx_dib.h606
-rw-r--r--core/include/fxge/fx_font.h428
-rw-r--r--core/include/fxge/fx_freetype.h144
-rw-r--r--core/include/fxge/fx_ge.h733
-rw-r--r--core/include/fxge/fx_ge_apple.h26
-rw-r--r--core/include/fxge/fx_ge_win32.h105
-rw-r--r--core/include/reflow/fpdf_layout.h280
-rw-r--r--core/include/reflow/reflowengine.h76
-rw-r--r--core/include/thirdparties/freetype/foxitnames.h283
-rw-r--r--core/include/thirdparties/freetype/freetype/config/ftconfig.h599
-rw-r--r--core/include/thirdparties/freetype/freetype/config/ftheader.h832
-rw-r--r--core/include/thirdparties/freetype/freetype/config/ftmodule.h32
-rw-r--r--core/include/thirdparties/freetype/freetype/config/ftoption.h833
-rw-r--r--core/include/thirdparties/freetype/freetype/config/ftstdlib.h174
-rw-r--r--core/include/thirdparties/freetype/freetype/freetype.h4016
-rw-r--r--core/include/thirdparties/freetype/freetype/ftadvanc.h182
-rw-r--r--core/include/thirdparties/freetype/freetype/ftautoh.h357
-rw-r--r--core/include/thirdparties/freetype/freetype/ftbbox.h102
-rw-r--r--core/include/thirdparties/freetype/freetype/ftbdf.h209
-rw-r--r--core/include/thirdparties/freetype/freetype/ftbitmap.h227
-rw-r--r--core/include/thirdparties/freetype/freetype/ftbzip2.h102
-rw-r--r--core/include/thirdparties/freetype/freetype/ftcache.h1057
-rw-r--r--core/include/thirdparties/freetype/freetype/ftcffdrv.h151
-rw-r--r--core/include/thirdparties/freetype/freetype/ftchapters.h120
-rw-r--r--core/include/thirdparties/freetype/freetype/ftcid.h166
-rw-r--r--core/include/thirdparties/freetype/freetype/fterrdef.h249
-rw-r--r--core/include/thirdparties/freetype/freetype/fterrors.h198
-rw-r--r--core/include/thirdparties/freetype/freetype/ftgasp.h128
-rw-r--r--core/include/thirdparties/freetype/freetype/ftglyph.h620
-rw-r--r--core/include/thirdparties/freetype/freetype/ftgxval.h358
-rw-r--r--core/include/thirdparties/freetype/freetype/ftgzip.h102
-rw-r--r--core/include/thirdparties/freetype/freetype/ftimage.h1322
-rw-r--r--core/include/thirdparties/freetype/freetype/ftincrem.h353
-rw-r--r--core/include/thirdparties/freetype/freetype/ftlcdfil.h251
-rw-r--r--core/include/thirdparties/freetype/freetype/ftlist.h277
-rw-r--r--core/include/thirdparties/freetype/freetype/ftlzw.h99
-rw-r--r--core/include/thirdparties/freetype/freetype/ftmac.h274
-rw-r--r--core/include/thirdparties/freetype/freetype/ftmm.h378
-rw-r--r--core/include/thirdparties/freetype/freetype/ftmodapi.h641
-rw-r--r--core/include/thirdparties/freetype/freetype/ftmoderr.h194
-rw-r--r--core/include/thirdparties/freetype/freetype/ftotval.h203
-rw-r--r--core/include/thirdparties/freetype/freetype/ftoutln.h560
-rw-r--r--core/include/thirdparties/freetype/freetype/ftpfr.h172
-rw-r--r--core/include/thirdparties/freetype/freetype/ftrender.h238
-rw-r--r--core/include/thirdparties/freetype/freetype/ftsizes.h159
-rw-r--r--core/include/thirdparties/freetype/freetype/ftsnames.h200
-rw-r--r--core/include/thirdparties/freetype/freetype/ftstroke.h751
-rw-r--r--core/include/thirdparties/freetype/freetype/ftsynth.h81
-rw-r--r--core/include/thirdparties/freetype/freetype/ftsystem.h354
-rw-r--r--core/include/thirdparties/freetype/freetype/fttrigon.h350
-rw-r--r--core/include/thirdparties/freetype/freetype/ftttdrv.h150
-rw-r--r--core/include/thirdparties/freetype/freetype/fttypes.h598
-rw-r--r--core/include/thirdparties/freetype/freetype/ftwinfnt.h274
-rw-r--r--core/include/thirdparties/freetype/freetype/ftxf86.h83
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/autohint.h244
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftcalc.h167
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftdebug.h255
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftdriver.h409
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftgloadr.h168
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftmemory.h459
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftobjs.h1569
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftpic.h71
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftrfork.h258
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftserv.h763
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftstream.h536
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/fttrace.h152
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/ftvalid.h161
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/internal.h63
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/psaux.h877
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/pshints.h722
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svbdf.h82
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svcid.h89
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svgldict.h88
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svgxval.h72
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svkern.h51
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svmm.h113
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svotval.h55
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svpfr.h66
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h81
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svprop.h81
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h177
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h111
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h103
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h107
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svtteng.h53
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h68
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h50
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h55
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/sfnt.h707
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/t1types.h255
-rw-r--r--core/include/thirdparties/freetype/freetype/internal/tttypes.h1440
-rw-r--r--core/include/thirdparties/freetype/freetype/t1tables.h662
-rw-r--r--core/include/thirdparties/freetype/freetype/ttnameid.h1237
-rw-r--r--core/include/thirdparties/freetype/freetype/tttables.h777
-rw-r--r--core/include/thirdparties/freetype/freetype/tttags.h109
-rw-r--r--core/include/thirdparties/freetype/freetype/ttunpat.h59
-rw-r--r--core/include/thirdparties/freetype/ft2build.h40
-rw-r--r--core/include/thirdparties/libjpeg/jconfig.h45
-rw-r--r--core/include/thirdparties/libjpeg/jerror.h291
-rw-r--r--core/include/thirdparties/libjpeg/jmorecfg.h376
-rw-r--r--core/include/thirdparties/libjpeg/jpegint.h392
-rw-r--r--core/include/thirdparties/libjpeg/jpeglib.h1165
-rw-r--r--core/include/thirdparties/zlib/zconf.h519
-rw-r--r--core/include/thirdparties/zlib/zlib.h1828
-rw-r--r--core/src/fdrm/crypto/fx_crypt.cpp259
-rw-r--r--core/src/fdrm/crypto/fx_crypt_aes.cpp1013
-rw-r--r--core/src/fdrm/crypto/fx_crypt_sha.cpp742
-rw-r--r--core/src/fpdfapi/fpdf_basic_module.cpp178
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp2394
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp91
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp12
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp182
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp201
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp93
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp13
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp9
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp14
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp412
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp13
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp5481
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp13
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp3651
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp50
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp3794
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp38
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp15
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp1365
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp15
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp1706
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp22
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp1365
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp15
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp39
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp15
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp4617
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp16
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp48
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp82
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp65
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp34
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp65
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp34
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp96
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp220
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp27
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp1939
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp48
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp17
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp230
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp21
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp48
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp10
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp75
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp2451
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp71
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp3449
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp81
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp17
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp62
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp2302
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp164
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp14
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp233
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp14
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp233
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp14
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp178
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp2806
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp14
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp48
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp42
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/cmap_int.h20
-rw-r--r--core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp183
-rw-r--r--core/src/fpdfapi/fpdf_edit/editint.h59
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp164
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp2131
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp1205
-rw-r--r--core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp374
-rw-r--r--core/src/fpdfapi/fpdf_font/common.h17
-rw-r--r--core/src/fpdfapi/fpdf_font/font_int.h201
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font.cpp1763
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp625
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp1716
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp97
-rw-r--r--core/src/fpdfapi/fpdf_font/ttgsubtable.cpp452
-rw-r--r--core/src/fpdfapi/fpdf_font/ttgsubtable.h419
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page.cpp1047
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp1401
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp647
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp886
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp707
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp116
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp1681
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp822
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp1146
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp52
-rw-r--r--core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp278
-rw-r--r--core/src/fpdfapi/fpdf_page/pageint.h505
-rw-r--r--core/src/fpdfapi/fpdf_parser/filters_int.h119
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp533
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp398
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp957
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp224
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp909
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp1344
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp4378
-rw-r--r--core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp453
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render.cpp1488
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp389
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp1165
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp1524
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp1093
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp760
-rw-r--r--core/src/fpdfapi/fpdf_render/render_int.h462
-rw-r--r--core/src/fpdfdoc/doc_action.cpp362
-rw-r--r--core/src/fpdfdoc/doc_annot.cpp519
-rw-r--r--core/src/fpdfdoc/doc_ap.cpp808
-rw-r--r--core/src/fpdfdoc/doc_basic.cpp567
-rw-r--r--core/src/fpdfdoc/doc_bookmark.cpp91
-rw-r--r--core/src/fpdfdoc/doc_form.cpp1664
-rw-r--r--core/src/fpdfdoc/doc_formcontrol.cpp461
-rw-r--r--core/src/fpdfdoc/doc_formfield.cpp1095
-rw-r--r--core/src/fpdfdoc/doc_link.cpp105
-rw-r--r--core/src/fpdfdoc/doc_metadata.cpp152
-rw-r--r--core/src/fpdfdoc/doc_ocg.cpp300
-rw-r--r--core/src/fpdfdoc/doc_tagged.cpp448
-rw-r--r--core/src/fpdfdoc/doc_utils.cpp749
-rw-r--r--core/src/fpdfdoc/doc_viewerPreferences.cpp31
-rw-r--r--core/src/fpdfdoc/doc_vt.cpp1864
-rw-r--r--core/src/fpdfdoc/doc_vtmodule.cpp17
-rw-r--r--core/src/fpdfdoc/pdf_vt.h642
-rw-r--r--core/src/fpdfdoc/tagged_int.h91
-rw-r--r--core/src/fpdftext/fpdf_text.cpp791
-rw-r--r--core/src/fpdftext/fpdf_text_int.cpp2804
-rw-r--r--core/src/fpdftext/fpdf_text_search.cpp325
-rw-r--r--core/src/fpdftext/text_int.h215
-rw-r--r--core/src/fpdftext/txtproc.h70
-rw-r--r--core/src/fpdftext/unicodenormalization.cpp75
-rw-r--r--core/src/fpdftext/unicodenormalizationdata.cpp4661
-rw-r--r--core/src/fx_freetype.h15
-rw-r--r--core/src/fx_jpeglib.h10
-rw-r--r--core/src/fx_zlib.h10
-rw-r--r--core/src/fxcodec/codec/codec_int.h270
-rw-r--r--core/src/fxcodec/codec/fx_codec.cpp447
-rw-r--r--core/src/fxcodec/codec/fx_codec_fax.cpp968
-rw-r--r--core/src/fxcodec/codec/fx_codec_flate.cpp945
-rw-r--r--core/src/fxcodec/codec/fx_codec_icc.cpp1360
-rw-r--r--core/src/fxcodec/codec/fx_codec_jbig.cpp212
-rw-r--r--core/src/fxcodec/codec/fx_codec_jbig_enc.cpp11
-rw-r--r--core/src/fxcodec/codec/fx_codec_jpeg.cpp735
-rw-r--r--core/src/fxcodec/codec/fx_codec_jpx_opj.cpp799
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h13
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt98
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c194
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h134
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c658
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h399
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c925
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h122
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c146
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h102
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c119
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h131
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c240
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h68
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h148
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c294
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h64
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c10295
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h844
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c2825
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h495
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c342
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h155
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c610
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h207
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c960
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h1501
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c64
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h59
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h165
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h2
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in2
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h43
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h180
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h178
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h48
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h194
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h52
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c1876
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h188
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c95
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h106
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c1757
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h163
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c282
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h143
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c1344
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h133
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c2129
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h354
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c337
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h146
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_event.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_image.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c9
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c9
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c10
-rw-r--r--core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c10
-rw-r--r--core/src/fxcodec/fx_zlib/include/fx_zlib.h10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c10
-rw-r--r--core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c10
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/crc32.h441
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/deflate.h346
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c179
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c80
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c425
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c1966
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c640
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c340
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c1513
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c306
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c1226
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c59
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c349
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c25
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h227
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c634
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/gzread.c594
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c576
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/inffast.h11
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h94
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/inflate.h122
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h62
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/trees.h128
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/zconf.h519
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/zlib.h1832
-rw-r--r--core/src/fxcodec/fx_zlib/zlib_v128/zutil.h255
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithDecoder.h126
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp105
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h39
-rw-r--r--core/src/fxcodec/jbig2/JBig2_ArithQe.h64
-rw-r--r--core/src/fxcodec/jbig2/JBig2_BitStream.h316
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Context.cpp1812
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Context.h135
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Define.h34
-rw-r--r--core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp4290
-rw-r--r--core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h278
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp55
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h24
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp193
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable.h42
-rw-r--r--core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h251
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Image.cpp1619
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Image.h68
-rw-r--r--core/src/fxcodec/jbig2/JBig2_List.h67
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Module.h32
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Object.cpp72
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Object.h43
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Page.h19
-rw-r--r--core/src/fxcodec/jbig2/JBig2_PatternDict.cpp24
-rw-r--r--core/src/fxcodec/jbig2/JBig2_PatternDict.h22
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Segment.cpp53
-rw-r--r--core/src/fxcodec/jbig2/JBig2_Segment.h68
-rw-r--r--core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp34
-rw-r--r--core/src/fxcodec/jbig2/JBig2_SymbolDict.h26
-rw-r--r--core/src/fxcodec/lcms2/include/fx_lcms2.h10
-rw-r--r--core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h10
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h1882
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h637
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c486
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c2775
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c1142
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c707
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c1298
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c590
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c534
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c1506
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c1883
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c1020
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c1793
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c343
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c175
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c929
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c1795
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c3369
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c931
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c955
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c1597
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c572
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c734
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c5564
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c1194
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c349
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c1132
-rw-r--r--core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h1032
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscam02.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscgats.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmscnvrt.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmserr.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsgamma.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsgmt.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmshalf.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsintrp.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsio0.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsio1.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmslut.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsmd5.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsmtrx.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsnamed.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsopt.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmspack.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmspcs.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsplugin.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsps2.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmssamp.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmssm.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmstypes.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsvirt.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmswtpnt.c7
-rw-r--r--core/src/fxcodec/lcms2/src/fx_cmsxform.c7
-rw-r--r--core/src/fxcodec/libjpeg/cderror.h132
-rw-r--r--core/src/fxcodec/libjpeg/cdjpeg.h184
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c283
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c164
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c452
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jccolor.c462
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c390
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jchuff.c915
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcinit.c75
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c296
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c667
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c593
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c109
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcparam.c613
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c836
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c357
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jcsample.c522
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jctrans.c391
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c398
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c279
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c739
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c399
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c272
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c657
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdinput.c384
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c515
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c1396
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c560
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c406
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c671
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c293
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdsample.c481
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c146
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jerror.c255
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c227
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c286
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c371
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctint.c392
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jidctred.c401
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c1123
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c126
-rw-r--r--core/src/fxcodec/libjpeg/fpdfapi_jutils.c182
-rw-r--r--core/src/fxcodec/libjpeg/jchuff.h47
-rw-r--r--core/src/fxcodec/libjpeg/jconfig.h45
-rw-r--r--core/src/fxcodec/libjpeg/jdct.h176
-rw-r--r--core/src/fxcodec/libjpeg/jdhuff.h201
-rw-r--r--core/src/fxcodec/libjpeg/jerror.h291
-rw-r--r--core/src/fxcodec/libjpeg/jinclude.h102
-rw-r--r--core/src/fxcodec/libjpeg/jmemsys.h200
-rw-r--r--core/src/fxcodec/libjpeg/jmorecfg.h376
-rw-r--r--core/src/fxcodec/libjpeg/jpegint.h392
-rw-r--r--core/src/fxcodec/libjpeg/jpeglib.h1165
-rw-r--r--core/src/fxcodec/libjpeg/jversion.h14
-rw-r--r--core/src/fxcodec/libjpeg/makefile8
-rw-r--r--core/src/fxcodec/libjpeg/transupp.h135
-rw-r--r--core/src/fxcrt/extension.h413
-rw-r--r--core/src/fxcrt/fx_arabic.cpp86
-rw-r--r--core/src/fxcrt/fx_arabic.h34
-rw-r--r--core/src/fxcrt/fx_basic_array.cpp365
-rw-r--r--core/src/fxcrt/fx_basic_bstring.cpp1204
-rw-r--r--core/src/fxcrt/fx_basic_buffer.cpp574
-rw-r--r--core/src/fxcrt/fx_basic_coords.cpp556
-rw-r--r--core/src/fxcrt/fx_basic_gcc.cpp232
-rw-r--r--core/src/fxcrt/fx_basic_list.cpp141
-rw-r--r--core/src/fxcrt/fx_basic_maps.cpp654
-rw-r--r--core/src/fxcrt/fx_basic_memmgr.cpp306
-rw-r--r--core/src/fxcrt/fx_basic_memmgr_mini.cpp822
-rw-r--r--core/src/fxcrt/fx_basic_plex.cpp28
-rw-r--r--core/src/fxcrt/fx_basic_utf.cpp102
-rw-r--r--core/src/fxcrt/fx_basic_util.cpp444
-rw-r--r--core/src/fxcrt/fx_basic_wstring.cpp1168
-rw-r--r--core/src/fxcrt/fx_extension.cpp401
-rw-r--r--core/src/fxcrt/fx_ucddata.cpp4145
-rw-r--r--core/src/fxcrt/fx_unicode.cpp65
-rw-r--r--core/src/fxcrt/fx_xml_composer.cpp42
-rw-r--r--core/src/fxcrt/fx_xml_parser.cpp1017
-rw-r--r--core/src/fxcrt/fxcrt_platforms.cpp203
-rw-r--r--core/src/fxcrt/fxcrt_platforms.h35
-rw-r--r--core/src/fxcrt/fxcrt_posix.cpp201
-rw-r--r--core/src/fxcrt/fxcrt_posix.h33
-rw-r--r--core/src/fxcrt/fxcrt_windows.cpp222
-rw-r--r--core/src/fxcrt/fxcrt_windows.h33
-rw-r--r--core/src/fxcrt/mem_int.h232
-rw-r--r--core/src/fxcrt/plex.h15
-rw-r--r--core/src/fxcrt/xml_int.h178
-rw-r--r--core/src/fxge/Microsoft SDK/include/DWrite.h5006
-rw-r--r--core/src/fxge/Microsoft SDK/include/Dcommon.h65
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlus.h156
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBase.h40
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h1004
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h951
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h71
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColor.h209
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h63
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h1252
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h2740
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFont.h299
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h149
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h271
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h107
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h2726
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h793
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h73
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h540
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h253
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h309
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMem.h49
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h374
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h213
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPath.h1686
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPen.h519
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h201
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h498
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h381
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h826
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h397
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiplusInit.h104
-rw-r--r--core/src/fxge/Microsoft SDK/include/sal.h729
-rw-r--r--core/src/fxge/Microsoft SDK/include/specstrings.h978
-rw-r--r--core/src/fxge/agg/agg23/agg_array.h510
-rw-r--r--core/src/fxge/agg/agg23/agg_basics.h282
-rw-r--r--core/src/fxge/agg/agg23/agg_clip_liang_barsky.h125
-rw-r--r--core/src/fxge/agg/agg23/agg_color_gray.h50
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h138
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_dash.h61
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_stroke.h110
-rw-r--r--core/src/fxge/agg/agg23/agg_curves.h191
-rw-r--r--core/src/fxge/agg/agg23/agg_math.h63
-rw-r--r--core/src/fxge/agg/agg23/agg_math_stroke.h272
-rw-r--r--core/src/fxge/agg/agg23/agg_path_storage.h172
-rw-r--r--core/src/fxge/agg/agg23/agg_pixfmt_gray.h177
-rw-r--r--core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h472
-rw-r--r--core/src/fxge/agg/agg23/agg_render_scanlines.h50
-rw-r--r--core/src/fxge/agg/agg23/agg_renderer_base.h163
-rw-r--r--core/src/fxge/agg/agg23/agg_renderer_scanline.h93
-rw-r--r--core/src/fxge/agg/agg23/agg_rendering_buffer.h145
-rw-r--r--core/src/fxge/agg/agg23/agg_scanline_u.h150
-rw-r--r--core/src/fxge/agg/agg23/agg_shorten_path.h57
-rw-r--r--core/src/fxge/agg/agg23/agg_vcgen_dash.h75
-rw-r--r--core/src/fxge/agg/agg23/agg_vcgen_stroke.h120
-rw-r--r--core/src/fxge/agg/agg23/agg_vertex_sequence.h100
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_curves.cpp109
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_driver.cpp1636
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_path_storage.cpp104
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp495
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp176
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp214
-rw-r--r--core/src/fxge/agg/include/fx_agg_driver.h121
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_basics.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_conv_dash.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_conv_stroke.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_curves.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_path_storage.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_scanline_u.h10
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_curves.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_driver.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_path_storage.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp7
-rw-r--r--core/src/fxge/android/fpf_skiafont.cpp203
-rw-r--r--core/src/fxge/android/fpf_skiafont.h57
-rw-r--r--core/src/fxge/android/fpf_skiafontmgr.cpp561
-rw-r--r--core/src/fxge/android/fpf_skiafontmgr.h117
-rw-r--r--core/src/fxge/android/fpf_skiamodule.cpp46
-rw-r--r--core/src/fxge/android/fpf_skiamodule.h22
-rw-r--r--core/src/fxge/android/fx_android_font.cpp87
-rw-r--r--core/src/fxge/android/fx_android_font.h36
-rw-r--r--core/src/fxge/android/fx_android_imp.cpp32
-rw-r--r--core/src/fxge/android/fx_fpf.h14
-rw-r--r--core/src/fxge/apple/apple_int.h246
-rw-r--r--core/src/fxge/apple/fx_apple_platform.cpp173
-rw-r--r--core/src/fxge/apple/fx_mac_imp.cpp117
-rw-r--r--core/src/fxge/apple/fx_quartz_device.cpp1138
-rw-r--r--core/src/fxge/dib/dib_int.h88
-rw-r--r--core/src/fxge/dib/fx_dib_composite.cpp4602
-rw-r--r--core/src/fxge/dib/fx_dib_convert.cpp1090
-rw-r--r--core/src/fxge/dib/fx_dib_engine.cpp867
-rw-r--r--core/src/fxge/dib/fx_dib_main.cpp1734
-rw-r--r--core/src/fxge/dib/fx_dib_transform.cpp797
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c3697
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixed.c2208
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c2265
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c2402
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c2352
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSans.c1886
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c2051
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c2061
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c2051
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c4191
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerif.c2442
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c2433
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c2600
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c2662
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c7097
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c2099
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h288
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h599
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h832
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h32
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h833
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h174
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h4016
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h182
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h357
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h209
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h227
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h1057
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h151
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h120
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h166
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h249
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h198
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h128
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h620
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h358
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h1322
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h353
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h251
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h277
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h99
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h274
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h378
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h641
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h194
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h203
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h560
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h172
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h238
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h159
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h200
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h751
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h354
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h350
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h150
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h598
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h274
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h244
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h167
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h255
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h409
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h168
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h459
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h1569
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h71
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h258
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h763
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h536
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h152
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h161
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h877
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h722
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h82
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h89
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h72
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h113
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h66
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h111
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h103
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h107
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h68
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h50
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h707
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h255
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h1440
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h662
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h1237
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h777
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h109
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h59
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile60
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c108
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h90
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c162
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c121
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h69
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c649
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c972
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c117
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c992
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c266
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c62
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c61
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c405
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c142
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c1061
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c4867
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c91
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c1081
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c286
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c146
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c849
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c94
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c865
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c2418
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c153
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c492
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c120
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c548
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c44
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c760
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c631
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c285
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c381
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c206
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c375
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c295
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h45
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk99
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c241
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h100
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c578
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h185
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c52
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h119
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h95
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c404
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h114
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c639
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h147
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h144
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c1747
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h287
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c1540
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h68
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c205
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h106
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h78
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c210
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h67
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c787
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c3072
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h240
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c1696
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c1082
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h183
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c1177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h106
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c138
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h108
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h97
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h284
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c45
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk86
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c442
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c690
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c491
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h154
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c225
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h123
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c236
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h43
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c33
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile31
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c964
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c139
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c641
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c1767
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h212
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c341
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h105
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c1620
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h64
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c33
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c2305
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h246
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c805
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h196
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c119
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h39
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c76
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c1225
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h176
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c670
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c26
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c97
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h66
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h4184
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk71
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h142
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c3640
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c306
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h44
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c35
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c103
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h69
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c47
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c336
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h48
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk78
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c529
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c143
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h114
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c1165
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h54
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c250
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c3560
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h158
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h56
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c306
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h52
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c1295
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c286
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c563
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c1177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c2137
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h58
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c534
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h49
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c118
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c31
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk27
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c572
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c2337
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h61
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c1532
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h182
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c8952
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h397
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c1346
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h442
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c101
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c601
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h75
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c1011
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h110
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c37
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c396
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h54
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c726
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c517
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c2272
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c616
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h160
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c497
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h135
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h143
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_cffobjs.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_cfftypes.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_freetype.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ft2build.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftmm.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftobjs.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftotval.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftoutln.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftstream.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_tttables.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_tttypes.h10
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_cff.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftbase.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftbitmap.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftglyph.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftinit.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftmm.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftsystem.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_psaux.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_pshinter.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_psmodule.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_raster.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_sfnt.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_smooth.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_truetype.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_type1.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_type1cid.c7
-rw-r--r--core/src/fxge/ge/fx_ge.cpp79
-rw-r--r--core/src/fxge/ge/fx_ge_device.cpp405
-rw-r--r--core/src/fxge/ge/fx_ge_font.cpp458
-rw-r--r--core/src/fxge/ge/fx_ge_fontmap.cpp1558
-rw-r--r--core/src/fxge/ge/fx_ge_linux.cpp259
-rw-r--r--core/src/fxge/ge/fx_ge_path.cpp654
-rw-r--r--core/src/fxge/ge/fx_ge_ps.cpp657
-rw-r--r--core/src/fxge/ge/fx_ge_text.cpp1774
-rw-r--r--core/src/fxge/ge/text_int.h100
-rw-r--r--core/src/fxge/win32/dwrite_int.h59
-rw-r--r--core/src/fxge/win32/fx_win32_device.cpp1200
-rw-r--r--core/src/fxge/win32/fx_win32_dib.cpp310
-rw-r--r--core/src/fxge/win32/fx_win32_dwrite.cpp480
-rw-r--r--core/src/fxge/win32/fx_win32_gdipext.cpp1286
-rw-r--r--core/src/fxge/win32/fx_win32_print.cpp426
-rw-r--r--core/src/fxge/win32/win32_int.h238
-rw-r--r--core/src/reflow/autoreflow.cpp781
-rw-r--r--core/src/reflow/autoreflow.h122
-rw-r--r--core/src/reflow/layoutprocessor_reflow.cpp1560
-rw-r--r--core/src/reflow/layoutprovider_taggedpdf.cpp780
-rw-r--r--core/src/reflow/layoutprovider_taggedpdf.h82
-rw-r--r--core/src/reflow/reflowedpage.cpp622
-rw-r--r--core/src/reflow/reflowedpage.h372
-rw-r--r--core/src/reflow/reflowedtextpage.cpp402
-rw-r--r--core/src/reflow/reflowedtextpage.h71
-rw-r--r--core/src/reflow/reflowengine.cpp38
-rw-r--r--fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h51
-rw-r--r--fpdfsdk/include/formfiller/FFL_CheckBox.h27
-rw-r--r--fpdfsdk/include/formfiller/FFL_ComboBox.h69
-rw-r--r--fpdfsdk/include/formfiller/FFL_FormFiller.h178
-rw-r--r--fpdfsdk/include/formfiller/FFL_IFormFiller.h144
-rw-r--r--fpdfsdk/include/formfiller/FFL_ListBox.h44
-rw-r--r--fpdfsdk/include/formfiller/FFL_Notify.h54
-rw-r--r--fpdfsdk/include/formfiller/FFL_PushButton.h25
-rw-r--r--fpdfsdk/include/formfiller/FFL_RadioButton.h25
-rw-r--r--fpdfsdk/include/formfiller/FFL_TextField.h89
-rw-r--r--fpdfsdk/include/formfiller/FFL_Utils.h20
-rw-r--r--fpdfsdk/include/formfiller/FormFiller.h30
-rw-r--r--fpdfsdk/include/fpdf_dataavail.h222
-rw-r--r--fpdfsdk/include/fpdf_ext.h108
-rw-r--r--fpdfsdk/include/fpdf_flatten.h42
-rw-r--r--fpdfsdk/include/fpdf_fwlevent.h286
-rw-r--r--fpdfsdk/include/fpdf_progressive.h94
-rw-r--r--fpdfsdk/include/fpdf_searchex.h33
-rw-r--r--fpdfsdk/include/fpdf_sysfontinfo.h241
-rw-r--r--fpdfsdk/include/fpdf_transformpage.h113
-rw-r--r--fpdfsdk/include/fpdfdoc.h230
-rw-r--r--fpdfsdk/include/fpdfedit.h235
-rw-r--r--fpdfsdk/include/fpdfformfill.h841
-rw-r--r--fpdfsdk/include/fpdfoom.h61
-rw-r--r--fpdfsdk/include/fpdfppo.h34
-rw-r--r--fpdfsdk/include/fpdfsave.h81
-rw-r--r--fpdfsdk/include/fpdftext.h316
-rw-r--r--fpdfsdk/include/fpdfview.h578
-rw-r--r--fpdfsdk/include/fsdk_actionhandler.h82
-rw-r--r--fpdfsdk/include/fsdk_annothandler.h248
-rw-r--r--fpdfsdk/include/fsdk_baseannot.h186
-rw-r--r--fpdfsdk/include/fsdk_baseform.h292
-rw-r--r--fpdfsdk/include/fsdk_common.h46
-rw-r--r--fpdfsdk/include/fsdk_define.h128
-rw-r--r--fpdfsdk/include/fsdk_mgr.h615
-rw-r--r--fpdfsdk/include/fsdk_rendercontext.h41
-rw-r--r--fpdfsdk/include/fx_systemhandler.h85
-rw-r--r--fpdfsdk/include/fxedit/fx_edit.h471
-rw-r--r--fpdfsdk/include/fxedit/fxet_edit.h823
-rw-r--r--fpdfsdk/include/fxedit/fxet_list.h363
-rw-r--r--fpdfsdk/include/fxedit/fxet_stub.h26
-rw-r--r--fpdfsdk/include/javascript/Consts.h126
-rw-r--r--fpdfsdk/include/javascript/Document.h282
-rw-r--r--fpdfsdk/include/javascript/Field.h355
-rw-r--r--fpdfsdk/include/javascript/IJavaScript.h112
-rw-r--r--fpdfsdk/include/javascript/Icon.h42
-rw-r--r--fpdfsdk/include/javascript/JS_Console.h239
-rw-r--r--fpdfsdk/include/javascript/JS_Context.h101
-rw-r--r--fpdfsdk/include/javascript/JS_Define.h785
-rw-r--r--fpdfsdk/include/javascript/JS_EventHandler.h167
-rw-r--r--fpdfsdk/include/javascript/JS_GlobalData.h97
-rw-r--r--fpdfsdk/include/javascript/JS_Module.h47
-rw-r--r--fpdfsdk/include/javascript/JS_Object.h288
-rw-r--r--fpdfsdk/include/javascript/JS_Runtime.h70
-rw-r--r--fpdfsdk/include/javascript/JS_Value.h186
-rw-r--r--fpdfsdk/include/javascript/JavaScript.h39
-rw-r--r--fpdfsdk/include/javascript/PublicMethods.h101
-rw-r--r--fpdfsdk/include/javascript/app.h225
-rw-r--r--fpdfsdk/include/javascript/color.h78
-rw-r--r--fpdfsdk/include/javascript/console.h38
-rw-r--r--fpdfsdk/include/javascript/event.h70
-rw-r--r--fpdfsdk/include/javascript/global.h85
-rw-r--r--fpdfsdk/include/javascript/report.h35
-rw-r--r--fpdfsdk/include/javascript/resource.h110
-rw-r--r--fpdfsdk/include/javascript/util.h45
-rw-r--r--fpdfsdk/include/jsapi/fxjs_v8.h148
-rw-r--r--fpdfsdk/include/pdfwindow/IPDFWindow.h28
-rw-r--r--fpdfsdk/include/pdfwindow/PDFWindow.h28
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Button.h28
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Caret.h58
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_ComboBox.h115
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Edit.h138
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_EditCtrl.h171
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_FontMap.h137
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Icon.h59
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_IconList.h125
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Label.h51
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_ListBox.h103
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_ListCtrl.h53
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Note.h355
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_ScrollBar.h166
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Signature.h67
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_SpecialButton.h63
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Utils.h237
-rw-r--r--fpdfsdk/include/pdfwindow/PWL_Wnd.h493
-rw-r--r--fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp300
-rw-r--r--fpdfsdk/src/formfiller/FFL_CheckBox.cpp144
-rw-r--r--fpdfsdk/src/formfiller/FFL_ComboBox.cpp442
-rw-r--r--fpdfsdk/src/formfiller/FFL_FormFiller.cpp925
-rw-r--r--fpdfsdk/src/formfiller/FFL_IFormFiller.cpp1197
-rw-r--r--fpdfsdk/src/formfiller/FFL_ListBox.cpp319
-rw-r--r--fpdfsdk/src/formfiller/FFL_Notify.cpp172
-rw-r--r--fpdfsdk/src/formfiller/FFL_PushButton.cpp43
-rw-r--r--fpdfsdk/src/formfiller/FFL_RadioButton.cpp137
-rw-r--r--fpdfsdk/src/formfiller/FFL_TextField.cpp412
-rw-r--r--fpdfsdk/src/formfiller/FFL_Utils.cpp133
-rw-r--r--fpdfsdk/src/fpdf_dataavail.cpp165
-rw-r--r--fpdfsdk/src/fpdf_ext.cpp245
-rw-r--r--fpdfsdk/src/fpdf_flatten.cpp561
-rw-r--r--fpdfsdk/src/fpdf_progressive.cpp114
-rw-r--r--fpdfsdk/src/fpdf_searchex.cpp15
-rw-r--r--fpdfsdk/src/fpdf_sysfontinfo.cpp163
-rw-r--r--fpdfsdk/src/fpdf_transformpage.cpp325
-rw-r--r--fpdfsdk/src/fpdfdoc.cpp259
-rw-r--r--fpdfsdk/src/fpdfeditimg.cpp74
-rw-r--r--fpdfsdk/src/fpdfeditpage.cpp316
-rw-r--r--fpdfsdk/src/fpdfformfill.cpp441
-rw-r--r--fpdfsdk/src/fpdfoom.cpp27
-rw-r--r--fpdfsdk/src/fpdfppo.cpp460
-rw-r--r--fpdfsdk/src/fpdfsave.cpp91
-rw-r--r--fpdfsdk/src/fpdfsdkdll.rc109
-rw-r--r--fpdfsdk/src/fpdftext.cpp278
-rw-r--r--fpdfsdk/src/fpdfview.cpp879
-rw-r--r--fpdfsdk/src/fsdk_actionhandler.cpp850
-rw-r--r--fpdfsdk/src/fsdk_annothandler.cpp945
-rw-r--r--fpdfsdk/src/fsdk_baseannot.cpp1187
-rw-r--r--fpdfsdk/src/fsdk_baseform.cpp3111
-rw-r--r--fpdfsdk/src/fsdk_mgr.cpp1055
-rw-r--r--fpdfsdk/src/fsdk_rendercontext.cpp49
-rw-r--r--fpdfsdk/src/fxedit/fxet_ap.cpp225
-rw-r--r--fpdfsdk/src/fxedit/fxet_edit.cpp3610
-rw-r--r--fpdfsdk/src/fxedit/fxet_list.cpp1012
-rw-r--r--fpdfsdk/src/fxedit/fxet_module.cpp46
-rw-r--r--fpdfsdk/src/fxedit/fxet_pageobjs.cpp687
-rw-r--r--fpdfsdk/src/javascript/Consts.cpp247
-rw-r--r--fpdfsdk/src/javascript/Document.cpp2527
-rw-r--r--fpdfsdk/src/javascript/Field.cpp4128
-rw-r--r--fpdfsdk/src/javascript/Icon.cpp67
-rw-r--r--fpdfsdk/src/javascript/JS_Context.cpp364
-rw-r--r--fpdfsdk/src/javascript/JS_EventHandler.cpp676
-rw-r--r--fpdfsdk/src/javascript/JS_GlobalData.cpp581
-rw-r--r--fpdfsdk/src/javascript/JS_Object.cpp145
-rw-r--r--fpdfsdk/src/javascript/JS_Runtime.cpp470
-rw-r--r--fpdfsdk/src/javascript/JS_Value.cpp643
-rw-r--r--fpdfsdk/src/javascript/PublicMethods.cpp2335
-rw-r--r--fpdfsdk/src/javascript/app.cpp1134
-rw-r--r--fpdfsdk/src/javascript/color.cpp253
-rw-r--r--fpdfsdk/src/javascript/console.cpp78
-rw-r--r--fpdfsdk/src/javascript/event.cpp379
-rw-r--r--fpdfsdk/src/javascript/global.cpp550
-rw-r--r--fpdfsdk/src/javascript/report.cpp50
-rw-r--r--fpdfsdk/src/javascript/util.cpp649
-rw-r--r--fpdfsdk/src/jsapi/fxjs_v8.cpp1043
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Button.cpp53
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Caret.cpp197
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp662
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Edit.cpp1316
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp728
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_FontMap.cpp601
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Icon.cpp272
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_IconList.cpp592
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Label.cpp187
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_ListBox.cpp632
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp245
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Note.cpp1779
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp1353
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Signature.cpp220
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp110
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Utils.cpp2844
-rw-r--r--fpdfsdk/src/pdfwindow/PWL_Wnd.cpp1342
-rw-r--r--fpdfsdk/src/resource.h21
-rw-r--r--pdfium.gyp850
1219 files changed, 582997 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000000..2f0a35fc05
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,12 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+# Name <email address>
+#
+# For organizations:
+# Organization <fnmatch pattern>
+#
+# See python fnmatch module documentation for more information.
+
+Foxit Software Inc <*@foxitsoftware.com>
+Google Inc. <*@google.com>
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..8b4ed6dddf
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/core/include/fdrm/fx_crypt.h b/core/include/fdrm/fx_crypt.h
new file mode 100644
index 0000000000..5e0b786ad0
--- /dev/null
+++ b/core/include/fdrm/fx_crypt.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_CRYPT_H_
+#define _FX_CRYPT_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+void CRYPT_ArcFourCryptBlock(FX_LPBYTE data, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen);
+void CRYPT_ArcFourSetup(FX_LPVOID context, FX_LPCBYTE key, FX_DWORD length);
+void CRYPT_ArcFourCrypt(FX_LPVOID context, FX_LPBYTE data, FX_DWORD size);
+void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt);
+void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv);
+void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);
+void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD size);
+void CRYPT_MD5Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[16]);
+void CRYPT_MD5Start(FX_LPVOID context);
+void CRYPT_MD5Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);
+void CRYPT_MD5Finish(FX_LPVOID context, FX_BYTE digest[16]);
+void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20]);
+void CRYPT_SHA1Start(FX_LPVOID context);
+void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);
+void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20]);
+void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32]);
+void CRYPT_SHA256Start(FX_LPVOID context);
+void CRYPT_SHA256Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);
+void CRYPT_SHA256Finish(FX_LPVOID context, FX_BYTE digest[32]);
+void CRYPT_SHA384Start(FX_LPVOID context);
+void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);
+void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48]);
+void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[48]);
+void CRYPT_SHA512Start(FX_LPVOID context);
+void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size);
+void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64]);
+void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64]);
+void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len));
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/core/include/fpdfapi/fpdf_module.h b/core/include/fpdfapi/fpdf_module.h
new file mode 100644
index 0000000000..bc11a96caf
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_module.h
@@ -0,0 +1,205 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_MODULE_
+#define _FPDF_MODULE_
+#ifndef _FXCRT_EXTENSION_
+#include "../fxcrt/fx_ext.h"
+#endif
+class CPDF_ModuleMgr;
+class CPDF_PageModuleDef;
+class CPDF_RenderModuleDef;
+class CPDF_SecurityHandler;
+class CCodec_ModuleMgr;
+class CPDF_Dictionary;
+class ICodec_JpegModule;
+class ICodec_JpxModule;
+class ICodec_FaxModule;
+class ICodec_Jbig2Module;
+class ICodec_IccModule;
+class ICodec_FlateModule;
+#define ADDIN_NAME_CJK "Eastern Asian Language Support"
+#define ADDIN_NAME_DECODER "JPEG2000 and JBIG2 Image Decoders"
+class CPDF_ModuleMgr : public CFX_Object
+{
+public:
+
+ static void Create();
+
+ static CPDF_ModuleMgr* Get();
+
+ static void Destroy();
+
+
+
+ void SetCodecModule(CCodec_ModuleMgr* pModule)
+ {
+ m_pCodecModule = pModule;
+ }
+ CCodec_ModuleMgr* GetCodecModule()
+ {
+ return m_pCodecModule;
+ }
+
+ void InitPageModule();
+
+ void InitRenderModule();
+
+
+ void SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path);
+
+ CFX_ByteString GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name);
+
+ void SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name));
+
+ FX_BOOL DownloadModule(FX_LPCSTR module_name);
+
+ void NotifyModuleAvailable(FX_LPCSTR module_name);
+
+
+
+ CPDF_RenderModuleDef* GetRenderModule() const
+ {
+ return m_pRenderModule;
+ }
+
+ CPDF_PageModuleDef* GetPageModule() const
+ {
+ return m_pPageModule;
+ }
+
+
+
+
+ void LoadEmbeddedGB1CMaps();
+
+ void LoadEmbeddedCNS1CMaps();
+
+ void LoadEmbeddedJapan1CMaps();
+
+ void LoadEmbeddedKorea1CMaps();
+
+ ICodec_FaxModule* GetFaxModule();
+ ICodec_JpegModule* GetJpegModule();
+ ICodec_JpxModule* GetJpxModule();
+ ICodec_Jbig2Module* GetJbig2Module();
+ ICodec_IccModule* GetIccModule();
+ ICodec_FlateModule* GetFlateModule();
+
+ void RegisterSecurityHandler(FX_LPCSTR name, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param);
+
+ CPDF_SecurityHandler* CreateSecurityHandler(FX_LPCSTR name);
+
+ void SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);
+
+ FX_LPVOID GetPrivateData(FX_LPVOID module_id);
+
+ int m_FileBufSize;
+protected:
+
+ CPDF_ModuleMgr();
+
+ ~CPDF_ModuleMgr();
+ void Initialize();
+
+ void InitModules();
+
+
+
+ CCodec_ModuleMgr* m_pCodecModule;
+
+ CPDF_RenderModuleDef* m_pRenderModule;
+
+ CPDF_PageModuleDef* m_pPageModule;
+
+
+ FX_BOOL (*m_pDownloadCallback)(FX_LPCSTR module_name);
+
+ CFX_ByteString m_DefaultModulePath;
+
+ CFX_CMapByteStringToPtr m_ModulePathList;
+
+ CFX_MapByteStringToPtr m_SecurityHandlerMap;
+
+ CFX_PrivateData m_privateData;
+};
+class CPDF_Document;
+class CPDF_DocPageData;
+class CPDF_FontGlobals;
+class IPDF_FontMgr;
+class IPDF_FontMapper;
+class CPDF_ColorSpace;
+class CPDF_PageModuleDef : public CFX_Object
+{
+public:
+ virtual ~CPDF_PageModuleDef() {}
+
+ virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc)
+ {
+ return NULL;
+ }
+
+ virtual void ReleaseDoc(CPDF_Document*) {}
+ virtual void ClearDoc(CPDF_Document*) {}
+
+ virtual CPDF_FontGlobals* GetFontGlobals()
+ {
+ return NULL;
+ }
+
+ virtual void ClearStockFont(CPDF_Document* pDoc) {}
+
+ virtual void NotifyCJKAvailable() {}
+
+ virtual CPDF_ColorSpace* GetStockCS(int family)
+ {
+ return NULL;
+ }
+};
+class CPDF_PageObjects;
+class CFX_AffineMatrix;
+class CPDF_RenderOptions;
+class CPDF_Page;
+class CPDF_DocRenderData;
+class CPDF_PageRenderCache;
+class CFX_BitmapDevice;
+class CPDF_Stream;
+class CFX_DIBSource;
+class CPDF_RenderConfig;
+class CPDF_Image;
+class CPDF_RenderModuleDef : public CFX_Object
+{
+public:
+ virtual ~CPDF_RenderModuleDef() {}
+
+ virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc)
+ {
+ return NULL;
+ }
+
+ virtual void DestroyDocData(CPDF_DocRenderData*) {}
+ virtual void ClearDocData(CPDF_DocRenderData*) {}
+
+ virtual CPDF_DocRenderData* GetRenderData()
+ {
+ return NULL;
+ }
+
+ virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage)
+ {
+ return NULL;
+ }
+
+ virtual void DestroyPageCache(CPDF_PageRenderCache*) {}
+
+ virtual void NotifyDecoderAvailable() {}
+
+ virtual CPDF_RenderConfig* GetConfig()
+ {
+ return NULL;
+ }
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h
new file mode 100644
index 0000000000..e67144b592
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_objects.h
@@ -0,0 +1,785 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_OBJECTS_
+#define _FPDF_OBJECTS_
+#ifndef _FXCRT_EXTENSION_
+#include "../fxcrt/fx_ext.h"
+#endif
+class CPDF_Document;
+class CPDF_IndirectObjects;
+class CPDF_Null;
+class CPDF_Boolean;
+class CPDF_Number;
+class CPDF_String;
+class CPDF_Stream;
+class CPDF_StreamAcc;
+class CPDF_StreamFilter;
+class CPDF_Array;
+class CPDF_Dictionary;
+class CPDF_Reference;
+class IPDF_DocParser;
+class IFX_FileRead;
+class CPDF_CryptoHandler;
+#define PDFOBJ_INVALID 0
+#define PDFOBJ_BOOLEAN 1
+#define PDFOBJ_NUMBER 2
+#define PDFOBJ_STRING 3
+#define PDFOBJ_NAME 4
+#define PDFOBJ_ARRAY 5
+#define PDFOBJ_DICTIONARY 6
+#define PDFOBJ_STREAM 7
+#define PDFOBJ_NULL 8
+#define PDFOBJ_REFERENCE 9
+typedef IFX_FileStream* (*FPDF_LPFCloneStreamCallback)(CPDF_Stream *pStream, FX_LPVOID pUserData);
+class CPDF_Object : public CFX_Object
+{
+public:
+
+ int GetType() const
+ {
+ return m_Type;
+ }
+
+ FX_DWORD GetObjNum() const
+ {
+ return m_ObjNum;
+ }
+
+ FX_BOOL IsIdentical(CPDF_Object* pObj) const;
+
+ CPDF_Object* Clone(FX_BOOL bDirect = FALSE) const;
+
+ CPDF_Object* CloneRef(CPDF_IndirectObjects* pObjs) const;
+
+ CPDF_Object* GetDirect() const;
+
+ void Release();
+
+ CFX_ByteString GetString() const;
+
+ CFX_ByteStringC GetConstString() const;
+
+ CFX_WideString GetUnicodeText(CFX_CharMap* pCharMap = NULL) const;
+
+ FX_FLOAT GetNumber() const;
+
+ FX_FLOAT GetNumber16() const;
+
+ int GetInteger() const;
+
+ CPDF_Dictionary* GetDict() const;
+
+ CPDF_Array* GetArray() const;
+
+ void SetString(const CFX_ByteString& str);
+
+ void SetUnicodeText(FX_LPCWSTR pUnicodes, int len = -1);
+
+ int GetDirectType() const;
+
+ FX_BOOL IsModified() const
+ {
+ return FALSE;
+ }
+protected:
+ FX_DWORD m_Type;
+ CPDF_Object()
+ {
+ m_ObjNum = 0;
+ }
+
+ FX_DWORD m_ObjNum;
+
+ void Destroy();
+
+
+ ~CPDF_Object() {}
+ friend class CPDF_IndirectObjects;
+ friend class CPDF_Parser;
+ friend class CPDF_SyntaxParser;
+private:
+ CPDF_Object(const CPDF_Object& src) {}
+ CPDF_Object* CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const;
+};
+class CPDF_Boolean : public CPDF_Object
+{
+public:
+
+ static CPDF_Boolean* Create(FX_BOOL value)
+ {
+ return FX_NEW CPDF_Boolean(value);
+ }
+
+ CPDF_Boolean()
+ {
+ m_Type = PDFOBJ_BOOLEAN;
+ }
+
+ CPDF_Boolean(FX_BOOL value)
+ {
+ m_Type = PDFOBJ_BOOLEAN;
+ m_bValue = value;
+ }
+
+ FX_BOOL Identical(CPDF_Boolean* pOther) const
+ {
+ return m_bValue == pOther->m_bValue;
+ }
+protected:
+
+ FX_BOOL m_bValue;
+ friend class CPDF_Object;
+};
+class CPDF_Number : public CPDF_Object
+{
+public:
+
+ static CPDF_Number* Create(int value)
+ {
+ return FX_NEW CPDF_Number(value);
+ }
+
+ static CPDF_Number* Create(FX_FLOAT value)
+ {
+ return FX_NEW CPDF_Number(value);
+ }
+
+ static CPDF_Number* Create(FX_BSTR str)
+ {
+ return FX_NEW CPDF_Number(str);
+ }
+
+ static CPDF_Number* Create(FX_BOOL bInteger, void* pData)
+ {
+ return FX_NEW CPDF_Number(bInteger, pData);
+ }
+
+ CPDF_Number()
+ {
+ m_Type = PDFOBJ_NUMBER;
+ }
+
+ CPDF_Number(FX_BOOL bInteger, void* pData);
+
+ CPDF_Number(int value);
+
+ CPDF_Number(FX_FLOAT value);
+
+ CPDF_Number(FX_BSTR str);
+
+ FX_BOOL Identical(CPDF_Number* pOther) const;
+
+ CFX_ByteString GetString() const;
+
+ void SetString(FX_BSTR str);
+
+ FX_BOOL IsInteger() const
+ {
+ return m_bInteger;
+ }
+
+ int GetInteger() const
+ {
+ return m_bInteger ? m_Integer : (int)m_Float;
+ }
+
+ FX_FLOAT GetNumber() const
+ {
+ return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
+ }
+
+ void SetNumber(FX_FLOAT value);
+
+ FX_FLOAT GetNumber16() const
+ {
+ return GetNumber();
+ }
+
+ FX_FLOAT GetFloat() const
+ {
+ return m_bInteger ? (FX_FLOAT)m_Integer : m_Float;
+ }
+protected:
+
+ FX_BOOL m_bInteger;
+
+ union {
+
+ int m_Integer;
+
+ FX_FLOAT m_Float;
+ };
+ friend class CPDF_Object;
+};
+class CPDF_String : public CPDF_Object
+{
+public:
+
+ static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE)
+ {
+ return FX_NEW CPDF_String(str, bHex);
+ }
+
+ static CPDF_String* Create(const CFX_WideString& str)
+ {
+ return FX_NEW CPDF_String(str);
+ }
+
+ CPDF_String()
+ {
+ m_Type = PDFOBJ_STRING;
+ m_bHex = FALSE;
+ }
+
+ CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE) : m_String(str)
+ {
+ m_Type = PDFOBJ_STRING;
+ m_bHex = bHex;
+ }
+
+ CPDF_String(const CFX_WideString& str);
+
+ CFX_ByteString& GetString()
+ {
+ return m_String;
+ }
+
+ FX_BOOL Identical(CPDF_String* pOther) const
+ {
+ return m_String == pOther->m_String;
+ }
+
+ FX_BOOL IsHex() const
+ {
+ return m_bHex;
+ }
+protected:
+
+ CFX_ByteString m_String;
+
+ FX_BOOL m_bHex;
+ friend class CPDF_Object;
+};
+class CPDF_Name : public CPDF_Object
+{
+public:
+
+ static CPDF_Name* Create(const CFX_ByteString& str)
+ {
+ return FX_NEW CPDF_Name(str);
+ }
+
+ static CPDF_Name* Create(FX_BSTR str)
+ {
+ return FX_NEW CPDF_Name(str);
+ }
+
+ static CPDF_Name* Create(FX_LPCSTR str)
+ {
+ return FX_NEW CPDF_Name(str);
+ }
+
+ CPDF_Name(const CFX_ByteString& str) : m_Name(str)
+ {
+ m_Type = PDFOBJ_NAME;
+ }
+
+ CPDF_Name(FX_BSTR str) : m_Name(str)
+ {
+ m_Type = PDFOBJ_NAME;
+ }
+
+ CPDF_Name(FX_LPCSTR str) : m_Name(str)
+ {
+ m_Type = PDFOBJ_NAME;
+ }
+
+ CFX_ByteString& GetString()
+ {
+ return m_Name;
+ }
+
+ FX_BOOL Identical(CPDF_Name* pOther) const
+ {
+ return m_Name == pOther->m_Name;
+ }
+protected:
+
+ CFX_ByteString m_Name;
+ friend class CPDF_Object;
+};
+class CPDF_Array : public CPDF_Object
+{
+public:
+
+ static CPDF_Array* Create()
+ {
+ return FX_NEW CPDF_Array();
+ }
+
+ CPDF_Array()
+ {
+ m_Type = PDFOBJ_ARRAY;
+ }
+
+ FX_DWORD GetCount() const
+ {
+ return m_Objects.GetSize();
+ }
+
+ CPDF_Object* GetElement(FX_DWORD index) const;
+
+ CPDF_Object* GetElementValue(FX_DWORD index) const;
+
+
+
+ CFX_AffineMatrix GetMatrix();
+
+ CFX_FloatRect GetRect();
+
+
+
+
+ CFX_ByteString GetString(FX_DWORD index) const;
+
+ CFX_ByteStringC GetConstString(FX_DWORD index) const;
+
+ int GetInteger(FX_DWORD index) const;
+
+ FX_FLOAT GetNumber(FX_DWORD index) const;
+
+ CPDF_Dictionary* GetDict(FX_DWORD index) const;
+
+ CPDF_Stream* GetStream(FX_DWORD index) const;
+
+ CPDF_Array* GetArray(FX_DWORD index) const;
+
+ FX_FLOAT GetFloat(FX_DWORD index) const
+ {
+ return GetNumber(index);
+ }
+
+
+
+
+ void SetAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+
+
+ void InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+
+ void RemoveAt(FX_DWORD index);
+
+
+ void Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+
+
+
+ void AddNumber(FX_FLOAT f);
+
+ void AddInteger(int i);
+
+ void AddString(const CFX_ByteString& str);
+
+ void AddName(const CFX_ByteString& str);
+
+ void AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+
+ void AddReference(CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
+ {
+ AddReference(pDoc, obj->GetObjNum());
+ }
+
+
+ FX_FLOAT GetNumber16(FX_DWORD index) const
+ {
+ return GetNumber(index);
+ }
+
+ void AddNumber16(FX_FLOAT value)
+ {
+ AddNumber(value);
+ }
+
+ FX_BOOL Identical(CPDF_Array* pOther) const;
+protected:
+
+ ~CPDF_Array();
+
+ CFX_PtrArray m_Objects;
+ friend class CPDF_Object;
+};
+class CPDF_Dictionary : public CPDF_Object
+{
+public:
+
+ static CPDF_Dictionary* Create()
+ {
+ return FX_NEW CPDF_Dictionary();
+ }
+
+ CPDF_Dictionary()
+ {
+ m_Type = PDFOBJ_DICTIONARY;
+ }
+
+
+
+ CPDF_Object* GetElement(FX_BSTR key) const;
+
+ CPDF_Object* GetElementValue(FX_BSTR key) const;
+
+
+
+
+
+ CFX_ByteString GetString(FX_BSTR key) const;
+
+ CFX_ByteStringC GetConstString(FX_BSTR key) const;
+
+ CFX_ByteString GetString(FX_BSTR key, FX_BSTR default_str) const;
+
+ CFX_ByteStringC GetConstString(FX_BSTR key, FX_BSTR default_str) const;
+
+ CFX_WideString GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap = NULL) const;
+
+ int GetInteger(FX_BSTR key) const;
+
+ int GetInteger(FX_BSTR key, int default_int) const;
+
+ FX_BOOL GetBoolean(FX_BSTR key, FX_BOOL bDefault = FALSE) const;
+
+ FX_FLOAT GetNumber(FX_BSTR key) const;
+
+ CPDF_Dictionary* GetDict(FX_BSTR key) const;
+
+ CPDF_Stream* GetStream(FX_BSTR key) const;
+
+ CPDF_Array* GetArray(FX_BSTR key) const;
+
+ CFX_FloatRect GetRect(FX_BSTR key) const;
+
+ CFX_AffineMatrix GetMatrix(FX_BSTR key) const;
+
+ FX_FLOAT GetFloat(FX_BSTR key) const
+ {
+ return GetNumber(key);
+ }
+
+
+ FX_BOOL KeyExist(FX_BSTR key) const;
+
+ FX_POSITION GetStartPos() const;
+
+ CPDF_Object* GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const;
+
+ void SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs = NULL);
+
+
+
+ void SetAtName(FX_BSTR key, const CFX_ByteString& name);
+
+
+ void SetAtString(FX_BSTR key, const CFX_ByteString& string);
+
+
+ void SetAtInteger(FX_BSTR key, int i);
+
+
+ void SetAtNumber(FX_BSTR key, FX_FLOAT f);
+
+ void SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+
+ void SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
+ {
+ SetAtReference(key, pDoc, obj->GetObjNum());
+ }
+
+ void AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+
+ void AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, CPDF_Object* obj)
+ {
+ AddReference(key, pDoc, obj->GetObjNum());
+ }
+
+ void SetAtRect(FX_BSTR key, const CFX_FloatRect& rect);
+
+ void SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix);
+
+ void SetAtBoolean(FX_BSTR key, FX_BOOL bValue);
+
+
+
+ void RemoveAt(FX_BSTR key);
+
+
+ void ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey);
+
+ FX_BOOL Identical(CPDF_Dictionary* pDict) const;
+
+ int GetCount() const
+ {
+ return m_Map.GetCount();
+ }
+
+ void AddValue(FX_BSTR key, CPDF_Object* pObj);
+protected:
+
+ ~CPDF_Dictionary();
+
+ CFX_CMapByteStringToPtr m_Map;
+
+ friend class CPDF_Object;
+};
+class CPDF_Stream : public CPDF_Object
+{
+public:
+
+ static CPDF_Stream* Create(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
+ {
+ return FX_NEW CPDF_Stream(pData, size, pDict);
+ }
+
+ CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict);
+
+ CPDF_Dictionary* GetDict() const
+ {
+ return m_pDict;
+ }
+
+ void SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf);
+
+ void InitStream(FX_BYTE* pData, FX_DWORD size, CPDF_Dictionary* pDict);
+
+ void InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict);
+
+ FX_BOOL Identical(CPDF_Stream* pOther) const;
+
+ CPDF_StreamFilter* GetStreamFilter(FX_BOOL bRaw = FALSE) const;
+
+
+
+ FX_DWORD GetRawSize() const
+ {
+ return m_dwSize;
+ }
+
+ FX_BOOL ReadRawData(FX_FILESIZE start_pos, FX_LPBYTE pBuf, FX_DWORD buf_size) const;
+
+
+ FX_BOOL IsMemoryBased() const
+ {
+ return m_GenNum == (FX_DWORD) - 1;
+ }
+
+ CPDF_Stream* Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const;
+protected:
+
+ ~CPDF_Stream();
+
+ CPDF_Dictionary* m_pDict;
+
+ FX_DWORD m_dwSize;
+
+ FX_DWORD m_GenNum;
+
+ union {
+
+ FX_LPBYTE m_pDataBuf;
+
+ IFX_FileRead* m_pFile;
+ };
+
+ FX_FILESIZE m_FileOffset;
+
+ CPDF_CryptoHandler* m_pCryptoHandler;
+
+ void InitStream(CPDF_Dictionary* pDict);
+ friend class CPDF_Object;
+ friend class CPDF_StreamAcc;
+ friend class CPDF_AttachmentAcc;
+};
+class CPDF_StreamAcc : public CFX_Object
+{
+public:
+
+ CPDF_StreamAcc();
+
+ ~CPDF_StreamAcc();
+
+ void LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess = FALSE,
+ FX_DWORD estimated_size = 0, FX_BOOL bImageAcc = FALSE);
+
+ const CPDF_Stream* GetStream() const
+ {
+ return m_pStream;
+ }
+
+ CPDF_Dictionary* GetDict() const
+ {
+ return m_pStream->GetDict();
+ }
+
+ FX_LPCBYTE GetData() const;
+
+ FX_DWORD GetSize() const;
+
+ FX_LPBYTE DetachData();
+
+ const CFX_ByteString& GetImageDecoder()
+ {
+ return m_ImageDecoder;
+ }
+
+ const CPDF_Dictionary* GetImageParam()
+ {
+ return m_pImageParam;
+ }
+protected:
+
+ FX_LPBYTE m_pData;
+
+ FX_DWORD m_dwSize;
+
+ FX_BOOL m_bNewBuf;
+
+ CFX_ByteString m_ImageDecoder;
+
+ CPDF_Dictionary* m_pImageParam;
+
+ const CPDF_Stream* m_pStream;
+
+ FX_LPBYTE m_pSrcData;
+};
+CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width = 0, int height = 0);
+#define FPDF_FILTER_BUFFER_SIZE 20480
+class CPDF_StreamFilter : public CFX_Object
+{
+public:
+
+ ~CPDF_StreamFilter();
+
+ FX_DWORD ReadBlock(FX_LPBYTE buffer, FX_DWORD size);
+
+ FX_DWORD GetSrcPos()
+ {
+ return m_SrcOffset;
+ }
+
+ const CPDF_Stream* GetStream()
+ {
+ return m_pStream;
+ }
+protected:
+
+ CPDF_StreamFilter() {}
+
+ FX_DWORD ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size);
+
+ const CPDF_Stream* m_pStream;
+
+ CFX_DataFilter* m_pFilter;
+
+ CFX_BinaryBuf* m_pBuffer;
+
+ FX_DWORD m_BufOffset;
+
+ FX_DWORD m_SrcOffset;
+
+ FX_BYTE m_SrcBuffer[FPDF_FILTER_BUFFER_SIZE];
+ friend class CPDF_Stream;
+};
+class CPDF_Null : public CPDF_Object
+{
+public:
+
+ static CPDF_Null* Create()
+ {
+ return FX_NEW CPDF_Null();
+ }
+
+ CPDF_Null()
+ {
+ m_Type = PDFOBJ_NULL;
+ }
+};
+class CPDF_Reference : public CPDF_Object
+{
+public:
+
+ static CPDF_Reference* Create(CPDF_IndirectObjects* pDoc, int objnum)
+ {
+ return FX_NEW CPDF_Reference(pDoc, objnum);
+ }
+
+ CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)
+ {
+ m_Type = PDFOBJ_REFERENCE;
+ m_pObjList = pDoc;
+ m_RefObjNum = objnum;
+ }
+
+ CPDF_IndirectObjects* GetObjList() const
+ {
+ return m_pObjList;
+ }
+
+ FX_DWORD GetRefObjNum() const
+ {
+ return m_RefObjNum;
+ }
+
+ void SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum);
+
+ FX_BOOL Identical(CPDF_Reference* pOther) const
+ {
+ return m_RefObjNum == pOther->m_RefObjNum;
+ }
+protected:
+
+ CPDF_IndirectObjects* m_pObjList;
+
+ FX_DWORD m_RefObjNum;
+ friend class CPDF_Object;
+};
+class CPDF_IndirectObjects : public CFX_Object
+{
+public:
+
+ CPDF_IndirectObjects(IPDF_DocParser* pParser);
+
+ ~CPDF_IndirectObjects();
+
+ CPDF_Object* GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext = NULL);
+
+ int GetIndirectType(FX_DWORD objnum);
+
+ FX_DWORD AddIndirectObject(CPDF_Object* pObj);
+
+ void ReleaseIndirectObject(FX_DWORD objnum);
+
+ void InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj);
+
+ FX_DWORD GetLastObjNum() const;
+
+ FX_POSITION GetStartPosition() const
+ {
+ return m_IndirectObjs.GetStartPosition();
+ }
+
+ void GetNextAssoc(FX_POSITION& rPos, FX_DWORD& objnum, CPDF_Object*& pObject) const
+ {
+ m_IndirectObjs.GetNextAssoc(rPos, (void*&)objnum, (void*&)pObject);
+ }
+protected:
+
+ CFX_MapPtrToPtr m_IndirectObjs;
+
+ IPDF_DocParser* m_pParser;
+
+ FX_DWORD m_LastObjNum;
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_page.h b/core/include/fpdfapi/fpdf_page.h
new file mode 100644
index 0000000000..29b8c684a8
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_page.h
@@ -0,0 +1,249 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PAGE_
+#define _FPDF_PAGE_
+#ifndef _FPDF_PARSER_
+#include "fpdf_parser.h"
+#endif
+#ifndef _FPDF_RESOURCE_
+#include "fpdf_resource.h"
+#endif
+#ifndef _FX_DIB_H_
+#include "../fxge/fx_dib.h"
+#endif
+class CPDF_PageObjects;
+class CPDF_Page;
+class CPDF_Form;
+class CPDF_ParseOptions;
+class CPDF_PageObject;
+class CPDF_PageRenderCache;
+class CPDF_StreamFilter;
+class CPDF_AllStates;
+class CPDF_ContentParser;
+class CPDF_StreamContentParser;
+class CPDF_ResourceNaming;
+#define PDFTRANS_GROUP 0x0100
+#define PDFTRANS_ISOLATED 0x0200
+#define PDFTRANS_KNOCKOUT 0x0400
+#define PDF_CONTENT_NOT_PARSED 0
+#define PDF_CONTENT_PARSING 1
+#define PDF_CONTENT_PARSED 2
+class CPDF_PageObjects : public CFX_Object
+{
+public:
+
+ CPDF_PageObjects(FX_BOOL bReleaseMembers = TRUE);
+
+ ~CPDF_PageObjects();
+
+
+
+
+ void ContinueParse(IFX_Pause* pPause);
+
+ int GetParseState() const
+ {
+ return m_ParseState;
+ }
+
+ FX_BOOL IsParsed() const
+ {
+ return m_ParseState == PDF_CONTENT_PARSED;
+ }
+
+ int EstimateParseProgress() const;
+
+
+
+
+ FX_POSITION GetFirstObjectPosition() const
+ {
+ return m_ObjectList.GetHeadPosition();
+ }
+
+ FX_POSITION GetLastObjectPosition() const
+ {
+ return m_ObjectList.GetTailPosition();
+ }
+
+ CPDF_PageObject* GetNextObject(FX_POSITION& pos) const
+ {
+ return (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ }
+
+ CPDF_PageObject* GetPrevObject(FX_POSITION& pos) const
+ {
+ return (CPDF_PageObject*)m_ObjectList.GetPrev(pos);
+ }
+
+ CPDF_PageObject* GetObjectAt(FX_POSITION pos) const
+ {
+ return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
+ }
+
+ FX_DWORD CountObjects() const
+ {
+ return m_ObjectList.GetCount();
+ }
+
+ int GetObjectIndex(CPDF_PageObject* pObj) const;
+
+ CPDF_PageObject* GetObjectByIndex(int index) const;
+
+
+
+
+
+ FX_POSITION InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject);
+
+ void Transform(const CFX_AffineMatrix& matrix);
+
+ FX_BOOL BackgroundAlphaNeeded() const
+ {
+ return m_bBackgroundAlphaNeeded;
+ }
+
+ CFX_FloatRect CalcBoundingBox() const;
+
+ CPDF_Dictionary* m_pFormDict;
+
+ CPDF_Stream* m_pFormStream;
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_Dictionary* m_pPageResources;
+
+ CPDF_Dictionary* m_pResources;
+
+ CFX_FloatRect m_BBox;
+
+ int m_Transparency;
+
+protected:
+ friend class CPDF_ContentParser;
+ friend class CPDF_StreamContentParser;
+ friend class CPDF_AllStates;
+
+ CFX_PtrList m_ObjectList;
+
+ FX_BOOL m_bBackgroundAlphaNeeded;
+
+ FX_BOOL m_bReleaseMembers;
+ void LoadTransInfo();
+ void ClearCacheObjects();
+
+ CPDF_ContentParser* m_pParser;
+
+ FX_BOOL m_ParseState;
+};
+class CPDF_Page : public CPDF_PageObjects, public CFX_PrivateData
+{
+public:
+
+ CPDF_Page();
+
+ ~CPDF_Page();
+
+ void Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache = TRUE);
+
+ void StartParse(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
+
+ void ParseContent(CPDF_ParseOptions* pOptions = NULL, FX_BOOL bReParse = FALSE);
+
+ void GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
+ int xSize, int ySize, int iRotate) const;
+
+ FX_FLOAT GetPageWidth() const
+ {
+ return m_PageWidth;
+ }
+
+ FX_FLOAT GetPageHeight() const
+ {
+ return m_PageHeight;
+ }
+
+ CFX_FloatRect GetPageBBox() const
+ {
+ return m_BBox;
+ }
+
+ const CFX_AffineMatrix& GetPageMatrix() const
+ {
+ return m_PageMatrix;
+ }
+
+ CPDF_Object* GetPageAttr(FX_BSTR name) const;
+
+
+
+ CPDF_PageRenderCache* GetRenderCache() const
+ {
+ return m_pPageRender;
+ }
+
+ void ClearRenderCache();
+
+protected:
+ friend class CPDF_ContentParser;
+
+ FX_FLOAT m_PageWidth;
+
+ FX_FLOAT m_PageHeight;
+
+ CFX_AffineMatrix m_PageMatrix;
+
+ CPDF_PageRenderCache* m_pPageRender;
+};
+class CPDF_ParseOptions : public CFX_Object
+{
+public:
+
+ CPDF_ParseOptions();
+
+ FX_BOOL m_bTextOnly;
+
+ FX_BOOL m_bMarkedContent;
+
+ FX_BOOL m_bSeparateForm;
+
+ FX_BOOL m_bDecodeInlineImage;
+};
+class CPDF_Form : public CPDF_PageObjects
+{
+public:
+
+ CPDF_Form(CPDF_Document* pDocument, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources = NULL);
+
+ ~CPDF_Form();
+
+ void StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
+
+ void ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level = 0);
+
+ CPDF_Form* Clone() const;
+};
+class CPDF_PageContentGenerate : public CFX_Object
+{
+public:
+ CPDF_PageContentGenerate(CPDF_Page* pPage);
+ ~CPDF_PageContentGenerate();
+ FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
+ void GenerateContent();
+ void TransformContent(CFX_Matrix& matrix);
+protected:
+ void ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj);
+ void ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix);
+ CFX_ByteString RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType);
+private:
+ CPDF_Page* m_pPage;
+ CPDF_Document* m_pDocument;
+ CFX_PtrArray m_pageObjects;
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_pageobj.h b/core/include/fpdfapi/fpdf_pageobj.h
new file mode 100644
index 0000000000..1e82680907
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_pageobj.h
@@ -0,0 +1,721 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PAGEOBJ_H_
+#define _FPDF_PAGEOBJ_H_
+#ifndef _FPDF_RESOURCE_
+#include "fpdf_resource.h"
+#endif
+#ifndef _FX_GE_H_
+#include "../fxge/fx_ge.h"
+#endif
+class CPDF_Path;
+class CPDF_ClipPathData;
+class CPDF_ClipPath;
+class CPDF_ColorStateData;
+class CPDF_ColorState;
+class CPDF_GraphState;
+class CPDF_TextStateData;
+class CPDF_TextState;
+class CPDF_GeneralStateData;
+class CPDF_GeneralState;
+class CPDF_ContentMarkItem;
+class CPDF_ContentMark;
+class CPDF_GraphicStates;
+class CPDF_PageObject;
+class CPDF_TextObject;
+class CPDF_PathObject;
+class CPDF_ImageObject;
+class CPDF_ShadingObject;
+class CPDF_FormObject;
+class CPDF_InlineImages;
+typedef CFX_PathData CPDF_PathData;
+class CPDF_Path : public CFX_CountRef<CFX_PathData>
+{
+public:
+
+
+
+
+ int GetPointCount()
+ {
+ return m_pObject->m_PointCount;
+ }
+
+ int GetFlag(int index)
+ {
+ return m_pObject->m_pPoints[index].m_Flag;
+ }
+
+ FX_FLOAT GetPointX(int index)
+ {
+ return m_pObject->m_pPoints[index].m_PointX;
+ }
+
+ FX_FLOAT GetPointY(int index)
+ {
+ return m_pObject->m_pPoints[index].m_PointY;
+ }
+
+
+
+
+ FX_PATHPOINT* GetPoints()
+ {
+ return m_pObject->m_pPoints;
+ }
+
+
+ CFX_FloatRect GetBoundingBox() const
+ {
+ return m_pObject->GetBoundingBox();
+ }
+
+ CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
+ {
+ return m_pObject->GetBoundingBox(line_width, miter_limit);
+ }
+
+ void Transform(const CFX_AffineMatrix* pMatrix)
+ {
+ GetModify()->Transform(pMatrix);
+ }
+
+ void Append(CPDF_Path src, const CFX_AffineMatrix* pMatrix)
+ {
+ m_pObject->Append(src.m_pObject, pMatrix);
+ }
+
+ void AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+ {
+ m_pObject->AppendRect(left, bottom, right, top);
+ }
+
+ FX_BOOL IsRect() const
+ {
+ return m_pObject->IsRect();
+ }
+};
+class CPDF_ClipPathData : public CFX_Object
+{
+public:
+
+ CPDF_ClipPathData();
+
+ CPDF_ClipPathData(const CPDF_ClipPathData&);
+
+ ~CPDF_ClipPathData();
+
+ void SetCount(int path_count, int text_count);
+public:
+
+ int m_PathCount;
+
+ CPDF_Path* m_pPathList;
+
+ FX_BYTE* m_pTypeList;
+
+ int m_TextCount;
+
+ CPDF_TextObject** m_pTextList;
+};
+class CPDF_ClipPath : public CFX_CountRef<CPDF_ClipPathData>
+{
+public:
+
+ FX_DWORD GetPathCount() const
+ {
+ return m_pObject->m_PathCount;
+ }
+
+ CPDF_Path GetPath(int i) const
+ {
+ return m_pObject->m_pPathList[i];
+ }
+
+ int GetClipType(int i) const
+ {
+ return m_pObject->m_pTypeList[i];
+ }
+
+ FX_DWORD GetTextCount() const
+ {
+ return m_pObject->m_TextCount;
+ }
+
+ CPDF_TextObject* GetText(int i) const
+ {
+ return m_pObject->m_pTextList[i];
+ }
+
+ CFX_FloatRect GetClipBox() const;
+
+ void AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
+
+ void DeletePath(int layer_index);
+
+ void AppendTexts(CPDF_TextObject** pTexts, int count);
+
+ void Transform(const CFX_AffineMatrix& matrix);
+};
+class CPDF_ColorStateData : public CFX_Object
+{
+public:
+
+ CPDF_ColorStateData() {}
+
+ CPDF_ColorStateData(const CPDF_ColorStateData& src);
+
+ void Default();
+
+ CPDF_Color m_FillColor;
+
+ FX_DWORD m_FillRGB;
+
+ CPDF_Color m_StrokeColor;
+
+ FX_DWORD m_StrokeRGB;
+};
+class CPDF_ColorState : public CFX_CountRef<CPDF_ColorStateData>
+{
+public:
+
+ CPDF_Color* GetFillColor() const
+ {
+ return m_pObject ? &m_pObject->m_FillColor : NULL;
+ }
+
+ CPDF_Color* GetStrokeColor() const
+ {
+ return m_pObject ? &m_pObject->m_StrokeColor : NULL;
+ }
+
+ void SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
+
+ void SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
+
+ void SetFillPattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
+
+ void SetStrokePattern(CPDF_Pattern* pattern, FX_FLOAT* pValue, int nValues);
+private:
+ void SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues);
+};
+typedef CFX_GraphStateData CPDF_GraphStateData;
+class CPDF_GraphState : public CFX_CountRef<CFX_GraphStateData>
+{
+public:
+};
+class CPDF_TextStateData : public CFX_Object
+{
+public:
+
+ CPDF_TextStateData();
+
+ CPDF_TextStateData(const CPDF_TextStateData& src);
+
+ ~CPDF_TextStateData();
+
+ CPDF_Font* m_pFont;
+
+ FX_FLOAT m_FontSize;
+
+ FX_FLOAT m_CharSpace;
+
+ FX_FLOAT m_WordSpace;
+
+ FX_FLOAT m_Matrix[4];
+
+ int m_TextMode;
+
+ FX_FLOAT m_CTM[4];
+};
+class CPDF_TextState : public CFX_CountRef<CPDF_TextStateData>
+{
+public:
+
+ CPDF_Font* GetFont() const
+ {
+ return m_pObject->m_pFont;
+ }
+
+ void SetFont(CPDF_Font* pFont);
+
+ FX_FLOAT GetFontSize() const
+ {
+ return m_pObject->m_FontSize;
+ }
+
+ FX_FLOAT* GetMatrix() const
+ {
+ return m_pObject->m_Matrix;
+ }
+
+
+
+ FX_FLOAT GetFontSizeV() const;
+
+ FX_FLOAT GetFontSizeH() const;
+
+ FX_FLOAT GetBaselineAngle() const;
+
+ FX_FLOAT GetShearAngle() const;
+
+};
+class CPDF_TransferFunc;
+class CPDF_GeneralStateData : public CFX_Object
+{
+public:
+
+ CPDF_GeneralStateData();
+
+ CPDF_GeneralStateData(const CPDF_GeneralStateData& src);
+ ~CPDF_GeneralStateData();
+
+ void SetBlendMode(FX_BSTR blend_mode);
+
+ char m_BlendMode[16];
+
+ int m_BlendType;
+
+ CPDF_Object* m_pSoftMask;
+
+ FX_FLOAT m_SMaskMatrix[6];
+
+ FX_FLOAT m_StrokeAlpha;
+
+ FX_FLOAT m_FillAlpha;
+
+ CPDF_Object* m_pTR;
+
+ CPDF_TransferFunc* m_pTransferFunc;
+
+ CFX_Matrix m_Matrix;
+
+ int m_RenderIntent;
+
+ FX_BOOL m_StrokeAdjust;
+
+ FX_BOOL m_AlphaSource;
+
+ FX_BOOL m_TextKnockout;
+
+ FX_BOOL m_StrokeOP;
+
+ FX_BOOL m_FillOP;
+
+ int m_OPMode;
+
+ CPDF_Object* m_pBG;
+
+ CPDF_Object* m_pUCR;
+
+ CPDF_Object* m_pHT;
+
+ FX_FLOAT m_Flatness;
+
+ FX_FLOAT m_Smoothness;
+};
+class CPDF_GeneralState : public CFX_CountRef<CPDF_GeneralStateData>
+{
+public:
+
+ void SetRenderIntent(const CFX_ByteString& ri);
+
+ int GetBlendType() const
+ {
+ return m_pObject ? m_pObject->m_BlendType : FXDIB_BLEND_NORMAL;
+ }
+
+ int GetAlpha(FX_BOOL bStroke) const
+ {
+ return m_pObject ? FXSYS_round((bStroke ? m_pObject->m_StrokeAlpha : m_pObject->m_FillAlpha) * 255) : 255;
+ }
+};
+class CPDF_ContentMarkItem : public CFX_Object
+{
+public:
+
+ typedef enum {
+ None,
+ PropertiesDict,
+ DirectDict,
+ MCID
+ } ParamType;
+
+ CPDF_ContentMarkItem();
+
+ CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src);
+
+ ~CPDF_ContentMarkItem();
+
+ inline const CFX_ByteString& GetName() const
+ {
+ return m_MarkName;
+ }
+
+ inline ParamType GetParamType() const
+ {
+ return m_ParamType;
+ }
+
+ inline void* GetParam() const
+ {
+ return m_pParam;
+ }
+
+ inline FX_BOOL HasMCID() const;
+
+ inline void SetName(const CFX_ByteString& name)
+ {
+ m_MarkName = name;
+ }
+
+ inline void SetParam(ParamType type, void* param)
+ {
+ m_ParamType = type;
+ m_pParam = param;
+ }
+private:
+
+ CFX_ByteString m_MarkName;
+
+ ParamType m_ParamType;
+
+ void* m_pParam;
+};
+class CPDF_ContentMarkData : public CFX_Object
+{
+public:
+
+ CPDF_ContentMarkData() { }
+
+ CPDF_ContentMarkData(const CPDF_ContentMarkData& src);
+
+ inline int CountItems() const
+ {
+ return m_Marks.GetSize();
+ }
+
+ inline CPDF_ContentMarkItem& GetItem(int index) const
+ {
+ return m_Marks[index];
+ }
+
+ int GetMCID() const;
+
+ void AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDictNeedClone);
+
+ void DeleteLastMark();
+private:
+
+ CFX_ObjectArray<CPDF_ContentMarkItem> m_Marks;
+};
+class CPDF_ContentMark : public CFX_CountRef<CPDF_ContentMarkData>
+{
+public:
+
+ int GetMCID() const
+ {
+ return m_pObject ? m_pObject->GetMCID() : -1;
+ }
+
+ FX_BOOL HasMark(FX_BSTR mark) const;
+
+ FX_BOOL LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const;
+};
+#define PDFPAGE_TEXT 1
+#define PDFPAGE_PATH 2
+#define PDFPAGE_IMAGE 3
+#define PDFPAGE_SHADING 4
+#define PDFPAGE_FORM 5
+#define PDFPAGE_INLINES 6
+class CPDF_GraphicStates : public CFX_Object
+{
+public:
+
+ void CopyStates(const CPDF_GraphicStates& src);
+
+ void DefaultStates();
+
+ CPDF_ClipPath m_ClipPath;
+
+ CPDF_GraphState m_GraphState;
+
+ CPDF_ColorState m_ColorState;
+
+ CPDF_TextState m_TextState;
+
+ CPDF_GeneralState m_GeneralState;
+};
+class CPDF_PageObject : public CPDF_GraphicStates
+{
+public:
+
+ static CPDF_PageObject* Create(int type);
+
+ void Release();
+
+ CPDF_PageObject* Clone() const;
+
+ void Copy(const CPDF_PageObject* pSrcObject);
+
+ virtual void Transform(const CFX_AffineMatrix& matrix) = 0;
+
+
+
+ void RemoveClipPath();
+
+ void AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge);
+
+ void CopyClipPath(CPDF_PageObject* pObj);
+
+ void TransformClipPath(CFX_AffineMatrix& matrix);
+
+ void TransformGeneralState(CFX_AffineMatrix& matrix);
+
+
+ void SetColorState(CPDF_ColorState state)
+ {
+ m_ColorState = state;
+ }
+
+ FX_RECT GetBBox(const CFX_AffineMatrix* pMatrix) const;
+
+ int m_Type;
+
+ FX_FLOAT m_Left;
+
+ FX_FLOAT m_Right;
+
+ FX_FLOAT m_Top;
+
+ FX_FLOAT m_Bottom;
+
+ CPDF_ContentMark m_ContentMark;
+protected:
+
+ virtual void CopyData(const CPDF_PageObject* pSrcObject) {}
+
+ void RecalcBBox();
+
+ CPDF_PageObject() {}
+
+ virtual ~CPDF_PageObject() {}
+};
+struct CPDF_TextObjectItem : public CFX_Object {
+
+ FX_DWORD m_CharCode;
+
+ FX_FLOAT m_OriginX;
+
+ FX_FLOAT m_OriginY;
+};
+class CPDF_TextObject : public CPDF_PageObject
+{
+public:
+
+ CPDF_TextObject();
+
+ virtual ~CPDF_TextObject();
+
+ int CountItems() const
+ {
+ return m_nChars;
+ }
+
+ void GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const;
+
+ int CountChars() const;
+
+ void GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const;
+ void GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const;
+
+ void GetCharRect(int index, CFX_FloatRect& rect) const;
+
+
+ FX_FLOAT GetCharWidth(FX_DWORD charcode) const;
+ FX_FLOAT GetSpaceCharWidth() const;
+
+ FX_FLOAT GetPosX() const
+ {
+ return m_PosX;
+ }
+
+ FX_FLOAT GetPosY() const
+ {
+ return m_PosY;
+ }
+
+ void GetTextMatrix(CFX_AffineMatrix* pMatrix) const;
+
+ CPDF_Font* GetFont() const
+ {
+ return m_TextState.GetFont();
+ }
+
+ FX_FLOAT GetFontSize() const
+ {
+ return m_TextState.GetFontSize();
+ }
+
+ void SetEmpty();
+
+ void SetText(const CFX_ByteString& text);
+
+ void SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
+
+ void SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings);
+
+ void SetPosition(FX_FLOAT x, FX_FLOAT y);
+
+ void SetTextState(CPDF_TextState TextState);
+ virtual void Transform(const CFX_AffineMatrix& matrix);
+
+ void CalcCharPos(FX_FLOAT* pPosArray) const;
+
+
+
+ void SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y);
+
+ void GetData(int& nChars, FX_DWORD*& pCharCodes, FX_FLOAT*& pCharPos)
+ {
+ nChars = m_nChars;
+ pCharCodes = m_pCharCodes;
+ pCharPos = m_pCharPos;
+ }
+
+
+ void RecalcPositionData()
+ {
+ CalcPositionData(NULL, NULL, 1);
+ }
+protected:
+ virtual void CopyData(const CPDF_PageObject* pSrcObject);
+
+ FX_FLOAT m_PosX;
+
+ FX_FLOAT m_PosY;
+
+ int m_nChars;
+
+ FX_DWORD* m_pCharCodes;
+
+ FX_FLOAT* m_pCharPos;
+
+ void SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs);
+
+ void CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level = 0);
+ friend class CPDF_StreamContentParser;
+ friend class CPDF_RenderStatus;
+ friend class CPDF_QuickDrawer;
+ friend class CPDF_TextRenderer;
+ friend class CTextPage;
+ friend class CPDF_ContentGenerator;
+};
+class CPDF_PathObject : public CPDF_PageObject
+{
+public:
+
+ CPDF_PathObject()
+ {
+ m_Type = PDFPAGE_PATH;
+ }
+
+ virtual ~CPDF_PathObject() {}
+ virtual void Transform(const CFX_AffineMatrix& maxtrix);
+
+ void SetGraphState(CPDF_GraphState GraphState);
+
+ CPDF_Path m_Path;
+
+ int m_FillType;
+
+ FX_BOOL m_bStroke;
+
+ CFX_AffineMatrix m_Matrix;
+
+
+ void CalcBoundingBox();
+protected:
+ virtual void CopyData(const CPDF_PageObject* pSrcObjet);
+};
+class CPDF_ImageObject : public CPDF_PageObject
+{
+public:
+
+ CPDF_ImageObject();
+
+ virtual ~CPDF_ImageObject();
+ virtual void Transform(const CFX_AffineMatrix& matrix);
+
+ CPDF_Image* m_pImage;
+
+ CFX_AffineMatrix m_Matrix;
+
+ void CalcBoundingBox();
+private:
+ virtual void CopyData(const CPDF_PageObject* pSrcObjet);
+};
+class CPDF_ShadingObject : public CPDF_PageObject
+{
+public:
+
+ CPDF_ShadingObject();
+
+ virtual ~CPDF_ShadingObject();
+
+ CPDF_ShadingPattern* m_pShading;
+
+ CFX_AffineMatrix m_Matrix;
+
+ CPDF_Page* m_pPage;
+ virtual void Transform(const CFX_AffineMatrix& matrix);
+
+ void CalcBoundingBox();
+protected:
+ virtual void CopyData(const CPDF_PageObject* pSrcObjet);
+};
+class CPDF_FormObject : public CPDF_PageObject
+{
+public:
+
+ CPDF_FormObject()
+ {
+ m_Type = PDFPAGE_FORM;
+ m_pForm = NULL;
+ }
+
+ virtual ~CPDF_FormObject();
+ virtual void Transform(const CFX_AffineMatrix& matrix);
+
+ CPDF_Form* m_pForm;
+
+ CFX_AffineMatrix m_FormMatrix;
+
+ void CalcBoundingBox();
+protected:
+ virtual void CopyData(const CPDF_PageObject* pSrcObjet);
+};
+class CPDF_InlineImages : public CPDF_PageObject
+{
+public:
+
+ CPDF_InlineImages();
+
+ virtual ~CPDF_InlineImages();
+
+ CPDF_Stream* m_pStream;
+
+ CFX_DIBitmap* m_pBitmap;
+
+ CFX_ArrayTemplate<CFX_AffineMatrix> m_Matrices;
+
+ void AddMatrix(CFX_AffineMatrix& matrix);
+protected:
+ virtual void Transform(const CFX_AffineMatrix& matrix) {}
+ virtual void CopyData(const CPDF_PageObject* pSrcObjet) {}
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_parser.h b/core/include/fpdfapi/fpdf_parser.h
new file mode 100644
index 0000000000..9d41539d52
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_parser.h
@@ -0,0 +1,1149 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PARSER_
+#define _FPDF_PARSER_
+#ifndef _FX_BASIC_H_
+#include "../fxcrt/fx_ext.h"
+#endif
+#ifndef _FPDF_OBJECTS_
+#include "fpdf_objects.h"
+#endif
+class CPDF_Document;
+class IPDF_DocParser;
+class CPDF_Parser;
+class CPDF_SecurityHandler;
+class CPDF_StandardSecurityHandler;
+class CPDF_CryptoHandler;
+class CPDF_Object;
+class IFX_FileRead;
+class CFDF_Document;
+class CFDF_Parser;
+class CFX_Font;
+class CFX_AffineMatrix;
+class CFX_FloatRect;
+class CPDF_Point;
+class CPDF_DocPageData;
+class CPDF_DocRenderData;
+class CPDF_ModuleMgr;
+class CFX_DIBSource;
+class CPDF_Font;
+class CPDF_Image;
+class CPDF_ColorSpace;
+class CPDF_Pattern;
+class CPDF_FontEncoding;
+class CPDF_IccProfile;
+class CFX_PrivateData;
+#define FPDFPERM_PRINT 0x0004
+#define FPDFPERM_MODIFY 0x0008
+#define FPDFPERM_EXTRACT 0x0010
+#define FPDFPERM_ANNOT_FORM 0x0020
+#define FPDFPERM_FILL_FORM 0x0100
+#define FPDFPERM_EXTRACT_ACCESS 0x0200
+#define FPDFPERM_ASSEMBLE 0x0400
+#define FPDFPERM_PRINT_HIGH 0x0800
+#define FPDF_PAGE_MAX_NUM 0xFFFFF
+class IPDF_EnumPageHandler
+{
+public:
+
+ virtual FX_BOOL EnumPage(CPDF_Dictionary* pPageDict) = 0;
+};
+class CPDF_Document : public CFX_PrivateData, public CPDF_IndirectObjects
+{
+public:
+
+ CPDF_Document(IPDF_DocParser* pParser);
+
+ CPDF_Document();
+
+ ~CPDF_Document();
+
+ IPDF_DocParser* GetParser() const
+ {
+ return m_pParser;
+ }
+
+ CPDF_Dictionary* GetRoot() const
+ {
+ return m_pRootDict;
+ }
+
+ CPDF_Dictionary* GetInfo() const
+ {
+ return m_pInfoDict;
+ }
+
+ void GetID(CFX_ByteString& id1, CFX_ByteString& id2) const
+ {
+ id1 = m_ID1;
+ id2 = m_ID2;
+ }
+
+ int GetPageCount() const;
+
+ CPDF_Dictionary* GetPage(int iPage);
+
+ int GetPageIndex(FX_DWORD objnum);
+
+ void EnumPages(IPDF_EnumPageHandler* pHandler);
+
+ FX_DWORD GetUserPermissions(FX_BOOL bCheckRevision = FALSE) const;
+
+ FX_BOOL IsOwner() const;
+
+
+
+ CPDF_DocPageData* GetPageData()
+ {
+ return GetValidatePageData();
+ }
+
+ void ClearPageData();
+
+ void RemoveColorSpaceFromPageData(CPDF_Object* pObject);
+
+
+ CPDF_DocRenderData* GetRenderData()
+ {
+ return GetValidateRenderData();
+ }
+
+ void ClearRenderData();
+
+ void ClearRenderFont();
+
+
+ FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const;
+
+
+
+
+ CPDF_Font* LoadFont(CPDF_Dictionary* pFontDict);
+
+ CPDF_Font* FindFont(CPDF_Dictionary* pFontDict);
+
+ CPDF_ColorSpace* LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources = NULL);
+
+ CPDF_Pattern* LoadPattern(CPDF_Object* pObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix = NULL);
+
+ CPDF_Image* LoadImageF(CPDF_Object* pObj);
+
+ CPDF_StreamAcc* LoadFontFile(CPDF_Stream* pStream);
+
+ CPDF_IccProfile* LoadIccProfile(CPDF_Stream* pStream, int nComponents);
+
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+
+ CPDF_Font* AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
+ CPDF_Font* AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
+#endif
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ CPDF_Font* AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName = FALSE);
+#endif
+
+ CPDF_Font* AddStandardFont(const FX_CHAR* font, CPDF_FontEncoding* pEncoding);
+
+
+ CPDF_Font* AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert);
+
+ void CreateNewDoc();
+
+ CPDF_Dictionary* CreateNewPage(int iPage);
+
+ void DeletePage(int iPage);
+
+ void LoadDoc();
+ void LoadAsynDoc(CPDF_Dictionary *pLinearized);
+ void LoadPages();
+protected:
+
+ CPDF_Dictionary* m_pRootDict;
+
+ CPDF_Dictionary* m_pInfoDict;
+
+ CFX_ByteString m_ID1;
+
+ CFX_ByteString m_ID2;
+
+
+ FX_BOOL m_bLinearized;
+
+ FX_DWORD m_dwFirstPageNo;
+
+ FX_DWORD m_dwFirstPageObjNum;
+
+ CFX_DWordArray m_PageList;
+
+ int _GetPageCount() const;
+ CPDF_Dictionary* _FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level);
+ int _FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level = 0);
+ FX_BOOL IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pPageDict);
+ FX_BOOL CheckOCGVisible(CPDF_Dictionary* pOCG, FX_BOOL bPrinting);
+ CPDF_DocPageData* GetValidatePageData();
+ CPDF_DocRenderData* GetValidateRenderData();
+ friend class CPDF_Creator;
+ friend class CPDF_Parser;
+ friend class CPDF_DataAvail;
+ friend class CPDF_OCContext;
+
+
+
+ CPDF_DocPageData* m_pDocPage;
+
+ CPDF_DocRenderData* m_pDocRender;
+
+};
+
+#define PDFWORD_EOF 0
+#define PDFWORD_NUMBER 1
+#define PDFWORD_TEXT 2
+#define PDFWORD_DELIMITER 3
+#define PDFWORD_NAME 4
+class CPDF_SimpleParser : public CFX_Object
+{
+public:
+
+ CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize);
+
+ CPDF_SimpleParser(FX_BSTR str);
+
+ CFX_ByteStringC GetWord();
+
+ FX_BOOL SearchToken(FX_BSTR token);
+
+ FX_BOOL SkipWord(FX_BSTR token);
+
+ FX_BOOL FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
+ FX_DWORD& start_pos, FX_DWORD& end_pos);
+
+ FX_BOOL FindTagParam(FX_BSTR token, int nParams);
+
+ FX_DWORD GetPos()
+ {
+ return m_dwCurPos;
+ }
+
+ void SetPos(FX_DWORD pos)
+ {
+ ASSERT(pos <= m_dwSize);
+ m_dwCurPos = pos;
+ }
+private:
+
+ void ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type);
+
+ FX_LPCBYTE m_pData;
+
+ FX_DWORD m_dwSize;
+
+ FX_DWORD m_dwCurPos;
+};
+class CPDF_SyntaxParser : public CFX_Object
+{
+public:
+
+ CPDF_SyntaxParser();
+
+ ~CPDF_SyntaxParser();
+
+ void InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset);
+
+ FX_FILESIZE SavePos()
+ {
+ return m_Pos;
+ }
+
+ void RestorePos(FX_FILESIZE pos)
+ {
+ m_Pos = pos;
+ }
+
+ CPDF_Object* GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL, FX_BOOL bDecrypt = TRUE);
+
+
+ CPDF_Object* GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, int level, struct PARSE_CONTEXT* pContext = NULL);
+
+ int GetDirectNum();
+
+ CFX_ByteString GetString(FX_DWORD objnum, FX_DWORD gennum);
+
+ CFX_ByteString GetName();
+
+ CFX_ByteString GetKeyword();
+
+ void GetBinary(FX_BYTE* buffer, FX_DWORD size);
+
+ void ToNextLine();
+
+ void ToNextWord();
+
+ FX_BOOL SearchWord(FX_BSTR word, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit);
+
+ int SearchMultiWord(FX_BSTR words, FX_BOOL bWholeWord, FX_FILESIZE limit);
+
+ FX_FILESIZE FindTag(FX_BSTR tag, FX_FILESIZE limit);
+
+ void SetEncrypt(CPDF_CryptoHandler* pCryptoHandler)
+ {
+ m_pCryptoHandler = pCryptoHandler;
+ }
+
+ FX_BOOL IsEncrypted()
+ {
+ return m_pCryptoHandler != NULL;
+ }
+
+ FX_BOOL GetCharAt(FX_FILESIZE pos, FX_BYTE& ch);
+
+ FX_BOOL ReadBlock(FX_BYTE* pBuf, FX_DWORD size);
+
+ CFX_ByteString GetNextWord(FX_BOOL& bIsNumber);
+protected:
+
+ virtual FX_BOOL GetNextChar(FX_BYTE& ch);
+
+ FX_BOOL GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch);
+
+ void GetNextWord();
+
+ FX_BOOL IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen);
+
+ CFX_ByteString ReadString();
+
+ CFX_ByteString ReadHexString();
+
+ CPDF_Stream* ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext, FX_DWORD objnum, FX_DWORD gennum);
+
+ FX_FILESIZE m_Pos;
+
+ FX_BOOL m_bFileStream;
+
+ int m_MetadataObjnum;
+
+ IFX_FileRead* m_pFileAccess;
+
+ FX_DWORD m_HeaderOffset;
+
+ FX_FILESIZE m_FileLen;
+
+ FX_BYTE* m_pFileBuf;
+
+ FX_DWORD m_BufSize;
+
+ FX_FILESIZE m_BufOffset;
+
+ CPDF_CryptoHandler* m_pCryptoHandler;
+
+ FX_BYTE m_WordBuffer[257];
+
+ FX_DWORD m_WordSize;
+
+ FX_BOOL m_bIsNumber;
+
+ FX_FILESIZE m_dwWordPos;
+ friend class CPDF_Parser;
+ friend class CPDF_DataAvail;
+};
+
+#define PDFPARSE_TYPEONLY 1
+#define PDFPARSE_NOSTREAM 2
+struct PARSE_CONTEXT {
+
+ FX_BOOL m_Flags;
+
+ FX_FILESIZE m_DictStart;
+
+ FX_FILESIZE m_DictEnd;
+
+ FX_FILESIZE m_DataStart;
+
+ FX_FILESIZE m_DataEnd;
+};
+class IPDF_DocParser : public CFX_Object
+{
+public:
+
+ virtual FX_DWORD GetRootObjNum() = 0;
+
+ virtual FX_DWORD GetInfoObjNum() = 0;
+
+ virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL) = 0;
+
+ virtual FX_DWORD GetLastObjNum() = 0;
+
+ virtual CPDF_Array* GetIDArray() = 0;
+
+ virtual CPDF_Dictionary* GetEncryptDict() = 0;
+
+ FX_BOOL IsEncrypted()
+ {
+ return GetEncryptDict() != NULL;
+ }
+
+ virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE) = 0;
+
+ virtual FX_BOOL IsOwner() = 0;
+
+ virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) = 0;
+};
+
+#define PDFPARSE_ERROR_SUCCESS 0
+#define PDFPARSE_ERROR_FILE 1
+#define PDFPARSE_ERROR_FORMAT 2
+#define PDFPARSE_ERROR_PASSWORD 3
+#define PDFPARSE_ERROR_HANDLER 4
+#define PDFPARSE_ERROR_CERT 5
+class CPDF_Parser : public IPDF_DocParser
+{
+public:
+
+ CPDF_Parser();
+
+ ~CPDF_Parser();
+
+ FX_DWORD StartParse(FX_LPCSTR filename, FX_BOOL bReParse = FALSE);
+
+ FX_DWORD StartParse(FX_LPCWSTR filename, FX_BOOL bReParse = FALSE);
+
+ FX_DWORD StartParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
+
+ void CloseParser(FX_BOOL bReParse = FALSE);
+
+ virtual FX_DWORD GetPermissions(FX_BOOL bCheckRevision = FALSE);
+
+ virtual FX_BOOL IsOwner();
+
+ void SetPassword(const FX_CHAR* password)
+ {
+ m_Password = password;
+ }
+
+ CFX_ByteString GetPassword()
+ {
+ return m_Password;
+ }
+
+ CPDF_SecurityHandler* GetSecurityHandler()
+ {
+ return m_pSecurityHandler;
+ }
+
+ CPDF_CryptoHandler* GetCryptoHandler()
+ {
+ return m_Syntax.m_pCryptoHandler;
+ }
+
+ void SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced = FALSE);
+
+ CFX_ByteString GetRecipient()
+ {
+ return m_bsRecipient;
+ }
+
+ CPDF_Dictionary* GetTrailer()
+ {
+ return m_pTrailer;
+ }
+
+ FX_FILESIZE GetLastXRefOffset()
+ {
+ return m_LastXRefOffset;
+ }
+
+ CPDF_Document* GetDocument()
+ {
+ return m_pDocument;
+ }
+ CFX_ArrayTemplate<CPDF_Dictionary *> * GetOtherTrailers()
+ {
+ return &m_Trailers;
+ }
+
+ virtual FX_DWORD GetRootObjNum();
+ virtual FX_DWORD GetInfoObjNum();
+ virtual CPDF_Array* GetIDArray();
+ virtual CPDF_Dictionary* GetEncryptDict()
+ {
+ return m_pEncryptDict;
+ }
+ virtual CPDF_Object* ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext = NULL);
+ virtual FX_DWORD GetLastObjNum();
+ virtual FX_BOOL IsFormStream(FX_DWORD objnum, FX_BOOL& bForm);
+
+ FX_FILESIZE GetObjectOffset(FX_DWORD objnum);
+
+ FX_FILESIZE GetObjectSize(FX_DWORD objnum);
+
+ int GetObjectVersion(FX_DWORD objnum)
+ {
+ return m_ObjVersion[objnum];
+ }
+
+ void GetIndirectBinary(FX_DWORD objnum, FX_BYTE*& pBuffer, FX_DWORD& size);
+
+ FX_BOOL GetFileStreamOption()
+ {
+ return m_Syntax.m_bFileStream;
+ }
+
+ void SetFileStreamOption(FX_BOOL b)
+ {
+ m_Syntax.m_bFileStream = b;
+ }
+
+ IFX_FileRead* GetFileAccess() const
+ {
+ return m_Syntax.m_pFileAccess;
+ }
+
+ int GetFileVersion() const
+ {
+ return m_FileVersion;
+ }
+
+ FX_BOOL IsXRefStream() const
+ {
+ return m_bXRefStream;
+ }
+ CPDF_Object* ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
+ struct PARSE_CONTEXT* pContext);
+
+ CPDF_Object* ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
+ struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos);
+
+ FX_DWORD StartAsynParse(IFX_FileRead* pFile, FX_BOOL bReParse = FALSE, FX_BOOL bOwnFileRead = TRUE);
+
+ FX_DWORD GetFirstPageNo()
+ {
+ return m_dwFirstPageNo;
+ }
+protected:
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_SyntaxParser m_Syntax;
+ FX_BOOL m_bOwnFileRead;
+ CPDF_Object* ParseDirect(CPDF_Object* pObj);
+
+ FX_BOOL LoadAllCrossRefV4(FX_FILESIZE pos);
+
+ FX_BOOL LoadAllCrossRefV5(FX_FILESIZE pos);
+
+ FX_BOOL LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst);
+
+ FX_BOOL LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef);
+
+ CPDF_Dictionary* LoadTrailerV4();
+
+ FX_BOOL RebuildCrossRef();
+
+ FX_DWORD SetEncryptHandler();
+
+ void ReleaseEncryptHandler();
+
+ FX_BOOL LoadLinearizedAllCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
+
+ FX_BOOL LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount);
+
+ FX_BOOL LoadLinearizedAllCrossRefV5(FX_FILESIZE pos);
+
+ FX_DWORD LoadLinearizedMainXRefTable();
+
+ CFX_MapPtrToPtr m_ObjectStreamMap;
+
+ CPDF_StreamAcc* GetObjectStream(FX_DWORD number);
+
+ FX_BOOL IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset);
+
+
+
+ int m_FileVersion;
+
+ CPDF_Dictionary* m_pTrailer;
+
+ CPDF_Dictionary* m_pEncryptDict;
+ void SetEncryptDictionary(CPDF_Dictionary* pDict);
+
+ FX_FILESIZE m_LastXRefOffset;
+
+ FX_BOOL m_bXRefStream;
+
+
+ CPDF_SecurityHandler* m_pSecurityHandler;
+
+ FX_BOOL m_bForceUseSecurityHandler;
+
+ CFX_ByteString m_bsRecipient;
+
+ CFX_ByteString m_FilePath;
+
+ CFX_ByteString m_Password;
+
+ CFX_FileSizeArray m_CrossRef;
+
+ CFX_ByteArray m_V5Type;
+
+ CFX_FileSizeArray m_SortedOffset;
+
+ CFX_WordArray m_ObjVersion;
+ CFX_ArrayTemplate<CPDF_Dictionary *> m_Trailers;
+
+ FX_BOOL m_bVersionUpdated;
+
+ CPDF_Object* m_pLinearized;
+
+ FX_DWORD m_dwFirstPageNo;
+
+ FX_DWORD m_dwXrefStartObjNum;
+ friend class CPDF_Creator;
+ friend class CPDF_DataAvail;
+};
+#define FXCIPHER_NONE 0
+#define FXCIPHER_RC4 1
+#define FXCIPHER_AES 2
+#define FXCIPHER_AES2 3
+class CPDF_SecurityHandler : public CFX_Object
+{
+public:
+
+ virtual ~CPDF_SecurityHandler() {}
+
+ virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict) = 0;
+
+ virtual FX_DWORD GetPermissions() = 0;
+
+ virtual FX_BOOL IsOwner() = 0;
+
+ virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen) = 0;
+
+ virtual FX_BOOL IsMetadataEncrypted()
+ {
+ return TRUE;
+ }
+
+ virtual CPDF_CryptoHandler* CreateCryptoHandler() = 0;
+
+ virtual CPDF_StandardSecurityHandler* GetStandardHandler()
+ {
+ return NULL;
+ }
+};
+#define PDF_ENCRYPT_CONTENT 0
+class CPDF_StandardSecurityHandler : public CPDF_SecurityHandler
+{
+public:
+ CPDF_StandardSecurityHandler();
+
+ virtual ~CPDF_StandardSecurityHandler();
+ virtual FX_BOOL OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict);
+ virtual FX_DWORD GetPermissions();
+ virtual FX_BOOL IsOwner()
+ {
+ return m_bOwner;
+ }
+ virtual FX_BOOL GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen);
+ virtual FX_BOOL IsMetadataEncrypted();
+ virtual CPDF_CryptoHandler* CreateCryptoHandler();
+ virtual CPDF_StandardSecurityHandler* GetStandardHandler()
+ {
+ return this;
+ }
+
+ void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
+
+ void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type = PDF_ENCRYPT_CONTENT);
+
+ CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size);
+ CFX_ByteString GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len);
+ int GetVersion()
+ {
+ return m_Version;
+ }
+ int GetRevision()
+ {
+ return m_Revision;
+ }
+
+ int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key);
+ int CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key, int key_len);
+private:
+
+ int m_Version;
+
+ int m_Revision;
+
+ CPDF_Parser* m_pParser;
+
+ CPDF_Dictionary* m_pEncryptDict;
+
+ FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict);
+ FX_BOOL LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len);
+
+ FX_BOOL CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len);
+
+ FX_BOOL CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_LPBYTE key, FX_INT32 key_len);
+ FX_BOOL AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key);
+ void AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key);
+ void AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permission, FX_BOOL bEncryptMetadata, FX_LPCBYTE key);
+ void OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type);
+ FX_BOOL CheckSecurity(FX_INT32 key_len);
+
+ FX_BOOL m_bOwner;
+
+ FX_DWORD m_Permissions;
+
+ int m_Cipher;
+
+ FX_BYTE m_EncryptKey[32];
+
+ int m_KeyLen;
+};
+class CPDF_CryptoHandler : public CFX_Object
+{
+public:
+
+ virtual ~CPDF_CryptoHandler() {}
+
+ virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler) = 0;
+
+ virtual FX_DWORD DecryptGetSize(FX_DWORD src_size) = 0;
+
+ virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum) = 0;
+
+ virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
+
+ virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf) = 0;
+
+
+ virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
+
+ virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size) = 0;
+
+ void Decrypt(FX_DWORD objnum, FX_DWORD version, CFX_ByteString& str);
+};
+class CPDF_StandardCryptoHandler : public CPDF_CryptoHandler
+{
+public:
+
+ CPDF_StandardCryptoHandler();
+
+ virtual ~CPDF_StandardCryptoHandler();
+
+ FX_BOOL Init(int cipher, FX_LPCBYTE key, int keylen);
+ virtual FX_BOOL Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler);
+ virtual FX_DWORD DecryptGetSize(FX_DWORD src_size);
+ virtual FX_LPVOID DecryptStart(FX_DWORD objnum, FX_DWORD gennum);
+ virtual FX_BOOL DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual FX_BOOL DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf);
+ virtual FX_DWORD EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size);
+ virtual FX_BOOL EncryptContent(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size);
+protected:
+
+ virtual void CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size);
+ virtual FX_LPVOID CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt);
+ virtual FX_BOOL CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
+ virtual FX_BOOL CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt);
+
+ FX_BYTE m_EncryptKey[32];
+
+ int m_KeyLen;
+
+ int m_Cipher;
+
+ FX_LPBYTE m_pAESContext;
+};
+class CPDF_Point : public CFX_Object
+{
+public:
+
+ CPDF_Point(FX_FLOAT xx, FX_FLOAT yy)
+ {
+ x = xx;
+ y = yy;
+ }
+
+ FX_FLOAT x;
+
+ FX_FLOAT y;
+};
+
+#define CPDF_Rect CFX_FloatRect
+#define CPDF_Matrix CFX_AffineMatrix
+CFX_ByteString PDF_NameDecode(FX_BSTR orig);
+CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig);
+CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig);
+CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex = FALSE);
+CFX_WideString PDF_DecodeText(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
+CFX_WideString PDF_DecodeText(FX_LPCBYTE pData, FX_DWORD size, CFX_CharMap* pCharMap = NULL);
+CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len = -1, CFX_CharMap* pCharMap = NULL);
+FX_FLOAT PDF_ClipFloat(FX_FLOAT f);
+class CFDF_Document : public CPDF_IndirectObjects
+{
+public:
+
+ static CFDF_Document* CreateNewDoc();
+
+ static CFDF_Document* ParseFile(FX_LPCSTR file_path);
+
+ static CFDF_Document* ParseFile(FX_LPCWSTR file_path);
+
+ static CFDF_Document* ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile = FALSE);
+
+ static CFDF_Document* ParseMemory(FX_LPCBYTE pData, FX_DWORD size);
+
+ ~CFDF_Document();
+
+ FX_BOOL WriteFile(FX_LPCSTR file_path) const;
+
+ FX_BOOL WriteFile(FX_LPCWSTR file_path) const;
+
+ FX_BOOL WriteFile(IFX_FileWrite *pFile) const;
+
+ FX_BOOL WriteBuf(CFX_ByteTextBuf& buf) const;
+
+ CPDF_Dictionary* GetRoot() const
+ {
+ return m_pRootDict;
+ }
+
+ CFX_WideString GetWin32Path() const;
+protected:
+
+ CFDF_Document();
+ void ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile);
+ CPDF_Dictionary* m_pRootDict;
+ IFX_FileRead* m_pFile;
+ FX_BOOL m_bOwnFile;
+};
+
+CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec);
+void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& fullpath);
+
+void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+class CPDF_NumberTree : public CFX_Object
+{
+public:
+
+ CPDF_NumberTree(CPDF_Dictionary* pRoot)
+ {
+ m_pRoot = pRoot;
+ }
+
+ CPDF_Object* LookupValue(int num);
+protected:
+
+ CPDF_Dictionary* m_pRoot;
+};
+
+class IFX_FileAvail
+{
+public:
+
+ virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size) = 0;
+};
+class IFX_DownloadHints
+{
+public:
+
+ virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size) = 0;
+};
+#define PDF_IS_LINEARIZED 1
+#define PDF_NOT_LINEARIZED 0
+#define PDF_UNKNOW_LINEARIZED -1
+#define PDFFORM_NOTAVAIL 0
+#define PDFFORM_AVAIL 1
+#define PDFFORM_NOTEXIST 2
+class IPDF_DataAvail
+{
+public:
+
+ virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints) = 0;
+
+
+ virtual void SetDocument(CPDF_Document* pDoc) = 0;
+
+
+ virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints) = 0;
+
+ virtual FX_BOOL IsLinearized() = 0;
+
+ virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints) = 0;
+
+ virtual FX_INT32 IsLinearizedPDF() = 0;
+
+ virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize) = 0;
+};
+class CPDF_SortObjNumArray : public CFX_Object
+{
+public:
+
+ void AddObjNum(FX_DWORD dwObjNum);
+
+ FX_BOOL Find(FX_DWORD dwObjNum);
+
+ void RemoveAll()
+ {
+ m_number_array.RemoveAll();
+ }
+protected:
+
+ FX_BOOL BinarySearch(FX_DWORD value, int &iNext);
+protected:
+
+ CFX_DWordArray m_number_array;
+};
+enum PDF_PAGENODE_TYPE {
+ PDF_PAGENODE_UNKOWN = 0,
+ PDF_PAGENODE_PAGE,
+ PDF_PAGENODE_PAGES,
+ PDF_PAGENODE_ARRAY,
+};
+class CPDF_PageNode : public CFX_Object
+{
+public:
+ CPDF_PageNode() : m_type(PDF_PAGENODE_UNKOWN) {}
+ ~CPDF_PageNode();
+ PDF_PAGENODE_TYPE m_type;
+ FX_DWORD m_dwPageNo;
+ CFX_PtrArray m_childNode;
+};
+enum PDF_DATAAVAIL_STATUS {
+ PDF_DATAAVAIL_HEADER = 0,
+ PDF_DATAAVAIL_FIRSTPAGE,
+ PDF_DATAAVAIL_FIRSTPAGE_PREPARE,
+ PDF_DATAAVAIL_END,
+ PDF_DATAAVAIL_CROSSREF,
+ PDF_DATAAVAIL_CROSSREF_ITEM,
+ PDF_DATAAVAIL_CROSSREF_STREAM,
+ PDF_DATAAVAIL_TRAILER,
+ PDF_DATAAVAIL_LOADALLCRSOSSREF,
+ PDF_DATAAVAIL_ROOT,
+ PDF_DATAAVAIL_INFO,
+ PDF_DATAAVAIL_ACROFORM,
+ PDF_DATAAVAIL_ACROFORM_SUBOBJECT,
+ PDF_DATAAVAIL_PAGETREE,
+ PDF_DATAAVAIL_PAGE,
+ PDF_DATAAVAIL_PAGE_LATERLOAD,
+ PDF_DATAAVAIL_RESOURCES,
+ PDF_DATAAVAIL_DONE,
+ PDF_DATAAVAIL_ERROR,
+ PDF_DATAAVAIL_LOADALLFILE,
+ PDF_DATAAVAIL_TRAILER_APPEND
+};
+class CPDF_DataAvail : public CFX_Object, public IPDF_DataAvail
+{
+public:
+
+ CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead);
+ ~CPDF_DataAvail();
+
+ virtual FX_BOOL IsDocAvail(IFX_DownloadHints* pHints);
+
+
+ virtual void SetDocument(CPDF_Document* pDoc);
+
+
+ virtual FX_BOOL IsPageAvail(int iPage, IFX_DownloadHints* pHints);
+
+ virtual FX_INT32 IsFormAvail(IFX_DownloadHints *pHints);
+
+ virtual FX_INT32 IsLinearizedPDF();
+
+ virtual FX_BOOL IsLinearized()
+ {
+ return m_bLinearized;
+ }
+
+ virtual void GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize);
+ IFX_FileRead* GetFileRead() const
+ {
+ return m_pFileRead;
+ }
+ IFX_FileAvail* GetFileAvail() const
+ {
+ return m_pFileAvail;
+ }
+protected:
+ FX_DWORD GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset);
+ FX_BOOL IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array);
+ FX_BOOL CheckDocStatus(IFX_DownloadHints *pHints);
+ FX_BOOL CheckHeader(IFX_DownloadHints* pHints);
+ FX_BOOL CheckFirstPage(IFX_DownloadHints *pHints);
+ FX_BOOL CheckEnd(IFX_DownloadHints *pHints);
+ FX_BOOL CheckCrossRef(IFX_DownloadHints* pHints);
+ FX_BOOL CheckCrossRefItem(IFX_DownloadHints *pHints);
+ FX_BOOL CheckTrailer(IFX_DownloadHints* pHints);
+ FX_BOOL CheckRoot(IFX_DownloadHints* pHints);
+ FX_BOOL CheckInfo(IFX_DownloadHints* pHints);
+ FX_BOOL CheckPages(IFX_DownloadHints* pHints);
+ FX_BOOL CheckPage(IFX_DownloadHints* pHints);
+ FX_BOOL CheckResources(IFX_DownloadHints* pHints);
+ FX_BOOL CheckAnnots(IFX_DownloadHints* pHints);
+ FX_BOOL CheckAcroForm(IFX_DownloadHints* pHints);
+ FX_BOOL CheckAcroFormSubObject(IFX_DownloadHints* pHints);
+ FX_BOOL CheckTrailerAppend(IFX_DownloadHints* pHints);
+ FX_BOOL CheckPageStatus(IFX_DownloadHints* pHints);
+ FX_BOOL CheckAllCrossRefStream(IFX_DownloadHints *pHints);
+
+ FX_DWORD CheckCrossRefStream(IFX_DownloadHints *pHints, FX_FILESIZE &xref_offset);
+ FX_BOOL IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen);
+ void SetStartOffset(FX_FILESIZE dwOffset);
+ FX_BOOL GetNextToken(CFX_ByteString &token);
+ FX_BOOL GetNextChar(FX_BYTE &ch);
+ CPDF_Object * ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum);
+ CPDF_Object * GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile);
+ FX_BOOL GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages);
+ FX_BOOL PreparePageItem();
+ FX_BOOL LoadPages(IFX_DownloadHints* pHints);
+ FX_BOOL LoadAllXref(IFX_DownloadHints* pHints);
+ FX_BOOL LoadAllFile(IFX_DownloadHints* pHints);
+ FX_BOOL CheckLinearizedData(IFX_DownloadHints* pHints);
+ FX_BOOL CheckFileResources(IFX_DownloadHints* pHints);
+ FX_BOOL CheckPageAnnots(int iPage, IFX_DownloadHints* pHints);
+
+ FX_BOOL CheckLinearizedFirstPage(int iPage, IFX_DownloadHints* pHints);
+ FX_BOOL HaveResourceAncestor(CPDF_Dictionary *pDict);
+ FX_BOOL CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
+ FX_BOOL LoadDocPages(IFX_DownloadHints* pHints);
+ FX_BOOL LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints);
+ FX_BOOL CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints);
+ FX_BOOL CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
+ FX_BOOL CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints);
+ FX_BOOL CheckPageCount(IFX_DownloadHints* pHints);
+ FX_BOOL IsFirstCheck(int iPage);
+ void ResetFirstCheck(int iPage);
+
+ CPDF_Parser m_parser;
+
+ CPDF_SyntaxParser m_syntaxParser;
+
+ CPDF_Object *m_pRoot;
+
+ FX_DWORD m_dwRootObjNum;
+
+ FX_DWORD m_dwInfoObjNum;
+
+ CPDF_Object *m_pLinearized;
+
+ CPDF_Object *m_pTrailer;
+
+ FX_BOOL m_bDocAvail;
+
+ FX_FILESIZE m_dwHeaderOffset;
+
+ FX_FILESIZE m_dwLastXRefOffset;
+
+ FX_FILESIZE m_dwXRefOffset;
+
+ FX_FILESIZE m_dwTrailerOffset;
+
+ FX_FILESIZE m_dwCurrentOffset;
+
+ PDF_DATAAVAIL_STATUS m_docStatus;
+
+ IFX_FileAvail* m_pFileAvail;
+
+ IFX_FileRead* m_pFileRead;
+
+ FX_FILESIZE m_dwFileLen;
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_SortObjNumArray m_objnum_array;
+
+ CFX_PtrArray m_objs_array;
+
+ FX_FILESIZE m_Pos;
+
+ FX_FILESIZE m_bufferOffset;
+
+ FX_DWORD m_bufferSize;
+
+ CFX_ByteString m_WordBuf;
+
+ FX_BYTE m_WordBuffer[257];
+
+ FX_DWORD m_WordSize;
+
+ FX_BYTE m_bufferData[512];
+
+ CFX_FileSizeArray m_CrossOffset;
+
+ CFX_DWordArray m_XRefStreamList;
+
+ CFX_DWordArray m_PageObjList;
+
+ FX_DWORD m_PagesObjNum;
+
+ FX_BOOL m_bLinearized;
+
+ FX_DWORD m_dwFirstPageNo;
+
+ FX_BOOL m_bLinearedDataOK;
+
+ FX_BOOL m_bMainXRefLoad;
+
+ FX_BOOL m_bMainXRefLoadedOK;
+
+ FX_BOOL m_bPagesTreeLoad;
+
+ FX_BOOL m_bPagesLoad;
+
+ CPDF_Parser * m_pCurrentParser;
+
+ FX_FILESIZE m_dwCurrentXRefSteam;
+
+ FX_BOOL m_bAnnotsLoad;
+
+ FX_BOOL m_bHaveAcroForm;
+
+ FX_DWORD m_dwAcroFormObjNum;
+
+ FX_BOOL m_bAcroFormLoad;
+
+ CPDF_Object * m_pAcroForm;
+
+ CFX_PtrArray m_arrayAcroforms;
+
+ CPDF_Dictionary * m_pPageDict;
+
+ CPDF_Object * m_pPageResource;
+
+ FX_BOOL m_bNeedDownLoadResource;
+
+ FX_BOOL m_bPageLoadedOK;
+
+ FX_BOOL m_bLinearizedFormParamLoad;
+
+ CFX_PtrArray m_PagesArray;
+
+ FX_DWORD m_dwEncryptObjNum;
+
+ FX_FILESIZE m_dwPrevXRefOffset;
+
+ FX_BOOL m_bTotalLoadPageTree;
+
+ FX_BOOL m_bCurPageDictLoadOK;
+
+ CPDF_PageNode m_pageNodes;
+
+ CFX_CMapDWordToDWord * m_pageMapCheckState;
+
+ CFX_CMapDWordToDWord * m_pagesLoadState;
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h
new file mode 100644
index 0000000000..22ba56fa66
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_render.h
@@ -0,0 +1,318 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_RENDER_
+#define _FPDF_RENDER_
+#ifndef _FPDF_PAGE_
+#include "fpdf_page.h"
+#endif
+#ifndef _FX_GE_H_
+#include "../fxge/fx_ge.h"
+#endif
+class CPDF_RenderContext;
+class CPDF_RenderOptions;
+class CPDF_ImageCache;
+class IPDF_OCContext;
+class CPDF_QuickStretcher;
+class CFX_PathData;
+class CFX_GraphStateData;
+class CFX_RenderDevice;
+class CPDF_TextObject;
+class CPDF_PathObject;
+class CPDF_ImageObject;
+class CPDF_ShadingObject;
+class CPDF_FormObject;
+class IPDF_OCContext
+{
+public:
+
+ virtual ~IPDF_OCContext() {}
+
+ virtual FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCG) = 0;
+
+ FX_BOOL CheckObjectVisible(const CPDF_PageObject* pObj);
+};
+#define RENDER_COLOR_NORMAL 0
+#define RENDER_COLOR_GRAY 1
+#define RENDER_COLOR_TWOCOLOR 2
+#define RENDER_COLOR_ALPHA 3
+#define RENDER_CLEARTYPE 0x00000001
+#define RENDER_PRINTGRAPHICTEXT 0x00000002
+#define RENDER_FORCE_DOWNSAMPLE 0x00000004
+#define RENDER_PRINTPREVIEW 0x00000008
+#define RENDER_BGR_STRIPE 0x00000010
+#define RENDER_NO_NATIVETEXT 0x00000020
+#define RENDER_FORCE_HALFTONE 0x00000040
+#define RENDER_RECT_AA 0x00000080
+#define RENDER_FILL_FULLCOVER 0x00000100
+#define RENDER_PRINTIMAGETEXT 0x00000200
+#define RENDER_OVERPRINT 0x00000400
+#define RENDER_THINLINE 0x00000800
+#define RENDER_NOTEXTSMOOTH 0x10000000
+#define RENDER_NOPATHSMOOTH 0x20000000
+#define RENDER_NOIMAGESMOOTH 0x40000000
+#define RENDER_LIMITEDIMAGECACHE 0x80000000
+class CPDF_RenderOptions : public CFX_Object
+{
+public:
+
+ CPDF_RenderOptions();
+
+ int m_ColorMode;
+
+ FX_COLORREF m_BackColor;
+
+ FX_COLORREF m_ForeColor;
+
+ FX_DWORD m_Flags;
+
+ int m_Interpolation;
+
+ FX_DWORD m_AddFlags;
+
+ IPDF_OCContext* m_pOCContext;
+
+ FX_DWORD m_dwLimitCacheSize;
+
+ int m_HalftoneLimit;
+
+ FX_ARGB TranslateColor(FX_ARGB argb) const;
+};
+class CPDF_RenderContext : public CFX_Object
+{
+public:
+
+ CPDF_RenderContext();
+
+ void Create(CPDF_Page* pPage, FX_BOOL bFirstLayer = TRUE);
+
+ void Create(CPDF_Document* pDoc = NULL, CPDF_PageRenderCache* pPageCache = NULL,
+ CPDF_Dictionary* pPageResources = NULL, FX_BOOL bFirstLayer = TRUE);
+
+ ~CPDF_RenderContext();
+
+ void Clear();
+
+ void AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device);
+
+ void SetBackground(class IPDF_BackgroundDraw* pBackground);
+
+ void Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions = NULL,
+ const CFX_AffineMatrix* pFinalMatrix = NULL);
+
+ void DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,
+ const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions);
+
+ void GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,
+ const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix);
+
+ CPDF_PageRenderCache* GetPageCache() const
+ {
+ return m_pPageCache;
+ }
+
+
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_Dictionary* m_pPageResources;
+
+ CPDF_PageRenderCache* m_pPageCache;
+
+protected:
+
+ CFX_ArrayTemplate<struct _PDF_RenderItem> m_ContentList;
+
+ IPDF_BackgroundDraw* m_pBackgroundDraw;
+
+ FX_BOOL m_bFirstLayer;
+
+ void Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,
+ const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pFinalMatrix);
+ friend class CPDF_RenderStatus;
+ friend class CPDF_ProgressiveRenderer;
+};
+class IPDF_BackgroundDraw
+{
+public:
+
+ virtual void OnDrawBackground(
+ CFX_RenderDevice* pBitmapDevice,
+ const CFX_AffineMatrix* pOriginal2Bitmap
+ ) = 0;
+};
+class CPDF_ProgressiveRenderer : public CFX_Object
+{
+public:
+
+ CPDF_ProgressiveRenderer();
+
+ ~CPDF_ProgressiveRenderer();
+
+ typedef enum {
+ Ready,
+ ToBeContinued,
+ Done,
+ Failed
+ } RenderStatus;
+
+ RenderStatus GetStatus()
+ {
+ return m_Status;
+ }
+
+
+
+ void Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
+ const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);
+
+ void Continue(class IFX_Pause* pPause);
+
+
+ int EstimateProgress();
+
+ void Clear();
+protected:
+
+ RenderStatus m_Status;
+
+ CPDF_RenderContext* m_pContext;
+
+ CFX_RenderDevice* m_pDevice;
+
+ const CPDF_RenderOptions* m_pOptions;
+
+ FX_BOOL m_bDropObjects;
+
+ class CPDF_RenderStatus* m_pRenderer;
+
+ CFX_FloatRect m_ClipRect;
+
+ FX_DWORD m_LayerIndex;
+
+ FX_DWORD m_ObjectIndex;
+
+ FX_POSITION m_ObjectPos;
+
+ FX_POSITION m_PrevLastPos;
+
+ void RenderStep();
+};
+class CPDF_TextRenderer : public CFX_Object
+{
+public:
+
+ static void DrawTextString(CFX_RenderDevice* pDevice, int left, int top,
+ CPDF_Font* pFont,
+ int height,
+ const CFX_ByteString& str,
+ FX_ARGB argb);
+
+ static void DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y,
+ CPDF_Font* pFont,
+ FX_FLOAT font_size,
+ const CFX_AffineMatrix* matrix,
+ const CFX_ByteString& str,
+ FX_ARGB fill_argb,
+ FX_ARGB stroke_argb = 0,
+ const CFX_GraphStateData* pGraphState = NULL,
+ const CPDF_RenderOptions* pOptions = NULL
+ );
+
+ static FX_BOOL DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag = 0);
+
+ static FX_BOOL DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions);
+
+ static FX_BOOL DrawType3Text(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_ARGB fill_argb);
+};
+class IPDF_PageImageCache
+{
+public:
+
+ static IPDF_PageImageCache* Create();
+
+ virtual ~IPDF_PageImageCache() {}
+
+ virtual void OutputPage(CFX_RenderDevice* pDevice, CPDF_Page* pPage,
+ int pos_x, int pos_y, int size_x, int size_y, int rotate) = 0;
+
+ virtual void SetCacheLimit(FX_DWORD limit) = 0;
+};
+class CPDF_PageRenderCache : public CFX_Object
+{
+public:
+ CPDF_PageRenderCache(CPDF_Page* pPage)
+ {
+ m_pPage = pPage;
+ m_nTimeCount = 0;
+ m_nCacheSize = 0;
+ m_pCurImageCache = NULL;
+ m_bCurFindCache = FALSE;
+ m_pCurImageCaches = NULL;
+ }
+ ~CPDF_PageRenderCache()
+ {
+ ClearAll();
+ }
+ void ClearAll();
+ void ClearImageData();
+
+ FX_DWORD EstimateSize();
+ void CacheOptimization(FX_INT32 dwLimitCacheSize);
+ FX_DWORD GetCachedSize(CPDF_Stream* pStream) const;
+ FX_DWORD GetTimeCount() const
+ {
+ return m_nTimeCount;
+ }
+ void SetTimeCount(FX_DWORD dwTimeCount)
+ {
+ m_nTimeCount = dwTimeCount;
+ }
+
+ void GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
+ CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+
+ void ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap);
+ void ClearImageCache(CPDF_Stream* pStream);
+ CPDF_Page* GetPage()
+ {
+ return m_pPage;
+ }
+ CFX_MapPtrToPtr m_ImageCaches;
+public:
+ FX_BOOL StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
+ FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL,
+ FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+
+ FX_BOOL Continue(IFX_Pause* pPause);
+ CPDF_ImageCache* m_pCurImageCache;
+ CFX_PtrArray* m_pCurImageCaches;
+protected:
+ friend class CPDF_Page;
+ CPDF_Page* m_pPage;
+
+ FX_DWORD m_nTimeCount;
+ FX_DWORD m_nCacheSize;
+ FX_BOOL m_bCurFindCache;
+};
+class CPDF_RenderConfig : public CFX_Object
+{
+public:
+ CPDF_RenderConfig();
+ ~CPDF_RenderConfig();
+ int m_HalftoneLimit;
+ int m_RenderStepLimit;
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_resource.h b/core/include/fpdfapi/fpdf_resource.h
new file mode 100644
index 0000000000..eea3afc4c6
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_resource.h
@@ -0,0 +1,960 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_RESOURCE_
+#define _FPDF_RESOURCE_
+#ifndef _FPDF_PARSER_
+#include "fpdf_parser.h"
+#endif
+#ifndef _FX_FONT_H_
+#include "../fxge/fx_font.h"
+#endif
+class CPDF_Font;
+class CPDF_Type1Font;
+class CPDF_TrueTypeFont;
+class CPDF_CIDFont;
+class CPDF_Type3Font;
+class CPDF_FontEncoding;
+class CPDF_CMap;
+class CPDF_CID2UnicodeMap;
+class CPDF_ColorSpace;
+class CPDF_Color;
+class CPDF_Function;
+class CPDF_Pattern;
+class CPDF_TilingPattern;
+class CPDF_ShadingPattern;
+class CPDF_Image;
+class CPDF_Face;
+class CPDF_ToUnicodeMap;
+class CFX_SubstFont;
+class CFX_Font;
+class CPDF_RenderContext;
+class CPDF_Form;
+class CPDF_ImageObject;
+class CFX_DIBitmap;
+typedef struct FT_FaceRec_* FXFT_Face;
+class CFX_CTTGSUBTable;
+class CPDF_Page;
+#define PDFFONT_TYPE1 1
+#define PDFFONT_TRUETYPE 2
+#define PDFFONT_TYPE3 3
+#define PDFFONT_CIDFONT 4
+#define PDFFONT_FIXEDPITCH 1
+#define PDFFONT_SERIF 2
+#define PDFFONT_SYMBOLIC 4
+#define PDFFONT_SCRIPT 8
+#define PDFFONT_NONSYMBOLIC 32
+#define PDFFONT_ITALIC 64
+#define PDFFONT_ALLCAP 0x10000
+#define PDFFONT_SMALLCAP 0x20000
+#define PDFFONT_FORCEBOLD 0x40000
+#define PDFFONT_USEEXTERNATTR 0x80000
+FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name);
+CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode);
+class CPDF_Font : public CFX_Object
+{
+public:
+
+ static CPDF_Font* CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict);
+
+ static CPDF_Font* GetStockFont(CPDF_Document* pDoc, FX_BSTR fontname);
+
+ virtual ~CPDF_Font();
+
+
+
+
+ int GetFontType() const
+ {
+ return m_FontType;
+ }
+
+ CFX_ByteString GetFontTypeName() const;
+
+ const CFX_ByteString& GetBaseFont() const
+ {
+ return m_BaseFont;
+ }
+
+ const CFX_SubstFont* GetSubstFont() const
+ {
+ return m_Font.GetSubstFont();
+ }
+
+ FX_DWORD GetFlags() const
+ {
+ return m_Flags;
+ }
+
+ virtual FX_BOOL IsVertWriting()const;
+
+
+
+
+ CPDF_Type1Font* GetType1Font() const
+ {
+ return m_FontType == PDFFONT_TYPE1 ? (CPDF_Type1Font*)(void*)this : NULL;
+ }
+
+ CPDF_TrueTypeFont* GetTrueTypeFont() const
+ {
+ return m_FontType == PDFFONT_TRUETYPE ? (CPDF_TrueTypeFont*)(void*)this : NULL;
+ }
+
+ CPDF_CIDFont* GetCIDFont() const
+ {
+ return (m_FontType == PDFFONT_CIDFONT) ? (CPDF_CIDFont*)(void*)this : NULL;
+ }
+
+ CPDF_Type3Font* GetType3Font() const
+ {
+ return (m_FontType == PDFFONT_TYPE3) ? (CPDF_Type3Font*)(void*)this : NULL;
+ }
+
+
+ FX_BOOL IsEmbedded() const
+ {
+ return m_FontType == PDFFONT_TYPE3 || m_pFontFile != NULL;
+ }
+
+ virtual FX_BOOL IsUnicodeCompatible() const
+ {
+ return FALSE;
+ }
+
+ CPDF_StreamAcc* GetFontFile() const
+ {
+ return m_pFontFile;
+ }
+
+ CPDF_Dictionary* GetFontDict() const
+ {
+ return m_pFontDict;
+ }
+
+ FX_BOOL IsStandardFont() const;
+
+ FXFT_Face GetFace() const
+ {
+ return m_Font.GetFace();
+ }
+
+
+
+ virtual FX_DWORD GetNextChar(FX_LPCSTR pString, int& offset) const
+ {
+ return (FX_BYTE)pString[offset++];
+ }
+
+ virtual int CountChar(FX_LPCSTR pString, int size) const
+ {
+ return size;
+ }
+
+ void AppendChar(CFX_ByteString& str, FX_DWORD charcode) const;
+
+ virtual int AppendChar(FX_LPSTR buf, FX_DWORD charcode) const
+ {
+ *buf = (FX_CHAR)charcode;
+ return 1;
+ }
+
+ virtual int GetCharSize(FX_DWORD charcode) const
+ {
+ return 1;
+ }
+
+
+
+
+ virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL) = 0;
+ virtual int GlyphFromCharCodeExt(FX_DWORD charcode)
+ {
+ return GlyphFromCharCode(charcode);
+ }
+
+ CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const;
+
+ FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const;
+
+ CFX_CharMap* GetCharMap()
+ {
+ return m_pCharMap;
+ }
+
+ CFX_ByteString EncodeString(const CFX_WideString& str) const;
+
+ CFX_WideString DecodeString(const CFX_ByteString& str) const;
+
+
+
+
+ void GetFontBBox(FX_RECT& rect) const
+ {
+ rect = m_FontBBox;
+ }
+
+ int GetTypeAscent() const
+ {
+ return m_Ascent;
+ }
+
+ int GetTypeDescent() const
+ {
+ return m_Descent;
+ }
+
+ int GetItalicAngle() const
+ {
+ return m_ItalicAngle;
+ }
+
+ int GetStemV() const
+ {
+ return m_StemV;
+ }
+
+ int GetStringWidth(const FX_CHAR* pString, int size);
+
+ virtual int GetCharWidthF(FX_DWORD charcode, int level = 0) = 0;
+
+ virtual int GetCharTypeWidth(FX_DWORD charcode);
+
+ virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0) = 0;
+
+
+
+ CPDF_Document* m_pDocument;
+
+ class CFX_PathData* LoadGlyphPath(FX_DWORD charcode, int dest_width = 0);
+
+ CFX_Font m_Font;
+protected:
+
+ CPDF_Font();
+
+ FX_BOOL Initialize();
+
+ FX_BOOL Load();
+
+ virtual FX_BOOL _Load() = 0;
+
+ virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const = 0;
+
+ virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
+
+ void LoadUnicodeMap();
+
+ void LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding,
+ CFX_ByteString*& pCharNames, FX_BOOL bEmbedded, FX_BOOL bTrueType);
+
+ void LoadFontDescriptor(CPDF_Dictionary*);
+
+ void LoadCharWidths(FX_WORD* pWidths);
+
+ void CheckFontMetrics();
+
+ CFX_CharMap* m_pCharMap;
+
+
+
+ int m_FontType;
+
+ CFX_ByteString m_BaseFont;
+
+ CPDF_StreamAcc* m_pFontFile;
+
+ CPDF_Dictionary* m_pFontDict;
+
+ CPDF_ToUnicodeMap* m_pToUnicodeMap;
+
+ FX_BOOL m_bToUnicodeLoaded;
+
+
+
+
+ int m_Flags;
+
+ FX_RECT m_FontBBox;
+
+ int m_StemV;
+
+ int m_Ascent;
+
+ int m_Descent;
+
+ int m_ItalicAngle;
+
+};
+#define PDFFONT_ENCODING_BUILTIN 0
+#define PDFFONT_ENCODING_WINANSI 1
+#define PDFFONT_ENCODING_MACROMAN 2
+#define PDFFONT_ENCODING_MACEXPERT 3
+#define PDFFONT_ENCODING_STANDARD 4
+#define PDFFONT_ENCODING_ADOBE_SYMBOL 5
+#define PDFFONT_ENCODING_ZAPFDINGBATS 6
+#define PDFFONT_ENCODING_PDFDOC 7
+#define PDFFONT_ENCODING_MS_SYMBOL 8
+#define PDFFONT_ENCODING_UNICODE 9
+class CPDF_FontEncoding : public CFX_Object
+{
+public:
+
+ CPDF_FontEncoding();
+
+ CPDF_FontEncoding(int PredefinedEncoding);
+
+ void LoadEncoding(CPDF_Object* pEncoding);
+
+ FX_BOOL IsIdentical(CPDF_FontEncoding* pAnother) const;
+
+ FX_WCHAR UnicodeFromCharCode(FX_BYTE charcode) const
+ {
+ return m_Unicodes[charcode];
+ }
+
+ int CharCodeFromUnicode(FX_WCHAR unicode) const;
+
+ void SetUnicode(FX_BYTE charcode, FX_WCHAR unicode)
+ {
+ m_Unicodes[charcode] = unicode;
+ }
+
+ CPDF_Object* Realize();
+public:
+
+ FX_WCHAR m_Unicodes[256];
+};
+class CPDF_SimpleFont : public CPDF_Font
+{
+public:
+
+ CPDF_SimpleFont();
+
+ virtual ~CPDF_SimpleFont();
+
+ CPDF_FontEncoding* GetEncoding()
+ {
+ return &m_Encoding;
+ }
+ virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
+ virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
+ virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
+ virtual FX_BOOL IsUnicodeCompatible() const;
+protected:
+
+ FX_BOOL LoadCommon();
+
+ void LoadSubstFont();
+
+ void LoadFaceMetrics();
+
+ virtual void LoadGlyphMap() = 0;
+ virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const
+ {
+ return m_Encoding.UnicodeFromCharCode((FX_BYTE)charcode);
+ }
+ virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const
+ {
+ return m_Encoding.CharCodeFromUnicode(Unicode);
+ }
+
+
+
+ CPDF_FontEncoding m_Encoding;
+
+ FX_WORD m_GlyphIndex[256];
+ FX_WORD m_ExtGID[256];
+
+
+
+
+ CFX_ByteString* m_pCharNames;
+
+ int m_BaseEncoding;
+
+
+
+
+ FX_WORD m_CharWidth[256];
+
+ FX_SMALL_RECT m_CharBBox[256];
+
+ FX_BOOL m_bUseFontWidth;
+
+ void LoadCharMetrics(int charcode);
+
+};
+class CPDF_Type1Font : public CPDF_SimpleFont
+{
+public:
+
+ CPDF_Type1Font();
+
+ int GetBase14Font()
+ {
+ return m_Base14Font;
+ }
+ virtual int GlyphFromCharCodeExt(FX_DWORD charcode);
+protected:
+ virtual FX_BOOL _Load();
+
+ int m_Base14Font;
+ virtual void LoadGlyphMap();
+};
+class CPDF_TrueTypeFont : public CPDF_SimpleFont
+{
+public:
+
+ CPDF_TrueTypeFont();
+protected:
+ virtual FX_BOOL _Load();
+ virtual void LoadGlyphMap();
+};
+class CPDF_Type3Char : public CFX_Object
+{
+public:
+
+ CPDF_Type3Char();
+
+ ~CPDF_Type3Char();
+
+ FX_BOOL LoadBitmap(CPDF_RenderContext* pContext);
+
+ FX_BOOL m_bColored;
+
+ FX_BOOL m_bPageRequired;
+
+
+
+ CPDF_Form* m_pForm;
+
+ CFX_AffineMatrix m_ImageMatrix;
+
+ CFX_DIBitmap* m_pBitmap;
+
+
+ int m_Width;
+
+ FX_RECT m_BBox;
+};
+class CPDF_Type3Font : public CPDF_SimpleFont
+{
+public:
+ CPDF_Type3Font();
+ virtual ~CPDF_Type3Font();
+ void SetPageResources(CPDF_Dictionary* pResources)
+ {
+ m_pPageResources = pResources;
+ }
+ CPDF_Type3Char* LoadChar(FX_DWORD charcode, int level = 0);
+ virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
+ virtual int GetCharTypeWidth(FX_DWORD charcode)
+ {
+ return GetCharWidthF(charcode);
+ }
+ virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
+ CFX_AffineMatrix& GetFontMatrix()
+ {
+ return m_FontMatrix;
+ }
+ void CheckType3FontMetrics();
+private:
+ virtual FX_BOOL _Load();
+ virtual void LoadGlyphMap() {}
+ int m_CharWidthL[256];
+ CPDF_Dictionary* m_pCharProcs;
+ CPDF_Dictionary* m_pPageResources;
+ CPDF_Dictionary* m_pFontResources;
+ CFX_MapPtrToPtr m_CacheMap;
+ CFX_MapPtrToPtr m_DeletedMap;
+protected:
+ CFX_AffineMatrix m_FontMatrix;
+};
+#define CIDSET_UNKNOWN 0
+#define CIDSET_GB1 1
+#define CIDSET_CNS1 2
+#define CIDSET_JAPAN1 3
+#define CIDSET_KOREA1 4
+#define CIDSET_UNICODE 5
+class CPDF_CIDFont : public CPDF_Font
+{
+public:
+
+ CPDF_CIDFont();
+
+ virtual ~CPDF_CIDFont();
+
+ FX_BOOL LoadGB2312();
+ virtual int GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph = NULL);
+ virtual int GetCharWidthF(FX_DWORD charcode, int level = 0);
+ virtual void GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level = 0);
+
+ FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
+
+ FX_BOOL IsTrueType()
+ {
+ return !m_bType1;
+ }
+
+
+ virtual FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const;
+ virtual int CountChar(const FX_CHAR* pString, int size) const;
+ virtual int AppendChar(FX_LPSTR str, FX_DWORD charcode) const;
+ virtual int GetCharSize(FX_DWORD charcode) const;
+
+
+ int GetCharset() const
+ {
+ return m_Charset;
+ }
+
+ FX_LPCBYTE GetCIDTransform(FX_WORD CID) const;
+
+
+
+ virtual FX_BOOL IsVertWriting() const;
+
+ short GetVertWidth(FX_WORD CID) const;
+
+ void GetVertOrigin(FX_WORD CID, short& vx, short& vy) const;
+
+ virtual FX_BOOL IsUnicodeCompatible() const;
+ virtual FX_BOOL IsFontStyleFromCharCode(FX_DWORD charcode) const;
+protected:
+ friend class CPDF_Font;
+ virtual FX_BOOL _Load();
+ virtual FX_WCHAR _UnicodeFromCharCode(FX_DWORD charcode) const;
+ virtual FX_DWORD _CharCodeFromUnicode(FX_WCHAR Unicode) const;
+ int GetGlyphIndex(FX_DWORD unicodeb, FX_BOOL *pVertGlyph);
+
+ CPDF_CMap* m_pCMap;
+
+ CPDF_CMap* m_pAllocatedCMap;
+
+ CPDF_CID2UnicodeMap* m_pCID2UnicodeMap;
+
+ int m_Charset;
+
+ FX_BOOL m_bType1;
+
+ CPDF_StreamAcc* m_pCIDToGIDMap;
+ FX_BOOL m_bCIDIsGID;
+
+
+
+ FX_WORD m_DefaultWidth;
+
+ FX_WORD* m_pAnsiWidths;
+
+ FX_SMALL_RECT m_CharBBox[256];
+
+ CFX_DWordArray m_WidthList;
+
+ short m_DefaultVY;
+
+ short m_DefaultW1;
+
+ CFX_DWordArray m_VertMetrics;
+
+
+ void LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements);
+
+ void LoadSubstFont();
+
+ FX_BOOL m_bAdobeCourierStd;
+
+ CFX_CTTGSUBTable* m_pTTGSUBTable;
+};
+#define PDFCS_DEVICEGRAY 1
+
+#define PDFCS_DEVICERGB 2
+#define PDFCS_DEVICECMYK 3
+#define PDFCS_CALGRAY 4
+#define PDFCS_CALRGB 5
+#define PDFCS_LAB 6
+#define PDFCS_ICCBASED 7
+#define PDFCS_SEPARATION 8
+#define PDFCS_DEVICEN 9
+#define PDFCS_INDEXED 10
+#define PDFCS_PATTERN 11
+class CPDF_ColorSpace : public CFX_Object
+{
+public:
+
+ static CPDF_ColorSpace* GetStockCS(int Family);
+
+ static CPDF_ColorSpace* Load(CPDF_Document* pDoc, CPDF_Object* pCSObj);
+
+ void ReleaseCS();
+
+ int GetBufSize() const;
+
+ FX_FLOAT* CreateBuf();
+
+ void GetDefaultColor(FX_FLOAT* buf) const;
+
+ int CountComponents() const
+ {
+ return m_nComponents;
+ }
+
+ int GetFamily() const
+ {
+ return m_Family;
+ }
+
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ value = 0;
+ min = 0;
+ max = 1.0f;
+ }
+
+ FX_BOOL sRGB() const;
+
+
+
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const = 0;
+
+ virtual FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+ {
+ return FALSE;
+ }
+
+
+
+
+ FX_BOOL GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
+
+ FX_BOOL SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
+
+
+ virtual void TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels,
+ int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+
+ CPDF_Array*& GetArray()
+ {
+ return m_pArray;
+ }
+
+ int GetMaxIndex() const;
+
+ virtual CPDF_ColorSpace* GetBaseCS() const
+ {
+ return NULL;
+ }
+
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_Document* m_pDocument;
+protected:
+
+ CPDF_ColorSpace();
+
+ virtual ~CPDF_ColorSpace() {}
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+ {
+ return TRUE;
+ }
+ virtual FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
+ {
+ return FALSE;
+ }
+
+ int m_Family;
+
+ int m_nComponents;
+
+ CPDF_Array* m_pArray;
+
+ FX_DWORD m_dwStdConversion;
+};
+class CPDF_Color : public CFX_Object
+{
+public:
+
+ CPDF_Color()
+ {
+ m_pBuffer = NULL;
+ m_pCS = NULL;
+ }
+
+ CPDF_Color(int family);
+
+ ~CPDF_Color();
+
+ FX_BOOL IsNull() const
+ {
+ return m_pBuffer == NULL;
+ }
+
+ FX_BOOL IsEqual(const CPDF_Color& other) const;
+
+ FX_BOOL IsPattern() const
+ {
+ return m_pCS && m_pCS->GetFamily() == PDFCS_PATTERN;
+ }
+
+ void Copy(const CPDF_Color* pSrc);
+
+ void SetColorSpace(CPDF_ColorSpace* pCS);
+
+ void SetValue(FX_FLOAT* comp);
+
+ void SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comp, int ncomps);
+
+ FX_BOOL GetRGB(int& R, int& G, int& B) const;
+
+ CPDF_Pattern* GetPattern() const;
+
+ CPDF_ColorSpace* GetPatternCS() const;
+
+ FX_FLOAT* GetPatternColor() const;
+
+ CPDF_ColorSpace* m_pCS;
+
+ FX_FLOAT* m_pBuffer;
+protected:
+ void ReleaseBuffer();
+ void ReleaseColorSpace();
+};
+#define PATTERN_TILING 1
+#define PATTERN_SHADING 2
+class CPDF_Pattern : public CFX_Object
+{
+public:
+
+ virtual ~CPDF_Pattern() {}
+
+ CPDF_Object* m_pPatternObj;
+
+ int m_PatternType;
+
+ CFX_AffineMatrix m_Pattern2Form;
+ CFX_AffineMatrix m_ParentMatrix;
+
+ CPDF_Document* m_pDocument;
+
+protected:
+
+ CPDF_Pattern(const CFX_AffineMatrix* pParentMatrix)
+ {
+ if (pParentMatrix) {
+ m_ParentMatrix = *pParentMatrix;
+ }
+ }
+};
+class CPDF_TilingPattern : public CPDF_Pattern
+{
+public:
+
+ CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix);
+
+ virtual ~CPDF_TilingPattern();
+
+ FX_BOOL Load();
+
+
+
+ FX_BOOL m_bColored;
+
+ CFX_FloatRect m_BBox;
+
+ FX_FLOAT m_XStep;
+
+ FX_FLOAT m_YStep;
+
+
+
+ CPDF_Form* m_pForm;
+};
+class CPDF_ShadingPattern : public CPDF_Pattern
+{
+public:
+
+ CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix);
+
+ virtual ~CPDF_ShadingPattern();
+
+ CPDF_Object* m_pShadingObj;
+
+ FX_BOOL m_bShadingObj;
+
+ FX_BOOL Load();
+
+ FX_BOOL Reload();
+
+ int m_ShadingType;
+
+ CPDF_ColorSpace* m_pCS;
+
+
+ CPDF_Function* m_pFunctions[4];
+
+ int m_nFuncs;
+protected:
+ void Clear();
+};
+struct CPDF_MeshVertex {
+ FX_FLOAT x, y;
+ FX_FLOAT r, g, b;
+};
+class CPDF_MeshStream : public CFX_Object
+{
+public:
+
+ FX_BOOL Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
+
+ FX_DWORD GetFlag();
+
+ void GetCoords(FX_FLOAT& x, FX_FLOAT& y);
+
+ void GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b);
+
+ FX_DWORD GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap);
+
+ FX_BOOL GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap);
+ CPDF_Function** m_pFuncs;
+ CPDF_ColorSpace* m_pCS;
+ FX_DWORD m_nFuncs, m_nCoordBits, m_nCompBits, m_nFlagBits, m_nComps;
+ FX_DWORD m_CoordMax, m_CompMax;
+ FX_FLOAT m_xmin, m_xmax, m_ymin, m_ymax;
+ FX_FLOAT m_ColorMin[8], m_ColorMax[8];
+ CPDF_StreamAcc m_Stream;
+ CFX_BitStream m_BitStream;
+};
+#define PDF_IMAGE_NO_COMPRESS 0x0000
+#define PDF_IMAGE_LOSSY_COMPRESS 0x0001
+#define PDF_IMAGE_LOSSLESS_COMPRESS 0x0002
+#define PDF_IMAGE_MASK_LOSSY_COMPRESS 0x0004
+#define PDF_IMAGE_MASK_LOSSLESS_COMPRESS 0x0008
+class CPDF_ImageSetParam
+{
+public:
+ CPDF_ImageSetParam()
+ : pMatteColor(NULL)
+ , nQuality(80)
+ {
+ }
+ FX_ARGB* pMatteColor;
+ FX_INT32 nQuality;
+};
+class CPDF_Image : public CFX_Object
+{
+public:
+
+ CPDF_Image(CPDF_Document* pDoc);
+
+ ~CPDF_Image();
+
+ FX_BOOL LoadImageF(CPDF_Stream* pImageStream, FX_BOOL bInline);
+
+ void Release();
+
+ CPDF_Image* Clone();
+
+ FX_BOOL IsInline()
+ {
+ return m_bInline;
+ }
+
+ void SetInlineDict(CPDF_Dictionary* pDict)
+ {
+ m_pInlineDict = pDict;
+ }
+
+ CPDF_Dictionary* GetInlineDict() const
+ {
+ return m_pInlineDict;
+ }
+
+ CPDF_Stream* GetStream() const
+ {
+ return m_pStream;
+ }
+
+ CPDF_Dictionary* GetDict() const
+ {
+ return m_pStream->GetDict();
+ }
+
+ CPDF_Dictionary* GetOC() const
+ {
+ return m_pOC;
+ }
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+
+
+
+ FX_INT32 GetPixelHeight() const
+ {
+ return m_Height;
+ }
+
+ FX_INT32 GetPixelWidth() const
+ {
+ return m_Width;
+ }
+
+
+ FX_BOOL IsMask() const
+ {
+ return m_bIsMask;
+ }
+
+ FX_BOOL IsInterpol() const
+ {
+ return m_bInterpolate;
+ }
+
+ CFX_DIBSource* LoadDIBSource(CFX_DIBSource** ppMask = NULL, FX_DWORD* pMatteColor = NULL, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE) const;
+
+
+
+ void SetImage(const CFX_DIBitmap* pDIBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite = NULL, IFX_FileRead *pFileRead = NULL, const CFX_DIBitmap* pMask = NULL, const CPDF_ImageSetParam* pParam = NULL);
+
+ void SetJpegImage(FX_BYTE* pImageData, FX_DWORD size);
+
+ void SetJpegImage(IFX_FileRead *pFile);
+
+ void ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pDIBitmap);
+
+public:
+ FX_BOOL StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ FX_BOOL Continue(IFX_Pause* pPause);
+ CFX_DIBSource* DetachBitmap();
+ CFX_DIBSource* DetachMask();
+ CFX_DIBSource* m_pDIBSource;
+ CFX_DIBSource* m_pMask;
+ FX_DWORD m_MatteColor;
+private:
+
+ CPDF_Stream* m_pStream;
+ FX_BOOL m_bInline;
+ CPDF_Dictionary* m_pInlineDict;
+
+ FX_INT32 m_Height;
+
+ FX_INT32 m_Width;
+
+ FX_BOOL m_bIsMask;
+
+ FX_BOOL m_bInterpolate;
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_Dictionary* m_pOC;
+ CPDF_Dictionary* InitJPEG(FX_LPBYTE pData, FX_DWORD size);
+};
+#endif
diff --git a/core/include/fpdfapi/fpdf_serial.h b/core/include/fpdfapi/fpdf_serial.h
new file mode 100644
index 0000000000..9b1642e4a7
--- /dev/null
+++ b/core/include/fpdfapi/fpdf_serial.h
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_SERIAL_
+#define _FPDF_SERIAL_
+#ifndef _FPDF_PAGE_
+#include "fpdf_page.h"
+#endif
+#ifndef _FPDF_PAGEOBJ_H_
+#include "fpdf_pageobj.h"
+#endif
+class CPDF_ObjectStream;
+class CPDF_XRefStream;
+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj);
+class CPDF_ObjArchiveSaver : public CFX_ArchiveSaver
+{
+public:
+
+ friend CPDF_ObjArchiveSaver& operator << (CPDF_ObjArchiveSaver& ar, const CPDF_Object* pObj);
+protected:
+
+ CFX_MapPtrToPtr m_ObjectMap;
+};
+class CPDF_ObjArchiveLoader : public CFX_ArchiveLoader
+{
+public:
+
+ CPDF_ObjArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize) : CFX_ArchiveLoader(pData, dwSize),
+ m_IndirectObjects(NULL) {}
+
+ friend CPDF_ObjArchiveLoader& operator >> (CPDF_ObjArchiveLoader& ar, CPDF_Object*& pObj);
+protected:
+
+ CPDF_IndirectObjects m_IndirectObjects;
+};
+class CPDF_PageArchiveSaver : public CPDF_ObjArchiveSaver
+{
+public:
+
+ CPDF_PageArchiveSaver(CPDF_PageObjects* pPageObjs);
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_PageObject* pObj);
+
+
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ClipPath clip_path);
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GraphState graph_state);
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_TextState text_state);
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_ColorState color_state);
+
+ friend CPDF_PageArchiveSaver& operator << (CPDF_PageArchiveSaver& ar, CPDF_GeneralState general_state);
+
+protected:
+
+ CPDF_ClipPath m_LastClipPath;
+
+ CPDF_GraphState m_LastGraphState;
+
+ CPDF_ColorState m_LastColorState;
+
+ CPDF_TextState m_LastTextState;
+
+ CPDF_GeneralState m_LastGeneralState;
+
+ CPDF_PageObjects* m_pCurPage;
+};
+class CPDF_PageArchiveLoader : public CPDF_ObjArchiveLoader
+{
+public:
+
+ CPDF_PageArchiveLoader(CPDF_PageObjects* pPageObjs, FX_LPCBYTE pData, FX_DWORD dwSize);
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_PageObject*& pObj);
+
+
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ClipPath& clip_path);
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GraphState& graph_state);
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_TextState& text_state);
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_ColorState& color_state);
+
+ friend CPDF_PageArchiveLoader& operator >> (CPDF_PageArchiveLoader& ar, CPDF_GeneralState& general_state);
+
+protected:
+ void PostProcColor(CPDF_Color& color);
+
+ CPDF_Object* AddResource(CPDF_Object* pSrcObj, FX_LPCSTR type);
+
+ CPDF_ClipPath m_LastClipPath;
+
+ CPDF_GraphState m_LastGraphState;
+
+ CPDF_ColorState m_LastColorState;
+
+ CPDF_TextState m_LastTextState;
+
+ CPDF_GeneralState m_LastGeneralState;
+
+ CPDF_PageObjects* m_pCurPage;
+
+ CFX_MapPtrToPtr m_ObjectMap;
+};
+#define FPDFCREATE_INCREMENTAL 1
+#define FPDFCREATE_NO_ORIGINAL 2
+#define FPDFCREATE_PROGRESSIVE 4
+#define FPDFCREATE_OBJECTSTREAM 8
+class CPDF_Creator : public CFX_Object
+{
+public:
+
+ CPDF_Creator(CPDF_Document* pDoc);
+
+ ~CPDF_Creator();
+
+ FX_BOOL Create(FX_LPCWSTR filename, FX_DWORD flags = 0);
+
+ FX_BOOL Create(FX_LPCSTR filename, FX_DWORD flags = 0);
+
+ FX_BOOL Create(IFX_StreamWrite* pFile, FX_DWORD flags = 0);
+
+ FX_INT32 Continue(IFX_Pause *pPause = NULL);
+
+ FX_BOOL SetFileVersion(FX_INT32 fileVersion = 17);
+protected:
+
+ CPDF_Document* m_pDocument;
+
+ CPDF_Parser* m_pParser;
+
+ FX_BOOL m_bCompress;
+
+ FX_BOOL m_bSecurityChanged;
+
+ CPDF_Dictionary* m_pEncryptDict;
+ FX_DWORD m_dwEnryptObjNum;
+ FX_BOOL m_bEncryptCloned;
+
+ FX_BOOL m_bStandardSecurity;
+
+ CPDF_CryptoHandler* m_pCryptoHandler;
+ FX_BOOL m_bNewCrypto;
+
+ FX_BOOL m_bEncryptMetadata;
+
+ CPDF_Object* m_pMetadata;
+
+ CPDF_XRefStream* m_pXRefStream;
+
+ FX_INT32 m_ObjectStreamSize;
+
+ FX_DWORD m_dwLastObjNum;
+ FX_BOOL Create(FX_DWORD flags);
+ void ResetStandardSecurity();
+ void Clear();
+ FX_INT32 WriteDoc_Stage1(IFX_Pause *pPause);
+ FX_INT32 WriteDoc_Stage2(IFX_Pause *pPause);
+ FX_INT32 WriteDoc_Stage3(IFX_Pause *pPause);
+ FX_INT32 WriteDoc_Stage4(IFX_Pause *pPause);
+
+ CFX_FileBufferArchive m_File;
+
+ FX_FILESIZE m_Offset;
+ void InitOldObjNumOffsets();
+ void InitNewObjNumOffsets();
+ void AppendNewObjNum(FX_DWORD objbum);
+ FX_INT32 WriteOldIndirectObject(FX_DWORD objnum);
+ FX_INT32 WriteOldObjs(IFX_Pause *pPause);
+ FX_INT32 WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause);
+ FX_INT32 WriteIndirectObj(const CPDF_Object* pObj);
+ FX_INT32 WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt = TRUE);
+ FX_INT32 WriteIndirectObjectToStream(const CPDF_Object* pObj);
+ FX_INT32 WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj);
+ FX_INT32 WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);
+ FX_INT32 AppendObjectNumberToXRef(FX_DWORD objnum);
+ void InitID(FX_BOOL bDefault = TRUE);
+ FX_INT32 WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto);
+
+ FX_INT32 m_iStage;
+ FX_DWORD m_dwFlags;
+ FX_POSITION m_Pos;
+ FX_FILESIZE m_XrefStart;
+
+ CFX_FileSizeListArray m_ObjectOffset;
+
+ CFX_DWordListArray m_ObjectSize;
+ CFX_DWordArray m_NewObjNumArray;
+
+ CPDF_Array* m_pIDArray;
+
+ FX_INT32 m_FileVersion;
+ friend class CPDF_ObjectStream;
+ friend class CPDF_XRefStream;
+};
+#endif
diff --git a/core/include/fpdfapi/fpdfapi.h b/core/include/fpdfapi/fpdfapi.h
new file mode 100644
index 0000000000..e9fc528dc1
--- /dev/null
+++ b/core/include/fpdfapi/fpdfapi.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFAPI_H_
+#define _FPDFAPI_H_
+#include "../../include/fxcrt/fx_basic.h"
+#include "../../include/fxge/fx_ge.h"
+#include "fpdf_module.h"
+#include "fpdf_pageobj.h"
+#include "fpdf_render.h"
+#include "fpdf_serial.h"
+#endif
diff --git a/core/include/fpdfdoc/fpdf_ap.h b/core/include/fpdfdoc/fpdf_ap.h
new file mode 100644
index 0000000000..4b6a371110
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_ap.h
@@ -0,0 +1,92 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#define _FPDF_AP_H_
+#include "../fxcrt/fx_basic.h"
+#include "../fpdfapi/fpdf_parser.h"
+#include "fpdf_vt.h"
+class IPVT_FontMap
+{
+public:
+
+ virtual CPDF_Font* GetPDFFont(FX_INT32 nFontIndex) = 0;
+
+ virtual CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex) = 0;
+};
+struct CPVT_Dash {
+
+ CPVT_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)
+ {}
+
+ FX_INT32 nDash;
+
+ FX_INT32 nGap;
+
+ FX_INT32 nPhase;
+};
+#define CT_TRANSPARENT 0
+#define CT_GRAY 1
+#define CT_RGB 2
+#define CT_CMYK 3
+struct CPVT_Color {
+
+ CPVT_Color(FX_INT32 type = 0, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)
+ : nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)
+ {}
+
+ FX_INT32 nColorType;
+ FX_FLOAT fColor1;
+ FX_FLOAT fColor2;
+ FX_FLOAT fColor3;
+ FX_FLOAT fColor4;
+};
+class CPVT_Provider : public IPDF_VariableText_Provider
+{
+public:
+
+ CPVT_Provider(IPVT_FontMap * pFontMap);
+
+ virtual ~CPVT_Provider();
+
+ FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);
+
+ FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
+
+ FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
+
+ FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
+
+ FX_BOOL IsLatinWord(FX_WORD word);
+
+ FX_INT32 GetDefaultFontIndex();
+private:
+
+ IPVT_FontMap * m_pFontMap;
+};
+#define PBS_SOLID 0
+#define PBS_DASH 1
+#define PBS_BEVELED 2
+#define PBS_INSET 3
+#define PBS_UNDERLINED 4
+class CPVT_GenerateAP
+{
+public:
+
+ static FX_BOOL GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
+
+ static FX_BOOL GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
+
+ static FX_BOOL GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
+
+ static CFX_ByteString GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator * pIterator,
+ const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord = 0, const CPVT_WordRange * pVisible = NULL);
+
+ static CFX_ByteString GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,
+ FX_INT32 nStyle, const CPVT_Dash & dash);
+
+ static CFX_ByteString GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke);
+};
diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
new file mode 100644
index 0000000000..fc19441309
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -0,0 +1,1792 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_DOC_H_
+#define _FPDF_DOC_H_
+#ifndef _FPDF_PARSER_
+#include "../fpdfapi/fpdf_parser.h"
+#endif
+#ifndef _FPDF_RENDER_
+#include "../fpdfapi/fpdf_render.h"
+#endif
+class CPDF_Action;
+class CPDF_Annot;
+class CPDF_AnnotList;
+class CPDF_Bookmark;
+class CPDF_BookmarkTree;
+class CPDF_Dest;
+class CPDF_Link;
+class CPDF_LinkList;
+class CPDF_Metadata;
+class CPDF_NameTree;
+class CPDF_NumberTree;
+class CPDF_TextObject;
+class CPDF_ViewerPreferences;
+class CPDF_Page;
+class CPDF_RenderOptions;
+class CXML_Element;
+class CPDF_OCContext;
+class CPDF_DocJSActions;
+class CPDF_ActionFields;
+class CPDF_AAction;
+class CPDF_FileSpec;
+class CPDF_IconFit;
+class CPDF_DefaultAppearance;
+class CPDF_InterForm;
+class CPDF_FormField;
+class CPDF_FormNotify;
+class CPDF_FormControl;
+class CPDF_LWinParam;
+class CFieldTree;
+class CPDF_ApSettings;
+class CPDF_NameTree : public CFX_Object
+{
+public:
+
+ CPDF_NameTree(CPDF_Dictionary* pRoot)
+ {
+ m_pRoot = pRoot;
+ }
+
+ CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category);
+
+ CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const;
+
+ CPDF_Object* LookupValue(const CFX_ByteString& csName) const;
+
+ CPDF_Array* LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName);
+
+ int GetIndex(const CFX_ByteString& csName) const;
+
+ int GetCount() const;
+
+
+ CPDF_Dictionary* GetRoot() const
+ {
+ return m_pRoot;
+ }
+
+protected:
+
+ CPDF_Dictionary* m_pRoot;
+};
+class CPDF_BookmarkTree : public CFX_Object
+{
+public:
+
+ CPDF_BookmarkTree(CPDF_Document* pDoc)
+ {
+ m_pDocument = pDoc;
+ }
+public:
+
+
+
+ CPDF_Bookmark GetFirstChild(CPDF_Bookmark parent);
+
+ CPDF_Bookmark GetNextSibling(CPDF_Bookmark bookmark);
+
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+protected:
+
+ CPDF_Document* m_pDocument;
+};
+#define PDFBOOKMARK_ITALIC 1
+#define PDFBOOKMARK_BOLD 2
+class CPDF_Bookmark : public CFX_Object
+{
+public:
+
+ CPDF_Bookmark(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary*() const
+ {
+ return m_pDict;
+ }
+
+
+
+ FX_DWORD GetColorRef();
+
+ FX_DWORD GetFontStyle();
+
+ CFX_WideString GetTitle();
+
+
+
+
+ CPDF_Dest GetDest(CPDF_Document* pDocument);
+
+ CPDF_Action GetAction();
+
+
+ CPDF_Dictionary* m_pDict;
+};
+#define PDFZOOM_XYZ 1
+#define PDFZOOM_FITPAGE 2
+#define PDFZOOM_FITHORZ 3
+#define PDFZOOM_FITVERT 4
+#define PDFZOOM_FITRECT 5
+#define PDFZOOM_FITBBOX 6
+#define PDFZOOM_FITBHORZ 7
+
+#define PDFZOOM_FITBVERT 8
+class CPDF_Dest : public CFX_Object
+{
+public:
+
+ CPDF_Dest(CPDF_Object* pObj = NULL)
+ {
+ m_pObj = pObj;
+ }
+
+ operator CPDF_Object* () const
+ {
+ return m_pObj;
+ }
+
+ CFX_ByteString GetRemoteName();
+
+ int GetPageIndex(CPDF_Document* pDoc);
+
+ FX_DWORD GetPageObjNum();
+
+ int GetZoomMode();
+
+ FX_FLOAT GetParam(int index);
+
+
+ CPDF_Object* m_pObj;
+};
+class CPDF_OCContext : public CFX_Object, public IPDF_OCContext
+{
+public:
+
+ enum UsageType {
+ View = 0,
+ Design,
+ Print,
+ Export
+ };
+
+ CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType = View);
+
+ virtual ~CPDF_OCContext();
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+
+ UsageType GetUsageType() const
+ {
+ return m_eUsageType;
+ }
+
+ FX_BOOL CheckOCGVisible(const CPDF_Dictionary *pOCGDict);
+
+ void ResetOCContext();
+protected:
+
+ FX_BOOL LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const;
+
+ FX_BOOL LoadOCGState(const CPDF_Dictionary *pOCGDict) const;
+
+ FX_BOOL GetOCGVisible(const CPDF_Dictionary *pOCGDict);
+
+ FX_BOOL GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel = 0);
+
+ FX_BOOL LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig);
+
+ CPDF_Document *m_pDocument;
+
+ UsageType m_eUsageType;
+
+ CFX_MapPtrTemplate<const CPDF_Dictionary*, void*> m_OCGStates;
+};
+class CPDF_LWinParam : public CFX_Object
+{
+public:
+
+ CPDF_LWinParam(CPDF_Dictionary* pDict)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary* () const
+ {
+ return m_pDict;
+ }
+
+ inline CFX_ByteString GetFileName()
+ {
+ return m_pDict->GetString("F");
+ }
+
+
+ inline CFX_ByteString GetDefaultDirectory()
+ {
+ return m_pDict->GetString("D");
+ }
+
+
+ inline CFX_ByteString GetOperation()
+ {
+ return m_pDict->GetString("O");
+ }
+
+
+ inline CFX_ByteString GetParameter()
+ {
+ return m_pDict->GetString("P");
+ }
+
+ CPDF_Dictionary* m_pDict;
+};
+class CPDF_ActionFields : public CFX_Object
+{
+public:
+
+ CPDF_ActionFields(const CPDF_Action* pAction)
+ {
+ m_pAction = (CPDF_Action*)pAction;
+ }
+
+ operator CPDF_Action*() const
+ {
+ return m_pAction;
+ }
+
+ FX_DWORD GetFieldsCount() const;
+
+ void GetAllFields(CFX_PtrArray& fieldObjects) const;
+
+ CPDF_Object* GetField(FX_DWORD iIndex) const;
+
+ CPDF_Action* m_pAction;
+};
+
+#define PDFNAMED_NEXTPAGE 1
+#define PDFNAMED_PREVPAGE 2
+#define PDFNAMED_FIRSTPAGE 3
+#define PDFNAMED_LASTPAGE 4
+#define PDFJS_MAXLENGTH 64
+class CPDF_Action : public CFX_Object
+{
+public:
+
+ CPDF_Action(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary* () const
+ {
+ return m_pDict;
+ }
+
+ enum ActionType {
+ Unknown = 0,
+ GoTo,
+ GoToR,
+ GoToE,
+ Launch,
+ Thread,
+ URI,
+ Sound,
+ Movie,
+ Hide,
+ Named,
+ SubmitForm,
+ ResetForm,
+ ImportData,
+ JavaScript,
+ SetOCGState,
+ Rendition,
+ Trans,
+ GoTo3DView
+ };
+
+ CFX_ByteString GetTypeName() const
+ {
+ return m_pDict->GetString("S");
+ }
+
+ ActionType GetType() const;
+
+
+
+ CPDF_Dest GetDest(CPDF_Document* pDoc) const;
+
+
+
+
+
+ CFX_WideString GetFilePath() const;
+
+
+
+
+ FX_BOOL GetNewWindow() const
+ {
+ return m_pDict->GetBoolean("NewWindow");
+ }
+
+
+
+
+ CPDF_LWinParam GetWinParam() const;
+
+
+
+
+ CFX_ByteString GetURI(CPDF_Document* pDoc) const;
+
+
+
+
+ FX_BOOL GetMouseMap() const
+ {
+ return m_pDict->GetBoolean("IsMap");
+ }
+
+
+
+
+ CPDF_ActionFields GetWidgets() const
+ {
+ return this;
+ }
+
+
+
+
+ FX_BOOL GetHideStatus() const
+ {
+ return m_pDict->GetBoolean("H", TRUE);
+ }
+
+
+
+
+ CFX_ByteString GetNamedAction() const
+ {
+ return m_pDict->GetString("N");
+ }
+
+
+
+
+ FX_DWORD GetFlags() const
+ {
+ return m_pDict->GetInteger("Flags");
+ }
+
+
+
+
+ CFX_WideString GetJavaScript() const;
+
+
+
+
+ CPDF_Dictionary* GetAnnot() const;
+
+
+
+
+ FX_INT32 GetOperationType() const;
+
+
+
+
+ CPDF_Stream* GetSoundStream() const
+ {
+ return m_pDict->GetStream("Sound");
+ }
+
+ FX_FLOAT GetVolume() const
+ {
+ return m_pDict->GetNumber("Volume");
+ }
+
+ FX_BOOL IsSynchronous() const
+ {
+ return m_pDict->GetBoolean("Synchronous");
+ }
+
+ FX_BOOL IsRepeat() const
+ {
+ return m_pDict->GetBoolean("Repeat");
+ }
+
+ FX_BOOL IsMixPlay() const
+ {
+ return m_pDict->GetBoolean("Mix");
+ }
+
+
+
+
+ FX_DWORD GetSubActionsCount() const;
+
+ CPDF_Action GetSubAction(FX_DWORD iIndex) const;
+
+
+ CPDF_Dictionary* m_pDict;
+};
+class CPDF_AAction : public CFX_Object
+{
+public:
+
+ CPDF_AAction(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary*() const
+ {
+ return m_pDict;
+ }
+
+ enum AActionType {
+ CursorEnter = 0,
+ CursorExit,
+ ButtonDown,
+ ButtonUp,
+ GetFocus,
+ LoseFocus,
+ PageOpen,
+ PageClose,
+ PageVisible,
+ PageInvisible,
+ OpenPage,
+ ClosePage,
+ KeyStroke,
+ Format,
+ Validate,
+ Calculate,
+ CloseDocument,
+ SaveDocument,
+ DocumentSaved,
+ PrintDocument,
+ DocumentPrinted
+ };
+
+ FX_BOOL ActionExist(AActionType eType) const;
+
+ CPDF_Action GetAction(AActionType eType) const;
+
+ FX_POSITION GetStartPos() const;
+
+ CPDF_Action GetNextAction(FX_POSITION& pos, AActionType& eType) const;
+
+ CPDF_Dictionary* m_pDict;
+};
+class CPDF_DocJSActions : public CFX_Object
+{
+public:
+ CPDF_DocJSActions(CPDF_Document* pDoc);
+
+
+ int CountJSActions() const;
+
+ CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const;
+
+ CPDF_Action GetJSAction(const CFX_ByteString& csName) const;
+
+ int FindJSAction(const CFX_ByteString& csName) const;
+
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+
+protected:
+
+ CPDF_Document* m_pDocument;
+};
+class CPDF_FileSpec : public CFX_Object
+{
+public:
+
+ CPDF_FileSpec();
+
+ CPDF_FileSpec(CPDF_Object *pObj)
+ {
+ m_pObj = pObj;
+ }
+
+ operator CPDF_Object*() const
+ {
+ return m_pObj;
+ }
+
+ FX_BOOL IsURL() const;
+
+ FX_BOOL GetFileName(CFX_WideString &wsFileName) const;
+
+ CPDF_Stream* GetFileStream() const;
+
+ void SetFileName(FX_WSTR wsFileName, FX_BOOL bURL = FALSE);
+protected:
+
+ CPDF_Object *m_pObj;
+};
+class CPDF_LinkList : public CFX_Object
+{
+public:
+
+ CPDF_LinkList(CPDF_Document* pDoc)
+ {
+ m_pDocument = pDoc;
+ }
+
+ ~CPDF_LinkList();
+
+ CPDF_Link GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y);
+
+ int CountLinks(CPDF_Page* pPage);
+
+ CPDF_Link GetLink(CPDF_Page* pPage, int index);
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+protected:
+
+ CPDF_Document* m_pDocument;
+
+ CFX_MapPtrToPtr m_PageMap;
+
+ CFX_PtrArray* GetPageLinks(CPDF_Page* pPage);
+
+ void LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList);
+};
+class CPDF_Link : public CFX_Object
+{
+public:
+
+ CPDF_Link(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary*() const
+ {
+ return m_pDict;
+ }
+
+ CFX_FloatRect GetRect();
+
+
+
+ CPDF_Dest GetDest(CPDF_Document* pDoc);
+
+ CPDF_Action GetAction();
+
+
+ CPDF_Dictionary* m_pDict;
+};
+#define ANNOTFLAG_INVISIBLE 1
+#define ANNOTFLAG_HIDDEN 2
+#define ANNOTFLAG_PRINT 4
+#define ANNOTFLAG_NOZOOM 8
+#define ANNOTFLAG_NOROTATE 0x10
+#define ANNOTFLAG_NOVIEW 0x20
+#define ANNOTFLAG_READONLY 0x40
+#define ANNOTFLAG_LOCKED 0x80
+#define ANNOTFLAG_TOGGLENOVIEW 0x100
+class CPDF_Annot : public CFX_PrivateData, public CFX_Object
+{
+public:
+
+ CPDF_Annot(CPDF_Dictionary* pDict);
+
+ ~CPDF_Annot();
+
+ CPDF_Dictionary* m_pAnnotDict;
+
+ CFX_ByteString GetSubType() const;
+
+ FX_DWORD GetFlags() const
+ {
+ return m_pAnnotDict->GetInteger("F");
+ }
+
+ void GetRect(CFX_FloatRect& rect) const;
+
+ enum AppearanceMode {
+ Normal,
+ Rollover,
+ Down
+ };
+
+ FX_BOOL DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
+ AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+
+ FX_BOOL DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext,
+ const CFX_AffineMatrix* pUser2Device, AppearanceMode mode);
+
+ void ClearCachedAP();
+
+
+ void DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
+ const CPDF_RenderOptions* pOptions);
+
+ CPDF_PageObject* GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions);
+
+
+
+ int CountIRTNotes();
+
+ CPDF_Annot* GetIRTNote(int index);
+
+
+ CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
+private:
+
+ CFX_MapPtrToPtr m_APMap;
+protected:
+ friend class CPDF_AnnotList;
+
+ CPDF_AnnotList* m_pList;
+
+ CPDF_Reference* NewAnnotRef();
+};
+class CPDF_AnnotList : public CFX_Object
+{
+public:
+
+ CPDF_AnnotList(CPDF_Page* pPage);
+
+ ~CPDF_AnnotList();
+
+ void GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CFX_Matrix &matrix) const;
+
+ void GetAnnotRect(const CPDF_Dictionary* pAnnotDict, const CFX_Matrix* pUser2Device, CPDF_Rect &rtAnnot) const;
+
+ void DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
+ CPDF_RenderOptions* pOptions);
+
+ void DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,
+ FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
+ CPDF_RenderOptions* pOptions)
+ {
+ DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, NULL);
+ }
+
+ void DisplayAnnots(const CPDF_Page* pPage, CPDF_RenderContext* pContext,
+ FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_BOOL bShowWidget,
+ CPDF_RenderOptions* pOptions, FX_RECT *pClipRect)
+ {
+ DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix, bShowWidget ? 3 : 1, pOptions, pClipRect);
+ }
+
+ void DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,
+ FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix, FX_DWORD dwAnnotFlags,
+ CPDF_RenderOptions* pOptions, FX_RECT* pClipRect);
+
+
+
+ CPDF_Annot* GetAt(int index)
+ {
+ return (CPDF_Annot*)m_AnnotList.GetAt(index);
+ }
+
+ int Count()
+ {
+ return m_AnnotList.GetSize();
+ }
+
+ int GetIndex(CPDF_Annot* pAnnot);
+
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+protected:
+
+ CFX_PtrArray m_AnnotList;
+
+ CPDF_Dictionary* m_pPageDict;
+
+ CPDF_Document* m_pDocument;
+
+ CFX_PtrArray m_Borders;
+
+ void DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
+ FX_BOOL bWidget, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect);
+ friend class CPDF_Annot;
+};
+#define COLORTYPE_TRANSPARENT 0
+#define COLORTYPE_GRAY 1
+#define COLORTYPE_RGB 2
+#define COLORTYPE_CMYK 3
+class CPDF_DefaultAppearance : public CFX_Object
+{
+public:
+
+ CPDF_DefaultAppearance(const CFX_ByteString& csDA = "")
+ {
+ m_csDA = csDA;
+ }
+
+ CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA)
+ {
+ m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
+ }
+
+
+ operator CFX_ByteString() const
+ {
+ return m_csDA;
+ }
+
+ const CPDF_DefaultAppearance& operator =(const CFX_ByteString& csDA)
+ {
+ m_csDA = csDA;
+ return *this;
+ }
+
+ const CPDF_DefaultAppearance& operator =(const CPDF_DefaultAppearance& cDA)
+ {
+ m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
+ return *this;
+ }
+
+
+
+ FX_BOOL HasFont();
+
+ CFX_ByteString GetFontString();
+
+ void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
+
+
+
+
+ FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE);
+
+ CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE);
+
+ void GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation = FALSE);
+
+ void GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation = FALSE);
+
+
+
+
+ FX_BOOL HasTextMatrix();
+
+ CFX_ByteString GetTextMatrixString();
+
+ CFX_AffineMatrix GetTextMatrix();
+
+protected:
+
+ CFX_ByteString m_csDA;
+};
+#define FIELDTYPE_UNKNOWN 0
+#define FIELDTYPE_PUSHBUTTON 1
+#define FIELDTYPE_CHECKBOX 2
+#define FIELDTYPE_RADIOBUTTON 3
+#define FIELDTYPE_COMBOBOX 4
+#define FIELDTYPE_LISTBOX 5
+#define FIELDTYPE_TEXTFIELD 6
+#define FIELDTYPE_SIGNATURE 7
+class CPDF_InterForm : public CFX_PrivateData, public CFX_Object
+{
+public:
+
+ CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
+
+ ~CPDF_InterForm();
+
+
+
+ static void EnableUpdateAP(FX_BOOL bUpdateAP);
+
+ static FX_BOOL UpdatingAPEnabled();
+
+
+ static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen = 2, FX_LPCSTR csPrefix = "");
+
+
+
+ static CPDF_Font* AddSystemDefaultFont(const CPDF_Document* pDocument);
+
+ static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet = 1);
+
+ static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet = 1);
+
+ static CPDF_Font* AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName);
+
+ static CFX_ByteString GetNativeFont(FX_BYTE iCharSet, FX_LPVOID pLogFont = NULL);
+
+ static CFX_ByteString GetNativeFont(FX_LPVOID pLogFont = NULL);
+
+ static FX_BYTE GetNativeCharSet();
+
+ static CPDF_Font* AddNativeFont(FX_BYTE iCharSet, const CPDF_Document* pDocument);
+
+ static CPDF_Font* AddNativeFont(const CPDF_Document* pDocument);
+
+
+
+
+ FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
+
+ FX_BOOL ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName);
+
+ FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName);
+
+
+
+
+ FX_DWORD CountFields(const CFX_WideString &csFieldName = L"");
+
+ CPDF_FormField* GetField(FX_DWORD index, const CFX_WideString &csFieldName = L"");
+
+ void GetAllFieldNames(CFX_WideStringArray& allFieldNames);
+
+ FX_BOOL IsValidFormField(const void* pField);
+
+ CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
+
+
+
+
+ FX_DWORD CountControls(CFX_WideString csFieldName = L"");
+
+ CPDF_FormControl* GetControl(FX_DWORD index, CFX_WideString csFieldName = L"");
+
+ FX_BOOL IsValidFormControl(const void* pControl);
+
+ int CountPageControls(CPDF_Page* pPage) const;
+
+ CPDF_FormControl* GetPageControl(CPDF_Page* pPage, int index) const;
+
+
+ CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const;
+
+ CPDF_FormControl* GetControlByDict(CPDF_Dictionary* pWidgetDict) const;
+
+
+
+
+ FX_DWORD CountInternalFields(const CFX_WideString& csFieldName = L"") const;
+
+ CPDF_Dictionary* GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName = L"") const;
+
+
+
+
+
+ CPDF_Document* GetDocument() const
+ {
+ return m_pDocument;
+ }
+
+ CPDF_Dictionary* GetFormDict() const
+ {
+ return m_pFormDict;
+ }
+
+
+
+
+ FX_BOOL NeedConstructAP();
+
+ void NeedConstructAP(FX_BOOL bNeedAP);
+
+
+
+
+ int CountFieldsInCalculationOrder();
+
+ CPDF_FormField* GetFieldInCalculationOrder(int index);
+
+ int FindFieldInCalculationOrder(const CPDF_FormField* pField);
+
+
+
+
+ FX_DWORD CountFormFonts();
+
+ CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
+
+ CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
+
+ CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
+
+ CPDF_Font* GetNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);
+
+ CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
+
+ FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+
+ FX_BOOL FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
+
+ inline FX_BOOL FindFormFont(CFX_WideString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
+ {
+ return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
+ }
+
+
+
+
+
+ void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+
+ CPDF_Font* AddNativeFormFont(FX_BYTE iCharSet, CFX_ByteString& csNameTag);
+
+ CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
+
+ void RemoveFormFont(const CPDF_Font* pFont);
+
+ void RemoveFormFont(CFX_ByteString csNameTag);
+
+
+
+
+ CPDF_DefaultAppearance GetDefaultAppearance();
+
+ CPDF_Font* GetDefaultFormFont();
+
+
+
+ int GetFormAlignment();
+
+
+
+
+ CPDF_FormField* CheckRequiredFields(const CFX_PtrArray *fields = NULL, FX_BOOL bIncludeOrExclude = TRUE) const;
+
+ CFDF_Document* ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec = FALSE) const;
+
+ CFDF_Document* ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bSimpleFileSpec = FALSE) const;
+
+ FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
+
+
+
+
+ FX_BOOL ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude = TRUE, FX_BOOL bNotify = FALSE);
+
+ FX_BOOL ResetForm(FX_BOOL bNotify = FALSE);
+
+ void ReloadForm();
+
+ CPDF_FormNotify* GetFormNotify() const
+ {
+ return m_pFormNotify;
+ }
+
+ void SetFormNotify(const CPDF_FormNotify* pNotify);
+
+
+ int GetPageWithWidget(int iCurPage, FX_BOOL bNext);
+
+
+
+ FX_BOOL IsUpdated()
+ {
+ return m_bUpdated;
+ }
+
+ void ClearUpdatedFlag()
+ {
+ m_bUpdated = FALSE;
+ }
+
+
+ FX_BOOL HasXFAForm() const;
+
+ void FixPageFields(const CPDF_Page* pPage);
+protected:
+
+ static FX_BOOL m_bUpdateAP;
+
+ void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+
+ CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
+
+ CPDF_FormField* AddTerminalField(const CPDF_Dictionary* pFieldDict);
+
+ CPDF_FormControl* AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict);
+
+ void FDF_ImportField(CPDF_Dictionary* pField, const CFX_WideString& parent_name, FX_BOOL bNotify = FALSE, int nLevel = 0);
+
+ FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl);
+
+ int CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2);
+
+ int CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2);
+
+ CPDF_Document* m_pDocument;
+
+ FX_BOOL m_bGenerateAP;
+
+ CPDF_Dictionary* m_pFormDict;
+
+ CFX_MapPtrToPtr m_ControlMap;
+
+ CFieldTree *m_pFieldTree;
+
+ CFX_ByteString m_bsEncoding;
+
+ CPDF_FormNotify* m_pFormNotify;
+
+ FX_BOOL m_bUpdated;
+ friend class CPDF_FormControl;
+ friend class CPDF_FormField;
+};
+#define FORMFIELD_READONLY 0x01
+#define FORMFIELD_REQUIRED 0x02
+#define FORMFIELD_NOEXPORT 0x04
+#define FORMRADIO_NOTOGGLEOFF 0x100
+#define FORMRADIO_UNISON 0x200
+#define FORMTEXT_MULTILINE 0x100
+#define FORMTEXT_PASSWORD 0x200
+#define FORMTEXT_NOSCROLL 0x400
+#define FORMTEXT_COMB 0x800
+#define FORMCOMBO_EDIT 0x100
+#define FORMLIST_MULTISELECT 0x100
+class CPDF_FormField : public CFX_Object
+{
+public:
+
+ enum Type {
+ Unknown,
+ PushButton,
+ RadioButton,
+ CheckBox,
+ Text,
+ RichText,
+ File,
+ ListBox,
+ ComboBox,
+ Sign
+ };
+
+ CFX_WideString GetFullName();
+
+ Type GetType()
+ {
+ return m_Type;
+ }
+
+ FX_DWORD GetFlags()
+ {
+ return m_Flags;
+ }
+
+ CPDF_InterForm* GetInterForm() const
+ {
+ return m_pForm;
+ }
+
+ CPDF_Dictionary* GetFieldDict() const
+ {
+ return m_pDict;
+ }
+
+ void SetFieldDict(CPDF_Dictionary* pDict)
+ {
+ m_pDict = pDict;
+ }
+
+ FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
+
+
+
+ int CountControls()
+ {
+ return m_ControlList.GetSize();
+ }
+
+ CPDF_FormControl* GetControl(int index)
+ {
+ return (CPDF_FormControl*)m_ControlList.GetAt(index);
+ }
+
+ int GetControlIndex(const CPDF_FormControl* pControl);
+
+
+
+
+ int GetFieldType();
+
+
+
+
+ CPDF_AAction GetAdditionalAction();
+
+
+
+
+ CFX_WideString GetAlternateName();
+
+
+
+
+ CFX_WideString GetMappingName();
+
+
+
+
+ FX_DWORD GetFieldFlags();
+
+
+
+
+ CFX_ByteString GetDefaultStyle();
+
+
+
+
+ CFX_WideString GetRichTextString();
+
+
+
+ CFX_WideString GetValue();
+
+ CFX_WideString GetDefaultValue();
+
+ FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
+
+
+
+
+
+ int GetMaxLen();
+
+
+
+
+ int CountSelectedItems();
+
+ int GetSelectedIndex(int index);
+
+ FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE);
+
+ FX_BOOL IsItemSelected(int index);
+
+ FX_BOOL SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);
+
+ FX_BOOL IsItemDefaultSelected(int index);
+
+ int GetDefaultSelectedItem();
+
+
+
+
+ int CountOptions();
+
+ CFX_WideString GetOptionLabel(int index);
+
+ CFX_WideString GetOptionValue(int index);
+
+ int FindOption(CFX_WideString csOptLabel);
+
+ int FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex = 0);
+
+
+
+
+ FX_BOOL CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify = FALSE);
+
+
+
+
+ int GetTopVisibleIndex();
+
+
+
+
+ int CountSelectedOptions();
+
+ int GetSelectedOptionIndex(int index);
+
+ FX_BOOL IsOptionSelected(int iOptIndex);
+
+ FX_BOOL SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify = FALSE);
+
+ FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE);
+
+
+
+
+ FX_FLOAT GetFontSize()
+ {
+ return m_FontSize;
+ }
+
+ CPDF_Font* GetFont()
+ {
+ return m_pFont;
+ }
+
+protected:
+
+ CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
+
+ ~CPDF_FormField();
+
+ CPDF_FormField::Type m_Type;
+
+ FX_DWORD m_Flags;
+
+ CPDF_InterForm* m_pForm;
+
+ CPDF_Dictionary* m_pDict;
+
+ CFX_PtrArray m_ControlList;
+ friend class CPDF_InterForm;
+ friend class CPDF_FormControl;
+
+
+
+ CFX_WideString GetValue(FX_BOOL bDefault);
+
+ FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
+
+
+ void SyncFieldFlags();
+
+ int FindListSel(CPDF_String* str);
+
+ CFX_WideString GetOptionText(int index, int sub_index);
+
+ void LoadDA();
+
+ void UpdateAP(CPDF_FormControl* pControl);
+
+
+
+ CFX_WideString GetCheckValue(FX_BOOL bDefault);
+
+ FX_BOOL SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify);
+
+
+ FX_FLOAT m_FontSize;
+
+ CPDF_Font* m_pFont;
+};
+CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel = 0);
+class CPDF_IconFit : public CFX_Object
+{
+public:
+
+ CPDF_IconFit(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary*() const
+ {
+ return m_pDict;
+ }
+
+
+
+
+ enum ScaleMethod {
+ Always = 0,
+ Bigger,
+ Smaller,
+ Never
+ };
+
+ ScaleMethod GetScaleMethod();
+
+
+
+
+ FX_BOOL IsProportionalScale();
+
+
+
+
+ void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
+
+
+
+
+ FX_BOOL GetFittingBounds();
+
+
+ CPDF_Dictionary* m_pDict;
+};
+
+#define TEXTPOS_CAPTION 0
+#define TEXTPOS_ICON 1
+#define TEXTPOS_BELOW 2
+#define TEXTPOS_ABOVE 3
+#define TEXTPOS_RIGHT 4
+#define TEXTPOS_LEFT 5
+#define TEXTPOS_OVERLAID 6
+class CPDF_FormControl : public CFX_Object
+{
+public:
+
+ CPDF_FormField::Type GetType()
+ {
+ return m_pField->GetType();
+ }
+
+ CPDF_InterForm* GetInterForm() const
+ {
+ return m_pForm;
+ }
+
+ CPDF_FormField* GetField() const
+ {
+ return m_pField;
+ }
+
+ CPDF_Dictionary* GetWidget() const
+ {
+ return m_pWidgetDict;
+ }
+
+ CFX_FloatRect GetRect();
+
+ void DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix,
+ CPDF_Page* pPage, CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions = NULL);
+
+
+
+ CFX_ByteString GetCheckedAPState();
+
+ CFX_WideString GetExportValue();
+
+ FX_BOOL IsChecked();
+
+ FX_BOOL IsDefaultChecked();
+
+
+
+
+ enum HighlightingMode {
+ None = 0,
+ Invert,
+ Outline,
+ Push,
+ Toggle
+ };
+
+ HighlightingMode GetHighlightingMode();
+
+
+
+
+ FX_BOOL HasMKEntry(CFX_ByteString csEntry);
+
+
+
+
+ int GetRotation();
+
+
+
+
+ inline FX_ARGB GetBorderColor(int& iColorType)
+ {
+ return GetColor(iColorType, "BC");
+ }
+
+ inline FX_FLOAT GetOriginalBorderColor(int index)
+ {
+ return GetOriginalColor(index, "BC");
+ }
+
+ inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
+ {
+ GetOriginalColor(iColorType, fc, "BC");
+ }
+
+
+
+
+ inline FX_ARGB GetBackgroundColor(int& iColorType)
+ {
+ return GetColor(iColorType, "BG");
+ }
+
+ inline FX_FLOAT GetOriginalBackgroundColor(int index)
+ {
+ return GetOriginalColor(index, "BG");
+ }
+
+ inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
+ {
+ GetOriginalColor(iColorType, fc, "BG");
+ }
+
+
+
+
+ inline CFX_WideString GetNormalCaption()
+ {
+ return GetCaption("CA");
+ }
+
+
+
+
+ inline CFX_WideString GetRolloverCaption()
+ {
+ return GetCaption("RC");
+ }
+
+
+
+
+ inline CFX_WideString GetDownCaption()
+ {
+ return GetCaption("AC");
+ }
+
+
+
+
+ inline CPDF_Stream* GetNormalIcon()
+ {
+ return GetIcon("I");
+ }
+
+
+
+
+ inline CPDF_Stream* GetRolloverIcon()
+ {
+ return GetIcon("RI");
+ }
+
+
+
+
+ inline CPDF_Stream* GetDownIcon()
+ {
+ return GetIcon("IX");
+ }
+
+
+
+
+ CPDF_IconFit GetIconFit();
+
+
+
+
+ int GetTextPosition();
+
+
+
+
+ CPDF_Action GetAction();
+
+
+
+
+ CPDF_AAction GetAdditionalAction();
+
+
+
+
+ CPDF_DefaultAppearance GetDefaultAppearance();
+
+ CPDF_Font* GetDefaultControlFont();
+
+
+
+
+ int GetControlAlignment();
+
+protected:
+
+ CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
+
+ CFX_ByteString GetOnStateName();
+
+ void SetOnStateName(const CFX_ByteString& csOn);
+
+ void CheckControl(FX_BOOL bChecked);
+
+ FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry);
+
+ FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry);
+
+ void GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry);
+
+ CFX_WideString GetCaption(CFX_ByteString csEntry);
+
+ CPDF_Stream* GetIcon(CFX_ByteString csEntry);
+
+ CPDF_ApSettings GetMK(FX_BOOL bCreate);
+
+ CPDF_InterForm* m_pForm;
+
+ CPDF_FormField* m_pField;
+
+ CPDF_Dictionary* m_pWidgetDict;
+ friend class CPDF_InterForm;
+ friend class CPDF_FormField;
+};
+class CPDF_FormNotify : public CFX_Object
+{
+public:
+
+ virtual ~CPDF_FormNotify() {}
+
+ virtual int BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+ {
+ return 0;
+ }
+
+ virtual int AfterValueChange(const CPDF_FormField* pField)
+ {
+ return 0;
+ }
+
+ virtual int BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+ {
+ return 0;
+ }
+
+ virtual int AfterSelectionChange(const CPDF_FormField* pField)
+ {
+ return 0;
+ }
+
+ virtual int AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
+ {
+ return 0;
+ }
+
+ virtual int BeforeFormReset(const CPDF_InterForm* pForm)
+ {
+ return 0;
+ }
+
+ virtual int AfterFormReset(const CPDF_InterForm* pForm)
+ {
+ return 0;
+ }
+
+ virtual int BeforeFormImportData(const CPDF_InterForm* pForm)
+ {
+ return 0;
+ }
+
+ virtual int AfterFormImportData(const CPDF_InterForm* pForm)
+ {
+ return 0;
+ }
+};
+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
+class CPDF_PageLabel : public CFX_Object
+{
+public:
+
+ CPDF_PageLabel(CPDF_Document* pDocument)
+ {
+ m_pDocument = pDocument;
+ }
+
+
+ CFX_WideString GetLabel(int nPage) const;
+
+ FX_INT32 GetPageByLabel(FX_BSTR bsLabel) const;
+
+
+ FX_INT32 GetPageByLabel(FX_WSTR wsLabel) const;
+
+protected:
+ CPDF_Document* m_pDocument;
+};
+class CPDF_Metadata
+{
+public:
+
+ CPDF_Metadata();
+
+
+ ~CPDF_Metadata();
+
+ void LoadDoc(CPDF_Document *pDoc);
+
+
+ FX_INT32 GetString(FX_BSTR bsItem, CFX_WideString &wsStr);
+
+ CXML_Element* GetRoot() const;
+
+ CXML_Element* GetRDF() const;
+
+protected:
+ FX_LPVOID m_pData;
+};
+class CPDF_ViewerPreferences
+{
+public:
+
+ CPDF_ViewerPreferences(CPDF_Document *pDoc);
+
+
+ ~CPDF_ViewerPreferences();
+
+
+ FX_BOOL IsDirectionR2L() const;
+
+ FX_BOOL PrintScaling() const;
+
+
+protected:
+ CPDF_Document* m_pDoc;
+};
+class CPDF_ApSettings : public CFX_Object
+{
+public:
+
+ CPDF_ApSettings(CPDF_Dictionary* pDict = NULL)
+ {
+ m_pDict = pDict;
+ }
+
+ operator CPDF_Dictionary* () const
+ {
+ return m_pDict;
+ }
+
+ FX_BOOL HasMKEntry(FX_BSTR csEntry);
+
+
+
+ int GetRotation();
+
+
+
+
+ inline FX_ARGB GetBorderColor(int& iColorType)
+ {
+ return GetColor(iColorType, FX_BSTRC("BC"));
+ }
+
+ inline FX_FLOAT GetOriginalBorderColor(int index)
+ {
+ return GetOriginalColor(index, FX_BSTRC("BC"));
+ }
+
+ inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4])
+ {
+ GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
+ }
+
+
+
+
+ inline FX_ARGB GetBackgroundColor(int& iColorType)
+ {
+ return GetColor(iColorType, FX_BSTRC("BG"));
+ }
+
+ inline FX_FLOAT GetOriginalBackgroundColor(int index)
+ {
+ return GetOriginalColor(index, FX_BSTRC("BG"));
+ }
+
+ inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4])
+ {
+ GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
+ }
+
+
+
+
+ inline CFX_WideString GetNormalCaption()
+ {
+ return GetCaption(FX_BSTRC("CA"));
+ }
+
+
+
+
+ inline CFX_WideString GetRolloverCaption()
+ {
+ return GetCaption(FX_BSTRC("RC"));
+ }
+
+
+
+
+ inline CFX_WideString GetDownCaption()
+ {
+ return GetCaption(FX_BSTRC("AC"));
+ }
+
+
+
+
+ inline CPDF_Stream* GetNormalIcon()
+ {
+ return GetIcon(FX_BSTRC("I"));
+ }
+
+
+
+
+ inline CPDF_Stream* GetRolloverIcon()
+ {
+ return GetIcon(FX_BSTRC("RI"));
+ }
+
+
+
+
+ inline CPDF_Stream* GetDownIcon()
+ {
+ return GetIcon(FX_BSTRC("IX"));
+ }
+
+
+
+
+ CPDF_IconFit GetIconFit();
+
+
+
+
+ int GetTextPosition();
+
+ CPDF_Dictionary* m_pDict;
+protected:
+
+ FX_ARGB GetColor(int& iColorType, FX_BSTR csEntry);
+
+ FX_FLOAT GetOriginalColor(int index, FX_BSTR csEntry);
+
+ void GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry);
+
+ CFX_WideString GetCaption(FX_BSTR csEntry);
+
+ CPDF_Stream* GetIcon(FX_BSTR csEntry);
+ friend class CPDF_FormControl;
+};
+#endif
diff --git a/core/include/fpdfdoc/fpdf_tagged.h b/core/include/fpdfdoc/fpdf_tagged.h
new file mode 100644
index 0000000000..a44c26311b
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_tagged.h
@@ -0,0 +1,99 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_TAGGED_H_
+#define _FPDF_TAGGED_H_
+class CPDF_StructTree;
+class CPDF_StructElement;
+struct CPDF_StructKid;
+class CPDF_Document;
+class CPDF_Page;
+class IPDF_ReflowEngine;
+class IPDF_ReflowedPage;
+class CPDF_StructTree : public CFX_Object
+{
+public:
+
+ static CPDF_StructTree* LoadDoc(const CPDF_Document* pDoc);
+
+ static CPDF_StructTree* LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict);
+
+ virtual ~CPDF_StructTree() {}
+
+ virtual int CountTopElements() const = 0;
+
+ virtual CPDF_StructElement* GetTopElement(int i) const = 0;
+};
+struct CPDF_StructKid {
+ enum {
+ Invalid,
+ Element,
+ PageContent,
+ StreamContent,
+ Object
+ } m_Type;
+
+ union {
+ struct {
+
+ CPDF_StructElement* m_pElement;
+
+ CPDF_Dictionary* m_pDict;
+ } m_Element;
+ struct {
+
+ FX_DWORD m_PageObjNum;
+
+ FX_DWORD m_ContentId;
+ } m_PageContent;
+ struct {
+
+ FX_DWORD m_PageObjNum;
+
+ FX_DWORD m_ContentId;
+
+ FX_DWORD m_RefObjNum;
+ } m_StreamContent;
+ struct {
+
+ FX_DWORD m_PageObjNum;
+
+ FX_DWORD m_RefObjNum;
+ } m_Object;
+ };
+};
+class CPDF_StructElement : public CFX_Object
+{
+public:
+
+ virtual CPDF_StructTree* GetTree() const = 0;
+
+ virtual const CFX_ByteString& GetType() const = 0;
+
+ virtual CPDF_StructElement* GetParent() const = 0;
+
+ virtual CPDF_Dictionary * GetDict() const = 0;
+
+ virtual int CountKids() const = 0;
+
+ virtual const CPDF_StructKid& GetKid(int index) const = 0;
+
+ virtual CFX_PtrArray* GetObjectArray() = 0;
+
+ virtual CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F) = 0;
+
+
+
+ virtual CFX_ByteString GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;
+
+ virtual FX_ARGB GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;
+
+ virtual FX_FLOAT GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;
+
+ virtual int GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1) = 0;
+
+};
+#endif
diff --git a/core/include/fpdfdoc/fpdf_vt.h b/core/include/fpdfdoc/fpdf_vt.h
new file mode 100644
index 0000000000..e2825c123d
--- /dev/null
+++ b/core/include/fpdfdoc/fpdf_vt.h
@@ -0,0 +1,444 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_VT_H_
+#define _FPDF_VT_H_
+#include "../fxcrt/fx_basic.h"
+#include "../fpdfapi/fpdf_parser.h"
+struct CPVT_WordPlace;
+struct CPVT_WordRange;
+struct CPVT_Word;
+struct CPVT_Line;
+struct CPVT_Section;
+class IPDF_VariableText_Provider;
+class IPDF_VariableText_Iterator;
+class IPDF_VariableText;
+struct CPVT_WordPlace {
+
+ CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1)
+ {
+ }
+
+ CPVT_WordPlace(FX_INT32 nSecIndex, FX_INT32 nLineIndex, FX_INT32 nWordIndex)
+ {
+ this->nSecIndex = nSecIndex;
+ this->nLineIndex = nLineIndex;
+ this->nWordIndex = nWordIndex;
+ }
+
+ void Default()
+ {
+ nSecIndex = nLineIndex = nWordIndex = -1;
+ }
+
+ FX_BOOL operator == (const CPVT_WordPlace & wp) const
+ {
+ return wp.nSecIndex == this->nSecIndex && wp.nLineIndex == this->nLineIndex && wp.nWordIndex == this->nWordIndex;
+ }
+
+ FX_BOOL operator != (const CPVT_WordPlace & wp) const
+ {
+ return wp.nSecIndex != this->nSecIndex || wp.nLineIndex != this->nLineIndex || wp.nWordIndex != this->nWordIndex;
+ }
+
+ inline FX_INT32 WordCmp(const CPVT_WordPlace & wp) const
+ {
+ if (this->nSecIndex > wp.nSecIndex) {
+ return 1;
+ }
+ if (this->nSecIndex < wp.nSecIndex) {
+ return -1;
+ }
+ if (this->nLineIndex > wp.nLineIndex) {
+ return 1;
+ }
+ if (this->nLineIndex < wp.nLineIndex) {
+ return -1;
+ }
+ if (this->nWordIndex > wp.nWordIndex) {
+ return 1;
+ }
+ if (this->nWordIndex < wp.nWordIndex) {
+ return -1;
+ }
+ return 0;
+ }
+
+ inline FX_INT32 LineCmp(const CPVT_WordPlace & wp) const
+ {
+ if (this->nSecIndex > wp.nSecIndex) {
+ return 1;
+ }
+ if (this->nSecIndex < wp.nSecIndex) {
+ return -1;
+ }
+ if (this->nLineIndex > wp.nLineIndex) {
+ return 1;
+ }
+ if (this->nLineIndex < wp.nLineIndex) {
+ return -1;
+ }
+ return 0;
+ }
+
+ inline FX_INT32 SecCmp(const CPVT_WordPlace & wp) const
+ {
+ if (this->nSecIndex > wp.nSecIndex) {
+ return 1;
+ }
+ if (this->nSecIndex < wp.nSecIndex) {
+ return -1;
+ }
+ return 0;
+ }
+
+ FX_INT32 nSecIndex;
+
+ FX_INT32 nLineIndex;
+
+ FX_INT32 nWordIndex;
+};
+struct CPVT_WordRange {
+
+ CPVT_WordRange()
+ {
+ }
+
+ CPVT_WordRange(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
+ {
+ Set(begin, end);
+ }
+
+ void Default()
+ {
+ BeginPos.Default();
+ EndPos.Default();
+ }
+
+ void Set(const CPVT_WordPlace & begin, const CPVT_WordPlace & end)
+ {
+ this->BeginPos = begin;
+ this->EndPos = end;
+ SwapWordPlace();
+ }
+
+ void SetBeginPos(const CPVT_WordPlace & begin)
+ {
+ this->BeginPos = begin;
+ SwapWordPlace();
+ }
+
+ void SetEndPos(const CPVT_WordPlace & end)
+ {
+ this->EndPos = end;
+ SwapWordPlace();
+ }
+
+ FX_BOOL IsExist() const
+ {
+ return this->BeginPos != this->EndPos;
+ }
+
+ FX_BOOL operator != (const CPVT_WordRange & wr) const
+ {
+ return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
+ }
+
+ void SwapWordPlace()
+ {
+ if (BeginPos.WordCmp(EndPos) > 0) {
+ CPVT_WordPlace place = EndPos;
+ EndPos = BeginPos;
+ BeginPos = place;
+ }
+ }
+
+ CPVT_WordPlace BeginPos;
+
+ CPVT_WordPlace EndPos;
+};
+struct CPVT_SecProps : public CFX_Object {
+
+ CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0)
+ {
+ }
+
+ CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, FX_INT32 alignment) :
+ fLineLeading(lineLeading), fLineIndent(lineIndent), nAlignment(alignment)
+ {
+ }
+
+ CPVT_SecProps(const CPVT_SecProps & other) :
+ fLineLeading(other.fLineLeading), fLineIndent(other.fLineIndent), nAlignment(other.nAlignment)
+ {
+ }
+
+ FX_FLOAT fLineLeading;
+
+ FX_FLOAT fLineIndent;
+
+ FX_INT32 nAlignment;
+};
+struct CPVT_WordProps : public CFX_Object {
+
+ CPVT_WordProps() : nFontIndex(-1), fFontSize(0.0f), dwWordColor(0), nScriptType(0), nWordStyle(0),
+ fCharSpace(0.0f), nHorzScale(0)
+ {
+ }
+
+ CPVT_WordProps(FX_INT32 fontIndex, FX_FLOAT fontSize, FX_COLORREF wordColor = 0, FX_INT32 scriptType = 0, FX_INT32 wordStyle = 0,
+ FX_FLOAT charSpace = 0, FX_INT32 horzScale = 100) :
+ nFontIndex(fontIndex), fFontSize(fontSize), dwWordColor(wordColor), nScriptType(scriptType),
+ nWordStyle(wordStyle), fCharSpace(charSpace), nHorzScale(horzScale)
+ {
+ }
+
+ CPVT_WordProps(const CPVT_WordProps & other) :
+ nFontIndex(other.nFontIndex), fFontSize(other.fFontSize), dwWordColor(other.dwWordColor),
+ nScriptType(other.nScriptType), nWordStyle(other.nWordStyle), fCharSpace(other.fCharSpace),
+ nHorzScale(other.nHorzScale)
+ {
+ }
+
+ FX_INT32 nFontIndex;
+
+ FX_FLOAT fFontSize;
+
+ FX_COLORREF dwWordColor;
+
+ FX_INT32 nScriptType;
+
+ FX_INT32 nWordStyle;
+
+ FX_FLOAT fCharSpace;
+
+ FX_INT32 nHorzScale;
+};
+struct CPVT_Word {
+
+ CPVT_Word() : Word(0), nCharset(0), ptWord(0, 0), fAscent(0.0f), fDescent(0.0f), fWidth(0.0f),
+ fFontSize(0), WordProps()
+ {
+ }
+
+ FX_WORD Word;
+
+ FX_INT32 nCharset;
+
+ CPVT_WordPlace WordPlace;
+
+ CPDF_Point ptWord;
+
+ FX_FLOAT fAscent;
+
+ FX_FLOAT fDescent;
+
+ FX_FLOAT fWidth;
+
+ FX_INT32 nFontIndex;
+
+ FX_FLOAT fFontSize;
+
+ CPVT_WordProps WordProps;
+};
+struct CPVT_Line {
+
+ CPVT_Line() : ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
+ {
+ }
+
+ CPVT_WordPlace lineplace;
+
+ CPVT_WordPlace lineEnd;
+
+ CPDF_Point ptLine;
+
+ FX_FLOAT fLineWidth;
+
+ FX_FLOAT fLineAscent;
+
+ FX_FLOAT fLineDescent;
+};
+struct CPVT_Section {
+
+ CPVT_WordPlace secplace;
+
+ CPDF_Rect rcSection;
+
+ CPVT_SecProps SecProps;
+
+ CPVT_WordProps WordProps;
+};
+class IPDF_VariableText_Provider
+{
+public:
+
+ virtual FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle) = 0;
+
+ virtual FX_INT32 GetTypeAscent(FX_INT32 nFontIndex) = 0;
+
+ virtual FX_INT32 GetTypeDescent(FX_INT32 nFontIndex) = 0;
+
+ virtual FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
+
+ virtual FX_BOOL IsLatinWord(FX_WORD word) = 0;
+
+ virtual FX_INT32 GetDefaultFontIndex() = 0;
+};
+class IPDF_VariableText_Iterator
+{
+public:
+
+ virtual FX_BOOL NextWord() = 0;
+
+ virtual FX_BOOL PrevWord() = 0;
+
+ virtual FX_BOOL NextLine() = 0;
+
+ virtual FX_BOOL PrevLine() = 0;
+
+ virtual FX_BOOL NextSection() = 0;
+
+ virtual FX_BOOL PrevSection() = 0;
+
+ virtual FX_BOOL GetWord(CPVT_Word & word) const = 0;
+
+ virtual FX_BOOL SetWord(const CPVT_Word & word) = 0;
+
+ virtual FX_BOOL GetLine(CPVT_Line & line) const = 0;
+
+ virtual FX_BOOL GetSection(CPVT_Section & section) const = 0;
+
+ virtual FX_BOOL SetSection(const CPVT_Section & section) = 0;
+
+ virtual void SetAt(FX_INT32 nWordIndex) = 0;
+
+ virtual void SetAt(const CPVT_WordPlace & place) = 0;
+
+ virtual const CPVT_WordPlace & GetAt() const = 0;
+};
+class IPDF_VariableText
+{
+public:
+
+ static IPDF_VariableText* NewVariableText();
+
+ static void DelVariableText(IPDF_VariableText* pVT);
+public:
+
+ virtual IPDF_VariableText_Provider* SetProvider(IPDF_VariableText_Provider * pProvider) = 0;
+
+ virtual IPDF_VariableText_Iterator* GetIterator() = 0;
+
+ virtual void SetPlateRect(const CPDF_Rect & rect) = 0;
+
+ virtual void SetAlignment(FX_INT32 nFormat = 0) = 0;
+
+ virtual void SetPasswordChar(FX_WORD wSubWord = '*') = 0;
+
+ virtual void SetLimitChar(FX_INT32 nLimitChar = 0) = 0;
+
+ virtual void SetCharArray(FX_INT32 nCharArray = 0) = 0;
+
+ virtual void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;
+
+ virtual void SetHorzScale(FX_INT32 nHorzScale = 100) = 0;
+
+ virtual void SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;
+
+ virtual void SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;
+
+ virtual void SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;
+
+ virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+
+ virtual void SetLineLeading(FX_FLOAT fLineLeading) = 0;
+
+ virtual void SetRichText(FX_BOOL bRichText) = 0;
+
+ virtual void Initialize() = 0;
+
+ virtual FX_BOOL IsValid() const = 0;
+
+ virtual FX_BOOL IsRichText() const = 0;
+
+ virtual void RearrangeAll() = 0;
+
+ virtual void RearrangePart(const CPVT_WordRange & PlaceRange) = 0;
+
+ virtual void ResetAll() = 0;
+
+ virtual void SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL) = 0;
+
+ virtual CPVT_WordPlace InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
+ const CPVT_WordProps * pWordProps = NULL) = 0;
+
+ virtual CPVT_WordPlace InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL) = 0;
+
+ virtual CPVT_WordPlace InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
+ const CPVT_SecProps * pSecProps = NULL, const CPVT_WordProps * pWordProps = NULL) = 0;
+
+ virtual CPVT_WordPlace DeleteWords(const CPVT_WordRange & PlaceRange) = 0;
+
+ virtual CPVT_WordPlace DeleteWord(const CPVT_WordPlace & place) = 0;
+
+ virtual CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace & place) = 0;
+
+ virtual const CPDF_Rect & GetPlateRect() const = 0;
+
+ virtual CPDF_Rect GetContentRect() const = 0;
+
+ virtual FX_INT32 GetTotalWords() const = 0;
+
+ virtual FX_FLOAT GetFontSize() const = 0;
+
+ virtual FX_INT32 GetAlignment() const = 0;
+
+ virtual FX_WORD GetPasswordChar() const = 0;
+
+ virtual FX_INT32 GetCharArray() const = 0;
+
+ virtual FX_INT32 GetLimitChar() const = 0;
+
+ virtual FX_BOOL IsMultiLine() const = 0;
+
+ virtual FX_INT32 GetHorzScale() const = 0;
+
+ virtual FX_FLOAT GetCharSpace() const = 0;
+
+ virtual CPVT_WordPlace GetBeginWordPlace() const = 0;
+
+ virtual CPVT_WordPlace GetEndWordPlace() const = 0;
+
+ virtual CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const = 0;
+
+ virtual CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
+
+ virtual CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const = 0;
+
+ virtual CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ virtual void UpdateWordPlace(CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const = 0;
+
+ virtual FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
+
+ virtual CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const = 0;
+};
+#endif
diff --git a/core/include/fpdftext/fpdf_text.h b/core/include/fpdftext/fpdf_text.h
new file mode 100644
index 0000000000..8b5edc348f
--- /dev/null
+++ b/core/include/fpdftext/fpdf_text.h
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_TEXT_H_
+#define _FPDF_TEXT_H_
+#ifndef _FPDF_PARSER_
+#include "../fpdfapi/fpdf_parser.h"
+#endif
+#ifndef _FPDF_PAGEOBJ_H_
+#include "../fpdfapi/fpdf_pageobj.h"
+#endif
+#ifndef _FPDF_PAGE_
+#include "../fpdfapi/fpdf_page.h"
+#endif
+class CPDF_PageObjects;
+#define PDF2TXT_AUTO_ROTATE 1
+#define PDF2TXT_AUTO_WIDTH 2
+#define PDF2TXT_KEEP_COLUMN 4
+#define PDF2TXT_USE_OCR 8
+#define PDF2TXT_INCLUDE_INVISIBLE 16
+void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags);
+void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags);
+void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ FX_DWORD flags);
+CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage);
+class IPDF_TextPage;
+class IPDF_LinkExtract;
+class IPDF_TextPageFind;
+#define CHAR_ERROR -1
+#define CHAR_NORMAL 0
+#define CHAR_GENERATED 1
+#define CHAR_UNUNICODE 2
+typedef struct {
+ FX_WCHAR m_Unicode;
+ FX_WCHAR m_Charcode;
+ FX_INT32 m_Flag;
+ FX_FLOAT m_FontSize;
+ FX_FLOAT m_OriginX;
+ FX_FLOAT m_OriginY;
+ CFX_FloatRect m_CharBox;
+ CPDF_TextObject* m_pTextObj;
+ CFX_AffineMatrix m_Matrix;
+} FPDF_CHAR_INFO;
+typedef CFX_ArrayTemplate<CFX_FloatRect> CFX_RectArray;
+#define FPDFTEXT_LRTB 0
+#define FPDFTEXT_RLTB 1
+#define FPDFTEXT_TBRL 2
+#define FPDFTEXT_LEFT -1
+#define FPDFTEXT_RIGHT 1
+#define FPDFTEXT_UP -2
+#define FPDFTEXT_DOWN 2
+class IPDF_ReflowedPage;
+#define FPDFTEXT_WRITINGMODE_UNKNOW 0
+#define FPDFTEXT_WRITINGMODE_LRTB 1
+#define FPDFTEXT_WRITINGMODE_RLTB 2
+#define FPDFTEXT_WRITINGMODE_TBRL 3
+class CPDFText_ParseOptions : public CFX_Object
+{
+public:
+
+ CPDFText_ParseOptions();
+ FX_BOOL m_bGetCharCodeOnly;
+ FX_BOOL m_bNormalizeObjs;
+ FX_BOOL m_bOutputHyphen;
+};
+class IPDF_TextPage : public CFX_Object
+{
+public:
+
+ virtual ~IPDF_TextPage() {}
+ static IPDF_TextPage* CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);
+ static IPDF_TextPage* CreateTextPage(const CPDF_Page* pPage, int flags = 0);
+ static IPDF_TextPage* CreateTextPage(const CPDF_PageObjects* pObjs, int flags = 0);
+ static IPDF_TextPage* CreateReflowTextPage(IPDF_ReflowedPage* pRefPage);
+
+ virtual void NormalizeObjects(FX_BOOL bNormalize) = 0;
+
+ virtual FX_BOOL ParseTextPage() = 0;
+
+
+ virtual FX_BOOL IsParsered() const = 0;
+public:
+
+ virtual int CharIndexFromTextIndex(int TextIndex) const = 0;
+
+ virtual int TextIndexFromCharIndex(int CharIndex) const = 0;
+
+
+ virtual int CountChars() const = 0;
+
+ virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const = 0;
+
+ virtual void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const = 0;
+
+
+
+ virtual int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;
+
+ virtual int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const = 0;
+
+ virtual int GetOrderByDirection(int index, int direction) const = 0;
+
+ virtual CFX_WideString GetTextByRect(CFX_FloatRect rect) const = 0;
+
+ virtual void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const = 0;
+
+
+ virtual int CountRects(int start, int nCount) = 0;
+
+ virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const = 0;
+
+ virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate) = 0;
+
+ virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate) = 0;
+
+ virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE) = 0;
+
+ virtual void GetBoundedSegment(int index, int& start, int& count) const = 0;
+
+
+ virtual int GetWordBreak(int index, int direction) const = 0;
+
+ virtual CFX_WideString GetPageText(int start = 0, int nCount = -1 ) const = 0;
+};
+#define FPDFTEXT_MATCHCASE 0x00000001
+#define FPDFTEXT_MATCHWHOLEWORD 0x00000002
+#define FPDFTEXT_CONSECUTIVE 0x00000004
+class IPDF_TextPageFind : public CFX_Object
+{
+public:
+
+ virtual ~IPDF_TextPageFind() {}
+
+ static IPDF_TextPageFind* CreatePageFind(const IPDF_TextPage* pTextPage);
+public:
+
+ virtual FX_BOOL FindFirst(CFX_WideString findwhat, int flags, int startPos = 0) = 0;
+
+ virtual FX_BOOL FindNext() = 0;
+
+ virtual FX_BOOL FindPrev() = 0;
+
+ virtual void GetRectArray(CFX_RectArray& rects) const = 0;
+
+ virtual int GetCurOrder() const = 0;
+
+ virtual int GetMatchedCount() const = 0;
+};
+class IPDF_LinkExtract : public CFX_Object
+{
+public:
+
+ virtual ~IPDF_LinkExtract() {}
+
+ static IPDF_LinkExtract* CreateLinkExtract();
+
+ virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage) = 0;
+public:
+
+ virtual int CountLinks() const = 0;
+
+ virtual CFX_WideString GetURL(int index) const = 0;
+
+ virtual void GetBoundedSegment(int index, int& start, int& count) const = 0;
+
+ virtual void GetRects(int index, CFX_RectArray& rects) const = 0;
+};
+#endif
diff --git a/core/include/fxcodec/fx_codec.h b/core/include/fxcodec/fx_codec.h
new file mode 100644
index 0000000000..bee9702b28
--- /dev/null
+++ b/core/include/fxcodec/fx_codec.h
@@ -0,0 +1,288 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_CODEC_H_
+#define _FX_CODEC_H_
+#ifndef _FXCRT_EXTENSION_
+#include "../fxcrt/fx_ext.h"
+#endif
+#include "fx_codec_def.h"
+#include "fx_codec_provider.h"
+class CFX_DIBSource;
+class ICodec_ScanlineDecoder;
+class ICodec_BasicModule;
+class ICodec_FaxModule;
+class ICodec_JpegModule;
+class ICodec_JpxModule;
+class ICodec_Jbig2Module;
+class ICodec_IccModule;
+class ICodec_FlateModule;
+class ICodec_Jbig2Encoder;
+class ICodec_ScanlineDecoder;
+class CCodec_ModuleMgr : public CFX_Object
+{
+public:
+
+ static CCodec_ModuleMgr* Create();
+
+ void Destroy();
+
+ void InitJbig2Decoder();
+
+ void InitJpxDecoder();
+
+
+ void InitIccDecoder();
+
+ ICodec_Jbig2Encoder* CreateJbig2Encoder();
+protected:
+ CCodec_ModuleMgr();
+ ~CCodec_ModuleMgr();
+public:
+ ICodec_BasicModule* GetBasicModule()
+ {
+ return m_pBasicModule;
+ }
+ ICodec_FaxModule* GetFaxModule()
+ {
+ return m_pFaxModule;
+ }
+ ICodec_JpegModule* GetJpegModule()
+ {
+ return m_pJpegModule;
+ }
+ ICodec_JpxModule* GetJpxModule()
+ {
+ return m_pJpxModule;
+ }
+ ICodec_Jbig2Module* GetJbig2Module()
+ {
+ return m_pJbig2Module;
+ }
+ ICodec_IccModule* GetIccModule()
+ {
+ return m_pIccModule;
+ }
+ ICodec_FlateModule* GetFlateModule()
+ {
+ return m_pFlateModule;
+ }
+protected:
+ ICodec_BasicModule* m_pBasicModule;
+ ICodec_FaxModule* m_pFaxModule;
+ ICodec_JpegModule* m_pJpegModule;
+ ICodec_JpxModule* m_pJpxModule;
+ ICodec_Jbig2Module* m_pJbig2Module;
+ ICodec_IccModule* m_pIccModule;
+ ICodec_FlateModule* m_pFlateModule;
+
+};
+class ICodec_BasicModule : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_BasicModule() {}
+ virtual FX_BOOL RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size) = 0;
+ virtual FX_BOOL A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size) = 0;
+ virtual ICodec_ScanlineDecoder* CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc) = 0;
+};
+class ICodec_ScanlineDecoder : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_ScanlineDecoder() {}
+
+ virtual FX_DWORD GetSrcOffset() = 0;
+
+ virtual void DownScale(int dest_width, int dest_height) = 0;
+
+ virtual FX_LPBYTE GetScanline(int line) = 0;
+
+ virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) = 0;
+
+ virtual int GetWidth() = 0;
+
+ virtual int GetHeight() = 0;
+
+ virtual int CountComps() = 0;
+
+ virtual int GetBPC() = 0;
+
+ virtual FX_BOOL IsColorTransformed() = 0;
+
+ virtual void ClearImageData() = 0;
+};
+class ICodec_FlateModule : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_FlateModule() {}
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns) = 0;
+ virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
+ virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
+ virtual FX_BOOL Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
+};
+class ICodec_FaxModule : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_FaxModule() {}
+
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows) = 0;
+
+
+ virtual FX_BOOL Encode(FX_LPCBYTE src_buf, int width, int height, int pitch,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size) = 0;
+};
+class ICodec_JpegModule : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_JpegModule() {}
+
+ virtual void SetPovider(IFX_JpegProvider* pJP) = 0;
+
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
+ int width, int height, int nComps, FX_BOOL ColorTransform) = 0;
+
+ virtual FX_BOOL LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;
+
+ virtual FX_BOOL Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,
+ FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;
+
+ virtual void* Start() = 0;
+
+ virtual void Finish(void* pContext) = 0;
+
+ virtual void Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
+
+ virtual int ReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;
+
+
+ virtual int StartScanline(void* pContext, int down_scale) = 0;
+
+
+ virtual FX_BOOL ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;
+
+
+ virtual FX_DWORD GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;
+};
+class ICodec_JpxModule : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_JpxModule() {}
+
+ virtual FX_LPVOID CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE) = 0;
+
+ virtual void GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& codestream_nComps, FX_DWORD& output_nComps) = 0;
+
+ virtual FX_BOOL Decode(FX_LPVOID ctx, FX_LPBYTE dest_data, int pitch,
+ FX_BOOL bTranslateColor, FX_LPBYTE offsets) = 0;
+
+ virtual void DestroyDecoder(FX_LPVOID ctx) = 0;
+};
+class ICodec_Jbig2Module : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_Jbig2Module() {}
+
+ virtual FX_BOOL Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch) = 0;
+
+ virtual FX_BOOL Decode(IFX_FileRead* file_ptr, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& pitch, FX_LPBYTE& dest_buf) = 0;
+ virtual void* CreateJbig2Context() = 0;
+
+ virtual FXCODEC_STATUS StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause) = 0;
+
+ virtual FXCODEC_STATUS StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause) = 0;
+ virtual FXCODEC_STATUS ContinueDecode(void* pJbig2Content, IFX_Pause* pPause) = 0;
+ virtual void DestroyJbig2Context(void* pJbig2Content) = 0;
+};
+class ICodec_Jbig2Encoder : public CFX_Object
+{
+public:
+
+ virtual ~ICodec_Jbig2Encoder() {}
+};
+class ICodec_IccModule : public CFX_Object
+{
+public:
+ typedef enum {
+ IccCS_Unknown = 0,
+ IccCS_XYZ,
+ IccCS_Lab,
+ IccCS_Luv,
+ IccCS_YCbCr,
+ IccCS_Yxy,
+ IccCS_Hsv,
+ IccCS_Hls,
+ IccCS_Gray,
+ IccCS_Rgb,
+ IccCS_Cmyk,
+ IccCS_Cmy
+ } IccCS;
+ typedef struct _IccParam {
+ FX_DWORD Version;
+ IccCS ColorSpace;
+ FX_DWORD dwProfileType;
+ FX_DWORD dwFormat;
+ FX_LPBYTE pProfileData;
+ FX_DWORD dwProfileSize;
+ double Gamma;
+ } IccParam;
+
+ virtual ~ICodec_IccModule() {}
+
+ virtual IccCS GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize) = 0;
+
+ virtual IccCS GetProfileCS(IFX_FileRead* pFile) = 0;
+
+ virtual FX_LPVOID CreateTransform(ICodec_IccModule::IccParam* pInputParam,
+ ICodec_IccModule::IccParam* pOutputParam,
+ ICodec_IccModule::IccParam* pProofParam = NULL,
+ FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
+ FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
+ FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
+ FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
+ ) = 0;
+
+
+ virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT) = 0;
+
+ virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
+ FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
+ ) = 0;
+
+ virtual void DestroyTransform(FX_LPVOID pTransform) = 0;
+
+ virtual void Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues) = 0;
+
+ virtual void TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels) = 0;
+};
+void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B);
+void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B);
+FX_BOOL MD5ComputeID(FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16]);
+#endif
diff --git a/core/include/fxcodec/fx_codec_def.h b/core/include/fxcodec/fx_codec_def.h
new file mode 100644
index 0000000000..72b10bd012
--- /dev/null
+++ b/core/include/fxcodec/fx_codec_def.h
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_CODEC_DEF_H_
+#define _FX_CODEC_DEF_H_
+enum FXCODEC_STATUS {
+ FXCODEC_STATUS_ERROR = -1,
+ FXCODEC_STATUS_FRAME_READY,
+ FXCODEC_STATUS_FRAME_TOBECONTINUE,
+ FXCODEC_STATUS_DECODE_READY,
+ FXCODEC_STATUS_DECODE_TOBECONTINUE,
+ FXCODEC_STATUS_DECODE_FINISH,
+ FXCODEC_STATUS_ERR_MEMORY,
+ FXCODEC_STATUS_ERR_READ,
+ FXCODEC_STATUS_ERR_FLUSH,
+ FXCODEC_STATUS_ERR_FORMAT,
+ FXCODEC_STATUS_ERR_PARAMS
+};
+#define JP2_SPACE_INVALID -1
+#define JPX_SPACE_INVALID -1
+#define JP2_SPACE_bilevel1 0
+#define JP2_SPACE_YCbCr1 1
+#define JP2_SPACE_YCbCr2 3
+#define JP2_SPACE_YCbCr3 4
+#define JP2_SPACE_PhotoYCC 9
+#define JP2_SPACE_CMY 11
+#define JP2_SPACE_CMYK 12
+#define JP2_SPACE_YCCK 13
+#define JP2_SPACE_CIELab 14
+#define JP2_SPACE_bilevel2 15
+#define JP2_SPACE_sRGB 16
+#define JP2_SPACE_sLUM 17
+#define JP2_SPACE_sYCC 18
+#define JP2_SPACE_CIEJab 19
+#define JP2_SPACE_esRGB 20
+#define JP2_SPACE_ROMMRGB 21
+#define JP2_SPACE_YPbPr60 22
+#define JP2_SPACE_YPbPr50 23
+#define JP2_SPACE_esYCC 24
+#define JP2_SPACE_iccLUM 100
+#define JP2_SPACE_iccRGB 101
+#define Icc_INTENT_PERCEPTUAL 0
+#define Icc_INTENT_RELATIVE_COLORIMETRIC 1
+#define Icc_INTENT_SATURATION 2
+#define Icc_INTENT_ABSOLUTE_COLORIMETRIC 3
+#define Icc_FORMAT_DEFAULT 0
+#define Icc_FORMAT_SWAP (1<<10)
+#define Icc_FLAGS_DEFAULT 0x0000
+#define Icc_FLAGS_BLACKPOINTCOMPENSATION 0x2000
+#define Icc_FLAGS_NOWHITEONWHITEFIXUP 0x0004
+#define Icc_FLAGS_HIGHRESPRECALC 0x0400
+#define Icc_FLAGS_LOWRESPRECALC 0x0800
+#define Icc_FLAGS_GAMUTCHECK 0x1000
+#define Icc_FLAGS_SOFTPROOFING 0x4000
+#define Icc_PARAMTYPE_NONE 0
+#define Icc_PARAMTYPE_BUFFER 1
+#define Icc_PARAMTYPE_PARAM 2
+#define EXIFTAG_USHORT_RESUNIT 296
+#define EXIFTAG_FLOAT_DPIX 282
+#define EXIFTAG_FLOAT_DPIY 283
+#define EXIFTAG_USHORT_ORIENTATION 274
+#define EXIFTAG_STRING_MANUFACTURER 271
+#define EXIFTAG_STRING_MODULE 272
+#define EXIFTAG_STRING_SOFTWARE 305
+#define EXIFTAG_STRING_IAMGEDESCRIPTION 270
+#define EXIFTAG_STRING_DATETIME 306
+#define EXIFTAG_STRING_COPYRIGHT 33432
+#endif
diff --git a/core/include/fxcodec/fx_codec_provider.h b/core/include/fxcodec/fx_codec_provider.h
new file mode 100644
index 0000000000..4ef61d8552
--- /dev/null
+++ b/core/include/fxcodec/fx_codec_provider.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_CODEC_PROVIDER_H_
+#define _FX_CODEC_PROVIDER_H_
+class IFX_JpegProvider
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual void* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, FX_BOOL ColorTransform) = 0;
+
+
+ virtual void DestroyDecoder(void* pDecoder) = 0;
+
+ virtual void DownScale(void* pDecoder, int dest_width, int dest_height) = 0;
+
+ virtual FX_BOOL Rewind(void* pDecoder) = 0;
+
+ virtual FX_LPBYTE GetNextLine(void* pDecoder) = 0;
+
+ virtual FX_DWORD GetSrcOffset(void* pDecoder) = 0;
+
+
+ virtual FX_BOOL LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr = NULL, FX_DWORD* icc_length = NULL) = 0;
+
+ virtual FX_BOOL Encode(const class CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality = 75,
+ FX_LPCBYTE icc_buf = NULL, FX_DWORD icc_length = 0) = 0;
+
+ virtual void* Start() = 0;
+
+ virtual void Finish(void* pContext) = 0;
+
+ virtual void Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size) = 0;
+
+ virtual int ReadHeader(void* pContext, int* width, int* height, int* nComps) = 0;
+
+
+ virtual int StartScanline(void* pContext, int down_scale) = 0;
+
+
+ virtual FX_BOOL ReadScanline(void* pContext, FX_LPBYTE dest_buf) = 0;
+
+
+ virtual FX_DWORD GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr = NULL) = 0;
+};
+#endif
diff --git a/core/include/fxcrt/fx_arb.h b/core/include/fxcrt/fx_arb.h
new file mode 100644
index 0000000000..4950f81716
--- /dev/null
+++ b/core/include/fxcrt/fx_arb.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ARABIC_
+#define _FX_ARABIC_
+class IFX_BidiChar
+{
+public:
+ static IFX_BidiChar* Create();
+ virtual void Release() = 0;
+ virtual void SetPolicy(FX_BOOL bSeparateNeutral = TRUE) = 0;
+ virtual FX_BOOL AppendChar(FX_WCHAR wch) = 0;
+ virtual FX_BOOL EndChar() = 0;
+ virtual FX_INT32 GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) = 0;
+ virtual void Reset() = 0;
+};
+#endif
diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h
new file mode 100644
index 0000000000..29bc221e5b
--- /dev/null
+++ b/core/include/fxcrt/fx_basic.h
@@ -0,0 +1,1642 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_BASIC_H_
+#define _FX_BASIC_H_
+#ifndef _FX_SYSTEM_H_
+#include "fx_system.h"
+#endif
+#ifndef _FX_MEMORY_H_
+#include "fx_memory.h"
+#endif
+#ifndef _FX_STRING_H_
+#include "fx_string.h"
+#endif
+#ifndef _FX_STREAM_H_
+#include "fx_stream.h"
+#endif
+class CFX_BinaryBuf : public CFX_Object
+{
+public:
+
+ CFX_BinaryBuf(IFX_Allocator* pAllocator = NULL);
+
+ CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BinaryBuf();
+
+ void Clear();
+
+ void EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0);
+
+ void AppendBlock(const void* pBuf, FX_STRSIZE size);
+
+ void AppendFill(FX_BYTE byte, FX_STRSIZE count);
+
+ void AppendString(FX_BSTR str)
+ {
+ AppendBlock(str.GetPtr(), str.GetLength());
+ }
+
+ inline void AppendByte(FX_BYTE byte)
+ {
+ if (m_AllocSize <= m_DataSize) {
+ ExpandBuf(1);
+ }
+ m_pBuffer[m_DataSize++] = byte;
+ }
+
+ void InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size);
+
+ void AttachData(void* pBuf, FX_STRSIZE size);
+
+ void CopyData(const void* pBuf, FX_STRSIZE size);
+
+ void TakeOver(CFX_BinaryBuf& other);
+
+ void Delete(int start_index, int count);
+
+ FX_LPBYTE GetBuffer() const
+ {
+ return m_pBuffer;
+ }
+
+ FX_STRSIZE GetSize() const
+ {
+ return m_DataSize;
+ }
+
+ CFX_ByteStringC GetByteString() const;
+ void GetByteStringL(CFX_ByteStringL &str) const;
+
+ void DetachBuffer();
+
+ IFX_Allocator* m_pAllocator;
+protected:
+
+ FX_STRSIZE m_AllocStep;
+
+ FX_LPBYTE m_pBuffer;
+
+ FX_STRSIZE m_DataSize;
+
+ FX_STRSIZE m_AllocSize;
+
+ void ExpandBuf(FX_STRSIZE size);
+};
+class CFX_ByteTextBuf : public CFX_BinaryBuf
+{
+public:
+
+ CFX_ByteTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}
+
+ void operator = (FX_BSTR str);
+
+ void AppendChar(int ch)
+ {
+ AppendByte((FX_BYTE)ch);
+ }
+
+ CFX_ByteTextBuf& operator << (int i);
+
+ CFX_ByteTextBuf& operator << (FX_DWORD i);
+
+ CFX_ByteTextBuf& operator << (double f);
+
+ CFX_ByteTextBuf& operator << (FX_BSTR lpsz);
+
+ CFX_ByteTextBuf& operator << (const CFX_ByteTextBuf& buf);
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_DataSize;
+ }
+};
+class CFX_WideTextBuf : public CFX_BinaryBuf
+{
+public:
+
+ CFX_WideTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}
+
+ void operator = (FX_LPCWSTR lpsz);
+
+ void operator = (FX_WSTR str);
+
+ void AppendChar(FX_WCHAR wch);
+
+ CFX_WideTextBuf& operator << (int i);
+
+ CFX_WideTextBuf& operator << (double f);
+
+ CFX_WideTextBuf& operator << (FX_LPCWSTR lpsz);
+
+ CFX_WideTextBuf& operator << (FX_WSTR str);
+ CFX_WideTextBuf& operator << (const CFX_WideString &str);
+
+ CFX_WideTextBuf& operator << (const CFX_WideTextBuf& buf);
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_DataSize / sizeof(FX_WCHAR);
+ }
+
+ FX_LPWSTR GetBuffer() const
+ {
+ return (FX_LPWSTR)m_pBuffer;
+ }
+
+ void Delete(int start_index, int count)
+ {
+ CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), count * sizeof(FX_WCHAR));
+ }
+
+ CFX_WideStringC GetWideString() const;
+ void GetWideStringL(CFX_WideStringL& wideText) const;
+};
+class CFX_ArchiveSaver : public CFX_Object
+{
+public:
+
+ CFX_ArchiveSaver(IFX_Allocator* pAllocator = NULL) : m_SavingBuf(pAllocator), m_pStream(NULL) {}
+
+ CFX_ArchiveSaver& operator << (FX_BYTE i);
+
+ CFX_ArchiveSaver& operator << (int i);
+
+ CFX_ArchiveSaver& operator << (FX_DWORD i);
+
+ CFX_ArchiveSaver& operator << (FX_FLOAT i);
+
+ CFX_ArchiveSaver& operator << (double i);
+
+ CFX_ArchiveSaver& operator << (FX_BSTR bstr);
+
+ CFX_ArchiveSaver& operator << (FX_LPCWSTR bstr);
+
+ CFX_ArchiveSaver& operator << (const CFX_WideString& wstr);
+
+ void Write(const void* pData, FX_STRSIZE dwSize);
+
+ FX_INTPTR GetLength()
+ {
+ return m_SavingBuf.GetSize();
+ }
+
+ FX_LPCBYTE GetBuffer()
+ {
+ return m_SavingBuf.GetBuffer();
+ }
+
+ void SetStream(IFX_FileStream* pStream)
+ {
+ m_pStream = pStream;
+ }
+protected:
+
+ CFX_BinaryBuf m_SavingBuf;
+
+ IFX_FileStream* m_pStream;
+};
+class CFX_ArchiveLoader : public CFX_Object
+{
+public:
+
+ CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize);
+
+ CFX_ArchiveLoader& operator >> (FX_BYTE& i);
+
+ CFX_ArchiveLoader& operator >> (int& i);
+
+ CFX_ArchiveLoader& operator >> (FX_DWORD& i);
+
+ CFX_ArchiveLoader& operator >> (FX_FLOAT& i);
+
+ CFX_ArchiveLoader& operator >> (double& i);
+
+ CFX_ArchiveLoader& operator >> (CFX_ByteString& bstr);
+
+ CFX_ArchiveLoader& operator >> (CFX_WideString& wstr);
+
+ FX_BOOL IsEOF();
+
+ FX_BOOL Read(void* pBuf, FX_DWORD dwSize);
+protected:
+
+ FX_DWORD m_LoadingPos;
+
+ FX_LPCBYTE m_pLoadingBuf;
+
+ FX_DWORD m_LoadingSize;
+};
+class IFX_BufferArchive
+{
+public:
+
+ IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);
+
+
+ virtual void Clear();
+
+
+ FX_BOOL Flush();
+
+
+ FX_INT32 AppendBlock(const void* pBuf, size_t size);
+
+ FX_INT32 AppendByte(FX_BYTE byte);
+
+ FX_INT32 AppendDWord(FX_DWORD i);
+
+
+ FX_INT32 AppendString(FX_BSTR lpsz);
+
+protected:
+
+ virtual FX_BOOL DoWork(const void* pBuf, size_t size) = 0;
+
+
+ IFX_Allocator* m_pAllocator;
+
+ FX_STRSIZE m_BufSize;
+
+ FX_LPBYTE m_pBuffer;
+
+ FX_STRSIZE m_Length;
+};
+class CFX_FileBufferArchive : public IFX_BufferArchive, public CFX_Object
+{
+public:
+ CFX_FileBufferArchive(FX_STRSIZE size = 32768, IFX_Allocator* pAllocator = NULL);
+ ~CFX_FileBufferArchive();
+ virtual void Clear();
+
+ FX_BOOL AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover = FALSE);
+
+ FX_BOOL AttachFile(FX_LPCWSTR filename);
+
+ FX_BOOL AttachFile(FX_LPCSTR filename);
+private:
+
+ virtual FX_BOOL DoWork(const void* pBuf, size_t size);
+
+ IFX_StreamWrite *m_pFile;
+
+ FX_BOOL m_bTakeover;
+};
+struct CFX_CharMap {
+
+ static CFX_CharMap* GetDefaultMapper(FX_INT32 codepage = 0);
+
+
+ CFX_WideString (*m_GetWideString)(CFX_CharMap* pMap, const CFX_ByteString& bstr);
+
+ CFX_ByteString (*m_GetByteString)(CFX_CharMap* pMap, const CFX_WideString& wstr);
+
+ FX_INT32 (*m_GetCodePage)();
+};
+class CFX_UTF8Decoder
+{
+public:
+
+ CFX_UTF8Decoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)
+ {
+ m_PendingBytes = 0;
+ }
+
+ void Clear();
+
+ void Input(FX_BYTE byte);
+
+ void AppendChar(FX_DWORD ch);
+
+ void ClearStatus()
+ {
+ m_PendingBytes = 0;
+ }
+
+ CFX_WideStringC GetResult() const
+ {
+ return m_Buffer.GetWideString();
+ }
+ void GetResult(CFX_WideStringL &result) const
+ {
+ m_Buffer.GetWideStringL(result);
+ }
+protected:
+
+ int m_PendingBytes;
+
+ FX_DWORD m_PendingChar;
+
+ CFX_WideTextBuf m_Buffer;
+};
+class CFX_UTF8Encoder
+{
+public:
+
+ CFX_UTF8Encoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)
+ {
+ m_UTF16First = 0;
+ }
+
+ void Input(FX_WCHAR unicode);
+
+ void AppendStr(FX_BSTR str)
+ {
+ m_UTF16First = 0;
+ m_Buffer << str;
+ }
+
+ CFX_ByteStringC GetResult() const
+ {
+ return m_Buffer.GetByteString();
+ }
+ void GetResult(CFX_ByteStringL &result) const
+ {
+ m_Buffer.GetByteStringL(result);
+ }
+protected:
+
+ CFX_ByteTextBuf m_Buffer;
+
+ FX_DWORD m_UTF16First;
+};
+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl);
+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl);
+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI);
+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI);
+class CFX_BasicArray : public CFX_Object
+{
+public:
+
+ IFX_Allocator* m_pAllocator;
+protected:
+
+ CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BasicArray();
+
+ FX_BOOL SetSize(int nNewSize, int nGrowBy);
+
+ FX_BOOL Append(const CFX_BasicArray& src);
+
+ FX_BOOL Copy(const CFX_BasicArray& src);
+
+ FX_LPBYTE InsertSpaceAt(int nIndex, int nCount);
+
+ FX_BOOL RemoveAt(int nIndex, int nCount);
+
+ FX_BOOL InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray);
+
+ const void* GetDataPtr(int index) const;
+protected:
+
+ FX_LPBYTE m_pData;
+
+ int m_nSize;
+
+ int m_nMaxSize;
+
+ int m_nGrowBy;
+
+ int m_nUnitSize;
+};
+template<class TYPE>
+class CFX_ArrayTemplate : public CFX_BasicArray
+{
+public:
+
+ CFX_ArrayTemplate(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(TYPE), pAllocator) {}
+
+ int GetSize() const
+ {
+ return m_nSize;
+ }
+
+ int GetUpperBound() const
+ {
+ return m_nSize - 1;
+ }
+
+ FX_BOOL SetSize(int nNewSize, int nGrowBy = -1)
+ {
+ return CFX_BasicArray::SetSize(nNewSize, nGrowBy);
+ }
+
+ void RemoveAll()
+ {
+ SetSize(0, -1);
+ }
+
+ const TYPE GetAt(int nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return (const TYPE&)(*(volatile const TYPE*)NULL);
+ }
+ return ((const TYPE*)m_pData)[nIndex];
+ }
+
+ FX_BOOL SetAt(int nIndex, TYPE newElement)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[nIndex] = newElement;
+ return TRUE;
+ }
+
+ TYPE& ElementAt(int nIndex)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return *(TYPE*)NULL;
+ }
+ return ((TYPE*)m_pData)[nIndex];
+ }
+
+ const TYPE* GetData() const
+ {
+ return (const TYPE*)m_pData;
+ }
+
+ TYPE* GetData()
+ {
+ return (TYPE*)m_pData;
+ }
+
+ FX_BOOL SetAtGrow(int nIndex, TYPE newElement)
+ {
+ if (nIndex < 0) {
+ return FALSE;
+ }
+ if (nIndex >= m_nSize)
+ if (!SetSize(nIndex + 1, -1)) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[nIndex] = newElement;
+ return TRUE;
+ }
+
+ FX_BOOL Add(TYPE newElement)
+ {
+ if (m_nSize < m_nMaxSize) {
+ m_nSize ++;
+ } else if (!SetSize(m_nSize + 1, -1)) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[m_nSize - 1] = newElement;
+ return TRUE;
+ }
+
+ FX_BOOL Append(const CFX_ArrayTemplate& src)
+ {
+ return CFX_BasicArray::Append(src);
+ }
+
+ FX_BOOL Copy(const CFX_ArrayTemplate& src)
+ {
+ return CFX_BasicArray::Copy(src);
+ }
+
+ TYPE* GetDataPtr(int index)
+ {
+ return (TYPE*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ TYPE* AddSpace()
+ {
+ return (TYPE*)CFX_BasicArray::InsertSpaceAt(m_nSize, 1);
+ }
+
+ TYPE* InsertSpaceAt(int nIndex, int nCount)
+ {
+ return (TYPE*)CFX_BasicArray::InsertSpaceAt(nIndex, nCount);
+ }
+
+ const TYPE operator[](int nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ *(volatile char*)0 = '\0';
+ }
+ return ((const TYPE*)m_pData)[nIndex];
+ }
+
+ TYPE& operator[](int nIndex)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ *(volatile char*)0 = '\0';
+ }
+ return ((TYPE*)m_pData)[nIndex];
+ }
+
+ FX_BOOL InsertAt(int nIndex, TYPE newElement, int nCount = 1)
+ {
+ if (!InsertSpaceAt(nIndex, nCount)) {
+ return FALSE;
+ }
+ while (nCount--) {
+ ((TYPE*)m_pData)[nIndex++] = newElement;
+ }
+ return TRUE;
+ }
+
+ FX_BOOL RemoveAt(int nIndex, int nCount = 1)
+ {
+ return CFX_BasicArray::RemoveAt(nIndex, nCount);
+ }
+
+ FX_BOOL InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)
+ {
+ return CFX_BasicArray::InsertAt(nStartIndex, pNewArray);
+ }
+
+ int Find(TYPE data, int iStart = 0) const
+ {
+ if (iStart < 0) {
+ return -1;
+ }
+ for (; iStart < (int)m_nSize; iStart ++)
+ if (((TYPE*)m_pData)[iStart] == data) {
+ return iStart;
+ }
+ return -1;
+ }
+};
+typedef CFX_ArrayTemplate<FX_BYTE> CFX_ByteArray;
+typedef CFX_ArrayTemplate<FX_WORD> CFX_WordArray;
+typedef CFX_ArrayTemplate<FX_DWORD> CFX_DWordArray;
+typedef CFX_ArrayTemplate<void*> CFX_PtrArray;
+typedef CFX_ArrayTemplate<FX_FILESIZE> CFX_FileSizeArray;
+typedef CFX_ArrayTemplate<FX_FLOAT> CFX_FloatArray;
+typedef CFX_ArrayTemplate<FX_INT32> CFX_Int32Array;
+template <class ObjectClass>
+class CFX_ObjectArray : public CFX_BasicArray
+{
+public:
+
+ CFX_ObjectArray(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(ObjectClass), pAllocator) {}
+
+ ~CFX_ObjectArray()
+ {
+ RemoveAll();
+ }
+
+ void Add(const ObjectClass& data)
+ {
+ new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass(data);
+ }
+
+ ObjectClass& Add()
+ {
+ return *(ObjectClass*) new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass();
+ }
+
+ void* AddSpace()
+ {
+ return InsertSpaceAt(m_nSize, 1);
+ }
+
+ FX_INT32 Append(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)
+ {
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_INT32 nSize = src.GetSize();
+ if (!nSize) {
+ return 0;
+ }
+ FXSYS_assert(nStart > -1 && nStart < nSize);
+ if (nCount < 0) {
+ nCount = nSize;
+ }
+ if (nStart + nCount > nSize) {
+ nCount = nSize - nStart;
+ }
+ if (nCount < 1) {
+ return 0;
+ }
+ nSize = m_nSize;
+ InsertSpaceAt(m_nSize, nCount);
+ ObjectClass* pStartObj = (ObjectClass*)GetDataPtr(nSize);
+ nSize = nStart + nCount;
+ for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {
+ new ((void*)pStartObj) ObjectClass(src[i]);
+ }
+ return nCount;
+ }
+
+ FX_INT32 Copy(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)
+ {
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_INT32 nSize = src.GetSize();
+ if (!nSize) {
+ return 0;
+ }
+ FXSYS_assert(nStart > -1 && nStart < nSize);
+ if (nCount < 0) {
+ nCount = nSize;
+ }
+ if (nStart + nCount > nSize) {
+ nCount = nSize - nStart;
+ }
+ if (nCount < 1) {
+ return 0;
+ }
+ RemoveAll();
+ SetSize(nCount, -1);
+ ObjectClass* pStartObj = (ObjectClass*)m_pData;
+ nSize = nStart + nCount;
+ for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {
+ new ((void*)pStartObj) ObjectClass(src[i]);
+ }
+ return nCount;
+ }
+
+ int GetSize() const
+ {
+ return m_nSize;
+ }
+
+ ObjectClass& operator[] (int index) const
+ {
+ FXSYS_assert(index < m_nSize);
+ return *(ObjectClass*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ ObjectClass* GetDataPtr(int index)
+ {
+ return (ObjectClass*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ void RemoveAt(int index)
+ {
+ FXSYS_assert(index < m_nSize);
+ ((ObjectClass*)GetDataPtr(index))->~ObjectClass();
+ CFX_BasicArray::RemoveAt(index, 1);
+ }
+
+ void RemoveAll()
+ {
+ for (int i = 0; i < m_nSize; i ++) {
+ ((ObjectClass*)GetDataPtr(i))->~ObjectClass();
+ }
+ CFX_BasicArray::SetSize(0, -1);
+ }
+};
+typedef CFX_ObjectArray<CFX_ByteString> CFX_ByteStringArray;
+typedef CFX_ObjectArray<CFX_WideString> CFX_WideStringArray;
+class CFX_BaseSegmentedArray : public CFX_Object
+{
+public:
+
+ CFX_BaseSegmentedArray(int unit_size = 1, int segment_units = 512, int index_size = 8, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BaseSegmentedArray();
+
+ void SetUnitSize(int unit_size, int segment_units, int index_size = 8);
+
+ void* Add();
+
+ void* GetAt(int index) const;
+
+ void RemoveAll();
+
+ void Delete(int index, int count = 1);
+
+ int GetSize() const
+ {
+ return m_DataSize;
+ }
+
+ int GetSegmentSize() const
+ {
+ return m_SegmentSize;
+ }
+
+ int GetUnitSize() const
+ {
+ return m_UnitSize;
+ }
+
+ void* Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+
+ IFX_Allocator* m_pAllocator;
+private:
+
+ int m_UnitSize;
+
+ short m_SegmentSize;
+
+ FX_BYTE m_IndexSize;
+
+ FX_BYTE m_IndexDepth;
+
+ int m_DataSize;
+
+ void* m_pIndex;
+ void** GetIndex(int seg_index) const;
+ void* IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+ void* IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+};
+template <class ElementType>
+class CFX_SegmentedArray : public CFX_BaseSegmentedArray
+{
+public:
+
+ CFX_SegmentedArray(int segment_units, int index_size = 8, IFX_Allocator* pAllocator = NULL)
+ : CFX_BaseSegmentedArray(sizeof(ElementType), segment_units, index_size, pAllocator)
+ {}
+
+ void Add(ElementType data)
+ {
+ *(ElementType*)CFX_BaseSegmentedArray::Add() = data;
+ }
+
+ ElementType& operator [] (int index)
+ {
+ return *(ElementType*)CFX_BaseSegmentedArray::GetAt(index);
+ }
+};
+template <class DataType, int FixedSize>
+class CFX_FixedBufGrow : public CFX_Object
+{
+public:
+ CFX_FixedBufGrow(IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ {}
+ CFX_FixedBufGrow(int data_size, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ {
+ if (data_size > FixedSize) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);
+ } else {
+ FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);
+ }
+ }
+ void SetDataSize(int data_size)
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ m_pData = NULL;
+ if (data_size > FixedSize) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);
+ } else {
+ FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);
+ }
+ }
+ ~CFX_FixedBufGrow()
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ }
+ operator DataType*()
+ {
+ return m_pData ? m_pData : m_Data;
+ }
+private:
+ IFX_Allocator* m_pAllocator;
+ DataType m_Data[FixedSize];
+ DataType* m_pData;
+};
+template <class DataType>
+class CFX_TempBuf
+{
+public:
+ CFX_TempBuf(int size, IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator)
+ {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, size);
+ }
+ ~CFX_TempBuf()
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ }
+ DataType& operator[](int i)
+ {
+ FXSYS_assert(m_pData != NULL);
+ return m_pData[i];
+ }
+ operator DataType*()
+ {
+ return m_pData;
+ }
+private:
+ IFX_Allocator* m_pAllocator;
+ DataType* m_pData;
+};
+class CFX_MapPtrToPtr : public CFX_Object
+{
+protected:
+
+ struct CAssoc {
+
+ CAssoc* pNext;
+
+ void* key;
+
+ void* value;
+ };
+public:
+
+ CFX_MapPtrToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_MapPtrToPtr();
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return m_nCount == 0;
+ }
+
+ FX_BOOL Lookup(void* key, void*& rValue) const;
+
+ void* GetValueAt(void* key) const;
+
+ void*& operator[](void* key);
+
+ void SetAt(void* key, void* newValue)
+ {
+ (*this)[key] = newValue;
+ }
+
+ FX_BOOL RemoveKey(void* key);
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const
+ {
+ return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const;
+
+ FX_DWORD GetHashTableSize() const
+ {
+ return m_nHashTableSize;
+ }
+
+ void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CAssoc** m_pHashTable;
+
+ FX_DWORD m_nHashTableSize;
+
+ int m_nCount;
+
+ CAssoc* m_pFreeList;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ FX_DWORD HashKey(void* key) const;
+
+ CAssoc* NewAssoc();
+
+ void FreeAssoc(CAssoc* pAssoc);
+
+ CAssoc* GetAssocAt(void* key, FX_DWORD& hash) const;
+};
+template <class KeyType, class ValueType>
+class CFX_MapPtrTemplate : public CFX_MapPtrToPtr
+{
+public:
+
+ CFX_MapPtrTemplate(IFX_Allocator* pAllocator = NULL) : CFX_MapPtrToPtr(10, pAllocator) {}
+
+ FX_BOOL Lookup(KeyType key, ValueType& rValue) const
+ {
+ FX_LPVOID pValue = NULL;
+ if (!CFX_MapPtrToPtr::Lookup((void*)(FX_UINTPTR)key, pValue)) {
+ return FALSE;
+ }
+ rValue = (ValueType)(FX_UINTPTR)pValue;
+ return TRUE;
+ }
+
+ ValueType& operator[](KeyType key)
+ {
+ return (ValueType&)CFX_MapPtrToPtr::operator []((void*)(FX_UINTPTR)key);
+ }
+
+ void SetAt(KeyType key, ValueType newValue)
+ {
+ CFX_MapPtrToPtr::SetAt((void*)(FX_UINTPTR)key, (void*)(FX_UINTPTR)newValue);
+ }
+
+ FX_BOOL RemoveKey(KeyType key)
+ {
+ return CFX_MapPtrToPtr::RemoveKey((void*)(FX_UINTPTR)key);
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey, ValueType& rValue) const
+ {
+ void* pKey = NULL;
+ void* pValue = NULL;
+ CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);
+ rKey = (KeyType)(FX_UINTPTR)pKey;
+ rValue = (ValueType)(FX_UINTPTR)pValue;
+ }
+};
+class CFX_CMapDWordToDWord : public CFX_Object
+{
+public:
+
+ CFX_CMapDWordToDWord(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator) {}
+
+ FX_BOOL Lookup(FX_DWORD key, FX_DWORD& value) const;
+
+ void SetAt(FX_DWORD key, FX_DWORD value);
+
+ void EstimateSize(FX_DWORD size, FX_DWORD grow_by);
+
+ FX_POSITION GetStartPosition() const;
+
+ void GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const;
+protected:
+
+ CFX_BinaryBuf m_Buffer;
+};
+class CFX_MapByteStringToPtr : public CFX_Object
+{
+protected:
+
+ struct CAssoc {
+
+ CAssoc* pNext;
+
+ FX_DWORD nHashValue;
+
+ CFX_ByteString key;
+
+ void* value;
+ };
+public:
+
+ CFX_MapByteStringToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return m_nCount == 0;
+ }
+
+ FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;
+
+ void*& operator[](FX_BSTR key);
+
+ void SetAt(FX_BSTR key, void* newValue)
+ {
+ (*this)[key] = newValue;
+ }
+
+ FX_BOOL RemoveKey(FX_BSTR key);
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const
+ {
+ return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;
+
+ FX_LPVOID GetNextValue(FX_POSITION& rNextPosition) const;
+
+ FX_DWORD GetHashTableSize() const
+ {
+ return m_nHashTableSize;
+ }
+
+ void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);
+
+ FX_DWORD HashKey(FX_BSTR key) const;
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CAssoc** m_pHashTable;
+
+ FX_DWORD m_nHashTableSize;
+
+ int m_nCount;
+
+ CAssoc* m_pFreeList;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ CAssoc* NewAssoc();
+
+ void FreeAssoc(CAssoc* pAssoc);
+
+ CAssoc* GetAssocAt(FX_BSTR key, FX_DWORD& hash) const;
+public:
+
+ ~CFX_MapByteStringToPtr();
+};
+class CFX_CMapByteStringToPtr : public CFX_Object
+{
+public:
+
+ CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_CMapByteStringToPtr();
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const;
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;
+
+ FX_LPVOID GetNextValue(FX_POSITION& rNextPosition) const;
+
+ FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;
+
+ void SetAt(FX_BSTR key, void* value);
+
+ void RemoveKey(FX_BSTR key);
+
+ int GetCount() const;
+
+ void AddValue(FX_BSTR key, void* pValue);
+private:
+
+ CFX_BaseSegmentedArray m_Buffer;
+};
+class CFX_PtrList : public CFX_Object
+{
+protected:
+
+ struct CNode {
+
+ CNode* pNext;
+
+ CNode* pPrev;
+
+ void* data;
+ };
+public:
+
+ CFX_PtrList(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ FX_POSITION GetHeadPosition() const
+ {
+ return (FX_POSITION)m_pNodeHead;
+ }
+
+ FX_POSITION GetTailPosition() const
+ {
+ return (FX_POSITION)m_pNodeTail;
+ }
+
+ void* GetNext(FX_POSITION& rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ rPosition = (FX_POSITION) pNode->pNext;
+ return pNode->data;
+ }
+
+ void* GetPrev(FX_POSITION& rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ rPosition = (FX_POSITION) pNode->pPrev;
+ return pNode->data;
+ }
+
+ FX_POSITION GetNextPosition(FX_POSITION pos) const
+ {
+ return ((CNode*)pos)->pNext;
+ }
+
+ FX_POSITION GetPrevPosition(FX_POSITION pos) const
+ {
+ return ((CNode*)pos)->pPrev;
+ }
+
+ void* GetAt(FX_POSITION rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ return pNode->data;
+ }
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_POSITION AddTail(void* newElement);
+
+ FX_POSITION AddHead(void* newElement);
+
+ void SetAt(FX_POSITION pos, void* newElement)
+ {
+ CNode* pNode = (CNode*) pos;
+ pNode->data = newElement;
+ }
+
+ FX_POSITION InsertAfter(FX_POSITION pos, void* newElement);
+
+ FX_POSITION Find(void* searchValue, FX_POSITION startAfter = NULL ) const;
+
+ FX_POSITION FindIndex(int index) const;
+
+ void RemoveAt(FX_POSITION pos);
+
+ void RemoveAll();
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CNode* m_pNodeHead;
+
+ CNode* m_pNodeTail;
+
+ int m_nCount;
+
+ CNode* m_pNodeFree;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ CNode* NewNode(CNode* pPrev, CNode* pNext);
+
+ void FreeNode(CNode* pNode);
+public:
+
+ ~CFX_PtrList();
+};
+typedef void (*PD_CALLBACK_FREEDATA)(FX_LPVOID pData);
+struct FX_PRIVATEDATA {
+
+ void FreeData();
+
+ FX_LPVOID m_pModuleId;
+
+ FX_LPVOID m_pData;
+
+ PD_CALLBACK_FREEDATA m_pCallback;
+
+ FX_BOOL m_bSelfDestruct;
+};
+class CFX_PrivateData
+{
+public:
+
+ CFX_PrivateData(IFX_Allocator* pAllocator = NULL) : m_DataList(pAllocator) {}
+
+ ~CFX_PrivateData();
+
+ void ClearAll();
+
+ void SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);
+
+ void SetPrivateObj(FX_LPVOID module_id, CFX_DestructObject* pObj);
+
+ FX_LPVOID GetPrivateData(FX_LPVOID module_id);
+
+ FX_BOOL LookupPrivateData(FX_LPVOID module_id, FX_LPVOID &pData) const
+ {
+ if (!module_id) {
+ return FALSE;
+ }
+ FX_DWORD nCount = m_DataList.GetSize();
+ for (FX_DWORD n = 0; n < nCount; n ++) {
+ if (m_DataList[n].m_pModuleId == module_id) {
+ pData = m_DataList[n].m_pData;
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+ FX_BOOL RemovePrivateData(FX_LPVOID module_id);
+protected:
+
+ CFX_ArrayTemplate<FX_PRIVATEDATA> m_DataList;
+
+ void AddData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct);
+};
+class CFX_BitStream : public CFX_Object
+{
+public:
+
+ void Init(FX_LPCBYTE pData, FX_DWORD dwSize);
+
+
+ FX_DWORD GetBits(FX_DWORD nBits);
+
+ void ByteAlign();
+
+ FX_BOOL IsEOF()
+ {
+ return m_BitPos >= m_BitSize;
+ }
+
+ void SkipBits(FX_DWORD nBits)
+ {
+ m_BitPos += nBits;
+ }
+
+ void Rewind()
+ {
+ m_BitPos = 0;
+ }
+protected:
+
+ FX_DWORD m_BitPos;
+
+ FX_DWORD m_BitSize;
+
+ FX_LPCBYTE m_pData;
+};
+template <class ObjClass> class CFX_CountRef : public CFX_Object
+{
+public:
+
+ typedef CFX_CountRef<ObjClass> Ref;
+
+ class CountedObj : public ObjClass
+ {
+ public:
+
+ CountedObj() {}
+
+ CountedObj(const CountedObj& src) : ObjClass(src) {}
+
+ int m_RefCount;
+ };
+
+ CFX_CountRef()
+ {
+ m_pObject = NULL;
+ }
+
+ CFX_CountRef(const Ref& ref)
+ {
+ m_pObject = ref.m_pObject;
+ if (m_pObject) {
+ m_pObject->m_RefCount ++;
+ }
+ }
+
+ ~CFX_CountRef()
+ {
+ if (!m_pObject) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ }
+
+ ObjClass* New()
+ {
+ if (m_pObject) {
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+ m_pObject = FX_NEW CountedObj;
+ if (!m_pObject) {
+ return NULL;
+ }
+ m_pObject->m_RefCount = 1;
+ return m_pObject;
+ }
+
+ void operator = (const Ref& ref)
+ {
+ if (ref.m_pObject) {
+ ref.m_pObject->m_RefCount ++;
+ }
+ if (m_pObject) {
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ }
+ m_pObject = ref.m_pObject;
+ }
+
+ void operator = (void* p)
+ {
+ FXSYS_assert(p == 0);
+ if (m_pObject == NULL) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+
+ const ObjClass* GetObject() const
+ {
+ return m_pObject;
+ }
+
+ operator const ObjClass*() const
+ {
+ return m_pObject;
+ }
+
+ FX_BOOL IsNull() const
+ {
+ return m_pObject == NULL;
+ }
+
+ FX_BOOL NotNull() const
+ {
+ return m_pObject != NULL;
+ }
+
+ ObjClass* GetModify()
+ {
+ if (m_pObject == NULL) {
+ m_pObject = FX_NEW CountedObj;
+ if (m_pObject) {
+ m_pObject->m_RefCount = 1;
+ }
+ } else if (m_pObject->m_RefCount > 1) {
+ m_pObject->m_RefCount --;
+ CountedObj* pOldObject = m_pObject;
+ m_pObject = NULL;
+ m_pObject = FX_NEW CountedObj(*pOldObject);
+ if (m_pObject) {
+ m_pObject->m_RefCount = 1;
+ }
+ }
+ return m_pObject;
+ }
+
+ void SetNull()
+ {
+ if (m_pObject == NULL) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+
+ FX_BOOL operator == (const Ref& ref) const
+ {
+ return m_pObject == ref.m_pObject;
+ }
+protected:
+
+ CountedObj* m_pObject;
+};
+class IFX_Pause
+{
+public:
+
+ virtual FX_BOOL NeedToPauseNow() = 0;
+};
+class CFX_DataFilter : public CFX_Object
+{
+public:
+
+ virtual ~CFX_DataFilter();
+
+ void SetDestFilter(CFX_DataFilter* pFilter);
+
+ FX_BOOL IsEOF() const
+ {
+ return m_bEOF;
+ }
+
+ FX_DWORD GetSrcPos()
+ {
+ return m_SrcPos;
+ }
+
+ void FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+
+ void FilterFinish(CFX_BinaryBuf& dest_buf);
+protected:
+
+ CFX_DataFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) = 0;
+ void ReportEOF(FX_DWORD left_input);
+
+ FX_BOOL m_bEOF;
+
+ FX_DWORD m_SrcPos;
+
+ CFX_DataFilter* m_pDestFilter;
+};
+template <class T>
+class CFX_SmartPointer
+{
+public:
+ CFX_SmartPointer(T *pObj) : m_pObj(pObj) {}
+ ~CFX_SmartPointer()
+ {
+ m_pObj->Release();
+ }
+ operator T*(void)
+ {
+ return m_pObj;
+ }
+ T& operator *(void)
+ {
+ return *m_pObj;
+ }
+ T* operator ->(void)
+ {
+ return m_pObj;
+ }
+protected:
+ T *m_pObj;
+};
+#define FX_DATALIST_LENGTH 1024
+template<size_t unit>
+class CFX_SortListArray : public CFX_Object
+{
+protected:
+
+ struct DataList {
+
+ FX_INT32 start;
+
+ FX_INT32 count;
+ FX_LPBYTE data;
+ };
+public:
+
+ CFX_SortListArray(IFX_Allocator* pAllocator = NULL) : m_CurList(0), m_DataLists(pAllocator) {}
+
+ ~CFX_SortListArray()
+ {
+ Clear();
+ }
+
+
+ void Clear()
+ {
+ IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;
+ for (FX_INT32 i = m_DataLists.GetUpperBound(); i >= 0; i--) {
+ DataList list = m_DataLists.ElementAt(i);
+ if (list.data) {
+ FX_Allocator_Free(pAllocator, list.data);
+ }
+ }
+ m_DataLists.RemoveAll();
+ m_CurList = 0;
+ }
+
+ void Append(FX_INT32 nStart, FX_INT32 nCount)
+ {
+ if (nStart < 0) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;
+ while (nCount > 0) {
+ FX_INT32 temp_count = FX_MIN(nCount, FX_DATALIST_LENGTH);
+ DataList list;
+ list.data = FX_Allocator_Alloc(pAllocator, FX_BYTE, temp_count * unit);
+ if (!list.data) {
+ break;
+ }
+ FXSYS_memset32(list.data, 0, temp_count * unit);
+ list.start = nStart;
+ list.count = temp_count;
+ Append(list);
+ nCount -= temp_count;
+ nStart += temp_count;
+ }
+ }
+
+ FX_LPBYTE GetAt(FX_INT32 nIndex)
+ {
+ if (nIndex < 0) {
+ return NULL;
+ }
+ if (m_CurList < 0 || m_CurList >= m_DataLists.GetSize()) {
+ return NULL;
+ }
+ DataList *pCurList = m_DataLists.GetDataPtr(m_CurList);
+ if (!pCurList || nIndex < pCurList->start || nIndex >= pCurList->start + pCurList->count) {
+ pCurList = NULL;
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = m_DataLists.GetUpperBound();
+ FX_INT32 iMid = 0;
+ while (iStart <= iEnd) {
+ iMid = (iStart + iEnd) / 2;
+ DataList* list = m_DataLists.GetDataPtr(iMid);
+ if (nIndex < list->start) {
+ iEnd = iMid - 1;
+ } else if (nIndex >= list->start + list->count) {
+ iStart = iMid + 1;
+ } else {
+ pCurList = list;
+ m_CurList = iMid;
+ break;
+ }
+ }
+ }
+ return pCurList ? pCurList->data + (nIndex - pCurList->start) * unit : NULL;
+ }
+protected:
+ void Append(const DataList& list)
+ {
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = m_DataLists.GetUpperBound();
+ FX_INT32 iFind = 0;
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ DataList* cur_list = m_DataLists.GetDataPtr(iMid);
+ if (list.start < cur_list->start + cur_list->count) {
+ iEnd = iMid - 1;
+ } else {
+ if (iMid == iEnd) {
+ iFind = iMid + 1;
+ break;
+ }
+ DataList* next_list = m_DataLists.GetDataPtr(iMid + 1);
+ if (list.start < next_list->start) {
+ iFind = iMid + 1;
+ break;
+ } else {
+ iStart = iMid + 1;
+ }
+ }
+ }
+ m_DataLists.InsertAt(iFind, list);
+ }
+ FX_INT32 m_CurList;
+ CFX_ArrayTemplate<DataList> m_DataLists;
+};
+template<typename T1, typename T2>
+class CFX_ListArrayTemplate : public CFX_Object
+{
+public:
+
+ void Clear()
+ {
+ m_Data.Clear();
+ }
+
+ void Add(FX_INT32 nStart, FX_INT32 nCount)
+ {
+ m_Data.Append(nStart, nCount);
+ }
+
+ T2& operator [] (FX_INT32 nIndex)
+ {
+ FX_LPBYTE data = m_Data.GetAt(nIndex);
+ FXSYS_assert(data != NULL);
+ return (T2&)(*(volatile T2*)data);
+ }
+
+ T2* GetPtrAt(FX_INT32 nIndex)
+ {
+ return (T2*)m_Data.GetAt(nIndex);
+ }
+protected:
+ T1 m_Data;
+};
+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_FILESIZE)>, FX_FILESIZE> CFX_FileSizeListArray;
+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_DWORD)>, FX_DWORD> CFX_DWordListArray;
+typedef enum {
+ Ready,
+ ToBeContinued,
+ Found,
+ NotFound,
+ Failed,
+ Done
+} FX_ProgressiveStatus;
+#define ProgressiveStatus FX_ProgressiveStatus
+#define FX_NAMESPACE_DECLARE(namespace, type) namespace::type
+#endif
diff --git a/core/include/fxcrt/fx_coordinates.h b/core/include/fxcrt/fx_coordinates.h
new file mode 100644
index 0000000000..eee0dfb260
--- /dev/null
+++ b/core/include/fxcrt/fx_coordinates.h
@@ -0,0 +1,900 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_COORDINATES_
+#define _FXCRT_COORDINATES_
+template<class baseType> class CFX_PSVTemplate;
+template<class baseType> class CFX_VTemplate;
+template<class baseType> class CFX_PRLTemplate;
+template<class baseType> class CFX_RTemplate;
+template<class baseType> class CFX_ETemplate;
+template<class baseType> class CFX_ATemplate;
+template<class baseType> class CFX_RRTemplate;
+class CFX_Matrix;
+template<class baseType>
+class CFX_PSVTemplate : public CFX_Object
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_PSV;
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ void Set(baseType x, baseType y)
+ {
+ FXT_PSV::x = x, FXT_PSV::y = y;
+ }
+ void Set(const FXT_PSV &psv)
+ {
+ FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;
+ }
+ void Add(baseType x, baseType y)
+ {
+ FXT_PSV::x += x, FXT_PSV::y += y;
+ }
+ void Subtract(baseType x, baseType y)
+ {
+ FXT_PSV::x -= x, FXT_PSV::y -= y;
+ }
+ void Reset()
+ {
+ FXT_PSV::x = FXT_PSV::y = 0;
+ }
+ FXT_PSV& operator += (const FXT_PSV &obj)
+ {
+ x += obj.x;
+ y += obj.y;
+ return *this;
+ }
+ FXT_PSV& operator -= (const FXT_PSV &obj)
+ {
+ x -= obj.x;
+ y -= obj.y;
+ return *this;
+ }
+ FXT_PSV& operator *= (baseType lamda)
+ {
+ x *= lamda;
+ y *= lamda;
+ return *this;
+ }
+ FXT_PSV& operator /= (baseType lamda)
+ {
+ x /= lamda;
+ y /= lamda;
+ return *this;
+ }
+ friend FX_BOOL operator == (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ return obj1.x == obj2.x && obj1.y == obj2.y;
+ }
+ friend FX_BOOL operator != (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ return obj1.x != obj2.x || obj1.y != obj2.y;
+ }
+ friend FXT_PSV operator + (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ CFX_PSVTemplate obj;
+ obj.x = obj1.x + obj2.x;
+ obj.y = obj1.y + obj2.y;
+ return obj;
+ }
+ friend FXT_PSV operator - (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ CFX_PSVTemplate obj;
+ obj.x = obj1.x - obj2.x;
+ obj.y = obj1.y - obj2.y;
+ return obj;
+ }
+ friend FXT_PSV operator * (const FXT_PSV &obj, baseType lamda)
+ {
+ CFX_PSVTemplate t;
+ t.x = obj.x * lamda;
+ t.y = obj.y * lamda;
+ return t;
+ }
+ friend FXT_PSV operator * (baseType lamda, const FXT_PSV &obj)
+ {
+ CFX_PSVTemplate t;
+ t.x = lamda * obj.x;
+ t.y = lamda * obj.y;
+ return t;
+ }
+ friend FXT_PSV operator / (const FXT_PSV &obj, baseType lamda)
+ {
+ CFX_PSVTemplate t;
+ t.x = obj.x / lamda;
+ t.y = obj.y / lamda;
+ return t;
+ }
+ baseType x, y;
+};
+typedef CFX_PSVTemplate<FX_INT32> CFX_Point;
+typedef CFX_PSVTemplate<FX_FLOAT> CFX_PointF;
+typedef CFX_PSVTemplate<FX_INT32> CFX_Size;
+typedef CFX_PSVTemplate<FX_FLOAT> CFX_SizeF;
+typedef CFX_ArrayTemplate<CFX_Point> CFX_Points;
+typedef CFX_ArrayTemplate<CFX_PointF> CFX_PointsF;
+typedef CFX_PSVTemplate<FX_INT32> * FX_LPPOINT;
+typedef CFX_PSVTemplate<FX_FLOAT> * FX_LPPOINTF;
+typedef CFX_PSVTemplate<FX_INT32> const * FX_LPCPOINT;
+typedef CFX_PSVTemplate<FX_FLOAT> const * FX_LPCPOINTF;
+#define CFX_FloatPoint CFX_PointF
+template<class baseType>
+class CFX_VTemplate: public CFX_PSVTemplate<baseType>
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_PSV;
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ typedef CFX_VTemplate<baseType> FXT_VECTOR;
+ void Set(baseType x, baseType y)
+ {
+ FXT_PSV::x = x, FXT_PSV::y = y;
+ }
+ void Set(const FXT_PSV &psv)
+ {
+ FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;
+ }
+ void Set(const FXT_POINT &p1, const FXT_POINT &p2)
+ {
+ FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y;
+ }
+ void Reset()
+ {
+ FXT_PSV::x = FXT_PSV::y = 0;
+ }
+ baseType SquareLength() const
+ {
+ return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y;
+ }
+ baseType Length() const
+ {
+ return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);
+ }
+ void Normalize()
+ {
+ FX_FLOAT fLen = FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);
+ FXSYS_assert(fLen >= 0.0001f);
+ FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen;
+ FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen;
+ }
+ baseType DotProduct(baseType x, baseType y) const
+ {
+ return FXT_PSV::x * x + FXT_PSV::y * y;
+ }
+ baseType DotProduct(const FXT_VECTOR &v) const
+ {
+ return FXT_PSV::x * v.x + FXT_PSV::y * v.y;
+ }
+ FX_BOOL IsParallel(baseType x, baseType y) const
+ {
+ baseType t = FXT_PSV::x * y - FXT_PSV::y * x;
+ return FXSYS_fabs(t) < 0x0001f;
+ }
+ FX_BOOL IsParallel(const FXT_VECTOR &v) const
+ {
+ return IsParallel(v.x, v.y);
+ }
+ FX_BOOL IsPerpendicular(baseType x, baseType y) const
+ {
+ baseType t = DotProduct(x, y);
+ return FXSYS_fabs(t) < 0x0001f;
+ }
+ FX_BOOL IsPerpendicular(const FXT_VECTOR &v) const
+ {
+ return IsPerpendicular(v.x, v.y);
+ }
+ void Translate(baseType dx, baseType dy)
+ {
+ FXT_PSV::x += dx, FXT_PSV::y += dy;
+ }
+ void Scale(baseType sx, baseType sy)
+ {
+ FXT_PSV::x *= sx, FXT_PSV::y *= sy;
+ }
+ void Rotate(FX_FLOAT fRadian)
+ {
+ FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x;
+ FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y;
+ FX_FLOAT cosValue = FXSYS_cos(fRadian);
+ FX_FLOAT sinValue = FXSYS_sin(fRadian);
+ FXT_PSV::x = xx * cosValue - yy * sinValue;
+ FXT_PSV::y = xx * sinValue + yy * cosValue;
+ }
+ friend FX_FLOAT Cosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)
+ {
+ FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0);
+ FX_FLOAT dotProduct = v1.DotProduct(v2);
+ return dotProduct / (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLength());
+ }
+ friend FX_FLOAT ArcCosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)
+ {
+ return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2));
+ }
+ friend FX_FLOAT SlopeAngle(const FXT_VECTOR &v)
+ {
+ CFX_VTemplate vx;
+ vx.Set(1, 0);
+ FX_FLOAT fSlope = ArcCosine(v, vx);
+ return v.y < 0 ? -fSlope : fSlope;
+ }
+};
+typedef CFX_VTemplate<FX_INT32> CFX_Vector;
+typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF;
+template<class baseType>
+class CFX_RTemplate: public CFX_Object
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ typedef CFX_VTemplate<baseType> FXT_VECTOR;
+ typedef CFX_PRLTemplate<baseType> FXT_PARAL;
+ typedef CFX_RTemplate<baseType> FXT_RECT;
+ void Set(baseType left, baseType top, baseType width, baseType height)
+ {
+ FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, FXT_RECT::height = height;
+ }
+ void Set(baseType left, baseType top, const FXT_SIZE &size)
+ {
+ FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size);
+ }
+ void Set(const FXT_POINT &p, baseType width, baseType height)
+ {
+ TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height;
+ }
+ void Set(const FXT_POINT &p1, const FXT_POINT &p2)
+ {
+ TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1.y, FXT_RECT::Normalize();
+ }
+ void Set(const FXT_POINT &p, const FXT_VECTOR &v)
+ {
+ TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, FXT_RECT::Normalize();
+ }
+ void Reset()
+ {
+ FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0;
+ }
+ FXT_RECT& operator += (const FXT_POINT &p)
+ {
+ left += p.x, top += p.y;
+ return *this;
+ }
+ FXT_RECT& operator -= (const FXT_POINT &p)
+ {
+ left -= p.x, top -= p.y;
+ return *this;
+ }
+ baseType right() const
+ {
+ return left + width;
+ }
+ baseType bottom() const
+ {
+ return top + height;
+ }
+ void Normalize()
+ {
+ if (width < 0) {
+ left += width;
+ width = -width;
+ }
+ if (height < 0) {
+ top += height;
+ height = -height;
+ }
+ }
+ void Offset(baseType dx, baseType dy)
+ {
+ left += dx;
+ top += dy;
+ }
+ void Inflate(baseType x, baseType y)
+ {
+ left -= x;
+ width += x * 2;
+ top -= y;
+ height += y * 2;
+ }
+ void Inflate(const FXT_POINT &p)
+ {
+ Inflate(p.x, p.y);
+ }
+ void Inflate(baseType left, baseType top, baseType right, baseType bottom)
+ {
+ FXT_RECT::left -= left;
+ FXT_RECT::top -= top;
+ FXT_RECT::width += left + right;
+ FXT_RECT::height += top + bottom;
+ }
+ void Inflate(const FXT_RECT &rt)
+ {
+ Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height);
+ }
+ void Deflate(baseType x, baseType y)
+ {
+ left += x;
+ width -= x * 2;
+ top += y;
+ height -= y * 2;
+ }
+ void Deflate(const FXT_POINT &p)
+ {
+ Deflate(p.x, p.y);
+ }
+ void Deflate(baseType left, baseType top, baseType right, baseType bottom)
+ {
+ FXT_RECT::left += left;
+ FXT_RECT::top += top;
+ FXT_RECT::width -= left + right;
+ FXT_RECT::height -= top + bottom;
+ }
+ void Deflate(const FXT_RECT &rt)
+ {
+ Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height);
+ }
+ FX_BOOL IsEmpty() const
+ {
+ return width <= 0 || height <= 0;
+ }
+ FX_BOOL IsEmpty(FX_FLOAT fEpsilon) const
+ {
+ return width <= fEpsilon || height <= fEpsilon;
+ }
+ void Empty()
+ {
+ width = height = 0;
+ }
+ FX_BOOL Contains(baseType x, baseType y) const
+ {
+ return x >= left && x < left + width && y >= top && y < top + height;
+ }
+ FX_BOOL Contains(const FXT_POINT &p) const
+ {
+ return Contains(p.x, p.y);
+ }
+ FX_BOOL Contains(const FXT_RECT &rt) const
+ {
+ return rt.left >= left && rt.right() <= right() && rt.top >= top && rt.bottom() <= bottom();
+ }
+ baseType Width() const
+ {
+ return width;
+ }
+ baseType Height() const
+ {
+ return height;
+ }
+ FXT_SIZE Size() const
+ {
+ FXT_SIZE size;
+ size.Set(width, height);
+ return size;
+ }
+ void Size(FXT_SIZE s)
+ {
+ width = s.x, height = s.y;
+ }
+ FXT_POINT TopLeft() const
+ {
+ FXT_POINT p;
+ p.x = left;
+ p.y = top;
+ return p;
+ }
+ FXT_POINT TopRight() const
+ {
+ FXT_POINT p;
+ p.x = left + width;
+ p.y = top;
+ return p;
+ }
+ FXT_POINT BottomLeft() const
+ {
+ FXT_POINT p;
+ p.x = left;
+ p.y = top + height;
+ return p;
+ }
+ FXT_POINT BottomRight() const
+ {
+ FXT_POINT p;
+ p.x = left + width;
+ p.y = top + height;
+ return p;
+ }
+ void TopLeft(FXT_POINT tl)
+ {
+ left = tl.x;
+ top = tl.y;
+ }
+ void TopRight(FXT_POINT tr)
+ {
+ width = tr.x - left;
+ top = tr.y;
+ }
+ void BottomLeft(FXT_POINT bl)
+ {
+ left = bl.x;
+ height = bl.y - top;
+ }
+ void BottomRight(FXT_POINT br)
+ {
+ width = br.x - left;
+ height = br.y - top;
+ }
+ FXT_POINT Center() const
+ {
+ FXT_POINT p;
+ p.x = left + width / 2;
+ p.y = top + height / 2;
+ return p;
+ }
+ void GetParallelogram(FXT_PARAL &pg) const
+ {
+ pg.x = left, pg.y = top;
+ pg.x1 = width, pg.y1 = 0;
+ pg.x2 = 0, pg.y2 = height;
+ }
+ void Union(baseType x, baseType y)
+ {
+ baseType r = right(), b = bottom();
+ if (left > x) {
+ left = x;
+ }
+ if (r < x) {
+ r = x;
+ }
+ if (top > y) {
+ top = y;
+ }
+ if (b < y) {
+ b = y;
+ }
+ width = r - left;
+ height = b - top;
+ }
+ void Union(const FXT_POINT &p)
+ {
+ Union(p.x, p.y);
+ }
+ void Union(const FXT_RECT &rt)
+ {
+ baseType r = right(), b = bottom();
+ if (left > rt.left) {
+ left = rt.left;
+ }
+ if (r < rt.right()) {
+ r = rt.right();
+ }
+ if (top > rt.top) {
+ top = rt.top;
+ }
+ if (b < rt.bottom()) {
+ b = rt.bottom();
+ }
+ width = r - left;
+ height = b - top;
+ }
+ void Intersect(const FXT_RECT &rt)
+ {
+ baseType r = right(), b = bottom();
+ if (left < rt.left) {
+ left = rt.left;
+ }
+ if (r > rt.right()) {
+ r = rt.right();
+ }
+ if (top < rt.top) {
+ top = rt.top;
+ }
+ if (b > rt.bottom()) {
+ b = rt.bottom();
+ }
+ width = r - left;
+ height = b - top;
+ }
+ FX_BOOL IntersectWith(const FXT_RECT &rt) const
+ {
+ FXT_RECT rect = rt;
+ rect.Intersect(*this);
+ return !rect.IsEmpty();
+ }
+ FX_BOOL IntersectWith(const FXT_RECT &rt, FX_FLOAT fEpsilon) const
+ {
+ FXT_RECT rect = rt;
+ rect.Intersect(*this);
+ return !rect.IsEmpty(fEpsilon);
+ }
+ friend FX_BOOL operator == (const FXT_RECT &rc1, const FXT_RECT &rc2)
+ {
+ return rc1.left == rc2.left && rc1.top == rc2.top && rc1.width == rc2.width && rc1.height == rc2.height;
+ }
+ friend FX_BOOL operator != (const FXT_RECT &rc1, const FXT_RECT &rc2)
+ {
+ return rc1.left != rc2.left || rc1.top != rc2.top || rc1.width != rc2.width || rc1.height != rc2.height;
+ }
+ baseType left, top;
+ baseType width, height;
+};
+typedef CFX_RTemplate<FX_INT32> CFX_Rect;
+typedef CFX_RTemplate<FX_FLOAT> CFX_RectF;
+typedef CFX_RTemplate<FX_INT32> * FX_LPRECT;
+typedef CFX_RTemplate<FX_FLOAT> * FX_LPRECTF;
+typedef CFX_RTemplate<FX_INT32> const * FX_LPCRECT;
+typedef CFX_RTemplate<FX_FLOAT> const * FX_LPCRECTF;
+typedef CFX_ArrayTemplate<CFX_RectF> CFX_RectFArray;
+struct FX_RECT {
+
+ int left;
+
+ int top;
+
+ int right;
+
+ int bottom;
+
+ FX_RECT() {}
+
+ FX_RECT(int left1, int top1, int right1, int bottom1)
+ {
+ left = left1;
+ top = top1;
+ right = right1;
+ bottom = bottom1;
+ }
+
+ int Width() const
+ {
+ return right - left;
+ }
+
+ int Height() const
+ {
+ return bottom - top;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return right <= left || bottom <= top;
+ }
+
+ void Normalize();
+
+ void Intersect(const FX_RECT& src);
+
+ void Intersect(int left1, int top1, int right1, int bottom1)
+ {
+ Intersect(FX_RECT(left1, top1, right1, bottom1));
+ }
+
+ void Union(const FX_RECT& other_rect);
+
+ FX_BOOL operator == (const FX_RECT& src) const
+ {
+ return left == src.left && right == src.right && top == src.top && bottom == src.bottom;
+ }
+
+ void Offset(int dx, int dy)
+ {
+ left += dx;
+ right += dx;
+ top += dy;
+ bottom += dy;
+ }
+
+ FX_BOOL Contains(const FX_RECT& other_rect) const
+ {
+ return other_rect.left >= left && other_rect.right <= right && other_rect.top >= top && other_rect.bottom <= bottom;
+ }
+
+ FX_BOOL Contains(int x, int y) const
+ {
+ return x >= left && x < right && y >= top && y < bottom;
+ }
+};
+struct FX_SMALL_RECT {
+
+ FX_SHORT Left;
+
+ FX_SHORT Top;
+
+ FX_SHORT Right;
+
+ FX_SHORT Bottom;
+};
+class CFX_FloatRect : public CFX_Object
+{
+public:
+
+ CFX_FloatRect()
+ {
+ left = right = bottom = top = 0;
+ }
+
+ CFX_FloatRect(FX_FLOAT left1, FX_FLOAT bottom1, FX_FLOAT right1, FX_FLOAT top1)
+ {
+ left = left1;
+ bottom = bottom1;
+ right = right1;
+ top = top1;
+ }
+
+ CFX_FloatRect(const FX_FLOAT* pArray)
+ {
+ left = pArray[0];
+ bottom = pArray[1];
+ right = pArray[2];
+ top = pArray[3];
+ }
+
+ CFX_FloatRect(const FX_RECT& rect);
+
+ FX_BOOL IsEmpty() const
+ {
+ return left >= right || bottom >= top;
+ }
+
+ void Normalize();
+
+ void Reset()
+ {
+ left = right = bottom = top = 0;
+ }
+
+ FX_BOOL Contains(const CFX_FloatRect& other_rect) const;
+
+ FX_BOOL Contains(FX_FLOAT x, FX_FLOAT y) const;
+
+ void Transform(const CFX_Matrix* pMatrix);
+
+ void Intersect(const CFX_FloatRect& other_rect);
+
+ void Union(const CFX_FloatRect& other_rect);
+
+ FX_RECT GetInnerRect() const;
+
+ FX_RECT GetOutterRect() const;
+
+ FX_RECT GetClosestRect() const;
+
+ int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects);
+
+ void InitRect(FX_FLOAT x, FX_FLOAT y)
+ {
+ left = right = x;
+ bottom = top = y;
+ }
+
+ void UpdateRect(FX_FLOAT x, FX_FLOAT y);
+
+ FX_FLOAT Width() const
+ {
+ return right - left;
+ }
+
+ FX_FLOAT Height() const
+ {
+ return top - bottom;
+ }
+
+ void Inflate(FX_FLOAT x, FX_FLOAT y)
+ {
+ Normalize();
+ left -= x;
+ right += x;
+ bottom -= y;
+ top += y;
+ }
+
+ void Inflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+ {
+ Normalize();
+ this->left -= left;
+ this->bottom -= bottom;
+ this->right += right;
+ this->top += top;
+ }
+
+ void Inflate(const CFX_FloatRect &rt)
+ {
+ Inflate(rt.left, rt.bottom, rt.right, rt.top);
+ }
+
+ void Deflate(FX_FLOAT x, FX_FLOAT y)
+ {
+ Normalize();
+ left += x;
+ right -= x;
+ bottom += y;
+ top -= y;
+ }
+
+ void Deflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+ {
+ Normalize();
+ this->left += left;
+ this->bottom += bottom;
+ this->right -= right;
+ this->top -= top;
+ }
+
+ void Deflate(const CFX_FloatRect &rt)
+ {
+ Deflate(rt.left, rt.bottom, rt.right, rt.top);
+ }
+
+ void Translate(FX_FLOAT e, FX_FLOAT f)
+ {
+ left += e;
+ right += e;
+ top += f;
+ bottom += f;
+ }
+
+ static CFX_FloatRect GetBBox(const CFX_FloatPoint* pPoints, int nPoints);
+
+ FX_FLOAT left;
+
+ FX_FLOAT right;
+
+ FX_FLOAT bottom;
+
+ FX_FLOAT top;
+};
+class CFX_Matrix : public CFX_Object
+{
+public:
+
+ CFX_Matrix()
+ {
+ a = d = 1;
+ b = c = e = f = 0;
+ }
+
+ CFX_Matrix(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1, FX_FLOAT f1)
+ {
+ a = a1;
+ b = b1;
+ c = c1;
+ d = d1;
+ e = e1;
+ f = f1;
+ }
+
+ void Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f);
+ void Set(const FX_FLOAT n[6]);
+
+ void SetIdentity()
+ {
+ a = d = 1;
+ b = c = e = f = 0;
+ }
+
+ void SetReverse(const CFX_Matrix &m);
+
+ void Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended = FALSE);
+
+ void Concat(const CFX_Matrix &m, FX_BOOL bPrepended = FALSE);
+
+ void ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);
+ void Reset()
+ {
+ SetIdentity();
+ }
+
+ void Copy(const CFX_Matrix& m)
+ {
+ *this = m;
+ }
+
+ FX_BOOL IsIdentity() const
+ {
+ return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;
+ }
+ FX_BOOL IsInvertible() const;
+
+ FX_BOOL Is90Rotated() const;
+
+ FX_BOOL IsScaled() const;
+
+ void Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);
+
+ void TranslateI(FX_INT32 x, FX_INT32 y, FX_BOOL bPrepended = FALSE)
+ {
+ Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);
+ }
+
+ void Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE);
+
+ void Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE);
+
+ void RotateAt(FX_FLOAT fRadian, FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);
+
+ void Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended = FALSE);
+
+ void MatchRect(const CFX_FloatRect &dest, const CFX_FloatRect &src);
+
+ FX_FLOAT GetXUnit() const;
+
+ FX_FLOAT GetYUnit() const;
+ void GetUnitRect(CFX_RectF &rect) const;
+
+ CFX_FloatRect GetUnitRect() const;
+
+ FX_FLOAT GetUnitArea() const;
+ FX_FLOAT TransformXDistance(FX_FLOAT dx) const;
+ FX_INT32 TransformXDistance(FX_INT32 dx) const;
+ FX_FLOAT TransformYDistance(FX_FLOAT dy) const;
+ FX_INT32 TransformYDistance(FX_INT32 dy) const;
+ FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;
+ FX_INT32 TransformDistance(FX_INT32 dx, FX_INT32 dy) const;
+
+ FX_FLOAT TransformDistance(FX_FLOAT distance) const;
+ void TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const;
+ void TransformPoint(FX_INT32 &x, FX_INT32 &y) const;
+ void TransformPoints(CFX_PointF *points, FX_INT32 iCount) const;
+ void TransformPoints(CFX_Point *points, FX_INT32 iCount) const;
+
+ void Transform(FX_FLOAT& x, FX_FLOAT& y) const
+ {
+ TransformPoint(x, y);
+ }
+
+ void Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const
+ {
+ x1 = x, y1 = y;
+ TransformPoint(x1, y1);
+ }
+ void TransformVector(CFX_VectorF &v) const;
+ void TransformVector(CFX_Vector &v) const;
+ void TransformRect(CFX_RectF &rect) const;
+ void TransformRect(CFX_Rect &rect) const;
+
+ void TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const;
+
+ void TransformRect(CFX_FloatRect& rect) const
+ {
+ TransformRect(rect.left, rect.right, rect.top, rect.bottom);
+ }
+
+ FX_FLOAT GetA() const
+ {
+ return a;
+ }
+
+ FX_FLOAT GetB() const
+ {
+ return b;
+ }
+
+ FX_FLOAT GetC() const
+ {
+ return c;
+ }
+
+ FX_FLOAT GetD() const
+ {
+ return d;
+ }
+
+ FX_FLOAT GetE() const
+ {
+ return e;
+ }
+
+ FX_FLOAT GetF() const
+ {
+ return f;
+ }
+public:
+ FX_FLOAT a;
+ FX_FLOAT b;
+ FX_FLOAT c;
+ FX_FLOAT d;
+ FX_FLOAT e;
+ FX_FLOAT f;
+};
+#define CFX_AffineMatrix CFX_Matrix
+#endif
diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h
new file mode 100644
index 0000000000..7fdbfcd0af
--- /dev/null
+++ b/core/include/fxcrt/fx_ext.h
@@ -0,0 +1,103 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_EXTENSION_
+#define _FXCRT_EXTENSION_
+#ifndef _FX_BASIC_H_
+#include "fx_basic.h"
+#endif
+#ifndef _FXCRT_COORDINATES_
+#include "fx_coordinates.h"
+#endif
+#ifndef _FX_XML_H_
+#include "fx_xml.h"
+#endif
+#ifndef _FX_UNICODE_
+#include "fx_ucd.h"
+#endif
+#ifndef _FX_ARABIC_
+#include "fx_arb.h"
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+FX_FLOAT FXSYS_tan(FX_FLOAT a);
+FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x);
+FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);
+FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);
+FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count);
+FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count);
+FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count);
+inline FX_BOOL FXSYS_islower(FX_INT32 ch)
+{
+ return ch >= 'a' && ch <= 'z';
+}
+inline FX_BOOL FXSYS_isupper(FX_INT32 ch)
+{
+ return ch >= 'A' && ch <= 'Z';
+}
+inline FX_INT32 FXSYS_tolower(FX_INT32 ch)
+{
+ return ch < 'A' || ch > 'Z' ? ch : (ch + 0x20);
+}
+inline FX_INT32 FXSYS_toupper(FX_INT32 ch)
+{
+ return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);
+}
+
+
+
+FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);
+FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);
+
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed);
+
+FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext);
+
+void FX_Random_MT_Close(FX_LPVOID pContext);
+
+void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount);
+
+void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount);
+
+void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount);
+#ifdef __cplusplus
+}
+#endif
+template<class baseType>
+class CFX_SSortTemplate
+{
+public:
+ void ShellSort(baseType *pArray, FX_INT32 iCount)
+ {
+ FXSYS_assert(pArray != NULL && iCount > 0);
+ FX_INT32 i, j, gap;
+ baseType v1, v2;
+ gap = iCount >> 1;
+ while (gap > 0) {
+ for (i = gap; i < iCount; i ++) {
+ j = i - gap;
+ v1 = pArray[i];
+ while (j > -1 && (v2 = pArray[j]) > v1) {
+ pArray[j + gap] = v2;
+ j -= gap;
+ }
+ pArray[j + gap] = v1;
+ }
+ gap >>= 1;
+ }
+ }
+};
+#endif
diff --git a/core/include/fxcrt/fx_memory.h b/core/include/fxcrt/fx_memory.h
new file mode 100644
index 0000000000..b0c94c4c73
--- /dev/null
+++ b/core/include/fxcrt/fx_memory.h
@@ -0,0 +1,300 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_MEMORY_H_
+#define _FX_MEMORY_H_
+#ifndef _FX_SYSTEM_H_
+#include "fx_system.h"
+#endif
+#define FXMEM_NONLEAVE 1
+#define FXMEM_MOVABLE 2
+#define FXMEM_DISCARDABLE 4
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _FXMEM_SystemMgr {
+
+ void* (*Alloc)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags);
+
+ void* (*AllocDebug)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line);
+
+ void* (*Realloc)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags);
+
+ void* (*ReallocDebug)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line);
+
+ void* (*Lock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
+
+ void (*Unlock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
+
+ void (*Free)(struct _FXMEM_SystemMgr* pMgr, void* pointer, int flags);
+
+ void (*Purge)(struct _FXMEM_SystemMgr* pMgr);
+
+ void (*CollectAll)(struct _FXMEM_SystemMgr* pMgr);
+
+
+ void* user;
+} FXMEM_SystemMgr;
+FX_DEFINEHANDLE(FXMEM_FoxitMgr)
+typedef struct _FXMEM_SystemMgr2 {
+
+ FX_BOOL (*More)(struct _FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
+
+ void (*Free)(struct _FXMEM_SystemMgr2* pMgr, void* memory);
+} FXMEM_SystemMgr2;
+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible);
+void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr);
+void* FXMEM_DefaultAlloc(size_t byte_size, int flags);
+void* FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags);
+void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);
+void* FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags);
+void FXMEM_DefaultFree(void* pointer, int flags);
+#define FX_Alloc(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), 0)
+#define FX_Realloc(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), 0)
+#define FX_AllocNL(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), FXMEM_NONLEAVE)
+#define FX_ReallocNL(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), FXMEM_NONLEAVE)
+#define FX_Free(pointer) FXMEM_DefaultFree(pointer, 0)
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+#if defined(_DEBUG)
+#define FX_NEW new(__FILE__, __LINE__)
+#else
+
+#define FX_NEW new
+#endif
+class CFX_Object
+{
+public:
+
+ void* operator new (size_t size, FX_LPCSTR file, int line);
+
+ void operator delete (void* p, FX_LPCSTR file, int line);
+
+ void* operator new (size_t size);
+
+ void operator delete (void* p);
+
+ void* operator new[] (size_t size, FX_LPCSTR file, int line);
+
+ void operator delete[] (void* p, FX_LPCSTR file, int line);
+
+ void* operator new[] (size_t size);
+
+ void operator delete[] (void* p);
+
+ void* operator new (size_t, void* buf)
+ {
+ return buf;
+ }
+
+ void operator delete (void*, void*) {}
+};
+#define FX_NEW_VECTOR(Pointer, Class, Count) \
+ { \
+ Pointer = FX_Alloc(Class, Count); \
+ if (Pointer) { \
+ for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \
+ } \
+ }
+#define FX_DELETE_VECTOR(Pointer, Class, Count) \
+ { \
+ for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \
+ FX_Free(Pointer); \
+ }
+class CFX_DestructObject : public CFX_Object
+{
+public:
+
+ virtual ~CFX_DestructObject() {}
+};
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _IFX_Allocator {
+
+ void* (*m_AllocDebug)(struct _IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line);
+
+ void* (*m_Alloc)(struct _IFX_Allocator* pAllocator, size_t size);
+
+ void* (*m_ReallocDebug)(struct _IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR file, int line);
+
+ void* (*m_Realloc)(struct _IFX_Allocator* pAllocator, void* p, size_t size);
+
+ void (*m_Free)(struct _IFX_Allocator* pAllocator, void* p);
+} IFX_Allocator;
+IFX_Allocator* FXMEM_GetDefAllocator();
+#ifdef __cplusplus
+}
+#endif
+#ifdef _DEBUG
+
+#define FX_Allocator_Alloc(fxAllocator, type, size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_AllocDebug((fxAllocator), (size) * sizeof(type), __FILE__, __LINE__) : (FX_Alloc(type, size)))
+
+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_ReallocDebug((fxAllocator), (ptr), (new_size) * sizeof(type), __FILE__, __LINE__) : (FX_Realloc(type, ptr, new_size)))
+#else
+
+#define FX_Allocator_Alloc(fxAllocator, type, size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_Alloc((fxAllocator), (size) * sizeof(type)) : (FX_Alloc(type, size)))
+
+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_Realloc((fxAllocator), (ptr), (new_size) * sizeof(type)) : (FX_Realloc(type, ptr, new_size)))
+#endif
+#define FX_Allocator_Free(fxAllocator, ptr) \
+ ((fxAllocator) ? (fxAllocator)->m_Free((fxAllocator), (ptr)) : (FX_Free(ptr)))
+inline void* operator new(size_t size, IFX_Allocator* fxAllocator)
+{
+ return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size);
+}
+inline void operator delete(void* ptr, IFX_Allocator* fxAllocator)
+{
+}
+#define FX_NewAtAllocator(fxAllocator) \
+ ::new(fxAllocator)
+#define FX_DeleteAtAllocator(pointer, fxAllocator, __class__) \
+ (pointer)->~__class__(); \
+ FX_Allocator_Free(fxAllocator, pointer)
+class CFX_AllocObject
+{
+public:
+
+ void* operator new (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
+#endif
+
+ void* operator new (size_t size, IFX_Allocator* pAllocator);
+
+ void operator delete (void* p);
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void* p, IFX_Allocator* pAllocator);
+#endif
+
+ void* operator new (size_t, void* buf)
+ {
+ return buf;
+ }
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void*, void*) {}
+#endif
+
+ IFX_Allocator* GetAllocator() const
+ {
+ return m_pAllocator;
+ }
+private:
+
+ void* operator new[] (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line)
+ {
+ return operator new(size, pAllocator, file, line);
+ }
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete[] (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) {}
+#endif
+
+ void* operator new[] (size_t size, IFX_Allocator* pAllocator)
+ {
+ return operator new(size, pAllocator);
+ }
+
+ void operator delete[] (void* p) {}
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete[] (void* p, IFX_Allocator* pAllocator) {}
+#endif
+protected:
+
+ IFX_Allocator* m_pAllocator;
+};
+#if defined(_DEBUG)
+#define FX_NEWAT(pAllocator) new(pAllocator, __FILE__, __LINE__)
+#else
+
+#define FX_NEWAT(pAllocator) new(pAllocator)
+#endif
+class CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object
+{
+public:
+
+ CFX_GrowOnlyPool(IFX_Allocator* pAllocator = NULL, size_t trunk_size = 16384);
+
+ ~CFX_GrowOnlyPool();
+
+ void SetAllocator(IFX_Allocator* pAllocator);
+
+ void SetTrunkSize(size_t trunk_size)
+ {
+ m_TrunkSize = trunk_size;
+ }
+
+ void* AllocDebug(size_t size, FX_LPCSTR file, int line)
+ {
+ return Alloc(size);
+ }
+
+ void* Alloc(size_t size);
+
+ void* ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)
+ {
+ return NULL;
+ }
+
+ void* Realloc(void* p, size_t new_size)
+ {
+ return NULL;
+ }
+
+ void Free(void*) {}
+
+ void FreeAll();
+private:
+
+ size_t m_TrunkSize;
+
+ void* m_pFirstTrunk;
+
+ IFX_Allocator* m_pAllocator;
+};
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define FX_FIXEDMEM_PAGESIZE (4096 * 16)
+#define FX_FIXEDMEM_MIDBLOCKSIZE (4096)
+typedef struct _FX_MEMCONFIG {
+
+ size_t nPageNum_Init8;
+
+ size_t nPageNum_Init16;
+
+ size_t nPageNum_Init32;
+
+ size_t nPageNum_More16;
+
+ size_t nPageNum_More32;
+
+ size_t nPageSize_Mid;
+
+ size_t nPageNum_InitMid;
+
+ size_t nPageNum_MoreMid;
+
+ size_t nPageSize_Large;
+
+ size_t nPageSize_Alone;
+} FX_MEMCONFIG;
+void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/include/fxcrt/fx_stream.h b/core/include/fxcrt/fx_stream.h
new file mode 100644
index 0000000000..cda5253365
--- /dev/null
+++ b/core/include/fxcrt/fx_stream.h
@@ -0,0 +1,200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_STREAM_H_
+#define _FX_STREAM_H_
+#ifndef _FX_MEMORY_H_
+#include "fx_memory.h"
+#endif
+void* FX_OpenFolder(FX_LPCSTR path);
+void* FX_OpenFolder(FX_LPCWSTR path);
+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder);
+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder);
+void FX_CloseFolder(void* handle);
+FX_WCHAR FX_GetFolderSeparator();
+FX_DEFINEHANDLE(FX_HFILE)
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FX_FILESIZE FX_INT32
+#else
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
+#define FX_FILESIZE off_t
+#endif
+#define FX_GETBYTEOFFSET32(a) 0
+#define FX_GETBYTEOFFSET40(a) 0
+#define FX_GETBYTEOFFSET48(a) 0
+#define FX_GETBYTEOFFSET56(a) 0
+#define FX_GETBYTEOFFSET24(a) ((FX_BYTE)(a>>24))
+#define FX_GETBYTEOFFSET16(a) ((FX_BYTE)(a>>16))
+#define FX_GETBYTEOFFSET8(a) ((FX_BYTE)(a>>8))
+#define FX_GETBYTEOFFSET0(a) ((FX_BYTE)(a))
+#define FX_FILEMODE_Write 0
+#define FX_FILEMODE_ReadOnly 1
+#define FX_FILEMODE_Truncate 2
+FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);
+FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);
+void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator = NULL);
+FX_FILESIZE FX_File_GetSize(FX_HFILE hFile);
+FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile);
+FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos);
+size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer);
+size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer);
+size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+FX_BOOL FX_File_Flush(FX_HFILE hFile);
+FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile);
+FX_BOOL FX_File_Exist(FX_BSTR fileName);
+FX_BOOL FX_File_Exist(FX_WSTR fileName);
+FX_BOOL FX_File_Delete(FX_BSTR fileName);
+FX_BOOL FX_File_Delete(FX_WSTR fileName);
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);
+class IFX_StreamWrite
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size) = 0;
+};
+class IFX_FileWrite : public IFX_StreamWrite
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL Flush() = 0;
+
+ virtual FX_BOOL WriteBlock(const void* pData, FX_FILESIZE offset, size_t size) = 0;
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size)
+ {
+ return WriteBlock(pData, GetSize(), size);
+ }
+};
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);
+class IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+};
+class IFX_FileRead : IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL IsEOF()
+ {
+ return FALSE;
+ }
+
+ virtual FX_FILESIZE GetPosition()
+ {
+ return 0;
+ }
+
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ return FALSE;
+ }
+
+ virtual void ClearRange() {}
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+};
+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);
+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);
+class IFX_FileStream : public IFX_FileRead, public IFX_FileWrite
+{
+public:
+
+ virtual IFX_FileStream* Retain() = 0;
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) = 0;
+ virtual FX_BOOL WriteBlock(const void* buffer, size_t size)
+ {
+ return WriteBlock(buffer, GetSize(), size);
+ }
+
+ virtual FX_BOOL Flush() = 0;
+};
+IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);
+IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);
+class IFX_MemoryStream : public IFX_FileStream
+{
+public:
+
+ virtual FX_BOOL IsConsecutive() const = 0;
+
+ virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) = 0;
+
+ virtual FX_LPBYTE GetBuffer() const = 0;
+
+ virtual void AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) = 0;
+
+ virtual void DetachBuffer() = 0;
+};
+IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE, IFX_Allocator* pAllocator = NULL);
+IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE, IFX_Allocator* pAllocator = NULL);
+class IFX_BufferRead : public IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) = 0;
+
+ virtual FX_LPCBYTE GetBlockBuffer() = 0;
+
+ virtual size_t GetBlockSize() = 0;
+
+ virtual FX_FILESIZE GetBlockOffset() = 0;
+};
+#endif
diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h
new file mode 100644
index 0000000000..563964cdf7
--- /dev/null
+++ b/core/include/fxcrt/fx_string.h
@@ -0,0 +1,870 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_STRING_H_
+#define _FX_STRING_H_
+class CFX_ByteStringC;
+class CFX_ByteString;
+class CFX_WideStringC;
+class CFX_WideString;
+struct CFX_CharMap;
+class CFX_BinaryBuf;
+typedef int FX_STRSIZE;
+class CFX_ByteStringL;
+class CFX_WideStringL;
+class CFX_ByteStringC : public CFX_Object
+{
+public:
+
+ CFX_ByteStringC()
+ {
+ m_Ptr = NULL;
+ m_Length = 0;
+ }
+
+ CFX_ByteStringC(FX_LPCBYTE ptr, FX_STRSIZE size)
+ {
+ m_Ptr = ptr;
+ m_Length = size;
+ }
+
+ CFX_ByteStringC(FX_LPCSTR ptr)
+ {
+ m_Ptr = (FX_LPCBYTE)ptr;
+ m_Length = ptr ? (FX_STRSIZE)FXSYS_strlen(ptr) : 0;
+ }
+
+ CFX_ByteStringC(FX_CHAR& ch)
+ {
+ m_Ptr = (FX_LPCBYTE)&ch;
+ m_Length = 1;
+ }
+
+ CFX_ByteStringC(FX_LPCSTR ptr, FX_STRSIZE len)
+ {
+ m_Ptr = (FX_LPCBYTE)ptr;
+ if (len == -1) {
+ m_Length = (FX_STRSIZE)FXSYS_strlen(ptr);
+ } else {
+ m_Length = len;
+ }
+ }
+
+ CFX_ByteStringC(const CFX_ByteStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ }
+
+ CFX_ByteStringC(const CFX_ByteString& src);
+
+ CFX_ByteStringC& operator = (FX_LPCSTR src)
+ {
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = (FX_STRSIZE)FXSYS_strlen(src);
+ return *this;
+ }
+
+ CFX_ByteStringC& operator = (const CFX_ByteStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ return *this;
+ }
+
+ CFX_ByteStringC& operator = (const CFX_ByteString& src);
+
+ bool operator == (const CFX_ByteStringC& str) const
+ {
+ return str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) == 0;
+ }
+
+ bool operator != (const CFX_ByteStringC& str) const
+ {
+ return str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) != 0;
+ }
+#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))
+
+ FX_DWORD GetID(FX_STRSIZE start_pos = 0) const;
+
+ FX_LPCBYTE GetPtr() const
+ {
+ return m_Ptr;
+ }
+
+ FX_LPCSTR GetCStr() const
+ {
+ return (FX_LPCSTR)m_Ptr;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_Length;
+ }
+
+ bool IsEmpty() const
+ {
+ return m_Length == 0;
+ }
+
+ operator FX_LPCBYTE() const
+ {
+ return m_Ptr;
+ }
+
+ FX_BYTE GetAt(FX_STRSIZE index) const
+ {
+ return m_Ptr[index];
+ }
+
+ CFX_ByteStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
+ {
+ if (index < 0) {
+ index = 0;
+ }
+ if (index > m_Length) {
+ return CFX_ByteStringC();
+ }
+ if (count < 0 || count > m_Length - index) {
+ count = m_Length - index;
+ }
+ return CFX_ByteStringC(m_Ptr + index, count);
+ }
+protected:
+
+ FX_LPCBYTE m_Ptr;
+
+ FX_STRSIZE m_Length;
+private:
+
+ void* operator new (size_t) throw()
+ {
+ return NULL;
+ }
+};
+typedef const CFX_ByteStringC& FX_BSTR;
+#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)
+struct CFX_StringData {
+
+ long m_nRefs;
+
+ FX_STRSIZE m_nDataLength;
+
+ FX_STRSIZE m_nAllocLength;
+
+ FX_CHAR m_String[1];
+};
+class CFX_ByteString : public CFX_Object
+{
+public:
+
+ CFX_ByteString()
+ {
+ m_pData = NULL;
+ }
+
+ CFX_ByteString(const CFX_ByteString& str);
+
+ CFX_ByteString(char ch);
+
+ CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);
+
+ CFX_ByteString(FX_LPCBYTE ptr, FX_STRSIZE len);
+
+ CFX_ByteString(FX_BSTR bstrc);
+
+ CFX_ByteString(FX_BSTR bstrc1, FX_BSTR bstrc2);
+
+ ~CFX_ByteString();
+
+ static CFX_ByteString FromUnicode(FX_LPCWSTR ptr, FX_STRSIZE len = -1);
+
+ static CFX_ByteString FromUnicode(const CFX_WideString& str);
+
+ operator FX_LPCSTR() const
+ {
+ return m_pData ? m_pData->m_String : "";
+ }
+
+ operator FX_LPCBYTE() const
+ {
+ return m_pData ? (FX_LPCBYTE)m_pData->m_String : NULL;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_pData ? m_pData->m_nDataLength : 0;
+ }
+
+ bool IsEmpty() const
+ {
+ return !GetLength();
+ }
+
+ int Compare(FX_BSTR str) const;
+
+
+ bool Equal(FX_BSTR str) const;
+
+
+ bool EqualNoCase(FX_BSTR str) const;
+
+ bool operator == (FX_LPCSTR str) const
+ {
+ return Equal(str);
+ }
+
+ bool operator == (FX_BSTR str) const
+ {
+ return Equal(str);
+ }
+
+ bool operator == (const CFX_ByteString& str) const;
+
+ bool operator != (FX_LPCSTR str) const
+ {
+ return !Equal(str);
+ }
+
+ bool operator != (FX_BSTR str) const
+ {
+ return !Equal(str);
+ }
+
+ bool operator != (const CFX_ByteString& str) const
+ {
+ return !operator==(str);
+ }
+
+ void Empty();
+
+ const CFX_ByteString& operator = (FX_LPCSTR str);
+
+ const CFX_ByteString& operator = (FX_BSTR bstrc);
+
+ const CFX_ByteString& operator = (const CFX_ByteString& stringSrc);
+
+ const CFX_ByteString& operator = (const CFX_BinaryBuf& buf);
+
+ void Load(FX_LPCBYTE str, FX_STRSIZE len);
+
+ const CFX_ByteString& operator += (FX_CHAR ch);
+
+ const CFX_ByteString& operator += (FX_LPCSTR str);
+
+ const CFX_ByteString& operator += (const CFX_ByteString& str);
+
+ const CFX_ByteString& operator += (FX_BSTR bstrc);
+
+ FX_BYTE GetAt(FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ FX_BYTE operator[](FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ void SetAt(FX_STRSIZE nIndex, FX_CHAR ch);
+
+ FX_STRSIZE Insert(FX_STRSIZE index, FX_CHAR ch);
+
+ FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
+
+
+ void Format(FX_LPCSTR lpszFormat, ... );
+
+ void FormatV(FX_LPCSTR lpszFormat, va_list argList);
+
+
+ void Reserve(FX_STRSIZE len);
+
+ FX_LPSTR GetBuffer(FX_STRSIZE len);
+
+ FX_LPSTR LockBuffer();
+
+ void ReleaseBuffer(FX_STRSIZE len = -1);
+
+ CFX_ByteString Mid(FX_STRSIZE first) const;
+
+ CFX_ByteString Mid(FX_STRSIZE first, FX_STRSIZE count) const;
+
+ CFX_ByteString Left(FX_STRSIZE count) const;
+
+ CFX_ByteString Right(FX_STRSIZE count) const;
+
+ FX_STRSIZE Find(FX_BSTR lpszSub, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Find(FX_CHAR ch, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE ReverseFind(FX_CHAR ch) const;
+
+ void MakeLower();
+
+ void MakeUpper();
+
+ void TrimRight();
+
+ void TrimRight(FX_CHAR chTarget);
+
+ void TrimRight(FX_BSTR lpszTargets);
+
+ void TrimLeft();
+
+ void TrimLeft(FX_CHAR chTarget);
+
+ void TrimLeft(FX_BSTR lpszTargets);
+
+ FX_STRSIZE Replace(FX_BSTR lpszOld, FX_BSTR lpszNew);
+
+ FX_STRSIZE Remove(FX_CHAR ch);
+
+ CFX_WideString UTF8Decode() const;
+
+ void ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);
+
+ FX_DWORD GetID(FX_STRSIZE start_pos = 0) const;
+
+ static CFX_ByteString LoadFromFile(FX_BSTR file_path);
+#define FXFORMAT_SIGNED 1
+#define FXFORMAT_HEX 2
+#define FXFORMAT_CAPITAL 4
+
+ static CFX_ByteString FormatInteger(int i, FX_DWORD flags = 0);
+
+ static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0);
+protected:
+
+ struct CFX_StringData* m_pData;
+ void AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
+ void AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
+ void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);
+ void ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
+ void CopyBeforeWrite();
+ void AllocBeforeWrite(FX_STRSIZE nLen);
+};
+inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)
+{
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = src.GetLength();
+}
+inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)
+{
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = src.GetLength();
+ return *this;
+}
+
+inline CFX_ByteString operator + (FX_BSTR str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, FX_LPCSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_LPCSTR str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, FX_CHAR ch)
+{
+ return CFX_ByteString(str1, CFX_ByteStringC(ch));
+}
+inline CFX_ByteString operator + (FX_CHAR ch, FX_BSTR str2)
+{
+ return CFX_ByteString(ch, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)
+{
+ return CFX_ByteString(str1, CFX_ByteStringC(ch));
+}
+inline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(ch, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_LPCSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_LPCSTR str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+class CFX_StringBufBase : public CFX_Object
+{
+public:
+
+ CFX_StringBufBase(FX_STRSIZE limit)
+ {
+ m_Size = 0;
+ m_Limit = limit;
+ }
+
+ FX_CHAR* GetPtr() const
+ {
+ return (FX_CHAR*)(this + 1);
+ }
+
+ FX_STRSIZE GetSize() const
+ {
+ return m_Size;
+ }
+
+ void Empty()
+ {
+ m_Size = 0;
+ }
+
+ void Copy(FX_BSTR str);
+
+ void Append(FX_BSTR str);
+
+ void Append(int i, FX_DWORD flags = 0);
+
+ CFX_ByteStringC GetStringC() const
+ {
+ return CFX_ByteStringC((FX_CHAR*)(this + 1), m_Size);
+ }
+
+ CFX_ByteString GetString() const
+ {
+ return CFX_ByteString((FX_CHAR*)(this + 1), m_Size);
+ }
+protected:
+
+ FX_STRSIZE m_Limit;
+
+ FX_STRSIZE m_Size;
+};
+template<FX_STRSIZE limit>
+class CFX_StringBufTemplate : public CFX_StringBufBase
+{
+public:
+
+ CFX_StringBufTemplate() : CFX_StringBufBase(limit) {}
+
+ FX_CHAR m_Buffer[limit];
+};
+typedef CFX_StringBufTemplate<256> CFX_StringBuf256;
+class CFX_WideStringC : public CFX_Object
+{
+public:
+
+ CFX_WideStringC()
+ {
+ m_Ptr = NULL;
+ m_Length = 0;
+ }
+
+ CFX_WideStringC(FX_LPCWSTR ptr)
+ {
+ m_Ptr = ptr;
+ m_Length = ptr ? (FX_STRSIZE)FXSYS_wcslen(ptr) : 0;
+ }
+
+ CFX_WideStringC(FX_WCHAR& ch)
+ {
+ m_Ptr = &ch;
+ m_Length = 1;
+ }
+
+ CFX_WideStringC(FX_LPCWSTR ptr, FX_STRSIZE len)
+ {
+ m_Ptr = ptr;
+ if (len == -1) {
+ m_Length = (FX_STRSIZE)FXSYS_wcslen(ptr);
+ } else {
+ m_Length = len;
+ }
+ }
+
+ CFX_WideStringC(const CFX_WideStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ }
+
+ CFX_WideStringC(const CFX_WideString& src);
+
+ CFX_WideStringC& operator = (FX_LPCWSTR src)
+ {
+ m_Ptr = src;
+ m_Length = (FX_STRSIZE)FXSYS_wcslen(src);
+ return *this;
+ }
+
+ CFX_WideStringC& operator = (const CFX_WideStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ return *this;
+ }
+
+ CFX_WideStringC& operator = (const CFX_WideString& src);
+
+ bool operator == (const CFX_WideStringC& str) const
+ {
+ return str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) == 0;
+ }
+
+ bool operator != (const CFX_WideStringC& str) const
+ {
+ return str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) != 0;
+ }
+
+ FX_LPCWSTR GetPtr() const
+ {
+ return m_Ptr;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_Length;
+ }
+
+ bool IsEmpty() const
+ {
+ return m_Length == 0;
+ }
+
+ FX_WCHAR GetAt(FX_STRSIZE index) const
+ {
+ return m_Ptr[index];
+ }
+
+ CFX_WideStringC Left(FX_STRSIZE count) const
+ {
+ if (count < 1) {
+ return CFX_WideStringC();
+ }
+ if (count > m_Length) {
+ count = m_Length;
+ }
+ return CFX_WideStringC(m_Ptr, count);
+ }
+
+ CFX_WideStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
+ {
+ if (index < 0) {
+ index = 0;
+ }
+ if (index > m_Length) {
+ return CFX_WideStringC();
+ }
+ if (count < 0 || count > m_Length - index) {
+ count = m_Length - index;
+ }
+ return CFX_WideStringC(m_Ptr + index, count);
+ }
+
+ CFX_WideStringC Right(FX_STRSIZE count) const
+ {
+ if (count < 1) {
+ return CFX_WideStringC();
+ }
+ if (count > m_Length) {
+ count = m_Length;
+ }
+ return CFX_WideStringC(m_Ptr + m_Length - count, count);
+ }
+protected:
+
+ FX_LPCWSTR m_Ptr;
+
+ FX_STRSIZE m_Length;
+private:
+
+ void* operator new (size_t) throw()
+ {
+ return NULL;
+ }
+};
+typedef const CFX_WideStringC& FX_WSTR;
+#define FX_WSTRC(wstr) CFX_WideStringC((FX_LPCWSTR)wstr, sizeof(wstr) / sizeof(FX_WCHAR) - 1)
+struct CFX_StringDataW {
+
+ long m_nRefs;
+
+ FX_STRSIZE m_nDataLength;
+
+ FX_STRSIZE m_nAllocLength;
+
+ FX_WCHAR m_String[1];
+};
+class CFX_WideString : public CFX_Object
+{
+public:
+
+ CFX_WideString()
+ {
+ m_pData = NULL;
+ }
+
+ CFX_WideString(const CFX_WideString& str);
+
+ CFX_WideString(FX_LPCWSTR ptr, FX_STRSIZE len = -1)
+ {
+ InitStr(ptr, len);
+ }
+
+ CFX_WideString(FX_WCHAR ch);
+
+ CFX_WideString(const CFX_WideStringC& str);
+
+ CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);
+
+ ~CFX_WideString();
+
+ static CFX_WideString FromLocal(const char* str, FX_STRSIZE len = -1);
+
+ static CFX_WideString FromUTF8(const char* str, FX_STRSIZE len = -1);
+
+ static CFX_WideString FromUTF16LE(const unsigned short* str, FX_STRSIZE len = -1);
+
+ operator FX_LPCWSTR() const
+ {
+ return m_pData ? m_pData->m_String : (FX_WCHAR*)L"";
+ }
+
+ void Empty();
+
+
+ FX_BOOL IsEmpty() const
+ {
+ return !GetLength();
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_pData ? m_pData->m_nDataLength : 0;
+ }
+
+ const CFX_WideString& operator = (FX_LPCWSTR str);
+
+ const CFX_WideString& operator =(const CFX_WideString& stringSrc);
+
+ const CFX_WideString& operator =(const CFX_WideStringC& stringSrc);
+
+ const CFX_WideString& operator += (FX_LPCWSTR str);
+
+ const CFX_WideString& operator += (FX_WCHAR ch);
+
+ const CFX_WideString& operator += (const CFX_WideString& str);
+
+ const CFX_WideString& operator += (const CFX_WideStringC& str);
+
+ FX_WCHAR GetAt(FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ FX_WCHAR operator[](FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ void SetAt(FX_STRSIZE nIndex, FX_WCHAR ch);
+
+ int Compare(FX_LPCWSTR str) const;
+
+ int Compare(const CFX_WideString& str) const;
+
+ int CompareNoCase(FX_LPCWSTR str) const;
+
+ bool Equal(const CFX_WideStringC& str) const;
+
+ CFX_WideString Mid(FX_STRSIZE first) const;
+
+ CFX_WideString Mid(FX_STRSIZE first, FX_STRSIZE count) const;
+
+ CFX_WideString Left(FX_STRSIZE count) const;
+
+ CFX_WideString Right(FX_STRSIZE count) const;
+
+ FX_STRSIZE Insert(FX_STRSIZE index, FX_WCHAR ch);
+
+ FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
+
+ void Format(FX_LPCWSTR lpszFormat, ... );
+
+ void FormatV(FX_LPCWSTR lpszFormat, va_list argList);
+
+ void MakeLower();
+
+ void MakeUpper();
+
+ void TrimRight();
+
+ void TrimRight(FX_WCHAR chTarget);
+
+ void TrimRight(FX_LPCWSTR lpszTargets);
+
+ void TrimLeft();
+
+ void TrimLeft(FX_WCHAR chTarget);
+
+ void TrimLeft(FX_LPCWSTR lpszTargets);
+
+ void Reserve(FX_STRSIZE len);
+
+ FX_LPWSTR GetBuffer(FX_STRSIZE len);
+
+ FX_LPWSTR LockBuffer();
+
+ void ReleaseBuffer(FX_STRSIZE len = -1);
+
+ int GetInteger() const;
+
+ FX_FLOAT GetFloat() const;
+
+ FX_STRSIZE Find(FX_LPCWSTR lpszSub, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Find(FX_WCHAR ch, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew);
+
+ FX_STRSIZE Remove(FX_WCHAR ch);
+
+ CFX_ByteString UTF8Encode() const;
+
+ CFX_ByteString UTF16LE_Encode(FX_BOOL bTerminate = TRUE) const;
+
+ void ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
+protected:
+ void InitStr(FX_LPCWSTR ptr, int len);
+
+ CFX_StringDataW* m_pData;
+ void CopyBeforeWrite();
+ void AllocBeforeWrite(FX_STRSIZE nLen);
+ void ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
+ void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);
+ void AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
+ void AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
+};
+inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)
+{
+ m_Ptr = (FX_LPCWSTR)src;
+ m_Length = src.GetLength();
+}
+inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)
+{
+ m_Ptr = (FX_LPCWSTR)src;
+ m_Length = src.GetLength();
+ return *this;
+}
+
+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_LPCWSTR str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)
+{
+ return CFX_WideString(str1, CFX_WideStringC(ch));
+}
+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(ch, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)
+{
+ return CFX_WideString(str1, CFX_WideStringC(ch));
+}
+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)
+{
+ return CFX_WideString(ch, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, FX_LPCWSTR str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+
+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2);
+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2);
+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2);
+bool operator== (const CFX_WideString& s1, FX_LPCWSTR s2);
+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2);
+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2);
+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2);
+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2);
+bool operator!= (const CFX_WideString& s1, FX_LPCWSTR s2);
+bool operator!=(FX_LPCWSTR s1, const CFX_WideString& s2);
+FX_FLOAT FX_atof(FX_BSTR str);
+void FX_atonum(FX_BSTR str, FX_BOOL& bInteger, void* pData);
+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
+CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);
+inline CFX_ByteString FX_UTF8Encode(FX_WSTR wsStr)
+{
+ return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());
+}
+inline CFX_ByteString FX_UTF8Encode(const CFX_WideString &wsStr)
+{
+ return FX_UTF8Encode((FX_LPCWSTR)wsStr, wsStr.GetLength());
+}
+class CFX_ByteStringL : public CFX_ByteStringC
+{
+public:
+ CFX_ByteStringL() : CFX_ByteStringC() {}
+ ~CFX_ByteStringL() {}
+
+ void Empty(IFX_Allocator* pAllocator);
+ FX_LPSTR AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator);
+
+ void Set(FX_BSTR src, IFX_Allocator* pAllocator);
+};
+class CFX_WideStringL : public CFX_WideStringC
+{
+public:
+ CFX_WideStringL() : CFX_WideStringC() {}
+ ~CFX_WideStringL() {}
+
+ void Empty(IFX_Allocator* pAllocator);
+ void Set(FX_WSTR src, IFX_Allocator* pAllocator);
+
+ int GetInteger() const;
+ FX_FLOAT GetFloat() const;
+
+ void TrimRight(FX_LPCWSTR lpszTargets);
+};
+void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator = NULL);
+#endif
diff --git a/core/include/fxcrt/fx_system.h b/core/include/fxcrt/fx_system.h
new file mode 100644
index 0000000000..f72be0ffcb
--- /dev/null
+++ b/core/include/fxcrt/fx_system.h
@@ -0,0 +1,279 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SYSTEM_H_
+#define _FX_SYSTEM_H_
+#define _FX_WIN32_DESKTOP_ 1
+#define _FX_LINUX_DESKTOP_ 4
+#define _FX_MACOSX_ 7
+#define _FX_ANDROID_ 12
+#define _FXM_PLATFORM_WINDOWS_ 1
+#define _FXM_PLATFORM_LINUX_ 2
+#define _FXM_PLATFORM_APPLE_ 3
+#define _FXM_PLATFORM_ANDROID_ 4
+#ifndef _FX_OS_
+#if defined(__ANDROID__)
+#define _FX_OS_ _FX_ANDROID_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
+#elif defined(_WIN32) || defined(_WIN64)
+#define _FX_OS_ _FX_WIN32_DESKTOP_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
+#elif defined(__linux__)
+#define _FX_OS_ _FX_LINUX_DESKTOP_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
+#elif defined(__APPLE__)
+#define _FX_OS_ _FX_MACOSX_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
+#endif
+#endif
+#if !defined(_FX_OS_) || _FX_OS_ == 0
+#error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.
+#endif
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define _CRT_SECURE_NO_WARNINGS
+#include <windows.h>
+#endif
+#define _FX_W32_ 1
+#define _FX_W64_ 2
+#ifndef _FX_WORDSIZE_
+#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64
+#define _FX_WORDSIZE_ _FX_W64_
+#else
+#define _FX_WORDSIZE_ _FX_W32_
+#endif
+#endif
+#include <stddef.h>
+#include <stdarg.h>
+#include <setjmp.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <wchar.h>
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include <libkern/OSAtomic.h>
+#if _FX_OS_ == _FX_MACOSX_
+#include <Carbon/Carbon.h>
+#elif _FX_OS_ == _FX_IOS_
+#include <CoreText/CoreText.h>
+#include <CoreGraphics/CoreGraphics.h>
+#endif
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef void* FX_LPVOID;
+typedef void const* FX_LPCVOID;
+typedef void* FX_POSITION;
+typedef signed char FX_INT8;
+typedef unsigned char FX_UINT8;
+typedef unsigned char FX_BYTE;
+typedef unsigned char* FX_LPBYTE;
+typedef unsigned char const* FX_LPCBYTE;
+typedef short FX_INT16;
+typedef unsigned short FX_UINT16;
+typedef short FX_SHORT;
+typedef unsigned short FX_WORD;
+typedef unsigned short* FX_LPWORD;
+typedef unsigned short const* FX_LPCWORD;
+typedef int FX_INT32;
+typedef float FX_FLOAT;
+typedef int FX_BOOL;
+typedef int FX_ERR;
+#define FX_SUCCEEDED(Status) ((FX_ERR)(Status) >= 0)
+#define FX_FAILED(Status) ((FX_ERR)(Status) < 0)
+typedef char FX_CHAR;
+typedef char* FX_LPSTR;
+typedef char const* FX_LPCSTR;
+typedef unsigned int FX_DWORD;
+typedef unsigned int* FX_LPDWORD;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+typedef __int64 FX_INT64;
+typedef unsigned __int64 FX_UINT64;
+#else
+typedef long long int FX_INT64;
+typedef unsigned long long FX_UINT64;
+#endif
+#if _FX_WORDSIZE_ == _FX_W64_
+typedef FX_INT64 FX_INTPTR;
+typedef FX_UINT64 FX_UINTPTR;
+#else
+typedef int FX_INTPTR;
+typedef unsigned int FX_UINTPTR;
+#endif
+typedef wchar_t FX_WCHAR;
+typedef wchar_t* FX_LPWSTR;
+typedef wchar_t const* FX_LPCWSTR;
+typedef FX_DWORD FX_UINT32;
+typedef FX_UINT64 FX_QWORD;
+#define FX_DEFINEHANDLE(name) typedef struct _##name {FX_LPVOID pData;} * name;
+#if defined(DEBUG) && !defined(_DEBUG)
+#define _DEBUG
+#endif
+#ifndef TRUE
+
+#define TRUE 1
+#endif
+#ifndef FALSE
+
+#define FALSE 0
+#endif
+#ifndef NULL
+
+#define NULL 0
+#endif
+#define FXSYS_assert assert
+#ifndef ASSERT
+#ifdef _DEBUG
+#define ASSERT FXSYS_assert
+#else
+
+#define ASSERT(a)
+#endif
+#endif
+#define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define FX_PI 3.1415926535897932384626433832795f
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_snprintf _snprintf
+#else
+#define FXSYS_snprintf snprintf
+#endif
+#define FXSYS_sprintf sprintf
+#define FXSYS_vsprintf vsprintf
+#define FXSYS_strchr strchr
+#define FXSYS_strlen strlen
+#define FXSYS_strncmp strncmp
+#define FXSYS_strcmp strcmp
+#define FXSYS_strcpy strcpy
+#define FXSYS_strncpy strncpy
+#define FXSYS_strstr strstr
+#define FXSYS_FILE FILE
+#define FXSYS_fopen fopen
+#define FXSYS_fclose fclose
+#define FXSYS_SEEK_END SEEK_END
+#define FXSYS_SEEK_SET SEEK_SET
+#define FXSYS_fseek fseek
+#define FXSYS_ftell ftell
+#define FXSYS_fread fread
+#define FXSYS_fwrite fwrite
+#define FXSYS_fprintf fprintf
+#define FXSYS_fflush fflush
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifdef _NATIVE_WCHAR_T_DEFINED
+#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
+#else
+#define FXSYS_wfopen _wfopen
+#endif
+#else
+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
+#endif
+
+#define FXSYS_wcslen wcslen
+#define FXSYS_wcscmp wcscmp
+#define FXSYS_wcschr wcschr
+#define FXSYS_wcsstr wcsstr
+#define FXSYS_wcsncmp wcsncmp
+#define FXSYS_vswprintf vswprintf
+#define FXSYS_mbstowcs mbstowcs
+#define FXSYS_wcstombs wcstombs
+#define FXSYS_memcmp memcmp
+#define FXSYS_memcpy memcpy
+#define FXSYS_memmove memmove
+#define FXSYS_memset memset
+#define FXSYS_memchr memchr
+#define FXSYS_qsort qsort
+#define FXSYS_bsearch bsearch
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_GetACP GetACP
+#define FXSYS_itoa _itoa
+#define FXSYS_strlwr _strlwr
+#define FXSYS_strupr _strupr
+#define FXSYS_stricmp _stricmp
+#ifdef _NATIVE_WCHAR_T_DEFINED
+#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
+#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
+#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
+#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
+#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
+#else
+#define FXSYS_wcsicmp _wcsicmp
+#define FXSYS_WideCharToMultiByte WideCharToMultiByte
+#define FXSYS_MultiByteToWideChar MultiByteToWideChar
+#define FXSYS_wcslwr _wcslwr
+#define FXSYS_wcsupr _wcsupr
+#endif
+#define FXSYS_GetFullPathName GetFullPathName
+#define FXSYS_GetModuleFileName GetModuleFileName
+#else
+int FXSYS_GetACP(void);
+char* FXSYS_itoa(int value, char* string, int radix);
+int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
+ char* buf, int buflen, const char* default_str, int* pUseDefault);
+int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
+ wchar_t* buf, int buflen);
+FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
+FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
+char* FXSYS_strlwr(char* str);
+char* FXSYS_strupr(char* str);
+int FXSYS_stricmp(const char*, const char*);
+int FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
+wchar_t* FXSYS_wcslwr(wchar_t* str);
+wchar_t* FXSYS_wcsupr(wchar_t* str);
+#endif
+#define FXSYS_memcpy32 FXSYS_memcpy
+#define FXSYS_memcmp32 FXSYS_memcmp
+#define FXSYS_memset32 FXSYS_memset
+#define FXSYS_memset8 FXSYS_memset
+#define FXSYS_memmove32 FXSYS_memmove
+#ifdef __cplusplus
+}
+#endif
+#include <math.h>
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_pow(a, b) (FX_FLOAT)powf(a, b)
+#else
+#define FXSYS_pow(a, b) (FX_FLOAT)pow(a, b)
+#endif
+#define FXSYS_sqrt(a) (FX_FLOAT)sqrt(a)
+#define FXSYS_fabs(a) (FX_FLOAT)fabs(a)
+#define FXSYS_atan2(a, b) (FX_FLOAT)atan2(a, b)
+#define FXSYS_ceil(a) (FX_FLOAT)ceil(a)
+#define FXSYS_floor(a) (FX_FLOAT)floor(a)
+#define FXSYS_cos(a) (FX_FLOAT)cos(a)
+#define FXSYS_acos(a) (FX_FLOAT)acos(a)
+#define FXSYS_sin(a) (FX_FLOAT)sin(a)
+#define FXSYS_log(a) (FX_FLOAT)log(a)
+#define FXSYS_log10(a) (FX_FLOAT)log10(a)
+#define FXSYS_fmod(a, b) (FX_FLOAT)fmod(a, b)
+#define FXSYS_abs abs
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define _FX_LSB_FIRST_
+#define FXDWORD_FROM_LSBFIRST(i) (i)
+#define FXDWORD_FROM_MSBFIRST(i) (((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))
+#define FXDWORD_GET_LSBFIRST(p) ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
+#define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
+#define FXSYS_HIBYTE(word) ((FX_BYTE)((word) >> 8))
+#define FXSYS_LOBYTE(word) ((FX_BYTE)(word))
+#define FXSYS_HIWORD(dword) ((FX_WORD)((dword) >> 16))
+#define FXSYS_LOWORD(dword) ((FX_WORD)(dword))
+FX_INT32 FXSYS_atoi(FX_LPCSTR str);
+FX_INT32 FXSYS_wtoi(FX_LPCWSTR str);
+FX_INT64 FXSYS_atoi64(FX_LPCSTR str);
+FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str);
+FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
+FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
+int FXSYS_round(FX_FLOAT f);
+#define FXSYS_Mul(a, b) ((a) * (b))
+#define FXSYS_Div(a, b) ((a) / (b))
+#define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
+#define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/core/include/fxcrt/fx_ucd.h b/core/include/fxcrt/fx_ucd.h
new file mode 100644
index 0000000000..447d555a4b
--- /dev/null
+++ b/core/include/fxcrt/fx_ucd.h
@@ -0,0 +1,112 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_UNICODE_
+#define _FX_UNICODE_
+enum FX_CHARBREAKPROP {
+ FX_CBP_OP = 0,
+ FX_CBP_CL = 1,
+ FX_CBP_QU = 2,
+ FX_CBP_GL = 3,
+ FX_CBP_NS = 4,
+ FX_CBP_EX = 5,
+ FX_CBP_SY = 6,
+ FX_CBP_IS = 7,
+ FX_CBP_PR = 8,
+ FX_CBP_PO = 9,
+ FX_CBP_NU = 10,
+ FX_CBP_AL = 11,
+ FX_CBP_ID = 12,
+ FX_CBP_IN = 13,
+ FX_CBP_HY = 14,
+ FX_CBP_BA = 15,
+ FX_CBP_BB = 16,
+ FX_CBP_B2 = 17,
+ FX_CBP_ZW = 18,
+ FX_CBP_CM = 19,
+ FX_CBP_WJ = 20,
+ FX_CBP_H2 = 21,
+ FX_CBP_H3 = 22,
+ FX_CBP_JL = 23,
+ FX_CBP_JV = 24,
+ FX_CBP_JT = 25,
+
+ FX_CBP_BK = 26,
+ FX_CBP_CR = 27,
+ FX_CBP_LF = 28,
+ FX_CBP_NL = 29,
+ FX_CBP_SA = 30,
+ FX_CBP_SG = 31,
+ FX_CBP_CB = 32,
+ FX_CBP_XX = 33,
+ FX_CBP_AI = 34,
+ FX_CBP_SP = 35,
+ FX_CBP_TB = 37,
+ FX_CBP_NONE = 36,
+};
+#define FX_BIDICLASSBITS 6
+#define FX_BIDICLASSBITSMASK (31 << FX_BIDICLASSBITS)
+enum FX_BIDICLASS {
+ FX_BIDICLASS_ON = 0,
+ FX_BIDICLASS_L = 1,
+ FX_BIDICLASS_R = 2,
+ FX_BIDICLASS_AN = 3,
+ FX_BIDICLASS_EN = 4,
+ FX_BIDICLASS_AL = 5,
+ FX_BIDICLASS_NSM = 6,
+ FX_BIDICLASS_CS = 7,
+ FX_BIDICLASS_ES = 8,
+ FX_BIDICLASS_ET = 9,
+ FX_BIDICLASS_BN = 10,
+ FX_BIDICLASS_S = 11,
+ FX_BIDICLASS_WS = 12,
+ FX_BIDICLASS_B = 13,
+ FX_BIDICLASS_RLO = 14,
+ FX_BIDICLASS_RLE = 15,
+ FX_BIDICLASS_LRO = 16,
+ FX_BIDICLASS_LRE = 17,
+ FX_BIDICLASS_PDF = 18,
+ FX_BIDICLASS_N = FX_BIDICLASS_ON,
+};
+#define FX_CHARTYPEBITS 11
+#define FX_CHARTYPEBITSMASK (15 << FX_CHARTYPEBITS)
+enum FX_CHARTYPE {
+ FX_CHARTYPE_Unknown = 0,
+ FX_CHARTYPE_Tab = (1 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Space = (2 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Control = (3 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Combination = (4 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Numeric = (5 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Normal = (6 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_ArabicAlef = (7 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_ArabicSpecial = (8 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_ArabicDistortion = (9 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_ArabicNormal = (10 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_ArabicForm = (11 << FX_CHARTYPEBITS),
+ FX_CHARTYPE_Arabic = (12 << FX_CHARTYPEBITS),
+};
+typedef struct _FX_CHARPROPERTIES {
+ union {
+ struct {
+ FX_DWORD dwBreakType : 6;
+ FX_DWORD dwBidiClass : 5;
+ FX_DWORD dwCharType : 4;
+ FX_DWORD dwRotation : 1;
+ FX_DWORD dwCJKSpecial : 1;
+ FX_DWORD dwVertIndex : 6;
+ FX_DWORD dwBidiIndex : 9;
+ };
+ FX_DWORD dwCharProps;
+ };
+} FX_CHARPROPERTIES;
+FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch);
+FX_BOOL FX_IsCtrlCode(FX_WCHAR ch);
+FX_BOOL FX_IsRotationCode(FX_WCHAR ch);
+FX_BOOL FX_IsCombinationChar(FX_WCHAR wch);
+FX_BOOL FX_IsBidiChar(FX_WCHAR wch);
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical);
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical);
+#endif
diff --git a/core/include/fxcrt/fx_xml.h b/core/include/fxcrt/fx_xml.h
new file mode 100644
index 0000000000..1217677740
--- /dev/null
+++ b/core/include/fxcrt/fx_xml.h
@@ -0,0 +1,209 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_XML_H_
+#define _FX_XML_H_
+#ifndef _FX_BASIC_H_
+#include "fx_basic.h"
+#endif
+class CXML_AttrItem : public CFX_Object
+{
+public:
+ CFX_ByteStringL m_QSpaceName;
+ CFX_ByteStringL m_AttrName;
+ CFX_WideStringL m_Value;
+
+ void Empty(IFX_Allocator* pAllocator = NULL)
+ {
+ m_QSpaceName.Empty(pAllocator);
+ m_AttrName.Empty(pAllocator);
+ m_Value.Empty(pAllocator);
+ }
+};
+class CXML_AttrMap : public CFX_Object
+{
+public:
+ CXML_AttrMap()
+ {
+ m_pMap = NULL;
+ }
+ ~CXML_AttrMap()
+ {
+ RemoveAll(NULL);
+ }
+ const CFX_WideStringL* Lookup(FX_BSTR space, FX_BSTR name) const;
+ void SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator = NULL);
+ void RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator = NULL);
+ void RemoveAll(IFX_Allocator* pAllocator = NULL);
+ int GetSize() const;
+ CXML_AttrItem& GetAt(int index) const;
+ CFX_ObjectArray<CXML_AttrItem>* m_pMap;
+};
+class CXML_Content : public CFX_Object
+{
+public:
+ CXML_Content() : m_bCDATA(FALSE), m_Content() {}
+ ~CXML_Content()
+ {
+ Empty(NULL);
+ }
+ void Empty(IFX_Allocator* pAllocator = NULL)
+ {
+ m_Content.Empty(pAllocator);
+ }
+ void Set(FX_BOOL bCDATA, FX_WSTR content, IFX_Allocator* pAllocator = NULL)
+ {
+ m_bCDATA = bCDATA;
+ m_Content.Set(content, pAllocator);
+ }
+ FX_BOOL m_bCDATA;
+ CFX_WideStringL m_Content;
+};
+class CXML_Element : public CFX_Object
+{
+public:
+
+ static CXML_Element* Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ static CXML_Element* Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ static CXML_Element* Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(IFX_Allocator* pAllocator = NULL);
+
+ ~CXML_Element();
+
+ void Empty();
+
+
+
+ CFX_ByteString GetTagName(FX_BOOL bQualified = FALSE) const;
+ void GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified = FALSE) const;
+
+ CFX_ByteString GetNamespace(FX_BOOL bQualified = FALSE) const;
+ void GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified = FALSE) const;
+
+ CFX_ByteString GetNamespaceURI(FX_BSTR qName) const;
+ void GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const;
+
+ CXML_Element* GetParent() const
+ {
+ return m_pParent;
+ }
+
+ FX_DWORD CountAttrs() const
+ {
+ return m_AttrMap.GetSize();
+ }
+
+ void GetAttrByIndex(int index, CFX_ByteString &space, CFX_ByteString &name, CFX_WideString &value) const;
+ void GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const;
+
+ FX_BOOL HasAttr(FX_BSTR qName) const;
+
+ FX_BOOL GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const;
+ CFX_WideString GetAttrValue(FX_BSTR name) const
+ {
+ CFX_WideString attr;
+ GetAttrValue(name, attr);
+ return attr;
+ }
+ const CFX_WideStringL* GetAttrValuePtr(FX_BSTR name) const;
+
+ FX_BOOL GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const;
+ CFX_WideString GetAttrValue(FX_BSTR space, FX_BSTR name) const
+ {
+ CFX_WideString attr;
+ GetAttrValue(space, name, attr);
+ return attr;
+ }
+ const CFX_WideStringL* GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const;
+
+ FX_BOOL GetAttrInteger(FX_BSTR name, int& attribute) const;
+ int GetAttrInteger(FX_BSTR name) const
+ {
+ int attr = 0;
+ GetAttrInteger(name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const;
+ int GetAttrInteger(FX_BSTR space, FX_BSTR name) const
+ {
+ int attr = 0;
+ GetAttrInteger(space, name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const;
+ FX_FLOAT GetAttrFloat(FX_BSTR name) const
+ {
+ FX_FLOAT attr = 0;
+ GetAttrFloat(name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const;
+ FX_FLOAT GetAttrFloat(FX_BSTR space, FX_BSTR name) const
+ {
+ FX_FLOAT attr = 0;
+ GetAttrFloat(space, name, attr);
+ return attr;
+ }
+
+ FX_DWORD CountChildren() const;
+
+ enum ChildType { Invalid, Element, Content};
+
+ ChildType GetChildType(FX_DWORD index) const;
+
+ CFX_WideString GetContent(FX_DWORD index) const;
+ const CFX_WideStringL* GetContentPtr(FX_DWORD index) const;
+
+ CXML_Element* GetElement(FX_DWORD index) const;
+
+ CXML_Element* GetElement(FX_BSTR space, FX_BSTR tag) const
+ {
+ return GetElement(space, tag, 0);
+ }
+
+ FX_DWORD CountElements(FX_BSTR space, FX_BSTR tag) const;
+
+ CXML_Element* GetElement(FX_BSTR space, FX_BSTR tag, int index) const;
+
+ FX_DWORD FindElement(CXML_Element *pChild) const;
+
+
+
+
+ void SetTag(FX_BSTR qSpace, FX_BSTR tagname);
+
+ void SetTag(FX_BSTR qTagName);
+
+ void RemoveChildren();
+
+ void RemoveChild(FX_DWORD index);
+
+
+protected:
+
+ CXML_Element* m_pParent;
+
+ CFX_ByteStringL m_QSpaceName;
+
+ CFX_ByteStringL m_TagName;
+
+ CXML_AttrMap m_AttrMap;
+
+ CFX_PtrArray m_Children;
+ friend class CXML_Parser;
+ friend class CXML_Composer;
+};
+#endif
diff --git a/core/include/fxge/fpf.h b/core/include/fxge/fpf.h
new file mode 100644
index 0000000000..99d9b7c999
--- /dev/null
+++ b/core/include/fxge/fpf.h
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_PALTFORM_DEVICE_H_
+#define _FX_PALTFORM_DEVICE_H_
+class IFPF_DeviceModule;
+class IFPF_FontMgr;
+class IFPF_Font;
+class IFPF_DeviceModule
+{
+public:
+ virtual void Destroy() = 0;
+ virtual IFPF_FontMgr* GetFontMgr() = 0;
+};
+IFPF_DeviceModule* FPF_GetDeviceModule();
+#define FPF_MATCHFONT_REPLACEANSI 1
+FX_DEFINEHANDLE(FPF_HFONT);
+class IFPF_Font
+{
+public:
+ virtual void Release() = 0;
+ virtual IFPF_Font* Retain() = 0;
+ virtual FPF_HFONT GetHandle() = 0;
+ virtual CFX_ByteString GetFamilyName() = 0;
+ virtual CFX_WideString GetPsName() = 0;
+ virtual FX_DWORD GetFontStyle() const = 0;
+ virtual FX_BYTE GetCharset() const = 0;
+
+ virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode) = 0;
+ virtual FX_INT32 GetGlyphWidth(FX_INT32 iGlyphIndex) = 0;
+
+ virtual FX_INT32 GetAscent() const = 0;
+ virtual FX_INT32 GetDescent() const = 0;
+
+ virtual FX_BOOL GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox) = 0;
+ virtual FX_BOOL GetBBox(FX_RECT &rtBBox) = 0;
+
+ virtual FX_INT32 GetHeight() const = 0;
+ virtual FX_INT32 GetItalicAngle() const = 0;
+ virtual FX_DWORD GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize) = 0;
+};
+class IFPF_FontMgr
+{
+public:
+ virtual void LoadSystemFonts() = 0;
+ virtual void LoadPrivateFont(IFX_FileRead* pFontFile) = 0;
+ virtual void LoadPrivateFont(FX_BSTR bsFileName) = 0;
+ virtual void LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer) = 0;
+
+ virtual IFPF_Font* CreateFont(FX_BSTR bsFamilyname, FX_BYTE charset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0) = 0;
+};
+#endif
diff --git a/core/include/fxge/fx_dib.h b/core/include/fxge/fx_dib.h
new file mode 100644
index 0000000000..7aa3bf8d10
--- /dev/null
+++ b/core/include/fxge/fx_dib.h
@@ -0,0 +1,606 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_DIB_H_
+#define _FPDF_DIB_H_
+#ifndef _FXCRT_EXTENSION_
+#include "../fxcrt/fx_ext.h"
+#endif
+enum FXDIB_Format {
+ FXDIB_Invalid = 0,
+ FXDIB_1bppMask = 0x101,
+ FXDIB_1bppRgb = 0x001,
+ FXDIB_1bppCmyk = 0x401,
+ FXDIB_8bppMask = 0x108,
+ FXDIB_8bppRgb = 0x008,
+ FXDIB_8bppRgba = 0x208,
+ FXDIB_8bppCmyk = 0x408,
+ FXDIB_8bppCmyka = 0x608,
+ FXDIB_Rgb = 0x018,
+ FXDIB_Rgba = 0x218,
+ FXDIB_Rgb32 = 0x020,
+ FXDIB_Argb = 0x220,
+ FXDIB_Cmyk = 0x420,
+ FXDIB_Cmyka = 0x620,
+};
+enum FXDIB_Channel {
+ FXDIB_Red = 1,
+ FXDIB_Green,
+ FXDIB_Blue,
+ FXDIB_Cyan,
+ FXDIB_Magenta,
+ FXDIB_Yellow,
+ FXDIB_Black,
+ FXDIB_Alpha
+};
+#define FXDIB_DOWNSAMPLE 0x04
+#define FXDIB_INTERPOL 0x20
+#define FXDIB_BICUBIC_INTERPOL 0x80
+#define FXDIB_NOSMOOTH 0x100
+#define FXDIB_PALETTE_LOC 0x01
+#define FXDIB_PALETTE_WIN 0x02
+#define FXDIB_PALETTE_MAC 0x04
+#define FXDIB_BLEND_NORMAL 0
+#define FXDIB_BLEND_MULTIPLY 1
+#define FXDIB_BLEND_SCREEN 2
+#define FXDIB_BLEND_OVERLAY 3
+#define FXDIB_BLEND_DARKEN 4
+#define FXDIB_BLEND_LIGHTEN 5
+
+#define FXDIB_BLEND_COLORDODGE 6
+#define FXDIB_BLEND_COLORBURN 7
+#define FXDIB_BLEND_HARDLIGHT 8
+#define FXDIB_BLEND_SOFTLIGHT 9
+#define FXDIB_BLEND_DIFFERENCE 10
+#define FXDIB_BLEND_EXCLUSION 11
+#define FXDIB_BLEND_NONSEPARABLE 21
+#define FXDIB_BLEND_HUE 21
+#define FXDIB_BLEND_SATURATION 22
+#define FXDIB_BLEND_COLOR 23
+#define FXDIB_BLEND_LUMINOSITY 24
+#define FXDIB_BLEND_UNSUPPORTED -1
+typedef FX_DWORD FX_ARGB;
+typedef FX_DWORD FX_COLORREF;
+typedef FX_DWORD FX_CMYK;
+class CFX_ClipRgn;
+class CFX_DIBSource;
+class CFX_DIBitmap;
+#define FXSYS_RGB(r, g, b) ((r) | ((g) << 8) | ((b) << 16))
+#define FXSYS_GetRValue(rgb) ((rgb) & 0xff)
+#define FXSYS_GetGValue(rgb) (((rgb) >> 8) & 0xff)
+#define FXSYS_GetBValue(rgb) (((rgb) >> 16) & 0xff)
+#define FX_CCOLOR(val) (255-(val))
+#define FXSYS_CMYK(c, m, y, k) (((c) << 24) | ((m) << 16) | ((y) << 8) | (k))
+#define FXSYS_GetCValue(cmyk) ((FX_BYTE)((cmyk) >> 24) & 0xff)
+#define FXSYS_GetMValue(cmyk) ((FX_BYTE)((cmyk) >> 16) & 0xff)
+#define FXSYS_GetYValue(cmyk) ((FX_BYTE)((cmyk) >> 8) & 0xff)
+#define FXSYS_GetKValue(cmyk) ((FX_BYTE)(cmyk) & 0xff)
+void CmykDecode(FX_CMYK cmyk, int& c, int& m, int& y, int& k);
+inline FX_CMYK CmykEncode(int c, int m, int y, int k)
+{
+ return (c << 24) | (m << 16) | (y << 8) | k;
+}
+void ArgbDecode(FX_ARGB argb, int& a, int& r, int&g, int& b);
+void ArgbDecode(FX_ARGB argb, int& a, FX_COLORREF& rgb);
+inline FX_ARGB ArgbEncode(int a, int r, int g, int b)
+{
+ return (a << 24) | (r << 16) | (g << 8) | b;
+}
+FX_ARGB ArgbEncode(int a, FX_COLORREF rgb);
+#define FXARGB_A(argb) ((FX_BYTE)((argb) >> 24))
+#define FXARGB_R(argb) ((FX_BYTE)((argb) >> 16))
+#define FXARGB_G(argb) ((FX_BYTE)((argb) >> 8))
+#define FXARGB_B(argb) ((FX_BYTE)(argb))
+#define FXARGB_MAKE(a,r,g,b) (((FX_DWORD)(a) << 24) | ((r) << 16) | ((g) << 8) | (b))
+#define FXARGB_MUL_ALPHA(argb, alpha) (((((argb) >> 24) * (alpha) / 255) << 24) | ((argb) & 0xffffff))
+#define FXRGB2GRAY(r,g,b) (((b) * 11 + (g) * 59 + (r) * 30) / 100)
+#define FXCMYK2GRAY(c,m,y,k) (((255-(c)) * (255-(k)) * 30 + (255-(m)) * (255-(k)) * 59 + (255-(y)) * (255-(k)) * 11) / 25500)
+#define FXDIB_ALPHA_MERGE(backdrop, source, source_alpha) (((backdrop) * (255-(source_alpha)) + (source)*(source_alpha))/255)
+#define FXDIB_ALPHA_UNION(dest, src) ((dest) + (src) - (dest)*(src)/255)
+#define FXCMYK_GETDIB(p) ((((FX_LPBYTE)(p))[0] << 24 | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | ((FX_LPBYTE)(p))[3]))
+#define FXCMYK_SETDIB(p, cmyk) ((FX_LPBYTE)(p))[0] = (FX_BYTE)((cmyk) >> 24), \
+ ((FX_LPBYTE)(p))[1] = (FX_BYTE)((cmyk) >> 16), \
+ ((FX_LPBYTE)(p))[2] = (FX_BYTE)((cmyk) >> 8), \
+ ((FX_LPBYTE)(p))[3] = (FX_BYTE)(cmyk))
+#define FXARGB_GETDIB(p) (((FX_LPBYTE)(p))[0]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[3] << 24)
+#define FXARGB_SETDIB(p, argb) ((FX_LPBYTE)(p))[0] = (FX_BYTE)(argb), \
+ ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
+ ((FX_LPBYTE)(p))[2] = (FX_BYTE)((argb) >> 16), \
+ ((FX_LPBYTE)(p))[3] = (FX_BYTE)((argb) >> 24)
+#define FXARGB_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
+ *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
+ *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
+ *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
+#define FXCMYK_COPY(dest, src) *(FX_LPBYTE)(dest) = *(FX_LPBYTE)(src), \
+ *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
+ *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src)+2), \
+ *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3)
+#define FXARGB_SETRGBORDERDIB(p, argb) ((FX_LPBYTE)(p))[3] = (FX_BYTE)(argb>>24), \
+ ((FX_LPBYTE)(p))[0] = (FX_BYTE)((argb) >> 16), \
+ ((FX_LPBYTE)(p))[1] = (FX_BYTE)((argb) >> 8), \
+ ((FX_LPBYTE)(p))[2] = (FX_BYTE)(argb)
+#define FXARGB_GETRGBORDERDIB(p) (((FX_LPBYTE)(p))[2]) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0] << 16) | (((FX_LPBYTE)(p))[3] << 24)
+#define FXARGB_RGBORDERCOPY(dest, src) *((FX_LPBYTE)(dest)+3) = *((FX_LPBYTE)(src)+3), \
+ *(FX_LPBYTE)(dest) = *((FX_LPBYTE)(src)+2), \
+ *((FX_LPBYTE)(dest)+1) = *((FX_LPBYTE)(src)+1), \
+ *((FX_LPBYTE)(dest)+2) = *((FX_LPBYTE)(src))
+#define FXARGB_TODIB(argb) (argb)
+#define FXCMYK_TODIB(cmyk) ((FX_BYTE)((cmyk) >> 24) | ((FX_BYTE)((cmyk) >> 16)) << 8 | ((FX_BYTE)((cmyk) >> 8)) << 16 | ((FX_BYTE)(cmyk) << 24))
+#define FXARGB_TOBGRORDERDIB(argb) ((FX_BYTE)(argb>>16) | ((FX_BYTE)(argb>>8)) << 8 | ((FX_BYTE)(argb)) << 16 | ((FX_BYTE)(argb>>24) << 24))
+#define FXGETFLAG_COLORTYPE(flag) (FX_BYTE)((flag)>>8)
+#define FXGETFLAG_ALPHA_FILL(flag) (FX_BYTE)(flag)
+#define FXGETFLAG_ALPHA_STROKE(flag) (FX_BYTE)((flag)>>16)
+#define FXSETFLAG_COLORTYPE(flag, val) flag = (((val)<<8)|(flag&0xffff00ff))
+#define FXSETFLAG_ALPHA_FILL(flag, val) flag = ((val)|(flag&0xffffff00))
+#define FXSETFLAG_ALPHA_STROKE(flag, val) flag = (((val)<<16)|(flag&0xff00ffff))
+class CFX_DIBSource : public CFX_Object
+{
+public:
+
+ virtual ~CFX_DIBSource();
+
+
+
+ int GetWidth() const
+ {
+ return m_Width;
+ }
+
+ int GetHeight() const
+ {
+ return m_Height;
+ }
+
+ FXDIB_Format GetFormat() const
+ {
+ return (FXDIB_Format)(m_AlphaFlag * 0x100 + m_bpp);
+ }
+
+ FX_DWORD GetPitch() const
+ {
+ return m_Pitch;
+ }
+
+ FX_DWORD* GetPalette() const
+ {
+ return m_pPalette;
+ }
+
+
+
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return NULL;
+ }
+
+ virtual FX_LPCBYTE GetScanline(int line) const = 0;
+
+ virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const
+ {
+ return FALSE;
+ }
+
+ virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const = 0;
+
+ virtual void SetDownSampleSize(int width, int height) const {}
+
+ int GetBPP() const
+ {
+ return m_bpp;
+ }
+
+ FX_BOOL IsAlphaMask() const
+ {
+ return m_AlphaFlag == 1;
+ }
+
+ FX_BOOL HasAlpha() const
+ {
+ return m_AlphaFlag & 2 ? TRUE : FALSE;
+ }
+
+ FX_BOOL IsOpaqueImage() const
+ {
+ return !(m_AlphaFlag & 3);
+ }
+
+ FX_BOOL IsCmykImage() const
+ {
+ return m_AlphaFlag & 4 ? TRUE : FALSE;
+ }
+
+
+
+ int GetPaletteSize() const
+ {
+ return IsAlphaMask() ? 0 : (m_bpp == 1 ? 2 : (m_bpp == 8 ? 256 : 0));
+ }
+
+ FX_DWORD GetPaletteEntry(int index) const;
+
+ void SetPaletteEntry(int index, FX_DWORD color);
+ FX_DWORD GetPaletteArgb(int index) const
+ {
+ return GetPaletteEntry(index);
+ }
+ void SetPaletteArgb(int index, FX_DWORD color)
+ {
+ SetPaletteEntry(index, color);
+ }
+
+ void CopyPalette(const FX_DWORD* pSrcPal, FX_DWORD size = 256);
+
+
+ CFX_DIBitmap* Clone(const FX_RECT* pClip = NULL) const;
+
+ CFX_DIBitmap* CloneConvert(FXDIB_Format format, const FX_RECT* pClip = NULL, void* pIccTransform = NULL) const;
+
+ CFX_DIBitmap* StretchTo(int dest_width, int dest_height, FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;
+
+
+ CFX_DIBitmap* TransformTo(const CFX_AffineMatrix* pMatrix, int& left, int &top,
+ FX_DWORD flags = 0, const FX_RECT* pClip = NULL) const;
+
+ CFX_DIBitmap* GetAlphaMask(const FX_RECT* pClip = NULL) const;
+
+ FX_BOOL CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip = NULL);
+
+ CFX_DIBitmap* SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pClip = NULL) const;
+
+ CFX_DIBitmap* FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const;
+
+ void GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height, int src_width,
+ int src_height, int& src_left, int& src_top, const CFX_ClipRgn* pClipRgn);
+
+ CFX_DIBitmap* m_pAlphaMask;
+protected:
+
+ CFX_DIBSource();
+
+ int m_Width;
+
+ int m_Height;
+
+ int m_bpp;
+
+ FX_DWORD m_AlphaFlag;
+
+ FX_DWORD m_Pitch;
+
+ FX_DWORD* m_pPalette;
+
+ void BuildPalette();
+
+ FX_BOOL BuildAlphaMask();
+
+ int FindPalette(FX_DWORD color) const;
+
+ void GetPalette(FX_DWORD* pal, int alpha) const;
+};
+class CFX_DIBitmap : public CFX_DIBSource
+{
+public:
+
+ virtual ~CFX_DIBitmap();
+
+ CFX_DIBitmap();
+
+ CFX_DIBitmap(const CFX_DIBitmap& src);
+
+ FX_BOOL Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer = NULL, int pitch = 0);
+
+ FX_BOOL Copy(const CFX_DIBSource* pSrc);
+
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return m_pBuffer;
+ }
+
+ virtual FX_LPCBYTE GetScanline(int line) const
+ {
+ return m_pBuffer ? m_pBuffer + line * m_Pitch : NULL;
+ }
+
+ virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
+
+ void TakeOver(CFX_DIBitmap* pSrcBitmap);
+
+ FX_BOOL ConvertFormat(FXDIB_Format format, void* pIccTransform = NULL);
+
+ void Clear(FX_DWORD color);
+
+ FX_DWORD GetPixel(int x, int y) const;
+
+ void SetPixel(int x, int y, FX_DWORD color);
+
+ FX_BOOL LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel);
+
+ FX_BOOL LoadChannel(FXDIB_Channel destChannel, int value);
+
+ FX_BOOL MultiplyAlpha(int alpha);
+
+ FX_BOOL MultiplyAlpha(const CFX_DIBSource* pAlphaMask);
+
+ FX_BOOL TransferBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform = NULL);
+
+ FX_BOOL CompositeBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
+ int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, void* pIccTransform = NULL);
+
+ FX_BOOL TransferMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL CompositeMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
+ int blend_type = FXDIB_BLEND_NORMAL, const CFX_ClipRgn* pClipRgn = NULL, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL CompositeRect(int dest_left, int dest_top, int width, int height, FX_DWORD color, int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor);
+
+ FX_BOOL DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect = NULL);
+protected:
+
+ FX_LPBYTE m_pBuffer;
+
+ FX_BOOL m_bExtBuf;
+
+ FX_BOOL GetGrayData(void* pIccTransform = NULL);
+};
+class CFX_DIBExtractor : public CFX_Object
+{
+public:
+
+ CFX_DIBExtractor(const CFX_DIBSource* pSrc);
+
+ ~CFX_DIBExtractor();
+
+ operator CFX_DIBitmap*()
+ {
+ return m_pBitmap;
+ }
+private:
+
+ CFX_DIBitmap* m_pBitmap;
+};
+typedef CFX_CountRef<CFX_DIBitmap> CFX_DIBitmapRef;
+class CFX_FilteredDIB : public CFX_DIBSource
+{
+public:
+
+ CFX_FilteredDIB();
+
+ ~CFX_FilteredDIB();
+
+ void LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc = FALSE);
+
+ virtual FXDIB_Format GetDestFormat() = 0;
+
+ virtual FX_DWORD* GetDestPalette() = 0;
+
+
+ virtual void TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const = 0;
+
+ virtual void TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const = 0;
+protected:
+ virtual FX_LPCBYTE GetScanline(int line) const;
+ virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
+
+ const CFX_DIBSource* m_pSrc;
+
+ FX_BOOL m_bAutoDropSrc;
+
+ FX_LPBYTE m_pScanline;
+};
+class IFX_ScanlineComposer
+{
+public:
+
+ virtual void ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL) = 0;
+
+
+ virtual FX_BOOL SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette) = 0;
+};
+class CFX_ScanlineCompositor : public CFX_Object
+{
+public:
+
+ CFX_ScanlineCompositor();
+
+ ~CFX_ScanlineCompositor();
+
+ FX_BOOL Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
+ FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL);
+
+
+ void CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
+
+
+ void CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
+
+
+ void CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha = NULL);
+
+
+ void CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha = NULL);
+protected:
+ int m_Transparency;
+ FXDIB_Format m_SrcFormat,
+ m_DestFormat;
+ FX_DWORD* m_pSrcPalette;
+
+ int m_MaskAlpha,
+ m_MaskRed,
+ m_MaskGreen,
+ m_MaskBlue,
+ m_MaskBlack;
+ int m_BlendType;
+ void* m_pIccTransform;
+ FX_LPBYTE m_pCacheScanline;
+ int m_CacheSize;
+ FX_BOOL m_bRgbByteOrder;
+};
+class CFX_BitmapComposer : public IFX_ScanlineComposer, public CFX_Object
+{
+public:
+
+ CFX_BitmapComposer();
+
+ ~CFX_BitmapComposer();
+
+
+ void Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
+ FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
+ FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder = FALSE,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+
+ virtual FX_BOOL SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);
+
+
+ virtual void ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);
+protected:
+
+ void DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha = NULL, FX_LPBYTE dst_extra_alpha = NULL);
+ CFX_DIBitmap* m_pBitmap;
+ const CFX_ClipRgn* m_pClipRgn;
+ FXDIB_Format m_SrcFormat;
+ int m_DestLeft, m_DestTop, m_DestWidth, m_DestHeight, m_BitmapAlpha;
+ FX_DWORD m_MaskColor;
+ const CFX_DIBitmap* m_pClipMask;
+ CFX_ScanlineCompositor m_Compositor;
+ FX_BOOL m_bVertical, m_bFlipX, m_bFlipY;
+ int m_AlphaFlag;
+ void* m_pIccTransform;
+ FX_BOOL m_bRgbByteOrder;
+ int m_BlendType;
+ void ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha = NULL);
+ FX_LPBYTE m_pScanlineV, m_pClipScanV, m_pAddClipScan, m_pScanlineAlphaV;
+};
+class CFX_BitmapStorer : public IFX_ScanlineComposer, public CFX_Object
+{
+public:
+
+ CFX_BitmapStorer();
+
+ ~CFX_BitmapStorer();
+
+ virtual void ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha);
+
+ virtual FX_BOOL SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette);
+
+ CFX_DIBitmap* GetBitmap()
+ {
+ return m_pBitmap;
+ }
+
+ CFX_DIBitmap* Detach();
+
+ void Replace(CFX_DIBitmap* pBitmap);
+private:
+ CFX_DIBitmap* m_pBitmap;
+};
+class CStretchEngine;
+class CFX_ImageStretcher : public CFX_Object
+{
+public:
+
+ CFX_ImageStretcher();
+
+ ~CFX_ImageStretcher();
+
+ FX_INT32 Start(IFX_ScanlineComposer* pDest, const CFX_DIBSource* pBitmap,
+ int dest_width, int dest_height, const FX_RECT& bitmap_rect, FX_DWORD flags);
+
+
+ FX_INT32 Continue(IFX_Pause* pPause);
+ IFX_ScanlineComposer* m_pDest;
+ const CFX_DIBSource* m_pSource;
+ CStretchEngine* m_pStretchEngine;
+ FX_DWORD m_Flags;
+ FX_BOOL m_bFlipX,
+ m_bFlipY;
+ int m_DestWidth,
+ m_DestHeight;
+ FX_RECT m_ClipRect;
+ int m_LineIndex;
+ int m_DestBPP;
+ FX_LPBYTE m_pScanline;
+ FX_LPBYTE m_pMaskScanline;
+ FXDIB_Format m_DestFormat;
+ FX_INT32 m_Status;
+
+ FX_INT32 StartQuickStretch();
+
+ FX_INT32 StartStretch();
+
+ FX_INT32 ContinueQuickStretch(IFX_Pause* pPause);
+
+ FX_INT32 ContinueStretch(IFX_Pause* pPause);
+};
+class CFX_ImageTransformer : public CFX_Object
+{
+public:
+
+ CFX_ImageTransformer();
+
+ ~CFX_ImageTransformer();
+
+ FX_INT32 Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pMatrix, int flags, const FX_RECT* pClip);
+
+
+ FX_INT32 Continue(IFX_Pause* pPause);
+ CFX_AffineMatrix* m_pMatrix;
+ FX_RECT m_StretchClip;
+ int m_ResultLeft, m_ResultTop, m_ResultWidth, m_ResultHeight;
+ CFX_AffineMatrix m_dest2stretch;
+ CFX_ImageStretcher m_Stretcher;
+ CFX_BitmapStorer m_Storer;
+ FX_DWORD m_Flags;
+ int m_Status;
+};
+class CFX_ImageRenderer : public CFX_Object
+{
+public:
+
+ CFX_ImageRenderer();
+
+ ~CFX_ImageRenderer();
+
+ FX_INT32 Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
+ const CFX_DIBSource* pSource, int bitmap_alpha,
+ FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix, FX_DWORD dib_flags,
+ FX_BOOL bRgbByteOrder = FALSE, int alpha_flag = 0, void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_INT32 Continue(IFX_Pause* pPause);
+protected:
+ CFX_DIBitmap* m_pDevice;
+ const CFX_ClipRgn* m_pClipRgn;
+ int m_BitmapAlpha;
+ FX_DWORD m_MaskColor;
+ CFX_AffineMatrix m_Matrix;
+ CFX_ImageTransformer* m_pTransformer;
+ CFX_ImageStretcher m_Stretcher;
+ CFX_BitmapComposer m_Composer;
+ int m_Status;
+ int m_DestLeft, m_DestTop;
+ FX_RECT m_ClipBox;
+ FX_DWORD m_Flags;
+ int m_AlphaFlag;
+ void* m_pIccTransform;
+ FX_BOOL m_bRgbByteOrder;
+ int m_BlendType;
+};
+#endif
diff --git a/core/include/fxge/fx_font.h b/core/include/fxge/fx_font.h
new file mode 100644
index 0000000000..abfa9b8b5d
--- /dev/null
+++ b/core/include/fxge/fx_font.h
@@ -0,0 +1,428 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_FONT_H_
+#define _FX_FONT_H_
+#ifndef _FXCRT_EXTENSION_
+#include "../../include/fxcrt/fx_ext.h"
+#endif
+#ifndef _FX_DIB_H_
+#include "fx_dib.h"
+#endif
+typedef struct FT_FaceRec_* FXFT_Face;
+typedef void* FXFT_Library;
+class IFX_FontEncoding;
+class CFX_PathData;
+class CFX_SubstFont;
+class CFX_FaceCache;
+class IFX_FontMapper;
+class CFX_FontMapper;
+class IFX_SystemFontInfo;
+class CFontFileFaceInfo;
+#define FXFONT_FIXED_PITCH 0x01
+#define FXFONT_SERIF 0x02
+#define FXFONT_SYMBOLIC 0x04
+#define FXFONT_SCRIPT 0x08
+#define FXFONT_ITALIC 0x40
+#define FXFONT_BOLD 0x40000
+#define FXFONT_USEEXTERNATTR 0x80000
+#define FXFONT_CIDFONT 0x100000
+#define FXFONT_ANSI_CHARSET 0
+#define FXFONT_DEFAULT_CHARSET 1
+#define FXFONT_SYMBOL_CHARSET 2
+#define FXFONT_SHIFTJIS_CHARSET 128
+#define FXFONT_HANGEUL_CHARSET 129
+#define FXFONT_GB2312_CHARSET 134
+#define FXFONT_CHINESEBIG5_CHARSET 136
+#define FXFONT_THAI_CHARSET 222
+#define FXFONT_EASTEUROPE_CHARSET 238
+#define FXFONT_RUSSIAN_CHARSET 204
+#define FXFONT_GREEK_CHARSET 161
+#define FXFONT_TURKISH_CHARSET 162
+#define FXFONT_HEBREW_CHARSET 177
+#define FXFONT_ARABIC_CHARSET 178
+#define FXFONT_BALTIC_CHARSET 186
+#define FXFONT_FF_FIXEDPITCH 1
+#define FXFONT_FF_ROMAN (1<<4)
+#define FXFONT_FF_SCRIPT (4<<4)
+#define FXFONT_FW_NORMAL 400
+#define FXFONT_FW_BOLD 700
+class CFX_Font : public CFX_Object
+{
+public:
+ CFX_Font();
+ ~CFX_Font();
+
+ FX_BOOL LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);
+
+ FX_BOOL LoadEmbedded(FX_LPCBYTE data, FX_DWORD size);
+
+ FX_BOOL LoadFile(IFX_FileRead* pFile);
+
+ FXFT_Face GetFace() const
+ {
+ return m_Face;
+ }
+
+
+ const CFX_SubstFont* GetSubstFont() const
+ {
+ return m_pSubstFont;
+ }
+
+ CFX_PathData* LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);
+
+ int GetGlyphWidth(FX_DWORD glyph_index);
+
+ int GetAscent() const;
+
+ int GetDescent() const;
+
+ FX_BOOL GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);
+
+ FX_BOOL IsItalic();
+
+ FX_BOOL IsBold();
+
+ FX_BOOL IsFixedWidth();
+
+ FX_BOOL IsVertical() const
+ {
+ return m_bVertical;
+ }
+
+ CFX_WideString GetPsName() const;
+
+
+ CFX_ByteString GetFamilyName() const;
+
+ CFX_ByteString GetFaceName() const;
+
+
+ FX_BOOL IsTTFont();
+
+ FX_BOOL GetBBox(FX_RECT &bbox);
+
+ int GetHeight();
+
+ int GetULPos();
+
+ int GetULthickness();
+
+ int GetMaxAdvanceWidth();
+
+ FXFT_Face m_Face;
+
+ CFX_SubstFont* m_pSubstFont;
+ FX_BOOL IsEmbedded()
+ {
+ return m_bEmbedded;
+ }
+
+ void AdjustMMParams(int glyph_index, int width, int weight);
+ FX_LPBYTE m_pFontDataAllocation;
+ FX_LPBYTE m_pFontData;
+ FX_LPBYTE m_pGsubData;
+ FX_DWORD m_dwSize;
+ CFX_BinaryBuf m_OtfFontData;
+ void* m_hHandle;
+ void* m_pPlatformFont;
+ void* m_pPlatformFontCollection;
+ void* m_pDwFont;
+ FX_BOOL m_bDwLoaded;
+ void ReleasePlatformResource();
+
+ void DeleteFace();
+protected:
+
+ FX_BOOL m_bEmbedded;
+ FX_BOOL m_bVertical;
+ void* m_pOwnedStream;
+};
+#define ENCODING_INTERNAL 0
+#define ENCODING_UNICODE 1
+class IFX_FontEncoding : public CFX_Object
+{
+public:
+ virtual ~IFX_FontEncoding() {}
+
+ virtual FX_DWORD GlyphFromCharCode(FX_DWORD charcode) = 0;
+
+ virtual CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const = 0;
+
+ virtual FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
+};
+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);
+#define FXFONT_SUBST_MM 0x01
+#define FXFONT_SUBST_GLYPHPATH 0x04
+#define FXFONT_SUBST_CLEARTYPE 0x08
+#define FXFONT_SUBST_TRANSFORM 0x10
+#define FXFONT_SUBST_NONSYMBOL 0x20
+#define FXFONT_SUBST_EXACT 0x40
+#define FXFONT_SUBST_STANDARD 0x80
+class CFX_SubstFont : public CFX_Object
+{
+public:
+
+ CFX_SubstFont();
+
+ FX_LPVOID m_ExtHandle;
+
+ CFX_ByteString m_Family;
+
+ int m_Charset;
+
+ FX_DWORD m_SubstFlags;
+
+ int m_Weight;
+
+ int m_ItalicAngle;
+
+ FX_BOOL m_bSubstOfCJK;
+
+ int m_WeightCJK;
+
+ FX_BOOL m_bItlicCJK;
+};
+#define FX_FONT_FLAG_SERIF 0x01
+#define FX_FONT_FLAG_FIXEDPITCH 0x02
+#define FX_FONT_FLAG_ITALIC 0x04
+#define FX_FONT_FLAG_BOLD 0x08
+#define FX_FONT_FLAG_SYMBOLIC_SYMBOL 0x10
+#define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20
+#define FX_FONT_FLAG_MULTIPLEMASTER 0x40
+typedef struct {
+ FX_LPCBYTE m_pFontData;
+ FX_DWORD m_dwSize;
+} FoxitFonts;
+class CFX_FontMgr : public CFX_Object
+{
+public:
+ CFX_FontMgr();
+ ~CFX_FontMgr();
+ void InitFTLibrary();
+ FXFT_Face GetCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData);
+ FXFT_Face AddCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index);
+ FXFT_Face GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ int font_offset, FX_LPBYTE& pFontData);
+ FXFT_Face AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ FX_LPBYTE pData, FX_DWORD size, int font_offset);
+ FXFT_Face GetFileFace(FX_LPCSTR filename, int face_index);
+ FXFT_Face GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index);
+ void ReleaseFace(FXFT_Face face);
+ void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+ FXFT_Face FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
+
+ void FreeCache();
+
+ FX_BOOL GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index);
+ CFX_FontMapper* m_pBuiltinMapper;
+ IFX_FontMapper* m_pExtMapper;
+ CFX_MapByteStringToPtr m_FaceMap;
+ FXFT_Library m_FTLibrary;
+ FoxitFonts m_ExternalFonts[16];
+};
+class IFX_FontMapper : public CFX_Object
+{
+public:
+
+ virtual ~IFX_FontMapper() {}
+
+ virtual FXFT_Face FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont) = 0;
+
+ CFX_FontMgr* m_pFontMgr;
+};
+class IFX_FontEnumerator
+{
+public:
+
+ virtual void HitFont() = 0;
+
+ virtual void Finish() = 0;
+};
+class IFX_AdditionalFontEnum
+{
+public:
+ virtual int CountFiles() = 0;
+ virtual IFX_FileStream* GetFontFile(int index) = 0;
+};
+class CFX_FontMapper : public IFX_FontMapper
+{
+public:
+ CFX_FontMapper();
+ virtual ~CFX_FontMapper();
+ void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+ IFX_SystemFontInfo* GetSystemFontInfo()
+ {
+ return m_pFontInfo;
+ }
+ void AddInstalledFont(const CFX_ByteString& name, int charset);
+ void LoadInstalledFonts();
+ CFX_ByteStringArray m_InstalledTTFonts;
+ void SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)
+ {
+ m_pFontEnumerator = pFontEnumerator;
+ }
+ IFX_FontEnumerator* GetFontEnumerator() const
+ {
+ return m_pFontEnumerator;
+ }
+ virtual FXFT_Face FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
+private:
+ CFX_ByteString GetPSNameFromTT(void* hFont);
+ CFX_ByteString MatchInstalledFonts(const CFX_ByteString& norm_name);
+ FXFT_Face UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);
+
+ FX_BOOL m_bListLoaded;
+ FXFT_Face m_MMFaces[2];
+ CFX_ByteString m_LastFamily;
+ CFX_DWordArray m_CharsetArray;
+ CFX_ByteStringArray m_FaceArray;
+ IFX_SystemFontInfo* m_pFontInfo;
+ FXFT_Face m_FoxitFaces[14];
+ IFX_FontEnumerator* m_pFontEnumerator;
+};
+class IFX_SystemFontInfo : public CFX_Object
+{
+public:
+ static IFX_SystemFontInfo* CreateDefault();
+ virtual void Release() = 0;
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) = 0;
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact) = 0;
+ virtual void* GetFont(FX_LPCSTR face) = 0;
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) = 0;
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) = 0;
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset) = 0;
+ virtual int GetFaceIndex(void* hFont)
+ {
+ return 0;
+ }
+ virtual void DeleteFont(void* hFont) = 0;
+ virtual void* RetainFont(void* hFont)
+ {
+ return NULL;
+ }
+};
+class CFX_FolderFontInfo : public IFX_SystemFontInfo
+{
+public:
+ CFX_FolderFontInfo();
+ ~CFX_FolderFontInfo();
+ void AddPath(FX_BSTR path);
+ virtual void Release();
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+ virtual void* GetFont(FX_LPCSTR face);
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual void DeleteFont(void* hFont);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+protected:
+ CFX_MapByteStringToPtr m_FontList;
+ CFX_ByteStringArray m_PathList;
+ CFX_FontMapper* m_pMapper;
+ void ScanPath(CFX_ByteString& path);
+ void ScanFile(CFX_ByteString& path);
+ void ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);
+};
+class CFX_CountedFaceCache : public CFX_Object
+{
+public:
+ CFX_FaceCache* m_Obj;
+ FX_DWORD m_nCount;
+};
+typedef CFX_MapPtrTemplate<FXFT_Face, CFX_CountedFaceCache*> CFX_FTCacheMap;
+class CFX_FontCache : public CFX_Object
+{
+public:
+ ~CFX_FontCache();
+ CFX_FaceCache* GetCachedFace(CFX_Font* pFont);
+ void ReleaseCachedFace(CFX_Font* pFont);
+ void FreeCache(FX_BOOL bRelease = FALSE);
+
+private:
+ CFX_FTCacheMap m_FTFaceMap;
+ CFX_FTCacheMap m_ExtFaceMap;
+};
+class CFX_AutoFontCache
+{
+public:
+ CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)
+ : m_pFontCache(pFontCache)
+ , m_pFont(pFont)
+ {
+ }
+ ~CFX_AutoFontCache()
+ {
+ m_pFontCache->ReleaseCachedFace(m_pFont);
+ }
+ CFX_FontCache* m_pFontCache;
+ CFX_Font* m_pFont;
+};
+#define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))
+class CFX_GlyphBitmap : public CFX_Object
+{
+public:
+ int m_Top;
+ int m_Left;
+ CFX_DIBitmap m_Bitmap;
+};
+class CFX_FaceCache : public CFX_Object
+{
+public:
+ ~CFX_FaceCache();
+ const CFX_GlyphBitmap* LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias, int& text_flags);
+ const CFX_PathData* LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);
+
+
+ CFX_FaceCache(FXFT_Face face);
+private:
+ FXFT_Face m_Face;
+ CFX_GlyphBitmap* RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
+ CFX_GlyphBitmap* RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,
+ const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
+ CFX_GlyphBitmap* LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,
+ FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);
+ CFX_MapByteStringToPtr m_SizeMap;
+ CFX_MapPtrToPtr m_PathMap;
+ CFX_DIBitmap* m_pBitmap;
+ void* m_pPlatformGraphics;
+ void* m_pPlatformBitmap;
+ void* m_hDC;
+ void* m_hBitmap;
+ void* m_hOldBitmap;
+ void* m_hGdiFont;
+ void* m_hOldGdiFont;
+
+ void InitPlatform();
+ void DestroyPlatform();
+};
+typedef struct {
+ const CFX_GlyphBitmap* m_pGlyph;
+ int m_OriginX, m_OriginY;
+ FX_FLOAT m_fOriginX, m_fOriginY;
+} FXTEXT_GLYPHPOS;
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);
+FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);
+class IFX_GSUBTable
+{
+public:
+ virtual void Release() = 0;
+ virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;
+};
+IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont);
+#endif
diff --git a/core/include/fxge/fx_freetype.h b/core/include/fxge/fx_freetype.h
new file mode 100644
index 0000000000..397c3eea9b
--- /dev/null
+++ b/core/include/fxge/fx_freetype.h
@@ -0,0 +1,144 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../thirdparties/freetype/ft2build.h"
+#include "../thirdparties/freetype/freetype/freetype.h"
+#include "../thirdparties/freetype/freetype/ftoutln.h"
+#include "../thirdparties/freetype/freetype/ftmm.h"
+#include "../thirdparties/freetype/freetype/internal/ftobjs.h"
+#include "../thirdparties/freetype/freetype/tttables.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define FXFT_ENCODING_UNICODE FT_ENCODING_UNICODE
+#define FXFT_ENCODING_ADOBE_STANDARD FT_ENCODING_ADOBE_STANDARD
+#define FXFT_ENCODING_ADOBE_EXPERT FT_ENCODING_ADOBE_EXPERT
+#define FXFT_ENCODING_ADOBE_LATIN_1 FT_ENCODING_ADOBE_LATIN_1
+#define FXFT_ENCODING_APPLE_ROMAN FT_ENCODING_APPLE_ROMAN
+#define FXFT_ENCODING_ADOBE_CUSTOM FT_ENCODING_ADOBE_CUSTOM
+#define FXFT_ENCODING_MS_SYMBOL FT_ENCODING_MS_SYMBOL
+#define FXFT_ENCODING_GB2312 FT_ENCODING_GB2312
+#define FXFT_ENCODING_BIG5 FT_ENCODING_BIG5
+#define FXFT_ENCODING_SJIS FT_ENCODING_SJIS
+#define FXFT_ENCODING_JOHAB FT_ENCODING_JOHAB
+#define FXFT_ENCODING_WANSUNG FT_ENCODING_WANSUNG
+#define FXFT_LOAD_NO_SCALE FT_LOAD_NO_SCALE
+#define FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
+#define FXFT_RENDER_MODE_LCD FT_RENDER_MODE_LCD
+#define FXFT_RENDER_MODE_MONO FT_RENDER_MODE_MONO
+#define FXFT_RENDER_MODE_NORMAL FT_RENDER_MODE_NORMAL
+#define FXFT_LOAD_IGNORE_TRANSFORM FT_LOAD_IGNORE_TRANSFORM
+#define FXFT_LOAD_NO_BITMAP FT_LOAD_NO_BITMAP
+#define FXFT_LOAD_NO_HINTING FT_LOAD_NO_HINTING
+#define FXFT_PIXEL_MODE_MONO FT_PIXEL_MODE_MONO
+#define FXFT_STYLE_FLAG_ITALIC FT_STYLE_FLAG_ITALIC
+#define FXFT_STYLE_FLAG_BOLD FT_STYLE_FLAG_BOLD
+#define FXFT_FACE_FLAG_SFNT FT_FACE_FLAG_SFNT
+#define FXFT_FACE_FLAG_TRICKY ( 1L << 13 )
+typedef FT_MM_Var* FXFT_MM_Var;
+typedef FT_Bitmap* FXFT_Bitmap;
+#define FXFT_Matrix FT_Matrix
+#define FXFT_Vector FT_Vector
+#define FXFT_Outline_Funcs FT_Outline_Funcs
+typedef FT_Open_Args FXFT_Open_Args;
+typedef FT_StreamRec FXFT_StreamRec;
+typedef FT_StreamRec* FXFT_Stream;
+typedef FT_BBox FXFT_BBox;
+typedef FT_Glyph FXFT_Glyph;
+typedef FT_CharMap FXFT_CharMap;
+#define FXFT_GLYPH_BBOX_PIXELS FT_GLYPH_BBOX_PIXELS
+#define FXFT_Open_Face(library, args, index, face) \
+ FT_Open_Face((FT_Library)(library), args, index, (FT_Face*)(face))
+#define FXFT_Done_Face(face) FT_Done_Face((FT_Face)(face))
+#define FXFT_Done_FreeType(library) FT_Done_FreeType((FT_Library)(library))
+#define FXFT_Init_FreeType(library) FT_Init_FreeType((FT_Library*)(library))
+#define FXFT_New_Memory_Face(library, base, size, index, face) \
+ FT_New_Memory_Face((FT_Library)(library), base, size, index, (FT_Face*)(face))
+#define FXFT_New_Face(library, filename, index, face) \
+ FT_New_Face((FT_Library)(library), filename, index, (FT_Face*)(face))
+#define FXFT_Get_Face_FreeType(face) ((FT_Face)face)->driver->root.library
+#define FXFT_Select_Charmap(face, encoding) FT_Select_Charmap((FT_Face)face, (FT_Encoding)encoding)
+#define FXFT_Set_Charmap(face, charmap) FT_Set_Charmap((FT_Face)face, (FT_CharMap)charmap)
+#define FXFT_Load_Glyph(face, glyph_index, flags) FT_Load_Glyph((FT_Face)face, glyph_index, flags)
+#define FXFT_Get_Char_Index(face, code) FT_Get_Char_Index((FT_Face)face, code)
+#define FXFT_Get_Glyph_Name(face, index, buffer, size) FT_Get_Glyph_Name((FT_Face)face, index, buffer, size)
+#define FXFT_Get_Name_Index(face, name) FT_Get_Name_Index((FT_Face)face, name)
+#define FXFT_Has_Glyph_Names(face) (((FT_Face)face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES)
+#define FXFT_Get_Postscript_Name(face) FT_Get_Postscript_Name((FT_Face)face)
+#define FXFT_Load_Sfnt_Table(face, tag, offset, buffer, length) \
+ FT_Load_Sfnt_Table((FT_Face)face, tag, offset, buffer, length)
+#define FXFT_Get_First_Char(face, glyph_index) FT_Get_First_Char((FT_Face)face, glyph_index)
+#define FXFT_Get_Next_Char(face, code, glyph_index) FT_Get_Next_Char((FT_Face)face, code, glyph_index)
+#define FXFT_Clear_Face_External_Stream(face) (((FT_Face)face)->face_flags&=~FT_FACE_FLAG_EXTERNAL_STREAM)
+#define FXFT_Get_Face_External_Stream(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_EXTERNAL_STREAM)
+#define FXFT_Is_Face_TT_OT(face) (((FT_Face)face)->face_flags&FT_FACE_FLAG_SFNT)
+#define FXFT_Is_Face_Tricky(face) (((FT_Face)face)->face_flags&FXFT_FACE_FLAG_TRICKY)
+#define FXFT_Is_Face_fixedwidth(face) (((FT_Face)face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH)
+#define FXFT_Get_Face_Stream_Base(face) ((FT_Face)face)->stream->base
+#define FXFT_Get_Face_Stream_Size(face) ((FT_Face)face)->stream->size
+#define FXFT_Get_Face_Family_Name(face) ((FT_Face)face)->family_name
+#define FXFT_Get_Face_Style_Name(face) ((FT_Face)face)->style_name
+#define FXFT_Get_Face_Numfaces(face) ((FT_Face)face)->num_faces
+#define FXFT_Get_Face_Faceindex(face) ((FT_Face)face)->face_index
+#define FXFT_Is_Face_Italic(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_ITALIC)
+#define FXFT_Is_Face_Bold(face) (((FT_Face)face)->style_flags&FT_STYLE_FLAG_BOLD)
+#define FXFT_Get_Face_Charmaps(face) ((FT_Face)face)->charmaps
+#define FXFT_Get_Glyph_HoriBearingX(face) ((FT_Face)face)->glyph->metrics.horiBearingX
+#define FXFT_Get_Glyph_HoriBearingY(face) ((FT_Face)face)->glyph->metrics.horiBearingY
+#define FXFT_Get_Glyph_Width(face) ((FT_Face)face)->glyph->metrics.width
+#define FXFT_Get_Glyph_Height(face) ((FT_Face)face)->glyph->metrics.height
+#define FXFT_Get_Face_CharmapCount(face) ((FT_Face)face)->num_charmaps
+#define FXFT_Get_Charmap_Encoding(charmap) ((FT_CharMap)charmap)->encoding
+#define FXFT_Get_Face_Charmap(face) ((FT_Face)face)->charmap
+#define FXFT_Get_Charmap_PlatformID(charmap) ((FT_CharMap)charmap)->platform_id
+#define FXFT_Get_Charmap_EncodingID(charmap) ((FT_CharMap)charmap)->encoding_id
+#define FXFT_Get_Face_UnitsPerEM(face) ((FT_Face)face)->units_per_EM
+#define FXFT_Get_Face_xMin(face) ((FT_Face)face)->bbox.xMin
+#define FXFT_Get_Face_xMax(face) ((FT_Face)face)->bbox.xMax
+#define FXFT_Get_Face_yMin(face) ((FT_Face)face)->bbox.yMin
+#define FXFT_Get_Face_yMax(face) ((FT_Face)face)->bbox.yMax
+#define FXFT_Get_Face_Height(face) ((FT_Face)face)->height
+#define FXFT_Get_Face_UnderLineThickness(face) ((FT_Face)face)->underline_thickness
+#define FXFT_Get_Face_UnderLinePosition(face) ((FT_Face)face)->underline_position
+#define FXFT_Get_Face_MaxAdvanceWidth(face) ((FT_Face)face)->max_advance_width
+#define FXFT_Get_Face_Ascender(face) ((FT_Face)face)->ascender
+#define FXFT_Get_Face_Descender(face) ((FT_Face)face)->descender
+#define FXFT_Get_Glyph_HoriAdvance(face) ((FT_Face)face)->glyph->metrics.horiAdvance
+#define FXFT_Get_MM_Axis(var, index) &((FT_MM_Var*)var)->axis[index]
+#define FXFT_Get_MM_Axis_Min(axis) ((FT_Var_Axis*)axis)->minimum
+#define FXFT_Get_MM_Axis_Max(axis) ((FT_Var_Axis*)axis)->maximum
+#define FXFT_Get_MM_Axis_Def(axis) ((FT_Var_Axis*)axis)->def
+#define FXFT_Get_Face_Internal_Flag(face) ((FT_Face)face)->internal->transform_flags
+#define FXFT_Set_Face_Internal_Flag(face, flag) (((FT_Face)face)->internal->transform_flags = flag)
+#define FXFT_Alloc(library, size) ((FT_Library)library)->memory->alloc(((FT_Library)library)->memory, size)
+#define FXFT_Free(face, p) ((FT_Face)face)->memory->free(((FT_Face)face)->memory, p)
+#define FXFT_Get_Glyph_Outline(face) &((FT_Face)face)->glyph->outline
+#define FXFT_Get_Outline_Bbox(outline, cbox) FT_Outline_Get_CBox(outline, cbox)
+#define FXFT_Render_Glyph(face, mode) FT_Render_Glyph(((FT_Face)face)->glyph, (enum FT_Render_Mode_)mode)
+#define FXFT_Get_MM_Var(face, p) FT_Get_MM_Var((FT_Face)face, p)
+#define FXFT_Set_MM_Design_Coordinates(face, n, p) FT_Set_MM_Design_Coordinates((FT_Face)face, n, p)
+#define FXFT_Set_Pixel_Sizes(face, w, h) FT_Set_Pixel_Sizes((FT_Face)face, w, h)
+#define FXFT_Set_Transform(face, m, d) FT_Set_Transform((FT_Face)face, m, d)
+#define FXFT_Outline_Embolden(outline, s) FT_Outline_Embolden(outline, s)
+#define FXFT_Get_Glyph_Bitmap(face) &((FT_Face)face)->glyph->bitmap
+#define FXFT_Get_Bitmap_Width(bitmap) ((FT_Bitmap*)bitmap)->width
+#define FXFT_Get_Bitmap_Rows(bitmap) ((FT_Bitmap*)bitmap)->rows
+#define FXFT_Get_Bitmap_PixelMode(bitmap) ((FT_Bitmap*)bitmap)->pixel_mode
+#define FXFT_Get_Bitmap_Pitch(bitmap) ((FT_Bitmap*)bitmap)->pitch
+#define FXFT_Get_Bitmap_Buffer(bitmap) ((FT_Bitmap*)bitmap)->buffer
+#define FXFT_Get_Glyph_BitmapLeft(face) ((FT_Face)face)->glyph->bitmap_left
+#define FXFT_Get_Glyph_BitmapTop(face) ((FT_Face)face)->glyph->bitmap_top
+#define FXFT_Outline_Decompose(outline, funcs, params) FT_Outline_Decompose(outline, funcs, params)
+#define FXFT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution) FT_Set_Char_Size(face, char_width, char_height, horz_resolution, vert_resolution)
+#define FXFT_Get_Glyph(slot, aglyph) FT_Get_Glyph(slot, aglyph)
+#define FXFT_Glyph_Get_CBox(glyph, bbox_mode, acbox) FT_Glyph_Get_CBox(glyph, bbox_mode, acbox)
+#define FXFT_Done_Glyph(glyph) FT_Done_Glyph(glyph)
+#define FXFT_Library_SetLcdFilter(library, filter) FT_Library_SetLcdFilter((FT_Library)(library), filter)
+int FXFT_unicode_from_adobe_name(const char* name);
+void FXFT_adobe_name_from_unicode(char* name, unsigned int unicode);
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/include/fxge/fx_ge.h b/core/include/fxge/fx_ge.h
new file mode 100644
index 0000000000..ab0bf3572a
--- /dev/null
+++ b/core/include/fxge/fx_ge.h
@@ -0,0 +1,733 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_GE_H_
+#define _FX_GE_H_
+#ifndef _FX_DIB_H_
+#include "fx_dib.h"
+#endif
+#ifndef _FX_FONT_H_
+#include "fx_font.h"
+#endif
+class CFX_ClipRgn;
+class CFX_PathData;
+class CFX_GraphStateData;
+class CFX_Font;
+class CFX_FontMgr;
+class CFX_FontCache;
+class CFX_FaceCache;
+class CFX_RenderDevice;
+class IFX_RenderDeviceDriver;
+class CCodec_ModuleMgr;
+class IFXG_PaintModuleMgr;
+class CFX_GEModule : public CFX_Object
+{
+public:
+
+ static void Create();
+
+ static void Use(CFX_GEModule* pMgr);
+
+ static CFX_GEModule* Get();
+
+ static void Destroy();
+public:
+
+ CFX_FontCache* GetFontCache();
+ CFX_FontMgr* GetFontMgr()
+ {
+ return m_pFontMgr;
+ }
+ void SetTextGamma(FX_FLOAT gammaValue);
+ FX_LPCBYTE GetTextGammaTable();
+ void SetExtFontMapper(IFX_FontMapper* pFontMapper);
+
+ void SetCodecModule(CCodec_ModuleMgr* pCodecModule)
+ {
+ m_pCodecModule = pCodecModule;
+ }
+ CCodec_ModuleMgr* GetCodecModule()
+ {
+ return m_pCodecModule;
+ }
+ FXFT_Library m_FTLibrary;
+ void* GetPlatformData()
+ {
+ return m_pPlatformData;
+ }
+protected:
+
+ CFX_GEModule();
+
+ ~CFX_GEModule();
+ void InitPlatform();
+ void DestroyPlatform();
+private:
+ FX_BYTE m_GammaValue[256];
+ CFX_FontCache* m_pFontCache;
+ CFX_FontMgr* m_pFontMgr;
+ CCodec_ModuleMgr* m_pCodecModule;
+ void* m_pPlatformData;
+};
+typedef struct {
+
+ FX_FLOAT m_PointX;
+
+ FX_FLOAT m_PointY;
+
+ int m_Flag;
+} FX_PATHPOINT;
+#define FXPT_CLOSEFIGURE 0x01
+#define FXPT_LINETO 0x02
+#define FXPT_BEZIERTO 0x04
+#define FXPT_MOVETO 0x06
+#define FXPT_TYPE 0x06
+#define FXFILL_ALTERNATE 1
+#define FXFILL_WINDING 2
+class CFX_ClipRgn : public CFX_Object
+{
+public:
+
+ CFX_ClipRgn(int device_width, int device_height);
+
+ CFX_ClipRgn(const FX_RECT& rect);
+
+ CFX_ClipRgn(const CFX_ClipRgn& src);
+
+ ~CFX_ClipRgn();
+
+ typedef enum {
+ RectI,
+ MaskF
+ } ClipType;
+
+ void Reset(const FX_RECT& rect);
+
+ ClipType GetType() const
+ {
+ return m_Type;
+ }
+
+ const FX_RECT& GetBox() const
+ {
+ return m_Box;
+ }
+
+ CFX_DIBitmapRef GetMask() const
+ {
+ return m_Mask;
+ }
+
+ void IntersectRect(const FX_RECT& rect);
+
+ void IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask);
+protected:
+
+ ClipType m_Type;
+
+ FX_RECT m_Box;
+
+ CFX_DIBitmapRef m_Mask;
+
+ void IntersectMaskRect(FX_RECT rect, FX_RECT mask_box, CFX_DIBitmapRef Mask);
+};
+extern const FX_BYTE g_GammaRamp[256];
+extern const FX_BYTE g_GammaInverse[256];
+#define FX_GAMMA(value) (value)
+#define FX_GAMMA_INVERSE(value) (value)
+inline FX_ARGB ArgbGamma(FX_ARGB argb)
+{
+ return argb;
+}
+inline FX_ARGB ArgbGammaInverse(FX_ARGB argb)
+{
+ return argb;
+}
+class CFX_PathData : public CFX_Object
+{
+public:
+
+ CFX_PathData();
+
+ CFX_PathData(const CFX_PathData& src);
+
+ ~CFX_PathData();
+
+
+
+
+ int GetPointCount() const
+ {
+ return m_PointCount;
+ }
+
+ int GetFlag(int index) const
+ {
+ return m_pPoints[index].m_Flag;
+ }
+
+ FX_FLOAT GetPointX(int index) const
+ {
+ return m_pPoints[index].m_PointX;
+ }
+
+ FX_FLOAT GetPointY(int index) const
+ {
+ return m_pPoints[index].m_PointY;
+ }
+
+
+
+ FX_PATHPOINT* GetPoints() const
+ {
+ return m_pPoints;
+ }
+
+ FX_BOOL SetPointCount(int nPoints);
+
+ FX_BOOL AllocPointCount(int nPoints);
+
+ FX_BOOL AddPointCount(int addPoints);
+
+ CFX_FloatRect GetBoundingBox() const;
+
+ CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;
+
+ void Transform(const CFX_AffineMatrix* pMatrix);
+
+ FX_BOOL IsRect() const;
+
+ FX_BOOL GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const;
+
+ FX_BOOL IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* rect) const;
+
+ FX_BOOL Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix);
+
+ FX_BOOL AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);
+
+ void SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag);
+
+ void TrimPoints(int nPoints);
+
+ FX_BOOL Copy(const CFX_PathData &src);
+protected:
+ friend class CPDF_Path;
+
+ int m_PointCount;
+
+ FX_PATHPOINT* m_pPoints;
+
+ int m_AllocCount;
+};
+class CFX_GraphStateData : public CFX_Object
+{
+public:
+
+ CFX_GraphStateData();
+
+ CFX_GraphStateData(const CFX_GraphStateData& src);
+
+ ~CFX_GraphStateData();
+
+ void Copy(const CFX_GraphStateData& src);
+
+ void SetDashCount(int count);
+
+
+
+ typedef enum {
+ LineCapButt = 0,
+ LineCapRound = 1,
+ LineCapSquare = 2
+ } LineCap;
+ LineCap m_LineCap;
+ int m_DashCount;
+ FX_FLOAT* m_DashArray;
+ FX_FLOAT m_DashPhase;
+
+ typedef enum {
+ LineJoinMiter = 0,
+ LineJoinRound = 1,
+ LineJoinBevel = 2,
+ } LineJoin;
+ LineJoin m_LineJoin;
+ FX_FLOAT m_MiterLimit;
+ FX_FLOAT m_LineWidth;
+
+};
+#define FXDC_DEVICE_CLASS 1
+#define FXDC_PIXEL_WIDTH 2
+#define FXDC_PIXEL_HEIGHT 3
+#define FXDC_BITS_PIXEL 4
+#define FXDC_HORZ_SIZE 5
+#define FXDC_VERT_SIZE 6
+#define FXDC_RENDER_CAPS 7
+#define FXDC_DITHER_BITS 8
+#define FXDC_DISPLAY 1
+#define FXDC_PRINTER 2
+#define FXRC_GET_BITS 0x01
+#define FXRC_BIT_MASK 0x02
+#define FXRC_ALPHA_MASK 0x04
+#define FXRC_ALPHA_PATH 0x10
+#define FXRC_ALPHA_IMAGE 0x20
+#define FXRC_ALPHA_OUTPUT 0x40
+#define FXRC_BLEND_MODE 0x80
+#define FXRC_SOFT_CLIP 0x100
+#define FXRC_CMYK_OUTPUT 0x200
+#define FXRC_BITMASK_OUTPUT 0x400
+#define FXRC_BYTEMASK_OUTPUT 0x800
+#define FXRENDER_IMAGE_LOSSY 0x1000
+#define FXFILL_ALTERNATE 1
+#define FXFILL_WINDING 2
+#define FXFILL_FULLCOVER 4
+#define FXFILL_RECT_AA 8
+#define FX_FILL_STROKE 16
+#define FX_STROKE_ADJUST 32
+#define FX_STROKE_TEXT_MODE 64
+#define FX_FILL_TEXT_MODE 128
+#define FX_ZEROAREA_FILL 256
+#define FXFILL_NOPATHSMOOTH 512
+#define FXTEXT_CLEARTYPE 0x01
+#define FXTEXT_BGR_STRIPE 0x02
+#define FXTEXT_PRINTGRAPHICTEXT 0x04
+#define FXTEXT_NO_NATIVETEXT 0x08
+#define FXTEXT_PRINTIMAGETEXT 0x10
+#define FXTEXT_NOSMOOTH 0x20
+typedef struct {
+ FX_DWORD m_GlyphIndex;
+ FX_FLOAT m_OriginX, m_OriginY;
+ int m_FontCharWidth;
+ FX_BOOL m_bGlyphAdjust;
+ FX_FLOAT m_AdjustMatrix[4];
+ FX_DWORD m_ExtGID;
+ FX_BOOL m_bFontStyle;
+} FXTEXT_CHARPOS;
+class CFX_RenderDevice : public CFX_Object
+{
+public:
+ CFX_RenderDevice();
+
+ virtual ~CFX_RenderDevice();
+
+ void SetDeviceDriver(IFX_RenderDeviceDriver* pDriver);
+
+ IFX_RenderDeviceDriver* GetDeviceDriver() const
+ {
+ return m_pDeviceDriver;
+ }
+
+ FX_BOOL StartRendering();
+
+ void EndRendering();
+
+
+
+ void SaveState();
+
+ void RestoreState(FX_BOOL bKeepSaved = FALSE);
+
+
+
+
+ int GetWidth() const
+ {
+ return m_Width;
+ }
+
+ int GetHeight() const
+ {
+ return m_Height;
+ }
+
+ int GetDeviceClass() const
+ {
+ return m_DeviceClass;
+ }
+
+ int GetBPP() const
+ {
+ return m_bpp;
+ }
+
+ int GetRenderCaps() const
+ {
+ return m_RenderCaps;
+ }
+
+ int GetDeviceCaps(int id) const;
+
+ CFX_Matrix GetCTM() const;
+
+
+ CFX_DIBitmap* GetBitmap() const
+ {
+ return m_pBitmap;
+ }
+ void SetBitmap(CFX_DIBitmap* pBitmap)
+ {
+ m_pBitmap = pBitmap;
+ }
+
+ FX_BOOL CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const;
+
+ const FX_RECT& GetClipBox() const
+ {
+ return m_ClipBox;
+ }
+
+ FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+
+ FX_BOOL SetClip_Rect(const FX_RECT* pRect);
+
+ FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+
+ FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL
+ );
+
+ FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int fill_mode = 0, int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL);
+
+ CFX_DIBitmap* GetBackDrop();
+
+ FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_type = FXDIB_BLEND_NORMAL,
+ void* pIccTransform = NULL);
+
+ FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,
+ FX_DWORD flags = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top, int dest_width, int dest_height,
+ FX_DWORD color, FX_DWORD flags = 0, int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+
+ FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);
+
+ void CancelDIBits(FX_LPVOID handle);
+
+ FX_BOOL DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_DWORD fill_color, FX_DWORD text_flags,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
+ const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_DWORD stroke_color, CFX_PathData* pClippingPath, int nFlag = 0,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual void Begin() {}
+ virtual void End() {}
+private:
+
+ CFX_DIBitmap* m_pBitmap;
+
+
+
+ int m_Width;
+
+ int m_Height;
+
+ int m_bpp;
+
+ int m_RenderCaps;
+
+ int m_DeviceClass;
+
+ FX_RECT m_ClipBox;
+
+protected:
+
+ IFX_RenderDeviceDriver* m_pDeviceDriver;
+private:
+
+ void InitDeviceInfo();
+
+ void UpdateClipBox();
+};
+class CFX_FxgeDevice : public CFX_RenderDevice
+{
+public:
+
+ CFX_FxgeDevice();
+
+ ~CFX_FxgeDevice();
+
+ FX_BOOL Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
+
+ FX_BOOL Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);
+protected:
+
+ FX_BOOL m_bOwnedBitmap;
+};
+class CFX_SkiaDevice : public CFX_RenderDevice
+{
+public:
+
+ CFX_SkiaDevice();
+
+ ~CFX_SkiaDevice();
+
+ FX_BOOL Attach(CFX_DIBitmap* pBitmap, int dither_bits = 0, FX_BOOL bRgbByteOrder = FALSE, CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
+
+ FX_BOOL Create(int width, int height, FXDIB_Format format, int dither_bits = 0, CFX_DIBitmap* pOriDevice = NULL);
+protected:
+
+ FX_BOOL m_bOwnedBitmap;
+};
+class IFX_RenderDeviceDriver : public CFX_Object
+{
+public:
+
+ static IFX_RenderDeviceDriver* CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder = FALSE,
+ CFX_DIBitmap* pOriDevice = NULL, FX_BOOL bGroupKnockout = FALSE);
+
+ virtual ~IFX_RenderDeviceDriver() {}
+ virtual void Begin() { }
+ virtual void End() { }
+
+ virtual int GetDeviceCaps(int caps_id) = 0;
+
+ virtual CFX_Matrix GetCTM() const
+ {
+ return CFX_Matrix();
+ }
+
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL StartRendering()
+ {
+ return TRUE;
+ }
+
+ virtual void EndRendering() {}
+
+
+
+
+ virtual void SaveState() = 0;
+
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE) = 0;
+
+
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ ) = 0;
+
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL
+ ) = 0;
+
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL)
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect) = 0;
+
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE)
+ {
+ return FALSE;
+ }
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return NULL;
+ }
+
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int blend_type,
+ int alpha_flag = 0, void* pIccTransform = NULL) = 0;
+
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;
+
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL) = 0;
+
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+ {
+ return FALSE;
+ }
+
+ virtual void CancelDIBits(FX_LPVOID handle) {}
+
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ return FALSE;
+ }
+
+ virtual void* GetPlatformSurface()
+ {
+ return NULL;
+ }
+
+ virtual int GetDriverType()
+ {
+ return 0;
+ }
+
+ virtual void ClearDriver() {}
+};
+class IFX_PSOutput
+{
+public:
+
+ virtual void OutputPS(FX_LPCSTR string, int len) = 0;
+ virtual void Release() = 0;
+};
+class CPSFont;
+class CFX_PSRenderer : public CFX_Object
+{
+public:
+
+ CFX_PSRenderer();
+
+ ~CFX_PSRenderer();
+
+ void Init(IFX_PSOutput* pOutput, int ps_level, int width, int height, FX_BOOL bCmykOutput);
+ FX_BOOL StartRendering();
+ void EndRendering();
+
+ void SaveState();
+
+ void RestoreState(FX_BOOL bKeepSaved = FALSE);
+
+ void SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+
+ void SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+
+ FX_RECT GetClipBox()
+ {
+ return m_ClipBox;
+ }
+
+ FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL
+ );
+
+ FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL DrawDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+
+ FX_BOOL DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont, CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+private:
+
+ IFX_PSOutput* m_pOutput;
+
+ int m_PSLevel;
+
+ CFX_GraphStateData m_CurGraphState;
+
+ FX_BOOL m_bGraphStateSet;
+
+ FX_BOOL m_bCmykOutput;
+
+ FX_BOOL m_bColorSet;
+
+ FX_DWORD m_LastColor;
+
+ FX_RECT m_ClipBox;
+
+ CFX_ArrayTemplate<CPSFont*> m_PSFontList;
+
+ CFX_ArrayTemplate<FX_RECT> m_ClipBoxStack;
+ FX_BOOL m_bInited;
+
+ void OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);
+
+ void SetGraphState(const CFX_GraphStateData* pGraphState);
+
+ void SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform);
+
+ void FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos, int& ps_fontnum, int &ps_glyphindex);
+
+ void WritePSBinary(FX_LPCBYTE data, int len);
+};
+#endif
diff --git a/core/include/fxge/fx_ge_apple.h b/core/include/fxge/fx_ge_apple.h
new file mode 100644
index 0000000000..f13a1b38be
--- /dev/null
+++ b/core/include/fxge/fx_ge_apple.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_GE_APPLE_H_
+#define _FX_GE_APPLE_H_
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+class CFX_QuartzDevice : public CFX_RenderDevice
+{
+public:
+ CFX_QuartzDevice();
+ ~CFX_QuartzDevice();
+ FX_BOOL Attach(CGContextRef context, FX_INT32 nDeviceClass = FXDC_DISPLAY);
+ FX_BOOL Attach(CFX_DIBitmap* pBitmap);
+ FX_BOOL Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format);
+
+ CGContextRef GetContext();
+
+protected:
+ CGContextRef m_pContext;
+ FX_BOOL m_bOwnedBitmap;
+};
+#endif
+#endif
diff --git a/core/include/fxge/fx_ge_win32.h b/core/include/fxge/fx_ge_win32.h
new file mode 100644
index 0000000000..0b421db788
--- /dev/null
+++ b/core/include/fxge/fx_ge_win32.h
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_GE_WIN32_H_
+#define _FX_GE_WIN32_H_
+#ifdef _WIN32
+#ifndef _WINDOWS_
+#include <windows.h>
+#endif
+#define WINDIB_OPEN_MEMORY 0x1
+#define WINDIB_OPEN_PATHNAME 0x2
+typedef struct WINDIB_Open_Args_ {
+
+ int flags;
+
+ const FX_BYTE* memory_base;
+
+ size_t memory_size;
+
+ FX_LPCWSTR path_name;
+} WINDIB_Open_Args_;
+class CFX_WindowsDIB : public CFX_DIBitmap
+{
+public:
+
+ static CFX_ByteString GetBitmapInfo(const CFX_DIBitmap* pBitmap);
+
+ static CFX_DIBitmap* LoadFromBuf(BITMAPINFO* pbmi, void* pData);
+
+ static HBITMAP GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC);
+
+ static CFX_DIBitmap* LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette = NULL, FX_DWORD size = 256);
+
+ static CFX_DIBitmap* LoadFromFile(FX_LPCWSTR filename);
+
+ static CFX_DIBitmap* LoadFromFile(FX_LPCSTR filename)
+ {
+ return LoadFromFile(CFX_WideString::FromLocal(filename));
+ }
+
+ static CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
+
+ CFX_WindowsDIB(HDC hDC, int width, int height);
+
+ ~CFX_WindowsDIB();
+
+ HDC GetDC() const
+ {
+ return m_hMemDC;
+ }
+
+ HBITMAP GetWindowsBitmap() const
+ {
+ return m_hBitmap;
+ }
+
+ void LoadFromDevice(HDC hDC, int left, int top);
+
+ void SetToDevice(HDC hDC, int left, int top);
+protected:
+
+ HDC m_hMemDC;
+
+ HBITMAP m_hBitmap;
+
+ HBITMAP m_hOldBitmap;
+};
+class CFX_WindowsDevice : public CFX_RenderDevice
+{
+public:
+ static IFX_RenderDeviceDriver* CreateDriver(HDC hDC, FX_BOOL bCmykOutput = FALSE);
+
+ CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput = FALSE, FX_BOOL bForcePSOutput = FALSE, int psLevel = 2);
+
+ HDC GetDC() const;
+
+ FX_BOOL m_bForcePSOutput;
+
+ static int m_psLevel;
+};
+class CFX_WinBitmapDevice : public CFX_RenderDevice
+{
+public:
+
+ CFX_WinBitmapDevice(int width, int height, FXDIB_Format format);
+
+ ~CFX_WinBitmapDevice();
+
+ HDC GetDC()
+ {
+ return m_hDC;
+ }
+protected:
+
+ HBITMAP m_hBitmap;
+
+ HBITMAP m_hOldBitmap;
+
+ HDC m_hDC;
+};
+#endif
+#endif
diff --git a/core/include/reflow/fpdf_layout.h b/core/include/reflow/fpdf_layout.h
new file mode 100644
index 0000000000..fc01ba30c8
--- /dev/null
+++ b/core/include/reflow/fpdf_layout.h
@@ -0,0 +1,280 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFAPI_LAYOUT_H_
+#define _FPDFAPI_LAYOUT_H_
+class IPDF_LayoutElement;
+class IPDF_LayoutProcessor;
+class IPDF_LayoutProvider;
+typedef enum {
+ LayoutUnknown,
+ LayoutArifact,
+ LayoutDocument,
+ LayoutPart,
+ LayoutArt,
+ LayoutSect,
+ LayoutDiv,
+ LayoutBlockQuote,
+ LayoutCaption,
+ LayoutTOC,
+ LayoutTOCI,
+ LayoutIndex,
+ LayoutNonStruct,
+ LayoutPrivate,
+ LayoutParagraph,
+ LayoutHeading,
+ LayoutHeading1,
+ LayoutHeading2,
+ LayoutHeading3,
+ LayoutHeading4,
+ LayoutHeading5,
+ LayoutHeading6,
+ LayoutList,
+ LayoutListItem,
+ LayoutListLabel,
+ LayoutListBody,
+ LayoutTable,
+ LayoutTableRow,
+ LayoutTableHeaderCell,
+ LayoutTableDataCell,
+ LayoutTableHeaderGroup,
+ LayoutTableBodyGroup,
+ LayoutTableFootGroup,
+ LayoutSpan,
+ LayoutQuote,
+ LayoutNote,
+ LayoutReference,
+ LayoutBibEntry,
+ LayoutCode,
+ LayoutLink,
+ LayoutAnnot,
+ LayoutRuby,
+ LayoutRubyBase,
+ LayoutRubyAnnot,
+ LayoutRubyPunc,
+ LayoutWarichu,
+ LayoutWarichuText,
+ LayoutWarichuPunc,
+ LayoutFigure,
+ LayoutFormula,
+ LayoutForm,
+} LayoutType;
+typedef enum {
+ LayoutArtifactType,
+ LayoutArtifactAttached,
+ LayoutArtifactSubType,
+ LayoutPlacement,
+ LayoutWritingMode,
+ LayoutBackgroundColor,
+ LayoutBorderColor,
+ LayoutBorderStyle,
+ LayoutBorderThickness,
+ LayoutPadding,
+ LayoutColor,
+ LayoutSpaceBefore,
+ LayoutSpaceAfter,
+ LayoutStartIndent,
+ LayoutEndIndent,
+ LayoutTextIndent,
+ LayoutTextAlign,
+ LayoutBBox,
+ LayoutWidth,
+ LayoutHeight,
+ LayoutBlockAlign,
+ LayoutInlineAlign,
+ LayoutTBorderStyle,
+ LayoutTPadding,
+ LayoutBaselineShift,
+ LayoutLineHeight,
+ LayoutTextDecorationColor,
+ LayoutTextDecorationThickness,
+ LayoutTextDecorationType,
+ LayoutRubyAlign,
+ LayoutRubyPosition,
+ LayoutGlyphOrientationVertical,
+ LayoutColumnCount,
+ LayoutColumnGap,
+ LayoutColumnWidths,
+ LayoutListNumbering,
+ LayoutFieldRole,
+ LayoutFieldChecked,
+ LayoutFieldDesc,
+ LayoutRowSpan,
+ LayoutColSpan,
+ LayoutTableHeaders,
+ LayoutTableHeaderScope,
+ LayoutTableSummary,
+} LayoutAttr;
+typedef enum {
+ LayoutInvalid = 0,
+ LayoutBlock,
+ LayoutInline,
+ LayoutBefore,
+ LayoutAfter,
+ LayoutStart,
+ LayoutEnd,
+ LayoutLrTb,
+ LayoutRlTb,
+ LayoutTbRl,
+ LayoutNone,
+ LayoutHidden,
+ LayoutDotted,
+ LayoutDashed,
+ LayoutSolid,
+ LayoutDouble,
+ LayoutGroove,
+ LayoutRidge,
+ LayoutInset,
+ LayoutOutset,
+ LayoutNormal,
+ LayoutAuto,
+ LayoutCenter,
+ LayoutJustify,
+ LayoutMiddle,
+ LayoutUnderline,
+ LayoutOverline,
+ LayoutLineThrough,
+ LayoutDistribute,
+ LayoutMinus90Degree,
+ LayoutZeroDegree,
+ Layout90Degree,
+ Layout180Degree,
+ Layout270Degree,
+ LayoutDisc,
+ LayoutCircle,
+ LayoutSquare,
+ LayoutDecimal,
+ LayoutUpperRoman,
+ LayoutLowerRoman,
+ LayoutUpperAlpha,
+ LayoutLowerAlpha,
+ LayoutRB,
+ LayoutCB,
+ LayoutPB,
+ LayoutTV,
+ LayoutOn,
+ LayoutOff,
+ LayoutNeutral,
+ LayoutRow,
+ LayoutColumn,
+ LayoutBoth,
+ LayoutLeft,
+ LayoutTop,
+ LayoutBottom,
+ LayoutRight,
+ LayoutPagination,
+ LayoutLayout,
+ LayoutPage,
+ LayoutBackground,
+ LayoutHeader,
+ LayoutFooter,
+ LayoutWatermark,
+} LayoutEnum;
+class IPDF_LayoutElement
+{
+public:
+
+ virtual ~IPDF_LayoutElement() {};
+
+
+ virtual LayoutType GetType() = 0;
+
+ virtual int CountAttrValues(LayoutAttr attr_type) = 0;
+
+
+ virtual LayoutEnum GetEnumAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+ virtual FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+ virtual FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index = 0) = 0;
+
+
+ virtual int CountChildren() = 0;
+
+
+ virtual IPDF_LayoutElement* GetChild(int index) = 0;
+
+
+ virtual IPDF_LayoutElement* GetParent() = 0;
+
+
+ virtual int CountObjects() = 0;
+
+ virtual CPDF_PageObject* GetObject(int index) = 0;
+};
+typedef enum {
+ LayoutReady,
+ LayoutFinished,
+ LayoutToBeContinued,
+ LayoutError
+} LayoutStatus;
+#define RF_PARSER_IMAGE 0x1
+#define RF_PARSER_DEBUGINFO 0x2
+#define RF_PARSER_PAGEMODE 0x4
+#define RF_PARSER_READERORDER 0x8
+class IPDF_LayoutProcessor
+{
+public:
+
+ virtual ~IPDF_LayoutProcessor() {};
+
+ static IPDF_LayoutProcessor* Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace = 0);
+
+ static IPDF_LayoutProcessor* Create_LayoutProcessor_2HTML(FX_LPCSTR fileName);
+
+ virtual LayoutStatus StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL) = 0;
+
+ virtual LayoutStatus Continue() = 0;
+ virtual int GetPosition() = 0;
+};
+#define LP_Lang_Unknow 0x0
+#define LP_Lang_English 0x1
+#define LP_Lang_French 0x2
+#define LP_Lang_Italian 0x4
+#define LP_Lang_German 0x8
+#define LP_Lang_Spanish 0x10
+#define LP_Lang_Polish 0x20
+#define LP_Lang_Russian 0x40
+#define LP_Lang_ChinesePRC 0x80
+#define LP_Lang_ChineseTaiwan 0x100
+#define LP_Lang_Japanese 0x200
+#define LP_Lang_Korean 0x400
+#define LP_Lang_Portuguese 0x800
+#define LP_Lang_Turkish 0x1000
+#define LP_Lang_Dutch 0x2000
+typedef struct _LayoutProviderStyle {
+ _LayoutProviderStyle()
+ {
+ m_Language = LP_Lang_Unknow;
+ m_bIgnoreInvisibleText = TRUE;
+ }
+ FX_INT32 m_Language;
+ FX_BOOL m_bIgnoreInvisibleText;
+} LAYOUTPROVIDER_STYLE;
+class IPDF_LayoutProvider
+{
+public:
+
+ virtual ~IPDF_LayoutProvider() {};
+
+ static IPDF_LayoutProvider* Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPageObjs);
+
+ static IPDF_LayoutProvider* Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPageObjs, FX_BOOL bReadOrder);
+
+ virtual void SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style) = 0;
+
+
+
+
+ virtual LayoutStatus StartLoad(IFX_Pause* pPause = NULL) = 0;
+
+ virtual LayoutStatus Continue() = 0;
+ virtual int GetPosition() = 0;
+
+
+ virtual IPDF_LayoutElement* GetRoot() = 0;
+};
+#endif
diff --git a/core/include/reflow/reflowengine.h b/core/include/reflow/reflowengine.h
new file mode 100644
index 0000000000..e6a5265db3
--- /dev/null
+++ b/core/include/reflow/reflowengine.h
@@ -0,0 +1,76 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOW_ENGINE_H
+#define _REFLOW_ENGINE_H
+#include "../fpdfapi/fpdf_render.h"
+#include "../fpdftext/fpdf_text.h"
+#include "fpdf_layout.h"
+#include "../fpdfapi/fpdf_pageobj.h"
+#include "../fpdfdoc/fpdf_tagged.h"
+class IPDF_ReflowedPage
+{
+public:
+ static IPDF_ReflowedPage* Create();
+
+ virtual ~IPDF_ReflowedPage() {}
+ virtual CFX_PrivateData* GetPrivateDataCtrl() = 0;
+
+
+ virtual void GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix) = 0;
+ virtual FX_FLOAT GetPageHeight() = 0;
+ virtual FX_FLOAT GetPageWidth() = 0;
+ virtual void FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str) = 0;
+ virtual FX_BOOL FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y) = 0;
+};
+typedef struct _RF_ParseStyle {
+ _RF_ParseStyle()
+ {
+ m_LineSpace = 0;
+ };
+ FX_FLOAT m_LineSpace;
+} RF_ParseStyle;
+class IPDF_ProgressiveReflowPageParser
+{
+public:
+ static IPDF_ProgressiveReflowPageParser* Create();
+ static FX_BOOL IsTaggedPage(CPDF_PageObjects*pPage);
+
+ virtual ~IPDF_ProgressiveReflowPageParser() {}
+ typedef enum { Ready, ToBeContinued, Done, Failed } ParseStatus;
+
+ virtual ParseStatus GetStatus() = 0;
+ virtual void SetParserStyle(RF_ParseStyle style) = 0;
+ virtual void Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags) = 0;
+ virtual void Continue(IFX_Pause* pPause) = 0;
+
+ virtual int GetPosition() = 0;
+
+
+ virtual void Clear() = 0;
+};
+class IPDF_ProgressiveReflowPageRender
+{
+public:
+ static IPDF_ProgressiveReflowPageRender* Create();
+
+ virtual ~IPDF_ProgressiveReflowPageRender() {}
+ typedef enum { Ready, ToBeContinued, Waiting, Done, Failed } RenderStatus;
+
+ virtual RenderStatus GetStatus() = 0;
+
+
+ virtual void Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits ) = 0;
+ virtual void Continue(IFX_Pause* pPause) = 0;
+ virtual int GetPosition() = 0;
+
+
+ virtual void Clear() = 0;
+};
+IPDF_ReflowedPage* Create_ReflowPage();
+IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser();
+IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender();
+#endif
diff --git a/core/include/thirdparties/freetype/foxitnames.h b/core/include/thirdparties/freetype/foxitnames.h
new file mode 100644
index 0000000000..5749f9b6b3
--- /dev/null
+++ b/core/include/thirdparties/freetype/foxitnames.h
@@ -0,0 +1,283 @@
+#ifndef _FX_FREETYPE_DONT_RENAME_
+// To avoid any possible linking confliction, we rename all FreeType exported names
+
+#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType
+#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType
+#define FT_New_Face FPDFAPI_FT_New_Face
+#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap
+#define FT_Done_Face FPDFAPI_FT_Done_Face
+#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index
+#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face
+#define FT_MulDiv FPDFAPI_FT_MulDiv
+#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform
+#define FT_Cos FPDFAPI_FT_Cos
+#define FT_Sin FPDFAPI_FT_Sin
+#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph
+#define FT_DivFix FPDFAPI_FT_DivFix
+#define FT_Realloc FPDFAPI_FT_Realloc
+#define FT_Alloc FPDFAPI_FT_Alloc
+#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index
+#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints
+#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add
+#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs
+#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate
+#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform
+#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox
+#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind
+#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints
+#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New
+#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra
+#define FT_Free FPDFAPI_FT_Free
+#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap
+#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define FT_QAlloc FPDFAPI_FT_QAlloc
+#define FT_QRealloc FPDFAPI_FT_QRealloc
+#define FT_List_Find FPDFAPI_FT_List_Find
+#define FT_List_Add FPDFAPI_FT_List_Add
+#define FT_List_Insert FPDFAPI_FT_List_Insert
+#define FT_List_Remove FPDFAPI_FT_List_Remove
+#define FT_List_Up FPDFAPI_FT_List_Up
+#define FT_List_Iterate FPDFAPI_FT_List_Iterate
+#define FT_List_Finalize FPDFAPI_FT_List_Finalize
+#define ft_highpow2 FPDFAPI_ft_highpow2
+#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory
+#define FT_Stream_Close FPDFAPI_FT_Stream_Close
+#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek
+#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip
+#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos
+#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt
+#define FT_Stream_Read FPDFAPI_FT_Stream_Read
+#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead
+#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame
+#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame
+#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame
+#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame
+#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar
+#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort
+#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE
+#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset
+#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong
+#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE
+#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar
+#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort
+#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE
+#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset
+#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong
+#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE
+#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields
+#define FT_RoundFix FPDFAPI_FT_RoundFix
+#define FT_CeilFix FPDFAPI_FT_CeilFix
+#define FT_FloorFix FPDFAPI_FT_FloorFix
+#define FT_Sqrt32 FPDFAPI_FT_Sqrt32
+#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed
+#define FT_Tan FPDFAPI_FT_Tan
+#define FT_Atan2 FPDFAPI_FT_Atan2
+#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit
+#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate
+#define FT_Vector_Length FPDFAPI_FT_Vector_Length
+#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize
+#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar
+#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff
+#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose
+#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal
+#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal
+#define FT_Outline_New FPDFAPI_FT_Outline_New
+#define FT_Outline_Check FPDFAPI_FT_Outline_Check
+#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy
+#define FT_Outline_Done FPDFAPI_FT_Outline_Done
+#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse
+#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer
+#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer
+#define FT_Outline_Render FPDFAPI_FT_Outline_Render
+#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap
+#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation
+#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden
+#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset
+#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare
+#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup
+#define ft_validator_init FPDFAPI_ft_validator_init
+#define ft_validator_run FPDFAPI_ft_validator_run
+#define ft_validator_error FPDFAPI_ft_validator_error
+#define FT_Stream_New FPDFAPI_FT_Stream_New
+#define FT_Stream_Free FPDFAPI_FT_Stream_Free
+#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap
+#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap
+#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap
+#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap
+#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot
+#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot
+#define FT_Set_Transform FPDFAPI_FT_Set_Transform
+#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal
+#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph
+#define FT_Load_Char FPDFAPI_FT_Load_Char
+#define FT_New_Size FPDFAPI_FT_New_Size
+#define FT_Open_Face FPDFAPI_FT_Open_Face
+#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream
+#define FT_Attach_File FPDFAPI_FT_Attach_File
+#define FT_Done_Size FPDFAPI_FT_Done_Size
+#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size
+#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes
+#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning
+#define FT_CMap_Done FPDFAPI_FT_CMap_Done
+#define FT_CMap_New FPDFAPI_FT_CMap_New
+#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char
+#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char
+#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index
+#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name
+#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name
+#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table
+#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table
+#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info
+#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID
+#define FT_Activate_Size FPDFAPI_FT_Activate_Size
+#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer
+#define FT_Remove_Module FPDFAPI_FT_Remove_Module
+#define FT_Add_Module FPDFAPI_FT_Add_Module
+#define FT_Get_Module FPDFAPI_FT_Get_Module
+#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface
+#define ft_module_get_service FPDFAPI_ft_module_get_service
+#define FT_New_Library FPDFAPI_FT_New_Library
+#define FT_Library_Version FPDFAPI_FT_Library_Version
+#define FT_Done_Library FPDFAPI_FT_Done_Library
+#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook
+#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo
+#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets
+#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess
+#define af_dummy_script_class FPDFAPI_af_dummy_script_class
+#define af_latin_script_class FPDFAPI_af_latin_script_class
+#define af_cjk_script_class FPDFAPI_af_cjk_script_class
+#define af_autofitter_service FPDFAPI_af_autofitter_service
+#define autofit_module_class FPDFAPI_autofit_module_class
+#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec
+#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec
+#define cff_driver_class FPDFAPI_cff_driver_class
+#define FT_Stream_Open FPDFAPI_FT_Stream_Open
+#define FT_New_Memory FPDFAPI_FT_New_Memory
+#define FT_Done_Memory FPDFAPI_FT_Done_Memory
+#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc
+#define ft_mem_alloc FPDFAPI_ft_mem_alloc
+#define ft_mem_free FPDFAPI_ft_mem_free
+#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc
+#define ft_mem_realloc FPDFAPI_ft_mem_realloc
+#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type
+#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes
+#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes
+#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info
+#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count
+#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name
+#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New
+#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy
+#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done
+#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert
+#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden
+#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class
+#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class
+#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply
+#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert
+#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph
+#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy
+#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph
+#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform
+#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox
+#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap
+#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules
+#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master
+#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var
+#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates
+#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates
+#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates
+#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates
+#define ps_table_funcs FPDFAPI_ps_table_funcs
+#define ps_parser_funcs FPDFAPI_ps_parser_funcs
+#define t1_builder_funcs FPDFAPI_t1_builder_funcs
+#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs
+#define afm_parser_funcs FPDFAPI_afm_parser_funcs
+#define t1_cmap_classes FPDFAPI_t1_cmap_classes
+#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec
+#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec
+#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec
+#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec
+#define psaux_module_class FPDFAPI_psaux_module_class
+#define pshinter_module_class FPDFAPI_pshinter_module_class
+#define ps_hints_apply FPDFAPI_ps_hints_apply
+#define psnames_module_class FPDFAPI_psnames_module_class
+#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class
+#define ft_standard_raster FPDFAPI_ft_standard_raster
+#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class
+#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec
+#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec
+#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec
+#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec
+#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec
+#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec
+#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec
+#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec
+#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec
+#define sfnt_module_class FPDFAPI_sfnt_module_class
+#define ft_grays_raster FPDFAPI_ft_grays_raster
+#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class
+#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class
+#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class
+#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state
+#define tt_driver_class FPDFAPI_tt_driver_class
+#define TT_RunIns FPDFAPI_TT_RunIns
+#define TT_New_Context FPDFAPI_TT_New_Context
+#define t1_driver_class FPDFAPI_t1_driver_class
+#define t1cid_driver_class FPDFAPI_t1cid_driver_class
+#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning
+#define FT_Match_Size FPDFAPI_FT_Match_Size
+#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round
+#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics
+#define FT_Request_Size FPDFAPI_FT_Request_Size
+#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics
+#define FT_Select_Size FPDFAPI_FT_Select_Size
+#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics
+#define New_Profile FPDFAPI_New_Profile
+#define End_Profile FPDFAPI_End_Profile
+#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn
+#define Split_Conic FPDFAPI_Split_Conic
+#define Split_Cubic FPDFAPI_Split_Cubic
+#define Line_Up FPDFAPI_Line_Up
+#define Bezier_Up FPDFAPI_Bezier_Up
+#define Bezier_Down FPDFAPI_Bezier_Down
+#define Line_To FPDFAPI_Line_To
+#define Conic_To FPDFAPI_Conic_To
+#define Cubic_To FPDFAPI_Cubic_To
+#define Decompose_Curve FPDFAPI_Decompose_Curve
+#define Convert_Glyph FPDFAPI_Convert_Glyph
+#define Sort FPDFAPI_Sort
+#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init
+#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span
+#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop
+#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step
+#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init
+#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span
+#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop
+#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step
+#define Draw_Sweep FPDFAPI_Draw_Sweep
+#define Render_Single_Pass FPDFAPI_Render_Single_Pass
+#define Render_Glyph FPDFAPI_Render_Glyph
+#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table
+#define InsNew FPDFAPI_InsNew
+#define DelOld FPDFAPI_DelOld
+#define FT_MulFix FPDFAPI_FT_MulFix
+#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled
+#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled
+#define ft_corner_orientation FPDFAPI_ft_corner_orientation
+#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat
+#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format
+#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn
+#define ft_mem_dup FPDFAPI_ft_mem_dup
+#define ft_mem_strdup FPDFAPI_ft_mem_strdup
+#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault
+#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant
+#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar
+#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors
+#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex
+#define FT_Get_Advances FPDFAPI_FT_Get_Advances
+#define FT_Get_Advance FPDFAPI_FT_Get_Advance
+#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter
+
+#endif // !_FX_FREETYPE_DONT_RENAME_
diff --git a/core/include/thirdparties/freetype/freetype/config/ftconfig.h b/core/include/thirdparties/freetype/freetype/config/ftconfig.h
new file mode 100644
index 0000000000..e4eb4dcba2
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftconfig.h
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/* */
+/* ftconfig.h */
+/* */
+/* ANSI-specific configuration file (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This header file contains a number of macro definitions that are used */
+ /* by the rest of the engine. Most of the macros here are automatically */
+ /* determined at compile time, and you should not need to change it to */
+ /* port FreeType, except to compile the library with a non-ANSI */
+ /* compiler. */
+ /* */
+ /* Note however that if some specific modifications are needed, we */
+ /* advise you to place a modified copy in your build directory. */
+ /* */
+ /* The build directory is usually `freetype/builds/<system>', and */
+ /* contains system-specific files that are always included first when */
+ /* building the library. */
+ /* */
+ /* This ANSI version should stay in `include/freetype/config'. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include "../../ft2build.h"
+#include "ftoption.h"
+#include "ftstdlib.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* PLATFORM-SPECIFIC CONFIGURATION MACROS */
+ /* */
+ /* These macros can be toggled to suit a specific system. The current */
+ /* ones are defaults used to compile FreeType in an ANSI C environment */
+ /* (16bit compilers are also supported). Copy this file to your own */
+ /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+ /* */
+ /*************************************************************************/
+
+
+ /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+ /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */
+ /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */
+ /* is probably unexpected. */
+ /* */
+ /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */
+ /* `char' type. */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT CHAR_BIT
+#endif
+
+
+ /* The size of an `int' type. */
+#if FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT (16 / FT_CHAR_BIT)
+#elif FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+ /* The size of a `long' type. A five-byte `long' (as used e.g. on the */
+ /* DM642) is recognized but avoided. */
+#if FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+ /* FT_UNUSED is a macro used to indicate that a given parameter is not */
+ /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg ) ( (arg) = (arg) )
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* AUTOMATIC CONFIGURATION MACROS */
+ /* */
+ /* These macros are computed from the ones defined above. Don't touch */
+ /* their definition, unless you know precisely what you are doing. No */
+ /* porter should need to mess with them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Mac support */
+ /* */
+ /* This is the only necessary change, so it is defined here instead */
+ /* providing a new configuration file. */
+ /* */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+ /* no Carbon frameworks for 64bit 10.4.x */
+ /* AvailabilityMacros.h is available since Mac OS X 10.2, */
+ /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+ /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit signed integer type. */
+ /* */
+ typedef signed short FT_Int16;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit unsigned integer type. */
+ /* */
+ typedef unsigned short FT_UInt16;
+
+ /* */
+
+
+ /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int32 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 32bit signed integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef signed XXX FT_Int32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt32 */
+ /* */
+ /* A typedef for a 32bit unsigned integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef unsigned XXX FT_UInt32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int64 */
+ /* */
+ /* A typedef for a 64bit signed integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef signed XXX FT_Int64;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt64 */
+ /* */
+ /* A typedef for a 64bit unsigned integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef unsigned XXX FT_UInt64;
+
+ /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+ typedef signed int FT_Int32;
+ typedef unsigned int FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+ typedef signed long FT_Int32;
+ typedef unsigned long FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+ /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+ typedef int FT_Fast;
+ typedef unsigned int FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+ typedef long FT_Fast;
+ typedef unsigned long FT_UFast;
+
+#endif
+
+
+ /* determine whether we have a 64-bit int type for platforms without */
+ /* Autoconf */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+ /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64 long
+#define FT_UINT64 unsigned long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __BORLANDC__ ) /* Borland C++ */
+
+ /* XXXX: We should probably check the value of __BORLANDC__ in order */
+ /* to test the compiler version. */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __WATCOMC__ ) /* Watcom C++ */
+
+ /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#elif defined( __GNUC__ )
+
+ /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+ /*************************************************************************/
+ /* */
+ /* A 64-bit data type will create compilation problems if you compile */
+ /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
+ /* is defined. You can however ignore this rule by defining the */
+ /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
+ /* */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+ /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+#ifdef FT_LONG64
+ typedef FT_INT64 FT_Int64;
+ typedef FT_UINT64 FT_UInt64;
+#endif
+
+
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+ /* Provide assembler fragments for performance-critical functions. */
+ /* These must be defined `static __inline__' with GCC. */
+
+ /**Johnson add !defined( __thumb__ )*/
+#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ ) /* RVCT */
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm
+ {
+ smull t2, t, b, a /* (lo=t2,hi=t) = a*b */
+ mov a, t, asr #31 /* a = (hi >> 31) */
+ add a, a, #0x8000 /* a += 0x8000 */
+ adds t2, t2, a /* t2 += a */
+ adc t, t, #0 /* t += carry */
+ mov a, t2, lsr #16 /* a = t2 >> 16 */
+ orr a, a, t, lsl #16 /* a |= t << 16 */
+ }
+ return a;
+ }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ ) && \
+ !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm__ __volatile__ (
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
+ "adds %1, %1, %0\n\t" /* %1 += %0 */
+ "adc %2, %2, #0\n\t" /* %2 += carry */
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
+ "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
+ : "=r"(a), "=&r"(t2), "=&r"(t)
+ : "r"(a), "r"(b)
+ : "cc" );
+ return a;
+ }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x8000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $16, %%eax\n"
+ "shll $16, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "=d"(b)
+ : "a"(a), "d"(b)
+ : "%ecx", "cc" );
+ return result;
+ }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+ __asm
+ {
+ mov eax, a
+ mov edx, b
+ imul edx
+ mov ecx, edx
+ sar ecx, 31
+ add ecx, 8000h
+ add eax, ecx
+ adc edx, 0
+ shr eax, 16
+ shl edx, 16
+ add eax, edx
+ mov result, eax
+ }
+ return result;
+ }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x ) static x
+#define FT_LOCAL_DEF( x ) static x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x ) extern "C" x
+#define FT_LOCAL_DEF( x ) extern "C" x
+#else
+#define FT_LOCAL( x ) extern x
+#define FT_LOCAL_DEF( x ) x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x ) extern "C" x
+#else
+#define FT_BASE( x ) extern x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x ) x
+#else
+#define FT_BASE_DEF( x ) x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x ) extern "C" x
+#else
+#define FT_EXPORT( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x ) extern "C" x
+#else
+#define FT_EXPORT_DEF( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x ) extern "C" x
+#else
+#define FT_EXPORT_VAR( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+ /* The following macros are needed to compile the library with a */
+ /* C++ compiler and with 16bit compilers. */
+ /* */
+
+ /* This is special. Within C++, you must specify `extern "C"' for */
+ /* functions which are used via function pointers, and you also */
+ /* must do that for structures which contain function pointers to */
+ /* assure C linkage -- it's not possible to have (local) anonymous */
+ /* functions which are accessed by (global) function pointers. */
+ /* */
+ /* */
+ /* FT_CALLBACK_DEF is used to _define_ a callback function. */
+ /* */
+ /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+ /* contains pointers to callback functions. */
+ /* */
+ /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */
+ /* that contains pointers to callback functions. */
+ /* */
+ /* */
+ /* Some 16bit compilers have to redefine these macros to insert */
+ /* the infamous `_cdecl' or `__fastcall' declarations. */
+ /* */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x ) extern "C" x
+#else
+#define FT_CALLBACK_DEF( x ) static x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE extern "C"
+#define FT_CALLBACK_TABLE_DEF extern "C"
+#else
+#define FT_CALLBACK_TABLE extern
+#define FT_CALLBACK_TABLE_DEF /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftheader.h b/core/include/thirdparties/freetype/freetype/config/ftheader.h
new file mode 100644
index 0000000000..d97910471e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftheader.h
@@ -0,0 +1,832 @@
+/***************************************************************************/
+/* */
+/* ftheader.h */
+/* */
+/* Build macros of the FreeType 2 library. */
+/* */
+/* Copyright 1996-2008, 2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_BEGIN_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_END_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER extern "C" {
+#else
+#define FT_BEGIN_HEADER /* nothing */
+#endif
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_END_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_BEGIN_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_END_HEADER }
+#else
+#define FT_END_HEADER /* nothing */
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Aliases for the FreeType 2 public and configuration files. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* header_file_macros */
+ /* */
+ /* <Title> */
+ /* Header File Macros */
+ /* */
+ /* <Abstract> */
+ /* Macro definitions used to #include specific header files. */
+ /* */
+ /* <Description> */
+ /* The following macros are defined to the name of specific */
+ /* FreeType~2 header files. They can be used directly in #include */
+ /* statements as in: */
+ /* */
+ /* { */
+ /* #include "../freetype.h" */
+ /* #include "../ftmm.h" */
+ /* #include "../ftglyph.h" */
+ /* } */
+ /* */
+ /* There are several reasons why we are now using macros to name */
+ /* public header files. The first one is that such macros are not */
+ /* limited to the infamous 8.3~naming rule required by DOS (and */
+ /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */
+ /* */
+ /* The second reason is that it allows for more flexibility in the */
+ /* way FreeType~2 is installed on a given system. */
+ /* */
+ /*************************************************************************/
+
+
+ /* configuration files */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_CONFIG_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 configuration data.
+ *
+ */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_STANDARD_LIBRARY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 interface to the standard C library functions.
+ *
+ */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_OPTIONS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 project-specific configuration options.
+ *
+ */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_MODULES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 modules that are statically linked to new library
+ * instances in @FT_Init_FreeType.
+ *
+ */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h>
+#endif
+
+ /* */
+
+ /* public headers */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_FREETYPE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * base FreeType~2 API.
+ *
+ */
+#define FT_FREETYPE_H <freetype/freetype.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 error codes (and messages).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_ERRORS_H <freetype/fterrors.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 module error offsets (and messages).
+ *
+ */
+#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYSTEM_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 interface to low-level operations (i.e., memory management
+ * and stream i/o).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_SYSTEM_H <freetype/ftsystem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing type
+ * definitions related to glyph images (i.e., bitmaps, outlines,
+ * scan-converter parameters).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_IMAGE_H <freetype/ftimage.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * basic data types defined by FreeType~2.
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_TYPES_H <freetype/fttypes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LIST_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list management API of FreeType~2.
+ *
+ * (Most applications will never need to include this file.)
+ *
+ */
+#define FT_LIST_H <freetype/ftlist.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OUTLINE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * scalable outline management API of FreeType~2.
+ *
+ */
+#define FT_OUTLINE_H <freetype/ftoutln.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SIZES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API which manages multiple @FT_Size objects per face.
+ *
+ */
+#define FT_SIZES_H <freetype/ftsizes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * module management API of FreeType~2.
+ *
+ */
+#define FT_MODULE_H <freetype/ftmodapi.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_RENDER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * renderer module management API of FreeType~2.
+ *
+ */
+#define FT_RENDER_H <freetype/ftrender.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_AUTOHINTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the auto-hinting module.
+ *
+ */
+#define FT_AUTOHINTER_H <freetype/ftautoh.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CFF_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the CFF driver module.
+ *
+ */
+#define FT_CFF_DRIVER_H <freetype/ftcffdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the TrueType driver module.
+ *
+ */
+#define FT_TRUETYPE_DRIVER_H <freetype/ftttdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPE1_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the Type~1 format.
+ *
+ */
+#define FT_TYPE1_TABLES_H <freetype/t1tables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_IDS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * enumeration values which identify name strings, languages, encodings,
+ * etc. This file really contains a _large_ set of constant macro
+ * definitions, taken from the TrueType and OpenType specifications.
+ *
+ */
+#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the TrueType (as well as OpenType) format.
+ *
+ */
+#define FT_TRUETYPE_TABLES_H <freetype/tttables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TAGS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of TrueType four-byte `tags' which identify blocks in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_TRUETYPE_TAGS_H <freetype/tttags.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BDF_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which accesses BDF-specific strings from a
+ * face.
+ *
+ */
+#define FT_BDF_H <freetype/ftbdf.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CID_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which access CID font information from a
+ * face.
+ *
+ */
+#define FT_CID_H <freetype/ftcid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GZIP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports gzip-compressed files.
+ *
+ */
+#define FT_GZIP_H <freetype/ftgzip.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LZW_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports LZW-compressed files.
+ *
+ */
+#define FT_LZW_H <freetype/ftlzw.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BZIP2_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports bzip2-compressed files.
+ *
+ */
+#define FT_BZIP2_H <freetype/ftbzip2.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_WINFONTS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports Windows FNT files.
+ *
+ */
+#define FT_WINFONTS_H <freetype/ftwinfnt.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GLYPH_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional glyph management component.
+ *
+ */
+#define FT_GLYPH_H <freetype/ftglyph.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BITMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional bitmap conversion component.
+ *
+ */
+#define FT_BITMAP_H <freetype/ftbitmap.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BBOX_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional exact bounding box computation routines.
+ *
+ */
+#define FT_BBOX_H <freetype/ftbbox.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional FreeType~2 cache sub-system.
+ *
+ */
+#define FT_CACHE_H <freetype/ftcache.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `glyph image' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for @FT_Glyph elements. You can also
+ * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+ * store small glyph bitmaps, as it will use less memory.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * glyph image-related cache declarations.
+ *
+ */
+#define FT_CACHE_IMAGE_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_SMALL_BITMAPS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `small bitmaps' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for small glyph bitmaps in a relatively
+ * memory-efficient way. You can also use the API defined in
+ * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+ * including scalable outlines.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * small bitmaps-related cache declarations.
+ *
+ */
+#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_CHARMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `charmap' API of the FreeType~2 cache sub-system.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * charmap-based cache declarations.
+ *
+ */
+#define FT_CACHE_CHARMAP_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MAC_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * Macintosh-specific FreeType~2 API. The latter is used to access
+ * fonts embedded in resource forks.
+ *
+ * This header file must be explicitly included by client applications
+ * compiled on the Mac (note that the base API still works though).
+ *
+ */
+#define FT_MAC_H <freetype/ftmac.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MULTIPLE_MASTERS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional multiple-masters management API of FreeType~2.
+ *
+ */
+#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SFNT_NAMES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which accesses embedded `name' strings in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_SFNT_NAMES_H <freetype/ftsnames.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OPENTYPE_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+ * GPOS, GSUB, JSTF).
+ *
+ */
+#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GX_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+ * mort, morx, bsln, just, kern, opbd, trak, prop).
+ *
+ */
+#define FT_GX_VALIDATE_H <freetype/ftgxval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_PFR_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which accesses PFR-specific data.
+ *
+ */
+#define FT_PFR_H <freetype/ftpfr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_STROKER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions to stroke outline paths.
+ */
+#define FT_STROKER_H <freetype/ftstroke.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYNTHESIS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs artificial obliquing and emboldening.
+ */
+#define FT_SYNTHESIS_H <freetype/ftsynth.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_XFREE86_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions specific to the XFree86 and
+ * X.Org X11 servers.
+ */
+#define FT_XFREE86_H <freetype/ftxf86.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRIGONOMETRY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs trigonometric computations (e.g.,
+ * cosines and arc tangents).
+ */
+#define FT_TRIGONOMETRY_H <freetype/fttrigon.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LCD_FILTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_LCD_FILTER_H <freetype/ftlcdfil.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_UNPATENTED_HINTING_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_INCREMENTAL_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GASP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns entries from the TrueType GASP table.
+ */
+#define FT_GASP_H <freetype/ftgasp.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ADVANCES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns individual and ranged glyph advances.
+ */
+#define FT_ADVANCES_H <freetype/ftadvanc.h>
+
+
+ /* */
+
+#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h>
+
+
+ /* The internals of the cache sub-system are no longer exposed. We */
+ /* default to FT_CACHE_H at the moment just in case, but we know of */
+ /* no rogue client that uses them. */
+ /* */
+#define FT_CACHE_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h>
+
+
+ /*
+ * Include internal headers definitions from <freetype/internal/...>
+ * only when building the library.
+ */
+#ifdef FT2_BUILD_LIBRARY
+#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h>
+#include "../internal/internal.h"
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftmodule.h b/core/include/thirdparties/freetype/freetype/config/ftmodule.h
new file mode 100644
index 0000000000..0d31ce6932
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftmodule.h
@@ -0,0 +1,32 @@
+/*
+ * This file registers the FreeType modules compiled into the library.
+ *
+ * If you use GNU make, this file IS NOT USED! Instead, it is created in
+ * the objects directory (normally `<topdir>/objs/') based on information
+ * from `<topdir>/modules.cfg'.
+ *
+ * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ * FreeType without GNU make.
+ *
+ */
+
+//FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftoption.h b/core/include/thirdparties/freetype/freetype/config/ftoption.h
new file mode 100644
index 0000000000..e16e3c199c
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftoption.h
@@ -0,0 +1,833 @@
+/***************************************************************************/
+/* */
+/* ftoption.h */
+/* */
+/* User-selectable configuration macros (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include "../../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* USER-SELECTABLE CONFIGURATION MACROS */
+ /* */
+ /* This file contains the default configuration macro definitions for */
+ /* a standard build of the FreeType library. There are three ways to */
+ /* use this file to build project-specific versions of the library: */
+ /* */
+ /* - You can modify this file by hand, but this is not recommended in */
+ /* cases where you would like to build several versions of the */
+ /* library from a single source directory. */
+ /* */
+ /* - You can put a copy of this file in your build directory, more */
+ /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */
+ /* is the name of a directory that is included _before_ the FreeType */
+ /* include path during compilation. */
+ /* */
+ /* The default FreeType Makefiles and Jamfiles use the build */
+ /* directory `builds/<system>' by default, but you can easily change */
+ /* that for your own projects. */
+ /* */
+ /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */
+ /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */
+ /* locate this file during the build. For example, */
+ /* */
+ /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */
+ /* #include <freetype/config/ftheader.h> */
+ /* */
+ /* will use `$BUILD/myftoptions.h' instead of this file for macro */
+ /* definitions. */
+ /* */
+ /* Note also that you can similarly pre-define the macro */
+ /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+ /* that are statically linked to the library at compile time. By */
+ /* default, this file is <freetype/config/ftmodule.h>. */
+ /* */
+ /* We highly recommend using the third method whenever possible. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Uncomment the line below if you want to activate sub-pixel rendering */
+ /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */
+ /* */
+ /* Note that this feature is covered by several Microsoft patents */
+ /* and should not be activated in any default build of the library. */
+ /* */
+ /* This macro has no impact on the FreeType API, only on its */
+ /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */
+ /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */
+ /* the original size in case this macro isn't defined; however, each */
+ /* triplet of subpixels has R=G=B. */
+ /* */
+ /* This is done to allow FreeType clients to run unmodified, forcing */
+ /* them to display normal gray-level anti-aliased glyphs. */
+ /* */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+ /*************************************************************************/
+ /* */
+ /* Many compilers provide a non-ANSI 64-bit data type that can be used */
+ /* by FreeType to speed up some computations. However, this will create */
+ /* some problems when compiling the library in strict ANSI mode. */
+ /* */
+ /* For this reason, the use of 64-bit integers is normally disabled when */
+ /* the __STDC__ macro is defined. You can however disable this by */
+ /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */
+ /* */
+ /* For most compilers, this will only create compilation warnings when */
+ /* building the library. */
+ /* */
+ /* ObNote: The compiler-specific 64-bit integers are detected in the */
+ /* file `ftconfig.h' either statically or through the */
+ /* `configure' script on supported platforms. */
+ /* */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, do not try to use an assembler version of */
+ /* performance-critical functions (e.g. FT_MulFix). You should only do */
+ /* that to verify that the assembler function works properly, or to */
+ /* execute benchmark tests of the various implementations. */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, try to use an inlined assembler version of */
+ /* the `FT_MulFix' function, which is a `hotspot' when loading and */
+ /* hinting glyphs, and which should be executed as fast as possible. */
+ /* */
+ /* Note that if your compiler or CPU is not supported, this will default */
+ /* to the standard and portable implementation found in `ftcalc.c'. */
+ /* */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+ /*************************************************************************/
+ /* */
+ /* LZW-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `compress' program. This is mostly used to parse many of the PCF */
+ /* files that come with various X11 distributions. The implementation */
+ /* uses NetBSD's `zopen' to partially uncompress the file on the fly */
+ /* (see src/lzw/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+ /*************************************************************************/
+ /* */
+ /* Gzip-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `gzip' program. This is mostly used to parse many of the PCF files */
+ /* that come with XFree86. The implementation uses `zlib' to */
+ /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. See also */
+ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */
+ /* */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+ /*************************************************************************/
+ /* */
+ /* ZLib library selection */
+ /* */
+ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */
+ /* It allows FreeType's `ftgzip' component to link to the system's */
+ /* installation of the ZLib library. This is useful on systems like */
+ /* Unix or VMS where it generally is already available. */
+ /* */
+ /* If you let it undefined, the component will use its own copy */
+ /* of the zlib sources instead. These have been modified to be */
+ /* included directly within the component and *not* export external */
+ /* function names. This allows you to link any program with FreeType */
+ /* _and_ ZLib without linking conflicts. */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+ /*************************************************************************/
+ /* */
+ /* Bzip2-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `bzip2' program. This is mostly used to parse many of the PCF */
+ /* files that come with XFree86. The implementation uses `libbz2' to */
+ /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+ /* Contrary to gzip, bzip2 currently is not included and need to use */
+ /* the system available bzip2 implementation. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define to disable the use of file stream functions and types, FILE, */
+ /* fopen() etc. Enables the use of smaller system libraries on embedded */
+ /* systems that have multiple system libraries, some with or without */
+ /* file stream support, in the cases where file stream support is not */
+ /* necessary such as memory loading of font files. */
+ /* */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+ /*************************************************************************/
+ /* */
+ /* PNG bitmap support. */
+ /* */
+ /* FreeType now handles loading color bitmap glyphs in the PNG format. */
+ /* This requires help from the external libpng library. Uncompressed */
+ /* color bitmaps do not need any external libraries and will be */
+ /* supported regardless of this configuration. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_PNG */
+
+
+ /*************************************************************************/
+ /* */
+ /* DLL export compilation */
+ /* */
+ /* When compiling FreeType as a DLL, some systems/compilers need a */
+ /* special keyword in front OR after the return type of function */
+ /* declarations. */
+ /* */
+ /* Two macros are used within the FreeType source code to define */
+ /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */
+ /* */
+ /* FT_EXPORT( return_type ) */
+ /* */
+ /* is used in a function declaration, as in */
+ /* */
+ /* FT_EXPORT( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ); */
+ /* */
+ /* */
+ /* FT_EXPORT_DEF( return_type ) */
+ /* */
+ /* is used in a function definition, as in */
+ /* */
+ /* FT_EXPORT_DEF( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ) */
+ /* { */
+ /* ... some code ... */
+ /* return FT_Err_Ok; */
+ /* } */
+ /* */
+ /* You can provide your own implementation of FT_EXPORT and */
+ /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */
+ /* will be later automatically defined as `extern return_type' to */
+ /* allow normal compilation. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_EXPORT(x) extern x */
+/* #define FT_EXPORT_DEF(x) x */
+
+
+ /*************************************************************************/
+ /* */
+ /* Glyph Postscript Names handling */
+ /* */
+ /* By default, FreeType 2 is compiled with the `psnames' module. This */
+ /* module is in charge of converting a glyph name string into a */
+ /* Unicode value, or return a Macintosh standard glyph name for the */
+ /* use with the TrueType `post' table. */
+ /* */
+ /* Undefine this macro if you do not want `psnames' compiled in your */
+ /* build of FreeType. This has the following effects: */
+ /* */
+ /* - The TrueType driver will provide its own set of glyph names, */
+ /* if you build it to support postscript names in the TrueType */
+ /* `post' table. */
+ /* */
+ /* - The Type 1 driver will not be able to synthesize a Unicode */
+ /* charmap out of the glyphs found in the fonts. */
+ /* */
+ /* You would normally undefine this configuration macro when building */
+ /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */
+ /* */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Postscript Names to Unicode Values support */
+ /* */
+ /* By default, FreeType 2 is built with the `PSNames' module compiled */
+ /* in. Among other things, the module is used to convert a glyph name */
+ /* into a Unicode value. This is especially useful in order to */
+ /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */
+ /* through a big table named the `Adobe Glyph List' (AGL). */
+ /* */
+ /* Undefine this macro if you do not want the Adobe Glyph List */
+ /* compiled in your `PSNames' module. The Type 1 driver will not be */
+ /* able to synthesize a Unicode charmap out of the glyphs found in the */
+ /* fonts. */
+ /* */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+ /*************************************************************************/
+ /* */
+ /* Support for Mac fonts */
+ /* */
+ /* Define this macro if you want support for outline fonts in Mac */
+ /* format (mac dfont, mac resource, macbinary containing a mac */
+ /* resource) on non-Mac platforms. */
+ /* */
+ /* Note that the `FOND' resource isn't checked. */
+ /* */
+//#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Guessing methods to access embedded resource forks */
+ /* */
+ /* Enable extra Mac fonts support on non-Mac platforms (e.g. */
+ /* GNU/Linux). */
+ /* */
+ /* Resource forks which include fonts data are stored sometimes in */
+ /* locations which users or developers don't expected. In some cases, */
+ /* resource forks start with some offset from the head of a file. In */
+ /* other cases, the actual resource fork is stored in file different */
+ /* from what the user specifies. If this option is activated, */
+ /* FreeType tries to guess whether such offsets or different file */
+ /* names must be used. */
+ /* */
+ /* Note that normal, direct access of resource forks is controlled via */
+ /* the FT_CONFIG_OPTION_MAC_FONTS option. */
+ /* */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Allow the use of FT_Incremental_Interface to load typefaces that */
+ /* contain no glyph data, but supply it via a callback function. */
+ /* This is required by clients supporting document formats which */
+ /* supply font data incrementally as the document is parsed, such */
+ /* as the Ghostscript interpreter for the PostScript language. */
+ /* */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+ /*************************************************************************/
+ /* */
+ /* The size in bytes of the render pool used by the scan-line converter */
+ /* to do all of its work. */
+ /* */
+ /* This must be greater than 4KByte if you use FreeType to rasterize */
+ /* glyphs; otherwise, you may set it to zero to avoid unnecessary */
+ /* allocation of the render pool. */
+ /* */
+#define FT_RENDER_POOL_SIZE 16384L
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MAX_MODULES */
+ /* */
+ /* The maximum number of modules that can be registered in a single */
+ /* FreeType library object. 32 is the default. */
+ /* */
+#define FT_MAX_MODULES 32
+
+
+ /*************************************************************************/
+ /* */
+ /* Debug level */
+ /* */
+ /* FreeType can be compiled in debug or trace mode. In debug mode, */
+ /* errors are reported through the `ftdebug' component. In trace */
+ /* mode, additional messages are sent to the standard output during */
+ /* execution. */
+ /* */
+ /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */
+ /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */
+ /* */
+ /* Don't define any of these macros to compile in `release' mode! */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Autofitter debugging */
+ /* */
+ /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */
+ /* control the autofitter behaviour for debugging purposes with global */
+ /* boolean variables (consequently, you should *never* enable this */
+ /* while compiling in `release' mode): */
+ /* */
+ /* _af_debug_disable_horz_hints */
+ /* _af_debug_disable_vert_hints */
+ /* _af_debug_disable_blue_hints */
+ /* */
+ /* Additionally, the following functions provide dumps of various */
+ /* internal autofit structures to stdout (using `printf'): */
+ /* */
+ /* af_glyph_hints_dump_points */
+ /* af_glyph_hints_dump_segments */
+ /* af_glyph_hints_dump_edges */
+ /* */
+ /* As an argument, they use another global variable: */
+ /* */
+ /* _af_debug_hints */
+ /* */
+ /* Please have a look at the `ftgrid' demo program to see how those */
+ /* variables and macros should be used. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+ /*************************************************************************/
+ /* */
+ /* Memory Debugging */
+ /* */
+ /* FreeType now comes with an integrated memory debugger that is */
+ /* capable of detecting simple errors like memory leaks or double */
+ /* deletes. To compile it within your build of the library, you */
+ /* should define FT_DEBUG_MEMORY here. */
+ /* */
+ /* Note that the memory debugger is only activated at runtime when */
+ /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_MEMORY */
+
+
+ /*************************************************************************/
+ /* */
+ /* Module errors */
+ /* */
+ /* If this macro is set (which is _not_ the default), the higher byte */
+ /* of an error code gives the module in which the error has occurred, */
+ /* while the lower byte is the real error code. */
+ /* */
+ /* Setting this macro makes sense for debugging purposes only, since */
+ /* it would break source compatibility of certain programs that use */
+ /* FreeType 2. */
+ /* */
+ /* More details can be found in the files ftmoderr.h and fterrors.h. */
+ /* */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+ /*************************************************************************/
+ /* */
+ /* Position Independent Code */
+ /* */
+ /* If this macro is set (which is _not_ the default), FreeType2 will */
+ /* avoid creating constants that require address fixups. Instead the */
+ /* constants will be moved into a struct and additional intialization */
+ /* code will be used. */
+ /* */
+ /* Setting this macro is needed for systems that prohibit address */
+ /* fixups, such as BREW. */
+ /* */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** S F N T D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */
+ /* embedded bitmaps in all formats using the SFNT module (namely */
+ /* TrueType & OpenType). */
+ /* */
+#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */
+ /* load and enumerate the glyph Postscript names in a TrueType or */
+ /* OpenType file. */
+ /* */
+ /* Note that when you do not compile the `PSNames' module by undefining */
+ /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */
+ /* contain additional code used to read the PS Names table from a font. */
+ /* */
+ /* (By default, the module uses `PSNames' to extract glyph names.) */
+ /* */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */
+ /* access the internal name table in a SFNT-based format like TrueType */
+ /* or OpenType. The name table contains various strings used to */
+ /* describe the font, like family name, copyright, version, etc. It */
+ /* does not contain any glyph name though. */
+ /* */
+ /* Accessing SFNT names is done through the functions declared in */
+ /* `freetype/ftsnames.h'. */
+ /* */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType CMap support */
+ /* */
+ /* Here you can fine-tune which TrueType CMap table format shall be */
+ /* supported. */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */
+ /* a bytecode interpreter in the TrueType driver. */
+ /* */
+ /* By undefining this, you will only compile the code necessary to load */
+ /* TrueType glyphs without hinting. */
+ /* */
+ /* Do not #undef this macro here, since the build system might */
+ /* define it for certain configurations only. */
+ /* */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */
+ /* EXPERIMENTAL subpixel hinting support into the TrueType driver. This */
+ /* replaces the native TrueType hinting mechanism when anything but */
+ /* FT_RENDER_MODE_MONO is requested. */
+ /* */
+ /* Enabling this causes the TrueType driver to ignore instructions under */
+ /* certain conditions. This is done in accordance with the guide here, */
+ /* with some minor differences: */
+ /* */
+ /* http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+ /* */
+ /* By undefining this, you only compile the code necessary to hint */
+ /* TrueType glyphs with native TT hinting. */
+ /* */
+ /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */
+ /* defined. */
+ /* */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */
+ /* of the TrueType bytecode interpreter is used that doesn't implement */
+ /* any of the patented opcodes and algorithms. The patents related to */
+ /* TrueType hinting have expired worldwide since May 2010; this option */
+ /* is now deprecated. */
+ /* */
+ /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */
+ /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */
+ /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */
+ /* */
+ /* This macro is only useful for a small number of font files (mostly */
+ /* for Asian scripts) that require bytecode interpretation to properly */
+ /* load glyphs. For all other fonts, this produces unpleasant results, */
+ /* thus the unpatented interpreter is never used to load glyphs from */
+ /* TrueType fonts unless one of the following two options is used. */
+ /* */
+ /* - The unpatented interpreter is explicitly activated by the user */
+ /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */
+ /* when opening the FT_Face. */
+ /* */
+ /* - FreeType detects that the FT_Face corresponds to one of the */
+ /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */
+ /* contains a hard-coded list of font names and other matching */
+ /* parameters (see function `tt_face_init' in file */
+ /* `src/truetype/ttobjs.c'). */
+ /* */
+ /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+ /* */
+ /* { */
+ /* FT_Parameter parameter; */
+ /* FT_Open_Args open_args; */
+ /* */
+ /* */
+ /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */
+ /* */
+ /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */
+ /* open_args.pathname = my_font_pathname; */
+ /* open_args.num_params = 1; */
+ /* open_args.params = &parameter; */
+ /* */
+ /* error = FT_Open_Face( library, &open_args, index, &face ); */
+ /* ... */
+ /* } */
+ /* */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */
+ /* bytecode interpreter with a huge switch statement, rather than a call */
+ /* table. This results in smaller and faster code for a number of */
+ /* architectures. */
+ /* */
+ /* Note however that on some compiler/processor combinations, undefining */
+ /* this macro will generate faster, though larger, code. */
+ /* */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */
+ /* TrueType glyph loader to use Apple's definition of how to handle */
+ /* component offsets in composite glyphs. */
+ /* */
+ /* Apple and MS disagree on the default behavior of component offsets */
+ /* in composites. Apple says that they should be scaled by the scaling */
+ /* factors in the transformation matrix (roughly, it's more complex) */
+ /* while MS says they should not. OpenType defines two bits in the */
+ /* composite flags array which can be used to disambiguate, but old */
+ /* fonts will not have them. */
+ /* */
+ /* http://www.microsoft.com/typography/otspec/glyf.htm */
+ /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */
+ /* */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */
+ /* support for Apple's distortable font technology (fvar, gvar, cvar, */
+ /* and avar tables). This has many similarities to Type 1 Multiple */
+ /* Masters support. */
+ /* */
+#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BDF if you want to include support for */
+ /* an embedded `BDF ' table within SFNT-based bitmap formats. */
+ /* */
+#undef TT_CONFIG_OPTION_BDF
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */
+ /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */
+ /* required. */
+ /* */
+#define T1_MAX_DICT_DEPTH 5
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 16
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+ /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 512
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of `t1afm', which is in charge of reading Type 1 AFM */
+ /* files into an existing face. Note that if set, the T1 driver will be */
+ /* unable to produce kerning distances. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of the Multiple Masters font support in the Type 1 */
+ /* driver. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** C F F D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */
+ /* engine gets compiled into FreeType. If defined, it is possible to */
+ /* switch between the two engines using the `hinting-engine' property of */
+ /* the cff driver module. */
+ /* */
+/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */
+ /* support. */
+ /* */
+#define AF_CONFIG_OPTION_CJK
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with Indic script support. */
+ /* */
+#define AF_CONFIG_OPTION_INDIC
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with warp hinting. The idea of the warping */
+ /* code is to slightly scale and shift a glyph within a single dimension */
+ /* so that as much of its segments are aligned (more or less) on the */
+ /* grid. To find out the optimal scaling and shifting value, various */
+ /* parameter combinations are tried and scored. */
+ /* */
+ /* This experimental option is only active if the render mode is */
+ /* FT_RENDER_MODE_LIGHT. */
+ /* */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+ /* */
+
+
+ /*
+ * This macro is obsolete. Support has been removed in FreeType
+ * version 2.5.
+ */
+/* #define FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+ /*
+ * This macro is defined if either unpatented or native TrueType
+ * hinting is requested by the definitions above.
+ */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define TT_USE_BYTECODE_INTERPRETER
+#undef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/config/ftstdlib.h b/core/include/thirdparties/freetype/freetype/config/ftstdlib.h
new file mode 100644
index 0000000000..03be04db34
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/config/ftstdlib.h
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/* */
+/* ftstdlib.h */
+/* */
+/* ANSI-specific library and header configuration file (specification */
+/* only). */
+/* */
+/* Copyright 2002-2007, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to group all #includes to the ANSI C library that */
+ /* FreeType normally requires. It also defines macros to rename the */
+ /* standard functions within the FreeType source code. */
+ /* */
+ /* Load a file which defines __FTSTDLIB_H__ before this one to override */
+ /* it. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t ptrdiff_t
+
+
+ /**********************************************************************/
+ /* */
+ /* integer limits */
+ /* */
+ /* UINT_MAX and ULONG_MAX are used to automatically compute the size */
+ /* of `int' and `long' in bytes at compile-time. So far, this works */
+ /* for all platforms the library has been tested on. */
+ /* */
+ /* Note that on the extremely rare platforms that do not provide */
+ /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */
+ /* old Crays where `int' is 36 bits), we do not make any guarantee */
+ /* about the correct behaviour of FT2 with all fonts. */
+ /* */
+ /* In these case, `ftconfig.h' will refuse to compile anyway with a */
+ /* message like `couldn't find 32-bit type' or something similar. */
+ /* */
+ /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT CHAR_BIT
+#define FT_USHORT_MAX USHRT_MAX
+#define FT_INT_MAX INT_MAX
+#define FT_INT_MIN INT_MIN
+#define FT_UINT_MAX UINT_MAX
+#define FT_ULONG_MAX ULONG_MAX
+
+
+ /**********************************************************************/
+ /* */
+ /* character and string processing */
+ /* */
+ /**********************************************************************/
+
+#include "../../../../fxcrt/fx_system.h"
+#include <string.h>
+
+#define ft_memchr FXSYS_memchr
+#define ft_memcmp FXSYS_memcmp32
+#define ft_memcpy FXSYS_memcpy32
+#define ft_memmove FXSYS_memmove32
+#define ft_memset FXSYS_memset8
+//#define ft_strcat FXSYS_strcat
+#define ft_strcmp FXSYS_strcmp
+#define ft_strcpy FXSYS_strcpy
+#define ft_strlen FXSYS_strlen
+#define ft_strncmp FXSYS_strncmp
+#define ft_strncpy FXSYS_strncpy
+#define ft_strrchr FXSYS_strrchr
+#define ft_strstr FXSYS_strstr
+
+
+ /**********************************************************************/
+ /* */
+ /* file handling */
+ /* */
+ /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE FXSYS_FILE
+#define ft_fclose FXSYS_fclose
+#define ft_fopen FXSYS_fopen
+#define ft_fread FXSYS_fread
+#define ft_fseek FXSYS_fseek
+#define ft_ftell FXSYS_ftell
+#define ft_sprintf FXSYS_sprintf
+
+
+ /**********************************************************************/
+ /* */
+ /* sorting */
+ /* */
+ /**********************************************************************/
+
+
+//#include <stdlib.h>
+
+#define ft_qsort FXSYS_qsort
+
+
+ /**********************************************************************/
+ /* */
+ /* memory allocation */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_scalloc calloc
+#define ft_sfree free
+#define ft_smalloc malloc
+#define ft_srealloc realloc
+
+
+ /**********************************************************************/
+ /* */
+ /* miscellaneous */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_atol FXSYS_atoi
+#define ft_labs labs
+
+
+ /**********************************************************************/
+ /* */
+ /* execution control */
+ /* */
+ /**********************************************************************/
+
+
+//#include <setjmp.h>
+
+#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */
+ /* jmp_buf is defined as a macro */
+ /* on certain platforms */
+
+#define ft_longjmp longjmp
+#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
+
+
+ /* the following is only used for debugging purposes, i.e., if */
+ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/freetype.h b/core/include/thirdparties/freetype/freetype/freetype.h
new file mode 100644
index 0000000000..7a31923dd3
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/freetype.h
@@ -0,0 +1,4016 @@
+/***************************************************************************/
+/* */
+/* freetype.h */
+/* */
+/* FreeType high-level API and common types (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FREETYPE_H__
+#define __FREETYPE_H__
+
+
+#ifndef FT_FREETYPE_H
+#error "`ft2build.h' hasn't been included yet!"
+#error "Please always use macros to include FreeType header files."
+#error "Example:"
+#error " #include <ft2build.h>"
+#error " #include FT_FREETYPE_H"
+#endif
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "fttypes.h"
+#include "fterrors.h"
+
+
+FT_BEGIN_HEADER
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* user_allocation */
+ /* */
+ /* <Title> */
+ /* User allocation */
+ /* */
+ /* <Abstract> */
+ /* How client applications should allocate FreeType data structures. */
+ /* */
+ /* <Description> */
+ /* FreeType assumes that structures allocated by the user and passed */
+ /* as arguments are zeroed out except for the actual data. In other */
+ /* words, it is recommended to use `calloc' (or variants of it) */
+ /* instead of `malloc' for allocation. */
+ /* */
+ /*************************************************************************/
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S I C T Y P E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* base_interface */
+ /* */
+ /* <Title> */
+ /* Base Interface */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 base font interface. */
+ /* */
+ /* <Description> */
+ /* This section describes the public high-level API of FreeType~2. */
+ /* */
+ /* <Order> */
+ /* FT_Library */
+ /* FT_Face */
+ /* FT_Size */
+ /* FT_GlyphSlot */
+ /* FT_CharMap */
+ /* FT_Encoding */
+ /* */
+ /* FT_FaceRec */
+ /* */
+ /* FT_FACE_FLAG_SCALABLE */
+ /* FT_FACE_FLAG_FIXED_SIZES */
+ /* FT_FACE_FLAG_FIXED_WIDTH */
+ /* FT_FACE_FLAG_HORIZONTAL */
+ /* FT_FACE_FLAG_VERTICAL */
+ /* FT_FACE_FLAG_SFNT */
+ /* FT_FACE_FLAG_KERNING */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS */
+ /* FT_FACE_FLAG_GLYPH_NAMES */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM */
+ /* FT_FACE_FLAG_FAST_GLYPHS */
+ /* FT_FACE_FLAG_HINTER */
+ /* */
+ /* FT_STYLE_FLAG_BOLD */
+ /* FT_STYLE_FLAG_ITALIC */
+ /* */
+ /* FT_SizeRec */
+ /* FT_Size_Metrics */
+ /* */
+ /* FT_GlyphSlotRec */
+ /* FT_Glyph_Metrics */
+ /* FT_SubGlyph */
+ /* */
+ /* FT_Bitmap_Size */
+ /* */
+ /* FT_Init_FreeType */
+ /* FT_Done_FreeType */
+ /* */
+ /* FT_New_Face */
+ /* FT_Done_Face */
+ /* FT_New_Memory_Face */
+ /* FT_Open_Face */
+ /* FT_Open_Args */
+ /* FT_Parameter */
+ /* FT_Attach_File */
+ /* FT_Attach_Stream */
+ /* */
+ /* FT_Set_Char_Size */
+ /* FT_Set_Pixel_Sizes */
+ /* FT_Request_Size */
+ /* FT_Select_Size */
+ /* FT_Size_Request_Type */
+ /* FT_Size_Request */
+ /* FT_Set_Transform */
+ /* FT_Load_Glyph */
+ /* FT_Get_Char_Index */
+ /* FT_Get_Name_Index */
+ /* FT_Load_Char */
+ /* */
+ /* FT_OPEN_MEMORY */
+ /* FT_OPEN_STREAM */
+ /* FT_OPEN_PATHNAME */
+ /* FT_OPEN_DRIVER */
+ /* FT_OPEN_PARAMS */
+ /* */
+ /* FT_LOAD_DEFAULT */
+ /* FT_LOAD_RENDER */
+ /* FT_LOAD_MONOCHROME */
+ /* FT_LOAD_LINEAR_DESIGN */
+ /* FT_LOAD_NO_SCALE */
+ /* FT_LOAD_NO_HINTING */
+ /* FT_LOAD_NO_BITMAP */
+ /* FT_LOAD_CROP_BITMAP */
+ /* */
+ /* FT_LOAD_VERTICAL_LAYOUT */
+ /* FT_LOAD_IGNORE_TRANSFORM */
+ /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */
+ /* FT_LOAD_FORCE_AUTOHINT */
+ /* FT_LOAD_NO_RECURSE */
+ /* FT_LOAD_PEDANTIC */
+ /* */
+ /* FT_LOAD_TARGET_NORMAL */
+ /* FT_LOAD_TARGET_LIGHT */
+ /* FT_LOAD_TARGET_MONO */
+ /* FT_LOAD_TARGET_LCD */
+ /* FT_LOAD_TARGET_LCD_V */
+ /* */
+ /* FT_Render_Glyph */
+ /* FT_Render_Mode */
+ /* FT_Get_Kerning */
+ /* FT_Kerning_Mode */
+ /* FT_Get_Track_Kerning */
+ /* FT_Get_Glyph_Name */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* FT_CharMapRec */
+ /* FT_Select_Charmap */
+ /* FT_Set_Charmap */
+ /* FT_Get_Charmap_Index */
+ /* */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING */
+ /* FT_FSTYPE_NO_SUBSETTING */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */
+ /* */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Glyph_Metrics */
+ /* */
+ /* <Description> */
+ /* A structure used to model the metrics of a single glyph. The */
+ /* values are expressed in 26.6 fractional pixel format; if the flag */
+ /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */
+ /* are expressed in font units instead. */
+ /* */
+ /* <Fields> */
+ /* width :: */
+ /* The glyph's width. */
+ /* */
+ /* height :: */
+ /* The glyph's height. */
+ /* */
+ /* horiBearingX :: */
+ /* Left side bearing for horizontal layout. */
+ /* */
+ /* horiBearingY :: */
+ /* Top side bearing for horizontal layout. */
+ /* */
+ /* horiAdvance :: */
+ /* Advance width for horizontal layout. */
+ /* */
+ /* vertBearingX :: */
+ /* Left side bearing for vertical layout. */
+ /* */
+ /* vertBearingY :: */
+ /* Top side bearing for vertical layout. Larger positive values */
+ /* mean further below the vertical glyph origin. */
+ /* */
+ /* vertAdvance :: */
+ /* Advance height for vertical layout. Positive values mean the */
+ /* glyph has a positive advance downward. */
+ /* */
+ /* <Note> */
+ /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */
+ /* dimensions of the hinted glyph (in case hinting is applicable). */
+ /* */
+ /* Stroking a glyph with an outside border does not increase */
+ /* `horiAdvance' or `vertAdvance'; you have to manually adjust these */
+ /* values to account for the added width and height. */
+ /* */
+ typedef struct FT_Glyph_Metrics_
+ {
+ FT_Pos width;
+ FT_Pos height;
+
+ FT_Pos horiBearingX;
+ FT_Pos horiBearingY;
+ FT_Pos horiAdvance;
+
+ FT_Pos vertBearingX;
+ FT_Pos vertBearingY;
+ FT_Pos vertAdvance;
+
+ } FT_Glyph_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap_Size */
+ /* */
+ /* <Description> */
+ /* This structure models the metrics of a bitmap strike (i.e., a set */
+ /* of glyphs for a given point size and resolution) in a bitmap font. */
+ /* It is used for the `available_sizes' field of @FT_Face. */
+ /* */
+ /* <Fields> */
+ /* height :: The vertical distance, in pixels, between two */
+ /* consecutive baselines. It is always positive. */
+ /* */
+ /* width :: The average width, in pixels, of all glyphs in the */
+ /* strike. */
+ /* */
+ /* size :: The nominal size of the strike in 26.6 fractional */
+ /* points. This field is not very useful. */
+ /* */
+ /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* <Note> */
+ /* Windows FNT: */
+ /* The nominal size given in a FNT font is not reliable. Thus when */
+ /* the driver finds it incorrect, it sets `size' to some calculated */
+ /* values and sets `x_ppem' and `y_ppem' to the pixel width and */
+ /* height given in the font, respectively. */
+ /* */
+ /* TrueType embedded bitmaps: */
+ /* `size', `width', and `height' values are not contained in the */
+ /* bitmap strike itself. They are computed from the global font */
+ /* parameters. */
+ /* */
+ typedef struct FT_Bitmap_Size_
+ {
+ FT_Short height;
+ FT_Short width;
+
+ FT_Pos size;
+
+ FT_Pos x_ppem;
+ FT_Pos y_ppem;
+
+ } FT_Bitmap_Size;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Library */
+ /* */
+ /* <Description> */
+ /* A handle to a FreeType library instance. Each `library' is */
+ /* completely independent from the others; it is the `root' of a set */
+ /* of objects like fonts, faces, sizes, etc. */
+ /* */
+ /* It also embeds a memory manager (see @FT_Memory), as well as a */
+ /* scan-line converter object (see @FT_Raster). */
+ /* */
+ /* In multi-threaded applications, make sure that the same FT_Library */
+ /* object or any of its children doesn't get accessed in parallel. */
+ /* */
+ /* <Note> */
+ /* Library objects are normally created by @FT_Init_FreeType, and */
+ /* destroyed with @FT_Done_FreeType. If you need reference-counting */
+ /* (cf. @FT_Reference_Library), use @FT_New_Library and */
+ /* @FT_Done_Library. */
+ /* */
+ typedef struct FT_LibraryRec_ *FT_Library;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Module */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType module object. Each module can be a */
+ /* font driver, a renderer, or anything else that provides services */
+ /* to the formers. */
+ /* */
+ typedef struct FT_ModuleRec_* FT_Module;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType font driver object. Each font driver */
+ /* is a special module capable of creating faces from font files. */
+ /* */
+ typedef struct FT_DriverRec_* FT_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Renderer */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType renderer. A renderer is a special */
+ /* module in charge of converting a glyph image to a bitmap, when */
+ /* necessary. Each renderer supports a given glyph image format, and */
+ /* one or more target surface depths. */
+ /* */
+ typedef struct FT_RendererRec_* FT_Renderer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a given typographic face object. A face object models */
+ /* a given typeface, in a given style. */
+ /* */
+ /* <Note> */
+ /* Each face object also owns a single @FT_GlyphSlot object, as well */
+ /* as one or more @FT_Size objects. */
+ /* */
+ /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */
+ /* a given filepathname or a custom input stream. */
+ /* */
+ /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */
+ /* */
+ /* <Also> */
+ /* See @FT_FaceRec for the publicly accessible fields of a given face */
+ /* object. */
+ /* */
+ typedef struct FT_FaceRec_* FT_Face;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a face scaled to a given */
+ /* character size. */
+ /* */
+ /* <Note> */
+ /* Each @FT_Face has an _active_ @FT_Size object that is used by */
+ /* functions like @FT_Load_Glyph to determine the scaling */
+ /* transformation which is used to load and hint glyphs and metrics. */
+ /* */
+ /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */
+ /* @FT_Request_Size or even @FT_Select_Size to change the content */
+ /* (i.e., the scaling values) of the active @FT_Size. */
+ /* */
+ /* You can use @FT_New_Size to create additional size objects for a */
+ /* given @FT_Face, but they won't be used by other functions until */
+ /* you activate it through @FT_Activate_Size. Only one size can be */
+ /* activated at any given time per face. */
+ /* */
+ /* <Also> */
+ /* See @FT_SizeRec for the publicly accessible fields of a given size */
+ /* object. */
+ /* */
+ typedef struct FT_SizeRec_* FT_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a given `glyph slot'. A slot is a container where it */
+ /* is possible to load any of the glyphs contained in its parent */
+ /* face. */
+ /* */
+ /* In other words, each time you call @FT_Load_Glyph or */
+ /* @FT_Load_Char, the slot's content is erased by the new glyph data, */
+ /* i.e., the glyph's metrics, its image (bitmap or outline), and */
+ /* other control information. */
+ /* */
+ /* <Also> */
+ /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */
+ /* */
+ typedef struct FT_GlyphSlotRec_* FT_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a given character map. A charmap is used to translate */
+ /* character codes in a given encoding into glyph indexes for its */
+ /* parent's face. Some font formats may provide several charmaps per */
+ /* font. */
+ /* */
+ /* Each face object owns zero or more charmaps, but only one of them */
+ /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */
+ /* */
+ /* The list of available charmaps in a face is available through the */
+ /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */
+ /* */
+ /* The currently active charmap is available as `face->charmap'. */
+ /* You should call @FT_Set_Charmap to change it. */
+ /* */
+ /* <Note> */
+ /* When a new face is created (either through @FT_New_Face or */
+ /* @FT_Open_Face), the library looks for a Unicode charmap within */
+ /* the list and automatically activates it. */
+ /* */
+ /* <Also> */
+ /* See @FT_CharMapRec for the publicly accessible fields of a given */
+ /* character map. */
+ /* */
+ typedef struct FT_CharMapRec_* FT_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_ENC_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags into an unsigned long. It is */
+ /* used to define `encoding' identifiers (see @FT_Encoding). */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_ENC_TAG( value, a, b, c, d ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d ) \
+ value = ( ( (FT_UInt32)(a) << 24 ) | \
+ ( (FT_UInt32)(b) << 16 ) | \
+ ( (FT_UInt32)(c) << 8 ) | \
+ (FT_UInt32)(d) )
+
+#endif /* FT_ENC_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Encoding */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify character sets supported by */
+ /* charmaps. Used in the @FT_Select_Charmap API function. */
+ /* */
+ /* <Note> */
+ /* Despite the name, this enumeration lists specific character */
+ /* repertories (i.e., charsets), and not text encoding methods (e.g., */
+ /* UTF-8, UTF-16, etc.). */
+ /* */
+ /* Other encodings might be defined in the future. */
+ /* */
+ /* <Values> */
+ /* FT_ENCODING_NONE :: */
+ /* The encoding value~0 is reserved. */
+ /* */
+ /* FT_ENCODING_UNICODE :: */
+ /* Corresponds to the Unicode character set. This value covers */
+ /* all versions of the Unicode repertoire, including ASCII and */
+ /* Latin-1. Most fonts include a Unicode charmap, but not all */
+ /* of them. */
+ /* */
+ /* For example, if you want to access Unicode value U+1F028 (and */
+ /* the font contains it), use value 0x1F028 as the input value for */
+ /* @FT_Get_Char_Index. */
+ /* */
+ /* FT_ENCODING_MS_SYMBOL :: */
+ /* Corresponds to the Microsoft Symbol encoding, used to encode */
+ /* mathematical symbols in the 32..255 character code range. For */
+ /* more information, see `http://www.ceviz.net/symbol.htm'. */
+ /* */
+ /* FT_ENCODING_SJIS :: */
+ /* Corresponds to Japanese SJIS encoding. More info at */
+ /* at `http://langsupport.japanreference.com/encoding.shtml'. */
+ /* See note on multi-byte encodings below. */
+ /* */
+ /* FT_ENCODING_GB2312 :: */
+ /* Corresponds to an encoding system for Simplified Chinese as used */
+ /* used in mainland China. */
+ /* */
+ /* FT_ENCODING_BIG5 :: */
+ /* Corresponds to an encoding system for Traditional Chinese as */
+ /* used in Taiwan and Hong Kong. */
+ /* */
+ /* FT_ENCODING_WANSUNG :: */
+ /* Corresponds to the Korean encoding system known as Wansung. */
+ /* For more information see */
+ /* `http://www.microsoft.com/typography/unicode/949.txt'. */
+ /* */
+ /* FT_ENCODING_JOHAB :: */
+ /* The Korean standard character set (KS~C 5601-1992), which */
+ /* corresponds to MS Windows code page 1361. This character set */
+ /* includes all possible Hangeul character combinations. */
+ /* */
+ /* FT_ENCODING_ADOBE_LATIN_1 :: */
+ /* Corresponds to a Latin-1 encoding as defined in a Type~1 */
+ /* PostScript font. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_STANDARD :: */
+ /* Corresponds to the Adobe Standard encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_EXPERT :: */
+ /* Corresponds to the Adobe Expert encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_CUSTOM :: */
+ /* Corresponds to a custom encoding, as found in Type~1, CFF, and */
+ /* OpenType/CFF fonts. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_APPLE_ROMAN :: */
+ /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */
+ /* and OpenType fonts contain a charmap for this encoding, since */
+ /* older versions of Mac OS are able to use it. */
+ /* */
+ /* FT_ENCODING_OLD_LATIN_2 :: */
+ /* This value is deprecated and was never used nor reported by */
+ /* FreeType. Don't use or test for it. */
+ /* */
+ /* FT_ENCODING_MS_SJIS :: */
+ /* Same as FT_ENCODING_SJIS. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_GB2312 :: */
+ /* Same as FT_ENCODING_GB2312. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_BIG5 :: */
+ /* Same as FT_ENCODING_BIG5. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_WANSUNG :: */
+ /* Same as FT_ENCODING_WANSUNG. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_JOHAB :: */
+ /* Same as FT_ENCODING_JOHAB. Deprecated. */
+ /* */
+ /* <Note> */
+ /* By default, FreeType automatically synthesizes a Unicode charmap */
+ /* for PostScript fonts, using their glyph names dictionaries. */
+ /* However, it also reports the encodings defined explicitly in the */
+ /* font file, for the cases when they are needed, with the Adobe */
+ /* values as well. */
+ /* */
+ /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */
+ /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */
+ /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */
+ /* which encoding is really present. If, for example, the */
+ /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */
+ /* the font is encoded in KOI8-R. */
+ /* */
+ /* FT_ENCODING_NONE is always set (with a single exception) by the */
+ /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */
+ /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */
+ /* which encoding is really present. For example, */
+ /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */
+ /* Russian). */
+ /* */
+ /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
+ /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */
+ /* FT_ENCODING_APPLE_ROMAN). */
+ /* */
+ /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */
+ /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */
+ /* be needed to be able to distinguish Apple encoding variants. See */
+ /* */
+ /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */
+ /* */
+ /* to get an idea how to do that. Basically, if the language ID */
+ /* is~0, don't use it, otherwise subtract 1 from the language ID. */
+ /* Then examine `encoding_id'. If, for example, `encoding_id' is */
+ /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */
+ /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */
+ /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */
+ /* variant the Arabic encoding. */
+ /* */
+ typedef enum FT_Encoding_
+ {
+ FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
+
+ FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
+ FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),
+
+ FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
+ FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
+ FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
+ FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
+ FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),
+
+ /* for backwards compatibility */
+ FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
+ FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
+ FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
+ FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
+ FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,
+
+ FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),
+
+ FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
+
+ FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
+
+ } FT_Encoding;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_encoding_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated; use the corresponding @FT_Encoding */
+ /* values instead. */
+ /* */
+#define ft_encoding_none FT_ENCODING_NONE
+#define ft_encoding_unicode FT_ENCODING_UNICODE
+#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL
+#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1
+#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2
+#define ft_encoding_sjis FT_ENCODING_SJIS
+#define ft_encoding_gb2312 FT_ENCODING_GB2312
+#define ft_encoding_big5 FT_ENCODING_BIG5
+#define ft_encoding_wansung FT_ENCODING_WANSUNG
+#define ft_encoding_johab FT_ENCODING_JOHAB
+
+#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD
+#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT
+#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM
+#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_CharMapRec */
+ /* */
+ /* <Description> */
+ /* The base charmap structure. */
+ /* */
+ /* <Fields> */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* encoding :: An @FT_Encoding tag identifying the charmap. Use */
+ /* this with @FT_Select_Charmap. */
+ /* */
+ /* platform_id :: An ID number describing the platform for the */
+ /* following encoding ID. This comes directly from */
+ /* the TrueType specification and should be emulated */
+ /* for other formats. */
+ /* */
+ /* encoding_id :: A platform specific encoding number. This also */
+ /* comes from the TrueType specification and should be */
+ /* emulated similarly. */
+ /* */
+ typedef struct FT_CharMapRec_
+ {
+ FT_Face face;
+ FT_Encoding encoding;
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+
+ } FT_CharMapRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S E O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Face_InternalRec' structure, used to */
+ /* model private data of a given @FT_Face object. */
+ /* */
+ /* This structure might change between releases of FreeType~2 and is */
+ /* not generally available to client applications. */
+ /* */
+ typedef struct FT_Face_InternalRec_* FT_Face_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_FaceRec */
+ /* */
+ /* <Description> */
+ /* FreeType root face class structure. A face object models a */
+ /* typeface in a font file. */
+ /* */
+ /* <Fields> */
+ /* num_faces :: The number of faces in the font file. Some */
+ /* font formats can have multiple faces in */
+ /* a font file. */
+ /* */
+ /* face_index :: The index of the face in the font file. It */
+ /* is set to~0 if there is only one face in */
+ /* the font file. */
+ /* */
+ /* face_flags :: A set of bit flags that give important */
+ /* information about the face; see */
+ /* @FT_FACE_FLAG_XXX for the details. */
+ /* */
+ /* style_flags :: A set of bit flags indicating the style of */
+ /* the face; see @FT_STYLE_FLAG_XXX for the */
+ /* details. */
+ /* */
+ /* num_glyphs :: The number of glyphs in the face. If the */
+ /* face is scalable and has sbits (see */
+ /* `num_fixed_sizes'), it is set to the number */
+ /* of outline glyphs. */
+ /* */
+ /* For CID-keyed fonts, this value gives the */
+ /* highest CID used in the font. */
+ /* */
+ /* family_name :: The face's family name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's family (like `Times New */
+ /* Roman', `Bodoni', `Garamond', etc). This */
+ /* is a least common denominator used to list */
+ /* fonts. Some formats (TrueType & OpenType) */
+ /* provide localized and Unicode versions of */
+ /* this string. Applications should use the */
+ /* format specific interface to access them. */
+ /* Can be NULL (e.g., in fonts embedded in a */
+ /* PDF file). */
+ /* */
+ /* style_name :: The face's style name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's style (like `Italic', */
+ /* `Bold', `Condensed', etc). Not all font */
+ /* formats provide a style name, so this field */
+ /* is optional, and can be set to NULL. As */
+ /* for `family_name', some formats provide */
+ /* localized and Unicode versions of this */
+ /* string. Applications should use the format */
+ /* specific interface to access them. */
+ /* */
+ /* num_fixed_sizes :: The number of bitmap strikes in the face. */
+ /* Even if the face is scalable, there might */
+ /* still be bitmap strikes, which are called */
+ /* `sbits' in that case. */
+ /* */
+ /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */
+ /* strikes in the face. It is set to NULL if */
+ /* there is no bitmap strike. */
+ /* */
+ /* num_charmaps :: The number of charmaps in the face. */
+ /* */
+ /* charmaps :: An array of the charmaps of the face. */
+ /* */
+ /* generic :: A field reserved for client uses. See the */
+ /* @FT_Generic type description. */
+ /* */
+ /* bbox :: The font bounding box. Coordinates are */
+ /* expressed in font units (see */
+ /* `units_per_EM'). The box is large enough */
+ /* to contain any glyph from the font. Thus, */
+ /* `bbox.yMax' can be seen as the `maximum */
+ /* ascender', and `bbox.yMin' as the `minimum */
+ /* descender'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* Note that the bounding box might be off by */
+ /* (at least) one pixel for hinted fonts. See */
+ /* @FT_Size_Metrics for further discussion. */
+ /* */
+ /* units_per_EM :: The number of font units per EM square for */
+ /* this face. This is typically 2048 for */
+ /* TrueType fonts, and 1000 for Type~1 fonts. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* ascender :: The typographic ascender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMax'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* descender :: The typographic descender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMin'. Note that this field is */
+ /* usually negative. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* height :: This value is the vertical distance */
+ /* between two consecutive baselines, */
+ /* expressed in font units. It is always */
+ /* positive. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* If you want the global glyph height, use */
+ /* `ascender - descender'. */
+ /* */
+ /* max_advance_width :: The maximum advance width, in font units, */
+ /* for all glyphs in this face. This can be */
+ /* used to make word wrapping computations */
+ /* faster. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* max_advance_height :: The maximum advance height, in font units, */
+ /* for all glyphs in this face. This is only */
+ /* relevant for vertical layouts, and is set */
+ /* to `height' for fonts that do not provide */
+ /* vertical metrics. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* underline_position :: The position, in font units, of the */
+ /* underline line for this face. It is the */
+ /* center of the underlining stem. Only */
+ /* relevant for scalable formats. */
+ /* */
+ /* underline_thickness :: The thickness, in font units, of the */
+ /* underline for this face. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* glyph :: The face's associated glyph slot(s). */
+ /* */
+ /* size :: The current active size for this face. */
+ /* */
+ /* charmap :: The current active charmap for this face. */
+ /* */
+ /* <Note> */
+ /* Fields may be changed after a call to @FT_Attach_File or */
+ /* @FT_Attach_Stream. */
+ /* */
+ typedef struct FT_FaceRec_
+ {
+ FT_Long num_faces;
+ FT_Long face_index;
+
+ FT_Long face_flags;
+ FT_Long style_flags;
+
+ FT_Long num_glyphs;
+
+ FT_String* family_name;
+ FT_String* style_name;
+
+ FT_Int num_fixed_sizes;
+ FT_Bitmap_Size* available_sizes;
+
+ FT_Int num_charmaps;
+ FT_CharMap* charmaps;
+
+#ifdef _FX_MANAGED_CODE_
+#define generic generic_data
+#endif
+
+ FT_Generic generic;
+
+ /*# The following member variables (down to `underline_thickness') */
+ /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */
+ /*# for bitmap fonts. */
+ FT_BBox bbox;
+
+ FT_UShort units_per_EM;
+ FT_Short ascender;
+ FT_Short descender;
+ FT_Short height;
+
+ FT_Short max_advance_width;
+ FT_Short max_advance_height;
+
+ FT_Short underline_position;
+ FT_Short underline_thickness;
+
+ FT_GlyphSlot glyph;
+ FT_Size size;
+ FT_CharMap charmap;
+
+ /*@private begin */
+
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_Stream stream;
+
+ FT_ListRec sizes_list;
+
+ FT_Generic autohint; /* face-specific auto-hinter data */
+ void* extensions; /* unused */
+
+ FT_Face_Internal internal;
+
+ /*@private end */
+
+ } FT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FACE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `face_flags' field of the */
+ /* @FT_FaceRec structure. They inform client applications of */
+ /* properties of the corresponding face. */
+ /* */
+ /* <Values> */
+ /* FT_FACE_FLAG_SCALABLE :: */
+ /* Indicates that the face contains outline glyphs. This doesn't */
+ /* prevent bitmap strikes, i.e., a face can have both this and */
+ /* and @FT_FACE_FLAG_FIXED_SIZES set. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_SIZES :: */
+ /* Indicates that the face contains bitmap strikes. See also the */
+ /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_WIDTH :: */
+ /* Indicates that the face contains fixed-width characters (like */
+ /* Courier, Lucido, MonoType, etc.). */
+ /* */
+ /* FT_FACE_FLAG_SFNT :: */
+ /* Indicates that the face uses the `sfnt' storage scheme. For */
+ /* now, this means TrueType and OpenType. */
+ /* */
+ /* FT_FACE_FLAG_HORIZONTAL :: */
+ /* Indicates that the face contains horizontal glyph metrics. This */
+ /* should be set for all common formats. */
+ /* */
+ /* FT_FACE_FLAG_VERTICAL :: */
+ /* Indicates that the face contains vertical glyph metrics. This */
+ /* is only available in some formats, not all of them. */
+ /* */
+ /* FT_FACE_FLAG_KERNING :: */
+ /* Indicates that the face contains kerning information. If set, */
+ /* the kerning distance can be retrieved through the function */
+ /* @FT_Get_Kerning. Otherwise the function always return the */
+ /* vector (0,0). Note that FreeType doesn't handle kerning data */
+ /* from the `GPOS' table (as present in some OpenType fonts). */
+ /* */
+ /* FT_FACE_FLAG_FAST_GLYPHS :: */
+ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */
+ /* */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */
+ /* Indicates that the font contains multiple masters and is capable */
+ /* of interpolating between them. See the multiple-masters */
+ /* specific API for details. */
+ /* */
+ /* FT_FACE_FLAG_GLYPH_NAMES :: */
+ /* Indicates that the font contains glyph names that can be */
+ /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */
+ /* fonts contain broken glyph name tables. Use the function */
+ /* @FT_Has_PS_Glyph_Names when needed. */
+ /* */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM :: */
+ /* Used internally by FreeType to indicate that a face's stream was */
+ /* provided by the client application and should not be destroyed */
+ /* when @FT_Done_Face is called. Don't read or test this flag. */
+ /* */
+ /* FT_FACE_FLAG_HINTER :: */
+ /* Set if the font driver has a hinting machine of its own. For */
+ /* example, with TrueType fonts, it makes sense to use data from */
+ /* the SFNT `gasp' table only if the native TrueType hinting engine */
+ /* (with the bytecode interpreter) is available and active. */
+ /* */
+ /* FT_FACE_FLAG_CID_KEYED :: */
+ /* Set if the font is CID-keyed. In that case, the font is not */
+ /* accessed by glyph indices but by CID values. For subsetted */
+ /* CID-keyed fonts this has the consequence that not all index */
+ /* values are a valid argument to FT_Load_Glyph. Only the CID */
+ /* values for which corresponding glyphs in the subsetted font */
+ /* exist make FT_Load_Glyph return successfully; in all other cases */
+ /* you get an `FT_Err_Invalid_Argument' error. */
+ /* */
+ /* Note that CID-keyed fonts which are in an SFNT wrapper don't */
+ /* have this flag set since the glyphs are accessed in the normal */
+ /* way (using contiguous indices); the `CID-ness' isn't visible to */
+ /* the application. */
+ /* */
+ /* FT_FACE_FLAG_TRICKY :: */
+ /* Set if the font is `tricky', this is, it always needs the */
+ /* font format's native hinting engine to get a reasonable result. */
+ /* A typical example is the Chinese font `mingli.ttf' which uses */
+ /* TrueType bytecode instructions to move and scale all of its */
+ /* subglyphs. */
+ /* */
+ /* It is not possible to autohint such fonts using */
+ /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */
+ /* @FT_LOAD_NO_HINTING. You have to set both @FT_LOAD_NO_HINTING */
+ /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
+ /* probably never want this except for demonstration purposes. */
+ /* */
+ /* Currently, there are about a dozen TrueType fonts in the list of */
+ /* tricky fonts; they are hard-coded in file `ttobjs.c'. */
+ /* */
+#define FT_FACE_FLAG_SCALABLE ( 1L << 0 )
+#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 )
+#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 )
+#define FT_FACE_FLAG_SFNT ( 1L << 3 )
+#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 )
+#define FT_FACE_FLAG_VERTICAL ( 1L << 5 )
+#define FT_FACE_FLAG_KERNING ( 1L << 6 )
+#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 )
+#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 )
+#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 )
+#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER ( 1L << 11 )
+#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 )
+#define FT_FACE_FLAG_TRICKY ( 1L << 13 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_HORIZONTAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains
+ * horizontal metrics (this is true for all font formats though).
+ *
+ * @also:
+ * @FT_HAS_VERTICAL can be used to check for vertical metrics.
+ *
+ */
+#define FT_HAS_HORIZONTAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_VERTICAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains real
+ * vertical metrics (and not only synthesized ones).
+ *
+ */
+#define FT_HAS_VERTICAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_KERNING( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains kerning
+ * data that can be accessed with @FT_Get_Kerning.
+ *
+ */
+#define FT_HAS_KERNING( face ) \
+ ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SCALABLE( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a scalable
+ * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
+ * and PFR font formats.
+ *
+ */
+#define FT_IS_SCALABLE( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SFNT( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font
+ * whose format is based on the SFNT storage scheme. This usually
+ * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
+ * bitmap fonts.
+ *
+ * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
+ * @FT_TRUETYPE_TABLES_H are available.
+ *
+ */
+#define FT_IS_SFNT( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_FIXED_WIDTH( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font face
+ * that contains fixed-width (or `monospace', `fixed-pitch', etc.)
+ * glyphs.
+ *
+ */
+#define FT_IS_FIXED_WIDTH( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FIXED_SIZES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * embedded bitmaps. See the `available_sizes' field of the
+ * @FT_FaceRec structure.
+ *
+ */
+#define FT_HAS_FIXED_SIZES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FAST_GLYPHS( face )
+ *
+ * @description:
+ * Deprecated.
+ *
+ */
+#define FT_HAS_FAST_GLYPHS( face ) 0
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_GLYPH_NAMES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some glyph
+ * names that can be accessed through @FT_Get_Glyph_Name.
+ *
+ */
+#define FT_HAS_GLYPH_NAMES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_MULTIPLE_MASTERS( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H
+ * are then available to choose the exact design you want.
+ *
+ */
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+ ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_CID_KEYED( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a CID-keyed
+ * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more
+ * details.
+ *
+ * If this macro is true, all functions defined in @FT_CID_H are
+ * available.
+ *
+ */
+#define FT_IS_CID_KEYED( face ) \
+ ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_TRICKY( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face represents a `tricky' font.
+ * See the discussion of @FT_FACE_FLAG_TRICKY for more details.
+ *
+ */
+#define FT_IS_TRICKY( face ) \
+ ( face->face_flags & FT_FACE_FLAG_TRICKY )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_STYLE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-flags used to indicate the style of a given face. */
+ /* These are used in the `style_flags' field of @FT_FaceRec. */
+ /* */
+ /* <Values> */
+ /* FT_STYLE_FLAG_ITALIC :: */
+ /* Indicates that a given face style is italic or oblique. */
+ /* */
+ /* FT_STYLE_FLAG_BOLD :: */
+ /* Indicates that a given face is bold. */
+ /* */
+ /* <Note> */
+ /* The style information as provided by FreeType is very basic. More */
+ /* details are beyond the scope and should be done on a higher level */
+ /* (for example, by analyzing various fields of the `OS/2' table in */
+ /* SFNT based fonts). */
+ /* */
+#define FT_STYLE_FLAG_ITALIC ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD ( 1 << 1 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Size_InternalRec' structure, used to */
+ /* model private data of a given @FT_Size object. */
+ /* */
+ typedef struct FT_Size_InternalRec_* FT_Size_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Metrics */
+ /* */
+ /* <Description> */
+ /* The size metrics structure gives the metrics of a size object. */
+ /* */
+ /* <Fields> */
+ /* x_ppem :: The width of the scaled EM square in pixels, hence */
+ /* the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal width'. */
+ /* */
+ /* y_ppem :: The height of the scaled EM square in pixels, */
+ /* hence the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal height'. */
+ /* */
+ /* x_scale :: A 16.16 fractional scaling value used to convert */
+ /* horizontal metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* y_scale :: A 16.16 fractional scaling value used to convert */
+ /* vertical metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* ascender :: The ascender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* descender :: The descender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* height :: The height in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* max_advance :: The maximum advance width in 26.6 fractional */
+ /* pixels. See @FT_FaceRec for the details. */
+ /* */
+ /* <Note> */
+ /* The scaling values, if relevant, are determined first during a */
+ /* size changing operation. The remaining fields are then set by the */
+ /* driver. For scalable formats, they are usually set to scaled */
+ /* values of the corresponding fields in @FT_FaceRec. */
+ /* */
+ /* Note that due to glyph hinting, these values might not be exact */
+ /* for certain fonts. Thus they must be treated as unreliable */
+ /* with an error margin of at least one pixel! */
+ /* */
+ /* Indeed, the only way to get the exact metrics is to render _all_ */
+ /* glyphs. As this would be a definite performance hit, it is up to */
+ /* client applications to perform such computations. */
+ /* */
+ /* The FT_Size_Metrics structure is valid for bitmap fonts also. */
+ /* */
+ typedef struct FT_Size_Metrics_
+ {
+ FT_UShort x_ppem; /* horizontal pixels per EM */
+ FT_UShort y_ppem; /* vertical pixels per EM */
+
+ FT_Fixed x_scale; /* scaling values used to convert font */
+ FT_Fixed y_scale; /* units to 26.6 fractional pixels */
+
+ FT_Pos ascender; /* ascender in 26.6 frac. pixels */
+ FT_Pos descender; /* descender in 26.6 frac. pixels */
+ FT_Pos height; /* text height in 26.6 frac. pixels */
+ FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */
+
+ } FT_Size_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SizeRec */
+ /* */
+ /* <Description> */
+ /* FreeType root size class structure. A size object models a face */
+ /* object at a given size. */
+ /* */
+ /* <Fields> */
+ /* face :: Handle to the parent face object. */
+ /* */
+ /* generic :: A typeless pointer, which is unused by the FreeType */
+ /* library or any of its drivers. It can be used by */
+ /* client applications to link their own data to each size */
+ /* object. */
+ /* */
+ /* metrics :: Metrics for this size object. This field is read-only. */
+ /* */
+ typedef struct FT_SizeRec_
+ {
+ FT_Face face; /* parent face object */
+ FT_Generic generic; /* generic pointer for client uses */
+ FT_Size_Metrics metrics; /* size metrics */
+ FT_Size_Internal internal;
+
+ } FT_SizeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SubGlyph */
+ /* */
+ /* <Description> */
+ /* The subglyph structure is an internal object used to describe */
+ /* subglyphs (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The subglyph implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ /* You can however retrieve subglyph information with */
+ /* @FT_Get_SubGlyph_Info. */
+ /* */
+ typedef struct FT_SubGlyphRec_* FT_SubGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Slot_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */
+ /* model private data of a given @FT_GlyphSlot object. */
+ /* */
+ typedef struct FT_Slot_InternalRec_* FT_Slot_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphSlotRec */
+ /* */
+ /* <Description> */
+ /* FreeType root glyph slot class structure. A glyph slot is a */
+ /* container where individual glyphs can be loaded, be they in */
+ /* outline or bitmap format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library instance */
+ /* this slot belongs to. */
+ /* */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* next :: In some cases (like some font tools), several */
+ /* glyph slots per face object can be a good */
+ /* thing. As this is rare, the glyph slots are */
+ /* listed through a direct, single-linked list */
+ /* using its `next' field. */
+ /* */
+ /* generic :: A typeless pointer which is unused by the */
+ /* FreeType library or any of its drivers. It */
+ /* can be used by client applications to link */
+ /* their own data to each glyph slot object. */
+ /* */
+ /* metrics :: The metrics of the last loaded glyph in the */
+ /* slot. The returned values depend on the last */
+ /* load flags (see the @FT_Load_Glyph API */
+ /* function) and can be expressed either in 26.6 */
+ /* fractional pixels or font units. */
+ /* */
+ /* Note that even when the glyph image is */
+ /* transformed, the metrics are not. */
+ /* */
+ /* linearHoriAdvance :: The advance width of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* linearVertAdvance :: The advance height of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* advance :: This shorthand is, depending on */
+ /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */
+ /* advance width for the glyph (in 26.6 */
+ /* fractional pixel format). As specified with */
+ /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */
+ /* `horiAdvance' or the `vertAdvance' value of */
+ /* `metrics' field. */
+ /* */
+ /* format :: This field indicates the format of the image */
+ /* contained in the glyph slot. Typically */
+ /* @FT_GLYPH_FORMAT_BITMAP, */
+ /* @FT_GLYPH_FORMAT_OUTLINE, or */
+ /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */
+ /* possible. */
+ /* */
+ /* bitmap :: This field is used as a bitmap descriptor */
+ /* when the slot format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. Note that the */
+ /* address and content of the bitmap buffer can */
+ /* change between calls of @FT_Load_Glyph and a */
+ /* few other functions. */
+ /* */
+ /* bitmap_left :: This is the bitmap's left bearing expressed */
+ /* in integer pixels. Of course, this is only */
+ /* valid if the format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* bitmap_top :: This is the bitmap's top bearing expressed in */
+ /* integer pixels. Remember that this is the */
+ /* distance from the baseline to the top-most */
+ /* glyph scanline, upwards y~coordinates being */
+ /* *positive*. */
+ /* */
+ /* outline :: The outline descriptor for the current glyph */
+ /* image if its format is */
+ /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */
+ /* loaded, `outline' can be transformed, */
+ /* distorted, embolded, etc. However, it must */
+ /* not be freed. */
+ /* */
+ /* num_subglyphs :: The number of subglyphs in a composite glyph. */
+ /* This field is only valid for the composite */
+ /* glyph format that should normally only be */
+ /* loaded with the @FT_LOAD_NO_RECURSE flag. */
+ /* For now this is internal to FreeType. */
+ /* */
+ /* subglyphs :: An array of subglyph descriptors for */
+ /* composite glyphs. There are `num_subglyphs' */
+ /* elements in there. Currently internal to */
+ /* FreeType. */
+ /* */
+ /* control_data :: Certain font drivers can also return the */
+ /* control data for a given glyph image (e.g. */
+ /* TrueType bytecode, Type~1 charstrings, etc.). */
+ /* This field is a pointer to such data. */
+ /* */
+ /* control_len :: This is the length in bytes of the control */
+ /* data. */
+ /* */
+ /* other :: Really wicked formats can use this pointer to */
+ /* present their own glyph image to client */
+ /* applications. Note that the application */
+ /* needs to know about the image format. */
+ /* */
+ /* lsb_delta :: The difference between hinted and unhinted */
+ /* left side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* rsb_delta :: The difference between hinted and unhinted */
+ /* right side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* <Note> */
+ /* If @FT_Load_Glyph is called with default flags (see */
+ /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */
+ /* its native format (e.g., an outline glyph for TrueType and Type~1 */
+ /* formats). */
+ /* */
+ /* This image can later be converted into a bitmap by calling */
+ /* @FT_Render_Glyph. This function finds the current renderer for */
+ /* the native image's format, then invokes it. */
+ /* */
+ /* The renderer is in charge of transforming the native image through */
+ /* the slot's face transformation fields, then converting it into a */
+ /* bitmap that is returned in `slot->bitmap'. */
+ /* */
+ /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
+ /* to specify the position of the bitmap relative to the current pen */
+ /* position (e.g., coordinates (0,0) on the baseline). Of course, */
+ /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* <Note> */
+ /* Here a small pseudo code fragment which shows how to use */
+ /* `lsb_delta' and `rsb_delta': */
+ /* */
+ /* { */
+ /* FT_Pos origin_x = 0; */
+ /* FT_Pos prev_rsb_delta = 0; */
+ /* */
+ /* */
+ /* for all glyphs do */
+ /* <compute kern between current and previous glyph and add it to */
+ /* `origin_x'> */
+ /* */
+ /* <load glyph with `FT_Load_Glyph'> */
+ /* */
+ /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */
+ /* origin_x -= 64; */
+ /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */
+ /* origin_x += 64; */
+ /* */
+ /* prev_rsb_delta = face->glyph->rsb_delta; */
+ /* */
+ /* <save glyph image, or render glyph, or ...> */
+ /* */
+ /* origin_x += face->glyph->advance.x; */
+ /* endfor */
+ /* } */
+ /* */
+ typedef struct FT_GlyphSlotRec_
+ {
+ FT_Library library;
+ FT_Face face;
+ FT_GlyphSlot next;
+ FT_UInt reserved; /* retained for binary compatibility */
+ FT_Generic generic;
+
+ FT_Glyph_Metrics metrics;
+ FT_Fixed linearHoriAdvance;
+ FT_Fixed linearVertAdvance;
+ FT_Vector advance;
+
+ FT_Glyph_Format format;
+
+ FT_Bitmap bitmap;
+ FT_Int bitmap_left;
+ FT_Int bitmap_top;
+
+ FT_Outline outline;
+
+ FT_UInt num_subglyphs;
+ FT_SubGlyph subglyphs;
+
+ void* control_data;
+ long control_len;
+
+ FT_Pos lsb_delta;
+ FT_Pos rsb_delta;
+
+ void* other;
+
+ FT_Slot_Internal internal;
+
+ } FT_GlyphSlotRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* F U N C T I O N S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Init_FreeType */
+ /* */
+ /* <Description> */
+ /* Initialize a new FreeType library object. The set of modules */
+ /* that are registered by this function is determined at build time. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A handle to a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case you want to provide your own memory allocating routines, */
+ /* use @FT_New_Library instead, followed by a call to */
+ /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */
+ /* */
+ /* For multi-threading applications each thread should have its own */
+ /* FT_Library object. */
+ /* */
+ /* If you need reference-counting (cf. @FT_Reference_Library), use */
+ /* @FT_New_Library and @FT_Done_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Init_FreeType( FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_FreeType */
+ /* */
+ /* <Description> */
+ /* Destroy a given FreeType library object and all of its children, */
+ /* including resources, drivers, faces, sizes, etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_FreeType( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OPEN_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants used within the `flags' field of the */
+ /* @FT_Open_Args structure. */
+ /* */
+ /* <Values> */
+ /* FT_OPEN_MEMORY :: This is a memory-based stream. */
+ /* */
+ /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */
+ /* */
+ /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */
+ /* name. */
+ /* */
+ /* FT_OPEN_DRIVER :: Use the `driver' field. */
+ /* */
+ /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */
+ /* */
+ /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */
+ /* */
+ /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */
+ /* */
+ /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */
+ /* */
+ /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */
+ /* */
+ /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */
+ /* */
+ /* <Note> */
+ /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */
+ /* flags are mutually exclusive. */
+ /* */
+#define FT_OPEN_MEMORY 0x1
+#define FT_OPEN_STREAM 0x2
+#define FT_OPEN_PATHNAME 0x4
+#define FT_OPEN_DRIVER 0x8
+#define FT_OPEN_PARAMS 0x10
+
+#define ft_open_memory FT_OPEN_MEMORY /* deprecated */
+#define ft_open_stream FT_OPEN_STREAM /* deprecated */
+#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */
+#define ft_open_driver FT_OPEN_DRIVER /* deprecated */
+#define ft_open_params FT_OPEN_PARAMS /* deprecated */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Parameter */
+ /* */
+ /* <Description> */
+ /* A simple structure used to pass more or less generic parameters to */
+ /* @FT_Open_Face. */
+ /* */
+ /* <Fields> */
+ /* tag :: A four-byte identification tag. */
+ /* */
+ /* data :: A pointer to the parameter data. */
+ /* */
+ /* <Note> */
+ /* The ID and function of parameters are driver-specific. See the */
+ /* various FT_PARAM_TAG_XXX flags for more information. */
+ /* */
+ typedef struct FT_Parameter_
+ {
+ FT_ULong tag;
+ FT_Pointer data;
+
+ } FT_Parameter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Open_Args */
+ /* */
+ /* <Description> */
+ /* A structure used to indicate how to open a new font file or */
+ /* stream. A pointer to such a structure can be used as a parameter */
+ /* for the functions @FT_Open_Face and @FT_Attach_Stream. */
+ /* */
+ /* <Fields> */
+ /* flags :: A set of bit flags indicating how to use the */
+ /* structure. */
+ /* */
+ /* memory_base :: The first byte of the file in memory. */
+ /* */
+ /* memory_size :: The size in bytes of the file in memory. */
+ /* */
+ /* pathname :: A pointer to an 8-bit file pathname. */
+ /* */
+ /* stream :: A handle to a source stream object. */
+ /* */
+ /* driver :: This field is exclusively used by @FT_Open_Face; */
+ /* it simply specifies the font driver to use to open */
+ /* the face. If set to~0, FreeType tries to load the */
+ /* face with each one of the drivers in its list. */
+ /* */
+ /* num_params :: The number of extra parameters. */
+ /* */
+ /* params :: Extra parameters passed to the font driver when */
+ /* opening a new face. */
+ /* */
+ /* <Note> */
+ /* The stream type is determined by the contents of `flags' which */
+ /* are tested in the following order by @FT_Open_Face: */
+ /* */
+ /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */
+ /* memory file of `memory_size' bytes, located at `memory_address'. */
+ /* The data are are not copied, and the client is responsible for */
+ /* releasing and destroying them _after_ the corresponding call to */
+ /* @FT_Done_Face. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */
+ /* custom input stream `stream' is used. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */
+ /* is a normal file and use `pathname' to open it. */
+ /* */
+ /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */
+ /* open the file with the driver whose handler is in `driver'. */
+ /* */
+ /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */
+ /* `num_params' and `params' is used. They are ignored otherwise. */
+ /* */
+ /* Ideally, both the `pathname' and `params' fields should be tagged */
+ /* as `const'; this is missing for API backwards compatibility. In */
+ /* other words, applications should treat them as read-only. */
+ /* */
+ typedef struct FT_Open_Args_
+ {
+ FT_UInt flags;
+ const FT_Byte* memory_base;
+ FT_Long memory_size;
+ FT_String* pathname;
+ FT_Stream stream;
+ FT_Module driver;
+ FT_Int num_params;
+ FT_Parameter* params;
+
+ } FT_Open_Args;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font by its pathname. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* pathname :: A path to the font file. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Done_Face to destroy the created @FT_Face object (along */
+ /* with its slot and sizes). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* filepathname,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font which has been */
+ /* loaded into memory. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* file_base :: A pointer to the beginning of the font data. */
+ /* */
+ /* file_size :: The size of the memory chunk used by the font data. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You must not deallocate the memory before calling @FT_Done_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Memory_Face( FT_Library library,
+ const FT_Byte* file_base,
+ FT_Long file_size,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Open_Face */
+ /* */
+ /* <Description> */
+ /* Create a face object from a given resource described by */
+ /* @FT_Open_Args. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* args :: A pointer to an `FT_Open_Args' structure which must */
+ /* be filled by the caller. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See note below. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Unlike FreeType 1.x, this function automatically creates a glyph */
+ /* slot for the face object which can be accessed directly through */
+ /* `face->glyph'. */
+ /* */
+ /* FT_Open_Face can be used to quickly check whether the font */
+ /* format of a given font resource is supported by FreeType. If the */
+ /* `face_index' field is negative, the function's return value is~0 */
+ /* if the font format is recognized, or non-zero otherwise; */
+ /* the function returns a more or less empty face handle in `*aface' */
+ /* (if `aface' isn't NULL). The only useful field in this special */
+ /* case is `face->num_faces' which gives the number of faces within */
+ /* the font file. After examination, the returned @FT_Face structure */
+ /* should be deallocated with a call to @FT_Done_Face. */
+ /* */
+ /* Each new face object created with this function also owns a */
+ /* default @FT_Size object, accessible as `face->size'. */
+ /* */
+ /* One @FT_Library instance can have multiple face objects, this is, */
+ /* @FT_Open_Face and its siblings can be called multiple times using */
+ /* the same `library' argument. */
+ /* */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Open_Face( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_File */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Attach_Stream to attach a file. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* filepathname :: The pathname. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_File( FT_Face face,
+ const char* filepathname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_Stream */
+ /* */
+ /* <Description> */
+ /* `Attach' data to a face object. Normally, this is used to read */
+ /* additional information for the face object. For example, you can */
+ /* attach an AFM file that comes with a Type~1 font to get the */
+ /* kerning values and other metrics. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* parameters :: A pointer to @FT_Open_Args which must be filled by */
+ /* the caller. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The meaning of the `attach' (i.e., what really happens when the */
+ /* new file is read) is not fixed by FreeType itself. It really */
+ /* depends on the font format (and thus the font driver). */
+ /* */
+ /* Client applications are expected to know what they are doing */
+ /* when invoking this function. Most drivers simply do not implement */
+ /* file attachments. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_Stream( FT_Face face,
+ FT_Open_Args* parameters );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Face */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Face structure */
+ /* is created. This function increments the counter. @FT_Done_Face */
+ /* then only destroys a face if the counter is~1, otherwise it simply */
+ /* decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Face objects. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Face */
+ /* */
+ /* <Description> */
+ /* Discard a given face object, as well as all of its child slots and */
+ /* sizes. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Size */
+ /* */
+ /* <Description> */
+ /* Select a bitmap strike. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* strike_index :: The index of the bitmap strike in the */
+ /* `available_sizes' field of @FT_FaceRec structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Size( FT_Face face,
+ FT_Int strike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Size_Request_Type */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the supported size request types. */
+ /* */
+ /* <Values> */
+ /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */
+ /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */
+ /* used to determine both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */
+ /* The real dimension. The sum of the the `ascender' and (minus */
+ /* of) the `descender' fields of @FT_FaceRec are used to determine */
+ /* both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_BBOX :: */
+ /* The font bounding box. The width and height of the `bbox' field */
+ /* of @FT_FaceRec are used to determine the horizontal and vertical */
+ /* scaling value, respectively. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_CELL :: */
+ /* The `max_advance_width' field of @FT_FaceRec is used to */
+ /* determine the horizontal scaling value; the vertical scaling */
+ /* value is determined the same way as */
+ /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */
+ /* values are set to the smaller one. This type is useful if you */
+ /* want to specify the font size for, say, a window of a given */
+ /* dimension and 80x24 cells. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_SCALES :: */
+ /* Specify the scaling values directly. */
+ /* */
+ /* <Note> */
+ /* The above descriptions only apply to scalable formats. For bitmap */
+ /* formats, the behaviour is up to the driver. */
+ /* */
+ /* See the note section of @FT_Size_Metrics if you wonder how size */
+ /* requesting relates to scaling values. */
+ /* */
+ typedef enum FT_Size_Request_Type_
+ {
+ FT_SIZE_REQUEST_TYPE_NOMINAL,
+ FT_SIZE_REQUEST_TYPE_REAL_DIM,
+ FT_SIZE_REQUEST_TYPE_BBOX,
+ FT_SIZE_REQUEST_TYPE_CELL,
+ FT_SIZE_REQUEST_TYPE_SCALES,
+
+ FT_SIZE_REQUEST_TYPE_MAX
+
+ } FT_Size_Request_Type;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_RequestRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a size request. */
+ /* */
+ /* <Fields> */
+ /* type :: See @FT_Size_Request_Type. */
+ /* */
+ /* width :: The desired width. */
+ /* */
+ /* height :: The desired height. */
+ /* */
+ /* horiResolution :: The horizontal resolution. If set to zero, */
+ /* `width' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* vertResolution :: The vertical resolution. If set to zero, */
+ /* `height' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* <Note> */
+ /* If `width' is zero, then the horizontal scaling value is set equal */
+ /* to the vertical scaling value, and vice versa. */
+ /* */
+ typedef struct FT_Size_RequestRec_
+ {
+ FT_Size_Request_Type type;
+ FT_Long width;
+ FT_Long height;
+ FT_UInt horiResolution;
+ FT_UInt vertResolution;
+
+ } FT_Size_RequestRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Request */
+ /* */
+ /* <Description> */
+ /* A handle to a size request structure. */
+ /* */
+ typedef struct FT_Size_RequestRec_ *FT_Size_Request;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Request_Size */
+ /* */
+ /* <Description> */
+ /* Resize the scale of the active @FT_Size object in a face. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* req :: A pointer to a @FT_Size_RequestRec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Although drivers may select the bitmap strike matching the */
+ /* request, you should not rely on this if you intend to select a */
+ /* particular bitmap strike. Use @FT_Select_Size instead in that */
+ /* case. */
+ /* */
+ /* The relation between the requested size and the resulting glyph */
+ /* size is dependent entirely on how the size is defined in the */
+ /* source face. The font designer chooses the final size of each */
+ /* glyph relative to this size. For more information refer to */
+ /* `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html' */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Request_Size( FT_Face face,
+ FT_Size_Request req );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Char_Size */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in points). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* char_width :: The nominal width, in 26.6 fractional points. */
+ /* */
+ /* char_height :: The nominal height, in 26.6 fractional points. */
+ /* */
+ /* horz_resolution :: The horizontal resolution in dpi. */
+ /* */
+ /* vert_resolution :: The vertical resolution in dpi. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If either the character width or height is zero, it is set equal */
+ /* to the other value. */
+ /* */
+ /* If either the horizontal or vertical resolution is zero, it is set */
+ /* equal to the other value. */
+ /* */
+ /* A character width or height smaller than 1pt is set to 1pt; if */
+ /* both resolution values are zero, they are set to 72dpi. */
+ /* */
+ /* Don't use this function if you are using the FreeType cache API. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Char_Size( FT_Face face,
+ FT_F26Dot6 char_width,
+ FT_F26Dot6 char_height,
+ FT_UInt horz_resolution,
+ FT_UInt vert_resolution );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Pixel_Sizes */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in pixels). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* pixel_width :: The nominal width, in pixels. */
+ /* */
+ /* pixel_height :: The nominal height, in pixels. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should not rely on the resulting glyphs matching, or being */
+ /* constrained, to this pixel size. Refer to @FT_Request_Size to */
+ /* understand how requested sizes relate to actual sizes. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Pixel_Sizes( FT_Face face,
+ FT_UInt pixel_width,
+ FT_UInt pixel_height );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* glyph_index :: The index of the glyph in the font file. For */
+ /* CID-keyed fonts (either in PS or in CFF format) */
+ /* this argument specifies the CID value. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The loaded glyph may be transformed. See @FT_Set_Transform for */
+ /* the details. */
+ /* */
+ /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */
+ /* returned for invalid CID values (this is, for CID values which */
+ /* don't have a corresponding glyph in the font). See the discussion */
+ /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Glyph( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Char */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object, according to its character code. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* char_code :: The glyph's character code, according to the */
+ /* current charmap used in the face. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_XXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_Load_Glyph to indicate
+ * what kind of operations to perform during glyph loading.
+ *
+ * @values:
+ * FT_LOAD_DEFAULT ::
+ * Corresponding to~0, this value is used as the default glyph load
+ * operation. In this case, the following happens:
+ *
+ * 1. FreeType looks for a bitmap for the glyph corresponding to the
+ * face's current size. If one is found, the function returns.
+ * The bitmap data can be accessed from the glyph slot (see note
+ * below).
+ *
+ * 2. If no embedded bitmap is searched or found, FreeType looks for a
+ * scalable outline. If one is found, it is loaded from the font
+ * file, scaled to device pixels, then `hinted' to the pixel grid
+ * in order to optimize it. The outline data can be accessed from
+ * the glyph slot (see note below).
+ *
+ * Note that by default, the glyph loader doesn't render outlines into
+ * bitmaps. The following flags are used to modify this default
+ * behaviour to more specific and useful cases.
+ *
+ * FT_LOAD_NO_SCALE ::
+ * Don't scale the loaded outline glyph but keep it in font units.
+ *
+ * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
+ * unsets @FT_LOAD_RENDER.
+ *
+ * If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using
+ * FT_LOAD_NO_SCALE usually yields meaningless outlines because the
+ * subglyphs must be scaled and positioned with hinting instructions.
+ * This can be solved by loading the font without FT_LOAD_NO_SCALE and
+ * setting the character size to `font->units_per_EM'.
+ *
+ * FT_LOAD_NO_HINTING ::
+ * Disable hinting. This generally generates `blurrier' bitmap glyphs
+ * when the glyph are rendered in any of the anti-aliased modes. See
+ * also the note below.
+ *
+ * This flag is implied by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_RENDER ::
+ * Call @FT_Render_Glyph after the glyph is loaded. By default, the
+ * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be
+ * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
+ *
+ * This flag is unset by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_NO_BITMAP ::
+ * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this
+ * flag.
+ *
+ * @FT_LOAD_NO_SCALE always sets this flag.
+ *
+ * FT_LOAD_VERTICAL_LAYOUT ::
+ * Load the glyph for vertical text layout. In particular, the
+ * `advance' value in the @FT_GlyphSlotRec structure is set to the
+ * `vertAdvance' value of the `metrics' field.
+ *
+ * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use
+ * this flag currently. Reason is that in this case vertical metrics
+ * get synthesized, and those values are not always consistent across
+ * various font formats.
+ *
+ * FT_LOAD_FORCE_AUTOHINT ::
+ * Indicates that the auto-hinter is preferred over the font's native
+ * hinter. See also the note below.
+ *
+ * FT_LOAD_CROP_BITMAP ::
+ * Indicates that the font driver should crop the loaded bitmap glyph
+ * (i.e., remove all space around its black bits). Not all drivers
+ * implement this.
+ *
+ * FT_LOAD_PEDANTIC ::
+ * Indicates that the font driver should perform pedantic verifications
+ * during glyph loading. This is mostly used to detect broken glyphs
+ * in fonts. By default, FreeType tries to handle broken fonts also.
+ *
+ * In particular, errors from the TrueType bytecode engine are not
+ * passed to the application if this flag is not set; this might
+ * result in partially hinted or distorted glyphs in case a glyph's
+ * bytecode is buggy.
+ *
+ * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
+ * Ignored. Deprecated.
+ *
+ * FT_LOAD_NO_RECURSE ::
+ * This flag is only used internally. It merely indicates that the
+ * font driver should not load composite glyphs recursively. Instead,
+ * it should set the `num_subglyph' and `subglyphs' values of the
+ * glyph slot accordingly, and set `glyph->format' to
+ * @FT_GLYPH_FORMAT_COMPOSITE.
+ *
+ * The description of sub-glyphs is not available to client
+ * applications for now.
+ *
+ * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
+ *
+ * FT_LOAD_IGNORE_TRANSFORM ::
+ * Indicates that the transform matrix set by @FT_Set_Transform should
+ * be ignored.
+ *
+ * FT_LOAD_MONOCHROME ::
+ * This flag is used with @FT_LOAD_RENDER to indicate that you want to
+ * render an outline glyph to a 1-bit monochrome bitmap glyph, with
+ * 8~pixels packed into each byte of the bitmap data.
+ *
+ * Note that this has no effect on the hinting algorithm used. You
+ * should rather use @FT_LOAD_TARGET_MONO so that the
+ * monochrome-optimized hinting algorithm is used.
+ *
+ * FT_LOAD_LINEAR_DESIGN ::
+ * Indicates that the `linearHoriAdvance' and `linearVertAdvance'
+ * fields of @FT_GlyphSlotRec should be kept in font units. See
+ * @FT_GlyphSlotRec for details.
+ *
+ * FT_LOAD_NO_AUTOHINT ::
+ * Disable auto-hinter. See also the note below.
+ *
+ * FT_LOAD_COLOR ::
+ * This flag is used to request loading of color embedded-bitmap
+ * images. The resulting color bitmaps, if available, will have the
+ * @FT_PIXEL_MODE_BGRA format. When the flag is not used and color
+ * bitmaps are found, they will be converted to 256-level gray
+ * bitmaps transparently. Those bitmaps will be in the
+ * @FT_PIXEL_MODE_GRAY format.
+ *
+ * @note:
+ * By default, hinting is enabled and the font's native hinter (see
+ * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can
+ * disable hinting by setting @FT_LOAD_NO_HINTING or change the
+ * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set
+ * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
+ * used at all.
+ *
+ * See the description of @FT_FACE_FLAG_TRICKY for a special exception
+ * (affecting only a handful of Asian fonts).
+ *
+ * Besides deciding which hinter to use, you can also decide which
+ * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details.
+ *
+ * Note that the auto-hinter needs a valid Unicode cmap (either a native
+ * one or synthesized by FreeType) for producing correct results. If a
+ * font provides an incorrect mapping (for example, assigning the
+ * character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a
+ * mathematical integral sign), the auto-hinter might produce useless
+ * results.
+ *
+ */
+#define FT_LOAD_DEFAULT 0x0
+#define FT_LOAD_NO_SCALE ( 1L << 0 )
+#define FT_LOAD_NO_HINTING ( 1L << 1 )
+#define FT_LOAD_RENDER ( 1L << 2 )
+#define FT_LOAD_NO_BITMAP ( 1L << 3 )
+#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 )
+#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 )
+#define FT_LOAD_CROP_BITMAP ( 1L << 6 )
+#define FT_LOAD_PEDANTIC ( 1L << 7 )
+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 )
+#define FT_LOAD_NO_RECURSE ( 1L << 10 )
+#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 )
+#define FT_LOAD_MONOCHROME ( 1L << 12 )
+#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 )
+#define FT_LOAD_NO_AUTOHINT ( 1L << 15 )
+ /* Bits 16..19 are used by `FT_LOAD_TARGET_' */
+#define FT_LOAD_COLOR ( 1L << 20 )
+
+ /* */
+
+ /* used internally only by certain font drivers! */
+#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 )
+#define FT_LOAD_SBITS_ONLY ( 1L << 14 )
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_TARGET_XXX
+ *
+ * @description:
+ * A list of values that are used to select a specific hinting algorithm
+ * to use by the hinter. You should OR one of these values to your
+ * `load_flags' when calling @FT_Load_Glyph.
+ *
+ * Note that font's native hinters may ignore the hinting algorithm you
+ * have specified (e.g., the TrueType bytecode interpreter). You can set
+ * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
+ *
+ * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
+ * always implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * @values:
+ * FT_LOAD_TARGET_NORMAL ::
+ * This corresponds to the default hinting algorithm, optimized for
+ * standard gray-level rendering. For monochrome output, use
+ * @FT_LOAD_TARGET_MONO instead.
+ *
+ * FT_LOAD_TARGET_LIGHT ::
+ * A lighter hinting algorithm for non-monochrome modes. Many
+ * generated glyphs are more fuzzy but better resemble its original
+ * shape. A bit like rendering on Mac OS~X.
+ *
+ * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * FT_LOAD_TARGET_MONO ::
+ * Strong hinting algorithm that should only be used for monochrome
+ * output. The result is probably unpleasant if the glyph is rendered
+ * in non-monochrome modes.
+ *
+ * FT_LOAD_TARGET_LCD ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+ * decimated LCD displays.
+ *
+ * FT_LOAD_TARGET_LCD_V ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
+ * decimated LCD displays.
+ *
+ * @note:
+ * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
+ * `load_flags'. They can't be ORed.
+ *
+ * If @FT_LOAD_RENDER is also set, the glyph is rendered in the
+ * corresponding mode (i.e., the mode which matches the used algorithm
+ * best). An exeption is FT_LOAD_TARGET_MONO since it implies
+ * @FT_LOAD_MONOCHROME.
+ *
+ * You can use a hinting algorithm that doesn't correspond to the same
+ * rendering mode. As an example, it is possible to use the `light'
+ * hinting algorithm and have the results rendered in horizontal LCD
+ * pixel mode, with code like
+ *
+ * {
+ * FT_Load_Glyph( face, glyph_index,
+ * load_flags | FT_LOAD_TARGET_LIGHT );
+ *
+ * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+ * }
+ *
+ */
+#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 )
+
+#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
+#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT )
+#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO )
+#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD )
+#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V )
+
+
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_LOAD_TARGET_MODE
+ *
+ * @description:
+ * Return the @FT_Render_Mode corresponding to a given
+ * @FT_LOAD_TARGET_XXX value.
+ *
+ */
+#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Transform */
+ /* */
+ /* <Description> */
+ /* A function used to set the transformation that is applied to glyph */
+ /* images when they are loaded into a glyph slot through */
+ /* @FT_Load_Glyph. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */
+ /* the identity matrix. */
+ /* delta :: A pointer to the translation vector. Use~0 for the null */
+ /* vector. */
+ /* */
+ /* <Note> */
+ /* The transformation is only applied to scalable image formats after */
+ /* the glyph has been loaded. It means that hinting is unaltered by */
+ /* the transformation and is performed on the character size given in */
+ /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */
+ /* */
+ /* Note that this also transforms the `face.glyph.advance' field, but */
+ /* *not* the values in `face.glyph.metrics'. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Transform( FT_Face face,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Render_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the render modes supported by */
+ /* FreeType~2. Each mode corresponds to a specific type of scanline */
+ /* conversion performed on the outline. */
+ /* */
+ /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */
+ /* field in the @FT_GlyphSlotRec structure gives the format of the */
+ /* returned bitmap. */
+ /* */
+ /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */
+ /* */
+ /* <Values> */
+ /* FT_RENDER_MODE_NORMAL :: */
+ /* This is the default render mode; it corresponds to 8-bit */
+ /* anti-aliased bitmaps. */
+ /* */
+ /* FT_RENDER_MODE_LIGHT :: */
+ /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */
+ /* defined as a separate value because render modes are also used */
+ /* indirectly to define hinting algorithm selectors. See */
+ /* @FT_LOAD_TARGET_XXX for details. */
+ /* */
+ /* FT_RENDER_MODE_MONO :: */
+ /* This mode corresponds to 1-bit bitmaps (with 2~levels of */
+ /* opacity). */
+ /* */
+ /* FT_RENDER_MODE_LCD :: */
+ /* This mode corresponds to horizontal RGB and BGR sub-pixel */
+ /* displays like LCD screens. It produces 8-bit bitmaps that are */
+ /* 3~times the width of the original glyph outline in pixels, and */
+ /* which use the @FT_PIXEL_MODE_LCD mode. */
+ /* */
+ /* FT_RENDER_MODE_LCD_V :: */
+ /* This mode corresponds to vertical RGB and BGR sub-pixel displays */
+ /* (like PDA screens, rotated LCD displays, etc.). It produces */
+ /* 8-bit bitmaps that are 3~times the height of the original */
+ /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */
+ /* */
+ /* <Note> */
+ /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
+ /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
+ /* (not active in the default builds). It is up to the caller to */
+ /* either call @FT_Library_SetLcdFilter (if available) or do the */
+ /* filtering itself. */
+ /* */
+ /* The selected render mode only affects vector glyphs of a font. */
+ /* Embedded bitmaps often have a different pixel mode like */
+ /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */
+ /* them into 8-bit pixmaps. */
+ /* */
+ typedef enum FT_Render_Mode_
+ {
+ FT_RENDER_MODE_NORMAL = 0,
+ FT_RENDER_MODE_LIGHT,
+ FT_RENDER_MODE_MONO,
+ FT_RENDER_MODE_LCD,
+ FT_RENDER_MODE_LCD_V,
+
+ FT_RENDER_MODE_MAX
+
+ } FT_Render_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_render_mode_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Render_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */
+ /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */
+ /* */
+#define ft_render_mode_normal FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono FT_RENDER_MODE_MONO
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph image to a bitmap. It does so by inspecting */
+ /* the glyph image format, finding the relevant renderer, and */
+ /* invoking it. */
+ /* */
+ /* <InOut> */
+ /* slot :: A handle to the glyph slot containing the image to */
+ /* convert. */
+ /* */
+ /* <Input> */
+ /* render_mode :: This is the render mode used to render the glyph */
+ /* image into a bitmap. See @FT_Render_Mode for a */
+ /* list of possible values. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Render_Glyph( FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Kerning_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify which kerning values to return in */
+ /* @FT_Get_Kerning. */
+ /* */
+ /* <Values> */
+ /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */
+ /* distances (value is~0). */
+ /* */
+ /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */
+ /* distances. */
+ /* */
+ /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */
+ /* units. */
+ /* */
+ typedef enum FT_Kerning_Mode_
+ {
+ FT_KERNING_DEFAULT = 0,
+ FT_KERNING_UNFITTED,
+ FT_KERNING_UNSCALED
+
+ } FT_Kerning_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_default */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */
+ /* instead. */
+ /* */
+#define ft_kerning_default FT_KERNING_DEFAULT
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unfitted */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */
+ /* instead. */
+ /* */
+#define ft_kerning_unfitted FT_KERNING_UNFITTED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unscaled */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */
+ /* instead. */
+ /* */
+#define ft_kerning_unscaled FT_KERNING_UNSCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the kerning vector between two glyphs of a same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* kern_mode :: See @FT_Kerning_Mode for more information. */
+ /* Determines the scale and dimension of the returned */
+ /* kerning vector. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning vector. This is either in font units */
+ /* or in pixels (26.6 format) for scalable formats, */
+ /* and in pixels for fixed-sizes formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this method. Other layouts, or more sophisticated */
+ /* kernings, are out of the scope of this API function -- they can be */
+ /* implemented through format-specific interfaces. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Kerning( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_UInt kern_mode,
+ FT_Vector *akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Track_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the track kerning for a given face object at a given size. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* point_size :: The point size in 16.16 fractional points. */
+ /* */
+ /* degree :: The degree of tightness. Increasingly negative */
+ /* values represent tighter track kerning, while */
+ /* increasingly positive values represent looser track */
+ /* kerning. Value zero means no track kerning. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning in 16.16 fractional points, to be */
+ /* uniformly applied between all glyphs. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Currently, only the Type~1 font driver supports track kerning, */
+ /* using data from AFM files (if attached with @FT_Attach_File or */
+ /* @FT_Attach_Stream). */
+ /* */
+ /* Only very few AFM files come with track kerning data; please refer */
+ /* to the Adobe's AFM specification for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Track_Kerning( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII name of a given glyph in a face. This only */
+ /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* buffer_max :: The maximum number of bytes available in the */
+ /* buffer. */
+ /* */
+ /* <Output> */
+ /* buffer :: A pointer to a target buffer where the name is */
+ /* copied to. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error is returned if the face doesn't provide glyph names or if */
+ /* the glyph index is invalid. In all cases of failure, the first */
+ /* byte of `buffer' is set to~0 to indicate an empty name. */
+ /* */
+ /* The glyph name is truncated to fit within the buffer if it is too */
+ /* long. The returned string is always zero-terminated. */
+ /* */
+ /* Be aware that FreeType reorders glyph indices internally so that */
+ /* glyph index~0 always corresponds to the `missing glyph' (called */
+ /* `.notdef'). */
+ /* */
+ /* This function is not compiled within the library if the config */
+ /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */
+ /* `include/freetype/config/ftoptions.h'. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph_Name( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII PostScript name of a given face, if available. */
+ /* This only works with PostScript and TrueType fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the face's PostScript name. NULL if unavailable. */
+ /* */
+ /* <Note> */
+ /* The returned pointer is owned by the face and is destroyed with */
+ /* it. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_Postscript_Name( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap by its encoding tag (as listed in */
+ /* `freetype.h'). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* encoding :: A handle to the selected encoding. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if no charmap in the face */
+ /* corresponds to the encoding queried here. */
+ /* */
+ /* Because many fonts contain more than a single cmap for Unicode */
+ /* encoding, this function has some special code to select the one */
+ /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */
+ /* is preferred to a UCS-2 cmap). It is thus preferable to */
+ /* @FT_Set_Charmap in this case. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Charmap( FT_Face face,
+ FT_Encoding encoding );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap for character code to glyph index mapping. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* charmap :: A handle to the selected charmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if the charmap is not part of */
+ /* the face (i.e., if it is not listed in the `face->charmaps' */
+ /* table). */
+ /* */
+ /* It also fails if a type~14 charmap is selected. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Charmap( FT_Face face,
+ FT_CharMap charmap );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Get_Charmap_Index
+ *
+ * @description:
+ * Retrieve index of a given charmap.
+ *
+ * @input:
+ * charmap ::
+ * A handle to a charmap.
+ *
+ * @return:
+ * The index into the array of character maps within the face to which
+ * `charmap' belongs. If an error occurs, -1 is returned.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Charmap_Index( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Char_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code. This function */
+ /* uses a charmap object to do the mapping. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* charcode :: The character code. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within the */
+ /* file. This is done to ensure that value~0 always corresponds to */
+ /* the `missing glyph'. If the first glyph is not named `.notdef', */
+ /* then for Type~1 and Type~42 fonts, `.notdef' will be moved into */
+ /* the glyph ID~0 position, and whatever was there will be moved to */
+ /* the position `.notdef' had. For Type~1 fonts, if there is no */
+ /* `.notdef' glyph at all, then one will be created at index~0 and */
+ /* whatever was there will be moved to the last index -- Type~42 */
+ /* fonts are considered invalid under this condition. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_First_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the first character code in the */
+ /* current charmap of a given face. It also returns the */
+ /* corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of first character code. 0~if charmap is */
+ /* empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's first character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_Next_Char to be able to */
+ /* parse all character codes available in a given charmap. The code */
+ /* should look like this: */
+ /* */
+ /* { */
+ /* FT_ULong charcode; */
+ /* FT_UInt gindex; */
+ /* */
+ /* */
+ /* charcode = FT_Get_First_Char( face, &gindex ); */
+ /* while ( gindex != 0 ) */
+ /* { */
+ /* ... do something with (charcode,gindex) pair ... */
+ /* */
+ /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */
+ /* } */
+ /* } */
+ /* */
+ /* Note that `*agindex' is set to~0 if the charmap is empty. The */
+ /* result itself can be~0 in two cases: if the charmap is empty or */
+ /* if the value~0 is the first valid character code. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_First_Char( FT_Face face,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Next_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the next character code in the */
+ /* current charmap of a given face following the value `char_code', */
+ /* as well as the corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* char_code :: The starting character code. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of next character code. 0~if charmap */
+ /* is empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's next character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_First_Char to walk */
+ /* over all character codes available in a given charmap. See the */
+ /* note for this function for a simple code example. */
+ /* */
+ /* Note that `*agindex' is set to~0 when there are no more codes in */
+ /* the charmap. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Name_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given glyph name. This function uses */
+ /* driver specific objects to do the translation. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* glyph_name :: The glyph name. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Name_Index( FT_Face face,
+ FT_String* glyph_name );
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SUBGLYPH_FLAG_XXX
+ *
+ * @description:
+ * A list of constants used to describe subglyphs. Please refer to the
+ * TrueType specification for the meaning of the various flags.
+ *
+ * @values:
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+ * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+ * FT_SUBGLYPH_FLAG_SCALE ::
+ * FT_SUBGLYPH_FLAG_XY_SCALE ::
+ * FT_SUBGLYPH_FLAG_2X2 ::
+ * FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+ *
+ */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_SubGlyph_Info
+ *
+ * @description:
+ * Retrieve a description of a given subglyph. Only use it if
+ * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
+ * returned otherwise.
+ *
+ * @input:
+ * glyph ::
+ * The source glyph slot.
+ *
+ * sub_index ::
+ * The index of the subglyph. Must be less than
+ * `glyph->num_subglyphs'.
+ *
+ * @output:
+ * p_index ::
+ * The glyph index of the subglyph.
+ *
+ * p_flags ::
+ * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
+ *
+ * p_arg1 ::
+ * The subglyph's first argument (if any).
+ *
+ * p_arg2 ::
+ * The subglyph's second argument (if any).
+ *
+ * p_transform ::
+ * The subglyph transformation (if any).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
+ * interpreted depending on the flags returned in `*p_flags'. See the
+ * TrueType specification for details.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_SubGlyph_Info( FT_GlyphSlot glyph,
+ FT_UInt sub_index,
+ FT_Int *p_index,
+ FT_UInt *p_flags,
+ FT_Int *p_arg1,
+ FT_Int *p_arg2,
+ FT_Matrix *p_transform );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FSTYPE_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `fsType' field of the OS/2 table */
+ /* in a TrueType or OpenType font and the `FSType' entry in a */
+ /* PostScript font. These bit flags are returned by */
+ /* @FT_Get_FSType_Flags; they inform client applications of embedding */
+ /* and subsetting restrictions associated with a font. */
+ /* */
+ /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */
+ /* more details. */
+ /* */
+ /* <Values> */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */
+ /* Fonts with no fsType bit set may be embedded and permanently */
+ /* installed on the remote system by an application. */
+ /* */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */
+ /* Fonts that have only this bit set must not be modified, embedded */
+ /* or exchanged in any manner without first obtaining permission of */
+ /* the font software copyright owner. */
+ /* */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded and temporarily */
+ /* loaded on the remote system. Documents containing Preview & */
+ /* Print fonts must be opened `read-only'; no edits can be applied */
+ /* to the document. */
+ /* */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded but must only be */
+ /* installed temporarily on other systems. In contrast to Preview */
+ /* & Print fonts, documents containing editable fonts may be opened */
+ /* for reading, editing is permitted, and changes may be saved. */
+ /* */
+ /* FT_FSTYPE_NO_SUBSETTING :: */
+ /* If this bit is set, the font may not be subsetted prior to */
+ /* embedding. */
+ /* */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */
+ /* If this bit is set, only bitmaps contained in the font may be */
+ /* embedded; no outline data may be embedded. If there are no */
+ /* bitmaps available in the font, then the font is unembeddable. */
+ /* */
+ /* <Note> */
+ /* While the fsType flags can indicate that a font may be embedded, a */
+ /* license with the font vendor may be separately required to use the */
+ /* font in this way. */
+ /* */
+#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000
+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002
+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004
+#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008
+#define FT_FSTYPE_NO_SUBSETTING 0x0100
+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /* <Description> */
+ /* Return the fsType flags for a font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* The fsType flags, @FT_FSTYPE_XXX. */
+ /* */
+ /* <Note> */
+ /* Use this function rather than directly reading the `fs_type' field */
+ /* in the @PS_FontInfoRec structure which is only guaranteed to */
+ /* return the correct results for Type~1 fonts. */
+ /* */
+ /* <Since> */
+ /* 2.3.8 */
+ /* */
+ FT_EXPORT( FT_UShort )
+ FT_Get_FSType_Flags( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_variants */
+ /* */
+ /* <Title> */
+ /* Glyph Variants */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 interface to Unicode Ideographic Variation */
+ /* Sequences (IVS), using the SFNT cmap format~14. */
+ /* */
+ /* <Description> */
+ /* Many CJK characters have variant forms. They are a sort of grey */
+ /* area somewhere between being totally irrelevant and semantically */
+ /* distinct; for this reason, the Unicode consortium decided to */
+ /* introduce Ideographic Variation Sequences (IVS), consisting of a */
+ /* Unicode base character and one of 240 variant selectors */
+ /* (U+E0100-U+E01EF), instead of further extending the already huge */
+ /* code range for CJK characters. */
+ /* */
+ /* An IVS is registered and unique; for further details please refer */
+ /* to Unicode Technical Standard #37, the Ideographic Variation */
+ /* Database: */
+ /* */
+ /* http://www.unicode.org/reports/tr37/ */
+ /* */
+ /* To date (November 2012), the character with the most variants is */
+ /* U+9089, having 31 such IVS. */
+ /* */
+ /* Adobe and MS decided to support IVS with a new cmap subtable */
+ /* (format~14). It is an odd subtable because it is not a mapping of */
+ /* input code points to glyphs, but contains lists of all variants */
+ /* supported by the font. */
+ /* */
+ /* A variant may be either `default' or `non-default'. A default */
+ /* variant is the one you will get for that code point if you look it */
+ /* up in the standard Unicode cmap. A non-default variant is a */
+ /* different glyph. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIndex */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code as modified by */
+ /* the variation selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character code point in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode code point of the variation selector. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means either `undefined character code', or */
+ /* `undefined selector code', or `no variation selector cmap */
+ /* subtable', or `current CharMap is not Unicode'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within */
+ /* the file. This is done to ensure that value~0 always corresponds */
+ /* to the `missing glyph'. */
+ /* */
+ /* This function is only meaningful if */
+ /* a) the font has a variation selector cmap sub table, */
+ /* and */
+ /* b) the current charmap has a Unicode encoding. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Face_GetCharVariantIndex( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIsDefault */
+ /* */
+ /* <Description> */
+ /* Check whether this variant of this Unicode character is the one to */
+ /* be found in the `cmap'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode codepoint of the variation selector. */
+ /* */
+ /* <Return> */
+ /* 1~if found in the standard (Unicode) cmap, 0~if found in the */
+ /* variation selector cmap, or -1 if it is not a variant. */
+ /* */
+ /* <Note> */
+ /* This function is only meaningful if the font has a variation */
+ /* selector cmap subtable. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_Int )
+ FT_Face_GetCharVariantIsDefault( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantSelectors */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* in the font. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of selector code points, or NULL if there is */
+ /* no valid variant selector cmap subtable. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantSelectors( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantsOfChar */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* for the specified character code. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of variant selector code points which are */
+ /* active for the given character, or NULL if the corresponding list */
+ /* is empty. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantsOfChar( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharsOfVariant */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode character codes found for */
+ /* the specified variant selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* variantSelector :: */
+ /* The variant selector code point in Unicode. */
+ /* */
+ /* <Return> */
+ /* A list of all the code points which are specified by this selector */
+ /* (both default and non-default codes are returned) or NULL if there */
+ /* is no valid cmap or the variant selector is invalid. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetCharsOfVariant( FT_Face face,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /* <Title> */
+ /* Computations */
+ /* */
+ /* <Abstract> */
+ /* Crunching fixed numbers and vectors. */
+ /* */
+ /* <Description> */
+ /* This section contains various functions used to perform */
+ /* computations on 16.16 fixed-float numbers or 2d vectors. */
+ /* */
+ /* <Order> */
+ /* FT_MulDiv */
+ /* FT_MulFix */
+ /* FT_DivFix */
+ /* FT_RoundFix */
+ /* FT_CeilFix */
+ /* FT_FloorFix */
+ /* FT_Vector_Transform */
+ /* FT_Matrix_Multiply */
+ /* FT_Matrix_Invert */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* with maximum accuracy (it uses a 64-bit intermediate integer */
+ /* whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /* */
+
+ /* The following #if 0 ... #endif is for the documentation formatter, */
+ /* hiding the internal `FT_MULFIX_INLINED' macro. */
+
+#if 0
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */
+ /* used to multiply a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/0x10000'. */
+ /* */
+ /* <Note> */
+ /* This function has been optimized for the case where the absolute */
+ /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
+ /* As this happens mainly when scaling from notional units to */
+ /* fractional pixels in FreeType, it resulted in noticeable speed */
+ /* improvements between versions 2.x and 1.x. */
+ /* */
+ /* As a conclusion, always try to place a 16.16 factor as the */
+ /* _second_ argument of this function; this can make a great */
+ /* difference. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+
+ /* */
+#endif
+
+#ifdef FT_MULFIX_INLINED
+#define FPDFAPI_FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b )
+#else
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_DivFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */
+ /* used to divide a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*0x10000)/b'. */
+ /* */
+ /* <Note> */
+ /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */
+ /* 32~bits, then the division is computed directly. Otherwise, we */
+ /* use a specialized version of @FT_MulDiv. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_RoundFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to round a 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number to be rounded. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x8000) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_RoundFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_CeilFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the ceiling function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the ceiling function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x10000 - 1) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_CeilFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FloorFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the floor function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the floor function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `a & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_FloorFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Vector_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a single vector through a 2x2 matrix. */
+ /* */
+ /* <InOut> */
+ /* vector :: The target vector to transform. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the source 2x2 matrix. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `vector' or `matrix' is invalid. */
+ /* */
+ FT_EXPORT( void )
+ FT_Vector_Transform( FT_Vector* vec,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* version */
+ /* */
+ /* <Title> */
+ /* FreeType Version */
+ /* */
+ /* <Abstract> */
+ /* Functions and macros related to FreeType versions. */
+ /* */
+ /* <Description> */
+ /* Note that those functions and macros are of limited use because */
+ /* even a new release of FreeType with only documentation changes */
+ /* increases the version number. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FREETYPE_XXX
+ *
+ * @description:
+ * These three macros identify the FreeType source code version.
+ * Use @FT_Library_Version to access them at runtime.
+ *
+ * @values:
+ * FREETYPE_MAJOR :: The major version number.
+ * FREETYPE_MINOR :: The minor version number.
+ * FREETYPE_PATCH :: The patch level.
+ *
+ * @note:
+ * The version number of FreeType if built as a dynamic link library
+ * with the `libtool' package is _not_ controlled by these three
+ * macros.
+ *
+ */
+#define FREETYPE_MAJOR 2
+#define FREETYPE_MINOR 5
+#define FREETYPE_PATCH 0
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Library_Version */
+ /* */
+ /* <Description> */
+ /* Return the version of the FreeType library being used. This is */
+ /* useful when dynamically linking to the library, since one cannot */
+ /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */
+ /* @FREETYPE_PATCH. */
+ /* */
+ /* <Input> */
+ /* library :: A source library handle. */
+ /* */
+ /* <Output> */
+ /* amajor :: The major version number. */
+ /* */
+ /* aminor :: The minor version number. */
+ /* */
+ /* apatch :: The patch version number. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' argument is because */
+ /* certain programs implement library initialization in a custom way */
+ /* that doesn't use @FT_Init_FreeType. */
+ /* */
+ /* In such cases, the library version might not be available before */
+ /* the library object has been created. */
+ /* */
+ FT_EXPORT( void )
+ FT_Library_Version( FT_Library library,
+ FT_Int *amajor,
+ FT_Int *aminor,
+ FT_Int *apatch );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_CheckTrueTypePatents */
+ /* */
+ /* <Description> */
+ /* Parse all bytecode instructions of a TrueType font file to check */
+ /* whether any of the patented opcodes are used. This is only useful */
+ /* if you want to be able to use the unpatented hinter with */
+ /* fonts that do *not* use these opcodes. */
+ /* */
+ /* Note that this function parses *all* glyph instructions in the */
+ /* font file, which may be slow. */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* <Return> */
+ /* 1~if this is a TrueType font that uses one of the patented */
+ /* opcodes, 0~otherwise. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_CheckTrueTypePatents( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_SetUnpatentedHinting */
+ /* */
+ /* <Description> */
+ /* Enable or disable the unpatented hinter for a given face. */
+ /* Only enable it if you have determined that the face doesn't */
+ /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* value :: New boolean setting. */
+ /* */
+ /* <Return> */
+ /* The old setting value. This will always be false if this is not */
+ /* an SFNT font, or if the unpatented hinter is not compiled in this */
+ /* instance of the library. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_SetUnpatentedHinting( FT_Face face,
+ FT_Bool value );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FREETYPE_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftadvanc.h b/core/include/thirdparties/freetype/freetype/ftadvanc.h
new file mode 100644
index 0000000000..0163ba1874
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftadvanc.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.h */
+/* */
+/* Quick computation of advance widths (specification only). */
+/* */
+/* Copyright 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * quick_advance
+ *
+ * @title:
+ * Quick retrieval of advance values
+ *
+ * @abstract:
+ * Retrieve horizontal and vertical advance values without processing
+ * glyph outlines, if possible.
+ *
+ * @description:
+ * This section contains functions to quickly extract advance values
+ * without handling glyph outlines, if possible.
+ */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_ADVANCE_FLAG_FAST_ONLY */
+ /* */
+ /* <Description> */
+ /* A bit-flag to be OR-ed with the `flags' parameter of the */
+ /* @FT_Get_Advance and @FT_Get_Advances functions. */
+ /* */
+ /* If set, it indicates that you want these functions to fail if the */
+ /* corresponding hinting mode or font driver doesn't allow for very */
+ /* quick advance computation. */
+ /* */
+ /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */
+ /* or light-hinted can have their advance width computed very */
+ /* quickly. */
+ /* */
+ /* Normal and bytecode hinted modes, which require loading, scaling, */
+ /* and hinting of the glyph outline, are extremely slow by */
+ /* comparison. */
+ /* */
+#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advance */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance value of a given glyph outline in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph, used to determine what kind */
+ /* of advances you need. */
+ /* <Output> */
+ /* padvance :: The advance value. If scaling is performed (based on */
+ /* the value of `load_flags'), the advance value is in */
+ /* 16.16 format. Otherwise, it is in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */
+ /* vertical advance corresponding to a vertical layout. */
+ /* Otherwise, it is the horizontal advance in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* A scaled advance is returned in 16.16 format but isn't transformed */
+ /* by the affine transformation specified by @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Int32 load_flags,
+ FT_Fixed *padvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advances */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance values of several glyph outlines in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* start :: The first glyph index. */
+ /* */
+ /* count :: The number of advance values you want to retrieve. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph. */
+ /* */
+ /* <Output> */
+ /* padvance :: The advance values. This array, to be provided by the */
+ /* caller, must contain at least `count' elements. */
+ /* */
+ /* If scaling is performed (based on the value of */
+ /* `load_flags'), the advance values are in 16.16 format. */
+ /* Otherwise, they are in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */
+ /* vertical advances corresponding to a vertical layout. */
+ /* Otherwise, they are the horizontal advances in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* Scaled advances are returned in 16.16 format but aren't */
+ /* transformed by the affine transformation specified by */
+ /* @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftautoh.h b/core/include/thirdparties/freetype/freetype/ftautoh.h
new file mode 100644
index 0000000000..6edd9f4b73
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftautoh.h
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/* */
+/* ftautoh.h */
+/* */
+/* FreeType API for controlling the auto-hinter (specification only). */
+/* */
+/* Copyright 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * auto_hinter
+ *
+ * @title:
+ * The auto-hinter
+ *
+ * @abstract:
+ * Controlling the auto-hinting module.
+ *
+ * @description:
+ * While FreeType's auto-hinter doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * Note that the auto-hinter's module name is `autofitter' for
+ * historical reasons.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * glyph-to-script-map
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The auto-hinter provides various script modules to hint glyphs.
+ * Examples of supported scripts are Latin or CJK. Before a glyph is
+ * auto-hinted, the Unicode character map of the font gets examined, and
+ * the script is then determined based on Unicode character ranges, see
+ * below.
+ *
+ * OpenType fonts, however, often provide much more glyphs than
+ * character codes (small caps, superscripts, ligatures, swashes, etc.),
+ * to be controlled by so-called `features'. Handling OpenType features
+ * can be quite complicated and thus needs a separate library on top of
+ * FreeType.
+ *
+ * The mapping between glyph indices and scripts (in the auto-hinter
+ * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+ * array with `num_glyphs' elements, as found in the font's @FT_Face
+ * structure. The `glyph-to-script-map' property returns a pointer to
+ * this array which can be modified as needed. Note that the
+ * modification should happen before the first glyph gets processed by
+ * the auto-hinter so that the global analysis of the font shapes
+ * actually uses the modified mapping.
+ *
+ * The following example code demonstrates how to access it (omitting
+ * the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_GlyphToScriptMap prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ *
+ * prop.face = face;
+ *
+ * FT_Property_Get( library, "autofitter",
+ * "glyph-to-script-map", &prop );
+ *
+ * // adjust `prop.map' as needed right here
+ *
+ * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+ * }
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_AUTOHINTER_SCRIPT_XXX
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * A list of constants used for the @glyph-to-script-map property to
+ * specify the script submodule the auto-hinter should use for hinting a
+ * particular glyph.
+ *
+ * @values:
+ * FT_AUTOHINTER_SCRIPT_NONE ::
+ * Don't auto-hint this glyph.
+ *
+ * FT_AUTOHINTER_SCRIPT_LATIN ::
+ * Apply the latin auto-hinter. For the auto-hinter, `latin' is a
+ * very broad term, including Cyrillic and Greek also since characters
+ * from those scripts share the same design constraints.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0020 - U+007F // Basic Latin (no control characters)
+ * U+00A0 - U+00FF // Latin-1 Supplement (no control characters)
+ * U+0100 - U+017F // Latin Extended-A
+ * U+0180 - U+024F // Latin Extended-B
+ * U+0250 - U+02AF // IPA Extensions
+ * U+02B0 - U+02FF // Spacing Modifier Letters
+ * U+0300 - U+036F // Combining Diacritical Marks
+ * U+0370 - U+03FF // Greek and Coptic
+ * U+0400 - U+04FF // Cyrillic
+ * U+0500 - U+052F // Cyrillic Supplement
+ * U+1D00 - U+1D7F // Phonetic Extensions
+ * U+1D80 - U+1DBF // Phonetic Extensions Supplement
+ * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement
+ * U+1E00 - U+1EFF // Latin Extended Additional
+ * U+1F00 - U+1FFF // Greek Extended
+ * U+2000 - U+206F // General Punctuation
+ * U+2070 - U+209F // Superscripts and Subscripts
+ * U+20A0 - U+20CF // Currency Symbols
+ * U+2150 - U+218F // Number Forms
+ * U+2460 - U+24FF // Enclosed Alphanumerics
+ * U+2C60 - U+2C7F // Latin Extended-C
+ * U+2DE0 - U+2DFF // Cyrillic Extended-A
+ * U+2E00 - U+2E7F // Supplemental Punctuation
+ * U+A640 - U+A69F // Cyrillic Extended-B
+ * U+A720 - U+A7FF // Latin Extended-D
+ * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures)
+ * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+ * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_CJK ::
+ * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+ * Vietnamese, and some other scripts.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+1100 - U+11FF // Hangul Jamo
+ * U+2E80 - U+2EFF // CJK Radicals Supplement
+ * U+2F00 - U+2FDF // Kangxi Radicals
+ * U+2FF0 - U+2FFF // Ideographic Description Characters
+ * U+3000 - U+303F // CJK Symbols and Punctuation
+ * U+3040 - U+309F // Hiragana
+ * U+30A0 - U+30FF // Katakana
+ * U+3100 - U+312F // Bopomofo
+ * U+3130 - U+318F // Hangul Compatibility Jamo
+ * U+3190 - U+319F // Kanbun
+ * U+31A0 - U+31BF // Bopomofo Extended
+ * U+31C0 - U+31EF // CJK Strokes
+ * U+31F0 - U+31FF // Katakana Phonetic Extensions
+ * U+3200 - U+32FF // Enclosed CJK Letters and Months
+ * U+3300 - U+33FF // CJK Compatibility
+ * U+3400 - U+4DBF // CJK Unified Ideographs Extension A
+ * U+4DC0 - U+4DFF // Yijing Hexagram Symbols
+ * U+4E00 - U+9FFF // CJK Unified Ideographs
+ * U+A960 - U+A97F // Hangul Jamo Extended-A
+ * U+AC00 - U+D7AF // Hangul Syllables
+ * U+D7B0 - U+D7FF // Hangul Jamo Extended-B
+ * U+F900 - U+FAFF // CJK Compatibility Ideographs
+ * U+FE10 - U+FE1F // Vertical forms
+ * U+FE30 - U+FE4F // CJK Compatibility Forms
+ * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms
+ * U+1B000 - U+1B0FF // Kana Supplement
+ * U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+ * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+ * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+ * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+ * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+ * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_INDIC ::
+ * Apply the indic auto-hinter, covering all major scripts from the
+ * Indian sub-continent and some other related scripts like Thai, Lao,
+ * or Tibetan.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0900 - U+0DFF // Indic Range
+ * U+0F00 - U+0FFF // Tibetan
+ * U+1900 - U+194F // Limbu
+ * U+1B80 - U+1BBF // Sundanese
+ * U+1C80 - U+1CDF // Meetei Mayak
+ * U+A800 - U+A82F // Syloti Nagri
+ * U+11800 - U+118DF // Sharada
+ * }
+ *
+ * Note that currently Indic support is rudimentary only, missing blue
+ * zone support.
+ *
+ */
+#define FT_AUTOHINTER_SCRIPT_NONE 0
+#define FT_AUTOHINTER_SCRIPT_LATIN 1
+#define FT_AUTOHINTER_SCRIPT_CJK 2
+#define FT_AUTOHINTER_SCRIPT_INDIC 3
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_GlyphToScriptMap
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The data exchange structure for the @glyph-to-script-map property.
+ *
+ */
+ typedef struct FT_Prop_GlyphToScriptMap_
+ {
+ FT_Face face;
+ FT_Byte* map;
+
+ } FT_Prop_GlyphToScriptMap;
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * fallback-script
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * If no auto-hinter script module can be assigned to a glyph, a
+ * fallback script gets assigned to it (see also the
+ * @glyph-to-script-map property). By default, this is
+ * @FT_AUTOHINTER_SCRIPT_CJK. Using the `fallback-script' property,
+ * this fallback value can be changed.
+ *
+ * {
+ * FT_Library library;
+ * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "fallback-script", &fallback_script );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * It's important to use the right timing for changing this value: The
+ * creation of the glyph-to-script map which eventually uses the
+ * fallback script value gets triggered either by setting or reading a
+ * face-specific property like @glyph-to-script-map, or by auto-hinting
+ * any glyph from that face. In particular, if you have already created
+ * an @FT_Face structure but not loaded any glyph (using the
+ * auto-hinter), a change of the fallback glyph will affect this face.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * increase-x-height
+ *
+ * @description:
+ * For ppem values in the range 6~<= ppem <= `increase-x-height', round
+ * up the font's x~height much more often than normally. If the value
+ * is set to~0, which is the default, this feature is switched off. Use
+ * this property to improve the legibility of small font sizes if
+ * necessary.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_IncreaseXHeight prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+ *
+ * prop.face = face;
+ * prop.limit = 14;
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "increase-x-height", &prop );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * Set this value right after calling @FT_Set_Char_Size, but before
+ * loading any glyph (using the auto-hinter).
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_IncreaseXHeight
+ *
+ * @description:
+ * The data exchange structure for the @increase-x-height property.
+ *
+ */
+ typedef struct FT_Prop_IncreaseXHeight_
+ {
+ FT_Face face;
+ FT_UInt limit;
+
+ } FT_Prop_IncreaseXHeight;
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbbox.h b/core/include/thirdparties/freetype/freetype/ftbbox.h
new file mode 100644
index 0000000000..5f54246976
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbbox.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbbox.h */
+/* */
+/* FreeType exact bbox computation (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component has a _single_ role: to compute exact outline bounding */
+ /* boxes. */
+ /* */
+ /* It is separated from the rest of the engine for various technical */
+ /* reasons. It may well be integrated in `ftoutln' later. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* <Description> */
+ /* Compute the exact bounding box of an outline. This is slower */
+ /* than computing the control box. However, it uses an advanced */
+ /* algorithm which returns _very_ quickly when the two boxes */
+ /* coincide. Otherwise, the outline Bézier arcs are traversed to */
+ /* extract their extrema. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline. */
+ /* */
+ /* <Output> */
+ /* abbox :: The outline's exact bounding box. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get */
+ /* reasonable values for the BBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the BBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_BBox( FT_Outline* outline,
+ FT_BBox *abbox );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftbdf.h b/core/include/thirdparties/freetype/freetype/ftbdf.h
new file mode 100644
index 0000000000..c4721bcd4e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbdf.h
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/* */
+/* ftbdf.h */
+/* */
+/* FreeType API for accessing BDF-specific strings (specification). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bdf_fonts */
+ /* */
+ /* <Title> */
+ /* BDF and PCF Files */
+ /* */
+ /* <Abstract> */
+ /* BDF and PCF specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions specific to BDF */
+ /* and PCF fonts. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_PropertyType
+ *
+ * @description:
+ * A list of BDF property types.
+ *
+ * @values:
+ * BDF_PROPERTY_TYPE_NONE ::
+ * Value~0 is used to indicate a missing property.
+ *
+ * BDF_PROPERTY_TYPE_ATOM ::
+ * Property is a string atom.
+ *
+ * BDF_PROPERTY_TYPE_INTEGER ::
+ * Property is a 32-bit signed integer.
+ *
+ * BDF_PROPERTY_TYPE_CARDINAL ::
+ * Property is a 32-bit unsigned integer.
+ */
+ typedef enum BDF_PropertyType_
+ {
+ BDF_PROPERTY_TYPE_NONE = 0,
+ BDF_PROPERTY_TYPE_ATOM = 1,
+ BDF_PROPERTY_TYPE_INTEGER = 2,
+ BDF_PROPERTY_TYPE_CARDINAL = 3
+
+ } BDF_PropertyType;
+
+
+ /**********************************************************************
+ *
+ * @type:
+ * BDF_Property
+ *
+ * @description:
+ * A handle to a @BDF_PropertyRec structure to model a given
+ * BDF/PCF property.
+ */
+ typedef struct BDF_PropertyRec_* BDF_Property;
+
+
+ /**********************************************************************
+ *
+ * @struct:
+ * BDF_PropertyRec
+ *
+ * @description:
+ * This structure models a given BDF/PCF property.
+ *
+ * @fields:
+ * type ::
+ * The property type.
+ *
+ * u.atom ::
+ * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+ *
+ * u.integer ::
+ * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+ *
+ * u.cardinal ::
+ * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+ */
+ typedef struct BDF_PropertyRec_
+ {
+ BDF_PropertyType type;
+ union {
+ const char* atom;
+ FT_Int32 integer;
+ FT_UInt32 cardinal;
+
+ } u;
+
+ } BDF_PropertyRec;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Charset_ID
+ *
+ * @description:
+ * Retrieve a BDF font character set identity, according to
+ * the BDF specification.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * acharset_encoding ::
+ * Charset encoding, as a C~string, owned by the face.
+ *
+ * acharset_registry ::
+ * Charset registry, as a C~string, owned by the face.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with BDF faces, returning an error otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Charset_ID( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Property
+ *
+ * @description:
+ * Retrieve a BDF property from a BDF or PCF font file.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * name :: The property name.
+ *
+ * @output:
+ * aproperty :: The property.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function works with BDF _and_ PCF fonts. It returns an error
+ * otherwise. It also returns an error if the property is not in the
+ * font.
+ *
+ * A `property' is a either key-value pair within the STARTPROPERTIES
+ * ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+ * `info->props' array within a `FontRec' structure of a PCF font.
+ *
+ * Integer properties are always stored as `signed' within PCF fonts;
+ * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+ * for BDF fonts only.
+ *
+ * In case of error, `aproperty->type' is always set to
+ * @BDF_PROPERTY_TYPE_NONE.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Property( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbitmap.h b/core/include/thirdparties/freetype/freetype/ftbitmap.h
new file mode 100644
index 0000000000..9640790925
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbitmap.h
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/* */
+/* ftbitmap.h */
+/* */
+/* FreeType utility functions for bitmaps (specification). */
+/* */
+/* Copyright 2004-2006, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bitmap_handling */
+ /* */
+ /* <Title> */
+ /* Bitmap Handling */
+ /* */
+ /* <Abstract> */
+ /* Handling FT_Bitmap objects. */
+ /* */
+ /* <Description> */
+ /* This section contains functions for converting FT_Bitmap objects. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_New */
+ /* */
+ /* <Description> */
+ /* Initialize a pointer to an @FT_Bitmap structure. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the bitmap structure. */
+ /* */
+ FT_EXPORT( void )
+ FT_Bitmap_New( FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Copy */
+ /* */
+ /* <Description> */
+ /* Copy a bitmap into another one. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: A handle to the source bitmap. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden a bitmap. The new bitmap will be about `xStrength' */
+ /* pixels wider and `yStrength' pixels higher. The left and bottom */
+ /* borders are kept unchanged. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* xStrength :: How strong the glyph is emboldened horizontally. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* yStrength :: How strong the glyph is emboldened vertically. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* <InOut> */
+ /* bitmap :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The current implementation restricts `xStrength' to be less than */
+ /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */
+ /* */
+ /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */
+ /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Embolden( FT_Library library,
+ FT_Bitmap* bitmap,
+ FT_Pos xStrength,
+ FT_Pos yStrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Convert */
+ /* */
+ /* <Description> */
+ /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
+ /* to a bitmap object with depth 8bpp, making the number of used */
+ /* bytes line (a.k.a. the `pitch') a multiple of `alignment'. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: The source bitmap. */
+ /* */
+ /* alignment :: The pitch of the bitmap is a multiple of this */
+ /* parameter. Common values are 1, 2, or 4. */
+ /* */
+ /* <Output> */
+ /* target :: The target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* It is possible to call @FT_Bitmap_Convert multiple times without */
+ /* calling @FT_Bitmap_Done (the memory is simply reallocated). */
+ /* */
+ /* Use @FT_Bitmap_Done to finally remove the bitmap object. */
+ /* */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Convert( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target,
+ FT_Int alignment );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GlyphSlot_Own_Bitmap */
+ /* */
+ /* <Description> */
+ /* Make sure that a glyph slot owns `slot->bitmap'. */
+ /* */
+ /* <Input> */
+ /* slot :: The glyph slot. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function is to be used in combination with */
+ /* @FT_Bitmap_Embolden. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a bitmap object created with @FT_Bitmap_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* bitmap :: The bitmap object to be freed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Done( FT_Library library,
+ FT_Bitmap *bitmap );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftbzip2.h b/core/include/thirdparties/freetype/freetype/ftbzip2.h
new file mode 100644
index 0000000000..654b222346
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftbzip2.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbzip2.h */
+/* */
+/* Bzip2-compressed stream support. */
+/* */
+/* Copyright 2010 by */
+/* Joel Klinghed. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bzip2 */
+ /* */
+ /* <Title> */
+ /* BZIP2 Streams */
+ /* */
+ /* <Abstract> */
+ /* Using bzip2-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Bzip2-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenBzip2
+ *
+ * @description:
+ * Open a new stream to parse bzip2-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.bz2' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, bzip2 compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a bzip2 compressed stream
+ * from it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with bzip2 support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenBzip2( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftcache.h b/core/include/thirdparties/freetype/freetype/ftcache.h
new file mode 100644
index 0000000000..404b0faf8e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcache.h
@@ -0,0 +1,1057 @@
+/***************************************************************************/
+/* */
+/* ftcache.h */
+/* */
+/* FreeType Cache subsystem (specification). */
+/* */
+/* Copyright 1996-2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include "../ft2build.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************
+ *
+ * <Section>
+ * cache_subsystem
+ *
+ * <Title>
+ * Cache Sub-System
+ *
+ * <Abstract>
+ * How to cache face, size, and glyph data with FreeType~2.
+ *
+ * <Description>
+ * This section describes the FreeType~2 cache sub-system, which is used
+ * to limit the number of concurrently opened @FT_Face and @FT_Size
+ * objects, as well as caching information like character maps and glyph
+ * images while limiting their maximum memory usage.
+ *
+ * Note that all types and functions begin with the `FTC_' prefix.
+ *
+ * The cache is highly portable and thus doesn't know anything about the
+ * fonts installed on your system, or how to access them. This implies
+ * the following scheme:
+ *
+ * First, available or installed font faces are uniquely identified by
+ * @FTC_FaceID values, provided to the cache by the client. Note that
+ * the cache only stores and compares these values, and doesn't try to
+ * interpret them in any way.
+ *
+ * Second, the cache calls, only when needed, a client-provided function
+ * to convert an @FTC_FaceID into a new @FT_Face object. The latter is
+ * then completely managed by the cache, including its termination
+ * through @FT_Done_Face. To monitor termination of face objects, the
+ * finalizer callback in the `generic' field of the @FT_Face object can
+ * be used, which might also be used to store the @FTC_FaceID of the
+ * face.
+ *
+ * Clients are free to map face IDs to anything else. The most simple
+ * usage is to associate them to a (pathname,face_index) pair that is
+ * used to call @FT_New_Face. However, more complex schemes are also
+ * possible.
+ *
+ * Note that for the cache to work correctly, the face ID values must be
+ * *persistent*, which means that the contents they point to should not
+ * change at runtime, or that their value should not become invalid.
+ *
+ * If this is unavoidable (e.g., when a font is uninstalled at runtime),
+ * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+ * the cache get rid of any references to the old @FTC_FaceID it may
+ * keep internally. Failure to do so will lead to incorrect behaviour
+ * or even crashes.
+ *
+ * To use the cache, start with calling @FTC_Manager_New to create a new
+ * @FTC_Manager object, which models a single cache instance. You can
+ * then look up @FT_Face and @FT_Size objects with
+ * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+ *
+ * If you want to use the charmap caching, call @FTC_CMapCache_New, then
+ * later use @FTC_CMapCache_Lookup to perform the equivalent of
+ * @FT_Get_Char_Index, only much faster.
+ *
+ * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+ * later use @FTC_ImageCache_Lookup to retrieve the corresponding
+ * @FT_Glyph objects from the cache.
+ *
+ * If you need lots of small bitmaps, it is much more memory efficient
+ * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This
+ * returns @FTC_SBitRec structures, which are used to store small
+ * bitmaps directly. (A small bitmap is one whose metrics and
+ * dimensions all fit into 8-bit integers).
+ *
+ * We hope to also provide a kerning cache in the near future.
+ *
+ *
+ * <Order>
+ * FTC_Manager
+ * FTC_FaceID
+ * FTC_Face_Requester
+ *
+ * FTC_Manager_New
+ * FTC_Manager_Reset
+ * FTC_Manager_Done
+ * FTC_Manager_LookupFace
+ * FTC_Manager_LookupSize
+ * FTC_Manager_RemoveFaceID
+ *
+ * FTC_Node
+ * FTC_Node_Unref
+ *
+ * FTC_ImageCache
+ * FTC_ImageCache_New
+ * FTC_ImageCache_Lookup
+ *
+ * FTC_SBit
+ * FTC_SBitCache
+ * FTC_SBitCache_New
+ * FTC_SBitCache_Lookup
+ *
+ * FTC_CMapCache
+ * FTC_CMapCache_New
+ * FTC_CMapCache_Lookup
+ *
+ *************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BASIC TYPE DEFINITIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type: FTC_FaceID
+ *
+ * @description:
+ * An opaque pointer type that is used to identity face objects. The
+ * contents of such objects is application-dependent.
+ *
+ * These pointers are typically used to point to a user-defined
+ * structure containing a font file path, and face index.
+ *
+ * @note:
+ * Never use NULL as a valid @FTC_FaceID.
+ *
+ * Face IDs are passed by the client to the cache manager, which calls,
+ * when needed, the @FTC_Face_Requester to translate them into new
+ * @FT_Face objects.
+ *
+ * If the content of a given face ID changes at runtime, or if the value
+ * becomes invalid (e.g., when uninstalling a font), you should
+ * immediately call @FTC_Manager_RemoveFaceID before any other cache
+ * function.
+ *
+ * Failure to do so will result in incorrect behaviour or even
+ * memory leaks and crashes.
+ */
+ typedef FT_Pointer FTC_FaceID;
+
+
+ /************************************************************************
+ *
+ * @functype:
+ * FTC_Face_Requester
+ *
+ * @description:
+ * A callback function provided by client applications. It is used by
+ * the cache manager to translate a given @FTC_FaceID into a new valid
+ * @FT_Face object, on demand.
+ *
+ * <Input>
+ * face_id ::
+ * The face ID to resolve.
+ *
+ * library ::
+ * A handle to a FreeType library object.
+ *
+ * req_data ::
+ * Application-provided request data (see note below).
+ *
+ * <Output>
+ * aface ::
+ * A new @FT_Face handle.
+ *
+ * <Return>
+ * FreeType error code. 0~means success.
+ *
+ * <Note>
+ * The third parameter `req_data' is the same as the one passed by the
+ * client when @FTC_Manager_New is called.
+ *
+ * The face requester should not perform funny things on the returned
+ * face object, like creating a new @FT_Size for it, or setting a
+ * transformation through @FT_Set_Transform!
+ */
+ typedef FT_Error
+ (*FTC_Face_Requester)( FTC_FaceID face_id,
+ FT_Library library,
+ FT_Pointer request_data,
+ FT_Face* aface );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CACHE MANAGER OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Manager */
+ /* */
+ /* <Description> */
+ /* This object corresponds to one instance of the cache-subsystem. */
+ /* It is used to cache one or more @FT_Face objects, along with */
+ /* corresponding @FT_Size objects. */
+ /* */
+ /* The manager intentionally limits the total number of opened */
+ /* @FT_Face and @FT_Size objects to control memory usage. See the */
+ /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */
+ /* */
+ /* The manager is also used to cache `nodes' of various types while */
+ /* limiting their total memory usage. */
+ /* */
+ /* All limitations are enforced by keeping lists of managed objects */
+ /* in most-recently-used order, and flushing old nodes to make room */
+ /* for new ones. */
+ /* */
+ typedef struct FTC_ManagerRec_* FTC_Manager;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Node */
+ /* */
+ /* <Description> */
+ /* An opaque handle to a cache node object. Each cache node is */
+ /* reference-counted. A node with a count of~0 might be flushed */
+ /* out of a full cache whenever a lookup request is performed. */
+ /* */
+ /* If you look up nodes, you have the ability to `acquire' them, */
+ /* i.e., to increment their reference count. This will prevent the */
+ /* node from being flushed out of the cache until you explicitly */
+ /* `release' it (see @FTC_Node_Unref). */
+ /* */
+ /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */
+ /* */
+ typedef struct FTC_NodeRec_* FTC_Node;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache manager. */
+ /* */
+ /* <Input> */
+ /* library :: The parent FreeType library handle to use. */
+ /* */
+ /* max_faces :: Maximum number of opened @FT_Face objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_sizes :: Maximum number of opened @FT_Size objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_bytes :: Maximum number of bytes to use for cached data nodes. */
+ /* Use~0 for defaults. Note that this value does not */
+ /* account for managed @FT_Face and @FT_Size objects. */
+ /* */
+ /* requester :: An application-provided callback used to translate */
+ /* face IDs into real @FT_Face objects. */
+ /* */
+ /* req_data :: A generic pointer that is passed to the requester */
+ /* each time it is called (see @FTC_Face_Requester). */
+ /* */
+ /* <Output> */
+ /* amanager :: A handle to a new manager object. 0~in case of */
+ /* failure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_New( FT_Library library,
+ FT_UInt max_faces,
+ FT_UInt max_sizes,
+ FT_ULong max_bytes,
+ FTC_Face_Requester requester,
+ FT_Pointer req_data,
+ FTC_Manager *amanager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Reset */
+ /* */
+ /* <Description> */
+ /* Empty a given cache manager. This simply gets rid of all the */
+ /* currently cached @FT_Face and @FT_Size objects within the manager. */
+ /* */
+ /* <InOut> */
+ /* manager :: A handle to the manager. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Reset( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a given manager after emptying it. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the target cache manager object. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Done( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupFace */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Face object that corresponds to a given face ID */
+ /* through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* face_id :: The ID of the face object. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to the face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Face object is always owned by the manager. You */
+ /* should never try to discard it yourself. */
+ /* */
+ /* The @FT_Face object doesn't necessarily have a current size object */
+ /* (i.e., face->size can be~0). If you need a specific `font size', */
+ /* use @FTC_Manager_LookupSize instead. */
+ /* */
+ /* Never change the face's transformation matrix (i.e., never call */
+ /* the @FT_Set_Transform function) on a returned face! If you need */
+ /* to transform glyphs, do it yourself after glyph loading. */
+ /* */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory was available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupFace( FTC_Manager manager,
+ FTC_FaceID face_id,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_ScalerRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given character size in either */
+ /* pixels or points to the cache manager. See */
+ /* @FTC_Manager_LookupSize. */
+ /* */
+ /* <Fields> */
+ /* face_id :: The source face ID. */
+ /* */
+ /* width :: The character width. */
+ /* */
+ /* height :: The character height. */
+ /* */
+ /* pixel :: A Boolean. If 1, the `width' and `height' fields are */
+ /* interpreted as integer pixel character sizes. */
+ /* Otherwise, they are expressed as 1/64th of points. */
+ /* */
+ /* x_res :: Only used when `pixel' is value~0 to indicate the */
+ /* horizontal resolution in dpi. */
+ /* */
+ /* y_res :: Only used when `pixel' is value~0 to indicate the */
+ /* vertical resolution in dpi. */
+ /* */
+ /* <Note> */
+ /* This type is mainly used to retrieve @FT_Size objects through the */
+ /* cache manager. */
+ /* */
+ typedef struct FTC_ScalerRec_
+ {
+ FTC_FaceID face_id;
+ FT_UInt width;
+ FT_UInt height;
+ FT_Int pixel;
+ FT_UInt x_res;
+ FT_UInt y_res;
+
+ } FTC_ScalerRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_Scaler */
+ /* */
+ /* <Description> */
+ /* A handle to an @FTC_ScalerRec structure. */
+ /* */
+ typedef struct FTC_ScalerRec_* FTC_Scaler;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupSize */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Size object that corresponds to a given */
+ /* @FTC_ScalerRec pointer through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* scaler :: A scaler handle. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to the size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Size object is always owned by the manager. You */
+ /* should never try to discard it by yourself. */
+ /* */
+ /* You can access the parent @FT_Face object simply as `size->face' */
+ /* if you need it. Note that this object is also owned by the */
+ /* manager. */
+ /* */
+ /* <Note> */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory is available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupSize( FTC_Manager manager,
+ FTC_Scaler scaler,
+ FT_Size *asize );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Node_Unref */
+ /* */
+ /* <Description> */
+ /* Decrement a cache node's internal reference count. When the count */
+ /* reaches 0, it is not destroyed but becomes eligible for subsequent */
+ /* cache flushes. */
+ /* */
+ /* <Input> */
+ /* node :: The cache node handle. */
+ /* */
+ /* manager :: The cache manager handle. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Node_Unref( FTC_Node node,
+ FTC_Manager manager );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_Manager_RemoveFaceID
+ *
+ * @description:
+ * A special function used to indicate to the cache manager that
+ * a given @FTC_FaceID is no longer valid, either because its
+ * content changed, or because it was deallocated or uninstalled.
+ *
+ * @input:
+ * manager ::
+ * The cache manager handle.
+ *
+ * face_id ::
+ * The @FTC_FaceID to be removed.
+ *
+ * @note:
+ * This function flushes all nodes from the cache corresponding to this
+ * `face_id', with the exception of nodes with a non-null reference
+ * count.
+ *
+ * Such nodes are however modified internally so as to never appear
+ * in later lookups with the same `face_id' value, and to be immediately
+ * destroyed when released by all their users.
+ *
+ */
+ FT_EXPORT( void )
+ FTC_Manager_RemoveFaceID( FTC_Manager manager,
+ FTC_FaceID face_id );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_CMapCache
+ *
+ * @description:
+ * An opaque handle used to model a charmap cache. This cache is to
+ * hold character codes -> glyph indices mappings.
+ *
+ */
+ typedef struct FTC_CMapCacheRec_* FTC_CMapCache;
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_New
+ *
+ * @description:
+ * Create a new charmap cache.
+ *
+ * @input:
+ * manager ::
+ * A handle to the cache manager.
+ *
+ * @output:
+ * acache ::
+ * A new cache handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Like all other caches, this one will be destroyed with the cache
+ * manager.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FTC_CMapCache_New( FTC_Manager manager,
+ FTC_CMapCache *acache );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_Lookup
+ *
+ * @description:
+ * Translate a character code into a glyph index, using the charmap
+ * cache.
+ *
+ * @input:
+ * cache ::
+ * A charmap cache handle.
+ *
+ * face_id ::
+ * The source face ID.
+ *
+ * cmap_index ::
+ * The index of the charmap in the source face. Any negative value
+ * means to use the cache @FT_Face's default charmap.
+ *
+ * char_code ::
+ * The character code (in the corresponding charmap).
+ *
+ * @return:
+ * Glyph index. 0~means `no glyph'.
+ *
+ */
+ FT_EXPORT( FT_UInt )
+ FTC_CMapCache_Lookup( FTC_CMapCache cache,
+ FTC_FaceID face_id,
+ FT_Int cmap_index,
+ FT_UInt32 char_code );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** IMAGE CACHE OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FTC_ImageTypeRec
+ *
+ * @description:
+ * A structure used to model the type of images in a glyph cache.
+ *
+ * @fields:
+ * face_id ::
+ * The face ID.
+ *
+ * width ::
+ * The width in pixels.
+ *
+ * height ::
+ * The height in pixels.
+ *
+ * flags ::
+ * The load flags, as in @FT_Load_Glyph.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_
+ {
+ FTC_FaceID face_id;
+ FT_Int width;
+ FT_Int height;
+ FT_Int32 flags;
+
+ } FTC_ImageTypeRec;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_ImageType
+ *
+ * @description:
+ * A handle to an @FTC_ImageTypeRec structure.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_* FTC_ImageType;
+
+
+ /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \
+ ( (d1)->face_id == (d2)->face_id && \
+ (d1)->width == (d2)->width && \
+ (d1)->flags == (d2)->flags )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_ImageCache */
+ /* */
+ /* <Description> */
+ /* A handle to a glyph image cache object. They are designed to */
+ /* hold many distinct glyph images while not exceeding a certain */
+ /* memory threshold. */
+ /* */
+ typedef struct FTC_ImageCacheRec_* FTC_ImageCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new glyph image cache. */
+ /* */
+ /* <Input> */
+ /* manager :: The parent manager for the image cache. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new glyph image cache object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_New( FTC_Manager manager,
+ FTC_ImageCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Retrieve a given glyph image from a glyph image cache. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* type :: A pointer to a glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_Lookup( FTC_ImageCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* scaler :: A pointer to a scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ /* Calls to @FT_Set_Char_Size and friends have no effect on cached */
+ /* glyphs; you should always use the FreeType cache API instead. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_LookupScaler( FTC_ImageCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBit */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */
+ /* structure for details. */
+ /* */
+ typedef struct FTC_SBitRec_* FTC_SBit;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_SBitRec */
+ /* */
+ /* <Description> */
+ /* A very compact structure used to describe a small glyph bitmap. */
+ /* */
+ /* <Fields> */
+ /* width :: The bitmap width in pixels. */
+ /* */
+ /* height :: The bitmap height in pixels. */
+ /* */
+ /* left :: The horizontal distance from the pen position to the */
+ /* left bitmap border (a.k.a. `left side bearing', or */
+ /* `lsb'). */
+ /* */
+ /* top :: The vertical distance from the pen position (on the */
+ /* baseline) to the upper bitmap border (a.k.a. `top */
+ /* side bearing'). The distance is positive for upwards */
+ /* y~coordinates. */
+ /* */
+ /* format :: The format of the glyph bitmap (monochrome or gray). */
+ /* */
+ /* max_grays :: Maximum gray level value (in the range 1 to~255). */
+ /* */
+ /* pitch :: The number of bytes per bitmap line. May be positive */
+ /* or negative. */
+ /* */
+ /* xadvance :: The horizontal advance width in pixels. */
+ /* */
+ /* yadvance :: The vertical advance height in pixels. */
+ /* */
+ /* buffer :: A pointer to the bitmap pixels. */
+ /* */
+ typedef struct FTC_SBitRec_
+ {
+ FT_Byte width;
+ FT_Byte height;
+ FT_Char left;
+ FT_Char top;
+
+ FT_Byte format;
+ FT_Byte max_grays;
+ FT_Short pitch;
+ FT_Char xadvance;
+ FT_Char yadvance;
+
+ FT_Byte* buffer;
+
+ } FTC_SBitRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBitCache */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap cache. These are special cache objects */
+ /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */
+ /* much more efficient way than the traditional glyph image cache */
+ /* implemented by @FTC_ImageCache. */
+ /* */
+ typedef struct FTC_SBitCacheRec_* FTC_SBitCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache to store small glyph bitmaps. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the source cache manager. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new sbit cache. NULL in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_New( FTC_Manager manager,
+ FTC_SBitCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Look up a given small glyph bitmap in a given sbit cache and */
+ /* `lock' it to prevent its flushing from the cache until needed. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* type :: A pointer to the glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_Lookup( FTC_SBitCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* scaler :: A pointer to the scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_LookupScaler( FTC_SBitCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftcffdrv.h b/core/include/thirdparties/freetype/freetype/ftcffdrv.h
new file mode 100644
index 0000000000..3a377950d9
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcffdrv.h
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/* */
+/* ftcffdrv.h */
+/* */
+/* FreeType API for controlling the CFF driver (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCFFDRV_H__
+#define __FTCFFDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * cff_driver
+ *
+ * @title:
+ * The CFF driver
+ *
+ * @abstract:
+ * Controlling the CFF driver module.
+ *
+ * @description:
+ * While FreeType's CFF driver doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The CFF driver's module name is `cff'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * hinting-engine
+ *
+ * @description:
+ * Thanks to Adobe, which contributed a new hinting (and parsing)
+ * engine, an application can select between `freetype' and `adobe' if
+ * compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration
+ * macro isn't defined, `hinting-engine' does nothing.
+ *
+ * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
+ * defined, and `adobe' otherwise.
+ *
+ * The following example code demonstrates how to select Adobe's hinting
+ * engine (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt hinting_engine = FT_CFF_HINTING_ADOBE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "hinting-engine", &hinting_engine );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_CFF_HINTING_XXX
+ *
+ * @description:
+ * A list of constants used for the @hinting-engine property to select
+ * the hinting engine for CFF fonts.
+ *
+ * @values:
+ * FT_CFF_HINTING_FREETYPE ::
+ * Use the old FreeType hinting engine.
+ *
+ * FT_CFF_HINTING_ADOBE ::
+ * Use the hinting engine contributed by Adobe.
+ *
+ */
+#define FT_CFF_HINTING_FREETYPE 0
+#define FT_CFF_HINTING_ADOBE 1
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * no-stem-darkening
+ *
+ * @description:
+ * By default, the Adobe CFF engine darkens stems at smaller sizes,
+ * regardless of hinting, to enhance contrast. Setting this property,
+ * stem darkening gets switched off.
+ *
+ * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Bool no_stem_darkening = TRUE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "no-stem-darkening", &no_stem_darkening );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCFFDRV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftchapters.h b/core/include/thirdparties/freetype/freetype/ftchapters.h
new file mode 100644
index 0000000000..c55670d1d2
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftchapters.h
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/* */
+/* This file defines the structure of the FreeType reference. */
+/* It is used by the python script which generates the HTML files. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* general_remarks */
+/* */
+/* <Title> */
+/* General Remarks */
+/* */
+/* <Sections> */
+/* user_allocation */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* core_api */
+/* */
+/* <Title> */
+/* Core API */
+/* */
+/* <Sections> */
+/* version */
+/* basic_types */
+/* base_interface */
+/* glyph_variants */
+/* glyph_management */
+/* mac_specific */
+/* sizes_management */
+/* header_file_macros */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* format_specific */
+/* */
+/* <Title> */
+/* Format-Specific API */
+/* */
+/* <Sections> */
+/* multiple_masters */
+/* truetype_tables */
+/* type1_tables */
+/* sfnt_names */
+/* bdf_fonts */
+/* cid_fonts */
+/* pfr_fonts */
+/* winfnt_fonts */
+/* font_formats */
+/* gasp_table */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* module_specific */
+/* */
+/* <Title> */
+/* Controlling FreeType Modules */
+/* */
+/* <Sections> */
+/* auto_hinter */
+/* cff_driver */
+/* tt_driver */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* cache_subsystem */
+/* */
+/* <Title> */
+/* Cache Sub-System */
+/* */
+/* <Sections> */
+/* cache_subsystem */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* support_api */
+/* */
+/* <Title> */
+/* Support API */
+/* */
+/* <Sections> */
+/* computations */
+/* list_processing */
+/* outline_processing */
+/* quick_advance */
+/* bitmap_handling */
+/* raster */
+/* glyph_stroker */
+/* system_interface */
+/* module_management */
+/* gzip */
+/* lzw */
+/* bzip2 */
+/* lcd_filtering */
+/* */
+/***************************************************************************/
diff --git a/core/include/thirdparties/freetype/freetype/ftcid.h b/core/include/thirdparties/freetype/freetype/ftcid.h
new file mode 100644
index 0000000000..f59597574b
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftcid.h
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/* */
+/* ftcid.h */
+/* */
+/* FreeType API for accessing CID font information (specification). */
+/* */
+/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cid_fonts */
+ /* */
+ /* <Title> */
+ /* CID Fonts */
+ /* */
+ /* <Abstract> */
+ /* CID-keyed font specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of CID-keyed font specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Registry_Ordering_Supplement
+ *
+ * @description:
+ * Retrieve the Registry/Ordering/Supplement triple (also known as the
+ * "R/O/S") from a CID-keyed font.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * registry ::
+ * The registry, as a C~string, owned by the face.
+ *
+ * ordering ::
+ * The ordering, as a C~string, owned by the face.
+ *
+ * supplement ::
+ * The supplement.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces, returning an error
+ * otherwise.
+ *
+ * @since:
+ * 2.3.6
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Registry_Ordering_Supplement( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement);
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Is_Internally_CID_Keyed
+ *
+ * @description:
+ * Retrieve the type of the input face, CID keyed or not. In
+ * constrast to the @FT_IS_CID_KEYED macro this function returns
+ * successfully also for CID-keyed fonts in an SNFT wrapper.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * is_cid ::
+ * The type of the face as an @FT_Bool.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face,
+ FT_Bool *is_cid );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_From_Glyph_Index
+ *
+ * @description:
+ * Retrieve the CID of the input glyph index.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * glyph_index ::
+ * The input glyph index.
+ *
+ * @output:
+ * cid ::
+ * The CID as an @FT_UInt.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_From_Glyph_Index( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fterrdef.h b/core/include/thirdparties/freetype/freetype/fterrdef.h
new file mode 100644
index 0000000000..76c7b9e36f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fterrdef.h
@@ -0,0 +1,249 @@
+/***************************************************************************/
+/* */
+/* fterrdef.h */
+/* */
+/* FreeType error codes (specification). */
+/* */
+/* Copyright 2002, 2004, 2006, 2007, 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST OF ERROR CODES/MESSAGES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+ /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+ /* including this file. */
+
+
+ /* generic errors */
+
+ FT_NOERRORDEF_( Ok, 0x00, \
+ "no error" )
+
+ FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \
+ "cannot open resource" )
+ FT_ERRORDEF_( Unknown_File_Format, 0x02, \
+ "unknown file format" )
+ FT_ERRORDEF_( Invalid_File_Format, 0x03, \
+ "broken file" )
+ FT_ERRORDEF_( Invalid_Version, 0x04, \
+ "invalid FreeType version" )
+ FT_ERRORDEF_( Lower_Module_Version, 0x05, \
+ "module version is too low" )
+ FT_ERRORDEF_( Invalid_Argument, 0x06, \
+ "invalid argument" )
+ FT_ERRORDEF_( Unimplemented_Feature, 0x07, \
+ "unimplemented feature" )
+ FT_ERRORDEF_( Invalid_Table, 0x08, \
+ "broken table" )
+ FT_ERRORDEF_( Invalid_Offset, 0x09, \
+ "broken offset within table" )
+ FT_ERRORDEF_( Array_Too_Large, 0x0A, \
+ "array allocation size too large" )
+ FT_ERRORDEF_( Missing_Module, 0x0B, \
+ "missing module" )
+ FT_ERRORDEF_( Missing_Property, 0x0C, \
+ "missing property" )
+
+ /* glyph/character errors */
+
+ FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \
+ "invalid glyph index" )
+ FT_ERRORDEF_( Invalid_Character_Code, 0x11, \
+ "invalid character code" )
+ FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \
+ "unsupported glyph image format" )
+ FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \
+ "cannot render this glyph format" )
+ FT_ERRORDEF_( Invalid_Outline, 0x14, \
+ "invalid outline" )
+ FT_ERRORDEF_( Invalid_Composite, 0x15, \
+ "invalid composite glyph" )
+ FT_ERRORDEF_( Too_Many_Hints, 0x16, \
+ "too many hints" )
+ FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \
+ "invalid pixel size" )
+
+ /* handle errors */
+
+ FT_ERRORDEF_( Invalid_Handle, 0x20, \
+ "invalid object handle" )
+ FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \
+ "invalid library handle" )
+ FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \
+ "invalid module handle" )
+ FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \
+ "invalid face handle" )
+ FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \
+ "invalid size handle" )
+ FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \
+ "invalid glyph slot handle" )
+ FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \
+ "invalid charmap handle" )
+ FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \
+ "invalid cache manager handle" )
+ FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \
+ "invalid stream handle" )
+
+ /* driver errors */
+
+ FT_ERRORDEF_( Too_Many_Drivers, 0x30, \
+ "too many modules" )
+ FT_ERRORDEF_( Too_Many_Extensions, 0x31, \
+ "too many extensions" )
+
+ /* memory errors */
+
+ FT_ERRORDEF_( Out_Of_Memory, 0x40, \
+ "out of memory" )
+ FT_ERRORDEF_( Unlisted_Object, 0x41, \
+ "unlisted object" )
+
+ /* stream errors */
+
+ FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \
+ "cannot open stream" )
+ FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \
+ "invalid stream seek" )
+ FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \
+ "invalid stream skip" )
+ FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \
+ "invalid stream read" )
+ FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \
+ "invalid stream operation" )
+ FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \
+ "invalid frame operation" )
+ FT_ERRORDEF_( Nested_Frame_Access, 0x57, \
+ "nested frame access" )
+ FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \
+ "invalid frame read" )
+
+ /* raster errors */
+
+ FT_ERRORDEF_( Raster_Uninitialized, 0x60, \
+ "raster uninitialized" )
+ FT_ERRORDEF_( Raster_Corrupted, 0x61, \
+ "raster corrupted" )
+ FT_ERRORDEF_( Raster_Overflow, 0x62, \
+ "raster overflow" )
+ FT_ERRORDEF_( Raster_Negative_Height, 0x63, \
+ "negative height while rastering" )
+
+ /* cache errors */
+
+ FT_ERRORDEF_( Too_Many_Caches, 0x70, \
+ "too many registered caches" )
+
+ /* TrueType and SFNT errors */
+
+ FT_ERRORDEF_( Invalid_Opcode, 0x80, \
+ "invalid opcode" )
+ FT_ERRORDEF_( Too_Few_Arguments, 0x81, \
+ "too few arguments" )
+ FT_ERRORDEF_( Stack_Overflow, 0x82, \
+ "stack overflow" )
+ FT_ERRORDEF_( Code_Overflow, 0x83, \
+ "code overflow" )
+ FT_ERRORDEF_( Bad_Argument, 0x84, \
+ "bad argument" )
+ FT_ERRORDEF_( Divide_By_Zero, 0x85, \
+ "division by zero" )
+ FT_ERRORDEF_( Invalid_Reference, 0x86, \
+ "invalid reference" )
+ FT_ERRORDEF_( Debug_OpCode, 0x87, \
+ "found debug opcode" )
+ FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \
+ "found ENDF opcode in execution stream" )
+ FT_ERRORDEF_( Nested_DEFS, 0x89, \
+ "nested DEFS" )
+ FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \
+ "invalid code range" )
+ FT_ERRORDEF_( Execution_Too_Long, 0x8B, \
+ "execution context too long" )
+ FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \
+ "too many function definitions" )
+ FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \
+ "too many instruction definitions" )
+ FT_ERRORDEF_( Table_Missing, 0x8E, \
+ "SFNT font table missing" )
+ FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \
+ "horizontal header (hhea) table missing" )
+ FT_ERRORDEF_( Locations_Missing, 0x90, \
+ "locations (loca) table missing" )
+ FT_ERRORDEF_( Name_Table_Missing, 0x91, \
+ "name table missing" )
+ FT_ERRORDEF_( CMap_Table_Missing, 0x92, \
+ "character map (cmap) table missing" )
+ FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \
+ "horizontal metrics (hmtx) table missing" )
+ FT_ERRORDEF_( Post_Table_Missing, 0x94, \
+ "PostScript (post) table missing" )
+ FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \
+ "invalid horizontal metrics" )
+ FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \
+ "invalid character map (cmap) format" )
+ FT_ERRORDEF_( Invalid_PPem, 0x97, \
+ "invalid ppem value" )
+ FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \
+ "invalid vertical metrics" )
+ FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \
+ "could not find context" )
+ FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \
+ "invalid PostScript (post) table format" )
+ FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \
+ "invalid PostScript (post) table" )
+
+ /* CFF, CID, and Type 1 errors */
+
+ FT_ERRORDEF_( Syntax_Error, 0xA0, \
+ "opcode syntax error" )
+ FT_ERRORDEF_( Stack_Underflow, 0xA1, \
+ "argument stack underflow" )
+ FT_ERRORDEF_( Ignore, 0xA2, \
+ "ignore" )
+ FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \
+ "no Unicode glyph name found" )
+ FT_ERRORDEF_( Glyph_Too_Big, 0xA4, \
+ "glyph to big for hinting" )
+
+ /* BDF errors */
+
+ FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \
+ "`STARTFONT' field missing" )
+ FT_ERRORDEF_( Missing_Font_Field, 0xB1, \
+ "`FONT' field missing" )
+ FT_ERRORDEF_( Missing_Size_Field, 0xB2, \
+ "`SIZE' field missing" )
+ FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \
+ "`FONTBOUNDINGBOX' field missing" )
+ FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \
+ "`CHARS' field missing" )
+ FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \
+ "`STARTCHAR' field missing" )
+ FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \
+ "`ENCODING' field missing" )
+ FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \
+ "`BBX' field missing" )
+ FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \
+ "`BBX' too big" )
+ FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \
+ "Font header corrupted or missing fields" )
+ FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \
+ "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fterrors.h b/core/include/thirdparties/freetype/freetype/fterrors.h
new file mode 100644
index 0000000000..bd69d0f5e1
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fterrors.h
@@ -0,0 +1,198 @@
+/***************************************************************************/
+/* */
+/* fterrors.h */
+/* */
+/* FreeType error code handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This special header file is used to define the handling of FT2 */
+ /* enumeration constants. It can also be used to generate error message */
+ /* strings with a small macro trick explained below. */
+ /* */
+ /* I - Error Formats */
+ /* ----------------- */
+ /* */
+ /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */
+ /* defined in ftoption.h in order to make the higher byte indicate */
+ /* the module where the error has happened (this is not compatible */
+ /* with standard builds of FreeType 2). See the file `ftmoderr.h' for */
+ /* more details. */
+ /* */
+ /* */
+ /* II - Error Message strings */
+ /* -------------------------- */
+ /* */
+ /* The error definitions below are made through special macros that */
+ /* allow client applications to build a table of error message strings */
+ /* if they need it. The strings are not included in a normal build of */
+ /* FreeType 2 to save space (most client applications do not use */
+ /* them). */
+ /* */
+ /* To do so, you have to define the following macros before including */
+ /* this file: */
+ /* */
+ /* FT_ERROR_START_LIST :: */
+ /* This macro is called before anything else to define the start of */
+ /* the error list. It is followed by several FT_ERROR_DEF calls */
+ /* (see below). */
+ /* */
+ /* FT_ERROR_DEF( e, v, s ) :: */
+ /* This macro is called to define one single error. */
+ /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */
+ /* `v' is the error numerical value. */
+ /* `s' is the corresponding error string. */
+ /* */
+ /* FT_ERROR_END_LIST :: */
+ /* This macro ends the list. */
+ /* */
+ /* Additionally, you have to undefine __FTERRORS_H__ before #including */
+ /* this file. */
+ /* */
+ /* Here is a simple example: */
+ /* */
+ /* { */
+ /* #undef __FTERRORS_H__ */
+ /* #define FT_ERRORDEF( e, v, s ) { e, s }, */
+ /* #define FT_ERROR_START_LIST { */
+ /* #define FT_ERROR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int err_code; */
+ /* const char* err_msg; */
+ /* } ft_errors[] = */
+ /* */
+ /* #include "fterrors.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+ /* include module base error codes */
+#include "ftmoderr.h"
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+
+ /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+ /* By default, we use `FT_Err_'. */
+ /* */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX FT_Err_
+#endif
+
+
+ /* FT_ERR_BASE is used as the base for module-specific errors. */
+ /* */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE 0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+ /* If FT_ERRORDEF is not defined, we need to define a simple */
+ /* enumeration type. */
+ /* */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s ) e = v,
+#define FT_ERROR_START_LIST enum {
+#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+ /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+ /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+ FT_ERROR_START_LIST
+#endif
+
+
+ /* now include the error codes */
+#include "fterrdef.h"
+
+
+#ifdef FT_ERROR_END_LIST
+ FT_ERROR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SIMPLE CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+ /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftgasp.h b/core/include/thirdparties/freetype/freetype/ftgasp.h
new file mode 100644
index 0000000000..ff0a34acc6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgasp.h
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/* */
+/* ftgasp.h */
+/* */
+/* Access of TrueType's `gasp' table (specification). */
+/* */
+/* Copyright 2007, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+ /***************************************************************************
+ *
+ * @section:
+ * gasp_table
+ *
+ * @title:
+ * Gasp Table
+ *
+ * @abstract:
+ * Retrieving TrueType `gasp' table entries.
+ *
+ * @description:
+ * The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+ * font for specific entries in its `gasp' table, if any. This is
+ * mainly useful when implementing native TrueType hinting with the
+ * bytecode interpreter to duplicate the Windows text rendering results.
+ */
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_GASP_XXX
+ *
+ * @description:
+ * A list of values and/or bit-flags returned by the @FT_Get_Gasp
+ * function.
+ *
+ * @values:
+ * FT_GASP_NO_TABLE ::
+ * This special value means that there is no GASP table in this face.
+ * It is up to the client to decide what to do.
+ *
+ * FT_GASP_DO_GRIDFIT ::
+ * Grid-fitting and hinting should be performed at the specified ppem.
+ * This *really* means TrueType bytecode interpretation. If this bit
+ * is not set, no hinting gets applied.
+ *
+ * FT_GASP_DO_GRAY ::
+ * Anti-aliased rendering should be performed at the specified ppem.
+ * If not set, do monochrome rendering.
+ *
+ * FT_GASP_SYMMETRIC_SMOOTHING ::
+ * If set, smoothing along multiple axes must be used with ClearType.
+ *
+ * FT_GASP_SYMMETRIC_GRIDFIT ::
+ * Grid-fitting must be used with ClearType's symmetric smoothing.
+ *
+ * @note:
+ * The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+ * used for standard font rasterization only. Independently of that,
+ * `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+ * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+ * `FT_GASP_DO_GRAY' are consequently ignored).
+ *
+ * `ClearType' is Microsoft's implementation of LCD rendering, partly
+ * protected by patents.
+ *
+ * @since:
+ * 2.3.0
+ */
+#define FT_GASP_NO_TABLE -1
+#define FT_GASP_DO_GRIDFIT 0x01
+#define FT_GASP_DO_GRAY 0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING 0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT 0x10
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_Gasp
+ *
+ * @description:
+ * Read the `gasp' table from a TrueType or OpenType font file and
+ * return the entry corresponding to a given character pixel size.
+ *
+ * @input:
+ * face :: The source face handle.
+ * ppem :: The vertical character pixel size.
+ *
+ * @return:
+ * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+ * `gasp' table in the face.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Gasp( FT_Face face,
+ FT_UInt ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftglyph.h b/core/include/thirdparties/freetype/freetype/ftglyph.h
new file mode 100644
index 0000000000..ec2d9d89c1
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftglyph.h
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/* */
+/* ftglyph.h */
+/* */
+/* FreeType convenience functions to handle glyphs (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of several convenience functions */
+ /* that can be used by client applications to easily retrieve glyph */
+ /* bitmaps and outlines from a given face. */
+ /* */
+ /* These functions should be optional if you are writing a font server */
+ /* or text layout engine on top of FreeType. However, they are pretty */
+ /* handy for many other simple uses of the library. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_management */
+ /* */
+ /* <Title> */
+ /* Glyph Management */
+ /* */
+ /* <Abstract> */
+ /* Generic interface to manage individual glyph data. */
+ /* */
+ /* <Description> */
+ /* This section contains definitions used to manage glyph data */
+ /* through generic FT_Glyph objects. Each of them can contain a */
+ /* bitmap, a vector outline, or even images in other formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* forward declaration to a private type */
+ typedef struct FT_Glyph_Class_ FT_Glyph_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Glyph */
+ /* */
+ /* <Description> */
+ /* Handle to an object used to model generic glyph images. It is a */
+ /* pointer to the @FT_GlyphRec structure and can contain a glyph */
+ /* bitmap or pointer. */
+ /* */
+ /* <Note> */
+ /* Glyph objects are not owned by the library. You must thus release */
+ /* them manually (through @FT_Done_Glyph) _before_ calling */
+ /* @FT_Done_FreeType. */
+ /* */
+ typedef struct FT_GlyphRec_* FT_Glyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphRec */
+ /* */
+ /* <Description> */
+ /* The root glyph structure contains a given glyph image plus its */
+ /* advance width in 16.16 fixed-point format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library object. */
+ /* */
+ /* clazz :: A pointer to the glyph's class. Private. */
+ /* */
+ /* format :: The format of the glyph's image. */
+ /* */
+ /* advance :: A 16.16 vector that gives the glyph's advance width. */
+ /* */
+ typedef struct FT_GlyphRec_
+ {
+ FT_Library library;
+ const FT_Glyph_Class* clazz;
+ FT_Glyph_Format format;
+ FT_Vector advance;
+
+ } FT_GlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_BitmapGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a bitmap glyph image. This is */
+ /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BitmapGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for bitmap glyph images. This really is a */
+ /* `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* left :: The left-side bearing, i.e., the horizontal distance */
+ /* from the current pen position to the left border of the */
+ /* glyph bitmap. */
+ /* */
+ /* top :: The top-side bearing, i.e., the vertical distance from */
+ /* the current pen position to the top border of the glyph */
+ /* bitmap. This distance is positive for upwards~y! */
+ /* */
+ /* bitmap :: A descriptor for the bitmap. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */
+ /* the bitmap's contents easily. */
+ /* */
+ /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */
+ /* and is thus created and destroyed with it. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Int left;
+ FT_Int top;
+ FT_Bitmap bitmap;
+
+ } FT_BitmapGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_OutlineGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model an outline glyph image. This */
+ /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_OutlineGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for outline (vectorial) glyph images. This */
+ /* really is a `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* outline :: A descriptor for the outline. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */
+ /* the outline's content easily. */
+ /* */
+ /* As the outline is extracted from a glyph slot, its coordinates are */
+ /* expressed normally in 26.6 pixels, unless the flag */
+ /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+ /* */
+ /* The outline's tables are always owned by the object and are */
+ /* destroyed with it. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Outline outline;
+
+ } FT_OutlineGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to extract a glyph image from a slot. Note that */
+ /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the source glyph slot. */
+ /* */
+ /* <Output> */
+ /* aglyph :: A handle to the glyph object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph( FT_GlyphSlot slot,
+ FT_Glyph *aglyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Copy */
+ /* */
+ /* <Description> */
+ /* A function used to copy a glyph image. Note that the created */
+ /* @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source glyph object. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target glyph object. 0~in case of */
+ /* error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Copy( FT_Glyph source,
+ FT_Glyph *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a glyph image if its format is scalable. */
+ /* */
+ /* <InOut> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to a 2x2 matrix to apply. */
+ /* */
+ /* delta :: A pointer to a 2d vector to apply. Coordinates are */
+ /* expressed in 1/64th of a pixel. */
+ /* */
+ /* <Return> */
+ /* FreeType error code (if not 0, the glyph format is not scalable). */
+ /* */
+ /* <Note> */
+ /* The 2x2 transformation matrix is also applied to the glyph's */
+ /* advance vector. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Transform( FT_Glyph glyph,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_BBox_Mode */
+ /* */
+ /* <Description> */
+ /* The mode how the values of @FT_Glyph_Get_CBox are returned. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_BBOX_UNSCALED :: */
+ /* Return unscaled font units. */
+ /* */
+ /* FT_GLYPH_BBOX_SUBPIXELS :: */
+ /* Return unfitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_GRIDFIT :: */
+ /* Return grid-fitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_TRUNCATE :: */
+ /* Return coordinates in integer pixels. */
+ /* */
+ /* FT_GLYPH_BBOX_PIXELS :: */
+ /* Return grid-fitted pixel coordinates. */
+ /* */
+ typedef enum FT_Glyph_BBox_Mode_
+ {
+ FT_GLYPH_BBOX_UNSCALED = 0,
+ FT_GLYPH_BBOX_SUBPIXELS = 0,
+ FT_GLYPH_BBOX_GRIDFIT = 1,
+ FT_GLYPH_BBOX_TRUNCATE = 2,
+ FT_GLYPH_BBOX_PIXELS = 3
+
+ } FT_Glyph_BBox_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_bbox_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Glyph_BBox_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */
+ /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */
+ /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */
+ /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */
+ /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return a glyph's `control box'. The control box encloses all the */
+ /* outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the source glyph object. */
+ /* */
+ /* mode :: The mode which indicates how to interpret the returned */
+ /* bounding box values. */
+ /* */
+ /* <Output> */
+ /* acbox :: The glyph coordinate bounding box. Coordinates are */
+ /* expressed in 1/64th of pixels if it is grid-fitted. */
+ /* */
+ /* <Note> */
+ /* Coordinates are relative to the glyph origin, using the y~upwards */
+ /* convention. */
+ /* */
+ /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */
+ /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */
+ /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */
+ /* is another name for this constant. */
+ /* */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get */
+ /* reasonable values for the CBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the CBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ /* Note that the maximum coordinates are exclusive, which means that */
+ /* one can compute the width and height of the glyph image (be it in */
+ /* integer or 26.6 pixels) as: */
+ /* */
+ /* { */
+ /* width = bbox.xMax - bbox.xMin; */
+ /* height = bbox.yMax - bbox.yMin; */
+ /* } */
+ /* */
+ /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */
+ /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */
+ /* which corresponds to: */
+ /* */
+ /* { */
+ /* bbox.xMin = FLOOR(bbox.xMin); */
+ /* bbox.yMin = FLOOR(bbox.yMin); */
+ /* bbox.xMax = CEILING(bbox.xMax); */
+ /* bbox.yMax = CEILING(bbox.yMax); */
+ /* } */
+ /* */
+ /* To get the bbox in pixel coordinates, set `bbox_mode' to */
+ /* @FT_GLYPH_BBOX_TRUNCATE. */
+ /* */
+ /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */
+ /* to @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+ FT_EXPORT( void )
+ FT_Glyph_Get_CBox( FT_Glyph glyph,
+ FT_UInt bbox_mode,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_To_Bitmap */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph object to a bitmap glyph object. */
+ /* */
+ /* <InOut> */
+ /* the_glyph :: A pointer to a handle to the target glyph. */
+ /* */
+ /* <Input> */
+ /* render_mode :: An enumeration that describes how the data is */
+ /* rendered. */
+ /* */
+ /* origin :: A pointer to a vector used to translate the glyph */
+ /* image before rendering. Can be~0 (if no */
+ /* translation). The origin is expressed in */
+ /* 26.6 pixels. */
+ /* */
+ /* destroy :: A boolean that indicates that the original glyph */
+ /* image should be destroyed by this function. It is */
+ /* never destroyed in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does nothing if the glyph format isn't scalable. */
+ /* */
+ /* The glyph image is translated with the `origin' vector before */
+ /* rendering. */
+ /* */
+ /* The first parameter is a pointer to an @FT_Glyph handle, that will */
+ /* be _replaced_ by this function (with newly allocated data). */
+ /* Typically, you would use (omitting error handling): */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyph; */
+ /* FT_BitmapGlyph glyph_bitmap; */
+ /* */
+ /* */
+ /* // load glyph */
+ /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */
+ /* */
+ /* // extract glyph image */
+ /* error = FT_Get_Glyph( face->glyph, &glyph ); */
+ /* */
+ /* // convert to a bitmap (default render mode + destroying old) */
+ /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */
+ /* { */
+ /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */
+ /* 0, 1 ); */
+ /* if ( error ) // `glyph' unchanged */
+ /* ... */
+ /* } */
+ /* */
+ /* // access bitmap content by typecasting */
+ /* glyph_bitmap = (FT_BitmapGlyph)glyph; */
+ /* */
+ /* // do funny stuff with it, like blitting/drawing */
+ /* ... */
+ /* */
+ /* // discard glyph image (bitmap or not) */
+ /* FT_Done_Glyph( glyph ); */
+ /* } */
+ /* */
+ /* */
+ /* Here another example, again without error handling: */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyphs[MAX_GLYPHS] */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */
+ /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* { */
+ /* FT_Glyph bitmap = glyphs[idx]; */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* // after this call, `bitmap' no longer points into */
+ /* // the `glyphs' array (and the old value isn't destroyed) */
+ /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */
+ /* */
+ /* ... */
+ /* */
+ /* FT_Done_Glyph( bitmap ); */
+ /* } */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* FT_Done_Glyph( glyphs[idx] ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_To_Bitmap( FT_Glyph* the_glyph,
+ FT_Render_Mode render_mode,
+ FT_Vector* origin,
+ FT_Bool destroy );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Glyph */
+ /* */
+ /* <Description> */
+ /* Destroy a given glyph. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Done_Glyph( FT_Glyph glyph );
+
+ /* */
+
+
+ /* other helpful functions */
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Multiply */
+ /* */
+ /* <Description> */
+ /* Perform the matrix operation `b = a*b'. */
+ /* */
+ /* <Input> */
+ /* a :: A pointer to matrix `a'. */
+ /* */
+ /* <InOut> */
+ /* b :: A pointer to matrix `b'. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `a' or `b' is zero. */
+ /* */
+ FT_EXPORT( void )
+ FT_Matrix_Multiply( const FT_Matrix* a,
+ FT_Matrix* b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Invert */
+ /* */
+ /* <Description> */
+ /* Invert a 2x2 matrix. Return an error if it can't be inverted. */
+ /* */
+ /* <InOut> */
+ /* matrix :: A pointer to the target matrix. Remains untouched in */
+ /* case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Matrix_Invert( FT_Matrix* matrix );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftgxval.h b/core/include/thirdparties/freetype/freetype/ftgxval.h
new file mode 100644
index 0000000000..763652a012
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgxval.h
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/* */
+/* ftgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006 by */
+/* Masatake YAMATO, Redhat K.K, */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gx_validation */
+ /* */
+ /* <Title> */
+ /* TrueTypeGX/AAT Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate TrueTypeGX/AAT tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */
+ /* trak, prop, lcar). */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* */
+ /* Warning: Use FT_VALIDATE_XXX to validate a table. */
+ /* Following definitions are for gxvalid developers. */
+ /* */
+ /* */
+ /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX 0
+#define FT_VALIDATE_mort_INDEX 1
+#define FT_VALIDATE_morx_INDEX 2
+#define FT_VALIDATE_bsln_INDEX 3
+#define FT_VALIDATE_just_INDEX 4
+#define FT_VALIDATE_kern_INDEX 5
+#define FT_VALIDATE_opbd_INDEX 6
+#define FT_VALIDATE_trak_INDEX 7
+#define FT_VALIDATE_prop_INDEX 8
+#define FT_VALIDATE_lcar_INDEX 9
+#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_VALIDATE_GX_LENGTH
+ *
+ * @description:
+ * The number of tables checked in this module. Use it as a parameter
+ * for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+ */
+#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+ /* */
+
+ /* Up to 0x1000 is used by otvalid.
+ Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag ) \
+ ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_GXXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+ * indicate which TrueTypeGX/AAT Type tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_feat ::
+ * Validate `feat' table.
+ *
+ * FT_VALIDATE_mort ::
+ * Validate `mort' table.
+ *
+ * FT_VALIDATE_morx ::
+ * Validate `morx' table.
+ *
+ * FT_VALIDATE_bsln ::
+ * Validate `bsln' table.
+ *
+ * FT_VALIDATE_just ::
+ * Validate `just' table.
+ *
+ * FT_VALIDATE_kern ::
+ * Validate `kern' table.
+ *
+ * FT_VALIDATE_opbd ::
+ * Validate `opbd' table.
+ *
+ * FT_VALIDATE_trak ::
+ * Validate `trak' table.
+ *
+ * FT_VALIDATE_prop ::
+ * Validate `prop' table.
+ *
+ * FT_VALIDATE_lcar ::
+ * Validate `lcar' table.
+ *
+ * FT_VALIDATE_GX ::
+ * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+ * opbd, trak, prop and lcar).
+ *
+ */
+
+#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \
+ FT_VALIDATE_mort | \
+ FT_VALIDATE_morx | \
+ FT_VALIDATE_bsln | \
+ FT_VALIDATE_just | \
+ FT_VALIDATE_kern | \
+ FT_VALIDATE_opbd | \
+ FT_VALIDATE_trak | \
+ FT_VALIDATE_prop | \
+ FT_VALIDATE_lcar )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Validate
+ *
+ * @description:
+ * Validate various TrueTypeGX tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_GXXXX for possible values.
+ *
+ * table_length ::
+ * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH
+ * should be passed.
+ *
+ * @output:
+ * tables ::
+ * The array where all validated sfnt tables are stored.
+ * The array itself must be allocated by a client.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with TrueTypeGX fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the buffers pointed to by
+ * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value
+ * indicates that the table either doesn't exist in the font, the
+ * application hasn't asked for validation, or the validator doesn't have
+ * the ability to validate the sfnt table.
+ */
+ FT_EXPORT( FT_Error )
+ FT_TrueTypeGX_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Free
+ *
+ * @description:
+ * Free the buffer allocated by TrueTypeGX validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer allocated by
+ * @FT_TrueTypeGX_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_TrueTypeGX_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_TrueTypeGX_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_CKERNXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_ClassicKern_Validate
+ * to indicate the classic kern dialect or dialects. If the selected
+ * type doesn't fit, @FT_ClassicKern_Validate regards the table as
+ * invalid.
+ *
+ * @values:
+ * FT_VALIDATE_MS ::
+ * Handle the `kern' table as a classic Microsoft kern table.
+ *
+ * FT_VALIDATE_APPLE ::
+ * Handle the `kern' table as a classic Apple kern table.
+ *
+ * FT_VALIDATE_CKERN ::
+ * Handle the `kern' as either classic Apple or Microsoft kern table.
+ */
+#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Validate
+ *
+ * @description:
+ * Validate classic (16-bit format) kern table to assure that the offsets
+ * and indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without error
+ * checking (which can be quite time consuming).
+ *
+ * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+ * the new 32-bit format and the classic 16-bit format, while
+ * FT_ClassicKern_Validate only supports the classic 16-bit format.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the dialect to be validated. See
+ * @FT_VALIDATE_CKERNXXX for possible values.
+ *
+ * @output:
+ * ckern_table ::
+ * A pointer to the kern table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * After use, the application should deallocate the buffers pointed to by
+ * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value
+ * indicates that the table doesn't exist in the font.
+ */
+ FT_EXPORT( FT_Error )
+ FT_ClassicKern_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *ckern_table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Free
+ *
+ * @description:
+ * Free the buffer allocated by classic Kern validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_ClassicKern_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_ClassicKern_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_ClassicKern_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftgzip.h b/core/include/thirdparties/freetype/freetype/ftgzip.h
new file mode 100644
index 0000000000..87155a41bf
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftgzip.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftgzip.h */
+/* */
+/* Gzip-compressed stream support. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gzip */
+ /* */
+ /* <Title> */
+ /* GZIP Streams */
+ /* */
+ /* <Abstract> */
+ /* Using gzip-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Gzip-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenGzip
+ *
+ * @description:
+ * Open a new stream to parse gzip-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.gz' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, gzip compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a gzipped stream from
+ * it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with zlib support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenGzip( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftimage.h b/core/include/thirdparties/freetype/freetype/ftimage.h
new file mode 100644
index 0000000000..401cb38633
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftimage.h
@@ -0,0 +1,1322 @@
+/***************************************************************************/
+/* */
+/* ftimage.h */
+/* */
+/* FreeType glyph image formats and default raster interface */
+/* (specification). */
+/* */
+/* Copyright 1996-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Note: A `raster' is simply a scan-line converter, used to render */
+ /* FT_Outlines into FT_Bitmaps. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+ /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include "../ft2build.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pos */
+ /* */
+ /* <Description> */
+ /* The type FT_Pos is used to store vectorial coordinates. Depending */
+ /* on the context, these can represent distances in integer font */
+ /* units, or 16.16, or 26.6 fixed-point pixel coordinates. */
+ /* */
+ typedef signed long FT_Pos;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Vector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector; coordinates are of */
+ /* the FT_Pos type. */
+ /* */
+ /* <Fields> */
+ /* x :: The horizontal coordinate. */
+ /* y :: The vertical coordinate. */
+ /* */
+ typedef struct FT_Vector_
+ {
+ FT_Pos x;
+ FT_Pos y;
+
+ } FT_Vector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BBox */
+ /* */
+ /* <Description> */
+ /* A structure used to hold an outline's bounding box, i.e., the */
+ /* coordinates of its extrema in the horizontal and vertical */
+ /* directions. */
+ /* */
+ /* <Fields> */
+ /* xMin :: The horizontal minimum (left-most). */
+ /* */
+ /* yMin :: The vertical minimum (bottom-most). */
+ /* */
+ /* xMax :: The horizontal maximum (right-most). */
+ /* */
+ /* yMax :: The vertical maximum (top-most). */
+ /* */
+ /* <Note> */
+ /* The bounding box is specified with the coordinates of the lower */
+ /* left and the upper right corner. In PostScript, those values are */
+ /* often called (llx,lly) and (urx,ury), respectively. */
+ /* */
+ /* If `yMin' is negative, this value gives the glyph's descender. */
+ /* Otherwise, the glyph doesn't descend below the baseline. */
+ /* Similarly, if `ymax' is positive, this value gives the glyph's */
+ /* ascender. */
+ /* */
+ /* `xMin' gives the horizontal distance from the glyph's origin to */
+ /* the left edge of the glyph's bounding box. If `xMin' is negative, */
+ /* the glyph extends to the left of the origin. */
+ /* */
+ typedef struct FT_BBox_
+ {
+ FT_Pos xMin, yMin;
+ FT_Pos xMax, yMax;
+
+ } FT_BBox;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Pixel_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of pixels in a */
+ /* given bitmap. Note that additional formats may be added in the */
+ /* future. */
+ /* */
+ /* <Values> */
+ /* FT_PIXEL_MODE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_PIXEL_MODE_MONO :: */
+ /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */
+ /* are stored in most-significant order (MSB), which means that */
+ /* the left-most pixel in a byte has value 128. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY :: */
+ /* An 8-bit bitmap, generally used to represent anti-aliased glyph */
+ /* images. Each pixel is stored in one byte. Note that the number */
+ /* of `gray' levels is stored in the `num_grays' field of the */
+ /* @FT_Bitmap structure (it generally is 256). */
+ /* */
+ /* FT_PIXEL_MODE_GRAY2 :: */
+ /* A 2-bit per pixel bitmap, used to represent embedded */
+ /* anti-aliased bitmaps in font files according to the OpenType */
+ /* specification. We haven't found a single font using this */
+ /* format, however. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY4 :: */
+ /* A 4-bit per pixel bitmap, representing embedded anti-aliased */
+ /* bitmaps in font files according to the OpenType specification. */
+ /* We haven't found a single font using this format, however. */
+ /* */
+ /* FT_PIXEL_MODE_LCD :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on LCD displays; the bitmap is three times */
+ /* wider than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD. */
+ /* */
+ /* FT_PIXEL_MODE_LCD_V :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on rotated LCD displays; the bitmap is three */
+ /* times taller than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD_V. */
+ /* */
+ /* FT_PIXEL_MODE_BGRA :: */
+ /* An image with four 8-bit channels per pixel, representing a */
+ /* color image (such as emoticons) with alpha channel. For each */
+ /* pixel, the format is BGRA, which means, the blue channel comes */
+ /* first in memory. The color channels are pre-multiplied and in */
+ /* the sRGB colorspace. For example, full red at half-translucent */
+ /* opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
+ /* See also @FT_LOAD_COLOR. */
+ /* */
+ typedef enum FT_Pixel_Mode_
+ {
+ FT_PIXEL_MODE_NONE = 0,
+ FT_PIXEL_MODE_MONO,
+ FT_PIXEL_MODE_GRAY,
+ FT_PIXEL_MODE_GRAY2,
+ FT_PIXEL_MODE_GRAY4,
+ FT_PIXEL_MODE_LCD,
+ FT_PIXEL_MODE_LCD_V,
+ FT_PIXEL_MODE_BGRA,
+
+ FT_PIXEL_MODE_MAX /* do not remove */
+
+ } FT_Pixel_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_pixel_mode_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Pixel_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */
+ /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */
+ /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */
+ /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */
+ /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */
+ /* */
+#define ft_pixel_mode_none FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Palette_Mode */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */
+ /* */
+ /* An enumeration type to describe the format of a bitmap palette, */
+ /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */
+ /* */
+ /* <Values> */
+ /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */
+ /* records. */
+ /* */
+ /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */
+ /* records. */
+ /* */
+ /* <Note> */
+ /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */
+ /* FreeType, these types are not handled by the library itself. */
+ /* */
+ typedef enum FT_Palette_Mode_
+ {
+ ft_palette_mode_rgb = 0,
+ ft_palette_mode_rgba,
+
+ ft_palette_mode_max /* do not remove */
+
+ } FT_Palette_Mode;
+
+ /* */
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a bitmap or pixmap to the raster. */
+ /* Note that we now manage pixmaps of various depths through the */
+ /* `pixel_mode' field. */
+ /* */
+ /* <Fields> */
+ /* rows :: The number of bitmap rows. */
+ /* */
+ /* width :: The number of pixels in bitmap row. */
+ /* */
+ /* pitch :: The pitch's absolute value is the number of bytes */
+ /* taken by one bitmap row, including padding. */
+ /* However, the pitch is positive when the bitmap has */
+ /* a `down' flow, and negative when it has an `up' */
+ /* flow. In all cases, the pitch is an offset to add */
+ /* to a bitmap pointer in order to go down one row. */
+ /* */
+ /* Note that `padding' means the alignment of a */
+ /* bitmap to a byte border, and FreeType functions */
+ /* normally align to the smallest possible integer */
+ /* value. */
+ /* */
+ /* For the B/W rasterizer, `pitch' is always an even */
+ /* number. */
+ /* */
+ /* To change the pitch of a bitmap (say, to make it a */
+ /* multiple of 4), use @FT_Bitmap_Convert. */
+ /* Alternatively, you might use callback functions to */
+ /* directly render to the application's surface; see */
+ /* the file `example2.cpp' in the tutorial for a */
+ /* demonstration. */
+ /* */
+ /* buffer :: A typeless pointer to the bitmap buffer. This */
+ /* value should be aligned on 32-bit boundaries in */
+ /* most cases. */
+ /* */
+ /* num_grays :: This field is only used with */
+ /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */
+ /* levels used in the bitmap. */
+ /* */
+ /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */
+ /* See @FT_Pixel_Mode for possible values. */
+ /* */
+ /* palette_mode :: This field is intended for paletted pixel modes; */
+ /* it indicates how the palette is stored. Not */
+ /* used currently. */
+ /* */
+ /* palette :: A typeless pointer to the bitmap palette; this */
+ /* field is intended for paletted pixel modes. Not */
+ /* used currently. */
+ /* */
+ /* <Note> */
+ /* For now, the only pixel modes supported by FreeType are mono and */
+ /* grays. However, drivers might be added in the future to support */
+ /* more `colorful' options. */
+ /* */
+ typedef struct FT_Bitmap_
+ {
+ int rows;
+ int width;
+ int pitch;
+ unsigned char* buffer;
+ short num_grays;
+ char pixel_mode;
+ char palette_mode;
+ void* palette;
+
+ } FT_Bitmap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline */
+ /* */
+ /* <Description> */
+ /* This structure is used to describe an outline to the scan-line */
+ /* converter. */
+ /* */
+ /* <Fields> */
+ /* n_contours :: The number of contours in the outline. */
+ /* */
+ /* n_points :: The number of points in the outline. */
+ /* */
+ /* points :: A pointer to an array of `n_points' @FT_Vector */
+ /* elements, giving the outline's point coordinates. */
+ /* */
+ /* tags :: A pointer to an array of `n_points' chars, giving */
+ /* each outline point's type. */
+ /* */
+ /* If bit~0 is unset, the point is `off' the curve, */
+ /* i.e., a Bézier control point, while it is `on' if */
+ /* set. */
+ /* */
+ /* Bit~1 is meaningful for `off' points only. If set, */
+ /* it indicates a third-order Bézier arc control point; */
+ /* and a second-order control point if unset. */
+ /* */
+ /* If bit~2 is set, bits 5-7 contain the drop-out mode */
+ /* (as defined in the OpenType specification; the value */
+ /* is the same as the argument to the SCANMODE */
+ /* instruction). */
+ /* */
+ /* Bits 3 and~4 are reserved for internal purposes. */
+ /* */
+ /* contours :: An array of `n_contours' shorts, giving the end */
+ /* point of each contour within the outline. For */
+ /* example, the first contour is defined by the points */
+ /* `0' to `contours[0]', the second one is defined by */
+ /* the points `contours[0]+1' to `contours[1]', etc. */
+ /* */
+ /* flags :: A set of bit flags used to characterize the outline */
+ /* and give hints to the scan-converter and hinter on */
+ /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */
+ /* */
+ /* <Note> */
+ /* The B/W rasterizer only checks bit~2 in the `tags' array for the */
+ /* first point of each contour. The drop-out mode as given with */
+ /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */
+ /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */
+ /* */
+ typedef struct FT_Outline_
+ {
+ short n_contours; /* number of contours in glyph */
+ short n_points; /* number of points in the glyph */
+
+ FT_Vector* points; /* the outline's points */
+ char* tags; /* the points flags */
+ short* contours; /* the contour end points */
+
+ int flags; /* outline masks */
+
+ } FT_Outline;
+
+ /* Following limits must be consistent with */
+ /* FT_Outline.{n_contours,n_points} */
+#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX SHRT_MAX
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OUTLINE_FLAGS */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants use for the flags in an outline's */
+ /* `flags' field. */
+ /* */
+ /* <Values> */
+ /* FT_OUTLINE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_OUTLINE_OWNER :: */
+ /* If set, this flag indicates that the outline's field arrays */
+ /* (i.e., `points', `flags', and `contours') are `owned' by the */
+ /* outline object, and should thus be freed when it is destroyed. */
+ /* */
+ /* FT_OUTLINE_EVEN_ODD_FILL :: */
+ /* By default, outlines are filled using the non-zero winding rule. */
+ /* If set to 1, the outline will be filled using the even-odd fill */
+ /* rule (only works with the smooth rasterizer). */
+ /* */
+ /* FT_OUTLINE_REVERSE_FILL :: */
+ /* By default, outside contours of an outline are oriented in */
+ /* clock-wise direction, as defined in the TrueType specification. */
+ /* This flag is set if the outline uses the opposite direction */
+ /* (typically for Type~1 fonts). This flag is ignored by the scan */
+ /* converter. */
+ /* */
+ /* FT_OUTLINE_IGNORE_DROPOUTS :: */
+ /* By default, the scan converter will try to detect drop-outs in */
+ /* an outline and correct the glyph bitmap to ensure consistent */
+ /* shape continuity. If set, this flag hints the scan-line */
+ /* converter to ignore such cases. See below for more information. */
+ /* */
+ /* FT_OUTLINE_SMART_DROPOUTS :: */
+ /* Select smart dropout control. If unset, use simple dropout */
+ /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */
+ /* below for more information. */
+ /* */
+ /* FT_OUTLINE_INCLUDE_STUBS :: */
+ /* If set, turn pixels on for `stubs', otherwise exclude them. */
+ /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */
+ /* more information. */
+ /* */
+ /* FT_OUTLINE_HIGH_PRECISION :: */
+ /* This flag indicates that the scan-line converter should try to */
+ /* convert this outline to bitmaps with the highest possible */
+ /* quality. It is typically set for small character sizes. Note */
+ /* that this is only a hint that might be completely ignored by a */
+ /* given scan-converter. */
+ /* */
+ /* FT_OUTLINE_SINGLE_PASS :: */
+ /* This flag is set to force a given scan-converter to only use a */
+ /* single pass over the outline to render a bitmap glyph image. */
+ /* Normally, it is set for very large character sizes. It is only */
+ /* a hint that might be completely ignored by a given */
+ /* scan-converter. */
+ /* */
+ /* <Note> */
+ /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+ /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */
+ /* rasterizer. */
+ /* */
+ /* There exists a second mechanism to pass the drop-out mode to the */
+ /* B/W rasterizer; see the `tags' field in @FT_Outline. */
+ /* */
+ /* Please refer to the description of the `SCANTYPE' instruction in */
+ /* the OpenType specification (in file `ttinst1.doc') how simple */
+ /* drop-outs, smart drop-outs, and stubs are defined. */
+ /* */
+#define FT_OUTLINE_NONE 0x0
+#define FT_OUTLINE_OWNER 0x1
+#define FT_OUTLINE_EVEN_ODD_FILL 0x2
+#define FT_OUTLINE_REVERSE_FILL 0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS 0x8
+#define FT_OUTLINE_SMART_DROPOUTS 0x10
+#define FT_OUTLINE_INCLUDE_STUBS 0x20
+
+#define FT_OUTLINE_HIGH_PRECISION 0x100
+#define FT_OUTLINE_SINGLE_PASS 0x200
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * ft_outline_flags
+ *
+ * @description:
+ * These constants are deprecated. Please use the corresponding
+ * @FT_OUTLINE_FLAGS values.
+ *
+ * @values:
+ * ft_outline_none :: See @FT_OUTLINE_NONE.
+ * ft_outline_owner :: See @FT_OUTLINE_OWNER.
+ * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL.
+ * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL.
+ * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+ * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION.
+ * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS.
+ */
+#define ft_outline_none FT_OUTLINE_NONE
+#define ft_outline_owner FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS
+
+ /* */
+
+#define FT_CURVE_TAG( flag ) ( flag & 3 )
+
+#define FT_CURVE_TAG_ON 1
+#define FT_CURVE_TAG_CONIC 0
+#define FT_CURVE_TAG_CUBIC 2
+
+#define FT_CURVE_TAG_HAS_SCANMODE 4
+
+#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \
+ FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_MoveToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `move */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `move to' is emitted to start a new contour in an outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `move to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_MoveToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_LineToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `line */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `line to' is emitted to indicate a segment in the outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `line to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_LineToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_LineTo_Func FT_Outline_LineToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_ConicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `conic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `conic to' is emitted to indicate a second-order Bézier arc in */
+ /* the outline. */
+ /* */
+ /* <Input> */
+ /* control :: An intermediate control point between the last position */
+ /* and the new target in `to'. */
+ /* */
+ /* to :: A pointer to the target end point of the conic arc. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_ConicToFunc)( const FT_Vector* control,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_CubicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `cubic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `cubic to' is emitted to indicate a third-order Bézier arc. */
+ /* */
+ /* <Input> */
+ /* control1 :: A pointer to the first Bézier control point. */
+ /* */
+ /* control2 :: A pointer to the second Bézier control point. */
+ /* */
+ /* to :: A pointer to the target end point. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_CubicToFunc)( const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure to hold various function pointers used during outline */
+ /* decomposition in order to emit segments, conic, and cubic Béziers. */
+ /* */
+ /* <Fields> */
+ /* move_to :: The `move to' emitter. */
+ /* */
+ /* line_to :: The segment emitter. */
+ /* */
+ /* conic_to :: The second-order Bézier arc emitter. */
+ /* */
+ /* cubic_to :: The third-order Bézier arc emitter. */
+ /* */
+ /* shift :: The shift that is applied to coordinates before they */
+ /* are sent to the emitter. */
+ /* */
+ /* delta :: The delta that is applied to coordinates before they */
+ /* are sent to the emitter, but after the shift. */
+ /* */
+ /* <Note> */
+ /* The point coordinates sent to the emitters are the transformed */
+ /* version of the original coordinates (this is important for high */
+ /* accuracy during scan-conversion). The transformation is simple: */
+ /* */
+ /* { */
+ /* x' = (x << shift) - delta */
+ /* y' = (x << shift) - delta */
+ /* } */
+ /* */
+ /* Set the values of `shift' and `delta' to~0 to get the original */
+ /* point coordinates. */
+ /* */
+ typedef struct FT_Outline_Funcs_
+ {
+ FT_Outline_MoveToFunc move_to;
+ FT_Outline_LineToFunc line_to;
+ FT_Outline_ConicToFunc conic_to;
+ FT_Outline_CubicToFunc cubic_to;
+
+ int shift;
+ FT_Pos delta;
+
+ } FT_Outline_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_IMAGE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags to an unsigned long type. */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \
+ value = ( ( (unsigned long)_x1 << 24 ) | \
+ ( (unsigned long)_x2 << 16 ) | \
+ ( (unsigned long)_x3 << 8 ) | \
+ (unsigned long)_x4 )
+#endif /* FT_IMAGE_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_Format */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of a given glyph */
+ /* image. Note that this version of FreeType only supports two image */
+ /* formats, even though future font drivers will be able to register */
+ /* their own format. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_FORMAT_NONE :: */
+ /* The value~0 is reserved. */
+ /* */
+ /* FT_GLYPH_FORMAT_COMPOSITE :: */
+ /* The glyph image is a composite of several other images. This */
+ /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */
+ /* report compound glyphs (like accented characters). */
+ /* */
+ /* FT_GLYPH_FORMAT_BITMAP :: */
+ /* The glyph image is a bitmap, and can be described as an */
+ /* @FT_Bitmap. You generally need to access the `bitmap' field of */
+ /* the @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_OUTLINE :: */
+ /* The glyph image is a vectorial outline made of line segments */
+ /* and Bézier arcs; it can be described as an @FT_Outline; you */
+ /* generally want to access the `outline' field of the */
+ /* @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_PLOTTER :: */
+ /* The glyph image is a vectorial path with no inside and outside */
+ /* contours. Some Type~1 fonts, like those in the Hershey family, */
+ /* contain glyphs in this format. These are described as */
+ /* @FT_Outline, but FreeType isn't currently capable of rendering */
+ /* them correctly. */
+ /* */
+ typedef enum FT_Glyph_Format_
+ {
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' )
+
+ } FT_Glyph_Format;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_format_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Glyph_Format values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */
+ /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */
+ /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */
+ /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */
+ /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */
+ /* */
+#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** R A S T E R D E F I N I T I O N S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* A raster is a scan converter, in charge of rendering an outline into */
+ /* a a bitmap. This section contains the public API for rasters. */
+ /* */
+ /* Note that in FreeType 2, all rasters are now encapsulated within */
+ /* specific modules called `renderers'. See `freetype/ftrender.h' for */
+ /* more details on renderers. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* raster */
+ /* */
+ /* <Title> */
+ /* Scanline Converter */
+ /* */
+ /* <Abstract> */
+ /* How vectorial outlines are converted into bitmaps and pixmaps. */
+ /* */
+ /* <Description> */
+ /* This section contains technical definitions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Raster */
+ /* */
+ /* <Description> */
+ /* A handle (pointer) to a raster object. Each object can be used */
+ /* independently to convert an outline into a bitmap or pixmap. */
+ /* */
+ typedef struct FT_RasterRec_* FT_Raster;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Span */
+ /* */
+ /* <Description> */
+ /* A structure used to model a single span of gray (or black) pixels */
+ /* when rendering a monochrome or anti-aliased bitmap. */
+ /* */
+ /* <Fields> */
+ /* x :: The span's horizontal start position. */
+ /* */
+ /* len :: The span's length in pixels. */
+ /* */
+ /* coverage :: The span color/coverage, ranging from 0 (background) */
+ /* to 255 (foreground). Only used for anti-aliased */
+ /* rendering. */
+ /* */
+ /* <Note> */
+ /* This structure is used by the span drawing callback type named */
+ /* @FT_SpanFunc which takes the y~coordinate of the span as a */
+ /* a parameter. */
+ /* */
+ /* The coverage value is always between 0 and 255. If you want less */
+ /* gray values, the callback function has to reduce them. */
+ /* */
+ typedef struct FT_Span_
+ {
+ short x;
+ unsigned short len;
+ unsigned char coverage;
+
+ } FT_Span;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_SpanFunc */
+ /* */
+ /* <Description> */
+ /* A function used as a call-back by the anti-aliased renderer in */
+ /* order to let client applications draw themselves the gray pixel */
+ /* spans on each scan line. */
+ /* */
+ /* <Input> */
+ /* y :: The scanline's y~coordinate. */
+ /* */
+ /* count :: The number of spans to draw on this scanline. */
+ /* */
+ /* spans :: A table of `count' spans to draw on the scanline. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Note> */
+ /* This callback allows client applications to directly render the */
+ /* gray spans of the anti-aliased bitmap to any kind of surfaces. */
+ /* */
+ /* This can be used to write anti-aliased outlines directly to a */
+ /* given background bitmap, and even perform translucency. */
+ /* */
+ /* Note that the `count' field cannot be greater than a fixed value */
+ /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */
+ /* `ftoption.h'. By default, this value is set to~32, which means */
+ /* that if there are more than 32~spans on a given scanline, the */
+ /* callback is called several times with the same `y' parameter in */
+ /* order to draw all callbacks. */
+ /* */
+ /* Otherwise, the callback is only called once per scan-line, and */
+ /* only for those scanlines that do have `gray' pixels on them. */
+ /* */
+ typedef void
+ (*FT_SpanFunc)( int y,
+ int count,
+ const FT_Span* spans,
+ void* user );
+
+#define FT_Raster_Span_Func FT_SpanFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitTest_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to test whether a given target pixel is already set to the drawing */
+ /* `color'. These tests are crucial to implement drop-out control */
+ /* per-se the TrueType spec. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef int
+ (*FT_Raster_BitTest_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitSet_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to set an individual target pixel. This is crucial to implement */
+ /* drop-out control according to the TrueType specification. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef void
+ (*FT_Raster_BitSet_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_RASTER_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flag constants as used in the `flags' field of a */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* <Values> */
+ /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */
+ /* */
+ /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */
+ /* anti-aliased glyph image should be */
+ /* generated. Otherwise, it will be */
+ /* monochrome (1-bit). */
+ /* */
+ /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */
+ /* rendering. In this mode, client */
+ /* applications must provide their own span */
+ /* callback. This lets them directly */
+ /* draw or compose over an existing bitmap. */
+ /* If this bit is not set, the target */
+ /* pixmap's buffer _must_ be zeroed before */
+ /* rendering. */
+ /* */
+ /* Note that for now, direct rendering is */
+ /* only possible with anti-aliased glyphs. */
+ /* */
+ /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */
+ /* rendering mode. If set, the output will */
+ /* be clipped to a box specified in the */
+ /* `clip_box' field of the */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* Note that by default, the glyph bitmap */
+ /* is clipped to the target pixmap, except */
+ /* in direct rendering mode where all spans */
+ /* are generated if no clipping box is set. */
+ /* */
+#define FT_RASTER_FLAG_DEFAULT 0x0
+#define FT_RASTER_FLAG_AA 0x1
+#define FT_RASTER_FLAG_DIRECT 0x2
+#define FT_RASTER_FLAG_CLIP 0x4
+
+ /* deprecated */
+#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Params */
+ /* */
+ /* <Description> */
+ /* A structure to hold the arguments used by a raster's render */
+ /* function. */
+ /* */
+ /* <Fields> */
+ /* target :: The target bitmap. */
+ /* */
+ /* source :: A pointer to the source glyph image (e.g., an */
+ /* @FT_Outline). */
+ /* */
+ /* flags :: The rendering flags. */
+ /* */
+ /* gray_spans :: The gray span drawing callback. */
+ /* */
+ /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_test :: The bit test callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_set :: The bit set callback. UNIMPLEMENTED! */
+ /* */
+ /* user :: User-supplied data that is passed to each drawing */
+ /* callback. */
+ /* */
+ /* clip_box :: An optional clipping box. It is only used in */
+ /* direct rendering mode. Note that coordinates here */
+ /* should be expressed in _integer_ pixels (and not in */
+ /* 26.6 fixed-point units). */
+ /* */
+ /* <Note> */
+ /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */
+ /* bit flag is set in the `flags' field, otherwise a monochrome */
+ /* bitmap is generated. */
+ /* */
+ /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */
+ /* raster will call the `gray_spans' callback to draw gray pixel */
+ /* spans, in the case of an aa glyph bitmap, it will call */
+ /* `black_spans', and `bit_test' and `bit_set' in the case of a */
+ /* monochrome bitmap. This allows direct composition over a */
+ /* pre-existing bitmap through user-provided callbacks to perform the */
+ /* span drawing/composition. */
+ /* */
+ /* Note that the `bit_test' and `bit_set' callbacks are required when */
+ /* rendering a monochrome bitmap, as they are crucial to implement */
+ /* correct drop-out control as defined in the TrueType specification. */
+ /* */
+ typedef struct FT_Raster_Params_
+ {
+ const FT_Bitmap* target;
+ const void* source;
+ int flags;
+ FT_SpanFunc gray_spans;
+ FT_SpanFunc black_spans; /* doesn't work! */
+ FT_Raster_BitTest_Func bit_test; /* doesn't work! */
+ FT_Raster_BitSet_Func bit_set; /* doesn't work! */
+ void* user;
+ FT_BBox clip_box;
+
+ } FT_Raster_Params;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_NewFunc */
+ /* */
+ /* <Description> */
+ /* A function used to create a new raster object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory allocator. */
+ /* */
+ /* <Output> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `memory' parameter is a typeless pointer in order to avoid */
+ /* un-wanted dependencies on the rest of the FreeType code. In */
+ /* practice, it is an @FT_Memory object, i.e., a handle to the */
+ /* standard FreeType memory allocator. However, this field can be */
+ /* completely ignored by a given raster implementation. */
+ /* */
+ typedef int
+ (*FT_Raster_NewFunc)( void* memory,
+ FT_Raster* raster );
+
+#define FT_Raster_New_Func FT_Raster_NewFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_DoneFunc */
+ /* */
+ /* <Description> */
+ /* A function used to destroy a given raster object. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ typedef void
+ (*FT_Raster_DoneFunc)( FT_Raster raster );
+
+#define FT_Raster_Done_Func FT_Raster_DoneFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_ResetFunc */
+ /* */
+ /* <Description> */
+ /* FreeType provides an area of memory called the `render pool', */
+ /* available to all registered rasters. This pool can be freely used */
+ /* during a given scan-conversion but is shared by all rasters. Its */
+ /* content is thus transient. */
+ /* */
+ /* This function is called each time the render pool changes, or just */
+ /* after a new raster object is created. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* pool_base :: The address in memory of the render pool. */
+ /* */
+ /* pool_size :: The size in bytes of the render pool. */
+ /* */
+ /* <Note> */
+ /* Rasters can ignore the render pool and rely on dynamic memory */
+ /* allocation if they want to (a handle to the memory allocator is */
+ /* passed to the raster constructor). However, this is not */
+ /* recommended for efficiency purposes. */
+ /* */
+ typedef void
+ (*FT_Raster_ResetFunc)( FT_Raster raster,
+ unsigned char* pool_base,
+ unsigned long pool_size );
+
+#define FT_Raster_Reset_Func FT_Raster_ResetFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_SetModeFunc */
+ /* */
+ /* <Description> */
+ /* This function is a generic facility to change modes or attributes */
+ /* in a given raster. This can be used for debugging purposes, or */
+ /* simply to allow implementation-specific `features' in a given */
+ /* raster module. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* mode :: A 4-byte tag used to name the mode or property. */
+ /* */
+ /* args :: A pointer to the new mode/property to use. */
+ /* */
+ typedef int
+ (*FT_Raster_SetModeFunc)( FT_Raster raster,
+ unsigned long mode,
+ void* args );
+
+#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_RenderFunc */
+ /* */
+ /* <Description> */
+ /* Invoke a given raster to scan-convert a given glyph image into a */
+ /* target bitmap. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* store the rendering parameters. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The exact format of the source image depends on the raster's glyph */
+ /* format defined in its @FT_Raster_Funcs structure. It can be an */
+ /* @FT_Outline or anything else in order to support a large array of */
+ /* glyph formats. */
+ /* */
+ /* Note also that the render function can fail and return a */
+ /* `FT_Err_Unimplemented_Feature' error code if the raster used does */
+ /* not support direct composition. */
+ /* */
+ /* XXX: For now, the standard raster doesn't support direct */
+ /* composition but this should change for the final release (see */
+ /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */
+ /* for examples of distinct implementations which support direct */
+ /* composition). */
+ /* */
+ typedef int
+ (*FT_Raster_RenderFunc)( FT_Raster raster,
+ const FT_Raster_Params* params );
+
+#define FT_Raster_Render_Func FT_Raster_RenderFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given raster class to the library. */
+ /* */
+ /* <Fields> */
+ /* glyph_format :: The supported glyph format for this raster. */
+ /* */
+ /* raster_new :: The raster constructor. */
+ /* */
+ /* raster_reset :: Used to reset the render pool within the raster. */
+ /* */
+ /* raster_render :: A function to render a glyph into a given bitmap. */
+ /* */
+ /* raster_done :: The raster destructor. */
+ /* */
+ typedef struct FT_Raster_Funcs_
+ {
+ FT_Glyph_Format glyph_format;
+ FT_Raster_NewFunc raster_new;
+ FT_Raster_ResetFunc raster_reset;
+ FT_Raster_SetModeFunc raster_set_mode;
+ FT_Raster_RenderFunc raster_render;
+ FT_Raster_DoneFunc raster_done;
+
+ } FT_Raster_Funcs;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftincrem.h b/core/include/thirdparties/freetype/freetype/ftincrem.h
new file mode 100644
index 0000000000..3a3015edc6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftincrem.h
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/* */
+/* ftincrem.h */
+/* */
+/* FreeType incremental loading (specification). */
+/* */
+/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * incremental
+ *
+ * @title:
+ * Incremental Loading
+ *
+ * @abstract:
+ * Custom Glyph Loading.
+ *
+ * @description:
+ * This section contains various functions used to perform so-called
+ * `incremental' glyph loading. This is a mode where all glyphs loaded
+ * from a given @FT_Face are provided by the client application,
+ *
+ * Apart from that, all other tables are loaded normally from the font
+ * file. This mode is useful when FreeType is used within another
+ * engine, e.g., a PostScript Imaging Processor.
+ *
+ * To enable this mode, you must use @FT_Open_Face, passing an
+ * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+ * @FT_Incremental_Interface value. See the comments for
+ * @FT_Incremental_InterfaceRec for an example.
+ *
+ */
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental
+ *
+ * @description:
+ * An opaque type describing a user-provided object used to implement
+ * `incremental' glyph loading within FreeType. This is used to support
+ * embedded fonts in certain environments (e.g., PostScript interpreters),
+ * where the glyph data isn't in the font file, or must be overridden by
+ * different values.
+ *
+ * @note:
+ * It is up to client applications to create and implement @FT_Incremental
+ * objects, as long as they provide implementations for the methods
+ * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+ * and @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ * See the description of @FT_Incremental_InterfaceRec to understand how
+ * to use incremental objects with FreeType.
+ *
+ */
+ typedef struct FT_IncrementalRec_* FT_Incremental;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_MetricsRec
+ *
+ * @description:
+ * A small structure used to contain the basic glyph metrics returned
+ * by the @FT_Incremental_GetGlyphMetricsFunc method.
+ *
+ * @fields:
+ * bearing_x ::
+ * Left bearing, in font units.
+ *
+ * bearing_y ::
+ * Top bearing, in font units.
+ *
+ * advance ::
+ * Horizontal component of glyph advance, in font units.
+ *
+ * advance_v ::
+ * Vertical component of glyph advance, in font units.
+ *
+ * @note:
+ * These correspond to horizontal or vertical metrics depending on the
+ * value of the `vertical' argument to the function
+ * @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_
+ {
+ FT_Long bearing_x;
+ FT_Long bearing_y;
+ FT_Long advance;
+ FT_Long advance_v; /* since 2.3.12 */
+
+ } FT_Incremental_MetricsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_Metrics
+ *
+ * @description:
+ * A handle to an @FT_Incremental_MetricsRec structure.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphDataFunc
+ *
+ * @description:
+ * A function called by FreeType to access a given glyph's data bytes
+ * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+ * enabled.
+ *
+ * Note that the format of the glyph's data bytes depends on the font
+ * file format. For TrueType, it must correspond to the raw bytes within
+ * the `glyf' table. For PostScript formats, it must correspond to the
+ * *unencrypted* charstring bytes, without any `lenIV' header. It is
+ * undefined for any other format.
+ *
+ * @input:
+ * incremental ::
+ * Handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * @output:
+ * adata ::
+ * A structure describing the returned glyph data bytes (which will be
+ * accessed as a read-only byte block).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If this function returns successfully the method
+ * @FT_Incremental_FreeGlyphDataFunc will be called later to release
+ * the data bytes.
+ *
+ * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+ * compound glyphs.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Data* adata );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_FreeGlyphDataFunc
+ *
+ * @description:
+ * A function used to release the glyph data bytes returned by a
+ * successful call to @FT_Incremental_GetGlyphDataFunc.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * data ::
+ * A structure describing the glyph data bytes (which will be accessed
+ * as a read-only byte block).
+ *
+ */
+ typedef void
+ (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental,
+ FT_Data* data );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphMetricsFunc
+ *
+ * @description:
+ * A function used to retrieve the basic metrics of a given glyph index
+ * before accessing its data. This is necessary because, in certain
+ * formats like TrueType, the metrics are stored in a different place from
+ * the glyph images proper.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * vertical ::
+ * If true, return vertical metrics.
+ *
+ * ametrics ::
+ * This parameter is used for both input and output.
+ * The original glyph metrics, if any, in font units. If metrics are
+ * not available all the values must be set to zero.
+ *
+ * @output:
+ * ametrics ::
+ * The replacement glyph metrics in font units.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphMetricsFunc)
+ ( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Bool vertical,
+ FT_Incremental_MetricsRec *ametrics );
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_FuncsRec
+ *
+ * @description:
+ * A table of functions for accessing fonts that load data
+ * incrementally. Used in @FT_Incremental_InterfaceRec.
+ *
+ * @fields:
+ * get_glyph_data ::
+ * The function to get glyph data. Must not be null.
+ *
+ * free_glyph_data ::
+ * The function to release glyph data. Must not be null.
+ *
+ * get_glyph_metrics ::
+ * The function to get glyph metrics. May be null if the font does
+ * not provide overriding glyph metrics.
+ *
+ */
+ typedef struct FT_Incremental_FuncsRec_
+ {
+ FT_Incremental_GetGlyphDataFunc get_glyph_data;
+ FT_Incremental_FreeGlyphDataFunc free_glyph_data;
+ FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics;
+
+ } FT_Incremental_FuncsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_InterfaceRec
+ *
+ * @description:
+ * A structure to be used with @FT_Open_Face to indicate that the user
+ * wants to support incremental glyph loading. You should use it with
+ * @FT_PARAM_TAG_INCREMENTAL as in the following example:
+ *
+ * {
+ * FT_Incremental_InterfaceRec inc_int;
+ * FT_Parameter parameter;
+ * FT_Open_Args open_args;
+ *
+ *
+ * // set up incremental descriptor
+ * inc_int.funcs = my_funcs;
+ * inc_int.object = my_object;
+ *
+ * // set up optional parameter
+ * parameter.tag = FT_PARAM_TAG_INCREMENTAL;
+ * parameter.data = &inc_int;
+ *
+ * // set up FT_Open_Args structure
+ * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+ * open_args.pathname = my_font_pathname;
+ * open_args.num_params = 1;
+ * open_args.params = &parameter; // we use one optional argument
+ *
+ * // open the font
+ * error = FT_Open_Face( library, &open_args, index, &face );
+ * ...
+ * }
+ *
+ */
+ typedef struct FT_Incremental_InterfaceRec_
+ {
+ const FT_Incremental_FuncsRec* funcs;
+ FT_Incremental object;
+
+ } FT_Incremental_InterfaceRec;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_Interface
+ *
+ * @description:
+ * A pointer to an @FT_Incremental_InterfaceRec structure.
+ *
+ */
+ typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface;
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_INCREMENTAL
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to indicate
+ * an incremental loading object to be used by FreeType.
+ *
+ */
+#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlcdfil.h b/core/include/thirdparties/freetype/freetype/ftlcdfil.h
new file mode 100644
index 0000000000..042f98396e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlcdfil.h
@@ -0,0 +1,251 @@
+/***************************************************************************/
+/* */
+/* ftlcdfil.h */
+/* */
+/* FreeType API for color filtering of subpixel bitmap glyphs */
+/* (specification). */
+/* */
+/* Copyright 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * lcd_filtering
+ *
+ * @title:
+ * LCD Filtering
+ *
+ * @abstract:
+ * Reduce color fringes of LCD-optimized bitmaps.
+ *
+ * @description:
+ * The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+ * filter which is then applied to LCD-optimized bitmaps generated
+ * through @FT_Render_Glyph. This is useful to reduce color fringes
+ * which would occur with unfiltered rendering.
+ *
+ * Note that no filter is active by default, and that this function is
+ * *not* implemented in default builds of the library. You need to
+ * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+ * in order to activate it.
+ *
+ * FreeType generates alpha coverage maps, which are linear by nature.
+ * For instance, the value 0x80 in bitmap representation means that
+ * (within numerical precision) 0x80/0xff fraction of that pixel is
+ * covered by the glyph's outline. The blending function for placing
+ * text over a background is
+ *
+ * {
+ * dst = alpha * src + (1 - alpha) * dst ,
+ * }
+ *
+ * which is known as OVER. However, when calculating the output of the
+ * OVER operator, the source colors should first be transformed to a
+ * linear color space, then alpha blended in that space, and transformed
+ * back to the output color space.
+ *
+ * When linear light blending is used, the default FIR5 filtering
+ * weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
+ * they have been designed for black on white rendering while lacking
+ * gamma correction. To preserve color neutrality, weights for a FIR5
+ * filter should be chosen according to two free parameters `a' and `c',
+ * and the FIR weights should be
+ *
+ * {
+ * [a - c, a + c, 2 * a, a + c, a - c] .
+ * }
+ *
+ * This formula generates equal weights for all the color primaries
+ * across the filter kernel, which makes it colorless. One suggested
+ * set of weights is
+ *
+ * {
+ * [0x10, 0x50, 0x60, 0x50, 0x10] ,
+ * }
+ *
+ * where `a' has value 0x30 and `b' value 0x20. The weights in filter
+ * may have a sum larger than 0x100, which increases coloration slightly
+ * but also improves contrast.
+ */
+
+
+ /****************************************************************************
+ *
+ * @enum:
+ * FT_LcdFilter
+ *
+ * @description:
+ * A list of values to identify various types of LCD filters.
+ *
+ * @values:
+ * FT_LCD_FILTER_NONE ::
+ * Do not perform filtering. When used with subpixel rendering, this
+ * results in sometimes severe color fringes.
+ *
+ * FT_LCD_FILTER_DEFAULT ::
+ * The default filter reduces color fringes considerably, at the cost
+ * of a slight blurriness in the output.
+ *
+ * FT_LCD_FILTER_LIGHT ::
+ * The light filter is a variant that produces less blurriness at the
+ * cost of slightly more color fringes than the default one. It might
+ * be better, depending on taste, your monitor, or your personal vision.
+ *
+ * FT_LCD_FILTER_LEGACY ::
+ * This filter corresponds to the original libXft color filter. It
+ * provides high contrast output but can exhibit really bad color
+ * fringes if glyphs are not extremely well hinted to the pixel grid.
+ * In other words, it only works well if the TrueType bytecode
+ * interpreter is enabled *and* high-quality hinted fonts are used.
+ *
+ * This filter is only provided for comparison purposes, and might be
+ * disabled or stay unsupported in the future.
+ *
+ * @since:
+ * 2.3.0
+ */
+ typedef enum FT_LcdFilter_
+ {
+ FT_LCD_FILTER_NONE = 0,
+ FT_LCD_FILTER_DEFAULT = 1,
+ FT_LCD_FILTER_LIGHT = 2,
+ FT_LCD_FILTER_LEGACY = 16,
+
+ FT_LCD_FILTER_MAX /* do not remove */
+
+ } FT_LcdFilter;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilter
+ *
+ * @description:
+ * This function is used to apply color filtering to LCD decimated
+ * bitmaps, like the ones used when calling @FT_Render_Glyph with
+ * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * filter ::
+ * The filter type.
+ *
+ * You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+ * @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+ * well on most LCD screens.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This feature is always disabled by default. Clients must make an
+ * explicit call to this function with a `filter' value other than
+ * @FT_LCD_FILTER_NONE in order to enable it.
+ *
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+ * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+ *
+ * It does _not_ affect the output of @FT_Outline_Render and
+ * @FT_Outline_Get_Bitmap.
+ *
+ * If this feature is activated, the dimensions of LCD glyph bitmaps are
+ * either larger or taller than the dimensions of the corresponding
+ * outline with regards to the pixel grid. For example, for
+ * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+ * up to 3~pixels to the right.
+ *
+ * The bitmap offset values are adjusted correctly, so clients shouldn't
+ * need to modify their layout and glyph positioning code when enabling
+ * the filter.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter );
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilterWeights
+ *
+ * @description:
+ * Use this function to override the filter weights selected by
+ * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple
+ * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+ * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+ * FT_LCD_FILTER_LEGACY.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * weights ::
+ * A pointer to an array; the function copies the first five bytes and
+ * uses them to specify the filter weights.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * This function must be called after @FT_Library_SetLcdFilter to have
+ * any effect.
+ *
+ * @since:
+ * 2.4.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlist.h b/core/include/thirdparties/freetype/freetype/ftlist.h
new file mode 100644
index 0000000000..8b18978bcd
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlist.h
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/* */
+/* ftlist.h */
+/* */
+/* Generic list support for FreeType (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file implements functions relative to list processing. Its */
+ /* data structures are defined in `freetype.h'. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /* <Title> */
+ /* List Processing */
+ /* */
+ /* <Abstract> */
+ /* Simple management of lists. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to list */
+ /* processing using doubly-linked nodes. */
+ /* */
+ /* <Order> */
+ /* FT_List */
+ /* FT_ListNode */
+ /* FT_ListRec */
+ /* FT_ListNodeRec */
+ /* */
+ /* FT_List_Add */
+ /* FT_List_Insert */
+ /* FT_List_Find */
+ /* FT_List_Remove */
+ /* FT_List_Up */
+ /* FT_List_Iterate */
+ /* FT_List_Iterator */
+ /* FT_List_Finalize */
+ /* FT_List_Destructor */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Find */
+ /* */
+ /* <Description> */
+ /* Find the list node for a given listed object. */
+ /* */
+ /* <Input> */
+ /* list :: A pointer to the parent list. */
+ /* data :: The address of the listed object. */
+ /* */
+ /* <Return> */
+ /* List node. NULL if it wasn't found. */
+ /* */
+ FT_EXPORT( FT_ListNode )
+ FT_List_Find( FT_List list,
+ void* data );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Add */
+ /* */
+ /* <Description> */
+ /* Append an element to the end of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to append. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Add( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Insert */
+ /* */
+ /* <Description> */
+ /* Insert an element at the head of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to parent list. */
+ /* node :: The node to insert. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Insert( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Remove */
+ /* */
+ /* <Description> */
+ /* Remove a node from a list. This function doesn't check whether */
+ /* the node is in the list! */
+ /* */
+ /* <Input> */
+ /* node :: The node to remove. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Remove( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Up */
+ /* */
+ /* <Description> */
+ /* Move a node to the head/top of a list. Used to maintain LRU */
+ /* lists. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to move. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Up( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Iterator */
+ /* */
+ /* <Description> */
+ /* An FT_List iterator function which is called during a list parse */
+ /* by @FT_List_Iterate. */
+ /* */
+ /* <Input> */
+ /* node :: The current iteration list node. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. */
+ /* Can be used to point to the iteration's state. */
+ /* */
+ typedef FT_Error
+ (*FT_List_Iterator)( FT_ListNode node,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Iterate */
+ /* */
+ /* <Description> */
+ /* Parse a list and calls a given iterator function on each element. */
+ /* Note that parsing is stopped as soon as one of the iterator calls */
+ /* returns a non-zero value. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* iterator :: An iterator function, called on each node of the list. */
+ /* user :: A user-supplied field which is passed as the second */
+ /* argument to the iterator. */
+ /* */
+ /* <Return> */
+ /* The result (a FreeType error code) of the last iterator call. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_List_Iterate( FT_List list,
+ FT_List_Iterator iterator,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Destructor */
+ /* */
+ /* <Description> */
+ /* An @FT_List iterator function which is called during a list */
+ /* finalization by @FT_List_Finalize to destroy all elements in a */
+ /* given list. */
+ /* */
+ /* <Input> */
+ /* system :: The current system object. */
+ /* */
+ /* data :: The current object to destroy. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. It can */
+ /* be used to point to the iteration's state. */
+ /* */
+ typedef void
+ (*FT_List_Destructor)( FT_Memory memory,
+ void* data,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Finalize */
+ /* */
+ /* <Description> */
+ /* Destroy all elements in the list as well as the list itself. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* */
+ /* destroy :: A list destructor that will be applied to each element */
+ /* of the list. */
+ /* */
+ /* memory :: The current memory object which handles deallocation. */
+ /* */
+ /* user :: A user-supplied field which is passed as the last */
+ /* argument to the destructor. */
+ /* */
+ /* <Note> */
+ /* This function expects that all nodes added by @FT_List_Add or */
+ /* @FT_List_Insert have been dynamically allocated. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Finalize( FT_List list,
+ FT_List_Destructor destroy,
+ FT_Memory memory,
+ void* user );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftlzw.h b/core/include/thirdparties/freetype/freetype/ftlzw.h
new file mode 100644
index 0000000000..5bb4a82247
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftlzw.h
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/* */
+/* ftlzw.h */
+/* */
+/* LZW-compressed stream support. */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* lzw */
+ /* */
+ /* <Title> */
+ /* LZW Streams */
+ /* */
+ /* <Abstract> */
+ /* Using LZW-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of LZW-specific functions. */
+ /* */
+ /*************************************************************************/
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenLZW
+ *
+ * @description:
+ * Open a new stream to parse LZW-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.Z' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream :: The target embedding stream.
+ *
+ * source :: The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream
+ *
+ * In certain builds of the library, LZW compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a LZW stream from it
+ * and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with LZW support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenLZW( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmac.h b/core/include/thirdparties/freetype/freetype/ftmac.h
new file mode 100644
index 0000000000..f40f3fb9ee
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmac.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftmac.h */
+/* */
+/* Additional Mac-specific API. */
+/* */
+/* Copyright 1996-2001, 2004, 2006, 2007 by */
+/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* NOTE: Include this file after <freetype/freetype.h> and after any */
+/* Mac-specific headers (because this header uses Mac types such as */
+/* Handle, FSSpec, FSRef, etc.) */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__) && \
+ ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* mac_specific */
+ /* */
+ /* <Title> */
+ /* Mac Specific Interface */
+ /* */
+ /* <Abstract> */
+ /* Only available on the Macintosh. */
+ /* */
+ /* <Description> */
+ /* The following definitions are only available if FreeType is */
+ /* compiled on a Macintosh. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FOND */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a FOND resource. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* fond :: A FOND resource. */
+ /* */
+ /* face_index :: Only supported for the -1 `sanity check' special */
+ /* case. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Notes> */
+ /* This function can be used to create @FT_Face objects from fonts */
+ /* that are installed in the system as follows. */
+ /* */
+ /* { */
+ /* fond = GetResource( 'FOND', fontName ); */
+ /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FOND( FT_Library library,
+ Handle fond,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font (e.g., Times New Roman */
+ /* Bold). */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_ATS_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFilePath_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return a pathname of the disk file and face index for given font */
+ /* name which is handled by ATS framework. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* path :: Buffer to store pathname of the file. For passing */
+ /* to @FT_New_Face. The client must allocate this */
+ /* buffer before calling this function. */
+ /* */
+ /* maxPathSize :: Lengths of the buffer `path' that client allocated. */
+ /* */
+ /* face_index :: Index of the face. For passing to @FT_New_Face. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFilePath_From_Mac_ATS_Name( const char* fontName,
+ UInt8* path,
+ UInt32 maxPathSize,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSSpec */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSSpec to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSSpec to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */
+ /* it accepts an FSSpec instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSSpec( FT_Library library,
+ const FSSpec *spec,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSRef */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSRef to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSRef to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */
+ /* it accepts an FSRef instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSRef( FT_Library library,
+ const FSRef *ref,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmm.h b/core/include/thirdparties/freetype/freetype/ftmm.h
new file mode 100644
index 0000000000..52aaf44375
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmm.h
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/* */
+/* ftmm.h */
+/* */
+/* FreeType Multiple Master font interface (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include "../ft2build.h"
+#include "t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* multiple_masters */
+ /* */
+ /* <Title> */
+ /* Multiple Masters */
+ /* */
+ /* <Abstract> */
+ /* How to manage Multiple Masters fonts. */
+ /* */
+ /* <Description> */
+ /* The following types and functions are used to manage Multiple */
+ /* Master fonts, i.e., the selection of specific design instances by */
+ /* setting design axis coordinates. */
+ /* */
+ /* George Williams has extended this interface to make it work with */
+ /* both Type~1 Multiple Masters fonts and GX distortable (var) */
+ /* fonts. Some of these routines only work with MM fonts, others */
+ /* will work with both types. They are similar enough that a */
+ /* consistent interface makes sense. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters fonts. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ typedef struct FT_MM_Axis_
+ {
+ FT_String* name;
+ FT_Long minimum;
+ FT_Long maximum;
+
+ } FT_MM_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Multi_Master */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* font. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: Number of axes. Cannot exceed~4. */
+ /* */
+ /* num_designs :: Number of designs; should be normally 2^num_axis */
+ /* even though the Type~1 specification strangely */
+ /* allows for intermediate designs to be present. This */
+ /* number cannot exceed~16. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* */
+ typedef struct FT_Multi_Master_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_MM_Axis axis[T1_MAX_MM_AXIS];
+
+ } FT_Multi_Master;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters and GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* Not always meaningful for GX. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* def :: The axis's default design coordinate. */
+ /* FreeType computes meaningful default values for MM; it */
+ /* is then an integer value, not in 16.16 format. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ /* tag :: The axis's tag (the GX equivalent to `name'). */
+ /* FreeType provides default values for MM if possible. */
+ /* */
+ /* strid :: The entry in `name' table (another GX version of */
+ /* `name'). */
+ /* Not meaningful for MM. */
+ /* */
+ typedef struct FT_Var_Axis_
+ {
+ FT_String* name;
+
+ FT_Fixed minimum;
+ FT_Fixed def;
+ FT_Fixed maximum;
+
+ FT_ULong tag;
+ FT_UInt strid;
+
+ } FT_Var_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Named_Style */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a named style in a GX var font. */
+ /* */
+ /* This structure can't be used for MM fonts. */
+ /* */
+ /* <Fields> */
+ /* coords :: The design coordinates for this style. */
+ /* This is an array with one entry for each axis. */
+ /* */
+ /* strid :: The entry in `name' table identifying this style. */
+ /* */
+ typedef struct FT_Var_Named_Style_
+ {
+ FT_Fixed* coords;
+ FT_UInt strid;
+
+ } FT_Var_Named_Style;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Var */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* or GX var distortable font. */
+ /* */
+ /* Some fields are specific to one format and not to the other. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: The number of axes. The maximum value is~4 for */
+ /* MM; no limit in GX. */
+ /* */
+ /* num_designs :: The number of designs; should be normally */
+ /* 2^num_axis for MM fonts. Not meaningful for GX */
+ /* (where every glyph could have a different */
+ /* number of designs). */
+ /* */
+ /* num_namedstyles :: The number of named styles; only meaningful for */
+ /* GX which allows certain design coordinates to */
+ /* have a string ID (in the `name' table) */
+ /* associated with them. The font can tell the */
+ /* user that, for example, Weight=1.5 is `Bold'. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* GX fonts contain slightly more data than MM. */
+ /* */
+ /* namedstyles :: A table of named styles. */
+ /* Only meaningful with GX. */
+ /* */
+ typedef struct FT_MM_Var_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_UInt num_namedstyles;
+ FT_Var_Axis* axis;
+ FT_Var_Named_Style* namedstyle;
+
+ } FT_MM_Var;
+
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Multi_Master */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master descriptor of a given font. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Multi_Master( FT_Face face,
+ FT_Multi_Master *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_MM_Var */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master/GX var descriptor of a given font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters/GX var descriptor. */
+ /* Allocates a data structure, which the user must free */
+ /* (a single call to FT_FREE will do it). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_MM_Var( FT_Face face,
+ FT_MM_Var* *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters fonts, choose an interpolated font design */
+ /* through design coordinates. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Master or GX Var fonts, choose an interpolated font */
+ /* design through design coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters and GX var fonts, choose an interpolated font */
+ /* design through normalized blend coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: The design coordinates array (each element must be */
+ /* between 0 and 1.0). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* This is another name of @FT_Set_MM_Blend_Coordinates. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmodapi.h b/core/include/thirdparties/freetype/freetype/ftmodapi.h
new file mode 100644
index 0000000000..f12c0a933f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmodapi.h
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/* */
+/* ftmodapi.h */
+/* */
+/* FreeType modules public interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /* <Title> */
+ /* Module Management */
+ /* */
+ /* <Abstract> */
+ /* How to add, upgrade, remove, and control modules from FreeType. */
+ /* */
+ /* <Description> */
+ /* The definitions below are used to manage modules within FreeType. */
+ /* Modules can be added, upgraded, and removed at runtime. */
+ /* Additionally, some module properties can be controlled also. */
+ /* */
+ /* Here is a list of possible values of the `module_name' field in */
+ /* the @FT_Module_Class structure. */
+ /* */
+ /* { */
+ /* autofitter */
+ /* bdf */
+ /* cff */
+ /* gxvalid */
+ /* otvalid */
+ /* pcf */
+ /* pfr */
+ /* psaux */
+ /* pshinter */
+ /* psnames */
+ /* raster1, raster5 */
+ /* sfnt */
+ /* smooth, smooth-lcd, smooth-lcdv */
+ /* truetype */
+ /* type1 */
+ /* type42 */
+ /* t1cid */
+ /* winfonts */
+ /* } */
+ /* */
+ /* Note that the FreeType Cache sub-system is not a FreeType module. */
+ /* */
+ /*************************************************************************/
+
+
+ /* module bit flags */
+#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */
+#define FT_MODULE_RENDERER 2 /* this module is a renderer */
+#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */
+#define FT_MODULE_STYLER 8 /* this module is a styler */
+
+#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */
+ /* scalable fonts */
+#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */
+ /* support vector outlines */
+#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */
+ /* own hinter */
+
+
+ /* deprecated values */
+#define ft_module_font_driver FT_MODULE_FONT_DRIVER
+#define ft_module_renderer FT_MODULE_RENDERER
+#define ft_module_hinter FT_MODULE_HINTER
+#define ft_module_styler FT_MODULE_STYLER
+
+#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER
+
+
+ typedef FT_Pointer FT_Module_Interface;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Constructor */
+ /* */
+ /* <Description> */
+ /* A function used to initialize (not create) a new module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to initialize. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Constructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destructor */
+ /* */
+ /* <Description> */
+ /* A function used to finalize (not destroy) a given module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to finalize. */
+ /* */
+ typedef void
+ (*FT_Module_Destructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Requester */
+ /* */
+ /* <Description> */
+ /* A function used to query a given module for a specific interface. */
+ /* */
+ /* <Input> */
+ /* module :: The module to be searched. */
+ /* */
+ /* name :: The name of the interface in the module. */
+ /* */
+ typedef FT_Module_Interface
+ (*FT_Module_Requester)( FT_Module module,
+ const char* name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Module_Class */
+ /* */
+ /* <Description> */
+ /* The module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* module_flags :: Bit flags describing the module. */
+ /* */
+ /* module_size :: The size of one module object/instance in */
+ /* bytes. */
+ /* */
+ /* module_name :: The name of the module. */
+ /* */
+ /* module_version :: The version, as a 16.16 fixed number */
+ /* (major.minor). */
+ /* */
+ /* module_requires :: The version of FreeType this module requires, */
+ /* as a 16.16 fixed number (major.minor). Starts */
+ /* at version 2.0, i.e., 0x20000. */
+ /* */
+ /* module_init :: The initializing function. */
+ /* */
+ /* module_done :: The finalizing function. */
+ /* */
+ /* get_interface :: The interface requesting function. */
+ /* */
+ typedef struct FT_Module_Class_
+ {
+ FT_ULong module_flags;
+ FT_Long module_size;
+ const FT_String* module_name;
+ FT_Fixed module_version;
+ FT_Fixed module_requires;
+
+ const void* module_interface;
+
+ FT_Module_Constructor module_init;
+ FT_Module_Destructor module_done;
+ FT_Module_Requester get_interface;
+
+ } FT_Module_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Module */
+ /* */
+ /* <Description> */
+ /* Add a new module to a given library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* clazz :: A pointer to class descriptor for the module. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Add_Module( FT_Library library,
+ const FT_Module_Class* clazz );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module */
+ /* */
+ /* <Description> */
+ /* Find a module by its name. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module handle. 0~if none was found. */
+ /* */
+ /* <Note> */
+ /* FreeType's internal modules aren't documented very well, and you */
+ /* should look up the source code for details. */
+ /* */
+ FT_EXPORT( FT_Module )
+ FT_Get_Module( FT_Library library,
+ const char* module_name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Remove_Module */
+ /* */
+ /* <Description> */
+ /* Remove a given module from a library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* <Input> */
+ /* module :: A handle to a module object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The module object is destroyed by the function in case of success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Remove_Module( FT_Library library,
+ FT_Module module );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Set
+ *
+ * @description:
+ * Set a property for a given module.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * Note that only a few modules have properties.
+ *
+ * value ::
+ * A generic pointer to a variable or structure which gives the new
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example sets property `bar' (a simple integer) in
+ * module `foo' to value~1.
+ *
+ * {
+ * FT_UInt bar;
+ *
+ *
+ * bar = 1;
+ * FT_Property_Set( library, "foo", "bar", &bar );
+ * }
+ *
+ * Note that the FreeType Cache sub-system doesn't recognize module
+ * property changes. To avoid glyph lookup confusion within the cache
+ * you should call @FTC_Manager_Reset to completely flush the cache if
+ * a module property gets changed after @FTC_Manager_New has been
+ * called.
+ *
+ * It is not possible to set properties of the FreeType Cache
+ * sub-system itself with FT_Property_Set; use @FTC_Property_Set
+ * instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ const void* value );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Get
+ *
+ * @description:
+ * Get a module's property value.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * @inout:
+ * value ::
+ * A generic pointer to a variable or structure which gives the
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example gets property `baz' (a range) in module `foo'.
+ *
+ * {
+ * typedef range_
+ * {
+ * FT_Int32 min;
+ * FT_Int32 max;
+ *
+ * } range;
+ *
+ * range baz;
+ *
+ *
+ * FT_Property_Get( library, "foo", "baz", &baz );
+ * }
+ *
+ * It is not possible to retrieve properties of the FreeType Cache
+ * sub-system with FT_Property_Get; use @FTC_Property_Get instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Get( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Library */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Library */
+ /* structure is created. This function increments the counter. */
+ /* @FT_Done_Library then only destroys a library if the counter is~1, */
+ /* otherwise it simply decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Library objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Library( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Library */
+ /* */
+ /* <Description> */
+ /* This function is used to create a new FreeType library instance */
+ /* from a given memory object. It is thus possible to use libraries */
+ /* with distinct memory allocators within the same program. */
+ /* */
+ /* Normally, you would call this function (followed by a call to */
+ /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */
+ /* instead of @FT_Init_FreeType to initialize the FreeType library. */
+ /* */
+ /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */
+ /* library instance. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the original memory object. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A pointer to handle of a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Library( FT_Memory memory,
+ FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Library */
+ /* */
+ /* <Description> */
+ /* Discard a given library object. This closes all drivers and */
+ /* discards all resource objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Library( FT_Library library );
+
+/* */
+
+ typedef void
+ (*FT_DebugHook_Func)( void* arg );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Debug_Hook */
+ /* */
+ /* <Description> */
+ /* Set a debug hook function for debugging the interpreter of a font */
+ /* format. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* hook_index :: The index of the debug hook. You should use the */
+ /* values defined in `ftobjs.h', e.g., */
+ /* `FT_DEBUG_HOOK_TRUETYPE'. */
+ /* */
+ /* debug_hook :: The function used to debug the interpreter. */
+ /* */
+ /* <Note> */
+ /* Currently, four debug hook slots are available, but only two (for */
+ /* the TrueType and the Type~1 interpreter) are defined. */
+ /* */
+ /* Since the internal headers of FreeType are no longer installed, */
+ /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */
+ /* This is a bug and will be fixed in a forthcoming release. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Debug_Hook( FT_Library library,
+ FT_UInt hook_index,
+ FT_DebugHook_Func debug_hook );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Default_Modules */
+ /* */
+ /* <Description> */
+ /* Add the set of default drivers to a given library object. */
+ /* This is only useful when you create a library object with */
+ /* @FT_New_Library (usually to plug a custom memory manager). */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a new library object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Add_Default_Modules( FT_Library library );
+
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * truetype_engine
+ *
+ * @title:
+ * The TrueType Engine
+ *
+ * @abstract:
+ * TrueType bytecode support.
+ *
+ * @description:
+ * This section contains a function used to query the level of TrueType
+ * bytecode support compiled in this version of the library.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_TrueTypeEngineType
+ *
+ * @description:
+ * A list of values describing which kind of TrueType bytecode
+ * engine is implemented in a given FT_Library instance. It is used
+ * by the @FT_Get_TrueType_Engine_Type function.
+ *
+ * @values:
+ * FT_TRUETYPE_ENGINE_TYPE_NONE ::
+ * The library doesn't implement any kind of bytecode interpreter.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+ * The library implements a bytecode interpreter that doesn't
+ * support the patented operations of the TrueType virtual machine.
+ *
+ * Its main use is to load certain Asian fonts which position and
+ * scale glyph components with bytecode instructions. It produces
+ * bad output for most other fonts.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+ * The library implements a bytecode interpreter that covers
+ * the full instruction set of the TrueType virtual machine (this
+ * was governed by patents until May 2010, hence the name).
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ typedef enum FT_TrueTypeEngineType_
+ {
+ FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+ FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+ FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+ } FT_TrueTypeEngineType;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Get_TrueType_Engine_Type
+ *
+ * @description:
+ * Return an @FT_TrueTypeEngineType value to indicate which level of
+ * the TrueType virtual machine a given library instance supports.
+ *
+ * @input:
+ * library ::
+ * A library instance.
+ *
+ * @return:
+ * A value indicating which level is supported.
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ FT_EXPORT( FT_TrueTypeEngineType )
+ FT_Get_TrueType_Engine_Type( FT_Library library );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftmoderr.h b/core/include/thirdparties/freetype/freetype/ftmoderr.h
new file mode 100644
index 0000000000..4ca851ed98
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftmoderr.h
@@ -0,0 +1,194 @@
+/***************************************************************************/
+/* */
+/* ftmoderr.h */
+/* */
+/* FreeType module error offsets (specification). */
+/* */
+/* Copyright 2001-2005, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the FreeType module error codes. */
+ /* */
+ /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is */
+ /* set, the lower byte of an error value identifies the error code as */
+ /* usual. In addition, the higher byte identifies the module. For */
+ /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
+ /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error */
+ /* `T1_Err_Invalid_File_Format' has value 0x1403, etc. */
+ /* */
+ /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero, */
+ /* including the high byte. */
+ /* */
+ /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of */
+ /* an error value is set to zero. */
+ /* */
+ /* To hide the various `XXX_Err_' prefixes in the source code, FreeType */
+ /* provides some macros in `fttypes.h'. */
+ /* */
+ /* FT_ERR( err ) */
+ /* Add current error module prefix (as defined with the */
+ /* `FT_ERR_PREFIX' macro) to `err'. For example, in the BDF module */
+ /* the line */
+ /* */
+ /* error = FT_ERR( Invalid_Outline ); */
+ /* */
+ /* expands to */
+ /* */
+ /* error = BDF_Err_Invalid_Outline; */
+ /* */
+ /* For simplicity, you can always use `FT_Err_Ok' directly instead */
+ /* of `FT_ERR( Ok )'. */
+ /* */
+ /* FT_ERR_EQ( errcode, err ) */
+ /* FT_ERR_NEQ( errcode, err ) */
+ /* Compare error code `errcode' with the error `err' for equality */
+ /* and inequality, respectively. Example: */
+ /* */
+ /* if ( FT_ERR_EQ( error, Invalid_Outline ) ) */
+ /* ... */
+ /* */
+ /* Using this macro you don't have to think about error prefixes. */
+ /* Of course, if module errors are not active, the above example is */
+ /* the same as */
+ /* */
+ /* if ( error == FT_Err_Invalid_Outline ) */
+ /* ... */
+ /* */
+ /* FT_ERROR_BASE( errcode ) */
+ /* FT_ERROR_MODULE( errcode ) */
+ /* Get base error and module error code, respectively. */
+ /* */
+ /* */
+ /* It can also be used to create a module error message table easily */
+ /* with something like */
+ /* */
+ /* { */
+ /* #undef __FTMODERR_H__ */
+ /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */
+ /* #define FT_MODERR_START_LIST { */
+ /* #define FT_MODERR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int mod_err_offset; */
+ /* const char* mod_err_msg */
+ /* } ft_mod_errors[] = */
+ /* */
+ /* #include "ftmoderr.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST enum {
+#define FT_MODERR_END_LIST FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST MODULE ERROR BASES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+ FT_MODERR_START_LIST
+#endif
+
+
+ FT_MODERRDEF( Base, 0x000, "base module" )
+ FT_MODERRDEF( Autofit, 0x100, "autofitter module" )
+ FT_MODERRDEF( BDF, 0x200, "BDF module" )
+ FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" )
+ FT_MODERRDEF( Cache, 0x400, "cache module" )
+ FT_MODERRDEF( CFF, 0x500, "CFF module" )
+ FT_MODERRDEF( CID, 0x600, "CID module" )
+ FT_MODERRDEF( Gzip, 0x700, "Gzip module" )
+ FT_MODERRDEF( LZW, 0x800, "LZW module" )
+ FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" )
+ FT_MODERRDEF( PCF, 0xA00, "PCF module" )
+ FT_MODERRDEF( PFR, 0xB00, "PFR module" )
+ FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" )
+ FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" )
+ FT_MODERRDEF( PSnames, 0xE00, "PS names module" )
+ FT_MODERRDEF( Raster, 0xF00, "raster module" )
+ FT_MODERRDEF( SFNT, 0x1000, "SFNT module" )
+ FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" )
+ FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+ FT_MODERRDEF( Type1, 0x1300, "Type 1 module" )
+ FT_MODERRDEF( Type42, 0x1400, "Type 42 module" )
+ FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+ FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" )
+
+
+#ifdef FT_MODERR_END_LIST
+ FT_MODERR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftotval.h b/core/include/thirdparties/freetype/freetype/ftotval.h
new file mode 100644
index 0000000000..e33e307c15
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftotval.h
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/* */
+/* ftotval.h */
+/* */
+/* FreeType API for validating OpenType tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* */
+/* Warning: This module might be moved to a different library in the */
+/* future to avoid a tight dependency between FreeType and the */
+/* OpenType specification. */
+/* */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* ot_validation */
+ /* */
+ /* <Title> */
+ /* OpenType Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate OpenType tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_OTXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_OpenType_Validate to
+ * indicate which OpenType tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_BASE ::
+ * Validate BASE table.
+ *
+ * FT_VALIDATE_GDEF ::
+ * Validate GDEF table.
+ *
+ * FT_VALIDATE_GPOS ::
+ * Validate GPOS table.
+ *
+ * FT_VALIDATE_GSUB ::
+ * Validate GSUB table.
+ *
+ * FT_VALIDATE_JSTF ::
+ * Validate JSTF table.
+ *
+ * FT_VALIDATE_MATH ::
+ * Validate MATH table.
+ *
+ * FT_VALIDATE_OT ::
+ * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+ *
+ */
+#define FT_VALIDATE_BASE 0x0100
+#define FT_VALIDATE_GDEF 0x0200
+#define FT_VALIDATE_GPOS 0x0400
+#define FT_VALIDATE_GSUB 0x0800
+#define FT_VALIDATE_JSTF 0x1000
+#define FT_VALIDATE_MATH 0x2000
+
+#define FT_VALIDATE_OT FT_VALIDATE_BASE | \
+ FT_VALIDATE_GDEF | \
+ FT_VALIDATE_GPOS | \
+ FT_VALIDATE_GSUB | \
+ FT_VALIDATE_JSTF | \
+ FT_VALIDATE_MATH
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Validate
+ *
+ * @description:
+ * Validate various OpenType tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_OTXXX for possible values.
+ *
+ * @output:
+ * BASE_table ::
+ * A pointer to the BASE table.
+ *
+ * GDEF_table ::
+ * A pointer to the GDEF table.
+ *
+ * GPOS_table ::
+ * A pointer to the GPOS table.
+ *
+ * GSUB_table ::
+ * A pointer to the GSUB table.
+ *
+ * JSTF_table ::
+ * A pointer to the JSTF table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with OpenType fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the five tables with
+ * @FT_OpenType_Free. A NULL value indicates that the table either
+ * doesn't exist in the font, or the application hasn't asked for
+ * validation.
+ */
+ FT_EXPORT( FT_Error )
+ FT_OpenType_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *BASE_table,
+ FT_Bytes *GDEF_table,
+ FT_Bytes *GPOS_table,
+ FT_Bytes *GSUB_table,
+ FT_Bytes *JSTF_table );
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Free
+ *
+ * @description:
+ * Free the buffer allocated by OpenType validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_OpenType_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_OpenType_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_OpenType_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftoutln.h b/core/include/thirdparties/freetype/freetype/ftoutln.h
new file mode 100644
index 0000000000..ca94947af5
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftoutln.h
@@ -0,0 +1,560 @@
+/***************************************************************************/
+/* */
+/* ftoutln.h */
+/* */
+/* Support for the FT_Outline type used to store glyph shapes of */
+/* most scalable font formats (specification). */
+/* */
+/* Copyright 1996-2003, 2005-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /* <Title> */
+ /* Outline Processing */
+ /* */
+ /* <Abstract> */
+ /* Functions to create, transform, and render vectorial glyph images. */
+ /* */
+ /* <Description> */
+ /* This section contains routines used to create and destroy scalable */
+ /* glyph images known as `outlines'. These can also be measured, */
+ /* transformed, and converted into bitmaps and pixmaps. */
+ /* */
+ /* <Order> */
+ /* FT_Outline */
+ /* FT_OUTLINE_FLAGS */
+ /* FT_Outline_New */
+ /* FT_Outline_Done */
+ /* FT_Outline_Copy */
+ /* FT_Outline_Translate */
+ /* FT_Outline_Transform */
+ /* FT_Outline_Embolden */
+ /* FT_Outline_EmboldenXY */
+ /* FT_Outline_Reverse */
+ /* FT_Outline_Check */
+ /* */
+ /* FT_Outline_Get_CBox */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* FT_Outline_Get_Bitmap */
+ /* FT_Outline_Render */
+ /* */
+ /* FT_Outline_Decompose */
+ /* FT_Outline_Funcs */
+ /* FT_Outline_MoveTo_Func */
+ /* FT_Outline_LineTo_Func */
+ /* FT_Outline_ConicTo_Func */
+ /* FT_Outline_CubicTo_Func */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walk over an outline's structure to decompose it into individual */
+ /* segments and Bézier arcs. This function also emits `move to' */
+ /* operations to indicate the start of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* func_interface :: A table of `emitters', i.e., function pointers */
+ /* called during decomposition to indicate path */
+ /* operations. */
+ /* */
+ /* <InOut> */
+ /* user :: A typeless pointer which is passed to each */
+ /* emitter during the decomposition. It can be */
+ /* used to store the state during the */
+ /* decomposition. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Decompose( FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_New */
+ /* */
+ /* <Description> */
+ /* Create a new outline of a given size. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object from where the */
+ /* outline is allocated. Note however that the new */
+ /* outline will *not* necessarily be *freed*, when */
+ /* destroying the library, by @FT_Done_FreeType. */
+ /* */
+ /* numPoints :: The maximum number of points within the outline. */
+ /* Must be smaller than or equal to 0xFFFF (65535). */
+ /* */
+ /* numContours :: The maximum number of contours within the outline. */
+ /* This value must be in the range 0 to `numPoints'. */
+ /* */
+ /* <Output> */
+ /* anoutline :: A handle to the new outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' parameter is simply */
+ /* to use the library's memory allocator. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_New_Internal( FT_Memory memory,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Done */
+ /* */
+ /* <Description> */
+ /* Destroy an outline created with @FT_Outline_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle of the library object used to allocate the */
+ /* outline. */
+ /* */
+ /* outline :: A pointer to the outline object to be discarded. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the outline's `owner' field is not set, only the outline */
+ /* descriptor will be released. */
+ /* */
+ /* The reason why this function takes an `library' parameter is */
+ /* simply to use ft_mem_free(). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done( FT_Library library,
+ FT_Outline* outline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done_Internal( FT_Memory memory,
+ FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Check */
+ /* */
+ /* <Description> */
+ /* Check the contents of an outline descriptor. */
+ /* */
+ /* <Input> */
+ /* outline :: A handle to a source outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Check( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return an outline's `control box'. The control box encloses all */
+ /* the outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <Output> */
+ /* acbox :: The outline's control box. */
+ /* */
+ /* <Note> */
+ /* See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Get_CBox( const FT_Outline* outline,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Translate */
+ /* */
+ /* <Description> */
+ /* Apply a simple translation to the points of an outline. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* xOffset :: The horizontal offset. */
+ /* */
+ /* yOffset :: The vertical offset. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Translate( const FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Copy */
+ /* */
+ /* <Description> */
+ /* Copy an outline into another one. Both objects must have the */
+ /* same sizes (number of points & number of contours) when this */
+ /* function is called. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source outline. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Copy( const FT_Outline* source,
+ FT_Outline *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Transform */
+ /* */
+ /* <Description> */
+ /* Apply a simple 2x2 matrix to all of an outline's points. Useful */
+ /* for applying rotations, slanting, flipping, etc. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation matrix. */
+ /* */
+ /* <Note> */
+ /* You can use @FT_Outline_Translate if you need to translate the */
+ /* outline's points. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Transform( const FT_Outline* outline,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be at most 4~times */
+ /* `strength' pixels wider and higher. You may think of the left and */
+ /* bottom borders as unchanged. */
+ /* */
+ /* Negative `strength' values to reduce the outline thickness are */
+ /* possible also. */
+ /* */
+ /* <InOut> */
+ /* outline :: A handle to the target outline. */
+ /* */
+ /* <Input> */
+ /* strength :: How strong the glyph is emboldened. Expressed in */
+ /* 26.6 pixel format. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The used algorithm to increase or decrease the thickness of the */
+ /* glyph doesn't change the number of points; this means that certain */
+ /* situations like acute angles or intersections are sometimes */
+ /* handled incorrectly. */
+ /* */
+ /* If you need `better' metrics values you should call */
+ /* @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. */
+ /* */
+ /* Example call: */
+ /* */
+ /* { */
+ /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */
+ /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */
+ /* FT_Outline_Embolden( &face->slot->outline, strength ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Embolden( FT_Outline* outline,
+ FT_Pos strength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_EmboldenXY */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be `xstrength' pixels */
+ /* wider and `ystrength' pixels higher. Otherwise, it is similar to */
+ /* @FT_Outline_Embolden, which uses the same strength in both */
+ /* directions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_EmboldenXY( FT_Outline* outline,
+ FT_Pos xstrength,
+ FT_Pos ystrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Reverse */
+ /* */
+ /* <Description> */
+ /* Reverse the drawing direction of an outline. This is used to */
+ /* ensure consistent fill conventions for mirrored glyphs. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Note> */
+ /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */
+ /* the outline's `flags' field. */
+ /* */
+ /* It shouldn't be used by a normal client application, unless it */
+ /* knows what it is doing. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Reverse( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_Bitmap */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap. The outline's image is simply */
+ /* OR-ed to the target bitmap. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the target bitmap descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does NOT CREATE the bitmap, it only renders an */
+ /* outline image within the one you pass to it! Consequently, the */
+ /* various fields in `abitmap' should be set accordingly. */
+ /* */
+ /* It will use the raster corresponding to the default glyph format. */
+ /* */
+ /* The value of the `num_grays' field in `abitmap' is ignored. If */
+ /* you select the gray-level rasterizer, and you want less than 256 */
+ /* gray levels, you have to use @FT_Outline_Render directly. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ const FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Render */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap using the current scan-convert. */
+ /* This function uses an @FT_Raster_Params structure as an argument, */
+ /* allowing advanced features like direct composition, translucency, */
+ /* etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* describe the rendering operation. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should know what you are doing and how @FT_Raster_Params works */
+ /* to use this function. */
+ /* */
+ /* The field `params.source' will be set to `outline' before the scan */
+ /* converter is called, which means that the value you give to it is */
+ /* actually ignored. */
+ /* */
+ /* The gray-level rasterizer always uses 256 gray levels. If you */
+ /* want less gray levels, you have to provide your own span callback. */
+ /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */
+ /* @FT_Raster_Params structure for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params );
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_Orientation
+ *
+ * @description:
+ * A list of values used to describe an outline's contour orientation.
+ *
+ * The TrueType and PostScript specifications use different conventions
+ * to determine whether outline contours should be filled or unfilled.
+ *
+ * @values:
+ * FT_ORIENTATION_TRUETYPE ::
+ * According to the TrueType specification, clockwise contours must
+ * be filled, and counter-clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_POSTSCRIPT ::
+ * According to the PostScript specification, counter-clockwise contours
+ * must be filled, and clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_FILL_RIGHT ::
+ * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+ * remember that in TrueType, everything that is to the right of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_FILL_LEFT ::
+ * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+ * remember that in PostScript, everything that is to the left of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_NONE ::
+ * The orientation cannot be determined. That is, different parts of
+ * the glyph have different orientation.
+ *
+ */
+ typedef enum FT_Orientation_
+ {
+ FT_ORIENTATION_TRUETYPE = 0,
+ FT_ORIENTATION_POSTSCRIPT = 1,
+ FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+ FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT,
+ FT_ORIENTATION_NONE
+
+ } FT_Orientation;
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Outline_Get_Orientation
+ *
+ * @description:
+ * This function analyzes a glyph outline and tries to compute its
+ * fill orientation (see @FT_Orientation). This is done by computing
+ * the direction of each global horizontal and/or vertical extrema
+ * within the outline.
+ *
+ * Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+ * outlines.
+ *
+ * @input:
+ * outline ::
+ * A handle to the source outline.
+ *
+ * @return:
+ * The orientation.
+ *
+ */
+ FT_EXPORT( FT_Orientation )
+ FT_Outline_Get_Orientation( FT_Outline* outline );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftpfr.h b/core/include/thirdparties/freetype/freetype/ftpfr.h
new file mode 100644
index 0000000000..62cd67e876
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftpfr.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/* */
+/* ftpfr.h */
+/* */
+/* FreeType API for accessing PFR-specific data (specification only). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* pfr_fonts */
+ /* */
+ /* <Title> */
+ /* PFR Fonts */
+ /* */
+ /* <Abstract> */
+ /* PFR/TrueDoc specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of PFR-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Metrics
+ *
+ * @description:
+ * Return the outline and metrics resolutions of a given PFR face.
+ *
+ * @input:
+ * face :: Handle to the input face. It can be a non-PFR face.
+ *
+ * @output:
+ * aoutline_resolution ::
+ * Outline resolution. This is equivalent to `face->units_per_EM'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_resolution ::
+ * Metrics resolution. This is equivalent to `outline_resolution'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_x_scale ::
+ * A 16.16 fixed-point number used to scale distance expressed
+ * in metrics units to device sub-pixels. This is equivalent to
+ * `face->size->x_scale', but for metrics only. Optional (parameter
+ * can be NULL).
+ *
+ * ametrics_y_scale ::
+ * Same as `ametrics_x_scale' but for the vertical direction.
+ * optional (parameter can be NULL).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If the input face is not a PFR, this function will return an error.
+ * However, in all cases, it will return valid values.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Metrics( FT_Face face,
+ FT_UInt *aoutline_resolution,
+ FT_UInt *ametrics_resolution,
+ FT_Fixed *ametrics_x_scale,
+ FT_Fixed *ametrics_y_scale );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Kerning
+ *
+ * @description:
+ * Return the kerning pair corresponding to two glyphs in a PFR face.
+ * The distance is expressed in metrics units, unlike the result of
+ * @FT_Get_Kerning.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * left :: Index of the left glyph.
+ *
+ * right :: Index of the right glyph.
+ *
+ * @output:
+ * avector :: A kerning vector.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function always return distances in original PFR metrics
+ * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+ * mode, which always returns distances converted to outline units.
+ *
+ * You can use the value of the `x_scale' and `y_scale' parameters
+ * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Kerning( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Advance
+ *
+ * @description:
+ * Return a given glyph advance, expressed in original metrics units,
+ * from a PFR font.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * gindex :: The glyph index.
+ *
+ * @output:
+ * aadvance :: The glyph advance in metrics units.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+ * to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftrender.h b/core/include/thirdparties/freetype/freetype/ftrender.h
new file mode 100644
index 0000000000..b1437df76f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftrender.h
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/* */
+/* ftrender.h */
+/* */
+/* FreeType renderer modules public interface (specification). */
+/* */
+/* Copyright 1996-2001, 2005, 2006, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include "../ft2build.h"
+#include "ftmodapi.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /*************************************************************************/
+
+
+ /* create a new glyph object */
+ typedef FT_Error
+ (*FT_Glyph_InitFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+ /* destroys a given glyph object */
+ typedef void
+ (*FT_Glyph_DoneFunc)( FT_Glyph glyph );
+
+ typedef void
+ (*FT_Glyph_TransformFunc)( FT_Glyph glyph,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+ typedef void
+ (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph,
+ FT_BBox* abbox );
+
+ typedef FT_Error
+ (*FT_Glyph_CopyFunc)( FT_Glyph source,
+ FT_Glyph target );
+
+ typedef FT_Error
+ (*FT_Glyph_PrepareFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc
+
+
+ struct FT_Glyph_Class_
+ {
+ FT_Long glyph_size;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_InitFunc glyph_init;
+ FT_Glyph_DoneFunc glyph_done;
+ FT_Glyph_CopyFunc glyph_copy;
+ FT_Glyph_TransformFunc glyph_transform;
+ FT_Glyph_GetBBoxFunc glyph_bbox;
+ FT_Glyph_PrepareFunc glyph_prepare;
+ };
+
+
+ typedef FT_Error
+ (*FT_Renderer_RenderFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_UInt mode,
+ const FT_Vector* origin );
+
+ typedef FT_Error
+ (*FT_Renderer_TransformFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+
+ typedef void
+ (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox );
+
+
+ typedef FT_Error
+ (*FT_Renderer_SetModeFunc)( FT_Renderer renderer,
+ FT_ULong mode_tag,
+ FT_Pointer mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render FT_Renderer_RenderFunc
+#define FTRenderer_transform FT_Renderer_TransformFunc
+#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode FT_Renderer_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Renderer_Class */
+ /* */
+ /* <Description> */
+ /* The renderer module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Module_Class fields. */
+ /* */
+ /* glyph_format :: The glyph image format this renderer handles. */
+ /* */
+ /* render_glyph :: A method used to render the image that is in a */
+ /* given glyph slot into a bitmap. */
+ /* */
+ /* transform_glyph :: A method used to transform the image that is in */
+ /* a given glyph slot. */
+ /* */
+ /* get_glyph_cbox :: A method used to access the glyph's cbox. */
+ /* */
+ /* set_mode :: A method used to pass additional parameters. */
+ /* */
+ /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */
+ /* This is a pointer to its raster's class. */
+ /* */
+ typedef struct FT_Renderer_Class_
+ {
+ FT_Module_Class root;
+
+ FT_Glyph_Format glyph_format;
+
+ FT_Renderer_RenderFunc render_glyph;
+ FT_Renderer_TransformFunc transform_glyph;
+ FT_Renderer_GetCBoxFunc get_glyph_cbox;
+ FT_Renderer_SetModeFunc set_mode;
+
+ FT_Raster_Funcs* raster_class;
+
+ } FT_Renderer_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Renderer */
+ /* */
+ /* <Description> */
+ /* Retrieve the current renderer for a given glyph format. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* format :: The glyph format. */
+ /* */
+ /* <Return> */
+ /* A renderer handle. 0~if none found. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */
+ /* renderer by its name, use @FT_Get_Module. */
+ /* */
+ FT_EXPORT( FT_Renderer )
+ FT_Get_Renderer( FT_Library library,
+ FT_Glyph_Format format );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Renderer */
+ /* */
+ /* <Description> */
+ /* Set the current renderer to use, and set additional mode. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* renderer :: A handle to the renderer object. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* parameters :: Additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case of success, the renderer will be used to convert glyph */
+ /* images in the renderer's known format into bitmaps. */
+ /* */
+ /* This doesn't change the current renderer for other formats. */
+ /* */
+ /* Currently, only the B/W renderer, if compiled with */
+ /* FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels */
+ /* anti-aliasing mode; this option must be set directly in */
+ /* `ftraster.c' and is undefined by default) accepts a single tag */
+ /* `pal5' to set its gray palette as a character string with */
+ /* 5~elements. Consequently, the third and fourth argument are zero */
+ /* normally. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Renderer( FT_Library library,
+ FT_Renderer renderer,
+ FT_UInt num_params,
+ FT_Parameter* parameters );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsizes.h b/core/include/thirdparties/freetype/freetype/ftsizes.h
new file mode 100644
index 0000000000..a4b449bcdb
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsizes.h
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/* */
+/* ftsizes.h */
+/* */
+/* FreeType size objects management (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Typical application would normally not need to use these functions. */
+ /* However, they have been placed in a public API for the rare cases */
+ /* where they are needed. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sizes_management */
+ /* */
+ /* <Title> */
+ /* Size Management */
+ /* */
+ /* <Abstract> */
+ /* Managing multiple sizes per face. */
+ /* */
+ /* <Description> */
+ /* When creating a new face object (e.g., with @FT_New_Face), an */
+ /* @FT_Size object is automatically created and used to store all */
+ /* pixel-size dependent information, available in the `face->size' */
+ /* field. */
+ /* */
+ /* It is however possible to create more sizes for a given face, */
+ /* mostly in order to manage several character pixel sizes of the */
+ /* same font family and style. See @FT_New_Size and @FT_Done_Size. */
+ /* */
+ /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */
+ /* modify the contents of the current `active' size; you thus need */
+ /* to use @FT_Activate_Size to change it. */
+ /* */
+ /* 99% of applications won't need the functions provided here, */
+ /* especially if they use the caching sub-system, so be cautious */
+ /* when using these. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Size */
+ /* */
+ /* <Description> */
+ /* Create a new size object from a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to a new size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You need to call @FT_Activate_Size in order to select the new size */
+ /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */
+ /* @FT_Load_Glyph, @FT_Load_Char, etc. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Size( FT_Face face,
+ FT_Size* size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Size */
+ /* */
+ /* <Description> */
+ /* Discard a given size object. Note that @FT_Done_Face */
+ /* automatically discards all size objects allocated with */
+ /* @FT_New_Size. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Size( FT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Activate_Size */
+ /* */
+ /* <Description> */
+ /* Even though it is possible to create several size objects for a */
+ /* given face (see @FT_New_Size for details), functions like */
+ /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */
+ /* activated last to determine the `current character pixel size'. */
+ /* */
+ /* This function can be used to `activate' a previously created size */
+ /* object. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If `face' is the size's parent face object, this function changes */
+ /* the value of `face->size' to the input size handle. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Activate_Size( FT_Size size );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsnames.h b/core/include/thirdparties/freetype/freetype/ftsnames.h
new file mode 100644
index 0000000000..a13db81187
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsnames.h
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/* */
+/* ftsnames.h */
+/* */
+/* Simple interface to access SFNT name tables (which are used */
+/* to hold font names, copyright info, notices, etc.) (specification). */
+/* */
+/* This is _not_ used to retrieve glyph names! */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sfnt_names */
+ /* */
+ /* <Title> */
+ /* SFNT Names */
+ /* */
+ /* <Abstract> */
+ /* Access the names embedded in TrueType and OpenType files. */
+ /* */
+ /* <Description> */
+ /* The TrueType and OpenType specifications allow the inclusion of */
+ /* a special `names table' in font files. This table contains */
+ /* textual (and internationalized) information regarding the font, */
+ /* like family name, copyright, version, etc. */
+ /* */
+ /* The definitions below are used to access them if available. */
+ /* */
+ /* Note that this has nothing to do with glyph names! */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SfntName */
+ /* */
+ /* <Description> */
+ /* A structure used to model an SFNT `name' table entry. */
+ /* */
+ /* <Fields> */
+ /* platform_id :: The platform ID for `string'. */
+ /* */
+ /* encoding_id :: The encoding ID for `string'. */
+ /* */
+ /* language_id :: The language ID for `string'. */
+ /* */
+ /* name_id :: An identifier for `string'. */
+ /* */
+ /* string :: The `name' string. Note that its format differs */
+ /* depending on the (platform,encoding) pair. It can */
+ /* be a Pascal String, a UTF-16 one, etc. */
+ /* */
+ /* Generally speaking, the string is not */
+ /* zero-terminated. Please refer to the TrueType */
+ /* specification for details. */
+ /* */
+ /* string_len :: The length of `string' in bytes. */
+ /* */
+ /* <Note> */
+ /* Possible values for `platform_id', `encoding_id', `language_id', */
+ /* and `name_id' are given in the file `ttnameid.h'. For details */
+ /* please refer to the TrueType or OpenType specification. */
+ /* */
+ /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */
+ /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */
+ /* */
+ typedef struct FT_SfntName_
+ {
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+ FT_UShort language_id;
+ FT_UShort name_id;
+
+ FT_Byte* string; /* this string is *not* null-terminated! */
+ FT_UInt string_len; /* in bytes */
+
+ } FT_SfntName;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name_Count */
+ /* */
+ /* <Description> */
+ /* Retrieve the number of name strings in the SFNT `name' table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Return> */
+ /* The number of strings in the `name' table. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Sfnt_Name_Count( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve a string of the SFNT `name' table for a given index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* idx :: The index of the `name' string. */
+ /* */
+ /* <Output> */
+ /* aname :: The indexed @FT_SfntName structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `string' array returned in the `aname' structure is not */
+ /* null-terminated. The application should deallocate it if it is no */
+ /* longer in use. */
+ /* */
+ /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */
+ /* `name' table entries, then do a loop until you get the right */
+ /* platform, encoding, and name ID. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Sfnt_Name( FT_Face face,
+ FT_UInt idx,
+ FT_SfntName *aname );
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred family subfamily names in `name'
+ * table since OpenType version 1.4. For backwards compatibility with
+ * legacy systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred subfamily names in `name' table since
+ * OpenType version 1.4. For backwards compatibility with legacy
+ * systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftstroke.h b/core/include/thirdparties/freetype/freetype/ftstroke.h
new file mode 100644
index 0000000000..05f9a132f6
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftstroke.h
@@ -0,0 +1,751 @@
+/***************************************************************************/
+/* */
+/* ftstroke.h */
+/* */
+/* FreeType path stroker (specification). */
+/* */
+/* Copyright 2002-2006, 2008, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include "../ft2build.h"
+#include "ftoutln.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+ *
+ * @section:
+ * glyph_stroker
+ *
+ * @title:
+ * Glyph Stroker
+ *
+ * @abstract:
+ * Generating bordered and stroked glyphs.
+ *
+ * @description:
+ * This component generates stroked outlines of a given vectorial
+ * glyph. It also allows you to retrieve the `outside' and/or the
+ * `inside' borders of the stroke.
+ *
+ * This can be useful to generate `bordered' glyph, i.e., glyphs
+ * displayed with a coloured (and anti-aliased) border around their
+ * shape.
+ */
+
+
+ /**************************************************************
+ *
+ * @type:
+ * FT_Stroker
+ *
+ * @description:
+ * Opaque handler to a path stroker object.
+ */
+ typedef struct FT_StrokerRec_* FT_Stroker;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineJoin
+ *
+ * @description:
+ * These values determine how two joining lines are rendered
+ * in a stroker.
+ *
+ * @values:
+ * FT_STROKER_LINEJOIN_ROUND ::
+ * Used to render rounded line joins. Circular arcs are used
+ * to join two lines smoothly.
+ *
+ * FT_STROKER_LINEJOIN_BEVEL ::
+ * Used to render beveled line joins. The outer corner of
+ * the joined lines is filled by enclosing the triangular
+ * region of the corner with a straight line between the
+ * outer corners of each stroke.
+ *
+ * FT_STROKER_LINEJOIN_MITER_FIXED ::
+ * Used to render mitered line joins, with fixed bevels if the
+ * miter limit is exceeded. The outer edges of the strokes
+ * for the two segments are extended until they meet at an
+ * angle. If the segments meet at too sharp an angle (such
+ * that the miter would extend from the intersection of the
+ * segments a distance greater than the product of the miter
+ * limit value and the border radius), then a bevel join (see
+ * above) is used instead. This prevents long spikes being
+ * created. FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+ * line join as used in PostScript and PDF.
+ *
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+ * FT_STROKER_LINEJOIN_MITER ::
+ * Used to render mitered line joins, with variable bevels if
+ * the miter limit is exceeded. The intersection of the
+ * strokes is clipped at a line perpendicular to the bisector
+ * of the angle between the strokes, at the distance from the
+ * intersection of the segments equal to the product of the
+ * miter limit value and the border radius. This prevents
+ * long spikes being created.
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+ * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias
+ * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+ * backwards compatibility.
+ */
+ typedef enum FT_Stroker_LineJoin_
+ {
+ FT_STROKER_LINEJOIN_ROUND = 0,
+ FT_STROKER_LINEJOIN_BEVEL = 1,
+ FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+ FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+ FT_STROKER_LINEJOIN_MITER_FIXED = 3
+
+ } FT_Stroker_LineJoin;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineCap
+ *
+ * @description:
+ * These values determine how the end of opened sub-paths are
+ * rendered in a stroke.
+ *
+ * @values:
+ * FT_STROKER_LINECAP_BUTT ::
+ * The end of lines is rendered as a full stop on the last
+ * point itself.
+ *
+ * FT_STROKER_LINECAP_ROUND ::
+ * The end of lines is rendered as a half-circle around the
+ * last point.
+ *
+ * FT_STROKER_LINECAP_SQUARE ::
+ * The end of lines is rendered as a square around the
+ * last point.
+ */
+ typedef enum FT_Stroker_LineCap_
+ {
+ FT_STROKER_LINECAP_BUTT = 0,
+ FT_STROKER_LINECAP_ROUND,
+ FT_STROKER_LINECAP_SQUARE
+
+ } FT_Stroker_LineCap;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_StrokerBorder
+ *
+ * @description:
+ * These values are used to select a given stroke border
+ * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+ *
+ * @values:
+ * FT_STROKER_BORDER_LEFT ::
+ * Select the left border, relative to the drawing direction.
+ *
+ * FT_STROKER_BORDER_RIGHT ::
+ * Select the right border, relative to the drawing direction.
+ *
+ * @note:
+ * Applications are generally interested in the `inside' and `outside'
+ * borders. However, there is no direct mapping between these and the
+ * `left' and `right' ones, since this really depends on the glyph's
+ * drawing orientation, which varies between font formats.
+ *
+ * You can however use @FT_Outline_GetInsideBorder and
+ * @FT_Outline_GetOutsideBorder to get these.
+ */
+ typedef enum FT_StrokerBorder_
+ {
+ FT_STROKER_BORDER_LEFT = 0,
+ FT_STROKER_BORDER_RIGHT
+
+ } FT_StrokerBorder;
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetInsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `inside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetInsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetOutsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `outside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetOutsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_New
+ *
+ * @description:
+ * Create a new stroker object.
+ *
+ * @input:
+ * library ::
+ * FreeType library handle.
+ *
+ * @output:
+ * astroker ::
+ * A new stroker object handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_New( FT_Library library,
+ FT_Stroker *astroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Set
+ *
+ * @description:
+ * Reset a stroker object's attributes.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * radius ::
+ * The border radius.
+ *
+ * line_cap ::
+ * The line cap style.
+ *
+ * line_join ::
+ * The line join style.
+ *
+ * miter_limit ::
+ * The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+ * expressed as 16.16 fixed-point value.
+ *
+ * @note:
+ * The radius is expressed in the same units as the outline
+ * coordinates.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Set( FT_Stroker stroker,
+ FT_Fixed radius,
+ FT_Stroker_LineCap line_cap,
+ FT_Stroker_LineJoin line_join,
+ FT_Fixed miter_limit );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Rewind
+ *
+ * @description:
+ * Reset a stroker object without changing its attributes.
+ * You should call this function before beginning a new
+ * series of calls to @FT_Stroker_BeginSubPath or
+ * @FT_Stroker_EndSubPath.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Rewind( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ParseOutline
+ *
+ * @description:
+ * A convenience function used to parse a whole outline with
+ * the stroker. The resulting outline(s) can be retrieved
+ * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The source outline.
+ *
+ * opened ::
+ * A boolean. If~1, the outline is treated as an open path instead
+ * of a closed one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `opened' is~0 (the default), the outline is treated as a closed
+ * path, and the stroker generates two distinct `border' outlines.
+ *
+ * If `opened' is~1, the outline is processed as an open path, and the
+ * stroker generates a single `stroke' outline.
+ *
+ * This function calls @FT_Stroker_Rewind automatically.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ParseOutline( FT_Stroker stroker,
+ FT_Outline* outline,
+ FT_Bool opened );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_BeginSubPath
+ *
+ * @description:
+ * Start a new sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the start vector.
+ *
+ * open ::
+ * A boolean. If~1, the sub-path is treated as an open one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function is useful when you need to stroke a path that is
+ * not stored as an @FT_Outline object.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_BeginSubPath( FT_Stroker stroker,
+ FT_Vector* to,
+ FT_Bool open );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_EndSubPath
+ *
+ * @description:
+ * Close the current sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function after @FT_Stroker_BeginSubPath.
+ * If the subpath was not `opened', this function `draws' a
+ * single line segment to the start position when needed.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_EndSubPath( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_LineTo
+ *
+ * @description:
+ * `Draw' a single line segment in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_LineTo( FT_Stroker stroker,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ConicTo
+ *
+ * @description:
+ * `Draw' a single quadratic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control ::
+ * A pointer to a Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ConicTo( FT_Stroker stroker,
+ FT_Vector* control,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_CubicTo
+ *
+ * @description:
+ * `Draw' a single cubic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control1 ::
+ * A pointer to the first Bézier control point.
+ *
+ * control2 ::
+ * A pointer to second Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_CubicTo( FT_Stroker stroker,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetBorderCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export one of the `border' or `stroke'
+ * outlines generated by the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'.
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_GetCounts instead if you want to
+ * retrieve the counts associated to both borders.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetBorderCounts( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ExportBorder
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export the corresponding border to your own @FT_Outline
+ * structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * outline ::
+ * The target outline handle.
+ *
+ * @note:
+ * Always call this function after @FT_Stroker_GetBorderCounts to
+ * get sure that there is enough room in your @FT_Outline object to
+ * receive all new data.
+ *
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_Export instead if you want to
+ * retrieve all borders at once.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_ExportBorder( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export all points/borders from the stroked
+ * outline/path.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetCounts( FT_Stroker stroker,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Export
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export all borders to your own @FT_Outline structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The target outline handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Export( FT_Stroker stroker,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Done
+ *
+ * @description:
+ * Destroy a stroker object.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle. Can be NULL.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Done( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_Stroke
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Stroke( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool destroy );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_StrokeBorder
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker, but
+ * only return either its inside or outside border.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * inside ::
+ * A Boolean. If~1, return the inside border, otherwise
+ * the outside border.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_StrokeBorder( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool inside,
+ FT_Bool destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftsynth.h b/core/include/thirdparties/freetype/freetype/ftsynth.h
new file mode 100644
index 0000000000..55f32d6956
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsynth.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* ftsynth.h */
+/* */
+/* FreeType synthesizing code for emboldening and slanting */
+/* (specification). */
+/* */
+/* Copyright 2000-2001, 2003, 2006, 2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********* *********/
+ /********* WARNING, THIS IS ALPHA CODE! THIS API *********/
+ /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/
+ /********* FREETYPE DEVELOPMENT TEAM *********/
+ /********* *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* Main reason for not lifting the functions in this module to a */
+ /* `standard' API is that the used parameters for emboldening and */
+ /* slanting are not configurable. Consider the functions as a */
+ /* code resource which should be copied into the application and */
+ /* adapted to the particular needs. */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+ /* taste). This function is actually a convenience function, providing */
+ /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */
+ /* */
+ /* For emboldened outlines the height, width, and advance metrics are */
+ /* increased by the strength of the emboldening. You can also call */
+ /* @FT_Outline_Get_CBox to get precise values. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Embolden( FT_GlyphSlot slot );
+
+ /* Slant an outline glyph to the right by about 12 degrees. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Oblique( FT_GlyphSlot slot );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftsystem.h b/core/include/thirdparties/freetype/freetype/ftsystem.h
new file mode 100644
index 0000000000..6b41320aa8
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftsystem.h
@@ -0,0 +1,354 @@
+/***************************************************************************/
+/* */
+/* ftsystem.h */
+/* */
+/* FreeType low-level system interface definition (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* system_interface */
+ /* */
+ /* <Title> */
+ /* System Interface */
+ /* */
+ /* <Abstract> */
+ /* How FreeType manages memory and i/o. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to memory */
+ /* management and i/o access. You need to understand this */
+ /* information if you want to use a custom memory manager or you own */
+ /* i/o streams. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* M E M O R Y M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Memory
+ *
+ * @description:
+ * A handle to a given memory manager object, defined with an
+ * @FT_MemoryRec structure.
+ *
+ */
+ typedef struct FT_MemoryRec_* FT_Memory;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Alloc_Func
+ *
+ * @description:
+ * A function used to allocate `size' bytes from `memory'.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * size ::
+ * The size in bytes to allocate.
+ *
+ * @return:
+ * Address of new memory block. 0~in case of failure.
+ *
+ */
+ typedef void*
+ (*FT_Alloc_Func)( FT_Memory memory,
+ long size );
+
+ /* Sunliang.Liu 20100915 sync 221's revison. */
+ typedef void*
+ (*FT_AllocDebug_Func)( FT_Memory memory,
+ long size, const char* filename, int line);
+
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Free_Func
+ *
+ * @description:
+ * A function used to release a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * block ::
+ * The address of the target memory block.
+ *
+ */
+ typedef void
+ (*FT_Free_Func)( FT_Memory memory,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Realloc_Func
+ *
+ * @description:
+ * A function used to re-allocate a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * cur_size ::
+ * The block's current size in bytes.
+ *
+ * new_size ::
+ * The block's requested new size.
+ *
+ * block ::
+ * The block's current address.
+ *
+ * @return:
+ * New block address. 0~in case of memory shortage.
+ *
+ * @note:
+ * In case of error, the old block must still be available.
+ *
+ */
+ typedef void*
+ (*FT_Realloc_Func)( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_MemoryRec
+ *
+ * @description:
+ * A structure used to describe a given memory manager to FreeType~2.
+ *
+ * @fields:
+ * user ::
+ * A generic typeless pointer for user data.
+ *
+ * alloc ::
+ * A pointer type to an allocation function.
+ *
+ * free ::
+ * A pointer type to an memory freeing function.
+ *
+ * realloc ::
+ * A pointer type to a reallocation function.
+ *
+ */
+ struct FT_MemoryRec_
+ {
+ void* user;
+ FT_Alloc_Func alloc;
+ FT_AllocDebug_Func allocdebug; /* Sunliang.Liu 20100915 sync 221's revison. */
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* I / O M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Stream
+ *
+ * @description:
+ * A handle to an input stream.
+ *
+ */
+ typedef struct FT_StreamRec_* FT_Stream;
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamDesc
+ *
+ * @description:
+ * A union type used to store either a long or a pointer. This is used
+ * to store a file descriptor or a `FILE*' in an input stream.
+ *
+ */
+ typedef union FT_StreamDesc_
+ {
+ long value;
+ void* pointer;
+
+ } FT_StreamDesc;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_IoFunc
+ *
+ * @description:
+ * A function used to seek and read data from a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the source stream.
+ *
+ * offset ::
+ * The offset of read in stream (always from start).
+ *
+ * buffer ::
+ * The address of the read buffer.
+ *
+ * count ::
+ * The number of bytes to read from the stream.
+ *
+ * @return:
+ * The number of bytes effectively read by the stream.
+ *
+ * @note:
+ * This function might be called to perform a seek or skip operation
+ * with a `count' of~0. A non-zero return value then indicates an
+ * error.
+ *
+ */
+ typedef unsigned long
+ (*FT_Stream_IoFunc)( FT_Stream stream,
+ unsigned long offset,
+ unsigned char* buffer,
+ unsigned long count );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_CloseFunc
+ *
+ * @description:
+ * A function used to close a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the target stream.
+ *
+ */
+ typedef void
+ (*FT_Stream_CloseFunc)( FT_Stream stream );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamRec
+ *
+ * @description:
+ * A structure used to describe an input stream.
+ *
+ * @input:
+ * base ::
+ * For memory-based streams, this is the address of the first stream
+ * byte in memory. This field should always be set to NULL for
+ * disk-based streams.
+ *
+ * size ::
+ * The stream size in bytes.
+ *
+ * pos ::
+ * The current position within the stream.
+ *
+ * descriptor ::
+ * This field is a union that can hold an integer or a pointer. It is
+ * used by stream implementations to store file descriptors or `FILE*'
+ * pointers.
+ *
+ * pathname ::
+ * This field is completely ignored by FreeType. However, it is often
+ * useful during debugging to use it to store the stream's filename
+ * (where available).
+ *
+ * read ::
+ * The stream's input function.
+ *
+ * close ::
+ * The stream's close function.
+ *
+ * memory ::
+ * The memory manager to use to preload frames. This is set
+ * internally by FreeType and shouldn't be touched by stream
+ * implementations.
+ *
+ * cursor ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ * limit ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ */
+ typedef struct FT_StreamRec_
+ {
+ unsigned char* base;
+ unsigned long size;
+ unsigned long pos;
+
+ FT_StreamDesc descriptor;
+ FT_StreamDesc pathname;
+ FT_Stream_IoFunc read;
+ FT_Stream_CloseFunc close;
+
+ FT_Memory memory;
+ unsigned char* cursor;
+ unsigned char* limit;
+
+ } FT_StreamRec;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fttrigon.h b/core/include/thirdparties/freetype/freetype/fttrigon.h
new file mode 100644
index 0000000000..111c63edef
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fttrigon.h
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/* */
+/* fttrigon.h */
+/* */
+/* FreeType trigonometric functions (specification). */
+/* */
+/* Copyright 2001, 2003, 2005, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Angle
+ *
+ * @description:
+ * This type is used to model angle values in FreeType. Note that the
+ * angle is a 16.16 fixed-point value expressed in degrees.
+ *
+ */
+ typedef FT_Fixed FT_Angle;
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI
+ *
+ * @description:
+ * The angle pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI ( 180L << 16 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_2PI
+ *
+ * @description:
+ * The angle 2*pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI2
+ *
+ * @description:
+ * The angle pi/2 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI4
+ *
+ * @description:
+ * The angle pi/4 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 )
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Sin
+ *
+ * @description:
+ * Return the sinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The sinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Sin( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Cos
+ *
+ * @description:
+ * Return the cosinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The cosinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Cos( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Tan
+ *
+ * @description:
+ * Return the tangent of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The tangent value.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Tan( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Atan2
+ *
+ * @description:
+ * Return the arc-tangent corresponding to a given vector (x,y) in
+ * the 2d plane.
+ *
+ * @input:
+ * x ::
+ * The horizontal vector coordinate.
+ *
+ * y ::
+ * The vertical vector coordinate.
+ *
+ * @return:
+ * The arc-tangent value (i.e. angle).
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Atan2( FT_Fixed x,
+ FT_Fixed y );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Angle_Diff
+ *
+ * @description:
+ * Return the difference between two angles. The result is always
+ * constrained to the ]-PI..PI] interval.
+ *
+ * @input:
+ * angle1 ::
+ * First angle.
+ *
+ * angle2 ::
+ * Second angle.
+ *
+ * @return:
+ * Constrained value of `value2-value1'.
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Angle_Diff( FT_Angle angle1,
+ FT_Angle angle2 );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Unit
+ *
+ * @description:
+ * Return the unit vector corresponding to a given angle. After the
+ * call, the value of `vec.x' will be `sin(angle)', and the value of
+ * `vec.y' will be `cos(angle)'.
+ *
+ * This function is useful to retrieve both the sinus and cosinus of a
+ * given angle quickly.
+ *
+ * @output:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Unit( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Rotate
+ *
+ * @description:
+ * Rotate a vector by a given angle.
+ *
+ * @inout:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Rotate( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Length
+ *
+ * @description:
+ * Return the length of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of target vector.
+ *
+ * @return:
+ * The vector length, expressed in the same units that the original
+ * vector coordinates.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Vector_Length( FT_Vector* vec );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Polarize
+ *
+ * @description:
+ * Compute both the length and angle of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of source vector.
+ *
+ * @output:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Polarize( FT_Vector* vec,
+ FT_Fixed *length,
+ FT_Angle *angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_From_Polar
+ *
+ * @description:
+ * Compute vector coordinates from a length and angle.
+ *
+ * @output:
+ * vec ::
+ * The address of source vector.
+ *
+ * @input:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_From_Polar( FT_Vector* vec,
+ FT_Fixed length,
+ FT_Angle angle );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftttdrv.h b/core/include/thirdparties/freetype/freetype/ftttdrv.h
new file mode 100644
index 0000000000..01b25a4808
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftttdrv.h
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/* */
+/* ftttdrv.h */
+/* */
+/* FreeType API for controlling the TrueType driver */
+/* (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTTDRV_H__
+#define __FTTTDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * tt_driver
+ *
+ * @title:
+ * The TrueType driver
+ *
+ * @abstract:
+ * Controlling the TrueType driver module.
+ *
+ * @description:
+ * While FreeType's TrueType driver doesn't expose API functions by
+ * itself, it is possible to control its behaviour with @FT_Property_Set
+ * and @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The TrueType driver's module name is `truetype'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * interpreter-version
+ *
+ * @description:
+ * Currently, two versions are available which represent the bytecode
+ * interpreter with and without subpixel hinting support,
+ * respectively. The default is subpixel support if
+ * TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
+ * support otherwise (since it isn't available then).
+ *
+ * If subpixel hinting is on, many TrueType bytecode instructions
+ * behave differently compared to B/W or grayscale rendering. The
+ * main idea is to render at a much increased horizontal resolution,
+ * then sampling down the created output to subpixel precision.
+ * However, many older fonts are not suited to this and must be
+ * specially taken care of by applying (hardcoded) font-specific
+ * tweaks.
+ *
+ * Details on subpixel hinting and some of the necessary tweaks can be
+ * found in Greg Hitchcock's whitepaper at
+ * `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+ *
+ * The following example code demonstrates how to activate subpixel
+ * hinting (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_38;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "truetype",
+ * "interpreter-version",
+ * &interpreter_version );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * TT_INTERPRETER_VERSION_XXX
+ *
+ * @description:
+ * A list of constants used for the @interpreter-version property to
+ * select the hinting engine for Truetype fonts.
+ *
+ * The numeric value in the constant names represents the version
+ * number as returned by the `GETINFO' bytecode instruction.
+ *
+ * @values:
+ * TT_INTERPRETER_VERSION_35 ::
+ * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+ * Windows~98; only grayscale and B/W rasterizing is supported.
+ *
+ * TT_INTERPRETER_VERSION_38 ::
+ * Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+ * equivalent to the hinting provided by DirectWrite ClearType (as
+ * can be found, for example, in the Internet Explorer~9 running on
+ * Windows~7).
+ *
+ * @note:
+ * This property controls the behaviour of the bytecode interpreter
+ * and thus how outlines get hinted. It does *not* control how glyph
+ * get rasterized! In particular, it does not control subpixel color
+ * filtering.
+ *
+ * If FreeType has not been compiled with configuration option
+ * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
+ * `FT_Err_Unimplemented_Feature' error.
+ *
+ */
+#define TT_INTERPRETER_VERSION_35 35
+#define TT_INTERPRETER_VERSION_38 38
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTTTDRV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/fttypes.h b/core/include/thirdparties/freetype/freetype/fttypes.h
new file mode 100644
index 0000000000..4d11bed469
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/fttypes.h
@@ -0,0 +1,598 @@
+/***************************************************************************/
+/* */
+/* fttypes.h */
+/* */
+/* FreeType simple types definitions (specification only). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "ftsystem.h"
+#include "ftimage.h"
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /* <Title> */
+ /* Basic Data Types */
+ /* */
+ /* <Abstract> */
+ /* The basic data types defined by the library. */
+ /* */
+ /* <Description> */
+ /* This section contains the basic data types defined by FreeType~2, */
+ /* ranging from simple scalar types to bitmap descriptors. More */
+ /* font-specific structures are defined in a different section. */
+ /* */
+ /* <Order> */
+ /* FT_Byte */
+ /* FT_Bytes */
+ /* FT_Char */
+ /* FT_Int */
+ /* FT_UInt */
+ /* FT_Int16 */
+ /* FT_UInt16 */
+ /* FT_Int32 */
+ /* FT_UInt32 */
+ /* FT_Short */
+ /* FT_UShort */
+ /* FT_Long */
+ /* FT_ULong */
+ /* FT_Bool */
+ /* FT_Offset */
+ /* FT_PtrDist */
+ /* FT_String */
+ /* FT_Tag */
+ /* FT_Error */
+ /* FT_Fixed */
+ /* FT_Pointer */
+ /* FT_Pos */
+ /* FT_Vector */
+ /* FT_BBox */
+ /* FT_Matrix */
+ /* FT_FWord */
+ /* FT_UFWord */
+ /* FT_F2Dot14 */
+ /* FT_UnitVector */
+ /* FT_F26Dot6 */
+ /* */
+ /* */
+ /* FT_Generic */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* FT_Bitmap */
+ /* FT_Pixel_Mode */
+ /* FT_Palette_Mode */
+ /* FT_Glyph_Format */
+ /* FT_IMAGE_TAG */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bool */
+ /* */
+ /* <Description> */
+ /* A typedef of unsigned char, used for simple booleans. As usual, */
+ /* values 1 and~0 represent true and false, respectively. */
+ /* */
+ typedef unsigned char FT_Bool;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_FWord */
+ /* */
+ /* <Description> */
+ /* A signed 16-bit integer used to store a distance in original font */
+ /* units. */
+ /* */
+ typedef signed short FT_FWord; /* distance in FUnits */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UFWord */
+ /* */
+ /* <Description> */
+ /* An unsigned 16-bit integer used to store a distance in original */
+ /* font units. */
+ /* */
+ typedef unsigned short FT_UFWord; /* unsigned distance */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Char */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _signed_ char type. */
+ /* */
+ typedef signed char FT_Char;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Byte */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _unsigned_ char type. */
+ /* */
+ typedef unsigned char FT_Byte;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bytes */
+ /* */
+ /* <Description> */
+ /* A typedef for constant memory areas. */
+ /* */
+ typedef const FT_Byte* FT_Bytes;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Tag */
+ /* */
+ /* <Description> */
+ /* A typedef for 32-bit tags (as used in the SFNT format). */
+ /* */
+ typedef FT_UInt32 FT_Tag;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_String */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the char type, usually used for strings. */
+ /* */
+ typedef char FT_String;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Short */
+ /* */
+ /* <Description> */
+ /* A typedef for signed short. */
+ /* */
+ typedef signed short FT_Short;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UShort */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned short. */
+ /* */
+ typedef unsigned short FT_UShort;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int */
+ /* */
+ /* <Description> */
+ /* A typedef for the int type. */
+ /* */
+ typedef signed int FT_Int;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt */
+ /* */
+ /* <Description> */
+ /* A typedef for the unsigned int type. */
+ /* */
+ typedef unsigned int FT_UInt;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Long */
+ /* */
+ /* <Description> */
+ /* A typedef for signed long. */
+ /* */
+ typedef signed long FT_Long;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ULong */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned long. */
+ /* */
+ typedef unsigned long FT_ULong;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F2Dot14 */
+ /* */
+ /* <Description> */
+ /* A signed 2.14 fixed-point type used for unit vectors. */
+ /* */
+ typedef signed short FT_F2Dot14;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F26Dot6 */
+ /* */
+ /* <Description> */
+ /* A signed 26.6 fixed-point type used for vectorial pixel */
+ /* coordinates. */
+ /* */
+ typedef signed long FT_F26Dot6;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Fixed */
+ /* */
+ /* <Description> */
+ /* This type is used to store 16.16 fixed-point values, like scaling */
+ /* values or matrix coefficients. */
+ /* */
+ typedef signed long FT_Fixed;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Error */
+ /* */
+ /* <Description> */
+ /* The FreeType error code type. A value of~0 is always interpreted */
+ /* as a successful operation. */
+ /* */
+ typedef int FT_Error;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pointer */
+ /* */
+ /* <Description> */
+ /* A simple typedef for a typeless pointer. */
+ /* */
+ typedef void* FT_Pointer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Offset */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */
+ /* _unsigned_ integer type used to express a file size or position, */
+ /* or a memory block size. */
+ /* */
+ typedef size_t FT_Offset;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_PtrDist */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */
+ /* largest _signed_ integer type used to express the distance */
+ /* between two pointers. */
+ /* */
+ typedef ft_ptrdiff_t FT_PtrDist;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_UnitVector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector unit vector. Uses */
+ /* FT_F2Dot14 types. */
+ /* */
+ /* <Fields> */
+ /* x :: Horizontal coordinate. */
+ /* */
+ /* y :: Vertical coordinate. */
+ /* */
+ typedef struct FT_UnitVector_
+ {
+ FT_F2Dot14 x;
+ FT_F2Dot14 y;
+
+ } FT_UnitVector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Matrix */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2x2 matrix. Coefficients are */
+ /* in 16.16 fixed-point format. The computation performed is: */
+ /* */
+ /* { */
+ /* x' = x*xx + y*xy */
+ /* y' = x*yx + y*yy */
+ /* } */
+ /* */
+ /* <Fields> */
+ /* xx :: Matrix coefficient. */
+ /* */
+ /* xy :: Matrix coefficient. */
+ /* */
+ /* yx :: Matrix coefficient. */
+ /* */
+ /* yy :: Matrix coefficient. */
+ /* */
+ typedef struct FT_Matrix_
+ {
+ FT_Fixed xx, xy;
+ FT_Fixed yx, yy;
+
+ } FT_Matrix;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Data */
+ /* */
+ /* <Description> */
+ /* Read-only binary data represented as a pointer and a length. */
+ /* */
+ /* <Fields> */
+ /* pointer :: The data. */
+ /* */
+ /* length :: The length of the data in bytes. */
+ /* */
+ typedef struct FT_Data_
+ {
+ const FT_Byte* pointer;
+ FT_Int length;
+
+ } FT_Data;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* <Description> */
+ /* Describe a function used to destroy the `client' data of any */
+ /* FreeType object. See the description of the @FT_Generic type for */
+ /* details of usage. */
+ /* */
+ /* <Input> */
+ /* The address of the FreeType object which is under finalization. */
+ /* Its client data is accessed through its `generic' field. */
+ /* */
+ typedef void (*FT_Generic_Finalizer)(void* object);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Generic */
+ /* */
+ /* <Description> */
+ /* Client applications often need to associate their own data to a */
+ /* variety of FreeType core objects. For example, a text layout API */
+ /* might want to associate a glyph cache to a given size object. */
+ /* */
+ /* Some FreeType object contains a `generic' field, of type */
+ /* FT_Generic, which usage is left to client applications and font */
+ /* servers. */
+ /* */
+ /* It can be used to store a pointer to client-specific data, as well */
+ /* as the address of a `finalizer' function, which will be called by */
+ /* FreeType when the object is destroyed (for example, the previous */
+ /* client example would put the address of the glyph cache destructor */
+ /* in the `finalizer' field). */
+ /* */
+ /* <Fields> */
+ /* data :: A typeless pointer to any client-specified data. This */
+ /* field is completely ignored by the FreeType library. */
+ /* */
+ /* finalizer :: A pointer to a `generic finalizer' function, which */
+ /* will be called when the object is destroyed. If this */
+ /* field is set to NULL, no code will be called. */
+ /* */
+ typedef struct FT_Generic_
+ {
+ void* data;
+ FT_Generic_Finalizer finalizer;
+
+ } FT_Generic;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_MAKE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags which are used to label */
+ /* TrueType tables into an unsigned long to be used within FreeType. */
+ /* */
+ /* <Note> */
+ /* The produced values *must* be 32-bit integers. Don't redefine */
+ /* this macro. */
+ /* */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+ (FT_Tag) \
+ ( ( (FT_ULong)_x1 << 24 ) | \
+ ( (FT_ULong)_x2 << 16 ) | \
+ ( (FT_ULong)_x3 << 8 ) | \
+ (FT_ULong)_x4 )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* L I S T M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ListNode */
+ /* */
+ /* <Description> */
+ /* Many elements and objects in FreeType are listed through an */
+ /* @FT_List record (see @FT_ListRec). As its name suggests, an */
+ /* FT_ListNode is a handle to a single list element. */
+ /* */
+ typedef struct FT_ListNodeRec_* FT_ListNode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_List */
+ /* */
+ /* <Description> */
+ /* A handle to a list record (see @FT_ListRec). */
+ /* */
+ typedef struct FT_ListRec_* FT_List;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListNodeRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a single list element. */
+ /* */
+ /* <Fields> */
+ /* prev :: The previous element in the list. NULL if first. */
+ /* */
+ /* next :: The next element in the list. NULL if last. */
+ /* */
+ /* data :: A typeless pointer to the listed object. */
+ /* */
+ typedef struct FT_ListNodeRec_
+ {
+ FT_ListNode prev;
+ FT_ListNode next;
+ void* data;
+
+ } FT_ListNodeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a simple doubly-linked list. These are */
+ /* used in many parts of FreeType. */
+ /* */
+ /* <Fields> */
+ /* head :: The head (first element) of doubly-linked list. */
+ /* */
+ /* tail :: The tail (last element) of doubly-linked list. */
+ /* */
+ typedef struct FT_ListRec_
+ {
+ FT_ListNode head;
+ FT_ListNode tail;
+
+ } FT_ListRec;
+
+
+ /* */
+
+#define FT_IS_EMPTY( list ) ( (list).head == 0 )
+#define FT_BOOL( x ) ( (FT_Bool)( x ) )
+
+ /* concatenate C tokens */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+ /* see `ftmoderr.h' for descriptions of the following macros */
+
+#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#define FT_ERROR_BASE( x ) ( (x) & 0xFF )
+#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U )
+
+#define FT_ERR_EQ( x, e ) \
+ ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
+#define FT_ERR_NEQ( x, e ) \
+ ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ftwinfnt.h b/core/include/thirdparties/freetype/freetype/ftwinfnt.h
new file mode 100644
index 0000000000..af4334e200
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftwinfnt.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftwinfnt.h */
+/* */
+/* FreeType API for accessing Windows fnt-specific data. */
+/* */
+/* Copyright 2003, 2004, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* winfnt_fonts */
+ /* */
+ /* <Title> */
+ /* Window FNT Files */
+ /* */
+ /* <Abstract> */
+ /* Windows FNT specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Windows FNT specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_WinFNT_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `charset' byte in
+ * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX
+ * encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+ * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is
+ * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+ *
+ * @values:
+ * FT_WinFNT_ID_DEFAULT ::
+ * This is used for font enumeration and font creation as a
+ * `don't care' value. Valid font files don't contain this value.
+ * When querying for information about the character set of the font
+ * that is currently selected into a specified device context, this
+ * return value (of the related Windows API) simply denotes failure.
+ *
+ * FT_WinFNT_ID_SYMBOL ::
+ * There is no known mapping table available.
+ *
+ * FT_WinFNT_ID_MAC ::
+ * Mac Roman encoding.
+ *
+ * FT_WinFNT_ID_OEM ::
+ * From Michael Pöttgen <michael@poettgen.de>:
+ *
+ * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+ * is used for the charset of vector fonts, like `modern.fon',
+ * `roman.fon', and `script.fon' on Windows.
+ *
+ * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+ * specifies a character set that is operating-system dependent.
+ *
+ * The `IFIMETRICS' documentation from the `Windows Driver
+ * Development Kit' says: This font supports an OEM-specific
+ * character set. The OEM character set is system dependent.
+ *
+ * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+ * second default codepage that most international versions of
+ * Windows have. It is one of the OEM codepages from
+ *
+ * http://www.microsoft.com/globaldev/reference/cphome.mspx,
+ *
+ * and is used for the `DOS boxes', to support legacy applications.
+ * A German Windows version for example usually uses ANSI codepage
+ * 1252 and OEM codepage 850.
+ *
+ * FT_WinFNT_ID_CP874 ::
+ * A superset of Thai TIS 620 and ISO 8859-11.
+ *
+ * FT_WinFNT_ID_CP932 ::
+ * A superset of Japanese Shift-JIS (with minor deviations).
+ *
+ * FT_WinFNT_ID_CP936 ::
+ * A superset of simplified Chinese GB 2312-1980 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP949 ::
+ * A superset of Korean Hangul KS~C 5601-1987 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP950 ::
+ * A superset of traditional Chinese Big~5 ETen (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP1250 ::
+ * A superset of East European ISO 8859-2 (with slightly different
+ * ordering).
+ *
+ * FT_WinFNT_ID_CP1251 ::
+ * A superset of Russian ISO 8859-5 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1252 ::
+ * ANSI encoding. A superset of ISO 8859-1.
+ *
+ * FT_WinFNT_ID_CP1253 ::
+ * A superset of Greek ISO 8859-7 (with minor modifications).
+ *
+ * FT_WinFNT_ID_CP1254 ::
+ * A superset of Turkish ISO 8859-9.
+ *
+ * FT_WinFNT_ID_CP1255 ::
+ * A superset of Hebrew ISO 8859-8 (with some modifications).
+ *
+ * FT_WinFNT_ID_CP1256 ::
+ * A superset of Arabic ISO 8859-6 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1257 ::
+ * A superset of Baltic ISO 8859-13 (with some deviations).
+ *
+ * FT_WinFNT_ID_CP1258 ::
+ * For Vietnamese. This encoding doesn't cover all necessary
+ * characters.
+ *
+ * FT_WinFNT_ID_CP1361 ::
+ * Korean (Johab).
+ */
+
+#define FT_WinFNT_ID_CP1252 0
+#define FT_WinFNT_ID_DEFAULT 1
+#define FT_WinFNT_ID_SYMBOL 2
+#define FT_WinFNT_ID_MAC 77
+#define FT_WinFNT_ID_CP932 128
+#define FT_WinFNT_ID_CP949 129
+#define FT_WinFNT_ID_CP1361 130
+#define FT_WinFNT_ID_CP936 134
+#define FT_WinFNT_ID_CP950 136
+#define FT_WinFNT_ID_CP1253 161
+#define FT_WinFNT_ID_CP1254 162
+#define FT_WinFNT_ID_CP1258 163
+#define FT_WinFNT_ID_CP1255 177
+#define FT_WinFNT_ID_CP1256 178
+#define FT_WinFNT_ID_CP1257 186
+#define FT_WinFNT_ID_CP1251 204
+#define FT_WinFNT_ID_CP874 222
+#define FT_WinFNT_ID_CP1250 238
+#define FT_WinFNT_ID_OEM 255
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* Windows FNT Header info. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_
+ {
+ FT_UShort version;
+ FT_ULong file_size;
+ FT_Byte copyright[60];
+ FT_UShort file_type;
+ FT_UShort nominal_point_size;
+ FT_UShort vertical_resolution;
+ FT_UShort horizontal_resolution;
+ FT_UShort ascent;
+ FT_UShort internal_leading;
+ FT_UShort external_leading;
+ FT_Byte italic;
+ FT_Byte underline;
+ FT_Byte strike_out;
+ FT_UShort weight;
+ FT_Byte charset;
+ FT_UShort pixel_width;
+ FT_UShort pixel_height;
+ FT_Byte pitch_and_family;
+ FT_UShort avg_width;
+ FT_UShort max_width;
+ FT_Byte first_char;
+ FT_Byte last_char;
+ FT_Byte default_char;
+ FT_Byte break_char;
+ FT_UShort bytes_per_row;
+ FT_ULong device_offset;
+ FT_ULong face_name_offset;
+ FT_ULong bits_pointer;
+ FT_ULong bits_offset;
+ FT_Byte reserved;
+ FT_ULong flags;
+ FT_UShort A_space;
+ FT_UShort B_space;
+ FT_UShort C_space;
+ FT_UShort color_table_offset;
+ FT_ULong reserved1[4];
+
+ } FT_WinFNT_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_Header */
+ /* */
+ /* <Description> */
+ /* A handle to an @FT_WinFNT_HeaderRec structure. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_WinFNT_Header
+ *
+ * @description:
+ * Retrieve a Windows FNT font info header.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * @output:
+ * aheader :: The WinFNT header.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with Windows FNT faces, returning an error
+ * otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_WinFNT_Header( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/include/thirdparties/freetype/freetype/ftxf86.h b/core/include/thirdparties/freetype/freetype/ftxf86.h
new file mode 100644
index 0000000000..d7e2dabc4c
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ftxf86.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* ftxf86.h */
+/* */
+/* Support functions for X11. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* font_formats */
+ /* */
+ /* <Title> */
+ /* Font Formats */
+ /* */
+ /* <Abstract> */
+ /* Getting the font format. */
+ /* */
+ /* <Description> */
+ /* The single function in this section can be used to get the font */
+ /* format. Note that this information is not needed normally; */
+ /* however, there are special cases (like in PDF devices) where it is */
+ /* important to differentiate, in spite of FreeType's uniform API. */
+ /* */
+ /* This function is in the X11/xf86 namespace for historical reasons */
+ /* and in no way depends on that windowing system. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_X11_Font_Format */
+ /* */
+ /* <Description> */
+ /* Return a string describing the format of a given face, using values */
+ /* which can be used as an X11 FONT_PROPERTY. Possible values are */
+ /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+ /* `PFR', and `Windows~FNT'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* Input face handle. */
+ /* */
+ /* <Return> */
+ /* Font format string. NULL in case of error. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_X11_Font_Format( FT_Face face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/core/include/thirdparties/freetype/freetype/internal/autohint.h b/core/include/thirdparties/freetype/freetype/internal/autohint.h
new file mode 100644
index 0000000000..f07646d469
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/autohint.h
@@ -0,0 +1,244 @@
+/***************************************************************************/
+/* */
+/* autohint.h */
+/* */
+/* High-level `autohint' module-specific interface (specification). */
+/* */
+/* Copyright 1996-2002, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The auto-hinter is used to load and automatically hint glyphs if a */
+ /* format-specific hinter isn't available. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+ /*************************************************************************/
+ /* */
+ /* A small technical note regarding automatic hinting in order to */
+ /* clarify this module interface. */
+ /* */
+ /* An automatic hinter might compute two kinds of data for a given face: */
+ /* */
+ /* - global hints: Usually some metrics that describe global properties */
+ /* of the face. It is computed by scanning more or less */
+ /* aggressively the glyphs in the face, and thus can be */
+ /* very slow to compute (even if the size of global */
+ /* hints is really small). */
+ /* */
+ /* - glyph hints: These describe some important features of the glyph */
+ /* outline, as well as how to align them. They are */
+ /* generally much faster to compute than global hints. */
+ /* */
+ /* The current FreeType auto-hinter does a pretty good job while */
+ /* performing fast computations for both global and glyph hints. */
+ /* However, we might be interested in introducing more complex and */
+ /* powerful algorithms in the future, like the one described in the John */
+ /* D. Hobby paper, which unfortunately requires a lot more horsepower. */
+ /* */
+ /* Because a sufficiently sophisticated font management system would */
+ /* typically implement an LRU cache of opened face objects to reduce */
+ /* memory usage, it is a good idea to be able to avoid recomputing */
+ /* global hints every time the same face is re-opened. */
+ /* */
+ /* We thus provide the ability to cache global hints outside of the face */
+ /* object, in order to speed up font re-opening time. Of course, this */
+ /* feature is purely optional, so most client programs won't even notice */
+ /* it. */
+ /* */
+ /* I initially thought that it would be a good idea to cache the glyph */
+ /* hints too. However, my general idea now is that if you really need */
+ /* to cache these too, you are simply in need of a new font format, */
+ /* where all this information could be stored within the font file and */
+ /* decoded on the fly. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct FT_AutoHinterRec_ *FT_AutoHinter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalGetFunc */
+ /* */
+ /* <Description> */
+ /* Retrieve the global hints computed for a given face object. The */
+ /* resulting data is dissociated from the face and will survive a */
+ /* call to FT_Done_Face(). It must be discarded through the API */
+ /* FT_AutoHinter_GlobalDoneFunc(). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* global_hints :: A typeless pointer to the global hints. */
+ /* */
+ /* global_len :: The size in bytes of the global hints. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter,
+ FT_Face face,
+ void** global_hints,
+ long* global_len );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalDoneFunc */
+ /* */
+ /* <Description> */
+ /* Discard the global hints retrieved through */
+ /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */
+ /* are freed from memory. */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the auto-hinter module. */
+ /* */
+ /* global :: A pointer to retrieved global hints to discard. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter,
+ void* global );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalResetFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to recompute the global metrics in a given */
+ /* font. This is useful when global font data changes (e.g. Multiple */
+ /* Masters fonts where blend coordinates change). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the face. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter,
+ FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlyphLoadFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to load, scale, and automatically hint a */
+ /* glyph from a given face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the face. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* load_flags :: The load flags. */
+ /* */
+ /* <Note> */
+ /* This function is capable of loading composite glyphs by hinting */
+ /* each sub-glyph independently (which improves quality). */
+ /* */
+ /* It will call the font driver with @FT_Load_Glyph, with */
+ /* @FT_LOAD_NO_SCALE set. */
+ /* */
+ typedef FT_Error
+ (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter,
+ FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_AutoHinter_InterfaceRec */
+ /* */
+ /* <Description> */
+ /* The auto-hinter module's interface. */
+ /* */
+ typedef struct FT_AutoHinter_InterfaceRec_
+ {
+ FT_AutoHinter_GlobalResetFunc reset_face;
+ FT_AutoHinter_GlobalGetFunc get_global_hints;
+ FT_AutoHinter_GlobalDoneFunc done_global_hints;
+ FT_AutoHinter_GlyphLoadFunc load_glyph;
+
+ } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_AutoHinter_InterfaceRec class_ = \
+ { \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_AutoHinter_InterfaceRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->reset_face = reset_face_; \
+ clazz->get_global_hints = get_global_hints_; \
+ clazz->done_global_hints = done_global_hints_; \
+ clazz->load_glyph = load_glyph_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftcalc.h b/core/include/thirdparties/freetype/freetype/internal/ftcalc.h
new file mode 100644
index 0000000000..1f2462dcec
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftcalc.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/* */
+/* ftcalc.h */
+/* */
+/* Arithmetic computations (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FixedSqrt */
+ /* */
+ /* <Description> */
+ /* Computes the square root of a 16.16 fixed-point value. */
+ /* */
+ /* <Input> */
+ /* x :: The value to compute the root for. */
+ /* */
+ /* <Return> */
+ /* The result of `sqrt(x)'. */
+ /* */
+ /* <Note> */
+ /* This function is not very fast. */
+ /* */
+ FT_BASE( FT_Int32 )
+ FT_SqrtFixed( FT_Int32 x );
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv_No_Round */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* (without rounding) with maximum accuracy (it uses a 64-bit */
+ /* intermediate integer whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_BASE( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /*
+ * A variant of FT_Matrix_Multiply which scales its result afterwards.
+ * The idea is that both `a' and `b' are scaled by factors of 10 so that
+ * the values are as precise as possible to get a correct result during
+ * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of
+ * `a' and `b', respectively, then the scaling factor of the result is
+ * `sa*sb'.
+ */
+ FT_BASE( void )
+ FT_Matrix_Multiply_Scaled( const FT_Matrix* a,
+ FT_Matrix *b,
+ FT_Long scaling );
+
+
+ /*
+ * A variant of FT_Vector_Transform. See comments for
+ * FT_Matrix_Multiply_Scaled.
+ */
+ FT_BASE( void )
+ FT_Vector_Transform_Scaled( FT_Vector* vector,
+ const FT_Matrix* matrix,
+ FT_Long scaling );
+
+
+ /*
+ * Return -1, 0, or +1, depending on the orientation of a given corner.
+ * We use the Cartesian coordinate system, with positive vertical values
+ * going upwards. The function returns +1 if the corner turns to the
+ * left, -1 to the right, and 0 for undecidable cases.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+ /*
+ * Return TRUE if a corner is flat or nearly flat. This is equivalent to
+ * saying that the angle difference between the `in' and `out' vectors is
+ * very small.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_is_flat( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+
+ /*
+ * Return the most significant bit index.
+ */
+ FT_BASE( FT_Int )
+ FT_MSB( FT_UInt32 z );
+
+
+ /*
+ * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
+ * two fixed-point arguments instead.
+ */
+ FT_BASE( FT_Fixed )
+ FT_Hypot( FT_Fixed x,
+ FT_Fixed y );
+
+
+#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 )
+#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 )
+#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \
+ : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftdebug.h b/core/include/thirdparties/freetype/freetype/internal/ftdebug.h
new file mode 100644
index 0000000000..e7b14191af
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftdebug.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* ftdebug.h */
+/* */
+/* Debugging and logging component (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/* */
+/* IMPORTANT: A description of FreeType's debugging support can be */
+/* found in `docs/DEBUG.TXT'. Read it if you need to use or */
+/* understand this code. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+ /* is already defined; this simplifies the following #ifdefs */
+ /* */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the trace enums as well as the trace levels array when they */
+ /* are needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x ) trace_ ## x ,
+
+ /* defining the enumeration */
+ typedef enum FT_Trace_
+ {
+#include "fttrace.h"
+ trace_count
+
+ } FT_Trace;
+
+
+ /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+ extern int ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_TRACE macro */
+ /* */
+ /* IMPORTANT! */
+ /* */
+ /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+ /* value before using any TRACE macro. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat ) \
+ do \
+ { \
+ if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+ FT_Message varformat; \
+ } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Count */
+ /* */
+ /* <Description> */
+ /* Return the number of available trace components. */
+ /* */
+ /* <Return> */
+ /* The number of trace components. 0 if FreeType 2 is not built with */
+ /* FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* This function may be useful if you want to access elements of */
+ /* the internal `ft_trace_levels' array by an index. */
+ /* */
+ FT_BASE( FT_Int )
+ FT_Trace_Get_Count( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Name */
+ /* */
+ /* <Description> */
+ /* Return the name of a trace component. */
+ /* */
+ /* <Input> */
+ /* The index of the trace component. */
+ /* */
+ /* <Return> */
+ /* The name of the trace component. This is a statically allocated */
+ /* C string, so do not free it after use. NULL if FreeType 2 is not */
+ /* built with FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Trace_Get_Count to get the number of available trace */
+ /* components. */
+ /* */
+ /* This function may be useful if you want to control FreeType 2's */
+ /* debug level in your application. */
+ /* */
+ FT_BASE( const char * )
+ FT_Trace_Get_Name( FT_Int idx );
+
+
+ /*************************************************************************/
+ /* */
+ /* You need two opening and closing parentheses! */
+ /* */
+ /* Example: FT_TRACE0(( "Value is %i", foo )) */
+ /* */
+ /* Output of the FT_TRACEX macros is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat )
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ERROR macro. */
+ /* */
+ /* Output of this macro is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat ) FT_Message varformat
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw' */
+ /* makes it possible to easily set a breakpoint at this function. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition ) \
+ do \
+ { \
+ if ( !( condition ) ) \
+ FT_Panic( "assertion failed on line %d of file %s\n", \
+ __LINE__, __FILE__ ); \
+ } while ( 0 )
+
+#define FT_THROW( e ) \
+ ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \
+ __LINE__, \
+ __FILE__ ) | \
+ FT_ERR_CAT( FT_ERR_PREFIX, e ) )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition ) do { } while ( 0 )
+
+#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define `FT_Message' and `FT_Panic' when needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h" /* for vfprintf() */
+
+ /* print a message */
+ FT_BASE( void )
+ FT_Message( const char* fmt,
+ ... );
+
+ /* print a message and exit */
+ FT_BASE( void )
+ FT_Panic( const char* fmt,
+ ... );
+
+ /* report file name and line number of an error */
+ FT_BASE( int )
+ FT_Throw( FT_Error error,
+ int line,
+ const char* file );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+ FT_BASE( void )
+ ft_debug_init( void );
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftdriver.h b/core/include/thirdparties/freetype/freetype/internal/ftdriver.h
new file mode 100644
index 0000000000..5b0e863053
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftdriver.h
@@ -0,0 +1,409 @@
+/***************************************************************************/
+/* */
+/* ftdriver.h */
+/* */
+/* FreeType font driver interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include "../../ft2build.h"
+#include "../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef FT_Error
+ (*FT_Face_InitFunc)( FT_Stream stream,
+ FT_Face face,
+ FT_Int typeface_index,
+ FT_Int num_params,
+ FT_Parameter* parameters );
+
+ typedef void
+ (*FT_Face_DoneFunc)( FT_Face face );
+
+
+ typedef FT_Error
+ (*FT_Size_InitFunc)( FT_Size size );
+
+ typedef void
+ (*FT_Size_DoneFunc)( FT_Size size );
+
+
+ typedef FT_Error
+ (*FT_Slot_InitFunc)( FT_GlyphSlot slot );
+
+ typedef void
+ (*FT_Slot_DoneFunc)( FT_GlyphSlot slot );
+
+
+ typedef FT_Error
+ (*FT_Size_RequestFunc)( FT_Size size,
+ FT_Size_Request req );
+
+ typedef FT_Error
+ (*FT_Size_SelectFunc)( FT_Size size,
+ FT_ULong size_index );
+
+ typedef FT_Error
+ (*FT_Slot_LoadFunc)( FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ typedef FT_UInt
+ (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+ typedef FT_Long
+ (*FT_CharMap_CharNextFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+
+ typedef FT_Error
+ (*FT_Face_GetKerningFunc)( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning );
+
+
+ typedef FT_Error
+ (*FT_Face_AttachFunc)( FT_Face face,
+ FT_Stream stream );
+
+
+ typedef FT_Error
+ (*FT_Face_GetAdvancesFunc)( FT_Face face,
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed* advances );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Driver_ClassRec */
+ /* */
+ /* <Description> */
+ /* The font driver class. This structure mostly contains pointers to */
+ /* driver methods. */
+ /* */
+ /* <Fields> */
+ /* root :: The parent module. */
+ /* */
+ /* face_object_size :: The size of a face object in bytes. */
+ /* */
+ /* size_object_size :: The size of a size object in bytes. */
+ /* */
+ /* slot_object_size :: The size of a glyph object in bytes. */
+ /* */
+ /* init_face :: The format-specific face constructor. */
+ /* */
+ /* done_face :: The format-specific face destructor. */
+ /* */
+ /* init_size :: The format-specific size constructor. */
+ /* */
+ /* done_size :: The format-specific size destructor. */
+ /* */
+ /* init_slot :: The format-specific slot constructor. */
+ /* */
+ /* done_slot :: The format-specific slot destructor. */
+ /* */
+ /* */
+ /* load_glyph :: A function handle to load a glyph to a slot. */
+ /* This field is mandatory! */
+ /* */
+ /* get_kerning :: A function handle to return the unscaled */
+ /* kerning for a given pair of glyphs. Can be */
+ /* set to 0 if the format doesn't support */
+ /* kerning. */
+ /* */
+ /* attach_file :: This function handle is used to read */
+ /* additional data for a face from another */
+ /* file/stream. For example, this can be used to */
+ /* add data from AFM or PFM files on a Type 1 */
+ /* face, or a CIDMap on a CID-keyed face. */
+ /* */
+ /* get_advances :: A function handle used to return advance */
+ /* widths of `count' glyphs (in font units), */
+ /* starting at `first'. The `vertical' flag must */
+ /* be set to get vertical advance heights. The */
+ /* `advances' buffer is caller-allocated. */
+ /* The idea of this function is to be able to */
+ /* perform device-independent text layout without */
+ /* loading a single glyph image. */
+ /* */
+ /* request_size :: A handle to a function used to request the new */
+ /* character size. Can be set to 0 if the */
+ /* scaling done in the base layer suffices. */
+ /* */
+ /* select_size :: A handle to a function used to select a new */
+ /* fixed size. It is used only if */
+ /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */
+ /* to 0 if the scaling done in the base layer */
+ /* suffices. */
+ /* <Note> */
+ /* Most function pointers, with the exception of `load_glyph', can be */
+ /* set to 0 to indicate a default behaviour. */
+ /* */
+ typedef struct FT_Driver_ClassRec_
+ {
+ FT_Module_Class root;
+
+ FT_Long face_object_size;
+ FT_Long size_object_size;
+ FT_Long slot_object_size;
+
+ FT_Face_InitFunc init_face;
+ FT_Face_DoneFunc done_face;
+
+ FT_Size_InitFunc init_size;
+ FT_Size_DoneFunc done_size;
+
+ FT_Slot_InitFunc init_slot;
+ FT_Slot_DoneFunc done_slot;
+
+ FT_Slot_LoadFunc load_glyph;
+
+ FT_Face_GetKerningFunc get_kerning;
+ FT_Face_AttachFunc attach_file;
+ FT_Face_GetAdvancesFunc get_advances;
+
+ /* since version 2.2 */
+ FT_Size_RequestFunc request_size;
+ FT_Size_SelectFunc select_size;
+
+ } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of an FT_Driver_ClassRec */
+ /* struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Driver_ClassRec struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */
+ /* called with a pointer where the allocated structure is returned. */
+ /* And when it is no longer needed a `destroy' function needs to be */
+ /* called to release that allocation. */
+ /* */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains a */
+ /* mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by driver definition calling `FT_DEFINE_DRIVER' in following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_DRIVER( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Driver_ClassRec class_;
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Driver_ClassRec class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ \
+ init_face_, \
+ done_face_, \
+ \
+ init_size_, \
+ done_size_, \
+ \
+ init_slot_, \
+ done_slot_, \
+ \
+ load_glyph_, \
+ \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ \
+ request_size_, \
+ select_size_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( dclazz ) \
+ FT_FREE( dclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Driver_Class clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->face_object_size = face_object_size_; \
+ clazz->size_object_size = size_object_size_; \
+ clazz->slot_object_size = slot_object_size_; \
+ \
+ clazz->init_face = init_face_; \
+ clazz->done_face = done_face_; \
+ \
+ clazz->init_size = init_size_; \
+ clazz->done_size = done_size_; \
+ \
+ clazz->init_slot = init_slot_; \
+ clazz->done_slot = done_slot_; \
+ \
+ clazz->load_glyph = load_glyph_; \
+ \
+ clazz->get_kerning = get_kerning_; \
+ clazz->attach_file = attach_file_; \
+ clazz->get_advances = get_advances_; \
+ \
+ clazz->request_size = request_size_; \
+ clazz->select_size = select_size_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h b/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h
new file mode 100644
index 0000000000..76e5a7ee58
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftgloadr.h
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/* */
+/* ftgloadr.h */
+/* */
+/* The FreeType glyph loader (specification). */
+/* */
+/* Copyright 2002, 2003, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphLoader */
+ /* */
+ /* <Description> */
+ /* The glyph loader is an internal object used to load several glyphs */
+ /* together (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The glyph loader implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ;
+
+
+#if 0 /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+#endif
+
+
+ typedef struct FT_SubGlyphRec_
+ {
+ FT_Int index;
+ FT_UShort flags;
+ FT_Int arg1;
+ FT_Int arg2;
+ FT_Matrix transform;
+
+ } FT_SubGlyphRec;
+
+
+ typedef struct FT_GlyphLoadRec_
+ {
+ FT_Outline outline; /* outline */
+ FT_Vector* extra_points; /* extra points table */
+ FT_Vector* extra_points2; /* second extra points table */
+ FT_UInt num_subglyphs; /* number of subglyphs */
+ FT_SubGlyph subglyphs; /* subglyphs */
+
+ } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+ typedef struct FT_GlyphLoaderRec_
+ {
+ FT_Memory memory;
+ FT_UInt max_points;
+ FT_UInt max_contours;
+ FT_UInt max_subglyphs;
+ FT_Bool use_extra;
+
+ FT_GlyphLoadRec base;
+ FT_GlyphLoadRec current;
+
+ void* other; /* for possible future extension? */
+
+ } FT_GlyphLoaderRec;
+
+
+ /* create new empty glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_New( FT_Memory memory,
+ FT_GlyphLoader *aloader );
+
+ /* add an extra points table to a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader );
+
+ /* destroy a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Done( FT_GlyphLoader loader );
+
+ /* reset a glyph loader (frees everything int it) */
+ FT_BASE( void )
+ FT_GlyphLoader_Reset( FT_GlyphLoader loader );
+
+ /* rewind a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Rewind( FT_GlyphLoader loader );
+
+ /* check that there is enough space to add `n_points' and `n_contours' */
+ /* to the glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader,
+ FT_UInt n_points,
+ FT_UInt n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_points + \
+ (_loader)->current.outline.n_points + \
+ (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_contours + \
+ (_loader)->current.outline.n_contours + \
+ (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \
+ ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \
+ FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \
+ ? 0 \
+ : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+ /* check that there is enough space to add `n_subs' sub-glyphs to */
+ /* a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader,
+ FT_UInt n_subs );
+
+ /* prepare a glyph loader, i.e. empty the current glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Prepare( FT_GlyphLoader loader );
+
+ /* add the current glyph to the base glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Add( FT_GlyphLoader loader );
+
+ /* copy points from one glyph loader to another */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CopyPoints( FT_GlyphLoader target,
+ FT_GlyphLoader source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftmemory.h b/core/include/thirdparties/freetype/freetype/internal/ftmemory.h
new file mode 100644
index 0000000000..67cbf43308
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftmemory.h
@@ -0,0 +1,459 @@
+/***************************************************************************/
+/* */
+/* ftmemory.h */
+/* */
+/* The FreeType memory management macros (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2007, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../fttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_SET_ERROR */
+ /* */
+ /* <Description> */
+ /* This macro is used to set an implicit `error' variable to a given */
+ /* expression's value (usually a function call), and convert it to a */
+ /* boolean which is set whenever the value is != 0. */
+ /* */
+#undef FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+ ( ( error = (expression) ) != 0 )
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M E M O R Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*
+ * C++ refuses to handle statements like p = (void*)anything, with `p' a
+ * typed pointer. Since we don't have a `typeof' operator in standard
+ * C++, we have to use a template to emulate it.
+ */
+
+#ifdef __cplusplus
+
+ extern "C++"
+ template <typename T> inline T*
+ cplusplus_typeof( T*,
+ void *v )
+ {
+ return static_cast <T*> ( v );
+ }
+
+#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val ) (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+ FT_BASE( const char* ) _ft_debug_file;
+ FT_BASE( long ) _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp ) (exp)
+#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+ /*
+ * The allocation functions return a pointer, and the error code
+ * is written to through the `p_error' parameter. See below for
+ * for documentation.
+ */
+
+ FT_BASE( FT_Pointer )
+ ft_mem_alloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qalloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_realloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qrealloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+#ifdef _DEBUG
+//#define _XYQ_MEM_DEBUG
+#endif
+
+#ifdef _XYQ_MEM_DEBUG /* XYQ */
+ FT_BASE( FT_Pointer )
+ ft_mem_allocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qallocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_reallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qreallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+#endif
+
+
+ FT_BASE( void )
+ ft_mem_free( FT_Memory memory,
+ const void* P );
+
+
+#define FT_MEM_FREE( ptr ) \
+ FT_BEGIN_STMNT \
+ ft_mem_free( memory, (ptr) ); \
+ (ptr) = NULL; \
+ FT_END_STMNT
+#ifndef _XYQ_MEM_DEBUG
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \
+ (FT_Long)(size), \
+ &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#else
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#endif
+
+#define FT_MEM_NEW( ptr ) \
+ FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_QNEW( ptr ) \
+ FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count ) \
+ FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count ) \
+ FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count ) \
+ FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+ /*
+ * Return the maximum number of addressable elements in an array.
+ * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+ * any problems.
+ */
+#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_ALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_FREE( ptr ) FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr ) \
+ FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+ FT_BASE( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error );
+
+
+#define FT_MEM_STRDUP( dst, str ) \
+ (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str ) \
+ FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size ) \
+ (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+ /* Return >= 1 if a truncation occurs. */
+ /* Return 0 if the source string fits the buffer. */
+ /* This is *not* the same as strlcpy(). */
+ FT_BASE( FT_Int )
+ ft_mem_strcpyn( char* dst,
+ const char* src,
+ FT_ULong size );
+
+#define FT_STRCPYN( dst, src, size ) \
+ ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftobjs.h b/core/include/thirdparties/freetype/freetype/internal/ftobjs.h
new file mode 100644
index 0000000000..d6f7de3dc9
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftobjs.h
@@ -0,0 +1,1569 @@
+/***************************************************************************/
+/* */
+/* ftobjs.h */
+/* */
+/* The FreeType private base classes (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of all internal FreeType classes. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include "../../ft2build.h"
+#include "../ftrender.h"
+#include "../ftsizes.h"
+#include "../ftlcdfil.h"
+#include "ftmemory.h"
+#include "ftgloadr.h"
+#include "ftdriver.h"
+#include "autohint.h"
+#include "ftserv.h"
+#include "ftpic.h"
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include "../ftincrem.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* Some generic definitions. */
+ /* */
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The min and max functions missing in C. As usual, be careful not to */
+ /* write things like FT_MIN( a++, b++ ) to avoid side effects. */
+ /* */
+#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x ) ( (x) & ~63 )
+#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 )
+
+
+ /*
+ * Return the highest power of 2 that is <= value; this correspond to
+ * the highest bit in a given 32-bit value.
+ */
+ FT_BASE( FT_UInt32 )
+ ft_highpow2( FT_UInt32 value );
+
+
+ /*
+ * character classification functions -- since these are used to parse
+ * font files, we must not use those in <ctypes.h> which are
+ * locale-dependent
+ */
+#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \
+ ( (unsigned)(x) - 'a' ) < 6U || \
+ ( (unsigned)(x) - 'A' ) < 6U )
+
+ /* the next two macros assume ASCII representation */
+#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U )
+#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) )
+#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** C H A R M A P S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to internal charmap object */
+ typedef struct FT_CMapRec_* FT_CMap;
+
+ /* handle to charmap class structure */
+ typedef const struct FT_CMap_ClassRec_* FT_CMap_Class;
+
+ /* internal charmap object structure */
+ typedef struct FT_CMapRec_
+ {
+ FT_CharMapRec charmap;
+ FT_CMap_Class clazz;
+
+ } FT_CMapRec;
+
+ /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x ) ((FT_CMap)( x ))
+
+ /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face
+
+
+ /* class method definitions */
+ typedef FT_Error
+ (*FT_CMap_InitFunc)( FT_CMap cmap,
+ FT_Pointer init_data );
+
+ typedef void
+ (*FT_CMap_DoneFunc)( FT_CMap cmap );
+
+ typedef FT_UInt
+ (*FT_CMap_CharIndexFunc)( FT_CMap cmap,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharNextFunc)( FT_CMap cmap,
+ FT_UInt32 *achar_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap,
+ FT_CMap unicode_cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_Bool
+ (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantListFunc)( FT_CMap cmap,
+ FT_Memory mem );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_CharVariantListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantCharListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 variant_selector );
+
+
+ typedef struct FT_CMap_ClassRec_
+ {
+ FT_ULong size;
+ FT_CMap_InitFunc init;
+ FT_CMap_DoneFunc done;
+ FT_CMap_CharIndexFunc char_index;
+ FT_CMap_CharNextFunc char_next;
+
+ /* Subsequent entries are special ones for format 14 -- the variant */
+ /* selector subtable which behaves like no other */
+
+ FT_CMap_CharVarIndexFunc char_var_index;
+ FT_CMap_CharVarIsDefaultFunc char_var_default;
+ FT_CMap_VariantListFunc variant_list;
+ FT_CMap_CharVariantListFunc charvariant_list;
+ FT_CMap_VariantCharListFunc variantchar_list;
+
+ } FT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_CMap_ClassRec class_ = \
+ { \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz );
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->size = size_; \
+ clazz->init = init_; \
+ clazz->done = done_; \
+ clazz->char_index = char_index_; \
+ clazz->char_next = char_next_; \
+ clazz->char_var_index = char_var_index_; \
+ clazz->char_var_default = char_var_default_; \
+ clazz->variant_list = variant_list_; \
+ clazz->charvariant_list = charvariant_list_; \
+ clazz->variantchar_list = variantchar_list_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* create a new charmap and add it to charmap->face */
+ FT_BASE( FT_Error )
+ FT_CMap_New( FT_CMap_Class clazz,
+ FT_Pointer init_data,
+ FT_CharMap charmap,
+ FT_CMap *acmap );
+
+ /* destroy a charmap and remove it from face's list */
+ FT_BASE( void )
+ FT_CMap_Done( FT_CMap cmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Face_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Face */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* max_points :: */
+ /* The maximum number of points used to store the vectorial outline */
+ /* of any glyph in this face. If this value cannot be known in */
+ /* advance, or if the face isn't scalable, this should be set to 0. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* max_contours :: */
+ /* The maximum number of contours used to store the vectorial */
+ /* outline of any glyph in this face. If this value cannot be */
+ /* known in advance, or if the face isn't scalable, this should be */
+ /* set to 0. Only relevant for scalable formats. */
+ /* */
+ /* transform_matrix :: */
+ /* A 2x2 matrix of 16.16 coefficients used to transform glyph */
+ /* outlines after they are loaded from the font. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* transform_delta :: */
+ /* A translation vector used to transform glyph outlines after they */
+ /* are loaded from the font. Only used by the convenience */
+ /* functions. */
+ /* */
+ /* transform_flags :: */
+ /* Some flags used to classify the transform. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* services :: */
+ /* A cache for frequently used services. It should be only */
+ /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */
+ /* */
+ /* incremental_interface :: */
+ /* If non-null, the interface through which glyph data and metrics */
+ /* are loaded incrementally for faces that do not provide all of */
+ /* this data when first opened. This field exists only if */
+ /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */
+ /* */
+ /* ignore_unpatented_hinter :: */
+ /* This boolean flag instructs the glyph loader to ignore the */
+ /* native font hinter, if one is found. This is exclusively used */
+ /* in the case when the unpatented hinter is compiled within the */
+ /* library. */
+ /* */
+ /* refcount :: */
+ /* A counter initialized to~1 at the time an @FT_Face structure is */
+ /* created. @FT_Reference_Face increments this counter, and */
+ /* @FT_Done_Face only destroys a face if the counter is~1, */
+ /* otherwise it simply decrements it. */
+ /* */
+ typedef struct FT_Face_InternalRec_
+ {
+ FT_Matrix transform_matrix;
+ FT_Vector transform_delta;
+ FT_Int transform_flags;
+
+ FT_ServiceCacheRec services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec* incremental_interface;
+#endif
+
+ FT_Bool ignore_unpatented_hinter;
+ FT_Int refcount;
+
+ } FT_Face_InternalRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Slot_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_GlyphSlot */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* loader :: The glyph loader object used to load outlines */
+ /* into the glyph slot. */
+ /* */
+ /* flags :: Possible values are zero or */
+ /* FT_GLYPH_OWN_BITMAP. The latter indicates */
+ /* that the FT_GlyphSlot structure owns the */
+ /* bitmap buffer. */
+ /* */
+ /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */
+ /* must be transformed through a specific */
+ /* font transformation. This is _not_ the same */
+ /* as the face transform set through */
+ /* FT_Set_Transform(). */
+ /* */
+ /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */
+ /* transformation, if necessary. */
+ /* */
+ /* glyph_delta :: The 2d translation vector corresponding to */
+ /* the glyph transformation, if necessary. */
+ /* */
+ /* glyph_hints :: Format-specific glyph hints management. */
+ /* */
+
+#define FT_GLYPH_OWN_BITMAP 0x1
+
+ typedef struct FT_Slot_InternalRec_
+ {
+ FT_GlyphLoader loader;
+ FT_UInt flags;
+ FT_Bool glyph_transformed;
+ FT_Matrix glyph_matrix;
+ FT_Vector glyph_delta;
+ void* glyph_hints;
+
+ } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Size */
+ /* object. Currently, it's empty. */
+ /* */
+ /*************************************************************************/
+
+ typedef struct FT_Size_InternalRec_
+ {
+ /* empty */
+
+ } FT_Size_InternalRec;
+
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M O D U L E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ModuleRec */
+ /* */
+ /* <Description> */
+ /* A module object instance. */
+ /* */
+ /* <Fields> */
+ /* clazz :: A pointer to the module's class. */
+ /* */
+ /* library :: A handle to the parent library object. */
+ /* */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ typedef struct FT_ModuleRec_
+ {
+ FT_Module_Class* clazz;
+ FT_Library library;
+ FT_Memory memory;
+
+ } FT_ModuleRec;
+
+
+ /* typecast an object to an FT_Module */
+#define FT_MODULE( x ) ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_HAS_HINTER )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module_Interface */
+ /* */
+ /* <Description> */
+ /* Finds a module and returns its specific interface as a typeless */
+ /* pointer. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module-specific interface if available, 0 otherwise. */
+ /* */
+ /* <Note> */
+ /* You should better be familiar with FreeType internals to know */
+ /* which module to look for, and what its interface is :-) */
+ /* */
+ FT_BASE( const void* )
+ FT_Get_Module_Interface( FT_Library library,
+ const char* mod_name );
+
+ FT_BASE( FT_Pointer )
+ ft_module_get_service( FT_Module module,
+ const char* service_id );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x ) ((FT_Face)(x))
+#define FT_SIZE( x ) ((FT_Size)(x))
+#define FT_SLOT( x ) ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory
+#define FT_FACE_STREAM( x ) FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x ) FT_SIZE( x )->face
+#define FT_SLOT_FACE( x ) FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x ) FT_FACE( x )->size
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* It is sometimes useful to have more than one glyph slot for a */
+ /* given face object. This function is used to create additional */
+ /* slots. All of them are automatically discarded when the face is */
+ /* destroyed. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* aslot :: A handle to a new glyph slot object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_New_GlyphSlot( FT_Face face,
+ FT_GlyphSlot *aslot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* Destroys a given glyph slot. Remember however that all slots are */
+ /* automatically destroyed with its parent. Using this function is */
+ /* not always mandatory. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to a target glyph slot. */
+ /* */
+ FT_BASE( void )
+ FT_Done_GlyphSlot( FT_GlyphSlot slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req ) \
+ ( (req)->horiResolution \
+ ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+ : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req ) \
+ ( (req)->vertResolution \
+ ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+ : (req)->height )
+
+
+ /* Set the metrics according to a bitmap strike. */
+ FT_BASE( void )
+ FT_Select_Metrics( FT_Face face,
+ FT_ULong strike_index );
+
+
+ /* Set the metrics according to a size request. */
+ FT_BASE( void )
+ FT_Request_Metrics( FT_Face face,
+ FT_Size_Request req );
+
+
+ /* Match a size request against `available_sizes'. */
+ FT_BASE( FT_Error )
+ FT_Match_Size( FT_Face face,
+ FT_Size_Request req,
+ FT_Bool ignore_width,
+ FT_ULong* size_index );
+
+
+ /* Use the horizontal metrics to synthesize the vertical metrics. */
+ /* If `advance' is zero, it is also synthesized. */
+ FT_BASE( void )
+ ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics,
+ FT_Pos advance );
+
+
+ /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+ /* was allocated with ft_glyphslot_alloc_bitmap). */
+ FT_BASE( void )
+ ft_glyphslot_free_bitmap( FT_GlyphSlot slot );
+
+
+ /* Allocate a new bitmap buffer in a glyph slot. */
+ FT_BASE( FT_Error )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
+ FT_ULong size );
+
+
+ /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */
+ /* will not be freed by a later call to ft_glyphslot_free_bitmap. */
+ FT_BASE( void )
+ ft_glyphslot_set_bitmap( FT_GlyphSlot slot,
+ FT_Byte* buffer );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** R E N D E R E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#define FT_RENDERER( x ) ((FT_Renderer)( x ))
+#define FT_GLYPH( x ) ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+ typedef struct FT_RendererRec_
+ {
+ FT_ModuleRec root;
+ FT_Renderer_Class* clazz;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_Class glyph_class;
+
+ FT_Raster raster;
+ FT_Raster_Render_Func raster_render;
+ FT_Renderer_RenderFunc render;
+
+ } FT_RendererRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F O N T D R I V E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* typecast a module into a driver easily */
+#define FT_DRIVER( x ) ((FT_Driver)(x))
+
+ /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_DriverRec */
+ /* */
+ /* <Description> */
+ /* The root font driver class. A font driver is responsible for */
+ /* managing and loading font files of a given format. */
+ /* */
+ /* <Fields> */
+ /* root :: Contains the fields of the root module class. */
+ /* */
+ /* clazz :: A pointer to the font driver's class. Note that */
+ /* this is NOT root.clazz. `class' wasn't used */
+ /* as it is a reserved word in C++. */
+ /* */
+ /* faces_list :: The list of faces currently opened by this */
+ /* driver. */
+ /* */
+ /* glyph_loader :: The glyph loader for all faces managed by this */
+ /* driver. This object isn't defined for unscalable */
+ /* formats. */
+ /* */
+ typedef struct FT_DriverRec_
+ {
+ FT_ModuleRec root;
+ FT_Driver_Class clazz;
+ FT_ListRec faces_list;
+ FT_GlyphLoader glyph_loader;
+
+ } FT_DriverRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** L I B R A R I E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* This hook is used by the TrueType debugger. It must be set to an */
+ /* alternate truetype bytecode interpreter function. */
+#define FT_DEBUG_HOOK_TRUETYPE 0
+
+
+ /* Set this debug hook to a non-null pointer to force unpatented hinting */
+ /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */
+ /* during debugging. */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1
+
+
+ typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap,
+ FT_Render_Mode render_mode,
+ FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_LibraryRec */
+ /* */
+ /* <Description> */
+ /* The FreeType library class. This is the root of all FreeType */
+ /* data. Use FT_New_Library() to create a library object, and */
+ /* FT_Done_Library() to discard it and all child objects. */
+ /* */
+ /* <Fields> */
+ /* memory :: The library's memory object. Manages memory */
+ /* allocation. */
+ /* */
+ /* version_major :: The major version number of the library. */
+ /* */
+ /* version_minor :: The minor version number of the library. */
+ /* */
+ /* version_patch :: The current patch level of the library. */
+ /* */
+ /* num_modules :: The number of modules currently registered */
+ /* within this library. This is set to 0 for new */
+ /* libraries. New modules are added through the */
+ /* FT_Add_Module() API function. */
+ /* */
+ /* modules :: A table used to store handles to the currently */
+ /* registered modules. Note that each font driver */
+ /* contains a list of its opened faces. */
+ /* */
+ /* renderers :: The list of renderers currently registered */
+ /* within the library. */
+ /* */
+ /* cur_renderer :: The current outline renderer. This is a */
+ /* shortcut used to avoid parsing the list on */
+ /* each call to FT_Outline_Render(). It is a */
+ /* handle to the current renderer for the */
+ /* FT_GLYPH_FORMAT_OUTLINE format. */
+ /* */
+ /* auto_hinter :: XXX */
+ /* */
+ /* raster_pool :: The raster object's render pool. This can */
+ /* ideally be changed dynamically at run-time. */
+ /* */
+ /* raster_pool_size :: The size of the render pool in bytes. */
+ /* */
+ /* debug_hooks :: XXX */
+ /* */
+ /* lcd_filter :: If subpixel rendering is activated, the */
+ /* selected LCD filter mode. */
+ /* */
+ /* lcd_extra :: If subpixel rendering is activated, the number */
+ /* of extra pixels needed for the LCD filter. */
+ /* */
+ /* lcd_weights :: If subpixel rendering is activated, the LCD */
+ /* filter weights, if any. */
+ /* */
+ /* lcd_filter_func :: If subpixel rendering is activated, the LCD */
+ /* filtering callback function. */
+ /* */
+ /* pic_container :: Contains global structs and tables, instead */
+ /* of defining them globallly. */
+ /* */
+ /* refcount :: A counter initialized to~1 at the time an */
+ /* @FT_Library structure is created. */
+ /* @FT_Reference_Library increments this counter, */
+ /* and @FT_Done_Library only destroys a library */
+ /* if the counter is~1, otherwise it simply */
+ /* decrements it. */
+ /* */
+ typedef struct FT_LibraryRec_
+ {
+ FT_Memory memory; /* library's memory manager */
+
+ FT_Int version_major;
+ FT_Int version_minor;
+ FT_Int version_patch;
+
+ FT_UInt num_modules;
+ FT_Module modules[FT_MAX_MODULES]; /* module objects */
+
+ FT_ListRec renderers; /* list of renderers */
+ FT_Renderer cur_renderer; /* current outline renderer */
+ FT_Module auto_hinter;
+
+ FT_Byte* raster_pool; /* scan-line conversion */
+ /* render pool */
+ FT_ULong raster_pool_size; /* size of render pool in bytes */
+
+ FT_DebugHook_Func debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_LcdFilter lcd_filter;
+ FT_Int lcd_extra; /* number of extra pixels */
+ FT_Byte lcd_weights[7]; /* filter weights, if any */
+ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_PIC_Container pic_container;
+#endif
+
+ FT_Int refcount;
+
+ } FT_LibraryRec;
+
+
+ FT_BASE( FT_Renderer )
+ FT_Lookup_Renderer( FT_Library library,
+ FT_Glyph_Format format,
+ FT_ListNode* node );
+
+ FT_BASE( FT_Error )
+ FT_Render_Glyph_Internal( FT_Library library,
+ FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+ typedef const char*
+ (*FT_Face_GetPostscriptNameFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Face_GetGlyphNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory */
+ /* */
+ /* <Description> */
+ /* Creates a new memory object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the new memory object. 0 in case of error. */
+ /* */
+ FT_BASE( FT_Memory )
+ FT_New_Memory( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Memory */
+ /* */
+ /* <Description> */
+ /* Discards memory manager. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ FT_BASE( void )
+ FT_Done_Memory( FT_Memory memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* Define default raster's interface. The default raster is located in */
+ /* `src/base/ftraster.c'. */
+ /* */
+ /* Client applications can register new rasters through the */
+ /* FT_Set_Raster() API. */
+
+#ifndef FT_NO_DEFAULT_RASTER
+ FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** P I C S U P P O R T ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* PIC support macros for ftimage.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_OUTLINE_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Outline_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static const FT_Outline_Funcs class_ = \
+ { \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static FT_Error \
+ Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \
+ { \
+ clazz->move_to = move_to_; \
+ clazz->line_to = line_to_; \
+ clazz->conic_to = conic_to_; \
+ clazz->cubic_to = cubic_to_; \
+ clazz->shift = shift_; \
+ clazz->delta = delta_; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RASTER_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Raster_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \
+ { \
+ clazz->glyph_format = glyph_format_; \
+ clazz->raster_new = raster_new_; \
+ clazz->raster_reset = raster_reset_; \
+ clazz->raster_set_mode = raster_set_mode_; \
+ clazz->raster_render = raster_render_; \
+ clazz->raster_done = raster_done_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftrender.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_GLYPH */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Glyph_Class struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated stcture to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Glyph_Class class_ = \
+ { \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \
+ { \
+ clazz->glyph_size = size_; \
+ clazz->glyph_format = format_; \
+ clazz->glyph_init = init_; \
+ clazz->glyph_done = done_; \
+ clazz->glyph_copy = copy_; \
+ clazz->glyph_transform = transform_; \
+ clazz->glyph_bbox = bbox_; \
+ clazz->glyph_prepare = prepare_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Renderer_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Renderer_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need */
+ /* to be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER( class_ ) \
+ FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Renderer_Class class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ glyph_format_, \
+ \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ \
+ raster_class_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( rclazz ) \
+ FT_FREE( rclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Renderer_Class* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->glyph_format = glyph_format_; \
+ \
+ clazz->render_glyph = render_glyph_; \
+ clazz->transform_glyph = transform_glyph_; \
+ clazz->get_glyph_cbox = get_glyph_cbox_; \
+ clazz->set_mode = set_mode_; \
+ \
+ clazz->raster_class = raster_class_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftmodapi.h **/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Creator */
+ /* */
+ /* <Description> */
+ /* A function used to create (allocate) a new module class object. */
+ /* The object's members are initialized, but the module itself is */
+ /* not. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* output_class :: Initialized with the newly allocated class. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Creator)( FT_Memory memory,
+ FT_Module_Class** output_class );
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destroyer */
+ /* */
+ /* <Description> */
+ /* A function used to destroy (deallocate) a module class object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* clazz :: Module class to destroy. */
+ /* */
+ typedef void
+ (*FT_Module_Destroyer)( FT_Memory memory,
+ FT_Module_Class* clazz );
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Module_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to */
+ /* be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the module definition calling `FT_DEFINE_MODULE' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_ROOT_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct inside */
+ /* another struct that contains it or in a function that initializes */
+ /* that containing struct. */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Module_Class class_;
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ },
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Module_Class class_ = \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ); \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz );
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ clazz->root.module_flags = flags_; \
+ clazz->root.module_size = size_; \
+ clazz->root.module_name = name_; \
+ clazz->root.module_version = version_; \
+ clazz->root.module_requires = requires_; \
+ \
+ clazz->root.module_interface = interface_; \
+ \
+ clazz->root.module_init = init_; \
+ clazz->root.module_done = done_; \
+ clazz->root.get_interface = get_interface_;
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Module_Class* clazz = NULL; \
+ FT_Error error; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ clazz->module_flags = flags_; \
+ clazz->module_size = size_; \
+ clazz->module_name = name_; \
+ clazz->module_version = version_; \
+ clazz->module_requires = requires_; \
+ \
+ clazz->module_interface = interface_; \
+ \
+ clazz->module_init = init_; \
+ clazz->module_done = done_; \
+ clazz->get_interface = get_interface_; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftpic.h b/core/include/thirdparties/freetype/freetype/internal/ftpic.h
new file mode 100644
index 0000000000..485ce7a24e
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftpic.h
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/* */
+/* ftpic.h */
+/* */
+/* The FreeType position independent code services (declaration). */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Modules that ordinarily have const global data that need address */
+ /* can instead define pointers here. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ typedef struct FT_PIC_Container_
+ {
+ /* pic containers for base */
+ void* base;
+
+ /* pic containers for modules */
+ void* autofit;
+ void* cff;
+ void* pshinter;
+ void* psnames;
+ void* raster;
+ void* sfnt;
+ void* smooth;
+ void* truetype;
+
+ } FT_PIC_Container;
+
+
+ /* Initialize the various function tables, structs, etc. */
+ /* stored in the container. */
+ FT_BASE( FT_Error )
+ ft_pic_container_init( FT_Library library );
+
+
+ /* Destroy the contents of the container. */
+ FT_BASE( void )
+ ft_pic_container_destroy( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftrfork.h b/core/include/thirdparties/freetype/freetype/internal/ftrfork.h
new file mode 100644
index 0000000000..061124b130
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftrfork.h
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/* */
+/* ftrfork.h */
+/* */
+/* Embedded resource forks accessor (specification). */
+/* */
+/* Copyright 2004, 2006, 2007, 2012 by */
+/* Masatake YAMATO and Redhat K.K. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of */
+/* Information-technology Promotion Agency, Japan. */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* Number of guessing rules supported in `FT_Raccess_Guess'. */
+ /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES 9
+
+
+ /* A structure to describe a reference in a resource by its resource ID */
+ /* and internal offset. The `POST' resource expects to be concatenated */
+ /* by the order of resource IDs instead of its appearance in the file. */
+
+ typedef struct FT_RFork_Ref_
+ {
+ FT_UShort res_id;
+ FT_ULong offset;
+
+ } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+ typedef FT_Error
+ (*ft_raccess_guess_func)( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ typedef enum FT_RFork_Rule_ {
+ FT_RFork_Rule_invalid = -2,
+ FT_RFork_Rule_uknown, /* -1 */
+ FT_RFork_Rule_apple_double,
+ FT_RFork_Rule_apple_single,
+ FT_RFork_Rule_darwin_ufs_export,
+ FT_RFork_Rule_darwin_newvfs,
+ FT_RFork_Rule_darwin_hfsplus,
+ FT_RFork_Rule_vfat,
+ FT_RFork_Rule_linux_cap,
+ FT_RFork_Rule_linux_double,
+ FT_RFork_Rule_linux_netatalk
+ } FT_RFork_Rule;
+
+ /* For fast translation between rule index and rule type,
+ * the macros FT_RFORK_xxx should be kept consistent with
+ * the raccess_guess_funcs table
+ */
+ typedef struct ft_raccess_guess_rec_ {
+ ft_raccess_guess_func func;
+ FT_RFork_Rule type;
+ } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+ /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ { raccess_guess_ ## func_suffix, \
+ FT_RFork_Rule_ ## type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ void \
+ FT_Init_ ## name( type* storage ) \
+ { \
+ type* local = storage; \
+ \
+ \
+ int i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ local[i].func = raccess_guess_ ## func_suffix; \
+ local[i].type = FT_RFork_Rule_ ## type_suffix; \
+ i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Guess */
+ /* */
+ /* <Description> */
+ /* Guess a file name and offset where the actual resource fork is */
+ /* stored. The macro FT_RACCESS_N_RULES holds the number of */
+ /* guessing rules; the guessed result for the Nth rule is */
+ /* represented as a triplet: a new file name (new_names[N]), a file */
+ /* offset (offsets[N]), and an error code (errors[N]). */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* base_name :: */
+ /* The (base) file name of the resource fork used for some */
+ /* guessing rules. */
+ /* */
+ /* <Output> */
+ /* new_names :: */
+ /* An array of guessed file names in which the resource forks may */
+ /* exist. If `new_names[N]' is NULL, the guessed file name is */
+ /* equal to `base_name'. */
+ /* */
+ /* offsets :: */
+ /* An array of guessed file offsets. `offsets[N]' holds the file */
+ /* offset of the possible start of the resource fork in file */
+ /* `new_names[N]'. */
+ /* */
+ /* errors :: */
+ /* An array of FreeType error codes. `errors[N]' is the error */
+ /* code of Nth guessing rule function. If `errors[N]' is not */
+ /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */
+ /* */
+ FT_BASE( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char* base_name,
+ char** new_names,
+ FT_Long* offsets,
+ FT_Error* errors );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_HeaderInfo */
+ /* */
+ /* <Description> */
+ /* Get the information from the header of resource fork. The */
+ /* information includes the file offset where the resource map */
+ /* starts, and the file offset where the resource data starts. */
+ /* `FT_Raccess_Get_DataOffsets' requires these two data. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* rfork_offset :: */
+ /* The file offset where the resource fork starts. */
+ /* */
+ /* <Output> */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_HeaderInfo( FT_Library library,
+ FT_Stream stream,
+ FT_Long rfork_offset,
+ FT_Long *map_offset,
+ FT_Long *rdata_pos );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_DataOffsets */
+ /* */
+ /* <Description> */
+ /* Get the data offsets for a tag in a resource fork. Offsets are */
+ /* stored in an array because, in some cases, resources in a resource */
+ /* fork have the same tag. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* tag :: */
+ /* The resource tag. */
+ /* */
+ /* <Output> */
+ /* offsets :: */
+ /* The stream offsets for the resource data specified by `tag'. */
+ /* This array is allocated by the function, so you have to call */
+ /* @ft_mem_free after use. */
+ /* */
+ /* count :: */
+ /* The length of offsets array. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ /* <Note> */
+ /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */
+ /* value for `map_offset' and `rdata_pos'. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_DataOffsets( FT_Library library,
+ FT_Stream stream,
+ FT_Long map_offset,
+ FT_Long rdata_pos,
+ FT_Long tag,
+ FT_Long **offsets,
+ FT_Long *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftserv.h b/core/include/thirdparties/freetype/freetype/internal/ftserv.h
new file mode 100644
index 0000000000..cd5fbd0fac
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftserv.h
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/* */
+/* ftserv.h */
+/* */
+/* The FreeType services (specification only). */
+/* */
+/* Copyright 2003-2007, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Each module can export one or more `services'. Each service is */
+ /* identified by a constant string and modeled by a pointer; the latter */
+ /* generally corresponds to a structure containing function pointers. */
+ /* */
+ /* Note that a service's data cannot be a mere function pointer because */
+ /* in C it is possible that function pointers might be implemented */
+ /* differently than data pointers (e.g. 48 bits instead of 32). */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from a face's driver module.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_GLOBAL_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from all modules.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E D E S C R I P T O R S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * The following structure is used to _describe_ a given service
+ * to the library. This is useful to build simple static service lists.
+ */
+ typedef struct FT_ServiceDescRec_
+ {
+ const char* serv_id; /* service name */
+ const void* serv_data; /* service pointer/data */
+
+ } FT_ServiceDescRec;
+
+ typedef const FT_ServiceDescRec* FT_ServiceDesc;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_SERVICEDESCREC1 */
+ /* FT_DEFINE_SERVICEDESCREC2 */
+ /* FT_DEFINE_SERVICEDESCREC3 */
+ /* FT_DEFINE_SERVICEDESCREC4 */
+ /* FT_DEFINE_SERVICEDESCREC5 */
+ /* FT_DEFINE_SERVICEDESCREC6 */
+ /* FT_DEFINE_SERVICEDESCREC7 */
+ /* */
+ /* <Description> */
+ /* Used to initialize an array of FT_ServiceDescRec structures. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */
+ /* be called with a pointer to return an allocated array. As soon as */
+ /* it is no longer needed, a `destroy' function needs to be called to */
+ /* release that allocation. */
+ /* */
+ /* These functions should be manually called from the `pic_init' and */
+ /* `pic_free' functions of your module (see FT_DEFINE_MODULE). */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the array will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { serv_id_7, serv_data_7 }, \
+ { NULL, NULL } \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = NULL; \
+ clazz[1].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = NULL; \
+ clazz[2].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = NULL; \
+ clazz[3].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = NULL; \
+ clazz[4].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = NULL; \
+ clazz[5].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = NULL; \
+ clazz[6].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = serv_id_7; \
+ clazz[6].serv_data = serv_data_7; \
+ clazz[7].serv_id = NULL; \
+ clazz[7].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*
+ * Parse a list of FT_ServiceDescRec descriptors and look for
+ * a specific service by ID. Note that the last element in the
+ * array must be { NULL, NULL }, and that the function should
+ * return NULL if the service isn't available.
+ *
+ * This function can be used by modules to implement their
+ * `get_service' method.
+ */
+ FT_BASE( FT_Pointer )
+ ft_service_list_lookup( FT_ServiceDesc service_descriptors,
+ const char* service_id );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E S C A C H E *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * This structure is used to store a cache for several frequently used
+ * services. It is the type of `face->internal->services'. You
+ * should only use FT_FACE_LOOKUP_SERVICE to access it.
+ *
+ * All fields should have the type FT_Pointer to relax compilation
+ * dependencies. We assume the developer isn't completely stupid.
+ *
+ * Each field must be named `service_XXXX' where `XXX' corresponds to
+ * the correct FT_SERVICE_ID_XXXX macro. See the definition of
+ * FT_FACE_LOOKUP_SERVICE below how this is implemented.
+ *
+ */
+ typedef struct FT_ServiceCacheRec_
+ {
+ FT_Pointer service_POSTSCRIPT_FONT_NAME;
+ FT_Pointer service_MULTI_MASTERS;
+ FT_Pointer service_GLYPH_DICT;
+ FT_Pointer service_PFR_METRICS;
+ FT_Pointer service_WINFNT;
+
+ } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+ /*
+ * A magic number used within the services cache.
+ */
+
+ /* ensure that value `1' has the same width as a pointer */
+#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1)
+
+
+ /*
+ * @macro:
+ * FT_FACE_LOOKUP_SERVICE
+ *
+ * @description:
+ * This macro is used to lookup a service from a face's driver module
+ * using its cache.
+ *
+ * @input:
+ * face::
+ * The source face handle containing the cache.
+ *
+ * field ::
+ * The field name in the cache.
+ *
+ * id ::
+ * The service ID.
+ *
+ * @output:
+ * ptr ::
+ * A variable receiving the service data. NULL if not available.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ *Pptr = svc; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ ptr = svc; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+ /*
+ * A macro used to define new service structure types.
+ */
+
+#define FT_DEFINE_SERVICE( name ) \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ FT_Service_ ## name ## Rec ; \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ const * FT_Service_ ## name ; \
+ struct FT_Service_ ## name ## Rec_
+
+ /* */
+
+ /*
+ * The header files containing the services.
+ */
+
+#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftstream.h b/core/include/thirdparties/freetype/freetype/internal/ftstream.h
new file mode 100644
index 0000000000..c1a265431a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftstream.h
@@ -0,0 +1,536 @@
+/***************************************************************************/
+/* */
+/* ftstream.h */
+/* */
+/* Stream handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2006, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include "../../ft2build.h"
+#include "../ftsystem.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* format of an 8-bit frame_op value: */
+ /* */
+ /* bit 76543210 */
+ /* xxxxxxes */
+ /* */
+ /* s is set to 1 if the value is signed. */
+ /* e is set to 1 if the value is little-endian. */
+ /* xxx is a command. */
+
+#define FT_FRAME_OP_SHIFT 2
+#define FT_FRAME_OP_SIGNED 1
+#define FT_FRAME_OP_LITTLE 2
+#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+ ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END 0
+#define FT_FRAME_OP_START 1 /* start a new frame */
+#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */
+#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */
+#define FT_FRAME_OP_LONG 4 /* read 4-byte value */
+#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */
+#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */
+
+
+ typedef enum FT_Frame_Op_
+ {
+ ft_frame_end = 0,
+ ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+ ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ),
+ ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ),
+
+ ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+ ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+ ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+ ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+ ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+ ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+ ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+ ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+ ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+ ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+ ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+ ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+ ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+ ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+ } FT_Frame_Op;
+
+
+ typedef struct FT_Frame_Field_
+ {
+ FT_Byte value;
+ FT_Byte size;
+ FT_UShort offset;
+
+ } FT_Frame_Field;
+
+
+ /* Construct an FT_Frame_Field out of a structure type and a field name. */
+ /* The structure type must be set in the FT_STRUCTURE macro before */
+ /* calling the FT_FRAME_START() macro. */
+ /* */
+#define FT_FIELD_SIZE( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+ (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+ { \
+ frame_op, \
+ FT_FIELD_SIZE( field ), \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size ) { ft_frame_start, 0, size }
+#define FT_FRAME_END { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+ { \
+ ft_frame_bytes, \
+ count, \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 }
+
+
+ /*************************************************************************/
+ /* */
+ /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+ /* type `char*' or equivalent (1-byte elements). */
+ /* */
+
+#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] )
+
+#define FT_INT16( x ) ( (FT_Int16)(x) )
+#define FT_UINT16( x ) ( (FT_UInt16)(x) )
+#define FT_INT32( x ) ( (FT_Int32)(x) )
+#define FT_UINT32( x ) ( (FT_UInt32)(x) )
+
+
+#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8) | \
+ FT_BYTE_U16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+ FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_OFF3( p ) FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+
+#define FT_NEXT_CHAR( buffer ) \
+ ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer ) \
+ ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* Each GET_xxxx() macro uses an implicit `stream' variable. */
+ /* */
+#if 0
+#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR() FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE() FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT() FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT() FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3() FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG() FT_GET_MACRO( LONG )
+#define FT_GET_ULONG() FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4() FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type ) ( (type)func( stream ) )
+
+#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var ) \
+ ( var = (type)func( stream, &error ), \
+ error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /* initialize a stream for reading a regular system stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Open( FT_Stream stream,
+ const char* filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* create a new (input) stream from an FT_Open_Args structure */
+ FT_BASE( FT_Error )
+ FT_Stream_New( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Stream *astream );
+
+ /* free a stream */
+ FT_BASE( void )
+ FT_Stream_Free( FT_Stream stream,
+ FT_Int external );
+
+ /* initialize a stream for reading in-memory data */
+ FT_BASE( void )
+ FT_Stream_OpenMemory( FT_Stream stream,
+ const FT_Byte* base,
+ FT_ULong size );
+
+ /* close a stream (does not destroy the stream structure) */
+ FT_BASE( void )
+ FT_Stream_Close( FT_Stream stream );
+
+
+ /* seek within a stream. position is relative to start of stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Seek( FT_Stream stream,
+ FT_ULong pos );
+
+ /* skip bytes in a stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Skip( FT_Stream stream,
+ FT_Long distance );
+
+ /* return current stream position */
+ FT_BASE( FT_Long )
+ FT_Stream_Pos( FT_Stream stream );
+
+ /* read bytes from a stream into a user-allocated buffer, returns an */
+ /* error if not all bytes could be read. */
+ FT_BASE( FT_Error )
+ FT_Stream_Read( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* read bytes from a stream at a given position */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadAt( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* try to read bytes at the end of a stream; return number of bytes */
+ /* really available */
+ FT_BASE( FT_ULong )
+ FT_Stream_TryRead( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* Enter a frame of `count' consecutive bytes in a stream. Returns an */
+ /* error if the frame could not be read/accessed. The caller can use */
+ /* the FT_Stream_Get_XXX functions to retrieve frame data without */
+ /* error checks. */
+ /* */
+ /* You must _always_ call FT_Stream_ExitFrame() once you have entered */
+ /* a stream frame! */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_EnterFrame( FT_Stream stream,
+ FT_ULong count );
+
+ /* exit a stream frame */
+ FT_BASE( void )
+ FT_Stream_ExitFrame( FT_Stream stream );
+
+ /* Extract a stream frame. If the stream is disk-based, a heap block */
+ /* is allocated and the frame bytes are read into it. If the stream */
+ /* is memory-based, this function simply set a pointer to the data. */
+ /* */
+ /* Useful to optimize access to memory-based streams transparently. */
+ /* */
+ /* All extracted frames must be `freed' with a call to the function */
+ /* FT_Stream_ReleaseFrame(). */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_ExtractFrame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes );
+
+ /* release an extract frame (see FT_Stream_ExtractFrame) */
+ FT_BASE( void )
+ FT_Stream_ReleaseFrame( FT_Stream stream,
+ FT_Byte** pbytes );
+
+ /* read a byte from an entered frame */
+ FT_BASE( FT_Char )
+ FT_Stream_GetChar( FT_Stream stream );
+
+ /* read a 16-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShort( FT_Stream stream );
+
+ /* read a 24-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetUOffset( FT_Stream stream );
+
+ /* read a 32-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULong( FT_Stream stream );
+
+ /* read a 16-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShortLE( FT_Stream stream );
+
+ /* read a 32-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULongLE( FT_Stream stream );
+
+
+ /* read a byte from a stream */
+ FT_BASE( FT_Char )
+ FT_Stream_ReadChar( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShort( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 24-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadUOffset( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit big-endian integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULongLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* Read a structure from a stream. The structure must be described */
+ /* by an array of FT_Frame_Field records. */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadFields( FT_Stream stream,
+ const FT_Frame_Field* fields,
+ void* structure );
+
+
+#define FT_STREAM_POS() \
+ FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position ) \
+ FT_SET_ERROR( FT_Stream_Seek( stream, \
+ (FT_ULong)(position) ) )
+
+#define FT_STREAM_SKIP( distance ) \
+ FT_SET_ERROR( FT_Stream_Skip( stream, \
+ (FT_Long)(distance) ) )
+
+#define FT_STREAM_READ( buffer, count ) \
+ FT_SET_ERROR( FT_Stream_Read( stream, \
+ (FT_Byte*)(buffer), \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count ) \
+ FT_SET_ERROR( FT_Stream_ReadAt( stream, \
+ (FT_ULong)(position), \
+ (FT_Byte*)buffer, \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object ) \
+ FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \
+ (FT_ULong)(size) ) ) )
+
+#define FT_FRAME_EXIT() \
+ FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \
+ (FT_ULong)(size), \
+ (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes ) \
+ FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \
+ (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/fttrace.h b/core/include/thirdparties/freetype/freetype/internal/fttrace.h
new file mode 100644
index 0000000000..a9d98b60aa
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/fttrace.h
@@ -0,0 +1,152 @@
+/***************************************************************************/
+/* */
+/* fttrace.h */
+/* */
+/* Tracing handling (specification only). */
+/* */
+/* Copyright 2002, 2004-2007, 2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /* definitions of trace levels for FreeType 2 */
+
+ /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+ /* base components */
+FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */
+FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */
+FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */
+FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */
+FT_TRACE_DEF( list ) /* list management (ftlist.c) */
+FT_TRACE_DEF( init ) /* initialization (ftinit.c) */
+FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */
+FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */
+FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */
+FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */
+
+FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */
+FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */
+FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */
+FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */
+FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */
+FT_TRACE_DEF( bitmap ) /* bitmap checksum (ftobjs.c) */
+
+ /* Cache sub-system */
+FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */
+
+ /* SFNT driver components */
+FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */
+FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */
+FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */
+FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */
+FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */
+FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */
+FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */
+FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */
+FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */
+
+ /* TrueType driver components */
+FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */
+FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */
+FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */
+FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */
+FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */
+FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */
+
+ /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+ /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( psconv )
+
+ /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+ /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+FT_TRACE_DEF( cf2blues )
+FT_TRACE_DEF( cf2hints )
+FT_TRACE_DEF( cf2interp )
+
+ /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+ /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+ /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+ /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+ /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+ /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+ /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+ /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+ /* autofit components */
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/ftvalid.h b/core/include/thirdparties/freetype/freetype/internal/ftvalid.h
new file mode 100644
index 0000000000..444261317d
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/ftvalid.h
@@ -0,0 +1,161 @@
+/***************************************************************************/
+/* */
+/* ftvalid.h */
+/* */
+/* FreeType validation support (specification). */
+/* */
+/* Copyright 2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include "../../ft2build.h"
+#include "../config/ftstdlib.h" /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** V A L I D A T I O N ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to a validation object */
+ typedef struct FT_ValidatorRec_ volatile* FT_Validator;
+
+
+ /*************************************************************************/
+ /* */
+ /* There are three distinct validation levels defined here: */
+ /* */
+ /* FT_VALIDATE_DEFAULT :: */
+ /* A table that passes this validation level can be used reliably by */
+ /* FreeType. It generally means that all offsets have been checked to */
+ /* prevent out-of-bound reads, that array counts are correct, etc. */
+ /* */
+ /* FT_VALIDATE_TIGHT :: */
+ /* A table that passes this validation level can be used reliably and */
+ /* doesn't contain invalid data. For example, a charmap table that */
+ /* returns invalid glyph indices will not pass, even though it can */
+ /* be used with FreeType in default mode (the library will simply */
+ /* return an error later when trying to load the glyph). */
+ /* */
+ /* It also checks that fields which must be a multiple of 2, 4, or 8, */
+ /* don't have incorrect values, etc. */
+ /* */
+ /* FT_VALIDATE_PARANOID :: */
+ /* Only for font debugging. Checks that a table follows the */
+ /* specification by 100%. Very few fonts will be able to pass this */
+ /* level anyway but it can be useful for certain tools like font */
+ /* editors/converters. */
+ /* */
+ typedef enum FT_ValidationLevel_
+ {
+ FT_VALIDATE_DEFAULT = 0,
+ FT_VALIDATE_TIGHT,
+ FT_VALIDATE_PARANOID
+
+ } FT_ValidationLevel;
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `structure was padded due to */
+ /* __declspec(align())' in order to compile cleanly with */
+ /* the maximum level of warnings. */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+ /* validator structure */
+ typedef struct FT_ValidatorRec_
+ {
+ const FT_Byte* base; /* address of table in memory */
+ const FT_Byte* limit; /* `base' + sizeof(table) in memory */
+ FT_ValidationLevel level; /* validation level */
+ FT_Error error; /* error returned. 0 means success */
+
+ ft_jmp_buf jump_buffer; /* used for exception handling */
+
+ } FT_ValidatorRec;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) )
+
+
+ FT_BASE( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level );
+
+ /* Do not use this. It's broken and will cause your validator to crash */
+ /* if you run it on an invalid font. */
+ FT_BASE( FT_Int )
+ ft_validator_run( FT_Validator valid );
+
+ /* Sets the error field in a validator, then calls `longjmp' to return */
+ /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */
+ /* error checks within the validation routines. */
+ /* */
+ FT_BASE( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error );
+
+
+ /* Calls ft_validate_error. Assumes that the `valid' local variable */
+ /* holds a pointer to the current validator object. */
+ /* */
+ /* Use preprocessor prescan to pass FT_ERR_PREFIX. */
+ /* */
+#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+ ft_validator_error( valid, _prefix ## _error )
+
+ /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+ /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+ /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/internal.h b/core/include/thirdparties/freetype/freetype/internal/internal.h
new file mode 100644
index 0000000000..262afcfa8a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/internal.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* internal.h */
+/* */
+/* Internal header files (specification only). */
+/* */
+/* Copyright 1996-2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is automatically included by `ft2build.h'. */
+ /* Do not include it manually! */
+ /* */
+ /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+
+ /* We disable the warning `conditional expression is constant' here */
+ /* in order to compile cleanly with the maximum level of warnings. */
+ /* In particular, the warning complains about stuff like `while(0)' */
+ /* which is very useful in macro definitions. There is no benefit */
+ /* in having it enabled. */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/psaux.h b/core/include/thirdparties/freetype/freetype/internal/psaux.h
new file mode 100644
index 0000000000..3128ea4cb7
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/psaux.h
@@ -0,0 +1,877 @@
+/***************************************************************************/
+/* */
+/* psaux.h */
+/* */
+/* Auxiliary functions and data structures related to PostScript fonts */
+/* (specification). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+#include "t1types.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct PS_TableRec_* PS_Table;
+ typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Table_FuncsRec */
+ /* */
+ /* <Description> */
+ /* A set of function pointers to manage PS_Table objects. */
+ /* */
+ /* <Fields> */
+ /* table_init :: Used to initialize a table. */
+ /* */
+ /* table_done :: Finalizes resp. destroy a given table. */
+ /* */
+ /* table_add :: Adds a new object to a table. */
+ /* */
+ /* table_release :: Releases table data, then finalizes it. */
+ /* */
+ typedef struct PS_Table_FuncsRec_
+ {
+ FT_Error
+ (*init)( PS_Table table,
+ FT_Int count,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Table table );
+
+ FT_Error
+ (*add)( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length );
+
+ void
+ (*release)( PS_Table table );
+
+ } PS_Table_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_TableRec */
+ /* */
+ /* <Description> */
+ /* A PS_Table is a simple object used to store an array of objects in */
+ /* a single memory block. */
+ /* */
+ /* <Fields> */
+ /* block :: The address in memory of the growheap's block. This */
+ /* can change between two object adds, due to */
+ /* reallocation. */
+ /* */
+ /* cursor :: The current top of the grow heap within its block. */
+ /* */
+ /* capacity :: The current size of the heap block. Increments by */
+ /* 1kByte chunks. */
+ /* */
+ /* init :: Set to 0xDEADBEEF if `elements' and `lengths' have */
+ /* been allocated. */
+ /* */
+ /* max_elems :: The maximum number of elements in table. */
+ /* */
+ /* num_elems :: The current number of elements in table. */
+ /* */
+ /* elements :: A table of element addresses within the block. */
+ /* */
+ /* lengths :: A table of element sizes within the block. */
+ /* */
+ /* memory :: The object used for memory operations */
+ /* (alloc/realloc). */
+ /* */
+ /* funcs :: A table of method pointers for this object. */
+ /* */
+ typedef struct PS_TableRec_
+ {
+ FT_Byte* block; /* current memory block */
+ FT_Offset cursor; /* current cursor in memory block */
+ FT_Offset capacity; /* current size of memory block */
+ FT_Long init;
+
+ FT_Int max_elems;
+ FT_Int num_elems;
+ FT_Byte** elements; /* addresses of table elements */
+ FT_PtrDist* lengths; /* lengths of table elements */
+
+ FT_Memory memory;
+ PS_Table_FuncsRec funcs;
+
+ } PS_TableRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 FIELDS & TOKENS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PS_ParserRec_* PS_Parser;
+
+ typedef struct T1_TokenRec_* T1_Token;
+
+ typedef struct T1_FieldRec_* T1_Field;
+
+
+ /* simple enumeration type used to identify token types */
+ typedef enum T1_TokenType_
+ {
+ T1_TOKEN_TYPE_NONE = 0,
+ T1_TOKEN_TYPE_ANY,
+ T1_TOKEN_TYPE_STRING,
+ T1_TOKEN_TYPE_ARRAY,
+ T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+ /* do not remove */
+ T1_TOKEN_TYPE_MAX
+
+ } T1_TokenType;
+
+
+ /* a simple structure used to identify tokens */
+ typedef struct T1_TokenRec_
+ {
+ FT_Byte* start; /* first character of token in input stream */
+ FT_Byte* limit; /* first character after the token */
+ T1_TokenType type; /* type of token */
+
+ } T1_TokenRec;
+
+
+ /* enumeration type used to identify object fields */
+ typedef enum T1_FieldType_
+ {
+ T1_FIELD_TYPE_NONE = 0,
+ T1_FIELD_TYPE_BOOL,
+ T1_FIELD_TYPE_INTEGER,
+ T1_FIELD_TYPE_FIXED,
+ T1_FIELD_TYPE_FIXED_1000,
+ T1_FIELD_TYPE_STRING,
+ T1_FIELD_TYPE_KEY,
+ T1_FIELD_TYPE_BBOX,
+ T1_FIELD_TYPE_MM_BBOX,
+ T1_FIELD_TYPE_INTEGER_ARRAY,
+ T1_FIELD_TYPE_FIXED_ARRAY,
+ T1_FIELD_TYPE_CALLBACK,
+
+ /* do not remove */
+ T1_FIELD_TYPE_MAX
+
+ } T1_FieldType;
+
+
+ typedef enum T1_FieldLocation_
+ {
+ T1_FIELD_LOCATION_CID_INFO,
+ T1_FIELD_LOCATION_FONT_DICT,
+ T1_FIELD_LOCATION_FONT_EXTRA,
+ T1_FIELD_LOCATION_FONT_INFO,
+ T1_FIELD_LOCATION_PRIVATE,
+ T1_FIELD_LOCATION_BBOX,
+ T1_FIELD_LOCATION_LOADER,
+ T1_FIELD_LOCATION_FACE,
+ T1_FIELD_LOCATION_BLEND,
+
+ /* do not remove */
+ T1_FIELD_LOCATION_MAX
+
+ } T1_FieldLocation;
+
+
+ typedef void
+ (*T1_Field_ParseFunc)( FT_Face face,
+ FT_Pointer parser );
+
+
+ /* structure type used to model object fields */
+ typedef struct T1_FieldRec_
+ {
+ const char* ident; /* field identifier */
+ T1_FieldLocation location;
+ T1_FieldType type; /* type of field */
+ T1_Field_ParseFunc reader;
+ FT_UInt offset; /* offset of field in object */
+ FT_Byte size; /* size of field in bytes */
+ FT_UInt array_max; /* maximum number of elements for */
+ /* array */
+ FT_UInt count_offset; /* offset of element count for */
+ /* arrays; must not be zero if in */
+ /* use -- in other words, a */
+ /* `num_FOO' element must not */
+ /* start the used structure if we */
+ /* parse a `FOO' array */
+ FT_UInt dict; /* where we expect it */
+ } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE( _fname ), \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+ { \
+ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
+ (T1_Field_ParseFunc)_reader, \
+ 0, 0, \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, \
+ FT_FIELD_OFFSET( num_ ## _fname ), \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, 0, \
+ _dict \
+ },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+ _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \
+ T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs;
+
+ typedef struct PS_Parser_FuncsRec_
+ {
+ void
+ (*init)( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Parser parser );
+
+ void
+ (*skip_spaces)( PS_Parser parser );
+ void
+ (*skip_PS_token)( PS_Parser parser );
+
+ FT_Long
+ (*to_int)( PS_Parser parser );
+ FT_Fixed
+ (*to_fixed)( PS_Parser parser,
+ FT_Int power_ten );
+
+ FT_Error
+ (*to_bytes)( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters );
+
+ FT_Int
+ (*to_coord_array)( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords );
+ FT_Int
+ (*to_fixed_array)( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten );
+
+ void
+ (*to_token)( PS_Parser parser,
+ T1_Token token );
+ void
+ (*to_token_array)( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens );
+
+ FT_Error
+ (*load_field)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_Error
+ (*load_field_table)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ } PS_Parser_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_ParserRec */
+ /* */
+ /* <Description> */
+ /* A PS_Parser is an object used to parse a Type 1 font very quickly. */
+ /* */
+ /* <Fields> */
+ /* cursor :: The current position in the text. */
+ /* */
+ /* base :: Start of the processed text. */
+ /* */
+ /* limit :: End of the processed text. */
+ /* */
+ /* error :: The last error returned. */
+ /* */
+ /* memory :: The object used for memory operations (alloc/realloc). */
+ /* */
+ /* funcs :: A table of functions for the parser. */
+ /* */
+ typedef struct PS_ParserRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Error error;
+ FT_Memory memory;
+
+ PS_Parser_FuncsRec funcs;
+
+ } PS_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_BuilderRec_* T1_Builder;
+
+
+ typedef FT_Error
+ (*T1_Builder_Check_Points_Func)( T1_Builder builder,
+ FT_Int count );
+
+ typedef void
+ (*T1_Builder_Add_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Point1_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Contour_Func)( T1_Builder builder );
+
+ typedef FT_Error
+ (*T1_Builder_Start_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef void
+ (*T1_Builder_Close_Contour_Func)( T1_Builder builder );
+
+
+ typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs;
+
+ typedef struct T1_Builder_FuncsRec_
+ {
+ void
+ (*init)( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Bool hinting );
+
+ void
+ (*done)( T1_Builder builder );
+
+ T1_Builder_Check_Points_Func check_points;
+ T1_Builder_Add_Point_Func add_point;
+ T1_Builder_Add_Point1_Func add_point1;
+ T1_Builder_Add_Contour_Func add_contour;
+ T1_Builder_Start_Point_Func start_point;
+ T1_Builder_Close_Contour_Func close_contour;
+
+ } T1_Builder_FuncsRec;
+
+
+ /* an enumeration type to handle charstring parsing states */
+ typedef enum T1_ParseState_
+ {
+ T1_Parse_Start,
+ T1_Parse_Have_Width,
+ T1_Parse_Have_Moveto,
+ T1_Parse_Have_Path
+
+ } T1_ParseState;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Structure> */
+ /* T1_BuilderRec */
+ /* */
+ /* <Description> */
+ /* A structure used during glyph loading to store its outline. */
+ /* */
+ /* <Fields> */
+ /* memory :: The current memory object. */
+ /* */
+ /* face :: The current face object. */
+ /* */
+ /* glyph :: The current glyph slot. */
+ /* */
+ /* loader :: XXX */
+ /* */
+ /* base :: The base glyph outline. */
+ /* */
+ /* current :: The current glyph outline. */
+ /* */
+ /* max_points :: maximum points in builder outline */
+ /* */
+ /* max_contours :: Maximum number of contours in builder outline. */
+ /* */
+ /* pos_x :: The horizontal translation (if composite glyph). */
+ /* */
+ /* pos_y :: The vertical translation (if composite glyph). */
+ /* */
+ /* left_bearing :: The left side bearing point. */
+ /* */
+ /* advance :: The horizontal advance vector. */
+ /* */
+ /* bbox :: Unused. */
+ /* */
+ /* parse_state :: An enumeration which controls the charstring */
+ /* parsing state. */
+ /* */
+ /* load_points :: If this flag is not set, no points are loaded. */
+ /* */
+ /* no_recurse :: Set but not used. */
+ /* */
+ /* metrics_only :: A boolean indicating that we only want to compute */
+ /* the metrics of a given glyph, not load all of its */
+ /* points. */
+ /* */
+ /* funcs :: An array of function pointers for the builder. */
+ /* */
+ typedef struct T1_BuilderRec_
+ {
+ FT_Memory memory;
+ FT_Face face;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader loader;
+ FT_Outline* base;
+ FT_Outline* current;
+
+ FT_Pos pos_x;
+ FT_Pos pos_y;
+
+ FT_Vector left_bearing;
+ FT_Vector advance;
+
+ FT_BBox bbox; /* bounding box */
+ T1_ParseState parse_state;
+ FT_Bool load_points;
+ FT_Bool no_recurse;
+
+ FT_Bool metrics_only;
+
+ void* hints_funcs; /* hinter-specific */
+ void* hints_globals; /* hinter-specific */
+
+ T1_Builder_FuncsRec funcs;
+
+ } T1_BuilderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 DECODER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 8
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 32
+
+#endif /* 0 */
+
+
+ typedef struct T1_Decoder_ZoneRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+
+ } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+ typedef struct T1_DecoderRec_* T1_Decoder;
+ typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs;
+
+
+ typedef FT_Error
+ (*T1_Decoder_Callback)( T1_Decoder decoder,
+ FT_UInt glyph_index );
+
+
+ typedef struct T1_Decoder_FuncsRec_
+ {
+ FT_Error
+ (*init)( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback callback );
+
+ void
+ (*done)( T1_Decoder decoder );
+
+ FT_Error
+ (*parse_charstrings)( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+
+ } T1_Decoder_FuncsRec;
+
+
+ typedef struct T1_DecoderRec_
+ {
+ T1_BuilderRec builder;
+
+ FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS];
+ FT_Long* top;
+
+ T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1];
+ T1_Decoder_Zone zone;
+
+ FT_Service_PsCMaps psnames; /* for seac */
+ FT_UInt num_glyphs;
+ FT_Byte** glyph_names;
+
+ FT_Int lenIV; /* internal for sub routine calls */
+ FT_UInt num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len; /* array of subrs length (optional) */
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ PS_Blend blend; /* for multiple master support */
+
+ FT_Render_Mode hint_mode;
+
+ T1_Decoder_Callback parse_callback;
+ T1_Decoder_FuncsRec funcs;
+
+ FT_Long* buildchar;
+ FT_UInt len_buildchar;
+
+ FT_Bool seac;
+
+ } T1_DecoderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** AFM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_ParserRec_* AFM_Parser;
+
+ typedef struct AFM_Parser_FuncsRec_
+ {
+ FT_Error
+ (*init)( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit );
+
+ void
+ (*done)( AFM_Parser parser );
+
+ FT_Error
+ (*parse)( AFM_Parser parser );
+
+ } AFM_Parser_FuncsRec;
+
+
+ typedef struct AFM_StreamRec_* AFM_Stream;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* AFM_ParserRec */
+ /* */
+ /* <Description> */
+ /* An AFM_Parser is a parser for the AFM files. */
+ /* */
+ /* <Fields> */
+ /* memory :: The object used for memory operations (alloc and */
+ /* realloc). */
+ /* */
+ /* stream :: This is an opaque object. */
+ /* */
+ /* FontInfo :: The result will be stored here. */
+ /* */
+ /* get_index :: A user provided function to get a glyph index by its */
+ /* name. */
+ /* */
+ typedef struct AFM_ParserRec_
+ {
+ FT_Memory memory;
+ AFM_Stream stream;
+
+ AFM_FontInfo FontInfo;
+
+ FT_Int
+ (*get_index)( const char* name,
+ FT_Offset len,
+ void* user_data );
+
+ void* user_data;
+
+ } AFM_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CHARMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes;
+
+ typedef struct T1_CMap_ClassesRec_
+ {
+ FT_CMap_Class standard;
+ FT_CMap_Class expert;
+ FT_CMap_Class custom;
+ FT_CMap_Class unicode;
+
+ } T1_CMap_ClassesRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PSAux Module Interface *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSAux_ServiceRec_
+ {
+ /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+ const PS_Table_FuncsRec* ps_table_funcs;
+ const PS_Parser_FuncsRec* ps_parser_funcs;
+ const T1_Builder_FuncsRec* t1_builder_funcs;
+ const T1_Decoder_FuncsRec* t1_decoder_funcs;
+
+ void
+ (*t1_decrypt)( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed );
+
+ T1_CMap_Classes t1_cmap_classes;
+
+ /* fields after this comment line were added after version 2.1.10 */
+ const AFM_Parser_FuncsRec* afm_parser_funcs;
+
+ } PSAux_ServiceRec, *PSAux_Service;
+
+ /* backwards-compatible type definition */
+ typedef PSAux_ServiceRec PSAux_Interface;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** Some convenience functions *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+ ( (ch) == '\r' || \
+ (ch) == '\n' )
+
+#define IS_PS_SPACE( ch ) \
+ ( (ch) == ' ' || \
+ IS_PS_NEWLINE( ch ) || \
+ (ch) == '\t' || \
+ (ch) == '\f' || \
+ (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch ) \
+ ( (ch) == '/' || \
+ (ch) == '(' || (ch) == ')' || \
+ (ch) == '<' || (ch) == '>' || \
+ (ch) == '[' || (ch) == ']' || \
+ (ch) == '{' || (ch) == '}' || \
+ (ch) == '%' )
+
+#define IS_PS_DELIM( ch ) \
+ ( IS_PS_SPACE( ch ) || \
+ IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch ) \
+ ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch ) \
+ ( IS_PS_DIGIT( ch ) || \
+ ( (ch) >= 'A' && (ch) <= 'F' ) || \
+ ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch ) \
+ ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token ) \
+ ( (char)(cur)[0] == (token)[0] && \
+ ( (cur) + sizeof ( (token) ) == (limit) || \
+ ( (cur) + sizeof( (token) ) < (limit) && \
+ IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \
+ ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/pshints.h b/core/include/thirdparties/freetype/freetype/internal/pshints.h
new file mode 100644
index 0000000000..f9b594079a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/pshints.h
@@ -0,0 +1,722 @@
+/***************************************************************************/
+/* */
+/* pshints.h */
+/* */
+/* Interface to Postscript-specific (Type 1 and Type 2) hints */
+/* recorders (specification only). These are used to support native */
+/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */
+/* */
+/* Copyright 2001-2003, 2005-2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+#include "../t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INTERNAL REPRESENTATION OF GLOBALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSH_GlobalsRec_* PSH_Globals;
+
+ typedef FT_Error
+ (*PSH_Globals_NewFunc)( FT_Memory memory,
+ T1_Private* private_dict,
+ PSH_Globals* aglobals );
+
+ typedef FT_Error
+ (*PSH_Globals_SetScaleFunc)( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta );
+
+ typedef void
+ (*PSH_Globals_DestroyFunc)( PSH_Globals globals );
+
+
+ typedef struct PSH_Globals_FuncsRec_
+ {
+ PSH_Globals_NewFunc create;
+ PSH_Globals_SetScaleFunc set_scale;
+ PSH_Globals_DestroyFunc destroy;
+
+ } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 1 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 1 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T1_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stem', `stem3', or `reset'). Note that these functions do
+ * not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * PostScript hinter.
+ *
+ */
+ typedef struct T1_HintsRec_* T1_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+ * a given @T1_Hints object.
+ *
+ */
+ typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to prepare it for a new Type 1
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * @note:
+ * You should always call the @T1_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T1_Hints_OpenFunc)( T1_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStemFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record a new horizontal or
+ * vertical stem. This corresponds to the Type 1 `hstem' and `vstem'
+ * operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * coords ::
+ * Array of 2 coordinates in 16.16 format, used as (position,length)
+ * stem descriptor.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * `coords[0]' is the absolute stem position (lowest coordinate);
+ * `coords[1]' is the length.
+ *
+ * The length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ * If the length is -21 (corresponding to a bottom ghost stem), then
+ * the real stem position is `coords[0]+coords[1]'.
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStemFunc)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStem3Func
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record three
+ * counter-controlled horizontal or vertical stems at once.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems, 1 for vertical ones.
+ *
+ * coords ::
+ * An array of 6 values in 16.16 format, holding 3 (position,length)
+ * pairs for the counter-controlled stems.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * The lengths cannot be negative (ghost stems are never
+ * counter-controlled).
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStem3Func)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ResetFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to reset the stems hints in a
+ * recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph in which the
+ * previously defined hints apply.
+ *
+ */
+ typedef void
+ (*T1_Hints_ResetFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_CloseFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called once all hints have been
+ * recorded.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font as the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_ApplyFunc)( T1_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T1_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T1_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T1 Hints recorder.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stem ::
+ * The function to set a simple stem.
+ *
+ * stem3 ::
+ * The function to set counter-controlled stems.
+ *
+ * reset ::
+ * The function to reset stem hints.
+ *
+ * apply ::
+ * The function to apply the hints to the corresponding glyph outline.
+ *
+ */
+ typedef struct T1_Hints_FuncsRec_
+ {
+ T1_Hints hints;
+ T1_Hints_OpenFunc open;
+ T1_Hints_CloseFunc close;
+ T1_Hints_SetStemFunc stem;
+ T1_Hints_SetStem3Func stem3;
+ T1_Hints_ResetFunc reset;
+ T1_Hints_ApplyFunc apply;
+
+ } T1_Hints_FuncsRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 2 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 2 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T2_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stems', `hintmask', `counters'). Note that these
+ * functions do not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * Postscript hinter.
+ *
+ */
+ typedef struct T2_HintsRec_* T2_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+ * a given @T2_Hints object.
+ *
+ */
+ typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to prepare it for a new Type 2
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * @note:
+ * You should always call the @T2_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T2_Hints_OpenFunc)( T2_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_StemsFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set the table of stems in
+ * either the vertical or horizontal dimension. Equivalent to the
+ * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * count ::
+ * The number of stems.
+ *
+ * coords ::
+ * An array of `count' (position,length) pairs in 16.16 format.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * There are `2*count' elements in the `coords' array. Each even
+ * element is an absolute position in font units, each odd element is a
+ * length in font units.
+ *
+ * A length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ */
+ typedef void
+ (*T2_Hints_StemsFunc)( T2_Hints hints,
+ FT_UInt dimension,
+ FT_UInt count,
+ FT_Fixed* coordinates );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_MaskFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given hintmask (this
+ * corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The glyph index of the last point to which the previously defined
+ * or activated hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_MaskFunc)( T2_Hints hints,
+ FT_UInt end_point,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CounterFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given counter mask
+ * (this corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * A glyph index of the last point to which the previously defined or
+ * active hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_CounterFunc)( T2_Hints hints,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_CloseFunc)( T2_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called after the `close'
+ * method.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font than the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_ApplyFunc)( T2_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T2_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T2_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T2 hints recorder object.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stems ::
+ * The function to set the dimension's stems table.
+ *
+ * hintmask ::
+ * The function to set hint masks.
+ *
+ * counter ::
+ * The function to set counter masks.
+ *
+ * apply ::
+ * The function to apply the hints on the corresponding glyph outline.
+ *
+ */
+ typedef struct T2_Hints_FuncsRec_
+ {
+ T2_Hints hints;
+ T2_Hints_OpenFunc open;
+ T2_Hints_CloseFunc close;
+ T2_Hints_StemsFunc stems;
+ T2_Hints_MaskFunc hintmask;
+ T2_Hints_CounterFunc counter;
+ T2_Hints_ApplyFunc apply;
+
+ } T2_Hints_FuncsRec;
+
+
+ /* */
+
+
+ typedef struct PSHinter_Interface_
+ {
+ PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module );
+ T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module );
+ T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module );
+
+ } PSHinter_Interface;
+
+ typedef PSHinter_Interface* PSHinter_Service;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ static const PSHinter_Interface class_ = \
+ { \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ PSHinter_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_globals_funcs = get_globals_funcs_; \
+ clazz->get_t1_funcs = get_t1_funcs_; \
+ clazz->get_t2_funcs = get_t2_funcs_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h b/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h
new file mode 100644
index 0000000000..508bd1566f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svbdf.h
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/* */
+/* svbdf.h */
+/* */
+/* The FreeType BDF services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include "../../ftbdf.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF "bdf"
+
+ typedef FT_Error
+ (*FT_BDF_GetCharsetIdFunc)( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+ typedef FT_Error
+ (*FT_BDF_GetPropertyFunc)( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+
+ FT_DEFINE_SERVICE( BDF )
+ {
+ FT_BDF_GetCharsetIdFunc get_charset_id;
+ FT_BDF_GetPropertyFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ static const FT_Service_BDFRec class_ = \
+ { \
+ get_charset_id_, get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_BDFRec* clazz ) \
+ { \
+ clazz->get_charset_id = get_charset_id_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svcid.h b/core/include/thirdparties/freetype/freetype/internal/services/svcid.h
new file mode 100644
index 0000000000..fe33c74242
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svcid.h
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/* */
+/* svcid.h */
+/* */
+/* The FreeType CID font services (specification). */
+/* */
+/* Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID "CID"
+
+ typedef FT_Error
+ (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement );
+ typedef FT_Error
+ (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face,
+ FT_Bool *is_cid );
+ typedef FT_Error
+ (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ FT_DEFINE_SERVICE( CID )
+ {
+ FT_CID_GetRegistryOrderingSupplementFunc get_ros;
+ FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid;
+ FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ static const FT_Service_CIDRec class_ = \
+ { \
+ get_ros_, get_is_cid_, get_cid_from_glyph_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_CIDRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ros = get_ros_; \
+ clazz->get_is_cid = get_is_cid_; \
+ clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h b/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h
new file mode 100644
index 0000000000..9956f74455
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svgldict.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* svgldict.h */
+/* */
+/* The FreeType glyph dictionary services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to retrieve glyph names, as well as to find the
+ * index of a given glyph name in a font.
+ *
+ */
+
+#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict"
+
+
+ typedef FT_Error
+ (*FT_GlyphDict_GetNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_GlyphDict_NameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+ FT_DEFINE_SERVICE( GlyphDict )
+ {
+ FT_GlyphDict_GetNameFunc get_name;
+ FT_GlyphDict_NameIndexFunc name_index; /* optional */
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ static const FT_Service_GlyphDictRec class_ = \
+ { \
+ get_name_, name_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_GlyphDictRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_name = get_name_; \
+ clazz->name_index = name_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h b/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h
new file mode 100644
index 0000000000..277b6a9931
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/* */
+/* svgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005 by */
+/* Masatake YAMATO, Red Hat K.K., */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include "../../ftgxval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate"
+
+ typedef FT_Error
+ (*gxv_validate_func)( FT_Face face,
+ FT_UInt gx_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ typedef FT_Error
+ (*ckern_validate_func)( FT_Face face,
+ FT_UInt ckern_flags,
+ FT_Bytes *ckern_table );
+
+
+ FT_DEFINE_SERVICE( GXvalidate )
+ {
+ gxv_validate_func validate;
+ };
+
+ FT_DEFINE_SERVICE( CKERNvalidate )
+ {
+ ckern_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svkern.h b/core/include/thirdparties/freetype/freetype/internal/services/svkern.h
new file mode 100644
index 0000000000..da03fef614
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* svkern.h */
+/* */
+/* The FreeType Kerning service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING "kerning"
+
+
+ typedef FT_Error
+ (*FT_Kerning_TrackGetFunc)( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+ FT_DEFINE_SERVICE( Kerning )
+ {
+ FT_Kerning_TrackGetFunc get_track;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svmm.h b/core/include/thirdparties/freetype/freetype/internal/services/svmm.h
new file mode 100644
index 0000000000..100ff8703a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svmm.h
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/* */
+/* svmm.h */
+/* */
+/* The FreeType Multiple Masters and GX var services (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to manage multiple-masters data in a given face.
+ *
+ * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+ *
+ */
+
+#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters"
+
+
+ typedef FT_Error
+ (*FT_Get_MM_Func)( FT_Face face,
+ FT_Multi_Master* master );
+
+ typedef FT_Error
+ (*FT_Get_MM_Var_Func)( FT_Face face,
+ FT_MM_Var* *master );
+
+ typedef FT_Error
+ (*FT_Set_MM_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+ typedef FT_Error
+ (*FT_Set_Var_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Set_MM_Blend_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ FT_DEFINE_SERVICE( MultiMasters )
+ {
+ FT_Get_MM_Func get_mm;
+ FT_Set_MM_Design_Func set_mm_design;
+ FT_Set_MM_Blend_Func set_mm_blend;
+ FT_Get_MM_Var_Func get_mm_var;
+ FT_Set_Var_Design_Func set_var_design;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ static const FT_Service_MultiMastersRec class_ = \
+ { \
+ get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \
+ { \
+ clazz->get_mm = get_mm_; \
+ clazz->set_mm_design = set_mm_design_; \
+ clazz->set_mm_blend = set_mm_blend_; \
+ clazz->get_mm_var = get_mm_var_; \
+ clazz->set_var_design = set_var_design_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svotval.h b/core/include/thirdparties/freetype/freetype/internal/services/svotval.h
new file mode 100644
index 0000000000..37cd34f298
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svotval.h */
+/* */
+/* The FreeType OpenType validation service (specification). */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include "../../ftotval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate"
+
+
+ typedef FT_Error
+ (*otv_validate_func)( FT_Face volatile face,
+ FT_UInt ot_flags,
+ FT_Bytes *base,
+ FT_Bytes *gdef,
+ FT_Bytes *gpos,
+ FT_Bytes *gsub,
+ FT_Bytes *jstf );
+
+
+ FT_DEFINE_SERVICE( OTvalidate )
+ {
+ otv_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h b/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h
new file mode 100644
index 0000000000..21a00d3750
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpfr.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/* */
+/* svpfr.h */
+/* */
+/* Internal PFR service functions (specification). */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include "../../ftpfr.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics"
+
+
+ typedef FT_Error
+ (*FT_PFR_GetMetricsFunc)( FT_Face face,
+ FT_UInt *aoutline,
+ FT_UInt *ametrics,
+ FT_Fixed *ax_scale,
+ FT_Fixed *ay_scale );
+
+ typedef FT_Error
+ (*FT_PFR_GetKerningFunc)( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+ typedef FT_Error
+ (*FT_PFR_GetAdvanceFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+
+ FT_DEFINE_SERVICE( PfrMetrics )
+ {
+ FT_PFR_GetMetricsFunc get_metrics;
+ FT_PFR_GetKerningFunc get_kerning;
+ FT_PFR_GetAdvanceFunc get_advance;
+
+ };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h b/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h
new file mode 100644
index 0000000000..7fe8603db2
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpostnm.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svpostnm.h */
+/* */
+/* The FreeType PostScript name services (specification). */
+/* */
+/* Copyright 2003, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * A trivial service used to retrieve the PostScript name of a given
+ * font when available. The `get_name' field should never be NULL.
+ *
+ * The corresponding function can return NULL to indicate that the
+ * PostScript name is not available.
+ *
+ * The name is owned by the face and will be destroyed with it.
+ */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name"
+
+
+ typedef const char*
+ (*FT_PsName_GetFunc)( FT_Face face );
+
+
+ FT_DEFINE_SERVICE( PsFontName )
+ {
+ FT_PsName_GetFunc get_ps_font_name;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ static const FT_Service_PsFontNameRec class_ = \
+ { \
+ get_ps_font_name_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsFontNameRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ps_font_name = get_ps_font_name_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svprop.h b/core/include/thirdparties/freetype/freetype/internal/services/svprop.h
new file mode 100644
index 0000000000..22da0bbc69
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svprop.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svprop.h */
+/* */
+/* The FreeType property service (specification). */
+/* */
+/* Copyright 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPROP_H__
+#define __SVPROP_H__
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PROPERTIES "properties"
+
+
+ typedef FT_Error
+ (*FT_Properties_SetFunc)( FT_Module module,
+ const char* property_name,
+ const void* value );
+
+ typedef FT_Error
+ (*FT_Properties_GetFunc)( FT_Module module,
+ const char* property_name,
+ void* value );
+
+
+ FT_DEFINE_SERVICE( Properties )
+ {
+ FT_Properties_SetFunc set_property;
+ FT_Properties_GetFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ static const FT_Service_PropertiesRec class_ = \
+ { \
+ set_property_, \
+ get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_PropertiesRec* clazz ) \
+ { \
+ clazz->set_property = set_property_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPROP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h b/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h
new file mode 100644
index 0000000000..592d14ff00
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpscmap.h
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/* */
+/* svpscmap.h */
+/* */
+/* The FreeType PostScript charmap service (specification). */
+/* */
+/* Copyright 2003, 2006, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include "../ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps"
+
+
+ /*
+ * Adobe glyph name to unicode value.
+ */
+ typedef FT_UInt32
+ (*PS_Unicode_ValueFunc)( const char* glyph_name );
+
+ /*
+ * Macintosh name id to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Macintosh_NameFunc)( FT_UInt name_index );
+
+ /*
+ * Adobe standard string ID to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index );
+
+
+ /*
+ * Simple unicode -> glyph index charmap built from font glyph names
+ * table.
+ */
+ typedef struct PS_UniMap_
+ {
+ FT_UInt32 unicode; /* bit 31 set: is glyph variant */
+ FT_UInt glyph_index;
+
+ } PS_UniMap;
+
+
+ typedef struct PS_UnicodesRec_* PS_Unicodes;
+
+ typedef struct PS_UnicodesRec_
+ {
+ FT_CMapRec cmap;
+ FT_UInt num_maps;
+ PS_UniMap* maps;
+
+ } PS_UnicodesRec;
+
+
+ /*
+ * A function which returns a glyph name for a given index. Returns
+ * NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_GetGlyphNameFunc)( FT_Pointer data,
+ FT_UInt string_index );
+
+ /*
+ * A function used to release the glyph name returned by
+ * PS_GetGlyphNameFunc, when needed
+ */
+ typedef void
+ (*PS_FreeGlyphNameFunc)( FT_Pointer data,
+ const char* name );
+
+ typedef FT_Error
+ (*PS_Unicodes_InitFunc)( FT_Memory memory,
+ PS_Unicodes unicodes,
+ FT_UInt num_glyphs,
+ PS_GetGlyphNameFunc get_glyph_name,
+ PS_FreeGlyphNameFunc free_glyph_name,
+ FT_Pointer glyph_data );
+
+ typedef FT_UInt
+ (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes,
+ FT_UInt32 unicode );
+
+ typedef FT_UInt32
+ (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes,
+ FT_UInt32 *unicode );
+
+
+ FT_DEFINE_SERVICE( PsCMaps )
+ {
+ PS_Unicode_ValueFunc unicode_value;
+
+ PS_Unicodes_InitFunc unicodes_init;
+ PS_Unicodes_CharIndexFunc unicodes_char_index;
+ PS_Unicodes_CharNextFunc unicodes_char_next;
+
+ PS_Macintosh_NameFunc macintosh_name;
+ PS_Adobe_Std_StringsFunc adobe_std_strings;
+ const unsigned short* adobe_std_encoding;
+ const unsigned short* adobe_expert_encoding;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ static const FT_Service_PsCMapsRec class_ = \
+ { \
+ unicode_value_, unicodes_init_, \
+ unicodes_char_index_, unicodes_char_next_, macintosh_name_, \
+ adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->unicode_value = unicode_value_; \
+ clazz->unicodes_init = unicodes_init_; \
+ clazz->unicodes_char_index = unicodes_char_index_; \
+ clazz->unicodes_char_next = unicodes_char_next_; \
+ clazz->macintosh_name = macintosh_name_; \
+ clazz->adobe_std_strings = adobe_std_strings_; \
+ clazz->adobe_std_encoding = adobe_std_encoding_; \
+ clazz->adobe_expert_encoding = adobe_expert_encoding_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h b/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h
new file mode 100644
index 0000000000..fa3b30317a
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/* */
+/* svpsinfo.h */
+/* */
+/* The FreeType PostScript info service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2011, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include "../ftserv.h"
+#include "../t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info"
+
+
+ typedef FT_Error
+ (*PS_GetFontInfoFunc)( FT_Face face,
+ PS_FontInfoRec* afont_info );
+
+ typedef FT_Error
+ (*PS_GetFontExtraFunc)( FT_Face face,
+ PS_FontExtraRec* afont_extra );
+
+ typedef FT_Int
+ (*PS_HasGlyphNamesFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*PS_GetFontPrivateFunc)( FT_Face face,
+ PS_PrivateRec* afont_private );
+
+ typedef FT_Long
+ (*PS_GetFontValueFunc)( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+
+ FT_DEFINE_SERVICE( PsInfo )
+ {
+ PS_GetFontInfoFunc ps_get_font_info;
+ PS_GetFontExtraFunc ps_get_font_extra;
+ PS_HasGlyphNamesFunc ps_has_glyph_names;
+ PS_GetFontPrivateFunc ps_get_font_private;
+ PS_GetFontValueFunc ps_get_font_value;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ static const FT_Service_PsInfoRec class_ = \
+ { \
+ get_font_info_, ps_get_font_extra_, has_glyph_names_, \
+ get_font_private_, get_font_value_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsInfoRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->ps_get_font_info = get_font_info_; \
+ clazz->ps_get_font_extra = ps_get_font_extra_; \
+ clazz->ps_has_glyph_names = has_glyph_names_; \
+ clazz->ps_get_font_private = get_font_private_; \
+ clazz->ps_get_font_value = get_font_value_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h b/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h
new file mode 100644
index 0000000000..3425042910
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svsfnt.h
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/* */
+/* svsfnt.h */
+/* */
+/* The FreeType SFNT table loading service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table"
+
+
+ /*
+ * Used to implement FT_Load_Sfnt_Table().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableLoadFunc)( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+ /*
+ * Used to implement FT_Get_Sfnt_Table().
+ */
+ typedef void*
+ (*FT_SFNT_TableGetFunc)( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /*
+ * Used to implement FT_Sfnt_Table_Info().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableInfoFunc)( FT_Face face,
+ FT_UInt idx,
+ FT_ULong *tag,
+ FT_ULong *offset,
+ FT_ULong *length );
+
+
+ FT_DEFINE_SERVICE( SFNT_Table )
+ {
+ FT_SFNT_TableLoadFunc load_table;
+ FT_SFNT_TableGetFunc get_table;
+ FT_SFNT_TableInfoFunc table_info;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ static const FT_Service_SFNT_TableRec class_ = \
+ { \
+ load_, get_, info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec* clazz ) \
+ { \
+ clazz->load_table = load_; \
+ clazz->get_table = get_; \
+ clazz->table_info = info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h b/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h
new file mode 100644
index 0000000000..02542ab83f
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svttcmap.h
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/* */
+/* svttcmap.h */
+/* */
+/* The FreeType TrueType/sfnt cmap extra information service. */
+/* */
+/* Copyright 2003 by */
+/* Masatake YAMATO, Redhat K.K. */
+/* */
+/* Copyright 2003, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/* Development of this service is support of
+ Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP "tt-cmaps"
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_CMapInfo */
+ /* */
+ /* <Description> */
+ /* A structure used to store TrueType/sfnt specific cmap information */
+ /* which is not covered by the generic @FT_CharMap structure. This */
+ /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */
+ /* */
+ /* <Fields> */
+ /* language :: */
+ /* The language ID used in Mac fonts. Definitions of values are in */
+ /* freetype/ttnameid.h. */
+ /* */
+ /* format :: */
+ /* The cmap format. OpenType 1.5 defines the formats 0 (byte */
+ /* encoding table), 2~(high-byte mapping through table), 4~(segment */
+ /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */
+ /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */
+ /* coverage), and 14 (Unicode Variation Sequences). */
+ /* */
+ typedef struct TT_CMapInfo_
+ {
+ FT_ULong language;
+ FT_Long format;
+
+ } TT_CMapInfo;
+
+
+ typedef FT_Error
+ (*TT_CMap_Info_GetFunc)( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info );
+
+
+ FT_DEFINE_SERVICE( TTCMaps )
+ {
+ TT_CMap_Info_GetFunc get_cmap_info;
+ };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ static const FT_Service_TTCMapsRec class_ = \
+ { \
+ get_cmap_info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_TTCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_cmap_info = get_cmap_info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h b/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h
new file mode 100644
index 0000000000..e567efbee5
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* svtteng.h */
+/* */
+/* The FreeType TrueType engine query service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include "../ftserv.h"
+#include "../../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine"
+
+ /*
+ * Used to implement FT_Get_TrueType_Engine_Type
+ */
+
+ FT_DEFINE_SERVICE( TrueTypeEngine )
+ {
+ FT_TrueTypeEngineType engine_type;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h b/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h
new file mode 100644
index 0000000000..d8824fb25b
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svttglyf.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/* */
+/* svttglyf.h */
+/* */
+/* The FreeType TrueType glyph service. */
+/* */
+/* Copyright 2007, 2009, 2012 by David Turner. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF "tt-glyf"
+
+
+ typedef FT_ULong
+ (*TT_Glyf_GetLocationFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_ULong *psize );
+
+ FT_DEFINE_SERVICE( TTGlyf )
+ {
+ TT_Glyf_GetLocationFunc get_location;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ static const FT_Service_TTGlyfRec class_ = \
+ { \
+ get_location_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_TTGlyfRec* clazz ) \
+ { \
+ clazz->get_location = get_location_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h b/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h
new file mode 100644
index 0000000000..013a991683
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/* */
+/* svwinfnt.h */
+/* */
+/* The FreeType Windows FNT/FONT service (specification). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include "../ftserv.h"
+#include "../../ftwinfnt.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT "winfonts"
+
+ typedef FT_Error
+ (*FT_WinFnt_GetHeaderFunc)( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ FT_DEFINE_SERVICE( WinFnt )
+ {
+ FT_WinFnt_GetHeaderFunc get_header;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h b/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h
new file mode 100644
index 0000000000..571f63d917
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/services/svxf86nm.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svxf86nm.h */
+/* */
+/* The FreeType XFree86 services (specification only). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A trivial service used to return the name of a face's font driver,
+ * according to the XFree86 nomenclature. Note that the service data
+ * is a simple constant string pointer.
+ */
+
+#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE "TrueType"
+#define FT_XF86_FORMAT_TYPE_1 "Type 1"
+#define FT_XF86_FORMAT_BDF "BDF"
+#define FT_XF86_FORMAT_PCF "PCF"
+#define FT_XF86_FORMAT_TYPE_42 "Type 42"
+#define FT_XF86_FORMAT_CID "CID Type 1"
+#define FT_XF86_FORMAT_CFF "CFF"
+#define FT_XF86_FORMAT_PFR "PFR"
+#define FT_XF86_FORMAT_WINFNT "Windows FNT"
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/sfnt.h b/core/include/thirdparties/freetype/freetype/internal/sfnt.h
new file mode 100644
index 0000000000..2759ba3a96
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/sfnt.h
@@ -0,0 +1,707 @@
+/***************************************************************************/
+/* */
+/* sfnt.h */
+/* */
+/* High-level `sfnt' driver interface (specification). */
+/* */
+/* Copyright 1996-2006, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include "../../ft2build.h"
+#include "ftdriver.h"
+#include "tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Init_Face_Func */
+ /* */
+ /* <Description> */
+ /* First part of the SFNT face object initialization. This finds */
+ /* the face in a SFNT file or collection, and load its format tag in */
+ /* face->format_tag. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ /* This function recognizes fonts embedded in a `TrueType */
+ /* collection'. */
+ /* */
+ /* Once the format tag has been validated by the font driver, it */
+ /* should then call the TT_Load_Face_Func() callback to read the rest */
+ /* of the SFNT tables in the object. */
+ /* */
+ typedef FT_Error
+ (*TT_Init_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Face_Func */
+ /* */
+ /* <Description> */
+ /* Second part of the SFNT face object initialization. This loads */
+ /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */
+ /* face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function must be called after TT_Init_Face_Func(). */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Done_Face_Func */
+ /* */
+ /* <Description> */
+ /* A callback used to delete the common SFNT data from a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Note> */
+ /* This function does NOT destroy the face object. */
+ /* */
+ typedef void
+ (*TT_Done_Face_Func)( TT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Any_Func */
+ /* */
+ /* <Description> */
+ /* Load any font table into client memory. */
+ /* */
+ /* <Input> */
+ /* face :: The face object to look for. */
+ /* */
+ /* tag :: The tag of table to load. Use the value 0 if you want */
+ /* to access the whole font file, else set this parameter */
+ /* to a valid TrueType table tag that you can forge with */
+ /* the MAKE_TT_TAG macro. */
+ /* */
+ /* offset :: The starting offset in the table (or the file if */
+ /* tag == 0). */
+ /* */
+ /* length :: The address of the decision variable: */
+ /* */
+ /* If length == NULL: */
+ /* Loads the whole table. Returns an error if */
+ /* `offset' == 0! */
+ /* */
+ /* If *length == 0: */
+ /* Exits immediately; returning the length of the given */
+ /* table or of the font file, depending on the value of */
+ /* `tag'. */
+ /* */
+ /* If *length != 0: */
+ /* Loads the next `length' bytes of table or font, */
+ /* starting at offset `offset' (in table or font too). */
+ /* */
+ /* <Output> */
+ /* buffer :: The address of target buffer. */
+ /* */
+ /* <Return> */
+ /* TrueType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Any_Func)( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte *buffer,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Find_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Check whether an embedded bitmap (an `sbit') exists for a given */
+ /* glyph, at a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* strike_index :: The current strike index. */
+ /* */
+ /* <Output> */
+ /* arange :: The SBit range containing the glyph index. */
+ /* */
+ /* astrike :: The SBit strike containing the glyph index. */
+ /* */
+ /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns */
+ /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */
+ /* glyph. */
+ /* */
+ typedef FT_Error
+ (*TT_Find_SBit_Image_Func)( TT_Face face,
+ FT_UInt glyph_index,
+ FT_ULong strike_index,
+ TT_SBit_Range *arange,
+ TT_SBit_Strike *astrike,
+ FT_ULong *aglyph_offset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Get the big metrics for a given embedded bitmap. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* range :: The SBit range containing the glyph. */
+ /* */
+ /* <Output> */
+ /* big_metrics :: A big SBit metrics structure for the glyph. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be positioned at the glyph's offset within */
+ /* the `EBDT' table before the call. */
+ /* */
+ /* If the image format uses variable metrics, the stream cursor is */
+ /* positioned just after the metrics header in the `EBDT' table on */
+ /* function exit. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Metrics_Func)( FT_Stream stream,
+ TT_SBit_Range range,
+ TT_SBit_Metrics metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Load a given glyph sbit image from the font resource. This also */
+ /* returns its metrics. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* The target face object. */
+ /* */
+ /* strike_index :: */
+ /* The strike index. */
+ /* */
+ /* glyph_index :: */
+ /* The current glyph index. */
+ /* */
+ /* load_flags :: */
+ /* The current load flags. */
+ /* */
+ /* stream :: */
+ /* The input stream. */
+ /* */
+ /* <Output> */
+ /* amap :: */
+ /* The target pixmap. */
+ /* */
+ /* ametrics :: */
+ /* A big sbit metrics structure for the glyph image. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* glyph sbit exists for the index. */
+ /* */
+ /* <Note> */
+ /* The `map.buffer' field is always freed before the glyph is loaded. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Image_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *amap,
+ TT_SBit_MetricsRec *ametrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Set_SBit_Strike_Func */
+ /* */
+ /* <Description> */
+ /* Select an sbit strike for a given size request. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* req :: The size request. */
+ /* */
+ /* <Output> */
+ /* astrike_index :: The index of the sbit strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* sbit strike exists for the selected ppem values. */
+ /* */
+ typedef FT_Error
+ (*TT_Set_SBit_Strike_Func)( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Strike_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the metrics of a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* strike_index :: The strike index. */
+ /* */
+ /* <Output> */
+ /* metrics :: the metrics of the strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* such sbit strike exists. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Strike_Metrics_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_PS_Name_Func */
+ /* */
+ /* <Description> */
+ /* Get the PostScript glyph name of a glyph. */
+ /* */
+ /* <Input> */
+ /* idx :: The glyph index. */
+ /* */
+ /* PSname :: The address of a string pointer. Will be NULL in case */
+ /* of error, otherwise it is a pointer to the glyph name. */
+ /* */
+ /* You must not modify the returned string! */
+ /* */
+ /* <Output> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_PS_Name_Func)( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load a metrics table, which is a table with a horizontal and a */
+ /* vertical version. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load the vertical one. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Metrics_Func)( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the horizontal or vertical header in a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load vertical metrics. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_Metrics_Func)( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short* abearing,
+ FT_UShort* aadvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Table_Func */
+ /* */
+ /* <Description> */
+ /* Load a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The function uses `face->goto_table' to seek the stream to the */
+ /* start of the table, except while loading the font directory. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Table_Func)( TT_Face face,
+ FT_Stream stream );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Free_Table_Func */
+ /* */
+ /* <Description> */
+ /* Free a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ typedef void
+ (*TT_Free_Table_Func)( TT_Face face );
+
+
+ /*
+ * @functype:
+ * TT_Face_GetKerningFunc
+ *
+ * @description:
+ * Return the horizontal kerning value between two glyphs.
+ *
+ * @input:
+ * face :: A handle to the source face object.
+ * left_glyph :: The left glyph index.
+ * right_glyph :: The right glyph index.
+ *
+ * @return:
+ * The kerning value in font units.
+ */
+ typedef FT_Int
+ (*TT_Face_GetKerningFunc)( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_Interface */
+ /* */
+ /* <Description> */
+ /* This structure holds pointers to the functions used to load and */
+ /* free the basic tables that are required in a `sfnt' font file. */
+ /* */
+ /* <Fields> */
+ /* Check the various xxx_Func() descriptions for details. */
+ /* */
+ typedef struct SFNT_Interface_
+ {
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Init_Face_Func init_face;
+ TT_Load_Face_Func load_face;
+ TT_Done_Face_Func done_face;
+ FT_Module_Requester get_interface;
+
+ TT_Load_Any_Func load_any;
+
+ /* these functions are called by `load_face' but they can also */
+ /* be called from external modules, if there is a need to do so */
+ TT_Load_Table_Func load_head;
+ TT_Load_Metrics_Func load_hhea;
+ TT_Load_Table_Func load_cmap;
+ TT_Load_Table_Func load_maxp;
+ TT_Load_Table_Func load_os2;
+ TT_Load_Table_Func load_post;
+
+ TT_Load_Table_Func load_name;
+ TT_Free_Table_Func free_name;
+
+ /* this field was called `load_kerning' up to version 2.1.10 */
+ TT_Load_Table_Func load_kern;
+
+ TT_Load_Table_Func load_gasp;
+ TT_Load_Table_Func load_pclt;
+
+ /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+ /* version 2.1.10 */
+ TT_Load_Table_Func load_bhed;
+
+ TT_Load_SBit_Image_Func load_sbit_image;
+
+ /* see `ttpost.h' */
+ TT_Get_PS_Name_Func get_psname;
+ TT_Free_Table_Func free_psnames;
+
+ /* starting here, the structure differs from version 2.1.7 */
+
+ /* this field was introduced in version 2.1.8, named `get_psname' */
+ TT_Face_GetKerningFunc get_kerning;
+
+ /* new elements introduced after version 2.1.10 */
+
+ /* load the font directory, i.e., the offset table and */
+ /* the table directory */
+ TT_Load_Table_Func load_font_dir;
+ TT_Load_Metrics_Func load_hmtx;
+
+ TT_Load_Table_Func load_eblc;
+ TT_Free_Table_Func free_eblc;
+
+ TT_Set_SBit_Strike_Func set_sbit_strike;
+ TT_Load_Strike_Metrics_Func load_strike_metrics;
+
+ TT_Get_Metrics_Func get_metrics;
+
+ } SFNT_Interface;
+
+
+ /* transitional */
+ typedef SFNT_Interface* SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ static const SFNT_Interface class_ = \
+ { \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_, \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_INTERNAL( a, a_ ) \
+ clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ SFNT_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->goto_table = goto_table_; \
+ clazz->init_face = init_face_; \
+ clazz->load_face = load_face_; \
+ clazz->done_face = done_face_; \
+ clazz->get_interface = get_interface_; \
+ clazz->load_any = load_any_; \
+ clazz->load_head = load_head_; \
+ clazz->load_hhea = load_hhea_; \
+ clazz->load_cmap = load_cmap_; \
+ clazz->load_maxp = load_maxp_; \
+ clazz->load_os2 = load_os2_; \
+ clazz->load_post = load_post_; \
+ clazz->load_name = load_name_; \
+ clazz->free_name = free_name_; \
+ clazz->load_kern = load_kern_; \
+ clazz->load_gasp = load_gasp_; \
+ clazz->load_pclt = load_pclt_; \
+ clazz->load_bhed = load_bhed_; \
+ clazz->load_sbit_image = load_sbit_image_; \
+ clazz->get_psname = get_psname_; \
+ clazz->free_psnames = free_psnames_; \
+ clazz->get_kerning = get_kerning_; \
+ clazz->load_font_dir = load_font_dir_; \
+ clazz->load_hmtx = load_hmtx_; \
+ clazz->load_eblc = load_eblc_; \
+ clazz->free_eblc = free_eblc_; \
+ clazz->set_sbit_strike = set_sbit_strike_; \
+ clazz->load_strike_metrics = load_strike_metrics_; \
+ clazz->get_metrics = get_metrics_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/t1types.h b/core/include/thirdparties/freetype/freetype/internal/t1types.h
new file mode 100644
index 0000000000..36deec80d0
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/t1types.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* t1types.h */
+/* */
+/* Basic Type1/Type2 type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../t1tables.h"
+#include "pshints.h"
+#include "ftserv.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_EncodingRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling a custom encoding. */
+ /* */
+ /* <Fields> */
+ /* num_chars :: The number of character codes in the encoding. */
+ /* Usually 256. */
+ /* */
+ /* code_first :: The lowest valid character code in the encoding. */
+ /* */
+ /* code_last :: The highest valid character code in the encoding */
+ /* + 1. When equal to code_first there are no valid */
+ /* character codes. */
+ /* */
+ /* char_index :: An array of corresponding glyph indices. */
+ /* */
+ /* char_name :: An array of corresponding glyph names. */
+ /* */
+ typedef struct T1_EncodingRecRec_
+ {
+ FT_Int num_chars;
+ FT_Int code_first;
+ FT_Int code_last;
+
+ FT_UShort* char_index;
+ FT_String** char_name;
+
+ } T1_EncodingRec, *T1_Encoding;
+
+
+ /* used to hold extra data of PS_FontInfoRec that
+ * cannot be stored in the publicly defined structure.
+ *
+ * Note these can't be blended with multiple-masters.
+ */
+ typedef struct PS_FontExtraRec_
+ {
+ FT_UShort fs_type;
+
+ } PS_FontExtraRec;
+
+
+ typedef struct T1_FontRec_
+ {
+ PS_FontInfoRec font_info; /* font info dictionary */
+ PS_FontExtraRec font_extra; /* font info extra fields */
+ PS_PrivateRec private_dict; /* private dictionary */
+ FT_String* font_name; /* top-level dictionary */
+
+ T1_EncodingType encoding_type;
+ T1_EncodingRec encoding;
+
+ FT_Byte* subrs_block;
+ FT_Byte* charstrings_block;
+ FT_Byte* glyph_names_block;
+
+ FT_Int num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len;
+
+ FT_Int num_glyphs;
+ FT_String** glyph_names; /* array of glyph names */
+ FT_Byte** charstrings; /* array of glyph charstrings */
+ FT_PtrDist* charstrings_len;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+ FT_BBox font_bbox;
+ FT_Long font_id;
+
+ FT_Fixed stroke_width;
+
+ } T1_FontRec, *T1_Font;
+
+
+ typedef struct CID_SubrsRec_
+ {
+ FT_UInt num_subrs;
+ FT_Byte** code;
+
+ } CID_SubrsRec, *CID_Subrs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** AFM FONT INFORMATION STRUCTURES ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_TrackKernRec_
+ {
+ FT_Int degree;
+ FT_Fixed min_ptsize;
+ FT_Fixed min_kern;
+ FT_Fixed max_ptsize;
+ FT_Fixed max_kern;
+
+ } AFM_TrackKernRec, *AFM_TrackKern;
+
+ typedef struct AFM_KernPairRec_
+ {
+ FT_Int index1;
+ FT_Int index2;
+ FT_Int x;
+ FT_Int y;
+
+ } AFM_KernPairRec, *AFM_KernPair;
+
+ typedef struct AFM_FontInfoRec_
+ {
+ FT_Bool IsCIDFont;
+ FT_BBox FontBBox;
+ FT_Fixed Ascender;
+ FT_Fixed Descender;
+ AFM_TrackKern TrackKerns; /* free if non-NULL */
+ FT_Int NumTrackKern;
+ AFM_KernPair KernPairs; /* free if non-NULL */
+ FT_Int NumKernPair;
+
+ } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL T1_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_FaceRec_* T1_Face;
+ typedef struct CID_FaceRec_* CID_Face;
+
+
+ typedef struct T1_FaceRec_
+ {
+ FT_FaceRec root;
+ T1_FontRec type1;
+ const void* psnames;
+ const void* psaux;
+ const void* afm_data;
+ FT_CharMapRec charmaprecs[2];
+ FT_CharMap charmaps[2];
+
+ /* support for Multiple Masters fonts */
+ PS_Blend blend;
+
+ /* undocumented, optional: indices of subroutines that express */
+ /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+ /* respectively, as Type 2 charstrings; -1 if keywords not present */
+ FT_Int ndv_idx;
+ FT_Int cdv_idx;
+
+ /* undocumented, optional: has the same meaning as len_buildchar */
+ /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */
+ FT_UInt len_buildchar;
+ FT_Long* buildchar;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ const void* pshinter;
+
+ } T1_FaceRec;
+
+
+ typedef struct CID_FaceRec_
+ {
+ FT_FaceRec root;
+ void* psnames;
+ void* psaux;
+ CID_FaceInfoRec cid;
+ PS_FontExtraRec font_extra;
+#if 0
+ void* afm_data;
+#endif
+ CID_Subrs subrs;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ void* pshinter;
+
+ /* since version 2.1.8, but was originally positioned after `afm_data' */
+ FT_Byte* binary_data; /* used if hex data has been converted */
+ FT_Stream cid_stream;
+
+ } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/internal/tttypes.h b/core/include/thirdparties/freetype/freetype/internal/tttypes.h
new file mode 100644
index 0000000000..d6c1d62852
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/internal/tttypes.h
@@ -0,0 +1,1440 @@
+/***************************************************************************/
+/* */
+/* tttypes.h */
+/* */
+/* Basic SFNT/TrueType type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2002, 2004-2008, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../tttables.h"
+#include "ftobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../ftmm.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TTC_HeaderRec */
+ /* */
+ /* <Description> */
+ /* TrueType collection header. This table contains the offsets of */
+ /* the font headers of each distinct TrueType face in the file. */
+ /* */
+ /* <Fields> */
+ /* tag :: Must be `ttc ' to indicate a TrueType collection. */
+ /* */
+ /* version :: The version number. */
+ /* */
+ /* count :: The number of faces in the collection. The */
+ /* specification says this should be an unsigned long, but */
+ /* we use a signed long since we need the value -1 for */
+ /* specific purposes. */
+ /* */
+ /* offsets :: The offsets of the font headers, one per face. */
+ /* */
+ typedef struct TTC_HeaderRec_
+ {
+ FT_ULong tag;
+ FT_Fixed version;
+ FT_Long count;
+ FT_ULong* offsets;
+
+ } TTC_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* SFNT file format header. */
+ /* */
+ /* <Fields> */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of tables in file. */
+ /* */
+ /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */
+ /* */
+ /* entry_selector :: Must be log2 of `search_range / 16'. */
+ /* */
+ /* range_shift :: Must be `num_tables * 16 - search_range'. */
+ /* */
+ typedef struct SFNT_HeaderRec_
+ {
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ FT_UShort search_range;
+ FT_UShort entry_selector;
+ FT_UShort range_shift;
+
+ FT_ULong offset; /* not in file */
+
+ } SFNT_HeaderRec, *SFNT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_TableRec */
+ /* */
+ /* <Description> */
+ /* This structure describes a given table of a TrueType font. */
+ /* */
+ /* <Fields> */
+ /* Tag :: A four-bytes tag describing the table. */
+ /* */
+ /* CheckSum :: The table checksum. This value can be ignored. */
+ /* */
+ /* Offset :: The offset of the table from the start of the TrueType */
+ /* font in its resource. */
+ /* */
+ /* Length :: The table length (in bytes). */
+ /* */
+ typedef struct TT_TableRec_
+ {
+ FT_ULong Tag; /* table type */
+ FT_ULong CheckSum; /* table checksum */
+ FT_ULong Offset; /* table file offset */
+ FT_ULong Length; /* table length */
+
+ } TT_TableRec, *TT_Table;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_LongMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the long metrics of the `hmtx' and `vmtx' */
+ /* TrueType tables. The values are expressed in font units. */
+ /* */
+ /* <Fields> */
+ /* advance :: The advance width or height for the glyph. */
+ /* */
+ /* bearing :: The left-side or top-side bearing for the glyph. */
+ /* */
+ typedef struct TT_LongMetricsRec_
+ {
+ FT_UShort advance;
+ FT_Short bearing;
+
+ } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_ShortMetrics */
+ /* */
+ /* <Description> */
+ /* A simple type to model the short metrics of the `hmtx' and `vmtx' */
+ /* tables. */
+ /* */
+ typedef FT_Short TT_ShortMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameEntryRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling TrueType name records. Name records are used */
+ /* to store important strings like family name, style name, */
+ /* copyright, etc. in _localized_ versions (i.e., language, encoding, */
+ /* etc). */
+ /* */
+ /* <Fields> */
+ /* platformID :: The ID of the name's encoding platform. */
+ /* */
+ /* encodingID :: The platform-specific ID for the name's encoding. */
+ /* */
+ /* languageID :: The platform-specific ID for the name's language. */
+ /* */
+ /* nameID :: The ID specifying what kind of name this is. */
+ /* */
+ /* stringLength :: The length of the string in bytes. */
+ /* */
+ /* stringOffset :: The offset to the string in the `name' table. */
+ /* */
+ /* string :: A pointer to the string's bytes. Note that these */
+ /* are usually UTF-16 encoded characters. */
+ /* */
+ typedef struct TT_NameEntryRec_
+ {
+ FT_UShort platformID;
+ FT_UShort encodingID;
+ FT_UShort languageID;
+ FT_UShort nameID;
+ FT_UShort stringLength;
+ FT_ULong stringOffset;
+
+ /* this last field is not defined in the spec */
+ /* but used by the FreeType engine */
+
+ FT_Byte* string;
+
+ } TT_NameEntryRec, *TT_NameEntry;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameTableRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType name table. */
+ /* */
+ /* <Fields> */
+ /* format :: The format of the name table. */
+ /* */
+ /* numNameRecords :: The number of names in table. */
+ /* */
+ /* storageOffset :: The offset of the name table in the `name' */
+ /* TrueType table. */
+ /* */
+ /* names :: An array of name records. */
+ /* */
+ /* stream :: the file's input stream. */
+ /* */
+ typedef struct TT_NameTableRec_
+ {
+ FT_UShort format;
+ FT_UInt numNameRecords;
+ FT_UInt storageOffset;
+ TT_NameEntryRec* names;
+ FT_Stream stream;
+
+ } TT_NameTableRec, *TT_NameTable;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRangeRec */
+ /* */
+ /* <Description> */
+ /* A tiny structure used to model a gasp range according to the */
+ /* TrueType specification. */
+ /* */
+ /* <Fields> */
+ /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */
+ /* */
+ /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */
+ /* modes to be used. */
+ /* */
+ typedef struct TT_GaspRangeRec_
+ {
+ FT_UShort maxPPEM;
+ FT_UShort gaspFlag;
+
+ } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT 0x01
+#define TT_GASP_DOGRAY 0x02
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType `gasp' table used to specify */
+ /* grid-fitting and anti-aliasing behaviour. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numRanges :: The number of gasp ranges in table. */
+ /* */
+ /* gaspRanges :: An array of gasp ranges. */
+ /* */
+ typedef struct TT_Gasp_
+ {
+ FT_UShort version;
+ FT_UShort numRanges;
+ TT_GaspRange gaspRanges;
+
+ } TT_GaspRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BITMAPS SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_MetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the big metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or `bloc' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* horiBearingX :: The horizontal left bearing. */
+ /* */
+ /* horiBearingY :: The horizontal top bearing. */
+ /* */
+ /* horiAdvance :: The horizontal advance. */
+ /* */
+ /* vertBearingX :: The vertical left bearing. */
+ /* */
+ /* vertBearingY :: The vertical top bearing. */
+ /* */
+ /* vertAdvance :: The vertical advance. */
+ /* */
+ typedef struct TT_SBit_MetricsRec_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char horiBearingX;
+ FT_Char horiBearingY;
+ FT_Byte horiAdvance;
+
+ FT_Char vertBearingX;
+ FT_Char vertBearingY;
+ FT_Byte vertAdvance;
+
+ } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_SmallMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the small metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* bearingX :: The left-side bearing. */
+ /* */
+ /* bearingY :: The top-side bearing. */
+ /* */
+ /* advance :: The advance width or height. */
+ /* */
+ typedef struct TT_SBit_Small_Metrics_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char bearingX;
+ FT_Char bearingY;
+ FT_Byte advance;
+
+ } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_LineMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe the text line metrics of a given */
+ /* bitmap strike, for either a horizontal or vertical layout. */
+ /* */
+ /* <Fields> */
+ /* ascender :: The ascender in pixels. */
+ /* */
+ /* descender :: The descender in pixels. */
+ /* */
+ /* max_width :: The maximum glyph width in pixels. */
+ /* */
+ /* caret_slope_enumerator :: Rise of the caret slope, typically set */
+ /* to 1 for non-italic fonts. */
+ /* */
+ /* caret_slope_denominator :: Rise of the caret slope, typically set */
+ /* to 0 for non-italic fonts. */
+ /* */
+ /* caret_offset :: Offset in pixels to move the caret for */
+ /* proper positioning. */
+ /* */
+ /* min_origin_SB :: Minimum of horiBearingX (resp. */
+ /* vertBearingY). */
+ /* min_advance_SB :: Minimum of */
+ /* */
+ /* horizontal advance - */
+ /* ( horiBearingX + width ) */
+ /* */
+ /* resp. */
+ /* */
+ /* vertical advance - */
+ /* ( vertBearingY + height ) */
+ /* */
+ /* max_before_BL :: Maximum of horiBearingY (resp. */
+ /* vertBearingY). */
+ /* */
+ /* min_after_BL :: Minimum of */
+ /* */
+ /* horiBearingY - height */
+ /* */
+ /* resp. */
+ /* */
+ /* vertBearingX - width */
+ /* */
+ /* pads :: Unused (to make the size of the record */
+ /* a multiple of 32 bits. */
+ /* */
+ typedef struct TT_SBit_LineMetricsRec_
+ {
+ FT_Char ascender;
+ FT_Char descender;
+ FT_Byte max_width;
+ FT_Char caret_slope_numerator;
+ FT_Char caret_slope_denominator;
+ FT_Char caret_offset;
+ FT_Char min_origin_SB;
+ FT_Char min_advance_SB;
+ FT_Char max_before_BL;
+ FT_Char min_after_BL;
+ FT_Char pads[2];
+
+ } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_RangeRec */
+ /* */
+ /* <Description> */
+ /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* first_glyph :: The first glyph index in the range. */
+ /* */
+ /* last_glyph :: The last glyph index in the range. */
+ /* */
+ /* index_format :: The format of index table. Valid values are 1 */
+ /* to 5. */
+ /* */
+ /* image_format :: The format of `EBDT' image data. */
+ /* */
+ /* image_offset :: The offset to image data in `EBDT'. */
+ /* */
+ /* image_size :: For index formats 2 and 5. This is the size in */
+ /* bytes of each glyph bitmap. */
+ /* */
+ /* big_metrics :: For index formats 2 and 5. This is the big */
+ /* metrics for each glyph bitmap. */
+ /* */
+ /* num_glyphs :: For index formats 4 and 5. This is the number of */
+ /* glyphs in the code array. */
+ /* */
+ /* glyph_offsets :: For index formats 1 and 3. */
+ /* */
+ /* glyph_codes :: For index formats 4 and 5. */
+ /* */
+ /* table_offset :: The offset of the index table in the `EBLC' */
+ /* table. Only used during strike loading. */
+ /* */
+ typedef struct TT_SBit_RangeRec_
+ {
+ FT_UShort first_glyph;
+ FT_UShort last_glyph;
+
+ FT_UShort index_format;
+ FT_UShort image_format;
+ FT_ULong image_offset;
+
+ FT_ULong image_size;
+ TT_SBit_MetricsRec metrics;
+ FT_ULong num_glyphs;
+
+ FT_ULong* glyph_offsets;
+ FT_UShort* glyph_codes;
+
+ FT_ULong table_offset;
+
+ } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_StrikeRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap strike in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* num_index_ranges :: The number of index ranges. */
+ /* */
+ /* index_ranges :: An array of glyph index ranges. */
+ /* */
+ /* color_ref :: Unused. `color_ref' is put in for future */
+ /* enhancements, but these fields are already */
+ /* in use by other platforms (e.g. Newton). */
+ /* For details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ /* hori :: The line metrics for horizontal layouts. */
+ /* */
+ /* vert :: The line metrics for vertical layouts. */
+ /* */
+ /* start_glyph :: The lowest glyph index for this strike. */
+ /* */
+ /* end_glyph :: The highest glyph index for this strike. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */
+ /* and 8. */
+ /* */
+ /* flags :: Is this a vertical or horizontal strike? For */
+ /* details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ typedef struct TT_SBit_StrikeRec_
+ {
+ FT_Int num_ranges;
+ TT_SBit_Range sbit_ranges;
+ FT_ULong ranges_offset;
+
+ FT_ULong color_ref;
+
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_UShort start_glyph;
+ FT_UShort end_glyph;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte bit_depth;
+ FT_Char flags;
+
+ } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ComponentRec */
+ /* */
+ /* <Description> */
+ /* A simple structure to describe a compound sbit element. */
+ /* */
+ /* <Fields> */
+ /* glyph_code :: The element's glyph index. */
+ /* */
+ /* x_offset :: The element's left bearing. */
+ /* */
+ /* y_offset :: The element's top bearing. */
+ /* */
+ typedef struct TT_SBit_ComponentRec_
+ {
+ FT_UShort glyph_code;
+ FT_Char x_offset;
+ FT_Char y_offset;
+
+ } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ScaleRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap scaling table, as defined */
+ /* in the `EBSC' table. */
+ /* */
+ /* <Fields> */
+ /* hori :: The horizontal line metrics. */
+ /* */
+ /* vert :: The vertical line metrics. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* x_ppem_substitute :: Substitution x_ppem value. */
+ /* */
+ /* y_ppem_substitute :: Substitution y_ppem value. */
+ /* */
+ typedef struct TT_SBit_ScaleRec_
+ {
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte x_ppem_substitute;
+ FT_Byte y_ppem_substitute;
+
+ } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_20Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.0. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of named glyphs in the table. */
+ /* */
+ /* num_names :: The number of PS names stored in the table. */
+ /* */
+ /* glyph_indices :: The indices of the glyphs in the names arrays. */
+ /* */
+ /* glyph_names :: The PS names not in Mac Encoding. */
+ /* */
+ typedef struct TT_Post_20Rec_
+ {
+ FT_UShort num_glyphs;
+ FT_UShort num_names;
+ FT_UShort* glyph_indices;
+ FT_Char** glyph_names;
+
+ } TT_Post_20Rec, *TT_Post_20;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_25Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.5. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of glyphs in the table. */
+ /* */
+ /* offsets :: An array of signed offsets in a normal Mac */
+ /* Postscript name encoding. */
+ /* */
+ typedef struct TT_Post_25_
+ {
+ FT_UShort num_glyphs;
+ FT_Char* offsets;
+
+ } TT_Post_25Rec, *TT_Post_25;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_NamesRec */
+ /* */
+ /* <Description> */
+ /* Postscript names table, either format 2.0 or 2.5. */
+ /* */
+ /* <Fields> */
+ /* loaded :: A flag to indicate whether the PS names are loaded. */
+ /* */
+ /* format_20 :: The sub-table used for format 2.0. */
+ /* */
+ /* format_25 :: The sub-table used for format 2.5. */
+ /* */
+ typedef struct TT_Post_NamesRec_
+ {
+ FT_Bool loaded;
+
+ union
+ {
+ TT_Post_20Rec format_20;
+ TT_Post_25Rec format_25;
+
+ } names;
+
+ } TT_Post_NamesRec, *TT_Post_Names;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** GX VARIATION TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ typedef struct GX_BlendRec_ *GX_Blend;
+#endif
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * These types are used to support a `BDF ' table that isn't part of the
+ * official TrueType specification. It is mainly used in SFNT-based
+ * bitmap fonts that were generated from a set of BDF fonts.
+ *
+ * The format of the table is as follows.
+ *
+ * USHORT version `BDF ' table version number, should be 0x0001.
+ * USHORT strikeCount Number of strikes (bitmap sizes) in this table.
+ * ULONG stringTable Offset (from start of BDF table) to string
+ * table.
+ *
+ * This is followed by an array of `strikeCount' descriptors, having the
+ * following format.
+ *
+ * USHORT ppem Vertical pixels per EM for this strike.
+ * USHORT numItems Number of items for this strike (properties and
+ * atoms). Maximum is 255.
+ *
+ * This array in turn is followed by `strikeCount' value sets. Each
+ * `value set' is an array of `numItems' items with the following format.
+ *
+ * ULONG item_name Offset in string table to item name.
+ * USHORT item_type The item type. Possible values are
+ * 0 => string (e.g., COMMENT)
+ * 1 => atom (e.g., FONT or even SIZE)
+ * 2 => int32
+ * 3 => uint32
+ * 0x10 => A flag to indicate a properties. This
+ * is ORed with the above values.
+ * ULONG item_value For strings => Offset into string table without
+ * the corresponding double quotes.
+ * For atoms => Offset into string table.
+ * For integers => Direct value.
+ *
+ * All strings in the string table consist of bytes and are
+ * zero-terminated.
+ *
+ */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ typedef struct TT_BDFRec_
+ {
+ FT_Byte* table;
+ FT_Byte* table_end;
+ FT_Byte* strings;
+ FT_ULong strings_size;
+ FT_UInt num_strikes;
+ FT_Bool loaded;
+
+ } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL TT_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This structure/class is defined here because it is common to the */
+ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */
+ /* */
+ /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */
+ /* shared between font drivers, and are thus defined in `ttobjs.h'. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType face/font object. A TT_Face encapsulates */
+ /* the resolution and scaling independent parts of a TrueType font */
+ /* resource. */
+ /* */
+ /* <Note> */
+ /* The TT_Face structure is also used as a `parent class' for the */
+ /* OpenType-CFF class (T2_Face). */
+ /* */
+ typedef struct TT_FaceRec_* TT_Face;
+
+
+ /* a function type used for the truetype bytecode interpreter hooks */
+ typedef FT_Error
+ (*TT_Interpreter)( void* exec_context );
+
+ /* forward declaration */
+ typedef struct TT_LoaderRec_* TT_Loader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_GotoTableFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* tag :: A 4-byte tag used to name the table. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Output> */
+ /* length :: The length of the table in bytes. Set to 0 if not */
+ /* needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_GotoTableFunc)( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_StartGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given glyph element, and opens a */
+ /* frame for it. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* glyph index :: The index of the glyph to access. */
+ /* */
+ /* offset :: The offset of the glyph according to the */
+ /* `locations' table. */
+ /* */
+ /* byte_count :: The size of the frame in bytes. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function is normally equivalent to FT_STREAM_SEEK(offset) */
+ /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */
+ /* but alternative formats (e.g. compressed ones) might use something */
+ /* different. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_StartGlyphFunc)( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_ULong offset,
+ FT_UInt byte_count );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_ReadGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Reads one glyph element (its header, a simple glyph, or a */
+ /* composite) from the loader's current stream frame. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_ReadGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_EndGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Closes the current loader stream frame for the glyph. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ typedef void
+ (*TT_Loader_EndGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType Face Type */
+ /* */
+ /* <Struct> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* The TrueType face class. These objects model the resolution and */
+ /* point-size independent data found in a TrueType font file. */
+ /* */
+ /* <Fields> */
+ /* root :: The base FT_Face structure, managed by the */
+ /* base layer. */
+ /* */
+ /* ttc_header :: The TrueType collection header, used when */
+ /* the file is a `ttc' rather than a `ttf'. */
+ /* For ordinary font files, the field */
+ /* `ttc_header.count' is set to 0. */
+ /* */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of TrueType tables in this font */
+ /* file. */
+ /* */
+ /* dir_tables :: The directory of TrueType tables for this */
+ /* font file. */
+ /* */
+ /* header :: The font's font header (`head' table). */
+ /* Read on font opening. */
+ /* */
+ /* horizontal :: The font's horizontal header (`hhea' */
+ /* table). This field also contains the */
+ /* associated horizontal metrics table */
+ /* (`hmtx'). */
+ /* */
+ /* max_profile :: The font's maximum profile table. Read on */
+ /* font opening. Note that some maximum */
+ /* values cannot be taken directly from this */
+ /* table. We thus define additional fields */
+ /* below to hold the computed maxima. */
+ /* */
+ /* vertical_info :: A boolean which is set when the font file */
+ /* contains vertical metrics. If not, the */
+ /* value of the `vertical' field is */
+ /* undefined. */
+ /* */
+ /* vertical :: The font's vertical header (`vhea' table). */
+ /* This field also contains the associated */
+ /* vertical metrics table (`vmtx'), if found. */
+ /* IMPORTANT: The contents of this field is */
+ /* undefined if the `verticalInfo' field is */
+ /* unset. */
+ /* */
+ /* num_names :: The number of name records within this */
+ /* TrueType font. */
+ /* */
+ /* name_table :: The table of name records (`name'). */
+ /* */
+ /* os2 :: The font's OS/2 table (`OS/2'). */
+ /* */
+ /* postscript :: The font's PostScript table (`post' */
+ /* table). The PostScript glyph names are */
+ /* not loaded by the driver on face opening. */
+ /* See the `ttpost' module for more details. */
+ /* */
+ /* cmap_table :: Address of the face's `cmap' SFNT table */
+ /* in memory (it's an extracted frame). */
+ /* */
+ /* cmap_size :: The size in bytes of the `cmap_table' */
+ /* described above. */
+ /* */
+ /* goto_table :: A function called by each TrueType table */
+ /* loader to position a stream's cursor to */
+ /* the start of a given table according to */
+ /* its tag. It defaults to TT_Goto_Face but */
+ /* can be different for strange formats (e.g. */
+ /* Type 42). */
+ /* */
+ /* access_glyph_frame :: A function used to access the frame of a */
+ /* given glyph within the face's font file. */
+ /* */
+ /* forget_glyph_frame :: A function used to forget the frame of a */
+ /* given glyph when all data has been loaded. */
+ /* */
+ /* read_glyph_header :: A function used to read a glyph header. */
+ /* It must be called between an `access' and */
+ /* `forget'. */
+ /* */
+ /* read_simple_glyph :: A function used to read a simple glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* read_composite_glyph :: A function used to read a composite glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* sfnt :: A pointer to the SFNT service. */
+ /* */
+ /* psnames :: A pointer to the PostScript names service. */
+ /* */
+ /* hdmx :: The face's horizontal device metrics */
+ /* (`hdmx' table). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* gasp :: The grid-fitting and scaling properties */
+ /* table (`gasp'). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* pclt :: The `pclt' SFNT table. */
+ /* */
+ /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */
+ /* sizes, embedded in this font. */
+ /* */
+ /* sbit_strikes :: An array of sbit strikes embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* num_sbit_scales :: The number of sbit scales for this font. */
+ /* */
+ /* sbit_scales :: Array of sbit scales embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* postscript_names :: A table used to store the Postscript names */
+ /* of the glyphs for this font. See the */
+ /* file `ttconfig.h' for comments on the */
+ /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */
+ /* */
+ /* num_locations :: The number of glyph locations in this */
+ /* TrueType file. This should be */
+ /* identical to the number of glyphs. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* glyph_locations :: An array of longs. These are offsets to */
+ /* glyph data within the `glyf' table. */
+ /* Ignored for Type 2 font faces. */
+ /* */
+ /* glyf_len :: The length of the `glyf' table. Needed */
+ /* for malformed `loca' tables. */
+ /* */
+ /* font_program_size :: Size in bytecodes of the face's font */
+ /* program. 0 if none defined. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* font_program :: The face's font program (bytecode stream) */
+ /* executed at load time, also used during */
+ /* glyph rendering. Comes from the `fpgm' */
+ /* table. Ignored for Type 2 font fonts. */
+ /* */
+ /* cvt_program_size :: The size in bytecodes of the face's cvt */
+ /* program. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_program :: The face's cvt program (bytecode stream) */
+ /* executed each time an instance/size is */
+ /* changed/reset. Comes from the `prep' */
+ /* table. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_size :: Size of the control value table (in */
+ /* entries). Ignored for Type 2 fonts. */
+ /* */
+ /* cvt :: The face's original control value table. */
+ /* Coordinates are expressed in unscaled font */
+ /* units. Comes from the `cvt ' table. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* num_kern_pairs :: The number of kerning pairs present in the */
+ /* font file. The engine only loads the */
+ /* first horizontal format 0 kern table it */
+ /* finds in the font file. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* kern_table_index :: The index of the kerning table in the font */
+ /* kerning directory. Ignored for Type 2 */
+ /* fonts. */
+ /* */
+ /* interpreter :: A pointer to the TrueType bytecode */
+ /* interpreters field is also used to hook */
+ /* the debugger in `ttdebug'. */
+ /* */
+ /* unpatented_hinting :: If true, use only unpatented methods in */
+ /* the bytecode interpreter. */
+ /* */
+ /* doblend :: A boolean which is set if the font should */
+ /* be blended (this is for GX var). */
+ /* */
+ /* blend :: Contains the data needed to control GX */
+ /* variation tables (rather like Multiple */
+ /* Master data). */
+ /* */
+ /* extra :: Reserved for third-party font drivers. */
+ /* */
+ /* postscript_name :: The PS name of the font. Used by the */
+ /* postscript name service. */
+ /* */
+ typedef struct TT_FaceRec_
+ {
+ FT_FaceRec root;
+
+ TTC_HeaderRec ttc_header;
+
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ TT_Table dir_tables;
+
+ TT_Header header; /* TrueType header table */
+ TT_HoriHeader horizontal; /* TrueType horizontal header */
+
+ TT_MaxProfile max_profile;
+
+ FT_Bool vertical_info;
+ TT_VertHeader vertical; /* TT Vertical header, if present */
+
+ FT_UShort num_names; /* number of name records */
+ TT_NameTableRec name_table; /* name table */
+
+ TT_OS2 os2; /* TrueType OS/2 table */
+ TT_Postscript postscript; /* TrueType Postscript table */
+
+ FT_Byte* cmap_table; /* extracted `cmap' table */
+ FT_ULong cmap_size;
+
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Loader_StartGlyphFunc access_glyph_frame;
+ TT_Loader_EndGlyphFunc forget_glyph_frame;
+ TT_Loader_ReadGlyphFunc read_glyph_header;
+ TT_Loader_ReadGlyphFunc read_simple_glyph;
+ TT_Loader_ReadGlyphFunc read_composite_glyph;
+
+ /* a typeless pointer to the SFNT_Interface table used to load */
+ /* the basic TrueType tables in the face object */
+ void* sfnt;
+
+ /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+ /* handle glyph names <-> unicode & Mac values */
+ void* psnames;
+
+
+ /***********************************************************************/
+ /* */
+ /* Optional TrueType/OpenType tables */
+ /* */
+ /***********************************************************************/
+
+ /* grid-fitting and scaling table */
+ TT_GaspRec gasp; /* the `gasp' table */
+
+ /* PCL 5 table */
+ TT_PCLT pclt;
+
+ /* embedded bitmaps support */
+ FT_ULong num_sbit_scales;
+ TT_SBit_Scale sbit_scales;
+
+ /* postscript names table */
+ TT_Post_NamesRec postscript_names;
+
+
+ /***********************************************************************/
+ /* */
+ /* TrueType-specific fields (ignored by the OTF-Type2 driver) */
+ /* */
+ /***********************************************************************/
+
+ /* the font program, if any */
+ FT_ULong font_program_size;
+ FT_Byte* font_program;
+
+ /* the cvt program, if any */
+ FT_ULong cvt_program_size;
+ FT_Byte* cvt_program;
+
+ /* the original, unscaled, control value table */
+ FT_ULong cvt_size;
+ FT_Short* cvt;
+
+ /* A pointer to the bytecode interpreter to use. This is also */
+ /* used to hook the debugger for the `ttdebug' utility. */
+ TT_Interpreter interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Use unpatented hinting only. */
+ FT_Bool unpatented_hinting;
+#endif
+
+ /***********************************************************************/
+ /* */
+ /* Other tables or fields. This is used by derivative formats like */
+ /* OpenType. */
+ /* */
+ /***********************************************************************/
+
+ FT_Generic extra;
+
+ const char* postscript_name;
+
+ FT_ULong glyf_len;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Bool doblend;
+ GX_Blend blend;
+#endif
+
+ /* since version 2.2 */
+
+ FT_Byte* horz_metrics;
+ FT_ULong horz_metrics_size;
+
+ FT_Byte* vert_metrics;
+ FT_ULong vert_metrics_size;
+
+ FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */
+ FT_Byte* glyph_locations;
+
+ FT_Byte* hdmx_table;
+ FT_ULong hdmx_table_size;
+ FT_UInt hdmx_record_count;
+ FT_ULong hdmx_record_size;
+ FT_Byte* hdmx_record_sizes;
+
+ FT_Byte* sbit_table;
+ FT_ULong sbit_table_size;
+ FT_UInt sbit_num_strikes;
+
+ FT_Byte* kern_table;
+ FT_ULong kern_table_size;
+ FT_UInt num_kern_tables;
+ FT_UInt32 kern_avail_bits;
+ FT_UInt32 kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+ TT_BDFRec bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /* since 2.3.0 */
+ FT_ULong horz_metrics_offset;
+ FT_ULong vert_metrics_offset;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* since 2.4.12 */
+ FT_ULong sph_found_func_flags; /* special functions found */
+ /* for this face */
+ FT_Bool sph_compatibility_mode;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ } TT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GlyphZoneRec */
+ /* */
+ /* <Description> */
+ /* A glyph zone is used to load, scale and hint glyph outline */
+ /* coordinates. */
+ /* */
+ /* <Fields> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ /* max_points :: The maximum size in points of the zone. */
+ /* */
+ /* max_contours :: Max size in links contours of the zone. */
+ /* */
+ /* n_points :: The current number of points in the zone. */
+ /* */
+ /* n_contours :: The current number of contours in the zone. */
+ /* */
+ /* org :: The original glyph coordinates (font */
+ /* units/scaled). */
+ /* */
+ /* cur :: The current glyph coordinates (scaled/hinted). */
+ /* */
+ /* tags :: The point control tags. */
+ /* */
+ /* contours :: The contours end points. */
+ /* */
+ /* first_point :: Offset of the current subglyph's first point. */
+ /* */
+ typedef struct TT_GlyphZoneRec_
+ {
+ FT_Memory memory;
+ FT_UShort max_points;
+ FT_UShort max_contours;
+ FT_UShort n_points; /* number of points in zone */
+ FT_Short n_contours; /* number of contours */
+
+ FT_Vector* org; /* original point coordinates */
+ FT_Vector* cur; /* current point coordinates */
+ FT_Vector* orus; /* original (unscaled) point coordinates */
+
+ FT_Byte* tags; /* current touch flags */
+ FT_UShort* contours; /* contour end points */
+
+ FT_UShort first_point; /* offset of first (#0) point */
+
+ } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+ /* handle to execution context */
+ typedef struct TT_ExecContextRec_* TT_ExecContext;
+
+ /* glyph loader structure */
+ typedef struct TT_LoaderRec_
+ {
+ FT_Face face;
+ FT_Size size;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader gloader;
+
+ FT_ULong load_flags;
+ FT_UInt glyph_index;
+
+ FT_Stream stream;
+ FT_Int byte_len;
+
+ FT_Short n_contours;
+ FT_BBox bbox;
+ FT_Int left_bearing;
+ FT_Int advance;
+ FT_Int linear;
+ FT_Bool linear_def;
+ FT_Bool preserve_pps;
+ FT_Vector pp1;
+ FT_Vector pp2;
+
+ FT_ULong glyf_offset;
+
+ /* the zone where we load our glyphs */
+ TT_GlyphZoneRec base;
+ TT_GlyphZoneRec zone;
+
+ TT_ExecContext exec;
+ FT_Byte* instructions;
+ FT_ULong ins_pos;
+
+ /* for possible extensibility in other formats */
+ void* other;
+
+ /* since version 2.1.8 */
+ FT_Int top_bearing;
+ FT_Int vadvance;
+ FT_Vector pp3;
+ FT_Vector pp4;
+
+ /* since version 2.2.1 */
+ FT_Byte* cursor;
+ FT_Byte* limit;
+
+ } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/t1tables.h b/core/include/thirdparties/freetype/freetype/t1tables.h
new file mode 100644
index 0000000000..6530094d81
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/t1tables.h
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/* */
+/* t1tables.h */
+/* */
+/* Basic Type 1/Type 2 tables definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* type1_tables */
+ /* */
+ /* <Title> */
+ /* Type 1 Tables */
+ /* */
+ /* <Abstract> */
+ /* Type~1 (PostScript) specific font tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of Type 1-specific tables, */
+ /* including structures related to other PostScript font formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+ /* structures in order to support Multiple Master fonts. */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* FontInfo dictionary. */
+ /* */
+ typedef struct PS_FontInfoRec_
+ {
+ FT_String* version;
+ FT_String* notice;
+ FT_String* full_name;
+ FT_String* family_name;
+ FT_String* weight;
+ FT_Long italic_angle;
+ FT_Bool is_fixed_pitch;
+ FT_Short underline_position;
+ FT_UShort underline_thickness;
+
+ } PS_FontInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_FontInfoRec structure. */
+ /* */
+ typedef struct PS_FontInfoRec_* PS_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_FontInfo */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_FontInfoRec T1_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_PrivateRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 private dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* Private dictionary. */
+ /* */
+ typedef struct PS_PrivateRec_
+ {
+ FT_Int unique_id;
+ FT_Int lenIV;
+
+ FT_Byte num_blue_values;
+ FT_Byte num_other_blues;
+ FT_Byte num_family_blues;
+ FT_Byte num_family_other_blues;
+
+ FT_Short blue_values[14];
+ FT_Short other_blues[10];
+
+ FT_Short family_blues [14];
+ FT_Short family_other_blues[10];
+
+ FT_Fixed blue_scale;
+ FT_Int blue_shift;
+ FT_Int blue_fuzz;
+
+ FT_UShort standard_width[1];
+ FT_UShort standard_height[1];
+
+ FT_Byte num_snap_widths;
+ FT_Byte num_snap_heights;
+ FT_Bool force_bold;
+ FT_Bool round_stem_up;
+
+ FT_Short snap_widths [13]; /* including std width */
+ FT_Short snap_heights[13]; /* including std height */
+
+ FT_Fixed expansion_factor;
+
+ FT_Long language_group;
+ FT_Long password;
+
+ FT_Short min_feature[2];
+
+ } PS_PrivateRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Private */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_PrivateRec structure. */
+ /* */
+ typedef struct PS_PrivateRec_* PS_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_Private */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_PrivateRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_PrivateRec T1_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_Blend_Flags */
+ /* */
+ /* <Description> */
+ /* A set of flags used to indicate which fields are present in a */
+ /* given blend dictionary (font info or private). Used to support */
+ /* Multiple Masters fonts. */
+ /* */
+ typedef enum T1_Blend_Flags_
+ {
+ /*# required fields in a FontInfo blend dictionary */
+ T1_BLEND_UNDERLINE_POSITION = 0,
+ T1_BLEND_UNDERLINE_THICKNESS,
+ T1_BLEND_ITALIC_ANGLE,
+
+ /*# required fields in a Private blend dictionary */
+ T1_BLEND_BLUE_VALUES,
+ T1_BLEND_OTHER_BLUES,
+ T1_BLEND_STANDARD_WIDTH,
+ T1_BLEND_STANDARD_HEIGHT,
+ T1_BLEND_STEM_SNAP_WIDTHS,
+ T1_BLEND_STEM_SNAP_HEIGHTS,
+ T1_BLEND_BLUE_SCALE,
+ T1_BLEND_BLUE_SHIFT,
+ T1_BLEND_FAMILY_BLUES,
+ T1_BLEND_FAMILY_OTHER_BLUES,
+ T1_BLEND_FORCE_BOLD,
+
+ /*# never remove */
+ T1_BLEND_MAX
+
+ } T1_Blend_Flags;
+
+ /* */
+
+
+ /*# backwards compatible definitions */
+#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold T1_BLEND_FORCE_BOLD
+#define t1_blend_max T1_BLEND_MAX
+
+
+ /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS 16
+
+ /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS 4
+
+ /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS 20
+
+
+ /* this structure is used to store the BlendDesignMap entry for an axis */
+ typedef struct PS_DesignMap_
+ {
+ FT_Byte num_points;
+ FT_Long* design_points;
+ FT_Fixed* blend_points;
+
+ } PS_DesignMapRec, *PS_DesignMap;
+
+ /* backwards-compatible definition */
+ typedef PS_DesignMapRec T1_DesignMap;
+
+
+ typedef struct PS_BlendRec_
+ {
+ FT_UInt num_designs;
+ FT_UInt num_axis;
+
+ FT_String* axis_names[T1_MAX_MM_AXIS];
+ FT_Fixed* design_pos[T1_MAX_MM_DESIGNS];
+ PS_DesignMapRec design_map[T1_MAX_MM_AXIS];
+
+ FT_Fixed* weight_vector;
+ FT_Fixed* default_weight_vector;
+
+ PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1];
+ PS_Private privates [T1_MAX_MM_DESIGNS + 1];
+
+ FT_ULong blend_bitflags;
+
+ FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1];
+
+ /* since 2.3.0 */
+
+ /* undocumented, optional: the default design instance; */
+ /* corresponds to default_weight_vector -- */
+ /* num_default_design_vector == 0 means it is not present */
+ /* in the font and associated metrics files */
+ FT_UInt default_design_vector[T1_MAX_MM_DESIGNS];
+ FT_UInt num_default_design_vector;
+
+ } PS_BlendRec, *PS_Blend;
+
+
+ /* backwards-compatible definition */
+ typedef PS_BlendRec T1_Blend;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDictRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent data in a CID top-level dictionary. */
+ /* */
+ typedef struct CID_FaceDictRec_
+ {
+ PS_PrivateRec private_dict;
+
+ FT_UInt len_buildchar;
+ FT_Fixed forcebold_threshold;
+ FT_Pos stroke_width;
+ FT_Fixed expansion_factor;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_UInt num_subrs;
+ FT_ULong subrmap_offset;
+ FT_Int sd_bytes;
+
+ } CID_FaceDictRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDict */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceDictRec structure. */
+ /* */
+ typedef struct CID_FaceDictRec_* CID_FaceDict;
+
+ /* */
+
+
+ /* backwards-compatible definition */
+ typedef CID_FaceDictRec CID_FontDict;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent CID Face information. */
+ /* */
+ typedef struct CID_FaceInfoRec_
+ {
+ FT_String* cid_font_name;
+ FT_Fixed cid_version;
+ FT_Int cid_font_type;
+
+ FT_String* registry;
+ FT_String* ordering;
+ FT_Int supplement;
+
+ PS_FontInfoRec font_info;
+ FT_BBox font_bbox;
+ FT_ULong uid_base;
+
+ FT_Int num_xuid;
+ FT_ULong xuid[16];
+
+ FT_ULong cidmap_offset;
+ FT_Int fd_bytes;
+ FT_Int gd_bytes;
+ FT_ULong cid_count;
+
+ FT_Int num_dicts;
+ CID_FaceDict font_dicts;
+
+ FT_ULong data_offset;
+
+ } CID_FaceInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceInfoRec structure. */
+ /* */
+ typedef struct CID_FaceInfoRec_* CID_FaceInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_Info */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef CID_FaceInfoRec CID_Info;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Has_PS_Glyph_Names
+ *
+ * @description:
+ * Return true if a given face provides reliable PostScript glyph
+ * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+ * except that certain fonts (mostly TrueType) contain incorrect
+ * glyph name tables.
+ *
+ * When this function returns true, the caller is sure that the glyph
+ * names returned by @FT_Get_Glyph_Name are reliable.
+ *
+ * @input:
+ * face ::
+ * face handle
+ *
+ * @return:
+ * Boolean. True if glyph names are reliable.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Has_PS_Glyph_Names( FT_Face face );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Info
+ *
+ * @description:
+ * Retrieve the @PS_FontInfoRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_info ::
+ * Output font info structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the font info structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function will
+ * return the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Info( FT_Face face,
+ PS_FontInfo afont_info );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Private
+ *
+ * @description:
+ * Retrieve the @PS_PrivateRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_private ::
+ * Output private dictionary structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the @PS_PrivateRec structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Private( FT_Face face,
+ PS_Private afont_private );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_EncodingType */
+ /* */
+ /* <Description> */
+ /* An enumeration describing the `Encoding' entry in a Type 1 */
+ /* dictionary. */
+ /* */
+ typedef enum T1_EncodingType_
+ {
+ T1_ENCODING_TYPE_NONE = 0,
+ T1_ENCODING_TYPE_ARRAY,
+ T1_ENCODING_TYPE_STANDARD,
+ T1_ENCODING_TYPE_ISOLATIN1,
+ T1_ENCODING_TYPE_EXPERT
+
+ } T1_EncodingType;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* PS_Dict_Keys */
+ /* */
+ /* <Description> */
+ /* An enumeration used in calls to @FT_Get_PS_Font_Value to identify */
+ /* the Type~1 dictionary entry to retrieve. */
+ /* */
+ typedef enum PS_Dict_Keys_
+ {
+ /* conventionally in the font dictionary */
+ PS_DICT_FONT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_MATRIX, /* FT_Fixed */
+ PS_DICT_FONT_BBOX, /* FT_Fixed */
+ PS_DICT_PAINT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_NAME, /* FT_String* */
+ PS_DICT_UNIQUE_ID, /* FT_Int */
+ PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */
+ PS_DICT_CHAR_STRING_KEY, /* FT_String* */
+ PS_DICT_CHAR_STRING, /* FT_String* */
+ PS_DICT_ENCODING_TYPE, /* T1_EncodingType */
+ PS_DICT_ENCODING_ENTRY, /* FT_String* */
+
+ /* conventionally in the font Private dictionary */
+ PS_DICT_NUM_SUBRS, /* FT_Int */
+ PS_DICT_SUBR, /* FT_String* */
+ PS_DICT_STD_HW, /* FT_UShort */
+ PS_DICT_STD_VW, /* FT_UShort */
+ PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */
+ PS_DICT_BLUE_VALUE, /* FT_Short */
+ PS_DICT_BLUE_FUZZ, /* FT_Int */
+ PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_OTHER_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */
+ PS_DICT_BLUE_SCALE, /* FT_Fixed */
+ PS_DICT_BLUE_SHIFT, /* FT_Int */
+ PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */
+ PS_DICT_STEM_SNAP_H, /* FT_Short */
+ PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */
+ PS_DICT_STEM_SNAP_V, /* FT_Short */
+ PS_DICT_FORCE_BOLD, /* FT_Bool */
+ PS_DICT_RND_STEM_UP, /* FT_Bool */
+ PS_DICT_MIN_FEATURE, /* FT_Short */
+ PS_DICT_LEN_IV, /* FT_Int */
+ PS_DICT_PASSWORD, /* FT_Long */
+ PS_DICT_LANGUAGE_GROUP, /* FT_Long */
+
+ /* conventionally in the font FontInfo dictionary */
+ PS_DICT_VERSION, /* FT_String* */
+ PS_DICT_NOTICE, /* FT_String* */
+ PS_DICT_FULL_NAME, /* FT_String* */
+ PS_DICT_FAMILY_NAME, /* FT_String* */
+ PS_DICT_WEIGHT, /* FT_String* */
+ PS_DICT_IS_FIXED_PITCH, /* FT_Bool */
+ PS_DICT_UNDERLINE_POSITION, /* FT_Short */
+ PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */
+ PS_DICT_FS_TYPE, /* FT_UShort */
+ PS_DICT_ITALIC_ANGLE, /* FT_Long */
+
+ PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+ } PS_Dict_Keys;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Value
+ *
+ * @description:
+ * Retrieve the value for the supplied key from a PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * key ::
+ * An enumeration value representing the dictionary key to retrieve.
+ *
+ * idx ::
+ * For array values, this specifies the index to be returned.
+ *
+ * value ::
+ * A pointer to memory into which to write the value.
+ *
+ * valen_len ::
+ * The size, in bytes, of the memory supplied for the value.
+ *
+ * @output:
+ * value ::
+ * The value matching the above key, if it exists.
+ *
+ * @return:
+ * The amount of memory (in bytes) required to hold the requested
+ * value (if it exists, -1 otherwise).
+ *
+ * @note:
+ * The values returned are not pointers into the internal structures of
+ * the face, but are `fresh' copies, so that the memory containing them
+ * belongs to the calling application. This also enforces the
+ * `read-only' nature of these values, i.e., this function cannot be
+ * used to manipulate the face.
+ *
+ * `value' is a void pointer because the values returned can be of
+ * various types.
+ *
+ * If either `value' is NULL or `value_len' is too small, just the
+ * required memory size for the requested entry is returned.
+ *
+ * The `idx' parameter is used, not only to retrieve elements of, for
+ * example, the FontMatrix or FontBBox, but also to retrieve name keys
+ * from the CharStrings dictionary, and the charstrings themselves. It
+ * is ignored for atomic values.
+ *
+ * PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000. To
+ * get the value as in the font stream, you need to divide by
+ * 65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+ *
+ * IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+ * be retrieved. So, for example, PostScript procedures such as NP,
+ * ND, and RD are not available. Arbitrary keys are, obviously, not be
+ * available either.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Long )
+ FT_Get_PS_Font_Value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ttnameid.h b/core/include/thirdparties/freetype/freetype/ttnameid.h
new file mode 100644
index 0000000000..862bf927c2
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ttnameid.h
@@ -0,0 +1,1237 @@
+/***************************************************************************/
+/* */
+/* ttnameid.h */
+/* */
+/* TrueType name ID definitions (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values for the `platform' identifier code in the name */
+ /* records of the TTF `name' table. */
+ /* */
+ /*************************************************************************/
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_PLATFORM_XXX
+ *
+ * @description:
+ * A list of valid values for the `platform_id' identifier code in
+ * @FT_CharMapRec and @FT_SfntName structures.
+ *
+ * @values:
+ * TT_PLATFORM_APPLE_UNICODE ::
+ * Used by Apple to indicate a Unicode character map and/or name entry.
+ * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note
+ * that name entries in this format are coded as big-endian UCS-2
+ * character codes _only_.
+ *
+ * TT_PLATFORM_MACINTOSH ::
+ * Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+ * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that
+ * most TrueType fonts contain an Apple roman charmap to be usable on
+ * MacOS systems (even if they contain a Microsoft charmap as well).
+ *
+ * TT_PLATFORM_ISO ::
+ * This value was used to specify ISO/IEC 10646 charmaps. It is however
+ * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding
+ * `encoding_id' values.
+ *
+ * TT_PLATFORM_MICROSOFT ::
+ * Used by Microsoft to indicate Windows-specific charmaps. See
+ * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+ * Note that most fonts contain a Unicode charmap using
+ * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+ *
+ * TT_PLATFORM_CUSTOM ::
+ * Used to indicate application-specific charmaps.
+ *
+ * TT_PLATFORM_ADOBE ::
+ * This value isn't part of any font format specification, but is used
+ * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+ * structure. See @TT_ADOBE_ID_XXX.
+ */
+
+#define TT_PLATFORM_APPLE_UNICODE 0
+#define TT_PLATFORM_MACINTOSH 1
+#define TT_PLATFORM_ISO 2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT 3
+#define TT_PLATFORM_CUSTOM 4
+#define TT_PLATFORM_ADOBE 7 /* artificial */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_APPLE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+ *
+ * @values:
+ * TT_APPLE_ID_DEFAULT ::
+ * Unicode version 1.0.
+ *
+ * TT_APPLE_ID_UNICODE_1_1 ::
+ * Unicode 1.1; specifies Hangul characters starting at U+34xx.
+ *
+ * TT_APPLE_ID_ISO_10646 ::
+ * Deprecated (identical to preceding).
+ *
+ * TT_APPLE_ID_UNICODE_2_0 ::
+ * Unicode 2.0 and beyond (UTF-16 BMP only).
+ *
+ * TT_APPLE_ID_UNICODE_32 ::
+ * Unicode 3.1 and beyond, using UTF-32.
+ *
+ * TT_APPLE_ID_VARIANT_SELECTOR ::
+ * From Adobe, not Apple. Not a normal cmap. Specifies variations
+ * on a real cmap.
+ */
+
+#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646 2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */
+#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MAC_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MACINTOSH charmaps and name entries.
+ *
+ * @values:
+ * TT_MAC_ID_ROMAN ::
+ * TT_MAC_ID_JAPANESE ::
+ * TT_MAC_ID_TRADITIONAL_CHINESE ::
+ * TT_MAC_ID_KOREAN ::
+ * TT_MAC_ID_ARABIC ::
+ * TT_MAC_ID_HEBREW ::
+ * TT_MAC_ID_GREEK ::
+ * TT_MAC_ID_RUSSIAN ::
+ * TT_MAC_ID_RSYMBOL ::
+ * TT_MAC_ID_DEVANAGARI ::
+ * TT_MAC_ID_GURMUKHI ::
+ * TT_MAC_ID_GUJARATI ::
+ * TT_MAC_ID_ORIYA ::
+ * TT_MAC_ID_BENGALI ::
+ * TT_MAC_ID_TAMIL ::
+ * TT_MAC_ID_TELUGU ::
+ * TT_MAC_ID_KANNADA ::
+ * TT_MAC_ID_MALAYALAM ::
+ * TT_MAC_ID_SINHALESE ::
+ * TT_MAC_ID_BURMESE ::
+ * TT_MAC_ID_KHMER ::
+ * TT_MAC_ID_THAI ::
+ * TT_MAC_ID_LAOTIAN ::
+ * TT_MAC_ID_GEORGIAN ::
+ * TT_MAC_ID_ARMENIAN ::
+ * TT_MAC_ID_MALDIVIAN ::
+ * TT_MAC_ID_SIMPLIFIED_CHINESE ::
+ * TT_MAC_ID_TIBETAN ::
+ * TT_MAC_ID_MONGOLIAN ::
+ * TT_MAC_ID_GEEZ ::
+ * TT_MAC_ID_SLAVIC ::
+ * TT_MAC_ID_VIETNAMESE ::
+ * TT_MAC_ID_SINDHI ::
+ * TT_MAC_ID_UNINTERP ::
+ */
+
+#define TT_MAC_ID_ROMAN 0
+#define TT_MAC_ID_JAPANESE 1
+#define TT_MAC_ID_TRADITIONAL_CHINESE 2
+#define TT_MAC_ID_KOREAN 3
+#define TT_MAC_ID_ARABIC 4
+#define TT_MAC_ID_HEBREW 5
+#define TT_MAC_ID_GREEK 6
+#define TT_MAC_ID_RUSSIAN 7
+#define TT_MAC_ID_RSYMBOL 8
+#define TT_MAC_ID_DEVANAGARI 9
+#define TT_MAC_ID_GURMUKHI 10
+#define TT_MAC_ID_GUJARATI 11
+#define TT_MAC_ID_ORIYA 12
+#define TT_MAC_ID_BENGALI 13
+#define TT_MAC_ID_TAMIL 14
+#define TT_MAC_ID_TELUGU 15
+#define TT_MAC_ID_KANNADA 16
+#define TT_MAC_ID_MALAYALAM 17
+#define TT_MAC_ID_SINHALESE 18
+#define TT_MAC_ID_BURMESE 19
+#define TT_MAC_ID_KHMER 20
+#define TT_MAC_ID_THAI 21
+#define TT_MAC_ID_LAOTIAN 22
+#define TT_MAC_ID_GEORGIAN 23
+#define TT_MAC_ID_ARMENIAN 24
+#define TT_MAC_ID_MALDIVIAN 25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE 25
+#define TT_MAC_ID_TIBETAN 26
+#define TT_MAC_ID_MONGOLIAN 27
+#define TT_MAC_ID_GEEZ 28
+#define TT_MAC_ID_SLAVIC 29
+#define TT_MAC_ID_VIETNAMESE 30
+#define TT_MAC_ID_SINDHI 31
+#define TT_MAC_ID_UNINTERP 32
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ISO_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ISO charmaps and name entries.
+ *
+ * Their use is now deprecated.
+ *
+ * @values:
+ * TT_ISO_ID_7BIT_ASCII ::
+ * ASCII.
+ * TT_ISO_ID_10646 ::
+ * ISO/10646.
+ * TT_ISO_ID_8859_1 ::
+ * Also known as Latin-1.
+ */
+
+#define TT_ISO_ID_7BIT_ASCII 0
+#define TT_ISO_ID_10646 1
+#define TT_ISO_ID_8859_1 2
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MS_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MICROSOFT charmaps and name entries.
+ *
+ * @values:
+ * TT_MS_ID_SYMBOL_CS ::
+ * Corresponds to Microsoft symbol encoding. See
+ * @FT_ENCODING_MS_SYMBOL.
+ *
+ * TT_MS_ID_UNICODE_CS ::
+ * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See
+ * @FT_ENCODING_UNICODE.
+ *
+ * TT_MS_ID_SJIS ::
+ * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS.
+ *
+ * TT_MS_ID_GB2312 ::
+ * Corresponds to Simplified Chinese as used in Mainland China. See
+ * @FT_ENCODING_GB2312.
+ *
+ * TT_MS_ID_BIG_5 ::
+ * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+ * See @FT_ENCODING_BIG5.
+ *
+ * TT_MS_ID_WANSUNG ::
+ * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG.
+ *
+ * TT_MS_ID_JOHAB ::
+ * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB.
+ *
+ * TT_MS_ID_UCS_4 ::
+ * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to
+ * the OpenType specification version 1.4 (mid-2001.)
+ */
+
+#define TT_MS_ID_SYMBOL_CS 0
+#define TT_MS_ID_UNICODE_CS 1
+#define TT_MS_ID_SJIS 2
+#define TT_MS_ID_GB2312 3
+#define TT_MS_ID_BIG_5 4
+#define TT_MS_ID_WANSUNG 5
+#define TT_MS_ID_JOHAB 6
+#define TT_MS_ID_UCS_4 10
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ADOBE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension!
+ *
+ * @values:
+ * TT_ADOBE_ID_STANDARD ::
+ * Adobe standard encoding.
+ * TT_ADOBE_ID_EXPERT ::
+ * Adobe expert encoding.
+ * TT_ADOBE_ID_CUSTOM ::
+ * Adobe custom encoding.
+ * TT_ADOBE_ID_LATIN_1 ::
+ * Adobe Latin~1 encoding.
+ */
+
+#define TT_ADOBE_ID_STANDARD 0
+#define TT_ADOBE_ID_EXPERT 1
+#define TT_ADOBE_ID_CUSTOM 2
+#define TT_ADOBE_ID_LATIN_1 3
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MACINTOSH. These values are also used as return values */
+ /* for function @FT_Get_CMap_Language_ID. */
+ /* */
+ /* The canonical source for the Apple assigned Language ID's is at */
+ /* */
+ /* https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html */
+ /* */
+#define TT_MAC_LANGID_ENGLISH 0
+#define TT_MAC_LANGID_FRENCH 1
+#define TT_MAC_LANGID_GERMAN 2
+#define TT_MAC_LANGID_ITALIAN 3
+#define TT_MAC_LANGID_DUTCH 4
+#define TT_MAC_LANGID_SWEDISH 5
+#define TT_MAC_LANGID_SPANISH 6
+#define TT_MAC_LANGID_DANISH 7
+#define TT_MAC_LANGID_PORTUGUESE 8
+#define TT_MAC_LANGID_NORWEGIAN 9
+#define TT_MAC_LANGID_HEBREW 10
+#define TT_MAC_LANGID_JAPANESE 11
+#define TT_MAC_LANGID_ARABIC 12
+#define TT_MAC_LANGID_FINNISH 13
+#define TT_MAC_LANGID_GREEK 14
+#define TT_MAC_LANGID_ICELANDIC 15
+#define TT_MAC_LANGID_MALTESE 16
+#define TT_MAC_LANGID_TURKISH 17
+#define TT_MAC_LANGID_CROATIAN 18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19
+#define TT_MAC_LANGID_URDU 20
+#define TT_MAC_LANGID_HINDI 21
+#define TT_MAC_LANGID_THAI 22
+#define TT_MAC_LANGID_KOREAN 23
+#define TT_MAC_LANGID_LITHUANIAN 24
+#define TT_MAC_LANGID_POLISH 25
+#define TT_MAC_LANGID_HUNGARIAN 26
+#define TT_MAC_LANGID_ESTONIAN 27
+#define TT_MAC_LANGID_LETTISH 28
+#define TT_MAC_LANGID_SAAMISK 29
+#define TT_MAC_LANGID_FAEROESE 30
+#define TT_MAC_LANGID_FARSI 31
+#define TT_MAC_LANGID_RUSSIAN 32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33
+#define TT_MAC_LANGID_FLEMISH 34
+#define TT_MAC_LANGID_IRISH 35
+#define TT_MAC_LANGID_ALBANIAN 36
+#define TT_MAC_LANGID_ROMANIAN 37
+#define TT_MAC_LANGID_CZECH 38
+#define TT_MAC_LANGID_SLOVAK 39
+#define TT_MAC_LANGID_SLOVENIAN 40
+#define TT_MAC_LANGID_YIDDISH 41
+#define TT_MAC_LANGID_SERBIAN 42
+#define TT_MAC_LANGID_MACEDONIAN 43
+#define TT_MAC_LANGID_BULGARIAN 44
+#define TT_MAC_LANGID_UKRAINIAN 45
+#define TT_MAC_LANGID_BYELORUSSIAN 46
+#define TT_MAC_LANGID_UZBEK 47
+#define TT_MAC_LANGID_KAZAKH 48
+#define TT_MAC_LANGID_AZERBAIJANI 49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50
+#define TT_MAC_LANGID_ARMENIAN 51
+#define TT_MAC_LANGID_GEORGIAN 52
+#define TT_MAC_LANGID_MOLDAVIAN 53
+#define TT_MAC_LANGID_KIRGHIZ 54
+#define TT_MAC_LANGID_TAJIKI 55
+#define TT_MAC_LANGID_TURKMEN 56
+#define TT_MAC_LANGID_MONGOLIAN 57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58
+#define TT_MAC_LANGID_PASHTO 59
+#define TT_MAC_LANGID_KURDISH 60
+#define TT_MAC_LANGID_KASHMIRI 61
+#define TT_MAC_LANGID_SINDHI 62
+#define TT_MAC_LANGID_TIBETAN 63
+#define TT_MAC_LANGID_NEPALI 64
+#define TT_MAC_LANGID_SANSKRIT 65
+#define TT_MAC_LANGID_MARATHI 66
+#define TT_MAC_LANGID_BENGALI 67
+#define TT_MAC_LANGID_ASSAMESE 68
+#define TT_MAC_LANGID_GUJARATI 69
+#define TT_MAC_LANGID_PUNJABI 70
+#define TT_MAC_LANGID_ORIYA 71
+#define TT_MAC_LANGID_MALAYALAM 72
+#define TT_MAC_LANGID_KANNADA 73
+#define TT_MAC_LANGID_TAMIL 74
+#define TT_MAC_LANGID_TELUGU 75
+#define TT_MAC_LANGID_SINHALESE 76
+#define TT_MAC_LANGID_BURMESE 77
+#define TT_MAC_LANGID_KHMER 78
+#define TT_MAC_LANGID_LAO 79
+#define TT_MAC_LANGID_VIETNAMESE 80
+#define TT_MAC_LANGID_INDONESIAN 81
+#define TT_MAC_LANGID_TAGALOG 82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84
+#define TT_MAC_LANGID_AMHARIC 85
+#define TT_MAC_LANGID_TIGRINYA 86
+#define TT_MAC_LANGID_GALLA 87
+#define TT_MAC_LANGID_SOMALI 88
+#define TT_MAC_LANGID_SWAHILI 89
+#define TT_MAC_LANGID_RUANDA 90
+#define TT_MAC_LANGID_RUNDI 91
+#define TT_MAC_LANGID_CHEWA 92
+#define TT_MAC_LANGID_MALAGASY 93
+#define TT_MAC_LANGID_ESPERANTO 94
+#define TT_MAC_LANGID_WELSH 128
+#define TT_MAC_LANGID_BASQUE 129
+#define TT_MAC_LANGID_CATALAN 130
+#define TT_MAC_LANGID_LATIN 131
+#define TT_MAC_LANGID_QUECHUA 132
+#define TT_MAC_LANGID_GUARANI 133
+#define TT_MAC_LANGID_AYMARA 134
+#define TT_MAC_LANGID_TATAR 135
+#define TT_MAC_LANGID_UIGHUR 136
+#define TT_MAC_LANGID_DZONGKHA 137
+#define TT_MAC_LANGID_JAVANESE 138
+#define TT_MAC_LANGID_SUNDANESE 139
+
+
+#if 0 /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 140
+#define TT_MAC_LANGID_IRISH_GAELIC 141
+
+#endif
+
+
+ /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN 140
+#define TT_MAC_LANGID_AFRIKAANS 141
+#define TT_MAC_LANGID_BRETON 142
+#define TT_MAC_LANGID_INUKTITUT 143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 144
+#define TT_MAC_LANGID_MANX_GAELIC 145
+#define TT_MAC_LANGID_IRISH_GAELIC 146
+#define TT_MAC_LANGID_TONGAN 147
+#define TT_MAC_LANGID_GREEK_POLYTONIC 148
+#define TT_MAC_LANGID_GREELANDIC 149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MICROSOFT. */
+ /* */
+ /* The canonical source for the MS assigned LCIDs is */
+ /* */
+ /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */
+ /* */
+
+#define TT_MS_LANGID_ARABIC_GENERAL 0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ 0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA 0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN 0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN 0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA 0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON 0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401
+#define TT_MS_LANGID_ARABIC_UAE 0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR 0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN 0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL 0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404
+#define TT_MS_LANGID_CHINESE_PRC 0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004
+
+#if 1 /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU 0x1404
+#else /* but beware, Microsoft may change its mind...
+ the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0 /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405
+#define TT_MS_LANGID_DANISH_DENMARK 0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY 0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407
+#define TT_MS_LANGID_GREEK_GREECE 0x0408
+
+ /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2 0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA 0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA 0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO 0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA 0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a
+#define TT_MS_LANGID_SPANISH_PERU 0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a
+#define TT_MS_LANGID_SPANISH_CHILE 0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a
+ /* The following ID blatantly violate MS specs by using a */
+ /* sublanguage > 0x1F. */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND 0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE 0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c
+#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO 0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION 0x200c
+#define TT_MS_LANGID_FRENCH_CONGO 0x240c
+ /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c
+#define TT_MS_LANGID_FRENCH_MALI 0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c
+#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c
+ /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY 0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814
+#define TT_MS_LANGID_POLISH_POLAND 0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a
+
+#if 0 /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a
+#else /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a
+ /* and XPsp2 Platform SDK added (2004-07-26) */
+ /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d
+#define TT_MS_LANGID_THAI_THAILAND 0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY 0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN 0x0420
+#define TT_MS_LANGID_URDU_INDIA 0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428
+#define TT_MS_LANGID_FARSI_IRAN 0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN 0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438
+#define TT_MS_LANGID_HINDI_INDIA 0x0439
+#define TT_MS_LANGID_MALTESE_MALTA 0x043a
+ /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b
+ /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+ TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA 0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444
+#define TT_MS_LANGID_BENGALI_INDIA 0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA 0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA 0x0447
+#define TT_MS_LANGID_ORIYA_INDIA 0x0448
+#define TT_MS_LANGID_TAMIL_INDIA 0x0449
+#define TT_MS_LANGID_TELUGU_INDIA 0x044a
+#define TT_MS_LANGID_KANNADA_INDIA 0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d
+#define TT_MS_LANGID_MARATHI_INDIA 0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA 0x0451
+ /* Don't use the next constant! It has */
+ /* (1) the wrong spelling (Dzonghka) */
+ /* (2) Microsoft doesn't officially define it -- */
+ /* at least it is not in the List of Local */
+ /* ID Values. */
+ /* (3) Dzongkha is not the same language as */
+ /* Tibetan, so merging it is wrong anyway. */
+ /* */
+ /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851
+
+#if 0
+ /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451
+ /* ... but it was changed; */
+#else
+ /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES 0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453
+#define TT_MS_LANGID_LAO_LAOS 0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456
+#define TT_MS_LANGID_KONKANI_INDIA 0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859
+ /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f
+ /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460
+ /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+ /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860
+ /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL 0x0461
+#define TT_MS_LANGID_NEPALI_INDIA 0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA 0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b
+#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c
+ /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+ TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+ /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA 0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA 0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873
+ /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475
+#define TT_MS_LANGID_LATIN 0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477
+ /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+ /* not written (but OTOH the peculiar writing system is worth */
+ /* studying). */
+#define TT_MS_LANGID_YI_CHINA 0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479
+ /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA 0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481
+
+#if 0 /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the `name' identifier field in the name records of */
+ /* the TTF `name' table. These values are platform independent. */
+ /* */
+#define TT_NAME_ID_COPYRIGHT 0
+#define TT_NAME_ID_FONT_FAMILY 1
+#define TT_NAME_ID_FONT_SUBFAMILY 2
+#define TT_NAME_ID_UNIQUE_ID 3
+#define TT_NAME_ID_FULL_NAME 4
+#define TT_NAME_ID_VERSION_STRING 5
+#define TT_NAME_ID_PS_NAME 6
+#define TT_NAME_ID_TRADEMARK 7
+
+ /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER 8
+#define TT_NAME_ID_DESIGNER 9
+#define TT_NAME_ID_DESCRIPTION 10
+#define TT_NAME_ID_VENDOR_URL 11
+#define TT_NAME_ID_DESIGNER_URL 12
+#define TT_NAME_ID_LICENSE 13
+#define TT_NAME_ID_LICENSE_URL 14
+ /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY 16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY 17
+#define TT_NAME_ID_MAC_FULL_NAME 18
+
+ /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT 19
+
+ /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME 20
+
+ /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY 21
+#define TT_NAME_ID_WWS_SUBFAMILY 22
+
+
+ /*************************************************************************/
+ /* */
+ /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */
+ /* */
+ /* Updated 08-Nov-2008. */
+ /* */
+
+ /* Bit 0 Basic Latin */
+#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */
+ /* Bit 1 C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */
+ /* Bit 2 Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */
+ /* Bit 3 Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */
+ /* Bit 4 IPA Extensions */
+ /* Phonetic Extensions */
+ /* Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */
+ /* U+1D00-U+1D7F */
+ /* U+1D80-U+1DBF */
+ /* Bit 5 Spacing Modifier Letters */
+ /* Modifier Tone Letters */
+#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */
+ /* U+A700-U+A71F */
+ /* Bit 6 Combining Diacritical Marks */
+ /* Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */
+ /* U+1DC0-U+1DFF */
+ /* Bit 7 Greek and Coptic */
+#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */
+ /* Bit 8 Coptic */
+#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */
+ /* Bit 9 Cyrillic */
+ /* Cyrillic Supplement */
+ /* Cyrillic Extended-A */
+ /* Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */
+ /* U+0500-U+052F */
+ /* U+2DE0-U+2DFF */
+ /* U+A640-U+A69F */
+ /* Bit 10 Armenian */
+#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */
+ /* Bit 11 Hebrew */
+#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */
+ /* Bit 12 Vai */
+#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */
+ /* Bit 13 Arabic */
+ /* Arabic Supplement */
+#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */
+ /* U+0750-U+077F */
+ /* Bit 14 NKo */
+#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */
+ /* Bit 15 Devanagari */
+#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */
+ /* Bit 16 Bengali */
+#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */
+ /* Bit 17 Gurmukhi */
+#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */
+ /* Bit 18 Gujarati */
+#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */
+ /* Bit 19 Oriya */
+#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */
+ /* Bit 20 Tamil */
+#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */
+ /* Bit 21 Telugu */
+#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */
+ /* Bit 22 Kannada */
+#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */
+ /* Bit 23 Malayalam */
+#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */
+ /* Bit 24 Thai */
+#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */
+ /* Bit 25 Lao */
+#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */
+ /* Bit 26 Georgian */
+ /* Georgian Supplement */
+#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */
+ /* U+2D00-U+2D2F */
+ /* Bit 27 Balinese */
+#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */
+ /* Bit 28 Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */
+ /* Bit 29 Latin Extended Additional */
+ /* Latin Extended-C */
+ /* Latin Extended-D */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */
+ /* U+2C60-U+2C7F */
+ /* U+A720-U+A7FF */
+ /* Bit 30 Greek Extended */
+#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */
+ /* Bit 31 General Punctuation */
+ /* Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */
+ /* U+2E00-U+2E7F */
+ /* Bit 32 Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */
+ /* Bit 33 Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */
+ /* Bit 34 Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */
+ /* Bit 35 Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */
+ /* Bit 36 Number Forms */
+#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */
+ /* Bit 37 Arrows */
+ /* Supplemental Arrows-A */
+ /* Supplemental Arrows-B */
+ /* Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */
+ /* U+27F0-U+27FF */
+ /* U+2900-U+297F */
+ /* U+2B00-U+2BFF */
+ /* Bit 38 Mathematical Operators */
+ /* Supplemental Mathematical Operators */
+ /* Miscellaneous Mathematical Symbols-A */
+ /* Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */
+ /* U+2A00-U+2AFF */
+ /* U+27C0-U+27EF */
+ /* U+2980-U+29FF */
+ /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */
+ /* Bit 40 Control Pictures */
+#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */
+ /* Bit 41 Optical Character Recognition */
+#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */
+ /* Bit 42 Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */
+ /* Bit 43 Box Drawing */
+#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */
+ /* Bit 44 Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */
+ /* Bit 45 Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */
+ /* Bit 46 Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */
+ /* Bit 47 Dingbats */
+#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */
+ /* Bit 48 CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */
+ /* Bit 49 Hiragana */
+#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */
+ /* Bit 50 Katakana */
+ /* Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */
+ /* U+31F0-U+31FF */
+ /* Bit 51 Bopomofo */
+ /* Bopomofo Extended */
+#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */
+ /* U+31A0-U+31BF */
+ /* Bit 52 Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */
+ /* Bit 53 Phags-Pa */
+#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+ /* Bit 54 Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */
+ /* Bit 55 CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */
+ /* Bit 56 Hangul Syllables */
+#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */
+ /* Bit 57 High Surrogates */
+ /* High Private Use Surrogates */
+ /* Low Surrogates */
+ /* */
+ /* According to OpenType specs v.1.3+, */
+ /* setting bit 57 implies that there is */
+ /* at least one codepoint beyond the */
+ /* Basic Multilingual Plane that is */
+ /* supported by this font. So it really */
+ /* means >= U+10000 */
+#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */
+ /* U+DB80-U+DBFF */
+ /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES
+ /* Bit 58 Phoenician */
+#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/
+ /* Bit 59 CJK Unified Ideographs */
+ /* CJK Radicals Supplement */
+ /* Kangxi Radicals */
+ /* Ideographic Description Characters */
+ /* CJK Unified Ideographs Extension A */
+ /* CJK Unified Ideographs Extension B */
+ /* Kanbun */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */
+ /* U+2E80-U+2EFF */
+ /* U+2F00-U+2FDF */
+ /* U+2FF0-U+2FFF */
+ /* U+3400-U+4DB5 */
+ /*U+20000-U+2A6DF*/
+ /* U+3190-U+319F */
+ /* Bit 60 Private Use */
+#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */
+ /* Bit 61 CJK Strokes */
+ /* CJK Compatibility Ideographs */
+ /* CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */
+ /* U+F900-U+FAFF */
+ /*U+2F800-U+2FA1F*/
+ /* Bit 62 Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */
+ /* Bit 63 Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */
+ /* Bit 64 Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */
+ /* Bit 65 Vertical forms */
+ /* CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */
+ /* U+FE30-U+FE4F */
+ /* Bit 66 Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */
+ /* Bit 67 Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */
+ /* Bit 68 Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */
+ /* Bit 69 Specials */
+#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */
+ /* Bit 70 Tibetan */
+#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */
+ /* Bit 71 Syriac */
+#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */
+ /* Bit 72 Thaana */
+#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */
+ /* Bit 73 Sinhala */
+#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */
+ /* Bit 74 Myanmar */
+#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */
+ /* Bit 75 Ethiopic */
+ /* Ethiopic Supplement */
+ /* Ethiopic Extended */
+#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */
+ /* U+1380-U+139F */
+ /* U+2D80-U+2DDF */
+ /* Bit 76 Cherokee */
+#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */
+ /* Bit 77 Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */
+ /* Bit 78 Ogham */
+#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */
+ /* Bit 79 Runic */
+#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */
+ /* Bit 80 Khmer */
+ /* Khmer Symbols */
+#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */
+ /* U+19E0-U+19FF */
+ /* Bit 81 Mongolian */
+#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */
+ /* Bit 82 Braille Patterns */
+#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */
+ /* Bit 83 Yi Syllables */
+ /* Yi Radicals */
+#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */
+ /* U+A490-U+A4CF */
+ /* Bit 84 Tagalog */
+ /* Hanunoo */
+ /* Buhid */
+ /* Tagbanwa */
+#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */
+ /* U+1720-U+173F */
+ /* U+1740-U+175F */
+ /* U+1760-U+177F */
+ /* Bit 85 Old Italic */
+#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/
+ /* Bit 86 Gothic */
+#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/
+ /* Bit 87 Deseret */
+#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/
+ /* Bit 88 Byzantine Musical Symbols */
+ /* Musical Symbols */
+ /* Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/
+ /*U+1D100-U+1D1FF*/
+ /*U+1D200-U+1D24F*/
+ /* Bit 89 Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/
+ /* Bit 90 Private Use (plane 15) */
+ /* Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/
+ /*U+100000-U+10FFFD*/
+ /* Bit 91 Variation Selectors */
+ /* Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */
+ /*U+E0100-U+E01EF*/
+ /* Bit 92 Tags */
+#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/
+ /* Bit 93 Limbu */
+#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */
+ /* Bit 94 Tai Le */
+#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */
+ /* Bit 95 New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */
+ /* Bit 96 Buginese */
+#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */
+ /* Bit 97 Glagolitic */
+#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */
+ /* Bit 98 Tifinagh */
+#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */
+ /* Bit 99 Yijing Hexagram Symbols */
+#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */
+ /* Bit 100 Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */
+ /* Bit 101 Linear B Syllabary */
+ /* Linear B Ideograms */
+ /* Aegean Numbers */
+#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/
+ /*U+10080-U+100FF*/
+ /*U+10100-U+1013F*/
+ /* Bit 102 Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/
+ /* Bit 103 Ugaritic */
+#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/
+ /* Bit 104 Old Persian */
+#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/
+ /* Bit 105 Shavian */
+#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/
+ /* Bit 106 Osmanya */
+#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/
+ /* Bit 107 Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/
+ /* Bit 108 Kharoshthi */
+#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/
+ /* Bit 109 Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/
+ /* Bit 110 Cuneiform */
+ /* Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/
+ /*U+12400-U+1247F*/
+ /* Bit 111 Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/
+ /* Bit 112 Sundanese */
+#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */
+ /* Bit 113 Lepcha */
+#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */
+ /* Bit 114 Ol Chiki */
+#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */
+ /* Bit 115 Saurashtra */
+#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */
+ /* Bit 116 Kayah Li */
+#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */
+ /* Bit 117 Rejang */
+#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */
+ /* Bit 118 Cham */
+#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */
+ /* Bit 119 Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/
+ /* Bit 120 Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/
+ /* Bit 121 Carian */
+ /* Lycian */
+ /* Lydian */
+#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/
+ /*U+10280-U+1029F*/
+ /*U+10920-U+1093F*/
+ /* Bit 122 Domino Tiles */
+ /* Mahjong Tiles */
+#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/
+ /*U+1F000-U+1F02F*/
+ /* Bit 123-127 Reserved for process-internal usage */
+
+
+ /*************************************************************************/
+ /* */
+ /* Some compilers have a very limited length of identifiers. */
+ /* */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Here some alias #defines in order to be clearer. */
+ /* */
+ /* These are not always #defined to stay within the 31~character limit */
+ /* which some compilers have. */
+ /* */
+ /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */
+ /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */
+ /* If you get a warning with such a compiler, use the -i40 switch. */
+ /* */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \
+ TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \
+ TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS \
+ TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+ TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/tttables.h b/core/include/thirdparties/freetype/freetype/tttables.h
new file mode 100644
index 0000000000..c620550254
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/tttables.h
@@ -0,0 +1,777 @@
+/***************************************************************************/
+/* */
+/* tttables.h */
+/* */
+/* Basic SFNT/TrueType tables definitions and interface */
+/* (specification only). */
+/* */
+/* Copyright 1996-2005, 2008-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+ /* <Title> */
+ /* TrueType Tables */
+ /* */
+ /* <Abstract> */
+ /* TrueType specific table types and functions. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of TrueType-specific tables */
+ /* as well as some routines used to access and process them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Header */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType font header table. All */
+ /* fields follow the TrueType specification. */
+ /* */
+ typedef struct TT_Header_
+ {
+ FT_Fixed Table_Version;
+ FT_Fixed Font_Revision;
+
+ FT_Long CheckSum_Adjust;
+ FT_Long Magic_Number;
+
+ FT_UShort Flags;
+ FT_UShort Units_Per_EM;
+
+ FT_Long Created [2];
+ FT_Long Modified[2];
+
+ FT_Short xMin;
+ FT_Short yMin;
+ FT_Short xMax;
+ FT_Short yMax;
+
+ FT_UShort Mac_Style;
+ FT_UShort Lowest_Rec_PPEM;
+
+ FT_Short Font_Direction;
+ FT_Short Index_To_Loc_Format;
+ FT_Short Glyph_Data_Format;
+
+ } TT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_HoriHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType horizontal header, the `hhea' */
+ /* table, as well as the corresponding horizontal metrics table, */
+ /* i.e., the `hmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of all */
+ /* glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' field */
+ /* of the OS/2 table instead if you want */
+ /* the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the distance */
+ /* from the baseline to the bottom-most of */
+ /* all glyph points found in the font. It */
+ /* is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Width_Max :: This field is the maximum of all advance */
+ /* widths found in the font. It can be */
+ /* used to compute the maximum width of an */
+ /* arbitrary string of text. */
+ /* */
+ /* min_Left_Side_Bearing :: The minimum left side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Right_Side_Bearing :: The minimum right side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* xMax_Extent :: The maximum horizontal extent (i.e., the */
+ /* `width' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */
+ /* table -- this value can be smaller than */
+ /* the total number of glyphs in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_HoriHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Width_Max; /* advance width maximum */
+
+ FT_Short min_Left_Side_Bearing; /* minimum left-sb */
+ FT_Short min_Right_Side_Bearing; /* minimum right-sb */
+ FT_Short xMax_Extent; /* xmax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_HMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they are used to connect the metrics header to the relevant */
+ /* `HMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_HoriHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_VertHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType vertical header, the `vhea' */
+ /* table, as well as the corresponding vertical metrics table, i.e., */
+ /* the `vmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of */
+ /* all glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the */
+ /* distance from the baseline to the */
+ /* bottom-most of all glyph points found */
+ /* in the font. It is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Height_Max :: This field is the maximum of all */
+ /* advance heights found in the font. It */
+ /* can be used to compute the maximum */
+ /* height of an arbitrary string of text. */
+ /* */
+ /* min_Top_Side_Bearing :: The minimum top side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* yMax_Extent :: The maximum vertical extent (i.e., the */
+ /* `height' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* caret_Offset :: The cursor's offset for slanted fonts. */
+ /* This value is `reserved' in vmtx */
+ /* version 1.0. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of VMetrics entries in the */
+ /* `vmtx' table -- this value can be */
+ /* smaller than the total number of glyphs */
+ /* in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_VertHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Height_Max; /* advance height maximum */
+
+ FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */
+ FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */
+ FT_Short yMax_Extent; /* xmax or ymax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_VMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they're used to connect the metrics header to the relevant */
+ /* `HMTX' or `VMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_VertHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_OS2 */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType OS/2 table. This is the long */
+ /* table version. All fields comply to the TrueType specification. */
+ /* */
+ /* Note that we now support old Mac fonts which do not include an */
+ /* OS/2 table. In this case, the `version' field is always set to */
+ /* 0xFFFF. */
+ /* */
+ typedef struct TT_OS2_
+ {
+ FT_UShort version; /* 0x0001 - more or 0xFFFF */
+ FT_Short xAvgCharWidth;
+ FT_UShort usWeightClass;
+ FT_UShort usWidthClass;
+ FT_Short fsType;
+ FT_Short ySubscriptXSize;
+ FT_Short ySubscriptYSize;
+ FT_Short ySubscriptXOffset;
+ FT_Short ySubscriptYOffset;
+ FT_Short ySuperscriptXSize;
+ FT_Short ySuperscriptYSize;
+ FT_Short ySuperscriptXOffset;
+ FT_Short ySuperscriptYOffset;
+ FT_Short yStrikeoutSize;
+ FT_Short yStrikeoutPosition;
+ FT_Short sFamilyClass;
+
+ FT_Byte panose[10];
+
+ FT_ULong ulUnicodeRange1; /* Bits 0-31 */
+ FT_ULong ulUnicodeRange2; /* Bits 32-63 */
+ FT_ULong ulUnicodeRange3; /* Bits 64-95 */
+ FT_ULong ulUnicodeRange4; /* Bits 96-127 */
+
+ FT_Char achVendID[4];
+
+ FT_UShort fsSelection;
+ FT_UShort usFirstCharIndex;
+ FT_UShort usLastCharIndex;
+ FT_Short sTypoAscender;
+ FT_Short sTypoDescender;
+ FT_Short sTypoLineGap;
+ FT_UShort usWinAscent;
+ FT_UShort usWinDescent;
+
+ /* only version 1 tables: */
+
+ FT_ULong ulCodePageRange1; /* Bits 0-31 */
+ FT_ULong ulCodePageRange2; /* Bits 32-63 */
+
+ /* only version 2 tables: */
+
+ FT_Short sxHeight;
+ FT_Short sCapHeight;
+ FT_UShort usDefaultChar;
+ FT_UShort usBreakChar;
+ FT_UShort usMaxContext;
+
+ } TT_OS2;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Postscript */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PostScript table. All fields */
+ /* comply to the TrueType specification. This structure does not */
+ /* reference the PostScript glyph names, which can be nevertheless */
+ /* accessed with the `ttpost' module. */
+ /* */
+ typedef struct TT_Postscript_
+ {
+ FT_Fixed FormatType;
+ FT_Fixed italicAngle;
+ FT_Short underlinePosition;
+ FT_Short underlineThickness;
+ FT_ULong isFixedPitch;
+ FT_ULong minMemType42;
+ FT_ULong maxMemType42;
+ FT_ULong minMemType1;
+ FT_ULong maxMemType1;
+
+ /* Glyph names follow in the file, but we don't */
+ /* load them by default. See the ttpost.c file. */
+
+ } TT_Postscript;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_PCLT */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PCLT table. All fields */
+ /* comply to the TrueType specification. */
+ /* */
+ typedef struct TT_PCLT_
+ {
+ FT_Fixed Version;
+ FT_ULong FontNumber;
+ FT_UShort Pitch;
+ FT_UShort xHeight;
+ FT_UShort Style;
+ FT_UShort TypeFamily;
+ FT_UShort CapHeight;
+ FT_UShort SymbolSet;
+ FT_Char TypeFace[16];
+ FT_Char CharacterComplement[8];
+ FT_Char FileName[6];
+ FT_Char StrokeWeight;
+ FT_Char WidthType;
+ FT_Byte SerifStyle;
+ FT_Byte Reserved;
+
+ } TT_PCLT;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_MaxProfile */
+ /* */
+ /* <Description> */
+ /* The maximum profile is a table containing many max values which */
+ /* can be used to pre-allocate arrays. This ensures that no memory */
+ /* allocation occurs during a glyph load. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numGlyphs :: The number of glyphs in this TrueType */
+ /* font. */
+ /* */
+ /* maxPoints :: The maximum number of points in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositePoints'. */
+ /* */
+ /* maxContours :: The maximum number of contours in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositeContours'. */
+ /* */
+ /* maxCompositePoints :: The maximum number of points in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxPoints'. */
+ /* */
+ /* maxCompositeContours :: The maximum number of contours in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxContours'. */
+ /* */
+ /* maxZones :: The maximum number of zones used for */
+ /* glyph hinting. */
+ /* */
+ /* maxTwilightPoints :: The maximum number of points in the */
+ /* twilight zone used for glyph hinting. */
+ /* */
+ /* maxStorage :: The maximum number of elements in the */
+ /* storage area used for glyph hinting. */
+ /* */
+ /* maxFunctionDefs :: The maximum number of function */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxInstructionDefs :: The maximum number of instruction */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxStackElements :: The maximum number of stack elements used */
+ /* during bytecode interpretation. */
+ /* */
+ /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */
+ /* used for glyph hinting. */
+ /* */
+ /* maxComponentElements :: The maximum number of simple (i.e., non- */
+ /* composite) glyphs in a composite glyph. */
+ /* */
+ /* maxComponentDepth :: The maximum nesting depth of composite */
+ /* glyphs. */
+ /* */
+ /* <Note> */
+ /* This structure is only used during font loading. */
+ /* */
+ typedef struct TT_MaxProfile_
+ {
+ FT_Fixed version;
+ FT_UShort numGlyphs;
+ FT_UShort maxPoints;
+ FT_UShort maxContours;
+ FT_UShort maxCompositePoints;
+ FT_UShort maxCompositeContours;
+ FT_UShort maxZones;
+ FT_UShort maxTwilightPoints;
+ FT_UShort maxStorage;
+ FT_UShort maxFunctionDefs;
+ FT_UShort maxInstructionDefs;
+ FT_UShort maxStackElements;
+ FT_UShort maxSizeOfInstructions;
+ FT_UShort maxComponentElements;
+ FT_UShort maxComponentDepth;
+
+ } TT_MaxProfile;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Sfnt_Tag */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify the index of an SFNT table. */
+ /* Used in the @FT_Get_Sfnt_Table API function. */
+ /* */
+ typedef enum FT_Sfnt_Tag_
+ {
+ ft_sfnt_head = 0, /* TT_Header */
+ ft_sfnt_maxp = 1, /* TT_MaxProfile */
+ ft_sfnt_os2 = 2, /* TT_OS2 */
+ ft_sfnt_hhea = 3, /* TT_HoriHeader */
+ ft_sfnt_vhea = 4, /* TT_VertHeader */
+ ft_sfnt_post = 5, /* TT_Postscript */
+ ft_sfnt_pclt = 6, /* TT_PCLT */
+
+ sfnt_max /* internal end mark */
+
+ } FT_Sfnt_Tag;
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Table */
+ /* */
+ /* <Description> */
+ /* Return a pointer to a given SFNT table within a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source. */
+ /* */
+ /* tag :: The index of the SFNT table. */
+ /* */
+ /* <Return> */
+ /* A type-less pointer to the table. This will be~0 in case of */
+ /* error, or if the corresponding table was not found *OR* loaded */
+ /* from the file. */
+ /* */
+ /* Use a typecast according to `tag' to access the structure */
+ /* elements. */
+ /* */
+ /* <Note> */
+ /* The table is owned by the face object and disappears with it. */
+ /* */
+ /* This function is only useful to access SFNT tables that are loaded */
+ /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */
+ /* a list. */
+ /* */
+ /* Here an example how to access the `vhea' table: */
+ /* */
+ /* { */
+ /* TT_VertHeader* vert_header; */
+ /* */
+ /* */
+ /* vert_header = */
+ /* (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea ); */
+ /* } */
+ /* */
+ FT_EXPORT( void* )
+ FT_Get_Sfnt_Table( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Load_Sfnt_Table
+ *
+ * @description:
+ * Load any font table into client memory.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * tag ::
+ * The four-byte tag of the table to load. Use the value~0 if you want
+ * to access the whole font file. Otherwise, you can use one of the
+ * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+ * one with @FT_MAKE_TAG.
+ *
+ * offset ::
+ * The starting offset in the table (or file if tag == 0).
+ *
+ * @output:
+ * buffer ::
+ * The target buffer address. The client must ensure that the memory
+ * array is big enough to hold the data.
+ *
+ * @inout:
+ * length ::
+ * If the `length' parameter is NULL, then try to load the whole table.
+ * Return an error code if it fails.
+ *
+ * Else, if `*length' is~0, exit immediately while returning the
+ * table's (or file) full size in it.
+ *
+ * Else the number of bytes to read from the table or file, from the
+ * starting offset.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If you need to determine the table's length you should first call this
+ * function with `*length' set to~0, as in the following example:
+ *
+ * {
+ * FT_ULong length = 0;
+ *
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+ * if ( error ) { ... table does not exist ... }
+ *
+ * buffer = malloc( length );
+ * if ( buffer == NULL ) { ... not enough memory ... }
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+ * if ( error ) { ... could not load table ... }
+ * }
+ */
+ FT_EXPORT( FT_Error )
+ FT_Load_Sfnt_Table( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Sfnt_Table_Info
+ *
+ * @description:
+ * Return information on an SFNT table.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * table_index ::
+ * The index of an SFNT table. The function returns
+ * FT_Err_Table_Missing for an invalid value.
+ *
+ * @inout:
+ * tag ::
+ * The name tag of the SFNT table. If the value is NULL, `table_index'
+ * is ignored, and `length' returns the number of SFNT tables in the
+ * font.
+ *
+ * @output:
+ * length ::
+ * The length of the SFNT table (or the number of SFNT tables, depending
+ * on `tag').
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * While parsing fonts, FreeType handles SFNT tables with length zero as
+ * missing.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Sfnt_Table_Info( FT_Face face,
+ FT_UInt table_index,
+ FT_ULong *tag,
+ FT_ULong *length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Language_ID */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap language ID. Definitions of */
+ /* language ID values are in `freetype/ttnameid.h'. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The language ID of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, just return~0 as the default value. */
+ /* */
+ /* For a format~14 cmap (to access Unicode IVS), the return value is */
+ /* 0xFFFFFFFF. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_CMap_Language_ID( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Format */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap format. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The format of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, return -1. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_Get_CMap_Format( FT_CharMap charmap );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/tttags.h b/core/include/thirdparties/freetype/freetype/tttags.h
new file mode 100644
index 0000000000..ac7de2ad79
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/tttags.h
@@ -0,0 +1,109 @@
+/***************************************************************************/
+/* */
+/* tttags.h */
+/* */
+/* Tags for TrueType and OpenType tables (specification only). */
+/* */
+/* Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
+#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
+#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/freetype/ttunpat.h b/core/include/thirdparties/freetype/freetype/ttunpat.h
new file mode 100644
index 0000000000..08e27599fa
--- /dev/null
+++ b/core/include/thirdparties/freetype/freetype/ttunpat.h
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/* */
+/* ttunpat.h */
+/* */
+/* Definitions for the unpatented TrueType hinting system */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* Written by Graham Asher <graham.asher@btinternet.com> */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_UNPATENTED_HINTING
+ *
+ * @description:
+ * A constant used as the tag of an @FT_Parameter structure to indicate
+ * that unpatented methods only should be used by the TrueType bytecode
+ * interpreter for a typeface opened by @FT_Open_Face.
+ *
+ */
+#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/freetype/ft2build.h b/core/include/thirdparties/freetype/ft2build.h
new file mode 100644
index 0000000000..134007d86f
--- /dev/null
+++ b/core/include/thirdparties/freetype/ft2build.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* ft2build.h */
+/* */
+/* FreeType 2 build and setup macros. */
+/* (Generic version) */
+/* */
+/* Copyright 1996-2001, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file corresponds to the default `ft2build.h' file for */
+ /* FreeType 2. It uses the `freetype' include root. */
+ /* */
+ /* Note that specific platforms might use a different configuration. */
+ /* See builds/unix/ft2unix.h for an example. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include "foxitnames.h"
+#include "freetype/config/ftheader.h"
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/core/include/thirdparties/libjpeg/jconfig.h b/core/include/thirdparties/libjpeg/jconfig.h
new file mode 100644
index 0000000000..2f4da14c54
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jconfig.h
@@ -0,0 +1,45 @@
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
+/* see jconfig.doc for explanations */
+
+#define HAVE_PROTOTYPES
+#define HAVE_UNSIGNED_CHAR
+#define HAVE_UNSIGNED_SHORT
+/* #define void char */
+/* #define const */
+#undef CHAR_IS_UNSIGNED
+#define HAVE_STDDEF_H
+#define HAVE_STDLIB_H
+#undef NEED_BSD_STRINGS
+#undef NEED_SYS_TYPES_H
+#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
+#undef NEED_SHORT_EXTERNAL_NAMES
+#undef INCOMPLETE_TYPES_BROKEN
+
+/* Define "boolean" as unsigned char, not int, per Windows custom */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+typedef unsigned char boolean;
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+
+
+#ifdef JPEG_INTERNALS
+
+#undef RIGHT_SHIFT_IS_UNSIGNED
+
+#endif /* JPEG_INTERNALS */
+
+#ifdef JPEG_CJPEG_DJPEG
+
+#define BMP_SUPPORTED /* BMP image file format */
+#define GIF_SUPPORTED /* GIF image file format */
+#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
+#undef RLE_SUPPORTED /* Utah RLE image file format */
+#define TARGA_SUPPORTED /* Targa image file format */
+
+#define TWO_FILE_COMMANDLINE /* optional */
+#define USE_SETMODE /* Microsoft has setmode() */
+#undef NEED_SIGNAL_CATCHER
+#undef DONT_USE_B_MODE
+#undef PROGRESS_REPORT /* optional */
+
+#endif /* JPEG_CJPEG_DJPEG */
diff --git a/core/include/thirdparties/libjpeg/jerror.h b/core/include/thirdparties/libjpeg/jerror.h
new file mode 100644
index 0000000000..a2b8f96f8f
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jerror.h
@@ -0,0 +1,291 @@
+/*
+ * jerror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the JPEG library.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ * A set of error-reporting macros are defined too. Some applications using
+ * the JPEG library may wish to include this file to get the error codes
+ * and/or the macros.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE. To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef JERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* JERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string) code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
+
+/* For maintenance convenience, list is alphabetical by message code name */
+JMESSAGE(JERR_ARITH_NOTIMPL,
+ "Sorry, there are legal restrictions on arithmetic coding")
+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
+JMESSAGE(JERR_BAD_LIB_VERSION,
+ "Wrong JPEG library version: library is %d, caller expects %d")
+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
+JMESSAGE(JERR_BAD_PROGRESSION,
+ "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
+JMESSAGE(JERR_BAD_PROG_SCRIPT,
+ "Invalid progressive parameters at scan script entry %d")
+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
+JMESSAGE(JERR_BAD_STRUCT_SIZE,
+ "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
+JMESSAGE(JERR_FILE_READ, "Input file read error")
+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
+ "Cannot transcode due to multiple use of quantization table %d")
+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
+JMESSAGE(JERR_QUANT_COMPONENTS,
+ "Cannot quantize more than %d color components")
+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
+JMESSAGE(JERR_TFILE_WRITE,
+ "Write failed on temporary file --- out of disk space?")
+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
+JMESSAGE(JMSG_VERSION, JVERSION)
+JMESSAGE(JTRC_16BIT_TABLES,
+ "Caution: quantization tables are too coarse for baseline JPEG")
+JMESSAGE(JTRC_ADOBE,
+ "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
+JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d")
+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
+JMESSAGE(JTRC_EOI, "End Of Image")
+JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d")
+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d")
+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
+ "Warning: thumbnail image size does not match data length %u")
+JMESSAGE(JTRC_JFIF_EXTENSION,
+ "JFIF extension marker: type 0x%02x, length %u")
+JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image")
+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
+JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u")
+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
+JMESSAGE(JTRC_RST, "RST%d")
+JMESSAGE(JTRC_SMOOTH_NOTIMPL,
+ "Smoothing not supported with nonstandard sampling ratios")
+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
+JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d")
+JMESSAGE(JTRC_SOI, "Start of Image")
+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
+JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d")
+JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d")
+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
+JMESSAGE(JTRC_THUMB_JPEG,
+ "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_PALETTE,
+ "JFIF extension marker: palette thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_RGB,
+ "JFIF extension marker: RGB thumbnail image, length %u")
+JMESSAGE(JTRC_UNKNOWN_IDS,
+ "Unrecognized component IDs %d %d %d, assuming YCbCr")
+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
+JMESSAGE(JWRN_BOGUS_PROGRESSION,
+ "Inconsistent progression sequence for component %d coefficient %d")
+JMESSAGE(JWRN_EXTRANEOUS_DATA,
+ "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
+JMESSAGE(JWRN_MUST_RESYNC,
+ "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
+
+#ifdef JMAKE_ENUM_LIST
+
+ JMSG_LASTMSGCODE
+} J_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
+
+
+#ifndef JERROR_H
+#define JERROR_H
+
+/* Macros to simplify using the error and trace message stuff */
+/* The first parameter is either type of cinfo pointer */
+
+/* Fatal errors (print message and exit) */
+#define ERREXIT(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT3(cinfo,code,p1,p2,p3) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (cinfo)->err->msg_parm.i[3] = (p4), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXITS(cinfo,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+
+#define MAKESTMT(stuff) do { stuff } while (0)
+
+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
+#define WARNMS(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+
+/* Informational/debugging messages */
+#define TRACEMS(cinfo,lvl,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS1(cinfo,lvl,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS2(cinfo,lvl,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMSS(cinfo,lvl,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+
+#endif /* JERROR_H */
diff --git a/core/include/thirdparties/libjpeg/jmorecfg.h b/core/include/thirdparties/libjpeg/jmorecfg.h
new file mode 100644
index 0000000000..3602114a5c
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jmorecfg.h
@@ -0,0 +1,376 @@
+/*
+ * jmorecfg.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains additional configuration options that customize the
+ * JPEG software for special applications or support machine-dependent
+ * optimizations. Most users will not need to touch this file.
+ */
+
+#ifdef _MSC_VER
+#pragma warning (disable : 4142)
+#endif
+
+/*
+ * Define BITS_IN_JSAMPLE as either
+ * 8 for 8-bit sample values (the usual setting)
+ * 12 for 12-bit sample values
+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the
+ * JPEG standard, and the IJG code does not support anything else!
+ * We do not support run-time selection of data precision, sorry.
+ */
+
+#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
+
+
+/*
+ * Maximum number of components (color channels) allowed in JPEG image.
+ * To meet the letter of the JPEG spec, set this to 255. However, darn
+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha
+ * mask). We recommend 10 as a reasonable compromise; use 4 if you are
+ * really short on memory. (Each allowed component costs a hundred or so
+ * bytes of storage, whether actually used in an image or not.)
+ */
+
+#define MAX_COMPONENTS 10 /* maximum number of image components */
+
+
+/*
+ * Basic data types.
+ * You may need to change these if you have a machine with unusual data
+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
+ * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
+ * but it had better be at least 16.
+ */
+
+/* Representation of a single sample (pixel element value).
+ * We frequently allocate large arrays of these, so it's important to keep
+ * them small. But if you have memory to burn and access to char or short
+ * arrays is very slow on your hardware, you might want to change these.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+/* JSAMPLE should be the smallest type that will hold the values 0..255.
+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JSAMPLE;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJSAMPLE(value) ((int) (value))
+#else
+#define GETJSAMPLE(value) ((int) (value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+#define MAXJSAMPLE 255
+#define CENTERJSAMPLE 128
+
+#endif /* BITS_IN_JSAMPLE == 8 */
+
+
+#if BITS_IN_JSAMPLE == 12
+/* JSAMPLE should be the smallest type that will hold the values 0..4095.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 4095
+#define CENTERJSAMPLE 2048
+
+#endif /* BITS_IN_JSAMPLE == 12 */
+
+
+/* Representation of a DCT frequency coefficient.
+ * This should be a signed value of at least 16 bits; "short" is usually OK.
+ * Again, we allocate large arrays of these, but you can change to int
+ * if you have memory to burn and "short" is really slow.
+ */
+
+typedef short JCOEF;
+
+
+/* Compressed datastreams are represented as arrays of JOCTET.
+ * These must be EXACTLY 8 bits wide, at least once they are written to
+ * external storage. Note that when using the stdio data source/destination
+ * managers, this is also the data type passed to fread/fwrite.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JOCTET;
+#define GETJOCTET(value) (value)
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JOCTET;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJOCTET(value) (value)
+#else
+#define GETJOCTET(value) ((value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* These typedefs are used for various table entries and so forth.
+ * They must be at least as wide as specified; but making them too big
+ * won't cost a huge amount of memory, so we don't provide special
+ * extraction code like we did for JSAMPLE. (In other words, these
+ * typedefs live at a different point on the speed/space tradeoff curve.)
+ */
+
+#if _FX_OS_ != _FX_VXWORKS_
+
+/* UINT8 must hold at least the values 0..255. */
+
+#ifdef HAVE_UNSIGNED_CHAR
+typedef unsigned char UINT8;
+#else /* not HAVE_UNSIGNED_CHAR */
+#ifdef CHAR_IS_UNSIGNED
+typedef char UINT8;
+#else /* not CHAR_IS_UNSIGNED */
+typedef short UINT8;
+#endif /* CHAR_IS_UNSIGNED */
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* UINT16 must hold at least the values 0..65535. */
+
+#ifdef HAVE_UNSIGNED_SHORT
+typedef unsigned short UINT16;
+#else /* not HAVE_UNSIGNED_SHORT */
+typedef unsigned int UINT16;
+#endif /* HAVE_UNSIGNED_SHORT */
+
+/* INT16 must hold at least the values -32768..32767. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
+typedef short INT16;
+#endif
+
+/* INT32 must hold at least signed 32-bit values. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
+typedef int INT32;
+#endif
+
+#endif
+
+/* Datatype used for image dimensions. The JPEG standard only supports
+ * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
+ * "unsigned int" is sufficient on all machines. However, if you need to
+ * handle larger images and you don't mind deviating from the spec, you
+ * can change this datatype.
+ */
+
+typedef unsigned int JDIMENSION;
+
+#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
+
+
+/* These macros are used in all function definitions and extern declarations.
+ * You could modify them if you need to change function linkage conventions;
+ * in particular, you'll need to do that to make the library a Windows DLL.
+ * Another application is to make all functions global for use with debuggers
+ * or code profilers that require it.
+ */
+
+/* a function called through method pointers: */
+#define METHODDEF(type) static type
+/* a function used only in its module: */
+#define LOCAL(type) static type
+/* a function referenced thru EXTERNs: */
+#define GLOBAL(type) type
+
+#ifdef _FX_MANAGED_CODE_
+#define EXTERN(type) extern "C" type
+#else
+/* a reference to a GLOBAL function: */
+#define EXTERN(type) extern type
+#endif
+
+
+/* This macro is used to declare a "method", that is, a function pointer.
+ * We want to supply prototype parameters if the compiler can cope.
+ * Note that the arglist parameter must be parenthesized!
+ * Again, you can customize this if you need special linkage keywords.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
+#else
+#define JMETHOD(type,methodname,arglist) type (*methodname) ()
+#endif
+
+
+/* Here is the pseudo-keyword for declaring pointers that must be "far"
+ * on 80x86 machines. Most of the specialized coding for 80x86 is handled
+ * by just saying "FAR *" where such a pointer is needed. In a few places
+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
+ */
+
+#ifdef NEED_FAR_POINTERS
+#define FAR far
+#else
+//#define FAR
+#endif
+
+
+/*
+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear
+ * in standard header files. Or you may have conflicts with application-
+ * specific header files that you want to include together with these files.
+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
+ */
+
+#ifndef HAVE_BOOLEAN
+typedef int boolean;
+#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+/*
+ * The remaining options affect code selection within the JPEG library,
+ * but they don't need to be visible to most applications using the library.
+ * To minimize application namespace pollution, the symbols won't be
+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
+ */
+
+#ifdef JPEG_INTERNALS
+#define JPEG_INTERNAL_OPTIONS
+#endif
+
+#ifdef JPEG_INTERNAL_OPTIONS
+
+
+/*
+ * These defines indicate whether to include various optional functions.
+ * Undefining some of these symbols will produce a smaller but less capable
+ * library. Note that you can leave certain source files out of the
+ * compilation/linking process if you've #undef'd the corresponding symbols.
+ * (You may HAVE to do that if your compiler doesn't like null source files.)
+ */
+
+/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
+
+/* Capability options common to encoder and decoder: */
+
+#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
+#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
+#undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
+
+/* Encoder capability options: */
+
+#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
+/* Note: if you selected 12-bit data precision, it is dangerous to turn off
+ * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
+ * precision, so jchuff.c normally uses entropy optimization to compute
+ * usable tables for higher precision. If you don't want to do optimization,
+ * you'll have to supply different default Huffman tables.
+ * The exact same statements apply for progressive JPEG: the default tables
+ * don't work for progressive mode. (This may get fixed, however.)
+ */
+#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
+
+/* Decoder capability options: */
+
+#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
+#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
+#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
+#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
+#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
+#undef QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
+#undef QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
+
+/* more capability options later, no doubt */
+
+
+/*
+ * Ordering of RGB data in scanlines passed to or from the application.
+ * If your application wants to deal with data in the order B,G,R, just
+ * change these macros. You can also deal with formats such as R,G,B,X
+ * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
+ * the offsets will also change the order in which colormap data is organized.
+ * RESTRICTIONS:
+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
+ * useful if you are using JPEG color spaces other than YCbCr or grayscale.
+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ * is not 3 (they don't understand about dummy color components!). So you
+ * can't use color quantization if you change that value.
+ */
+
+#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
+#define RGB_GREEN 1 /* Offset of Green */
+#define RGB_BLUE 2 /* Offset of Blue */
+#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
+
+
+/* Definitions for speed-related optimizations. */
+
+
+/* If your compiler supports inline functions, define INLINE
+ * as the inline keyword; otherwise define it as empty.
+ */
+
+#ifndef INLINE
+#ifdef __GNUC__ /* for instance, GNU C knows about inline */
+#define INLINE __inline__
+#endif
+#ifndef INLINE
+#define INLINE /* default is to define it as empty */
+#endif
+#endif
+
+
+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
+ * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
+ * as short on such a machine. MULTIPLIER must be at least 16 bits wide.
+ */
+
+#ifndef MULTIPLIER
+#define MULTIPLIER int /* type for fastest integer multiply */
+#endif
+
+
+/* FAST_FLOAT should be either float or double, whichever is done faster
+ * by your compiler. (Note that this type is only used in the floating point
+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
+ * Typically, float is faster in ANSI C compilers, while double is faster in
+ * pre-ANSI compilers (because they insist on converting to double anyway).
+ * The code below therefore chooses float if we have ANSI-style prototypes.
+ */
+
+#ifndef FAST_FLOAT
+#ifdef HAVE_PROTOTYPES
+#define FAST_FLOAT float
+#else
+#define FAST_FLOAT double
+#endif
+#endif
+
+#endif /* JPEG_INTERNAL_OPTIONS */
diff --git a/core/include/thirdparties/libjpeg/jpegint.h b/core/include/thirdparties/libjpeg/jpegint.h
new file mode 100644
index 0000000000..685a3610b2
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jpegint.h
@@ -0,0 +1,392 @@
+/*
+ * jpegint.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides common declarations for the various JPEG modules.
+ * These declarations are considered internal to the JPEG library; most
+ * applications using the library shouldn't need to include this file.
+ */
+
+
+/* Declarations for both compression & decompression */
+
+typedef enum { /* Operating modes for buffer controllers */
+ JBUF_PASS_THRU, /* Plain stripwise operation */
+ /* Remaining modes require a full-image buffer to have been created */
+ JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
+ JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
+ JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
+} J_BUF_MODE;
+
+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
+#define CSTATE_START 100 /* after create_compress */
+#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
+#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
+#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
+#define DSTATE_START 200 /* after create_decompress */
+#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
+#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
+#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
+#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
+#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
+#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
+#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
+#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
+#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
+#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
+
+
+/* Declarations for compression modules */
+
+/* Master control module */
+struct jpeg_comp_master {
+ JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean call_pass_startup; /* True if pass_startup must be called */
+ boolean is_last_pass; /* True during last pass */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_c_main_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail));
+};
+
+/* Compression preprocessing (downsampling input buffer control) */
+struct jpeg_c_prep_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf,
+ JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_c_coef_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf));
+};
+
+/* Colorspace conversion */
+struct jpeg_color_converter {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows));
+};
+
+/* Downsampling */
+struct jpeg_downsampler {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, downsample, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf,
+ JDIMENSION out_row_group_index));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Forward DCT (also controls coefficient quantization) */
+struct jpeg_forward_dct {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ /* perhaps this should be an array??? */
+ JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
+ jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks));
+};
+
+/* Entropy encoding */
+struct jpeg_entropy_encoder {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
+ JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+};
+
+/* Marker writing */
+struct jpeg_marker_writer {
+ JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
+ JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
+ /* These routines are exported to allow insertion of extra markers */
+ /* Probably only COM and APPn markers should be written this way */
+ JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
+ unsigned int datalen));
+ JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
+};
+
+
+/* Declarations for decompression modules */
+
+/* Master control module */
+struct jpeg_decomp_master {
+ JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
+};
+
+/* Input control module */
+struct jpeg_input_controller {
+ JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
+ JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean has_multiple_scans; /* True if file has multiple scans */
+ boolean eoi_reached; /* True when EOI has been consumed */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_d_main_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_d_coef_controller {
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE output_buf));
+ /* Pointer to array of coefficient virtual arrays, or NULL if none */
+ jvirt_barray_ptr *coef_arrays;
+};
+
+/* Decompression postprocessing (color quantization buffer control) */
+struct jpeg_d_post_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Marker reading & parsing */
+struct jpeg_marker_reader {
+ JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
+ /* Read markers until SOS or EOI.
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+ JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
+ /* Read a restart marker --- exported for use by entropy decoder only */
+ jpeg_marker_parser_method read_restart_marker;
+
+ /* State of marker reader --- nominally internal, but applications
+ * supplying COM or APPn handlers might like to know the state.
+ */
+ boolean saw_SOI; /* found SOI? */
+ boolean saw_SOF; /* found SOF? */
+ int next_restart_num; /* next restart number expected (0-7) */
+ unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
+};
+
+/* Entropy decoding */
+struct jpeg_entropy_decoder {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+ /* This is here to share code between baseline and progressive decoders; */
+ /* other modules probably should not use it */
+ boolean insufficient_data; /* set TRUE after emitting warning */
+};
+
+/* Inverse DCT (also performs dequantization) */
+typedef JMETHOD(void, inverse_DCT_method_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col));
+
+struct jpeg_inverse_dct {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ /* It is useful to allow each component to have a separate IDCT method. */
+ inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
+};
+
+/* Upsampling (note that upsampler must also call color converter) */
+struct jpeg_upsampler {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, upsample, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Colorspace conversion */
+struct jpeg_color_deconverter {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows));
+};
+
+/* Color quantization or color precision reduction */
+struct jpeg_color_quantizer {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
+ JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPARRAY output_buf,
+ int num_rows));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
+};
+
+
+/* Miscellaneous useful macros */
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+
+/* We assume that right shift corresponds to signed division by 2 with
+ * rounding towards minus infinity. This is correct for typical "arithmetic
+ * shift" instructions that shift in copies of the sign bit. But some
+ * C compilers implement >> with an unsigned shift. For these machines you
+ * must define RIGHT_SHIFT_IS_UNSIGNED.
+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
+ * It is only applied with constant shift counts. SHIFT_TEMPS must be
+ * included in the variables of any routine using RIGHT_SHIFT.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define SHIFT_TEMPS INT32 shift_temp;
+#define RIGHT_SHIFT(x,shft) \
+ ((shift_temp = (x)) < 0 ? \
+ (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
+ (shift_temp >> (shft)))
+#else
+#define SHIFT_TEMPS
+#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_compress_master jICompress
+#define jinit_c_master_control jICMaster
+#define jinit_c_main_controller jICMainC
+#define jinit_c_prep_controller jICPrepC
+#define jinit_c_coef_controller jICCoefC
+#define jinit_color_converter jICColor
+#define jinit_downsampler jIDownsampler
+#define jinit_forward_dct jIFDCT
+#define jinit_huff_encoder jIHEncoder
+#define jinit_phuff_encoder jIPHEncoder
+#define jinit_marker_writer jIMWriter
+#define jinit_master_decompress jIDMaster
+#define jinit_d_main_controller jIDMainC
+#define jinit_d_coef_controller jIDCoefC
+#define jinit_d_post_controller jIDPostC
+#define jinit_input_controller jIInCtlr
+#define jinit_marker_reader jIMReader
+#define jinit_huff_decoder jIHDecoder
+#define jinit_phuff_decoder jIPHDecoder
+#define jinit_inverse_dct jIIDCT
+#define jinit_upsampler jIUpsampler
+#define jinit_color_deconverter jIDColor
+#define jinit_1pass_quantizer jI1Quant
+#define jinit_2pass_quantizer jI2Quant
+#define jinit_merged_upsampler jIMUpsampler
+#define jinit_memory_mgr jIMemMgr
+#define jdiv_round_up jDivRound
+#define jround_up jRound
+#define jcopy_sample_rows jCopySamples
+#define jcopy_block_row jCopyBlocks
+#define jzero_far jZeroFar
+#define jpeg_zigzag_order jZIGTable
+#define jpeg_natural_order jZAGTable
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Compression module initialization routines */
+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
+ boolean transcode_only));
+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
+/* Decompression module initialization routines */
+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
+/* Memory manager initialization */
+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
+
+/* Utility routines in jutils.c */
+EXTERN(long) jdiv_round_up JPP((long a, long b));
+EXTERN(long) jround_up JPP((long a, long b));
+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols));
+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks));
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+/* Constant tables in jutils.c */
+#if 0 /* This table is not actually needed in v6a */
+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
+#endif
+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
+
+/* Suppress undefined-structure complaints if necessary. */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+#endif
+#endif /* INCOMPLETE_TYPES_BROKEN */
diff --git a/core/include/thirdparties/libjpeg/jpeglib.h b/core/include/thirdparties/libjpeg/jpeglib.h
new file mode 100644
index 0000000000..ac2aff90fd
--- /dev/null
+++ b/core/include/thirdparties/libjpeg/jpeglib.h
@@ -0,0 +1,1165 @@
+/*
+ * jpeglib.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the application interface for the JPEG library.
+ * Most applications using the library need only include this file,
+ * and perhaps jerror.h if they want to know the exact error codes.
+ */
+
+#ifndef JPEGLIB_H
+#define JPEGLIB_H
+
+#define FOXIT_PREFIX(origName) FPDFAPIJPEG_##origName
+
+#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)
+#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)
+#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)
+#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)
+#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)
+#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)
+#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)
+#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)
+#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)
+#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)
+#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)
+#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)
+#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)
+#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)
+#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)
+#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)
+#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)
+#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)
+#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)
+#define jpeg_abort FOXIT_PREFIX(jpeg_abort)
+#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)
+#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)
+#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)
+#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)
+#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)
+#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)
+#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)
+#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)
+#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)
+#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)
+#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)
+#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)
+#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)
+#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)
+#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)
+#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)
+#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)
+#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)
+#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)
+#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)
+#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)
+#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)
+#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)
+#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)
+#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)
+#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)
+#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)
+#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)
+#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)
+#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)
+#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)
+#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)
+#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)
+#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)
+#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)
+#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)
+#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)
+#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)
+#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)
+#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)
+#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)
+#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)
+#define jround_up FOXIT_PREFIX(jround_up)
+#define jzero_far FOXIT_PREFIX(jzero_far)
+
+ /*
+ * First we include the configuration files that record how this
+ * installation of the JPEG library is set up. jconfig.h can be
+ * generated automatically for many systems. jmorecfg.h contains
+ * manual configuration options that most people need not worry about.
+ */
+
+#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */
+#include "jconfig.h" /* widely used configuration options */
+#endif
+#include "jmorecfg.h" /* seldom changed options */
+
+
+/* Version ID for the JPEG library.
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
+ */
+
+#define JPEG_LIB_VERSION 62 /* Version 6b */
+
+
+/* Various constants determining the sizes of things.
+ * All of these are specified by the JPEG standard, so don't change them
+ * if you want to be compatible.
+ */
+
+#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
+#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
+#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
+#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
+#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */
+#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
+#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
+ * to handle it. We even let you do this from the jconfig.h file. However,
+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
+ * sometimes emits noncompliant files doesn't mean you should too.
+ */
+#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */
+#ifndef D_MAX_BLOCKS_IN_MCU
+#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */
+#endif
+
+
+/* Data structures for images (arrays of samples and of DCT coefficients).
+ * On 80x86 machines, the image arrays are too big for near pointers,
+ * but the pointer arrays can fit in near memory.
+ */
+
+typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */
+typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
+typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
+
+typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
+typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */
+typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
+typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
+
+typedef JCOEF *JCOEFPTR; /* useful in a couple of places */
+
+
+/* Types for JPEG compression parameters and working tables. */
+
+
+/* DCT coefficient quantization tables. */
+
+typedef struct {
+ /* This array gives the coefficient quantizers in natural array order
+ * (not the zigzag order in which they are stored in a JPEG DQT marker).
+ * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
+ */
+ UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JQUANT_TBL;
+
+
+/* Huffman coding tables. */
+
+typedef struct {
+ /* These two fields directly represent the contents of a JPEG DHT marker */
+ UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
+ /* length k bits; bits[0] is unused */
+ UINT8 huffval[256]; /* The symbols, in order of incr code length */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JHUFF_TBL;
+
+
+/* Basic info about one component (color channel). */
+
+typedef struct {
+ /* These values are fixed over the whole image. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOF marker. */
+ int component_id; /* identifier for this component (0..255) */
+ int component_index; /* its index in SOF or cinfo->comp_info[] */
+ int h_samp_factor; /* horizontal sampling factor (1..4) */
+ int v_samp_factor; /* vertical sampling factor (1..4) */
+ int quant_tbl_no; /* quantization table selector (0..3) */
+ /* These values may vary between scans. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOS marker. */
+ /* The decompressor output side may not use these variables. */
+ int dc_tbl_no; /* DC entropy table selector (0..3) */
+ int ac_tbl_no; /* AC entropy table selector (0..3) */
+
+ /* Remaining fields should be treated as private by applications. */
+
+ /* These values are computed during compression or decompression startup: */
+ /* Component's size in DCT blocks.
+ * Any dummy blocks added to complete an MCU are not counted; therefore
+ * these values do not depend on whether a scan is interleaved or not.
+ */
+ JDIMENSION width_in_blocks;
+ JDIMENSION height_in_blocks;
+ /* Size of a DCT block in samples. Always DCTSIZE for compression.
+ * For decompression this is the size of the output from one DCT block,
+ * reflecting any scaling we choose to apply during the IDCT step.
+ * Values of 1,2,4,8 are likely to be supported. Note that different
+ * components may receive different IDCT scalings.
+ */
+ int DCT_scaled_size;
+ /* The downsampled dimensions are the component's actual, unpadded number
+ * of samples at the main buffer (preprocessing/compression interface), thus
+ * downsampled_width = ceil(image_width * Hi/Hmax)
+ * and similarly for height. For decompression, IDCT scaling is included, so
+ * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
+ */
+ JDIMENSION downsampled_width; /* actual width in samples */
+ JDIMENSION downsampled_height; /* actual height in samples */
+ /* This flag is used only for decompression. In cases where some of the
+ * components will be ignored (eg grayscale output from YCbCr image),
+ * we can skip most computations for the unused components.
+ */
+ boolean component_needed; /* do we need the value of this component? */
+
+ /* These values are computed before starting a scan of the component. */
+ /* The decompressor output side may not use these variables. */
+ int MCU_width; /* number of blocks per MCU, horizontally */
+ int MCU_height; /* number of blocks per MCU, vertically */
+ int MCU_blocks; /* MCU_width * MCU_height */
+ int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */
+ int last_col_width; /* # of non-dummy blocks across in last MCU */
+ int last_row_height; /* # of non-dummy blocks down in last MCU */
+
+ /* Saved quantization table for component; NULL if none yet saved.
+ * See jdinput.c comments about the need for this information.
+ * This field is currently used only for decompression.
+ */
+ JQUANT_TBL * quant_table;
+
+ /* Private per-component storage for DCT or IDCT subsystem. */
+ void * dct_table;
+} jpeg_component_info;
+
+
+/* The script for encoding a multiple-scan file is an array of these: */
+
+typedef struct {
+ int comps_in_scan; /* number of components encoded in this scan */
+ int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
+ int Ss, Se; /* progressive JPEG spectral selection parms */
+ int Ah, Al; /* progressive JPEG successive approx. parms */
+} jpeg_scan_info;
+
+/* The decompressor can save APPn and COM markers in a list of these: */
+
+typedef struct jpeg_marker_struct * jpeg_saved_marker_ptr;
+
+struct jpeg_marker_struct {
+ jpeg_saved_marker_ptr next; /* next in list, or NULL */
+ UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */
+ unsigned int original_length; /* # bytes of data in the file */
+ unsigned int data_length; /* # bytes of data saved at data[] */
+ JOCTET * data; /* the data contained in the marker */
+ /* the marker length word is not counted in data_length or original_length */
+};
+
+/* Known color spaces. */
+
+typedef enum {
+ JCS_UNKNOWN, /* error/unspecified */
+ JCS_GRAYSCALE, /* monochrome */
+ JCS_RGB, /* red/green/blue */
+ JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
+ JCS_CMYK, /* C/M/Y/K */
+ JCS_YCCK /* Y/Cb/Cr/K */
+} J_COLOR_SPACE;
+
+/* DCT/IDCT algorithm options. */
+
+typedef enum {
+ JDCT_ISLOW, /* slow but accurate integer algorithm */
+ JDCT_IFAST, /* faster, less accurate integer method */
+ JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
+} J_DCT_METHOD;
+
+#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
+#define JDCT_DEFAULT JDCT_ISLOW
+#endif
+#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */
+#define JDCT_FASTEST JDCT_IFAST
+#endif
+
+/* Dithering options for decompression. */
+
+typedef enum {
+ JDITHER_NONE, /* no dithering */
+ JDITHER_ORDERED, /* simple ordered dither */
+ JDITHER_FS /* Floyd-Steinberg error diffusion dither */
+} J_DITHER_MODE;
+
+
+/* Common fields between JPEG compression and decompression master structs. */
+
+#define jpeg_common_fields \
+ struct jpeg_error_mgr * err; /* Error handler module */\
+ struct jpeg_memory_mgr * mem; /* Memory manager module */\
+ struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
+ void * client_data; /* Available for use by application */\
+ boolean is_decompressor; /* So common code can tell which is which */\
+ int global_state /* For checking call sequence validity */
+
+/* Routines that are to be used by both halves of the library are declared
+ * to receive a pointer to this structure. There are no actual instances of
+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
+ */
+struct jpeg_common_struct {
+ jpeg_common_fields; /* Fields common to both master struct types */
+ /* Additional fields follow in an actual jpeg_compress_struct or
+ * jpeg_decompress_struct. All three structs must agree on these
+ * initial fields! (This would be a lot cleaner in C++.)
+ */
+};
+
+typedef struct jpeg_common_struct * j_common_ptr;
+typedef struct jpeg_compress_struct * j_compress_ptr;
+typedef struct jpeg_decompress_struct * j_decompress_ptr;
+
+
+/* Master record for a compression instance */
+
+struct jpeg_compress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */
+
+ /* Destination for compressed data */
+ struct jpeg_destination_mgr * dest;
+
+ /* Description of source image --- these fields must be filled in by
+ * outer application before starting compression. in_color_space must
+ * be correct before you can even call jpeg_set_defaults().
+ */
+
+ JDIMENSION image_width; /* input image width */
+ JDIMENSION image_height; /* input image height */
+ int input_components; /* # of color components in input image */
+ J_COLOR_SPACE in_color_space; /* colorspace of input image */
+
+ double input_gamma; /* image gamma of input image */
+
+ /* Compression parameters --- these fields must be set before calling
+ * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to
+ * initialize everything to reasonable defaults, then changing anything
+ * the application specifically wants to change. That way you won't get
+ * burnt when new parameters are added. Also note that there are several
+ * helper routines to simplify changing parameters.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ int num_scans; /* # of entries in scan_info array */
+ const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
+ /* The default value of scan_info is NULL, which causes a single-scan
+ * sequential JPEG file to be emitted. To create a multi-scan file,
+ * set num_scans and scan_info to point to an array of scan definitions.
+ */
+
+ boolean raw_data_in; /* TRUE=caller supplies downsampled data */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+ boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+ int smoothing_factor; /* 1..100, or 0 for no input smoothing */
+ J_DCT_METHOD dct_method; /* DCT algorithm selector */
+
+ /* The restart interval can be specified in absolute MCUs by setting
+ * restart_interval, or in MCU rows by setting restart_in_rows
+ * (in which case the correct restart_interval will be figured
+ * for each scan).
+ */
+ unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
+ int restart_in_rows; /* if > 0, MCU rows per restart interval */
+
+ /* Parameters controlling emission of special markers. */
+
+ boolean write_JFIF_header; /* should a JFIF marker be written? */
+ UINT8 JFIF_major_version; /* What to write for the JFIF version number */
+ UINT8 JFIF_minor_version;
+ /* These three values are not used by the JPEG code, merely copied */
+ /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
+ /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
+ /* ratio is defined by X_density/Y_density even when density_unit=0. */
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean write_Adobe_marker; /* should an Adobe marker be written? */
+
+ /* State variable: index of next scanline to be written to
+ * jpeg_write_scanlines(). Application may use this to control its
+ * processing loop, e.g., "while (next_scanline < image_height)".
+ */
+
+ JDIMENSION next_scanline; /* 0 .. image_height-1 */
+
+ /* Remaining fields are known throughout compressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during compression startup
+ */
+ boolean progressive_mode; /* TRUE if scan script uses progressive mode */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */
+ /* The coefficient controller receives data in units of MCU rows as defined
+ * for fully interleaved scans (whether the JPEG file is interleaved or not).
+ * There are v_samp_factor * DCTSIZE sample rows of each component in an
+ * "iMCU" (interleaved MCU) row.
+ */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[C_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /*
+ * Links to compression subobjects (methods and private variables of modules)
+ */
+ struct jpeg_comp_master * master;
+ struct jpeg_c_main_controller * main;
+ struct jpeg_c_prep_controller * prep;
+ struct jpeg_c_coef_controller * coef;
+ struct jpeg_marker_writer * marker;
+ struct jpeg_color_converter * cconvert;
+ struct jpeg_downsampler * downsample;
+ struct jpeg_forward_dct * fdct;
+ struct jpeg_entropy_encoder * entropy;
+ jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
+ int script_space_size;
+};
+
+
+/* Master record for a decompression instance */
+
+struct jpeg_decompress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
+
+ /* Source of compressed data */
+ struct jpeg_source_mgr * src;
+
+ /* Basic description of image --- filled in by jpeg_read_header(). */
+ /* Application may inspect these values to decide how to process image. */
+
+ JDIMENSION image_width; /* nominal image width (from SOF marker) */
+ JDIMENSION image_height; /* nominal image height */
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ /* Decompression processing parameters --- these fields must be set before
+ * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
+ * them to default values.
+ */
+
+ J_COLOR_SPACE out_color_space; /* colorspace for output */
+
+ unsigned int scale_num, scale_denom; /* fraction by which to scale image */
+
+ double output_gamma; /* image gamma wanted in output */
+
+ boolean buffered_image; /* TRUE=multiple output passes */
+ boolean raw_data_out; /* TRUE=downsampled data wanted */
+
+ J_DCT_METHOD dct_method; /* IDCT algorithm selector */
+ boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */
+ boolean do_block_smoothing; /* TRUE=apply interblock smoothing */
+
+ boolean quantize_colors; /* TRUE=colormapped output wanted */
+ /* the following are ignored if not quantize_colors: */
+ J_DITHER_MODE dither_mode; /* type of color dithering to use */
+ boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
+ int desired_number_of_colors; /* max # colors to use in created colormap */
+ /* these are significant only in buffered-image mode: */
+ boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
+ boolean enable_external_quant;/* enable future use of external colormap */
+ boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
+
+ /* Description of actual output image that will be returned to application.
+ * These fields are computed by jpeg_start_decompress().
+ * You can also use jpeg_calc_output_dimensions() to determine these values
+ * in advance of calling jpeg_start_decompress().
+ */
+
+ JDIMENSION output_width; /* scaled image width */
+ JDIMENSION output_height; /* scaled image height */
+ int out_color_components; /* # of color components in out_color_space */
+ int output_components; /* # of color components returned */
+ /* output_components is 1 (a colormap index) when quantizing colors;
+ * otherwise it equals out_color_components.
+ */
+ int rec_outbuf_height; /* min recommended height of scanline buffer */
+ /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
+ * high, space and time will be wasted due to unnecessary data copying.
+ * Usually rec_outbuf_height will be 1 or 2, at most 4.
+ */
+
+ /* When quantizing colors, the output colormap is described by these fields.
+ * The application can supply a colormap by setting colormap non-NULL before
+ * calling jpeg_start_decompress; otherwise a colormap is created during
+ * jpeg_start_decompress or jpeg_start_output.
+ * The map has out_color_components rows and actual_number_of_colors columns.
+ */
+ int actual_number_of_colors; /* number of entries in use */
+ JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
+
+ /* State variables: these variables indicate the progress of decompression.
+ * The application may examine these but must not modify them.
+ */
+
+ /* Row index of next scanline to be read from jpeg_read_scanlines().
+ * Application may use this to control its processing loop, e.g.,
+ * "while (output_scanline < output_height)".
+ */
+ JDIMENSION output_scanline; /* 0 .. output_height-1 */
+
+ /* Current input scan number and number of iMCU rows completed in scan.
+ * These indicate the progress of the decompressor input side.
+ */
+ int input_scan_number; /* Number of SOS markers seen so far */
+ JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
+
+ /* The "output scan number" is the notional scan being displayed by the
+ * output side. The decompressor will not allow output scan/row number
+ * to get ahead of input scan/row, but it can fall arbitrarily far behind.
+ */
+ int output_scan_number; /* Nominal scan number being displayed */
+ JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
+
+ /* Current progression status. coef_bits[c][i] indicates the precision
+ * with which component c's DCT coefficient i (in zigzag order) is known.
+ * It is -1 when no data has yet been received, otherwise it is the point
+ * transform (shift) value for the most recent scan of the coefficient
+ * (thus, 0 at completion of the progression).
+ * This pointer is NULL when reading a non-progressive file.
+ */
+ int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
+
+ /* Internal JPEG parameters --- the application usually need not look at
+ * these fields. Note that the decompressor output side may not use
+ * any parameters that can change between scans.
+ */
+
+ /* Quantization and Huffman tables are carried forward across input
+ * datastreams when processing abbreviated JPEG datastreams.
+ */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ /* These parameters are never carried across datastreams, since they
+ * are given in SOF/SOS markers or defined to be reset by SOI.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
+
+ /* These fields record data obtained from optional markers recognized by
+ * the JPEG library.
+ */
+ boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
+ /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
+ UINT8 JFIF_major_version; /* JFIF version number */
+ UINT8 JFIF_minor_version;
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
+ UINT8 Adobe_transform; /* Color transform code from Adobe marker */
+
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+
+ /* Aside from the specific data retained from APPn markers known to the
+ * library, the uninterpreted contents of any or all APPn and COM markers
+ * can be saved in a list for examination by the application.
+ */
+ jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
+
+ /* Remaining fields are known throughout decompressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during decompression startup
+ */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
+ /* The coefficient controller's input and output progress is measured in
+ * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
+ * in fully interleaved JPEG scans, but are used whether the scan is
+ * interleaved or not. We define an iMCU row as v_samp_factor DCT block
+ * rows of each component. Therefore, the IDCT output contains
+ * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
+ */
+
+ JSAMPLE * sample_range_limit; /* table for fast range-limiting */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ * Note that the decompressor output side must not use these fields.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[D_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /* This field is shared between entropy decoder and marker parser.
+ * It is either zero or the code of a JPEG marker that has been
+ * read from the data source, but has not yet been processed.
+ */
+ int unread_marker;
+
+ /*
+ * Links to decompression subobjects (methods, private variables of modules)
+ */
+ struct jpeg_decomp_master * master;
+ struct jpeg_d_main_controller * main;
+ struct jpeg_d_coef_controller * coef;
+ struct jpeg_d_post_controller * post;
+ struct jpeg_input_controller * inputctl;
+ struct jpeg_marker_reader * marker;
+ struct jpeg_entropy_decoder * entropy;
+ struct jpeg_inverse_dct * idct;
+ struct jpeg_upsampler * upsample;
+ struct jpeg_color_deconverter * cconvert;
+ struct jpeg_color_quantizer * cquantize;
+};
+
+
+/* "Object" declarations for JPEG modules that may be supplied or called
+ * directly by the surrounding application.
+ * As with all objects in the JPEG library, these structs only define the
+ * publicly visible methods and state variables of a module. Additional
+ * private fields may exist after the public ones.
+ */
+
+
+/* Error handler object */
+
+struct jpeg_error_mgr {
+ /* Error exit handler: does not return to caller */
+ JMETHOD(void, error_exit, (j_common_ptr cinfo));
+ /* Conditionally emit a trace or warning message */
+ JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
+ /* Routine that actually outputs a trace or error message */
+ JMETHOD(void, output_message, (j_common_ptr cinfo));
+ /* Format a message string for the most recent JPEG error or message */
+ JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
+#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
+ /* Reset error state variables at start of a new image */
+ JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
+
+ /* The message ID code and any parameters are saved here.
+ * A message can have one string parameter or up to 8 int parameters.
+ */
+ int msg_code;
+#define JMSG_STR_PARM_MAX 80
+ union {
+ int i[8];
+ char s[JMSG_STR_PARM_MAX];
+ } msg_parm;
+
+ /* Standard state variables for error facility */
+
+ int trace_level; /* max msg_level that will be displayed */
+
+ /* For recoverable corrupt-data errors, we emit a warning message,
+ * but keep going unless emit_message chooses to abort. emit_message
+ * should count warnings in num_warnings. The surrounding application
+ * can check for bad data by seeing if num_warnings is nonzero at the
+ * end of processing.
+ */
+ long num_warnings; /* number of corrupt-data warnings */
+
+ /* These fields point to the table(s) of error message strings.
+ * An application can change the table pointer to switch to a different
+ * message list (typically, to change the language in which errors are
+ * reported). Some applications may wish to add additional error codes
+ * that will be handled by the JPEG library error mechanism; the second
+ * table pointer is used for this purpose.
+ *
+ * First table includes all errors generated by JPEG library itself.
+ * Error code 0 is reserved for a "no such error string" message.
+ */
+ const char * const * jpeg_message_table; /* Library errors */
+ int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
+ /* Second table can be added by application (see cjpeg/djpeg for example).
+ * It contains strings numbered first_addon_message..last_addon_message.
+ */
+ const char * const * addon_message_table; /* Non-library errors */
+ int first_addon_message; /* code for first string in addon table */
+ int last_addon_message; /* code for last string in addon table */
+};
+
+
+/* Progress monitor object */
+
+struct jpeg_progress_mgr {
+ JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
+
+ long pass_counter; /* work units completed in this pass */
+ long pass_limit; /* total number of work units in this pass */
+ int completed_passes; /* passes completed so far */
+ int total_passes; /* total number of passes expected */
+};
+
+
+/* Data destination object for compression */
+
+struct jpeg_destination_mgr {
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+
+ JMETHOD(void, init_destination, (j_compress_ptr cinfo));
+ JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
+ JMETHOD(void, term_destination, (j_compress_ptr cinfo));
+};
+
+
+/* Data source object for decompression */
+
+struct jpeg_source_mgr {
+ const JOCTET * next_input_byte; /* => next byte to read from buffer */
+ size_t bytes_in_buffer; /* # of bytes remaining in buffer */
+
+ JMETHOD(void, init_source, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
+ JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
+ JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
+ JMETHOD(void, term_source, (j_decompress_ptr cinfo));
+};
+
+
+/* Memory manager object.
+ * Allocates "small" objects (a few K total), "large" objects (tens of K),
+ * and "really big" objects (virtual arrays with backing store if needed).
+ * The memory manager does not allow individual objects to be freed; rather,
+ * each created object is assigned to a pool, and whole pools can be freed
+ * at once. This is faster and more convenient than remembering exactly what
+ * to free, especially where malloc()/free() are not too speedy.
+ * NB: alloc routines never return NULL. They exit to error_exit if not
+ * successful.
+ */
+
+#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */
+#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */
+#define JPOOL_NUMPOOLS 2
+
+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
+typedef struct jvirt_barray_control * jvirt_barray_ptr;
+
+
+struct jpeg_memory_mgr {
+ /* Method pointers */
+ JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(void *, alloc_large, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows));
+ JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows));
+ JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
+ JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
+ jvirt_sarray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
+ jvirt_barray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
+ JMETHOD(void, self_destruct, (j_common_ptr cinfo));
+
+ /* Limit on memory allocation for this JPEG object. (Note that this is
+ * merely advisory, not a guaranteed maximum; it only affects the space
+ * used for virtual-array buffers.) May be changed by outer application
+ * after creating the JPEG object.
+ */
+ long max_memory_to_use;
+
+ /* Maximum allocation request accepted by alloc_large. */
+ long max_alloc_chunk;
+};
+
+
+/* Routine signature for application-supplied marker processing methods.
+ * Need not pass marker code since it is stored in cinfo->unread_marker.
+ */
+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
+
+
+/* Declarations for routines called by application.
+ * The JPP macro hides prototype parameters from compilers that can't cope.
+ * Note JPP requires double parentheses.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JPP(arglist) arglist
+#else
+#define JPP(arglist) ()
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers.
+ * We shorten external names to be unique in the first six letters, which
+ * is good enough for all known systems.
+ * (If your compiler itself needs names to be unique in less than 15
+ * characters, you are out of luck. Get a better compiler.)
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_error jStdError
+#define jpeg_CreateCompress jCreaCompress
+#define jpeg_CreateDecompress jCreaDecompress
+#define jpeg_destroy_compress jDestCompress
+#define jpeg_destroy_decompress jDestDecompress
+#define jpeg_stdio_dest jStdDest
+#define jpeg_stdio_src jStdSrc
+#define jpeg_set_defaults jSetDefaults
+#define jpeg_set_colorspace jSetColorspace
+#define jpeg_default_colorspace jDefColorspace
+#define jpeg_set_quality jSetQuality
+#define jpeg_set_linear_quality jSetLQuality
+#define jpeg_add_quant_table jAddQuantTable
+#define jpeg_quality_scaling jQualityScaling
+#define jpeg_simple_progression jSimProgress
+#define jpeg_suppress_tables jSuppressTables
+#define jpeg_alloc_quant_table jAlcQTable
+#define jpeg_alloc_huff_table jAlcHTable
+#define jpeg_start_compress jStrtCompress
+#define jpeg_write_scanlines jWrtScanlines
+#define jpeg_finish_compress jFinCompress
+#define jpeg_write_raw_data jWrtRawData
+#define jpeg_write_marker jWrtMarker
+#define jpeg_write_m_header jWrtMHeader
+#define jpeg_write_m_byte jWrtMByte
+#define jpeg_write_tables jWrtTables
+#define jpeg_read_header jReadHeader
+#define jpeg_start_decompress jStrtDecompress
+#define jpeg_read_scanlines jReadScanlines
+#define jpeg_finish_decompress jFinDecompress
+#define jpeg_read_raw_data jReadRawData
+#define jpeg_has_multiple_scans jHasMultScn
+#define jpeg_start_output jStrtOutput
+#define jpeg_finish_output jFinOutput
+#define jpeg_input_complete jInComplete
+#define jpeg_new_colormap jNewCMap
+#define jpeg_consume_input jConsumeInput
+#define jpeg_calc_output_dimensions jCalcDimensions
+#define jpeg_save_markers jSaveMarkers
+#define jpeg_set_marker_processor jSetMarker
+#define jpeg_read_coefficients jReadCoefs
+#define jpeg_write_coefficients jWrtCoefs
+#define jpeg_copy_critical_parameters jCopyCrit
+#define jpeg_abort_compress jAbrtCompress
+#define jpeg_abort_decompress jAbrtDecompress
+#define jpeg_abort jAbort
+#define jpeg_destroy jDestroy
+#define jpeg_resync_to_restart jResyncRestart
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Default error-management setup */
+EXTERN(struct jpeg_error_mgr *) jpeg_std_error
+ JPP((struct jpeg_error_mgr * err));
+
+/* Initialization of JPEG compression objects.
+ * jpeg_create_compress() and jpeg_create_decompress() are the exported
+ * names that applications should call. These expand to calls on
+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
+ * passed for version mismatch checking.
+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
+ */
+#define jpeg_create_compress(cinfo) \
+ jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_compress_struct))
+#define jpeg_create_decompress(cinfo) \
+ jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_decompress_struct))
+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
+ int version, size_t structsize));
+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
+ int version, size_t structsize));
+/* Destruction of JPEG compression objects */
+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
+
+#if 0
+/* Standard data source and destination managers: stdio streams. */
+/* Caller is responsible for opening the file before and closing after. */
+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));
+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
+#endif
+
+/* Default parameter setup for compression */
+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
+/* Compression parameter setup aids */
+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
+ J_COLOR_SPACE colorspace));
+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
+ boolean force_baseline));
+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
+ const unsigned int *basic_table,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(int) jpeg_quality_scaling JPP((int quality));
+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
+ boolean suppress));
+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
+
+/* Main entry points for compression */
+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
+ boolean write_all_tables));
+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION num_lines));
+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
+
+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION num_lines));
+
+/* Write a special marker. See libjpeg.doc concerning safe usage. */
+EXTERN(void) jpeg_write_marker
+ JPP((j_compress_ptr cinfo, int marker,
+ const JOCTET * dataptr, unsigned int datalen));
+/* Same, but piecemeal. */
+EXTERN(void) jpeg_write_m_header
+ JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
+EXTERN(void) jpeg_write_m_byte
+ JPP((j_compress_ptr cinfo, int val));
+
+/* Alternate compression function: just write an abbreviated table file */
+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
+
+/* Decompression startup: read start of JPEG datastream to see what's there */
+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
+ boolean require_image));
+/* Return value is one of: */
+#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */
+#define JPEG_HEADER_OK 1 /* Found valid image datastream */
+#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
+/* If you pass require_image = TRUE (normal case), you need not check for
+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
+ * JPEG_SUSPENDED is only possible if you use a data source module that can
+ * give a suspension return (the stdio source module doesn't).
+ */
+
+/* Main entry points for decompression */
+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION max_lines));
+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
+
+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION max_lines));
+
+/* Additional entry points for buffered-image mode. */
+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
+ int scan_number));
+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
+/* Return value is one of: */
+/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */
+#define JPEG_REACHED_SOS 1 /* Reached start of new scan */
+#define JPEG_REACHED_EOI 2 /* Reached end of image */
+#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */
+#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
+
+/* Precalculate output dimensions for current decompression parameters. */
+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
+
+/* Control saving of COM and APPn markers into marker_list. */
+EXTERN(void) jpeg_save_markers
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ unsigned int length_limit));
+
+/* Install a special processing method for COM or APPn markers. */
+EXTERN(void) jpeg_set_marker_processor
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ jpeg_marker_parser_method routine));
+
+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays));
+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
+ j_compress_ptr dstinfo));
+
+/* If you choose to abort compression or decompression before completing
+ * jpeg_finish_(de)compress, then you need to clean up to release memory,
+ * temporary files, etc. You can just call jpeg_destroy_(de)compress
+ * if you're done with the JPEG object, but if you want to clean it up and
+ * reuse it, call this:
+ */
+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
+
+/* Generic versions of jpeg_abort and jpeg_destroy that work on either
+ * flavor of JPEG object. These may be more convenient in some places.
+ */
+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
+
+/* Default restart-marker-resync procedure for use by data source modules */
+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
+ int desired));
+
+
+/* These marker codes are exported since applications and data source modules
+ * are likely to want to use them.
+ */
+
+#define JPEG_RST0 0xD0 /* RST0 marker code */
+#define JPEG_EOI 0xD9 /* EOI marker code */
+#define JPEG_APP0 0xE0 /* APP0 marker code */
+#define JPEG_COM 0xFE /* COM marker code */
+
+
+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
+ * for structure definitions that are never filled in, keep it quiet by
+ * supplying dummy definitions for the various substructures.
+ */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+struct jpeg_comp_master { long dummy; };
+struct jpeg_c_main_controller { long dummy; };
+struct jpeg_c_prep_controller { long dummy; };
+struct jpeg_c_coef_controller { long dummy; };
+struct jpeg_marker_writer { long dummy; };
+struct jpeg_color_converter { long dummy; };
+struct jpeg_downsampler { long dummy; };
+struct jpeg_forward_dct { long dummy; };
+struct jpeg_entropy_encoder { long dummy; };
+struct jpeg_decomp_master { long dummy; };
+struct jpeg_d_main_controller { long dummy; };
+struct jpeg_d_coef_controller { long dummy; };
+struct jpeg_d_post_controller { long dummy; };
+struct jpeg_input_controller { long dummy; };
+struct jpeg_marker_reader { long dummy; };
+struct jpeg_entropy_decoder { long dummy; };
+struct jpeg_inverse_dct { long dummy; };
+struct jpeg_upsampler { long dummy; };
+struct jpeg_color_deconverter { long dummy; };
+struct jpeg_color_quantizer { long dummy; };
+#endif /* JPEG_INTERNALS */
+#endif /* INCOMPLETE_TYPES_BROKEN */
+
+
+/*
+ * The JPEG library modules define JPEG_INTERNALS before including this file.
+ * The internal structure declarations are read only when that is true.
+ * Applications using the library should not include jpegint.h, but may wish
+ * to include jerror.h.
+ */
+
+#ifdef JPEG_INTERNALS
+#include "jpegint.h" /* fetch private declarations */
+#include "jerror.h" /* fetch error codes too */
+#endif
+
+#endif /* JPEGLIB_H */
diff --git a/core/include/thirdparties/zlib/zconf.h b/core/include/thirdparties/zlib/zconf.h
new file mode 100644
index 0000000000..3a1f9696fc
--- /dev/null
+++ b/core/include/thirdparties/zlib/zconf.h
@@ -0,0 +1,519 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
+# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
+# define deflateEnd z_deflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateInit_ z_deflateInit_
+# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
+# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzvprintf z_gzvprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetHeader z_inflateGetHeader
+# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateGetDictionary z_inflateGetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateUndermine z_inflateUndermine
+# define inflateResetKeep z_inflateResetKeep
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# endif
+# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
+# define alloc_func z_alloc_func
+# define charf z_charf
+# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
+# define in_func z_in_func
+# define intf z_intf
+# define out_func z_out_func
+# define uInt z_uInt
+# define uIntf z_uIntf
+# define uLong z_uLong
+# define uLongf z_uLongf
+# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+#endif /* 0 */
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+#endif /* 0 */
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+#endif /* 0 */
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif /* 0 */
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/core/include/thirdparties/zlib/zlib.h b/core/include/thirdparties/zlib/zlib.h
new file mode 100644
index 0000000000..5e068c4a37
--- /dev/null
+++ b/core/include/thirdparties/zlib/zlib.h
@@ -0,0 +1,1828 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.8, April 28th, 2013
+
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#define deflate_copyright FPDFAPI_deflate_copyright
+#define adler32 FPDFAPI_adler32
+#define compress2 FPDFAPI_compress2
+#define compress FPDFAPI_compress
+#define compressBound FPDFAPI_compressBound
+#define get_crc_table FPDFAPI_get_crc_table
+#define crc32 FPDFAPI_crc32
+#define deflateInit_ FPDFAPI_deflateInit_
+#define deflateInit2_ FPDFAPI_deflateInit2_
+#define deflateSetDictionary FPDFAPI_deflateSetDictionary
+#define deflateReset FPDFAPI_deflateReset
+#define deflatePrime FPDFAPI_deflatePrime
+#define deflateParams FPDFAPI_deflateParams
+#define deflateBound FPDFAPI_deflateBound
+#define deflateSetHeader FPDFAPI_deflateSetHeader
+#define deflateTune FPDFAPI_deflateTune
+#define deflate FPDFAPI_deflate
+#define deflateEnd FPDFAPI_deflateEnd
+#define deflateCopy FPDFAPI_deflateCopy
+#define inflateBackInit_ FPDFAPI_inflateBackInit_
+#define inflateBack FPDFAPI_inflateBack
+#define inflateBackEnd FPDFAPI_inflateBackEnd
+#define inflateReset FPDFAPI_inflateReset
+#define inflateInit2_ FPDFAPI_inflateInit2_
+#define inflateInit_ FPDFAPI_inflateInit_
+#define inflate FPDFAPI_inflate
+#define inflateEnd FPDFAPI_inflateEnd
+#define inflateSetDictionary FPDFAPI_inflateSetDictionary
+#define inflateSync FPDFAPI_inflateSync
+#define inflateSyncPoint FPDFAPI_inflateSyncPoint
+#define inflateCopy FPDFAPI_inflateCopy
+#define uncompress FPDFAPI_uncompress
+#define zlibVersion FPDFAPI_zlibVersion
+#define zlibCompileFlags FPDFAPI_zlibCompileFlags
+#define zError FPDFAPI_zError
+#define z_errmsg FPDFAPI_z_errmsg
+#define zcfree FPDFAPI_zcfree
+#define zcalloc FPDFAPI_zcalloc
+#define inflate_fast FPDFAPI_inflate_fast
+#define inflate_table FPDFAPI_inflate_table
+#define inflate_copyright FPDFAPI_inflate_copyright
+#define _length_code FPDFAPI_length_code
+#define _tr_flush_block FPDFAPI_tr_flush_block
+#define _dist_code FPDFAPI_dist_code
+#define _tr_stored_block FPDFAPI_tr_stored_block
+#define _tr_init FPDFAPI_tr_init
+#define _tr_align FPDFAPI_tr_align
+#define _tr_tally FPDFAPI_tr_tally
+#define adler32_combine FPDFAPI_adler32_combine
+#define inflatePrime FPDFAPI_inflatePrime
+#define inflateGetHeader FPDFAPI_inflateGetHeader
+#define crc32_combine FPDFAPI_crc32_combine
+#define inflateReset2 FPDFAPI_inflateReset2
+#define inflateUndermine FPDFAPI_inflateUndermine
+#define inflateMark FPDFAPI_inflateMark
+#define adler32_combine64 FPDFAPI_adler32_combine64
+
+#include "zconf.h"
+
+/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */
+#define NO_GZIP /* XYQ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.8"
+#define ZLIB_VERNUM 0x1280
+#define ZLIB_VER_MAJOR 1
+#define ZLIB_VER_MINOR 2
+#define ZLIB_VER_REVISION 8
+#define ZLIB_VER_SUBREVISION 0
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed data.
+ This version of the library supports only one compression method (deflation)
+ but other algorithms will be added later and will have the same stream
+ interface.
+
+ Compression can be done in a single step if the buffers are large enough,
+ or can be done by repeated calls of the compression function. In the latter
+ case, the application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never crash
+ even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ z_const Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total number of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total number of bytes output so far */
+
+ z_const char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has dropped
+ to zero. It must update next_out and avail_out when avail_out has dropped
+ to zero. The application must initialize zalloc, zfree and opaque before
+ calling the init function. All other fields are set by the compression
+ library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this if
+ the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers
+ returned by zalloc for objects of exactly 65536 bytes *must* have their
+ offset normalized to zero. The default allocation function provided by this
+ library ensures this (see zutil.c). To reduce memory requirements and avoid
+ any allocation of 64K objects, at the expense of compression ratio, compile
+ the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or progress
+ reports. After compression, total_in holds the total size of the
+ uncompressed data and may be saved for use in the decompressor (particularly
+ if the decompressor wants to decompress everything in a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+#define Z_TREES 6
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is not
+ compatible with the zlib.h header file used by the application. This check
+ is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller. If
+ zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
+ allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at all
+ (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION
+ requests a default compromise between speed and compression (currently
+ equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if level is not a valid compression level, or
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION). msg is set to null
+ if there is no error message. deflateInit does not perform any compression:
+ this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications). Some
+ output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating avail_in or avail_out accordingly; avail_out should
+ never be zero before the call. The application can consume the compressed
+ output when it wants, for example when the output buffer is full (avail_out
+ == 0), or after each call of deflate(). If deflate returns Z_OK and with
+ zero avail_out, it must be called again after making room in the output
+ buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumulate before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In
+ particular avail_in is zero after the call if enough output space has been
+ provided before the call.) Flushing may degrade compression for some
+ compression algorithms and so it should be used only when necessary. This
+ completes the current deflate block and follows it with an empty stored block
+ that is three bits plus filler bits to the next byte, followed by four bytes
+ (00 00 ff ff).
+
+ If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the
+ output buffer, but the output is not aligned to a byte boundary. All of the
+ input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.
+ This completes the current deflate block and follows it with an empty fixed
+ codes block that is 10 bits long. This assures that enough bytes are output
+ in order for the decompressor to finish the block before the empty fixed code
+ block.
+
+ If flush is set to Z_BLOCK, a deflate block is completed and emitted, as
+ for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to
+ seven bits of the current block are held to be written as the next byte after
+ the next deflate block is completed. In this case, the decompressor may not
+ be provided enough bits at this point in order to complete decompression of
+ the data provided so far to the compressor. It may need to wait for the next
+ block to be emitted. This is for advanced applications that need to control
+ the emission of deflate blocks.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there was
+ enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the stream
+ are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least the
+ value returned by deflateBound (see below). Then deflate is guaranteed to
+ return Z_STREAM_END. If not enough output space is provided, deflate will
+ not return Z_STREAM_END, and it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect the
+ compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case, msg
+ may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the
+ exact value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit() does not process any header information -- that is deferred
+ until inflate() is called.
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing will
+ resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there is
+ no more input data or no more space in the output buffer (see below about
+ the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating the next_* and avail_* values accordingly. The
+ application can consume the uncompressed output when it wants, for example
+ when the output buffer is full (avail_out == 0), or after each call of
+ inflate(). If inflate returns Z_OK and with zero avail_out, it must be
+ called again after making room in the output buffer because there might be
+ more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,
+ Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate()
+ stop if and when it gets to the next deflate block boundary. When decoding
+ the zlib or gzip format, this will cause inflate() to return immediately
+ after the header and before the first block. When doing a raw inflate,
+ inflate() will go ahead and process the first block, and will return when it
+ gets to the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64 if
+ inflate() is currently decoding the last block in the deflate stream, plus
+ 128 if inflate() returned immediately after decoding an end-of-block code or
+ decoding the complete header up to just before the first byte of the deflate
+ stream. The end-of-block will not be indicated until all of the uncompressed
+ data from that block has been written to strm->next_out. The number of
+ unused bits may in general be greater than seven, except when bit 7 of
+ data_type is set, in which case the number of unused bits will be less than
+ eight. data_type is set as noted here every time inflate() returns for all
+ flush options, and so can be used to determine the amount of currently
+ consumed input in bits.
+
+ The Z_TREES option behaves as Z_BLOCK does, but it also returns when the
+ end of each deflate block header is reached, before any actual data in that
+ block is decoded. This allows the caller to determine the length of the
+ deflate block header for later use in random access within a deflate block.
+ 256 is added to the value of strm->data_type when inflate() returns
+ immediately after reaching the end of the deflate block header.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step (a
+ single call of inflate), the parameter flush should be set to Z_FINISH. In
+ this case all pending input is processed and all pending output is flushed;
+ avail_out must be large enough to hold all of the uncompressed data for the
+ operation to complete. (The size of the uncompressed data may have been
+ saved by the compressor for this purpose.) The use of Z_FINISH is not
+ required to perform an inflation in one step. However it may be used to
+ inform inflate that a faster approach can be used for the single inflate()
+ call. Z_FINISH also informs inflate to not maintain a sliding window if the
+ stream completes, which reduces inflate's memory footprint. If the stream
+ does not complete, either because not all of the stream is provided or not
+ enough output space is provided, then a sliding window will be allocated and
+ inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+ been used.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the effects of the flush parameter in this implementation are
+ on the return value of inflate() as noted below, when inflate() returns early
+ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+ memory for a sliding window when Z_FINISH is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the Adler-32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() can decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically, if requested when
+ initializing with inflateInit2(). Any information contained in the gzip
+ header is not retained, so applications that need that information should
+ instead use raw inflate, see inflateInit2() below, or inflateBack() and
+ perform their own processing of the gzip header and trailer. When processing
+ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+ producted so far. The CRC-32 is checked against the gzip trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may
+ then call inflateSync() to look for a good compression block if a partial
+ recovery of the data is desired.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by the
+ caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero), no
+ header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but is
+ slow and reduces compression ratio; memLevel=9 uses maximum memory for
+ optimal speed. The default value is 8. See zconf.h for total memory usage
+ as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as
+ fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The
+ strategy parameter only affects the compression ratio but not the
+ correctness of the compressed output even if it is not set appropriately.
+ Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
+ decoder for special applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
+ method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is
+ incompatible with the version assumed by the caller (ZLIB_VERSION). msg is
+ set to null if there is no error message. deflateInit2 does not perform any
+ compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. When using the zlib format, this
+ function must be called immediately after deflateInit, deflateInit2 or
+ deflateReset, and before any call of deflate. When doing raw deflate, this
+ function must be called either before any call of deflate, or immediately
+ after the completion of a deflate block, i.e. after all input has been
+ consumed and all output has been delivered when using any of the flush
+ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The
+ compressor and decompressor must use exactly the same dictionary (see
+ inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size
+ provided in deflateInit or deflateInit2. Thus the strings most likely to be
+ useful should be put at the end of the dictionary, not at the front. In
+ addition, the current implementation of deflate will use at most the window
+ size minus 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if not at a block boundary for raw deflate). deflateSetDictionary does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and can
+ consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state. The
+ stream will keep the same compression level and any other attributes that
+ may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different strategy.
+ If the compression level is changed, the input available so far is
+ compressed with the old level (and may be flushed); the new level will take
+ effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to be
+ compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if
+ strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit() or
+ deflateInit2(), and after deflateSetHeader(), if used. This would be used
+ to allocate an output buffer for deflation in a single pass, and so would be
+ called before deflate(). If that first deflate() call is provided the
+ sourceLen input bytes, an output buffer allocated to the size returned by
+ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+ to return Z_STREAM_END. Note that it is possible for the compressed size to
+ be larger than the value returned by deflateBound() if flush options other
+ than Z_FINISH or Z_NO_FLUSH are used.
+*/
+
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+ unsigned *pending,
+ int *bits));
+/*
+ deflatePending() returns the number of bytes and bits of output that have
+ been generated, but not yet provided in the available output. The bytes not
+ provided would be due to the available output space having being consumed.
+ The number of bits of output not provided are between 0 and 7, where they
+ await more bits to join them in order to fill out a full byte. If pending
+ or bits are Z_NULL, then those values are not set.
+
+ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+ */
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the bits
+ leftover from a previous deflate stream when appending to it. As such, this
+ function can only be used for raw deflate, and must be used before the first
+ deflate() call after a deflateInit2() or deflateReset(). bits must be less
+ than or equal to 16, and that many of the least significant bits of value
+ will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be zero to request that inflate use the window size in
+ the zlib header of the compressed stream.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
+ crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit2 does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit2() does not process any header information -- that is
+ deferred until inflate() is called.
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called at any
+ time to set the dictionary. If the provided dictionary is smaller than the
+ window and there is already data in the window, then the provided dictionary
+ will amend what's there. The application must insure that the dictionary
+ that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by inflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If inflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a possible full flush point (see above
+ for the description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+ All full flush points have this pattern, but not all occurrences of this
+ pattern are full flush points.
+
+ inflateSync returns Z_OK if a possible full flush point has been found,
+ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+ In the success case, the application may save the current current value of
+ total_in which indicates where valid compressed data was found. In the
+ error case, the application may repeatedly call inflateSync, providing more
+ input each time, until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state. The
+ stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
+ int windowBits));
+/*
+ This function is the same as inflateReset, but it also permits changing
+ the wrap and window size requests. The windowBits parameter is interpreted
+ the same as it is for inflateInit2.
+
+ inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL), or if
+ the windowBits parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ If bits is negative, then the input stream bit buffer is emptied. Then
+ inflatePrime() can be called again to put bits in the buffer. This is used
+ to clear out bits leftover after feeding inflate a block description prior
+ to feeding inflate codes.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+/*
+ This function returns two values, one in the lower 16 bits of the return
+ value, and the other in the remaining upper bits, obtained by shifting the
+ return value down 16 bits. If the upper value is -1 and the lower value is
+ zero, then inflate() is currently decoding information outside of a block.
+ If the upper value is -1 and the lower value is non-zero, then inflate is in
+ the middle of a stored block, with the lower value equaling the number of
+ bytes from the input remaining to copy. If the upper value is not -1, then
+ it is the number of bits back from the current bit position in the input of
+ the code (literal or length/distance pair) currently being processed. In
+ that case the lower value is the number of bytes already emitted for that
+ code.
+
+ A code is being processed if inflate is waiting for more input to complete
+ decoding of the code, or if it has completed decoding but is waiting for
+ more output space to write the literal or match data.
+
+ inflateMark() is used to mark locations in the input data for random
+ access, which may be at bit positions, and to note those cases where the
+ output of a code may span boundaries of random access blocks. The current
+ location in the input stream can be determined from avail_in and data_type
+ as noted in the description for the Z_BLOCK flush parameter for inflate.
+
+ inflateMark returns the value noted above or -1 << 16 if the provided
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be
+ used to force inflate() to return immediately after header processing is
+ complete and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When any
+ of extra, name, or comment are not Z_NULL and the respective field is not
+ present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the parameters are invalid, Z_MEM_ERROR if the internal state could not be
+ allocated, or Z_VERSION_ERROR if the version of the library does not match
+ the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *,
+ z_const unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is potentially more efficient than
+ inflate() for file i/o applications, in that it avoids copying between the
+ output and the sliding window by simply making the window itself the output
+ buffer. inflate() can be faster on modern CPUs when used with large
+ buffers. inflateBack() trusts the application to not change the output
+ buffer passed by the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free the
+ allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects only
+ the raw deflate stream to decompress. This is different from the normal
+ behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format error
+ in the deflate stream (in which case strm->msg is set to indicate the nature
+ of the error), or Z_STREAM_ERROR if the stream was not properly initialized.
+ In the case of Z_BUF_ERROR, an input or output error can be distinguished
+ using strm->next_in which will be Z_NULL only if in() returned an error. If
+ strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning
+ non-zero. (in() will always be called before out(), so strm->next_in is
+ assured to be defined if out() returns non-zero.) Note that inflateBack()
+ cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+#ifndef Z_SOLO
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the basic
+ stream-oriented functions. To simplify the interface, some default options
+ are assumed (compression level and memory usage, standard memory allocation
+ functions). The source code of these utility functions can be modified if
+ you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before a
+ compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit, destLen
+ is the actual size of the uncompressed buffer.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
+ the case where there is not enough room, uncompress() will fill the output
+ buffer with the uncompressed data up to that point.
+*/
+
+ /* gzip file access functions */
+
+/*
+ This library supports reading and writing files in gzip (.gz) format with
+ an interface similar to that of stdio, using the functions that start with
+ "gz". The gzip format is different from the zlib format. gzip is a gzip
+ wrapper, documented in RFC 1952, wrapped around a deflate stream.
+*/
+
+typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
+
+/*
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+
+ Opens a gzip (.gz) file for reading or writing. The mode parameter is as
+ in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
+ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
+ compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
+ for fixed code compression as in "wb9F". (See the description of
+ deflateInit2 for more information about the strategy parameter.) 'T' will
+ request transparent writing or appending with no compression and not using
+ the gzip format.
+
+ "a" can be used instead of "w" to request that the gzip stream that will
+ be written be appended to the file. "+" will result in an error, since
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
+
+ These functions, as well as gzip, will read and decode a sequence of gzip
+ streams in a file. The append function of gzopen() can be used to create
+ such a file. (Also see gzflush() for another way to do this.) When
+ appending, gzopen does not test whether the file begins with a gzip stream,
+ nor does it look for the end of the gzip streams to begin appending. gzopen
+ will simply append a gzip stream to the existing file.
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression. When
+ reading, this will be detected automatically by looking for the magic two-
+ byte gzip header.
+
+ gzopen returns NULL if the file could not be opened, if there was
+ insufficient memory to allocate the gzFile state, or if an invalid mode was
+ specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
+ errno can be checked to determine if the reason gzopen failed was that the
+ file could not be opened.
+*/
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen associates a gzFile with the file descriptor fd. File descriptors
+ are obtained from calls like open, dup, creat, pipe or fileno (if the file
+ has been previously opened with fopen). The mode parameter is as in gzopen.
+
+ The next call of gzclose on the returned gzFile will also close the file
+ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
+ fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
+ mode);. The duplicated descriptor should be saved to avoid a leak, since
+ gzdopen does not close fd if it fails. If you are using fileno() to get the
+ file descriptor from a FILE *, then you will have to use dup() to avoid
+ double-close()ing the file descriptor. Both gzclose() and fclose() will
+ close the associated file descriptor, so they need to have different file
+ descriptors.
+
+ gzdopen returns NULL if there was insufficient memory to allocate the
+ gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
+ provided, or '+' was provided), or if fd is -1. The file descriptor is not
+ used until the next gz* read, write, seek, or close operation, so gzdopen
+ will not detect if fd is invalid (unless fd is -1).
+*/
+
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+/*
+ Set the internal buffer size used by this library's functions. The
+ default buffer size is 8192 bytes. This function must be called after
+ gzopen() or gzdopen(), and before any other calls that read or write the
+ file. The buffer memory allocation is always deferred to the first read or
+ write. Two buffers are allocated, either both of the specified size when
+ writing, or one of the specified size and the other twice that size when
+ reading. A larger buffer size of, for example, 64K or 128K bytes will
+ noticeably increase the speed of decompression (reading).
+
+ The new buffer size also affects the maximum length for gzprintf().
+
+ gzbuffer() returns 0 on success, or -1 on failure, such as being called
+ too late.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file. If
+ the input file is not in gzip format, gzread copies the given number of
+ bytes into the buffer directly from the file.
+
+ After reaching the end of a gzip stream in the input, gzread will continue
+ to read, looking for another gzip stream. Any number of gzip streams may be
+ concatenated in the input file, and will all be decompressed by gzread().
+ If something other than a gzip stream is encountered after a gzip stream,
+ that remaining trailing garbage is ignored (and no error is returned).
+
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
+
+ gzread returns the number of uncompressed bytes actually read, less than
+ len for end of file, or -1 for error.
+*/
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes written or 0 in case of
+ error.
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the arguments to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written, or 0 in case of error. The number of
+ uncompressed bytes written is limited to 8191, or one less than the buffer
+ size given to gzbuffer(). The caller should assure that this limit is not
+ exceeded. If it is exceeded, then gzprintf() will return an error (0) with
+ nothing written. In this case, there may also be a buffer overflow with
+ unpredictable consequences, which is possible only if zlib was compiled with
+ the insecure functions sprintf() or vsprintf() because the secure snprintf()
+ or vsnprintf() functions were not available. This can be determined using
+ zlibCompileFlags().
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or a
+ newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. If any characters are read or if len == 1, the
+ string is terminated with a null character. If no characters are read due
+ to an end-of-file or len < 1, then the buffer is left untouched.
+
+ gzgets returns buf which is a null-terminated string, or it returns NULL
+ for end-of-file or in case of error. If there was an error, the contents at
+ buf are indeterminate.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file. gzputc
+ returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte or -1
+ in case of end of file or error. This is implemented as a macro for speed.
+ As such, it does not do all of the checking the other functions do. I.e.
+ it does not check to see if file is NULL, nor whether the structure file
+ points to has been clobbered or not.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read as the first character
+ on the next read. At least one character of push-back is allowed.
+ gzungetc() returns the character pushed, or -1 on failure. gzungetc() will
+ fail if c is -1, and may fail if a character has been pushed but not read
+ yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
+ output buffer size of pushed characters is allowed. (See gzbuffer above.)
+ The pushed character will be discarded if the stream is repositioned with
+ gzseek() or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter flush
+ is as in the deflate() function. The return value is the zlib error number
+ (see function gzerror below). gzflush is only permitted when writing.
+
+ If the flush parameter is Z_FINISH, the remaining data is written and the
+ gzip stream is completed in the output. If gzwrite() is called again, a new
+ gzip stream will be started in the output. gzread() is able to read such
+ concatented gzip streams.
+
+ gzflush should be called only when strictly necessary because it will
+ degrade compression if called too often.
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+
+ Sets the starting position for the next gzread or gzwrite on the given
+ compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+
+ Returns the starting position for the next gzread or gzwrite on the given
+ compressed file. This position represents a number of bytes in the
+ uncompressed data stream, and is zero when starting, even if appending or
+ reading a gzip stream from the middle of a file using gzdopen().
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+
+ Returns the current offset in the file being read or written. This offset
+ includes the count of bytes that precede the gzip stream, for example when
+ appending or when using gzdopen() for reading. When reading, the offset
+ does not include as yet unused buffered input. This information can be used
+ for a progress indicator. On error, gzoffset() returns -1.
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns true (1) if the end-of-file indicator has been set while reading,
+ false (0) otherwise. Note that the end-of-file indicator is set only if the
+ read tried to go past the end of the input, but came up short. Therefore,
+ just like feof(), gzeof() may return false even if there is no more data to
+ read, in the event that the last read request was for the exact number of
+ bytes remaining in the input file. This will happen if the input file size
+ is an exact multiple of the buffer size.
+
+ If gzeof() returns true, then the read functions will return no more data,
+ unless the end-of-file indicator is reset by gzclearerr() and the input file
+ has grown since the previous end of file was detected.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns true (1) if file is being copied directly while reading, or false
+ (0) if file is a gzip stream being decompressed.
+
+ If the input file is empty, gzdirect() will return true, since the input
+ does not contain a gzip stream.
+
+ If gzdirect() is used immediately after gzopen() or gzdopen() it will
+ cause buffers to be allocated to allow reading the file to determine if it
+ is a gzip file. Therefore if gzbuffer() is used, it should be called before
+ gzdirect().
+
+ When writing, gzdirect() returns true (1) if transparent writing was
+ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
+ gzdirect() is not needed when writing. Transparent writing must be
+ explicitly requested, so the application already knows the answer. When
+ linking statically, using gzdirect() will include all of the zlib code for
+ gzip file reading and decompression, which may not be desired.)
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file and
+ deallocates the (de)compression state. Note that once file is closed, you
+ cannot call gzerror with file, since its structures have been deallocated.
+ gzclose must not be called more than once on the same file, just as free
+ must not be called more than once on the same allocation.
+
+ gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
+*/
+
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+/*
+ Same as gzclose(), but gzclose_r() is only for use when reading, and
+ gzclose_w() is only for use when writing or appending. The advantage to
+ using these instead of gzclose() is that they avoid linking in zlib
+ compression or decompression code that is not used when only reading or only
+ writing respectively. If gzclose() is used, then both compression and
+ decompression code will be included the application when linking to a static
+ zlib library.
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the given
+ compressed file. errnum is set to zlib error number. If an error occurred
+ in the file system and not in the compression library, errnum is set to
+ Z_ERRNO and the application may consult errno to get the exact error code.
+
+ The application must not modify the returned string. Future calls to
+ this function may invalidate the previously returned string. If file is
+ closed, then the string previously returned by gzerror will no longer be
+ available.
+
+ gzerror() should be used to distinguish errors from end-of-file for those
+ functions above that do not distinguish those cases in their return values.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+#endif /* !Z_SOLO */
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the compression
+ library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is Z_NULL, this function returns the
+ required initial value for the checksum.
+
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster.
+
+ Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
+ negative, the result has no meaning or utility.
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is Z_NULL, this function returns the required
+ initial value for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure. Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro. The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously. They can
+ * only be used by the gzgetc() macro. You have been warned.
+ */
+struct gzFile_s {
+ unsigned have;
+ unsigned char *next;
+ z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+# define z_gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#else
+# define gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#endif
+
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
+ * both are true, the application gets the *64 functions, and the regular
+ * functions are changed to 64 bits) -- in case these are set on systems
+ * without large file support, _LFS64_LARGEFILE must also be true
+ */
+#ifdef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+#endif
+
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+# ifdef Z_PREFIX_SET
+# define z_gzopen z_gzopen64
+# define z_gzseek z_gzseek64
+# define z_gztell z_gztell64
+# define z_gzoffset z_gzoffset64
+# define z_adler32_combine z_adler32_combine64
+# define z_crc32_combine z_crc32_combine64
+# else
+# define gzopen gzopen64
+# define gzseek gzseek64
+# define gztell gztell64
+# define gzoffset gzoffset64
+# define adler32_combine adler32_combine64
+# define crc32_combine crc32_combine64
+# endif
+# ifndef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));
+ ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));
+# endif
+#else
+ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+#endif
+
+#else /* Z_SOLO */
+
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
+/* hack for buggy compilers */
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;};
+#endif
+
+/* undocumented functions */
+ZEXTERN const char * ZEXPORT zError OF((int));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
+ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+#if defined(_WIN32) && !defined(Z_SOLO)
+ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
+ const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+ const char *format,
+ va_list va));
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
diff --git a/core/src/fdrm/crypto/fx_crypt.cpp b/core/src/fdrm/crypto/fx_crypt.cpp
new file mode 100644
index 0000000000..0f1bf5f997
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct rc4_state {
+ int x, y, m[256];
+};
+void CRYPT_ArcFourSetup(void* context, FX_LPCBYTE key, FX_DWORD length )
+{
+ rc4_state *s = (rc4_state*)context;
+ int i, j, k, *m, a;
+ s->x = 0;
+ s->y = 0;
+ m = s->m;
+ for( i = 0; i < 256; i++ ) {
+ m[i] = i;
+ }
+ j = k = 0;
+ for( i = 0; i < 256; i++ ) {
+ a = m[i];
+ j = ( j + a + key[k] ) & 0xFF;
+ m[i] = m[j];
+ m[j] = a;
+ if( ++k >= (int)length ) {
+ k = 0;
+ }
+ }
+}
+void CRYPT_ArcFourCrypt(void* context, unsigned char *data, FX_DWORD length )
+{
+ struct rc4_state* s = (struct rc4_state*)context;
+ int i, x, y, *m, a, b;
+ x = s->x;
+ y = s->y;
+ m = s->m;
+ for( i = 0; i < (int)length; i++ ) {
+ x = ( x + 1 ) & 0xFF;
+ a = m[x];
+ y = ( y + a ) & 0xFF;
+ m[x] = b = m[y];
+ m[y] = a;
+ data[i] ^= m[( a + b ) & 0xFF];
+ }
+ s->x = x;
+ s->y = y;
+}
+void CRYPT_ArcFourCryptBlock(FX_LPBYTE pData, FX_DWORD size, FX_LPCBYTE key, FX_DWORD keylen)
+{
+ rc4_state s;
+ CRYPT_ArcFourSetup(&s, key, keylen);
+ CRYPT_ArcFourCrypt(&s, pData, size);
+}
+struct md5_context {
+ FX_DWORD total[2];
+ FX_DWORD state[4];
+ FX_BYTE buffer[64];
+};
+#define GET_FX_DWORD(n,b,i) \
+ { \
+ (n) = (FX_DWORD) ((FX_BYTE *) b)[(i)] \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+1]) << 8) \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+2]) << 16) \
+ | (((FX_DWORD) ((FX_BYTE *) b)[(i)+3]) << 24); \
+ }
+#define PUT_FX_DWORD(n,b,i) \
+ { \
+ (((FX_BYTE *) b)[(i)] ) = (FX_BYTE) (((n) ) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+1]) = (FX_BYTE) (((n) >> 8) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+2]) = (FX_BYTE) (((n) >> 16) & 0xFF); \
+ (((FX_BYTE *) b)[(i)+3]) = (FX_BYTE) (((n) >> 24) & 0xFF); \
+ }
+void md5_process( struct md5_context *ctx, const FX_BYTE data[64] )
+{
+ FX_DWORD A, B, C, D, X[16];
+ GET_FX_DWORD( X[0], data, 0 );
+ GET_FX_DWORD( X[1], data, 4 );
+ GET_FX_DWORD( X[2], data, 8 );
+ GET_FX_DWORD( X[3], data, 12 );
+ GET_FX_DWORD( X[4], data, 16 );
+ GET_FX_DWORD( X[5], data, 20 );
+ GET_FX_DWORD( X[6], data, 24 );
+ GET_FX_DWORD( X[7], data, 28 );
+ GET_FX_DWORD( X[8], data, 32 );
+ GET_FX_DWORD( X[9], data, 36 );
+ GET_FX_DWORD( X[10], data, 40 );
+ GET_FX_DWORD( X[11], data, 44 );
+ GET_FX_DWORD( X[12], data, 48 );
+ GET_FX_DWORD( X[13], data, 52 );
+ GET_FX_DWORD( X[14], data, 56 );
+ GET_FX_DWORD( X[15], data, 60 );
+#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
+#define P(a,b,c,d,k,s,t) \
+ { \
+ a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
+ }
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+#define F(x,y,z) (z ^ (x & (y ^ z)))
+ P( A, B, C, D, 0, 7, 0xD76AA478 );
+ P( D, A, B, C, 1, 12, 0xE8C7B756 );
+ P( C, D, A, B, 2, 17, 0x242070DB );
+ P( B, C, D, A, 3, 22, 0xC1BDCEEE );
+ P( A, B, C, D, 4, 7, 0xF57C0FAF );
+ P( D, A, B, C, 5, 12, 0x4787C62A );
+ P( C, D, A, B, 6, 17, 0xA8304613 );
+ P( B, C, D, A, 7, 22, 0xFD469501 );
+ P( A, B, C, D, 8, 7, 0x698098D8 );
+ P( D, A, B, C, 9, 12, 0x8B44F7AF );
+ P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
+ P( B, C, D, A, 11, 22, 0x895CD7BE );
+ P( A, B, C, D, 12, 7, 0x6B901122 );
+ P( D, A, B, C, 13, 12, 0xFD987193 );
+ P( C, D, A, B, 14, 17, 0xA679438E );
+ P( B, C, D, A, 15, 22, 0x49B40821 );
+#undef F
+#define F(x,y,z) (y ^ (z & (x ^ y)))
+ P( A, B, C, D, 1, 5, 0xF61E2562 );
+ P( D, A, B, C, 6, 9, 0xC040B340 );
+ P( C, D, A, B, 11, 14, 0x265E5A51 );
+ P( B, C, D, A, 0, 20, 0xE9B6C7AA );
+ P( A, B, C, D, 5, 5, 0xD62F105D );
+ P( D, A, B, C, 10, 9, 0x02441453 );
+ P( C, D, A, B, 15, 14, 0xD8A1E681 );
+ P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
+ P( A, B, C, D, 9, 5, 0x21E1CDE6 );
+ P( D, A, B, C, 14, 9, 0xC33707D6 );
+ P( C, D, A, B, 3, 14, 0xF4D50D87 );
+ P( B, C, D, A, 8, 20, 0x455A14ED );
+ P( A, B, C, D, 13, 5, 0xA9E3E905 );
+ P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
+ P( C, D, A, B, 7, 14, 0x676F02D9 );
+ P( B, C, D, A, 12, 20, 0x8D2A4C8A );
+#undef F
+#define F(x,y,z) (x ^ y ^ z)
+ P( A, B, C, D, 5, 4, 0xFFFA3942 );
+ P( D, A, B, C, 8, 11, 0x8771F681 );
+ P( C, D, A, B, 11, 16, 0x6D9D6122 );
+ P( B, C, D, A, 14, 23, 0xFDE5380C );
+ P( A, B, C, D, 1, 4, 0xA4BEEA44 );
+ P( D, A, B, C, 4, 11, 0x4BDECFA9 );
+ P( C, D, A, B, 7, 16, 0xF6BB4B60 );
+ P( B, C, D, A, 10, 23, 0xBEBFBC70 );
+ P( A, B, C, D, 13, 4, 0x289B7EC6 );
+ P( D, A, B, C, 0, 11, 0xEAA127FA );
+ P( C, D, A, B, 3, 16, 0xD4EF3085 );
+ P( B, C, D, A, 6, 23, 0x04881D05 );
+ P( A, B, C, D, 9, 4, 0xD9D4D039 );
+ P( D, A, B, C, 12, 11, 0xE6DB99E5 );
+ P( C, D, A, B, 15, 16, 0x1FA27CF8 );
+ P( B, C, D, A, 2, 23, 0xC4AC5665 );
+#undef F
+#define F(x,y,z) (y ^ (x | ~z))
+ P( A, B, C, D, 0, 6, 0xF4292244 );
+ P( D, A, B, C, 7, 10, 0x432AFF97 );
+ P( C, D, A, B, 14, 15, 0xAB9423A7 );
+ P( B, C, D, A, 5, 21, 0xFC93A039 );
+ P( A, B, C, D, 12, 6, 0x655B59C3 );
+ P( D, A, B, C, 3, 10, 0x8F0CCC92 );
+ P( C, D, A, B, 10, 15, 0xFFEFF47D );
+ P( B, C, D, A, 1, 21, 0x85845DD1 );
+ P( A, B, C, D, 8, 6, 0x6FA87E4F );
+ P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
+ P( C, D, A, B, 6, 15, 0xA3014314 );
+ P( B, C, D, A, 13, 21, 0x4E0811A1 );
+ P( A, B, C, D, 4, 6, 0xF7537E82 );
+ P( D, A, B, C, 11, 10, 0xBD3AF235 );
+ P( C, D, A, B, 2, 15, 0x2AD7D2BB );
+ P( B, C, D, A, 9, 21, 0xEB86D391 );
+#undef F
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+}
+void CRYPT_MD5Start(void* context)
+{
+ struct md5_context *ctx = (struct md5_context*)context;
+ ctx->total[0] = 0;
+ ctx->total[1] = 0;
+ ctx->state[0] = 0x67452301;
+ ctx->state[1] = 0xEFCDAB89;
+ ctx->state[2] = 0x98BADCFE;
+ ctx->state[3] = 0x10325476;
+}
+void CRYPT_MD5Update(FX_LPVOID pctx, FX_LPCBYTE input, FX_DWORD length )
+{
+ struct md5_context *ctx = (struct md5_context *)pctx;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = ( ctx->total[0] >> 3 ) & 0x3F;
+ fill = 64 - left;
+ ctx->total[0] += length << 3;
+ ctx->total[1] += length >> 29;
+ ctx->total[0] &= 0xFFFFFFFF;
+ ctx->total[1] += ctx->total[0] < length << 3;
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, fill );
+ md5_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 64 ) {
+ md5_process( ctx, input );
+ length -= 64;
+ input += 64;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left), (void *) input, length );
+ }
+}
+const FX_BYTE md5_padding[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+void CRYPT_MD5Finish(FX_LPVOID pctx, FX_BYTE digest[16] )
+{
+ struct md5_context *ctx = (struct md5_context *)pctx;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[8];
+ PUT_FX_DWORD( ctx->total[0], msglen, 0 );
+ PUT_FX_DWORD( ctx->total[1], msglen, 4 );
+ last = ( ctx->total[0] >> 3 ) & 0x3F;
+ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
+ CRYPT_MD5Update( ctx, md5_padding, padn );
+ CRYPT_MD5Update( ctx, msglen, 8 );
+ PUT_FX_DWORD( ctx->state[0], digest, 0 );
+ PUT_FX_DWORD( ctx->state[1], digest, 4 );
+ PUT_FX_DWORD( ctx->state[2], digest, 8 );
+ PUT_FX_DWORD( ctx->state[3], digest, 12 );
+}
+void CRYPT_MD5Generate(FX_LPCBYTE input, FX_DWORD length, FX_BYTE digest[16])
+{
+ md5_context ctx;
+ CRYPT_MD5Start(&ctx);
+ CRYPT_MD5Update(&ctx, input, length);
+ CRYPT_MD5Finish(&ctx, digest);
+}
+static FX_BOOL (*g_PubKeyDecryptor)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len) = NULL;
+void CRYPT_SetPubKeyDecryptor(FX_BOOL (*func)(FX_LPCBYTE pData, FX_DWORD size, FX_LPBYTE data_buf, FX_DWORD& data_len))
+{
+ g_PubKeyDecryptor = func;
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fdrm/crypto/fx_crypt_aes.cpp b/core/src/fdrm/crypto/fx_crypt_aes.cpp
new file mode 100644
index 0000000000..b8644d141b
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt_aes.cpp
@@ -0,0 +1,1013 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MAX_NR 14
+#define MAX_NK 8
+#define MAX_NB 8
+#define mulby2(x) ( ((x&0x7F) << 1) ^ (x & 0x80 ? 0x1B : 0) )
+#define GET_32BIT_MSB_FIRST(cp) \
+ (((unsigned long)(unsigned char)(cp)[3]) | \
+ ((unsigned long)(unsigned char)(cp)[2] << 8) | \
+ ((unsigned long)(unsigned char)(cp)[1] << 16) | \
+ ((unsigned long)(unsigned char)(cp)[0] << 24))
+#define PUT_32BIT_MSB_FIRST(cp, value) do { \
+ (cp)[3] = (value); \
+ (cp)[2] = (value) >> 8; \
+ (cp)[1] = (value) >> 16; \
+ (cp)[0] = (value) >> 24; } while (0)
+struct AESContext {
+ unsigned int keysched[(MAX_NR + 1) * MAX_NB];
+ unsigned int invkeysched[(MAX_NR + 1) * MAX_NB];
+ void (*encrypt) (AESContext * ctx, unsigned int * block);
+ void (*decrypt) (AESContext * ctx, unsigned int * block);
+ unsigned int iv[MAX_NB];
+ int Nb, Nr;
+};
+static const unsigned char Sbox[256] = {
+ 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
+};
+static const unsigned char Sboxinv[256] = {
+ 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
+};
+static const unsigned int E0[256] = {
+ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
+ 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
+ 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
+ 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
+ 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
+ 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
+ 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
+ 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
+ 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
+ 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
+ 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
+ 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
+ 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
+ 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
+ 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
+ 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
+ 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
+ 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
+ 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
+ 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
+ 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
+ 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
+ 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
+ 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
+ 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
+ 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
+ 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
+ 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
+ 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
+ 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
+ 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
+ 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
+ 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
+ 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
+ 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
+ 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
+ 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
+ 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
+ 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
+ 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
+ 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
+ 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
+ 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
+ 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
+ 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
+ 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
+ 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
+ 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
+ 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
+ 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
+ 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
+ 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
+ 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
+ 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
+ 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
+ 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
+ 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
+ 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
+ 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
+ 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
+ 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
+ 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
+ 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
+ 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
+};
+static const unsigned int E1[256] = {
+ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
+ 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
+ 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
+ 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
+ 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
+ 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
+ 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
+ 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
+ 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
+ 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
+ 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
+ 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
+ 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
+ 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
+ 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
+ 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
+ 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
+ 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
+ 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
+ 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
+ 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
+ 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
+ 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
+ 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
+ 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
+ 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
+ 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
+ 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
+ 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
+ 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
+ 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
+ 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
+ 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
+ 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
+ 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
+ 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
+ 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
+ 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
+ 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
+ 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
+ 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
+ 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
+ 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
+ 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
+ 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
+ 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
+ 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
+ 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
+ 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
+ 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
+ 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
+ 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
+ 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
+ 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
+ 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
+ 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
+ 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
+ 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
+ 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
+ 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
+ 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
+ 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
+ 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
+ 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
+};
+static const unsigned int E2[256] = {
+ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
+ 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
+ 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
+ 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
+ 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
+ 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
+ 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
+ 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
+ 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
+ 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
+ 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
+ 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
+ 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
+ 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
+ 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
+ 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
+ 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
+ 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
+ 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
+ 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
+ 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
+ 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
+ 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
+ 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
+ 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
+ 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
+ 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
+ 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
+ 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
+ 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
+ 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
+ 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
+ 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
+ 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
+ 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
+ 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
+ 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
+ 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
+ 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
+ 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
+ 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
+ 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
+ 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
+ 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
+ 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
+ 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
+ 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
+ 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
+ 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
+ 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
+ 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
+ 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
+ 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
+ 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
+ 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
+ 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
+ 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
+ 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
+ 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
+ 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
+ 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
+ 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
+ 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
+ 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
+};
+static const unsigned int E3[256] = {
+ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
+ 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
+ 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
+ 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
+ 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
+ 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
+ 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
+ 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
+ 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
+ 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
+ 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
+ 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
+ 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
+ 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
+ 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
+ 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
+ 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
+ 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
+ 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
+ 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
+ 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
+ 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
+ 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
+ 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
+ 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
+ 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
+ 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
+ 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
+ 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
+ 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
+ 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
+ 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
+ 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
+ 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
+ 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
+ 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
+ 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
+ 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
+ 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
+ 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
+ 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
+ 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
+ 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
+ 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
+ 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
+ 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
+ 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
+ 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
+ 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
+ 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
+ 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
+ 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
+ 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
+ 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
+ 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
+ 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
+ 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
+ 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
+ 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
+ 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
+ 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
+ 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
+ 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
+ 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
+};
+static const unsigned int D0[256] = {
+ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
+ 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
+ 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
+ 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
+ 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
+ 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
+ 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
+ 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
+ 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
+ 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
+ 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
+ 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
+ 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
+ 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
+ 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
+ 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
+ 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
+ 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
+ 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
+ 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
+ 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
+ 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
+ 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
+ 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
+ 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
+ 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
+ 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
+ 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
+ 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
+ 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
+ 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
+ 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
+ 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
+ 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
+ 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
+ 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
+ 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
+ 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
+ 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
+ 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
+ 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
+ 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
+ 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
+ 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
+ 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
+ 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
+ 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
+ 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
+ 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
+ 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
+ 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
+ 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
+ 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
+ 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
+ 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
+ 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
+ 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
+ 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
+ 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
+ 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
+ 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
+ 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
+ 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
+ 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742,
+};
+static const unsigned int D1[256] = {
+ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
+ 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
+ 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
+ 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
+ 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
+ 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
+ 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
+ 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
+ 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
+ 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
+ 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
+ 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
+ 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
+ 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
+ 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
+ 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
+ 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
+ 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
+ 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
+ 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
+ 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
+ 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
+ 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
+ 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
+ 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
+ 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
+ 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
+ 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
+ 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
+ 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
+ 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
+ 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
+ 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
+ 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
+ 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
+ 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
+ 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
+ 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
+ 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
+ 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
+ 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
+ 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
+ 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
+ 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
+ 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
+ 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
+ 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
+ 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
+ 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
+ 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
+ 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
+ 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
+ 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
+ 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
+ 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
+ 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
+ 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
+ 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
+ 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
+ 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
+ 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
+ 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
+ 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
+ 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857,
+};
+static const unsigned int D2[256] = {
+ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
+ 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
+ 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
+ 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
+ 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
+ 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
+ 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
+ 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
+ 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
+ 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
+ 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
+ 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
+ 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
+ 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
+ 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
+ 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
+ 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
+ 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
+ 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
+ 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
+ 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
+ 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
+ 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
+ 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
+ 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
+ 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
+ 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
+ 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
+ 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
+ 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
+ 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
+ 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
+ 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
+ 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
+ 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
+ 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
+ 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
+ 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
+ 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
+ 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
+ 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
+ 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
+ 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
+ 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
+ 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
+ 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
+ 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
+ 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
+ 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
+ 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
+ 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
+ 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
+ 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
+ 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
+ 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
+ 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
+ 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
+ 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
+ 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
+ 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
+ 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
+ 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
+ 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
+ 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8,
+};
+static const unsigned int D3[256] = {
+ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
+ 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
+ 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
+ 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
+ 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
+ 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
+ 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
+ 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
+ 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
+ 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
+ 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
+ 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
+ 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
+ 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
+ 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
+ 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
+ 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
+ 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
+ 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
+ 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
+ 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
+ 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
+ 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
+ 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
+ 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
+ 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
+ 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
+ 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
+ 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
+ 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
+ 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
+ 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
+ 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
+ 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
+ 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
+ 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
+ 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
+ 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
+ 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
+ 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
+ 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
+ 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
+ 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
+ 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
+ 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
+ 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
+ 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
+ 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
+ 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
+ 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
+ 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
+ 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
+ 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
+ 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
+ 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
+ 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
+ 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
+ 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
+ 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
+ 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
+ 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
+ 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
+ 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
+ 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0,
+};
+#define ADD_ROUND_KEY_4 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++)
+#define ADD_ROUND_KEY_6 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++, \
+ block[4]^=*keysched++, block[5]^=*keysched++)
+#define ADD_ROUND_KEY_8 (block[0]^=*keysched++, block[1]^=*keysched++, \
+ block[2]^=*keysched++, block[3]^=*keysched++, \
+ block[4]^=*keysched++, block[5]^=*keysched++, \
+ block[6]^=*keysched++, block[7]^=*keysched++)
+#define MOVEWORD(i) ( block[i] = newstate[i] )
+#undef MAKEWORD
+#define MAKEWORD(i) ( newstate[i] = (E0[(block[i] >> 24) & 0xFF] ^ \
+ E1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
+ E2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
+ E3[block[(i+C3)%Nb] & 0xFF]) )
+#define LASTWORD(i) ( newstate[i] = (Sbox[(block[i] >> 24) & 0xFF] << 24) | \
+ (Sbox[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
+ (Sbox[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
+ (Sbox[(block[(i+C3)%Nb] ) & 0xFF] ) )
+static void aes_encrypt_nb_4(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 2, C3 = 3, Nb = 4;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[4];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_4;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ }
+ ADD_ROUND_KEY_4;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ ADD_ROUND_KEY_4;
+}
+static void aes_encrypt_nb_6(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 2, C3 = 3, Nb = 6;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[6];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_6;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ }
+ ADD_ROUND_KEY_6;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ ADD_ROUND_KEY_6;
+}
+static void aes_encrypt_nb_8(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 1, C2 = 3, C3 = 4, Nb = 8;
+ unsigned int *keysched = ctx->keysched;
+ unsigned int newstate[8];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_8;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MAKEWORD(6);
+ MAKEWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ }
+ ADD_ROUND_KEY_8;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ LASTWORD(6);
+ LASTWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ ADD_ROUND_KEY_8;
+}
+#undef MAKEWORD
+#undef LASTWORD
+#define MAKEWORD(i) ( newstate[i] = (D0[(block[i] >> 24) & 0xFF] ^ \
+ D1[(block[(i+C1)%Nb] >> 16) & 0xFF] ^ \
+ D2[(block[(i+C2)%Nb] >> 8) & 0xFF] ^ \
+ D3[block[(i+C3)%Nb] & 0xFF]) )
+#define LASTWORD(i) (newstate[i] = (Sboxinv[(block[i] >> 24) & 0xFF] << 24) | \
+ (Sboxinv[(block[(i+C1)%Nb] >> 16) & 0xFF] << 16) | \
+ (Sboxinv[(block[(i+C2)%Nb] >> 8) & 0xFF] << 8) | \
+ (Sboxinv[(block[(i+C3)%Nb] ) & 0xFF] ) )
+static void aes_decrypt_nb_4(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 4 - 1, C2 = 4 - 2, C3 = 4 - 3, Nb = 4;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[4];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_4;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ }
+ ADD_ROUND_KEY_4;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ ADD_ROUND_KEY_4;
+}
+static void aes_decrypt_nb_6(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 6 - 1, C2 = 6 - 2, C3 = 6 - 3, Nb = 6;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[6];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_6;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ }
+ ADD_ROUND_KEY_6;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ ADD_ROUND_KEY_6;
+}
+static void aes_decrypt_nb_8(AESContext * ctx, unsigned int * block)
+{
+ int i;
+ static const int C1 = 8 - 1, C2 = 8 - 3, C3 = 8 - 4, Nb = 8;
+ unsigned int *keysched = ctx->invkeysched;
+ unsigned int newstate[8];
+ for (i = 0; i < ctx->Nr - 1; i++) {
+ ADD_ROUND_KEY_8;
+ MAKEWORD(0);
+ MAKEWORD(1);
+ MAKEWORD(2);
+ MAKEWORD(3);
+ MAKEWORD(4);
+ MAKEWORD(5);
+ MAKEWORD(6);
+ MAKEWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ }
+ ADD_ROUND_KEY_8;
+ LASTWORD(0);
+ LASTWORD(1);
+ LASTWORD(2);
+ LASTWORD(3);
+ LASTWORD(4);
+ LASTWORD(5);
+ LASTWORD(6);
+ LASTWORD(7);
+ MOVEWORD(0);
+ MOVEWORD(1);
+ MOVEWORD(2);
+ MOVEWORD(3);
+ MOVEWORD(4);
+ MOVEWORD(5);
+ MOVEWORD(6);
+ MOVEWORD(7);
+ ADD_ROUND_KEY_8;
+}
+#undef MAKEWORD
+#undef LASTWORD
+static void aes_setup(AESContext * ctx, int blocklen,
+ const unsigned char *key, int keylen)
+{
+ int i, j, Nk, rconst;
+ ASSERT(blocklen == 16 || blocklen == 24 || blocklen == 32);
+ ASSERT(keylen == 16 || keylen == 24 || keylen == 32);
+ Nk = keylen / 4;
+ ctx->Nb = blocklen / 4;
+ ctx->Nr = 6 + (ctx->Nb > Nk ? ctx->Nb : Nk);
+ if (ctx->Nb == 8) {
+ ctx->encrypt = aes_encrypt_nb_8, ctx->decrypt = aes_decrypt_nb_8;
+ } else if (ctx->Nb == 6) {
+ ctx->encrypt = aes_encrypt_nb_6, ctx->decrypt = aes_decrypt_nb_6;
+ } else if (ctx->Nb == 4) {
+ ctx->encrypt = aes_encrypt_nb_4, ctx->decrypt = aes_decrypt_nb_4;
+ }
+ rconst = 1;
+ for (i = 0; i < (ctx->Nr + 1) * ctx->Nb; i++) {
+ if (i < Nk) {
+ ctx->keysched[i] = GET_32BIT_MSB_FIRST(key + 4 * i);
+ } else {
+ unsigned int temp = ctx->keysched[i - 1];
+ if (i % Nk == 0) {
+ int a, b, c, d;
+ a = (temp >> 16) & 0xFF;
+ b = (temp >> 8) & 0xFF;
+ c = (temp >> 0) & 0xFF;
+ d = (temp >> 24) & 0xFF;
+ temp = Sbox[a] ^ rconst;
+ temp = (temp << 8) | Sbox[b];
+ temp = (temp << 8) | Sbox[c];
+ temp = (temp << 8) | Sbox[d];
+ rconst = mulby2(rconst);
+ } else if (i % Nk == 4 && Nk > 6) {
+ int a, b, c, d;
+ a = (temp >> 24) & 0xFF;
+ b = (temp >> 16) & 0xFF;
+ c = (temp >> 8) & 0xFF;
+ d = (temp >> 0) & 0xFF;
+ temp = Sbox[a];
+ temp = (temp << 8) | Sbox[b];
+ temp = (temp << 8) | Sbox[c];
+ temp = (temp << 8) | Sbox[d];
+ }
+ ctx->keysched[i] = ctx->keysched[i - Nk] ^ temp;
+ }
+ }
+ for (i = 0; i <= ctx->Nr; i++) {
+ for (j = 0; j < ctx->Nb; j++) {
+ unsigned int temp;
+ temp = ctx->keysched[(ctx->Nr - i) * ctx->Nb + j];
+ if (i != 0 && i != ctx->Nr) {
+ int a, b, c, d;
+ a = (temp >> 24) & 0xFF;
+ b = (temp >> 16) & 0xFF;
+ c = (temp >> 8) & 0xFF;
+ d = (temp >> 0) & 0xFF;
+ temp = D0[Sbox[a]];
+ temp ^= D1[Sbox[b]];
+ temp ^= D2[Sbox[c]];
+ temp ^= D3[Sbox[d]];
+ }
+ ctx->invkeysched[i * ctx->Nb + j] = temp;
+ }
+ }
+}
+static void aes_decrypt(AESContext * ctx, unsigned int * block)
+{
+ ctx->decrypt(ctx, block);
+}
+static void aes_decrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
+{
+ unsigned int iv[4], x[4], ct[4];
+ int i;
+ ASSERT((len & 15) == 0);
+ FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
+ while (len > 0) {
+ for (i = 0; i < 4; i++) {
+ x[i] = ct[i] = GET_32BIT_MSB_FIRST(src + 4 * i);
+ }
+ aes_decrypt(ctx, x);
+ for (i = 0; i < 4; i++) {
+ PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i] ^ x[i]);
+ iv[i] = ct[i];
+ }
+ dest += 16;
+ src += 16;
+ len -= 16;
+ }
+ FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
+}
+static void aes_encrypt(AESContext * ctx, unsigned int * block)
+{
+ ctx->encrypt(ctx, block);
+}
+static void aes_encrypt_cbc(unsigned char *dest, const unsigned char *src, int len, AESContext * ctx)
+{
+ unsigned int iv[4];
+ int i;
+ ASSERT((len & 15) == 0);
+ FXSYS_memcpy32(iv, ctx->iv, sizeof(iv));
+ while (len > 0) {
+ for (i = 0; i < 4; i++) {
+ iv[i] ^= GET_32BIT_MSB_FIRST(src + 4 * i);
+ }
+ aes_encrypt(ctx, iv);
+ for (i = 0; i < 4; i++) {
+ PUT_32BIT_MSB_FIRST(dest + 4 * i, iv[i]);
+ }
+ dest += 16;
+ src += 16;
+ len -= 16;
+ }
+ FXSYS_memcpy32(ctx->iv, iv, sizeof(iv));
+}
+void CRYPT_AESSetKey(FX_LPVOID context, FX_DWORD blocklen, FX_LPCBYTE key, FX_DWORD keylen, FX_BOOL bEncrypt)
+{
+ aes_setup((AESContext*)context, blocklen, key, keylen);
+}
+void CRYPT_AESSetIV(FX_LPVOID context, FX_LPCBYTE iv)
+{
+ int i;
+ for (i = 0; i < ((AESContext*)context)->Nb; i++) {
+ ((AESContext*)context)->iv[i] = GET_32BIT_MSB_FIRST(iv + 4 * i);
+ }
+}
+void CRYPT_AESDecrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
+{
+ aes_decrypt_cbc(dest, src, len, (AESContext*)context);
+}
+void CRYPT_AESEncrypt(FX_LPVOID context, FX_LPBYTE dest, FX_LPCBYTE src, FX_DWORD len)
+{
+ aes_encrypt_cbc(dest, src, len, (AESContext*)context);
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fdrm/crypto/fx_crypt_sha.cpp b/core/src/fdrm/crypto/fx_crypt_sha.cpp
new file mode 100644
index 0000000000..acabcb7ba4
--- /dev/null
+++ b/core/src/fdrm/crypto/fx_crypt_sha.cpp
@@ -0,0 +1,742 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct {
+ unsigned int h[5];
+ unsigned char block[64];
+ int blkused;
+ unsigned int lenhi, lenlo;
+} SHA_State;
+#define rol(x,y) ( ((x) << (y)) | (((unsigned int)x) >> (32-y)) )
+static void SHA_Core_Init(unsigned int h[5])
+{
+ h[0] = 0x67452301;
+ h[1] = 0xefcdab89;
+ h[2] = 0x98badcfe;
+ h[3] = 0x10325476;
+ h[4] = 0xc3d2e1f0;
+}
+static void SHATransform(unsigned int * digest, unsigned int * block)
+{
+ unsigned int w[80];
+ unsigned int a, b, c, d, e;
+ int t;
+ for (t = 0; t < 16; t++) {
+ w[t] = block[t];
+ }
+ for (t = 16; t < 80; t++) {
+ unsigned int tmp = w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16];
+ w[t] = rol(tmp, 1);
+ }
+ a = digest[0];
+ b = digest[1];
+ c = digest[2];
+ d = digest[3];
+ e = digest[4];
+ for (t = 0; t < 20; t++) {
+ unsigned int tmp =
+ rol(a, 5) + ((b & c) | (d & ~b)) + e + w[t] + 0x5a827999;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 20; t < 40; t++) {
+ unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0x6ed9eba1;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 40; t < 60; t++) {
+ unsigned int tmp = rol(a,
+ 5) + ((b & c) | (b & d) | (c & d)) + e + w[t] +
+ 0x8f1bbcdc;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ for (t = 60; t < 80; t++) {
+ unsigned int tmp = rol(a, 5) + (b ^ c ^ d) + e + w[t] + 0xca62c1d6;
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = tmp;
+ }
+ digest[0] += a;
+ digest[1] += b;
+ digest[2] += c;
+ digest[3] += d;
+ digest[4] += e;
+}
+void CRYPT_SHA1Start(FX_LPVOID context)
+{
+ SHA_State * s = (SHA_State*)context;
+ SHA_Core_Init(s->h);
+ s->blkused = 0;
+ s->lenhi = s->lenlo = 0;
+}
+void CRYPT_SHA1Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
+{
+ SHA_State * s = (SHA_State*)context;
+ unsigned char *q = (unsigned char *)data;
+ unsigned int wordblock[16];
+ int len = size;
+ unsigned int lenw = len;
+ int i;
+ s->lenlo += lenw;
+ s->lenhi += (s->lenlo < lenw);
+ if (s->blkused && s->blkused + len < 64) {
+ FXSYS_memcpy32(s->block + s->blkused, q, len);
+ s->blkused += len;
+ } else {
+ while (s->blkused + len >= 64) {
+ FXSYS_memcpy32(s->block + s->blkused, q, 64 - s->blkused);
+ q += 64 - s->blkused;
+ len -= 64 - s->blkused;
+ for (i = 0; i < 16; i++) {
+ wordblock[i] =
+ (((unsigned int) s->block[i * 4 + 0]) << 24) |
+ (((unsigned int) s->block[i * 4 + 1]) << 16) |
+ (((unsigned int) s->block[i * 4 + 2]) << 8) |
+ (((unsigned int) s->block[i * 4 + 3]) << 0);
+ }
+ SHATransform(s->h, wordblock);
+ s->blkused = 0;
+ }
+ FXSYS_memcpy32(s->block, q, len);
+ s->blkused = len;
+ }
+}
+void CRYPT_SHA1Finish(FX_LPVOID context, FX_BYTE digest[20])
+{
+ SHA_State * s = (SHA_State*)context;
+ int i;
+ int pad;
+ unsigned char c[64];
+ unsigned int lenhi, lenlo;
+ if (s->blkused >= 56) {
+ pad = 56 + 64 - s->blkused;
+ } else {
+ pad = 56 - s->blkused;
+ }
+ lenhi = (s->lenhi << 3) | (s->lenlo >> (32 - 3));
+ lenlo = (s->lenlo << 3);
+ FXSYS_memset32(c, 0, pad);
+ c[0] = 0x80;
+ CRYPT_SHA1Update(s, c, pad);
+ c[0] = (lenhi >> 24) & 0xFF;
+ c[1] = (lenhi >> 16) & 0xFF;
+ c[2] = (lenhi >> 8) & 0xFF;
+ c[3] = (lenhi >> 0) & 0xFF;
+ c[4] = (lenlo >> 24) & 0xFF;
+ c[5] = (lenlo >> 16) & 0xFF;
+ c[6] = (lenlo >> 8) & 0xFF;
+ c[7] = (lenlo >> 0) & 0xFF;
+ CRYPT_SHA1Update(s, c, 8);
+ for (i = 0; i < 5; i++) {
+ digest[i * 4] = (s->h[i] >> 24) & 0xFF;
+ digest[i * 4 + 1] = (s->h[i] >> 16) & 0xFF;
+ digest[i * 4 + 2] = (s->h[i] >> 8) & 0xFF;
+ digest[i * 4 + 3] = (s->h[i]) & 0xFF;
+ }
+}
+void CRYPT_SHA1Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[20])
+{
+ SHA_State s;
+ CRYPT_SHA1Start(&s);
+ CRYPT_SHA1Update(&s, data, size);
+ CRYPT_SHA1Finish(&s, digest);
+}
+typedef struct {
+ FX_DWORD total[2];
+ FX_DWORD state[8];
+ FX_BYTE buffer[64];
+}
+sha256_context;
+#define GET_FX_DWORD(n,b,i) \
+ { \
+ (n) = ( (FX_DWORD) (b)[(i) ] << 24 ) \
+ | ( (FX_DWORD) (b)[(i) + 1] << 16 ) \
+ | ( (FX_DWORD) (b)[(i) + 2] << 8 ) \
+ | ( (FX_DWORD) (b)[(i) + 3] ); \
+ }
+#define PUT_FX_DWORD(n,b,i) \
+ { \
+ (b)[(i) ] = (FX_BYTE) ( (n) >> 24 ); \
+ (b)[(i) + 1] = (FX_BYTE) ( (n) >> 16 ); \
+ (b)[(i) + 2] = (FX_BYTE) ( (n) >> 8 ); \
+ (b)[(i) + 3] = (FX_BYTE) ( (n) ); \
+ }
+void CRYPT_SHA256Start( FX_LPVOID context )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ ctx->total[0] = 0;
+ ctx->total[1] = 0;
+ ctx->state[0] = 0x6A09E667;
+ ctx->state[1] = 0xBB67AE85;
+ ctx->state[2] = 0x3C6EF372;
+ ctx->state[3] = 0xA54FF53A;
+ ctx->state[4] = 0x510E527F;
+ ctx->state[5] = 0x9B05688C;
+ ctx->state[6] = 0x1F83D9AB;
+ ctx->state[7] = 0x5BE0CD19;
+}
+static void sha256_process( sha256_context *ctx, const FX_BYTE data[64] )
+{
+ FX_DWORD temp1, temp2, W[64];
+ FX_DWORD A, B, C, D, E, F, G, H;
+ GET_FX_DWORD( W[0], data, 0 );
+ GET_FX_DWORD( W[1], data, 4 );
+ GET_FX_DWORD( W[2], data, 8 );
+ GET_FX_DWORD( W[3], data, 12 );
+ GET_FX_DWORD( W[4], data, 16 );
+ GET_FX_DWORD( W[5], data, 20 );
+ GET_FX_DWORD( W[6], data, 24 );
+ GET_FX_DWORD( W[7], data, 28 );
+ GET_FX_DWORD( W[8], data, 32 );
+ GET_FX_DWORD( W[9], data, 36 );
+ GET_FX_DWORD( W[10], data, 40 );
+ GET_FX_DWORD( W[11], data, 44 );
+ GET_FX_DWORD( W[12], data, 48 );
+ GET_FX_DWORD( W[13], data, 52 );
+ GET_FX_DWORD( W[14], data, 56 );
+ GET_FX_DWORD( W[15], data, 60 );
+#define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
+#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
+#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
+#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
+#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
+#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
+#define F0(x,y,z) ((x & y) | (z & (x | y)))
+#define F1(x,y,z) (z ^ (x & (y ^ z)))
+#define R(t) \
+ ( \
+ W[t] = S1(W[t - 2]) + W[t - 7] + \
+ S0(W[t - 15]) + W[t - 16] \
+ )
+#define P(a,b,c,d,e,f,g,h,x,K) \
+ { \
+ temp1 = h + S3(e) + F1(e,f,g) + K + x; \
+ temp2 = S2(a) + F0(a,b,c); \
+ d += temp1; h = temp1 + temp2; \
+ }
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+ E = ctx->state[4];
+ F = ctx->state[5];
+ G = ctx->state[6];
+ H = ctx->state[7];
+ P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 );
+ P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 );
+ P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF );
+ P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 );
+ P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B );
+ P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 );
+ P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 );
+ P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 );
+ P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 );
+ P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 );
+ P( G, H, A, B, C, D, E, F, W[10], 0x243185BE );
+ P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 );
+ P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 );
+ P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE );
+ P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 );
+ P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 );
+ P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 );
+ P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 );
+ P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 );
+ P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC );
+ P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F );
+ P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA );
+ P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC );
+ P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA );
+ P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 );
+ P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D );
+ P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 );
+ P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 );
+ P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 );
+ P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 );
+ P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 );
+ P( B, C, D, E, F, G, H, A, R(31), 0x14292967 );
+ P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 );
+ P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 );
+ P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC );
+ P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 );
+ P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 );
+ P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB );
+ P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E );
+ P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 );
+ P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 );
+ P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B );
+ P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 );
+ P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 );
+ P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 );
+ P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 );
+ P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 );
+ P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 );
+ P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 );
+ P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 );
+ P( G, H, A, B, C, D, E, F, R(50), 0x2748774C );
+ P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 );
+ P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 );
+ P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A );
+ P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F );
+ P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 );
+ P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE );
+ P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F );
+ P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 );
+ P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 );
+ P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA );
+ P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB );
+ P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 );
+ P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 );
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+ ctx->state[4] += E;
+ ctx->state[5] += F;
+ ctx->state[6] += G;
+ ctx->state[7] += H;
+}
+void CRYPT_SHA256Update( void* context, FX_LPCBYTE input, FX_DWORD length )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = ctx->total[0] & 0x3F;
+ fill = 64 - left;
+ ctx->total[0] += length;
+ ctx->total[0] &= 0xFFFFFFFF;
+ if( ctx->total[0] < length ) {
+ ctx->total[1]++;
+ }
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, fill );
+ sha256_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 64 ) {
+ sha256_process( ctx, input );
+ length -= 64;
+ input += 64;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, length );
+ }
+}
+static const FX_BYTE sha256_padding[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+void CRYPT_SHA256Finish( FX_LPVOID context, FX_BYTE digest[32] )
+{
+ sha256_context *ctx = (sha256_context *)context;
+ FX_DWORD last, padn;
+ FX_DWORD high, low;
+ FX_BYTE msglen[8];
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_DWORD( high, msglen, 0 );
+ PUT_FX_DWORD( low, msglen, 4 );
+ last = ctx->total[0] & 0x3F;
+ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
+ CRYPT_SHA256Update( ctx, sha256_padding, padn );
+ CRYPT_SHA256Update( ctx, msglen, 8 );
+ PUT_FX_DWORD( ctx->state[0], digest, 0 );
+ PUT_FX_DWORD( ctx->state[1], digest, 4 );
+ PUT_FX_DWORD( ctx->state[2], digest, 8 );
+ PUT_FX_DWORD( ctx->state[3], digest, 12 );
+ PUT_FX_DWORD( ctx->state[4], digest, 16 );
+ PUT_FX_DWORD( ctx->state[5], digest, 20 );
+ PUT_FX_DWORD( ctx->state[6], digest, 24 );
+ PUT_FX_DWORD( ctx->state[7], digest, 28 );
+}
+void CRYPT_SHA256Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[32])
+{
+ sha256_context ctx;
+ CRYPT_SHA256Start(&ctx);
+ CRYPT_SHA256Update(&ctx, data, size);
+ CRYPT_SHA256Finish(&ctx, digest);
+}
+typedef struct {
+ FX_UINT64 total[2];
+ FX_UINT64 state[8];
+ FX_BYTE buffer[128];
+} sha384_context;
+FX_UINT64 FX_ato64i(FX_LPCSTR str)
+{
+ FXSYS_assert(str != NULL);
+ FX_UINT64 ret = 0;
+ int len = (int)FXSYS_strlen(str);
+ len = len > 16 ? 16 : len;
+ for (int i = 0; i < len; ++i) {
+ if (i) {
+ ret <<= 4;
+ }
+ if (str[i] >= '0' && str[i] <= '9') {
+ ret |= (str[i] - '0') & 0xFF;
+ } else if (str[i] >= 'a' && str[i] <= 'f') {
+ ret |= (str[i] - 'a' + 10) & 0xFF;
+ } else if (str[i] >= 'A' && str[i] <= 'F') {
+ ret |= (str[i] - 'A' + 10) & 0xFF;
+ } else {
+ FXSYS_assert(FALSE);
+ }
+ }
+ return ret;
+}
+void CRYPT_SHA384Start(FX_LPVOID context)
+{
+ if (context == NULL) {
+ return;
+ }
+ sha384_context *ctx = (sha384_context *)context;
+ FXSYS_memset32(ctx, 0, sizeof(sha384_context));
+ ctx->state[0] = FX_ato64i("cbbb9d5dc1059ed8");
+ ctx->state[1] = FX_ato64i("629a292a367cd507");
+ ctx->state[2] = FX_ato64i("9159015a3070dd17");
+ ctx->state[3] = FX_ato64i("152fecd8f70e5939");
+ ctx->state[4] = FX_ato64i("67332667ffc00b31");
+ ctx->state[5] = FX_ato64i("8eb44a8768581511");
+ ctx->state[6] = FX_ato64i("db0c2e0d64f98fa7");
+ ctx->state[7] = FX_ato64i("47b5481dbefa4fa4");
+}
+#define SHA384_F0(x,y,z) ((x & y) | (z & (x | y)))
+#define SHA384_F1(x,y,z) (z ^ (x & (y ^ z)))
+#define SHA384_SHR(x,n) (x >> n)
+#define SHA384_ROTR(x,n) (SHA384_SHR(x, n) | x << (64 - n))
+#define SHA384_S0(x) (SHA384_ROTR(x, 1) ^ SHA384_ROTR(x, 8) ^ SHA384_SHR(x, 7))
+#define SHA384_S1(x) (SHA384_ROTR(x,19) ^ SHA384_ROTR(x, 61) ^ SHA384_SHR(x, 6))
+#define SHA384_S2(x) (SHA384_ROTR(x, 28) ^ SHA384_ROTR(x, 34) ^ SHA384_ROTR(x, 39))
+#define SHA384_S3(x) (SHA384_ROTR(x, 14) ^ SHA384_ROTR(x,18) ^ SHA384_ROTR(x, 41))
+#define SHA384_P(a,b,c,d,e,f,g,h,x,K) \
+ { \
+ temp1 = h + SHA384_S3(e) + SHA384_F1(e,f,g) + K + x; \
+ temp2 = SHA384_S2(a) + SHA384_F0(a,b,c); \
+ d += temp1; h = temp1 + temp2; \
+ }
+static const FX_BYTE sha384_padding[128] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#define SHA384_R(t) (W[t] = SHA384_S1(W[t - 2]) + W[t - 7] + SHA384_S0(W[t - 15]) + W[t - 16])
+static FX_LPCSTR constants[] = {
+ "428a2f98d728ae22",
+ "7137449123ef65cd",
+ "b5c0fbcfec4d3b2f",
+ "e9b5dba58189dbbc",
+ "3956c25bf348b538",
+ "59f111f1b605d019",
+ "923f82a4af194f9b",
+ "ab1c5ed5da6d8118",
+ "d807aa98a3030242",
+ "12835b0145706fbe",
+ "243185be4ee4b28c",
+ "550c7dc3d5ffb4e2",
+ "72be5d74f27b896f",
+ "80deb1fe3b1696b1",
+ "9bdc06a725c71235",
+ "c19bf174cf692694",
+ "e49b69c19ef14ad2",
+ "efbe4786384f25e3",
+ "0fc19dc68b8cd5b5",
+ "240ca1cc77ac9c65",
+ "2de92c6f592b0275",
+ "4a7484aa6ea6e483",
+ "5cb0a9dcbd41fbd4",
+ "76f988da831153b5",
+ "983e5152ee66dfab",
+ "a831c66d2db43210",
+ "b00327c898fb213f",
+ "bf597fc7beef0ee4",
+ "c6e00bf33da88fc2",
+ "d5a79147930aa725",
+ "06ca6351e003826f",
+ "142929670a0e6e70",
+ "27b70a8546d22ffc",
+ "2e1b21385c26c926",
+ "4d2c6dfc5ac42aed",
+ "53380d139d95b3df",
+ "650a73548baf63de",
+ "766a0abb3c77b2a8",
+ "81c2c92e47edaee6",
+ "92722c851482353b",
+ "a2bfe8a14cf10364",
+ "a81a664bbc423001",
+ "c24b8b70d0f89791",
+ "c76c51a30654be30",
+ "d192e819d6ef5218",
+ "d69906245565a910",
+ "f40e35855771202a",
+ "106aa07032bbd1b8",
+ "19a4c116b8d2d0c8",
+ "1e376c085141ab53",
+ "2748774cdf8eeb99",
+ "34b0bcb5e19b48a8",
+ "391c0cb3c5c95a63",
+ "4ed8aa4ae3418acb",
+ "5b9cca4f7763e373",
+ "682e6ff3d6b2b8a3",
+ "748f82ee5defb2fc",
+ "78a5636f43172f60",
+ "84c87814a1f0ab72",
+ "8cc702081a6439ec",
+ "90befffa23631e28",
+ "a4506cebde82bde9",
+ "bef9a3f7b2c67915",
+ "c67178f2e372532b",
+ "ca273eceea26619c",
+ "d186b8c721c0c207",
+ "eada7dd6cde0eb1e",
+ "f57d4f7fee6ed178",
+ "06f067aa72176fba",
+ "0a637dc5a2c898a6",
+ "113f9804bef90dae",
+ "1b710b35131c471b",
+ "28db77f523047d84",
+ "32caab7b40c72493",
+ "3c9ebe0a15c9bebc",
+ "431d67c49c100d4c",
+ "4cc5d4becb3e42b6",
+ "597f299cfc657e2a",
+ "5fcb6fab3ad6faec",
+ "6c44198c4a475817",
+};
+#define GET_FX_64WORD(n,b,i) \
+ { \
+ (n) = ( (FX_UINT64) (b)[(i) ] << 56 ) \
+ | ( (FX_UINT64) (b)[(i) + 1] << 48 ) \
+ | ( (FX_UINT64) (b)[(i) + 2] << 40 ) \
+ | ( (FX_UINT64) (b)[(i) + 3] << 32 ) \
+ | ( (FX_UINT64) (b)[(i) + 4] << 24 ) \
+ | ( (FX_UINT64) (b)[(i) + 5] << 16 ) \
+ | ( (FX_UINT64) (b)[(i) + 6] << 8 ) \
+ | ( (FX_UINT64) (b)[(i) + 7] ); \
+ }
+#define PUT_FX_64DWORD(n,b,i) \
+ { \
+ (b)[(i) ] = (FX_BYTE) ( (n) >> 56 ); \
+ (b)[(i) + 1] = (FX_BYTE) ( (n) >> 48 ); \
+ (b)[(i) + 2] = (FX_BYTE) ( (n) >> 40 ); \
+ (b)[(i) + 3] = (FX_BYTE) ( (n) >> 32 ); \
+ (b)[(i) + 4] = (FX_BYTE) ( (n) >> 24 ); \
+ (b)[(i) + 5] = (FX_BYTE) ( (n) >> 16 ); \
+ (b)[(i) + 6] = (FX_BYTE) ( (n) >> 8 ); \
+ (b)[(i) + 7] = (FX_BYTE) ( (n) ); \
+ }
+static void sha384_process( sha384_context *ctx, const FX_BYTE data[128] )
+{
+ FX_UINT64 temp1, temp2;
+ FX_UINT64 A, B, C, D, E, F, G, H;
+ FX_UINT64 W[80];
+ GET_FX_64WORD(W[0], data, 0);
+ GET_FX_64WORD(W[1], data, 8);
+ GET_FX_64WORD(W[2], data, 16);
+ GET_FX_64WORD(W[3], data, 24);
+ GET_FX_64WORD(W[4], data, 32);
+ GET_FX_64WORD(W[5], data, 40);
+ GET_FX_64WORD(W[6], data, 48);
+ GET_FX_64WORD(W[7], data, 56);
+ GET_FX_64WORD(W[8], data, 64);
+ GET_FX_64WORD(W[9], data, 72);
+ GET_FX_64WORD(W[10], data, 80);
+ GET_FX_64WORD(W[11], data, 88);
+ GET_FX_64WORD(W[12], data, 96);
+ GET_FX_64WORD(W[13], data, 104);
+ GET_FX_64WORD(W[14], data, 112);
+ GET_FX_64WORD(W[15], data, 120);
+ A = ctx->state[0];
+ B = ctx->state[1];
+ C = ctx->state[2];
+ D = ctx->state[3];
+ E = ctx->state[4];
+ F = ctx->state[5];
+ G = ctx->state[6];
+ H = ctx->state[7];
+ for (int i = 0; i < 10; ++i) {
+ FX_UINT64 temp[8];
+ if (i < 2) {
+ temp[0] = W[i * 8];
+ temp[1] = W[i * 8 + 1];
+ temp[2] = W[i * 8 + 2];
+ temp[3] = W[i * 8 + 3];
+ temp[4] = W[i * 8 + 4];
+ temp[5] = W[i * 8 + 5];
+ temp[6] = W[i * 8 + 6];
+ temp[7] = W[i * 8 + 7];
+ } else {
+ temp[0] = SHA384_R(i * 8);
+ temp[1] = SHA384_R(i * 8 + 1);
+ temp[2] = SHA384_R(i * 8 + 2);
+ temp[3] = SHA384_R(i * 8 + 3);
+ temp[4] = SHA384_R(i * 8 + 4);
+ temp[5] = SHA384_R(i * 8 + 5);
+ temp[6] = SHA384_R(i * 8 + 6);
+ temp[7] = SHA384_R(i * 8 + 7);
+ }
+ SHA384_P( A, B, C, D, E, F, G, H, temp[ 0], FX_ato64i(constants[i * 8 ]) );
+ SHA384_P( H, A, B, C, D, E, F, G, temp[ 1], FX_ato64i(constants[i * 8 + 1]) );
+ SHA384_P( G, H, A, B, C, D, E, F, temp[ 2], FX_ato64i(constants[i * 8 + 2]) );
+ SHA384_P( F, G, H, A, B, C, D, E, temp[ 3], FX_ato64i(constants[i * 8 + 3]) );
+ SHA384_P( E, F, G, H, A, B, C, D, temp[ 4], FX_ato64i(constants[i * 8 + 4]) );
+ SHA384_P( D, E, F, G, H, A, B, C, temp[ 5], FX_ato64i(constants[i * 8 + 5]) );
+ SHA384_P( C, D, E, F, G, H, A, B, temp[ 6], FX_ato64i(constants[i * 8 + 6]) );
+ SHA384_P( B, C, D, E, F, G, H, A, temp[ 7], FX_ato64i(constants[i * 8 + 7]) );
+ }
+ ctx->state[0] += A;
+ ctx->state[1] += B;
+ ctx->state[2] += C;
+ ctx->state[3] += D;
+ ctx->state[4] += E;
+ ctx->state[5] += F;
+ ctx->state[6] += G;
+ ctx->state[7] += H;
+}
+void CRYPT_SHA384Update(FX_LPVOID context, FX_LPCBYTE input, FX_DWORD length)
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD left, fill;
+ if( ! length ) {
+ return;
+ }
+ left = (FX_DWORD)ctx->total[0] & 0x7F;
+ fill = 128 - left;
+ ctx->total[0] += length;
+ if( ctx->total[0] < length ) {
+ ctx->total[1]++;
+ }
+ if( left && length >= fill ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, fill );
+ sha384_process( ctx, ctx->buffer );
+ length -= fill;
+ input += fill;
+ left = 0;
+ }
+ while( length >= 128 ) {
+ sha384_process( ctx, input );
+ length -= 128;
+ input += 128;
+ }
+ if( length ) {
+ FXSYS_memcpy32( (void *) (ctx->buffer + left),
+ (void *) input, length );
+ }
+}
+void CRYPT_SHA384Finish(FX_LPVOID context, FX_BYTE digest[48])
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[16];
+ FXSYS_memset32(msglen, 0, 16);
+ FX_UINT64 high, low;
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_64DWORD( high, msglen, 0 );
+ PUT_FX_64DWORD( low, msglen, 8 );
+ last = (FX_DWORD)ctx->total[0] & 0x7F;
+ padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
+ CRYPT_SHA384Update( ctx, sha384_padding, padn );
+ CRYPT_SHA384Update( ctx, msglen, 16 );
+ PUT_FX_64DWORD(ctx->state[0], digest, 0);
+ PUT_FX_64DWORD(ctx->state[1], digest, 8);
+ PUT_FX_64DWORD(ctx->state[2], digest, 16);
+ PUT_FX_64DWORD(ctx->state[3], digest, 24);
+ PUT_FX_64DWORD(ctx->state[4], digest, 32);
+ PUT_FX_64DWORD(ctx->state[5], digest, 40);
+}
+void CRYPT_SHA384Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
+{
+ sha384_context context;
+ CRYPT_SHA384Start(&context);
+ CRYPT_SHA384Update(&context, data, size);
+ CRYPT_SHA384Finish(&context, digest);
+}
+void CRYPT_SHA512Start(FX_LPVOID context)
+{
+ if (context == NULL) {
+ return;
+ }
+ sha384_context *ctx = (sha384_context *)context;
+ FXSYS_memset32(ctx, 0, sizeof(sha384_context));
+ ctx->state[0] = FX_ato64i("6a09e667f3bcc908");
+ ctx->state[1] = FX_ato64i("bb67ae8584caa73b");
+ ctx->state[2] = FX_ato64i("3c6ef372fe94f82b");
+ ctx->state[3] = FX_ato64i("a54ff53a5f1d36f1");
+ ctx->state[4] = FX_ato64i("510e527fade682d1");
+ ctx->state[5] = FX_ato64i("9b05688c2b3e6c1f");
+ ctx->state[6] = FX_ato64i("1f83d9abfb41bd6b");
+ ctx->state[7] = FX_ato64i("5be0cd19137e2179");
+}
+void CRYPT_SHA512Update(FX_LPVOID context, FX_LPCBYTE data, FX_DWORD size)
+{
+ CRYPT_SHA384Update(context, data, size);
+}
+void CRYPT_SHA512Finish(FX_LPVOID context, FX_BYTE digest[64])
+{
+ sha384_context *ctx = (sha384_context *)context;
+ FX_DWORD last, padn;
+ FX_BYTE msglen[16];
+ FXSYS_memset32(msglen, 0, 16);
+ FX_UINT64 high, low;
+ high = ( ctx->total[0] >> 29 )
+ | ( ctx->total[1] << 3 );
+ low = ( ctx->total[0] << 3 );
+ PUT_FX_64DWORD( high, msglen, 0 );
+ PUT_FX_64DWORD( low, msglen, 8 );
+ last = (FX_DWORD)ctx->total[0] & 0x7F;
+ padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );
+ CRYPT_SHA512Update( ctx, sha384_padding, padn );
+ CRYPT_SHA512Update( ctx, msglen, 16 );
+ PUT_FX_64DWORD(ctx->state[0], digest, 0);
+ PUT_FX_64DWORD(ctx->state[1], digest, 8);
+ PUT_FX_64DWORD(ctx->state[2], digest, 16);
+ PUT_FX_64DWORD(ctx->state[3], digest, 24);
+ PUT_FX_64DWORD(ctx->state[4], digest, 32);
+ PUT_FX_64DWORD(ctx->state[5], digest, 40);
+ PUT_FX_64DWORD(ctx->state[6], digest, 48);
+ PUT_FX_64DWORD(ctx->state[7], digest, 56);
+}
+void CRYPT_SHA512Generate(FX_LPCBYTE data, FX_DWORD size, FX_BYTE digest[64])
+{
+ sha384_context context;
+ CRYPT_SHA512Start(&context);
+ CRYPT_SHA512Update(&context, data, size);
+ CRYPT_SHA512Finish(&context, digest);
+}
+#ifdef __cplusplus
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_basic_module.cpp b/core/src/fpdfapi/fpdf_basic_module.cpp
new file mode 100644
index 0000000000..4c648b4d4e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_basic_module.cpp
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcodec/fx_codec.h"
+#include "../../include/fpdfapi/fpdf_module.h"
+static CPDF_ModuleMgr* g_FPDFAPI_pDefaultMgr = NULL;
+CPDF_ModuleMgr* CPDF_ModuleMgr::Get()
+{
+ return g_FPDFAPI_pDefaultMgr;
+}
+void CPDF_ModuleMgr::Create()
+{
+ g_FPDFAPI_pDefaultMgr = FX_NEW CPDF_ModuleMgr;
+ g_FPDFAPI_pDefaultMgr->Initialize();
+}
+void CPDF_ModuleMgr::Destroy()
+{
+ if (g_FPDFAPI_pDefaultMgr) {
+ delete g_FPDFAPI_pDefaultMgr;
+ }
+ g_FPDFAPI_pDefaultMgr = NULL;
+}
+CPDF_ModuleMgr::CPDF_ModuleMgr()
+{
+ m_pCodecModule = NULL;
+ m_pPageModule = NULL;
+ m_pRenderModule = NULL;
+ m_FileBufSize = 512;
+}
+void CPDF_ModuleMgr::Initialize()
+{
+ InitModules();
+ m_FileBufSize = 512;
+}
+void CPDF_ModuleMgr::InitModules()
+{
+ m_pCodecModule = NULL;
+ m_pPageModule = FX_NEW CPDF_PageModuleDef;
+ m_pRenderModule = FX_NEW CPDF_RenderModuleDef;
+}
+CPDF_ModuleMgr::~CPDF_ModuleMgr()
+{
+ if (m_pPageModule) {
+ delete m_pPageModule;
+ }
+ if (m_pRenderModule) {
+ delete m_pRenderModule;
+ }
+}
+void CPDF_ModuleMgr::SetDownloadCallback(FX_BOOL (*callback)(FX_LPCSTR module_name))
+{
+ m_pDownloadCallback = callback;
+}
+FX_BOOL CPDF_ModuleMgr::DownloadModule(FX_LPCSTR module_name)
+{
+ if (m_pDownloadCallback == NULL) {
+ return FALSE;
+ }
+ return m_pDownloadCallback(module_name);
+}
+static CFX_ByteString _GetPath(const CFX_ByteString& folder, FX_LPCSTR name)
+{
+ FX_STRSIZE folder_len = folder.GetLength();
+#if _FX_OS_ == _FX_SYMBIAN_ || _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (folder[folder_len - 1] == '\\') {
+ return folder + name;
+ } else {
+ return (folder + "\\") + name;
+ }
+#else
+ if (folder[folder_len - 1] == '/') {
+ return folder + name;
+ } else {
+ return (folder + "/") + name;
+ }
+#endif
+}
+void CPDF_ModuleMgr::SetModulePath(FX_LPCSTR module_name, FX_LPCSTR path)
+{
+ if (module_name == NULL || module_name[0] == 0) {
+ m_DefaultModulePath = path;
+ } else {
+ m_ModulePathList.SetAt(module_name, FX_NEW CFX_ByteString(path, -1));
+ }
+}
+CFX_ByteString CPDF_ModuleMgr::GetModuleFilePath(FX_LPCSTR module_name, FX_LPCSTR name)
+{
+ CFX_ByteString* pPath = NULL;
+ if (m_ModulePathList.Lookup(module_name, (FX_LPVOID&)pPath)) {
+ return _GetPath(*pPath, name);
+ }
+ if (!m_DefaultModulePath.IsEmpty()) {
+ return _GetPath(m_DefaultModulePath, name);
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_WCHAR app_path[260];
+ ::GetModuleFileNameW(NULL, (LPWSTR)app_path, 260);
+ FX_INTPTR len = FXSYS_wcslen(app_path);
+ for (FX_INTPTR i = len; i >= 0; i --)
+ if (app_path[i] == '\\') {
+ app_path[i] = 0;
+ break;
+ }
+ CFX_ByteString path = CFX_ByteString::FromUnicode(app_path);
+ path += '\\';
+ path += name;
+ return path;
+#else
+ return name;
+#endif
+}
+void CPDF_ModuleMgr::NotifyModuleAvailable(FX_LPCSTR module_name)
+{
+ if (FXSYS_strcmp(module_name, ADDIN_NAME_CJK) == 0) {
+ m_pPageModule->NotifyCJKAvailable();
+ } else if (FXSYS_strcmp(module_name, ADDIN_NAME_DECODER) == 0) {
+ m_pRenderModule->NotifyDecoderAvailable();
+ }
+}
+void CPDF_ModuleMgr::RegisterSecurityHandler(FX_LPCSTR filter, CPDF_SecurityHandler * (*CreateHandler)(void* param), void* param)
+{
+ if (CreateHandler == NULL) {
+ m_SecurityHandlerMap.RemoveKey(filter);
+ } else {
+ m_SecurityHandlerMap.SetAt(filter, (void*)CreateHandler);
+ }
+ if (param) {
+ m_SecurityHandlerMap.SetAt(FX_BSTRC("_param_") + filter, param);
+ }
+}
+void CPDF_ModuleMgr::SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
+{
+ m_privateData.SetPrivateData(module_id, pData, callback);
+}
+FX_LPVOID CPDF_ModuleMgr::GetPrivateData(FX_LPVOID module_id)
+{
+ return m_privateData.GetPrivateData(module_id);
+}
+CPDF_SecurityHandler* CPDF_ModuleMgr::CreateSecurityHandler(FX_LPCSTR filter)
+{
+ CPDF_SecurityHandler* (*CreateHandler)(void*) = NULL;
+ if (!m_SecurityHandlerMap.Lookup(filter, (void*&)CreateHandler)) {
+ return NULL;
+ }
+ if (CreateHandler == NULL) {
+ return NULL;
+ }
+ void* param = NULL;
+ m_SecurityHandlerMap.Lookup(FX_BSTRC("_param_") + filter, param);
+ return CreateHandler(param);
+}
+ICodec_FaxModule* CPDF_ModuleMgr::GetFaxModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetFaxModule() : NULL;
+}
+ICodec_JpegModule* CPDF_ModuleMgr::GetJpegModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJpegModule() : NULL;
+}
+ICodec_JpxModule* CPDF_ModuleMgr::GetJpxModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJpxModule() : NULL;
+}
+ICodec_Jbig2Module* CPDF_ModuleMgr::GetJbig2Module()
+{
+ return m_pCodecModule ? m_pCodecModule->GetJbig2Module() : NULL;
+}
+ICodec_IccModule* CPDF_ModuleMgr::GetIccModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetIccModule() : NULL;
+}
+ICodec_FlateModule* CPDF_ModuleMgr::GetFlateModule()
+{
+ return m_pCodecModule ? m_pCodecModule->GetFlateModule() : NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp
new file mode 100644
index 0000000000..5899e28d71
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp
@@ -0,0 +1,2394 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS1CID2Unicode_5[19088] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+ 0x00A9, 0x2122, 0x2026, 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E,
+ 0x2027, 0xFF1B, 0xFF1A, 0xFF1F, 0xFF01, 0xFE30, 0x22EF, 0x2025,
+ 0xFE50, 0xFE51, 0xFE52, 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57,
+ 0xFF5C, 0x2013, 0xFE31, 0x2014, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFF08, 0xFF09, 0xFE35, 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38,
+ 0x3014, 0x3015, 0xFE39, 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C,
+ 0x300A, 0x300B, 0xFE3D, 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40,
+ 0x300C, 0x300D, 0xFE41, 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44,
+ 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06,
+ 0xFF0A, 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2,
+ 0x25CE, 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD,
+ 0x25BC, 0x32A3, 0x2105, 0x203E, 0xFFE3, 0xFF3F, 0x02CD, 0xFE49,
+ 0xFE4A, 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61,
+ 0xFF0B, 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E,
+ 0xFF1D, 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62,
+ 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5,
+ 0x2220, 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235,
+ 0x2234, 0x2640, 0x2642, 0x2295, 0x2609, 0x2191, 0x2193, 0x2192,
+ 0x2190, 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFF0F,
+ 0xFF3C, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3,
+ 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5,
+ 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4,
+ 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7,
+ 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+ 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A,
+ 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500,
+ 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, 0x256E,
+ 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2, 0x25E3,
+ 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10, 0xFF11, 0xFF12,
+ 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0x2160,
+ 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+ 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,
+ 0x3028, 0x3029, 0x3038, 0x5344, 0x303A, 0xFF21, 0xFF22, 0xFF23,
+ 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B,
+ 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33,
+ 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0xFF41,
+ 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49,
+ 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51,
+ 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59,
+ 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+ 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108, 0x3109, 0x310A, 0x310B,
+ 0x310C, 0x310D, 0x310E, 0x310F, 0x3110, 0x3111, 0x3112, 0x3113,
+ 0x3114, 0x3115, 0x3116, 0x3117, 0x3118, 0x3119, 0x311A, 0x311B,
+ 0x311C, 0x311D, 0x311E, 0x311F, 0x3120, 0x3121, 0x3122, 0x3123,
+ 0x3124, 0x3125, 0x3126, 0x3127, 0x3128, 0x3129, 0x02D9, 0x02CA,
+ 0x02C7, 0x02CB, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465,
+ 0x2466, 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477,
+ 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x2170, 0x2171,
+ 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,
+ 0x4E28, 0x4E36, 0x4E3F, 0x4E85, 0x4EA0, 0x5182, 0x5196, 0x51AB,
+ 0x52F9, 0x5338, 0x5369, 0x53B6, 0x5902, 0x5B80, 0x5DDB, 0x5E7A,
+ 0x5E7F, 0x5EF4, 0x5F50, 0x5F61, 0x6534, 0x65E0, 0x7592, 0x7676,
+ 0x8FB5, 0x96B6, 0x2400, 0x2401, 0x2402, 0x2403, 0x2404, 0x2405,
+ 0x2406, 0x2407, 0x2408, 0x2409, 0x240A, 0x240B, 0x240C, 0x240D,
+ 0x240E, 0x240F, 0x2410, 0x2411, 0x2412, 0x2413, 0x2414, 0x2415,
+ 0x2416, 0x2417, 0x2418, 0x2419, 0x241A, 0x241B, 0x241C, 0x241D,
+ 0x241E, 0x241F, 0x2421, 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43,
+ 0x4E5D, 0x4E86, 0x4E8C, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0,
+ 0x5200, 0x5201, 0x529B, 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09,
+ 0x4E0B, 0x4E08, 0x4E0A, 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48,
+ 0x4E5F, 0x4E5E, 0x4E8E, 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343,
+ 0x53C9, 0x53E3, 0x571F, 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50,
+ 0x5B51, 0x5B53, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD,
+ 0x5DE5, 0x5DF1, 0x5DF2, 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B,
+ 0x5F13, 0x624D, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39,
+ 0x4E4B, 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2,
+ 0x4EC1, 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB,
+ 0x4EC4, 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197,
+ 0x51F6, 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316,
+ 0x5339, 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA,
+ 0x53CD, 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11,
+ 0x5C24, 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15,
+ 0x5FC3, 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597,
+ 0x65A4, 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62,
+ 0x6B79, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A,
+ 0x7236, 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19,
+ 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E,
+ 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4,
+ 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9,
+ 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317,
+ 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E,
+ 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8,
+ 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1,
+ 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, 0x592E,
+ 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C, 0x5DE8, 0x5DE7,
+ 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01, 0x5F18, 0x5F17,
+ 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251, 0x65A5, 0x65E6,
+ 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63, 0x6BCD, 0x6C11,
+ 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF, 0x7384, 0x7389,
+ 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529, 0x7530, 0x7531,
+ 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB,
+ 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB, 0x4E1E, 0x4E1F,
+ 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6, 0x4EA5, 0x4EFF,
+ 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10, 0x4F11, 0x4F0F,
+ 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD, 0x4F01, 0x4F0B,
+ 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, 0x5171, 0x518D, 0x51B0,
+ 0x5217, 0x5211, 0x5212, 0x520E, 0x5216, 0x52A3, 0x5308, 0x5321,
+ 0x5320, 0x5370, 0x5371, 0x5409, 0x540F, 0x540C, 0x540A, 0x5410,
+ 0x5401, 0x540B, 0x5404, 0x5411, 0x540D, 0x5408, 0x5403, 0x540E,
+ 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD, 0x5733, 0x5730, 0x5728,
+ 0x572D, 0x572C, 0x572F, 0x5729, 0x5919, 0x591A, 0x5937, 0x5938,
+ 0x5984, 0x5978, 0x5983, 0x597D, 0x5979, 0x5982, 0x5981, 0x5B57,
+ 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89, 0x5BFA, 0x5C16, 0x5C79,
+ 0x5DDE, 0x5E06, 0x5E76, 0x5E74, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6,
+ 0x620E, 0x620C, 0x620D, 0x6210, 0x6263, 0x625B, 0x6258, 0x6536,
+ 0x65E9, 0x65E8, 0x65EC, 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D,
+ 0x6734, 0x6731, 0x6735, 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D,
+ 0x6C57, 0x6C59, 0x6C5F, 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B,
+ 0x6C4D, 0x6C4E, 0x7070, 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73,
+ 0x7CF8, 0x7F36, 0x7F8A, 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012,
+ 0x8033, 0x807F, 0x8089, 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3,
+ 0x81FC, 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x827E, 0x866B,
+ 0x8840, 0x884C, 0x8863, 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D,
+ 0x4F4F, 0x4F47, 0x4F57, 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30,
+ 0x4F50, 0x4F51, 0x4F3D, 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C,
+ 0x4F46, 0x4F63, 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59,
+ 0x4F5D, 0x4F48, 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6,
+ 0x51B7, 0x5225, 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9,
+ 0x52AA, 0x52AC, 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E,
+ 0x543E, 0x5426, 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448,
+ 0x5442, 0x541B, 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E,
+ 0x5435, 0x5436, 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F,
+ 0x542C, 0x56EA, 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740,
+ 0x574D, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF,
+ 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996,
+ 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A,
+ 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F,
+ 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F,
+ 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77,
+ 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8,
+ 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276,
+ 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292,
+ 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539,
+ 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750,
+ 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, 0x6753,
+ 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81, 0x6C88,
+ 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70, 0x6C8C,
+ 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E, 0x6C74,
+ 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076, 0x707C,
+ 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2, 0x7396,
+ 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3, 0x79C1,
+ 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093, 0x809D,
+ 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, 0x828B, 0x828D,
+ 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46, 0x8C55, 0x8C9D, 0x8D64,
+ 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FC2, 0x8FC6,
+ 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2, 0x90AA, 0x90A6, 0x90A3,
+ 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E, 0x9631, 0x962A, 0x962C,
+ 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B, 0x4E9E, 0x4EAB, 0x4EAC,
+ 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F, 0x4F6C, 0x4F9B, 0x4F8B,
+ 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88, 0x4F69, 0x4F7B, 0x4F96,
+ 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154, 0x5152, 0x5155, 0x5169,
+ 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD, 0x523B, 0x5238, 0x5237,
+ 0x523A, 0x5230, 0x522E, 0x5236, 0x5241, 0x52BE, 0x52BB, 0x5352,
+ 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379, 0x53D6,
+ 0x53D4, 0x53D7, 0x5473, 0x5475, 0x5496, 0x5478, 0x5495, 0x5480,
+ 0x547B, 0x5477, 0x5484, 0x5492, 0x5486, 0x547C, 0x5490, 0x5471,
+ 0x5476, 0x548C, 0x549A, 0x5462, 0x5468, 0x548B, 0x547D, 0x548E,
+ 0x56FA, 0x5783, 0x5777, 0x576A, 0x5769, 0x5761, 0x5766, 0x5764,
+ 0x577C, 0x591C, 0x5949, 0x5947, 0x5948, 0x5944, 0x5954, 0x59BE,
+ 0x59BB, 0x59D4, 0x59B9, 0x59AE, 0x59D1, 0x59C6, 0x59D0, 0x59CD,
+ 0x59CB, 0x59D3, 0x59CA, 0x59AF, 0x59B3, 0x59D2, 0x59C5, 0x5B5F,
+ 0x5B64, 0x5B63, 0x5B97, 0x5B9A, 0x5B98, 0x5B9C, 0x5B99, 0x5B9B,
+ 0x5C1A, 0x5C48, 0x5C45, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9,
+ 0x5CAB, 0x5CB1, 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B,
+ 0x5E11, 0x5E78, 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6,
+ 0x5F26, 0x5F27, 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD,
+ 0x5FE0, 0x5FFD, 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035,
+ 0x6016, 0x602A, 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B,
+ 0x6216, 0x6215, 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC,
+ 0x62C4, 0x62BF, 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3,
+ 0x62D4, 0x62CB, 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9,
+ 0x62C7, 0x62CD, 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7,
+ 0x62C6, 0x62AC, 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614,
+ 0x6613, 0x660C, 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615,
+ 0x660A, 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771,
+ 0x679C, 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770,
+ 0x677F, 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C,
+ 0x676A, 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B,
+ 0x6CE3, 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD,
+ 0x6CBE, 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4,
+ 0x6CB9, 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB,
+ 0x6CE1, 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0,
+ 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D, 0x7238,
+ 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7, 0x72D0,
+ 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D, 0x7599,
+ 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD, 0x793E,
+ 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA, 0x7CFE,
+ 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2, 0x80B1,
+ 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5, 0x81FE,
+ 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F, 0x82B9,
+ 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0, 0x82BE,
+ 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE, 0x8FD4,
+ 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1, 0x9577,
+ 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, 0x9642, 0x96B9,
+ 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE, 0x4FE1, 0x4FB5,
+ 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD, 0x4FC3, 0x4FB6,
+ 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0, 0x4FC4, 0x4FC2,
+ 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192, 0x5191, 0x51A0,
+ 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B, 0x5247, 0x52C7,
+ 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B, 0x539A, 0x53DB,
+ 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8, 0x54A6, 0x54B3,
+ 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, 0x54C4, 0x54C8, 0x54AF,
+ 0x54AB, 0x54B1, 0x54BB, 0x54A9, 0x54A7, 0x54BF, 0x56FF, 0x5782,
+ 0x578B, 0x57A0, 0x57A3, 0x57A2, 0x57CE, 0x57AE, 0x5793, 0x5955,
+ 0x5951, 0x594F, 0x594E, 0x5950, 0x59DC, 0x59D8, 0x59FF, 0x59E3,
+ 0x59E8, 0x5A03, 0x59E5, 0x59EA, 0x59DA, 0x59E6, 0x5A01, 0x59FB,
+ 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4, 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E,
+ 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9, 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25,
+ 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6, 0x5EFA, 0x5F08, 0x5F2D, 0x5F65,
+ 0x5F88, 0x5F85, 0x5F8A, 0x5F8B, 0x5F87, 0x5F8C, 0x5F89, 0x6012,
+ 0x601D, 0x6020, 0x6025, 0x600E, 0x6028, 0x604D, 0x6070, 0x6068,
+ 0x6062, 0x6046, 0x6043, 0x606C, 0x606B, 0x606A, 0x6064, 0x6241,
+ 0x62DC, 0x6316, 0x6309, 0x62FC, 0x62ED, 0x6301, 0x62EE, 0x62FD,
+ 0x6307, 0x62F1, 0x62F7, 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311,
+ 0x6302, 0x653F, 0x6545, 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D,
+ 0x6620, 0x6627, 0x662F, 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7,
+ 0x67FF, 0x67D3, 0x67F1, 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF,
+ 0x67F5, 0x67E9, 0x67EF, 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5,
+ 0x67B8, 0x67CF, 0x67DE, 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD,
+ 0x67D2, 0x6B6A, 0x6B83, 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F,
+ 0x6CC9, 0x6D0B, 0x6D32, 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31,
+ 0x6D1E, 0x6D17, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5,
+ 0x6D39, 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B,
+ 0x70AB, 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE,
+ 0x70A4, 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1,
+ 0x73B7, 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A,
+ 0x752D, 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5,
+ 0x75A2, 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6,
+ 0x76C3, 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE,
+ 0x76FC, 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946,
+ 0x7949, 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB,
+ 0x7A7F, 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00,
+ 0x7D09, 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8010,
+ 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3, 0x80C4,
+ 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD, 0x81F4,
+ 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6, 0x8304,
+ 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301, 0x82DC,
+ 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306, 0x8650,
+ 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4, 0x8A08,
+ 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4, 0x8ECD,
+ 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, 0x8FED, 0x8FEB,
+ 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1, 0x90C3, 0x914B, 0x914A,
+ 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C, 0x964D, 0x9762, 0x9769,
+ 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8, 0x98DB, 0x98DF, 0x9996,
+ 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D, 0x5023, 0x4FEF, 0x5026,
+ 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006, 0x503C, 0x501F, 0x501A,
+ 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014, 0x5028, 0x4FF1, 0x5021,
+ 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE, 0x502D, 0x502A, 0x4FFE,
+ 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5, 0x51A2, 0x51CD, 0x51CC,
+ 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254, 0x525B, 0x525D, 0x532A,
+ 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8, 0x5510, 0x5501, 0x5537,
+ 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA, 0x5514, 0x54E9, 0x54ED,
+ 0x54E1, 0x5509, 0x54EE, 0x54EA, 0x54E6, 0x5527, 0x5507, 0x54FD,
+ 0x550F, 0x5703, 0x5704, 0x57C2, 0x57D4, 0x57CB, 0x57C3, 0x5809,
+ 0x590F, 0x5957, 0x5958, 0x595A, 0x5A11, 0x5A18, 0x5A1C, 0x5A1F,
+ 0x5A1B, 0x5A13, 0x59EC, 0x5A20, 0x5A23, 0x5A29, 0x5A25, 0x5A0C,
+ 0x5A09, 0x5B6B, 0x5C58, 0x5BB0, 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE,
+ 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04, 0x5C51, 0x5C55, 0x5C50, 0x5CED,
+ 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8, 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4,
+ 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB, 0x5EAD, 0x5EA7, 0x5F31, 0x5F92,
+ 0x5F91, 0x5F90, 0x6059, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D,
+ 0x6069, 0x606F, 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C,
+ 0x6085, 0x6096, 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E,
+ 0x632F, 0x6355, 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350,
+ 0x633D, 0x632A, 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549,
+ 0x6599, 0x65C1, 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652,
+ 0x664C, 0x6645, 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821,
+ 0x6838, 0x6848, 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829,
+ 0x68B3, 0x6817, 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840,
+ 0x683C, 0x6843, 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A,
+ 0x6B89, 0x6BB7, 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0,
+ 0x6D6A, 0x6D95, 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59,
+ 0x6D93, 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C,
+ 0x6D8A, 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4,
+ 0x70D9, 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD,
+ 0x72F8, 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA,
+ 0x73DE, 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5,
+ 0x75C7, 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8,
+ 0x768B, 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720,
+ 0x7728, 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837,
+ 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950, 0x7960,
+ 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4, 0x79E3,
+ 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88, 0x7AD9,
+ 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A, 0x7D20,
+ 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D, 0x7D19,
+ 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006, 0x8004,
+ 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102,
+ 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108,
+ 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210,
+ 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354,
+ 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332,
+ 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, 0x8654,
+ 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3, 0x869C,
+ 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18, 0x8A10,
+ 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16, 0x8A0F,
+ 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77, 0x8EAC,
+ 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7, 0x9000,
+ 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095, 0x90E1,
+ 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD, 0x91D7,
+ 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965B, 0x965D,
+ 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2, 0x99AC, 0x9AA8, 0x9AD8,
+ 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A, 0x507D, 0x505C, 0x5047,
+ 0x5043, 0x504C, 0x505A, 0x5049, 0x5065, 0x5076, 0x504E, 0x5055,
+ 0x5075, 0x5074, 0x5077, 0x504F, 0x500F, 0x506F, 0x506D, 0x515C,
+ 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2, 0x52D9, 0x52D8, 0x52D5,
+ 0x5310, 0x530F, 0x5319, 0x533F, 0x5340, 0x533E, 0x53C3, 0x66FC,
+ 0x5546, 0x556A, 0x5566, 0x5544, 0x555E, 0x5561, 0x5543, 0x554A,
+ 0x5531, 0x5556, 0x554F, 0x5555, 0x552F, 0x5564, 0x5538, 0x552E,
+ 0x555C, 0x552C, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708, 0x570B,
+ 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806, 0x57E0, 0x57E4, 0x57FA,
+ 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920, 0x5962, 0x5A36, 0x5A41,
+ 0x5A49, 0x5A66, 0x5A6A, 0x5A40, 0x5A3C, 0x5A62, 0x5A5A, 0x5A46,
+ 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5, 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6,
+ 0x5C09, 0x5C08, 0x5C07, 0x5C60, 0x5C5C, 0x5C5D, 0x5D07, 0x5D06,
+ 0x5D0E, 0x5D1B, 0x5D16, 0x5D22, 0x5D11, 0x5D29, 0x5D14, 0x5D19,
+ 0x5D24, 0x5D27, 0x5D17, 0x5DE2, 0x5E38, 0x5E36, 0x5E33, 0x5E37,
+ 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5, 0x5EBE, 0x5F35, 0x5F37, 0x5F57,
+ 0x5F6C, 0x5F69, 0x5F6B, 0x5F97, 0x5F99, 0x5F9E, 0x5F98, 0x5FA1,
+ 0x5FA0, 0x5F9C, 0x607F, 0x60A3, 0x6089, 0x60A0, 0x60A8, 0x60CB,
+ 0x60B4, 0x60E6, 0x60BD, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC,
+ 0x60D8, 0x60D5, 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A,
+ 0x621B, 0x6248, 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5,
+ 0x6377, 0x6367, 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383,
+ 0x639B, 0x636B, 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC,
+ 0x6392, 0x638F, 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D,
+ 0x6556, 0x6551, 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555,
+ 0x6554, 0x659C, 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE,
+ 0x665D, 0x665A, 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7,
+ 0x671B, 0x6881, 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876,
+ 0x68B1, 0x68A7, 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886,
+ 0x6885, 0x6894, 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32,
+ 0x6BBA, 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9,
+ 0x6DB2, 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7,
+ 0x6DCB, 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7,
+ 0x6DF5, 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8,
+ 0x6DEA, 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC,
+ 0x6DBF, 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D,
+ 0x727D, 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387,
+ 0x7405, 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6,
+ 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758F,
+ 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4, 0x76D2,
+ 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A, 0x786B,
+ 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92, 0x7A95,
+ 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E, 0x7B2E,
+ 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E, 0x7D39,
+ 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42, 0x7D32,
+ 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2, 0x801C,
+ 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129, 0x8130,
+ 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E, 0x839E,
+ 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392, 0x838A,
+ 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, 0x8386, 0x83A7,
+ 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4, 0x86B5, 0x86C6,
+ 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E, 0x8888, 0x88AB,
+ 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F, 0x8A2A, 0x8A1D,
+ 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B, 0x8A22, 0x8C49,
+ 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA, 0x8CA7, 0x8D67,
+ 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019, 0x900D, 0x901A,
+ 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015, 0x901E, 0x9020,
+ 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, 0x90E8, 0x90ED, 0x90FD,
+ 0x9157, 0x91CE, 0x91F5, 0x91E6, 0x91E3, 0x91E7, 0x91ED, 0x91E9,
+ 0x9589, 0x966A, 0x9675, 0x9673, 0x9678, 0x9670, 0x9674, 0x9676,
+ 0x9677, 0x966C, 0x96C0, 0x96EA, 0x96E9, 0x7AE0, 0x7ADF, 0x9802,
+ 0x9803, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2,
+ 0x508D, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096, 0x5098, 0x509A,
+ 0x6700, 0x51F1, 0x5272, 0x5274, 0x5275, 0x5269, 0x52DE, 0x52DD,
+ 0x52DB, 0x535A, 0x53A5, 0x557B, 0x5580, 0x55A7, 0x557C, 0x558A,
+ 0x559D, 0x5598, 0x5582, 0x559C, 0x55AA, 0x5594, 0x5587, 0x558B,
+ 0x5583, 0x55B3, 0x55AE, 0x559F, 0x553E, 0x55B2, 0x559A, 0x55BB,
+ 0x55AC, 0x55B1, 0x557E, 0x5589, 0x55AB, 0x5599, 0x570D, 0x582F,
+ 0x582A, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821, 0x581D, 0x5820,
+ 0x58F9, 0x58FA, 0x5960, 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B,
+ 0x5AA7, 0x5B73, 0x5B71, 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A,
+ 0x5C0B, 0x5C31, 0x5D4C, 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45,
+ 0x5E3D, 0x5E40, 0x5E43, 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4,
+ 0x5F3C, 0x5F6D, 0x5FA9, 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2,
+ 0x60B6, 0x60E0, 0x611C, 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB,
+ 0x60F4, 0x6168, 0x60F1, 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112,
+ 0x621F, 0x6249, 0x63A3, 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9,
+ 0x63C6, 0x63CD, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED,
+ 0x63EE, 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9,
+ 0x655E, 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E,
+ 0x6670, 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677,
+ 0x66FE, 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8,
+ 0x68D7, 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2,
+ 0x68F2, 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9,
+ 0x68DA, 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96,
+ 0x6BBC, 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54,
+ 0x6E21, 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B,
+ 0x6E5B, 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F,
+ 0x6E34, 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB,
+ 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F,
+ 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C,
+ 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A,
+ 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F,
+ 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2,
+ 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C,
+ 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C,
+ 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, 0x7A97,
+ 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46, 0x7B50, 0x7B52,
+ 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F, 0x7CA5, 0x7D5E,
+ 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72, 0x7D61, 0x7D66,
+ 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5, 0x800B, 0x8052,
+ 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E, 0x8139, 0x8146,
+ 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C, 0x83E9, 0x8403,
+ 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1, 0x83EF, 0x83F1,
+ 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC, 0x83FD, 0x83F2,
+ 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407, 0x83D4, 0x83DF,
+ 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB, 0x86E4, 0x86D0,
+ 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983, 0x8996, 0x8A3B,
+ 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, 0x8A54, 0x8A5B, 0x8A50,
+ 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56, 0x8C61, 0x8C82, 0x8CAF,
+ 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB, 0x8CC0, 0x8CB4, 0x8CB7,
+ 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85, 0x8D81, 0x8DCE, 0x8DDD,
+ 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB, 0x8DC6, 0x8EFB, 0x8EF8,
+ 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031, 0x9038, 0x9032, 0x9036,
+ 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163, 0x9165, 0x91CF, 0x9214,
+ 0x9215, 0x9223, 0x9209, 0x921E, 0x920D, 0x9210, 0x9207, 0x9211,
+ 0x9594, 0x958F, 0x958B, 0x9591, 0x9593, 0x9592, 0x958E, 0x968A,
+ 0x968E, 0x968B, 0x967D, 0x9685, 0x9686, 0x968D, 0x9672, 0x9684,
+ 0x96C1, 0x96C5, 0x96C4, 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC,
+ 0x9805, 0x9806, 0x9808, 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2,
+ 0x98ED, 0x99AE, 0x99AD, 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD,
+ 0x50B5, 0x50B2, 0x50B3, 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB,
+ 0x50AF, 0x50C7, 0x527F, 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4,
+ 0x52E2, 0x52E3, 0x532F, 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE,
+ 0x55DC, 0x55C7, 0x55D1, 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1,
+ 0x55C5, 0x55C6, 0x55E5, 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851,
+ 0x5858, 0x5857, 0x585A, 0x5854, 0x586B, 0x584C, 0x586D, 0x584A,
+ 0x5862, 0x5852, 0x584B, 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE,
+ 0x5ABD, 0x5ABC, 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C,
+ 0x5E79, 0x5EC9, 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A,
+ 0x610F, 0x6148, 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108,
+ 0x614E, 0x614C, 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D,
+ 0x6106, 0x6137, 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A,
+ 0x642D, 0x643D, 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436,
+ 0x6416, 0x6417, 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689,
+ 0x6687, 0x6688, 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994,
+ 0x696D, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982,
+ 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D,
+ 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD,
+ 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7,
+ 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96,
+ 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159,
+ 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C,
+ 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337,
+ 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E,
+ 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600,
+ 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3,
+ 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, 0x7779,
+ 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE, 0x788E,
+ 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891, 0x7893,
+ 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C, 0x7A1A,
+ 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77, 0x7BC0,
+ 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93, 0x7D79,
+ 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A, 0x7F72,
+ 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084, 0x8171,
+ 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, 0x8179, 0x817A,
+ 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843D, 0x8431, 0x8475,
+ 0x8466, 0x846B, 0x8449, 0x846C, 0x845B, 0x843C, 0x8435, 0x8461,
+ 0x8463, 0x8469, 0x846D, 0x8446, 0x865E, 0x865C, 0x865F, 0x86F9,
+ 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE, 0x86FB, 0x8702, 0x8703,
+ 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4, 0x88D9, 0x88DC, 0x88D8,
+ 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2, 0x899C, 0x89E3, 0x8A6B,
+ 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70, 0x8A87, 0x8A7C, 0x8A63,
+ 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62, 0x8A6E, 0x8A6C, 0x8A79,
+ 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A, 0x8C89, 0x8CCA, 0x8CC7,
+ 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2, 0x8CC5, 0x8DE1, 0x8DDF,
+ 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA, 0x8DE4, 0x8DE6, 0x8EB2,
+ 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, 0x8F9F, 0x8FB2, 0x904B, 0x904A,
+ 0x9053, 0x9042, 0x9054, 0x903C, 0x9055, 0x9050, 0x9047, 0x904F,
+ 0x904E, 0x904D, 0x9051, 0x903E, 0x9041, 0x9112, 0x9117, 0x916C,
+ 0x916A, 0x9169, 0x91C9, 0x9237, 0x9257, 0x9238, 0x923D, 0x9240,
+ 0x923E, 0x925B, 0x924B, 0x9264, 0x9251, 0x9234, 0x9249, 0x924D,
+ 0x9245, 0x9239, 0x923F, 0x925A, 0x9598, 0x9698, 0x9694, 0x9695,
+ 0x96CD, 0x96CB, 0x96C9, 0x96CA, 0x96F7, 0x96FB, 0x96F9, 0x96F6,
+ 0x9756, 0x9774, 0x9776, 0x9810, 0x9811, 0x9813, 0x980A, 0x9812,
+ 0x980C, 0x98FC, 0x98F4, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4,
+ 0x9AE1, 0x9CE9, 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE,
+ 0x50E5, 0x50D6, 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1,
+ 0x50CE, 0x50E9, 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD,
+ 0x55FE, 0x5600, 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609,
+ 0x560D, 0x560E, 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6,
+ 0x5718, 0x5716, 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879,
+ 0x5885, 0x587D, 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969,
+ 0x5AE1, 0x5AE6, 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75,
+ 0x5BDE, 0x5BE7, 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4,
+ 0x5BDF, 0x5C0D, 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55,
+ 0x5E57, 0x5E54, 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9,
+ 0x6147, 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A,
+ 0x6158, 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478,
+ 0x645F, 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572,
+ 0x65A1, 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8,
+ 0x6995, 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB,
+ 0x69AB, 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3,
+ 0x69A3, 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13,
+ 0x6EF4, 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22,
+ 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23, 0x6F15,
+ 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2, 0x6ECC,
+ 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192, 0x723E,
+ 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A, 0x7470,
+ 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609, 0x7613,
+ 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1, 0x789F,
+ 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D, 0x7A2E,
+ 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95, 0x7B8B,
+ 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87, 0x7B84,
+ 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD, 0x7DBE,
+ 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2, 0x7DBF,
+ 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, 0x7F70, 0x7FE0,
+ 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150, 0x8180, 0x818F,
+ 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA, 0x8207, 0x8214,
+ 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4, 0x8499, 0x849E,
+ 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3, 0x8490, 0x84BC,
+ 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722, 0x8725, 0x8734,
+ 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902, 0x88F4, 0x88F9,
+ 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6, 0x8A8C, 0x8A9E,
+ 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, 0x8AAA, 0x8AA5, 0x8AA8,
+ 0x8A98, 0x8A91, 0x8A9A, 0x8AA7, 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3,
+ 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99, 0x8D95, 0x8DFC, 0x8F14, 0x8F12,
+ 0x8F15, 0x8F13, 0x8FA3, 0x9060, 0x9058, 0x905C, 0x9063, 0x9059,
+ 0x905E, 0x9062, 0x905D, 0x905B, 0x9119, 0x9118, 0x911E, 0x9175,
+ 0x9178, 0x9177, 0x9174, 0x9278, 0x92AC, 0x9280, 0x9285, 0x9298,
+ 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8, 0x927C, 0x9291, 0x95A1,
+ 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4, 0x9699, 0x969C, 0x969B,
+ 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785, 0x97F6, 0x9817, 0x9818,
+ 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C, 0x9909, 0x99C1, 0x9AAF,
+ 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4, 0x9CF6, 0x9CF3, 0x9EBC,
+ 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB, 0x50F5, 0x50F9, 0x5102,
+ 0x5108, 0x5109, 0x5105, 0x51DC, 0x5287, 0x5288, 0x5289, 0x528D,
+ 0x528A, 0x52F0, 0x53B2, 0x562E, 0x563B, 0x5639, 0x5632, 0x563F,
+ 0x5634, 0x5629, 0x5653, 0x564E, 0x5657, 0x5674, 0x5636, 0x562F,
+ 0x5630, 0x5880, 0x589F, 0x589E, 0x58B3, 0x589C, 0x58AE, 0x58A9,
+ 0x58A6, 0x596D, 0x5B09, 0x5AFB, 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08,
+ 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB, 0x5C64, 0x5C65, 0x5D9D, 0x5D94,
+ 0x5E62, 0x5E5F, 0x5E61, 0x5EE2, 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3,
+ 0x5EE0, 0x5F48, 0x5F71, 0x5FB7, 0x5FB5, 0x6176, 0x6167, 0x616E,
+ 0x615D, 0x6155, 0x6182, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7,
+ 0x6190, 0x61AB, 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE,
+ 0x622E, 0x6469, 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490,
+ 0x64B0, 0x64A5, 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD,
+ 0x64AB, 0x649A, 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577,
+ 0x6578, 0x66AE, 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8,
+ 0x6A01, 0x6A1E, 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3,
+ 0x6A02, 0x6A05, 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5,
+ 0x6BC6, 0x6F3F, 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86,
+ 0x6F6D, 0x6F5B, 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64,
+ 0x6F97, 0x6F58, 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC,
+ 0x71B1, 0x71A8, 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B,
+ 0x7483, 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624,
+ 0x7626, 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787,
+ 0x778C, 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE,
+ 0x78D5, 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37,
+ 0x7A3B, 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6,
+ 0x7BC7, 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF,
+ 0x7DFB, 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE,
+ 0x7DE9, 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF,
+ 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A, 0x8198,
+ 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513, 0x8511,
+ 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506, 0x8782,
+ 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757,
+ 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912, 0x8913,
+ 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95, 0x8ACB,
+ 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6, 0x8ACD,
+ 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0, 0x8CDE,
+ 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC, 0x8CEA,
+ 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D, 0x8E22,
+ 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D, 0x8F1B,
+ 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, 0x8F25, 0x9069,
+ 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D, 0x9127, 0x9131,
+ 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB, 0x92B7, 0x92EA,
+ 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2, 0x92C7, 0x92F0, 0x92B2,
+ 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707, 0x9709, 0x9760, 0x978D,
+ 0x978B, 0x978F, 0x9821, 0x982B, 0x981C, 0x98B3, 0x990A, 0x9913,
+ 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF, 0x99DB, 0x99D1, 0x99D5,
+ 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF, 0x9B27, 0x9B45, 0x9B44,
+ 0x9B77, 0x9B6F, 0x9D06, 0x9D09, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE,
+ 0x58A8, 0x9F52, 0x5112, 0x5118, 0x5114, 0x5110, 0x5115, 0x5180,
+ 0x51AA, 0x51DD, 0x5291, 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679,
+ 0x5669, 0x5664, 0x5678, 0x566A, 0x5668, 0x5665, 0x5671, 0x566F,
+ 0x566C, 0x5662, 0x5676, 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E,
+ 0x5B1D, 0x5B34, 0x5B78, 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191,
+ 0x61A9, 0x618A, 0x61CD, 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230,
+ 0x64C5, 0x64C1, 0x64CB, 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7,
+ 0x64C2, 0x64CD, 0x64BF, 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6,
+ 0x66C9, 0x66B9, 0x66C4, 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A,
+ 0x6A59, 0x6A6B, 0x6A58, 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B,
+ 0x6A47, 0x6A35, 0x6A5F, 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2,
+ 0x6FB1, 0x6FA1, 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0,
+ 0x6FB9, 0x6FB6, 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0,
+ 0x71D2, 0x71C8, 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3,
+ 0x71C4, 0x7368, 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2,
+ 0x750C, 0x750D, 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0,
+ 0x779E, 0x779F, 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6,
+ 0x7A4D, 0x7A4E, 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11,
+ 0x7BC9, 0x7BE4, 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6,
+ 0x7E0A, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09,
+ 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3,
+ 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559,
+ 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E,
+ 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932,
+ 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB,
+ 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02,
+ 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93,
+ 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B,
+ 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078,
+ 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8,
+ 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, 0x9310,
+ 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7, 0x96A8,
+ 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713, 0x970F,
+ 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B, 0x9837,
+ 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B, 0x9921,
+ 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB, 0x9AED,
+ 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12, 0x9D1B,
+ 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121, 0x5132,
+ 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, 0x568F, 0x58D5,
+ 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A, 0x5B24, 0x5B7A, 0x5C37,
+ 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8, 0x5E6B, 0x5F4C, 0x5FBD,
+ 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB, 0x6232, 0x6234, 0x64CE,
+ 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6, 0x64EC, 0x64F1, 0x64E2,
+ 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6, 0x6A80, 0x6A94, 0x6A84,
+ 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E, 0x6A97, 0x6A90, 0x6AA0,
+ 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8, 0x6FF1, 0x6FDF, 0x6FE0,
+ 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80, 0x6FEC, 0x6FE1, 0x6FE9,
+ 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF, 0x71EE, 0x71E6, 0x71E5,
+ 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235, 0x7246, 0x7370, 0x7372,
+ 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646, 0x7642, 0x764C, 0x76EA,
+ 0x77B3, 0x77AA, 0x77B0, 0x77AC, 0x77A7, 0x77AD, 0x77EF, 0x78F7,
+ 0x78FA, 0x78F4, 0x78EF, 0x7901, 0x79A7, 0x79AA, 0x7A57, 0x7ABF,
+ 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7, 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC,
+ 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9, 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46,
+ 0x7E37, 0x7E32, 0x7E43, 0x7E2B, 0x7E3D, 0x7E31, 0x7E45, 0x7E41,
+ 0x7E34, 0x7E39, 0x7E48, 0x7E35, 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3,
+ 0x7FFC, 0x8071, 0x8072, 0x8070, 0x806F, 0x8073, 0x81C6, 0x81C3,
+ 0x81BA, 0x81C2, 0x81C0, 0x81BF, 0x81BD, 0x81C9, 0x81BE, 0x81E8,
+ 0x8209, 0x8271, 0x85AA, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594,
+ 0x85AF, 0x859B, 0x8587, 0x85A8, 0x858A, 0x85A6, 0x8667, 0x87C0,
+ 0x87D1, 0x87B3, 0x87D2, 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8,
+ 0x87CB, 0x893B, 0x8936, 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E,
+ 0x8B17, 0x8B19, 0x8B1B, 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10,
+ 0x8C41, 0x8C3F, 0x8C73, 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB,
+ 0x8DA8, 0x8E49, 0x8E4B, 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42,
+ 0x8F45, 0x8F3F, 0x907F, 0x907D, 0x9084, 0x9081, 0x9082, 0x9080,
+ 0x9139, 0x91A3, 0x919E, 0x919C, 0x934D, 0x9382, 0x9328, 0x9375,
+ 0x934A, 0x9365, 0x934B, 0x9318, 0x937E, 0x936C, 0x935B, 0x9370,
+ 0x935A, 0x9354, 0x95CA, 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1,
+ 0x96B8, 0x96D6, 0x971C, 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6,
+ 0x9935, 0x9A01, 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B,
+ 0x9D3F, 0x9E8B, 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E,
+ 0x9F4B, 0x53E2, 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D,
+ 0x61E3, 0x6233, 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB,
+ 0x64F7, 0x65B7, 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB,
+ 0x6AB8, 0x6AC2, 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009,
+ 0x700B, 0x6FFE, 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC,
+ 0x71FE, 0x71F8, 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656,
+ 0x7658, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE,
+ 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A,
+ 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A,
+ 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076,
+ 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9,
+ 0x85B0, 0x85BA, 0x85B9, 0x87EF, 0x87EC, 0x87F2, 0x87E0, 0x8986,
+ 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50, 0x8D05,
+ 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0, 0x8F49,
+ 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0, 0x9394,
+ 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0, 0x9398,
+ 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2, 0x96DC,
+ 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, 0x97AD, 0x97F9,
+ 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA, 0x993E, 0x993F,
+ 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03, 0x9B06, 0x9B4F,
+ 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8, 0x9BC0, 0x9D51,
+ 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133, 0x56A5, 0x56A8,
+ 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2, 0x61F7,
+ 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5, 0x6ADD,
+ 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D, 0x7015,
+ 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, 0x737A, 0x74BD,
+ 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F, 0x7661, 0x77C7, 0x7919,
+ 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F, 0x7C38, 0x7C3D, 0x7C37,
+ 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69, 0x7E6A, 0x7E73, 0x7F85,
+ 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9, 0x85DD, 0x85EA, 0x85D5,
+ 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805, 0x880D, 0x87F9, 0x87FE,
+ 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41, 0x8B5C, 0x8B58, 0x8B49,
+ 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59, 0x8D08, 0x8D0A, 0x8E7C,
+ 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A, 0x8E74, 0x8F54, 0x8F4E,
+ 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE, 0x93E1, 0x93D1, 0x93DF,
+ 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6, 0x93E2, 0x93CD, 0x93D8,
+ 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4, 0x96E3, 0x972A, 0x9727,
+ 0x9761, 0x97DC, 0x97FB, 0x985E, 0x9858, 0x985B, 0x98BC, 0x9945,
+ 0x9949, 0x9A16, 0x9A19, 0x9B0D, 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB,
+ 0x9D89, 0x9D61, 0x9D72, 0x9D6A, 0x9D6C, 0x9E92, 0x9E97, 0x9E93,
+ 0x9EB4, 0x52F8, 0x56B7, 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40,
+ 0x5B43, 0x5B7D, 0x5BF6, 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514,
+ 0x6519, 0x66E6, 0x6727, 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210,
+ 0x737B, 0x74CF, 0x7662, 0x7665, 0x7926, 0x792A, 0x792C, 0x792B,
+ 0x7AC7, 0x7AF6, 0x7C4C, 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE,
+ 0x7E7D, 0x7E7C, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB,
+ 0x85F9, 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814,
+ 0x8815, 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F,
+ 0x8B5F, 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82,
+ 0x91B4, 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4,
+ 0x9952, 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13,
+ 0x9C0D, 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61,
+ 0x5137, 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD,
+ 0x61FC, 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04,
+ 0x6AFA, 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669,
+ 0x77D3, 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A,
+ 0x8823, 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74,
+ 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF,
+ 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B,
+ 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957,
+ 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D,
+ 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19,
+ 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9,
+ 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61,
+ 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, 0x79B3,
+ 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972, 0x896F, 0x89FC,
+ 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61, 0x9148, 0x9444,
+ 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1, 0x986B, 0x9955,
+ 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31, 0x9C3E, 0x9C3B,
+ 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94, 0x56CC, 0x5DD6,
+ 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10, 0x74DA, 0x7ACA,
+ 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94, 0x81E2, 0x8638,
+ 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463, 0x9460, 0x9464,
+ 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57, 0x9AD3, 0x9AD4,
+ 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F, 0x9EF4, 0x56D1,
+ 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7, 0x7F50, 0x7F88,
+ 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, 0x8B96, 0x8277, 0x8D1B,
+ 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744, 0x97C6, 0x9870, 0x9A5F,
+ 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA, 0x9E7C, 0x9E7D, 0x9F07,
+ 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063, 0x7C6C, 0x7C6E, 0x883B,
+ 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470, 0x9871, 0x995E, 0x9AD6,
+ 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A, 0x9477, 0x97C9, 0x9A62,
+ 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5, 0x947D, 0x947E, 0x947C,
+ 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F, 0x9E1A, 0x7228, 0x9A6A,
+ 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, 0x4E42, 0x4E5C, 0x51F5, 0x531A,
+ 0x5382, 0x4E07, 0x4E0C, 0x4E47, 0x4E8D, 0x56D7, 0x5C6E, 0x5F73,
+ 0x4E0F, 0x5187, 0x4E0E, 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8,
+ 0x5198, 0x52FC, 0x536C, 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10,
+ 0x5DFF, 0x65E1, 0x6BB3, 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C,
+ 0x4EE8, 0x4EDC, 0x4EE9, 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x5209,
+ 0x531C, 0x534C, 0x5722, 0x5723, 0x5917, 0x592F, 0x5B81, 0x5B84,
+ 0x5C12, 0x5C3B, 0x5C74, 0x5C73, 0x5E04, 0x5E80, 0x5E82, 0x5FC9,
+ 0x6209, 0x6250, 0x6C15, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE,
+ 0x72B0, 0x738A, 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C,
+ 0x4EF5, 0x4F14, 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02,
+ 0x4F05, 0x4F22, 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213,
+ 0x5210, 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1,
+ 0x56DF, 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985,
+ 0x597B, 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C,
+ 0x5C7A, 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A,
+ 0x5F74, 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261,
+ 0x6266, 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x6537, 0x65EF,
+ 0x65EE, 0x673E, 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C,
+ 0x6733, 0x6C18, 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54,
+ 0x6C4B, 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A,
+ 0x767F, 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F,
+ 0x864D, 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622,
+ 0x9624, 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53,
+ 0x4F64, 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D,
+ 0x4F33, 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221,
+ 0x52AD, 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430,
+ 0x5437, 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418,
+ 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE, 0x56E7,
+ 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752, 0x5906,
+ 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2, 0x5990,
+ 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A, 0x5C8D,
+ 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86, 0x5C93,
+ 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C, 0x5E88,
+ 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1, 0x5FD0,
+ 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3, 0x5FFA,
+ 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283, 0x628C,
+ 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A, 0x6270,
+ 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x65F0, 0x65F4,
+ 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, 0x6759, 0x6755, 0x674C,
+ 0x6748, 0x675D, 0x674D, 0x675A, 0x674B, 0x6BD0, 0x6C19, 0x6C1A,
+ 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B, 0x6C8F, 0x6C71, 0x6C6F,
+ 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95, 0x6C9C, 0x6C66, 0x6C73,
+ 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A, 0x7263, 0x72BF, 0x72BD,
+ 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5, 0x7395, 0x7397, 0x7393,
+ 0x7394, 0x7392, 0x753A, 0x7539, 0x7594, 0x7595, 0x7681, 0x793D,
+ 0x8034, 0x8095, 0x8099, 0x8090, 0x8092, 0x809C, 0x8290, 0x828F,
+ 0x8285, 0x828E, 0x8291, 0x8293, 0x828A, 0x8283, 0x8284, 0x8C78,
+ 0x8FC9, 0x8FBF, 0x909F, 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0,
+ 0x9630, 0x9628, 0x962F, 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85,
+ 0x4F7D, 0x4F80, 0x4F87, 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77,
+ 0x4F4C, 0x4F97, 0x4F6A, 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90,
+ 0x4F9C, 0x4F94, 0x4F9E, 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E,
+ 0x519E, 0x51BC, 0x51BE, 0x5235, 0x5232, 0x5233, 0x5246, 0x5231,
+ 0x52BC, 0x530A, 0x530B, 0x533C, 0x5392, 0x5394, 0x5487, 0x547F,
+ 0x5481, 0x5491, 0x5482, 0x5488, 0x546B, 0x547A, 0x547E, 0x5465,
+ 0x546C, 0x5474, 0x5466, 0x548D, 0x546F, 0x5461, 0x5460, 0x5498,
+ 0x5463, 0x5467, 0x5464, 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D,
+ 0x576B, 0x5771, 0x5770, 0x5776, 0x5780, 0x5775, 0x577B, 0x5773,
+ 0x5774, 0x5762, 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA,
+ 0x59CF, 0x59CE, 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3,
+ 0x59D6, 0x59B1, 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62,
+ 0x5B65, 0x5B93, 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0,
+ 0x5CB5, 0x5CAF, 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2,
+ 0x5CAA, 0x5CA7, 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17,
+ 0x5E14, 0x5E19, 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82,
+ 0x5F7E, 0x5F7D, 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032,
+ 0x600B, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C,
+ 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009,
+ 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA,
+ 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0,
+ 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612,
+ 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611,
+ 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776,
+ 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A,
+ 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779,
+ 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC,
+ 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7,
+ 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, 0x6CD2,
+ 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0, 0x6D30,
+ 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1, 0x7094,
+ 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096, 0x7082,
+ 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9, 0x72DC,
+ 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1, 0x73AD,
+ 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8, 0x753F,
+ 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1, 0x76F0,
+ 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, 0x77F7, 0x7942,
+ 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB, 0x7C75, 0x7CFD, 0x8035,
+ 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5, 0x80AD, 0x8220, 0x82A0,
+ 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B, 0x82B5, 0x82A7, 0x82AE,
+ 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8, 0x82A1, 0x82A9, 0x82C2,
+ 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670, 0x866F, 0x866D, 0x866E,
+ 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD, 0x8FD6, 0x8FD5, 0x8FD7,
+ 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0, 0x9639, 0x963D, 0x963C,
+ 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3, 0x4FB2, 0x4FC9, 0x4FCB,
+ 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB, 0x4FB3, 0x4FDB, 0x4FC7,
+ 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC, 0x5244, 0x5249, 0x52C0,
+ 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396, 0x5399, 0x5398, 0x54BA,
+ 0x54A1, 0x54AD, 0x54A5, 0x54CF, 0x54C3, 0x830D, 0x54B7, 0x54AE,
+ 0x54D6, 0x54B6, 0x54C5, 0x54C6, 0x54A0, 0x5470, 0x54BC, 0x54A2,
+ 0x54BE, 0x5472, 0x54DE, 0x54B0, 0x57B5, 0x579E, 0x579F, 0x57A4,
+ 0x578C, 0x5797, 0x579D, 0x579B, 0x5794, 0x5798, 0x578F, 0x5799,
+ 0x57A5, 0x579A, 0x5795, 0x58F4, 0x590D, 0x5953, 0x59E1, 0x59DE,
+ 0x59EE, 0x5A00, 0x59F1, 0x59DD, 0x59FA, 0x59FD, 0x59FC, 0x59F6,
+ 0x59E4, 0x59F2, 0x59F7, 0x59DB, 0x59E9, 0x59F3, 0x59F5, 0x59E0,
+ 0x59FE, 0x59F4, 0x59ED, 0x5BA8, 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC,
+ 0x5CD7, 0x5CCB, 0x5CDB, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA,
+ 0x5CD6, 0x5CD3, 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF,
+ 0x5CF8, 0x5DF9, 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0,
+ 0x5EA4, 0x5EA2, 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56,
+ 0x5F86, 0x6037, 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053,
+ 0x6047, 0x6049, 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024,
+ 0x6044, 0x6058, 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D,
+ 0x630B, 0x62F5, 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C,
+ 0x62F8, 0x62F6, 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB,
+ 0x62F0, 0x6541, 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632,
+ 0x6635, 0x661C, 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D,
+ 0x6634, 0x6639, 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8,
+ 0x67BA, 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5,
+ 0x67EB, 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6,
+ 0x67EE, 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2,
+ 0x67FC, 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA,
+ 0x67C9, 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84,
+ 0x6BB6, 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34,
+ 0x6D2D, 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33,
+ 0x6D04, 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42,
+ 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07, 0x6D20,
+ 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F, 0x70BE,
+ 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241, 0x7249,
+ 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4, 0x72E8,
+ 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC, 0x73C2,
+ 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB, 0x73BF,
+ 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC, 0x74EE,
+ 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4, 0x7708,
+ 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA, 0x77E7,
+ 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F, 0x780E,
+ 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945, 0x7944,
+ 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, 0x7A7E, 0x7AD1,
+ 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F, 0x7C80, 0x7C81,
+ 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D, 0x7FBE, 0x8007,
+ 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7, 0x80E0, 0x80D1,
+ 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9, 0x80DC, 0x80CA,
+ 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD, 0x81FF, 0x8221,
+ 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8, 0x8300, 0x82D5,
+ 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1, 0x82F2, 0x82F5,
+ 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, 0x82E4, 0x82E0, 0x82FA,
+ 0x82F3, 0x82ED, 0x8677, 0x8674, 0x867C, 0x8673, 0x8841, 0x884E,
+ 0x8867, 0x886A, 0x8869, 0x89D3, 0x8A04, 0x8A07, 0x8D72, 0x8FE3,
+ 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1, 0x90BD, 0x90BF, 0x90D5, 0x90C5,
+ 0x90BE, 0x90C7, 0x90CB, 0x90C8, 0x91D4, 0x91D3, 0x9654, 0x964F,
+ 0x9651, 0x9653, 0x964A, 0x964E, 0x501E, 0x5005, 0x5007, 0x5013,
+ 0x5022, 0x5030, 0x501B, 0x4FF5, 0x4FF4, 0x5033, 0x5037, 0x502C,
+ 0x4FF6, 0x4FF7, 0x5017, 0x501C, 0x5020, 0x5027, 0x5035, 0x502F,
+ 0x5031, 0x500E, 0x515A, 0x5194, 0x5193, 0x51CA, 0x51C4, 0x51C5,
+ 0x51C8, 0x51CE, 0x5261, 0x525A, 0x5252, 0x525E, 0x525F, 0x5255,
+ 0x5262, 0x52CD, 0x530E, 0x539E, 0x5526, 0x54E2, 0x5517, 0x5512,
+ 0x54E7, 0x54F3, 0x54E4, 0x551A, 0x54FF, 0x5504, 0x5508, 0x54EB,
+ 0x5511, 0x5505, 0x54F1, 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0,
+ 0x550E, 0x5503, 0x550B, 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5,
+ 0x57D2, 0x57BA, 0x57C6, 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF,
+ 0x57C7, 0x57D0, 0x57B9, 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16,
+ 0x5A2D, 0x5A2E, 0x5A15, 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33,
+ 0x5B6C, 0x5BA7, 0x5BAD, 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC,
+ 0x5CFF, 0x5CEE, 0x5CF1, 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28,
+ 0x5EA8, 0x5EAE, 0x5EAA, 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D,
+ 0x605A, 0x6067, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081,
+ 0x609D, 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E,
+ 0x6219, 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345,
+ 0x6336, 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329,
+ 0x6341, 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333,
+ 0x635A, 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546,
+ 0x65C6, 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651,
+ 0x6712, 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B,
+ 0x684B, 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D,
+ 0x682F, 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826,
+ 0x6828, 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F,
+ 0x6B2D, 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4,
+ 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64,
+ 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F,
+ 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60,
+ 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68,
+ 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D,
+ 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39,
+ 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5,
+ 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, 0x7277,
+ 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6, 0x72F3, 0x72FB,
+ 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC, 0x73E7, 0x73E3,
+ 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD, 0x73DA, 0x73D7,
+ 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5, 0x7521, 0x755B,
+ 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0, 0x75BF, 0x75B6,
+ 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710, 0x7713, 0x7712,
+ 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722, 0x7727, 0x7823,
+ 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E, 0x782B, 0x7821,
+ 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B, 0x794F, 0x795C,
+ 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0, 0x79EE, 0x79ED,
+ 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89, 0x7A85, 0x7A8B,
+ 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, 0x7B04, 0x7B13, 0x7B05,
+ 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09, 0x7B12, 0x7C84, 0x7C91,
+ 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85, 0x7D1E, 0x7D1D, 0x7D11,
+ 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F, 0x7D12, 0x7D0F, 0x7D0C,
+ 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D, 0x7F5B, 0x7F96, 0x7F92,
+ 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E, 0x8039, 0x80FA, 0x80F2,
+ 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100, 0x8201, 0x822F, 0x8225,
+ 0x8333, 0x832D, 0x8344, 0x8319, 0x8351, 0x8325, 0x8356, 0x833F,
+ 0x8341, 0x8326, 0x831C, 0x8322, 0x8342, 0x834E, 0x831B, 0x832A,
+ 0x8308, 0x833C, 0x834D, 0x8316, 0x8324, 0x8320, 0x8337, 0x832F,
+ 0x8329, 0x8347, 0x8345, 0x834C, 0x8353, 0x831E, 0x832C, 0x834B,
+ 0x8327, 0x8348, 0x8653, 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D,
+ 0x8691, 0x869E, 0x8687, 0x8697, 0x8686, 0x868B, 0x869A, 0x8685,
+ 0x86A5, 0x8699, 0x86A1, 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D,
+ 0x8690, 0x8694, 0x8843, 0x8844, 0x886D, 0x8875, 0x8876, 0x8872,
+ 0x8880, 0x8871, 0x887F, 0x886F, 0x8883, 0x887E, 0x8874, 0x887C,
+ 0x8A12, 0x8C47, 0x8C57, 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78,
+ 0x8DB5, 0x8DB7, 0x8DB6, 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002,
+ 0x8FFF, 0x8FFB, 0x9004, 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9,
+ 0x90DA, 0x90E3, 0x90DF, 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC,
+ 0x90E4, 0x9150, 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C,
+ 0x965F, 0x96BC, 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A,
+ 0x5061, 0x505E, 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048,
+ 0x504D, 0x5041, 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F,
+ 0x5069, 0x506B, 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073,
+ 0x5057, 0x5051, 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6,
+ 0x52D3, 0x532D, 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550,
+ 0x5534, 0x552A, 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552,
+ 0x5545, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D,
+ 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2,
+ 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8,
+ 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5,
+ 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C,
+ 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58,
+ 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F,
+ 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52,
+ 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C,
+ 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72,
+ 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A,
+ 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, 0x5D30,
+ 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1, 0x5EB4,
+ 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96, 0x5F9F,
+ 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3, 0x60D4,
+ 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB, 0x60B7,
+ 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365, 0x638A,
+ 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397, 0x63AB,
+ 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375, 0x639C,
+ 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, 0x6378, 0x6385,
+ 0x6381, 0x6391, 0x638D, 0x6370, 0x6553, 0x65CD, 0x6665, 0x6661,
+ 0x665B, 0x6659, 0x665C, 0x6662, 0x6718, 0x6879, 0x6887, 0x6890,
+ 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB, 0x6956, 0x686F, 0x68A3,
+ 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2, 0x688F, 0x6877, 0x6892,
+ 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880, 0x6871, 0x687E, 0x689B,
+ 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4, 0x6878, 0x687B, 0x6891,
+ 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33, 0x6B37, 0x6B38, 0x6B91,
+ 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A, 0x6DC0, 0x6DAB, 0x6DB4,
+ 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2, 0x6DB7, 0x6DF6, 0x6DD4,
+ 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6, 0x6DBE, 0x6DE5, 0x6DDC,
+ 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD, 0x6DED, 0x6DF0, 0x6DBA,
+ 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD,
+ 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB, 0x70FA, 0x710D, 0x70F7, 0x7117,
+ 0x70F4, 0x710C, 0x70F0, 0x7104, 0x70F3, 0x7110, 0x70FC, 0x70FF,
+ 0x7106, 0x7113, 0x7100, 0x70F8, 0x70F6, 0x710B, 0x7102, 0x710E,
+ 0x727E, 0x727B, 0x727C, 0x727F, 0x731D, 0x7317, 0x7307, 0x7311,
+ 0x7318, 0x730A, 0x7308, 0x72FF, 0x730F, 0x731E, 0x7388, 0x73F6,
+ 0x73F8, 0x73F5, 0x7404, 0x7401, 0x73FD, 0x7407, 0x7400, 0x73FA,
+ 0x73FC, 0x73FF, 0x740C, 0x740B, 0x73F4, 0x7408, 0x7564, 0x7563,
+ 0x75CE, 0x75D2, 0x75CF, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F,
+ 0x7689, 0x76D3, 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734,
+ 0x7733, 0x773D, 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849,
+ 0x784D, 0x784A, 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967,
+ 0x7969, 0x796A, 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8,
+ 0x79F6, 0x79F7, 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B3B, 0x7B34,
+ 0x7B25, 0x7B30, 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D,
+ 0x7B31, 0x7B2B, 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23,
+ 0x7C94, 0x7C98, 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36,
+ 0x7D3A, 0x7D45, 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F,
+ 0x7D4A, 0x7D3B, 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B,
+ 0x7FCA, 0x7FCB, 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9,
+ 0x801F, 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125,
+ 0x8119, 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115,
+ 0x8127, 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234,
+ 0x8232, 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373,
+ 0x83A4, 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394,
+ 0x83A9, 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B,
+ 0x837E, 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6,
+ 0x8387, 0x83AE, 0x8376, 0x8659, 0x8656, 0x86BF, 0x86B7, 0x86C2,
+ 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9, 0x86B3, 0x86B8,
+ 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD, 0x86BE, 0x8852,
+ 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A, 0x8891, 0x88A1,
+ 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897, 0x88A4, 0x88AC,
+ 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9, 0x89D5, 0x8A30,
+ 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C, 0x8C5D, 0x8C7D,
+ 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2, 0x8DB9, 0x8DBF,
+ 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7, 0x8EE0, 0x8EE1,
+ 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021, 0x90EF, 0x90EA,
+ 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB, 0x90EC, 0x90E9,
+ 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC, 0x91F4, 0x91F1,
+ 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, 0x91EB, 0x91F7, 0x91E8,
+ 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C, 0x966D, 0x966B, 0x9671,
+ 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5, 0x9997, 0x509B, 0x5095,
+ 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083, 0x508C, 0x508E, 0x509D,
+ 0x5068, 0x509C, 0x5092, 0x5082, 0x5087, 0x515F, 0x51D4, 0x5312,
+ 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8, 0x55A5, 0x55AD, 0x5577,
+ 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F, 0x55B5, 0x5581, 0x55A3,
+ 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6, 0x557F, 0x5595, 0x55A1,
+ 0x558E, 0x570C, 0x5829, 0x5837, 0x5819, 0x581E, 0x5827, 0x5823,
+ 0x5828, 0x57F5, 0x5848, 0x5825, 0x581C, 0x581B, 0x5833, 0x583F,
+ 0x5836, 0x582E, 0x5839, 0x5838, 0x582D, 0x582C, 0x583B, 0x5961,
+ 0x5AAF, 0x5A94, 0x5A9F, 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6,
+ 0x5A7C, 0x5AA5, 0x5AAC, 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A,
+ 0x5A97, 0x5A83, 0x5A8B, 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C,
+ 0x5A8F, 0x5A93, 0x5A9D, 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1,
+ 0x5BCA, 0x5BCE, 0x5C0C, 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41,
+ 0x5D4B, 0x5D3F, 0x5D35, 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A,
+ 0x5D52, 0x5D3D, 0x5D31, 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38,
+ 0x5D3C, 0x5D32, 0x5D36, 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58,
+ 0x5FA6, 0x5FA5, 0x5FAB, 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE,
+ 0x60C4, 0x6114, 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113,
+ 0x60F8, 0x60FC, 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110,
+ 0x60FF, 0x6104, 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE,
+ 0x63E5, 0x63E8, 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0,
+ 0x63F6, 0x63D5, 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD,
+ 0x63DC, 0x63C4, 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB,
+ 0x63C8, 0x63F0, 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564,
+ 0x655C, 0x6568, 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0,
+ 0x65D2, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A,
+ 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC,
+ 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6,
+ 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970,
+ 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD,
+ 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD,
+ 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915,
+ 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97,
+ 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC,
+ 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45,
+ 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33,
+ 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, 0x6E68,
+ 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B, 0x6E39,
+ 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64, 0x6E77,
+ 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A, 0x7120,
+ 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125, 0x7122,
+ 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A, 0x7288,
+ 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330, 0x7322,
+ 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323, 0x7335,
+ 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, 0x741A, 0x7421,
+ 0x742D, 0x7431, 0x7424, 0x7423, 0x741D, 0x7429, 0x7420, 0x7432,
+ 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7, 0x75DA, 0x75E1, 0x75E6,
+ 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695, 0x7692, 0x76DA, 0x7746,
+ 0x7747, 0x7744, 0x774D, 0x7745, 0x774A, 0x774E, 0x774B, 0x774C,
+ 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865, 0x785C, 0x786D, 0x7871,
+ 0x786A, 0x786E, 0x7870, 0x7869, 0x7868, 0x785E, 0x7862, 0x7974,
+ 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A, 0x7A03, 0x7A0C, 0x7A04,
+ 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B47, 0x7B44, 0x7B48, 0x7B4C,
+ 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2, 0x7C9E, 0x7CA8, 0x7CA1,
+ 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56, 0x7D67, 0x7D6A, 0x7D4F,
+ 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54, 0x7D69, 0x7D51, 0x7D5F,
+ 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1,
+ 0x7FD7, 0x8051, 0x804F, 0x8050, 0x80FE, 0x80D4, 0x8143, 0x814A,
+ 0x8152, 0x814F, 0x8147, 0x813D, 0x814D, 0x813A, 0x81E6, 0x81EE,
+ 0x81F7, 0x81F8, 0x81F9, 0x8204, 0x823C, 0x823D, 0x823F, 0x8275,
+ 0x833B, 0x83CF, 0x83F9, 0x8423, 0x83C0, 0x83E8, 0x8412, 0x83E7,
+ 0x83E4, 0x83FC, 0x83F6, 0x8410, 0x83C6, 0x83C8, 0x83EB, 0x83E3,
+ 0x83BF, 0x8401, 0x83DD, 0x83E5, 0x83D8, 0x83FF, 0x83E1, 0x83CB,
+ 0x83CE, 0x83D6, 0x83F5, 0x83C9, 0x8409, 0x840F, 0x83DE, 0x8411,
+ 0x8406, 0x83C2, 0x83F3, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA,
+ 0x8413, 0x839A, 0x83C3, 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7,
+ 0x83E2, 0x841B, 0x83DB, 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3,
+ 0x86E3, 0x86DA, 0x86EA, 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9,
+ 0x86D7, 0x86E8, 0x86D1, 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7,
+ 0x88B9, 0x88B8, 0x88C0, 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD,
+ 0x88B2, 0x8901, 0x88C9, 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA,
+ 0x89DB, 0x8A4E, 0x8A4D, 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58,
+ 0x8A44, 0x8A45, 0x8A52, 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F,
+ 0x8C5F, 0x8C81, 0x8C80, 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5,
+ 0x8D84, 0x8D80, 0x8D89, 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6,
+ 0x8DDC, 0x8DCF, 0x8DD5, 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF,
+ 0x8EF7, 0x8EFA, 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7,
+ 0x8EE8, 0x8EF6, 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D,
+ 0x9034, 0x902F, 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108,
+ 0x90F9, 0x90FB, 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161,
+ 0x9164, 0x915F, 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203,
+ 0x921A, 0x9226, 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD,
+ 0x9206, 0x9204, 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217,
+ 0x9205, 0x9216, 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E,
+ 0x9688, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1,
+ 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6,
+ 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE,
+ 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA,
+ 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278,
+ 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA,
+ 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D,
+ 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9,
+ 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849,
+ 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D,
+ 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8,
+ 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, 0x5AB7,
+ 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90, 0x5BD6,
+ 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A, 0x5D65,
+ 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0, 0x5E4F,
+ 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6, 0x5ECB,
+ 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A, 0x612B,
+ 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F, 0x6129,
+ 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5, 0x63F1,
+ 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433, 0x6443,
+ 0x641F, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423, 0x640C,
+ 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642F, 0x640A, 0x641A,
+ 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7, 0x641B, 0x642E, 0x6421,
+ 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686, 0x668C, 0x6695, 0x6690,
+ 0x668B, 0x668A, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966, 0x695F,
+ 0x6938, 0x694E, 0x6962, 0x6971, 0x693F, 0x6945, 0x696A, 0x6939,
+ 0x6942, 0x6957, 0x6959, 0x697A, 0x6948, 0x6949, 0x6935, 0x696C,
+ 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978, 0x6934, 0x6969, 0x6940,
+ 0x696F, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694C, 0x693B,
+ 0x694B, 0x6937, 0x695C, 0x694F, 0x6951, 0x6932, 0x6952, 0x692F,
+ 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43, 0x6B42, 0x6B48, 0x6B41,
+ 0x6B9B, 0x6BFB, 0x6BFC, 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6,
+ 0x6EC8, 0x6E8F, 0x6EC0, 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1,
+ 0x6EB9, 0x6EC6, 0x6ED2, 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7,
+ 0x6EB0, 0x6ECD, 0x6EA6, 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC,
+ 0x6ED8, 0x6E99, 0x6E92, 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF,
+ 0x6EB3, 0x6ED0, 0x6ECA, 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154,
+ 0x7152, 0x7163, 0x7160, 0x7141, 0x715D, 0x7162, 0x7172, 0x7178,
+ 0x716A, 0x7161, 0x7142, 0x7158, 0x7143, 0x714B, 0x7170, 0x715F,
+ 0x7150, 0x7153, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C,
+ 0x7291, 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340,
+ 0x734A, 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457,
+ 0x7440, 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454,
+ 0x74E1, 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983,
+ 0x75EF, 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8,
+ 0x7610, 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5,
+ 0x76DD, 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769,
+ 0x7767, 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894,
+ 0x788F, 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879,
+ 0x7899, 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979,
+ 0x7A11, 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13,
+ 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64,
+ 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70,
+ 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88,
+ 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B,
+ 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D,
+ 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB,
+ 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B,
+ 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, 0x8144,
+ 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84F1,
+ 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D, 0x8465, 0x8451,
+ 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D, 0x845A, 0x8459,
+ 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437, 0x843A, 0x8434,
+ 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83D9, 0x844B,
+ 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439, 0x844E, 0x844C,
+ 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447, 0x8436, 0x8433,
+ 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454, 0x846E, 0x8450,
+ 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6, 0x86F5, 0x874D,
+ 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D, 0x8705, 0x88D6,
+ 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA, 0x88CC, 0x88D0,
+ 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, 0x89E1, 0x89E0, 0x89E2,
+ 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F, 0x8A61, 0x8A3F, 0x8A77,
+ 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81, 0x8A74, 0x8A7A, 0x8C3C,
+ 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66, 0x8C86, 0x8C84, 0x8C85,
+ 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C, 0x8D8E, 0x8D8F, 0x8D8D,
+ 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0, 0x8DE0, 0x8DEC, 0x8DF1,
+ 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2, 0x8DE7, 0x8DF2, 0x8DEB,
+ 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00, 0x8F05, 0x8F07, 0x8F08,
+ 0x8F02, 0x8F0B, 0x9052, 0x903F, 0x9044, 0x9049, 0x903D, 0x9110,
+ 0x910D, 0x910F, 0x9111, 0x9116, 0x9114, 0x910B, 0x910E, 0x916E,
+ 0x916F, 0x9248, 0x9252, 0x9230, 0x923A, 0x9266, 0x9233, 0x9265,
+ 0x925E, 0x9283, 0x922E, 0x924A, 0x9246, 0x926D, 0x926C, 0x924F,
+ 0x9260, 0x9267, 0x926F, 0x9236, 0x9261, 0x9270, 0x9231, 0x9254,
+ 0x9263, 0x9250, 0x9272, 0x924E, 0x9253, 0x924C, 0x9256, 0x9232,
+ 0x959F, 0x959C, 0x959E, 0x959B, 0x9692, 0x9693, 0x9691, 0x9697,
+ 0x96CE, 0x96FA, 0x96FD, 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778,
+ 0x9772, 0x980F, 0x980D, 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF,
+ 0x99B2, 0x99B0, 0x99B5, 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED,
+ 0x9CE7, 0x9E80, 0x9EFD, 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3,
+ 0x50DB, 0x50EA, 0x50DD, 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF,
+ 0x50E3, 0x50E0, 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330,
+ 0x53AC, 0x5627, 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C,
+ 0x5601, 0x5613, 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9,
+ 0x5889, 0x587C, 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874,
+ 0x588B, 0x587A, 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888,
+ 0x587B, 0x5894, 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5,
+ 0x5AD5, 0x5AEA, 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0,
+ 0x5ADB, 0x5AEC, 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77,
+ 0x5BE0, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A,
+ 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D,
+ 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7,
+ 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43,
+ 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173,
+ 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A,
+ 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227,
+ 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472,
+ 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E,
+ 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C,
+ 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0,
+ 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, 0x69A0,
+ 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999, 0x698E,
+ 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4, 0x69BD,
+ 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3, 0x6993,
+ 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2, 0x69B5,
+ 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F, 0x6BA0,
+ 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03, 0x6F25,
+ 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19, 0x6F1A,
+ 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, 0x6F36, 0x6F73,
+ 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30, 0x6F3C, 0x6F35, 0x6EEB,
+ 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD, 0x6EF6, 0x6F39, 0x6F1C,
+ 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E, 0x6F08, 0x6F21, 0x7187,
+ 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718F, 0x717B, 0x7186,
+ 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293, 0x7343,
+ 0x734D, 0x7351, 0x734C, 0x7462, 0x7473, 0x7471, 0x7475, 0x7472,
+ 0x7467, 0x746E, 0x7500, 0x7502, 0x7503, 0x757D, 0x7590, 0x7616,
+ 0x7608, 0x760C, 0x7615, 0x7611, 0x760A, 0x7614, 0x76B8, 0x7781,
+ 0x777C, 0x7785, 0x7782, 0x776E, 0x7780, 0x776F, 0x777E, 0x7783,
+ 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8, 0x787E, 0x78AB, 0x789E,
+ 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4, 0x7998, 0x798A, 0x798B,
+ 0x7996, 0x7995, 0x7994, 0x7993, 0x7997, 0x7988, 0x7992, 0x7990,
+ 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F, 0x7A28, 0x7A26, 0x7AA8, 0x7AAB,
+ 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C, 0x7B8A, 0x7B91, 0x7B90, 0x7B96,
+ 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E, 0x7B85, 0x7B98, 0x5284, 0x7B99,
+ 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF, 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7,
+ 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1, 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE,
+ 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC, 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC,
+ 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9, 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2,
+ 0x7FE3, 0x7FE5, 0x7FDE, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186,
+ 0x8183, 0x8187, 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4,
+ 0x84A1, 0x849F, 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB,
+ 0x84B9, 0x84B4, 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0,
+ 0x849D, 0x84A7, 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B,
+ 0x84A9, 0x84AF, 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0,
+ 0x84D7, 0x84D4, 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733,
+ 0x8723, 0x8728, 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719,
+ 0x871B, 0x8743, 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732,
+ 0x872A, 0x872D, 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742,
+ 0x8726, 0x8727, 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7,
+ 0x88E7, 0x88F1, 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6,
+ 0x88FB, 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E,
+ 0x89E9, 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F,
+ 0x8A96, 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96,
+ 0x8E09, 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07,
+ 0x8E06, 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E,
+ 0x8F0D, 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A,
+ 0x9124, 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5,
+ 0x92A4, 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D,
+ 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3, 0x92EE,
+ 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1, 0x928A,
+ 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9, 0x929D,
+ 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D, 0x977A,
+ 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781, 0x977F,
+ 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900, 0x9907,
+ 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2, 0x99BD,
+ 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60, 0x9B61,
+ 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103, 0x5130,
+ 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C, 0x50FD,
+ 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642, 0x564C,
+ 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, 0x565A, 0x5640,
+ 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A, 0x563A, 0x571A,
+ 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF, 0x58AC, 0x58A5,
+ 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7, 0x5AF6, 0x5B03,
+ 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05, 0x5B0F, 0x5C67,
+ 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93, 0x5D95, 0x5DA0,
+ 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D, 0x5E60, 0x5E5C,
+ 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2, 0x618B, 0x6183,
+ 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, 0x619B, 0x6193, 0x61AF,
+ 0x61AD, 0x619F, 0x6192, 0x61AA, 0x61A1, 0x618D, 0x6166, 0x61B3,
+ 0x622D, 0x646E, 0x6470, 0x6496, 0x64A0, 0x6485, 0x6497, 0x649C,
+ 0x648F, 0x648B, 0x648A, 0x648C, 0x64A3, 0x649F, 0x6468, 0x64B1,
+ 0x6498, 0x6576, 0x657A, 0x6579, 0x657B, 0x65B2, 0x65B3, 0x66B5,
+ 0x66B0, 0x66A9, 0x66B2, 0x66B7, 0x66AA, 0x66AF, 0x6A00, 0x6A06,
+ 0x6A17, 0x69E5, 0x69F8, 0x6A15, 0x69F1, 0x69E4, 0x6A20, 0x69FF,
+ 0x69EC, 0x69E2, 0x6A1B, 0x6A1D, 0x69FE, 0x6A27, 0x69F2, 0x69EE,
+ 0x6A14, 0x69F7, 0x69E7, 0x6A40, 0x6A08, 0x69E6, 0x69FB, 0x6A0D,
+ 0x69FC, 0x69EB, 0x6A09, 0x6A04, 0x6A18, 0x6A25, 0x6A0F, 0x69F6,
+ 0x6A26, 0x6A07, 0x69F4, 0x6A16, 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2,
+ 0x6BA6, 0x6C01, 0x6C00, 0x6BFF, 0x6C02, 0x6F41, 0x6F26, 0x6F7E,
+ 0x6F87, 0x6FC6, 0x6F92, 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F,
+ 0x6F85, 0x6F5A, 0x6F96, 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72,
+ 0x6F52, 0x6F50, 0x6F57, 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61,
+ 0x6F6B, 0x6F7D, 0x6F67, 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F,
+ 0x6F95, 0x6F63, 0x6F77, 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B,
+ 0x71B0, 0x71A0, 0x719A, 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E,
+ 0x71A4, 0x71A1, 0x71AA, 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A,
+ 0x7358, 0x7352, 0x735E, 0x735F, 0x7360, 0x735D, 0x735B, 0x7361,
+ 0x735A, 0x7359, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481,
+ 0x747D, 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E,
+ 0x7625, 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628,
+ 0x761B, 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789,
+ 0x7788, 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4,
+ 0x78C8, 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C,
+ 0x79A2, 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7,
+ 0x7BCB, 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5,
+ 0x7CC5, 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7,
+ 0x7DD7, 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0,
+ 0x7DEE, 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB,
+ 0x7FEA, 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F,
+ 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253,
+ 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500,
+ 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C,
+ 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2,
+ 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9,
+ 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E,
+ 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9,
+ 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, 0x8756,
+ 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758, 0x8754, 0x875B,
+ 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D, 0x876A, 0x8750,
+ 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A, 0x876E, 0x875C,
+ 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767, 0x8769, 0x885A,
+ 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918, 0x8919, 0x8906,
+ 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4, 0x89A3, 0x89ED,
+ 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3, 0x8AD1, 0x8AD4,
+ 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5, 0x8AD8, 0x8AC3,
+ 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F, 0x8CE5, 0x8CDF,
+ 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0, 0x8D9C, 0x8DA1,
+ 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E, 0x8E15, 0x8E1B,
+ 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, 0x8E14, 0x8E12, 0x8E18,
+ 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C, 0x8F24, 0x8F18, 0x8F1A,
+ 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073, 0x9070, 0x906F, 0x9067,
+ 0x906B, 0x912F, 0x912B, 0x9129, 0x912A, 0x9132, 0x9126, 0x912E,
+ 0x9185, 0x9186, 0x918A, 0x9181, 0x9182, 0x9184, 0x9180, 0x92D0,
+ 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6, 0x92CF, 0x92F1, 0x92DF,
+ 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC, 0x92EF, 0x92C2, 0x92E8,
+ 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD, 0x92D5, 0x92C9, 0x92E0,
+ 0x92DE, 0x92E7, 0x92D1, 0x92D3, 0x92B5, 0x92E1, 0x9325, 0x92C6,
+ 0x92B4, 0x957C, 0x95AC, 0x95AB, 0x95AE, 0x95B0, 0x96A4, 0x96A2,
+ 0x96D3, 0x9705, 0x9708, 0x9702, 0x975A, 0x978A, 0x978E, 0x9788,
+ 0x97D0, 0x97CF, 0x981E, 0x981D, 0x9826, 0x9829, 0x9828, 0x9820,
+ 0x981B, 0x9827, 0x98B2, 0x9908, 0x98FA, 0x9911, 0x9914, 0x9916,
+ 0x9917, 0x9915, 0x99DC, 0x99CD, 0x99CF, 0x99D3, 0x99D4, 0x99CE,
+ 0x99C9, 0x99D6, 0x99D8, 0x99CB, 0x99D7, 0x99CC, 0x9AB3, 0x9AEC,
+ 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1, 0x9B46, 0x9B43, 0x9B67, 0x9B74,
+ 0x9B71, 0x9B66, 0x9B76, 0x9B75, 0x9B70, 0x9B68, 0x9B64, 0x9B6C,
+ 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF, 0x9CF7, 0x9D07, 0x9D00, 0x9CF9,
+ 0x9CFB, 0x9D08, 0x9D05, 0x9D04, 0x9E83, 0x9ED3, 0x9F0F, 0x9F10,
+ 0x511C, 0x5113, 0x5117, 0x511A, 0x5111, 0x51DE, 0x5334, 0x53E1,
+ 0x5670, 0x5660, 0x566E, 0x5673, 0x5666, 0x5663, 0x566D, 0x5672,
+ 0x565E, 0x5677, 0x571C, 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF,
+ 0x58BA, 0x58C2, 0x58BC, 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21,
+ 0x5B14, 0x5B13, 0x5B10, 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E,
+ 0x5BEF, 0x5DAC, 0x5DB1, 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE,
+ 0x5DAA, 0x5DA8, 0x5DB2, 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68,
+ 0x5E66, 0x5E6F, 0x5EE9, 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B,
+ 0x5FBC, 0x5FBB, 0x619D, 0x61A8, 0x6196, 0x61C5, 0x61B4, 0x61C6,
+ 0x61C1, 0x61CC, 0x61BA, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6,
+ 0x64D0, 0x64CF, 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3,
+ 0x64D9, 0x6533, 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0,
+ 0x66CA, 0x66CB, 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723,
+ 0x6A34, 0x6A66, 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D,
+ 0x6A6D, 0x6A76, 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F,
+ 0x6A41, 0x6A6A, 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69,
+ 0x6A60, 0x6A3C, 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46,
+ 0x6B55, 0x6B54, 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7,
+ 0x6C04, 0x6C03, 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC,
+ 0x6FCE, 0x6FC8, 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8,
+ 0x7004, 0x6FA5, 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF,
+ 0x6FB8, 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0,
+ 0x71C5, 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB,
+ 0x71D4, 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6,
+ 0x71DA, 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C,
+ 0x7365, 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492,
+ 0x7495, 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D,
+ 0x7633, 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A,
+ 0x779D, 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799,
+ 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3, 0x78DB,
+ 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44, 0x7A48,
+ 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE, 0x7BE3,
+ 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9, 0x7BD4,
+ 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2, 0x7CD4,
+ 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C, 0x7E1F,
+ 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22, 0x7E0B,
+ 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43, 0x7F7B,
+ 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C, 0x81B1,
+ 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC, 0x81B4,
+ 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257, 0x8556,
+ 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, 0x8540, 0x8546,
+ 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547, 0x8563, 0x853E,
+ 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555, 0x8567, 0x8560,
+ 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C, 0x8663, 0x8665,
+ 0x8664, 0x87A4, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792, 0x8788,
+ 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785, 0x8790,
+ 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789, 0x891E,
+ 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922, 0x8929,
+ 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, 0x8AE2, 0x8AF2,
+ 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4, 0x8ADF, 0x8AF0, 0x8AC8,
+ 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF, 0x8AFB, 0x8C91, 0x8C92,
+ 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0, 0x8CF3, 0x8D6C, 0x8D6E,
+ 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38, 0x8E40, 0x8E45, 0x8E36,
+ 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F, 0x8EBD, 0x8F36, 0x8F2E,
+ 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34, 0x9076, 0x9079, 0x907B,
+ 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190, 0x9191,
+ 0x918D, 0x918F, 0x9327, 0x931E, 0x9308, 0x931F, 0x9306, 0x930F,
+ 0x937A, 0x9338, 0x933C, 0x931B, 0x9323, 0x9312, 0x9301, 0x9346,
+ 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D, 0x92FA, 0x9313, 0x92F9,
+ 0x92F7, 0x9334, 0x9302, 0x9324, 0x92FF, 0x9329, 0x9339, 0x9335,
+ 0x932A, 0x9314, 0x930C, 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB,
+ 0x9316, 0x95BC, 0x95CD, 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF,
+ 0x95B5, 0x95BD, 0x96A9, 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799,
+ 0x9797, 0x9794, 0x97F0, 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924,
+ 0x991F, 0x9927, 0x9929, 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4,
+ 0x99F0, 0x99E3, 0x99EA, 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4,
+ 0x9ABB, 0x9AF6, 0x9AFA, 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85,
+ 0x9B87, 0x9B7C, 0x9B7E, 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90,
+ 0x9B7A, 0x9B95, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E,
+ 0x9D14, 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F,
+ 0x9E88, 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA,
+ 0x9F12, 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129,
+ 0x52F4, 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E,
+ 0x5682, 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D,
+ 0x5B25, 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E,
+ 0x5B7B, 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x61C3,
+ 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE,
+ 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580,
+ 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89,
+ 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, 0x6A95,
+ 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A, 0x6A85,
+ 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9, 0x6FF4,
+ 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE, 0x6FF2,
+ 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2, 0x71E4,
+ 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2, 0x74AB,
+ 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510, 0x7511,
+ 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647, 0x76A4,
+ 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, 0x77B4, 0x77B1,
+ 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902, 0x78FB, 0x78FC, 0x78FF,
+ 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB, 0x79A8, 0x7A5C,
+ 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE, 0x7AC0, 0x7AC1,
+ 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB, 0x7C0E, 0x7BF4,
+ 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01, 0x7BF8, 0x7BFD,
+ 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8, 0x7E2D, 0x7E3C,
+ 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49, 0x7E40, 0x7E47,
+ 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44, 0x7E3A, 0x7F45,
+ 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C, 0x81BB, 0x81C4,
+ 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9, 0x825B, 0x825A,
+ 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595, 0x85A0, 0x858B,
+ 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, 0x8577, 0x857C, 0x8589,
+ 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E, 0x8596, 0x8586, 0x858D,
+ 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582, 0x8588, 0x8585, 0x8579,
+ 0x8576, 0x8598, 0x8590, 0x859F, 0x8668, 0x87BE, 0x87AA, 0x87AD,
+ 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5, 0x87BC, 0x87AE, 0x87C9,
+ 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF, 0x87C4, 0x87CA, 0x87B4,
+ 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE, 0x87B2, 0x8935, 0x8933,
+ 0x893C, 0x893E, 0x8941, 0x8952, 0x8937, 0x8942, 0x89AD, 0x89AF,
+ 0x89AE, 0x89F2, 0x89F3, 0x8B1E, 0x8B18, 0x8B16, 0x8B11, 0x8B05,
+ 0x8B0B, 0x8B22, 0x8B0F, 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08,
+ 0x8B06, 0x8B1C, 0x8B13, 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71,
+ 0x8C6F, 0x8C95, 0x8C94, 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53,
+ 0x8E50, 0x8E4C, 0x8E47, 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138,
+ 0x919A, 0x91A2, 0x919B, 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0,
+ 0x93A1, 0x9383, 0x93AF, 0x9364, 0x9356, 0x9347, 0x937C, 0x9358,
+ 0x935C, 0x9376, 0x9349, 0x9350, 0x9351, 0x9360, 0x936D, 0x938F,
+ 0x934C, 0x936A, 0x9379, 0x9357, 0x9355, 0x9352, 0x934F, 0x9371,
+ 0x9377, 0x937B, 0x9361, 0x935E, 0x9363, 0x9367, 0x934E, 0x9359,
+ 0x95C7, 0x95C0, 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0,
+ 0x96AC, 0x9720, 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1,
+ 0x979C, 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844,
+ 0x984A, 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A,
+ 0x9933, 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3,
+ 0x99A1, 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6,
+ 0x99FB, 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD,
+ 0x9B01, 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6,
+ 0x9BA1, 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33,
+ 0x9D41, 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30,
+ 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D, 0x7FF5,
+ 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA, 0x9EFB,
+ 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131, 0x512D,
+ 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699, 0x5970,
+ 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8, 0x61DF,
+ 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6, 0x61E9,
+ 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC, 0x6594,
+ 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD, 0x6AE1,
+ 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD, 0x6B5E,
+ 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005, 0x7014,
+ 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7, 0x700A,
+ 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, 0x74B8, 0x74C0,
+ 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2, 0x7514, 0x7513,
+ 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657, 0x765A, 0x76A6,
+ 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x790C, 0x7913, 0x7914, 0x7909,
+ 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC, 0x7A5F, 0x7C1C, 0x7C29,
+ 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D, 0x7C26, 0x7C28, 0x7C22,
+ 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56, 0x7E63, 0x7E58, 0x7E62,
+ 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53, 0x7FB5, 0x7FB3, 0x7FF7,
+ 0x7FF8, 0x8075, 0x81D1, 0x81D2, 0x81D0, 0x825F, 0x825E, 0x85B4,
+ 0x85C6, 0x85C0, 0x85C3, 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7,
+ 0x85C4, 0x85BF, 0x85CB, 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6,
+ 0x85D2, 0x8624, 0x85B8, 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6,
+ 0x87E2, 0x87DB, 0x87EB, 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4,
+ 0x87D4, 0x87DC, 0x87D3, 0x87ED, 0x87D8, 0x87E3, 0x87D7, 0x87D9,
+ 0x8801, 0x87F4, 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C,
+ 0x8946, 0x8950, 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33,
+ 0x8B30, 0x8B35, 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25,
+ 0x8B37, 0x8B26, 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A,
+ 0x8C42, 0x8C75, 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02,
+ 0x8D00, 0x8E5C, 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65,
+ 0x8E67, 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46,
+ 0x8F47, 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8,
+ 0x91A5, 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7,
+ 0x939B, 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6,
+ 0x9395, 0x9388, 0x9399, 0x939F, 0x9380, 0x938D, 0x93B1, 0x9391,
+ 0x93B2, 0x93A4, 0x93A8, 0x93B4, 0x93A3, 0x95D2, 0x95D3, 0x95D1,
+ 0x96B3, 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723,
+ 0x9722, 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA,
+ 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA, 0x9850,
+ 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F, 0x9A0B,
+ 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07, 0x9A06,
+ 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35, 0x9B4A,
+ 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1, 0x9BB5,
+ 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C, 0x9D53,
+ 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C, 0x9D57,
+ 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C, 0x9EDF,
+ 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29, 0x9F28,
+ 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4, 0x56AB,
+ 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD, 0x58DB,
+ 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, 0x5FBF, 0x61FB,
+ 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E, 0x6584, 0x65DE,
+ 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1, 0x6AD9, 0x6ACB,
+ 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD, 0x6ADE, 0x6B60,
+ 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016, 0x702B, 0x7021,
+ 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C, 0x720C, 0x720A,
+ 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6, 0x72A4, 0x72A3, 0x72A1,
+ 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516, 0x7660, 0x77C9, 0x77CA,
+ 0x77C4, 0x77F1, 0x791D, 0x791B, 0x7921, 0x791C, 0x7917, 0x791E,
+ 0x79B0, 0x7A67, 0x7A68, 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B,
+ 0x7CEC, 0x7CEA, 0x7E76, 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F,
+ 0x7E7A, 0x7E72, 0x7E74, 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86,
+ 0x7FB7, 0x7FFD, 0x7FFE, 0x8078, 0x81D7, 0x81D5, 0x820B, 0x8264,
+ 0x8261, 0x8263, 0x85EB, 0x85F1, 0x85ED, 0x85D9, 0x85E1, 0x85E8,
+ 0x85DA, 0x85D7, 0x85EC, 0x85F2, 0x85F8, 0x85D8, 0x85DF, 0x85E3,
+ 0x85DC, 0x85D1, 0x85F0, 0x85E6, 0x85EF, 0x85DE, 0x85E2, 0x8800,
+ 0x87FA, 0x8803, 0x87F6, 0x87F7, 0x8809, 0x880C, 0x880B, 0x8806,
+ 0x87FC, 0x8808, 0x87FF, 0x880A, 0x8802, 0x8962, 0x895A, 0x895B,
+ 0x8957, 0x8961, 0x895C, 0x8958, 0x895D, 0x8959, 0x8988, 0x89B7,
+ 0x89B6, 0x89F6, 0x8B50, 0x8B48, 0x8B4A, 0x8B40, 0x8B53, 0x8B56,
+ 0x8B54, 0x8B4B, 0x8B55, 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43,
+ 0x8C77, 0x8C76, 0x8C9A, 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA,
+ 0x8DAD, 0x8DAB, 0x8E6D, 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B,
+ 0x8EC2, 0x8F52, 0x8F51, 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140,
+ 0x913F, 0x91B0, 0x91AD, 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA,
+ 0x93D0, 0x93F9, 0x93EC, 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA,
+ 0x93D4, 0x93EE, 0x93E3, 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2,
+ 0x93A5, 0x93E7, 0x957D, 0x95DA, 0x95DB, 0x96E1, 0x9729, 0x972B,
+ 0x972C, 0x9728, 0x9726, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE,
+ 0x97DF, 0x985C, 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB,
+ 0x98BE, 0x9948, 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15,
+ 0x9A25, 0x9A1D, 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23,
+ 0x9A1E, 0x9A1C, 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C,
+ 0x9B37, 0x9BEA, 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2,
+ 0x9BF0, 0x9BD4, 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5,
+ 0x9BE1, 0x9BDA, 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71,
+ 0x9D80, 0x9D78, 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74,
+ 0x9D75, 0x9D70, 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F,
+ 0x9D79, 0x9D7F, 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC,
+ 0x9F2D, 0x9F40, 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337,
+ 0x56B2, 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE,
+ 0x5EEF, 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513,
+ 0x65DF, 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8,
+ 0x6AF9, 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037,
+ 0x7034, 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x702A,
+ 0x7040, 0x703B, 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D,
+ 0x737C, 0x74BA, 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE,
+ 0x77CF, 0x77CD, 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924,
+ 0x7929, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48,
+ 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80,
+ 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x8268, 0x8269, 0x8622,
+ 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604, 0x8609,
+ 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813,
+ 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A, 0x8B5D,
+ 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86, 0x8E88,
+ 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A, 0x908D,
+ 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B, 0x9413,
+ 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410, 0x9428,
+ 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E, 0x9416,
+ 0x9412, 0x93FA, 0x9409, 0x93F8, 0x943C, 0x940A, 0x93FF, 0x93FC,
+ 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF, 0x972E,
+ 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862, 0x9863,
+ 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C, 0x994B,
+ 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36, 0x9A29,
+ 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10, 0x9B12,
+ 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8, 0x9C40,
+ 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F, 0x9D99,
+ 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, 0x9DA0, 0x9D94,
+ 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A, 0x9DA2, 0x9DA8, 0x9D9E,
+ 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6, 0x9DA7, 0x9E99, 0x9E9B,
+ 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6, 0x9F30, 0x9F2E, 0x9F5B,
+ 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91, 0x513A, 0x5139, 0x5298,
+ 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48, 0x5B47, 0x5DCB, 0x5DCF,
+ 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC, 0x6B03, 0x6AF8, 0x6B00,
+ 0x7043, 0x7044, 0x704A, 0x7048, 0x7049, 0x7045, 0x7046, 0x721D,
+ 0x721A, 0x7219, 0x737E, 0x7517, 0x766A, 0x77D0, 0x792D, 0x7931,
+ 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A, 0x7E87, 0x7E88, 0x7E8B,
+ 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030, 0x81DD, 0x8618, 0x862A,
+ 0x8626, 0x861F, 0x8623, 0x861C, 0x8619, 0x8627, 0x862E, 0x8621,
+ 0x8620, 0x8629, 0x861E, 0x8625, 0x8829, 0x881D, 0x881B, 0x8820,
+ 0x8824, 0x881C, 0x882B, 0x884A, 0x896D, 0x8969, 0x896E, 0x896B,
+ 0x89FA, 0x8B79, 0x8B78, 0x8B45, 0x8B7A, 0x8B7B, 0x8D10, 0x8D14,
+ 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E, 0x8F5B, 0x8F5D, 0x9146, 0x9144,
+ 0x9145, 0x91B9, 0x943F, 0x943B, 0x9436, 0x9429, 0x943D, 0x9430,
+ 0x9439, 0x942A, 0x9437, 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4,
+ 0x95E3, 0x9735, 0x973A, 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6,
+ 0x98C0, 0x9958, 0x9956, 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42,
+ 0x9A41, 0x9A3A, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16,
+ 0x9B3A, 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28,
+ 0x9C29, 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7,
+ 0x9DCA, 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE,
+ 0x9DB9, 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3,
+ 0x9DCD, 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B,
+ 0x9F18, 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9,
+ 0x56C6, 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1,
+ 0x5EF2, 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09,
+ 0x6C0D, 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9,
+ 0x737F, 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935,
+ 0x79B4, 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A,
+ 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634,
+ 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826,
+ 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84,
+ 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A,
+ 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C,
+ 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449,
+ 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B,
+ 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, 0x9A49,
+ 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B, 0x9B56, 0x9B55,
+ 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33, 0x9C41, 0x9C3C,
+ 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB, 0x9DD2, 0x9DDE,
+ 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF, 0x9DE9, 0x9DD9,
+ 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6, 0x9EF0, 0x9F35,
+ 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2, 0x513D, 0x5299,
+ 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F, 0x5F4F, 0x6201,
+ 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB, 0x6B11, 0x6B12,
+ 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382, 0x7381, 0x7383,
+ 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C, 0x863A, 0x8640,
+ 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830, 0x8832, 0x882E,
+ 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, 0x8B8C, 0x8B8E, 0x8B8B,
+ 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64, 0x8F63, 0x91BC, 0x9462,
+ 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4, 0x97C5, 0x9800, 0x9A56,
+ 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52, 0x9C58, 0x9C50, 0x9C4A,
+ 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C, 0x9C4E, 0x9DFB, 0x9DF7,
+ 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4, 0x9DF6, 0x9DE1, 0x9DEE,
+ 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC, 0x9DF4, 0x9DF3, 0x9DE8,
+ 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3, 0x9F06, 0x9F1C, 0x9F38,
+ 0x9F37, 0x9F36, 0x9F43, 0x9F4F, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F,
+ 0x56D3, 0x56CD, 0x5B4E, 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13,
+ 0x705F, 0x7061, 0x705D, 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5,
+ 0x7938, 0x79B7, 0x79B6, 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643,
+ 0x8838, 0x8837, 0x8835, 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F,
+ 0x8EA0, 0x8E9D, 0x91BE, 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469,
+ 0x96E5, 0x9746, 0x9743, 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5,
+ 0x9B59, 0x9C63, 0x9C67, 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02,
+ 0x9DFE, 0x9E07, 0x9E03, 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09,
+ 0x9DFF, 0x9DFD, 0x9E04, 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75,
+ 0x9F76, 0x56D4, 0x652E, 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A,
+ 0x7062, 0x7226, 0x72AA, 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B,
+ 0x7CF6, 0x7E9A, 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646,
+ 0x8647, 0x8648, 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98,
+ 0x8B99, 0x8EA5, 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471,
+ 0x9473, 0x9749, 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B,
+ 0x9E0D, 0x9E10, 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09,
+ 0x9F47, 0x9F78, 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F,
+ 0x883C, 0x8DB2, 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475,
+ 0x9A60, 0x9B2E, 0x9C74, 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13,
+ 0x9EF6, 0x9F0A, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E,
+ 0x883D, 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873,
+ 0x9874, 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24,
+ 0x9E15, 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8,
+ 0x9482, 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9E19, 0x864B, 0x8B9F,
+ 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D, 0x7069,
+ 0x706A, 0x7229, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, 0xFE19, 0x223C,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0xFE33,
+ 0x2574, 0xFE34, 0xFE4F, 0x0308, 0xFF3E, 0x30FD, 0x30FE, 0x309D,
+ 0x309E, 0xFFFD, 0x3005, 0x3006, 0x3007, 0x30FC, 0xFF3B, 0xFF3D,
+ 0x273D, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
+ 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC,
+ 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4,
+ 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC,
+ 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4,
+ 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC,
+ 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4,
+ 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC,
+ 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4,
+ 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+ 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4,
+ 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
+ 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+ 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,
+ 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,
+ 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,
+ 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
+ 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,
+ 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
+ 0x044C, 0x044D, 0x044E, 0x044F, 0x21E7, 0x21B8, 0x21B9, 0x4E41,
+ 0x0000, 0x4E5A, 0x0000, 0x5202, 0x4491, 0x9FB0, 0x5188, 0x9FB1,
+ 0x0000, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0x00AC, 0xFFE4, 0xFF07, 0xFF02, 0x3231, 0x2116, 0x2121,
+ 0x7881, 0x92B9, 0x88CF, 0x58BB, 0x6052, 0x7CA7, 0x5AFA, 0x2554,
+ 0x2566, 0x2557, 0x2560, 0x256C, 0x2563, 0x255A, 0x2569, 0x255D,
+ 0x2552, 0x2564, 0x2555, 0xFFFD, 0xFFFD, 0xFFFD, 0x2558, 0x2567,
+ 0x255B, 0x2553, 0x2565, 0x2556, 0x255F, 0x256B, 0x2562, 0x2559,
+ 0x2568, 0x255C, 0x2551, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x2593, 0xFFFD, 0xFFFD, 0xFE10, 0xFE11, 0xFE12, 0xFFFD, 0xFE14,
+ 0xFE13, 0xFE16, 0xFE15, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0xFFFD, 0xFFFD, 0xFFFD, 0x0000, 0x57BE, 0x0000, 0x713E, 0x0000,
+ 0x69A2, 0x0000, 0x5B74, 0x7A49, 0x0000, 0x0000, 0x7A65, 0x7A7D,
+ 0x0000, 0x7ABB, 0x7AB0, 0x7AC2, 0x7AC3, 0x71D1, 0x0000, 0x41CA,
+ 0x7ADA, 0x7ADD, 0x7AEA, 0x41EF, 0x54B2, 0x0000, 0x7B0B, 0x7B55,
+ 0x7B29, 0x0000, 0x0000, 0x7BA2, 0x7B6F, 0x839C, 0x0000, 0x0000,
+ 0x7BD0, 0x8421, 0x7B92, 0xFFFD, 0x0000, 0xFFFD, 0x8492, 0x7BFA,
+ 0xFFFD, 0x7C35, 0x0000, 0x7C44, 0x7C83, 0x0000, 0x7CA6, 0x0000,
+ 0x7CC9, 0x7CC7, 0x7CE6, 0xFFFD, 0x7CF3, 0x7CF5, 0x7E67, 0x451D,
+ 0x0000, 0x7D5D, 0x0000, 0x7D89, 0x7DAB, 0x7135, 0x7DB3, 0x7DD6,
+ 0x0000, 0x0000, 0x7DE4, 0x3D13, 0x7DF5, 0x0000, 0x7DE5, 0x0000,
+ 0xFFFD, 0x0000, 0x0000, 0x7E6E, 0xFFFD, 0x432B, 0x946C, 0x7E27,
+ 0x7F40, 0x7F41, 0x7F47, 0x7936, 0x0000, 0x99E1, 0x7F97, 0x0000,
+ 0x7FA3, 0x0000, 0x0000, 0x455C, 0x0000, 0x0000, 0x7FFA, 0x0000,
+ 0xFA5B, 0x8008, 0x801D, 0xFFFD, 0x802F, 0x0000, 0x0000, 0x803B,
+ 0x803C, 0x8061, 0x0000, 0x4989, 0x0000, 0x0000, 0x0000, 0x6725,
+ 0x80A7, 0x0000, 0x8107, 0x811A, 0x58B0, 0x0000, 0x6C7F, 0x0000,
+ 0x64E7, 0x0000, 0x8218, 0x0000, 0x6A53, 0x0000, 0x0000, 0x447A,
+ 0x8229, 0x0000, 0x0000, 0x4FF9, 0x0000, 0x84E2, 0x8362, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x82AA, 0x691B, 0x0000, 0x41DB,
+ 0x854B, 0x82D0, 0x831A, 0x0000, 0x0000, 0x36C1, 0x0000, 0x0000,
+ 0x827B, 0x82E2, 0x8318, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3DBF, 0x831D, 0x55EC, 0x8385, 0x450B, 0x0000, 0x83AC, 0xFFFD,
+ 0x83D3, 0x0000, 0x6A57, 0x855A, 0x3496, 0x0000, 0x8458, 0x0000,
+ 0x8471, 0x3DD3, 0x44E4, 0x6AA7, 0x844A, 0x7958, 0xFFFD, 0x0000,
+ 0x0000, 0x0000, 0x84DE, 0xFFFD, 0x8391, 0x44A0, 0x8493, 0x84E4,
+ 0x0000, 0x4240, 0x0000, 0x4543, 0x8534, 0x5AF2, 0x4523, 0x4527,
+ 0x8573, 0x4516, 0x67BF, 0x8616, 0x0000, 0x0000, 0x85C1, 0x0000,
+ 0x8602, 0x0000, 0x0000, 0x0000, 0x456A, 0x8628, 0x3648, 0x0000,
+ 0x53F7, 0x0000, 0x867E, 0xFFFD, 0x0000, 0x87EE, 0x0000, 0x87B1,
+ 0x87DA, 0x880F, 0x5661, 0x866C, 0x6856, 0x460F, 0x8845, 0x8846,
+ 0x0000, 0x0000, 0x0000, 0x885E, 0x889C, 0x465B, 0x88B4, 0x88B5,
+ 0x88C5, 0x0000, 0x8987, 0xFFFD, 0xFFFD, 0xFFFD, 0x89A7, 0x89BC,
+ 0x0000, 0x89E7, 0x0000, 0x0000, 0x8A9C, 0x7793, 0x91FE, 0x8A90,
+ 0x0000, 0x7AE9, 0x0000, 0x4713, 0x0000, 0x717C, 0x8B0C, 0x8B1F,
+ 0x0000, 0x0000, 0x8B3F, 0xFFFD, 0x8B4D, 0x8AA9, 0x0000, 0x8B90,
+ 0x8B9B, 0x8AAF, 0x0000, 0x4615, 0x884F, 0x8C9B, 0x0000, 0x0000,
+ 0x0000, 0x3725, 0x0000, 0x8CD6, 0x0000, 0x0000, 0x8D12, 0x8D03,
+ 0x0000, 0x8CDB, 0x705C, 0x8D11, 0x3ED0, 0x0000, 0x8DA9, 0x0000,
+ 0x0000, 0x0000, 0x3B7C, 0x0000, 0x0000, 0x7AE7, 0x8EAD, 0x8EB6,
+ 0x8EC3, 0x92D4, 0x8F19, 0x8F2D, 0x0000, 0x0000, 0x8FA5, 0x9303,
+ 0x0000, 0x0000, 0x8FB3, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5EF8,
+ 0x0000, 0x8FF9, 0xFFFD, 0x0000, 0x3980, 0x0000, 0x9037, 0x0000,
+ 0x0000, 0x9061, 0x0000, 0x0000, 0x90A8, 0x0000, 0x90C4, 0x0000,
+ 0x90AE, 0xFA26, 0x9167, 0x91A9, 0x91C4, 0x7CAC, 0x0000, 0x0000,
+ 0x920E, 0x6C9F, 0x9241, 0x9262, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x932C, 0x936B, 0x0000, 0x0000, 0x5AC3, 0x0000,
+ 0x0000, 0x4965, 0x9244, 0x0000, 0x0000, 0x0000, 0x9373, 0x945B,
+ 0x8EBC, 0x9585, 0x95A6, 0x9426, 0x95A0, 0x6FF6, 0x42B9, 0x0000,
+ 0x0000, 0x0000, 0x49DF, 0x6C1C, 0x967B, 0x9696, 0x416C, 0x96A3,
+ 0x0000, 0x61DA, 0xE4AD, 0x78F5, 0x0000, 0x96BD, 0x53CC, 0x49A1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9731, 0x8642, 0x9736, 0x4A0F, 0x453D, 0x4585, 0x0000, 0x7075,
+ 0x5B41, 0x971B, 0xFFFD, 0x0000, 0x9757, 0x5B4A, 0x0000, 0x975F,
+ 0x9425, 0x50D0, 0x0000, 0x0000, 0x9789, 0x979F, 0x97B1, 0x97BE,
+ 0x97C0, 0x97D2, 0x97E0, 0x0000, 0x97EE, 0x741C, 0x0000, 0xFFFD,
+ 0x97F5, 0x0000, 0x0000, 0x4AD1, 0x9834, 0x9833, 0x984B, 0x9866,
+ 0x3B0E, 0x0000, 0x3D51, 0x0000, 0x0000, 0x0000, 0x98CA, 0x98B7,
+ 0x98C8, 0x98C7, 0x4AFF, 0x0000, 0x0000, 0x55B0, 0x98E1, 0x98E6,
+ 0x98EC, 0x9378, 0x9939, 0x0000, 0x4B72, 0x0000, 0x0000, 0x99F5,
+ 0x9A0C, 0x9A3B, 0x9A10, 0x9A58, 0x0000, 0x36C4, 0x0000, 0x0000,
+ 0x9AE0, 0x9AE2, 0x0000, 0x9AF4, 0x4C0E, 0x9B14, 0x9B2D, 0x0000,
+ 0x5034, 0x9B34, 0x38C3, 0x0000, 0x9B50, 0x9B40, 0x0000, 0x5A45,
+ 0x0000, 0x9B8E, 0x9C02, 0x9BFF, 0x9C0C, 0x0000, 0x9DD4, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D7E, 0x9D83, 0x0000,
+ 0x9E0E, 0x9DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x9D39, 0x0000,
+ 0x0000, 0x9E90, 0x9E95, 0x9E9E, 0x9EA2, 0x4D34, 0x9EAA, 0x9EAF,
+ 0x0000, 0x9EC1, 0x3B60, 0x39E5, 0x3D1D, 0x4F32, 0x37BE, 0x0000,
+ 0x9F02, 0x9F08, 0x4B96, 0x9424, 0x0000, 0x9F17, 0x0000, 0x9F39,
+ 0x569F, 0x568A, 0x9F45, 0x99B8, 0x0000, 0x97F2, 0x847F, 0xFFFD,
+ 0x9F69, 0x7ADC, 0x9F8E, 0x7216, 0x4BBE, 0x0000, 0x0000, 0x7177,
+ 0x0000, 0x0000, 0x0000, 0x739E, 0x0000, 0x0000, 0x799F, 0x0000,
+ 0x0000, 0x9369, 0x93F3, 0x0000, 0x92EC, 0x9381, 0x93CB, 0x0000,
+ 0x0000, 0x7217, 0x3EEB, 0x7772, 0x7A43, 0x70D0, 0x0000, 0x0000,
+ 0x717E, 0x0000, 0x70A3, 0x0000, 0x0000, 0x3EC7, 0x0000, 0x0000,
+ 0x0000, 0x3722, 0x0000, 0x0000, 0x36E1, 0x0000, 0x0000, 0x0000,
+ 0x3723, 0x0000, 0x575B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8503, 0x0000, 0xFFFD, 0x8455, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x44F4, 0x0000, 0x0000, 0x0000, 0x67F9, 0x3733,
+ 0x3C15, 0x3DE7, 0x586C, 0x0000, 0x6810, 0x4057, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x54CB, 0x569E, 0x0000, 0x5692, 0x0000,
+ 0x0000, 0x0000, 0xFFFD, 0x0000, 0x939C, 0x4EF8, 0x512B, 0x3819,
+ 0x0000, 0x4EBC, 0x0000, 0xFFFD, 0x4F4B, 0x4F8A, 0x0000, 0x5A68,
+ 0x0000, 0x0000, 0x3999, 0x0000, 0x0000, 0x3435, 0x4F29, 0x0000,
+ 0x0000, 0x0000, 0x8ADA, 0x0000, 0x4E98, 0x50CD, 0x510D, 0x4FA2,
+ 0x4F03, 0x0000, 0x0000, 0x4F42, 0x502E, 0x506C, 0x5081, 0x4FCC,
+ 0x4FE5, 0x5058, 0x50FC, 0x6E76, 0x0000, 0x0000, 0x0000, 0x6D72,
+ 0x0000, 0x0000, 0x51A8, 0x51C3, 0x0000, 0x44DD, 0x0000, 0x0000,
+ 0x0000, 0x8D7A, 0x0000, 0x0000, 0x5259, 0x52A4, 0x0000, 0x52E1,
+ 0xFFFD, 0x467A, 0x718C, 0x0000, 0x0000, 0x0000, 0x0000, 0x69D1,
+ 0x0000, 0xFFFD, 0x3EDE, 0x7499, 0x7414, 0x7456, 0x7398, 0x4B8E,
+ 0x0000, 0x0000, 0x53D0, 0x3584, 0x720F, 0x0000, 0x55B4, 0x0000,
+ 0x54CD, 0x0000, 0x571D, 0x925D, 0x96F4, 0x57DD, 0x578D, 0x577F,
+ 0x363E, 0x58CB, 0x5A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x5A2C,
+ 0x59B8, 0x5A7E, 0x5ACF, 0x5A12, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x36F5, 0x6D05, 0x7443, 0x5A21, 0x0000, 0x5A81, 0x0000, 0x0000,
+ 0x93E0, 0x748C, 0x0000, 0x7105, 0x4972, 0x9408, 0x0000, 0x93BD,
+ 0x37A0, 0x5C1E, 0x5C9E, 0x5E5E, 0x5E48, 0x0000, 0x0000, 0x0000,
+ 0x5ECD, 0x5B4F, 0x0000, 0x0000, 0x3701, 0x0000, 0x36DD, 0x0000,
+ 0x36D3, 0x812A, 0x0000, 0x0000, 0x0000, 0x0000, 0x5F0C, 0x5F0E,
+ 0x0000, 0x0000, 0x5A6B, 0x0000, 0x5B44, 0x0000, 0x8860, 0x607E,
+ 0x0000, 0x0000, 0x5FDB, 0x3EB8, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x61C0, 0x0000, 0x0000, 0x0000, 0x6199, 0x6198, 0x6075, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6471, 0x0000, 0x0000, 0x3A29, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x6337, 0x64B6, 0x6331, 0x63D1, 0x0000,
+ 0x0000, 0x62A4, 0x0000, 0x643B, 0x656B, 0x6972, 0x3BF4, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x550D, 0x0000, 0x0000, 0x0000, 0x66CE,
+ 0x0000, 0x0000, 0x3AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x78EE, 0x0000, 0x0000, 0x0000, 0x3464, 0x0000, 0x0000,
+ 0x0000, 0x668E, 0x0000, 0x666B, 0x4B93, 0x6630, 0x0000, 0x0000,
+ 0x6663, 0x0000, 0x0000, 0x661E, 0x0000, 0x38D1, 0x0000, 0x0000,
+ 0x3B99, 0x0000, 0x0000, 0x74D0, 0x3B96, 0x0000, 0x68B6, 0xFFFD,
+ 0x3BC4, 0x6ABE, 0x0000, 0x0000, 0x6A33, 0x6A52, 0x6AC9, 0x6B05,
+ 0x0000, 0x6511, 0x6898, 0x6A4C, 0x3BD7, 0x6A7A, 0x6B57, 0x0000,
+ 0x0000, 0x93A0, 0x92F2, 0x0000, 0x0000, 0x9289, 0x0000, 0x0000,
+ 0x9467, 0x6DA5, 0x6F0B, 0xFFFD, 0x0000, 0x3D8F, 0x6E04, 0x0000,
+ 0x5A3D, 0x6E0A, 0x5847, 0x6D24, 0x7842, 0x713B, 0x0000, 0x0000,
+ 0x70F1, 0x7250, 0x7287, 0x7294, 0x0000, 0x0000, 0x5179, 0x0000,
+ 0x0000, 0x747A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F06,
+ 0x3EB1, 0x0000, 0x0000, 0x0000, 0x60A7, 0x3EF3, 0x74CC, 0x743C,
+ 0x9387, 0x7437, 0x449F, 0x0000, 0x4551, 0x7583, 0x3F63, 0x0000,
+ 0x0000, 0x3F58, 0x7555, 0x7673, 0x0000, 0xFFFD, 0x7468, 0x0000,
+ 0x0000, 0x0000, 0x3AFB, 0x3DCD, 0x0000, 0x3EFF, 0x0000, 0x0000,
+ 0x91FA, 0x5732, 0x9342, 0x0000, 0x0000, 0x50DF, 0x0000, 0x0000,
+ 0x7778, 0x0000, 0x770E, 0x770F, 0x777B, 0x0000, 0x0000, 0x3A5E,
+ 0x0000, 0x7438, 0x749B, 0x3EBF, 0x0000, 0x0000, 0x40C8, 0x0000,
+ 0x0000, 0x9307, 0x0000, 0x781E, 0x788D, 0x7888, 0x78D2, 0x73D0,
+ 0x7959, 0x0000, 0x0000, 0x410E, 0xFFFD, 0xFFFD, 0x79A5, 0x6A2D,
+ 0x0000, 0x7A3A, 0x79F4, 0x416E, 0x0000, 0x4132, 0x9235, 0x79F1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3597, 0x556B, 0x3570,
+ 0x36AA, 0x0000, 0x0000, 0x7AE2, 0x5A59, 0x0000, 0x0000, 0x0000,
+ 0x5A0D, 0x0000, 0x78F0, 0x5A2A, 0x0000, 0x7AFE, 0x41F9, 0x7C5D,
+ 0x7C6D, 0x4211, 0x0000, 0x0000, 0x0000, 0x7CCD, 0x0000, 0x0000,
+ 0x7C8E, 0x7C7C, 0x7CAE, 0x6AB2, 0x7DDC, 0x7E07, 0x7DD3, 0x7F4E,
+ 0x0000, 0x0000, 0x0000, 0x7D97, 0x0000, 0x426A, 0x0000, 0x0000,
+ 0x67D6, 0x0000, 0x0000, 0x57C4, 0x0000, 0x0000, 0x7FDD, 0x7B27,
+ 0x0000, 0x0000, 0x0000, 0x7B0C, 0x0000, 0x99E6, 0x8645, 0x9A63,
+ 0x6A1C, 0x0000, 0x0000, 0x0000, 0x9A1F, 0x0000, 0x8495, 0x0000,
+ 0x0000, 0x44EA, 0x8137, 0x4402, 0x80C6, 0x8109, 0x8142, 0x0000,
+ 0x98C3, 0x0000, 0x8262, 0x8265, 0x0000, 0x8453, 0x0000, 0x8610,
+ 0x0000, 0x5A86, 0x417F, 0x0000, 0x5B2B, 0x0000, 0x5AE4, 0x0000,
+ 0x86A0, 0x0000, 0x0000, 0x882D, 0x0000, 0x5A02, 0x886E, 0x4F45,
+ 0x8887, 0x88BF, 0x88E6, 0x8965, 0x894D, 0x0000, 0x8954, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3EAD, 0x84A3, 0x46F5,
+ 0x46CF, 0x37F2, 0x8A3D, 0x8A1C, 0x0000, 0x5F4D, 0x922B, 0x0000,
+ 0x65D4, 0x7129, 0x70C4, 0x0000, 0x9D6D, 0x8C9F, 0x8CE9, 0x0000,
+ 0x599A, 0x77C3, 0x59F0, 0x36D4, 0x8E2A, 0x8EA7, 0x0000, 0x8F30,
+ 0x8F4A, 0x42F4, 0x6C58, 0x6FBB, 0x0000, 0x489B, 0x6F79, 0x6E8B,
+ 0x0000, 0x9BE9, 0x36B5, 0x0000, 0x90BB, 0x48B4, 0x5571, 0x4906,
+ 0x91BB, 0x9404, 0x0000, 0x4062, 0x0000, 0x9427, 0x0000, 0x0000,
+ 0x84E5, 0x8A2B, 0x9599, 0x95A7, 0x9597, 0x9596, 0x0000, 0x7445,
+ 0x3EC2, 0x0000, 0x0000, 0x0000, 0x3EE7, 0x0000, 0x968F, 0x0000,
+ 0x0000, 0x0000, 0x3ECC, 0x0000, 0x0000, 0x0000, 0x7412, 0x746B,
+ 0x3EFC, 0x9741, 0x0000, 0x6847, 0x4A1D, 0x0000, 0x0000, 0xFFFD,
+ 0x9368, 0x0000, 0x0000, 0x0000, 0x0000, 0x92BA, 0x5B11, 0x8B69,
+ 0x493C, 0x73F9, 0x0000, 0x979B, 0xFFFD, 0x9938, 0x0000, 0x5DC1,
+ 0x0000, 0x0000, 0x981F, 0x0000, 0x92F6, 0x0000, 0x91E5, 0x44C0,
+ 0x0000, 0x0000, 0x0000, 0x98DC, 0x0000, 0x3F00, 0x922A, 0x4925,
+ 0x8414, 0x993B, 0x994D, 0x0000, 0x3DFD, 0xFFFD, 0x4B6F, 0x99AA,
+ 0x9A5C, 0x0000, 0x0000, 0x6A8F, 0x9A21, 0x5AFE, 0x9A2F, 0x0000,
+ 0x4B90, 0x0000, 0x99BC, 0x4BBD, 0x4B97, 0x937D, 0x5872, 0x0000,
+ 0x5822, 0x0000, 0x0000, 0x7844, 0x0000, 0x0000, 0x68C5, 0x3D7D,
+ 0x9458, 0x3927, 0x6150, 0x0000, 0x0000, 0x6107, 0x9C4F, 0x9C53,
+ 0x9C7B, 0x9C35, 0x9C10, 0x9B7F, 0x9BCF, 0x0000, 0x9B9F, 0x0000,
+ 0x0000, 0x9D21, 0x4CAE, 0x0000, 0x9E18, 0x4CB0, 0x9D0C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9DA5, 0x84BD, 0x0000, 0x0000, 0x0000,
+ 0x85FC, 0x4533, 0x0000, 0x0000, 0x0000, 0x8420, 0x85EE, 0x0000,
+ 0x0000, 0x0000, 0x79E2, 0x0000, 0x0000, 0x0000, 0x3D62, 0x93DB,
+ 0x92BE, 0x9348, 0x0000, 0x78B9, 0x9277, 0x944D, 0x4FE4, 0x3440,
+ 0x9064, 0x0000, 0x783D, 0x7854, 0x78B6, 0x784B, 0x0000, 0x0000,
+ 0x0000, 0x369A, 0x4F72, 0x6FDA, 0x6FD9, 0xFFFD, 0x701E, 0x5414,
+ 0x0000, 0x57BB, 0x58F3, 0x578A, 0x9D16, 0x57D7, 0x7134, 0x34AF,
+ 0x0000, 0x71EB, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x610C,
+ 0x5ACE, 0x5A0B, 0x42BC, 0x0000, 0x372C, 0x4B7B, 0x0000, 0x93BB,
+ 0x93B8, 0x0000, 0x0000, 0x8472, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x5994, 0x0000, 0x0000, 0x7DA8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x92E5, 0x73E2, 0x3EE9, 0x74B4, 0x0000, 0x0000,
+ 0x3EE1, 0x0000, 0x6AD8, 0x73F3, 0x73FB, 0x3ED6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7448, 0x0000, 0x70A5,
+ 0x0000, 0x9284, 0x73E6, 0x935F, 0x0000, 0x9331, 0x0000, 0x0000,
+ 0x9386, 0x0000, 0x0000, 0x4935, 0x0000, 0x716B, 0x0000, 0x0000,
+ 0x56A4, 0x0000, 0x0000, 0x0000, 0x5502, 0x79C4, 0x0000, 0x7DFE,
+ 0x0000, 0x0000, 0x0000, 0x452E, 0x9401, 0x370A, 0x0000, 0x0000,
+ 0x59B0, 0x0000, 0x0000, 0x0000, 0x5AA1, 0x36E2, 0x0000, 0x36B0,
+ 0x925F, 0x5A79, 0x0000, 0x0000, 0x9374, 0x3CCD, 0x0000, 0x4A96,
+ 0x398A, 0x50F4, 0x3D69, 0x3D4C, 0x0000, 0x7175, 0x42FB, 0x0000,
+ 0x6E0F, 0x0000, 0x44EB, 0x6D57, 0x0000, 0x7067, 0x6CAF, 0x3CD6,
+ 0x0000, 0x0000, 0x6E02, 0x6F0C, 0x3D6F, 0x0000, 0x7551, 0x36BC,
+ 0x34C8, 0x4680, 0x3EDA, 0x4871, 0x59C4, 0x926E, 0x493E, 0x8F41,
+ 0x0000, 0x0000, 0x5812, 0x57C8, 0x36D6, 0x0000, 0x70FE, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x68B9, 0x6967, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x6A1A, 0x0000,
+ 0x0000, 0x843E, 0x44DF, 0x44CE, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0xFFFD, 0xFFFD, 0x833D, 0x0000, 0x83ED, 0x0000, 0x0000, 0x0000,
+ 0x5989, 0x5A82, 0x0000, 0x5A61, 0x5A71, 0x0000, 0x0000, 0x372D,
+ 0x59EF, 0x0000, 0x36C7, 0x718E, 0x9390, 0x669A, 0x0000, 0x5A6E,
+ 0x5A2B, 0x0000, 0x6A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x711D,
+ 0x0000, 0x0000, 0x4FB0, 0x0000, 0x5CC2, 0x0000, 0x0000, 0x0000,
+ 0x6A0C, 0x0000, 0x0000, 0xFFFD, 0x7133, 0x0000, 0x3DA5, 0x6CDF,
+ 0x0000, 0x59EB, 0x5F5C, 0x0000, 0x7CD3, 0x0000, 0x0000, 0x0000,
+ 0x906C, 0x81F6, 0x770C, 0x6CA2, 0x56FD, 0x5869, 0x6761, 0x5C5E,
+ 0x58F2, 0x70B9, 0x6803, 0x8FBB, 0x8FBC, 0x4E21, 0x7B39, 0x3DCC,
+ 0x732A, 0x7560, 0x583A, 0x82A6, 0x698A, 0x60E3, 0x4EEE, 0x99C4,
+ 0x9EBF, 0x5301, 0x67A0, 0x60E8, 0x51B4, 0x7A83, 0x9C3A, 0x7AC8,
+ 0x691A, 0x59AC, 0x5840, 0x546A, 0x60E7, 0x567A, 0x6955, 0x9C2F,
+ 0x87A5, 0x5C20, 0x5E0B, 0x671E, 0x84AD, 0x8B81, 0x4E78, 0x62C3,
+ 0x6855, 0xFFFD, 0x82FD, 0x89A5, 0x8FA0, 0x97B8, 0x9847, 0x9ABD,
+ 0x5FB1, 0x6648, 0x66BF, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD,
+ 0x0000, 0x670E, 0x6918, 0x0000, 0x0000, 0x0000, 0x0000, 0x48D0,
+ 0x4AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x51D2, 0x0000, 0x599F,
+ 0x0000, 0x3BBE, 0x0000, 0x399B, 0x0000, 0x0000, 0x3762, 0x0000,
+ 0x8B5E, 0x0000, 0xFFFD, 0x7209, 0x0000, 0x0000, 0x8EDA, 0x528F,
+ 0x7171, 0x0000, 0x0000, 0x55BC, 0x0000, 0x3473, 0x0000, 0x4718,
+ 0x0000, 0x5066, 0x34FB, 0x0000, 0xFFFD, 0x477C, 0x0000, 0x0000,
+ 0xFFFD, 0x0000, 0x9056, 0x0000, 0x8B62, 0x5D5B, 0x0000, 0xFFFD,
+ 0x0000, 0x8AEA, 0x0000, 0x0000, 0x4BC0, 0x0000, 0x9465, 0x0000,
+ 0x6195, 0x5A27, 0x0000, 0x0000, 0x0000, 0x4E6A, 0x0000, 0x9656,
+ 0x6D8F, 0x0000, 0x8977, 0x0000, 0xFFFD, 0x7B42, 0x0000, 0x0000,
+ 0xFFFD, 0x7A45, 0x9A26, 0x365F, 0x0000, 0x0000, 0x7983, 0x5D2C,
+ 0x0000, 0xFFFD, 0x46D0, 0x753B, 0x8865, 0x58B6, 0x371C, 0x0000,
+ 0x3C54, 0x9281, 0x0000, 0x9330, 0x0000, 0x6C39, 0x0000, 0x8827,
+ 0x88F5, 0x0000, 0x0000, 0x0000, 0x6EB8, 0x0000, 0x0000, 0x39A4,
+ 0xFFFD, 0xFFFD, 0x453F, 0x66B6, 0x0000, 0x0000, 0x8943, 0x40DF,
+ 0x0000, 0x39A1, 0x0000, 0x0000, 0x0000, 0x71AD, 0x8366, 0x0000,
+ 0xFFFD, 0x4CB7, 0x0000, 0x0000, 0x0000, 0x7B43, 0x797E, 0x6FB5,
+ 0x0000, 0x6A03, 0x0000, 0x53A2, 0x0000, 0x93BF, 0x6836, 0x975D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5D85, 0x0000, 0x5715, 0x9823,
+ 0x0000, 0x5DAB, 0x0000, 0x65BE, 0x69D5, 0x53D2, 0x0000, 0x0000,
+ 0x3C11, 0x6736, 0x0000, 0x35CA, 0x48FA, 0xFFFD, 0x7808, 0x9255,
+ 0x43F2, 0x43DF, 0x59F8, 0xFFFD, 0x568B, 0x0000, 0x9012, 0x55C1,
+ 0x4509, 0x7E7F, 0x6F56, 0x6AB1, 0x34E4, 0x0000, 0x373A, 0xFFFD,
+ 0x0000, 0x0000, 0x3DEB, 0x0000, 0x0000, 0x56BF, 0x8E0E, 0x5B6D,
+ 0x63DE, 0xFFFD, 0x6530, 0x562D, 0x541A, 0x0000, 0x4C7D, 0x5622,
+ 0x561E, 0x7F49, 0x5975, 0x0000, 0x8770, 0x8117, 0x9D5E, 0x8D18,
+ 0x763B, 0x9C45, 0x764E, 0x77B9, 0x9345, 0x5432, 0x8148, 0x82F7,
+ 0x5625, 0x8132, 0x8418, 0x80BD, 0x55EA, 0x7962, 0x5643, 0x5416,
+ 0x0000, 0x35CE, 0x5605, 0x55F1, 0x66F1, 0x0000, 0x362D, 0x7534,
+ 0x55F0, 0x55BA, 0x5497, 0x5572, 0x0000, 0x0000, 0x5ED0, 0x0000,
+ 0x0000, 0x0000, 0x9EAB, 0x7D5A, 0xFFFD, 0x0000, 0x629D, 0x976D,
+ 0x5494, 0x8CCD, 0x71F6, 0x9176, 0x63FC, 0x63B9, 0x63FE, 0x5569,
+ 0x0000, 0x9C72, 0x0000, 0x519A, 0x34DF, 0x0000, 0x51A7, 0x544D,
+ 0x551E, 0x5513, 0x7666, 0x8E2D, 0x0000, 0x75B1, 0x80B6, 0x8804,
+ 0xFFFD, 0x88C7, 0x81B6, 0x841C, 0x44EC, 0x7304, 0x830B, 0x567B,
+ 0x9170, 0x9208, 0x0000, 0x7266, 0x474E, 0x0000, 0x40FA, 0x9C5D,
+ 0x651F, 0x48F3, 0x0000, 0x0000, 0xFFFD, 0x0000, 0xED2B, 0x0000,
+ 0x71A3, 0x7E8E, 0x9D50, 0x3577, 0x6CB2, 0x5367, 0x39DC, 0x0000,
+ 0x822D, 0x544B, 0xED43, 0x3A52, 0x7374, 0x0000, 0x4D09, 0x9BED,
+ 0xFFFD, 0x4C5B, 0x0000, 0x845C, 0x0000, 0x632E, 0x7D25, 0x3A2A,
+ 0x9008, 0x52CC, 0x3E74, 0x367A, 0x45E9, 0x0000, 0x7640, 0x5AF0,
+ 0x0000, 0x787A, 0x0000, 0x58A7, 0x40BF, 0x567C, 0x9B8B, 0x5D74,
+ 0x7654, 0x0000, 0x9E85, 0x4CE1, 0xFFFD, 0x37FB, 0x6119, 0x0000,
+ 0xED73, 0x565D, 0x0000, 0x5234, 0x35AD, 0xFFFD, 0x9D7C, 0x7C56,
+ 0x9B39, 0x57DE, 0x5C53, 0x64D3, 0x0000, 0x0000, 0x86AD, 0x0000,
+ 0x0000, 0xED8C, 0x51FE, 0x0000, 0x5D8E, 0x9703, 0x0000, 0x9E81,
+ 0x904C, 0x7B1F, 0x9B02, 0x5CD1, 0x7BA3, 0x6268, 0x6335, 0x9AFF,
+ 0x7BCF, 0x9B2A, 0x7C7E, 0xFFFD, 0x7C42, 0x7C86, 0x9C15, 0x7BFC,
+ 0x9B09, 0xFFFD, 0x9C2E, 0x9F5A, 0x5573, 0x5BC3, 0x4FFD, 0x9E98,
+ 0x4FF2, 0x5260, 0x52D1, 0x5767, 0x5056, 0x59B7, 0x5E12, 0x97C8,
+ 0x9DAB, 0x8F5C, 0x5469, 0x97B4, 0x9940, 0x97BA, 0x532C, 0x6130,
+ 0x692C, 0x53DA, 0x9C0A, 0x9D02, 0x4C3B, 0x9641, 0x6980, 0x50A6,
+ 0x7546, 0x0000, 0x99DA, 0x5273, 0xEDC9, 0x9159, 0x9681, 0x915C,
+ 0xEDCD, 0x9151, 0x0000, 0x637F, 0x6ACA, 0x5611, 0x918E, 0x757A,
+ 0x6285, 0x734F, 0x7C70, 0x0000, 0xEDDC, 0x76D6, 0x9B9D, 0x4E2A,
+ 0x0000, 0x83BE, 0x8842, 0xEDE4, 0x5C4A, 0x69C0, 0xFFFD, 0xFFFD,
+ 0x521F, 0x5DF5, 0x4ECE, 0x6C31, 0x0000, 0x4F39, 0x549C, 0xFFFD,
+ 0x529A, 0x8D82, 0x35FE, 0xFFFD, 0x35F3, 0xEDF6, 0x6B52, 0x917C,
+ 0x9FA5, 0x9B97, 0x982E, 0x98B4, 0x9ABA, 0x9EA8, 0x9E84, 0x7B14,
+ 0xEE02, 0x6BFA, 0x8818, 0x7F78, 0xEE06, 0x5620, 0x0000, 0x8E77,
+ 0x9F53, 0xEE0B, 0x8DD4, 0x8E4F, 0x9E1C, 0x8E01, 0x6282, 0x0000,
+ 0x8E28, 0x8E75, 0x7AD3, 0x7A3E, 0x78D8, 0x6CEA, 0x8A67, 0x7607,
+ 0x9F26, 0x6CCE, 0x87D6, 0x75C3, 0x0000, 0x7853, 0x8D0C, 0x72E2,
+ 0x7371, 0x8B2D, 0x7302, 0x74F1, 0x8CEB, 0x0000, 0x862F, 0x5FBA,
+ 0x88A0, 0x44B7, 0xEE2F, 0x0000, 0xEE32, 0x8A7E, 0x0000, 0xEE35,
+ 0x60FD, 0x7667, 0x9AD7, 0x9D44, 0x936E, 0x9B8F, 0x87F5, 0xEE3D,
+ 0xFFFD, 0x8CF7, 0x732C, 0x9721, 0x9BB0, 0x35D6, 0x72B2, 0x4C07,
+ 0x7C51, 0x994A, 0x6159, 0x4C04, 0x9E96, 0x617D, 0xEE4D, 0x575F,
+ 0x616F, 0x62A6, 0x6239, 0xFFFD, 0x3A5C, 0x61E2, 0x53AA, 0x6364,
+ 0x6802, 0x35D2, 0x5D57, 0x8FDA, 0x0000, 0xEE5E, 0x50D9, 0x7906,
+ 0x5332, 0x9638, 0x0000, 0x4065, 0xEE66, 0x77FE, 0xEE68, 0x7CC2,
+ 0x0000, 0x7CDA, 0x7A2D, 0x8066, 0x8063, 0x7D4D, 0x7505, 0x74F2,
+ 0x8994, 0x821A, 0x670C, 0x8062, 0x0000, 0x805B, 0x74F0, 0x8103,
+ 0x7724, 0x8989, 0x0000, 0x7553, 0x87A9, 0x87CE, 0x81C8, 0x878C,
+ 0x8A49, 0x8CAD, 0x8B43, 0x772B, 0x74F8, 0x84DA, 0x69B2, 0x8DA6,
+ 0xEE8C, 0x89A9, 0xFFFD, 0x6DB9, 0x87C1, 0x0000, 0x74E7, 0x3DDB,
+ 0x7176, 0x60A4, 0x619C, 0x3CD1, 0xFFFD, 0x6077, 0xEE9A, 0x7F71,
+ 0x0000, 0x60E9, 0x4B7E, 0x0000, 0x92DB, 0x0000, 0x0000, 0x854C,
+ 0x42B5, 0x73EF, 0x51B5, 0x3649, 0x0000, 0x0000, 0x9344, 0x0000,
+ 0x82EE, 0x0000, 0x783C, 0x6744, 0x62DF, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4FAB, 0x0000, 0x5008, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0xFFFD, 0x0000, 0x5FA4, 0x0000, 0x0000, 0x6EDB,
+ 0x0000, 0x50DE, 0x5101, 0x347A, 0x510E, 0x986C, 0x3743, 0x8416,
+ 0x0000, 0x0000, 0x5160, 0x0000, 0x516A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x5B82, 0x877D, 0x0000, 0x0000,
+ 0x51B2, 0x51B8, 0x9D34, 0x51C9, 0x51CF, 0x51D1, 0x3CDC, 0x51D3,
+ 0x0000, 0x51B3, 0xFFFD, 0xFFFD, 0x51ED, 0x83CD, 0x693E, 0x0000,
+ 0x5F7B, 0x520B, 0x5226, 0x523C, 0x52B5, 0x5257, 0x5294, 0x52B9,
+ 0x52C5, 0x7C15, 0x8542, 0x52E0, 0x860D, 0x0000, 0x0000, 0x0000,
+ 0x5549, 0x6ED9, 0x0000, 0x0000, 0x0000, 0x5333, 0xFFFD, 0x0000,
+ 0x6CCB, 0x0000, 0x681B, 0x73D5, 0x604A, 0x3EAA, 0x38CC, 0x0000,
+ 0x71DD, 0x44A2, 0x536D, 0x5374, 0x0000, 0x537E, 0x0000, 0x0000,
+ 0x0000, 0x77E6, 0x5393, 0x0000, 0x53A0, 0x53AB, 0x53AE, 0x73A7,
+ 0x0000, 0x3F59, 0x739C, 0x53C1, 0x53C5, 0x6C49, 0x4E49, 0x57FE,
+ 0x53D9, 0x3AAB, 0x0000, 0x53E0, 0x0000, 0x0000, 0x53F6, 0x0000,
+ 0x5413, 0x7079, 0x552B, 0x6657, 0x6D5B, 0x546D, 0x0000, 0x0000,
+ 0x555D, 0x548F, 0x54A4, 0x47A6, 0x0000, 0x0000, 0x3DB4, 0x0000,
+ 0x0000, 0x0000, 0x5547, 0x4CED, 0x542F, 0x7417, 0x5586, 0x55A9,
+ 0xFFFD, 0x0000, 0x0000, 0x4552, 0x0000, 0x66B3, 0x0000, 0x5637,
+ 0x66CD, 0x0000, 0x66A4, 0xFFFD, 0x564D, 0x564F, 0x78F1, 0x56F1,
+ 0x9787, 0x53FE, 0x5700, 0x56EF, 0x56ED, 0x0000, 0x3623, 0x0000,
+ 0x5746, 0x0000, 0x6C6E, 0x708B, 0x5742, 0x36B1, 0x0000, 0x57E6,
+ 0x0000, 0x5803, 0x0000, 0x0000, 0x5826, 0x0000, 0x581F, 0x58AA,
+ 0x3561, 0x58E0, 0x58DC, 0x0000, 0x58FB, 0x5BFF, 0x5743, 0x0000,
+ 0x0000, 0x93D3, 0x35A1, 0x591F, 0x68A6, 0x36C3, 0x6E59, 0x0000,
+ 0x5A24, 0xFFFD, 0x0000, 0x8505, 0x59C9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x59D9, 0x0000, 0x0000, 0x0000, 0x6D71, 0x0000, 0x0000,
+ 0x59F9, 0x0000, 0x5AAB, 0x5A63, 0x36E6, 0x0000, 0xFFFD, 0x3708,
+ 0x5A96, 0x7465, 0x5AD3, 0x0000, 0x0000, 0x0000, 0x3732, 0x0000,
+ 0x5E83, 0x52D0, 0x5B76, 0x6588, 0x5B7C, 0x0000, 0x4004, 0x485D,
+ 0x0000, 0x5BD5, 0x0000, 0x0000, 0x0000, 0x5BF3, 0x5B9D, 0x4D10,
+ 0x5C05, 0x0000, 0x5C13, 0x73CE, 0x5C14, 0x0000, 0x0000, 0x5C49,
+ 0x48DD, 0x5C85, 0x5CE9, 0x5CEF, 0x5D8B, 0x0000, 0x0000, 0x5D10,
+ 0x5D18, 0x5D46, 0x0000, 0x5CBA, 0x5DD7, 0x82FC, 0x382D, 0x0000,
+ 0x0000, 0x0000, 0x8287, 0x3836, 0x3BC2, 0x5E2E, 0x6A8A, 0xFFFD,
+ 0xE12F, 0x0000, 0x0000, 0x53A6, 0x4EB7, 0xFFFD, 0x53A8, 0x0000,
+ 0x5E09, 0xE138, 0x0000, 0x5EF9, 0x5EFB, 0x38A0, 0x5EFC, 0x683E,
+ 0x941B, 0x5F0D, 0x0000, 0x0000, 0x3ADE, 0x0000, 0x5F3A, 0x0000,
+ 0x0000, 0x0000, 0x5F63, 0x0000, 0x5F72, 0x9340, 0x0000, 0x5FA7,
+ 0x5DB6, 0x3D5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x91D6, 0x0000,
+ 0x0000, 0x6031, 0x6685, 0x3963, 0x3DC7, 0x3639, 0x5790, 0x0000,
+ 0x7971, 0x3E40, 0x609E, 0xFFFD, 0x60EA, 0x0000, 0x0000, 0x0000,
+ 0x74A4, 0x50E1, 0x5AA0, 0x6164, 0x6142, 0x0000, 0x0000, 0x6181,
+ 0x51F4, 0x0000, 0x6187, 0x5BAA, 0x0000, 0x0000, 0x61D3, 0x0000,
+ 0x0000, 0x61D0, 0x3932, 0x0000, 0x0000, 0x6023, 0x615C, 0x651E,
+ 0x638B, 0x0000, 0x62C5, 0x0000, 0x62D5, 0x0000, 0x636C, 0x0000,
+ 0x3A17, 0x6438, 0x63F8, 0x0000, 0x0000, 0x6F8A, 0x0000, 0xFFFD,
+ 0x0000, 0x64E1, 0x64E5, 0x947B, 0x3A66, 0x643A, 0x3A57, 0x654D,
+ 0x6F16, 0x0000, 0x0000, 0x6585, 0x656D, 0x655F, 0xFFFD, 0x65B5,
+ 0x0000, 0x4B37, 0x65D1, 0x40D8, 0x0000, 0xE1AB, 0x65E3, 0x5FDF,
+ 0x0000, 0x6618, 0x0000, 0x0000, 0x6644, 0x0000, 0x0000, 0x664B,
+ 0x0000, 0x6667, 0x0000, 0x6673, 0xFA12, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x77C5, 0x0000, 0x99A4, 0x6702, 0x0000, 0x0000, 0x69FA,
+ 0x0000, 0x0000, 0x6767, 0x6762, 0x0000, 0x0000, 0x67D7, 0x44E9,
+ 0x6822, 0x6E50, 0x923C, 0x6801, 0x0000, 0x0000, 0x685D, 0x0000,
+ 0x69E1, 0x6A0B, 0x0000, 0x6973, 0x68C3, 0x0000, 0x6901, 0x6900,
+ 0x3A01, 0x0000, 0x3B80, 0x67AC, 0x6961, 0x0000, 0x42FC, 0x6936,
+ 0x6998, 0x3BA1, 0x0000, 0x8363, 0x5090, 0x69F9, 0x0000, 0x0000,
+ 0x6A45, 0x0000, 0x6A9D, 0x3BF3, 0x67B1, 0x6AC8, 0x0000, 0x3C0D,
+ 0x6B1D, 0x0000, 0x60DE, 0x6B35, 0x6B74, 0x0000, 0x6EB5, 0x0000,
+ 0xFFFD, 0x0000, 0x3740, 0x5421, 0x0000, 0x6BE1, 0x0000, 0x6BDC,
+ 0x6C37, 0x0000, 0x0000, 0x0000, 0x6C5A, 0x8226, 0x6C79, 0x0000,
+ 0x44C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x36E5, 0x3CEB,
+ 0x0000, 0x9B83, 0x0000, 0x0000, 0x7F8F, 0x6837, 0x0000, 0x0000,
+ 0x0000, 0x6D96, 0x6D5C, 0x6E7C, 0x6F04, 0x0000, 0x0000, 0x0000,
+ 0x8533, 0x0000, 0x51C7, 0xFFFD, 0xFFFD, 0x842E, 0x0000, 0x0000,
+ 0x0000, 0x7453, 0x0000, 0x79CC, 0x6E4F, 0x5A91, 0x0000, 0x6FF8,
+ 0x370D, 0x6F9D, 0x0000, 0x6EFA, 0x0000, 0x0000, 0x4555, 0x93F0,
+ 0x6F44, 0x6F5C, 0x3D4E, 0x6F74, 0x0000, 0x3D3B, 0x6F9F, 0x0000,
+ 0x6FD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x51DF,
+ 0xE251, 0xE252, 0x0000, 0x0000, 0x704B, 0x707E, 0x70A7, 0xFFFD,
+ 0x70CC, 0x70D5, 0x70D6, 0x70DF, 0x4104, 0x3DE8, 0x71B4, 0x7196,
+ 0x0000, 0x712B, 0x7145, 0x5A88, 0x714A, 0xFA48, 0x0000, 0x714F,
+ 0x9362, 0x0000, 0x712C, 0x0000, 0x0000, 0x0000, 0x71BA, 0x0000,
+ 0x70BD, 0x720E, 0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341,
+ 0x0000, 0x722E, 0x7240, 0x0000, 0x68BD, 0x7255, 0x7257, 0x3E55,
+ 0x0000, 0x680D, 0x6F3D, 0x7282, 0xFFFD, 0x732B, 0x0000, 0x0000,
+ 0x48ED, 0x0000, 0x7328, 0x732E, 0x73CF, 0x73AA, 0x0000, 0x0000,
+ 0x73C9, 0x7449, 0x0000, 0x0000, 0x0000, 0x6623, 0x36C5, 0x0000,
+ 0x0000, 0x0000, 0x73F7, 0x7415, 0x6903, 0x0000, 0x7439, 0x3ED7,
+ 0x0000, 0x0000, 0x7460, 0x0000, 0x7447, 0x73E4, 0x7476, 0x83B9,
+ 0x746C, 0x7474, 0x93F1, 0x6A2C, 0x7482, 0x4953, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5B46, 0x0000, 0x0000, 0x74C8, 0x0000, 0x750E,
+ 0x751E, 0x0000, 0x0000, 0x5BD7, 0x0000, 0x9385, 0x754D, 0x754A,
+ 0x7567, 0x756E, 0x0000, 0x3F04, 0x0000, 0x758E, 0x745D, 0x759E,
+ 0x75B4, 0x7602, 0x762C, 0x7651, 0x764F, 0x766F, 0xE2D3, 0x0000,
+ 0x7690, 0x81EF, 0x37F8, 0x0000, 0x0000, 0x76A1, 0x76A5, 0x76B7,
+ 0x76CC, 0x0000, 0x8462, 0x0000, 0x0000, 0x0000, 0x771E, 0x7726,
+ 0x7740, 0x64AF, 0x0000, 0x7758, 0x0000, 0x77AF, 0x0000, 0x0000,
+ 0x0000, 0x77F4, 0xFFFD, 0x68CA, 0x78AF, 0x78C7, 0x78D3, 0x96A5,
+ 0x792E, 0x0000, 0x78D7, 0x7934, 0x78B1, 0x0000, 0x8FB8, 0x8884,
+ 0x0000, 0x7986, 0x8900, 0x6902, 0x7980, 0x0000, 0x799D, 0x0000,
+ 0x793C, 0x79A9, 0x6E2A, 0x0000, 0x3EA8, 0x79C6, 0x0000, 0x79D4,
+ 0xFFFD, 0x5525, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x5590, 0x0000,
+ 0x39EC, 0x0000, 0x8E46, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x777A,
+ 0x0000, 0x3A34, 0x47D5, 0x0000, 0x0000, 0x0000, 0x64DD, 0x0000,
+ 0x0000, 0x0000, 0xFFFD, 0x648D, 0x8E7E, 0x0000, 0xFFFD, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0xFFFD, 0x0000, 0x0000, 0x0000, 0x47F4,
+ 0x0000, 0x0000, 0x9AB2, 0x3A67, 0x0000, 0x3FED, 0x3506, 0x0000,
+ 0x0000, 0xFFFD, 0x0000, 0x9D6E, 0x9815, 0xFFFD, 0x43D9, 0xFFFD,
+ 0x64B4, 0x54E3, 0xFFFD, 0x0000, 0xFFFD, 0x39FB, 0xFFFD, 0x0000,
+ 0x0000, 0x0000, 0x64EA, 0x0000, 0x0000, 0x8E68, 0xFFFD, 0x0000,
+ 0x0000, 0xFFFD, 0x480B, 0x0000, 0x3FFA, 0x5873, 0x0000, 0xFFFD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xFFFD, 0x5579, 0xFFFD, 0x43BA,
+ 0xFFFD, 0x4AB4, 0x0000, 0x0000, 0x81AA, 0x98F5, 0x0000, 0x6379,
+ 0x39FE, 0x0000, 0x8DC0, 0x56A1, 0x647C, 0x3E43, 0xFFFD, 0x0000,
+ 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x3992, 0x3A06,
+ 0x0000, 0x3578, 0x0000, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000,
+ 0x34BC, 0x6C3D, 0x0000, 0xFFFD, 0xFFFD, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3A18,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x95AA, 0xFFFD, 0x0000,
+ 0x7140, 0xFFFD, 0x5156, 0x4EFE, 0x5088, 0xFFFD, 0x3493, 0x5186,
+ 0x5E42, 0x5205, 0x5227, 0x5279, 0x0000, 0x3553, 0x53C2, 0x535F,
+ 0xFFFD, 0x553F, 0xFFFD, 0x55D8, 0x35DD, 0x5621, 0xFFFD, 0x5654,
+ 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0x0000, 0xFFFD, 0xFFFD, 0x37B9,
+ 0x5CC1, 0x5D15, 0x5D56, 0x3838, 0x4E81, 0x5EBD, 0x3914, 0x61B9,
+ 0x6290, 0x6318, 0x645A, 0x6491, 0x816D, 0x8184, 0x8193, 0x6800,
+ 0x3BBC, 0x728F, 0x72CD, 0x0000, 0x7339, 0x7542, 0x75DC, 0x3FC0,
+ 0x0000, 0x3FD7, 0xFFFD, 0x7680, 0x768C, 0x40A8, 0x7839, 0x4103,
+ 0x7A91, 0x7C1B, 0x7CED, 0x7F93, 0x7FAE, 0xFFFD, 0x82FF, 0x585F,
+ 0x86B2, 0x45AC, 0x878B, 0x8947, 0xFFFD, 0x8A29, 0xFFFD, 0x8E71,
+ 0x0000, 0x8EB0, 0xFFFD, 0x915E, 0x918C, 0x990E, 0x991C, 0xFFFD,
+ 0xFFFD, 0x9B81, 0x9DC0, 0x9D93, 0x9EAC, 0x4D91, 0xFFFD, 0x93BA,
+ 0x9E7B, 0x7089, 0x7348, 0xFFFD, 0x7999, 0x8FB7, 0xFFFD, 0x9942,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00A9,
+ 0x2122, 0x2026, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
+ 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D,
+ 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D,
+ 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,
+ 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055,
+ 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D,
+ 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
+ 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
+ 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D,
+ 0x007E, 0x20AC, 0x20AC, 0x2110, 0x20AC, 0x20AC, 0x309B, 0x309C,
+ 0x2E80, 0x31C0, 0x31C1, 0x31C2, 0x31C3, 0x31C4, 0x0000, 0x31C5,
+ 0x0000, 0x0000, 0x31C6, 0x31C7, 0x0000, 0x0000, 0x31C8, 0x0000,
+ 0x31C9, 0x31CA, 0x31CB, 0x31CC, 0x0000, 0x31CD, 0x31CE, 0xF538,
+ 0xF539, 0x0000, 0x0000, 0x9751, 0x0000, 0x4E5B, 0x4EBB, 0x353E,
+ 0x5C23, 0x5F51, 0x5FC4, 0x38FA, 0x624C, 0x6535, 0x6B7A, 0x6C35,
+ 0x6C3A, 0x706C, 0x722B, 0x4E2C, 0x72AD, 0x0000, 0x7F52, 0x793B,
+ 0x7CF9, 0x7F53, 0x0000, 0x34C1, 0x0000, 0x8002, 0x8080, 0x0000,
+ 0x0000, 0x535D, 0x8864, 0x89C1, 0x0000, 0x8BA0, 0x8D1D, 0x9485,
+ 0x9578, 0x957F, 0x95E8, 0x0000, 0x97E6, 0x9875, 0x98CE, 0x98DE,
+ 0x9963, 0x0000, 0x9C7C, 0x9E1F, 0x9EC4, 0x6B6F, 0xF907, 0x4E37,
+ 0x0000, 0x961D, 0x6237, 0x94A2, 0x2E84, 0x2E86, 0x2E87, 0x2E88,
+ 0x2E8A, 0x2E8C, 0x2E8D, 0x2E95, 0x2E9C, 0x2EA5, 0x2EA7, 0x2EAA,
+ 0x2EAC, 0x2EAE, 0x2EB6, 0x2EBC, 0x2EBE, 0x2ECA, 0x2ECC, 0x2ECD,
+ 0x2ECF, 0x2ED6, 0x2ED7, 0x2EDE, 0x0000, 0x0000, 0x650A, 0x4E3D,
+ 0x6EDD, 0x9D4E, 0x91DF, 0x0000, 0x4F1A, 0x4F28, 0x4FA8, 0x5174,
+ 0x519C, 0x51E4, 0x52A1, 0x52A8, 0x533B, 0x534E, 0x53D1, 0x53D8,
+ 0x56E2, 0x58F0, 0x5904, 0x5907, 0x5932, 0x5934, 0x5B66, 0x5B9E,
+ 0x5B9F, 0x5C9A, 0x5E86, 0x603B, 0x6589, 0x67FE, 0x6804, 0x6865,
+ 0x6D4E, 0x70BC, 0x7535, 0x7EA4, 0x7EAC, 0x7EBA, 0x7EC7, 0x7ECF,
+ 0x7EDF, 0x7F06, 0x7F37, 0x827A, 0x82CF, 0x836F, 0x89C6, 0x8BBE,
+ 0x8BE2, 0x8F66, 0x8F67, 0x8F6E, 0x7411, 0x7CFC, 0x7DCD, 0x6946,
+ 0x7AC9, 0x78B8, 0x80BC, 0x8D0B, 0x80F6, 0x0000, 0x809F, 0x9EC7,
+ 0x4CCD, 0x9DC9, 0x9E0C, 0x4C3E, 0x0000, 0x0000, 0x9E0A, 0x0000,
+ 0x35C1, 0x6E9A, 0x823E, 0x7519, 0x4911, 0x9A6C, 0x9A8F, 0x9F99,
+ 0x7987, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E24, 0x4E80, 0x4E87,
+ 0x4EBF, 0x4EEB, 0x4F37, 0x344C, 0x4FBD, 0x3E48, 0x5003, 0x347D,
+ 0x34A5, 0x5905, 0x51DB, 0x51FC, 0x4E89, 0x5290, 0x5327, 0x35C7,
+ 0x53A9, 0x3551, 0x53B0, 0x5423, 0x356D, 0x3572, 0x3681, 0x5493,
+ 0x54A3, 0x54B4, 0x54B9, 0x54D0, 0x54EF, 0x5518, 0x5523, 0x5528,
+ 0x3598, 0x35A5, 0x35BF, 0x55D7, 0x35C5, 0x0000, 0x4053, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x40BB, 0x0000, 0x5652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x35FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x3F93, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3FF9,
+ 0x0000, 0x6432, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x54CC, 0x82C4, 0x55B9, 0x0000, 0x9C26, 0x9AB6,
+ 0x0000, 0x80EC, 0x5C1C, 0x0000, 0x8134, 0x3797, 0x0000, 0x91B6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3609, 0x0000, 0x56AF,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5A54, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x579C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3703,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x5899, 0x5268, 0x361A, 0x0000, 0x7BB2, 0x5B68, 0x4800, 0x4B2C,
+ 0x9F27, 0x49E7, 0x9C1F, 0x9B8D, 0x0000, 0x0000, 0x55FB, 0x35F2,
+ 0x5689, 0x5D3E, 0x5D48, 0x3DFC, 0x380F, 0x5DA4, 0x5DB9, 0x3820,
+ 0x5F25, 0x5F83, 0x3908, 0x393F, 0x394D, 0x60D7, 0x613D, 0x5CE5,
+ 0x3989, 0x61B7, 0x61CF, 0x39B8, 0x622C, 0x62E5, 0x39F8, 0x56B1,
+ 0x3A03, 0x63E2, 0x63FB, 0x6407, 0x3A4B, 0x64C0, 0x9F9F, 0x3A97,
+ 0x6586, 0x3ABD, 0x65FF, 0x6653, 0x3AF2, 0x6692, 0x3B22, 0x6716,
+ 0x3B42, 0x67A4, 0x3B58, 0x684A, 0x6884, 0x3B72, 0x3B71, 0x3B7B,
+ 0x6909, 0x6943, 0x725C, 0x6964, 0x699F, 0x6985, 0x69D6, 0x3BDD,
+ 0x6A65, 0x6A74, 0x6A71, 0x6A82, 0x3BEC, 0x6A99, 0x3BF2, 0x6AAB,
+ 0x6AB5, 0x6AD4, 0x6AF6, 0x6B81, 0x6BC1, 0x6BEA, 0x6C75, 0x6CAA,
+ 0x3CCB, 0x6D02, 0x6D06, 0x6D26, 0x6D81, 0x3CEF, 0x6DA4, 0x6DB1,
+ 0x6E15, 0x6E18, 0x6E29, 0x6E86, 0x0000, 0x6EBB, 0x6EE2, 0x6EDA,
+ 0x9F7F, 0x6EE8, 0x6EE9, 0x6F24, 0x6F34, 0x3D46, 0x0000, 0x6F81,
+ 0x6FBE, 0x3D6A, 0x3D75, 0x71B7, 0x5C99, 0x3D8A, 0x702C, 0x3D91,
+ 0x7050, 0x7054, 0x706F, 0x707F, 0x0000, 0x43C1, 0x35F1, 0x0000,
+ 0x364E, 0x3DAD, 0x0000, 0x667D, 0x7C74, 0x748D, 0x7E92, 0x4503,
+ 0x0000, 0x0000, 0x0000, 0x347E, 0x0000, 0x0000, 0x0000, 0x8771,
+ 0x63C1, 0x7777, 0x898A, 0x0000, 0x8B4C, 0x0000, 0x492A, 0x0000,
+ 0x0000, 0x0000, 0x3AF0, 0x708F, 0x0000, 0x0000, 0x0000, 0x6888,
+ 0x0000, 0x9F62, 0x93C6, 0x0000, 0x9366, 0x928F, 0x8614, 0x0000,
+ 0x4190, 0x678F, 0x681E, 0x3863, 0x0000, 0x3B19, 0x8496, 0x0000,
+ 0x39E2, 0x8480, 0x436E, 0x9771, 0x999B, 0x492D, 0x6F17, 0x0000,
+ 0x70A6, 0x0000, 0x7E65, 0x5D2F, 0x3DF3, 0x0000, 0x0000, 0x7DA4,
+ 0x8426, 0x5485, 0x0000, 0x0000, 0x577E, 0x0000, 0x0000, 0x3FE5,
+ 0x0000, 0x0000, 0x7003, 0x0000, 0x5D70, 0x738F, 0x0000, 0x0000,
+ 0x4FC8, 0x7FE7, 0x7310, 0x7338, 0x7341, 0x3EA9, 0x71F5, 0x0000,
+ 0x73E1, 0x3ECA, 0x3ED1, 0x7419, 0x741E, 0x741F, 0x3EE2, 0x3EF0,
+ 0x3EF4, 0x3EFA, 0x74D3, 0x3F0E, 0x3F53, 0x756D, 0x7572, 0x758D,
+ 0x3F7C, 0x75C8, 0x764D, 0x7674, 0x3FDC, 0x767A, 0x7188, 0x5623,
+ 0x8980, 0x401D, 0x7743, 0x4039, 0x4045, 0x35DB, 0x7798, 0x406A,
+ 0x406F, 0x77BE, 0x77CB, 0x7818, 0x781C, 0x7847, 0x7851, 0x7866,
+ 0x8448, 0x0000, 0x7933, 0x7932, 0x4109, 0x7991, 0x7A06, 0x4167,
+ 0x41B2, 0x7ABC, 0x8279, 0x41C4, 0x7ACF, 0x7ADB, 0x41CF, 0x7B62,
+ 0x7B6C, 0x7B7B, 0x7C12, 0x4260, 0x427A, 0x7C7B, 0x7C9C, 0x428C,
+ 0x7CB8, 0x4294, 0x8F93, 0x70C0, 0x0000, 0x7DCF, 0x7DD4, 0x7DD0,
+ 0x7DFD, 0x7FB4, 0x729F, 0x4397, 0x8020, 0x8025, 0x802E, 0x8031,
+ 0x8054, 0x57B4, 0x70A0, 0x80B7, 0x80E9, 0x43ED, 0x810C, 0x810E,
+ 0x8112, 0x8114, 0x4401, 0x3B39, 0x8156, 0x8159, 0x815A, 0x4413,
+ 0x817C, 0x4425, 0x442D, 0x81A5, 0x57EF, 0x81C1, 0x81E4, 0x8254,
+ 0x448F, 0x8276, 0x82CA, 0x82D8, 0x44B0, 0x8357, 0x9669, 0x8405,
+ 0x70F5, 0x8464, 0x8488, 0x4504, 0x84BE, 0x84E1, 0x84F8, 0x8510,
+ 0x8538, 0x8552, 0x453B, 0x856F, 0x8570, 0x85E0, 0x4577, 0x8672,
+ 0x8692, 0x86EF, 0x9645, 0x4606, 0x4617, 0x88AE, 0x88FF, 0x8924,
+ 0x8991, 0x0000, 0x8A38, 0x8A94, 0x8AB4, 0x8C51, 0x8CD4, 0x8CF2,
+ 0x8D1C, 0x4798, 0x8DC3, 0x47ED, 0x8E3A, 0x5754, 0x55F5, 0x4837,
+ 0x8ECE, 0x8EE2, 0x8EE4, 0x8EED, 0x8EF2, 0x8FC1, 0x8FCA, 0x8FCC,
+ 0x9033, 0x48AD, 0x98E0, 0x9213, 0x491E, 0x9228, 0x9258, 0x926B,
+ 0x92B1, 0x92AE, 0x92BF, 0x92E3, 0x92EB, 0x92F3, 0x92F4, 0x92FD,
+ 0x9343, 0x9384, 0x93AD, 0x4945, 0x4951, 0x9417, 0x941D, 0x942D,
+ 0x943E, 0x496A, 0x9454, 0x9479, 0x952D, 0x95A2, 0x49A7, 0x95F4,
+ 0x9633, 0x49E5, 0x4A24, 0x9740, 0x4A35, 0x97B2, 0x97C2, 0x4AE4,
+ 0x98B9, 0x4B19, 0x98F1, 0x5844, 0x9919, 0x9937, 0x995D, 0x9962,
+ 0x4B70, 0x99C5, 0x4B9D, 0x9A3C, 0x9B0F, 0x9B69, 0x9BDD, 0x9BF1,
+ 0x9BF4, 0x4C6D, 0x9C20, 0x376F, 0x0000, 0x9D49, 0x9EFE, 0x5650,
+ 0x9DBD, 0x9DFC, 0x94F6, 0x8FB6, 0x9EB1, 0x9EBD, 0x9EC6, 0x94DC,
+ 0x9EE2, 0x9EF1, 0x9EF8, 0x9F44, 0x0000, 0x0000, 0x0000, 0x94C3,
+ 0x0000, 0x94C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x5757, 0x7173,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x549E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3647, 0x0000,
+ 0x0000, 0x0000, 0x5364, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x70BB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x7198, 0x0000, 0x69E9,
+ 0x36C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x58B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x5788, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x5965, 0x0000, 0x0000, 0x573F, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x57A1, 0x7151, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x56B9,
+ 0x0000, 0x3618, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x949F, 0x0000, 0x36B9,
+ 0x0000, 0x0000, 0x56D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x63E6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x3DF7, 0x0000, 0x0000, 0x8FD0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x7E9F, 0x0000, 0x0000, 0x4CA4, 0x9547,
+ 0x0000, 0x71A2, 0x0000, 0x0000, 0x4D9C, 0x0000, 0x8FBE, 0x8FBA,
+ 0x0000, 0x8FB9, 0x0000, 0x4EEA, 0x0000, 0x8E80, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E9A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3DC6, 0x0000,
+ 0x4E1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x55DE, 0x8786, 0x0000,
+ 0x0000, 0x5B90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4E1A, 0x4E04, 0x5B0D,
+ 0x36AC, 0x537D, 0x36A5, 0x589A, 0x0000, 0x57AA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x57A7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9C1B, 0x0000, 0x3E06, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x577A, 0x54DA, 0x717A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3635, 0x0000,
+ 0x5220, 0x3C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x4562, 0x5B1F, 0x0000, 0x9F50, 0x9EA6, 0x0000, 0x51E2, 0x5342,
+ 0x66AD, 0x585C, 0x5553, 0x3D85, 0x6160, 0x48AE, 0x97BD, 0x0000,
+ 0x60B3, 0x8424, 0x9814, 0x0000, 0x0000, 0x0000, 0x3B2B, 0x3D32,
+ 0x0000, 0x7081, 0x5C9C, 0x0000, 0x3730, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0100, 0x00C1, 0x01CD, 0x00C0, 0x0112, 0x00C9, 0x011A,
+ 0x00C8, 0x014C, 0x00D3, 0x01D1, 0x00D2, 0xF325, 0x1EBE, 0xF327,
+ 0x1EC0, 0x00CA, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0251, 0x0113,
+ 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D,
+ 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6,
+ 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0xF344, 0x1EBF, 0xF346, 0x1EC1,
+ 0x00EA, 0x0261, 0x0283, 0x0250, 0x025B, 0x0254, 0x0275, 0x0153,
+ 0x00F8, 0x014B, 0x028A, 0x026A, 0x23DA, 0x23DB, 0x2E9D, 0x2EC6,
+ 0x2EE3, 0x503B, 0x6DFE, 0x0000, 0x9FA6, 0x3DC9, 0x888F, 0x0000,
+ 0x7077, 0x5CF5, 0x4B20, 0x0000, 0x3559, 0x0000, 0x6122, 0x0000,
+ 0x8FA7, 0x91F6, 0x7191, 0x6719, 0x73BA, 0x0000, 0x0000, 0x3C8B,
+ 0x0000, 0x4B10, 0x78E4, 0x7402, 0x51AE, 0x0000, 0x4009, 0x6A63,
+ 0x0000, 0x4223, 0x860F, 0x7A2A, 0x0000, 0x0000, 0x9755, 0x704D,
+ 0x5324, 0x0000, 0x93F4, 0x76D9, 0x0000, 0x9FA7, 0x77DD, 0x4EA3,
+ 0x4FF0, 0x50BC, 0x4E2F, 0x4F17, 0x9FA8, 0x5434, 0x7D8B, 0x5892,
+ 0x58D0, 0x0000, 0x5E92, 0x5E99, 0x5FC2, 0x0000, 0x658B, 0x0000,
+ 0x6919, 0x6A43, 0x0000, 0x6CFF, 0x7200, 0x0000, 0x738C, 0x3EDB,
+ 0x0000, 0x5B15, 0x74B9, 0x8B83, 0x0000, 0x0000, 0x7A93, 0x7BEC,
+ 0x7CC3, 0x7E6C, 0x82F8, 0x8597, 0x9FA9, 0x8890, 0x9FAA, 0x8EB9,
+ 0x9FAB, 0x8FCF, 0x855F, 0x99E0, 0x9221, 0x9FAC, 0x0000, 0x0000,
+ 0x4071, 0x42A2, 0x5A1A, 0x9868, 0x676B, 0x4276, 0x573D, 0x85D6,
+ 0x0000, 0x82BF, 0x0000, 0x4C81, 0x0000, 0x5D7B, 0x0000, 0x0000,
+ 0x9FAD, 0x9FAE, 0x5B96, 0x9FAF, 0x7E5B, 0x43F0, 0x4C32, 0x4603,
+ 0x45A6, 0x4578, 0x0000, 0x4D77, 0x45B3, 0x0000, 0x4CE2, 0x0000,
+ 0x3B95, 0x4736, 0x4744, 0x4C47, 0x4C40, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x4C57, 0x0000, 0x474F, 0x45DA, 0x4C85, 0x0000,
+ 0x4D07, 0x4AA4, 0x46A1, 0x0000, 0x7225, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x664D, 0x56FB, 0x7D95, 0x591D, 0x0000, 0x3DF4, 0x9734,
+ 0x0000, 0x5BDB, 0x0000, 0x5AA4, 0x3625, 0x0000, 0x5AD1, 0x5BB7,
+ 0x5CFC, 0x676E, 0x8593, 0x0000, 0x7461, 0x749D, 0x0000, 0x66E7,
+ 0x6E57, 0x79CA, 0x3D88, 0x44C3, 0x0000, 0x0000, 0x439A, 0x4536,
+ 0x5CD5, 0x0000, 0x8AF9, 0x5C78, 0x3D12, 0x0000, 0x5D78, 0x9FB2,
+ 0x7157, 0x4558, 0x0000, 0x0000, 0x4C77, 0x3978, 0x344A, 0x0000,
+ 0x0000, 0x8ACC, 0x4FB4, 0x0000, 0x59BF, 0x816C, 0x9856, 0x0000,
+ 0x5F3B, 0x0000, 0x0000, 0x0000, 0x4102, 0x46BB, 0x0000, 0x3F07,
+ 0x9FB3, 0x0000, 0x40F8, 0x37D6, 0x46F7, 0x0000, 0x417C, 0x0000,
+ 0x0000, 0x456D, 0x38D4, 0x0000, 0x4561, 0x451B, 0x4D89, 0x4C7B,
+ 0x4D76, 0x45EA, 0x3FC8, 0x0000, 0x3661, 0x44DE, 0x44BD, 0x41ED,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
new file mode 100644
index 0000000000..e12a8597ed
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_B5pc_H_0[247 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x003D, 0x00FD, 0x00FF, 0x0060,
+ 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080,
+ 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7,
+ 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F,
+ 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7,
+ 0xA3C0, 0xA3E0, 0x0232, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
+ 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
+ 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
+ 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
+ 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
+ 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
+ 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
+ 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
+ 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
+ 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
+ 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
+ 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
+ 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
+ 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
+ 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
+ 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
+ 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
+ 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
+ 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
+ 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
+ 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
+ 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
+ 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
+ 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
+ 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
+ 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
+ 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
+ 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
+ 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+ 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+ 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+ 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+ 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+ 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+ 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+ 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+ 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+ 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+ 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+ 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+ 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+ 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+ 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+ 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+ 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+ 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+ 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+ 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+ 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+ 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+ 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+ 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+ 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+ 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+ 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+ 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+ 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+ 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+ 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+ 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+ 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+ 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+ 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+ 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+ 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+ 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+ 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+ 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+ 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+ 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+ 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+ 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+ 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+ 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+ 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+ 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+ 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+ 0xF9D2, 0xF9D5, 0x354A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
new file mode 100644
index 0000000000..188aefc458
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp
@@ -0,0 +1,12 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_B5pc_V_0[12 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
new file mode 100644
index 0000000000..57ae87ce24
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp
@@ -0,0 +1,182 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS_EUC_H_0[157 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1FE, 0x0063, 0xA2A1, 0xA2FE, 0x00C1,
+ 0xA3A1, 0xA3CE, 0x011F, 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB,
+ 0xA5EE, 0xA5F0, 0x01F7, 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253,
+ 0xA7A2, 0xA7A4, 0x0218, 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B,
+ 0xA7A7, 0xA7A7, 0x025A, 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B,
+ 0xA7AD, 0xA7AF, 0x021D, 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E,
+ 0xA7B2, 0xA7B2, 0x0260, 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220,
+ 0xA7B5, 0xA7B5, 0x0263, 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221,
+ 0xA7B8, 0xA7B9, 0x0264, 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770,
+ 0xA7BC, 0xA7BC, 0x0223, 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279,
+ 0xA7BF, 0xA7BF, 0x1775, 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224,
+ 0xA7C3, 0xA7C6, 0x027C, 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282,
+ 0xA7CC, 0xA7CC, 0x1776, 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226,
+ 0xA7CF, 0xA7D0, 0x0288, 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227,
+ 0xA7D6, 0xA7D8, 0x028E, 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777,
+ 0xA7DC, 0xA7DF, 0x02D0, 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C,
+ 0xA7E2, 0xA7E5, 0x02D6, 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA,
+ 0xA7EE, 0xA7EE, 0x178A, 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C,
+ 0xA7F4, 0xA7F8, 0x02E5, 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA,
+ 0xA7FE, 0xA7FE, 0x0356, 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E,
+ 0xA8A8, 0xA8A8, 0x0362, 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363,
+ 0xA8B3, 0xA8B3, 0x17B2, 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6,
+ 0xA8BB, 0xA8BB, 0x1812, 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE,
+ 0xA8C4, 0xA8CC, 0x0405, 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818,
+ 0xA8CF, 0xA8D2, 0x040F, 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508,
+ 0xA8DA, 0xA8DA, 0x18E7, 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230,
+ 0xA8E4, 0xA8E4, 0x051B, 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696,
+ 0xA8EC, 0xA8EC, 0x0231, 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826,
+ 0xA8FC, 0xA8FE, 0x09F5, 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8,
+ 0xA9A3, 0xA9A3, 0x1E34, 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1,
+ 0xA9AC, 0xA9AE, 0x0DBB, 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612,
+ 0xA9B1, 0xA9B3, 0x0F7B, 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289,
+ 0xA9B7, 0xA9B8, 0x13B2, 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232,
+ 0xC4A1, 0xC4FE, 0x0253, 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F,
+ 0xC7A1, 0xC7FE, 0x036D, 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429,
+ 0xCAA1, 0xCAFE, 0x0487, 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543,
+ 0xCDA1, 0xCDFE, 0x05A1, 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D,
+ 0xD0A1, 0xD0FE, 0x06BB, 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777,
+ 0xD3A1, 0xD3FE, 0x07D5, 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891,
+ 0xD6A1, 0xD6FE, 0x08EF, 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB,
+ 0xD9A1, 0xD9FE, 0x0A09, 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5,
+ 0xDCA1, 0xDCFE, 0x0B23, 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF,
+ 0xDFA1, 0xDFFE, 0x0C3D, 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9,
+ 0xE2A1, 0xE2FE, 0x0D57, 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13,
+ 0xE5A1, 0xE5FE, 0x0E71, 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D,
+ 0xE8A1, 0xE8FE, 0x0F8B, 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047,
+ 0xEBA1, 0xEBFE, 0x10A5, 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161,
+ 0xEEA1, 0xEEFE, 0x11BF, 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B,
+ 0xF1A1, 0xF1FE, 0x12D9, 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395,
+ 0xF4A1, 0xF4FE, 0x13F3, 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF,
+ 0xF7A1, 0xF7FE, 0x150D, 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9,
+ 0xFAA1, 0xFAFE, 0x1627, 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3,
+ 0xFDA1, 0xFDCB, 0x1741,
+};
+extern const unsigned short g_FXCMAP_CNS_EUC_H_0_DWord[238 * 4] = {
+ 0x8EA1, 0xA1A1, 0xA1FE, 0x0063, 0x8EA1, 0xA2A1, 0xA2FE, 0x00C1,
+ 0x8EA1, 0xA3A1, 0xA3CE, 0x011F, 0x8EA1, 0xA4A1, 0xA4FE, 0x014D,
+ 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB, 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7,
+ 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA, 0x8EA1, 0xA7A1, 0xA7A1, 0x0253,
+ 0x8EA1, 0xA7A2, 0xA7A4, 0x0218, 0x8EA1, 0xA7A5, 0xA7A5, 0x0254,
+ 0x8EA1, 0xA7A6, 0xA7A6, 0x021B, 0x8EA1, 0xA7A7, 0xA7A7, 0x025A,
+ 0x8EA1, 0xA7A8, 0xA7A8, 0x021C, 0x8EA1, 0xA7A9, 0xA7AC, 0x025B,
+ 0x8EA1, 0xA7AD, 0xA7AF, 0x021D, 0x8EA1, 0xA7B0, 0xA7B0, 0x025F,
+ 0x8EA1, 0xA7B1, 0xA7B1, 0x176E, 0x8EA1, 0xA7B2, 0xA7B2, 0x0260,
+ 0x8EA1, 0xA7B3, 0xA7B3, 0x0262, 0x8EA1, 0xA7B4, 0xA7B4, 0x0220,
+ 0x8EA1, 0xA7B5, 0xA7B5, 0x0263, 0x8EA1, 0xA7B6, 0xA7B6, 0x176F,
+ 0x8EA1, 0xA7B7, 0xA7B7, 0x0221, 0x8EA1, 0xA7B8, 0xA7B9, 0x0264,
+ 0x8EA1, 0xA7BA, 0xA7BA, 0x0222, 0x8EA1, 0xA7BB, 0xA7BB, 0x1770,
+ 0x8EA1, 0xA7BC, 0xA7BC, 0x0223, 0x8EA1, 0xA7BD, 0xA7BD, 0x0266,
+ 0x8EA1, 0xA7BE, 0xA7BE, 0x0279, 0x8EA1, 0xA7BF, 0xA7BF, 0x1775,
+ 0x8EA1, 0xA7C0, 0xA7C1, 0x027A, 0x8EA1, 0xA7C2, 0xA7C2, 0x0224,
+ 0x8EA1, 0xA7C3, 0xA7C6, 0x027C, 0x8EA1, 0xA7C7, 0xA7C7, 0x0225,
+ 0x8EA1, 0xA7C8, 0xA7CB, 0x0282, 0x8EA1, 0xA7CC, 0xA7CC, 0x1776,
+ 0x8EA1, 0xA7CD, 0xA7CD, 0x0286, 0x8EA1, 0xA7CE, 0xA7CE, 0x0226,
+ 0x8EA1, 0xA7CF, 0xA7D0, 0x0288, 0x8EA1, 0xA7D1, 0xA7D2, 0x028C,
+ 0x8EA1, 0xA7D3, 0xA7D5, 0x0227, 0x8EA1, 0xA7D6, 0xA7D8, 0x028E,
+ 0x8EA1, 0xA7D9, 0xA7DA, 0x022A, 0x8EA1, 0xA7DB, 0xA7DB, 0x1777,
+ 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0, 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5,
+ 0x8EA1, 0xA7E1, 0xA7E1, 0x022C, 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6,
+ 0x8EA1, 0xA7E6, 0xA7E6, 0x022D, 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA,
+ 0x8EA1, 0xA7EE, 0xA7EE, 0x178A, 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1,
+ 0x8EA1, 0xA7F3, 0xA7F3, 0x178C, 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5,
+ 0x8EA1, 0xA7F9, 0xA7F9, 0x178D, 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA,
+ 0x8EA1, 0xA7FE, 0xA7FE, 0x0356, 0x8EA1, 0xA8A1, 0xA8A6, 0x0357,
+ 0x8EA1, 0xA8A7, 0xA8A7, 0x035E, 0x8EA1, 0xA8A8, 0xA8A8, 0x0362,
+ 0x8EA1, 0xA8A9, 0xA8AA, 0x022E, 0x8EA1, 0xA8AB, 0xA8B2, 0x0363,
+ 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2, 0x8EA1, 0xA8B4, 0xA8B6, 0x036B,
+ 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6, 0x8EA1, 0xA8BB, 0xA8BB, 0x1812,
+ 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA, 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE,
+ 0x8EA1, 0xA8C4, 0xA8CC, 0x0405, 0x8EA1, 0xA8CD, 0xA8CD, 0x1813,
+ 0x8EA1, 0xA8CE, 0xA8CE, 0x1818, 0x8EA1, 0xA8CF, 0xA8D2, 0x040F,
+ 0x8EA1, 0xA8D3, 0xA8D3, 0x1819, 0x8EA1, 0xA8D4, 0xA8D9, 0x0508,
+ 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7, 0x8EA1, 0xA8DB, 0xA8E2, 0x050E,
+ 0x8EA1, 0xA8E3, 0xA8E3, 0x0230, 0x8EA1, 0xA8E4, 0xA8E4, 0x051B,
+ 0x8EA1, 0xA8E5, 0xA8E7, 0x0520, 0x8EA1, 0xA8E8, 0xA8EB, 0x0696,
+ 0x8EA1, 0xA8EC, 0xA8EC, 0x0231, 0x8EA1, 0xA8ED, 0xA8F0, 0x069F,
+ 0x8EA1, 0xA8F1, 0xA8FB, 0x0826, 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5,
+ 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33, 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8,
+ 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34, 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9,
+ 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1, 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB,
+ 0x8EA1, 0xA9AF, 0xA9AF, 0x2360, 0x8EA1, 0xA9B0, 0xA9B0, 0x2612,
+ 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B, 0x8EA1, 0xA9B4, 0xA9B5, 0x1100,
+ 0x8EA1, 0xA9B6, 0xA9B6, 0x1289, 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2,
+ 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D, 0x8EA1, 0xC2A1, 0xC2C1, 0x0232,
+ 0x8EA1, 0xC4A1, 0xC4FE, 0x0253, 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1,
+ 0x8EA1, 0xC6A1, 0xC6FE, 0x030F, 0x8EA1, 0xC7A1, 0xC7FE, 0x036D,
+ 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB, 0x8EA1, 0xC9A1, 0xC9FE, 0x0429,
+ 0x8EA1, 0xCAA1, 0xCAFE, 0x0487, 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5,
+ 0x8EA1, 0xCCA1, 0xCCFE, 0x0543, 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1,
+ 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF, 0x8EA1, 0xCFA1, 0xCFFE, 0x065D,
+ 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB, 0x8EA1, 0xD1A1, 0xD1FE, 0x0719,
+ 0x8EA1, 0xD2A1, 0xD2FE, 0x0777, 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5,
+ 0x8EA1, 0xD4A1, 0xD4FE, 0x0833, 0x8EA1, 0xD5A1, 0xD5FE, 0x0891,
+ 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF, 0x8EA1, 0xD7A1, 0xD7FE, 0x094D,
+ 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB, 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09,
+ 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67, 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5,
+ 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23, 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81,
+ 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF, 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D,
+ 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B, 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9,
+ 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57, 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5,
+ 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13, 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71,
+ 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF, 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D,
+ 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B, 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9,
+ 0x8EA1, 0xEAA1, 0xEAFE, 0x1047, 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5,
+ 0x8EA1, 0xECA1, 0xECFE, 0x1103, 0x8EA1, 0xEDA1, 0xEDFE, 0x1161,
+ 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF, 0x8EA1, 0xEFA1, 0xEFFE, 0x121D,
+ 0x8EA1, 0xF0A1, 0xF0FE, 0x127B, 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9,
+ 0x8EA1, 0xF2A1, 0xF2FE, 0x1337, 0x8EA1, 0xF3A1, 0xF3FE, 0x1395,
+ 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3, 0x8EA1, 0xF5A1, 0xF5FE, 0x1451,
+ 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF, 0x8EA1, 0xF7A1, 0xF7FE, 0x150D,
+ 0x8EA1, 0xF8A1, 0xF8FE, 0x156B, 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9,
+ 0x8EA1, 0xFAA1, 0xFAFE, 0x1627, 0x8EA1, 0xFBA1, 0xFBFE, 0x1685,
+ 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3, 0x8EA1, 0xFDA1, 0xFDCB, 0x1741,
+ 0x8EA2, 0xA1A1, 0xA1FE, 0x176C, 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA,
+ 0x8EA2, 0xA3A1, 0xA3FE, 0x1828, 0x8EA2, 0xA4A1, 0xA4FE, 0x1886,
+ 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4, 0x8EA2, 0xA6A1, 0xA6FE, 0x1942,
+ 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0, 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE,
+ 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C, 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA,
+ 0x8EA2, 0xABA1, 0xABFE, 0x1B18, 0x8EA2, 0xACA1, 0xACFE, 0x1B76,
+ 0x8EA2, 0xADA1, 0xADFE, 0x1BD4, 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32,
+ 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90, 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE,
+ 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C, 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA,
+ 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08, 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66,
+ 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4, 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22,
+ 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80, 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE,
+ 0x8EA2, 0xB9A1, 0xB9FE, 0x203C, 0x8EA2, 0xBAA1, 0xBAFE, 0x209A,
+ 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8, 0x8EA2, 0xBCA1, 0xBCFE, 0x2156,
+ 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4, 0x8EA2, 0xBEA1, 0xBEFE, 0x2212,
+ 0x8EA2, 0xBFA1, 0xBFFE, 0x2270, 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE,
+ 0x8EA2, 0xC1A1, 0xC1FE, 0x232C, 0x8EA2, 0xC2A1, 0xC2FE, 0x238A,
+ 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8, 0x8EA2, 0xC4A1, 0xC4FE, 0x2446,
+ 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4, 0x8EA2, 0xC6A1, 0xC6FE, 0x2502,
+ 0x8EA2, 0xC7A1, 0xC7FE, 0x2560, 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE,
+ 0x8EA2, 0xC9A1, 0xC9FE, 0x261C, 0x8EA2, 0xCAA1, 0xCAFE, 0x267A,
+ 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8, 0x8EA2, 0xCCA1, 0xCCFE, 0x2736,
+ 0x8EA2, 0xCDA1, 0xCDFE, 0x2794, 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2,
+ 0x8EA2, 0xCFA1, 0xCFFE, 0x2850, 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE,
+ 0x8EA2, 0xD1A1, 0xD1FE, 0x290C, 0x8EA2, 0xD2A1, 0xD2FE, 0x296A,
+ 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8, 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26,
+ 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84, 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2,
+ 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40, 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E,
+ 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC, 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A,
+ 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8, 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16,
+ 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74, 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2,
+ 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30, 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E,
+ 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC, 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A,
+ 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8, 0x8EA2, 0xE4A1, 0xE4FE, 0x3006,
+ 0x8EA2, 0xE5A1, 0xE5FE, 0x3064, 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2,
+ 0x8EA2, 0xE7A1, 0xE7FE, 0x3120, 0x8EA2, 0xE8A1, 0xE8FE, 0x317E,
+ 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC, 0x8EA2, 0xEAA1, 0xEAFE, 0x323A,
+ 0x8EA2, 0xEBA1, 0xEBFE, 0x3298, 0x8EA2, 0xECA1, 0xECFE, 0x32F6,
+ 0x8EA2, 0xEDA1, 0xEDFE, 0x3354, 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2,
+ 0x8EA2, 0xEFA1, 0xEFFE, 0x3410, 0x8EA2, 0xF0A1, 0xF0FE, 0x346E,
+ 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC, 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
new file mode 100644
index 0000000000..8737cf4c90
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_CNS_EUC_V_0[180 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA1A1, 0xA1AB, 0x0063, 0xA1AC, 0xA1AC, 0x354E,
+ 0xA1AD, 0xA1BA, 0x006F, 0xA1BB, 0xA1BB, 0x007C, 0xA1BC, 0xA1BC, 0x007E,
+ 0xA1BD, 0xA1BD, 0x007E, 0xA1BE, 0xA1BF, 0x0082, 0xA1C0, 0xA1C1, 0x0082,
+ 0xA1C2, 0xA1C3, 0x0086, 0xA1C4, 0xA1C5, 0x0086, 0xA1C6, 0xA1C7, 0x008A,
+ 0xA1C8, 0xA1C9, 0x008A, 0xA1CA, 0xA1CB, 0x008E, 0xA1CC, 0xA1CD, 0x008E,
+ 0xA1CE, 0xA1CF, 0x0092, 0xA1D0, 0xA1D1, 0x0092, 0xA1D2, 0xA1D3, 0x0096,
+ 0xA1D4, 0xA1D5, 0x0096, 0xA1D6, 0xA1D7, 0x009A, 0xA1D8, 0xA1D9, 0x009A,
+ 0xA1DA, 0xA1DB, 0x009E, 0xA1DC, 0xA1FE, 0x009E, 0xA2A1, 0xA2C3, 0x00C1,
+ 0xA2C4, 0xA2C4, 0x354F, 0xA2C5, 0xA2FE, 0x00E5, 0xA3A1, 0xA3CE, 0x011F,
+ 0xA4A1, 0xA4FE, 0x014D, 0xA5A1, 0xA5EC, 0x01AB, 0xA5EE, 0xA5F0, 0x01F7,
+ 0xA6A1, 0xA6BE, 0x01FA, 0xA7A1, 0xA7A1, 0x0253, 0xA7A2, 0xA7A4, 0x0218,
+ 0xA7A5, 0xA7A5, 0x0254, 0xA7A6, 0xA7A6, 0x021B, 0xA7A7, 0xA7A7, 0x025A,
+ 0xA7A8, 0xA7A8, 0x021C, 0xA7A9, 0xA7AC, 0x025B, 0xA7AD, 0xA7AF, 0x021D,
+ 0xA7B0, 0xA7B0, 0x025F, 0xA7B1, 0xA7B1, 0x176E, 0xA7B2, 0xA7B2, 0x0260,
+ 0xA7B3, 0xA7B3, 0x0262, 0xA7B4, 0xA7B4, 0x0220, 0xA7B5, 0xA7B5, 0x0263,
+ 0xA7B6, 0xA7B6, 0x176F, 0xA7B7, 0xA7B7, 0x0221, 0xA7B8, 0xA7B9, 0x0264,
+ 0xA7BA, 0xA7BA, 0x0222, 0xA7BB, 0xA7BB, 0x1770, 0xA7BC, 0xA7BC, 0x0223,
+ 0xA7BD, 0xA7BD, 0x0266, 0xA7BE, 0xA7BE, 0x0279, 0xA7BF, 0xA7BF, 0x1775,
+ 0xA7C0, 0xA7C1, 0x027A, 0xA7C2, 0xA7C2, 0x0224, 0xA7C3, 0xA7C6, 0x027C,
+ 0xA7C7, 0xA7C7, 0x0225, 0xA7C8, 0xA7CB, 0x0282, 0xA7CC, 0xA7CC, 0x1776,
+ 0xA7CD, 0xA7CD, 0x0286, 0xA7CE, 0xA7CE, 0x0226, 0xA7CF, 0xA7D0, 0x0288,
+ 0xA7D1, 0xA7D2, 0x028C, 0xA7D3, 0xA7D5, 0x0227, 0xA7D6, 0xA7D8, 0x028E,
+ 0xA7D9, 0xA7DA, 0x022A, 0xA7DB, 0xA7DB, 0x1777, 0xA7DC, 0xA7DF, 0x02D0,
+ 0xA7E0, 0xA7E0, 0x02D5, 0xA7E1, 0xA7E1, 0x022C, 0xA7E2, 0xA7E5, 0x02D6,
+ 0xA7E6, 0xA7E6, 0x022D, 0xA7E7, 0xA7ED, 0x02DA, 0xA7EE, 0xA7EE, 0x178A,
+ 0xA7EF, 0xA7F2, 0x02E1, 0xA7F3, 0xA7F3, 0x178C, 0xA7F4, 0xA7F8, 0x02E5,
+ 0xA7F9, 0xA7F9, 0x178D, 0xA7FA, 0xA7FD, 0x02EA, 0xA7FE, 0xA7FE, 0x0356,
+ 0xA8A1, 0xA8A6, 0x0357, 0xA8A7, 0xA8A7, 0x035E, 0xA8A8, 0xA8A8, 0x0362,
+ 0xA8A9, 0xA8AA, 0x022E, 0xA8AB, 0xA8B2, 0x0363, 0xA8B3, 0xA8B3, 0x17B2,
+ 0xA8B4, 0xA8B6, 0x036B, 0xA8B7, 0xA8BA, 0x03F6, 0xA8BB, 0xA8BB, 0x1812,
+ 0xA8BC, 0xA8BE, 0x03FA, 0xA8BF, 0xA8C3, 0x03FE, 0xA8C4, 0xA8CC, 0x0405,
+ 0xA8CD, 0xA8CD, 0x1813, 0xA8CE, 0xA8CE, 0x1818, 0xA8CF, 0xA8D2, 0x040F,
+ 0xA8D3, 0xA8D3, 0x1819, 0xA8D4, 0xA8D9, 0x0508, 0xA8DA, 0xA8DA, 0x18E7,
+ 0xA8DB, 0xA8E2, 0x050E, 0xA8E3, 0xA8E3, 0x0230, 0xA8E4, 0xA8E4, 0x051B,
+ 0xA8E5, 0xA8E7, 0x0520, 0xA8E8, 0xA8EB, 0x0696, 0xA8EC, 0xA8EC, 0x0231,
+ 0xA8ED, 0xA8F0, 0x069F, 0xA8F1, 0xA8FB, 0x0826, 0xA8FC, 0xA8FE, 0x09F5,
+ 0xA9A1, 0xA9A1, 0x1E33, 0xA9A2, 0xA9A2, 0x09F8, 0xA9A3, 0xA9A3, 0x1E34,
+ 0xA9A4, 0xA9A5, 0x09F9, 0xA9A6, 0xA9AB, 0x0BE1, 0xA9AC, 0xA9AE, 0x0DBB,
+ 0xA9AF, 0xA9AF, 0x2360, 0xA9B0, 0xA9B0, 0x2612, 0xA9B1, 0xA9B3, 0x0F7B,
+ 0xA9B4, 0xA9B5, 0x1100, 0xA9B6, 0xA9B6, 0x1289, 0xA9B7, 0xA9B8, 0x13B2,
+ 0xA9B9, 0xA9B9, 0x2F0D, 0xC2A1, 0xC2C1, 0x0232, 0xC4A1, 0xC4FE, 0x0253,
+ 0xC5A1, 0xC5FE, 0x02B1, 0xC6A1, 0xC6FE, 0x030F, 0xC7A1, 0xC7FE, 0x036D,
+ 0xC8A1, 0xC8FE, 0x03CB, 0xC9A1, 0xC9FE, 0x0429, 0xCAA1, 0xCAFE, 0x0487,
+ 0xCBA1, 0xCBFE, 0x04E5, 0xCCA1, 0xCCFE, 0x0543, 0xCDA1, 0xCDFE, 0x05A1,
+ 0xCEA1, 0xCEFE, 0x05FF, 0xCFA1, 0xCFFE, 0x065D, 0xD0A1, 0xD0FE, 0x06BB,
+ 0xD1A1, 0xD1FE, 0x0719, 0xD2A1, 0xD2FE, 0x0777, 0xD3A1, 0xD3FE, 0x07D5,
+ 0xD4A1, 0xD4FE, 0x0833, 0xD5A1, 0xD5FE, 0x0891, 0xD6A1, 0xD6FE, 0x08EF,
+ 0xD7A1, 0xD7FE, 0x094D, 0xD8A1, 0xD8FE, 0x09AB, 0xD9A1, 0xD9FE, 0x0A09,
+ 0xDAA1, 0xDAFE, 0x0A67, 0xDBA1, 0xDBFE, 0x0AC5, 0xDCA1, 0xDCFE, 0x0B23,
+ 0xDDA1, 0xDDFE, 0x0B81, 0xDEA1, 0xDEFE, 0x0BDF, 0xDFA1, 0xDFFE, 0x0C3D,
+ 0xE0A1, 0xE0FE, 0x0C9B, 0xE1A1, 0xE1FE, 0x0CF9, 0xE2A1, 0xE2FE, 0x0D57,
+ 0xE3A1, 0xE3FE, 0x0DB5, 0xE4A1, 0xE4FE, 0x0E13, 0xE5A1, 0xE5FE, 0x0E71,
+ 0xE6A1, 0xE6FE, 0x0ECF, 0xE7A1, 0xE7FE, 0x0F2D, 0xE8A1, 0xE8FE, 0x0F8B,
+ 0xE9A1, 0xE9FE, 0x0FE9, 0xEAA1, 0xEAFE, 0x1047, 0xEBA1, 0xEBFE, 0x10A5,
+ 0xECA1, 0xECFE, 0x1103, 0xEDA1, 0xEDFE, 0x1161, 0xEEA1, 0xEEFE, 0x11BF,
+ 0xEFA1, 0xEFFE, 0x121D, 0xF0A1, 0xF0FE, 0x127B, 0xF1A1, 0xF1FE, 0x12D9,
+ 0xF2A1, 0xF2FE, 0x1337, 0xF3A1, 0xF3FE, 0x1395, 0xF4A1, 0xF4FE, 0x13F3,
+ 0xF5A1, 0xF5FE, 0x1451, 0xF6A1, 0xF6FE, 0x14AF, 0xF7A1, 0xF7FE, 0x150D,
+ 0xF8A1, 0xF8FE, 0x156B, 0xF9A1, 0xF9FE, 0x15C9, 0xFAA1, 0xFAFE, 0x1627,
+ 0xFBA1, 0xFBFE, 0x1685, 0xFCA1, 0xFCFE, 0x16E3, 0xFDA1, 0xFDCB, 0x1741,
+};
+extern const unsigned short g_FXCMAP_CNS_EUC_V_0_DWord[261 * 4] = {
+ 0x8EA1, 0xA1A1, 0xA1AB, 0x0063, 0x8EA1, 0xA1AC, 0xA1AC, 0x354E,
+ 0x8EA1, 0xA1AD, 0xA1BA, 0x006F, 0x8EA1, 0xA1BB, 0xA1BB, 0x007C,
+ 0x8EA1, 0xA1BC, 0xA1BC, 0x007E, 0x8EA1, 0xA1BD, 0xA1BD, 0x007E,
+ 0x8EA1, 0xA1BE, 0xA1BF, 0x0082, 0x8EA1, 0xA1C0, 0xA1C1, 0x0082,
+ 0x8EA1, 0xA1C2, 0xA1C3, 0x0086, 0x8EA1, 0xA1C4, 0xA1C5, 0x0086,
+ 0x8EA1, 0xA1C6, 0xA1C7, 0x008A, 0x8EA1, 0xA1C8, 0xA1C9, 0x008A,
+ 0x8EA1, 0xA1CA, 0xA1CB, 0x008E, 0x8EA1, 0xA1CC, 0xA1CD, 0x008E,
+ 0x8EA1, 0xA1CE, 0xA1CF, 0x0092, 0x8EA1, 0xA1D0, 0xA1D1, 0x0092,
+ 0x8EA1, 0xA1D2, 0xA1D3, 0x0096, 0x8EA1, 0xA1D4, 0xA1D5, 0x0096,
+ 0x8EA1, 0xA1D6, 0xA1D7, 0x009A, 0x8EA1, 0xA1D8, 0xA1D9, 0x009A,
+ 0x8EA1, 0xA1DA, 0xA1DB, 0x009E, 0x8EA1, 0xA1DC, 0xA1FE, 0x009E,
+ 0x8EA1, 0xA2A1, 0xA2C3, 0x00C1, 0x8EA1, 0xA2C4, 0xA2C4, 0x354F,
+ 0x8EA1, 0xA2C5, 0xA2FE, 0x00E5, 0x8EA1, 0xA3A1, 0xA3CE, 0x011F,
+ 0x8EA1, 0xA4A1, 0xA4FE, 0x014D, 0x8EA1, 0xA5A1, 0xA5EC, 0x01AB,
+ 0x8EA1, 0xA5EE, 0xA5F0, 0x01F7, 0x8EA1, 0xA6A1, 0xA6BE, 0x01FA,
+ 0x8EA1, 0xA7A1, 0xA7A1, 0x0253, 0x8EA1, 0xA7A2, 0xA7A4, 0x0218,
+ 0x8EA1, 0xA7A5, 0xA7A5, 0x0254, 0x8EA1, 0xA7A6, 0xA7A6, 0x021B,
+ 0x8EA1, 0xA7A7, 0xA7A7, 0x025A, 0x8EA1, 0xA7A8, 0xA7A8, 0x021C,
+ 0x8EA1, 0xA7A9, 0xA7AC, 0x025B, 0x8EA1, 0xA7AD, 0xA7AF, 0x021D,
+ 0x8EA1, 0xA7B0, 0xA7B0, 0x025F, 0x8EA1, 0xA7B1, 0xA7B1, 0x176E,
+ 0x8EA1, 0xA7B2, 0xA7B2, 0x0260, 0x8EA1, 0xA7B3, 0xA7B3, 0x0262,
+ 0x8EA1, 0xA7B4, 0xA7B4, 0x0220, 0x8EA1, 0xA7B5, 0xA7B5, 0x0263,
+ 0x8EA1, 0xA7B6, 0xA7B6, 0x176F, 0x8EA1, 0xA7B7, 0xA7B7, 0x0221,
+ 0x8EA1, 0xA7B8, 0xA7B9, 0x0264, 0x8EA1, 0xA7BA, 0xA7BA, 0x0222,
+ 0x8EA1, 0xA7BB, 0xA7BB, 0x1770, 0x8EA1, 0xA7BC, 0xA7BC, 0x0223,
+ 0x8EA1, 0xA7BD, 0xA7BD, 0x0266, 0x8EA1, 0xA7BE, 0xA7BE, 0x0279,
+ 0x8EA1, 0xA7BF, 0xA7BF, 0x1775, 0x8EA1, 0xA7C0, 0xA7C1, 0x027A,
+ 0x8EA1, 0xA7C2, 0xA7C2, 0x0224, 0x8EA1, 0xA7C3, 0xA7C6, 0x027C,
+ 0x8EA1, 0xA7C7, 0xA7C7, 0x0225, 0x8EA1, 0xA7C8, 0xA7CB, 0x0282,
+ 0x8EA1, 0xA7CC, 0xA7CC, 0x1776, 0x8EA1, 0xA7CD, 0xA7CD, 0x0286,
+ 0x8EA1, 0xA7CE, 0xA7CE, 0x0226, 0x8EA1, 0xA7CF, 0xA7D0, 0x0288,
+ 0x8EA1, 0xA7D1, 0xA7D2, 0x028C, 0x8EA1, 0xA7D3, 0xA7D5, 0x0227,
+ 0x8EA1, 0xA7D6, 0xA7D8, 0x028E, 0x8EA1, 0xA7D9, 0xA7DA, 0x022A,
+ 0x8EA1, 0xA7DB, 0xA7DB, 0x1777, 0x8EA1, 0xA7DC, 0xA7DF, 0x02D0,
+ 0x8EA1, 0xA7E0, 0xA7E0, 0x02D5, 0x8EA1, 0xA7E1, 0xA7E1, 0x022C,
+ 0x8EA1, 0xA7E2, 0xA7E5, 0x02D6, 0x8EA1, 0xA7E6, 0xA7E6, 0x022D,
+ 0x8EA1, 0xA7E7, 0xA7ED, 0x02DA, 0x8EA1, 0xA7EE, 0xA7EE, 0x178A,
+ 0x8EA1, 0xA7EF, 0xA7F2, 0x02E1, 0x8EA1, 0xA7F3, 0xA7F3, 0x178C,
+ 0x8EA1, 0xA7F4, 0xA7F8, 0x02E5, 0x8EA1, 0xA7F9, 0xA7F9, 0x178D,
+ 0x8EA1, 0xA7FA, 0xA7FD, 0x02EA, 0x8EA1, 0xA7FE, 0xA7FE, 0x0356,
+ 0x8EA1, 0xA8A1, 0xA8A6, 0x0357, 0x8EA1, 0xA8A7, 0xA8A7, 0x035E,
+ 0x8EA1, 0xA8A8, 0xA8A8, 0x0362, 0x8EA1, 0xA8A9, 0xA8AA, 0x022E,
+ 0x8EA1, 0xA8AB, 0xA8B2, 0x0363, 0x8EA1, 0xA8B3, 0xA8B3, 0x17B2,
+ 0x8EA1, 0xA8B4, 0xA8B6, 0x036B, 0x8EA1, 0xA8B7, 0xA8BA, 0x03F6,
+ 0x8EA1, 0xA8BB, 0xA8BB, 0x1812, 0x8EA1, 0xA8BC, 0xA8BE, 0x03FA,
+ 0x8EA1, 0xA8BF, 0xA8C3, 0x03FE, 0x8EA1, 0xA8C4, 0xA8CC, 0x0405,
+ 0x8EA1, 0xA8CD, 0xA8CD, 0x1813, 0x8EA1, 0xA8CE, 0xA8CE, 0x1818,
+ 0x8EA1, 0xA8CF, 0xA8D2, 0x040F, 0x8EA1, 0xA8D3, 0xA8D3, 0x1819,
+ 0x8EA1, 0xA8D4, 0xA8D9, 0x0508, 0x8EA1, 0xA8DA, 0xA8DA, 0x18E7,
+ 0x8EA1, 0xA8DB, 0xA8E2, 0x050E, 0x8EA1, 0xA8E3, 0xA8E3, 0x0230,
+ 0x8EA1, 0xA8E4, 0xA8E4, 0x051B, 0x8EA1, 0xA8E5, 0xA8E7, 0x0520,
+ 0x8EA1, 0xA8E8, 0xA8EB, 0x0696, 0x8EA1, 0xA8EC, 0xA8EC, 0x0231,
+ 0x8EA1, 0xA8ED, 0xA8F0, 0x069F, 0x8EA1, 0xA8F1, 0xA8FB, 0x0826,
+ 0x8EA1, 0xA8FC, 0xA8FE, 0x09F5, 0x8EA1, 0xA9A1, 0xA9A1, 0x1E33,
+ 0x8EA1, 0xA9A2, 0xA9A2, 0x09F8, 0x8EA1, 0xA9A3, 0xA9A3, 0x1E34,
+ 0x8EA1, 0xA9A4, 0xA9A5, 0x09F9, 0x8EA1, 0xA9A6, 0xA9AB, 0x0BE1,
+ 0x8EA1, 0xA9AC, 0xA9AE, 0x0DBB, 0x8EA1, 0xA9AF, 0xA9AF, 0x2360,
+ 0x8EA1, 0xA9B0, 0xA9B0, 0x2612, 0x8EA1, 0xA9B1, 0xA9B3, 0x0F7B,
+ 0x8EA1, 0xA9B4, 0xA9B5, 0x1100, 0x8EA1, 0xA9B6, 0xA9B6, 0x1289,
+ 0x8EA1, 0xA9B7, 0xA9B8, 0x13B2, 0x8EA1, 0xA9B9, 0xA9B9, 0x2F0D,
+ 0x8EA1, 0xC2A1, 0xC2C1, 0x0232, 0x8EA1, 0xC4A1, 0xC4FE, 0x0253,
+ 0x8EA1, 0xC5A1, 0xC5FE, 0x02B1, 0x8EA1, 0xC6A1, 0xC6FE, 0x030F,
+ 0x8EA1, 0xC7A1, 0xC7FE, 0x036D, 0x8EA1, 0xC8A1, 0xC8FE, 0x03CB,
+ 0x8EA1, 0xC9A1, 0xC9FE, 0x0429, 0x8EA1, 0xCAA1, 0xCAFE, 0x0487,
+ 0x8EA1, 0xCBA1, 0xCBFE, 0x04E5, 0x8EA1, 0xCCA1, 0xCCFE, 0x0543,
+ 0x8EA1, 0xCDA1, 0xCDFE, 0x05A1, 0x8EA1, 0xCEA1, 0xCEFE, 0x05FF,
+ 0x8EA1, 0xCFA1, 0xCFFE, 0x065D, 0x8EA1, 0xD0A1, 0xD0FE, 0x06BB,
+ 0x8EA1, 0xD1A1, 0xD1FE, 0x0719, 0x8EA1, 0xD2A1, 0xD2FE, 0x0777,
+ 0x8EA1, 0xD3A1, 0xD3FE, 0x07D5, 0x8EA1, 0xD4A1, 0xD4FE, 0x0833,
+ 0x8EA1, 0xD5A1, 0xD5FE, 0x0891, 0x8EA1, 0xD6A1, 0xD6FE, 0x08EF,
+ 0x8EA1, 0xD7A1, 0xD7FE, 0x094D, 0x8EA1, 0xD8A1, 0xD8FE, 0x09AB,
+ 0x8EA1, 0xD9A1, 0xD9FE, 0x0A09, 0x8EA1, 0xDAA1, 0xDAFE, 0x0A67,
+ 0x8EA1, 0xDBA1, 0xDBFE, 0x0AC5, 0x8EA1, 0xDCA1, 0xDCFE, 0x0B23,
+ 0x8EA1, 0xDDA1, 0xDDFE, 0x0B81, 0x8EA1, 0xDEA1, 0xDEFE, 0x0BDF,
+ 0x8EA1, 0xDFA1, 0xDFFE, 0x0C3D, 0x8EA1, 0xE0A1, 0xE0FE, 0x0C9B,
+ 0x8EA1, 0xE1A1, 0xE1FE, 0x0CF9, 0x8EA1, 0xE2A1, 0xE2FE, 0x0D57,
+ 0x8EA1, 0xE3A1, 0xE3FE, 0x0DB5, 0x8EA1, 0xE4A1, 0xE4FE, 0x0E13,
+ 0x8EA1, 0xE5A1, 0xE5FE, 0x0E71, 0x8EA1, 0xE6A1, 0xE6FE, 0x0ECF,
+ 0x8EA1, 0xE7A1, 0xE7FE, 0x0F2D, 0x8EA1, 0xE8A1, 0xE8FE, 0x0F8B,
+ 0x8EA1, 0xE9A1, 0xE9FE, 0x0FE9, 0x8EA1, 0xEAA1, 0xEAFE, 0x1047,
+ 0x8EA1, 0xEBA1, 0xEBFE, 0x10A5, 0x8EA1, 0xECA1, 0xECFE, 0x1103,
+ 0x8EA1, 0xEDA1, 0xEDFE, 0x1161, 0x8EA1, 0xEEA1, 0xEEFE, 0x11BF,
+ 0x8EA1, 0xEFA1, 0xEFFE, 0x121D, 0x8EA1, 0xF0A1, 0xF0FE, 0x127B,
+ 0x8EA1, 0xF1A1, 0xF1FE, 0x12D9, 0x8EA1, 0xF2A1, 0xF2FE, 0x1337,
+ 0x8EA1, 0xF3A1, 0xF3FE, 0x1395, 0x8EA1, 0xF4A1, 0xF4FE, 0x13F3,
+ 0x8EA1, 0xF5A1, 0xF5FE, 0x1451, 0x8EA1, 0xF6A1, 0xF6FE, 0x14AF,
+ 0x8EA1, 0xF7A1, 0xF7FE, 0x150D, 0x8EA1, 0xF8A1, 0xF8FE, 0x156B,
+ 0x8EA1, 0xF9A1, 0xF9FE, 0x15C9, 0x8EA1, 0xFAA1, 0xFAFE, 0x1627,
+ 0x8EA1, 0xFBA1, 0xFBFE, 0x1685, 0x8EA1, 0xFCA1, 0xFCFE, 0x16E3,
+ 0x8EA1, 0xFDA1, 0xFDCB, 0x1741, 0x8EA2, 0xA1A1, 0xA1FE, 0x176C,
+ 0x8EA2, 0xA2A1, 0xA2FE, 0x17CA, 0x8EA2, 0xA3A1, 0xA3FE, 0x1828,
+ 0x8EA2, 0xA4A1, 0xA4FE, 0x1886, 0x8EA2, 0xA5A1, 0xA5FE, 0x18E4,
+ 0x8EA2, 0xA6A1, 0xA6FE, 0x1942, 0x8EA2, 0xA7A1, 0xA7FE, 0x19A0,
+ 0x8EA2, 0xA8A1, 0xA8FE, 0x19FE, 0x8EA2, 0xA9A1, 0xA9FE, 0x1A5C,
+ 0x8EA2, 0xAAA1, 0xAAFE, 0x1ABA, 0x8EA2, 0xABA1, 0xABFE, 0x1B18,
+ 0x8EA2, 0xACA1, 0xACFE, 0x1B76, 0x8EA2, 0xADA1, 0xADFE, 0x1BD4,
+ 0x8EA2, 0xAEA1, 0xAEFE, 0x1C32, 0x8EA2, 0xAFA1, 0xAFFE, 0x1C90,
+ 0x8EA2, 0xB0A1, 0xB0FE, 0x1CEE, 0x8EA2, 0xB1A1, 0xB1FE, 0x1D4C,
+ 0x8EA2, 0xB2A1, 0xB2FE, 0x1DAA, 0x8EA2, 0xB3A1, 0xB3FE, 0x1E08,
+ 0x8EA2, 0xB4A1, 0xB4FE, 0x1E66, 0x8EA2, 0xB5A1, 0xB5FE, 0x1EC4,
+ 0x8EA2, 0xB6A1, 0xB6FE, 0x1F22, 0x8EA2, 0xB7A1, 0xB7FE, 0x1F80,
+ 0x8EA2, 0xB8A1, 0xB8FE, 0x1FDE, 0x8EA2, 0xB9A1, 0xB9FE, 0x203C,
+ 0x8EA2, 0xBAA1, 0xBAFE, 0x209A, 0x8EA2, 0xBBA1, 0xBBFE, 0x20F8,
+ 0x8EA2, 0xBCA1, 0xBCFE, 0x2156, 0x8EA2, 0xBDA1, 0xBDFE, 0x21B4,
+ 0x8EA2, 0xBEA1, 0xBEFE, 0x2212, 0x8EA2, 0xBFA1, 0xBFFE, 0x2270,
+ 0x8EA2, 0xC0A1, 0xC0FE, 0x22CE, 0x8EA2, 0xC1A1, 0xC1FE, 0x232C,
+ 0x8EA2, 0xC2A1, 0xC2FE, 0x238A, 0x8EA2, 0xC3A1, 0xC3FE, 0x23E8,
+ 0x8EA2, 0xC4A1, 0xC4FE, 0x2446, 0x8EA2, 0xC5A1, 0xC5FE, 0x24A4,
+ 0x8EA2, 0xC6A1, 0xC6FE, 0x2502, 0x8EA2, 0xC7A1, 0xC7FE, 0x2560,
+ 0x8EA2, 0xC8A1, 0xC8FE, 0x25BE, 0x8EA2, 0xC9A1, 0xC9FE, 0x261C,
+ 0x8EA2, 0xCAA1, 0xCAFE, 0x267A, 0x8EA2, 0xCBA1, 0xCBFE, 0x26D8,
+ 0x8EA2, 0xCCA1, 0xCCFE, 0x2736, 0x8EA2, 0xCDA1, 0xCDFE, 0x2794,
+ 0x8EA2, 0xCEA1, 0xCEFE, 0x27F2, 0x8EA2, 0xCFA1, 0xCFFE, 0x2850,
+ 0x8EA2, 0xD0A1, 0xD0FE, 0x28AE, 0x8EA2, 0xD1A1, 0xD1FE, 0x290C,
+ 0x8EA2, 0xD2A1, 0xD2FE, 0x296A, 0x8EA2, 0xD3A1, 0xD3FE, 0x29C8,
+ 0x8EA2, 0xD4A1, 0xD4FE, 0x2A26, 0x8EA2, 0xD5A1, 0xD5FE, 0x2A84,
+ 0x8EA2, 0xD6A1, 0xD6FE, 0x2AE2, 0x8EA2, 0xD7A1, 0xD7FE, 0x2B40,
+ 0x8EA2, 0xD8A1, 0xD8FE, 0x2B9E, 0x8EA2, 0xD9A1, 0xD9FE, 0x2BFC,
+ 0x8EA2, 0xDAA1, 0xDAFE, 0x2C5A, 0x8EA2, 0xDBA1, 0xDBFE, 0x2CB8,
+ 0x8EA2, 0xDCA1, 0xDCFE, 0x2D16, 0x8EA2, 0xDDA1, 0xDDFE, 0x2D74,
+ 0x8EA2, 0xDEA1, 0xDEFE, 0x2DD2, 0x8EA2, 0xDFA1, 0xDFFE, 0x2E30,
+ 0x8EA2, 0xE0A1, 0xE0FE, 0x2E8E, 0x8EA2, 0xE1A1, 0xE1FE, 0x2EEC,
+ 0x8EA2, 0xE2A1, 0xE2FE, 0x2F4A, 0x8EA2, 0xE3A1, 0xE3FE, 0x2FA8,
+ 0x8EA2, 0xE4A1, 0xE4FE, 0x3006, 0x8EA2, 0xE5A1, 0xE5FE, 0x3064,
+ 0x8EA2, 0xE6A1, 0xE6FE, 0x30C2, 0x8EA2, 0xE7A1, 0xE7FE, 0x3120,
+ 0x8EA2, 0xE8A1, 0xE8FE, 0x317E, 0x8EA2, 0xE9A1, 0xE9FE, 0x31DC,
+ 0x8EA2, 0xEAA1, 0xEAFE, 0x323A, 0x8EA2, 0xEBA1, 0xEBFE, 0x3298,
+ 0x8EA2, 0xECA1, 0xECFE, 0x32F6, 0x8EA2, 0xEDA1, 0xEDFE, 0x3354,
+ 0x8EA2, 0xEEA1, 0xEEFE, 0x33B2, 0x8EA2, 0xEFA1, 0xEFFE, 0x3410,
+ 0x8EA2, 0xF0A1, 0xF0FE, 0x346E, 0x8EA2, 0xF1A1, 0xF1FE, 0x34CC,
+ 0x8EA2, 0xF2A1, 0xF2C4, 0x352A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
new file mode 100644
index 0000000000..f1c9483239
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp
@@ -0,0 +1,93 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETen_B5_H_0[254 * 3] = {
+ 0x0020, 0x007E, 0x3550, 0xA140, 0xA158, 0x0063, 0xA159, 0xA15C, 0x35AF,
+ 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2, 0xA1F6, 0xA1F6, 0x00F8,
+ 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9, 0xA240, 0xA27E, 0x0100,
+ 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D, 0xA3A1, 0xA3BB, 0x01DC,
+ 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253, 0xA4A1, 0xA4FE, 0x0292,
+ 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F, 0xA640, 0xA67E, 0x038D,
+ 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A, 0xA7A1, 0xA7FE, 0x0469,
+ 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506, 0xA940, 0xA97E, 0x0564,
+ 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601, 0xAAA1, 0xAAFE, 0x0640,
+ 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD, 0xAC40, 0xAC7E, 0x073B,
+ 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F, 0xAD40, 0xAD7E, 0x07D7,
+ 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874, 0xAEA1, 0xAEFE, 0x08B3,
+ 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950, 0xAFD0, 0xAFFE, 0x0980,
+ 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE, 0xB140, 0xB17E, 0x0A4C,
+ 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9, 0xB2A1, 0xB2FE, 0x0B28,
+ 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5, 0xB440, 0xB47E, 0x0C23,
+ 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0, 0xB5A1, 0xB5FE, 0x0CFF,
+ 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C, 0xB740, 0xB77E, 0x0DFA,
+ 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97, 0xB8A1, 0xB8FE, 0x0ED6,
+ 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73, 0xBA40, 0xBA7E, 0x0FD1,
+ 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E, 0xBBA1, 0xBBC7, 0x10AD,
+ 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C, 0xBCA1, 0xBCFE, 0x114B,
+ 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8, 0xBE40, 0xBE51, 0x1246,
+ 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258, 0xBEA1, 0xBEFE, 0x1284,
+ 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321, 0xC040, 0xC07E, 0x137F,
+ 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C, 0xC1A1, 0xC1AA, 0x145B,
+ 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA, 0xC2A1, 0xC2CA, 0x14F9,
+ 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523, 0xC340, 0xC360, 0x1556,
+ 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596, 0xC3B9, 0xC3B9, 0x15AF,
+ 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0, 0xC440, 0xC455, 0x15F4,
+ 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A, 0xC4A1, 0xC4FE, 0x1632,
+ 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF, 0xC640, 0xC67E, 0x172D,
+ 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6D7, 0x0219, 0xC6D8, 0xC6DE, 0x35B3,
+ 0xC6DF, 0xC6DF, 0x1794, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,
+ 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8D3, 0x36B5,
+ 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+ 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+ 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+ 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+ 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+ 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+ 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+ 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+ 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+ 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+ 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+ 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+ 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+ 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+ 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+ 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+ 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+ 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+ 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+ 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+ 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+ 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+ 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+ 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+ 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+ 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+ 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+ 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+ 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+ 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+ 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+ 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+ 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+ 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+ 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+ 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+ 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+ 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+ 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+ 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+ 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+ 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+ 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+ 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+ 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+ 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+ 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+ 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+ 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+ 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
new file mode 100644
index 0000000000..e1d9e238f8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETen_B5_V_0[13 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+ 0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
new file mode 100644
index 0000000000..1b5136e2ba
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETenms_B5_H_0[1 * 3] = {
+ 0x0020, 0x007E, 0x0001,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
new file mode 100644
index 0000000000..1b8ad0eb87
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_ETenms_B5_V_0[18 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA14C, 0xA14C, 0x006D, 0xA156, 0xA156, 0x0138,
+ 0xA158, 0xA158, 0x007A, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA17D, 0xA17E, 0x0082,
+ 0xA1A1, 0xA1A2, 0x0086, 0xA1A3, 0xA1A4, 0x008A, 0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp
new file mode 100644
index 0000000000..287c10e267
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp
@@ -0,0 +1,412 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_HKscs_B5_H_5[1210 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8740, 0x8765, 0x4A15, 0x8767, 0x8779, 0x4A3B,
+ 0x8840, 0x8855, 0x44C9, 0x8856, 0x887E, 0x4961, 0x88A1, 0x88A8, 0x498A,
+ 0x88A9, 0x88AA, 0x499C, 0x8940, 0x8941, 0x4534, 0x8943, 0x8943, 0x4536,
+ 0x8946, 0x8949, 0x4537, 0x894C, 0x894C, 0x453B, 0x894D, 0x894D, 0x43C3,
+ 0x894E, 0x8950, 0x453C, 0x8951, 0x8951, 0x439A, 0x8952, 0x897E, 0x453F,
+ 0x89A1, 0x89A5, 0x456C, 0x89A6, 0x89A6, 0x43A2, 0x89AB, 0x89AB, 0x43EC,
+ 0x89AC, 0x89AC, 0x4571, 0x89AD, 0x89AD, 0x43EB, 0x89AE, 0x89AE, 0x4572,
+ 0x89B0, 0x89B2, 0x4573, 0x89B5, 0x89BF, 0x4576, 0x89C1, 0x89C3, 0x4581,
+ 0x89C5, 0x89CE, 0x4584, 0x89CF, 0x89CF, 0x43BC, 0x89D0, 0x89D8, 0x458E,
+ 0x89D9, 0x89D9, 0x439C, 0x89DA, 0x89DA, 0x4597, 0x89DB, 0x89DB, 0x439E,
+ 0x89DC, 0x89DC, 0x4598, 0x89DD, 0x89DD, 0x439F, 0x89DE, 0x89E0, 0x4599,
+ 0x89E1, 0x89E1, 0x43A1, 0x89E2, 0x89E2, 0x459C, 0x89E3, 0x89E3, 0x43A3,
+ 0x89E4, 0x89E9, 0x459D, 0x89EA, 0x89EB, 0x43A5, 0x89EC, 0x89F9, 0x45A3,
+ 0x89FA, 0x89FA, 0x43A9, 0x89FB, 0x89FE, 0x45B1, 0x8A40, 0x8A40, 0x45B5,
+ 0x8A41, 0x8A41, 0x4309, 0x8A43, 0x8A4C, 0x430B, 0x8A4D, 0x8A4D, 0x45B6,
+ 0x8A4E, 0x8A59, 0x4316, 0x8A5A, 0x8A5A, 0x45B7, 0x8A5B, 0x8A5D, 0x4323,
+ 0x8A5E, 0x8A5E, 0x45B8, 0x8A5F, 0x8A62, 0x4327, 0x8A64, 0x8A70, 0x432C,
+ 0x8A71, 0x8A71, 0x45B9, 0x8A72, 0x8A74, 0x433A, 0x8A76, 0x8A76, 0x433E,
+ 0x8A77, 0x8A77, 0x45BA, 0x8A78, 0x8A79, 0x4340, 0x8A7A, 0x8A7A, 0x45BB,
+ 0x8A7B, 0x8A7B, 0x4343, 0x8A7C, 0x8A7C, 0x45BC, 0x8A7D, 0x8A7D, 0x4345,
+ 0x8A7E, 0x8A7E, 0x45BD, 0x8AA1, 0x8AA7, 0x4347, 0x8AA8, 0x8AA8, 0x45BE,
+ 0x8AA9, 0x8AAA, 0x434F, 0x8AAC, 0x8AB0, 0x4352, 0x8AB2, 0x8AB5, 0x4358,
+ 0x8AB6, 0x8AB6, 0x45BF, 0x8AB7, 0x8AB7, 0x435D, 0x8AB8, 0x8AB8, 0x45C0,
+ 0x8AB9, 0x8AB9, 0x435F, 0x8ABB, 0x8AC7, 0x4361, 0x8AC9, 0x8ACB, 0x436F,
+ 0x8ACC, 0x8ACC, 0x45C1, 0x8ACE, 0x8AD5, 0x4374, 0x8AD6, 0x8AD7, 0x45C2,
+ 0x8AD8, 0x8ADC, 0x437E, 0x8ADF, 0x8AE5, 0x4385, 0x8AE6, 0x8AE6, 0x45C4,
+ 0x8AE7, 0x8AE7, 0x43DB, 0x8AE8, 0x8AF4, 0x45C5, 0x8AF6, 0x8AFE, 0x45D2,
+ 0x8B40, 0x8B40, 0x45DB, 0x8B41, 0x8B42, 0x438C, 0x8B43, 0x8B44, 0x45DC,
+ 0x8B45, 0x8B45, 0x438E, 0x8B46, 0x8B46, 0x45DE, 0x8B47, 0x8B47, 0x438F,
+ 0x8B48, 0x8B48, 0x45DF, 0x8B49, 0x8B49, 0x4390, 0x8B4A, 0x8B4A, 0x45E0,
+ 0x8B4B, 0x8B4B, 0x4391, 0x8B4C, 0x8B4C, 0x45E1, 0x8B4D, 0x8B50, 0x4392,
+ 0x8B51, 0x8B53, 0x45E2, 0x8B55, 0x8B57, 0x45E5, 0x8B58, 0x8B58, 0x4397,
+ 0x8B59, 0x8B59, 0x45E8, 0x8B5A, 0x8B5A, 0x4398, 0x8B5B, 0x8B5B, 0x43C4,
+ 0x8B5C, 0x8B60, 0x45E9, 0x8B61, 0x8B61, 0x43A7, 0x8B62, 0x8B67, 0x45EE,
+ 0x8B68, 0x8B68, 0x43AC, 0x8B69, 0x8B7E, 0x45F4, 0x8BA1, 0x8BBF, 0x460A,
+ 0x8BC0, 0x8BDC, 0x44DF, 0x8BDE, 0x8BFD, 0x44FC, 0x8C40, 0x8C61, 0x49A1,
+ 0x8C62, 0x8C62, 0x4A4E, 0x8C63, 0x8C7E, 0x49C3, 0x8CA1, 0x8CA5, 0x49DF,
+ 0x8CA7, 0x8CC5, 0x49E4, 0x8CC9, 0x8CCC, 0x4A03, 0x8CCE, 0x8CDA, 0x4A07,
+ 0x8CDB, 0x8CDB, 0x4A4F, 0x8CDC, 0x8CDC, 0x4A14, 0x8CDD, 0x8CE4, 0x4A50,
+ 0x8CE6, 0x8CFE, 0x4A58, 0x8D40, 0x8D40, 0x4A71, 0x8D42, 0x8D5F, 0x4A72,
+ 0x8D60, 0x8D61, 0x4629, 0x8D62, 0x8D62, 0x43BA, 0x8D63, 0x8D67, 0x462B,
+ 0x8D68, 0x8D68, 0x43BB, 0x8D69, 0x8D69, 0x43A0, 0x8D6A, 0x8D6A, 0x43BD,
+ 0x8D6B, 0x8D6D, 0x4630, 0x8D6E, 0x8D6E, 0x43BE, 0x8D6F, 0x8D75, 0x4633,
+ 0x8D76, 0x8D76, 0x43BF, 0x8D77, 0x8D79, 0x463A, 0x8D7A, 0x8D7A, 0x43C0,
+ 0x8D7B, 0x8D7B, 0x463D, 0x8D7C, 0x8D7C, 0x43C1, 0x8D7D, 0x8D7E, 0x463E,
+ 0x8DA1, 0x8DA4, 0x4640, 0x8DA5, 0x8DA5, 0x43C2, 0x8DA6, 0x8DA7, 0x4644,
+ 0x8DA8, 0x8DA8, 0x43B9, 0x8DA9, 0x8DA9, 0x43AD, 0x8DAA, 0x8DB5, 0x4646,
+ 0x8DB6, 0x8DB6, 0x43C7, 0x8DB7, 0x8DC2, 0x4652, 0x8DC3, 0x8DC3, 0x43C8,
+ 0x8DC4, 0x8DF9, 0x465E, 0x8DFA, 0x8DFA, 0x43F9, 0x8DFB, 0x8DFE, 0x4694,
+ 0x8E40, 0x8E44, 0x372B, 0x8E45, 0x8E45, 0x4698, 0x8E46, 0x8E68, 0x3730,
+ 0x8E69, 0x8E69, 0x1055, 0x8E6A, 0x8E6A, 0x3754, 0x8E6B, 0x8E6C, 0x4699,
+ 0x8E6D, 0x8E6E, 0x3756, 0x8E6F, 0x8E6F, 0x2DE8, 0x8E70, 0x8E75, 0x3759,
+ 0x8E76, 0x8E76, 0x469B, 0x8E77, 0x8E7A, 0x375F, 0x8E7B, 0x8E7B, 0x469C,
+ 0x8E7C, 0x8E7D, 0x3764, 0x8E7E, 0x8E7E, 0x0121, 0x8EA1, 0x8EA5, 0x3766,
+ 0x8EA6, 0x8EA6, 0x469D, 0x8EA7, 0x8EAA, 0x376B, 0x8EAB, 0x8EAB, 0x106B,
+ 0x8EAC, 0x8EB3, 0x3770, 0x8EB4, 0x8EB4, 0x1326, 0x8EB5, 0x8EB7, 0x3779,
+ 0x8EB8, 0x8EB8, 0x469E, 0x8EB9, 0x8EC8, 0x377D, 0x8EC9, 0x8EC9, 0x469F,
+ 0x8ECA, 0x8ECC, 0x378D, 0x8ECD, 0x8ECD, 0x066B, 0x8ECE, 0x8ECF, 0x3791,
+ 0x8ED0, 0x8ED0, 0x132E, 0x8ED1, 0x8EE4, 0x3794, 0x8EE5, 0x8EE5, 0x46A0,
+ 0x8EE6, 0x8EEE, 0x37A8, 0x8EEF, 0x8EEF, 0x46A1, 0x8EF0, 0x8EF5, 0x37B1,
+ 0x8EF6, 0x8EF6, 0x46A2, 0x8EF7, 0x8EFE, 0x37B8, 0x8F40, 0x8F56, 0x37C0,
+ 0x8F57, 0x8F57, 0x0D35, 0x8F58, 0x8F58, 0x37D8, 0x8F59, 0x8F59, 0x46A3,
+ 0x8F5A, 0x8F5E, 0x37D9, 0x8F5F, 0x8F5F, 0x46A4, 0x8F60, 0x8F66, 0x37DE,
+ 0x8F67, 0x8F67, 0x46A5, 0x8F68, 0x8F68, 0x37E5, 0x8F69, 0x8F69, 0x27C2,
+ 0x8F6A, 0x8F6D, 0x37E7, 0x8F6E, 0x8F6E, 0x22AD, 0x8F6F, 0x8F78, 0x37EC,
+ 0x8F79, 0x8F79, 0x46A6, 0x8F7A, 0x8F7E, 0x37F7, 0x8FA1, 0x8FAF, 0x37FC,
+ 0x8FB0, 0x8FB0, 0x46A7, 0x8FB1, 0x8FC4, 0x380C, 0x8FC5, 0x8FC5, 0x46A8,
+ 0x8FC6, 0x8FC6, 0x3820, 0x8FC7, 0x8FC7, 0x46A9, 0x8FC8, 0x8FC9, 0x3821,
+ 0x8FCA, 0x8FCA, 0x46AA, 0x8FCB, 0x8FCB, 0x134C, 0x8FCC, 0x8FCC, 0x3FF9,
+ 0x8FCD, 0x8FD9, 0x3826, 0x8FDA, 0x8FDA, 0x46AB, 0x8FDB, 0x8FE2, 0x3833,
+ 0x8FE3, 0x8FE3, 0x46AC, 0x8FE4, 0x8FFB, 0x383C, 0x8FFC, 0x8FFC, 0x46AD,
+ 0x8FFD, 0x8FFD, 0x3854, 0x8FFE, 0x8FFE, 0x09CE, 0x9040, 0x9054, 0x3856,
+ 0x9055, 0x9055, 0x46AE, 0x9056, 0x905B, 0x386C, 0x905C, 0x905E, 0x46AF,
+ 0x905F, 0x906C, 0x3873, 0x906D, 0x906D, 0x0BC7, 0x906E, 0x906E, 0x3882,
+ 0x906F, 0x906F, 0x46B2, 0x9070, 0x9079, 0x3883, 0x907A, 0x907A, 0x36E9,
+ 0x907B, 0x907E, 0x388D, 0x90A1, 0x90A5, 0x3891, 0x90A6, 0x90A6, 0x46B3,
+ 0x90A7, 0x90B7, 0x3896, 0x90B8, 0x90B8, 0x46B4, 0x90B9, 0x90DB, 0x38A7,
+ 0x90DC, 0x90DC, 0x1391, 0x90DD, 0x90F0, 0x38CB, 0x90F1, 0x90F1, 0x16A4,
+ 0x90F2, 0x90FE, 0x38E0, 0x9140, 0x9164, 0x38ED, 0x9165, 0x9165, 0x46B5,
+ 0x9166, 0x916D, 0x3912, 0x916E, 0x916E, 0x46B6, 0x916F, 0x917D, 0x391A,
+ 0x917E, 0x917E, 0x46B7, 0x91A1, 0x91A1, 0x3929, 0x91A2, 0x91A2, 0x46B8,
+ 0x91A3, 0x91BE, 0x392A, 0x91BF, 0x91BF, 0x3072, 0x91C0, 0x91C7, 0x3947,
+ 0x91C8, 0x91C8, 0x46B9, 0x91C9, 0x91FE, 0x3950, 0x9240, 0x9243, 0x3986,
+ 0x9244, 0x9244, 0x3988, 0x9245, 0x9263, 0x398B, 0x9264, 0x9264, 0x46BA,
+ 0x9265, 0x926C, 0x39AB, 0x926D, 0x926D, 0x46BB, 0x926E, 0x927E, 0x39B4,
+ 0x92A1, 0x92AE, 0x39C5, 0x92AF, 0x92B0, 0x0119, 0x92B1, 0x92B1, 0x011C,
+ 0x92B2, 0x92B2, 0x011B, 0x92B3, 0x92C7, 0x39D3, 0x92C8, 0x92C8, 0x3FAC,
+ 0x92C9, 0x92D0, 0x39E9, 0x92D1, 0x92D1, 0x297C, 0x92D2, 0x92E4, 0x39F2,
+ 0x92E5, 0x92E5, 0x46BC, 0x92E6, 0x92F1, 0x3A05, 0x92F2, 0x92F2, 0x46BD,
+ 0x92F3, 0x92FE, 0x3A11, 0x9340, 0x9367, 0x3A1D, 0x9368, 0x9368, 0x46BE,
+ 0x9369, 0x937E, 0x3A45, 0x93A1, 0x93A9, 0x3A5B, 0x93AA, 0x93AA, 0x46BF,
+ 0x93AB, 0x93C1, 0x3A64, 0x93C2, 0x93C2, 0x46C0, 0x93C3, 0x93E4, 0x3A7B,
+ 0x93E5, 0x93E5, 0x46C1, 0x93E6, 0x93E7, 0x3A9D, 0x93E8, 0x93E8, 0x46C2,
+ 0x93E9, 0x93EA, 0x3AA0, 0x93EB, 0x93EB, 0x46C3, 0x93EC, 0x93FE, 0x3AA2,
+ 0x9440, 0x9445, 0x3AB5, 0x9446, 0x9446, 0x46C4, 0x9447, 0x9447, 0x1D06,
+ 0x9448, 0x9478, 0x3ABC, 0x9479, 0x9479, 0x46C5, 0x947A, 0x947E, 0x3AEE,
+ 0x94A1, 0x94C9, 0x3AF3, 0x94CA, 0x94CA, 0x29A1, 0x94CB, 0x94CB, 0x46C6,
+ 0x94CC, 0x94FE, 0x3B1E, 0x9540, 0x954C, 0x3B51, 0x954D, 0x954D, 0x46C7,
+ 0x954E, 0x9559, 0x3B5E, 0x955A, 0x955A, 0x46C8, 0x955B, 0x955E, 0x3B6A,
+ 0x955F, 0x955F, 0x46C9, 0x9560, 0x957E, 0x3B6F, 0x95A1, 0x95C5, 0x3B8E,
+ 0x95C6, 0x95C6, 0x46CA, 0x95C7, 0x95D8, 0x3BB3, 0x95D9, 0x95D9, 0x181B,
+ 0x95DA, 0x95FE, 0x3BC6, 0x9640, 0x9643, 0x3BEB, 0x9644, 0x9644, 0x3E2F,
+ 0x9645, 0x9650, 0x3BF0, 0x9651, 0x9651, 0x46CB, 0x9652, 0x9669, 0x3BFD,
+ 0x966A, 0x966A, 0x46CC, 0x966B, 0x967E, 0x3C16, 0x96A1, 0x96D3, 0x3C2A,
+ 0x96D4, 0x96D4, 0x46CD, 0x96D5, 0x96EC, 0x3C5D, 0x96ED, 0x96ED, 0x3C76,
+ 0x96EE, 0x96FB, 0x3C76, 0x96FC, 0x96FC, 0x2B24, 0x96FD, 0x96FE, 0x3C85,
+ 0x9740, 0x977E, 0x3C87, 0x97A1, 0x97FE, 0x3CC6, 0x9840, 0x9843, 0x3D24,
+ 0x9844, 0x9845, 0x46CE, 0x9846, 0x986E, 0x3D2A, 0x986F, 0x986F, 0x46D0,
+ 0x9870, 0x9874, 0x3D54, 0x9875, 0x9876, 0x46D1, 0x9877, 0x9877, 0x3D59,
+ 0x9878, 0x9879, 0x46D3, 0x987A, 0x987A, 0x3D5A, 0x987B, 0x987E, 0x46D5,
+ 0x98A1, 0x98A2, 0x46D9, 0x98A3, 0x98A3, 0x3D5B, 0x98A4, 0x98AE, 0x46DB,
+ 0x98AF, 0x98AF, 0x3D5C, 0x98B0, 0x98B3, 0x46E6, 0x98B4, 0x98B4, 0x43CA,
+ 0x98B5, 0x98B5, 0x46EA, 0x98B6, 0x98B6, 0x3D5D, 0x98B7, 0x98B7, 0x46EB,
+ 0x98B8, 0x98B8, 0x43CC, 0x98B9, 0x98B9, 0x3D5E, 0x98BA, 0x98BA, 0x46EC,
+ 0x98BB, 0x98BB, 0x43FA, 0x98BC, 0x98BC, 0x46ED, 0x98BD, 0x98BE, 0x3D5F,
+ 0x98BF, 0x98C1, 0x46EE, 0x98C2, 0x98C2, 0x3D61, 0x98C3, 0x98C3, 0x46F1,
+ 0x98C4, 0x98C4, 0x3D62, 0x98C5, 0x98C5, 0x46F2, 0x98C6, 0x98C7, 0x3D63,
+ 0x98C8, 0x98D1, 0x46F3, 0x98D2, 0x98D2, 0x43CD, 0x98D3, 0x98D7, 0x46FD,
+ 0x98D8, 0x98D9, 0x43CE, 0x98DA, 0x98DA, 0x4702, 0x98DB, 0x98DB, 0x43D1,
+ 0x98DC, 0x98DE, 0x4703, 0x98DF, 0x98DF, 0x43D4, 0x98E0, 0x98E2, 0x4706,
+ 0x98E3, 0x98E3, 0x3D65, 0x98E4, 0x98E6, 0x4709, 0x98E7, 0x98E7, 0x3D66,
+ 0x98E8, 0x98EC, 0x470C, 0x98ED, 0x98ED, 0x3D67, 0x98EE, 0x98EF, 0x4711,
+ 0x98F0, 0x98F0, 0x3D68, 0x98F1, 0x98F1, 0x4713, 0x98F2, 0x98F2, 0x3D69,
+ 0x98F3, 0x98F3, 0x4714, 0x98F4, 0x98F5, 0x43D5, 0x98F6, 0x98FB, 0x4715,
+ 0x98FC, 0x98FC, 0x3D6A, 0x98FD, 0x98FD, 0x471B, 0x98FE, 0x98FE, 0x43D7,
+ 0x9940, 0x9941, 0x471C, 0x9942, 0x9942, 0x43FC, 0x9943, 0x9943, 0x3D6B,
+ 0x9944, 0x9944, 0x471E, 0x9945, 0x9945, 0x3D6C, 0x9946, 0x9946, 0x471F,
+ 0x9947, 0x9947, 0x43D8, 0x9948, 0x994E, 0x4720, 0x994F, 0x994F, 0x3D6D,
+ 0x9950, 0x9953, 0x4727, 0x9954, 0x9954, 0x43D9, 0x9955, 0x995B, 0x472B,
+ 0x995C, 0x995C, 0x43DA, 0x995D, 0x9963, 0x4732, 0x9964, 0x9964, 0x43DC,
+ 0x9965, 0x9969, 0x4739, 0x996A, 0x996A, 0x3D6E, 0x996B, 0x996D, 0x473E,
+ 0x996E, 0x996E, 0x3D6F, 0x996F, 0x9974, 0x4741, 0x9975, 0x9975, 0x3D70,
+ 0x9976, 0x9977, 0x4747, 0x9978, 0x9978, 0x3D71, 0x9979, 0x997E, 0x4749,
+ 0x99A1, 0x99A1, 0x474F, 0x99A2, 0x99A2, 0x3D72, 0x99A3, 0x99A3, 0x4750,
+ 0x99A4, 0x99A4, 0x43C5, 0x99A5, 0x99A5, 0x4751, 0x99A6, 0x99A6, 0x43C6,
+ 0x99A7, 0x99AD, 0x4752, 0x99AE, 0x99AE, 0x3D73, 0x99AF, 0x99B1, 0x4759,
+ 0x99B2, 0x99B2, 0x43DE, 0x99B3, 0x99B5, 0x475C, 0x99B6, 0x99B6, 0x3D74,
+ 0x99B7, 0x99B9, 0x475F, 0x99BA, 0x99BA, 0x3D75, 0x99BB, 0x99C9, 0x4762,
+ 0x99CA, 0x99CA, 0x43E0, 0x99CB, 0x99CC, 0x4771, 0x99CD, 0x99CD, 0x43E2,
+ 0x99CE, 0x99D2, 0x4773, 0x99D3, 0x99D3, 0x43E3, 0x99D4, 0x99D5, 0x4778,
+ 0x99D6, 0x99D6, 0x43E5, 0x99D7, 0x99DE, 0x477A, 0x99DF, 0x99DF, 0x43DF,
+ 0x99E0, 0x99E1, 0x4782, 0x99E2, 0x99E2, 0x3D76, 0x99E3, 0x99E3, 0x4784,
+ 0x99E4, 0x99E4, 0x43AB, 0x99E5, 0x99E5, 0x4785, 0x99E6, 0x99E6, 0x43E7,
+ 0x99E7, 0x99E7, 0x4786, 0x99E8, 0x99E8, 0x43E9, 0x99E9, 0x99EE, 0x4787,
+ 0x99EF, 0x99EF, 0x43FD, 0x99F0, 0x99F3, 0x478D, 0x99F4, 0x99F4, 0x3D77,
+ 0x99F5, 0x99FE, 0x4791, 0x9A40, 0x9A49, 0x479B, 0x9A4A, 0x9A4A, 0x3D78,
+ 0x9A4B, 0x9A4B, 0x47A5, 0x9A4C, 0x9A4C, 0x3D79, 0x9A4D, 0x9A58, 0x47A6,
+ 0x9A59, 0x9A59, 0x3D7A, 0x9A5A, 0x9A5E, 0x47B2, 0x9A5F, 0x9A5F, 0x43AF,
+ 0x9A60, 0x9A60, 0x47B7, 0x9A61, 0x9A61, 0x3D7B, 0x9A62, 0x9A65, 0x47B8,
+ 0x9A66, 0x9A66, 0x43ED, 0x9A67, 0x9A67, 0x47BC, 0x9A68, 0x9A68, 0x3D7C,
+ 0x9A69, 0x9A69, 0x43EE, 0x9A6A, 0x9A6A, 0x47BD, 0x9A6B, 0x9A6B, 0x43FF,
+ 0x9A6C, 0x9A72, 0x47BE, 0x9A73, 0x9A73, 0x3D7D, 0x9A74, 0x9A74, 0x47C5,
+ 0x9A75, 0x9A75, 0x43F1, 0x9A76, 0x9A7D, 0x47C6, 0x9A7E, 0x9A7E, 0x3D7E,
+ 0x9AA1, 0x9AA2, 0x47CE, 0x9AA3, 0x9AA3, 0x43F3, 0x9AA4, 0x9AA4, 0x47D0,
+ 0x9AA5, 0x9AA5, 0x43F2, 0x9AA6, 0x9AA8, 0x47D1, 0x9AA9, 0x9AA9, 0x43F8,
+ 0x9AAA, 0x9AAA, 0x43F4, 0x9AAB, 0x9AB1, 0x47D4, 0x9AB2, 0x9AB2, 0x3D7F,
+ 0x9AB3, 0x9AB6, 0x47DB, 0x9AB7, 0x9AB7, 0x3D80, 0x9AB8, 0x9AB8, 0x47DF,
+ 0x9AB9, 0x9AB9, 0x3D81, 0x9ABA, 0x9ABA, 0x47E0, 0x9ABB, 0x9ABB, 0x3D82,
+ 0x9ABC, 0x9ABC, 0x47E1, 0x9ABD, 0x9ABD, 0x43B7, 0x9ABE, 0x9AC6, 0x47E2,
+ 0x9AC7, 0x9AC7, 0x3D83, 0x9AC8, 0x9ACF, 0x47EB, 0x9AD0, 0x9AD0, 0x3D84,
+ 0x9AD1, 0x9AD1, 0x47F3, 0x9AD2, 0x9AD2, 0x3D85, 0x9AD3, 0x9AD8, 0x47F4,
+ 0x9AD9, 0x9ADB, 0x3D86, 0x9ADC, 0x9AE1, 0x47FA, 0x9AE2, 0x9AE2, 0x3D89,
+ 0x9AE3, 0x9AE3, 0x4800, 0x9AE4, 0x9AE4, 0x3D8A, 0x9AE5, 0x9AE7, 0x4801,
+ 0x9AE8, 0x9AE8, 0x3D8B, 0x9AE9, 0x9AE9, 0x43B0, 0x9AEA, 0x9AED, 0x4804,
+ 0x9AEE, 0x9AEE, 0x43B2, 0x9AEF, 0x9AF1, 0x4808, 0x9AF2, 0x9AF2, 0x3D8C,
+ 0x9AF3, 0x9AF5, 0x480B, 0x9AF6, 0x9AF6, 0x3D8D, 0x9AF7, 0x9AFA, 0x480E,
+ 0x9AFB, 0x9AFB, 0x3D8E, 0x9AFC, 0x9AFE, 0x4812, 0x9B40, 0x9B45, 0x4815,
+ 0x9B46, 0x9B46, 0x3D8F, 0x9B47, 0x9B49, 0x481B, 0x9B4A, 0x9B4A, 0x3D90,
+ 0x9B4B, 0x9B53, 0x481E, 0x9B54, 0x9B54, 0x3D92, 0x9B55, 0x9B57, 0x4827,
+ 0x9B58, 0x9B58, 0x3D93, 0x9B59, 0x9B59, 0x482A, 0x9B5A, 0x9B5A, 0x3D94,
+ 0x9B5B, 0x9B5B, 0x482B, 0x9B5C, 0x9B5C, 0x3D95, 0x9B5D, 0x9B5D, 0x482C,
+ 0x9B5E, 0x9B5F, 0x3D96, 0x9B60, 0x9B60, 0x482D, 0x9B62, 0x9B6F, 0x482E,
+ 0x9B70, 0x9B73, 0x3D98, 0x9B74, 0x9B75, 0x483C, 0x9B76, 0x9B76, 0x2F50,
+ 0x9B77, 0x9B77, 0x3D9D, 0x9B78, 0x9B78, 0x1725, 0x9B79, 0x9B7A, 0x483E,
+ 0x9B7B, 0x9B7B, 0x32ED, 0x9B7C, 0x9B7C, 0x3DA0, 0x9B7D, 0x9B7D, 0x4840,
+ 0x9B7E, 0x9B7E, 0x3DA1, 0x9BA1, 0x9BA1, 0x3DA2, 0x9BA2, 0x9BA2, 0x4841,
+ 0x9BA3, 0x9BA4, 0x3DA3, 0x9BA5, 0x9BA6, 0x4842, 0x9BA7, 0x9BAA, 0x3DA5,
+ 0x9BAB, 0x9BAB, 0x4844, 0x9BAC, 0x9BAC, 0x3DA9, 0x9BAD, 0x9BAE, 0x4845,
+ 0x9BAF, 0x9BAF, 0x3DAA, 0x9BB0, 0x9BB1, 0x4847, 0x9BB2, 0x9BB9, 0x3DAB,
+ 0x9BBA, 0x9BBD, 0x4849, 0x9BBE, 0x9BBE, 0x3DB3, 0x9BBF, 0x9BBF, 0x484D,
+ 0x9BC0, 0x9BC5, 0x3DB4, 0x9BC6, 0x9BC6, 0x2AD9, 0x9BC7, 0x9BC9, 0x484E,
+ 0x9BCA, 0x9BCA, 0x3DBB, 0x9BCB, 0x9BCB, 0x4851, 0x9BCC, 0x9BCC, 0x3DBC,
+ 0x9BCD, 0x9BCD, 0x4852, 0x9BCE, 0x9BCE, 0x43D0, 0x9BCF, 0x9BCF, 0x4853,
+ 0x9BD0, 0x9BD1, 0x3DBD, 0x9BD2, 0x9BD2, 0x4854, 0x9BD3, 0x9BD3, 0x3DBF,
+ 0x9BD4, 0x9BD4, 0x4855, 0x9BD5, 0x9BD5, 0x3DC0, 0x9BD6, 0x9BD7, 0x4856,
+ 0x9BD8, 0x9BDA, 0x3DC1, 0x9BDB, 0x9BDC, 0x4858, 0x9BDD, 0x9BDD, 0x3DC4,
+ 0x9BDE, 0x9BDE, 0x1C14, 0x9BDF, 0x9BDF, 0x3DC5, 0x9BE0, 0x9BE0, 0x485A,
+ 0x9BE1, 0x9BE1, 0x3DC6, 0x9BE2, 0x9BE2, 0x485B, 0x9BE3, 0x9BE3, 0x3DC7,
+ 0x9BE4, 0x9BE6, 0x485C, 0x9BE7, 0x9BE7, 0x3DC8, 0x9BE8, 0x9BE8, 0x485F,
+ 0x9BE9, 0x9BEB, 0x3DC9, 0x9BEC, 0x9BEC, 0x41FA, 0x9BED, 0x9BED, 0x4860,
+ 0x9BEE, 0x9BEF, 0x3DCD, 0x9BF0, 0x9BF2, 0x4861, 0x9BF3, 0x9BF3, 0x3DCF,
+ 0x9BF4, 0x9BF5, 0x4864, 0x9BF6, 0x9BF6, 0x12E9, 0x9BF7, 0x9BF7, 0x4866,
+ 0x9BF8, 0x9BF9, 0x3DD1, 0x9BFA, 0x9BFA, 0x4867, 0x9BFB, 0x9BFC, 0x3DD3,
+ 0x9BFD, 0x9BFE, 0x4868, 0x9C40, 0x9C41, 0x3DD5, 0x9C42, 0x9C42, 0x2CAE,
+ 0x9C43, 0x9C43, 0x486A, 0x9C44, 0x9C46, 0x3DD8, 0x9C47, 0x9C47, 0x486B,
+ 0x9C48, 0x9C48, 0x3DDB, 0x9C49, 0x9C49, 0x486C, 0x9C4A, 0x9C4A, 0x3DDC,
+ 0x9C4B, 0x9C4C, 0x486D, 0x9C4D, 0x9C52, 0x3DDD, 0x9C53, 0x9C53, 0x1A64,
+ 0x9C54, 0x9C54, 0x486F, 0x9C55, 0x9C55, 0x3DE4, 0x9C56, 0x9C56, 0x4870,
+ 0x9C57, 0x9C5B, 0x3DE5, 0x9C5C, 0x9C5C, 0x4871, 0x9C5D, 0x9C5D, 0x3DEA,
+ 0x9C5E, 0x9C5F, 0x4872, 0x9C60, 0x9C60, 0x3DEB, 0x9C61, 0x9C61, 0x4874,
+ 0x9C62, 0x9C62, 0x1404, 0x9C63, 0x9C63, 0x4875, 0x9C64, 0x9C66, 0x3DED,
+ 0x9C67, 0x9C67, 0x4876, 0x9C68, 0x9C68, 0x2324, 0x9C69, 0x9C69, 0x4877,
+ 0x9C6A, 0x9C6A, 0x3DF1, 0x9C6B, 0x9C6B, 0x346A, 0x9C6C, 0x9C6C, 0x4878,
+ 0x9C6D, 0x9C6D, 0x3DF2, 0x9C6E, 0x9C6E, 0x4879, 0x9C6F, 0x9C72, 0x3DF3,
+ 0x9C73, 0x9C74, 0x487A, 0x9C75, 0x9C76, 0x3DF7, 0x9C77, 0x9C77, 0x2291,
+ 0x9C78, 0x9C78, 0x487C, 0x9C79, 0x9C79, 0x3DFA, 0x9C7A, 0x9C7A, 0x487D,
+ 0x9C7B, 0x9C7C, 0x3DFB, 0x9C7D, 0x9C7D, 0x487E, 0x9C7E, 0x9C7E, 0x3DFD,
+ 0x9CA1, 0x9CA2, 0x3DFE, 0x9CA3, 0x9CA4, 0x487F, 0x9CA5, 0x9CA5, 0x3E00,
+ 0x9CA6, 0x9CA7, 0x4881, 0x9CA8, 0x9CA9, 0x3E01, 0x9CAA, 0x9CAA, 0x4883,
+ 0x9CAB, 0x9CAB, 0x3E03, 0x9CAC, 0x9CAC, 0x4884, 0x9CAD, 0x9CAE, 0x3E04,
+ 0x9CAF, 0x9CB0, 0x4885, 0x9CB1, 0x9CBA, 0x3E06, 0x9CBB, 0x9CBB, 0x4887,
+ 0x9CBC, 0x9CBC, 0x1787, 0x9CBD, 0x9CBD, 0x095F, 0x9CBE, 0x9CC2, 0x3E12,
+ 0x9CC3, 0x9CC5, 0x4888, 0x9CC6, 0x9CCD, 0x3E17, 0x9CCE, 0x9CCE, 0x488B,
+ 0x9CCF, 0x9CCF, 0x3E1F, 0x9CD0, 0x9CD0, 0x1E99, 0x9CD1, 0x9CD3, 0x3E21,
+ 0x9CD4, 0x9CD7, 0x488C, 0x9CD8, 0x9CDA, 0x3E24, 0x9CDB, 0x9CDB, 0x4890,
+ 0x9CDC, 0x9CE5, 0x3E27, 0x9CE6, 0x9CE6, 0x4891, 0x9CE7, 0x9CE9, 0x3E31,
+ 0x9CEA, 0x9CEA, 0x4892, 0x9CEB, 0x9CEC, 0x3E34, 0x9CED, 0x9CED, 0x4893,
+ 0x9CEE, 0x9CF9, 0x3E36, 0x9CFA, 0x9CFC, 0x4894, 0x9CFD, 0x9CFD, 0x3E42,
+ 0x9CFE, 0x9CFE, 0x4897, 0x9D40, 0x9D40, 0x43E8, 0x9D41, 0x9D45, 0x4898,
+ 0x9D46, 0x9D46, 0x3E43, 0x9D47, 0x9D48, 0x489D, 0x9D49, 0x9D49, 0x3E44,
+ 0x9D4A, 0x9D4B, 0x489F, 0x9D4C, 0x9D4D, 0x3E46, 0x9D4E, 0x9D4E, 0x48A1,
+ 0x9D4F, 0x9D4F, 0x3E48, 0x9D50, 0x9D50, 0x48A2, 0x9D51, 0x9D51, 0x3E49,
+ 0x9D52, 0x9D54, 0x48A3, 0x9D55, 0x9D55, 0x3E4A, 0x9D56, 0x9D56, 0x48A6,
+ 0x9D57, 0x9D57, 0x25C1, 0x9D58, 0x9D59, 0x48A7, 0x9D5A, 0x9D5A, 0x0D0C,
+ 0x9D5B, 0x9D60, 0x48A9, 0x9D61, 0x9D61, 0x43C9, 0x9D62, 0x9D62, 0x3E4C,
+ 0x9D63, 0x9D63, 0x48AF, 0x9D64, 0x9D64, 0x3E4D, 0x9D65, 0x9D77, 0x48B0,
+ 0x9D78, 0x9D78, 0x43F5, 0x9D79, 0x9D79, 0x3E4E, 0x9D7A, 0x9D7D, 0x48C3,
+ 0x9D7E, 0x9D7E, 0x3E4F, 0x9DA1, 0x9DA4, 0x48C7, 0x9DA5, 0x9DA8, 0x3E50,
+ 0x9DA9, 0x9DA9, 0x48CB, 0x9DAA, 0x9DAA, 0x3E54, 0x9DAB, 0x9DAB, 0x48CC,
+ 0x9DAC, 0x9DAD, 0x3E55, 0x9DAE, 0x9DAF, 0x48CD, 0x9DB0, 0x9DB0, 0x3E58,
+ 0x9DB1, 0x9DB2, 0x48CF, 0x9DB3, 0x9DB3, 0x3E59, 0x9DB4, 0x9DB4, 0x48D1,
+ 0x9DB5, 0x9DB5, 0x3E5A, 0x9DB6, 0x9DB6, 0x48D2, 0x9DB7, 0x9DB7, 0x3E5B,
+ 0x9DB8, 0x9DBB, 0x48D3, 0x9DBC, 0x9DBD, 0x3E5C, 0x9DBE, 0x9DBE, 0x48D7,
+ 0x9DBF, 0x9DC0, 0x3E5E, 0x9DC1, 0x9DC2, 0x48D8, 0x9DC3, 0x9DC3, 0x3E60,
+ 0x9DC4, 0x9DC4, 0x05E6, 0x9DC5, 0x9DC6, 0x48DA, 0x9DC7, 0x9DC8, 0x3E62,
+ 0x9DC9, 0x9DC9, 0x48DC, 0x9DCA, 0x9DCA, 0x3E64, 0x9DCB, 0x9DCC, 0x48DD,
+ 0x9DCD, 0x9DD1, 0x3E65, 0x9DD2, 0x9DD2, 0x48DF, 0x9DD3, 0x9DD5, 0x3E6A,
+ 0x9DD6, 0x9DD9, 0x48E0, 0x9DDA, 0x9DFB, 0x3E6D, 0x9DFC, 0x9DFC, 0x48E4,
+ 0x9DFD, 0x9DFE, 0x3E8F, 0x9E40, 0x9E42, 0x3E91, 0x9E43, 0x9E43, 0x48E5,
+ 0x9E44, 0x9E5E, 0x3E95, 0x9E5F, 0x9E5F, 0x48E6, 0x9E60, 0x9E62, 0x3EB1,
+ 0x9E63, 0x9E63, 0x48E7, 0x9E64, 0x9E65, 0x3EB4, 0x9E66, 0x9E67, 0x48E8,
+ 0x9E68, 0x9E68, 0x3EB6, 0x9E69, 0x9E69, 0x48EA, 0x9E6A, 0x9E6A, 0x3EB7,
+ 0x9E6B, 0x9E70, 0x48EB, 0x9E71, 0x9E71, 0x3EB8, 0x9E72, 0x9E72, 0x48F1,
+ 0x9E73, 0x9E73, 0x3EB9, 0x9E74, 0x9E76, 0x48F2, 0x9E77, 0x9E78, 0x3EBA,
+ 0x9E79, 0x9E79, 0x48F5, 0x9E7A, 0x9E7A, 0x3EBC, 0x9E7B, 0x9E7B, 0x48F6,
+ 0x9E7C, 0x9E7C, 0x3EBD, 0x9E7D, 0x9E7D, 0x48F7, 0x9E7E, 0x9E7E, 0x3EBE,
+ 0x9EA1, 0x9EA2, 0x3EBF, 0x9EA3, 0x9EA3, 0x48F8, 0x9EA4, 0x9EA6, 0x3EC1,
+ 0x9EA7, 0x9EA8, 0x48F9, 0x9EA9, 0x9EA9, 0x0728, 0x9EAA, 0x9EAA, 0x3EC5,
+ 0x9EAB, 0x9EAB, 0x48FB, 0x9EAC, 0x9EAD, 0x3EC6, 0x9EAE, 0x9EAE, 0x48FC,
+ 0x9EAF, 0x9EB1, 0x3EC8, 0x9EB2, 0x9EB3, 0x48FD, 0x9EB4, 0x9EB4, 0x3ECB,
+ 0x9EB5, 0x9EB5, 0x48FF, 0x9EB6, 0x9EB7, 0x3ECC, 0x9EB8, 0x9EB8, 0x4900,
+ 0x9EB9, 0x9EB9, 0x3ECE, 0x9EBA, 0x9EBB, 0x4901, 0x9EBC, 0x9EBC, 0x3ECF,
+ 0x9EBD, 0x9EBE, 0x4903, 0x9EBF, 0x9EC0, 0x3ED0, 0x9EC1, 0x9EC3, 0x4905,
+ 0x9EC4, 0x9EC5, 0x3ED2, 0x9EC6, 0x9EC6, 0x4908, 0x9EC7, 0x9ECA, 0x3ED4,
+ 0x9ECB, 0x9ECC, 0x4909, 0x9ECD, 0x9ECD, 0x3ED9, 0x9ECE, 0x9ECF, 0x490B,
+ 0x9ED0, 0x9ED1, 0x3EDA, 0x9ED2, 0x9ED2, 0x490D, 0x9ED3, 0x9ED3, 0x3EDC,
+ 0x9ED4, 0x9ED5, 0x490E, 0x9ED6, 0x9ED7, 0x3EDD, 0x9ED8, 0x9ED9, 0x4910,
+ 0x9EDA, 0x9EEE, 0x3EDF, 0x9EEF, 0x9EEF, 0x24B6, 0x9EF0, 0x9EF1, 0x3EF5,
+ 0x9EF2, 0x9EF2, 0x4912, 0x9EF3, 0x9EF5, 0x3EF7, 0x9EF6, 0x9EF8, 0x4913,
+ 0x9EF9, 0x9EFA, 0x3EFA, 0x9EFB, 0x9EFB, 0x4916, 0x9EFC, 0x9EFC, 0x3EFC,
+ 0x9EFD, 0x9EFD, 0x1806, 0x9EFE, 0x9EFE, 0x3EFE, 0x9F40, 0x9F42, 0x3EFF,
+ 0x9F43, 0x9F43, 0x4917, 0x9F44, 0x9F47, 0x3F02, 0x9F48, 0x9F48, 0x4918,
+ 0x9F49, 0x9F4A, 0x3F06, 0x9F4B, 0x9F4C, 0x4919, 0x9F4D, 0x9F5F, 0x3F08,
+ 0x9F60, 0x9F60, 0x3511, 0x9F61, 0x9F65, 0x3F1C, 0x9F66, 0x9F66, 0x3945,
+ 0x9F67, 0x9F68, 0x491B, 0x9F69, 0x9F6F, 0x3F23, 0x9F70, 0x9F70, 0x491D,
+ 0x9F71, 0x9F7E, 0x3F2A, 0x9FA1, 0x9FB4, 0x3F38, 0x9FB5, 0x9FB5, 0x491E,
+ 0x9FB6, 0x9FBA, 0x3F4C, 0x9FBB, 0x9FBB, 0x491F, 0x9FBC, 0x9FBE, 0x3F51,
+ 0x9FBF, 0x9FBF, 0x4920, 0x9FC0, 0x9FC0, 0x3F54, 0x9FC1, 0x9FC1, 0x4921,
+ 0x9FC2, 0x9FCA, 0x3F55, 0x9FCB, 0x9FCB, 0x0F82, 0x9FCC, 0x9FCC, 0x4922,
+ 0x9FCD, 0x9FD3, 0x3F60, 0x9FD4, 0x9FD4, 0x4923, 0x9FD5, 0x9FD7, 0x3F68,
+ 0x9FD8, 0x9FD8, 0x3A3E, 0x9FD9, 0x9FE3, 0x3F6C, 0x9FE4, 0x9FE4, 0x4924,
+ 0x9FE5, 0x9FF8, 0x3F77, 0x9FF9, 0x9FF9, 0x4925, 0x9FFA, 0x9FFE, 0x3F8B,
+ 0xA040, 0xA040, 0x4926, 0xA041, 0xA046, 0x3F90, 0xA047, 0xA047, 0x4927,
+ 0xA048, 0xA054, 0x3F96, 0xA055, 0xA055, 0x4928, 0xA056, 0xA062, 0x3FA3,
+ 0xA063, 0xA063, 0x3811, 0xA064, 0xA06C, 0x3FB1, 0xA06D, 0xA06D, 0x4929,
+ 0xA06E, 0xA076, 0x3FBA, 0xA077, 0xA077, 0x05F2, 0xA078, 0xA07A, 0x3FC4,
+ 0xA07B, 0xA07B, 0x492A, 0xA07C, 0xA07E, 0x3FC7, 0xA0A1, 0xA0A1, 0x3FCA,
+ 0xA0A2, 0xA0A2, 0x492B, 0xA0A3, 0xA0A6, 0x3FCB, 0xA0A7, 0xA0A7, 0x492C,
+ 0xA0A8, 0xA0C4, 0x3FCF, 0xA0C5, 0xA0C5, 0x492D, 0xA0C6, 0xA0CF, 0x3FEC,
+ 0xA0D0, 0xA0D0, 0x492E, 0xA0D1, 0xA0D4, 0x3FF6, 0xA0D5, 0xA0D5, 0x3AEE,
+ 0xA0D6, 0xA0DE, 0x3FFB, 0xA0DF, 0xA0DF, 0x247D, 0xA0E0, 0xA0E2, 0x4005,
+ 0xA0E3, 0xA0E3, 0x492F, 0xA0E4, 0xA0E4, 0x3AC9, 0xA0E5, 0xA0E6, 0x4009,
+ 0xA0E7, 0xA0ED, 0x4930, 0xA0EE, 0xA0EE, 0x43B4, 0xA0EF, 0xA0F1, 0x4937,
+ 0xA0F2, 0xA0F2, 0x43B8, 0xA0F3, 0xA0FE, 0x493A, 0xA140, 0xA158, 0x0063,
+ 0xA159, 0xA15C, 0x35AF, 0xA15D, 0xA17E, 0x0080, 0xA1A1, 0xA1F5, 0x00A2,
+ 0xA1F6, 0xA1F6, 0x00F8, 0xA1F7, 0xA1F7, 0x00F7, 0xA1F8, 0xA1FE, 0x00F9,
+ 0xA240, 0xA27E, 0x0100, 0xA2A1, 0xA2FE, 0x013F, 0xA340, 0xA37E, 0x019D,
+ 0xA3A1, 0xA3BB, 0x01DC, 0xA3BD, 0xA3BF, 0x01F7, 0xA440, 0xA47E, 0x0253,
+ 0xA4A1, 0xA4FE, 0x0292, 0xA540, 0xA57E, 0x02F0, 0xA5A1, 0xA5FE, 0x032F,
+ 0xA640, 0xA67E, 0x038D, 0xA6A1, 0xA6FE, 0x03CC, 0xA740, 0xA77E, 0x042A,
+ 0xA7A1, 0xA7FE, 0x0469, 0xA840, 0xA87E, 0x04C7, 0xA8A1, 0xA8FE, 0x0506,
+ 0xA940, 0xA97E, 0x0564, 0xA9A1, 0xA9FE, 0x05A3, 0xAA40, 0xAA7E, 0x0601,
+ 0xAAA1, 0xAAFE, 0x0640, 0xAB40, 0xAB7E, 0x069E, 0xABA1, 0xABFE, 0x06DD,
+ 0xAC40, 0xAC7E, 0x073B, 0xACA1, 0xACFD, 0x077A, 0xACFE, 0xACFE, 0x097F,
+ 0xAD40, 0xAD7E, 0x07D7, 0xADA1, 0xADFE, 0x0816, 0xAE40, 0xAE7E, 0x0874,
+ 0xAEA1, 0xAEFE, 0x08B3, 0xAF40, 0xAF7E, 0x0911, 0xAFA1, 0xAFCF, 0x0950,
+ 0xAFD0, 0xAFFE, 0x0980, 0xB040, 0xB07E, 0x09AF, 0xB0A1, 0xB0FE, 0x09EE,
+ 0xB140, 0xB17E, 0x0A4C, 0xB1A1, 0xB1FE, 0x0A8B, 0xB240, 0xB27E, 0x0AE9,
+ 0xB2A1, 0xB2FE, 0x0B28, 0xB340, 0xB37E, 0x0B86, 0xB3A1, 0xB3FE, 0x0BC5,
+ 0xB440, 0xB47E, 0x0C23, 0xB4A1, 0xB4FE, 0x0C62, 0xB540, 0xB57E, 0x0CC0,
+ 0xB5A1, 0xB5FE, 0x0CFF, 0xB640, 0xB67E, 0x0D5D, 0xB6A1, 0xB6FE, 0x0D9C,
+ 0xB740, 0xB77E, 0x0DFA, 0xB7A1, 0xB7FE, 0x0E39, 0xB840, 0xB87E, 0x0E97,
+ 0xB8A1, 0xB8FE, 0x0ED6, 0xB940, 0xB97E, 0x0F34, 0xB9A1, 0xB9FE, 0x0F73,
+ 0xBA40, 0xBA7E, 0x0FD1, 0xBAA1, 0xBAFE, 0x1010, 0xBB40, 0xBB7E, 0x106E,
+ 0xBBA1, 0xBBC7, 0x10AD, 0xBBC8, 0xBBFE, 0x10D5, 0xBC40, 0xBC7E, 0x110C,
+ 0xBCA1, 0xBCFE, 0x114B, 0xBD40, 0xBD7E, 0x11A9, 0xBDA1, 0xBDFE, 0x11E8,
+ 0xBE40, 0xBE51, 0x1246, 0xBE52, 0xBE52, 0x10D4, 0xBE53, 0xBE7E, 0x1258,
+ 0xBEA1, 0xBEFE, 0x1284, 0xBF40, 0xBF7E, 0x12E2, 0xBFA1, 0xBFFE, 0x1321,
+ 0xC040, 0xC07E, 0x137F, 0xC0A1, 0xC0FE, 0x13BE, 0xC140, 0xC17E, 0x141C,
+ 0xC1A1, 0xC1AA, 0x145B, 0xC1AB, 0xC1FE, 0x1466, 0xC240, 0xC27E, 0x14BA,
+ 0xC2A1, 0xC2CA, 0x14F9, 0xC2CB, 0xC2CB, 0x1465, 0xC2CC, 0xC2FE, 0x1523,
+ 0xC340, 0xC360, 0x1556, 0xC361, 0xC37E, 0x1578, 0xC3A1, 0xC3B8, 0x1596,
+ 0xC3B9, 0xC3B9, 0x15AF, 0xC3BA, 0xC3BA, 0x15AE, 0xC3BB, 0xC3FE, 0x15B0,
+ 0xC440, 0xC455, 0x15F4, 0xC456, 0xC456, 0x1577, 0xC457, 0xC47E, 0x160A,
+ 0xC4A1, 0xC4FE, 0x1632, 0xC540, 0xC57E, 0x1690, 0xC5A1, 0xC5FE, 0x16CF,
+ 0xC640, 0xC67E, 0x172D, 0xC6A1, 0xC6BE, 0x01FA, 0xC6BF, 0xC6CE, 0x0219,
+ 0xC6D0, 0xC6D2, 0x022A, 0xC6D4, 0xC6D4, 0x022E, 0xC6D6, 0xC6D6, 0x0230,
+ 0xC6D8, 0xC6DD, 0x35B3, 0xC6E0, 0xC6FE, 0x35BA, 0xC740, 0xC77E, 0x35D9,
+ 0xC7A1, 0xC7FE, 0x3618, 0xC840, 0xC87E, 0x3676, 0xC8A1, 0xC8A4, 0x36B5,
+ 0xC8CD, 0xC8D3, 0x36E1, 0xC8D4, 0xC8D6, 0x44C6, 0xC8D7, 0xC8DF, 0x451C,
+ 0xC8E0, 0xC8E0, 0x499E, 0xC8E1, 0xC8E8, 0x4525, 0xC8E9, 0xC8E9, 0x499F,
+ 0xC8EA, 0xC8F0, 0x452D, 0xC8F1, 0xC8F1, 0x49A0, 0xC8F5, 0xC8FE, 0x4992,
+ 0xC940, 0xC949, 0x176C, 0xC94A, 0xC94A, 0x0274, 0xC94B, 0xC96B, 0x1776,
+ 0xC96C, 0xC97E, 0x1798, 0xC9A1, 0xC9BD, 0x17AB, 0xC9BE, 0xC9BE, 0x1797,
+ 0xC9BF, 0xC9EC, 0x17C8, 0xC9ED, 0xC9FE, 0x17F7, 0xCA40, 0xCA7E, 0x1809,
+ 0xCAA1, 0xCAF6, 0x1848, 0xCAF7, 0xCAF7, 0x17F6, 0xCAF8, 0xCAFE, 0x189E,
+ 0xCB40, 0xCB7E, 0x18A5, 0xCBA1, 0xCBFE, 0x18E4, 0xCC40, 0xCC7E, 0x1942,
+ 0xCCA1, 0xCCFE, 0x1981, 0xCD40, 0xCD7E, 0x19DF, 0xCDA1, 0xCDFE, 0x1A1E,
+ 0xCE40, 0xCE7E, 0x1A7C, 0xCEA1, 0xCEFE, 0x1ABB, 0xCF40, 0xCF7E, 0x1B19,
+ 0xCFA1, 0xCFFE, 0x1B58, 0xD040, 0xD07E, 0x1BB6, 0xD0A1, 0xD0FE, 0x1BF5,
+ 0xD140, 0xD17E, 0x1C53, 0xD1A1, 0xD1FE, 0x1C92, 0xD240, 0xD27E, 0x1CF0,
+ 0xD2A1, 0xD2FE, 0x1D2F, 0xD340, 0xD37E, 0x1D8D, 0xD3A1, 0xD3FE, 0x1DCC,
+ 0xD440, 0xD47E, 0x1E2A, 0xD4A1, 0xD4FE, 0x1E69, 0xD540, 0xD57E, 0x1EC7,
+ 0xD5A1, 0xD5FE, 0x1F06, 0xD640, 0xD67E, 0x1F64, 0xD6A1, 0xD6CB, 0x1FA3,
+ 0xD6CC, 0xD6CC, 0x2254, 0xD6CD, 0xD6FE, 0x1FCF, 0xD740, 0xD779, 0x2001,
+ 0xD77A, 0xD77A, 0x22B9, 0xD77B, 0xD77E, 0x203B, 0xD7A1, 0xD7FE, 0x203F,
+ 0xD840, 0xD87E, 0x209D, 0xD8A1, 0xD8FE, 0x20DC, 0xD940, 0xD97E, 0x213A,
+ 0xD9A1, 0xD9FE, 0x2179, 0xDA40, 0xDA7E, 0x21D7, 0xDAA1, 0xDADE, 0x2216,
+ 0xDADF, 0xDADF, 0x1FCE, 0xDAE0, 0xDAFE, 0x2255, 0xDB40, 0xDB7E, 0x2274,
+ 0xDBA1, 0xDBA6, 0x22B3, 0xDBA7, 0xDBFE, 0x22BA, 0xDC40, 0xDC7E, 0x2312,
+ 0xDCA1, 0xDCFE, 0x2351, 0xDD40, 0xDD7E, 0x23AF, 0xDDA1, 0xDDFB, 0x23EE,
+ 0xDDFC, 0xDDFC, 0x2381, 0xDDFD, 0xDDFE, 0x2449, 0xDE40, 0xDE7E, 0x244B,
+ 0xDEA1, 0xDEFE, 0x248A, 0xDF40, 0xDF7E, 0x24E8, 0xDFA1, 0xDFFE, 0x2527,
+ 0xE040, 0xE07E, 0x2585, 0xE0A1, 0xE0FE, 0x25C4, 0xE140, 0xE17E, 0x2622,
+ 0xE1A1, 0xE1FE, 0x2661, 0xE240, 0xE27E, 0x26BF, 0xE2A1, 0xE2FE, 0x26FE,
+ 0xE340, 0xE37E, 0x275C, 0xE3A1, 0xE3FE, 0x279B, 0xE440, 0xE47E, 0x27F9,
+ 0xE4A1, 0xE4FE, 0x2838, 0xE540, 0xE57E, 0x2896, 0xE5A1, 0xE5FE, 0x28D5,
+ 0xE640, 0xE67E, 0x2933, 0xE6A1, 0xE6FE, 0x2972, 0xE740, 0xE77E, 0x29D0,
+ 0xE7A1, 0xE7FE, 0x2A0F, 0xE840, 0xE87E, 0x2A6D, 0xE8A1, 0xE8A2, 0x2AAC,
+ 0xE8A3, 0xE8FE, 0x2AAF, 0xE940, 0xE975, 0x2B0B, 0xE976, 0xE97E, 0x2B42,
+ 0xE9A1, 0xE9FE, 0x2B4B, 0xEA40, 0xEA7E, 0x2BA9, 0xEAA1, 0xEAFE, 0x2BE8,
+ 0xEB40, 0xEB5A, 0x2C46, 0xEB5B, 0xEB7E, 0x2C62, 0xEBA1, 0xEBF0, 0x2C86,
+ 0xEBF1, 0xEBF1, 0x2AAE, 0xEBF2, 0xEBFE, 0x2CD6, 0xEC40, 0xEC7E, 0x2CE3,
+ 0xECA1, 0xECDD, 0x2D22, 0xECDE, 0xECDE, 0x2B41, 0xECDF, 0xECFE, 0x2D5F,
+ 0xED40, 0xED7E, 0x2D7F, 0xEDA1, 0xEDA9, 0x2DBE, 0xEDAA, 0xEDFE, 0x2DC8,
+ 0xEE40, 0xEE7E, 0x2E1D, 0xEEA1, 0xEEEA, 0x2E5C, 0xEEEB, 0xEEEB, 0x3014,
+ 0xEEEC, 0xEEFE, 0x2EA6, 0xEF40, 0xEF7E, 0x2EB9, 0xEFA1, 0xEFFE, 0x2EF8,
+ 0xF040, 0xF055, 0x2F56, 0xF056, 0xF056, 0x2DC7, 0xF057, 0xF07E, 0x2F6C,
+ 0xF0A1, 0xF0CA, 0x2F94, 0xF0CB, 0xF0CB, 0x2C61, 0xF0CC, 0xF0FE, 0x2FBE,
+ 0xF140, 0xF162, 0x2FF1, 0xF163, 0xF16A, 0x3015, 0xF16B, 0xF16B, 0x3160,
+ 0xF16C, 0xF17E, 0x301D, 0xF1A1, 0xF1FE, 0x3030, 0xF240, 0xF267, 0x308E,
+ 0xF268, 0xF268, 0x31EF, 0xF269, 0xF27E, 0x30B6, 0xF2A1, 0xF2C2, 0x30CC,
+ 0xF2C3, 0xF2FE, 0x30EF, 0xF340, 0xF374, 0x312B, 0xF375, 0xF37E, 0x3161,
+ 0xF3A1, 0xF3FE, 0x316B, 0xF440, 0xF465, 0x31C9, 0xF466, 0xF47E, 0x31F0,
+ 0xF4A1, 0xF4B4, 0x3209, 0xF4B5, 0xF4B5, 0x30EE, 0xF4B6, 0xF4FC, 0x321D,
+ 0xF4FD, 0xF4FE, 0x3265, 0xF540, 0xF57E, 0x3267, 0xF5A1, 0xF5FE, 0x32A6,
+ 0xF640, 0xF662, 0x3304, 0xF663, 0xF663, 0x3264, 0xF664, 0xF67E, 0x3327,
+ 0xF6A1, 0xF6FE, 0x3342, 0xF740, 0xF77E, 0x33A0, 0xF7A1, 0xF7FE, 0x33DF,
+ 0xF840, 0xF87E, 0x343D, 0xF8A1, 0xF8FE, 0x347C, 0xF940, 0xF976, 0x34DA,
+ 0xF977, 0xF97E, 0x3512, 0xF9A1, 0xF9C3, 0x351A, 0xF9C4, 0xF9C4, 0x3511,
+ 0xF9C5, 0xF9C5, 0x353D, 0xF9C6, 0xF9C6, 0x3549, 0xF9C7, 0xF9D1, 0x353E,
+ 0xF9D2, 0xF9D5, 0x354A, 0xF9D6, 0xF9FE, 0x36E8, 0xFA40, 0xFA5E, 0x400B,
+ 0xFA5F, 0xFA5F, 0x083A, 0xFA60, 0xFA65, 0x402B, 0xFA66, 0xFA66, 0x09FD,
+ 0xFA67, 0xFA7E, 0x4032, 0xFAA1, 0xFAA8, 0x404A, 0xFAA9, 0xFAAA, 0x4946,
+ 0xFAAB, 0xFABC, 0x4054, 0xFABD, 0xFABD, 0x030D, 0xFABE, 0xFAC4, 0x4067,
+ 0xFAC5, 0xFAC5, 0x016B, 0xFAC6, 0xFAD4, 0x406F, 0xFAD5, 0xFAD5, 0x0860,
+ 0xFAD6, 0xFAFE, 0x407F, 0xFB40, 0xFB47, 0x40A8, 0xFB48, 0xFB48, 0x3E82,
+ 0xFB49, 0xFB52, 0x40B1, 0xFB53, 0xFB53, 0x4948, 0xFB54, 0xFB6D, 0x40BC,
+ 0xFB6E, 0xFB6E, 0x4949, 0xFB6F, 0xFB7E, 0x40D7, 0xFBA1, 0xFBA2, 0x40E7,
+ 0xFBA3, 0xFBA3, 0x494A, 0xFBA4, 0xFBB7, 0x40EA, 0xFBB8, 0xFBB8, 0x0C23,
+ 0xFBB9, 0xFBBE, 0x40FF, 0xFBBF, 0xFBBF, 0x494B, 0xFBC0, 0xFBCC, 0x4105,
+ 0xFBCD, 0xFBCD, 0x494C, 0xFBCE, 0xFBF2, 0x4112, 0xFBF3, 0xFBF3, 0x17E4,
+ 0xFBF4, 0xFBF8, 0x4138, 0xFBF9, 0xFBF9, 0x3E8E, 0xFBFA, 0xFBFE, 0x413E,
+ 0xFC40, 0xFC49, 0x4143, 0xFC4A, 0xFC4A, 0x494D, 0xFC4B, 0xFC4E, 0x414D,
+ 0xFC4F, 0xFC4F, 0x212F, 0xFC50, 0xFC51, 0x4151, 0xFC52, 0xFC52, 0x494E,
+ 0xFC53, 0xFC62, 0x4153, 0xFC63, 0xFC63, 0x494F, 0xFC64, 0xFC6B, 0x4163,
+ 0xFC6C, 0xFC6C, 0x4001, 0xFC6D, 0xFC6D, 0x4950, 0xFC6E, 0xFC74, 0x416D,
+ 0xFC75, 0xFC75, 0x4951, 0xFC76, 0xFC7E, 0x4174, 0xFCA1, 0xFCB8, 0x417D,
+ 0xFCB9, 0xFCB9, 0x115F, 0xFCBA, 0xFCBB, 0x4195, 0xFCBC, 0xFCBD, 0x4952,
+ 0xFCBE, 0xFCCB, 0x4198, 0xFCCC, 0xFCCC, 0x4954, 0xFCCD, 0xFCE1, 0x41A7,
+ 0xFCE2, 0xFCE2, 0x0C79, 0xFCE3, 0xFCE3, 0x4955, 0xFCE4, 0xFCED, 0x41BD,
+ 0xFCEE, 0xFCEE, 0x4956, 0xFCEF, 0xFCF0, 0x41C7, 0xFCF1, 0xFCF1, 0x04C3,
+ 0xFCF2, 0xFCFE, 0x41CA, 0xFD40, 0xFD48, 0x41D7, 0xFD49, 0xFD49, 0x4957,
+ 0xFD4A, 0xFD69, 0x41E0, 0xFD6A, 0xFD6A, 0x4958, 0xFD6B, 0xFD7E, 0x4201,
+ 0xFDA1, 0xFDB6, 0x4215, 0xFDB7, 0xFDB7, 0x18BD, 0xFDB8, 0xFDB8, 0x0CBD,
+ 0xFDB9, 0xFDBA, 0x422D, 0xFDBB, 0xFDBB, 0x0CA5, 0xFDBC, 0xFDE2, 0x4230,
+ 0xFDE3, 0xFDE3, 0x4959, 0xFDE4, 0xFDF0, 0x4258, 0xFDF1, 0xFDF1, 0x0CCE,
+ 0xFDF2, 0xFDF2, 0x495A, 0xFDF3, 0xFDFE, 0x4266, 0xFE40, 0xFE51, 0x4272,
+ 0xFE52, 0xFE52, 0x3D70, 0xFE53, 0xFE6C, 0x4285, 0xFE6D, 0xFE6D, 0x495B,
+ 0xFE6E, 0xFE6E, 0x429F, 0xFE6F, 0xFE6F, 0x0E84, 0xFE70, 0xFE77, 0x42A1,
+ 0xFE78, 0xFE78, 0x495C, 0xFE79, 0xFE7E, 0x42A9, 0xFEA1, 0xFEA9, 0x42AF,
+ 0xFEAA, 0xFEAA, 0x0120, 0xFEAB, 0xFEDC, 0x42B8, 0xFEDD, 0xFEDD, 0x1BA8,
+ 0xFEDE, 0xFEDF, 0x495D, 0xFEE0, 0xFEEC, 0x42EB, 0xFEED, 0xFEEE, 0x495F,
+ 0xFEEF, 0xFEFE, 0x42F8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp
new file mode 100644
index 0000000000..05c52e4035
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_HKscs_B5_V_5[13 * 3] = {
+ 0xA14B, 0xA14B, 0x354E, 0xA15A, 0xA15A, 0x35AF, 0xA15C, 0xA15C, 0x35B1,
+ 0xA15D, 0xA15E, 0x0082, 0xA161, 0xA162, 0x0086, 0xA165, 0xA166, 0x008A,
+ 0xA169, 0xA16A, 0x008E, 0xA16D, 0xA16E, 0x0092, 0xA171, 0xA172, 0x0096,
+ 0xA175, 0xA176, 0x009A, 0xA179, 0xA17A, 0x009E, 0xA1E3, 0xA1E3, 0x354F,
+ 0xC6E4, 0xC6E5, 0x3711,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp
new file mode 100644
index 0000000000..d58b5a3319
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp
@@ -0,0 +1,5481 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UCS2_H_3[16418 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A2, 0x00A3, 0x0106, 0x00A5, 0x00A5, 0x0104,
+ 0x00A7, 0x00A7, 0x00B2, 0x00A8, 0x00A8, 0x35B3, 0x00AC, 0x00AC, 0x36E1,
+ 0x00B0, 0x00B0, 0x0118, 0x00B1, 0x00B1, 0x00D4, 0x00B7, 0x00B7, 0x0073,
+ 0x00C0, 0x00C0, 0x4964, 0x00C1, 0x00C1, 0x4962, 0x00C8, 0x00C8, 0x4968,
+ 0x00C9, 0x00C9, 0x4966, 0x00CA, 0x00CA, 0x4971, 0x00D2, 0x00D2, 0x496C,
+ 0x00D3, 0x00D3, 0x496A, 0x00D7, 0x00D7, 0x00D2, 0x00E0, 0x00E0, 0x4975,
+ 0x00E1, 0x00E1, 0x4973, 0x00E8, 0x00E8, 0x497A, 0x00E9, 0x00E9, 0x4978,
+ 0x00EA, 0x00EA, 0x4990, 0x00EC, 0x00EC, 0x497E, 0x00ED, 0x00ED, 0x497C,
+ 0x00F2, 0x00F2, 0x4982, 0x00F3, 0x00F3, 0x4980, 0x00F7, 0x00F7, 0x00D3,
+ 0x00F8, 0x00F8, 0x4998, 0x00F9, 0x00F9, 0x4986, 0x00FA, 0x00FA, 0x4984,
+ 0x00FC, 0x00FC, 0x498B, 0x0100, 0x0100, 0x4961, 0x0101, 0x0101, 0x4972,
+ 0x0112, 0x0112, 0x4965, 0x0113, 0x0113, 0x4977, 0x011A, 0x011A, 0x4967,
+ 0x011B, 0x011B, 0x4979, 0x012B, 0x012B, 0x497B, 0x014B, 0x014B, 0x4999,
+ 0x014C, 0x014C, 0x4969, 0x014D, 0x014D, 0x497F, 0x0153, 0x0153, 0x4997,
+ 0x016B, 0x016B, 0x4983, 0x01CD, 0x01CD, 0x4963, 0x01CE, 0x01CE, 0x4974,
+ 0x01D0, 0x01D0, 0x497D, 0x01D1, 0x01D1, 0x496B, 0x01D2, 0x01D2, 0x4981,
+ 0x01D4, 0x01D4, 0x4985, 0x01D6, 0x01D6, 0x4987, 0x01D8, 0x01D8, 0x4988,
+ 0x01DA, 0x01DA, 0x4989, 0x01DC, 0x01DC, 0x498A, 0x0250, 0x0250, 0x4993,
+ 0x0251, 0x0251, 0x4976, 0x0254, 0x0254, 0x4995, 0x025B, 0x025B, 0x4994,
+ 0x0261, 0x0261, 0x4991, 0x026A, 0x026A, 0x499B, 0x0275, 0x0275, 0x4996,
+ 0x0283, 0x0283, 0x4992, 0x028A, 0x028A, 0x499A, 0x02C6, 0x02C6, 0x35B4,
+ 0x02C7, 0x02C7, 0x01F8, 0x02CA, 0x02CA, 0x01F7, 0x02CB, 0x02CB, 0x01F9,
+ 0x02D9, 0x02D9, 0x01F6, 0x0308, 0x0308, 0x35B3, 0x0391, 0x03A1, 0x01A1,
+ 0x03A3, 0x03A9, 0x01B2, 0x03B1, 0x03C1, 0x01B9, 0x03C3, 0x03C9, 0x01CA,
+ 0x0401, 0x0401, 0x3670, 0x0410, 0x0415, 0x366A, 0x0416, 0x0435, 0x3671,
+ 0x0436, 0x044F, 0x3692, 0x0451, 0x0451, 0x3691, 0x1EBE, 0x1EBE, 0x496E,
+ 0x1EBF, 0x1EBF, 0x498D, 0x1EC0, 0x1EC0, 0x4970, 0x1EC1, 0x1EC1, 0x498F,
+ 0x2013, 0x2013, 0x0079, 0x2014, 0x2014, 0x007B, 0x2018, 0x2019, 0x00A6,
+ 0x201C, 0x201D, 0x00A8, 0x2022, 0x2022, 0x0068, 0x2025, 0x2025, 0x006F,
+ 0x2026, 0x2026, 0x006E, 0x2032, 0x2032, 0x00AD, 0x2035, 0x2035, 0x00AC,
+ 0x203B, 0x203B, 0x00B1, 0x203E, 0x203E, 0x00C3, 0x20AC, 0x20AC, 0x44C1,
+ 0x2103, 0x2103, 0x010A, 0x2105, 0x2105, 0x00C2, 0x2109, 0x2109, 0x010B,
+ 0x2116, 0x2116, 0x36E6, 0x2121, 0x2121, 0x36E7, 0x2160, 0x2169, 0x0157,
+ 0x2170, 0x2179, 0x020E, 0x2190, 0x2190, 0x00F8, 0x2191, 0x2191, 0x00F5,
+ 0x2192, 0x2192, 0x00F7, 0x2193, 0x2193, 0x00F6, 0x2196, 0x2197, 0x00F9,
+ 0x2198, 0x2198, 0x00FC, 0x2199, 0x2199, 0x00FB, 0x21B8, 0x21B9, 0x36AD,
+ 0x21E7, 0x21E7, 0x36AC, 0x221A, 0x221A, 0x00D5, 0x221E, 0x221E, 0x00DC,
+ 0x221F, 0x221F, 0x00E9, 0x2220, 0x2220, 0x00E8, 0x2223, 0x2223, 0x00FE,
+ 0x2225, 0x2225, 0x00FD, 0x2229, 0x222A, 0x00E5, 0x222B, 0x222B, 0x00ED,
+ 0x222E, 0x222E, 0x00EE, 0x2234, 0x2234, 0x00F0, 0x2235, 0x2235, 0x00EF,
+ 0x223C, 0x223C, 0x00E4, 0x2252, 0x2252, 0x00DD, 0x2260, 0x2260, 0x00DB,
+ 0x2261, 0x2261, 0x00DE, 0x2266, 0x2267, 0x00D9, 0x22A5, 0x22A5, 0x00E7,
+ 0x22BF, 0x22BF, 0x00EA, 0x2400, 0x241F, 0x0232, 0x2421, 0x2421, 0x0252,
+ 0x2460, 0x2469, 0x01FA, 0x2474, 0x247D, 0x0204, 0x2500, 0x2500, 0x0137,
+ 0x2502, 0x2502, 0x0138, 0x250C, 0x250C, 0x013A, 0x2510, 0x2510, 0x013B,
+ 0x2514, 0x2514, 0x013C, 0x2518, 0x2518, 0x013D, 0x251C, 0x251C, 0x0135,
+ 0x2524, 0x2524, 0x0134, 0x252C, 0x252C, 0x0133, 0x2534, 0x2534, 0x0132,
+ 0x253C, 0x253C, 0x0131, 0x2550, 0x2550, 0x0142, 0x2551, 0x2551, 0x370A,
+ 0x2552, 0x2552, 0x36F8, 0x2553, 0x2553, 0x3701, 0x2554, 0x2554, 0x36EF,
+ 0x2555, 0x2555, 0x36FA, 0x2556, 0x2556, 0x3703, 0x2557, 0x2557, 0x36F1,
+ 0x2558, 0x2558, 0x36FE, 0x2559, 0x2559, 0x3707, 0x255A, 0x255A, 0x36F5,
+ 0x255B, 0x255B, 0x3700, 0x255C, 0x255C, 0x3709, 0x255D, 0x255D, 0x36F7,
+ 0x255E, 0x255E, 0x0143, 0x255F, 0x255F, 0x3704, 0x2560, 0x2560, 0x36F2,
+ 0x2561, 0x2561, 0x0145, 0x2562, 0x2562, 0x3706, 0x2563, 0x2563, 0x36F4,
+ 0x2564, 0x2564, 0x36F9, 0x2565, 0x2565, 0x3702, 0x2566, 0x2566, 0x36F0,
+ 0x2567, 0x2567, 0x36FF, 0x2568, 0x2568, 0x3708, 0x2569, 0x2569, 0x36F6,
+ 0x256A, 0x256A, 0x0144, 0x256B, 0x256B, 0x3705, 0x256C, 0x256C, 0x36F3,
+ 0x256D, 0x256E, 0x013E, 0x256F, 0x256F, 0x0141, 0x2570, 0x2570, 0x0140,
+ 0x2571, 0x2573, 0x014A, 0x2581, 0x2588, 0x0122, 0x2589, 0x2589, 0x0130,
+ 0x258A, 0x258A, 0x012F, 0x258B, 0x258B, 0x012E, 0x258C, 0x258C, 0x012D,
+ 0x258D, 0x258D, 0x012C, 0x258E, 0x258E, 0x012B, 0x258F, 0x258F, 0x012A,
+ 0x2593, 0x2593, 0x3710, 0x2594, 0x2594, 0x0136, 0x2595, 0x2595, 0x0139,
+ 0x25A0, 0x25A0, 0x00BE, 0x25A1, 0x25A1, 0x00BD, 0x25B2, 0x25B2, 0x00B7,
+ 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BC, 0x00C0, 0x25BD, 0x25BD, 0x00BF,
+ 0x25C6, 0x25C6, 0x00BC, 0x25C7, 0x25C7, 0x00BB, 0x25CB, 0x25CB, 0x00B4,
+ 0x25CE, 0x25CE, 0x00B8, 0x25CF, 0x25CF, 0x00B5, 0x25E2, 0x25E3, 0x0146,
+ 0x25E4, 0x25E4, 0x0149, 0x25E5, 0x25E5, 0x0148, 0x2605, 0x2605, 0x00BA,
+ 0x2606, 0x2606, 0x00B9, 0x2609, 0x2609, 0x00F4, 0x2640, 0x2640, 0x00F1,
+ 0x2641, 0x2641, 0x00F3, 0x2642, 0x2642, 0x00F2, 0x273D, 0x273D, 0x35C0,
+ 0x2E80, 0x2E80, 0x44C8, 0x2E84, 0x2E84, 0x451C, 0x2E86, 0x2E88, 0x451D,
+ 0x2E8A, 0x2E8A, 0x4520, 0x2E8C, 0x2E8D, 0x4521, 0x2E95, 0x2E95, 0x4523,
+ 0x2E9C, 0x2E9C, 0x4524, 0x2E9D, 0x2E9D, 0x02DC, 0x2EA5, 0x2EA5, 0x4525,
+ 0x2EA7, 0x2EA7, 0x4526, 0x2EAA, 0x2EAA, 0x4527, 0x2EAC, 0x2EAC, 0x4528,
+ 0x2EAE, 0x2EAE, 0x4529, 0x2EB6, 0x2EB6, 0x452A, 0x2EBC, 0x2EBC, 0x452B,
+ 0x2EBE, 0x2EBE, 0x452C, 0x2EC6, 0x2EC6, 0x0509, 0x2ECA, 0x2ECA, 0x452D,
+ 0x2ECC, 0x2ECD, 0x452E, 0x2ECF, 0x2ECF, 0x4530, 0x2ED6, 0x2ED7, 0x4531,
+ 0x2EDE, 0x2EDE, 0x4533, 0x2EE3, 0x2EE3, 0x09F6, 0x2F33, 0x2F33, 0x0227,
+ 0x3000, 0x3000, 0x0063, 0x3001, 0x3002, 0x0065, 0x3003, 0x3003, 0x00B3,
+ 0x3005, 0x3007, 0x35BA, 0x3008, 0x3009, 0x0094, 0x300A, 0x300B, 0x0090,
+ 0x300C, 0x300D, 0x0098, 0x300E, 0x300F, 0x009C, 0x3010, 0x3011, 0x008C,
+ 0x3012, 0x3012, 0x0105, 0x3014, 0x3015, 0x0088, 0x301D, 0x301E, 0x00AA,
+ 0x3021, 0x3029, 0x0161, 0x3041, 0x3093, 0x35C1, 0x309B, 0x309C, 0x44C6,
+ 0x309D, 0x309E, 0x35B7, 0x30A1, 0x30F6, 0x3614, 0x30FC, 0x30FC, 0x35BD,
+ 0x30FD, 0x30FE, 0x35B5, 0x3105, 0x3129, 0x01D1, 0x3231, 0x3231, 0x36E5,
+ 0x32A3, 0x32A3, 0x00C1, 0x338E, 0x338F, 0x0115, 0x339C, 0x339E, 0x0110,
+ 0x33A1, 0x33A1, 0x0114, 0x33C4, 0x33C4, 0x0117, 0x33CE, 0x33CE, 0x0113,
+ 0x33D1, 0x33D1, 0x00EC, 0x33D2, 0x33D2, 0x00EB, 0x33D5, 0x33D5, 0x010F,
+ 0x3435, 0x3435, 0x39BD, 0x3440, 0x3440, 0x3C67, 0x344C, 0x344C, 0x4593,
+ 0x3464, 0x3464, 0x3A85, 0x3473, 0x3473, 0x3DC5, 0x347A, 0x347A, 0x4033,
+ 0x347D, 0x347D, 0x4597, 0x347E, 0x347E, 0x46A3, 0x3493, 0x3493, 0x439E,
+ 0x3496, 0x3496, 0x37DC, 0x34A5, 0x34A5, 0x4598, 0x34AF, 0x34AF, 0x3C7F,
+ 0x34BC, 0x34BC, 0x4380, 0x34C1, 0x34C1, 0x44FB, 0x34C8, 0x34C8, 0x3D00,
+ 0x34DF, 0x34DF, 0x3EA4, 0x34E4, 0x34E4, 0x3E54, 0x34FB, 0x34FB, 0x3DCA,
+ 0x3506, 0x3506, 0x4336, 0x353E, 0x353E, 0x44E7, 0x3551, 0x3551, 0x45A1,
+ 0x3553, 0x3553, 0x43A5, 0x3561, 0x3561, 0x40D8, 0x356D, 0x356D, 0x45A4,
+ 0x3570, 0x3570, 0x3B2F, 0x3572, 0x3572, 0x45A5, 0x3577, 0x3577, 0x3ECB,
+ 0x3578, 0x3578, 0x4379, 0x3584, 0x3584, 0x39FB, 0x3597, 0x3597, 0x3B2D,
+ 0x3598, 0x3598, 0x45B0, 0x35A1, 0x35A1, 0x40E2, 0x35A5, 0x35A5, 0x45B1,
+ 0x35AD, 0x35AD, 0x3EFC, 0x35BF, 0x35BF, 0x45B2, 0x35C1, 0x35C1, 0x4580,
+ 0x35C5, 0x35C5, 0x45B4, 0x35C7, 0x35C7, 0x459F, 0x35CA, 0x35CA, 0x3E43,
+ 0x35CE, 0x35CE, 0x3E81, 0x35D2, 0x35D2, 0x3FC9, 0x35D6, 0x35D6, 0x3FB5,
+ 0x35DB, 0x35DB, 0x470D, 0x35DD, 0x35DD, 0x43AC, 0x35F1, 0x35F1, 0x4696,
+ 0x35F2, 0x35F2, 0x4627, 0x35F3, 0x35F3, 0x3F6C, 0x35FB, 0x35FB, 0x45C8,
+ 0x35FE, 0x35FE, 0x3F6A, 0x3609, 0x3609, 0x45F5, 0x3618, 0x3618, 0x4871,
+ 0x361A, 0x361A, 0x461A, 0x3623, 0x3623, 0x40C6, 0x362D, 0x362D, 0x3E86,
+ 0x3635, 0x3635, 0x492E, 0x3639, 0x3639, 0x4165, 0x363E, 0x363E, 0x3A08,
+ 0x3647, 0x3647, 0x4806, 0x3648, 0x3648, 0x3806, 0x3649, 0x3649, 0x4013,
+ 0x364E, 0x364E, 0x4698, 0x365F, 0x365F, 0x3DF3, 0x367A, 0x367A, 0x3EE3,
+ 0x3681, 0x3681, 0x45A6, 0x369A, 0x369A, 0x3C71, 0x36A5, 0x36A5, 0x4902,
+ 0x36AA, 0x36AA, 0x3B30, 0x36AC, 0x36AC, 0x4900, 0x36B0, 0x36B0, 0x3CDF,
+ 0x36B1, 0x36B1, 0x40CD, 0x36B5, 0x36B5, 0x3BC2, 0x36B9, 0x36B9, 0x4887,
+ 0x36BC, 0x36BC, 0x3CFF, 0x36C1, 0x36C1, 0x37C5, 0x36C3, 0x36C3, 0x40E5,
+ 0x36C4, 0x36C4, 0x3905, 0x36C5, 0x36C5, 0x4296, 0x36C7, 0x36C7, 0x3D3A,
+ 0x36C8, 0x36C8, 0x4820, 0x36D3, 0x36D3, 0x3A38, 0x36D4, 0x36D4, 0x3BB3,
+ 0x36D6, 0x36D6, 0x3D0C, 0x36DD, 0x36DD, 0x3A36, 0x36E1, 0x36E1, 0x397C,
+ 0x36E2, 0x36E2, 0x3CDD, 0x36E5, 0x36E5, 0x4216, 0x36E6, 0x36E6, 0x40FC,
+ 0x36F5, 0x36F5, 0x3A18, 0x3701, 0x3701, 0x3A34, 0x3703, 0x3703, 0x460F,
+ 0x3708, 0x3708, 0x40FF, 0x370A, 0x370A, 0x3CD5, 0x370D, 0x370D, 0x4238,
+ 0x371C, 0x371C, 0x3DFE, 0x3722, 0x3722, 0x3979, 0x3723, 0x3723, 0x3980,
+ 0x3725, 0x3725, 0x3849, 0x372C, 0x372C, 0x3C8C, 0x372D, 0x372D, 0x3D37,
+ 0x3730, 0x3730, 0x495C, 0x3732, 0x3732, 0x4106, 0x3733, 0x3733, 0x3997,
+ 0x373A, 0x373A, 0x3E56, 0x3740, 0x3740, 0x4202, 0x3743, 0x3743, 0x4036,
+ 0x3762, 0x3762, 0x3DB6, 0x376F, 0x376F, 0x47CB, 0x3797, 0x3797, 0x45ED,
+ 0x37A0, 0x37A0, 0x3A28, 0x37B9, 0x37B9, 0x43B7, 0x37BE, 0x37BE, 0x393E,
+ 0x37F2, 0x37F2, 0x3BA1, 0x37F8, 0x37F8, 0x42D2, 0x37FB, 0x37FB, 0x3EF5,
+ 0x380F, 0x380F, 0x462C, 0x3819, 0x3819, 0x39AF, 0x3820, 0x3820, 0x462F,
+ 0x382D, 0x382D, 0x412E, 0x3836, 0x3836, 0x4133, 0x3838, 0x3838, 0x43BB,
+ 0x3863, 0x3863, 0x46C3, 0x38A0, 0x38A0, 0x4145, 0x38C3, 0x38C3, 0x3912,
+ 0x38CC, 0x38CC, 0x4076, 0x38D1, 0x38D1, 0x3A95, 0x38FA, 0x38FA, 0x44EB,
+ 0x3908, 0x3908, 0x4632, 0x3914, 0x3914, 0x43BE, 0x3927, 0x3927, 0x3C31,
+ 0x3932, 0x3932, 0x4182, 0x393F, 0x393F, 0x4633, 0x394D, 0x394D, 0x4634,
+ 0x3963, 0x3963, 0x4163, 0x3980, 0x3980, 0x3874, 0x3989, 0x3989, 0x4638,
+ 0x398A, 0x398A, 0x3CE8, 0x3992, 0x3992, 0x4376, 0x3999, 0x3999, 0x39BA,
+ 0x399B, 0x399B, 0x3DB3, 0x39A1, 0x39A1, 0x3E19, 0x39A4, 0x39A4, 0x3E0F,
+ 0x39B8, 0x39B8, 0x463B, 0x39DC, 0x39DC, 0x3ECE, 0x39E2, 0x39E2, 0x46C8,
+ 0x39E5, 0x39E5, 0x393B, 0x39EC, 0x39EC, 0x4310, 0x39F8, 0x39F8, 0x463E,
+ 0x39FB, 0x39FB, 0x4345, 0x39FE, 0x39FE, 0x4368, 0x3A01, 0x3A01, 0x41E0,
+ 0x3A03, 0x3A03, 0x4640, 0x3A06, 0x3A06, 0x4377, 0x3A17, 0x3A17, 0x4190,
+ 0x3A18, 0x3A18, 0x438F, 0x3A29, 0x3A29, 0x3A5E, 0x3A2A, 0x3A2A, 0x3EDF,
+ 0x3A34, 0x3A34, 0x4319, 0x3A4B, 0x3A4B, 0x4644, 0x3A52, 0x3A52, 0x3ED3,
+ 0x3A57, 0x3A57, 0x419E, 0x3A5C, 0x3A5C, 0x3FC4, 0x3A5E, 0x3A5E, 0x3B07,
+ 0x3A66, 0x3A66, 0x419C, 0x3A67, 0x3A67, 0x4333, 0x3A97, 0x3A97, 0x4647,
+ 0x3AAB, 0x3AAB, 0x4091, 0x3ABD, 0x3ABD, 0x4649, 0x3ADE, 0x3ADE, 0x414C,
+ 0x3AE0, 0x3AE0, 0x3A7A, 0x3AF0, 0x3AF0, 0x46B2, 0x3AF2, 0x3AF2, 0x464C,
+ 0x3AFB, 0x3AFB, 0x3AF2, 0x3B0E, 0x3B0E, 0x38E8, 0x3B19, 0x3B19, 0x46C5,
+ 0x3B22, 0x3B22, 0x464E, 0x3B2B, 0x3B2B, 0x4956, 0x3B39, 0x3B39, 0x474B,
+ 0x3B42, 0x3B42, 0x4650, 0x3B58, 0x3B58, 0x4652, 0x3B60, 0x3B60, 0x393A,
+ 0x3B71, 0x3B71, 0x4656, 0x3B72, 0x3B72, 0x4655, 0x3B7B, 0x3B7B, 0x4657,
+ 0x3B7C, 0x3B7C, 0x385A, 0x3B80, 0x3B80, 0x41E2, 0x3B96, 0x3B96, 0x3A9C,
+ 0x3B99, 0x3B99, 0x3A98, 0x3BA1, 0x3BA1, 0x41E9, 0x3BBC, 0x3BBC, 0x43C8,
+ 0x3BBE, 0x3BBE, 0x3DB1, 0x3BC2, 0x3BC2, 0x4134, 0x3BC4, 0x3BC4, 0x3AA0,
+ 0x3BD7, 0x3BD7, 0x3AAC, 0x3BDD, 0x3BDD, 0x465F, 0x3BEC, 0x3BEC, 0x4664,
+ 0x3BF2, 0x3BF2, 0x4666, 0x3BF3, 0x3BF3, 0x41F3, 0x3BF4, 0x3BF4, 0x3A6E,
+ 0x3C0D, 0x3C0D, 0x41F7, 0x3C11, 0x3C11, 0x3E40, 0x3C15, 0x3C15, 0x3998,
+ 0x3C54, 0x3C54, 0x3E00, 0x3CCB, 0x3CCB, 0x4670, 0x3CCD, 0x3CCD, 0x3CE5,
+ 0x3CD1, 0x3CD1, 0x4003, 0x3CD6, 0x3CD6, 0x3CF7, 0x3CDC, 0x3CDC, 0x404E,
+ 0x3CEB, 0x3CEB, 0x4217, 0x3CEF, 0x3CEF, 0x4675, 0x3D13, 0x3D13, 0x3773,
+ 0x3D1D, 0x3D1D, 0x393C, 0x3D32, 0x3D32, 0x4957, 0x3D3B, 0x3D3B, 0x4245,
+ 0x3D46, 0x3D46, 0x4685, 0x3D4C, 0x3D4C, 0x3CEB, 0x3D4E, 0x3D4E, 0x4242,
+ 0x3D51, 0x3D51, 0x38EA, 0x3D5F, 0x3D5F, 0x4159, 0x3D62, 0x3D62, 0x3C5E,
+ 0x3D69, 0x3D69, 0x3CEA, 0x3D6A, 0x3D6A, 0x4689, 0x3D6F, 0x3D6F, 0x3CFC,
+ 0x3D75, 0x3D75, 0x468A, 0x3D7D, 0x3D7D, 0x3C2F, 0x3D85, 0x3D85, 0x494B,
+ 0x3D8A, 0x3D8A, 0x468D, 0x3D8F, 0x3D8F, 0x3ABD, 0x3D91, 0x3D91, 0x468F,
+ 0x3DA5, 0x3DA5, 0x3D56, 0x3DAD, 0x3DAD, 0x4699, 0x3DB4, 0x3DB4, 0x40A6,
+ 0x3DBF, 0x3DBF, 0x37D0, 0x3DC6, 0x3DC6, 0x48DE, 0x3DC7, 0x3DC7, 0x4164,
+ 0x3DCC, 0x3DCC, 0x3D6F, 0x3DCD, 0x3DCD, 0x3AF3, 0x3DD3, 0x3DD3, 0x37E1,
+ 0x3DDB, 0x3DDB, 0x3FFF, 0x3DE7, 0x3DE7, 0x3999, 0x3DE8, 0x3DE8, 0x425D,
+ 0x3DEB, 0x3DEB, 0x3E5A, 0x3DF3, 0x3DF3, 0x46D4, 0x3DF7, 0x3DF7, 0x48AB,
+ 0x3DFC, 0x3DFC, 0x462B, 0x3DFD, 0x3DFD, 0x3C14, 0x3E06, 0x3E06, 0x491D,
+ 0x3E40, 0x3E40, 0x4169, 0x3E43, 0x3E43, 0x436D, 0x3E48, 0x3E48, 0x4595,
+ 0x3E55, 0x3E55, 0x427F, 0x3E74, 0x3E74, 0x3EE2, 0x3EA8, 0x3EA8, 0x4304,
+ 0x3EA9, 0x3EA9, 0x46ED, 0x3EAA, 0x3EAA, 0x4075, 0x3EAD, 0x3EAD, 0x3B9D,
+ 0x3EB1, 0x3EB1, 0x3AD8, 0x3EB8, 0x3EB8, 0x3A4B, 0x3EBF, 0x3EBF, 0x3B0B,
+ 0x3EC2, 0x3EC2, 0x3BD8, 0x3EC7, 0x3EC7, 0x3975, 0x3ECA, 0x3ECA, 0x46F1,
+ 0x3ECC, 0x3ECC, 0x3BE2, 0x3ED0, 0x3ED0, 0x3854, 0x3ED1, 0x3ED1, 0x46F2,
+ 0x3ED6, 0x3ED6, 0x3CAD, 0x3ED7, 0x3ED7, 0x429F, 0x3EDA, 0x3EDA, 0x3D02,
+ 0x3EDE, 0x3EDE, 0x39F2, 0x3EE1, 0x3EE1, 0x3CA8, 0x3EE2, 0x3EE2, 0x46F6,
+ 0x3EE7, 0x3EE7, 0x3BDC, 0x3EE9, 0x3EE9, 0x3CA4, 0x3EEB, 0x3EEB, 0x396A,
+ 0x3EF0, 0x3EF0, 0x46F7, 0x3EF3, 0x3EF3, 0x3ADD, 0x3EF4, 0x3EF4, 0x46F8,
+ 0x3EFA, 0x3EFA, 0x46F9, 0x3EFC, 0x3EFC, 0x3BE8, 0x3EFF, 0x3EFF, 0x3AF5,
+ 0x3F00, 0x3F00, 0x3C0D, 0x3F04, 0x3F04, 0x42C3, 0x3F06, 0x3F06, 0x3AD7,
+ 0x3F0E, 0x3F0E, 0x46FB, 0x3F53, 0x3F53, 0x46FC, 0x3F58, 0x3F58, 0x3AE9,
+ 0x3F59, 0x3F59, 0x4089, 0x3F63, 0x3F63, 0x3AE6, 0x3F7C, 0x3F7C, 0x4700,
+ 0x3F93, 0x3F93, 0x45CD, 0x3FC0, 0x3FC0, 0x43CF, 0x3FD7, 0x3FD7, 0x43D1,
+ 0x3FDC, 0x3FDC, 0x4704, 0x3FE5, 0x3FE5, 0x46DF, 0x3FED, 0x3FED, 0x4335,
+ 0x3FF9, 0x3FF9, 0x45D7, 0x3FFA, 0x3FFA, 0x4354, 0x4004, 0x4004, 0x410E,
+ 0x401D, 0x401D, 0x4709, 0x4039, 0x4039, 0x470B, 0x4045, 0x4045, 0x470C,
+ 0x4053, 0x4053, 0x45B6, 0x4057, 0x4057, 0x399D, 0x4062, 0x4062, 0x3BCB,
+ 0x4065, 0x4065, 0x3FD3, 0x406A, 0x406A, 0x470F, 0x406F, 0x406F, 0x4710,
+ 0x40A8, 0x40A8, 0x43D5, 0x40BB, 0x40BB, 0x45C0, 0x40BF, 0x40BF, 0x3EEC,
+ 0x40C8, 0x40C8, 0x3B0E, 0x40D8, 0x40D8, 0x41AB, 0x40DF, 0x40DF, 0x3E17,
+ 0x40FA, 0x40FA, 0x3EBE, 0x4103, 0x4103, 0x43D7, 0x4104, 0x4104, 0x425C,
+ 0x4109, 0x4109, 0x471C, 0x410E, 0x410E, 0x3B1B, 0x4132, 0x4132, 0x3B25,
+ 0x4167, 0x4167, 0x471F, 0x416C, 0x416C, 0x38AE, 0x416E, 0x416E, 0x3B23,
+ 0x417F, 0x417F, 0x3B82, 0x4190, 0x4190, 0x46C0, 0x41B2, 0x41B2, 0x4720,
+ 0x41C4, 0x41C4, 0x4723, 0x41CA, 0x41CA, 0x373F, 0x41CF, 0x41CF, 0x4726,
+ 0x41DB, 0x41DB, 0x37BF, 0x41EF, 0x41EF, 0x3743, 0x41F9, 0x41F9, 0x3B3E,
+ 0x4211, 0x4211, 0x3B41, 0x4240, 0x4240, 0x37F1, 0x4260, 0x4260, 0x472B,
+ 0x426A, 0x426A, 0x3B55, 0x427A, 0x427A, 0x472C, 0x428C, 0x428C, 0x472F,
+ 0x4294, 0x4294, 0x4731, 0x42B5, 0x42B5, 0x4010, 0x42B9, 0x42B9, 0x38A6,
+ 0x42BC, 0x42BC, 0x3C8A, 0x42F4, 0x42F4, 0x3BB9, 0x42FB, 0x42FB, 0x3CEE,
+ 0x42FC, 0x42FC, 0x41E6, 0x432B, 0x432B, 0x377D, 0x436E, 0x436E, 0x46CA,
+ 0x4397, 0x4397, 0x473B, 0x43BA, 0x43BA, 0x435F, 0x43C1, 0x43C1, 0x4695,
+ 0x43D9, 0x43D9, 0x433E, 0x43DF, 0x43DF, 0x3E49, 0x43ED, 0x43ED, 0x4745,
+ 0x43F2, 0x43F2, 0x3E48, 0x4401, 0x4401, 0x474A, 0x4402, 0x4402, 0x3B73,
+ 0x4413, 0x4413, 0x474F, 0x4425, 0x4425, 0x4751, 0x442D, 0x442D, 0x4752,
+ 0x447A, 0x447A, 0x37AF, 0x448F, 0x448F, 0x4758, 0x449F, 0x449F, 0x3AE2,
+ 0x44A0, 0x44A0, 0x37ED, 0x44A2, 0x44A2, 0x4079, 0x44B0, 0x44B0, 0x475C,
+ 0x44B7, 0x44B7, 0x3FA1, 0x44C0, 0x44C0, 0x3C07, 0x44C5, 0x44C5, 0x4210,
+ 0x44CE, 0x44CE, 0x3D23, 0x44DD, 0x44DD, 0x39DD, 0x44DF, 0x44DF, 0x3D22,
+ 0x44E4, 0x44E4, 0x37E2, 0x44E9, 0x44E9, 0x41CF, 0x44EA, 0x44EA, 0x3B71,
+ 0x44EB, 0x44EB, 0x3CF2, 0x44EC, 0x44EC, 0x3EB4, 0x44F4, 0x44F4, 0x3992,
+ 0x4503, 0x4503, 0x469F, 0x4504, 0x4504, 0x4763, 0x4509, 0x4509, 0x3E50,
+ 0x450B, 0x450B, 0x37D4, 0x4516, 0x4516, 0x37F9, 0x451D, 0x451D, 0x3767,
+ 0x4527, 0x4527, 0x37F7, 0x452E, 0x452E, 0x3CD3, 0x4533, 0x4533, 0x3C51,
+ 0x453B, 0x453B, 0x476A, 0x453D, 0x453D, 0x38C4, 0x453F, 0x453F, 0x3E12,
+ 0x4543, 0x4543, 0x37F3, 0x4551, 0x4551, 0x3AE4, 0x4552, 0x4552, 0x40B3,
+ 0x4555, 0x4555, 0x423E, 0x455C, 0x455C, 0x378B, 0x4562, 0x4562, 0x4940,
+ 0x456A, 0x456A, 0x3804, 0x4577, 0x4577, 0x476E, 0x4585, 0x4585, 0x38C5,
+ 0x45E9, 0x45E9, 0x3EE4, 0x4606, 0x4606, 0x4773, 0x460F, 0x460F, 0x3815,
+ 0x4615, 0x4615, 0x3843, 0x4617, 0x4617, 0x4774, 0x465B, 0x465B, 0x381D,
+ 0x467A, 0x467A, 0x39E9, 0x4680, 0x4680, 0x3D01, 0x46CF, 0x46CF, 0x3BA0,
+ 0x46D0, 0x46D0, 0x3DFA, 0x46F5, 0x46F5, 0x3B9F, 0x4713, 0x4713, 0x3833,
+ 0x4718, 0x4718, 0x3DC7, 0x474E, 0x474E, 0x3EBC, 0x477C, 0x477C, 0x3DCD,
+ 0x4798, 0x4798, 0x4781, 0x47A6, 0x47A6, 0x40A3, 0x47B6, 0x47B6, 0x3EEA,
+ 0x47D5, 0x47D5, 0x431A, 0x47ED, 0x47ED, 0x4783, 0x47F4, 0x47F4, 0x432F,
+ 0x4800, 0x4800, 0x461E, 0x480B, 0x480B, 0x4352, 0x4837, 0x4837, 0x4787,
+ 0x485D, 0x485D, 0x410F, 0x4871, 0x4871, 0x3D03, 0x489B, 0x489B, 0x3BBD,
+ 0x48AD, 0x48AD, 0x4791, 0x48AE, 0x48AE, 0x494D, 0x48D0, 0x48D0, 0x3DA7,
+ 0x48DD, 0x48DD, 0x4120, 0x48ED, 0x48ED, 0x4288, 0x48F3, 0x48F3, 0x3EC1,
+ 0x48FA, 0x48FA, 0x3E44, 0x4906, 0x4906, 0x3BC7, 0x4911, 0x4911, 0x4584,
+ 0x491E, 0x491E, 0x4794, 0x4925, 0x4925, 0x3C0F, 0x492A, 0x492A, 0x46AE,
+ 0x492D, 0x492D, 0x46CD, 0x4935, 0x4935, 0x3CC3, 0x493C, 0x493C, 0x3BF8,
+ 0x493E, 0x493E, 0x3D06, 0x4945, 0x4945, 0x47A3, 0x4951, 0x4951, 0x47A4,
+ 0x4953, 0x4953, 0x42AD, 0x4965, 0x4965, 0x3899, 0x496A, 0x496A, 0x47A9,
+ 0x4972, 0x4972, 0x3A24, 0x4989, 0x4989, 0x379B, 0x49A1, 0x49A1, 0x38B7,
+ 0x49A7, 0x49A7, 0x47AE, 0x49DF, 0x49DF, 0x38AA, 0x49E5, 0x49E5, 0x47B1,
+ 0x49E7, 0x49E7, 0x4621, 0x4A0F, 0x4A0F, 0x38C3, 0x4A1D, 0x4A1D, 0x3BEC,
+ 0x4A24, 0x4A24, 0x47B2, 0x4A35, 0x4A35, 0x47B4, 0x4A96, 0x4A96, 0x3CE7,
+ 0x4AB4, 0x4AB4, 0x4361, 0x4AB8, 0x4AB8, 0x3DA8, 0x4AD1, 0x4AD1, 0x38E3,
+ 0x4AE4, 0x4AE4, 0x47B7, 0x4AFF, 0x4AFF, 0x38F2, 0x4B19, 0x4B19, 0x47B9,
+ 0x4B2C, 0x4B2C, 0x461F, 0x4B37, 0x4B37, 0x41A9, 0x4B6F, 0x4B6F, 0x3C16,
+ 0x4B70, 0x4B70, 0x47C0, 0x4B72, 0x4B72, 0x38FC, 0x4B7B, 0x4B7B, 0x3C8D,
+ 0x4B7E, 0x4B7E, 0x400A, 0x4B8E, 0x4B8E, 0x39F7, 0x4B90, 0x4B90, 0x3C20,
+ 0x4B93, 0x4B93, 0x3A8C, 0x4B96, 0x4B96, 0x3942, 0x4B97, 0x4B97, 0x3C24,
+ 0x4B9D, 0x4B9D, 0x47C2, 0x4BBD, 0x4BBD, 0x3C23, 0x4BBE, 0x4BBE, 0x3954,
+ 0x4BC0, 0x4BC0, 0x3DDC, 0x4C04, 0x4C04, 0x3FBB, 0x4C07, 0x4C07, 0x3FB7,
+ 0x4C0E, 0x4C0E, 0x390C, 0x4C3B, 0x4C3B, 0x3F3C, 0x4C3E, 0x4C3E, 0x457B,
+ 0x4C5B, 0x4C5B, 0x3ED9, 0x4C6D, 0x4C6D, 0x47C9, 0x4C7D, 0x4C7D, 0x3E66,
+ 0x4CA4, 0x4CA4, 0x48BE, 0x4CAE, 0x4CAE, 0x3C42, 0x4CB0, 0x4CB0, 0x3C45,
+ 0x4CB7, 0x4CB7, 0x3E21, 0x4CCD, 0x4CCD, 0x4578, 0x4CE1, 0x4CE1, 0x3EF3,
+ 0x4CED, 0x4CED, 0x40AB, 0x4D09, 0x4D09, 0x3ED6, 0x4D10, 0x4D10, 0x4117,
+ 0x4D34, 0x4D34, 0x3935, 0x4D91, 0x4D91, 0x43F5, 0x4D9C, 0x4D9C, 0x48C4,
+ 0x4E00, 0x4E00, 0x0253, 0x4E01, 0x4E01, 0x0255, 0x4E03, 0x4E03, 0x0256,
+ 0x4E04, 0x4E04, 0x48FE, 0x4E07, 0x4E07, 0x1771, 0x4E08, 0x4E08, 0x0269,
+ 0x4E09, 0x4E09, 0x0267, 0x4E0A, 0x4E0A, 0x026A, 0x4E0B, 0x4E0B, 0x0268,
+ 0x4E0C, 0x4E0C, 0x1772, 0x4E0D, 0x4E0D, 0x0294, 0x4E0E, 0x4E0E, 0x177A,
+ 0x4E0F, 0x4E0F, 0x1778, 0x4E10, 0x4E10, 0x0293, 0x4E11, 0x4E11, 0x0292,
+ 0x4E14, 0x4E14, 0x02F2, 0x4E15, 0x4E15, 0x02F1, 0x4E16, 0x4E16, 0x02F0,
+ 0x4E18, 0x4E18, 0x02F3, 0x4E19, 0x4E19, 0x02EF, 0x4E1A, 0x4E1A, 0x48FD,
+ 0x4E1C, 0x4E1C, 0x48E0, 0x4E1E, 0x4E1F, 0x036E, 0x4E21, 0x4E21, 0x3D6D,
+ 0x4E24, 0x4E24, 0x458D, 0x4E26, 0x4E26, 0x0528, 0x4E28, 0x4E28, 0x0218,
+ 0x4E2A, 0x4E2A, 0x3F57, 0x4E2B, 0x4E2B, 0x026B, 0x4E2C, 0x4E2C, 0x44F3,
+ 0x4E2D, 0x4E2D, 0x0295, 0x4E2E, 0x4E2E, 0x177B, 0x4E30, 0x4E30, 0x0296,
+ 0x4E31, 0x4E31, 0x178E, 0x4E32, 0x4E32, 0x0415, 0x4E33, 0x4E33, 0x18F4,
+ 0x4E36, 0x4E36, 0x0219, 0x4E37, 0x4E37, 0x4517, 0x4E38, 0x4E38, 0x026C,
+ 0x4E39, 0x4E39, 0x0297, 0x4E3B, 0x4E3B, 0x02F4, 0x4E3C, 0x4E3C, 0x178F,
+ 0x4E3D, 0x4E3D, 0x4537, 0x4E3F, 0x4E3F, 0x021A, 0x4E41, 0x4E41, 0x36AF,
+ 0x4E42, 0x4E42, 0x176C, 0x4E43, 0x4E43, 0x0257, 0x4E45, 0x4E45, 0x026E,
+ 0x4E47, 0x4E47, 0x1773, 0x4E48, 0x4E48, 0x026F, 0x4E49, 0x4E49, 0x408E,
+ 0x4E4B, 0x4E4B, 0x0298, 0x4E4D, 0x4E4D, 0x02F5, 0x4E4E, 0x4E4E, 0x02F7,
+ 0x4E4F, 0x4E4F, 0x02F6, 0x4E52, 0x4E53, 0x0370, 0x4E56, 0x4E56, 0x0529,
+ 0x4E58, 0x4E58, 0x0831, 0x4E59, 0x4E59, 0x0254, 0x4E5A, 0x4E5A, 0x36B1,
+ 0x4E5B, 0x4E5B, 0x44E5, 0x4E5C, 0x4E5C, 0x176D, 0x4E5D, 0x4E5D, 0x0258,
+ 0x4E5E, 0x4E5E, 0x0271, 0x4E5F, 0x4E5F, 0x0270, 0x4E69, 0x4E69, 0x0372,
+ 0x4E6A, 0x4E6A, 0x3DE5, 0x4E73, 0x4E73, 0x052A, 0x4E78, 0x4E78, 0x3D8E,
+ 0x4E7E, 0x4E7E, 0x09FB, 0x4E7F, 0x4E7F, 0x1E35, 0x4E80, 0x4E80, 0x458E,
+ 0x4E81, 0x4E81, 0x43BC, 0x4E82, 0x4E82, 0x0DBE, 0x4E83, 0x4E84, 0x2361,
+ 0x4E85, 0x4E85, 0x021B, 0x4E86, 0x4E86, 0x0259, 0x4E87, 0x4E87, 0x458F,
+ 0x4E88, 0x4E88, 0x029A, 0x4E89, 0x4E89, 0x459C, 0x4E8B, 0x4E8B, 0x052B,
+ 0x4E8C, 0x4E8C, 0x025A, 0x4E8D, 0x4E8D, 0x1774, 0x4E8E, 0x4E8E, 0x0272,
+ 0x4E91, 0x4E91, 0x029B, 0x4E92, 0x4E92, 0x029D, 0x4E93, 0x4E93, 0x177C,
+ 0x4E94, 0x4E94, 0x029E, 0x4E95, 0x4E95, 0x029C, 0x4E98, 0x4E98, 0x39C4,
+ 0x4E99, 0x4E99, 0x0373, 0x4E9A, 0x4E9A, 0x48D5, 0x4E9B, 0x4E9B, 0x052C,
+ 0x4E9E, 0x4E9E, 0x052D, 0x4E9F, 0x4E9F, 0x06A3, 0x4EA0, 0x4EA0, 0x021C,
+ 0x4EA1, 0x4EA1, 0x0273, 0x4EA2, 0x4EA2, 0x029F, 0x4EA4, 0x4EA4, 0x0374,
+ 0x4EA5, 0x4EA5, 0x0376, 0x4EA6, 0x4EA6, 0x0375, 0x4EA8, 0x4EA8, 0x0416,
+ 0x4EAB, 0x4EAC, 0x052E, 0x4EAD, 0x4EAE, 0x06A4, 0x4EB3, 0x4EB3, 0x0832,
+ 0x4EB6, 0x4EB6, 0x2363, 0x4EB7, 0x4EB7, 0x413C, 0x4EB9, 0x4EB9, 0x3377,
+ 0x4EBA, 0x4EBA, 0x025B, 0x4EBB, 0x4EBB, 0x44E6, 0x4EBC, 0x4EBC, 0x39B1,
+ 0x4EBF, 0x4EBF, 0x4590, 0x4EC0, 0x4EC0, 0x02A1, 0x4EC1, 0x4EC1, 0x02A0,
+ 0x4EC2, 0x4EC2, 0x177D, 0x4EC3, 0x4EC3, 0x02A2, 0x4EC4, 0x4EC4, 0x02A8,
+ 0x4EC6, 0x4EC7, 0x02A3, 0x4EC8, 0x4EC8, 0x177F, 0x4EC9, 0x4EC9, 0x177E,
+ 0x4ECA, 0x4ECB, 0x02A6, 0x4ECD, 0x4ECD, 0x02A5, 0x4ECE, 0x4ECE, 0x3F62,
+ 0x4ED4, 0x4ED7, 0x02FA, 0x4ED8, 0x4ED8, 0x02F9, 0x4ED9, 0x4ED9, 0x0300,
+ 0x4EDA, 0x4EDA, 0x1795, 0x4EDC, 0x4EDC, 0x1791, 0x4EDD, 0x4EDD, 0x1794,
+ 0x4EDE, 0x4EDE, 0x0301, 0x4EDF, 0x4EDF, 0x0311, 0x4EE1, 0x4EE1, 0x1793,
+ 0x4EE3, 0x4EE4, 0x02FE, 0x4EE5, 0x4EE5, 0x02F8, 0x4EE8, 0x4EE8, 0x1790,
+ 0x4EE9, 0x4EE9, 0x1792, 0x4EEA, 0x4EEA, 0x48CB, 0x4EEB, 0x4EEB, 0x4591,
+ 0x4EEE, 0x4EEE, 0x3D76, 0x4EF0, 0x4EF0, 0x0383, 0x4EF1, 0x4EF1, 0x17BA,
+ 0x4EF2, 0x4EF2, 0x0380, 0x4EF3, 0x4EF3, 0x0384, 0x4EF4, 0x4EF4, 0x17C4,
+ 0x4EF5, 0x4EF5, 0x17B8, 0x4EF6, 0x4EF6, 0x0381, 0x4EF7, 0x4EF7, 0x17BC,
+ 0x4EF8, 0x4EF8, 0x39AD, 0x4EFB, 0x4EFB, 0x0382, 0x4EFD, 0x4EFD, 0x0385,
+ 0x4EFF, 0x4EFF, 0x0377, 0x4F00, 0x4F00, 0x17BB, 0x4F01, 0x4F01, 0x0386,
+ 0x4F02, 0x4F02, 0x17BF, 0x4F03, 0x4F03, 0x39C8, 0x4F04, 0x4F04, 0x17C3,
+ 0x4F05, 0x4F05, 0x17C0, 0x4F08, 0x4F08, 0x17BD, 0x4F09, 0x4F09, 0x0378,
+ 0x4F0A, 0x4F0A, 0x037A, 0x4F0B, 0x4F0B, 0x0387, 0x4F0D, 0x4F0D, 0x037C,
+ 0x4F0E, 0x4F0E, 0x17B5, 0x4F0F, 0x4F0F, 0x037F, 0x4F10, 0x4F11, 0x037D,
+ 0x4F12, 0x4F12, 0x17C5, 0x4F13, 0x4F13, 0x17C2, 0x4F14, 0x4F14, 0x17B9,
+ 0x4F15, 0x4F15, 0x037B, 0x4F18, 0x4F18, 0x17B6, 0x4F19, 0x4F19, 0x0379,
+ 0x4F1A, 0x4F1A, 0x453C, 0x4F1D, 0x4F1D, 0x17BE, 0x4F22, 0x4F22, 0x17C1,
+ 0x4F28, 0x4F28, 0x453D, 0x4F29, 0x4F29, 0x39BE, 0x4F2C, 0x4F2C, 0x17B7,
+ 0x4F2D, 0x4F2D, 0x182F, 0x4F2F, 0x4F2F, 0x042C, 0x4F30, 0x4F30, 0x041F,
+ 0x4F32, 0x4F32, 0x393D, 0x4F33, 0x4F33, 0x1830, 0x4F34, 0x4F34, 0x041C,
+ 0x4F36, 0x4F36, 0x042E, 0x4F37, 0x4F37, 0x4592, 0x4F38, 0x4F38, 0x0424,
+ 0x4F39, 0x4F39, 0x3F65, 0x4F3A, 0x4F3A, 0x0423, 0x4F3B, 0x4F3B, 0x1824,
+ 0x4F3C, 0x4F3C, 0x0427, 0x4F3D, 0x4F3D, 0x0422, 0x4F3E, 0x4F3E, 0x1829,
+ 0x4F3F, 0x4F3F, 0x1831, 0x4F41, 0x4F41, 0x182D, 0x4F42, 0x4F42, 0x39CB,
+ 0x4F43, 0x4F43, 0x0425, 0x4F45, 0x4F45, 0x3B8F, 0x4F46, 0x4F46, 0x0428,
+ 0x4F47, 0x4F47, 0x0419, 0x4F48, 0x4F48, 0x0431, 0x4F49, 0x4F49, 0x1826,
+ 0x4F4B, 0x4F4B, 0x39B4, 0x4F4C, 0x4F4C, 0x1900, 0x4F4D, 0x4F4D, 0x0417,
+ 0x4F4E, 0x4F4E, 0x042D, 0x4F4F, 0x4F4F, 0x0418, 0x4F50, 0x4F51, 0x0420,
+ 0x4F52, 0x4F52, 0x182B, 0x4F53, 0x4F53, 0x1827, 0x4F54, 0x4F54, 0x0426,
+ 0x4F55, 0x4F55, 0x041E, 0x4F56, 0x4F56, 0x1823, 0x4F57, 0x4F57, 0x041A,
+ 0x4F58, 0x4F58, 0x182E, 0x4F59, 0x4F59, 0x042F, 0x4F5A, 0x4F5A, 0x0432,
+ 0x4F5B, 0x4F5B, 0x041D, 0x4F5C, 0x4F5C, 0x042A, 0x4F5D, 0x4F5D, 0x0430,
+ 0x4F5E, 0x4F5E, 0x041B, 0x4F5F, 0x4F5F, 0x182C, 0x4F60, 0x4F60, 0x042B,
+ 0x4F61, 0x4F61, 0x1832, 0x4F62, 0x4F62, 0x1825, 0x4F63, 0x4F63, 0x0429,
+ 0x4F64, 0x4F64, 0x1828, 0x4F67, 0x4F67, 0x182A, 0x4F69, 0x4F69, 0x053D,
+ 0x4F6A, 0x4F6A, 0x1902, 0x4F6B, 0x4F6B, 0x190E, 0x4F6C, 0x4F6C, 0x0535,
+ 0x4F6E, 0x4F6E, 0x190F, 0x4F6F, 0x4F6F, 0x0530, 0x4F70, 0x4F70, 0x053A,
+ 0x4F72, 0x4F72, 0x3C72, 0x4F73, 0x4F73, 0x0533, 0x4F74, 0x4F74, 0x18FC,
+ 0x4F75, 0x4F75, 0x053B, 0x4F76, 0x4F76, 0x18FB, 0x4F77, 0x4F77, 0x18FF,
+ 0x4F78, 0x4F78, 0x1906, 0x4F79, 0x4F79, 0x1904, 0x4F7A, 0x4F7A, 0x0543,
+ 0x4F7B, 0x4F7B, 0x053E, 0x4F7C, 0x4F7C, 0x18F6, 0x4F7D, 0x4F7D, 0x18F8,
+ 0x4F7E, 0x4F7E, 0x0540, 0x4F7F, 0x4F7F, 0x0534, 0x4F80, 0x4F80, 0x18F9,
+ 0x4F81, 0x4F81, 0x1905, 0x4F82, 0x4F82, 0x190C, 0x4F83, 0x4F83, 0x0539,
+ 0x4F84, 0x4F84, 0x18FE, 0x4F85, 0x4F85, 0x18F7, 0x4F86, 0x4F86, 0x0538,
+ 0x4F87, 0x4F87, 0x18FA, 0x4F88, 0x4F88, 0x053C, 0x4F89, 0x4F89, 0x18FD,
+ 0x4F8A, 0x4F8A, 0x39B5, 0x4F8B, 0x4F8B, 0x0537, 0x4F8D, 0x4F8D, 0x0532,
+ 0x4F8F, 0x4F8F, 0x0541, 0x4F90, 0x4F90, 0x1907, 0x4F91, 0x4F91, 0x0542,
+ 0x4F92, 0x4F92, 0x190B, 0x4F94, 0x4F94, 0x1909, 0x4F95, 0x4F95, 0x190D,
+ 0x4F96, 0x4F96, 0x053F, 0x4F97, 0x4F97, 0x1901, 0x4F98, 0x4F98, 0x18F5,
+ 0x4F9A, 0x4F9A, 0x1903, 0x4F9B, 0x4F9B, 0x0536, 0x4F9C, 0x4F9C, 0x1908,
+ 0x4F9D, 0x4F9D, 0x0531, 0x4F9E, 0x4F9E, 0x190A, 0x4FA2, 0x4FA2, 0x39C7,
+ 0x4FA8, 0x4FA8, 0x453E, 0x4FAB, 0x4FAB, 0x4022, 0x4FAE, 0x4FAE, 0x06B4,
+ 0x4FAF, 0x4FAF, 0x06A8, 0x4FB0, 0x4FB0, 0x3D4A, 0x4FB2, 0x4FB2, 0x1A5D,
+ 0x4FB3, 0x4FB3, 0x1A65, 0x4FB5, 0x4FB5, 0x06A7, 0x4FB6, 0x4FB6, 0x06AF,
+ 0x4FB7, 0x4FB7, 0x06BB, 0x4FB9, 0x4FB9, 0x1A6B, 0x4FBA, 0x4FBA, 0x1A69,
+ 0x4FBB, 0x4FBB, 0x1A64, 0x4FBD, 0x4FBD, 0x4594, 0x4FBF, 0x4FBF, 0x06A9,
+ 0x4FC0, 0x4FC0, 0x1A6A, 0x4FC1, 0x4FC1, 0x1A60, 0x4FC2, 0x4FC2, 0x06B7,
+ 0x4FC3, 0x4FC3, 0x06AE, 0x4FC4, 0x4FC4, 0x06B6, 0x4FC5, 0x4FC5, 0x1A5B,
+ 0x4FC7, 0x4FC7, 0x1A67, 0x4FC8, 0x4FC8, 0x46E8, 0x4FC9, 0x4FC9, 0x1A5E,
+ 0x4FCA, 0x4FCA, 0x06B2, 0x4FCB, 0x4FCB, 0x1A5F, 0x4FCC, 0x4FCC, 0x39CF,
+ 0x4FCD, 0x4FCD, 0x1A5A, 0x4FCE, 0x4FCE, 0x06B9, 0x4FCF, 0x4FCF, 0x06AC,
+ 0x4FD0, 0x4FD0, 0x06B5, 0x4FD1, 0x4FD1, 0x06AB, 0x4FD3, 0x4FD3, 0x1A5C,
+ 0x4FD4, 0x4FD4, 0x1A61, 0x4FD6, 0x4FD6, 0x1A68, 0x4FD7, 0x4FD7, 0x06B3,
+ 0x4FD8, 0x4FD8, 0x06B0, 0x4FD9, 0x4FD9, 0x1A63, 0x4FDA, 0x4FDA, 0x06B8,
+ 0x4FDB, 0x4FDB, 0x1A66, 0x4FDC, 0x4FDC, 0x1A62, 0x4FDD, 0x4FDD, 0x06AD,
+ 0x4FDE, 0x4FDE, 0x06BA, 0x4FDF, 0x4FDF, 0x06B1, 0x4FE0, 0x4FE0, 0x06AA,
+ 0x4FE1, 0x4FE1, 0x06A6, 0x4FE4, 0x4FE4, 0x3C66, 0x4FE5, 0x4FE5, 0x39D0,
+ 0x4FEC, 0x4FEC, 0x1A6C, 0x4FEE, 0x4FEE, 0x084C, 0x4FEF, 0x4FEF, 0x0836,
+ 0x4FF1, 0x4FF1, 0x0846, 0x4FF2, 0x4FF2, 0x3F28, 0x4FF3, 0x4FF3, 0x084B,
+ 0x4FF4, 0x4FF4, 0x1C24, 0x4FF5, 0x4FF5, 0x1C23, 0x4FF6, 0x4FF7, 0x1C28,
+ 0x4FF8, 0x4FF8, 0x0839, 0x4FF9, 0x4FF9, 0x37B3, 0x4FFA, 0x4FFA, 0x0842,
+ 0x4FFD, 0x4FFD, 0x3F26, 0x4FFE, 0x4FFE, 0x084F, 0x5000, 0x5000, 0x0843,
+ 0x5003, 0x5003, 0x4596, 0x5005, 0x5005, 0x1C1D, 0x5006, 0x5006, 0x083C,
+ 0x5007, 0x5007, 0x1C1E, 0x5008, 0x5008, 0x4024, 0x5009, 0x5009, 0x0851,
+ 0x500B, 0x500B, 0x0848, 0x500C, 0x500D, 0x0833, 0x500E, 0x500E, 0x1C31,
+ 0x500F, 0x500F, 0x0A0C, 0x5011, 0x5011, 0x0841, 0x5012, 0x5012, 0x0840,
+ 0x5013, 0x5013, 0x1C1F, 0x5014, 0x5014, 0x0844, 0x5015, 0x5015, 0x1E45,
+ 0x5016, 0x5016, 0x083B, 0x5017, 0x5017, 0x1C2A, 0x5018, 0x5018, 0x084A,
+ 0x5019, 0x5019, 0x0849, 0x501A, 0x501A, 0x083F, 0x501B, 0x501B, 0x1C22,
+ 0x501C, 0x501C, 0x1C2B, 0x501E, 0x501E, 0x1C1C, 0x501F, 0x501F, 0x083E,
+ 0x5020, 0x5020, 0x1C2C, 0x5021, 0x5021, 0x0847, 0x5022, 0x5022, 0x1C20,
+ 0x5023, 0x5023, 0x0835, 0x5025, 0x5025, 0x0838, 0x5026, 0x5026, 0x0837,
+ 0x5027, 0x5027, 0x1C2D, 0x5028, 0x5028, 0x0845, 0x5029, 0x5029, 0x083A,
+ 0x502A, 0x502A, 0x084E, 0x502B, 0x502B, 0x0850, 0x502C, 0x502C, 0x1C27,
+ 0x502D, 0x502D, 0x084D, 0x502E, 0x502E, 0x39CC, 0x502F, 0x502F, 0x1C2F,
+ 0x5030, 0x5030, 0x1C21, 0x5031, 0x5031, 0x1C30, 0x5033, 0x5033, 0x1C25,
+ 0x5034, 0x5034, 0x3910, 0x5035, 0x5035, 0x1C2E, 0x5037, 0x5037, 0x1C26,
+ 0x503C, 0x503C, 0x083D, 0x5040, 0x5040, 0x1E4D, 0x5041, 0x5041, 0x1E41,
+ 0x5043, 0x5043, 0x0A00, 0x5045, 0x5045, 0x1E46, 0x5046, 0x5046, 0x1E4C,
+ 0x5047, 0x5047, 0x09FF, 0x5048, 0x5048, 0x1E3F, 0x5049, 0x5049, 0x0A03,
+ 0x504A, 0x504A, 0x1E43, 0x504B, 0x504B, 0x1E3C, 0x504C, 0x504C, 0x0A01,
+ 0x504D, 0x504D, 0x1E40, 0x504E, 0x504E, 0x0A06, 0x504F, 0x504F, 0x0A0B,
+ 0x5051, 0x5051, 0x1E51, 0x5053, 0x5053, 0x1E3B, 0x5055, 0x5055, 0x0A07,
+ 0x5056, 0x5056, 0x3F2C, 0x5057, 0x5057, 0x1E50, 0x5058, 0x5058, 0x39D1,
+ 0x505A, 0x505A, 0x0A02, 0x505B, 0x505B, 0x1E42, 0x505C, 0x505C, 0x09FE,
+ 0x505D, 0x505D, 0x1E3D, 0x505E, 0x505E, 0x1E39, 0x505F, 0x505F, 0x1E47,
+ 0x5060, 0x5060, 0x1E3A, 0x5061, 0x5061, 0x1E38, 0x5062, 0x5062, 0x1E44,
+ 0x5063, 0x5064, 0x1E4A, 0x5065, 0x5065, 0x0A04, 0x5066, 0x5066, 0x3DC9,
+ 0x5068, 0x5068, 0x20B8, 0x5069, 0x5069, 0x1E48, 0x506A, 0x506A, 0x1E37,
+ 0x506B, 0x506B, 0x1E49, 0x506C, 0x506C, 0x39CD, 0x506D, 0x506D, 0x0A0E,
+ 0x506E, 0x506E, 0x1E4E, 0x506F, 0x506F, 0x0A0D, 0x5070, 0x5070, 0x1E36,
+ 0x5072, 0x5072, 0x1E3E, 0x5073, 0x5073, 0x1E4F, 0x5074, 0x5074, 0x0A09,
+ 0x5075, 0x5075, 0x0A08, 0x5076, 0x5076, 0x0A05, 0x5077, 0x5077, 0x0A0A,
+ 0x507A, 0x507A, 0x09FC, 0x507D, 0x507D, 0x09FD, 0x5080, 0x5080, 0x0BEC,
+ 0x5081, 0x5081, 0x39CE, 0x5082, 0x5082, 0x20BB, 0x5083, 0x5083, 0x20B4,
+ 0x5085, 0x5085, 0x0BE9, 0x5087, 0x5087, 0x20BC, 0x5088, 0x5088, 0x439C,
+ 0x508B, 0x508B, 0x20B2, 0x508C, 0x508C, 0x20B5, 0x508D, 0x508D, 0x0BE8,
+ 0x508E, 0x508E, 0x20B6, 0x5090, 0x5090, 0x41EC, 0x5091, 0x5091, 0x0BEB,
+ 0x5092, 0x5092, 0x20BA, 0x5094, 0x5094, 0x20B0, 0x5095, 0x5095, 0x20AF,
+ 0x5096, 0x5096, 0x0BED, 0x5098, 0x5098, 0x0BEE, 0x5099, 0x5099, 0x0BEA,
+ 0x509A, 0x509A, 0x0BEF, 0x509B, 0x509B, 0x20AE, 0x509C, 0x509C, 0x20B9,
+ 0x509D, 0x509D, 0x20B7, 0x509E, 0x509E, 0x20B1, 0x50A2, 0x50A2, 0x0BE7,
+ 0x50A3, 0x50A3, 0x20B3, 0x50A6, 0x50A6, 0x3F3F, 0x50AC, 0x50AC, 0x0DC5,
+ 0x50AD, 0x50AD, 0x0DBF, 0x50AE, 0x50AE, 0x2367, 0x50AF, 0x50AF, 0x0DC8,
+ 0x50B0, 0x50B0, 0x236D, 0x50B1, 0x50B1, 0x2370, 0x50B2, 0x50B3, 0x0DC1,
+ 0x50B4, 0x50B4, 0x236A, 0x50B5, 0x50B5, 0x0DC0, 0x50B6, 0x50B6, 0x2373,
+ 0x50B7, 0x50B7, 0x0DC6, 0x50B8, 0x50B8, 0x2374, 0x50BA, 0x50BA, 0x236F,
+ 0x50BB, 0x50BB, 0x0DC7, 0x50BD, 0x50BD, 0x2364, 0x50BE, 0x50BE, 0x0DC4,
+ 0x50BF, 0x50BF, 0x2365, 0x50C1, 0x50C1, 0x236E, 0x50C2, 0x50C2, 0x236C,
+ 0x50C4, 0x50C4, 0x2368, 0x50C5, 0x50C5, 0x0DC3, 0x50C6, 0x50C6, 0x2366,
+ 0x50C7, 0x50C7, 0x0DC9, 0x50C8, 0x50C8, 0x236B, 0x50C9, 0x50C9, 0x2372,
+ 0x50CA, 0x50CA, 0x2369, 0x50CB, 0x50CB, 0x2371, 0x50CD, 0x50CD, 0x39C5,
+ 0x50CE, 0x50CE, 0x0F88, 0x50CF, 0x50CF, 0x0F85, 0x50D0, 0x50D0, 0x38D1,
+ 0x50D1, 0x50D1, 0x0F86, 0x50D3, 0x50D3, 0x261C, 0x50D4, 0x50D4, 0x2614,
+ 0x50D5, 0x50D5, 0x0F84, 0x50D6, 0x50D6, 0x0F81, 0x50D7, 0x50D7, 0x2615,
+ 0x50D9, 0x50D9, 0x3FCE, 0x50DA, 0x50DA, 0x0F83, 0x50DB, 0x50DB, 0x2618,
+ 0x50DD, 0x50DD, 0x261A, 0x50DE, 0x50DE, 0x4031, 0x50DF, 0x50DF, 0x3AFD,
+ 0x50E0, 0x50E0, 0x2621, 0x50E1, 0x50E1, 0x4171, 0x50E3, 0x50E3, 0x2620,
+ 0x50E4, 0x50E4, 0x261B, 0x50E5, 0x50E5, 0x0F80, 0x50E6, 0x50E6, 0x2613,
+ 0x50E7, 0x50E7, 0x0F7E, 0x50E8, 0x50E8, 0x2616, 0x50E9, 0x50E9, 0x0F89,
+ 0x50EA, 0x50EA, 0x2619, 0x50EC, 0x50EC, 0x261D, 0x50ED, 0x50ED, 0x0F82,
+ 0x50EE, 0x50EE, 0x0F7F, 0x50EF, 0x50EF, 0x261F, 0x50F0, 0x50F0, 0x261E,
+ 0x50F1, 0x50F1, 0x0F87, 0x50F3, 0x50F3, 0x2617, 0x50F4, 0x50F4, 0x3CE9,
+ 0x50F5, 0x50F5, 0x1105, 0x50F6, 0x50F6, 0x2883, 0x50F8, 0x50F8, 0x2880,
+ 0x50F9, 0x50F9, 0x1106, 0x50FB, 0x50FB, 0x1104, 0x50FC, 0x50FC, 0x39D2,
+ 0x50FD, 0x50FD, 0x2887, 0x50FE, 0x50FE, 0x2884, 0x50FF, 0x50FF, 0x287D,
+ 0x5100, 0x5100, 0x1103, 0x5101, 0x5101, 0x4032, 0x5102, 0x5102, 0x1107,
+ 0x5103, 0x5103, 0x287E, 0x5104, 0x5104, 0x1102, 0x5105, 0x5105, 0x110A,
+ 0x5106, 0x5107, 0x2881, 0x5108, 0x5109, 0x1108, 0x510A, 0x510A, 0x2888,
+ 0x510B, 0x510C, 0x2885, 0x510D, 0x510D, 0x39C6, 0x510E, 0x510E, 0x4034,
+ 0x5110, 0x5110, 0x128D, 0x5111, 0x5111, 0x2B04, 0x5112, 0x5112, 0x128A,
+ 0x5113, 0x5113, 0x2B01, 0x5114, 0x5114, 0x128C, 0x5115, 0x5115, 0x128E,
+ 0x5117, 0x5117, 0x2B02, 0x5118, 0x5118, 0x128B, 0x511A, 0x511A, 0x2B03,
+ 0x511C, 0x511C, 0x2B00, 0x511F, 0x511F, 0x13B5, 0x5120, 0x5120, 0x2D3E,
+ 0x5121, 0x5121, 0x13B6, 0x5122, 0x5122, 0x2D3C, 0x5124, 0x5124, 0x2D3D,
+ 0x5125, 0x5125, 0x2D3B, 0x5126, 0x5126, 0x2D3A, 0x5129, 0x5129, 0x2D3F,
+ 0x512A, 0x512A, 0x13B4, 0x512B, 0x512B, 0x39AE, 0x512D, 0x512E, 0x2F0F,
+ 0x5130, 0x5130, 0x287F, 0x5131, 0x5131, 0x2F0E, 0x5132, 0x5132, 0x13B7,
+ 0x5133, 0x5133, 0x1575, 0x5134, 0x5135, 0x307A, 0x5137, 0x5138, 0x1668,
+ 0x5139, 0x5139, 0x32C6, 0x513A, 0x513A, 0x32C5, 0x513B, 0x513B, 0x16BC,
+ 0x513C, 0x513C, 0x16BB, 0x513D, 0x513D, 0x340E, 0x513F, 0x513F, 0x025C,
+ 0x5140, 0x5140, 0x0274, 0x5141, 0x5141, 0x02AA, 0x5143, 0x5143, 0x02A9,
+ 0x5144, 0x5144, 0x0303, 0x5145, 0x5145, 0x0302, 0x5146, 0x5146, 0x038A,
+ 0x5147, 0x5147, 0x0389, 0x5148, 0x5148, 0x038B, 0x5149, 0x5149, 0x0388,
+ 0x514B, 0x514B, 0x0434, 0x514C, 0x514C, 0x0433, 0x514D, 0x514D, 0x0435,
+ 0x5152, 0x5152, 0x0545, 0x5154, 0x5154, 0x0544, 0x5155, 0x5155, 0x0546,
+ 0x5156, 0x5156, 0x439A, 0x5157, 0x5157, 0x06BC, 0x5159, 0x5159, 0x0119,
+ 0x515A, 0x515A, 0x1C32, 0x515B, 0x515B, 0x011A, 0x515C, 0x515C, 0x0A0F,
+ 0x515D, 0x515D, 0x011C, 0x515E, 0x515E, 0x011B, 0x515F, 0x515F, 0x20BD,
+ 0x5160, 0x5160, 0x403A, 0x5161, 0x5161, 0x011D, 0x5162, 0x5162, 0x0F8A,
+ 0x5163, 0x5163, 0x011E, 0x5165, 0x5165, 0x025D, 0x5167, 0x5167, 0x02AB,
+ 0x5168, 0x5168, 0x038C, 0x5169, 0x5169, 0x0547, 0x516A, 0x516A, 0x403C,
+ 0x516B, 0x516B, 0x025E, 0x516C, 0x516C, 0x02AE, 0x516D, 0x516E, 0x02AC,
+ 0x5171, 0x5171, 0x038D, 0x5174, 0x5174, 0x453F, 0x5175, 0x5175, 0x0436,
+ 0x5176, 0x5176, 0x0549, 0x5177, 0x5177, 0x0548, 0x5178, 0x5178, 0x054A,
+ 0x5179, 0x5179, 0x3ACE, 0x517C, 0x517C, 0x0852, 0x5180, 0x5180, 0x128F,
+ 0x5182, 0x5182, 0x021D, 0x5186, 0x5186, 0x439F, 0x5187, 0x5187, 0x1779,
+ 0x5188, 0x5188, 0x36B6, 0x5189, 0x518A, 0x0304, 0x518D, 0x518D, 0x038E,
+ 0x518F, 0x518F, 0x1833, 0x5191, 0x5191, 0x06BE, 0x5192, 0x5192, 0x06BD,
+ 0x5193, 0x5193, 0x1C34, 0x5194, 0x5194, 0x1C33, 0x5195, 0x5195, 0x0A10,
+ 0x5196, 0x5196, 0x021E, 0x5197, 0x5197, 0x02AF, 0x5198, 0x5198, 0x1780,
+ 0x519A, 0x519A, 0x3EA3, 0x519C, 0x519C, 0x4540, 0x519E, 0x519E, 0x1910,
+ 0x51A0, 0x51A0, 0x06BF, 0x51A2, 0x51A2, 0x0855, 0x51A4, 0x51A5, 0x0853,
+ 0x51A7, 0x51A7, 0x3EA6, 0x51A8, 0x51A8, 0x39DA, 0x51AA, 0x51AA, 0x1290,
+ 0x51AB, 0x51AB, 0x021F, 0x51AC, 0x51AC, 0x0306, 0x51B0, 0x51B0, 0x038F,
+ 0x51B1, 0x51B1, 0x17C6, 0x51B2, 0x51B2, 0x4048, 0x51B3, 0x51B3, 0x4051,
+ 0x51B4, 0x51B4, 0x3D7C, 0x51B5, 0x51B5, 0x4012, 0x51B6, 0x51B7, 0x0437,
+ 0x51B8, 0x51B8, 0x4049, 0x51B9, 0x51B9, 0x1834, 0x51BC, 0x51BC, 0x1911,
+ 0x51BD, 0x51BD, 0x054B, 0x51BE, 0x51BE, 0x1912, 0x51C3, 0x51C3, 0x39DB,
+ 0x51C4, 0x51C5, 0x1C36, 0x51C6, 0x51C6, 0x0858, 0x51C7, 0x51C7, 0x422A,
+ 0x51C8, 0x51C8, 0x1C38, 0x51C9, 0x51C9, 0x404B, 0x51CA, 0x51CA, 0x1C35,
+ 0x51CB, 0x51CB, 0x0859, 0x51CC, 0x51CC, 0x0857, 0x51CD, 0x51CD, 0x0856,
+ 0x51CE, 0x51CE, 0x1C39, 0x51CF, 0x51CF, 0x404C, 0x51D0, 0x51D0, 0x1E52,
+ 0x51D1, 0x51D1, 0x404D, 0x51D2, 0x51D2, 0x3DAD, 0x51D3, 0x51D3, 0x404F,
+ 0x51D4, 0x51D4, 0x20BE, 0x51D7, 0x51D7, 0x2375, 0x51D8, 0x51D8, 0x2622,
+ 0x51DB, 0x51DB, 0x459A, 0x51DC, 0x51DC, 0x110B, 0x51DD, 0x51DD, 0x1291,
+ 0x51DE, 0x51DE, 0x2B05, 0x51DF, 0x51DF, 0x424F, 0x51E0, 0x51E0, 0x025F,
+ 0x51E1, 0x51E1, 0x026D, 0x51E2, 0x51E2, 0x4052, 0x51E4, 0x51E4, 0x4541,
+ 0x51ED, 0x51ED, 0x4054, 0x51F0, 0x51F0, 0x0A11, 0x51F1, 0x51F1, 0x0BF1,
+ 0x51F3, 0x51F3, 0x0F8B, 0x51F4, 0x51F4, 0x4178, 0x51F5, 0x51F5, 0x176E,
+ 0x51F6, 0x51F6, 0x02B0, 0x51F8, 0x51F8, 0x0309, 0x51F9, 0x51FA, 0x0307,
+ 0x51FC, 0x51FC, 0x459B, 0x51FD, 0x51FD, 0x054C, 0x51FE, 0x51FE, 0x3F0A,
+ 0x5200, 0x5201, 0x0260, 0x5202, 0x5202, 0x36B3, 0x5203, 0x5203, 0x0275,
+ 0x5205, 0x5205, 0x43A1, 0x5206, 0x5208, 0x02B1, 0x5209, 0x5209, 0x1797,
+ 0x520A, 0x520A, 0x030A, 0x520B, 0x520B, 0x4059, 0x520C, 0x520C, 0x1796,
+ 0x520E, 0x520E, 0x0393, 0x5210, 0x5210, 0x17C8, 0x5211, 0x5212, 0x0391,
+ 0x5213, 0x5213, 0x17C7, 0x5216, 0x5216, 0x0394, 0x5217, 0x5217, 0x0390,
+ 0x521C, 0x521C, 0x1835, 0x521D, 0x521D, 0x068B, 0x521E, 0x521E, 0x1836,
+ 0x521F, 0x521F, 0x3F60, 0x5220, 0x5220, 0x4930, 0x5221, 0x5221, 0x1837,
+ 0x5224, 0x5224, 0x043A, 0x5225, 0x5225, 0x0439, 0x5226, 0x5226, 0x405A,
+ 0x5227, 0x5227, 0x43A2, 0x5228, 0x5228, 0x043D, 0x5229, 0x522A, 0x043B,
+ 0x522E, 0x522E, 0x0552, 0x5230, 0x5230, 0x0551, 0x5231, 0x5231, 0x1917,
+ 0x5232, 0x5233, 0x1914, 0x5234, 0x5234, 0x3EFB, 0x5235, 0x5235, 0x1913,
+ 0x5236, 0x5236, 0x0553, 0x5237, 0x5237, 0x054F, 0x5238, 0x5238, 0x054E,
+ 0x523A, 0x523A, 0x0550, 0x523B, 0x523B, 0x054D, 0x523C, 0x523C, 0x405B,
+ 0x5241, 0x5241, 0x0554, 0x5243, 0x5243, 0x06C1, 0x5244, 0x5244, 0x1A6D,
+ 0x5246, 0x5246, 0x1916, 0x5247, 0x5247, 0x06C6, 0x5249, 0x5249, 0x1A6E,
+ 0x524A, 0x524A, 0x06C2, 0x524B, 0x524B, 0x06C5, 0x524C, 0x524C, 0x06C4,
+ 0x524D, 0x524D, 0x06C3, 0x524E, 0x524E, 0x06C0, 0x5252, 0x5252, 0x1C3C,
+ 0x5254, 0x5254, 0x085C, 0x5255, 0x5255, 0x1C3F, 0x5256, 0x5256, 0x085A,
+ 0x5257, 0x5257, 0x405D, 0x5259, 0x5259, 0x39E4, 0x525A, 0x525A, 0x1C3B,
+ 0x525B, 0x525B, 0x085D, 0x525C, 0x525C, 0x085B, 0x525D, 0x525D, 0x085E,
+ 0x525E, 0x525F, 0x1C3D, 0x5260, 0x5260, 0x3F29, 0x5261, 0x5261, 0x1C3A,
+ 0x5262, 0x5262, 0x1C40, 0x5268, 0x5268, 0x4619, 0x5269, 0x5269, 0x0BF5,
+ 0x526A, 0x526A, 0x0A12, 0x526B, 0x526B, 0x1E53, 0x526C, 0x526C, 0x1E55,
+ 0x526D, 0x526D, 0x1E54, 0x526E, 0x526E, 0x1E56, 0x526F, 0x526F, 0x0A13,
+ 0x5272, 0x5272, 0x0BF2, 0x5273, 0x5273, 0x3F43, 0x5274, 0x5275, 0x0BF3,
+ 0x5277, 0x5277, 0x0DCB, 0x5278, 0x5278, 0x2377, 0x5279, 0x5279, 0x43A3,
+ 0x527A, 0x527A, 0x2376, 0x527B, 0x527C, 0x2378, 0x527D, 0x527D, 0x0DCC,
+ 0x527F, 0x527F, 0x0DCA, 0x5280, 0x5281, 0x2623, 0x5282, 0x5282, 0x0F8D,
+ 0x5283, 0x5283, 0x0F8C, 0x5284, 0x5284, 0x2776, 0x5287, 0x5289, 0x110C,
+ 0x528A, 0x528A, 0x1110, 0x528B, 0x528C, 0x2889, 0x528D, 0x528D, 0x110F,
+ 0x528F, 0x528F, 0x3DBF, 0x5290, 0x5290, 0x459D, 0x5291, 0x5291, 0x1292,
+ 0x5293, 0x5293, 0x1293, 0x5294, 0x5294, 0x405E, 0x5296, 0x5296, 0x307C,
+ 0x5297, 0x5297, 0x32C8, 0x5298, 0x5298, 0x32C7, 0x5299, 0x5299, 0x340F,
+ 0x529A, 0x529A, 0x3F68, 0x529B, 0x529B, 0x0262, 0x529F, 0x529F, 0x030C,
+ 0x52A0, 0x52A0, 0x030B, 0x52A1, 0x52A1, 0x4542, 0x52A3, 0x52A3, 0x0395,
+ 0x52A4, 0x52A4, 0x39E5, 0x52A6, 0x52A6, 0x17C9, 0x52A8, 0x52A8, 0x4543,
+ 0x52A9, 0x52AA, 0x043F, 0x52AB, 0x52AB, 0x043E, 0x52AC, 0x52AC, 0x0441,
+ 0x52AD, 0x52AE, 0x1838, 0x52B5, 0x52B5, 0x405C, 0x52B9, 0x52B9, 0x405F,
+ 0x52BB, 0x52BB, 0x0556, 0x52BC, 0x52BC, 0x1918, 0x52BE, 0x52BE, 0x0555,
+ 0x52C0, 0x52C0, 0x1A6F, 0x52C1, 0x52C1, 0x06CA, 0x52C2, 0x52C2, 0x1A70,
+ 0x52C3, 0x52C3, 0x06C9, 0x52C5, 0x52C5, 0x4060, 0x52C7, 0x52C7, 0x06C7,
+ 0x52C9, 0x52C9, 0x06C8, 0x52CC, 0x52CC, 0x3EE1, 0x52CD, 0x52CD, 0x1C41,
+ 0x52D0, 0x52D0, 0x4109, 0x52D1, 0x52D1, 0x3F2A, 0x52D2, 0x52D2, 0x0A14,
+ 0x52D3, 0x52D3, 0x1E58, 0x52D5, 0x52D5, 0x0A17, 0x52D6, 0x52D6, 0x1E57,
+ 0x52D7, 0x52D7, 0x0ACF, 0x52D8, 0x52D8, 0x0A16, 0x52D9, 0x52D9, 0x0A15,
+ 0x52DB, 0x52DB, 0x0BF8, 0x52DD, 0x52DD, 0x0BF7, 0x52DE, 0x52DE, 0x0BF6,
+ 0x52DF, 0x52DF, 0x0DCD, 0x52E0, 0x52E0, 0x4063, 0x52E1, 0x52E1, 0x39E7,
+ 0x52E2, 0x52E3, 0x0DD0, 0x52E4, 0x52E4, 0x0DCF, 0x52E6, 0x52E6, 0x0DCE,
+ 0x52E9, 0x52E9, 0x2625, 0x52EB, 0x52EB, 0x2626, 0x52EF, 0x52EF, 0x288C,
+ 0x52F0, 0x52F0, 0x1111, 0x52F1, 0x52F1, 0x288B, 0x52F3, 0x52F3, 0x1294,
+ 0x52F4, 0x52F4, 0x2D40, 0x52F5, 0x52F5, 0x13B8, 0x52F7, 0x52F7, 0x307D,
+ 0x52F8, 0x52F8, 0x1609, 0x52F9, 0x52F9, 0x0220, 0x52FA, 0x52FA, 0x0276,
+ 0x52FB, 0x52FB, 0x02B4, 0x52FC, 0x52FC, 0x1781, 0x52FE, 0x52FF, 0x02B5,
+ 0x5301, 0x5301, 0x3D79, 0x5305, 0x5306, 0x030D, 0x5308, 0x5308, 0x0396,
+ 0x5309, 0x5309, 0x183A, 0x530A, 0x530B, 0x1919, 0x530D, 0x530D, 0x06CB,
+ 0x530E, 0x530E, 0x1C42, 0x530F, 0x530F, 0x0A19, 0x5310, 0x5310, 0x0A18,
+ 0x5311, 0x5311, 0x20C0, 0x5312, 0x5312, 0x20BF, 0x5315, 0x5315, 0x0263,
+ 0x5316, 0x5316, 0x02B7, 0x5317, 0x5317, 0x030F, 0x5319, 0x5319, 0x0A1A,
+ 0x531A, 0x531A, 0x176F, 0x531C, 0x531C, 0x1798, 0x531D, 0x531D, 0x0310,
+ 0x531F, 0x531F, 0x17CB, 0x5320, 0x5320, 0x0398, 0x5321, 0x5321, 0x0397,
+ 0x5322, 0x5322, 0x17CA, 0x5323, 0x5323, 0x0442, 0x5327, 0x5327, 0x459E,
+ 0x532A, 0x532A, 0x085F, 0x532C, 0x532C, 0x3F36, 0x532D, 0x532D, 0x1E59,
+ 0x532F, 0x532F, 0x0DD2, 0x5330, 0x5330, 0x2627, 0x5331, 0x5331, 0x0F8E,
+ 0x5332, 0x5332, 0x3FD0, 0x5333, 0x5333, 0x406D, 0x5334, 0x5334, 0x2B06,
+ 0x5337, 0x5337, 0x31C7, 0x5338, 0x5338, 0x0221, 0x5339, 0x5339, 0x02B8,
+ 0x533B, 0x533B, 0x4544, 0x533C, 0x533C, 0x191B, 0x533D, 0x533D, 0x1A71,
+ 0x533E, 0x533E, 0x0A1D, 0x533F, 0x5340, 0x0A1B, 0x5341, 0x5341, 0x0264,
+ 0x5342, 0x5342, 0x4947, 0x5343, 0x5343, 0x0277, 0x5344, 0x5344, 0x016B,
+ 0x5345, 0x5345, 0x02BB, 0x5347, 0x5347, 0x02BA, 0x5348, 0x5348, 0x02B9,
+ 0x5349, 0x5349, 0x0313, 0x534A, 0x534A, 0x0312, 0x534C, 0x534C, 0x1799,
+ 0x534D, 0x534D, 0x17CC, 0x534E, 0x534E, 0x4545, 0x5351, 0x5351, 0x055A,
+ 0x5352, 0x5352, 0x0557, 0x5353, 0x5353, 0x0559, 0x5354, 0x5354, 0x0558,
+ 0x5357, 0x5357, 0x06CC, 0x535A, 0x535A, 0x0BF9, 0x535C, 0x535C, 0x0265,
+ 0x535D, 0x535D, 0x4501, 0x535E, 0x535E, 0x02BC, 0x535F, 0x535F, 0x43A7,
+ 0x5360, 0x5360, 0x0315, 0x5361, 0x5361, 0x0314, 0x5363, 0x5363, 0x183B,
+ 0x5364, 0x5364, 0x480A, 0x5366, 0x5366, 0x055B, 0x5367, 0x5367, 0x3ECD,
+ 0x5369, 0x5369, 0x0222, 0x536C, 0x536C, 0x1782, 0x536D, 0x536D, 0x407A,
+ 0x536E, 0x536E, 0x0317, 0x536F, 0x536F, 0x0316, 0x5370, 0x5371, 0x0399,
+ 0x5372, 0x5372, 0x183C, 0x5373, 0x5373, 0x0443, 0x5374, 0x5374, 0x407B,
+ 0x5375, 0x5375, 0x0444, 0x5377, 0x5379, 0x055C, 0x537B, 0x537B, 0x06CD,
+ 0x537C, 0x537C, 0x1A72, 0x537D, 0x537D, 0x4901, 0x537E, 0x537E, 0x407D,
+ 0x537F, 0x537F, 0x0860, 0x5382, 0x5382, 0x1770, 0x5384, 0x5384, 0x02BD,
+ 0x538A, 0x538A, 0x17CD, 0x538E, 0x538F, 0x183D, 0x5392, 0x5392, 0x191C,
+ 0x5393, 0x5393, 0x4082, 0x5394, 0x5394, 0x191D, 0x5396, 0x5396, 0x1A74,
+ 0x5397, 0x5397, 0x1A73, 0x5398, 0x5398, 0x1A76, 0x5399, 0x5399, 0x1A75,
+ 0x539A, 0x539A, 0x06CE, 0x539C, 0x539C, 0x1E5A, 0x539D, 0x539D, 0x0862,
+ 0x539E, 0x539E, 0x1C43, 0x539F, 0x539F, 0x0861, 0x53A0, 0x53A0, 0x4084,
+ 0x53A2, 0x53A2, 0x3E2B, 0x53A4, 0x53A4, 0x20C1, 0x53A5, 0x53A5, 0x0BFA,
+ 0x53A6, 0x53A6, 0x413B, 0x53A7, 0x53A7, 0x20C2, 0x53A8, 0x53A8, 0x413E,
+ 0x53A9, 0x53A9, 0x45A0, 0x53AA, 0x53AA, 0x3FC6, 0x53AB, 0x53AB, 0x4085,
+ 0x53AC, 0x53AC, 0x2628, 0x53AD, 0x53AD, 0x0F8F, 0x53AE, 0x53AE, 0x4086,
+ 0x53B0, 0x53B0, 0x45A2, 0x53B2, 0x53B2, 0x1112, 0x53B4, 0x53B4, 0x307E,
+ 0x53B6, 0x53B6, 0x0223, 0x53B9, 0x53B9, 0x1783, 0x53BB, 0x53BB, 0x0318,
+ 0x53C1, 0x53C1, 0x408B, 0x53C2, 0x53C2, 0x43A6, 0x53C3, 0x53C3, 0x0A1E,
+ 0x53C5, 0x53C5, 0x408C, 0x53C8, 0x53C8, 0x0266, 0x53C9, 0x53C9, 0x0278,
+ 0x53CA, 0x53CA, 0x02BF, 0x53CB, 0x53CB, 0x02BE, 0x53CC, 0x53CC, 0x38B6,
+ 0x53CD, 0x53CD, 0x02C0, 0x53D0, 0x53D0, 0x39FA, 0x53D1, 0x53D1, 0x4546,
+ 0x53D2, 0x53D2, 0x3E3D, 0x53D4, 0x53D4, 0x0560, 0x53D6, 0x53D6, 0x055F,
+ 0x53D7, 0x53D7, 0x0561, 0x53D8, 0x53D8, 0x4547, 0x53D9, 0x53D9, 0x4090,
+ 0x53DA, 0x53DA, 0x3F39, 0x53DB, 0x53DB, 0x06CF, 0x53DF, 0x53DF, 0x0863,
+ 0x53E0, 0x53E0, 0x4093, 0x53E1, 0x53E1, 0x2B07, 0x53E2, 0x53E2, 0x14C9,
+ 0x53E3, 0x53E3, 0x0279, 0x53E4, 0x53E4, 0x031A, 0x53E5, 0x53E5, 0x0329,
+ 0x53E6, 0x53E6, 0x0324, 0x53E8, 0x53E8, 0x031F, 0x53E9, 0x53E9, 0x031E,
+ 0x53EA, 0x53EA, 0x0325, 0x53EB, 0x53EB, 0x0323, 0x53EC, 0x53EC, 0x031C,
+ 0x53ED, 0x53ED, 0x032A, 0x53EE, 0x53EE, 0x031D, 0x53EF, 0x53EF, 0x0319,
+ 0x53F0, 0x53F0, 0x0328, 0x53F1, 0x53F1, 0x0327, 0x53F2, 0x53F2, 0x0326,
+ 0x53F3, 0x53F3, 0x031B, 0x53F5, 0x53F5, 0x0322, 0x53F6, 0x53F6, 0x4096,
+ 0x53F7, 0x53F7, 0x3808, 0x53F8, 0x53F8, 0x0321, 0x53FB, 0x53FB, 0x032B,
+ 0x53FC, 0x53FC, 0x0320, 0x53FE, 0x53FE, 0x40C1, 0x5401, 0x5401, 0x03A0,
+ 0x5403, 0x5403, 0x03A6, 0x5404, 0x5404, 0x03A2, 0x5406, 0x5406, 0x03A8,
+ 0x5407, 0x5407, 0x17CE, 0x5408, 0x5408, 0x03A5, 0x5409, 0x5409, 0x039B,
+ 0x540A, 0x540A, 0x039E, 0x540B, 0x540B, 0x03A1, 0x540C, 0x540C, 0x039D,
+ 0x540D, 0x540D, 0x03A4, 0x540E, 0x540E, 0x03A7, 0x540F, 0x540F, 0x039C,
+ 0x5410, 0x5410, 0x039F, 0x5411, 0x5411, 0x03A3, 0x5412, 0x5412, 0x03A9,
+ 0x5413, 0x5413, 0x4098, 0x5414, 0x5414, 0x3C77, 0x5416, 0x5416, 0x3E7F,
+ 0x5418, 0x5418, 0x1847, 0x5419, 0x5419, 0x1844, 0x541A, 0x541A, 0x3E64,
+ 0x541B, 0x541B, 0x0451, 0x541C, 0x541C, 0x1845, 0x541D, 0x541D, 0x0445,
+ 0x541E, 0x541E, 0x0447, 0x541F, 0x541F, 0x045F, 0x5420, 0x5420, 0x045A,
+ 0x5421, 0x5421, 0x4203, 0x5423, 0x5423, 0x45A3, 0x5424, 0x5424, 0x184C,
+ 0x5425, 0x5425, 0x1846, 0x5426, 0x5426, 0x0449, 0x5427, 0x5427, 0x044B,
+ 0x5428, 0x5428, 0x184B, 0x5429, 0x5429, 0x0452, 0x542A, 0x542A, 0x1841,
+ 0x542B, 0x542B, 0x045E, 0x542C, 0x542C, 0x0460, 0x542D, 0x542D, 0x0446,
+ 0x542E, 0x542E, 0x0457, 0x542F, 0x542F, 0x40AC, 0x5430, 0x5430, 0x183F,
+ 0x5431, 0x5431, 0x045D, 0x5432, 0x5432, 0x3E75, 0x5433, 0x5433, 0x044E,
+ 0x5435, 0x5436, 0x0458, 0x5437, 0x5437, 0x1840, 0x5438, 0x5438, 0x0456,
+ 0x5439, 0x5439, 0x0454, 0x543B, 0x543B, 0x0455, 0x543C, 0x543C, 0x045B,
+ 0x543D, 0x543D, 0x1848, 0x543E, 0x543E, 0x0448, 0x5440, 0x5440, 0x045C,
+ 0x5441, 0x5441, 0x184A, 0x5442, 0x5442, 0x0450, 0x5443, 0x5443, 0x044D,
+ 0x5445, 0x5445, 0x1843, 0x5446, 0x5446, 0x044C, 0x5447, 0x5447, 0x184D,
+ 0x5448, 0x5448, 0x044F, 0x544A, 0x544A, 0x0453, 0x544B, 0x544B, 0x3ED1,
+ 0x544D, 0x544D, 0x3EA7, 0x544E, 0x544E, 0x044A, 0x544F, 0x544F, 0x1849,
+ 0x5454, 0x5454, 0x1842, 0x5460, 0x5460, 0x192E, 0x5461, 0x5461, 0x192D,
+ 0x5462, 0x5462, 0x0573, 0x5463, 0x5463, 0x1930, 0x5464, 0x5464, 0x1932,
+ 0x5465, 0x5465, 0x1927, 0x5466, 0x5466, 0x192A, 0x5467, 0x5467, 0x1931,
+ 0x5468, 0x5468, 0x0574, 0x5469, 0x5469, 0x3F32, 0x546A, 0x546A, 0x3D83,
+ 0x546B, 0x546B, 0x1924, 0x546C, 0x546C, 0x1928, 0x546D, 0x546D, 0x409D,
+ 0x546F, 0x546F, 0x192C, 0x5470, 0x5470, 0x1A85, 0x5471, 0x5471, 0x056F,
+ 0x5472, 0x5472, 0x1A89, 0x5473, 0x5473, 0x0562, 0x5474, 0x5474, 0x1929,
+ 0x5475, 0x5475, 0x0563, 0x5476, 0x5476, 0x0570, 0x5477, 0x5477, 0x0569,
+ 0x5478, 0x5478, 0x0565, 0x547A, 0x547A, 0x1925, 0x547B, 0x547B, 0x0568,
+ 0x547C, 0x547C, 0x056D, 0x547D, 0x547D, 0x0576, 0x547E, 0x547E, 0x1926,
+ 0x547F, 0x547F, 0x191F, 0x5480, 0x5480, 0x0567, 0x5481, 0x5481, 0x1920,
+ 0x5482, 0x5482, 0x1922, 0x5484, 0x5484, 0x056A, 0x5485, 0x5485, 0x46D9,
+ 0x5486, 0x5486, 0x056C, 0x5487, 0x5487, 0x191E, 0x5488, 0x5488, 0x1923,
+ 0x548B, 0x548B, 0x0575, 0x548C, 0x548C, 0x0571, 0x548D, 0x548D, 0x192B,
+ 0x548E, 0x548E, 0x0577, 0x548F, 0x548F, 0x40A1, 0x5490, 0x5490, 0x056E,
+ 0x5491, 0x5491, 0x1921, 0x5492, 0x5492, 0x056B, 0x5493, 0x5493, 0x45A7,
+ 0x5494, 0x5494, 0x3E98, 0x5495, 0x5495, 0x0566, 0x5496, 0x5496, 0x0564,
+ 0x5497, 0x5497, 0x3E8A, 0x5498, 0x5498, 0x192F, 0x549A, 0x549A, 0x0572,
+ 0x549C, 0x549C, 0x3F66, 0x549E, 0x549E, 0x47ED, 0x54A0, 0x54A0, 0x1A84,
+ 0x54A1, 0x54A1, 0x1A78, 0x54A2, 0x54A2, 0x1A87, 0x54A3, 0x54A3, 0x45A8,
+ 0x54A4, 0x54A4, 0x40A2, 0x54A5, 0x54A5, 0x1A7A, 0x54A6, 0x54A6, 0x06D6,
+ 0x54A7, 0x54A7, 0x06E4, 0x54A8, 0x54A8, 0x06D2, 0x54A9, 0x54A9, 0x06E3,
+ 0x54AA, 0x54AA, 0x06DB, 0x54AB, 0x54AB, 0x06E0, 0x54AC, 0x54AC, 0x06D0,
+ 0x54AD, 0x54AD, 0x1A79, 0x54AE, 0x54AE, 0x1A7F, 0x54AF, 0x54AF, 0x06DF,
+ 0x54B0, 0x54B0, 0x1A8B, 0x54B1, 0x54B1, 0x06E1, 0x54B2, 0x54B2, 0x3744,
+ 0x54B3, 0x54B3, 0x06D7, 0x54B4, 0x54B4, 0x45A9, 0x54B6, 0x54B6, 0x1A81,
+ 0x54B7, 0x54B7, 0x1A7E, 0x54B8, 0x54B8, 0x06D5, 0x54B9, 0x54B9, 0x45AA,
+ 0x54BA, 0x54BA, 0x1A77, 0x54BB, 0x54BB, 0x06E2, 0x54BC, 0x54BC, 0x1A86,
+ 0x54BD, 0x54BD, 0x06DA, 0x54BE, 0x54BE, 0x1A88, 0x54BF, 0x54BF, 0x06E5,
+ 0x54C0, 0x54C0, 0x06D1, 0x54C1, 0x54C1, 0x06DC, 0x54C2, 0x54C2, 0x06D9,
+ 0x54C3, 0x54C3, 0x1A7C, 0x54C4, 0x54C4, 0x06DD, 0x54C5, 0x54C6, 0x1A82,
+ 0x54C7, 0x54C7, 0x06D8, 0x54C8, 0x54C8, 0x06DE, 0x54C9, 0x54C9, 0x06D4,
+ 0x54CB, 0x54CB, 0x39A3, 0x54CC, 0x54CC, 0x43A8, 0x54CD, 0x54CD, 0x3A00,
+ 0x54CE, 0x54CE, 0x06D3, 0x54CF, 0x54CF, 0x1A7B, 0x54D0, 0x54D0, 0x45AB,
+ 0x54D6, 0x54D6, 0x1A80, 0x54DA, 0x54DA, 0x4923, 0x54DE, 0x54DE, 0x1A8A,
+ 0x54E0, 0x54E0, 0x1C57, 0x54E1, 0x54E1, 0x0870, 0x54E2, 0x54E2, 0x1C45,
+ 0x54E3, 0x54E3, 0x4341, 0x54E4, 0x54E4, 0x1C4A, 0x54E5, 0x54E5, 0x0869,
+ 0x54E6, 0x54E6, 0x0874, 0x54E7, 0x54E7, 0x1C48, 0x54E8, 0x54E8, 0x0864,
+ 0x54E9, 0x54E9, 0x086E, 0x54EA, 0x54EA, 0x0873, 0x54EB, 0x54EB, 0x1C4F,
+ 0x54ED, 0x54ED, 0x086F, 0x54EE, 0x54EE, 0x0872, 0x54EF, 0x54EF, 0x45AC,
+ 0x54F1, 0x54F1, 0x1C52, 0x54F2, 0x54F2, 0x086A, 0x54F3, 0x54F3, 0x1C49,
+ 0x54F7, 0x54F8, 0x1C55, 0x54FA, 0x54FA, 0x086C, 0x54FB, 0x54FB, 0x1C54,
+ 0x54FC, 0x54FC, 0x0868, 0x54FD, 0x54FD, 0x0877, 0x54FF, 0x54FF, 0x1C4C,
+ 0x5501, 0x5501, 0x0866, 0x5502, 0x5502, 0x3CCC, 0x5503, 0x5503, 0x1C59,
+ 0x5504, 0x5504, 0x1C4D, 0x5505, 0x5505, 0x1C51, 0x5506, 0x5506, 0x086B,
+ 0x5507, 0x5507, 0x0876, 0x5508, 0x5508, 0x1C4E, 0x5509, 0x5509, 0x0871,
+ 0x550A, 0x550A, 0x1C53, 0x550B, 0x550B, 0x1C5A, 0x550C, 0x550C, 0x1E69,
+ 0x550D, 0x550D, 0x3A73, 0x550E, 0x550E, 0x1C58, 0x550F, 0x550F, 0x0878,
+ 0x5510, 0x5510, 0x0865, 0x5511, 0x5511, 0x1C50, 0x5512, 0x5512, 0x1C47,
+ 0x5513, 0x5513, 0x3EA9, 0x5514, 0x5514, 0x086D, 0x5517, 0x5517, 0x1C46,
+ 0x5518, 0x5518, 0x45AD, 0x551A, 0x551A, 0x1C4B, 0x551E, 0x551E, 0x3EA8,
+ 0x5523, 0x5523, 0x45AE, 0x5525, 0x5525, 0x4309, 0x5526, 0x5526, 0x1C44,
+ 0x5527, 0x5527, 0x0875, 0x5528, 0x5528, 0x45AF, 0x552A, 0x552A, 0x1E61,
+ 0x552B, 0x552B, 0x409A, 0x552C, 0x552C, 0x0A31, 0x552D, 0x552D, 0x1E6F,
+ 0x552E, 0x552E, 0x0A2F, 0x552F, 0x552F, 0x0A2C, 0x5530, 0x5530, 0x1E66,
+ 0x5531, 0x5531, 0x0A28, 0x5532, 0x5532, 0x1E6A, 0x5533, 0x5533, 0x0A33,
+ 0x5534, 0x5534, 0x1E60, 0x5535, 0x5535, 0x1E65, 0x5536, 0x5536, 0x1E64,
+ 0x5537, 0x5537, 0x0867, 0x5538, 0x5538, 0x0A2E, 0x5539, 0x5539, 0x1E6D,
+ 0x553B, 0x553B, 0x1E70, 0x553C, 0x553C, 0x1E5D, 0x553E, 0x553E, 0x0C0C,
+ 0x553F, 0x553F, 0x43A9, 0x5540, 0x5540, 0x1E71, 0x5541, 0x5541, 0x0A34,
+ 0x5543, 0x5543, 0x0A26, 0x5544, 0x5544, 0x0A23, 0x5545, 0x5545, 0x1E68,
+ 0x5546, 0x5546, 0x0A20, 0x5547, 0x5547, 0x40AA, 0x5548, 0x5548, 0x1E6E,
+ 0x5549, 0x5549, 0x4068, 0x554A, 0x554A, 0x0A27, 0x554B, 0x554B, 0x1E72,
+ 0x554D, 0x554D, 0x1E5E, 0x554E, 0x554E, 0x1E6C, 0x554F, 0x554F, 0x0A2A,
+ 0x5550, 0x5550, 0x1E5F, 0x5551, 0x5551, 0x1E62, 0x5552, 0x5552, 0x1E67,
+ 0x5553, 0x5553, 0x43AE, 0x5555, 0x5555, 0x0A2B, 0x5556, 0x5556, 0x0A29,
+ 0x5557, 0x5557, 0x0A35, 0x555C, 0x555C, 0x0A30, 0x555D, 0x555D, 0x40A0,
+ 0x555E, 0x555E, 0x0A24, 0x555F, 0x555F, 0x0ABC, 0x5561, 0x5561, 0x0A25,
+ 0x5562, 0x5562, 0x1E63, 0x5563, 0x5563, 0x0A32, 0x5564, 0x5564, 0x0A2D,
+ 0x5565, 0x5565, 0x1E6B, 0x5566, 0x5566, 0x0A22, 0x5569, 0x5569, 0x3E9F,
+ 0x556A, 0x556A, 0x0A21, 0x556B, 0x556B, 0x3B2E, 0x5571, 0x5571, 0x3BC6,
+ 0x5572, 0x5572, 0x3E8B, 0x5573, 0x5573, 0x3F24, 0x5575, 0x5576, 0x1E5B,
+ 0x5577, 0x5577, 0x20C7, 0x5579, 0x5579, 0x435D, 0x557B, 0x557B, 0x0BFB,
+ 0x557C, 0x557C, 0x0BFE, 0x557D, 0x557D, 0x20D2, 0x557E, 0x557E, 0x0C12,
+ 0x557F, 0x557F, 0x20D5, 0x5580, 0x5580, 0x0BFC, 0x5581, 0x5581, 0x20CE,
+ 0x5582, 0x5582, 0x0C02, 0x5583, 0x5583, 0x0C08, 0x5584, 0x5584, 0x0D1B,
+ 0x5586, 0x5586, 0x40AE, 0x5587, 0x5587, 0x0C06, 0x5588, 0x5588, 0x20CB,
+ 0x5589, 0x5589, 0x0C13, 0x558A, 0x558A, 0x0BFF, 0x558B, 0x558B, 0x0C07,
+ 0x558C, 0x558C, 0x20D3, 0x558D, 0x558D, 0x2387, 0x558E, 0x558E, 0x20D8,
+ 0x558F, 0x558F, 0x20CC, 0x5590, 0x5590, 0x430E, 0x5591, 0x5591, 0x20C3,
+ 0x5592, 0x5592, 0x20D0, 0x5593, 0x5593, 0x20CA, 0x5594, 0x5594, 0x0C05,
+ 0x5595, 0x5595, 0x20D6, 0x5598, 0x5598, 0x0C01, 0x5599, 0x5599, 0x0C15,
+ 0x559A, 0x559A, 0x0C0E, 0x559C, 0x559C, 0x0C03, 0x559D, 0x559D, 0x0C00,
+ 0x559F, 0x559F, 0x0C0B, 0x55A1, 0x55A1, 0x20D7, 0x55A2, 0x55A2, 0x20C9,
+ 0x55A3, 0x55A3, 0x20CF, 0x55A4, 0x55A4, 0x20D1, 0x55A5, 0x55A5, 0x20C5,
+ 0x55A6, 0x55A6, 0x20D4, 0x55A7, 0x55A7, 0x0BFD, 0x55A8, 0x55A8, 0x20C4,
+ 0x55A9, 0x55A9, 0x40AF, 0x55AA, 0x55AA, 0x0C04, 0x55AB, 0x55AB, 0x0C14,
+ 0x55AC, 0x55AC, 0x0C10, 0x55AD, 0x55AD, 0x20C6, 0x55AE, 0x55AE, 0x0C0A,
+ 0x55B0, 0x55B0, 0x38F5, 0x55B1, 0x55B1, 0x0C11, 0x55B2, 0x55B2, 0x0C0D,
+ 0x55B3, 0x55B3, 0x0C09, 0x55B4, 0x55B4, 0x39FE, 0x55B5, 0x55B5, 0x20CD,
+ 0x55B9, 0x55B9, 0x43AA, 0x55BA, 0x55BA, 0x3E89, 0x55BB, 0x55BB, 0x0C0F,
+ 0x55BC, 0x55BC, 0x3DC3, 0x55BF, 0x55BF, 0x2385, 0x55C0, 0x55C0, 0x2381,
+ 0x55C1, 0x55C1, 0x3E4F, 0x55C2, 0x55C2, 0x2390, 0x55C3, 0x55C3, 0x237A,
+ 0x55C4, 0x55C4, 0x2383, 0x55C5, 0x55C6, 0x0DE0, 0x55C7, 0x55C7, 0x0DD9,
+ 0x55C8, 0x55C8, 0x238C, 0x55C9, 0x55C9, 0x0DE3, 0x55CA, 0x55CA, 0x237F,
+ 0x55CB, 0x55CB, 0x237E, 0x55CC, 0x55CC, 0x237C, 0x55CD, 0x55CD, 0x238E,
+ 0x55CE, 0x55CE, 0x0DD7, 0x55CF, 0x55CF, 0x2388, 0x55D0, 0x55D0, 0x237D,
+ 0x55D1, 0x55D1, 0x0DDA, 0x55D2, 0x55D2, 0x2386, 0x55D3, 0x55D3, 0x0DD5,
+ 0x55D4, 0x55D4, 0x2382, 0x55D5, 0x55D5, 0x2389, 0x55D6, 0x55D6, 0x238B,
+ 0x55D7, 0x55D7, 0x45B3, 0x55D8, 0x55D8, 0x43AB, 0x55D9, 0x55D9, 0x238F,
+ 0x55DA, 0x55DA, 0x0DDE, 0x55DB, 0x55DB, 0x237B, 0x55DC, 0x55DC, 0x0DD8,
+ 0x55DD, 0x55DD, 0x2380, 0x55DE, 0x55DE, 0x3E94, 0x55DF, 0x55DF, 0x0DD3,
+ 0x55E1, 0x55E1, 0x0DDF, 0x55E2, 0x55E2, 0x238A, 0x55E3, 0x55E4, 0x0DDB,
+ 0x55E5, 0x55E5, 0x0DE2, 0x55E6, 0x55E6, 0x0DD6, 0x55E7, 0x55E7, 0x011F,
+ 0x55E8, 0x55E8, 0x0DD4, 0x55E9, 0x55E9, 0x2384, 0x55EA, 0x55EA, 0x3E7C,
+ 0x55EC, 0x55EC, 0x37D2, 0x55EF, 0x55EF, 0x0DDD, 0x55F0, 0x55F0, 0x3E88,
+ 0x55F1, 0x55F1, 0x3E83, 0x55F2, 0x55F2, 0x238D, 0x55F5, 0x55F5, 0x4786,
+ 0x55F6, 0x55F6, 0x0F9F, 0x55F7, 0x55F7, 0x0F9A, 0x55F9, 0x55F9, 0x2637,
+ 0x55FA, 0x55FA, 0x2633, 0x55FB, 0x55FB, 0x4626, 0x55FC, 0x55FC, 0x262D,
+ 0x55FD, 0x55FD, 0x0F94, 0x55FE, 0x55FE, 0x0F90, 0x55FF, 0x55FF, 0x2636,
+ 0x5600, 0x5600, 0x0F91, 0x5601, 0x5601, 0x2630, 0x5602, 0x5602, 0x2632,
+ 0x5604, 0x5604, 0x2635, 0x5605, 0x5605, 0x3E82, 0x5606, 0x5606, 0x0F96,
+ 0x5608, 0x5608, 0x0F9D, 0x5609, 0x5609, 0x0F97, 0x560C, 0x560C, 0x262B,
+ 0x560D, 0x560E, 0x0F98, 0x560F, 0x560F, 0x262E, 0x5610, 0x5610, 0x0F9E,
+ 0x5611, 0x5611, 0x3F4D, 0x5612, 0x5612, 0x262C, 0x5613, 0x5613, 0x2631,
+ 0x5614, 0x5614, 0x0F95, 0x5615, 0x5615, 0x262A, 0x5616, 0x5616, 0x0F9B,
+ 0x5617, 0x5617, 0x0F93, 0x561B, 0x561B, 0x0F92, 0x561C, 0x561C, 0x262F,
+ 0x561D, 0x561D, 0x2634, 0x561E, 0x561E, 0x3E68, 0x561F, 0x561F, 0x0F9C,
+ 0x5620, 0x5620, 0x3F7D, 0x5621, 0x5621, 0x43AD, 0x5622, 0x5622, 0x3E67,
+ 0x5623, 0x5623, 0x4707, 0x5625, 0x5625, 0x3E78, 0x5627, 0x5627, 0x2629,
+ 0x5629, 0x5629, 0x1119, 0x562A, 0x562A, 0x289D, 0x562C, 0x562C, 0x289A,
+ 0x562D, 0x562D, 0x3E63, 0x562E, 0x562E, 0x1113, 0x562F, 0x5630, 0x111F,
+ 0x5632, 0x5632, 0x1116, 0x5633, 0x5633, 0x2898, 0x5634, 0x5634, 0x1118,
+ 0x5635, 0x5635, 0x2890, 0x5636, 0x5636, 0x111E, 0x5637, 0x5637, 0x40B7,
+ 0x5638, 0x5638, 0x289C, 0x5639, 0x5639, 0x1115, 0x563A, 0x563A, 0x289E,
+ 0x563B, 0x563B, 0x1114, 0x563D, 0x563D, 0x2899, 0x563E, 0x563E, 0x289B,
+ 0x563F, 0x563F, 0x1117, 0x5640, 0x5640, 0x2897, 0x5641, 0x5641, 0x2891,
+ 0x5642, 0x5642, 0x288E, 0x5643, 0x5643, 0x3E7E, 0x5645, 0x5645, 0x20C8,
+ 0x5646, 0x5646, 0x2894, 0x5648, 0x5648, 0x288D, 0x5649, 0x5649, 0x2893,
+ 0x564A, 0x564A, 0x2892, 0x564C, 0x564C, 0x288F, 0x564D, 0x564D, 0x40BC,
+ 0x564E, 0x564E, 0x111B, 0x564F, 0x564F, 0x40BD, 0x5650, 0x5650, 0x47CF,
+ 0x5652, 0x5652, 0x45C2, 0x5653, 0x5653, 0x111A, 0x5654, 0x5654, 0x43AF,
+ 0x5657, 0x5657, 0x111C, 0x5658, 0x5658, 0x2895, 0x5659, 0x5659, 0x1295,
+ 0x565A, 0x565A, 0x2896, 0x565D, 0x565D, 0x3EF9, 0x565E, 0x565E, 0x2B10,
+ 0x5660, 0x5660, 0x2B09, 0x5661, 0x5661, 0x3812, 0x5662, 0x5662, 0x12A1,
+ 0x5663, 0x5663, 0x2B0D, 0x5664, 0x5664, 0x1299, 0x5665, 0x5665, 0x129D,
+ 0x5666, 0x5666, 0x2B0C, 0x5668, 0x5668, 0x129C, 0x5669, 0x5669, 0x1298,
+ 0x566A, 0x566A, 0x129B, 0x566B, 0x566B, 0x1296, 0x566C, 0x566C, 0x12A0,
+ 0x566D, 0x566D, 0x2B0E, 0x566E, 0x566E, 0x2B0A, 0x566F, 0x566F, 0x129F,
+ 0x5670, 0x5670, 0x2B08, 0x5671, 0x5671, 0x129E, 0x5672, 0x5672, 0x2B0F,
+ 0x5673, 0x5673, 0x2B0B, 0x5674, 0x5674, 0x111D, 0x5676, 0x5676, 0x12A2,
+ 0x5677, 0x5677, 0x2B11, 0x5678, 0x5678, 0x129A, 0x5679, 0x5679, 0x1297,
+ 0x567A, 0x567A, 0x3D85, 0x567B, 0x567B, 0x3EB7, 0x567C, 0x567C, 0x3EED,
+ 0x567E, 0x567E, 0x2D47, 0x567F, 0x567F, 0x2D49, 0x5680, 0x5680, 0x13BA,
+ 0x5681, 0x5681, 0x2D4A, 0x5682, 0x5682, 0x2D48, 0x5683, 0x5683, 0x2D46,
+ 0x5684, 0x5684, 0x2D45, 0x5685, 0x5685, 0x13BC, 0x5686, 0x5686, 0x2D44,
+ 0x5687, 0x5687, 0x13BD, 0x5689, 0x5689, 0x4628, 0x568A, 0x568A, 0x3949,
+ 0x568B, 0x568B, 0x3E4C, 0x568C, 0x568D, 0x2D42, 0x568E, 0x568E, 0x13B9,
+ 0x568F, 0x568F, 0x13BE, 0x5690, 0x5690, 0x13BB, 0x5692, 0x5692, 0x39A6,
+ 0x5693, 0x5693, 0x2D41, 0x5695, 0x5695, 0x14CA, 0x5697, 0x5697, 0x2F13,
+ 0x5698, 0x5698, 0x2F11, 0x5699, 0x5699, 0x2F16, 0x569A, 0x569A, 0x2F14,
+ 0x569C, 0x569C, 0x2F12, 0x569D, 0x569D, 0x2F15, 0x569E, 0x569E, 0x39A4,
+ 0x569F, 0x569F, 0x3948, 0x56A1, 0x56A1, 0x436B, 0x56A4, 0x56A4, 0x3CC8,
+ 0x56A5, 0x56A5, 0x1576, 0x56A6, 0x56A7, 0x3081, 0x56A8, 0x56A8, 0x1577,
+ 0x56AA, 0x56AA, 0x3083, 0x56AB, 0x56AB, 0x307F, 0x56AC, 0x56AC, 0x3084,
+ 0x56AD, 0x56AD, 0x3080, 0x56AE, 0x56AE, 0x14CB, 0x56AF, 0x56AF, 0x45F7,
+ 0x56B1, 0x56B1, 0x463F, 0x56B2, 0x56B2, 0x31C8, 0x56B3, 0x56B3, 0x31CA,
+ 0x56B4, 0x56B4, 0x160C, 0x56B5, 0x56B5, 0x31C9, 0x56B6, 0x56B6, 0x160B,
+ 0x56B7, 0x56B7, 0x160A, 0x56B9, 0x56B9, 0x486F, 0x56BC, 0x56BC, 0x160D,
+ 0x56BD, 0x56BE, 0x32CA, 0x56BF, 0x56BF, 0x3E5D, 0x56C0, 0x56C0, 0x166B,
+ 0x56C1, 0x56C1, 0x166A, 0x56C2, 0x56C2, 0x166C, 0x56C3, 0x56C3, 0x32C9,
+ 0x56C5, 0x56C5, 0x3379, 0x56C6, 0x56C6, 0x3378, 0x56C8, 0x56C8, 0x16BD,
+ 0x56C9, 0x56C9, 0x16BF, 0x56CA, 0x56CA, 0x16BE, 0x56CB, 0x56CB, 0x337A,
+ 0x56CC, 0x56CC, 0x16F6, 0x56CD, 0x56CD, 0x3481, 0x56D1, 0x56D1, 0x171F,
+ 0x56D3, 0x56D3, 0x3480, 0x56D4, 0x56D4, 0x34C9, 0x56D6, 0x56D6, 0x488A,
+ 0x56D7, 0x56D7, 0x1775, 0x56DA, 0x56DA, 0x032D, 0x56DB, 0x56DB, 0x032C,
+ 0x56DD, 0x56DD, 0x03AC, 0x56DE, 0x56DE, 0x03AB, 0x56DF, 0x56DF, 0x17D0,
+ 0x56E0, 0x56E0, 0x03AA, 0x56E1, 0x56E1, 0x17CF, 0x56E2, 0x56E2, 0x4548,
+ 0x56E4, 0x56E4, 0x0463, 0x56E5, 0x56E5, 0x1850, 0x56E7, 0x56E7, 0x184F,
+ 0x56EA, 0x56EA, 0x0461, 0x56EB, 0x56EB, 0x0464, 0x56ED, 0x56ED, 0x40C4,
+ 0x56EE, 0x56EE, 0x184E, 0x56EF, 0x56EF, 0x40C3, 0x56F0, 0x56F0, 0x0462,
+ 0x56F1, 0x56F1, 0x40BF, 0x56F7, 0x56F7, 0x1933, 0x56F9, 0x56F9, 0x1934,
+ 0x56FA, 0x56FA, 0x0578, 0x56FD, 0x56FD, 0x3D64, 0x56FF, 0x56FF, 0x06E6,
+ 0x5700, 0x5700, 0x40C2, 0x5701, 0x5702, 0x1C5B, 0x5703, 0x5704, 0x0879,
+ 0x5707, 0x5707, 0x1E74, 0x5708, 0x5708, 0x0A36, 0x5709, 0x5709, 0x0A38,
+ 0x570A, 0x570A, 0x1E73, 0x570B, 0x570B, 0x0A37, 0x570C, 0x570C, 0x20D9,
+ 0x570D, 0x570D, 0x0C16, 0x5712, 0x5713, 0x0DE4, 0x5714, 0x5714, 0x2391,
+ 0x5715, 0x5715, 0x3E36, 0x5716, 0x5716, 0x0FA1, 0x5718, 0x5718, 0x0FA0,
+ 0x571A, 0x571A, 0x289F, 0x571B, 0x571B, 0x2B13, 0x571C, 0x571C, 0x2B12,
+ 0x571D, 0x571D, 0x3A02, 0x571E, 0x571E, 0x3505, 0x571F, 0x571F, 0x027A,
+ 0x5720, 0x5720, 0x1784, 0x5722, 0x5723, 0x179A, 0x5728, 0x5728, 0x03AF,
+ 0x5729, 0x5729, 0x03B3, 0x572A, 0x572A, 0x17D2, 0x572C, 0x572C, 0x03B1,
+ 0x572D, 0x572D, 0x03B0, 0x572E, 0x572E, 0x17D1, 0x572F, 0x572F, 0x03B2,
+ 0x5730, 0x5730, 0x03AE, 0x5732, 0x5732, 0x3AF9, 0x5733, 0x5733, 0x03AD,
+ 0x5734, 0x5734, 0x17D3, 0x573B, 0x573B, 0x046E, 0x573E, 0x573E, 0x046B,
+ 0x573F, 0x573F, 0x4855, 0x5740, 0x5740, 0x0467, 0x5741, 0x5741, 0x1851,
+ 0x5742, 0x5742, 0x40CC, 0x5743, 0x5743, 0x40DE, 0x5745, 0x5745, 0x1852,
+ 0x5746, 0x5746, 0x40C8, 0x5747, 0x5747, 0x0469, 0x5749, 0x5749, 0x1854,
+ 0x574A, 0x574A, 0x0465, 0x574B, 0x574B, 0x1855, 0x574C, 0x574C, 0x1853,
+ 0x574D, 0x574D, 0x0468, 0x574E, 0x574E, 0x046A, 0x574F, 0x574F, 0x046D,
+ 0x5750, 0x5750, 0x046C, 0x5751, 0x5751, 0x0466, 0x5752, 0x5752, 0x1856,
+ 0x5754, 0x5754, 0x4785, 0x5757, 0x5757, 0x47E6, 0x575B, 0x575B, 0x3982,
+ 0x575F, 0x575F, 0x3FBF, 0x5761, 0x5761, 0x057D, 0x5762, 0x5762, 0x1941,
+ 0x5764, 0x5764, 0x057F, 0x5766, 0x5766, 0x057E, 0x5767, 0x5767, 0x3F2B,
+ 0x5768, 0x5768, 0x1942, 0x5769, 0x5769, 0x057C, 0x576A, 0x576A, 0x057B,
+ 0x576B, 0x576B, 0x1938, 0x576D, 0x576D, 0x1937, 0x576F, 0x576F, 0x1935,
+ 0x5770, 0x5770, 0x193A, 0x5771, 0x5771, 0x1939, 0x5772, 0x5772, 0x1936,
+ 0x5773, 0x5774, 0x193F, 0x5775, 0x5775, 0x193D, 0x5776, 0x5776, 0x193B,
+ 0x5777, 0x5777, 0x057A, 0x577A, 0x577A, 0x3F5F, 0x577B, 0x577B, 0x193E,
+ 0x577C, 0x577C, 0x0580, 0x577D, 0x577D, 0x1943, 0x577E, 0x577E, 0x46DC,
+ 0x577F, 0x577F, 0x3A07, 0x5780, 0x5780, 0x193C, 0x5782, 0x5782, 0x06E7,
+ 0x5783, 0x5783, 0x0579, 0x5788, 0x5788, 0x484B, 0x578A, 0x578A, 0x3C7B,
+ 0x578B, 0x578B, 0x06E8, 0x578C, 0x578C, 0x1A90, 0x578D, 0x578D, 0x3A06,
+ 0x578F, 0x578F, 0x1A96, 0x5790, 0x5790, 0x4166, 0x5793, 0x5793, 0x06EE,
+ 0x5794, 0x5794, 0x1A94, 0x5795, 0x5795, 0x1A9A, 0x5797, 0x5797, 0x1A91,
+ 0x5798, 0x5798, 0x1A95, 0x5799, 0x5799, 0x1A97, 0x579A, 0x579A, 0x1A99,
+ 0x579B, 0x579B, 0x1A93, 0x579C, 0x579C, 0x4608, 0x579D, 0x579D, 0x1A92,
+ 0x579E, 0x579F, 0x1A8D, 0x57A0, 0x57A0, 0x06E9, 0x57A1, 0x57A1, 0x4864,
+ 0x57A2, 0x57A2, 0x06EB, 0x57A3, 0x57A3, 0x06EA, 0x57A4, 0x57A4, 0x1A8F,
+ 0x57A5, 0x57A5, 0x1A98, 0x57A7, 0x57A7, 0x4914, 0x57AA, 0x57AA, 0x4905,
+ 0x57AE, 0x57AE, 0x06ED, 0x57B4, 0x57B4, 0x4741, 0x57B5, 0x57B5, 0x1A8C,
+ 0x57B6, 0x57B6, 0x1C66, 0x57B8, 0x57B8, 0x1C65, 0x57B9, 0x57B9, 0x1C6A,
+ 0x57BA, 0x57BA, 0x1C61, 0x57BB, 0x57BB, 0x3C79, 0x57BC, 0x57BC, 0x1C64,
+ 0x57BD, 0x57BD, 0x1C63, 0x57BE, 0x57BE, 0x372C, 0x57BF, 0x57BF, 0x1C67,
+ 0x57C1, 0x57C1, 0x1C6B, 0x57C2, 0x57C2, 0x087B, 0x57C3, 0x57C3, 0x087E,
+ 0x57C4, 0x57C4, 0x3B5B, 0x57C6, 0x57C6, 0x1C62, 0x57C7, 0x57C7, 0x1C68,
+ 0x57C8, 0x57C8, 0x3D0B, 0x57CB, 0x57CB, 0x087D, 0x57CC, 0x57CC, 0x1C5D,
+ 0x57CE, 0x57CE, 0x06EC, 0x57CF, 0x57CF, 0x1E82, 0x57D0, 0x57D0, 0x1C69,
+ 0x57D2, 0x57D2, 0x1C60, 0x57D4, 0x57D4, 0x087C, 0x57D5, 0x57D5, 0x1C5F,
+ 0x57D7, 0x57D7, 0x3C7D, 0x57DC, 0x57DC, 0x1E79, 0x57DD, 0x57DD, 0x3A05,
+ 0x57DE, 0x57DE, 0x3F01, 0x57DF, 0x57DF, 0x0A39, 0x57E0, 0x57E0, 0x0A3D,
+ 0x57E1, 0x57E1, 0x1E89, 0x57E2, 0x57E2, 0x1E77, 0x57E3, 0x57E3, 0x1E85,
+ 0x57E4, 0x57E4, 0x0A3E, 0x57E5, 0x57E5, 0x1E87, 0x57E6, 0x57E6, 0x40CF,
+ 0x57E7, 0x57E7, 0x1E8D, 0x57E9, 0x57E9, 0x1E91, 0x57EC, 0x57EC, 0x1E88,
+ 0x57ED, 0x57ED, 0x1E7C, 0x57EE, 0x57EE, 0x1E84, 0x57EF, 0x57EF, 0x4754,
+ 0x57F0, 0x57F0, 0x1E92, 0x57F1, 0x57F1, 0x1E90, 0x57F2, 0x57F2, 0x1E86,
+ 0x57F3, 0x57F3, 0x1E81, 0x57F4, 0x57F4, 0x1E7A, 0x57F5, 0x57F5, 0x20E1,
+ 0x57F6, 0x57F6, 0x1E78, 0x57F7, 0x57F7, 0x0A42, 0x57F8, 0x57F8, 0x1E7F,
+ 0x57F9, 0x57F9, 0x0A43, 0x57FA, 0x57FA, 0x0A3F, 0x57FB, 0x57FB, 0x1E75,
+ 0x57FC, 0x57FC, 0x1E8B, 0x57FD, 0x57FD, 0x1E7D, 0x57FE, 0x57FE, 0x408F,
+ 0x5800, 0x5800, 0x1E7B, 0x5801, 0x5801, 0x1E8E, 0x5802, 0x5802, 0x0A40,
+ 0x5803, 0x5803, 0x40D1, 0x5804, 0x5804, 0x1E94, 0x5805, 0x5805, 0x0A3A,
+ 0x5806, 0x5806, 0x0A3C, 0x5807, 0x5807, 0x1E83, 0x5808, 0x5808, 0x1E7E,
+ 0x5809, 0x5809, 0x087F, 0x580A, 0x580A, 0x0A3B, 0x580B, 0x580B, 0x1E80,
+ 0x580C, 0x580C, 0x1E8F, 0x580D, 0x580D, 0x1E93, 0x580E, 0x580E, 0x1E8A,
+ 0x5810, 0x5810, 0x1E8C, 0x5812, 0x5812, 0x3D0A, 0x5814, 0x5814, 0x1E76,
+ 0x5819, 0x5819, 0x20DC, 0x581B, 0x581B, 0x20E5, 0x581C, 0x581C, 0x20E4,
+ 0x581D, 0x581D, 0x0C1E, 0x581E, 0x581E, 0x20DD, 0x5820, 0x5820, 0x0C1F,
+ 0x5821, 0x5821, 0x0C1D, 0x5822, 0x5822, 0x3C28, 0x5823, 0x5823, 0x20DF,
+ 0x5824, 0x5824, 0x0C1A, 0x5825, 0x5825, 0x20E3, 0x5826, 0x5826, 0x40D4,
+ 0x5827, 0x5827, 0x20DE, 0x5828, 0x5828, 0x20E0, 0x5829, 0x5829, 0x20DA,
+ 0x582A, 0x582A, 0x0C18, 0x582C, 0x582C, 0x20ED, 0x582D, 0x582D, 0x20EC,
+ 0x582E, 0x582E, 0x20E9, 0x582F, 0x582F, 0x0C17, 0x5830, 0x5831, 0x0C1B,
+ 0x5832, 0x5832, 0x1C5E, 0x5833, 0x5833, 0x20E6, 0x5834, 0x5834, 0x0C19,
+ 0x5835, 0x5835, 0x0A41, 0x5836, 0x5836, 0x20E8, 0x5837, 0x5837, 0x20DB,
+ 0x5838, 0x5838, 0x20EB, 0x5839, 0x5839, 0x20EA, 0x583A, 0x583A, 0x3D72,
+ 0x583B, 0x583B, 0x20EE, 0x583D, 0x583D, 0x239F, 0x583F, 0x583F, 0x20E7,
+ 0x5840, 0x5840, 0x3D82, 0x5844, 0x5844, 0x47BB, 0x5847, 0x5847, 0x3AC2,
+ 0x5848, 0x5848, 0x20E2, 0x5849, 0x5849, 0x2397, 0x584A, 0x584A, 0x0DEF,
+ 0x584B, 0x584B, 0x0DF2, 0x584C, 0x584C, 0x0DED, 0x584D, 0x584D, 0x2396,
+ 0x584E, 0x584E, 0x239A, 0x584F, 0x584F, 0x2395, 0x5851, 0x5851, 0x0DE7,
+ 0x5852, 0x5852, 0x0DF1, 0x5853, 0x5853, 0x2392, 0x5854, 0x5854, 0x0DEB,
+ 0x5855, 0x5855, 0x2399, 0x5857, 0x5857, 0x0DE9, 0x5858, 0x5858, 0x0DE8,
+ 0x5859, 0x5859, 0x239C, 0x585A, 0x585A, 0x0DEA, 0x585B, 0x585B, 0x239E,
+ 0x585C, 0x585C, 0x4949, 0x585D, 0x585D, 0x239B, 0x585E, 0x585E, 0x0DE6,
+ 0x585F, 0x585F, 0x43DF, 0x5862, 0x5862, 0x0DF0, 0x5863, 0x5863, 0x23A0,
+ 0x5864, 0x5864, 0x2394, 0x5865, 0x5865, 0x239D, 0x5868, 0x5868, 0x2393,
+ 0x5869, 0x5869, 0x3D65, 0x586B, 0x586B, 0x0DEC, 0x586C, 0x586C, 0x399A,
+ 0x586D, 0x586D, 0x0DEE, 0x586F, 0x586F, 0x2398, 0x5871, 0x5871, 0x23A1,
+ 0x5872, 0x5872, 0x3C26, 0x5873, 0x5873, 0x4355, 0x5874, 0x5874, 0x263F,
+ 0x5875, 0x5875, 0x0FA2, 0x5876, 0x5876, 0x2645, 0x5879, 0x5879, 0x0FA7,
+ 0x587A, 0x587A, 0x2641, 0x587B, 0x587B, 0x2648, 0x587C, 0x587C, 0x2639,
+ 0x587D, 0x587D, 0x0FA9, 0x587E, 0x587E, 0x0FA3, 0x587F, 0x587F, 0x263E,
+ 0x5880, 0x5880, 0x1121, 0x5881, 0x5881, 0x263D, 0x5882, 0x5882, 0x2646,
+ 0x5883, 0x5883, 0x0FA4, 0x5885, 0x5885, 0x0FA8, 0x5886, 0x5886, 0x263C,
+ 0x5887, 0x5887, 0x2642, 0x5888, 0x5888, 0x2647, 0x5889, 0x5889, 0x2638,
+ 0x588A, 0x588A, 0x0FA6, 0x588B, 0x588B, 0x2640, 0x588E, 0x588E, 0x2644,
+ 0x588F, 0x588F, 0x264A, 0x5890, 0x5890, 0x263A, 0x5891, 0x5891, 0x2643,
+ 0x5893, 0x5893, 0x0FA5, 0x5894, 0x5894, 0x2649, 0x5898, 0x5898, 0x263B,
+ 0x5899, 0x5899, 0x4618, 0x589A, 0x589A, 0x4903, 0x589C, 0x589C, 0x1125,
+ 0x589D, 0x589D, 0x28A1, 0x589E, 0x589E, 0x1123, 0x589F, 0x589F, 0x1122,
+ 0x58A0, 0x58A0, 0x28A3, 0x58A1, 0x58A1, 0x28A8, 0x58A3, 0x58A3, 0x28A4,
+ 0x58A5, 0x58A5, 0x28A7, 0x58A6, 0x58A6, 0x1128, 0x58A7, 0x58A7, 0x3EEB,
+ 0x58A8, 0x58A8, 0x1288, 0x58A9, 0x58A9, 0x1127, 0x58AA, 0x58AA, 0x40D7,
+ 0x58AB, 0x58AB, 0x28A0, 0x58AC, 0x58AC, 0x28A6, 0x58AE, 0x58AE, 0x1126,
+ 0x58AF, 0x58AF, 0x28A5, 0x58B0, 0x58B0, 0x37A4, 0x58B1, 0x58B1, 0x28A2,
+ 0x58B3, 0x58B3, 0x1124, 0x58B5, 0x58B5, 0x4840, 0x58B6, 0x58B6, 0x3DFD,
+ 0x58BA, 0x58BA, 0x2B18, 0x58BB, 0x58BB, 0x36EB, 0x58BC, 0x58BC, 0x2B1A,
+ 0x58BD, 0x58BD, 0x2B15, 0x58BE, 0x58BE, 0x12A4, 0x58BF, 0x58BF, 0x2B17,
+ 0x58C1, 0x58C1, 0x12A3, 0x58C2, 0x58C2, 0x2B19, 0x58C5, 0x58C5, 0x12A6,
+ 0x58C6, 0x58C6, 0x2B1B, 0x58C7, 0x58C7, 0x12A5, 0x58C8, 0x58C8, 0x2B14,
+ 0x58C9, 0x58C9, 0x2B16, 0x58CB, 0x58CB, 0x3A09, 0x58CE, 0x58CE, 0x13C2,
+ 0x58CF, 0x58CF, 0x2D4D, 0x58D1, 0x58D1, 0x13C1, 0x58D2, 0x58D2, 0x2D4E,
+ 0x58D3, 0x58D3, 0x13C0, 0x58D4, 0x58D4, 0x2D4C, 0x58D5, 0x58D5, 0x13BF,
+ 0x58D6, 0x58D6, 0x2D4B, 0x58D8, 0x58D8, 0x14CD, 0x58D9, 0x58D9, 0x14CC,
+ 0x58DA, 0x58DA, 0x3085, 0x58DB, 0x58DB, 0x3087, 0x58DC, 0x58DC, 0x40DA,
+ 0x58DD, 0x58DD, 0x3086, 0x58DE, 0x58DF, 0x1578, 0x58E0, 0x58E0, 0x40D9,
+ 0x58E2, 0x58E2, 0x157A, 0x58E3, 0x58E3, 0x31CB, 0x58E4, 0x58E4, 0x160E,
+ 0x58E7, 0x58E7, 0x3411, 0x58E8, 0x58E8, 0x3410, 0x58E9, 0x58E9, 0x1720,
+ 0x58EB, 0x58EB, 0x027B, 0x58EC, 0x58EC, 0x02C1, 0x58EF, 0x58EF, 0x046F,
+ 0x58F0, 0x58F0, 0x4549, 0x58F2, 0x58F2, 0x3D68, 0x58F3, 0x58F3, 0x3C7A,
+ 0x58F4, 0x58F4, 0x1A9B, 0x58F9, 0x58FA, 0x0C20, 0x58FB, 0x58FB, 0x40DC,
+ 0x58FC, 0x58FC, 0x23A2, 0x58FD, 0x58FD, 0x0FAA, 0x58FE, 0x58FE, 0x264B,
+ 0x58FF, 0x58FF, 0x28A9, 0x5902, 0x5902, 0x0224, 0x5903, 0x5903, 0x1785,
+ 0x5904, 0x5904, 0x454A, 0x5905, 0x5905, 0x4599, 0x5906, 0x5906, 0x1857,
+ 0x5907, 0x5907, 0x454B, 0x590A, 0x590A, 0x0224, 0x590C, 0x590C, 0x1944,
+ 0x590D, 0x590D, 0x1A9C, 0x590E, 0x590E, 0x1C6C, 0x590F, 0x590F, 0x0880,
+ 0x5911, 0x5911, 0x4274, 0x5912, 0x5912, 0x3088, 0x5914, 0x5914, 0x166D,
+ 0x5915, 0x5915, 0x027C, 0x5916, 0x5916, 0x032E, 0x5917, 0x5917, 0x179C,
+ 0x5919, 0x591A, 0x03B4, 0x591C, 0x591C, 0x0581, 0x591F, 0x591F, 0x40E3,
+ 0x5920, 0x5920, 0x0A44, 0x5922, 0x5922, 0x0FAC, 0x5924, 0x5924, 0x0FAD,
+ 0x5925, 0x5925, 0x0FAB, 0x5927, 0x5927, 0x027D, 0x5929, 0x5929, 0x02C2,
+ 0x592A, 0x592A, 0x02C4, 0x592B, 0x592B, 0x02C3, 0x592C, 0x592C, 0x1786,
+ 0x592D, 0x592D, 0x02C5, 0x592E, 0x592E, 0x032F, 0x592F, 0x592F, 0x179D,
+ 0x5931, 0x5931, 0x0330, 0x5932, 0x5932, 0x454C, 0x5934, 0x5934, 0x454D,
+ 0x5937, 0x5938, 0x03B6, 0x593C, 0x593C, 0x17D4, 0x593E, 0x593E, 0x0470,
+ 0x5940, 0x5940, 0x1858, 0x5944, 0x5944, 0x0585, 0x5945, 0x5945, 0x1945,
+ 0x5947, 0x5948, 0x0583, 0x5949, 0x5949, 0x0582, 0x594A, 0x594A, 0x1C6D,
+ 0x594E, 0x594E, 0x06F2, 0x594F, 0x594F, 0x06F1, 0x5950, 0x5950, 0x06F3,
+ 0x5951, 0x5951, 0x06F0, 0x5953, 0x5953, 0x1A9D, 0x5954, 0x5954, 0x0586,
+ 0x5955, 0x5955, 0x06EF, 0x5957, 0x5958, 0x0881, 0x595A, 0x595A, 0x0883,
+ 0x595C, 0x595C, 0x1E95, 0x5960, 0x5960, 0x0C22, 0x5961, 0x5961, 0x20EF,
+ 0x5962, 0x5962, 0x0A45, 0x5965, 0x5965, 0x4852, 0x5967, 0x5967, 0x0DF3,
+ 0x5969, 0x5969, 0x0FAF, 0x596A, 0x596A, 0x0FAE, 0x596B, 0x596B, 0x264C,
+ 0x596D, 0x596D, 0x1129, 0x596E, 0x596E, 0x12A7, 0x5970, 0x5970, 0x2F17,
+ 0x5971, 0x5971, 0x337B, 0x5972, 0x5972, 0x3412, 0x5973, 0x5973, 0x027E,
+ 0x5974, 0x5974, 0x0331, 0x5975, 0x5975, 0x3E6A, 0x5976, 0x5976, 0x0332,
+ 0x5977, 0x5977, 0x17DA, 0x5978, 0x5978, 0x03B9, 0x5979, 0x5979, 0x03BC,
+ 0x597B, 0x597B, 0x17D8, 0x597C, 0x597C, 0x17D6, 0x597D, 0x597D, 0x03BB,
+ 0x597E, 0x597E, 0x17D9, 0x597F, 0x597F, 0x17DB, 0x5980, 0x5980, 0x17D5,
+ 0x5981, 0x5981, 0x03BE, 0x5982, 0x5982, 0x03BD, 0x5983, 0x5983, 0x03BA,
+ 0x5984, 0x5984, 0x03B8, 0x5985, 0x5985, 0x17D7, 0x5989, 0x5989, 0x3D30,
+ 0x598A, 0x598A, 0x047B, 0x598D, 0x598D, 0x0478, 0x598E, 0x598E, 0x185D,
+ 0x598F, 0x598F, 0x1860, 0x5990, 0x5990, 0x185F, 0x5992, 0x5992, 0x0472,
+ 0x5993, 0x5993, 0x047A, 0x5994, 0x5994, 0x3C99, 0x5996, 0x5996, 0x0477,
+ 0x5997, 0x5997, 0x185C, 0x5998, 0x5998, 0x185A, 0x5999, 0x5999, 0x0476,
+ 0x599A, 0x599A, 0x3BB0, 0x599D, 0x599D, 0x0471, 0x599E, 0x599E, 0x0474,
+ 0x599F, 0x599F, 0x3DAF, 0x59A0, 0x59A0, 0x185B, 0x59A1, 0x59A1, 0x1862,
+ 0x59A2, 0x59A2, 0x185E, 0x59A3, 0x59A3, 0x0475, 0x59A4, 0x59A4, 0x0479,
+ 0x59A5, 0x59A5, 0x047C, 0x59A6, 0x59A6, 0x1859, 0x59A7, 0x59A7, 0x1861,
+ 0x59A8, 0x59A8, 0x0473, 0x59AC, 0x59AC, 0x3D81, 0x59AE, 0x59AE, 0x058B,
+ 0x59AF, 0x59AF, 0x0593, 0x59B0, 0x59B0, 0x3CD8, 0x59B1, 0x59B1, 0x1951,
+ 0x59B2, 0x59B2, 0x194A, 0x59B3, 0x59B3, 0x0594, 0x59B4, 0x59B4, 0x1955,
+ 0x59B5, 0x59B5, 0x1946, 0x59B6, 0x59B6, 0x194D, 0x59B7, 0x59B7, 0x3F2D,
+ 0x59B8, 0x59B8, 0x3A10, 0x59B9, 0x59B9, 0x058A, 0x59BA, 0x59BA, 0x1947,
+ 0x59BB, 0x59BB, 0x0588, 0x59BC, 0x59BC, 0x194E, 0x59BD, 0x59BD, 0x1952,
+ 0x59BE, 0x59BE, 0x0587, 0x59C0, 0x59C0, 0x1953, 0x59C1, 0x59C1, 0x194C,
+ 0x59C3, 0x59C3, 0x194F, 0x59C4, 0x59C4, 0x3D04, 0x59C5, 0x59C5, 0x0596,
+ 0x59C6, 0x59C6, 0x058D, 0x59C7, 0x59C7, 0x1956, 0x59C8, 0x59C8, 0x1954,
+ 0x59C9, 0x59C9, 0x40EC, 0x59CA, 0x59CA, 0x0592, 0x59CB, 0x59CB, 0x0590,
+ 0x59CC, 0x59CC, 0x194B, 0x59CD, 0x59CD, 0x058F, 0x59CE, 0x59CE, 0x1949,
+ 0x59CF, 0x59CF, 0x1948, 0x59D0, 0x59D0, 0x058E, 0x59D1, 0x59D1, 0x058C,
+ 0x59D2, 0x59D2, 0x0595, 0x59D3, 0x59D3, 0x0591, 0x59D4, 0x59D4, 0x0589,
+ 0x59D6, 0x59D6, 0x1950, 0x59D8, 0x59D8, 0x06F5, 0x59D9, 0x59D9, 0x40F1,
+ 0x59DA, 0x59DA, 0x06FC, 0x59DB, 0x59DB, 0x1AAB, 0x59DC, 0x59DC, 0x06F4,
+ 0x59DD, 0x59DD, 0x1AA3, 0x59DE, 0x59DE, 0x1A9F, 0x59E0, 0x59E0, 0x1AAF,
+ 0x59E1, 0x59E1, 0x1A9E, 0x59E3, 0x59E3, 0x06F7, 0x59E4, 0x59E4, 0x1AA8,
+ 0x59E5, 0x59E5, 0x06FA, 0x59E6, 0x59E6, 0x06FD, 0x59E8, 0x59E8, 0x06F8,
+ 0x59E9, 0x59E9, 0x1AAC, 0x59EA, 0x59EA, 0x06FB, 0x59EB, 0x59EB, 0x3D59,
+ 0x59EC, 0x59EC, 0x088A, 0x59ED, 0x59ED, 0x1AB2, 0x59EE, 0x59EE, 0x1AA0,
+ 0x59EF, 0x59EF, 0x3D38, 0x59F0, 0x59F0, 0x3BB2, 0x59F1, 0x59F1, 0x1AA2,
+ 0x59F2, 0x59F2, 0x1AA9, 0x59F3, 0x59F3, 0x1AAD, 0x59F4, 0x59F4, 0x1AB1,
+ 0x59F5, 0x59F5, 0x1AAE, 0x59F6, 0x59F6, 0x1AA7, 0x59F7, 0x59F7, 0x1AAA,
+ 0x59F8, 0x59F8, 0x3E4A, 0x59F9, 0x59F9, 0x40F8, 0x59FA, 0x59FA, 0x1AA4,
+ 0x59FB, 0x59FB, 0x06FF, 0x59FC, 0x59FC, 0x1AA6, 0x59FD, 0x59FD, 0x1AA5,
+ 0x59FE, 0x59FE, 0x1AB0, 0x59FF, 0x59FF, 0x06F6, 0x5A00, 0x5A00, 0x1AA1,
+ 0x5A01, 0x5A01, 0x06FE, 0x5A02, 0x5A02, 0x3B8D, 0x5A03, 0x5A03, 0x06F9,
+ 0x5A09, 0x5A09, 0x0890, 0x5A0A, 0x5A0A, 0x1C75, 0x5A0B, 0x5A0B, 0x3C89,
+ 0x5A0C, 0x5A0C, 0x088F, 0x5A0D, 0x5A0D, 0x3B38, 0x5A0F, 0x5A0F, 0x1C73,
+ 0x5A11, 0x5A11, 0x0884, 0x5A12, 0x5A12, 0x3A13, 0x5A13, 0x5A13, 0x0889,
+ 0x5A15, 0x5A15, 0x1C72, 0x5A16, 0x5A16, 0x1C6F, 0x5A17, 0x5A17, 0x1C74,
+ 0x5A18, 0x5A18, 0x0885, 0x5A19, 0x5A19, 0x1C6E, 0x5A1B, 0x5A1B, 0x0888,
+ 0x5A1C, 0x5A1C, 0x0886, 0x5A1E, 0x5A1E, 0x1C76, 0x5A1F, 0x5A1F, 0x0887,
+ 0x5A20, 0x5A20, 0x088B, 0x5A21, 0x5A21, 0x3A1B, 0x5A23, 0x5A23, 0x088C,
+ 0x5A24, 0x5A24, 0x40E8, 0x5A25, 0x5A25, 0x088E, 0x5A27, 0x5A27, 0x3DE1,
+ 0x5A29, 0x5A29, 0x088D, 0x5A2A, 0x5A2A, 0x3B3B, 0x5A2B, 0x5A2B, 0x3D40,
+ 0x5A2C, 0x5A2C, 0x3A0F, 0x5A2D, 0x5A2E, 0x1C70, 0x5A33, 0x5A33, 0x1C77,
+ 0x5A35, 0x5A35, 0x1E9C, 0x5A36, 0x5A36, 0x0A46, 0x5A37, 0x5A37, 0x20FD,
+ 0x5A38, 0x5A38, 0x1E9B, 0x5A39, 0x5A39, 0x1EAE, 0x5A3C, 0x5A3C, 0x0A4C,
+ 0x5A3D, 0x5A3D, 0x3AC0, 0x5A3E, 0x5A3E, 0x1EAC, 0x5A40, 0x5A40, 0x0A4B,
+ 0x5A41, 0x5A41, 0x0A47, 0x5A42, 0x5A42, 0x1EB5, 0x5A43, 0x5A43, 0x1EA5,
+ 0x5A44, 0x5A44, 0x1EA8, 0x5A45, 0x5A45, 0x3917, 0x5A46, 0x5A46, 0x0A4F,
+ 0x5A47, 0x5A47, 0x1EB2, 0x5A48, 0x5A48, 0x1EAA, 0x5A49, 0x5A49, 0x0A48,
+ 0x5A4A, 0x5A4A, 0x0A50, 0x5A4C, 0x5A4C, 0x1EAF, 0x5A4D, 0x5A4D, 0x1EAD,
+ 0x5A50, 0x5A50, 0x1E9E, 0x5A51, 0x5A51, 0x1EB3, 0x5A52, 0x5A52, 0x1EA7,
+ 0x5A53, 0x5A53, 0x1EA2, 0x5A54, 0x5A54, 0x4603, 0x5A55, 0x5A55, 0x1E98,
+ 0x5A56, 0x5A56, 0x1EB4, 0x5A57, 0x5A57, 0x1EA4, 0x5A58, 0x5A58, 0x1E97,
+ 0x5A59, 0x5A59, 0x3B34, 0x5A5A, 0x5A5A, 0x0A4E, 0x5A5B, 0x5A5B, 0x1EA9,
+ 0x5A5C, 0x5A5C, 0x1EB6, 0x5A5D, 0x5A5D, 0x1EA6, 0x5A5E, 0x5A5E, 0x1E9A,
+ 0x5A5F, 0x5A5F, 0x1E9F, 0x5A60, 0x5A60, 0x1E96, 0x5A61, 0x5A61, 0x3D33,
+ 0x5A62, 0x5A62, 0x0A4D, 0x5A63, 0x5A63, 0x40FB, 0x5A64, 0x5A64, 0x1EA3,
+ 0x5A65, 0x5A65, 0x1EA0, 0x5A66, 0x5A66, 0x0A49, 0x5A67, 0x5A67, 0x1E99,
+ 0x5A68, 0x5A68, 0x39B7, 0x5A69, 0x5A69, 0x1EB1, 0x5A6A, 0x5A6A, 0x0A4A,
+ 0x5A6B, 0x5A6B, 0x3A42, 0x5A6C, 0x5A6C, 0x1EA1, 0x5A6D, 0x5A6D, 0x1E9D,
+ 0x5A6E, 0x5A6E, 0x3D3F, 0x5A70, 0x5A70, 0x1EB0, 0x5A71, 0x5A71, 0x3D34,
+ 0x5A77, 0x5A77, 0x0C23, 0x5A78, 0x5A78, 0x20F6, 0x5A79, 0x5A79, 0x3CE1,
+ 0x5A7A, 0x5A7A, 0x20F3, 0x5A7B, 0x5A7B, 0x2104, 0x5A7C, 0x5A7C, 0x20F8,
+ 0x5A7D, 0x5A7D, 0x2105, 0x5A7E, 0x5A7E, 0x3A11, 0x5A7F, 0x5A7F, 0x0C25,
+ 0x5A81, 0x5A81, 0x3A1D, 0x5A82, 0x5A82, 0x3D31, 0x5A83, 0x5A83, 0x2101,
+ 0x5A84, 0x5A84, 0x20FE, 0x5A86, 0x5A86, 0x3B81, 0x5A88, 0x5A88, 0x4263,
+ 0x5A8A, 0x5A8A, 0x20FF, 0x5A8B, 0x5A8B, 0x2102, 0x5A8C, 0x5A8C, 0x2106,
+ 0x5A8E, 0x5A8E, 0x1EAB, 0x5A8F, 0x5A8F, 0x2108, 0x5A90, 0x5A90, 0x23B6,
+ 0x5A91, 0x5A91, 0x4235, 0x5A92, 0x5A92, 0x0C26, 0x5A93, 0x5A93, 0x2109,
+ 0x5A94, 0x5A94, 0x20F1, 0x5A95, 0x5A95, 0x20FB, 0x5A96, 0x5A96, 0x4100,
+ 0x5A97, 0x5A97, 0x2100, 0x5A99, 0x5A99, 0x3A0A, 0x5A9A, 0x5A9A, 0x0C24,
+ 0x5A9B, 0x5A9B, 0x0C27, 0x5A9C, 0x5A9C, 0x2107, 0x5A9D, 0x5A9D, 0x210A,
+ 0x5A9E, 0x5A9E, 0x20F5, 0x5A9F, 0x5A9F, 0x20F2, 0x5AA0, 0x5AA0, 0x4172,
+ 0x5AA1, 0x5AA1, 0x3CDC, 0x5AA2, 0x5AA2, 0x20F4, 0x5AA5, 0x5AA5, 0x20F9,
+ 0x5AA6, 0x5AA6, 0x20F7, 0x5AA7, 0x5AA7, 0x0C28, 0x5AA9, 0x5AA9, 0x2103,
+ 0x5AAB, 0x5AAB, 0x40FA, 0x5AAC, 0x5AAC, 0x20FA, 0x5AAE, 0x5AAE, 0x20FC,
+ 0x5AAF, 0x5AAF, 0x20F0, 0x5AB0, 0x5AB0, 0x23AA, 0x5AB1, 0x5AB1, 0x23A8,
+ 0x5AB2, 0x5AB2, 0x0DFC, 0x5AB3, 0x5AB3, 0x0DFA, 0x5AB4, 0x5AB4, 0x23B2,
+ 0x5AB5, 0x5AB5, 0x23A9, 0x5AB6, 0x5AB6, 0x23B3, 0x5AB7, 0x5AB7, 0x23AF,
+ 0x5AB8, 0x5AB8, 0x23A7, 0x5AB9, 0x5AB9, 0x23B5, 0x5ABA, 0x5ABA, 0x23A6,
+ 0x5ABB, 0x5ABB, 0x23AD, 0x5ABC, 0x5ABC, 0x0DF9, 0x5ABD, 0x5ABD, 0x0DF8,
+ 0x5ABE, 0x5ABE, 0x0DF7, 0x5ABF, 0x5ABF, 0x23AB, 0x5AC0, 0x5AC0, 0x23B0,
+ 0x5AC1, 0x5AC1, 0x0DF4, 0x5AC2, 0x5AC2, 0x0DFB, 0x5AC3, 0x5AC3, 0x3896,
+ 0x5AC4, 0x5AC4, 0x23A4, 0x5AC6, 0x5AC6, 0x23AE, 0x5AC7, 0x5AC7, 0x23A3,
+ 0x5AC8, 0x5AC8, 0x23AC, 0x5AC9, 0x5AC9, 0x0DF5, 0x5ACA, 0x5ACA, 0x23B1,
+ 0x5ACB, 0x5ACB, 0x23A5, 0x5ACC, 0x5ACC, 0x0DF6, 0x5ACD, 0x5ACD, 0x23B4,
+ 0x5ACE, 0x5ACE, 0x3C88, 0x5ACF, 0x5ACF, 0x43B5, 0x5AD3, 0x5AD3, 0x4102,
+ 0x5AD5, 0x5AD5, 0x2650, 0x5AD6, 0x5AD6, 0x0FB4, 0x5AD7, 0x5AD7, 0x0FB3,
+ 0x5AD8, 0x5AD8, 0x0FB5, 0x5AD9, 0x5AD9, 0x265C, 0x5ADA, 0x5ADA, 0x2652,
+ 0x5ADB, 0x5ADB, 0x2658, 0x5ADC, 0x5ADC, 0x264D, 0x5ADD, 0x5ADD, 0x265B,
+ 0x5ADE, 0x5ADE, 0x265A, 0x5ADF, 0x5ADF, 0x265E, 0x5AE0, 0x5AE0, 0x2657,
+ 0x5AE1, 0x5AE1, 0x0FB0, 0x5AE2, 0x5AE2, 0x2656, 0x5AE3, 0x5AE3, 0x0FB6,
+ 0x5AE4, 0x5AE4, 0x3B86, 0x5AE5, 0x5AE5, 0x264F, 0x5AE6, 0x5AE6, 0x0FB1,
+ 0x5AE8, 0x5AE8, 0x265D, 0x5AE9, 0x5AE9, 0x0FB2, 0x5AEA, 0x5AEA, 0x2651,
+ 0x5AEB, 0x5AEB, 0x2654, 0x5AEC, 0x5AEC, 0x2659, 0x5AED, 0x5AED, 0x2653,
+ 0x5AEE, 0x5AEE, 0x264E, 0x5AF0, 0x5AF0, 0x3EE7, 0x5AF2, 0x5AF2, 0x37F5,
+ 0x5AF3, 0x5AF3, 0x2655, 0x5AF4, 0x5AF4, 0x28AB, 0x5AF5, 0x5AF5, 0x112D,
+ 0x5AF6, 0x5AF6, 0x28AE, 0x5AF7, 0x5AF7, 0x28AD, 0x5AF8, 0x5AF8, 0x28B0,
+ 0x5AF9, 0x5AF9, 0x28B2, 0x5AFA, 0x5AFA, 0x36EE, 0x5AFB, 0x5AFB, 0x112B,
+ 0x5AFD, 0x5AFD, 0x28AC, 0x5AFE, 0x5AFE, 0x3C1D, 0x5AFF, 0x5AFF, 0x28AA,
+ 0x5B01, 0x5B01, 0x28B3, 0x5B02, 0x5B02, 0x28B1, 0x5B03, 0x5B03, 0x28AF,
+ 0x5B05, 0x5B05, 0x28B5, 0x5B07, 0x5B07, 0x28B4, 0x5B08, 0x5B08, 0x112F,
+ 0x5B09, 0x5B09, 0x112A, 0x5B0B, 0x5B0B, 0x112C, 0x5B0C, 0x5B0C, 0x112E,
+ 0x5B0D, 0x5B0D, 0x48FF, 0x5B0F, 0x5B0F, 0x28B6, 0x5B10, 0x5B10, 0x2B22,
+ 0x5B11, 0x5B11, 0x3BF6, 0x5B13, 0x5B13, 0x2B21, 0x5B14, 0x5B14, 0x2B20,
+ 0x5B16, 0x5B16, 0x2B23, 0x5B17, 0x5B17, 0x2B1C, 0x5B19, 0x5B19, 0x2B1D,
+ 0x5B1A, 0x5B1A, 0x2B25, 0x5B1B, 0x5B1B, 0x2B1E, 0x5B1D, 0x5B1D, 0x12A8,
+ 0x5B1E, 0x5B1E, 0x2B27, 0x5B1F, 0x5B1F, 0x4941, 0x5B20, 0x5B20, 0x2B26,
+ 0x5B21, 0x5B21, 0x2B1F, 0x5B23, 0x5B23, 0x2D52, 0x5B24, 0x5B24, 0x13C5,
+ 0x5B25, 0x5B25, 0x2D50, 0x5B26, 0x5B26, 0x2D55, 0x5B27, 0x5B27, 0x2D54,
+ 0x5B28, 0x5B28, 0x2B24, 0x5B2A, 0x5B2A, 0x13C4, 0x5B2B, 0x5B2B, 0x3B84,
+ 0x5B2C, 0x5B2C, 0x2D53, 0x5B2D, 0x5B2D, 0x2D4F, 0x5B2E, 0x5B2E, 0x2D57,
+ 0x5B2F, 0x5B2F, 0x2D56, 0x5B30, 0x5B30, 0x13C3, 0x5B32, 0x5B32, 0x2D51,
+ 0x5B34, 0x5B34, 0x12A9, 0x5B38, 0x5B38, 0x14CE, 0x5B3C, 0x5B3C, 0x2F18,
+ 0x5B3D, 0x5B3F, 0x3089, 0x5B40, 0x5B40, 0x160F, 0x5B41, 0x5B41, 0x38C8,
+ 0x5B43, 0x5B43, 0x1610, 0x5B44, 0x5B44, 0x3A44, 0x5B45, 0x5B45, 0x31CC,
+ 0x5B46, 0x5B46, 0x42B2, 0x5B47, 0x5B47, 0x32CD, 0x5B48, 0x5B48, 0x32CC,
+ 0x5B4A, 0x5B4A, 0x38CD, 0x5B4B, 0x5B4C, 0x337C, 0x5B4D, 0x5B4D, 0x3413,
+ 0x5B4E, 0x5B4E, 0x3482, 0x5B4F, 0x5B4F, 0x3A31, 0x5B50, 0x5B51, 0x027F,
+ 0x5B53, 0x5B53, 0x0281, 0x5B54, 0x5B54, 0x02C6, 0x5B55, 0x5B55, 0x0333,
+ 0x5B56, 0x5B56, 0x17DC, 0x5B57, 0x5B58, 0x03BF, 0x5B5A, 0x5B5B, 0x047F,
+ 0x5B5C, 0x5B5C, 0x047E, 0x5B5D, 0x5B5D, 0x047D, 0x5B5F, 0x5B5F, 0x0597,
+ 0x5B62, 0x5B62, 0x1957, 0x5B63, 0x5B63, 0x0599, 0x5B64, 0x5B64, 0x0598,
+ 0x5B65, 0x5B65, 0x1958, 0x5B66, 0x5B66, 0x454E, 0x5B68, 0x5B68, 0x461D,
+ 0x5B69, 0x5B69, 0x0700, 0x5B6B, 0x5B6B, 0x0891, 0x5B6C, 0x5B6C, 0x1C78,
+ 0x5B6D, 0x5B6D, 0x3E5F, 0x5B6E, 0x5B6E, 0x1EB8, 0x5B70, 0x5B70, 0x0A51,
+ 0x5B71, 0x5B71, 0x0C2A, 0x5B72, 0x5B72, 0x1EB7, 0x5B73, 0x5B73, 0x0C29,
+ 0x5B74, 0x5B74, 0x3732, 0x5B75, 0x5B75, 0x0FB7, 0x5B76, 0x5B76, 0x410A,
+ 0x5B77, 0x5B77, 0x265F, 0x5B78, 0x5B78, 0x12AA, 0x5B7A, 0x5B7A, 0x13C6,
+ 0x5B7B, 0x5B7B, 0x2D58, 0x5B7C, 0x5B7C, 0x410C, 0x5B7D, 0x5B7D, 0x1611,
+ 0x5B7F, 0x5B7F, 0x16C0, 0x5B80, 0x5B80, 0x0225, 0x5B81, 0x5B81, 0x179E,
+ 0x5B82, 0x5B82, 0x4044, 0x5B83, 0x5B83, 0x0334, 0x5B84, 0x5B84, 0x179F,
+ 0x5B85, 0x5B85, 0x03C3, 0x5B87, 0x5B88, 0x03C1, 0x5B89, 0x5B89, 0x03C4,
+ 0x5B8B, 0x5B8B, 0x0482, 0x5B8C, 0x5B8C, 0x0481, 0x5B8E, 0x5B8E, 0x1863,
+ 0x5B8F, 0x5B8F, 0x0483, 0x5B90, 0x5B90, 0x48E9, 0x5B92, 0x5B92, 0x1864,
+ 0x5B93, 0x5B93, 0x1959, 0x5B95, 0x5B95, 0x195A, 0x5B97, 0x5B97, 0x059A,
+ 0x5B98, 0x5B98, 0x059C, 0x5B99, 0x5B99, 0x059E, 0x5B9A, 0x5B9A, 0x059B,
+ 0x5B9B, 0x5B9B, 0x059F, 0x5B9C, 0x5B9C, 0x059D, 0x5B9D, 0x5B9D, 0x4116,
+ 0x5B9E, 0x5B9F, 0x454F, 0x5BA2, 0x5BA2, 0x0704, 0x5BA3, 0x5BA3, 0x0701,
+ 0x5BA4, 0x5BA4, 0x0703, 0x5BA5, 0x5BA5, 0x0705, 0x5BA6, 0x5BA6, 0x0702,
+ 0x5BA7, 0x5BA7, 0x1C79, 0x5BA8, 0x5BA8, 0x1AB3, 0x5BAA, 0x5BAA, 0x417B,
+ 0x5BAC, 0x5BAC, 0x1C7B, 0x5BAD, 0x5BAD, 0x1C7A, 0x5BAE, 0x5BAE, 0x0897,
+ 0x5BB0, 0x5BB0, 0x0893, 0x5BB3, 0x5BB3, 0x0894, 0x5BB4, 0x5BB4, 0x0896,
+ 0x5BB5, 0x5BB5, 0x0898, 0x5BB6, 0x5BB6, 0x0895, 0x5BB8, 0x5BB8, 0x089A,
+ 0x5BB9, 0x5BB9, 0x0899, 0x5BBF, 0x5BBF, 0x0A56, 0x5BC0, 0x5BC0, 0x1EBA,
+ 0x5BC1, 0x5BC1, 0x1EB9, 0x5BC2, 0x5BC2, 0x0A55, 0x5BC3, 0x5BC3, 0x3F25,
+ 0x5BC4, 0x5BC4, 0x0A54, 0x5BC5, 0x5BC5, 0x0A53, 0x5BC6, 0x5BC6, 0x0A57,
+ 0x5BC7, 0x5BC7, 0x0A52, 0x5BCA, 0x5BCA, 0x2110, 0x5BCB, 0x5BCB, 0x210D,
+ 0x5BCC, 0x5BCC, 0x0C2C, 0x5BCD, 0x5BCD, 0x210C, 0x5BCE, 0x5BCE, 0x2111,
+ 0x5BD0, 0x5BD0, 0x0C2E, 0x5BD1, 0x5BD1, 0x210F, 0x5BD2, 0x5BD2, 0x0C2B,
+ 0x5BD3, 0x5BD3, 0x0C2D, 0x5BD4, 0x5BD4, 0x210E, 0x5BD5, 0x5BD5, 0x4111,
+ 0x5BD6, 0x5BD6, 0x23B7, 0x5BD7, 0x5BD7, 0x42BB, 0x5BD8, 0x5BD9, 0x23B8,
+ 0x5BDE, 0x5BDE, 0x0FB8, 0x5BDF, 0x5BDF, 0x0FC0, 0x5BE0, 0x5BE0, 0x2660,
+ 0x5BE1, 0x5BE1, 0x0FBA, 0x5BE2, 0x5BE2, 0x0FBE, 0x5BE3, 0x5BE3, 0x2661,
+ 0x5BE4, 0x5BE4, 0x0FBF, 0x5BE5, 0x5BE6, 0x0FBB, 0x5BE7, 0x5BE7, 0x0FB9,
+ 0x5BE8, 0x5BE8, 0x0FBD, 0x5BE9, 0x5BE9, 0x1132, 0x5BEA, 0x5BEA, 0x210B,
+ 0x5BEB, 0x5BEB, 0x1133, 0x5BEC, 0x5BEC, 0x1131, 0x5BEE, 0x5BEE, 0x1130,
+ 0x5BEF, 0x5BEF, 0x2B28, 0x5BF0, 0x5BF0, 0x12AB, 0x5BF1, 0x5BF2, 0x2D59,
+ 0x5BF3, 0x5BF3, 0x4115, 0x5BF5, 0x5BF5, 0x157B, 0x5BF6, 0x5BF6, 0x1612,
+ 0x5BF8, 0x5BF8, 0x0282, 0x5BFA, 0x5BFA, 0x03C5, 0x5BFF, 0x5BFF, 0x40DD,
+ 0x5C01, 0x5C01, 0x0706, 0x5C03, 0x5C03, 0x1C7C, 0x5C04, 0x5C04, 0x089B,
+ 0x5C05, 0x5C05, 0x4118, 0x5C07, 0x5C07, 0x0A5A, 0x5C08, 0x5C08, 0x0A59,
+ 0x5C09, 0x5C09, 0x0A58, 0x5C0A, 0x5C0B, 0x0C2F, 0x5C0C, 0x5C0C, 0x2112,
+ 0x5C0D, 0x5C0D, 0x0FC1, 0x5C0E, 0x5C0E, 0x12AC, 0x5C0F, 0x5C0F, 0x0283,
+ 0x5C10, 0x5C10, 0x1787, 0x5C11, 0x5C11, 0x02C7, 0x5C12, 0x5C12, 0x17A0,
+ 0x5C13, 0x5C13, 0x411A, 0x5C14, 0x5C14, 0x411C, 0x5C15, 0x5C15, 0x17DD,
+ 0x5C16, 0x5C16, 0x03C6, 0x5C1A, 0x5C1A, 0x05A0, 0x5C1C, 0x5C1C, 0x45EA,
+ 0x5C1E, 0x5C1E, 0x3A29, 0x5C1F, 0x5C1F, 0x23BA, 0x5C20, 0x5C20, 0x3D89,
+ 0x5C22, 0x5C22, 0x0284, 0x5C23, 0x5C23, 0x44E8, 0x5C24, 0x5C24, 0x02C8,
+ 0x5C25, 0x5C25, 0x17DE, 0x5C28, 0x5C28, 0x1865, 0x5C2A, 0x5C2A, 0x1866,
+ 0x5C2C, 0x5C2C, 0x0484, 0x5C30, 0x5C30, 0x2113, 0x5C31, 0x5C31, 0x0C31,
+ 0x5C33, 0x5C33, 0x23BB, 0x5C37, 0x5C37, 0x13C7, 0x5C38, 0x5C38, 0x0285,
+ 0x5C39, 0x5C39, 0x0299, 0x5C3A, 0x5C3A, 0x02C9, 0x5C3B, 0x5C3B, 0x17A1,
+ 0x5C3C, 0x5C3C, 0x0335, 0x5C3E, 0x5C3E, 0x0488, 0x5C3F, 0x5C3F, 0x0487,
+ 0x5C40, 0x5C41, 0x0485, 0x5C44, 0x5C44, 0x195B, 0x5C45, 0x5C46, 0x05A2,
+ 0x5C47, 0x5C47, 0x195C, 0x5C48, 0x5C48, 0x05A1, 0x5C49, 0x5C49, 0x411F,
+ 0x5C4A, 0x5C4A, 0x3F5C, 0x5C4B, 0x5C4B, 0x070A, 0x5C4C, 0x5C4C, 0x1AB4,
+ 0x5C4D, 0x5C4D, 0x0709, 0x5C4E, 0x5C4F, 0x0707, 0x5C50, 0x5C50, 0x089E,
+ 0x5C51, 0x5C51, 0x089C, 0x5C53, 0x5C53, 0x3F02, 0x5C54, 0x5C54, 0x1C7E,
+ 0x5C55, 0x5C55, 0x089D, 0x5C56, 0x5C56, 0x1C7D, 0x5C58, 0x5C58, 0x0892,
+ 0x5C59, 0x5C59, 0x1EBB, 0x5C5C, 0x5C5D, 0x0A5C, 0x5C5E, 0x5C5E, 0x3D67,
+ 0x5C60, 0x5C60, 0x0A5B, 0x5C62, 0x5C62, 0x0FC2, 0x5C63, 0x5C63, 0x2662,
+ 0x5C64, 0x5C65, 0x1134, 0x5C67, 0x5C67, 0x28B7, 0x5C68, 0x5C68, 0x13C8,
+ 0x5C69, 0x5C6A, 0x2F19, 0x5C6C, 0x5C6C, 0x166E, 0x5C6D, 0x5C6D, 0x3483,
+ 0x5C6E, 0x5C6E, 0x1776, 0x5C6F, 0x5C6F, 0x02CA, 0x5C71, 0x5C71, 0x0286,
+ 0x5C73, 0x5C73, 0x17A3, 0x5C74, 0x5C74, 0x17A2, 0x5C79, 0x5C79, 0x03C7,
+ 0x5C7A, 0x5C7B, 0x17E0, 0x5C7C, 0x5C7C, 0x17DF, 0x5C7E, 0x5C7E, 0x17E2,
+ 0x5C85, 0x5C85, 0x4121, 0x5C86, 0x5C86, 0x186E, 0x5C88, 0x5C88, 0x1869,
+ 0x5C89, 0x5C89, 0x186B, 0x5C8A, 0x5C8A, 0x186D, 0x5C8B, 0x5C8B, 0x186A,
+ 0x5C8C, 0x5C8C, 0x048C, 0x5C8D, 0x5C8D, 0x1867, 0x5C8F, 0x5C8F, 0x1868,
+ 0x5C90, 0x5C91, 0x0489, 0x5C92, 0x5C92, 0x186C, 0x5C93, 0x5C93, 0x186F,
+ 0x5C94, 0x5C94, 0x048B, 0x5C95, 0x5C95, 0x1870, 0x5C99, 0x5C99, 0x468C,
+ 0x5C9A, 0x5C9A, 0x4551, 0x5C9C, 0x5C9C, 0x495A, 0x5C9D, 0x5C9D, 0x196A,
+ 0x5C9E, 0x5C9E, 0x3A2A, 0x5C9F, 0x5C9F, 0x1964, 0x5CA0, 0x5CA0, 0x195F,
+ 0x5CA1, 0x5CA1, 0x05A5, 0x5CA2, 0x5CA2, 0x1967, 0x5CA3, 0x5CA3, 0x1965,
+ 0x5CA4, 0x5CA4, 0x195E, 0x5CA5, 0x5CA5, 0x196B, 0x5CA6, 0x5CA6, 0x196E,
+ 0x5CA7, 0x5CA7, 0x1969, 0x5CA8, 0x5CA8, 0x1962, 0x5CA9, 0x5CA9, 0x05A7,
+ 0x5CAA, 0x5CAA, 0x1968, 0x5CAB, 0x5CAB, 0x05A8, 0x5CAC, 0x5CAC, 0x1963,
+ 0x5CAD, 0x5CAD, 0x1966, 0x5CAE, 0x5CAE, 0x195D, 0x5CAF, 0x5CAF, 0x1961,
+ 0x5CB0, 0x5CB0, 0x196D, 0x5CB1, 0x5CB1, 0x05A9, 0x5CB3, 0x5CB3, 0x05AA,
+ 0x5CB5, 0x5CB5, 0x1960, 0x5CB6, 0x5CB6, 0x196C, 0x5CB7, 0x5CB7, 0x05A4,
+ 0x5CB8, 0x5CB8, 0x05A6, 0x5CBA, 0x5CBA, 0x412B, 0x5CC1, 0x5CC1, 0x43B8,
+ 0x5CC2, 0x5CC2, 0x3D4C, 0x5CC6, 0x5CC6, 0x1AC5, 0x5CC7, 0x5CC7, 0x1ABE,
+ 0x5CC8, 0x5CC8, 0x1AC4, 0x5CC9, 0x5CC9, 0x1ABD, 0x5CCA, 0x5CCA, 0x1ABF,
+ 0x5CCB, 0x5CCB, 0x1AB9, 0x5CCC, 0x5CCC, 0x1AB7, 0x5CCE, 0x5CCE, 0x1AC6,
+ 0x5CCF, 0x5CCF, 0x1AC3, 0x5CD0, 0x5CD0, 0x1AB5, 0x5CD1, 0x5CD1, 0x3F13,
+ 0x5CD2, 0x5CD2, 0x070C, 0x5CD3, 0x5CD4, 0x1AC1, 0x5CD6, 0x5CD6, 0x1AC0,
+ 0x5CD7, 0x5CD7, 0x1AB8, 0x5CD8, 0x5CD8, 0x1AB6, 0x5CD9, 0x5CD9, 0x070B,
+ 0x5CDA, 0x5CDA, 0x1ABC, 0x5CDB, 0x5CDB, 0x1ABA, 0x5CDE, 0x5CDE, 0x1ABB,
+ 0x5CDF, 0x5CDF, 0x1AC7, 0x5CE5, 0x5CE5, 0x4637, 0x5CE8, 0x5CE8, 0x08A3,
+ 0x5CE9, 0x5CE9, 0x4122, 0x5CEA, 0x5CEA, 0x08A2, 0x5CEC, 0x5CEC, 0x1C7F,
+ 0x5CED, 0x5CED, 0x089F, 0x5CEE, 0x5CEE, 0x1C81, 0x5CEF, 0x5CEF, 0x4123,
+ 0x5CF0, 0x5CF0, 0x08A4, 0x5CF1, 0x5CF1, 0x1C82, 0x5CF4, 0x5CF4, 0x08A7,
+ 0x5CF6, 0x5CF6, 0x08A5, 0x5CF7, 0x5CF7, 0x1C83, 0x5CF8, 0x5CF8, 0x1AC8,
+ 0x5CF9, 0x5CF9, 0x1C85, 0x5CFB, 0x5CFB, 0x08A1, 0x5CFD, 0x5CFD, 0x08A0,
+ 0x5CFF, 0x5CFF, 0x1C80, 0x5D00, 0x5D00, 0x1C84, 0x5D01, 0x5D01, 0x08A6,
+ 0x5D06, 0x5D06, 0x0A5F, 0x5D07, 0x5D07, 0x0A5E, 0x5D0B, 0x5D0B, 0x1EBD,
+ 0x5D0C, 0x5D0C, 0x1EC1, 0x5D0D, 0x5D0D, 0x1EC3, 0x5D0E, 0x5D0E, 0x0A60,
+ 0x5D0F, 0x5D0F, 0x1EC6, 0x5D10, 0x5D10, 0x4127, 0x5D11, 0x5D11, 0x0A64,
+ 0x5D12, 0x5D12, 0x1EC8, 0x5D14, 0x5D14, 0x0A66, 0x5D15, 0x5D15, 0x43B9,
+ 0x5D16, 0x5D16, 0x0A62, 0x5D17, 0x5D17, 0x0A6A, 0x5D18, 0x5D18, 0x4128,
+ 0x5D19, 0x5D19, 0x0A67, 0x5D1A, 0x5D1A, 0x1EBF, 0x5D1B, 0x5D1B, 0x0A61,
+ 0x5D1D, 0x5D1D, 0x1EBE, 0x5D1E, 0x5D1E, 0x1EBC, 0x5D1F, 0x5D1F, 0x1ECA,
+ 0x5D20, 0x5D20, 0x1EC0, 0x5D22, 0x5D22, 0x0A63, 0x5D23, 0x5D23, 0x1EC9,
+ 0x5D24, 0x5D24, 0x0A68, 0x5D25, 0x5D25, 0x1EC5, 0x5D26, 0x5D26, 0x1EC4,
+ 0x5D27, 0x5D27, 0x0A69, 0x5D28, 0x5D28, 0x1EC2, 0x5D29, 0x5D29, 0x0A65,
+ 0x5D2C, 0x5D2C, 0x3DF7, 0x5D2E, 0x5D2E, 0x1ECB, 0x5D2F, 0x5D2F, 0x46D3,
+ 0x5D30, 0x5D30, 0x1EC7, 0x5D31, 0x5D31, 0x2122, 0x5D32, 0x5D32, 0x2129,
+ 0x5D33, 0x5D33, 0x211E, 0x5D34, 0x5D34, 0x0C34, 0x5D35, 0x5D35, 0x211A,
+ 0x5D36, 0x5D36, 0x212A, 0x5D37, 0x5D37, 0x2114, 0x5D38, 0x5D38, 0x2127,
+ 0x5D39, 0x5D39, 0x2125, 0x5D3A, 0x5D3A, 0x211F, 0x5D3C, 0x5D3C, 0x2128,
+ 0x5D3D, 0x5D3D, 0x2121, 0x5D3E, 0x5D3E, 0x4629, 0x5D3F, 0x5D3F, 0x2119,
+ 0x5D40, 0x5D40, 0x212B, 0x5D41, 0x5D41, 0x2117, 0x5D42, 0x5D42, 0x2124,
+ 0x5D43, 0x5D43, 0x2115, 0x5D45, 0x5D45, 0x212C, 0x5D46, 0x5D46, 0x4129,
+ 0x5D47, 0x5D47, 0x0C35, 0x5D48, 0x5D48, 0x462A, 0x5D49, 0x5D49, 0x2126,
+ 0x5D4A, 0x5D4A, 0x23BE, 0x5D4B, 0x5D4B, 0x2118, 0x5D4C, 0x5D4C, 0x0C32,
+ 0x5D4E, 0x5D4E, 0x211C, 0x5D50, 0x5D50, 0x0C33, 0x5D51, 0x5D51, 0x211B,
+ 0x5D52, 0x5D52, 0x2120, 0x5D55, 0x5D55, 0x211D, 0x5D56, 0x5D56, 0x43BA,
+ 0x5D57, 0x5D57, 0x3FCA, 0x5D59, 0x5D59, 0x2123, 0x5D5B, 0x5D5B, 0x3DD5,
+ 0x5D5E, 0x5D5E, 0x23C2, 0x5D62, 0x5D62, 0x23C5, 0x5D63, 0x5D63, 0x23BD,
+ 0x5D65, 0x5D65, 0x23BF, 0x5D67, 0x5D67, 0x23C4, 0x5D68, 0x5D68, 0x23C3,
+ 0x5D69, 0x5D69, 0x0DFD, 0x5D6B, 0x5D6B, 0x2116, 0x5D6C, 0x5D6C, 0x23C1,
+ 0x5D6F, 0x5D6F, 0x0DFE, 0x5D70, 0x5D70, 0x46E4, 0x5D71, 0x5D71, 0x23BC,
+ 0x5D72, 0x5D72, 0x23C0, 0x5D74, 0x5D74, 0x3EEF, 0x5D77, 0x5D77, 0x2669,
+ 0x5D79, 0x5D79, 0x2670, 0x5D7A, 0x5D7A, 0x2667, 0x5D7C, 0x5D7C, 0x266E,
+ 0x5D7D, 0x5D7D, 0x2665, 0x5D7E, 0x5D7E, 0x266D, 0x5D7F, 0x5D7F, 0x2671,
+ 0x5D80, 0x5D80, 0x2664, 0x5D81, 0x5D81, 0x2668, 0x5D82, 0x5D82, 0x2663,
+ 0x5D84, 0x5D84, 0x0FC3, 0x5D85, 0x5D85, 0x3E34, 0x5D86, 0x5D86, 0x2666,
+ 0x5D87, 0x5D87, 0x0FC4, 0x5D88, 0x5D88, 0x266C, 0x5D89, 0x5D89, 0x266B,
+ 0x5D8A, 0x5D8A, 0x266A, 0x5D8B, 0x5D8B, 0x4124, 0x5D8D, 0x5D8D, 0x266F,
+ 0x5D8E, 0x5D8E, 0x3F0C, 0x5D92, 0x5D92, 0x28BB, 0x5D93, 0x5D93, 0x28BD,
+ 0x5D94, 0x5D94, 0x1137, 0x5D95, 0x5D95, 0x28BE, 0x5D97, 0x5D97, 0x28B9,
+ 0x5D99, 0x5D99, 0x28B8, 0x5D9A, 0x5D9A, 0x28C2, 0x5D9C, 0x5D9C, 0x28C0,
+ 0x5D9D, 0x5D9D, 0x1136, 0x5D9E, 0x5D9E, 0x28C3, 0x5D9F, 0x5D9F, 0x28BA,
+ 0x5DA0, 0x5DA0, 0x28BF, 0x5DA1, 0x5DA1, 0x28C1, 0x5DA2, 0x5DA2, 0x28BC,
+ 0x5DA4, 0x5DA4, 0x462D, 0x5DA7, 0x5DA7, 0x2B2C, 0x5DA8, 0x5DA8, 0x2B31,
+ 0x5DA9, 0x5DA9, 0x2B2B, 0x5DAA, 0x5DAA, 0x2B30, 0x5DAB, 0x5DAB, 0x3E39,
+ 0x5DAC, 0x5DAC, 0x2B29, 0x5DAD, 0x5DAD, 0x2B33, 0x5DAE, 0x5DAE, 0x2B2F,
+ 0x5DAF, 0x5DAF, 0x2B34, 0x5DB0, 0x5DB0, 0x2B2E, 0x5DB1, 0x5DB1, 0x2B2A,
+ 0x5DB2, 0x5DB2, 0x2B32, 0x5DB4, 0x5DB4, 0x2B35, 0x5DB5, 0x5DB5, 0x2B2D,
+ 0x5DB6, 0x5DB6, 0x4158, 0x5DB7, 0x5DB7, 0x2D5B, 0x5DB8, 0x5DB8, 0x13CC,
+ 0x5DB9, 0x5DB9, 0x462E, 0x5DBA, 0x5DBA, 0x13CA, 0x5DBC, 0x5DBC, 0x13C9,
+ 0x5DBD, 0x5DBD, 0x13CB, 0x5DC0, 0x5DC0, 0x2F1B, 0x5DC1, 0x5DC1, 0x3BFF,
+ 0x5DC2, 0x5DC2, 0x3023, 0x5DC3, 0x5DC3, 0x308C, 0x5DC6, 0x5DC7, 0x31CD,
+ 0x5DC9, 0x5DC9, 0x1613, 0x5DCB, 0x5DCB, 0x32CE, 0x5DCD, 0x5DCD, 0x166F,
+ 0x5DCF, 0x5DCF, 0x32CF, 0x5DD1, 0x5DD1, 0x337F, 0x5DD2, 0x5DD2, 0x16C2,
+ 0x5DD4, 0x5DD4, 0x16C1, 0x5DD5, 0x5DD5, 0x337E, 0x5DD6, 0x5DD6, 0x16F7,
+ 0x5DD7, 0x5DD7, 0x412C, 0x5DD8, 0x5DD8, 0x3414, 0x5DDB, 0x5DDB, 0x0226,
+ 0x5DDD, 0x5DDD, 0x0287, 0x5DDE, 0x5DDE, 0x03C8, 0x5DDF, 0x5DDF, 0x17E3,
+ 0x5DE0, 0x5DE0, 0x1871, 0x5DE1, 0x5DE1, 0x051A, 0x5DE2, 0x5DE2, 0x0A6B,
+ 0x5DE5, 0x5DE5, 0x0288, 0x5DE6, 0x5DE6, 0x0338, 0x5DE7, 0x5DE7, 0x0337,
+ 0x5DE8, 0x5DE8, 0x0336, 0x5DEB, 0x5DEB, 0x048D, 0x5DEE, 0x5DEE, 0x08A8,
+ 0x5DF0, 0x5DF0, 0x23C6, 0x5DF1, 0x5DF3, 0x0289, 0x5DF4, 0x5DF4, 0x02CB,
+ 0x5DF5, 0x5DF5, 0x3F61, 0x5DF7, 0x5DF7, 0x070D, 0x5DF9, 0x5DF9, 0x1AC9,
+ 0x5DFD, 0x5DFD, 0x0C36, 0x5DFE, 0x5DFE, 0x028C, 0x5DFF, 0x5DFF, 0x1788,
+ 0x5E02, 0x5E03, 0x0339, 0x5E04, 0x5E04, 0x17A4, 0x5E06, 0x5E06, 0x03C9,
+ 0x5E09, 0x5E09, 0x4140, 0x5E0A, 0x5E0A, 0x1872, 0x5E0B, 0x5E0B, 0x3D8A,
+ 0x5E0C, 0x5E0C, 0x048E, 0x5E0E, 0x5E0E, 0x1873, 0x5E11, 0x5E11, 0x05B0,
+ 0x5E12, 0x5E12, 0x3F2E, 0x5E14, 0x5E14, 0x1970, 0x5E15, 0x5E15, 0x05AE,
+ 0x5E16, 0x5E16, 0x05AD, 0x5E17, 0x5E17, 0x196F, 0x5E18, 0x5E18, 0x05AB,
+ 0x5E19, 0x5E19, 0x1971, 0x5E1A, 0x5E1A, 0x05AC, 0x5E1B, 0x5E1B, 0x05AF,
+ 0x5E1D, 0x5E1D, 0x070E, 0x5E1F, 0x5E1F, 0x0710, 0x5E20, 0x5E20, 0x1ACD,
+ 0x5E21, 0x5E23, 0x1ACA, 0x5E24, 0x5E24, 0x1ACE, 0x5E25, 0x5E25, 0x070F,
+ 0x5E28, 0x5E28, 0x1C87, 0x5E29, 0x5E29, 0x1C86, 0x5E2B, 0x5E2B, 0x08AA,
+ 0x5E2D, 0x5E2D, 0x08A9, 0x5E2E, 0x5E2E, 0x4135, 0x5E33, 0x5E33, 0x0A6E,
+ 0x5E34, 0x5E34, 0x1ECD, 0x5E36, 0x5E36, 0x0A6D, 0x5E37, 0x5E37, 0x0A6F,
+ 0x5E38, 0x5E38, 0x0A6C, 0x5E3D, 0x5E3D, 0x0C38, 0x5E3E, 0x5E3E, 0x1ECC,
+ 0x5E40, 0x5E40, 0x0C39, 0x5E41, 0x5E41, 0x212E, 0x5E42, 0x5E42, 0x43A0,
+ 0x5E43, 0x5E43, 0x0C3A, 0x5E44, 0x5E44, 0x212D, 0x5E45, 0x5E45, 0x0C37,
+ 0x5E48, 0x5E48, 0x3A2C, 0x5E4A, 0x5E4A, 0x23C9, 0x5E4B, 0x5E4B, 0x23CB,
+ 0x5E4C, 0x5E4C, 0x0DFF, 0x5E4D, 0x5E4D, 0x23CA, 0x5E4E, 0x5E4E, 0x23C8,
+ 0x5E4F, 0x5E4F, 0x23C7, 0x5E53, 0x5E53, 0x2674, 0x5E54, 0x5E54, 0x0FC9,
+ 0x5E55, 0x5E55, 0x0FC7, 0x5E57, 0x5E57, 0x0FC8, 0x5E58, 0x5E59, 0x2672,
+ 0x5E5B, 0x5E5B, 0x0FC5, 0x5E5C, 0x5E5C, 0x28C7, 0x5E5D, 0x5E5D, 0x28C5,
+ 0x5E5E, 0x5E5E, 0x3A2B, 0x5E5F, 0x5E5F, 0x1139, 0x5E60, 0x5E60, 0x28C6,
+ 0x5E61, 0x5E61, 0x113A, 0x5E62, 0x5E62, 0x1138, 0x5E63, 0x5E63, 0x0FC6,
+ 0x5E66, 0x5E66, 0x2B38, 0x5E67, 0x5E68, 0x2B36, 0x5E69, 0x5E69, 0x28C4,
+ 0x5E6A, 0x5E6A, 0x2D5D, 0x5E6B, 0x5E6B, 0x13CD, 0x5E6C, 0x5E6C, 0x2D5C,
+ 0x5E6D, 0x5E6E, 0x2F1C, 0x5E6F, 0x5E6F, 0x2B39, 0x5E70, 0x5E70, 0x308D,
+ 0x5E72, 0x5E72, 0x028D, 0x5E73, 0x5E73, 0x033B, 0x5E74, 0x5E74, 0x03CB,
+ 0x5E75, 0x5E75, 0x17E4, 0x5E76, 0x5E76, 0x03CA, 0x5E78, 0x5E78, 0x05B1,
+ 0x5E79, 0x5E79, 0x0E00, 0x5E7A, 0x5E7A, 0x0227, 0x5E7B, 0x5E7B, 0x02CC,
+ 0x5E7C, 0x5E7C, 0x033C, 0x5E7D, 0x5E7D, 0x0711, 0x5E7E, 0x5E7E, 0x0C3B,
+ 0x5E7F, 0x5E7F, 0x0228, 0x5E80, 0x5E80, 0x17A5, 0x5E82, 0x5E82, 0x17A6,
+ 0x5E83, 0x5E83, 0x4108, 0x5E84, 0x5E84, 0x17E5, 0x5E86, 0x5E86, 0x4552,
+ 0x5E87, 0x5E87, 0x0490, 0x5E88, 0x5E88, 0x1877, 0x5E89, 0x5E89, 0x1875,
+ 0x5E8A, 0x5E8A, 0x0491, 0x5E8B, 0x5E8B, 0x1874, 0x5E8C, 0x5E8C, 0x1876,
+ 0x5E8D, 0x5E8D, 0x1878, 0x5E8F, 0x5E8F, 0x048F, 0x5E95, 0x5E96, 0x05B5,
+ 0x5E97, 0x5E97, 0x05B3, 0x5E9A, 0x5E9A, 0x05B2, 0x5E9B, 0x5E9B, 0x1AD2,
+ 0x5E9C, 0x5E9C, 0x05B4, 0x5EA0, 0x5EA0, 0x0712, 0x5EA2, 0x5EA2, 0x1AD1,
+ 0x5EA3, 0x5EA3, 0x1AD3, 0x5EA4, 0x5EA4, 0x1AD0, 0x5EA5, 0x5EA5, 0x1AD4,
+ 0x5EA6, 0x5EA6, 0x0713, 0x5EA7, 0x5EA7, 0x08AD, 0x5EA8, 0x5EA8, 0x1C88,
+ 0x5EAA, 0x5EAA, 0x1C8A, 0x5EAB, 0x5EAB, 0x08AB, 0x5EAC, 0x5EAC, 0x1C8B,
+ 0x5EAD, 0x5EAD, 0x08AC, 0x5EAE, 0x5EAE, 0x1C89, 0x5EB0, 0x5EB0, 0x1ACF,
+ 0x5EB1, 0x5EB1, 0x1ECE, 0x5EB2, 0x5EB3, 0x1ED1, 0x5EB4, 0x5EB4, 0x1ECF,
+ 0x5EB5, 0x5EB5, 0x0A73, 0x5EB6, 0x5EB6, 0x0A72, 0x5EB7, 0x5EB8, 0x0A70,
+ 0x5EB9, 0x5EB9, 0x1ED0, 0x5EBD, 0x5EBD, 0x43BD, 0x5EBE, 0x5EBE, 0x0A74,
+ 0x5EC1, 0x5EC2, 0x0C3D, 0x5EC4, 0x5EC4, 0x0C3F, 0x5EC5, 0x5EC5, 0x23CC,
+ 0x5EC6, 0x5EC6, 0x23CE, 0x5EC7, 0x5EC7, 0x23D0, 0x5EC8, 0x5EC8, 0x0E02,
+ 0x5EC9, 0x5EC9, 0x0E01, 0x5ECA, 0x5ECA, 0x0C3C, 0x5ECB, 0x5ECB, 0x23CF,
+ 0x5ECC, 0x5ECC, 0x23CD, 0x5ECD, 0x5ECD, 0x3A30, 0x5ECE, 0x5ECE, 0x2678,
+ 0x5ED0, 0x5ED0, 0x413D, 0x5ED1, 0x5ED1, 0x2676, 0x5ED2, 0x5ED2, 0x267C,
+ 0x5ED3, 0x5ED3, 0x0FCA, 0x5ED4, 0x5ED4, 0x267D, 0x5ED5, 0x5ED5, 0x267A,
+ 0x5ED6, 0x5ED6, 0x0FCB, 0x5ED7, 0x5ED7, 0x2677, 0x5ED8, 0x5ED8, 0x2675,
+ 0x5ED9, 0x5ED9, 0x267B, 0x5EDA, 0x5EDA, 0x113C, 0x5EDB, 0x5EDB, 0x28C9,
+ 0x5EDC, 0x5EDC, 0x2679, 0x5EDD, 0x5EDD, 0x113E, 0x5EDE, 0x5EDE, 0x28CA,
+ 0x5EDF, 0x5EDF, 0x113D, 0x5EE0, 0x5EE0, 0x1140, 0x5EE1, 0x5EE1, 0x28CB,
+ 0x5EE2, 0x5EE2, 0x113B, 0x5EE3, 0x5EE3, 0x113F, 0x5EE5, 0x5EE5, 0x2B3E,
+ 0x5EE6, 0x5EE6, 0x2B3C, 0x5EE7, 0x5EE7, 0x2B3B, 0x5EE8, 0x5EE8, 0x2B3D,
+ 0x5EE9, 0x5EE9, 0x2B3A, 0x5EEC, 0x5EEC, 0x157D, 0x5EEE, 0x5EEF, 0x31CF,
+ 0x5EF1, 0x5EF1, 0x32D0, 0x5EF2, 0x5EF2, 0x3380, 0x5EF3, 0x5EF3, 0x1742,
+ 0x5EF4, 0x5EF4, 0x0229, 0x5EF6, 0x5EF6, 0x05B7, 0x5EF7, 0x5EF7, 0x0492,
+ 0x5EF8, 0x5EF8, 0x386F, 0x5EF9, 0x5EF9, 0x4143, 0x5EFA, 0x5EFA, 0x0714,
+ 0x5EFB, 0x5EFB, 0x4144, 0x5EFC, 0x5EFC, 0x4146, 0x5EFE, 0x5EFE, 0x028E,
+ 0x5EFF, 0x5EFF, 0x02CD, 0x5F01, 0x5F01, 0x033D, 0x5F02, 0x5F02, 0x17E6,
+ 0x5F04, 0x5F04, 0x0493, 0x5F05, 0x5F05, 0x1879, 0x5F07, 0x5F07, 0x1AD5,
+ 0x5F08, 0x5F08, 0x0715, 0x5F0A, 0x5F0A, 0x0FCC, 0x5F0B, 0x5F0B, 0x028F,
+ 0x5F0C, 0x5F0C, 0x3A3E, 0x5F0D, 0x5F0D, 0x4149, 0x5F0E, 0x5F0E, 0x3A3F,
+ 0x5F0F, 0x5F0F, 0x03CC, 0x5F12, 0x5F12, 0x0E03, 0x5F13, 0x5F13, 0x0290,
+ 0x5F14, 0x5F15, 0x02CE, 0x5F17, 0x5F17, 0x033F, 0x5F18, 0x5F18, 0x033E,
+ 0x5F1A, 0x5F1A, 0x17E7, 0x5F1B, 0x5F1B, 0x03CD, 0x5F1D, 0x5F1D, 0x187A,
+ 0x5F1F, 0x5F1F, 0x0494, 0x5F22, 0x5F24, 0x1973, 0x5F25, 0x5F25, 0x4630,
+ 0x5F26, 0x5F27, 0x05B8, 0x5F28, 0x5F28, 0x1972, 0x5F29, 0x5F29, 0x05BA,
+ 0x5F2D, 0x5F2D, 0x0716, 0x5F2E, 0x5F2E, 0x1AD6, 0x5F30, 0x5F30, 0x1C8D,
+ 0x5F31, 0x5F31, 0x08AE, 0x5F33, 0x5F33, 0x1C8C, 0x5F35, 0x5F35, 0x0A75,
+ 0x5F36, 0x5F36, 0x1ED3, 0x5F37, 0x5F37, 0x0A76, 0x5F38, 0x5F38, 0x1ED4,
+ 0x5F3A, 0x5F3A, 0x414E, 0x5F3C, 0x5F3C, 0x0C40, 0x5F40, 0x5F40, 0x23D1,
+ 0x5F43, 0x5F43, 0x267F, 0x5F44, 0x5F44, 0x267E, 0x5F46, 0x5F46, 0x0FCD,
+ 0x5F48, 0x5F48, 0x1141, 0x5F49, 0x5F49, 0x28CC, 0x5F4A, 0x5F4A, 0x12AD,
+ 0x5F4B, 0x5F4B, 0x2B3F, 0x5F4C, 0x5F4C, 0x13CE, 0x5F4D, 0x5F4D, 0x3BA5,
+ 0x5F4E, 0x5F4E, 0x16C3, 0x5F4F, 0x5F4F, 0x3416, 0x5F50, 0x5F50, 0x022A,
+ 0x5F51, 0x5F51, 0x44E9, 0x5F54, 0x5F54, 0x1976, 0x5F56, 0x5F56, 0x1AD7,
+ 0x5F57, 0x5F57, 0x0A77, 0x5F58, 0x5F58, 0x212F, 0x5F59, 0x5F59, 0x0E04,
+ 0x5F5C, 0x5F5C, 0x3D5A, 0x5F5D, 0x5F5D, 0x14CF, 0x5F61, 0x5F61, 0x022B,
+ 0x5F62, 0x5F62, 0x0496, 0x5F63, 0x5F63, 0x4152, 0x5F64, 0x5F64, 0x0495,
+ 0x5F65, 0x5F65, 0x0717, 0x5F67, 0x5F67, 0x1C8E, 0x5F69, 0x5F69, 0x0A79,
+ 0x5F6A, 0x5F6A, 0x0B89, 0x5F6B, 0x5F6B, 0x0A7A, 0x5F6C, 0x5F6C, 0x0A78,
+ 0x5F6D, 0x5F6D, 0x0C41, 0x5F6F, 0x5F6F, 0x2680, 0x5F70, 0x5F70, 0x0FCE,
+ 0x5F71, 0x5F71, 0x1142, 0x5F72, 0x5F72, 0x4154, 0x5F73, 0x5F73, 0x1777,
+ 0x5F74, 0x5F74, 0x17E8, 0x5F76, 0x5F76, 0x187C, 0x5F77, 0x5F77, 0x0497,
+ 0x5F78, 0x5F78, 0x187B, 0x5F79, 0x5F79, 0x0498, 0x5F7B, 0x5F7B, 0x4058,
+ 0x5F7C, 0x5F7C, 0x05BE, 0x5F7D, 0x5F7D, 0x1979, 0x5F7E, 0x5F7E, 0x1978,
+ 0x5F7F, 0x5F7F, 0x05BD, 0x5F80, 0x5F81, 0x05BB, 0x5F82, 0x5F82, 0x1977,
+ 0x5F83, 0x5F83, 0x4631, 0x5F85, 0x5F85, 0x0719, 0x5F86, 0x5F86, 0x1AD8,
+ 0x5F87, 0x5F87, 0x071C, 0x5F88, 0x5F88, 0x0718, 0x5F89, 0x5F89, 0x071E,
+ 0x5F8A, 0x5F8B, 0x071A, 0x5F8C, 0x5F8C, 0x071D, 0x5F90, 0x5F90, 0x08B1,
+ 0x5F91, 0x5F91, 0x08B0, 0x5F92, 0x5F92, 0x08AF, 0x5F96, 0x5F96, 0x1ED6,
+ 0x5F97, 0x5F97, 0x0A7B, 0x5F98, 0x5F98, 0x0A7E, 0x5F99, 0x5F99, 0x0A7C,
+ 0x5F9B, 0x5F9B, 0x1ED5, 0x5F9C, 0x5F9C, 0x0A81, 0x5F9E, 0x5F9E, 0x0A7D,
+ 0x5F9F, 0x5F9F, 0x1ED7, 0x5FA0, 0x5FA0, 0x0A80, 0x5FA1, 0x5FA1, 0x0A7F,
+ 0x5FA4, 0x5FA4, 0x402C, 0x5FA5, 0x5FA5, 0x2131, 0x5FA6, 0x5FA6, 0x2130,
+ 0x5FA7, 0x5FA7, 0x4157, 0x5FA8, 0x5FA8, 0x0C44, 0x5FA9, 0x5FAA, 0x0C42,
+ 0x5FAB, 0x5FAB, 0x2132, 0x5FAC, 0x5FAC, 0x0E05, 0x5FAD, 0x5FAD, 0x23D3,
+ 0x5FAE, 0x5FAE, 0x0E06, 0x5FAF, 0x5FAF, 0x23D2, 0x5FB1, 0x5FB1, 0x3D98,
+ 0x5FB2, 0x5FB2, 0x28CD, 0x5FB5, 0x5FB5, 0x1144, 0x5FB6, 0x5FB6, 0x2681,
+ 0x5FB7, 0x5FB7, 0x1143, 0x5FB9, 0x5FB9, 0x0FCF, 0x5FBA, 0x5FBA, 0x3F9F,
+ 0x5FBB, 0x5FBB, 0x2B41, 0x5FBC, 0x5FBC, 0x2B40, 0x5FBD, 0x5FBD, 0x13CF,
+ 0x5FBE, 0x5FBE, 0x2D5E, 0x5FBF, 0x5FBF, 0x308E, 0x5FC0, 0x5FC1, 0x31D1,
+ 0x5FC3, 0x5FC3, 0x02D0, 0x5FC4, 0x5FC4, 0x44EA, 0x5FC5, 0x5FC5, 0x0340,
+ 0x5FC9, 0x5FC9, 0x17A7, 0x5FCC, 0x5FCC, 0x049A, 0x5FCD, 0x5FCD, 0x049C,
+ 0x5FCF, 0x5FCF, 0x17EB, 0x5FD0, 0x5FD0, 0x187F, 0x5FD1, 0x5FD1, 0x187E,
+ 0x5FD2, 0x5FD2, 0x187D, 0x5FD4, 0x5FD4, 0x17EA, 0x5FD5, 0x5FD5, 0x17E9,
+ 0x5FD6, 0x5FD6, 0x03CF, 0x5FD7, 0x5FD7, 0x049B, 0x5FD8, 0x5FD8, 0x0499,
+ 0x5FD9, 0x5FD9, 0x03CE, 0x5FDB, 0x5FDB, 0x3A4A, 0x5FDD, 0x5FDD, 0x05BF,
+ 0x5FDE, 0x5FDE, 0x197A, 0x5FDF, 0x5FDF, 0x41AF, 0x5FE0, 0x5FE0, 0x05C0,
+ 0x5FE1, 0x5FE1, 0x1884, 0x5FE3, 0x5FE3, 0x1886, 0x5FE4, 0x5FE4, 0x1885,
+ 0x5FE5, 0x5FE5, 0x197B, 0x5FE8, 0x5FE8, 0x1881, 0x5FEA, 0x5FEA, 0x04A0,
+ 0x5FEB, 0x5FEB, 0x049E, 0x5FED, 0x5FED, 0x1880, 0x5FEE, 0x5FEE, 0x1882,
+ 0x5FEF, 0x5FEF, 0x1888, 0x5FF1, 0x5FF1, 0x049D, 0x5FF3, 0x5FF3, 0x1883,
+ 0x5FF4, 0x5FF4, 0x188C, 0x5FF5, 0x5FF5, 0x05C2, 0x5FF7, 0x5FF7, 0x1889,
+ 0x5FF8, 0x5FF8, 0x049F, 0x5FFA, 0x5FFA, 0x1887, 0x5FFB, 0x5FFB, 0x188A,
+ 0x5FFD, 0x5FFD, 0x05C1, 0x5FFF, 0x5FFF, 0x05C3, 0x6000, 0x6000, 0x188B,
+ 0x6009, 0x6009, 0x198F, 0x600A, 0x600A, 0x1982, 0x600B, 0x600B, 0x1980,
+ 0x600C, 0x600C, 0x198E, 0x600D, 0x600D, 0x1989, 0x600E, 0x600E, 0x0723,
+ 0x600F, 0x600F, 0x05C4, 0x6010, 0x6010, 0x198A, 0x6011, 0x6011, 0x198D,
+ 0x6012, 0x6012, 0x071F, 0x6013, 0x6013, 0x198C, 0x6014, 0x6014, 0x05C5,
+ 0x6015, 0x6015, 0x05CA, 0x6016, 0x6016, 0x05C8, 0x6017, 0x6017, 0x1983,
+ 0x6019, 0x6019, 0x197E, 0x601A, 0x601A, 0x1985, 0x601B, 0x601B, 0x05CF,
+ 0x601C, 0x601C, 0x1990, 0x601D, 0x601D, 0x0720, 0x601E, 0x601E, 0x1986,
+ 0x6020, 0x6020, 0x0721, 0x6021, 0x6021, 0x05CB, 0x6022, 0x6022, 0x1988,
+ 0x6023, 0x6023, 0x4185, 0x6024, 0x6024, 0x1AE7, 0x6025, 0x6025, 0x0722,
+ 0x6026, 0x6026, 0x197D, 0x6027, 0x6027, 0x05CC, 0x6028, 0x6028, 0x0724,
+ 0x6029, 0x6029, 0x05CD, 0x602A, 0x602A, 0x05C9, 0x602B, 0x602B, 0x05CE,
+ 0x602C, 0x602C, 0x1987, 0x602D, 0x602D, 0x197C, 0x602E, 0x602E, 0x198B,
+ 0x602F, 0x602F, 0x05C6, 0x6031, 0x6031, 0x4161, 0x6032, 0x6032, 0x197F,
+ 0x6033, 0x6033, 0x1984, 0x6034, 0x6034, 0x1981, 0x6035, 0x6035, 0x05C7,
+ 0x6037, 0x6037, 0x1AD9, 0x6039, 0x6039, 0x1ADA, 0x603B, 0x603B, 0x4553,
+ 0x6040, 0x6040, 0x1AE4, 0x6041, 0x6041, 0x1C92, 0x6042, 0x6042, 0x1AE5,
+ 0x6043, 0x6043, 0x072A, 0x6044, 0x6044, 0x1AE8, 0x6045, 0x6045, 0x1ADE,
+ 0x6046, 0x6046, 0x0729, 0x6047, 0x6047, 0x1AE0, 0x6049, 0x6049, 0x1AE1,
+ 0x604A, 0x604A, 0x4074, 0x604C, 0x604C, 0x1AE3, 0x604D, 0x604D, 0x0725,
+ 0x6050, 0x6050, 0x08B5, 0x6052, 0x6052, 0x36EC, 0x6053, 0x6053, 0x1ADF,
+ 0x6054, 0x6054, 0x1ADB, 0x6055, 0x6055, 0x08B6, 0x6058, 0x6058, 0x1AE9,
+ 0x6059, 0x6059, 0x08B2, 0x605A, 0x605A, 0x1C90, 0x605B, 0x605B, 0x1AE2,
+ 0x605D, 0x605D, 0x1C8F, 0x605E, 0x605E, 0x1ADD, 0x605F, 0x605F, 0x1AE6,
+ 0x6062, 0x6062, 0x0728, 0x6063, 0x6063, 0x08B3, 0x6064, 0x6064, 0x072E,
+ 0x6065, 0x6065, 0x08B4, 0x6066, 0x6066, 0x1AEA, 0x6067, 0x6067, 0x1C91,
+ 0x6068, 0x6068, 0x0727, 0x6069, 0x6069, 0x08B8, 0x606A, 0x606A, 0x072D,
+ 0x606B, 0x606B, 0x072C, 0x606C, 0x606C, 0x072B, 0x606D, 0x606D, 0x08B7,
+ 0x606E, 0x606E, 0x1AEB, 0x606F, 0x606F, 0x08B9, 0x6070, 0x6070, 0x0726,
+ 0x6072, 0x6072, 0x1ADC, 0x6075, 0x6075, 0x3A56, 0x6077, 0x6077, 0x4005,
+ 0x607E, 0x607E, 0x3A47, 0x607F, 0x607F, 0x0A82, 0x6080, 0x6080, 0x1C95,
+ 0x6081, 0x6081, 0x1C97, 0x6083, 0x6083, 0x1C99, 0x6084, 0x6084, 0x08BA,
+ 0x6085, 0x6085, 0x08C0, 0x6086, 0x6086, 0x1EDA, 0x6087, 0x6087, 0x1C9D,
+ 0x6088, 0x6088, 0x1C94, 0x6089, 0x6089, 0x0A84, 0x608A, 0x608A, 0x1ED8,
+ 0x608C, 0x608C, 0x08BF, 0x608D, 0x608D, 0x08BD, 0x608E, 0x608E, 0x1C9F,
+ 0x6090, 0x6090, 0x1ED9, 0x6092, 0x6092, 0x1C96, 0x6094, 0x6094, 0x08BE,
+ 0x6095, 0x6095, 0x1C9A, 0x6096, 0x6096, 0x08C1, 0x6097, 0x6097, 0x1C9C,
+ 0x609A, 0x609A, 0x08BC, 0x609B, 0x609B, 0x1C9B, 0x609C, 0x609C, 0x1C9E,
+ 0x609D, 0x609D, 0x1C98, 0x609E, 0x609E, 0x416A, 0x609F, 0x609F, 0x08BB,
+ 0x60A0, 0x60A0, 0x0A85, 0x60A2, 0x60A2, 0x1C93, 0x60A3, 0x60A3, 0x0A83,
+ 0x60A4, 0x60A4, 0x4001, 0x60A7, 0x60A7, 0x3ADC, 0x60A8, 0x60A8, 0x0A86,
+ 0x60B0, 0x60B0, 0x1EDC, 0x60B1, 0x60B1, 0x1EE5, 0x60B2, 0x60B2, 0x0C47,
+ 0x60B3, 0x60B3, 0x416C, 0x60B4, 0x60B4, 0x0A88, 0x60B5, 0x60B5, 0x0A8D,
+ 0x60B6, 0x60B6, 0x0C48, 0x60B7, 0x60B7, 0x1EE7, 0x60B8, 0x60B8, 0x0A94,
+ 0x60B9, 0x60B9, 0x2134, 0x60BA, 0x60BA, 0x1EDD, 0x60BB, 0x60BB, 0x0A8C,
+ 0x60BC, 0x60BC, 0x0A8F, 0x60BD, 0x60BD, 0x0A8A, 0x60BE, 0x60BE, 0x1EDB,
+ 0x60BF, 0x60BF, 0x1EE9, 0x60C0, 0x60C0, 0x1EEC, 0x60C1, 0x60C1, 0x2143,
+ 0x60C3, 0x60C3, 0x1EEA, 0x60C4, 0x60C4, 0x2138, 0x60C5, 0x60C5, 0x0A8B,
+ 0x60C6, 0x60C6, 0x0A92, 0x60C7, 0x60C7, 0x0A96, 0x60C8, 0x60C8, 0x1EE4,
+ 0x60C9, 0x60C9, 0x2133, 0x60CA, 0x60CA, 0x1EE8, 0x60CB, 0x60CB, 0x0A87,
+ 0x60CC, 0x60CC, 0x2135, 0x60CD, 0x60CD, 0x1EEB, 0x60CE, 0x60CE, 0x2137,
+ 0x60CF, 0x60CF, 0x1EE0, 0x60D1, 0x60D1, 0x0C45, 0x60D3, 0x60D4, 0x1EDE,
+ 0x60D5, 0x60D5, 0x0A91, 0x60D7, 0x60D7, 0x4635, 0x60D8, 0x60D8, 0x0A90,
+ 0x60D9, 0x60D9, 0x1EE2, 0x60DA, 0x60DA, 0x0A95, 0x60DB, 0x60DB, 0x1EE6,
+ 0x60DC, 0x60DC, 0x0A8E, 0x60DD, 0x60DD, 0x1EE3, 0x60DE, 0x60DE, 0x3DCC,
+ 0x60DF, 0x60DF, 0x0A93, 0x60E0, 0x60E0, 0x0C49, 0x60E1, 0x60E1, 0x0C46,
+ 0x60E2, 0x60E2, 0x2136, 0x60E3, 0x60E3, 0x3D75, 0x60E4, 0x60E4, 0x1EE1,
+ 0x60E6, 0x60E6, 0x0A89, 0x60E7, 0x60E7, 0x3D84, 0x60E8, 0x60E8, 0x3D7B,
+ 0x60E9, 0x60E9, 0x4009, 0x60F0, 0x60F0, 0x0C4E, 0x60F1, 0x60F1, 0x0C52,
+ 0x60F2, 0x60F2, 0x213A, 0x60F3, 0x60F3, 0x0E0B, 0x60F4, 0x60F4, 0x0C50,
+ 0x60F5, 0x60F5, 0x213E, 0x60F6, 0x60F6, 0x0C54, 0x60F7, 0x60F7, 0x23D4,
+ 0x60F8, 0x60F8, 0x2140, 0x60F9, 0x60F9, 0x0E0D, 0x60FA, 0x60FA, 0x0C4C,
+ 0x60FB, 0x60FB, 0x0C4F, 0x60FC, 0x60FC, 0x2141, 0x60FD, 0x60FD, 0x3FA8,
+ 0x60FE, 0x60FE, 0x2142, 0x60FF, 0x60FF, 0x2148, 0x6100, 0x6100, 0x0C56,
+ 0x6101, 0x6101, 0x0E0E, 0x6103, 0x6103, 0x2144, 0x6104, 0x6104, 0x2149,
+ 0x6105, 0x6105, 0x213D, 0x6106, 0x6106, 0x0E18, 0x6107, 0x6107, 0x3C35,
+ 0x6108, 0x6108, 0x0E0F, 0x6109, 0x6109, 0x0C55, 0x610A, 0x610A, 0x213B,
+ 0x610B, 0x610B, 0x214A, 0x610C, 0x610C, 0x3C87, 0x610D, 0x610D, 0x0E17,
+ 0x610E, 0x610E, 0x0C53, 0x610F, 0x610F, 0x0E08, 0x6110, 0x6110, 0x2147,
+ 0x6112, 0x6112, 0x0C57, 0x6113, 0x6113, 0x213F, 0x6114, 0x6114, 0x2139,
+ 0x6115, 0x6115, 0x0C4D, 0x6116, 0x6116, 0x213C, 0x6118, 0x6118, 0x2145,
+ 0x6119, 0x6119, 0x3EF6, 0x611A, 0x611A, 0x0E07, 0x611B, 0x611B, 0x0E0C,
+ 0x611C, 0x611C, 0x0C4A, 0x611D, 0x611D, 0x2146, 0x611F, 0x611F, 0x0E0A,
+ 0x6123, 0x6123, 0x0C4B, 0x6127, 0x6127, 0x0E16, 0x6128, 0x6128, 0x2683,
+ 0x6129, 0x6129, 0x23DF, 0x612B, 0x612B, 0x23D7, 0x612C, 0x612C, 0x2682,
+ 0x612E, 0x612E, 0x23DB, 0x612F, 0x612F, 0x23DD, 0x6130, 0x6130, 0x3F37,
+ 0x6132, 0x6132, 0x23DA, 0x6134, 0x6134, 0x0E15, 0x6136, 0x6136, 0x23D9,
+ 0x6137, 0x6137, 0x0E19, 0x613B, 0x613B, 0x2692, 0x613D, 0x613D, 0x4636,
+ 0x613E, 0x613E, 0x0E14, 0x613F, 0x613F, 0x0FD1, 0x6140, 0x6140, 0x23E0,
+ 0x6141, 0x6141, 0x2684, 0x6142, 0x6142, 0x4174, 0x6144, 0x6144, 0x0E12,
+ 0x6145, 0x6145, 0x23D8, 0x6146, 0x6146, 0x23DC, 0x6147, 0x6147, 0x0FD0,
+ 0x6148, 0x6148, 0x0E09, 0x6149, 0x614A, 0x23D5, 0x614B, 0x614B, 0x0FD2,
+ 0x614C, 0x614C, 0x0E11, 0x614D, 0x614D, 0x0E13, 0x614E, 0x614E, 0x0E10,
+ 0x614F, 0x614F, 0x23DE, 0x6150, 0x6150, 0x3C32, 0x6152, 0x6153, 0x2688,
+ 0x6154, 0x6154, 0x268E, 0x6155, 0x6155, 0x1149, 0x6156, 0x6156, 0x2695,
+ 0x6158, 0x6158, 0x0FD8, 0x6159, 0x6159, 0x3FBA, 0x615A, 0x615A, 0x0FD7,
+ 0x615B, 0x615B, 0x2690, 0x615C, 0x615C, 0x4186, 0x615D, 0x615D, 0x1148,
+ 0x615E, 0x615E, 0x2685, 0x615F, 0x615F, 0x0FD6, 0x6160, 0x6160, 0x494C,
+ 0x6161, 0x6161, 0x2694, 0x6162, 0x6163, 0x0FD4, 0x6164, 0x6164, 0x4173,
+ 0x6165, 0x6165, 0x2691, 0x6166, 0x6166, 0x28DE, 0x6167, 0x6167, 0x1146,
+ 0x6168, 0x6168, 0x0C51, 0x616A, 0x616A, 0x2693, 0x616B, 0x616B, 0x114D,
+ 0x616C, 0x616C, 0x268B, 0x616E, 0x616E, 0x1147, 0x616F, 0x616F, 0x3FC0,
+ 0x6170, 0x6170, 0x114C, 0x6171, 0x6171, 0x2686, 0x6172, 0x6172, 0x268A,
+ 0x6173, 0x6173, 0x2687, 0x6174, 0x6174, 0x268D, 0x6175, 0x6175, 0x0FD9,
+ 0x6176, 0x6176, 0x1145, 0x6177, 0x6177, 0x0FD3, 0x6179, 0x6179, 0x28D0,
+ 0x617A, 0x617A, 0x268F, 0x617C, 0x617C, 0x114B, 0x617D, 0x617D, 0x3FBD,
+ 0x617E, 0x617E, 0x114E, 0x6180, 0x6180, 0x268C, 0x6181, 0x6181, 0x4177,
+ 0x6182, 0x6182, 0x114A, 0x6183, 0x6183, 0x28CF, 0x6187, 0x6187, 0x417A,
+ 0x6189, 0x6189, 0x28D4, 0x618A, 0x618A, 0x12B1, 0x618B, 0x618B, 0x28CE,
+ 0x618C, 0x618C, 0x2B4D, 0x618D, 0x618D, 0x28DD, 0x618E, 0x618E, 0x1152,
+ 0x6190, 0x6190, 0x1150, 0x6191, 0x6191, 0x12AF, 0x6192, 0x6192, 0x28DA,
+ 0x6193, 0x6193, 0x28D6, 0x6194, 0x6194, 0x1156, 0x6195, 0x6195, 0x3DE0,
+ 0x6196, 0x6196, 0x2B44, 0x6198, 0x6198, 0x3A55, 0x6199, 0x6199, 0x3A54,
+ 0x619A, 0x619A, 0x1154, 0x619B, 0x619B, 0x28D5, 0x619C, 0x619C, 0x4002,
+ 0x619D, 0x619D, 0x2B42, 0x619F, 0x619F, 0x28D9, 0x61A1, 0x61A1, 0x28DC,
+ 0x61A2, 0x61A2, 0x28D3, 0x61A4, 0x61A4, 0x1155, 0x61A7, 0x61A7, 0x114F,
+ 0x61A8, 0x61A8, 0x2B43, 0x61A9, 0x61A9, 0x12B0, 0x61AA, 0x61AA, 0x28DB,
+ 0x61AB, 0x61AB, 0x1151, 0x61AC, 0x61AC, 0x1153, 0x61AD, 0x61AD, 0x28D8,
+ 0x61AE, 0x61AE, 0x1157, 0x61AF, 0x61AF, 0x28D7, 0x61B0, 0x61B0, 0x28D2,
+ 0x61B1, 0x61B1, 0x28D1, 0x61B2, 0x61B2, 0x12AE, 0x61B3, 0x61B3, 0x28DF,
+ 0x61B4, 0x61B4, 0x2B46, 0x61B5, 0x61B5, 0x2D60, 0x61B6, 0x61B6, 0x12B3,
+ 0x61B7, 0x61B7, 0x4639, 0x61B8, 0x61B8, 0x2B4C, 0x61B9, 0x61B9, 0x43BF,
+ 0x61BA, 0x61BA, 0x2B4A, 0x61BC, 0x61BC, 0x2D61, 0x61BE, 0x61BE, 0x12B4,
+ 0x61BF, 0x61BF, 0x2B4B, 0x61C0, 0x61C0, 0x3A50, 0x61C1, 0x61C1, 0x2B48,
+ 0x61C2, 0x61C2, 0x13D1, 0x61C3, 0x61C3, 0x2D5F, 0x61C5, 0x61C5, 0x2B45,
+ 0x61C6, 0x61C6, 0x2B47, 0x61C7, 0x61C7, 0x13D2, 0x61C8, 0x61C8, 0x12B6,
+ 0x61C9, 0x61C9, 0x13D0, 0x61CA, 0x61CA, 0x12B5, 0x61CB, 0x61CB, 0x13D4,
+ 0x61CC, 0x61CC, 0x2B49, 0x61CD, 0x61CD, 0x12B2, 0x61CF, 0x61CF, 0x463A,
+ 0x61D0, 0x61D0, 0x4181, 0x61D3, 0x61D3, 0x417E, 0x61D6, 0x61D6, 0x2F26,
+ 0x61D8, 0x61D8, 0x2F1E, 0x61DA, 0x61DA, 0x38B1, 0x61DE, 0x61DE, 0x2D67,
+ 0x61DF, 0x61DF, 0x2F1F, 0x61E0, 0x61E0, 0x2D63, 0x61E2, 0x61E2, 0x3FC5,
+ 0x61E3, 0x61E3, 0x14D0, 0x61E4, 0x61E4, 0x2D65, 0x61E5, 0x61E5, 0x2D64,
+ 0x61E6, 0x61E6, 0x13D3, 0x61E7, 0x61E7, 0x2D62, 0x61E8, 0x61E8, 0x2D66,
+ 0x61E9, 0x61E9, 0x2F27, 0x61EA, 0x61EA, 0x2F23, 0x61EB, 0x61EB, 0x2F25,
+ 0x61ED, 0x61EE, 0x2F20, 0x61F0, 0x61F0, 0x2F24, 0x61F1, 0x61F1, 0x2F22,
+ 0x61F2, 0x61F2, 0x157E, 0x61F5, 0x61F5, 0x1581, 0x61F6, 0x61F6, 0x1580,
+ 0x61F7, 0x61F7, 0x157F, 0x61F8, 0x61F8, 0x1614, 0x61F9, 0x61F9, 0x31D3,
+ 0x61FA, 0x61FA, 0x1615, 0x61FB, 0x61FB, 0x308F, 0x61FC, 0x61FC, 0x1670,
+ 0x61FD, 0x61FD, 0x32D1, 0x61FE, 0x61FE, 0x1671, 0x61FF, 0x61FF, 0x16C4,
+ 0x6200, 0x6200, 0x16F8, 0x6201, 0x6201, 0x3417, 0x6203, 0x6204, 0x3418,
+ 0x6207, 0x6207, 0x3533, 0x6208, 0x6208, 0x02D1, 0x6209, 0x6209, 0x17A8,
+ 0x620A, 0x620A, 0x0341, 0x620C, 0x620D, 0x03D1, 0x620E, 0x620E, 0x03D0,
+ 0x6210, 0x6210, 0x03D3, 0x6211, 0x6211, 0x04A2, 0x6212, 0x6212, 0x04A1,
+ 0x6214, 0x6214, 0x1991, 0x6215, 0x6215, 0x05D1, 0x6216, 0x6216, 0x05D0,
+ 0x6219, 0x6219, 0x1CA0, 0x621A, 0x621B, 0x0A97, 0x621F, 0x621F, 0x0C58,
+ 0x6220, 0x6220, 0x23E1, 0x6221, 0x6222, 0x0E1A, 0x6223, 0x6223, 0x23E3,
+ 0x6224, 0x6224, 0x23E5, 0x6225, 0x6225, 0x23E4, 0x6227, 0x6227, 0x2697,
+ 0x6229, 0x6229, 0x2696, 0x622A, 0x622A, 0x0FDA, 0x622B, 0x622B, 0x2698,
+ 0x622C, 0x622C, 0x463C, 0x622D, 0x622D, 0x28E0, 0x622E, 0x622E, 0x1158,
+ 0x6230, 0x6230, 0x12B7, 0x6232, 0x6232, 0x13D5, 0x6233, 0x6233, 0x14D1,
+ 0x6234, 0x6234, 0x13D6, 0x6236, 0x6236, 0x02D2, 0x6237, 0x6237, 0x451A,
+ 0x6239, 0x6239, 0x3FC2, 0x623A, 0x623A, 0x188D, 0x623D, 0x623D, 0x1992,
+ 0x623E, 0x623E, 0x05D3, 0x623F, 0x623F, 0x05D2, 0x6240, 0x6240, 0x05D4,
+ 0x6241, 0x6241, 0x072F, 0x6242, 0x6243, 0x1AEC, 0x6246, 0x6246, 0x1CA1,
+ 0x6247, 0x6247, 0x08C2, 0x6248, 0x6248, 0x0A99, 0x6249, 0x6249, 0x0C59,
+ 0x624A, 0x624A, 0x214B, 0x624B, 0x624B, 0x02D3, 0x624C, 0x624C, 0x44EC,
+ 0x624D, 0x624D, 0x0291, 0x624E, 0x624E, 0x02D4, 0x6250, 0x6250, 0x17A9,
+ 0x6251, 0x6251, 0x0345, 0x6252, 0x6252, 0x0344, 0x6253, 0x6254, 0x0342,
+ 0x6258, 0x6258, 0x03D6, 0x6259, 0x6259, 0x17F2, 0x625A, 0x625A, 0x17F4,
+ 0x625B, 0x625B, 0x03D5, 0x625C, 0x625C, 0x17EC, 0x625E, 0x625E, 0x17ED,
+ 0x6260, 0x6260, 0x17F3, 0x6261, 0x6261, 0x17EF, 0x6262, 0x6262, 0x17F1,
+ 0x6263, 0x6263, 0x03D4, 0x6264, 0x6264, 0x17EE, 0x6265, 0x6265, 0x17F5,
+ 0x6266, 0x6266, 0x17F0, 0x6268, 0x6268, 0x3F15, 0x626D, 0x626D, 0x04A9,
+ 0x626E, 0x626E, 0x04B2, 0x626F, 0x626F, 0x04B0, 0x6270, 0x6270, 0x1897,
+ 0x6271, 0x6271, 0x1894, 0x6272, 0x6272, 0x189C, 0x6273, 0x6273, 0x04AE,
+ 0x6274, 0x6274, 0x189D, 0x6276, 0x6276, 0x04A7, 0x6277, 0x6277, 0x189A,
+ 0x6279, 0x6279, 0x04AD, 0x627A, 0x627A, 0x1896, 0x627B, 0x627B, 0x1895,
+ 0x627C, 0x627C, 0x04AB, 0x627D, 0x627D, 0x189B, 0x627E, 0x627E, 0x04AC,
+ 0x627F, 0x627F, 0x05D5, 0x6280, 0x6280, 0x04A6, 0x6281, 0x6281, 0x1898,
+ 0x6282, 0x6282, 0x3F86, 0x6283, 0x6283, 0x188E, 0x6284, 0x6284, 0x04A3,
+ 0x6285, 0x6285, 0x3F50, 0x6286, 0x6286, 0x04B6, 0x6287, 0x6287, 0x1893,
+ 0x6288, 0x6288, 0x1899, 0x6289, 0x6289, 0x04A8, 0x628A, 0x628A, 0x04AA,
+ 0x628C, 0x628C, 0x188F, 0x628E, 0x628F, 0x1890, 0x6290, 0x6290, 0x43C0,
+ 0x6291, 0x6291, 0x04B5, 0x6292, 0x6292, 0x04AF, 0x6293, 0x6293, 0x04B4,
+ 0x6294, 0x6294, 0x1892, 0x6295, 0x6295, 0x04B3, 0x6296, 0x6296, 0x04A5,
+ 0x6297, 0x6297, 0x04A4, 0x6298, 0x6298, 0x04B1, 0x629D, 0x629D, 0x3E96,
+ 0x62A4, 0x62A4, 0x3A69, 0x62A6, 0x62A6, 0x3FC1, 0x62A8, 0x62A8, 0x05E3,
+ 0x62A9, 0x62A9, 0x199E, 0x62AA, 0x62AA, 0x1997, 0x62AB, 0x62AB, 0x05DE,
+ 0x62AC, 0x62AC, 0x05F1, 0x62AD, 0x62AD, 0x1993, 0x62AE, 0x62AE, 0x199A,
+ 0x62AF, 0x62AF, 0x199C, 0x62B0, 0x62B0, 0x199F, 0x62B1, 0x62B1, 0x05EC,
+ 0x62B3, 0x62B3, 0x199B, 0x62B4, 0x62B4, 0x1994, 0x62B5, 0x62B5, 0x05EA,
+ 0x62B6, 0x62B6, 0x1998, 0x62B8, 0x62B8, 0x19A0, 0x62B9, 0x62B9, 0x05DB,
+ 0x62BB, 0x62BB, 0x199D, 0x62BC, 0x62BC, 0x05E5, 0x62BD, 0x62BD, 0x05E4,
+ 0x62BE, 0x62BE, 0x1996, 0x62BF, 0x62BF, 0x05D9, 0x62C2, 0x62C2, 0x05DA,
+ 0x62C3, 0x62C3, 0x3D8F, 0x62C4, 0x62C4, 0x05D8, 0x62C5, 0x62C5, 0x418A,
+ 0x62C6, 0x62C6, 0x05F0, 0x62C7, 0x62C7, 0x05E8, 0x62C8, 0x62C8, 0x05E2,
+ 0x62C9, 0x62C9, 0x05D6, 0x62CA, 0x62CA, 0x1999, 0x62CB, 0x62CB, 0x05E1,
+ 0x62CC, 0x62CC, 0x05D7, 0x62CD, 0x62CD, 0x05E9, 0x62CE, 0x62CE, 0x05F2,
+ 0x62CF, 0x62CF, 0x1AEE, 0x62D0, 0x62D0, 0x05E6, 0x62D1, 0x62D1, 0x1995,
+ 0x62D2, 0x62D2, 0x05DC, 0x62D3, 0x62D4, 0x05DF, 0x62D5, 0x62D5, 0x418C,
+ 0x62D6, 0x62D7, 0x05EE, 0x62D8, 0x62D8, 0x05ED, 0x62D9, 0x62D9, 0x05E7,
+ 0x62DA, 0x62DA, 0x05EB, 0x62DB, 0x62DB, 0x05DD, 0x62DC, 0x62DC, 0x0730,
+ 0x62DF, 0x62DF, 0x401C, 0x62E5, 0x62E5, 0x463D, 0x62EB, 0x62EB, 0x1AF4,
+ 0x62EC, 0x62EC, 0x073C, 0x62ED, 0x62ED, 0x0734, 0x62EE, 0x62EE, 0x0736,
+ 0x62EF, 0x62EF, 0x073B, 0x62F0, 0x62F0, 0x1B00, 0x62F1, 0x62F1, 0x0739,
+ 0x62F2, 0x62F2, 0x1CA2, 0x62F3, 0x62F3, 0x08C3, 0x62F4, 0x62F4, 0x073E,
+ 0x62F5, 0x62F5, 0x1AF1, 0x62F6, 0x62F6, 0x1AF9, 0x62F7, 0x62F7, 0x073A,
+ 0x62F8, 0x62F8, 0x1AF8, 0x62F9, 0x62F9, 0x1AF5, 0x62FA, 0x62FA, 0x1AFD,
+ 0x62FB, 0x62FB, 0x1AFF, 0x62FC, 0x62FC, 0x0733, 0x62FD, 0x62FD, 0x0737,
+ 0x62FE, 0x62FE, 0x073D, 0x62FF, 0x62FF, 0x08C5, 0x6300, 0x6300, 0x1AFA,
+ 0x6301, 0x6301, 0x0735, 0x6302, 0x6302, 0x0740, 0x6303, 0x6303, 0x1AF3,
+ 0x6307, 0x6307, 0x0738, 0x6308, 0x6308, 0x08C4, 0x6309, 0x6309, 0x0732,
+ 0x630B, 0x630B, 0x1AF0, 0x630C, 0x630C, 0x1AF7, 0x630D, 0x630D, 0x1AEF,
+ 0x630E, 0x630E, 0x1AF2, 0x630F, 0x630F, 0x1AF6, 0x6310, 0x6310, 0x1CA3,
+ 0x6311, 0x6311, 0x073F, 0x6313, 0x6314, 0x1AFB, 0x6315, 0x6315, 0x1AFE,
+ 0x6316, 0x6316, 0x0731, 0x6318, 0x6318, 0x43C1, 0x6328, 0x6328, 0x08D3,
+ 0x6329, 0x6329, 0x1CAF, 0x632A, 0x632B, 0x08D1, 0x632C, 0x632C, 0x1CA5,
+ 0x632D, 0x632D, 0x1CB5, 0x632E, 0x632E, 0x3EDD, 0x632F, 0x632F, 0x08C8,
+ 0x6331, 0x6331, 0x3A65, 0x6332, 0x6332, 0x1EED, 0x6333, 0x6333, 0x1CB7,
+ 0x6334, 0x6334, 0x1CB1, 0x6335, 0x6335, 0x3F16, 0x6336, 0x6336, 0x1CA8,
+ 0x6337, 0x6337, 0x3A63, 0x6338, 0x6338, 0x1CBA, 0x6339, 0x6339, 0x1CAB,
+ 0x633A, 0x633A, 0x08CE, 0x633B, 0x633B, 0x1F04, 0x633C, 0x633C, 0x1CAE,
+ 0x633D, 0x633D, 0x08D0, 0x633E, 0x633E, 0x08C7, 0x6340, 0x6340, 0x1CBC,
+ 0x6341, 0x6341, 0x1CB0, 0x6342, 0x6342, 0x08CA, 0x6343, 0x6343, 0x1CA9,
+ 0x6344, 0x6345, 0x1CA6, 0x6346, 0x6346, 0x08CB, 0x6347, 0x6347, 0x1CB6,
+ 0x6348, 0x6348, 0x1CBD, 0x6349, 0x6349, 0x08CD, 0x634A, 0x634A, 0x1CAD,
+ 0x634B, 0x634B, 0x1CAC, 0x634C, 0x634C, 0x08D5, 0x634D, 0x634D, 0x08D4,
+ 0x634E, 0x634E, 0x08C6, 0x634F, 0x634F, 0x08CC, 0x6350, 0x6350, 0x08CF,
+ 0x6351, 0x6351, 0x1CB9, 0x6354, 0x6354, 0x1CB3, 0x6355, 0x6355, 0x08C9,
+ 0x6356, 0x6356, 0x1CA4, 0x6357, 0x6357, 0x1CBB, 0x6358, 0x6358, 0x1CB2,
+ 0x6359, 0x6359, 0x1CB4, 0x635A, 0x635A, 0x1CB8, 0x6364, 0x6364, 0x3FC7,
+ 0x6365, 0x6365, 0x1EEE, 0x6367, 0x6367, 0x0AA1, 0x6368, 0x6368, 0x0AB5,
+ 0x6369, 0x6369, 0x0AB4, 0x636B, 0x636B, 0x0AA9, 0x636C, 0x636C, 0x418E,
+ 0x636D, 0x636D, 0x1F00, 0x636E, 0x636E, 0x1EFC, 0x636F, 0x636F, 0x1EF9,
+ 0x6370, 0x6370, 0x1F0B, 0x6371, 0x6371, 0x0AA4, 0x6372, 0x6372, 0x0A9C,
+ 0x6375, 0x6375, 0x1EFE, 0x6376, 0x6376, 0x0C69, 0x6377, 0x6377, 0x0AA0,
+ 0x6378, 0x6378, 0x1F06, 0x6379, 0x6379, 0x4367, 0x637A, 0x637A, 0x0AB6,
+ 0x637B, 0x637B, 0x0AB3, 0x637C, 0x637C, 0x1F02, 0x637D, 0x637D, 0x1EF1,
+ 0x637F, 0x637F, 0x3F4B, 0x6380, 0x6380, 0x0AB2, 0x6381, 0x6381, 0x1F08,
+ 0x6382, 0x6382, 0x1EF0, 0x6383, 0x6383, 0x0AA7, 0x6384, 0x6384, 0x0AAB,
+ 0x6385, 0x6385, 0x1F07, 0x6387, 0x6387, 0x1EFA, 0x6388, 0x6388, 0x0AAC,
+ 0x6389, 0x6389, 0x0AA6, 0x638A, 0x638A, 0x1EEF, 0x638B, 0x638B, 0x4188,
+ 0x638C, 0x638C, 0x0C5B, 0x638D, 0x638D, 0x1F0A, 0x638E, 0x638E, 0x1EF8,
+ 0x638F, 0x638F, 0x0AB1, 0x6390, 0x6390, 0x1EFB, 0x6391, 0x6391, 0x1F09,
+ 0x6392, 0x6392, 0x0AB0, 0x6394, 0x6394, 0x214C, 0x6396, 0x6396, 0x0A9D,
+ 0x6397, 0x6397, 0x1EF6, 0x6398, 0x6398, 0x0AA2, 0x6399, 0x6399, 0x0AAD,
+ 0x639B, 0x639B, 0x0AA8, 0x639C, 0x639C, 0x1EFF, 0x639D, 0x639D, 0x1EF5,
+ 0x639E, 0x639E, 0x1EF3, 0x639F, 0x639F, 0x1F05, 0x63A0, 0x63A0, 0x0A9A,
+ 0x63A1, 0x63A1, 0x0AAE, 0x63A2, 0x63A2, 0x0A9E, 0x63A3, 0x63A3, 0x0C5A,
+ 0x63A4, 0x63A4, 0x1F03, 0x63A5, 0x63A5, 0x0A9F, 0x63A7, 0x63A7, 0x0A9B,
+ 0x63A8, 0x63A8, 0x0AAA, 0x63A9, 0x63A9, 0x0AA5, 0x63AA, 0x63AA, 0x0AA3,
+ 0x63AB, 0x63AB, 0x1EF7, 0x63AC, 0x63AC, 0x0AAF, 0x63AD, 0x63AD, 0x1EF4,
+ 0x63AE, 0x63AE, 0x1F01, 0x63AF, 0x63AF, 0x1EFD, 0x63B0, 0x63B0, 0x214E,
+ 0x63B1, 0x63B1, 0x214D, 0x63B9, 0x63B9, 0x3E9D, 0x63BD, 0x63BD, 0x1EF2,
+ 0x63BE, 0x63BE, 0x215E, 0x63C0, 0x63C0, 0x0C5D, 0x63C1, 0x63C1, 0x46A8,
+ 0x63C2, 0x63C2, 0x2164, 0x63C3, 0x63C3, 0x2153, 0x63C4, 0x63C4, 0x2161,
+ 0x63C5, 0x63C5, 0x23E6, 0x63C6, 0x63C6, 0x0C60, 0x63C7, 0x63C7, 0x2165,
+ 0x63C8, 0x63C8, 0x2168, 0x63C9, 0x63C9, 0x0C5F, 0x63CA, 0x63CA, 0x2156,
+ 0x63CB, 0x63CB, 0x2167, 0x63CC, 0x63CC, 0x2166, 0x63CD, 0x63CD, 0x0C61,
+ 0x63CE, 0x63CE, 0x214F, 0x63CF, 0x63CF, 0x0C5C, 0x63D0, 0x63D0, 0x0C64,
+ 0x63D1, 0x63D1, 0x3A66, 0x63D2, 0x63D2, 0x0C62, 0x63D3, 0x63D3, 0x2163,
+ 0x63D5, 0x63D5, 0x2159, 0x63D6, 0x63D6, 0x0C66, 0x63D7, 0x63D7, 0x216A,
+ 0x63D8, 0x63D8, 0x2162, 0x63D9, 0x63D9, 0x216B, 0x63DA, 0x63DA, 0x0C6E,
+ 0x63DB, 0x63DB, 0x0C6C, 0x63DC, 0x63DC, 0x2160, 0x63DD, 0x63DD, 0x215F,
+ 0x63DE, 0x63DE, 0x3E60, 0x63DF, 0x63DF, 0x215D, 0x63E0, 0x63E0, 0x2157,
+ 0x63E1, 0x63E1, 0x0C65, 0x63E2, 0x63E2, 0x4641, 0x63E3, 0x63E3, 0x0C63,
+ 0x63E4, 0x63E4, 0x1CAA, 0x63E5, 0x63E5, 0x2150, 0x63E6, 0x63E6, 0x489F,
+ 0x63E7, 0x63E7, 0x2404, 0x63E8, 0x63E8, 0x2151, 0x63E9, 0x63E9, 0x0C5E,
+ 0x63EA, 0x63EA, 0x0C6B, 0x63EB, 0x63EB, 0x23E8, 0x63ED, 0x63EE, 0x0C67,
+ 0x63EF, 0x63EF, 0x2152, 0x63F0, 0x63F0, 0x2169, 0x63F1, 0x63F1, 0x23E7,
+ 0x63F2, 0x63F2, 0x215A, 0x63F3, 0x63F3, 0x2155, 0x63F4, 0x63F4, 0x0C6A,
+ 0x63F5, 0x63F5, 0x215B, 0x63F6, 0x63F6, 0x2158, 0x63F8, 0x63F8, 0x4192,
+ 0x63F9, 0x63F9, 0x0C6F, 0x63FB, 0x63FB, 0x4642, 0x63FC, 0x63FC, 0x3E9C,
+ 0x63FE, 0x63FE, 0x3E9E, 0x6406, 0x6406, 0x0E2A, 0x6407, 0x6407, 0x4643,
+ 0x6409, 0x6409, 0x23EB, 0x640A, 0x640A, 0x23FE, 0x640B, 0x640B, 0x2403,
+ 0x640C, 0x640C, 0x23F7, 0x640D, 0x640D, 0x0E26, 0x640E, 0x640E, 0x2408,
+ 0x640F, 0x640F, 0x0E23, 0x6410, 0x6410, 0x23E9, 0x6412, 0x6412, 0x23EA,
+ 0x6413, 0x6413, 0x0E1C, 0x6414, 0x6414, 0x0E25, 0x6415, 0x6415, 0x23F1,
+ 0x6416, 0x6417, 0x0E28, 0x6418, 0x6418, 0x23F2, 0x641A, 0x641A, 0x23FF,
+ 0x641B, 0x641B, 0x2405, 0x641C, 0x641C, 0x0E24, 0x641E, 0x641E, 0x0E1E,
+ 0x641F, 0x641F, 0x23F0, 0x6420, 0x6420, 0x23EC, 0x6421, 0x6421, 0x2407,
+ 0x6422, 0x6423, 0x23F5, 0x6424, 0x6424, 0x23ED, 0x6425, 0x6425, 0x2401,
+ 0x6426, 0x6426, 0x23F8, 0x6427, 0x6427, 0x2402, 0x6428, 0x6428, 0x23FA,
+ 0x642A, 0x642A, 0x0E1F, 0x642B, 0x642B, 0x2699, 0x642C, 0x642C, 0x0E22,
+ 0x642D, 0x642D, 0x0E20, 0x642E, 0x642E, 0x2406, 0x642F, 0x642F, 0x23FD,
+ 0x6430, 0x6430, 0x23F9, 0x6432, 0x6432, 0x45D9, 0x6433, 0x6433, 0x23EE,
+ 0x6434, 0x6434, 0x0FE4, 0x6435, 0x6435, 0x23FC, 0x6436, 0x6436, 0x0E27,
+ 0x6437, 0x6437, 0x23F4, 0x6438, 0x6438, 0x4191, 0x6439, 0x6439, 0x23F3,
+ 0x643A, 0x643A, 0x419D, 0x643B, 0x643B, 0x3A6B, 0x643D, 0x643D, 0x0E21,
+ 0x643E, 0x643E, 0x0E1D, 0x643F, 0x643F, 0x26AE, 0x6440, 0x6440, 0x2400,
+ 0x6441, 0x6441, 0x23FB, 0x6443, 0x6443, 0x23EF, 0x644B, 0x644B, 0x26A9,
+ 0x644D, 0x644D, 0x269A, 0x644E, 0x644E, 0x26A5, 0x6450, 0x6450, 0x26AC,
+ 0x6451, 0x6451, 0x0FE2, 0x6452, 0x6452, 0x0C6D, 0x6453, 0x6453, 0x26AA,
+ 0x6454, 0x6454, 0x0FDD, 0x6458, 0x6458, 0x0FDC, 0x6459, 0x6459, 0x26B1,
+ 0x645A, 0x645A, 0x43C2, 0x645B, 0x645B, 0x269B, 0x645C, 0x645C, 0x26A8,
+ 0x645D, 0x645D, 0x269C, 0x645E, 0x645E, 0x26A7, 0x645F, 0x645F, 0x0FE0,
+ 0x6460, 0x6460, 0x26AB, 0x6461, 0x6461, 0x215C, 0x6465, 0x6465, 0x26B2,
+ 0x6466, 0x6466, 0x26A3, 0x6467, 0x6467, 0x0FE3, 0x6468, 0x6468, 0x28EE,
+ 0x6469, 0x6469, 0x1159, 0x646B, 0x646B, 0x26B0, 0x646C, 0x646C, 0x26AF,
+ 0x646D, 0x646D, 0x0FE5, 0x646E, 0x646E, 0x28E1, 0x646F, 0x646F, 0x115A,
+ 0x6470, 0x6470, 0x28E2, 0x6471, 0x6471, 0x3A5B, 0x6472, 0x6473, 0x269F,
+ 0x6474, 0x6474, 0x269D, 0x6475, 0x6475, 0x26A2, 0x6476, 0x6476, 0x269E,
+ 0x6477, 0x6477, 0x26B3, 0x6478, 0x6478, 0x0FDF, 0x6479, 0x6479, 0x115B,
+ 0x647A, 0x647A, 0x0FE1, 0x647B, 0x647B, 0x0FE6, 0x647C, 0x647C, 0x436C,
+ 0x647D, 0x647D, 0x26A1, 0x647F, 0x647F, 0x26AD, 0x6482, 0x6482, 0x26A6,
+ 0x6485, 0x6485, 0x28E5, 0x6487, 0x6487, 0x0FDB, 0x6488, 0x6488, 0x115E,
+ 0x6489, 0x6489, 0x2B54, 0x648A, 0x648A, 0x28EA, 0x648B, 0x648B, 0x28E9,
+ 0x648C, 0x648C, 0x28EB, 0x648D, 0x648D, 0x4323, 0x648F, 0x648F, 0x28E8,
+ 0x6490, 0x6490, 0x115F, 0x6491, 0x6491, 0x43C3, 0x6492, 0x6492, 0x1165,
+ 0x6493, 0x6493, 0x1162, 0x6495, 0x6495, 0x1163, 0x6496, 0x6496, 0x28E3,
+ 0x6497, 0x6497, 0x28E6, 0x6498, 0x6498, 0x28F0, 0x6499, 0x6499, 0x116B,
+ 0x649A, 0x649A, 0x1169, 0x649C, 0x649C, 0x28E7, 0x649D, 0x649D, 0x2154,
+ 0x649E, 0x649E, 0x115C, 0x649F, 0x649F, 0x28ED, 0x64A0, 0x64A0, 0x28E4,
+ 0x64A2, 0x64A2, 0x116C, 0x64A3, 0x64A3, 0x28EC, 0x64A4, 0x64A4, 0x0FDE,
+ 0x64A5, 0x64A5, 0x1161, 0x64A6, 0x64A6, 0x26A4, 0x64A9, 0x64A9, 0x1164,
+ 0x64AB, 0x64AB, 0x1168, 0x64AC, 0x64AC, 0x116A, 0x64AD, 0x64AD, 0x1167,
+ 0x64AE, 0x64AE, 0x1166, 0x64AF, 0x64AF, 0x42E1, 0x64B0, 0x64B0, 0x1160,
+ 0x64B1, 0x64B1, 0x28EF, 0x64B2, 0x64B2, 0x115D, 0x64B3, 0x64B3, 0x116D,
+ 0x64B4, 0x64B4, 0x4340, 0x64B6, 0x64B6, 0x3A64, 0x64BB, 0x64BC, 0x12BB,
+ 0x64BD, 0x64BD, 0x2B53, 0x64BE, 0x64BE, 0x12C5, 0x64BF, 0x64BF, 0x12C2,
+ 0x64C0, 0x64C0, 0x4645, 0x64C1, 0x64C1, 0x12B9, 0x64C2, 0x64C2, 0x12C0,
+ 0x64C3, 0x64C3, 0x2B55, 0x64C4, 0x64C4, 0x12BE, 0x64C5, 0x64C5, 0x12B8,
+ 0x64C7, 0x64C7, 0x12BF, 0x64C9, 0x64C9, 0x2B52, 0x64CA, 0x64CA, 0x13D8,
+ 0x64CB, 0x64CB, 0x12BA, 0x64CD, 0x64CD, 0x12C1, 0x64CE, 0x64CE, 0x13D7,
+ 0x64CF, 0x64CF, 0x2B51, 0x64D0, 0x64D0, 0x2B50, 0x64D2, 0x64D2, 0x12C3,
+ 0x64D3, 0x64D3, 0x3F03, 0x64D4, 0x64D4, 0x12C4, 0x64D6, 0x64D6, 0x2B4F,
+ 0x64D7, 0x64D7, 0x2B4E, 0x64D8, 0x64D8, 0x13D9, 0x64D9, 0x64D9, 0x2B58,
+ 0x64DA, 0x64DA, 0x12BD, 0x64DB, 0x64DB, 0x2B56, 0x64DD, 0x64DD, 0x431E,
+ 0x64E0, 0x64E0, 0x13DA, 0x64E1, 0x64E1, 0x4199, 0x64E2, 0x64E2, 0x13DF,
+ 0x64E3, 0x64E3, 0x2D6A, 0x64E4, 0x64E4, 0x2D6C, 0x64E5, 0x64E5, 0x419A,
+ 0x64E6, 0x64E6, 0x13DC, 0x64E7, 0x64E7, 0x37A8, 0x64E8, 0x64E8, 0x2D6D,
+ 0x64E9, 0x64E9, 0x2D69, 0x64EA, 0x64EA, 0x434A, 0x64EB, 0x64EB, 0x2D6B,
+ 0x64EC, 0x64EC, 0x13DD, 0x64ED, 0x64ED, 0x13E0, 0x64EF, 0x64EF, 0x2D68,
+ 0x64F0, 0x64F0, 0x13DB, 0x64F1, 0x64F1, 0x13DE, 0x64F2, 0x64F2, 0x14D3,
+ 0x64F3, 0x64F3, 0x2B57, 0x64F4, 0x64F4, 0x14D2, 0x64F7, 0x64F7, 0x14D8,
+ 0x64F8, 0x64F8, 0x2F2B, 0x64FA, 0x64FB, 0x14D6, 0x64FC, 0x64FC, 0x2F2E,
+ 0x64FD, 0x64FD, 0x2F2A, 0x64FE, 0x64FE, 0x14D4, 0x64FF, 0x64FF, 0x2F28,
+ 0x6500, 0x6500, 0x1582, 0x6501, 0x6501, 0x2F2C, 0x6503, 0x6503, 0x2F2D,
+ 0x6504, 0x6504, 0x2F29, 0x6506, 0x6506, 0x14D5, 0x6507, 0x6507, 0x3090,
+ 0x6509, 0x6509, 0x3093, 0x650A, 0x650A, 0x4536, 0x650C, 0x650C, 0x3094,
+ 0x650D, 0x650D, 0x3092, 0x650E, 0x650E, 0x3095, 0x650F, 0x650F, 0x1583,
+ 0x6510, 0x6510, 0x3091, 0x6511, 0x6511, 0x3AA9, 0x6513, 0x6513, 0x31D7,
+ 0x6514, 0x6514, 0x1617, 0x6515, 0x6515, 0x31D6, 0x6516, 0x6516, 0x31D5,
+ 0x6517, 0x6517, 0x31D4, 0x6518, 0x6518, 0x1616, 0x6519, 0x6519, 0x1618,
+ 0x651B, 0x651B, 0x32D2, 0x651C, 0x651C, 0x1673, 0x651D, 0x651D, 0x1672,
+ 0x651E, 0x651E, 0x4187, 0x651F, 0x651F, 0x3EC0, 0x6520, 0x6520, 0x3382,
+ 0x6521, 0x6521, 0x3381, 0x6522, 0x6522, 0x3384, 0x6523, 0x6523, 0x16F9,
+ 0x6524, 0x6524, 0x16C5, 0x6525, 0x6525, 0x341B, 0x6526, 0x6526, 0x3383,
+ 0x6529, 0x6529, 0x341A, 0x652A, 0x652A, 0x16FB, 0x652B, 0x652B, 0x16FA,
+ 0x652C, 0x652C, 0x1721, 0x652D, 0x652D, 0x3484, 0x652E, 0x652E, 0x34CA,
+ 0x652F, 0x652F, 0x02D5, 0x6530, 0x6530, 0x3E62, 0x6532, 0x6532, 0x216C,
+ 0x6533, 0x6533, 0x2B59, 0x6534, 0x6534, 0x022C, 0x6535, 0x6535, 0x44ED,
+ 0x6536, 0x6536, 0x03D7, 0x6537, 0x6537, 0x17F6, 0x6538, 0x6538, 0x04B9,
+ 0x6539, 0x6539, 0x04B7, 0x653B, 0x653B, 0x04B8, 0x653D, 0x653D, 0x19A1,
+ 0x653E, 0x653E, 0x05F3, 0x653F, 0x653F, 0x0741, 0x6541, 0x6541, 0x1B01,
+ 0x6543, 0x6543, 0x1B02, 0x6545, 0x6545, 0x0742, 0x6546, 0x6546, 0x1CBF,
+ 0x6548, 0x6549, 0x08D6, 0x654A, 0x654A, 0x1CBE, 0x654D, 0x654D, 0x419F,
+ 0x654F, 0x654F, 0x0ABD, 0x6551, 0x6551, 0x0AB9, 0x6553, 0x6553, 0x1F0C,
+ 0x6554, 0x6554, 0x0AC0, 0x6555, 0x6555, 0x0ABF, 0x6556, 0x6556, 0x0AB8,
+ 0x6557, 0x6557, 0x0ABB, 0x6558, 0x6558, 0x0ABE, 0x6559, 0x6559, 0x0ABA,
+ 0x655C, 0x655C, 0x2170, 0x655D, 0x655D, 0x0AB7, 0x655E, 0x655E, 0x0C70,
+ 0x655F, 0x655F, 0x41A5, 0x6562, 0x6563, 0x0C72, 0x6564, 0x6564, 0x216F,
+ 0x6565, 0x6565, 0x2172, 0x6566, 0x6566, 0x0C71, 0x6567, 0x6567, 0x216D,
+ 0x6568, 0x6568, 0x2171, 0x656A, 0x656A, 0x216E, 0x656B, 0x656B, 0x3A6C,
+ 0x656C, 0x656C, 0x0E2B, 0x656D, 0x656D, 0x41A4, 0x656F, 0x656F, 0x2409,
+ 0x6572, 0x6572, 0x0FE7, 0x6573, 0x6573, 0x26B4, 0x6574, 0x6574, 0x12C6,
+ 0x6575, 0x6575, 0x116E, 0x6576, 0x6576, 0x28F1, 0x6577, 0x6578, 0x116F,
+ 0x6579, 0x6579, 0x28F3, 0x657A, 0x657A, 0x28F2, 0x657B, 0x657B, 0x28F4,
+ 0x657C, 0x657C, 0x2B5B, 0x657F, 0x657F, 0x2B5A, 0x6580, 0x6580, 0x2D6F,
+ 0x6581, 0x6581, 0x2D6E, 0x6582, 0x6583, 0x13E1, 0x6584, 0x6584, 0x3096,
+ 0x6585, 0x6585, 0x41A3, 0x6586, 0x6586, 0x4648, 0x6587, 0x6587, 0x02D6,
+ 0x6588, 0x6588, 0x410B, 0x6589, 0x6589, 0x4554, 0x658C, 0x658C, 0x2173,
+ 0x6590, 0x6590, 0x0C75, 0x6591, 0x6591, 0x0C74, 0x6592, 0x6592, 0x240A,
+ 0x6594, 0x6594, 0x2F2F, 0x6595, 0x6595, 0x1674, 0x6596, 0x6596, 0x341C,
+ 0x6597, 0x6597, 0x02D7, 0x6599, 0x6599, 0x08D8, 0x659B, 0x659B, 0x0AC2,
+ 0x659C, 0x659C, 0x0AC1, 0x659D, 0x659E, 0x2174, 0x659F, 0x659F, 0x0E2C,
+ 0x65A0, 0x65A0, 0x26B5, 0x65A1, 0x65A1, 0x0FE8, 0x65A2, 0x65A2, 0x2B5C,
+ 0x65A4, 0x65A4, 0x02D8, 0x65A5, 0x65A5, 0x0346, 0x65A7, 0x65A7, 0x05F4,
+ 0x65A8, 0x65A8, 0x19A2, 0x65AA, 0x65AA, 0x1B03, 0x65AB, 0x65AB, 0x0743,
+ 0x65AC, 0x65AC, 0x0AC3, 0x65AE, 0x65AE, 0x2176, 0x65AF, 0x65AF, 0x0C76,
+ 0x65B0, 0x65B0, 0x0E2D, 0x65B2, 0x65B3, 0x28F5, 0x65B5, 0x65B5, 0x41A7,
+ 0x65B6, 0x65B6, 0x2D70, 0x65B7, 0x65B7, 0x14D9, 0x65B8, 0x65B8, 0x34CB,
+ 0x65B9, 0x65B9, 0x02D9, 0x65BB, 0x65BB, 0x19A3, 0x65BC, 0x65BC, 0x05F5,
+ 0x65BD, 0x65BD, 0x0744, 0x65BE, 0x65BE, 0x3E3B, 0x65BF, 0x65BF, 0x1B04,
+ 0x65C1, 0x65C1, 0x08D9, 0x65C2, 0x65C2, 0x1CC3, 0x65C3, 0x65C4, 0x1CC1,
+ 0x65C5, 0x65C5, 0x08DA, 0x65C6, 0x65C6, 0x1CC0, 0x65CB, 0x65CC, 0x0AC5,
+ 0x65CD, 0x65CD, 0x1F0D, 0x65CE, 0x65CE, 0x0AC7, 0x65CF, 0x65CF, 0x0AC4,
+ 0x65D0, 0x65D0, 0x2177, 0x65D1, 0x65D1, 0x41AA, 0x65D2, 0x65D2, 0x2178,
+ 0x65D3, 0x65D3, 0x240B, 0x65D4, 0x65D4, 0x3BA8, 0x65D6, 0x65D6, 0x0FEA,
+ 0x65D7, 0x65D7, 0x0FE9, 0x65DA, 0x65DA, 0x2D71, 0x65DB, 0x65DB, 0x2F30,
+ 0x65DD, 0x65DD, 0x3098, 0x65DE, 0x65DE, 0x3097, 0x65DF, 0x65DF, 0x31D8,
+ 0x65E0, 0x65E0, 0x022D, 0x65E1, 0x65E1, 0x1789, 0x65E2, 0x65E2, 0x0745,
+ 0x65E3, 0x65E3, 0x41AE, 0x65E5, 0x65E5, 0x02DA, 0x65E6, 0x65E6, 0x0347,
+ 0x65E8, 0x65E8, 0x03D9, 0x65E9, 0x65E9, 0x03D8, 0x65EC, 0x65ED, 0x03DA,
+ 0x65EE, 0x65EE, 0x17F8, 0x65EF, 0x65EF, 0x17F7, 0x65F0, 0x65F0, 0x189E,
+ 0x65F1, 0x65F1, 0x04BA, 0x65F2, 0x65F2, 0x18A1, 0x65F3, 0x65F3, 0x18A0,
+ 0x65F4, 0x65F4, 0x189F, 0x65F5, 0x65F5, 0x18A2, 0x65FA, 0x65FA, 0x05F6,
+ 0x65FB, 0x65FB, 0x19A9, 0x65FC, 0x65FC, 0x19A5, 0x65FD, 0x65FD, 0x19AE,
+ 0x65FF, 0x65FF, 0x464A, 0x6600, 0x6600, 0x05FD, 0x6602, 0x6602, 0x05FB,
+ 0x6603, 0x6603, 0x19AA, 0x6604, 0x6604, 0x19A6, 0x6605, 0x6605, 0x19AD,
+ 0x6606, 0x6606, 0x05FA, 0x6607, 0x6607, 0x0601, 0x6608, 0x6608, 0x19A8,
+ 0x6609, 0x6609, 0x19A4, 0x660A, 0x660A, 0x0600, 0x660B, 0x660B, 0x19AB,
+ 0x660C, 0x660C, 0x05F9, 0x660D, 0x660D, 0x19AC, 0x660E, 0x660E, 0x05FC,
+ 0x660F, 0x660F, 0x05FE, 0x6610, 0x6610, 0x19B0, 0x6611, 0x6611, 0x19AF,
+ 0x6612, 0x6612, 0x19A7, 0x6613, 0x6613, 0x05F8, 0x6614, 0x6614, 0x05F7,
+ 0x6615, 0x6615, 0x05FF, 0x6618, 0x6618, 0x41B1, 0x661C, 0x661C, 0x1B09,
+ 0x661D, 0x661D, 0x1B0F, 0x661E, 0x661E, 0x3A93, 0x661F, 0x661F, 0x074B,
+ 0x6620, 0x6620, 0x0748, 0x6621, 0x6621, 0x1B06, 0x6622, 0x6622, 0x1B0B,
+ 0x6623, 0x6623, 0x4295, 0x6624, 0x6624, 0x074E, 0x6625, 0x6625, 0x0746,
+ 0x6626, 0x6626, 0x1B0A, 0x6627, 0x6627, 0x0749, 0x6628, 0x6628, 0x074C,
+ 0x662B, 0x662B, 0x1B0D, 0x662D, 0x662D, 0x0747, 0x662E, 0x662E, 0x1B12,
+ 0x662F, 0x662F, 0x074A, 0x6630, 0x6630, 0x3A8D, 0x6631, 0x6631, 0x074D,
+ 0x6632, 0x6632, 0x1B07, 0x6633, 0x6633, 0x1B0C, 0x6634, 0x6634, 0x1B10,
+ 0x6635, 0x6635, 0x1B08, 0x6636, 0x6636, 0x1B05, 0x6639, 0x6639, 0x1B11,
+ 0x663A, 0x663A, 0x1B0E, 0x6641, 0x6641, 0x08E2, 0x6642, 0x6642, 0x08DB,
+ 0x6643, 0x6643, 0x08DE, 0x6644, 0x6644, 0x41B4, 0x6645, 0x6645, 0x08E1,
+ 0x6647, 0x6647, 0x1CC6, 0x6648, 0x6648, 0x3D99, 0x6649, 0x6649, 0x08DC,
+ 0x664A, 0x664A, 0x1CC4, 0x664B, 0x664B, 0x41B7, 0x664C, 0x664C, 0x08E0,
+ 0x664F, 0x664F, 0x08DD, 0x6651, 0x6651, 0x1CC7, 0x6652, 0x6652, 0x08DF,
+ 0x6653, 0x6653, 0x464B, 0x6657, 0x6657, 0x409B, 0x6659, 0x6659, 0x1F11,
+ 0x665A, 0x665A, 0x0AC9, 0x665B, 0x665B, 0x1F10, 0x665C, 0x665C, 0x1F12,
+ 0x665D, 0x665D, 0x0AC8, 0x665E, 0x665E, 0x0ACD, 0x665F, 0x665F, 0x1CC5,
+ 0x6661, 0x6661, 0x1F0F, 0x6662, 0x6662, 0x1F13, 0x6663, 0x6663, 0x3A90,
+ 0x6664, 0x6664, 0x0ACA, 0x6665, 0x6665, 0x1F0E, 0x6666, 0x6666, 0x0ACC,
+ 0x6667, 0x6667, 0x41B9, 0x6668, 0x6668, 0x0ACB, 0x666A, 0x666A, 0x217F,
+ 0x666B, 0x666B, 0x3A8B, 0x666C, 0x666C, 0x217A, 0x666E, 0x666E, 0x0C77,
+ 0x666F, 0x666F, 0x0C7B, 0x6670, 0x6670, 0x0C78, 0x6671, 0x6671, 0x217D,
+ 0x6672, 0x6672, 0x2180, 0x6673, 0x6673, 0x41BB, 0x6674, 0x6674, 0x0C79,
+ 0x6676, 0x6676, 0x0C7A, 0x6677, 0x6677, 0x0C7F, 0x6678, 0x6678, 0x2414,
+ 0x6679, 0x6679, 0x217E, 0x667A, 0x667A, 0x0C7D, 0x667B, 0x667B, 0x217B,
+ 0x667C, 0x667C, 0x2179, 0x667D, 0x667D, 0x469B, 0x667E, 0x667E, 0x0C7E,
+ 0x6680, 0x6680, 0x217C, 0x6684, 0x6684, 0x0E33, 0x6685, 0x6685, 0x4162,
+ 0x6686, 0x6686, 0x240C, 0x6687, 0x6688, 0x0E30, 0x6689, 0x6689, 0x0E2F,
+ 0x668A, 0x668A, 0x2411, 0x668B, 0x668B, 0x2410, 0x668C, 0x668C, 0x240D,
+ 0x668D, 0x668D, 0x0E35, 0x668E, 0x668E, 0x3A89, 0x6690, 0x6690, 0x240F,
+ 0x6691, 0x6691, 0x0C7C, 0x6692, 0x6692, 0x464D, 0x6694, 0x6694, 0x2413,
+ 0x6695, 0x6695, 0x240E, 0x6696, 0x6696, 0x0E32, 0x6697, 0x6697, 0x0E2E,
+ 0x6698, 0x6698, 0x0E34, 0x6699, 0x6699, 0x2412, 0x669A, 0x669A, 0x3D3D,
+ 0x669D, 0x669D, 0x0FED, 0x669F, 0x669F, 0x26B8, 0x66A0, 0x66A0, 0x26B7,
+ 0x66A1, 0x66A1, 0x26B6, 0x66A2, 0x66A2, 0x0FEB, 0x66A4, 0x66A4, 0x40BA,
+ 0x66A8, 0x66A8, 0x0FEC, 0x66A9, 0x66A9, 0x28F9, 0x66AA, 0x66AA, 0x28FC,
+ 0x66AB, 0x66AB, 0x1172, 0x66AD, 0x66AD, 0x4948, 0x66AE, 0x66AE, 0x1171,
+ 0x66AF, 0x66AF, 0x28FD, 0x66B0, 0x66B0, 0x28F8, 0x66B1, 0x66B1, 0x1174,
+ 0x66B2, 0x66B2, 0x28FA, 0x66B3, 0x66B3, 0x40B5, 0x66B4, 0x66B4, 0x1173,
+ 0x66B5, 0x66B5, 0x28F7, 0x66B6, 0x66B6, 0x3E13, 0x66B7, 0x66B7, 0x28FB,
+ 0x66B8, 0x66B8, 0x12CC, 0x66B9, 0x66B9, 0x12C9, 0x66BA, 0x66BA, 0x2B65,
+ 0x66BB, 0x66BB, 0x2B64, 0x66BD, 0x66BD, 0x2B63, 0x66BE, 0x66BE, 0x2B5E,
+ 0x66BF, 0x66BF, 0x3D9A, 0x66C0, 0x66C0, 0x2B5F, 0x66C4, 0x66C4, 0x12CA,
+ 0x66C6, 0x66C6, 0x12C7, 0x66C7, 0x66C7, 0x12CB, 0x66C8, 0x66C8, 0x2B5D,
+ 0x66C9, 0x66C9, 0x12C8, 0x66CA, 0x66CB, 0x2B60, 0x66CC, 0x66CC, 0x2B66,
+ 0x66CD, 0x66CD, 0x40B8, 0x66CE, 0x66CE, 0x3A77, 0x66CF, 0x66CF, 0x2B62,
+ 0x66D2, 0x66D2, 0x2D72, 0x66D6, 0x66D6, 0x13E4, 0x66D8, 0x66D8, 0x2F33,
+ 0x66D9, 0x66D9, 0x13E3, 0x66DA, 0x66DB, 0x2F31, 0x66DC, 0x66DC, 0x14DA,
+ 0x66DD, 0x66DD, 0x1585, 0x66DE, 0x66DE, 0x3099, 0x66E0, 0x66E0, 0x1584,
+ 0x66E3, 0x66E4, 0x31DA, 0x66E6, 0x66E6, 0x1619, 0x66E8, 0x66E8, 0x31D9,
+ 0x66E9, 0x66E9, 0x1675, 0x66EB, 0x66EB, 0x341D, 0x66EC, 0x66EC, 0x16FC,
+ 0x66ED, 0x66EE, 0x3485, 0x66F0, 0x66F0, 0x02DB, 0x66F1, 0x66F1, 0x3E84,
+ 0x66F2, 0x66F3, 0x03DC, 0x66F4, 0x66F4, 0x04BB, 0x66F6, 0x66F6, 0x19B1,
+ 0x66F7, 0x66F7, 0x074F, 0x66F8, 0x66F8, 0x08E3, 0x66F9, 0x66F9, 0x0ACE,
+ 0x66FC, 0x66FC, 0x0A1F, 0x66FE, 0x66FF, 0x0C80, 0x6700, 0x6700, 0x0BF0,
+ 0x6701, 0x6701, 0x2181, 0x6702, 0x6702, 0x41C4, 0x6703, 0x6703, 0x0E36,
+ 0x6704, 0x6704, 0x26BA, 0x6705, 0x6705, 0x26B9, 0x6708, 0x6708, 0x02DC,
+ 0x6709, 0x6709, 0x03DE, 0x670A, 0x670A, 0x19B2, 0x670B, 0x670B, 0x0603,
+ 0x670C, 0x670C, 0x3FE2, 0x670D, 0x670D, 0x0602, 0x670E, 0x670E, 0x3DA1,
+ 0x670F, 0x6710, 0x1B13, 0x6712, 0x6713, 0x1CC8, 0x6714, 0x6715, 0x08E4,
+ 0x6716, 0x6716, 0x464F, 0x6717, 0x6717, 0x08E6, 0x6718, 0x6718, 0x1F14,
+ 0x671B, 0x671B, 0x0AD0, 0x671D, 0x671D, 0x0C83, 0x671E, 0x671E, 0x3D8B,
+ 0x671F, 0x671F, 0x0C82, 0x6720, 0x6720, 0x2415, 0x6721, 0x6721, 0x2522,
+ 0x6722, 0x6722, 0x26BB, 0x6723, 0x6723, 0x2B67, 0x6725, 0x6725, 0x379F,
+ 0x6726, 0x6726, 0x14DB, 0x6727, 0x6727, 0x161A, 0x6728, 0x6728, 0x02DD,
+ 0x672A, 0x672B, 0x034A, 0x672C, 0x672C, 0x0349, 0x672D, 0x672D, 0x034C,
+ 0x672E, 0x672E, 0x0348, 0x6731, 0x6731, 0x03E1, 0x6733, 0x6733, 0x1800,
+ 0x6734, 0x6734, 0x03E0, 0x6735, 0x6735, 0x03E2, 0x6736, 0x6736, 0x3E41,
+ 0x6738, 0x6738, 0x17FB, 0x6739, 0x6739, 0x17FA, 0x673A, 0x673A, 0x17FD,
+ 0x673B, 0x673B, 0x17FC, 0x673C, 0x673C, 0x17FF, 0x673D, 0x673D, 0x03DF,
+ 0x673E, 0x673E, 0x17F9, 0x673F, 0x673F, 0x17FE, 0x6744, 0x6744, 0x401B,
+ 0x6745, 0x6745, 0x18A3, 0x6746, 0x6746, 0x04C5, 0x6747, 0x6747, 0x18A4,
+ 0x6748, 0x6748, 0x18A8, 0x6749, 0x6749, 0x04C4, 0x674B, 0x674B, 0x18AC,
+ 0x674C, 0x674C, 0x18A7, 0x674D, 0x674D, 0x18AA, 0x674E, 0x6751, 0x04BD,
+ 0x6753, 0x6753, 0x04C7, 0x6755, 0x6755, 0x18A6, 0x6756, 0x6756, 0x04C2,
+ 0x6757, 0x6757, 0x04C8, 0x6759, 0x6759, 0x18A5, 0x675A, 0x675A, 0x18AB,
+ 0x675C, 0x675C, 0x04C1, 0x675D, 0x675D, 0x18A9, 0x675E, 0x675E, 0x04C3,
+ 0x675F, 0x675F, 0x04BC, 0x6760, 0x6760, 0x04C6, 0x6761, 0x6761, 0x3D66,
+ 0x6762, 0x6762, 0x41CB, 0x6767, 0x6767, 0x41CA, 0x676A, 0x676A, 0x0618,
+ 0x676C, 0x676C, 0x19B4, 0x676D, 0x676D, 0x0604, 0x676F, 0x6770, 0x060E,
+ 0x6771, 0x6771, 0x0607, 0x6772, 0x6772, 0x0619, 0x6773, 0x6773, 0x0609,
+ 0x6774, 0x6774, 0x19BC, 0x6775, 0x6775, 0x0614, 0x6776, 0x6776, 0x19B7,
+ 0x6777, 0x6777, 0x060A, 0x6778, 0x6779, 0x19C6, 0x677A, 0x677A, 0x19BF,
+ 0x677B, 0x677B, 0x19B8, 0x677C, 0x677C, 0x0617, 0x677D, 0x677D, 0x19C4,
+ 0x677E, 0x677E, 0x0612, 0x677F, 0x677F, 0x0610, 0x6781, 0x6781, 0x19C5,
+ 0x6783, 0x6783, 0x19C3, 0x6784, 0x6784, 0x19BB, 0x6785, 0x6785, 0x19B3,
+ 0x6786, 0x6786, 0x19BA, 0x6787, 0x6787, 0x060B, 0x6789, 0x6789, 0x0611,
+ 0x678B, 0x678B, 0x0605, 0x678C, 0x678C, 0x19BE, 0x678D, 0x678D, 0x19BD,
+ 0x678E, 0x678E, 0x19B5, 0x678F, 0x678F, 0x46C1, 0x6790, 0x6790, 0x0613,
+ 0x6791, 0x6791, 0x19C1, 0x6792, 0x6792, 0x19B6, 0x6793, 0x6793, 0x0616,
+ 0x6794, 0x6794, 0x19C8, 0x6795, 0x6795, 0x0606, 0x6797, 0x6797, 0x060D,
+ 0x6798, 0x6798, 0x19B9, 0x6799, 0x6799, 0x19C2, 0x679A, 0x679A, 0x0615,
+ 0x679C, 0x679C, 0x0608, 0x679D, 0x679D, 0x060C, 0x679F, 0x679F, 0x19C0,
+ 0x67A0, 0x67A0, 0x3D7A, 0x67A4, 0x67A4, 0x4651, 0x67AC, 0x67AC, 0x41E3,
+ 0x67AE, 0x67AE, 0x1B34, 0x67AF, 0x67AF, 0x0757, 0x67B0, 0x67B0, 0x0764,
+ 0x67B1, 0x67B1, 0x41F4, 0x67B2, 0x67B2, 0x1B2F, 0x67B3, 0x67B3, 0x1B25,
+ 0x67B4, 0x67B4, 0x075D, 0x67B5, 0x67B5, 0x1B23, 0x67B6, 0x67B6, 0x0756,
+ 0x67B7, 0x67B7, 0x1B1E, 0x67B8, 0x67B8, 0x0760, 0x67B9, 0x67B9, 0x1B2B,
+ 0x67BA, 0x67BA, 0x1B18, 0x67BB, 0x67BB, 0x1B1A, 0x67BF, 0x67BF, 0x37FA,
+ 0x67C0, 0x67C0, 0x1B1D, 0x67C1, 0x67C1, 0x1B15, 0x67C2, 0x67C2, 0x1B2A,
+ 0x67C3, 0x67C3, 0x1B3A, 0x67C4, 0x67C4, 0x075B, 0x67C5, 0x67C5, 0x1B1F,
+ 0x67C6, 0x67C6, 0x1B31, 0x67C8, 0x67C8, 0x1B17, 0x67C9, 0x67CA, 0x1B38,
+ 0x67CB, 0x67CB, 0x1B3C, 0x67CC, 0x67CC, 0x1B33, 0x67CD, 0x67CD, 0x1B24,
+ 0x67CE, 0x67CE, 0x1B2C, 0x67CF, 0x67CF, 0x0761, 0x67D0, 0x67D0, 0x0754,
+ 0x67D1, 0x67D1, 0x075C, 0x67D2, 0x67D2, 0x0768, 0x67D3, 0x67D3, 0x0751,
+ 0x67D4, 0x67D4, 0x0753, 0x67D6, 0x67D6, 0x3B58, 0x67D7, 0x67D7, 0x41CE,
+ 0x67D8, 0x67D8, 0x1B1C, 0x67D9, 0x67D9, 0x0765, 0x67DA, 0x67DA, 0x075E,
+ 0x67DB, 0x67DB, 0x1B36, 0x67DC, 0x67DC, 0x1B19, 0x67DD, 0x67DD, 0x0767,
+ 0x67DE, 0x67DE, 0x0762, 0x67DF, 0x67DF, 0x1B22, 0x67E2, 0x67E2, 0x0766,
+ 0x67E3, 0x67E3, 0x1B29, 0x67E4, 0x67E4, 0x1B21, 0x67E5, 0x67E5, 0x075F,
+ 0x67E6, 0x67E6, 0x1B35, 0x67E7, 0x67E7, 0x1B2D, 0x67E9, 0x67E9, 0x0759,
+ 0x67EA, 0x67EA, 0x1B3B, 0x67EB, 0x67EB, 0x1B20, 0x67EC, 0x67EC, 0x0755,
+ 0x67ED, 0x67ED, 0x1B32, 0x67EE, 0x67EE, 0x1B28, 0x67EF, 0x67EF, 0x075A,
+ 0x67F0, 0x67F0, 0x1B2E, 0x67F1, 0x67F1, 0x0752, 0x67F2, 0x67F2, 0x1B16,
+ 0x67F3, 0x67F3, 0x0763, 0x67F4, 0x67F4, 0x08F5, 0x67F5, 0x67F5, 0x0758,
+ 0x67F6, 0x67F6, 0x1B27, 0x67F7, 0x67F7, 0x1B26, 0x67F8, 0x67F8, 0x1B1B,
+ 0x67F9, 0x67F9, 0x3996, 0x67FA, 0x67FA, 0x1B37, 0x67FC, 0x67FC, 0x1B30,
+ 0x67FE, 0x67FE, 0x4555, 0x67FF, 0x67FF, 0x0750, 0x6800, 0x6800, 0x43C7,
+ 0x6801, 0x6801, 0x41D3, 0x6802, 0x6802, 0x3FC8, 0x6803, 0x6803, 0x3D6A,
+ 0x6804, 0x6804, 0x4556, 0x680D, 0x680D, 0x4281, 0x6810, 0x6810, 0x399C,
+ 0x6812, 0x6812, 0x1CDD, 0x6813, 0x6813, 0x08FC, 0x6814, 0x6814, 0x1CDE,
+ 0x6816, 0x6816, 0x1CD2, 0x6817, 0x6817, 0x08F1, 0x6818, 0x6818, 0x08FD,
+ 0x681A, 0x681A, 0x1CCB, 0x681B, 0x681B, 0x4072, 0x681C, 0x681C, 0x1CD4,
+ 0x681D, 0x681D, 0x1CDC, 0x681E, 0x681E, 0x46C2, 0x681F, 0x681F, 0x1CCA,
+ 0x6820, 0x6820, 0x1CE5, 0x6821, 0x6821, 0x08E7, 0x6822, 0x6822, 0x41D0,
+ 0x6825, 0x6825, 0x1CE4, 0x6826, 0x6826, 0x1CDF, 0x6828, 0x6828, 0x1CE0,
+ 0x6829, 0x6829, 0x08EF, 0x682A, 0x682A, 0x08FA, 0x682B, 0x682B, 0x1CD6,
+ 0x682D, 0x682D, 0x1CD7, 0x682E, 0x682E, 0x1CE1, 0x682F, 0x682F, 0x1CD8,
+ 0x6831, 0x6831, 0x1CD3, 0x6832, 0x6833, 0x1CCD, 0x6834, 0x6834, 0x1CDB,
+ 0x6835, 0x6835, 0x1CD5, 0x6836, 0x6836, 0x3E2E, 0x6837, 0x6837, 0x421D,
+ 0x6838, 0x6838, 0x08E8, 0x6839, 0x6839, 0x08EC, 0x683A, 0x683A, 0x1CE3,
+ 0x683B, 0x683B, 0x1CCF, 0x683C, 0x683C, 0x08F8, 0x683D, 0x683D, 0x08F4,
+ 0x683E, 0x683E, 0x4147, 0x6840, 0x6840, 0x08F7, 0x6841, 0x6841, 0x08FE,
+ 0x6842, 0x6842, 0x08ED, 0x6843, 0x6843, 0x08F9, 0x6844, 0x6844, 0x1CDA,
+ 0x6845, 0x6845, 0x08FB, 0x6846, 0x6846, 0x08EA, 0x6847, 0x6847, 0x3BEB,
+ 0x6848, 0x6848, 0x08E9, 0x6849, 0x6849, 0x1CCC, 0x684A, 0x684A, 0x4653,
+ 0x684B, 0x684B, 0x1CD0, 0x684C, 0x684C, 0x08F2, 0x684D, 0x684D, 0x1CE2,
+ 0x684E, 0x684E, 0x1CD9, 0x684F, 0x684F, 0x1CD1, 0x6850, 0x6850, 0x08F6,
+ 0x6851, 0x6851, 0x08F3, 0x6853, 0x6853, 0x08EB, 0x6854, 0x6854, 0x08EE,
+ 0x6855, 0x6855, 0x3D90, 0x6856, 0x6856, 0x3814, 0x685D, 0x685D, 0x41D6,
+ 0x6865, 0x6865, 0x4557, 0x686B, 0x686B, 0x1F29, 0x686D, 0x686E, 0x1F19,
+ 0x686F, 0x686F, 0x1F1E, 0x6871, 0x6871, 0x1F2D, 0x6872, 0x6872, 0x1F2A,
+ 0x6874, 0x6874, 0x1F23, 0x6875, 0x6875, 0x1F22, 0x6876, 0x6876, 0x0AD7,
+ 0x6877, 0x6877, 0x1F26, 0x6878, 0x6878, 0x1F35, 0x6879, 0x6879, 0x1F15,
+ 0x687B, 0x687B, 0x1F36, 0x687C, 0x687C, 0x1F28, 0x687D, 0x687D, 0x1F3A,
+ 0x687E, 0x687E, 0x1F2E, 0x687F, 0x687F, 0x0AD6, 0x6880, 0x6880, 0x1F2C,
+ 0x6881, 0x6881, 0x0AD1, 0x6882, 0x6882, 0x0AE6, 0x6883, 0x6883, 0x0ADC,
+ 0x6884, 0x6884, 0x4654, 0x6885, 0x6885, 0x0AE0, 0x6886, 0x6886, 0x0ADF,
+ 0x6887, 0x6887, 0x1F16, 0x6888, 0x6888, 0x46B7, 0x6889, 0x6889, 0x1F33,
+ 0x688A, 0x688A, 0x1F39, 0x688B, 0x688B, 0x1F31, 0x688C, 0x688C, 0x1F38,
+ 0x688F, 0x688F, 0x1F25, 0x6890, 0x6890, 0x1F17, 0x6891, 0x6891, 0x1F37,
+ 0x6892, 0x6892, 0x1F27, 0x6893, 0x6893, 0x0AD4, 0x6894, 0x6894, 0x0AE1,
+ 0x6896, 0x6896, 0x1F30, 0x6897, 0x6897, 0x0ADA, 0x6898, 0x6898, 0x3AAA,
+ 0x689B, 0x689B, 0x1F2F, 0x689C, 0x689C, 0x1F18, 0x689D, 0x689D, 0x0AE2,
+ 0x689F, 0x689F, 0x0AE4, 0x68A0, 0x68A0, 0x1F32, 0x68A1, 0x68A1, 0x0AE5,
+ 0x68A2, 0x68A2, 0x0AD3, 0x68A3, 0x68A3, 0x1F1F, 0x68A4, 0x68A4, 0x1F34,
+ 0x68A6, 0x68A6, 0x40E4, 0x68A7, 0x68A7, 0x0AD9, 0x68A8, 0x68A8, 0x0AE3,
+ 0x68A9, 0x68A9, 0x1F21, 0x68AA, 0x68AA, 0x1F2B, 0x68AB, 0x68AB, 0x1F1C,
+ 0x68AC, 0x68AC, 0x1F20, 0x68AD, 0x68AD, 0x0ADE, 0x68AE, 0x68AE, 0x1F1B,
+ 0x68AF, 0x68AF, 0x0AD2, 0x68B0, 0x68B0, 0x0ADB, 0x68B1, 0x68B1, 0x0AD8,
+ 0x68B2, 0x68B2, 0x1F24, 0x68B3, 0x68B3, 0x08F0, 0x68B4, 0x68B4, 0x2198,
+ 0x68B5, 0x68B5, 0x0AD5, 0x68B6, 0x68B6, 0x3A9E, 0x68B9, 0x68B9, 0x3D14,
+ 0x68BD, 0x68BD, 0x427C, 0x68C3, 0x68C3, 0x41DC, 0x68C4, 0x68C4, 0x0ADD,
+ 0x68C5, 0x68C5, 0x3C2E, 0x68C6, 0x68C6, 0x219B, 0x68C7, 0x68C7, 0x21B1,
+ 0x68C8, 0x68C8, 0x21A6, 0x68C9, 0x68C9, 0x0C97, 0x68CA, 0x68CA, 0x42EB,
+ 0x68CB, 0x68CB, 0x0C92, 0x68CC, 0x68CC, 0x2195, 0x68CD, 0x68CD, 0x0C93,
+ 0x68CE, 0x68CE, 0x21A5, 0x68D0, 0x68D0, 0x219E, 0x68D1, 0x68D1, 0x21AB,
+ 0x68D2, 0x68D2, 0x0C8F, 0x68D3, 0x68D3, 0x2183, 0x68D4, 0x68D4, 0x21AD,
+ 0x68D5, 0x68D5, 0x0C85, 0x68D6, 0x68D6, 0x218B, 0x68D7, 0x68D7, 0x0C88,
+ 0x68D8, 0x68D8, 0x0C87, 0x68DA, 0x68DA, 0x0C98, 0x68DC, 0x68DC, 0x2185,
+ 0x68DD, 0x68DE, 0x21A7, 0x68DF, 0x68DF, 0x0C8A, 0x68E0, 0x68E0, 0x0C86,
+ 0x68E1, 0x68E1, 0x2193, 0x68E3, 0x68E3, 0x0C91, 0x68E4, 0x68E4, 0x218E,
+ 0x68E6, 0x68E6, 0x21A9, 0x68E7, 0x68E7, 0x0C8D, 0x68E8, 0x68E8, 0x21A1,
+ 0x68E9, 0x68E9, 0x21AE, 0x68EA, 0x68EA, 0x2188, 0x68EB, 0x68EB, 0x218D,
+ 0x68EC, 0x68EC, 0x2187, 0x68EE, 0x68EE, 0x0C8C, 0x68EF, 0x68EF, 0x219A,
+ 0x68F0, 0x68F0, 0x242B, 0x68F1, 0x68F1, 0x2189, 0x68F2, 0x68F2, 0x0C90,
+ 0x68F3, 0x68F3, 0x2192, 0x68F4, 0x68F4, 0x21AA, 0x68F5, 0x68F5, 0x0C8B,
+ 0x68F6, 0x68F6, 0x218F, 0x68F7, 0x68F7, 0x218C, 0x68F8, 0x68F8, 0x219D,
+ 0x68F9, 0x68F9, 0x0C8E, 0x68FA, 0x68FA, 0x0C84, 0x68FB, 0x68FB, 0x0C9A,
+ 0x68FC, 0x68FC, 0x21A0, 0x68FD, 0x68FD, 0x219F, 0x6900, 0x6900, 0x41DF,
+ 0x6901, 0x6901, 0x41DE, 0x6902, 0x6902, 0x42FB, 0x6903, 0x6903, 0x429C,
+ 0x6904, 0x6904, 0x2184, 0x6905, 0x6905, 0x0C89, 0x6906, 0x6906, 0x21AC,
+ 0x6907, 0x6907, 0x2194, 0x6908, 0x6908, 0x2196, 0x6909, 0x6909, 0x4658,
+ 0x690A, 0x690A, 0x21A3, 0x690B, 0x690B, 0x21A2, 0x690C, 0x690C, 0x2182,
+ 0x690D, 0x690D, 0x0C94, 0x690E, 0x690E, 0x0C96, 0x690F, 0x690F, 0x218A,
+ 0x6910, 0x6910, 0x2191, 0x6911, 0x6911, 0x2199, 0x6912, 0x6912, 0x0C95,
+ 0x6913, 0x6913, 0x2190, 0x6914, 0x6914, 0x219C, 0x6915, 0x6915, 0x21AF,
+ 0x6917, 0x6917, 0x21A4, 0x6918, 0x6918, 0x3DA2, 0x691A, 0x691A, 0x3D80,
+ 0x691B, 0x691B, 0x37BD, 0x6925, 0x6925, 0x21B0, 0x692A, 0x692A, 0x2186,
+ 0x692C, 0x692C, 0x3F38, 0x692F, 0x692F, 0x243F, 0x6930, 0x6930, 0x0E3E,
+ 0x6932, 0x6932, 0x243D, 0x6933, 0x6933, 0x2428, 0x6934, 0x6934, 0x242D,
+ 0x6935, 0x6935, 0x2426, 0x6936, 0x6936, 0x41E7, 0x6937, 0x6937, 0x2439,
+ 0x6938, 0x6938, 0x2418, 0x6939, 0x6939, 0x241F, 0x693B, 0x693B, 0x2437,
+ 0x693C, 0x693C, 0x2441, 0x693D, 0x693D, 0x2429, 0x693E, 0x693E, 0x4056,
+ 0x693F, 0x693F, 0x241C, 0x6940, 0x6940, 0x242F, 0x6941, 0x6941, 0x2434,
+ 0x6942, 0x6942, 0x2420, 0x6943, 0x6943, 0x4659, 0x6944, 0x6944, 0x2431,
+ 0x6945, 0x6945, 0x241D, 0x6946, 0x6946, 0x456F, 0x6948, 0x6949, 0x2424,
+ 0x694A, 0x694A, 0x0E40, 0x694B, 0x694B, 0x2438, 0x694C, 0x694C, 0x2436,
+ 0x694E, 0x694E, 0x2419, 0x694F, 0x694F, 0x243B, 0x6951, 0x6951, 0x243C,
+ 0x6952, 0x6952, 0x243E, 0x6953, 0x6953, 0x0E44, 0x6954, 0x6954, 0x0E3C,
+ 0x6955, 0x6955, 0x3D86, 0x6956, 0x6956, 0x1F1D, 0x6957, 0x6957, 0x2421,
+ 0x6958, 0x6958, 0x2433, 0x6959, 0x6959, 0x2422, 0x695A, 0x695A, 0x0E39,
+ 0x695B, 0x695B, 0x0E49, 0x695C, 0x695C, 0x243A, 0x695D, 0x695D, 0x0E47,
+ 0x695E, 0x695E, 0x0E43, 0x695F, 0x695F, 0x2417, 0x6960, 0x6960, 0x0E3B,
+ 0x6961, 0x6961, 0x41E4, 0x6962, 0x6962, 0x241A, 0x6963, 0x6963, 0x0E48,
+ 0x6964, 0x6964, 0x465B, 0x6965, 0x6965, 0x242A, 0x6966, 0x6966, 0x2416,
+ 0x6967, 0x6967, 0x3D15, 0x6968, 0x6968, 0x0E41, 0x6969, 0x6969, 0x242E,
+ 0x696A, 0x696A, 0x241E, 0x696B, 0x696B, 0x0E42, 0x696C, 0x696C, 0x2427,
+ 0x696D, 0x696D, 0x0E38, 0x696E, 0x696E, 0x0C99, 0x696F, 0x696F, 0x2430,
+ 0x6970, 0x6970, 0x2197, 0x6971, 0x6971, 0x241B, 0x6972, 0x6972, 0x3A6D,
+ 0x6973, 0x6973, 0x41DB, 0x6974, 0x6974, 0x2435, 0x6975, 0x6975, 0x0E3D,
+ 0x6976, 0x6976, 0x2432, 0x6977, 0x6977, 0x0E3A, 0x6978, 0x6978, 0x242C,
+ 0x6979, 0x6979, 0x0E45, 0x697A, 0x697A, 0x2423, 0x697B, 0x697B, 0x2440,
+ 0x6980, 0x6980, 0x3F3E, 0x6982, 0x6982, 0x0E3F, 0x6983, 0x6983, 0x24AF,
+ 0x6985, 0x6985, 0x465D, 0x6986, 0x6986, 0x0E46, 0x698A, 0x698A, 0x3D74,
+ 0x698D, 0x698D, 0x26C9, 0x698E, 0x698E, 0x26C7, 0x6990, 0x6990, 0x26DD,
+ 0x6991, 0x6991, 0x26C5, 0x6993, 0x6993, 0x26D7, 0x6994, 0x6994, 0x0E37,
+ 0x6995, 0x6995, 0x0FF0, 0x6996, 0x6996, 0x26C1, 0x6997, 0x6997, 0x26DC,
+ 0x6998, 0x6998, 0x41E8, 0x6999, 0x6999, 0x26C6, 0x699A, 0x699A, 0x26D4,
+ 0x699B, 0x699B, 0x0FF5, 0x699C, 0x699C, 0x0FEE, 0x699E, 0x699E, 0x26DA,
+ 0x699F, 0x699F, 0x465C, 0x69A0, 0x69A0, 0x26BF, 0x69A1, 0x69A1, 0x26D9,
+ 0x69A2, 0x69A2, 0x3730, 0x69A3, 0x69A3, 0x1000, 0x69A4, 0x69A4, 0x26D0,
+ 0x69A5, 0x69A5, 0x26E0, 0x69A6, 0x69A6, 0x0FFE, 0x69A7, 0x69A7, 0x26C8,
+ 0x69A8, 0x69A8, 0x0FEF, 0x69A9, 0x69A9, 0x26CA, 0x69AA, 0x69AA, 0x26D8,
+ 0x69AB, 0x69AB, 0x0FF8, 0x69AC, 0x69AC, 0x26C3, 0x69AD, 0x69AD, 0x0FFC,
+ 0x69AE, 0x69AE, 0x0FF2, 0x69AF, 0x69AF, 0x26CC, 0x69B0, 0x69B0, 0x26C2,
+ 0x69B1, 0x69B1, 0x26BC, 0x69B2, 0x69B2, 0x3FF6, 0x69B3, 0x69B3, 0x26D6,
+ 0x69B4, 0x69B4, 0x0FF9, 0x69B5, 0x69B5, 0x26DF, 0x69B6, 0x69B6, 0x26BD,
+ 0x69B7, 0x69B7, 0x0FF6, 0x69B9, 0x69B9, 0x26D2, 0x69BB, 0x69BB, 0x0FF7,
+ 0x69BC, 0x69BC, 0x26C4, 0x69BD, 0x69BD, 0x26CF, 0x69BE, 0x69BE, 0x26CB,
+ 0x69BF, 0x69BF, 0x26CD, 0x69C0, 0x69C0, 0x3F5D, 0x69C1, 0x69C1, 0x0FF1,
+ 0x69C2, 0x69C2, 0x26DE, 0x69C3, 0x69C3, 0x0FFF, 0x69C4, 0x69C4, 0x26CE,
+ 0x69C6, 0x69C6, 0x26E1, 0x69C9, 0x69C9, 0x26BE, 0x69CA, 0x69CA, 0x26D3,
+ 0x69CB, 0x69CB, 0x0FF4, 0x69CC, 0x69CC, 0x0FFD, 0x69CD, 0x69CD, 0x0FFB,
+ 0x69CE, 0x69CE, 0x26C0, 0x69CF, 0x69CF, 0x26D5, 0x69D0, 0x69D0, 0x0FFA,
+ 0x69D1, 0x69D1, 0x39EF, 0x69D3, 0x69D3, 0x0FF3, 0x69D4, 0x69D4, 0x26D1,
+ 0x69D5, 0x69D5, 0x3E3C, 0x69D6, 0x69D6, 0x465E, 0x69D9, 0x69D9, 0x26DB,
+ 0x69E1, 0x69E1, 0x41D8, 0x69E2, 0x69E2, 0x2909, 0x69E4, 0x69E4, 0x2905,
+ 0x69E5, 0x69E5, 0x2901, 0x69E6, 0x69E6, 0x2915, 0x69E7, 0x69E7, 0x2912,
+ 0x69E8, 0x69E8, 0x1177, 0x69E9, 0x69E9, 0x3D91, 0x69EB, 0x69EB, 0x2919,
+ 0x69EC, 0x69EC, 0x2908, 0x69ED, 0x69ED, 0x1182, 0x69EE, 0x69EE, 0x290F,
+ 0x69F1, 0x69F1, 0x2904, 0x69F2, 0x69F2, 0x290E, 0x69F3, 0x69F3, 0x117F,
+ 0x69F4, 0x69F4, 0x2922, 0x69F6, 0x69F6, 0x291F, 0x69F7, 0x69F7, 0x2911,
+ 0x69F8, 0x69F8, 0x2902, 0x69F9, 0x69F9, 0x41ED, 0x69FA, 0x69FA, 0x41C7,
+ 0x69FB, 0x69FB, 0x2916, 0x69FC, 0x69FC, 0x2918, 0x69FD, 0x69FD, 0x117B,
+ 0x69FE, 0x69FE, 0x290C, 0x69FF, 0x69FF, 0x2907, 0x6A00, 0x6A00, 0x28FE,
+ 0x6A01, 0x6A01, 0x1178, 0x6A02, 0x6A02, 0x1180, 0x6A03, 0x6A03, 0x3E29,
+ 0x6A04, 0x6A04, 0x291B, 0x6A05, 0x6A05, 0x1181, 0x6A06, 0x6A06, 0x28FF,
+ 0x6A07, 0x6A07, 0x2921, 0x6A08, 0x6A08, 0x2914, 0x6A09, 0x6A09, 0x291A,
+ 0x6A0A, 0x6A0A, 0x117E, 0x6A0B, 0x6A0B, 0x41D9, 0x6A0C, 0x6A0C, 0x3D50,
+ 0x6A0D, 0x6A0D, 0x2917, 0x6A0F, 0x6A0F, 0x291E, 0x6A11, 0x6A11, 0x1183,
+ 0x6A13, 0x6A13, 0x117D, 0x6A14, 0x6A14, 0x2910, 0x6A15, 0x6A15, 0x2903,
+ 0x6A16, 0x6A16, 0x2923, 0x6A17, 0x6A17, 0x2900, 0x6A18, 0x6A18, 0x291C,
+ 0x6A19, 0x6A19, 0x117A, 0x6A1A, 0x6A1A, 0x3D1E, 0x6A1B, 0x6A1B, 0x290A,
+ 0x6A1C, 0x6A1C, 0x3B68, 0x6A1D, 0x6A1D, 0x290B, 0x6A1E, 0x6A1E, 0x1179,
+ 0x6A1F, 0x6A1F, 0x1176, 0x6A20, 0x6A20, 0x2906, 0x6A21, 0x6A21, 0x117C,
+ 0x6A23, 0x6A23, 0x1175, 0x6A25, 0x6A25, 0x291D, 0x6A26, 0x6A26, 0x2920,
+ 0x6A27, 0x6A27, 0x290D, 0x6A28, 0x6A28, 0x2B74, 0x6A2B, 0x6A2B, 0x3D42,
+ 0x6A2C, 0x6A2C, 0x42AB, 0x6A2D, 0x6A2D, 0x3B1F, 0x6A32, 0x6A32, 0x2B6C,
+ 0x6A33, 0x6A33, 0x3AA4, 0x6A34, 0x6A34, 0x2B68, 0x6A35, 0x6A35, 0x12D9,
+ 0x6A38, 0x6A38, 0x12CE, 0x6A39, 0x6A39, 0x12D3, 0x6A3A, 0x6A3A, 0x12CF,
+ 0x6A3B, 0x6A3B, 0x2B76, 0x6A3C, 0x6A3C, 0x2B81, 0x6A3D, 0x6A3D, 0x12CD,
+ 0x6A3E, 0x6A3E, 0x2B6E, 0x6A3F, 0x6A3F, 0x2B77, 0x6A40, 0x6A40, 0x2913,
+ 0x6A41, 0x6A41, 0x2B78, 0x6A44, 0x6A44, 0x12D4, 0x6A45, 0x6A45, 0x41F0,
+ 0x6A46, 0x6A46, 0x2B87, 0x6A47, 0x6A47, 0x12D8, 0x6A48, 0x6A48, 0x12DB,
+ 0x6A49, 0x6A49, 0x2B6A, 0x6A4B, 0x6A4B, 0x12D7, 0x6A4C, 0x6A4C, 0x3AAB,
+ 0x6A4D, 0x6A4E, 0x2B85, 0x6A4F, 0x6A4F, 0x2B7C, 0x6A50, 0x6A50, 0x2B7B,
+ 0x6A51, 0x6A51, 0x2B73, 0x6A52, 0x6A52, 0x3AA5, 0x6A53, 0x6A53, 0x37AC,
+ 0x6A54, 0x6A54, 0x2B7D, 0x6A55, 0x6A55, 0x2B84, 0x6A56, 0x6A56, 0x2B83,
+ 0x6A57, 0x6A57, 0x37DA, 0x6A58, 0x6A58, 0x12D2, 0x6A59, 0x6A59, 0x12D0,
+ 0x6A5A, 0x6A5A, 0x2B75, 0x6A5B, 0x6A5B, 0x2B72, 0x6A5D, 0x6A5D, 0x2B6F,
+ 0x6A5E, 0x6A5E, 0x2B82, 0x6A5F, 0x6A5F, 0x12DA, 0x6A60, 0x6A60, 0x2B80,
+ 0x6A61, 0x6A61, 0x12D6, 0x6A62, 0x6A62, 0x12D5, 0x6A64, 0x6A64, 0x2B7A,
+ 0x6A65, 0x6A65, 0x4660, 0x6A66, 0x6A66, 0x2B69, 0x6A67, 0x6A67, 0x2B6B,
+ 0x6A68, 0x6A68, 0x2B6D, 0x6A69, 0x6A69, 0x2B7F, 0x6A6A, 0x6A6A, 0x2B79,
+ 0x6A6B, 0x6A6B, 0x12D1, 0x6A6D, 0x6A6D, 0x2B70, 0x6A6F, 0x6A6F, 0x2B7E,
+ 0x6A71, 0x6A71, 0x4662, 0x6A74, 0x6A74, 0x4661, 0x6A76, 0x6A76, 0x2B71,
+ 0x6A7A, 0x6A7A, 0x3AAD, 0x6A7E, 0x6A7E, 0x13EC, 0x6A7F, 0x6A7F, 0x2D84,
+ 0x6A80, 0x6A80, 0x13E5, 0x6A81, 0x6A81, 0x2D75, 0x6A82, 0x6A82, 0x4663,
+ 0x6A83, 0x6A83, 0x2D80, 0x6A84, 0x6A84, 0x13E7, 0x6A85, 0x6A85, 0x2D87,
+ 0x6A87, 0x6A87, 0x2D7C, 0x6A89, 0x6A89, 0x2D77, 0x6A8A, 0x6A8A, 0x4136,
+ 0x6A8C, 0x6A8C, 0x2D88, 0x6A8D, 0x6A8D, 0x2D73, 0x6A8E, 0x6A8E, 0x2D7E,
+ 0x6A8F, 0x6A8F, 0x3C1B, 0x6A90, 0x6A90, 0x13EE, 0x6A91, 0x6A91, 0x2D83,
+ 0x6A92, 0x6A92, 0x2D89, 0x6A93, 0x6A93, 0x2D7D, 0x6A94, 0x6A94, 0x13E6,
+ 0x6A95, 0x6A95, 0x2D7F, 0x6A96, 0x6A96, 0x2D74, 0x6A97, 0x6A97, 0x13ED,
+ 0x6A99, 0x6A99, 0x4665, 0x6A9A, 0x6A9A, 0x2D86, 0x6A9B, 0x6A9B, 0x2D79,
+ 0x6A9C, 0x6A9C, 0x13E9, 0x6A9D, 0x6A9D, 0x41F2, 0x6A9E, 0x6A9E, 0x2D7B,
+ 0x6A9F, 0x6A9F, 0x2D78, 0x6AA0, 0x6AA0, 0x13EF, 0x6AA1, 0x6AA1, 0x2D7A,
+ 0x6AA2, 0x6AA2, 0x13E8, 0x6AA3, 0x6AA3, 0x13EB, 0x6AA4, 0x6AA4, 0x2D82,
+ 0x6AA5, 0x6AA5, 0x2D76, 0x6AA6, 0x6AA6, 0x2D85, 0x6AA7, 0x6AA7, 0x37E3,
+ 0x6AA8, 0x6AA8, 0x2D81, 0x6AAB, 0x6AAB, 0x4667, 0x6AAC, 0x6AAC, 0x14DD,
+ 0x6AAD, 0x6AAD, 0x2F3E, 0x6AAE, 0x6AAF, 0x14E2, 0x6AB1, 0x6AB1, 0x3E53,
+ 0x6AB2, 0x6AB2, 0x3B4B, 0x6AB3, 0x6AB3, 0x14DC, 0x6AB4, 0x6AB4, 0x2F3D,
+ 0x6AB5, 0x6AB5, 0x4668, 0x6AB6, 0x6AB7, 0x2F3A, 0x6AB8, 0x6AB8, 0x14E0,
+ 0x6AB9, 0x6AB9, 0x2F35, 0x6ABA, 0x6ABA, 0x2F39, 0x6ABB, 0x6ABB, 0x14DF,
+ 0x6ABD, 0x6ABD, 0x2F36, 0x6ABE, 0x6ABE, 0x3AA1, 0x6AC2, 0x6AC2, 0x14E1,
+ 0x6AC3, 0x6AC3, 0x14DE, 0x6AC5, 0x6AC5, 0x2F34, 0x6AC6, 0x6AC6, 0x2F38,
+ 0x6AC7, 0x6AC7, 0x2F3C, 0x6AC8, 0x6AC8, 0x41F5, 0x6AC9, 0x6AC9, 0x3AA6,
+ 0x6ACA, 0x6ACA, 0x3F4C, 0x6ACB, 0x6ACB, 0x309F, 0x6ACC, 0x6ACC, 0x309C,
+ 0x6ACD, 0x6ACD, 0x30A5, 0x6ACF, 0x6ACF, 0x30A4, 0x6AD0, 0x6AD0, 0x30A2,
+ 0x6AD1, 0x6AD1, 0x309D, 0x6AD3, 0x6AD3, 0x1589, 0x6AD4, 0x6AD4, 0x4669,
+ 0x6AD8, 0x6AD8, 0x3CAA, 0x6AD9, 0x6AD9, 0x309E, 0x6ADA, 0x6ADA, 0x1588,
+ 0x6ADB, 0x6ADB, 0x13EA, 0x6ADC, 0x6ADC, 0x30A1, 0x6ADD, 0x6ADD, 0x1587,
+ 0x6ADE, 0x6ADE, 0x30A6, 0x6ADF, 0x6ADF, 0x30A0, 0x6AE0, 0x6AE0, 0x309B,
+ 0x6AE1, 0x6AE1, 0x2F37, 0x6AE5, 0x6AE5, 0x1586, 0x6AE7, 0x6AE7, 0x309A,
+ 0x6AE8, 0x6AE8, 0x31DF, 0x6AEA, 0x6AEA, 0x31DE, 0x6AEB, 0x6AEB, 0x30A3,
+ 0x6AEC, 0x6AEC, 0x161B, 0x6AEE, 0x6AEF, 0x31E2, 0x6AF0, 0x6AF0, 0x31DD,
+ 0x6AF1, 0x6AF1, 0x31E1, 0x6AF3, 0x6AF3, 0x31DC, 0x6AF6, 0x6AF6, 0x466A,
+ 0x6AF8, 0x6AF8, 0x32D6, 0x6AF9, 0x6AF9, 0x31E0, 0x6AFA, 0x6AFA, 0x1678,
+ 0x6AFB, 0x6AFB, 0x1676, 0x6AFC, 0x6AFC, 0x32D4, 0x6B00, 0x6B00, 0x32D7,
+ 0x6B02, 0x6B02, 0x32D3, 0x6B03, 0x6B03, 0x32D5, 0x6B04, 0x6B04, 0x1677,
+ 0x6B05, 0x6B05, 0x3AA7, 0x6B08, 0x6B09, 0x3386, 0x6B0A, 0x6B0A, 0x16C6,
+ 0x6B0B, 0x6B0B, 0x3385, 0x6B0F, 0x6B0F, 0x3420, 0x6B10, 0x6B10, 0x16FD,
+ 0x6B11, 0x6B12, 0x341E, 0x6B13, 0x6B13, 0x3487, 0x6B16, 0x6B16, 0x1743,
+ 0x6B17, 0x6B17, 0x34CE, 0x6B18, 0x6B19, 0x34CC, 0x6B1A, 0x6B1A, 0x34CF,
+ 0x6B1D, 0x6B1D, 0x41F8, 0x6B1E, 0x6B1E, 0x3534, 0x6B20, 0x6B20, 0x02DE,
+ 0x6B21, 0x6B21, 0x03E3, 0x6B23, 0x6B23, 0x061A, 0x6B25, 0x6B25, 0x19C9,
+ 0x6B28, 0x6B28, 0x1B3D, 0x6B2C, 0x6B2C, 0x1CE6, 0x6B2D, 0x6B2D, 0x1CE8,
+ 0x6B2F, 0x6B2F, 0x1CE7, 0x6B31, 0x6B31, 0x1CE9, 0x6B32, 0x6B32, 0x0AE7,
+ 0x6B33, 0x6B33, 0x1F3C, 0x6B34, 0x6B34, 0x1CEA, 0x6B35, 0x6B35, 0x41FB,
+ 0x6B36, 0x6B36, 0x1F3B, 0x6B37, 0x6B38, 0x1F3D, 0x6B39, 0x6B39, 0x21B2,
+ 0x6B3A, 0x6B3A, 0x0C9C, 0x6B3B, 0x6B3B, 0x21B3, 0x6B3C, 0x6B3C, 0x21B5,
+ 0x6B3D, 0x6B3D, 0x0C9D, 0x6B3E, 0x6B3E, 0x0C9B, 0x6B3F, 0x6B3F, 0x21B4,
+ 0x6B41, 0x6B41, 0x2447, 0x6B42, 0x6B42, 0x2445, 0x6B43, 0x6B43, 0x2444,
+ 0x6B45, 0x6B45, 0x2443, 0x6B46, 0x6B46, 0x2442, 0x6B47, 0x6B47, 0x0E4A,
+ 0x6B48, 0x6B48, 0x2446, 0x6B49, 0x6B49, 0x1001, 0x6B4A, 0x6B4A, 0x26E2,
+ 0x6B4B, 0x6B4B, 0x26E4, 0x6B4C, 0x6B4C, 0x1002, 0x6B4D, 0x6B4D, 0x26E3,
+ 0x6B4E, 0x6B4E, 0x1185, 0x6B50, 0x6B50, 0x1184, 0x6B51, 0x6B51, 0x2924,
+ 0x6B52, 0x6B52, 0x3F6E, 0x6B54, 0x6B54, 0x2B89, 0x6B55, 0x6B55, 0x2B88,
+ 0x6B56, 0x6B56, 0x2B8A, 0x6B57, 0x6B57, 0x3AAE, 0x6B59, 0x6B59, 0x12DC,
+ 0x6B5B, 0x6B5B, 0x2D8A, 0x6B5C, 0x6B5C, 0x13F0, 0x6B5E, 0x6B5E, 0x2F3F,
+ 0x6B5F, 0x6B5F, 0x14E4, 0x6B60, 0x6B60, 0x30A7, 0x6B61, 0x6B61, 0x16C7,
+ 0x6B62, 0x6B62, 0x02DF, 0x6B63, 0x6B63, 0x034D, 0x6B64, 0x6B64, 0x03E4,
+ 0x6B65, 0x6B65, 0x04C9, 0x6B66, 0x6B67, 0x061B, 0x6B6A, 0x6B6A, 0x0769,
+ 0x6B6D, 0x6B6D, 0x1CEB, 0x6B6F, 0x6B6F, 0x4515, 0x6B72, 0x6B72, 0x0E4B,
+ 0x6B74, 0x6B74, 0x41FC, 0x6B76, 0x6B76, 0x29A2, 0x6B77, 0x6B77, 0x12DD,
+ 0x6B78, 0x6B78, 0x14E5, 0x6B79, 0x6B79, 0x02E0, 0x6B7A, 0x6B7A, 0x44EE,
+ 0x6B7B, 0x6B7B, 0x03E5, 0x6B7E, 0x6B7E, 0x19CB, 0x6B7F, 0x6B7F, 0x061D,
+ 0x6B80, 0x6B80, 0x19CA, 0x6B81, 0x6B81, 0x466B, 0x6B82, 0x6B82, 0x1B3E,
+ 0x6B83, 0x6B83, 0x076A, 0x6B84, 0x6B84, 0x1B3F, 0x6B86, 0x6B86, 0x076B,
+ 0x6B88, 0x6B88, 0x1CED, 0x6B89, 0x6B89, 0x0900, 0x6B8A, 0x6B8A, 0x08FF,
+ 0x6B8C, 0x6B8C, 0x1F43, 0x6B8D, 0x6B8E, 0x1F41, 0x6B8F, 0x6B8F, 0x1F40,
+ 0x6B91, 0x6B91, 0x1F3F, 0x6B94, 0x6B94, 0x21B6, 0x6B95, 0x6B95, 0x21B9,
+ 0x6B96, 0x6B96, 0x0C9F, 0x6B97, 0x6B97, 0x21B7, 0x6B98, 0x6B98, 0x0C9E,
+ 0x6B99, 0x6B99, 0x21B8, 0x6B9B, 0x6B9B, 0x2448, 0x6B9E, 0x6BA0, 0x26E5,
+ 0x6BA2, 0x6BA2, 0x2927, 0x6BA3, 0x6BA3, 0x2926, 0x6BA4, 0x6BA4, 0x1186,
+ 0x6BA5, 0x6BA5, 0x2925, 0x6BA6, 0x6BA6, 0x2928, 0x6BA7, 0x6BA7, 0x2B8B,
+ 0x6BAA, 0x6BAB, 0x2B8C, 0x6BAD, 0x6BAD, 0x2D8B, 0x6BAE, 0x6BAE, 0x13F1,
+ 0x6BAF, 0x6BAF, 0x14E6, 0x6BB0, 0x6BB0, 0x30A8, 0x6BB2, 0x6BB2, 0x1679,
+ 0x6BB3, 0x6BB3, 0x178A, 0x6BB5, 0x6BB5, 0x076C, 0x6BB6, 0x6BB6, 0x1B40,
+ 0x6BB7, 0x6BB7, 0x0901, 0x6BBA, 0x6BBA, 0x0AE8, 0x6BBC, 0x6BBC, 0x0CA0,
+ 0x6BBD, 0x6BBD, 0x21BA, 0x6BBF, 0x6BBF, 0x0E4D, 0x6BC0, 0x6BC0, 0x0E4C,
+ 0x6BC1, 0x6BC1, 0x466C, 0x6BC3, 0x6BC4, 0x26E8, 0x6BC5, 0x6BC6, 0x1187,
+ 0x6BC7, 0x6BC7, 0x2B8F, 0x6BC8, 0x6BC8, 0x2B8E, 0x6BC9, 0x6BC9, 0x2F40,
+ 0x6BCA, 0x6BCA, 0x3421, 0x6BCB, 0x6BCB, 0x02E1, 0x6BCC, 0x6BCC, 0x178B,
+ 0x6BCD, 0x6BCD, 0x034E, 0x6BCF, 0x6BCF, 0x04CA, 0x6BD0, 0x6BD0, 0x18AD,
+ 0x6BD2, 0x6BD2, 0x076D, 0x6BD3, 0x6BD3, 0x0E4E, 0x6BD4, 0x6BD4, 0x02E2,
+ 0x6BD6, 0x6BD6, 0x1B41, 0x6BD7, 0x6BD7, 0x076E, 0x6BD8, 0x6BD8, 0x1B42,
+ 0x6BDA, 0x6BDA, 0x13F2, 0x6BDB, 0x6BDB, 0x02E3, 0x6BDC, 0x6BDC, 0x4207,
+ 0x6BDE, 0x6BDE, 0x19CC, 0x6BE0, 0x6BE0, 0x1B43, 0x6BE1, 0x6BE1, 0x4205,
+ 0x6BE2, 0x6BE2, 0x1CF2, 0x6BE3, 0x6BE3, 0x1CF1, 0x6BE4, 0x6BE4, 0x1CEF,
+ 0x6BE6, 0x6BE6, 0x1CEE, 0x6BE7, 0x6BE7, 0x1CF3, 0x6BE8, 0x6BE8, 0x1CF0,
+ 0x6BEA, 0x6BEA, 0x466D, 0x6BEB, 0x6BEC, 0x0AE9, 0x6BEF, 0x6BEF, 0x0CA1,
+ 0x6BF0, 0x6BF0, 0x21BB, 0x6BF2, 0x6BF3, 0x21BC, 0x6BF7, 0x6BF8, 0x244C,
+ 0x6BF9, 0x6BF9, 0x244B, 0x6BFA, 0x6BFA, 0x3F79, 0x6BFB, 0x6BFC, 0x2449,
+ 0x6BFD, 0x6BFD, 0x0E4F, 0x6BFE, 0x6BFE, 0x26EA, 0x6BFF, 0x6BFF, 0x292B,
+ 0x6C00, 0x6C00, 0x292A, 0x6C01, 0x6C01, 0x2929, 0x6C02, 0x6C02, 0x292C,
+ 0x6C03, 0x6C03, 0x2B91, 0x6C04, 0x6C04, 0x2B90, 0x6C05, 0x6C05, 0x12DE,
+ 0x6C06, 0x6C06, 0x2B92, 0x6C08, 0x6C08, 0x13F3, 0x6C09, 0x6C09, 0x2D8C,
+ 0x6C0B, 0x6C0B, 0x2F41, 0x6C0C, 0x6C0C, 0x30A9, 0x6C0D, 0x6C0D, 0x3388,
+ 0x6C0F, 0x6C0F, 0x02E4, 0x6C10, 0x6C10, 0x0350, 0x6C11, 0x6C11, 0x034F,
+ 0x6C13, 0x6C13, 0x061E, 0x6C14, 0x6C14, 0x178C, 0x6C15, 0x6C15, 0x17AA,
+ 0x6C16, 0x6C16, 0x03E6, 0x6C18, 0x6C18, 0x1801, 0x6C19, 0x6C1A, 0x18AE,
+ 0x6C1B, 0x6C1B, 0x061F, 0x6C1C, 0x6C1C, 0x38AB, 0x6C1D, 0x6C1D, 0x19CD,
+ 0x6C1F, 0x6C1F, 0x076F, 0x6C20, 0x6C21, 0x1B44, 0x6C23, 0x6C23, 0x0902,
+ 0x6C24, 0x6C24, 0x0906, 0x6C25, 0x6C25, 0x1CF4, 0x6C26, 0x6C26, 0x0905,
+ 0x6C27, 0x6C28, 0x0903, 0x6C2A, 0x6C2A, 0x1F44, 0x6C2B, 0x6C2B, 0x0AEB,
+ 0x6C2C, 0x6C2C, 0x0CA4, 0x6C2E, 0x6C2F, 0x0CA2, 0x6C30, 0x6C30, 0x21BE,
+ 0x6C31, 0x6C31, 0x3F63, 0x6C33, 0x6C33, 0x1003, 0x6C34, 0x6C34, 0x02E5,
+ 0x6C35, 0x6C35, 0x44EF, 0x6C36, 0x6C36, 0x17AB, 0x6C37, 0x6C37, 0x4208,
+ 0x6C38, 0x6C38, 0x0351, 0x6C39, 0x6C39, 0x3E05, 0x6C3A, 0x6C3A, 0x44F0,
+ 0x6C3B, 0x6C3B, 0x17AE, 0x6C3D, 0x6C3D, 0x4381, 0x6C3E, 0x6C3E, 0x0354,
+ 0x6C3F, 0x6C3F, 0x17AD, 0x6C40, 0x6C40, 0x0353, 0x6C41, 0x6C41, 0x0352,
+ 0x6C42, 0x6C42, 0x04CB, 0x6C43, 0x6C43, 0x17AC, 0x6C46, 0x6C46, 0x1802,
+ 0x6C49, 0x6C49, 0x408D, 0x6C4A, 0x6C4A, 0x1806, 0x6C4B, 0x6C4C, 0x1808,
+ 0x6C4D, 0x6C4E, 0x03F0, 0x6C4F, 0x6C4F, 0x1805, 0x6C50, 0x6C50, 0x03EC,
+ 0x6C52, 0x6C52, 0x1803, 0x6C54, 0x6C54, 0x1807, 0x6C55, 0x6C55, 0x03ED,
+ 0x6C57, 0x6C57, 0x03E8, 0x6C58, 0x6C58, 0x3BBA, 0x6C59, 0x6C59, 0x03E9,
+ 0x6C5A, 0x6C5A, 0x420C, 0x6C5B, 0x6C5B, 0x03EF, 0x6C5C, 0x6C5C, 0x1804,
+ 0x6C5D, 0x6C5D, 0x03E7, 0x6C5E, 0x6C5E, 0x04CC, 0x6C5F, 0x6C60, 0x03EA,
+ 0x6C61, 0x6C61, 0x03EE, 0x6C65, 0x6C65, 0x18C0, 0x6C66, 0x6C66, 0x18BE,
+ 0x6C67, 0x6C67, 0x18B1, 0x6C68, 0x6C68, 0x04D8, 0x6C69, 0x6C69, 0x18B8,
+ 0x6C6A, 0x6C6A, 0x04D3, 0x6C6B, 0x6C6B, 0x18B2, 0x6C6D, 0x6C6D, 0x18BA,
+ 0x6C6E, 0x6C6E, 0x40CA, 0x6C6F, 0x6C6F, 0x18B7, 0x6C70, 0x6C70, 0x04D6,
+ 0x6C71, 0x6C71, 0x18B6, 0x6C72, 0x6C72, 0x04DD, 0x6C73, 0x6C73, 0x18BF,
+ 0x6C74, 0x6C74, 0x04DF, 0x6C75, 0x6C75, 0x466E, 0x6C76, 0x6C76, 0x04E1,
+ 0x6C78, 0x6C78, 0x18B0, 0x6C79, 0x6C79, 0x420E, 0x6C7A, 0x6C7A, 0x04D4,
+ 0x6C7B, 0x6C7B, 0x18C1, 0x6C7D, 0x6C7D, 0x04DB, 0x6C7E, 0x6C7E, 0x04DE,
+ 0x6C7F, 0x6C7F, 0x37A6, 0x6C80, 0x6C80, 0x19E4, 0x6C81, 0x6C81, 0x04CE,
+ 0x6C82, 0x6C82, 0x04E5, 0x6C83, 0x6C83, 0x04DC, 0x6C84, 0x6C84, 0x18B3,
+ 0x6C85, 0x6C85, 0x04D1, 0x6C86, 0x6C86, 0x04E0, 0x6C87, 0x6C87, 0x18BB,
+ 0x6C88, 0x6C89, 0x04CF, 0x6C8A, 0x6C8A, 0x19E2, 0x6C8B, 0x6C8B, 0x18B4,
+ 0x6C8C, 0x6C8C, 0x04D7, 0x6C8D, 0x6C8D, 0x04E2, 0x6C8E, 0x6C8E, 0x18C2,
+ 0x6C8F, 0x6C8F, 0x18B5, 0x6C90, 0x6C90, 0x04D5, 0x6C92, 0x6C92, 0x04DA,
+ 0x6C93, 0x6C93, 0x19CE, 0x6C94, 0x6C94, 0x04E3, 0x6C95, 0x6C95, 0x18BC,
+ 0x6C96, 0x6C96, 0x04D9, 0x6C98, 0x6C98, 0x04E4, 0x6C99, 0x6C99, 0x04CD,
+ 0x6C9A, 0x6C9A, 0x18B9, 0x6C9B, 0x6C9B, 0x04D2, 0x6C9C, 0x6C9C, 0x18BD,
+ 0x6C9D, 0x6C9D, 0x19E3, 0x6C9F, 0x6C9F, 0x3889, 0x6CA2, 0x6CA2, 0x3D63,
+ 0x6CAA, 0x6CAA, 0x466F, 0x6CAB, 0x6CAB, 0x062B, 0x6CAC, 0x6CAC, 0x063B,
+ 0x6CAD, 0x6CAD, 0x19D5, 0x6CAE, 0x6CAE, 0x0632, 0x6CAF, 0x6CAF, 0x3CF6,
+ 0x6CB0, 0x6CB0, 0x19EA, 0x6CB1, 0x6CB1, 0x0623, 0x6CB2, 0x6CB2, 0x3ECC,
+ 0x6CB3, 0x6CB3, 0x0626, 0x6CB4, 0x6CB4, 0x19E1, 0x6CB6, 0x6CB6, 0x19D3,
+ 0x6CB7, 0x6CB7, 0x19D7, 0x6CB8, 0x6CB8, 0x062E, 0x6CB9, 0x6CB9, 0x0630,
+ 0x6CBA, 0x6CBA, 0x19DA, 0x6CBB, 0x6CBB, 0x0637, 0x6CBC, 0x6CBC, 0x0629,
+ 0x6CBD, 0x6CBE, 0x0627, 0x6CBF, 0x6CBF, 0x0636, 0x6CC0, 0x6CC0, 0x19E6,
+ 0x6CC1, 0x6CC1, 0x0631, 0x6CC2, 0x6CC2, 0x19D9, 0x6CC3, 0x6CC3, 0x19DB,
+ 0x6CC4, 0x6CC4, 0x062F, 0x6CC5, 0x6CC5, 0x0634, 0x6CC6, 0x6CC6, 0x19DC,
+ 0x6CC7, 0x6CC7, 0x19E9, 0x6CC9, 0x6CC9, 0x0770, 0x6CCA, 0x6CCA, 0x063A,
+ 0x6CCB, 0x6CCB, 0x4070, 0x6CCC, 0x6CCC, 0x0624, 0x6CCD, 0x6CCD, 0x19E8,
+ 0x6CCE, 0x6CCE, 0x3F91, 0x6CCF, 0x6CCF, 0x19EC, 0x6CD0, 0x6CD0, 0x19D8,
+ 0x6CD1, 0x6CD1, 0x19EE, 0x6CD2, 0x6CD2, 0x19DF, 0x6CD3, 0x6CD3, 0x062D,
+ 0x6CD4, 0x6CD4, 0x19D4, 0x6CD5, 0x6CD5, 0x062C, 0x6CD6, 0x6CD6, 0x063E,
+ 0x6CD7, 0x6CD7, 0x0633, 0x6CD9, 0x6CD9, 0x19D2, 0x6CDA, 0x6CDA, 0x1B4E,
+ 0x6CDB, 0x6CDB, 0x0639, 0x6CDC, 0x6CDC, 0x063D, 0x6CDD, 0x6CDD, 0x19E0,
+ 0x6CDE, 0x6CDE, 0x19E5, 0x6CDF, 0x6CDF, 0x3D57, 0x6CE0, 0x6CE0, 0x063F,
+ 0x6CE1, 0x6CE1, 0x0638, 0x6CE2, 0x6CE2, 0x062A, 0x6CE3, 0x6CE3, 0x0620,
+ 0x6CE5, 0x6CE5, 0x0625, 0x6CE7, 0x6CE7, 0x19D6, 0x6CE8, 0x6CE8, 0x0621,
+ 0x6CE9, 0x6CE9, 0x19ED, 0x6CEA, 0x6CEA, 0x3F8D, 0x6CEB, 0x6CEB, 0x19D0,
+ 0x6CEC, 0x6CEC, 0x19CF, 0x6CED, 0x6CED, 0x19DD, 0x6CEE, 0x6CEE, 0x19D1,
+ 0x6CEF, 0x6CEF, 0x063C, 0x6CF0, 0x6CF0, 0x0907, 0x6CF1, 0x6CF1, 0x0635,
+ 0x6CF2, 0x6CF2, 0x19DE, 0x6CF3, 0x6CF3, 0x0622, 0x6CF5, 0x6CF5, 0x077F,
+ 0x6CF9, 0x6CF9, 0x19EB, 0x6D00, 0x6D00, 0x1B55, 0x6D01, 0x6D01, 0x1B58,
+ 0x6D02, 0x6D02, 0x4671, 0x6D03, 0x6D03, 0x1B5B, 0x6D04, 0x6D04, 0x1B50,
+ 0x6D05, 0x6D05, 0x3A19, 0x6D06, 0x6D06, 0x4672, 0x6D07, 0x6D07, 0x1B5E,
+ 0x6D08, 0x6D08, 0x1B61, 0x6D09, 0x6D09, 0x1B63, 0x6D0A, 0x6D0A, 0x1B4D,
+ 0x6D0B, 0x6D0B, 0x0771, 0x6D0C, 0x6D0C, 0x0776, 0x6D0D, 0x6D0D, 0x1CF9,
+ 0x6D0E, 0x6D0E, 0x0786, 0x6D0F, 0x6D0F, 0x1B5C, 0x6D10, 0x6D10, 0x1B64,
+ 0x6D11, 0x6D11, 0x1B54, 0x6D12, 0x6D12, 0x1B4C, 0x6D16, 0x6D16, 0x1D14,
+ 0x6D17, 0x6D17, 0x0779, 0x6D18, 0x6D18, 0x1B59, 0x6D19, 0x6D19, 0x1B51,
+ 0x6D1A, 0x6D1A, 0x1B53, 0x6D1B, 0x6D1B, 0x077E, 0x6D1D, 0x6D1D, 0x1B56,
+ 0x6D1E, 0x6D1E, 0x0778, 0x6D1F, 0x6D1F, 0x1B49, 0x6D20, 0x6D20, 0x1B5F,
+ 0x6D22, 0x6D22, 0x1B62, 0x6D24, 0x6D24, 0x3AC3, 0x6D25, 0x6D25, 0x0775,
+ 0x6D26, 0x6D26, 0x4673, 0x6D27, 0x6D27, 0x0781, 0x6D28, 0x6D28, 0x1B46,
+ 0x6D29, 0x6D29, 0x0783, 0x6D2A, 0x6D2A, 0x0773, 0x6D2B, 0x6D2B, 0x0787,
+ 0x6D2C, 0x6D2C, 0x1B60, 0x6D2D, 0x6D2D, 0x1B48, 0x6D2E, 0x6D2E, 0x0784,
+ 0x6D2F, 0x6D2F, 0x1D0E, 0x6D30, 0x6D30, 0x19E7, 0x6D31, 0x6D31, 0x0777,
+ 0x6D32, 0x6D32, 0x0772, 0x6D33, 0x6D33, 0x1B4F, 0x6D34, 0x6D34, 0x1B47,
+ 0x6D35, 0x6D35, 0x0785, 0x6D36, 0x6D36, 0x077D, 0x6D37, 0x6D37, 0x1B5A,
+ 0x6D38, 0x6D38, 0x0782, 0x6D39, 0x6D39, 0x0780, 0x6D3A, 0x6D3A, 0x1B52,
+ 0x6D3B, 0x6D3B, 0x077A, 0x6D3C, 0x6D3C, 0x1B4A, 0x6D3D, 0x6D3E, 0x077B,
+ 0x6D3F, 0x6D3F, 0x1B4B, 0x6D40, 0x6D40, 0x1B5D, 0x6D41, 0x6D41, 0x0774,
+ 0x6D42, 0x6D42, 0x1B57, 0x6D4E, 0x6D4E, 0x4558, 0x6D57, 0x6D57, 0x3CF3,
+ 0x6D58, 0x6D58, 0x1CFC, 0x6D59, 0x6D59, 0x090F, 0x6D5A, 0x6D5A, 0x0914,
+ 0x6D5B, 0x6D5B, 0x409C, 0x6D5C, 0x6D5C, 0x4222, 0x6D5E, 0x6D5E, 0x1D05,
+ 0x6D5F, 0x6D5F, 0x1D0B, 0x6D60, 0x6D60, 0x1D07, 0x6D61, 0x6D61, 0x1CFA,
+ 0x6D62, 0x6D62, 0x1CFD, 0x6D63, 0x6D64, 0x1CF6, 0x6D65, 0x6D65, 0x091B,
+ 0x6D66, 0x6D66, 0x090C, 0x6D67, 0x6D67, 0x1D06, 0x6D68, 0x6D68, 0x1D0F,
+ 0x6D69, 0x6D69, 0x0916, 0x6D6A, 0x6D6A, 0x0908, 0x6D6C, 0x6D6C, 0x0911,
+ 0x6D6D, 0x6D6D, 0x1CFE, 0x6D6E, 0x6D6E, 0x0913, 0x6D6F, 0x6D6F, 0x1CFF,
+ 0x6D70, 0x6D70, 0x1D09, 0x6D71, 0x6D71, 0x40F5, 0x6D72, 0x6D72, 0x39D7,
+ 0x6D74, 0x6D74, 0x0915, 0x6D75, 0x6D75, 0x1D18, 0x6D76, 0x6D76, 0x1CF8,
+ 0x6D77, 0x6D77, 0x090E, 0x6D78, 0x6D78, 0x090D, 0x6D79, 0x6D79, 0x0919,
+ 0x6D7A, 0x6D7A, 0x1CF5, 0x6D7B, 0x6D7B, 0x1D16, 0x6D7C, 0x6D7C, 0x1D0A,
+ 0x6D7D, 0x6D7D, 0x1D17, 0x6D7E, 0x6D7E, 0x1D11, 0x6D7F, 0x6D7F, 0x1D03,
+ 0x6D80, 0x6D80, 0x1D12, 0x6D81, 0x6D81, 0x4674, 0x6D82, 0x6D82, 0x1D0C,
+ 0x6D83, 0x6D83, 0x1D15, 0x6D84, 0x6D84, 0x1D13, 0x6D85, 0x6D85, 0x091A,
+ 0x6D86, 0x6D86, 0x1D04, 0x6D87, 0x6D87, 0x090B, 0x6D88, 0x6D88, 0x090A,
+ 0x6D89, 0x6D89, 0x0912, 0x6D8A, 0x6D8A, 0x0918, 0x6D8B, 0x6D8B, 0x1D10,
+ 0x6D8C, 0x6D8C, 0x0917, 0x6D8D, 0x6D8D, 0x1D01, 0x6D8E, 0x6D8E, 0x0AEC,
+ 0x6D8F, 0x6D8F, 0x3DE8, 0x6D90, 0x6D90, 0x1D19, 0x6D91, 0x6D91, 0x1D00,
+ 0x6D92, 0x6D92, 0x1CFB, 0x6D93, 0x6D93, 0x0910, 0x6D94, 0x6D94, 0x091C,
+ 0x6D95, 0x6D95, 0x0909, 0x6D96, 0x6D96, 0x4221, 0x6D97, 0x6D97, 0x1D08,
+ 0x6D98, 0x6D98, 0x1D0D, 0x6DA4, 0x6DA4, 0x4676, 0x6DA5, 0x6DA5, 0x3AB9,
+ 0x6DAA, 0x6DAA, 0x0B0E, 0x6DAB, 0x6DAB, 0x1F46, 0x6DAC, 0x6DAC, 0x1F4A,
+ 0x6DAE, 0x6DAE, 0x0AFB, 0x6DAF, 0x6DAF, 0x0AF9, 0x6DB1, 0x6DB1, 0x4677,
+ 0x6DB2, 0x6DB2, 0x0AF0, 0x6DB3, 0x6DB3, 0x1F48, 0x6DB4, 0x6DB4, 0x1F47,
+ 0x6DB5, 0x6DB5, 0x0B04, 0x6DB7, 0x6DB7, 0x1F4D, 0x6DB8, 0x6DB8, 0x0AFE,
+ 0x6DB9, 0x6DB9, 0x3FFB, 0x6DBA, 0x6DBA, 0x1F5F, 0x6DBB, 0x6DBB, 0x1F6B,
+ 0x6DBC, 0x6DBC, 0x0AED, 0x6DBD, 0x6DBD, 0x1F5C, 0x6DBE, 0x6DBE, 0x1F55,
+ 0x6DBF, 0x6DBF, 0x0B10, 0x6DC0, 0x6DC0, 0x1F45, 0x6DC2, 0x6DC2, 0x1F61,
+ 0x6DC4, 0x6DC4, 0x0B0D, 0x6DC5, 0x6DC5, 0x0B01, 0x6DC6, 0x6DC6, 0x0B0C,
+ 0x6DC7, 0x6DC7, 0x0AF7, 0x6DC8, 0x6DC8, 0x1F51, 0x6DC9, 0x6DC9, 0x1F63,
+ 0x6DCA, 0x6DCA, 0x1F5B, 0x6DCB, 0x6DCB, 0x0AF8, 0x6DCC, 0x6DCC, 0x0AF2,
+ 0x6DCD, 0x6DCD, 0x1F69, 0x6DCF, 0x6DCF, 0x1F62, 0x6DD0, 0x6DD0, 0x1F64,
+ 0x6DD1, 0x6DD1, 0x0AFA, 0x6DD2, 0x6DD2, 0x0B02, 0x6DD3, 0x6DD3, 0x1F66,
+ 0x6DD4, 0x6DD4, 0x1F4F, 0x6DD5, 0x6DD5, 0x1F60, 0x6DD6, 0x6DD6, 0x1F54,
+ 0x6DD7, 0x6DD7, 0x1F68, 0x6DD8, 0x6DD8, 0x0B07, 0x6DD9, 0x6DD9, 0x0AEF,
+ 0x6DDA, 0x6DDA, 0x0B05, 0x6DDB, 0x6DDB, 0x1F59, 0x6DDC, 0x6DDD, 0x1F57,
+ 0x6DDE, 0x6DDE, 0x0AFC, 0x6DDF, 0x6DDF, 0x1F53, 0x6DE0, 0x6DE0, 0x1F52,
+ 0x6DE1, 0x6DE1, 0x0AF1, 0x6DE2, 0x6DE2, 0x1F4C, 0x6DE3, 0x6DE3, 0x1F6A,
+ 0x6DE4, 0x6DE4, 0x0AF3, 0x6DE5, 0x6DE5, 0x1F56, 0x6DE6, 0x6DE6, 0x0B11,
+ 0x6DE8, 0x6DE8, 0x0B0B, 0x6DE9, 0x6DE9, 0x1F4B, 0x6DEA, 0x6DEA, 0x0B08,
+ 0x6DEB, 0x6DEB, 0x0B06, 0x6DEC, 0x6DEC, 0x0B0F, 0x6DED, 0x6DED, 0x1F5D,
+ 0x6DEE, 0x6DEE, 0x0B0A, 0x6DEF, 0x6DEF, 0x1D02, 0x6DF0, 0x6DF0, 0x1F5E,
+ 0x6DF1, 0x6DF1, 0x0B09, 0x6DF2, 0x6DF2, 0x1F65, 0x6DF3, 0x6DF3, 0x0AEE,
+ 0x6DF4, 0x6DF4, 0x1F5A, 0x6DF5, 0x6DF5, 0x0B00, 0x6DF6, 0x6DF6, 0x1F4E,
+ 0x6DF7, 0x6DF7, 0x0AFF, 0x6DF9, 0x6DF9, 0x0AFD, 0x6DFA, 0x6DFA, 0x0AF5,
+ 0x6DFB, 0x6DFB, 0x0AF4, 0x6DFC, 0x6DFC, 0x21BF, 0x6DFD, 0x6DFD, 0x1F67,
+ 0x6E00, 0x6E00, 0x1F50, 0x6E02, 0x6E02, 0x3CFA, 0x6E03, 0x6E03, 0x21D4,
+ 0x6E04, 0x6E04, 0x3ABE, 0x6E05, 0x6E05, 0x0AF6, 0x6E0A, 0x6E0A, 0x3AC1,
+ 0x6E0F, 0x6E0F, 0x3CF0, 0x6E15, 0x6E15, 0x4678, 0x6E18, 0x6E18, 0x4679,
+ 0x6E19, 0x6E19, 0x0CC1, 0x6E1A, 0x6E1A, 0x0B03, 0x6E1B, 0x6E1B, 0x0CAF,
+ 0x6E1C, 0x6E1C, 0x21CE, 0x6E1D, 0x6E1D, 0x0CBD, 0x6E1F, 0x6E1F, 0x21C2,
+ 0x6E20, 0x6E20, 0x0CAC, 0x6E21, 0x6E21, 0x0CA8, 0x6E22, 0x6E22, 0x21E0,
+ 0x6E23, 0x6E23, 0x0CAE, 0x6E24, 0x6E24, 0x0CB2, 0x6E25, 0x6E25, 0x0CAD,
+ 0x6E26, 0x6E26, 0x0CB6, 0x6E27, 0x6E27, 0x21E4, 0x6E28, 0x6E28, 0x21DB,
+ 0x6E29, 0x6E29, 0x467A, 0x6E2A, 0x6E2A, 0x4302, 0x6E2B, 0x6E2B, 0x21C9,
+ 0x6E2C, 0x6E2C, 0x0CBB, 0x6E2D, 0x6E2D, 0x0CB5, 0x6E2E, 0x6E2E, 0x21D5,
+ 0x6E2F, 0x6E2F, 0x0CA5, 0x6E30, 0x6E30, 0x21E1, 0x6E31, 0x6E31, 0x21DA,
+ 0x6E32, 0x6E32, 0x0CA9, 0x6E33, 0x6E33, 0x21CF, 0x6E34, 0x6E34, 0x0CB8,
+ 0x6E35, 0x6E36, 0x21EC, 0x6E38, 0x6E38, 0x0CA6, 0x6E39, 0x6E39, 0x21DF,
+ 0x6E3A, 0x6E3A, 0x0CBA, 0x6E3B, 0x6E3B, 0x21D3, 0x6E3C, 0x6E3D, 0x21C5,
+ 0x6E3E, 0x6E3E, 0x0CBE, 0x6E3F, 0x6E3F, 0x21CA, 0x6E40, 0x6E40, 0x21D1,
+ 0x6E41, 0x6E41, 0x21CB, 0x6E43, 0x6E43, 0x0CBC, 0x6E44, 0x6E44, 0x0CC4,
+ 0x6E45, 0x6E45, 0x21C7, 0x6E46, 0x6E47, 0x21C0, 0x6E49, 0x6E49, 0x21C3,
+ 0x6E4A, 0x6E4A, 0x0CAB, 0x6E4B, 0x6E4B, 0x21D0, 0x6E4D, 0x6E4D, 0x0CB9,
+ 0x6E4E, 0x6E4E, 0x0CC2, 0x6E4F, 0x6E4F, 0x4234, 0x6E50, 0x6E50, 0x41D1,
+ 0x6E51, 0x6E51, 0x21D2, 0x6E52, 0x6E52, 0x21EA, 0x6E53, 0x6E53, 0x21E2,
+ 0x6E54, 0x6E54, 0x0CA7, 0x6E55, 0x6E55, 0x21E8, 0x6E56, 0x6E56, 0x0CB3,
+ 0x6E58, 0x6E58, 0x0CB1, 0x6E59, 0x6E59, 0x40E6, 0x6E5A, 0x6E5A, 0x21EE,
+ 0x6E5B, 0x6E5B, 0x0CB0, 0x6E5C, 0x6E5C, 0x21D8, 0x6E5D, 0x6E5D, 0x21CC,
+ 0x6E5E, 0x6E5E, 0x21D6, 0x6E5F, 0x6E5F, 0x0CC7, 0x6E60, 0x6E60, 0x21DC,
+ 0x6E61, 0x6E61, 0x21D9, 0x6E62, 0x6E62, 0x21C8, 0x6E63, 0x6E63, 0x0CC3,
+ 0x6E64, 0x6E64, 0x21E6, 0x6E65, 0x6E65, 0x21E3, 0x6E66, 0x6E66, 0x21EB,
+ 0x6E67, 0x6E67, 0x0CAA, 0x6E68, 0x6E68, 0x21D7, 0x6E69, 0x6E69, 0x0CC6,
+ 0x6E6B, 0x6E6B, 0x21DE, 0x6E6E, 0x6E6E, 0x0CB4, 0x6E6F, 0x6E6F, 0x0CB7,
+ 0x6E71, 0x6E71, 0x21DD, 0x6E72, 0x6E72, 0x0CC5, 0x6E73, 0x6E73, 0x21CD,
+ 0x6E74, 0x6E74, 0x1F49, 0x6E76, 0x6E76, 0x39D3, 0x6E77, 0x6E77, 0x21E7,
+ 0x6E78, 0x6E78, 0x21E5, 0x6E79, 0x6E79, 0x21E9, 0x6E7C, 0x6E7C, 0x4223,
+ 0x6E86, 0x6E86, 0x467B, 0x6E88, 0x6E88, 0x21C4, 0x6E89, 0x6E89, 0x0CC0,
+ 0x6E8B, 0x6E8B, 0x3BBF, 0x6E8D, 0x6E8D, 0x246C, 0x6E8E, 0x6E8E, 0x246B,
+ 0x6E8F, 0x6E8F, 0x2451, 0x6E90, 0x6E90, 0x0E55, 0x6E92, 0x6E92, 0x246A,
+ 0x6E93, 0x6E94, 0x2454, 0x6E96, 0x6E96, 0x0E5F, 0x6E97, 0x6E97, 0x2473,
+ 0x6E98, 0x6E98, 0x0E5A, 0x6E99, 0x6E99, 0x2469, 0x6E9A, 0x6E9A, 0x4581,
+ 0x6E9B, 0x6E9B, 0x244E, 0x6E9C, 0x6E9C, 0x0E60, 0x6E9D, 0x6E9D, 0x0E56,
+ 0x6E9E, 0x6E9E, 0x245D, 0x6E9F, 0x6E9F, 0x2453, 0x6EA0, 0x6EA0, 0x2456,
+ 0x6EA1, 0x6EA1, 0x246E, 0x6EA2, 0x6EA2, 0x0E50, 0x6EA3, 0x6EA3, 0x2475,
+ 0x6EA4, 0x6EA4, 0x246D, 0x6EA5, 0x6EA5, 0x0E59, 0x6EA6, 0x6EA6, 0x2462,
+ 0x6EA7, 0x6EA7, 0x0E64, 0x6EAA, 0x6EAA, 0x0E63, 0x6EAB, 0x6EAB, 0x0E5D,
+ 0x6EAE, 0x6EAE, 0x2474, 0x6EAF, 0x6EAF, 0x0E51, 0x6EB0, 0x6EB0, 0x2460,
+ 0x6EB1, 0x6EB1, 0x2457, 0x6EB2, 0x6EB2, 0x2464, 0x6EB3, 0x6EB3, 0x2470,
+ 0x6EB4, 0x6EB4, 0x0E65, 0x6EB5, 0x6EB5, 0x41FE, 0x6EB6, 0x6EB6, 0x0E53,
+ 0x6EB7, 0x6EB7, 0x245F, 0x6EB8, 0x6EB8, 0x3E0C, 0x6EB9, 0x6EB9, 0x2458,
+ 0x6EBA, 0x6EBA, 0x0E5C, 0x6EBB, 0x6EBB, 0x467D, 0x6EBC, 0x6EBC, 0x0E5B,
+ 0x6EBD, 0x6EBD, 0x245B, 0x6EBE, 0x6EBE, 0x2465, 0x6EBF, 0x6EBF, 0x246F,
+ 0x6EC0, 0x6EC0, 0x2452, 0x6EC1, 0x6EC1, 0x245C, 0x6EC2, 0x6EC2, 0x0E54,
+ 0x6EC3, 0x6EC3, 0x2466, 0x6EC4, 0x6EC4, 0x0E61, 0x6EC5, 0x6EC5, 0x0E58,
+ 0x6EC6, 0x6EC6, 0x2459, 0x6EC7, 0x6EC7, 0x0E57, 0x6EC8, 0x6EC8, 0x2450,
+ 0x6EC9, 0x6EC9, 0x245E, 0x6ECA, 0x6ECA, 0x2472, 0x6ECB, 0x6ECB, 0x0CBF,
+ 0x6ECC, 0x6ECC, 0x101F, 0x6ECD, 0x6ECD, 0x2461, 0x6ECE, 0x6ECE, 0x26EB,
+ 0x6ECF, 0x6ECF, 0x2463, 0x6ED0, 0x6ED0, 0x2471, 0x6ED1, 0x6ED1, 0x0E5E,
+ 0x6ED2, 0x6ED2, 0x245A, 0x6ED3, 0x6ED3, 0x0E52, 0x6ED4, 0x6ED4, 0x0E62,
+ 0x6ED5, 0x6ED5, 0x119A, 0x6ED6, 0x6ED6, 0x244F, 0x6ED8, 0x6ED8, 0x2468,
+ 0x6ED9, 0x6ED9, 0x4069, 0x6EDA, 0x6EDA, 0x467F, 0x6EDB, 0x6EDB, 0x402F,
+ 0x6EDC, 0x6EDC, 0x2467, 0x6EDD, 0x6EDD, 0x4538, 0x6EE2, 0x6EE2, 0x467E,
+ 0x6EE8, 0x6EE9, 0x4681, 0x6EEB, 0x6EEB, 0x2707, 0x6EEC, 0x6EEC, 0x101C,
+ 0x6EED, 0x6EED, 0x26FC, 0x6EEE, 0x6EEE, 0x2701, 0x6EEF, 0x6EEF, 0x1011,
+ 0x6EF1, 0x6EF1, 0x26ED, 0x6EF2, 0x6EF2, 0x101E, 0x6EF4, 0x6EF4, 0x1008,
+ 0x6EF5, 0x6EF5, 0x26EC, 0x6EF6, 0x6EF6, 0x270D, 0x6EF7, 0x6EF7, 0x1020,
+ 0x6EF8, 0x6EF8, 0x26F0, 0x6EF9, 0x6EF9, 0x2700, 0x6EFA, 0x6EFA, 0x423B,
+ 0x6EFB, 0x6EFB, 0x26F2, 0x6EFC, 0x6EFC, 0x2710, 0x6EFD, 0x6EFD, 0x270C,
+ 0x6EFE, 0x6EFE, 0x1006, 0x6EFF, 0x6EFF, 0x1010, 0x6F00, 0x6F00, 0x2946,
+ 0x6F01, 0x6F01, 0x101D, 0x6F02, 0x6F02, 0x100E, 0x6F03, 0x6F03, 0x26EE,
+ 0x6F04, 0x6F04, 0x4224, 0x6F05, 0x6F05, 0x270B, 0x6F06, 0x6F06, 0x1012,
+ 0x6F07, 0x6F07, 0x2708, 0x6F08, 0x6F08, 0x2715, 0x6F09, 0x6F09, 0x26F4,
+ 0x6F0A, 0x6F0A, 0x26FD, 0x6F0B, 0x6F0B, 0x3ABA, 0x6F0C, 0x6F0C, 0x3CFB,
+ 0x6F0D, 0x6F0D, 0x2713, 0x6F0E, 0x6F0E, 0x2709, 0x6F0F, 0x6F0F, 0x100D,
+ 0x6F12, 0x6F12, 0x26FB, 0x6F13, 0x6F13, 0x1007, 0x6F14, 0x6F14, 0x1005,
+ 0x6F15, 0x6F15, 0x1017, 0x6F16, 0x6F16, 0x41A0, 0x6F17, 0x6F17, 0x46CE,
+ 0x6F18, 0x6F18, 0x26F9, 0x6F19, 0x6F1A, 0x26F6, 0x6F1C, 0x6F1C, 0x270F,
+ 0x6F1E, 0x6F1E, 0x2714, 0x6F1F, 0x6F1F, 0x2712, 0x6F20, 0x6F20, 0x100B,
+ 0x6F21, 0x6F21, 0x2716, 0x6F22, 0x6F22, 0x100F, 0x6F23, 0x6F23, 0x1016,
+ 0x6F24, 0x6F24, 0x4683, 0x6F25, 0x6F25, 0x26EF, 0x6F26, 0x6F26, 0x292E,
+ 0x6F27, 0x6F27, 0x26F8, 0x6F29, 0x6F29, 0x1009, 0x6F2A, 0x6F2A, 0x101B,
+ 0x6F2B, 0x6F2B, 0x1018, 0x6F2C, 0x6F2C, 0x100C, 0x6F2D, 0x6F2D, 0x2702,
+ 0x6F2E, 0x6F2E, 0x26F3, 0x6F2F, 0x6F2F, 0x1019, 0x6F30, 0x6F30, 0x2704,
+ 0x6F31, 0x6F31, 0x1013, 0x6F32, 0x6F32, 0x1015, 0x6F33, 0x6F33, 0x1004,
+ 0x6F34, 0x6F34, 0x4684, 0x6F35, 0x6F35, 0x2706, 0x6F36, 0x6F36, 0x26FE,
+ 0x6F37, 0x6F37, 0x26F1, 0x6F38, 0x6F38, 0x1014, 0x6F39, 0x6F39, 0x270E,
+ 0x6F3A, 0x6F3A, 0x2711, 0x6F3B, 0x6F3B, 0x26FA, 0x6F3C, 0x6F3C, 0x2705,
+ 0x6F3D, 0x6F3D, 0x4282, 0x6F3E, 0x6F3E, 0x100A, 0x6F3F, 0x6F3F, 0x1189,
+ 0x6F40, 0x6F40, 0x2703, 0x6F41, 0x6F41, 0x292D, 0x6F43, 0x6F43, 0x270A,
+ 0x6F44, 0x6F44, 0x4240, 0x6F4E, 0x6F4E, 0x26F5, 0x6F4F, 0x6F4F, 0x2937,
+ 0x6F50, 0x6F50, 0x2941, 0x6F51, 0x6F51, 0x118C, 0x6F52, 0x6F52, 0x2940,
+ 0x6F53, 0x6F53, 0x294C, 0x6F54, 0x6F54, 0x118E, 0x6F55, 0x6F55, 0x293E,
+ 0x6F56, 0x6F56, 0x3E52, 0x6F57, 0x6F57, 0x2942, 0x6F58, 0x6F58, 0x1199,
+ 0x6F5A, 0x6F5A, 0x2939, 0x6F5B, 0x6F5B, 0x1191, 0x6F5C, 0x6F5C, 0x4241,
+ 0x6F5D, 0x6F5D, 0x2945, 0x6F5E, 0x6F5E, 0x2B9A, 0x6F5F, 0x6F5F, 0x119D,
+ 0x6F60, 0x6F60, 0x119C, 0x6F61, 0x6F61, 0x2947, 0x6F62, 0x6F62, 0x2936,
+ 0x6F63, 0x6F63, 0x2951, 0x6F64, 0x6F64, 0x1197, 0x6F66, 0x6F66, 0x118D,
+ 0x6F67, 0x6F67, 0x294A, 0x6F69, 0x6F69, 0x294E, 0x6F6A, 0x6F6A, 0x2953,
+ 0x6F6B, 0x6F6B, 0x2948, 0x6F6C, 0x6F6C, 0x293C, 0x6F6D, 0x6F6D, 0x1190,
+ 0x6F6E, 0x6F6E, 0x1193, 0x6F6F, 0x6F6F, 0x119B, 0x6F70, 0x6F70, 0x1196,
+ 0x6F72, 0x6F72, 0x293F, 0x6F73, 0x6F73, 0x26FF, 0x6F74, 0x6F74, 0x4243,
+ 0x6F76, 0x6F76, 0x293B, 0x6F77, 0x6F77, 0x2952, 0x6F78, 0x6F78, 0x1192,
+ 0x6F79, 0x6F79, 0x3BBE, 0x6F7A, 0x6F7A, 0x1195, 0x6F7B, 0x6F7B, 0x2954,
+ 0x6F7C, 0x6F7C, 0x118A, 0x6F7D, 0x6F7D, 0x2949, 0x6F7E, 0x6F7E, 0x292F,
+ 0x6F7F, 0x6F7F, 0x294F, 0x6F80, 0x6F80, 0x13FC, 0x6F81, 0x6F81, 0x4687,
+ 0x6F82, 0x6F82, 0x293D, 0x6F84, 0x6F84, 0x118B, 0x6F85, 0x6F85, 0x2938,
+ 0x6F86, 0x6F86, 0x118F, 0x6F87, 0x6F87, 0x2930, 0x6F88, 0x6F88, 0x101A,
+ 0x6F89, 0x6F89, 0x2934, 0x6F8A, 0x6F8A, 0x4195, 0x6F8B, 0x6F8B, 0x294D,
+ 0x6F8C, 0x6F8C, 0x2935, 0x6F8D, 0x6F8D, 0x2933, 0x6F8E, 0x6F8E, 0x1194,
+ 0x6F90, 0x6F90, 0x294B, 0x6F92, 0x6F92, 0x2932, 0x6F93, 0x6F93, 0x2944,
+ 0x6F94, 0x6F94, 0x2943, 0x6F95, 0x6F95, 0x2950, 0x6F96, 0x6F96, 0x293A,
+ 0x6F97, 0x6F97, 0x1198, 0x6F9D, 0x6F9D, 0x4239, 0x6F9E, 0x6F9E, 0x2B9D,
+ 0x6F9F, 0x6F9F, 0x4246, 0x6FA0, 0x6FA0, 0x12EB, 0x6FA1, 0x6FA1, 0x12E1,
+ 0x6FA2, 0x6FA2, 0x2BA9, 0x6FA3, 0x6FA3, 0x2B95, 0x6FA4, 0x6FA4, 0x12E3,
+ 0x6FA5, 0x6FA5, 0x2BA1, 0x6FA6, 0x6FA6, 0x12EA, 0x6FA7, 0x6FA7, 0x12E5,
+ 0x6FA8, 0x6FA8, 0x2B9F, 0x6FA9, 0x6FA9, 0x2D8E, 0x6FAA, 0x6FAA, 0x2BA5,
+ 0x6FAB, 0x6FAB, 0x2BAB, 0x6FAC, 0x6FAC, 0x2BA4, 0x6FAD, 0x6FAD, 0x2B93,
+ 0x6FAE, 0x6FAE, 0x2BA2, 0x6FAF, 0x6FAF, 0x2BAD, 0x6FB0, 0x6FB0, 0x2BAF,
+ 0x6FB1, 0x6FB1, 0x12E0, 0x6FB2, 0x6FB2, 0x2BAE, 0x6FB3, 0x6FB3, 0x12E6,
+ 0x6FB4, 0x6FB4, 0x12EC, 0x6FB5, 0x6FB5, 0x3E27, 0x6FB6, 0x6FB6, 0x12E9,
+ 0x6FB8, 0x6FB8, 0x2BA8, 0x6FB9, 0x6FB9, 0x12E8, 0x6FBA, 0x6FBA, 0x2BA3,
+ 0x6FBB, 0x6FBB, 0x3BBB, 0x6FBC, 0x6FBC, 0x2B97, 0x6FBD, 0x6FBD, 0x2B9C,
+ 0x6FBE, 0x6FBE, 0x4688, 0x6FBF, 0x6FBF, 0x2BA7, 0x6FC0, 0x6FC0, 0x12E7,
+ 0x6FC1, 0x6FC1, 0x12E4, 0x6FC2, 0x6FC2, 0x12DF, 0x6FC3, 0x6FC3, 0x12E2,
+ 0x6FC4, 0x6FC4, 0x2B9B, 0x6FC6, 0x6FC6, 0x2931, 0x6FC7, 0x6FC7, 0x2B96,
+ 0x6FC8, 0x6FC8, 0x2B99, 0x6FC9, 0x6FC9, 0x2BAA, 0x6FCA, 0x6FCA, 0x2B9E,
+ 0x6FCB, 0x6FCB, 0x2B94, 0x6FCC, 0x6FCC, 0x2D8D, 0x6FCD, 0x6FCD, 0x2BAC,
+ 0x6FCE, 0x6FCE, 0x2B98, 0x6FCF, 0x6FCF, 0x2BA6, 0x6FD3, 0x6FD3, 0x4248,
+ 0x6FD4, 0x6FD4, 0x2D90, 0x6FD5, 0x6FD5, 0x1400, 0x6FD8, 0x6FD8, 0x13F4,
+ 0x6FD9, 0x6FD9, 0x3C74, 0x6FDA, 0x6FDA, 0x3C73, 0x6FDB, 0x6FDB, 0x13F8,
+ 0x6FDC, 0x6FDC, 0x2D92, 0x6FDD, 0x6FDD, 0x2D98, 0x6FDE, 0x6FDE, 0x2D96,
+ 0x6FDF, 0x6FE0, 0x13F6, 0x6FE1, 0x6FE1, 0x13FE, 0x6FE2, 0x6FE2, 0x2D99,
+ 0x6FE3, 0x6FE3, 0x2D91, 0x6FE4, 0x6FE4, 0x13F9, 0x6FE6, 0x6FE6, 0x2D95,
+ 0x6FE7, 0x6FE7, 0x2D94, 0x6FE8, 0x6FE8, 0x2D9A, 0x6FE9, 0x6FE9, 0x13FF,
+ 0x6FEB, 0x6FEB, 0x13FA, 0x6FEC, 0x6FEC, 0x13FD, 0x6FED, 0x6FED, 0x2D93,
+ 0x6FEE, 0x6FEE, 0x1401, 0x6FEF, 0x6FEF, 0x13FB, 0x6FF0, 0x6FF0, 0x1402,
+ 0x6FF1, 0x6FF1, 0x13F5, 0x6FF2, 0x6FF2, 0x2D97, 0x6FF4, 0x6FF4, 0x2D8F,
+ 0x6FF6, 0x6FF6, 0x38A5, 0x6FF7, 0x6FF7, 0x2F4E, 0x6FF8, 0x6FF8, 0x4237,
+ 0x6FFA, 0x6FFA, 0x14EB, 0x6FFB, 0x6FFB, 0x2F4B, 0x6FFC, 0x6FFC, 0x2F4D,
+ 0x6FFE, 0x6FFE, 0x14E9, 0x6FFF, 0x6FFF, 0x2F49, 0x7000, 0x7000, 0x2F4A,
+ 0x7001, 0x7001, 0x2F45, 0x7003, 0x7003, 0x46E2, 0x7004, 0x7004, 0x2BA0,
+ 0x7005, 0x7005, 0x2F46, 0x7006, 0x7006, 0x14EA, 0x7007, 0x7007, 0x2F42,
+ 0x7009, 0x7009, 0x14E7, 0x700A, 0x700A, 0x2F4F, 0x700B, 0x700B, 0x14E8,
+ 0x700C, 0x700D, 0x2F43, 0x700E, 0x700E, 0x2F48, 0x700F, 0x700F, 0x14ED,
+ 0x7011, 0x7011, 0x14EC, 0x7014, 0x7014, 0x2F47, 0x7015, 0x7015, 0x158F,
+ 0x7016, 0x7016, 0x30AD, 0x7017, 0x7017, 0x30B3, 0x7018, 0x7018, 0x1590,
+ 0x7019, 0x7019, 0x30AA, 0x701A, 0x701A, 0x158D, 0x701B, 0x701B, 0x158A,
+ 0x701C, 0x701C, 0x30B5, 0x701D, 0x701D, 0x158E, 0x701E, 0x701E, 0x3C76,
+ 0x701F, 0x701F, 0x158B, 0x7020, 0x7020, 0x30AC, 0x7021, 0x7023, 0x30AF,
+ 0x7024, 0x7024, 0x30B4, 0x7026, 0x7026, 0x2F4C, 0x7027, 0x7027, 0x30AB,
+ 0x7028, 0x7028, 0x158C, 0x7029, 0x7029, 0x30B2, 0x702A, 0x702A, 0x31EF,
+ 0x702B, 0x702B, 0x30AE, 0x702C, 0x702C, 0x468E, 0x702F, 0x702F, 0x31E6,
+ 0x7030, 0x7030, 0x161D, 0x7031, 0x7031, 0x31E9, 0x7032, 0x7032, 0x161E,
+ 0x7033, 0x7033, 0x31F2, 0x7034, 0x7034, 0x31E8, 0x7035, 0x7035, 0x31E5,
+ 0x7037, 0x7037, 0x31E7, 0x7038, 0x7038, 0x31EB, 0x7039, 0x7039, 0x31EE,
+ 0x703A, 0x703A, 0x31ED, 0x703B, 0x703B, 0x31F1, 0x703C, 0x703C, 0x31E4,
+ 0x703E, 0x703E, 0x161C, 0x703F, 0x703F, 0x31EC, 0x7040, 0x7040, 0x31F0,
+ 0x7041, 0x7041, 0x31F3, 0x7042, 0x7042, 0x31EA, 0x7043, 0x7044, 0x32D8,
+ 0x7045, 0x7046, 0x32DD, 0x7048, 0x7049, 0x32DB, 0x704A, 0x704A, 0x32DA,
+ 0x704B, 0x704B, 0x4254, 0x704C, 0x704C, 0x167A, 0x7050, 0x7050, 0x4690,
+ 0x7051, 0x7051, 0x16C8, 0x7052, 0x7052, 0x338C, 0x7054, 0x7054, 0x4691,
+ 0x7055, 0x7057, 0x3389, 0x7058, 0x7058, 0x16C9, 0x705A, 0x705A, 0x3423,
+ 0x705B, 0x705B, 0x3422, 0x705C, 0x705C, 0x3852, 0x705D, 0x705D, 0x348A,
+ 0x705E, 0x705E, 0x1722, 0x705F, 0x705F, 0x3488, 0x7060, 0x7060, 0x348B,
+ 0x7061, 0x7061, 0x3489, 0x7062, 0x7062, 0x34D0, 0x7063, 0x7063, 0x1744,
+ 0x7064, 0x7064, 0x1752, 0x7065, 0x7065, 0x351C, 0x7066, 0x7066, 0x3506,
+ 0x7067, 0x7067, 0x3CF5, 0x7068, 0x7068, 0x351B, 0x7069, 0x706A, 0x3547,
+ 0x706B, 0x706B, 0x02E6, 0x706C, 0x706C, 0x44F1, 0x706F, 0x706F, 0x4692,
+ 0x7070, 0x7070, 0x03F2, 0x7071, 0x7071, 0x180A, 0x7074, 0x7074, 0x18C3,
+ 0x7075, 0x7075, 0x38C7, 0x7076, 0x7076, 0x04E6, 0x7078, 0x7078, 0x04E9,
+ 0x7079, 0x7079, 0x4099, 0x707A, 0x707A, 0x18C4, 0x707C, 0x707D, 0x04E7,
+ 0x707E, 0x707E, 0x4255, 0x707F, 0x707F, 0x4693, 0x7081, 0x7081, 0x4959,
+ 0x7082, 0x7082, 0x19F7, 0x7083, 0x7083, 0x19F9, 0x7084, 0x7084, 0x19F4,
+ 0x7085, 0x7085, 0x19F1, 0x7086, 0x7086, 0x19F3, 0x7089, 0x7089, 0x43F9,
+ 0x708A, 0x708A, 0x0643, 0x708B, 0x708B, 0x40CB, 0x708E, 0x708E, 0x0641,
+ 0x708F, 0x708F, 0x46B3, 0x7091, 0x7091, 0x19F5, 0x7092, 0x7092, 0x0642,
+ 0x7093, 0x7093, 0x19F2, 0x7094, 0x7094, 0x19EF, 0x7095, 0x7095, 0x0640,
+ 0x7096, 0x7096, 0x19F6, 0x7098, 0x7098, 0x19F0, 0x7099, 0x7099, 0x0644,
+ 0x709A, 0x709A, 0x19F8, 0x709F, 0x709F, 0x1B66, 0x70A0, 0x70A0, 0x4742,
+ 0x70A1, 0x70A1, 0x1B6A, 0x70A3, 0x70A3, 0x3972, 0x70A4, 0x70A4, 0x0790,
+ 0x70A5, 0x70A5, 0x3CB7, 0x70A6, 0x70A6, 0x3D53, 0x70A7, 0x70A7, 0x4256,
+ 0x70A9, 0x70A9, 0x1B6D, 0x70AB, 0x70AB, 0x0788, 0x70AC, 0x70AC, 0x078B,
+ 0x70AD, 0x70AD, 0x078D, 0x70AE, 0x70AE, 0x078F, 0x70AF, 0x70AF, 0x078C,
+ 0x70B0, 0x70B0, 0x1B69, 0x70B1, 0x70B1, 0x1B68, 0x70B3, 0x70B3, 0x078A,
+ 0x70B4, 0x70B5, 0x1B6B, 0x70B7, 0x70B7, 0x1B65, 0x70B8, 0x70B8, 0x078E,
+ 0x70B9, 0x70B9, 0x3D69, 0x70BA, 0x70BA, 0x0789, 0x70BB, 0x70BB, 0x4812,
+ 0x70BC, 0x70BC, 0x4559, 0x70BD, 0x70BD, 0x4270, 0x70BE, 0x70BE, 0x1B67,
+ 0x70C0, 0x70C0, 0x4733, 0x70C4, 0x70C4, 0x3BAA, 0x70C5, 0x70C7, 0x1D27,
+ 0x70C8, 0x70C8, 0x0921, 0x70CA, 0x70CA, 0x091D, 0x70CB, 0x70CB, 0x1D1E,
+ 0x70CC, 0x70CC, 0x4258, 0x70CD, 0x70CD, 0x1D26, 0x70CE, 0x70CE, 0x1D2B,
+ 0x70CF, 0x70CF, 0x0922, 0x70D0, 0x70D0, 0x396D, 0x70D1, 0x70D1, 0x1D1C,
+ 0x70D2, 0x70D2, 0x1D22, 0x70D3, 0x70D3, 0x1D1B, 0x70D4, 0x70D4, 0x1D25,
+ 0x70D5, 0x70D6, 0x4259, 0x70D7, 0x70D7, 0x1D21, 0x70D8, 0x70D8, 0x091E,
+ 0x70D9, 0x70D9, 0x0920, 0x70DA, 0x70DA, 0x1D2A, 0x70DC, 0x70DC, 0x1D1A,
+ 0x70DD, 0x70DD, 0x1D1D, 0x70DE, 0x70DE, 0x1D23, 0x70DF, 0x70DF, 0x425B,
+ 0x70E0, 0x70E0, 0x1D24, 0x70E1, 0x70E1, 0x1D2C, 0x70E2, 0x70E2, 0x1D20,
+ 0x70E4, 0x70E4, 0x091F, 0x70EF, 0x70EF, 0x0B16, 0x70F0, 0x70F0, 0x1F72,
+ 0x70F1, 0x70F1, 0x3AC8, 0x70F3, 0x70F3, 0x1F74, 0x70F4, 0x70F4, 0x1F70,
+ 0x70F5, 0x70F5, 0x4760, 0x70F6, 0x70F6, 0x1F7C, 0x70F7, 0x70F7, 0x1F6E,
+ 0x70F8, 0x70F8, 0x1F7B, 0x70F9, 0x70F9, 0x0B12, 0x70FA, 0x70FA, 0x1F6C,
+ 0x70FB, 0x70FB, 0x21F2, 0x70FC, 0x70FC, 0x1F76, 0x70FD, 0x70FD, 0x0B15,
+ 0x70FE, 0x70FE, 0x3D0E, 0x70FF, 0x70FF, 0x1F77, 0x7100, 0x7100, 0x1F7A,
+ 0x7102, 0x7102, 0x1F7E, 0x7104, 0x7104, 0x1F73, 0x7105, 0x7105, 0x3A23,
+ 0x7106, 0x7106, 0x1F78, 0x7109, 0x710A, 0x0B13, 0x710B, 0x710B, 0x1F7D,
+ 0x710C, 0x710C, 0x1F71, 0x710D, 0x710D, 0x1F6D, 0x710E, 0x710E, 0x1F7F,
+ 0x7110, 0x7110, 0x1F75, 0x7113, 0x7113, 0x1F79, 0x7117, 0x7117, 0x1F6F,
+ 0x7119, 0x711A, 0x0CC8, 0x711B, 0x711B, 0x21FC, 0x711C, 0x711C, 0x0CCF,
+ 0x711D, 0x711D, 0x3D47, 0x711E, 0x711E, 0x21F0, 0x711F, 0x711F, 0x21F9,
+ 0x7120, 0x7120, 0x21EF, 0x7121, 0x7121, 0x0CCC, 0x7122, 0x7122, 0x21F7,
+ 0x7123, 0x7123, 0x21F5, 0x7125, 0x7125, 0x21F6, 0x7126, 0x7126, 0x0CCA,
+ 0x7128, 0x7128, 0x21FA, 0x7129, 0x7129, 0x3BA9, 0x712B, 0x712B, 0x4261,
+ 0x712C, 0x712C, 0x426A, 0x712E, 0x712E, 0x21F3, 0x712F, 0x712F, 0x21F1,
+ 0x7130, 0x7130, 0x0CCB, 0x7131, 0x7131, 0x21F4, 0x7132, 0x7132, 0x21F8,
+ 0x7133, 0x7133, 0x3D54, 0x7134, 0x7134, 0x3C7E, 0x7135, 0x7135, 0x376D,
+ 0x7136, 0x7136, 0x0CCD, 0x713A, 0x713A, 0x21FB, 0x713B, 0x713B, 0x3AC5,
+ 0x713E, 0x713E, 0x372E, 0x7140, 0x7140, 0x4398, 0x7141, 0x7141, 0x247B,
+ 0x7142, 0x7142, 0x2482, 0x7143, 0x7143, 0x2484, 0x7144, 0x7144, 0x248A,
+ 0x7145, 0x7145, 0x4262, 0x7146, 0x7146, 0x0E72, 0x7147, 0x7147, 0x2476,
+ 0x7149, 0x7149, 0x0E6A, 0x714A, 0x714A, 0x4264, 0x714B, 0x714B, 0x2485,
+ 0x714C, 0x714C, 0x0E6F, 0x714D, 0x714D, 0x248B, 0x714E, 0x714E, 0x0E66,
+ 0x714F, 0x714F, 0x4267, 0x7150, 0x7150, 0x2488, 0x7151, 0x7151, 0x4865,
+ 0x7152, 0x7152, 0x2478, 0x7153, 0x7153, 0x2489, 0x7154, 0x7154, 0x2477,
+ 0x7156, 0x7156, 0x0E74, 0x7158, 0x7158, 0x2483, 0x7159, 0x7159, 0x0E67,
+ 0x715A, 0x715A, 0x248C, 0x715C, 0x715C, 0x0E6C, 0x715D, 0x715D, 0x247C,
+ 0x715E, 0x715E, 0x0E71, 0x715F, 0x715F, 0x2487, 0x7160, 0x7160, 0x247A,
+ 0x7161, 0x7161, 0x2481, 0x7162, 0x7162, 0x247D, 0x7163, 0x7163, 0x2479,
+ 0x7164, 0x7164, 0x0E69, 0x7165, 0x7165, 0x0E70, 0x7166, 0x7166, 0x0E6E,
+ 0x7167, 0x7167, 0x0E6B, 0x7168, 0x7168, 0x0E73, 0x7169, 0x7169, 0x0E68,
+ 0x716A, 0x716A, 0x2480, 0x716B, 0x716B, 0x3CC5, 0x716C, 0x716C, 0x0E6D,
+ 0x716E, 0x716E, 0x0CCE, 0x7170, 0x7170, 0x2486, 0x7171, 0x7171, 0x3DC0,
+ 0x7172, 0x7172, 0x247E, 0x7173, 0x7173, 0x47E7, 0x7175, 0x7175, 0x3CED,
+ 0x7176, 0x7176, 0x4000, 0x7177, 0x7177, 0x3957, 0x7178, 0x7178, 0x247F,
+ 0x717A, 0x717A, 0x4924, 0x717B, 0x717B, 0x271E, 0x717C, 0x717C, 0x3835,
+ 0x717D, 0x717D, 0x1023, 0x717E, 0x717E, 0x3970, 0x7180, 0x7180, 0x271A,
+ 0x7181, 0x7181, 0x2720, 0x7182, 0x7182, 0x271C, 0x7184, 0x7184, 0x1025,
+ 0x7185, 0x7185, 0x271B, 0x7186, 0x7186, 0x271F, 0x7187, 0x7187, 0x2717,
+ 0x7188, 0x7188, 0x4706, 0x7189, 0x7189, 0x2719, 0x718A, 0x718A, 0x1024,
+ 0x718C, 0x718C, 0x39EA, 0x718E, 0x718E, 0x3D3B, 0x718F, 0x718F, 0x271D,
+ 0x7190, 0x7190, 0x2718, 0x7192, 0x7192, 0x1026, 0x7194, 0x7194, 0x1021,
+ 0x7196, 0x7196, 0x425F, 0x7197, 0x7197, 0x2721, 0x7198, 0x7198, 0x481D,
+ 0x7199, 0x7199, 0x1022, 0x719A, 0x719A, 0x295A, 0x719B, 0x719B, 0x2957,
+ 0x719C, 0x719C, 0x2963, 0x719D, 0x719D, 0x295D, 0x719E, 0x719E, 0x295F,
+ 0x719F, 0x719F, 0x119E, 0x71A0, 0x71A0, 0x2959, 0x71A1, 0x71A1, 0x2961,
+ 0x71A2, 0x71A2, 0x48C1, 0x71A3, 0x71A3, 0x3EC8, 0x71A4, 0x71A4, 0x2960,
+ 0x71A5, 0x71A5, 0x295E, 0x71A7, 0x71A7, 0x2964, 0x71A8, 0x71A8, 0x11A1,
+ 0x71A9, 0x71A9, 0x295B, 0x71AA, 0x71AA, 0x2962, 0x71AC, 0x71AC, 0x119F,
+ 0x71AD, 0x71AD, 0x3E1D, 0x71AF, 0x71AF, 0x2956, 0x71B0, 0x71B0, 0x2958,
+ 0x71B1, 0x71B1, 0x11A0, 0x71B2, 0x71B2, 0x2955, 0x71B3, 0x71B3, 0x2965,
+ 0x71B4, 0x71B4, 0x425E, 0x71B5, 0x71B5, 0x295C, 0x71B7, 0x71B7, 0x468B,
+ 0x71B8, 0x71B8, 0x2BB3, 0x71B9, 0x71B9, 0x12F3, 0x71BA, 0x71BA, 0x426E,
+ 0x71BC, 0x71BC, 0x2BBE, 0x71BD, 0x71BD, 0x2BBC, 0x71BE, 0x71BE, 0x12ED,
+ 0x71BF, 0x71BF, 0x2BB2, 0x71C0, 0x71C1, 0x2BB5, 0x71C2, 0x71C2, 0x2BB1,
+ 0x71C3, 0x71C4, 0x12F7, 0x71C5, 0x71C5, 0x2BB0, 0x71C6, 0x71C6, 0x2BBF,
+ 0x71C7, 0x71C7, 0x2BBA, 0x71C8, 0x71C8, 0x12F1, 0x71C9, 0x71C9, 0x12EE,
+ 0x71CA, 0x71CA, 0x2BB9, 0x71CB, 0x71CB, 0x2BB7, 0x71CE, 0x71CE, 0x12F4,
+ 0x71CF, 0x71CF, 0x2BBB, 0x71D0, 0x71D0, 0x12EF, 0x71D1, 0x71D1, 0x373D,
+ 0x71D2, 0x71D2, 0x12F0, 0x71D4, 0x71D4, 0x2BB8, 0x71D5, 0x71D5, 0x12F2,
+ 0x71D6, 0x71D6, 0x2BB4, 0x71D8, 0x71D8, 0x2BBD, 0x71D9, 0x71D9, 0x12F5,
+ 0x71DA, 0x71DB, 0x2BC0, 0x71DC, 0x71DC, 0x12F6, 0x71DD, 0x71DD, 0x4078,
+ 0x71DF, 0x71DF, 0x1404, 0x71E0, 0x71E0, 0x140B, 0x71E1, 0x71E1, 0x2D9B,
+ 0x71E2, 0x71E2, 0x2DA1, 0x71E4, 0x71E4, 0x2D9F, 0x71E5, 0x71E5, 0x1407,
+ 0x71E6, 0x71E6, 0x1406, 0x71E7, 0x71E7, 0x1403, 0x71E8, 0x71E8, 0x2D9D,
+ 0x71EB, 0x71EB, 0x3C81, 0x71EC, 0x71EC, 0x1409, 0x71ED, 0x71ED, 0x1408,
+ 0x71EE, 0x71EE, 0x1405, 0x71F0, 0x71F0, 0x2DA0, 0x71F1, 0x71F1, 0x2D9C,
+ 0x71F2, 0x71F2, 0x2D9E, 0x71F4, 0x71F4, 0x140A, 0x71F5, 0x71F5, 0x46EE,
+ 0x71F6, 0x71F6, 0x3E9A, 0x71F8, 0x71F8, 0x14F1, 0x71F9, 0x71F9, 0x2F52,
+ 0x71FB, 0x71FC, 0x14EE, 0x71FD, 0x71FD, 0x2F54, 0x71FE, 0x71FE, 0x14F0,
+ 0x71FF, 0x71FF, 0x2F51, 0x7201, 0x7201, 0x2F50, 0x7202, 0x7202, 0x30B9,
+ 0x7203, 0x7203, 0x2F53, 0x7205, 0x7205, 0x30BA, 0x7206, 0x7206, 0x1591,
+ 0x7207, 0x7207, 0x30B8, 0x7209, 0x7209, 0x3DBB, 0x720A, 0x720A, 0x30B7,
+ 0x720C, 0x720C, 0x30B6, 0x720D, 0x720D, 0x1592, 0x720E, 0x720E, 0x4271,
+ 0x720F, 0x720F, 0x39FC, 0x7210, 0x7210, 0x161F, 0x7213, 0x7214, 0x31F4,
+ 0x7215, 0x7215, 0x4273, 0x7216, 0x7216, 0x3953, 0x7217, 0x7217, 0x3969,
+ 0x7219, 0x7219, 0x32E1, 0x721A, 0x721A, 0x32E0, 0x721B, 0x721B, 0x167B,
+ 0x721D, 0x721D, 0x32DF, 0x721E, 0x721F, 0x338D, 0x7222, 0x7222, 0x3424,
+ 0x7223, 0x7223, 0x348C, 0x7224, 0x7224, 0x4276, 0x7226, 0x7226, 0x34D1,
+ 0x7227, 0x7227, 0x3535, 0x7228, 0x7228, 0x1766, 0x7229, 0x7229, 0x3549,
+ 0x722A, 0x722A, 0x02E7, 0x722B, 0x722B, 0x44F2, 0x722C, 0x722D, 0x0645,
+ 0x722E, 0x722E, 0x4279, 0x7230, 0x7230, 0x0791, 0x7235, 0x7235, 0x140C,
+ 0x7236, 0x7236, 0x02E8, 0x7238, 0x7238, 0x0647, 0x7239, 0x7239, 0x0923,
+ 0x723A, 0x723A, 0x0E75, 0x723B, 0x723B, 0x02E9, 0x723D, 0x723D, 0x0B17,
+ 0x723E, 0x723E, 0x1027, 0x723F, 0x723F, 0x178D, 0x7240, 0x7240, 0x427A,
+ 0x7241, 0x7241, 0x1B6E, 0x7242, 0x7242, 0x1D2D, 0x7244, 0x7244, 0x2722,
+ 0x7246, 0x7246, 0x140D, 0x7247, 0x7247, 0x02EA, 0x7248, 0x7248, 0x0648,
+ 0x7249, 0x724A, 0x1B6F, 0x724B, 0x724B, 0x21FD, 0x724C, 0x724C, 0x0CD0,
+ 0x724F, 0x724F, 0x248D, 0x7250, 0x7250, 0x3AC9, 0x7252, 0x7252, 0x0E76,
+ 0x7253, 0x7253, 0x2723, 0x7255, 0x7255, 0x427D, 0x7256, 0x7256, 0x11A2,
+ 0x7257, 0x7257, 0x427E, 0x7258, 0x7258, 0x1593, 0x7259, 0x7259, 0x02EB,
+ 0x725A, 0x725A, 0x21FE, 0x725B, 0x725B, 0x02EC, 0x725C, 0x725C, 0x465A,
+ 0x725D, 0x725D, 0x03F4, 0x725E, 0x725E, 0x180B, 0x725F, 0x725F, 0x03F3,
+ 0x7260, 0x7260, 0x04EC, 0x7261, 0x7261, 0x04EB, 0x7262, 0x7262, 0x04EA,
+ 0x7263, 0x7263, 0x18C5, 0x7266, 0x7266, 0x3EBB, 0x7267, 0x7267, 0x0649,
+ 0x7269, 0x7269, 0x064A, 0x726A, 0x726A, 0x19FA, 0x726C, 0x726C, 0x1B71,
+ 0x726E, 0x726E, 0x1B74, 0x726F, 0x726F, 0x0793, 0x7270, 0x7270, 0x1B72,
+ 0x7272, 0x7272, 0x0792, 0x7273, 0x7273, 0x1B73, 0x7274, 0x7274, 0x0794,
+ 0x7276, 0x7276, 0x1D30, 0x7277, 0x7277, 0x1D2F, 0x7278, 0x7278, 0x1D2E,
+ 0x7279, 0x7279, 0x0924, 0x727B, 0x727C, 0x1F81, 0x727D, 0x727D, 0x0B18,
+ 0x727E, 0x727E, 0x1F80, 0x727F, 0x727F, 0x1F83, 0x7280, 0x7280, 0x0CD2,
+ 0x7281, 0x7281, 0x0B19, 0x7282, 0x7282, 0x4283, 0x7284, 0x7284, 0x0CD1,
+ 0x7285, 0x7285, 0x2202, 0x7286, 0x7286, 0x2201, 0x7287, 0x7287, 0x3ACA,
+ 0x7288, 0x7289, 0x21FF, 0x728B, 0x728B, 0x2203, 0x728C, 0x728C, 0x248F,
+ 0x728D, 0x728D, 0x248E, 0x728E, 0x728E, 0x2492, 0x728F, 0x728F, 0x43C9,
+ 0x7290, 0x7290, 0x2491, 0x7291, 0x7291, 0x2490, 0x7292, 0x7292, 0x1028,
+ 0x7293, 0x7293, 0x2726, 0x7294, 0x7294, 0x3ACB, 0x7295, 0x7295, 0x2725,
+ 0x7296, 0x7296, 0x1029, 0x7297, 0x7297, 0x2724, 0x7298, 0x7298, 0x2966,
+ 0x729A, 0x729A, 0x2967, 0x729B, 0x729B, 0x11A3, 0x729D, 0x729E, 0x2BC2,
+ 0x729F, 0x729F, 0x473A, 0x72A1, 0x72A1, 0x30BF, 0x72A2, 0x72A2, 0x1594,
+ 0x72A3, 0x72A3, 0x30BE, 0x72A4, 0x72A4, 0x30BD, 0x72A5, 0x72A6, 0x30BB,
+ 0x72A7, 0x72A7, 0x167C, 0x72A8, 0x72A8, 0x31F6, 0x72A9, 0x72A9, 0x338F,
+ 0x72AA, 0x72AA, 0x34D2, 0x72AC, 0x72AC, 0x02ED, 0x72AD, 0x72AD, 0x44F4,
+ 0x72AE, 0x72AE, 0x17AF, 0x72AF, 0x72AF, 0x0355, 0x72B0, 0x72B0, 0x17B0,
+ 0x72B2, 0x72B2, 0x3FB6, 0x72B4, 0x72B5, 0x180C, 0x72BA, 0x72BA, 0x18CB,
+ 0x72BD, 0x72BD, 0x18C7, 0x72BF, 0x72BF, 0x18C6, 0x72C0, 0x72C0, 0x064B,
+ 0x72C1, 0x72C1, 0x18CA, 0x72C2, 0x72C2, 0x04EE, 0x72C3, 0x72C3, 0x18C8,
+ 0x72C4, 0x72C4, 0x04ED, 0x72C5, 0x72C5, 0x18CC, 0x72C6, 0x72C6, 0x18C9,
+ 0x72C9, 0x72C9, 0x19FE, 0x72CA, 0x72CA, 0x1B75, 0x72CB, 0x72CB, 0x19FC,
+ 0x72CC, 0x72CC, 0x1A03, 0x72CD, 0x72CD, 0x43CA, 0x72CE, 0x72CE, 0x064C,
+ 0x72D0, 0x72D0, 0x064F, 0x72D1, 0x72D1, 0x1A04, 0x72D2, 0x72D2, 0x1A00,
+ 0x72D4, 0x72D4, 0x1A01, 0x72D6, 0x72D6, 0x19FB, 0x72D7, 0x72D7, 0x064E,
+ 0x72D8, 0x72D8, 0x19FD, 0x72D9, 0x72D9, 0x064D, 0x72DA, 0x72DA, 0x1A02,
+ 0x72DC, 0x72DC, 0x19FF, 0x72DF, 0x72DF, 0x1B79, 0x72E0, 0x72E1, 0x0796,
+ 0x72E2, 0x72E2, 0x3F97, 0x72E3, 0x72E3, 0x1B7C, 0x72E4, 0x72E4, 0x1B76,
+ 0x72E6, 0x72E6, 0x1B7B, 0x72E8, 0x72E8, 0x1B77, 0x72E9, 0x72E9, 0x0795,
+ 0x72EA, 0x72EA, 0x1B7A, 0x72EB, 0x72EB, 0x1B78, 0x72F3, 0x72F3, 0x1D36,
+ 0x72F4, 0x72F4, 0x1D33, 0x72F6, 0x72F6, 0x1D35, 0x72F7, 0x72F7, 0x0929,
+ 0x72F8, 0x72F8, 0x0928, 0x72F9, 0x72F9, 0x0926, 0x72FA, 0x72FA, 0x1D32,
+ 0x72FB, 0x72FB, 0x1D37, 0x72FC, 0x72FC, 0x0925, 0x72FD, 0x72FD, 0x0927,
+ 0x72FE, 0x72FE, 0x1D34, 0x72FF, 0x72FF, 0x1F8B, 0x7300, 0x7300, 0x1D31,
+ 0x7301, 0x7301, 0x1D38, 0x7302, 0x7302, 0x3F9A, 0x7304, 0x7304, 0x3EB5,
+ 0x7307, 0x7307, 0x1F86, 0x7308, 0x7308, 0x1F8A, 0x730A, 0x730A, 0x1F89,
+ 0x730B, 0x730B, 0x2205, 0x730C, 0x730C, 0x2210, 0x730F, 0x730F, 0x1F8C,
+ 0x7310, 0x7310, 0x46EA, 0x7311, 0x7311, 0x1F87, 0x7312, 0x7312, 0x2204,
+ 0x7313, 0x7313, 0x0B1D, 0x7316, 0x7316, 0x0B1C, 0x7317, 0x7317, 0x1F85,
+ 0x7318, 0x7318, 0x1F88, 0x7319, 0x7319, 0x0B1E, 0x731B, 0x731B, 0x0B1B,
+ 0x731C, 0x731C, 0x0B1A, 0x731D, 0x731D, 0x1F84, 0x731E, 0x731E, 0x1F8D,
+ 0x7322, 0x7322, 0x2207, 0x7323, 0x7323, 0x220E, 0x7325, 0x7325, 0x0CD4,
+ 0x7326, 0x7326, 0x220D, 0x7327, 0x7327, 0x220A, 0x7328, 0x7328, 0x428A,
+ 0x7329, 0x7329, 0x0CD6, 0x732A, 0x732A, 0x3D70, 0x732B, 0x732B, 0x4285,
+ 0x732C, 0x732C, 0x3FB2, 0x732D, 0x732D, 0x220C, 0x732E, 0x732E, 0x428B,
+ 0x7330, 0x7330, 0x2206, 0x7331, 0x7331, 0x2208, 0x7332, 0x7332, 0x220B,
+ 0x7333, 0x7333, 0x2209, 0x7334, 0x7334, 0x0CD5, 0x7335, 0x7335, 0x220F,
+ 0x7336, 0x7336, 0x0CD3, 0x7337, 0x7337, 0x0E77, 0x7338, 0x7338, 0x46EB,
+ 0x7339, 0x7339, 0x43CC, 0x733A, 0x733A, 0x2496, 0x733B, 0x733B, 0x2495,
+ 0x733C, 0x733C, 0x2493, 0x733E, 0x733E, 0x0E7A, 0x733F, 0x733F, 0x0E79,
+ 0x7340, 0x7340, 0x2497, 0x7341, 0x7341, 0x46EC, 0x7342, 0x7342, 0x2494,
+ 0x7343, 0x7343, 0x2727, 0x7344, 0x7344, 0x102A, 0x7345, 0x7345, 0x0E78,
+ 0x7348, 0x7348, 0x43FA, 0x7349, 0x7349, 0x2499, 0x734A, 0x734A, 0x2498,
+ 0x734C, 0x734C, 0x272A, 0x734D, 0x734D, 0x2728, 0x734E, 0x734E, 0x11A4,
+ 0x734F, 0x734F, 0x3F51, 0x7350, 0x7350, 0x102B, 0x7351, 0x7351, 0x2729,
+ 0x7352, 0x7352, 0x2969, 0x7357, 0x7357, 0x11A5, 0x7358, 0x7358, 0x2968,
+ 0x7359, 0x7359, 0x2971, 0x735A, 0x735A, 0x2970, 0x735B, 0x735B, 0x296E,
+ 0x735D, 0x735D, 0x296D, 0x735E, 0x7360, 0x296A, 0x7361, 0x7361, 0x296F,
+ 0x7362, 0x7362, 0x2972, 0x7365, 0x7365, 0x2BC8, 0x7366, 0x7367, 0x2BC5,
+ 0x7368, 0x7368, 0x12F9, 0x7369, 0x7369, 0x2BC4, 0x736A, 0x736A, 0x2BCA,
+ 0x736B, 0x736B, 0x2BC9, 0x736C, 0x736C, 0x2BC7, 0x736E, 0x736F, 0x2DA3,
+ 0x7370, 0x7370, 0x140E, 0x7371, 0x7371, 0x3F98, 0x7372, 0x7372, 0x140F,
+ 0x7373, 0x7373, 0x2DA2, 0x7374, 0x7374, 0x3ED4, 0x7375, 0x7375, 0x14F3,
+ 0x7376, 0x7376, 0x2F55, 0x7377, 0x7377, 0x14F2, 0x7378, 0x7378, 0x1595,
+ 0x737A, 0x737A, 0x1596, 0x737B, 0x737B, 0x1620, 0x737C, 0x737C, 0x31F8,
+ 0x737D, 0x737D, 0x31F7, 0x737E, 0x737E, 0x32E2, 0x737F, 0x737F, 0x3390,
+ 0x7380, 0x7380, 0x16CA, 0x7381, 0x7381, 0x3426, 0x7382, 0x7382, 0x3425,
+ 0x7383, 0x7383, 0x3427, 0x7384, 0x7384, 0x0356, 0x7385, 0x7385, 0x1B7D,
+ 0x7386, 0x7386, 0x092A, 0x7387, 0x7387, 0x0B1F, 0x7388, 0x7388, 0x1F8E,
+ 0x7389, 0x7389, 0x0357, 0x738A, 0x738A, 0x17B1, 0x738B, 0x738B, 0x02EE,
+ 0x738E, 0x738E, 0x180E, 0x738F, 0x738F, 0x46E5, 0x7392, 0x7392, 0x18D1,
+ 0x7393, 0x7394, 0x18CF, 0x7395, 0x7395, 0x18CD, 0x7396, 0x7396, 0x04EF,
+ 0x7397, 0x7397, 0x18CE, 0x7398, 0x7398, 0x39F6, 0x739C, 0x739C, 0x408A,
+ 0x739D, 0x739D, 0x1A0C, 0x739E, 0x739E, 0x395B, 0x739F, 0x739F, 0x0652,
+ 0x73A0, 0x73A0, 0x1A0A, 0x73A1, 0x73A1, 0x1A06, 0x73A2, 0x73A2, 0x1A09,
+ 0x73A4, 0x73A4, 0x1A05, 0x73A5, 0x73A5, 0x0654, 0x73A6, 0x73A6, 0x1A08,
+ 0x73A7, 0x73A7, 0x4087, 0x73A8, 0x73A8, 0x0651, 0x73A9, 0x73A9, 0x0650,
+ 0x73AA, 0x73AA, 0x428D, 0x73AB, 0x73AB, 0x0653, 0x73AC, 0x73AC, 0x1A0B,
+ 0x73AD, 0x73AD, 0x1A07, 0x73B2, 0x73B2, 0x079B, 0x73B3, 0x73B3, 0x079E,
+ 0x73B4, 0x73B4, 0x1B85, 0x73B5, 0x73B5, 0x1B84, 0x73B6, 0x73B6, 0x1B83,
+ 0x73B7, 0x73B7, 0x0798, 0x73B8, 0x73B8, 0x1B8C, 0x73B9, 0x73B9, 0x1B82,
+ 0x73BB, 0x73BB, 0x079A, 0x73BC, 0x73BC, 0x1D3D, 0x73BE, 0x73BE, 0x1B89,
+ 0x73BF, 0x73BF, 0x1B87, 0x73C0, 0x73C0, 0x079D, 0x73C2, 0x73C2, 0x1B7F,
+ 0x73C3, 0x73C3, 0x1B8A, 0x73C5, 0x73C5, 0x1B81, 0x73C6, 0x73C6, 0x1B8B,
+ 0x73C7, 0x73C7, 0x1B88, 0x73C8, 0x73C8, 0x1B80, 0x73C9, 0x73C9, 0x4290,
+ 0x73CA, 0x73CA, 0x0799, 0x73CB, 0x73CB, 0x1B8D, 0x73CC, 0x73CC, 0x1B7E,
+ 0x73CD, 0x73CD, 0x079C, 0x73CE, 0x73CE, 0x411B, 0x73CF, 0x73CF, 0x428C,
+ 0x73D0, 0x73D0, 0x3B17, 0x73D2, 0x73D2, 0x1D42, 0x73D3, 0x73D3, 0x1D39,
+ 0x73D4, 0x73D4, 0x1D44, 0x73D5, 0x73D5, 0x4073, 0x73D6, 0x73D6, 0x1D3C,
+ 0x73D7, 0x73D8, 0x1D47, 0x73D9, 0x73D9, 0x1D3A, 0x73DA, 0x73DA, 0x1D46,
+ 0x73DB, 0x73DB, 0x1D43, 0x73DC, 0x73DC, 0x1D41, 0x73DD, 0x73DD, 0x1D45,
+ 0x73DE, 0x73DE, 0x0930, 0x73E0, 0x73E0, 0x092E, 0x73E1, 0x73E1, 0x46F0,
+ 0x73E2, 0x73E2, 0x3CA3, 0x73E3, 0x73E3, 0x1D3F, 0x73E4, 0x73E4, 0x42A5,
+ 0x73E5, 0x73E5, 0x1D3B, 0x73E6, 0x73E6, 0x3CBA, 0x73E7, 0x73E7, 0x1D3E,
+ 0x73E8, 0x73E8, 0x1D49, 0x73E9, 0x73E9, 0x1D40, 0x73EA, 0x73EA, 0x092F,
+ 0x73EB, 0x73EB, 0x1B86, 0x73ED, 0x73ED, 0x092B, 0x73EE, 0x73EE, 0x092D,
+ 0x73EF, 0x73EF, 0x4011, 0x73F3, 0x73F3, 0x3CAB, 0x73F4, 0x73F4, 0x1F9C,
+ 0x73F5, 0x73F5, 0x1F91, 0x73F6, 0x73F6, 0x1F8F, 0x73F7, 0x73F7, 0x429A,
+ 0x73F8, 0x73F8, 0x1F90, 0x73F9, 0x73F9, 0x3BF9, 0x73FA, 0x73FA, 0x1F97,
+ 0x73FB, 0x73FB, 0x3CAC, 0x73FC, 0x73FC, 0x1F98, 0x73FD, 0x73FD, 0x1F94,
+ 0x73FE, 0x73FE, 0x0B24, 0x73FF, 0x73FF, 0x1F99, 0x7400, 0x7400, 0x1F96,
+ 0x7401, 0x7401, 0x1F93, 0x7403, 0x7403, 0x0B22, 0x7404, 0x7404, 0x1F92,
+ 0x7405, 0x7405, 0x0B20, 0x7406, 0x7406, 0x0B23, 0x7407, 0x7407, 0x1F95,
+ 0x7408, 0x7408, 0x1F9D, 0x7409, 0x7409, 0x092C, 0x740A, 0x740A, 0x0B21,
+ 0x740B, 0x740B, 0x1F9B, 0x740C, 0x740C, 0x1F9A, 0x740D, 0x740D, 0x0B25,
+ 0x7411, 0x7411, 0x456C, 0x7412, 0x7412, 0x3BE6, 0x7414, 0x7414, 0x39F4,
+ 0x7415, 0x7415, 0x429B, 0x7416, 0x7416, 0x2215, 0x7417, 0x7417, 0x40AD,
+ 0x7419, 0x7419, 0x46F3, 0x741A, 0x741A, 0x2216, 0x741B, 0x741B, 0x0CE0,
+ 0x741C, 0x741C, 0x38DD, 0x741D, 0x741D, 0x221C, 0x741E, 0x741F, 0x46F4,
+ 0x7420, 0x7420, 0x221E, 0x7421, 0x7421, 0x2217, 0x7422, 0x7422, 0x0CDA,
+ 0x7423, 0x7423, 0x221B, 0x7424, 0x7424, 0x221A, 0x7425, 0x7425, 0x0CDB,
+ 0x7426, 0x7426, 0x0CE1, 0x7428, 0x7428, 0x0CE2, 0x7429, 0x7429, 0x221D,
+ 0x742A, 0x742A, 0x0CD8, 0x742B, 0x742B, 0x2214, 0x742C, 0x742C, 0x2212,
+ 0x742D, 0x742D, 0x2218, 0x742E, 0x742E, 0x2211, 0x742F, 0x742F, 0x0CDF,
+ 0x7430, 0x7430, 0x2213, 0x7431, 0x7431, 0x2219, 0x7432, 0x7432, 0x221F,
+ 0x7433, 0x7433, 0x0CD9, 0x7434, 0x7434, 0x0CDE, 0x7435, 0x7436, 0x0CDC,
+ 0x7437, 0x7437, 0x3AE1, 0x7438, 0x7438, 0x3B09, 0x7439, 0x7439, 0x429E,
+ 0x743A, 0x743A, 0x0CD7, 0x743C, 0x743C, 0x3ADF, 0x743F, 0x743F, 0x0E81,
+ 0x7440, 0x7440, 0x24A0, 0x7441, 0x7441, 0x0E80, 0x7442, 0x7442, 0x24A4,
+ 0x7443, 0x7443, 0x3A1A, 0x7444, 0x7444, 0x249A, 0x7445, 0x7445, 0x3BD7,
+ 0x7446, 0x7446, 0x24A5, 0x7447, 0x7447, 0x42A4, 0x7448, 0x7448, 0x3CB5,
+ 0x7449, 0x7449, 0x4291, 0x744A, 0x744B, 0x249B, 0x744D, 0x744D, 0x24A6,
+ 0x744E, 0x744E, 0x24A3, 0x744F, 0x7450, 0x24A1, 0x7451, 0x7451, 0x249E,
+ 0x7452, 0x7452, 0x249D, 0x7453, 0x7453, 0x4231, 0x7454, 0x7454, 0x24A7,
+ 0x7455, 0x7455, 0x0E7D, 0x7456, 0x7456, 0x39F5, 0x7457, 0x7457, 0x249F,
+ 0x7459, 0x7459, 0x0E82, 0x745A, 0x745A, 0x0E7C, 0x745B, 0x745C, 0x0E83,
+ 0x745D, 0x745D, 0x42C6, 0x745E, 0x745E, 0x0E7F, 0x745F, 0x745F, 0x0E7E,
+ 0x7460, 0x7460, 0x42A2, 0x7462, 0x7462, 0x272B, 0x7463, 0x7463, 0x102D,
+ 0x7464, 0x7464, 0x102C, 0x7465, 0x7465, 0x4101, 0x7467, 0x7467, 0x2730,
+ 0x7468, 0x7468, 0x3AEE, 0x7469, 0x7469, 0x11A6, 0x746A, 0x746A, 0x102E,
+ 0x746B, 0x746B, 0x3BE7, 0x746C, 0x746C, 0x42A8, 0x746D, 0x746D, 0x1030,
+ 0x746E, 0x746E, 0x2731, 0x746F, 0x746F, 0x0E7B, 0x7470, 0x7470, 0x102F,
+ 0x7471, 0x7471, 0x272D, 0x7472, 0x7472, 0x272F, 0x7473, 0x7473, 0x272C,
+ 0x7474, 0x7474, 0x42A9, 0x7475, 0x7475, 0x272E, 0x7476, 0x7476, 0x42A6,
+ 0x7479, 0x7479, 0x297C, 0x747A, 0x747A, 0x3AD1, 0x747C, 0x747C, 0x297B,
+ 0x747D, 0x747D, 0x2978, 0x747E, 0x747E, 0x11A9, 0x747F, 0x747F, 0x2BCB,
+ 0x7480, 0x7480, 0x11AA, 0x7481, 0x7481, 0x2977, 0x7482, 0x7482, 0x42AC,
+ 0x7483, 0x7483, 0x11A8, 0x7485, 0x7485, 0x2979, 0x7486, 0x7486, 0x2976,
+ 0x7487, 0x7487, 0x2973, 0x7488, 0x7488, 0x297A, 0x7489, 0x748A, 0x2974,
+ 0x748B, 0x748B, 0x11A7, 0x748C, 0x748C, 0x3A21, 0x748D, 0x748D, 0x469D,
+ 0x7490, 0x7490, 0x2DA8, 0x7492, 0x7492, 0x2BCF, 0x7494, 0x7494, 0x2BCE,
+ 0x7495, 0x7495, 0x2BD0, 0x7497, 0x7497, 0x2DA5, 0x7498, 0x7498, 0x12FC,
+ 0x7499, 0x7499, 0x39F3, 0x749A, 0x749A, 0x2BCC, 0x749B, 0x749B, 0x3B0A,
+ 0x749C, 0x749C, 0x12FA, 0x749E, 0x749E, 0x12FE, 0x749F, 0x749F, 0x12FD,
+ 0x74A0, 0x74A0, 0x2BCD, 0x74A1, 0x74A1, 0x2BD1, 0x74A3, 0x74A3, 0x12FB,
+ 0x74A4, 0x74A4, 0x4170, 0x74A5, 0x74A5, 0x2DAC, 0x74A6, 0x74A6, 0x1412,
+ 0x74A7, 0x74A7, 0x14F4, 0x74A8, 0x74A8, 0x1413, 0x74A9, 0x74A9, 0x1410,
+ 0x74AA, 0x74AA, 0x2DA9, 0x74AB, 0x74AB, 0x2DA7, 0x74AD, 0x74AD, 0x2DAA,
+ 0x74AF, 0x74AF, 0x2DAD, 0x74B0, 0x74B0, 0x1411, 0x74B1, 0x74B1, 0x2DAB,
+ 0x74B2, 0x74B2, 0x2DA6, 0x74B4, 0x74B4, 0x3CA5, 0x74B5, 0x74B5, 0x2F58,
+ 0x74B6, 0x74B6, 0x2F5B, 0x74B7, 0x74B7, 0x30C2, 0x74B8, 0x74B8, 0x2F56,
+ 0x74BA, 0x74BA, 0x31F9, 0x74BB, 0x74BB, 0x2F5C, 0x74BD, 0x74BD, 0x1597,
+ 0x74BE, 0x74BE, 0x2F5A, 0x74BF, 0x74BF, 0x14F5, 0x74C0, 0x74C0, 0x2F57,
+ 0x74C1, 0x74C1, 0x2F59, 0x74C2, 0x74C2, 0x2F5D, 0x74C3, 0x74C3, 0x30C3,
+ 0x74C5, 0x74C5, 0x30C1, 0x74C8, 0x74C8, 0x42B5, 0x74CA, 0x74CA, 0x1598,
+ 0x74CB, 0x74CB, 0x30C0, 0x74CC, 0x74CC, 0x3ADE, 0x74CF, 0x74CF, 0x1621,
+ 0x74D0, 0x74D0, 0x3A9B, 0x74D3, 0x74D3, 0x46FA, 0x74D4, 0x74D4, 0x167E,
+ 0x74D5, 0x74D5, 0x3392, 0x74D6, 0x74D6, 0x167D, 0x74D7, 0x74D7, 0x3394,
+ 0x74D8, 0x74D8, 0x3391, 0x74D9, 0x74D9, 0x3393, 0x74DA, 0x74DA, 0x16FE,
+ 0x74DB, 0x74DB, 0x348D, 0x74DC, 0x74DC, 0x0358, 0x74DD, 0x74DD, 0x1A0D,
+ 0x74DE, 0x74DF, 0x1D4A, 0x74E0, 0x74E0, 0x0B26, 0x74E1, 0x74E1, 0x24A8,
+ 0x74E2, 0x74E2, 0x12FF, 0x74E3, 0x74E3, 0x1599, 0x74E4, 0x74E4, 0x16CB,
+ 0x74E5, 0x74E5, 0x348E, 0x74E6, 0x74E6, 0x0359, 0x74E7, 0x74E7, 0x3FFE,
+ 0x74E8, 0x74E8, 0x1A0E, 0x74E9, 0x74E9, 0x0120, 0x74EC, 0x74EC, 0x1B8E,
+ 0x74EE, 0x74EE, 0x1B8F, 0x74F0, 0x74F0, 0x3FE6, 0x74F1, 0x74F1, 0x3F9B,
+ 0x74F2, 0x74F2, 0x3FDF, 0x74F4, 0x74F5, 0x1D4C, 0x74F6, 0x74F7, 0x0B27,
+ 0x74F8, 0x74F8, 0x3FF4, 0x74FB, 0x74FB, 0x2220, 0x74FD, 0x74FD, 0x24AB,
+ 0x74FE, 0x74FE, 0x24AA, 0x74FF, 0x74FF, 0x24A9, 0x7500, 0x7500, 0x2732,
+ 0x7502, 0x7503, 0x2733, 0x7504, 0x7504, 0x1031, 0x7505, 0x7505, 0x3FDE,
+ 0x7507, 0x7507, 0x297E, 0x7508, 0x7508, 0x297D, 0x750B, 0x750B, 0x2BD2,
+ 0x750C, 0x750D, 0x1300, 0x750E, 0x750E, 0x42B7, 0x750F, 0x750F, 0x2DB1,
+ 0x7510, 0x7512, 0x2DAE, 0x7513, 0x7513, 0x2F5F, 0x7514, 0x7514, 0x2F5E,
+ 0x7515, 0x7515, 0x14F6, 0x7516, 0x7516, 0x30C4, 0x7517, 0x7517, 0x32E3,
+ 0x7518, 0x7518, 0x035A, 0x7519, 0x7519, 0x4583, 0x751A, 0x751A, 0x079F,
+ 0x751C, 0x751C, 0x0B29, 0x751D, 0x751D, 0x24AC, 0x751E, 0x751E, 0x42B8,
+ 0x751F, 0x751F, 0x035B, 0x7521, 0x7521, 0x1D4E, 0x7522, 0x7522, 0x0B2A,
+ 0x7525, 0x7526, 0x0CE3, 0x7528, 0x7529, 0x035C, 0x752A, 0x752A, 0x180F,
+ 0x752B, 0x752B, 0x04F1, 0x752C, 0x752C, 0x04F0, 0x752D, 0x752D, 0x07A0,
+ 0x752E, 0x752E, 0x1B90, 0x752F, 0x752F, 0x2221, 0x7530, 0x7533, 0x035E,
+ 0x7534, 0x7534, 0x3E87, 0x7535, 0x7535, 0x455A, 0x7537, 0x7538, 0x04F2,
+ 0x7539, 0x7539, 0x18D3, 0x753A, 0x753A, 0x18D2, 0x753B, 0x753B, 0x3DFB,
+ 0x753D, 0x753D, 0x0655, 0x753E, 0x753E, 0x1A11, 0x753F, 0x7540, 0x1A0F,
+ 0x7542, 0x7542, 0x43CD, 0x7546, 0x7546, 0x3F40, 0x7547, 0x7548, 0x1B91,
+ 0x754A, 0x754A, 0x42BF, 0x754B, 0x754B, 0x07A4, 0x754C, 0x754C, 0x07A2,
+ 0x754D, 0x754D, 0x42BE, 0x754E, 0x754E, 0x07A3, 0x754F, 0x754F, 0x07A1,
+ 0x7551, 0x7551, 0x3CFE, 0x7553, 0x7553, 0x3FEB, 0x7554, 0x7554, 0x0931,
+ 0x7555, 0x7555, 0x3AEA, 0x7559, 0x7559, 0x0935, 0x755A, 0x755A, 0x0934,
+ 0x755B, 0x755B, 0x1D4F, 0x755C, 0x755C, 0x0933, 0x755D, 0x755D, 0x0932,
+ 0x755F, 0x755F, 0x1D50, 0x7560, 0x7560, 0x3D71, 0x7562, 0x7562, 0x0B2D,
+ 0x7563, 0x7563, 0x1F9F, 0x7564, 0x7564, 0x1F9E, 0x7565, 0x7566, 0x0B2B,
+ 0x7567, 0x7567, 0x42C0, 0x756A, 0x756A, 0x0CE6, 0x756B, 0x756B, 0x0CE5,
+ 0x756C, 0x756C, 0x2223, 0x756D, 0x756D, 0x46FD, 0x756E, 0x756E, 0x42C1,
+ 0x756F, 0x756F, 0x2222, 0x7570, 0x7570, 0x0B2E, 0x7572, 0x7572, 0x46FE,
+ 0x7576, 0x7576, 0x0E85, 0x7577, 0x7577, 0x24AE, 0x7578, 0x7578, 0x0E86,
+ 0x7579, 0x7579, 0x24AD, 0x757A, 0x757A, 0x3F4F, 0x757D, 0x757D, 0x2735,
+ 0x757E, 0x757E, 0x297F, 0x757F, 0x757F, 0x11AB, 0x7580, 0x7580, 0x2BD3,
+ 0x7583, 0x7583, 0x3AE5, 0x7584, 0x7584, 0x2DB2, 0x7586, 0x7586, 0x159B,
+ 0x7587, 0x7587, 0x159A, 0x758A, 0x758A, 0x16CC, 0x758B, 0x758B, 0x0362,
+ 0x758C, 0x758C, 0x1A12, 0x758D, 0x758D, 0x46FF, 0x758E, 0x758E, 0x42C5,
+ 0x758F, 0x758F, 0x0B2F, 0x7590, 0x7590, 0x2736, 0x7591, 0x7591, 0x1032,
+ 0x7592, 0x7592, 0x022E, 0x7594, 0x7595, 0x18D4, 0x7598, 0x7598, 0x1A13,
+ 0x7599, 0x759A, 0x0657, 0x759D, 0x759D, 0x0656, 0x759E, 0x759E, 0x42C7,
+ 0x75A2, 0x75A3, 0x07A8, 0x75A4, 0x75A5, 0x07A6, 0x75A7, 0x75A7, 0x1B93,
+ 0x75AA, 0x75AA, 0x1B94, 0x75AB, 0x75AB, 0x07A5, 0x75B0, 0x75B0, 0x1D51,
+ 0x75B1, 0x75B1, 0x3EAD, 0x75B2, 0x75B3, 0x0939, 0x75B4, 0x75B4, 0x42C8,
+ 0x75B5, 0x75B5, 0x0B32, 0x75B6, 0x75B6, 0x1D57, 0x75B8, 0x75B8, 0x093F,
+ 0x75B9, 0x75B9, 0x093D, 0x75BA, 0x75BA, 0x1D58, 0x75BB, 0x75BB, 0x1D53,
+ 0x75BC, 0x75BC, 0x093C, 0x75BD, 0x75BD, 0x093B, 0x75BE, 0x75BE, 0x0936,
+ 0x75BF, 0x75BF, 0x1D56, 0x75C0, 0x75C0, 0x1D55, 0x75C1, 0x75C1, 0x1D52,
+ 0x75C2, 0x75C2, 0x093E, 0x75C3, 0x75C3, 0x3F93, 0x75C4, 0x75C4, 0x1D54,
+ 0x75C5, 0x75C5, 0x0937, 0x75C7, 0x75C7, 0x0938, 0x75C8, 0x75C8, 0x4701,
+ 0x75CA, 0x75CA, 0x0B33, 0x75CB, 0x75CC, 0x1FA3, 0x75CD, 0x75CD, 0x0B34,
+ 0x75CE, 0x75CE, 0x1FA0, 0x75CF, 0x75CF, 0x1FA2, 0x75D0, 0x75D0, 0x1FA6,
+ 0x75D1, 0x75D1, 0x1FA5, 0x75D2, 0x75D2, 0x1FA1, 0x75D4, 0x75D5, 0x0B30,
+ 0x75D7, 0x75D7, 0x222B, 0x75D8, 0x75D8, 0x0CEB, 0x75D9, 0x75D9, 0x0CEA,
+ 0x75DA, 0x75DA, 0x2225, 0x75DB, 0x75DB, 0x0CE8, 0x75DC, 0x75DC, 0x43CE,
+ 0x75DD, 0x75DD, 0x2228, 0x75DE, 0x75DE, 0x0CEC, 0x75DF, 0x75DF, 0x2229,
+ 0x75E0, 0x75E0, 0x0CED, 0x75E1, 0x75E1, 0x2226, 0x75E2, 0x75E2, 0x0CE7,
+ 0x75E3, 0x75E3, 0x0CE9, 0x75E4, 0x75E4, 0x222A, 0x75E6, 0x75E6, 0x2227,
+ 0x75E7, 0x75E7, 0x2224, 0x75ED, 0x75ED, 0x24BB, 0x75EF, 0x75EF, 0x24B0,
+ 0x75F0, 0x75F0, 0x0E88, 0x75F1, 0x75F1, 0x0E8B, 0x75F2, 0x75F2, 0x0E8A,
+ 0x75F3, 0x75F3, 0x0E8F, 0x75F4, 0x75F4, 0x0E8E, 0x75F5, 0x75F5, 0x24BC,
+ 0x75F6, 0x75F6, 0x24BA, 0x75F7, 0x75F7, 0x24B3, 0x75F8, 0x75F8, 0x24B7,
+ 0x75F9, 0x75F9, 0x24B6, 0x75FA, 0x75FA, 0x0E8C, 0x75FB, 0x75FB, 0x24B9,
+ 0x75FC, 0x75FC, 0x24B5, 0x75FD, 0x75FD, 0x24BD, 0x75FE, 0x75FE, 0x24B4,
+ 0x75FF, 0x75FF, 0x0E8D, 0x7600, 0x7600, 0x0E87, 0x7601, 0x7601, 0x0E89,
+ 0x7602, 0x7602, 0x42C9, 0x7603, 0x7603, 0x24B2, 0x7607, 0x7607, 0x3F8F,
+ 0x7608, 0x7608, 0x2738, 0x7609, 0x7609, 0x1036, 0x760A, 0x760A, 0x273C,
+ 0x760B, 0x760B, 0x1035, 0x760C, 0x760C, 0x2739, 0x760D, 0x760D, 0x1034,
+ 0x760F, 0x760F, 0x24B1, 0x7610, 0x7610, 0x24B8, 0x7611, 0x7611, 0x273B,
+ 0x7613, 0x7613, 0x1037, 0x7614, 0x7614, 0x273D, 0x7615, 0x7615, 0x273A,
+ 0x7616, 0x7616, 0x2737, 0x7619, 0x7619, 0x2982, 0x761A, 0x761A, 0x2986,
+ 0x761B, 0x761B, 0x2988, 0x761C, 0x761C, 0x2984, 0x761D, 0x761D, 0x2983,
+ 0x761E, 0x761E, 0x2981, 0x761F, 0x761F, 0x11AE, 0x7620, 0x7620, 0x11AC,
+ 0x7621, 0x7622, 0x11B1, 0x7623, 0x7623, 0x2985, 0x7624, 0x7624, 0x11AF,
+ 0x7625, 0x7625, 0x2980, 0x7626, 0x7626, 0x11B0, 0x7627, 0x7627, 0x1033,
+ 0x7628, 0x7628, 0x2987, 0x7629, 0x7629, 0x11AD, 0x762C, 0x762C, 0x42CA,
+ 0x762D, 0x762D, 0x2BD5, 0x762F, 0x762F, 0x2BD4, 0x7630, 0x7630, 0x2BDC,
+ 0x7631, 0x7631, 0x2BD6, 0x7632, 0x7632, 0x2BDB, 0x7633, 0x7633, 0x2BD8,
+ 0x7634, 0x7634, 0x1302, 0x7635, 0x7635, 0x2BDA, 0x7638, 0x7638, 0x1303,
+ 0x763A, 0x763A, 0x1304, 0x763B, 0x763B, 0x3E70, 0x763C, 0x763C, 0x2BD9,
+ 0x763D, 0x763D, 0x2BD7, 0x7640, 0x7640, 0x3EE6, 0x7642, 0x7642, 0x1415,
+ 0x7643, 0x7643, 0x2DB3, 0x7646, 0x7646, 0x1414, 0x7647, 0x7647, 0x2DB6,
+ 0x7648, 0x7649, 0x2DB4, 0x764C, 0x764C, 0x1416, 0x764D, 0x764D, 0x4702,
+ 0x764E, 0x764E, 0x3E72, 0x764F, 0x764F, 0x42CC, 0x7650, 0x7650, 0x2F63,
+ 0x7651, 0x7651, 0x42CB, 0x7652, 0x7652, 0x14F9, 0x7653, 0x7653, 0x2F64,
+ 0x7654, 0x7654, 0x3EF0, 0x7656, 0x7656, 0x14F7, 0x7657, 0x7657, 0x2F65,
+ 0x7658, 0x7658, 0x14F8, 0x7659, 0x7659, 0x2F62, 0x765A, 0x765A, 0x2F66,
+ 0x765C, 0x765C, 0x2F60, 0x765F, 0x765F, 0x159C, 0x7660, 0x7660, 0x30C5,
+ 0x7661, 0x7661, 0x159D, 0x7662, 0x7662, 0x1622, 0x7664, 0x7664, 0x2F61,
+ 0x7665, 0x7665, 0x1623, 0x7666, 0x7666, 0x3EAA, 0x7667, 0x7667, 0x3FA9,
+ 0x7669, 0x7669, 0x167F, 0x766A, 0x766A, 0x32E4, 0x766C, 0x766C, 0x16CE,
+ 0x766D, 0x766D, 0x3395, 0x766E, 0x766E, 0x16CD, 0x766F, 0x766F, 0x42CD,
+ 0x7670, 0x7670, 0x3428, 0x7671, 0x7672, 0x1723, 0x7673, 0x7673, 0x3AEB,
+ 0x7674, 0x7674, 0x4703, 0x7675, 0x7675, 0x3543, 0x7676, 0x7676, 0x022F,
+ 0x7678, 0x7678, 0x07AA, 0x7679, 0x7679, 0x1B95, 0x767A, 0x767A, 0x4705,
+ 0x767B, 0x767C, 0x0CEE, 0x767D, 0x767D, 0x0363, 0x767E, 0x767E, 0x03F5,
+ 0x767F, 0x767F, 0x1810, 0x7680, 0x7680, 0x43D3, 0x7681, 0x7681, 0x18D6,
+ 0x7682, 0x7682, 0x04F4, 0x7684, 0x7684, 0x0659, 0x7686, 0x7688, 0x07AB,
+ 0x7689, 0x7689, 0x1FA8, 0x768A, 0x768A, 0x1D59, 0x768B, 0x768B, 0x0940,
+ 0x768C, 0x768C, 0x43D4, 0x768E, 0x768E, 0x0B35, 0x768F, 0x768F, 0x1FA7,
+ 0x7690, 0x7690, 0x42D0, 0x7692, 0x7692, 0x222D, 0x7693, 0x7693, 0x0CF1,
+ 0x7695, 0x7695, 0x222C, 0x7696, 0x7696, 0x0CF0, 0x7699, 0x7699, 0x24BE,
+ 0x769A, 0x769A, 0x11B3, 0x769B, 0x769B, 0x298C, 0x769C, 0x769E, 0x2989,
+ 0x76A1, 0x76A1, 0x42D5, 0x76A4, 0x76A4, 0x2DB7, 0x76A5, 0x76A5, 0x42D6,
+ 0x76A6, 0x76A6, 0x2F67, 0x76AA, 0x76AA, 0x31FB, 0x76AB, 0x76AB, 0x31FA,
+ 0x76AD, 0x76AD, 0x3396, 0x76AE, 0x76AE, 0x0364, 0x76AF, 0x76AF, 0x1A14,
+ 0x76B0, 0x76B0, 0x0941, 0x76B4, 0x76B4, 0x0CF2, 0x76B5, 0x76B5, 0x24BF,
+ 0x76B7, 0x76B7, 0x42D7, 0x76B8, 0x76B8, 0x273E, 0x76BA, 0x76BA, 0x11B4,
+ 0x76BB, 0x76BB, 0x2BDD, 0x76BD, 0x76BD, 0x2F68, 0x76BE, 0x76BE, 0x31FC,
+ 0x76BF, 0x76BF, 0x0365, 0x76C2, 0x76C2, 0x065A, 0x76C3, 0x76C3, 0x07B0,
+ 0x76C4, 0x76C4, 0x1B96, 0x76C5, 0x76C5, 0x07B1, 0x76C6, 0x76C6, 0x07AF,
+ 0x76C8, 0x76C8, 0x07AE, 0x76C9, 0x76C9, 0x1D5A, 0x76CA, 0x76CA, 0x0942,
+ 0x76CC, 0x76CC, 0x42D8, 0x76CD, 0x76CE, 0x0943, 0x76D2, 0x76D2, 0x0B37,
+ 0x76D3, 0x76D3, 0x1FA9, 0x76D4, 0x76D4, 0x0B36, 0x76D6, 0x76D6, 0x3F55,
+ 0x76DA, 0x76DA, 0x222E, 0x76DB, 0x76DB, 0x0B38, 0x76DC, 0x76DC, 0x0CF3,
+ 0x76DD, 0x76DD, 0x24C0, 0x76DE, 0x76DF, 0x0E90, 0x76E1, 0x76E1, 0x1038,
+ 0x76E3, 0x76E3, 0x1039, 0x76E4, 0x76E4, 0x11B5, 0x76E5, 0x76E5, 0x1306,
+ 0x76E6, 0x76E6, 0x2BDE, 0x76E7, 0x76E7, 0x1305, 0x76E9, 0x76E9, 0x2DB8,
+ 0x76EA, 0x76EA, 0x1417, 0x76EC, 0x76EC, 0x2F69, 0x76ED, 0x76ED, 0x31FD,
+ 0x76EE, 0x76EE, 0x0366, 0x76EF, 0x76EF, 0x04F5, 0x76F0, 0x76F0, 0x1A17,
+ 0x76F1, 0x76F1, 0x1A16, 0x76F2, 0x76F2, 0x065B, 0x76F3, 0x76F3, 0x1A15,
+ 0x76F4, 0x76F4, 0x065C, 0x76F5, 0x76F5, 0x1A18, 0x76F7, 0x76F7, 0x1B9C,
+ 0x76F8, 0x76F8, 0x07B4, 0x76F9, 0x76F9, 0x07B3, 0x76FA, 0x76FA, 0x1B9E,
+ 0x76FB, 0x76FB, 0x1B9D, 0x76FC, 0x76FC, 0x07B8, 0x76FE, 0x76FE, 0x07B7,
+ 0x7701, 0x7701, 0x07B2, 0x7703, 0x7705, 0x1B98, 0x7707, 0x7707, 0x07B9,
+ 0x7708, 0x7708, 0x1B97, 0x7709, 0x7709, 0x07B5, 0x770A, 0x770A, 0x1B9B,
+ 0x770B, 0x770B, 0x07B6, 0x770C, 0x770C, 0x3D62, 0x770E, 0x770F, 0x3B02,
+ 0x7710, 0x7710, 0x1D5D, 0x7711, 0x7711, 0x1D61, 0x7712, 0x7712, 0x1D5F,
+ 0x7713, 0x7713, 0x1D5E, 0x7715, 0x7715, 0x1D62, 0x7719, 0x771A, 0x1D63,
+ 0x771B, 0x771B, 0x1D5C, 0x771D, 0x771D, 0x1D5B, 0x771E, 0x771E, 0x42DE,
+ 0x771F, 0x7720, 0x0946, 0x7722, 0x7722, 0x1D65, 0x7723, 0x7723, 0x1D60,
+ 0x7724, 0x7724, 0x3FE8, 0x7725, 0x7725, 0x1FB2, 0x7726, 0x7726, 0x42DF,
+ 0x7727, 0x7727, 0x1D66, 0x7728, 0x7728, 0x0948, 0x7729, 0x7729, 0x0945,
+ 0x772B, 0x772B, 0x3FF3, 0x772D, 0x772D, 0x1FAC, 0x772F, 0x772F, 0x1FAB,
+ 0x7731, 0x7732, 0x1FAD, 0x7733, 0x7733, 0x1FB0, 0x7734, 0x7734, 0x1FAF,
+ 0x7735, 0x7735, 0x1FB4, 0x7736, 0x7736, 0x0B3C, 0x7737, 0x7737, 0x0B39,
+ 0x7738, 0x7738, 0x0B3D, 0x7739, 0x7739, 0x1FAA, 0x773A, 0x773A, 0x0B3E,
+ 0x773B, 0x773B, 0x1FB3, 0x773C, 0x773C, 0x0B3B, 0x773D, 0x773D, 0x1FB1,
+ 0x773E, 0x773E, 0x0B3A, 0x7740, 0x7740, 0x42E0, 0x7743, 0x7743, 0x470A,
+ 0x7744, 0x7744, 0x2231, 0x7745, 0x7745, 0x2233, 0x7746, 0x7747, 0x222F,
+ 0x774A, 0x774A, 0x2234, 0x774B, 0x774C, 0x2236, 0x774D, 0x774D, 0x2232,
+ 0x774E, 0x774E, 0x2235, 0x774F, 0x774F, 0x0CF4, 0x7752, 0x7752, 0x24C4,
+ 0x7754, 0x7754, 0x24C9, 0x7755, 0x7755, 0x24C1, 0x7756, 0x7756, 0x24C5,
+ 0x7758, 0x7758, 0x42E3, 0x7759, 0x7759, 0x24CA, 0x775A, 0x775A, 0x24C6,
+ 0x775B, 0x775B, 0x0E92, 0x775C, 0x775C, 0x0E9A, 0x775E, 0x775E, 0x0E95,
+ 0x775F, 0x7760, 0x24C2, 0x7761, 0x7761, 0x103D, 0x7762, 0x7762, 0x0E9D,
+ 0x7763, 0x7763, 0x0E96, 0x7765, 0x7765, 0x0E9B, 0x7766, 0x7766, 0x0E94,
+ 0x7767, 0x7767, 0x24C8, 0x7768, 0x7768, 0x0E9C, 0x7769, 0x7769, 0x24C7,
+ 0x776A, 0x776A, 0x0E98, 0x776B, 0x776B, 0x0E93, 0x776C, 0x776C, 0x0E99,
+ 0x776D, 0x776D, 0x24CB, 0x776E, 0x776E, 0x2743, 0x776F, 0x776F, 0x2745,
+ 0x7772, 0x7772, 0x396B, 0x7777, 0x7777, 0x46A9, 0x7778, 0x7778, 0x3B00,
+ 0x7779, 0x7779, 0x0E97, 0x777A, 0x777A, 0x4317, 0x777B, 0x777B, 0x3B04,
+ 0x777C, 0x777C, 0x2740, 0x777D, 0x777D, 0x103B, 0x777E, 0x777E, 0x2746,
+ 0x777F, 0x777F, 0x103C, 0x7780, 0x7780, 0x2744, 0x7781, 0x7781, 0x273F,
+ 0x7782, 0x7782, 0x2742, 0x7783, 0x7783, 0x2747, 0x7784, 0x7784, 0x103A,
+ 0x7785, 0x7785, 0x2741, 0x7787, 0x7787, 0x11B7, 0x7788, 0x7788, 0x2990,
+ 0x7789, 0x7789, 0x298F, 0x778B, 0x778B, 0x11BA, 0x778C, 0x778C, 0x11B8,
+ 0x778D, 0x778D, 0x298D, 0x778E, 0x778E, 0x11B6, 0x778F, 0x778F, 0x298E,
+ 0x7791, 0x7791, 0x11B9, 0x7793, 0x7793, 0x382D, 0x7795, 0x7795, 0x2BE6,
+ 0x7797, 0x7797, 0x2BE8, 0x7798, 0x7798, 0x470E, 0x7799, 0x7799, 0x2BE7,
+ 0x779A, 0x779A, 0x2BDF, 0x779B, 0x779B, 0x2BE3, 0x779C, 0x779C, 0x2BE2,
+ 0x779D, 0x779D, 0x2BE0, 0x779E, 0x779F, 0x1308, 0x77A0, 0x77A0, 0x1307,
+ 0x77A1, 0x77A1, 0x2BE1, 0x77A2, 0x77A3, 0x2BE4, 0x77A5, 0x77A5, 0x130A,
+ 0x77A7, 0x77A7, 0x141C, 0x77A8, 0x77A8, 0x2DC0, 0x77AA, 0x77AA, 0x1419,
+ 0x77AB, 0x77AB, 0x2DBA, 0x77AC, 0x77AC, 0x141B, 0x77AD, 0x77AD, 0x141D,
+ 0x77AF, 0x77AF, 0x42E5, 0x77B0, 0x77B0, 0x141A, 0x77B1, 0x77B1, 0x2DBF,
+ 0x77B2, 0x77B2, 0x2DBB, 0x77B3, 0x77B3, 0x1418, 0x77B4, 0x77B4, 0x2DBE,
+ 0x77B5, 0x77B5, 0x2DB9, 0x77B6, 0x77B6, 0x2DBD, 0x77B7, 0x77B7, 0x2DBC,
+ 0x77B9, 0x77B9, 0x3E73, 0x77BA, 0x77BA, 0x2F6B, 0x77BB, 0x77BC, 0x14FC,
+ 0x77BD, 0x77BD, 0x14FA, 0x77BE, 0x77BE, 0x4711, 0x77BF, 0x77BF, 0x14FB,
+ 0x77C2, 0x77C2, 0x2F6A, 0x77C3, 0x77C3, 0x3BB1, 0x77C4, 0x77C4, 0x30C8,
+ 0x77C5, 0x77C5, 0x41C1, 0x77C7, 0x77C7, 0x159E, 0x77C9, 0x77CA, 0x30C6,
+ 0x77CB, 0x77CB, 0x4712, 0x77CC, 0x77CC, 0x31FE, 0x77CD, 0x77CD, 0x3201,
+ 0x77CE, 0x77CF, 0x31FF, 0x77D0, 0x77D0, 0x32E5, 0x77D3, 0x77D3, 0x1680,
+ 0x77D4, 0x77D4, 0x3429, 0x77D5, 0x77D5, 0x348F, 0x77D7, 0x77D7, 0x1725,
+ 0x77D8, 0x77D9, 0x34D3, 0x77DA, 0x77DA, 0x1753, 0x77DB, 0x77DB, 0x0367,
+ 0x77DC, 0x77DC, 0x07BA, 0x77DE, 0x77DE, 0x2238, 0x77E0, 0x77E0, 0x24CC,
+ 0x77E2, 0x77E2, 0x0368, 0x77E3, 0x77E3, 0x04F6, 0x77E5, 0x77E5, 0x065D,
+ 0x77E6, 0x77E6, 0x4081, 0x77E7, 0x77E8, 0x1B9F, 0x77E9, 0x77E9, 0x0949,
+ 0x77EC, 0x77EC, 0x2239, 0x77ED, 0x77ED, 0x0CF5, 0x77EE, 0x77EE, 0x0E9E,
+ 0x77EF, 0x77EF, 0x141E, 0x77F0, 0x77F0, 0x2DC1, 0x77F1, 0x77F1, 0x30C9,
+ 0x77F2, 0x77F2, 0x3202, 0x77F3, 0x77F3, 0x0369, 0x77F4, 0x77F4, 0x42E9,
+ 0x77F7, 0x77F7, 0x1A1E, 0x77F8, 0x77F8, 0x1A19, 0x77F9, 0x77F9, 0x1A1B,
+ 0x77FA, 0x77FA, 0x1A1D, 0x77FB, 0x77FB, 0x1A1C, 0x77FC, 0x77FC, 0x1A1A,
+ 0x77FD, 0x77FD, 0x065E, 0x77FE, 0x77FE, 0x3FD5, 0x7802, 0x7802, 0x07BB,
+ 0x7803, 0x7803, 0x1BA9, 0x7805, 0x7805, 0x1BA4, 0x7806, 0x7806, 0x1BA1,
+ 0x7808, 0x7808, 0x3E46, 0x7809, 0x7809, 0x1BA8, 0x780C, 0x780D, 0x07BD,
+ 0x780E, 0x780E, 0x1BA7, 0x780F, 0x780F, 0x1BA6, 0x7810, 0x7810, 0x1BA5,
+ 0x7811, 0x7812, 0x1BA2, 0x7813, 0x7813, 0x1BAA, 0x7814, 0x7814, 0x07BC,
+ 0x7818, 0x7818, 0x4713, 0x781C, 0x781C, 0x4714, 0x781D, 0x781D, 0x094D,
+ 0x781E, 0x781E, 0x3B13, 0x781F, 0x781F, 0x0953, 0x7820, 0x7820, 0x0952,
+ 0x7821, 0x7821, 0x1D6F, 0x7822, 0x7822, 0x1D69, 0x7823, 0x7823, 0x1D67,
+ 0x7825, 0x7825, 0x0950, 0x7826, 0x7826, 0x1FBB, 0x7827, 0x7827, 0x094B,
+ 0x7828, 0x7828, 0x1D6C, 0x7829, 0x7829, 0x1D70, 0x782A, 0x782A, 0x1D72,
+ 0x782B, 0x782B, 0x1D6E, 0x782C, 0x782C, 0x1D68, 0x782D, 0x782D, 0x0951,
+ 0x782E, 0x782E, 0x1D6D, 0x782F, 0x782F, 0x1D6B, 0x7830, 0x7830, 0x094A,
+ 0x7831, 0x7831, 0x1D73, 0x7832, 0x7832, 0x0954, 0x7833, 0x7833, 0x1D71,
+ 0x7834, 0x7834, 0x094E, 0x7835, 0x7835, 0x1D6A, 0x7837, 0x7837, 0x094F,
+ 0x7838, 0x7838, 0x094C, 0x7839, 0x7839, 0x43D6, 0x783C, 0x783C, 0x401A,
+ 0x783D, 0x783D, 0x3C6A, 0x7842, 0x7842, 0x3AC4, 0x7843, 0x7843, 0x0B40,
+ 0x7844, 0x7844, 0x3C2B, 0x7845, 0x7845, 0x1FBC, 0x7847, 0x7847, 0x4715,
+ 0x7848, 0x7848, 0x1FB5, 0x7849, 0x7849, 0x1FB7, 0x784A, 0x784A, 0x1FB9,
+ 0x784B, 0x784B, 0x3C6D, 0x784C, 0x784C, 0x1FBA, 0x784D, 0x784D, 0x1FB8,
+ 0x784E, 0x784E, 0x0B41, 0x7850, 0x7850, 0x1FBD, 0x7851, 0x7851, 0x4716,
+ 0x7852, 0x7852, 0x1FB6, 0x7853, 0x7853, 0x3F95, 0x7854, 0x7854, 0x3C6B,
+ 0x785C, 0x785C, 0x223D, 0x785D, 0x785D, 0x0CF6, 0x785E, 0x785E, 0x2245,
+ 0x7860, 0x7860, 0x223A, 0x7862, 0x7862, 0x2246, 0x7864, 0x7865, 0x223B,
+ 0x7866, 0x7866, 0x4717, 0x7868, 0x7868, 0x2244, 0x7869, 0x7869, 0x2243,
+ 0x786A, 0x786A, 0x2240, 0x786B, 0x786B, 0x0B3F, 0x786C, 0x786C, 0x0CF7,
+ 0x786D, 0x786D, 0x223E, 0x786E, 0x786E, 0x2241, 0x786F, 0x786F, 0x0CF8,
+ 0x7870, 0x7870, 0x2242, 0x7871, 0x7871, 0x223F, 0x7879, 0x7879, 0x24D7,
+ 0x787A, 0x787A, 0x3EE9, 0x787B, 0x787B, 0x24DB, 0x787C, 0x787C, 0x0EA5,
+ 0x787E, 0x787E, 0x274D, 0x787F, 0x787F, 0x0EA8, 0x7880, 0x7880, 0x24D9,
+ 0x7881, 0x7881, 0x36E8, 0x7883, 0x7883, 0x24D6, 0x7884, 0x7884, 0x24D1,
+ 0x7885, 0x7886, 0x24D3, 0x7887, 0x7887, 0x24CD, 0x7888, 0x7888, 0x3B15,
+ 0x7889, 0x7889, 0x0EA4, 0x788C, 0x788C, 0x0EA3, 0x788D, 0x788D, 0x3B14,
+ 0x788E, 0x788E, 0x0E9F, 0x788F, 0x788F, 0x24D0, 0x7891, 0x7891, 0x0EA6,
+ 0x7893, 0x7893, 0x0EA7, 0x7894, 0x7894, 0x24CF, 0x7895, 0x7895, 0x24D2,
+ 0x7896, 0x7896, 0x24DA, 0x7897, 0x7898, 0x0EA1, 0x7899, 0x7899, 0x24D8,
+ 0x789A, 0x789A, 0x24CE, 0x789E, 0x789E, 0x274F, 0x789F, 0x789F, 0x103F,
+ 0x78A0, 0x78A0, 0x2751, 0x78A1, 0x78A1, 0x24D5, 0x78A2, 0x78A2, 0x2753,
+ 0x78A3, 0x78A3, 0x1043, 0x78A4, 0x78A4, 0x2754, 0x78A5, 0x78A5, 0x2750,
+ 0x78A7, 0x78A7, 0x1040, 0x78A8, 0x78A8, 0x274C, 0x78A9, 0x78A9, 0x1042,
+ 0x78AA, 0x78AA, 0x2749, 0x78AB, 0x78AB, 0x274E, 0x78AC, 0x78AC, 0x2752,
+ 0x78AD, 0x78AD, 0x274B, 0x78AF, 0x78AF, 0x42EC, 0x78B0, 0x78B0, 0x0EA0,
+ 0x78B1, 0x78B1, 0x42F4, 0x78B2, 0x78B2, 0x2748, 0x78B3, 0x78B3, 0x1041,
+ 0x78B4, 0x78B4, 0x274A, 0x78B6, 0x78B6, 0x3C6C, 0x78B8, 0x78B8, 0x4571,
+ 0x78B9, 0x78B9, 0x3C63, 0x78BA, 0x78BA, 0x11BD, 0x78BB, 0x78BB, 0x2992,
+ 0x78BC, 0x78BC, 0x11C1, 0x78BE, 0x78BE, 0x11BF, 0x78C1, 0x78C1, 0x103E,
+ 0x78C3, 0x78C4, 0x2999, 0x78C5, 0x78C5, 0x11BC, 0x78C7, 0x78C7, 0x42ED,
+ 0x78C8, 0x78C8, 0x2998, 0x78C9, 0x78C9, 0x299B, 0x78CA, 0x78CA, 0x11BE,
+ 0x78CB, 0x78CB, 0x11BB, 0x78CC, 0x78CC, 0x2994, 0x78CD, 0x78CD, 0x2991,
+ 0x78CE, 0x78CE, 0x2996, 0x78CF, 0x78CF, 0x2993, 0x78D0, 0x78D0, 0x11C2,
+ 0x78D1, 0x78D1, 0x2995, 0x78D2, 0x78D2, 0x3B16, 0x78D3, 0x78D3, 0x42EE,
+ 0x78D4, 0x78D4, 0x2997, 0x78D5, 0x78D5, 0x11C0, 0x78D7, 0x78D7, 0x42F2,
+ 0x78D8, 0x78D8, 0x3F8C, 0x78DA, 0x78DA, 0x130C, 0x78DB, 0x78DB, 0x2BEF,
+ 0x78DD, 0x78DD, 0x2BE9, 0x78DE, 0x78DE, 0x2BED, 0x78DF, 0x78E0, 0x2BF3,
+ 0x78E1, 0x78E2, 0x2BF0, 0x78E3, 0x78E3, 0x2BEE, 0x78E5, 0x78E5, 0x2BEB,
+ 0x78E7, 0x78E7, 0x130E, 0x78E8, 0x78E8, 0x130B, 0x78E9, 0x78E9, 0x2BEA,
+ 0x78EA, 0x78EA, 0x2BEC, 0x78EC, 0x78EC, 0x130D, 0x78ED, 0x78ED, 0x2BF2,
+ 0x78EE, 0x78EE, 0x3A81, 0x78EF, 0x78EF, 0x1422, 0x78F0, 0x78F0, 0x3B3A,
+ 0x78F1, 0x78F1, 0x40BE, 0x78F2, 0x78F2, 0x2DC8, 0x78F3, 0x78F3, 0x2DC2,
+ 0x78F4, 0x78F4, 0x1421, 0x78F5, 0x78F5, 0x38B3, 0x78F7, 0x78F7, 0x141F,
+ 0x78F9, 0x78F9, 0x2DCA, 0x78FA, 0x78FA, 0x1420, 0x78FB, 0x78FC, 0x2DC5,
+ 0x78FD, 0x78FD, 0x2DC3, 0x78FE, 0x78FE, 0x2DCB, 0x78FF, 0x78FF, 0x2DC7,
+ 0x7901, 0x7901, 0x1423, 0x7902, 0x7902, 0x2DC4, 0x7904, 0x7904, 0x2DCC,
+ 0x7905, 0x7905, 0x2DC9, 0x7906, 0x7906, 0x3FCF, 0x7909, 0x7909, 0x2F6F,
+ 0x790C, 0x790C, 0x2F6C, 0x790E, 0x790E, 0x14FE, 0x7910, 0x7910, 0x2F70,
+ 0x7911, 0x7911, 0x2F72, 0x7912, 0x7912, 0x2F71, 0x7913, 0x7914, 0x2F6D,
+ 0x7917, 0x7917, 0x30CE, 0x7919, 0x7919, 0x159F, 0x791B, 0x791B, 0x30CB,
+ 0x791C, 0x791C, 0x30CD, 0x791D, 0x791D, 0x30CA, 0x791E, 0x791E, 0x30CF,
+ 0x7921, 0x7921, 0x30CC, 0x7923, 0x7923, 0x3204, 0x7924, 0x7924, 0x3207,
+ 0x7925, 0x7925, 0x3203, 0x7926, 0x7926, 0x1624, 0x7927, 0x7928, 0x3205,
+ 0x7929, 0x7929, 0x3208, 0x792A, 0x792A, 0x1625, 0x792B, 0x792B, 0x1627,
+ 0x792C, 0x792C, 0x1626, 0x792D, 0x792D, 0x32E6, 0x792E, 0x792E, 0x42F0,
+ 0x792F, 0x792F, 0x32E8, 0x7931, 0x7931, 0x32E7, 0x7932, 0x7932, 0x471B,
+ 0x7933, 0x7933, 0x471A, 0x7934, 0x7934, 0x42F3, 0x7935, 0x7935, 0x3397,
+ 0x7936, 0x7936, 0x3783, 0x7938, 0x7938, 0x3490, 0x7939, 0x7939, 0x34D5,
+ 0x793A, 0x793A, 0x036A, 0x793B, 0x793B, 0x44F7, 0x793C, 0x793C, 0x4300,
+ 0x793D, 0x793D, 0x18D7, 0x793E, 0x793E, 0x065F, 0x793F, 0x793F, 0x1A20,
+ 0x7940, 0x7941, 0x0660, 0x7942, 0x7942, 0x1A1F, 0x7944, 0x7944, 0x1BAF,
+ 0x7945, 0x7945, 0x1BAE, 0x7946, 0x7946, 0x07BF, 0x7947, 0x7947, 0x07C2,
+ 0x7948, 0x7948, 0x07C1, 0x7949, 0x7949, 0x07C0, 0x794A, 0x794A, 0x1BAB,
+ 0x794B, 0x794B, 0x1BAD, 0x794C, 0x794C, 0x1BAC, 0x794F, 0x794F, 0x1D76,
+ 0x7950, 0x7950, 0x0956, 0x7951, 0x7951, 0x1D7A, 0x7952, 0x7952, 0x1D79,
+ 0x7953, 0x7953, 0x1D78, 0x7954, 0x7954, 0x1D74, 0x7955, 0x7955, 0x0955,
+ 0x7956, 0x7956, 0x0959, 0x7957, 0x7957, 0x095C, 0x7958, 0x7958, 0x37E5,
+ 0x7959, 0x7959, 0x3B18, 0x795A, 0x795A, 0x095D, 0x795B, 0x795B, 0x1D75,
+ 0x795C, 0x795C, 0x1D77, 0x795D, 0x795D, 0x095B, 0x795E, 0x795E, 0x095A,
+ 0x795F, 0x795F, 0x0958, 0x7960, 0x7960, 0x0957, 0x7961, 0x7961, 0x1FC4,
+ 0x7962, 0x7962, 0x3E7D, 0x7963, 0x7963, 0x1FC2, 0x7964, 0x7964, 0x1FBE,
+ 0x7965, 0x7965, 0x0B42, 0x7967, 0x7967, 0x1FBF, 0x7968, 0x7968, 0x0B43,
+ 0x7969, 0x796A, 0x1FC0, 0x796B, 0x796B, 0x1FC3, 0x796D, 0x796D, 0x0B44,
+ 0x7970, 0x7970, 0x224A, 0x7971, 0x7971, 0x4168, 0x7972, 0x7972, 0x2249,
+ 0x7973, 0x7973, 0x2248, 0x7974, 0x7974, 0x2247, 0x7979, 0x7979, 0x24DF,
+ 0x797A, 0x797A, 0x0EA9, 0x797C, 0x797C, 0x24DC, 0x797D, 0x797D, 0x24DE,
+ 0x797E, 0x797E, 0x3E26, 0x797F, 0x797F, 0x0EAA, 0x7980, 0x7980, 0x42FC,
+ 0x7981, 0x7981, 0x0EAB, 0x7982, 0x7982, 0x24DD, 0x7983, 0x7983, 0x3DF6,
+ 0x7986, 0x7986, 0x42F9, 0x7987, 0x7987, 0x4588, 0x7988, 0x7988, 0x275D,
+ 0x798A, 0x798B, 0x2756, 0x798D, 0x798D, 0x1046, 0x798E, 0x798F, 0x1044,
+ 0x7990, 0x7990, 0x275F, 0x7991, 0x7991, 0x471D, 0x7992, 0x7992, 0x275E,
+ 0x7993, 0x7993, 0x275B, 0x7994, 0x7994, 0x275A, 0x7995, 0x7995, 0x2759,
+ 0x7996, 0x7996, 0x2758, 0x7997, 0x7997, 0x275C, 0x7998, 0x7998, 0x2755,
+ 0x7999, 0x7999, 0x43FC, 0x799A, 0x799A, 0x299C, 0x799B, 0x799B, 0x29A1,
+ 0x799C, 0x799C, 0x299F, 0x799D, 0x799D, 0x42FE, 0x799F, 0x799F, 0x395E,
+ 0x79A0, 0x79A0, 0x299E, 0x79A1, 0x79A1, 0x299D, 0x79A2, 0x79A2, 0x29A0,
+ 0x79A4, 0x79A4, 0x2BF5, 0x79A5, 0x79A5, 0x3B1E, 0x79A6, 0x79A6, 0x130F,
+ 0x79A7, 0x79A7, 0x1424, 0x79A8, 0x79A8, 0x2DCE, 0x79A9, 0x79A9, 0x4301,
+ 0x79AA, 0x79AA, 0x1425, 0x79AB, 0x79AB, 0x2DCD, 0x79AC, 0x79AC, 0x2F74,
+ 0x79AD, 0x79AD, 0x2F73, 0x79AE, 0x79AE, 0x14FF, 0x79B0, 0x79B0, 0x30D0,
+ 0x79B1, 0x79B1, 0x15A0, 0x79B2, 0x79B2, 0x3209, 0x79B3, 0x79B3, 0x16CF,
+ 0x79B4, 0x79B4, 0x3398, 0x79B6, 0x79B6, 0x3492, 0x79B7, 0x79B7, 0x3491,
+ 0x79B8, 0x79B8, 0x17B2, 0x79B9, 0x79BA, 0x07C3, 0x79BB, 0x79BB, 0x1FC5,
+ 0x79BD, 0x79BD, 0x0EAD, 0x79BE, 0x79BE, 0x036B, 0x79BF, 0x79BF, 0x04F9,
+ 0x79C0, 0x79C0, 0x04F8, 0x79C1, 0x79C1, 0x04F7, 0x79C4, 0x79C4, 0x3CCD,
+ 0x79C5, 0x79C5, 0x1A21, 0x79C6, 0x79C6, 0x4305, 0x79C8, 0x79C8, 0x0663,
+ 0x79C9, 0x79C9, 0x0662, 0x79CB, 0x79CB, 0x07C7, 0x79CC, 0x79CC, 0x4233,
+ 0x79CD, 0x79CD, 0x1BB1, 0x79CE, 0x79CE, 0x1BB4, 0x79CF, 0x79CF, 0x1BB2,
+ 0x79D1, 0x79D2, 0x07C5, 0x79D4, 0x79D4, 0x4307, 0x79D5, 0x79D5, 0x1BB0,
+ 0x79D6, 0x79D6, 0x1BB3, 0x79D8, 0x79D8, 0x0964, 0x79DC, 0x79DC, 0x1D81,
+ 0x79DD, 0x79DD, 0x1D83, 0x79DE, 0x79DE, 0x1D82, 0x79DF, 0x79DF, 0x0961,
+ 0x79E0, 0x79E0, 0x1D7D, 0x79E2, 0x79E2, 0x3C5A, 0x79E3, 0x79E3, 0x095F,
+ 0x79E4, 0x79E4, 0x095E, 0x79E6, 0x79E6, 0x0962, 0x79E7, 0x79E7, 0x0960,
+ 0x79E9, 0x79E9, 0x0963, 0x79EA, 0x79EA, 0x1D80, 0x79EB, 0x79EC, 0x1D7B,
+ 0x79ED, 0x79ED, 0x1D7F, 0x79EE, 0x79EE, 0x1D7E, 0x79F1, 0x79F1, 0x3B27,
+ 0x79F4, 0x79F4, 0x3B22, 0x79F6, 0x79F7, 0x1FC8, 0x79F8, 0x79F8, 0x1FC7,
+ 0x79FA, 0x79FA, 0x1FC6, 0x79FB, 0x79FB, 0x0B45, 0x7A00, 0x7A00, 0x0CFD,
+ 0x7A02, 0x7A02, 0x224B, 0x7A03, 0x7A03, 0x224D, 0x7A04, 0x7A04, 0x224F,
+ 0x7A05, 0x7A05, 0x0CFC, 0x7A06, 0x7A06, 0x471E, 0x7A08, 0x7A08, 0x0CFA,
+ 0x7A0A, 0x7A0A, 0x224C, 0x7A0B, 0x7A0B, 0x0CFB, 0x7A0C, 0x7A0C, 0x224E,
+ 0x7A0D, 0x7A0D, 0x0CF9, 0x7A10, 0x7A10, 0x24E9, 0x7A11, 0x7A11, 0x24E0,
+ 0x7A12, 0x7A12, 0x24E3, 0x7A13, 0x7A13, 0x24E7, 0x7A14, 0x7A14, 0x0EB1,
+ 0x7A15, 0x7A15, 0x24E5, 0x7A17, 0x7A17, 0x24E4, 0x7A18, 0x7A19, 0x24E1,
+ 0x7A1A, 0x7A1A, 0x0EAF, 0x7A1B, 0x7A1B, 0x24E8, 0x7A1C, 0x7A1C, 0x0EAE,
+ 0x7A1E, 0x7A1E, 0x0EB3, 0x7A1F, 0x7A1F, 0x0EB2, 0x7A20, 0x7A20, 0x0EB0,
+ 0x7A22, 0x7A22, 0x24E6, 0x7A26, 0x7A26, 0x2765, 0x7A28, 0x7A28, 0x2764,
+ 0x7A2B, 0x7A2B, 0x2760, 0x7A2D, 0x7A2D, 0x3FDA, 0x7A2E, 0x7A2E, 0x1047,
+ 0x7A2F, 0x7A2F, 0x2763, 0x7A30, 0x7A30, 0x2762, 0x7A31, 0x7A31, 0x1048,
+ 0x7A37, 0x7A37, 0x11C7, 0x7A39, 0x7A39, 0x29A3, 0x7A3A, 0x7A3A, 0x3B21,
+ 0x7A3B, 0x7A3B, 0x11C8, 0x7A3C, 0x7A3C, 0x11C4, 0x7A3D, 0x7A3D, 0x11C6,
+ 0x7A3E, 0x7A3E, 0x3F8B, 0x7A3F, 0x7A3F, 0x11C3, 0x7A40, 0x7A40, 0x11C5,
+ 0x7A43, 0x7A43, 0x396C, 0x7A44, 0x7A44, 0x2BF6, 0x7A45, 0x7A45, 0x3DF1,
+ 0x7A46, 0x7A46, 0x1312, 0x7A47, 0x7A47, 0x2BF8, 0x7A48, 0x7A48, 0x2BF7,
+ 0x7A49, 0x7A49, 0x3733, 0x7A4A, 0x7A4A, 0x2761, 0x7A4B, 0x7A4B, 0x1314,
+ 0x7A4C, 0x7A4C, 0x1313, 0x7A4D, 0x7A4E, 0x1310, 0x7A54, 0x7A54, 0x2DD3,
+ 0x7A56, 0x7A56, 0x2DD1, 0x7A57, 0x7A57, 0x1426, 0x7A58, 0x7A58, 0x2DD2,
+ 0x7A5A, 0x7A5A, 0x2DD4, 0x7A5B, 0x7A5B, 0x2DD0, 0x7A5C, 0x7A5C, 0x2DCF,
+ 0x7A5F, 0x7A5F, 0x2F75, 0x7A60, 0x7A60, 0x1502, 0x7A61, 0x7A62, 0x1500,
+ 0x7A65, 0x7A65, 0x3736, 0x7A67, 0x7A68, 0x30D1, 0x7A69, 0x7A69, 0x15A2,
+ 0x7A6B, 0x7A6B, 0x15A1, 0x7A6C, 0x7A6D, 0x320B, 0x7A6E, 0x7A6E, 0x320A,
+ 0x7A70, 0x7A71, 0x3399, 0x7A74, 0x7A74, 0x036C, 0x7A75, 0x7A75, 0x1811,
+ 0x7A76, 0x7A76, 0x04FA, 0x7A78, 0x7A78, 0x1A22, 0x7A79, 0x7A79, 0x0665,
+ 0x7A7A, 0x7A7A, 0x0664, 0x7A7B, 0x7A7B, 0x1A23, 0x7A7D, 0x7A7D, 0x3737,
+ 0x7A7E, 0x7A7E, 0x1BB6, 0x7A7F, 0x7A7F, 0x07C8, 0x7A80, 0x7A80, 0x1BB5,
+ 0x7A81, 0x7A81, 0x07C9, 0x7A83, 0x7A83, 0x3D7D, 0x7A84, 0x7A84, 0x0965,
+ 0x7A85, 0x7A85, 0x1D86, 0x7A86, 0x7A86, 0x1D84, 0x7A87, 0x7A87, 0x1D8A,
+ 0x7A88, 0x7A88, 0x0966, 0x7A89, 0x7A89, 0x1D85, 0x7A8A, 0x7A8A, 0x1D89,
+ 0x7A8B, 0x7A8C, 0x1D87, 0x7A8F, 0x7A8F, 0x1FCA, 0x7A90, 0x7A90, 0x1FCC,
+ 0x7A91, 0x7A91, 0x43D8, 0x7A92, 0x7A92, 0x0B46, 0x7A94, 0x7A94, 0x1FCB,
+ 0x7A95, 0x7A95, 0x0B47, 0x7A96, 0x7A96, 0x0D00, 0x7A97, 0x7A97, 0x0CFF,
+ 0x7A98, 0x7A98, 0x0CFE, 0x7A99, 0x7A99, 0x2250, 0x7A9E, 0x7A9E, 0x24EC,
+ 0x7A9F, 0x7AA0, 0x0EB4, 0x7AA2, 0x7AA2, 0x24EB, 0x7AA3, 0x7AA3, 0x24EA,
+ 0x7AA8, 0x7AA8, 0x2766, 0x7AA9, 0x7AA9, 0x104A, 0x7AAA, 0x7AAA, 0x1049,
+ 0x7AAB, 0x7AAC, 0x2767, 0x7AAE, 0x7AAE, 0x11CA, 0x7AAF, 0x7AAF, 0x11C9,
+ 0x7AB0, 0x7AB0, 0x373A, 0x7AB1, 0x7AB1, 0x2BFC, 0x7AB2, 0x7AB2, 0x29A4,
+ 0x7AB3, 0x7AB3, 0x29A6, 0x7AB4, 0x7AB4, 0x29A5, 0x7AB5, 0x7AB5, 0x2BFB,
+ 0x7AB6, 0x7AB6, 0x2BF9, 0x7AB7, 0x7AB7, 0x2BFD, 0x7AB8, 0x7AB8, 0x2BFA,
+ 0x7ABA, 0x7ABA, 0x1315, 0x7ABB, 0x7ABB, 0x3739, 0x7ABC, 0x7ABC, 0x4721,
+ 0x7ABE, 0x7ABE, 0x2DD5, 0x7ABF, 0x7ABF, 0x1427, 0x7AC0, 0x7AC1, 0x2DD6,
+ 0x7AC2, 0x7AC3, 0x373B, 0x7AC4, 0x7AC5, 0x1503, 0x7AC7, 0x7AC7, 0x1628,
+ 0x7AC8, 0x7AC8, 0x3D7F, 0x7AC9, 0x7AC9, 0x4570, 0x7ACA, 0x7ACA, 0x16FF,
+ 0x7ACB, 0x7ACB, 0x036D, 0x7ACF, 0x7ACF, 0x4724, 0x7AD1, 0x7AD1, 0x1BB7,
+ 0x7AD3, 0x7AD3, 0x3F8A, 0x7AD8, 0x7AD8, 0x1D8B, 0x7AD9, 0x7AD9, 0x0967,
+ 0x7ADA, 0x7ADA, 0x3740, 0x7ADB, 0x7ADB, 0x4725, 0x7ADC, 0x7ADC, 0x3951,
+ 0x7ADD, 0x7ADD, 0x3741, 0x7ADF, 0x7ADF, 0x0BDE, 0x7AE0, 0x7AE0, 0x0BDD,
+ 0x7AE2, 0x7AE2, 0x3B33, 0x7AE3, 0x7AE3, 0x0D02, 0x7AE4, 0x7AE4, 0x2252,
+ 0x7AE5, 0x7AE5, 0x0D01, 0x7AE6, 0x7AE6, 0x2251, 0x7AE7, 0x7AE7, 0x385D,
+ 0x7AE9, 0x7AE9, 0x3831, 0x7AEA, 0x7AEA, 0x3742, 0x7AEB, 0x7AEB, 0x24ED,
+ 0x7AED, 0x7AED, 0x104B, 0x7AEE, 0x7AEE, 0x2769, 0x7AEF, 0x7AEF, 0x104C,
+ 0x7AF6, 0x7AF6, 0x1629, 0x7AF7, 0x7AF7, 0x320D, 0x7AF9, 0x7AF9, 0x03F6,
+ 0x7AFA, 0x7AFA, 0x0666, 0x7AFB, 0x7AFB, 0x1A24, 0x7AFD, 0x7AFD, 0x07CB,
+ 0x7AFE, 0x7AFE, 0x3B3D, 0x7AFF, 0x7AFF, 0x07CA, 0x7B00, 0x7B01, 0x1BB8,
+ 0x7B04, 0x7B04, 0x1D8D, 0x7B05, 0x7B05, 0x1D8F, 0x7B06, 0x7B06, 0x0968,
+ 0x7B08, 0x7B08, 0x1D91, 0x7B09, 0x7B09, 0x1D94, 0x7B0A, 0x7B0A, 0x1D92,
+ 0x7B0B, 0x7B0B, 0x3746, 0x7B0C, 0x7B0C, 0x3B63, 0x7B0E, 0x7B0E, 0x1D93,
+ 0x7B0F, 0x7B0F, 0x1D90, 0x7B10, 0x7B10, 0x1D8C, 0x7B11, 0x7B11, 0x0969,
+ 0x7B12, 0x7B12, 0x1D95, 0x7B13, 0x7B13, 0x1D8E, 0x7B14, 0x7B14, 0x3F77,
+ 0x7B18, 0x7B18, 0x1FD5, 0x7B19, 0x7B19, 0x0B4D, 0x7B1A, 0x7B1A, 0x1FDE,
+ 0x7B1B, 0x7B1B, 0x0B4A, 0x7B1D, 0x7B1D, 0x1FD7, 0x7B1E, 0x7B1E, 0x0B4E,
+ 0x7B1F, 0x7B1F, 0x3F11, 0x7B20, 0x7B20, 0x0B48, 0x7B22, 0x7B22, 0x1FD2,
+ 0x7B23, 0x7B23, 0x1FDF, 0x7B24, 0x7B24, 0x1FD3, 0x7B25, 0x7B25, 0x1FD0,
+ 0x7B26, 0x7B26, 0x0B4C, 0x7B27, 0x7B27, 0x3B5F, 0x7B28, 0x7B28, 0x0B49,
+ 0x7B29, 0x7B29, 0x3748, 0x7B2A, 0x7B2A, 0x1FD6, 0x7B2B, 0x7B2B, 0x1FD9,
+ 0x7B2C, 0x7B2C, 0x0B4B, 0x7B2D, 0x7B2D, 0x1FDA, 0x7B2E, 0x7B2E, 0x0B4F,
+ 0x7B2F, 0x7B2F, 0x1FDB, 0x7B30, 0x7B30, 0x1FD1, 0x7B31, 0x7B31, 0x1FD8,
+ 0x7B32, 0x7B32, 0x1FDC, 0x7B33, 0x7B33, 0x1FD4, 0x7B34, 0x7B34, 0x1FCF,
+ 0x7B35, 0x7B35, 0x1FCD, 0x7B38, 0x7B38, 0x1FDD, 0x7B39, 0x7B39, 0x3D6E,
+ 0x7B3B, 0x7B3B, 0x1FCE, 0x7B40, 0x7B40, 0x2259, 0x7B42, 0x7B42, 0x3DED,
+ 0x7B43, 0x7B43, 0x3E25, 0x7B44, 0x7B44, 0x2255, 0x7B45, 0x7B45, 0x225B,
+ 0x7B46, 0x7B46, 0x0D05, 0x7B47, 0x7B47, 0x2254, 0x7B48, 0x7B48, 0x2256,
+ 0x7B49, 0x7B49, 0x0D03, 0x7B4A, 0x7B4A, 0x2253, 0x7B4B, 0x7B4B, 0x0D0A,
+ 0x7B4C, 0x7B4C, 0x2257, 0x7B4D, 0x7B4D, 0x0D09, 0x7B4E, 0x7B4E, 0x2258,
+ 0x7B4F, 0x7B4F, 0x0D0B, 0x7B50, 0x7B50, 0x0D06, 0x7B51, 0x7B51, 0x0D0C,
+ 0x7B52, 0x7B52, 0x0D07, 0x7B54, 0x7B54, 0x0D08, 0x7B55, 0x7B55, 0x3747,
+ 0x7B56, 0x7B56, 0x0D04, 0x7B58, 0x7B58, 0x225A, 0x7B60, 0x7B60, 0x0EB8,
+ 0x7B61, 0x7B61, 0x24F8, 0x7B62, 0x7B62, 0x4727, 0x7B63, 0x7B63, 0x24FB,
+ 0x7B64, 0x7B64, 0x24EF, 0x7B65, 0x7B65, 0x24F4, 0x7B66, 0x7B66, 0x24EE,
+ 0x7B67, 0x7B67, 0x0EBA, 0x7B69, 0x7B69, 0x24F2, 0x7B6C, 0x7B6C, 0x4728,
+ 0x7B6D, 0x7B6D, 0x24F0, 0x7B6E, 0x7B6E, 0x0EB9, 0x7B6F, 0x7B6F, 0x374C,
+ 0x7B70, 0x7B70, 0x24F7, 0x7B71, 0x7B71, 0x24F6, 0x7B72, 0x7B72, 0x24F3,
+ 0x7B73, 0x7B73, 0x24F5, 0x7B74, 0x7B74, 0x24F1, 0x7B75, 0x7B75, 0x1050,
+ 0x7B76, 0x7B76, 0x24FA, 0x7B77, 0x7B77, 0x0EB6, 0x7B78, 0x7B78, 0x24F9,
+ 0x7B7B, 0x7B7B, 0x4729, 0x7B82, 0x7B82, 0x2779, 0x7B84, 0x7B84, 0x1057,
+ 0x7B85, 0x7B85, 0x2774, 0x7B87, 0x7B87, 0x1056, 0x7B88, 0x7B88, 0x276A,
+ 0x7B8A, 0x7B8A, 0x276C, 0x7B8B, 0x7B8B, 0x104F, 0x7B8C, 0x7B8C, 0x2771,
+ 0x7B8D, 0x7B8D, 0x2770, 0x7B8E, 0x7B8E, 0x2773, 0x7B8F, 0x7B8F, 0x1054,
+ 0x7B90, 0x7B90, 0x276E, 0x7B91, 0x7B91, 0x276D, 0x7B92, 0x7B92, 0x3752,
+ 0x7B94, 0x7B94, 0x1053, 0x7B95, 0x7B95, 0x104E, 0x7B96, 0x7B96, 0x276F,
+ 0x7B97, 0x7B97, 0x1051, 0x7B98, 0x7B98, 0x2775, 0x7B99, 0x7B99, 0x2777,
+ 0x7B9B, 0x7B9B, 0x2772, 0x7B9C, 0x7B9C, 0x276B, 0x7B9D, 0x7B9D, 0x1052,
+ 0x7BA0, 0x7BA0, 0x11D2, 0x7BA1, 0x7BA1, 0x104D, 0x7BA2, 0x7BA2, 0x374B,
+ 0x7BA3, 0x7BA3, 0x3F14, 0x7BA4, 0x7BA4, 0x2778, 0x7BAC, 0x7BAC, 0x29AA,
+ 0x7BAD, 0x7BAD, 0x11CB, 0x7BAF, 0x7BAF, 0x29AC, 0x7BB1, 0x7BB1, 0x11CC,
+ 0x7BB2, 0x7BB2, 0x461C, 0x7BB4, 0x7BB4, 0x11CE, 0x7BB5, 0x7BB5, 0x29AF,
+ 0x7BB7, 0x7BB7, 0x29A7, 0x7BB8, 0x7BB8, 0x1055, 0x7BB9, 0x7BB9, 0x29AD,
+ 0x7BBE, 0x7BBE, 0x29A9, 0x7BC0, 0x7BC0, 0x0EB7, 0x7BC1, 0x7BC1, 0x11D1,
+ 0x7BC4, 0x7BC4, 0x11CD, 0x7BC6, 0x7BC7, 0x11CF, 0x7BC9, 0x7BC9, 0x1318,
+ 0x7BCA, 0x7BCA, 0x29AE, 0x7BCB, 0x7BCB, 0x29A8, 0x7BCC, 0x7BCC, 0x11D3,
+ 0x7BCE, 0x7BCE, 0x29AB, 0x7BCF, 0x7BCF, 0x3F18, 0x7BD0, 0x7BD0, 0x3750,
+ 0x7BD4, 0x7BD4, 0x2C07, 0x7BD5, 0x7BD5, 0x2C02, 0x7BD8, 0x7BD8, 0x2C0C,
+ 0x7BD9, 0x7BD9, 0x1316, 0x7BDA, 0x7BDA, 0x2C04, 0x7BDB, 0x7BDB, 0x131A,
+ 0x7BDC, 0x7BDC, 0x2C0A, 0x7BDD, 0x7BDD, 0x2C01, 0x7BDE, 0x7BDE, 0x2BFE,
+ 0x7BDF, 0x7BDF, 0x2C0D, 0x7BE0, 0x7BE0, 0x142D, 0x7BE1, 0x7BE1, 0x131B,
+ 0x7BE2, 0x7BE2, 0x2C09, 0x7BE3, 0x7BE3, 0x2BFF, 0x7BE4, 0x7BE4, 0x1319,
+ 0x7BE5, 0x7BE5, 0x2C03, 0x7BE6, 0x7BE6, 0x131D, 0x7BE7, 0x7BE7, 0x2C00,
+ 0x7BE8, 0x7BE8, 0x2C05, 0x7BE9, 0x7BE9, 0x131C, 0x7BEA, 0x7BEA, 0x2C08,
+ 0x7BEB, 0x7BEB, 0x2C0B, 0x7BF0, 0x7BF1, 0x2DE9, 0x7BF2, 0x7BF2, 0x2DDA,
+ 0x7BF3, 0x7BF3, 0x2DE1, 0x7BF4, 0x7BF4, 0x2DDF, 0x7BF7, 0x7BF7, 0x142B,
+ 0x7BF8, 0x7BF8, 0x2DE6, 0x7BF9, 0x7BF9, 0x2C06, 0x7BFA, 0x7BFA, 0x3757,
+ 0x7BFB, 0x7BFB, 0x2DDD, 0x7BFC, 0x7BFC, 0x3F1F, 0x7BFD, 0x7BFD, 0x2DE7,
+ 0x7BFE, 0x7BFE, 0x142A, 0x7BFF, 0x7BFF, 0x2DDC, 0x7C00, 0x7C00, 0x2DDB,
+ 0x7C01, 0x7C01, 0x2DE5, 0x7C02, 0x7C02, 0x2DE2, 0x7C03, 0x7C03, 0x2DE4,
+ 0x7C05, 0x7C05, 0x2DD8, 0x7C06, 0x7C06, 0x2DE8, 0x7C07, 0x7C07, 0x1428,
+ 0x7C09, 0x7C09, 0x2DE3, 0x7C0A, 0x7C0A, 0x2DEC, 0x7C0B, 0x7C0B, 0x2DE0,
+ 0x7C0C, 0x7C0C, 0x142C, 0x7C0D, 0x7C0D, 0x1429, 0x7C0E, 0x7C0E, 0x2DDE,
+ 0x7C0F, 0x7C0F, 0x2DD9, 0x7C10, 0x7C10, 0x2DEB, 0x7C11, 0x7C11, 0x1317,
+ 0x7C12, 0x7C12, 0x472A, 0x7C15, 0x7C15, 0x4061, 0x7C19, 0x7C19, 0x2F78,
+ 0x7C1B, 0x7C1B, 0x43D9, 0x7C1C, 0x7C1C, 0x2F76, 0x7C1D, 0x7C1D, 0x2F7C,
+ 0x7C1E, 0x7C1E, 0x1508, 0x7C1F, 0x7C1F, 0x2F7A, 0x7C20, 0x7C20, 0x2F79,
+ 0x7C21, 0x7C21, 0x150A, 0x7C22, 0x7C22, 0x2F7F, 0x7C23, 0x7C23, 0x1509,
+ 0x7C25, 0x7C25, 0x2F80, 0x7C26, 0x7C26, 0x2F7D, 0x7C27, 0x7C27, 0x1506,
+ 0x7C28, 0x7C28, 0x2F7E, 0x7C29, 0x7C29, 0x2F77, 0x7C2A, 0x7C2A, 0x1507,
+ 0x7C2B, 0x7C2B, 0x1505, 0x7C2C, 0x7C2C, 0x30D6, 0x7C2D, 0x7C2D, 0x2F7B,
+ 0x7C30, 0x7C30, 0x2F81, 0x7C33, 0x7C33, 0x30D3, 0x7C35, 0x7C35, 0x3759,
+ 0x7C37, 0x7C37, 0x15A7, 0x7C38, 0x7C38, 0x15A5, 0x7C39, 0x7C39, 0x30D5,
+ 0x7C3B, 0x7C3B, 0x30D7, 0x7C3C, 0x7C3C, 0x30D4, 0x7C3D, 0x7C3D, 0x15A6,
+ 0x7C3E, 0x7C3F, 0x15A3, 0x7C40, 0x7C40, 0x15A8, 0x7C42, 0x7C42, 0x3F1C,
+ 0x7C43, 0x7C43, 0x162B, 0x7C44, 0x7C44, 0x375B, 0x7C45, 0x7C45, 0x3212,
+ 0x7C47, 0x7C47, 0x3211, 0x7C48, 0x7C48, 0x320F, 0x7C49, 0x7C49, 0x320E,
+ 0x7C4A, 0x7C4A, 0x3210, 0x7C4C, 0x7C4C, 0x162A, 0x7C4D, 0x7C4D, 0x162C,
+ 0x7C50, 0x7C50, 0x1681, 0x7C51, 0x7C51, 0x3FB8, 0x7C53, 0x7C53, 0x32EA,
+ 0x7C54, 0x7C54, 0x32E9, 0x7C56, 0x7C56, 0x3EFF, 0x7C57, 0x7C57, 0x339B,
+ 0x7C59, 0x7C59, 0x339D, 0x7C5A, 0x7C5A, 0x339F, 0x7C5B, 0x7C5B, 0x339E,
+ 0x7C5C, 0x7C5C, 0x339C, 0x7C5D, 0x7C5D, 0x3B3F, 0x7C5F, 0x7C5F, 0x16D1,
+ 0x7C60, 0x7C60, 0x16D0, 0x7C63, 0x7C63, 0x1701, 0x7C64, 0x7C64, 0x1700,
+ 0x7C65, 0x7C65, 0x1702, 0x7C66, 0x7C66, 0x342B, 0x7C67, 0x7C67, 0x342A,
+ 0x7C69, 0x7C69, 0x34D6, 0x7C6A, 0x7C6A, 0x3493, 0x7C6B, 0x7C6B, 0x34D7,
+ 0x7C6C, 0x7C6C, 0x1745, 0x7C6D, 0x7C6D, 0x3B40, 0x7C6E, 0x7C6E, 0x1746,
+ 0x7C6F, 0x7C6F, 0x3507, 0x7C70, 0x7C70, 0x3F52, 0x7C72, 0x7C72, 0x176B,
+ 0x7C73, 0x7C73, 0x03F7, 0x7C74, 0x7C74, 0x469C, 0x7C75, 0x7C75, 0x1A25,
+ 0x7C78, 0x7C79, 0x1BBB, 0x7C7A, 0x7C7A, 0x1BBA, 0x7C7B, 0x7C7B, 0x472D,
+ 0x7C7C, 0x7C7C, 0x3B49, 0x7C7D, 0x7C7D, 0x07CC, 0x7C7E, 0x7C7E, 0x3F1A,
+ 0x7C7F, 0x7C81, 0x1BBD, 0x7C83, 0x7C83, 0x375C, 0x7C84, 0x7C84, 0x1D96,
+ 0x7C85, 0x7C85, 0x1D9C, 0x7C86, 0x7C86, 0x3F1D, 0x7C88, 0x7C88, 0x1D9A,
+ 0x7C89, 0x7C89, 0x096A, 0x7C8A, 0x7C8A, 0x1D98, 0x7C8C, 0x7C8C, 0x1D99,
+ 0x7C8D, 0x7C8D, 0x1D9B, 0x7C8E, 0x7C8E, 0x3B48, 0x7C91, 0x7C91, 0x1D97,
+ 0x7C92, 0x7C92, 0x0B50, 0x7C94, 0x7C94, 0x1FE0, 0x7C95, 0x7C95, 0x0B52,
+ 0x7C96, 0x7C96, 0x1FE2, 0x7C97, 0x7C97, 0x0B51, 0x7C98, 0x7C98, 0x1FE1,
+ 0x7C9C, 0x7C9C, 0x472E, 0x7C9E, 0x7C9E, 0x225D, 0x7C9F, 0x7C9F, 0x0D0D,
+ 0x7CA1, 0x7CA1, 0x225F, 0x7CA2, 0x7CA2, 0x225C, 0x7CA3, 0x7CA3, 0x1FE3,
+ 0x7CA5, 0x7CA5, 0x0D0E, 0x7CA6, 0x7CA6, 0x375E, 0x7CA7, 0x7CA7, 0x36ED,
+ 0x7CA8, 0x7CA8, 0x225E, 0x7CAC, 0x7CAC, 0x3885, 0x7CAE, 0x7CAE, 0x3B4A,
+ 0x7CAF, 0x7CAF, 0x24FE, 0x7CB1, 0x7CB1, 0x0EBB, 0x7CB2, 0x7CB2, 0x24FC,
+ 0x7CB3, 0x7CB3, 0x0EBC, 0x7CB4, 0x7CB4, 0x24FD, 0x7CB5, 0x7CB5, 0x0EBD,
+ 0x7CB8, 0x7CB8, 0x4730, 0x7CB9, 0x7CB9, 0x1058, 0x7CBA, 0x7CBA, 0x277D,
+ 0x7CBB, 0x7CBB, 0x277A, 0x7CBC, 0x7CBC, 0x277C, 0x7CBD, 0x7CBE, 0x1059,
+ 0x7CBF, 0x7CBF, 0x277B, 0x7CC2, 0x7CC2, 0x3FD7, 0x7CC5, 0x7CC5, 0x29B0,
+ 0x7CC7, 0x7CC7, 0x3761, 0x7CC8, 0x7CC8, 0x29B1, 0x7CC9, 0x7CC9, 0x3760,
+ 0x7CCA, 0x7CCA, 0x11D4, 0x7CCB, 0x7CCB, 0x29B3, 0x7CCC, 0x7CCC, 0x29B2,
+ 0x7CCD, 0x7CCD, 0x3B45, 0x7CCE, 0x7CCE, 0x0121, 0x7CD0, 0x7CD1, 0x2C11,
+ 0x7CD2, 0x7CD2, 0x2C0E, 0x7CD3, 0x7CD3, 0x3D5C, 0x7CD4, 0x7CD4, 0x2C0F,
+ 0x7CD5, 0x7CD6, 0x131E, 0x7CD7, 0x7CD7, 0x2C10, 0x7CD9, 0x7CD9, 0x1433,
+ 0x7CDA, 0x7CDA, 0x3FD9, 0x7CDC, 0x7CDC, 0x142F, 0x7CDD, 0x7CDD, 0x1434,
+ 0x7CDE, 0x7CDE, 0x1430, 0x7CDF, 0x7CDF, 0x1432, 0x7CE0, 0x7CE0, 0x142E,
+ 0x7CE2, 0x7CE2, 0x1431, 0x7CE6, 0x7CE6, 0x3762, 0x7CE7, 0x7CE7, 0x150B,
+ 0x7CE8, 0x7CE8, 0x2DED, 0x7CEA, 0x7CEA, 0x30D9, 0x7CEC, 0x7CEC, 0x30D8,
+ 0x7CED, 0x7CED, 0x43DA, 0x7CEE, 0x7CEE, 0x3213, 0x7CEF, 0x7CF0, 0x162D,
+ 0x7CF1, 0x7CF1, 0x33A1, 0x7CF2, 0x7CF2, 0x32EB, 0x7CF3, 0x7CF3, 0x3764,
+ 0x7CF4, 0x7CF4, 0x33A0, 0x7CF5, 0x7CF5, 0x3765, 0x7CF6, 0x7CF6, 0x34D8,
+ 0x7CF7, 0x7CF7, 0x351D, 0x7CF8, 0x7CF8, 0x03F8, 0x7CF9, 0x7CF9, 0x44F8,
+ 0x7CFB, 0x7CFB, 0x04FB, 0x7CFC, 0x7CFC, 0x456D, 0x7CFD, 0x7CFD, 0x1A26,
+ 0x7CFE, 0x7CFE, 0x0667, 0x7D00, 0x7D00, 0x07CF, 0x7D01, 0x7D01, 0x1BC2,
+ 0x7D02, 0x7D02, 0x07CD, 0x7D03, 0x7D03, 0x1BC0, 0x7D04, 0x7D04, 0x07D2,
+ 0x7D05, 0x7D05, 0x07CE, 0x7D06, 0x7D06, 0x07D3, 0x7D07, 0x7D07, 0x07D1,
+ 0x7D08, 0x7D08, 0x1BC1, 0x7D09, 0x7D09, 0x07D0, 0x7D0A, 0x7D0A, 0x096E,
+ 0x7D0B, 0x7D0B, 0x096D, 0x7D0C, 0x7D0C, 0x1DA7, 0x7D0D, 0x7D0D, 0x0976,
+ 0x7D0E, 0x7D0E, 0x1DA0, 0x7D0F, 0x7D0F, 0x1DA6, 0x7D10, 0x7D10, 0x0972,
+ 0x7D11, 0x7D11, 0x1D9F, 0x7D12, 0x7D12, 0x1DA5, 0x7D13, 0x7D13, 0x1DA3,
+ 0x7D14, 0x7D14, 0x0971, 0x7D15, 0x7D15, 0x0973, 0x7D16, 0x7D16, 0x1DA2,
+ 0x7D17, 0x7D17, 0x096C, 0x7D18, 0x7D18, 0x1DA1, 0x7D19, 0x7D19, 0x0977,
+ 0x7D1A, 0x7D1A, 0x0974, 0x7D1B, 0x7D1B, 0x0978, 0x7D1C, 0x7D1C, 0x0975,
+ 0x7D1D, 0x7D1D, 0x1D9E, 0x7D1E, 0x7D1E, 0x1D9D, 0x7D1F, 0x7D1F, 0x1DA4,
+ 0x7D20, 0x7D20, 0x096F, 0x7D21, 0x7D21, 0x096B, 0x7D22, 0x7D22, 0x0970,
+ 0x7D25, 0x7D25, 0x3EDE, 0x7D28, 0x7D28, 0x1FF2, 0x7D29, 0x7D29, 0x1FEB,
+ 0x7D2B, 0x7D2B, 0x0D13, 0x7D2C, 0x7D2C, 0x1FEA, 0x7D2E, 0x7D2E, 0x0B56,
+ 0x7D2F, 0x7D2F, 0x0B5D, 0x7D30, 0x7D30, 0x0B5A, 0x7D31, 0x7D31, 0x0B60,
+ 0x7D32, 0x7D32, 0x0B5F, 0x7D33, 0x7D33, 0x0B5B, 0x7D35, 0x7D35, 0x1FE4,
+ 0x7D36, 0x7D36, 0x1FE7, 0x7D38, 0x7D38, 0x1FE6, 0x7D39, 0x7D39, 0x0B57,
+ 0x7D3A, 0x7D3A, 0x1FE8, 0x7D3B, 0x7D3B, 0x1FF1, 0x7D3C, 0x7D3C, 0x0B58,
+ 0x7D3D, 0x7D3D, 0x1FE5, 0x7D3E, 0x7D3F, 0x1FEE, 0x7D40, 0x7D40, 0x0B59,
+ 0x7D41, 0x7D41, 0x1FEC, 0x7D42, 0x7D42, 0x0B5E, 0x7D43, 0x7D43, 0x0B54,
+ 0x7D44, 0x7D44, 0x0B5C, 0x7D45, 0x7D45, 0x1FE9, 0x7D46, 0x7D46, 0x0B53,
+ 0x7D47, 0x7D47, 0x1FED, 0x7D4A, 0x7D4A, 0x1FF0, 0x7D4D, 0x7D4D, 0x3FDD,
+ 0x7D4E, 0x7D4E, 0x2270, 0x7D4F, 0x7D4F, 0x2267, 0x7D50, 0x7D50, 0x0D10,
+ 0x7D51, 0x7D51, 0x226E, 0x7D52, 0x7D52, 0x226B, 0x7D53, 0x7D53, 0x2263,
+ 0x7D54, 0x7D54, 0x226C, 0x7D55, 0x7D55, 0x0D12, 0x7D56, 0x7D56, 0x2264,
+ 0x7D58, 0x7D58, 0x2260, 0x7D5A, 0x7D5A, 0x3E93, 0x7D5B, 0x7D5B, 0x0EC3,
+ 0x7D5C, 0x7D5C, 0x2269, 0x7D5D, 0x7D5D, 0x3769, 0x7D5E, 0x7D5E, 0x0D0F,
+ 0x7D5F, 0x7D5F, 0x226F, 0x7D61, 0x7D61, 0x0D16, 0x7D62, 0x7D62, 0x0D18,
+ 0x7D63, 0x7D63, 0x2262, 0x7D66, 0x7D66, 0x0D17, 0x7D67, 0x7D67, 0x2265,
+ 0x7D68, 0x7D68, 0x0D11, 0x7D69, 0x7D69, 0x226D, 0x7D6A, 0x7D6A, 0x2266,
+ 0x7D6B, 0x7D6B, 0x226A, 0x7D6D, 0x7D6D, 0x2268, 0x7D6E, 0x7D6E, 0x0D14,
+ 0x7D6F, 0x7D6F, 0x2261, 0x7D70, 0x7D70, 0x0D19, 0x7D71, 0x7D71, 0x0B55,
+ 0x7D72, 0x7D72, 0x0D15, 0x7D73, 0x7D73, 0x0D1A, 0x7D79, 0x7D79, 0x0EBF,
+ 0x7D7A, 0x7D7A, 0x2505, 0x7D7B, 0x7D7B, 0x2507, 0x7D7C, 0x7D7C, 0x2509,
+ 0x7D7D, 0x7D7D, 0x250D, 0x7D7F, 0x7D7F, 0x2503, 0x7D80, 0x7D80, 0x2501,
+ 0x7D81, 0x7D81, 0x0EC1, 0x7D83, 0x7D83, 0x2508, 0x7D84, 0x7D84, 0x250C,
+ 0x7D85, 0x7D85, 0x2504, 0x7D86, 0x7D86, 0x2500, 0x7D88, 0x7D88, 0x24FF,
+ 0x7D89, 0x7D89, 0x376B, 0x7D8C, 0x7D8C, 0x250A, 0x7D8D, 0x7D8D, 0x2502,
+ 0x7D8E, 0x7D8E, 0x2506, 0x7D8F, 0x7D8F, 0x0EC2, 0x7D91, 0x7D91, 0x0EC0,
+ 0x7D92, 0x7D92, 0x250E, 0x7D93, 0x7D93, 0x0EBE, 0x7D94, 0x7D94, 0x250B,
+ 0x7D96, 0x7D96, 0x278E, 0x7D97, 0x7D97, 0x3B53, 0x7D9C, 0x7D9C, 0x105D,
+ 0x7D9D, 0x7D9D, 0x2786, 0x7D9E, 0x7D9E, 0x11E1, 0x7D9F, 0x7D9F, 0x2790,
+ 0x7DA0, 0x7DA0, 0x1060, 0x7DA1, 0x7DA1, 0x2794, 0x7DA2, 0x7DA2, 0x1066,
+ 0x7DA3, 0x7DA3, 0x2781, 0x7DA4, 0x7DA4, 0x46D7, 0x7DA6, 0x7DA6, 0x2791,
+ 0x7DA7, 0x7DA7, 0x277E, 0x7DA8, 0x7DA8, 0x3C9C, 0x7DA9, 0x7DA9, 0x2793,
+ 0x7DAA, 0x7DAA, 0x2782, 0x7DAB, 0x7DAB, 0x376C, 0x7DAC, 0x7DAC, 0x106D,
+ 0x7DAD, 0x7DAD, 0x106A, 0x7DAE, 0x7DAE, 0x2792, 0x7DAF, 0x7DAF, 0x278C,
+ 0x7DB0, 0x7DB0, 0x105C, 0x7DB1, 0x7DB1, 0x1064, 0x7DB2, 0x7DB2, 0x1063,
+ 0x7DB3, 0x7DB3, 0x376E, 0x7DB4, 0x7DB4, 0x1062, 0x7DB5, 0x7DB5, 0x1068,
+ 0x7DB7, 0x7DB7, 0x277F, 0x7DB8, 0x7DB8, 0x1069, 0x7DB9, 0x7DB9, 0x278D,
+ 0x7DBA, 0x7DBA, 0x1065, 0x7DBB, 0x7DBB, 0x105B, 0x7DBC, 0x7DBC, 0x278F,
+ 0x7DBD, 0x7DBE, 0x105E, 0x7DBF, 0x7DBF, 0x1067, 0x7DC0, 0x7DC0, 0x2784,
+ 0x7DC1, 0x7DC1, 0x2783, 0x7DC2, 0x7DC2, 0x2780, 0x7DC4, 0x7DC4, 0x2788,
+ 0x7DC5, 0x7DC5, 0x2785, 0x7DC6, 0x7DC6, 0x2789, 0x7DC7, 0x7DC7, 0x106C,
+ 0x7DC9, 0x7DC9, 0x2795, 0x7DCA, 0x7DCA, 0x1061, 0x7DCB, 0x7DCC, 0x278A,
+ 0x7DCD, 0x7DCD, 0x456E, 0x7DCE, 0x7DCE, 0x2787, 0x7DCF, 0x7DCF, 0x4735,
+ 0x7DD0, 0x7DD0, 0x4737, 0x7DD2, 0x7DD2, 0x106B, 0x7DD3, 0x7DD3, 0x3B4E,
+ 0x7DD4, 0x7DD4, 0x4736, 0x7DD6, 0x7DD6, 0x376F, 0x7DD7, 0x7DD7, 0x29B8,
+ 0x7DD8, 0x7DD8, 0x11D9, 0x7DD9, 0x7DD9, 0x11E2, 0x7DDA, 0x7DDA, 0x11DE,
+ 0x7DDB, 0x7DDB, 0x29B5, 0x7DDC, 0x7DDC, 0x3B4C, 0x7DDD, 0x7DDD, 0x11DB,
+ 0x7DDE, 0x7DDE, 0x11DF, 0x7DDF, 0x7DDF, 0x29C1, 0x7DE0, 0x7DE0, 0x11D5,
+ 0x7DE1, 0x7DE1, 0x29B9, 0x7DE3, 0x7DE3, 0x11DD, 0x7DE4, 0x7DE4, 0x3772,
+ 0x7DE5, 0x7DE5, 0x3776, 0x7DE6, 0x7DE6, 0x29BC, 0x7DE7, 0x7DE7, 0x29B7,
+ 0x7DE8, 0x7DE8, 0x11DC, 0x7DE9, 0x7DE9, 0x11E0, 0x7DEA, 0x7DEA, 0x29B6,
+ 0x7DEC, 0x7DEC, 0x11DA, 0x7DEE, 0x7DEE, 0x29C0, 0x7DEF, 0x7DEF, 0x11D7,
+ 0x7DF0, 0x7DF0, 0x29BF, 0x7DF1, 0x7DF1, 0x29BE, 0x7DF2, 0x7DF2, 0x11E3,
+ 0x7DF3, 0x7DF3, 0x28C8, 0x7DF4, 0x7DF4, 0x11D6, 0x7DF5, 0x7DF5, 0x3774,
+ 0x7DF6, 0x7DF6, 0x29BD, 0x7DF7, 0x7DF7, 0x29B4, 0x7DF9, 0x7DF9, 0x11E4,
+ 0x7DFA, 0x7DFA, 0x29BB, 0x7DFB, 0x7DFB, 0x11D8, 0x7DFD, 0x7DFD, 0x4738,
+ 0x7DFE, 0x7DFE, 0x3CCF, 0x7E03, 0x7E03, 0x29BA, 0x7E07, 0x7E07, 0x3B4D,
+ 0x7E08, 0x7E08, 0x1322, 0x7E09, 0x7E09, 0x1327, 0x7E0A, 0x7E0A, 0x1320,
+ 0x7E0B, 0x7E0B, 0x2C1F, 0x7E0C, 0x7E0C, 0x2C16, 0x7E0D, 0x7E0D, 0x2C22,
+ 0x7E0E, 0x7E0E, 0x2C1A, 0x7E0F, 0x7E0F, 0x2C20, 0x7E10, 0x7E10, 0x1328,
+ 0x7E11, 0x7E11, 0x1321, 0x7E12, 0x7E12, 0x2C13, 0x7E13, 0x7E13, 0x2C19,
+ 0x7E14, 0x7E14, 0x2C23, 0x7E15, 0x7E15, 0x2C1C, 0x7E16, 0x7E16, 0x2C21,
+ 0x7E17, 0x7E17, 0x2C15, 0x7E1A, 0x7E1A, 0x2C1D, 0x7E1B, 0x7E1B, 0x1323,
+ 0x7E1C, 0x7E1C, 0x2C1B, 0x7E1D, 0x7E1D, 0x1326, 0x7E1E, 0x7E1E, 0x1325,
+ 0x7E1F, 0x7E20, 0x2C17, 0x7E21, 0x7E21, 0x2C14, 0x7E22, 0x7E22, 0x2C1E,
+ 0x7E23, 0x7E23, 0x1324, 0x7E24, 0x7E24, 0x2C25, 0x7E25, 0x7E25, 0x2C24,
+ 0x7E27, 0x7E27, 0x377F, 0x7E29, 0x7E29, 0x2DF8, 0x7E2A, 0x7E2A, 0x2DF4,
+ 0x7E2B, 0x7E2B, 0x143B, 0x7E2D, 0x7E2D, 0x2DEE, 0x7E2E, 0x7E2E, 0x1435,
+ 0x7E2F, 0x7E2F, 0x1445, 0x7E30, 0x7E30, 0x2DFA, 0x7E31, 0x7E31, 0x143D,
+ 0x7E32, 0x7E32, 0x1439, 0x7E33, 0x7E33, 0x2DF1, 0x7E34, 0x7E34, 0x1440,
+ 0x7E35, 0x7E35, 0x1443, 0x7E36, 0x7E36, 0x2DFC, 0x7E37, 0x7E37, 0x1438,
+ 0x7E38, 0x7E38, 0x2DF3, 0x7E39, 0x7E39, 0x1441, 0x7E3A, 0x7E3A, 0x2DFE,
+ 0x7E3B, 0x7E3B, 0x2DFB, 0x7E3C, 0x7E3C, 0x2DEF, 0x7E3D, 0x7E3D, 0x143C,
+ 0x7E3E, 0x7E3E, 0x1436, 0x7E3F, 0x7E3F, 0x1444, 0x7E40, 0x7E40, 0x2DF6,
+ 0x7E41, 0x7E41, 0x143F, 0x7E42, 0x7E42, 0x2DF0, 0x7E43, 0x7E43, 0x143A,
+ 0x7E44, 0x7E44, 0x2DFD, 0x7E45, 0x7E45, 0x143E, 0x7E46, 0x7E46, 0x1437,
+ 0x7E47, 0x7E47, 0x2DF7, 0x7E48, 0x7E48, 0x1442, 0x7E49, 0x7E49, 0x2DF5,
+ 0x7E4C, 0x7E4C, 0x2DF9, 0x7E50, 0x7E50, 0x2F83, 0x7E51, 0x7E51, 0x2F89,
+ 0x7E52, 0x7E52, 0x1511, 0x7E53, 0x7E53, 0x2F8C, 0x7E54, 0x7E55, 0x150C,
+ 0x7E56, 0x7E56, 0x2F84, 0x7E57, 0x7E57, 0x2F8B, 0x7E58, 0x7E58, 0x2F86,
+ 0x7E59, 0x7E59, 0x1512, 0x7E5A, 0x7E5A, 0x150F, 0x7E5C, 0x7E5C, 0x2F82,
+ 0x7E5E, 0x7E5E, 0x150E, 0x7E5F, 0x7E5F, 0x2F88, 0x7E60, 0x7E60, 0x2F8A,
+ 0x7E61, 0x7E61, 0x1510, 0x7E62, 0x7E62, 0x2F87, 0x7E63, 0x7E63, 0x2F85,
+ 0x7E65, 0x7E65, 0x46D2, 0x7E67, 0x7E67, 0x3766, 0x7E68, 0x7E68, 0x30E3,
+ 0x7E69, 0x7E6A, 0x15AC, 0x7E6B, 0x7E6B, 0x15A9, 0x7E6D, 0x7E6D, 0x15AA,
+ 0x7E6E, 0x7E6E, 0x377B, 0x7E6F, 0x7E6F, 0x30DF, 0x7E70, 0x7E70, 0x30DD,
+ 0x7E72, 0x7E72, 0x30E1, 0x7E73, 0x7E73, 0x15AE, 0x7E74, 0x7E74, 0x30E2,
+ 0x7E75, 0x7E75, 0x30DB, 0x7E76, 0x7E76, 0x30DA, 0x7E77, 0x7E77, 0x30DE,
+ 0x7E78, 0x7E78, 0x30DC, 0x7E79, 0x7E79, 0x15AB, 0x7E7A, 0x7E7A, 0x30E0,
+ 0x7E7B, 0x7E7B, 0x3214, 0x7E7C, 0x7E7C, 0x1631, 0x7E7D, 0x7E7D, 0x1630,
+ 0x7E7E, 0x7E7E, 0x3215, 0x7E7F, 0x7E7F, 0x3E51, 0x7E80, 0x7E80, 0x3217,
+ 0x7E81, 0x7E81, 0x3216, 0x7E82, 0x7E82, 0x1632, 0x7E86, 0x7E86, 0x32F0,
+ 0x7E87, 0x7E88, 0x32ED, 0x7E8A, 0x7E8A, 0x32EC, 0x7E8B, 0x7E8B, 0x32EF,
+ 0x7E8C, 0x7E8C, 0x1683, 0x7E8D, 0x7E8D, 0x32F1, 0x7E8E, 0x7E8E, 0x3EC9,
+ 0x7E8F, 0x7E8F, 0x1682, 0x7E91, 0x7E91, 0x33A2, 0x7E92, 0x7E92, 0x469E,
+ 0x7E93, 0x7E93, 0x1703, 0x7E94, 0x7E94, 0x1705, 0x7E95, 0x7E95, 0x342C,
+ 0x7E96, 0x7E96, 0x1704, 0x7E97, 0x7E97, 0x3494, 0x7E98, 0x7E98, 0x34DA,
+ 0x7E99, 0x7E99, 0x34DC, 0x7E9A, 0x7E9A, 0x34D9, 0x7E9B, 0x7E9B, 0x34DB,
+ 0x7E9C, 0x7E9C, 0x1759, 0x7E9F, 0x7E9F, 0x48BB, 0x7EA4, 0x7EA4, 0x455B,
+ 0x7EAC, 0x7EAC, 0x455C, 0x7EBA, 0x7EBA, 0x455D, 0x7EC7, 0x7EC7, 0x455E,
+ 0x7ECF, 0x7ECF, 0x455F, 0x7EDF, 0x7EDF, 0x4560, 0x7F06, 0x7F06, 0x4561,
+ 0x7F36, 0x7F36, 0x03F9, 0x7F37, 0x7F37, 0x4562, 0x7F38, 0x7F38, 0x07D4,
+ 0x7F39, 0x7F39, 0x1D1F, 0x7F3A, 0x7F3A, 0x0979, 0x7F3D, 0x7F3D, 0x0B61,
+ 0x7F3E, 0x7F3F, 0x2271, 0x7F40, 0x7F41, 0x3780, 0x7F43, 0x7F43, 0x2C26,
+ 0x7F44, 0x7F44, 0x1446, 0x7F45, 0x7F45, 0x2DFF, 0x7F47, 0x7F47, 0x3782,
+ 0x7F48, 0x7F48, 0x1513, 0x7F49, 0x7F49, 0x3E69, 0x7F4A, 0x7F4A, 0x30E5,
+ 0x7F4B, 0x7F4B, 0x30E4, 0x7F4C, 0x7F4C, 0x1633, 0x7F4D, 0x7F4D, 0x32F2,
+ 0x7F4E, 0x7F4E, 0x3B4F, 0x7F4F, 0x7F4F, 0x33A3, 0x7F50, 0x7F50, 0x1726,
+ 0x7F51, 0x7F51, 0x1812, 0x7F52, 0x7F52, 0x44F6, 0x7F53, 0x7F53, 0x44F9,
+ 0x7F54, 0x7F54, 0x0668, 0x7F55, 0x7F55, 0x04FC, 0x7F58, 0x7F58, 0x1BC3,
+ 0x7F5B, 0x7F5B, 0x1DAD, 0x7F5C, 0x7F5C, 0x1DA8, 0x7F5D, 0x7F5D, 0x1DAC,
+ 0x7F5E, 0x7F5E, 0x1DAA, 0x7F5F, 0x7F5F, 0x097A, 0x7F60, 0x7F60, 0x1DAB,
+ 0x7F61, 0x7F61, 0x1DA9, 0x7F63, 0x7F63, 0x1FF3, 0x7F65, 0x7F66, 0x2273,
+ 0x7F67, 0x7F68, 0x2511, 0x7F69, 0x7F6A, 0x0EC5, 0x7F6B, 0x7F6B, 0x2510,
+ 0x7F6C, 0x7F6C, 0x2513, 0x7F6D, 0x7F6D, 0x250F, 0x7F6E, 0x7F6E, 0x0EC4,
+ 0x7F70, 0x7F70, 0x106E, 0x7F71, 0x7F71, 0x4007, 0x7F72, 0x7F72, 0x0EC7,
+ 0x7F73, 0x7F73, 0x2796, 0x7F75, 0x7F75, 0x11E5, 0x7F76, 0x7F76, 0x29C2,
+ 0x7F77, 0x7F77, 0x11E6, 0x7F78, 0x7F78, 0x3F7B, 0x7F79, 0x7F79, 0x1329,
+ 0x7F7A, 0x7F7A, 0x2C29, 0x7F7B, 0x7F7C, 0x2C27, 0x7F7D, 0x7F7D, 0x2E02,
+ 0x7F7E, 0x7F7E, 0x2E01, 0x7F7F, 0x7F7F, 0x2E00, 0x7F83, 0x7F83, 0x30E6,
+ 0x7F85, 0x7F85, 0x15AF, 0x7F86, 0x7F86, 0x30E7, 0x7F87, 0x7F87, 0x33A4,
+ 0x7F88, 0x7F88, 0x1727, 0x7F89, 0x7F89, 0x3495, 0x7F8A, 0x7F8A, 0x03FA,
+ 0x7F8B, 0x7F8B, 0x066A, 0x7F8C, 0x7F8C, 0x0669, 0x7F8D, 0x7F8D, 0x1BC5,
+ 0x7F8E, 0x7F8E, 0x07D5, 0x7F8F, 0x7F8F, 0x421C, 0x7F91, 0x7F91, 0x1BC4,
+ 0x7F92, 0x7F92, 0x1DAF, 0x7F93, 0x7F93, 0x43DB, 0x7F94, 0x7F94, 0x097B,
+ 0x7F95, 0x7F95, 0x1FF4, 0x7F96, 0x7F96, 0x1DAE, 0x7F97, 0x7F97, 0x3786,
+ 0x7F9A, 0x7F9A, 0x0B63, 0x7F9B, 0x7F9B, 0x1FF7, 0x7F9C, 0x7F9D, 0x1FF5,
+ 0x7F9E, 0x7F9E, 0x0B62, 0x7FA0, 0x7FA1, 0x2276, 0x7FA2, 0x7FA2, 0x2275,
+ 0x7FA3, 0x7FA3, 0x3788, 0x7FA4, 0x7FA4, 0x0ECA, 0x7FA5, 0x7FA5, 0x2515,
+ 0x7FA6, 0x7FA6, 0x2514, 0x7FA7, 0x7FA7, 0x2516, 0x7FA8, 0x7FA8, 0x0EC9,
+ 0x7FA9, 0x7FA9, 0x0EC8, 0x7FAC, 0x7FAC, 0x29C3, 0x7FAD, 0x7FAD, 0x29C5,
+ 0x7FAE, 0x7FAE, 0x43DC, 0x7FAF, 0x7FAF, 0x11E7, 0x7FB0, 0x7FB0, 0x29C4,
+ 0x7FB1, 0x7FB1, 0x2C2A, 0x7FB2, 0x7FB2, 0x132A, 0x7FB3, 0x7FB3, 0x2F8E,
+ 0x7FB4, 0x7FB4, 0x4739, 0x7FB5, 0x7FB5, 0x2F8D, 0x7FB6, 0x7FB6, 0x15B0,
+ 0x7FB7, 0x7FB7, 0x30E8, 0x7FB8, 0x7FB8, 0x15B2, 0x7FB9, 0x7FB9, 0x15B1,
+ 0x7FBA, 0x7FBA, 0x3218, 0x7FBB, 0x7FBB, 0x32F3, 0x7FBC, 0x7FBC, 0x1684,
+ 0x7FBD, 0x7FBD, 0x03FB, 0x7FBE, 0x7FBE, 0x1BC6, 0x7FBF, 0x7FBF, 0x07D6,
+ 0x7FC0, 0x7FC0, 0x1DB2, 0x7FC1, 0x7FC1, 0x097D, 0x7FC2, 0x7FC2, 0x1DB1,
+ 0x7FC3, 0x7FC3, 0x1DB0, 0x7FC5, 0x7FC5, 0x097C, 0x7FC7, 0x7FC7, 0x1FFD,
+ 0x7FC9, 0x7FC9, 0x1FFF, 0x7FCA, 0x7FCB, 0x1FF8, 0x7FCC, 0x7FCC, 0x0B64,
+ 0x7FCD, 0x7FCD, 0x1FFA, 0x7FCE, 0x7FCE, 0x0B65, 0x7FCF, 0x7FCF, 0x1FFE,
+ 0x7FD0, 0x7FD1, 0x1FFB, 0x7FD2, 0x7FD2, 0x0B66, 0x7FD4, 0x7FD5, 0x0D1C,
+ 0x7FD7, 0x7FD7, 0x2278, 0x7FDB, 0x7FDC, 0x2517, 0x7FDD, 0x7FDD, 0x3B5E,
+ 0x7FDE, 0x7FDE, 0x279A, 0x7FDF, 0x7FDF, 0x1071, 0x7FE0, 0x7FE1, 0x106F,
+ 0x7FE2, 0x7FE3, 0x2797, 0x7FE5, 0x7FE5, 0x2799, 0x7FE6, 0x7FE6, 0x29CA,
+ 0x7FE7, 0x7FE7, 0x46E9, 0x7FE8, 0x7FE8, 0x29CB, 0x7FE9, 0x7FE9, 0x11E8,
+ 0x7FEA, 0x7FEA, 0x29C8, 0x7FEB, 0x7FEB, 0x29C7, 0x7FEC, 0x7FEC, 0x29C9,
+ 0x7FED, 0x7FED, 0x29C6, 0x7FEE, 0x7FEE, 0x132D, 0x7FEF, 0x7FEF, 0x2C2B,
+ 0x7FF0, 0x7FF1, 0x132B, 0x7FF2, 0x7FF2, 0x2E04, 0x7FF3, 0x7FF3, 0x1447,
+ 0x7FF4, 0x7FF4, 0x2E03, 0x7FF5, 0x7FF5, 0x2EFF, 0x7FF7, 0x7FF8, 0x2F8F,
+ 0x7FF9, 0x7FF9, 0x1514, 0x7FFA, 0x7FFA, 0x378E, 0x7FFB, 0x7FFB, 0x1515,
+ 0x7FFC, 0x7FFC, 0x1448, 0x7FFD, 0x7FFE, 0x30E9, 0x7FFF, 0x7FFF, 0x3219,
+ 0x8000, 0x8000, 0x1634, 0x8001, 0x8001, 0x03FC, 0x8002, 0x8002, 0x44FD,
+ 0x8003, 0x8003, 0x03FD, 0x8004, 0x8004, 0x097F, 0x8005, 0x8005, 0x066B,
+ 0x8006, 0x8006, 0x097E, 0x8007, 0x8007, 0x1BC7, 0x8008, 0x8008, 0x3791,
+ 0x800B, 0x800B, 0x0D1E, 0x800C, 0x800C, 0x03FE, 0x800D, 0x800D, 0x07D8,
+ 0x800E, 0x800F, 0x1BC8, 0x8010, 0x8010, 0x07D7, 0x8011, 0x8011, 0x07D9,
+ 0x8012, 0x8012, 0x03FF, 0x8014, 0x8014, 0x1BCA, 0x8015, 0x8015, 0x0981,
+ 0x8016, 0x8016, 0x1DB3, 0x8017, 0x8017, 0x0983, 0x8018, 0x8018, 0x0980,
+ 0x8019, 0x8019, 0x0982, 0x801B, 0x801B, 0x2002, 0x801C, 0x801C, 0x0B67,
+ 0x801D, 0x801D, 0x3792, 0x801E, 0x801E, 0x2001, 0x801F, 0x801F, 0x2000,
+ 0x8020, 0x8020, 0x473C, 0x8021, 0x8021, 0x2519, 0x8024, 0x8024, 0x279B,
+ 0x8025, 0x8025, 0x473D, 0x8026, 0x8026, 0x11E9, 0x8028, 0x8028, 0x132E,
+ 0x8029, 0x8029, 0x2C2D, 0x802A, 0x802A, 0x2C2C, 0x802C, 0x802C, 0x2E05,
+ 0x802E, 0x802E, 0x473E, 0x802F, 0x802F, 0x3794, 0x8030, 0x8030, 0x32F4,
+ 0x8031, 0x8031, 0x473F, 0x8033, 0x8033, 0x0400, 0x8034, 0x8034, 0x18D8,
+ 0x8035, 0x8035, 0x1A27, 0x8036, 0x8036, 0x07DA, 0x8037, 0x8037, 0x1BCB,
+ 0x8039, 0x8039, 0x1DB5, 0x803B, 0x803C, 0x3797, 0x803D, 0x803D, 0x0984,
+ 0x803E, 0x803E, 0x1DB4, 0x803F, 0x803F, 0x0985, 0x8043, 0x8043, 0x2004,
+ 0x8046, 0x8046, 0x0B69, 0x8047, 0x8047, 0x2003, 0x8048, 0x8048, 0x2005,
+ 0x804A, 0x804A, 0x0B68, 0x804F, 0x8050, 0x227A, 0x8051, 0x8051, 0x2279,
+ 0x8052, 0x8052, 0x0D1F, 0x8054, 0x8054, 0x4740, 0x8056, 0x8056, 0x0ECB,
+ 0x8058, 0x8058, 0x0ECC, 0x805A, 0x805A, 0x1073, 0x805B, 0x805B, 0x3FE5,
+ 0x805C, 0x805C, 0x279D, 0x805D, 0x805D, 0x279C, 0x805E, 0x805E, 0x1072,
+ 0x8061, 0x8061, 0x3799, 0x8062, 0x8062, 0x3FE3, 0x8063, 0x8063, 0x3FDC,
+ 0x8064, 0x8064, 0x29CC, 0x8066, 0x8066, 0x3FDB, 0x8067, 0x8067, 0x29CD,
+ 0x806C, 0x806C, 0x2C2E, 0x806F, 0x806F, 0x144C, 0x8070, 0x8070, 0x144B,
+ 0x8071, 0x8072, 0x1449, 0x8073, 0x8073, 0x144D, 0x8075, 0x8075, 0x2F91,
+ 0x8076, 0x8076, 0x1517, 0x8077, 0x8077, 0x1516, 0x8078, 0x8078, 0x30EB,
+ 0x8079, 0x8079, 0x321A, 0x807D, 0x807D, 0x16D3, 0x807E, 0x807E, 0x16D2,
+ 0x807F, 0x807F, 0x0401, 0x8080, 0x8080, 0x44FE, 0x8082, 0x8082, 0x1CEC,
+ 0x8084, 0x8084, 0x0ECE, 0x8085, 0x8085, 0x0D20, 0x8086, 0x8086, 0x0ECD,
+ 0x8087, 0x8087, 0x1074, 0x8089, 0x8089, 0x0402, 0x808A, 0x808A, 0x17B3,
+ 0x808B, 0x808C, 0x0403, 0x808F, 0x808F, 0x1A28, 0x8090, 0x8090, 0x18DB,
+ 0x8092, 0x8092, 0x18DC, 0x8093, 0x8093, 0x04FE, 0x8095, 0x8095, 0x18D9,
+ 0x8096, 0x8096, 0x04FD, 0x8098, 0x8098, 0x0500, 0x8099, 0x8099, 0x18DA,
+ 0x809A, 0x809A, 0x0502, 0x809B, 0x809B, 0x0501, 0x809C, 0x809C, 0x18DD,
+ 0x809D, 0x809D, 0x04FF, 0x809F, 0x809F, 0x4576, 0x80A1, 0x80A1, 0x0670,
+ 0x80A2, 0x80A2, 0x066E, 0x80A3, 0x80A3, 0x1A2A, 0x80A5, 0x80A5, 0x066D,
+ 0x80A7, 0x80A7, 0x37A0, 0x80A9, 0x80A9, 0x0672, 0x80AA, 0x80AA, 0x0674,
+ 0x80AB, 0x80AB, 0x0671, 0x80AD, 0x80AD, 0x1A2D, 0x80AE, 0x80AE, 0x1A29,
+ 0x80AF, 0x80AF, 0x0675, 0x80B1, 0x80B1, 0x066F, 0x80B2, 0x80B2, 0x0503,
+ 0x80B4, 0x80B4, 0x0673, 0x80B5, 0x80B5, 0x1A2C, 0x80B6, 0x80B6, 0x3EAE,
+ 0x80B7, 0x80B7, 0x4743, 0x80B8, 0x80B8, 0x1A2B, 0x80BA, 0x80BA, 0x066C,
+ 0x80BC, 0x80BC, 0x4572, 0x80BD, 0x80BD, 0x3E7B, 0x80C2, 0x80C2, 0x1BD1,
+ 0x80C3, 0x80C4, 0x07DE, 0x80C5, 0x80C5, 0x1BD3, 0x80C6, 0x80C6, 0x3B74,
+ 0x80C7, 0x80C7, 0x1BCD, 0x80C8, 0x80C8, 0x1BD0, 0x80C9, 0x80C9, 0x1BD9,
+ 0x80CA, 0x80CA, 0x1BD7, 0x80CC, 0x80CC, 0x07E0, 0x80CD, 0x80CD, 0x1BDD,
+ 0x80CE, 0x80CE, 0x07E3, 0x80CF, 0x80CF, 0x1BDA, 0x80D0, 0x80D0, 0x1BD2,
+ 0x80D1, 0x80D1, 0x1BCF, 0x80D4, 0x80D4, 0x227D, 0x80D5, 0x80D5, 0x1BD8,
+ 0x80D6, 0x80D6, 0x07DB, 0x80D7, 0x80D7, 0x1BDB, 0x80D8, 0x80D8, 0x1BCC,
+ 0x80D9, 0x80D9, 0x1BD5, 0x80DA, 0x80DA, 0x07DD, 0x80DB, 0x80DB, 0x07E2,
+ 0x80DC, 0x80DC, 0x1BD6, 0x80DD, 0x80DD, 0x07E6, 0x80DE, 0x80DE, 0x07E4,
+ 0x80E0, 0x80E0, 0x1BCE, 0x80E1, 0x80E1, 0x07E1, 0x80E3, 0x80E3, 0x1BD4,
+ 0x80E4, 0x80E4, 0x07E5, 0x80E5, 0x80E5, 0x07DC, 0x80E6, 0x80E6, 0x1BDC,
+ 0x80E9, 0x80E9, 0x4744, 0x80EC, 0x80EC, 0x45E9, 0x80ED, 0x80ED, 0x098A,
+ 0x80EF, 0x80EF, 0x0993, 0x80F0, 0x80F0, 0x0988, 0x80F1, 0x80F1, 0x0986,
+ 0x80F2, 0x80F2, 0x1DB7, 0x80F3, 0x80F3, 0x098E, 0x80F4, 0x80F4, 0x098B,
+ 0x80F5, 0x80F5, 0x1DB9, 0x80F6, 0x80F6, 0x4574, 0x80F8, 0x80F8, 0x098D,
+ 0x80F9, 0x80F9, 0x1DB8, 0x80FA, 0x80FA, 0x1DB6, 0x80FB, 0x80FB, 0x1DBB,
+ 0x80FC, 0x80FC, 0x0992, 0x80FD, 0x80FD, 0x0990, 0x80FE, 0x80FE, 0x227C,
+ 0x8100, 0x8100, 0x1DBC, 0x8101, 0x8101, 0x1DBA, 0x8102, 0x8102, 0x0987,
+ 0x8103, 0x8103, 0x3FE7, 0x8105, 0x8105, 0x0989, 0x8106, 0x8106, 0x098C,
+ 0x8107, 0x8107, 0x37A2, 0x8108, 0x8108, 0x098F, 0x8109, 0x8109, 0x3B75,
+ 0x810A, 0x810A, 0x0991, 0x810C, 0x810C, 0x4746, 0x810E, 0x810E, 0x4747,
+ 0x8112, 0x8112, 0x4748, 0x8114, 0x8114, 0x4749, 0x8115, 0x8115, 0x200F,
+ 0x8116, 0x8116, 0x0B6B, 0x8117, 0x8117, 0x3E6D, 0x8118, 0x8118, 0x2006,
+ 0x8119, 0x8119, 0x2008, 0x811A, 0x811A, 0x37A3, 0x811B, 0x811B, 0x2009,
+ 0x811D, 0x811D, 0x2011, 0x811E, 0x811E, 0x200D, 0x811F, 0x811F, 0x200B,
+ 0x8121, 0x8121, 0x200E, 0x8122, 0x8122, 0x2012, 0x8123, 0x8123, 0x0B6C,
+ 0x8124, 0x8124, 0x0B70, 0x8125, 0x8125, 0x2007, 0x8127, 0x8127, 0x2010,
+ 0x8129, 0x8129, 0x0B6E, 0x812A, 0x812A, 0x3A39, 0x812B, 0x812B, 0x0B6D,
+ 0x812C, 0x812C, 0x200C, 0x812D, 0x812D, 0x200A, 0x812F, 0x812F, 0x0B6A,
+ 0x8130, 0x8130, 0x0B6F, 0x8132, 0x8132, 0x3E79, 0x8134, 0x8134, 0x45EC,
+ 0x8137, 0x8137, 0x3B72, 0x8139, 0x8139, 0x0D26, 0x813A, 0x813A, 0x2285,
+ 0x813D, 0x813D, 0x2283, 0x813E, 0x813E, 0x0D28, 0x8142, 0x8142, 0x3B76,
+ 0x8143, 0x8143, 0x227E, 0x8144, 0x8144, 0x2527, 0x8146, 0x8146, 0x0D27,
+ 0x8147, 0x8147, 0x2282, 0x8148, 0x8148, 0x3E76, 0x814A, 0x814A, 0x227F,
+ 0x814B, 0x814B, 0x0D23, 0x814C, 0x814C, 0x0D29, 0x814D, 0x814D, 0x2284,
+ 0x814E, 0x814E, 0x0D25, 0x814F, 0x814F, 0x2281, 0x8150, 0x8150, 0x1075,
+ 0x8151, 0x8151, 0x0D24, 0x8152, 0x8152, 0x2280, 0x8153, 0x8153, 0x0D2A,
+ 0x8154, 0x8154, 0x0D22, 0x8155, 0x8155, 0x0D21, 0x8156, 0x8156, 0x474C,
+ 0x8159, 0x815A, 0x474D, 0x815B, 0x815B, 0x251F, 0x815C, 0x815C, 0x251D,
+ 0x815E, 0x815E, 0x2523, 0x8160, 0x8160, 0x251B, 0x8161, 0x8161, 0x2528,
+ 0x8162, 0x8162, 0x2520, 0x8164, 0x8164, 0x251A, 0x8165, 0x8165, 0x0ED2,
+ 0x8166, 0x8166, 0x0ED8, 0x8167, 0x8167, 0x2525, 0x8169, 0x8169, 0x251E,
+ 0x816B, 0x816B, 0x0ED5, 0x816D, 0x816D, 0x43C4, 0x816E, 0x816E, 0x0ED3,
+ 0x816F, 0x816F, 0x2526, 0x8170, 0x8170, 0x0ED0, 0x8171, 0x8171, 0x0ECF,
+ 0x8172, 0x8172, 0x2521, 0x8173, 0x8173, 0x0ED4, 0x8174, 0x8174, 0x0D2B,
+ 0x8176, 0x8176, 0x2524, 0x8177, 0x8177, 0x251C, 0x8178, 0x8178, 0x0ED1,
+ 0x8179, 0x817A, 0x0ED6, 0x817C, 0x817C, 0x4750, 0x817F, 0x817F, 0x107A,
+ 0x8180, 0x8180, 0x1076, 0x8182, 0x8182, 0x107B, 0x8183, 0x8183, 0x27A0,
+ 0x8184, 0x8184, 0x43C5, 0x8186, 0x8186, 0x279F, 0x8187, 0x8187, 0x27A1,
+ 0x8188, 0x8188, 0x1078, 0x8189, 0x8189, 0x279E, 0x818A, 0x818A, 0x1079,
+ 0x818B, 0x818B, 0x27A4, 0x818C, 0x818C, 0x27A3, 0x818D, 0x818D, 0x27A2,
+ 0x818F, 0x818F, 0x1077, 0x8193, 0x8193, 0x43C6, 0x8195, 0x8195, 0x29D1,
+ 0x8197, 0x8197, 0x29D4, 0x8198, 0x8198, 0x11EF, 0x8199, 0x8199, 0x29D3,
+ 0x819A, 0x819A, 0x11EE, 0x819B, 0x819D, 0x11EA, 0x819E, 0x819E, 0x29D0,
+ 0x819F, 0x819F, 0x29CF, 0x81A0, 0x81A0, 0x11ED, 0x81A2, 0x81A2, 0x29D2,
+ 0x81A3, 0x81A3, 0x29CE, 0x81A5, 0x81A5, 0x4753, 0x81A6, 0x81A6, 0x2C30,
+ 0x81A7, 0x81A7, 0x2C3A, 0x81A8, 0x81A8, 0x1331, 0x81A9, 0x81A9, 0x1330,
+ 0x81AA, 0x81AA, 0x4364, 0x81AB, 0x81AB, 0x2C34, 0x81AC, 0x81AC, 0x2C36,
+ 0x81AE, 0x81AE, 0x2C31, 0x81B0, 0x81B0, 0x2C35, 0x81B1, 0x81B1, 0x2C2F,
+ 0x81B2, 0x81B2, 0x2C38, 0x81B3, 0x81B3, 0x132F, 0x81B4, 0x81B4, 0x2C37,
+ 0x81B5, 0x81B5, 0x2C33, 0x81B6, 0x81B6, 0x3EB2, 0x81B7, 0x81B7, 0x2C39,
+ 0x81B9, 0x81B9, 0x2C32, 0x81BA, 0x81BA, 0x1450, 0x81BB, 0x81BB, 0x2E06,
+ 0x81BC, 0x81BC, 0x2E0C, 0x81BD, 0x81BD, 0x1454, 0x81BE, 0x81BE, 0x1456,
+ 0x81BF, 0x81BF, 0x1453, 0x81C0, 0x81C0, 0x1452, 0x81C1, 0x81C1, 0x4755,
+ 0x81C2, 0x81C2, 0x1451, 0x81C3, 0x81C3, 0x144F, 0x81C4, 0x81C4, 0x2E07,
+ 0x81C5, 0x81C5, 0x2E0A, 0x81C6, 0x81C6, 0x144E, 0x81C7, 0x81C7, 0x2E0B,
+ 0x81C8, 0x81C8, 0x3FEE, 0x81C9, 0x81C9, 0x1455, 0x81CA, 0x81CA, 0x2E09,
+ 0x81CC, 0x81CC, 0x2E08, 0x81CD, 0x81CD, 0x1518, 0x81CF, 0x81CF, 0x1519,
+ 0x81D0, 0x81D0, 0x2F94, 0x81D1, 0x81D2, 0x2F92, 0x81D5, 0x81D5, 0x30ED,
+ 0x81D7, 0x81D7, 0x30EC, 0x81D8, 0x81D8, 0x15B3, 0x81D9, 0x81D9, 0x321C,
+ 0x81DA, 0x81DA, 0x1635, 0x81DB, 0x81DB, 0x321B, 0x81DD, 0x81DD, 0x32F5,
+ 0x81DE, 0x81DE, 0x33A5, 0x81DF, 0x81DF, 0x16D4, 0x81E0, 0x81E1, 0x34DD,
+ 0x81E2, 0x81E2, 0x1706, 0x81E3, 0x81E3, 0x0405, 0x81E4, 0x81E4, 0x4756,
+ 0x81E5, 0x81E5, 0x0676, 0x81E6, 0x81E6, 0x2286, 0x81E7, 0x81E7, 0x107C,
+ 0x81E8, 0x81E8, 0x1457, 0x81E9, 0x81E9, 0x2E0D, 0x81EA, 0x81EA, 0x0406,
+ 0x81EC, 0x81EC, 0x0995, 0x81ED, 0x81ED, 0x0994, 0x81EE, 0x81EE, 0x2287,
+ 0x81EF, 0x81EF, 0x42D1, 0x81F2, 0x81F2, 0x2C3B, 0x81F3, 0x81F3, 0x0407,
+ 0x81F4, 0x81F4, 0x07E7, 0x81F6, 0x81F6, 0x3D61, 0x81F7, 0x81F9, 0x2288,
+ 0x81FA, 0x81FA, 0x107D, 0x81FB, 0x81FB, 0x1332, 0x81FC, 0x81FC, 0x0408,
+ 0x81FE, 0x81FE, 0x0677, 0x81FF, 0x81FF, 0x1BDE, 0x8200, 0x8200, 0x0996,
+ 0x8201, 0x8201, 0x1DBD, 0x8202, 0x8202, 0x0B71, 0x8204, 0x8204, 0x228B,
+ 0x8205, 0x8205, 0x0ED9, 0x8207, 0x8207, 0x107E, 0x8208, 0x8208, 0x1333,
+ 0x8209, 0x8209, 0x1458, 0x820A, 0x820A, 0x151A, 0x820B, 0x820B, 0x30EE,
+ 0x820C, 0x820C, 0x0409, 0x820D, 0x820D, 0x0678, 0x8210, 0x8210, 0x0997,
+ 0x8211, 0x8211, 0x2013, 0x8212, 0x8212, 0x0D2C, 0x8214, 0x8214, 0x107F,
+ 0x8215, 0x8215, 0x27A5, 0x8216, 0x8216, 0x29D5, 0x8218, 0x8218, 0x37AA,
+ 0x821A, 0x821A, 0x3FE1, 0x821B, 0x821B, 0x040A, 0x821C, 0x821C, 0x0D2D,
+ 0x821D, 0x821D, 0x2529, 0x821E, 0x821E, 0x1080, 0x821F, 0x821F, 0x040B,
+ 0x8220, 0x8220, 0x1A2E, 0x8221, 0x8221, 0x1BDF, 0x8222, 0x8222, 0x07E8,
+ 0x8225, 0x8225, 0x1DBF, 0x8226, 0x8226, 0x420D, 0x8228, 0x8228, 0x099A,
+ 0x8229, 0x8229, 0x37B0, 0x822A, 0x822B, 0x0998, 0x822C, 0x822C, 0x099B,
+ 0x822D, 0x822D, 0x3ED0, 0x822F, 0x822F, 0x1DBE, 0x8232, 0x8232, 0x2018,
+ 0x8233, 0x8233, 0x2015, 0x8234, 0x8234, 0x2017, 0x8235, 0x8235, 0x0B72,
+ 0x8236, 0x8236, 0x0B74, 0x8237, 0x8237, 0x0B73, 0x8238, 0x8238, 0x2014,
+ 0x8239, 0x8239, 0x0B75, 0x823A, 0x823A, 0x2016, 0x823C, 0x823D, 0x228C,
+ 0x823E, 0x823E, 0x4582, 0x823F, 0x823F, 0x228E, 0x8240, 0x8240, 0x252C,
+ 0x8242, 0x8242, 0x252D, 0x8244, 0x8244, 0x252B, 0x8245, 0x8245, 0x252E,
+ 0x8247, 0x8247, 0x0EDA, 0x8249, 0x8249, 0x252A, 0x824B, 0x824B, 0x1081,
+ 0x824E, 0x824E, 0x29DA, 0x824F, 0x824F, 0x29D6, 0x8250, 0x8250, 0x29D9,
+ 0x8251, 0x8251, 0x29DB, 0x8252, 0x8252, 0x29D8, 0x8253, 0x8253, 0x29D7,
+ 0x8254, 0x8254, 0x4757, 0x8255, 0x8257, 0x2C3C, 0x8258, 0x8259, 0x1334,
+ 0x825A, 0x825A, 0x2E0F, 0x825B, 0x825B, 0x2E0E, 0x825C, 0x825C, 0x2E10,
+ 0x825E, 0x825E, 0x2F96, 0x825F, 0x825F, 0x2F95, 0x8261, 0x8261, 0x30F0,
+ 0x8262, 0x8262, 0x3B7A, 0x8263, 0x8263, 0x30F1, 0x8264, 0x8264, 0x30EF,
+ 0x8265, 0x8265, 0x3B7B, 0x8266, 0x8266, 0x1636, 0x8268, 0x8269, 0x321D,
+ 0x826B, 0x826B, 0x33A6, 0x826C, 0x826C, 0x342D, 0x826D, 0x826D, 0x3496,
+ 0x826E, 0x826E, 0x040C, 0x826F, 0x826F, 0x0504, 0x8271, 0x8271, 0x1459,
+ 0x8272, 0x8272, 0x040D, 0x8274, 0x8274, 0x2019, 0x8275, 0x8275, 0x228F,
+ 0x8276, 0x8276, 0x4759, 0x8277, 0x8277, 0x172E, 0x8278, 0x8278, 0x1813,
+ 0x8279, 0x8279, 0x4722, 0x827A, 0x827A, 0x4563, 0x827B, 0x827B, 0x37C8,
+ 0x827C, 0x827C, 0x1814, 0x827D, 0x827D, 0x1816, 0x827E, 0x827E, 0x040E,
+ 0x827F, 0x827F, 0x1817, 0x8280, 0x8280, 0x1815, 0x8283, 0x8284, 0x18E5,
+ 0x8285, 0x8285, 0x18E0, 0x8287, 0x8287, 0x4132, 0x828A, 0x828A, 0x18E4,
+ 0x828B, 0x828B, 0x0506, 0x828D, 0x828D, 0x0507, 0x828E, 0x828E, 0x18E1,
+ 0x828F, 0x828F, 0x18DF, 0x8290, 0x8290, 0x18DE, 0x8291, 0x8291, 0x18E2,
+ 0x8292, 0x8292, 0x0505, 0x8293, 0x8293, 0x18E3, 0x8294, 0x8294, 0x1BE0,
+ 0x8298, 0x8298, 0x1A33, 0x8299, 0x8299, 0x067B, 0x829A, 0x829A, 0x1A32,
+ 0x829B, 0x829B, 0x1A34, 0x829D, 0x829D, 0x067A, 0x829E, 0x829E, 0x1A39,
+ 0x829F, 0x829F, 0x067E, 0x82A0, 0x82A0, 0x1A2F, 0x82A1, 0x82A1, 0x1A3D,
+ 0x82A2, 0x82A2, 0x1A43, 0x82A3, 0x82A3, 0x0685, 0x82A4, 0x82A4, 0x1A40,
+ 0x82A5, 0x82A5, 0x0682, 0x82A6, 0x82A6, 0x3D73, 0x82A7, 0x82A7, 0x1A36,
+ 0x82A8, 0x82A8, 0x1A3C, 0x82A9, 0x82A9, 0x1A3E, 0x82AA, 0x82AA, 0x37BC,
+ 0x82AB, 0x82AB, 0x1A31, 0x82AC, 0x82AC, 0x0681, 0x82AD, 0x82AD, 0x067C,
+ 0x82AE, 0x82AE, 0x1A37, 0x82AF, 0x82AF, 0x0683, 0x82B0, 0x82B0, 0x0686,
+ 0x82B1, 0x82B1, 0x0680, 0x82B3, 0x82B3, 0x0679, 0x82B4, 0x82B4, 0x1A3B,
+ 0x82B5, 0x82B5, 0x1A35, 0x82B6, 0x82B6, 0x1A42, 0x82B7, 0x82B7, 0x0688,
+ 0x82B8, 0x82B8, 0x0684, 0x82B9, 0x82B9, 0x067F, 0x82BA, 0x82BA, 0x1A3A,
+ 0x82BB, 0x82BB, 0x099C, 0x82BC, 0x82BC, 0x1A38, 0x82BD, 0x82BD, 0x067D,
+ 0x82BE, 0x82BE, 0x0687, 0x82C0, 0x82C0, 0x1A30, 0x82C2, 0x82C2, 0x1A3F,
+ 0x82C3, 0x82C3, 0x1A41, 0x82C4, 0x82C4, 0x45E3, 0x82CA, 0x82CA, 0x475A,
+ 0x82CF, 0x82CF, 0x4564, 0x82D0, 0x82D0, 0x37C1, 0x82D1, 0x82D1, 0x07F9,
+ 0x82D2, 0x82D2, 0x07F3, 0x82D3, 0x82D3, 0x07FB, 0x82D4, 0x82D4, 0x07F8,
+ 0x82D5, 0x82D5, 0x1BE7, 0x82D6, 0x82D6, 0x1BEA, 0x82D7, 0x82D7, 0x07F4,
+ 0x82D8, 0x82D8, 0x475B, 0x82D9, 0x82D9, 0x1BE1, 0x82DB, 0x82DB, 0x07ED,
+ 0x82DC, 0x82DC, 0x07F7, 0x82DE, 0x82DE, 0x07FA, 0x82DF, 0x82DF, 0x07FC,
+ 0x82E0, 0x82E0, 0x1BF6, 0x82E1, 0x82E1, 0x1BED, 0x82E2, 0x82E2, 0x37C9,
+ 0x82E3, 0x82E3, 0x07EC, 0x82E4, 0x82E4, 0x1BF5, 0x82E5, 0x82E5, 0x07F0,
+ 0x82E6, 0x82E6, 0x07EE, 0x82E7, 0x82E7, 0x07E9, 0x82E8, 0x82E8, 0x1BE5,
+ 0x82EA, 0x82EA, 0x1BF4, 0x82EB, 0x82EB, 0x1BE9, 0x82EC, 0x82EC, 0x1BEC,
+ 0x82ED, 0x82ED, 0x1BF9, 0x82EE, 0x82EE, 0x4018, 0x82EF, 0x82EF, 0x07FD,
+ 0x82F0, 0x82F0, 0x1BF3, 0x82F1, 0x82F1, 0x07F5, 0x82F2, 0x82F2, 0x1BEE,
+ 0x82F3, 0x82F3, 0x1BF8, 0x82F4, 0x82F4, 0x1BEB, 0x82F5, 0x82F5, 0x1BEF,
+ 0x82F6, 0x82F6, 0x1BF2, 0x82F7, 0x82F7, 0x3E77, 0x82F9, 0x82F9, 0x1BE3,
+ 0x82FA, 0x82FA, 0x1BF7, 0x82FB, 0x82FB, 0x1BF1, 0x82FC, 0x82FC, 0x412D,
+ 0x82FD, 0x82FD, 0x3D92, 0x82FE, 0x82FE, 0x1BE2, 0x82FF, 0x82FF, 0x43DE,
+ 0x8300, 0x8300, 0x1BE6, 0x8301, 0x8301, 0x07F6, 0x8302, 0x8302, 0x07F1,
+ 0x8303, 0x8303, 0x07EA, 0x8304, 0x8304, 0x07EF, 0x8305, 0x8305, 0x07EB,
+ 0x8306, 0x8306, 0x07FE, 0x8307, 0x8307, 0x1BE4, 0x8308, 0x8308, 0x1DD0,
+ 0x8309, 0x8309, 0x07F2, 0x830B, 0x830B, 0x3EB6, 0x830C, 0x830C, 0x1BF0,
+ 0x830D, 0x830D, 0x1A7D, 0x8316, 0x8316, 0x1DD3, 0x8317, 0x8317, 0x09AA,
+ 0x8318, 0x8318, 0x37CA, 0x8319, 0x8319, 0x1DC3, 0x831A, 0x831A, 0x37C2,
+ 0x831B, 0x831B, 0x1DCE, 0x831C, 0x831C, 0x1DCA, 0x831D, 0x831D, 0x37D1,
+ 0x831E, 0x831E, 0x1DDD, 0x8320, 0x8320, 0x1DD5, 0x8322, 0x8322, 0x1DCB,
+ 0x8324, 0x8324, 0x1DD4, 0x8325, 0x8325, 0x1DC5, 0x8326, 0x8326, 0x1DC9,
+ 0x8327, 0x8327, 0x1DE0, 0x8328, 0x8328, 0x09AD, 0x8329, 0x8329, 0x1DD8,
+ 0x832A, 0x832A, 0x1DCF, 0x832B, 0x832B, 0x099D, 0x832C, 0x832C, 0x1DDE,
+ 0x832D, 0x832D, 0x1DC1, 0x832F, 0x832F, 0x1DD7, 0x8331, 0x8331, 0x09AC,
+ 0x8332, 0x8332, 0x09A7, 0x8333, 0x8333, 0x1DC0, 0x8334, 0x8334, 0x09A5,
+ 0x8335, 0x8335, 0x09A4, 0x8336, 0x8336, 0x09A9, 0x8337, 0x8337, 0x1DD6,
+ 0x8338, 0x8338, 0x09A1, 0x8339, 0x8339, 0x09A8, 0x833A, 0x833A, 0x1BE8,
+ 0x833B, 0x833B, 0x2290, 0x833C, 0x833C, 0x1DD1, 0x833D, 0x833D, 0x3D2A,
+ 0x833F, 0x833F, 0x1DC7, 0x8340, 0x8340, 0x09AB, 0x8341, 0x8341, 0x1DC8,
+ 0x8342, 0x8342, 0x1DCC, 0x8343, 0x8343, 0x09AE, 0x8344, 0x8344, 0x1DC2,
+ 0x8345, 0x8345, 0x1DDA, 0x8347, 0x8347, 0x1DD9, 0x8348, 0x8348, 0x1DE1,
+ 0x8349, 0x8349, 0x09A3, 0x834A, 0x834A, 0x09A0, 0x834B, 0x834B, 0x1DDF,
+ 0x834C, 0x834C, 0x1DDB, 0x834D, 0x834D, 0x1DD2, 0x834E, 0x834E, 0x1DCD,
+ 0x834F, 0x834F, 0x09A6, 0x8350, 0x8350, 0x09A2, 0x8351, 0x8351, 0x1DC4,
+ 0x8352, 0x8352, 0x099E, 0x8353, 0x8353, 0x1DDC, 0x8354, 0x8354, 0x099F,
+ 0x8356, 0x8356, 0x1DC6, 0x8357, 0x8357, 0x475D, 0x8362, 0x8362, 0x37B6,
+ 0x8363, 0x8363, 0x41EB, 0x8366, 0x8366, 0x3E1E, 0x836F, 0x836F, 0x4565,
+ 0x8373, 0x8373, 0x201F, 0x8374, 0x8374, 0x2021, 0x8375, 0x8375, 0x2026,
+ 0x8376, 0x8376, 0x203A, 0x8377, 0x8377, 0x0B83, 0x8378, 0x8378, 0x0B79,
+ 0x837A, 0x837A, 0x201E, 0x837B, 0x837C, 0x0B84, 0x837D, 0x837D, 0x2029,
+ 0x837E, 0x837E, 0x2030, 0x837F, 0x837F, 0x2036, 0x8381, 0x8381, 0x2023,
+ 0x8383, 0x8383, 0x202A, 0x8385, 0x8385, 0x37D3, 0x8386, 0x8386, 0x0B86,
+ 0x8387, 0x8387, 0x2038, 0x8388, 0x8388, 0x2033, 0x8389, 0x8389, 0x0B81,
+ 0x838A, 0x838A, 0x0B7F, 0x838B, 0x838B, 0x202F, 0x838C, 0x838C, 0x202B,
+ 0x838D, 0x838D, 0x201D, 0x838E, 0x838E, 0x0B76, 0x838F, 0x838F, 0x2022,
+ 0x8390, 0x8390, 0x201A, 0x8391, 0x8391, 0x37EC, 0x8392, 0x8392, 0x0B7E,
+ 0x8393, 0x8393, 0x0B80, 0x8394, 0x8394, 0x2027, 0x8395, 0x8395, 0x2024,
+ 0x8396, 0x8396, 0x0B7B, 0x8397, 0x8397, 0x2034, 0x8398, 0x8398, 0x0B78,
+ 0x8399, 0x8399, 0x2025, 0x839A, 0x839A, 0x22B9, 0x839B, 0x839B, 0x202D,
+ 0x839C, 0x839C, 0x374D, 0x839D, 0x839D, 0x202C, 0x839E, 0x839E, 0x0B77,
+ 0x83A0, 0x83A0, 0x0B82, 0x83A2, 0x83A2, 0x0B7A, 0x83A3, 0x83A3, 0x201B,
+ 0x83A4, 0x83A4, 0x2020, 0x83A5, 0x83A5, 0x2031, 0x83A6, 0x83A6, 0x2037,
+ 0x83A7, 0x83A7, 0x0B87, 0x83A8, 0x83A8, 0x201C, 0x83A9, 0x83A9, 0x2028,
+ 0x83AA, 0x83AA, 0x202E, 0x83AB, 0x83AB, 0x0B7D, 0x83AC, 0x83AC, 0x37D6,
+ 0x83AE, 0x83AE, 0x2039, 0x83AF, 0x83AF, 0x2032, 0x83B0, 0x83B0, 0x2035,
+ 0x83B9, 0x83B9, 0x42A7, 0x83BD, 0x83BD, 0x0B7C, 0x83BE, 0x83BE, 0x3F59,
+ 0x83BF, 0x83BF, 0x22A0, 0x83C0, 0x83C0, 0x2294, 0x83C1, 0x83C1, 0x0D35,
+ 0x83C2, 0x83C2, 0x22B1, 0x83C3, 0x83C3, 0x22BA, 0x83C4, 0x83C4, 0x22BD,
+ 0x83C5, 0x83C5, 0x0D33, 0x83C6, 0x83C6, 0x229C, 0x83C7, 0x83C7, 0x22B5,
+ 0x83C8, 0x83C8, 0x229D, 0x83C9, 0x83C9, 0x22AB, 0x83CA, 0x83CA, 0x0D40,
+ 0x83CB, 0x83CB, 0x22A7, 0x83CC, 0x83CC, 0x0D3D, 0x83CD, 0x83CD, 0x4055,
+ 0x83CE, 0x83CE, 0x22A8, 0x83CF, 0x83CF, 0x2291, 0x83D1, 0x83D1, 0x22B6,
+ 0x83D3, 0x83D3, 0x37D8, 0x83D4, 0x83D4, 0x0D46, 0x83D5, 0x83D5, 0x22B3,
+ 0x83D6, 0x83D6, 0x22A9, 0x83D7, 0x83D7, 0x22BF, 0x83D8, 0x83D8, 0x22A4,
+ 0x83D9, 0x83D9, 0x254E, 0x83DB, 0x83DB, 0x22C2, 0x83DC, 0x83DC, 0x0D44,
+ 0x83DD, 0x83DD, 0x22A2, 0x83DE, 0x83DE, 0x22AE, 0x83DF, 0x83DF, 0x0D47,
+ 0x83E0, 0x83E0, 0x0D32, 0x83E1, 0x83E1, 0x22A6, 0x83E2, 0x83E2, 0x22C0,
+ 0x83E3, 0x83E3, 0x229F, 0x83E4, 0x83E4, 0x2298, 0x83E5, 0x83E5, 0x22A3,
+ 0x83E7, 0x83E7, 0x2297, 0x83E8, 0x83E8, 0x2295, 0x83E9, 0x83E9, 0x0D2E,
+ 0x83EA, 0x83EA, 0x22B7, 0x83EB, 0x83EB, 0x229E, 0x83EC, 0x83EC, 0x22BB,
+ 0x83ED, 0x83ED, 0x3D2C, 0x83EE, 0x83EE, 0x22BC, 0x83EF, 0x83EF, 0x0D36,
+ 0x83F0, 0x83F0, 0x0D3B, 0x83F1, 0x83F1, 0x0D37, 0x83F2, 0x83F2, 0x0D3F,
+ 0x83F3, 0x83F3, 0x22B2, 0x83F4, 0x83F4, 0x0D38, 0x83F5, 0x83F5, 0x22AA,
+ 0x83F6, 0x83F6, 0x229A, 0x83F8, 0x83F8, 0x0D30, 0x83F9, 0x83F9, 0x2292,
+ 0x83FA, 0x83FA, 0x22B4, 0x83FB, 0x83FB, 0x22BE, 0x83FC, 0x83FC, 0x2299,
+ 0x83FD, 0x83FD, 0x0D3E, 0x83FE, 0x83FE, 0x22C3, 0x83FF, 0x83FF, 0x22A5,
+ 0x8401, 0x8401, 0x22A1, 0x8403, 0x8403, 0x0D2F, 0x8404, 0x8404, 0x0D43,
+ 0x8405, 0x8405, 0x475F, 0x8406, 0x8406, 0x22B0, 0x8407, 0x8407, 0x0D45,
+ 0x8409, 0x8409, 0x22AC, 0x840A, 0x840A, 0x0D3A, 0x840B, 0x840B, 0x0D34,
+ 0x840C, 0x840C, 0x0D3C, 0x840D, 0x840D, 0x0D31, 0x840E, 0x840E, 0x0D42,
+ 0x840F, 0x840F, 0x22AD, 0x8410, 0x8410, 0x229B, 0x8411, 0x8411, 0x22AF,
+ 0x8412, 0x8412, 0x2296, 0x8413, 0x8413, 0x22B8, 0x8414, 0x8414, 0x3C10,
+ 0x8416, 0x8416, 0x4037, 0x8418, 0x8418, 0x3E7A, 0x841B, 0x841B, 0x22C1,
+ 0x841C, 0x841C, 0x3EB3, 0x8420, 0x8420, 0x3C55, 0x8421, 0x8421, 0x3751,
+ 0x8423, 0x8423, 0x2293, 0x8424, 0x8424, 0x4951, 0x8426, 0x8426, 0x46D8,
+ 0x8429, 0x8429, 0x254D, 0x842B, 0x842B, 0x2563, 0x842C, 0x842C, 0x0EAC,
+ 0x842D, 0x842D, 0x2552, 0x842E, 0x842E, 0x422D, 0x842F, 0x842F, 0x2550,
+ 0x8430, 0x8430, 0x253B, 0x8431, 0x8431, 0x0EDE, 0x8432, 0x8432, 0x254B,
+ 0x8433, 0x8433, 0x255F, 0x8434, 0x8434, 0x2547, 0x8435, 0x8435, 0x0EE6,
+ 0x8436, 0x8436, 0x255E, 0x8437, 0x8437, 0x2545, 0x8438, 0x8438, 0x0D41,
+ 0x8439, 0x8439, 0x2555, 0x843A, 0x843A, 0x2546, 0x843B, 0x843B, 0x255C,
+ 0x843C, 0x843C, 0x0EE5, 0x843D, 0x843D, 0x0EDD, 0x843E, 0x843E, 0x3D21,
+ 0x843F, 0x843F, 0x2530, 0x8440, 0x8440, 0x2538, 0x8442, 0x8442, 0x2551,
+ 0x8443, 0x8443, 0x2549, 0x8444, 0x8444, 0x2562, 0x8445, 0x8445, 0x254C,
+ 0x8446, 0x8446, 0x0EEB, 0x8447, 0x8447, 0x255D, 0x8448, 0x8448, 0x4718,
+ 0x8449, 0x8449, 0x0EE2, 0x844A, 0x844A, 0x37E4, 0x844B, 0x844B, 0x254F,
+ 0x844C, 0x844C, 0x2557, 0x844D, 0x844D, 0x253C, 0x844E, 0x844E, 0x2556,
+ 0x8450, 0x8450, 0x2567, 0x8451, 0x8451, 0x2537, 0x8452, 0x8452, 0x2558,
+ 0x8453, 0x8453, 0x3B7D, 0x8454, 0x8454, 0x2565, 0x8455, 0x8455, 0x398B,
+ 0x8456, 0x8456, 0x2531, 0x8457, 0x8457, 0x0D39, 0x8458, 0x8458, 0x37DE,
+ 0x8459, 0x8459, 0x253F, 0x845A, 0x845A, 0x253E, 0x845B, 0x845B, 0x0EE4,
+ 0x845C, 0x845C, 0x3EDB, 0x845D, 0x845D, 0x2542, 0x845E, 0x845E, 0x2544,
+ 0x845F, 0x845F, 0x2553, 0x8460, 0x8460, 0x2564, 0x8461, 0x8461, 0x0EE7,
+ 0x8462, 0x8462, 0x42DA, 0x8463, 0x8463, 0x0EE8, 0x8464, 0x8464, 0x4761,
+ 0x8465, 0x8465, 0x2536, 0x8466, 0x8466, 0x0EE0, 0x8467, 0x8467, 0x253A,
+ 0x8468, 0x8468, 0x2560, 0x8469, 0x8469, 0x0EE9, 0x846B, 0x846B, 0x0EE1,
+ 0x846C, 0x846C, 0x0EE3, 0x846D, 0x846D, 0x0EEA, 0x846E, 0x846E, 0x2566,
+ 0x846F, 0x846F, 0x2559, 0x8470, 0x8470, 0x2554, 0x8471, 0x8471, 0x37E0,
+ 0x8472, 0x8472, 0x3C93, 0x8473, 0x8473, 0x2541, 0x8474, 0x8474, 0x2540,
+ 0x8475, 0x8475, 0x0EDF, 0x8476, 0x8476, 0x2532, 0x8477, 0x8477, 0x0EDC,
+ 0x8478, 0x8478, 0x254A, 0x8479, 0x8479, 0x2533, 0x847A, 0x847A, 0x2548,
+ 0x847D, 0x847D, 0x253D, 0x847E, 0x847E, 0x2561, 0x847F, 0x847F, 0x394E,
+ 0x8480, 0x8480, 0x3B6E, 0x8482, 0x8482, 0x0EDB, 0x8486, 0x8486, 0x2539,
+ 0x8488, 0x8488, 0x4762, 0x848D, 0x848D, 0x2535, 0x848E, 0x848E, 0x255B,
+ 0x848F, 0x848F, 0x2534, 0x8490, 0x8490, 0x108E, 0x8491, 0x8491, 0x27CD,
+ 0x8492, 0x8492, 0x3756, 0x8493, 0x8493, 0x37EE, 0x8494, 0x8494, 0x27BC,
+ 0x8496, 0x8496, 0x3B1D, 0x8497, 0x8497, 0x27A6, 0x8498, 0x8498, 0x27C4,
+ 0x8499, 0x8499, 0x1086, 0x849A, 0x849A, 0x27B5, 0x849B, 0x849B, 0x27BF,
+ 0x849C, 0x849C, 0x1089, 0x849D, 0x849D, 0x27B8, 0x849E, 0x849E, 0x1087,
+ 0x849F, 0x849F, 0x27A9, 0x84A0, 0x84A0, 0x27C7, 0x84A1, 0x84A1, 0x27A8,
+ 0x84A2, 0x84A2, 0x27BB, 0x84A3, 0x84A3, 0x3B9E, 0x84A4, 0x84A4, 0x27A7,
+ 0x84A7, 0x84A7, 0x27B9, 0x84A8, 0x84A8, 0x27C2, 0x84A9, 0x84A9, 0x27C0,
+ 0x84AA, 0x84AA, 0x27B4, 0x84AB, 0x84AB, 0x27AF, 0x84AC, 0x84AC, 0x27AD,
+ 0x84AD, 0x84AD, 0x3D8C, 0x84AE, 0x84AE, 0x27AE, 0x84AF, 0x84AF, 0x27C1,
+ 0x84B0, 0x84B0, 0x27CC, 0x84B1, 0x84B1, 0x27B6, 0x84B2, 0x84B2, 0x1088,
+ 0x84B4, 0x84B4, 0x27B1, 0x84B6, 0x84B6, 0x27C5, 0x84B8, 0x84B8, 0x108B,
+ 0x84B9, 0x84B9, 0x27B0, 0x84BA, 0x84BA, 0x27AA, 0x84BB, 0x84BB, 0x27BA,
+ 0x84BC, 0x84BC, 0x108F, 0x84BD, 0x84BD, 0x3C4C, 0x84BE, 0x84BE, 0x4764,
+ 0x84BF, 0x84BF, 0x1083, 0x84C0, 0x84C0, 0x108C, 0x84C1, 0x84C1, 0x27B2,
+ 0x84C2, 0x84C2, 0x27AC, 0x84C4, 0x84C4, 0x1085, 0x84C5, 0x84C5, 0x255A,
+ 0x84C6, 0x84C6, 0x1084, 0x84C7, 0x84C7, 0x27BD, 0x84C9, 0x84C9, 0x1082,
+ 0x84CA, 0x84CA, 0x1091, 0x84CB, 0x84CB, 0x108A, 0x84CC, 0x84CC, 0x27BE,
+ 0x84CD, 0x84CD, 0x27B3, 0x84CE, 0x84CE, 0x27AB, 0x84CF, 0x84CF, 0x27C6,
+ 0x84D0, 0x84D0, 0x27B7, 0x84D1, 0x84D1, 0x1090, 0x84D2, 0x84D2, 0x27CA,
+ 0x84D3, 0x84D3, 0x108D, 0x84D4, 0x84D4, 0x27C9, 0x84D6, 0x84D6, 0x27C3,
+ 0x84D7, 0x84D7, 0x27C8, 0x84DA, 0x84DA, 0x3FF5, 0x84DB, 0x84DB, 0x27CB,
+ 0x84DE, 0x84DE, 0x37EA, 0x84E1, 0x84E1, 0x4765, 0x84E2, 0x84E2, 0x37B5,
+ 0x84E4, 0x84E4, 0x37EF, 0x84E5, 0x84E5, 0x3BD0, 0x84E7, 0x84E8, 0x2A03,
+ 0x84E9, 0x84E9, 0x29F7, 0x84EA, 0x84EA, 0x29F6, 0x84EB, 0x84EB, 0x29F2,
+ 0x84EC, 0x84EC, 0x11FB, 0x84EE, 0x84EE, 0x11F3, 0x84EF, 0x84EF, 0x2A06,
+ 0x84F0, 0x84F0, 0x2A05, 0x84F1, 0x84F1, 0x252F, 0x84F2, 0x84F2, 0x29EF,
+ 0x84F3, 0x84F3, 0x29F3, 0x84F4, 0x84F4, 0x29ED, 0x84F6, 0x84F6, 0x2A00,
+ 0x84F7, 0x84F7, 0x29F1, 0x84F8, 0x84F8, 0x4766, 0x84F9, 0x84F9, 0x2A07,
+ 0x84FA, 0x84FA, 0x29EA, 0x84FB, 0x84FB, 0x29E8, 0x84FC, 0x84FC, 0x29F4,
+ 0x84FD, 0x84FD, 0x29FE, 0x84FE, 0x84FE, 0x29F9, 0x84FF, 0x84FF, 0x11FD,
+ 0x8500, 0x8500, 0x29DF, 0x8502, 0x8502, 0x29FD, 0x8503, 0x8503, 0x398A,
+ 0x8505, 0x8505, 0x40EB, 0x8506, 0x8506, 0x11FE, 0x8507, 0x8507, 0x2543,
+ 0x8508, 0x8508, 0x29EB, 0x8509, 0x8509, 0x29E2, 0x850A, 0x850A, 0x29E5,
+ 0x850B, 0x850B, 0x2A0B, 0x850C, 0x850C, 0x29EC, 0x850D, 0x850D, 0x29E3,
+ 0x850E, 0x850E, 0x29E1, 0x850F, 0x850F, 0x29DE, 0x8510, 0x8510, 0x4767,
+ 0x8511, 0x8511, 0x11F7, 0x8512, 0x8512, 0x29F5, 0x8513, 0x8513, 0x11F6,
+ 0x8514, 0x8514, 0x11FA, 0x8515, 0x8515, 0x29F0, 0x8516, 0x8516, 0x29F8,
+ 0x8517, 0x8517, 0x11F0, 0x8518, 0x8518, 0x2A08, 0x8519, 0x8519, 0x2A0C,
+ 0x851A, 0x851A, 0x11F2, 0x851C, 0x851C, 0x29E7, 0x851D, 0x851D, 0x29FB,
+ 0x851E, 0x851E, 0x29FF, 0x851F, 0x851F, 0x29E4, 0x8520, 0x8520, 0x2A09,
+ 0x8521, 0x8521, 0x11F9, 0x8523, 0x8523, 0x11F8, 0x8524, 0x8524, 0x29DC,
+ 0x8525, 0x8525, 0x11FC, 0x8526, 0x8526, 0x2A02, 0x8527, 0x8527, 0x29E6,
+ 0x8528, 0x8528, 0x29FA, 0x8529, 0x8529, 0x29E0, 0x852A, 0x852A, 0x29EE,
+ 0x852B, 0x852B, 0x29E9, 0x852C, 0x852D, 0x11F4, 0x852E, 0x852E, 0x29FC,
+ 0x852F, 0x852F, 0x2A0D, 0x8530, 0x8530, 0x2A0A, 0x8531, 0x8531, 0x2A01,
+ 0x8533, 0x8533, 0x4228, 0x8534, 0x8534, 0x37F4, 0x8538, 0x8538, 0x4768,
+ 0x853B, 0x853B, 0x29DD, 0x853D, 0x853D, 0x11F1, 0x853E, 0x853E, 0x2C4F,
+ 0x8540, 0x8540, 0x2C46, 0x8541, 0x8541, 0x2C49, 0x8542, 0x8542, 0x4062,
+ 0x8543, 0x8543, 0x133B, 0x8544, 0x8544, 0x2C4B, 0x8545, 0x8545, 0x2C40,
+ 0x8546, 0x8546, 0x2C47, 0x8547, 0x8547, 0x2C4D, 0x8548, 0x8548, 0x1338,
+ 0x8549, 0x8549, 0x133C, 0x854A, 0x854A, 0x1336, 0x854B, 0x854B, 0x37C0,
+ 0x854C, 0x854C, 0x400F, 0x854D, 0x854D, 0x2C42, 0x854E, 0x854E, 0x2C52,
+ 0x8551, 0x8551, 0x2C4C, 0x8552, 0x8552, 0x4769, 0x8553, 0x8553, 0x2C43,
+ 0x8554, 0x8554, 0x2C5B, 0x8555, 0x8555, 0x2C55, 0x8556, 0x8556, 0x2C3F,
+ 0x8557, 0x8557, 0x2E23, 0x8558, 0x8558, 0x2C45, 0x8559, 0x8559, 0x1337,
+ 0x855A, 0x855A, 0x37DB, 0x855B, 0x855B, 0x2C50, 0x855D, 0x855D, 0x2C5A,
+ 0x855E, 0x855E, 0x133F, 0x8560, 0x8560, 0x2C57, 0x8561, 0x8561, 0x2C44,
+ 0x8562, 0x8562, 0x2C4A, 0x8563, 0x8563, 0x2C4E, 0x8564, 0x8564, 0x2C48,
+ 0x8565, 0x8565, 0x2C5C, 0x8566, 0x8566, 0x2C59, 0x8567, 0x8567, 0x2C56,
+ 0x8568, 0x8569, 0x1339, 0x856A, 0x856A, 0x133E, 0x856B, 0x856B, 0x2C41,
+ 0x856C, 0x856C, 0x2C5D, 0x856D, 0x856D, 0x133D, 0x856E, 0x856E, 0x2C53,
+ 0x856F, 0x8570, 0x476B, 0x8571, 0x8571, 0x2C51, 0x8573, 0x8573, 0x37F8,
+ 0x8575, 0x8575, 0x2C54, 0x8576, 0x8576, 0x2E30, 0x8577, 0x8577, 0x2E1D,
+ 0x8578, 0x8578, 0x2E22, 0x8579, 0x8579, 0x2E2F, 0x857A, 0x857A, 0x2E21,
+ 0x857B, 0x857B, 0x2E19, 0x857C, 0x857C, 0x2E1E, 0x857E, 0x857E, 0x145C,
+ 0x8580, 0x8580, 0x2E12, 0x8581, 0x8581, 0x2E2A, 0x8582, 0x8582, 0x2E2C,
+ 0x8583, 0x8583, 0x2E11, 0x8584, 0x8584, 0x145B, 0x8585, 0x8585, 0x2E2E,
+ 0x8586, 0x8586, 0x2E26, 0x8587, 0x8587, 0x1462, 0x8588, 0x8588, 0x2E2D,
+ 0x8589, 0x8589, 0x2E1F, 0x858A, 0x858A, 0x1464, 0x858B, 0x858B, 0x2E17,
+ 0x858C, 0x858C, 0x2C58, 0x858D, 0x858D, 0x2E27, 0x858E, 0x858E, 0x2E24,
+ 0x858F, 0x858F, 0x2E13, 0x8590, 0x8590, 0x2E32, 0x8591, 0x8591, 0x145E,
+ 0x8594, 0x8594, 0x145F, 0x8595, 0x8595, 0x2E15, 0x8596, 0x8596, 0x2E25,
+ 0x8598, 0x8598, 0x2E31, 0x8599, 0x8599, 0x2E28, 0x859A, 0x859A, 0x2E1B,
+ 0x859B, 0x859B, 0x1461, 0x859C, 0x859C, 0x145D, 0x859D, 0x859D, 0x2E29,
+ 0x859E, 0x859E, 0x2E1C, 0x859F, 0x859F, 0x2E33, 0x85A0, 0x85A0, 0x2E16,
+ 0x85A1, 0x85A1, 0x2E20, 0x85A2, 0x85A2, 0x2E2B, 0x85A3, 0x85A3, 0x2E18,
+ 0x85A4, 0x85A4, 0x2E1A, 0x85A6, 0x85A6, 0x1465, 0x85A7, 0x85A7, 0x2E14,
+ 0x85A8, 0x85A8, 0x1463, 0x85A9, 0x85A9, 0x151C, 0x85AA, 0x85AA, 0x145A,
+ 0x85AF, 0x85AF, 0x1460, 0x85B0, 0x85B0, 0x1520, 0x85B1, 0x85B1, 0x2FA6,
+ 0x85B3, 0x85B3, 0x2F9C, 0x85B4, 0x85B4, 0x2F97, 0x85B5, 0x85B5, 0x2F9D,
+ 0x85B6, 0x85B6, 0x2FA7, 0x85B7, 0x85B7, 0x2FAB, 0x85B8, 0x85B8, 0x2FAA,
+ 0x85B9, 0x85B9, 0x1522, 0x85BA, 0x85BA, 0x1521, 0x85BD, 0x85BD, 0x2F9E,
+ 0x85BE, 0x85BE, 0x2FAC, 0x85BF, 0x85BF, 0x2FA1, 0x85C0, 0x85C0, 0x2F99,
+ 0x85C1, 0x85C1, 0x37FE, 0x85C2, 0x85C2, 0x2F9B, 0x85C3, 0x85C3, 0x2F9A,
+ 0x85C4, 0x85C4, 0x2FA0, 0x85C5, 0x85C5, 0x2FA5, 0x85C6, 0x85C6, 0x2F98,
+ 0x85C7, 0x85C7, 0x2F9F, 0x85C8, 0x85C8, 0x2FA4, 0x85C9, 0x85C9, 0x151F,
+ 0x85CB, 0x85CB, 0x2FA2, 0x85CD, 0x85CD, 0x151D, 0x85CE, 0x85CE, 0x2FA3,
+ 0x85CF, 0x85CF, 0x151B, 0x85D0, 0x85D0, 0x151E, 0x85D1, 0x85D1, 0x3101,
+ 0x85D2, 0x85D2, 0x2FA8, 0x85D5, 0x85D5, 0x15B7, 0x85D7, 0x85D7, 0x30F9,
+ 0x85D8, 0x85D8, 0x30FD, 0x85D9, 0x85D9, 0x30F5, 0x85DA, 0x85DA, 0x30F8,
+ 0x85DC, 0x85DC, 0x3100, 0x85DD, 0x85DD, 0x15B5, 0x85DE, 0x85DE, 0x3105,
+ 0x85DF, 0x85DF, 0x30FE, 0x85E0, 0x85E0, 0x476D, 0x85E1, 0x85E1, 0x30F6,
+ 0x85E2, 0x85E2, 0x3106, 0x85E3, 0x85E3, 0x30FF, 0x85E4, 0x85E5, 0x15B8,
+ 0x85E6, 0x85E6, 0x3103, 0x85E8, 0x85E8, 0x30F7, 0x85E9, 0x85E9, 0x15B4,
+ 0x85EA, 0x85EA, 0x15B6, 0x85EB, 0x85EB, 0x30F2, 0x85EC, 0x85EC, 0x30FA,
+ 0x85ED, 0x85ED, 0x30F4, 0x85EE, 0x85EE, 0x3C56, 0x85EF, 0x85EF, 0x3104,
+ 0x85F0, 0x85F0, 0x3102, 0x85F1, 0x85F1, 0x30F3, 0x85F2, 0x85F2, 0x30FB,
+ 0x85F6, 0x85F6, 0x3225, 0x85F7, 0x85F7, 0x15BA, 0x85F8, 0x85F8, 0x30FC,
+ 0x85F9, 0x85F9, 0x1638, 0x85FA, 0x85FA, 0x163A, 0x85FB, 0x85FB, 0x1637,
+ 0x85FC, 0x85FC, 0x3C50, 0x85FD, 0x85FD, 0x322A, 0x85FE, 0x85FE, 0x3222,
+ 0x85FF, 0x85FF, 0x3220, 0x8600, 0x8600, 0x3224, 0x8601, 0x8601, 0x3221,
+ 0x8602, 0x8602, 0x3800, 0x8604, 0x8604, 0x3226, 0x8605, 0x8605, 0x3228,
+ 0x8606, 0x8606, 0x163B, 0x8607, 0x8607, 0x163D, 0x8609, 0x8609, 0x3227,
+ 0x860A, 0x860A, 0x163E, 0x860B, 0x860B, 0x163C, 0x860C, 0x860C, 0x3229,
+ 0x860D, 0x860D, 0x4064, 0x8610, 0x8610, 0x3B7F, 0x8611, 0x8611, 0x1639,
+ 0x8614, 0x8614, 0x46BE, 0x8616, 0x8616, 0x37FB, 0x8617, 0x8617, 0x1685,
+ 0x8618, 0x8618, 0x32F6, 0x8619, 0x8619, 0x32FC, 0x861A, 0x861A, 0x1687,
+ 0x861B, 0x861B, 0x3223, 0x861C, 0x861C, 0x32FB, 0x861E, 0x861E, 0x3302,
+ 0x861F, 0x861F, 0x32F9, 0x8620, 0x8620, 0x3300, 0x8621, 0x8621, 0x32FF,
+ 0x8622, 0x8622, 0x321F, 0x8623, 0x8623, 0x32FA, 0x8624, 0x8624, 0x2FA9,
+ 0x8625, 0x8625, 0x3303, 0x8626, 0x8626, 0x32F8, 0x8627, 0x8627, 0x32FD,
+ 0x8628, 0x8628, 0x3805, 0x8629, 0x8629, 0x3301, 0x862A, 0x862A, 0x32F7,
+ 0x862C, 0x862C, 0x33AA, 0x862D, 0x862D, 0x1686, 0x862E, 0x862E, 0x32FE,
+ 0x862F, 0x862F, 0x3F9E, 0x8631, 0x8631, 0x3432, 0x8632, 0x8632, 0x33AB,
+ 0x8633, 0x8633, 0x33A9, 0x8634, 0x8635, 0x33A7, 0x8636, 0x8636, 0x33AC,
+ 0x8638, 0x8638, 0x1707, 0x8639, 0x8639, 0x3430, 0x863A, 0x863A, 0x342E,
+ 0x863B, 0x863B, 0x3433, 0x863C, 0x863C, 0x3431, 0x863E, 0x863E, 0x3434,
+ 0x863F, 0x863F, 0x1708, 0x8640, 0x8640, 0x342F, 0x8642, 0x8642, 0x38C1,
+ 0x8643, 0x8643, 0x3497, 0x8645, 0x8645, 0x3B66, 0x8646, 0x8648, 0x34DF,
+ 0x864B, 0x864B, 0x353E, 0x864C, 0x864C, 0x3536, 0x864D, 0x864D, 0x1818,
+ 0x864E, 0x864E, 0x0689, 0x8650, 0x8650, 0x07FF, 0x8652, 0x8652, 0x1DE3,
+ 0x8653, 0x8653, 0x1DE2, 0x8654, 0x8654, 0x09AF, 0x8655, 0x8655, 0x0B88,
+ 0x8656, 0x8656, 0x203C, 0x8659, 0x8659, 0x203B, 0x865B, 0x865B, 0x0D48,
+ 0x865C, 0x865C, 0x0EED, 0x865E, 0x865E, 0x0EEC, 0x865F, 0x865F, 0x0EEE,
+ 0x8661, 0x8661, 0x27CE, 0x8662, 0x8662, 0x2A0E, 0x8663, 0x8663, 0x2C5E,
+ 0x8664, 0x8664, 0x2C60, 0x8665, 0x8665, 0x2C5F, 0x8667, 0x8667, 0x1466,
+ 0x8668, 0x8668, 0x2E34, 0x8669, 0x8669, 0x2FAD, 0x866A, 0x866A, 0x351E,
+ 0x866B, 0x866B, 0x040F, 0x866C, 0x866C, 0x3813, 0x866D, 0x866E, 0x1A46,
+ 0x866F, 0x866F, 0x1A45, 0x8670, 0x8670, 0x1A44, 0x8671, 0x8671, 0x068A,
+ 0x8672, 0x8672, 0x476F, 0x8673, 0x8673, 0x1BFD, 0x8674, 0x8674, 0x1BFB,
+ 0x8677, 0x8677, 0x1BFA, 0x8679, 0x8679, 0x0800, 0x867A, 0x867A, 0x0802,
+ 0x867B, 0x867B, 0x0801, 0x867C, 0x867C, 0x1BFC, 0x867E, 0x867E, 0x380A,
+ 0x8685, 0x8685, 0x1DEF, 0x8686, 0x8686, 0x1DEC, 0x8687, 0x8687, 0x1DEA,
+ 0x868A, 0x868A, 0x09B0, 0x868B, 0x868B, 0x1DED, 0x868C, 0x868C, 0x09B5,
+ 0x868D, 0x868D, 0x1DE7, 0x868E, 0x868E, 0x1DF6, 0x8690, 0x8690, 0x1DF8,
+ 0x8691, 0x8691, 0x1DE8, 0x8692, 0x8692, 0x4770, 0x8693, 0x8693, 0x09B2,
+ 0x8694, 0x8694, 0x1DF9, 0x8695, 0x8695, 0x1DF4, 0x8696, 0x8696, 0x1DE6,
+ 0x8697, 0x8697, 0x1DEB, 0x8698, 0x8698, 0x1DF5, 0x8699, 0x8699, 0x1DF1,
+ 0x869A, 0x869A, 0x1DEE, 0x869C, 0x869C, 0x09B7, 0x869D, 0x869D, 0x1DF7,
+ 0x869E, 0x869E, 0x1DE9, 0x86A0, 0x86A0, 0x3B88, 0x86A1, 0x86A1, 0x1DF2,
+ 0x86A2, 0x86A2, 0x1DE4, 0x86A3, 0x86A3, 0x09B6, 0x86A4, 0x86A4, 0x09B3,
+ 0x86A5, 0x86A5, 0x1DF0, 0x86A7, 0x86A7, 0x1DF3, 0x86A8, 0x86A8, 0x1DE5,
+ 0x86A9, 0x86A9, 0x09B4, 0x86AA, 0x86AA, 0x09B1, 0x86AD, 0x86AD, 0x3F06,
+ 0x86AF, 0x86AF, 0x0B92, 0x86B0, 0x86B0, 0x2043, 0x86B1, 0x86B1, 0x0B91,
+ 0x86B2, 0x86B2, 0x43E0, 0x86B3, 0x86B3, 0x2046, 0x86B4, 0x86B4, 0x2049,
+ 0x86B5, 0x86B5, 0x0B8E, 0x86B6, 0x86B6, 0x0B8C, 0x86B7, 0x86B7, 0x203E,
+ 0x86B8, 0x86B8, 0x2047, 0x86B9, 0x86B9, 0x2045, 0x86BA, 0x86BA, 0x2042,
+ 0x86BB, 0x86BC, 0x204A, 0x86BD, 0x86BE, 0x204D, 0x86BF, 0x86BF, 0x203D,
+ 0x86C0, 0x86C0, 0x0B8B, 0x86C1, 0x86C1, 0x2040, 0x86C2, 0x86C2, 0x203F,
+ 0x86C3, 0x86C3, 0x204C, 0x86C4, 0x86C4, 0x0B8D, 0x86C5, 0x86C5, 0x2041,
+ 0x86C6, 0x86C6, 0x0B8F, 0x86C7, 0x86C7, 0x0B8A, 0x86C8, 0x86C8, 0x2044,
+ 0x86C9, 0x86C9, 0x0B93, 0x86CB, 0x86CB, 0x0B90, 0x86CC, 0x86CC, 0x2048,
+ 0x86D0, 0x86D0, 0x0D4F, 0x86D1, 0x86D1, 0x22D2, 0x86D3, 0x86D3, 0x22C7,
+ 0x86D4, 0x86D4, 0x0D4C, 0x86D6, 0x86D6, 0x256D, 0x86D7, 0x86D7, 0x22D0,
+ 0x86D8, 0x86D8, 0x22C4, 0x86D9, 0x86D9, 0x0D4A, 0x86DA, 0x86DA, 0x22C9,
+ 0x86DB, 0x86DB, 0x0D4D, 0x86DC, 0x86DC, 0x22CD, 0x86DD, 0x86DD, 0x22CB,
+ 0x86DE, 0x86DE, 0x0D50, 0x86DF, 0x86DF, 0x0D49, 0x86E2, 0x86E2, 0x22C5,
+ 0x86E3, 0x86E3, 0x22C8, 0x86E4, 0x86E4, 0x0D4E, 0x86E6, 0x86E6, 0x22C6,
+ 0x86E8, 0x86E8, 0x22D1, 0x86E9, 0x86E9, 0x22CF, 0x86EA, 0x86EA, 0x22CA,
+ 0x86EB, 0x86EB, 0x22CC, 0x86EC, 0x86EC, 0x22CE, 0x86ED, 0x86ED, 0x0D4B,
+ 0x86EF, 0x86EF, 0x4771, 0x86F5, 0x86F5, 0x256E, 0x86F6, 0x86F6, 0x2574,
+ 0x86F7, 0x86F7, 0x256A, 0x86F8, 0x86F8, 0x2570, 0x86F9, 0x86F9, 0x0EEF,
+ 0x86FA, 0x86FA, 0x256C, 0x86FB, 0x86FB, 0x0EF5, 0x86FE, 0x86FE, 0x0EF4,
+ 0x8700, 0x8700, 0x0EF3, 0x8701, 0x8701, 0x2573, 0x8702, 0x8703, 0x0EF6,
+ 0x8704, 0x8704, 0x2569, 0x8705, 0x8705, 0x2576, 0x8706, 0x8706, 0x0EF8,
+ 0x8707, 0x8707, 0x0EF2, 0x8708, 0x8708, 0x0EF1, 0x8709, 0x8709, 0x2572,
+ 0x870A, 0x870A, 0x0EF9, 0x870B, 0x870B, 0x2568, 0x870C, 0x870C, 0x256B,
+ 0x870D, 0x870D, 0x2575, 0x870E, 0x870E, 0x2571, 0x8711, 0x8711, 0x27EE,
+ 0x8712, 0x8712, 0x27E3, 0x8713, 0x8713, 0x0EF0, 0x8718, 0x8718, 0x1098,
+ 0x8719, 0x8719, 0x27D7, 0x871A, 0x871A, 0x27EC, 0x871B, 0x871B, 0x27D8,
+ 0x871C, 0x871C, 0x1093, 0x871E, 0x871E, 0x27D5, 0x8720, 0x8720, 0x27DE,
+ 0x8721, 0x8721, 0x27D6, 0x8722, 0x8722, 0x1095, 0x8723, 0x8723, 0x27D0,
+ 0x8724, 0x8724, 0x27EB, 0x8725, 0x8725, 0x1096, 0x8726, 0x8727, 0x27E8,
+ 0x8728, 0x8728, 0x27D1, 0x8729, 0x8729, 0x109B, 0x872A, 0x872A, 0x27E0,
+ 0x872C, 0x872C, 0x27DA, 0x872D, 0x872D, 0x27E1, 0x872E, 0x872E, 0x27D4,
+ 0x8730, 0x8730, 0x27ED, 0x8731, 0x8731, 0x27E5, 0x8732, 0x8732, 0x27DF,
+ 0x8733, 0x8733, 0x27CF, 0x8734, 0x8734, 0x1097, 0x8735, 0x8735, 0x27E6,
+ 0x8737, 0x8737, 0x109A, 0x8738, 0x8738, 0x27EA, 0x873A, 0x873A, 0x27E4,
+ 0x873B, 0x873B, 0x1094, 0x873C, 0x873C, 0x27E2, 0x873E, 0x873E, 0x27DC,
+ 0x873F, 0x873F, 0x1092, 0x8740, 0x8740, 0x27D3, 0x8741, 0x8741, 0x27DB,
+ 0x8742, 0x8742, 0x27E7, 0x8743, 0x8743, 0x27D9, 0x8746, 0x8746, 0x27DD,
+ 0x874C, 0x874C, 0x1208, 0x874D, 0x874D, 0x256F, 0x874E, 0x874E, 0x2A20,
+ 0x874F, 0x874F, 0x2A29, 0x8750, 0x8750, 0x2A1F, 0x8751, 0x8751, 0x2A1B,
+ 0x8752, 0x8752, 0x2A18, 0x8753, 0x8753, 0x1209, 0x8754, 0x8754, 0x2A16,
+ 0x8755, 0x8755, 0x1099, 0x8756, 0x8756, 0x2A0F, 0x8757, 0x8757, 0x1207,
+ 0x8758, 0x8758, 0x2A15, 0x8759, 0x8759, 0x1206, 0x875A, 0x875A, 0x2A1A,
+ 0x875B, 0x875B, 0x2A17, 0x875C, 0x875C, 0x2A27, 0x875D, 0x875D, 0x2A22,
+ 0x875E, 0x875E, 0x2A1C, 0x875F, 0x875F, 0x2A21, 0x8760, 0x8760, 0x1202,
+ 0x8761, 0x8761, 0x2A19, 0x8762, 0x8762, 0x2A2C, 0x8763, 0x8764, 0x2A10,
+ 0x8765, 0x8765, 0x2A28, 0x8766, 0x8766, 0x1203, 0x8767, 0x8767, 0x2A2D,
+ 0x8768, 0x8768, 0x1205, 0x8769, 0x8769, 0x2A2E, 0x876A, 0x876A, 0x2A1E,
+ 0x876B, 0x876B, 0x27D2, 0x876C, 0x876C, 0x2A24, 0x876D, 0x876D, 0x2A1D,
+ 0x876E, 0x876E, 0x2A26, 0x876F, 0x876F, 0x2A23, 0x8770, 0x8770, 0x3E6C,
+ 0x8771, 0x8771, 0x380B, 0x8773, 0x8773, 0x2A14, 0x8774, 0x8774, 0x1200,
+ 0x8775, 0x8775, 0x2A2B, 0x8776, 0x8776, 0x1201, 0x8777, 0x8777, 0x2A12,
+ 0x8778, 0x8778, 0x1204, 0x8779, 0x8779, 0x2C6B, 0x877A, 0x877A, 0x2A25,
+ 0x877B, 0x877B, 0x2A2A, 0x877D, 0x877D, 0x4045, 0x8781, 0x8781, 0x2C68,
+ 0x8782, 0x8782, 0x11FF, 0x8783, 0x8783, 0x1340, 0x8784, 0x8784, 0x2C72,
+ 0x8785, 0x8785, 0x2C6E, 0x8786, 0x8786, 0x3EB0, 0x8787, 0x8787, 0x2C6C,
+ 0x8788, 0x8788, 0x2C67, 0x8789, 0x8789, 0x2C76, 0x878B, 0x878B, 0x43E2,
+ 0x878C, 0x878C, 0x3FEF, 0x878D, 0x878D, 0x1344, 0x878F, 0x878F, 0x2C63,
+ 0x8790, 0x8791, 0x2C6F, 0x8792, 0x8792, 0x2C66, 0x8793, 0x8793, 0x2C65,
+ 0x8794, 0x8794, 0x2C73, 0x8796, 0x8796, 0x2C69, 0x8797, 0x8797, 0x2C64,
+ 0x8798, 0x8798, 0x2C6A, 0x879A, 0x879A, 0x2C75, 0x879B, 0x879B, 0x2C62,
+ 0x879C, 0x879C, 0x2C74, 0x879D, 0x879D, 0x2C71, 0x879E, 0x879E, 0x1342,
+ 0x879F, 0x879F, 0x1341, 0x87A2, 0x87A2, 0x1343, 0x87A3, 0x87A3, 0x2C6D,
+ 0x87A4, 0x87A4, 0x2C61, 0x87A5, 0x87A5, 0x3D88, 0x87A9, 0x87A9, 0x3FEC,
+ 0x87AA, 0x87AA, 0x2E36, 0x87AB, 0x87AB, 0x146C, 0x87AC, 0x87AC, 0x2E3A,
+ 0x87AD, 0x87AD, 0x2E37, 0x87AE, 0x87AE, 0x2E3E, 0x87AF, 0x87AF, 0x2E44,
+ 0x87B0, 0x87B0, 0x2E39, 0x87B1, 0x87B1, 0x380F, 0x87B2, 0x87B2, 0x2E4D,
+ 0x87B3, 0x87B3, 0x1469, 0x87B4, 0x87B4, 0x2E47, 0x87B5, 0x87B5, 0x2E3C,
+ 0x87B6, 0x87B6, 0x2E48, 0x87B7, 0x87B7, 0x2E43, 0x87B8, 0x87B8, 0x2E4A,
+ 0x87B9, 0x87B9, 0x2E3B, 0x87BA, 0x87BA, 0x146E, 0x87BB, 0x87BB, 0x146D,
+ 0x87BC, 0x87BC, 0x2E3D, 0x87BD, 0x87BD, 0x2E4B, 0x87BE, 0x87BE, 0x2E35,
+ 0x87BF, 0x87BF, 0x2E49, 0x87C0, 0x87C0, 0x1467, 0x87C1, 0x87C1, 0x3FFC,
+ 0x87C2, 0x87C2, 0x2E41, 0x87C3, 0x87C3, 0x2E40, 0x87C4, 0x87C4, 0x2E45,
+ 0x87C5, 0x87C5, 0x2E38, 0x87C6, 0x87C6, 0x146B, 0x87C8, 0x87C8, 0x146F,
+ 0x87C9, 0x87C9, 0x2E3F, 0x87CA, 0x87CA, 0x2E46, 0x87CB, 0x87CB, 0x1470,
+ 0x87CC, 0x87CC, 0x2E42, 0x87CE, 0x87CE, 0x3FED, 0x87D1, 0x87D1, 0x1468,
+ 0x87D2, 0x87D2, 0x146A, 0x87D3, 0x87D3, 0x2FBA, 0x87D4, 0x87D4, 0x2FB8,
+ 0x87D6, 0x87D6, 0x3F92, 0x87D7, 0x87D7, 0x2FBE, 0x87D8, 0x87D8, 0x2FBC,
+ 0x87D9, 0x87D9, 0x2FBF, 0x87DA, 0x87DA, 0x3810, 0x87DB, 0x87DB, 0x2FB1,
+ 0x87DC, 0x87DC, 0x2FB9, 0x87DD, 0x87DD, 0x2FC3, 0x87DE, 0x87DE, 0x2E4C,
+ 0x87DF, 0x87DF, 0x2FB5, 0x87E0, 0x87E0, 0x1526, 0x87E1, 0x87E1, 0x2A13,
+ 0x87E2, 0x87E2, 0x2FB0, 0x87E3, 0x87E3, 0x2FBD, 0x87E4, 0x87E4, 0x2FB7,
+ 0x87E5, 0x87E5, 0x2FB4, 0x87E6, 0x87E6, 0x2FAF, 0x87E7, 0x87E7, 0x2FAE,
+ 0x87E8, 0x87E8, 0x2FC2, 0x87EA, 0x87EA, 0x2FB3, 0x87EB, 0x87EB, 0x2FB2,
+ 0x87EC, 0x87EC, 0x1524, 0x87ED, 0x87ED, 0x2FBB, 0x87EE, 0x87EE, 0x380D,
+ 0x87EF, 0x87EF, 0x1523, 0x87F2, 0x87F2, 0x1525, 0x87F3, 0x87F3, 0x2FB6,
+ 0x87F4, 0x87F4, 0x2FC1, 0x87F5, 0x87F5, 0x3FAE, 0x87F6, 0x87F7, 0x310A,
+ 0x87F9, 0x87F9, 0x15BE, 0x87FA, 0x87FA, 0x3108, 0x87FB, 0x87FB, 0x15BB,
+ 0x87FC, 0x87FC, 0x3110, 0x87FE, 0x87FE, 0x15BF, 0x87FF, 0x87FF, 0x3112,
+ 0x8800, 0x8800, 0x3107, 0x8801, 0x8801, 0x2FC0, 0x8802, 0x8802, 0x3114,
+ 0x8803, 0x8803, 0x3109, 0x8804, 0x8804, 0x3EAF, 0x8805, 0x8805, 0x15BC,
+ 0x8806, 0x8806, 0x310F, 0x8808, 0x8808, 0x3111, 0x8809, 0x8809, 0x310C,
+ 0x880A, 0x880A, 0x3113, 0x880B, 0x880B, 0x310E, 0x880C, 0x880C, 0x310D,
+ 0x880D, 0x880D, 0x15BD, 0x880F, 0x880F, 0x3811, 0x8810, 0x8811, 0x322C,
+ 0x8813, 0x8813, 0x322F, 0x8814, 0x8815, 0x163F, 0x8816, 0x8816, 0x3230,
+ 0x8817, 0x8817, 0x322E, 0x8818, 0x8818, 0x3F7A, 0x8819, 0x8819, 0x322B,
+ 0x881B, 0x881B, 0x3306, 0x881C, 0x881C, 0x3309, 0x881D, 0x881D, 0x3305,
+ 0x881F, 0x881F, 0x168B, 0x8820, 0x8820, 0x3307, 0x8821, 0x8821, 0x168A,
+ 0x8822, 0x8822, 0x1689, 0x8823, 0x8823, 0x1688, 0x8824, 0x8824, 0x3308,
+ 0x8825, 0x8825, 0x33B1, 0x8826, 0x8826, 0x33AF, 0x8827, 0x8827, 0x3E07,
+ 0x8828, 0x8828, 0x33AE, 0x8829, 0x8829, 0x3304, 0x882A, 0x882A, 0x33B0,
+ 0x882B, 0x882B, 0x330A, 0x882C, 0x882C, 0x33AD, 0x882D, 0x882D, 0x3B8B,
+ 0x882E, 0x882E, 0x3437, 0x882F, 0x882F, 0x3415, 0x8830, 0x8830, 0x3435,
+ 0x8831, 0x8831, 0x1709, 0x8832, 0x8832, 0x3436, 0x8833, 0x8833, 0x3438,
+ 0x8835, 0x8835, 0x349A, 0x8836, 0x8836, 0x1728, 0x8837, 0x8837, 0x3499,
+ 0x8838, 0x8838, 0x3498, 0x8839, 0x8839, 0x1729, 0x883B, 0x883B, 0x1747,
+ 0x883C, 0x883C, 0x3508, 0x883D, 0x883D, 0x3520, 0x883E, 0x883E, 0x351F,
+ 0x883F, 0x883F, 0x3521, 0x8840, 0x8840, 0x0410, 0x8841, 0x8841, 0x1BFE,
+ 0x8842, 0x8842, 0x3F5A, 0x8843, 0x8844, 0x1DFA, 0x8845, 0x8846, 0x3816,
+ 0x8848, 0x8848, 0x22D3, 0x884A, 0x884A, 0x330B, 0x884B, 0x884B, 0x349B,
+ 0x884C, 0x884C, 0x0411, 0x884D, 0x884D, 0x0803, 0x884E, 0x884E, 0x1BFF,
+ 0x884F, 0x884F, 0x3844, 0x8852, 0x8852, 0x204F, 0x8853, 0x8853, 0x0B94,
+ 0x8855, 0x8855, 0x22D5, 0x8856, 0x8856, 0x22D4, 0x8857, 0x8857, 0x0D51,
+ 0x8859, 0x8859, 0x0EFA, 0x885A, 0x885A, 0x2A2F, 0x885B, 0x885B, 0x120A,
+ 0x885D, 0x885D, 0x120B, 0x885E, 0x885E, 0x381B, 0x8860, 0x8860, 0x3A46,
+ 0x8861, 0x8861, 0x1345, 0x8862, 0x8862, 0x172A, 0x8863, 0x8863, 0x0412,
+ 0x8864, 0x8864, 0x4502, 0x8865, 0x8865, 0x3DFC, 0x8867, 0x8867, 0x1C00,
+ 0x8868, 0x8868, 0x068C, 0x8869, 0x8869, 0x1C02, 0x886A, 0x886A, 0x1C01,
+ 0x886B, 0x886B, 0x0804, 0x886D, 0x886D, 0x1DFC, 0x886E, 0x886E, 0x3B8E,
+ 0x886F, 0x886F, 0x1E03, 0x8870, 0x8870, 0x09B8, 0x8871, 0x8871, 0x1E01,
+ 0x8872, 0x8872, 0x1DFF, 0x8874, 0x8874, 0x1E06, 0x8875, 0x8876, 0x1DFD,
+ 0x8877, 0x8877, 0x09B9, 0x8879, 0x8879, 0x09BD, 0x887C, 0x887C, 0x1E07,
+ 0x887D, 0x887D, 0x09BC, 0x887E, 0x887E, 0x1E05, 0x887F, 0x887F, 0x1E02,
+ 0x8880, 0x8880, 0x1E00, 0x8881, 0x8882, 0x09BA, 0x8883, 0x8883, 0x1E04,
+ 0x8884, 0x8884, 0x42F7, 0x8887, 0x8887, 0x3B90, 0x8888, 0x8888, 0x0B96,
+ 0x8889, 0x8889, 0x2050, 0x888B, 0x888B, 0x0B9B, 0x888C, 0x888C, 0x2060,
+ 0x888D, 0x888D, 0x0B9A, 0x888E, 0x888E, 0x2062, 0x8891, 0x8891, 0x2056,
+ 0x8892, 0x8892, 0x0B98, 0x8893, 0x8893, 0x2061, 0x8895, 0x8895, 0x2051,
+ 0x8896, 0x8896, 0x0B99, 0x8897, 0x8897, 0x205D, 0x8898, 0x8898, 0x2059,
+ 0x8899, 0x8899, 0x205B, 0x889A, 0x889A, 0x2055, 0x889B, 0x889B, 0x205C,
+ 0x889C, 0x889C, 0x381C, 0x889E, 0x889E, 0x0B95, 0x889F, 0x889F, 0x2058,
+ 0x88A0, 0x88A0, 0x3FA0, 0x88A1, 0x88A1, 0x2057, 0x88A2, 0x88A2, 0x2053,
+ 0x88A4, 0x88A4, 0x205E, 0x88A7, 0x88A7, 0x205A, 0x88A8, 0x88A8, 0x2052,
+ 0x88AA, 0x88AA, 0x2054, 0x88AB, 0x88AB, 0x0B97, 0x88AC, 0x88AC, 0x205F,
+ 0x88AE, 0x88AE, 0x4775, 0x88B1, 0x88B1, 0x0D54, 0x88B2, 0x88B2, 0x22E0,
+ 0x88B4, 0x88B5, 0x381E, 0x88B6, 0x88B6, 0x22DC, 0x88B7, 0x88B7, 0x22DE,
+ 0x88B8, 0x88B8, 0x22D9, 0x88B9, 0x88B9, 0x22D8, 0x88BA, 0x88BA, 0x22D6,
+ 0x88BC, 0x88BC, 0x22DD, 0x88BD, 0x88BD, 0x22DF, 0x88BE, 0x88BE, 0x22DB,
+ 0x88BF, 0x88BF, 0x3B91, 0x88C0, 0x88C0, 0x22DA, 0x88C1, 0x88C2, 0x0D52,
+ 0x88C5, 0x88C5, 0x3820, 0x88C7, 0x88C7, 0x3EB1, 0x88C9, 0x88C9, 0x22E2,
+ 0x88CA, 0x88CA, 0x0F02, 0x88CB, 0x88CB, 0x2578, 0x88CC, 0x88CC, 0x257E,
+ 0x88CD, 0x88CE, 0x2579, 0x88CF, 0x88CF, 0x36EA, 0x88D0, 0x88D0, 0x257F,
+ 0x88D2, 0x88D2, 0x0F04, 0x88D4, 0x88D4, 0x0EFC, 0x88D5, 0x88D5, 0x0F03,
+ 0x88D6, 0x88D6, 0x2577, 0x88D7, 0x88D7, 0x22D7, 0x88D8, 0x88D8, 0x0EFF,
+ 0x88D9, 0x88D9, 0x0EFD, 0x88DA, 0x88DA, 0x257D, 0x88DB, 0x88DB, 0x257C,
+ 0x88DC, 0x88DC, 0x0EFE, 0x88DD, 0x88DD, 0x0F00, 0x88DE, 0x88DE, 0x257B,
+ 0x88DF, 0x88DF, 0x0EFB, 0x88E1, 0x88E1, 0x0F01, 0x88E6, 0x88E6, 0x3B92,
+ 0x88E7, 0x88E7, 0x27F0, 0x88E8, 0x88E8, 0x10A2, 0x88EB, 0x88EB, 0x27FB,
+ 0x88EC, 0x88EC, 0x27FA, 0x88EE, 0x88EE, 0x27F5, 0x88EF, 0x88EF, 0x10A4,
+ 0x88F0, 0x88F0, 0x27F9, 0x88F1, 0x88F2, 0x27F1, 0x88F3, 0x88F3, 0x109C,
+ 0x88F4, 0x88F4, 0x109E, 0x88F5, 0x88F5, 0x3E08, 0x88F6, 0x88F6, 0x27F7,
+ 0x88F7, 0x88F7, 0x27EF, 0x88F8, 0x88F8, 0x10A0, 0x88F9, 0x88F9, 0x109F,
+ 0x88FA, 0x88FA, 0x27F3, 0x88FB, 0x88FB, 0x27F8, 0x88FC, 0x88FC, 0x27F6,
+ 0x88FD, 0x88FD, 0x10A1, 0x88FE, 0x88FE, 0x27F4, 0x88FF, 0x88FF, 0x4776,
+ 0x8900, 0x8900, 0x42FA, 0x8901, 0x8901, 0x22E1, 0x8902, 0x8902, 0x109D,
+ 0x8905, 0x8905, 0x2A30, 0x8906, 0x8906, 0x2A37, 0x8907, 0x8907, 0x120D,
+ 0x8909, 0x8909, 0x2A3B, 0x890A, 0x890A, 0x1211, 0x890B, 0x890B, 0x2A33,
+ 0x890C, 0x890C, 0x2A31, 0x890E, 0x890E, 0x2A3A, 0x8910, 0x8910, 0x120C,
+ 0x8911, 0x8911, 0x2A39, 0x8912, 0x8913, 0x120E, 0x8914, 0x8914, 0x2A32,
+ 0x8915, 0x8915, 0x1210, 0x8916, 0x8916, 0x2A38, 0x8917, 0x8919, 0x2A34,
+ 0x891A, 0x891A, 0x10A3, 0x891E, 0x891E, 0x2C77, 0x891F, 0x891F, 0x2C83,
+ 0x8921, 0x8921, 0x134A, 0x8922, 0x8922, 0x2C7E, 0x8923, 0x8923, 0x2C80,
+ 0x8924, 0x8924, 0x4777, 0x8925, 0x8925, 0x1348, 0x8926, 0x8926, 0x2C78,
+ 0x8927, 0x8927, 0x2C7C, 0x8929, 0x8929, 0x2C7F, 0x892A, 0x892A, 0x1346,
+ 0x892B, 0x892B, 0x1349, 0x892C, 0x892C, 0x2C82, 0x892D, 0x892E, 0x2C7A,
+ 0x892F, 0x892F, 0x2C81, 0x8930, 0x8930, 0x2C79, 0x8931, 0x8931, 0x2C7D,
+ 0x8932, 0x8932, 0x1347, 0x8933, 0x8933, 0x2E4F, 0x8935, 0x8935, 0x2E4E,
+ 0x8936, 0x8936, 0x1472, 0x8937, 0x8937, 0x2E54, 0x8938, 0x8938, 0x1474,
+ 0x893B, 0x893B, 0x1471, 0x893C, 0x893C, 0x2E50, 0x893D, 0x893D, 0x1475,
+ 0x893E, 0x893E, 0x2E51, 0x8941, 0x8941, 0x2E52, 0x8942, 0x8942, 0x2E55,
+ 0x8943, 0x8943, 0x3E16, 0x8944, 0x8944, 0x1473, 0x8946, 0x8946, 0x2FC8,
+ 0x8947, 0x8947, 0x43E3, 0x8949, 0x8949, 0x2FCB, 0x894B, 0x894B, 0x2FC5,
+ 0x894C, 0x894C, 0x2FC7, 0x894D, 0x894D, 0x3B94, 0x894F, 0x894F, 0x2FC6,
+ 0x8950, 0x8951, 0x2FC9, 0x8952, 0x8952, 0x2E53, 0x8953, 0x8953, 0x2FC4,
+ 0x8954, 0x8954, 0x3B96, 0x8956, 0x8956, 0x15C2, 0x8957, 0x8957, 0x3118,
+ 0x8958, 0x8958, 0x311B, 0x8959, 0x8959, 0x311D, 0x895A, 0x895B, 0x3116,
+ 0x895C, 0x895C, 0x311A, 0x895D, 0x895D, 0x311C, 0x895E, 0x895E, 0x15C3,
+ 0x895F, 0x895F, 0x15C1, 0x8960, 0x8960, 0x15C0, 0x8961, 0x8961, 0x3119,
+ 0x8962, 0x8962, 0x3115, 0x8963, 0x8963, 0x3231, 0x8964, 0x8964, 0x1641,
+ 0x8965, 0x8965, 0x3B93, 0x8966, 0x8966, 0x3232, 0x8969, 0x8969, 0x330D,
+ 0x896A, 0x896A, 0x168C, 0x896B, 0x896B, 0x330F, 0x896C, 0x896C, 0x168D,
+ 0x896D, 0x896D, 0x330C, 0x896E, 0x896E, 0x330E, 0x896F, 0x896F, 0x16D6,
+ 0x8971, 0x8971, 0x33B2, 0x8972, 0x8972, 0x16D5, 0x8973, 0x8973, 0x343B,
+ 0x8974, 0x8974, 0x343A, 0x8976, 0x8976, 0x3439, 0x8977, 0x8977, 0x3DEA,
+ 0x8979, 0x897A, 0x34E2, 0x897B, 0x897B, 0x34E5, 0x897C, 0x897C, 0x34E4,
+ 0x897E, 0x897E, 0x1819, 0x897F, 0x897F, 0x0413, 0x8980, 0x8980, 0x4708,
+ 0x8981, 0x8981, 0x0805, 0x8982, 0x8982, 0x2063, 0x8983, 0x8983, 0x0D55,
+ 0x8985, 0x8985, 0x2580, 0x8986, 0x8986, 0x1527, 0x8987, 0x8987, 0x3822,
+ 0x8988, 0x8988, 0x311E, 0x8989, 0x8989, 0x3FE9, 0x898A, 0x898A, 0x3823,
+ 0x898B, 0x898B, 0x0508, 0x898F, 0x898F, 0x0B9D, 0x8991, 0x8991, 0x4778,
+ 0x8993, 0x8993, 0x0B9C, 0x8994, 0x8994, 0x3FE0, 0x8995, 0x8995, 0x22E3,
+ 0x8996, 0x8996, 0x0D56, 0x8997, 0x8997, 0x22E5, 0x8998, 0x8998, 0x22E4,
+ 0x899B, 0x899B, 0x2581, 0x899C, 0x899C, 0x0F05, 0x899D, 0x899D, 0x27FC,
+ 0x899E, 0x899E, 0x27FF, 0x899F, 0x899F, 0x27FE, 0x89A1, 0x89A1, 0x27FD,
+ 0x89A2, 0x89A2, 0x2A3C, 0x89A3, 0x89A3, 0x2A3E, 0x89A4, 0x89A4, 0x2A3D,
+ 0x89A5, 0x89A5, 0x3D93, 0x89A6, 0x89A6, 0x134C, 0x89A7, 0x89A7, 0x3826,
+ 0x89A9, 0x89A9, 0x3825, 0x89AA, 0x89AA, 0x134B, 0x89AC, 0x89AC, 0x1476,
+ 0x89AD, 0x89AD, 0x2E56, 0x89AE, 0x89AE, 0x2E58, 0x89AF, 0x89AF, 0x2E57,
+ 0x89B2, 0x89B2, 0x1528, 0x89B6, 0x89B6, 0x3120, 0x89B7, 0x89B7, 0x311F,
+ 0x89B9, 0x89B9, 0x3233, 0x89BA, 0x89BA, 0x1642, 0x89BC, 0x89BC, 0x3827,
+ 0x89BD, 0x89BD, 0x168E, 0x89BE, 0x89BE, 0x33B4, 0x89BF, 0x89BF, 0x33B3,
+ 0x89C0, 0x89C0, 0x1748, 0x89C1, 0x89C1, 0x4503, 0x89C6, 0x89C6, 0x4566,
+ 0x89D2, 0x89D2, 0x0509, 0x89D3, 0x89D3, 0x1C03, 0x89D4, 0x89D4, 0x0806,
+ 0x89D5, 0x89D5, 0x2066, 0x89D6, 0x89D6, 0x2064, 0x89D9, 0x89D9, 0x2065,
+ 0x89DA, 0x89DB, 0x22E7, 0x89DC, 0x89DC, 0x2588, 0x89DD, 0x89DD, 0x22E6,
+ 0x89DF, 0x89DF, 0x2582, 0x89E0, 0x89E0, 0x2586, 0x89E1, 0x89E1, 0x2585,
+ 0x89E2, 0x89E2, 0x2587, 0x89E3, 0x89E3, 0x0F06, 0x89E4, 0x89E4, 0x2584,
+ 0x89E5, 0x89E5, 0x2583, 0x89E6, 0x89E6, 0x2589, 0x89E7, 0x89E7, 0x3829,
+ 0x89E8, 0x89E8, 0x2802, 0x89E9, 0x89E9, 0x2800, 0x89EB, 0x89EB, 0x2801,
+ 0x89EC, 0x89EC, 0x2A41, 0x89ED, 0x89ED, 0x2A3F, 0x89F0, 0x89F0, 0x2A40,
+ 0x89F1, 0x89F1, 0x2C84, 0x89F2, 0x89F3, 0x2E59, 0x89F4, 0x89F4, 0x1529,
+ 0x89F6, 0x89F6, 0x3121, 0x89F7, 0x89F7, 0x3234, 0x89F8, 0x89F8, 0x1643,
+ 0x89FA, 0x89FA, 0x3310, 0x89FB, 0x89FB, 0x33B5, 0x89FC, 0x89FC, 0x16D7,
+ 0x89FE, 0x89FE, 0x343C, 0x89FF, 0x89FF, 0x34E6, 0x8A00, 0x8A00, 0x050A,
+ 0x8A02, 0x8A03, 0x0808, 0x8A04, 0x8A04, 0x1C04, 0x8A07, 0x8A07, 0x1C05,
+ 0x8A08, 0x8A08, 0x0807, 0x8A0A, 0x8A0A, 0x09C3, 0x8A0C, 0x8A0C, 0x09C1,
+ 0x8A0E, 0x8A0E, 0x09C0, 0x8A0F, 0x8A0F, 0x09C7, 0x8A10, 0x8A10, 0x09BF,
+ 0x8A11, 0x8A11, 0x09C8, 0x8A12, 0x8A12, 0x1E08, 0x8A13, 0x8A13, 0x09C5,
+ 0x8A15, 0x8A15, 0x09C2, 0x8A16, 0x8A16, 0x09C6, 0x8A17, 0x8A17, 0x09C4,
+ 0x8A18, 0x8A18, 0x09BE, 0x8A1B, 0x8A1B, 0x0BA5, 0x8A1C, 0x8A1C, 0x3BA3,
+ 0x8A1D, 0x8A1D, 0x0B9F, 0x8A1E, 0x8A1E, 0x206A, 0x8A1F, 0x8A1F, 0x0BA4,
+ 0x8A22, 0x8A22, 0x0BA6, 0x8A23, 0x8A23, 0x0BA0, 0x8A25, 0x8A25, 0x0BA1,
+ 0x8A27, 0x8A27, 0x2068, 0x8A29, 0x8A29, 0x43E5, 0x8A2A, 0x8A2A, 0x0B9E,
+ 0x8A2B, 0x8A2B, 0x3BD1, 0x8A2C, 0x8A2C, 0x2069, 0x8A2D, 0x8A2D, 0x0BA3,
+ 0x8A30, 0x8A30, 0x2067, 0x8A31, 0x8A31, 0x0BA2, 0x8A34, 0x8A34, 0x0D61,
+ 0x8A36, 0x8A36, 0x0D63, 0x8A38, 0x8A38, 0x477A, 0x8A39, 0x8A39, 0x22EB,
+ 0x8A3A, 0x8A3A, 0x0D62, 0x8A3B, 0x8A3B, 0x0D57, 0x8A3C, 0x8A3C, 0x0D5B,
+ 0x8A3D, 0x8A3D, 0x3BA2, 0x8A3E, 0x8A3E, 0x0F19, 0x8A3F, 0x8A3F, 0x258E,
+ 0x8A40, 0x8A40, 0x22ED, 0x8A41, 0x8A41, 0x0D5C, 0x8A44, 0x8A45, 0x22F0,
+ 0x8A46, 0x8A46, 0x0D60, 0x8A48, 0x8A48, 0x22F3, 0x8A49, 0x8A49, 0x3FF0,
+ 0x8A4A, 0x8A4A, 0x22F5, 0x8A4C, 0x8A4C, 0x22F6, 0x8A4D, 0x8A4D, 0x22EA,
+ 0x8A4E, 0x8A4E, 0x22E9, 0x8A4F, 0x8A4F, 0x22F7, 0x8A50, 0x8A50, 0x0D5F,
+ 0x8A51, 0x8A51, 0x22F4, 0x8A52, 0x8A52, 0x22F2, 0x8A54, 0x8A54, 0x0D5D,
+ 0x8A55, 0x8A55, 0x0D59, 0x8A56, 0x8A56, 0x0D64, 0x8A57, 0x8A58, 0x22EE,
+ 0x8A59, 0x8A59, 0x22EC, 0x8A5B, 0x8A5B, 0x0D5E, 0x8A5E, 0x8A5E, 0x0D5A,
+ 0x8A60, 0x8A60, 0x0D58, 0x8A61, 0x8A61, 0x258D, 0x8A62, 0x8A62, 0x0F14,
+ 0x8A63, 0x8A63, 0x0F0F, 0x8A66, 0x8A66, 0x0F0A, 0x8A67, 0x8A67, 0x3F8E,
+ 0x8A68, 0x8A68, 0x0F1A, 0x8A69, 0x8A69, 0x0F0B, 0x8A6B, 0x8A6B, 0x0F07,
+ 0x8A6C, 0x8A6C, 0x0F16, 0x8A6D, 0x8A6D, 0x0F13, 0x8A6E, 0x8A6E, 0x0F15,
+ 0x8A70, 0x8A70, 0x0F0C, 0x8A71, 0x8A71, 0x0F11, 0x8A72, 0x8A73, 0x0F08,
+ 0x8A74, 0x8A74, 0x2595, 0x8A75, 0x8A75, 0x2592, 0x8A76, 0x8A76, 0x258A,
+ 0x8A77, 0x8A77, 0x258F, 0x8A79, 0x8A79, 0x0F17, 0x8A7A, 0x8A7A, 0x2596,
+ 0x8A7B, 0x8A7B, 0x0F18, 0x8A7C, 0x8A7C, 0x0F0E, 0x8A7E, 0x8A7E, 0x3FA5,
+ 0x8A7F, 0x8A7F, 0x258C, 0x8A81, 0x8A81, 0x2594, 0x8A82, 0x8A82, 0x2590,
+ 0x8A83, 0x8A83, 0x2593, 0x8A84, 0x8A84, 0x2591, 0x8A85, 0x8A85, 0x0F12,
+ 0x8A86, 0x8A86, 0x258B, 0x8A87, 0x8A87, 0x0F0D, 0x8A8B, 0x8A8B, 0x2805,
+ 0x8A8C, 0x8A8C, 0x10A6, 0x8A8D, 0x8A8D, 0x10A9, 0x8A8F, 0x8A8F, 0x2807,
+ 0x8A90, 0x8A90, 0x382F, 0x8A91, 0x8A91, 0x10B1, 0x8A92, 0x8A92, 0x2806,
+ 0x8A93, 0x8A93, 0x10AB, 0x8A94, 0x8A94, 0x477B, 0x8A95, 0x8A95, 0x1216,
+ 0x8A96, 0x8A96, 0x2808, 0x8A98, 0x8A98, 0x10B0, 0x8A99, 0x8A99, 0x2804,
+ 0x8A9A, 0x8A9A, 0x10B2, 0x8A9C, 0x8A9C, 0x382C, 0x8A9E, 0x8A9E, 0x10A7,
+ 0x8AA0, 0x8AA0, 0x0F10, 0x8AA1, 0x8AA1, 0x10AA, 0x8AA3, 0x8AA3, 0x10A8,
+ 0x8AA4, 0x8AA4, 0x10AC, 0x8AA5, 0x8AA5, 0x10AE, 0x8AA6, 0x8AA6, 0x10A5,
+ 0x8AA7, 0x8AA7, 0x10B3, 0x8AA8, 0x8AA8, 0x10AF, 0x8AA9, 0x8AA9, 0x383D,
+ 0x8AAA, 0x8AAA, 0x10AD, 0x8AAB, 0x8AAB, 0x2803, 0x8AAF, 0x8AAF, 0x3841,
+ 0x8AB0, 0x8AB0, 0x121D, 0x8AB2, 0x8AB2, 0x1219, 0x8AB4, 0x8AB4, 0x477C,
+ 0x8AB6, 0x8AB6, 0x1220, 0x8AB8, 0x8AB8, 0x2A44, 0x8AB9, 0x8AB9, 0x1221,
+ 0x8ABA, 0x8ABA, 0x2A50, 0x8ABB, 0x8ABB, 0x2A49, 0x8ABC, 0x8ABC, 0x1212,
+ 0x8ABD, 0x8ABD, 0x2A51, 0x8ABE, 0x8ABE, 0x2A4B, 0x8ABF, 0x8ABF, 0x121C,
+ 0x8AC0, 0x8AC0, 0x2A4C, 0x8AC2, 0x8AC2, 0x121B, 0x8AC3, 0x8AC3, 0x2A4F,
+ 0x8AC4, 0x8AC4, 0x1215, 0x8AC5, 0x8AC5, 0x2A4D, 0x8AC6, 0x8AC6, 0x2A43,
+ 0x8AC7, 0x8AC7, 0x1214, 0x8AC8, 0x8AC8, 0x2C8F, 0x8AC9, 0x8AC9, 0x121A,
+ 0x8ACB, 0x8ACB, 0x1217, 0x8ACD, 0x8ACD, 0x121F, 0x8ACF, 0x8ACF, 0x2A42,
+ 0x8AD1, 0x8AD1, 0x2A46, 0x8AD2, 0x8AD2, 0x1213, 0x8AD3, 0x8AD3, 0x2A45,
+ 0x8AD4, 0x8AD5, 0x2A47, 0x8AD6, 0x8AD6, 0x121E, 0x8AD7, 0x8AD7, 0x2A4A,
+ 0x8AD8, 0x8AD8, 0x2A4E, 0x8AD9, 0x8AD9, 0x2A52, 0x8ADA, 0x8ADA, 0x39C2,
+ 0x8ADB, 0x8ADB, 0x1222, 0x8ADC, 0x8ADC, 0x1352, 0x8ADD, 0x8ADD, 0x2C8A,
+ 0x8ADE, 0x8ADE, 0x2C90, 0x8ADF, 0x8ADF, 0x2C8D, 0x8AE0, 0x8AE0, 0x2C85,
+ 0x8AE1, 0x8AE1, 0x2C91, 0x8AE2, 0x8AE2, 0x2C86, 0x8AE4, 0x8AE4, 0x2C8C,
+ 0x8AE6, 0x8AE6, 0x134D, 0x8AE7, 0x8AE7, 0x1353, 0x8AE8, 0x8AE8, 0x2C92,
+ 0x8AEA, 0x8AEA, 0x3DD9, 0x8AEB, 0x8AEB, 0x134F, 0x8AED, 0x8AED, 0x1359,
+ 0x8AEE, 0x8AEE, 0x1354, 0x8AEF, 0x8AEF, 0x2C94, 0x8AF0, 0x8AF0, 0x2C8E,
+ 0x8AF1, 0x8AF1, 0x1350, 0x8AF2, 0x8AF2, 0x2C87, 0x8AF3, 0x8AF3, 0x135A,
+ 0x8AF4, 0x8AF5, 0x2C88, 0x8AF6, 0x8AF6, 0x135B, 0x8AF7, 0x8AF7, 0x1358,
+ 0x8AF8, 0x8AF8, 0x1218, 0x8AFA, 0x8AFA, 0x134E, 0x8AFB, 0x8AFB, 0x2C95,
+ 0x8AFC, 0x8AFC, 0x135C, 0x8AFE, 0x8AFE, 0x1355, 0x8AFF, 0x8AFF, 0x2C93,
+ 0x8B00, 0x8B00, 0x1351, 0x8B01, 0x8B02, 0x1356, 0x8B04, 0x8B04, 0x147E,
+ 0x8B05, 0x8B05, 0x2E5F, 0x8B06, 0x8B06, 0x2E68, 0x8B07, 0x8B07, 0x2E65,
+ 0x8B08, 0x8B08, 0x2E67, 0x8B0A, 0x8B0A, 0x147B, 0x8B0B, 0x8B0B, 0x2E60,
+ 0x8B0C, 0x8B0C, 0x3836, 0x8B0D, 0x8B0D, 0x2E66, 0x8B0E, 0x8B0E, 0x1477,
+ 0x8B0F, 0x8B0F, 0x2E62, 0x8B10, 0x8B10, 0x147F, 0x8B11, 0x8B11, 0x2E5E,
+ 0x8B12, 0x8B12, 0x2E63, 0x8B13, 0x8B13, 0x2E6A, 0x8B14, 0x8B14, 0x2C8B,
+ 0x8B15, 0x8B15, 0x2E64, 0x8B16, 0x8B16, 0x2E5D, 0x8B17, 0x8B17, 0x1478,
+ 0x8B18, 0x8B18, 0x2E5C, 0x8B19, 0x8B19, 0x1479, 0x8B1A, 0x8B1A, 0x2E6B,
+ 0x8B1B, 0x8B1B, 0x147A, 0x8B1C, 0x8B1C, 0x2E69, 0x8B1D, 0x8B1D, 0x147D,
+ 0x8B1E, 0x8B1E, 0x2E5B, 0x8B1F, 0x8B1F, 0x3837, 0x8B20, 0x8B20, 0x147C,
+ 0x8B22, 0x8B22, 0x2E61, 0x8B23, 0x8B23, 0x2FCE, 0x8B24, 0x8B24, 0x2FDC,
+ 0x8B25, 0x8B25, 0x2FD7, 0x8B26, 0x8B26, 0x2FD9, 0x8B27, 0x8B27, 0x2FCD,
+ 0x8B28, 0x8B28, 0x152A, 0x8B2A, 0x8B2A, 0x2FCC, 0x8B2B, 0x8B2B, 0x152D,
+ 0x8B2C, 0x8B2C, 0x152C, 0x8B2D, 0x8B2D, 0x3F99, 0x8B2E, 0x8B2E, 0x2FDB,
+ 0x8B2F, 0x8B2F, 0x2FD3, 0x8B30, 0x8B30, 0x2FD0, 0x8B31, 0x8B31, 0x2FD6,
+ 0x8B33, 0x8B33, 0x2FCF, 0x8B35, 0x8B35, 0x2FD1, 0x8B36, 0x8B36, 0x2FDA,
+ 0x8B37, 0x8B37, 0x2FD8, 0x8B39, 0x8B39, 0x152B, 0x8B3A, 0x8B3A, 0x2FDF,
+ 0x8B3B, 0x8B3B, 0x2FDD, 0x8B3C, 0x8B3C, 0x2FD4, 0x8B3D, 0x8B3D, 0x2FDE,
+ 0x8B3E, 0x8B3E, 0x2FD5, 0x8B3F, 0x8B3F, 0x383A, 0x8B40, 0x8B40, 0x3125,
+ 0x8B41, 0x8B41, 0x15C4, 0x8B42, 0x8B42, 0x312C, 0x8B43, 0x8B43, 0x3FF2,
+ 0x8B45, 0x8B45, 0x3313, 0x8B46, 0x8B46, 0x15CB, 0x8B47, 0x8B47, 0x2FD2,
+ 0x8B48, 0x8B48, 0x3123, 0x8B49, 0x8B49, 0x15C7, 0x8B4A, 0x8B4A, 0x3124,
+ 0x8B4B, 0x8B4B, 0x3129, 0x8B4C, 0x8B4D, 0x383B, 0x8B4E, 0x8B4F, 0x15C9,
+ 0x8B50, 0x8B50, 0x3122, 0x8B51, 0x8B51, 0x312B, 0x8B52, 0x8B52, 0x312D,
+ 0x8B53, 0x8B53, 0x3126, 0x8B54, 0x8B54, 0x3128, 0x8B55, 0x8B55, 0x312A,
+ 0x8B56, 0x8B56, 0x3127, 0x8B57, 0x8B57, 0x312E, 0x8B58, 0x8B58, 0x15C6,
+ 0x8B59, 0x8B59, 0x15CC, 0x8B5A, 0x8B5A, 0x15C8, 0x8B5C, 0x8B5C, 0x15C5,
+ 0x8B5D, 0x8B5D, 0x3237, 0x8B5E, 0x8B5E, 0x3DB8, 0x8B5F, 0x8B5F, 0x1648,
+ 0x8B60, 0x8B60, 0x3235, 0x8B62, 0x8B62, 0x3DD4, 0x8B63, 0x8B63, 0x3239,
+ 0x8B65, 0x8B65, 0x323A, 0x8B66, 0x8B66, 0x1646, 0x8B67, 0x8B67, 0x323B,
+ 0x8B68, 0x8B68, 0x3238, 0x8B69, 0x8B69, 0x3BF7, 0x8B6A, 0x8B6A, 0x3236,
+ 0x8B6B, 0x8B6B, 0x1649, 0x8B6C, 0x8B6C, 0x1645, 0x8B6D, 0x8B6D, 0x323C,
+ 0x8B6F, 0x8B6F, 0x1647, 0x8B70, 0x8B70, 0x1644, 0x8B74, 0x8B74, 0x168F,
+ 0x8B77, 0x8B77, 0x1690, 0x8B78, 0x8B78, 0x3312, 0x8B79, 0x8B79, 0x3311,
+ 0x8B7A, 0x8B7B, 0x3314, 0x8B7D, 0x8B7D, 0x1691, 0x8B7E, 0x8B7E, 0x33B6,
+ 0x8B7F, 0x8B7F, 0x33BB, 0x8B80, 0x8B80, 0x16D8, 0x8B81, 0x8B81, 0x3D8D,
+ 0x8B82, 0x8B82, 0x33B8, 0x8B84, 0x8B84, 0x33B7, 0x8B85, 0x8B85, 0x33BA,
+ 0x8B86, 0x8B86, 0x33B9, 0x8B88, 0x8B88, 0x3440, 0x8B8A, 0x8B8A, 0x170A,
+ 0x8B8B, 0x8B8B, 0x343F, 0x8B8C, 0x8B8C, 0x343D, 0x8B8E, 0x8B8E, 0x343E,
+ 0x8B90, 0x8B90, 0x383F, 0x8B92, 0x8B92, 0x172C, 0x8B93, 0x8B93, 0x172B,
+ 0x8B94, 0x8B95, 0x349C, 0x8B96, 0x8B96, 0x172D, 0x8B98, 0x8B99, 0x34E7,
+ 0x8B9A, 0x8B9A, 0x1754, 0x8B9B, 0x8B9B, 0x3840, 0x8B9C, 0x8B9C, 0x175A,
+ 0x8B9E, 0x8B9E, 0x3522, 0x8B9F, 0x8B9F, 0x353F, 0x8BA0, 0x8BA0, 0x4505,
+ 0x8BBE, 0x8BBE, 0x4567, 0x8BE2, 0x8BE2, 0x4568, 0x8C37, 0x8C37, 0x050B,
+ 0x8C39, 0x8C39, 0x206B, 0x8C3B, 0x8C3B, 0x206C, 0x8C3C, 0x8C3C, 0x2597,
+ 0x8C3D, 0x8C3D, 0x2809, 0x8C3E, 0x8C3E, 0x2A53, 0x8C3F, 0x8C3F, 0x1481,
+ 0x8C41, 0x8C41, 0x1480, 0x8C42, 0x8C42, 0x2FE0, 0x8C43, 0x8C43, 0x312F,
+ 0x8C45, 0x8C45, 0x3441, 0x8C46, 0x8C46, 0x050C, 0x8C47, 0x8C47, 0x1E09,
+ 0x8C48, 0x8C48, 0x09C9, 0x8C49, 0x8C49, 0x0BA7, 0x8C4A, 0x8C4A, 0x2599,
+ 0x8C4B, 0x8C4B, 0x2598, 0x8C4C, 0x8C4C, 0x1223, 0x8C4D, 0x8C4D, 0x2A54,
+ 0x8C4E, 0x8C4E, 0x1224, 0x8C4F, 0x8C4F, 0x2E6C, 0x8C50, 0x8C50, 0x152E,
+ 0x8C51, 0x8C51, 0x477D, 0x8C54, 0x8C54, 0x1763, 0x8C55, 0x8C55, 0x050D,
+ 0x8C56, 0x8C56, 0x1A48, 0x8C57, 0x8C57, 0x1E0A, 0x8C5A, 0x8C5A, 0x0BA8,
+ 0x8C5C, 0x8C5D, 0x206D, 0x8C5F, 0x8C5F, 0x22F8, 0x8C61, 0x8C61, 0x0D65,
+ 0x8C62, 0x8C62, 0x0F1B, 0x8C64, 0x8C64, 0x259B, 0x8C65, 0x8C65, 0x259A,
+ 0x8C66, 0x8C66, 0x259C, 0x8C68, 0x8C69, 0x280A, 0x8C6A, 0x8C6A, 0x10B4,
+ 0x8C6B, 0x8C6B, 0x135D, 0x8C6C, 0x8C6C, 0x1225, 0x8C6D, 0x8C6D, 0x135E,
+ 0x8C6F, 0x8C6F, 0x2E70, 0x8C70, 0x8C70, 0x2E6D, 0x8C71, 0x8C71, 0x2E6F,
+ 0x8C72, 0x8C72, 0x2E6E, 0x8C73, 0x8C73, 0x1482, 0x8C75, 0x8C75, 0x2FE1,
+ 0x8C76, 0x8C76, 0x3131, 0x8C77, 0x8C77, 0x3130, 0x8C78, 0x8C78, 0x18E7,
+ 0x8C79, 0x8C79, 0x09CB, 0x8C7A, 0x8C7A, 0x09CA, 0x8C7B, 0x8C7B, 0x1E0B,
+ 0x8C7D, 0x8C7D, 0x206F, 0x8C80, 0x8C80, 0x22FA, 0x8C81, 0x8C81, 0x22F9,
+ 0x8C82, 0x8C82, 0x0D66, 0x8C84, 0x8C85, 0x259E, 0x8C86, 0x8C86, 0x259D,
+ 0x8C89, 0x8C89, 0x0F1D, 0x8C8A, 0x8C8A, 0x0F1C, 0x8C8C, 0x8C8C, 0x10B6,
+ 0x8C8D, 0x8C8D, 0x10B5, 0x8C8F, 0x8C8F, 0x2A55, 0x8C90, 0x8C90, 0x2C98,
+ 0x8C91, 0x8C92, 0x2C96, 0x8C93, 0x8C93, 0x135F, 0x8C94, 0x8C94, 0x2E72,
+ 0x8C95, 0x8C95, 0x2E71, 0x8C97, 0x8C97, 0x2FE4, 0x8C98, 0x8C98, 0x2FE3,
+ 0x8C99, 0x8C99, 0x2FE2, 0x8C9A, 0x8C9A, 0x3132, 0x8C9B, 0x8C9B, 0x3845,
+ 0x8C9C, 0x8C9C, 0x3523, 0x8C9D, 0x8C9D, 0x050E, 0x8C9E, 0x8C9E, 0x080A,
+ 0x8C9F, 0x8C9F, 0x3BAD, 0x8CA0, 0x8CA0, 0x080B, 0x8CA1, 0x8CA2, 0x09CC,
+ 0x8CA3, 0x8CA3, 0x1E0D, 0x8CA4, 0x8CA4, 0x1E0C, 0x8CA5, 0x8CA5, 0x2070,
+ 0x8CA7, 0x8CA7, 0x0BAE, 0x8CA8, 0x8CA8, 0x0BAC, 0x8CA9, 0x8CA9, 0x0BA9,
+ 0x8CAA, 0x8CAA, 0x0BAD, 0x8CAB, 0x8CAB, 0x0BAB, 0x8CAC, 0x8CAC, 0x0BAA,
+ 0x8CAD, 0x8CAD, 0x3FF1, 0x8CAF, 0x8CAF, 0x0D67, 0x8CB0, 0x8CB0, 0x22FD,
+ 0x8CB2, 0x8CB2, 0x0F22, 0x8CB3, 0x8CB3, 0x0D69, 0x8CB4, 0x8CB4, 0x0D6E,
+ 0x8CB5, 0x8CB5, 0x22FF, 0x8CB6, 0x8CB6, 0x0D70, 0x8CB7, 0x8CB7, 0x0D6F,
+ 0x8CB8, 0x8CB8, 0x0D72, 0x8CB9, 0x8CB9, 0x22FE, 0x8CBA, 0x8CBA, 0x22FB,
+ 0x8CBB, 0x8CBB, 0x0D6C, 0x8CBC, 0x8CBC, 0x0D68, 0x8CBD, 0x8CBD, 0x0D6A,
+ 0x8CBE, 0x8CBE, 0x22FC, 0x8CBF, 0x8CBF, 0x0D71, 0x8CC0, 0x8CC0, 0x0D6D,
+ 0x8CC1, 0x8CC1, 0x0D6B, 0x8CC2, 0x8CC2, 0x0F24, 0x8CC3, 0x8CC3, 0x0F23,
+ 0x8CC4, 0x8CC4, 0x0F21, 0x8CC5, 0x8CC5, 0x0F25, 0x8CC7, 0x8CC8, 0x0F1F,
+ 0x8CCA, 0x8CCA, 0x0F1E, 0x8CCC, 0x8CCC, 0x25A0, 0x8CCD, 0x8CCD, 0x3E99,
+ 0x8CCF, 0x8CCF, 0x280D, 0x8CD1, 0x8CD2, 0x10B8, 0x8CD3, 0x8CD3, 0x10B7,
+ 0x8CD4, 0x8CD4, 0x477E, 0x8CD5, 0x8CD5, 0x280C, 0x8CD6, 0x8CD6, 0x384B,
+ 0x8CD7, 0x8CD7, 0x280E, 0x8CD9, 0x8CD9, 0x2A58, 0x8CDA, 0x8CDA, 0x2A5A,
+ 0x8CDB, 0x8CDB, 0x3851, 0x8CDC, 0x8CDC, 0x122E, 0x8CDD, 0x8CDD, 0x2A5B,
+ 0x8CDE, 0x8CDE, 0x1227, 0x8CDF, 0x8CDF, 0x2A57, 0x8CE0, 0x8CE0, 0x1226,
+ 0x8CE1, 0x8CE1, 0x1230, 0x8CE2, 0x8CE3, 0x122C, 0x8CE4, 0x8CE4, 0x1229,
+ 0x8CE5, 0x8CE5, 0x2A56, 0x8CE6, 0x8CE6, 0x1228, 0x8CE7, 0x8CE7, 0x2A5C,
+ 0x8CE8, 0x8CE8, 0x2A59, 0x8CE9, 0x8CE9, 0x3BAE, 0x8CEA, 0x8CEA, 0x122F,
+ 0x8CEB, 0x8CEB, 0x3F9C, 0x8CEC, 0x8CED, 0x122A, 0x8CEE, 0x8CEE, 0x2C9A,
+ 0x8CF0, 0x8CF0, 0x2C9C, 0x8CF1, 0x8CF1, 0x2C9B, 0x8CF2, 0x8CF2, 0x477F,
+ 0x8CF3, 0x8CF3, 0x2C9D, 0x8CF4, 0x8CF4, 0x1360, 0x8CF5, 0x8CF5, 0x2C99,
+ 0x8CF7, 0x8CF7, 0x3FB1, 0x8CF8, 0x8CF8, 0x1486, 0x8CF9, 0x8CF9, 0x2E73,
+ 0x8CFA, 0x8CFA, 0x1483, 0x8CFB, 0x8CFB, 0x1487, 0x8CFC, 0x8CFC, 0x1485,
+ 0x8CFD, 0x8CFD, 0x1484, 0x8CFE, 0x8CFE, 0x2FE5, 0x8D00, 0x8D00, 0x2FE8,
+ 0x8D02, 0x8D02, 0x2FE7, 0x8D03, 0x8D03, 0x384F, 0x8D04, 0x8D04, 0x2FE6,
+ 0x8D05, 0x8D05, 0x152F, 0x8D06, 0x8D07, 0x3133, 0x8D08, 0x8D08, 0x15CD,
+ 0x8D09, 0x8D09, 0x3135, 0x8D0A, 0x8D0A, 0x15CE, 0x8D0B, 0x8D0B, 0x4573,
+ 0x8D0C, 0x8D0C, 0x3F96, 0x8D0D, 0x8D0D, 0x164B, 0x8D0F, 0x8D0F, 0x164A,
+ 0x8D10, 0x8D10, 0x3316, 0x8D11, 0x8D11, 0x3853, 0x8D12, 0x8D12, 0x384E,
+ 0x8D13, 0x8D13, 0x1692, 0x8D14, 0x8D14, 0x3317, 0x8D15, 0x8D15, 0x33BC,
+ 0x8D16, 0x8D17, 0x16D9, 0x8D18, 0x8D18, 0x3E6F, 0x8D19, 0x8D19, 0x3442,
+ 0x8D1B, 0x8D1B, 0x172F, 0x8D1C, 0x8D1C, 0x4780, 0x8D1D, 0x8D1D, 0x4506,
+ 0x8D64, 0x8D64, 0x050F, 0x8D66, 0x8D66, 0x0BB0, 0x8D67, 0x8D67, 0x0BAF,
+ 0x8D68, 0x8D69, 0x25A1, 0x8D6B, 0x8D6B, 0x10BA, 0x8D6C, 0x8D6C, 0x2C9E,
+ 0x8D6D, 0x8D6D, 0x1231, 0x8D6E, 0x8D6E, 0x2C9F, 0x8D6F, 0x8D6F, 0x2E74,
+ 0x8D70, 0x8D70, 0x0510, 0x8D72, 0x8D72, 0x1C06, 0x8D73, 0x8D73, 0x080D,
+ 0x8D74, 0x8D74, 0x080C, 0x8D76, 0x8D76, 0x1E0E, 0x8D77, 0x8D77, 0x09CE,
+ 0x8D78, 0x8D78, 0x1E0F, 0x8D79, 0x8D79, 0x2073, 0x8D7A, 0x8D7A, 0x39E1,
+ 0x8D7B, 0x8D7B, 0x2072, 0x8D7D, 0x8D7D, 0x2071, 0x8D80, 0x8D80, 0x2301,
+ 0x8D81, 0x8D81, 0x0D75, 0x8D82, 0x8D82, 0x3F69, 0x8D84, 0x8D84, 0x2300,
+ 0x8D85, 0x8D85, 0x0D74, 0x8D89, 0x8D89, 0x2302, 0x8D8A, 0x8D8A, 0x0D73,
+ 0x8D8C, 0x8D8C, 0x25A4, 0x8D8D, 0x8D8D, 0x25A7, 0x8D8E, 0x8D8F, 0x25A5,
+ 0x8D90, 0x8D90, 0x25AA, 0x8D91, 0x8D91, 0x25A3, 0x8D92, 0x8D92, 0x25AB,
+ 0x8D93, 0x8D94, 0x25A8, 0x8D95, 0x8D95, 0x10BC, 0x8D96, 0x8D96, 0x280F,
+ 0x8D99, 0x8D99, 0x10BB, 0x8D9B, 0x8D9B, 0x2A60, 0x8D9C, 0x8D9C, 0x2A5E,
+ 0x8D9F, 0x8D9F, 0x1232, 0x8DA0, 0x8DA0, 0x2A5D, 0x8DA1, 0x8DA1, 0x2A5F,
+ 0x8DA3, 0x8DA3, 0x1233, 0x8DA5, 0x8DA5, 0x2CA0, 0x8DA6, 0x8DA6, 0x3FF7,
+ 0x8DA7, 0x8DA7, 0x2CA1, 0x8DA8, 0x8DA8, 0x1488, 0x8DA9, 0x8DA9, 0x3856,
+ 0x8DAA, 0x8DAA, 0x3137, 0x8DAB, 0x8DAB, 0x3139, 0x8DAC, 0x8DAC, 0x3136,
+ 0x8DAD, 0x8DAD, 0x3138, 0x8DAE, 0x8DAE, 0x323D, 0x8DAF, 0x8DAF, 0x3318,
+ 0x8DB2, 0x8DB2, 0x3509, 0x8DB3, 0x8DB3, 0x0511, 0x8DB4, 0x8DB4, 0x080E,
+ 0x8DB5, 0x8DB5, 0x1E10, 0x8DB6, 0x8DB6, 0x1E12, 0x8DB7, 0x8DB7, 0x1E11,
+ 0x8DB9, 0x8DB9, 0x2076, 0x8DBA, 0x8DBA, 0x0BB2, 0x8DBC, 0x8DBC, 0x2074,
+ 0x8DBE, 0x8DBE, 0x0BB1, 0x8DBF, 0x8DBF, 0x2077, 0x8DC0, 0x8DC0, 0x436A,
+ 0x8DC1, 0x8DC1, 0x2078, 0x8DC2, 0x8DC2, 0x2075, 0x8DC3, 0x8DC3, 0x4782,
+ 0x8DC5, 0x8DC5, 0x230E, 0x8DC6, 0x8DC6, 0x0D7D, 0x8DC7, 0x8DC7, 0x2306,
+ 0x8DC8, 0x8DC8, 0x230C, 0x8DCB, 0x8DCB, 0x0D78, 0x8DCC, 0x8DCC, 0x0D7B,
+ 0x8DCD, 0x8DCD, 0x2305, 0x8DCE, 0x8DCE, 0x0D76, 0x8DCF, 0x8DCF, 0x2309,
+ 0x8DD0, 0x8DD0, 0x25B1, 0x8DD1, 0x8DD1, 0x0D7A, 0x8DD3, 0x8DD3, 0x2304,
+ 0x8DD4, 0x8DD4, 0x3F82, 0x8DD5, 0x8DD5, 0x230A, 0x8DD6, 0x8DD6, 0x2307,
+ 0x8DD7, 0x8DD7, 0x230D, 0x8DD8, 0x8DD8, 0x2303, 0x8DD9, 0x8DD9, 0x230B,
+ 0x8DDA, 0x8DDA, 0x0D79, 0x8DDB, 0x8DDB, 0x0D7C, 0x8DDC, 0x8DDC, 0x2308,
+ 0x8DDD, 0x8DDD, 0x0D77, 0x8DDF, 0x8DDF, 0x0F27, 0x8DE0, 0x8DE0, 0x25AD,
+ 0x8DE1, 0x8DE1, 0x0F26, 0x8DE2, 0x8DE2, 0x25B4, 0x8DE3, 0x8DE3, 0x25B3,
+ 0x8DE4, 0x8DE4, 0x0F2D, 0x8DE6, 0x8DE6, 0x0F2E, 0x8DE7, 0x8DE7, 0x25B5,
+ 0x8DE8, 0x8DE8, 0x0F28, 0x8DE9, 0x8DE9, 0x25B2, 0x8DEA, 0x8DEA, 0x0F2C,
+ 0x8DEB, 0x8DEB, 0x25B7, 0x8DEC, 0x8DEC, 0x25AE, 0x8DEE, 0x8DEE, 0x25B0,
+ 0x8DEF, 0x8DEF, 0x0F29, 0x8DF0, 0x8DF0, 0x25AC, 0x8DF1, 0x8DF1, 0x25AF,
+ 0x8DF2, 0x8DF2, 0x25B6, 0x8DF3, 0x8DF3, 0x0F2A, 0x8DF4, 0x8DF4, 0x25B8,
+ 0x8DFA, 0x8DFA, 0x0F2B, 0x8DFC, 0x8DFC, 0x10BD, 0x8DFD, 0x8DFD, 0x2814,
+ 0x8DFE, 0x8DFE, 0x281A, 0x8DFF, 0x8DFF, 0x2812, 0x8E00, 0x8E00, 0x281B,
+ 0x8E01, 0x8E01, 0x3F85, 0x8E02, 0x8E02, 0x2811, 0x8E03, 0x8E03, 0x2816,
+ 0x8E04, 0x8E04, 0x281C, 0x8E05, 0x8E05, 0x2819, 0x8E06, 0x8E06, 0x2818,
+ 0x8E07, 0x8E07, 0x2817, 0x8E09, 0x8E09, 0x2810, 0x8E0A, 0x8E0A, 0x2815,
+ 0x8E0D, 0x8E0D, 0x2813, 0x8E0E, 0x8E0E, 0x3E5E, 0x8E0F, 0x8E0F, 0x1238,
+ 0x8E10, 0x8E10, 0x1235, 0x8E11, 0x8E11, 0x2A69, 0x8E12, 0x8E12, 0x2A6E,
+ 0x8E13, 0x8E13, 0x2A70, 0x8E14, 0x8E14, 0x2A6D, 0x8E15, 0x8E15, 0x2A66,
+ 0x8E16, 0x8E16, 0x2A68, 0x8E17, 0x8E17, 0x2A72, 0x8E18, 0x8E18, 0x2A6F,
+ 0x8E19, 0x8E19, 0x2A6A, 0x8E1A, 0x8E1A, 0x2A73, 0x8E1B, 0x8E1B, 0x2A67,
+ 0x8E1C, 0x8E1C, 0x2A71, 0x8E1D, 0x8E1D, 0x1236, 0x8E1E, 0x8E1E, 0x123C,
+ 0x8E1F, 0x8E1F, 0x123A, 0x8E20, 0x8E20, 0x2A61, 0x8E21, 0x8E21, 0x123B,
+ 0x8E22, 0x8E22, 0x1237, 0x8E23, 0x8E23, 0x2A62, 0x8E24, 0x8E24, 0x2A64,
+ 0x8E25, 0x8E25, 0x2A63, 0x8E26, 0x8E27, 0x2A6B, 0x8E28, 0x8E28, 0x3F88,
+ 0x8E29, 0x8E29, 0x1239, 0x8E2A, 0x8E2A, 0x3BB4, 0x8E2B, 0x8E2B, 0x1234,
+ 0x8E2D, 0x8E2D, 0x3EAB, 0x8E2E, 0x8E2E, 0x2A65, 0x8E30, 0x8E30, 0x2CAB,
+ 0x8E31, 0x8E31, 0x1362, 0x8E33, 0x8E33, 0x2CA2, 0x8E34, 0x8E34, 0x1363,
+ 0x8E35, 0x8E35, 0x1366, 0x8E36, 0x8E36, 0x2CA7, 0x8E38, 0x8E38, 0x2CA4,
+ 0x8E39, 0x8E39, 0x1365, 0x8E3A, 0x8E3A, 0x4784, 0x8E3C, 0x8E3D, 0x2CA8,
+ 0x8E3E, 0x8E3E, 0x2CA3, 0x8E3F, 0x8E3F, 0x2CAC, 0x8E40, 0x8E40, 0x2CA5,
+ 0x8E41, 0x8E41, 0x2CAA, 0x8E42, 0x8E42, 0x1364, 0x8E44, 0x8E44, 0x1361,
+ 0x8E45, 0x8E45, 0x2CA6, 0x8E46, 0x8E46, 0x4312, 0x8E47, 0x8E47, 0x2E7A,
+ 0x8E48, 0x8E48, 0x148B, 0x8E49, 0x8E49, 0x1489, 0x8E4A, 0x8E4A, 0x148C,
+ 0x8E4B, 0x8E4B, 0x148A, 0x8E4C, 0x8E4C, 0x2E79, 0x8E4D, 0x8E4D, 0x2E76,
+ 0x8E4E, 0x8E4E, 0x2E75, 0x8E4F, 0x8E4F, 0x3F83, 0x8E50, 0x8E50, 0x2E78,
+ 0x8E53, 0x8E53, 0x2E77, 0x8E54, 0x8E54, 0x2FF6, 0x8E55, 0x8E55, 0x1535,
+ 0x8E56, 0x8E56, 0x2FED, 0x8E57, 0x8E57, 0x2FEC, 0x8E59, 0x8E59, 0x1530,
+ 0x8E5A, 0x8E5A, 0x2FF2, 0x8E5B, 0x8E5B, 0x2FF1, 0x8E5C, 0x8E5C, 0x2FE9,
+ 0x8E5D, 0x8E5D, 0x2FF4, 0x8E5E, 0x8E5E, 0x2FEE, 0x8E5F, 0x8E5F, 0x1534,
+ 0x8E60, 0x8E60, 0x2FEB, 0x8E61, 0x8E61, 0x2FF3, 0x8E62, 0x8E62, 0x2FEA,
+ 0x8E63, 0x8E63, 0x1531, 0x8E64, 0x8E64, 0x1533, 0x8E65, 0x8E65, 0x2FEF,
+ 0x8E66, 0x8E66, 0x1532, 0x8E67, 0x8E67, 0x2FF0, 0x8E68, 0x8E68, 0x434D,
+ 0x8E69, 0x8E69, 0x2FF5, 0x8E6A, 0x8E6A, 0x313D, 0x8E6C, 0x8E6C, 0x15D3,
+ 0x8E6D, 0x8E6D, 0x313A, 0x8E6F, 0x8E6F, 0x313E, 0x8E71, 0x8E71, 0x43E7,
+ 0x8E72, 0x8E72, 0x15D0, 0x8E73, 0x8E73, 0x313C, 0x8E74, 0x8E74, 0x15D5,
+ 0x8E75, 0x8E75, 0x3F89, 0x8E76, 0x8E76, 0x15D2, 0x8E77, 0x8E77, 0x3F7F,
+ 0x8E78, 0x8E78, 0x313B, 0x8E7A, 0x8E7A, 0x15D4, 0x8E7B, 0x8E7B, 0x313F,
+ 0x8E7C, 0x8E7C, 0x15CF, 0x8E7E, 0x8E7E, 0x4324, 0x8E80, 0x8E80, 0x3E57,
+ 0x8E81, 0x8E81, 0x164D, 0x8E82, 0x8E82, 0x164F, 0x8E84, 0x8E84, 0x3240,
+ 0x8E85, 0x8E85, 0x164E, 0x8E86, 0x8E86, 0x323E, 0x8E87, 0x8E87, 0x15D1,
+ 0x8E88, 0x8E88, 0x323F, 0x8E89, 0x8E89, 0x164C, 0x8E8A, 0x8E8A, 0x1693,
+ 0x8E8B, 0x8E8B, 0x1695, 0x8E8C, 0x8E8C, 0x331A, 0x8E8D, 0x8E8D, 0x1694,
+ 0x8E8E, 0x8E8E, 0x3319, 0x8E90, 0x8E90, 0x33C1, 0x8E91, 0x8E91, 0x16DB,
+ 0x8E92, 0x8E92, 0x33C0, 0x8E93, 0x8E93, 0x16DC, 0x8E94, 0x8E94, 0x33BE,
+ 0x8E95, 0x8E95, 0x33BD, 0x8E96, 0x8E97, 0x33C2, 0x8E98, 0x8E98, 0x3443,
+ 0x8E9A, 0x8E9A, 0x33BF, 0x8E9D, 0x8E9D, 0x34A1, 0x8E9E, 0x8EA0, 0x349E,
+ 0x8EA1, 0x8EA1, 0x1749, 0x8EA3, 0x8EA3, 0x34EB, 0x8EA4, 0x8EA4, 0x34EA,
+ 0x8EA5, 0x8EA5, 0x34E9, 0x8EA6, 0x8EA6, 0x350A, 0x8EA7, 0x8EA7, 0x3BB5,
+ 0x8EA8, 0x8EA8, 0x3537, 0x8EA9, 0x8EA9, 0x3524, 0x8EAA, 0x8EAA, 0x175B,
+ 0x8EAB, 0x8EAB, 0x0512, 0x8EAC, 0x8EAC, 0x09CF, 0x8EAD, 0x8EAD, 0x385E,
+ 0x8EB0, 0x8EB0, 0x43E9, 0x8EB2, 0x8EB2, 0x0F2F, 0x8EB6, 0x8EB6, 0x385F,
+ 0x8EBA, 0x8EBA, 0x123D, 0x8EBC, 0x8EBC, 0x38A0, 0x8EBD, 0x8EBD, 0x2CAD,
+ 0x8EC0, 0x8EC0, 0x1536, 0x8EC2, 0x8EC2, 0x3140, 0x8EC3, 0x8EC3, 0x3860,
+ 0x8EC9, 0x8EC9, 0x3525, 0x8ECA, 0x8ECA, 0x0513, 0x8ECB, 0x8ECB, 0x068D,
+ 0x8ECC, 0x8ECC, 0x0810, 0x8ECD, 0x8ECD, 0x080F, 0x8ECE, 0x8ECE, 0x4788,
+ 0x8ECF, 0x8ECF, 0x09D2, 0x8ED1, 0x8ED1, 0x1E13, 0x8ED2, 0x8ED2, 0x09D0,
+ 0x8ED3, 0x8ED3, 0x1E14, 0x8ED4, 0x8ED4, 0x09D1, 0x8ED7, 0x8ED7, 0x207D,
+ 0x8ED8, 0x8ED8, 0x2079, 0x8EDA, 0x8EDA, 0x3DBE, 0x8EDB, 0x8EDB, 0x0BB3,
+ 0x8EDC, 0x8EDC, 0x207C, 0x8EDD, 0x8EDD, 0x207B, 0x8EDE, 0x8EDE, 0x207A,
+ 0x8EDF, 0x8EDF, 0x0BB4, 0x8EE0, 0x8EE1, 0x207E, 0x8EE2, 0x8EE2, 0x4789,
+ 0x8EE4, 0x8EE4, 0x478A, 0x8EE5, 0x8EE5, 0x2315, 0x8EE6, 0x8EE6, 0x2313,
+ 0x8EE7, 0x8EE8, 0x2317, 0x8EE9, 0x8EE9, 0x231E, 0x8EEB, 0x8EEB, 0x231A,
+ 0x8EEC, 0x8EEC, 0x231C, 0x8EED, 0x8EED, 0x478B, 0x8EEE, 0x8EEE, 0x2314,
+ 0x8EEF, 0x8EEF, 0x230F, 0x8EF1, 0x8EF1, 0x231B, 0x8EF2, 0x8EF2, 0x478C,
+ 0x8EF4, 0x8EF4, 0x231D, 0x8EF5, 0x8EF5, 0x2316, 0x8EF6, 0x8EF6, 0x2319,
+ 0x8EF7, 0x8EF7, 0x2310, 0x8EF8, 0x8EF8, 0x0D7F, 0x8EF9, 0x8EF9, 0x2312,
+ 0x8EFA, 0x8EFA, 0x2311, 0x8EFB, 0x8EFB, 0x0D7E, 0x8EFC, 0x8EFC, 0x0D80,
+ 0x8EFE, 0x8EFE, 0x0F32, 0x8EFF, 0x8EFF, 0x25BA, 0x8F00, 0x8F00, 0x25BC,
+ 0x8F01, 0x8F01, 0x25BB, 0x8F02, 0x8F02, 0x25C0, 0x8F03, 0x8F03, 0x0F30,
+ 0x8F05, 0x8F05, 0x25BD, 0x8F06, 0x8F06, 0x25B9, 0x8F07, 0x8F08, 0x25BE,
+ 0x8F09, 0x8F09, 0x0F31, 0x8F0A, 0x8F0A, 0x0F33, 0x8F0B, 0x8F0B, 0x25C1,
+ 0x8F0D, 0x8F0D, 0x2820, 0x8F0E, 0x8F0E, 0x281F, 0x8F10, 0x8F11, 0x281D,
+ 0x8F12, 0x8F12, 0x10BF, 0x8F13, 0x8F13, 0x10C1, 0x8F14, 0x8F14, 0x10BE,
+ 0x8F15, 0x8F15, 0x10C0, 0x8F16, 0x8F17, 0x2A7A, 0x8F18, 0x8F18, 0x2A76,
+ 0x8F19, 0x8F19, 0x3862, 0x8F1A, 0x8F1A, 0x2A77, 0x8F1B, 0x8F1B, 0x123F,
+ 0x8F1C, 0x8F1C, 0x1244, 0x8F1D, 0x8F1D, 0x123E, 0x8F1E, 0x8F1E, 0x1245,
+ 0x8F1F, 0x8F1F, 0x1240, 0x8F20, 0x8F20, 0x2A78, 0x8F23, 0x8F23, 0x2A79,
+ 0x8F24, 0x8F24, 0x2A75, 0x8F25, 0x8F25, 0x1246, 0x8F26, 0x8F26, 0x1242,
+ 0x8F29, 0x8F29, 0x1241, 0x8F2A, 0x8F2A, 0x1243, 0x8F2C, 0x8F2C, 0x2A74,
+ 0x8F2D, 0x8F2D, 0x3863, 0x8F2E, 0x8F2E, 0x2CAF, 0x8F2F, 0x8F2F, 0x1368,
+ 0x8F30, 0x8F30, 0x3BB7, 0x8F32, 0x8F32, 0x2CB1, 0x8F33, 0x8F33, 0x136A,
+ 0x8F34, 0x8F34, 0x2CB4, 0x8F35, 0x8F35, 0x2CB0, 0x8F36, 0x8F36, 0x2CAE,
+ 0x8F37, 0x8F37, 0x2CB3, 0x8F38, 0x8F38, 0x1369, 0x8F39, 0x8F39, 0x2CB2,
+ 0x8F3B, 0x8F3B, 0x1367, 0x8F3E, 0x8F3E, 0x148E, 0x8F3F, 0x8F3F, 0x1491,
+ 0x8F40, 0x8F40, 0x2E7C, 0x8F41, 0x8F41, 0x3D07, 0x8F42, 0x8F42, 0x148F,
+ 0x8F43, 0x8F43, 0x2E7B, 0x8F44, 0x8F44, 0x148D, 0x8F45, 0x8F45, 0x1490,
+ 0x8F46, 0x8F48, 0x2FF7, 0x8F49, 0x8F49, 0x1537, 0x8F4A, 0x8F4A, 0x3BB8,
+ 0x8F4B, 0x8F4B, 0x2FFA, 0x8F4D, 0x8F4D, 0x1538, 0x8F4E, 0x8F4E, 0x15D7,
+ 0x8F4F, 0x8F50, 0x3143, 0x8F51, 0x8F51, 0x3142, 0x8F52, 0x8F52, 0x3141,
+ 0x8F53, 0x8F53, 0x3145, 0x8F54, 0x8F54, 0x15D6, 0x8F55, 0x8F55, 0x3244,
+ 0x8F56, 0x8F57, 0x3242, 0x8F58, 0x8F58, 0x3245, 0x8F59, 0x8F59, 0x3241,
+ 0x8F5A, 0x8F5A, 0x3246, 0x8F5B, 0x8F5B, 0x331C, 0x8F5C, 0x8F5C, 0x3F31,
+ 0x8F5D, 0x8F5D, 0x331D, 0x8F5E, 0x8F5E, 0x331B, 0x8F5F, 0x8F5F, 0x1696,
+ 0x8F60, 0x8F60, 0x33C4, 0x8F61, 0x8F61, 0x16DD, 0x8F62, 0x8F62, 0x33C5,
+ 0x8F63, 0x8F63, 0x3445, 0x8F64, 0x8F64, 0x3444, 0x8F66, 0x8F67, 0x4569,
+ 0x8F6E, 0x8F6E, 0x456B, 0x8F93, 0x8F93, 0x4732, 0x8F9B, 0x8F9B, 0x0514,
+ 0x8F9C, 0x8F9C, 0x0D81, 0x8F9F, 0x8F9F, 0x0F34, 0x8FA0, 0x8FA0, 0x3D94,
+ 0x8FA3, 0x8FA3, 0x10C2, 0x8FA5, 0x8FA5, 0x3866, 0x8FA6, 0x8FA6, 0x136C,
+ 0x8FA8, 0x8FA8, 0x136B, 0x8FAD, 0x8FAD, 0x15D8, 0x8FAE, 0x8FAE, 0x162F,
+ 0x8FAF, 0x8FAF, 0x1697, 0x8FB0, 0x8FB0, 0x0515, 0x8FB1, 0x8FB1, 0x09D3,
+ 0x8FB2, 0x8FB2, 0x0F35, 0x8FB3, 0x8FB3, 0x386A, 0x8FB4, 0x8FB4, 0x3146,
+ 0x8FB5, 0x8FB5, 0x0230, 0x8FB6, 0x8FB6, 0x47D3, 0x8FB7, 0x8FB7, 0x43FD,
+ 0x8FB8, 0x8FB8, 0x42F6, 0x8FB9, 0x8FB9, 0x48C9, 0x8FBA, 0x8FBA, 0x48C7,
+ 0x8FBB, 0x8FBC, 0x3D6B, 0x8FBE, 0x8FBE, 0x48C6, 0x8FBF, 0x8FBF, 0x18E9,
+ 0x8FC1, 0x8FC1, 0x478D, 0x8FC2, 0x8FC2, 0x0516, 0x8FC4, 0x8FC4, 0x0519,
+ 0x8FC5, 0x8FC5, 0x0518, 0x8FC6, 0x8FC6, 0x0517, 0x8FC9, 0x8FC9, 0x18E8,
+ 0x8FCA, 0x8FCA, 0x478E, 0x8FCB, 0x8FCB, 0x1A4A, 0x8FCC, 0x8FCC, 0x478F,
+ 0x8FCD, 0x8FCD, 0x1A4C, 0x8FCE, 0x8FCE, 0x068E, 0x8FD0, 0x8FD0, 0x48AE,
+ 0x8FD1, 0x8FD1, 0x0690, 0x8FD2, 0x8FD2, 0x1A49, 0x8FD3, 0x8FD3, 0x1A4B,
+ 0x8FD4, 0x8FD4, 0x068F, 0x8FD5, 0x8FD5, 0x1A4E, 0x8FD6, 0x8FD6, 0x1A4D,
+ 0x8FD7, 0x8FD7, 0x1A4F, 0x8FDA, 0x8FDA, 0x3FCB, 0x8FE0, 0x8FE0, 0x1C0A,
+ 0x8FE1, 0x8FE1, 0x1C08, 0x8FE2, 0x8FE2, 0x0813, 0x8FE3, 0x8FE3, 0x1C07,
+ 0x8FE4, 0x8FE4, 0x0818, 0x8FE5, 0x8FE5, 0x0815, 0x8FE6, 0x8FE6, 0x0812,
+ 0x8FE8, 0x8FE8, 0x0819, 0x8FEA, 0x8FEA, 0x0814, 0x8FEB, 0x8FEB, 0x0817,
+ 0x8FED, 0x8FED, 0x0816, 0x8FEE, 0x8FEE, 0x1C09, 0x8FF0, 0x8FF0, 0x0811,
+ 0x8FF4, 0x8FF4, 0x09D9, 0x8FF5, 0x8FF5, 0x1E16, 0x8FF6, 0x8FF6, 0x1E1C,
+ 0x8FF7, 0x8FF7, 0x09D6, 0x8FF8, 0x8FF8, 0x09DD, 0x8FF9, 0x8FF9, 0x3871,
+ 0x8FFA, 0x8FFA, 0x09D8, 0x8FFB, 0x8FFB, 0x1E19, 0x8FFC, 0x8FFC, 0x1E1B,
+ 0x8FFD, 0x8FFD, 0x09DB, 0x8FFE, 0x8FFE, 0x1E15, 0x8FFF, 0x8FFF, 0x1E18,
+ 0x9000, 0x9000, 0x09D7, 0x9001, 0x9001, 0x09D4, 0x9002, 0x9002, 0x1E17,
+ 0x9003, 0x9003, 0x09DA, 0x9004, 0x9004, 0x1E1A, 0x9005, 0x9005, 0x09DC,
+ 0x9006, 0x9006, 0x09D5, 0x9008, 0x9008, 0x3EE0, 0x900B, 0x900B, 0x2081,
+ 0x900C, 0x900C, 0x2084, 0x900D, 0x900D, 0x0BB6, 0x900F, 0x900F, 0x0BC0,
+ 0x9010, 0x9010, 0x0BBC, 0x9011, 0x9011, 0x2082, 0x9012, 0x9012, 0x3E4E,
+ 0x9014, 0x9014, 0x0BC4, 0x9015, 0x9015, 0x0BBD, 0x9016, 0x9016, 0x0BC2,
+ 0x9017, 0x9017, 0x0BB8, 0x9019, 0x9019, 0x0BB5, 0x901A, 0x901A, 0x0BB7,
+ 0x901B, 0x901B, 0x0BC3, 0x901C, 0x901C, 0x2083, 0x901D, 0x901D, 0x0BBB,
+ 0x901E, 0x901E, 0x0BBE, 0x901F, 0x901F, 0x0BBA, 0x9020, 0x9020, 0x0BBF,
+ 0x9021, 0x9021, 0x2085, 0x9022, 0x9022, 0x0BC1, 0x9023, 0x9023, 0x0BB9,
+ 0x9024, 0x9024, 0x2080, 0x902D, 0x902D, 0x231F, 0x902E, 0x902E, 0x0D82,
+ 0x902F, 0x902F, 0x2321, 0x9031, 0x9031, 0x0D84, 0x9032, 0x9032, 0x0D86,
+ 0x9033, 0x9033, 0x4790, 0x9034, 0x9034, 0x2320, 0x9035, 0x9035, 0x0D83,
+ 0x9036, 0x9036, 0x0D87, 0x9037, 0x9037, 0x3876, 0x9038, 0x9038, 0x0D85,
+ 0x903C, 0x903C, 0x0F3B, 0x903D, 0x903D, 0x25C6, 0x903E, 0x903E, 0x0F43,
+ 0x903F, 0x903F, 0x25C3, 0x9041, 0x9041, 0x0F44, 0x9042, 0x9042, 0x0F39,
+ 0x9044, 0x9044, 0x25C4, 0x9047, 0x9047, 0x0F3E, 0x9049, 0x9049, 0x25C5,
+ 0x904A, 0x904A, 0x0F37, 0x904B, 0x904B, 0x0F36, 0x904C, 0x904C, 0x3F10,
+ 0x904D, 0x904D, 0x0F41, 0x904E, 0x904E, 0x0F40, 0x904F, 0x904F, 0x0F3F,
+ 0x9050, 0x9050, 0x0F3D, 0x9051, 0x9051, 0x0F42, 0x9052, 0x9052, 0x25C2,
+ 0x9053, 0x9053, 0x0F38, 0x9054, 0x9054, 0x0F3A, 0x9055, 0x9055, 0x0F3C,
+ 0x9056, 0x9056, 0x3DD2, 0x9058, 0x9058, 0x10C4, 0x9059, 0x9059, 0x10C7,
+ 0x905B, 0x905B, 0x10CB, 0x905C, 0x905C, 0x10C5, 0x905D, 0x905D, 0x10CA,
+ 0x905E, 0x905E, 0x10C8, 0x9060, 0x9060, 0x10C3, 0x9061, 0x9061, 0x3879,
+ 0x9062, 0x9062, 0x10C9, 0x9063, 0x9063, 0x10C6, 0x9064, 0x9064, 0x3C68,
+ 0x9067, 0x9067, 0x2A7F, 0x9068, 0x9068, 0x1249, 0x9069, 0x9069, 0x1247,
+ 0x906B, 0x906B, 0x2A80, 0x906C, 0x906C, 0x3D60, 0x906D, 0x906D, 0x124A,
+ 0x906E, 0x906E, 0x1248, 0x906F, 0x906F, 0x2A7E, 0x9070, 0x9070, 0x2A7D,
+ 0x9072, 0x9072, 0x1370, 0x9073, 0x9073, 0x2A7C, 0x9074, 0x9074, 0x136E,
+ 0x9075, 0x9075, 0x136D, 0x9076, 0x9076, 0x2CB5, 0x9077, 0x9077, 0x124B,
+ 0x9078, 0x9078, 0x136F, 0x9079, 0x9079, 0x2CB6, 0x907A, 0x907A, 0x1372,
+ 0x907B, 0x907B, 0x2CB7, 0x907C, 0x907C, 0x1371, 0x907D, 0x907D, 0x1493,
+ 0x907E, 0x907E, 0x2E7E, 0x907F, 0x907F, 0x1492, 0x9080, 0x9080, 0x1497,
+ 0x9081, 0x9082, 0x1495, 0x9083, 0x9083, 0x153A, 0x9084, 0x9084, 0x1494,
+ 0x9085, 0x9085, 0x2E7D, 0x9086, 0x9086, 0x2CB8, 0x9087, 0x9087, 0x1539,
+ 0x9088, 0x9088, 0x153B, 0x908A, 0x908B, 0x15D9, 0x908D, 0x908D, 0x3247,
+ 0x908F, 0x908F, 0x170C, 0x9090, 0x9090, 0x170B, 0x9091, 0x9091, 0x051B,
+ 0x9094, 0x9094, 0x181E, 0x9095, 0x9095, 0x09DE, 0x9097, 0x9098, 0x181B,
+ 0x9099, 0x9099, 0x181A, 0x909B, 0x909B, 0x181D, 0x909E, 0x909E, 0x18ED,
+ 0x909F, 0x909F, 0x18EA, 0x90A0, 0x90A0, 0x18EF, 0x90A1, 0x90A1, 0x18EB,
+ 0x90A2, 0x90A2, 0x051C, 0x90A3, 0x90A3, 0x051F, 0x90A5, 0x90A5, 0x18EC,
+ 0x90A6, 0x90A6, 0x051E, 0x90A7, 0x90A7, 0x18EE, 0x90A8, 0x90A8, 0x387C,
+ 0x90AA, 0x90AA, 0x051D, 0x90AE, 0x90AE, 0x3880, 0x90AF, 0x90AF, 0x1A52,
+ 0x90B0, 0x90B0, 0x1A54, 0x90B1, 0x90B1, 0x0693, 0x90B2, 0x90B2, 0x1A50,
+ 0x90B3, 0x90B3, 0x1A53, 0x90B4, 0x90B4, 0x1A51, 0x90B5, 0x90B5, 0x0691,
+ 0x90B6, 0x90B6, 0x0694, 0x90B8, 0x90B8, 0x0692, 0x90BB, 0x90BB, 0x3BC4,
+ 0x90BD, 0x90BD, 0x1C0C, 0x90BE, 0x90BE, 0x1C10, 0x90BF, 0x90BF, 0x1C0D,
+ 0x90C1, 0x90C1, 0x081C, 0x90C3, 0x90C3, 0x081D, 0x90C4, 0x90C4, 0x387E,
+ 0x90C5, 0x90C5, 0x1C0F, 0x90C7, 0x90C7, 0x1C11, 0x90C8, 0x90C8, 0x1C13,
+ 0x90CA, 0x90CA, 0x081A, 0x90CB, 0x90CB, 0x1C12, 0x90CE, 0x90CE, 0x081B,
+ 0x90D4, 0x90D4, 0x208C, 0x90D5, 0x90D5, 0x1C0E, 0x90D6, 0x90D6, 0x1E1D,
+ 0x90D7, 0x90D7, 0x1E26, 0x90D8, 0x90D8, 0x1E24, 0x90D9, 0x90DA, 0x1E1F,
+ 0x90DB, 0x90DB, 0x1E25, 0x90DC, 0x90DC, 0x1E27, 0x90DD, 0x90DD, 0x09E0,
+ 0x90DF, 0x90DF, 0x1E22, 0x90E0, 0x90E0, 0x1E1E, 0x90E1, 0x90E1, 0x09DF,
+ 0x90E2, 0x90E2, 0x09E1, 0x90E3, 0x90E3, 0x1E21, 0x90E4, 0x90E4, 0x1E28,
+ 0x90E5, 0x90E5, 0x1E23, 0x90E8, 0x90E8, 0x0BC5, 0x90E9, 0x90E9, 0x208F,
+ 0x90EA, 0x90EA, 0x2087, 0x90EB, 0x90EC, 0x208D, 0x90ED, 0x90ED, 0x0BC6,
+ 0x90EF, 0x90EF, 0x2086, 0x90F0, 0x90F0, 0x2088, 0x90F1, 0x90F1, 0x1C0B,
+ 0x90F2, 0x90F3, 0x208A, 0x90F4, 0x90F4, 0x2089, 0x90F5, 0x90F5, 0x0D89,
+ 0x90F9, 0x90F9, 0x2328, 0x90FA, 0x90FA, 0x2CB9, 0x90FB, 0x90FB, 0x2329,
+ 0x90FC, 0x90FC, 0x2326, 0x90FD, 0x90FD, 0x0BC7, 0x90FE, 0x90FE, 0x0D8B,
+ 0x90FF, 0x90FF, 0x2325, 0x9100, 0x9100, 0x232B, 0x9101, 0x9101, 0x232A,
+ 0x9102, 0x9102, 0x0D88, 0x9103, 0x9103, 0x232E, 0x9104, 0x9104, 0x2324,
+ 0x9105, 0x9105, 0x232D, 0x9106, 0x9106, 0x2322, 0x9107, 0x9107, 0x232C,
+ 0x9108, 0x9108, 0x2327, 0x9109, 0x9109, 0x0D8A, 0x910B, 0x910B, 0x25CD,
+ 0x910D, 0x910D, 0x25C8, 0x910E, 0x910E, 0x25CE, 0x910F, 0x910F, 0x25C9,
+ 0x9110, 0x9110, 0x25C7, 0x9111, 0x9111, 0x25CA, 0x9112, 0x9112, 0x0F45,
+ 0x9114, 0x9114, 0x25CC, 0x9116, 0x9116, 0x25CB, 0x9117, 0x9117, 0x0F46,
+ 0x9118, 0x9118, 0x10CD, 0x9119, 0x9119, 0x10CC, 0x911A, 0x911A, 0x2827,
+ 0x911B, 0x911B, 0x282A, 0x911C, 0x911C, 0x2822, 0x911D, 0x911D, 0x2826,
+ 0x911E, 0x911E, 0x10CE, 0x911F, 0x911F, 0x2825, 0x9120, 0x9120, 0x2823,
+ 0x9121, 0x9121, 0x2829, 0x9122, 0x9122, 0x2824, 0x9123, 0x9123, 0x2821,
+ 0x9124, 0x9124, 0x2828, 0x9126, 0x9126, 0x2A86, 0x9127, 0x9127, 0x124E,
+ 0x9128, 0x9128, 0x2FFB, 0x9129, 0x912A, 0x2A83, 0x912B, 0x912B, 0x2A82,
+ 0x912C, 0x912C, 0x2323, 0x912D, 0x912D, 0x124D, 0x912E, 0x912E, 0x2A87,
+ 0x912F, 0x912F, 0x2A81, 0x9130, 0x9130, 0x124C, 0x9131, 0x9131, 0x124F,
+ 0x9132, 0x9132, 0x2A85, 0x9133, 0x9133, 0x2CBA, 0x9134, 0x9134, 0x1373,
+ 0x9135, 0x9136, 0x2CBB, 0x9138, 0x9138, 0x2E7F, 0x9139, 0x9139, 0x1498,
+ 0x913A, 0x913B, 0x2FFC, 0x913E, 0x913E, 0x2FFE, 0x913F, 0x913F, 0x3148,
+ 0x9140, 0x9140, 0x3147, 0x9141, 0x9141, 0x3249, 0x9143, 0x9143, 0x3248,
+ 0x9144, 0x9145, 0x331F, 0x9146, 0x9146, 0x331E, 0x9147, 0x9147, 0x33C6,
+ 0x9148, 0x9148, 0x16DE, 0x9149, 0x9149, 0x0520, 0x914A, 0x914A, 0x081F,
+ 0x914B, 0x914B, 0x081E, 0x914C, 0x914C, 0x09E4, 0x914D, 0x914D, 0x09E3,
+ 0x914E, 0x914F, 0x1E2A, 0x9150, 0x9150, 0x1E29, 0x9151, 0x9151, 0x3F49,
+ 0x9152, 0x9152, 0x09E2, 0x9153, 0x9153, 0x2093, 0x9155, 0x9155, 0x2094,
+ 0x9156, 0x9156, 0x2090, 0x9157, 0x9157, 0x0BC8, 0x9158, 0x9158, 0x2091,
+ 0x9159, 0x9159, 0x3F45, 0x915A, 0x915A, 0x2092, 0x915C, 0x915C, 0x3F47,
+ 0x915E, 0x915E, 0x43EB, 0x915F, 0x915F, 0x2331, 0x9160, 0x9160, 0x2333,
+ 0x9161, 0x9161, 0x232F, 0x9162, 0x9162, 0x2332, 0x9163, 0x9163, 0x0D8C,
+ 0x9164, 0x9164, 0x2330, 0x9165, 0x9165, 0x0D8D, 0x9167, 0x9167, 0x3882,
+ 0x9168, 0x9168, 0x23E2, 0x9169, 0x9169, 0x0F49, 0x916A, 0x916A, 0x0F48,
+ 0x916C, 0x916C, 0x0F47, 0x916E, 0x916F, 0x25CF, 0x9170, 0x9170, 0x3EB8,
+ 0x9172, 0x9172, 0x282C, 0x9173, 0x9173, 0x282E, 0x9174, 0x9174, 0x10D2,
+ 0x9175, 0x9175, 0x10CF, 0x9176, 0x9176, 0x3E9B, 0x9177, 0x9177, 0x10D1,
+ 0x9178, 0x9178, 0x10D0, 0x9179, 0x9179, 0x282D, 0x917A, 0x917A, 0x282B,
+ 0x917C, 0x917C, 0x3F6F, 0x9180, 0x9180, 0x2A8E, 0x9181, 0x9182, 0x2A8B,
+ 0x9183, 0x9183, 0x1253, 0x9184, 0x9184, 0x2A8D, 0x9185, 0x9186, 0x2A88,
+ 0x9187, 0x9187, 0x1250, 0x9189, 0x9189, 0x1251, 0x918A, 0x918A, 0x2A8A,
+ 0x918B, 0x918B, 0x1252, 0x918C, 0x918C, 0x43EC, 0x918D, 0x918D, 0x2CC0,
+ 0x918E, 0x918E, 0x3F4E, 0x918F, 0x918F, 0x2CC1, 0x9190, 0x9191, 0x2CBE,
+ 0x9192, 0x9192, 0x1374, 0x9193, 0x9193, 0x2CBD, 0x9199, 0x9199, 0x2E83,
+ 0x919A, 0x919A, 0x2E80, 0x919B, 0x919B, 0x2E82, 0x919C, 0x919C, 0x149B,
+ 0x919D, 0x919D, 0x2E86, 0x919E, 0x919E, 0x149A, 0x919F, 0x919F, 0x2E84,
+ 0x91A0, 0x91A0, 0x2E87, 0x91A1, 0x91A1, 0x2E85, 0x91A2, 0x91A2, 0x2E81,
+ 0x91A3, 0x91A3, 0x1499, 0x91A5, 0x91A5, 0x3000, 0x91A7, 0x91A7, 0x3001,
+ 0x91A8, 0x91A8, 0x2FFF, 0x91A9, 0x91A9, 0x3883, 0x91AA, 0x91AA, 0x3003,
+ 0x91AB, 0x91AC, 0x153C, 0x91AD, 0x91AD, 0x314A, 0x91AE, 0x91AE, 0x15DC,
+ 0x91AF, 0x91AF, 0x3002, 0x91B0, 0x91B0, 0x3149, 0x91B1, 0x91B1, 0x15DB,
+ 0x91B2, 0x91B3, 0x324C, 0x91B4, 0x91B4, 0x1650, 0x91B5, 0x91B5, 0x324B,
+ 0x91B6, 0x91B6, 0x45EF, 0x91B7, 0x91B7, 0x324A, 0x91B9, 0x91B9, 0x3321,
+ 0x91BA, 0x91BA, 0x1698, 0x91BB, 0x91BB, 0x3BC8, 0x91BC, 0x91BC, 0x3446,
+ 0x91BD, 0x91BD, 0x34A3, 0x91BE, 0x91BE, 0x34A2, 0x91C0, 0x91C0, 0x1730,
+ 0x91C1, 0x91C1, 0x174A, 0x91C2, 0x91C2, 0x34A4, 0x91C3, 0x91C3, 0x350B,
+ 0x91C4, 0x91C4, 0x3884, 0x91C5, 0x91C5, 0x175C, 0x91C6, 0x91C6, 0x0521,
+ 0x91C7, 0x91C7, 0x0695, 0x91C9, 0x91C9, 0x0F4A, 0x91CB, 0x91CB, 0x1651,
+ 0x91CC, 0x91CC, 0x0522, 0x91CD, 0x91CD, 0x0820, 0x91CE, 0x91CE, 0x0BC9,
+ 0x91CF, 0x91CF, 0x0D8E, 0x91D0, 0x91D0, 0x153E, 0x91D1, 0x91D1, 0x0696,
+ 0x91D3, 0x91D3, 0x1C15, 0x91D4, 0x91D4, 0x1C14, 0x91D5, 0x91D5, 0x1E2C,
+ 0x91D6, 0x91D6, 0x415E, 0x91D7, 0x91D7, 0x09E7, 0x91D8, 0x91D8, 0x09E5,
+ 0x91D9, 0x91D9, 0x09E9, 0x91DA, 0x91DA, 0x1E2E, 0x91DC, 0x91DC, 0x09E8,
+ 0x91DD, 0x91DD, 0x09E6, 0x91DF, 0x91DF, 0x453A, 0x91E2, 0x91E2, 0x1E2D,
+ 0x91E3, 0x91E3, 0x0BCC, 0x91E4, 0x91E4, 0x209A, 0x91E5, 0x91E5, 0x3C06,
+ 0x91E6, 0x91E6, 0x0BCB, 0x91E7, 0x91E7, 0x0BCD, 0x91E8, 0x91E8, 0x209F,
+ 0x91E9, 0x91E9, 0x0BCF, 0x91EA, 0x91EB, 0x209C, 0x91EC, 0x91EC, 0x2095,
+ 0x91ED, 0x91ED, 0x0BCE, 0x91EE, 0x91EE, 0x20A0, 0x91F1, 0x91F1, 0x2097,
+ 0x91F3, 0x91F3, 0x2098, 0x91F4, 0x91F4, 0x2096, 0x91F5, 0x91F5, 0x0BCA,
+ 0x91F7, 0x91F7, 0x209E, 0x91F8, 0x91F8, 0x2099, 0x91F9, 0x91F9, 0x209B,
+ 0x91FA, 0x91FA, 0x3AF8, 0x91FD, 0x91FD, 0x233F, 0x91FE, 0x91FE, 0x382E,
+ 0x91FF, 0x91FF, 0x233E, 0x9200, 0x9200, 0x233C, 0x9201, 0x9201, 0x2334,
+ 0x9202, 0x9202, 0x2343, 0x9203, 0x9203, 0x2337, 0x9204, 0x9204, 0x2341,
+ 0x9205, 0x9205, 0x2348, 0x9206, 0x9206, 0x2340, 0x9207, 0x9207, 0x0D96,
+ 0x9208, 0x9208, 0x3EB9, 0x9209, 0x9209, 0x0D92, 0x920A, 0x920A, 0x2335,
+ 0x920C, 0x920C, 0x233B, 0x920D, 0x920D, 0x0D94, 0x920E, 0x920E, 0x3888,
+ 0x920F, 0x920F, 0x233A, 0x9210, 0x9210, 0x0D95, 0x9211, 0x9211, 0x0D97,
+ 0x9212, 0x9212, 0x233D, 0x9213, 0x9213, 0x4793, 0x9214, 0x9215, 0x0D8F,
+ 0x9216, 0x9216, 0x2349, 0x9217, 0x9217, 0x2347, 0x9219, 0x9219, 0x2346,
+ 0x921A, 0x921A, 0x2338, 0x921C, 0x921C, 0x2344, 0x921E, 0x921E, 0x0D93,
+ 0x9223, 0x9223, 0x0D91, 0x9224, 0x9224, 0x2345, 0x9225, 0x9225, 0x2336,
+ 0x9226, 0x9226, 0x2339, 0x9227, 0x9227, 0x2342, 0x9228, 0x9228, 0x4795,
+ 0x922A, 0x922A, 0x3C0E, 0x922B, 0x922B, 0x3BA6, 0x922D, 0x922D, 0x2851,
+ 0x922E, 0x922E, 0x25DA, 0x9230, 0x9230, 0x25D3, 0x9231, 0x9231, 0x25E6,
+ 0x9232, 0x9232, 0x25EF, 0x9233, 0x9233, 0x25D6, 0x9234, 0x9234, 0x0F55,
+ 0x9235, 0x9235, 0x3B26, 0x9236, 0x9236, 0x25E3, 0x9237, 0x9237, 0x0F4B,
+ 0x9238, 0x9238, 0x0F4D, 0x9239, 0x9239, 0x0F59, 0x923A, 0x923A, 0x25D4,
+ 0x923C, 0x923C, 0x41D2, 0x923D, 0x923D, 0x0F4E, 0x923E, 0x923E, 0x0F50,
+ 0x923F, 0x923F, 0x0F5A, 0x9240, 0x9240, 0x0F4F, 0x9241, 0x9241, 0x388A,
+ 0x9244, 0x9244, 0x389A, 0x9245, 0x9245, 0x0F58, 0x9246, 0x9246, 0x25DC,
+ 0x9248, 0x9248, 0x25D1, 0x9249, 0x9249, 0x0F56, 0x924A, 0x924A, 0x25DB,
+ 0x924B, 0x924B, 0x0F52, 0x924C, 0x924C, 0x25ED, 0x924D, 0x924D, 0x0F57,
+ 0x924E, 0x924E, 0x25EB, 0x924F, 0x924F, 0x25DF, 0x9250, 0x9250, 0x25E9,
+ 0x9251, 0x9251, 0x0F54, 0x9252, 0x9252, 0x25D2, 0x9253, 0x9253, 0x25EC,
+ 0x9254, 0x9254, 0x25E7, 0x9255, 0x9255, 0x3E47, 0x9256, 0x9256, 0x25EE,
+ 0x9257, 0x9257, 0x0F4C, 0x9258, 0x9258, 0x4796, 0x925A, 0x925A, 0x0F5B,
+ 0x925B, 0x925B, 0x0F51, 0x925D, 0x925D, 0x3A03, 0x925E, 0x925E, 0x25D8,
+ 0x925F, 0x925F, 0x3CE0, 0x9260, 0x9260, 0x25E0, 0x9261, 0x9261, 0x25E4,
+ 0x9262, 0x9262, 0x388B, 0x9263, 0x9263, 0x25E8, 0x9264, 0x9264, 0x0F53,
+ 0x9265, 0x9265, 0x25D7, 0x9266, 0x9266, 0x25D5, 0x9267, 0x9267, 0x25E1,
+ 0x926B, 0x926B, 0x4797, 0x926C, 0x926C, 0x25DE, 0x926D, 0x926D, 0x25DD,
+ 0x926E, 0x926E, 0x3D05, 0x926F, 0x926F, 0x25E2, 0x9270, 0x9270, 0x25E5,
+ 0x9272, 0x9272, 0x25EA, 0x9276, 0x9276, 0x2831, 0x9277, 0x9277, 0x3C64,
+ 0x9278, 0x9278, 0x10D3, 0x9279, 0x9279, 0x283B, 0x927A, 0x927A, 0x2833,
+ 0x927B, 0x927B, 0x10D9, 0x927C, 0x927C, 0x10DD, 0x927D, 0x927D, 0x2844,
+ 0x927E, 0x927E, 0x284C, 0x927F, 0x927F, 0x283D, 0x9280, 0x9280, 0x10D5,
+ 0x9281, 0x9281, 0x3E01, 0x9282, 0x9282, 0x2841, 0x9283, 0x9283, 0x25D9,
+ 0x9284, 0x9284, 0x3CB9, 0x9285, 0x9285, 0x10D6, 0x9286, 0x9286, 0x2848,
+ 0x9287, 0x9287, 0x284D, 0x9288, 0x9288, 0x2845, 0x9289, 0x9289, 0x3AB5,
+ 0x928A, 0x928A, 0x2847, 0x928B, 0x928B, 0x2850, 0x928C, 0x928C, 0x2849,
+ 0x928D, 0x928D, 0x2837, 0x928E, 0x928E, 0x2840, 0x928F, 0x928F, 0x46BD,
+ 0x9291, 0x9291, 0x10DE, 0x9293, 0x9293, 0x10DA, 0x9294, 0x9294, 0x2835,
+ 0x9295, 0x9295, 0x2842, 0x9296, 0x9296, 0x10D8, 0x9297, 0x9297, 0x283C,
+ 0x9298, 0x9298, 0x10D7, 0x9299, 0x9299, 0x284A, 0x929A, 0x929A, 0x2839,
+ 0x929B, 0x929B, 0x2832, 0x929C, 0x929C, 0x10DB, 0x929D, 0x929D, 0x284F,
+ 0x92A0, 0x92A0, 0x2834, 0x92A1, 0x92A1, 0x2846, 0x92A2, 0x92A2, 0x2843,
+ 0x92A3, 0x92A3, 0x283E, 0x92A4, 0x92A4, 0x2830, 0x92A5, 0x92A5, 0x282F,
+ 0x92A6, 0x92A6, 0x2838, 0x92A7, 0x92A7, 0x284B, 0x92A8, 0x92A8, 0x10DC,
+ 0x92A9, 0x92A9, 0x284E, 0x92AA, 0x92AA, 0x2836, 0x92AB, 0x92AB, 0x283A,
+ 0x92AC, 0x92AC, 0x10D4, 0x92AE, 0x92AE, 0x4799, 0x92B1, 0x92B1, 0x4798,
+ 0x92B2, 0x92B2, 0x125F, 0x92B3, 0x92B3, 0x125A, 0x92B4, 0x92B4, 0x2AB0,
+ 0x92B5, 0x92B5, 0x2AAC, 0x92B6, 0x92B6, 0x2A94, 0x92B7, 0x92B7, 0x1256,
+ 0x92B9, 0x92B9, 0x36E9, 0x92BA, 0x92BA, 0x3BF5, 0x92BB, 0x92BB, 0x1255,
+ 0x92BC, 0x92BC, 0x125B, 0x92BE, 0x92BE, 0x3C60, 0x92BF, 0x92BF, 0x479A,
+ 0x92C0, 0x92C0, 0x2A92, 0x92C1, 0x92C1, 0x1259, 0x92C2, 0x92C2, 0x2A9E,
+ 0x92C3, 0x92C4, 0x2A90, 0x92C5, 0x92C5, 0x1254, 0x92C6, 0x92C6, 0x2AAF,
+ 0x92C7, 0x92C7, 0x125D, 0x92C8, 0x92C8, 0x2AA1, 0x92C9, 0x92C9, 0x2AA6,
+ 0x92CA, 0x92CA, 0x2AA0, 0x92CB, 0x92CB, 0x2CD3, 0x92CC, 0x92CC, 0x2A9C,
+ 0x92CD, 0x92CD, 0x2AA4, 0x92CE, 0x92CE, 0x2AA2, 0x92CF, 0x92CF, 0x2A95,
+ 0x92D0, 0x92D0, 0x2A8F, 0x92D1, 0x92D1, 0x2AAA, 0x92D2, 0x92D2, 0x125C,
+ 0x92D3, 0x92D3, 0x2AAB, 0x92D4, 0x92D4, 0x3861, 0x92D5, 0x92D5, 0x2AA5,
+ 0x92D7, 0x92D7, 0x2A9A, 0x92D8, 0x92D8, 0x2A98, 0x92D9, 0x92D9, 0x2A93,
+ 0x92DB, 0x92DB, 0x400C, 0x92DD, 0x92DD, 0x2A9B, 0x92DE, 0x92DE, 0x2AA8,
+ 0x92DF, 0x92DF, 0x2A97, 0x92E0, 0x92E0, 0x2AA7, 0x92E1, 0x92E1, 0x2AAD,
+ 0x92E3, 0x92E3, 0x479B, 0x92E4, 0x92E4, 0x1258, 0x92E5, 0x92E5, 0x3CA2,
+ 0x92E6, 0x92E6, 0x2AA3, 0x92E7, 0x92E7, 0x2AA9, 0x92E8, 0x92E8, 0x2A9F,
+ 0x92E9, 0x92E9, 0x2A99, 0x92EA, 0x92EA, 0x1257, 0x92EB, 0x92EB, 0x479C,
+ 0x92EC, 0x92EC, 0x3964, 0x92EE, 0x92EE, 0x283F, 0x92EF, 0x92EF, 0x2A9D,
+ 0x92F0, 0x92F0, 0x125E, 0x92F1, 0x92F1, 0x2A96, 0x92F2, 0x92F2, 0x3AB2,
+ 0x92F3, 0x92F4, 0x479D, 0x92F6, 0x92F6, 0x3C04, 0x92F7, 0x92F7, 0x2CD8,
+ 0x92F8, 0x92F8, 0x1377, 0x92F9, 0x92F9, 0x2CD7, 0x92FA, 0x92FA, 0x2CD5,
+ 0x92FB, 0x92FB, 0x2CE7, 0x92FC, 0x92FC, 0x137B, 0x92FD, 0x92FD, 0x479F,
+ 0x92FE, 0x92FE, 0x2CE4, 0x92FF, 0x92FF, 0x2CDC, 0x9300, 0x9300, 0x2CE6,
+ 0x9301, 0x9301, 0x2CCE, 0x9302, 0x9302, 0x2CDA, 0x9303, 0x9303, 0x3867,
+ 0x9304, 0x9304, 0x137D, 0x9306, 0x9306, 0x2CC6, 0x9307, 0x9307, 0x3B11,
+ 0x9308, 0x9308, 0x2CC4, 0x9309, 0x9309, 0x2CE5, 0x930B, 0x930B, 0x2CE3,
+ 0x930C, 0x930C, 0x2CE2, 0x930D, 0x930D, 0x2CD2, 0x930E, 0x930E, 0x2CD1,
+ 0x930F, 0x930F, 0x2CC7, 0x9310, 0x9310, 0x137F, 0x9312, 0x9312, 0x2CCD,
+ 0x9313, 0x9313, 0x2CD6, 0x9314, 0x9314, 0x2CE1, 0x9315, 0x9315, 0x1382,
+ 0x9316, 0x9316, 0x2CE8, 0x9318, 0x9318, 0x14A3, 0x9319, 0x9319, 0x1384,
+ 0x931A, 0x931A, 0x137E, 0x931B, 0x931B, 0x2CCB, 0x931D, 0x931D, 0x2CD4,
+ 0x931E, 0x931E, 0x2CC3, 0x931F, 0x931F, 0x2CC5, 0x9320, 0x9320, 0x1375,
+ 0x9321, 0x9321, 0x1381, 0x9322, 0x9322, 0x137A, 0x9323, 0x9323, 0x2CCC,
+ 0x9324, 0x9324, 0x2CDB, 0x9325, 0x9325, 0x2AAE, 0x9326, 0x9326, 0x1380,
+ 0x9327, 0x9327, 0x2CC2, 0x9328, 0x9328, 0x149E, 0x9329, 0x9329, 0x2CDD,
+ 0x932A, 0x932A, 0x2CE0, 0x932B, 0x932B, 0x137C, 0x932C, 0x932C, 0x3892,
+ 0x932D, 0x932D, 0x2CD0, 0x932E, 0x932E, 0x1383, 0x932F, 0x932F, 0x1379,
+ 0x9330, 0x9330, 0x3E03, 0x9331, 0x9331, 0x3CBD, 0x9333, 0x9333, 0x1378,
+ 0x9334, 0x9334, 0x2CD9, 0x9335, 0x9335, 0x2CDF, 0x9336, 0x9336, 0x1376,
+ 0x9338, 0x9338, 0x2CC9, 0x9339, 0x9339, 0x2CDE, 0x933C, 0x933C, 0x2CCA,
+ 0x9340, 0x9340, 0x4155, 0x9341, 0x9341, 0x4277, 0x9342, 0x9342, 0x3AFA,
+ 0x9343, 0x9343, 0x47A0, 0x9344, 0x9344, 0x4016, 0x9345, 0x9345, 0x3E74,
+ 0x9346, 0x9346, 0x2CCF, 0x9347, 0x9347, 0x2E8D, 0x9348, 0x9348, 0x3C61,
+ 0x9349, 0x9349, 0x2E92, 0x934A, 0x934A, 0x14A0, 0x934B, 0x934B, 0x14A2,
+ 0x934C, 0x934C, 0x2E98, 0x934D, 0x934D, 0x149C, 0x934E, 0x934E, 0x2EA6,
+ 0x934F, 0x934F, 0x2E9E, 0x9350, 0x9351, 0x2E93, 0x9352, 0x9352, 0x2E9D,
+ 0x9354, 0x9354, 0x14A9, 0x9355, 0x9355, 0x2E9C, 0x9356, 0x9356, 0x2E8C,
+ 0x9357, 0x9357, 0x2E9B, 0x9358, 0x9358, 0x2E8F, 0x9359, 0x9359, 0x2EA7,
+ 0x935A, 0x935A, 0x14A8, 0x935B, 0x935B, 0x14A6, 0x935C, 0x935C, 0x2E90,
+ 0x935E, 0x935E, 0x2EA3, 0x935F, 0x935F, 0x3CBB, 0x9360, 0x9360, 0x2E95,
+ 0x9361, 0x9361, 0x2EA2, 0x9362, 0x9362, 0x4268, 0x9363, 0x9363, 0x2EA4,
+ 0x9364, 0x9364, 0x2E8B, 0x9365, 0x9365, 0x14A1, 0x9366, 0x9366, 0x46BC,
+ 0x9367, 0x9367, 0x2EA5, 0x9368, 0x9368, 0x3BF0, 0x9369, 0x9369, 0x3961,
+ 0x936A, 0x936A, 0x2E99, 0x936B, 0x936B, 0x3893, 0x936C, 0x936C, 0x14A5,
+ 0x936D, 0x936D, 0x2E96, 0x936E, 0x936E, 0x39E8, 0x9370, 0x9370, 0x14A7,
+ 0x9371, 0x9371, 0x2E9F, 0x9373, 0x9373, 0x389E, 0x9374, 0x9374, 0x3CE4,
+ 0x9375, 0x9375, 0x149F, 0x9376, 0x9376, 0x2E91, 0x9377, 0x9377, 0x2EA0,
+ 0x9378, 0x9378, 0x38F9, 0x9379, 0x9379, 0x2E9A, 0x937A, 0x937A, 0x2CC8,
+ 0x937B, 0x937B, 0x2EA1, 0x937C, 0x937C, 0x2E8E, 0x937D, 0x937D, 0x3C25,
+ 0x937E, 0x937E, 0x14A4, 0x9380, 0x9380, 0x3014, 0x9381, 0x9381, 0x3965,
+ 0x9382, 0x9382, 0x149D, 0x9383, 0x9383, 0x2E89, 0x9384, 0x9384, 0x47A1,
+ 0x9385, 0x9385, 0x42BD, 0x9386, 0x9386, 0x3CC0, 0x9387, 0x9387, 0x3AE0,
+ 0x9388, 0x9388, 0x3011, 0x9389, 0x9389, 0x300A, 0x938A, 0x938A, 0x1540,
+ 0x938C, 0x938C, 0x3005, 0x938D, 0x938D, 0x3015, 0x938E, 0x938E, 0x300C,
+ 0x938F, 0x938F, 0x2E97, 0x9390, 0x9390, 0x3D3C, 0x9391, 0x9391, 0x3017,
+ 0x9392, 0x9392, 0x3006, 0x9394, 0x9394, 0x153F, 0x9395, 0x9395, 0x3010,
+ 0x9396, 0x9396, 0x1541, 0x9397, 0x9397, 0x1549, 0x9398, 0x9398, 0x1547,
+ 0x9399, 0x9399, 0x3012, 0x939A, 0x939A, 0x1548, 0x939B, 0x939B, 0x3008,
+ 0x939C, 0x939C, 0x39AC, 0x939D, 0x939D, 0x3009, 0x939E, 0x939E, 0x300E,
+ 0x939F, 0x939F, 0x3013, 0x93A0, 0x93A0, 0x3AB1, 0x93A1, 0x93A1, 0x2E88,
+ 0x93A2, 0x93A2, 0x1542, 0x93A3, 0x93A3, 0x301C, 0x93A4, 0x93A4, 0x3019,
+ 0x93A5, 0x93A5, 0x3160, 0x93A6, 0x93A6, 0x300F, 0x93A7, 0x93A7, 0x300B,
+ 0x93A8, 0x93A8, 0x301A, 0x93A9, 0x93A9, 0x3155, 0x93AA, 0x93AA, 0x300D,
+ 0x93AC, 0x93AC, 0x1545, 0x93AD, 0x93AD, 0x47A2, 0x93AE, 0x93AE, 0x1544,
+ 0x93AF, 0x93AF, 0x2E8A, 0x93B0, 0x93B0, 0x1546, 0x93B1, 0x93B1, 0x3016,
+ 0x93B2, 0x93B2, 0x3018, 0x93B3, 0x93B3, 0x1543, 0x93B4, 0x93B4, 0x301B,
+ 0x93B5, 0x93B5, 0x3004, 0x93B7, 0x93B7, 0x3007, 0x93B8, 0x93B8, 0x3C90,
+ 0x93BA, 0x93BA, 0x43F7, 0x93BB, 0x93BB, 0x3C8F, 0x93BD, 0x93BD, 0x3A27,
+ 0x93BF, 0x93BF, 0x3E2D, 0x93C0, 0x93C0, 0x315E, 0x93C2, 0x93C2, 0x314E,
+ 0x93C3, 0x93C3, 0x15E0, 0x93C4, 0x93C4, 0x315C, 0x93C6, 0x93C6, 0x39AA,
+ 0x93C7, 0x93C7, 0x314C, 0x93C8, 0x93C8, 0x15E1, 0x93CA, 0x93CA, 0x3157,
+ 0x93CB, 0x93CB, 0x3966, 0x93CC, 0x93CC, 0x3153, 0x93CD, 0x93CD, 0x15E6,
+ 0x93CE, 0x93CE, 0x315D, 0x93CF, 0x93CF, 0x314D, 0x93D0, 0x93D0, 0x3150,
+ 0x93D1, 0x93D1, 0x15DE, 0x93D2, 0x93D2, 0x315F, 0x93D3, 0x93D3, 0x40E1,
+ 0x93D4, 0x93D4, 0x3158, 0x93D5, 0x93D5, 0x315B, 0x93D6, 0x93D6, 0x15E4,
+ 0x93D7, 0x93D7, 0x15E9, 0x93D8, 0x93D8, 0x15E7, 0x93D9, 0x93D9, 0x3154,
+ 0x93DA, 0x93DA, 0x314F, 0x93DB, 0x93DB, 0x3C5F, 0x93DC, 0x93DD, 0x15E2,
+ 0x93DE, 0x93DE, 0x314B, 0x93DF, 0x93DF, 0x15DF, 0x93E0, 0x93E0, 0x3A20,
+ 0x93E1, 0x93E1, 0x15DD, 0x93E2, 0x93E2, 0x15E5, 0x93E3, 0x93E3, 0x315A,
+ 0x93E4, 0x93E4, 0x15E8, 0x93E6, 0x93E6, 0x3156, 0x93E7, 0x93E7, 0x3161,
+ 0x93E8, 0x93E8, 0x15EA, 0x93EC, 0x93EC, 0x3152, 0x93EE, 0x93EE, 0x3159,
+ 0x93F0, 0x93F0, 0x423F, 0x93F1, 0x93F1, 0x42AA, 0x93F3, 0x93F3, 0x3962,
+ 0x93F5, 0x93F5, 0x325A, 0x93F6, 0x93F6, 0x3269, 0x93F7, 0x93F7, 0x325C,
+ 0x93F8, 0x93F8, 0x3263, 0x93F9, 0x93F9, 0x3151, 0x93FA, 0x93FA, 0x3261,
+ 0x93FB, 0x93FB, 0x3250, 0x93FC, 0x93FC, 0x3267, 0x93FD, 0x93FD, 0x1654,
+ 0x93FE, 0x93FE, 0x3254, 0x93FF, 0x93FF, 0x3266, 0x9400, 0x9400, 0x325B,
+ 0x9401, 0x9401, 0x3CD4, 0x9403, 0x9403, 0x1653, 0x9404, 0x9404, 0x3BC9,
+ 0x9406, 0x9406, 0x326B, 0x9407, 0x9407, 0x325D, 0x9408, 0x9408, 0x3A25,
+ 0x9409, 0x9409, 0x3262, 0x940A, 0x940A, 0x3265, 0x940B, 0x940B, 0x324E,
+ 0x940C, 0x940C, 0x3268, 0x940D, 0x940D, 0x3259, 0x940E, 0x940E, 0x325E,
+ 0x940F, 0x940F, 0x3252, 0x9410, 0x9410, 0x3256, 0x9411, 0x9411, 0x326A,
+ 0x9412, 0x9412, 0x3260, 0x9413, 0x9413, 0x324F, 0x9414, 0x9414, 0x3253,
+ 0x9415, 0x9415, 0x3255, 0x9416, 0x9416, 0x325F, 0x9417, 0x9417, 0x47A5,
+ 0x9418, 0x9418, 0x1652, 0x9419, 0x9419, 0x3258, 0x941B, 0x941B, 0x4148,
+ 0x941D, 0x941D, 0x47A6, 0x9420, 0x9420, 0x3251, 0x9424, 0x9424, 0x3943,
+ 0x9425, 0x9425, 0x38D0, 0x9426, 0x9426, 0x38A3, 0x9427, 0x9427, 0x3BCD,
+ 0x9428, 0x9428, 0x3257, 0x9429, 0x9429, 0x3325, 0x942A, 0x942A, 0x3329,
+ 0x942B, 0x942B, 0x169F, 0x942C, 0x942C, 0x332B, 0x942D, 0x942D, 0x47A7,
+ 0x942E, 0x942E, 0x1699, 0x9430, 0x9430, 0x3327, 0x9431, 0x9431, 0x332D,
+ 0x9432, 0x9432, 0x169E, 0x9433, 0x9433, 0x169A, 0x9435, 0x9435, 0x169B,
+ 0x9436, 0x9436, 0x3324, 0x9437, 0x9437, 0x332A, 0x9438, 0x9438, 0x169D,
+ 0x9439, 0x9439, 0x3328, 0x943A, 0x943A, 0x169C, 0x943B, 0x943B, 0x3323,
+ 0x943C, 0x943C, 0x3264, 0x943D, 0x943D, 0x3326, 0x943E, 0x943E, 0x47A8,
+ 0x943F, 0x943F, 0x3322, 0x9440, 0x9440, 0x332C, 0x9442, 0x9442, 0x4272,
+ 0x9443, 0x9443, 0x4275, 0x9444, 0x9444, 0x16DF, 0x9445, 0x9445, 0x33CD,
+ 0x9446, 0x9446, 0x33D0, 0x9447, 0x9447, 0x33CC, 0x9448, 0x9449, 0x33CE,
+ 0x944A, 0x944B, 0x33C9, 0x944C, 0x944C, 0x33C7, 0x944D, 0x944D, 0x3C65,
+ 0x944F, 0x944F, 0x33CB, 0x9450, 0x9450, 0x33C8, 0x9451, 0x9452, 0x16E0,
+ 0x9454, 0x9454, 0x47AA, 0x9455, 0x9455, 0x3448, 0x9457, 0x9457, 0x344A,
+ 0x9458, 0x9458, 0x3C30, 0x945B, 0x945B, 0x389F, 0x945D, 0x945D, 0x3449,
+ 0x945E, 0x945E, 0x344B, 0x9460, 0x9460, 0x170E, 0x9462, 0x9462, 0x3447,
+ 0x9463, 0x9463, 0x170D, 0x9464, 0x9464, 0x170F, 0x9465, 0x9465, 0x3DDE,
+ 0x9467, 0x9467, 0x3AB8, 0x9468, 0x9469, 0x34A6, 0x946A, 0x946A, 0x1731,
+ 0x946B, 0x946B, 0x34A5, 0x946C, 0x946C, 0x377E, 0x946D, 0x946D, 0x34ED,
+ 0x946E, 0x946E, 0x34EC, 0x946F, 0x946F, 0x34EE, 0x9470, 0x9470, 0x174C,
+ 0x9471, 0x9471, 0x34EF, 0x9472, 0x9472, 0x174B, 0x9473, 0x9473, 0x34F0,
+ 0x9474, 0x9474, 0x350C, 0x9475, 0x9475, 0x350F, 0x9476, 0x9476, 0x350E,
+ 0x9477, 0x9477, 0x1755, 0x9478, 0x9478, 0x350D, 0x9479, 0x9479, 0x47AB,
+ 0x947B, 0x947B, 0x419B, 0x947C, 0x947C, 0x175F, 0x947D, 0x947E, 0x175D,
+ 0x947F, 0x947F, 0x1764, 0x9480, 0x9481, 0x3539, 0x9482, 0x9482, 0x3538,
+ 0x9483, 0x9483, 0x3540, 0x9485, 0x9485, 0x4507, 0x949F, 0x949F, 0x4885,
+ 0x94A2, 0x94A2, 0x451B, 0x94C1, 0x94C1, 0x47E1, 0x94C3, 0x94C3, 0x47DF,
+ 0x94DC, 0x94DC, 0x47D7, 0x94F6, 0x94F6, 0x47D2, 0x952D, 0x952D, 0x47AC,
+ 0x9547, 0x9547, 0x48BF, 0x9577, 0x9577, 0x0697, 0x9578, 0x9578, 0x4508,
+ 0x957A, 0x957A, 0x20A1, 0x957B, 0x957B, 0x234A, 0x957C, 0x957C, 0x2AB1,
+ 0x957D, 0x957D, 0x3162, 0x957F, 0x957F, 0x4509, 0x9580, 0x9580, 0x0698,
+ 0x9582, 0x9582, 0x0821, 0x9583, 0x9583, 0x09EA, 0x9585, 0x9585, 0x38A1,
+ 0x9586, 0x9586, 0x20A2, 0x9588, 0x9588, 0x20A3, 0x9589, 0x9589, 0x0BD0,
+ 0x958B, 0x958B, 0x0D9A, 0x958C, 0x958C, 0x234C, 0x958D, 0x958D, 0x234B,
+ 0x958E, 0x958E, 0x0D9E, 0x958F, 0x958F, 0x0D99, 0x9590, 0x9590, 0x234D,
+ 0x9591, 0x9591, 0x0D9B, 0x9592, 0x9592, 0x0D9D, 0x9593, 0x9593, 0x0D9C,
+ 0x9594, 0x9594, 0x0D98, 0x9596, 0x9596, 0x3BD5, 0x9597, 0x9597, 0x3BD4,
+ 0x9598, 0x9598, 0x0F5C, 0x9599, 0x9599, 0x3BD2, 0x959B, 0x959B, 0x25F3,
+ 0x959C, 0x959C, 0x25F1, 0x959E, 0x959E, 0x25F2, 0x959F, 0x959F, 0x25F0,
+ 0x95A0, 0x95A0, 0x38A4, 0x95A1, 0x95A1, 0x10DF, 0x95A2, 0x95A2, 0x47AD,
+ 0x95A3, 0x95A3, 0x10E2, 0x95A4, 0x95A4, 0x10E4, 0x95A5, 0x95A5, 0x10E3,
+ 0x95A6, 0x95A6, 0x38A2, 0x95A7, 0x95A7, 0x3BD3, 0x95A8, 0x95A9, 0x10E0,
+ 0x95AA, 0x95AA, 0x4395, 0x95AB, 0x95AB, 0x2AB3, 0x95AC, 0x95AC, 0x2AB2,
+ 0x95AD, 0x95AD, 0x1260, 0x95AE, 0x95AE, 0x2AB4, 0x95B0, 0x95B0, 0x2AB5,
+ 0x95B1, 0x95B1, 0x1261, 0x95B5, 0x95B5, 0x2CF0, 0x95B6, 0x95B6, 0x2CEE,
+ 0x95B7, 0x95B7, 0x2EAD, 0x95B9, 0x95BA, 0x2CEC, 0x95BB, 0x95BB, 0x1385,
+ 0x95BC, 0x95BC, 0x2CE9, 0x95BD, 0x95BD, 0x2CF1, 0x95BE, 0x95BE, 0x2CEB,
+ 0x95BF, 0x95BF, 0x2CEF, 0x95C0, 0x95C0, 0x2EA9, 0x95C3, 0x95C3, 0x2EAB,
+ 0x95C5, 0x95C5, 0x2EAC, 0x95C6, 0x95C6, 0x14AE, 0x95C7, 0x95C7, 0x2EA8,
+ 0x95C8, 0x95C8, 0x14AD, 0x95C9, 0x95C9, 0x2EAA, 0x95CA, 0x95CC, 0x14AA,
+ 0x95CD, 0x95CD, 0x2CEA, 0x95D0, 0x95D0, 0x154C, 0x95D1, 0x95D1, 0x301F,
+ 0x95D2, 0x95D3, 0x301D, 0x95D4, 0x95D4, 0x154A, 0x95D5, 0x95D5, 0x154D,
+ 0x95D6, 0x95D6, 0x154B, 0x95DA, 0x95DB, 0x3163, 0x95DC, 0x95DC, 0x15EB,
+ 0x95DE, 0x95DE, 0x326C, 0x95DF, 0x95DF, 0x326E, 0x95E0, 0x95E0, 0x326D,
+ 0x95E1, 0x95E1, 0x1655, 0x95E2, 0x95E2, 0x16A0, 0x95E3, 0x95E3, 0x3330,
+ 0x95E4, 0x95E4, 0x332F, 0x95E5, 0x95E5, 0x332E, 0x95E8, 0x95E8, 0x450A,
+ 0x95F4, 0x95F4, 0x47AF, 0x961C, 0x961C, 0x0699, 0x961D, 0x961D, 0x4519,
+ 0x961E, 0x961E, 0x17B4, 0x9620, 0x9620, 0x1821, 0x9621, 0x9621, 0x0414,
+ 0x9622, 0x9622, 0x181F, 0x9623, 0x9623, 0x1822, 0x9624, 0x9624, 0x1820,
+ 0x9628, 0x9628, 0x18F1, 0x962A, 0x962A, 0x0526, 0x962C, 0x962C, 0x0527,
+ 0x962D, 0x962D, 0x18F3, 0x962E, 0x962E, 0x0524, 0x962F, 0x962F, 0x18F2,
+ 0x9630, 0x9630, 0x18F0, 0x9631, 0x9631, 0x0525, 0x9632, 0x9632, 0x0523,
+ 0x9633, 0x9633, 0x47B0, 0x9638, 0x9638, 0x3FD1, 0x9639, 0x9639, 0x1A55,
+ 0x963A, 0x963A, 0x1A58, 0x963B, 0x963B, 0x069C, 0x963C, 0x963C, 0x1A57,
+ 0x963D, 0x963D, 0x1A56, 0x963F, 0x963F, 0x069B, 0x9640, 0x9640, 0x069A,
+ 0x9641, 0x9641, 0x3F3D, 0x9642, 0x9642, 0x069E, 0x9643, 0x9643, 0x1A59,
+ 0x9644, 0x9644, 0x069D, 0x9645, 0x9645, 0x4772, 0x964A, 0x964A, 0x1C1A,
+ 0x964B, 0x964D, 0x0823, 0x964E, 0x964E, 0x1C1B, 0x964F, 0x964F, 0x1C17,
+ 0x9650, 0x9650, 0x0822, 0x9651, 0x9651, 0x1C18, 0x9653, 0x9653, 0x1C19,
+ 0x9654, 0x9654, 0x1C16, 0x9656, 0x9656, 0x3DE7, 0x9658, 0x9658, 0x09F1,
+ 0x965B, 0x965B, 0x09EE, 0x965C, 0x965C, 0x1E2F, 0x965D, 0x965D, 0x09EF,
+ 0x965E, 0x965E, 0x09F2, 0x965F, 0x965F, 0x1E30, 0x9661, 0x9661, 0x09ED,
+ 0x9662, 0x9663, 0x09EB, 0x9664, 0x9664, 0x09F0, 0x9669, 0x9669, 0x475E,
+ 0x966A, 0x966A, 0x0BD1, 0x966B, 0x966B, 0x20A6, 0x966C, 0x966C, 0x0BD9,
+ 0x966D, 0x966D, 0x20A5, 0x966F, 0x966F, 0x20A8, 0x9670, 0x9670, 0x0BD5,
+ 0x9671, 0x9671, 0x20A7, 0x9672, 0x9672, 0x0DA6, 0x9673, 0x9673, 0x0BD3,
+ 0x9674, 0x9674, 0x0BD6, 0x9675, 0x9675, 0x0BD2, 0x9676, 0x9677, 0x0BD7,
+ 0x9678, 0x9678, 0x0BD4, 0x967B, 0x967B, 0x38AC, 0x967C, 0x967C, 0x20A4,
+ 0x967D, 0x967D, 0x0DA2, 0x967E, 0x967E, 0x234F, 0x9680, 0x9680, 0x2353,
+ 0x9681, 0x9681, 0x3F46, 0x9683, 0x9683, 0x2352, 0x9684, 0x9684, 0x0DA7,
+ 0x9685, 0x9686, 0x0DA3, 0x9687, 0x9687, 0x234E, 0x9688, 0x9689, 0x2350,
+ 0x968A, 0x968A, 0x0D9F, 0x968B, 0x968B, 0x0DA1, 0x968D, 0x968D, 0x0DA5,
+ 0x968E, 0x968E, 0x0DA0, 0x968F, 0x968F, 0x3BDE, 0x9691, 0x9691, 0x25F6,
+ 0x9692, 0x9693, 0x25F4, 0x9694, 0x9695, 0x0F5E, 0x9696, 0x9696, 0x38AD,
+ 0x9697, 0x9697, 0x25F7, 0x9698, 0x9698, 0x0F5D, 0x9699, 0x9699, 0x10E5,
+ 0x969B, 0x969B, 0x10E7, 0x969C, 0x969C, 0x10E6, 0x969E, 0x969E, 0x2852,
+ 0x96A1, 0x96A1, 0x2853, 0x96A2, 0x96A2, 0x2AB7, 0x96A3, 0x96A3, 0x38AF,
+ 0x96A4, 0x96A4, 0x2AB6, 0x96A5, 0x96A5, 0x42EF, 0x96A7, 0x96A8, 0x1386,
+ 0x96A9, 0x96A9, 0x2CF2, 0x96AA, 0x96AA, 0x1388, 0x96AC, 0x96AC, 0x2EB0,
+ 0x96AE, 0x96AE, 0x2EAE, 0x96B0, 0x96B0, 0x2EAF, 0x96B1, 0x96B1, 0x14AF,
+ 0x96B3, 0x96B3, 0x3020, 0x96B4, 0x96B4, 0x15EC, 0x96B6, 0x96B6, 0x0231,
+ 0x96B8, 0x96B8, 0x14B0, 0x96B9, 0x96B9, 0x069F, 0x96BB, 0x96BB, 0x09F3,
+ 0x96BC, 0x96BC, 0x1E31, 0x96BD, 0x96BD, 0x38B5, 0x96BF, 0x96BF, 0x20A9,
+ 0x96C0, 0x96C0, 0x0BDA, 0x96C1, 0x96C1, 0x0DA8, 0x96C2, 0x96C2, 0x2354,
+ 0x96C3, 0x96C3, 0x2356, 0x96C4, 0x96C4, 0x0DAA, 0x96C5, 0x96C5, 0x0DA9,
+ 0x96C6, 0x96C7, 0x0DAB, 0x96C8, 0x96C8, 0x2355, 0x96C9, 0x96CA, 0x0F62,
+ 0x96CB, 0x96CB, 0x0F61, 0x96CC, 0x96CC, 0x10E8, 0x96CD, 0x96CD, 0x0F60,
+ 0x96CE, 0x96CE, 0x25F8, 0x96D2, 0x96D2, 0x10E9, 0x96D3, 0x96D3, 0x2AB8,
+ 0x96D4, 0x96D4, 0x2CF3, 0x96D5, 0x96D5, 0x1389, 0x96D6, 0x96D6, 0x14B1,
+ 0x96D7, 0x96D7, 0x3021, 0x96D8, 0x96D8, 0x3025, 0x96D9, 0x96D9, 0x1550,
+ 0x96DA, 0x96DA, 0x3022, 0x96DB, 0x96DB, 0x1551, 0x96DC, 0x96DC, 0x154F,
+ 0x96DD, 0x96DD, 0x3026, 0x96DE, 0x96DE, 0x1552, 0x96DF, 0x96DF, 0x3024,
+ 0x96E1, 0x96E1, 0x3165, 0x96E2, 0x96E2, 0x154E, 0x96E3, 0x96E3, 0x15ED,
+ 0x96E5, 0x96E5, 0x34A8, 0x96E8, 0x96E8, 0x06A0, 0x96E9, 0x96E9, 0x0BDC,
+ 0x96EA, 0x96EA, 0x0BDB, 0x96EF, 0x96EF, 0x0DAD, 0x96F0, 0x96F0, 0x2358,
+ 0x96F1, 0x96F1, 0x2357, 0x96F2, 0x96F2, 0x0DAE, 0x96F4, 0x96F4, 0x3A04,
+ 0x96F5, 0x96F5, 0x25FC, 0x96F6, 0x96F6, 0x0F67, 0x96F7, 0x96F7, 0x0F64,
+ 0x96F8, 0x96F8, 0x25FB, 0x96F9, 0x96F9, 0x0F66, 0x96FA, 0x96FA, 0x25F9,
+ 0x96FB, 0x96FB, 0x0F65, 0x96FD, 0x96FD, 0x25FA, 0x96FF, 0x96FF, 0x2854,
+ 0x9700, 0x9700, 0x10EA, 0x9702, 0x9702, 0x2ABB, 0x9703, 0x9703, 0x3F0D,
+ 0x9704, 0x9704, 0x1262, 0x9705, 0x9705, 0x2AB9, 0x9706, 0x9707, 0x1263,
+ 0x9708, 0x9708, 0x2ABA, 0x9709, 0x9709, 0x1265, 0x970B, 0x970B, 0x2CF4,
+ 0x970D, 0x970D, 0x138D, 0x970E, 0x970E, 0x138A, 0x970F, 0x970F, 0x138F,
+ 0x9710, 0x9710, 0x2CF6, 0x9711, 0x9711, 0x138B, 0x9712, 0x9712, 0x2CF5,
+ 0x9713, 0x9713, 0x138E, 0x9716, 0x9716, 0x138C, 0x9718, 0x9718, 0x2EB3,
+ 0x9719, 0x9719, 0x2EB5, 0x971B, 0x971B, 0x38C9, 0x971C, 0x971C, 0x14B2,
+ 0x971D, 0x971D, 0x2EB4, 0x971E, 0x971E, 0x14B3, 0x971F, 0x971F, 0x2EB2,
+ 0x9720, 0x9720, 0x2EB1, 0x9721, 0x9721, 0x3FB3, 0x9722, 0x9722, 0x3028,
+ 0x9723, 0x9723, 0x3027, 0x9724, 0x9724, 0x1553, 0x9725, 0x9725, 0x3029,
+ 0x9726, 0x9726, 0x316A, 0x9727, 0x9727, 0x15EF, 0x9728, 0x9728, 0x3169,
+ 0x9729, 0x9729, 0x3166, 0x972A, 0x972A, 0x15EE, 0x972B, 0x972C, 0x3167,
+ 0x972E, 0x972F, 0x326F, 0x9730, 0x9730, 0x1656, 0x9731, 0x9731, 0x38C0,
+ 0x9732, 0x9732, 0x16A3, 0x9735, 0x9735, 0x3331, 0x9736, 0x9736, 0x38C2,
+ 0x9738, 0x9739, 0x16A1, 0x973A, 0x973A, 0x3332, 0x973D, 0x973E, 0x16E2,
+ 0x973F, 0x973F, 0x33D1, 0x9740, 0x9740, 0x47B3, 0x9741, 0x9741, 0x3BE9,
+ 0x9742, 0x9742, 0x1732, 0x9743, 0x9743, 0x34AA, 0x9744, 0x9744, 0x1734,
+ 0x9746, 0x9746, 0x34A9, 0x9747, 0x9747, 0x34AB, 0x9748, 0x9748, 0x1733,
+ 0x9749, 0x9749, 0x34F1, 0x974B, 0x974B, 0x3526, 0x9751, 0x9751, 0x44E3,
+ 0x9752, 0x9752, 0x06A1, 0x9756, 0x9756, 0x0F68, 0x9757, 0x9757, 0x38CC,
+ 0x9758, 0x9758, 0x2855, 0x975A, 0x975A, 0x2ABC, 0x975B, 0x975C, 0x1390,
+ 0x975D, 0x975D, 0x3BEF, 0x975E, 0x975E, 0x06A2, 0x975F, 0x975F, 0x38CF,
+ 0x9760, 0x9760, 0x1266, 0x9761, 0x9761, 0x15F0, 0x9762, 0x9762, 0x0826,
+ 0x9766, 0x9766, 0x1392, 0x9768, 0x9768, 0x1710, 0x9769, 0x9769, 0x0827,
+ 0x976A, 0x976A, 0x20AA, 0x976C, 0x976C, 0x2359, 0x976D, 0x976D, 0x3E97,
+ 0x976E, 0x976E, 0x235B, 0x9770, 0x9770, 0x235A, 0x9771, 0x9771, 0x3BFC,
+ 0x9772, 0x9772, 0x2600, 0x9773, 0x9773, 0x25FD, 0x9774, 0x9774, 0x0F69,
+ 0x9776, 0x9776, 0x0F6A, 0x9777, 0x9778, 0x25FE, 0x977A, 0x977A, 0x2857,
+ 0x977B, 0x977B, 0x285C, 0x977C, 0x977C, 0x10EB, 0x977D, 0x977D, 0x2856,
+ 0x977E, 0x977E, 0x2858, 0x977F, 0x977F, 0x285F, 0x9780, 0x9780, 0x285A,
+ 0x9781, 0x9781, 0x285E, 0x9782, 0x9782, 0x285B, 0x9783, 0x9783, 0x2859,
+ 0x9784, 0x9784, 0x285D, 0x9785, 0x9785, 0x10EC, 0x9787, 0x9787, 0x40C0,
+ 0x9788, 0x9788, 0x2ABF, 0x9789, 0x9789, 0x38D4, 0x978A, 0x978A, 0x2ABD,
+ 0x978B, 0x978B, 0x1268, 0x978D, 0x978D, 0x1267, 0x978E, 0x978E, 0x2ABE,
+ 0x978F, 0x978F, 0x1269, 0x9794, 0x9794, 0x2CF9, 0x9797, 0x9797, 0x2CF8,
+ 0x9798, 0x9798, 0x1393, 0x9799, 0x9799, 0x2CF7, 0x979A, 0x979A, 0x2EB6,
+ 0x979B, 0x979B, 0x3BFB, 0x979C, 0x979C, 0x2EB8, 0x979D, 0x979D, 0x2EBA,
+ 0x979E, 0x979E, 0x2EB9, 0x979F, 0x979F, 0x38D5, 0x97A0, 0x97A0, 0x14B4,
+ 0x97A1, 0x97A1, 0x2EB7, 0x97A2, 0x97A2, 0x3030, 0x97A3, 0x97A3, 0x1554,
+ 0x97A4, 0x97A4, 0x302E, 0x97A5, 0x97A5, 0x3031, 0x97A6, 0x97A6, 0x1555,
+ 0x97A8, 0x97A8, 0x302C, 0x97AA, 0x97AA, 0x302F, 0x97AB, 0x97AB, 0x302D,
+ 0x97AC, 0x97AC, 0x302A, 0x97AD, 0x97AD, 0x1556, 0x97AE, 0x97AE, 0x302B,
+ 0x97B1, 0x97B1, 0x38D6, 0x97B2, 0x97B2, 0x47B5, 0x97B3, 0x97B3, 0x316B,
+ 0x97B4, 0x97B4, 0x3F33, 0x97B6, 0x97B6, 0x316D, 0x97B7, 0x97B7, 0x316C,
+ 0x97B8, 0x97B8, 0x3D95, 0x97B9, 0x97B9, 0x3271, 0x97BA, 0x97BA, 0x3F35,
+ 0x97BB, 0x97BB, 0x3272, 0x97BD, 0x97BD, 0x494E, 0x97BE, 0x97BE, 0x38D7,
+ 0x97BF, 0x97BF, 0x3333, 0x97C0, 0x97C0, 0x38D8, 0x97C1, 0x97C1, 0x16E5,
+ 0x97C2, 0x97C2, 0x47B6, 0x97C3, 0x97C3, 0x16E4, 0x97C4, 0x97C5, 0x344C,
+ 0x97C6, 0x97C6, 0x1735, 0x97C7, 0x97C7, 0x34AC, 0x97C8, 0x97C8, 0x3F2F,
+ 0x97C9, 0x97C9, 0x1756, 0x97CB, 0x97CB, 0x0828, 0x97CC, 0x97CC, 0x0DAF,
+ 0x97CD, 0x97CD, 0x2861, 0x97CE, 0x97CE, 0x2860, 0x97CF, 0x97CF, 0x2AC1,
+ 0x97D0, 0x97D0, 0x2AC0, 0x97D2, 0x97D2, 0x38D9, 0x97D3, 0x97D3, 0x14B5,
+ 0x97D4, 0x97D4, 0x2EBC, 0x97D5, 0x97D5, 0x2EBB, 0x97D6, 0x97D6, 0x3034,
+ 0x97D7, 0x97D7, 0x3032, 0x97D8, 0x97D8, 0x3035, 0x97D9, 0x97D9, 0x3033,
+ 0x97DC, 0x97DC, 0x15F1, 0x97DD, 0x97DF, 0x316E, 0x97E0, 0x97E0, 0x38DA,
+ 0x97E1, 0x97E1, 0x3334, 0x97E3, 0x97E3, 0x33D2, 0x97E5, 0x97E5, 0x34AD,
+ 0x97E6, 0x97E6, 0x450C, 0x97ED, 0x97ED, 0x0829, 0x97EE, 0x97EE, 0x38DC,
+ 0x97F0, 0x97F0, 0x2CFA, 0x97F1, 0x97F1, 0x2EBD, 0x97F2, 0x97F2, 0x394D,
+ 0x97F3, 0x97F3, 0x082A, 0x97F5, 0x97F5, 0x38E0, 0x97F6, 0x97F6, 0x10ED,
+ 0x97F8, 0x97F8, 0x2CFB, 0x97F9, 0x97F9, 0x1557, 0x97FA, 0x97FA, 0x3036,
+ 0x97FB, 0x97FB, 0x15F2, 0x97FD, 0x97FE, 0x3273, 0x97FF, 0x97FF, 0x16A4,
+ 0x9800, 0x9800, 0x344E, 0x9801, 0x9801, 0x082B, 0x9802, 0x9803, 0x0BDF,
+ 0x9804, 0x9804, 0x20AB, 0x9805, 0x9806, 0x0DB0, 0x9807, 0x9807, 0x235C,
+ 0x9808, 0x9808, 0x0DB2, 0x980A, 0x980A, 0x0F6E, 0x980C, 0x980C, 0x0F70,
+ 0x980D, 0x980E, 0x2602, 0x980F, 0x980F, 0x2601, 0x9810, 0x9811, 0x0F6B,
+ 0x9812, 0x9812, 0x0F6F, 0x9813, 0x9813, 0x0F6D, 0x9814, 0x9814, 0x4952,
+ 0x9815, 0x9815, 0x433C, 0x9816, 0x9816, 0x2862, 0x9817, 0x9818, 0x10EE,
+ 0x981B, 0x981B, 0x2AC8, 0x981C, 0x981C, 0x126C, 0x981D, 0x981D, 0x2AC3,
+ 0x981E, 0x981E, 0x2AC2, 0x981F, 0x981F, 0x3C02, 0x9820, 0x9820, 0x2AC7,
+ 0x9821, 0x9821, 0x126A, 0x9823, 0x9823, 0x3E37, 0x9824, 0x9824, 0x139A,
+ 0x9826, 0x9826, 0x2AC4, 0x9827, 0x9827, 0x2AC9, 0x9828, 0x9828, 0x2AC6,
+ 0x9829, 0x9829, 0x2AC5, 0x982B, 0x982B, 0x126B, 0x982D, 0x982D, 0x1398,
+ 0x982E, 0x982E, 0x3F72, 0x982F, 0x982F, 0x2CFD, 0x9830, 0x9830, 0x1394,
+ 0x9832, 0x9832, 0x2CFE, 0x9833, 0x9833, 0x38E5, 0x9834, 0x9834, 0x38E4,
+ 0x9835, 0x9835, 0x2CFC, 0x9837, 0x9837, 0x1397, 0x9838, 0x9838, 0x1395,
+ 0x9839, 0x9839, 0x1399, 0x983B, 0x983B, 0x1396, 0x9841, 0x9841, 0x2EBE,
+ 0x9843, 0x9843, 0x2EC3, 0x9844, 0x9844, 0x2EBF, 0x9845, 0x9845, 0x2EC2,
+ 0x9846, 0x9846, 0x14B6, 0x9847, 0x9847, 0x3D96, 0x9848, 0x9848, 0x2DF2,
+ 0x9849, 0x9849, 0x2EC1, 0x984A, 0x984A, 0x2EC0, 0x984B, 0x984B, 0x38E6,
+ 0x984C, 0x984C, 0x155A, 0x984D, 0x984D, 0x1558, 0x984E, 0x984E, 0x155B,
+ 0x984F, 0x984F, 0x1559, 0x9850, 0x9852, 0x3037, 0x9853, 0x9853, 0x155C,
+ 0x9857, 0x9857, 0x3174, 0x9858, 0x9858, 0x15F4, 0x9859, 0x9859, 0x3172,
+ 0x985B, 0x985B, 0x15F5, 0x985C, 0x985C, 0x3171, 0x985D, 0x985D, 0x3173,
+ 0x985E, 0x985E, 0x15F3, 0x985F, 0x985F, 0x3278, 0x9860, 0x9860, 0x3275,
+ 0x9862, 0x9863, 0x3276, 0x9864, 0x9864, 0x3335, 0x9865, 0x9865, 0x16A6,
+ 0x9866, 0x9866, 0x38E7, 0x9867, 0x9867, 0x16A5, 0x9869, 0x9869, 0x33D4,
+ 0x986A, 0x986A, 0x33D3, 0x986B, 0x986B, 0x16E6, 0x986C, 0x986C, 0x4035,
+ 0x986F, 0x986F, 0x1711, 0x9870, 0x9870, 0x1736, 0x9871, 0x9871, 0x174D,
+ 0x9872, 0x9872, 0x34F2, 0x9873, 0x9874, 0x3527, 0x9875, 0x9875, 0x450D,
+ 0x98A8, 0x98A8, 0x082C, 0x98A9, 0x98A9, 0x235D, 0x98AC, 0x98AC, 0x2604,
+ 0x98AD, 0x98AE, 0x2863, 0x98AF, 0x98AF, 0x10F0, 0x98B1, 0x98B1, 0x10F1,
+ 0x98B2, 0x98B2, 0x2ACA, 0x98B3, 0x98B3, 0x126D, 0x98B4, 0x98B4, 0x3F73,
+ 0x98B6, 0x98B6, 0x14B7, 0x98B7, 0x98B7, 0x38EF, 0x98B8, 0x98B8, 0x303A,
+ 0x98B9, 0x98B9, 0x47B8, 0x98BA, 0x98BA, 0x155D, 0x98BB, 0x98BB, 0x3177,
+ 0x98BC, 0x98BC, 0x15F6, 0x98BD, 0x98BD, 0x3176, 0x98BE, 0x98BE, 0x3178,
+ 0x98BF, 0x98BF, 0x3175, 0x98C0, 0x98C0, 0x3338, 0x98C1, 0x98C2, 0x3279,
+ 0x98C3, 0x98C3, 0x3B78, 0x98C4, 0x98C4, 0x1657, 0x98C6, 0x98C6, 0x3337,
+ 0x98C7, 0x98C7, 0x38F1, 0x98C8, 0x98C8, 0x38F0, 0x98C9, 0x98C9, 0x3336,
+ 0x98CA, 0x98CA, 0x38EE, 0x98CB, 0x98CB, 0x33D5, 0x98CC, 0x98CC, 0x3529,
+ 0x98CE, 0x98CE, 0x450E, 0x98DB, 0x98DB, 0x082D, 0x98DC, 0x98DC, 0x3C0B,
+ 0x98DE, 0x98DE, 0x450F, 0x98DF, 0x98DF, 0x082E, 0x98E0, 0x98E0, 0x4792,
+ 0x98E1, 0x98E1, 0x38F6, 0x98E2, 0x98E2, 0x09F4, 0x98E3, 0x98E3, 0x1E32,
+ 0x98E5, 0x98E5, 0x20AC, 0x98E6, 0x98E6, 0x38F7, 0x98E7, 0x98E7, 0x0DB3,
+ 0x98E9, 0x98E9, 0x0DB6, 0x98EA, 0x98EA, 0x0DB4, 0x98EB, 0x98EB, 0x235E,
+ 0x98EC, 0x98EC, 0x38F8, 0x98ED, 0x98ED, 0x0DB8, 0x98EF, 0x98EF, 0x0DB5,
+ 0x98F1, 0x98F1, 0x47BA, 0x98F2, 0x98F2, 0x0DB7, 0x98F4, 0x98F4, 0x0F72,
+ 0x98F5, 0x98F5, 0x4365, 0x98F6, 0x98F6, 0x2605, 0x98F9, 0x98F9, 0x2606,
+ 0x98FA, 0x98FA, 0x2ACC, 0x98FC, 0x98FC, 0x0F71, 0x98FD, 0x98FE, 0x0F73,
+ 0x9900, 0x9900, 0x2866, 0x9902, 0x9902, 0x2865, 0x9903, 0x9903, 0x10F2,
+ 0x9905, 0x9905, 0x10F3, 0x9907, 0x9907, 0x2867, 0x9908, 0x9908, 0x2ACB,
+ 0x9909, 0x9909, 0x10F5, 0x990A, 0x990A, 0x126E, 0x990C, 0x990C, 0x10F4,
+ 0x990E, 0x990E, 0x43ED, 0x9910, 0x9910, 0x139B, 0x9911, 0x9911, 0x2ACD,
+ 0x9912, 0x9912, 0x1270, 0x9913, 0x9913, 0x126F, 0x9914, 0x9914, 0x2ACE,
+ 0x9915, 0x9915, 0x2AD1, 0x9916, 0x9917, 0x2ACF, 0x9918, 0x9918, 0x1271,
+ 0x9919, 0x9919, 0x47BC, 0x991A, 0x991A, 0x13A0, 0x991B, 0x991B, 0x139E,
+ 0x991C, 0x991C, 0x43EE, 0x991E, 0x991E, 0x139D, 0x991F, 0x991F, 0x2D00,
+ 0x9921, 0x9921, 0x139F, 0x9924, 0x9924, 0x2CFF, 0x9925, 0x9925, 0x2EC4,
+ 0x9927, 0x9927, 0x2D01, 0x9928, 0x9928, 0x139C, 0x9929, 0x9929, 0x2D02,
+ 0x992A, 0x992A, 0x2EC7, 0x992B, 0x992C, 0x2EC5, 0x992D, 0x992D, 0x2ECB,
+ 0x992E, 0x992E, 0x1561, 0x992F, 0x992F, 0x2ECA, 0x9930, 0x9930, 0x2ECD,
+ 0x9931, 0x9931, 0x2ECC, 0x9932, 0x9932, 0x2EC9, 0x9933, 0x9933, 0x2EC8,
+ 0x9935, 0x9935, 0x14B8, 0x9937, 0x9937, 0x47BD, 0x9938, 0x9938, 0x3BFD,
+ 0x9939, 0x9939, 0x38FA, 0x993A, 0x993A, 0x303D, 0x993B, 0x993B, 0x3C11,
+ 0x993C, 0x993C, 0x303C, 0x993D, 0x993D, 0x1560, 0x993E, 0x993F, 0x155E,
+ 0x9940, 0x9940, 0x3F34, 0x9941, 0x9941, 0x303B, 0x9942, 0x9942, 0x43FF,
+ 0x9943, 0x9943, 0x317B, 0x9945, 0x9945, 0x15F7, 0x9947, 0x9947, 0x317A,
+ 0x9948, 0x9948, 0x3179, 0x9949, 0x9949, 0x15F8, 0x994A, 0x994A, 0x3FB9,
+ 0x994B, 0x994B, 0x327F, 0x994C, 0x994C, 0x327E, 0x994D, 0x994D, 0x3C12,
+ 0x994E, 0x994E, 0x327C, 0x9950, 0x9950, 0x327B, 0x9951, 0x9951, 0x1659,
+ 0x9952, 0x9952, 0x1658, 0x9953, 0x9953, 0x3280, 0x9954, 0x9954, 0x33D6,
+ 0x9955, 0x9955, 0x16E7, 0x9956, 0x9956, 0x333A, 0x9957, 0x9957, 0x16A7,
+ 0x9958, 0x9958, 0x3339, 0x9959, 0x9959, 0x327D, 0x995B, 0x995B, 0x33D7,
+ 0x995C, 0x995C, 0x1712, 0x995D, 0x995D, 0x47BE, 0x995E, 0x995E, 0x174E,
+ 0x995F, 0x995F, 0x34F3, 0x9961, 0x9961, 0x352A, 0x9962, 0x9962, 0x43EF,
+ 0x9963, 0x9963, 0x4510, 0x9996, 0x9996, 0x082F, 0x9997, 0x9997, 0x20AD,
+ 0x9998, 0x9998, 0x2ECE, 0x9999, 0x9999, 0x0830, 0x999B, 0x999B, 0x3C15,
+ 0x999C, 0x999C, 0x2869, 0x999D, 0x999D, 0x2868, 0x999E, 0x999E, 0x2D03,
+ 0x99A1, 0x99A1, 0x2ED0, 0x99A3, 0x99A3, 0x2ECF, 0x99A4, 0x99A4, 0x41C3,
+ 0x99A5, 0x99A5, 0x1562, 0x99A6, 0x99A7, 0x317C, 0x99A8, 0x99A8, 0x165A,
+ 0x99AA, 0x99AA, 0x3C17, 0x99AB, 0x99AB, 0x352B, 0x99AC, 0x99AC, 0x09F5,
+ 0x99AD, 0x99AD, 0x0DBA, 0x99AE, 0x99AE, 0x0DB9, 0x99AF, 0x99AF, 0x2607,
+ 0x99B0, 0x99B0, 0x2609, 0x99B1, 0x99B1, 0x0F76, 0x99B2, 0x99B2, 0x2608,
+ 0x99B3, 0x99B3, 0x0F75, 0x99B4, 0x99B4, 0x0F77, 0x99B5, 0x99B5, 0x260A,
+ 0x99B8, 0x99B8, 0x394B, 0x99B9, 0x99B9, 0x286B, 0x99BA, 0x99BA, 0x286D,
+ 0x99BB, 0x99BB, 0x286C, 0x99BC, 0x99BC, 0x3C22, 0x99BD, 0x99BD, 0x286F,
+ 0x99C1, 0x99C1, 0x10F6, 0x99C2, 0x99C2, 0x286E, 0x99C3, 0x99C3, 0x286A,
+ 0x99C4, 0x99C4, 0x3D77, 0x99C5, 0x99C5, 0x47C1, 0x99C7, 0x99C7, 0x2870,
+ 0x99C9, 0x99C9, 0x2AD8, 0x99CB, 0x99CB, 0x2ADB, 0x99CC, 0x99CC, 0x2ADD,
+ 0x99CD, 0x99CD, 0x2AD3, 0x99CE, 0x99CE, 0x2AD7, 0x99CF, 0x99CF, 0x2AD4,
+ 0x99D0, 0x99D0, 0x1273, 0x99D1, 0x99D1, 0x1276, 0x99D2, 0x99D2, 0x1278,
+ 0x99D3, 0x99D4, 0x2AD5, 0x99D5, 0x99D5, 0x1277, 0x99D6, 0x99D6, 0x2AD9,
+ 0x99D7, 0x99D7, 0x2ADC, 0x99D8, 0x99D8, 0x2ADA, 0x99D9, 0x99D9, 0x1279,
+ 0x99DA, 0x99DA, 0x3F42, 0x99DB, 0x99DB, 0x1275, 0x99DC, 0x99DC, 0x2AD2,
+ 0x99DD, 0x99DD, 0x1272, 0x99DF, 0x99DF, 0x1274, 0x99E1, 0x99E1, 0x3785,
+ 0x99E2, 0x99E2, 0x13A2, 0x99E3, 0x99E3, 0x2D09, 0x99E4, 0x99E4, 0x2D07,
+ 0x99E5, 0x99E5, 0x2D06, 0x99E6, 0x99E6, 0x3B65, 0x99E7, 0x99E7, 0x2D0C,
+ 0x99E9, 0x99E9, 0x2D0B, 0x99EA, 0x99EA, 0x2D0A, 0x99EC, 0x99EC, 0x2D05,
+ 0x99ED, 0x99ED, 0x13A1, 0x99EE, 0x99EE, 0x2D04, 0x99F0, 0x99F0, 0x2D08,
+ 0x99F1, 0x99F1, 0x13A3, 0x99F4, 0x99F4, 0x2ED3, 0x99F5, 0x99F5, 0x38FF,
+ 0x99F6, 0x99F6, 0x2ED7, 0x99F7, 0x99F7, 0x2ED4, 0x99F8, 0x99F8, 0x2ED6,
+ 0x99F9, 0x99F9, 0x2ED5, 0x99FA, 0x99FA, 0x2ED2, 0x99FB, 0x99FB, 0x2ED8,
+ 0x99FC, 0x99FC, 0x2EDB, 0x99FD, 0x99FE, 0x2ED9, 0x99FF, 0x99FF, 0x14BA,
+ 0x9A01, 0x9A01, 0x14B9, 0x9A02, 0x9A02, 0x2ED1, 0x9A03, 0x9A03, 0x2EDC,
+ 0x9A04, 0x9A04, 0x3042, 0x9A05, 0x9A05, 0x3045, 0x9A06, 0x9A06, 0x3047,
+ 0x9A07, 0x9A07, 0x3046, 0x9A09, 0x9A09, 0x3040, 0x9A0A, 0x9A0A, 0x3044,
+ 0x9A0B, 0x9A0B, 0x303F, 0x9A0C, 0x9A0C, 0x3900, 0x9A0D, 0x9A0D, 0x3041,
+ 0x9A0E, 0x9A0E, 0x1563, 0x9A0F, 0x9A0F, 0x303E, 0x9A10, 0x9A10, 0x3902,
+ 0x9A11, 0x9A11, 0x3043, 0x9A14, 0x9A14, 0x318A, 0x9A15, 0x9A15, 0x317F,
+ 0x9A16, 0x9A16, 0x15F9, 0x9A19, 0x9A19, 0x15FA, 0x9A1A, 0x9A1A, 0x317E,
+ 0x9A1B, 0x9A1B, 0x3183, 0x9A1C, 0x9A1C, 0x3189, 0x9A1D, 0x9A1D, 0x3181,
+ 0x9A1E, 0x9A1E, 0x3188, 0x9A1F, 0x9A1F, 0x3B6C, 0x9A20, 0x9A20, 0x3185,
+ 0x9A21, 0x9A21, 0x3C1C, 0x9A22, 0x9A22, 0x3184, 0x9A23, 0x9A23, 0x3187,
+ 0x9A24, 0x9A24, 0x3182, 0x9A25, 0x9A25, 0x3180, 0x9A26, 0x9A26, 0x3DF2,
+ 0x9A27, 0x9A27, 0x3186, 0x9A29, 0x9A29, 0x3287, 0x9A2A, 0x9A2A, 0x3285,
+ 0x9A2B, 0x9A2B, 0x165B, 0x9A2C, 0x9A2C, 0x3284, 0x9A2D, 0x9A2D, 0x328A,
+ 0x9A2E, 0x9A2E, 0x3288, 0x9A2F, 0x9A2F, 0x3C1E, 0x9A30, 0x9A30, 0x165C,
+ 0x9A31, 0x9A31, 0x3283, 0x9A32, 0x9A32, 0x3281, 0x9A34, 0x9A34, 0x3282,
+ 0x9A35, 0x9A35, 0x165E, 0x9A36, 0x9A36, 0x3286, 0x9A37, 0x9A37, 0x165D,
+ 0x9A38, 0x9A38, 0x3289, 0x9A39, 0x9A39, 0x333B, 0x9A3A, 0x9A3A, 0x3341,
+ 0x9A3B, 0x9A3B, 0x3901, 0x9A3C, 0x9A3C, 0x47C3, 0x9A3D, 0x9A3D, 0x333C,
+ 0x9A3E, 0x9A3E, 0x16AB, 0x9A3F, 0x9A3F, 0x3342, 0x9A40, 0x9A40, 0x16AA,
+ 0x9A41, 0x9A41, 0x3340, 0x9A42, 0x9A42, 0x333F, 0x9A43, 0x9A43, 0x16A9,
+ 0x9A44, 0x9A44, 0x333E, 0x9A45, 0x9A45, 0x16A8, 0x9A46, 0x9A46, 0x333D,
+ 0x9A48, 0x9A48, 0x33DD, 0x9A49, 0x9A49, 0x33DF, 0x9A4A, 0x9A4A, 0x33DE,
+ 0x9A4C, 0x9A4C, 0x33DB, 0x9A4D, 0x9A4D, 0x16E9, 0x9A4E, 0x9A4E, 0x33D8,
+ 0x9A4F, 0x9A4F, 0x33DC, 0x9A50, 0x9A50, 0x33E1, 0x9A52, 0x9A52, 0x33E0,
+ 0x9A53, 0x9A54, 0x33D9, 0x9A55, 0x9A55, 0x16E8, 0x9A56, 0x9A56, 0x344F,
+ 0x9A57, 0x9A57, 0x1715, 0x9A58, 0x9A58, 0x3903, 0x9A59, 0x9A59, 0x3450,
+ 0x9A5A, 0x9A5B, 0x1713, 0x9A5C, 0x9A5C, 0x3C18, 0x9A5E, 0x9A5E, 0x34AE,
+ 0x9A5F, 0x9A5F, 0x1737, 0x9A60, 0x9A60, 0x3510, 0x9A62, 0x9A62, 0x1757,
+ 0x9A63, 0x9A63, 0x3B67, 0x9A64, 0x9A64, 0x352C, 0x9A65, 0x9A65, 0x1758,
+ 0x9A66, 0x9A67, 0x352D, 0x9A68, 0x9A68, 0x353C, 0x9A69, 0x9A69, 0x353B,
+ 0x9A6A, 0x9A6A, 0x1767, 0x9A6B, 0x9A6B, 0x3544, 0x9A6C, 0x9A6C, 0x4585,
+ 0x9A8F, 0x9A8F, 0x4586, 0x9AA8, 0x9AA8, 0x09F6, 0x9AAB, 0x9AAB, 0x260C,
+ 0x9AAD, 0x9AAD, 0x260B, 0x9AAF, 0x9AB0, 0x10F7, 0x9AB1, 0x9AB1, 0x2871,
+ 0x9AB2, 0x9AB2, 0x4332, 0x9AB3, 0x9AB3, 0x2ADE, 0x9AB4, 0x9AB4, 0x2D0F,
+ 0x9AB6, 0x9AB6, 0x43F0, 0x9AB7, 0x9AB7, 0x127A, 0x9AB8, 0x9AB8, 0x13A4,
+ 0x9AB9, 0x9AB9, 0x2D0D, 0x9ABA, 0x9ABA, 0x3F74, 0x9ABB, 0x9ABB, 0x2D10,
+ 0x9ABC, 0x9ABC, 0x13A5, 0x9ABD, 0x9ABD, 0x3D97, 0x9ABE, 0x9ABE, 0x2EDD,
+ 0x9ABF, 0x9ABF, 0x2D0E, 0x9AC0, 0x9AC0, 0x3048, 0x9AC1, 0x9AC1, 0x1564,
+ 0x9AC2, 0x9AC2, 0x318B, 0x9AC6, 0x9AC6, 0x328D, 0x9AC7, 0x9AC7, 0x328B,
+ 0x9ACA, 0x9ACA, 0x328C, 0x9ACD, 0x9ACD, 0x3343, 0x9ACF, 0x9ACF, 0x16AC,
+ 0x9AD0, 0x9AD0, 0x33E2, 0x9AD1, 0x9AD1, 0x1718, 0x9AD2, 0x9AD2, 0x16EA,
+ 0x9AD3, 0x9AD4, 0x1716, 0x9AD5, 0x9AD5, 0x34AF, 0x9AD6, 0x9AD6, 0x174F,
+ 0x9AD7, 0x9AD7, 0x3FAA, 0x9AD8, 0x9AD8, 0x09F7, 0x9ADC, 0x9ADC, 0x3049,
+ 0x9ADF, 0x9ADF, 0x1E33, 0x9AE0, 0x9AE0, 0x3908, 0x9AE1, 0x9AE1, 0x0F78,
+ 0x9AE2, 0x9AE2, 0x3909, 0x9AE3, 0x9AE3, 0x2872, 0x9AE6, 0x9AE6, 0x10F9,
+ 0x9AE7, 0x9AE7, 0x2873, 0x9AEB, 0x9AEB, 0x2AE0, 0x9AEC, 0x9AEC, 0x2ADF,
+ 0x9AED, 0x9AED, 0x13A7, 0x9AEE, 0x9AEF, 0x127B, 0x9AF1, 0x9AF1, 0x2AE3,
+ 0x9AF2, 0x9AF2, 0x2AE2, 0x9AF3, 0x9AF3, 0x2AE1, 0x9AF4, 0x9AF4, 0x390B,
+ 0x9AF6, 0x9AF6, 0x2D11, 0x9AF7, 0x9AF7, 0x2D14, 0x9AF9, 0x9AF9, 0x2D13,
+ 0x9AFA, 0x9AFA, 0x2D12, 0x9AFB, 0x9AFB, 0x13A6, 0x9AFC, 0x9AFC, 0x2EE1,
+ 0x9AFD, 0x9AFD, 0x2EDF, 0x9AFE, 0x9AFE, 0x2EDE, 0x9AFF, 0x9AFF, 0x3F17,
+ 0x9B01, 0x9B01, 0x2EE0, 0x9B02, 0x9B02, 0x3F12, 0x9B03, 0x9B03, 0x1565,
+ 0x9B04, 0x9B05, 0x304B, 0x9B06, 0x9B06, 0x1566, 0x9B08, 0x9B08, 0x304A,
+ 0x9B09, 0x9B09, 0x3F20, 0x9B0A, 0x9B0A, 0x318D, 0x9B0B, 0x9B0B, 0x318C,
+ 0x9B0C, 0x9B0C, 0x318F, 0x9B0D, 0x9B0D, 0x15FB, 0x9B0E, 0x9B0E, 0x318E,
+ 0x9B0F, 0x9B0F, 0x47C4, 0x9B10, 0x9B10, 0x328E, 0x9B11, 0x9B11, 0x3290,
+ 0x9B12, 0x9B12, 0x328F, 0x9B14, 0x9B14, 0x390D, 0x9B15, 0x9B15, 0x3344,
+ 0x9B16, 0x9B16, 0x3347, 0x9B17, 0x9B18, 0x3345, 0x9B19, 0x9B19, 0x33E3,
+ 0x9B1A, 0x9B1A, 0x16EB, 0x9B1E, 0x9B20, 0x3451, 0x9B22, 0x9B22, 0x1738,
+ 0x9B23, 0x9B23, 0x1750, 0x9B24, 0x9B24, 0x352F, 0x9B25, 0x9B25, 0x09F8,
+ 0x9B27, 0x9B27, 0x127D, 0x9B28, 0x9B28, 0x13A8, 0x9B29, 0x9B29, 0x304D,
+ 0x9B2A, 0x9B2A, 0x3F19, 0x9B2B, 0x9B2B, 0x33E4, 0x9B2D, 0x9B2D, 0x390E,
+ 0x9B2E, 0x9B2E, 0x3511, 0x9B2F, 0x9B2F, 0x1E34, 0x9B31, 0x9B31, 0x1768,
+ 0x9B32, 0x9B32, 0x09F9, 0x9B33, 0x9B33, 0x2D15, 0x9B34, 0x9B34, 0x3911,
+ 0x9B35, 0x9B35, 0x304E, 0x9B37, 0x9B37, 0x3190, 0x9B39, 0x9B39, 0x3F00,
+ 0x9B3A, 0x9B3A, 0x3348, 0x9B3B, 0x9B3B, 0x33E5, 0x9B3C, 0x9B3C, 0x09FA,
+ 0x9B3E, 0x9B3F, 0x2874, 0x9B40, 0x9B40, 0x3915, 0x9B41, 0x9B42, 0x10FA,
+ 0x9B43, 0x9B43, 0x2AE5, 0x9B44, 0x9B44, 0x127F, 0x9B45, 0x9B45, 0x127E,
+ 0x9B46, 0x9B46, 0x2AE4, 0x9B48, 0x9B48, 0x2EE2, 0x9B4A, 0x9B4A, 0x304F,
+ 0x9B4B, 0x9B4B, 0x3051, 0x9B4C, 0x9B4C, 0x3050, 0x9B4D, 0x9B4D, 0x1569,
+ 0x9B4E, 0x9B4E, 0x1568, 0x9B4F, 0x9B4F, 0x1567, 0x9B50, 0x9B50, 0x3914,
+ 0x9B51, 0x9B51, 0x16AE, 0x9B52, 0x9B52, 0x3349, 0x9B54, 0x9B54, 0x16AD,
+ 0x9B55, 0x9B55, 0x33E7, 0x9B56, 0x9B56, 0x33E6, 0x9B58, 0x9B58, 0x1739,
+ 0x9B59, 0x9B59, 0x34B0, 0x9B5A, 0x9B5A, 0x0BE1, 0x9B5B, 0x9B5B, 0x260D,
+ 0x9B5F, 0x9B5F, 0x2878, 0x9B60, 0x9B61, 0x2876, 0x9B64, 0x9B64, 0x2AEE,
+ 0x9B66, 0x9B66, 0x2AE9, 0x9B67, 0x9B67, 0x2AE6, 0x9B68, 0x9B68, 0x2AED,
+ 0x9B69, 0x9B69, 0x47C5, 0x9B6C, 0x9B6C, 0x2AEF, 0x9B6F, 0x9B6F, 0x1281,
+ 0x9B70, 0x9B70, 0x2AEC, 0x9B71, 0x9B71, 0x2AE8, 0x9B74, 0x9B74, 0x2AE7,
+ 0x9B75, 0x9B75, 0x2AEB, 0x9B76, 0x9B76, 0x2AEA, 0x9B77, 0x9B77, 0x1280,
+ 0x9B7A, 0x9B7A, 0x2D20, 0x9B7B, 0x9B7B, 0x2D1B, 0x9B7C, 0x9B7C, 0x2D19,
+ 0x9B7D, 0x9B7D, 0x2D22, 0x9B7E, 0x9B7E, 0x2D1A, 0x9B7F, 0x9B7F, 0x3C3B,
+ 0x9B80, 0x9B80, 0x2D16, 0x9B81, 0x9B81, 0x43F1, 0x9B82, 0x9B82, 0x2D1C,
+ 0x9B83, 0x9B83, 0x4219, 0x9B85, 0x9B85, 0x2D17, 0x9B86, 0x9B86, 0x2EEB,
+ 0x9B87, 0x9B87, 0x2D18, 0x9B88, 0x9B88, 0x2D23, 0x9B8B, 0x9B8B, 0x3EEE,
+ 0x9B8D, 0x9B8D, 0x4623, 0x9B8E, 0x9B8E, 0x3919, 0x9B8F, 0x9B8F, 0x3FAD,
+ 0x9B90, 0x9B90, 0x2D1F, 0x9B91, 0x9B91, 0x13A9, 0x9B92, 0x9B92, 0x2D1E,
+ 0x9B93, 0x9B93, 0x2D1D, 0x9B95, 0x9B95, 0x2D21, 0x9B97, 0x9B97, 0x3F71,
+ 0x9B9A, 0x9B9A, 0x2EE3, 0x9B9B, 0x9B9B, 0x2EE6, 0x9B9D, 0x9B9D, 0x3F56,
+ 0x9B9E, 0x9B9E, 0x2EE5, 0x9B9F, 0x9B9F, 0x3C3E, 0x9BA0, 0x9BA0, 0x2EED,
+ 0x9BA1, 0x9BA1, 0x2EE8, 0x9BA2, 0x9BA2, 0x2EEC, 0x9BA4, 0x9BA4, 0x2EEA,
+ 0x9BA5, 0x9BA5, 0x2EE9, 0x9BA6, 0x9BA6, 0x2EE7, 0x9BA8, 0x9BA8, 0x2EE4,
+ 0x9BAA, 0x9BAA, 0x14BD, 0x9BAB, 0x9BAB, 0x14BC, 0x9BAD, 0x9BAD, 0x14BE,
+ 0x9BAE, 0x9BAE, 0x14BB, 0x9BAF, 0x9BAF, 0x2EEE, 0x9BB0, 0x9BB0, 0x3FB4,
+ 0x9BB5, 0x9BB5, 0x3057, 0x9BB6, 0x9BB6, 0x305A, 0x9BB8, 0x9BB8, 0x3058,
+ 0x9BB9, 0x9BB9, 0x305C, 0x9BBD, 0x9BBD, 0x305D, 0x9BBF, 0x9BBF, 0x3055,
+ 0x9BC0, 0x9BC0, 0x156E, 0x9BC1, 0x9BC1, 0x3056, 0x9BC3, 0x9BC3, 0x3054,
+ 0x9BC4, 0x9BC4, 0x305B, 0x9BC6, 0x9BC6, 0x3053, 0x9BC7, 0x9BC7, 0x3052,
+ 0x9BC8, 0x9BC8, 0x156D, 0x9BC9, 0x9BC9, 0x156B, 0x9BCA, 0x9BCA, 0x156A,
+ 0x9BCF, 0x9BCF, 0x3C3C, 0x9BD3, 0x9BD3, 0x3059, 0x9BD4, 0x9BD4, 0x3199,
+ 0x9BD5, 0x9BD5, 0x319F, 0x9BD6, 0x9BD6, 0x15FE, 0x9BD7, 0x9BD7, 0x319A,
+ 0x9BD9, 0x9BD9, 0x319D, 0x9BDA, 0x9BDA, 0x31A1, 0x9BDB, 0x9BDB, 0x15FF,
+ 0x9BDC, 0x9BDC, 0x319C, 0x9BDD, 0x9BDD, 0x47C6, 0x9BDE, 0x9BDE, 0x3194,
+ 0x9BE0, 0x9BE0, 0x3193, 0x9BE1, 0x9BE1, 0x31A0, 0x9BE2, 0x9BE2, 0x3197,
+ 0x9BE4, 0x9BE4, 0x3195, 0x9BE5, 0x9BE5, 0x319E, 0x9BE6, 0x9BE6, 0x3196,
+ 0x9BE7, 0x9BE7, 0x15FD, 0x9BE8, 0x9BE8, 0x15FC, 0x9BE9, 0x9BE9, 0x3BC1,
+ 0x9BEA, 0x9BEB, 0x3191, 0x9BEC, 0x9BEC, 0x319B, 0x9BED, 0x9BED, 0x3ED7,
+ 0x9BF0, 0x9BF0, 0x3198, 0x9BF1, 0x9BF1, 0x47C7, 0x9BF4, 0x9BF4, 0x47C8,
+ 0x9BF7, 0x9BF7, 0x3293, 0x9BF8, 0x9BF8, 0x3296, 0x9BFD, 0x9BFD, 0x156C,
+ 0x9BFF, 0x9BFF, 0x391B, 0x9C02, 0x9C02, 0x391A, 0x9C05, 0x9C05, 0x3294,
+ 0x9C06, 0x9C06, 0x329A, 0x9C07, 0x9C07, 0x3298, 0x9C08, 0x9C08, 0x3292,
+ 0x9C09, 0x9C09, 0x329D, 0x9C0A, 0x9C0A, 0x3F3A, 0x9C0B, 0x9C0B, 0x3291,
+ 0x9C0C, 0x9C0C, 0x391C, 0x9C0D, 0x9C0D, 0x1660, 0x9C0E, 0x9C0E, 0x3299,
+ 0x9C10, 0x9C10, 0x3C3A, 0x9C12, 0x9C12, 0x3295, 0x9C13, 0x9C13, 0x165F,
+ 0x9C14, 0x9C14, 0x329C, 0x9C15, 0x9C15, 0x3F1E, 0x9C17, 0x9C17, 0x329B,
+ 0x9C1B, 0x9C1B, 0x491B, 0x9C1C, 0x9C1C, 0x334C, 0x9C1D, 0x9C1D, 0x334B,
+ 0x9C1F, 0x9C1F, 0x4622, 0x9C20, 0x9C20, 0x47CA, 0x9C21, 0x9C21, 0x3352,
+ 0x9C23, 0x9C23, 0x334E, 0x9C24, 0x9C24, 0x3351, 0x9C25, 0x9C25, 0x16B0,
+ 0x9C26, 0x9C26, 0x45E6, 0x9C28, 0x9C29, 0x334F, 0x9C2B, 0x9C2B, 0x334A,
+ 0x9C2C, 0x9C2C, 0x334D, 0x9C2D, 0x9C2D, 0x16AF, 0x9C2E, 0x9C2E, 0x3F22,
+ 0x9C2F, 0x9C2F, 0x3D87, 0x9C31, 0x9C31, 0x16ED, 0x9C32, 0x9C32, 0x33F2,
+ 0x9C33, 0x9C33, 0x33ED, 0x9C34, 0x9C34, 0x33F1, 0x9C35, 0x9C35, 0x3C39,
+ 0x9C36, 0x9C36, 0x33F4, 0x9C37, 0x9C37, 0x33F0, 0x9C39, 0x9C39, 0x33EC,
+ 0x9C3A, 0x9C3A, 0x3D7E, 0x9C3B, 0x9C3B, 0x16EF, 0x9C3C, 0x9C3C, 0x33EF,
+ 0x9C3D, 0x9C3D, 0x33F3, 0x9C3E, 0x9C3E, 0x16EE, 0x9C3F, 0x9C3F, 0x33EA,
+ 0x9C40, 0x9C40, 0x3297, 0x9C41, 0x9C41, 0x33EE, 0x9C44, 0x9C44, 0x33EB,
+ 0x9C45, 0x9C45, 0x3E71, 0x9C46, 0x9C46, 0x33E8, 0x9C48, 0x9C48, 0x33E9,
+ 0x9C49, 0x9C49, 0x16EC, 0x9C4A, 0x9C4A, 0x3457, 0x9C4B, 0x9C4B, 0x3459,
+ 0x9C4C, 0x9C4C, 0x345C, 0x9C4D, 0x9C4D, 0x3458, 0x9C4E, 0x9C4E, 0x345D,
+ 0x9C4F, 0x9C4F, 0x3C36, 0x9C50, 0x9C50, 0x3456, 0x9C52, 0x9C52, 0x3454,
+ 0x9C53, 0x9C53, 0x3C37, 0x9C54, 0x9C54, 0x1719, 0x9C55, 0x9C55, 0x345A,
+ 0x9C56, 0x9C56, 0x171B, 0x9C57, 0x9C57, 0x171A, 0x9C58, 0x9C58, 0x3455,
+ 0x9C59, 0x9C59, 0x345B, 0x9C5D, 0x9C5D, 0x3EBF, 0x9C5E, 0x9C5E, 0x34B5,
+ 0x9C5F, 0x9C5F, 0x173A, 0x9C60, 0x9C60, 0x34B6, 0x9C62, 0x9C62, 0x34B4,
+ 0x9C63, 0x9C63, 0x34B1, 0x9C66, 0x9C66, 0x34B3, 0x9C67, 0x9C67, 0x34B2,
+ 0x9C68, 0x9C68, 0x34F4, 0x9C6D, 0x9C6D, 0x34F6, 0x9C6E, 0x9C6E, 0x34F5,
+ 0x9C71, 0x9C71, 0x3514, 0x9C72, 0x9C72, 0x3EA1, 0x9C73, 0x9C73, 0x3513,
+ 0x9C74, 0x9C74, 0x3512, 0x9C75, 0x9C75, 0x3515, 0x9C77, 0x9C78, 0x1760,
+ 0x9C79, 0x9C79, 0x3541, 0x9C7A, 0x9C7A, 0x3545, 0x9C7B, 0x9C7B, 0x3C38,
+ 0x9C7C, 0x9C7C, 0x4512, 0x9CE5, 0x9CE5, 0x0BE2, 0x9CE6, 0x9CE6, 0x235F,
+ 0x9CE7, 0x9CE7, 0x2610, 0x9CE9, 0x9CE9, 0x0F79, 0x9CEA, 0x9CEA, 0x260E,
+ 0x9CED, 0x9CED, 0x260F, 0x9CF1, 0x9CF2, 0x2879, 0x9CF3, 0x9CF3, 0x10FE,
+ 0x9CF4, 0x9CF4, 0x10FC, 0x9CF5, 0x9CF5, 0x287B, 0x9CF6, 0x9CF6, 0x10FD,
+ 0x9CF7, 0x9CF7, 0x2AF4, 0x9CF9, 0x9CF9, 0x2AF7, 0x9CFA, 0x9CFA, 0x2AF1,
+ 0x9CFB, 0x9CFB, 0x2AF8, 0x9CFC, 0x9CFC, 0x2AF0, 0x9CFD, 0x9CFD, 0x2AF2,
+ 0x9CFF, 0x9CFF, 0x2AF3, 0x9D00, 0x9D00, 0x2AF6, 0x9D02, 0x9D02, 0x3F3B,
+ 0x9D03, 0x9D03, 0x1284, 0x9D04, 0x9D04, 0x2AFB, 0x9D05, 0x9D05, 0x2AFA,
+ 0x9D06, 0x9D06, 0x1282, 0x9D07, 0x9D07, 0x2AF5, 0x9D08, 0x9D08, 0x2AF9,
+ 0x9D09, 0x9D09, 0x1283, 0x9D0C, 0x9D0C, 0x3C46, 0x9D10, 0x9D10, 0x2D2D,
+ 0x9D12, 0x9D12, 0x13AE, 0x9D14, 0x9D14, 0x2D28, 0x9D15, 0x9D15, 0x13AA,
+ 0x9D16, 0x9D16, 0x3C7C, 0x9D17, 0x9D17, 0x2D25, 0x9D18, 0x9D18, 0x2D2B,
+ 0x9D19, 0x9D19, 0x2D2E, 0x9D1B, 0x9D1B, 0x13AF, 0x9D1D, 0x9D1D, 0x2D2A,
+ 0x9D1E, 0x9D1E, 0x2D27, 0x9D1F, 0x9D1F, 0x2D2F, 0x9D20, 0x9D20, 0x2D26,
+ 0x9D21, 0x9D21, 0x3C41, 0x9D22, 0x9D22, 0x2D2C, 0x9D23, 0x9D23, 0x13AB,
+ 0x9D25, 0x9D25, 0x2D24, 0x9D26, 0x9D26, 0x13AC, 0x9D28, 0x9D28, 0x13AD,
+ 0x9D29, 0x9D29, 0x2D29, 0x9D2D, 0x9D2D, 0x2F00, 0x9D2E, 0x9D2F, 0x2EF3,
+ 0x9D30, 0x9D30, 0x2EF7, 0x9D31, 0x9D31, 0x2EF5, 0x9D33, 0x9D33, 0x2EEF,
+ 0x9D34, 0x9D34, 0x404A, 0x9D36, 0x9D36, 0x2EF2, 0x9D37, 0x9D37, 0x2EFC,
+ 0x9D38, 0x9D38, 0x2EF6, 0x9D39, 0x9D39, 0x392E, 0x9D3B, 0x9D3B, 0x14BF,
+ 0x9D3D, 0x9D3D, 0x2EFE, 0x9D3E, 0x9D3E, 0x2EFB, 0x9D3F, 0x9D3F, 0x14C0,
+ 0x9D40, 0x9D40, 0x2EFD, 0x9D41, 0x9D41, 0x2EF0, 0x9D42, 0x9D43, 0x2EF9,
+ 0x9D44, 0x9D44, 0x3FAB, 0x9D45, 0x9D45, 0x2EF8, 0x9D49, 0x9D49, 0x47CD,
+ 0x9D4A, 0x9D4A, 0x3061, 0x9D4B, 0x9D4B, 0x3063, 0x9D4C, 0x9D4C, 0x3066,
+ 0x9D4E, 0x9D4E, 0x4539, 0x9D4F, 0x9D4F, 0x3060, 0x9D50, 0x9D50, 0x3ECA,
+ 0x9D51, 0x9D51, 0x156F, 0x9D52, 0x9D52, 0x3068, 0x9D53, 0x9D53, 0x305F,
+ 0x9D54, 0x9D54, 0x3069, 0x9D56, 0x9D56, 0x3065, 0x9D57, 0x9D57, 0x3067,
+ 0x9D58, 0x9D58, 0x306B, 0x9D59, 0x9D59, 0x3064, 0x9D5A, 0x9D5A, 0x306C,
+ 0x9D5B, 0x9D5B, 0x3062, 0x9D5C, 0x9D5C, 0x305E, 0x9D5D, 0x9D5D, 0x1570,
+ 0x9D5E, 0x9D5E, 0x3E6E, 0x9D5F, 0x9D5F, 0x306A, 0x9D60, 0x9D60, 0x1571,
+ 0x9D61, 0x9D61, 0x1601, 0x9D67, 0x9D67, 0x2EF1, 0x9D68, 0x9D68, 0x31BB,
+ 0x9D69, 0x9D69, 0x31B2, 0x9D6A, 0x9D6A, 0x1603, 0x9D6B, 0x9D6B, 0x31AE,
+ 0x9D6C, 0x9D6C, 0x1604, 0x9D6D, 0x9D6D, 0x3BAC, 0x9D6E, 0x9D6E, 0x433B,
+ 0x9D6F, 0x9D6F, 0x31B7, 0x9D70, 0x9D70, 0x31B1, 0x9D71, 0x9D71, 0x31A7,
+ 0x9D72, 0x9D72, 0x1602, 0x9D73, 0x9D73, 0x31B4, 0x9D74, 0x9D75, 0x31AF,
+ 0x9D77, 0x9D77, 0x31A2, 0x9D78, 0x9D78, 0x31A9, 0x9D79, 0x9D79, 0x31B8,
+ 0x9D7B, 0x9D7B, 0x31B5, 0x9D7C, 0x9D7C, 0x3EFE, 0x9D7D, 0x9D7D, 0x31AD,
+ 0x9D7E, 0x9D7E, 0x3925, 0x9D7F, 0x9D7F, 0x31B9, 0x9D80, 0x9D80, 0x31A8,
+ 0x9D81, 0x9D81, 0x31A3, 0x9D82, 0x9D82, 0x31B6, 0x9D83, 0x9D83, 0x3926,
+ 0x9D84, 0x9D84, 0x31A5, 0x9D85, 0x9D85, 0x31B3, 0x9D86, 0x9D86, 0x31AA,
+ 0x9D87, 0x9D87, 0x31BA, 0x9D88, 0x9D88, 0x31A6, 0x9D89, 0x9D89, 0x1600,
+ 0x9D8A, 0x9D8A, 0x31A4, 0x9D8B, 0x9D8C, 0x31AB, 0x9D90, 0x9D90, 0x32A4,
+ 0x9D92, 0x9D92, 0x32A2, 0x9D93, 0x9D93, 0x43F3, 0x9D94, 0x9D94, 0x32A7,
+ 0x9D96, 0x9D96, 0x32B3, 0x9D97, 0x9D97, 0x32AA, 0x9D98, 0x9D98, 0x32A3,
+ 0x9D99, 0x9D99, 0x329F, 0x9D9A, 0x9D9A, 0x32AC, 0x9D9B, 0x9D9B, 0x32A5,
+ 0x9D9C, 0x9D9C, 0x32A8, 0x9D9D, 0x9D9D, 0x32A1, 0x9D9E, 0x9D9E, 0x32AF,
+ 0x9D9F, 0x9D9F, 0x329E, 0x9DA0, 0x9DA0, 0x32A6, 0x9DA1, 0x9DA1, 0x32AB,
+ 0x9DA2, 0x9DA2, 0x32AD, 0x9DA3, 0x9DA3, 0x32B0, 0x9DA4, 0x9DA4, 0x32A0,
+ 0x9DA5, 0x9DA5, 0x3C4B, 0x9DA6, 0x9DA7, 0x32B4, 0x9DA8, 0x9DA8, 0x32AE,
+ 0x9DA9, 0x9DA9, 0x32B2, 0x9DAA, 0x9DAA, 0x32A9, 0x9DAB, 0x9DAB, 0x3F30,
+ 0x9DAC, 0x9DAC, 0x3362, 0x9DAD, 0x9DAD, 0x3365, 0x9DAF, 0x9DAF, 0x16B1,
+ 0x9DB1, 0x9DB1, 0x3364, 0x9DB2, 0x9DB2, 0x3369, 0x9DB3, 0x9DB3, 0x3367,
+ 0x9DB4, 0x9DB4, 0x16B2, 0x9DB5, 0x9DB5, 0x335E, 0x9DB6, 0x9DB6, 0x3354,
+ 0x9DB7, 0x9DB7, 0x3353, 0x9DB8, 0x9DB8, 0x16B4, 0x9DB9, 0x9DBA, 0x3360,
+ 0x9DBB, 0x9DBB, 0x335D, 0x9DBC, 0x9DBC, 0x3355, 0x9DBD, 0x9DBD, 0x47D0,
+ 0x9DBE, 0x9DBE, 0x335A, 0x9DBF, 0x9DBF, 0x32B1, 0x9DC0, 0x9DC0, 0x43F2,
+ 0x9DC1, 0x9DC1, 0x3356, 0x9DC2, 0x9DC2, 0x16B3, 0x9DC3, 0x9DC3, 0x335C,
+ 0x9DC4, 0x9DC4, 0x3929, 0x9DC5, 0x9DC5, 0x335B, 0x9DC7, 0x9DC7, 0x3357,
+ 0x9DC8, 0x9DC8, 0x3363, 0x9DC9, 0x9DC9, 0x4579, 0x9DCA, 0x9DCA, 0x3358,
+ 0x9DCB, 0x9DCB, 0x33F9, 0x9DCC, 0x9DCC, 0x3366, 0x9DCD, 0x9DCD, 0x3368,
+ 0x9DCE, 0x9DCE, 0x335F, 0x9DCF, 0x9DCF, 0x3359, 0x9DD0, 0x9DD0, 0x33FA,
+ 0x9DD1, 0x9DD1, 0x33FC, 0x9DD2, 0x9DD2, 0x33F6, 0x9DD3, 0x9DD3, 0x16F0,
+ 0x9DD4, 0x9DD4, 0x391E, 0x9DD5, 0x9DD5, 0x3403, 0x9DD6, 0x9DD6, 0x3401,
+ 0x9DD7, 0x9DD7, 0x16F1, 0x9DD8, 0x9DD8, 0x3400, 0x9DD9, 0x9DD9, 0x33FF,
+ 0x9DDA, 0x9DDA, 0x33F8, 0x9DDB, 0x9DDB, 0x33F5, 0x9DDC, 0x9DDC, 0x33FB,
+ 0x9DDD, 0x9DDD, 0x3404, 0x9DDE, 0x9DDE, 0x33F7, 0x9DDF, 0x9DDF, 0x33FD,
+ 0x9DE1, 0x9DE1, 0x3466, 0x9DE2, 0x9DE2, 0x346B, 0x9DE3, 0x9DE3, 0x3461,
+ 0x9DE4, 0x9DE4, 0x3464, 0x9DE5, 0x9DE5, 0x171C, 0x9DE6, 0x9DE6, 0x3468,
+ 0x9DE8, 0x9DE8, 0x346F, 0x9DE9, 0x9DE9, 0x33FE, 0x9DEB, 0x9DEB, 0x3462,
+ 0x9DEC, 0x9DEC, 0x346C, 0x9DED, 0x9DED, 0x3470, 0x9DEE, 0x9DEE, 0x3467,
+ 0x9DEF, 0x9DEF, 0x3460, 0x9DF0, 0x9DF0, 0x346A, 0x9DF2, 0x9DF2, 0x3469,
+ 0x9DF3, 0x9DF3, 0x346E, 0x9DF4, 0x9DF4, 0x346D, 0x9DF5, 0x9DF5, 0x3402,
+ 0x9DF6, 0x9DF6, 0x3465, 0x9DF7, 0x9DF7, 0x345F, 0x9DF8, 0x9DF8, 0x3463,
+ 0x9DF9, 0x9DFA, 0x173B, 0x9DFB, 0x9DFB, 0x345E, 0x9DFC, 0x9DFC, 0x47D1,
+ 0x9DFD, 0x9DFD, 0x34C1, 0x9DFE, 0x9DFE, 0x34B8, 0x9DFF, 0x9DFF, 0x34C0,
+ 0x9E00, 0x9E01, 0x34BD, 0x9E02, 0x9E02, 0x34B7, 0x9E03, 0x9E03, 0x34BA,
+ 0x9E04, 0x9E04, 0x34C2, 0x9E05, 0x9E05, 0x34BC, 0x9E06, 0x9E06, 0x34BB,
+ 0x9E07, 0x9E07, 0x34B9, 0x9E09, 0x9E09, 0x34BF, 0x9E0A, 0x9E0A, 0x457E,
+ 0x9E0B, 0x9E0B, 0x34F7, 0x9E0C, 0x9E0C, 0x457A, 0x9E0D, 0x9E0D, 0x34F8,
+ 0x9E0E, 0x9E0E, 0x3928, 0x9E0F, 0x9E0F, 0x34FA, 0x9E10, 0x9E10, 0x34F9,
+ 0x9E11, 0x9E11, 0x34FC, 0x9E12, 0x9E12, 0x34FB, 0x9E13, 0x9E13, 0x3517,
+ 0x9E14, 0x9E14, 0x3516, 0x9E15, 0x9E15, 0x3530, 0x9E17, 0x9E17, 0x3531,
+ 0x9E18, 0x9E18, 0x3C44, 0x9E19, 0x9E19, 0x353D, 0x9E1A, 0x9E1A, 0x1765,
+ 0x9E1B, 0x9E1B, 0x1769, 0x9E1C, 0x9E1C, 0x3F84, 0x9E1D, 0x9E1D, 0x3546,
+ 0x9E1E, 0x9E1E, 0x176A, 0x9E1F, 0x9E1F, 0x4513, 0x9E75, 0x9E75, 0x0BE3,
+ 0x9E79, 0x9E79, 0x1661, 0x9E7A, 0x9E7A, 0x336A, 0x9E7B, 0x9E7B, 0x43F8,
+ 0x9E7C, 0x9E7D, 0x173D, 0x9E7F, 0x9E7F, 0x0BE4, 0x9E80, 0x9E80, 0x2611,
+ 0x9E81, 0x9E81, 0x3F0F, 0x9E82, 0x9E82, 0x0F7A, 0x9E83, 0x9E83, 0x2AFC,
+ 0x9E84, 0x9E84, 0x3F76, 0x9E85, 0x9E85, 0x3EF2, 0x9E86, 0x9E87, 0x2D31,
+ 0x9E88, 0x9E88, 0x2D30, 0x9E89, 0x9E89, 0x2F02, 0x9E8A, 0x9E8A, 0x2F01,
+ 0x9E8B, 0x9E8B, 0x14C1, 0x9E8C, 0x9E8C, 0x306E, 0x9E8D, 0x9E8D, 0x2F03,
+ 0x9E8E, 0x9E8E, 0x306D, 0x9E90, 0x9E90, 0x3931, 0x9E91, 0x9E91, 0x31BD,
+ 0x9E92, 0x9E92, 0x1605, 0x9E93, 0x9E93, 0x1607, 0x9E94, 0x9E94, 0x31BC,
+ 0x9E95, 0x9E95, 0x3932, 0x9E96, 0x9E96, 0x3FBC, 0x9E97, 0x9E97, 0x1606,
+ 0x9E98, 0x9E98, 0x3F27, 0x9E99, 0x9E99, 0x32B6, 0x9E9A, 0x9E9A, 0x32B8,
+ 0x9E9B, 0x9E9B, 0x32B7, 0x9E9C, 0x9E9C, 0x336B, 0x9E9D, 0x9E9D, 0x16B5,
+ 0x9E9E, 0x9E9E, 0x3933, 0x9E9F, 0x9E9F, 0x171D, 0x9EA0, 0x9EA0, 0x34C3,
+ 0x9EA1, 0x9EA1, 0x34FD, 0x9EA2, 0x9EA2, 0x3934, 0x9EA4, 0x9EA4, 0x354A,
+ 0x9EA5, 0x9EA5, 0x0BE5, 0x9EA6, 0x9EA6, 0x4944, 0x9EA7, 0x9EA7, 0x287C,
+ 0x9EA8, 0x9EA8, 0x3F75, 0x9EA9, 0x9EA9, 0x1285, 0x9EAA, 0x9EAA, 0x3936,
+ 0x9EAB, 0x9EAB, 0x3E92, 0x9EAC, 0x9EAC, 0x43F4, 0x9EAD, 0x9EAD, 0x2D34,
+ 0x9EAE, 0x9EAE, 0x2D33, 0x9EAF, 0x9EAF, 0x3937, 0x9EB0, 0x9EB0, 0x2F04,
+ 0x9EB1, 0x9EB1, 0x47D4, 0x9EB4, 0x9EB4, 0x1608, 0x9EB5, 0x9EB5, 0x1662,
+ 0x9EB6, 0x9EB6, 0x3405, 0x9EB7, 0x9EB7, 0x3542, 0x9EBB, 0x9EBB, 0x0BE6,
+ 0x9EBC, 0x9EBC, 0x10FF, 0x9EBD, 0x9EBD, 0x47D5, 0x9EBE, 0x9EBE, 0x1286,
+ 0x9EBF, 0x9EBF, 0x3D78, 0x9EC0, 0x9EC0, 0x31BE, 0x9EC1, 0x9EC1, 0x3939,
+ 0x9EC2, 0x9EC2, 0x3471, 0x9EC3, 0x9EC3, 0x0DBB, 0x9EC4, 0x9EC4, 0x4514,
+ 0x9EC6, 0x9EC6, 0x47D6, 0x9EC7, 0x9EC7, 0x4577, 0x9EC8, 0x9EC8, 0x2F05,
+ 0x9ECC, 0x9ECC, 0x1751, 0x9ECD, 0x9ECD, 0x0DBC, 0x9ECE, 0x9ECE, 0x1287,
+ 0x9ECF, 0x9ECF, 0x14C2, 0x9ED0, 0x9ED0, 0x3472, 0x9ED1, 0x9ED1, 0x0DBD,
+ 0x9ED3, 0x9ED3, 0x2AFD, 0x9ED4, 0x9ED4, 0x13B1, 0x9ED5, 0x9ED6, 0x2D35,
+ 0x9ED8, 0x9ED8, 0x13B0, 0x9EDA, 0x9EDA, 0x2F06, 0x9EDB, 0x9EDB, 0x14C6,
+ 0x9EDC, 0x9EDD, 0x14C4, 0x9EDE, 0x9EDE, 0x14C3, 0x9EDF, 0x9EDF, 0x306F,
+ 0x9EE0, 0x9EE0, 0x1572, 0x9EE2, 0x9EE2, 0x47D8, 0x9EE4, 0x9EE4, 0x32BA,
+ 0x9EE5, 0x9EE5, 0x32B9, 0x9EE6, 0x9EE6, 0x32BC, 0x9EE7, 0x9EE7, 0x32BB,
+ 0x9EE8, 0x9EE8, 0x1663, 0x9EEB, 0x9EEB, 0x336C, 0x9EED, 0x9EED, 0x336E,
+ 0x9EEE, 0x9EEE, 0x336D, 0x9EEF, 0x9EEF, 0x16B6, 0x9EF0, 0x9EF0, 0x3406,
+ 0x9EF1, 0x9EF1, 0x47D9, 0x9EF2, 0x9EF3, 0x3473, 0x9EF4, 0x9EF4, 0x171E,
+ 0x9EF5, 0x9EF5, 0x34FE, 0x9EF6, 0x9EF6, 0x3518, 0x9EF7, 0x9EF7, 0x1762,
+ 0x9EF8, 0x9EF8, 0x47DA, 0x9EF9, 0x9EF9, 0x2360, 0x9EFA, 0x9EFA, 0x2D37,
+ 0x9EFB, 0x9EFB, 0x2F07, 0x9EFC, 0x9EFC, 0x31BF, 0x9EFD, 0x9EFD, 0x2612,
+ 0x9EFE, 0x9EFE, 0x47CE, 0x9EFF, 0x9EFF, 0x2F08, 0x9F00, 0x9F00, 0x3071,
+ 0x9F01, 0x9F01, 0x3070, 0x9F02, 0x9F02, 0x3940, 0x9F06, 0x9F06, 0x3475,
+ 0x9F07, 0x9F07, 0x173F, 0x9F08, 0x9F08, 0x3941, 0x9F09, 0x9F09, 0x34FF,
+ 0x9F0A, 0x9F0A, 0x3519, 0x9F0E, 0x9F0E, 0x0F7B, 0x9F0F, 0x9F10, 0x2AFE,
+ 0x9F12, 0x9F12, 0x2D38, 0x9F13, 0x9F13, 0x0F7C, 0x9F15, 0x9F15, 0x1573,
+ 0x9F16, 0x9F16, 0x3072, 0x9F17, 0x9F17, 0x3945, 0x9F18, 0x9F18, 0x3370,
+ 0x9F19, 0x9F19, 0x16B7, 0x9F1A, 0x9F1A, 0x3371, 0x9F1B, 0x9F1B, 0x336F,
+ 0x9F1C, 0x9F1C, 0x3476, 0x9F1E, 0x9F1E, 0x34C4, 0x9F20, 0x9F20, 0x0F7D,
+ 0x9F22, 0x9F22, 0x2F0B, 0x9F23, 0x9F23, 0x2F0A, 0x9F24, 0x9F24, 0x2F09,
+ 0x9F25, 0x9F25, 0x3073, 0x9F26, 0x9F26, 0x3F90, 0x9F27, 0x9F27, 0x4620,
+ 0x9F28, 0x9F28, 0x3077, 0x9F29, 0x9F29, 0x3076, 0x9F2A, 0x9F2A, 0x3075,
+ 0x9F2B, 0x9F2B, 0x3074, 0x9F2C, 0x9F2C, 0x1574, 0x9F2D, 0x9F2D, 0x31C0,
+ 0x9F2E, 0x9F2E, 0x32BE, 0x9F2F, 0x9F2F, 0x1664, 0x9F30, 0x9F30, 0x32BD,
+ 0x9F31, 0x9F31, 0x3372, 0x9F32, 0x9F32, 0x3409, 0x9F33, 0x9F33, 0x3408,
+ 0x9F34, 0x9F34, 0x16F2, 0x9F35, 0x9F35, 0x3407, 0x9F36, 0x9F36, 0x3479,
+ 0x9F37, 0x9F37, 0x3478, 0x9F38, 0x9F38, 0x3477, 0x9F39, 0x9F39, 0x3947,
+ 0x9F3B, 0x9F3B, 0x1100, 0x9F3D, 0x9F3D, 0x2D39, 0x9F3E, 0x9F3E, 0x14C7,
+ 0x9F40, 0x9F41, 0x31C1, 0x9F42, 0x9F42, 0x340A, 0x9F43, 0x9F43, 0x347A,
+ 0x9F44, 0x9F44, 0x47DB, 0x9F45, 0x9F45, 0x394A, 0x9F46, 0x9F46, 0x34C5,
+ 0x9F47, 0x9F47, 0x3500, 0x9F48, 0x9F48, 0x3532, 0x9F49, 0x9F49, 0x354C,
+ 0x9F4A, 0x9F4A, 0x1101, 0x9F4B, 0x9F4B, 0x14C8, 0x9F4C, 0x9F4C, 0x3078,
+ 0x9F4D, 0x9F4D, 0x31C3, 0x9F4E, 0x9F4E, 0x3373, 0x9F4F, 0x9F4F, 0x347B,
+ 0x9F50, 0x9F50, 0x4943, 0x9F52, 0x9F52, 0x1289, 0x9F53, 0x9F53, 0x3F80,
+ 0x9F54, 0x9F54, 0x2F0C, 0x9F55, 0x9F55, 0x3079, 0x9F56, 0x9F58, 0x31C4,
+ 0x9F59, 0x9F59, 0x32C3, 0x9F5A, 0x9F5A, 0x3F23, 0x9F5B, 0x9F5B, 0x32BF,
+ 0x9F5C, 0x9F5C, 0x16B8, 0x9F5D, 0x9F5D, 0x32C2, 0x9F5E, 0x9F5E, 0x32C1,
+ 0x9F5F, 0x9F5F, 0x1665, 0x9F60, 0x9F60, 0x32C0, 0x9F61, 0x9F61, 0x1667,
+ 0x9F62, 0x9F62, 0x394F, 0x9F63, 0x9F63, 0x1666, 0x9F64, 0x9F64, 0x3375,
+ 0x9F65, 0x9F65, 0x3374, 0x9F66, 0x9F67, 0x16B9, 0x9F69, 0x9F69, 0x3950,
+ 0x9F6A, 0x9F6A, 0x16F4, 0x9F6B, 0x9F6B, 0x340B, 0x9F6C, 0x9F6C, 0x16F3,
+ 0x9F6E, 0x9F6F, 0x347E, 0x9F70, 0x9F70, 0x347D, 0x9F71, 0x9F71, 0x347C,
+ 0x9F72, 0x9F72, 0x1741, 0x9F74, 0x9F76, 0x34C6, 0x9F77, 0x9F77, 0x1740,
+ 0x9F78, 0x9F78, 0x3501, 0x9F79, 0x9F79, 0x3504, 0x9F7A, 0x9F7A, 0x3503,
+ 0x9F7B, 0x9F7B, 0x3502, 0x9F7E, 0x9F7E, 0x354B, 0x9F7F, 0x9F7F, 0x4680,
+ 0x9F8D, 0x9F8D, 0x13B2, 0x9F8E, 0x9F8E, 0x3952, 0x9F90, 0x9F90, 0x157C,
+ 0x9F91, 0x9F91, 0x32C4, 0x9F92, 0x9F92, 0x3376, 0x9F94, 0x9F94, 0x16F5,
+ 0x9F95, 0x9F95, 0x340C, 0x9F98, 0x9F98, 0x354D, 0x9F99, 0x9F99, 0x4587,
+ 0x9F9C, 0x9F9C, 0x13B3, 0x9F9F, 0x9F9F, 0x4646, 0x9FA0, 0x9FA0, 0x2F0D,
+ 0x9FA2, 0x9FA2, 0x340D, 0x9FA4, 0x9FA4, 0x351A, 0x9FA5, 0x9FA5, 0x3F70,
+ 0xE000, 0xE000, 0x400B, 0xE002, 0xE003, 0x400D, 0xE009, 0xE00A, 0x4014,
+ 0xE00C, 0xE00C, 0x4017, 0xE00E, 0xE00E, 0x4019, 0xE012, 0xE016, 0x401D,
+ 0xE018, 0xE018, 0x4023, 0xE01A, 0xE01E, 0x4025, 0xE020, 0xE020, 0x402B,
+ 0xE022, 0xE023, 0x402D, 0xE025, 0xE025, 0x4030, 0xE02D, 0xE02E, 0x4038,
+ 0xE030, 0xE030, 0x403B, 0xE032, 0xE038, 0x403D, 0xE03B, 0xE03C, 0x4046,
+ 0xE045, 0xE045, 0x4050, 0xE04C, 0xE04C, 0x4057, 0xE05A, 0xE05A, 0x4065,
+ 0xE05C, 0xE05C, 0x4067, 0xE05F, 0xE061, 0x406A, 0xE064, 0xE064, 0x406F,
+ 0xE066, 0xE066, 0x4071, 0xE06C, 0xE06C, 0x4077, 0xE071, 0xE071, 0x407C,
+ 0xE074, 0xE075, 0x407F, 0xE078, 0xE078, 0x4083, 0xE07D, 0xE07D, 0x4088,
+ 0xE087, 0xE087, 0x4092, 0xE089, 0xE08A, 0x4094, 0xE08C, 0xE08C, 0x4097,
+ 0xE093, 0xE094, 0x409E, 0xE099, 0xE09A, 0x40A4, 0xE09C, 0xE09E, 0x40A7,
+ 0xE0A6, 0xE0A7, 0x40B1, 0xE0A9, 0xE0A9, 0x40B4, 0xE0AB, 0xE0AB, 0x40B6,
+ 0xE0AE, 0xE0AE, 0x40B9, 0xE0BA, 0xE0BA, 0x40C5, 0xE0BC, 0xE0BC, 0x40C7,
+ 0xE0BE, 0xE0BE, 0x40C9, 0xE0C3, 0xE0C3, 0x40CE, 0xE0C5, 0xE0C5, 0x40D0,
+ 0xE0C7, 0xE0C8, 0x40D2, 0xE0CA, 0xE0CA, 0x40D5, 0xE0D0, 0xE0D0, 0x40DB,
+ 0xE0D4, 0xE0D5, 0x40DF, 0xE0DC, 0xE0DC, 0x40E7, 0xE0DF, 0xE0DF, 0x40EA,
+ 0xE0E2, 0xE0E5, 0x40ED, 0xE0E7, 0xE0E9, 0x40F2, 0xE0EB, 0xE0EC, 0x40F6,
+ 0xE0EE, 0xE0EE, 0x40F9, 0xE0F2, 0xE0F2, 0x40FD, 0xE0F8, 0xE0F9, 0x4103,
+ 0xE0FB, 0xE0FB, 0x4105, 0xE0FD, 0xE0FD, 0x4107, 0xE103, 0xE103, 0x410D,
+ 0xE106, 0xE106, 0x4110, 0xE109, 0xE10B, 0x4112, 0xE110, 0xE110, 0x4119,
+ 0xE114, 0xE115, 0x411D, 0xE11C, 0xE11D, 0x4125, 0xE121, 0xE121, 0x412A,
+ 0xE126, 0xE128, 0x412F, 0xE130, 0xE131, 0x4139, 0xE136, 0xE136, 0x413F,
+ 0xE139, 0xE139, 0x4142, 0xE141, 0xE142, 0x414A, 0xE145, 0xE145, 0x414D,
+ 0xE147, 0xE148, 0x414F, 0xE14A, 0xE14A, 0x4151, 0xE14D, 0xE14D, 0x4153,
+ 0xE150, 0xE150, 0x4156, 0xE154, 0xE157, 0x415A, 0xE159, 0xE15A, 0x415F,
+ 0xE15D, 0xE15D, 0x494F, 0xE162, 0xE162, 0x4167, 0xE168, 0xE16A, 0x416D,
+ 0xE171, 0xE172, 0x4175, 0xE175, 0xE175, 0x4179, 0xE178, 0xE179, 0x417C,
+ 0xE17B, 0xE17C, 0x417F, 0xE17F, 0xE180, 0x4183, 0xE185, 0xE185, 0x4189,
+ 0xE187, 0xE187, 0x418B, 0xE189, 0xE189, 0x418D, 0xE18B, 0xE18B, 0x418F,
+ 0xE18F, 0xE190, 0x4193, 0xE193, 0xE193, 0x4196, 0xE195, 0xE195, 0x4953,
+ 0xE196, 0xE196, 0x4198, 0xE19F, 0xE1A0, 0x41A1, 0xE1A4, 0xE1A4, 0x4954,
+ 0xE1A6, 0xE1A6, 0x41A8, 0xE1AA, 0xE1AA, 0x41AC, 0xE1AE, 0xE1AE, 0x41B0,
+ 0xE1B0, 0xE1B1, 0x41B2, 0xE1B3, 0xE1B4, 0x41B5, 0xE1B6, 0xE1B6, 0x41B8,
+ 0xE1B8, 0xE1B8, 0x41BA, 0xE1BB, 0xE1BB, 0x4955, 0xE1BC, 0xE1BF, 0x41BD,
+ 0xE1C1, 0xE1C1, 0x41C2, 0xE1C4, 0xE1C5, 0x41C5, 0xE1C8, 0xE1C8, 0x41C8,
+ 0xE1CC, 0xE1CD, 0x41CC, 0xE1D4, 0xE1D5, 0x41D4, 0xE1D7, 0xE1D7, 0x41D7,
+ 0xE1DA, 0xE1DA, 0x41DA, 0xE1DD, 0xE1DD, 0x41DD, 0xE1E2, 0xE1E2, 0x41E1,
+ 0xE1E6, 0xE1E6, 0x41E5, 0xE1EB, 0xE1EB, 0x41EA, 0xE1EF, 0xE1F0, 0x41EE,
+ 0xE1F2, 0xE1F2, 0x41F1, 0xE1F7, 0xE1F7, 0x41F6, 0xE1FA, 0xE1FA, 0x41F9,
+ 0xE1FE, 0xE1FE, 0x41FD, 0xE200, 0xE200, 0x41FF, 0xE201, 0xE201, 0x4958,
+ 0xE202, 0xE202, 0x4201, 0xE205, 0xE205, 0x4204, 0xE207, 0xE207, 0x4206,
+ 0xE20A, 0xE20C, 0x4209, 0xE210, 0xE210, 0x420F, 0xE212, 0xE216, 0x4211,
+ 0xE219, 0xE219, 0x4218, 0xE21B, 0xE21C, 0x421A, 0xE21F, 0xE221, 0x421E,
+ 0xE226, 0xE228, 0x4225, 0xE22A, 0xE22A, 0x4229, 0xE22F, 0xE22F, 0x422E,
+ 0xE231, 0xE231, 0x4230, 0xE233, 0xE233, 0x4232, 0xE237, 0xE237, 0x4236,
+ 0xE23B, 0xE23B, 0x423A, 0xE23D, 0xE23E, 0x423C, 0xE245, 0xE245, 0x4244,
+ 0xE248, 0xE248, 0x4247, 0xE24A, 0xE24F, 0x4249, 0xE251, 0xE254, 0x4250,
+ 0xE261, 0xE261, 0x4260, 0xE268, 0xE268, 0x4266, 0xE26B, 0xE26B, 0x4269,
+ 0xE26D, 0xE26F, 0x426B, 0xE271, 0xE271, 0x426F, 0xE27A, 0xE27A, 0x4278,
+ 0xE27D, 0xE27D, 0x427B, 0xE282, 0xE282, 0x4280, 0xE288, 0xE289, 0x4286,
+ 0xE28B, 0xE28B, 0x4289, 0xE290, 0xE291, 0x428E, 0xE294, 0xE296, 0x4292,
+ 0xE299, 0xE29B, 0x4297, 0xE29F, 0xE29F, 0x429D, 0xE2A1, 0xE2A1, 0x495B,
+ 0xE2A4, 0xE2A4, 0x42A1, 0xE2A6, 0xE2A6, 0x42A3, 0xE2B2, 0xE2B5, 0x42AE,
+ 0xE2B7, 0xE2B8, 0x42B3, 0xE2BA, 0xE2BA, 0x42B6, 0xE2BE, 0xE2BF, 0x42B9,
+ 0xE2C1, 0xE2C1, 0x42BC, 0xE2C7, 0xE2C7, 0x42C2, 0xE2C9, 0xE2C9, 0x42C4,
+ 0xE2D4, 0xE2D4, 0x42CF, 0xE2D8, 0xE2D9, 0x42D3, 0xE2DE, 0xE2DE, 0x42D9,
+ 0xE2E0, 0xE2E2, 0x42DB, 0xE2E7, 0xE2E7, 0x42E2, 0xE2E9, 0xE2E9, 0x42E4,
+ 0xE2EB, 0xE2ED, 0x42E6, 0xE2F0, 0xE2F1, 0x495D, 0xE2F8, 0xE2F8, 0x42F1,
+ 0xE2FC, 0xE2FC, 0x42F5, 0xE2FF, 0xE2FF, 0x495F, 0xE300, 0xE300, 0x4960,
+ 0xE301, 0xE301, 0x42F8, 0xE306, 0xE306, 0x42FD, 0xE308, 0xE308, 0x42FF,
+ 0xE30C, 0xE30C, 0x4303, 0xE30F, 0xE30F, 0x4306, 0xE311, 0xE311, 0x372B,
+ 0xE313, 0xE313, 0x372D, 0xE315, 0xE315, 0x372F, 0xE318, 0xE318, 0x3731,
+ 0xE31B, 0xE31C, 0x3734, 0xE31F, 0xE31F, 0x3738, 0xE325, 0xE325, 0x373E,
+ 0xE32C, 0xE32C, 0x3745, 0xE330, 0xE331, 0x3749, 0xE335, 0xE336, 0x374E,
+ 0xE33B, 0xE33B, 0x3754, 0xE33D, 0xE33D, 0x469A, 0xE342, 0xE342, 0x375A,
+ 0xE345, 0xE345, 0x375D, 0xE348, 0xE348, 0x375F, 0xE352, 0xE352, 0x3768,
+ 0xE354, 0xE354, 0x376A, 0xE35B, 0xE35C, 0x3770, 0xE360, 0xE360, 0x3775,
+ 0xE362, 0xE362, 0x3777, 0xE364, 0xE365, 0x3779, 0xE36F, 0xE36F, 0x3784,
+ 0xE372, 0xE372, 0x3787, 0xE374, 0xE375, 0x3789, 0xE377, 0xE377, 0x378C,
+ 0xE379, 0xE379, 0x378D, 0xE37B, 0xE37B, 0x378F, 0xE381, 0xE382, 0x3795,
+ 0xE386, 0xE386, 0x379A, 0xE388, 0xE38A, 0x379C, 0xE38D, 0xE38D, 0x37A1,
+ 0xE391, 0xE391, 0x37A5, 0xE393, 0xE393, 0x37A7, 0xE394, 0xE394, 0x46A0,
+ 0xE396, 0xE396, 0x37A9, 0xE398, 0xE398, 0x37AB, 0xE39A, 0xE39B, 0x37AD,
+ 0xE39E, 0xE39E, 0x46A1, 0xE39F, 0xE3A0, 0x37B1, 0xE3A2, 0xE3A2, 0x37B4,
+ 0xE3A5, 0xE3A5, 0x46A2, 0xE3A6, 0xE3A9, 0x37B8, 0xE3AC, 0xE3AC, 0x37BE,
+ 0xE3B1, 0xE3B2, 0x37C3, 0xE3B4, 0xE3B5, 0x37C6, 0xE3B9, 0xE3BD, 0x37CB,
+ 0xE3C3, 0xE3C3, 0x37D5, 0xE3C8, 0xE3C8, 0x37D9, 0xE3CC, 0xE3CC, 0x37DD,
+ 0xE3CD, 0xE3CD, 0x46A4, 0xE3CF, 0xE3CF, 0x37DF, 0xE3D5, 0xE3D5, 0x46A5,
+ 0xE3D8, 0xE3DA, 0x37E7, 0xE3E1, 0xE3E1, 0x37F0, 0xE3E3, 0xE3E3, 0x37F2,
+ 0xE3E7, 0xE3E7, 0x46A6, 0xE3ED, 0xE3EE, 0x37FC, 0xE3F0, 0xE3F0, 0x37FF,
+ 0xE3F2, 0xE3F4, 0x3801, 0xE3F8, 0xE3F8, 0x3807, 0xE3FA, 0xE3FA, 0x3809,
+ 0xE3FD, 0xE3FD, 0x380C, 0xE3FF, 0xE3FF, 0x380E, 0xE409, 0xE40B, 0x3818,
+ 0xE414, 0xE414, 0x3821, 0xE41B, 0xE41B, 0x3828, 0xE41D, 0xE41E, 0x382A,
+ 0xE423, 0xE423, 0x3830, 0xE425, 0xE425, 0x3832, 0xE426, 0xE426, 0x46AB,
+ 0xE428, 0xE428, 0x3834, 0xE42C, 0xE42D, 0x3838, 0xE432, 0xE432, 0x383E,
+ 0xE436, 0xE436, 0x3842, 0xE43A, 0xE43C, 0x3846, 0xE43E, 0xE43E, 0x384A,
+ 0xE440, 0xE441, 0x384C, 0xE444, 0xE444, 0x3850, 0xE448, 0xE448, 0x46AD,
+ 0xE44C, 0xE44E, 0x3857, 0xE450, 0xE451, 0x385B, 0xE459, 0xE45A, 0x3864,
+ 0xE45D, 0xE45E, 0x3868, 0xE461, 0xE463, 0x386C, 0xE465, 0xE465, 0x3870,
+ 0xE467, 0xE469, 0x46AF, 0xE46A, 0xE46A, 0x3873, 0xE46C, 0xE46C, 0x3875,
+ 0xE46E, 0xE46F, 0x3877, 0xE471, 0xE472, 0x387A, 0xE474, 0xE474, 0x387D,
+ 0xE476, 0xE476, 0x387F, 0xE47E, 0xE47F, 0x3886, 0xE484, 0xE484, 0x388C,
+ 0xE486, 0xE48A, 0x388D, 0xE48D, 0xE48E, 0x3894, 0xE491, 0xE492, 0x3897,
+ 0xE495, 0xE497, 0x389B, 0xE4A1, 0xE4A1, 0x46B4, 0xE4A2, 0xE4A4, 0x38A7,
+ 0xE4AB, 0xE4AB, 0x38B0, 0xE4AF, 0xE4AF, 0x38B4, 0xE4B3, 0xE4BA, 0x38B8,
+ 0xE4C1, 0xE4C1, 0x38C6, 0xE4C6, 0xE4C6, 0x38CB, 0xE4C9, 0xE4C9, 0x38CE,
+ 0xE4CD, 0xE4CE, 0x38D2, 0xE4D6, 0xE4D6, 0x38DB, 0xE4D9, 0xE4D9, 0x38DE,
+ 0xE4DC, 0xE4DD, 0x38E1, 0xE4E4, 0xE4E4, 0x38E9, 0xE4E6, 0xE4E8, 0x38EB,
+ 0xE4EE, 0xE4EF, 0x38F3, 0xE4F6, 0xE4F6, 0x38FB, 0xE4F8, 0xE4F9, 0x38FD,
+ 0xE4FF, 0xE4FF, 0x3904, 0xE501, 0xE502, 0x3906, 0xE505, 0xE505, 0x390A,
+ 0xE50A, 0xE50A, 0x390F, 0xE50D, 0xE50D, 0x46B5, 0xE50F, 0xE50F, 0x3913,
+ 0xE512, 0xE512, 0x3916, 0xE514, 0xE514, 0x3918, 0xE516, 0xE516, 0x46B6,
+ 0xE51A, 0xE51A, 0x391D, 0xE51C, 0xE521, 0x391F, 0xE524, 0xE524, 0x3927,
+ 0xE528, 0xE528, 0x46B8, 0xE529, 0xE52C, 0x392A, 0xE52E, 0xE52F, 0x392F,
+ 0xE537, 0xE537, 0x3938, 0xE53E, 0xE53E, 0x393F, 0xE543, 0xE543, 0x3944,
+ 0xE54B, 0xE54B, 0x394C, 0xE554, 0xE555, 0x3955, 0xE557, 0xE559, 0x3958,
+ 0xE55B, 0xE55C, 0x395C, 0xE55E, 0xE55F, 0x395F, 0xE562, 0xE562, 0x3963,
+ 0xE566, 0xE567, 0x3967, 0xE56D, 0xE56E, 0x396E, 0xE570, 0xE570, 0x3971,
+ 0xE572, 0xE573, 0x3973, 0xE575, 0xE577, 0x3976, 0xE579, 0xE57A, 0x397A,
+ 0xE57C, 0xE57E, 0x397D, 0xE580, 0xE580, 0x3981, 0xE582, 0xE586, 0x3983,
+ 0xE588, 0xE588, 0x3989, 0xE58B, 0xE590, 0x398C, 0xE592, 0xE594, 0x3993,
+ 0xE59A, 0xE59A, 0x399B, 0xE59D, 0xE5A1, 0x399E, 0xE5A4, 0xE5A4, 0x39A5,
+ 0xE5A6, 0xE5A8, 0x39A7, 0xE5AA, 0xE5AA, 0x39AB, 0xE5AF, 0xE5AF, 0x39B0,
+ 0xE5B1, 0xE5B1, 0x39B2, 0xE5B2, 0xE5B2, 0x46BB, 0xE5B5, 0xE5B5, 0x39B6,
+ 0xE5B7, 0xE5B8, 0x39B8, 0xE5BA, 0xE5BB, 0x39BB, 0xE5BE, 0xE5C0, 0x39BF,
+ 0xE5C2, 0xE5C2, 0x39C3, 0xE5C8, 0xE5C9, 0x39C9, 0xE5D7, 0xE5D9, 0x39D4,
+ 0xE5DB, 0xE5DC, 0x39D8, 0xE5DF, 0xE5DF, 0x39DC, 0xE5E1, 0xE5E3, 0x39DE,
+ 0xE5E5, 0xE5E6, 0x39E2, 0xE5E9, 0xE5E9, 0x39E6, 0xE5EE, 0xE5F1, 0x39EB,
+ 0xE5F3, 0xE5F3, 0x39F0, 0xE5FB, 0xE5FC, 0x39F8, 0xE600, 0xE600, 0x39FD,
+ 0xE602, 0xE602, 0x39FF, 0xE604, 0xE604, 0x3A01, 0xE60F, 0xE612, 0x3A0B,
+ 0xE619, 0xE61C, 0x3A14, 0xE621, 0xE621, 0x3A1C, 0xE623, 0xE624, 0x3A1E,
+ 0xE627, 0xE627, 0x3A22, 0xE62B, 0xE62B, 0x3A26, 0xE632, 0xE634, 0x3A2D,
+ 0xE637, 0xE638, 0x3A32, 0xE63A, 0xE63A, 0x3A35, 0xE63C, 0xE63C, 0x3A37,
+ 0xE63F, 0xE642, 0x3A3A, 0xE645, 0xE646, 0x3A40, 0xE648, 0xE648, 0x3A43,
+ 0xE64B, 0xE64B, 0x3A45, 0xE64E, 0xE64F, 0x3A48, 0xE652, 0xE655, 0x3A4C,
+ 0xE657, 0xE659, 0x3A51, 0xE65D, 0xE660, 0x3A57, 0xE662, 0xE663, 0x3A5C,
+ 0xE665, 0xE668, 0x3A5F, 0xE66A, 0xE66A, 0x46BF, 0xE66E, 0xE66F, 0x3A67,
+ 0xE671, 0xE671, 0x3A6A, 0xE676, 0xE679, 0x3A6F, 0xE67B, 0xE67D, 0x3A74,
+ 0xE67F, 0xE680, 0x3A78, 0xE683, 0xE688, 0x3A7B, 0xE68A, 0xE68C, 0x3A82,
+ 0xE68E, 0xE690, 0x3A86, 0xE692, 0xE692, 0x3A8A, 0xE696, 0xE697, 0x3A8E,
+ 0xE699, 0xE69A, 0x3A91, 0xE69C, 0xE69C, 0x3A94, 0xE69E, 0xE69F, 0x3A96,
+ 0xE6A1, 0xE6A2, 0x3A99, 0xE6A6, 0xE6A6, 0x3A9D, 0xE6AC, 0xE6AD, 0x3AA2,
+ 0xE6B2, 0xE6B2, 0x3AA8, 0xE6B9, 0xE6BA, 0x3AAF, 0xE6BD, 0xE6BE, 0x3AB3,
+ 0xE6C0, 0xE6C1, 0x3AB6, 0xE6C5, 0xE6C5, 0x46C4, 0xE6C7, 0xE6C7, 0x3ABC,
+ 0xE6CA, 0xE6CA, 0x3ABF, 0xE6D1, 0xE6D2, 0x3AC6, 0xE6D7, 0xE6D8, 0x3ACC,
+ 0xE6DA, 0xE6DB, 0x3ACF, 0xE6DD, 0xE6E1, 0x3AD2, 0xE6E4, 0xE6E6, 0x3AD9,
+ 0xE6EE, 0xE6EE, 0x3AE3, 0xE6F2, 0xE6F3, 0x3AE7, 0xE6F7, 0xE6F7, 0x3AEC,
+ 0xE6FA, 0xE6FC, 0x3AEF, 0xE6FF, 0xE6FF, 0x3AF4, 0xE701, 0xE702, 0x3AF6,
+ 0xE706, 0xE707, 0x3AFB, 0xE709, 0xE70A, 0x3AFE, 0xE70C, 0xE70C, 0x3B01,
+ 0xE710, 0xE711, 0x3B05, 0xE713, 0xE713, 0x3B08, 0xE717, 0xE718, 0x3B0C,
+ 0xE71A, 0xE71B, 0x3B0F, 0xE71D, 0xE71D, 0x3B12, 0xE724, 0xE725, 0x3B19,
+ 0xE72B, 0xE72B, 0x3B20, 0xE72F, 0xE72F, 0x3B24, 0xE733, 0xE737, 0x3B28,
+ 0xE73C, 0xE73D, 0x3B31, 0xE740, 0xE742, 0x3B35, 0xE744, 0xE744, 0x3B39,
+ 0xE747, 0xE747, 0x3B3C, 0xE74D, 0xE74F, 0x3B42, 0xE751, 0xE752, 0x3B46,
+ 0xE75B, 0xE75D, 0x3B50, 0xE75F, 0xE75F, 0x3B54, 0xE761, 0xE762, 0x3B56,
+ 0xE764, 0xE765, 0x3B59, 0xE767, 0xE768, 0x3B5C, 0xE769, 0xE769, 0x46C7,
+ 0xE76C, 0xE76E, 0x3B60, 0xE770, 0xE770, 0x3B64, 0xE775, 0xE775, 0x3B69,
+ 0xE777, 0xE778, 0x3B6A, 0xE77A, 0xE77A, 0x3B6D, 0xE77C, 0xE77D, 0x3B6F,
+ 0xE784, 0xE784, 0x3B77, 0xE786, 0xE786, 0x3B79, 0xE789, 0xE789, 0x3B7C,
+ 0xE78B, 0xE78B, 0x3B7E, 0xE78D, 0xE78D, 0x3B80, 0xE790, 0xE790, 0x3B83,
+ 0xE792, 0xE792, 0x3B85, 0xE794, 0xE794, 0x3B87, 0xE796, 0xE797, 0x3B89,
+ 0xE799, 0xE799, 0x3B8C, 0xE7A2, 0xE7A2, 0x3B95, 0xE7A4, 0xE7A9, 0x3B97,
+ 0xE7B1, 0xE7B1, 0x3BA4, 0xE7B4, 0xE7B4, 0x3BA7, 0xE7B8, 0xE7B8, 0x3BAB,
+ 0xE7BC, 0xE7BC, 0x3BAF, 0xE7C4, 0xE7C4, 0x3BB6, 0xE7CA, 0xE7CA, 0x3BBC,
+ 0xE7CE, 0xE7CE, 0x3BC0, 0xE7D1, 0xE7D1, 0x3BC3, 0xE7D8, 0xE7D8, 0x3BCA,
+ 0xE7DA, 0xE7DA, 0x3BCC, 0xE7DC, 0xE7DD, 0x3BCE, 0xE7E4, 0xE7E4, 0x3BD6,
+ 0xE7E7, 0xE7E9, 0x3BD9, 0xE7EB, 0xE7EB, 0x3BDD, 0xE7ED, 0xE7EF, 0x3BDF,
+ 0xE7F1, 0xE7F3, 0x3BE3, 0xE7F8, 0xE7F8, 0x3BEA, 0xE7FB, 0xE7FC, 0x3BED,
+ 0xE7FF, 0xE7FF, 0x3BF1, 0xE800, 0xE802, 0x3BF2, 0xE808, 0xE808, 0x3BFA,
+ 0xE80C, 0xE80C, 0x3BFE, 0xE80E, 0xE80F, 0x3C00, 0xE811, 0xE811, 0x3C03,
+ 0xE813, 0xE813, 0x3C05, 0xE816, 0xE818, 0x3C08, 0xE81A, 0xE81A, 0x3C0C,
+ 0xE821, 0xE821, 0x3C13, 0xE827, 0xE828, 0x3C19, 0xE82D, 0xE82D, 0x3C1F,
+ 0xE82F, 0xE82F, 0x3C21, 0xE835, 0xE835, 0x3C27, 0xE837, 0xE838, 0x3C29,
+ 0xE83A, 0xE83B, 0x3C2C, 0xE841, 0xE842, 0x3C33, 0xE84B, 0xE84B, 0x3C3D,
+ 0xE84D, 0xE84E, 0x3C3F, 0xE851, 0xE851, 0x3C43, 0xE855, 0xE858, 0x3C47,
+ 0xE85B, 0xE85D, 0x3C4D, 0xE860, 0xE862, 0x3C52, 0xE865, 0xE867, 0x3C57,
+ 0xE869, 0xE86A, 0x3C5B, 0xE86C, 0xE86C, 0x3C5D, 0xE871, 0xE871, 0x3C62,
+ 0xE878, 0xE878, 0x3C69, 0xE87D, 0xE87F, 0x3C6E, 0xE887, 0xE887, 0x3C78,
+ 0xE88F, 0xE88F, 0x3C80, 0xE891, 0xE892, 0x3C82, 0xE894, 0xE895, 0x3C85,
+ 0xE89A, 0xE89A, 0x3C8B, 0xE89D, 0xE89D, 0x3C8E, 0xE8A0, 0xE8A1, 0x3C91,
+ 0xE8A3, 0xE8A7, 0x3C94, 0xE8A9, 0xE8AA, 0x3C9A, 0xE8AC, 0xE8B0, 0x3C9D,
+ 0xE8B5, 0xE8B6, 0x3CA6, 0xE8B8, 0xE8B8, 0x3CA9, 0xE8BD, 0xE8C3, 0x3CAE,
+ 0xE8C5, 0xE8C5, 0x3CB6, 0xE8C7, 0xE8C7, 0x3CB8, 0xE8CB, 0xE8CB, 0x3CBC,
+ 0xE8CD, 0xE8CE, 0x3CBE, 0xE8D0, 0xE8D1, 0x3CC1, 0xE8D3, 0xE8D3, 0x3CC4,
+ 0xE8D5, 0xE8D6, 0x3CC6, 0xE8D8, 0xE8DA, 0x3CC9, 0xE8DD, 0xE8DD, 0x3CCE,
+ 0xE8DF, 0xE8E1, 0x3CD0, 0xE8E5, 0xE8E6, 0x3CD6, 0xE8E8, 0xE8EA, 0x3CD9,
+ 0xE8ED, 0xE8ED, 0x3CDE, 0xE8F1, 0xE8F2, 0x3CE2, 0xE8F5, 0xE8F5, 0x3CE6,
+ 0xE8FB, 0xE8FB, 0x3CEC, 0xE8FE, 0xE8FE, 0x3CEF, 0xE900, 0xE900, 0x3CF1,
+ 0xE903, 0xE903, 0x3CF4, 0xE907, 0xE908, 0x3CF8, 0xE90C, 0xE90C, 0x3CFD,
+ 0xE917, 0xE918, 0x3D08, 0xE91C, 0xE91C, 0x3D0D, 0xE91E, 0xE922, 0x3D0F,
+ 0xE925, 0xE92C, 0x3D16, 0xE92E, 0xE92F, 0x3D1F, 0xE933, 0xE936, 0x3D24,
+ 0xE938, 0xE938, 0x46CF, 0xE93A, 0xE93A, 0x3D2B, 0xE93C, 0xE93E, 0x3D2D,
+ 0xE941, 0xE941, 0x3D32, 0xE944, 0xE945, 0x3D35, 0xE948, 0xE948, 0x3D39,
+ 0xE94D, 0xE94D, 0x3D3E, 0xE950, 0xE950, 0x3D41, 0xE952, 0xE955, 0x3D43,
+ 0xE957, 0xE958, 0x3D48, 0xE95A, 0xE95A, 0x3D4B, 0xE95C, 0xE95E, 0x3D4D,
+ 0xE960, 0xE961, 0x3D51, 0xE964, 0xE964, 0x3D55, 0xE967, 0xE967, 0x3D58,
+ 0xE968, 0xE968, 0x46D1, 0xE96E, 0xE96F, 0x46D5, 0xE973, 0xE973, 0x46DA,
+ 0xE974, 0xE974, 0x3D5B, 0xE975, 0xE975, 0x46DB, 0xE977, 0xE978, 0x46DD,
+ 0xE97A, 0xE97B, 0x46E0, 0xE97D, 0xE97D, 0x46E3, 0xE981, 0xE982, 0x46E6,
+ 0xE987, 0xE987, 0x3D5D, 0xE98A, 0xE98A, 0x3D5E, 0xE98E, 0xE98E, 0x3D5F,
+ 0xE991, 0xE991, 0x46EF, 0xE9B0, 0xE9B0, 0x43D4, 0xE9CB, 0xE9CB, 0x4719,
+ 0xE9EF, 0xE9EF, 0x4734, 0xEA43, 0xEA43, 0x4779, 0xEAA9, 0xEAA9, 0x47CC,
+ 0xEABF, 0xEAC1, 0x47DC, 0xEAC5, 0xEAC5, 0x47E0, 0xEAC9, 0xEACC, 0x47E2,
+ 0xEACF, 0xEAD1, 0x47E8, 0xEAD3, 0xEAD4, 0x47EB, 0xEAD6, 0xEADA, 0x47EE,
+ 0xEADC, 0xEADC, 0x47F3, 0xEADE, 0xEAE3, 0x47F4, 0xEAE7, 0xEAEC, 0x47FA,
+ 0xEAEE, 0xEAEE, 0x4800, 0xEAF0, 0xEAF2, 0x4801, 0xEAF4, 0xEAF4, 0x43B0,
+ 0xEAF5, 0xEAF6, 0x4804, 0xEAF8, 0xEAF8, 0x4807, 0xEAF9, 0xEAF9, 0x43B2,
+ 0xEAFA, 0xEAFB, 0x4808, 0xEAFE, 0xEAFF, 0x480B, 0xEB00, 0xEB00, 0x480D,
+ 0xEB02, 0xEB05, 0x480E, 0xEB08, 0xEB0F, 0x4813, 0xEB11, 0xEB12, 0x481B,
+ 0xEB15, 0xEB15, 0x481E, 0xEB18, 0xEB1D, 0x4821, 0xEB1F, 0xEB21, 0x4827,
+ 0xEB23, 0xEB23, 0x482A, 0xEB25, 0xEB25, 0x482B, 0xEB27, 0xEB27, 0x482C,
+ 0xEB2A, 0xEB2A, 0x482D, 0xEB2C, 0xEB39, 0x482E, 0xEB3D, 0xEB3D, 0x3D9B,
+ 0xEB3E, 0xEB3F, 0x483C, 0xEB41, 0xEB41, 0x3D9D, 0xEB43, 0xEB44, 0x483E,
+ 0xEB46, 0xEB46, 0x3DA0, 0xEB4A, 0xEB4A, 0x4841, 0xEB4B, 0xEB4C, 0x3DA3,
+ 0xEB4D, 0xEB4E, 0x4842, 0xEB4F, 0xEB50, 0x3DA5, 0xEB53, 0xEB53, 0x4844,
+ 0xEB54, 0xEB54, 0x3DA9, 0xEB55, 0xEB56, 0x4845, 0xEB57, 0xEB57, 0x3DAA,
+ 0xEB58, 0xEB59, 0x4847, 0xEB5A, 0xEB5B, 0x3DAB, 0xEB5D, 0xEB5D, 0x3DAE,
+ 0xEB5F, 0xEB5F, 0x3DB0, 0xEB61, 0xEB61, 0x3DB2, 0xEB62, 0xEB63, 0x4849,
+ 0xEB65, 0xEB65, 0x484C, 0xEB67, 0xEB67, 0x484D, 0xEB68, 0xEB69, 0x3DB4,
+ 0xEB6B, 0xEB6B, 0x3DB7, 0xEB6D, 0xEB6D, 0x3DB9, 0xEB6F, 0xEB71, 0x484E,
+ 0xEB73, 0xEB73, 0x4851, 0xEB74, 0xEB74, 0x3DBC, 0xEB76, 0xEB76, 0x43D0,
+ 0xEB77, 0xEB77, 0x4853, 0xEB78, 0xEB78, 0x3DBD, 0xEB7A, 0xEB7A, 0x4854,
+ 0xEB7E, 0xEB7F, 0x4856, 0xEB80, 0xEB81, 0x3DC1, 0xEB83, 0xEB84, 0x4858,
+ 0xEB85, 0xEB85, 0x3DC4, 0xEB88, 0xEB88, 0x485A, 0xEB89, 0xEB89, 0x3DC6,
+ 0xEB8A, 0xEB8A, 0x485B, 0xEB8C, 0xEB8E, 0x485C, 0xEB8F, 0xEB8F, 0x3DC8,
+ 0xEB90, 0xEB90, 0x485F, 0xEB93, 0xEB93, 0x3DCB, 0xEB95, 0xEB95, 0x4860,
+ 0xEB97, 0xEB97, 0x3DCE, 0xEB98, 0xEB9A, 0x4861, 0xEB9B, 0xEB9B, 0x3DCF,
+ 0xEB9F, 0xEB9F, 0x4866, 0xEBA0, 0xEBA0, 0x3DD1, 0xEBA2, 0xEBA2, 0x4867,
+ 0xEBA3, 0xEBA3, 0x3DD3, 0xEBA5, 0xEBA6, 0x4868, 0xEBA8, 0xEBA8, 0x3DD6,
+ 0xEBAA, 0xEBAA, 0x486A, 0xEBAB, 0xEBAB, 0x3DD8, 0xEBAD, 0xEBAD, 0x3DDA,
+ 0xEBAE, 0xEBAE, 0x486B, 0xEBAF, 0xEBAF, 0x3DDB, 0xEBB0, 0xEBB0, 0x486C,
+ 0xEBB2, 0xEBB3, 0x486D, 0xEBB4, 0xEBB4, 0x3DDD, 0xEBB6, 0xEBB6, 0x3DDF,
+ 0xEBB9, 0xEBB9, 0x3DE2, 0xEBBC, 0xEBBC, 0x3DE4, 0xEBBD, 0xEBBD, 0x4870,
+ 0xEBBF, 0xEBBF, 0x3DE6, 0xEBC2, 0xEBC2, 0x3DE9, 0xEBC5, 0xEBC6, 0x4872,
+ 0xEBC7, 0xEBC7, 0x3DEB, 0xEBC8, 0xEBC8, 0x4874, 0xEBCA, 0xEBCA, 0x4875,
+ 0xEBCC, 0xEBCD, 0x3DEE, 0xEBCE, 0xEBCE, 0x4876, 0xEBD0, 0xEBD0, 0x4877,
+ 0xEBD3, 0xEBD3, 0x4878, 0xEBD5, 0xEBD5, 0x4879, 0xEBD7, 0xEBD8, 0x3DF4,
+ 0xEBDA, 0xEBDB, 0x487A, 0xEBDD, 0xEBDD, 0x3DF8, 0xEBDF, 0xEBDF, 0x487C,
+ 0xEBE1, 0xEBE1, 0x487D, 0xEBE4, 0xEBE4, 0x487E, 0xEBE7, 0xEBE7, 0x3DFF,
+ 0xEBE8, 0xEBE9, 0x487F, 0xEBEB, 0xEBEC, 0x4881, 0xEBEE, 0xEBEE, 0x3E02,
+ 0xEBEF, 0xEBEF, 0x4883, 0xEBF1, 0xEBF1, 0x4884, 0xEBF2, 0xEBF2, 0x3E04,
+ 0xEBF5, 0xEBF5, 0x4886, 0xEBF6, 0xEBF6, 0x3E06, 0xEBF9, 0xEBFB, 0x3E09,
+ 0xEBFD, 0xEBFE, 0x3E0D, 0xEC05, 0xEC06, 0x3E14, 0xEC08, 0xEC09, 0x4888,
+ 0xEC0C, 0xEC0C, 0x3E18, 0xEC0E, 0xEC10, 0x3E1A, 0xEC13, 0xEC13, 0x488B,
+ 0xEC14, 0xEC14, 0x3E1F, 0xEC17, 0xEC18, 0x3E22, 0xEC19, 0xEC1C, 0x488C,
+ 0xEC1D, 0xEC1D, 0x3E24, 0xEC20, 0xEC20, 0x4890, 0xEC22, 0xEC22, 0x3E28,
+ 0xEC24, 0xEC24, 0x3E2A, 0xEC26, 0xEC26, 0x3E2C, 0xEC2A, 0xEC2A, 0x3E30,
+ 0xEC2B, 0xEC2B, 0x4891, 0xEC2C, 0xEC2E, 0x3E31, 0xEC2F, 0xEC2F, 0x4892,
+ 0xEC31, 0xEC31, 0x3E35, 0xEC32, 0xEC32, 0x4893, 0xEC35, 0xEC35, 0x3E38,
+ 0xEC37, 0xEC37, 0x3E3A, 0xEC3B, 0xEC3C, 0x3E3E, 0xEC3F, 0xEC41, 0x4894,
+ 0xEC42, 0xEC42, 0x3E42, 0xEC43, 0xEC43, 0x4897, 0xEC44, 0xEC44, 0x43E8,
+ 0xEC45, 0xEC49, 0x4898, 0xEC4B, 0xEC4C, 0x489D, 0xEC4F, 0xEC4F, 0x48A0,
+ 0xEC52, 0xEC52, 0x48A1, 0xEC54, 0xEC54, 0x48A2, 0xEC56, 0xEC58, 0x48A3,
+ 0xEC5A, 0xEC5A, 0x48A6, 0xEC5C, 0xEC5D, 0x48A7, 0xEC5F, 0xEC60, 0x48A9,
+ 0xEC62, 0xEC63, 0x48AC, 0xEC67, 0xEC67, 0x48AF, 0xEC68, 0xEC68, 0x3E4D,
+ 0xEC69, 0xEC73, 0x48B0, 0xEC75, 0xEC76, 0x48BC, 0xEC79, 0xEC79, 0x48C0,
+ 0xEC7B, 0xEC7B, 0x48C2, 0xEC7E, 0xEC7E, 0x48C3, 0xEC80, 0xEC80, 0x48C5,
+ 0xEC84, 0xEC84, 0x48C8, 0xEC86, 0xEC86, 0x48CA, 0xEC8D, 0xEC8D, 0x48CC,
+ 0xEC8E, 0xEC8E, 0x3E55, 0xEC91, 0xEC91, 0x48CE, 0xEC92, 0xEC92, 0x3E58,
+ 0xEC93, 0xEC94, 0x48CF, 0xEC95, 0xEC95, 0x3E59, 0xEC96, 0xEC96, 0x48D1,
+ 0xEC98, 0xEC98, 0x48D2, 0xEC99, 0xEC99, 0x3E5B, 0xEC9A, 0xEC9B, 0x48D3,
+ 0xEC9D, 0xEC9D, 0x48D6, 0xEC9E, 0xEC9E, 0x3E5C, 0xECA0, 0xECA0, 0x48D7,
+ 0xECA3, 0xECA4, 0x48D8, 0xECA7, 0xECA8, 0x48DA, 0xECAB, 0xECAB, 0x48DC,
+ 0xECAD, 0xECAD, 0x48DD, 0xECAF, 0xECAF, 0x3E65, 0xECB4, 0xECB4, 0x48DF,
+ 0xECB6, 0xECB6, 0x3E6B, 0xECB9, 0xECBB, 0x48E1, 0xECCF, 0xECCF, 0x3E80,
+ 0xECD4, 0xECD4, 0x3E85, 0xECDB, 0xECDC, 0x3E8C, 0xECDE, 0xECDE, 0x48E4,
+ 0xECDF, 0xECE1, 0x3E8F, 0xECE5, 0xECE5, 0x3E95, 0xECF0, 0xECF0, 0x3EA0,
+ 0xECF2, 0xECF2, 0x3EA2, 0xECF5, 0xECF5, 0x3EA5, 0xECFC, 0xECFC, 0x3EAC,
+ 0xED04, 0xED04, 0x48E7, 0xED07, 0xED07, 0x48E8, 0xED0A, 0xED0A, 0x48EA,
+ 0xED0C, 0xED11, 0x48EB, 0xED13, 0xED13, 0x48F1, 0xED15, 0xED17, 0x48F2,
+ 0xED18, 0xED18, 0x3EBA, 0xED1A, 0xED1A, 0x48F5, 0xED1C, 0xED1C, 0x48F6,
+ 0xED1D, 0xED1D, 0x3EBD, 0xED1E, 0xED1E, 0x48F7, 0xED22, 0xED22, 0x48F8,
+ 0xED24, 0xED25, 0x3EC2, 0xED26, 0xED27, 0x48F9, 0xED29, 0xED29, 0x3EC5,
+ 0xED2A, 0xED2A, 0x48FB, 0xED2C, 0xED2C, 0x3EC7, 0xED2D, 0xED2D, 0x48FC,
+ 0xED3B, 0xED3B, 0x3ECF, 0xED3D, 0xED3D, 0x4904, 0xED41, 0xED42, 0x4906,
+ 0xED45, 0xED45, 0x4908, 0xED47, 0xED47, 0x3ED5, 0xED4A, 0xED4B, 0x4909,
+ 0xED4D, 0xED4E, 0x490B, 0xED4F, 0xED4F, 0x3EDA, 0xED51, 0xED51, 0x490D,
+ 0xED52, 0xED52, 0x3EDC, 0xED53, 0xED54, 0x490E, 0xED57, 0xED58, 0x4910,
+ 0xED5F, 0xED5F, 0x3EE5, 0xED62, 0xED62, 0x3EE8, 0xED6B, 0xED6B, 0x3EF1,
+ 0xED71, 0xED71, 0x4912, 0xED72, 0xED72, 0x3EF7, 0xED75, 0xED75, 0x4913,
+ 0xED77, 0xED77, 0x4915, 0xED78, 0xED78, 0x3EFA, 0xED7A, 0xED7A, 0x4916,
+ 0xED81, 0xED81, 0x4917, 0xED84, 0xED85, 0x3F04, 0xED86, 0xED86, 0x4918,
+ 0xED88, 0xED88, 0x3F07, 0xED89, 0xED8A, 0x4919, 0xED8B, 0xED8B, 0x3F08,
+ 0xED8E, 0xED8E, 0x3F0B, 0xED91, 0xED91, 0x3F0E, 0xEDA6, 0xEDA6, 0x491C,
+ 0xEDC6, 0xEDC6, 0x3F41, 0xEDCF, 0xEDCF, 0x3F4A, 0xEDD1, 0xEDD1, 0x491E,
+ 0xEDD7, 0xEDD7, 0x491F, 0xEDDA, 0xEDDA, 0x3F53, 0xEDDB, 0xEDDB, 0x4920,
+ 0xEDDD, 0xEDDD, 0x4921, 0xEDE1, 0xEDE1, 0x3F58, 0xEDED, 0xEDED, 0x3F64,
+ 0xEE08, 0xEE08, 0x3F7E, 0xEE11, 0xEE11, 0x3F87, 0xEE15, 0xEE15, 0x4925,
+ 0xEE1B, 0xEE1B, 0x4926, 0xEE20, 0xEE20, 0x3F94, 0xEE22, 0xEE22, 0x4927,
+ 0xEE2A, 0xEE2A, 0x3F9D, 0xEE30, 0xEE30, 0x4928, 0xEE31, 0xEE31, 0x3FA3,
+ 0xEE34, 0xEE34, 0x3FA6, 0xEE48, 0xEE48, 0x4929, 0xEE56, 0xEE56, 0x492A,
+ 0xEE5B, 0xEE5B, 0x492B, 0xEE5D, 0xEE5D, 0x3FCC, 0xEE60, 0xEE60, 0x492C,
+ 0xEE64, 0xEE64, 0x3FD2, 0xEE6A, 0xEE6A, 0x3FD8, 0xEE76, 0xEE76, 0x3FE4,
+ 0xEE7C, 0xEE7C, 0x3FEA, 0xEE7E, 0xEE7E, 0x492D, 0xEE91, 0xEE91, 0x3FFD,
+ 0xEE9C, 0xEE9C, 0x492F, 0xEEA1, 0xEEA6, 0x4931, 0xEEA7, 0xEEA7, 0x43B4,
+ 0xEEA8, 0xEEAA, 0x4937, 0xEEAC, 0xEEB1, 0x493A, 0xEEB4, 0xEEB4, 0x4942,
+ 0xEEB7, 0xEEB7, 0x4945, 0xF303, 0xF318, 0x44C9, 0xF325, 0xF325, 0x496D,
+ 0xF327, 0xF327, 0x496F, 0xF344, 0xF344, 0x498C, 0xF346, 0xF346, 0x498E,
+ 0xF34A, 0xF34B, 0x499C, 0xF3A0, 0xF3A1, 0x4534, 0xF3AC, 0xF3AC, 0x453B,
+ 0xF3F0, 0xF3F0, 0x4575, 0xF3F9, 0xF3FA, 0x457C, 0xF3FC, 0xF3FC, 0x457F,
+ 0xF408, 0xF40B, 0x4589, 0xF43D, 0xF43D, 0x45B5, 0xF440, 0xF442, 0x430B,
+ 0xF444, 0xF444, 0x430F, 0xF446, 0xF446, 0x4311, 0xF448, 0xF449, 0x4313,
+ 0xF44B, 0xF44B, 0x4316, 0xF44D, 0xF44D, 0x4318, 0xF450, 0xF452, 0x431B,
+ 0xF454, 0xF456, 0x431F, 0xF457, 0xF457, 0x45B7, 0xF45A, 0xF45A, 0x4325,
+ 0xF45B, 0xF45B, 0x45B8, 0xF45C, 0xF45F, 0x4327, 0xF461, 0xF463, 0x432C,
+ 0xF465, 0xF466, 0x4330, 0xF469, 0xF469, 0x4334, 0xF46C, 0xF46D, 0x4337,
+ 0xF46E, 0xF46E, 0x45B9, 0xF46F, 0xF46F, 0x433A, 0xF474, 0xF474, 0x45BA,
+ 0xF477, 0xF477, 0x45BB, 0xF478, 0xF478, 0x4343, 0xF479, 0xF479, 0x45BC,
+ 0xF47B, 0xF47B, 0x45BD, 0xF47C, 0xF47E, 0x4347, 0xF480, 0xF481, 0x434B,
+ 0xF483, 0xF483, 0x45BE, 0xF484, 0xF485, 0x434F, 0xF488, 0xF488, 0x4353,
+ 0xF48B, 0xF48B, 0x4356, 0xF48D, 0xF490, 0x4358, 0xF491, 0xF491, 0x45BF,
+ 0xF497, 0xF498, 0x4362, 0xF49B, 0xF49B, 0x4366, 0xF49E, 0xF49E, 0x4369,
+ 0xF4A4, 0xF4A6, 0x436F, 0xF4A7, 0xF4A7, 0x45C1, 0xF4A9, 0xF4AA, 0x4374,
+ 0xF4AD, 0xF4AD, 0x4378, 0xF4AF, 0xF4B0, 0x437A, 0xF4B2, 0xF4B2, 0x45C3,
+ 0xF4B3, 0xF4B4, 0x437E, 0xF4B7, 0xF4B7, 0x4382, 0xF4BA, 0xF4C0, 0x4385,
+ 0xF4C1, 0xF4C1, 0x45C4, 0xF4C3, 0xF4C5, 0x45C5, 0xF4C7, 0xF4CA, 0x45C9,
+ 0xF4CC, 0xF4CF, 0x45CE, 0xF4D1, 0xF4D5, 0x45D2, 0xF4D7, 0xF4D7, 0x45D8,
+ 0xF4D9, 0xF4DA, 0x45DA, 0xF4DB, 0xF4DC, 0x438C, 0xF4DD, 0xF4DE, 0x45DC,
+ 0xF4DF, 0xF4DF, 0x438E, 0xF4E0, 0xF4E0, 0x45DE, 0xF4E2, 0xF4E2, 0x45DF,
+ 0xF4E3, 0xF4E3, 0x4390, 0xF4E4, 0xF4E4, 0x45E0, 0xF4E5, 0xF4E5, 0x4391,
+ 0xF4E6, 0xF4E6, 0x45E1, 0xF4E7, 0xF4E9, 0x4392, 0xF4EF, 0xF4EF, 0x45E5,
+ 0xF4F2, 0xF4F2, 0x4397, 0xF4F3, 0xF4F3, 0x45E8, 0xF4F8, 0xF4F8, 0x45EB,
+ 0xF4FC, 0xF4FC, 0x45EE, 0xF4FE, 0xF4FF, 0x45F0, 0xF500, 0xF501, 0x45F2,
+ 0xF503, 0xF503, 0x45F4, 0xF505, 0xF505, 0x45F6, 0xF507, 0xF511, 0x45F8,
+ 0xF513, 0xF516, 0x4604, 0xF518, 0xF51D, 0x4609, 0xF51F, 0xF526, 0x4610,
+ 0xF52A, 0xF52A, 0x461B, 0xF533, 0xF534, 0x4624, 0xF53A, 0xF53B, 0x44E1,
+ 0xF53D, 0xF53D, 0x44E4, 0xF54E, 0xF54E, 0x44F5, 0xF553, 0xF553, 0x44FA,
+ 0xF556, 0xF556, 0x44FC, 0xF559, 0xF55A, 0x44FF, 0xF55E, 0xF55E, 0x4504,
+ 0xF565, 0xF565, 0x450B, 0xF56B, 0xF56B, 0x4511, 0xF572, 0xF572, 0x4518,
+ 0xF694, 0xF694, 0x467C, 0xF69E, 0xF69E, 0x4686, 0xF6AD, 0xF6AD, 0x4694,
+ 0xF6B0, 0xF6B0, 0x4697, 0xF7E5, 0xF7E6, 0x36AF, 0xF7E8, 0xF7E8, 0x36B2,
+ 0xF7EA, 0xF7EB, 0x36B4, 0xF7ED, 0xF7EE, 0x36B7, 0xFA0C, 0xFA0C, 0x0274,
+ 0xFA0D, 0xFA0D, 0x2381, 0xFE30, 0xFE30, 0x006D, 0xFE31, 0xFE31, 0x007A,
+ 0xFE33, 0xFE33, 0x35AF, 0xFE34, 0xFE34, 0x35B1, 0xFE35, 0xFE36, 0x0082,
+ 0xFE37, 0xFE38, 0x0086, 0xFE39, 0xFE3A, 0x008A, 0xFE3B, 0xFE3C, 0x008E,
+ 0xFE3D, 0xFE3E, 0x0092, 0xFE3F, 0xFE40, 0x0096, 0xFE41, 0xFE42, 0x009A,
+ 0xFE43, 0xFE44, 0x009E, 0xFE49, 0xFE4A, 0x00C7, 0xFE4B, 0xFE4C, 0x00CB,
+ 0xFE4D, 0xFE4E, 0x00C9, 0xFE4F, 0xFE4F, 0x35B2, 0xFE50, 0xFE50, 0x0070,
+ 0xFE52, 0xFE52, 0x0072, 0xFE54, 0xFE57, 0x0074, 0xFE59, 0xFE5E, 0x00A0,
+ 0xFE5F, 0xFE61, 0x00CD, 0xFE62, 0xFE66, 0x00DF, 0xFE69, 0xFE6B, 0x010C,
+ 0xFF01, 0xFF01, 0x006C, 0xFF02, 0xFF02, 0x36E4, 0xFF03, 0xFF03, 0x00AE,
+ 0xFF04, 0xFF04, 0x0103, 0xFF05, 0xFF05, 0x0108, 0xFF06, 0xFF06, 0x00AF,
+ 0xFF07, 0xFF07, 0x36E3, 0xFF08, 0xFF09, 0x0080, 0xFF0A, 0xFF0A, 0x00B0,
+ 0xFF0B, 0xFF0B, 0x00D0, 0xFF0C, 0xFF0C, 0x0064, 0xFF0D, 0xFF0D, 0x00D1,
+ 0xFF0E, 0xFF0E, 0x0067, 0xFF0F, 0xFF0F, 0x0101, 0xFF10, 0xFF19, 0x014D,
+ 0xFF1A, 0xFF1A, 0x006A, 0xFF1B, 0xFF1B, 0x0069, 0xFF1C, 0xFF1C, 0x00D6,
+ 0xFF1D, 0xFF1D, 0x00D8, 0xFF1E, 0xFF1E, 0x00D7, 0xFF1F, 0xFF1F, 0x006B,
+ 0xFF20, 0xFF20, 0x0109, 0xFF21, 0xFF3A, 0x016D, 0xFF3B, 0xFF3B, 0x35BE,
+ 0xFF3C, 0xFF3C, 0x0102, 0xFF3D, 0xFF3D, 0x35BF, 0xFF3E, 0xFF3E, 0x35B4,
+ 0xFF3F, 0xFF3F, 0x00C5, 0xFF41, 0xFF5A, 0x0187, 0xFF5B, 0xFF5B, 0x0084,
+ 0xFF5C, 0xFF5C, 0x0078, 0xFF5D, 0xFF5D, 0x0085, 0xFF64, 0xFF64, 0x0071,
+ 0xFFE2, 0xFFE2, 0x36E1, 0xFFE4, 0xFFE4, 0x36E2,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp
new file mode 100644
index 0000000000..eed5e1f32b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UCS2_V_3[13 * 3] = {
+ 0x2013, 0x2013, 0x0078, 0x2014, 0x2014, 0x007A, 0x2025, 0x2025, 0x006D,
+ 0x3008, 0x3009, 0x0096, 0x300A, 0x300B, 0x0092, 0x300C, 0x300D, 0x009A,
+ 0x300E, 0x300F, 0x009E, 0x3010, 0x3011, 0x008E, 0x3014, 0x3015, 0x008A,
+ 0xFE4F, 0xFE4F, 0x35B1, 0xFF08, 0xFF09, 0x0082, 0xFF5B, 0xFF5B, 0x0086,
+ 0xFF5D, 0xFF5D, 0x0087,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
new file mode 100644
index 0000000000..d29a725fb6
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp
@@ -0,0 +1,3651 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0[14557 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x003D, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A2, 0x0106,
+ 0x00A3, 0x0107, 0x00A5, 0x0104, 0x00A7, 0x00B2, 0x00A8, 0x35B3,
+ 0x00AC, 0x36E1, 0x00AF, 0x00C3, 0x00B0, 0x0118, 0x00B1, 0x00D4,
+ 0x00B7, 0x0073, 0x00D7, 0x00D2, 0x00F7, 0x00D3, 0x02C6, 0x35B4,
+ 0x02C7, 0x01F8, 0x02CA, 0x01F7, 0x02CB, 0x01F9, 0x02CD, 0x00C6,
+ 0x02D9, 0x01F6, 0x0308, 0x35B3, 0x0391, 0x01A1, 0x0392, 0x01A2,
+ 0x0393, 0x01A3, 0x0394, 0x01A4, 0x0395, 0x01A5, 0x0396, 0x01A6,
+ 0x0397, 0x01A7, 0x0398, 0x01A8, 0x0399, 0x01A9, 0x039A, 0x01AA,
+ 0x039B, 0x01AB, 0x039C, 0x01AC, 0x039D, 0x01AD, 0x039E, 0x01AE,
+ 0x039F, 0x01AF, 0x03A0, 0x01B0, 0x03A1, 0x01B1, 0x03A3, 0x01B2,
+ 0x03A4, 0x01B3, 0x03A5, 0x01B4, 0x03A6, 0x01B5, 0x03A7, 0x01B6,
+ 0x03A8, 0x01B7, 0x03A9, 0x01B8, 0x03B1, 0x01B9, 0x03B2, 0x01BA,
+ 0x03B3, 0x01BB, 0x03B4, 0x01BC, 0x03B5, 0x01BD, 0x03B6, 0x01BE,
+ 0x03B7, 0x01BF, 0x03B8, 0x01C0, 0x03B9, 0x01C1, 0x03BA, 0x01C2,
+ 0x03BB, 0x01C3, 0x03BC, 0x01C4, 0x03BD, 0x01C5, 0x03BE, 0x01C6,
+ 0x03BF, 0x01C7, 0x03C0, 0x01C8, 0x03C1, 0x01C9, 0x03C3, 0x01CA,
+ 0x03C4, 0x01CB, 0x03C5, 0x01CC, 0x03C6, 0x01CD, 0x03C7, 0x01CE,
+ 0x03C8, 0x01CF, 0x03C9, 0x01D0, 0x0401, 0x3670, 0x0410, 0x366A,
+ 0x0411, 0x366B, 0x0412, 0x366C, 0x0413, 0x366D, 0x0414, 0x366E,
+ 0x0415, 0x366F, 0x0416, 0x3671, 0x0417, 0x3672, 0x0418, 0x3673,
+ 0x0419, 0x3674, 0x041A, 0x3675, 0x041B, 0x3676, 0x041C, 0x3677,
+ 0x041D, 0x3678, 0x041E, 0x3679, 0x041F, 0x367A, 0x0420, 0x367B,
+ 0x0421, 0x367C, 0x0422, 0x367D, 0x0423, 0x367E, 0x0424, 0x367F,
+ 0x0425, 0x3680, 0x0426, 0x3681, 0x0427, 0x3682, 0x0428, 0x3683,
+ 0x0429, 0x3684, 0x042A, 0x3685, 0x042B, 0x3686, 0x042C, 0x3687,
+ 0x042D, 0x3688, 0x042E, 0x3689, 0x042F, 0x368A, 0x0430, 0x368B,
+ 0x0431, 0x368C, 0x0432, 0x368D, 0x0433, 0x368E, 0x0434, 0x368F,
+ 0x0435, 0x3690, 0x0436, 0x3692, 0x0437, 0x3693, 0x0438, 0x3694,
+ 0x0439, 0x3695, 0x043A, 0x3696, 0x043B, 0x3697, 0x043C, 0x3698,
+ 0x043D, 0x3699, 0x043E, 0x369A, 0x043F, 0x369B, 0x0440, 0x369C,
+ 0x0441, 0x369D, 0x0442, 0x369E, 0x0443, 0x369F, 0x0444, 0x36A0,
+ 0x0445, 0x36A1, 0x0446, 0x36A2, 0x0447, 0x36A3, 0x0448, 0x36A4,
+ 0x0449, 0x36A5, 0x044A, 0x36A6, 0x044B, 0x36A7, 0x044C, 0x36A8,
+ 0x044D, 0x36A9, 0x044E, 0x36AA, 0x044F, 0x36AB, 0x0451, 0x3691,
+ 0x2013, 0x0079, 0x2014, 0x007B, 0x2018, 0x00A6, 0x2019, 0x00A7,
+ 0x201C, 0x00A8, 0x201D, 0x00A9, 0x2022, 0x0068, 0x2025, 0x006F,
+ 0x2026, 0x006E, 0x2027, 0x0068, 0x2032, 0x00AD, 0x2035, 0x00AC,
+ 0x203B, 0x00B1, 0x203E, 0x00C3, 0x2103, 0x010A, 0x2105, 0x00C2,
+ 0x2109, 0x010B, 0x2116, 0x36E6, 0x2121, 0x36E7, 0x2160, 0x0157,
+ 0x2161, 0x0158, 0x2162, 0x0159, 0x2163, 0x015A, 0x2164, 0x015B,
+ 0x2165, 0x015C, 0x2166, 0x015D, 0x2167, 0x015E, 0x2168, 0x015F,
+ 0x2169, 0x0160, 0x2170, 0x020E, 0x2171, 0x020F, 0x2172, 0x0210,
+ 0x2173, 0x0211, 0x2174, 0x0212, 0x2175, 0x0213, 0x2176, 0x0214,
+ 0x2177, 0x0215, 0x2178, 0x0216, 0x2179, 0x0217, 0x2190, 0x00F8,
+ 0x2191, 0x00F5, 0x2192, 0x00F7, 0x2193, 0x00F6, 0x2196, 0x00F9,
+ 0x2197, 0x00FA, 0x2198, 0x00FC, 0x2199, 0x00FB, 0x21B8, 0x36AD,
+ 0x21B9, 0x36AE, 0x21E7, 0x36AC, 0x2215, 0x0101, 0x221A, 0x00D5,
+ 0x221E, 0x00DC, 0x221F, 0x00E9, 0x2220, 0x00E8, 0x2223, 0x00FE,
+ 0x2225, 0x00FD, 0x2229, 0x00E5, 0x222A, 0x00E6, 0x222B, 0x00ED,
+ 0x222E, 0x00EE, 0x2234, 0x00F0, 0x2235, 0x00EF, 0x223C, 0x00E4,
+ 0x2252, 0x00DD, 0x2260, 0x00DB, 0x2261, 0x00DE, 0x2266, 0x00D9,
+ 0x2267, 0x00DA, 0x2295, 0x00F3, 0x2299, 0x00F4, 0x22A5, 0x00E7,
+ 0x22BF, 0x00EA, 0x22EF, 0x006E, 0x2400, 0x0232, 0x2401, 0x0233,
+ 0x2402, 0x0234, 0x2403, 0x0235, 0x2404, 0x0236, 0x2405, 0x0237,
+ 0x2406, 0x0238, 0x2407, 0x0239, 0x2408, 0x023A, 0x2409, 0x023B,
+ 0x240A, 0x023C, 0x240B, 0x023D, 0x240C, 0x023E, 0x240D, 0x023F,
+ 0x240E, 0x0240, 0x240F, 0x0241, 0x2410, 0x0242, 0x2411, 0x0243,
+ 0x2412, 0x0244, 0x2413, 0x0245, 0x2414, 0x0246, 0x2415, 0x0247,
+ 0x2416, 0x0248, 0x2417, 0x0249, 0x2418, 0x024A, 0x2419, 0x024B,
+ 0x241A, 0x024C, 0x241B, 0x024D, 0x241C, 0x024E, 0x241D, 0x024F,
+ 0x241E, 0x0250, 0x241F, 0x0251, 0x2421, 0x0252, 0x2460, 0x01FA,
+ 0x2461, 0x01FB, 0x2462, 0x01FC, 0x2463, 0x01FD, 0x2464, 0x01FE,
+ 0x2465, 0x01FF, 0x2466, 0x0200, 0x2467, 0x0201, 0x2468, 0x0202,
+ 0x2469, 0x0203, 0x2474, 0x0204, 0x2475, 0x0205, 0x2476, 0x0206,
+ 0x2477, 0x0207, 0x2478, 0x0208, 0x2479, 0x0209, 0x247A, 0x020A,
+ 0x247B, 0x020B, 0x247C, 0x020C, 0x247D, 0x020D, 0x2500, 0x0137,
+ 0x2502, 0x0138, 0x250C, 0x013A, 0x2510, 0x013B, 0x2514, 0x013C,
+ 0x2518, 0x013D, 0x251C, 0x0135, 0x2524, 0x0134, 0x252C, 0x0133,
+ 0x2534, 0x0132, 0x253C, 0x0131, 0x2550, 0x0142, 0x2551, 0x370A,
+ 0x2552, 0x36F8, 0x2553, 0x3701, 0x2554, 0x36EF, 0x2555, 0x36FA,
+ 0x2556, 0x3703, 0x2557, 0x36F1, 0x2558, 0x36FE, 0x2559, 0x3707,
+ 0x255A, 0x36F5, 0x255B, 0x3700, 0x255C, 0x3709, 0x255D, 0x36F7,
+ 0x255E, 0x0143, 0x255F, 0x3704, 0x2560, 0x36F2, 0x2561, 0x0145,
+ 0x2562, 0x3706, 0x2563, 0x36F4, 0x2564, 0x36F9, 0x2565, 0x3702,
+ 0x2566, 0x36F0, 0x2567, 0x36FF, 0x2568, 0x3708, 0x2569, 0x36F6,
+ 0x256A, 0x0144, 0x256B, 0x3705, 0x256C, 0x36F3, 0x256D, 0x013E,
+ 0x256E, 0x013F, 0x256F, 0x0141, 0x2570, 0x0140, 0x2571, 0x014A,
+ 0x2572, 0x014B, 0x2573, 0x014C, 0x2574, 0x35B0, 0x2581, 0x0122,
+ 0x2582, 0x0123, 0x2583, 0x0124, 0x2584, 0x0125, 0x2585, 0x0126,
+ 0x2586, 0x0127, 0x2587, 0x0128, 0x2588, 0x0129, 0x2589, 0x0130,
+ 0x258A, 0x012F, 0x258B, 0x012E, 0x258C, 0x012D, 0x258D, 0x012C,
+ 0x258E, 0x012B, 0x258F, 0x012A, 0x2593, 0x3710, 0x2594, 0x0136,
+ 0x2595, 0x0139, 0x25A0, 0x00BE, 0x25A1, 0x00BD, 0x25B2, 0x00B7,
+ 0x25B3, 0x00B6, 0x25BC, 0x00C0, 0x25BD, 0x00BF, 0x25C6, 0x00BC,
+ 0x25C7, 0x00BB, 0x25CB, 0x00B4, 0x25CE, 0x00B8, 0x25CF, 0x00B5,
+ 0x25E2, 0x0146, 0x25E3, 0x0147, 0x25E4, 0x0149, 0x25E5, 0x0148,
+ 0x2605, 0x00BA, 0x2606, 0x00B9, 0x2609, 0x00F4, 0x2640, 0x00F1,
+ 0x2641, 0x00F3, 0x2642, 0x00F2, 0x273D, 0x35C0, 0x2F00, 0x0253,
+ 0x2F01, 0x0218, 0x2F02, 0x0219, 0x2F03, 0x021A, 0x2F04, 0x0254,
+ 0x2F05, 0x021B, 0x2F06, 0x025A, 0x2F07, 0x021C, 0x2F08, 0x025B,
+ 0x2F09, 0x025C, 0x2F0A, 0x025D, 0x2F0B, 0x025E, 0x2F0C, 0x021D,
+ 0x2F0D, 0x021E, 0x2F0E, 0x021F, 0x2F0F, 0x025F, 0x2F10, 0x176E,
+ 0x2F11, 0x0260, 0x2F12, 0x0262, 0x2F13, 0x0220, 0x2F14, 0x0263,
+ 0x2F15, 0x176F, 0x2F16, 0x0221, 0x2F17, 0x0264, 0x2F18, 0x0265,
+ 0x2F19, 0x0222, 0x2F1A, 0x1770, 0x2F1B, 0x0223, 0x2F1C, 0x0266,
+ 0x2F1D, 0x0279, 0x2F1E, 0x1775, 0x2F1F, 0x027A, 0x2F20, 0x027B,
+ 0x2F21, 0x0224, 0x2F22, 0x0224, 0x2F23, 0x027C, 0x2F24, 0x027D,
+ 0x2F25, 0x027E, 0x2F26, 0x027F, 0x2F27, 0x0225, 0x2F28, 0x0282,
+ 0x2F29, 0x0283, 0x2F2A, 0x0284, 0x2F2B, 0x0285, 0x2F2C, 0x1776,
+ 0x2F2D, 0x0286, 0x2F2E, 0x0226, 0x2F2F, 0x0288, 0x2F30, 0x0289,
+ 0x2F31, 0x028C, 0x2F32, 0x028D, 0x2F33, 0x0227, 0x2F34, 0x0228,
+ 0x2F35, 0x0229, 0x2F36, 0x028E, 0x2F37, 0x028F, 0x2F38, 0x0290,
+ 0x2F39, 0x022A, 0x2F3A, 0x022B, 0x2F3B, 0x1777, 0x2F3C, 0x02D0,
+ 0x2F3D, 0x02D1, 0x2F3E, 0x02D2, 0x2F3F, 0x02D3, 0x2F40, 0x02D5,
+ 0x2F41, 0x022C, 0x2F42, 0x02D6, 0x2F43, 0x02D7, 0x2F44, 0x02D8,
+ 0x2F45, 0x02D9, 0x2F46, 0x022D, 0x2F47, 0x02DA, 0x2F48, 0x02DB,
+ 0x2F49, 0x02DC, 0x2F4A, 0x02DD, 0x2F4B, 0x02DE, 0x2F4C, 0x02DF,
+ 0x2F4D, 0x02E0, 0x2F4E, 0x178A, 0x2F4F, 0x02E1, 0x2F50, 0x02E2,
+ 0x2F51, 0x02E3, 0x2F52, 0x02E4, 0x2F53, 0x178C, 0x2F54, 0x02E5,
+ 0x2F55, 0x02E6, 0x2F56, 0x02E7, 0x2F57, 0x02E8, 0x2F58, 0x02E9,
+ 0x2F59, 0x178D, 0x2F5A, 0x02EA, 0x2F5B, 0x02EB, 0x2F5C, 0x02EC,
+ 0x2F5D, 0x02ED, 0x2F5E, 0x0356, 0x2F5F, 0x0357, 0x2F60, 0x0358,
+ 0x2F61, 0x0359, 0x2F62, 0x035A, 0x2F63, 0x035B, 0x2F64, 0x035C,
+ 0x2F65, 0x035E, 0x2F66, 0x0362, 0x2F67, 0x022E, 0x2F68, 0x022F,
+ 0x2F69, 0x0363, 0x2F6A, 0x0364, 0x2F6B, 0x0365, 0x2F6C, 0x0366,
+ 0x2F6D, 0x0367, 0x2F6E, 0x0368, 0x2F6F, 0x0369, 0x2F70, 0x036A,
+ 0x2F71, 0x17B2, 0x2F72, 0x036B, 0x2F73, 0x036C, 0x2F74, 0x036D,
+ 0x2F75, 0x03F6, 0x2F76, 0x03F7, 0x2F77, 0x03F8, 0x2F78, 0x03F9,
+ 0x2F79, 0x1812, 0x2F7A, 0x03FA, 0x2F7B, 0x03FB, 0x2F7C, 0x03FC,
+ 0x2F7D, 0x03FE, 0x2F7E, 0x03FF, 0x2F7F, 0x0400, 0x2F80, 0x0401,
+ 0x2F81, 0x0402, 0x2F82, 0x0405, 0x2F83, 0x0406, 0x2F84, 0x0407,
+ 0x2F85, 0x0408, 0x2F86, 0x0409, 0x2F87, 0x040A, 0x2F88, 0x040B,
+ 0x2F89, 0x040C, 0x2F8A, 0x040D, 0x2F8B, 0x1813, 0x2F8C, 0x1818,
+ 0x2F8D, 0x040F, 0x2F8E, 0x0410, 0x2F8F, 0x0411, 0x2F90, 0x0412,
+ 0x2F91, 0x1819, 0x2F92, 0x0508, 0x2F93, 0x0509, 0x2F94, 0x050A,
+ 0x2F95, 0x050B, 0x2F96, 0x050C, 0x2F97, 0x050D, 0x2F98, 0x18E7,
+ 0x2F99, 0x050E, 0x2F9A, 0x050F, 0x2F9B, 0x0510, 0x2F9C, 0x0511,
+ 0x2F9D, 0x0512, 0x2F9E, 0x0513, 0x2F9F, 0x0514, 0x2FA0, 0x0515,
+ 0x2FA1, 0x0230, 0x2FA2, 0x051B, 0x2FA3, 0x0520, 0x2FA4, 0x0521,
+ 0x2FA5, 0x0522, 0x2FA6, 0x0696, 0x2FA7, 0x0697, 0x2FA8, 0x0698,
+ 0x2FA9, 0x0699, 0x2FAA, 0x0231, 0x2FAB, 0x069F, 0x2FAC, 0x06A0,
+ 0x2FAE, 0x06A2, 0x2FAF, 0x0826, 0x2FB0, 0x0827, 0x2FB1, 0x0828,
+ 0x2FB2, 0x0829, 0x2FB3, 0x082A, 0x2FB4, 0x082B, 0x2FB5, 0x082C,
+ 0x2FB6, 0x082D, 0x2FB7, 0x082E, 0x2FB8, 0x082F, 0x2FB9, 0x0830,
+ 0x2FBA, 0x09F5, 0x2FBB, 0x09F6, 0x2FBC, 0x09F7, 0x2FBD, 0x1E33,
+ 0x2FBE, 0x09F8, 0x2FBF, 0x1E34, 0x2FC0, 0x09F9, 0x2FC1, 0x09FA,
+ 0x2FC2, 0x0BE1, 0x2FC3, 0x0BE2, 0x2FC4, 0x0BE3, 0x2FC5, 0x0BE4,
+ 0x2FC6, 0x0BE5, 0x2FC7, 0x0BE6, 0x2FC8, 0x0DBB, 0x2FC9, 0x0DBC,
+ 0x2FCA, 0x0DBD, 0x2FCB, 0x2360, 0x2FCC, 0x2612, 0x2FCD, 0x0F7B,
+ 0x2FCE, 0x0F7C, 0x2FCF, 0x0F7D, 0x2FD0, 0x1100, 0x2FD1, 0x1101,
+ 0x2FD2, 0x1289, 0x2FD3, 0x13B2, 0x2FD4, 0x13B3, 0x2FD5, 0x2F0D,
+ 0x3000, 0x0063, 0x3001, 0x0065, 0x3002, 0x0066, 0x3003, 0x00B3,
+ 0x3005, 0x35BA, 0x3006, 0x35BB, 0x3007, 0x35BC, 0x3008, 0x0094,
+ 0x3009, 0x0095, 0x300A, 0x0090, 0x300B, 0x0091, 0x300C, 0x0098,
+ 0x300D, 0x0099, 0x300E, 0x009C, 0x300F, 0x009D, 0x3010, 0x008C,
+ 0x3011, 0x008D, 0x3012, 0x0105, 0x3014, 0x0088, 0x3015, 0x0089,
+ 0x301D, 0x00AA, 0x301E, 0x00AB, 0x3021, 0x0161, 0x3022, 0x0162,
+ 0x3023, 0x0163, 0x3024, 0x0164, 0x3025, 0x0165, 0x3026, 0x0166,
+ 0x3027, 0x0167, 0x3028, 0x0168, 0x3029, 0x0169, 0x3038, 0x016A,
+ 0x3039, 0x016B, 0x303A, 0x016C, 0x3041, 0x35C1, 0x3042, 0x35C2,
+ 0x3043, 0x35C3, 0x3044, 0x35C4, 0x3045, 0x35C5, 0x3046, 0x35C6,
+ 0x3047, 0x35C7, 0x3048, 0x35C8, 0x3049, 0x35C9, 0x304A, 0x35CA,
+ 0x304B, 0x35CB, 0x304C, 0x35CC, 0x304D, 0x35CD, 0x304E, 0x35CE,
+ 0x304F, 0x35CF, 0x3050, 0x35D0, 0x3051, 0x35D1, 0x3052, 0x35D2,
+ 0x3053, 0x35D3, 0x3054, 0x35D4, 0x3055, 0x35D5, 0x3056, 0x35D6,
+ 0x3057, 0x35D7, 0x3058, 0x35D8, 0x3059, 0x35D9, 0x305A, 0x35DA,
+ 0x305B, 0x35DB, 0x305C, 0x35DC, 0x305D, 0x35DD, 0x305E, 0x35DE,
+ 0x305F, 0x35DF, 0x3060, 0x35E0, 0x3061, 0x35E1, 0x3062, 0x35E2,
+ 0x3063, 0x35E3, 0x3064, 0x35E4, 0x3065, 0x35E5, 0x3066, 0x35E6,
+ 0x3067, 0x35E7, 0x3068, 0x35E8, 0x3069, 0x35E9, 0x306A, 0x35EA,
+ 0x306B, 0x35EB, 0x306C, 0x35EC, 0x306D, 0x35ED, 0x306E, 0x35EE,
+ 0x306F, 0x35EF, 0x3070, 0x35F0, 0x3071, 0x35F1, 0x3072, 0x35F2,
+ 0x3073, 0x35F3, 0x3074, 0x35F4, 0x3075, 0x35F5, 0x3076, 0x35F6,
+ 0x3077, 0x35F7, 0x3078, 0x35F8, 0x3079, 0x35F9, 0x307A, 0x35FA,
+ 0x307B, 0x35FB, 0x307C, 0x35FC, 0x307D, 0x35FD, 0x307E, 0x35FE,
+ 0x307F, 0x35FF, 0x3080, 0x3600, 0x3081, 0x3601, 0x3082, 0x3602,
+ 0x3083, 0x3603, 0x3084, 0x3604, 0x3085, 0x3605, 0x3086, 0x3606,
+ 0x3087, 0x3607, 0x3088, 0x3608, 0x3089, 0x3609, 0x308A, 0x360A,
+ 0x308B, 0x360B, 0x308C, 0x360C, 0x308D, 0x360D, 0x308E, 0x360E,
+ 0x308F, 0x360F, 0x3090, 0x3610, 0x3091, 0x3611, 0x3092, 0x3612,
+ 0x3093, 0x3613, 0x309D, 0x35B7, 0x309E, 0x35B8, 0x30A1, 0x3614,
+ 0x30A2, 0x3615, 0x30A3, 0x3616, 0x30A4, 0x3617, 0x30A5, 0x3618,
+ 0x30A6, 0x3619, 0x30A7, 0x361A, 0x30A8, 0x361B, 0x30A9, 0x361C,
+ 0x30AA, 0x361D, 0x30AB, 0x361E, 0x30AC, 0x361F, 0x30AD, 0x3620,
+ 0x30AE, 0x3621, 0x30AF, 0x3622, 0x30B0, 0x3623, 0x30B1, 0x3624,
+ 0x30B2, 0x3625, 0x30B3, 0x3626, 0x30B4, 0x3627, 0x30B5, 0x3628,
+ 0x30B6, 0x3629, 0x30B7, 0x362A, 0x30B8, 0x362B, 0x30B9, 0x362C,
+ 0x30BA, 0x362D, 0x30BB, 0x362E, 0x30BC, 0x362F, 0x30BD, 0x3630,
+ 0x30BE, 0x3631, 0x30BF, 0x3632, 0x30C0, 0x3633, 0x30C1, 0x3634,
+ 0x30C2, 0x3635, 0x30C3, 0x3636, 0x30C4, 0x3637, 0x30C5, 0x3638,
+ 0x30C6, 0x3639, 0x30C7, 0x363A, 0x30C8, 0x363B, 0x30C9, 0x363C,
+ 0x30CA, 0x363D, 0x30CB, 0x363E, 0x30CC, 0x363F, 0x30CD, 0x3640,
+ 0x30CE, 0x3641, 0x30CF, 0x3642, 0x30D0, 0x3643, 0x30D1, 0x3644,
+ 0x30D2, 0x3645, 0x30D3, 0x3646, 0x30D4, 0x3647, 0x30D5, 0x3648,
+ 0x30D6, 0x3649, 0x30D7, 0x364A, 0x30D8, 0x364B, 0x30D9, 0x364C,
+ 0x30DA, 0x364D, 0x30DB, 0x364E, 0x30DC, 0x364F, 0x30DD, 0x3650,
+ 0x30DE, 0x3651, 0x30DF, 0x3652, 0x30E0, 0x3653, 0x30E1, 0x3654,
+ 0x30E2, 0x3655, 0x30E3, 0x3656, 0x30E4, 0x3657, 0x30E5, 0x3658,
+ 0x30E6, 0x3659, 0x30E7, 0x365A, 0x30E8, 0x365B, 0x30E9, 0x365C,
+ 0x30EA, 0x365D, 0x30EB, 0x365E, 0x30EC, 0x365F, 0x30ED, 0x3660,
+ 0x30EE, 0x3661, 0x30EF, 0x3662, 0x30F0, 0x3663, 0x30F1, 0x3664,
+ 0x30F2, 0x3665, 0x30F3, 0x3666, 0x30F4, 0x3667, 0x30F5, 0x3668,
+ 0x30F6, 0x3669, 0x30FC, 0x35BD, 0x30FD, 0x35B5, 0x30FE, 0x35B6,
+ 0x3105, 0x01D1, 0x3106, 0x01D2, 0x3107, 0x01D3, 0x3108, 0x01D4,
+ 0x3109, 0x01D5, 0x310A, 0x01D6, 0x310B, 0x01D7, 0x310C, 0x01D8,
+ 0x310D, 0x01D9, 0x310E, 0x01DA, 0x310F, 0x01DB, 0x3110, 0x01DC,
+ 0x3111, 0x01DD, 0x3112, 0x01DE, 0x3113, 0x01DF, 0x3114, 0x01E0,
+ 0x3115, 0x01E1, 0x3116, 0x01E2, 0x3117, 0x01E3, 0x3118, 0x01E4,
+ 0x3119, 0x01E5, 0x311A, 0x01E6, 0x311B, 0x01E7, 0x311C, 0x01E8,
+ 0x311D, 0x01E9, 0x311E, 0x01EA, 0x311F, 0x01EB, 0x3120, 0x01EC,
+ 0x3121, 0x01ED, 0x3122, 0x01EE, 0x3123, 0x01EF, 0x3124, 0x01F0,
+ 0x3125, 0x01F1, 0x3126, 0x01F2, 0x3127, 0x01F3, 0x3128, 0x01F4,
+ 0x3129, 0x01F5, 0x3231, 0x36E5, 0x32A3, 0x00C1, 0x338E, 0x0115,
+ 0x338F, 0x0116, 0x339C, 0x0110, 0x339D, 0x0111, 0x339E, 0x0112,
+ 0x33A1, 0x0114, 0x33C4, 0x0117, 0x33CE, 0x0113, 0x33D1, 0x00EC,
+ 0x33D2, 0x00EB, 0x33D5, 0x010F, 0x361D, 0x36B7, 0x4491, 0x36B4,
+ 0x4E00, 0x0253, 0x4E01, 0x0255, 0x4E03, 0x0256, 0x4E07, 0x1771,
+ 0x4E08, 0x0269, 0x4E09, 0x0267, 0x4E0A, 0x026A, 0x4E0B, 0x0268,
+ 0x4E0C, 0x1772, 0x4E0D, 0x0294, 0x4E0E, 0x177A, 0x4E0F, 0x1778,
+ 0x4E10, 0x0293, 0x4E11, 0x0292, 0x4E14, 0x02F2, 0x4E15, 0x02F1,
+ 0x4E16, 0x02F0, 0x4E18, 0x02F3, 0x4E19, 0x02EF, 0x4E1E, 0x036E,
+ 0x4E1F, 0x036F, 0x4E26, 0x0528, 0x4E28, 0x0218, 0x4E2B, 0x026B,
+ 0x4E2D, 0x0295, 0x4E2E, 0x177B, 0x4E30, 0x0296, 0x4E31, 0x178E,
+ 0x4E32, 0x0415, 0x4E33, 0x18F4, 0x4E36, 0x0219, 0x4E38, 0x026C,
+ 0x4E39, 0x0297, 0x4E3B, 0x02F4, 0x4E3C, 0x178F, 0x4E3F, 0x021A,
+ 0x4E41, 0x36AF, 0x4E42, 0x176C, 0x4E43, 0x0257, 0x4E45, 0x026E,
+ 0x4E47, 0x1773, 0x4E48, 0x026F, 0x4E4B, 0x0298, 0x4E4D, 0x02F5,
+ 0x4E4E, 0x02F7, 0x4E4F, 0x02F6, 0x4E52, 0x0370, 0x4E53, 0x0371,
+ 0x4E56, 0x0529, 0x4E58, 0x0831, 0x4E59, 0x0254, 0x4E5A, 0x36B1,
+ 0x4E5C, 0x176D, 0x4E5D, 0x0258, 0x4E5E, 0x0271, 0x4E5F, 0x0270,
+ 0x4E69, 0x0372, 0x4E73, 0x052A, 0x4E7E, 0x09FB, 0x4E7F, 0x1E35,
+ 0x4E82, 0x0DBE, 0x4E83, 0x2361, 0x4E84, 0x2362, 0x4E85, 0x021B,
+ 0x4E86, 0x0259, 0x4E88, 0x029A, 0x4E8B, 0x052B, 0x4E8C, 0x025A,
+ 0x4E8D, 0x1774, 0x4E8E, 0x0272, 0x4E91, 0x029B, 0x4E92, 0x029D,
+ 0x4E93, 0x177C, 0x4E94, 0x029E, 0x4E95, 0x029C, 0x4E99, 0x0373,
+ 0x4E9B, 0x052C, 0x4E9E, 0x052D, 0x4E9F, 0x06A3, 0x4EA0, 0x021C,
+ 0x4EA1, 0x0273, 0x4EA2, 0x029F, 0x4EA4, 0x0374, 0x4EA5, 0x0376,
+ 0x4EA6, 0x0375, 0x4EA8, 0x0416, 0x4EAB, 0x052E, 0x4EAC, 0x052F,
+ 0x4EAD, 0x06A4, 0x4EAE, 0x06A5, 0x4EB3, 0x0832, 0x4EB6, 0x2363,
+ 0x4EB9, 0x3377, 0x4EBA, 0x025B, 0x4EC0, 0x02A1, 0x4EC1, 0x02A0,
+ 0x4EC2, 0x177D, 0x4EC3, 0x02A2, 0x4EC4, 0x02A8, 0x4EC6, 0x02A3,
+ 0x4EC7, 0x02A4, 0x4EC8, 0x177F, 0x4EC9, 0x177E, 0x4ECA, 0x02A6,
+ 0x4ECB, 0x02A7, 0x4ECD, 0x02A5, 0x4ED4, 0x02FA, 0x4ED5, 0x02FB,
+ 0x4ED6, 0x02FC, 0x4ED7, 0x02FD, 0x4ED8, 0x02F9, 0x4ED9, 0x0300,
+ 0x4EDA, 0x1795, 0x4EDC, 0x1791, 0x4EDD, 0x1794, 0x4EDE, 0x0301,
+ 0x4EDF, 0x0311, 0x4EE1, 0x1793, 0x4EE3, 0x02FE, 0x4EE4, 0x02FF,
+ 0x4EE5, 0x02F8, 0x4EE8, 0x1790, 0x4EE9, 0x1792, 0x4EF0, 0x0383,
+ 0x4EF1, 0x17BA, 0x4EF2, 0x0380, 0x4EF3, 0x0384, 0x4EF4, 0x17C4,
+ 0x4EF5, 0x17B8, 0x4EF6, 0x0381, 0x4EF7, 0x17BC, 0x4EFB, 0x0382,
+ 0x4EFD, 0x0385, 0x4EFF, 0x0377, 0x4F00, 0x17BB, 0x4F01, 0x0386,
+ 0x4F02, 0x17BF, 0x4F04, 0x17C3, 0x4F05, 0x17C0, 0x4F08, 0x17BD,
+ 0x4F09, 0x0378, 0x4F0A, 0x037A, 0x4F0B, 0x0387, 0x4F0D, 0x037C,
+ 0x4F0E, 0x17B5, 0x4F0F, 0x037F, 0x4F10, 0x037D, 0x4F11, 0x037E,
+ 0x4F12, 0x17C5, 0x4F13, 0x17C2, 0x4F14, 0x17B9, 0x4F15, 0x037B,
+ 0x4F18, 0x17B6, 0x4F19, 0x0379, 0x4F1D, 0x17BE, 0x4F22, 0x17C1,
+ 0x4F2C, 0x17B7, 0x4F2D, 0x182F, 0x4F2F, 0x042C, 0x4F30, 0x041F,
+ 0x4F33, 0x1830, 0x4F34, 0x041C, 0x4F36, 0x042E, 0x4F38, 0x0424,
+ 0x4F3A, 0x0423, 0x4F3B, 0x1824, 0x4F3C, 0x0427, 0x4F3D, 0x0422,
+ 0x4F3E, 0x1829, 0x4F3F, 0x1831, 0x4F41, 0x182D, 0x4F43, 0x0425,
+ 0x4F46, 0x0428, 0x4F47, 0x0419, 0x4F48, 0x0431, 0x4F49, 0x1826,
+ 0x4F4C, 0x1900, 0x4F4D, 0x0417, 0x4F4E, 0x042D, 0x4F4F, 0x0418,
+ 0x4F50, 0x0420, 0x4F51, 0x0421, 0x4F52, 0x182B, 0x4F53, 0x1827,
+ 0x4F54, 0x0426, 0x4F55, 0x041E, 0x4F56, 0x1823, 0x4F57, 0x041A,
+ 0x4F58, 0x182E, 0x4F59, 0x042F, 0x4F5A, 0x0432, 0x4F5B, 0x041D,
+ 0x4F5C, 0x042A, 0x4F5D, 0x0430, 0x4F5E, 0x041B, 0x4F5F, 0x182C,
+ 0x4F60, 0x042B, 0x4F61, 0x1832, 0x4F62, 0x1825, 0x4F63, 0x0429,
+ 0x4F64, 0x1828, 0x4F67, 0x182A, 0x4F69, 0x053D, 0x4F6A, 0x1902,
+ 0x4F6B, 0x190E, 0x4F6C, 0x0535, 0x4F6E, 0x190F, 0x4F6F, 0x0530,
+ 0x4F70, 0x053A, 0x4F73, 0x0533, 0x4F74, 0x18FC, 0x4F75, 0x053B,
+ 0x4F76, 0x18FB, 0x4F77, 0x18FF, 0x4F78, 0x1906, 0x4F79, 0x1904,
+ 0x4F7A, 0x0543, 0x4F7B, 0x053E, 0x4F7C, 0x18F6, 0x4F7D, 0x18F8,
+ 0x4F7E, 0x0540, 0x4F7F, 0x0534, 0x4F80, 0x18F9, 0x4F81, 0x1905,
+ 0x4F82, 0x190C, 0x4F83, 0x0539, 0x4F84, 0x18FE, 0x4F85, 0x18F7,
+ 0x4F86, 0x0538, 0x4F87, 0x18FA, 0x4F88, 0x053C, 0x4F89, 0x18FD,
+ 0x4F8B, 0x0537, 0x4F8D, 0x0532, 0x4F8F, 0x0541, 0x4F90, 0x1907,
+ 0x4F91, 0x0542, 0x4F92, 0x190B, 0x4F94, 0x1909, 0x4F95, 0x190D,
+ 0x4F96, 0x053F, 0x4F97, 0x1901, 0x4F98, 0x18F5, 0x4F9A, 0x1903,
+ 0x4F9B, 0x0536, 0x4F9C, 0x1908, 0x4F9D, 0x0531, 0x4F9E, 0x190A,
+ 0x4FAE, 0x06B4, 0x4FAF, 0x06A8, 0x4FB2, 0x1A5D, 0x4FB3, 0x1A65,
+ 0x4FB5, 0x06A7, 0x4FB6, 0x06AF, 0x4FB7, 0x06BB, 0x4FB9, 0x1A6B,
+ 0x4FBA, 0x1A69, 0x4FBB, 0x1A64, 0x4FBF, 0x06A9, 0x4FC0, 0x1A6A,
+ 0x4FC1, 0x1A60, 0x4FC2, 0x06B7, 0x4FC3, 0x06AE, 0x4FC4, 0x06B6,
+ 0x4FC5, 0x1A5B, 0x4FC7, 0x1A67, 0x4FC9, 0x1A5E, 0x4FCA, 0x06B2,
+ 0x4FCB, 0x1A5F, 0x4FCD, 0x1A5A, 0x4FCE, 0x06B9, 0x4FCF, 0x06AC,
+ 0x4FD0, 0x06B5, 0x4FD1, 0x06AB, 0x4FD3, 0x1A5C, 0x4FD4, 0x1A61,
+ 0x4FD6, 0x1A68, 0x4FD7, 0x06B3, 0x4FD8, 0x06B0, 0x4FD9, 0x1A63,
+ 0x4FDA, 0x06B8, 0x4FDB, 0x1A66, 0x4FDC, 0x1A62, 0x4FDD, 0x06AD,
+ 0x4FDE, 0x06BA, 0x4FDF, 0x06B1, 0x4FE0, 0x06AA, 0x4FE1, 0x06A6,
+ 0x4FEC, 0x1A6C, 0x4FEE, 0x084C, 0x4FEF, 0x0836, 0x4FF1, 0x0846,
+ 0x4FF3, 0x084B, 0x4FF4, 0x1C24, 0x4FF5, 0x1C23, 0x4FF6, 0x1C28,
+ 0x4FF7, 0x1C29, 0x4FF8, 0x0839, 0x4FFA, 0x0842, 0x4FFE, 0x084F,
+ 0x5000, 0x0843, 0x5005, 0x1C1D, 0x5006, 0x083C, 0x5007, 0x1C1E,
+ 0x5009, 0x0851, 0x500B, 0x0848, 0x500C, 0x0833, 0x500D, 0x0834,
+ 0x500E, 0x1C31, 0x500F, 0x0A0C, 0x5011, 0x0841, 0x5012, 0x0840,
+ 0x5013, 0x1C1F, 0x5014, 0x0844, 0x5015, 0x1E45, 0x5016, 0x083B,
+ 0x5017, 0x1C2A, 0x5018, 0x084A, 0x5019, 0x0849, 0x501A, 0x083F,
+ 0x501B, 0x1C22, 0x501C, 0x1C2B, 0x501E, 0x1C1C, 0x501F, 0x083E,
+ 0x5020, 0x1C2C, 0x5021, 0x0847, 0x5022, 0x1C20, 0x5023, 0x0835,
+ 0x5025, 0x0838, 0x5026, 0x0837, 0x5027, 0x1C2D, 0x5028, 0x0845,
+ 0x5029, 0x083A, 0x502A, 0x084E, 0x502B, 0x0850, 0x502C, 0x1C27,
+ 0x502D, 0x084D, 0x502F, 0x1C2F, 0x5030, 0x1C21, 0x5031, 0x1C30,
+ 0x5033, 0x1C25, 0x5035, 0x1C2E, 0x5037, 0x1C26, 0x503C, 0x083D,
+ 0x5040, 0x1E4D, 0x5041, 0x1E41, 0x5043, 0x0A00, 0x5045, 0x1E46,
+ 0x5046, 0x1E4C, 0x5047, 0x09FF, 0x5048, 0x1E3F, 0x5049, 0x0A03,
+ 0x504A, 0x1E43, 0x504B, 0x1E3C, 0x504C, 0x0A01, 0x504D, 0x1E40,
+ 0x504E, 0x0A06, 0x504F, 0x0A0B, 0x5051, 0x1E51, 0x5053, 0x1E3B,
+ 0x5055, 0x0A07, 0x5057, 0x1E50, 0x505A, 0x0A02, 0x505B, 0x1E42,
+ 0x505C, 0x09FE, 0x505D, 0x1E3D, 0x505E, 0x1E39, 0x505F, 0x1E47,
+ 0x5060, 0x1E3A, 0x5061, 0x1E38, 0x5062, 0x1E44, 0x5063, 0x1E4A,
+ 0x5064, 0x1E4B, 0x5065, 0x0A04, 0x5068, 0x20B8, 0x5069, 0x1E48,
+ 0x506A, 0x1E37, 0x506B, 0x1E49, 0x506D, 0x0A0E, 0x506E, 0x1E4E,
+ 0x506F, 0x0A0D, 0x5070, 0x1E36, 0x5072, 0x1E3E, 0x5073, 0x1E4F,
+ 0x5074, 0x0A09, 0x5075, 0x0A08, 0x5076, 0x0A05, 0x5077, 0x0A0A,
+ 0x507A, 0x09FC, 0x507D, 0x09FD, 0x5080, 0x0BEC, 0x5082, 0x20BB,
+ 0x5083, 0x20B4, 0x5085, 0x0BE9, 0x5087, 0x20BC, 0x508B, 0x20B2,
+ 0x508C, 0x20B5, 0x508D, 0x0BE8, 0x508E, 0x20B6, 0x5091, 0x0BEB,
+ 0x5092, 0x20BA, 0x5094, 0x20B0, 0x5095, 0x20AF, 0x5096, 0x0BED,
+ 0x5098, 0x0BEE, 0x5099, 0x0BEA, 0x509A, 0x0BEF, 0x509B, 0x20AE,
+ 0x509C, 0x20B9, 0x509D, 0x20B7, 0x509E, 0x20B1, 0x50A2, 0x0BE7,
+ 0x50A3, 0x20B3, 0x50AC, 0x0DC5, 0x50AD, 0x0DBF, 0x50AE, 0x2367,
+ 0x50AF, 0x0DC8, 0x50B0, 0x236D, 0x50B1, 0x2370, 0x50B2, 0x0DC1,
+ 0x50B3, 0x0DC2, 0x50B4, 0x236A, 0x50B5, 0x0DC0, 0x50B6, 0x2373,
+ 0x50B7, 0x0DC6, 0x50B8, 0x2374, 0x50BA, 0x236F, 0x50BB, 0x0DC7,
+ 0x50BD, 0x2364, 0x50BE, 0x0DC4, 0x50BF, 0x2365, 0x50C1, 0x236E,
+ 0x50C2, 0x236C, 0x50C4, 0x2368, 0x50C5, 0x0DC3, 0x50C6, 0x2366,
+ 0x50C7, 0x0DC9, 0x50C8, 0x236B, 0x50C9, 0x2372, 0x50CA, 0x2369,
+ 0x50CB, 0x2371, 0x50CE, 0x0F88, 0x50CF, 0x0F85, 0x50D1, 0x0F86,
+ 0x50D3, 0x261C, 0x50D4, 0x2614, 0x50D5, 0x0F84, 0x50D6, 0x0F81,
+ 0x50D7, 0x2615, 0x50DA, 0x0F83, 0x50DB, 0x2618, 0x50DD, 0x261A,
+ 0x50E0, 0x2621, 0x50E3, 0x2620, 0x50E4, 0x261B, 0x50E5, 0x0F80,
+ 0x50E6, 0x2613, 0x50E7, 0x0F7E, 0x50E8, 0x2616, 0x50E9, 0x0F89,
+ 0x50EA, 0x2619, 0x50EC, 0x261D, 0x50ED, 0x0F82, 0x50EE, 0x0F7F,
+ 0x50EF, 0x261F, 0x50F0, 0x261E, 0x50F1, 0x0F87, 0x50F3, 0x2617,
+ 0x50F5, 0x1105, 0x50F6, 0x2883, 0x50F8, 0x2880, 0x50F9, 0x1106,
+ 0x50FB, 0x1104, 0x50FD, 0x2887, 0x50FE, 0x2884, 0x50FF, 0x287D,
+ 0x5100, 0x1103, 0x5102, 0x1107, 0x5103, 0x287E, 0x5104, 0x1102,
+ 0x5105, 0x110A, 0x5106, 0x2881, 0x5107, 0x2882, 0x5108, 0x1108,
+ 0x5109, 0x1109, 0x510A, 0x2888, 0x510B, 0x2885, 0x510C, 0x2886,
+ 0x5110, 0x128D, 0x5111, 0x2B04, 0x5112, 0x128A, 0x5113, 0x2B01,
+ 0x5114, 0x128C, 0x5115, 0x128E, 0x5117, 0x2B02, 0x5118, 0x128B,
+ 0x511A, 0x2B03, 0x511C, 0x2B00, 0x511F, 0x13B5, 0x5120, 0x2D3E,
+ 0x5121, 0x13B6, 0x5122, 0x2D3C, 0x5124, 0x2D3D, 0x5125, 0x2D3B,
+ 0x5126, 0x2D3A, 0x5129, 0x2D3F, 0x512A, 0x13B4, 0x512D, 0x2F0F,
+ 0x512E, 0x2F10, 0x5130, 0x287F, 0x5131, 0x2F0E, 0x5132, 0x13B7,
+ 0x5133, 0x1575, 0x5134, 0x307A, 0x5135, 0x307B, 0x5137, 0x1668,
+ 0x5138, 0x1669, 0x5139, 0x32C6, 0x513A, 0x32C5, 0x513B, 0x16BC,
+ 0x513C, 0x16BB, 0x513D, 0x340E, 0x513F, 0x025C, 0x5140, 0x0274,
+ 0x5141, 0x02AA, 0x5143, 0x02A9, 0x5144, 0x0303, 0x5145, 0x0302,
+ 0x5146, 0x038A, 0x5147, 0x0389, 0x5148, 0x038B, 0x5149, 0x0388,
+ 0x514B, 0x0434, 0x514C, 0x0433, 0x514D, 0x0435, 0x5152, 0x0545,
+ 0x5154, 0x0544, 0x5155, 0x0546, 0x5157, 0x06BC, 0x5159, 0x0119,
+ 0x515A, 0x1C32, 0x515B, 0x011A, 0x515C, 0x0A0F, 0x515D, 0x011C,
+ 0x515E, 0x011B, 0x515F, 0x20BD, 0x5161, 0x011D, 0x5162, 0x0F8A,
+ 0x5163, 0x011E, 0x5165, 0x025D, 0x5167, 0x02AB, 0x5168, 0x038C,
+ 0x5169, 0x0547, 0x516B, 0x025E, 0x516C, 0x02AE, 0x516D, 0x02AC,
+ 0x516E, 0x02AD, 0x5171, 0x038D, 0x5175, 0x0436, 0x5176, 0x0549,
+ 0x5177, 0x0548, 0x5178, 0x054A, 0x517C, 0x0852, 0x5180, 0x128F,
+ 0x5182, 0x021D, 0x5187, 0x1779, 0x5188, 0x36B6, 0x5189, 0x0304,
+ 0x518A, 0x0305, 0x518D, 0x038E, 0x518F, 0x1833, 0x5191, 0x06BE,
+ 0x5192, 0x06BD, 0x5193, 0x1C34, 0x5194, 0x1C33, 0x5195, 0x0A10,
+ 0x5196, 0x021E, 0x5197, 0x02AF, 0x5198, 0x1780, 0x519E, 0x1910,
+ 0x51A0, 0x06BF, 0x51A2, 0x0855, 0x51A4, 0x0853, 0x51A5, 0x0854,
+ 0x51AA, 0x1290, 0x51AB, 0x021F, 0x51AC, 0x0306, 0x51B0, 0x038F,
+ 0x51B1, 0x17C6, 0x51B6, 0x0437, 0x51B7, 0x0438, 0x51B9, 0x1834,
+ 0x51BC, 0x1911, 0x51BD, 0x054B, 0x51BE, 0x1912, 0x51C4, 0x1C36,
+ 0x51C5, 0x1C37, 0x51C6, 0x0858, 0x51C8, 0x1C38, 0x51CA, 0x1C35,
+ 0x51CB, 0x0859, 0x51CC, 0x0857, 0x51CD, 0x0856, 0x51CE, 0x1C39,
+ 0x51D0, 0x1E52, 0x51D4, 0x20BE, 0x51D7, 0x2375, 0x51D8, 0x2622,
+ 0x51DC, 0x110B, 0x51DD, 0x1291, 0x51DE, 0x2B05, 0x51E0, 0x025F,
+ 0x51E1, 0x026D, 0x51F0, 0x0A11, 0x51F1, 0x0BF1, 0x51F3, 0x0F8B,
+ 0x51F5, 0x176E, 0x51F6, 0x02B0, 0x51F8, 0x0309, 0x51F9, 0x0307,
+ 0x51FA, 0x0308, 0x51FD, 0x054C, 0x5200, 0x0260, 0x5201, 0x0261,
+ 0x5202, 0x36B3, 0x5203, 0x0275, 0x5206, 0x02B1, 0x5207, 0x02B2,
+ 0x5208, 0x02B3, 0x5209, 0x1797, 0x520A, 0x030A, 0x520C, 0x1796,
+ 0x520E, 0x0393, 0x5210, 0x17C8, 0x5211, 0x0391, 0x5212, 0x0392,
+ 0x5213, 0x17C7, 0x5216, 0x0394, 0x5217, 0x0390, 0x521C, 0x1835,
+ 0x521D, 0x068B, 0x521E, 0x1836, 0x5221, 0x1837, 0x5224, 0x043A,
+ 0x5225, 0x0439, 0x5228, 0x043D, 0x5229, 0x043B, 0x522A, 0x043C,
+ 0x522E, 0x0552, 0x5230, 0x0551, 0x5231, 0x1917, 0x5232, 0x1914,
+ 0x5233, 0x1915, 0x5235, 0x1913, 0x5236, 0x0553, 0x5237, 0x054F,
+ 0x5238, 0x054E, 0x523A, 0x0550, 0x523B, 0x054D, 0x5241, 0x0554,
+ 0x5243, 0x06C1, 0x5244, 0x1A6D, 0x5246, 0x1916, 0x5247, 0x06C6,
+ 0x5249, 0x1A6E, 0x524A, 0x06C2, 0x524B, 0x06C5, 0x524C, 0x06C4,
+ 0x524D, 0x06C3, 0x524E, 0x06C0, 0x5252, 0x1C3C, 0x5254, 0x085C,
+ 0x5255, 0x1C3F, 0x5256, 0x085A, 0x525A, 0x1C3B, 0x525B, 0x085D,
+ 0x525C, 0x085B, 0x525D, 0x085E, 0x525E, 0x1C3D, 0x525F, 0x1C3E,
+ 0x5261, 0x1C3A, 0x5262, 0x1C40, 0x5269, 0x0BF5, 0x526A, 0x0A12,
+ 0x526B, 0x1E53, 0x526C, 0x1E55, 0x526D, 0x1E54, 0x526E, 0x1E56,
+ 0x526F, 0x0A13, 0x5272, 0x0BF2, 0x5274, 0x0BF3, 0x5275, 0x0BF4,
+ 0x5277, 0x0DCB, 0x5278, 0x2377, 0x527A, 0x2376, 0x527B, 0x2378,
+ 0x527C, 0x2379, 0x527D, 0x0DCC, 0x527F, 0x0DCA, 0x5280, 0x2623,
+ 0x5281, 0x2624, 0x5282, 0x0F8D, 0x5283, 0x0F8C, 0x5284, 0x2776,
+ 0x5287, 0x110C, 0x5288, 0x110D, 0x5289, 0x110E, 0x528A, 0x1110,
+ 0x528B, 0x2889, 0x528C, 0x288A, 0x528D, 0x110F, 0x5291, 0x1292,
+ 0x5293, 0x1293, 0x5296, 0x307C, 0x5297, 0x32C8, 0x5298, 0x32C7,
+ 0x5299, 0x340F, 0x529B, 0x0262, 0x529F, 0x030C, 0x52A0, 0x030B,
+ 0x52A3, 0x0395, 0x52A6, 0x17C9, 0x52A9, 0x043F, 0x52AA, 0x0440,
+ 0x52AB, 0x043E, 0x52AC, 0x0441, 0x52AD, 0x1838, 0x52AE, 0x1839,
+ 0x52BB, 0x0556, 0x52BC, 0x1918, 0x52BE, 0x0555, 0x52C0, 0x1A6F,
+ 0x52C1, 0x06CA, 0x52C2, 0x1A70, 0x52C3, 0x06C9, 0x52C7, 0x06C7,
+ 0x52C9, 0x06C8, 0x52CD, 0x1C41, 0x52D2, 0x0A14, 0x52D3, 0x1E58,
+ 0x52D5, 0x0A17, 0x52D6, 0x1E57, 0x52D7, 0x0ACF, 0x52D8, 0x0A16,
+ 0x52D9, 0x0A15, 0x52DB, 0x0BF8, 0x52DD, 0x0BF7, 0x52DE, 0x0BF6,
+ 0x52DF, 0x0DCD, 0x52E2, 0x0DD0, 0x52E3, 0x0DD1, 0x52E4, 0x0DCF,
+ 0x52E6, 0x0DCE, 0x52E9, 0x2625, 0x52EB, 0x2626, 0x52EF, 0x288C,
+ 0x52F0, 0x1111, 0x52F1, 0x288B, 0x52F3, 0x1294, 0x52F4, 0x2D40,
+ 0x52F5, 0x13B8, 0x52F7, 0x307D, 0x52F8, 0x1609, 0x52F9, 0x0220,
+ 0x52FA, 0x0276, 0x52FB, 0x02B4, 0x52FC, 0x1781, 0x52FE, 0x02B5,
+ 0x52FF, 0x02B6, 0x5305, 0x030D, 0x5306, 0x030E, 0x5308, 0x0396,
+ 0x5309, 0x183A, 0x530A, 0x1919, 0x530B, 0x191A, 0x530D, 0x06CB,
+ 0x530E, 0x1C42, 0x530F, 0x0A19, 0x5310, 0x0A18, 0x5311, 0x20C0,
+ 0x5312, 0x20BF, 0x5315, 0x0263, 0x5316, 0x02B7, 0x5317, 0x030F,
+ 0x5319, 0x0A1A, 0x531A, 0x176F, 0x531C, 0x1798, 0x531D, 0x0310,
+ 0x531F, 0x17CB, 0x5320, 0x0398, 0x5321, 0x0397, 0x5322, 0x17CA,
+ 0x5323, 0x0442, 0x532A, 0x085F, 0x532D, 0x1E59, 0x532F, 0x0DD2,
+ 0x5330, 0x2627, 0x5331, 0x0F8E, 0x5334, 0x2B06, 0x5337, 0x31C7,
+ 0x5338, 0x0221, 0x5339, 0x02B8, 0x533C, 0x191B, 0x533D, 0x1A71,
+ 0x533E, 0x0A1D, 0x533F, 0x0A1B, 0x5340, 0x0A1C, 0x5341, 0x0264,
+ 0x5343, 0x0277, 0x5344, 0x016B, 0x5345, 0x02BB, 0x5347, 0x02BA,
+ 0x5348, 0x02B9, 0x5349, 0x0313, 0x534A, 0x0312, 0x534C, 0x1799,
+ 0x534D, 0x17CC, 0x5351, 0x055A, 0x5352, 0x0557, 0x5353, 0x0559,
+ 0x5354, 0x0558, 0x5357, 0x06CC, 0x535A, 0x0BF9, 0x535C, 0x0265,
+ 0x535E, 0x02BC, 0x5360, 0x0315, 0x5361, 0x0314, 0x5363, 0x183B,
+ 0x5366, 0x055B, 0x5369, 0x0222, 0x536C, 0x1782, 0x536E, 0x0317,
+ 0x536F, 0x0316, 0x5370, 0x0399, 0x5371, 0x039A, 0x5372, 0x183C,
+ 0x5373, 0x0443, 0x5375, 0x0444, 0x5377, 0x055C, 0x5378, 0x055D,
+ 0x5379, 0x055E, 0x537B, 0x06CD, 0x537C, 0x1A72, 0x537F, 0x0860,
+ 0x5382, 0x1770, 0x5384, 0x02BD, 0x538A, 0x17CD, 0x538E, 0x183D,
+ 0x538F, 0x183E, 0x5392, 0x191C, 0x5394, 0x191D, 0x5396, 0x1A74,
+ 0x5397, 0x1A73, 0x5398, 0x1A76, 0x5399, 0x1A75, 0x539A, 0x06CE,
+ 0x539C, 0x1E5A, 0x539D, 0x0862, 0x539E, 0x1C43, 0x539F, 0x0861,
+ 0x53A4, 0x20C1, 0x53A5, 0x0BFA, 0x53A7, 0x20C2, 0x53AC, 0x2628,
+ 0x53AD, 0x0F8F, 0x53B2, 0x1112, 0x53B4, 0x307E, 0x53B6, 0x0223,
+ 0x53B9, 0x1783, 0x53BB, 0x0318, 0x53C3, 0x0A1E, 0x53C8, 0x0266,
+ 0x53C9, 0x0278, 0x53CA, 0x02BF, 0x53CB, 0x02BE, 0x53CD, 0x02C0,
+ 0x53D4, 0x0560, 0x53D6, 0x055F, 0x53D7, 0x0561, 0x53DB, 0x06CF,
+ 0x53DF, 0x0863, 0x53E1, 0x2B07, 0x53E2, 0x14C9, 0x53E3, 0x0279,
+ 0x53E4, 0x031A, 0x53E5, 0x0329, 0x53E6, 0x0324, 0x53E8, 0x031F,
+ 0x53E9, 0x031E, 0x53EA, 0x0325, 0x53EB, 0x0323, 0x53EC, 0x031C,
+ 0x53ED, 0x032A, 0x53EE, 0x031D, 0x53EF, 0x0319, 0x53F0, 0x0328,
+ 0x53F1, 0x0327, 0x53F2, 0x0326, 0x53F3, 0x031B, 0x53F5, 0x0322,
+ 0x53F8, 0x0321, 0x53FB, 0x032B, 0x53FC, 0x0320, 0x5401, 0x03A0,
+ 0x5403, 0x03A6, 0x5404, 0x03A2, 0x5406, 0x03A8, 0x5407, 0x17CE,
+ 0x5408, 0x03A5, 0x5409, 0x039B, 0x540A, 0x039E, 0x540B, 0x03A1,
+ 0x540C, 0x039D, 0x540D, 0x03A4, 0x540E, 0x03A7, 0x540F, 0x039C,
+ 0x5410, 0x039F, 0x5411, 0x03A3, 0x5412, 0x03A9, 0x5418, 0x1847,
+ 0x5419, 0x1844, 0x541B, 0x0451, 0x541C, 0x1845, 0x541D, 0x0445,
+ 0x541E, 0x0447, 0x541F, 0x045F, 0x5420, 0x045A, 0x5424, 0x184C,
+ 0x5425, 0x1846, 0x5426, 0x0449, 0x5427, 0x044B, 0x5428, 0x184B,
+ 0x5429, 0x0452, 0x542A, 0x1841, 0x542B, 0x045E, 0x542C, 0x0460,
+ 0x542D, 0x0446, 0x542E, 0x0457, 0x5430, 0x183F, 0x5431, 0x045D,
+ 0x5433, 0x044E, 0x5435, 0x0458, 0x5436, 0x0459, 0x5437, 0x1840,
+ 0x5438, 0x0456, 0x5439, 0x0454, 0x543B, 0x0455, 0x543C, 0x045B,
+ 0x543D, 0x1848, 0x543E, 0x0448, 0x5440, 0x045C, 0x5441, 0x184A,
+ 0x5442, 0x0450, 0x5443, 0x044D, 0x5445, 0x1843, 0x5446, 0x044C,
+ 0x5447, 0x184D, 0x5448, 0x044F, 0x544A, 0x0453, 0x544E, 0x044A,
+ 0x544F, 0x1849, 0x5454, 0x1842, 0x5460, 0x192E, 0x5461, 0x192D,
+ 0x5462, 0x0573, 0x5463, 0x1930, 0x5464, 0x1932, 0x5465, 0x1927,
+ 0x5466, 0x192A, 0x5467, 0x1931, 0x5468, 0x0574, 0x546B, 0x1924,
+ 0x546C, 0x1928, 0x546F, 0x192C, 0x5470, 0x1A85, 0x5471, 0x056F,
+ 0x5472, 0x1A89, 0x5473, 0x0562, 0x5474, 0x1929, 0x5475, 0x0563,
+ 0x5476, 0x0570, 0x5477, 0x0569, 0x5478, 0x0565, 0x547A, 0x1925,
+ 0x547B, 0x0568, 0x547C, 0x056D, 0x547D, 0x0576, 0x547E, 0x1926,
+ 0x547F, 0x191F, 0x5480, 0x0567, 0x5481, 0x1920, 0x5482, 0x1922,
+ 0x5484, 0x056A, 0x5486, 0x056C, 0x5487, 0x191E, 0x5488, 0x1923,
+ 0x548B, 0x0575, 0x548C, 0x0571, 0x548D, 0x192B, 0x548E, 0x0577,
+ 0x5490, 0x056E, 0x5491, 0x1921, 0x5492, 0x056B, 0x5495, 0x0566,
+ 0x5496, 0x0564, 0x5498, 0x192F, 0x549A, 0x0572, 0x54A0, 0x1A84,
+ 0x54A1, 0x1A78, 0x54A2, 0x1A87, 0x54A5, 0x1A7A, 0x54A6, 0x06D6,
+ 0x54A7, 0x06E4, 0x54A8, 0x06D2, 0x54A9, 0x06E3, 0x54AA, 0x06DB,
+ 0x54AB, 0x06E0, 0x54AC, 0x06D0, 0x54AD, 0x1A79, 0x54AE, 0x1A7F,
+ 0x54AF, 0x06DF, 0x54B0, 0x1A8B, 0x54B1, 0x06E1, 0x54B3, 0x06D7,
+ 0x54B6, 0x1A81, 0x54B7, 0x1A7E, 0x54B8, 0x06D5, 0x54BA, 0x1A77,
+ 0x54BB, 0x06E2, 0x54BC, 0x1A86, 0x54BD, 0x06DA, 0x54BE, 0x1A88,
+ 0x54BF, 0x06E5, 0x54C0, 0x06D1, 0x54C1, 0x06DC, 0x54C2, 0x06D9,
+ 0x54C3, 0x1A7C, 0x54C4, 0x06DD, 0x54C5, 0x1A82, 0x54C6, 0x1A83,
+ 0x54C7, 0x06D8, 0x54C8, 0x06DE, 0x54C9, 0x06D4, 0x54CE, 0x06D3,
+ 0x54CF, 0x1A7B, 0x54D6, 0x1A80, 0x54DE, 0x1A8A, 0x54E0, 0x1C57,
+ 0x54E1, 0x0870, 0x54E2, 0x1C45, 0x54E4, 0x1C4A, 0x54E5, 0x0869,
+ 0x54E6, 0x0874, 0x54E7, 0x1C48, 0x54E8, 0x0864, 0x54E9, 0x086E,
+ 0x54EA, 0x0873, 0x54EB, 0x1C4F, 0x54ED, 0x086F, 0x54EE, 0x0872,
+ 0x54F1, 0x1C52, 0x54F2, 0x086A, 0x54F3, 0x1C49, 0x54F7, 0x1C55,
+ 0x54F8, 0x1C56, 0x54FA, 0x086C, 0x54FB, 0x1C54, 0x54FC, 0x0868,
+ 0x54FD, 0x0877, 0x54FF, 0x1C4C, 0x5501, 0x0866, 0x5503, 0x1C59,
+ 0x5504, 0x1C4D, 0x5505, 0x1C51, 0x5506, 0x086B, 0x5507, 0x0876,
+ 0x5508, 0x1C4E, 0x5509, 0x0871, 0x550A, 0x1C53, 0x550B, 0x1C5A,
+ 0x550C, 0x1E69, 0x550E, 0x1C58, 0x550F, 0x0878, 0x5510, 0x0865,
+ 0x5511, 0x1C50, 0x5512, 0x1C47, 0x5514, 0x086D, 0x5517, 0x1C46,
+ 0x551A, 0x1C4B, 0x5526, 0x1C44, 0x5527, 0x0875, 0x552A, 0x1E61,
+ 0x552C, 0x0A31, 0x552D, 0x1E6F, 0x552E, 0x0A2F, 0x552F, 0x0A2C,
+ 0x5530, 0x1E66, 0x5531, 0x0A28, 0x5532, 0x1E6A, 0x5533, 0x0A33,
+ 0x5534, 0x1E60, 0x5535, 0x1E65, 0x5536, 0x1E64, 0x5537, 0x0867,
+ 0x5538, 0x0A2E, 0x5539, 0x1E6D, 0x553B, 0x1E70, 0x553C, 0x1E5D,
+ 0x553E, 0x0C0C, 0x5540, 0x1E71, 0x5541, 0x0A34, 0x5543, 0x0A26,
+ 0x5544, 0x0A23, 0x5545, 0x1E68, 0x5546, 0x0A20, 0x5548, 0x1E6E,
+ 0x554A, 0x0A27, 0x554B, 0x1E72, 0x554D, 0x1E5E, 0x554E, 0x1E6C,
+ 0x554F, 0x0A2A, 0x5550, 0x1E5F, 0x5551, 0x1E62, 0x5552, 0x1E67,
+ 0x5555, 0x0A2B, 0x5556, 0x0A29, 0x5557, 0x0A35, 0x555C, 0x0A30,
+ 0x555E, 0x0A24, 0x555F, 0x0ABC, 0x5561, 0x0A25, 0x5562, 0x1E63,
+ 0x5563, 0x0A32, 0x5564, 0x0A2D, 0x5565, 0x1E6B, 0x5566, 0x0A22,
+ 0x556A, 0x0A21, 0x5575, 0x1E5B, 0x5576, 0x1E5C, 0x5577, 0x20C7,
+ 0x557B, 0x0BFB, 0x557C, 0x0BFE, 0x557D, 0x20D2, 0x557E, 0x0C12,
+ 0x557F, 0x20D5, 0x5580, 0x0BFC, 0x5581, 0x20CE, 0x5582, 0x0C02,
+ 0x5583, 0x0C08, 0x5584, 0x0D1B, 0x5587, 0x0C06, 0x5588, 0x20CB,
+ 0x5589, 0x0C13, 0x558A, 0x0BFF, 0x558B, 0x0C07, 0x558C, 0x20D3,
+ 0x558D, 0x2387, 0x558E, 0x20D8, 0x558F, 0x20CC, 0x5591, 0x20C3,
+ 0x5592, 0x20D0, 0x5593, 0x20CA, 0x5594, 0x0C05, 0x5595, 0x20D6,
+ 0x5598, 0x0C01, 0x5599, 0x0C15, 0x559A, 0x0C0E, 0x559C, 0x0C03,
+ 0x559D, 0x0C00, 0x559F, 0x0C0B, 0x55A1, 0x20D7, 0x55A2, 0x20C9,
+ 0x55A3, 0x20CF, 0x55A4, 0x20D1, 0x55A5, 0x20C5, 0x55A6, 0x20D4,
+ 0x55A7, 0x0BFD, 0x55A8, 0x20C4, 0x55AA, 0x0C04, 0x55AB, 0x0C14,
+ 0x55AC, 0x0C10, 0x55AD, 0x20C6, 0x55AE, 0x0C0A, 0x55B1, 0x0C11,
+ 0x55B2, 0x0C0D, 0x55B3, 0x0C09, 0x55B5, 0x20CD, 0x55BB, 0x0C0F,
+ 0x55BF, 0x2385, 0x55C0, 0x2381, 0x55C2, 0x2390, 0x55C3, 0x237A,
+ 0x55C4, 0x2383, 0x55C5, 0x0DE0, 0x55C6, 0x0DE1, 0x55C7, 0x0DD9,
+ 0x55C8, 0x238C, 0x55C9, 0x0DE3, 0x55CA, 0x237F, 0x55CB, 0x237E,
+ 0x55CC, 0x237C, 0x55CD, 0x238E, 0x55CE, 0x0DD7, 0x55CF, 0x2388,
+ 0x55D0, 0x237D, 0x55D1, 0x0DDA, 0x55D2, 0x2386, 0x55D3, 0x0DD5,
+ 0x55D4, 0x2382, 0x55D5, 0x2389, 0x55D6, 0x238B, 0x55D9, 0x238F,
+ 0x55DA, 0x0DDE, 0x55DB, 0x237B, 0x55DC, 0x0DD8, 0x55DD, 0x2380,
+ 0x55DF, 0x0DD3, 0x55E1, 0x0DDF, 0x55E2, 0x238A, 0x55E3, 0x0DDB,
+ 0x55E4, 0x0DDC, 0x55E5, 0x0DE2, 0x55E6, 0x0DD6, 0x55E7, 0x011F,
+ 0x55E8, 0x0DD4, 0x55E9, 0x2384, 0x55EF, 0x0DDD, 0x55F2, 0x238D,
+ 0x55F6, 0x0F9F, 0x55F7, 0x0F9A, 0x55F9, 0x2637, 0x55FA, 0x2633,
+ 0x55FC, 0x262D, 0x55FD, 0x0F94, 0x55FE, 0x0F90, 0x55FF, 0x2636,
+ 0x5600, 0x0F91, 0x5601, 0x2630, 0x5602, 0x2632, 0x5604, 0x2635,
+ 0x5606, 0x0F96, 0x5608, 0x0F9D, 0x5609, 0x0F97, 0x560C, 0x262B,
+ 0x560D, 0x0F98, 0x560E, 0x0F99, 0x560F, 0x262E, 0x5610, 0x0F9E,
+ 0x5612, 0x262C, 0x5613, 0x2631, 0x5614, 0x0F95, 0x5615, 0x262A,
+ 0x5616, 0x0F9B, 0x5617, 0x0F93, 0x561B, 0x0F92, 0x561C, 0x262F,
+ 0x561D, 0x2634, 0x561F, 0x0F9C, 0x5627, 0x2629, 0x5629, 0x1119,
+ 0x562A, 0x289D, 0x562C, 0x289A, 0x562E, 0x1113, 0x562F, 0x111F,
+ 0x5630, 0x1120, 0x5632, 0x1116, 0x5633, 0x2898, 0x5634, 0x1118,
+ 0x5635, 0x2890, 0x5636, 0x111E, 0x5638, 0x289C, 0x5639, 0x1115,
+ 0x563A, 0x289E, 0x563B, 0x1114, 0x563D, 0x2899, 0x563E, 0x289B,
+ 0x563F, 0x1117, 0x5640, 0x2897, 0x5641, 0x2891, 0x5642, 0x288E,
+ 0x5645, 0x20C8, 0x5646, 0x2894, 0x5648, 0x288D, 0x5649, 0x2893,
+ 0x564A, 0x2892, 0x564C, 0x288F, 0x564E, 0x111B, 0x5653, 0x111A,
+ 0x5657, 0x111C, 0x5658, 0x2895, 0x5659, 0x1295, 0x565A, 0x2896,
+ 0x565E, 0x2B10, 0x5660, 0x2B09, 0x5662, 0x12A1, 0x5663, 0x2B0D,
+ 0x5664, 0x1299, 0x5665, 0x129D, 0x5666, 0x2B0C, 0x5668, 0x129C,
+ 0x5669, 0x1298, 0x566A, 0x129B, 0x566B, 0x1296, 0x566C, 0x12A0,
+ 0x566D, 0x2B0E, 0x566E, 0x2B0A, 0x566F, 0x129F, 0x5670, 0x2B08,
+ 0x5671, 0x129E, 0x5672, 0x2B0F, 0x5673, 0x2B0B, 0x5674, 0x111D,
+ 0x5676, 0x12A2, 0x5677, 0x2B11, 0x5678, 0x129A, 0x5679, 0x1297,
+ 0x567E, 0x2D47, 0x567F, 0x2D49, 0x5680, 0x13BA, 0x5681, 0x2D4A,
+ 0x5682, 0x2D48, 0x5683, 0x2D46, 0x5684, 0x2D45, 0x5685, 0x13BC,
+ 0x5686, 0x2D44, 0x5687, 0x13BD, 0x568C, 0x2D42, 0x568D, 0x2D43,
+ 0x568E, 0x13B9, 0x568F, 0x13BE, 0x5690, 0x13BB, 0x5693, 0x2D41,
+ 0x5695, 0x14CA, 0x5697, 0x2F13, 0x5698, 0x2F11, 0x5699, 0x2F16,
+ 0x569A, 0x2F14, 0x569C, 0x2F12, 0x569D, 0x2F15, 0x56A5, 0x1576,
+ 0x56A6, 0x3081, 0x56A7, 0x3082, 0x56A8, 0x1577, 0x56AA, 0x3083,
+ 0x56AB, 0x307F, 0x56AC, 0x3084, 0x56AD, 0x3080, 0x56AE, 0x14CB,
+ 0x56B2, 0x31C8, 0x56B3, 0x31CA, 0x56B4, 0x160C, 0x56B5, 0x31C9,
+ 0x56B6, 0x160B, 0x56B7, 0x160A, 0x56BC, 0x160D, 0x56BD, 0x32CA,
+ 0x56BE, 0x32CB, 0x56C0, 0x166B, 0x56C1, 0x166A, 0x56C2, 0x166C,
+ 0x56C3, 0x32C9, 0x56C5, 0x3379, 0x56C6, 0x3378, 0x56C8, 0x16BD,
+ 0x56C9, 0x16BF, 0x56CA, 0x16BE, 0x56CB, 0x337A, 0x56CC, 0x16F6,
+ 0x56CD, 0x3481, 0x56D1, 0x171F, 0x56D3, 0x3480, 0x56D4, 0x34C9,
+ 0x56D7, 0x1775, 0x56DA, 0x032D, 0x56DB, 0x032C, 0x56DD, 0x03AC,
+ 0x56DE, 0x03AB, 0x56DF, 0x17D0, 0x56E0, 0x03AA, 0x56E1, 0x17CF,
+ 0x56E4, 0x0463, 0x56E5, 0x1850, 0x56E7, 0x184F, 0x56EA, 0x0461,
+ 0x56EB, 0x0464, 0x56EE, 0x184E, 0x56F0, 0x0462, 0x56F7, 0x1933,
+ 0x56F9, 0x1934, 0x56FA, 0x0578, 0x56FF, 0x06E6, 0x5701, 0x1C5B,
+ 0x5702, 0x1C5C, 0x5703, 0x0879, 0x5704, 0x087A, 0x5707, 0x1E74,
+ 0x5708, 0x0A36, 0x5709, 0x0A38, 0x570A, 0x1E73, 0x570B, 0x0A37,
+ 0x570C, 0x20D9, 0x570D, 0x0C16, 0x5712, 0x0DE4, 0x5713, 0x0DE5,
+ 0x5714, 0x2391, 0x5716, 0x0FA1, 0x5718, 0x0FA0, 0x571A, 0x289F,
+ 0x571B, 0x2B13, 0x571C, 0x2B12, 0x571E, 0x3505, 0x571F, 0x027A,
+ 0x5720, 0x1784, 0x5722, 0x179A, 0x5723, 0x179B, 0x5728, 0x03AF,
+ 0x5729, 0x03B3, 0x572A, 0x17D2, 0x572C, 0x03B1, 0x572D, 0x03B0,
+ 0x572E, 0x17D1, 0x572F, 0x03B2, 0x5730, 0x03AE, 0x5733, 0x03AD,
+ 0x5734, 0x17D3, 0x573B, 0x046E, 0x573E, 0x046B, 0x5740, 0x0467,
+ 0x5741, 0x1851, 0x5745, 0x1852, 0x5747, 0x0469, 0x5749, 0x1854,
+ 0x574A, 0x0465, 0x574B, 0x1855, 0x574C, 0x1853, 0x574D, 0x0468,
+ 0x574E, 0x046A, 0x574F, 0x046D, 0x5750, 0x046C, 0x5751, 0x0466,
+ 0x5752, 0x1856, 0x5761, 0x057D, 0x5762, 0x1941, 0x5764, 0x057F,
+ 0x5766, 0x057E, 0x5768, 0x1942, 0x5769, 0x057C, 0x576A, 0x057B,
+ 0x576B, 0x1938, 0x576D, 0x1937, 0x576F, 0x1935, 0x5770, 0x193A,
+ 0x5771, 0x1939, 0x5772, 0x1936, 0x5773, 0x193F, 0x5774, 0x1940,
+ 0x5775, 0x193D, 0x5776, 0x193B, 0x5777, 0x057A, 0x577B, 0x193E,
+ 0x577C, 0x0580, 0x577D, 0x1943, 0x5780, 0x193C, 0x5782, 0x06E7,
+ 0x5783, 0x0579, 0x578B, 0x06E8, 0x578C, 0x1A90, 0x578F, 0x1A96,
+ 0x5793, 0x06EE, 0x5794, 0x1A94, 0x5795, 0x1A9A, 0x5797, 0x1A91,
+ 0x5798, 0x1A95, 0x5799, 0x1A97, 0x579A, 0x1A99, 0x579B, 0x1A93,
+ 0x579D, 0x1A92, 0x579E, 0x1A8D, 0x579F, 0x1A8E, 0x57A0, 0x06E9,
+ 0x57A2, 0x06EB, 0x57A3, 0x06EA, 0x57A4, 0x1A8F, 0x57A5, 0x1A98,
+ 0x57AE, 0x06ED, 0x57B5, 0x1A8C, 0x57B6, 0x1C66, 0x57B8, 0x1C65,
+ 0x57B9, 0x1C6A, 0x57BA, 0x1C61, 0x57BC, 0x1C64, 0x57BD, 0x1C63,
+ 0x57BF, 0x1C67, 0x57C1, 0x1C6B, 0x57C2, 0x087B, 0x57C3, 0x087E,
+ 0x57C6, 0x1C62, 0x57C7, 0x1C68, 0x57CB, 0x087D, 0x57CC, 0x1C5D,
+ 0x57CE, 0x06EC, 0x57CF, 0x1E82, 0x57D0, 0x1C69, 0x57D2, 0x1C60,
+ 0x57D4, 0x087C, 0x57D5, 0x1C5F, 0x57DC, 0x1E79, 0x57DF, 0x0A39,
+ 0x57E0, 0x0A3D, 0x57E1, 0x1E89, 0x57E2, 0x1E77, 0x57E3, 0x1E85,
+ 0x57E4, 0x0A3E, 0x57E5, 0x1E87, 0x57E7, 0x1E8D, 0x57E9, 0x1E91,
+ 0x57EC, 0x1E88, 0x57ED, 0x1E7C, 0x57EE, 0x1E84, 0x57F0, 0x1E92,
+ 0x57F1, 0x1E90, 0x57F2, 0x1E86, 0x57F3, 0x1E81, 0x57F4, 0x1E7A,
+ 0x57F5, 0x20E1, 0x57F6, 0x1E78, 0x57F7, 0x0A42, 0x57F8, 0x1E7F,
+ 0x57F9, 0x0A43, 0x57FA, 0x0A3F, 0x57FB, 0x1E75, 0x57FC, 0x1E8B,
+ 0x57FD, 0x1E7D, 0x5800, 0x1E7B, 0x5801, 0x1E8E, 0x5802, 0x0A40,
+ 0x5804, 0x1E94, 0x5805, 0x0A3A, 0x5806, 0x0A3C, 0x5807, 0x1E83,
+ 0x5808, 0x1E7E, 0x5809, 0x087F, 0x580A, 0x0A3B, 0x580B, 0x1E80,
+ 0x580C, 0x1E8F, 0x580D, 0x1E93, 0x580E, 0x1E8A, 0x5810, 0x1E8C,
+ 0x5814, 0x1E76, 0x5819, 0x20DC, 0x581B, 0x20E5, 0x581C, 0x20E4,
+ 0x581D, 0x0C1E, 0x581E, 0x20DD, 0x5820, 0x0C1F, 0x5821, 0x0C1D,
+ 0x5823, 0x20DF, 0x5824, 0x0C1A, 0x5825, 0x20E3, 0x5827, 0x20DE,
+ 0x5828, 0x20E0, 0x5829, 0x20DA, 0x582A, 0x0C18, 0x582C, 0x20ED,
+ 0x582D, 0x20EC, 0x582E, 0x20E9, 0x582F, 0x0C17, 0x5830, 0x0C1B,
+ 0x5831, 0x0C1C, 0x5832, 0x1C5E, 0x5833, 0x20E6, 0x5834, 0x0C19,
+ 0x5835, 0x0A41, 0x5836, 0x20E8, 0x5837, 0x20DB, 0x5838, 0x20EB,
+ 0x5839, 0x20EA, 0x583B, 0x20EE, 0x583D, 0x239F, 0x583F, 0x20E7,
+ 0x5848, 0x20E2, 0x5849, 0x2397, 0x584A, 0x0DEF, 0x584B, 0x0DF2,
+ 0x584C, 0x0DED, 0x584D, 0x2396, 0x584E, 0x239A, 0x584F, 0x2395,
+ 0x5851, 0x0DE7, 0x5852, 0x0DF1, 0x5853, 0x2392, 0x5854, 0x0DEB,
+ 0x5855, 0x2399, 0x5857, 0x0DE9, 0x5858, 0x0DE8, 0x5859, 0x239C,
+ 0x585A, 0x0DEA, 0x585B, 0x239E, 0x585D, 0x239B, 0x585E, 0x0DE6,
+ 0x5862, 0x0DF0, 0x5863, 0x23A0, 0x5864, 0x2394, 0x5865, 0x239D,
+ 0x5868, 0x2393, 0x586B, 0x0DEC, 0x586D, 0x0DEE, 0x586F, 0x2398,
+ 0x5871, 0x23A1, 0x5874, 0x263F, 0x5875, 0x0FA2, 0x5876, 0x2645,
+ 0x5879, 0x0FA7, 0x587A, 0x2641, 0x587B, 0x2648, 0x587C, 0x2639,
+ 0x587D, 0x0FA9, 0x587E, 0x0FA3, 0x587F, 0x263E, 0x5880, 0x1121,
+ 0x5881, 0x263D, 0x5882, 0x2646, 0x5883, 0x0FA4, 0x5885, 0x0FA8,
+ 0x5886, 0x263C, 0x5887, 0x2642, 0x5888, 0x2647, 0x5889, 0x2638,
+ 0x588A, 0x0FA6, 0x588B, 0x2640, 0x588E, 0x2644, 0x588F, 0x264A,
+ 0x5890, 0x263A, 0x5891, 0x2643, 0x5893, 0x0FA5, 0x5894, 0x2649,
+ 0x5898, 0x263B, 0x589C, 0x1125, 0x589D, 0x28A1, 0x589E, 0x1123,
+ 0x589F, 0x1122, 0x58A0, 0x28A3, 0x58A1, 0x28A8, 0x58A3, 0x28A4,
+ 0x58A5, 0x28A7, 0x58A6, 0x1128, 0x58A8, 0x1288, 0x58A9, 0x1127,
+ 0x58AB, 0x28A0, 0x58AC, 0x28A6, 0x58AE, 0x1126, 0x58AF, 0x28A5,
+ 0x58B1, 0x28A2, 0x58B3, 0x1124, 0x58BA, 0x2B18, 0x58BB, 0x36EB,
+ 0x58BC, 0x2B1A, 0x58BD, 0x2B15, 0x58BE, 0x12A4, 0x58BF, 0x2B17,
+ 0x58C1, 0x12A3, 0x58C2, 0x2B19, 0x58C5, 0x12A6, 0x58C6, 0x2B1B,
+ 0x58C7, 0x12A5, 0x58C8, 0x2B14, 0x58C9, 0x2B16, 0x58CE, 0x13C2,
+ 0x58CF, 0x2D4D, 0x58D1, 0x13C1, 0x58D2, 0x2D4E, 0x58D3, 0x13C0,
+ 0x58D4, 0x2D4C, 0x58D5, 0x13BF, 0x58D6, 0x2D4B, 0x58D8, 0x14CD,
+ 0x58D9, 0x14CC, 0x58DA, 0x3085, 0x58DB, 0x3087, 0x58DD, 0x3086,
+ 0x58DE, 0x1578, 0x58DF, 0x1579, 0x58E2, 0x157A, 0x58E3, 0x31CB,
+ 0x58E4, 0x160E, 0x58E7, 0x3411, 0x58E8, 0x3410, 0x58E9, 0x1720,
+ 0x58EB, 0x027B, 0x58EC, 0x02C1, 0x58EF, 0x046F, 0x58F4, 0x1A9B,
+ 0x58F9, 0x0C20, 0x58FA, 0x0C21, 0x58FC, 0x23A2, 0x58FD, 0x0FAA,
+ 0x58FE, 0x264B, 0x58FF, 0x28A9, 0x5902, 0x0224, 0x5903, 0x1785,
+ 0x5906, 0x1857, 0x590A, 0x0224, 0x590C, 0x1944, 0x590D, 0x1A9C,
+ 0x590E, 0x1C6C, 0x590F, 0x0880, 0x5912, 0x3088, 0x5914, 0x166D,
+ 0x5915, 0x027C, 0x5916, 0x032E, 0x5917, 0x179C, 0x5919, 0x03B4,
+ 0x591A, 0x03B5, 0x591C, 0x0581, 0x5920, 0x0A44, 0x5922, 0x0FAC,
+ 0x5924, 0x0FAD, 0x5925, 0x0FAB, 0x5927, 0x027D, 0x5929, 0x02C2,
+ 0x592A, 0x02C4, 0x592B, 0x02C3, 0x592C, 0x1786, 0x592D, 0x02C5,
+ 0x592E, 0x032F, 0x592F, 0x179D, 0x5931, 0x0330, 0x5937, 0x03B6,
+ 0x5938, 0x03B7, 0x593C, 0x17D4, 0x593E, 0x0470, 0x5940, 0x1858,
+ 0x5944, 0x0585, 0x5945, 0x1945, 0x5947, 0x0583, 0x5948, 0x0584,
+ 0x5949, 0x0582, 0x594A, 0x1C6D, 0x594E, 0x06F2, 0x594F, 0x06F1,
+ 0x5950, 0x06F3, 0x5951, 0x06F0, 0x5953, 0x1A9D, 0x5954, 0x0586,
+ 0x5955, 0x06EF, 0x5957, 0x0881, 0x5958, 0x0882, 0x595A, 0x0883,
+ 0x595C, 0x1E95, 0x5960, 0x0C22, 0x5961, 0x20EF, 0x5962, 0x0A45,
+ 0x5967, 0x0DF3, 0x5969, 0x0FAF, 0x596A, 0x0FAE, 0x596B, 0x264C,
+ 0x596D, 0x1129, 0x596E, 0x12A7, 0x5970, 0x2F17, 0x5971, 0x337B,
+ 0x5972, 0x3412, 0x5973, 0x027E, 0x5974, 0x0331, 0x5976, 0x0332,
+ 0x5977, 0x17DA, 0x5978, 0x03B9, 0x5979, 0x03BC, 0x597B, 0x17D8,
+ 0x597C, 0x17D6, 0x597D, 0x03BB, 0x597E, 0x17D9, 0x597F, 0x17DB,
+ 0x5980, 0x17D5, 0x5981, 0x03BE, 0x5982, 0x03BD, 0x5983, 0x03BA,
+ 0x5984, 0x03B8, 0x5985, 0x17D7, 0x598A, 0x047B, 0x598D, 0x0478,
+ 0x598E, 0x185D, 0x598F, 0x1860, 0x5990, 0x185F, 0x5992, 0x0472,
+ 0x5993, 0x047A, 0x5996, 0x0477, 0x5997, 0x185C, 0x5998, 0x185A,
+ 0x5999, 0x0476, 0x599D, 0x0471, 0x599E, 0x0474, 0x59A0, 0x185B,
+ 0x59A1, 0x1862, 0x59A2, 0x185E, 0x59A3, 0x0475, 0x59A4, 0x0479,
+ 0x59A5, 0x047C, 0x59A6, 0x1859, 0x59A7, 0x1861, 0x59A8, 0x0473,
+ 0x59AE, 0x058B, 0x59AF, 0x0593, 0x59B1, 0x1951, 0x59B2, 0x194A,
+ 0x59B3, 0x0594, 0x59B4, 0x1955, 0x59B5, 0x1946, 0x59B6, 0x194D,
+ 0x59B9, 0x058A, 0x59BA, 0x1947, 0x59BB, 0x0588, 0x59BC, 0x194E,
+ 0x59BD, 0x1952, 0x59BE, 0x0587, 0x59C0, 0x1953, 0x59C1, 0x194C,
+ 0x59C3, 0x194F, 0x59C5, 0x0596, 0x59C6, 0x058D, 0x59C7, 0x1956,
+ 0x59C8, 0x1954, 0x59CA, 0x0592, 0x59CB, 0x0590, 0x59CC, 0x194B,
+ 0x59CD, 0x058F, 0x59CE, 0x1949, 0x59CF, 0x1948, 0x59D0, 0x058E,
+ 0x59D1, 0x058C, 0x59D2, 0x0595, 0x59D3, 0x0591, 0x59D4, 0x0589,
+ 0x59D6, 0x1950, 0x59D8, 0x06F5, 0x59DA, 0x06FC, 0x59DB, 0x1AAB,
+ 0x59DC, 0x06F4, 0x59DD, 0x1AA3, 0x59DE, 0x1A9F, 0x59E0, 0x1AAF,
+ 0x59E1, 0x1A9E, 0x59E3, 0x06F7, 0x59E4, 0x1AA8, 0x59E5, 0x06FA,
+ 0x59E6, 0x06FD, 0x59E8, 0x06F8, 0x59E9, 0x1AAC, 0x59EA, 0x06FB,
+ 0x59EC, 0x088A, 0x59ED, 0x1AB2, 0x59EE, 0x1AA0, 0x59F1, 0x1AA2,
+ 0x59F2, 0x1AA9, 0x59F3, 0x1AAD, 0x59F4, 0x1AB1, 0x59F5, 0x1AAE,
+ 0x59F6, 0x1AA7, 0x59F7, 0x1AAA, 0x59FA, 0x1AA4, 0x59FB, 0x06FF,
+ 0x59FC, 0x1AA6, 0x59FD, 0x1AA5, 0x59FE, 0x1AB0, 0x59FF, 0x06F6,
+ 0x5A00, 0x1AA1, 0x5A01, 0x06FE, 0x5A03, 0x06F9, 0x5A09, 0x0890,
+ 0x5A0A, 0x1C75, 0x5A0C, 0x088F, 0x5A0F, 0x1C73, 0x5A11, 0x0884,
+ 0x5A13, 0x0889, 0x5A15, 0x1C72, 0x5A16, 0x1C6F, 0x5A17, 0x1C74,
+ 0x5A18, 0x0885, 0x5A19, 0x1C6E, 0x5A1B, 0x0888, 0x5A1C, 0x0886,
+ 0x5A1E, 0x1C76, 0x5A1F, 0x0887, 0x5A20, 0x088B, 0x5A23, 0x088C,
+ 0x5A25, 0x088E, 0x5A29, 0x088D, 0x5A2D, 0x1C70, 0x5A2E, 0x1C71,
+ 0x5A33, 0x1C77, 0x5A35, 0x1E9C, 0x5A36, 0x0A46, 0x5A37, 0x20FD,
+ 0x5A38, 0x1E9B, 0x5A39, 0x1EAE, 0x5A3C, 0x0A4C, 0x5A3E, 0x1EAC,
+ 0x5A40, 0x0A4B, 0x5A41, 0x0A47, 0x5A42, 0x1EB5, 0x5A43, 0x1EA5,
+ 0x5A44, 0x1EA8, 0x5A46, 0x0A4F, 0x5A47, 0x1EB2, 0x5A48, 0x1EAA,
+ 0x5A49, 0x0A48, 0x5A4A, 0x0A50, 0x5A4C, 0x1EAF, 0x5A4D, 0x1EAD,
+ 0x5A50, 0x1E9E, 0x5A51, 0x1EB3, 0x5A52, 0x1EA7, 0x5A53, 0x1EA2,
+ 0x5A55, 0x1E98, 0x5A56, 0x1EB4, 0x5A57, 0x1EA4, 0x5A58, 0x1E97,
+ 0x5A5A, 0x0A4E, 0x5A5B, 0x1EA9, 0x5A5C, 0x1EB6, 0x5A5D, 0x1EA6,
+ 0x5A5E, 0x1E9A, 0x5A5F, 0x1E9F, 0x5A60, 0x1E96, 0x5A62, 0x0A4D,
+ 0x5A64, 0x1EA3, 0x5A65, 0x1EA0, 0x5A66, 0x0A49, 0x5A67, 0x1E99,
+ 0x5A69, 0x1EB1, 0x5A6A, 0x0A4A, 0x5A6C, 0x1EA1, 0x5A6D, 0x1E9D,
+ 0x5A70, 0x1EB0, 0x5A77, 0x0C23, 0x5A78, 0x20F6, 0x5A7A, 0x20F3,
+ 0x5A7B, 0x2104, 0x5A7C, 0x20F8, 0x5A7D, 0x2105, 0x5A7F, 0x0C25,
+ 0x5A83, 0x2101, 0x5A84, 0x20FE, 0x5A8A, 0x20FF, 0x5A8B, 0x2102,
+ 0x5A8C, 0x2106, 0x5A8E, 0x1EAB, 0x5A8F, 0x2108, 0x5A90, 0x23B6,
+ 0x5A92, 0x0C26, 0x5A93, 0x2109, 0x5A94, 0x20F1, 0x5A95, 0x20FB,
+ 0x5A97, 0x2100, 0x5A9A, 0x0C24, 0x5A9B, 0x0C27, 0x5A9C, 0x2107,
+ 0x5A9D, 0x210A, 0x5A9E, 0x20F5, 0x5A9F, 0x20F2, 0x5AA2, 0x20F4,
+ 0x5AA5, 0x20F9, 0x5AA6, 0x20F7, 0x5AA7, 0x0C28, 0x5AA9, 0x2103,
+ 0x5AAC, 0x20FA, 0x5AAE, 0x20FC, 0x5AAF, 0x20F0, 0x5AB0, 0x23AA,
+ 0x5AB1, 0x23A8, 0x5AB2, 0x0DFC, 0x5AB3, 0x0DFA, 0x5AB4, 0x23B2,
+ 0x5AB5, 0x23A9, 0x5AB6, 0x23B3, 0x5AB7, 0x23AF, 0x5AB8, 0x23A7,
+ 0x5AB9, 0x23B5, 0x5ABA, 0x23A6, 0x5ABB, 0x23AD, 0x5ABC, 0x0DF9,
+ 0x5ABD, 0x0DF8, 0x5ABE, 0x0DF7, 0x5ABF, 0x23AB, 0x5AC0, 0x23B0,
+ 0x5AC1, 0x0DF4, 0x5AC2, 0x0DFB, 0x5AC4, 0x23A4, 0x5AC6, 0x23AE,
+ 0x5AC7, 0x23A3, 0x5AC8, 0x23AC, 0x5AC9, 0x0DF5, 0x5ACA, 0x23B1,
+ 0x5ACB, 0x23A5, 0x5ACC, 0x0DF6, 0x5ACD, 0x23B4, 0x5AD5, 0x2650,
+ 0x5AD6, 0x0FB4, 0x5AD7, 0x0FB3, 0x5AD8, 0x0FB5, 0x5AD9, 0x265C,
+ 0x5ADA, 0x2652, 0x5ADB, 0x2658, 0x5ADC, 0x264D, 0x5ADD, 0x265B,
+ 0x5ADE, 0x265A, 0x5ADF, 0x265E, 0x5AE0, 0x2657, 0x5AE1, 0x0FB0,
+ 0x5AE2, 0x2656, 0x5AE3, 0x0FB6, 0x5AE5, 0x264F, 0x5AE6, 0x0FB1,
+ 0x5AE8, 0x265D, 0x5AE9, 0x0FB2, 0x5AEA, 0x2651, 0x5AEB, 0x2654,
+ 0x5AEC, 0x2659, 0x5AED, 0x2653, 0x5AEE, 0x264E, 0x5AF3, 0x2655,
+ 0x5AF4, 0x28AB, 0x5AF5, 0x112D, 0x5AF6, 0x28AE, 0x5AF7, 0x28AD,
+ 0x5AF8, 0x28B0, 0x5AF9, 0x28B2, 0x5AFA, 0x36EE, 0x5AFB, 0x112B,
+ 0x5AFD, 0x28AC, 0x5AFF, 0x28AA, 0x5B01, 0x28B3, 0x5B02, 0x28B1,
+ 0x5B03, 0x28AF, 0x5B05, 0x28B5, 0x5B07, 0x28B4, 0x5B08, 0x112F,
+ 0x5B09, 0x112A, 0x5B0B, 0x112C, 0x5B0C, 0x112E, 0x5B0F, 0x28B6,
+ 0x5B10, 0x2B22, 0x5B13, 0x2B21, 0x5B14, 0x2B20, 0x5B16, 0x2B23,
+ 0x5B17, 0x2B1C, 0x5B19, 0x2B1D, 0x5B1A, 0x2B25, 0x5B1B, 0x2B1E,
+ 0x5B1D, 0x12A8, 0x5B1E, 0x2B27, 0x5B20, 0x2B26, 0x5B21, 0x2B1F,
+ 0x5B23, 0x2D52, 0x5B24, 0x13C5, 0x5B25, 0x2D50, 0x5B26, 0x2D55,
+ 0x5B27, 0x2D54, 0x5B28, 0x2B24, 0x5B2A, 0x13C4, 0x5B2C, 0x2D53,
+ 0x5B2D, 0x2D4F, 0x5B2E, 0x2D57, 0x5B2F, 0x2D56, 0x5B30, 0x13C3,
+ 0x5B32, 0x2D51, 0x5B34, 0x12A9, 0x5B38, 0x14CE, 0x5B3C, 0x2F18,
+ 0x5B3D, 0x3089, 0x5B3E, 0x308A, 0x5B3F, 0x308B, 0x5B40, 0x160F,
+ 0x5B43, 0x1610, 0x5B45, 0x31CC, 0x5B47, 0x32CD, 0x5B48, 0x32CC,
+ 0x5B4B, 0x337C, 0x5B4C, 0x337D, 0x5B4D, 0x3413, 0x5B4E, 0x3482,
+ 0x5B50, 0x027F, 0x5B51, 0x0280, 0x5B53, 0x0281, 0x5B54, 0x02C6,
+ 0x5B55, 0x0333, 0x5B56, 0x17DC, 0x5B57, 0x03BF, 0x5B58, 0x03C0,
+ 0x5B5A, 0x047F, 0x5B5B, 0x0480, 0x5B5C, 0x047E, 0x5B5D, 0x047D,
+ 0x5B5F, 0x0597, 0x5B62, 0x1957, 0x5B63, 0x0599, 0x5B64, 0x0598,
+ 0x5B65, 0x1958, 0x5B69, 0x0700, 0x5B6B, 0x0891, 0x5B6C, 0x1C78,
+ 0x5B6E, 0x1EB8, 0x5B70, 0x0A51, 0x5B71, 0x0C2A, 0x5B72, 0x1EB7,
+ 0x5B73, 0x0C29, 0x5B75, 0x0FB7, 0x5B77, 0x265F, 0x5B78, 0x12AA,
+ 0x5B7A, 0x13C6, 0x5B7B, 0x2D58, 0x5B7D, 0x1611, 0x5B7F, 0x16C0,
+ 0x5B80, 0x0225, 0x5B81, 0x179E, 0x5B83, 0x0334, 0x5B84, 0x179F,
+ 0x5B85, 0x03C3, 0x5B87, 0x03C1, 0x5B88, 0x03C2, 0x5B89, 0x03C4,
+ 0x5B8B, 0x0482, 0x5B8C, 0x0481, 0x5B8E, 0x1863, 0x5B8F, 0x0483,
+ 0x5B92, 0x1864, 0x5B93, 0x1959, 0x5B95, 0x195A, 0x5B97, 0x059A,
+ 0x5B98, 0x059C, 0x5B99, 0x059E, 0x5B9A, 0x059B, 0x5B9B, 0x059F,
+ 0x5B9C, 0x059D, 0x5BA2, 0x0704, 0x5BA3, 0x0701, 0x5BA4, 0x0703,
+ 0x5BA5, 0x0705, 0x5BA6, 0x0702, 0x5BA7, 0x1C79, 0x5BA8, 0x1AB3,
+ 0x5BAC, 0x1C7B, 0x5BAD, 0x1C7A, 0x5BAE, 0x0897, 0x5BB0, 0x0893,
+ 0x5BB3, 0x0894, 0x5BB4, 0x0896, 0x5BB5, 0x0898, 0x5BB6, 0x0895,
+ 0x5BB8, 0x089A, 0x5BB9, 0x0899, 0x5BBF, 0x0A56, 0x5BC0, 0x1EBA,
+ 0x5BC1, 0x1EB9, 0x5BC2, 0x0A55, 0x5BC4, 0x0A54, 0x5BC5, 0x0A53,
+ 0x5BC6, 0x0A57, 0x5BC7, 0x0A52, 0x5BCA, 0x2110, 0x5BCB, 0x210D,
+ 0x5BCC, 0x0C2C, 0x5BCD, 0x210C, 0x5BCE, 0x2111, 0x5BD0, 0x0C2E,
+ 0x5BD1, 0x210F, 0x5BD2, 0x0C2B, 0x5BD3, 0x0C2D, 0x5BD4, 0x210E,
+ 0x5BD6, 0x23B7, 0x5BD8, 0x23B8, 0x5BD9, 0x23B9, 0x5BDE, 0x0FB8,
+ 0x5BDF, 0x0FC0, 0x5BE0, 0x2660, 0x5BE1, 0x0FBA, 0x5BE2, 0x0FBE,
+ 0x5BE3, 0x2661, 0x5BE4, 0x0FBF, 0x5BE5, 0x0FBB, 0x5BE6, 0x0FBC,
+ 0x5BE7, 0x0FB9, 0x5BE8, 0x0FBD, 0x5BE9, 0x1132, 0x5BEA, 0x210B,
+ 0x5BEB, 0x1133, 0x5BEC, 0x1131, 0x5BEE, 0x1130, 0x5BEF, 0x2B28,
+ 0x5BF0, 0x12AB, 0x5BF1, 0x2D59, 0x5BF2, 0x2D5A, 0x5BF5, 0x157B,
+ 0x5BF6, 0x1612, 0x5BF8, 0x0282, 0x5BFA, 0x03C5, 0x5C01, 0x0706,
+ 0x5C03, 0x1C7C, 0x5C04, 0x089B, 0x5C07, 0x0A5A, 0x5C08, 0x0A59,
+ 0x5C09, 0x0A58, 0x5C0A, 0x0C2F, 0x5C0B, 0x0C30, 0x5C0C, 0x2112,
+ 0x5C0D, 0x0FC1, 0x5C0E, 0x12AC, 0x5C0F, 0x0283, 0x5C10, 0x1787,
+ 0x5C11, 0x02C7, 0x5C12, 0x17A0, 0x5C15, 0x17DD, 0x5C16, 0x03C6,
+ 0x5C1A, 0x05A0, 0x5C1F, 0x23BA, 0x5C22, 0x0284, 0x5C24, 0x02C8,
+ 0x5C25, 0x17DE, 0x5C28, 0x1865, 0x5C2A, 0x1866, 0x5C2C, 0x0484,
+ 0x5C30, 0x2113, 0x5C31, 0x0C31, 0x5C33, 0x23BB, 0x5C37, 0x13C7,
+ 0x5C38, 0x0285, 0x5C39, 0x0299, 0x5C3A, 0x02C9, 0x5C3B, 0x17A1,
+ 0x5C3C, 0x0335, 0x5C3E, 0x0488, 0x5C3F, 0x0487, 0x5C40, 0x0485,
+ 0x5C41, 0x0486, 0x5C44, 0x195B, 0x5C45, 0x05A2, 0x5C46, 0x05A3,
+ 0x5C47, 0x195C, 0x5C48, 0x05A1, 0x5C4B, 0x070A, 0x5C4C, 0x1AB4,
+ 0x5C4D, 0x0709, 0x5C4E, 0x0707, 0x5C4F, 0x0708, 0x5C50, 0x089E,
+ 0x5C51, 0x089C, 0x5C54, 0x1C7E, 0x5C55, 0x089D, 0x5C56, 0x1C7D,
+ 0x5C58, 0x0892, 0x5C59, 0x1EBB, 0x5C5C, 0x0A5C, 0x5C5D, 0x0A5D,
+ 0x5C60, 0x0A5B, 0x5C62, 0x0FC2, 0x5C63, 0x2662, 0x5C64, 0x1134,
+ 0x5C65, 0x1135, 0x5C67, 0x28B7, 0x5C68, 0x13C8, 0x5C69, 0x2F19,
+ 0x5C6A, 0x2F1A, 0x5C6C, 0x166E, 0x5C6D, 0x3483, 0x5C6E, 0x1776,
+ 0x5C6F, 0x02CA, 0x5C71, 0x0286, 0x5C73, 0x17A3, 0x5C74, 0x17A2,
+ 0x5C79, 0x03C7, 0x5C7A, 0x17E0, 0x5C7B, 0x17E1, 0x5C7C, 0x17DF,
+ 0x5C7E, 0x17E2, 0x5C86, 0x186E, 0x5C88, 0x1869, 0x5C89, 0x186B,
+ 0x5C8A, 0x186D, 0x5C8B, 0x186A, 0x5C8C, 0x048C, 0x5C8D, 0x1867,
+ 0x5C8F, 0x1868, 0x5C90, 0x0489, 0x5C91, 0x048A, 0x5C92, 0x186C,
+ 0x5C93, 0x186F, 0x5C94, 0x048B, 0x5C95, 0x1870, 0x5C9D, 0x196A,
+ 0x5C9F, 0x1964, 0x5CA0, 0x195F, 0x5CA1, 0x05A5, 0x5CA2, 0x1967,
+ 0x5CA3, 0x1965, 0x5CA4, 0x195E, 0x5CA5, 0x196B, 0x5CA6, 0x196E,
+ 0x5CA7, 0x1969, 0x5CA8, 0x1962, 0x5CA9, 0x05A7, 0x5CAA, 0x1968,
+ 0x5CAB, 0x05A8, 0x5CAC, 0x1963, 0x5CAD, 0x1966, 0x5CAE, 0x195D,
+ 0x5CAF, 0x1961, 0x5CB0, 0x196D, 0x5CB1, 0x05A9, 0x5CB3, 0x05AA,
+ 0x5CB5, 0x1960, 0x5CB6, 0x196C, 0x5CB7, 0x05A4, 0x5CB8, 0x05A6,
+ 0x5CC6, 0x1AC5, 0x5CC7, 0x1ABE, 0x5CC8, 0x1AC4, 0x5CC9, 0x1ABD,
+ 0x5CCA, 0x1ABF, 0x5CCB, 0x1AB9, 0x5CCC, 0x1AB7, 0x5CCE, 0x1AC6,
+ 0x5CCF, 0x1AC3, 0x5CD0, 0x1AB5, 0x5CD2, 0x070C, 0x5CD3, 0x1AC1,
+ 0x5CD4, 0x1AC2, 0x5CD6, 0x1AC0, 0x5CD7, 0x1AB8, 0x5CD8, 0x1AB6,
+ 0x5CD9, 0x070B, 0x5CDA, 0x1ABC, 0x5CDB, 0x1ABA, 0x5CDE, 0x1ABB,
+ 0x5CDF, 0x1AC7, 0x5CE8, 0x08A3, 0x5CEA, 0x08A2, 0x5CEC, 0x1C7F,
+ 0x5CED, 0x089F, 0x5CEE, 0x1C81, 0x5CF0, 0x08A4, 0x5CF1, 0x1C82,
+ 0x5CF4, 0x08A7, 0x5CF6, 0x08A5, 0x5CF7, 0x1C83, 0x5CF8, 0x1AC8,
+ 0x5CF9, 0x1C85, 0x5CFB, 0x08A1, 0x5CFD, 0x08A0, 0x5CFF, 0x1C80,
+ 0x5D00, 0x1C84, 0x5D01, 0x08A6, 0x5D06, 0x0A5F, 0x5D07, 0x0A5E,
+ 0x5D0B, 0x1EBD, 0x5D0C, 0x1EC1, 0x5D0D, 0x1EC3, 0x5D0E, 0x0A60,
+ 0x5D0F, 0x1EC6, 0x5D11, 0x0A64, 0x5D12, 0x1EC8, 0x5D14, 0x0A66,
+ 0x5D16, 0x0A62, 0x5D17, 0x0A6A, 0x5D19, 0x0A67, 0x5D1A, 0x1EBF,
+ 0x5D1B, 0x0A61, 0x5D1D, 0x1EBE, 0x5D1E, 0x1EBC, 0x5D1F, 0x1ECA,
+ 0x5D20, 0x1EC0, 0x5D22, 0x0A63, 0x5D23, 0x1EC9, 0x5D24, 0x0A68,
+ 0x5D25, 0x1EC5, 0x5D26, 0x1EC4, 0x5D27, 0x0A69, 0x5D28, 0x1EC2,
+ 0x5D29, 0x0A65, 0x5D2E, 0x1ECB, 0x5D30, 0x1EC7, 0x5D31, 0x2122,
+ 0x5D32, 0x2129, 0x5D33, 0x211E, 0x5D34, 0x0C34, 0x5D35, 0x211A,
+ 0x5D36, 0x212A, 0x5D37, 0x2114, 0x5D38, 0x2127, 0x5D39, 0x2125,
+ 0x5D3A, 0x211F, 0x5D3C, 0x2128, 0x5D3D, 0x2121, 0x5D3F, 0x2119,
+ 0x5D40, 0x212B, 0x5D41, 0x2117, 0x5D42, 0x2124, 0x5D43, 0x2115,
+ 0x5D45, 0x212C, 0x5D47, 0x0C35, 0x5D49, 0x2126, 0x5D4A, 0x23BE,
+ 0x5D4B, 0x2118, 0x5D4C, 0x0C32, 0x5D4E, 0x211C, 0x5D50, 0x0C33,
+ 0x5D51, 0x211B, 0x5D52, 0x2120, 0x5D55, 0x211D, 0x5D59, 0x2123,
+ 0x5D5E, 0x23C2, 0x5D62, 0x23C5, 0x5D63, 0x23BD, 0x5D65, 0x23BF,
+ 0x5D67, 0x23C4, 0x5D68, 0x23C3, 0x5D69, 0x0DFD, 0x5D6B, 0x2116,
+ 0x5D6C, 0x23C1, 0x5D6F, 0x0DFE, 0x5D71, 0x23BC, 0x5D72, 0x23C0,
+ 0x5D77, 0x2669, 0x5D79, 0x2670, 0x5D7A, 0x2667, 0x5D7C, 0x266E,
+ 0x5D7D, 0x2665, 0x5D7E, 0x266D, 0x5D7F, 0x2671, 0x5D80, 0x2664,
+ 0x5D81, 0x2668, 0x5D82, 0x2663, 0x5D84, 0x0FC3, 0x5D86, 0x2666,
+ 0x5D87, 0x0FC4, 0x5D88, 0x266C, 0x5D89, 0x266B, 0x5D8A, 0x266A,
+ 0x5D8D, 0x266F, 0x5D92, 0x28BB, 0x5D93, 0x28BD, 0x5D94, 0x1137,
+ 0x5D95, 0x28BE, 0x5D97, 0x28B9, 0x5D99, 0x28B8, 0x5D9A, 0x28C2,
+ 0x5D9C, 0x28C0, 0x5D9D, 0x1136, 0x5D9E, 0x28C3, 0x5D9F, 0x28BA,
+ 0x5DA0, 0x28BF, 0x5DA1, 0x28C1, 0x5DA2, 0x28BC, 0x5DA7, 0x2B2C,
+ 0x5DA8, 0x2B31, 0x5DA9, 0x2B2B, 0x5DAA, 0x2B30, 0x5DAC, 0x2B29,
+ 0x5DAD, 0x2B33, 0x5DAE, 0x2B2F, 0x5DAF, 0x2B34, 0x5DB0, 0x2B2E,
+ 0x5DB1, 0x2B2A, 0x5DB2, 0x2B32, 0x5DB4, 0x2B35, 0x5DB5, 0x2B2D,
+ 0x5DB7, 0x2D5B, 0x5DB8, 0x13CC, 0x5DBA, 0x13CA, 0x5DBC, 0x13C9,
+ 0x5DBD, 0x13CB, 0x5DC0, 0x2F1B, 0x5DC2, 0x3023, 0x5DC3, 0x308C,
+ 0x5DC6, 0x31CD, 0x5DC7, 0x31CE, 0x5DC9, 0x1613, 0x5DCB, 0x32CE,
+ 0x5DCD, 0x166F, 0x5DCF, 0x32CF, 0x5DD1, 0x337F, 0x5DD2, 0x16C2,
+ 0x5DD4, 0x16C1, 0x5DD5, 0x337E, 0x5DD6, 0x16F7, 0x5DD8, 0x3414,
+ 0x5DDB, 0x0226, 0x5DDD, 0x0287, 0x5DDE, 0x03C8, 0x5DDF, 0x17E3,
+ 0x5DE0, 0x1871, 0x5DE1, 0x051A, 0x5DE2, 0x0A6B, 0x5DE5, 0x0288,
+ 0x5DE6, 0x0338, 0x5DE7, 0x0337, 0x5DE8, 0x0336, 0x5DEB, 0x048D,
+ 0x5DEE, 0x08A8, 0x5DF0, 0x23C6, 0x5DF1, 0x0289, 0x5DF2, 0x028A,
+ 0x5DF3, 0x028B, 0x5DF4, 0x02CB, 0x5DF7, 0x070D, 0x5DF9, 0x1AC9,
+ 0x5DFD, 0x0C36, 0x5DFE, 0x028C, 0x5DFF, 0x1788, 0x5E02, 0x0339,
+ 0x5E03, 0x033A, 0x5E04, 0x17A4, 0x5E06, 0x03C9, 0x5E0A, 0x1872,
+ 0x5E0C, 0x048E, 0x5E0E, 0x1873, 0x5E11, 0x05B0, 0x5E14, 0x1970,
+ 0x5E15, 0x05AE, 0x5E16, 0x05AD, 0x5E17, 0x196F, 0x5E18, 0x05AB,
+ 0x5E19, 0x1971, 0x5E1A, 0x05AC, 0x5E1B, 0x05AF, 0x5E1D, 0x070E,
+ 0x5E1F, 0x0710, 0x5E20, 0x1ACD, 0x5E21, 0x1ACA, 0x5E22, 0x1ACB,
+ 0x5E23, 0x1ACC, 0x5E24, 0x1ACE, 0x5E25, 0x070F, 0x5E28, 0x1C87,
+ 0x5E29, 0x1C86, 0x5E2B, 0x08AA, 0x5E2D, 0x08A9, 0x5E33, 0x0A6E,
+ 0x5E34, 0x1ECD, 0x5E36, 0x0A6D, 0x5E37, 0x0A6F, 0x5E38, 0x0A6C,
+ 0x5E3D, 0x0C38, 0x5E3E, 0x1ECC, 0x5E40, 0x0C39, 0x5E41, 0x212E,
+ 0x5E43, 0x0C3A, 0x5E44, 0x212D, 0x5E45, 0x0C37, 0x5E4A, 0x23C9,
+ 0x5E4B, 0x23CB, 0x5E4C, 0x0DFF, 0x5E4D, 0x23CA, 0x5E4E, 0x23C8,
+ 0x5E4F, 0x23C7, 0x5E53, 0x2674, 0x5E54, 0x0FC9, 0x5E55, 0x0FC7,
+ 0x5E57, 0x0FC8, 0x5E58, 0x2672, 0x5E59, 0x2673, 0x5E5B, 0x0FC5,
+ 0x5E5C, 0x28C7, 0x5E5D, 0x28C5, 0x5E5F, 0x1139, 0x5E60, 0x28C6,
+ 0x5E61, 0x113A, 0x5E62, 0x1138, 0x5E63, 0x0FC6, 0x5E66, 0x2B38,
+ 0x5E67, 0x2B36, 0x5E68, 0x2B37, 0x5E69, 0x28C4, 0x5E6A, 0x2D5D,
+ 0x5E6B, 0x13CD, 0x5E6C, 0x2D5C, 0x5E6D, 0x2F1C, 0x5E6E, 0x2F1D,
+ 0x5E6F, 0x2B39, 0x5E70, 0x308D, 0x5E72, 0x028D, 0x5E73, 0x033B,
+ 0x5E74, 0x03CB, 0x5E75, 0x17E4, 0x5E76, 0x03CA, 0x5E78, 0x05B1,
+ 0x5E79, 0x0E00, 0x5E7A, 0x0227, 0x5E7B, 0x02CC, 0x5E7C, 0x033C,
+ 0x5E7D, 0x0711, 0x5E7E, 0x0C3B, 0x5E7F, 0x0228, 0x5E80, 0x17A5,
+ 0x5E82, 0x17A6, 0x5E84, 0x17E5, 0x5E87, 0x0490, 0x5E88, 0x1877,
+ 0x5E89, 0x1875, 0x5E8A, 0x0491, 0x5E8B, 0x1874, 0x5E8C, 0x1876,
+ 0x5E8D, 0x1878, 0x5E8F, 0x048F, 0x5E95, 0x05B5, 0x5E96, 0x05B6,
+ 0x5E97, 0x05B3, 0x5E9A, 0x05B2, 0x5E9B, 0x1AD2, 0x5E9C, 0x05B4,
+ 0x5EA0, 0x0712, 0x5EA2, 0x1AD1, 0x5EA3, 0x1AD3, 0x5EA4, 0x1AD0,
+ 0x5EA5, 0x1AD4, 0x5EA6, 0x0713, 0x5EA7, 0x08AD, 0x5EA8, 0x1C88,
+ 0x5EAA, 0x1C8A, 0x5EAB, 0x08AB, 0x5EAC, 0x1C8B, 0x5EAD, 0x08AC,
+ 0x5EAE, 0x1C89, 0x5EB0, 0x1ACF, 0x5EB1, 0x1ECE, 0x5EB2, 0x1ED1,
+ 0x5EB3, 0x1ED2, 0x5EB4, 0x1ECF, 0x5EB5, 0x0A73, 0x5EB6, 0x0A72,
+ 0x5EB7, 0x0A70, 0x5EB8, 0x0A71, 0x5EB9, 0x1ED0, 0x5EBE, 0x0A74,
+ 0x5EC1, 0x0C3D, 0x5EC2, 0x0C3E, 0x5EC4, 0x0C3F, 0x5EC5, 0x23CC,
+ 0x5EC6, 0x23CE, 0x5EC7, 0x23D0, 0x5EC8, 0x0E02, 0x5EC9, 0x0E01,
+ 0x5ECA, 0x0C3C, 0x5ECB, 0x23CF, 0x5ECC, 0x23CD, 0x5ECE, 0x2678,
+ 0x5ED1, 0x2676, 0x5ED2, 0x267C, 0x5ED3, 0x0FCA, 0x5ED4, 0x267D,
+ 0x5ED5, 0x267A, 0x5ED6, 0x0FCB, 0x5ED7, 0x2677, 0x5ED8, 0x2675,
+ 0x5ED9, 0x267B, 0x5EDA, 0x113C, 0x5EDB, 0x28C9, 0x5EDC, 0x2679,
+ 0x5EDD, 0x113E, 0x5EDE, 0x28CA, 0x5EDF, 0x113D, 0x5EE0, 0x1140,
+ 0x5EE1, 0x28CB, 0x5EE2, 0x113B, 0x5EE3, 0x113F, 0x5EE5, 0x2B3E,
+ 0x5EE6, 0x2B3C, 0x5EE7, 0x2B3B, 0x5EE8, 0x2B3D, 0x5EE9, 0x2B3A,
+ 0x5EEC, 0x157D, 0x5EEE, 0x31CF, 0x5EEF, 0x31D0, 0x5EF1, 0x32D0,
+ 0x5EF2, 0x3380, 0x5EF3, 0x1742, 0x5EF4, 0x0229, 0x5EF6, 0x05B7,
+ 0x5EF7, 0x0492, 0x5EFA, 0x0714, 0x5EFE, 0x028E, 0x5EFF, 0x02CD,
+ 0x5F01, 0x033D, 0x5F02, 0x17E6, 0x5F04, 0x0493, 0x5F05, 0x1879,
+ 0x5F07, 0x1AD5, 0x5F08, 0x0715, 0x5F0A, 0x0FCC, 0x5F0B, 0x028F,
+ 0x5F0F, 0x03CC, 0x5F12, 0x0E03, 0x5F13, 0x0290, 0x5F14, 0x02CE,
+ 0x5F15, 0x02CF, 0x5F17, 0x033F, 0x5F18, 0x033E, 0x5F1A, 0x17E7,
+ 0x5F1B, 0x03CD, 0x5F1D, 0x187A, 0x5F1F, 0x0494, 0x5F22, 0x1973,
+ 0x5F23, 0x1974, 0x5F24, 0x1975, 0x5F26, 0x05B8, 0x5F27, 0x05B9,
+ 0x5F28, 0x1972, 0x5F29, 0x05BA, 0x5F2D, 0x0716, 0x5F2E, 0x1AD6,
+ 0x5F30, 0x1C8D, 0x5F31, 0x08AE, 0x5F33, 0x1C8C, 0x5F35, 0x0A75,
+ 0x5F36, 0x1ED3, 0x5F37, 0x0A76, 0x5F38, 0x1ED4, 0x5F3C, 0x0C40,
+ 0x5F40, 0x23D1, 0x5F43, 0x267F, 0x5F44, 0x267E, 0x5F46, 0x0FCD,
+ 0x5F48, 0x1141, 0x5F49, 0x28CC, 0x5F4A, 0x12AD, 0x5F4B, 0x2B3F,
+ 0x5F4C, 0x13CE, 0x5F4E, 0x16C3, 0x5F4F, 0x3416, 0x5F50, 0x022A,
+ 0x5F54, 0x1976, 0x5F56, 0x1AD7, 0x5F57, 0x0A77, 0x5F58, 0x212F,
+ 0x5F59, 0x0E04, 0x5F5D, 0x14CF, 0x5F61, 0x022B, 0x5F62, 0x0496,
+ 0x5F64, 0x0495, 0x5F65, 0x0717, 0x5F67, 0x1C8E, 0x5F69, 0x0A79,
+ 0x5F6A, 0x0B89, 0x5F6B, 0x0A7A, 0x5F6C, 0x0A78, 0x5F6D, 0x0C41,
+ 0x5F6F, 0x2680, 0x5F70, 0x0FCE, 0x5F71, 0x1142, 0x5F73, 0x1777,
+ 0x5F74, 0x17E8, 0x5F76, 0x187C, 0x5F77, 0x0497, 0x5F78, 0x187B,
+ 0x5F79, 0x0498, 0x5F7C, 0x05BE, 0x5F7D, 0x1979, 0x5F7E, 0x1978,
+ 0x5F7F, 0x05BD, 0x5F80, 0x05BB, 0x5F81, 0x05BC, 0x5F82, 0x1977,
+ 0x5F85, 0x0719, 0x5F86, 0x1AD8, 0x5F87, 0x071C, 0x5F88, 0x0718,
+ 0x5F89, 0x071E, 0x5F8A, 0x071A, 0x5F8B, 0x071B, 0x5F8C, 0x071D,
+ 0x5F90, 0x08B1, 0x5F91, 0x08B0, 0x5F92, 0x08AF, 0x5F96, 0x1ED6,
+ 0x5F97, 0x0A7B, 0x5F98, 0x0A7E, 0x5F99, 0x0A7C, 0x5F9B, 0x1ED5,
+ 0x5F9C, 0x0A81, 0x5F9E, 0x0A7D, 0x5F9F, 0x1ED7, 0x5FA0, 0x0A80,
+ 0x5FA1, 0x0A7F, 0x5FA5, 0x2131, 0x5FA6, 0x2130, 0x5FA8, 0x0C44,
+ 0x5FA9, 0x0C42, 0x5FAA, 0x0C43, 0x5FAB, 0x2132, 0x5FAC, 0x0E05,
+ 0x5FAD, 0x23D3, 0x5FAE, 0x0E06, 0x5FAF, 0x23D2, 0x5FB2, 0x28CD,
+ 0x5FB5, 0x1144, 0x5FB6, 0x2681, 0x5FB7, 0x1143, 0x5FB9, 0x0FCF,
+ 0x5FBB, 0x2B41, 0x5FBC, 0x2B40, 0x5FBD, 0x13CF, 0x5FBE, 0x2D5E,
+ 0x5FBF, 0x308E, 0x5FC0, 0x31D1, 0x5FC1, 0x31D2, 0x5FC3, 0x02D0,
+ 0x5FC5, 0x0340, 0x5FC9, 0x17A7, 0x5FCC, 0x049A, 0x5FCD, 0x049C,
+ 0x5FCF, 0x17EB, 0x5FD0, 0x187F, 0x5FD1, 0x187E, 0x5FD2, 0x187D,
+ 0x5FD4, 0x17EA, 0x5FD5, 0x17E9, 0x5FD6, 0x03CF, 0x5FD7, 0x049B,
+ 0x5FD8, 0x0499, 0x5FD9, 0x03CE, 0x5FDD, 0x05BF, 0x5FDE, 0x197A,
+ 0x5FE0, 0x05C0, 0x5FE1, 0x1884, 0x5FE3, 0x1886, 0x5FE4, 0x1885,
+ 0x5FE5, 0x197B, 0x5FE8, 0x1881, 0x5FEA, 0x04A0, 0x5FEB, 0x049E,
+ 0x5FED, 0x1880, 0x5FEE, 0x1882, 0x5FEF, 0x1888, 0x5FF1, 0x049D,
+ 0x5FF3, 0x1883, 0x5FF4, 0x188C, 0x5FF5, 0x05C2, 0x5FF7, 0x1889,
+ 0x5FF8, 0x049F, 0x5FFA, 0x1887, 0x5FFB, 0x188A, 0x5FFD, 0x05C1,
+ 0x5FFF, 0x05C3, 0x6000, 0x188B, 0x6009, 0x198F, 0x600A, 0x1982,
+ 0x600B, 0x1980, 0x600C, 0x198E, 0x600D, 0x1989, 0x600E, 0x0723,
+ 0x600F, 0x05C4, 0x6010, 0x198A, 0x6011, 0x198D, 0x6012, 0x071F,
+ 0x6013, 0x198C, 0x6014, 0x05C5, 0x6015, 0x05CA, 0x6016, 0x05C8,
+ 0x6017, 0x1983, 0x6019, 0x197E, 0x601A, 0x1985, 0x601B, 0x05CF,
+ 0x601C, 0x1990, 0x601D, 0x0720, 0x601E, 0x1986, 0x6020, 0x0721,
+ 0x6021, 0x05CB, 0x6022, 0x1988, 0x6024, 0x1AE7, 0x6025, 0x0722,
+ 0x6026, 0x197D, 0x6027, 0x05CC, 0x6028, 0x0724, 0x6029, 0x05CD,
+ 0x602A, 0x05C9, 0x602B, 0x05CE, 0x602C, 0x1987, 0x602D, 0x197C,
+ 0x602E, 0x198B, 0x602F, 0x05C6, 0x6032, 0x197F, 0x6033, 0x1984,
+ 0x6034, 0x1981, 0x6035, 0x05C7, 0x6037, 0x1AD9, 0x6039, 0x1ADA,
+ 0x6040, 0x1AE4, 0x6041, 0x1C92, 0x6042, 0x1AE5, 0x6043, 0x072A,
+ 0x6044, 0x1AE8, 0x6045, 0x1ADE, 0x6046, 0x0729, 0x6047, 0x1AE0,
+ 0x6049, 0x1AE1, 0x604C, 0x1AE3, 0x604D, 0x0725, 0x6050, 0x08B5,
+ 0x6052, 0x36EC, 0x6053, 0x1ADF, 0x6054, 0x1ADB, 0x6055, 0x08B6,
+ 0x6058, 0x1AE9, 0x6059, 0x08B2, 0x605A, 0x1C90, 0x605B, 0x1AE2,
+ 0x605D, 0x1C8F, 0x605E, 0x1ADD, 0x605F, 0x1AE6, 0x6062, 0x0728,
+ 0x6063, 0x08B3, 0x6064, 0x072E, 0x6065, 0x08B4, 0x6066, 0x1AEA,
+ 0x6067, 0x1C91, 0x6068, 0x0727, 0x6069, 0x08B8, 0x606A, 0x072D,
+ 0x606B, 0x072C, 0x606C, 0x072B, 0x606D, 0x08B7, 0x606E, 0x1AEB,
+ 0x606F, 0x08B9, 0x6070, 0x0726, 0x6072, 0x1ADC, 0x607F, 0x0A82,
+ 0x6080, 0x1C95, 0x6081, 0x1C97, 0x6083, 0x1C99, 0x6084, 0x08BA,
+ 0x6085, 0x08C0, 0x6086, 0x1EDA, 0x6087, 0x1C9D, 0x6088, 0x1C94,
+ 0x6089, 0x0A84, 0x608A, 0x1ED8, 0x608C, 0x08BF, 0x608D, 0x08BD,
+ 0x608E, 0x1C9F, 0x6090, 0x1ED9, 0x6092, 0x1C96, 0x6094, 0x08BE,
+ 0x6095, 0x1C9A, 0x6096, 0x08C1, 0x6097, 0x1C9C, 0x609A, 0x08BC,
+ 0x609B, 0x1C9B, 0x609C, 0x1C9E, 0x609D, 0x1C98, 0x609F, 0x08BB,
+ 0x60A0, 0x0A85, 0x60A2, 0x1C93, 0x60A3, 0x0A83, 0x60A8, 0x0A86,
+ 0x60B0, 0x1EDC, 0x60B1, 0x1EE5, 0x60B2, 0x0C47, 0x60B4, 0x0A88,
+ 0x60B5, 0x0A8D, 0x60B6, 0x0C48, 0x60B7, 0x1EE7, 0x60B8, 0x0A94,
+ 0x60B9, 0x2134, 0x60BA, 0x1EDD, 0x60BB, 0x0A8C, 0x60BC, 0x0A8F,
+ 0x60BD, 0x0A8A, 0x60BE, 0x1EDB, 0x60BF, 0x1EE9, 0x60C0, 0x1EEC,
+ 0x60C1, 0x2143, 0x60C3, 0x1EEA, 0x60C4, 0x2138, 0x60C5, 0x0A8B,
+ 0x60C6, 0x0A92, 0x60C7, 0x0A96, 0x60C8, 0x1EE4, 0x60C9, 0x2133,
+ 0x60CA, 0x1EE8, 0x60CB, 0x0A87, 0x60CC, 0x2135, 0x60CD, 0x1EEB,
+ 0x60CE, 0x2137, 0x60CF, 0x1EE0, 0x60D1, 0x0C45, 0x60D3, 0x1EDE,
+ 0x60D4, 0x1EDF, 0x60D5, 0x0A91, 0x60D8, 0x0A90, 0x60D9, 0x1EE2,
+ 0x60DA, 0x0A95, 0x60DB, 0x1EE6, 0x60DC, 0x0A8E, 0x60DD, 0x1EE3,
+ 0x60DF, 0x0A93, 0x60E0, 0x0C49, 0x60E1, 0x0C46, 0x60E2, 0x2136,
+ 0x60E4, 0x1EE1, 0x60E6, 0x0A89, 0x60F0, 0x0C4E, 0x60F1, 0x0C52,
+ 0x60F2, 0x213A, 0x60F3, 0x0E0B, 0x60F4, 0x0C50, 0x60F5, 0x213E,
+ 0x60F6, 0x0C54, 0x60F7, 0x23D4, 0x60F8, 0x2140, 0x60F9, 0x0E0D,
+ 0x60FA, 0x0C4C, 0x60FB, 0x0C4F, 0x60FC, 0x2141, 0x60FE, 0x2142,
+ 0x60FF, 0x2148, 0x6100, 0x0C56, 0x6101, 0x0E0E, 0x6103, 0x2144,
+ 0x6104, 0x2149, 0x6105, 0x213D, 0x6106, 0x0E18, 0x6108, 0x0E0F,
+ 0x6109, 0x0C55, 0x610A, 0x213B, 0x610B, 0x214A, 0x610D, 0x0E17,
+ 0x610E, 0x0C53, 0x610F, 0x0E08, 0x6110, 0x2147, 0x6112, 0x0C57,
+ 0x6113, 0x213F, 0x6114, 0x2139, 0x6115, 0x0C4D, 0x6116, 0x213C,
+ 0x6118, 0x2145, 0x611A, 0x0E07, 0x611B, 0x0E0C, 0x611C, 0x0C4A,
+ 0x611D, 0x2146, 0x611F, 0x0E0A, 0x6123, 0x0C4B, 0x6127, 0x0E16,
+ 0x6128, 0x2683, 0x6129, 0x23DF, 0x612B, 0x23D7, 0x612C, 0x2682,
+ 0x612E, 0x23DB, 0x612F, 0x23DD, 0x6132, 0x23DA, 0x6134, 0x0E15,
+ 0x6136, 0x23D9, 0x6137, 0x0E19, 0x613B, 0x2692, 0x613E, 0x0E14,
+ 0x613F, 0x0FD1, 0x6140, 0x23E0, 0x6141, 0x2684, 0x6144, 0x0E12,
+ 0x6145, 0x23D8, 0x6146, 0x23DC, 0x6147, 0x0FD0, 0x6148, 0x0E09,
+ 0x6149, 0x23D5, 0x614A, 0x23D6, 0x614B, 0x0FD2, 0x614C, 0x0E11,
+ 0x614D, 0x0E13, 0x614E, 0x0E10, 0x614F, 0x23DE, 0x6152, 0x2688,
+ 0x6153, 0x2689, 0x6154, 0x268E, 0x6155, 0x1149, 0x6156, 0x2695,
+ 0x6158, 0x0FD8, 0x615A, 0x0FD7, 0x615B, 0x2690, 0x615D, 0x1148,
+ 0x615E, 0x2685, 0x615F, 0x0FD6, 0x6161, 0x2694, 0x6162, 0x0FD4,
+ 0x6163, 0x0FD5, 0x6165, 0x2691, 0x6166, 0x28DE, 0x6167, 0x1146,
+ 0x6168, 0x0C51, 0x616A, 0x2693, 0x616B, 0x114D, 0x616C, 0x268B,
+ 0x616E, 0x1147, 0x6170, 0x114C, 0x6171, 0x2686, 0x6172, 0x268A,
+ 0x6173, 0x2687, 0x6174, 0x268D, 0x6175, 0x0FD9, 0x6176, 0x1145,
+ 0x6177, 0x0FD3, 0x6179, 0x28D0, 0x617A, 0x268F, 0x617C, 0x114B,
+ 0x617E, 0x114E, 0x6180, 0x268C, 0x6182, 0x114A, 0x6183, 0x28CF,
+ 0x6189, 0x28D4, 0x618A, 0x12B1, 0x618B, 0x28CE, 0x618C, 0x2B4D,
+ 0x618D, 0x28DD, 0x618E, 0x1152, 0x6190, 0x1150, 0x6191, 0x12AF,
+ 0x6192, 0x28DA, 0x6193, 0x28D6, 0x6194, 0x1156, 0x6196, 0x2B44,
+ 0x619A, 0x1154, 0x619B, 0x28D5, 0x619D, 0x2B42, 0x619F, 0x28D9,
+ 0x61A1, 0x28DC, 0x61A2, 0x28D3, 0x61A4, 0x1155, 0x61A7, 0x114F,
+ 0x61A8, 0x2B43, 0x61A9, 0x12B0, 0x61AA, 0x28DB, 0x61AB, 0x1151,
+ 0x61AC, 0x1153, 0x61AD, 0x28D8, 0x61AE, 0x1157, 0x61AF, 0x28D7,
+ 0x61B0, 0x28D2, 0x61B1, 0x28D1, 0x61B2, 0x12AE, 0x61B3, 0x28DF,
+ 0x61B4, 0x2B46, 0x61B5, 0x2D60, 0x61B6, 0x12B3, 0x61B8, 0x2B4C,
+ 0x61BA, 0x2B4A, 0x61BC, 0x2D61, 0x61BE, 0x12B4, 0x61BF, 0x2B4B,
+ 0x61C1, 0x2B48, 0x61C2, 0x13D1, 0x61C3, 0x2D5F, 0x61C5, 0x2B45,
+ 0x61C6, 0x2B47, 0x61C7, 0x13D2, 0x61C8, 0x12B6, 0x61C9, 0x13D0,
+ 0x61CA, 0x12B5, 0x61CB, 0x13D4, 0x61CC, 0x2B49, 0x61CD, 0x12B2,
+ 0x61D6, 0x2F26, 0x61D8, 0x2F1E, 0x61DE, 0x2D67, 0x61DF, 0x2F1F,
+ 0x61E0, 0x2D63, 0x61E3, 0x14D0, 0x61E4, 0x2D65, 0x61E5, 0x2D64,
+ 0x61E6, 0x13D3, 0x61E7, 0x2D62, 0x61E8, 0x2D66, 0x61E9, 0x2F27,
+ 0x61EA, 0x2F23, 0x61EB, 0x2F25, 0x61ED, 0x2F20, 0x61EE, 0x2F21,
+ 0x61F0, 0x2F24, 0x61F1, 0x2F22, 0x61F2, 0x157E, 0x61F5, 0x1581,
+ 0x61F6, 0x1580, 0x61F7, 0x157F, 0x61F8, 0x1614, 0x61F9, 0x31D3,
+ 0x61FA, 0x1615, 0x61FB, 0x308F, 0x61FC, 0x1670, 0x61FD, 0x32D1,
+ 0x61FE, 0x1671, 0x61FF, 0x16C4, 0x6200, 0x16F8, 0x6201, 0x3417,
+ 0x6203, 0x3418, 0x6204, 0x3419, 0x6207, 0x3533, 0x6208, 0x02D1,
+ 0x6209, 0x17A8, 0x620A, 0x0341, 0x620C, 0x03D1, 0x620D, 0x03D2,
+ 0x620E, 0x03D0, 0x6210, 0x03D3, 0x6211, 0x04A2, 0x6212, 0x04A1,
+ 0x6214, 0x1991, 0x6215, 0x05D1, 0x6216, 0x05D0, 0x6219, 0x1CA0,
+ 0x621A, 0x0A97, 0x621B, 0x0A98, 0x621F, 0x0C58, 0x6220, 0x23E1,
+ 0x6221, 0x0E1A, 0x6222, 0x0E1B, 0x6223, 0x23E3, 0x6224, 0x23E5,
+ 0x6225, 0x23E4, 0x6227, 0x2697, 0x6229, 0x2696, 0x622A, 0x0FDA,
+ 0x622B, 0x2698, 0x622D, 0x28E0, 0x622E, 0x1158, 0x6230, 0x12B7,
+ 0x6232, 0x13D5, 0x6233, 0x14D1, 0x6234, 0x13D6, 0x6236, 0x02D2,
+ 0x623A, 0x188D, 0x623D, 0x1992, 0x623E, 0x05D3, 0x623F, 0x05D2,
+ 0x6240, 0x05D4, 0x6241, 0x072F, 0x6242, 0x1AEC, 0x6243, 0x1AED,
+ 0x6246, 0x1CA1, 0x6247, 0x08C2, 0x6248, 0x0A99, 0x6249, 0x0C59,
+ 0x624A, 0x214B, 0x624B, 0x02D3, 0x624D, 0x0291, 0x624E, 0x02D4,
+ 0x6250, 0x17A9, 0x6251, 0x0345, 0x6252, 0x0344, 0x6253, 0x0342,
+ 0x6254, 0x0343, 0x6258, 0x03D6, 0x6259, 0x17F2, 0x625A, 0x17F4,
+ 0x625B, 0x03D5, 0x625C, 0x17EC, 0x625E, 0x17ED, 0x6260, 0x17F3,
+ 0x6261, 0x17EF, 0x6262, 0x17F1, 0x6263, 0x03D4, 0x6264, 0x17EE,
+ 0x6265, 0x17F5, 0x6266, 0x17F0, 0x626D, 0x04A9, 0x626E, 0x04B2,
+ 0x626F, 0x04B0, 0x6270, 0x1897, 0x6271, 0x1894, 0x6272, 0x189C,
+ 0x6273, 0x04AE, 0x6274, 0x189D, 0x6276, 0x04A7, 0x6277, 0x189A,
+ 0x6279, 0x04AD, 0x627A, 0x1896, 0x627B, 0x1895, 0x627C, 0x04AB,
+ 0x627D, 0x189B, 0x627E, 0x04AC, 0x627F, 0x05D5, 0x6280, 0x04A6,
+ 0x6281, 0x1898, 0x6283, 0x188E, 0x6284, 0x04A3, 0x6286, 0x04B6,
+ 0x6287, 0x1893, 0x6288, 0x1899, 0x6289, 0x04A8, 0x628A, 0x04AA,
+ 0x628C, 0x188F, 0x628E, 0x1890, 0x628F, 0x1891, 0x6291, 0x04B5,
+ 0x6292, 0x04AF, 0x6293, 0x04B4, 0x6294, 0x1892, 0x6295, 0x04B3,
+ 0x6296, 0x04A5, 0x6297, 0x04A4, 0x6298, 0x04B1, 0x62A8, 0x05E3,
+ 0x62A9, 0x199E, 0x62AA, 0x1997, 0x62AB, 0x05DE, 0x62AC, 0x05F1,
+ 0x62AD, 0x1993, 0x62AE, 0x199A, 0x62AF, 0x199C, 0x62B0, 0x199F,
+ 0x62B1, 0x05EC, 0x62B3, 0x199B, 0x62B4, 0x1994, 0x62B5, 0x05EA,
+ 0x62B6, 0x1998, 0x62B8, 0x19A0, 0x62B9, 0x05DB, 0x62BB, 0x199D,
+ 0x62BC, 0x05E5, 0x62BD, 0x05E4, 0x62BE, 0x1996, 0x62BF, 0x05D9,
+ 0x62C2, 0x05DA, 0x62C4, 0x05D8, 0x62C6, 0x05F0, 0x62C7, 0x05E8,
+ 0x62C8, 0x05E2, 0x62C9, 0x05D6, 0x62CA, 0x1999, 0x62CB, 0x05E1,
+ 0x62CC, 0x05D7, 0x62CD, 0x05E9, 0x62CE, 0x05F2, 0x62CF, 0x1AEE,
+ 0x62D0, 0x05E6, 0x62D1, 0x1995, 0x62D2, 0x05DC, 0x62D3, 0x05DF,
+ 0x62D4, 0x05E0, 0x62D6, 0x05EE, 0x62D7, 0x05EF, 0x62D8, 0x05ED,
+ 0x62D9, 0x05E7, 0x62DA, 0x05EB, 0x62DB, 0x05DD, 0x62DC, 0x0730,
+ 0x62EB, 0x1AF4, 0x62EC, 0x073C, 0x62ED, 0x0734, 0x62EE, 0x0736,
+ 0x62EF, 0x073B, 0x62F0, 0x1B00, 0x62F1, 0x0739, 0x62F2, 0x1CA2,
+ 0x62F3, 0x08C3, 0x62F4, 0x073E, 0x62F5, 0x1AF1, 0x62F6, 0x1AF9,
+ 0x62F7, 0x073A, 0x62F8, 0x1AF8, 0x62F9, 0x1AF5, 0x62FA, 0x1AFD,
+ 0x62FB, 0x1AFF, 0x62FC, 0x0733, 0x62FD, 0x0737, 0x62FE, 0x073D,
+ 0x62FF, 0x08C5, 0x6300, 0x1AFA, 0x6301, 0x0735, 0x6302, 0x0740,
+ 0x6303, 0x1AF3, 0x6307, 0x0738, 0x6308, 0x08C4, 0x6309, 0x0732,
+ 0x630B, 0x1AF0, 0x630C, 0x1AF7, 0x630D, 0x1AEF, 0x630E, 0x1AF2,
+ 0x630F, 0x1AF6, 0x6310, 0x1CA3, 0x6311, 0x073F, 0x6313, 0x1AFB,
+ 0x6314, 0x1AFC, 0x6315, 0x1AFE, 0x6316, 0x0731, 0x6328, 0x08D3,
+ 0x6329, 0x1CAF, 0x632A, 0x08D1, 0x632B, 0x08D2, 0x632C, 0x1CA5,
+ 0x632D, 0x1CB5, 0x632F, 0x08C8, 0x6332, 0x1EED, 0x6333, 0x1CB7,
+ 0x6334, 0x1CB1, 0x6336, 0x1CA8, 0x6338, 0x1CBA, 0x6339, 0x1CAB,
+ 0x633A, 0x08CE, 0x633B, 0x1F04, 0x633C, 0x1CAE, 0x633D, 0x08D0,
+ 0x633E, 0x08C7, 0x6340, 0x1CBC, 0x6341, 0x1CB0, 0x6342, 0x08CA,
+ 0x6343, 0x1CA9, 0x6344, 0x1CA6, 0x6345, 0x1CA7, 0x6346, 0x08CB,
+ 0x6347, 0x1CB6, 0x6348, 0x1CBD, 0x6349, 0x08CD, 0x634A, 0x1CAD,
+ 0x634B, 0x1CAC, 0x634C, 0x08D5, 0x634D, 0x08D4, 0x634E, 0x08C6,
+ 0x634F, 0x08CC, 0x6350, 0x08CF, 0x6351, 0x1CB9, 0x6354, 0x1CB3,
+ 0x6355, 0x08C9, 0x6356, 0x1CA4, 0x6357, 0x1CBB, 0x6358, 0x1CB2,
+ 0x6359, 0x1CB4, 0x635A, 0x1CB8, 0x6365, 0x1EEE, 0x6367, 0x0AA1,
+ 0x6368, 0x0AB5, 0x6369, 0x0AB4, 0x636B, 0x0AA9, 0x636D, 0x1F00,
+ 0x636E, 0x1EFC, 0x636F, 0x1EF9, 0x6370, 0x1F0B, 0x6371, 0x0AA4,
+ 0x6372, 0x0A9C, 0x6375, 0x1EFE, 0x6376, 0x0C69, 0x6377, 0x0AA0,
+ 0x6378, 0x1F06, 0x637A, 0x0AB6, 0x637B, 0x0AB3, 0x637C, 0x1F02,
+ 0x637D, 0x1EF1, 0x6380, 0x0AB2, 0x6381, 0x1F08, 0x6382, 0x1EF0,
+ 0x6383, 0x0AA7, 0x6384, 0x0AAB, 0x6385, 0x1F07, 0x6387, 0x1EFA,
+ 0x6388, 0x0AAC, 0x6389, 0x0AA6, 0x638A, 0x1EEF, 0x638C, 0x0C5B,
+ 0x638D, 0x1F0A, 0x638E, 0x1EF8, 0x638F, 0x0AB1, 0x6390, 0x1EFB,
+ 0x6391, 0x1F09, 0x6392, 0x0AB0, 0x6394, 0x214C, 0x6396, 0x0A9D,
+ 0x6397, 0x1EF6, 0x6398, 0x0AA2, 0x6399, 0x0AAD, 0x639B, 0x0AA8,
+ 0x639C, 0x1EFF, 0x639D, 0x1EF5, 0x639E, 0x1EF3, 0x639F, 0x1F05,
+ 0x63A0, 0x0A9A, 0x63A1, 0x0AAE, 0x63A2, 0x0A9E, 0x63A3, 0x0C5A,
+ 0x63A4, 0x1F03, 0x63A5, 0x0A9F, 0x63A7, 0x0A9B, 0x63A8, 0x0AAA,
+ 0x63A9, 0x0AA5, 0x63AA, 0x0AA3, 0x63AB, 0x1EF7, 0x63AC, 0x0AAF,
+ 0x63AD, 0x1EF4, 0x63AE, 0x1F01, 0x63AF, 0x1EFD, 0x63B0, 0x214E,
+ 0x63B1, 0x214D, 0x63BD, 0x1EF2, 0x63BE, 0x215E, 0x63C0, 0x0C5D,
+ 0x63C2, 0x2164, 0x63C3, 0x2153, 0x63C4, 0x2161, 0x63C5, 0x23E6,
+ 0x63C6, 0x0C60, 0x63C7, 0x2165, 0x63C8, 0x2168, 0x63C9, 0x0C5F,
+ 0x63CA, 0x2156, 0x63CB, 0x2167, 0x63CC, 0x2166, 0x63CD, 0x0C61,
+ 0x63CE, 0x214F, 0x63CF, 0x0C5C, 0x63D0, 0x0C64, 0x63D2, 0x0C62,
+ 0x63D3, 0x2163, 0x63D5, 0x2159, 0x63D6, 0x0C66, 0x63D7, 0x216A,
+ 0x63D8, 0x2162, 0x63D9, 0x216B, 0x63DA, 0x0C6E, 0x63DB, 0x0C6C,
+ 0x63DC, 0x2160, 0x63DD, 0x215F, 0x63DF, 0x215D, 0x63E0, 0x2157,
+ 0x63E1, 0x0C65, 0x63E3, 0x0C63, 0x63E4, 0x1CAA, 0x63E5, 0x2150,
+ 0x63E7, 0x2404, 0x63E8, 0x2151, 0x63E9, 0x0C5E, 0x63EA, 0x0C6B,
+ 0x63EB, 0x23E8, 0x63ED, 0x0C67, 0x63EE, 0x0C68, 0x63EF, 0x2152,
+ 0x63F0, 0x2169, 0x63F1, 0x23E7, 0x63F2, 0x215A, 0x63F3, 0x2155,
+ 0x63F4, 0x0C6A, 0x63F5, 0x215B, 0x63F6, 0x2158, 0x63F9, 0x0C6F,
+ 0x6406, 0x0E2A, 0x6409, 0x23EB, 0x640A, 0x23FE, 0x640B, 0x2403,
+ 0x640C, 0x23F7, 0x640D, 0x0E26, 0x640E, 0x2408, 0x640F, 0x0E23,
+ 0x6410, 0x23E9, 0x6412, 0x23EA, 0x6413, 0x0E1C, 0x6414, 0x0E25,
+ 0x6415, 0x23F1, 0x6416, 0x0E28, 0x6417, 0x0E29, 0x6418, 0x23F2,
+ 0x641A, 0x23FF, 0x641B, 0x2405, 0x641C, 0x0E24, 0x641E, 0x0E1E,
+ 0x641F, 0x23F0, 0x6420, 0x23EC, 0x6421, 0x2407, 0x6422, 0x23F5,
+ 0x6423, 0x23F6, 0x6424, 0x23ED, 0x6425, 0x2401, 0x6426, 0x23F8,
+ 0x6427, 0x2402, 0x6428, 0x23FA, 0x642A, 0x0E1F, 0x642B, 0x2699,
+ 0x642C, 0x0E22, 0x642D, 0x0E20, 0x642E, 0x2406, 0x642F, 0x23FD,
+ 0x6430, 0x23F9, 0x6433, 0x23EE, 0x6434, 0x0FE4, 0x6435, 0x23FC,
+ 0x6436, 0x0E27, 0x6437, 0x23F4, 0x6439, 0x23F3, 0x643D, 0x0E21,
+ 0x643E, 0x0E1D, 0x643F, 0x26AE, 0x6440, 0x2400, 0x6441, 0x23FB,
+ 0x6443, 0x23EF, 0x644B, 0x26A9, 0x644D, 0x269A, 0x644E, 0x26A5,
+ 0x6450, 0x26AC, 0x6451, 0x0FE2, 0x6452, 0x0C6D, 0x6453, 0x26AA,
+ 0x6454, 0x0FDD, 0x6458, 0x0FDC, 0x6459, 0x26B1, 0x645B, 0x269B,
+ 0x645C, 0x26A8, 0x645D, 0x269C, 0x645E, 0x26A7, 0x645F, 0x0FE0,
+ 0x6460, 0x26AB, 0x6461, 0x215C, 0x6465, 0x26B2, 0x6466, 0x26A3,
+ 0x6467, 0x0FE3, 0x6468, 0x28EE, 0x6469, 0x1159, 0x646B, 0x26B0,
+ 0x646C, 0x26AF, 0x646D, 0x0FE5, 0x646E, 0x28E1, 0x646F, 0x115A,
+ 0x6470, 0x28E2, 0x6472, 0x269F, 0x6473, 0x26A0, 0x6474, 0x269D,
+ 0x6475, 0x26A2, 0x6476, 0x269E, 0x6477, 0x26B3, 0x6478, 0x0FDF,
+ 0x6479, 0x115B, 0x647A, 0x0FE1, 0x647B, 0x0FE6, 0x647D, 0x26A1,
+ 0x647F, 0x26AD, 0x6482, 0x26A6, 0x6485, 0x28E5, 0x6487, 0x0FDB,
+ 0x6488, 0x115E, 0x6489, 0x2B54, 0x648A, 0x28EA, 0x648B, 0x28E9,
+ 0x648C, 0x28EB, 0x648F, 0x28E8, 0x6490, 0x115F, 0x6492, 0x1165,
+ 0x6493, 0x1162, 0x6495, 0x1163, 0x6496, 0x28E3, 0x6497, 0x28E6,
+ 0x6498, 0x28F0, 0x6499, 0x116B, 0x649A, 0x1169, 0x649C, 0x28E7,
+ 0x649D, 0x2154, 0x649E, 0x115C, 0x649F, 0x28ED, 0x64A0, 0x28E4,
+ 0x64A2, 0x116C, 0x64A3, 0x28EC, 0x64A4, 0x0FDE, 0x64A5, 0x1161,
+ 0x64A6, 0x26A4, 0x64A9, 0x1164, 0x64AB, 0x1168, 0x64AC, 0x116A,
+ 0x64AD, 0x1167, 0x64AE, 0x1166, 0x64B0, 0x1160, 0x64B1, 0x28EF,
+ 0x64B2, 0x115D, 0x64B3, 0x116D, 0x64BB, 0x12BB, 0x64BC, 0x12BC,
+ 0x64BD, 0x2B53, 0x64BE, 0x12C5, 0x64BF, 0x12C2, 0x64C1, 0x12B9,
+ 0x64C2, 0x12C0, 0x64C3, 0x2B55, 0x64C4, 0x12BE, 0x64C5, 0x12B8,
+ 0x64C7, 0x12BF, 0x64C9, 0x2B52, 0x64CA, 0x13D8, 0x64CB, 0x12BA,
+ 0x64CD, 0x12C1, 0x64CE, 0x13D7, 0x64CF, 0x2B51, 0x64D0, 0x2B50,
+ 0x64D2, 0x12C3, 0x64D4, 0x12C4, 0x64D6, 0x2B4F, 0x64D7, 0x2B4E,
+ 0x64D8, 0x13D9, 0x64D9, 0x2B58, 0x64DA, 0x12BD, 0x64DB, 0x2B56,
+ 0x64E0, 0x13DA, 0x64E2, 0x13DF, 0x64E3, 0x2D6A, 0x64E4, 0x2D6C,
+ 0x64E6, 0x13DC, 0x64E8, 0x2D6D, 0x64E9, 0x2D69, 0x64EB, 0x2D6B,
+ 0x64EC, 0x13DD, 0x64ED, 0x13E0, 0x64EF, 0x2D68, 0x64F0, 0x13DB,
+ 0x64F1, 0x13DE, 0x64F2, 0x14D3, 0x64F3, 0x2B57, 0x64F4, 0x14D2,
+ 0x64F7, 0x14D8, 0x64F8, 0x2F2B, 0x64FA, 0x14D6, 0x64FB, 0x14D7,
+ 0x64FC, 0x2F2E, 0x64FD, 0x2F2A, 0x64FE, 0x14D4, 0x64FF, 0x2F28,
+ 0x6500, 0x1582, 0x6501, 0x2F2C, 0x6503, 0x2F2D, 0x6504, 0x2F29,
+ 0x6506, 0x14D5, 0x6507, 0x3090, 0x6509, 0x3093, 0x650C, 0x3094,
+ 0x650D, 0x3092, 0x650E, 0x3095, 0x650F, 0x1583, 0x6510, 0x3091,
+ 0x6513, 0x31D7, 0x6514, 0x1617, 0x6515, 0x31D6, 0x6516, 0x31D5,
+ 0x6517, 0x31D4, 0x6518, 0x1616, 0x6519, 0x1618, 0x651B, 0x32D2,
+ 0x651C, 0x1673, 0x651D, 0x1672, 0x6520, 0x3382, 0x6521, 0x3381,
+ 0x6522, 0x3384, 0x6523, 0x16F9, 0x6524, 0x16C5, 0x6525, 0x341B,
+ 0x6526, 0x3383, 0x6529, 0x341A, 0x652A, 0x16FB, 0x652B, 0x16FA,
+ 0x652C, 0x1721, 0x652D, 0x3484, 0x652E, 0x34CA, 0x652F, 0x02D5,
+ 0x6532, 0x216C, 0x6533, 0x2B59, 0x6534, 0x022C, 0x6536, 0x03D7,
+ 0x6537, 0x17F6, 0x6538, 0x04B9, 0x6539, 0x04B7, 0x653B, 0x04B8,
+ 0x653D, 0x19A1, 0x653E, 0x05F3, 0x653F, 0x0741, 0x6541, 0x1B01,
+ 0x6543, 0x1B02, 0x6545, 0x0742, 0x6546, 0x1CBF, 0x6548, 0x08D6,
+ 0x6549, 0x08D7, 0x654A, 0x1CBE, 0x654F, 0x0ABD, 0x6551, 0x0AB9,
+ 0x6553, 0x1F0C, 0x6554, 0x0AC0, 0x6555, 0x0ABF, 0x6556, 0x0AB8,
+ 0x6557, 0x0ABB, 0x6558, 0x0ABE, 0x6559, 0x0ABA, 0x655C, 0x2170,
+ 0x655D, 0x0AB7, 0x655E, 0x0C70, 0x6562, 0x0C72, 0x6563, 0x0C73,
+ 0x6564, 0x216F, 0x6565, 0x2172, 0x6566, 0x0C71, 0x6567, 0x216D,
+ 0x6568, 0x2171, 0x656A, 0x216E, 0x656C, 0x0E2B, 0x656F, 0x2409,
+ 0x6572, 0x0FE7, 0x6573, 0x26B4, 0x6574, 0x12C6, 0x6575, 0x116E,
+ 0x6576, 0x28F1, 0x6577, 0x116F, 0x6578, 0x1170, 0x6579, 0x28F3,
+ 0x657A, 0x28F2, 0x657B, 0x28F4, 0x657C, 0x2B5B, 0x657F, 0x2B5A,
+ 0x6580, 0x2D6F, 0x6581, 0x2D6E, 0x6582, 0x13E1, 0x6583, 0x13E2,
+ 0x6584, 0x3096, 0x6587, 0x02D6, 0x658C, 0x2173, 0x6590, 0x0C75,
+ 0x6591, 0x0C74, 0x6592, 0x240A, 0x6594, 0x2F2F, 0x6595, 0x1674,
+ 0x6596, 0x341C, 0x6597, 0x02D7, 0x6599, 0x08D8, 0x659B, 0x0AC2,
+ 0x659C, 0x0AC1, 0x659D, 0x2174, 0x659E, 0x2175, 0x659F, 0x0E2C,
+ 0x65A0, 0x26B5, 0x65A1, 0x0FE8, 0x65A2, 0x2B5C, 0x65A4, 0x02D8,
+ 0x65A5, 0x0346, 0x65A7, 0x05F4, 0x65A8, 0x19A2, 0x65AA, 0x1B03,
+ 0x65AB, 0x0743, 0x65AC, 0x0AC3, 0x65AE, 0x2176, 0x65AF, 0x0C76,
+ 0x65B0, 0x0E2D, 0x65B2, 0x28F5, 0x65B3, 0x28F6, 0x65B6, 0x2D70,
+ 0x65B7, 0x14D9, 0x65B8, 0x34CB, 0x65B9, 0x02D9, 0x65BB, 0x19A3,
+ 0x65BC, 0x05F5, 0x65BD, 0x0744, 0x65BF, 0x1B04, 0x65C1, 0x08D9,
+ 0x65C2, 0x1CC3, 0x65C3, 0x1CC1, 0x65C4, 0x1CC2, 0x65C5, 0x08DA,
+ 0x65C6, 0x1CC0, 0x65CB, 0x0AC5, 0x65CC, 0x0AC6, 0x65CD, 0x1F0D,
+ 0x65CE, 0x0AC7, 0x65CF, 0x0AC4, 0x65D0, 0x2177, 0x65D2, 0x2178,
+ 0x65D3, 0x240B, 0x65D6, 0x0FEA, 0x65D7, 0x0FE9, 0x65DA, 0x2D71,
+ 0x65DB, 0x2F30, 0x65DD, 0x3098, 0x65DE, 0x3097, 0x65DF, 0x31D8,
+ 0x65E0, 0x022D, 0x65E1, 0x1789, 0x65E2, 0x0745, 0x65E5, 0x02DA,
+ 0x65E6, 0x0347, 0x65E8, 0x03D9, 0x65E9, 0x03D8, 0x65EC, 0x03DA,
+ 0x65ED, 0x03DB, 0x65EE, 0x17F8, 0x65EF, 0x17F7, 0x65F0, 0x189E,
+ 0x65F1, 0x04BA, 0x65F2, 0x18A1, 0x65F3, 0x18A0, 0x65F4, 0x189F,
+ 0x65F5, 0x18A2, 0x65FA, 0x05F6, 0x65FB, 0x19A9, 0x65FC, 0x19A5,
+ 0x65FD, 0x19AE, 0x6600, 0x05FD, 0x6602, 0x05FB, 0x6603, 0x19AA,
+ 0x6604, 0x19A6, 0x6605, 0x19AD, 0x6606, 0x05FA, 0x6607, 0x0601,
+ 0x6608, 0x19A8, 0x6609, 0x19A4, 0x660A, 0x0600, 0x660B, 0x19AB,
+ 0x660C, 0x05F9, 0x660D, 0x19AC, 0x660E, 0x05FC, 0x660F, 0x05FE,
+ 0x6610, 0x19B0, 0x6611, 0x19AF, 0x6612, 0x19A7, 0x6613, 0x05F8,
+ 0x6614, 0x05F7, 0x6615, 0x05FF, 0x661C, 0x1B09, 0x661D, 0x1B0F,
+ 0x661F, 0x074B, 0x6620, 0x0748, 0x6621, 0x1B06, 0x6622, 0x1B0B,
+ 0x6624, 0x074E, 0x6625, 0x0746, 0x6626, 0x1B0A, 0x6627, 0x0749,
+ 0x6628, 0x074C, 0x662B, 0x1B0D, 0x662D, 0x0747, 0x662E, 0x1B12,
+ 0x662F, 0x074A, 0x6631, 0x074D, 0x6632, 0x1B07, 0x6633, 0x1B0C,
+ 0x6634, 0x1B10, 0x6635, 0x1B08, 0x6636, 0x1B05, 0x6639, 0x1B11,
+ 0x663A, 0x1B0E, 0x6641, 0x08E2, 0x6642, 0x08DB, 0x6643, 0x08DE,
+ 0x6645, 0x08E1, 0x6647, 0x1CC6, 0x6649, 0x08DC, 0x664A, 0x1CC4,
+ 0x664C, 0x08E0, 0x664F, 0x08DD, 0x6651, 0x1CC7, 0x6652, 0x08DF,
+ 0x6659, 0x1F11, 0x665A, 0x0AC9, 0x665B, 0x1F10, 0x665C, 0x1F12,
+ 0x665D, 0x0AC8, 0x665E, 0x0ACD, 0x665F, 0x1CC5, 0x6661, 0x1F0F,
+ 0x6662, 0x1F13, 0x6664, 0x0ACA, 0x6665, 0x1F0E, 0x6666, 0x0ACC,
+ 0x6668, 0x0ACB, 0x666A, 0x217F, 0x666C, 0x217A, 0x666E, 0x0C77,
+ 0x666F, 0x0C7B, 0x6670, 0x0C78, 0x6671, 0x217D, 0x6672, 0x2180,
+ 0x6674, 0x0C79, 0x6676, 0x0C7A, 0x6677, 0x0C7F, 0x6678, 0x2414,
+ 0x6679, 0x217E, 0x667A, 0x0C7D, 0x667B, 0x217B, 0x667C, 0x2179,
+ 0x667E, 0x0C7E, 0x6680, 0x217C, 0x6684, 0x0E33, 0x6686, 0x240C,
+ 0x6687, 0x0E30, 0x6688, 0x0E31, 0x6689, 0x0E2F, 0x668A, 0x2411,
+ 0x668B, 0x2410, 0x668C, 0x240D, 0x668D, 0x0E35, 0x6690, 0x240F,
+ 0x6691, 0x0C7C, 0x6694, 0x2413, 0x6695, 0x240E, 0x6696, 0x0E32,
+ 0x6697, 0x0E2E, 0x6698, 0x0E34, 0x6699, 0x2412, 0x669D, 0x0FED,
+ 0x669F, 0x26B8, 0x66A0, 0x26B7, 0x66A1, 0x26B6, 0x66A2, 0x0FEB,
+ 0x66A8, 0x0FEC, 0x66A9, 0x28F9, 0x66AA, 0x28FC, 0x66AB, 0x1172,
+ 0x66AE, 0x1171, 0x66AF, 0x28FD, 0x66B0, 0x28F8, 0x66B1, 0x1174,
+ 0x66B2, 0x28FA, 0x66B4, 0x1173, 0x66B5, 0x28F7, 0x66B7, 0x28FB,
+ 0x66B8, 0x12CC, 0x66B9, 0x12C9, 0x66BA, 0x2B65, 0x66BB, 0x2B64,
+ 0x66BD, 0x2B63, 0x66BE, 0x2B5E, 0x66C0, 0x2B5F, 0x66C4, 0x12CA,
+ 0x66C6, 0x12C7, 0x66C7, 0x12CB, 0x66C8, 0x2B5D, 0x66C9, 0x12C8,
+ 0x66CA, 0x2B60, 0x66CB, 0x2B61, 0x66CC, 0x2B66, 0x66CF, 0x2B62,
+ 0x66D2, 0x2D72, 0x66D6, 0x13E4, 0x66D8, 0x2F33, 0x66D9, 0x13E3,
+ 0x66DA, 0x2F31, 0x66DB, 0x2F32, 0x66DC, 0x14DA, 0x66DD, 0x1585,
+ 0x66DE, 0x3099, 0x66E0, 0x1584, 0x66E3, 0x31DA, 0x66E4, 0x31DB,
+ 0x66E6, 0x1619, 0x66E8, 0x31D9, 0x66E9, 0x1675, 0x66EB, 0x341D,
+ 0x66EC, 0x16FC, 0x66ED, 0x3485, 0x66EE, 0x3486, 0x66F0, 0x02DB,
+ 0x66F2, 0x03DC, 0x66F3, 0x03DD, 0x66F4, 0x04BB, 0x66F6, 0x19B1,
+ 0x66F7, 0x074F, 0x66F8, 0x08E3, 0x66F9, 0x0ACE, 0x66FC, 0x0A1F,
+ 0x66FE, 0x0C80, 0x66FF, 0x0C81, 0x6700, 0x0BF0, 0x6701, 0x2181,
+ 0x6703, 0x0E36, 0x6704, 0x26BA, 0x6705, 0x26B9, 0x6708, 0x02DC,
+ 0x6709, 0x03DE, 0x670A, 0x19B2, 0x670B, 0x0603, 0x670D, 0x0602,
+ 0x670F, 0x1B13, 0x6710, 0x1B14, 0x6712, 0x1CC8, 0x6713, 0x1CC9,
+ 0x6714, 0x08E4, 0x6715, 0x08E5, 0x6717, 0x08E6, 0x6718, 0x1F14,
+ 0x671B, 0x0AD0, 0x671D, 0x0C83, 0x671F, 0x0C82, 0x6720, 0x2415,
+ 0x6721, 0x2522, 0x6722, 0x26BB, 0x6723, 0x2B67, 0x6726, 0x14DB,
+ 0x6727, 0x161A, 0x6728, 0x02DD, 0x672A, 0x034A, 0x672B, 0x034B,
+ 0x672C, 0x0349, 0x672D, 0x034C, 0x672E, 0x0348, 0x6731, 0x03E1,
+ 0x6733, 0x1800, 0x6734, 0x03E0, 0x6735, 0x03E2, 0x6738, 0x17FB,
+ 0x6739, 0x17FA, 0x673A, 0x17FD, 0x673B, 0x17FC, 0x673C, 0x17FF,
+ 0x673D, 0x03DF, 0x673E, 0x17F9, 0x673F, 0x17FE, 0x6745, 0x18A3,
+ 0x6746, 0x04C5, 0x6747, 0x18A4, 0x6748, 0x18A8, 0x6749, 0x04C4,
+ 0x674B, 0x18AC, 0x674C, 0x18A7, 0x674D, 0x18AA, 0x674E, 0x04BD,
+ 0x674F, 0x04BE, 0x6750, 0x04BF, 0x6751, 0x04C0, 0x6753, 0x04C7,
+ 0x6755, 0x18A6, 0x6756, 0x04C2, 0x6757, 0x04C8, 0x6759, 0x18A5,
+ 0x675A, 0x18AB, 0x675C, 0x04C1, 0x675D, 0x18A9, 0x675E, 0x04C3,
+ 0x675F, 0x04BC, 0x6760, 0x04C6, 0x676A, 0x0618, 0x676C, 0x19B4,
+ 0x676D, 0x0604, 0x676F, 0x060E, 0x6770, 0x060F, 0x6771, 0x0607,
+ 0x6772, 0x0619, 0x6773, 0x0609, 0x6774, 0x19BC, 0x6775, 0x0614,
+ 0x6776, 0x19B7, 0x6777, 0x060A, 0x6778, 0x19C6, 0x6779, 0x19C7,
+ 0x677A, 0x19BF, 0x677B, 0x19B8, 0x677C, 0x0617, 0x677D, 0x19C4,
+ 0x677E, 0x0612, 0x677F, 0x0610, 0x6781, 0x19C5, 0x6783, 0x19C3,
+ 0x6784, 0x19BB, 0x6785, 0x19B3, 0x6786, 0x19BA, 0x6787, 0x060B,
+ 0x6789, 0x0611, 0x678B, 0x0605, 0x678C, 0x19BE, 0x678D, 0x19BD,
+ 0x678E, 0x19B5, 0x6790, 0x0613, 0x6791, 0x19C1, 0x6792, 0x19B6,
+ 0x6793, 0x0616, 0x6794, 0x19C8, 0x6795, 0x0606, 0x6797, 0x060D,
+ 0x6798, 0x19B9, 0x6799, 0x19C2, 0x679A, 0x0615, 0x679C, 0x0608,
+ 0x679D, 0x060C, 0x679F, 0x19C0, 0x67AE, 0x1B34, 0x67AF, 0x0757,
+ 0x67B0, 0x0764, 0x67B2, 0x1B2F, 0x67B3, 0x1B25, 0x67B4, 0x075D,
+ 0x67B5, 0x1B23, 0x67B6, 0x0756, 0x67B7, 0x1B1E, 0x67B8, 0x0760,
+ 0x67B9, 0x1B2B, 0x67BA, 0x1B18, 0x67BB, 0x1B1A, 0x67C0, 0x1B1D,
+ 0x67C1, 0x1B15, 0x67C2, 0x1B2A, 0x67C3, 0x1B3A, 0x67C4, 0x075B,
+ 0x67C5, 0x1B1F, 0x67C6, 0x1B31, 0x67C8, 0x1B17, 0x67C9, 0x1B38,
+ 0x67CA, 0x1B39, 0x67CB, 0x1B3C, 0x67CC, 0x1B33, 0x67CD, 0x1B24,
+ 0x67CE, 0x1B2C, 0x67CF, 0x0761, 0x67D0, 0x0754, 0x67D1, 0x075C,
+ 0x67D2, 0x0768, 0x67D3, 0x0751, 0x67D4, 0x0753, 0x67D8, 0x1B1C,
+ 0x67D9, 0x0765, 0x67DA, 0x075E, 0x67DB, 0x1B36, 0x67DC, 0x1B19,
+ 0x67DD, 0x0767, 0x67DE, 0x0762, 0x67DF, 0x1B22, 0x67E2, 0x0766,
+ 0x67E3, 0x1B29, 0x67E4, 0x1B21, 0x67E5, 0x075F, 0x67E6, 0x1B35,
+ 0x67E7, 0x1B2D, 0x67E9, 0x0759, 0x67EA, 0x1B3B, 0x67EB, 0x1B20,
+ 0x67EC, 0x0755, 0x67ED, 0x1B32, 0x67EE, 0x1B28, 0x67EF, 0x075A,
+ 0x67F0, 0x1B2E, 0x67F1, 0x0752, 0x67F2, 0x1B16, 0x67F3, 0x0763,
+ 0x67F4, 0x08F5, 0x67F5, 0x0758, 0x67F6, 0x1B27, 0x67F7, 0x1B26,
+ 0x67F8, 0x1B1B, 0x67FA, 0x1B37, 0x67FC, 0x1B30, 0x67FF, 0x0750,
+ 0x6812, 0x1CDD, 0x6813, 0x08FC, 0x6814, 0x1CDE, 0x6816, 0x1CD2,
+ 0x6817, 0x08F1, 0x6818, 0x08FD, 0x681A, 0x1CCB, 0x681C, 0x1CD4,
+ 0x681D, 0x1CDC, 0x681F, 0x1CCA, 0x6820, 0x1CE5, 0x6821, 0x08E7,
+ 0x6825, 0x1CE4, 0x6826, 0x1CDF, 0x6828, 0x1CE0, 0x6829, 0x08EF,
+ 0x682A, 0x08FA, 0x682B, 0x1CD6, 0x682D, 0x1CD7, 0x682E, 0x1CE1,
+ 0x682F, 0x1CD8, 0x6831, 0x1CD3, 0x6832, 0x1CCD, 0x6833, 0x1CCE,
+ 0x6834, 0x1CDB, 0x6835, 0x1CD5, 0x6838, 0x08E8, 0x6839, 0x08EC,
+ 0x683A, 0x1CE3, 0x683B, 0x1CCF, 0x683C, 0x08F8, 0x683D, 0x08F4,
+ 0x6840, 0x08F7, 0x6841, 0x08FE, 0x6842, 0x08ED, 0x6843, 0x08F9,
+ 0x6844, 0x1CDA, 0x6845, 0x08FB, 0x6846, 0x08EA, 0x6848, 0x08E9,
+ 0x6849, 0x1CCC, 0x684B, 0x1CD0, 0x684C, 0x08F2, 0x684D, 0x1CE2,
+ 0x684E, 0x1CD9, 0x684F, 0x1CD1, 0x6850, 0x08F6, 0x6851, 0x08F3,
+ 0x6853, 0x08EB, 0x6854, 0x08EE, 0x686B, 0x1F29, 0x686D, 0x1F19,
+ 0x686E, 0x1F1A, 0x686F, 0x1F1E, 0x6871, 0x1F2D, 0x6872, 0x1F2A,
+ 0x6874, 0x1F23, 0x6875, 0x1F22, 0x6876, 0x0AD7, 0x6877, 0x1F26,
+ 0x6878, 0x1F35, 0x6879, 0x1F15, 0x687B, 0x1F36, 0x687C, 0x1F28,
+ 0x687D, 0x1F3A, 0x687E, 0x1F2E, 0x687F, 0x0AD6, 0x6880, 0x1F2C,
+ 0x6881, 0x0AD1, 0x6882, 0x0AE6, 0x6883, 0x0ADC, 0x6885, 0x0AE0,
+ 0x6886, 0x0ADF, 0x6887, 0x1F16, 0x6889, 0x1F33, 0x688A, 0x1F39,
+ 0x688B, 0x1F31, 0x688C, 0x1F38, 0x688F, 0x1F25, 0x6890, 0x1F17,
+ 0x6891, 0x1F37, 0x6892, 0x1F27, 0x6893, 0x0AD4, 0x6894, 0x0AE1,
+ 0x6896, 0x1F30, 0x6897, 0x0ADA, 0x689B, 0x1F2F, 0x689C, 0x1F18,
+ 0x689D, 0x0AE2, 0x689F, 0x0AE4, 0x68A0, 0x1F32, 0x68A1, 0x0AE5,
+ 0x68A2, 0x0AD3, 0x68A3, 0x1F1F, 0x68A4, 0x1F34, 0x68A7, 0x0AD9,
+ 0x68A8, 0x0AE3, 0x68A9, 0x1F21, 0x68AA, 0x1F2B, 0x68AB, 0x1F1C,
+ 0x68AC, 0x1F20, 0x68AD, 0x0ADE, 0x68AE, 0x1F1B, 0x68AF, 0x0AD2,
+ 0x68B0, 0x0ADB, 0x68B1, 0x0AD8, 0x68B2, 0x1F24, 0x68B3, 0x08F0,
+ 0x68B4, 0x2198, 0x68B5, 0x0AD5, 0x68C4, 0x0ADD, 0x68C6, 0x219B,
+ 0x68C7, 0x21B1, 0x68C8, 0x21A6, 0x68C9, 0x0C97, 0x68CB, 0x0C92,
+ 0x68CC, 0x2195, 0x68CD, 0x0C93, 0x68CE, 0x21A5, 0x68D0, 0x219E,
+ 0x68D1, 0x21AB, 0x68D2, 0x0C8F, 0x68D3, 0x2183, 0x68D4, 0x21AD,
+ 0x68D5, 0x0C85, 0x68D6, 0x218B, 0x68D7, 0x0C88, 0x68D8, 0x0C87,
+ 0x68DA, 0x0C98, 0x68DC, 0x2185, 0x68DD, 0x21A7, 0x68DE, 0x21A8,
+ 0x68DF, 0x0C8A, 0x68E0, 0x0C86, 0x68E1, 0x2193, 0x68E3, 0x0C91,
+ 0x68E4, 0x218E, 0x68E6, 0x21A9, 0x68E7, 0x0C8D, 0x68E8, 0x21A1,
+ 0x68E9, 0x21AE, 0x68EA, 0x2188, 0x68EB, 0x218D, 0x68EC, 0x2187,
+ 0x68EE, 0x0C8C, 0x68EF, 0x219A, 0x68F0, 0x242B, 0x68F1, 0x2189,
+ 0x68F2, 0x0C90, 0x68F3, 0x2192, 0x68F4, 0x21AA, 0x68F5, 0x0C8B,
+ 0x68F6, 0x218F, 0x68F7, 0x218C, 0x68F8, 0x219D, 0x68F9, 0x0C8E,
+ 0x68FA, 0x0C84, 0x68FB, 0x0C9A, 0x68FC, 0x21A0, 0x68FD, 0x219F,
+ 0x6904, 0x2184, 0x6905, 0x0C89, 0x6906, 0x21AC, 0x6907, 0x2194,
+ 0x6908, 0x2196, 0x690A, 0x21A3, 0x690B, 0x21A2, 0x690C, 0x2182,
+ 0x690D, 0x0C94, 0x690E, 0x0C96, 0x690F, 0x218A, 0x6910, 0x2191,
+ 0x6911, 0x2199, 0x6912, 0x0C95, 0x6913, 0x2190, 0x6914, 0x219C,
+ 0x6915, 0x21AF, 0x6917, 0x21A4, 0x6925, 0x21B0, 0x692A, 0x2186,
+ 0x692F, 0x243F, 0x6930, 0x0E3E, 0x6932, 0x243D, 0x6933, 0x2428,
+ 0x6934, 0x242D, 0x6935, 0x2426, 0x6937, 0x2439, 0x6938, 0x2418,
+ 0x6939, 0x241F, 0x693B, 0x2437, 0x693C, 0x2441, 0x693D, 0x2429,
+ 0x693F, 0x241C, 0x6940, 0x242F, 0x6941, 0x2434, 0x6942, 0x2420,
+ 0x6944, 0x2431, 0x6945, 0x241D, 0x6948, 0x2424, 0x6949, 0x2425,
+ 0x694A, 0x0E40, 0x694B, 0x2438, 0x694C, 0x2436, 0x694E, 0x2419,
+ 0x694F, 0x243B, 0x6951, 0x243C, 0x6952, 0x243E, 0x6953, 0x0E44,
+ 0x6954, 0x0E3C, 0x6956, 0x1F1D, 0x6957, 0x2421, 0x6958, 0x2433,
+ 0x6959, 0x2422, 0x695A, 0x0E39, 0x695B, 0x0E49, 0x695C, 0x243A,
+ 0x695D, 0x0E47, 0x695E, 0x0E43, 0x695F, 0x2417, 0x6960, 0x0E3B,
+ 0x6962, 0x241A, 0x6963, 0x0E48, 0x6965, 0x242A, 0x6966, 0x2416,
+ 0x6968, 0x0E41, 0x6969, 0x242E, 0x696A, 0x241E, 0x696B, 0x0E42,
+ 0x696C, 0x2427, 0x696D, 0x0E38, 0x696E, 0x0C99, 0x696F, 0x2430,
+ 0x6970, 0x2197, 0x6971, 0x241B, 0x6974, 0x2435, 0x6975, 0x0E3D,
+ 0x6976, 0x2432, 0x6977, 0x0E3A, 0x6978, 0x242C, 0x6979, 0x0E45,
+ 0x697A, 0x2423, 0x697B, 0x2440, 0x6982, 0x0E3F, 0x6983, 0x24AF,
+ 0x6986, 0x0E46, 0x698D, 0x26C9, 0x698E, 0x26C7, 0x6990, 0x26DD,
+ 0x6991, 0x26C5, 0x6993, 0x26D7, 0x6994, 0x0E37, 0x6995, 0x0FF0,
+ 0x6996, 0x26C1, 0x6997, 0x26DC, 0x6999, 0x26C6, 0x699A, 0x26D4,
+ 0x699B, 0x0FF5, 0x699C, 0x0FEE, 0x699E, 0x26DA, 0x69A0, 0x26BF,
+ 0x69A1, 0x26D9, 0x69A3, 0x1000, 0x69A4, 0x26D0, 0x69A5, 0x26E0,
+ 0x69A6, 0x0FFE, 0x69A7, 0x26C8, 0x69A8, 0x0FEF, 0x69A9, 0x26CA,
+ 0x69AA, 0x26D8, 0x69AB, 0x0FF8, 0x69AC, 0x26C3, 0x69AD, 0x0FFC,
+ 0x69AE, 0x0FF2, 0x69AF, 0x26CC, 0x69B0, 0x26C2, 0x69B1, 0x26BC,
+ 0x69B3, 0x26D6, 0x69B4, 0x0FF9, 0x69B5, 0x26DF, 0x69B6, 0x26BD,
+ 0x69B7, 0x0FF6, 0x69B9, 0x26D2, 0x69BB, 0x0FF7, 0x69BC, 0x26C4,
+ 0x69BD, 0x26CF, 0x69BE, 0x26CB, 0x69BF, 0x26CD, 0x69C1, 0x0FF1,
+ 0x69C2, 0x26DE, 0x69C3, 0x0FFF, 0x69C4, 0x26CE, 0x69C6, 0x26E1,
+ 0x69C9, 0x26BE, 0x69CA, 0x26D3, 0x69CB, 0x0FF4, 0x69CC, 0x0FFD,
+ 0x69CD, 0x0FFB, 0x69CE, 0x26C0, 0x69CF, 0x26D5, 0x69D0, 0x0FFA,
+ 0x69D3, 0x0FF3, 0x69D4, 0x26D1, 0x69D9, 0x26DB, 0x69E2, 0x2909,
+ 0x69E4, 0x2905, 0x69E5, 0x2901, 0x69E6, 0x2915, 0x69E7, 0x2912,
+ 0x69E8, 0x1177, 0x69EB, 0x2919, 0x69EC, 0x2908, 0x69ED, 0x1182,
+ 0x69EE, 0x290F, 0x69F1, 0x2904, 0x69F2, 0x290E, 0x69F3, 0x117F,
+ 0x69F4, 0x2922, 0x69F6, 0x291F, 0x69F7, 0x2911, 0x69F8, 0x2902,
+ 0x69FB, 0x2916, 0x69FC, 0x2918, 0x69FD, 0x117B, 0x69FE, 0x290C,
+ 0x69FF, 0x2907, 0x6A00, 0x28FE, 0x6A01, 0x1178, 0x6A02, 0x1180,
+ 0x6A04, 0x291B, 0x6A05, 0x1181, 0x6A06, 0x28FF, 0x6A07, 0x2921,
+ 0x6A08, 0x2914, 0x6A09, 0x291A, 0x6A0A, 0x117E, 0x6A0D, 0x2917,
+ 0x6A0F, 0x291E, 0x6A11, 0x1183, 0x6A13, 0x117D, 0x6A14, 0x2910,
+ 0x6A15, 0x2903, 0x6A16, 0x2923, 0x6A17, 0x2900, 0x6A18, 0x291C,
+ 0x6A19, 0x117A, 0x6A1B, 0x290A, 0x6A1D, 0x290B, 0x6A1E, 0x1179,
+ 0x6A1F, 0x1176, 0x6A20, 0x2906, 0x6A21, 0x117C, 0x6A23, 0x1175,
+ 0x6A25, 0x291D, 0x6A26, 0x2920, 0x6A27, 0x290D, 0x6A28, 0x2B74,
+ 0x6A32, 0x2B6C, 0x6A34, 0x2B68, 0x6A35, 0x12D9, 0x6A38, 0x12CE,
+ 0x6A39, 0x12D3, 0x6A3A, 0x12CF, 0x6A3B, 0x2B76, 0x6A3C, 0x2B81,
+ 0x6A3D, 0x12CD, 0x6A3E, 0x2B6E, 0x6A3F, 0x2B77, 0x6A40, 0x2913,
+ 0x6A41, 0x2B78, 0x6A44, 0x12D4, 0x6A46, 0x2B87, 0x6A47, 0x12D8,
+ 0x6A48, 0x12DB, 0x6A49, 0x2B6A, 0x6A4B, 0x12D7, 0x6A4D, 0x2B85,
+ 0x6A4E, 0x2B86, 0x6A4F, 0x2B7C, 0x6A50, 0x2B7B, 0x6A51, 0x2B73,
+ 0x6A54, 0x2B7D, 0x6A55, 0x2B84, 0x6A56, 0x2B83, 0x6A58, 0x12D2,
+ 0x6A59, 0x12D0, 0x6A5A, 0x2B75, 0x6A5B, 0x2B72, 0x6A5D, 0x2B6F,
+ 0x6A5E, 0x2B82, 0x6A5F, 0x12DA, 0x6A60, 0x2B80, 0x6A61, 0x12D6,
+ 0x6A62, 0x12D5, 0x6A64, 0x2B7A, 0x6A66, 0x2B69, 0x6A67, 0x2B6B,
+ 0x6A68, 0x2B6D, 0x6A69, 0x2B7F, 0x6A6A, 0x2B79, 0x6A6B, 0x12D1,
+ 0x6A6D, 0x2B70, 0x6A6F, 0x2B7E, 0x6A76, 0x2B71, 0x6A7E, 0x13EC,
+ 0x6A7F, 0x2D84, 0x6A80, 0x13E5, 0x6A81, 0x2D75, 0x6A83, 0x2D80,
+ 0x6A84, 0x13E7, 0x6A85, 0x2D87, 0x6A87, 0x2D7C, 0x6A89, 0x2D77,
+ 0x6A8C, 0x2D88, 0x6A8D, 0x2D73, 0x6A8E, 0x2D7E, 0x6A90, 0x13EE,
+ 0x6A91, 0x2D83, 0x6A92, 0x2D89, 0x6A93, 0x2D7D, 0x6A94, 0x13E6,
+ 0x6A95, 0x2D7F, 0x6A96, 0x2D74, 0x6A97, 0x13ED, 0x6A9A, 0x2D86,
+ 0x6A9B, 0x2D79, 0x6A9C, 0x13E9, 0x6A9E, 0x2D7B, 0x6A9F, 0x2D78,
+ 0x6AA0, 0x13EF, 0x6AA1, 0x2D7A, 0x6AA2, 0x13E8, 0x6AA3, 0x13EB,
+ 0x6AA4, 0x2D82, 0x6AA5, 0x2D76, 0x6AA6, 0x2D85, 0x6AA8, 0x2D81,
+ 0x6AAC, 0x14DD, 0x6AAD, 0x2F3E, 0x6AAE, 0x14E2, 0x6AAF, 0x14E3,
+ 0x6AB3, 0x14DC, 0x6AB4, 0x2F3D, 0x6AB6, 0x2F3A, 0x6AB7, 0x2F3B,
+ 0x6AB8, 0x14E0, 0x6AB9, 0x2F35, 0x6ABA, 0x2F39, 0x6ABB, 0x14DF,
+ 0x6ABD, 0x2F36, 0x6AC2, 0x14E1, 0x6AC3, 0x14DE, 0x6AC5, 0x2F34,
+ 0x6AC6, 0x2F38, 0x6AC7, 0x2F3C, 0x6ACB, 0x309F, 0x6ACC, 0x309C,
+ 0x6ACD, 0x30A5, 0x6ACF, 0x30A4, 0x6AD0, 0x30A2, 0x6AD1, 0x309D,
+ 0x6AD3, 0x1589, 0x6AD9, 0x309E, 0x6ADA, 0x1588, 0x6ADB, 0x13EA,
+ 0x6ADC, 0x30A1, 0x6ADD, 0x1587, 0x6ADE, 0x30A6, 0x6ADF, 0x30A0,
+ 0x6AE0, 0x309B, 0x6AE1, 0x2F37, 0x6AE5, 0x1586, 0x6AE7, 0x309A,
+ 0x6AE8, 0x31DF, 0x6AEA, 0x31DE, 0x6AEB, 0x30A3, 0x6AEC, 0x161B,
+ 0x6AEE, 0x31E2, 0x6AEF, 0x31E3, 0x6AF0, 0x31DD, 0x6AF1, 0x31E1,
+ 0x6AF3, 0x31DC, 0x6AF8, 0x32D6, 0x6AF9, 0x31E0, 0x6AFA, 0x1678,
+ 0x6AFB, 0x1676, 0x6AFC, 0x32D4, 0x6B00, 0x32D7, 0x6B02, 0x32D3,
+ 0x6B03, 0x32D5, 0x6B04, 0x1677, 0x6B08, 0x3386, 0x6B09, 0x3387,
+ 0x6B0A, 0x16C6, 0x6B0B, 0x3385, 0x6B0F, 0x3420, 0x6B10, 0x16FD,
+ 0x6B11, 0x341E, 0x6B12, 0x341F, 0x6B13, 0x3487, 0x6B16, 0x1743,
+ 0x6B17, 0x34CE, 0x6B18, 0x34CC, 0x6B19, 0x34CD, 0x6B1A, 0x34CF,
+ 0x6B1E, 0x3534, 0x6B20, 0x02DE, 0x6B21, 0x03E3, 0x6B23, 0x061A,
+ 0x6B25, 0x19C9, 0x6B28, 0x1B3D, 0x6B2C, 0x1CE6, 0x6B2D, 0x1CE8,
+ 0x6B2F, 0x1CE7, 0x6B31, 0x1CE9, 0x6B32, 0x0AE7, 0x6B33, 0x1F3C,
+ 0x6B34, 0x1CEA, 0x6B36, 0x1F3B, 0x6B37, 0x1F3D, 0x6B38, 0x1F3E,
+ 0x6B39, 0x21B2, 0x6B3A, 0x0C9C, 0x6B3B, 0x21B3, 0x6B3C, 0x21B5,
+ 0x6B3D, 0x0C9D, 0x6B3E, 0x0C9B, 0x6B3F, 0x21B4, 0x6B41, 0x2447,
+ 0x6B42, 0x2445, 0x6B43, 0x2444, 0x6B45, 0x2443, 0x6B46, 0x2442,
+ 0x6B47, 0x0E4A, 0x6B48, 0x2446, 0x6B49, 0x1001, 0x6B4A, 0x26E2,
+ 0x6B4B, 0x26E4, 0x6B4C, 0x1002, 0x6B4D, 0x26E3, 0x6B4E, 0x1185,
+ 0x6B50, 0x1184, 0x6B51, 0x2924, 0x6B54, 0x2B89, 0x6B55, 0x2B88,
+ 0x6B56, 0x2B8A, 0x6B59, 0x12DC, 0x6B5B, 0x2D8A, 0x6B5C, 0x13F0,
+ 0x6B5E, 0x2F3F, 0x6B5F, 0x14E4, 0x6B60, 0x30A7, 0x6B61, 0x16C7,
+ 0x6B62, 0x02DF, 0x6B63, 0x034D, 0x6B64, 0x03E4, 0x6B65, 0x04C9,
+ 0x6B66, 0x061B, 0x6B67, 0x061C, 0x6B6A, 0x0769, 0x6B6D, 0x1CEB,
+ 0x6B72, 0x0E4B, 0x6B76, 0x29A2, 0x6B77, 0x12DD, 0x6B78, 0x14E5,
+ 0x6B79, 0x02E0, 0x6B7B, 0x03E5, 0x6B7E, 0x19CB, 0x6B7F, 0x061D,
+ 0x6B80, 0x19CA, 0x6B82, 0x1B3E, 0x6B83, 0x076A, 0x6B84, 0x1B3F,
+ 0x6B86, 0x076B, 0x6B88, 0x1CED, 0x6B89, 0x0900, 0x6B8A, 0x08FF,
+ 0x6B8C, 0x1F43, 0x6B8D, 0x1F41, 0x6B8E, 0x1F42, 0x6B8F, 0x1F40,
+ 0x6B91, 0x1F3F, 0x6B94, 0x21B6, 0x6B95, 0x21B9, 0x6B96, 0x0C9F,
+ 0x6B97, 0x21B7, 0x6B98, 0x0C9E, 0x6B99, 0x21B8, 0x6B9B, 0x2448,
+ 0x6B9E, 0x26E5, 0x6B9F, 0x26E6, 0x6BA0, 0x26E7, 0x6BA2, 0x2927,
+ 0x6BA3, 0x2926, 0x6BA4, 0x1186, 0x6BA5, 0x2925, 0x6BA6, 0x2928,
+ 0x6BA7, 0x2B8B, 0x6BAA, 0x2B8C, 0x6BAB, 0x2B8D, 0x6BAD, 0x2D8B,
+ 0x6BAE, 0x13F1, 0x6BAF, 0x14E6, 0x6BB0, 0x30A8, 0x6BB2, 0x1679,
+ 0x6BB3, 0x178A, 0x6BB5, 0x076C, 0x6BB6, 0x1B40, 0x6BB7, 0x0901,
+ 0x6BBA, 0x0AE8, 0x6BBC, 0x0CA0, 0x6BBD, 0x21BA, 0x6BBF, 0x0E4D,
+ 0x6BC0, 0x0E4C, 0x6BC3, 0x26E8, 0x6BC4, 0x26E9, 0x6BC5, 0x1187,
+ 0x6BC6, 0x1188, 0x6BC7, 0x2B8F, 0x6BC8, 0x2B8E, 0x6BC9, 0x2F40,
+ 0x6BCA, 0x3421, 0x6BCB, 0x02E1, 0x6BCC, 0x178B, 0x6BCD, 0x034E,
+ 0x6BCF, 0x04CA, 0x6BD0, 0x18AD, 0x6BD2, 0x076D, 0x6BD3, 0x0E4E,
+ 0x6BD4, 0x02E2, 0x6BD6, 0x1B41, 0x6BD7, 0x076E, 0x6BD8, 0x1B42,
+ 0x6BDA, 0x13F2, 0x6BDB, 0x02E3, 0x6BDE, 0x19CC, 0x6BE0, 0x1B43,
+ 0x6BE2, 0x1CF2, 0x6BE3, 0x1CF1, 0x6BE4, 0x1CEF, 0x6BE6, 0x1CEE,
+ 0x6BE7, 0x1CF3, 0x6BE8, 0x1CF0, 0x6BEB, 0x0AE9, 0x6BEC, 0x0AEA,
+ 0x6BEF, 0x0CA1, 0x6BF0, 0x21BB, 0x6BF2, 0x21BC, 0x6BF3, 0x21BD,
+ 0x6BF7, 0x244C, 0x6BF8, 0x244D, 0x6BF9, 0x244B, 0x6BFB, 0x2449,
+ 0x6BFC, 0x244A, 0x6BFD, 0x0E4F, 0x6BFE, 0x26EA, 0x6BFF, 0x292B,
+ 0x6C00, 0x292A, 0x6C01, 0x2929, 0x6C02, 0x292C, 0x6C03, 0x2B91,
+ 0x6C04, 0x2B90, 0x6C05, 0x12DE, 0x6C06, 0x2B92, 0x6C08, 0x13F3,
+ 0x6C09, 0x2D8C, 0x6C0B, 0x2F41, 0x6C0C, 0x30A9, 0x6C0D, 0x3388,
+ 0x6C0F, 0x02E4, 0x6C10, 0x0350, 0x6C11, 0x034F, 0x6C13, 0x061E,
+ 0x6C14, 0x178C, 0x6C15, 0x17AA, 0x6C16, 0x03E6, 0x6C18, 0x1801,
+ 0x6C19, 0x18AE, 0x6C1A, 0x18AF, 0x6C1B, 0x061F, 0x6C1D, 0x19CD,
+ 0x6C1F, 0x076F, 0x6C20, 0x1B44, 0x6C21, 0x1B45, 0x6C23, 0x0902,
+ 0x6C24, 0x0906, 0x6C25, 0x1CF4, 0x6C26, 0x0905, 0x6C27, 0x0903,
+ 0x6C28, 0x0904, 0x6C2A, 0x1F44, 0x6C2B, 0x0AEB, 0x6C2C, 0x0CA4,
+ 0x6C2E, 0x0CA2, 0x6C2F, 0x0CA3, 0x6C30, 0x21BE, 0x6C33, 0x1003,
+ 0x6C34, 0x02E5, 0x6C36, 0x17AB, 0x6C38, 0x0351, 0x6C3B, 0x17AE,
+ 0x6C3E, 0x0354, 0x6C3F, 0x17AD, 0x6C40, 0x0353, 0x6C41, 0x0352,
+ 0x6C42, 0x04CB, 0x6C43, 0x17AC, 0x6C46, 0x1802, 0x6C4A, 0x1806,
+ 0x6C4B, 0x1808, 0x6C4C, 0x1809, 0x6C4D, 0x03F0, 0x6C4E, 0x03F1,
+ 0x6C4F, 0x1805, 0x6C50, 0x03EC, 0x6C52, 0x1803, 0x6C54, 0x1807,
+ 0x6C55, 0x03ED, 0x6C57, 0x03E8, 0x6C59, 0x03E9, 0x6C5B, 0x03EF,
+ 0x6C5C, 0x1804, 0x6C5D, 0x03E7, 0x6C5E, 0x04CC, 0x6C5F, 0x03EA,
+ 0x6C60, 0x03EB, 0x6C61, 0x03EE, 0x6C65, 0x18C0, 0x6C66, 0x18BE,
+ 0x6C67, 0x18B1, 0x6C68, 0x04D8, 0x6C69, 0x18B8, 0x6C6A, 0x04D3,
+ 0x6C6B, 0x18B2, 0x6C6D, 0x18BA, 0x6C6F, 0x18B7, 0x6C70, 0x04D6,
+ 0x6C71, 0x18B6, 0x6C72, 0x04DD, 0x6C73, 0x18BF, 0x6C74, 0x04DF,
+ 0x6C76, 0x04E1, 0x6C78, 0x18B0, 0x6C7A, 0x04D4, 0x6C7B, 0x18C1,
+ 0x6C7D, 0x04DB, 0x6C7E, 0x04DE, 0x6C80, 0x19E4, 0x6C81, 0x04CE,
+ 0x6C82, 0x04E5, 0x6C83, 0x04DC, 0x6C84, 0x18B3, 0x6C85, 0x04D1,
+ 0x6C86, 0x04E0, 0x6C87, 0x18BB, 0x6C88, 0x04CF, 0x6C89, 0x04D0,
+ 0x6C8A, 0x19E2, 0x6C8B, 0x18B4, 0x6C8C, 0x04D7, 0x6C8D, 0x04E2,
+ 0x6C8E, 0x18C2, 0x6C8F, 0x18B5, 0x6C90, 0x04D5, 0x6C92, 0x04DA,
+ 0x6C93, 0x19CE, 0x6C94, 0x04E3, 0x6C95, 0x18BC, 0x6C96, 0x04D9,
+ 0x6C98, 0x04E4, 0x6C99, 0x04CD, 0x6C9A, 0x18B9, 0x6C9B, 0x04D2,
+ 0x6C9C, 0x18BD, 0x6C9D, 0x19E3, 0x6CAB, 0x062B, 0x6CAC, 0x063B,
+ 0x6CAD, 0x19D5, 0x6CAE, 0x0632, 0x6CB0, 0x19EA, 0x6CB1, 0x0623,
+ 0x6CB3, 0x0626, 0x6CB4, 0x19E1, 0x6CB6, 0x19D3, 0x6CB7, 0x19D7,
+ 0x6CB8, 0x062E, 0x6CB9, 0x0630, 0x6CBA, 0x19DA, 0x6CBB, 0x0637,
+ 0x6CBC, 0x0629, 0x6CBD, 0x0627, 0x6CBE, 0x0628, 0x6CBF, 0x0636,
+ 0x6CC0, 0x19E6, 0x6CC1, 0x0631, 0x6CC2, 0x19D9, 0x6CC3, 0x19DB,
+ 0x6CC4, 0x062F, 0x6CC5, 0x0634, 0x6CC6, 0x19DC, 0x6CC7, 0x19E9,
+ 0x6CC9, 0x0770, 0x6CCA, 0x063A, 0x6CCC, 0x0624, 0x6CCD, 0x19E8,
+ 0x6CCF, 0x19EC, 0x6CD0, 0x19D8, 0x6CD1, 0x19EE, 0x6CD2, 0x19DF,
+ 0x6CD3, 0x062D, 0x6CD4, 0x19D4, 0x6CD5, 0x062C, 0x6CD6, 0x063E,
+ 0x6CD7, 0x0633, 0x6CD9, 0x19D2, 0x6CDA, 0x1B4E, 0x6CDB, 0x0639,
+ 0x6CDC, 0x063D, 0x6CDD, 0x19E0, 0x6CDE, 0x19E5, 0x6CE0, 0x063F,
+ 0x6CE1, 0x0638, 0x6CE2, 0x062A, 0x6CE3, 0x0620, 0x6CE5, 0x0625,
+ 0x6CE7, 0x19D6, 0x6CE8, 0x0621, 0x6CE9, 0x19ED, 0x6CEB, 0x19D0,
+ 0x6CEC, 0x19CF, 0x6CED, 0x19DD, 0x6CEE, 0x19D1, 0x6CEF, 0x063C,
+ 0x6CF0, 0x0907, 0x6CF1, 0x0635, 0x6CF2, 0x19DE, 0x6CF3, 0x0622,
+ 0x6CF5, 0x077F, 0x6CF9, 0x19EB, 0x6D00, 0x1B55, 0x6D01, 0x1B58,
+ 0x6D03, 0x1B5B, 0x6D04, 0x1B50, 0x6D07, 0x1B5E, 0x6D08, 0x1B61,
+ 0x6D09, 0x1B63, 0x6D0A, 0x1B4D, 0x6D0B, 0x0771, 0x6D0C, 0x0776,
+ 0x6D0D, 0x1CF9, 0x6D0E, 0x0786, 0x6D0F, 0x1B5C, 0x6D10, 0x1B64,
+ 0x6D11, 0x1B54, 0x6D12, 0x1B4C, 0x6D16, 0x1D14, 0x6D17, 0x0779,
+ 0x6D18, 0x1B59, 0x6D19, 0x1B51, 0x6D1A, 0x1B53, 0x6D1B, 0x077E,
+ 0x6D1D, 0x1B56, 0x6D1E, 0x0778, 0x6D1F, 0x1B49, 0x6D20, 0x1B5F,
+ 0x6D22, 0x1B62, 0x6D25, 0x0775, 0x6D27, 0x0781, 0x6D28, 0x1B46,
+ 0x6D29, 0x0783, 0x6D2A, 0x0773, 0x6D2B, 0x0787, 0x6D2C, 0x1B60,
+ 0x6D2D, 0x1B48, 0x6D2E, 0x0784, 0x6D2F, 0x1D0E, 0x6D30, 0x19E7,
+ 0x6D31, 0x0777, 0x6D32, 0x0772, 0x6D33, 0x1B4F, 0x6D34, 0x1B47,
+ 0x6D35, 0x0785, 0x6D36, 0x077D, 0x6D37, 0x1B5A, 0x6D38, 0x0782,
+ 0x6D39, 0x0780, 0x6D3A, 0x1B52, 0x6D3B, 0x077A, 0x6D3C, 0x1B4A,
+ 0x6D3D, 0x077B, 0x6D3E, 0x077C, 0x6D3F, 0x1B4B, 0x6D40, 0x1B5D,
+ 0x6D41, 0x0774, 0x6D42, 0x1B57, 0x6D58, 0x1CFC, 0x6D59, 0x090F,
+ 0x6D5A, 0x0914, 0x6D5E, 0x1D05, 0x6D5F, 0x1D0B, 0x6D60, 0x1D07,
+ 0x6D61, 0x1CFA, 0x6D62, 0x1CFD, 0x6D63, 0x1CF6, 0x6D64, 0x1CF7,
+ 0x6D65, 0x091B, 0x6D66, 0x090C, 0x6D67, 0x1D06, 0x6D68, 0x1D0F,
+ 0x6D69, 0x0916, 0x6D6A, 0x0908, 0x6D6C, 0x0911, 0x6D6D, 0x1CFE,
+ 0x6D6E, 0x0913, 0x6D6F, 0x1CFF, 0x6D70, 0x1D09, 0x6D74, 0x0915,
+ 0x6D75, 0x1D18, 0x6D76, 0x1CF8, 0x6D77, 0x090E, 0x6D78, 0x090D,
+ 0x6D79, 0x0919, 0x6D7A, 0x1CF5, 0x6D7B, 0x1D16, 0x6D7C, 0x1D0A,
+ 0x6D7D, 0x1D17, 0x6D7E, 0x1D11, 0x6D7F, 0x1D03, 0x6D80, 0x1D12,
+ 0x6D82, 0x1D0C, 0x6D83, 0x1D15, 0x6D84, 0x1D13, 0x6D85, 0x091A,
+ 0x6D86, 0x1D04, 0x6D87, 0x090B, 0x6D88, 0x090A, 0x6D89, 0x0912,
+ 0x6D8A, 0x0918, 0x6D8B, 0x1D10, 0x6D8C, 0x0917, 0x6D8D, 0x1D01,
+ 0x6D8E, 0x0AEC, 0x6D90, 0x1D19, 0x6D91, 0x1D00, 0x6D92, 0x1CFB,
+ 0x6D93, 0x0910, 0x6D94, 0x091C, 0x6D95, 0x0909, 0x6D97, 0x1D08,
+ 0x6D98, 0x1D0D, 0x6DAA, 0x0B0E, 0x6DAB, 0x1F46, 0x6DAC, 0x1F4A,
+ 0x6DAE, 0x0AFB, 0x6DAF, 0x0AF9, 0x6DB2, 0x0AF0, 0x6DB3, 0x1F48,
+ 0x6DB4, 0x1F47, 0x6DB5, 0x0B04, 0x6DB7, 0x1F4D, 0x6DB8, 0x0AFE,
+ 0x6DBA, 0x1F5F, 0x6DBB, 0x1F6B, 0x6DBC, 0x0AED, 0x6DBD, 0x1F5C,
+ 0x6DBE, 0x1F55, 0x6DBF, 0x0B10, 0x6DC0, 0x1F45, 0x6DC2, 0x1F61,
+ 0x6DC4, 0x0B0D, 0x6DC5, 0x0B01, 0x6DC6, 0x0B0C, 0x6DC7, 0x0AF7,
+ 0x6DC8, 0x1F51, 0x6DC9, 0x1F63, 0x6DCA, 0x1F5B, 0x6DCB, 0x0AF8,
+ 0x6DCC, 0x0AF2, 0x6DCD, 0x1F69, 0x6DCF, 0x1F62, 0x6DD0, 0x1F64,
+ 0x6DD1, 0x0AFA, 0x6DD2, 0x0B02, 0x6DD3, 0x1F66, 0x6DD4, 0x1F4F,
+ 0x6DD5, 0x1F60, 0x6DD6, 0x1F54, 0x6DD7, 0x1F68, 0x6DD8, 0x0B07,
+ 0x6DD9, 0x0AEF, 0x6DDA, 0x0B05, 0x6DDB, 0x1F59, 0x6DDC, 0x1F57,
+ 0x6DDD, 0x1F58, 0x6DDE, 0x0AFC, 0x6DDF, 0x1F53, 0x6DE0, 0x1F52,
+ 0x6DE1, 0x0AF1, 0x6DE2, 0x1F4C, 0x6DE3, 0x1F6A, 0x6DE4, 0x0AF3,
+ 0x6DE5, 0x1F56, 0x6DE6, 0x0B11, 0x6DE8, 0x0B0B, 0x6DE9, 0x1F4B,
+ 0x6DEA, 0x0B08, 0x6DEB, 0x0B06, 0x6DEC, 0x0B0F, 0x6DED, 0x1F5D,
+ 0x6DEE, 0x0B0A, 0x6DEF, 0x1D02, 0x6DF0, 0x1F5E, 0x6DF1, 0x0B09,
+ 0x6DF2, 0x1F65, 0x6DF3, 0x0AEE, 0x6DF4, 0x1F5A, 0x6DF5, 0x0B00,
+ 0x6DF6, 0x1F4E, 0x6DF7, 0x0AFF, 0x6DF9, 0x0AFD, 0x6DFA, 0x0AF5,
+ 0x6DFB, 0x0AF4, 0x6DFC, 0x21BF, 0x6DFD, 0x1F67, 0x6E00, 0x1F50,
+ 0x6E03, 0x21D4, 0x6E05, 0x0AF6, 0x6E19, 0x0CC1, 0x6E1A, 0x0B03,
+ 0x6E1B, 0x0CAF, 0x6E1C, 0x21CE, 0x6E1D, 0x0CBD, 0x6E1F, 0x21C2,
+ 0x6E20, 0x0CAC, 0x6E21, 0x0CA8, 0x6E22, 0x21E0, 0x6E23, 0x0CAE,
+ 0x6E24, 0x0CB2, 0x6E25, 0x0CAD, 0x6E26, 0x0CB6, 0x6E27, 0x21E4,
+ 0x6E28, 0x21DB, 0x6E2B, 0x21C9, 0x6E2C, 0x0CBB, 0x6E2D, 0x0CB5,
+ 0x6E2E, 0x21D5, 0x6E2F, 0x0CA5, 0x6E30, 0x21E1, 0x6E31, 0x21DA,
+ 0x6E32, 0x0CA9, 0x6E33, 0x21CF, 0x6E34, 0x0CB8, 0x6E35, 0x21EC,
+ 0x6E36, 0x21ED, 0x6E38, 0x0CA6, 0x6E39, 0x21DF, 0x6E3A, 0x0CBA,
+ 0x6E3B, 0x21D3, 0x6E3C, 0x21C5, 0x6E3D, 0x21C6, 0x6E3E, 0x0CBE,
+ 0x6E3F, 0x21CA, 0x6E40, 0x21D1, 0x6E41, 0x21CB, 0x6E43, 0x0CBC,
+ 0x6E44, 0x0CC4, 0x6E45, 0x21C7, 0x6E46, 0x21C0, 0x6E47, 0x21C1,
+ 0x6E49, 0x21C3, 0x6E4A, 0x0CAB, 0x6E4B, 0x21D0, 0x6E4D, 0x0CB9,
+ 0x6E4E, 0x0CC2, 0x6E51, 0x21D2, 0x6E52, 0x21EA, 0x6E53, 0x21E2,
+ 0x6E54, 0x0CA7, 0x6E55, 0x21E8, 0x6E56, 0x0CB3, 0x6E58, 0x0CB1,
+ 0x6E5A, 0x21EE, 0x6E5B, 0x0CB0, 0x6E5C, 0x21D8, 0x6E5D, 0x21CC,
+ 0x6E5E, 0x21D6, 0x6E5F, 0x0CC7, 0x6E60, 0x21DC, 0x6E61, 0x21D9,
+ 0x6E62, 0x21C8, 0x6E63, 0x0CC3, 0x6E64, 0x21E6, 0x6E65, 0x21E3,
+ 0x6E66, 0x21EB, 0x6E67, 0x0CAA, 0x6E68, 0x21D7, 0x6E69, 0x0CC6,
+ 0x6E6B, 0x21DE, 0x6E6E, 0x0CB4, 0x6E6F, 0x0CB7, 0x6E71, 0x21DD,
+ 0x6E72, 0x0CC5, 0x6E73, 0x21CD, 0x6E74, 0x1F49, 0x6E77, 0x21E7,
+ 0x6E78, 0x21E5, 0x6E79, 0x21E9, 0x6E88, 0x21C4, 0x6E89, 0x0CC0,
+ 0x6E8D, 0x246C, 0x6E8E, 0x246B, 0x6E8F, 0x2451, 0x6E90, 0x0E55,
+ 0x6E92, 0x246A, 0x6E93, 0x2454, 0x6E94, 0x2455, 0x6E96, 0x0E5F,
+ 0x6E97, 0x2473, 0x6E98, 0x0E5A, 0x6E99, 0x2469, 0x6E9B, 0x244E,
+ 0x6E9C, 0x0E60, 0x6E9D, 0x0E56, 0x6E9E, 0x245D, 0x6E9F, 0x2453,
+ 0x6EA0, 0x2456, 0x6EA1, 0x246E, 0x6EA2, 0x0E50, 0x6EA3, 0x2475,
+ 0x6EA4, 0x246D, 0x6EA5, 0x0E59, 0x6EA6, 0x2462, 0x6EA7, 0x0E64,
+ 0x6EAA, 0x0E63, 0x6EAB, 0x0E5D, 0x6EAE, 0x2474, 0x6EAF, 0x0E51,
+ 0x6EB0, 0x2460, 0x6EB1, 0x2457, 0x6EB2, 0x2464, 0x6EB3, 0x2470,
+ 0x6EB4, 0x0E65, 0x6EB6, 0x0E53, 0x6EB7, 0x245F, 0x6EB9, 0x2458,
+ 0x6EBA, 0x0E5C, 0x6EBC, 0x0E5B, 0x6EBD, 0x245B, 0x6EBE, 0x2465,
+ 0x6EBF, 0x246F, 0x6EC0, 0x2452, 0x6EC1, 0x245C, 0x6EC2, 0x0E54,
+ 0x6EC3, 0x2466, 0x6EC4, 0x0E61, 0x6EC5, 0x0E58, 0x6EC6, 0x2459,
+ 0x6EC7, 0x0E57, 0x6EC8, 0x2450, 0x6EC9, 0x245E, 0x6ECA, 0x2472,
+ 0x6ECB, 0x0CBF, 0x6ECC, 0x101F, 0x6ECD, 0x2461, 0x6ECE, 0x26EB,
+ 0x6ECF, 0x2463, 0x6ED0, 0x2471, 0x6ED1, 0x0E5E, 0x6ED2, 0x245A,
+ 0x6ED3, 0x0E52, 0x6ED4, 0x0E62, 0x6ED5, 0x119A, 0x6ED6, 0x244F,
+ 0x6ED8, 0x2468, 0x6EDC, 0x2467, 0x6EEB, 0x2707, 0x6EEC, 0x101C,
+ 0x6EED, 0x26FC, 0x6EEE, 0x2701, 0x6EEF, 0x1011, 0x6EF1, 0x26ED,
+ 0x6EF2, 0x101E, 0x6EF4, 0x1008, 0x6EF5, 0x26EC, 0x6EF6, 0x270D,
+ 0x6EF7, 0x1020, 0x6EF8, 0x26F0, 0x6EF9, 0x2700, 0x6EFB, 0x26F2,
+ 0x6EFC, 0x2710, 0x6EFD, 0x270C, 0x6EFE, 0x1006, 0x6EFF, 0x1010,
+ 0x6F00, 0x2946, 0x6F01, 0x101D, 0x6F02, 0x100E, 0x6F03, 0x26EE,
+ 0x6F05, 0x270B, 0x6F06, 0x1012, 0x6F07, 0x2708, 0x6F08, 0x2715,
+ 0x6F09, 0x26F4, 0x6F0A, 0x26FD, 0x6F0D, 0x2713, 0x6F0E, 0x2709,
+ 0x6F0F, 0x100D, 0x6F12, 0x26FB, 0x6F13, 0x1007, 0x6F14, 0x1005,
+ 0x6F15, 0x1017, 0x6F18, 0x26F9, 0x6F19, 0x26F6, 0x6F1A, 0x26F7,
+ 0x6F1C, 0x270F, 0x6F1E, 0x2714, 0x6F1F, 0x2712, 0x6F20, 0x100B,
+ 0x6F21, 0x2716, 0x6F22, 0x100F, 0x6F23, 0x1016, 0x6F25, 0x26EF,
+ 0x6F26, 0x292E, 0x6F27, 0x26F8, 0x6F29, 0x1009, 0x6F2A, 0x101B,
+ 0x6F2B, 0x1018, 0x6F2C, 0x100C, 0x6F2D, 0x2702, 0x6F2E, 0x26F3,
+ 0x6F2F, 0x1019, 0x6F30, 0x2704, 0x6F31, 0x1013, 0x6F32, 0x1015,
+ 0x6F33, 0x1004, 0x6F35, 0x2706, 0x6F36, 0x26FE, 0x6F37, 0x26F1,
+ 0x6F38, 0x1014, 0x6F39, 0x270E, 0x6F3A, 0x2711, 0x6F3B, 0x26FA,
+ 0x6F3C, 0x2705, 0x6F3E, 0x100A, 0x6F3F, 0x1189, 0x6F40, 0x2703,
+ 0x6F41, 0x292D, 0x6F43, 0x270A, 0x6F4E, 0x26F5, 0x6F4F, 0x2937,
+ 0x6F50, 0x2941, 0x6F51, 0x118C, 0x6F52, 0x2940, 0x6F53, 0x294C,
+ 0x6F54, 0x118E, 0x6F55, 0x293E, 0x6F57, 0x2942, 0x6F58, 0x1199,
+ 0x6F5A, 0x2939, 0x6F5B, 0x1191, 0x6F5D, 0x2945, 0x6F5E, 0x2B9A,
+ 0x6F5F, 0x119D, 0x6F60, 0x119C, 0x6F61, 0x2947, 0x6F62, 0x2936,
+ 0x6F63, 0x2951, 0x6F64, 0x1197, 0x6F66, 0x118D, 0x6F67, 0x294A,
+ 0x6F69, 0x294E, 0x6F6A, 0x2953, 0x6F6B, 0x2948, 0x6F6C, 0x293C,
+ 0x6F6D, 0x1190, 0x6F6E, 0x1193, 0x6F6F, 0x119B, 0x6F70, 0x1196,
+ 0x6F72, 0x293F, 0x6F73, 0x26FF, 0x6F76, 0x293B, 0x6F77, 0x2952,
+ 0x6F78, 0x1192, 0x6F7A, 0x1195, 0x6F7B, 0x2954, 0x6F7C, 0x118A,
+ 0x6F7D, 0x2949, 0x6F7E, 0x292F, 0x6F7F, 0x294F, 0x6F80, 0x13FC,
+ 0x6F82, 0x293D, 0x6F84, 0x118B, 0x6F85, 0x2938, 0x6F86, 0x118F,
+ 0x6F87, 0x2930, 0x6F88, 0x101A, 0x6F89, 0x2934, 0x6F8B, 0x294D,
+ 0x6F8C, 0x2935, 0x6F8D, 0x2933, 0x6F8E, 0x1194, 0x6F90, 0x294B,
+ 0x6F92, 0x2932, 0x6F93, 0x2944, 0x6F94, 0x2943, 0x6F95, 0x2950,
+ 0x6F96, 0x293A, 0x6F97, 0x1198, 0x6F9E, 0x2B9D, 0x6FA0, 0x12EB,
+ 0x6FA1, 0x12E1, 0x6FA2, 0x2BA9, 0x6FA3, 0x2B95, 0x6FA4, 0x12E3,
+ 0x6FA5, 0x2BA1, 0x6FA6, 0x12EA, 0x6FA7, 0x12E5, 0x6FA8, 0x2B9F,
+ 0x6FA9, 0x2D8E, 0x6FAA, 0x2BA5, 0x6FAB, 0x2BAB, 0x6FAC, 0x2BA4,
+ 0x6FAD, 0x2B93, 0x6FAE, 0x2BA2, 0x6FAF, 0x2BAD, 0x6FB0, 0x2BAF,
+ 0x6FB1, 0x12E0, 0x6FB2, 0x2BAE, 0x6FB3, 0x12E6, 0x6FB4, 0x12EC,
+ 0x6FB6, 0x12E9, 0x6FB8, 0x2BA8, 0x6FB9, 0x12E8, 0x6FBA, 0x2BA3,
+ 0x6FBC, 0x2B97, 0x6FBD, 0x2B9C, 0x6FBF, 0x2BA7, 0x6FC0, 0x12E7,
+ 0x6FC1, 0x12E4, 0x6FC2, 0x12DF, 0x6FC3, 0x12E2, 0x6FC4, 0x2B9B,
+ 0x6FC6, 0x2931, 0x6FC7, 0x2B96, 0x6FC8, 0x2B99, 0x6FC9, 0x2BAA,
+ 0x6FCA, 0x2B9E, 0x6FCB, 0x2B94, 0x6FCC, 0x2D8D, 0x6FCD, 0x2BAC,
+ 0x6FCE, 0x2B98, 0x6FCF, 0x2BA6, 0x6FD4, 0x2D90, 0x6FD5, 0x1400,
+ 0x6FD8, 0x13F4, 0x6FDB, 0x13F8, 0x6FDC, 0x2D92, 0x6FDD, 0x2D98,
+ 0x6FDE, 0x2D96, 0x6FDF, 0x13F6, 0x6FE0, 0x13F7, 0x6FE1, 0x13FE,
+ 0x6FE2, 0x2D99, 0x6FE3, 0x2D91, 0x6FE4, 0x13F9, 0x6FE6, 0x2D95,
+ 0x6FE7, 0x2D94, 0x6FE8, 0x2D9A, 0x6FE9, 0x13FF, 0x6FEB, 0x13FA,
+ 0x6FEC, 0x13FD, 0x6FED, 0x2D93, 0x6FEE, 0x1401, 0x6FEF, 0x13FB,
+ 0x6FF0, 0x1402, 0x6FF1, 0x13F5, 0x6FF2, 0x2D97, 0x6FF4, 0x2D8F,
+ 0x6FF7, 0x2F4E, 0x6FFA, 0x14EB, 0x6FFB, 0x2F4B, 0x6FFC, 0x2F4D,
+ 0x6FFE, 0x14E9, 0x6FFF, 0x2F49, 0x7000, 0x2F4A, 0x7001, 0x2F45,
+ 0x7004, 0x2BA0, 0x7005, 0x2F46, 0x7006, 0x14EA, 0x7007, 0x2F42,
+ 0x7009, 0x14E7, 0x700A, 0x2F4F, 0x700B, 0x14E8, 0x700C, 0x2F43,
+ 0x700D, 0x2F44, 0x700E, 0x2F48, 0x700F, 0x14ED, 0x7011, 0x14EC,
+ 0x7014, 0x2F47, 0x7015, 0x158F, 0x7016, 0x30AD, 0x7017, 0x30B3,
+ 0x7018, 0x1590, 0x7019, 0x30AA, 0x701A, 0x158D, 0x701B, 0x158A,
+ 0x701C, 0x30B5, 0x701D, 0x158E, 0x701F, 0x158B, 0x7020, 0x30AC,
+ 0x7021, 0x30AF, 0x7022, 0x30B0, 0x7023, 0x30B1, 0x7024, 0x30B4,
+ 0x7026, 0x2F4C, 0x7027, 0x30AB, 0x7028, 0x158C, 0x7029, 0x30B2,
+ 0x702A, 0x31EF, 0x702B, 0x30AE, 0x702F, 0x31E6, 0x7030, 0x161D,
+ 0x7031, 0x31E9, 0x7032, 0x161E, 0x7033, 0x31F2, 0x7034, 0x31E8,
+ 0x7035, 0x31E5, 0x7037, 0x31E7, 0x7038, 0x31EB, 0x7039, 0x31EE,
+ 0x703A, 0x31ED, 0x703B, 0x31F1, 0x703C, 0x31E4, 0x703E, 0x161C,
+ 0x703F, 0x31EC, 0x7040, 0x31F0, 0x7041, 0x31F3, 0x7042, 0x31EA,
+ 0x7043, 0x32D8, 0x7044, 0x32D9, 0x7045, 0x32DD, 0x7046, 0x32DE,
+ 0x7048, 0x32DB, 0x7049, 0x32DC, 0x704A, 0x32DA, 0x704C, 0x167A,
+ 0x7051, 0x16C8, 0x7052, 0x338C, 0x7055, 0x3389, 0x7056, 0x338A,
+ 0x7057, 0x338B, 0x7058, 0x16C9, 0x705A, 0x3423, 0x705B, 0x3422,
+ 0x705D, 0x348A, 0x705E, 0x1722, 0x705F, 0x3488, 0x7060, 0x348B,
+ 0x7061, 0x3489, 0x7062, 0x34D0, 0x7063, 0x1744, 0x7064, 0x1752,
+ 0x7065, 0x351C, 0x7066, 0x3506, 0x7068, 0x351B, 0x7069, 0x3547,
+ 0x706A, 0x3548, 0x706B, 0x02E6, 0x7070, 0x03F2, 0x7071, 0x180A,
+ 0x7074, 0x18C3, 0x7076, 0x04E6, 0x7078, 0x04E9, 0x707A, 0x18C4,
+ 0x707C, 0x04E7, 0x707D, 0x04E8, 0x7082, 0x19F7, 0x7083, 0x19F9,
+ 0x7084, 0x19F4, 0x7085, 0x19F1, 0x7086, 0x19F3, 0x708A, 0x0643,
+ 0x708E, 0x0641, 0x7091, 0x19F5, 0x7092, 0x0642, 0x7093, 0x19F2,
+ 0x7094, 0x19EF, 0x7095, 0x0640, 0x7096, 0x19F6, 0x7098, 0x19F0,
+ 0x7099, 0x0644, 0x709A, 0x19F8, 0x709F, 0x1B66, 0x70A1, 0x1B6A,
+ 0x70A4, 0x0790, 0x70A9, 0x1B6D, 0x70AB, 0x0788, 0x70AC, 0x078B,
+ 0x70AD, 0x078D, 0x70AE, 0x078F, 0x70AF, 0x078C, 0x70B0, 0x1B69,
+ 0x70B1, 0x1B68, 0x70B3, 0x078A, 0x70B4, 0x1B6B, 0x70B5, 0x1B6C,
+ 0x70B7, 0x1B65, 0x70B8, 0x078E, 0x70BA, 0x0789, 0x70BE, 0x1B67,
+ 0x70C5, 0x1D27, 0x70C6, 0x1D28, 0x70C7, 0x1D29, 0x70C8, 0x0921,
+ 0x70CA, 0x091D, 0x70CB, 0x1D1E, 0x70CD, 0x1D26, 0x70CE, 0x1D2B,
+ 0x70CF, 0x0922, 0x70D1, 0x1D1C, 0x70D2, 0x1D22, 0x70D3, 0x1D1B,
+ 0x70D4, 0x1D25, 0x70D7, 0x1D21, 0x70D8, 0x091E, 0x70D9, 0x0920,
+ 0x70DA, 0x1D2A, 0x70DC, 0x1D1A, 0x70DD, 0x1D1D, 0x70DE, 0x1D23,
+ 0x70E0, 0x1D24, 0x70E1, 0x1D2C, 0x70E2, 0x1D20, 0x70E4, 0x091F,
+ 0x70EF, 0x0B16, 0x70F0, 0x1F72, 0x70F3, 0x1F74, 0x70F4, 0x1F70,
+ 0x70F6, 0x1F7C, 0x70F7, 0x1F6E, 0x70F8, 0x1F7B, 0x70F9, 0x0B12,
+ 0x70FA, 0x1F6C, 0x70FB, 0x21F2, 0x70FC, 0x1F76, 0x70FD, 0x0B15,
+ 0x70FF, 0x1F77, 0x7100, 0x1F7A, 0x7102, 0x1F7E, 0x7104, 0x1F73,
+ 0x7106, 0x1F78, 0x7109, 0x0B13, 0x710A, 0x0B14, 0x710B, 0x1F7D,
+ 0x710C, 0x1F71, 0x710D, 0x1F6D, 0x710E, 0x1F7F, 0x7110, 0x1F75,
+ 0x7113, 0x1F79, 0x7117, 0x1F6F, 0x7119, 0x0CC8, 0x711A, 0x0CC9,
+ 0x711B, 0x21FC, 0x711C, 0x0CCF, 0x711E, 0x21F0, 0x711F, 0x21F9,
+ 0x7120, 0x21EF, 0x7121, 0x0CCC, 0x7122, 0x21F7, 0x7123, 0x21F5,
+ 0x7125, 0x21F6, 0x7126, 0x0CCA, 0x7128, 0x21FA, 0x712E, 0x21F3,
+ 0x712F, 0x21F1, 0x7130, 0x0CCB, 0x7131, 0x21F4, 0x7132, 0x21F8,
+ 0x7136, 0x0CCD, 0x713A, 0x21FB, 0x7141, 0x247B, 0x7142, 0x2482,
+ 0x7143, 0x2484, 0x7144, 0x248A, 0x7146, 0x0E72, 0x7147, 0x2476,
+ 0x7149, 0x0E6A, 0x714B, 0x2485, 0x714C, 0x0E6F, 0x714D, 0x248B,
+ 0x714E, 0x0E66, 0x7150, 0x2488, 0x7152, 0x2478, 0x7153, 0x2489,
+ 0x7154, 0x2477, 0x7156, 0x0E74, 0x7158, 0x2483, 0x7159, 0x0E67,
+ 0x715A, 0x248C, 0x715C, 0x0E6C, 0x715D, 0x247C, 0x715E, 0x0E71,
+ 0x715F, 0x2487, 0x7160, 0x247A, 0x7161, 0x2481, 0x7162, 0x247D,
+ 0x7163, 0x2479, 0x7164, 0x0E69, 0x7165, 0x0E70, 0x7166, 0x0E6E,
+ 0x7167, 0x0E6B, 0x7168, 0x0E73, 0x7169, 0x0E68, 0x716A, 0x2480,
+ 0x716C, 0x0E6D, 0x716E, 0x0CCE, 0x7170, 0x2486, 0x7172, 0x247E,
+ 0x7178, 0x247F, 0x717B, 0x271E, 0x717D, 0x1023, 0x7180, 0x271A,
+ 0x7181, 0x2720, 0x7182, 0x271C, 0x7184, 0x1025, 0x7185, 0x271B,
+ 0x7186, 0x271F, 0x7187, 0x2717, 0x7189, 0x2719, 0x718A, 0x1024,
+ 0x718F, 0x271D, 0x7190, 0x2718, 0x7192, 0x1026, 0x7194, 0x1021,
+ 0x7197, 0x2721, 0x7199, 0x1022, 0x719A, 0x295A, 0x719B, 0x2957,
+ 0x719C, 0x2963, 0x719D, 0x295D, 0x719E, 0x295F, 0x719F, 0x119E,
+ 0x71A0, 0x2959, 0x71A1, 0x2961, 0x71A4, 0x2960, 0x71A5, 0x295E,
+ 0x71A7, 0x2964, 0x71A8, 0x11A1, 0x71A9, 0x295B, 0x71AA, 0x2962,
+ 0x71AC, 0x119F, 0x71AF, 0x2956, 0x71B0, 0x2958, 0x71B1, 0x11A0,
+ 0x71B2, 0x2955, 0x71B3, 0x2965, 0x71B5, 0x295C, 0x71B8, 0x2BB3,
+ 0x71B9, 0x12F3, 0x71BC, 0x2BBE, 0x71BD, 0x2BBC, 0x71BE, 0x12ED,
+ 0x71BF, 0x2BB2, 0x71C0, 0x2BB5, 0x71C1, 0x2BB6, 0x71C2, 0x2BB1,
+ 0x71C3, 0x12F7, 0x71C4, 0x12F8, 0x71C5, 0x2BB0, 0x71C6, 0x2BBF,
+ 0x71C7, 0x2BBA, 0x71C8, 0x12F1, 0x71C9, 0x12EE, 0x71CA, 0x2BB9,
+ 0x71CB, 0x2BB7, 0x71CE, 0x12F4, 0x71CF, 0x2BBB, 0x71D0, 0x12EF,
+ 0x71D2, 0x12F0, 0x71D4, 0x2BB8, 0x71D5, 0x12F2, 0x71D6, 0x2BB4,
+ 0x71D8, 0x2BBD, 0x71D9, 0x12F5, 0x71DA, 0x2BC0, 0x71DB, 0x2BC1,
+ 0x71DC, 0x12F6, 0x71DF, 0x1404, 0x71E0, 0x140B, 0x71E1, 0x2D9B,
+ 0x71E2, 0x2DA1, 0x71E4, 0x2D9F, 0x71E5, 0x1407, 0x71E6, 0x1406,
+ 0x71E7, 0x1403, 0x71E8, 0x2D9D, 0x71EC, 0x1409, 0x71ED, 0x1408,
+ 0x71EE, 0x1405, 0x71F0, 0x2DA0, 0x71F1, 0x2D9C, 0x71F2, 0x2D9E,
+ 0x71F4, 0x140A, 0x71F8, 0x14F1, 0x71F9, 0x2F52, 0x71FB, 0x14EE,
+ 0x71FC, 0x14EF, 0x71FD, 0x2F54, 0x71FE, 0x14F0, 0x71FF, 0x2F51,
+ 0x7201, 0x2F50, 0x7202, 0x30B9, 0x7203, 0x2F53, 0x7205, 0x30BA,
+ 0x7206, 0x1591, 0x7207, 0x30B8, 0x720A, 0x30B7, 0x720C, 0x30B6,
+ 0x720D, 0x1592, 0x7210, 0x161F, 0x7213, 0x31F4, 0x7214, 0x31F5,
+ 0x7219, 0x32E1, 0x721A, 0x32E0, 0x721B, 0x167B, 0x721D, 0x32DF,
+ 0x721E, 0x338D, 0x721F, 0x338E, 0x7222, 0x3424, 0x7223, 0x348C,
+ 0x7226, 0x34D1, 0x7227, 0x3535, 0x7228, 0x1766, 0x7229, 0x3549,
+ 0x722A, 0x02E7, 0x722C, 0x0645, 0x722D, 0x0646, 0x7230, 0x0791,
+ 0x7235, 0x140C, 0x7236, 0x02E8, 0x7238, 0x0647, 0x7239, 0x0923,
+ 0x723A, 0x0E75, 0x723B, 0x02E9, 0x723D, 0x0B17, 0x723E, 0x1027,
+ 0x723F, 0x178D, 0x7241, 0x1B6E, 0x7242, 0x1D2D, 0x7244, 0x2722,
+ 0x7246, 0x140D, 0x7247, 0x02EA, 0x7248, 0x0648, 0x7249, 0x1B6F,
+ 0x724A, 0x1B70, 0x724B, 0x21FD, 0x724C, 0x0CD0, 0x724F, 0x248D,
+ 0x7252, 0x0E76, 0x7253, 0x2723, 0x7256, 0x11A2, 0x7258, 0x1593,
+ 0x7259, 0x02EB, 0x725A, 0x21FE, 0x725B, 0x02EC, 0x725D, 0x03F4,
+ 0x725E, 0x180B, 0x725F, 0x03F3, 0x7260, 0x04EC, 0x7261, 0x04EB,
+ 0x7262, 0x04EA, 0x7263, 0x18C5, 0x7267, 0x0649, 0x7269, 0x064A,
+ 0x726A, 0x19FA, 0x726C, 0x1B71, 0x726E, 0x1B74, 0x726F, 0x0793,
+ 0x7270, 0x1B72, 0x7272, 0x0792, 0x7273, 0x1B73, 0x7274, 0x0794,
+ 0x7276, 0x1D30, 0x7277, 0x1D2F, 0x7278, 0x1D2E, 0x7279, 0x0924,
+ 0x727B, 0x1F81, 0x727C, 0x1F82, 0x727D, 0x0B18, 0x727E, 0x1F80,
+ 0x727F, 0x1F83, 0x7280, 0x0CD2, 0x7281, 0x0B19, 0x7284, 0x0CD1,
+ 0x7285, 0x2202, 0x7286, 0x2201, 0x7288, 0x21FF, 0x7289, 0x2200,
+ 0x728B, 0x2203, 0x728C, 0x248F, 0x728D, 0x248E, 0x728E, 0x2492,
+ 0x7290, 0x2491, 0x7291, 0x2490, 0x7292, 0x1028, 0x7293, 0x2726,
+ 0x7295, 0x2725, 0x7296, 0x1029, 0x7297, 0x2724, 0x7298, 0x2966,
+ 0x729A, 0x2967, 0x729B, 0x11A3, 0x729D, 0x2BC2, 0x729E, 0x2BC3,
+ 0x72A1, 0x30BF, 0x72A2, 0x1594, 0x72A3, 0x30BE, 0x72A4, 0x30BD,
+ 0x72A5, 0x30BB, 0x72A6, 0x30BC, 0x72A7, 0x167C, 0x72A8, 0x31F6,
+ 0x72A9, 0x338F, 0x72AA, 0x34D2, 0x72AC, 0x02ED, 0x72AE, 0x17AF,
+ 0x72AF, 0x0355, 0x72B0, 0x17B0, 0x72B4, 0x180C, 0x72B5, 0x180D,
+ 0x72BA, 0x18CB, 0x72BD, 0x18C7, 0x72BF, 0x18C6, 0x72C0, 0x064B,
+ 0x72C1, 0x18CA, 0x72C2, 0x04EE, 0x72C3, 0x18C8, 0x72C4, 0x04ED,
+ 0x72C5, 0x18CC, 0x72C6, 0x18C9, 0x72C9, 0x19FE, 0x72CA, 0x1B75,
+ 0x72CB, 0x19FC, 0x72CC, 0x1A03, 0x72CE, 0x064C, 0x72D0, 0x064F,
+ 0x72D1, 0x1A04, 0x72D2, 0x1A00, 0x72D4, 0x1A01, 0x72D6, 0x19FB,
+ 0x72D7, 0x064E, 0x72D8, 0x19FD, 0x72D9, 0x064D, 0x72DA, 0x1A02,
+ 0x72DC, 0x19FF, 0x72DF, 0x1B79, 0x72E0, 0x0796, 0x72E1, 0x0797,
+ 0x72E3, 0x1B7C, 0x72E4, 0x1B76, 0x72E6, 0x1B7B, 0x72E8, 0x1B77,
+ 0x72E9, 0x0795, 0x72EA, 0x1B7A, 0x72EB, 0x1B78, 0x72F3, 0x1D36,
+ 0x72F4, 0x1D33, 0x72F6, 0x1D35, 0x72F7, 0x0929, 0x72F8, 0x0928,
+ 0x72F9, 0x0926, 0x72FA, 0x1D32, 0x72FB, 0x1D37, 0x72FC, 0x0925,
+ 0x72FD, 0x0927, 0x72FE, 0x1D34, 0x72FF, 0x1F8B, 0x7300, 0x1D31,
+ 0x7301, 0x1D38, 0x7307, 0x1F86, 0x7308, 0x1F8A, 0x730A, 0x1F89,
+ 0x730B, 0x2205, 0x730C, 0x2210, 0x730F, 0x1F8C, 0x7311, 0x1F87,
+ 0x7312, 0x2204, 0x7313, 0x0B1D, 0x7316, 0x0B1C, 0x7317, 0x1F85,
+ 0x7318, 0x1F88, 0x7319, 0x0B1E, 0x731B, 0x0B1B, 0x731C, 0x0B1A,
+ 0x731D, 0x1F84, 0x731E, 0x1F8D, 0x7322, 0x2207, 0x7323, 0x220E,
+ 0x7325, 0x0CD4, 0x7326, 0x220D, 0x7327, 0x220A, 0x7329, 0x0CD6,
+ 0x732D, 0x220C, 0x7330, 0x2206, 0x7331, 0x2208, 0x7332, 0x220B,
+ 0x7333, 0x2209, 0x7334, 0x0CD5, 0x7335, 0x220F, 0x7336, 0x0CD3,
+ 0x7337, 0x0E77, 0x733A, 0x2496, 0x733B, 0x2495, 0x733C, 0x2493,
+ 0x733E, 0x0E7A, 0x733F, 0x0E79, 0x7340, 0x2497, 0x7342, 0x2494,
+ 0x7343, 0x2727, 0x7344, 0x102A, 0x7345, 0x0E78, 0x7349, 0x2499,
+ 0x734A, 0x2498, 0x734C, 0x272A, 0x734D, 0x2728, 0x734E, 0x11A4,
+ 0x7350, 0x102B, 0x7351, 0x2729, 0x7352, 0x2969, 0x7357, 0x11A5,
+ 0x7358, 0x2968, 0x7359, 0x2971, 0x735A, 0x2970, 0x735B, 0x296E,
+ 0x735D, 0x296D, 0x735E, 0x296A, 0x735F, 0x296B, 0x7360, 0x296C,
+ 0x7361, 0x296F, 0x7362, 0x2972, 0x7365, 0x2BC8, 0x7366, 0x2BC5,
+ 0x7367, 0x2BC6, 0x7368, 0x12F9, 0x7369, 0x2BC4, 0x736A, 0x2BCA,
+ 0x736B, 0x2BC9, 0x736C, 0x2BC7, 0x736E, 0x2DA3, 0x736F, 0x2DA4,
+ 0x7370, 0x140E, 0x7372, 0x140F, 0x7373, 0x2DA2, 0x7375, 0x14F3,
+ 0x7376, 0x2F55, 0x7377, 0x14F2, 0x7378, 0x1595, 0x737A, 0x1596,
+ 0x737B, 0x1620, 0x737C, 0x31F8, 0x737D, 0x31F7, 0x737E, 0x32E2,
+ 0x737F, 0x3390, 0x7380, 0x16CA, 0x7381, 0x3426, 0x7382, 0x3425,
+ 0x7383, 0x3427, 0x7384, 0x0356, 0x7385, 0x1B7D, 0x7386, 0x092A,
+ 0x7387, 0x0B1F, 0x7388, 0x1F8E, 0x7389, 0x0357, 0x738A, 0x17B1,
+ 0x738B, 0x02EE, 0x738E, 0x180E, 0x7392, 0x18D1, 0x7393, 0x18CF,
+ 0x7394, 0x18D0, 0x7395, 0x18CD, 0x7396, 0x04EF, 0x7397, 0x18CE,
+ 0x739D, 0x1A0C, 0x739F, 0x0652, 0x73A0, 0x1A0A, 0x73A1, 0x1A06,
+ 0x73A2, 0x1A09, 0x73A4, 0x1A05, 0x73A5, 0x0654, 0x73A6, 0x1A08,
+ 0x73A8, 0x0651, 0x73A9, 0x0650, 0x73AB, 0x0653, 0x73AC, 0x1A0B,
+ 0x73AD, 0x1A07, 0x73B2, 0x079B, 0x73B3, 0x079E, 0x73B4, 0x1B85,
+ 0x73B5, 0x1B84, 0x73B6, 0x1B83, 0x73B7, 0x0798, 0x73B8, 0x1B8C,
+ 0x73B9, 0x1B82, 0x73BB, 0x079A, 0x73BC, 0x1D3D, 0x73BE, 0x1B89,
+ 0x73BF, 0x1B87, 0x73C0, 0x079D, 0x73C2, 0x1B7F, 0x73C3, 0x1B8A,
+ 0x73C5, 0x1B81, 0x73C6, 0x1B8B, 0x73C7, 0x1B88, 0x73C8, 0x1B80,
+ 0x73CA, 0x0799, 0x73CB, 0x1B8D, 0x73CC, 0x1B7E, 0x73CD, 0x079C,
+ 0x73D2, 0x1D42, 0x73D3, 0x1D39, 0x73D4, 0x1D44, 0x73D6, 0x1D3C,
+ 0x73D7, 0x1D47, 0x73D8, 0x1D48, 0x73D9, 0x1D3A, 0x73DA, 0x1D46,
+ 0x73DB, 0x1D43, 0x73DC, 0x1D41, 0x73DD, 0x1D45, 0x73DE, 0x0930,
+ 0x73E0, 0x092E, 0x73E3, 0x1D3F, 0x73E5, 0x1D3B, 0x73E7, 0x1D3E,
+ 0x73E8, 0x1D49, 0x73E9, 0x1D40, 0x73EA, 0x092F, 0x73EB, 0x1B86,
+ 0x73ED, 0x092B, 0x73EE, 0x092D, 0x73F4, 0x1F9C, 0x73F5, 0x1F91,
+ 0x73F6, 0x1F8F, 0x73F8, 0x1F90, 0x73FA, 0x1F97, 0x73FC, 0x1F98,
+ 0x73FD, 0x1F94, 0x73FE, 0x0B24, 0x73FF, 0x1F99, 0x7400, 0x1F96,
+ 0x7401, 0x1F93, 0x7403, 0x0B22, 0x7404, 0x1F92, 0x7405, 0x0B20,
+ 0x7406, 0x0B23, 0x7407, 0x1F95, 0x7408, 0x1F9D, 0x7409, 0x092C,
+ 0x740A, 0x0B21, 0x740B, 0x1F9B, 0x740C, 0x1F9A, 0x740D, 0x0B25,
+ 0x7416, 0x2215, 0x741A, 0x2216, 0x741B, 0x0CE0, 0x741D, 0x221C,
+ 0x7420, 0x221E, 0x7421, 0x2217, 0x7422, 0x0CDA, 0x7423, 0x221B,
+ 0x7424, 0x221A, 0x7425, 0x0CDB, 0x7426, 0x0CE1, 0x7428, 0x0CE2,
+ 0x7429, 0x221D, 0x742A, 0x0CD8, 0x742B, 0x2214, 0x742C, 0x2212,
+ 0x742D, 0x2218, 0x742E, 0x2211, 0x742F, 0x0CDF, 0x7430, 0x2213,
+ 0x7431, 0x2219, 0x7432, 0x221F, 0x7433, 0x0CD9, 0x7434, 0x0CDE,
+ 0x7435, 0x0CDC, 0x7436, 0x0CDD, 0x743A, 0x0CD7, 0x743F, 0x0E81,
+ 0x7440, 0x24A0, 0x7441, 0x0E80, 0x7442, 0x24A4, 0x7444, 0x249A,
+ 0x7446, 0x24A5, 0x744A, 0x249B, 0x744B, 0x249C, 0x744D, 0x24A6,
+ 0x744E, 0x24A3, 0x744F, 0x24A1, 0x7450, 0x24A2, 0x7451, 0x249E,
+ 0x7452, 0x249D, 0x7454, 0x24A7, 0x7455, 0x0E7D, 0x7457, 0x249F,
+ 0x7459, 0x0E82, 0x745A, 0x0E7C, 0x745B, 0x0E83, 0x745C, 0x0E84,
+ 0x745E, 0x0E7F, 0x745F, 0x0E7E, 0x7462, 0x272B, 0x7463, 0x102D,
+ 0x7464, 0x102C, 0x7467, 0x2730, 0x7469, 0x11A6, 0x746A, 0x102E,
+ 0x746D, 0x1030, 0x746E, 0x2731, 0x746F, 0x0E7B, 0x7470, 0x102F,
+ 0x7471, 0x272D, 0x7472, 0x272F, 0x7473, 0x272C, 0x7475, 0x272E,
+ 0x7479, 0x297C, 0x747C, 0x297B, 0x747D, 0x2978, 0x747E, 0x11A9,
+ 0x747F, 0x2BCB, 0x7480, 0x11AA, 0x7481, 0x2977, 0x7483, 0x11A8,
+ 0x7485, 0x2979, 0x7486, 0x2976, 0x7487, 0x2973, 0x7488, 0x297A,
+ 0x7489, 0x2974, 0x748A, 0x2975, 0x748B, 0x11A7, 0x7490, 0x2DA8,
+ 0x7492, 0x2BCF, 0x7494, 0x2BCE, 0x7495, 0x2BD0, 0x7497, 0x2DA5,
+ 0x7498, 0x12FC, 0x749A, 0x2BCC, 0x749C, 0x12FA, 0x749E, 0x12FE,
+ 0x749F, 0x12FD, 0x74A0, 0x2BCD, 0x74A1, 0x2BD1, 0x74A3, 0x12FB,
+ 0x74A5, 0x2DAC, 0x74A6, 0x1412, 0x74A7, 0x14F4, 0x74A8, 0x1413,
+ 0x74A9, 0x1410, 0x74AA, 0x2DA9, 0x74AB, 0x2DA7, 0x74AD, 0x2DAA,
+ 0x74AF, 0x2DAD, 0x74B0, 0x1411, 0x74B1, 0x2DAB, 0x74B2, 0x2DA6,
+ 0x74B5, 0x2F58, 0x74B6, 0x2F5B, 0x74B7, 0x30C2, 0x74B8, 0x2F56,
+ 0x74BA, 0x31F9, 0x74BB, 0x2F5C, 0x74BD, 0x1597, 0x74BE, 0x2F5A,
+ 0x74BF, 0x14F5, 0x74C0, 0x2F57, 0x74C1, 0x2F59, 0x74C2, 0x2F5D,
+ 0x74C3, 0x30C3, 0x74C5, 0x30C1, 0x74CA, 0x1598, 0x74CB, 0x30C0,
+ 0x74CF, 0x1621, 0x74D4, 0x167E, 0x74D5, 0x3392, 0x74D6, 0x167D,
+ 0x74D7, 0x3394, 0x74D8, 0x3391, 0x74D9, 0x3393, 0x74DA, 0x16FE,
+ 0x74DB, 0x348D, 0x74DC, 0x0358, 0x74DD, 0x1A0D, 0x74DE, 0x1D4A,
+ 0x74DF, 0x1D4B, 0x74E0, 0x0B26, 0x74E1, 0x24A8, 0x74E2, 0x12FF,
+ 0x74E3, 0x1599, 0x74E4, 0x16CB, 0x74E5, 0x348E, 0x74E6, 0x0359,
+ 0x74E8, 0x1A0E, 0x74E9, 0x0120, 0x74EC, 0x1B8E, 0x74EE, 0x1B8F,
+ 0x74F4, 0x1D4C, 0x74F5, 0x1D4D, 0x74F6, 0x0B27, 0x74F7, 0x0B28,
+ 0x74FB, 0x2220, 0x74FD, 0x24AB, 0x74FE, 0x24AA, 0x74FF, 0x24A9,
+ 0x7500, 0x2732, 0x7502, 0x2733, 0x7503, 0x2734, 0x7504, 0x1031,
+ 0x7507, 0x297E, 0x7508, 0x297D, 0x750B, 0x2BD2, 0x750C, 0x1300,
+ 0x750D, 0x1301, 0x750F, 0x2DB1, 0x7510, 0x2DAE, 0x7511, 0x2DAF,
+ 0x7512, 0x2DB0, 0x7513, 0x2F5F, 0x7514, 0x2F5E, 0x7515, 0x14F6,
+ 0x7516, 0x30C4, 0x7517, 0x32E3, 0x7518, 0x035A, 0x751A, 0x079F,
+ 0x751C, 0x0B29, 0x751D, 0x24AC, 0x751F, 0x035B, 0x7521, 0x1D4E,
+ 0x7522, 0x0B2A, 0x7525, 0x0CE3, 0x7526, 0x0CE4, 0x7528, 0x035C,
+ 0x7529, 0x035D, 0x752A, 0x180F, 0x752B, 0x04F1, 0x752C, 0x04F0,
+ 0x752D, 0x07A0, 0x752E, 0x1B90, 0x752F, 0x2221, 0x7530, 0x035E,
+ 0x7531, 0x035F, 0x7532, 0x0360, 0x7533, 0x0361, 0x7537, 0x04F2,
+ 0x7538, 0x04F3, 0x7539, 0x18D3, 0x753A, 0x18D2, 0x753D, 0x0655,
+ 0x753E, 0x1A11, 0x753F, 0x1A0F, 0x7540, 0x1A10, 0x7547, 0x1B91,
+ 0x7548, 0x1B92, 0x754B, 0x07A4, 0x754C, 0x07A2, 0x754E, 0x07A3,
+ 0x754F, 0x07A1, 0x7554, 0x0931, 0x7559, 0x0935, 0x755A, 0x0934,
+ 0x755B, 0x1D4F, 0x755C, 0x0933, 0x755D, 0x0932, 0x755F, 0x1D50,
+ 0x7562, 0x0B2D, 0x7563, 0x1F9F, 0x7564, 0x1F9E, 0x7565, 0x0B2B,
+ 0x7566, 0x0B2C, 0x756A, 0x0CE6, 0x756B, 0x0CE5, 0x756C, 0x2223,
+ 0x756F, 0x2222, 0x7570, 0x0B2E, 0x7576, 0x0E85, 0x7577, 0x24AE,
+ 0x7578, 0x0E86, 0x7579, 0x24AD, 0x757D, 0x2735, 0x757E, 0x297F,
+ 0x757F, 0x11AB, 0x7580, 0x2BD3, 0x7584, 0x2DB2, 0x7586, 0x159B,
+ 0x7587, 0x159A, 0x758A, 0x16CC, 0x758B, 0x0362, 0x758C, 0x1A12,
+ 0x758F, 0x0B2F, 0x7590, 0x2736, 0x7591, 0x1032, 0x7592, 0x022E,
+ 0x7594, 0x18D4, 0x7595, 0x18D5, 0x7598, 0x1A13, 0x7599, 0x0657,
+ 0x759A, 0x0658, 0x759D, 0x0656, 0x75A2, 0x07A8, 0x75A3, 0x07A9,
+ 0x75A4, 0x07A6, 0x75A5, 0x07A7, 0x75A7, 0x1B93, 0x75AA, 0x1B94,
+ 0x75AB, 0x07A5, 0x75B0, 0x1D51, 0x75B2, 0x0939, 0x75B3, 0x093A,
+ 0x75B5, 0x0B32, 0x75B6, 0x1D57, 0x75B8, 0x093F, 0x75B9, 0x093D,
+ 0x75BA, 0x1D58, 0x75BB, 0x1D53, 0x75BC, 0x093C, 0x75BD, 0x093B,
+ 0x75BE, 0x0936, 0x75BF, 0x1D56, 0x75C0, 0x1D55, 0x75C1, 0x1D52,
+ 0x75C2, 0x093E, 0x75C4, 0x1D54, 0x75C5, 0x0937, 0x75C7, 0x0938,
+ 0x75CA, 0x0B33, 0x75CB, 0x1FA3, 0x75CC, 0x1FA4, 0x75CD, 0x0B34,
+ 0x75CE, 0x1FA0, 0x75CF, 0x1FA2, 0x75D0, 0x1FA6, 0x75D1, 0x1FA5,
+ 0x75D2, 0x1FA1, 0x75D4, 0x0B30, 0x75D5, 0x0B31, 0x75D7, 0x222B,
+ 0x75D8, 0x0CEB, 0x75D9, 0x0CEA, 0x75DA, 0x2225, 0x75DB, 0x0CE8,
+ 0x75DD, 0x2228, 0x75DE, 0x0CEC, 0x75DF, 0x2229, 0x75E0, 0x0CED,
+ 0x75E1, 0x2226, 0x75E2, 0x0CE7, 0x75E3, 0x0CE9, 0x75E4, 0x222A,
+ 0x75E6, 0x2227, 0x75E7, 0x2224, 0x75ED, 0x24BB, 0x75EF, 0x24B0,
+ 0x75F0, 0x0E88, 0x75F1, 0x0E8B, 0x75F2, 0x0E8A, 0x75F3, 0x0E8F,
+ 0x75F4, 0x0E8E, 0x75F5, 0x24BC, 0x75F6, 0x24BA, 0x75F7, 0x24B3,
+ 0x75F8, 0x24B7, 0x75F9, 0x24B6, 0x75FA, 0x0E8C, 0x75FB, 0x24B9,
+ 0x75FC, 0x24B5, 0x75FD, 0x24BD, 0x75FE, 0x24B4, 0x75FF, 0x0E8D,
+ 0x7600, 0x0E87, 0x7601, 0x0E89, 0x7603, 0x24B2, 0x7608, 0x2738,
+ 0x7609, 0x1036, 0x760A, 0x273C, 0x760B, 0x1035, 0x760C, 0x2739,
+ 0x760D, 0x1034, 0x760F, 0x24B1, 0x7610, 0x24B8, 0x7611, 0x273B,
+ 0x7613, 0x1037, 0x7614, 0x273D, 0x7615, 0x273A, 0x7616, 0x2737,
+ 0x7619, 0x2982, 0x761A, 0x2986, 0x761B, 0x2988, 0x761C, 0x2984,
+ 0x761D, 0x2983, 0x761E, 0x2981, 0x761F, 0x11AE, 0x7620, 0x11AC,
+ 0x7621, 0x11B1, 0x7622, 0x11B2, 0x7623, 0x2985, 0x7624, 0x11AF,
+ 0x7625, 0x2980, 0x7626, 0x11B0, 0x7627, 0x1033, 0x7628, 0x2987,
+ 0x7629, 0x11AD, 0x762D, 0x2BD5, 0x762F, 0x2BD4, 0x7630, 0x2BDC,
+ 0x7631, 0x2BD6, 0x7632, 0x2BDB, 0x7633, 0x2BD8, 0x7634, 0x1302,
+ 0x7635, 0x2BDA, 0x7638, 0x1303, 0x763A, 0x1304, 0x763C, 0x2BD9,
+ 0x763D, 0x2BD7, 0x7642, 0x1415, 0x7643, 0x2DB3, 0x7646, 0x1414,
+ 0x7647, 0x2DB6, 0x7648, 0x2DB4, 0x7649, 0x2DB5, 0x764C, 0x1416,
+ 0x7650, 0x2F63, 0x7652, 0x14F9, 0x7653, 0x2F64, 0x7656, 0x14F7,
+ 0x7657, 0x2F65, 0x7658, 0x14F8, 0x7659, 0x2F62, 0x765A, 0x2F66,
+ 0x765C, 0x2F60, 0x765F, 0x159C, 0x7660, 0x30C5, 0x7661, 0x159D,
+ 0x7662, 0x1622, 0x7664, 0x2F61, 0x7665, 0x1623, 0x7669, 0x167F,
+ 0x766A, 0x32E4, 0x766C, 0x16CE, 0x766D, 0x3395, 0x766E, 0x16CD,
+ 0x7670, 0x3428, 0x7671, 0x1723, 0x7672, 0x1724, 0x7675, 0x3543,
+ 0x7676, 0x022F, 0x7678, 0x07AA, 0x7679, 0x1B95, 0x767B, 0x0CEE,
+ 0x767C, 0x0CEF, 0x767D, 0x0363, 0x767E, 0x03F5, 0x767F, 0x1810,
+ 0x7681, 0x18D6, 0x7682, 0x04F4, 0x7684, 0x0659, 0x7686, 0x07AB,
+ 0x7687, 0x07AC, 0x7688, 0x07AD, 0x7689, 0x1FA8, 0x768A, 0x1D59,
+ 0x768B, 0x0940, 0x768E, 0x0B35, 0x768F, 0x1FA7, 0x7692, 0x222D,
+ 0x7693, 0x0CF1, 0x7695, 0x222C, 0x7696, 0x0CF0, 0x7699, 0x24BE,
+ 0x769A, 0x11B3, 0x769B, 0x298C, 0x769C, 0x2989, 0x769D, 0x298A,
+ 0x769E, 0x298B, 0x76A4, 0x2DB7, 0x76A6, 0x2F67, 0x76AA, 0x31FB,
+ 0x76AB, 0x31FA, 0x76AD, 0x3396, 0x76AE, 0x0364, 0x76AF, 0x1A14,
+ 0x76B0, 0x0941, 0x76B4, 0x0CF2, 0x76B5, 0x24BF, 0x76B8, 0x273E,
+ 0x76BA, 0x11B4, 0x76BB, 0x2BDD, 0x76BD, 0x2F68, 0x76BE, 0x31FC,
+ 0x76BF, 0x0365, 0x76C2, 0x065A, 0x76C3, 0x07B0, 0x76C4, 0x1B96,
+ 0x76C5, 0x07B1, 0x76C6, 0x07AF, 0x76C8, 0x07AE, 0x76C9, 0x1D5A,
+ 0x76CA, 0x0942, 0x76CD, 0x0943, 0x76CE, 0x0944, 0x76D2, 0x0B37,
+ 0x76D3, 0x1FA9, 0x76D4, 0x0B36, 0x76DA, 0x222E, 0x76DB, 0x0B38,
+ 0x76DC, 0x0CF3, 0x76DD, 0x24C0, 0x76DE, 0x0E90, 0x76DF, 0x0E91,
+ 0x76E1, 0x1038, 0x76E3, 0x1039, 0x76E4, 0x11B5, 0x76E5, 0x1306,
+ 0x76E6, 0x2BDE, 0x76E7, 0x1305, 0x76E9, 0x2DB8, 0x76EA, 0x1417,
+ 0x76EC, 0x2F69, 0x76ED, 0x31FD, 0x76EE, 0x0366, 0x76EF, 0x04F5,
+ 0x76F0, 0x1A17, 0x76F1, 0x1A16, 0x76F2, 0x065B, 0x76F3, 0x1A15,
+ 0x76F4, 0x065C, 0x76F5, 0x1A18, 0x76F7, 0x1B9C, 0x76F8, 0x07B4,
+ 0x76F9, 0x07B3, 0x76FA, 0x1B9E, 0x76FB, 0x1B9D, 0x76FC, 0x07B8,
+ 0x76FE, 0x07B7, 0x7701, 0x07B2, 0x7703, 0x1B98, 0x7704, 0x1B99,
+ 0x7705, 0x1B9A, 0x7707, 0x07B9, 0x7708, 0x1B97, 0x7709, 0x07B5,
+ 0x770A, 0x1B9B, 0x770B, 0x07B6, 0x7710, 0x1D5D, 0x7711, 0x1D61,
+ 0x7712, 0x1D5F, 0x7713, 0x1D5E, 0x7715, 0x1D62, 0x7719, 0x1D63,
+ 0x771A, 0x1D64, 0x771B, 0x1D5C, 0x771D, 0x1D5B, 0x771F, 0x0946,
+ 0x7720, 0x0947, 0x7722, 0x1D65, 0x7723, 0x1D60, 0x7725, 0x1FB2,
+ 0x7727, 0x1D66, 0x7728, 0x0948, 0x7729, 0x0945, 0x772D, 0x1FAC,
+ 0x772F, 0x1FAB, 0x7731, 0x1FAD, 0x7732, 0x1FAE, 0x7733, 0x1FB0,
+ 0x7734, 0x1FAF, 0x7735, 0x1FB4, 0x7736, 0x0B3C, 0x7737, 0x0B39,
+ 0x7738, 0x0B3D, 0x7739, 0x1FAA, 0x773A, 0x0B3E, 0x773B, 0x1FB3,
+ 0x773C, 0x0B3B, 0x773D, 0x1FB1, 0x773E, 0x0B3A, 0x7744, 0x2231,
+ 0x7745, 0x2233, 0x7746, 0x222F, 0x7747, 0x2230, 0x774A, 0x2234,
+ 0x774B, 0x2236, 0x774C, 0x2237, 0x774D, 0x2232, 0x774E, 0x2235,
+ 0x774F, 0x0CF4, 0x7752, 0x24C4, 0x7754, 0x24C9, 0x7755, 0x24C1,
+ 0x7756, 0x24C5, 0x7759, 0x24CA, 0x775A, 0x24C6, 0x775B, 0x0E92,
+ 0x775C, 0x0E9A, 0x775E, 0x0E95, 0x775F, 0x24C2, 0x7760, 0x24C3,
+ 0x7761, 0x103D, 0x7762, 0x0E9D, 0x7763, 0x0E96, 0x7765, 0x0E9B,
+ 0x7766, 0x0E94, 0x7767, 0x24C8, 0x7768, 0x0E9C, 0x7769, 0x24C7,
+ 0x776A, 0x0E98, 0x776B, 0x0E93, 0x776C, 0x0E99, 0x776D, 0x24CB,
+ 0x776E, 0x2743, 0x776F, 0x2745, 0x7779, 0x0E97, 0x777C, 0x2740,
+ 0x777D, 0x103B, 0x777E, 0x2746, 0x777F, 0x103C, 0x7780, 0x2744,
+ 0x7781, 0x273F, 0x7782, 0x2742, 0x7783, 0x2747, 0x7784, 0x103A,
+ 0x7785, 0x2741, 0x7787, 0x11B7, 0x7788, 0x2990, 0x7789, 0x298F,
+ 0x778B, 0x11BA, 0x778C, 0x11B8, 0x778D, 0x298D, 0x778E, 0x11B6,
+ 0x778F, 0x298E, 0x7791, 0x11B9, 0x7795, 0x2BE6, 0x7797, 0x2BE8,
+ 0x7799, 0x2BE7, 0x779A, 0x2BDF, 0x779B, 0x2BE3, 0x779C, 0x2BE2,
+ 0x779D, 0x2BE0, 0x779E, 0x1308, 0x779F, 0x1309, 0x77A0, 0x1307,
+ 0x77A1, 0x2BE1, 0x77A2, 0x2BE4, 0x77A3, 0x2BE5, 0x77A5, 0x130A,
+ 0x77A7, 0x141C, 0x77A8, 0x2DC0, 0x77AA, 0x1419, 0x77AB, 0x2DBA,
+ 0x77AC, 0x141B, 0x77AD, 0x141D, 0x77B0, 0x141A, 0x77B1, 0x2DBF,
+ 0x77B2, 0x2DBB, 0x77B3, 0x1418, 0x77B4, 0x2DBE, 0x77B5, 0x2DB9,
+ 0x77B6, 0x2DBD, 0x77B7, 0x2DBC, 0x77BA, 0x2F6B, 0x77BB, 0x14FC,
+ 0x77BC, 0x14FD, 0x77BD, 0x14FA, 0x77BF, 0x14FB, 0x77C2, 0x2F6A,
+ 0x77C4, 0x30C8, 0x77C7, 0x159E, 0x77C9, 0x30C6, 0x77CA, 0x30C7,
+ 0x77CC, 0x31FE, 0x77CD, 0x3201, 0x77CE, 0x31FF, 0x77CF, 0x3200,
+ 0x77D0, 0x32E5, 0x77D3, 0x1680, 0x77D4, 0x3429, 0x77D5, 0x348F,
+ 0x77D7, 0x1725, 0x77D8, 0x34D3, 0x77D9, 0x34D4, 0x77DA, 0x1753,
+ 0x77DB, 0x0367, 0x77DC, 0x07BA, 0x77DE, 0x2238, 0x77E0, 0x24CC,
+ 0x77E2, 0x0368, 0x77E3, 0x04F6, 0x77E5, 0x065D, 0x77E7, 0x1B9F,
+ 0x77E8, 0x1BA0, 0x77E9, 0x0949, 0x77EC, 0x2239, 0x77ED, 0x0CF5,
+ 0x77EE, 0x0E9E, 0x77EF, 0x141E, 0x77F0, 0x2DC1, 0x77F1, 0x30C9,
+ 0x77F2, 0x3202, 0x77F3, 0x0369, 0x77F7, 0x1A1E, 0x77F8, 0x1A19,
+ 0x77F9, 0x1A1B, 0x77FA, 0x1A1D, 0x77FB, 0x1A1C, 0x77FC, 0x1A1A,
+ 0x77FD, 0x065E, 0x7802, 0x07BB, 0x7803, 0x1BA9, 0x7805, 0x1BA4,
+ 0x7806, 0x1BA1, 0x7809, 0x1BA8, 0x780C, 0x07BD, 0x780D, 0x07BE,
+ 0x780E, 0x1BA7, 0x780F, 0x1BA6, 0x7810, 0x1BA5, 0x7811, 0x1BA2,
+ 0x7812, 0x1BA3, 0x7813, 0x1BAA, 0x7814, 0x07BC, 0x781D, 0x094D,
+ 0x781F, 0x0953, 0x7820, 0x0952, 0x7821, 0x1D6F, 0x7822, 0x1D69,
+ 0x7823, 0x1D67, 0x7825, 0x0950, 0x7826, 0x1FBB, 0x7827, 0x094B,
+ 0x7828, 0x1D6C, 0x7829, 0x1D70, 0x782A, 0x1D72, 0x782B, 0x1D6E,
+ 0x782C, 0x1D68, 0x782D, 0x0951, 0x782E, 0x1D6D, 0x782F, 0x1D6B,
+ 0x7830, 0x094A, 0x7831, 0x1D73, 0x7832, 0x0954, 0x7833, 0x1D71,
+ 0x7834, 0x094E, 0x7835, 0x1D6A, 0x7837, 0x094F, 0x7838, 0x094C,
+ 0x7843, 0x0B40, 0x7845, 0x1FBC, 0x7848, 0x1FB5, 0x7849, 0x1FB7,
+ 0x784A, 0x1FB9, 0x784C, 0x1FBA, 0x784D, 0x1FB8, 0x784E, 0x0B41,
+ 0x7850, 0x1FBD, 0x7852, 0x1FB6, 0x785C, 0x223D, 0x785D, 0x0CF6,
+ 0x785E, 0x2245, 0x7860, 0x223A, 0x7862, 0x2246, 0x7864, 0x223B,
+ 0x7865, 0x223C, 0x7868, 0x2244, 0x7869, 0x2243, 0x786A, 0x2240,
+ 0x786B, 0x0B3F, 0x786C, 0x0CF7, 0x786D, 0x223E, 0x786E, 0x2241,
+ 0x786F, 0x0CF8, 0x7870, 0x2242, 0x7871, 0x223F, 0x7879, 0x24D7,
+ 0x787B, 0x24DB, 0x787C, 0x0EA5, 0x787E, 0x274D, 0x787F, 0x0EA8,
+ 0x7880, 0x24D9, 0x7881, 0x36E8, 0x7883, 0x24D6, 0x7884, 0x24D1,
+ 0x7885, 0x24D3, 0x7886, 0x24D4, 0x7887, 0x24CD, 0x7889, 0x0EA4,
+ 0x788C, 0x0EA3, 0x788E, 0x0E9F, 0x788F, 0x24D0, 0x7891, 0x0EA6,
+ 0x7893, 0x0EA7, 0x7894, 0x24CF, 0x7895, 0x24D2, 0x7896, 0x24DA,
+ 0x7897, 0x0EA1, 0x7898, 0x0EA2, 0x7899, 0x24D8, 0x789A, 0x24CE,
+ 0x789E, 0x274F, 0x789F, 0x103F, 0x78A0, 0x2751, 0x78A1, 0x24D5,
+ 0x78A2, 0x2753, 0x78A3, 0x1043, 0x78A4, 0x2754, 0x78A5, 0x2750,
+ 0x78A7, 0x1040, 0x78A8, 0x274C, 0x78A9, 0x1042, 0x78AA, 0x2749,
+ 0x78AB, 0x274E, 0x78AC, 0x2752, 0x78AD, 0x274B, 0x78B0, 0x0EA0,
+ 0x78B2, 0x2748, 0x78B3, 0x1041, 0x78B4, 0x274A, 0x78BA, 0x11BD,
+ 0x78BB, 0x2992, 0x78BC, 0x11C1, 0x78BE, 0x11BF, 0x78C1, 0x103E,
+ 0x78C3, 0x2999, 0x78C4, 0x299A, 0x78C5, 0x11BC, 0x78C8, 0x2998,
+ 0x78C9, 0x299B, 0x78CA, 0x11BE, 0x78CB, 0x11BB, 0x78CC, 0x2994,
+ 0x78CD, 0x2991, 0x78CE, 0x2996, 0x78CF, 0x2993, 0x78D0, 0x11C2,
+ 0x78D1, 0x2995, 0x78D4, 0x2997, 0x78D5, 0x11C0, 0x78DA, 0x130C,
+ 0x78DB, 0x2BEF, 0x78DD, 0x2BE9, 0x78DE, 0x2BED, 0x78DF, 0x2BF3,
+ 0x78E0, 0x2BF4, 0x78E1, 0x2BF0, 0x78E2, 0x2BF1, 0x78E3, 0x2BEE,
+ 0x78E5, 0x2BEB, 0x78E7, 0x130E, 0x78E8, 0x130B, 0x78E9, 0x2BEA,
+ 0x78EA, 0x2BEC, 0x78EC, 0x130D, 0x78ED, 0x2BF2, 0x78EF, 0x1422,
+ 0x78F2, 0x2DC8, 0x78F3, 0x2DC2, 0x78F4, 0x1421, 0x78F7, 0x141F,
+ 0x78F9, 0x2DCA, 0x78FA, 0x1420, 0x78FB, 0x2DC5, 0x78FC, 0x2DC6,
+ 0x78FD, 0x2DC3, 0x78FE, 0x2DCB, 0x78FF, 0x2DC7, 0x7901, 0x1423,
+ 0x7902, 0x2DC4, 0x7904, 0x2DCC, 0x7905, 0x2DC9, 0x7909, 0x2F6F,
+ 0x790C, 0x2F6C, 0x790E, 0x14FE, 0x7910, 0x2F70, 0x7911, 0x2F72,
+ 0x7912, 0x2F71, 0x7913, 0x2F6D, 0x7914, 0x2F6E, 0x7917, 0x30CE,
+ 0x7919, 0x159F, 0x791B, 0x30CB, 0x791C, 0x30CD, 0x791D, 0x30CA,
+ 0x791E, 0x30CF, 0x7921, 0x30CC, 0x7923, 0x3204, 0x7924, 0x3207,
+ 0x7925, 0x3203, 0x7926, 0x1624, 0x7927, 0x3205, 0x7928, 0x3206,
+ 0x7929, 0x3208, 0x792A, 0x1625, 0x792B, 0x1627, 0x792C, 0x1626,
+ 0x792D, 0x32E6, 0x792F, 0x32E8, 0x7931, 0x32E7, 0x7935, 0x3397,
+ 0x7938, 0x3490, 0x7939, 0x34D5, 0x793A, 0x036A, 0x793D, 0x18D7,
+ 0x793E, 0x065F, 0x793F, 0x1A20, 0x7940, 0x0660, 0x7941, 0x0661,
+ 0x7942, 0x1A1F, 0x7944, 0x1BAF, 0x7945, 0x1BAE, 0x7946, 0x07BF,
+ 0x7947, 0x07C2, 0x7948, 0x07C1, 0x7949, 0x07C0, 0x794A, 0x1BAB,
+ 0x794B, 0x1BAD, 0x794C, 0x1BAC, 0x794F, 0x1D76, 0x7950, 0x0956,
+ 0x7951, 0x1D7A, 0x7952, 0x1D79, 0x7953, 0x1D78, 0x7954, 0x1D74,
+ 0x7955, 0x0955, 0x7956, 0x0959, 0x7957, 0x095C, 0x795A, 0x095D,
+ 0x795B, 0x1D75, 0x795C, 0x1D77, 0x795D, 0x095B, 0x795E, 0x095A,
+ 0x795F, 0x0958, 0x7960, 0x0957, 0x7961, 0x1FC4, 0x7963, 0x1FC2,
+ 0x7964, 0x1FBE, 0x7965, 0x0B42, 0x7967, 0x1FBF, 0x7968, 0x0B43,
+ 0x7969, 0x1FC0, 0x796A, 0x1FC1, 0x796B, 0x1FC3, 0x796D, 0x0B44,
+ 0x7970, 0x224A, 0x7972, 0x2249, 0x7973, 0x2248, 0x7974, 0x2247,
+ 0x7979, 0x24DF, 0x797A, 0x0EA9, 0x797C, 0x24DC, 0x797D, 0x24DE,
+ 0x797F, 0x0EAA, 0x7981, 0x0EAB, 0x7982, 0x24DD, 0x7988, 0x275D,
+ 0x798A, 0x2756, 0x798B, 0x2757, 0x798D, 0x1046, 0x798E, 0x1044,
+ 0x798F, 0x1045, 0x7990, 0x275F, 0x7992, 0x275E, 0x7993, 0x275B,
+ 0x7994, 0x275A, 0x7995, 0x2759, 0x7996, 0x2758, 0x7997, 0x275C,
+ 0x7998, 0x2755, 0x799A, 0x299C, 0x799B, 0x29A1, 0x799C, 0x299F,
+ 0x79A0, 0x299E, 0x79A1, 0x299D, 0x79A2, 0x29A0, 0x79A4, 0x2BF5,
+ 0x79A6, 0x130F, 0x79A7, 0x1424, 0x79A8, 0x2DCE, 0x79AA, 0x1425,
+ 0x79AB, 0x2DCD, 0x79AC, 0x2F74, 0x79AD, 0x2F73, 0x79AE, 0x14FF,
+ 0x79B0, 0x30D0, 0x79B1, 0x15A0, 0x79B2, 0x3209, 0x79B3, 0x16CF,
+ 0x79B4, 0x3398, 0x79B6, 0x3492, 0x79B7, 0x3491, 0x79B8, 0x17B2,
+ 0x79B9, 0x07C3, 0x79BA, 0x07C4, 0x79BB, 0x1FC5, 0x79BD, 0x0EAD,
+ 0x79BE, 0x036B, 0x79BF, 0x04F9, 0x79C0, 0x04F8, 0x79C1, 0x04F7,
+ 0x79C5, 0x1A21, 0x79C8, 0x0663, 0x79C9, 0x0662, 0x79CB, 0x07C7,
+ 0x79CD, 0x1BB1, 0x79CE, 0x1BB4, 0x79CF, 0x1BB2, 0x79D1, 0x07C5,
+ 0x79D2, 0x07C6, 0x79D5, 0x1BB0, 0x79D6, 0x1BB3, 0x79D8, 0x0964,
+ 0x79DC, 0x1D81, 0x79DD, 0x1D83, 0x79DE, 0x1D82, 0x79DF, 0x0961,
+ 0x79E0, 0x1D7D, 0x79E3, 0x095F, 0x79E4, 0x095E, 0x79E6, 0x0962,
+ 0x79E7, 0x0960, 0x79E9, 0x0963, 0x79EA, 0x1D80, 0x79EB, 0x1D7B,
+ 0x79EC, 0x1D7C, 0x79ED, 0x1D7F, 0x79EE, 0x1D7E, 0x79F6, 0x1FC8,
+ 0x79F7, 0x1FC9, 0x79F8, 0x1FC7, 0x79FA, 0x1FC6, 0x79FB, 0x0B45,
+ 0x7A00, 0x0CFD, 0x7A02, 0x224B, 0x7A03, 0x224D, 0x7A04, 0x224F,
+ 0x7A05, 0x0CFC, 0x7A08, 0x0CFA, 0x7A0A, 0x224C, 0x7A0B, 0x0CFB,
+ 0x7A0C, 0x224E, 0x7A0D, 0x0CF9, 0x7A10, 0x24E9, 0x7A11, 0x24E0,
+ 0x7A12, 0x24E3, 0x7A13, 0x24E7, 0x7A14, 0x0EB1, 0x7A15, 0x24E5,
+ 0x7A17, 0x24E4, 0x7A18, 0x24E1, 0x7A19, 0x24E2, 0x7A1A, 0x0EAF,
+ 0x7A1B, 0x24E8, 0x7A1C, 0x0EAE, 0x7A1E, 0x0EB3, 0x7A1F, 0x0EB2,
+ 0x7A20, 0x0EB0, 0x7A22, 0x24E6, 0x7A26, 0x2765, 0x7A28, 0x2764,
+ 0x7A2B, 0x2760, 0x7A2E, 0x1047, 0x7A2F, 0x2763, 0x7A30, 0x2762,
+ 0x7A31, 0x1048, 0x7A37, 0x11C7, 0x7A39, 0x29A3, 0x7A3B, 0x11C8,
+ 0x7A3C, 0x11C4, 0x7A3D, 0x11C6, 0x7A3F, 0x11C3, 0x7A40, 0x11C5,
+ 0x7A44, 0x2BF6, 0x7A46, 0x1312, 0x7A47, 0x2BF8, 0x7A48, 0x2BF7,
+ 0x7A4A, 0x2761, 0x7A4B, 0x1314, 0x7A4C, 0x1313, 0x7A4D, 0x1310,
+ 0x7A4E, 0x1311, 0x7A54, 0x2DD3, 0x7A56, 0x2DD1, 0x7A57, 0x1426,
+ 0x7A58, 0x2DD2, 0x7A5A, 0x2DD4, 0x7A5B, 0x2DD0, 0x7A5C, 0x2DCF,
+ 0x7A5F, 0x2F75, 0x7A60, 0x1502, 0x7A61, 0x1500, 0x7A62, 0x1501,
+ 0x7A67, 0x30D1, 0x7A68, 0x30D2, 0x7A69, 0x15A2, 0x7A6B, 0x15A1,
+ 0x7A6C, 0x320B, 0x7A6D, 0x320C, 0x7A6E, 0x320A, 0x7A70, 0x3399,
+ 0x7A71, 0x339A, 0x7A74, 0x036C, 0x7A75, 0x1811, 0x7A76, 0x04FA,
+ 0x7A78, 0x1A22, 0x7A79, 0x0665, 0x7A7A, 0x0664, 0x7A7B, 0x1A23,
+ 0x7A7E, 0x1BB6, 0x7A7F, 0x07C8, 0x7A80, 0x1BB5, 0x7A81, 0x07C9,
+ 0x7A84, 0x0965, 0x7A85, 0x1D86, 0x7A86, 0x1D84, 0x7A87, 0x1D8A,
+ 0x7A88, 0x0966, 0x7A89, 0x1D85, 0x7A8A, 0x1D89, 0x7A8B, 0x1D87,
+ 0x7A8C, 0x1D88, 0x7A8F, 0x1FCA, 0x7A90, 0x1FCC, 0x7A92, 0x0B46,
+ 0x7A94, 0x1FCB, 0x7A95, 0x0B47, 0x7A96, 0x0D00, 0x7A97, 0x0CFF,
+ 0x7A98, 0x0CFE, 0x7A99, 0x2250, 0x7A9E, 0x24EC, 0x7A9F, 0x0EB4,
+ 0x7AA0, 0x0EB5, 0x7AA2, 0x24EB, 0x7AA3, 0x24EA, 0x7AA8, 0x2766,
+ 0x7AA9, 0x104A, 0x7AAA, 0x1049, 0x7AAB, 0x2767, 0x7AAC, 0x2768,
+ 0x7AAE, 0x11CA, 0x7AAF, 0x11C9, 0x7AB1, 0x2BFC, 0x7AB2, 0x29A4,
+ 0x7AB3, 0x29A6, 0x7AB4, 0x29A5, 0x7AB5, 0x2BFB, 0x7AB6, 0x2BF9,
+ 0x7AB7, 0x2BFD, 0x7AB8, 0x2BFA, 0x7ABA, 0x1315, 0x7ABE, 0x2DD5,
+ 0x7ABF, 0x1427, 0x7AC0, 0x2DD6, 0x7AC1, 0x2DD7, 0x7AC4, 0x1503,
+ 0x7AC5, 0x1504, 0x7AC7, 0x1628, 0x7ACA, 0x16FF, 0x7ACB, 0x036D,
+ 0x7AD1, 0x1BB7, 0x7AD8, 0x1D8B, 0x7AD9, 0x0967, 0x7ADF, 0x0BDE,
+ 0x7AE0, 0x0BDD, 0x7AE3, 0x0D02, 0x7AE4, 0x2252, 0x7AE5, 0x0D01,
+ 0x7AE6, 0x2251, 0x7AEB, 0x24ED, 0x7AED, 0x104B, 0x7AEE, 0x2769,
+ 0x7AEF, 0x104C, 0x7AF6, 0x1629, 0x7AF7, 0x320D, 0x7AF9, 0x03F6,
+ 0x7AFA, 0x0666, 0x7AFB, 0x1A24, 0x7AFD, 0x07CB, 0x7AFF, 0x07CA,
+ 0x7B00, 0x1BB8, 0x7B01, 0x1BB9, 0x7B04, 0x1D8D, 0x7B05, 0x1D8F,
+ 0x7B06, 0x0968, 0x7B08, 0x1D91, 0x7B09, 0x1D94, 0x7B0A, 0x1D92,
+ 0x7B0E, 0x1D93, 0x7B0F, 0x1D90, 0x7B10, 0x1D8C, 0x7B11, 0x0969,
+ 0x7B12, 0x1D95, 0x7B13, 0x1D8E, 0x7B18, 0x1FD5, 0x7B19, 0x0B4D,
+ 0x7B1A, 0x1FDE, 0x7B1B, 0x0B4A, 0x7B1D, 0x1FD7, 0x7B1E, 0x0B4E,
+ 0x7B20, 0x0B48, 0x7B22, 0x1FD2, 0x7B23, 0x1FDF, 0x7B24, 0x1FD3,
+ 0x7B25, 0x1FD0, 0x7B26, 0x0B4C, 0x7B28, 0x0B49, 0x7B2A, 0x1FD6,
+ 0x7B2B, 0x1FD9, 0x7B2C, 0x0B4B, 0x7B2D, 0x1FDA, 0x7B2E, 0x0B4F,
+ 0x7B2F, 0x1FDB, 0x7B30, 0x1FD1, 0x7B31, 0x1FD8, 0x7B32, 0x1FDC,
+ 0x7B33, 0x1FD4, 0x7B34, 0x1FCF, 0x7B35, 0x1FCD, 0x7B38, 0x1FDD,
+ 0x7B3B, 0x1FCE, 0x7B40, 0x2259, 0x7B44, 0x2255, 0x7B45, 0x225B,
+ 0x7B46, 0x0D05, 0x7B47, 0x2254, 0x7B48, 0x2256, 0x7B49, 0x0D03,
+ 0x7B4A, 0x2253, 0x7B4B, 0x0D0A, 0x7B4C, 0x2257, 0x7B4D, 0x0D09,
+ 0x7B4E, 0x2258, 0x7B4F, 0x0D0B, 0x7B50, 0x0D06, 0x7B51, 0x0D0C,
+ 0x7B52, 0x0D07, 0x7B54, 0x0D08, 0x7B56, 0x0D04, 0x7B58, 0x225A,
+ 0x7B60, 0x0EB8, 0x7B61, 0x24F8, 0x7B63, 0x24FB, 0x7B64, 0x24EF,
+ 0x7B65, 0x24F4, 0x7B66, 0x24EE, 0x7B67, 0x0EBA, 0x7B69, 0x24F2,
+ 0x7B6D, 0x24F0, 0x7B6E, 0x0EB9, 0x7B70, 0x24F7, 0x7B71, 0x24F6,
+ 0x7B72, 0x24F3, 0x7B73, 0x24F5, 0x7B74, 0x24F1, 0x7B75, 0x1050,
+ 0x7B76, 0x24FA, 0x7B77, 0x0EB6, 0x7B78, 0x24F9, 0x7B82, 0x2779,
+ 0x7B84, 0x1057, 0x7B85, 0x2774, 0x7B87, 0x1056, 0x7B88, 0x276A,
+ 0x7B8A, 0x276C, 0x7B8B, 0x104F, 0x7B8C, 0x2771, 0x7B8D, 0x2770,
+ 0x7B8E, 0x2773, 0x7B8F, 0x1054, 0x7B90, 0x276E, 0x7B91, 0x276D,
+ 0x7B94, 0x1053, 0x7B95, 0x104E, 0x7B96, 0x276F, 0x7B97, 0x1051,
+ 0x7B98, 0x2775, 0x7B99, 0x2777, 0x7B9B, 0x2772, 0x7B9C, 0x276B,
+ 0x7B9D, 0x1052, 0x7BA0, 0x11D2, 0x7BA1, 0x104D, 0x7BA4, 0x2778,
+ 0x7BAC, 0x29AA, 0x7BAD, 0x11CB, 0x7BAF, 0x29AC, 0x7BB1, 0x11CC,
+ 0x7BB4, 0x11CE, 0x7BB5, 0x29AF, 0x7BB7, 0x29A7, 0x7BB8, 0x1055,
+ 0x7BB9, 0x29AD, 0x7BBE, 0x29A9, 0x7BC0, 0x0EB7, 0x7BC1, 0x11D1,
+ 0x7BC4, 0x11CD, 0x7BC6, 0x11CF, 0x7BC7, 0x11D0, 0x7BC9, 0x1318,
+ 0x7BCA, 0x29AE, 0x7BCB, 0x29A8, 0x7BCC, 0x11D3, 0x7BCE, 0x29AB,
+ 0x7BD4, 0x2C07, 0x7BD5, 0x2C02, 0x7BD8, 0x2C0C, 0x7BD9, 0x1316,
+ 0x7BDA, 0x2C04, 0x7BDB, 0x131A, 0x7BDC, 0x2C0A, 0x7BDD, 0x2C01,
+ 0x7BDE, 0x2BFE, 0x7BDF, 0x2C0D, 0x7BE0, 0x142D, 0x7BE1, 0x131B,
+ 0x7BE2, 0x2C09, 0x7BE3, 0x2BFF, 0x7BE4, 0x1319, 0x7BE5, 0x2C03,
+ 0x7BE6, 0x131D, 0x7BE7, 0x2C00, 0x7BE8, 0x2C05, 0x7BE9, 0x131C,
+ 0x7BEA, 0x2C08, 0x7BEB, 0x2C0B, 0x7BF0, 0x2DE9, 0x7BF1, 0x2DEA,
+ 0x7BF2, 0x2DDA, 0x7BF3, 0x2DE1, 0x7BF4, 0x2DDF, 0x7BF7, 0x142B,
+ 0x7BF8, 0x2DE6, 0x7BF9, 0x2C06, 0x7BFB, 0x2DDD, 0x7BFD, 0x2DE7,
+ 0x7BFE, 0x142A, 0x7BFF, 0x2DDC, 0x7C00, 0x2DDB, 0x7C01, 0x2DE5,
+ 0x7C02, 0x2DE2, 0x7C03, 0x2DE4, 0x7C05, 0x2DD8, 0x7C06, 0x2DE8,
+ 0x7C07, 0x1428, 0x7C09, 0x2DE3, 0x7C0A, 0x2DEC, 0x7C0B, 0x2DE0,
+ 0x7C0C, 0x142C, 0x7C0D, 0x1429, 0x7C0E, 0x2DDE, 0x7C0F, 0x2DD9,
+ 0x7C10, 0x2DEB, 0x7C11, 0x1317, 0x7C19, 0x2F78, 0x7C1C, 0x2F76,
+ 0x7C1D, 0x2F7C, 0x7C1E, 0x1508, 0x7C1F, 0x2F7A, 0x7C20, 0x2F79,
+ 0x7C21, 0x150A, 0x7C22, 0x2F7F, 0x7C23, 0x1509, 0x7C25, 0x2F80,
+ 0x7C26, 0x2F7D, 0x7C27, 0x1506, 0x7C28, 0x2F7E, 0x7C29, 0x2F77,
+ 0x7C2A, 0x1507, 0x7C2B, 0x1505, 0x7C2C, 0x30D6, 0x7C2D, 0x2F7B,
+ 0x7C30, 0x2F81, 0x7C33, 0x30D3, 0x7C37, 0x15A7, 0x7C38, 0x15A5,
+ 0x7C39, 0x30D5, 0x7C3B, 0x30D7, 0x7C3C, 0x30D4, 0x7C3D, 0x15A6,
+ 0x7C3E, 0x15A3, 0x7C3F, 0x15A4, 0x7C40, 0x15A8, 0x7C43, 0x162B,
+ 0x7C45, 0x3212, 0x7C47, 0x3211, 0x7C48, 0x320F, 0x7C49, 0x320E,
+ 0x7C4A, 0x3210, 0x7C4C, 0x162A, 0x7C4D, 0x162C, 0x7C50, 0x1681,
+ 0x7C53, 0x32EA, 0x7C54, 0x32E9, 0x7C57, 0x339B, 0x7C59, 0x339D,
+ 0x7C5A, 0x339F, 0x7C5B, 0x339E, 0x7C5C, 0x339C, 0x7C5F, 0x16D1,
+ 0x7C60, 0x16D0, 0x7C63, 0x1701, 0x7C64, 0x1700, 0x7C65, 0x1702,
+ 0x7C66, 0x342B, 0x7C67, 0x342A, 0x7C69, 0x34D6, 0x7C6A, 0x3493,
+ 0x7C6B, 0x34D7, 0x7C6C, 0x1745, 0x7C6E, 0x1746, 0x7C6F, 0x3507,
+ 0x7C72, 0x176B, 0x7C73, 0x03F7, 0x7C75, 0x1A25, 0x7C78, 0x1BBB,
+ 0x7C79, 0x1BBC, 0x7C7A, 0x1BBA, 0x7C7D, 0x07CC, 0x7C7F, 0x1BBD,
+ 0x7C80, 0x1BBE, 0x7C81, 0x1BBF, 0x7C84, 0x1D96, 0x7C85, 0x1D9C,
+ 0x7C88, 0x1D9A, 0x7C89, 0x096A, 0x7C8A, 0x1D98, 0x7C8C, 0x1D99,
+ 0x7C8D, 0x1D9B, 0x7C91, 0x1D97, 0x7C92, 0x0B50, 0x7C94, 0x1FE0,
+ 0x7C95, 0x0B52, 0x7C96, 0x1FE2, 0x7C97, 0x0B51, 0x7C98, 0x1FE1,
+ 0x7C9E, 0x225D, 0x7C9F, 0x0D0D, 0x7CA1, 0x225F, 0x7CA2, 0x225C,
+ 0x7CA3, 0x1FE3, 0x7CA5, 0x0D0E, 0x7CA7, 0x36ED, 0x7CA8, 0x225E,
+ 0x7CAF, 0x24FE, 0x7CB1, 0x0EBB, 0x7CB2, 0x24FC, 0x7CB3, 0x0EBC,
+ 0x7CB4, 0x24FD, 0x7CB5, 0x0EBD, 0x7CB9, 0x1058, 0x7CBA, 0x277D,
+ 0x7CBB, 0x277A, 0x7CBC, 0x277C, 0x7CBD, 0x1059, 0x7CBE, 0x105A,
+ 0x7CBF, 0x277B, 0x7CC5, 0x29B0, 0x7CC8, 0x29B1, 0x7CCA, 0x11D4,
+ 0x7CCB, 0x29B3, 0x7CCC, 0x29B2, 0x7CCE, 0x0121, 0x7CD0, 0x2C11,
+ 0x7CD1, 0x2C12, 0x7CD2, 0x2C0E, 0x7CD4, 0x2C0F, 0x7CD5, 0x131E,
+ 0x7CD6, 0x131F, 0x7CD7, 0x2C10, 0x7CD9, 0x1433, 0x7CDC, 0x142F,
+ 0x7CDD, 0x1434, 0x7CDE, 0x1430, 0x7CDF, 0x1432, 0x7CE0, 0x142E,
+ 0x7CE2, 0x1431, 0x7CE7, 0x150B, 0x7CE8, 0x2DED, 0x7CEA, 0x30D9,
+ 0x7CEC, 0x30D8, 0x7CEE, 0x3213, 0x7CEF, 0x162D, 0x7CF0, 0x162E,
+ 0x7CF1, 0x33A1, 0x7CF2, 0x32EB, 0x7CF4, 0x33A0, 0x7CF6, 0x34D8,
+ 0x7CF7, 0x351D, 0x7CF8, 0x03F8, 0x7CFB, 0x04FB, 0x7CFD, 0x1A26,
+ 0x7CFE, 0x0667, 0x7D00, 0x07CF, 0x7D01, 0x1BC2, 0x7D02, 0x07CD,
+ 0x7D03, 0x1BC0, 0x7D04, 0x07D2, 0x7D05, 0x07CE, 0x7D06, 0x07D3,
+ 0x7D07, 0x07D1, 0x7D08, 0x1BC1, 0x7D09, 0x07D0, 0x7D0A, 0x096E,
+ 0x7D0B, 0x096D, 0x7D0C, 0x1DA7, 0x7D0D, 0x0976, 0x7D0E, 0x1DA0,
+ 0x7D0F, 0x1DA6, 0x7D10, 0x0972, 0x7D11, 0x1D9F, 0x7D12, 0x1DA5,
+ 0x7D13, 0x1DA3, 0x7D14, 0x0971, 0x7D15, 0x0973, 0x7D16, 0x1DA2,
+ 0x7D17, 0x096C, 0x7D18, 0x1DA1, 0x7D19, 0x0977, 0x7D1A, 0x0974,
+ 0x7D1B, 0x0978, 0x7D1C, 0x0975, 0x7D1D, 0x1D9E, 0x7D1E, 0x1D9D,
+ 0x7D1F, 0x1DA4, 0x7D20, 0x096F, 0x7D21, 0x096B, 0x7D22, 0x0970,
+ 0x7D28, 0x1FF2, 0x7D29, 0x1FEB, 0x7D2B, 0x0D13, 0x7D2C, 0x1FEA,
+ 0x7D2E, 0x0B56, 0x7D2F, 0x0B5D, 0x7D30, 0x0B5A, 0x7D31, 0x0B60,
+ 0x7D32, 0x0B5F, 0x7D33, 0x0B5B, 0x7D35, 0x1FE4, 0x7D36, 0x1FE7,
+ 0x7D38, 0x1FE6, 0x7D39, 0x0B57, 0x7D3A, 0x1FE8, 0x7D3B, 0x1FF1,
+ 0x7D3C, 0x0B58, 0x7D3D, 0x1FE5, 0x7D3E, 0x1FEE, 0x7D3F, 0x1FEF,
+ 0x7D40, 0x0B59, 0x7D41, 0x1FEC, 0x7D42, 0x0B5E, 0x7D43, 0x0B54,
+ 0x7D44, 0x0B5C, 0x7D45, 0x1FE9, 0x7D46, 0x0B53, 0x7D47, 0x1FED,
+ 0x7D4A, 0x1FF0, 0x7D4E, 0x2270, 0x7D4F, 0x2267, 0x7D50, 0x0D10,
+ 0x7D51, 0x226E, 0x7D52, 0x226B, 0x7D53, 0x2263, 0x7D54, 0x226C,
+ 0x7D55, 0x0D12, 0x7D56, 0x2264, 0x7D58, 0x2260, 0x7D5B, 0x0EC3,
+ 0x7D5C, 0x2269, 0x7D5E, 0x0D0F, 0x7D5F, 0x226F, 0x7D61, 0x0D16,
+ 0x7D62, 0x0D18, 0x7D63, 0x2262, 0x7D66, 0x0D17, 0x7D67, 0x2265,
+ 0x7D68, 0x0D11, 0x7D69, 0x226D, 0x7D6A, 0x2266, 0x7D6B, 0x226A,
+ 0x7D6D, 0x2268, 0x7D6E, 0x0D14, 0x7D6F, 0x2261, 0x7D70, 0x0D19,
+ 0x7D71, 0x0B55, 0x7D72, 0x0D15, 0x7D73, 0x0D1A, 0x7D79, 0x0EBF,
+ 0x7D7A, 0x2505, 0x7D7B, 0x2507, 0x7D7C, 0x2509, 0x7D7D, 0x250D,
+ 0x7D7F, 0x2503, 0x7D80, 0x2501, 0x7D81, 0x0EC1, 0x7D83, 0x2508,
+ 0x7D84, 0x250C, 0x7D85, 0x2504, 0x7D86, 0x2500, 0x7D88, 0x24FF,
+ 0x7D8C, 0x250A, 0x7D8D, 0x2502, 0x7D8E, 0x2506, 0x7D8F, 0x0EC2,
+ 0x7D91, 0x0EC0, 0x7D92, 0x250E, 0x7D93, 0x0EBE, 0x7D94, 0x250B,
+ 0x7D96, 0x278E, 0x7D9C, 0x105D, 0x7D9D, 0x2786, 0x7D9E, 0x11E1,
+ 0x7D9F, 0x2790, 0x7DA0, 0x1060, 0x7DA1, 0x2794, 0x7DA2, 0x1066,
+ 0x7DA3, 0x2781, 0x7DA6, 0x2791, 0x7DA7, 0x277E, 0x7DA9, 0x2793,
+ 0x7DAA, 0x2782, 0x7DAC, 0x106D, 0x7DAD, 0x106A, 0x7DAE, 0x2792,
+ 0x7DAF, 0x278C, 0x7DB0, 0x105C, 0x7DB1, 0x1064, 0x7DB2, 0x1063,
+ 0x7DB4, 0x1062, 0x7DB5, 0x1068, 0x7DB7, 0x277F, 0x7DB8, 0x1069,
+ 0x7DB9, 0x278D, 0x7DBA, 0x1065, 0x7DBB, 0x105B, 0x7DBC, 0x278F,
+ 0x7DBD, 0x105E, 0x7DBE, 0x105F, 0x7DBF, 0x1067, 0x7DC0, 0x2784,
+ 0x7DC1, 0x2783, 0x7DC2, 0x2780, 0x7DC4, 0x2788, 0x7DC5, 0x2785,
+ 0x7DC6, 0x2789, 0x7DC7, 0x106C, 0x7DC9, 0x2795, 0x7DCA, 0x1061,
+ 0x7DCB, 0x278A, 0x7DCC, 0x278B, 0x7DCE, 0x2787, 0x7DD2, 0x106B,
+ 0x7DD7, 0x29B8, 0x7DD8, 0x11D9, 0x7DD9, 0x11E2, 0x7DDA, 0x11DE,
+ 0x7DDB, 0x29B5, 0x7DDD, 0x11DB, 0x7DDE, 0x11DF, 0x7DDF, 0x29C1,
+ 0x7DE0, 0x11D5, 0x7DE1, 0x29B9, 0x7DE3, 0x11DD, 0x7DE6, 0x29BC,
+ 0x7DE7, 0x29B7, 0x7DE8, 0x11DC, 0x7DE9, 0x11E0, 0x7DEA, 0x29B6,
+ 0x7DEC, 0x11DA, 0x7DEE, 0x29C0, 0x7DEF, 0x11D7, 0x7DF0, 0x29BF,
+ 0x7DF1, 0x29BE, 0x7DF2, 0x11E3, 0x7DF3, 0x28C8, 0x7DF4, 0x11D6,
+ 0x7DF6, 0x29BD, 0x7DF7, 0x29B4, 0x7DF9, 0x11E4, 0x7DFA, 0x29BB,
+ 0x7DFB, 0x11D8, 0x7E03, 0x29BA, 0x7E08, 0x1322, 0x7E09, 0x1327,
+ 0x7E0A, 0x1320, 0x7E0B, 0x2C1F, 0x7E0C, 0x2C16, 0x7E0D, 0x2C22,
+ 0x7E0E, 0x2C1A, 0x7E0F, 0x2C20, 0x7E10, 0x1328, 0x7E11, 0x1321,
+ 0x7E12, 0x2C13, 0x7E13, 0x2C19, 0x7E14, 0x2C23, 0x7E15, 0x2C1C,
+ 0x7E16, 0x2C21, 0x7E17, 0x2C15, 0x7E1A, 0x2C1D, 0x7E1B, 0x1323,
+ 0x7E1C, 0x2C1B, 0x7E1D, 0x1326, 0x7E1E, 0x1325, 0x7E1F, 0x2C17,
+ 0x7E20, 0x2C18, 0x7E21, 0x2C14, 0x7E22, 0x2C1E, 0x7E23, 0x1324,
+ 0x7E24, 0x2C25, 0x7E25, 0x2C24, 0x7E29, 0x2DF8, 0x7E2A, 0x2DF4,
+ 0x7E2B, 0x143B, 0x7E2D, 0x2DEE, 0x7E2E, 0x1435, 0x7E2F, 0x1445,
+ 0x7E30, 0x2DFA, 0x7E31, 0x143D, 0x7E32, 0x1439, 0x7E33, 0x2DF1,
+ 0x7E34, 0x1440, 0x7E35, 0x1443, 0x7E36, 0x2DFC, 0x7E37, 0x1438,
+ 0x7E38, 0x2DF3, 0x7E39, 0x1441, 0x7E3A, 0x2DFE, 0x7E3B, 0x2DFB,
+ 0x7E3C, 0x2DEF, 0x7E3D, 0x143C, 0x7E3E, 0x1436, 0x7E3F, 0x1444,
+ 0x7E40, 0x2DF6, 0x7E41, 0x143F, 0x7E42, 0x2DF0, 0x7E43, 0x143A,
+ 0x7E44, 0x2DFD, 0x7E45, 0x143E, 0x7E46, 0x1437, 0x7E47, 0x2DF7,
+ 0x7E48, 0x1442, 0x7E49, 0x2DF5, 0x7E4C, 0x2DF9, 0x7E50, 0x2F83,
+ 0x7E51, 0x2F89, 0x7E52, 0x1511, 0x7E53, 0x2F8C, 0x7E54, 0x150C,
+ 0x7E55, 0x150D, 0x7E56, 0x2F84, 0x7E57, 0x2F8B, 0x7E58, 0x2F86,
+ 0x7E59, 0x1512, 0x7E5A, 0x150F, 0x7E5C, 0x2F82, 0x7E5E, 0x150E,
+ 0x7E5F, 0x2F88, 0x7E60, 0x2F8A, 0x7E61, 0x1510, 0x7E62, 0x2F87,
+ 0x7E63, 0x2F85, 0x7E68, 0x30E3, 0x7E69, 0x15AC, 0x7E6A, 0x15AD,
+ 0x7E6B, 0x15A9, 0x7E6D, 0x15AA, 0x7E6F, 0x30DF, 0x7E70, 0x30DD,
+ 0x7E72, 0x30E1, 0x7E73, 0x15AE, 0x7E74, 0x30E2, 0x7E75, 0x30DB,
+ 0x7E76, 0x30DA, 0x7E77, 0x30DE, 0x7E78, 0x30DC, 0x7E79, 0x15AB,
+ 0x7E7A, 0x30E0, 0x7E7B, 0x3214, 0x7E7C, 0x1631, 0x7E7D, 0x1630,
+ 0x7E7E, 0x3215, 0x7E80, 0x3217, 0x7E81, 0x3216, 0x7E82, 0x1632,
+ 0x7E86, 0x32F0, 0x7E87, 0x32ED, 0x7E88, 0x32EE, 0x7E8A, 0x32EC,
+ 0x7E8B, 0x32EF, 0x7E8C, 0x1683, 0x7E8D, 0x32F1, 0x7E8F, 0x1682,
+ 0x7E91, 0x33A2, 0x7E93, 0x1703, 0x7E94, 0x1705, 0x7E95, 0x342C,
+ 0x7E96, 0x1704, 0x7E97, 0x3494, 0x7E98, 0x34DA, 0x7E99, 0x34DC,
+ 0x7E9A, 0x34D9, 0x7E9B, 0x34DB, 0x7E9C, 0x1759, 0x7F36, 0x03F9,
+ 0x7F38, 0x07D4, 0x7F39, 0x1D1F, 0x7F3A, 0x0979, 0x7F3D, 0x0B61,
+ 0x7F3E, 0x2271, 0x7F3F, 0x2272, 0x7F43, 0x2C26, 0x7F44, 0x1446,
+ 0x7F45, 0x2DFF, 0x7F48, 0x1513, 0x7F4A, 0x30E5, 0x7F4B, 0x30E4,
+ 0x7F4C, 0x1633, 0x7F4D, 0x32F2, 0x7F4F, 0x33A3, 0x7F50, 0x1726,
+ 0x7F51, 0x1812, 0x7F54, 0x0668, 0x7F55, 0x04FC, 0x7F58, 0x1BC3,
+ 0x7F5B, 0x1DAD, 0x7F5C, 0x1DA8, 0x7F5D, 0x1DAC, 0x7F5E, 0x1DAA,
+ 0x7F5F, 0x097A, 0x7F60, 0x1DAB, 0x7F61, 0x1DA9, 0x7F63, 0x1FF3,
+ 0x7F65, 0x2273, 0x7F66, 0x2274, 0x7F67, 0x2511, 0x7F68, 0x2512,
+ 0x7F69, 0x0EC5, 0x7F6A, 0x0EC6, 0x7F6B, 0x2510, 0x7F6C, 0x2513,
+ 0x7F6D, 0x250F, 0x7F6E, 0x0EC4, 0x7F70, 0x106E, 0x7F72, 0x0EC7,
+ 0x7F73, 0x2796, 0x7F75, 0x11E5, 0x7F76, 0x29C2, 0x7F77, 0x11E6,
+ 0x7F79, 0x1329, 0x7F7A, 0x2C29, 0x7F7B, 0x2C27, 0x7F7C, 0x2C28,
+ 0x7F7D, 0x2E02, 0x7F7E, 0x2E01, 0x7F7F, 0x2E00, 0x7F83, 0x30E6,
+ 0x7F85, 0x15AF, 0x7F86, 0x30E7, 0x7F87, 0x33A4, 0x7F88, 0x1727,
+ 0x7F89, 0x3495, 0x7F8A, 0x03FA, 0x7F8B, 0x066A, 0x7F8C, 0x0669,
+ 0x7F8D, 0x1BC5, 0x7F8E, 0x07D5, 0x7F91, 0x1BC4, 0x7F92, 0x1DAF,
+ 0x7F94, 0x097B, 0x7F95, 0x1FF4, 0x7F96, 0x1DAE, 0x7F9A, 0x0B63,
+ 0x7F9B, 0x1FF7, 0x7F9C, 0x1FF5, 0x7F9D, 0x1FF6, 0x7F9E, 0x0B62,
+ 0x7FA0, 0x2276, 0x7FA1, 0x2277, 0x7FA2, 0x2275, 0x7FA4, 0x0ECA,
+ 0x7FA5, 0x2515, 0x7FA6, 0x2514, 0x7FA7, 0x2516, 0x7FA8, 0x0EC9,
+ 0x7FA9, 0x0EC8, 0x7FAC, 0x29C3, 0x7FAD, 0x29C5, 0x7FAF, 0x11E7,
+ 0x7FB0, 0x29C4, 0x7FB1, 0x2C2A, 0x7FB2, 0x132A, 0x7FB3, 0x2F8E,
+ 0x7FB5, 0x2F8D, 0x7FB6, 0x15B0, 0x7FB7, 0x30E8, 0x7FB8, 0x15B2,
+ 0x7FB9, 0x15B1, 0x7FBA, 0x3218, 0x7FBB, 0x32F3, 0x7FBC, 0x1684,
+ 0x7FBD, 0x03FB, 0x7FBE, 0x1BC6, 0x7FBF, 0x07D6, 0x7FC0, 0x1DB2,
+ 0x7FC1, 0x097D, 0x7FC2, 0x1DB1, 0x7FC3, 0x1DB0, 0x7FC5, 0x097C,
+ 0x7FC7, 0x1FFD, 0x7FC9, 0x1FFF, 0x7FCA, 0x1FF8, 0x7FCB, 0x1FF9,
+ 0x7FCC, 0x0B64, 0x7FCD, 0x1FFA, 0x7FCE, 0x0B65, 0x7FCF, 0x1FFE,
+ 0x7FD0, 0x1FFB, 0x7FD1, 0x1FFC, 0x7FD2, 0x0B66, 0x7FD4, 0x0D1C,
+ 0x7FD5, 0x0D1D, 0x7FD7, 0x2278, 0x7FDB, 0x2517, 0x7FDC, 0x2518,
+ 0x7FDE, 0x279A, 0x7FDF, 0x1071, 0x7FE0, 0x106F, 0x7FE1, 0x1070,
+ 0x7FE2, 0x2797, 0x7FE3, 0x2798, 0x7FE5, 0x2799, 0x7FE6, 0x29CA,
+ 0x7FE8, 0x29CB, 0x7FE9, 0x11E8, 0x7FEA, 0x29C8, 0x7FEB, 0x29C7,
+ 0x7FEC, 0x29C9, 0x7FED, 0x29C6, 0x7FEE, 0x132D, 0x7FEF, 0x2C2B,
+ 0x7FF0, 0x132B, 0x7FF1, 0x132C, 0x7FF2, 0x2E04, 0x7FF3, 0x1447,
+ 0x7FF4, 0x2E03, 0x7FF5, 0x2EFF, 0x7FF7, 0x2F8F, 0x7FF8, 0x2F90,
+ 0x7FF9, 0x1514, 0x7FFB, 0x1515, 0x7FFC, 0x1448, 0x7FFD, 0x30E9,
+ 0x7FFE, 0x30EA, 0x7FFF, 0x3219, 0x8000, 0x1634, 0x8001, 0x03FC,
+ 0x8003, 0x03FD, 0x8004, 0x097F, 0x8005, 0x066B, 0x8006, 0x097E,
+ 0x8007, 0x1BC7, 0x800B, 0x0D1E, 0x800C, 0x03FE, 0x800D, 0x07D8,
+ 0x800E, 0x1BC8, 0x800F, 0x1BC9, 0x8010, 0x07D7, 0x8011, 0x07D9,
+ 0x8012, 0x03FF, 0x8014, 0x1BCA, 0x8015, 0x0981, 0x8016, 0x1DB3,
+ 0x8017, 0x0983, 0x8018, 0x0980, 0x8019, 0x0982, 0x801B, 0x2002,
+ 0x801C, 0x0B67, 0x801E, 0x2001, 0x801F, 0x2000, 0x8021, 0x2519,
+ 0x8024, 0x279B, 0x8026, 0x11E9, 0x8028, 0x132E, 0x8029, 0x2C2D,
+ 0x802A, 0x2C2C, 0x802C, 0x2E05, 0x8030, 0x32F4, 0x8033, 0x0400,
+ 0x8034, 0x18D8, 0x8035, 0x1A27, 0x8036, 0x07DA, 0x8037, 0x1BCB,
+ 0x8039, 0x1DB5, 0x803D, 0x0984, 0x803E, 0x1DB4, 0x803F, 0x0985,
+ 0x8043, 0x2004, 0x8046, 0x0B69, 0x8047, 0x2003, 0x8048, 0x2005,
+ 0x804A, 0x0B68, 0x804F, 0x227A, 0x8050, 0x227B, 0x8051, 0x2279,
+ 0x8052, 0x0D1F, 0x8056, 0x0ECB, 0x8058, 0x0ECC, 0x805A, 0x1073,
+ 0x805C, 0x279D, 0x805D, 0x279C, 0x805E, 0x1072, 0x8064, 0x29CC,
+ 0x8067, 0x29CD, 0x806C, 0x2C2E, 0x806F, 0x144C, 0x8070, 0x144B,
+ 0x8071, 0x1449, 0x8072, 0x144A, 0x8073, 0x144D, 0x8075, 0x2F91,
+ 0x8076, 0x1517, 0x8077, 0x1516, 0x8078, 0x30EB, 0x8079, 0x321A,
+ 0x807D, 0x16D3, 0x807E, 0x16D2, 0x807F, 0x0401, 0x8082, 0x1CEC,
+ 0x8084, 0x0ECE, 0x8085, 0x0D20, 0x8086, 0x0ECD, 0x8087, 0x1074,
+ 0x8089, 0x0402, 0x808A, 0x17B3, 0x808B, 0x0403, 0x808C, 0x0404,
+ 0x808F, 0x1A28, 0x8090, 0x18DB, 0x8092, 0x18DC, 0x8093, 0x04FE,
+ 0x8095, 0x18D9, 0x8096, 0x04FD, 0x8098, 0x0500, 0x8099, 0x18DA,
+ 0x809A, 0x0502, 0x809B, 0x0501, 0x809C, 0x18DD, 0x809D, 0x04FF,
+ 0x80A1, 0x0670, 0x80A2, 0x066E, 0x80A3, 0x1A2A, 0x80A5, 0x066D,
+ 0x80A9, 0x0672, 0x80AA, 0x0674, 0x80AB, 0x0671, 0x80AD, 0x1A2D,
+ 0x80AE, 0x1A29, 0x80AF, 0x0675, 0x80B1, 0x066F, 0x80B2, 0x0503,
+ 0x80B4, 0x0673, 0x80B5, 0x1A2C, 0x80B8, 0x1A2B, 0x80BA, 0x066C,
+ 0x80C2, 0x1BD1, 0x80C3, 0x07DE, 0x80C4, 0x07DF, 0x80C5, 0x1BD3,
+ 0x80C7, 0x1BCD, 0x80C8, 0x1BD0, 0x80C9, 0x1BD9, 0x80CA, 0x1BD7,
+ 0x80CC, 0x07E0, 0x80CD, 0x1BDD, 0x80CE, 0x07E3, 0x80CF, 0x1BDA,
+ 0x80D0, 0x1BD2, 0x80D1, 0x1BCF, 0x80D4, 0x227D, 0x80D5, 0x1BD8,
+ 0x80D6, 0x07DB, 0x80D7, 0x1BDB, 0x80D8, 0x1BCC, 0x80D9, 0x1BD5,
+ 0x80DA, 0x07DD, 0x80DB, 0x07E2, 0x80DC, 0x1BD6, 0x80DD, 0x07E6,
+ 0x80DE, 0x07E4, 0x80E0, 0x1BCE, 0x80E1, 0x07E1, 0x80E3, 0x1BD4,
+ 0x80E4, 0x07E5, 0x80E5, 0x07DC, 0x80E6, 0x1BDC, 0x80ED, 0x098A,
+ 0x80EF, 0x0993, 0x80F0, 0x0988, 0x80F1, 0x0986, 0x80F2, 0x1DB7,
+ 0x80F3, 0x098E, 0x80F4, 0x098B, 0x80F5, 0x1DB9, 0x80F8, 0x098D,
+ 0x80F9, 0x1DB8, 0x80FA, 0x1DB6, 0x80FB, 0x1DBB, 0x80FC, 0x0992,
+ 0x80FD, 0x0990, 0x80FE, 0x227C, 0x8100, 0x1DBC, 0x8101, 0x1DBA,
+ 0x8102, 0x0987, 0x8105, 0x0989, 0x8106, 0x098C, 0x8108, 0x098F,
+ 0x810A, 0x0991, 0x8115, 0x200F, 0x8116, 0x0B6B, 0x8118, 0x2006,
+ 0x8119, 0x2008, 0x811B, 0x2009, 0x811D, 0x2011, 0x811E, 0x200D,
+ 0x811F, 0x200B, 0x8121, 0x200E, 0x8122, 0x2012, 0x8123, 0x0B6C,
+ 0x8124, 0x0B70, 0x8125, 0x2007, 0x8127, 0x2010, 0x8129, 0x0B6E,
+ 0x812B, 0x0B6D, 0x812C, 0x200C, 0x812D, 0x200A, 0x812F, 0x0B6A,
+ 0x8130, 0x0B6F, 0x8139, 0x0D26, 0x813A, 0x2285, 0x813D, 0x2283,
+ 0x813E, 0x0D28, 0x8143, 0x227E, 0x8144, 0x2527, 0x8146, 0x0D27,
+ 0x8147, 0x2282, 0x814A, 0x227F, 0x814B, 0x0D23, 0x814C, 0x0D29,
+ 0x814D, 0x2284, 0x814E, 0x0D25, 0x814F, 0x2281, 0x8150, 0x1075,
+ 0x8151, 0x0D24, 0x8152, 0x2280, 0x8153, 0x0D2A, 0x8154, 0x0D22,
+ 0x8155, 0x0D21, 0x815B, 0x251F, 0x815C, 0x251D, 0x815E, 0x2523,
+ 0x8160, 0x251B, 0x8161, 0x2528, 0x8162, 0x2520, 0x8164, 0x251A,
+ 0x8165, 0x0ED2, 0x8166, 0x0ED8, 0x8167, 0x2525, 0x8169, 0x251E,
+ 0x816B, 0x0ED5, 0x816E, 0x0ED3, 0x816F, 0x2526, 0x8170, 0x0ED0,
+ 0x8171, 0x0ECF, 0x8172, 0x2521, 0x8173, 0x0ED4, 0x8174, 0x0D2B,
+ 0x8176, 0x2524, 0x8177, 0x251C, 0x8178, 0x0ED1, 0x8179, 0x0ED6,
+ 0x817A, 0x0ED7, 0x817F, 0x107A, 0x8180, 0x1076, 0x8182, 0x107B,
+ 0x8183, 0x27A0, 0x8186, 0x279F, 0x8187, 0x27A1, 0x8188, 0x1078,
+ 0x8189, 0x279E, 0x818A, 0x1079, 0x818B, 0x27A4, 0x818C, 0x27A3,
+ 0x818D, 0x27A2, 0x818F, 0x1077, 0x8195, 0x29D1, 0x8197, 0x29D4,
+ 0x8198, 0x11EF, 0x8199, 0x29D3, 0x819A, 0x11EE, 0x819B, 0x11EA,
+ 0x819C, 0x11EB, 0x819D, 0x11EC, 0x819E, 0x29D0, 0x819F, 0x29CF,
+ 0x81A0, 0x11ED, 0x81A2, 0x29D2, 0x81A3, 0x29CE, 0x81A6, 0x2C30,
+ 0x81A7, 0x2C3A, 0x81A8, 0x1331, 0x81A9, 0x1330, 0x81AB, 0x2C34,
+ 0x81AC, 0x2C36, 0x81AE, 0x2C31, 0x81B0, 0x2C35, 0x81B1, 0x2C2F,
+ 0x81B2, 0x2C38, 0x81B3, 0x132F, 0x81B4, 0x2C37, 0x81B5, 0x2C33,
+ 0x81B7, 0x2C39, 0x81B9, 0x2C32, 0x81BA, 0x1450, 0x81BB, 0x2E06,
+ 0x81BC, 0x2E0C, 0x81BD, 0x1454, 0x81BE, 0x1456, 0x81BF, 0x1453,
+ 0x81C0, 0x1452, 0x81C2, 0x1451, 0x81C3, 0x144F, 0x81C4, 0x2E07,
+ 0x81C5, 0x2E0A, 0x81C6, 0x144E, 0x81C7, 0x2E0B, 0x81C9, 0x1455,
+ 0x81CA, 0x2E09, 0x81CC, 0x2E08, 0x81CD, 0x1518, 0x81CF, 0x1519,
+ 0x81D0, 0x2F94, 0x81D1, 0x2F92, 0x81D2, 0x2F93, 0x81D5, 0x30ED,
+ 0x81D7, 0x30EC, 0x81D8, 0x15B3, 0x81D9, 0x321C, 0x81DA, 0x1635,
+ 0x81DB, 0x321B, 0x81DD, 0x32F5, 0x81DE, 0x33A5, 0x81DF, 0x16D4,
+ 0x81E0, 0x34DD, 0x81E1, 0x34DE, 0x81E2, 0x1706, 0x81E3, 0x0405,
+ 0x81E5, 0x0676, 0x81E6, 0x2286, 0x81E7, 0x107C, 0x81E8, 0x1457,
+ 0x81E9, 0x2E0D, 0x81EA, 0x0406, 0x81EC, 0x0995, 0x81ED, 0x0994,
+ 0x81EE, 0x2287, 0x81F2, 0x2C3B, 0x81F3, 0x0407, 0x81F4, 0x07E7,
+ 0x81F7, 0x2288, 0x81F8, 0x2289, 0x81F9, 0x228A, 0x81FA, 0x107D,
+ 0x81FB, 0x1332, 0x81FC, 0x0408, 0x81FE, 0x0677, 0x81FF, 0x1BDE,
+ 0x8200, 0x0996, 0x8201, 0x1DBD, 0x8202, 0x0B71, 0x8204, 0x228B,
+ 0x8205, 0x0ED9, 0x8207, 0x107E, 0x8208, 0x1333, 0x8209, 0x1458,
+ 0x820A, 0x151A, 0x820B, 0x30EE, 0x820C, 0x0409, 0x820D, 0x0678,
+ 0x8210, 0x0997, 0x8211, 0x2013, 0x8212, 0x0D2C, 0x8214, 0x107F,
+ 0x8215, 0x27A5, 0x8216, 0x29D5, 0x821B, 0x040A, 0x821C, 0x0D2D,
+ 0x821D, 0x2529, 0x821E, 0x1080, 0x821F, 0x040B, 0x8220, 0x1A2E,
+ 0x8221, 0x1BDF, 0x8222, 0x07E8, 0x8225, 0x1DBF, 0x8228, 0x099A,
+ 0x822A, 0x0998, 0x822B, 0x0999, 0x822C, 0x099B, 0x822F, 0x1DBE,
+ 0x8232, 0x2018, 0x8233, 0x2015, 0x8234, 0x2017, 0x8235, 0x0B72,
+ 0x8236, 0x0B74, 0x8237, 0x0B73, 0x8238, 0x2014, 0x8239, 0x0B75,
+ 0x823A, 0x2016, 0x823C, 0x228C, 0x823D, 0x228D, 0x823F, 0x228E,
+ 0x8240, 0x252C, 0x8242, 0x252D, 0x8244, 0x252B, 0x8245, 0x252E,
+ 0x8247, 0x0EDA, 0x8249, 0x252A, 0x824B, 0x1081, 0x824E, 0x29DA,
+ 0x824F, 0x29D6, 0x8250, 0x29D9, 0x8251, 0x29DB, 0x8252, 0x29D8,
+ 0x8253, 0x29D7, 0x8255, 0x2C3C, 0x8256, 0x2C3D, 0x8257, 0x2C3E,
+ 0x8258, 0x1334, 0x8259, 0x1335, 0x825A, 0x2E0F, 0x825B, 0x2E0E,
+ 0x825C, 0x2E10, 0x825E, 0x2F96, 0x825F, 0x2F95, 0x8261, 0x30F0,
+ 0x8263, 0x30F1, 0x8264, 0x30EF, 0x8266, 0x1636, 0x8268, 0x321D,
+ 0x8269, 0x321E, 0x826B, 0x33A6, 0x826C, 0x342D, 0x826D, 0x3496,
+ 0x826E, 0x040C, 0x826F, 0x0504, 0x8271, 0x1459, 0x8272, 0x040D,
+ 0x8274, 0x2019, 0x8275, 0x228F, 0x8277, 0x172E, 0x8278, 0x1813,
+ 0x827C, 0x1814, 0x827D, 0x1816, 0x827E, 0x040E, 0x827F, 0x1817,
+ 0x8280, 0x1815, 0x8283, 0x18E5, 0x8284, 0x18E6, 0x8285, 0x18E0,
+ 0x828A, 0x18E4, 0x828B, 0x0506, 0x828D, 0x0507, 0x828E, 0x18E1,
+ 0x828F, 0x18DF, 0x8290, 0x18DE, 0x8291, 0x18E2, 0x8292, 0x0505,
+ 0x8293, 0x18E3, 0x8294, 0x1BE0, 0x8298, 0x1A33, 0x8299, 0x067B,
+ 0x829A, 0x1A32, 0x829B, 0x1A34, 0x829D, 0x067A, 0x829E, 0x1A39,
+ 0x829F, 0x067E, 0x82A0, 0x1A2F, 0x82A1, 0x1A3D, 0x82A2, 0x1A43,
+ 0x82A3, 0x0685, 0x82A4, 0x1A40, 0x82A5, 0x0682, 0x82A7, 0x1A36,
+ 0x82A8, 0x1A3C, 0x82A9, 0x1A3E, 0x82AB, 0x1A31, 0x82AC, 0x0681,
+ 0x82AD, 0x067C, 0x82AE, 0x1A37, 0x82AF, 0x0683, 0x82B0, 0x0686,
+ 0x82B1, 0x0680, 0x82B3, 0x0679, 0x82B4, 0x1A3B, 0x82B5, 0x1A35,
+ 0x82B6, 0x1A42, 0x82B7, 0x0688, 0x82B8, 0x0684, 0x82B9, 0x067F,
+ 0x82BA, 0x1A3A, 0x82BB, 0x099C, 0x82BC, 0x1A38, 0x82BD, 0x067D,
+ 0x82BE, 0x0687, 0x82C0, 0x1A30, 0x82C2, 0x1A3F, 0x82C3, 0x1A41,
+ 0x82D1, 0x07F9, 0x82D2, 0x07F3, 0x82D3, 0x07FB, 0x82D4, 0x07F8,
+ 0x82D5, 0x1BE7, 0x82D6, 0x1BEA, 0x82D7, 0x07F4, 0x82D9, 0x1BE1,
+ 0x82DB, 0x07ED, 0x82DC, 0x07F7, 0x82DE, 0x07FA, 0x82DF, 0x07FC,
+ 0x82E0, 0x1BF6, 0x82E1, 0x1BED, 0x82E3, 0x07EC, 0x82E4, 0x1BF5,
+ 0x82E5, 0x07F0, 0x82E6, 0x07EE, 0x82E7, 0x07E9, 0x82E8, 0x1BE5,
+ 0x82EA, 0x1BF4, 0x82EB, 0x1BE9, 0x82EC, 0x1BEC, 0x82ED, 0x1BF9,
+ 0x82EF, 0x07FD, 0x82F0, 0x1BF3, 0x82F1, 0x07F5, 0x82F2, 0x1BEE,
+ 0x82F3, 0x1BF8, 0x82F4, 0x1BEB, 0x82F5, 0x1BEF, 0x82F6, 0x1BF2,
+ 0x82F9, 0x1BE3, 0x82FA, 0x1BF7, 0x82FB, 0x1BF1, 0x82FE, 0x1BE2,
+ 0x8300, 0x1BE6, 0x8301, 0x07F6, 0x8302, 0x07F1, 0x8303, 0x07EA,
+ 0x8304, 0x07EF, 0x8305, 0x07EB, 0x8306, 0x07FE, 0x8307, 0x1BE4,
+ 0x8308, 0x1DD0, 0x8309, 0x07F2, 0x830C, 0x1BF0, 0x830D, 0x1A7D,
+ 0x8316, 0x1DD3, 0x8317, 0x09AA, 0x8319, 0x1DC3, 0x831B, 0x1DCE,
+ 0x831C, 0x1DCA, 0x831E, 0x1DDD, 0x8320, 0x1DD5, 0x8322, 0x1DCB,
+ 0x8324, 0x1DD4, 0x8325, 0x1DC5, 0x8326, 0x1DC9, 0x8327, 0x1DE0,
+ 0x8328, 0x09AD, 0x8329, 0x1DD8, 0x832A, 0x1DCF, 0x832B, 0x099D,
+ 0x832C, 0x1DDE, 0x832D, 0x1DC1, 0x832F, 0x1DD7, 0x8331, 0x09AC,
+ 0x8332, 0x09A7, 0x8333, 0x1DC0, 0x8334, 0x09A5, 0x8335, 0x09A4,
+ 0x8336, 0x09A9, 0x8337, 0x1DD6, 0x8338, 0x09A1, 0x8339, 0x09A8,
+ 0x833A, 0x1BE8, 0x833B, 0x2290, 0x833C, 0x1DD1, 0x833F, 0x1DC7,
+ 0x8340, 0x09AB, 0x8341, 0x1DC8, 0x8342, 0x1DCC, 0x8343, 0x09AE,
+ 0x8344, 0x1DC2, 0x8345, 0x1DDA, 0x8347, 0x1DD9, 0x8348, 0x1DE1,
+ 0x8349, 0x09A3, 0x834A, 0x09A0, 0x834B, 0x1DDF, 0x834C, 0x1DDB,
+ 0x834D, 0x1DD2, 0x834E, 0x1DCD, 0x834F, 0x09A6, 0x8350, 0x09A2,
+ 0x8351, 0x1DC4, 0x8352, 0x099E, 0x8353, 0x1DDC, 0x8354, 0x099F,
+ 0x8356, 0x1DC6, 0x8373, 0x201F, 0x8374, 0x2021, 0x8375, 0x2026,
+ 0x8376, 0x203A, 0x8377, 0x0B83, 0x8378, 0x0B79, 0x837A, 0x201E,
+ 0x837B, 0x0B84, 0x837C, 0x0B85, 0x837D, 0x2029, 0x837E, 0x2030,
+ 0x837F, 0x2036, 0x8381, 0x2023, 0x8383, 0x202A, 0x8386, 0x0B86,
+ 0x8387, 0x2038, 0x8388, 0x2033, 0x8389, 0x0B81, 0x838A, 0x0B7F,
+ 0x838B, 0x202F, 0x838C, 0x202B, 0x838D, 0x201D, 0x838E, 0x0B76,
+ 0x838F, 0x2022, 0x8390, 0x201A, 0x8392, 0x0B7E, 0x8393, 0x0B80,
+ 0x8394, 0x2027, 0x8395, 0x2024, 0x8396, 0x0B7B, 0x8397, 0x2034,
+ 0x8398, 0x0B78, 0x8399, 0x2025, 0x839A, 0x22B9, 0x839B, 0x202D,
+ 0x839D, 0x202C, 0x839E, 0x0B77, 0x83A0, 0x0B82, 0x83A2, 0x0B7A,
+ 0x83A3, 0x201B, 0x83A4, 0x2020, 0x83A5, 0x2031, 0x83A6, 0x2037,
+ 0x83A7, 0x0B87, 0x83A8, 0x201C, 0x83A9, 0x2028, 0x83AA, 0x202E,
+ 0x83AB, 0x0B7D, 0x83AE, 0x2039, 0x83AF, 0x2032, 0x83B0, 0x2035,
+ 0x83BD, 0x0B7C, 0x83BF, 0x22A0, 0x83C0, 0x2294, 0x83C1, 0x0D35,
+ 0x83C2, 0x22B1, 0x83C3, 0x22BA, 0x83C4, 0x22BD, 0x83C5, 0x0D33,
+ 0x83C6, 0x229C, 0x83C7, 0x22B5, 0x83C8, 0x229D, 0x83C9, 0x22AB,
+ 0x83CA, 0x0D40, 0x83CB, 0x22A7, 0x83CC, 0x0D3D, 0x83CE, 0x22A8,
+ 0x83CF, 0x2291, 0x83D1, 0x22B6, 0x83D4, 0x0D46, 0x83D5, 0x22B3,
+ 0x83D6, 0x22A9, 0x83D7, 0x22BF, 0x83D8, 0x22A4, 0x83D9, 0x254E,
+ 0x83DB, 0x22C2, 0x83DC, 0x0D44, 0x83DD, 0x22A2, 0x83DE, 0x22AE,
+ 0x83DF, 0x0D47, 0x83E0, 0x0D32, 0x83E1, 0x22A6, 0x83E2, 0x22C0,
+ 0x83E3, 0x229F, 0x83E4, 0x2298, 0x83E5, 0x22A3, 0x83E7, 0x2297,
+ 0x83E8, 0x2295, 0x83E9, 0x0D2E, 0x83EA, 0x22B7, 0x83EB, 0x229E,
+ 0x83EC, 0x22BB, 0x83EE, 0x22BC, 0x83EF, 0x0D36, 0x83F0, 0x0D3B,
+ 0x83F1, 0x0D37, 0x83F2, 0x0D3F, 0x83F3, 0x22B2, 0x83F4, 0x0D38,
+ 0x83F5, 0x22AA, 0x83F6, 0x229A, 0x83F8, 0x0D30, 0x83F9, 0x2292,
+ 0x83FA, 0x22B4, 0x83FB, 0x22BE, 0x83FC, 0x2299, 0x83FD, 0x0D3E,
+ 0x83FE, 0x22C3, 0x83FF, 0x22A5, 0x8401, 0x22A1, 0x8403, 0x0D2F,
+ 0x8404, 0x0D43, 0x8406, 0x22B0, 0x8407, 0x0D45, 0x8409, 0x22AC,
+ 0x840A, 0x0D3A, 0x840B, 0x0D34, 0x840C, 0x0D3C, 0x840D, 0x0D31,
+ 0x840E, 0x0D42, 0x840F, 0x22AD, 0x8410, 0x229B, 0x8411, 0x22AF,
+ 0x8412, 0x2296, 0x8413, 0x22B8, 0x841B, 0x22C1, 0x8423, 0x2293,
+ 0x8429, 0x254D, 0x842B, 0x2563, 0x842C, 0x0EAC, 0x842D, 0x2552,
+ 0x842F, 0x2550, 0x8430, 0x253B, 0x8431, 0x0EDE, 0x8432, 0x254B,
+ 0x8433, 0x255F, 0x8434, 0x2547, 0x8435, 0x0EE6, 0x8436, 0x255E,
+ 0x8437, 0x2545, 0x8438, 0x0D41, 0x8439, 0x2555, 0x843A, 0x2546,
+ 0x843B, 0x255C, 0x843C, 0x0EE5, 0x843D, 0x0EDD, 0x843F, 0x2530,
+ 0x8440, 0x2538, 0x8442, 0x2551, 0x8443, 0x2549, 0x8444, 0x2562,
+ 0x8445, 0x254C, 0x8446, 0x0EEB, 0x8447, 0x255D, 0x8449, 0x0EE2,
+ 0x844B, 0x254F, 0x844C, 0x2557, 0x844D, 0x253C, 0x844E, 0x2556,
+ 0x8450, 0x2567, 0x8451, 0x2537, 0x8452, 0x2558, 0x8454, 0x2565,
+ 0x8456, 0x2531, 0x8457, 0x0D39, 0x8459, 0x253F, 0x845A, 0x253E,
+ 0x845B, 0x0EE4, 0x845D, 0x2542, 0x845E, 0x2544, 0x845F, 0x2553,
+ 0x8460, 0x2564, 0x8461, 0x0EE7, 0x8463, 0x0EE8, 0x8465, 0x2536,
+ 0x8466, 0x0EE0, 0x8467, 0x253A, 0x8468, 0x2560, 0x8469, 0x0EE9,
+ 0x846B, 0x0EE1, 0x846C, 0x0EE3, 0x846D, 0x0EEA, 0x846E, 0x2566,
+ 0x846F, 0x2559, 0x8470, 0x2554, 0x8473, 0x2541, 0x8474, 0x2540,
+ 0x8475, 0x0EDF, 0x8476, 0x2532, 0x8477, 0x0EDC, 0x8478, 0x254A,
+ 0x8479, 0x2533, 0x847A, 0x2548, 0x847D, 0x253D, 0x847E, 0x2561,
+ 0x8482, 0x0EDB, 0x8486, 0x2539, 0x848D, 0x2535, 0x848E, 0x255B,
+ 0x848F, 0x2534, 0x8490, 0x108E, 0x8491, 0x27CD, 0x8494, 0x27BC,
+ 0x8497, 0x27A6, 0x8498, 0x27C4, 0x8499, 0x1086, 0x849A, 0x27B5,
+ 0x849B, 0x27BF, 0x849C, 0x1089, 0x849D, 0x27B8, 0x849E, 0x1087,
+ 0x849F, 0x27A9, 0x84A0, 0x27C7, 0x84A1, 0x27A8, 0x84A2, 0x27BB,
+ 0x84A4, 0x27A7, 0x84A7, 0x27B9, 0x84A8, 0x27C2, 0x84A9, 0x27C0,
+ 0x84AA, 0x27B4, 0x84AB, 0x27AF, 0x84AC, 0x27AD, 0x84AE, 0x27AE,
+ 0x84AF, 0x27C1, 0x84B0, 0x27CC, 0x84B1, 0x27B6, 0x84B2, 0x1088,
+ 0x84B4, 0x27B1, 0x84B6, 0x27C5, 0x84B8, 0x108B, 0x84B9, 0x27B0,
+ 0x84BA, 0x27AA, 0x84BB, 0x27BA, 0x84BC, 0x108F, 0x84BF, 0x1083,
+ 0x84C0, 0x108C, 0x84C1, 0x27B2, 0x84C2, 0x27AC, 0x84C4, 0x1085,
+ 0x84C5, 0x255A, 0x84C6, 0x1084, 0x84C7, 0x27BD, 0x84C9, 0x1082,
+ 0x84CA, 0x1091, 0x84CB, 0x108A, 0x84CC, 0x27BE, 0x84CD, 0x27B3,
+ 0x84CE, 0x27AB, 0x84CF, 0x27C6, 0x84D0, 0x27B7, 0x84D1, 0x1090,
+ 0x84D2, 0x27CA, 0x84D3, 0x108D, 0x84D4, 0x27C9, 0x84D6, 0x27C3,
+ 0x84D7, 0x27C8, 0x84DB, 0x27CB, 0x84E7, 0x2A03, 0x84E8, 0x2A04,
+ 0x84E9, 0x29F7, 0x84EA, 0x29F6, 0x84EB, 0x29F2, 0x84EC, 0x11FB,
+ 0x84EE, 0x11F3, 0x84EF, 0x2A06, 0x84F0, 0x2A05, 0x84F1, 0x252F,
+ 0x84F2, 0x29EF, 0x84F3, 0x29F3, 0x84F4, 0x29ED, 0x84F6, 0x2A00,
+ 0x84F7, 0x29F1, 0x84F9, 0x2A07, 0x84FA, 0x29EA, 0x84FB, 0x29E8,
+ 0x84FC, 0x29F4, 0x84FD, 0x29FE, 0x84FE, 0x29F9, 0x84FF, 0x11FD,
+ 0x8500, 0x29DF, 0x8502, 0x29FD, 0x8506, 0x11FE, 0x8507, 0x2543,
+ 0x8508, 0x29EB, 0x8509, 0x29E2, 0x850A, 0x29E5, 0x850B, 0x2A0B,
+ 0x850C, 0x29EC, 0x850D, 0x29E3, 0x850E, 0x29E1, 0x850F, 0x29DE,
+ 0x8511, 0x11F7, 0x8512, 0x29F5, 0x8513, 0x11F6, 0x8514, 0x11FA,
+ 0x8515, 0x29F0, 0x8516, 0x29F8, 0x8517, 0x11F0, 0x8518, 0x2A08,
+ 0x8519, 0x2A0C, 0x851A, 0x11F2, 0x851C, 0x29E7, 0x851D, 0x29FB,
+ 0x851E, 0x29FF, 0x851F, 0x29E4, 0x8520, 0x2A09, 0x8521, 0x11F9,
+ 0x8523, 0x11F8, 0x8524, 0x29DC, 0x8525, 0x11FC, 0x8526, 0x2A02,
+ 0x8527, 0x29E6, 0x8528, 0x29FA, 0x8529, 0x29E0, 0x852A, 0x29EE,
+ 0x852B, 0x29E9, 0x852C, 0x11F4, 0x852D, 0x11F5, 0x852E, 0x29FC,
+ 0x852F, 0x2A0D, 0x8530, 0x2A0A, 0x8531, 0x2A01, 0x853B, 0x29DD,
+ 0x853D, 0x11F1, 0x853E, 0x2C4F, 0x8540, 0x2C46, 0x8541, 0x2C49,
+ 0x8543, 0x133B, 0x8544, 0x2C4B, 0x8545, 0x2C40, 0x8546, 0x2C47,
+ 0x8547, 0x2C4D, 0x8548, 0x1338, 0x8549, 0x133C, 0x854A, 0x1336,
+ 0x854D, 0x2C42, 0x854E, 0x2C52, 0x8551, 0x2C4C, 0x8553, 0x2C43,
+ 0x8554, 0x2C5B, 0x8555, 0x2C55, 0x8556, 0x2C3F, 0x8557, 0x2E23,
+ 0x8558, 0x2C45, 0x8559, 0x1337, 0x855B, 0x2C50, 0x855D, 0x2C5A,
+ 0x855E, 0x133F, 0x8560, 0x2C57, 0x8561, 0x2C44, 0x8562, 0x2C4A,
+ 0x8563, 0x2C4E, 0x8564, 0x2C48, 0x8565, 0x2C5C, 0x8566, 0x2C59,
+ 0x8567, 0x2C56, 0x8568, 0x1339, 0x8569, 0x133A, 0x856A, 0x133E,
+ 0x856B, 0x2C41, 0x856C, 0x2C5D, 0x856D, 0x133D, 0x856E, 0x2C53,
+ 0x8571, 0x2C51, 0x8575, 0x2C54, 0x8576, 0x2E30, 0x8577, 0x2E1D,
+ 0x8578, 0x2E22, 0x8579, 0x2E2F, 0x857A, 0x2E21, 0x857B, 0x2E19,
+ 0x857C, 0x2E1E, 0x857E, 0x145C, 0x8580, 0x2E12, 0x8581, 0x2E2A,
+ 0x8582, 0x2E2C, 0x8583, 0x2E11, 0x8584, 0x145B, 0x8585, 0x2E2E,
+ 0x8586, 0x2E26, 0x8587, 0x1462, 0x8588, 0x2E2D, 0x8589, 0x2E1F,
+ 0x858A, 0x1464, 0x858B, 0x2E17, 0x858C, 0x2C58, 0x858D, 0x2E27,
+ 0x858E, 0x2E24, 0x858F, 0x2E13, 0x8590, 0x2E32, 0x8591, 0x145E,
+ 0x8594, 0x145F, 0x8595, 0x2E15, 0x8596, 0x2E25, 0x8598, 0x2E31,
+ 0x8599, 0x2E28, 0x859A, 0x2E1B, 0x859B, 0x1461, 0x859C, 0x145D,
+ 0x859D, 0x2E29, 0x859E, 0x2E1C, 0x859F, 0x2E33, 0x85A0, 0x2E16,
+ 0x85A1, 0x2E20, 0x85A2, 0x2E2B, 0x85A3, 0x2E18, 0x85A4, 0x2E1A,
+ 0x85A6, 0x1465, 0x85A7, 0x2E14, 0x85A8, 0x1463, 0x85A9, 0x151C,
+ 0x85AA, 0x145A, 0x85AF, 0x1460, 0x85B0, 0x1520, 0x85B1, 0x2FA6,
+ 0x85B3, 0x2F9C, 0x85B4, 0x2F97, 0x85B5, 0x2F9D, 0x85B6, 0x2FA7,
+ 0x85B7, 0x2FAB, 0x85B8, 0x2FAA, 0x85B9, 0x1522, 0x85BA, 0x1521,
+ 0x85BD, 0x2F9E, 0x85BE, 0x2FAC, 0x85BF, 0x2FA1, 0x85C0, 0x2F99,
+ 0x85C2, 0x2F9B, 0x85C3, 0x2F9A, 0x85C4, 0x2FA0, 0x85C5, 0x2FA5,
+ 0x85C6, 0x2F98, 0x85C7, 0x2F9F, 0x85C8, 0x2FA4, 0x85C9, 0x151F,
+ 0x85CB, 0x2FA2, 0x85CD, 0x151D, 0x85CE, 0x2FA3, 0x85CF, 0x151B,
+ 0x85D0, 0x151E, 0x85D1, 0x3101, 0x85D2, 0x2FA8, 0x85D5, 0x15B7,
+ 0x85D7, 0x30F9, 0x85D8, 0x30FD, 0x85D9, 0x30F5, 0x85DA, 0x30F8,
+ 0x85DC, 0x3100, 0x85DD, 0x15B5, 0x85DE, 0x3105, 0x85DF, 0x30FE,
+ 0x85E1, 0x30F6, 0x85E2, 0x3106, 0x85E3, 0x30FF, 0x85E4, 0x15B8,
+ 0x85E5, 0x15B9, 0x85E6, 0x3103, 0x85E8, 0x30F7, 0x85E9, 0x15B4,
+ 0x85EA, 0x15B6, 0x85EB, 0x30F2, 0x85EC, 0x30FA, 0x85ED, 0x30F4,
+ 0x85EF, 0x3104, 0x85F0, 0x3102, 0x85F1, 0x30F3, 0x85F2, 0x30FB,
+ 0x85F6, 0x3225, 0x85F7, 0x15BA, 0x85F8, 0x30FC, 0x85F9, 0x1638,
+ 0x85FA, 0x163A, 0x85FB, 0x1637, 0x85FD, 0x322A, 0x85FE, 0x3222,
+ 0x85FF, 0x3220, 0x8600, 0x3224, 0x8601, 0x3221, 0x8604, 0x3226,
+ 0x8605, 0x3228, 0x8606, 0x163B, 0x8607, 0x163D, 0x8609, 0x3227,
+ 0x860A, 0x163E, 0x860B, 0x163C, 0x860C, 0x3229, 0x8611, 0x1639,
+ 0x8617, 0x1685, 0x8618, 0x32F6, 0x8619, 0x32FC, 0x861A, 0x1687,
+ 0x861B, 0x3223, 0x861C, 0x32FB, 0x861E, 0x3302, 0x861F, 0x32F9,
+ 0x8620, 0x3300, 0x8621, 0x32FF, 0x8622, 0x321F, 0x8623, 0x32FA,
+ 0x8624, 0x2FA9, 0x8625, 0x3303, 0x8626, 0x32F8, 0x8627, 0x32FD,
+ 0x8629, 0x3301, 0x862A, 0x32F7, 0x862C, 0x33AA, 0x862D, 0x1686,
+ 0x862E, 0x32FE, 0x8631, 0x3432, 0x8632, 0x33AB, 0x8633, 0x33A9,
+ 0x8634, 0x33A7, 0x8635, 0x33A8, 0x8636, 0x33AC, 0x8638, 0x1707,
+ 0x8639, 0x3430, 0x863A, 0x342E, 0x863B, 0x3433, 0x863C, 0x3431,
+ 0x863E, 0x3434, 0x863F, 0x1708, 0x8640, 0x342F, 0x8643, 0x3497,
+ 0x8646, 0x34DF, 0x8647, 0x34E0, 0x8648, 0x34E1, 0x864B, 0x353E,
+ 0x864C, 0x3536, 0x864D, 0x1818, 0x864E, 0x0689, 0x8650, 0x07FF,
+ 0x8652, 0x1DE3, 0x8653, 0x1DE2, 0x8654, 0x09AF, 0x8655, 0x0B88,
+ 0x8656, 0x203C, 0x8659, 0x203B, 0x865B, 0x0D48, 0x865C, 0x0EED,
+ 0x865E, 0x0EEC, 0x865F, 0x0EEE, 0x8661, 0x27CE, 0x8662, 0x2A0E,
+ 0x8663, 0x2C5E, 0x8664, 0x2C60, 0x8665, 0x2C5F, 0x8667, 0x1466,
+ 0x8668, 0x2E34, 0x8669, 0x2FAD, 0x866A, 0x351E, 0x866B, 0x040F,
+ 0x866D, 0x1A46, 0x866E, 0x1A47, 0x866F, 0x1A45, 0x8670, 0x1A44,
+ 0x8671, 0x068A, 0x8673, 0x1BFD, 0x8674, 0x1BFB, 0x8677, 0x1BFA,
+ 0x8679, 0x0800, 0x867A, 0x0802, 0x867B, 0x0801, 0x867C, 0x1BFC,
+ 0x8685, 0x1DEF, 0x8686, 0x1DEC, 0x8687, 0x1DEA, 0x868A, 0x09B0,
+ 0x868B, 0x1DED, 0x868C, 0x09B5, 0x868D, 0x1DE7, 0x868E, 0x1DF6,
+ 0x8690, 0x1DF8, 0x8691, 0x1DE8, 0x8693, 0x09B2, 0x8694, 0x1DF9,
+ 0x8695, 0x1DF4, 0x8696, 0x1DE6, 0x8697, 0x1DEB, 0x8698, 0x1DF5,
+ 0x8699, 0x1DF1, 0x869A, 0x1DEE, 0x869C, 0x09B7, 0x869D, 0x1DF7,
+ 0x869E, 0x1DE9, 0x86A1, 0x1DF2, 0x86A2, 0x1DE4, 0x86A3, 0x09B6,
+ 0x86A4, 0x09B3, 0x86A5, 0x1DF0, 0x86A7, 0x1DF3, 0x86A8, 0x1DE5,
+ 0x86A9, 0x09B4, 0x86AA, 0x09B1, 0x86AF, 0x0B92, 0x86B0, 0x2043,
+ 0x86B1, 0x0B91, 0x86B3, 0x2046, 0x86B4, 0x2049, 0x86B5, 0x0B8E,
+ 0x86B6, 0x0B8C, 0x86B7, 0x203E, 0x86B8, 0x2047, 0x86B9, 0x2045,
+ 0x86BA, 0x2042, 0x86BB, 0x204A, 0x86BC, 0x204B, 0x86BD, 0x204D,
+ 0x86BE, 0x204E, 0x86BF, 0x203D, 0x86C0, 0x0B8B, 0x86C1, 0x2040,
+ 0x86C2, 0x203F, 0x86C3, 0x204C, 0x86C4, 0x0B8D, 0x86C5, 0x2041,
+ 0x86C6, 0x0B8F, 0x86C7, 0x0B8A, 0x86C8, 0x2044, 0x86C9, 0x0B93,
+ 0x86CB, 0x0B90, 0x86CC, 0x2048, 0x86D0, 0x0D4F, 0x86D1, 0x22D2,
+ 0x86D3, 0x22C7, 0x86D4, 0x0D4C, 0x86D6, 0x256D, 0x86D7, 0x22D0,
+ 0x86D8, 0x22C4, 0x86D9, 0x0D4A, 0x86DA, 0x22C9, 0x86DB, 0x0D4D,
+ 0x86DC, 0x22CD, 0x86DD, 0x22CB, 0x86DE, 0x0D50, 0x86DF, 0x0D49,
+ 0x86E2, 0x22C5, 0x86E3, 0x22C8, 0x86E4, 0x0D4E, 0x86E6, 0x22C6,
+ 0x86E8, 0x22D1, 0x86E9, 0x22CF, 0x86EA, 0x22CA, 0x86EB, 0x22CC,
+ 0x86EC, 0x22CE, 0x86ED, 0x0D4B, 0x86F5, 0x256E, 0x86F6, 0x2574,
+ 0x86F7, 0x256A, 0x86F8, 0x2570, 0x86F9, 0x0EEF, 0x86FA, 0x256C,
+ 0x86FB, 0x0EF5, 0x86FE, 0x0EF4, 0x8700, 0x0EF3, 0x8701, 0x2573,
+ 0x8702, 0x0EF6, 0x8703, 0x0EF7, 0x8704, 0x2569, 0x8705, 0x2576,
+ 0x8706, 0x0EF8, 0x8707, 0x0EF2, 0x8708, 0x0EF1, 0x8709, 0x2572,
+ 0x870A, 0x0EF9, 0x870B, 0x2568, 0x870C, 0x256B, 0x870D, 0x2575,
+ 0x870E, 0x2571, 0x8711, 0x27EE, 0x8712, 0x27E3, 0x8713, 0x0EF0,
+ 0x8718, 0x1098, 0x8719, 0x27D7, 0x871A, 0x27EC, 0x871B, 0x27D8,
+ 0x871C, 0x1093, 0x871E, 0x27D5, 0x8720, 0x27DE, 0x8721, 0x27D6,
+ 0x8722, 0x1095, 0x8723, 0x27D0, 0x8724, 0x27EB, 0x8725, 0x1096,
+ 0x8726, 0x27E8, 0x8727, 0x27E9, 0x8728, 0x27D1, 0x8729, 0x109B,
+ 0x872A, 0x27E0, 0x872C, 0x27DA, 0x872D, 0x27E1, 0x872E, 0x27D4,
+ 0x8730, 0x27ED, 0x8731, 0x27E5, 0x8732, 0x27DF, 0x8733, 0x27CF,
+ 0x8734, 0x1097, 0x8735, 0x27E6, 0x8737, 0x109A, 0x8738, 0x27EA,
+ 0x873A, 0x27E4, 0x873B, 0x1094, 0x873C, 0x27E2, 0x873E, 0x27DC,
+ 0x873F, 0x1092, 0x8740, 0x27D3, 0x8741, 0x27DB, 0x8742, 0x27E7,
+ 0x8743, 0x27D9, 0x8746, 0x27DD, 0x874C, 0x1208, 0x874D, 0x256F,
+ 0x874E, 0x2A20, 0x874F, 0x2A29, 0x8750, 0x2A1F, 0x8751, 0x2A1B,
+ 0x8752, 0x2A18, 0x8753, 0x1209, 0x8754, 0x2A16, 0x8755, 0x1099,
+ 0x8756, 0x2A0F, 0x8757, 0x1207, 0x8758, 0x2A15, 0x8759, 0x1206,
+ 0x875A, 0x2A1A, 0x875B, 0x2A17, 0x875C, 0x2A27, 0x875D, 0x2A22,
+ 0x875E, 0x2A1C, 0x875F, 0x2A21, 0x8760, 0x1202, 0x8761, 0x2A19,
+ 0x8762, 0x2A2C, 0x8763, 0x2A10, 0x8764, 0x2A11, 0x8765, 0x2A28,
+ 0x8766, 0x1203, 0x8767, 0x2A2D, 0x8768, 0x1205, 0x8769, 0x2A2E,
+ 0x876A, 0x2A1E, 0x876B, 0x27D2, 0x876C, 0x2A24, 0x876D, 0x2A1D,
+ 0x876E, 0x2A26, 0x876F, 0x2A23, 0x8773, 0x2A14, 0x8774, 0x1200,
+ 0x8775, 0x2A2B, 0x8776, 0x1201, 0x8777, 0x2A12, 0x8778, 0x1204,
+ 0x8779, 0x2C6B, 0x877A, 0x2A25, 0x877B, 0x2A2A, 0x8781, 0x2C68,
+ 0x8782, 0x11FF, 0x8783, 0x1340, 0x8784, 0x2C72, 0x8785, 0x2C6E,
+ 0x8787, 0x2C6C, 0x8788, 0x2C67, 0x8789, 0x2C76, 0x878D, 0x1344,
+ 0x878F, 0x2C63, 0x8790, 0x2C6F, 0x8791, 0x2C70, 0x8792, 0x2C66,
+ 0x8793, 0x2C65, 0x8794, 0x2C73, 0x8796, 0x2C69, 0x8797, 0x2C64,
+ 0x8798, 0x2C6A, 0x879A, 0x2C75, 0x879B, 0x2C62, 0x879C, 0x2C74,
+ 0x879D, 0x2C71, 0x879E, 0x1342, 0x879F, 0x1341, 0x87A2, 0x1343,
+ 0x87A3, 0x2C6D, 0x87A4, 0x2C61, 0x87AA, 0x2E36, 0x87AB, 0x146C,
+ 0x87AC, 0x2E3A, 0x87AD, 0x2E37, 0x87AE, 0x2E3E, 0x87AF, 0x2E44,
+ 0x87B0, 0x2E39, 0x87B2, 0x2E4D, 0x87B3, 0x1469, 0x87B4, 0x2E47,
+ 0x87B5, 0x2E3C, 0x87B6, 0x2E48, 0x87B7, 0x2E43, 0x87B8, 0x2E4A,
+ 0x87B9, 0x2E3B, 0x87BA, 0x146E, 0x87BB, 0x146D, 0x87BC, 0x2E3D,
+ 0x87BD, 0x2E4B, 0x87BE, 0x2E35, 0x87BF, 0x2E49, 0x87C0, 0x1467,
+ 0x87C2, 0x2E41, 0x87C3, 0x2E40, 0x87C4, 0x2E45, 0x87C5, 0x2E38,
+ 0x87C6, 0x146B, 0x87C8, 0x146F, 0x87C9, 0x2E3F, 0x87CA, 0x2E46,
+ 0x87CB, 0x1470, 0x87CC, 0x2E42, 0x87D1, 0x1468, 0x87D2, 0x146A,
+ 0x87D3, 0x2FBA, 0x87D4, 0x2FB8, 0x87D7, 0x2FBE, 0x87D8, 0x2FBC,
+ 0x87D9, 0x2FBF, 0x87DB, 0x2FB1, 0x87DC, 0x2FB9, 0x87DD, 0x2FC3,
+ 0x87DE, 0x2E4C, 0x87DF, 0x2FB5, 0x87E0, 0x1526, 0x87E1, 0x2A13,
+ 0x87E2, 0x2FB0, 0x87E3, 0x2FBD, 0x87E4, 0x2FB7, 0x87E5, 0x2FB4,
+ 0x87E6, 0x2FAF, 0x87E7, 0x2FAE, 0x87E8, 0x2FC2, 0x87EA, 0x2FB3,
+ 0x87EB, 0x2FB2, 0x87EC, 0x1524, 0x87ED, 0x2FBB, 0x87EF, 0x1523,
+ 0x87F2, 0x1525, 0x87F3, 0x2FB6, 0x87F4, 0x2FC1, 0x87F6, 0x310A,
+ 0x87F7, 0x310B, 0x87F9, 0x15BE, 0x87FA, 0x3108, 0x87FB, 0x15BB,
+ 0x87FC, 0x3110, 0x87FE, 0x15BF, 0x87FF, 0x3112, 0x8800, 0x3107,
+ 0x8801, 0x2FC0, 0x8802, 0x3114, 0x8803, 0x3109, 0x8805, 0x15BC,
+ 0x8806, 0x310F, 0x8808, 0x3111, 0x8809, 0x310C, 0x880A, 0x3113,
+ 0x880B, 0x310E, 0x880C, 0x310D, 0x880D, 0x15BD, 0x8810, 0x322C,
+ 0x8811, 0x322D, 0x8813, 0x322F, 0x8814, 0x163F, 0x8815, 0x1640,
+ 0x8816, 0x3230, 0x8817, 0x322E, 0x8819, 0x322B, 0x881B, 0x3306,
+ 0x881C, 0x3309, 0x881D, 0x3305, 0x881F, 0x168B, 0x8820, 0x3307,
+ 0x8821, 0x168A, 0x8822, 0x1689, 0x8823, 0x1688, 0x8824, 0x3308,
+ 0x8825, 0x33B1, 0x8826, 0x33AF, 0x8828, 0x33AE, 0x8829, 0x3304,
+ 0x882A, 0x33B0, 0x882B, 0x330A, 0x882C, 0x33AD, 0x882E, 0x3437,
+ 0x882F, 0x3415, 0x8830, 0x3435, 0x8831, 0x1709, 0x8832, 0x3436,
+ 0x8833, 0x3438, 0x8835, 0x349A, 0x8836, 0x1728, 0x8837, 0x3499,
+ 0x8838, 0x3498, 0x8839, 0x1729, 0x883B, 0x1747, 0x883C, 0x3508,
+ 0x883D, 0x3520, 0x883E, 0x351F, 0x883F, 0x3521, 0x8840, 0x0410,
+ 0x8841, 0x1BFE, 0x8843, 0x1DFA, 0x8844, 0x1DFB, 0x8848, 0x22D3,
+ 0x884A, 0x330B, 0x884B, 0x349B, 0x884C, 0x0411, 0x884D, 0x0803,
+ 0x884E, 0x1BFF, 0x8852, 0x204F, 0x8853, 0x0B94, 0x8855, 0x22D5,
+ 0x8856, 0x22D4, 0x8857, 0x0D51, 0x8859, 0x0EFA, 0x885A, 0x2A2F,
+ 0x885B, 0x120A, 0x885D, 0x120B, 0x8861, 0x1345, 0x8862, 0x172A,
+ 0x8863, 0x0412, 0x8867, 0x1C00, 0x8868, 0x068C, 0x8869, 0x1C02,
+ 0x886A, 0x1C01, 0x886B, 0x0804, 0x886D, 0x1DFC, 0x886F, 0x1E03,
+ 0x8870, 0x09B8, 0x8871, 0x1E01, 0x8872, 0x1DFF, 0x8874, 0x1E06,
+ 0x8875, 0x1DFD, 0x8876, 0x1DFE, 0x8877, 0x09B9, 0x8879, 0x09BD,
+ 0x887C, 0x1E07, 0x887D, 0x09BC, 0x887E, 0x1E05, 0x887F, 0x1E02,
+ 0x8880, 0x1E00, 0x8881, 0x09BA, 0x8882, 0x09BB, 0x8883, 0x1E04,
+ 0x8888, 0x0B96, 0x8889, 0x2050, 0x888B, 0x0B9B, 0x888C, 0x2060,
+ 0x888D, 0x0B9A, 0x888E, 0x2062, 0x8891, 0x2056, 0x8892, 0x0B98,
+ 0x8893, 0x2061, 0x8895, 0x2051, 0x8896, 0x0B99, 0x8897, 0x205D,
+ 0x8898, 0x2059, 0x8899, 0x205B, 0x889A, 0x2055, 0x889B, 0x205C,
+ 0x889E, 0x0B95, 0x889F, 0x2058, 0x88A1, 0x2057, 0x88A2, 0x2053,
+ 0x88A4, 0x205E, 0x88A7, 0x205A, 0x88A8, 0x2052, 0x88AA, 0x2054,
+ 0x88AB, 0x0B97, 0x88AC, 0x205F, 0x88B1, 0x0D54, 0x88B2, 0x22E0,
+ 0x88B6, 0x22DC, 0x88B7, 0x22DE, 0x88B8, 0x22D9, 0x88B9, 0x22D8,
+ 0x88BA, 0x22D6, 0x88BC, 0x22DD, 0x88BD, 0x22DF, 0x88BE, 0x22DB,
+ 0x88C0, 0x22DA, 0x88C1, 0x0D52, 0x88C2, 0x0D53, 0x88C9, 0x22E2,
+ 0x88CA, 0x0F02, 0x88CB, 0x2578, 0x88CC, 0x257E, 0x88CD, 0x2579,
+ 0x88CE, 0x257A, 0x88CF, 0x36EA, 0x88D0, 0x257F, 0x88D2, 0x0F04,
+ 0x88D4, 0x0EFC, 0x88D5, 0x0F03, 0x88D6, 0x2577, 0x88D7, 0x22D7,
+ 0x88D8, 0x0EFF, 0x88D9, 0x0EFD, 0x88DA, 0x257D, 0x88DB, 0x257C,
+ 0x88DC, 0x0EFE, 0x88DD, 0x0F00, 0x88DE, 0x257B, 0x88DF, 0x0EFB,
+ 0x88E1, 0x0F01, 0x88E7, 0x27F0, 0x88E8, 0x10A2, 0x88EB, 0x27FB,
+ 0x88EC, 0x27FA, 0x88EE, 0x27F5, 0x88EF, 0x10A4, 0x88F0, 0x27F9,
+ 0x88F1, 0x27F1, 0x88F2, 0x27F2, 0x88F3, 0x109C, 0x88F4, 0x109E,
+ 0x88F6, 0x27F7, 0x88F7, 0x27EF, 0x88F8, 0x10A0, 0x88F9, 0x109F,
+ 0x88FA, 0x27F3, 0x88FB, 0x27F8, 0x88FC, 0x27F6, 0x88FD, 0x10A1,
+ 0x88FE, 0x27F4, 0x8901, 0x22E1, 0x8902, 0x109D, 0x8905, 0x2A30,
+ 0x8906, 0x2A37, 0x8907, 0x120D, 0x8909, 0x2A3B, 0x890A, 0x1211,
+ 0x890B, 0x2A33, 0x890C, 0x2A31, 0x890E, 0x2A3A, 0x8910, 0x120C,
+ 0x8911, 0x2A39, 0x8912, 0x120E, 0x8913, 0x120F, 0x8914, 0x2A32,
+ 0x8915, 0x1210, 0x8916, 0x2A38, 0x8917, 0x2A34, 0x8918, 0x2A35,
+ 0x8919, 0x2A36, 0x891A, 0x10A3, 0x891E, 0x2C77, 0x891F, 0x2C83,
+ 0x8921, 0x134A, 0x8922, 0x2C7E, 0x8923, 0x2C80, 0x8925, 0x1348,
+ 0x8926, 0x2C78, 0x8927, 0x2C7C, 0x8929, 0x2C7F, 0x892A, 0x1346,
+ 0x892B, 0x1349, 0x892C, 0x2C82, 0x892D, 0x2C7A, 0x892E, 0x2C7B,
+ 0x892F, 0x2C81, 0x8930, 0x2C79, 0x8931, 0x2C7D, 0x8932, 0x1347,
+ 0x8933, 0x2E4F, 0x8935, 0x2E4E, 0x8936, 0x1472, 0x8937, 0x2E54,
+ 0x8938, 0x1474, 0x893B, 0x1471, 0x893C, 0x2E50, 0x893D, 0x1475,
+ 0x893E, 0x2E51, 0x8941, 0x2E52, 0x8942, 0x2E55, 0x8944, 0x1473,
+ 0x8946, 0x2FC8, 0x8949, 0x2FCB, 0x894B, 0x2FC5, 0x894C, 0x2FC7,
+ 0x894F, 0x2FC6, 0x8950, 0x2FC9, 0x8951, 0x2FCA, 0x8952, 0x2E53,
+ 0x8953, 0x2FC4, 0x8956, 0x15C2, 0x8957, 0x3118, 0x8958, 0x311B,
+ 0x8959, 0x311D, 0x895A, 0x3116, 0x895B, 0x3117, 0x895C, 0x311A,
+ 0x895D, 0x311C, 0x895E, 0x15C3, 0x895F, 0x15C1, 0x8960, 0x15C0,
+ 0x8961, 0x3119, 0x8962, 0x3115, 0x8963, 0x3231, 0x8964, 0x1641,
+ 0x8966, 0x3232, 0x8969, 0x330D, 0x896A, 0x168C, 0x896B, 0x330F,
+ 0x896C, 0x168D, 0x896D, 0x330C, 0x896E, 0x330E, 0x896F, 0x16D6,
+ 0x8971, 0x33B2, 0x8972, 0x16D5, 0x8973, 0x343B, 0x8974, 0x343A,
+ 0x8976, 0x3439, 0x8979, 0x34E2, 0x897A, 0x34E3, 0x897B, 0x34E5,
+ 0x897C, 0x34E4, 0x897E, 0x1819, 0x897F, 0x0413, 0x8981, 0x0805,
+ 0x8982, 0x2063, 0x8983, 0x0D55, 0x8985, 0x2580, 0x8986, 0x1527,
+ 0x8988, 0x311E, 0x898B, 0x0508, 0x898F, 0x0B9D, 0x8993, 0x0B9C,
+ 0x8995, 0x22E3, 0x8996, 0x0D56, 0x8997, 0x22E5, 0x8998, 0x22E4,
+ 0x899B, 0x2581, 0x899C, 0x0F05, 0x899D, 0x27FC, 0x899E, 0x27FF,
+ 0x899F, 0x27FE, 0x89A1, 0x27FD, 0x89A2, 0x2A3C, 0x89A3, 0x2A3E,
+ 0x89A4, 0x2A3D, 0x89A6, 0x134C, 0x89AA, 0x134B, 0x89AC, 0x1476,
+ 0x89AD, 0x2E56, 0x89AE, 0x2E58, 0x89AF, 0x2E57, 0x89B2, 0x1528,
+ 0x89B6, 0x3120, 0x89B7, 0x311F, 0x89B9, 0x3233, 0x89BA, 0x1642,
+ 0x89BD, 0x168E, 0x89BE, 0x33B4, 0x89BF, 0x33B3, 0x89C0, 0x1748,
+ 0x89D2, 0x0509, 0x89D3, 0x1C03, 0x89D4, 0x0806, 0x89D5, 0x2066,
+ 0x89D6, 0x2064, 0x89D9, 0x2065, 0x89DA, 0x22E7, 0x89DB, 0x22E8,
+ 0x89DC, 0x2588, 0x89DD, 0x22E6, 0x89DF, 0x2582, 0x89E0, 0x2586,
+ 0x89E1, 0x2585, 0x89E2, 0x2587, 0x89E3, 0x0F06, 0x89E4, 0x2584,
+ 0x89E5, 0x2583, 0x89E6, 0x2589, 0x89E8, 0x2802, 0x89E9, 0x2800,
+ 0x89EB, 0x2801, 0x89EC, 0x2A41, 0x89ED, 0x2A3F, 0x89F0, 0x2A40,
+ 0x89F1, 0x2C84, 0x89F2, 0x2E59, 0x89F3, 0x2E5A, 0x89F4, 0x1529,
+ 0x89F6, 0x3121, 0x89F7, 0x3234, 0x89F8, 0x1643, 0x89FA, 0x3310,
+ 0x89FB, 0x33B5, 0x89FC, 0x16D7, 0x89FE, 0x343C, 0x89FF, 0x34E6,
+ 0x8A00, 0x050A, 0x8A02, 0x0808, 0x8A03, 0x0809, 0x8A04, 0x1C04,
+ 0x8A07, 0x1C05, 0x8A08, 0x0807, 0x8A0A, 0x09C3, 0x8A0C, 0x09C1,
+ 0x8A0E, 0x09C0, 0x8A0F, 0x09C7, 0x8A10, 0x09BF, 0x8A11, 0x09C8,
+ 0x8A12, 0x1E08, 0x8A13, 0x09C5, 0x8A15, 0x09C2, 0x8A16, 0x09C6,
+ 0x8A17, 0x09C4, 0x8A18, 0x09BE, 0x8A1B, 0x0BA5, 0x8A1D, 0x0B9F,
+ 0x8A1E, 0x206A, 0x8A1F, 0x0BA4, 0x8A22, 0x0BA6, 0x8A23, 0x0BA0,
+ 0x8A25, 0x0BA1, 0x8A27, 0x2068, 0x8A2A, 0x0B9E, 0x8A2C, 0x2069,
+ 0x8A2D, 0x0BA3, 0x8A30, 0x2067, 0x8A31, 0x0BA2, 0x8A34, 0x0D61,
+ 0x8A36, 0x0D63, 0x8A39, 0x22EB, 0x8A3A, 0x0D62, 0x8A3B, 0x0D57,
+ 0x8A3C, 0x0D5B, 0x8A3E, 0x0F19, 0x8A3F, 0x258E, 0x8A40, 0x22ED,
+ 0x8A41, 0x0D5C, 0x8A44, 0x22F0, 0x8A45, 0x22F1, 0x8A46, 0x0D60,
+ 0x8A48, 0x22F3, 0x8A4A, 0x22F5, 0x8A4C, 0x22F6, 0x8A4D, 0x22EA,
+ 0x8A4E, 0x22E9, 0x8A4F, 0x22F7, 0x8A50, 0x0D5F, 0x8A51, 0x22F4,
+ 0x8A52, 0x22F2, 0x8A54, 0x0D5D, 0x8A55, 0x0D59, 0x8A56, 0x0D64,
+ 0x8A57, 0x22EE, 0x8A58, 0x22EF, 0x8A59, 0x22EC, 0x8A5B, 0x0D5E,
+ 0x8A5E, 0x0D5A, 0x8A60, 0x0D58, 0x8A61, 0x258D, 0x8A62, 0x0F14,
+ 0x8A63, 0x0F0F, 0x8A66, 0x0F0A, 0x8A68, 0x0F1A, 0x8A69, 0x0F0B,
+ 0x8A6B, 0x0F07, 0x8A6C, 0x0F16, 0x8A6D, 0x0F13, 0x8A6E, 0x0F15,
+ 0x8A70, 0x0F0C, 0x8A71, 0x0F11, 0x8A72, 0x0F08, 0x8A73, 0x0F09,
+ 0x8A74, 0x2595, 0x8A75, 0x2592, 0x8A76, 0x258A, 0x8A77, 0x258F,
+ 0x8A79, 0x0F17, 0x8A7A, 0x2596, 0x8A7B, 0x0F18, 0x8A7C, 0x0F0E,
+ 0x8A7F, 0x258C, 0x8A81, 0x2594, 0x8A82, 0x2590, 0x8A83, 0x2593,
+ 0x8A84, 0x2591, 0x8A85, 0x0F12, 0x8A86, 0x258B, 0x8A87, 0x0F0D,
+ 0x8A8B, 0x2805, 0x8A8C, 0x10A6, 0x8A8D, 0x10A9, 0x8A8F, 0x2807,
+ 0x8A91, 0x10B1, 0x8A92, 0x2806, 0x8A93, 0x10AB, 0x8A95, 0x1216,
+ 0x8A96, 0x2808, 0x8A98, 0x10B0, 0x8A99, 0x2804, 0x8A9A, 0x10B2,
+ 0x8A9E, 0x10A7, 0x8AA0, 0x0F10, 0x8AA1, 0x10AA, 0x8AA3, 0x10A8,
+ 0x8AA4, 0x10AC, 0x8AA5, 0x10AE, 0x8AA6, 0x10A5, 0x8AA7, 0x10B3,
+ 0x8AA8, 0x10AF, 0x8AAA, 0x10AD, 0x8AAB, 0x2803, 0x8AB0, 0x121D,
+ 0x8AB2, 0x1219, 0x8AB6, 0x1220, 0x8AB8, 0x2A44, 0x8AB9, 0x1221,
+ 0x8ABA, 0x2A50, 0x8ABB, 0x2A49, 0x8ABC, 0x1212, 0x8ABD, 0x2A51,
+ 0x8ABE, 0x2A4B, 0x8ABF, 0x121C, 0x8AC0, 0x2A4C, 0x8AC2, 0x121B,
+ 0x8AC3, 0x2A4F, 0x8AC4, 0x1215, 0x8AC5, 0x2A4D, 0x8AC6, 0x2A43,
+ 0x8AC7, 0x1214, 0x8AC8, 0x2C8F, 0x8AC9, 0x121A, 0x8ACB, 0x1217,
+ 0x8ACD, 0x121F, 0x8ACF, 0x2A42, 0x8AD1, 0x2A46, 0x8AD2, 0x1213,
+ 0x8AD3, 0x2A45, 0x8AD4, 0x2A47, 0x8AD5, 0x2A48, 0x8AD6, 0x121E,
+ 0x8AD7, 0x2A4A, 0x8AD8, 0x2A4E, 0x8AD9, 0x2A52, 0x8ADB, 0x1222,
+ 0x8ADC, 0x1352, 0x8ADD, 0x2C8A, 0x8ADE, 0x2C90, 0x8ADF, 0x2C8D,
+ 0x8AE0, 0x2C85, 0x8AE1, 0x2C91, 0x8AE2, 0x2C86, 0x8AE4, 0x2C8C,
+ 0x8AE6, 0x134D, 0x8AE7, 0x1353, 0x8AE8, 0x2C92, 0x8AEB, 0x134F,
+ 0x8AED, 0x1359, 0x8AEE, 0x1354, 0x8AEF, 0x2C94, 0x8AF0, 0x2C8E,
+ 0x8AF1, 0x1350, 0x8AF2, 0x2C87, 0x8AF3, 0x135A, 0x8AF4, 0x2C88,
+ 0x8AF5, 0x2C89, 0x8AF6, 0x135B, 0x8AF7, 0x1358, 0x8AF8, 0x1218,
+ 0x8AFA, 0x134E, 0x8AFB, 0x2C95, 0x8AFC, 0x135C, 0x8AFE, 0x1355,
+ 0x8AFF, 0x2C93, 0x8B00, 0x1351, 0x8B01, 0x1356, 0x8B02, 0x1357,
+ 0x8B04, 0x147E, 0x8B05, 0x2E5F, 0x8B06, 0x2E68, 0x8B07, 0x2E65,
+ 0x8B08, 0x2E67, 0x8B0A, 0x147B, 0x8B0B, 0x2E60, 0x8B0D, 0x2E66,
+ 0x8B0E, 0x1477, 0x8B0F, 0x2E62, 0x8B10, 0x147F, 0x8B11, 0x2E5E,
+ 0x8B12, 0x2E63, 0x8B13, 0x2E6A, 0x8B14, 0x2C8B, 0x8B15, 0x2E64,
+ 0x8B16, 0x2E5D, 0x8B17, 0x1478, 0x8B18, 0x2E5C, 0x8B19, 0x1479,
+ 0x8B1A, 0x2E6B, 0x8B1B, 0x147A, 0x8B1C, 0x2E69, 0x8B1D, 0x147D,
+ 0x8B1E, 0x2E5B, 0x8B20, 0x147C, 0x8B22, 0x2E61, 0x8B23, 0x2FCE,
+ 0x8B24, 0x2FDC, 0x8B25, 0x2FD7, 0x8B26, 0x2FD9, 0x8B27, 0x2FCD,
+ 0x8B28, 0x152A, 0x8B2A, 0x2FCC, 0x8B2B, 0x152D, 0x8B2C, 0x152C,
+ 0x8B2E, 0x2FDB, 0x8B2F, 0x2FD3, 0x8B30, 0x2FD0, 0x8B31, 0x2FD6,
+ 0x8B33, 0x2FCF, 0x8B35, 0x2FD1, 0x8B36, 0x2FDA, 0x8B37, 0x2FD8,
+ 0x8B39, 0x152B, 0x8B3A, 0x2FDF, 0x8B3B, 0x2FDD, 0x8B3C, 0x2FD4,
+ 0x8B3D, 0x2FDE, 0x8B3E, 0x2FD5, 0x8B40, 0x3125, 0x8B41, 0x15C4,
+ 0x8B42, 0x312C, 0x8B45, 0x3313, 0x8B46, 0x15CB, 0x8B47, 0x2FD2,
+ 0x8B48, 0x3123, 0x8B49, 0x15C7, 0x8B4A, 0x3124, 0x8B4B, 0x3129,
+ 0x8B4E, 0x15C9, 0x8B4F, 0x15CA, 0x8B50, 0x3122, 0x8B51, 0x312B,
+ 0x8B52, 0x312D, 0x8B53, 0x3126, 0x8B54, 0x3128, 0x8B55, 0x312A,
+ 0x8B56, 0x3127, 0x8B57, 0x312E, 0x8B58, 0x15C6, 0x8B59, 0x15CC,
+ 0x8B5A, 0x15C8, 0x8B5C, 0x15C5, 0x8B5D, 0x3237, 0x8B5F, 0x1648,
+ 0x8B60, 0x3235, 0x8B63, 0x3239, 0x8B65, 0x323A, 0x8B66, 0x1646,
+ 0x8B67, 0x323B, 0x8B68, 0x3238, 0x8B6A, 0x3236, 0x8B6B, 0x1649,
+ 0x8B6C, 0x1645, 0x8B6D, 0x323C, 0x8B6F, 0x1647, 0x8B70, 0x1644,
+ 0x8B74, 0x168F, 0x8B77, 0x1690, 0x8B78, 0x3312, 0x8B79, 0x3311,
+ 0x8B7A, 0x3314, 0x8B7B, 0x3315, 0x8B7D, 0x1691, 0x8B7E, 0x33B6,
+ 0x8B7F, 0x33BB, 0x8B80, 0x16D8, 0x8B82, 0x33B8, 0x8B84, 0x33B7,
+ 0x8B85, 0x33BA, 0x8B86, 0x33B9, 0x8B88, 0x3440, 0x8B8A, 0x170A,
+ 0x8B8B, 0x343F, 0x8B8C, 0x343D, 0x8B8E, 0x343E, 0x8B92, 0x172C,
+ 0x8B93, 0x172B, 0x8B94, 0x349C, 0x8B95, 0x349D, 0x8B96, 0x172D,
+ 0x8B98, 0x34E7, 0x8B99, 0x34E8, 0x8B9A, 0x1754, 0x8B9C, 0x175A,
+ 0x8B9E, 0x3522, 0x8B9F, 0x353F, 0x8C37, 0x050B, 0x8C39, 0x206B,
+ 0x8C3B, 0x206C, 0x8C3C, 0x2597, 0x8C3D, 0x2809, 0x8C3E, 0x2A53,
+ 0x8C3F, 0x1481, 0x8C41, 0x1480, 0x8C42, 0x2FE0, 0x8C43, 0x312F,
+ 0x8C45, 0x3441, 0x8C46, 0x050C, 0x8C47, 0x1E09, 0x8C48, 0x09C9,
+ 0x8C49, 0x0BA7, 0x8C4A, 0x2599, 0x8C4B, 0x2598, 0x8C4C, 0x1223,
+ 0x8C4D, 0x2A54, 0x8C4E, 0x1224, 0x8C4F, 0x2E6C, 0x8C50, 0x152E,
+ 0x8C54, 0x1763, 0x8C55, 0x050D, 0x8C56, 0x1A48, 0x8C57, 0x1E0A,
+ 0x8C5A, 0x0BA8, 0x8C5C, 0x206D, 0x8C5D, 0x206E, 0x8C5F, 0x22F8,
+ 0x8C61, 0x0D65, 0x8C62, 0x0F1B, 0x8C64, 0x259B, 0x8C65, 0x259A,
+ 0x8C66, 0x259C, 0x8C68, 0x280A, 0x8C69, 0x280B, 0x8C6A, 0x10B4,
+ 0x8C6B, 0x135D, 0x8C6C, 0x1225, 0x8C6D, 0x135E, 0x8C6F, 0x2E70,
+ 0x8C70, 0x2E6D, 0x8C71, 0x2E6F, 0x8C72, 0x2E6E, 0x8C73, 0x1482,
+ 0x8C75, 0x2FE1, 0x8C76, 0x3131, 0x8C77, 0x3130, 0x8C78, 0x18E7,
+ 0x8C79, 0x09CB, 0x8C7A, 0x09CA, 0x8C7B, 0x1E0B, 0x8C7D, 0x206F,
+ 0x8C80, 0x22FA, 0x8C81, 0x22F9, 0x8C82, 0x0D66, 0x8C84, 0x259E,
+ 0x8C85, 0x259F, 0x8C86, 0x259D, 0x8C89, 0x0F1D, 0x8C8A, 0x0F1C,
+ 0x8C8C, 0x10B6, 0x8C8D, 0x10B5, 0x8C8F, 0x2A55, 0x8C90, 0x2C98,
+ 0x8C91, 0x2C96, 0x8C92, 0x2C97, 0x8C93, 0x135F, 0x8C94, 0x2E72,
+ 0x8C95, 0x2E71, 0x8C97, 0x2FE4, 0x8C98, 0x2FE3, 0x8C99, 0x2FE2,
+ 0x8C9A, 0x3132, 0x8C9C, 0x3523, 0x8C9D, 0x050E, 0x8C9E, 0x080A,
+ 0x8CA0, 0x080B, 0x8CA1, 0x09CC, 0x8CA2, 0x09CD, 0x8CA3, 0x1E0D,
+ 0x8CA4, 0x1E0C, 0x8CA5, 0x2070, 0x8CA7, 0x0BAE, 0x8CA8, 0x0BAC,
+ 0x8CA9, 0x0BA9, 0x8CAA, 0x0BAD, 0x8CAB, 0x0BAB, 0x8CAC, 0x0BAA,
+ 0x8CAF, 0x0D67, 0x8CB0, 0x22FD, 0x8CB2, 0x0F22, 0x8CB3, 0x0D69,
+ 0x8CB4, 0x0D6E, 0x8CB5, 0x22FF, 0x8CB6, 0x0D70, 0x8CB7, 0x0D6F,
+ 0x8CB8, 0x0D72, 0x8CB9, 0x22FE, 0x8CBA, 0x22FB, 0x8CBB, 0x0D6C,
+ 0x8CBC, 0x0D68, 0x8CBD, 0x0D6A, 0x8CBE, 0x22FC, 0x8CBF, 0x0D71,
+ 0x8CC0, 0x0D6D, 0x8CC1, 0x0D6B, 0x8CC2, 0x0F24, 0x8CC3, 0x0F23,
+ 0x8CC4, 0x0F21, 0x8CC5, 0x0F25, 0x8CC7, 0x0F1F, 0x8CC8, 0x0F20,
+ 0x8CCA, 0x0F1E, 0x8CCC, 0x25A0, 0x8CCF, 0x280D, 0x8CD1, 0x10B8,
+ 0x8CD2, 0x10B9, 0x8CD3, 0x10B7, 0x8CD5, 0x280C, 0x8CD7, 0x280E,
+ 0x8CD9, 0x2A58, 0x8CDA, 0x2A5A, 0x8CDC, 0x122E, 0x8CDD, 0x2A5B,
+ 0x8CDE, 0x1227, 0x8CDF, 0x2A57, 0x8CE0, 0x1226, 0x8CE1, 0x1230,
+ 0x8CE2, 0x122C, 0x8CE3, 0x122D, 0x8CE4, 0x1229, 0x8CE5, 0x2A56,
+ 0x8CE6, 0x1228, 0x8CE7, 0x2A5C, 0x8CE8, 0x2A59, 0x8CEA, 0x122F,
+ 0x8CEC, 0x122A, 0x8CED, 0x122B, 0x8CEE, 0x2C9A, 0x8CF0, 0x2C9C,
+ 0x8CF1, 0x2C9B, 0x8CF3, 0x2C9D, 0x8CF4, 0x1360, 0x8CF5, 0x2C99,
+ 0x8CF8, 0x1486, 0x8CF9, 0x2E73, 0x8CFA, 0x1483, 0x8CFB, 0x1487,
+ 0x8CFC, 0x1485, 0x8CFD, 0x1484, 0x8CFE, 0x2FE5, 0x8D00, 0x2FE8,
+ 0x8D02, 0x2FE7, 0x8D04, 0x2FE6, 0x8D05, 0x152F, 0x8D06, 0x3133,
+ 0x8D07, 0x3134, 0x8D08, 0x15CD, 0x8D09, 0x3135, 0x8D0A, 0x15CE,
+ 0x8D0D, 0x164B, 0x8D0F, 0x164A, 0x8D10, 0x3316, 0x8D13, 0x1692,
+ 0x8D14, 0x3317, 0x8D15, 0x33BC, 0x8D16, 0x16D9, 0x8D17, 0x16DA,
+ 0x8D19, 0x3442, 0x8D1B, 0x172F, 0x8D64, 0x050F, 0x8D66, 0x0BB0,
+ 0x8D67, 0x0BAF, 0x8D68, 0x25A1, 0x8D69, 0x25A2, 0x8D6B, 0x10BA,
+ 0x8D6C, 0x2C9E, 0x8D6D, 0x1231, 0x8D6E, 0x2C9F, 0x8D6F, 0x2E74,
+ 0x8D70, 0x0510, 0x8D72, 0x1C06, 0x8D73, 0x080D, 0x8D74, 0x080C,
+ 0x8D76, 0x1E0E, 0x8D77, 0x09CE, 0x8D78, 0x1E0F, 0x8D79, 0x2073,
+ 0x8D7B, 0x2072, 0x8D7D, 0x2071, 0x8D80, 0x2301, 0x8D81, 0x0D75,
+ 0x8D84, 0x2300, 0x8D85, 0x0D74, 0x8D89, 0x2302, 0x8D8A, 0x0D73,
+ 0x8D8C, 0x25A4, 0x8D8D, 0x25A7, 0x8D8E, 0x25A5, 0x8D8F, 0x25A6,
+ 0x8D90, 0x25AA, 0x8D91, 0x25A3, 0x8D92, 0x25AB, 0x8D93, 0x25A8,
+ 0x8D94, 0x25A9, 0x8D95, 0x10BC, 0x8D96, 0x280F, 0x8D99, 0x10BB,
+ 0x8D9B, 0x2A60, 0x8D9C, 0x2A5E, 0x8D9F, 0x1232, 0x8DA0, 0x2A5D,
+ 0x8DA1, 0x2A5F, 0x8DA3, 0x1233, 0x8DA5, 0x2CA0, 0x8DA7, 0x2CA1,
+ 0x8DA8, 0x1488, 0x8DAA, 0x3137, 0x8DAB, 0x3139, 0x8DAC, 0x3136,
+ 0x8DAD, 0x3138, 0x8DAE, 0x323D, 0x8DAF, 0x3318, 0x8DB2, 0x3509,
+ 0x8DB3, 0x0511, 0x8DB4, 0x080E, 0x8DB5, 0x1E10, 0x8DB6, 0x1E12,
+ 0x8DB7, 0x1E11, 0x8DB9, 0x2076, 0x8DBA, 0x0BB2, 0x8DBC, 0x2074,
+ 0x8DBE, 0x0BB1, 0x8DBF, 0x2077, 0x8DC1, 0x2078, 0x8DC2, 0x2075,
+ 0x8DC5, 0x230E, 0x8DC6, 0x0D7D, 0x8DC7, 0x2306, 0x8DC8, 0x230C,
+ 0x8DCB, 0x0D78, 0x8DCC, 0x0D7B, 0x8DCD, 0x2305, 0x8DCE, 0x0D76,
+ 0x8DCF, 0x2309, 0x8DD0, 0x25B1, 0x8DD1, 0x0D7A, 0x8DD3, 0x2304,
+ 0x8DD5, 0x230A, 0x8DD6, 0x2307, 0x8DD7, 0x230D, 0x8DD8, 0x2303,
+ 0x8DD9, 0x230B, 0x8DDA, 0x0D79, 0x8DDB, 0x0D7C, 0x8DDC, 0x2308,
+ 0x8DDD, 0x0D77, 0x8DDF, 0x0F27, 0x8DE0, 0x25AD, 0x8DE1, 0x0F26,
+ 0x8DE2, 0x25B4, 0x8DE3, 0x25B3, 0x8DE4, 0x0F2D, 0x8DE6, 0x0F2E,
+ 0x8DE7, 0x25B5, 0x8DE8, 0x0F28, 0x8DE9, 0x25B2, 0x8DEA, 0x0F2C,
+ 0x8DEB, 0x25B7, 0x8DEC, 0x25AE, 0x8DEE, 0x25B0, 0x8DEF, 0x0F29,
+ 0x8DF0, 0x25AC, 0x8DF1, 0x25AF, 0x8DF2, 0x25B6, 0x8DF3, 0x0F2A,
+ 0x8DF4, 0x25B8, 0x8DFA, 0x0F2B, 0x8DFC, 0x10BD, 0x8DFD, 0x2814,
+ 0x8DFE, 0x281A, 0x8DFF, 0x2812, 0x8E00, 0x281B, 0x8E02, 0x2811,
+ 0x8E03, 0x2816, 0x8E04, 0x281C, 0x8E05, 0x2819, 0x8E06, 0x2818,
+ 0x8E07, 0x2817, 0x8E09, 0x2810, 0x8E0A, 0x2815, 0x8E0D, 0x2813,
+ 0x8E0F, 0x1238, 0x8E10, 0x1235, 0x8E11, 0x2A69, 0x8E12, 0x2A6E,
+ 0x8E13, 0x2A70, 0x8E14, 0x2A6D, 0x8E15, 0x2A66, 0x8E16, 0x2A68,
+ 0x8E17, 0x2A72, 0x8E18, 0x2A6F, 0x8E19, 0x2A6A, 0x8E1A, 0x2A73,
+ 0x8E1B, 0x2A67, 0x8E1C, 0x2A71, 0x8E1D, 0x1236, 0x8E1E, 0x123C,
+ 0x8E1F, 0x123A, 0x8E20, 0x2A61, 0x8E21, 0x123B, 0x8E22, 0x1237,
+ 0x8E23, 0x2A62, 0x8E24, 0x2A64, 0x8E25, 0x2A63, 0x8E26, 0x2A6B,
+ 0x8E27, 0x2A6C, 0x8E29, 0x1239, 0x8E2B, 0x1234, 0x8E2E, 0x2A65,
+ 0x8E30, 0x2CAB, 0x8E31, 0x1362, 0x8E33, 0x2CA2, 0x8E34, 0x1363,
+ 0x8E35, 0x1366, 0x8E36, 0x2CA7, 0x8E38, 0x2CA4, 0x8E39, 0x1365,
+ 0x8E3C, 0x2CA8, 0x8E3D, 0x2CA9, 0x8E3E, 0x2CA3, 0x8E3F, 0x2CAC,
+ 0x8E40, 0x2CA5, 0x8E41, 0x2CAA, 0x8E42, 0x1364, 0x8E44, 0x1361,
+ 0x8E45, 0x2CA6, 0x8E47, 0x2E7A, 0x8E48, 0x148B, 0x8E49, 0x1489,
+ 0x8E4A, 0x148C, 0x8E4B, 0x148A, 0x8E4C, 0x2E79, 0x8E4D, 0x2E76,
+ 0x8E4E, 0x2E75, 0x8E50, 0x2E78, 0x8E53, 0x2E77, 0x8E54, 0x2FF6,
+ 0x8E55, 0x1535, 0x8E56, 0x2FED, 0x8E57, 0x2FEC, 0x8E59, 0x1530,
+ 0x8E5A, 0x2FF2, 0x8E5B, 0x2FF1, 0x8E5C, 0x2FE9, 0x8E5D, 0x2FF4,
+ 0x8E5E, 0x2FEE, 0x8E5F, 0x1534, 0x8E60, 0x2FEB, 0x8E61, 0x2FF3,
+ 0x8E62, 0x2FEA, 0x8E63, 0x1531, 0x8E64, 0x1533, 0x8E65, 0x2FEF,
+ 0x8E66, 0x1532, 0x8E67, 0x2FF0, 0x8E69, 0x2FF5, 0x8E6A, 0x313D,
+ 0x8E6C, 0x15D3, 0x8E6D, 0x313A, 0x8E6F, 0x313E, 0x8E72, 0x15D0,
+ 0x8E73, 0x313C, 0x8E74, 0x15D5, 0x8E76, 0x15D2, 0x8E78, 0x313B,
+ 0x8E7A, 0x15D4, 0x8E7B, 0x313F, 0x8E7C, 0x15CF, 0x8E81, 0x164D,
+ 0x8E82, 0x164F, 0x8E84, 0x3240, 0x8E85, 0x164E, 0x8E86, 0x323E,
+ 0x8E87, 0x15D1, 0x8E88, 0x323F, 0x8E89, 0x164C, 0x8E8A, 0x1693,
+ 0x8E8B, 0x1695, 0x8E8C, 0x331A, 0x8E8D, 0x1694, 0x8E8E, 0x3319,
+ 0x8E90, 0x33C1, 0x8E91, 0x16DB, 0x8E92, 0x33C0, 0x8E93, 0x16DC,
+ 0x8E94, 0x33BE, 0x8E95, 0x33BD, 0x8E96, 0x33C2, 0x8E97, 0x33C3,
+ 0x8E98, 0x3443, 0x8E9A, 0x33BF, 0x8E9D, 0x34A1, 0x8E9E, 0x349E,
+ 0x8E9F, 0x349F, 0x8EA0, 0x34A0, 0x8EA1, 0x1749, 0x8EA3, 0x34EB,
+ 0x8EA4, 0x34EA, 0x8EA5, 0x34E9, 0x8EA6, 0x350A, 0x8EA8, 0x3537,
+ 0x8EA9, 0x3524, 0x8EAA, 0x175B, 0x8EAB, 0x0512, 0x8EAC, 0x09CF,
+ 0x8EB2, 0x0F2F, 0x8EBA, 0x123D, 0x8EBD, 0x2CAD, 0x8EC0, 0x1536,
+ 0x8EC2, 0x3140, 0x8EC9, 0x3525, 0x8ECA, 0x0513, 0x8ECB, 0x068D,
+ 0x8ECC, 0x0810, 0x8ECD, 0x080F, 0x8ECF, 0x09D2, 0x8ED1, 0x1E13,
+ 0x8ED2, 0x09D0, 0x8ED3, 0x1E14, 0x8ED4, 0x09D1, 0x8ED7, 0x207D,
+ 0x8ED8, 0x2079, 0x8EDB, 0x0BB3, 0x8EDC, 0x207C, 0x8EDD, 0x207B,
+ 0x8EDE, 0x207A, 0x8EDF, 0x0BB4, 0x8EE0, 0x207E, 0x8EE1, 0x207F,
+ 0x8EE5, 0x2315, 0x8EE6, 0x2313, 0x8EE7, 0x2317, 0x8EE8, 0x2318,
+ 0x8EE9, 0x231E, 0x8EEB, 0x231A, 0x8EEC, 0x231C, 0x8EEE, 0x2314,
+ 0x8EEF, 0x230F, 0x8EF1, 0x231B, 0x8EF4, 0x231D, 0x8EF5, 0x2316,
+ 0x8EF6, 0x2319, 0x8EF7, 0x2310, 0x8EF8, 0x0D7F, 0x8EF9, 0x2312,
+ 0x8EFA, 0x2311, 0x8EFB, 0x0D7E, 0x8EFC, 0x0D80, 0x8EFE, 0x0F32,
+ 0x8EFF, 0x25BA, 0x8F00, 0x25BC, 0x8F01, 0x25BB, 0x8F02, 0x25C0,
+ 0x8F03, 0x0F30, 0x8F05, 0x25BD, 0x8F06, 0x25B9, 0x8F07, 0x25BE,
+ 0x8F08, 0x25BF, 0x8F09, 0x0F31, 0x8F0A, 0x0F33, 0x8F0B, 0x25C1,
+ 0x8F0D, 0x2820, 0x8F0E, 0x281F, 0x8F10, 0x281D, 0x8F11, 0x281E,
+ 0x8F12, 0x10BF, 0x8F13, 0x10C1, 0x8F14, 0x10BE, 0x8F15, 0x10C0,
+ 0x8F16, 0x2A7A, 0x8F17, 0x2A7B, 0x8F18, 0x2A76, 0x8F1A, 0x2A77,
+ 0x8F1B, 0x123F, 0x8F1C, 0x1244, 0x8F1D, 0x123E, 0x8F1E, 0x1245,
+ 0x8F1F, 0x1240, 0x8F20, 0x2A78, 0x8F23, 0x2A79, 0x8F24, 0x2A75,
+ 0x8F25, 0x1246, 0x8F26, 0x1242, 0x8F29, 0x1241, 0x8F2A, 0x1243,
+ 0x8F2C, 0x2A74, 0x8F2E, 0x2CAF, 0x8F2F, 0x1368, 0x8F32, 0x2CB1,
+ 0x8F33, 0x136A, 0x8F34, 0x2CB4, 0x8F35, 0x2CB0, 0x8F36, 0x2CAE,
+ 0x8F37, 0x2CB3, 0x8F38, 0x1369, 0x8F39, 0x2CB2, 0x8F3B, 0x1367,
+ 0x8F3E, 0x148E, 0x8F3F, 0x1491, 0x8F40, 0x2E7C, 0x8F42, 0x148F,
+ 0x8F43, 0x2E7B, 0x8F44, 0x148D, 0x8F45, 0x1490, 0x8F46, 0x2FF7,
+ 0x8F47, 0x2FF8, 0x8F48, 0x2FF9, 0x8F49, 0x1537, 0x8F4B, 0x2FFA,
+ 0x8F4D, 0x1538, 0x8F4E, 0x15D7, 0x8F4F, 0x3143, 0x8F50, 0x3144,
+ 0x8F51, 0x3142, 0x8F52, 0x3141, 0x8F53, 0x3145, 0x8F54, 0x15D6,
+ 0x8F55, 0x3244, 0x8F56, 0x3242, 0x8F57, 0x3243, 0x8F58, 0x3245,
+ 0x8F59, 0x3241, 0x8F5A, 0x3246, 0x8F5B, 0x331C, 0x8F5D, 0x331D,
+ 0x8F5E, 0x331B, 0x8F5F, 0x1696, 0x8F60, 0x33C4, 0x8F61, 0x16DD,
+ 0x8F62, 0x33C5, 0x8F63, 0x3445, 0x8F64, 0x3444, 0x8F9B, 0x0514,
+ 0x8F9C, 0x0D81, 0x8F9F, 0x0F34, 0x8FA3, 0x10C2, 0x8FA6, 0x136C,
+ 0x8FA8, 0x136B, 0x8FAD, 0x15D8, 0x8FAE, 0x162F, 0x8FAF, 0x1697,
+ 0x8FB0, 0x0515, 0x8FB1, 0x09D3, 0x8FB2, 0x0F35, 0x8FB4, 0x3146,
+ 0x8FB5, 0x0230, 0x8FBF, 0x18E9, 0x8FC2, 0x0516, 0x8FC4, 0x0519,
+ 0x8FC5, 0x0518, 0x8FC6, 0x0517, 0x8FC9, 0x18E8, 0x8FCB, 0x1A4A,
+ 0x8FCD, 0x1A4C, 0x8FCE, 0x068E, 0x8FD1, 0x0690, 0x8FD2, 0x1A49,
+ 0x8FD3, 0x1A4B, 0x8FD4, 0x068F, 0x8FD5, 0x1A4E, 0x8FD6, 0x1A4D,
+ 0x8FD7, 0x1A4F, 0x8FE0, 0x1C0A, 0x8FE1, 0x1C08, 0x8FE2, 0x0813,
+ 0x8FE3, 0x1C07, 0x8FE4, 0x0818, 0x8FE5, 0x0815, 0x8FE6, 0x0812,
+ 0x8FE8, 0x0819, 0x8FEA, 0x0814, 0x8FEB, 0x0817, 0x8FED, 0x0816,
+ 0x8FEE, 0x1C09, 0x8FF0, 0x0811, 0x8FF4, 0x09D9, 0x8FF5, 0x1E16,
+ 0x8FF6, 0x1E1C, 0x8FF7, 0x09D6, 0x8FF8, 0x09DD, 0x8FFA, 0x09D8,
+ 0x8FFB, 0x1E19, 0x8FFC, 0x1E1B, 0x8FFD, 0x09DB, 0x8FFE, 0x1E15,
+ 0x8FFF, 0x1E18, 0x9000, 0x09D7, 0x9001, 0x09D4, 0x9002, 0x1E17,
+ 0x9003, 0x09DA, 0x9004, 0x1E1A, 0x9005, 0x09DC, 0x9006, 0x09D5,
+ 0x900B, 0x2081, 0x900C, 0x2084, 0x900D, 0x0BB6, 0x900F, 0x0BC0,
+ 0x9010, 0x0BBC, 0x9011, 0x2082, 0x9014, 0x0BC4, 0x9015, 0x0BBD,
+ 0x9016, 0x0BC2, 0x9017, 0x0BB8, 0x9019, 0x0BB5, 0x901A, 0x0BB7,
+ 0x901B, 0x0BC3, 0x901C, 0x2083, 0x901D, 0x0BBB, 0x901E, 0x0BBE,
+ 0x901F, 0x0BBA, 0x9020, 0x0BBF, 0x9021, 0x2085, 0x9022, 0x0BC1,
+ 0x9023, 0x0BB9, 0x9024, 0x2080, 0x902D, 0x231F, 0x902E, 0x0D82,
+ 0x902F, 0x2321, 0x9031, 0x0D84, 0x9032, 0x0D86, 0x9034, 0x2320,
+ 0x9035, 0x0D83, 0x9036, 0x0D87, 0x9038, 0x0D85, 0x903C, 0x0F3B,
+ 0x903D, 0x25C6, 0x903E, 0x0F43, 0x903F, 0x25C3, 0x9041, 0x0F44,
+ 0x9042, 0x0F39, 0x9044, 0x25C4, 0x9047, 0x0F3E, 0x9049, 0x25C5,
+ 0x904A, 0x0F37, 0x904B, 0x0F36, 0x904D, 0x0F41, 0x904E, 0x0F40,
+ 0x904F, 0x0F3F, 0x9050, 0x0F3D, 0x9051, 0x0F42, 0x9052, 0x25C2,
+ 0x9053, 0x0F38, 0x9054, 0x0F3A, 0x9055, 0x0F3C, 0x9058, 0x10C4,
+ 0x9059, 0x10C7, 0x905B, 0x10CB, 0x905C, 0x10C5, 0x905D, 0x10CA,
+ 0x905E, 0x10C8, 0x9060, 0x10C3, 0x9062, 0x10C9, 0x9063, 0x10C6,
+ 0x9067, 0x2A7F, 0x9068, 0x1249, 0x9069, 0x1247, 0x906B, 0x2A80,
+ 0x906D, 0x124A, 0x906E, 0x1248, 0x906F, 0x2A7E, 0x9070, 0x2A7D,
+ 0x9072, 0x1370, 0x9073, 0x2A7C, 0x9074, 0x136E, 0x9075, 0x136D,
+ 0x9076, 0x2CB5, 0x9077, 0x124B, 0x9078, 0x136F, 0x9079, 0x2CB6,
+ 0x907A, 0x1372, 0x907B, 0x2CB7, 0x907C, 0x1371, 0x907D, 0x1493,
+ 0x907E, 0x2E7E, 0x907F, 0x1492, 0x9080, 0x1497, 0x9081, 0x1495,
+ 0x9082, 0x1496, 0x9083, 0x153A, 0x9084, 0x1494, 0x9085, 0x2E7D,
+ 0x9086, 0x2CB8, 0x9087, 0x1539, 0x9088, 0x153B, 0x908A, 0x15D9,
+ 0x908B, 0x15DA, 0x908D, 0x3247, 0x908F, 0x170C, 0x9090, 0x170B,
+ 0x9091, 0x051B, 0x9094, 0x181E, 0x9095, 0x09DE, 0x9097, 0x181B,
+ 0x9098, 0x181C, 0x9099, 0x181A, 0x909B, 0x181D, 0x909E, 0x18ED,
+ 0x909F, 0x18EA, 0x90A0, 0x18EF, 0x90A1, 0x18EB, 0x90A2, 0x051C,
+ 0x90A3, 0x051F, 0x90A5, 0x18EC, 0x90A6, 0x051E, 0x90A7, 0x18EE,
+ 0x90AA, 0x051D, 0x90AF, 0x1A52, 0x90B0, 0x1A54, 0x90B1, 0x0693,
+ 0x90B2, 0x1A50, 0x90B3, 0x1A53, 0x90B4, 0x1A51, 0x90B5, 0x0691,
+ 0x90B6, 0x0694, 0x90B8, 0x0692, 0x90BD, 0x1C0C, 0x90BE, 0x1C10,
+ 0x90BF, 0x1C0D, 0x90C1, 0x081C, 0x90C3, 0x081D, 0x90C5, 0x1C0F,
+ 0x90C7, 0x1C11, 0x90C8, 0x1C13, 0x90CA, 0x081A, 0x90CB, 0x1C12,
+ 0x90CE, 0x081B, 0x90D4, 0x208C, 0x90D5, 0x1C0E, 0x90D6, 0x1E1D,
+ 0x90D7, 0x1E26, 0x90D8, 0x1E24, 0x90D9, 0x1E1F, 0x90DA, 0x1E20,
+ 0x90DB, 0x1E25, 0x90DC, 0x1E27, 0x90DD, 0x09E0, 0x90DF, 0x1E22,
+ 0x90E0, 0x1E1E, 0x90E1, 0x09DF, 0x90E2, 0x09E1, 0x90E3, 0x1E21,
+ 0x90E4, 0x1E28, 0x90E5, 0x1E23, 0x90E8, 0x0BC5, 0x90E9, 0x208F,
+ 0x90EA, 0x2087, 0x90EB, 0x208D, 0x90EC, 0x208E, 0x90ED, 0x0BC6,
+ 0x90EF, 0x2086, 0x90F0, 0x2088, 0x90F1, 0x1C0B, 0x90F2, 0x208A,
+ 0x90F3, 0x208B, 0x90F4, 0x2089, 0x90F5, 0x0D89, 0x90F9, 0x2328,
+ 0x90FA, 0x2CB9, 0x90FB, 0x2329, 0x90FC, 0x2326, 0x90FD, 0x0BC7,
+ 0x90FE, 0x0D8B, 0x90FF, 0x2325, 0x9100, 0x232B, 0x9101, 0x232A,
+ 0x9102, 0x0D88, 0x9103, 0x232E, 0x9104, 0x2324, 0x9105, 0x232D,
+ 0x9106, 0x2322, 0x9107, 0x232C, 0x9108, 0x2327, 0x9109, 0x0D8A,
+ 0x910B, 0x25CD, 0x910D, 0x25C8, 0x910E, 0x25CE, 0x910F, 0x25C9,
+ 0x9110, 0x25C7, 0x9111, 0x25CA, 0x9112, 0x0F45, 0x9114, 0x25CC,
+ 0x9116, 0x25CB, 0x9117, 0x0F46, 0x9118, 0x10CD, 0x9119, 0x10CC,
+ 0x911A, 0x2827, 0x911B, 0x282A, 0x911C, 0x2822, 0x911D, 0x2826,
+ 0x911E, 0x10CE, 0x911F, 0x2825, 0x9120, 0x2823, 0x9121, 0x2829,
+ 0x9122, 0x2824, 0x9123, 0x2821, 0x9124, 0x2828, 0x9126, 0x2A86,
+ 0x9127, 0x124E, 0x9128, 0x2FFB, 0x9129, 0x2A83, 0x912A, 0x2A84,
+ 0x912B, 0x2A82, 0x912C, 0x2323, 0x912D, 0x124D, 0x912E, 0x2A87,
+ 0x912F, 0x2A81, 0x9130, 0x124C, 0x9131, 0x124F, 0x9132, 0x2A85,
+ 0x9133, 0x2CBA, 0x9134, 0x1373, 0x9135, 0x2CBB, 0x9136, 0x2CBC,
+ 0x9138, 0x2E7F, 0x9139, 0x1498, 0x913A, 0x2FFC, 0x913B, 0x2FFD,
+ 0x913E, 0x2FFE, 0x913F, 0x3148, 0x9140, 0x3147, 0x9141, 0x3249,
+ 0x9143, 0x3248, 0x9144, 0x331F, 0x9145, 0x3320, 0x9146, 0x331E,
+ 0x9147, 0x33C6, 0x9148, 0x16DE, 0x9149, 0x0520, 0x914A, 0x081F,
+ 0x914B, 0x081E, 0x914C, 0x09E4, 0x914D, 0x09E3, 0x914E, 0x1E2A,
+ 0x914F, 0x1E2B, 0x9150, 0x1E29, 0x9152, 0x09E2, 0x9153, 0x2093,
+ 0x9155, 0x2094, 0x9156, 0x2090, 0x9157, 0x0BC8, 0x9158, 0x2091,
+ 0x915A, 0x2092, 0x915F, 0x2331, 0x9160, 0x2333, 0x9161, 0x232F,
+ 0x9162, 0x2332, 0x9163, 0x0D8C, 0x9164, 0x2330, 0x9165, 0x0D8D,
+ 0x9168, 0x23E2, 0x9169, 0x0F49, 0x916A, 0x0F48, 0x916C, 0x0F47,
+ 0x916E, 0x25CF, 0x916F, 0x25D0, 0x9172, 0x282C, 0x9173, 0x282E,
+ 0x9174, 0x10D2, 0x9175, 0x10CF, 0x9177, 0x10D1, 0x9178, 0x10D0,
+ 0x9179, 0x282D, 0x917A, 0x282B, 0x9180, 0x2A8E, 0x9181, 0x2A8B,
+ 0x9182, 0x2A8C, 0x9183, 0x1253, 0x9184, 0x2A8D, 0x9185, 0x2A88,
+ 0x9186, 0x2A89, 0x9187, 0x1250, 0x9189, 0x1251, 0x918A, 0x2A8A,
+ 0x918B, 0x1252, 0x918D, 0x2CC0, 0x918F, 0x2CC1, 0x9190, 0x2CBE,
+ 0x9191, 0x2CBF, 0x9192, 0x1374, 0x9193, 0x2CBD, 0x9199, 0x2E83,
+ 0x919A, 0x2E80, 0x919B, 0x2E82, 0x919C, 0x149B, 0x919D, 0x2E86,
+ 0x919E, 0x149A, 0x919F, 0x2E84, 0x91A0, 0x2E87, 0x91A1, 0x2E85,
+ 0x91A2, 0x2E81, 0x91A3, 0x1499, 0x91A5, 0x3000, 0x91A7, 0x3001,
+ 0x91A8, 0x2FFF, 0x91AA, 0x3003, 0x91AB, 0x153C, 0x91AC, 0x153D,
+ 0x91AD, 0x314A, 0x91AE, 0x15DC, 0x91AF, 0x3002, 0x91B0, 0x3149,
+ 0x91B1, 0x15DB, 0x91B2, 0x324C, 0x91B3, 0x324D, 0x91B4, 0x1650,
+ 0x91B5, 0x324B, 0x91B7, 0x324A, 0x91B9, 0x3321, 0x91BA, 0x1698,
+ 0x91BC, 0x3446, 0x91BD, 0x34A3, 0x91BE, 0x34A2, 0x91C0, 0x1730,
+ 0x91C1, 0x174A, 0x91C2, 0x34A4, 0x91C3, 0x350B, 0x91C5, 0x175C,
+ 0x91C6, 0x0521, 0x91C7, 0x0695, 0x91C9, 0x0F4A, 0x91CB, 0x1651,
+ 0x91CC, 0x0522, 0x91CD, 0x0820, 0x91CE, 0x0BC9, 0x91CF, 0x0D8E,
+ 0x91D0, 0x153E, 0x91D1, 0x0696, 0x91D3, 0x1C15, 0x91D4, 0x1C14,
+ 0x91D5, 0x1E2C, 0x91D7, 0x09E7, 0x91D8, 0x09E5, 0x91D9, 0x09E9,
+ 0x91DA, 0x1E2E, 0x91DC, 0x09E8, 0x91DD, 0x09E6, 0x91E2, 0x1E2D,
+ 0x91E3, 0x0BCC, 0x91E4, 0x209A, 0x91E6, 0x0BCB, 0x91E7, 0x0BCD,
+ 0x91E8, 0x209F, 0x91E9, 0x0BCF, 0x91EA, 0x209C, 0x91EB, 0x209D,
+ 0x91EC, 0x2095, 0x91ED, 0x0BCE, 0x91EE, 0x20A0, 0x91F1, 0x2097,
+ 0x91F3, 0x2098, 0x91F4, 0x2096, 0x91F5, 0x0BCA, 0x91F7, 0x209E,
+ 0x91F8, 0x2099, 0x91F9, 0x209B, 0x91FD, 0x233F, 0x91FF, 0x233E,
+ 0x9200, 0x233C, 0x9201, 0x2334, 0x9202, 0x2343, 0x9203, 0x2337,
+ 0x9204, 0x2341, 0x9205, 0x2348, 0x9206, 0x2340, 0x9207, 0x0D96,
+ 0x9209, 0x0D92, 0x920A, 0x2335, 0x920C, 0x233B, 0x920D, 0x0D94,
+ 0x920F, 0x233A, 0x9210, 0x0D95, 0x9211, 0x0D97, 0x9212, 0x233D,
+ 0x9214, 0x0D8F, 0x9215, 0x0D90, 0x9216, 0x2349, 0x9217, 0x2347,
+ 0x9219, 0x2346, 0x921A, 0x2338, 0x921C, 0x2344, 0x921E, 0x0D93,
+ 0x9223, 0x0D91, 0x9224, 0x2345, 0x9225, 0x2336, 0x9226, 0x2339,
+ 0x9227, 0x2342, 0x922D, 0x2851, 0x922E, 0x25DA, 0x9230, 0x25D3,
+ 0x9231, 0x25E6, 0x9232, 0x25EF, 0x9233, 0x25D6, 0x9234, 0x0F55,
+ 0x9236, 0x25E3, 0x9237, 0x0F4B, 0x9238, 0x0F4D, 0x9239, 0x0F59,
+ 0x923A, 0x25D4, 0x923D, 0x0F4E, 0x923E, 0x0F50, 0x923F, 0x0F5A,
+ 0x9240, 0x0F4F, 0x9245, 0x0F58, 0x9246, 0x25DC, 0x9248, 0x25D1,
+ 0x9249, 0x0F56, 0x924A, 0x25DB, 0x924B, 0x0F52, 0x924C, 0x25ED,
+ 0x924D, 0x0F57, 0x924E, 0x25EB, 0x924F, 0x25DF, 0x9250, 0x25E9,
+ 0x9251, 0x0F54, 0x9252, 0x25D2, 0x9253, 0x25EC, 0x9254, 0x25E7,
+ 0x9256, 0x25EE, 0x9257, 0x0F4C, 0x925A, 0x0F5B, 0x925B, 0x0F51,
+ 0x925E, 0x25D8, 0x9260, 0x25E0, 0x9261, 0x25E4, 0x9263, 0x25E8,
+ 0x9264, 0x0F53, 0x9265, 0x25D7, 0x9266, 0x25D5, 0x9267, 0x25E1,
+ 0x926C, 0x25DE, 0x926D, 0x25DD, 0x926F, 0x25E2, 0x9270, 0x25E5,
+ 0x9272, 0x25EA, 0x9276, 0x2831, 0x9278, 0x10D3, 0x9279, 0x283B,
+ 0x927A, 0x2833, 0x927B, 0x10D9, 0x927C, 0x10DD, 0x927D, 0x2844,
+ 0x927E, 0x284C, 0x927F, 0x283D, 0x9280, 0x10D5, 0x9282, 0x2841,
+ 0x9283, 0x25D9, 0x9285, 0x10D6, 0x9286, 0x2848, 0x9287, 0x284D,
+ 0x9288, 0x2845, 0x928A, 0x2847, 0x928B, 0x2850, 0x928C, 0x2849,
+ 0x928D, 0x2837, 0x928E, 0x2840, 0x9291, 0x10DE, 0x9293, 0x10DA,
+ 0x9294, 0x2835, 0x9295, 0x2842, 0x9296, 0x10D8, 0x9297, 0x283C,
+ 0x9298, 0x10D7, 0x9299, 0x284A, 0x929A, 0x2839, 0x929B, 0x2832,
+ 0x929C, 0x10DB, 0x929D, 0x284F, 0x92A0, 0x2834, 0x92A1, 0x2846,
+ 0x92A2, 0x2843, 0x92A3, 0x283E, 0x92A4, 0x2830, 0x92A5, 0x282F,
+ 0x92A6, 0x2838, 0x92A7, 0x284B, 0x92A8, 0x10DC, 0x92A9, 0x284E,
+ 0x92AA, 0x2836, 0x92AB, 0x283A, 0x92AC, 0x10D4, 0x92B2, 0x125F,
+ 0x92B3, 0x125A, 0x92B4, 0x2AB0, 0x92B5, 0x2AAC, 0x92B6, 0x2A94,
+ 0x92B7, 0x1256, 0x92B9, 0x36E9, 0x92BB, 0x1255, 0x92BC, 0x125B,
+ 0x92C0, 0x2A92, 0x92C1, 0x1259, 0x92C2, 0x2A9E, 0x92C3, 0x2A90,
+ 0x92C4, 0x2A91, 0x92C5, 0x1254, 0x92C6, 0x2AAF, 0x92C7, 0x125D,
+ 0x92C8, 0x2AA1, 0x92C9, 0x2AA6, 0x92CA, 0x2AA0, 0x92CB, 0x2CD3,
+ 0x92CC, 0x2A9C, 0x92CD, 0x2AA4, 0x92CE, 0x2AA2, 0x92CF, 0x2A95,
+ 0x92D0, 0x2A8F, 0x92D1, 0x2AAA, 0x92D2, 0x125C, 0x92D3, 0x2AAB,
+ 0x92D5, 0x2AA5, 0x92D7, 0x2A9A, 0x92D8, 0x2A98, 0x92D9, 0x2A93,
+ 0x92DD, 0x2A9B, 0x92DE, 0x2AA8, 0x92DF, 0x2A97, 0x92E0, 0x2AA7,
+ 0x92E1, 0x2AAD, 0x92E4, 0x1258, 0x92E6, 0x2AA3, 0x92E7, 0x2AA9,
+ 0x92E8, 0x2A9F, 0x92E9, 0x2A99, 0x92EA, 0x1257, 0x92EE, 0x283F,
+ 0x92EF, 0x2A9D, 0x92F0, 0x125E, 0x92F1, 0x2A96, 0x92F7, 0x2CD8,
+ 0x92F8, 0x1377, 0x92F9, 0x2CD7, 0x92FA, 0x2CD5, 0x92FB, 0x2CE7,
+ 0x92FC, 0x137B, 0x92FE, 0x2CE4, 0x92FF, 0x2CDC, 0x9300, 0x2CE6,
+ 0x9301, 0x2CCE, 0x9302, 0x2CDA, 0x9304, 0x137D, 0x9306, 0x2CC6,
+ 0x9308, 0x2CC4, 0x9309, 0x2CE5, 0x930B, 0x2CE3, 0x930C, 0x2CE2,
+ 0x930D, 0x2CD2, 0x930E, 0x2CD1, 0x930F, 0x2CC7, 0x9310, 0x137F,
+ 0x9312, 0x2CCD, 0x9313, 0x2CD6, 0x9314, 0x2CE1, 0x9315, 0x1382,
+ 0x9316, 0x2CE8, 0x9318, 0x14A3, 0x9319, 0x1384, 0x931A, 0x137E,
+ 0x931B, 0x2CCB, 0x931D, 0x2CD4, 0x931E, 0x2CC3, 0x931F, 0x2CC5,
+ 0x9320, 0x1375, 0x9321, 0x1381, 0x9322, 0x137A, 0x9323, 0x2CCC,
+ 0x9324, 0x2CDB, 0x9325, 0x2AAE, 0x9326, 0x1380, 0x9327, 0x2CC2,
+ 0x9328, 0x149E, 0x9329, 0x2CDD, 0x932A, 0x2CE0, 0x932B, 0x137C,
+ 0x932D, 0x2CD0, 0x932E, 0x1383, 0x932F, 0x1379, 0x9333, 0x1378,
+ 0x9334, 0x2CD9, 0x9335, 0x2CDF, 0x9336, 0x1376, 0x9338, 0x2CC9,
+ 0x9339, 0x2CDE, 0x933C, 0x2CCA, 0x9346, 0x2CCF, 0x9347, 0x2E8D,
+ 0x9349, 0x2E92, 0x934A, 0x14A0, 0x934B, 0x14A2, 0x934C, 0x2E98,
+ 0x934D, 0x149C, 0x934E, 0x2EA6, 0x934F, 0x2E9E, 0x9350, 0x2E93,
+ 0x9351, 0x2E94, 0x9352, 0x2E9D, 0x9354, 0x14A9, 0x9355, 0x2E9C,
+ 0x9356, 0x2E8C, 0x9357, 0x2E9B, 0x9358, 0x2E8F, 0x9359, 0x2EA7,
+ 0x935A, 0x14A8, 0x935B, 0x14A6, 0x935C, 0x2E90, 0x935E, 0x2EA3,
+ 0x9360, 0x2E95, 0x9361, 0x2EA2, 0x9363, 0x2EA4, 0x9364, 0x2E8B,
+ 0x9365, 0x14A1, 0x9367, 0x2EA5, 0x936A, 0x2E99, 0x936C, 0x14A5,
+ 0x936D, 0x2E96, 0x9370, 0x14A7, 0x9371, 0x2E9F, 0x9375, 0x149F,
+ 0x9376, 0x2E91, 0x9377, 0x2EA0, 0x9379, 0x2E9A, 0x937A, 0x2CC8,
+ 0x937B, 0x2EA1, 0x937C, 0x2E8E, 0x937E, 0x14A4, 0x9380, 0x3014,
+ 0x9382, 0x149D, 0x9383, 0x2E89, 0x9388, 0x3011, 0x9389, 0x300A,
+ 0x938A, 0x1540, 0x938C, 0x3005, 0x938D, 0x3015, 0x938E, 0x300C,
+ 0x938F, 0x2E97, 0x9391, 0x3017, 0x9392, 0x3006, 0x9394, 0x153F,
+ 0x9395, 0x3010, 0x9396, 0x1541, 0x9397, 0x1549, 0x9398, 0x1547,
+ 0x9399, 0x3012, 0x939A, 0x1548, 0x939B, 0x3008, 0x939D, 0x3009,
+ 0x939E, 0x300E, 0x939F, 0x3013, 0x93A1, 0x2E88, 0x93A2, 0x1542,
+ 0x93A3, 0x301C, 0x93A4, 0x3019, 0x93A5, 0x3160, 0x93A6, 0x300F,
+ 0x93A7, 0x300B, 0x93A8, 0x301A, 0x93A9, 0x3155, 0x93AA, 0x300D,
+ 0x93AC, 0x1545, 0x93AE, 0x1544, 0x93AF, 0x2E8A, 0x93B0, 0x1546,
+ 0x93B1, 0x3016, 0x93B2, 0x3018, 0x93B3, 0x1543, 0x93B4, 0x301B,
+ 0x93B5, 0x3004, 0x93B7, 0x3007, 0x93C0, 0x315E, 0x93C2, 0x314E,
+ 0x93C3, 0x15E0, 0x93C4, 0x315C, 0x93C7, 0x314C, 0x93C8, 0x15E1,
+ 0x93CA, 0x3157, 0x93CC, 0x3153, 0x93CD, 0x15E6, 0x93CE, 0x315D,
+ 0x93CF, 0x314D, 0x93D0, 0x3150, 0x93D1, 0x15DE, 0x93D2, 0x315F,
+ 0x93D4, 0x3158, 0x93D5, 0x315B, 0x93D6, 0x15E4, 0x93D7, 0x15E9,
+ 0x93D8, 0x15E7, 0x93D9, 0x3154, 0x93DA, 0x314F, 0x93DC, 0x15E2,
+ 0x93DD, 0x15E3, 0x93DE, 0x314B, 0x93DF, 0x15DF, 0x93E1, 0x15DD,
+ 0x93E2, 0x15E5, 0x93E3, 0x315A, 0x93E4, 0x15E8, 0x93E6, 0x3156,
+ 0x93E7, 0x3161, 0x93E8, 0x15EA, 0x93EC, 0x3152, 0x93EE, 0x3159,
+ 0x93F5, 0x325A, 0x93F6, 0x3269, 0x93F7, 0x325C, 0x93F8, 0x3263,
+ 0x93F9, 0x3151, 0x93FA, 0x3261, 0x93FB, 0x3250, 0x93FC, 0x3267,
+ 0x93FD, 0x1654, 0x93FE, 0x3254, 0x93FF, 0x3266, 0x9400, 0x325B,
+ 0x9403, 0x1653, 0x9406, 0x326B, 0x9407, 0x325D, 0x9409, 0x3262,
+ 0x940A, 0x3265, 0x940B, 0x324E, 0x940C, 0x3268, 0x940D, 0x3259,
+ 0x940E, 0x325E, 0x940F, 0x3252, 0x9410, 0x3256, 0x9411, 0x326A,
+ 0x9412, 0x3260, 0x9413, 0x324F, 0x9414, 0x3253, 0x9415, 0x3255,
+ 0x9416, 0x325F, 0x9418, 0x1652, 0x9419, 0x3258, 0x9420, 0x3251,
+ 0x9428, 0x3257, 0x9429, 0x3325, 0x942A, 0x3329, 0x942B, 0x169F,
+ 0x942C, 0x332B, 0x942E, 0x1699, 0x9430, 0x3327, 0x9431, 0x332D,
+ 0x9432, 0x169E, 0x9433, 0x169A, 0x9435, 0x169B, 0x9436, 0x3324,
+ 0x9437, 0x332A, 0x9438, 0x169D, 0x9439, 0x3328, 0x943A, 0x169C,
+ 0x943B, 0x3323, 0x943C, 0x3264, 0x943D, 0x3326, 0x943F, 0x3322,
+ 0x9440, 0x332C, 0x9444, 0x16DF, 0x9445, 0x33CD, 0x9446, 0x33D0,
+ 0x9447, 0x33CC, 0x9448, 0x33CE, 0x9449, 0x33CF, 0x944A, 0x33C9,
+ 0x944B, 0x33CA, 0x944C, 0x33C7, 0x944F, 0x33CB, 0x9450, 0x33C8,
+ 0x9451, 0x16E0, 0x9452, 0x16E1, 0x9455, 0x3448, 0x9457, 0x344A,
+ 0x945D, 0x3449, 0x945E, 0x344B, 0x9460, 0x170E, 0x9462, 0x3447,
+ 0x9463, 0x170D, 0x9464, 0x170F, 0x9468, 0x34A6, 0x9469, 0x34A7,
+ 0x946A, 0x1731, 0x946B, 0x34A5, 0x946D, 0x34ED, 0x946E, 0x34EC,
+ 0x946F, 0x34EE, 0x9470, 0x174C, 0x9471, 0x34EF, 0x9472, 0x174B,
+ 0x9473, 0x34F0, 0x9474, 0x350C, 0x9475, 0x350F, 0x9476, 0x350E,
+ 0x9477, 0x1755, 0x9478, 0x350D, 0x947C, 0x175F, 0x947D, 0x175D,
+ 0x947E, 0x175E, 0x947F, 0x1764, 0x9480, 0x3539, 0x9481, 0x353A,
+ 0x9482, 0x3538, 0x9483, 0x3540, 0x9577, 0x0697, 0x957A, 0x20A1,
+ 0x957B, 0x234A, 0x957C, 0x2AB1, 0x957D, 0x3162, 0x9580, 0x0698,
+ 0x9582, 0x0821, 0x9583, 0x09EA, 0x9586, 0x20A2, 0x9588, 0x20A3,
+ 0x9589, 0x0BD0, 0x958B, 0x0D9A, 0x958C, 0x234C, 0x958D, 0x234B,
+ 0x958E, 0x0D9E, 0x958F, 0x0D99, 0x9590, 0x234D, 0x9591, 0x0D9B,
+ 0x9592, 0x0D9D, 0x9593, 0x0D9C, 0x9594, 0x0D98, 0x9598, 0x0F5C,
+ 0x959B, 0x25F3, 0x959C, 0x25F1, 0x959E, 0x25F2, 0x959F, 0x25F0,
+ 0x95A1, 0x10DF, 0x95A3, 0x10E2, 0x95A4, 0x10E4, 0x95A5, 0x10E3,
+ 0x95A8, 0x10E0, 0x95A9, 0x10E1, 0x95AB, 0x2AB3, 0x95AC, 0x2AB2,
+ 0x95AD, 0x1260, 0x95AE, 0x2AB4, 0x95B0, 0x2AB5, 0x95B1, 0x1261,
+ 0x95B5, 0x2CF0, 0x95B6, 0x2CEE, 0x95B7, 0x2EAD, 0x95B9, 0x2CEC,
+ 0x95BA, 0x2CED, 0x95BB, 0x1385, 0x95BC, 0x2CE9, 0x95BD, 0x2CF1,
+ 0x95BE, 0x2CEB, 0x95BF, 0x2CEF, 0x95C0, 0x2EA9, 0x95C3, 0x2EAB,
+ 0x95C5, 0x2EAC, 0x95C6, 0x14AE, 0x95C7, 0x2EA8, 0x95C8, 0x14AD,
+ 0x95C9, 0x2EAA, 0x95CA, 0x14AA, 0x95CB, 0x14AB, 0x95CC, 0x14AC,
+ 0x95CD, 0x2CEA, 0x95D0, 0x154C, 0x95D1, 0x301F, 0x95D2, 0x301D,
+ 0x95D3, 0x301E, 0x95D4, 0x154A, 0x95D5, 0x154D, 0x95D6, 0x154B,
+ 0x95DA, 0x3163, 0x95DB, 0x3164, 0x95DC, 0x15EB, 0x95DE, 0x326C,
+ 0x95DF, 0x326E, 0x95E0, 0x326D, 0x95E1, 0x1655, 0x95E2, 0x16A0,
+ 0x95E3, 0x3330, 0x95E4, 0x332F, 0x95E5, 0x332E, 0x961C, 0x0699,
+ 0x961E, 0x17B4, 0x9620, 0x1821, 0x9621, 0x0414, 0x9622, 0x181F,
+ 0x9623, 0x1822, 0x9624, 0x1820, 0x9628, 0x18F1, 0x962A, 0x0526,
+ 0x962C, 0x0527, 0x962D, 0x18F3, 0x962E, 0x0524, 0x962F, 0x18F2,
+ 0x9630, 0x18F0, 0x9631, 0x0525, 0x9632, 0x0523, 0x9639, 0x1A55,
+ 0x963A, 0x1A58, 0x963B, 0x069C, 0x963C, 0x1A57, 0x963D, 0x1A56,
+ 0x963F, 0x069B, 0x9640, 0x069A, 0x9642, 0x069E, 0x9643, 0x1A59,
+ 0x9644, 0x069D, 0x964A, 0x1C1A, 0x964B, 0x0823, 0x964C, 0x0824,
+ 0x964D, 0x0825, 0x964E, 0x1C1B, 0x964F, 0x1C17, 0x9650, 0x0822,
+ 0x9651, 0x1C18, 0x9653, 0x1C19, 0x9654, 0x1C16, 0x9658, 0x09F1,
+ 0x965B, 0x09EE, 0x965C, 0x1E2F, 0x965D, 0x09EF, 0x965E, 0x09F2,
+ 0x965F, 0x1E30, 0x9661, 0x09ED, 0x9662, 0x09EB, 0x9663, 0x09EC,
+ 0x9664, 0x09F0, 0x966A, 0x0BD1, 0x966B, 0x20A6, 0x966C, 0x0BD9,
+ 0x966D, 0x20A5, 0x966F, 0x20A8, 0x9670, 0x0BD5, 0x9671, 0x20A7,
+ 0x9672, 0x0DA6, 0x9673, 0x0BD3, 0x9674, 0x0BD6, 0x9675, 0x0BD2,
+ 0x9676, 0x0BD7, 0x9677, 0x0BD8, 0x9678, 0x0BD4, 0x967C, 0x20A4,
+ 0x967D, 0x0DA2, 0x967E, 0x234F, 0x9680, 0x2353, 0x9683, 0x2352,
+ 0x9684, 0x0DA7, 0x9685, 0x0DA3, 0x9686, 0x0DA4, 0x9687, 0x234E,
+ 0x9688, 0x2350, 0x9689, 0x2351, 0x968A, 0x0D9F, 0x968B, 0x0DA1,
+ 0x968D, 0x0DA5, 0x968E, 0x0DA0, 0x9691, 0x25F6, 0x9692, 0x25F4,
+ 0x9693, 0x25F5, 0x9694, 0x0F5E, 0x9695, 0x0F5F, 0x9697, 0x25F7,
+ 0x9698, 0x0F5D, 0x9699, 0x10E5, 0x969B, 0x10E7, 0x969C, 0x10E6,
+ 0x969E, 0x2852, 0x96A1, 0x2853, 0x96A2, 0x2AB7, 0x96A4, 0x2AB6,
+ 0x96A7, 0x1386, 0x96A8, 0x1387, 0x96A9, 0x2CF2, 0x96AA, 0x1388,
+ 0x96AC, 0x2EB0, 0x96AE, 0x2EAE, 0x96B0, 0x2EAF, 0x96B1, 0x14AF,
+ 0x96B3, 0x3020, 0x96B4, 0x15EC, 0x96B6, 0x0231, 0x96B8, 0x14B0,
+ 0x96B9, 0x069F, 0x96BB, 0x09F3, 0x96BC, 0x1E31, 0x96BF, 0x20A9,
+ 0x96C0, 0x0BDA, 0x96C1, 0x0DA8, 0x96C2, 0x2354, 0x96C3, 0x2356,
+ 0x96C4, 0x0DAA, 0x96C5, 0x0DA9, 0x96C6, 0x0DAB, 0x96C7, 0x0DAC,
+ 0x96C8, 0x2355, 0x96C9, 0x0F62, 0x96CA, 0x0F63, 0x96CB, 0x0F61,
+ 0x96CC, 0x10E8, 0x96CD, 0x0F60, 0x96CE, 0x25F8, 0x96D2, 0x10E9,
+ 0x96D3, 0x2AB8, 0x96D4, 0x2CF3, 0x96D5, 0x1389, 0x96D6, 0x14B1,
+ 0x96D7, 0x3021, 0x96D8, 0x3025, 0x96D9, 0x1550, 0x96DA, 0x3022,
+ 0x96DB, 0x1551, 0x96DC, 0x154F, 0x96DD, 0x3026, 0x96DE, 0x1552,
+ 0x96DF, 0x3024, 0x96E1, 0x3165, 0x96E2, 0x154E, 0x96E3, 0x15ED,
+ 0x96E5, 0x34A8, 0x96E8, 0x06A0, 0x96E9, 0x0BDC, 0x96EA, 0x0BDB,
+ 0x96EF, 0x0DAD, 0x96F0, 0x2358, 0x96F1, 0x2357, 0x96F2, 0x0DAE,
+ 0x96F5, 0x25FC, 0x96F6, 0x0F67, 0x96F7, 0x0F64, 0x96F8, 0x25FB,
+ 0x96F9, 0x0F66, 0x96FA, 0x25F9, 0x96FB, 0x0F65, 0x96FD, 0x25FA,
+ 0x96FF, 0x2854, 0x9700, 0x10EA, 0x9702, 0x2ABB, 0x9704, 0x1262,
+ 0x9705, 0x2AB9, 0x9706, 0x1263, 0x9707, 0x1264, 0x9708, 0x2ABA,
+ 0x9709, 0x1265, 0x970B, 0x2CF4, 0x970D, 0x138D, 0x970E, 0x138A,
+ 0x970F, 0x138F, 0x9710, 0x2CF6, 0x9711, 0x138B, 0x9712, 0x2CF5,
+ 0x9713, 0x138E, 0x9716, 0x138C, 0x9718, 0x2EB3, 0x9719, 0x2EB5,
+ 0x971C, 0x14B2, 0x971D, 0x2EB4, 0x971E, 0x14B3, 0x971F, 0x2EB2,
+ 0x9720, 0x2EB1, 0x9722, 0x3028, 0x9723, 0x3027, 0x9724, 0x1553,
+ 0x9725, 0x3029, 0x9726, 0x316A, 0x9727, 0x15EF, 0x9728, 0x3169,
+ 0x9729, 0x3166, 0x972A, 0x15EE, 0x972B, 0x3167, 0x972C, 0x3168,
+ 0x972E, 0x326F, 0x972F, 0x3270, 0x9730, 0x1656, 0x9732, 0x16A3,
+ 0x9735, 0x3331, 0x9738, 0x16A1, 0x9739, 0x16A2, 0x973A, 0x3332,
+ 0x973D, 0x16E2, 0x973E, 0x16E3, 0x973F, 0x33D1, 0x9742, 0x1732,
+ 0x9743, 0x34AA, 0x9744, 0x1734, 0x9746, 0x34A9, 0x9747, 0x34AB,
+ 0x9748, 0x1733, 0x9749, 0x34F1, 0x974B, 0x3526, 0x9752, 0x06A1,
+ 0x9756, 0x0F68, 0x9758, 0x2855, 0x975A, 0x2ABC, 0x975B, 0x1390,
+ 0x975C, 0x1391, 0x975E, 0x06A2, 0x9760, 0x1266, 0x9761, 0x15F0,
+ 0x9762, 0x0826, 0x9766, 0x1392, 0x9768, 0x1710, 0x9769, 0x0827,
+ 0x976A, 0x20AA, 0x976C, 0x2359, 0x976E, 0x235B, 0x9770, 0x235A,
+ 0x9772, 0x2600, 0x9773, 0x25FD, 0x9774, 0x0F69, 0x9776, 0x0F6A,
+ 0x9777, 0x25FE, 0x9778, 0x25FF, 0x977A, 0x2857, 0x977B, 0x285C,
+ 0x977C, 0x10EB, 0x977D, 0x2856, 0x977E, 0x2858, 0x977F, 0x285F,
+ 0x9780, 0x285A, 0x9781, 0x285E, 0x9782, 0x285B, 0x9783, 0x2859,
+ 0x9784, 0x285D, 0x9785, 0x10EC, 0x9788, 0x2ABF, 0x978A, 0x2ABD,
+ 0x978B, 0x1268, 0x978D, 0x1267, 0x978E, 0x2ABE, 0x978F, 0x1269,
+ 0x9794, 0x2CF9, 0x9797, 0x2CF8, 0x9798, 0x1393, 0x9799, 0x2CF7,
+ 0x979A, 0x2EB6, 0x979C, 0x2EB8, 0x979D, 0x2EBA, 0x979E, 0x2EB9,
+ 0x97A0, 0x14B4, 0x97A1, 0x2EB7, 0x97A2, 0x3030, 0x97A3, 0x1554,
+ 0x97A4, 0x302E, 0x97A5, 0x3031, 0x97A6, 0x1555, 0x97A8, 0x302C,
+ 0x97AA, 0x302F, 0x97AB, 0x302D, 0x97AC, 0x302A, 0x97AD, 0x1556,
+ 0x97AE, 0x302B, 0x97B3, 0x316B, 0x97B6, 0x316D, 0x97B7, 0x316C,
+ 0x97B9, 0x3271, 0x97BB, 0x3272, 0x97BF, 0x3333, 0x97C1, 0x16E5,
+ 0x97C3, 0x16E4, 0x97C4, 0x344C, 0x97C5, 0x344D, 0x97C6, 0x1735,
+ 0x97C7, 0x34AC, 0x97C9, 0x1756, 0x97CB, 0x0828, 0x97CC, 0x0DAF,
+ 0x97CD, 0x2861, 0x97CE, 0x2860, 0x97CF, 0x2AC1, 0x97D0, 0x2AC0,
+ 0x97D3, 0x14B5, 0x97D4, 0x2EBC, 0x97D5, 0x2EBB, 0x97D6, 0x3034,
+ 0x97D7, 0x3032, 0x97D8, 0x3035, 0x97D9, 0x3033, 0x97DC, 0x15F1,
+ 0x97DD, 0x316E, 0x97DE, 0x316F, 0x97DF, 0x3170, 0x97E1, 0x3334,
+ 0x97E3, 0x33D2, 0x97E5, 0x34AD, 0x97ED, 0x0829, 0x97F0, 0x2CFA,
+ 0x97F1, 0x2EBD, 0x97F3, 0x082A, 0x97F6, 0x10ED, 0x97F8, 0x2CFB,
+ 0x97F9, 0x1557, 0x97FA, 0x3036, 0x97FB, 0x15F2, 0x97FD, 0x3273,
+ 0x97FE, 0x3274, 0x97FF, 0x16A4, 0x9800, 0x344E, 0x9801, 0x082B,
+ 0x9802, 0x0BDF, 0x9803, 0x0BE0, 0x9804, 0x20AB, 0x9805, 0x0DB0,
+ 0x9806, 0x0DB1, 0x9807, 0x235C, 0x9808, 0x0DB2, 0x980A, 0x0F6E,
+ 0x980C, 0x0F70, 0x980D, 0x2602, 0x980E, 0x2603, 0x980F, 0x2601,
+ 0x9810, 0x0F6B, 0x9811, 0x0F6C, 0x9812, 0x0F6F, 0x9813, 0x0F6D,
+ 0x9816, 0x2862, 0x9817, 0x10EE, 0x9818, 0x10EF, 0x981B, 0x2AC8,
+ 0x981C, 0x126C, 0x981D, 0x2AC3, 0x981E, 0x2AC2, 0x9820, 0x2AC7,
+ 0x9821, 0x126A, 0x9824, 0x139A, 0x9826, 0x2AC4, 0x9827, 0x2AC9,
+ 0x9828, 0x2AC6, 0x9829, 0x2AC5, 0x982B, 0x126B, 0x982D, 0x1398,
+ 0x982F, 0x2CFD, 0x9830, 0x1394, 0x9832, 0x2CFE, 0x9835, 0x2CFC,
+ 0x9837, 0x1397, 0x9838, 0x1395, 0x9839, 0x1399, 0x983B, 0x1396,
+ 0x9841, 0x2EBE, 0x9843, 0x2EC3, 0x9844, 0x2EBF, 0x9845, 0x2EC2,
+ 0x9846, 0x14B6, 0x9848, 0x2DF2, 0x9849, 0x2EC1, 0x984A, 0x2EC0,
+ 0x984C, 0x155A, 0x984D, 0x1558, 0x984E, 0x155B, 0x984F, 0x1559,
+ 0x9850, 0x3037, 0x9851, 0x3038, 0x9852, 0x3039, 0x9853, 0x155C,
+ 0x9857, 0x3174, 0x9858, 0x15F4, 0x9859, 0x3172, 0x985B, 0x15F5,
+ 0x985C, 0x3171, 0x985D, 0x3173, 0x985E, 0x15F3, 0x985F, 0x3278,
+ 0x9860, 0x3275, 0x9862, 0x3276, 0x9863, 0x3277, 0x9864, 0x3335,
+ 0x9865, 0x16A6, 0x9867, 0x16A5, 0x9869, 0x33D4, 0x986A, 0x33D3,
+ 0x986B, 0x16E6, 0x986F, 0x1711, 0x9870, 0x1736, 0x9871, 0x174D,
+ 0x9872, 0x34F2, 0x9873, 0x3527, 0x9874, 0x3528, 0x98A8, 0x082C,
+ 0x98A9, 0x235D, 0x98AC, 0x2604, 0x98AD, 0x2863, 0x98AE, 0x2864,
+ 0x98AF, 0x10F0, 0x98B1, 0x10F1, 0x98B2, 0x2ACA, 0x98B3, 0x126D,
+ 0x98B6, 0x14B7, 0x98B8, 0x303A, 0x98BA, 0x155D, 0x98BB, 0x3177,
+ 0x98BC, 0x15F6, 0x98BD, 0x3176, 0x98BE, 0x3178, 0x98BF, 0x3175,
+ 0x98C0, 0x3338, 0x98C1, 0x3279, 0x98C2, 0x327A, 0x98C4, 0x1657,
+ 0x98C6, 0x3337, 0x98C9, 0x3336, 0x98CB, 0x33D5, 0x98CC, 0x3529,
+ 0x98DB, 0x082D, 0x98DF, 0x082E, 0x98E2, 0x09F4, 0x98E3, 0x1E32,
+ 0x98E5, 0x20AC, 0x98E7, 0x0DB3, 0x98E9, 0x0DB6, 0x98EA, 0x0DB4,
+ 0x98EB, 0x235E, 0x98ED, 0x0DB8, 0x98EF, 0x0DB5, 0x98F2, 0x0DB7,
+ 0x98F4, 0x0F72, 0x98F6, 0x2605, 0x98F9, 0x2606, 0x98FA, 0x2ACC,
+ 0x98FC, 0x0F71, 0x98FD, 0x0F73, 0x98FE, 0x0F74, 0x9900, 0x2866,
+ 0x9902, 0x2865, 0x9903, 0x10F2, 0x9905, 0x10F3, 0x9907, 0x2867,
+ 0x9908, 0x2ACB, 0x9909, 0x10F5, 0x990A, 0x126E, 0x990C, 0x10F4,
+ 0x9910, 0x139B, 0x9911, 0x2ACD, 0x9912, 0x1270, 0x9913, 0x126F,
+ 0x9914, 0x2ACE, 0x9915, 0x2AD1, 0x9916, 0x2ACF, 0x9917, 0x2AD0,
+ 0x9918, 0x1271, 0x991A, 0x13A0, 0x991B, 0x139E, 0x991E, 0x139D,
+ 0x991F, 0x2D00, 0x9921, 0x139F, 0x9924, 0x2CFF, 0x9925, 0x2EC4,
+ 0x9927, 0x2D01, 0x9928, 0x139C, 0x9929, 0x2D02, 0x992A, 0x2EC7,
+ 0x992B, 0x2EC5, 0x992C, 0x2EC6, 0x992D, 0x2ECB, 0x992E, 0x1561,
+ 0x992F, 0x2ECA, 0x9930, 0x2ECD, 0x9931, 0x2ECC, 0x9932, 0x2EC9,
+ 0x9933, 0x2EC8, 0x9935, 0x14B8, 0x993A, 0x303D, 0x993C, 0x303C,
+ 0x993D, 0x1560, 0x993E, 0x155E, 0x993F, 0x155F, 0x9941, 0x303B,
+ 0x9943, 0x317B, 0x9945, 0x15F7, 0x9947, 0x317A, 0x9948, 0x3179,
+ 0x9949, 0x15F8, 0x994B, 0x327F, 0x994C, 0x327E, 0x994E, 0x327C,
+ 0x9950, 0x327B, 0x9951, 0x1659, 0x9952, 0x1658, 0x9953, 0x3280,
+ 0x9954, 0x33D6, 0x9955, 0x16E7, 0x9956, 0x333A, 0x9957, 0x16A7,
+ 0x9958, 0x3339, 0x9959, 0x327D, 0x995B, 0x33D7, 0x995C, 0x1712,
+ 0x995E, 0x174E, 0x995F, 0x34F3, 0x9961, 0x352A, 0x9996, 0x082F,
+ 0x9997, 0x20AD, 0x9998, 0x2ECE, 0x9999, 0x0830, 0x999C, 0x2869,
+ 0x999D, 0x2868, 0x999E, 0x2D03, 0x99A1, 0x2ED0, 0x99A3, 0x2ECF,
+ 0x99A5, 0x1562, 0x99A6, 0x317C, 0x99A7, 0x317D, 0x99A8, 0x165A,
+ 0x99AB, 0x352B, 0x99AC, 0x09F5, 0x99AD, 0x0DBA, 0x99AE, 0x0DB9,
+ 0x99AF, 0x2607, 0x99B0, 0x2609, 0x99B1, 0x0F76, 0x99B2, 0x2608,
+ 0x99B3, 0x0F75, 0x99B4, 0x0F77, 0x99B5, 0x260A, 0x99B9, 0x286B,
+ 0x99BA, 0x286D, 0x99BB, 0x286C, 0x99BD, 0x286F, 0x99C1, 0x10F6,
+ 0x99C2, 0x286E, 0x99C3, 0x286A, 0x99C7, 0x2870, 0x99C9, 0x2AD8,
+ 0x99CB, 0x2ADB, 0x99CC, 0x2ADD, 0x99CD, 0x2AD3, 0x99CE, 0x2AD7,
+ 0x99CF, 0x2AD4, 0x99D0, 0x1273, 0x99D1, 0x1276, 0x99D2, 0x1278,
+ 0x99D3, 0x2AD5, 0x99D4, 0x2AD6, 0x99D5, 0x1277, 0x99D6, 0x2AD9,
+ 0x99D7, 0x2ADC, 0x99D8, 0x2ADA, 0x99D9, 0x1279, 0x99DB, 0x1275,
+ 0x99DC, 0x2AD2, 0x99DD, 0x1272, 0x99DF, 0x1274, 0x99E2, 0x13A2,
+ 0x99E3, 0x2D09, 0x99E4, 0x2D07, 0x99E5, 0x2D06, 0x99E7, 0x2D0C,
+ 0x99E9, 0x2D0B, 0x99EA, 0x2D0A, 0x99EC, 0x2D05, 0x99ED, 0x13A1,
+ 0x99EE, 0x2D04, 0x99F0, 0x2D08, 0x99F1, 0x13A3, 0x99F4, 0x2ED3,
+ 0x99F6, 0x2ED7, 0x99F7, 0x2ED4, 0x99F8, 0x2ED6, 0x99F9, 0x2ED5,
+ 0x99FA, 0x2ED2, 0x99FB, 0x2ED8, 0x99FC, 0x2EDB, 0x99FD, 0x2ED9,
+ 0x99FE, 0x2EDA, 0x99FF, 0x14BA, 0x9A01, 0x14B9, 0x9A02, 0x2ED1,
+ 0x9A03, 0x2EDC, 0x9A04, 0x3042, 0x9A05, 0x3045, 0x9A06, 0x3047,
+ 0x9A07, 0x3046, 0x9A09, 0x3040, 0x9A0A, 0x3044, 0x9A0B, 0x303F,
+ 0x9A0D, 0x3041, 0x9A0E, 0x1563, 0x9A0F, 0x303E, 0x9A11, 0x3043,
+ 0x9A14, 0x318A, 0x9A15, 0x317F, 0x9A16, 0x15F9, 0x9A19, 0x15FA,
+ 0x9A1A, 0x317E, 0x9A1B, 0x3183, 0x9A1C, 0x3189, 0x9A1D, 0x3181,
+ 0x9A1E, 0x3188, 0x9A20, 0x3185, 0x9A22, 0x3184, 0x9A23, 0x3187,
+ 0x9A24, 0x3182, 0x9A25, 0x3180, 0x9A27, 0x3186, 0x9A29, 0x3287,
+ 0x9A2A, 0x3285, 0x9A2B, 0x165B, 0x9A2C, 0x3284, 0x9A2D, 0x328A,
+ 0x9A2E, 0x3288, 0x9A30, 0x165C, 0x9A31, 0x3283, 0x9A32, 0x3281,
+ 0x9A34, 0x3282, 0x9A35, 0x165E, 0x9A36, 0x3286, 0x9A37, 0x165D,
+ 0x9A38, 0x3289, 0x9A39, 0x333B, 0x9A3A, 0x3341, 0x9A3D, 0x333C,
+ 0x9A3E, 0x16AB, 0x9A3F, 0x3342, 0x9A40, 0x16AA, 0x9A41, 0x3340,
+ 0x9A42, 0x333F, 0x9A43, 0x16A9, 0x9A44, 0x333E, 0x9A45, 0x16A8,
+ 0x9A46, 0x333D, 0x9A48, 0x33DD, 0x9A49, 0x33DF, 0x9A4A, 0x33DE,
+ 0x9A4C, 0x33DB, 0x9A4D, 0x16E9, 0x9A4E, 0x33D8, 0x9A4F, 0x33DC,
+ 0x9A50, 0x33E1, 0x9A52, 0x33E0, 0x9A53, 0x33D9, 0x9A54, 0x33DA,
+ 0x9A55, 0x16E8, 0x9A56, 0x344F, 0x9A57, 0x1715, 0x9A59, 0x3450,
+ 0x9A5A, 0x1713, 0x9A5B, 0x1714, 0x9A5E, 0x34AE, 0x9A5F, 0x1737,
+ 0x9A60, 0x3510, 0x9A62, 0x1757, 0x9A64, 0x352C, 0x9A65, 0x1758,
+ 0x9A66, 0x352D, 0x9A67, 0x352E, 0x9A68, 0x353C, 0x9A69, 0x353B,
+ 0x9A6A, 0x1767, 0x9A6B, 0x3544, 0x9AA8, 0x09F6, 0x9AAB, 0x260C,
+ 0x9AAD, 0x260B, 0x9AAF, 0x10F7, 0x9AB0, 0x10F8, 0x9AB1, 0x2871,
+ 0x9AB3, 0x2ADE, 0x9AB4, 0x2D0F, 0x9AB7, 0x127A, 0x9AB8, 0x13A4,
+ 0x9AB9, 0x2D0D, 0x9ABB, 0x2D10, 0x9ABC, 0x13A5, 0x9ABE, 0x2EDD,
+ 0x9ABF, 0x2D0E, 0x9AC0, 0x3048, 0x9AC1, 0x1564, 0x9AC2, 0x318B,
+ 0x9AC6, 0x328D, 0x9AC7, 0x328B, 0x9ACA, 0x328C, 0x9ACD, 0x3343,
+ 0x9ACF, 0x16AC, 0x9AD0, 0x33E2, 0x9AD1, 0x1718, 0x9AD2, 0x16EA,
+ 0x9AD3, 0x1716, 0x9AD4, 0x1717, 0x9AD5, 0x34AF, 0x9AD6, 0x174F,
+ 0x9AD8, 0x09F7, 0x9ADC, 0x3049, 0x9ADF, 0x1E33, 0x9AE1, 0x0F78,
+ 0x9AE3, 0x2872, 0x9AE6, 0x10F9, 0x9AE7, 0x2873, 0x9AEB, 0x2AE0,
+ 0x9AEC, 0x2ADF, 0x9AED, 0x13A7, 0x9AEE, 0x127B, 0x9AEF, 0x127C,
+ 0x9AF1, 0x2AE3, 0x9AF2, 0x2AE2, 0x9AF3, 0x2AE1, 0x9AF6, 0x2D11,
+ 0x9AF7, 0x2D14, 0x9AF9, 0x2D13, 0x9AFA, 0x2D12, 0x9AFB, 0x13A6,
+ 0x9AFC, 0x2EE1, 0x9AFD, 0x2EDF, 0x9AFE, 0x2EDE, 0x9B01, 0x2EE0,
+ 0x9B03, 0x1565, 0x9B04, 0x304B, 0x9B05, 0x304C, 0x9B06, 0x1566,
+ 0x9B08, 0x304A, 0x9B0A, 0x318D, 0x9B0B, 0x318C, 0x9B0C, 0x318F,
+ 0x9B0D, 0x15FB, 0x9B0E, 0x318E, 0x9B10, 0x328E, 0x9B11, 0x3290,
+ 0x9B12, 0x328F, 0x9B15, 0x3344, 0x9B16, 0x3347, 0x9B17, 0x3345,
+ 0x9B18, 0x3346, 0x9B19, 0x33E3, 0x9B1A, 0x16EB, 0x9B1E, 0x3451,
+ 0x9B1F, 0x3452, 0x9B20, 0x3453, 0x9B22, 0x1738, 0x9B23, 0x1750,
+ 0x9B24, 0x352F, 0x9B25, 0x09F8, 0x9B27, 0x127D, 0x9B28, 0x13A8,
+ 0x9B29, 0x304D, 0x9B2B, 0x33E4, 0x9B2E, 0x3511, 0x9B2F, 0x1E34,
+ 0x9B31, 0x1768, 0x9B32, 0x09F9, 0x9B33, 0x2D15, 0x9B35, 0x304E,
+ 0x9B37, 0x3190, 0x9B3A, 0x3348, 0x9B3B, 0x33E5, 0x9B3C, 0x09FA,
+ 0x9B3E, 0x2874, 0x9B3F, 0x2875, 0x9B41, 0x10FA, 0x9B42, 0x10FB,
+ 0x9B43, 0x2AE5, 0x9B44, 0x127F, 0x9B45, 0x127E, 0x9B46, 0x2AE4,
+ 0x9B48, 0x2EE2, 0x9B4A, 0x304F, 0x9B4B, 0x3051, 0x9B4C, 0x3050,
+ 0x9B4D, 0x1569, 0x9B4E, 0x1568, 0x9B4F, 0x1567, 0x9B51, 0x16AE,
+ 0x9B52, 0x3349, 0x9B54, 0x16AD, 0x9B55, 0x33E7, 0x9B56, 0x33E6,
+ 0x9B58, 0x1739, 0x9B59, 0x34B0, 0x9B5A, 0x0BE1, 0x9B5B, 0x260D,
+ 0x9B5F, 0x2878, 0x9B60, 0x2876, 0x9B61, 0x2877, 0x9B64, 0x2AEE,
+ 0x9B66, 0x2AE9, 0x9B67, 0x2AE6, 0x9B68, 0x2AED, 0x9B6C, 0x2AEF,
+ 0x9B6F, 0x1281, 0x9B70, 0x2AEC, 0x9B71, 0x2AE8, 0x9B74, 0x2AE7,
+ 0x9B75, 0x2AEB, 0x9B76, 0x2AEA, 0x9B77, 0x1280, 0x9B7A, 0x2D20,
+ 0x9B7B, 0x2D1B, 0x9B7C, 0x2D19, 0x9B7D, 0x2D22, 0x9B7E, 0x2D1A,
+ 0x9B80, 0x2D16, 0x9B82, 0x2D1C, 0x9B85, 0x2D17, 0x9B86, 0x2EEB,
+ 0x9B87, 0x2D18, 0x9B88, 0x2D23, 0x9B90, 0x2D1F, 0x9B91, 0x13A9,
+ 0x9B92, 0x2D1E, 0x9B93, 0x2D1D, 0x9B95, 0x2D21, 0x9B9A, 0x2EE3,
+ 0x9B9B, 0x2EE6, 0x9B9E, 0x2EE5, 0x9BA0, 0x2EED, 0x9BA1, 0x2EE8,
+ 0x9BA2, 0x2EEC, 0x9BA4, 0x2EEA, 0x9BA5, 0x2EE9, 0x9BA6, 0x2EE7,
+ 0x9BA8, 0x2EE4, 0x9BAA, 0x14BD, 0x9BAB, 0x14BC, 0x9BAD, 0x14BE,
+ 0x9BAE, 0x14BB, 0x9BAF, 0x2EEE, 0x9BB5, 0x3057, 0x9BB6, 0x305A,
+ 0x9BB8, 0x3058, 0x9BB9, 0x305C, 0x9BBD, 0x305D, 0x9BBF, 0x3055,
+ 0x9BC0, 0x156E, 0x9BC1, 0x3056, 0x9BC3, 0x3054, 0x9BC4, 0x305B,
+ 0x9BC6, 0x3053, 0x9BC7, 0x3052, 0x9BC8, 0x156D, 0x9BC9, 0x156B,
+ 0x9BCA, 0x156A, 0x9BD3, 0x3059, 0x9BD4, 0x3199, 0x9BD5, 0x319F,
+ 0x9BD6, 0x15FE, 0x9BD7, 0x319A, 0x9BD9, 0x319D, 0x9BDA, 0x31A1,
+ 0x9BDB, 0x15FF, 0x9BDC, 0x319C, 0x9BDE, 0x3194, 0x9BE0, 0x3193,
+ 0x9BE1, 0x31A0, 0x9BE2, 0x3197, 0x9BE4, 0x3195, 0x9BE5, 0x319E,
+ 0x9BE6, 0x3196, 0x9BE7, 0x15FD, 0x9BE8, 0x15FC, 0x9BEA, 0x3191,
+ 0x9BEB, 0x3192, 0x9BEC, 0x319B, 0x9BF0, 0x3198, 0x9BF7, 0x3293,
+ 0x9BF8, 0x3296, 0x9BFD, 0x156C, 0x9C05, 0x3294, 0x9C06, 0x329A,
+ 0x9C07, 0x3298, 0x9C08, 0x3292, 0x9C09, 0x329D, 0x9C0B, 0x3291,
+ 0x9C0D, 0x1660, 0x9C0E, 0x3299, 0x9C12, 0x3295, 0x9C13, 0x165F,
+ 0x9C14, 0x329C, 0x9C17, 0x329B, 0x9C1C, 0x334C, 0x9C1D, 0x334B,
+ 0x9C21, 0x3352, 0x9C23, 0x334E, 0x9C24, 0x3351, 0x9C25, 0x16B0,
+ 0x9C28, 0x334F, 0x9C29, 0x3350, 0x9C2B, 0x334A, 0x9C2C, 0x334D,
+ 0x9C2D, 0x16AF, 0x9C31, 0x16ED, 0x9C32, 0x33F2, 0x9C33, 0x33ED,
+ 0x9C34, 0x33F1, 0x9C36, 0x33F4, 0x9C37, 0x33F0, 0x9C39, 0x33EC,
+ 0x9C3B, 0x16EF, 0x9C3C, 0x33EF, 0x9C3D, 0x33F3, 0x9C3E, 0x16EE,
+ 0x9C3F, 0x33EA, 0x9C40, 0x3297, 0x9C41, 0x33EE, 0x9C44, 0x33EB,
+ 0x9C46, 0x33E8, 0x9C48, 0x33E9, 0x9C49, 0x16EC, 0x9C4A, 0x3457,
+ 0x9C4B, 0x3459, 0x9C4C, 0x345C, 0x9C4D, 0x3458, 0x9C4E, 0x345D,
+ 0x9C50, 0x3456, 0x9C52, 0x3454, 0x9C54, 0x1719, 0x9C55, 0x345A,
+ 0x9C56, 0x171B, 0x9C57, 0x171A, 0x9C58, 0x3455, 0x9C59, 0x345B,
+ 0x9C5E, 0x34B5, 0x9C5F, 0x173A, 0x9C60, 0x34B6, 0x9C62, 0x34B4,
+ 0x9C63, 0x34B1, 0x9C66, 0x34B3, 0x9C67, 0x34B2, 0x9C68, 0x34F4,
+ 0x9C6D, 0x34F6, 0x9C6E, 0x34F5, 0x9C71, 0x3514, 0x9C73, 0x3513,
+ 0x9C74, 0x3512, 0x9C75, 0x3515, 0x9C77, 0x1760, 0x9C78, 0x1761,
+ 0x9C79, 0x3541, 0x9C7A, 0x3545, 0x9CE5, 0x0BE2, 0x9CE6, 0x235F,
+ 0x9CE7, 0x2610, 0x9CE9, 0x0F79, 0x9CEA, 0x260E, 0x9CED, 0x260F,
+ 0x9CF1, 0x2879, 0x9CF2, 0x287A, 0x9CF3, 0x10FE, 0x9CF4, 0x10FC,
+ 0x9CF5, 0x287B, 0x9CF6, 0x10FD, 0x9CF7, 0x2AF4, 0x9CF9, 0x2AF7,
+ 0x9CFA, 0x2AF1, 0x9CFB, 0x2AF8, 0x9CFC, 0x2AF0, 0x9CFD, 0x2AF2,
+ 0x9CFF, 0x2AF3, 0x9D00, 0x2AF6, 0x9D03, 0x1284, 0x9D04, 0x2AFB,
+ 0x9D05, 0x2AFA, 0x9D06, 0x1282, 0x9D07, 0x2AF5, 0x9D08, 0x2AF9,
+ 0x9D09, 0x1283, 0x9D10, 0x2D2D, 0x9D12, 0x13AE, 0x9D14, 0x2D28,
+ 0x9D15, 0x13AA, 0x9D17, 0x2D25, 0x9D18, 0x2D2B, 0x9D19, 0x2D2E,
+ 0x9D1B, 0x13AF, 0x9D1D, 0x2D2A, 0x9D1E, 0x2D27, 0x9D1F, 0x2D2F,
+ 0x9D20, 0x2D26, 0x9D22, 0x2D2C, 0x9D23, 0x13AB, 0x9D25, 0x2D24,
+ 0x9D26, 0x13AC, 0x9D28, 0x13AD, 0x9D29, 0x2D29, 0x9D2D, 0x2F00,
+ 0x9D2E, 0x2EF3, 0x9D2F, 0x2EF4, 0x9D30, 0x2EF7, 0x9D31, 0x2EF5,
+ 0x9D33, 0x2EEF, 0x9D36, 0x2EF2, 0x9D37, 0x2EFC, 0x9D38, 0x2EF6,
+ 0x9D3B, 0x14BF, 0x9D3D, 0x2EFE, 0x9D3E, 0x2EFB, 0x9D3F, 0x14C0,
+ 0x9D40, 0x2EFD, 0x9D41, 0x2EF0, 0x9D42, 0x2EF9, 0x9D43, 0x2EFA,
+ 0x9D45, 0x2EF8, 0x9D4A, 0x3061, 0x9D4B, 0x3063, 0x9D4C, 0x3066,
+ 0x9D4F, 0x3060, 0x9D51, 0x156F, 0x9D52, 0x3068, 0x9D53, 0x305F,
+ 0x9D54, 0x3069, 0x9D56, 0x3065, 0x9D57, 0x3067, 0x9D58, 0x306B,
+ 0x9D59, 0x3064, 0x9D5A, 0x306C, 0x9D5B, 0x3062, 0x9D5C, 0x305E,
+ 0x9D5D, 0x1570, 0x9D5F, 0x306A, 0x9D60, 0x1571, 0x9D61, 0x1601,
+ 0x9D67, 0x2EF1, 0x9D68, 0x31BB, 0x9D69, 0x31B2, 0x9D6A, 0x1603,
+ 0x9D6B, 0x31AE, 0x9D6C, 0x1604, 0x9D6F, 0x31B7, 0x9D70, 0x31B1,
+ 0x9D71, 0x31A7, 0x9D72, 0x1602, 0x9D73, 0x31B4, 0x9D74, 0x31AF,
+ 0x9D75, 0x31B0, 0x9D77, 0x31A2, 0x9D78, 0x31A9, 0x9D79, 0x31B8,
+ 0x9D7B, 0x31B5, 0x9D7D, 0x31AD, 0x9D7F, 0x31B9, 0x9D80, 0x31A8,
+ 0x9D81, 0x31A3, 0x9D82, 0x31B6, 0x9D84, 0x31A5, 0x9D85, 0x31B3,
+ 0x9D86, 0x31AA, 0x9D87, 0x31BA, 0x9D88, 0x31A6, 0x9D89, 0x1600,
+ 0x9D8A, 0x31A4, 0x9D8B, 0x31AB, 0x9D8C, 0x31AC, 0x9D90, 0x32A4,
+ 0x9D92, 0x32A2, 0x9D94, 0x32A7, 0x9D96, 0x32B3, 0x9D97, 0x32AA,
+ 0x9D98, 0x32A3, 0x9D99, 0x329F, 0x9D9A, 0x32AC, 0x9D9B, 0x32A5,
+ 0x9D9C, 0x32A8, 0x9D9D, 0x32A1, 0x9D9E, 0x32AF, 0x9D9F, 0x329E,
+ 0x9DA0, 0x32A6, 0x9DA1, 0x32AB, 0x9DA2, 0x32AD, 0x9DA3, 0x32B0,
+ 0x9DA4, 0x32A0, 0x9DA6, 0x32B4, 0x9DA7, 0x32B5, 0x9DA8, 0x32AE,
+ 0x9DA9, 0x32B2, 0x9DAA, 0x32A9, 0x9DAC, 0x3362, 0x9DAD, 0x3365,
+ 0x9DAF, 0x16B1, 0x9DB1, 0x3364, 0x9DB2, 0x3369, 0x9DB3, 0x3367,
+ 0x9DB4, 0x16B2, 0x9DB5, 0x335E, 0x9DB6, 0x3354, 0x9DB7, 0x3353,
+ 0x9DB8, 0x16B4, 0x9DB9, 0x3360, 0x9DBA, 0x3361, 0x9DBB, 0x335D,
+ 0x9DBC, 0x3355, 0x9DBE, 0x335A, 0x9DBF, 0x32B1, 0x9DC1, 0x3356,
+ 0x9DC2, 0x16B3, 0x9DC3, 0x335C, 0x9DC5, 0x335B, 0x9DC7, 0x3357,
+ 0x9DC8, 0x3363, 0x9DCA, 0x3358, 0x9DCB, 0x33F9, 0x9DCC, 0x3366,
+ 0x9DCD, 0x3368, 0x9DCE, 0x335F, 0x9DCF, 0x3359, 0x9DD0, 0x33FA,
+ 0x9DD1, 0x33FC, 0x9DD2, 0x33F6, 0x9DD3, 0x16F0, 0x9DD5, 0x3403,
+ 0x9DD6, 0x3401, 0x9DD7, 0x16F1, 0x9DD8, 0x3400, 0x9DD9, 0x33FF,
+ 0x9DDA, 0x33F8, 0x9DDB, 0x33F5, 0x9DDC, 0x33FB, 0x9DDD, 0x3404,
+ 0x9DDE, 0x33F7, 0x9DDF, 0x33FD, 0x9DE1, 0x3466, 0x9DE2, 0x346B,
+ 0x9DE3, 0x3461, 0x9DE4, 0x3464, 0x9DE5, 0x171C, 0x9DE6, 0x3468,
+ 0x9DE8, 0x346F, 0x9DE9, 0x33FE, 0x9DEB, 0x3462, 0x9DEC, 0x346C,
+ 0x9DED, 0x3470, 0x9DEE, 0x3467, 0x9DEF, 0x3460, 0x9DF0, 0x346A,
+ 0x9DF2, 0x3469, 0x9DF3, 0x346E, 0x9DF4, 0x346D, 0x9DF5, 0x3402,
+ 0x9DF6, 0x3465, 0x9DF7, 0x345F, 0x9DF8, 0x3463, 0x9DF9, 0x173B,
+ 0x9DFA, 0x173C, 0x9DFB, 0x345E, 0x9DFD, 0x34C1, 0x9DFE, 0x34B8,
+ 0x9DFF, 0x34C0, 0x9E00, 0x34BD, 0x9E01, 0x34BE, 0x9E02, 0x34B7,
+ 0x9E03, 0x34BA, 0x9E04, 0x34C2, 0x9E05, 0x34BC, 0x9E06, 0x34BB,
+ 0x9E07, 0x34B9, 0x9E09, 0x34BF, 0x9E0B, 0x34F7, 0x9E0D, 0x34F8,
+ 0x9E0F, 0x34FA, 0x9E10, 0x34F9, 0x9E11, 0x34FC, 0x9E12, 0x34FB,
+ 0x9E13, 0x3517, 0x9E14, 0x3516, 0x9E15, 0x3530, 0x9E17, 0x3531,
+ 0x9E19, 0x353D, 0x9E1A, 0x1765, 0x9E1B, 0x1769, 0x9E1D, 0x3546,
+ 0x9E1E, 0x176A, 0x9E75, 0x0BE3, 0x9E79, 0x1661, 0x9E7A, 0x336A,
+ 0x9E7C, 0x173D, 0x9E7D, 0x173E, 0x9E7F, 0x0BE4, 0x9E80, 0x2611,
+ 0x9E82, 0x0F7A, 0x9E83, 0x2AFC, 0x9E86, 0x2D31, 0x9E87, 0x2D32,
+ 0x9E88, 0x2D30, 0x9E89, 0x2F02, 0x9E8A, 0x2F01, 0x9E8B, 0x14C1,
+ 0x9E8C, 0x306E, 0x9E8D, 0x2F03, 0x9E8E, 0x306D, 0x9E91, 0x31BD,
+ 0x9E92, 0x1605, 0x9E93, 0x1607, 0x9E94, 0x31BC, 0x9E97, 0x1606,
+ 0x9E99, 0x32B6, 0x9E9A, 0x32B8, 0x9E9B, 0x32B7, 0x9E9C, 0x336B,
+ 0x9E9D, 0x16B5, 0x9E9F, 0x171D, 0x9EA0, 0x34C3, 0x9EA1, 0x34FD,
+ 0x9EA4, 0x354A, 0x9EA5, 0x0BE5, 0x9EA7, 0x287C, 0x9EA9, 0x1285,
+ 0x9EAD, 0x2D34, 0x9EAE, 0x2D33, 0x9EB0, 0x2F04, 0x9EB4, 0x1608,
+ 0x9EB5, 0x1662, 0x9EB6, 0x3405, 0x9EB7, 0x3542, 0x9EBB, 0x0BE6,
+ 0x9EBC, 0x10FF, 0x9EBE, 0x1286, 0x9EC0, 0x31BE, 0x9EC2, 0x3471,
+ 0x9EC3, 0x0DBB, 0x9EC8, 0x2F05, 0x9ECC, 0x1751, 0x9ECD, 0x0DBC,
+ 0x9ECE, 0x1287, 0x9ECF, 0x14C2, 0x9ED0, 0x3472, 0x9ED1, 0x0DBD,
+ 0x9ED3, 0x2AFD, 0x9ED4, 0x13B1, 0x9ED5, 0x2D35, 0x9ED6, 0x2D36,
+ 0x9ED8, 0x13B0, 0x9EDA, 0x2F06, 0x9EDB, 0x14C6, 0x9EDC, 0x14C4,
+ 0x9EDD, 0x14C5, 0x9EDE, 0x14C3, 0x9EDF, 0x306F, 0x9EE0, 0x1572,
+ 0x9EE4, 0x32BA, 0x9EE5, 0x32B9, 0x9EE6, 0x32BC, 0x9EE7, 0x32BB,
+ 0x9EE8, 0x1663, 0x9EEB, 0x336C, 0x9EED, 0x336E, 0x9EEE, 0x336D,
+ 0x9EEF, 0x16B6, 0x9EF0, 0x3406, 0x9EF2, 0x3473, 0x9EF3, 0x3474,
+ 0x9EF4, 0x171E, 0x9EF5, 0x34FE, 0x9EF6, 0x3518, 0x9EF7, 0x1762,
+ 0x9EF9, 0x2360, 0x9EFA, 0x2D37, 0x9EFB, 0x2F07, 0x9EFC, 0x31BF,
+ 0x9EFD, 0x2612, 0x9EFF, 0x2F08, 0x9F00, 0x3071, 0x9F01, 0x3070,
+ 0x9F06, 0x3475, 0x9F07, 0x173F, 0x9F09, 0x34FF, 0x9F0A, 0x3519,
+ 0x9F0E, 0x0F7B, 0x9F0F, 0x2AFE, 0x9F10, 0x2AFF, 0x9F12, 0x2D38,
+ 0x9F13, 0x0F7C, 0x9F15, 0x1573, 0x9F16, 0x3072, 0x9F18, 0x3370,
+ 0x9F19, 0x16B7, 0x9F1A, 0x3371, 0x9F1B, 0x336F, 0x9F1C, 0x3476,
+ 0x9F1E, 0x34C4, 0x9F20, 0x0F7D, 0x9F22, 0x2F0B, 0x9F23, 0x2F0A,
+ 0x9F24, 0x2F09, 0x9F25, 0x3073, 0x9F28, 0x3077, 0x9F29, 0x3076,
+ 0x9F2A, 0x3075, 0x9F2B, 0x3074, 0x9F2C, 0x1574, 0x9F2D, 0x31C0,
+ 0x9F2E, 0x32BE, 0x9F2F, 0x1664, 0x9F30, 0x32BD, 0x9F31, 0x3372,
+ 0x9F32, 0x3409, 0x9F33, 0x3408, 0x9F34, 0x16F2, 0x9F35, 0x3407,
+ 0x9F36, 0x3479, 0x9F37, 0x3478, 0x9F38, 0x3477, 0x9F3B, 0x1100,
+ 0x9F3D, 0x2D39, 0x9F3E, 0x14C7, 0x9F40, 0x31C1, 0x9F41, 0x31C2,
+ 0x9F42, 0x340A, 0x9F43, 0x347A, 0x9F46, 0x34C5, 0x9F47, 0x3500,
+ 0x9F48, 0x3532, 0x9F49, 0x354C, 0x9F4A, 0x1101, 0x9F4B, 0x14C8,
+ 0x9F4C, 0x3078, 0x9F4D, 0x31C3, 0x9F4E, 0x3373, 0x9F4F, 0x347B,
+ 0x9F52, 0x1289, 0x9F54, 0x2F0C, 0x9F55, 0x3079, 0x9F56, 0x31C4,
+ 0x9F57, 0x31C5, 0x9F58, 0x31C6, 0x9F59, 0x32C3, 0x9F5B, 0x32BF,
+ 0x9F5C, 0x16B8, 0x9F5D, 0x32C2, 0x9F5E, 0x32C1, 0x9F5F, 0x1665,
+ 0x9F60, 0x32C0, 0x9F61, 0x1667, 0x9F63, 0x1666, 0x9F64, 0x3375,
+ 0x9F65, 0x3374, 0x9F66, 0x16B9, 0x9F67, 0x16BA, 0x9F6A, 0x16F4,
+ 0x9F6B, 0x340B, 0x9F6C, 0x16F3, 0x9F6E, 0x347E, 0x9F6F, 0x347F,
+ 0x9F70, 0x347D, 0x9F71, 0x347C, 0x9F72, 0x1741, 0x9F74, 0x34C6,
+ 0x9F75, 0x34C7, 0x9F76, 0x34C8, 0x9F77, 0x1740, 0x9F78, 0x3501,
+ 0x9F79, 0x3504, 0x9F7A, 0x3503, 0x9F7B, 0x3502, 0x9F7E, 0x354B,
+ 0x9F8D, 0x13B2, 0x9F90, 0x157C, 0x9F91, 0x32C4, 0x9F92, 0x3376,
+ 0x9F94, 0x16F5, 0x9F95, 0x340C, 0x9F98, 0x354D, 0x9F9C, 0x13B3,
+ 0x9FA0, 0x2F0D, 0x9FA2, 0x340D, 0x9FA4, 0x351A, 0xE01F, 0x083A,
+ 0xE026, 0x09FD, 0xE05B, 0x030D, 0xE063, 0x016B, 0xE073, 0x0860,
+ 0xE0F3, 0x0C23, 0xE12E, 0x17E4, 0xE149, 0x212F, 0xE191, 0x115F,
+ 0xE1BA, 0x0C79, 0xE1C9, 0x04C3, 0xE22C, 0x18BD, 0xE22D, 0x0CBD,
+ 0xE230, 0x0CA5, 0xE266, 0x0CCE, 0xE2A3, 0x0E84, 0xE2BC, 0x0120,
+ 0xE2EF, 0x1BA8, 0xE33A, 0x1055, 0xE340, 0x2DE8, 0xE34F, 0x0121,
+ 0xE35A, 0x106B, 0xE363, 0x1326, 0xE37C, 0x066B, 0xE37F, 0x132E,
+ 0xE3C5, 0x0D35, 0xE3D7, 0x27C2, 0xE3DC, 0x22AD, 0xE417, 0x134C,
+ 0xE44A, 0x09CE, 0xE478, 0x0BC7, 0xE485, 0x36E9, 0xE4C5, 0x1391,
+ 0xE4DA, 0x16A4, 0xE545, 0x3072, 0xE5D2, 0x0119, 0xE5D3, 0x011A,
+ 0xE5D4, 0x011C, 0xE5D5, 0x011B, 0xE5F4, 0x297C, 0xE6C6, 0x1D06,
+ 0xE727, 0x29A1, 0xE7D3, 0x181B, 0xE893, 0x2B24, 0xEB40, 0x2F50,
+ 0xEB42, 0x1725, 0xEB45, 0x32ED, 0xEB6E, 0x2AD9, 0xEB86, 0x1C14,
+ 0xEB9E, 0x12E9, 0xEBA9, 0x2CAE, 0xEBBA, 0x1A64, 0xEBC9, 0x1404,
+ 0xEBCF, 0x2324, 0xEBD2, 0x346A, 0xEBDE, 0x2291, 0xEC01, 0x1787,
+ 0xEC02, 0x095F, 0xEC15, 0x1E99, 0xEC5B, 0x25C1, 0xEC5E, 0x0D0C,
+ 0xECA6, 0x05E6, 0xED28, 0x0728, 0xED6E, 0x24B6, 0xED7C, 0x1806,
+ 0xED9E, 0x3511, 0xEDE7, 0x0F82, 0xEE52, 0x05F2, 0xEE98, 0x247D,
+ 0xF6B1, 0x01FA, 0xF6B2, 0x01FB, 0xF6B3, 0x01FC, 0xF6B4, 0x01FD,
+ 0xF6B5, 0x01FE, 0xF6B6, 0x01FF, 0xF6B7, 0x0200, 0xF6B8, 0x0201,
+ 0xF6B9, 0x0202, 0xF6BA, 0x0203, 0xF6BB, 0x0204, 0xF6BC, 0x0205,
+ 0xF6BD, 0x0206, 0xF6BE, 0x0207, 0xF6BF, 0x0208, 0xF6C0, 0x0209,
+ 0xF6C1, 0x020A, 0xF6C2, 0x020B, 0xF6C3, 0x020C, 0xF6C4, 0x020D,
+ 0xF6C5, 0x020E, 0xF6C6, 0x020F, 0xF6C7, 0x0210, 0xF6C8, 0x0211,
+ 0xF6C9, 0x0212, 0xF6CA, 0x0213, 0xF6CB, 0x0214, 0xF6CC, 0x0215,
+ 0xF6CD, 0x0216, 0xF6CE, 0x0217, 0xF6CF, 0x0219, 0xF6D0, 0x021A,
+ 0xF6D1, 0x021B, 0xF6D2, 0x021C, 0xF6D3, 0x021D, 0xF6D4, 0x021E,
+ 0xF6D5, 0x021F, 0xF6D6, 0x0220, 0xF6D7, 0x0221, 0xF6D8, 0x0222,
+ 0xF6D9, 0x0223, 0xF6DA, 0x0224, 0xF6DB, 0x0225, 0xF6DC, 0x0226,
+ 0xF6DD, 0x0227, 0xF6DE, 0x0228, 0xF6E0, 0x022A, 0xF6E1, 0x022B,
+ 0xF6E2, 0x022C, 0xF6E4, 0x022E, 0xF6E6, 0x0230, 0xF6E8, 0x35B3,
+ 0xF6E9, 0x35B4, 0xF6EA, 0x35B5, 0xF6EB, 0x35B6, 0xF6EC, 0x35B7,
+ 0xF6ED, 0x35B8, 0xF6F0, 0x35BA, 0xF6F1, 0x35BB, 0xF6F2, 0x35BC,
+ 0xF6F3, 0x35BD, 0xF6F4, 0x35BE, 0xF6F5, 0x35BF, 0xF6F6, 0x35C0,
+ 0xF6F7, 0x35C1, 0xF6F8, 0x35C2, 0xF6F9, 0x35C3, 0xF6FA, 0x35C4,
+ 0xF6FB, 0x35C5, 0xF6FC, 0x35C6, 0xF6FD, 0x35C7, 0xF6FE, 0x35C8,
+ 0xF6FF, 0x35C9, 0xF700, 0x35CA, 0xF701, 0x35CB, 0xF702, 0x35CC,
+ 0xF703, 0x35CD, 0xF704, 0x35CE, 0xF705, 0x35CF, 0xF706, 0x35D0,
+ 0xF707, 0x35D1, 0xF708, 0x35D2, 0xF709, 0x35D3, 0xF70A, 0x35D4,
+ 0xF70B, 0x35D5, 0xF70C, 0x35D6, 0xF70D, 0x35D7, 0xF70E, 0x35D8,
+ 0xF70F, 0x35D9, 0xF710, 0x35DA, 0xF711, 0x35DB, 0xF712, 0x35DC,
+ 0xF713, 0x35DD, 0xF714, 0x35DE, 0xF715, 0x35DF, 0xF716, 0x35E0,
+ 0xF717, 0x35E1, 0xF718, 0x35E2, 0xF719, 0x35E3, 0xF71A, 0x35E4,
+ 0xF71B, 0x35E5, 0xF71C, 0x35E6, 0xF71D, 0x35E7, 0xF71E, 0x35E8,
+ 0xF71F, 0x35E9, 0xF720, 0x35EA, 0xF721, 0x35EB, 0xF722, 0x35EC,
+ 0xF723, 0x35ED, 0xF724, 0x35EE, 0xF725, 0x35EF, 0xF726, 0x35F0,
+ 0xF727, 0x35F1, 0xF728, 0x35F2, 0xF729, 0x35F3, 0xF72A, 0x35F4,
+ 0xF72B, 0x35F5, 0xF72C, 0x35F6, 0xF72D, 0x35F7, 0xF72E, 0x35F8,
+ 0xF72F, 0x35F9, 0xF730, 0x35FA, 0xF731, 0x35FB, 0xF732, 0x35FC,
+ 0xF733, 0x35FD, 0xF734, 0x35FE, 0xF735, 0x35FF, 0xF736, 0x3600,
+ 0xF737, 0x3601, 0xF738, 0x3602, 0xF739, 0x3603, 0xF73A, 0x3604,
+ 0xF73B, 0x3605, 0xF73C, 0x3606, 0xF73D, 0x3607, 0xF73E, 0x3608,
+ 0xF73F, 0x3609, 0xF740, 0x360A, 0xF741, 0x360B, 0xF742, 0x360C,
+ 0xF743, 0x360D, 0xF744, 0x360E, 0xF745, 0x360F, 0xF746, 0x3610,
+ 0xF747, 0x3611, 0xF748, 0x3612, 0xF749, 0x3613, 0xF74A, 0x3614,
+ 0xF74B, 0x3615, 0xF74C, 0x3616, 0xF74D, 0x3617, 0xF74E, 0x3618,
+ 0xF74F, 0x3619, 0xF750, 0x361A, 0xF751, 0x361B, 0xF752, 0x361C,
+ 0xF753, 0x361D, 0xF754, 0x361E, 0xF755, 0x361F, 0xF756, 0x3620,
+ 0xF757, 0x3621, 0xF758, 0x3622, 0xF759, 0x3623, 0xF75A, 0x3624,
+ 0xF75B, 0x3625, 0xF75C, 0x3626, 0xF75D, 0x3627, 0xF75E, 0x3628,
+ 0xF75F, 0x3629, 0xF760, 0x362A, 0xF761, 0x362B, 0xF762, 0x362C,
+ 0xF763, 0x362D, 0xF764, 0x362E, 0xF765, 0x362F, 0xF766, 0x3630,
+ 0xF767, 0x3631, 0xF768, 0x3632, 0xF769, 0x3633, 0xF76A, 0x3634,
+ 0xF76B, 0x3635, 0xF76C, 0x3636, 0xF76D, 0x3637, 0xF76E, 0x3638,
+ 0xF76F, 0x3639, 0xF770, 0x363A, 0xF771, 0x363B, 0xF772, 0x363C,
+ 0xF773, 0x363D, 0xF774, 0x363E, 0xF775, 0x363F, 0xF776, 0x3640,
+ 0xF777, 0x3641, 0xF778, 0x3642, 0xF779, 0x3643, 0xF77A, 0x3644,
+ 0xF77B, 0x3645, 0xF77C, 0x3646, 0xF77D, 0x3647, 0xF77E, 0x3648,
+ 0xF77F, 0x3649, 0xF780, 0x364A, 0xF781, 0x364B, 0xF782, 0x364C,
+ 0xF783, 0x364D, 0xF784, 0x364E, 0xF785, 0x364F, 0xF786, 0x3650,
+ 0xF787, 0x3651, 0xF788, 0x3652, 0xF789, 0x3653, 0xF78A, 0x3654,
+ 0xF78B, 0x3655, 0xF78C, 0x3656, 0xF78D, 0x3657, 0xF78E, 0x3658,
+ 0xF78F, 0x3659, 0xF790, 0x365A, 0xF791, 0x365B, 0xF792, 0x365C,
+ 0xF793, 0x365D, 0xF794, 0x365E, 0xF795, 0x365F, 0xF796, 0x3660,
+ 0xF797, 0x3661, 0xF798, 0x3662, 0xF799, 0x3663, 0xF79A, 0x3664,
+ 0xF79B, 0x3665, 0xF79C, 0x3666, 0xF79D, 0x3667, 0xF79E, 0x3668,
+ 0xF79F, 0x3669, 0xF7A0, 0x366A, 0xF7A1, 0x366B, 0xF7A2, 0x366C,
+ 0xF7A3, 0x366D, 0xF7A4, 0x366E, 0xF7A5, 0x366F, 0xF7A6, 0x3670,
+ 0xF7A7, 0x3671, 0xF7A8, 0x3672, 0xF7A9, 0x3673, 0xF7AA, 0x3674,
+ 0xF7AB, 0x3675, 0xF7AC, 0x3676, 0xF7AD, 0x3677, 0xF7AE, 0x3678,
+ 0xF7AF, 0x3679, 0xF7B0, 0x367A, 0xF7B1, 0x367B, 0xF7B2, 0x367C,
+ 0xF7B3, 0x367D, 0xF7B4, 0x367E, 0xF7B5, 0x367F, 0xF7B6, 0x3680,
+ 0xF7B7, 0x3681, 0xF7B8, 0x3682, 0xF7B9, 0x3683, 0xF7BA, 0x3684,
+ 0xF7BB, 0x3685, 0xF7BC, 0x3686, 0xF7BD, 0x3687, 0xF7BE, 0x3688,
+ 0xF7BF, 0x3689, 0xF7C0, 0x368A, 0xF7C1, 0x368B, 0xF7C2, 0x368C,
+ 0xF7C3, 0x368D, 0xF7C4, 0x368E, 0xF7C5, 0x368F, 0xF7C6, 0x3690,
+ 0xF7C7, 0x3691, 0xF7C8, 0x3692, 0xF7C9, 0x3693, 0xF7CA, 0x3694,
+ 0xF7CB, 0x3695, 0xF7CC, 0x3696, 0xF7CD, 0x3697, 0xF7CE, 0x3698,
+ 0xF7CF, 0x3699, 0xF7D0, 0x369A, 0xF7D1, 0x369B, 0xF7D2, 0x369C,
+ 0xF7D3, 0x369D, 0xF7D4, 0x369E, 0xF7D5, 0x369F, 0xF7D6, 0x36A0,
+ 0xF7D7, 0x36A1, 0xF7D8, 0x36A2, 0xF7D9, 0x36A3, 0xF7DA, 0x36A4,
+ 0xF7DB, 0x36A5, 0xF7DC, 0x36A6, 0xF7DD, 0x36A7, 0xF7DE, 0x36A8,
+ 0xF7DF, 0x36A9, 0xF7E0, 0x36AA, 0xF7E1, 0x36AB, 0xF7E2, 0x36AC,
+ 0xF7E3, 0x36AD, 0xF7E4, 0x36AE, 0xF7E5, 0x36AF, 0xF7E6, 0x36B0,
+ 0xF7E7, 0x36B1, 0xF7E8, 0x36B2, 0xF7E9, 0x36B3, 0xF7EA, 0x36B4,
+ 0xF7EB, 0x36B5, 0xF7EC, 0x36B6, 0xF7ED, 0x36B7, 0xF7EE, 0x36B8,
+ 0xF817, 0x36E1, 0xF818, 0x36E2, 0xF819, 0x36E3, 0xF81A, 0x36E4,
+ 0xF81B, 0x36E5, 0xF81C, 0x36E6, 0xF81D, 0x36E7, 0xFA0C, 0x0274,
+ 0xFA0D, 0x2381, 0xFE30, 0x006D, 0xFE31, 0x007A, 0xFE33, 0x35AF,
+ 0xFE34, 0x35B1, 0xFE35, 0x0082, 0xFE36, 0x0083, 0xFE37, 0x0086,
+ 0xFE38, 0x0087, 0xFE39, 0x008A, 0xFE3A, 0x008B, 0xFE3B, 0x008E,
+ 0xFE3C, 0x008F, 0xFE3D, 0x0092, 0xFE3E, 0x0093, 0xFE3F, 0x0096,
+ 0xFE40, 0x0097, 0xFE41, 0x009A, 0xFE42, 0x009B, 0xFE43, 0x009E,
+ 0xFE44, 0x009F, 0xFE49, 0x00C7, 0xFE4A, 0x00C8, 0xFE4B, 0x00CB,
+ 0xFE4C, 0x00CC, 0xFE4D, 0x00C9, 0xFE4E, 0x00CA, 0xFE4F, 0x35B2,
+ 0xFE50, 0x0070, 0xFE51, 0x0071, 0xFE52, 0x0072, 0xFE54, 0x0074,
+ 0xFE55, 0x0075, 0xFE56, 0x0076, 0xFE57, 0x0077, 0xFE59, 0x00A0,
+ 0xFE5A, 0x00A1, 0xFE5B, 0x00A2, 0xFE5C, 0x00A3, 0xFE5D, 0x00A4,
+ 0xFE5E, 0x00A5, 0xFE5F, 0x00CD, 0xFE60, 0x00CE, 0xFE61, 0x00CF,
+ 0xFE62, 0x00DF, 0xFE63, 0x00E0, 0xFE64, 0x00E1, 0xFE65, 0x00E2,
+ 0xFE66, 0x00E3, 0xFE68, 0x0102, 0xFE69, 0x010C, 0xFE6A, 0x010D,
+ 0xFE6B, 0x010E, 0xFF01, 0x006C, 0xFF02, 0x36E4, 0xFF03, 0x00AE,
+ 0xFF04, 0x0103, 0xFF05, 0x0108, 0xFF06, 0x00AF, 0xFF07, 0x36E3,
+ 0xFF08, 0x0080, 0xFF09, 0x0081, 0xFF0A, 0x00B0, 0xFF0B, 0x00D0,
+ 0xFF0C, 0x0064, 0xFF0D, 0x00D1, 0xFF0E, 0x0067, 0xFF0F, 0x0101,
+ 0xFF10, 0x014D, 0xFF11, 0x014E, 0xFF12, 0x014F, 0xFF13, 0x0150,
+ 0xFF14, 0x0151, 0xFF15, 0x0152, 0xFF16, 0x0153, 0xFF17, 0x0154,
+ 0xFF18, 0x0155, 0xFF19, 0x0156, 0xFF1A, 0x006A, 0xFF1B, 0x0069,
+ 0xFF1C, 0x00D6, 0xFF1D, 0x00D8, 0xFF1E, 0x00D7, 0xFF1F, 0x006B,
+ 0xFF20, 0x0109, 0xFF21, 0x016D, 0xFF22, 0x016E, 0xFF23, 0x016F,
+ 0xFF24, 0x0170, 0xFF25, 0x0171, 0xFF26, 0x0172, 0xFF27, 0x0173,
+ 0xFF28, 0x0174, 0xFF29, 0x0175, 0xFF2A, 0x0176, 0xFF2B, 0x0177,
+ 0xFF2C, 0x0178, 0xFF2D, 0x0179, 0xFF2E, 0x017A, 0xFF2F, 0x017B,
+ 0xFF30, 0x017C, 0xFF31, 0x017D, 0xFF32, 0x017E, 0xFF33, 0x017F,
+ 0xFF34, 0x0180, 0xFF35, 0x0181, 0xFF36, 0x0182, 0xFF37, 0x0183,
+ 0xFF38, 0x0184, 0xFF39, 0x0185, 0xFF3A, 0x0186, 0xFF3B, 0x35BE,
+ 0xFF3C, 0x0102, 0xFF3D, 0x35BF, 0xFF3E, 0x35B4, 0xFF3F, 0x00C5,
+ 0xFF41, 0x0187, 0xFF42, 0x0188, 0xFF43, 0x0189, 0xFF44, 0x018A,
+ 0xFF45, 0x018B, 0xFF46, 0x018C, 0xFF47, 0x018D, 0xFF48, 0x018E,
+ 0xFF49, 0x018F, 0xFF4A, 0x0190, 0xFF4B, 0x0191, 0xFF4C, 0x0192,
+ 0xFF4D, 0x0193, 0xFF4E, 0x0194, 0xFF4F, 0x0195, 0xFF50, 0x0196,
+ 0xFF51, 0x0197, 0xFF52, 0x0198, 0xFF53, 0x0199, 0xFF54, 0x019A,
+ 0xFF55, 0x019B, 0xFF56, 0x019C, 0xFF57, 0x019D, 0xFF58, 0x019E,
+ 0xFF59, 0x019F, 0xFF5A, 0x01A0, 0xFF5B, 0x0084, 0xFF5C, 0x0078,
+ 0xFF5D, 0x0085, 0xFF5E, 0x00E4, 0xFF64, 0x0071, 0xFFE0, 0x0106,
+ 0xFFE1, 0x0107, 0xFFE2, 0x36E1, 0xFFE3, 0x00C4, 0xFFE4, 0x36E2,
+ 0xFFE5, 0x0104,
+};
+extern const unsigned short g_FXCMAP_UniCNS_UTF16_H_0_DWord[3 * 3] = {
+ 0xD840, 0xDC8A, 0x36B2, 0xD840, 0xDCCC, 0x36B0, 0xD85D, 0xDE07, 0x36B8,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp b/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp
new file mode 100644
index 0000000000..5fa5a4bbe8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_B5pc_H_0[];
+extern const FX_WORD g_FXCMAP_B5pc_V_0[];
+extern const FX_WORD g_FXCMAP_HKscs_B5_H_5[];
+extern const FX_WORD g_FXCMAP_HKscs_B5_V_5[];
+extern const FX_WORD g_FXCMAP_ETen_B5_H_0[];
+extern const FX_WORD g_FXCMAP_ETen_B5_V_0[];
+extern const FX_WORD g_FXCMAP_ETenms_B5_H_0[];
+extern const FX_WORD g_FXCMAP_ETenms_B5_V_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_H_0_DWord[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_CNS_EUC_V_0_DWord[];
+extern const FX_WORD g_FXCMAP_UniCNS_UCS2_H_3[];
+extern const FX_WORD g_FXCMAP_UniCNS_UCS2_V_3[];
+extern const FX_WORD g_FXCMAP_UniCNS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_CNS1CID2Unicode_5[];
+const FXCMAP_CMap g_FXCMAP_CNS1_cmaps[] = {
+ { "B5pc-H", FXCMAP_CMap::Range, g_FXCMAP_B5pc_H_0, 247, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "B5pc-V", FXCMAP_CMap::Range, g_FXCMAP_B5pc_V_0, 12, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "HKscs-B5-H", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_H_5, 1210, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "HKscs-B5-V", FXCMAP_CMap::Range, g_FXCMAP_HKscs_B5_V_5, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "ETen-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_H_0, 254, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "ETen-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETen_B5_V_0, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "ETenms-B5-H", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_H_0, 1, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "ETenms-B5-V", FXCMAP_CMap::Range, g_FXCMAP_ETenms_B5_V_0, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "CNS-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0, 157, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_H_0_DWord, 238, 0 },
+ { "CNS-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0, 180, FXCMAP_CMap::Range, g_FXCMAP_CNS_EUC_V_0_DWord, 261, 0 },
+ { "UniCNS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_H_3, 16418, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniCNS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniCNS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniCNS_UTF16_H_0, 14557, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniCNS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniCNS_UCS2_V_3, 13, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedCNS1CMaps()
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_pMapList = g_FXCMAP_CNS1_cmaps;
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_CNS1].m_Count = sizeof g_FXCMAP_CNS1_cmaps / sizeof (FXCMAP_CMap);
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_pMap = g_FXCMAP_CNS1CID2Unicode_5;
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_CNS1].m_Count = 19088;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp
new file mode 100644
index 0000000000..f75e66e873
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp
@@ -0,0 +1,3794 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB1CID2Unicode_5[30284] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+ 0x3000, 0x3001, 0x3002, 0x00B7, 0x02C9, 0x02C7, 0x00A8, 0x3003,
+ 0x3005, 0x2014, 0xFF5E, 0x2016, 0x2026, 0x2018, 0x2019, 0x201C,
+ 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,
+ 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011, 0x00B1,
+ 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F, 0x222A,
+ 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220, 0x2312,
+ 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D, 0x221D,
+ 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235, 0x2234,
+ 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04, 0x00A4,
+ 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605, 0x25CB,
+ 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,
+ 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2488, 0x2489,
+ 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2491,
+ 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497, 0x2498, 0x2499,
+ 0x249A, 0x249B, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479,
+ 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481,
+ 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x2460, 0x2461,
+ 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
+ 0x3220, 0x3221, 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227,
+ 0x3228, 0x3229, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165,
+ 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0xFF01, 0xFF02,
+ 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A,
+ 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10, 0xFF11, 0xFF12,
+ 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF1A,
+ 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20, 0xFF21, 0xFF22,
+ 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,
+ 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,
+ 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,
+ 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40, 0xFF41, 0xFF42,
+ 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A,
+ 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52,
+ 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A,
+ 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3041, 0x3042, 0x3043, 0x3044,
+ 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C,
+ 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054,
+ 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C,
+ 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064,
+ 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C,
+ 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074,
+ 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C,
+ 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084,
+ 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1,
+ 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9,
+ 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1,
+ 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,
+ 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,
+ 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,
+ 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,
+ 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,
+ 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,
+ 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393,
+ 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B,
+ 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4,
+ 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3,
+ 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB,
+ 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4,
+ 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0xFF0C, 0x3002, 0x3001,
+ 0xFF1A, 0xFF1B, 0xFF01, 0xFF1F, 0xFE35, 0xFE36, 0xFE39, 0xFE3A,
+ 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44,
+ 0x3016, 0x3017, 0xFE3B, 0xFE3C, 0xFE37, 0xFE38, 0xFE31, 0x2026,
+ 0xFE33, 0xFE34, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415,
+ 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C,
+ 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424,
+ 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C,
+ 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434,
+ 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B,
+ 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443,
+ 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B,
+ 0x044C, 0x044D, 0x044E, 0x044F, 0x0101, 0x00E1, 0x01CE, 0x00E0,
+ 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,
+ 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,
+ 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,
+ 0x0144, 0x0148, 0x01F9, 0x0261, 0x3105, 0x3106, 0x3107, 0x3108,
+ 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, 0x3110,
+ 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+ 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F, 0x3120,
+ 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+ 0x3129, 0xE7CD, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505,
+ 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D,
+ 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515,
+ 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D,
+ 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525,
+ 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D,
+ 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535,
+ 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D,
+ 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545,
+ 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x0021, 0x0022,
+ 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A,
+ 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032,
+ 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A,
+ 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042,
+ 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
+ 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,
+ 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,
+ 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062,
+ 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A,
+ 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072,
+ 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A,
+ 0x007B, 0x007C, 0x007D, 0x007E, 0x0101, 0x00E1, 0x01CE, 0x00E0,
+ 0x0113, 0x00E9, 0x011B, 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC,
+ 0x014D, 0x00F3, 0x01D2, 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9,
+ 0x01D6, 0x01D8, 0x01DA, 0x01DC, 0x00FC, 0x00EA, 0x0251, 0x1E3F,
+ 0x0144, 0x0148, 0x01F9, 0x0261, 0x554A, 0x963F, 0x57C3, 0x6328,
+ 0x54CE, 0x5509, 0x54C0, 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E,
+ 0x788D, 0x7231, 0x9698, 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309,
+ 0x6697, 0x5CB8, 0x80FA, 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9,
+ 0x6556, 0x71AC, 0x7FF1, 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3,
+ 0x82AD, 0x634C, 0x6252, 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4,
+ 0x5DF4, 0x62D4, 0x8DCB, 0x9776, 0x628A, 0x8019, 0x575D, 0x9738,
+ 0x7F62, 0x7238, 0x767D, 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25,
+ 0x62DC, 0x7A17, 0x6591, 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881,
+ 0x677F, 0x7248, 0x626E, 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E,
+ 0x7ECA, 0x90A6, 0x5E2E, 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2,
+ 0x78C5, 0x868C, 0x9551, 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305,
+ 0x8912, 0x5265, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D,
+ 0x62B1, 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891,
+ 0x60B2, 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D,
+ 0x72C8, 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C,
+ 0x7B28, 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C,
+ 0x9F3B, 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D,
+ 0x6BD5, 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D,
+ 0x5F0A, 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD,
+ 0x8FB9, 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8,
+ 0x8FA9, 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6,
+ 0x618B, 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE,
+ 0x6448, 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3,
+ 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5, 0x6CE2,
+ 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B, 0x8236,
+ 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C, 0x54FA,
+ 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8, 0x6016,
+ 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C, 0x8E29,
+ 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695, 0x6B8B,
+ 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7, 0x85CF,
+ 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56, 0x4FA7,
+ 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C, 0x8336,
+ 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7, 0x62C6,
+ 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17, 0x7F20,
+ 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, 0x573A, 0x5C1D,
+ 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382, 0x655E, 0x7545, 0x5531,
+ 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D, 0x5632, 0x6F6E, 0x5DE2,
+ 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4, 0x63A3, 0x5F7B, 0x6F88,
+ 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668, 0x5FF1, 0x6C89, 0x9648,
+ 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE, 0x6A59, 0x6210, 0x5448,
+ 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA, 0x627F, 0x901E, 0x9A8B,
+ 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319, 0x6C60, 0x8FDF, 0x5F1B,
+ 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A, 0x8D64, 0x7FC5, 0x65A5,
+ 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07, 0x5BA0, 0x62BD, 0x916C,
+ 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79, 0x4EC7, 0x7EF8, 0x7785,
+ 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71, 0x53A8, 0x8E87, 0x9504,
+ 0x96CF, 0x6EC1, 0x9664, 0x695A, 0x7840, 0x50A8, 0x77D7, 0x6410,
+ 0x89E6, 0x5904, 0x63E3, 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239,
+ 0x5598, 0x4E32, 0x75AE, 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B,
+ 0x5439, 0x708A, 0x6376, 0x9524, 0x5782, 0x6625, 0x693F, 0x9187,
+ 0x5507, 0x6DF3, 0x7EAF, 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328,
+ 0x78C1, 0x96CC, 0x8F9E, 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A,
+ 0x8D50, 0x6B21, 0x806A, 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B,
+ 0x51D1, 0x7C97, 0x918B, 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C,
+ 0x6467, 0x5D14, 0x50AC, 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0,
+ 0x6751, 0x5B58, 0x5BF8, 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B,
+ 0x9519, 0x642D, 0x8FBE, 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446,
+ 0x6B79, 0x50A3, 0x6234, 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B,
+ 0x5F85, 0x902E, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8,
+ 0x63B8, 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE,
+ 0x5F39, 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200,
+ 0x6363, 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B,
+ 0x60BC, 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F,
+ 0x767B, 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4,
+ 0x8FEA, 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5,
+ 0x5E95, 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14,
+ 0x98A0, 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB,
+ 0x7535, 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF,
+ 0x7889, 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493,
+ 0x8C03, 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0,
+ 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D, 0x5B9A,
+ 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8, 0x680B,
+ 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597, 0x9661,
+ 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A, 0x72EC,
+ 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A, 0x5EA6,
+ 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD, 0x7F0E,
+ 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72, 0x6566,
+ 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6, 0x591A,
+ 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241, 0x60F0,
+ 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9, 0x5A25,
+ 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069, 0x800C,
+ 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, 0x8D30, 0x53D1,
+ 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600, 0x6CD5, 0x73D0, 0x85E9,
+ 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE, 0x9492, 0x7E41, 0x51E1,
+ 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29, 0x72AF, 0x996D, 0x6CDB,
+ 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F, 0x9632, 0x59A8, 0x4EFF,
+ 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E, 0x5561, 0x98DE, 0x80A5,
+ 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F, 0x6CB8, 0x8D39, 0x82AC,
+ 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7, 0x575F, 0x711A, 0x6C7E,
+ 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124, 0x7CAA, 0x4E30, 0x5C01,
+ 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE, 0x75AF, 0x70FD, 0x9022,
+ 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4, 0x4F5B, 0x5426, 0x592B,
+ 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2, 0x8F90, 0x5E45, 0x6C1F,
+ 0x7B26, 0x4F0F, 0x4FD8, 0x670D, 0x6D6E, 0x6DAA, 0x798F, 0x88B1,
+ 0x5F17, 0x752B, 0x629A, 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F,
+ 0x8151, 0x5E9C, 0x8150, 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D,
+ 0x5085, 0x4ED8, 0x961C, 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3,
+ 0x9644, 0x5987, 0x7F1A, 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539,
+ 0x6982, 0x9499, 0x76D6, 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1,
+ 0x7AFF, 0x809D, 0x8D76, 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188,
+ 0x521A, 0x94A2, 0x7F38, 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760,
+ 0x7BD9, 0x768B, 0x9AD8, 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550,
+ 0x7A3F, 0x544A, 0x54E5, 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3,
+ 0x7599, 0x5272, 0x9769, 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694,
+ 0x94EC, 0x4E2A, 0x5404, 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4,
+ 0x5E9A, 0x7FB9, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F,
+ 0x606D, 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9,
+ 0x6C5E, 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF,
+ 0x72D7, 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495,
+ 0x7B8D, 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA,
+ 0x9AA8, 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E,
+ 0x74DC, 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A,
+ 0x68FA, 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50,
+ 0x60EF, 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4,
+ 0x572D, 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1,
+ 0x7678, 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA,
+ 0x68CD, 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8,
+ 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87, 0x9163,
+ 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD, 0x558A,
+ 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D, 0x710A,
+ 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E, 0x8C6A,
+ 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475, 0x559D,
+ 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408, 0x76D2,
+ 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64, 0x8D3A,
+ 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC, 0x4EA8,
+ 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679, 0x9E3F,
+ 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334, 0x543C,
+ 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A, 0x58F6,
+ 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, 0x5F27, 0x864E,
+ 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237, 0x82B1, 0x54D7, 0x534E,
+ 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316, 0x8BDD, 0x69D0, 0x5F8A,
+ 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF, 0x6853, 0x8FD8, 0x7F13,
+ 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62, 0x7115, 0x6DA3, 0x5BA6,
+ 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA, 0x8757, 0x7C27, 0x7687,
+ 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C, 0x604D, 0x8C0E, 0x7070,
+ 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4, 0x56DE, 0x6BC1, 0x6094,
+ 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F, 0x79FD, 0x4F1A, 0x70E9,
+ 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364, 0x660F, 0x5A5A, 0x9B42,
+ 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19, 0x706B, 0x83B7, 0x6216,
+ 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB, 0x573E, 0x57FA, 0x673A,
+ 0x7578, 0x7A3D, 0x79EF, 0x7B95, 0x808C, 0x9965, 0x8FF9, 0x6FC0,
+ 0x8BA5, 0x9E21, 0x59EC, 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8,
+ 0x8F91, 0x7C4D, 0x96C6, 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373,
+ 0x5AC9, 0x7EA7, 0x6324, 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280,
+ 0x5180, 0x5B63, 0x4F0E, 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4,
+ 0x5BC2, 0x8BA1, 0x8BB0, 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7,
+ 0x7EAA, 0x5609, 0x67B7, 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A,
+ 0x988A, 0x8D3E, 0x7532, 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6,
+ 0x9A7E, 0x5AC1, 0x6B7C, 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4,
+ 0x714E, 0x517C, 0x80A9, 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0,
+ 0x67EC, 0x78B1, 0x7877, 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A,
+ 0x51CF, 0x8350, 0x69DB, 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E,
+ 0x7BAD, 0x4EF6, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85,
+ 0x6DA7, 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586,
+ 0x848B, 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549,
+ 0x6912, 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84,
+ 0x5A07, 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1,
+ 0x89D2, 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F,
+ 0x8F83, 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857,
+ 0x9636, 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B,
+ 0x7AED, 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5,
+ 0x754C, 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B,
+ 0x65A4, 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5,
+ 0x8C28, 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78,
+ 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676, 0x9CB8,
+ 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66, 0x666F,
+ 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9, 0x9756,
+ 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76, 0x7EA0,
+ 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9, 0x6551,
+ 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0, 0x62D8,
+ 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480, 0x77E9,
+ 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177, 0x8DDD,
+ 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267, 0x6350,
+ 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485, 0x652B,
+ 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0, 0x7EDD,
+ 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, 0x4FCA, 0x7AE3,
+ 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496, 0x5361, 0x54AF, 0x5F00,
+ 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A, 0x582A, 0x52D8, 0x574E,
+ 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0, 0x625B, 0x6297, 0x4EA2,
+ 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760, 0x5777, 0x82DB, 0x67EF,
+ 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3, 0x54B3, 0x53EF, 0x6E34,
+ 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF, 0x5543, 0x57A6, 0x6073,
+ 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54, 0x63A7, 0x62A0, 0x53E3,
+ 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F, 0x82E6, 0x9177, 0x5E93,
+ 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8, 0x80EF, 0x5757, 0x7B77,
+ 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321, 0x7B50, 0x72C2, 0x6846,
+ 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F, 0x76D4, 0x5CBF, 0x7AA5,
+ 0x8475, 0x594E, 0x9B41, 0x5080, 0x9988, 0x6127, 0x6E83, 0x5764,
+ 0x6606, 0x6346, 0x56F0, 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783,
+ 0x62C9, 0x5587, 0x8721, 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765,
+ 0x8D56, 0x84DD, 0x5A6A, 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170,
+ 0x6F9C, 0x8C30, 0x63FD, 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5,
+ 0x7405, 0x6994, 0x72FC, 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E,
+ 0x52B3, 0x7262, 0x8001, 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D,
+ 0x52D2, 0x4E50, 0x96F7, 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121,
+ 0x5792, 0x64C2, 0x808B, 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7,
+ 0x5398, 0x68A8, 0x7281, 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13,
+ 0x7406, 0x674E, 0x91CC, 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F,
+ 0x6817, 0x4E3D, 0x5389, 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088,
+ 0x4F8B, 0x4FD0, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B,
+ 0x7483, 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9,
+ 0x601C, 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC,
+ 0x7EC3, 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86,
+ 0x91CF, 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597,
+ 0x71CE, 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6,
+ 0x6599, 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797,
+ 0x78F7, 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41,
+ 0x541D, 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36,
+ 0x7F9A, 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4,
+ 0x6E9C, 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624,
+ 0x6D41, 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF,
+ 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402, 0x7BD3,
+ 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089, 0x63B3,
+ 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF, 0x8D42,
+ 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74, 0x5415,
+ 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651, 0x6C2F,
+ 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A, 0x6EE6,
+ 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26, 0x4ED1,
+ 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B, 0x9523,
+ 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC, 0x5988,
+ 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B, 0x5417,
+ 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792, 0x9992,
+ 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, 0x8C29, 0x8292,
+ 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD, 0x732B, 0x8305, 0x951A,
+ 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302, 0x5192, 0x5E3D, 0x8C8C,
+ 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885, 0x9176, 0x9709, 0x7164,
+ 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF, 0x7F8E, 0x6627, 0x5BD0,
+ 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC, 0x840C, 0x8499, 0x6AAC,
+ 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F, 0x772F, 0x919A, 0x9761,
+ 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73, 0x79D8, 0x89C5, 0x6CCC,
+ 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720, 0x7EF5, 0x5195, 0x514D,
+ 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7, 0x63CF, 0x7784, 0x85D0,
+ 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511, 0x706D, 0x6C11, 0x62BF,
+ 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E, 0x879F, 0x9E23, 0x94ED,
+ 0x540D, 0x547D, 0x8C2C, 0x6478, 0x6479, 0x8611, 0x6A21, 0x819C,
+ 0x78E8, 0x6469, 0x9B54, 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8,
+ 0x6CAB, 0x6F20, 0x5BDE, 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7,
+ 0x7261, 0x4EA9, 0x59C6, 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF,
+ 0x6155, 0x6728, 0x76EE, 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA,
+ 0x5450, 0x94A0, 0x90A3, 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976,
+ 0x8010, 0x5948, 0x5357, 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111,
+ 0x607C, 0x95F9, 0x6DD6, 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD,
+ 0x59AE, 0x9713, 0x502A, 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F,
+ 0x817B, 0x9006, 0x6EBA, 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5,
+ 0x637B, 0x5FF5, 0x5A18, 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042,
+ 0x5B7D, 0x556E, 0x954A, 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE,
+ 0x51DD, 0x5B81, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD,
+ 0x8113, 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973,
+ 0x6696, 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6,
+ 0x6B27, 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A,
+ 0x8DB4, 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C,
+ 0x5F98, 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC,
+ 0x7554, 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6,
+ 0x629B, 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478,
+ 0x80DA, 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B,
+ 0x55B7, 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC,
+ 0x68DA, 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0,
+ 0x576F, 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7,
+ 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB, 0x5C41,
+ 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02, 0x74E2,
+ 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1, 0x8058,
+ 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6, 0x8BC4,
+ 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44, 0x8FEB,
+ 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461, 0x83E9,
+ 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31, 0x66DD,
+ 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03, 0x51C4,
+ 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67, 0x7566,
+ 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91, 0x8D77,
+ 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668, 0x6C14,
+ 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, 0x6070, 0x6D3D,
+ 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343, 0x8FC1, 0x7B7E, 0x4EDF,
+ 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3, 0x524D, 0x6F5C, 0x9063,
+ 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20, 0x6B49, 0x67AA, 0x545B,
+ 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A, 0x62A2, 0x6A47, 0x9539,
+ 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54, 0x4FA8, 0x5DE7, 0x9798,
+ 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D, 0x5207, 0x8304, 0x4E14,
+ 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2, 0x79E6, 0x7434, 0x52E4,
+ 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81, 0x9752, 0x8F7B, 0x6C22,
+ 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674, 0x6C30, 0x60C5, 0x9877,
+ 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB, 0x4E18, 0x90B1, 0x7403,
+ 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B, 0x533A, 0x86C6, 0x66F2,
+ 0x8EAF, 0x5C48, 0x9A71, 0x6E20, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3,
+ 0x53BB, 0x5708, 0x98A7, 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA,
+ 0x62F3, 0x72AC, 0x5238, 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374,
+ 0x9E4A, 0x69B7, 0x786E, 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3,
+ 0x5189, 0x67D3, 0x74E4, 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976,
+ 0x6270, 0x7ED5, 0x60F9, 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD,
+ 0x97E7, 0x4EFB, 0x8BA4, 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD,
+ 0x65E5, 0x620E, 0x8338, 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6,
+ 0x5BB9, 0x7ED2, 0x5197, 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815,
+ 0x5112, 0x5B7A, 0x5982, 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925,
+ 0x8F6F, 0x962E, 0x854A, 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5,
+ 0x5F31, 0x6492, 0x6D12, 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B,
+ 0x4E09, 0x53C1, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414,
+ 0x9A9A, 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7,
+ 0x838E, 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565,
+ 0x715E, 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220,
+ 0x717D, 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584,
+ 0x6C55, 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C,
+ 0x4E0A, 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D,
+ 0x52FA, 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A,
+ 0x86C7, 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89,
+ 0x793E, 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1,
+ 0x5A20, 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE,
+ 0x614E, 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3,
+ 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931, 0x72EE,
+ 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3, 0x62FE,
+ 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2, 0x77E2,
+ 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB, 0x4E16,
+ 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F, 0x55DC,
+ 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F, 0x5E02,
+ 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996, 0x5B88,
+ 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C, 0x67A2,
+ 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1, 0x758F,
+ 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9, 0x7F72,
+ 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811, 0x675F,
+ 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, 0x6055, 0x5237,
+ 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05, 0x6813, 0x62F4, 0x971C,
+ 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761, 0x7A0E, 0x542E, 0x77AC,
+ 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714, 0x70C1, 0x65AF, 0x6495,
+ 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D, 0x6B7B, 0x8086, 0x5BFA,
+ 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972, 0x5DF3, 0x677E, 0x8038,
+ 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC, 0x8BF5, 0x641C, 0x8258,
+ 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7, 0x7D20, 0x901F, 0x7C9F,
+ 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9, 0x8083, 0x9178, 0x849C,
+ 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5, 0x9AD3, 0x788E, 0x5C81,
+ 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59, 0x635F, 0x7B0B, 0x84D1,
+ 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22, 0x9501, 0x6240, 0x584C,
+ 0x4ED6, 0x5B83, 0x5979, 0x5854, 0x736D, 0x631E, 0x8E4B, 0x8E0F,
+ 0x80CE, 0x82D4, 0x62AC, 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001,
+ 0x6C70, 0x574D, 0x644A, 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80,
+ 0x75F0, 0x6F6D, 0x8C2D, 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3,
+ 0x63A2, 0x53F9, 0x70AD, 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0,
+ 0x819B, 0x5510, 0x7CD6, 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB,
+ 0x638F, 0x6D9B, 0x6ED4, 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8,
+ 0x9676, 0x8BA8, 0x5957, 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A,
+ 0x68AF, 0x5254, 0x8E22, 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C,
+ 0x4F53, 0x66FF, 0x568F, 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929,
+ 0x6DFB, 0x586B, 0x7530, 0x751C, 0x606C, 0x8214, 0x8146, 0x6311,
+ 0x6761, 0x8FE2, 0x773A, 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385,
+ 0x542C, 0x70C3, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A,
+ 0x8247, 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64,
+ 0x7AE5, 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295,
+ 0x5934, 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014,
+ 0x6D82, 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8,
+ 0x9893, 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0,
+ 0x62D6, 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D,
+ 0x59A5, 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03,
+ 0x74E6, 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9,
+ 0x987D, 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696,
+ 0x60CB, 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1,
+ 0x6789, 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01,
+ 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4, 0x552F,
+ 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4, 0x4F1F,
+ 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F, 0x80C3,
+ 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170, 0x536B,
+ 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B, 0x7A33,
+ 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717, 0x6DA1,
+ 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB, 0x545C,
+ 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C, 0x68A7,
+ 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348, 0x821E,
+ 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269, 0x52FF,
+ 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F, 0x7852,
+ 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, 0x7A00, 0x606F,
+ 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC, 0x7184, 0x70EF, 0x6EAA,
+ 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D, 0x4E60, 0x5AB3, 0x559C,
+ 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F, 0x7EC6, 0x778E, 0x867E,
+ 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1, 0x4FA0, 0x72ED, 0x4E0B,
+ 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528, 0x5148, 0x4ED9, 0x9C9C,
+ 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237, 0x95F2, 0x6D8E, 0x5F26,
+ 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E, 0x53BF, 0x817A, 0x9985,
+ 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF, 0x76F8, 0x53A2, 0x9576,
+ 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61, 0x7FD4, 0x7965, 0x8BE6,
+ 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7, 0x6A61, 0x50CF, 0x5411,
+ 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A, 0x54EE, 0x56A3, 0x9500,
+ 0x6D88, 0x5BB5, 0x6DC6, 0x6653, 0x5C0F, 0x5B5D, 0x6821, 0x8096,
+ 0x5578, 0x7B11, 0x6548, 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B,
+ 0x534F, 0x631F, 0x643A, 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199,
+ 0x68B0, 0x5378, 0x87F9, 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51,
+ 0x85AA, 0x82AF, 0x950C, 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3,
+ 0x4FE1, 0x8845, 0x661F, 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211,
+ 0x578B, 0x5F62, 0x90A2, 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027,
+ 0x59D3, 0x5144, 0x51F6, 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A,
+ 0x4F11, 0x4FEE, 0x7F9E, 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896,
+ 0x7EE3, 0x589F, 0x620C, 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90,
+ 0x8BB8, 0x84C4, 0x9157, 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064,
+ 0x7D6E, 0x5A7F, 0x7EEA, 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC,
+ 0x65CB, 0x7384, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B,
+ 0x5B66, 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC,
+ 0x8BE2, 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF,
+ 0x900A, 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B,
+ 0x82BD, 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1,
+ 0x4E9A, 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0,
+ 0x4E25, 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E,
+ 0x708E, 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273,
+ 0x5830, 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130,
+ 0x5BB4, 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768,
+ 0x626C, 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0,
+ 0x75D2, 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476,
+ 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC, 0x8200,
+ 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237, 0x91CE,
+ 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3, 0x814B,
+ 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1, 0x4F9D,
+ 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA, 0x80F0,
+ 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681, 0x501A,
+ 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613, 0x9091,
+ 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB, 0x4EA6,
+ 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2, 0x8BE3,
+ 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE, 0x8335,
+ 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F, 0x94F6,
+ 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, 0x5370, 0x82F1,
+ 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28, 0x83B9, 0x8424, 0x8425,
+ 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8, 0x5F71, 0x9896, 0x786C,
+ 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3, 0x75C8, 0x5EB8, 0x96CD,
+ 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C, 0x6C38, 0x607F, 0x52C7,
+ 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7, 0x5C24, 0x7531, 0x90AE,
+ 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149, 0x6709, 0x53CB, 0x53F3,
+ 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C, 0x8FC2, 0x6DE4, 0x4E8E,
+ 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206, 0x4F59, 0x4FDE, 0x903E,
+ 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685, 0x4E88, 0x5A31, 0x96E8,
+ 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED, 0x7FBD, 0x7389, 0x57DF,
+ 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB, 0x5CEA, 0x5FA1, 0x6108,
+ 0x6B32, 0x72F1, 0x80B2, 0x8A89, 0x6D74, 0x5BD3, 0x88D5, 0x9884,
+ 0x8C6B, 0x9A6D, 0x9E33, 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881,
+ 0x539F, 0x63F4, 0x8F95, 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90,
+ 0x7F18, 0x8FDC, 0x82D1, 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6,
+ 0x8D8A, 0x8DC3, 0x94A5, 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605,
+ 0x8018, 0x4E91, 0x90E7, 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574,
+ 0x915D, 0x6655, 0x97F5, 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D,
+ 0x54C9, 0x707E, 0x5BB0, 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512,
+ 0x6682, 0x8D5E, 0x8D43, 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF,
+ 0x85FB, 0x67A3, 0x65E9, 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020,
+ 0x7682, 0x7076, 0x71E5, 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C,
+ 0x600E, 0x589E, 0x618E, 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23,
+ 0x672D, 0x8F67, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B,
+ 0x4E4D, 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A,
+ 0x5BE8, 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9,
+ 0x8F97, 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9,
+ 0x6E5B, 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C,
+ 0x6DA8, 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634,
+ 0x969C, 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69,
+ 0x5146, 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99,
+ 0x8005, 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F,
+ 0x7504, 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9,
+ 0x8BCA, 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741,
+ 0x5F81, 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F,
+ 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F, 0x5431,
+ 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7, 0x804C,
+ 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740, 0x6307,
+ 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A, 0x63B7,
+ 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A, 0x79E9,
+ 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92, 0x4E2D,
+ 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF, 0x91CD,
+ 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC, 0x7CA5,
+ 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C, 0x9AA4,
+ 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB, 0x9010,
+ 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B, 0x8457,
+ 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, 0x4F4F, 0x6CE8,
+ 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD, 0x4E13, 0x7816, 0x8F6C,
+ 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84, 0x88C5, 0x5986, 0x649E,
+ 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD, 0x8D58, 0x5760, 0x7F00,
+ 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353, 0x684C, 0x7422, 0x8301,
+ 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A, 0x5179, 0x54A8, 0x8D44,
+ 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B, 0x4ED4, 0x7C7D, 0x6ED3,
+ 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03, 0x68D5, 0x8E2A, 0x5B97,
+ 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70, 0x594F, 0x63CD, 0x79DF,
+ 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5, 0x963B, 0x7EC4, 0x94BB,
+ 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A, 0x5C0A, 0x9075, 0x6628,
+ 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C, 0x5750, 0x5EA7, 0x4E8D,
+ 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15, 0x4E98, 0x4E1E,
+ 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F, 0x5315, 0x4E47,
+ 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4, 0x9997, 0x6BD3,
+ 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C, 0x4E69, 0x4E93,
+ 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D, 0x539D, 0x53A3,
+ 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5, 0x5326, 0x532E,
+ 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208, 0x520E, 0x522D,
+ 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261, 0x525C, 0x84AF,
+ 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7F54, 0x4EBB,
+ 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB, 0x4EDE, 0x4F1B,
+ 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27, 0x4F09, 0x4F2B,
+ 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, 0x4F5F, 0x4F57, 0x4F32,
+ 0x4F3D, 0x4F76, 0x4F74, 0x4F91, 0x4F89, 0x4F83, 0x4F8F, 0x4F7E,
+ 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC, 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA,
+ 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC, 0x4FD1, 0x4FDF, 0x4FF8, 0x5029,
+ 0x504C, 0x4FF3, 0x502C, 0x500F, 0x502E, 0x502D, 0x4FFE, 0x501C,
+ 0x500C, 0x5025, 0x5028, 0x507E, 0x5043, 0x5055, 0x5048, 0x504E,
+ 0x506C, 0x507B, 0x50A5, 0x50A7, 0x50A9, 0x50BA, 0x50D6, 0x5106,
+ 0x50ED, 0x50EC, 0x50E6, 0x50EE, 0x5107, 0x510B, 0x4EDD, 0x6C3D,
+ 0x4F58, 0x4F65, 0x4FCE, 0x9FA0, 0x6C46, 0x7C74, 0x516E, 0x5DFD,
+ 0x9EC9, 0x9998, 0x5181, 0x5914, 0x52F9, 0x530D, 0x8A07, 0x5310,
+ 0x51EB, 0x5919, 0x5155, 0x4EA0, 0x5156, 0x4EB3, 0x886E, 0x88A4,
+ 0x4EB5, 0x8114, 0x88D2, 0x7980, 0x5B34, 0x8803, 0x7FB8, 0x51AB,
+ 0x51B1, 0x51BD, 0x51BC, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0,
+ 0x8BA6, 0x8BA7, 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3,
+ 0x8BCB, 0x8BCF, 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8,
+ 0x8BD9, 0x8BDC, 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE,
+ 0x8BF0, 0x8BF3, 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02,
+ 0x8C04, 0x8C07, 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15,
+ 0x8C16, 0x8C19, 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21,
+ 0x8C25, 0x8C27, 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33,
+ 0x8C35, 0x8C36, 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631,
+ 0x962A, 0x963D, 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667,
+ 0x966C, 0x9672, 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097,
+ 0x909B, 0x909D, 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6,
+ 0x90BA, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4,
+ 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB,
+ 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F,
+ 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD,
+ 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD,
+ 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF,
+ 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729,
+ 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B,
+ 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768,
+ 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF,
+ 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9,
+ 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, 0x580B,
+ 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819, 0x5844, 0x5820,
+ 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880, 0x99A8, 0x9F19,
+ 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A, 0x82A8, 0x8284,
+ 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8, 0x82BE, 0x82B0,
+ 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE, 0x82CB, 0x82CC,
+ 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F, 0x82C4, 0x82CE,
+ 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F, 0x8307, 0x82DC,
+ 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3, 0x8311, 0x831A,
+ 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C, 0x8351, 0x835B,
+ 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331, 0x839B, 0x835E,
+ 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340, 0x8317, 0x8360,
+ 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, 0x8368, 0x831B, 0x8369,
+ 0x836C, 0x836A, 0x836D, 0x836E, 0x83B0, 0x8378, 0x83B3, 0x83B4,
+ 0x83A0, 0x83AA, 0x8393, 0x839C, 0x8385, 0x837C, 0x83B6, 0x83A9,
+ 0x837D, 0x83B8, 0x837B, 0x8398, 0x839E, 0x83A8, 0x83BA, 0x83BC,
+ 0x83C1, 0x8401, 0x83E5, 0x83D8, 0x5807, 0x8418, 0x840B, 0x83DD,
+ 0x83FD, 0x83D6, 0x841C, 0x8438, 0x8411, 0x8406, 0x83D4, 0x83DF,
+ 0x840F, 0x8403, 0x83F8, 0x83F9, 0x83EA, 0x83C5, 0x83C0, 0x8426,
+ 0x83F0, 0x83E1, 0x845C, 0x8451, 0x845A, 0x8459, 0x8473, 0x8487,
+ 0x8488, 0x847A, 0x8489, 0x8478, 0x843C, 0x8446, 0x8469, 0x8476,
+ 0x848C, 0x848E, 0x8431, 0x846D, 0x84C1, 0x84CD, 0x84D0, 0x84E6,
+ 0x84BD, 0x84D3, 0x84CA, 0x84BF, 0x84BA, 0x84E0, 0x84A1, 0x84B9,
+ 0x84B4, 0x8497, 0x84E5, 0x84E3, 0x850C, 0x750D, 0x8538, 0x84F0,
+ 0x8539, 0x851F, 0x853A, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559,
+ 0x8548, 0x8568, 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572,
+ 0x857B, 0x85A4, 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C,
+ 0x8585, 0x85B9, 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF,
+ 0x8627, 0x8605, 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C,
+ 0x5941, 0x8037, 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25,
+ 0x5C2C, 0x5C34, 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA,
+ 0x62D7, 0x62EE, 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD,
+ 0x63F6, 0x6371, 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A,
+ 0x6369, 0x63AE, 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4,
+ 0x63DE, 0x63CE, 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B,
+ 0x641B, 0x6420, 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D,
+ 0x6496, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0,
+ 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2,
+ 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB,
+ 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456,
+ 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494,
+ 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466,
+ 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6,
+ 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC,
+ 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF,
+ 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522,
+ 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5,
+ 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, 0x5537,
+ 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555C, 0x558B,
+ 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581, 0x559F, 0x557E,
+ 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE, 0x5594, 0x5599,
+ 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB, 0x55EC, 0x55D4,
+ 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2, 0x55F3, 0x55CC,
+ 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E, 0x5608, 0x560C,
+ 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627, 0x562D, 0x5658,
+ 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659, 0x565C, 0x564C,
+ 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B, 0x567C, 0x5685,
+ 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1, 0x56F5, 0x56EB,
+ 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C, 0x5E0F, 0x5E19,
+ 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, 0x5E37, 0x5E44, 0x5E54,
+ 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C, 0x5C7A, 0x5C8D, 0x5C90, 0x5C96,
+ 0x5C88, 0x5C98, 0x5C99, 0x5C91, 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2,
+ 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1, 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4,
+ 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5, 0x5D02, 0x5D03, 0x5D27, 0x5D26,
+ 0x5D2E, 0x5D24, 0x5D1E, 0x5D06, 0x5D1B, 0x5D58, 0x5D3E, 0x5D34,
+ 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F, 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A,
+ 0x5D69, 0x5D74, 0x5D82, 0x5D99, 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5,
+ 0x5F73, 0x5F77, 0x5F82, 0x5F87, 0x5F89, 0x5F8C, 0x5F95, 0x5F99,
+ 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5, 0x5FBC, 0x8862, 0x5F61, 0x72AD,
+ 0x72B0, 0x72B4, 0x72B7, 0x72B8, 0x72C3, 0x72C1, 0x72CE, 0x72CD,
+ 0x72D2, 0x72E8, 0x72EF, 0x72E9, 0x72F2, 0x72F4, 0x72F7, 0x7301,
+ 0x72F3, 0x7303, 0x72FA, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A,
+ 0x731E, 0x731D, 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338,
+ 0x7331, 0x7350, 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E,
+ 0x821B, 0x5925, 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968,
+ 0x9969, 0x996A, 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980,
+ 0x9984, 0x9987, 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994,
+ 0x9995, 0x5E80, 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9,
+ 0x5EB5, 0x5EBE, 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8,
+ 0x5EEA, 0x81BA, 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE,
+ 0x6004, 0x5FE1, 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED,
+ 0x5FF8, 0x6019, 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029,
+ 0x602B, 0x600A, 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A,
+ 0x6042, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083,
+ 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8,
+ 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4,
+ 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7,
+ 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1,
+ 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606,
+ 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615,
+ 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35,
+ 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C,
+ 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4,
+ 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6,
+ 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, 0x6D39,
+ 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04, 0x6D19, 0x6D0E,
+ 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F, 0x6D52, 0x6D54,
+ 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E, 0x6D93, 0x6D94,
+ 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7, 0x6DC5, 0x6DDE,
+ 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD, 0x6DD9, 0x6E16,
+ 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E, 0x6E6B, 0x6EB2,
+ 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25, 0x6E44, 0x6EDF,
+ 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5, 0x6EA7, 0x6EBD,
+ 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F, 0x6EC2, 0x6E9F,
+ 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9, 0x6F2F, 0x6F36,
+ 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89, 0x6F8D, 0x6F8C,
+ 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, 0x6FC9, 0x6FA7, 0x6FB9,
+ 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE, 0x6FDE, 0x6FE0, 0x6FEF, 0x701A,
+ 0x7023, 0x701B, 0x7039, 0x7035, 0x704F, 0x705E, 0x5B80, 0x5B84,
+ 0x5B95, 0x5B93, 0x5BA5, 0x5BB8, 0x752F, 0x9A9E, 0x6434, 0x5BE4,
+ 0x5BEE, 0x8930, 0x5BF0, 0x8E47, 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5,
+ 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9, 0x8FE6, 0x8FF3, 0x8FE8, 0x9005,
+ 0x9004, 0x900B, 0x9026, 0x9011, 0x900D, 0x9016, 0x9021, 0x9035,
+ 0x9036, 0x902D, 0x902F, 0x9044, 0x9051, 0x9052, 0x9050, 0x9068,
+ 0x9058, 0x9062, 0x905B, 0x66B9, 0x9074, 0x907D, 0x9082, 0x9088,
+ 0x9083, 0x908B, 0x5F50, 0x5F57, 0x5F56, 0x5F58, 0x5C3B, 0x54AB,
+ 0x5C50, 0x5C59, 0x5B71, 0x5C63, 0x5C66, 0x7FBC, 0x5F2A, 0x5F29,
+ 0x5F2D, 0x8274, 0x5F3C, 0x9B3B, 0x5C6E, 0x5981, 0x5983, 0x598D,
+ 0x59A9, 0x59AA, 0x59A3, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4,
+ 0x59D2, 0x59B2, 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD,
+ 0x5A08, 0x59E3, 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34,
+ 0x5A11, 0x5A23, 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C,
+ 0x5A62, 0x5A75, 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE,
+ 0x5AEB, 0x5AB2, 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1,
+ 0x5AD6, 0x5AE6, 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32,
+ 0x5B37, 0x5B40, 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51,
+ 0x5B53, 0x5B62, 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D,
+ 0x9A80, 0x9A81, 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93,
+ 0x9A96, 0x9A98, 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2,
+ 0x9AA3, 0x9AA5, 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8,
+ 0x7EA9, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9,
+ 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1,
+ 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6,
+ 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08,
+ 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C,
+ 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26,
+ 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31,
+ 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095,
+ 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1,
+ 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C,
+ 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A,
+ 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, 0x741B,
+ 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459, 0x7477, 0x746D,
+ 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487, 0x748B, 0x749E,
+ 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA, 0x97EA, 0x97EB,
+ 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769, 0x67A5, 0x6787,
+ 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8, 0x679E, 0x67AD,
+ 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8, 0x680A, 0x67E9,
+ 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3, 0x67DD, 0x6800,
+ 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD, 0x6832, 0x6833,
+ 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864, 0x6883, 0x681D,
+ 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E, 0x684A, 0x6849,
+ 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893, 0x686B, 0x68C2,
+ 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, 0x6924, 0x68F0, 0x690B,
+ 0x6901, 0x6957, 0x68E3, 0x6910, 0x6971, 0x6939, 0x6960, 0x6942,
+ 0x695D, 0x6984, 0x696B, 0x6980, 0x6998, 0x6978, 0x6934, 0x69CC,
+ 0x6987, 0x6988, 0x69CE, 0x6989, 0x6966, 0x6963, 0x6979, 0x699B,
+ 0x69A7, 0x69BB, 0x69AB, 0x69AD, 0x69D4, 0x69B1, 0x69C1, 0x69CA,
+ 0x69DF, 0x6995, 0x69E0, 0x698D, 0x69FF, 0x6A2F, 0x69ED, 0x6A17,
+ 0x6A18, 0x6A65, 0x69F2, 0x6A44, 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B,
+ 0x6A35, 0x6A8E, 0x6A79, 0x6A3D, 0x6A28, 0x6A58, 0x6A7C, 0x6A91,
+ 0x6A90, 0x6AA9, 0x6A97, 0x6AAB, 0x7337, 0x7352, 0x6B81, 0x6B82,
+ 0x6B87, 0x6B84, 0x6B92, 0x6B93, 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1,
+ 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71, 0x8F72, 0x8F73, 0x8F75, 0x8F76,
+ 0x8F78, 0x8F77, 0x8F79, 0x8F7A, 0x8F7C, 0x8F7E, 0x8F81, 0x8F82,
+ 0x8F84, 0x8F87, 0x8F8B, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A,
+ 0x8ECE, 0x620B, 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225,
+ 0x6224, 0x622C, 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511,
+ 0x7513, 0x6534, 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772,
+ 0x6603, 0x6615, 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631,
+ 0x6636, 0x6635, 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656,
+ 0x6661, 0x6657, 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE,
+ 0x66DB, 0x66DC, 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B,
+ 0x8D3D, 0x8D40, 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D,
+ 0x8D55, 0x8D59, 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF,
+ 0x89D0, 0x89D1, 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E,
+ 0x727F, 0x7284, 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332,
+ 0x63B0, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5,
+ 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19,
+ 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555,
+ 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F,
+ 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD,
+ 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2,
+ 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1,
+ 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112,
+ 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C,
+ 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C,
+ 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191,
+ 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, 0x81C1,
+ 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46, 0x6B59, 0x98D1,
+ 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3, 0x5F40, 0x6BC2,
+ 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6, 0x65C4, 0x65C3,
+ 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C, 0x7096, 0x709D,
+ 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8, 0x70CA, 0x7110,
+ 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C, 0x7168, 0x7145,
+ 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3, 0x71B5, 0x71A8,
+ 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D, 0x7228, 0x706C,
+ 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243, 0x6248, 0x6249,
+ 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C, 0x7953, 0x795A,
+ 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A, 0x7985, 0x798A,
+ 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, 0x603C, 0x605D, 0x605A,
+ 0x6067, 0x6041, 0x6059, 0x6063, 0x60AB, 0x6106, 0x610D, 0x615D,
+ 0x61A9, 0x619D, 0x61CB, 0x61D1, 0x6206, 0x8080, 0x807F, 0x6C93,
+ 0x6CF6, 0x6DFC, 0x77F6, 0x77F8, 0x7800, 0x7809, 0x7817, 0x7818,
+ 0x7811, 0x65AB, 0x782D, 0x781C, 0x781D, 0x7839, 0x783A, 0x783B,
+ 0x781F, 0x783C, 0x7825, 0x782C, 0x7823, 0x7829, 0x784E, 0x786D,
+ 0x7856, 0x7857, 0x7826, 0x7850, 0x7847, 0x784C, 0x786A, 0x789B,
+ 0x7893, 0x789A, 0x7887, 0x789C, 0x78A1, 0x78A3, 0x78B2, 0x78B9,
+ 0x78A5, 0x78D4, 0x78D9, 0x78C9, 0x78EC, 0x78F2, 0x7905, 0x78F4,
+ 0x7913, 0x7924, 0x791E, 0x7934, 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC,
+ 0x76F1, 0x7704, 0x770D, 0x76F9, 0x7707, 0x7708, 0x771A, 0x7722,
+ 0x7719, 0x772D, 0x7726, 0x7735, 0x7738, 0x7750, 0x7751, 0x7747,
+ 0x7743, 0x775A, 0x7768, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D,
+ 0x7780, 0x778C, 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD,
+ 0x753A, 0x7540, 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579,
+ 0x7583, 0x7F58, 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71,
+ 0x7F79, 0x7F81, 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486,
+ 0x9487, 0x948B, 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494,
+ 0x9497, 0x9495, 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB,
+ 0x94AA, 0x94AD, 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6,
+ 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4,
+ 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0,
+ 0x94D1, 0x94D2, 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB,
+ 0x94DE, 0x94DF, 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8,
+ 0x94EA, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5,
+ 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506,
+ 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513,
+ 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F,
+ 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534,
+ 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535,
+ 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552,
+ 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E,
+ 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567,
+ 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572,
+ 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3,
+ 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, 0x7A39,
+ 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688, 0x768E, 0x7693,
+ 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20, 0x9E22, 0x9E28,
+ 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31, 0x9E36, 0x9E38,
+ 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42, 0x9E44, 0x9E46,
+ 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E, 0x9E51, 0x9E55,
+ 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63, 0x9E66, 0x9E67,
+ 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71, 0x9E6D, 0x9E73,
+ 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC, 0x75A3, 0x75B3,
+ 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3, 0x75C2, 0x75D6,
+ 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB, 0x75E7, 0x7603,
+ 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605, 0x760C, 0x7617,
+ 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, 0x761B, 0x763C, 0x7622,
+ 0x7620, 0x7640, 0x762D, 0x7630, 0x763F, 0x7635, 0x7643, 0x763E,
+ 0x7633, 0x764D, 0x765E, 0x7654, 0x765C, 0x7656, 0x766B, 0x766F,
+ 0x7FCA, 0x7AE6, 0x7A78, 0x7A79, 0x7A80, 0x7A86, 0x7A88, 0x7A95,
+ 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8, 0x7AAD, 0x7AB3, 0x8864, 0x8869,
+ 0x8872, 0x887D, 0x887F, 0x8882, 0x88A2, 0x88C6, 0x88B7, 0x88BC,
+ 0x88C9, 0x88E2, 0x88CE, 0x88E3, 0x88E5, 0x88F1, 0x891A, 0x88FC,
+ 0x88E8, 0x88FE, 0x88F0, 0x8921, 0x8919, 0x8913, 0x891B, 0x890A,
+ 0x8934, 0x892B, 0x8936, 0x8941, 0x8966, 0x897B, 0x758B, 0x80E5,
+ 0x76B2, 0x76B4, 0x77DC, 0x8012, 0x8014, 0x8016, 0x801C, 0x8020,
+ 0x8022, 0x8025, 0x8026, 0x8027, 0x8029, 0x8028, 0x8031, 0x800B,
+ 0x8035, 0x8043, 0x8046, 0x804D, 0x8052, 0x8069, 0x8071, 0x8983,
+ 0x9878, 0x9880, 0x9883, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894,
+ 0x989A, 0x989B, 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6,
+ 0x864D, 0x8654, 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B,
+ 0x86A8, 0x868D, 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA,
+ 0x8693, 0x86A9, 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA,
+ 0x86B1, 0x86AF, 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2,
+ 0x86ED, 0x86F3, 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8,
+ 0x86D1, 0x8703, 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709,
+ 0x8723, 0x873B, 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748,
+ 0x8734, 0x8731, 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D,
+ 0x877E, 0x877B, 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753,
+ 0x8763, 0x877C, 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8,
+ 0x87D2, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB,
+ 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1,
+ 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813,
+ 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42,
+ 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04,
+ 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19,
+ 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E,
+ 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E,
+ 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8,
+ 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB,
+ 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6,
+ 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, 0x7C1F,
+ 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE, 0x8201, 0x8202,
+ 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223, 0x822D, 0x822F,
+ 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234, 0x823E, 0x8244,
+ 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268, 0x887E, 0x8885,
+ 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F, 0x7FA7, 0x7FAF,
+ 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D, 0x7C9C, 0x7C9E,
+ 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7, 0x7CCC, 0x7CCD,
+ 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8, 0x7FBF, 0x7FCE,
+ 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE, 0x7FF3, 0x7CF8,
+ 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8, 0x9EB4, 0x8D73,
+ 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D, 0x8C47, 0x8C49,
+ 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, 0x9162, 0x9161, 0x9170,
+ 0x9169, 0x916F, 0x917D, 0x917E, 0x9172, 0x9174, 0x9179, 0x918C,
+ 0x9185, 0x9190, 0x918D, 0x9191, 0x91A2, 0x91A3, 0x91AA, 0x91AD,
+ 0x91AE, 0x91AF, 0x91B5, 0x91B4, 0x91BA, 0x8C55, 0x9E7E, 0x8DB8,
+ 0x8DEB, 0x8E05, 0x8E59, 0x8E69, 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA,
+ 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA, 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB,
+ 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8, 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4,
+ 0x8E09, 0x8DFD, 0x8E14, 0x8E1D, 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23,
+ 0x8E2F, 0x8E3A, 0x8E40, 0x8E39, 0x8E35, 0x8E3D, 0x8E31, 0x8E49,
+ 0x8E41, 0x8E42, 0x8E51, 0x8E52, 0x8E4A, 0x8E70, 0x8E76, 0x8E7C,
+ 0x8E6F, 0x8E74, 0x8E85, 0x8E8F, 0x8E94, 0x8E90, 0x8E9C, 0x8E9E,
+ 0x8C78, 0x8C82, 0x8C8A, 0x8C85, 0x8C98, 0x8C94, 0x659B, 0x89D6,
+ 0x89DE, 0x89DA, 0x89DC, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26,
+ 0x9753, 0x96E9, 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F,
+ 0x970E, 0x972A, 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85,
+ 0x9F86, 0x9F87, 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B,
+ 0x9F0D, 0x96B9, 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0,
+ 0x928E, 0x92AE, 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E,
+ 0x946B, 0x9C7F, 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23,
+ 0x9C8B, 0x9C8E, 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A,
+ 0x9C9B, 0x9C9E, 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5,
+ 0x9CA6, 0x9CA7, 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0,
+ 0x9CB1, 0x9CB2, 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA,
+ 0x9CBB, 0x9CBC, 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA,
+ 0x9CCB, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4,
+ 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2,
+ 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3,
+ 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA,
+ 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1,
+ 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8,
+ 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF,
+ 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F,
+ 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B,
+ 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0,
+ 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22,
+ 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, 0x3007,
+ 0xFF5E, 0x2016, 0x3013, 0xFF0E, 0xFF1D, 0xFF3B, 0xFF3D, 0xFFE3,
+ 0x00FC, 0x00A9, 0x2122, 0x2026, 0x0020, 0x769A, 0x85F9, 0x7919,
+ 0x611B, 0x9AAF, 0x8956, 0x58E9, 0x7F77, 0x64FA, 0x6557, 0x9812,
+ 0x8FA6, 0x7D46, 0x5E6B, 0x7D81, 0x938A, 0x8B17, 0x98FD, 0x5BF6,
+ 0x5831, 0x9B91, 0x8F29, 0x8C9D, 0x92C7, 0x72FD, 0x5099, 0x618A,
+ 0x7DB3, 0x7B46, 0x7562, 0x6583, 0x5E63, 0x9589, 0x908A, 0x7DE8,
+ 0x8CB6, 0x8B8A, 0x8FAF, 0x8FAE, 0x6A19, 0x9C49, 0x765F, 0x7015,
+ 0x6FF1, 0x8CD3, 0x64EF, 0x9905, 0x64A5, 0x9262, 0x9251, 0x99C1,
+ 0x88DC, 0x8CA1, 0x53C3, 0x8836, 0x6B98, 0x615A, 0x6158, 0x71E6,
+ 0x84BC, 0x8259, 0x5009, 0x6EC4, 0x53A0, 0x5074, 0x6E2C, 0x5C64,
+ 0x8A6B, 0x6519, 0x647B, 0x87EC, 0x995E, 0x8B92, 0x7E8F, 0x93DF,
+ 0x7523, 0x95E1, 0x986B, 0x5834, 0x5617, 0x9577, 0x511F, 0x8178,
+ 0x5EE0, 0x66A2, 0x9214, 0x8ECA, 0x5FB9, 0x5875, 0x9673, 0x896F,
+ 0x7A31, 0x61F2, 0x8AA0, 0x9A01, 0x9072, 0x99B3, 0x9F52, 0x71BE,
+ 0x885D, 0x87F2, 0x5BF5, 0x7587, 0x8E8A, 0x7C4C, 0x7DA2, 0x919C,
+ 0x92E4, 0x96DB, 0x790E, 0x5132, 0x89F8, 0x8655, 0x50B3, 0x7621,
+ 0x95D6, 0x5275, 0x9318, 0x7D14, 0x7DBD, 0x8FAD, 0x8A5E, 0x8CDC,
+ 0x8070, 0x5F9E, 0x53E2, 0x8EA5, 0x7AC4, 0x932F, 0x9054, 0x5E36,
+ 0x8CB8, 0x64D4, 0x55AE, 0x9132, 0x64A3, 0x81BD, 0x619A, 0x8A95,
+ 0x5F48, 0x7576, 0x64CB, 0x9EE8, 0x8569, 0x6A94, 0x6417, 0x5CF6,
+ 0x79B1, 0x5C0E, 0x71C8, 0x9127, 0x6575, 0x6ECC, 0x905E, 0x7DE0,
+ 0x985B, 0x9EDE, 0x588A, 0x96FB, 0x6FB1, 0x91E3, 0x8ABF, 0x8ADC,
+ 0x91D8, 0x9802, 0x9320, 0x8A02, 0x6771, 0x52D5, 0x68DF, 0x51CD,
+ 0x9B25, 0x72A2, 0x7368, 0x8B80, 0x8CED, 0x934D, 0x935B, 0x65B7,
+ 0x7DDE, 0x968A, 0x5C0D, 0x5678, 0x9813, 0x920D, 0x596A, 0x58AE,
+ 0x9D5D, 0x984D, 0x8A1B, 0x60E1, 0x9913, 0x5152, 0x723E, 0x990C,
+ 0x8CB3, 0x767C, 0x7F70, 0x95A5, 0x792C, 0x91E9, 0x7169, 0x7BC4,
+ 0x8CA9, 0x98EF, 0x8A2A, 0x7D21, 0x98DB, 0x8AB9, 0x5EE2, 0x8CBB,
+ 0x7D1B, 0x58B3, 0x596E, 0x61A4, 0x7CDE, 0x8C50, 0x6953, 0x92D2,
+ 0x98A8, 0x760B, 0x99AE, 0x7E2B, 0x8AF7, 0x9CF3, 0x819A, 0x8F3B,
+ 0x64AB, 0x8F14, 0x8CE6, 0x5FA9, 0x8CA0, 0x8A03, 0x5A66, 0x7E1B,
+ 0x8A72, 0x9223, 0x84CB, 0x5E79, 0x8D95, 0x8D1B, 0x5CA1, 0x525B,
+ 0x92FC, 0x7DB1, 0x5D17, 0x93AC, 0x64F1, 0x9D3F, 0x95A3, 0x927B,
+ 0x500B, 0x7D66, 0x9F94, 0x978F, 0x8CA2, 0x920E, 0x6E9D, 0x69CB,
+ 0x8CFC, 0x8831, 0x9867, 0x526E, 0x95DC, 0x89C0, 0x9928, 0x6163,
+ 0x8CAB, 0x5EE3, 0x898F, 0x6B78, 0x9F9C, 0x95A8, 0x8ECC, 0x8A6D,
+ 0x6AC3, 0x8CB4, 0x528A, 0x8F25, 0x934B, 0x570B, 0x904E, 0x99ED,
+ 0x97D3, 0x6F22, 0x865F, 0x95A1, 0x9DB4, 0x8CC0, 0x8F5F, 0x9D3B,
+ 0x7D05, 0x58FA, 0x8B77, 0x6EEC, 0x5629, 0x83EF, 0x756B, 0x5283,
+ 0x8A71, 0x61F7, 0x58DE, 0x6B61, 0x74B0, 0x9084, 0x7DE9, 0x8B0A,
+ 0x63EE, 0x8F1D, 0x8CC4, 0x7A62, 0x6703, 0x71F4, 0x532F, 0x8AF1,
+ 0x8AA8, 0x7E6A, 0x8477, 0x6E3E, 0x7372, 0x8CA8, 0x798D, 0x64CA,
+ 0x6A5F, 0x7A4D, 0x9951, 0x8B4F, 0x9DC4, 0x7E3E, 0x7DDD, 0x6975,
+ 0x8F2F, 0x7D1A, 0x64E0, 0x5E7E, 0x858A, 0x5291, 0x6FDF, 0x8A08,
+ 0x8A18, 0x969B, 0x7E7C, 0x7D00, 0x593E, 0x83A2, 0x9830, 0x8CC8,
+ 0x9240, 0x50F9, 0x99D5, 0x6BB2, 0x76E3, 0x5805, 0x7B8B, 0x9593,
+ 0x8271, 0x7DD8, 0x7E6D, 0x6AA2, 0x9E7C, 0x63C0, 0x64BF, 0x7C21,
+ 0x5109, 0x85A6, 0x6ABB, 0x9452, 0x8E10, 0x8CE4, 0x898B, 0x9375,
+ 0x8266, 0x528D, 0x991E, 0x6F38, 0x6FFA, 0x6F97, 0x5C07, 0x6F3F,
+ 0x8523, 0x69F3, 0x596C, 0x8B1B, 0x91AC, 0x81A0, 0x6F86, 0x9A55,
+ 0x5B0C, 0x652A, 0x9278, 0x77EF, 0x50E5, 0x9903, 0x7E73, 0x7D5E,
+ 0x8F4E, 0x8F03, 0x968E, 0x7BC0, 0x6F54, 0x7D50, 0x8AA1, 0x7DCA,
+ 0x9326, 0x50C5, 0x8B39, 0x9032, 0x71FC, 0x76E1, 0x52C1, 0x8396,
+ 0x9BE8, 0x9A5A, 0x7D93, 0x9838, 0x93E1, 0x5F91, 0x75D9, 0x7AF6,
+ 0x7CFE, 0x820A, 0x99D2, 0x8209, 0x64DA, 0x92F8, 0x61FC, 0x5287,
+ 0x9D51, 0x7D79, 0x89BA, 0x8A23, 0x7D76, 0x921E, 0x8ECD, 0x99FF,
+ 0x958B, 0x51F1, 0x9846, 0x6BBB, 0x8AB2, 0x58BE, 0x61C7, 0x6473,
+ 0x5EAB, 0x8932, 0x8A87, 0x584A, 0x5108, 0x5BEC, 0x7926, 0x66E0,
+ 0x8667, 0x5DCB, 0x7ABA, 0x994B, 0x6F70, 0x64F4, 0x95CA, 0x881F,
+ 0x81D8, 0x840A, 0x4F86, 0x8CF4, 0x85CD, 0x6B04, 0x6514, 0x7C43,
+ 0x95CC, 0x862D, 0x703E, 0x8B95, 0x652C, 0x89BD, 0x61F6, 0x7E9C,
+ 0x721B, 0x6FEB, 0x6488, 0x52DE, 0x6F87, 0x6A02, 0x9433, 0x58D8,
+ 0x985E, 0x7C6C, 0x96E2, 0x7055, 0x88CF, 0x9BC9, 0x79AE, 0x9E97,
+ 0x53B2, 0x52F5, 0x792B, 0x6B77, 0x701D, 0x96B8, 0x5006, 0x806F,
+ 0x84EE, 0x9023, 0x942E, 0x6190, 0x6F23, 0x7C3E, 0x6582, 0x81C9,
+ 0x93C8, 0x6200, 0x7149, 0x7DF4, 0x7CE7, 0x5169, 0x8F1B, 0x8AD2,
+ 0x7642, 0x907C, 0x9410, 0x7375, 0x81E8, 0x9130, 0x9C57, 0x8CC3,
+ 0x9F61, 0x9234, 0x9748, 0x5DBA, 0x9818, 0x993E, 0x5289, 0x9F8D,
+ 0x807E, 0x56A8, 0x7C60, 0x58DF, 0x650F, 0x96B4, 0x6A13, 0x5A41,
+ 0x645F, 0x7C0D, 0x8606, 0x76E7, 0x9871, 0x5EEC, 0x7210, 0x64C4,
+ 0x6EF7, 0x865C, 0x9B6F, 0x8CC2, 0x9332, 0x9678, 0x9A62, 0x92C1,
+ 0x5C62, 0x7E37, 0x616E, 0x6FFE, 0x7DD1, 0x5DD2, 0x6523, 0x5B7F,
+ 0x7064, 0x4E82, 0x6384, 0x8F2A, 0x502B, 0x4F96, 0x6DEA, 0x7DB8,
+ 0x8AD6, 0x863F, 0x7F85, 0x908F, 0x947C, 0x7C6E, 0x9A3E, 0x99F1,
+ 0x7D61, 0x5ABD, 0x746A, 0x78BC, 0x879E, 0x99AC, 0x99E1, 0x55CE,
+ 0x8CB7, 0x9EA5, 0x8CE3, 0x9081, 0x779E, 0x9945, 0x883B, 0x6EFF,
+ 0x8B3E, 0x9328, 0x925A, 0x8CBF, 0x9382, 0x9580, 0x60B6, 0x5011,
+ 0x9333, 0x5922, 0x8B0E, 0x5F4C, 0x8993, 0x7DBF, 0x7DEC, 0x5EDF,
+ 0x6EC5, 0x61AB, 0x95A9, 0x9CF4, 0x9298, 0x8B2C, 0x8B00, 0x755D,
+ 0x9209, 0x7D0D, 0x96E3, 0x6493, 0x8166, 0x60F1, 0x9B27, 0x9912,
+ 0x64EC, 0x81A9, 0x6506, 0x91C0, 0x9CE5, 0x8076, 0x5699, 0x9477,
+ 0x93B3, 0x6AB8, 0x7370, 0x5BE7, 0x64F0, 0x6FD8, 0x9215, 0x7D10,
+ 0x81BF, 0x6FC3, 0x8FB2, 0x7627, 0x8AFE, 0x6B50, 0x9DD7, 0x6BC6,
+ 0x5614, 0x6F1A, 0x76E4, 0x9F90, 0x8CE0, 0x5674, 0x9D6C, 0x9A19,
+ 0x98C4, 0x983B, 0x8CA7, 0x860B, 0x6191, 0x8A55, 0x6F51, 0x9817,
+ 0x64B2, 0x92EA, 0x50D5, 0x6A38, 0x8B5C, 0x81CD, 0x9F4A, 0x9A0E,
+ 0x8C48, 0x5553, 0x6C23, 0x8A16, 0x727D, 0x91FA, 0x925B, 0x9077,
+ 0x7C3D, 0x8B19, 0x9322, 0x9257, 0x6DFA, 0x8B74, 0x5879, 0x69CD,
+ 0x55C6, 0x58BB, 0x8594, 0x6436, 0x936C, 0x6A4B, 0x55AC, 0x50D1,
+ 0x7FF9, 0x7AC5, 0x7ACA, 0x6B3D, 0x89AA, 0x5BE2, 0x8F15, 0x6C2B,
+ 0x50BE, 0x9803, 0x8ACB, 0x6176, 0x74CA, 0x7AAE, 0x8DA8, 0x5340,
+ 0x8EC0, 0x9A45, 0x9F72, 0x9874, 0x6B0A, 0x52F8, 0x9D72, 0x78BA,
+ 0x8B93, 0x9952, 0x64FE, 0x7E5E, 0x71B1, 0x97CC, 0x8A8D, 0x7D09,
+ 0x69AE, 0x7D68, 0x8EDF, 0x92ED, 0x958F, 0x6F64, 0x7051, 0x85A9,
+ 0x9C13, 0x8CFD, 0x5098, 0x55AA, 0x9A37, 0x6383, 0x6F80, 0x6BBA,
+ 0x7D17, 0x7BE9, 0x66EC, 0x9583, 0x965D, 0x8D0D, 0x7E55, 0x50B7,
+ 0x8CDE, 0x71D2, 0x7D39, 0x8CD2, 0x6368, 0x651D, 0x61FE, 0x8A2D,
+ 0x7D33, 0x5BE9, 0x5B38, 0x814E, 0x6EF2, 0x8072, 0x7E69, 0x52DD,
+ 0x8056, 0x5E2B, 0x7345, 0x6FD5, 0x8A69, 0x6642, 0x8755, 0x5BE6,
+ 0x8B58, 0x99DB, 0x52E2, 0x9069, 0x91CB, 0x98FE, 0x8996, 0x8A66,
+ 0x58FD, 0x7378, 0x6A1E, 0x8F38, 0x66F8, 0x8D16, 0x5C6C, 0x8853,
+ 0x6A39, 0x7AEA, 0x6578, 0x5E25, 0x96D9, 0x8AB0, 0x9806, 0x8AAC,
+ 0x78A9, 0x720D, 0x7D72, 0x98FC, 0x9B06, 0x8073, 0x616B, 0x980C,
+ 0x8A1F, 0x8AA6, 0x64FB, 0x8607, 0x8A34, 0x8085, 0x96D6, 0x96A8,
+ 0x7D8F, 0x6B72, 0x5B6B, 0x640D, 0x7E2E, 0x7463, 0x9396, 0x737A,
+ 0x64BB, 0x81FA, 0x614B, 0x6524, 0x8CAA, 0x7671, 0x7058, 0x58C7,
+ 0x8B5A, 0x8AC7, 0x5606, 0x6E6F, 0x71D9, 0x6FE4, 0x7E27, 0x8A0E,
+ 0x9A30, 0x8B04, 0x92BB, 0x984C, 0x9AD4, 0x689D, 0x8CBC, 0x9435,
+ 0x5EF3, 0x807D, 0x70F4, 0x9285, 0x7D71, 0x982D, 0x5716, 0x5857,
+ 0x5718, 0x983D, 0x9D15, 0x99B1, 0x99DD, 0x6A62, 0x7AAA, 0x896A,
+ 0x5F4E, 0x7063, 0x9811, 0x842C, 0x7DB2, 0x97CB, 0x9055, 0x570D,
+ 0x7232, 0x6FF0, 0x7DAD, 0x8466, 0x5049, 0x50DE, 0x7DEF, 0x8B02,
+ 0x885B, 0x805E, 0x7D0B, 0x7A69, 0x554F, 0x64BE, 0x8778, 0x6E26,
+ 0x7AA9, 0x55DA, 0x93A2, 0x70CF, 0x8AA3, 0x7121, 0x856A, 0x5862,
+ 0x9727, 0x52D9, 0x8AA4, 0x932B, 0x72A7, 0x8972, 0x7FD2, 0x9291,
+ 0x6232, 0x7D30, 0x8766, 0x8F44, 0x5CFD, 0x4FE0, 0x72F9, 0x5687,
+ 0x9341, 0x9BAE, 0x7E96, 0x8CE2, 0x929C, 0x9591, 0x986F, 0x96AA,
+ 0x73FE, 0x737B, 0x7E23, 0x9921, 0x61B2, 0x7DAB, 0x9472, 0x9109,
+ 0x8A73, 0x97FF, 0x9805, 0x856D, 0x56C2, 0x92B7, 0x66C9, 0x562F,
+ 0x5354, 0x633E, 0x8105, 0x8AE7, 0x5BEB, 0x7009, 0x8B1D, 0x92C5,
+ 0x91C1, 0x8208, 0x92B9, 0x7D89, 0x9808, 0x8A31, 0x7DD2, 0x7E8C,
+ 0x8ED2, 0x61F8, 0x9078, 0x766C, 0x7D62, 0x5B78, 0x52DB, 0x8A62,
+ 0x5C0B, 0x99B4, 0x8A13, 0x8A0A, 0x905C, 0x58D3, 0x9D09, 0x9D28,
+ 0x555E, 0x4E9E, 0x8A1D, 0x95B9, 0x9E7D, 0x56B4, 0x9854, 0x95BB,
+ 0x8277, 0x53AD, 0x786F, 0x8AFA, 0x9A57, 0x9D26, 0x694A, 0x63DA,
+ 0x760D, 0x967D, 0x7662, 0x990A, 0x6A23, 0x582F, 0x8B21, 0x85E5,
+ 0x723A, 0x9801, 0x696D, 0x8449, 0x91AB, 0x92A5, 0x9824, 0x907A,
+ 0x5100, 0x87FB, 0x85DD, 0x5104, 0x61B6, 0x7FA9, 0x8A63, 0x8B70,
+ 0x8ABC, 0x8B6F, 0x7E79, 0x852D, 0x9670, 0x9280, 0x98F2, 0x96B1,
+ 0x6AFB, 0x5B30, 0x9DF9, 0x61C9, 0x7E93, 0x7469, 0x87A2, 0x71DF,
+ 0x7192, 0x8805, 0x8D0F, 0x7A4E, 0x55B2, 0x64C1, 0x50AD, 0x7670,
+ 0x8E34, 0x512A, 0x6182, 0x90F5, 0x923E, 0x7336, 0x8A98, 0x8F3F,
+ 0x9918, 0x9B5A, 0x6F01, 0x8207, 0x5DBC, 0x8A9E, 0x9B31, 0x7344,
+ 0x8B7D, 0x9810, 0x99AD, 0x9D1B, 0x6DF5, 0x8F45, 0x5712, 0x54E1,
+ 0x5713, 0x7DE3, 0x9060, 0x9858, 0x7D04, 0x8E8D, 0x9470, 0x95B2,
+ 0x96F2, 0x9116, 0x9695, 0x904B, 0x85F4, 0x9196, 0x6688, 0x96DC,
+ 0x8F09, 0x6522, 0x66AB, 0x8D0A, 0x8D1C, 0x81DF, 0x947F, 0x68D7,
+ 0x7AC8, 0x8CAC, 0x64C7, 0x5247, 0x6FA4, 0x8CCA, 0x8D08, 0x8ECB,
+ 0x9358, 0x9598, 0x8A50, 0x9F4B, 0x50B5, 0x6C08, 0x76DE, 0x65AC,
+ 0x8F3E, 0x5D84, 0x68E7, 0x6230, 0x7DBB, 0x5F35, 0x6F32, 0x5E33,
+ 0x8CEC, 0x8139, 0x8D99, 0x87C4, 0x8F4D, 0x937A, 0x9019, 0x8C9E,
+ 0x91DD, 0x5075, 0x8A3A, 0x93AE, 0x9663, 0x5E40, 0x7665, 0x912D,
+ 0x8B49, 0x7E54, 0x8077, 0x57F7, 0x8879, 0x7D19, 0x646F, 0x64F2,
+ 0x5E5F, 0x8CEA, 0x6EEF, 0x9418, 0x7D42, 0x7A2E, 0x816B, 0x8846,
+ 0x8B05, 0x8EF8, 0x76BA, 0x665D, 0x9A5F, 0x8AF8, 0x8A85, 0x71ED,
+ 0x77DA, 0x56D1, 0x8CAF, 0x9444, 0x7BC9, 0x99D0, 0x5C08, 0x78DA,
+ 0x8F49, 0x8CFA, 0x6A01, 0x838A, 0x88DD, 0x599D, 0x58EF, 0x72C0,
+ 0x9310, 0x8D05, 0x589C, 0x7DB4, 0x8AC4, 0x6E96, 0x6FC1, 0x8CC7,
+ 0x6F2C, 0x7D9C, 0x7E3D, 0x7E31, 0x9112, 0x8A5B, 0x7D44, 0x947D,
+ 0x55C7, 0x5399, 0x53B4, 0x9768, 0x8D0B, 0x532D, 0x5331, 0x8CFE,
+ 0x5244, 0x528C, 0x5274, 0x50B4, 0x5000, 0x5096, 0x5115, 0x5102,
+ 0x5114, 0x513C, 0x5137, 0x50E8, 0x50C2, 0x513B, 0x5110, 0x513A,
+ 0x50C9, 0x7CF4, 0x9ECC, 0x56C5, 0x9CEC, 0x893B, 0x81E0, 0x8A01,
+ 0x8A10, 0x8A0C, 0x8A15, 0x8B33, 0x8A4E, 0x8A25, 0x8A41, 0x8A36,
+ 0x8A46, 0x8A54, 0x8A58, 0x8A52, 0x8A86, 0x8A84, 0x8A7F, 0x8A70,
+ 0x8A7C, 0x8A75, 0x8A6C, 0x8A6E, 0x8ACD, 0x8AE2, 0x8A61, 0x8A9A,
+ 0x8AA5, 0x8A91, 0x8A92, 0x8ACF, 0x8AD1, 0x8AC9, 0x8ADB, 0x8AD7,
+ 0x8AC2, 0x8AB6, 0x8AF6, 0x8AEB, 0x8B14, 0x8B01, 0x8AE4, 0x8AED,
+ 0x8AFC, 0x8AF3, 0x8AE6, 0x8AEE, 0x8ADE, 0x8B28, 0x8B9C, 0x8B16,
+ 0x8B1A, 0x8B10, 0x8B2B, 0x8B2D, 0x8B56, 0x8B59, 0x8B4E, 0x8B9E,
+ 0x8B6B, 0x8B96, 0x9658, 0x913A, 0x9114, 0x9134, 0x90DF, 0x9136,
+ 0x9106, 0x9148, 0x82BB, 0x52F1, 0x5DF0, 0x580A, 0x58D9, 0x58E2,
+ 0x58E0, 0x58DA, 0x57E1, 0x584F, 0x5816, 0x5852, 0x581D, 0x5864,
+ 0x858C, 0x8553, 0x85F6, 0x83A7, 0x8407, 0x84EF, 0x82E7, 0x8622,
+ 0x8526, 0x584B, 0x7162, 0x8558, 0x84FD, 0x854E, 0x8588, 0x85BA,
+ 0x7296, 0x6ECE, 0x8541, 0x85CE, 0x8552, 0x84C0, 0x8452, 0x8464,
+ 0x8494, 0x8435, 0x859F, 0x8555, 0x9DAF, 0x8493, 0x7E08, 0x8546,
+ 0x8562, 0x851E, 0x9A40, 0x863A, 0x93A3, 0x8577, 0x861E, 0x85FA,
+ 0x8604, 0x85EA, 0x861A, 0x5969, 0x5C37, 0x636B, 0x6476, 0x649F,
+ 0x6451, 0x645C, 0x64B3, 0x6504, 0x6516, 0x64F7, 0x64FC, 0x651B,
+ 0x5630, 0x5638, 0x56C8, 0x56A6, 0x5504, 0x54BC, 0x5680, 0x565D,
+ 0x5660, 0x5635, 0x55F6, 0x5666, 0x5672, 0x568C, 0x5665, 0x561C,
+ 0x562E, 0x55E9, 0x5616, 0x56C0, 0x560D, 0x56B3, 0x56C1, 0x566F,
+ 0x8F61, 0x56B6, 0x5695, 0x5707, 0x5E43, 0x5E6C, 0x5E58, 0x5E57,
+ 0x5D87, 0x5CF4, 0x5D50, 0x5D2C, 0x5DA7, 0x5DA0, 0x5D97, 0x5D0D,
+ 0x5DB8, 0x5D81, 0x5DD4, 0x5FA0, 0x7377, 0x7341, 0x736A, 0x733B,
+ 0x736B, 0x7380, 0x737C, 0x98E0, 0x9933, 0x98E9, 0x993C, 0x98EA,
+ 0x98EB, 0x98ED, 0x98F4, 0x9909, 0x9911, 0x991B, 0x9937, 0x993F,
+ 0x9943, 0x9948, 0x9949, 0x994A, 0x994C, 0x9962, 0x5EE1, 0x8CE1,
+ 0x61FA, 0x61AE, 0x616A, 0x613E, 0x60B5, 0x6134, 0x61CC, 0x615F,
+ 0x61E8, 0x60FB, 0x6137, 0x60F2, 0x6173, 0x611C, 0x6192, 0x9582,
+ 0x9586, 0x95C8, 0x958E, 0x9594, 0x958C, 0x95E5, 0x95AD, 0x95AB,
+ 0x9B2E, 0x95AC, 0x95BE, 0x95B6, 0x9B29, 0x95BF, 0x95BD, 0x95BC,
+ 0x95C3, 0x95CB, 0x95D4, 0x95D0, 0x95D5, 0x95DE, 0x7043, 0x6F59,
+ 0x7027, 0x7018, 0x6FFC, 0x6D87, 0x6D79, 0x6E5E, 0x6FAE, 0x700F,
+ 0x6EF8, 0x6F6F, 0x6DF6, 0x6F7F, 0x7006, 0x6FA0, 0x700B, 0x7067,
+ 0x7044, 0x7005, 0x6F77, 0x7020, 0x701F, 0x7032, 0x7028, 0x705D,
+ 0x9A2B, 0x9087, 0x9015, 0x9090, 0x5C68, 0x5F33, 0x5AF5, 0x5AD7,
+ 0x5B00, 0x5A6D, 0x5B08, 0x5B4C, 0x5AA7, 0x5AFB, 0x5B0B, 0x5B21,
+ 0x5B2A, 0x5B19, 0x99D4, 0x99DF, 0x99D9, 0x9A36, 0x9A5B, 0x99D1,
+ 0x99D8, 0x9A4D, 0x9A4A, 0x99E2, 0x9A6A, 0x9A0F, 0x9A0D, 0x9A05,
+ 0x9A42, 0x9A2D, 0x9A16, 0x9A41, 0x9A2E, 0x9A38, 0x9A43, 0x9A44,
+ 0x9A4F, 0x9A65, 0x9A64, 0x7CF9, 0x7D06, 0x7D02, 0x7D07, 0x7D08,
+ 0x7E8A, 0x7D1C, 0x7D15, 0x7D13, 0x7D3A, 0x7D32, 0x7D31, 0x7E10,
+ 0x7D3C, 0x7D40, 0x7D3F, 0x7D5D, 0x7D4E, 0x7D73, 0x7D86, 0x7D83,
+ 0x7D88, 0x7DBE, 0x7DBA, 0x7DCB, 0x7DD4, 0x7DC4, 0x7D9E, 0x7DAC,
+ 0x7DB9, 0x7DA3, 0x7DB0, 0x7DC7, 0x7DD9, 0x7DD7, 0x7DF9, 0x7DF2,
+ 0x7E62, 0x7DE6, 0x7DF6, 0x7DF1, 0x7E0B, 0x7DE1, 0x7E09, 0x7E1D,
+ 0x7E1F, 0x7E1E, 0x7E2D, 0x7E0A, 0x7E11, 0x7E7D, 0x7E39, 0x7E35,
+ 0x7E32, 0x7E46, 0x7E45, 0x7E88, 0x7E5A, 0x7E52, 0x7E6E, 0x7E7E,
+ 0x7E70, 0x7E6F, 0x7E98, 0x74A3, 0x744B, 0x74CF, 0x980A, 0x74BD,
+ 0x743F, 0x7489, 0x74A6, 0x74D4, 0x74DA, 0x97D9, 0x97DE, 0x97DC,
+ 0x69AA, 0x6AEA, 0x6898, 0x68D6, 0x6A05, 0x689F, 0x6ADB, 0x6AF3,
+ 0x6AE8, 0x6ADF, 0x6A89, 0x690F, 0x6A48, 0x6968, 0x69BF, 0x6A3A,
+ 0x6A9C, 0x6B12, 0x6B1E, 0x6ADD, 0x69E7, 0x6B0F, 0x6B16, 0x6AEC,
+ 0x6ADA, 0x6AF8, 0x6AB3, 0x6AE7, 0x6AA3, 0x6AD3, 0x6ADE, 0x6BA4,
+ 0x6B9E, 0x6BAE, 0x6BAB, 0x6BAF, 0x8ED4, 0x8EDB, 0x8EF2, 0x8EFB,
+ 0x8F64, 0x8EF9, 0x8EFC, 0x8EEB, 0x8EE4, 0x8F62, 0x8EFA, 0x8EFE,
+ 0x8F0A, 0x8F07, 0x8F05, 0x8F12, 0x8F26, 0x8F1E, 0x8F1F, 0x8F1C,
+ 0x8F33, 0x8F46, 0x8F54, 0x6214, 0x6227, 0x750C, 0x66C7, 0x66C4,
+ 0x6689, 0x66D6, 0x8CC1, 0x8CB0, 0x8CBA, 0x8CBD, 0x8D04, 0x8CB2,
+ 0x8CC5, 0x8D10, 0x8CD1, 0x8CDA, 0x8CD5, 0x8CEB, 0x8CE7, 0x8CFB,
+ 0x8998, 0x89AC, 0x89A1, 0x89BF, 0x89A6, 0x89AF, 0x89B2, 0x89B7,
+ 0x6BFF, 0x6C0C, 0x6C2C, 0x7258, 0x6727, 0x8156, 0x81DA, 0x811B,
+ 0x81BE, 0x8161, 0x81CF, 0x6B5F, 0x98AE, 0x98AF, 0x98B6, 0x98BC,
+ 0x98C6, 0x98C8, 0x8F42, 0x9F4F, 0x6595, 0x716C, 0x7152, 0x7197,
+ 0x71C1, 0x71DC, 0x71FE, 0x79B0, 0x798E, 0x79AA, 0x61DF, 0x6164,
+ 0x61E3, 0x6207, 0x6FA9, 0x78EF, 0x78AD, 0x7868, 0x78B8, 0x792A,
+ 0x7931, 0x7864, 0x78FD, 0x78E7, 0x78E3, 0x9F95, 0x7798, 0x775E,
+ 0x77BC, 0x7F86, 0x7F88, 0x91D2, 0x91D3, 0x91D4, 0x91D9, 0x91D7,
+ 0x91D5, 0x91F7, 0x91E7, 0x91E4, 0x9346, 0x91F5, 0x91F9, 0x9208,
+ 0x9226, 0x9245, 0x9211, 0x9210, 0x9201, 0x9227, 0x9204, 0x9225,
+ 0x9200, 0x923A, 0x9266, 0x9237, 0x9233, 0x9255, 0x923D, 0x9238,
+ 0x925E, 0x926C, 0x926D, 0x923F, 0x9460, 0x9230, 0x9249, 0x9248,
+ 0x924D, 0x922E, 0x9239, 0x9438, 0x92AC, 0x92A0, 0x927A, 0x92AA,
+ 0x92EE, 0x92CF, 0x9403, 0x92E3, 0x943A, 0x92B1, 0x92A6, 0x93A7,
+ 0x9296, 0x92CC, 0x92A9, 0x93F5, 0x9293, 0x927F, 0x93A9, 0x929A,
+ 0x931A, 0x92AB, 0x9283, 0x940B, 0x92A8, 0x92A3, 0x9412, 0x9338,
+ 0x92F1, 0x93D7, 0x92E5, 0x92F0, 0x92EF, 0x92E8, 0x92BC, 0x92DD,
+ 0x92F6, 0x9426, 0x9427, 0x92C3, 0x92DF, 0x92E6, 0x9312, 0x9306,
+ 0x9369, 0x931B, 0x9340, 0x9301, 0x9315, 0x932E, 0x9343, 0x9307,
+ 0x9308, 0x931F, 0x9319, 0x9365, 0x9347, 0x9376, 0x9354, 0x9364,
+ 0x93AA, 0x9370, 0x9384, 0x93E4, 0x93D8, 0x9428, 0x9387, 0x93CC,
+ 0x9398, 0x93B8, 0x93BF, 0x93A6, 0x93B0, 0x93B5, 0x944C, 0x93E2,
+ 0x93DC, 0x93DD, 0x93CD, 0x93DE, 0x93C3, 0x93C7, 0x93D1, 0x9414,
+ 0x941D, 0x93F7, 0x9465, 0x9413, 0x946D, 0x9420, 0x9479, 0x93F9,
+ 0x9419, 0x944A, 0x9432, 0x943F, 0x9454, 0x9463, 0x937E, 0x7A61,
+ 0x9CE9, 0x9CF6, 0x9D07, 0x9D06, 0x9D23, 0x9D87, 0x9E15, 0x9D1D,
+ 0x9D1F, 0x9DE5, 0x9D2F, 0x9DD9, 0x9D30, 0x9D42, 0x9E1E, 0x9D53,
+ 0x9E1D, 0x9D60, 0x9D52, 0x9DF3, 0x9D5C, 0x9D61, 0x9D93, 0x9D6A,
+ 0x9D6F, 0x9D89, 0x9D98, 0x9D9A, 0x9DC0, 0x9DA5, 0x9DA9, 0x9DC2,
+ 0x9DBC, 0x9E1A, 0x9DD3, 0x9DDA, 0x9DEF, 0x9DE6, 0x9DF2, 0x9DF8,
+ 0x9E0C, 0x9DFA, 0x9E1B, 0x7664, 0x7658, 0x7667, 0x7602, 0x7646,
+ 0x7647, 0x7649, 0x761E, 0x763B, 0x766D, 0x766E, 0x7669, 0x7672,
+ 0x7AC7, 0x7AB6, 0x8960, 0x8933, 0x895D, 0x8947, 0x8938, 0x8964,
+ 0x76B8, 0x802E, 0x802C, 0x8079, 0x8075, 0x9807, 0x980E, 0x980F,
+ 0x9821, 0x981C, 0x6F41, 0x9826, 0x9837, 0x984E, 0x9853, 0x9873,
+ 0x9862, 0x9859, 0x9865, 0x986C, 0x9870, 0x87E3, 0x8806, 0x8706,
+ 0x8823, 0x87F6, 0x86FA, 0x87EF, 0x8784, 0x8810, 0x87C8, 0x8811,
+ 0x87BB, 0x87CE, 0x7F4C, 0x7BE4, 0x7B67, 0x7C69, 0x7BF3, 0x7C00,
+ 0x7BCB, 0x7C5C, 0x7C1E, 0x7C2B, 0x7C23, 0x7C6A, 0x7C5F, 0x8264,
+ 0x826B, 0x88CA, 0x7FA5, 0x7CF2, 0x7CF6, 0x7CDD, 0x7E36, 0x9EA9,
+ 0x8DB2, 0x91C5, 0x91C3, 0x9E7A, 0x8E89, 0x8E4C, 0x8E92, 0x8E7A,
+ 0x8E55, 0x8E9A, 0x8E8B, 0x8E93, 0x8E91, 0x8EA1, 0x8E63, 0x8EAA,
+ 0x8EA6, 0x89F4, 0x89F6, 0x975A, 0x9742, 0x973D, 0x9744, 0x9F54,
+ 0x9F5F, 0x9F59, 0x9F60, 0x9F5C, 0x9F66, 0x9F6C, 0x9F6A, 0x9F77,
+ 0x9EFD, 0x9EFF, 0x9F09, 0x8B8E, 0x947E, 0x93E8, 0x9B77, 0x9B74,
+ 0x9B81, 0x9B83, 0x9B8E, 0x9C78, 0x7A4C, 0x9B92, 0x9C5F, 0x9B90,
+ 0x9BAD, 0x9B9A, 0x9BAA, 0x9B9E, 0x9C6D, 0x9BAB, 0x9B9D, 0x9C58,
+ 0x9BC1, 0x9C7A, 0x9C31, 0x9C39, 0x9C23, 0x9C37, 0x9BC0, 0x9BCA,
+ 0x9BC7, 0x9BFD, 0x9BD6, 0x9BEA, 0x9BEB, 0x9BE1, 0x9BE4, 0x9BE7,
+ 0x9BDD, 0x9BE2, 0x9BF0, 0x9BDB, 0x9BF4, 0x9BD4, 0x9C5D, 0x9C08,
+ 0x9C10, 0x9C0D, 0x9C12, 0x9C09, 0x9BFF, 0x9C20, 0x9C32, 0x9C2D,
+ 0x9C28, 0x9C25, 0x9C29, 0x9C33, 0x9C3E, 0x9C48, 0x9C3B, 0x9C35,
+ 0x9C45, 0x9C56, 0x9C54, 0x9C52, 0x9C67, 0x97C3, 0x97BD, 0x97C9,
+ 0x9DBB, 0x9ACF, 0x9AD6, 0x9AD5, 0x9B58, 0x9B4E, 0x9957, 0x995C,
+ 0x9B22, 0x9EF7, 0x9EF2, 0x896C, 0x95C6, 0x9336, 0x5F46, 0x8514,
+ 0x7E94, 0x9F63, 0x5679, 0x9F15, 0x5641, 0x9AEE, 0x8907, 0x7A40,
+ 0x98B3, 0x95A4, 0x9B0D, 0x8FF4, 0x5F59, 0x7A6B, 0x98E2, 0x50A2,
+ 0x8591, 0x5118, 0x6372, 0x524B, 0x774F, 0x7E8D, 0x66C6, 0x77AD,
+ 0x9E75, 0x56C9, 0x9EF4, 0x6FDB, 0x61DE, 0x77C7, 0x7030, 0x9EB5,
+ 0x884A, 0x95E2, 0x97C6, 0x7C64, 0x7E34, 0x97A6, 0x9EAF, 0x56CC,
+ 0x98B1, 0x6AAF, 0x7F4E, 0x7CF0, 0x4FC2, 0x7E6B, 0x9E79, 0x56AE,
+ 0x9B1A, 0x846F, 0x79A6, 0x7C72, 0x9AD2, 0x96BB, 0x7DFB, 0x88FD,
+ 0x7843, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,
+ 0x2177, 0x2178, 0x2179, 0x02CA, 0x02CB, 0x02D9, 0x2013, 0x2015,
+ 0x2025, 0x2035, 0x2105, 0x2109, 0x2196, 0x2197, 0x2198, 0x2199,
+ 0x2215, 0x221F, 0x2223, 0x2252, 0x2266, 0x2267, 0x22BF, 0x2550,
+ 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558,
+ 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E, 0x255F, 0x2560,
+ 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568,
+ 0x2569, 0x256A, 0x256B, 0x256C, 0x256D, 0x256E, 0x256F, 0x2570,
+ 0x2571, 0x2572, 0x2573, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585,
+ 0x2586, 0x2587, 0x2588, 0x2589, 0x258A, 0x258B, 0x258C, 0x258D,
+ 0x258E, 0x258F, 0x2593, 0x2594, 0x2595, 0x25BC, 0x25BD, 0x25E2,
+ 0x25E3, 0x25E4, 0x25E5, 0x2609, 0x2295, 0x3012, 0x301D, 0x301E,
+ 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,
+ 0x3029, 0x32A3, 0x338E, 0x338F, 0x339C, 0x339D, 0x339E, 0x33A1,
+ 0x33C4, 0x33CE, 0x33D1, 0x33D2, 0x33D5, 0xFE30, 0xFFE2, 0xFFE4,
+ 0x2121, 0x3231, 0x2010, 0x30FC, 0x309B, 0x309C, 0x30FD, 0x30FE,
+ 0x3006, 0x309D, 0x309E, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D,
+ 0xFE4E, 0xFE4F, 0xFE50, 0xFE51, 0xFE52, 0xFE54, 0xFE55, 0xFE56,
+ 0xFE57, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F,
+ 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE68,
+ 0xFE69, 0xFE6A, 0xFE6B, 0x303E, 0x2FF0, 0x2FF1, 0x2FF2, 0x2FF3,
+ 0x2FF4, 0x2FF5, 0x2FF6, 0x2FF7, 0x2FF8, 0x2FF9, 0x2FFA, 0x2FFB,
+ 0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F,
+ 0x4E20, 0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31,
+ 0x4E33, 0x4E35, 0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44,
+ 0x4E46, 0x4E4A, 0x4E51, 0x4E55, 0x4E57, 0x4E5A, 0x4E5B, 0x4E62,
+ 0x4E63, 0x4E64, 0x4E65, 0x4E67, 0x4E68, 0x4E6A, 0x4E6B, 0x4E6C,
+ 0x4E6D, 0x4E6E, 0x4E6F, 0x4E72, 0x4E74, 0x4E75, 0x4E76, 0x4E77,
+ 0x4E78, 0x4E79, 0x4E7A, 0x4E7B, 0x4E7C, 0x4E7D, 0x4E7F, 0x4E80,
+ 0x4E81, 0x4E83, 0x4E84, 0x4E85, 0x4E87, 0x4E8A, 0x4E90, 0x4E96,
+ 0x4E97, 0x4E99, 0x4E9C, 0x4E9D, 0x4EA3, 0x4EAA, 0x4EAF, 0x4EB0,
+ 0x4EB1, 0x4EB4, 0x4EB6, 0x4EB7, 0x4EB8, 0x4EB9, 0x4EBC, 0x4EBD,
+ 0x4EBE, 0x4EC8, 0x4ECC, 0x4ECF, 0x4ED0, 0x4ED2, 0x4EDA, 0x4EDB,
+ 0x4EDC, 0x4EE0, 0x4EE2, 0x4EE6, 0x4EE7, 0x4EE9, 0x4EED, 0x4EEE,
+ 0x4EEF, 0x4EF1, 0x4EF4, 0x4EF8, 0x4EF9, 0x4EFA, 0x4EFC, 0x4EFE,
+ 0x4F00, 0x4F02, 0x4F03, 0x4F04, 0x4F05, 0x4F06, 0x4F07, 0x4F08,
+ 0x4F0B, 0x4F0C, 0x4F12, 0x4F13, 0x4F14, 0x4F15, 0x4F16, 0x4F1C,
+ 0x4F1D, 0x4F21, 0x4F23, 0x4F28, 0x4F29, 0x4F2C, 0x4F2D, 0x4F2E,
+ 0x4F31, 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F3F,
+ 0x4F40, 0x4F41, 0x4F42, 0x4F44, 0x4F45, 0x4F47, 0x4F48, 0x4F49,
+ 0x4F4A, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F61, 0x4F62,
+ 0x4F66, 0x4F68, 0x4F6A, 0x4F6B, 0x4F6D, 0x4F6E, 0x4F71, 0x4F72,
+ 0x4F75, 0x4F77, 0x4F78, 0x4F79, 0x4F7A, 0x4F7D, 0x4F80, 0x4F81,
+ 0x4F82, 0x4F85, 0x4F87, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92,
+ 0x4F93, 0x4F95, 0x4F98, 0x4F99, 0x4F9A, 0x4F9C, 0x4F9E, 0x4F9F,
+ 0x4FA1, 0x4FA2, 0x4FA4, 0x4FAB, 0x4FAD, 0x4FB0, 0x4FB1, 0x4FB2,
+ 0x4FB3, 0x4FB4, 0x4FB6, 0x4FB7, 0x4FB8, 0x4FB9, 0x4FBA, 0x4FBB,
+ 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1, 0x4FC6, 0x4FC7, 0x4FC8,
+ 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FD2, 0x4FD3, 0x4FD4, 0x4FD5,
+ 0x4FD6, 0x4FD9, 0x4FDB, 0x4FE2, 0x4FE4, 0x4FE5, 0x4FE7, 0x4FEB,
+ 0x4FEC, 0x4FF0, 0x4FF2, 0x4FF4, 0x4FF5, 0x4FF6, 0x4FF7, 0x4FF9,
+ 0x4FFB, 0x4FFC, 0x4FFD, 0x4FFF, 0x5001, 0x5002, 0x5003, 0x5004,
+ 0x5005, 0x5007, 0x5008, 0x500A, 0x500E, 0x5010, 0x5013, 0x5015,
+ 0x5016, 0x5017, 0x501B, 0x501D, 0x501E, 0x5020, 0x5022, 0x5023,
+ 0x5024, 0x5027, 0x502F, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034,
+ 0x5035, 0x5036, 0x5037, 0x5038, 0x5039, 0x503B, 0x503D, 0x503F,
+ 0x5040, 0x5041, 0x5042, 0x5044, 0x5045, 0x5046, 0x504A, 0x504B,
+ 0x504D, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057,
+ 0x5058, 0x5059, 0x505B, 0x505D, 0x505E, 0x505F, 0x5060, 0x5061,
+ 0x5062, 0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506A,
+ 0x506B, 0x506D, 0x506E, 0x506F, 0x5070, 0x5071, 0x5072, 0x5073,
+ 0x5078, 0x5079, 0x507A, 0x507C, 0x507D, 0x5081, 0x5082, 0x5083,
+ 0x5084, 0x5086, 0x5087, 0x5089, 0x508A, 0x508B, 0x508C, 0x508E,
+ 0x508F, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095, 0x5097,
+ 0x509A, 0x509B, 0x509C, 0x509D, 0x509E, 0x509F, 0x50A0, 0x50A1,
+ 0x50A4, 0x50A6, 0x50AA, 0x50AB, 0x50AE, 0x50AF, 0x50B0, 0x50B1,
+ 0x50B6, 0x50B8, 0x50B9, 0x50BC, 0x50BD, 0x50BF, 0x50C0, 0x50C1,
+ 0x50C3, 0x50C4, 0x50C6, 0x50C7, 0x50C8, 0x50CA, 0x50CB, 0x50CC,
+ 0x50CD, 0x50CE, 0x50D0, 0x50D2, 0x50D3, 0x50D4, 0x50D7, 0x50D8,
+ 0x50D9, 0x50DB, 0x50DC, 0x50DD, 0x50DF, 0x50E0, 0x50E1, 0x50E2,
+ 0x50E3, 0x50E4, 0x50E9, 0x50EA, 0x50EB, 0x50EF, 0x50F0, 0x50F1,
+ 0x50F2, 0x50F4, 0x50F6, 0x50F7, 0x50F8, 0x50FA, 0x50FC, 0x50FD,
+ 0x50FE, 0x50FF, 0x5101, 0x5103, 0x5105, 0x510A, 0x510C, 0x510D,
+ 0x510E, 0x510F, 0x5111, 0x5113, 0x5116, 0x5117, 0x5119, 0x511A,
+ 0x511B, 0x511C, 0x511D, 0x511E, 0x5120, 0x5122, 0x5123, 0x5124,
+ 0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512B, 0x512C, 0x512D,
+ 0x512E, 0x512F, 0x5130, 0x5131, 0x5133, 0x5134, 0x5135, 0x5136,
+ 0x5138, 0x5139, 0x513D, 0x513E, 0x5142, 0x5147, 0x514A, 0x514C,
+ 0x514E, 0x514F, 0x5150, 0x5153, 0x5157, 0x5158, 0x5159, 0x515B,
+ 0x515D, 0x515E, 0x515F, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166,
+ 0x5167, 0x516A, 0x516F, 0x5172, 0x517A, 0x517E, 0x517F, 0x5183,
+ 0x5184, 0x5186, 0x5187, 0x518A, 0x518B, 0x518E, 0x518F, 0x5190,
+ 0x5191, 0x5193, 0x5194, 0x5198, 0x519A, 0x519D, 0x519E, 0x519F,
+ 0x51A1, 0x51A3, 0x51A6, 0x51A7, 0x51A8, 0x51A9, 0x51AA, 0x51AD,
+ 0x51AE, 0x51B4, 0x51B8, 0x51B9, 0x51BA, 0x51BE, 0x51BF, 0x51C1,
+ 0x51C2, 0x51C3, 0x51C5, 0x51C8, 0x51CA, 0x51CE, 0x51D0, 0x51D2,
+ 0x51D3, 0x51D4, 0x51D5, 0x51D6, 0x51D7, 0x51D8, 0x51D9, 0x51DA,
+ 0x51DC, 0x51DE, 0x51DF, 0x51E2, 0x51E3, 0x51E5, 0x51E6, 0x51E7,
+ 0x51E8, 0x51E9, 0x51EA, 0x51EC, 0x51EE, 0x51F2, 0x51F4, 0x51F7,
+ 0x51FE, 0x5204, 0x5205, 0x5209, 0x520B, 0x520C, 0x520F, 0x5210,
+ 0x5213, 0x5214, 0x5215, 0x521C, 0x521E, 0x521F, 0x5221, 0x5222,
+ 0x5223, 0x5225, 0x5226, 0x5227, 0x522A, 0x522C, 0x522F, 0x5231,
+ 0x5232, 0x5234, 0x5235, 0x523C, 0x523E, 0x5245, 0x5246, 0x5248,
+ 0x5249, 0x524E, 0x524F, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258,
+ 0x5259, 0x525A, 0x525D, 0x525F, 0x5260, 0x5262, 0x5263, 0x5264,
+ 0x5266, 0x5268, 0x526B, 0x526C, 0x526D, 0x5270, 0x5271, 0x5273,
+ 0x5276, 0x5277, 0x5278, 0x5279, 0x527A, 0x527B, 0x527C, 0x527E,
+ 0x5280, 0x5284, 0x5285, 0x5286, 0x528B, 0x528E, 0x528F, 0x5292,
+ 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299, 0x529A, 0x529C,
+ 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AE, 0x52AF, 0x52B0, 0x52B4,
+ 0x52B5, 0x52B6, 0x52B7, 0x52B8, 0x52B9, 0x52BA, 0x52BB, 0x52BC,
+ 0x52BD, 0x52C0, 0x52C2, 0x52C4, 0x52C5, 0x52C6, 0x52C8, 0x52CA,
+ 0x52CC, 0x52CD, 0x52CE, 0x52CF, 0x52D1, 0x52D3, 0x52D4, 0x52D7,
+ 0x52DA, 0x52DC, 0x52E0, 0x52E1, 0x52E3, 0x52E5, 0x52E6, 0x52E7,
+ 0x52E8, 0x52E9, 0x52EA, 0x52EB, 0x52EC, 0x52ED, 0x52EE, 0x52EF,
+ 0x52F2, 0x52F3, 0x52F4, 0x52F6, 0x52F7, 0x52FB, 0x52FC, 0x52FD,
+ 0x5301, 0x5302, 0x5303, 0x5304, 0x5307, 0x5309, 0x530A, 0x530B,
+ 0x530C, 0x530E, 0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531B,
+ 0x531C, 0x531E, 0x531F, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328,
+ 0x5329, 0x532B, 0x532C, 0x5330, 0x5332, 0x5333, 0x5334, 0x5335,
+ 0x5336, 0x5337, 0x5338, 0x533C, 0x533D, 0x5342, 0x5344, 0x5346,
+ 0x534B, 0x534C, 0x534D, 0x5350, 0x5358, 0x5359, 0x535B, 0x535D,
+ 0x5365, 0x5368, 0x536A, 0x536C, 0x536D, 0x5372, 0x5376, 0x5379,
+ 0x537B, 0x537C, 0x537D, 0x537E, 0x5380, 0x5381, 0x5383, 0x5387,
+ 0x5388, 0x538A, 0x538E, 0x538F, 0x5390, 0x5391, 0x5392, 0x5393,
+ 0x5394, 0x5396, 0x5397, 0x539B, 0x539C, 0x539E, 0x53A1, 0x53A4,
+ 0x53A7, 0x53AA, 0x53AB, 0x53AC, 0x53AF, 0x53B0, 0x53B1, 0x53B3,
+ 0x53B5, 0x53B7, 0x53B8, 0x53B9, 0x53BA, 0x53BC, 0x53BD, 0x53BE,
+ 0x53C0, 0x53C4, 0x53C5, 0x53C6, 0x53C7, 0x53CE, 0x53CF, 0x53D0,
+ 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DC, 0x53DD, 0x53DE, 0x53E1,
+ 0x53E7, 0x53F4, 0x53FA, 0x53FE, 0x53FF, 0x5400, 0x5402, 0x5405,
+ 0x5407, 0x540B, 0x5414, 0x5418, 0x5419, 0x541A, 0x541C, 0x5422,
+ 0x5424, 0x5425, 0x542A, 0x5430, 0x5433, 0x5436, 0x5437, 0x543A,
+ 0x543D, 0x543F, 0x5441, 0x5442, 0x5444, 0x5445, 0x5447, 0x5449,
+ 0x544C, 0x544D, 0x544E, 0x544F, 0x5451, 0x545A, 0x545D, 0x545E,
+ 0x545F, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467, 0x5469, 0x546A,
+ 0x546B, 0x546C, 0x546D, 0x546E, 0x546F, 0x5470, 0x5474, 0x5479,
+ 0x547A, 0x547E, 0x547F, 0x5481, 0x5483, 0x5485, 0x5487, 0x5488,
+ 0x5489, 0x548A, 0x548D, 0x5491, 0x5493, 0x5497, 0x5498, 0x549C,
+ 0x549E, 0x549F, 0x54A0, 0x54A1, 0x54A2, 0x54A5, 0x54AE, 0x54B0,
+ 0x54B2, 0x54B5, 0x54B6, 0x54B7, 0x54B9, 0x54BA, 0x54BE, 0x54C3,
+ 0x54C5, 0x54CA, 0x54CB, 0x54D6, 0x54D8, 0x54DB, 0x54E0, 0x54E2,
+ 0x54E3, 0x54E4, 0x54EB, 0x54EC, 0x54EF, 0x54F0, 0x54F1, 0x54F4,
+ 0x54F5, 0x54F6, 0x54F7, 0x54F8, 0x54F9, 0x54FB, 0x54FE, 0x5500,
+ 0x5502, 0x5503, 0x5505, 0x5508, 0x550A, 0x550B, 0x550C, 0x550D,
+ 0x550E, 0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519,
+ 0x551A, 0x551C, 0x551D, 0x551E, 0x551F, 0x5521, 0x5525, 0x5526,
+ 0x5528, 0x5529, 0x552B, 0x552D, 0x5532, 0x5534, 0x5535, 0x5536,
+ 0x5538, 0x5539, 0x553A, 0x553B, 0x553D, 0x5540, 0x5542, 0x5545,
+ 0x5547, 0x5548, 0x554B, 0x554C, 0x554D, 0x554E, 0x5551, 0x5552,
+ 0x5554, 0x5557, 0x5558, 0x5559, 0x555A, 0x555B, 0x555D, 0x555F,
+ 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556B, 0x556F, 0x5570,
+ 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557A, 0x557D, 0x557F,
+ 0x5585, 0x5586, 0x558C, 0x558D, 0x558E, 0x5590, 0x5592, 0x5593,
+ 0x5595, 0x5596, 0x5597, 0x559A, 0x559B, 0x559E, 0x55A0, 0x55A1,
+ 0x55A2, 0x55A3, 0x55A4, 0x55A5, 0x55A6, 0x55A8, 0x55A9, 0x55AB,
+ 0x55AD, 0x55AF, 0x55B0, 0x55B4, 0x55B6, 0x55B8, 0x55BA, 0x55BC,
+ 0x55BF, 0x55C0, 0x55C1, 0x55C2, 0x55C3, 0x55C8, 0x55CA, 0x55CB,
+ 0x55CF, 0x55D0, 0x55D5, 0x55D7, 0x55D8, 0x55D9, 0x55DB, 0x55DE,
+ 0x55E0, 0x55E2, 0x55E7, 0x55ED, 0x55EE, 0x55F0, 0x55F1, 0x55F4,
+ 0x55F8, 0x55F9, 0x55FA, 0x55FB, 0x55FC, 0x55FF, 0x5602, 0x5603,
+ 0x5604, 0x5605, 0x5607, 0x560A, 0x560B, 0x5610, 0x5611, 0x5612,
+ 0x5613, 0x5615, 0x5619, 0x561A, 0x561D, 0x5620, 0x5621, 0x5622,
+ 0x5625, 0x5626, 0x5628, 0x562A, 0x562B, 0x5633, 0x5637, 0x563A,
+ 0x563C, 0x563D, 0x563E, 0x5640, 0x5642, 0x5643, 0x5644, 0x5645,
+ 0x5646, 0x5647, 0x5648, 0x5649, 0x564A, 0x564B, 0x564F, 0x5650,
+ 0x5651, 0x5652, 0x5653, 0x5655, 0x5656, 0x565A, 0x565B, 0x565E,
+ 0x565F, 0x5661, 0x5663, 0x5667, 0x566D, 0x566E, 0x5670, 0x5673,
+ 0x5675, 0x5677, 0x567A, 0x567D, 0x567E, 0x567F, 0x5681, 0x5682,
+ 0x5683, 0x5684, 0x5688, 0x5689, 0x568A, 0x568B, 0x568D, 0x5690,
+ 0x5691, 0x5692, 0x5694, 0x5696, 0x5697, 0x5698, 0x569A, 0x569B,
+ 0x569C, 0x569D, 0x569E, 0x569F, 0x56A0, 0x56A1, 0x56A2, 0x56A4,
+ 0x56A5, 0x56A7, 0x56A9, 0x56AA, 0x56AB, 0x56AC, 0x56AD, 0x56B0,
+ 0x56B1, 0x56B2, 0x56B5, 0x56B8, 0x56B9, 0x56BA, 0x56BB, 0x56BD,
+ 0x56BE, 0x56BF, 0x56C3, 0x56C4, 0x56C6, 0x56C7, 0x56CB, 0x56CD,
+ 0x56CE, 0x56CF, 0x56D0, 0x56D2, 0x56D3, 0x56D5, 0x56D6, 0x56D8,
+ 0x56D9, 0x56DC, 0x56E3, 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56E9,
+ 0x56EA, 0x56EC, 0x56EE, 0x56EF, 0x56F2, 0x56F3, 0x56F6, 0x56F7,
+ 0x56F8, 0x56FB, 0x56FC, 0x5700, 0x5701, 0x5702, 0x5705, 0x570C,
+ 0x570E, 0x570F, 0x5710, 0x5711, 0x5714, 0x5715, 0x5717, 0x5719,
+ 0x571A, 0x571B, 0x571D, 0x571E, 0x5720, 0x5721, 0x5722, 0x5724,
+ 0x5725, 0x5726, 0x5727, 0x572B, 0x5731, 0x5732, 0x5734, 0x5735,
+ 0x5736, 0x5737, 0x5738, 0x573C, 0x573D, 0x573F, 0x5741, 0x5743,
+ 0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574B, 0x5752, 0x5753,
+ 0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765,
+ 0x5767, 0x576C, 0x576E, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775,
+ 0x5778, 0x5779, 0x577A, 0x577D, 0x577E, 0x577F, 0x5780, 0x5781,
+ 0x5787, 0x5788, 0x5789, 0x578A, 0x578D, 0x578E, 0x578F, 0x5790,
+ 0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579A,
+ 0x579C, 0x579D, 0x579E, 0x579F, 0x57A5, 0x57A8, 0x57AA, 0x57AC,
+ 0x57AF, 0x57B0, 0x57B1, 0x57B3, 0x57B5, 0x57B6, 0x57B7, 0x57B9,
+ 0x57BA, 0x57BB, 0x57BC, 0x57BD, 0x57BE, 0x57BF, 0x57C0, 0x57C1,
+ 0x57C4, 0x57C5, 0x57C6, 0x57C7, 0x57C8, 0x57C9, 0x57CA, 0x57CC,
+ 0x57CD, 0x57D0, 0x57D1, 0x57D3, 0x57D6, 0x57D7, 0x57DB, 0x57DC,
+ 0x57DE, 0x57E2, 0x57E3, 0x57E5, 0x57E6, 0x57E7, 0x57E8, 0x57E9,
+ 0x57EA, 0x57EB, 0x57EC, 0x57EE, 0x57F0, 0x57F1, 0x57F2, 0x57F3,
+ 0x57F5, 0x57F6, 0x57FB, 0x57FC, 0x57FE, 0x57FF, 0x5801, 0x5803,
+ 0x5804, 0x5808, 0x5809, 0x580C, 0x580E, 0x580F, 0x5810, 0x5812,
+ 0x5813, 0x5814, 0x5817, 0x5818, 0x581A, 0x581B, 0x581C, 0x581F,
+ 0x5822, 0x5823, 0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582B,
+ 0x582C, 0x582D, 0x582E, 0x5832, 0x5833, 0x5836, 0x5837, 0x5838,
+ 0x5839, 0x583A, 0x583B, 0x583C, 0x583D, 0x583E, 0x583F, 0x5840,
+ 0x5841, 0x5842, 0x5843, 0x5845, 0x5846, 0x5847, 0x5848, 0x5849,
+ 0x584E, 0x5850, 0x5853, 0x5855, 0x5856, 0x5859, 0x585A, 0x585B,
+ 0x585C, 0x585D, 0x585F, 0x5860, 0x5861, 0x5863, 0x5866, 0x5867,
+ 0x5868, 0x5869, 0x586A, 0x586D, 0x586E, 0x586F, 0x5870, 0x5871,
+ 0x5872, 0x5873, 0x5874, 0x5876, 0x5877, 0x5878, 0x587A, 0x587B,
+ 0x587C, 0x587D, 0x587F, 0x5882, 0x5884, 0x5886, 0x5887, 0x5888,
+ 0x588B, 0x588C, 0x588D, 0x588E, 0x588F, 0x5890, 0x5891, 0x5894,
+ 0x5895, 0x5896, 0x5897, 0x5898, 0x589B, 0x589D, 0x58A0, 0x58A1,
+ 0x58A2, 0x58A3, 0x58A4, 0x58A5, 0x58A6, 0x58A7, 0x58AA, 0x58AB,
+ 0x58AC, 0x58AD, 0x58AF, 0x58B0, 0x58B1, 0x58B2, 0x58B4, 0x58B5,
+ 0x58B6, 0x58B7, 0x58B8, 0x58B9, 0x58BA, 0x58BD, 0x58BF, 0x58C0,
+ 0x58C2, 0x58C3, 0x58C4, 0x58C6, 0x58C8, 0x58C9, 0x58CA, 0x58CB,
+ 0x58CC, 0x58CD, 0x58CE, 0x58CF, 0x58D0, 0x58D2, 0x58D4, 0x58D6,
+ 0x58D7, 0x58DB, 0x58DC, 0x58DD, 0x58E1, 0x58E3, 0x58E5, 0x58E6,
+ 0x58E7, 0x58E8, 0x58EA, 0x58ED, 0x58F1, 0x58F2, 0x58F4, 0x58F5,
+ 0x58F7, 0x58F8, 0x58FB, 0x58FC, 0x58FE, 0x58FF, 0x5900, 0x5901,
+ 0x5903, 0x5905, 0x5906, 0x5908, 0x5909, 0x590A, 0x590B, 0x590C,
+ 0x590E, 0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591B,
+ 0x591D, 0x591E, 0x5920, 0x5921, 0x5923, 0x5926, 0x5928, 0x592C,
+ 0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593B, 0x593D, 0x593F,
+ 0x5940, 0x5943, 0x5945, 0x5946, 0x594A, 0x594C, 0x594D, 0x5950,
+ 0x5952, 0x5953, 0x5959, 0x595B, 0x595C, 0x595D, 0x595E, 0x595F,
+ 0x5961, 0x5963, 0x5964, 0x5966, 0x5967, 0x5968, 0x596B, 0x596D,
+ 0x596F, 0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597A, 0x597B,
+ 0x597C, 0x597E, 0x597F, 0x5980, 0x5985, 0x5989, 0x598B, 0x598C,
+ 0x598E, 0x598F, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599A,
+ 0x599B, 0x599C, 0x599F, 0x59A0, 0x59A1, 0x59A2, 0x59A6, 0x59A7,
+ 0x59AC, 0x59AD, 0x59B0, 0x59B1, 0x59B3, 0x59B4, 0x59B5, 0x59B6,
+ 0x59B7, 0x59B8, 0x59BA, 0x59BC, 0x59BD, 0x59BF, 0x59C0, 0x59C1,
+ 0x59C2, 0x59C3, 0x59C4, 0x59C5, 0x59C7, 0x59C8, 0x59C9, 0x59CC,
+ 0x59CD, 0x59CE, 0x59CF, 0x59D5, 0x59D6, 0x59D9, 0x59DB, 0x59DE,
+ 0x59DF, 0x59E0, 0x59E1, 0x59E2, 0x59E4, 0x59E6, 0x59E7, 0x59E9,
+ 0x59EA, 0x59EB, 0x59ED, 0x59EE, 0x59EF, 0x59F0, 0x59F1, 0x59F2,
+ 0x59F3, 0x59F4, 0x59F5, 0x59F6, 0x59F7, 0x59F8, 0x59FA, 0x59FC,
+ 0x59FD, 0x59FE, 0x5A00, 0x5A02, 0x5A0A, 0x5A0B, 0x5A0D, 0x5A0E,
+ 0x5A0F, 0x5A10, 0x5A12, 0x5A14, 0x5A15, 0x5A16, 0x5A17, 0x5A19,
+ 0x5A1A, 0x5A1B, 0x5A1D, 0x5A1E, 0x5A21, 0x5A22, 0x5A24, 0x5A26,
+ 0x5A27, 0x5A28, 0x5A2A, 0x5A2B, 0x5A2C, 0x5A2D, 0x5A2E, 0x5A2F,
+ 0x5A30, 0x5A33, 0x5A35, 0x5A37, 0x5A38, 0x5A39, 0x5A3A, 0x5A3B,
+ 0x5A3D, 0x5A3E, 0x5A3F, 0x5A42, 0x5A43, 0x5A44, 0x5A45, 0x5A47,
+ 0x5A48, 0x5A4B, 0x5A4C, 0x5A4D, 0x5A4E, 0x5A4F, 0x5A50, 0x5A51,
+ 0x5A52, 0x5A53, 0x5A54, 0x5A56, 0x5A57, 0x5A58, 0x5A59, 0x5A5B,
+ 0x5A5C, 0x5A5D, 0x5A5E, 0x5A5F, 0x5A60, 0x5A61, 0x5A63, 0x5A64,
+ 0x5A65, 0x5A68, 0x5A69, 0x5A6B, 0x5A6C, 0x5A6E, 0x5A6F, 0x5A70,
+ 0x5A71, 0x5A72, 0x5A73, 0x5A78, 0x5A79, 0x5A7B, 0x5A7C, 0x5A7D,
+ 0x5A7E, 0x5A80, 0x5A81, 0x5A82, 0x5A83, 0x5A84, 0x5A85, 0x5A86,
+ 0x5A87, 0x5A88, 0x5A89, 0x5A8A, 0x5A8B, 0x5A8C, 0x5A8D, 0x5A8E,
+ 0x5A8F, 0x5A90, 0x5A91, 0x5A93, 0x5A94, 0x5A95, 0x5A96, 0x5A97,
+ 0x5A98, 0x5A99, 0x5A9C, 0x5A9D, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA1,
+ 0x5AA2, 0x5AA3, 0x5AA4, 0x5AA5, 0x5AA6, 0x5AA8, 0x5AA9, 0x5AAB,
+ 0x5AAC, 0x5AAD, 0x5AAE, 0x5AAF, 0x5AB0, 0x5AB1, 0x5AB4, 0x5AB6,
+ 0x5AB7, 0x5AB9, 0x5ABA, 0x5ABB, 0x5ABC, 0x5ABF, 0x5AC0, 0x5AC3,
+ 0x5AC4, 0x5AC5, 0x5AC6, 0x5AC7, 0x5AC8, 0x5ACA, 0x5ACB, 0x5ACD,
+ 0x5ACE, 0x5ACF, 0x5AD0, 0x5AD1, 0x5AD3, 0x5AD5, 0x5AD9, 0x5ADA,
+ 0x5ADB, 0x5ADD, 0x5ADE, 0x5ADF, 0x5AE2, 0x5AE4, 0x5AE5, 0x5AE7,
+ 0x5AE8, 0x5AEA, 0x5AEC, 0x5AED, 0x5AEE, 0x5AEF, 0x5AF0, 0x5AF2,
+ 0x5AF3, 0x5AF4, 0x5AF6, 0x5AF7, 0x5AF8, 0x5AF9, 0x5AFA, 0x5AFC,
+ 0x5AFD, 0x5AFE, 0x5AFF, 0x5B01, 0x5B02, 0x5B03, 0x5B04, 0x5B05,
+ 0x5B06, 0x5B07, 0x5B0A, 0x5B0D, 0x5B0E, 0x5B0F, 0x5B10, 0x5B11,
+ 0x5B12, 0x5B13, 0x5B14, 0x5B15, 0x5B18, 0x5B1A, 0x5B1B, 0x5B1C,
+ 0x5B1D, 0x5B1E, 0x5B1F, 0x5B20, 0x5B22, 0x5B23, 0x5B24, 0x5B25,
+ 0x5B26, 0x5B27, 0x5B28, 0x5B29, 0x5B2B, 0x5B2C, 0x5B2D, 0x5B2E,
+ 0x5B2F, 0x5B31, 0x5B33, 0x5B35, 0x5B36, 0x5B39, 0x5B3A, 0x5B3B,
+ 0x5B3C, 0x5B3D, 0x5B3E, 0x5B3F, 0x5B41, 0x5B42, 0x5B43, 0x5B44,
+ 0x5B45, 0x5B46, 0x5B47, 0x5B48, 0x5B49, 0x5B4A, 0x5B4B, 0x5B4D,
+ 0x5B4E, 0x5B4F, 0x5B52, 0x5B56, 0x5B5E, 0x5B60, 0x5B61, 0x5B67,
+ 0x5B68, 0x5B6D, 0x5B6E, 0x5B6F, 0x5B72, 0x5B74, 0x5B76, 0x5B77,
+ 0x5B79, 0x5B7B, 0x5B7C, 0x5B7E, 0x5B82, 0x5B86, 0x5B8A, 0x5B8D,
+ 0x5B8E, 0x5B90, 0x5B91, 0x5B92, 0x5B94, 0x5B96, 0x5B9F, 0x5BA7,
+ 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAE, 0x5BAF, 0x5BB1, 0x5BB2,
+ 0x5BB7, 0x5BBA, 0x5BBB, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BC3, 0x5BC8,
+ 0x5BC9, 0x5BCA, 0x5BCB, 0x5BCD, 0x5BCE, 0x5BCF, 0x5BD1, 0x5BD4,
+ 0x5BD5, 0x5BD6, 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BDB, 0x5BDC,
+ 0x5BE0, 0x5BE3, 0x5BEA, 0x5BED, 0x5BEF, 0x5BF1, 0x5BF2, 0x5BF3,
+ 0x5BF4, 0x5BF7, 0x5BFD, 0x5BFE, 0x5C00, 0x5C02, 0x5C03, 0x5C05,
+ 0x5C0C, 0x5C10, 0x5C12, 0x5C13, 0x5C17, 0x5C19, 0x5C1B, 0x5C1E,
+ 0x5C1F, 0x5C20, 0x5C21, 0x5C23, 0x5C26, 0x5C28, 0x5C29, 0x5C2A,
+ 0x5C2B, 0x5C2D, 0x5C2E, 0x5C2F, 0x5C30, 0x5C32, 0x5C33, 0x5C35,
+ 0x5C36, 0x5C43, 0x5C44, 0x5C46, 0x5C47, 0x5C4C, 0x5C4D, 0x5C52,
+ 0x5C53, 0x5C54, 0x5C56, 0x5C57, 0x5C58, 0x5C5A, 0x5C5B, 0x5C5C,
+ 0x5C5D, 0x5C5F, 0x5C67, 0x5C69, 0x5C6A, 0x5C6B, 0x5C6D, 0x5C70,
+ 0x5C72, 0x5C73, 0x5C74, 0x5C75, 0x5C76, 0x5C77, 0x5C78, 0x5C7B,
+ 0x5C7C, 0x5C7D, 0x5C7E, 0x5C80, 0x5C83, 0x5C84, 0x5C85, 0x5C86,
+ 0x5C87, 0x5C89, 0x5C8A, 0x5C8B, 0x5C8E, 0x5C8F, 0x5C92, 0x5C93,
+ 0x5C95, 0x5C9D, 0x5C9E, 0x5C9F, 0x5CA0, 0x5CA4, 0x5CA5, 0x5CA6,
+ 0x5CA7, 0x5CA8, 0x5CAA, 0x5CAE, 0x5CAF, 0x5CB0, 0x5CB2, 0x5CB4,
+ 0x5CB6, 0x5CB9, 0x5CBA, 0x5CBB, 0x5CBC, 0x5CBE, 0x5CC0, 0x5CC2,
+ 0x5CC3, 0x5CC5, 0x5CC6, 0x5CC7, 0x5CC8, 0x5CC9, 0x5CCA, 0x5CCC,
+ 0x5CCD, 0x5CCE, 0x5CCF, 0x5CD0, 0x5CD1, 0x5CD3, 0x5CD4, 0x5CD5,
+ 0x5CD6, 0x5CD7, 0x5CD8, 0x5CDA, 0x5CDB, 0x5CDC, 0x5CDD, 0x5CDE,
+ 0x5CDF, 0x5CE0, 0x5CE2, 0x5CE3, 0x5CE7, 0x5CE9, 0x5CEB, 0x5CEC,
+ 0x5CEE, 0x5CEF, 0x5CF1, 0x5CF2, 0x5CF3, 0x5CF5, 0x5CF7, 0x5CF8,
+ 0x5CF9, 0x5CFA, 0x5CFC, 0x5CFE, 0x5CFF, 0x5D00, 0x5D01, 0x5D04,
+ 0x5D05, 0x5D08, 0x5D09, 0x5D0A, 0x5D0B, 0x5D0C, 0x5D0F, 0x5D10,
+ 0x5D11, 0x5D12, 0x5D13, 0x5D15, 0x5D18, 0x5D19, 0x5D1A, 0x5D1C,
+ 0x5D1D, 0x5D1F, 0x5D20, 0x5D21, 0x5D22, 0x5D23, 0x5D25, 0x5D28,
+ 0x5D2A, 0x5D2B, 0x5D2F, 0x5D30, 0x5D31, 0x5D32, 0x5D33, 0x5D35,
+ 0x5D36, 0x5D37, 0x5D38, 0x5D39, 0x5D3A, 0x5D3B, 0x5D3C, 0x5D3F,
+ 0x5D40, 0x5D41, 0x5D42, 0x5D43, 0x5D44, 0x5D45, 0x5D46, 0x5D48,
+ 0x5D49, 0x5D4D, 0x5D4E, 0x5D4F, 0x5D51, 0x5D52, 0x5D53, 0x5D54,
+ 0x5D55, 0x5D56, 0x5D57, 0x5D59, 0x5D5A, 0x5D5C, 0x5D5E, 0x5D5F,
+ 0x5D60, 0x5D61, 0x5D62, 0x5D63, 0x5D64, 0x5D65, 0x5D66, 0x5D67,
+ 0x5D68, 0x5D6A, 0x5D6D, 0x5D6E, 0x5D70, 0x5D71, 0x5D72, 0x5D73,
+ 0x5D75, 0x5D76, 0x5D77, 0x5D78, 0x5D79, 0x5D7A, 0x5D7B, 0x5D7C,
+ 0x5D7D, 0x5D7E, 0x5D7F, 0x5D80, 0x5D83, 0x5D85, 0x5D86, 0x5D88,
+ 0x5D89, 0x5D8A, 0x5D8B, 0x5D8C, 0x5D8D, 0x5D8E, 0x5D8F, 0x5D90,
+ 0x5D91, 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D96, 0x5D98, 0x5D9A,
+ 0x5D9B, 0x5D9C, 0x5D9E, 0x5D9F, 0x5DA1, 0x5DA2, 0x5DA3, 0x5DA4,
+ 0x5DA5, 0x5DA6, 0x5DA8, 0x5DA9, 0x5DAA, 0x5DAB, 0x5DAC, 0x5DAD,
+ 0x5DAE, 0x5DAF, 0x5DB0, 0x5DB1, 0x5DB2, 0x5DB3, 0x5DB4, 0x5DB5,
+ 0x5DB6, 0x5DB9, 0x5DBB, 0x5DBD, 0x5DBE, 0x5DBF, 0x5DC0, 0x5DC1,
+ 0x5DC2, 0x5DC3, 0x5DC4, 0x5DC6, 0x5DC7, 0x5DC8, 0x5DC9, 0x5DCA,
+ 0x5DCC, 0x5DCE, 0x5DCF, 0x5DD0, 0x5DD1, 0x5DD3, 0x5DD5, 0x5DD6,
+ 0x5DD7, 0x5DD8, 0x5DD9, 0x5DDA, 0x5DDC, 0x5DDF, 0x5DE0, 0x5DE3,
+ 0x5DE4, 0x5DEA, 0x5DEC, 0x5DED, 0x5DF5, 0x5DF6, 0x5DF8, 0x5DF9,
+ 0x5DFA, 0x5DFB, 0x5DFC, 0x5DFF, 0x5E00, 0x5E04, 0x5E07, 0x5E09,
+ 0x5E0A, 0x5E0B, 0x5E0D, 0x5E0E, 0x5E12, 0x5E13, 0x5E17, 0x5E1E,
+ 0x5E1F, 0x5E20, 0x5E21, 0x5E22, 0x5E23, 0x5E24, 0x5E28, 0x5E29,
+ 0x5E2A, 0x5E2C, 0x5E2F, 0x5E30, 0x5E32, 0x5E34, 0x5E35, 0x5E39,
+ 0x5E3A, 0x5E3E, 0x5E3F, 0x5E41, 0x5E46, 0x5E47, 0x5E48, 0x5E49,
+ 0x5E4A, 0x5E4B, 0x5E4D, 0x5E4E, 0x5E4F, 0x5E50, 0x5E51, 0x5E52,
+ 0x5E53, 0x5E56, 0x5E59, 0x5E5A, 0x5E5C, 0x5E5D, 0x5E60, 0x5E64,
+ 0x5E65, 0x5E66, 0x5E67, 0x5E68, 0x5E69, 0x5E6A, 0x5E6D, 0x5E6E,
+ 0x5E6F, 0x5E70, 0x5E71, 0x5E75, 0x5E77, 0x5E81, 0x5E82, 0x5E83,
+ 0x5E85, 0x5E88, 0x5E89, 0x5E8C, 0x5E8D, 0x5E8E, 0x5E92, 0x5E98,
+ 0x5E9B, 0x5E9D, 0x5EA1, 0x5EA2, 0x5EA3, 0x5EA4, 0x5EA8, 0x5EA9,
+ 0x5EAA, 0x5EAC, 0x5EAE, 0x5EAF, 0x5EB0, 0x5EB1, 0x5EB2, 0x5EB4,
+ 0x5EBA, 0x5EBB, 0x5EBC, 0x5EBD, 0x5EBF, 0x5EC0, 0x5EC1, 0x5EC2,
+ 0x5EC3, 0x5EC4, 0x5EC5, 0x5EC6, 0x5EC7, 0x5EC8, 0x5ECB, 0x5ECC,
+ 0x5ECD, 0x5ECE, 0x5ECF, 0x5ED0, 0x5ED4, 0x5ED5, 0x5ED7, 0x5ED8,
+ 0x5ED9, 0x5EDA, 0x5EDC, 0x5EDD, 0x5EDE, 0x5EE4, 0x5EE5, 0x5EE6,
+ 0x5EE7, 0x5EE9, 0x5EEB, 0x5EED, 0x5EEE, 0x5EEF, 0x5EF0, 0x5EF1,
+ 0x5EF2, 0x5EF5, 0x5EF8, 0x5EF9, 0x5EFB, 0x5EFC, 0x5EFD, 0x5F05,
+ 0x5F06, 0x5F07, 0x5F09, 0x5F0C, 0x5F0D, 0x5F0E, 0x5F10, 0x5F12,
+ 0x5F14, 0x5F16, 0x5F19, 0x5F1A, 0x5F1C, 0x5F1D, 0x5F1E, 0x5F21,
+ 0x5F22, 0x5F23, 0x5F24, 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30,
+ 0x5F32, 0x5F34, 0x5F36, 0x5F37, 0x5F38, 0x5F3B, 0x5F3D, 0x5F3E,
+ 0x5F3F, 0x5F41, 0x5F42, 0x5F43, 0x5F44, 0x5F45, 0x5F47, 0x5F49,
+ 0x5F4A, 0x5F4B, 0x5F4D, 0x5F4F, 0x5F51, 0x5F54, 0x5F5A, 0x5F5B,
+ 0x5F5C, 0x5F5E, 0x5F5F, 0x5F60, 0x5F63, 0x5F65, 0x5F67, 0x5F68,
+ 0x5F6B, 0x5F6E, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F76, 0x5F78,
+ 0x5F7A, 0x5F7D, 0x5F7E, 0x5F7F, 0x5F83, 0x5F86, 0x5F8D, 0x5F8E,
+ 0x5F8F, 0x5F93, 0x5F94, 0x5F96, 0x5F9A, 0x5F9B, 0x5F9D, 0x5F9F,
+ 0x5FA2, 0x5FA3, 0x5FA4, 0x5FA5, 0x5FA6, 0x5FA7, 0x5FAB, 0x5FAC,
+ 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB2, 0x5FB3, 0x5FB4, 0x5FB6, 0x5FB8,
+ 0x5FBA, 0x5FBB, 0x5FBE, 0x5FBF, 0x5FC0, 0x5FC1, 0x5FC2, 0x5FC7,
+ 0x5FC8, 0x5FCA, 0x5FCB, 0x5FCE, 0x5FD3, 0x5FD4, 0x5FD5, 0x5FDA,
+ 0x5FDB, 0x5FDC, 0x5FDE, 0x5FDF, 0x5FE2, 0x5FE3, 0x5FE5, 0x5FE6,
+ 0x5FE8, 0x5FE9, 0x5FEC, 0x5FEF, 0x5FF0, 0x5FF2, 0x5FF3, 0x5FF4,
+ 0x5FF6, 0x5FF7, 0x5FF9, 0x5FFA, 0x5FFC, 0x6007, 0x6008, 0x6009,
+ 0x600B, 0x600C, 0x6010, 0x6011, 0x6013, 0x6017, 0x6018, 0x601A,
+ 0x601E, 0x601F, 0x6022, 0x6023, 0x6024, 0x602C, 0x602D, 0x602E,
+ 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036, 0x6037, 0x6038,
+ 0x6039, 0x603A, 0x603D, 0x603E, 0x6040, 0x6044, 0x6045, 0x6046,
+ 0x6047, 0x6048, 0x6049, 0x604A, 0x604C, 0x604E, 0x604F, 0x6051,
+ 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605B, 0x605C, 0x605E,
+ 0x605F, 0x6060, 0x6061, 0x6065, 0x6066, 0x606E, 0x6071, 0x6072,
+ 0x6074, 0x6075, 0x6077, 0x607E, 0x6080, 0x6081, 0x6082, 0x6085,
+ 0x6086, 0x6087, 0x6088, 0x608A, 0x608B, 0x608E, 0x608F, 0x6090,
+ 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099, 0x609C, 0x609E,
+ 0x60A1, 0x60A2, 0x60A4, 0x60A5, 0x60A7, 0x60A9, 0x60AA, 0x60AE,
+ 0x60B0, 0x60B3, 0x60B7, 0x60B9, 0x60BA, 0x60BD, 0x60BE, 0x60BF,
+ 0x60C0, 0x60C1, 0x60C2, 0x60C3, 0x60C4, 0x60C7, 0x60C8, 0x60C9,
+ 0x60CC, 0x60CD, 0x60CE, 0x60CF, 0x60D0, 0x60D2, 0x60D3, 0x60D4,
+ 0x60D6, 0x60D7, 0x60D9, 0x60DB, 0x60DE, 0x60E2, 0x60E3, 0x60E4,
+ 0x60E5, 0x60EA, 0x60F5, 0x60F7, 0x60F8, 0x60FC, 0x60FD, 0x60FE,
+ 0x60FF, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610A, 0x610B,
+ 0x610C, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117,
+ 0x6118, 0x6119, 0x611D, 0x611E, 0x6121, 0x6122, 0x6125, 0x6128,
+ 0x6129, 0x612A, 0x612C, 0x612D, 0x612E, 0x612F, 0x6130, 0x6131,
+ 0x6132, 0x6133, 0x6135, 0x6136, 0x6138, 0x6139, 0x613A, 0x613B,
+ 0x613C, 0x613D, 0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145,
+ 0x6146, 0x6147, 0x6149, 0x614D, 0x614F, 0x6150, 0x6152, 0x6153,
+ 0x6154, 0x6156, 0x6157, 0x6159, 0x615B, 0x615C, 0x615E, 0x6160,
+ 0x6161, 0x6165, 0x6166, 0x6169, 0x616C, 0x616D, 0x616F, 0x6171,
+ 0x6172, 0x6174, 0x6178, 0x6179, 0x617A, 0x617B, 0x617C, 0x617D,
+ 0x617E, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x6185, 0x6186,
+ 0x6187, 0x6188, 0x6189, 0x618C, 0x618D, 0x618F, 0x6193, 0x6195,
+ 0x6196, 0x6197, 0x6198, 0x6199, 0x619B, 0x619C, 0x619E, 0x619F,
+ 0x61A0, 0x61A1, 0x61A2, 0x61A3, 0x61A5, 0x61A6, 0x61AA, 0x61AD,
+ 0x61AF, 0x61B0, 0x61B1, 0x61B3, 0x61B4, 0x61B5, 0x61B8, 0x61B9,
+ 0x61BA, 0x61BB, 0x61BC, 0x61BD, 0x61BF, 0x61C0, 0x61C1, 0x61C3,
+ 0x61C4, 0x61C5, 0x61C6, 0x61CD, 0x61CE, 0x61CF, 0x61D0, 0x61D3,
+ 0x61D5, 0x61D6, 0x61D7, 0x61D8, 0x61D9, 0x61DA, 0x61DB, 0x61DC,
+ 0x61DD, 0x61E0, 0x61E1, 0x61E2, 0x61E4, 0x61E5, 0x61E7, 0x61E9,
+ 0x61EA, 0x61EB, 0x61EC, 0x61ED, 0x61EE, 0x61EF, 0x61F0, 0x61F1,
+ 0x61F3, 0x61F4, 0x61F9, 0x61FB, 0x61FD, 0x6201, 0x6202, 0x6203,
+ 0x6204, 0x6205, 0x6209, 0x6213, 0x6219, 0x621C, 0x621D, 0x621E,
+ 0x6220, 0x6223, 0x6226, 0x6228, 0x6229, 0x622B, 0x622D, 0x622F,
+ 0x6231, 0x6235, 0x6236, 0x6238, 0x6239, 0x623A, 0x623B, 0x623C,
+ 0x6242, 0x6244, 0x6245, 0x6246, 0x624A, 0x624F, 0x6250, 0x6255,
+ 0x6256, 0x6257, 0x6259, 0x625A, 0x625C, 0x625D, 0x625E, 0x625F,
+ 0x6260, 0x6261, 0x6262, 0x6264, 0x6265, 0x6268, 0x6271, 0x6272,
+ 0x6274, 0x6275, 0x6277, 0x6278, 0x627A, 0x627B, 0x627D, 0x6281,
+ 0x6282, 0x6283, 0x6285, 0x6286, 0x6287, 0x6288, 0x628B, 0x628C,
+ 0x628D, 0x628E, 0x628F, 0x6290, 0x6294, 0x6299, 0x629C, 0x629D,
+ 0x629E, 0x62A3, 0x62A6, 0x62A7, 0x62A9, 0x62AA, 0x62AD, 0x62AE,
+ 0x62AF, 0x62B0, 0x62B2, 0x62B3, 0x62B4, 0x62B6, 0x62B7, 0x62B8,
+ 0x62BA, 0x62BE, 0x62C0, 0x62C1, 0x62C3, 0x62CB, 0x62CF, 0x62D1,
+ 0x62D5, 0x62DD, 0x62DE, 0x62E0, 0x62E1, 0x62E4, 0x62EA, 0x62EB,
+ 0x62F0, 0x62F2, 0x62F5, 0x62F8, 0x62F9, 0x62FA, 0x62FB, 0x6300,
+ 0x6303, 0x6304, 0x6305, 0x6306, 0x630A, 0x630B, 0x630C, 0x630D,
+ 0x630F, 0x6310, 0x6312, 0x6313, 0x6314, 0x6315, 0x6317, 0x6318,
+ 0x6319, 0x631C, 0x6326, 0x6327, 0x6329, 0x632C, 0x632D, 0x632E,
+ 0x6330, 0x6331, 0x6333, 0x6334, 0x6335, 0x6336, 0x6337, 0x6338,
+ 0x633B, 0x633C, 0x633F, 0x6340, 0x6341, 0x6344, 0x6347, 0x6348,
+ 0x634A, 0x6351, 0x6352, 0x6353, 0x6354, 0x6356, 0x6357, 0x6358,
+ 0x6359, 0x635A, 0x635B, 0x635C, 0x635D, 0x6360, 0x6364, 0x6365,
+ 0x6366, 0x636A, 0x636C, 0x636F, 0x6370, 0x6373, 0x6374, 0x6375,
+ 0x6378, 0x6379, 0x637C, 0x637D, 0x637E, 0x637F, 0x6381, 0x6385,
+ 0x6386, 0x638B, 0x638D, 0x6391, 0x6393, 0x6394, 0x6395, 0x6397,
+ 0x6399, 0x639A, 0x639B, 0x639C, 0x639D, 0x639E, 0x639F, 0x63A1,
+ 0x63A4, 0x63A6, 0x63AB, 0x63AF, 0x63B1, 0x63B2, 0x63B5, 0x63B6,
+ 0x63B9, 0x63BB, 0x63BD, 0x63BF, 0x63C1, 0x63C2, 0x63C3, 0x63C5,
+ 0x63C7, 0x63C8, 0x63CA, 0x63CB, 0x63CC, 0x63D1, 0x63D3, 0x63D4,
+ 0x63D5, 0x63D7, 0x63D8, 0x63D9, 0x63DB, 0x63DC, 0x63DD, 0x63DF,
+ 0x63E2, 0x63E4, 0x63E5, 0x63E6, 0x63E7, 0x63E8, 0x63EB, 0x63EC,
+ 0x63EF, 0x63F0, 0x63F1, 0x63F3, 0x63F5, 0x63F7, 0x63F9, 0x63FA,
+ 0x63FB, 0x63FC, 0x63FE, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408,
+ 0x6409, 0x640A, 0x640E, 0x6411, 0x6412, 0x6415, 0x6416, 0x6418,
+ 0x6419, 0x641A, 0x641D, 0x641F, 0x6422, 0x6423, 0x6424, 0x6425,
+ 0x6427, 0x6428, 0x6429, 0x642B, 0x642E, 0x642F, 0x6430, 0x6431,
+ 0x6432, 0x6433, 0x6435, 0x6437, 0x6438, 0x6439, 0x643B, 0x643C,
+ 0x643E, 0x6440, 0x6442, 0x6443, 0x6449, 0x644B, 0x644C, 0x644D,
+ 0x644E, 0x644F, 0x6450, 0x6453, 0x6455, 0x6456, 0x6457, 0x6459,
+ 0x645A, 0x645B, 0x645D, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464,
+ 0x6465, 0x6466, 0x6468, 0x646A, 0x646B, 0x646C, 0x646E, 0x6470,
+ 0x6471, 0x6472, 0x6474, 0x6475, 0x6477, 0x647C, 0x647D, 0x647E,
+ 0x647F, 0x6480, 0x6481, 0x6483, 0x6486, 0x6489, 0x648A, 0x648B,
+ 0x648C, 0x648D, 0x648E, 0x648F, 0x6490, 0x6494, 0x6497, 0x6498,
+ 0x649A, 0x649B, 0x649C, 0x649D, 0x64A0, 0x64A1, 0x64A2, 0x64A6,
+ 0x64A7, 0x64A8, 0x64AA, 0x64AF, 0x64B1, 0x64B4, 0x64B6, 0x64B9,
+ 0x64BD, 0x64C3, 0x64C6, 0x64C8, 0x64C9, 0x64CC, 0x64CF, 0x64D1,
+ 0x64D3, 0x64D5, 0x64D6, 0x64D9, 0x64DB, 0x64DC, 0x64DD, 0x64DF,
+ 0x64E1, 0x64E3, 0x64E5, 0x64E7, 0x64E8, 0x64E9, 0x64EA, 0x64EB,
+ 0x64ED, 0x64EE, 0x64F3, 0x64F5, 0x64F6, 0x64F8, 0x64F9, 0x64FD,
+ 0x64FF, 0x6501, 0x6502, 0x6503, 0x6505, 0x6507, 0x6508, 0x650A,
+ 0x650B, 0x650C, 0x650D, 0x650E, 0x6510, 0x6511, 0x6513, 0x6515,
+ 0x6517, 0x651A, 0x651C, 0x651E, 0x651F, 0x6520, 0x6521, 0x6526,
+ 0x6527, 0x6528, 0x6529, 0x652D, 0x6530, 0x6531, 0x6532, 0x6533,
+ 0x6537, 0x653A, 0x653C, 0x653D, 0x6540, 0x6541, 0x6542, 0x6543,
+ 0x6544, 0x6546, 0x6547, 0x654A, 0x654B, 0x654D, 0x654E, 0x6550,
+ 0x6552, 0x6553, 0x6554, 0x6558, 0x655A, 0x655C, 0x655F, 0x6560,
+ 0x6561, 0x6564, 0x6565, 0x6567, 0x6568, 0x6569, 0x656A, 0x656D,
+ 0x656E, 0x656F, 0x6571, 0x6573, 0x6576, 0x6579, 0x657A, 0x657B,
+ 0x657C, 0x657D, 0x657E, 0x657F, 0x6580, 0x6581, 0x6584, 0x6585,
+ 0x6586, 0x6588, 0x6589, 0x658A, 0x658D, 0x658E, 0x658F, 0x6592,
+ 0x6594, 0x6596, 0x6598, 0x659A, 0x659D, 0x659E, 0x65A0, 0x65A2,
+ 0x65A3, 0x65A6, 0x65A8, 0x65AA, 0x65AE, 0x65B1, 0x65B2, 0x65B3,
+ 0x65B4, 0x65B5, 0x65B6, 0x65B8, 0x65BA, 0x65BB, 0x65BE, 0x65BF,
+ 0x65C0, 0x65C2, 0x65C7, 0x65C8, 0x65C9, 0x65CA, 0x65CD, 0x65D0,
+ 0x65D1, 0x65D3, 0x65D4, 0x65D5, 0x65D8, 0x65D9, 0x65DA, 0x65DB,
+ 0x65DC, 0x65DD, 0x65DE, 0x65DF, 0x65E1, 0x65E3, 0x65E4, 0x65EA,
+ 0x65EB, 0x65F2, 0x65F3, 0x65F4, 0x65F5, 0x65F8, 0x65F9, 0x65FB,
+ 0x65FC, 0x65FD, 0x65FE, 0x65FF, 0x6601, 0x6604, 0x6605, 0x6607,
+ 0x6608, 0x6609, 0x660B, 0x660D, 0x6610, 0x6611, 0x6612, 0x6616,
+ 0x6617, 0x6618, 0x661A, 0x661B, 0x661C, 0x661E, 0x6621, 0x6622,
+ 0x6623, 0x6624, 0x6626, 0x6629, 0x662A, 0x662B, 0x662C, 0x662E,
+ 0x6630, 0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663A, 0x663B,
+ 0x663D, 0x663F, 0x6640, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648,
+ 0x6649, 0x664A, 0x664D, 0x664E, 0x6650, 0x6651, 0x6658, 0x6659,
+ 0x665B, 0x665C, 0x665E, 0x6660, 0x6662, 0x6663, 0x6665, 0x6667,
+ 0x6669, 0x666A, 0x666B, 0x666C, 0x666D, 0x6671, 0x6672, 0x6673,
+ 0x6675, 0x6678, 0x6679, 0x667B, 0x667C, 0x667D, 0x667F, 0x6680,
+ 0x6681, 0x6683, 0x6685, 0x6686, 0x668A, 0x668B, 0x668D, 0x668E,
+ 0x668F, 0x6690, 0x6692, 0x6693, 0x6694, 0x6695, 0x6698, 0x6699,
+ 0x669A, 0x669B, 0x669C, 0x669E, 0x669F, 0x66A0, 0x66A1, 0x66A3,
+ 0x66A4, 0x66A5, 0x66A6, 0x66A9, 0x66AA, 0x66AC, 0x66AD, 0x66AF,
+ 0x66B0, 0x66B1, 0x66B2, 0x66B3, 0x66B5, 0x66B6, 0x66B7, 0x66B8,
+ 0x66BA, 0x66BB, 0x66BC, 0x66BD, 0x66BF, 0x66C0, 0x66C1, 0x66C2,
+ 0x66C3, 0x66C5, 0x66C8, 0x66CA, 0x66CB, 0x66CC, 0x66CD, 0x66CE,
+ 0x66CF, 0x66D0, 0x66D1, 0x66D2, 0x66D3, 0x66D4, 0x66D5, 0x66D7,
+ 0x66D8, 0x66DA, 0x66DE, 0x66DF, 0x66E1, 0x66E2, 0x66E3, 0x66E4,
+ 0x66E5, 0x66E7, 0x66E8, 0x66EA, 0x66EB, 0x66ED, 0x66EE, 0x66EF,
+ 0x66F1, 0x66F5, 0x66F6, 0x66FA, 0x66FB, 0x66FD, 0x6701, 0x6702,
+ 0x6704, 0x6705, 0x6706, 0x6707, 0x670C, 0x670E, 0x670F, 0x6711,
+ 0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671A, 0x671C, 0x671E,
+ 0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6729, 0x672E,
+ 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739, 0x673B,
+ 0x673C, 0x673E, 0x673F, 0x6741, 0x6744, 0x6745, 0x6747, 0x674A,
+ 0x674B, 0x674D, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758, 0x6759,
+ 0x675A, 0x675B, 0x675D, 0x6762, 0x6763, 0x6764, 0x6766, 0x6767,
+ 0x676B, 0x676C, 0x676E, 0x6774, 0x6776, 0x6778, 0x6779, 0x677A,
+ 0x677B, 0x677D, 0x6780, 0x6782, 0x6783, 0x6785, 0x6786, 0x6788,
+ 0x678A, 0x678C, 0x678D, 0x678E, 0x678F, 0x6791, 0x6792, 0x6793,
+ 0x6794, 0x6796, 0x6799, 0x679B, 0x679F, 0x67A0, 0x67A1, 0x67A4,
+ 0x67A6, 0x67A9, 0x67AC, 0x67AE, 0x67B1, 0x67B2, 0x67B4, 0x67B9,
+ 0x67BA, 0x67BB, 0x67BC, 0x67BD, 0x67BE, 0x67BF, 0x67C0, 0x67C2,
+ 0x67C5, 0x67C6, 0x67C7, 0x67C8, 0x67C9, 0x67CA, 0x67CB, 0x67CC,
+ 0x67CD, 0x67CE, 0x67D5, 0x67D6, 0x67D7, 0x67DB, 0x67DF, 0x67E1,
+ 0x67E3, 0x67E4, 0x67E6, 0x67E7, 0x67E8, 0x67EA, 0x67EB, 0x67ED,
+ 0x67EE, 0x67F2, 0x67F5, 0x67F6, 0x67F7, 0x67F8, 0x67F9, 0x67FA,
+ 0x67FB, 0x67FC, 0x67FE, 0x6801, 0x6802, 0x6803, 0x6804, 0x6806,
+ 0x680D, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818, 0x6819, 0x681A,
+ 0x681B, 0x681C, 0x681E, 0x681F, 0x6820, 0x6822, 0x6823, 0x6824,
+ 0x6825, 0x6826, 0x6827, 0x6828, 0x682B, 0x682C, 0x682D, 0x682E,
+ 0x682F, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836, 0x683A, 0x683B,
+ 0x683F, 0x6847, 0x684B, 0x684D, 0x684F, 0x6852, 0x6856, 0x6857,
+ 0x6858, 0x6859, 0x685A, 0x685B, 0x685C, 0x685D, 0x685E, 0x685F,
+ 0x686A, 0x686C, 0x686D, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872,
+ 0x6873, 0x6875, 0x6878, 0x6879, 0x687A, 0x687B, 0x687C, 0x687D,
+ 0x687E, 0x687F, 0x6880, 0x6882, 0x6884, 0x6887, 0x6888, 0x6889,
+ 0x688A, 0x688B, 0x688C, 0x688D, 0x688E, 0x6890, 0x6891, 0x6892,
+ 0x6894, 0x6895, 0x6896, 0x6899, 0x689A, 0x689B, 0x689C, 0x689E,
+ 0x68A0, 0x68A1, 0x68A3, 0x68A4, 0x68A5, 0x68A9, 0x68AA, 0x68AB,
+ 0x68AC, 0x68AE, 0x68B1, 0x68B2, 0x68B4, 0x68B6, 0x68B7, 0x68B8,
+ 0x68B9, 0x68BA, 0x68BB, 0x68BC, 0x68BD, 0x68BE, 0x68BF, 0x68C1,
+ 0x68C3, 0x68C4, 0x68C5, 0x68C6, 0x68C7, 0x68C8, 0x68CA, 0x68CC,
+ 0x68CE, 0x68CF, 0x68D0, 0x68D1, 0x68D3, 0x68D4, 0x68D9, 0x68DB,
+ 0x68DC, 0x68DD, 0x68DE, 0x68E1, 0x68E2, 0x68E4, 0x68E5, 0x68E6,
+ 0x68E8, 0x68E9, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68EF, 0x68F2,
+ 0x68F3, 0x68F4, 0x68F6, 0x68F7, 0x68F8, 0x68FB, 0x68FD, 0x68FE,
+ 0x68FF, 0x6900, 0x6902, 0x6903, 0x6904, 0x6906, 0x6907, 0x6908,
+ 0x6909, 0x690A, 0x690C, 0x6911, 0x6913, 0x6914, 0x6915, 0x6916,
+ 0x6917, 0x6918, 0x6919, 0x691A, 0x691B, 0x691C, 0x691D, 0x691E,
+ 0x6921, 0x6922, 0x6923, 0x6925, 0x6926, 0x6927, 0x6928, 0x6929,
+ 0x692A, 0x692B, 0x692C, 0x692E, 0x692F, 0x6931, 0x6932, 0x6933,
+ 0x6935, 0x6936, 0x6937, 0x6938, 0x693A, 0x693B, 0x693C, 0x693E,
+ 0x6940, 0x6941, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948,
+ 0x6949, 0x694B, 0x694C, 0x694D, 0x694E, 0x694F, 0x6950, 0x6951,
+ 0x6952, 0x6955, 0x6956, 0x6958, 0x6959, 0x695B, 0x695C, 0x695F,
+ 0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6969, 0x696A, 0x696C,
+ 0x696F, 0x6970, 0x6972, 0x6973, 0x6974, 0x6976, 0x697A, 0x697B,
+ 0x697D, 0x697E, 0x697F, 0x6981, 0x6983, 0x6985, 0x698A, 0x698B,
+ 0x698C, 0x698E, 0x698F, 0x6990, 0x6991, 0x6992, 0x6993, 0x6996,
+ 0x6997, 0x6999, 0x699A, 0x699D, 0x699E, 0x699F, 0x69A0, 0x69A1,
+ 0x69A2, 0x69A3, 0x69A4, 0x69A5, 0x69A6, 0x69A9, 0x69AC, 0x69AF,
+ 0x69B0, 0x69B2, 0x69B3, 0x69B5, 0x69B6, 0x69B8, 0x69B9, 0x69BA,
+ 0x69BC, 0x69BD, 0x69BE, 0x69C0, 0x69C2, 0x69C3, 0x69C4, 0x69C5,
+ 0x69C6, 0x69C7, 0x69C8, 0x69C9, 0x69CF, 0x69D1, 0x69D2, 0x69D3,
+ 0x69D5, 0x69D6, 0x69D7, 0x69D8, 0x69D9, 0x69DA, 0x69DC, 0x69DD,
+ 0x69DE, 0x69E1, 0x69E2, 0x69E3, 0x69E4, 0x69E5, 0x69E6, 0x69E8,
+ 0x69E9, 0x69EA, 0x69EB, 0x69EC, 0x69EE, 0x69EF, 0x69F0, 0x69F1,
+ 0x69F4, 0x69F5, 0x69F6, 0x69F7, 0x69F8, 0x69F9, 0x69FA, 0x69FB,
+ 0x69FC, 0x69FE, 0x6A00, 0x6A03, 0x6A04, 0x6A06, 0x6A07, 0x6A08,
+ 0x6A09, 0x6A0B, 0x6A0C, 0x6A0D, 0x6A0E, 0x6A0F, 0x6A10, 0x6A11,
+ 0x6A12, 0x6A14, 0x6A15, 0x6A16, 0x6A1A, 0x6A1B, 0x6A1C, 0x6A1D,
+ 0x6A20, 0x6A22, 0x6A24, 0x6A25, 0x6A26, 0x6A27, 0x6A29, 0x6A2B,
+ 0x6A2C, 0x6A2D, 0x6A2E, 0x6A30, 0x6A32, 0x6A33, 0x6A34, 0x6A36,
+ 0x6A37, 0x6A3B, 0x6A3C, 0x6A3F, 0x6A40, 0x6A41, 0x6A42, 0x6A43,
+ 0x6A45, 0x6A46, 0x6A49, 0x6A4A, 0x6A4C, 0x6A4D, 0x6A4E, 0x6A4F,
+ 0x6A51, 0x6A52, 0x6A53, 0x6A54, 0x6A55, 0x6A56, 0x6A57, 0x6A5A,
+ 0x6A5C, 0x6A5D, 0x6A5E, 0x6A60, 0x6A63, 0x6A64, 0x6A66, 0x6A67,
+ 0x6A68, 0x6A69, 0x6A6A, 0x6A6B, 0x6A6C, 0x6A6D, 0x6A6E, 0x6A6F,
+ 0x6A70, 0x6A72, 0x6A73, 0x6A74, 0x6A75, 0x6A76, 0x6A77, 0x6A78,
+ 0x6A7A, 0x6A7B, 0x6A7D, 0x6A7E, 0x6A7F, 0x6A81, 0x6A82, 0x6A83,
+ 0x6A85, 0x6A86, 0x6A87, 0x6A88, 0x6A8A, 0x6A8B, 0x6A8C, 0x6A8D,
+ 0x6A8F, 0x6A92, 0x6A93, 0x6A95, 0x6A96, 0x6A98, 0x6A99, 0x6A9A,
+ 0x6A9B, 0x6A9D, 0x6A9E, 0x6A9F, 0x6AA1, 0x6AA4, 0x6AA5, 0x6AA6,
+ 0x6AA7, 0x6AA8, 0x6AAA, 0x6AAD, 0x6AAE, 0x6AB0, 0x6AB1, 0x6AB2,
+ 0x6AB4, 0x6AB5, 0x6AB6, 0x6AB7, 0x6AB9, 0x6ABA, 0x6ABC, 0x6ABD,
+ 0x6ABE, 0x6ABF, 0x6AC0, 0x6AC1, 0x6AC2, 0x6AC4, 0x6AC5, 0x6AC6,
+ 0x6AC7, 0x6AC8, 0x6AC9, 0x6ACA, 0x6ACB, 0x6ACC, 0x6ACD, 0x6ACE,
+ 0x6ACF, 0x6AD0, 0x6AD1, 0x6AD2, 0x6AD4, 0x6AD5, 0x6AD6, 0x6AD7,
+ 0x6AD8, 0x6AD9, 0x6ADC, 0x6AE0, 0x6AE1, 0x6AE2, 0x6AE3, 0x6AE4,
+ 0x6AE5, 0x6AE6, 0x6AE9, 0x6AEB, 0x6AED, 0x6AEE, 0x6AEF, 0x6AF0,
+ 0x6AF1, 0x6AF2, 0x6AF4, 0x6AF5, 0x6AF6, 0x6AF7, 0x6AF9, 0x6AFA,
+ 0x6AFC, 0x6AFD, 0x6AFE, 0x6AFF, 0x6B00, 0x6B01, 0x6B02, 0x6B03,
+ 0x6B05, 0x6B06, 0x6B07, 0x6B08, 0x6B09, 0x6B0B, 0x6B0C, 0x6B0D,
+ 0x6B0E, 0x6B10, 0x6B11, 0x6B13, 0x6B14, 0x6B15, 0x6B17, 0x6B18,
+ 0x6B19, 0x6B1A, 0x6B1B, 0x6B1C, 0x6B1D, 0x6B1F, 0x6B25, 0x6B26,
+ 0x6B28, 0x6B29, 0x6B2A, 0x6B2B, 0x6B2C, 0x6B2D, 0x6B2E, 0x6B2F,
+ 0x6B30, 0x6B31, 0x6B33, 0x6B34, 0x6B35, 0x6B36, 0x6B38, 0x6B3B,
+ 0x6B3C, 0x6B3F, 0x6B40, 0x6B41, 0x6B42, 0x6B44, 0x6B45, 0x6B48,
+ 0x6B4A, 0x6B4B, 0x6B4D, 0x6B4E, 0x6B4F, 0x6B51, 0x6B52, 0x6B53,
+ 0x6B54, 0x6B55, 0x6B56, 0x6B57, 0x6B58, 0x6B5A, 0x6B5B, 0x6B5C,
+ 0x6B5D, 0x6B5E, 0x6B60, 0x6B68, 0x6B69, 0x6B6B, 0x6B6C, 0x6B6D,
+ 0x6B6E, 0x6B6F, 0x6B70, 0x6B71, 0x6B73, 0x6B74, 0x6B75, 0x6B76,
+ 0x6B7A, 0x6B7D, 0x6B7E, 0x6B7F, 0x6B80, 0x6B85, 0x6B88, 0x6B8C,
+ 0x6B8E, 0x6B8F, 0x6B90, 0x6B91, 0x6B94, 0x6B95, 0x6B97, 0x6B99,
+ 0x6B9C, 0x6B9D, 0x6B9F, 0x6BA0, 0x6BA2, 0x6BA3, 0x6BA5, 0x6BA6,
+ 0x6BA7, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BB0, 0x6BB1, 0x6BB6,
+ 0x6BB8, 0x6BB9, 0x6BBC, 0x6BBD, 0x6BBE, 0x6BC0, 0x6BC3, 0x6BC4,
+ 0x6BC7, 0x6BC8, 0x6BC9, 0x6BCA, 0x6BCC, 0x6BCE, 0x6BD0, 0x6BD1,
+ 0x6BD8, 0x6BDA, 0x6BDC, 0x6BDD, 0x6BDE, 0x6BDF, 0x6BE0, 0x6BE2,
+ 0x6BE3, 0x6BE4, 0x6BE5, 0x6BE6, 0x6BE7, 0x6BE8, 0x6BE9, 0x6BEC,
+ 0x6BED, 0x6BEE, 0x6BF0, 0x6BF1, 0x6BF2, 0x6BF4, 0x6BF6, 0x6BF7,
+ 0x6BF8, 0x6BFA, 0x6BFB, 0x6BFC, 0x6BFE, 0x6C00, 0x6C01, 0x6C02,
+ 0x6C03, 0x6C04, 0x6C09, 0x6C0A, 0x6C0B, 0x6C0E, 0x6C12, 0x6C17,
+ 0x6C1C, 0x6C1D, 0x6C1E, 0x6C20, 0x6C25, 0x6C2D, 0x6C31, 0x6C33,
+ 0x6C36, 0x6C37, 0x6C39, 0x6C3A, 0x6C3B, 0x6C3C, 0x6C3E, 0x6C3F,
+ 0x6C43, 0x6C44, 0x6C45, 0x6C48, 0x6C4B, 0x6C4C, 0x6C4D, 0x6C4E,
+ 0x6C4F, 0x6C51, 0x6C52, 0x6C53, 0x6C56, 0x6C58, 0x6C59, 0x6C5A,
+ 0x6C62, 0x6C63, 0x6C65, 0x6C66, 0x6C67, 0x6C6B, 0x6C6C, 0x6C6D,
+ 0x6C6E, 0x6C6F, 0x6C71, 0x6C73, 0x6C75, 0x6C77, 0x6C78, 0x6C7A,
+ 0x6C7B, 0x6C7C, 0x6C7F, 0x6C80, 0x6C84, 0x6C87, 0x6C8A, 0x6C8B,
+ 0x6C8D, 0x6C8E, 0x6C91, 0x6C92, 0x6C95, 0x6C96, 0x6C97, 0x6C98,
+ 0x6C9A, 0x6C9C, 0x6C9D, 0x6C9E, 0x6CA0, 0x6CA2, 0x6CA8, 0x6CAC,
+ 0x6CAF, 0x6CB0, 0x6CB4, 0x6CB5, 0x6CB6, 0x6CB7, 0x6CBA, 0x6CC0,
+ 0x6CC1, 0x6CC2, 0x6CC3, 0x6CC6, 0x6CC7, 0x6CC8, 0x6CCB, 0x6CCD,
+ 0x6CCE, 0x6CCF, 0x6CD1, 0x6CD2, 0x6CD8, 0x6CD9, 0x6CDA, 0x6CDC,
+ 0x6CDD, 0x6CDF, 0x6CE4, 0x6CE6, 0x6CE7, 0x6CE9, 0x6CEC, 0x6CED,
+ 0x6CF2, 0x6CF4, 0x6CF9, 0x6CFF, 0x6D00, 0x6D02, 0x6D03, 0x6D05,
+ 0x6D06, 0x6D08, 0x6D09, 0x6D0A, 0x6D0D, 0x6D0F, 0x6D10, 0x6D11,
+ 0x6D13, 0x6D14, 0x6D15, 0x6D16, 0x6D18, 0x6D1C, 0x6D1D, 0x6D1F,
+ 0x6D20, 0x6D21, 0x6D22, 0x6D23, 0x6D24, 0x6D26, 0x6D28, 0x6D29,
+ 0x6D2C, 0x6D2D, 0x6D2F, 0x6D30, 0x6D34, 0x6D36, 0x6D37, 0x6D38,
+ 0x6D3A, 0x6D3F, 0x6D40, 0x6D42, 0x6D44, 0x6D49, 0x6D4C, 0x6D50,
+ 0x6D55, 0x6D56, 0x6D57, 0x6D58, 0x6D5B, 0x6D5D, 0x6D5F, 0x6D61,
+ 0x6D62, 0x6D64, 0x6D65, 0x6D67, 0x6D68, 0x6D6B, 0x6D6C, 0x6D6D,
+ 0x6D70, 0x6D71, 0x6D72, 0x6D73, 0x6D75, 0x6D76, 0x6D7A, 0x6D7B,
+ 0x6D7D, 0x6D7E, 0x6D7F, 0x6D80, 0x6D81, 0x6D83, 0x6D84, 0x6D86,
+ 0x6D8A, 0x6D8B, 0x6D8D, 0x6D8F, 0x6D90, 0x6D92, 0x6D96, 0x6D97,
+ 0x6D98, 0x6D99, 0x6D9A, 0x6D9C, 0x6DA2, 0x6DA5, 0x6DAC, 0x6DAD,
+ 0x6DB0, 0x6DB1, 0x6DB3, 0x6DB4, 0x6DB6, 0x6DB7, 0x6DB9, 0x6DBA,
+ 0x6DBB, 0x6DBC, 0x6DBD, 0x6DBE, 0x6DC1, 0x6DC2, 0x6DC3, 0x6DC8,
+ 0x6DC9, 0x6DCA, 0x6DCD, 0x6DCE, 0x6DCF, 0x6DD0, 0x6DD2, 0x6DD3,
+ 0x6DD4, 0x6DD5, 0x6DD7, 0x6DDA, 0x6DDB, 0x6DDC, 0x6DDF, 0x6DE2,
+ 0x6DE3, 0x6DE5, 0x6DE7, 0x6DE8, 0x6DE9, 0x6DED, 0x6DEF, 0x6DF0,
+ 0x6DF2, 0x6DF4, 0x6DF8, 0x6DFD, 0x6DFE, 0x6DFF, 0x6E00, 0x6E01,
+ 0x6E02, 0x6E03, 0x6E04, 0x6E06, 0x6E07, 0x6E08, 0x6E09, 0x6E0B,
+ 0x6E0F, 0x6E12, 0x6E13, 0x6E15, 0x6E18, 0x6E19, 0x6E1B, 0x6E1C,
+ 0x6E1E, 0x6E1F, 0x6E22, 0x6E27, 0x6E28, 0x6E2A, 0x6E2E, 0x6E30,
+ 0x6E31, 0x6E33, 0x6E35, 0x6E36, 0x6E37, 0x6E39, 0x6E3B, 0x6E3C,
+ 0x6E3D, 0x6E3F, 0x6E40, 0x6E41, 0x6E42, 0x6E45, 0x6E46, 0x6E47,
+ 0x6E48, 0x6E49, 0x6E4A, 0x6E4B, 0x6E4C, 0x6E4F, 0x6E50, 0x6E51,
+ 0x6E52, 0x6E55, 0x6E57, 0x6E59, 0x6E5A, 0x6E5C, 0x6E5D, 0x6E60,
+ 0x6E61, 0x6E62, 0x6E63, 0x6E64, 0x6E65, 0x6E66, 0x6E67, 0x6E68,
+ 0x6E69, 0x6E6A, 0x6E6C, 0x6E6D, 0x6E70, 0x6E71, 0x6E72, 0x6E73,
+ 0x6E74, 0x6E75, 0x6E76, 0x6E77, 0x6E78, 0x6E79, 0x6E7A, 0x6E7B,
+ 0x6E7C, 0x6E7D, 0x6E80, 0x6E81, 0x6E82, 0x6E84, 0x6E87, 0x6E88,
+ 0x6E8A, 0x6E8B, 0x6E8C, 0x6E8D, 0x6E8E, 0x6E91, 0x6E92, 0x6E93,
+ 0x6E94, 0x6E95, 0x6E97, 0x6E99, 0x6E9A, 0x6E9B, 0x6E9E, 0x6EA0,
+ 0x6EA1, 0x6EA3, 0x6EA4, 0x6EA6, 0x6EA8, 0x6EA9, 0x6EAB, 0x6EAC,
+ 0x6EAD, 0x6EAE, 0x6EB0, 0x6EB3, 0x6EB5, 0x6EB8, 0x6EB9, 0x6EBC,
+ 0x6EBE, 0x6EBF, 0x6EC0, 0x6EC3, 0x6EC6, 0x6EC8, 0x6EC9, 0x6ECA,
+ 0x6ECD, 0x6ED0, 0x6ED2, 0x6ED6, 0x6ED8, 0x6ED9, 0x6EDB, 0x6EDC,
+ 0x6EDD, 0x6EE3, 0x6EE7, 0x6EEA, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF0,
+ 0x6EF1, 0x6EF3, 0x6EF5, 0x6EF6, 0x6EFA, 0x6EFB, 0x6EFC, 0x6EFD,
+ 0x6EFE, 0x6F00, 0x6F03, 0x6F04, 0x6F05, 0x6F07, 0x6F08, 0x6F0A,
+ 0x6F0B, 0x6F0C, 0x6F0D, 0x6F0E, 0x6F10, 0x6F11, 0x6F12, 0x6F16,
+ 0x6F17, 0x6F18, 0x6F19, 0x6F1B, 0x6F1C, 0x6F1D, 0x6F1E, 0x6F1F,
+ 0x6F21, 0x6F25, 0x6F26, 0x6F27, 0x6F28, 0x6F2E, 0x6F30, 0x6F34,
+ 0x6F35, 0x6F37, 0x6F39, 0x6F3A, 0x6F3B, 0x6F3C, 0x6F3D, 0x6F40,
+ 0x6F42, 0x6F43, 0x6F44, 0x6F45, 0x6F48, 0x6F49, 0x6F4A, 0x6F4C,
+ 0x6F4E, 0x6F4F, 0x6F50, 0x6F52, 0x6F53, 0x6F55, 0x6F56, 0x6F57,
+ 0x6F5A, 0x6F5B, 0x6F5D, 0x6F5F, 0x6F60, 0x6F61, 0x6F63, 0x6F65,
+ 0x6F67, 0x6F68, 0x6F69, 0x6F6A, 0x6F6B, 0x6F6C, 0x6F71, 0x6F73,
+ 0x6F75, 0x6F76, 0x6F79, 0x6F7B, 0x6F7D, 0x6F7E, 0x6F81, 0x6F82,
+ 0x6F83, 0x6F85, 0x6F8A, 0x6F8B, 0x6F8F, 0x6F90, 0x6F91, 0x6F92,
+ 0x6F93, 0x6F94, 0x6F95, 0x6F96, 0x6F98, 0x6F99, 0x6F9A, 0x6F9B,
+ 0x6F9D, 0x6F9E, 0x6F9F, 0x6FA2, 0x6FA3, 0x6FA5, 0x6FA6, 0x6FA8,
+ 0x6FAA, 0x6FAB, 0x6FAC, 0x6FAD, 0x6FAF, 0x6FB0, 0x6FB2, 0x6FB4,
+ 0x6FB5, 0x6FB7, 0x6FB8, 0x6FBA, 0x6FBB, 0x6FBC, 0x6FBD, 0x6FBE,
+ 0x6FBF, 0x6FC4, 0x6FC5, 0x6FC6, 0x6FC7, 0x6FC8, 0x6FCA, 0x6FCB,
+ 0x6FCC, 0x6FCD, 0x6FCE, 0x6FCF, 0x6FD0, 0x6FD3, 0x6FD4, 0x6FD6,
+ 0x6FD7, 0x6FD9, 0x6FDA, 0x6FDC, 0x6FDD, 0x6FE2, 0x6FE3, 0x6FE5,
+ 0x6FE6, 0x6FE7, 0x6FE8, 0x6FE9, 0x6FEA, 0x6FEC, 0x6FED, 0x6FF2,
+ 0x6FF3, 0x6FF4, 0x6FF5, 0x6FF6, 0x6FF7, 0x6FF8, 0x6FF9, 0x6FFB,
+ 0x6FFD, 0x6FFF, 0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7007,
+ 0x7008, 0x700A, 0x700C, 0x700D, 0x700E, 0x7010, 0x7012, 0x7013,
+ 0x7014, 0x7016, 0x7017, 0x7019, 0x701C, 0x701E, 0x7021, 0x7022,
+ 0x7024, 0x7025, 0x7026, 0x7029, 0x702A, 0x702B, 0x702C, 0x702D,
+ 0x702E, 0x702F, 0x7031, 0x7033, 0x7034, 0x7036, 0x7037, 0x7038,
+ 0x703A, 0x703B, 0x703C, 0x703D, 0x703F, 0x7040, 0x7041, 0x7042,
+ 0x7045, 0x7046, 0x7047, 0x7048, 0x7049, 0x704A, 0x704B, 0x704D,
+ 0x704E, 0x7050, 0x7052, 0x7053, 0x7054, 0x7056, 0x7057, 0x7059,
+ 0x705A, 0x705B, 0x705C, 0x705F, 0x7060, 0x7061, 0x7062, 0x7065,
+ 0x7066, 0x7068, 0x7069, 0x706A, 0x706E, 0x7071, 0x7072, 0x7073,
+ 0x7074, 0x7077, 0x7079, 0x707A, 0x707B, 0x707D, 0x7081, 0x7082,
+ 0x7083, 0x7084, 0x7086, 0x7087, 0x7088, 0x708B, 0x708C, 0x708D,
+ 0x708F, 0x7090, 0x7091, 0x7093, 0x7097, 0x7098, 0x709A, 0x709B,
+ 0x709E, 0x709F, 0x70A0, 0x70A1, 0x70A2, 0x70A3, 0x70A4, 0x70A5,
+ 0x70A6, 0x70A7, 0x70A8, 0x70A9, 0x70AA, 0x70B0, 0x70B2, 0x70B4,
+ 0x70B5, 0x70B6, 0x70BA, 0x70BE, 0x70BF, 0x70C4, 0x70C5, 0x70C6,
+ 0x70C7, 0x70C9, 0x70CB, 0x70CC, 0x70CD, 0x70CE, 0x70D0, 0x70D1,
+ 0x70D2, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D7, 0x70DA, 0x70DC,
+ 0x70DD, 0x70DE, 0x70E0, 0x70E1, 0x70E2, 0x70E3, 0x70E5, 0x70EA,
+ 0x70EE, 0x70F0, 0x70F1, 0x70F2, 0x70F3, 0x70F5, 0x70F6, 0x70F8,
+ 0x70FA, 0x70FB, 0x70FC, 0x70FE, 0x70FF, 0x7100, 0x7101, 0x7102,
+ 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108, 0x710B, 0x710C,
+ 0x710D, 0x710E, 0x710F, 0x7111, 0x7112, 0x7114, 0x7117, 0x711B,
+ 0x711C, 0x711D, 0x711E, 0x711F, 0x7120, 0x7122, 0x7123, 0x7124,
+ 0x7125, 0x7127, 0x7128, 0x7129, 0x712A, 0x712B, 0x712C, 0x712D,
+ 0x712E, 0x7132, 0x7133, 0x7134, 0x7135, 0x7137, 0x7138, 0x7139,
+ 0x713A, 0x713B, 0x713C, 0x713D, 0x713E, 0x713F, 0x7140, 0x7141,
+ 0x7142, 0x7143, 0x7144, 0x7146, 0x7147, 0x7148, 0x714B, 0x714D,
+ 0x714F, 0x7150, 0x7151, 0x7153, 0x7154, 0x7155, 0x7156, 0x7157,
+ 0x7158, 0x7159, 0x715A, 0x715B, 0x715D, 0x715F, 0x7160, 0x7161,
+ 0x7163, 0x7165, 0x716A, 0x716B, 0x716D, 0x716F, 0x7170, 0x7171,
+ 0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717B, 0x717C, 0x717E,
+ 0x717F, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187,
+ 0x7188, 0x7189, 0x718B, 0x718C, 0x718D, 0x718E, 0x7190, 0x7191,
+ 0x7193, 0x7195, 0x7196, 0x719A, 0x719B, 0x719C, 0x719D, 0x719E,
+ 0x71A1, 0x71A2, 0x71A3, 0x71A4, 0x71A5, 0x71A6, 0x71A7, 0x71A9,
+ 0x71AA, 0x71AB, 0x71AD, 0x71AE, 0x71AF, 0x71B0, 0x71B2, 0x71B4,
+ 0x71B6, 0x71B7, 0x71B8, 0x71BA, 0x71BB, 0x71BC, 0x71BD, 0x71BF,
+ 0x71C0, 0x71C2, 0x71C4, 0x71C5, 0x71C6, 0x71C7, 0x71C9, 0x71CA,
+ 0x71CB, 0x71CC, 0x71CD, 0x71CF, 0x71D0, 0x71D1, 0x71D3, 0x71D6,
+ 0x71D7, 0x71D8, 0x71DA, 0x71DB, 0x71DD, 0x71DE, 0x71E1, 0x71E2,
+ 0x71E3, 0x71E4, 0x71E8, 0x71E9, 0x71EA, 0x71EB, 0x71EC, 0x71EF,
+ 0x71F0, 0x71F1, 0x71F2, 0x71F3, 0x71F5, 0x71F6, 0x71F7, 0x71F8,
+ 0x71FA, 0x71FB, 0x71FD, 0x71FF, 0x7200, 0x7201, 0x7202, 0x7203,
+ 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720A, 0x720B, 0x720C,
+ 0x720E, 0x720F, 0x7211, 0x7212, 0x7213, 0x7214, 0x7215, 0x7216,
+ 0x7217, 0x7218, 0x7219, 0x721A, 0x721C, 0x721E, 0x721F, 0x7220,
+ 0x7221, 0x7222, 0x7223, 0x7224, 0x7225, 0x7226, 0x7227, 0x7229,
+ 0x722B, 0x722D, 0x722E, 0x722F, 0x7233, 0x7234, 0x723C, 0x7240,
+ 0x7241, 0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724A,
+ 0x724B, 0x724E, 0x724F, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255,
+ 0x7257, 0x725A, 0x725C, 0x725E, 0x7260, 0x7263, 0x7264, 0x7265,
+ 0x7268, 0x726A, 0x726B, 0x726C, 0x726D, 0x7270, 0x7271, 0x7273,
+ 0x7274, 0x7276, 0x7277, 0x7278, 0x727B, 0x727C, 0x7282, 0x7283,
+ 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728C, 0x728E, 0x7290,
+ 0x7291, 0x7293, 0x7294, 0x7295, 0x7297, 0x7298, 0x7299, 0x729A,
+ 0x729B, 0x729C, 0x729D, 0x729E, 0x72A0, 0x72A1, 0x72A3, 0x72A4,
+ 0x72A5, 0x72A6, 0x72A8, 0x72A9, 0x72AA, 0x72AB, 0x72AE, 0x72B1,
+ 0x72B2, 0x72B3, 0x72B5, 0x72BA, 0x72BB, 0x72BC, 0x72BD, 0x72BE,
+ 0x72BF, 0x72C5, 0x72C6, 0x72C7, 0x72C9, 0x72CA, 0x72CB, 0x72CC,
+ 0x72CF, 0x72D1, 0x72D3, 0x72D4, 0x72D5, 0x72D6, 0x72D8, 0x72DA,
+ 0x72DB, 0x72DC, 0x72DD, 0x72DF, 0x72E2, 0x72E3, 0x72E4, 0x72E5,
+ 0x72E6, 0x72E7, 0x72EA, 0x72EB, 0x72F5, 0x72F6, 0x72FE, 0x72FF,
+ 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308, 0x7309,
+ 0x730B, 0x730C, 0x730D, 0x730F, 0x7310, 0x7311, 0x7312, 0x7314,
+ 0x7318, 0x7319, 0x731A, 0x731F, 0x7320, 0x7323, 0x7324, 0x7326,
+ 0x7327, 0x7328, 0x732D, 0x732F, 0x7330, 0x7332, 0x7333, 0x7335,
+ 0x733A, 0x733C, 0x733D, 0x7340, 0x7342, 0x7343, 0x7346, 0x7347,
+ 0x7348, 0x7349, 0x734A, 0x734B, 0x734C, 0x734E, 0x734F, 0x7351,
+ 0x7353, 0x7354, 0x7355, 0x7356, 0x7358, 0x7359, 0x735A, 0x735B,
+ 0x735C, 0x735D, 0x735E, 0x735F, 0x7361, 0x7362, 0x7363, 0x7364,
+ 0x7365, 0x7366, 0x7367, 0x7369, 0x736E, 0x7371, 0x7373, 0x7374,
+ 0x7376, 0x7379, 0x737D, 0x737F, 0x7381, 0x7382, 0x7383, 0x7385,
+ 0x7386, 0x7388, 0x738A, 0x738C, 0x738D, 0x738F, 0x7390, 0x7392,
+ 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399, 0x739A, 0x739C,
+ 0x739D, 0x739E, 0x73A0, 0x73A1, 0x73A3, 0x73A4, 0x73A5, 0x73A6,
+ 0x73A7, 0x73A8, 0x73AA, 0x73AC, 0x73AD, 0x73B1, 0x73B4, 0x73B5,
+ 0x73B6, 0x73B8, 0x73B9, 0x73BC, 0x73BD, 0x73BE, 0x73BF, 0x73C1,
+ 0x73C3, 0x73C4, 0x73C5, 0x73C6, 0x73C7, 0x73CB, 0x73CC, 0x73CE,
+ 0x73D2, 0x73D3, 0x73D4, 0x73D5, 0x73D6, 0x73D7, 0x73D8, 0x73DA,
+ 0x73DB, 0x73DC, 0x73DD, 0x73DF, 0x73E1, 0x73E2, 0x73E3, 0x73E4,
+ 0x73E6, 0x73E8, 0x73EA, 0x73EB, 0x73EC, 0x73EE, 0x73EF, 0x73F0,
+ 0x73F1, 0x73F3, 0x73F4, 0x73F5, 0x73F6, 0x73F7, 0x73F8, 0x73F9,
+ 0x73FA, 0x73FB, 0x73FC, 0x73FD, 0x73FF, 0x7400, 0x7401, 0x7402,
+ 0x7404, 0x7407, 0x7408, 0x740B, 0x740C, 0x740D, 0x740E, 0x7411,
+ 0x7412, 0x7413, 0x7414, 0x7415, 0x7416, 0x7417, 0x7418, 0x7419,
+ 0x741C, 0x741D, 0x741E, 0x741F, 0x7420, 0x7421, 0x7423, 0x7424,
+ 0x7427, 0x7429, 0x742B, 0x742D, 0x742F, 0x7431, 0x7432, 0x7437,
+ 0x7438, 0x7439, 0x743A, 0x743B, 0x743D, 0x743E, 0x7440, 0x7442,
+ 0x7443, 0x7444, 0x7445, 0x7446, 0x7447, 0x7448, 0x7449, 0x744A,
+ 0x744C, 0x744D, 0x744E, 0x744F, 0x7450, 0x7451, 0x7452, 0x7453,
+ 0x7454, 0x7456, 0x7458, 0x745D, 0x7460, 0x7461, 0x7462, 0x7464,
+ 0x7465, 0x7466, 0x7467, 0x7468, 0x746B, 0x746C, 0x746E, 0x746F,
+ 0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747A,
+ 0x747B, 0x747C, 0x747D, 0x747F, 0x7482, 0x7484, 0x7485, 0x7486,
+ 0x7488, 0x748A, 0x748C, 0x748D, 0x748F, 0x7491, 0x7492, 0x7493,
+ 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749A, 0x749B,
+ 0x749D, 0x749F, 0x74A0, 0x74A1, 0x74A2, 0x74A4, 0x74A5, 0x74AA,
+ 0x74AB, 0x74AC, 0x74AD, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B3,
+ 0x74B4, 0x74B5, 0x74B6, 0x74B7, 0x74B8, 0x74B9, 0x74BB, 0x74BC,
+ 0x74BE, 0x74BF, 0x74C0, 0x74C1, 0x74C2, 0x74C3, 0x74C4, 0x74C5,
+ 0x74C6, 0x74C7, 0x74C8, 0x74C9, 0x74CB, 0x74CC, 0x74CD, 0x74CE,
+ 0x74D0, 0x74D1, 0x74D3, 0x74D5, 0x74D6, 0x74D7, 0x74D8, 0x74D9,
+ 0x74DB, 0x74DD, 0x74DF, 0x74E1, 0x74E5, 0x74E7, 0x74E8, 0x74E9,
+ 0x74EA, 0x74EB, 0x74EC, 0x74ED, 0x74F0, 0x74F1, 0x74F2, 0x74F3,
+ 0x74F5, 0x74F8, 0x74F9, 0x74FA, 0x74FB, 0x74FC, 0x74FD, 0x74FE,
+ 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507, 0x7508,
+ 0x7509, 0x750A, 0x750B, 0x750E, 0x7510, 0x7512, 0x7514, 0x7515,
+ 0x7516, 0x7517, 0x751B, 0x751D, 0x751E, 0x7520, 0x7521, 0x7522,
+ 0x7524, 0x7526, 0x7527, 0x752A, 0x752E, 0x7534, 0x7536, 0x7539,
+ 0x753C, 0x753D, 0x753F, 0x7541, 0x7542, 0x7543, 0x7544, 0x7546,
+ 0x7547, 0x7549, 0x754A, 0x754D, 0x7550, 0x7551, 0x7552, 0x7553,
+ 0x7555, 0x7556, 0x7557, 0x7558, 0x755E, 0x755F, 0x7560, 0x7561,
+ 0x7563, 0x7564, 0x7567, 0x7568, 0x7569, 0x756C, 0x756D, 0x756E,
+ 0x756F, 0x7570, 0x7571, 0x7573, 0x7575, 0x7577, 0x757A, 0x757B,
+ 0x757C, 0x757D, 0x757E, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585,
+ 0x7588, 0x7589, 0x758A, 0x758C, 0x758D, 0x758E, 0x7590, 0x7593,
+ 0x7595, 0x7598, 0x759B, 0x759C, 0x759E, 0x75A2, 0x75A6, 0x75A7,
+ 0x75A8, 0x75A9, 0x75AA, 0x75AD, 0x75B6, 0x75B7, 0x75BA, 0x75BB,
+ 0x75BF, 0x75C0, 0x75C1, 0x75C6, 0x75CB, 0x75CC, 0x75CE, 0x75CF,
+ 0x75D0, 0x75D1, 0x75D3, 0x75D7, 0x75DA, 0x75DC, 0x75DD, 0x75DF,
+ 0x75E0, 0x75E1, 0x75E5, 0x75E9, 0x75EC, 0x75ED, 0x75EE, 0x75EF,
+ 0x75F2, 0x75F3, 0x75F5, 0x75F6, 0x75F7, 0x75F8, 0x75FA, 0x75FB,
+ 0x75FD, 0x75FE, 0x7604, 0x7606, 0x7607, 0x7608, 0x7609, 0x760E,
+ 0x760F, 0x7611, 0x7612, 0x7613, 0x7614, 0x7616, 0x761A, 0x761C,
+ 0x761D, 0x7623, 0x7628, 0x762C, 0x762E, 0x762F, 0x7631, 0x7632,
+ 0x7636, 0x7637, 0x7639, 0x763A, 0x763D, 0x7641, 0x7644, 0x7645,
+ 0x7648, 0x764A, 0x764B, 0x764E, 0x764F, 0x7650, 0x7651, 0x7652,
+ 0x7653, 0x7655, 0x7657, 0x7659, 0x765A, 0x765B, 0x765D, 0x7660,
+ 0x7661, 0x7666, 0x7668, 0x766A, 0x7673, 0x7674, 0x7675, 0x7676,
+ 0x7677, 0x7679, 0x767A, 0x767F, 0x7680, 0x7681, 0x7683, 0x7685,
+ 0x7689, 0x768A, 0x768C, 0x768D, 0x768F, 0x7690, 0x7692, 0x7694,
+ 0x7695, 0x7697, 0x7698, 0x769B, 0x769C, 0x769D, 0x769E, 0x769F,
+ 0x76A0, 0x76A1, 0x76A2, 0x76A3, 0x76A5, 0x76A6, 0x76A7, 0x76A8,
+ 0x76A9, 0x76AA, 0x76AB, 0x76AC, 0x76AD, 0x76AF, 0x76B0, 0x76B3,
+ 0x76B5, 0x76B6, 0x76B7, 0x76B9, 0x76BB, 0x76BC, 0x76BD, 0x76BE,
+ 0x76C0, 0x76C1, 0x76C3, 0x76C4, 0x76C7, 0x76C9, 0x76CB, 0x76CC,
+ 0x76D3, 0x76D5, 0x76D9, 0x76DA, 0x76DC, 0x76DD, 0x76E0, 0x76E2,
+ 0x76E6, 0x76E8, 0x76E9, 0x76EA, 0x76EB, 0x76EC, 0x76ED, 0x76F0,
+ 0x76F3, 0x76F5, 0x76F6, 0x76F7, 0x76FA, 0x76FB, 0x76FD, 0x76FF,
+ 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770A, 0x770C, 0x770E,
+ 0x770F, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714, 0x7715, 0x7716,
+ 0x7717, 0x7718, 0x771B, 0x771C, 0x771D, 0x771E, 0x7721, 0x7723,
+ 0x7724, 0x7725, 0x7727, 0x772A, 0x772B, 0x772C, 0x772E, 0x7730,
+ 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773B, 0x773D, 0x773E,
+ 0x773F, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748, 0x7749, 0x774A,
+ 0x774B, 0x774C, 0x774D, 0x774E, 0x7752, 0x7753, 0x7754, 0x7755,
+ 0x7756, 0x7757, 0x7758, 0x7759, 0x775C, 0x775D, 0x775F, 0x7760,
+ 0x7764, 0x7767, 0x7769, 0x776A, 0x776D, 0x776E, 0x776F, 0x7770,
+ 0x7771, 0x7772, 0x7773, 0x7774, 0x7775, 0x7776, 0x7777, 0x7778,
+ 0x777A, 0x777B, 0x777C, 0x7781, 0x7782, 0x7783, 0x7786, 0x7787,
+ 0x7788, 0x7789, 0x778A, 0x778B, 0x778F, 0x7790, 0x7793, 0x7794,
+ 0x7795, 0x7796, 0x7797, 0x7799, 0x779A, 0x779B, 0x779C, 0x779D,
+ 0x77A1, 0x77A3, 0x77A4, 0x77A6, 0x77A8, 0x77AB, 0x77AE, 0x77AF,
+ 0x77B1, 0x77B2, 0x77B4, 0x77B6, 0x77B7, 0x77B8, 0x77B9, 0x77BA,
+ 0x77BE, 0x77C0, 0x77C1, 0x77C2, 0x77C3, 0x77C4, 0x77C5, 0x77C6,
+ 0x77C8, 0x77C9, 0x77CA, 0x77CB, 0x77CC, 0x77CE, 0x77CF, 0x77D0,
+ 0x77D1, 0x77D2, 0x77D3, 0x77D4, 0x77D5, 0x77D6, 0x77D8, 0x77D9,
+ 0x77DD, 0x77DE, 0x77DF, 0x77E0, 0x77E1, 0x77E4, 0x77E6, 0x77E8,
+ 0x77EA, 0x77F0, 0x77F1, 0x77F2, 0x77F4, 0x77F5, 0x77F7, 0x77F9,
+ 0x77FA, 0x77FB, 0x77FC, 0x7803, 0x7804, 0x7805, 0x7806, 0x7807,
+ 0x7808, 0x780A, 0x780B, 0x780E, 0x780F, 0x7810, 0x7813, 0x7815,
+ 0x7819, 0x781B, 0x781E, 0x7820, 0x7821, 0x7822, 0x7824, 0x7828,
+ 0x782A, 0x782B, 0x782E, 0x782F, 0x7831, 0x7832, 0x7833, 0x7835,
+ 0x7836, 0x783D, 0x783F, 0x7841, 0x7842, 0x7844, 0x7846, 0x7848,
+ 0x7849, 0x784A, 0x784B, 0x784D, 0x784F, 0x7851, 0x7853, 0x7854,
+ 0x7858, 0x7859, 0x785A, 0x785B, 0x785C, 0x785E, 0x785F, 0x7860,
+ 0x7861, 0x7862, 0x7863, 0x7865, 0x7866, 0x7867, 0x7869, 0x7870,
+ 0x7871, 0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879,
+ 0x787A, 0x787B, 0x787D, 0x787E, 0x787F, 0x7880, 0x7881, 0x7882,
+ 0x7883, 0x7884, 0x7885, 0x7886, 0x7888, 0x788A, 0x788B, 0x788F,
+ 0x7890, 0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789D, 0x789E,
+ 0x78A0, 0x78A2, 0x78A4, 0x78A6, 0x78A8, 0x78AA, 0x78AB, 0x78AC,
+ 0x78AE, 0x78AF, 0x78B5, 0x78B6, 0x78B7, 0x78BB, 0x78BD, 0x78BF,
+ 0x78C0, 0x78C2, 0x78C3, 0x78C4, 0x78C6, 0x78C7, 0x78C8, 0x78CC,
+ 0x78CD, 0x78CE, 0x78CF, 0x78D1, 0x78D2, 0x78D3, 0x78D6, 0x78D7,
+ 0x78D8, 0x78DB, 0x78DC, 0x78DD, 0x78DE, 0x78DF, 0x78E0, 0x78E1,
+ 0x78E2, 0x78E4, 0x78E5, 0x78E6, 0x78E9, 0x78EA, 0x78EB, 0x78ED,
+ 0x78EE, 0x78F0, 0x78F1, 0x78F3, 0x78F5, 0x78F6, 0x78F8, 0x78F9,
+ 0x78FB, 0x78FC, 0x78FE, 0x78FF, 0x7900, 0x7902, 0x7903, 0x7904,
+ 0x7906, 0x7907, 0x7908, 0x7909, 0x790A, 0x790B, 0x790C, 0x790D,
+ 0x790F, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915, 0x7916, 0x7917,
+ 0x7918, 0x791A, 0x791B, 0x791C, 0x791D, 0x791F, 0x7920, 0x7921,
+ 0x7922, 0x7923, 0x7925, 0x7927, 0x7928, 0x7929, 0x792D, 0x792E,
+ 0x792F, 0x7930, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938,
+ 0x7939, 0x793D, 0x793F, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947,
+ 0x794A, 0x794B, 0x794C, 0x794D, 0x794E, 0x794F, 0x7950, 0x7951,
+ 0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964,
+ 0x7966, 0x7969, 0x796A, 0x796B, 0x796C, 0x796E, 0x7970, 0x7971,
+ 0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797B, 0x797C,
+ 0x797D, 0x797E, 0x797F, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988,
+ 0x7989, 0x798B, 0x798C, 0x7990, 0x7991, 0x7992, 0x7993, 0x7994,
+ 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799B, 0x799C, 0x799D,
+ 0x799E, 0x799F, 0x79A0, 0x79A1, 0x79A2, 0x79A3, 0x79A4, 0x79A5,
+ 0x79A8, 0x79A9, 0x79AB, 0x79AC, 0x79AD, 0x79AF, 0x79B2, 0x79B4,
+ 0x79B5, 0x79B6, 0x79B7, 0x79B8, 0x79BC, 0x79BF, 0x79C2, 0x79C4,
+ 0x79C5, 0x79C7, 0x79C8, 0x79CA, 0x79CC, 0x79CE, 0x79CF, 0x79D0,
+ 0x79D3, 0x79D4, 0x79D6, 0x79D7, 0x79D9, 0x79DA, 0x79DB, 0x79DC,
+ 0x79DD, 0x79DE, 0x79E0, 0x79E1, 0x79E2, 0x79E5, 0x79E8, 0x79EA,
+ 0x79EC, 0x79EE, 0x79F1, 0x79F2, 0x79F3, 0x79F4, 0x79F5, 0x79F6,
+ 0x79F7, 0x79F9, 0x79FA, 0x79FC, 0x79FE, 0x79FF, 0x7A01, 0x7A04,
+ 0x7A05, 0x7A07, 0x7A08, 0x7A09, 0x7A0A, 0x7A0C, 0x7A0F, 0x7A10,
+ 0x7A11, 0x7A12, 0x7A13, 0x7A15, 0x7A16, 0x7A18, 0x7A19, 0x7A1B,
+ 0x7A1C, 0x7A1D, 0x7A1F, 0x7A21, 0x7A22, 0x7A24, 0x7A25, 0x7A26,
+ 0x7A27, 0x7A28, 0x7A29, 0x7A2A, 0x7A2B, 0x7A2C, 0x7A2D, 0x7A2F,
+ 0x7A30, 0x7A32, 0x7A34, 0x7A35, 0x7A36, 0x7A38, 0x7A3A, 0x7A3E,
+ 0x7A41, 0x7A42, 0x7A43, 0x7A44, 0x7A45, 0x7A47, 0x7A48, 0x7A49,
+ 0x7A4A, 0x7A4B, 0x7A4F, 0x7A50, 0x7A52, 0x7A53, 0x7A54, 0x7A55,
+ 0x7A56, 0x7A58, 0x7A59, 0x7A5A, 0x7A5B, 0x7A5C, 0x7A5D, 0x7A5E,
+ 0x7A5F, 0x7A60, 0x7A63, 0x7A64, 0x7A65, 0x7A66, 0x7A67, 0x7A68,
+ 0x7A6A, 0x7A6C, 0x7A6D, 0x7A6E, 0x7A6F, 0x7A71, 0x7A72, 0x7A73,
+ 0x7A75, 0x7A7B, 0x7A7C, 0x7A7D, 0x7A7E, 0x7A82, 0x7A85, 0x7A87,
+ 0x7A89, 0x7A8A, 0x7A8B, 0x7A8C, 0x7A8E, 0x7A8F, 0x7A90, 0x7A93,
+ 0x7A94, 0x7A99, 0x7A9A, 0x7A9B, 0x7A9E, 0x7AA1, 0x7AA2, 0x7AA3,
+ 0x7AA4, 0x7AA7, 0x7AAB, 0x7AAF, 0x7AB0, 0x7AB1, 0x7AB2, 0x7AB4,
+ 0x7AB5, 0x7AB7, 0x7AB8, 0x7AB9, 0x7ABB, 0x7ABC, 0x7ABD, 0x7ABE,
+ 0x7AC0, 0x7AC1, 0x7AC2, 0x7AC3, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACD,
+ 0x7ACE, 0x7ACF, 0x7AD0, 0x7AD1, 0x7AD2, 0x7AD3, 0x7AD4, 0x7AD5,
+ 0x7AD7, 0x7AD8, 0x7ADA, 0x7ADB, 0x7ADC, 0x7ADD, 0x7AE1, 0x7AE2,
+ 0x7AE4, 0x7AE7, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AEE, 0x7AF0,
+ 0x7AF1, 0x7AF2, 0x7AF3, 0x7AF4, 0x7AF5, 0x7AF7, 0x7AF8, 0x7AFB,
+ 0x7AFC, 0x7AFE, 0x7B00, 0x7B01, 0x7B02, 0x7B05, 0x7B07, 0x7B09,
+ 0x7B0C, 0x7B0D, 0x7B0E, 0x7B10, 0x7B12, 0x7B13, 0x7B16, 0x7B17,
+ 0x7B18, 0x7B1A, 0x7B1C, 0x7B1D, 0x7B1F, 0x7B21, 0x7B22, 0x7B23,
+ 0x7B27, 0x7B29, 0x7B2D, 0x7B2F, 0x7B30, 0x7B32, 0x7B34, 0x7B35,
+ 0x7B36, 0x7B37, 0x7B39, 0x7B3B, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41,
+ 0x7B42, 0x7B43, 0x7B44, 0x7B48, 0x7B4A, 0x7B4D, 0x7B4E, 0x7B53,
+ 0x7B55, 0x7B57, 0x7B59, 0x7B5C, 0x7B5E, 0x7B5F, 0x7B61, 0x7B63,
+ 0x7B64, 0x7B65, 0x7B66, 0x7B68, 0x7B69, 0x7B6A, 0x7B6B, 0x7B6C,
+ 0x7B6D, 0x7B6F, 0x7B70, 0x7B73, 0x7B74, 0x7B76, 0x7B78, 0x7B7A,
+ 0x7B7C, 0x7B7D, 0x7B7F, 0x7B81, 0x7B82, 0x7B83, 0x7B84, 0x7B86,
+ 0x7B87, 0x7B88, 0x7B89, 0x7B8A, 0x7B8C, 0x7B8E, 0x7B8F, 0x7B91,
+ 0x7B92, 0x7B93, 0x7B96, 0x7B98, 0x7B99, 0x7B9A, 0x7B9B, 0x7B9E,
+ 0x7B9F, 0x7BA0, 0x7BA3, 0x7BA4, 0x7BA5, 0x7BAE, 0x7BAF, 0x7BB0,
+ 0x7BB2, 0x7BB3, 0x7BB5, 0x7BB6, 0x7BB7, 0x7BB9, 0x7BBA, 0x7BBB,
+ 0x7BBC, 0x7BBD, 0x7BBE, 0x7BBF, 0x7BC2, 0x7BC3, 0x7BC5, 0x7BC8,
+ 0x7BCA, 0x7BCD, 0x7BCE, 0x7BCF, 0x7BD0, 0x7BD2, 0x7BD4, 0x7BD5,
+ 0x7BD6, 0x7BD7, 0x7BD8, 0x7BDB, 0x7BDC, 0x7BDE, 0x7BDF, 0x7BE0,
+ 0x7BE2, 0x7BE3, 0x7BE7, 0x7BE8, 0x7BEB, 0x7BEC, 0x7BED, 0x7BEF,
+ 0x7BF0, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF6, 0x7BF8, 0x7BF9, 0x7BFA,
+ 0x7BFB, 0x7BFD, 0x7BFF, 0x7C01, 0x7C02, 0x7C03, 0x7C04, 0x7C05,
+ 0x7C06, 0x7C08, 0x7C09, 0x7C0A, 0x7C0E, 0x7C10, 0x7C11, 0x7C12,
+ 0x7C13, 0x7C14, 0x7C15, 0x7C17, 0x7C18, 0x7C19, 0x7C1A, 0x7C1B,
+ 0x7C1C, 0x7C1D, 0x7C20, 0x7C22, 0x7C24, 0x7C25, 0x7C28, 0x7C29,
+ 0x7C2C, 0x7C2D, 0x7C2E, 0x7C2F, 0x7C30, 0x7C31, 0x7C32, 0x7C33,
+ 0x7C34, 0x7C35, 0x7C36, 0x7C37, 0x7C39, 0x7C3A, 0x7C3B, 0x7C3C,
+ 0x7C42, 0x7C44, 0x7C45, 0x7C46, 0x7C47, 0x7C48, 0x7C49, 0x7C4A,
+ 0x7C4B, 0x7C4E, 0x7C4F, 0x7C50, 0x7C51, 0x7C52, 0x7C53, 0x7C54,
+ 0x7C55, 0x7C56, 0x7C57, 0x7C58, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5D,
+ 0x7C5E, 0x7C61, 0x7C62, 0x7C63, 0x7C65, 0x7C66, 0x7C67, 0x7C68,
+ 0x7C6B, 0x7C6D, 0x7C6F, 0x7C70, 0x7C71, 0x7C75, 0x7C76, 0x7C77,
+ 0x7C78, 0x7C79, 0x7C7A, 0x7C7E, 0x7C7F, 0x7C80, 0x7C81, 0x7C82,
+ 0x7C83, 0x7C84, 0x7C85, 0x7C86, 0x7C87, 0x7C88, 0x7C8A, 0x7C8B,
+ 0x7C8C, 0x7C8D, 0x7C8E, 0x7C8F, 0x7C90, 0x7C93, 0x7C94, 0x7C96,
+ 0x7C99, 0x7C9A, 0x7C9B, 0x7CA0, 0x7CA1, 0x7CA3, 0x7CA6, 0x7CA7,
+ 0x7CA8, 0x7CA9, 0x7CAB, 0x7CAC, 0x7CAD, 0x7CAF, 0x7CB0, 0x7CB4,
+ 0x7CB5, 0x7CB6, 0x7CB7, 0x7CB8, 0x7CBA, 0x7CBB, 0x7CBF, 0x7CC0,
+ 0x7CC2, 0x7CC3, 0x7CC4, 0x7CC6, 0x7CC9, 0x7CCB, 0x7CCE, 0x7CCF,
+ 0x7CD0, 0x7CD1, 0x7CD2, 0x7CD3, 0x7CD4, 0x7CD8, 0x7CDA, 0x7CDB,
+ 0x7CE1, 0x7CE2, 0x7CE3, 0x7CE4, 0x7CE5, 0x7CE6, 0x7CE9, 0x7CEA,
+ 0x7CEB, 0x7CEC, 0x7CED, 0x7CEE, 0x7CF1, 0x7CF3, 0x7CF5, 0x7CF7,
+ 0x7CFA, 0x7CFC, 0x7CFD, 0x7CFF, 0x7D01, 0x7D03, 0x7D0C, 0x7D0E,
+ 0x7D0F, 0x7D11, 0x7D12, 0x7D16, 0x7D18, 0x7D1D, 0x7D1E, 0x7D1F,
+ 0x7D23, 0x7D24, 0x7D25, 0x7D26, 0x7D28, 0x7D29, 0x7D2A, 0x7D2C,
+ 0x7D2D, 0x7D2E, 0x7D34, 0x7D35, 0x7D36, 0x7D37, 0x7D38, 0x7D3B,
+ 0x7D3D, 0x7D3E, 0x7D41, 0x7D43, 0x7D45, 0x7D47, 0x7D48, 0x7D49,
+ 0x7D4A, 0x7D4B, 0x7D4C, 0x7D4D, 0x7D4F, 0x7D51, 0x7D52, 0x7D53,
+ 0x7D54, 0x7D55, 0x7D56, 0x7D57, 0x7D58, 0x7D59, 0x7D5A, 0x7D5B,
+ 0x7D5C, 0x7D5F, 0x7D60, 0x7D63, 0x7D64, 0x7D65, 0x7D67, 0x7D69,
+ 0x7D6A, 0x7D6B, 0x7D6C, 0x7D6D, 0x7D6F, 0x7D70, 0x7D74, 0x7D75,
+ 0x7D78, 0x7D7A, 0x7D7B, 0x7D7C, 0x7D7D, 0x7D7E, 0x7D7F, 0x7D80,
+ 0x7D82, 0x7D84, 0x7D85, 0x7D87, 0x7D8A, 0x7D8B, 0x7D8C, 0x7D8D,
+ 0x7D8E, 0x7D90, 0x7D91, 0x7D92, 0x7D94, 0x7D95, 0x7D96, 0x7D97,
+ 0x7D98, 0x7D99, 0x7D9A, 0x7D9B, 0x7D9D, 0x7D9F, 0x7DA0, 0x7DA1,
+ 0x7DA4, 0x7DA5, 0x7DA7, 0x7DA8, 0x7DA9, 0x7DAA, 0x7DAF, 0x7DB5,
+ 0x7DB6, 0x7DB7, 0x7DBC, 0x7DC0, 0x7DC1, 0x7DC2, 0x7DC3, 0x7DC5,
+ 0x7DC6, 0x7DC8, 0x7DC9, 0x7DCC, 0x7DCD, 0x7DCE, 0x7DCF, 0x7DD0,
+ 0x7DD3, 0x7DD5, 0x7DD6, 0x7DDA, 0x7DDB, 0x7DDC, 0x7DDF, 0x7DE2,
+ 0x7DE4, 0x7DE5, 0x7DE7, 0x7DEA, 0x7DEB, 0x7DED, 0x7DEE, 0x7DF0,
+ 0x7DF3, 0x7DF5, 0x7DF7, 0x7DF8, 0x7DFA, 0x7DFC, 0x7DFD, 0x7DFE,
+ 0x7DFF, 0x7E00, 0x7E01, 0x7E02, 0x7E03, 0x7E04, 0x7E05, 0x7E06,
+ 0x7E07, 0x7E0C, 0x7E0D, 0x7E0E, 0x7E0F, 0x7E12, 0x7E13, 0x7E14,
+ 0x7E15, 0x7E16, 0x7E17, 0x7E18, 0x7E19, 0x7E1A, 0x7E1C, 0x7E20,
+ 0x7E21, 0x7E22, 0x7E24, 0x7E25, 0x7E26, 0x7E28, 0x7E29, 0x7E2A,
+ 0x7E2C, 0x7E2F, 0x7E30, 0x7E33, 0x7E38, 0x7E3A, 0x7E3C, 0x7E3F,
+ 0x7E40, 0x7E42, 0x7E43, 0x7E44, 0x7E48, 0x7E49, 0x7E4A, 0x7E4B,
+ 0x7E4C, 0x7E4D, 0x7E4E, 0x7E4F, 0x7E50, 0x7E51, 0x7E53, 0x7E56,
+ 0x7E57, 0x7E58, 0x7E59, 0x7E5B, 0x7E5C, 0x7E5D, 0x7E5F, 0x7E60,
+ 0x7E61, 0x7E63, 0x7E64, 0x7E65, 0x7E66, 0x7E67, 0x7E68, 0x7E6C,
+ 0x7E71, 0x7E72, 0x7E74, 0x7E75, 0x7E76, 0x7E77, 0x7E78, 0x7E7A,
+ 0x7E7B, 0x7E7F, 0x7E80, 0x7E81, 0x7E83, 0x7E84, 0x7E85, 0x7E86,
+ 0x7E87, 0x7E89, 0x7E8B, 0x7E8E, 0x7E90, 0x7E91, 0x7E92, 0x7E95,
+ 0x7E97, 0x7E99, 0x7E9A, 0x7E9D, 0x7E9E, 0x7EAE, 0x7EB4, 0x7EBB,
+ 0x7EBC, 0x7ED6, 0x7EE4, 0x7EEC, 0x7EF9, 0x7F0A, 0x7F10, 0x7F1E,
+ 0x7F37, 0x7F39, 0x7F3B, 0x7F3C, 0x7F3D, 0x7F3E, 0x7F3F, 0x7F40,
+ 0x7F41, 0x7F43, 0x7F46, 0x7F47, 0x7F48, 0x7F49, 0x7F4A, 0x7F4B,
+ 0x7F4D, 0x7F4F, 0x7F52, 0x7F53, 0x7F56, 0x7F59, 0x7F5B, 0x7F5C,
+ 0x7F5D, 0x7F5E, 0x7F60, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F67,
+ 0x7F6B, 0x7F6C, 0x7F6D, 0x7F6F, 0x7F73, 0x7F75, 0x7F76, 0x7F78,
+ 0x7F7A, 0x7F7B, 0x7F7C, 0x7F7D, 0x7F7F, 0x7F80, 0x7F82, 0x7F83,
+ 0x7F84, 0x7F87, 0x7F89, 0x7F8B, 0x7F8D, 0x7F8F, 0x7F90, 0x7F91,
+ 0x7F92, 0x7F93, 0x7F95, 0x7F96, 0x7F97, 0x7F98, 0x7F99, 0x7F9B,
+ 0x7F9C, 0x7FA0, 0x7FA2, 0x7FA3, 0x7FA6, 0x7FA8, 0x7FAA, 0x7FAB,
+ 0x7FAC, 0x7FAD, 0x7FAE, 0x7FB1, 0x7FB3, 0x7FB4, 0x7FB5, 0x7FB6,
+ 0x7FB7, 0x7FBA, 0x7FBB, 0x7FBE, 0x7FC0, 0x7FC2, 0x7FC3, 0x7FC4,
+ 0x7FC6, 0x7FC7, 0x7FC8, 0x7FC9, 0x7FCB, 0x7FCD, 0x7FCF, 0x7FD0,
+ 0x7FD1, 0x7FD3, 0x7FD6, 0x7FD7, 0x7FD9, 0x7FDA, 0x7FDB, 0x7FDC,
+ 0x7FDD, 0x7FDE, 0x7FE2, 0x7FE3, 0x7FE4, 0x7FE7, 0x7FE8, 0x7FEA,
+ 0x7FEB, 0x7FEC, 0x7FED, 0x7FEF, 0x7FF2, 0x7FF4, 0x7FF5, 0x7FF6,
+ 0x7FF7, 0x7FF8, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF, 0x8002, 0x8007,
+ 0x8008, 0x8009, 0x800A, 0x800E, 0x800F, 0x8011, 0x8013, 0x801A,
+ 0x801B, 0x801D, 0x801E, 0x801F, 0x8021, 0x8023, 0x8024, 0x802B,
+ 0x802D, 0x802F, 0x8030, 0x8032, 0x8034, 0x8039, 0x803A, 0x803C,
+ 0x803E, 0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049,
+ 0x804E, 0x804F, 0x8050, 0x8051, 0x8053, 0x8055, 0x8057, 0x8059,
+ 0x805B, 0x805C, 0x805D, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063,
+ 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806B, 0x806C, 0x806D,
+ 0x806E, 0x8074, 0x8078, 0x807A, 0x807B, 0x807C, 0x8081, 0x8082,
+ 0x8088, 0x808A, 0x808D, 0x808E, 0x808F, 0x8090, 0x8091, 0x8092,
+ 0x8094, 0x8095, 0x8097, 0x8099, 0x809E, 0x80A3, 0x80A6, 0x80A7,
+ 0x80A8, 0x80AC, 0x80B0, 0x80B3, 0x80B5, 0x80B6, 0x80B8, 0x80B9,
+ 0x80BB, 0x80C5, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x80CB, 0x80CF,
+ 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x80D4, 0x80D5, 0x80D8, 0x80DF,
+ 0x80E0, 0x80E2, 0x80E3, 0x80E6, 0x80EE, 0x80F5, 0x80F7, 0x80F9,
+ 0x80FB, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8103, 0x8104, 0x8107,
+ 0x8108, 0x810B, 0x810C, 0x8115, 0x8117, 0x8119, 0x811C, 0x811D,
+ 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,
+ 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812D, 0x812E, 0x8130,
+ 0x8133, 0x8134, 0x8135, 0x8137, 0x813A, 0x813B, 0x813C, 0x813D,
+ 0x813F, 0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147,
+ 0x8149, 0x814D, 0x814F, 0x8152, 0x8157, 0x8158, 0x815B, 0x815C,
+ 0x815D, 0x815E, 0x815F, 0x8162, 0x8163, 0x8164, 0x8168, 0x816A,
+ 0x816C, 0x816F, 0x8172, 0x8173, 0x8175, 0x8176, 0x8177, 0x8181,
+ 0x8183, 0x8184, 0x8185, 0x8186, 0x8187, 0x8189, 0x818B, 0x818C,
+ 0x818D, 0x818E, 0x8190, 0x8192, 0x8193, 0x8194, 0x8195, 0x8196,
+ 0x8197, 0x8199, 0x819E, 0x819F, 0x81A1, 0x81A2, 0x81A4, 0x81A5,
+ 0x81A7, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x81AF, 0x81B0, 0x81B1,
+ 0x81B2, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BC,
+ 0x81C4, 0x81C5, 0x81C7, 0x81C8, 0x81CB, 0x81CE, 0x81D0, 0x81D1,
+ 0x81D2, 0x81D3, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D9, 0x81DB,
+ 0x81DC, 0x81DD, 0x81DE, 0x81E1, 0x81E2, 0x81E4, 0x81E5, 0x81E6,
+ 0x81E9, 0x81EB, 0x81EE, 0x81EF, 0x81F0, 0x81F1, 0x81F2, 0x81F5,
+ 0x81F6, 0x81F7, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8203, 0x820B,
+ 0x820E, 0x820F, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218,
+ 0x8219, 0x821A, 0x821D, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227,
+ 0x8229, 0x822E, 0x8232, 0x823A, 0x823C, 0x823D, 0x823F, 0x8240,
+ 0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824A, 0x824C,
+ 0x824D, 0x824E, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255,
+ 0x8256, 0x8257, 0x825B, 0x825C, 0x825D, 0x825E, 0x8260, 0x8261,
+ 0x8262, 0x8263, 0x8265, 0x8267, 0x8269, 0x826A, 0x826C, 0x826D,
+ 0x8275, 0x8276, 0x8278, 0x827B, 0x827C, 0x8280, 0x8281, 0x8283,
+ 0x8285, 0x8286, 0x8287, 0x8289, 0x828C, 0x8290, 0x8293, 0x8294,
+ 0x8295, 0x8296, 0x829A, 0x829B, 0x829E, 0x82A0, 0x82A2, 0x82A3,
+ 0x82A7, 0x82B2, 0x82B5, 0x82B6, 0x82BA, 0x82BC, 0x82BF, 0x82C0,
+ 0x82C2, 0x82C3, 0x82C5, 0x82C6, 0x82C9, 0x82D0, 0x82D6, 0x82D9,
+ 0x82DA, 0x82DD, 0x82E2, 0x82E8, 0x82E9, 0x82EA, 0x82EC, 0x82ED,
+ 0x82EE, 0x82F0, 0x82F2, 0x82F3, 0x82F5, 0x82F6, 0x82F8, 0x82FA,
+ 0x82FC, 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x830A, 0x830B, 0x830D,
+ 0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831D, 0x831E,
+ 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326,
+ 0x8329, 0x832A, 0x832E, 0x8330, 0x8332, 0x8337, 0x833B, 0x833D,
+ 0x833E, 0x833F, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834A,
+ 0x834B, 0x834C, 0x834D, 0x834E, 0x8353, 0x8355, 0x8356, 0x8357,
+ 0x8358, 0x8359, 0x835D, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373,
+ 0x8374, 0x8375, 0x8376, 0x8379, 0x837A, 0x837E, 0x837F, 0x8380,
+ 0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838B, 0x838C,
+ 0x838D, 0x838F, 0x8390, 0x8391, 0x8394, 0x8395, 0x8397, 0x8399,
+ 0x839A, 0x839D, 0x839F, 0x83A1, 0x83A3, 0x83A4, 0x83A5, 0x83A6,
+ 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B5, 0x83BB, 0x83BE, 0x83BF,
+ 0x83C2, 0x83C3, 0x83C4, 0x83C6, 0x83C8, 0x83C9, 0x83CB, 0x83CD,
+ 0x83CE, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D5, 0x83D7, 0x83D9,
+ 0x83DA, 0x83DB, 0x83DE, 0x83E2, 0x83E3, 0x83E4, 0x83E6, 0x83E7,
+ 0x83E8, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83F3, 0x83F4, 0x83F5,
+ 0x83F6, 0x83F7, 0x83FA, 0x83FB, 0x83FC, 0x83FE, 0x83FF, 0x8400,
+ 0x8402, 0x8405, 0x8408, 0x8409, 0x8410, 0x8412, 0x8413, 0x8414,
+ 0x8415, 0x8416, 0x8417, 0x8419, 0x841A, 0x841B, 0x841E, 0x841F,
+ 0x8420, 0x8421, 0x8422, 0x8423, 0x8429, 0x842A, 0x842B, 0x842D,
+ 0x842E, 0x842F, 0x8430, 0x8432, 0x8433, 0x8434, 0x8436, 0x8437,
+ 0x8439, 0x843A, 0x843B, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442,
+ 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x844A, 0x844B, 0x844C,
+ 0x844D, 0x844E, 0x844F, 0x8450, 0x8453, 0x8454, 0x8455, 0x8456,
+ 0x8458, 0x845D, 0x845E, 0x845F, 0x8460, 0x8462, 0x8465, 0x8467,
+ 0x8468, 0x846A, 0x846E, 0x8470, 0x8472, 0x8474, 0x8479, 0x847B,
+ 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8483, 0x8484,
+ 0x8485, 0x8486, 0x848A, 0x848D, 0x848F, 0x8490, 0x8491, 0x8492,
+ 0x8495, 0x8496, 0x8498, 0x849A, 0x849B, 0x849D, 0x849E, 0x849F,
+ 0x84A0, 0x84A2, 0x84A3, 0x84A4, 0x84A5, 0x84A6, 0x84A7, 0x84A8,
+ 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84B0, 0x84B1,
+ 0x84B3, 0x84B5, 0x84B6, 0x84B7, 0x84BB, 0x84BE, 0x84C2, 0x84C3,
+ 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x84CC, 0x84CE, 0x84CF, 0x84D2,
+ 0x84D4, 0x84D5, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB, 0x84DC,
+ 0x84DE, 0x84E1, 0x84E2, 0x84E4, 0x84E7, 0x84E8, 0x84E9, 0x84EA,
+ 0x84EB, 0x84ED, 0x84F1, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6,
+ 0x84F7, 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x84FE, 0x8500, 0x8501,
+ 0x8502, 0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509,
+ 0x850A, 0x850B, 0x850D, 0x850E, 0x850F, 0x8510, 0x8512, 0x8515,
+ 0x8516, 0x8518, 0x8519, 0x851B, 0x851C, 0x851D, 0x8520, 0x8522,
+ 0x8524, 0x8525, 0x8527, 0x8528, 0x8529, 0x852A, 0x852E, 0x852F,
+ 0x8530, 0x8531, 0x8532, 0x8533, 0x8534, 0x8535, 0x8536, 0x853E,
+ 0x853F, 0x8540, 0x8542, 0x8544, 0x8545, 0x8547, 0x854B, 0x854C,
+ 0x854D, 0x854F, 0x8550, 0x8551, 0x8554, 0x8557, 0x855A, 0x855B,
+ 0x855C, 0x855D, 0x855F, 0x8560, 0x8561, 0x8563, 0x8565, 0x8566,
+ 0x8567, 0x856B, 0x856C, 0x856E, 0x856F, 0x8570, 0x8571, 0x8573,
+ 0x8575, 0x8576, 0x8578, 0x857C, 0x857D, 0x857F, 0x8580, 0x8581,
+ 0x8582, 0x8583, 0x8586, 0x8589, 0x858B, 0x858D, 0x858E, 0x8590,
+ 0x8592, 0x8593, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0x859A,
+ 0x859D, 0x859E, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A5, 0x85A7,
+ 0x85AB, 0x85AC, 0x85AD, 0x85B1, 0x85B2, 0x85B3, 0x85B4, 0x85B5,
+ 0x85B6, 0x85B8, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0,
+ 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85CA,
+ 0x85CB, 0x85CC, 0x85D1, 0x85D2, 0x85D4, 0x85D6, 0x85D7, 0x85D8,
+ 0x85D9, 0x85DA, 0x85DB, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2,
+ 0x85E3, 0x85E6, 0x85E7, 0x85E8, 0x85EB, 0x85EC, 0x85ED, 0x85EE,
+ 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F5, 0x85F7, 0x85F8,
+ 0x85FC, 0x85FD, 0x85FE, 0x8600, 0x8601, 0x8602, 0x8603, 0x8608,
+ 0x8609, 0x860A, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8612,
+ 0x8613, 0x8614, 0x8615, 0x8617, 0x8618, 0x8619, 0x861B, 0x861C,
+ 0x861D, 0x861F, 0x8620, 0x8621, 0x8623, 0x8624, 0x8625, 0x8626,
+ 0x8628, 0x862A, 0x862B, 0x862C, 0x862E, 0x862F, 0x8630, 0x8631,
+ 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8639, 0x863B,
+ 0x863D, 0x863E, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645,
+ 0x8646, 0x8647, 0x8648, 0x8649, 0x864A, 0x864B, 0x864C, 0x8652,
+ 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865B, 0x865D, 0x8660,
+ 0x8661, 0x8663, 0x8664, 0x8665, 0x8666, 0x8668, 0x8669, 0x866A,
+ 0x866D, 0x866F, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,
+ 0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688,
+ 0x8689, 0x868E, 0x868F, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696,
+ 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869E, 0x869F, 0x86A0,
+ 0x86A1, 0x86A2, 0x86A5, 0x86A6, 0x86AB, 0x86AD, 0x86AE, 0x86B2,
+ 0x86B3, 0x86B7, 0x86B8, 0x86B9, 0x86BB, 0x86BC, 0x86BD, 0x86BE,
+ 0x86BF, 0x86C1, 0x86C2, 0x86C3, 0x86C5, 0x86C8, 0x86CC, 0x86CD,
+ 0x86D2, 0x86D3, 0x86D5, 0x86D6, 0x86D7, 0x86DA, 0x86DC, 0x86DD,
+ 0x86E0, 0x86E1, 0x86E2, 0x86E3, 0x86E5, 0x86E6, 0x86E7, 0x86E8,
+ 0x86EA, 0x86EB, 0x86EC, 0x86EF, 0x86F5, 0x86F6, 0x86F7, 0x86FB,
+ 0x86FC, 0x86FD, 0x86FF, 0x8701, 0x8704, 0x8705, 0x870B, 0x870C,
+ 0x870E, 0x870F, 0x8710, 0x8711, 0x8714, 0x8716, 0x8719, 0x871B,
+ 0x871D, 0x871F, 0x8720, 0x8724, 0x8726, 0x8727, 0x8728, 0x872A,
+ 0x872B, 0x872C, 0x872D, 0x872F, 0x8730, 0x8732, 0x8733, 0x8735,
+ 0x8736, 0x8738, 0x8739, 0x873A, 0x873C, 0x873D, 0x8740, 0x8741,
+ 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874A, 0x874B, 0x874D,
+ 0x874F, 0x8750, 0x8751, 0x8752, 0x8754, 0x8756, 0x8758, 0x875A,
+ 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8761, 0x8762, 0x8767,
+ 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876F, 0x8771,
+ 0x8772, 0x8773, 0x8775, 0x8777, 0x8779, 0x877A, 0x877F, 0x8780,
+ 0x8781, 0x8786, 0x8787, 0x8789, 0x878A, 0x878C, 0x878E, 0x878F,
+ 0x8790, 0x8791, 0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799,
+ 0x879A, 0x879B, 0x879C, 0x879D, 0x87A0, 0x87A1, 0x87A3, 0x87A4,
+ 0x87A5, 0x87A6, 0x87A7, 0x87A9, 0x87AA, 0x87AE, 0x87B0, 0x87B1,
+ 0x87B2, 0x87B4, 0x87B6, 0x87B7, 0x87B8, 0x87B9, 0x87BC, 0x87BE,
+ 0x87BF, 0x87C1, 0x87C2, 0x87C3, 0x87C5, 0x87C7, 0x87C9, 0x87CC,
+ 0x87CD, 0x87CF, 0x87D0, 0x87D4, 0x87D5, 0x87D6, 0x87D7, 0x87D8,
+ 0x87D9, 0x87DA, 0x87DC, 0x87DD, 0x87DE, 0x87DF, 0x87E1, 0x87E2,
+ 0x87E4, 0x87E6, 0x87E7, 0x87E8, 0x87E9, 0x87EB, 0x87ED, 0x87F0,
+ 0x87F1, 0x87F3, 0x87F4, 0x87F5, 0x87F7, 0x87F8, 0x87FA, 0x87FC,
+ 0x87FD, 0x87FF, 0x8800, 0x8801, 0x8802, 0x8804, 0x8807, 0x8808,
+ 0x8809, 0x880B, 0x880C, 0x880D, 0x880E, 0x880F, 0x8812, 0x8814,
+ 0x8817, 0x8818, 0x8819, 0x881A, 0x881C, 0x881D, 0x881E, 0x8820,
+ 0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882A, 0x882B,
+ 0x882C, 0x882D, 0x882E, 0x882F, 0x8830, 0x8833, 0x8834, 0x8835,
+ 0x8837, 0x8838, 0x883A, 0x883D, 0x883E, 0x883F, 0x8841, 0x8842,
+ 0x8843, 0x8847, 0x8848, 0x8849, 0x884B, 0x884E, 0x884F, 0x8850,
+ 0x8851, 0x8852, 0x8855, 0x8856, 0x8858, 0x885A, 0x885C, 0x885E,
+ 0x885F, 0x8860, 0x8866, 0x8867, 0x886A, 0x886D, 0x886F, 0x8871,
+ 0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x887A, 0x887B, 0x887C,
+ 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888A, 0x888C, 0x888E,
+ 0x888F, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897, 0x8898,
+ 0x8899, 0x889A, 0x889B, 0x889D, 0x889E, 0x889F, 0x88A0, 0x88A1,
+ 0x88A3, 0x88A5, 0x88A6, 0x88A7, 0x88A8, 0x88A9, 0x88AA, 0x88AC,
+ 0x88AE, 0x88AF, 0x88B0, 0x88B2, 0x88B3, 0x88B4, 0x88B5, 0x88B6,
+ 0x88B8, 0x88B9, 0x88BA, 0x88BB, 0x88BD, 0x88BE, 0x88BF, 0x88C0,
+ 0x88C3, 0x88C4, 0x88C7, 0x88C8, 0x88CB, 0x88CC, 0x88CD, 0x88D0,
+ 0x88D1, 0x88D3, 0x88D6, 0x88D7, 0x88DA, 0x88DB, 0x88DE, 0x88E0,
+ 0x88E1, 0x88E6, 0x88E7, 0x88E9, 0x88EA, 0x88EB, 0x88EC, 0x88ED,
+ 0x88EE, 0x88EF, 0x88F2, 0x88F5, 0x88F6, 0x88F7, 0x88FA, 0x88FB,
+ 0x88FF, 0x8900, 0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8908,
+ 0x8909, 0x890B, 0x890C, 0x890D, 0x890E, 0x890F, 0x8911, 0x8914,
+ 0x8915, 0x8916, 0x8917, 0x8918, 0x891C, 0x891D, 0x891E, 0x891F,
+ 0x8920, 0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929,
+ 0x892C, 0x892D, 0x892E, 0x892F, 0x8931, 0x8935, 0x8937, 0x8939,
+ 0x893A, 0x893C, 0x893D, 0x893E, 0x893F, 0x8940, 0x8942, 0x8943,
+ 0x8945, 0x8946, 0x8948, 0x8949, 0x894A, 0x894B, 0x894C, 0x894D,
+ 0x894E, 0x894F, 0x8950, 0x8951, 0x8952, 0x8953, 0x8954, 0x8955,
+ 0x8957, 0x8958, 0x8959, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962,
+ 0x8963, 0x8965, 0x8967, 0x8968, 0x8969, 0x896B, 0x896D, 0x896E,
+ 0x8970, 0x8971, 0x8973, 0x8974, 0x8975, 0x8976, 0x8977, 0x8978,
+ 0x8979, 0x897A, 0x897C, 0x897D, 0x897E, 0x8980, 0x8982, 0x8984,
+ 0x8985, 0x8987, 0x8988, 0x8989, 0x898A, 0x898C, 0x898D, 0x898E,
+ 0x8990, 0x8991, 0x8992, 0x8994, 0x8995, 0x8997, 0x8999, 0x899A,
+ 0x899B, 0x899C, 0x899D, 0x899E, 0x899F, 0x89A0, 0x89A2, 0x89A3,
+ 0x89A4, 0x89A5, 0x89A7, 0x89A8, 0x89A9, 0x89AB, 0x89AD, 0x89AE,
+ 0x89B0, 0x89B1, 0x89B3, 0x89B4, 0x89B5, 0x89B6, 0x89B8, 0x89B9,
+ 0x89BB, 0x89BC, 0x89BE, 0x89C3, 0x89CD, 0x89D3, 0x89D4, 0x89D5,
+ 0x89D7, 0x89D8, 0x89D9, 0x89DB, 0x89DD, 0x89DF, 0x89E0, 0x89E1,
+ 0x89E2, 0x89E4, 0x89E7, 0x89E8, 0x89E9, 0x89EA, 0x89EC, 0x89ED,
+ 0x89EE, 0x89F0, 0x89F1, 0x89F2, 0x89F5, 0x89F7, 0x89F9, 0x89FA,
+ 0x89FB, 0x89FC, 0x89FD, 0x89FE, 0x89FF, 0x8A04, 0x8A05, 0x8A06,
+ 0x8A09, 0x8A0B, 0x8A0D, 0x8A0F, 0x8A11, 0x8A12, 0x8A14, 0x8A17,
+ 0x8A19, 0x8A1A, 0x8A1C, 0x8A1E, 0x8A20, 0x8A21, 0x8A22, 0x8A24,
+ 0x8A26, 0x8A27, 0x8A28, 0x8A29, 0x8A2B, 0x8A2C, 0x8A2E, 0x8A2F,
+ 0x8A30, 0x8A32, 0x8A33, 0x8A35, 0x8A37, 0x8A38, 0x8A39, 0x8A3B,
+ 0x8A3C, 0x8A3D, 0x8A3F, 0x8A40, 0x8A42, 0x8A43, 0x8A44, 0x8A45,
+ 0x8A47, 0x8A49, 0x8A4A, 0x8A4B, 0x8A4C, 0x8A4D, 0x8A4F, 0x8A51,
+ 0x8A53, 0x8A56, 0x8A57, 0x8A59, 0x8A5A, 0x8A5C, 0x8A5D, 0x8A5F,
+ 0x8A60, 0x8A64, 0x8A65, 0x8A67, 0x8A68, 0x8A6A, 0x8A6F, 0x8A74,
+ 0x8A76, 0x8A77, 0x8A78, 0x8A7A, 0x8A7B, 0x8A7D, 0x8A7E, 0x8A80,
+ 0x8A81, 0x8A82, 0x8A83, 0x8A88, 0x8A8B, 0x8A8C, 0x8A8E, 0x8A8F,
+ 0x8A90, 0x8A94, 0x8A96, 0x8A97, 0x8A99, 0x8A9B, 0x8A9C, 0x8A9D,
+ 0x8A9F, 0x8AA2, 0x8AA7, 0x8AA9, 0x8AAA, 0x8AAB, 0x8AAD, 0x8AAE,
+ 0x8AAF, 0x8AB1, 0x8AB3, 0x8AB4, 0x8AB5, 0x8AB7, 0x8AB8, 0x8ABA,
+ 0x8ABB, 0x8ABD, 0x8ABE, 0x8AC0, 0x8AC1, 0x8AC3, 0x8AC5, 0x8AC6,
+ 0x8AC8, 0x8ACA, 0x8ACC, 0x8ACE, 0x8AD0, 0x8AD3, 0x8AD4, 0x8AD5,
+ 0x8AD8, 0x8AD9, 0x8ADA, 0x8ADD, 0x8ADF, 0x8AE0, 0x8AE1, 0x8AE3,
+ 0x8AE5, 0x8AE8, 0x8AE9, 0x8AEA, 0x8AEC, 0x8AEF, 0x8AF0, 0x8AF2,
+ 0x8AF4, 0x8AF5, 0x8AF9, 0x8AFB, 0x8AFD, 0x8AFF, 0x8B03, 0x8B06,
+ 0x8B08, 0x8B09, 0x8B0B, 0x8B0C, 0x8B0D, 0x8B0F, 0x8B11, 0x8B12,
+ 0x8B13, 0x8B15, 0x8B18, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B20, 0x8B22,
+ 0x8B23, 0x8B24, 0x8B25, 0x8B27, 0x8B29, 0x8B2A, 0x8B2E, 0x8B2F,
+ 0x8B30, 0x8B31, 0x8B32, 0x8B34, 0x8B35, 0x8B36, 0x8B37, 0x8B38,
+ 0x8B3A, 0x8B3B, 0x8B3C, 0x8B3D, 0x8B3F, 0x8B40, 0x8B41, 0x8B42,
+ 0x8B43, 0x8B44, 0x8B45, 0x8B46, 0x8B47, 0x8B48, 0x8B4A, 0x8B4B,
+ 0x8B4C, 0x8B4D, 0x8B50, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55,
+ 0x8B57, 0x8B5B, 0x8B5D, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62,
+ 0x8B63, 0x8B64, 0x8B65, 0x8B67, 0x8B68, 0x8B69, 0x8B6A, 0x8B6D,
+ 0x8B6E, 0x8B71, 0x8B72, 0x8B73, 0x8B75, 0x8B76, 0x8B78, 0x8B79,
+ 0x8B7A, 0x8B7B, 0x8B7C, 0x8B7E, 0x8B7F, 0x8B81, 0x8B82, 0x8B83,
+ 0x8B84, 0x8B85, 0x8B86, 0x8B87, 0x8B88, 0x8B89, 0x8B8B, 0x8B8C,
+ 0x8B8D, 0x8B8F, 0x8B90, 0x8B91, 0x8B94, 0x8B97, 0x8B98, 0x8B99,
+ 0x8B9A, 0x8B9B, 0x8B9D, 0x8B9F, 0x8BAC, 0x8BB1, 0x8BBB, 0x8BC7,
+ 0x8BD0, 0x8BEA, 0x8C09, 0x8C1E, 0x8C38, 0x8C39, 0x8C3A, 0x8C3B,
+ 0x8C3C, 0x8C3D, 0x8C3E, 0x8C3F, 0x8C40, 0x8C42, 0x8C43, 0x8C44,
+ 0x8C45, 0x8C4A, 0x8C4B, 0x8C4D, 0x8C4E, 0x8C4F, 0x8C51, 0x8C52,
+ 0x8C53, 0x8C54, 0x8C56, 0x8C57, 0x8C58, 0x8C59, 0x8C5B, 0x8C5C,
+ 0x8C5D, 0x8C5E, 0x8C5F, 0x8C60, 0x8C63, 0x8C64, 0x8C65, 0x8C66,
+ 0x8C67, 0x8C68, 0x8C69, 0x8C6C, 0x8C6D, 0x8C6E, 0x8C6F, 0x8C70,
+ 0x8C71, 0x8C72, 0x8C74, 0x8C75, 0x8C76, 0x8C77, 0x8C7B, 0x8C7C,
+ 0x8C7D, 0x8C7E, 0x8C7F, 0x8C80, 0x8C81, 0x8C83, 0x8C84, 0x8C86,
+ 0x8C87, 0x8C88, 0x8C8B, 0x8C8D, 0x8C8E, 0x8C8F, 0x8C90, 0x8C91,
+ 0x8C92, 0x8C93, 0x8C95, 0x8C96, 0x8C97, 0x8C99, 0x8C9A, 0x8C9B,
+ 0x8C9C, 0x8C9F, 0x8CA3, 0x8CA4, 0x8CA5, 0x8CA6, 0x8CAD, 0x8CAE,
+ 0x8CB1, 0x8CB5, 0x8CB9, 0x8CBE, 0x8CC6, 0x8CC9, 0x8CCB, 0x8CCC,
+ 0x8CCD, 0x8CCE, 0x8CCF, 0x8CD0, 0x8CD4, 0x8CD6, 0x8CD7, 0x8CD8,
+ 0x8CD9, 0x8CDB, 0x8CDD, 0x8CDF, 0x8CE5, 0x8CE8, 0x8CE9, 0x8CEE,
+ 0x8CEF, 0x8CF0, 0x8CF1, 0x8CF2, 0x8CF3, 0x8CF5, 0x8CF6, 0x8CF7,
+ 0x8CF8, 0x8CF9, 0x8CFF, 0x8D00, 0x8D01, 0x8D02, 0x8D03, 0x8D06,
+ 0x8D07, 0x8D09, 0x8D0C, 0x8D0E, 0x8D11, 0x8D12, 0x8D13, 0x8D14,
+ 0x8D15, 0x8D17, 0x8D18, 0x8D19, 0x8D1A, 0x8D20, 0x8D51, 0x8D52,
+ 0x8D57, 0x8D5F, 0x8D65, 0x8D68, 0x8D69, 0x8D6A, 0x8D6C, 0x8D6E,
+ 0x8D6F, 0x8D71, 0x8D72, 0x8D78, 0x8D79, 0x8D7A, 0x8D7B, 0x8D7C,
+ 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D82, 0x8D83, 0x8D86, 0x8D87,
+ 0x8D88, 0x8D89, 0x8D8C, 0x8D8D, 0x8D8E, 0x8D8F, 0x8D90, 0x8D92,
+ 0x8D93, 0x8D96, 0x8D97, 0x8D98, 0x8D9A, 0x8D9B, 0x8D9C, 0x8D9D,
+ 0x8D9E, 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA4, 0x8DA5, 0x8DA6, 0x8DA7,
+ 0x8DA9, 0x8DAA, 0x8DAB, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0,
+ 0x8DB6, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DBD, 0x8DC0, 0x8DC1, 0x8DC2,
+ 0x8DC5, 0x8DC7, 0x8DC8, 0x8DC9, 0x8DCA, 0x8DCD, 0x8DD0, 0x8DD2,
+ 0x8DD3, 0x8DD4, 0x8DD5, 0x8DD8, 0x8DD9, 0x8DDC, 0x8DE0, 0x8DE1,
+ 0x8DE2, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE9, 0x8DED, 0x8DEE, 0x8DF0,
+ 0x8DF1, 0x8DF2, 0x8DF4, 0x8DF6, 0x8DFC, 0x8DFE, 0x8DFF, 0x8E00,
+ 0x8E01, 0x8E02, 0x8E03, 0x8E04, 0x8E06, 0x8E07, 0x8E08, 0x8E0B,
+ 0x8E0D, 0x8E0E, 0x8E11, 0x8E12, 0x8E13, 0x8E15, 0x8E16, 0x8E17,
+ 0x8E18, 0x8E19, 0x8E1A, 0x8E1B, 0x8E1C, 0x8E20, 0x8E21, 0x8E24,
+ 0x8E25, 0x8E26, 0x8E27, 0x8E28, 0x8E2B, 0x8E2D, 0x8E30, 0x8E32,
+ 0x8E33, 0x8E36, 0x8E37, 0x8E38, 0x8E3B, 0x8E3C, 0x8E3E, 0x8E3F,
+ 0x8E43, 0x8E45, 0x8E46, 0x8E4D, 0x8E4E, 0x8E4F, 0x8E50, 0x8E53,
+ 0x8E54, 0x8E56, 0x8E57, 0x8E58, 0x8E5A, 0x8E5B, 0x8E5C, 0x8E5D,
+ 0x8E5E, 0x8E5F, 0x8E60, 0x8E61, 0x8E62, 0x8E64, 0x8E65, 0x8E67,
+ 0x8E68, 0x8E6A, 0x8E6B, 0x8E6E, 0x8E71, 0x8E73, 0x8E75, 0x8E77,
+ 0x8E78, 0x8E79, 0x8E7B, 0x8E7D, 0x8E7E, 0x8E80, 0x8E82, 0x8E83,
+ 0x8E84, 0x8E86, 0x8E88, 0x8E8C, 0x8E8E, 0x8E95, 0x8E96, 0x8E97,
+ 0x8E98, 0x8E99, 0x8E9B, 0x8E9D, 0x8E9F, 0x8EA0, 0x8EA2, 0x8EA3,
+ 0x8EA4, 0x8EA7, 0x8EA8, 0x8EA9, 0x8EAD, 0x8EAE, 0x8EB0, 0x8EB1,
+ 0x8EB3, 0x8EB4, 0x8EB5, 0x8EB6, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBB,
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x8EBF, 0x8EC1, 0x8EC2, 0x8EC3, 0x8EC4,
+ 0x8EC5, 0x8EC6, 0x8EC7, 0x8EC8, 0x8EC9, 0x8ECF, 0x8ED0, 0x8ED1,
+ 0x8ED3, 0x8ED5, 0x8ED6, 0x8ED7, 0x8ED8, 0x8ED9, 0x8EDA, 0x8EDC,
+ 0x8EDD, 0x8EDE, 0x8EE0, 0x8EE1, 0x8EE2, 0x8EE3, 0x8EE5, 0x8EE6,
+ 0x8EE7, 0x8EE8, 0x8EE9, 0x8EEA, 0x8EEC, 0x8EED, 0x8EEE, 0x8EEF,
+ 0x8EF0, 0x8EF1, 0x8EF3, 0x8EF4, 0x8EF5, 0x8EF6, 0x8EF7, 0x8EFD,
+ 0x8EFF, 0x8F00, 0x8F01, 0x8F02, 0x8F04, 0x8F06, 0x8F08, 0x8F0B,
+ 0x8F0C, 0x8F0D, 0x8F0E, 0x8F0F, 0x8F10, 0x8F11, 0x8F13, 0x8F16,
+ 0x8F17, 0x8F18, 0x8F19, 0x8F1A, 0x8F20, 0x8F21, 0x8F22, 0x8F23,
+ 0x8F24, 0x8F27, 0x8F28, 0x8F2B, 0x8F2C, 0x8F2D, 0x8F2E, 0x8F30,
+ 0x8F31, 0x8F32, 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F39, 0x8F3A,
+ 0x8F3C, 0x8F3D, 0x8F40, 0x8F41, 0x8F43, 0x8F47, 0x8F48, 0x8F4A,
+ 0x8F4B, 0x8F4C, 0x8F4F, 0x8F50, 0x8F51, 0x8F52, 0x8F53, 0x8F55,
+ 0x8F56, 0x8F57, 0x8F58, 0x8F59, 0x8F5A, 0x8F5B, 0x8F5C, 0x8F5D,
+ 0x8F5E, 0x8F60, 0x8F63, 0x8F65, 0x8F6A, 0x8F80, 0x8F8C, 0x8F92,
+ 0x8F9D, 0x8FA0, 0x8FA1, 0x8FA2, 0x8FA4, 0x8FA5, 0x8FA7, 0x8FAA,
+ 0x8FAC, 0x8FB3, 0x8FB4, 0x8FB5, 0x8FB7, 0x8FB8, 0x8FBA, 0x8FBB,
+ 0x8FBC, 0x8FBF, 0x8FC0, 0x8FC3, 0x8FC6, 0x8FC9, 0x8FCA, 0x8FCB,
+ 0x8FCC, 0x8FCD, 0x8FCF, 0x8FD2, 0x8FD6, 0x8FD7, 0x8FDA, 0x8FE0,
+ 0x8FE1, 0x8FE3, 0x8FE7, 0x8FEC, 0x8FEF, 0x8FF1, 0x8FF2, 0x8FF5,
+ 0x8FF6, 0x8FFA, 0x8FFB, 0x8FFC, 0x8FFE, 0x8FFF, 0x9007, 0x9008,
+ 0x900C, 0x900E, 0x9013, 0x9018, 0x901C, 0x9024, 0x9025, 0x9027,
+ 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x9030, 0x9031, 0x9033,
+ 0x9034, 0x9037, 0x9039, 0x903A, 0x903D, 0x903F, 0x9040, 0x9043,
+ 0x9045, 0x9046, 0x9048, 0x9049, 0x904A, 0x904C, 0x9056, 0x9059,
+ 0x905A, 0x905D, 0x905F, 0x9061, 0x9064, 0x9066, 0x9067, 0x906A,
+ 0x906B, 0x906C, 0x906F, 0x9070, 0x9071, 0x9073, 0x9076, 0x9079,
+ 0x907B, 0x907E, 0x9085, 0x9086, 0x9089, 0x908C, 0x908D, 0x908E,
+ 0x9092, 0x9094, 0x9096, 0x9098, 0x909A, 0x909C, 0x909E, 0x909F,
+ 0x90A0, 0x90A4, 0x90A5, 0x90A7, 0x90A8, 0x90A9, 0x90AB, 0x90AD,
+ 0x90B2, 0x90B7, 0x90BC, 0x90BD, 0x90BF, 0x90C0, 0x90C2, 0x90C3,
+ 0x90C6, 0x90C8, 0x90C9, 0x90CB, 0x90CC, 0x90CD, 0x90D2, 0x90D4,
+ 0x90D5, 0x90D6, 0x90D8, 0x90D9, 0x90DA, 0x90DE, 0x90E0, 0x90E3,
+ 0x90E4, 0x90E5, 0x90E9, 0x90EA, 0x90EC, 0x90EE, 0x90F0, 0x90F1,
+ 0x90F2, 0x90F3, 0x90F6, 0x90F7, 0x90F9, 0x90FA, 0x90FB, 0x90FC,
+ 0x90FF, 0x9100, 0x9101, 0x9103, 0x9105, 0x9107, 0x9108, 0x910A,
+ 0x910B, 0x910C, 0x910D, 0x910E, 0x910F, 0x9110, 0x9111, 0x9113,
+ 0x9115, 0x9117, 0x9118, 0x911A, 0x911B, 0x911C, 0x911D, 0x911F,
+ 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9128, 0x9129, 0x912A,
+ 0x912B, 0x912C, 0x912E, 0x9133, 0x9135, 0x9137, 0x9138, 0x913B,
+ 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9144,
+ 0x9145, 0x9147, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156, 0x9158,
+ 0x9159, 0x915B, 0x915C, 0x915F, 0x9160, 0x9166, 0x9167, 0x9168,
+ 0x916B, 0x916D, 0x9173, 0x917A, 0x917B, 0x917C, 0x9180, 0x9181,
+ 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918A, 0x918E, 0x918F,
+ 0x9193, 0x9194, 0x9195, 0x9197, 0x9198, 0x9199, 0x919D, 0x919E,
+ 0x919F, 0x91A0, 0x91A1, 0x91A4, 0x91A5, 0x91A6, 0x91A7, 0x91A8,
+ 0x91A9, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B6, 0x91B7, 0x91B8,
+ 0x91B9, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C2, 0x91C4,
+ 0x91C6, 0x91C8, 0x91D0, 0x91D6, 0x91DA, 0x91DB, 0x91DE, 0x91DF,
+ 0x91E0, 0x91E1, 0x91E2, 0x91E5, 0x91E6, 0x91E8, 0x91EA, 0x91EB,
+ 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3,
+ 0x91F4, 0x91F6, 0x91F8, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF,
+ 0x9202, 0x9203, 0x9205, 0x9206, 0x9207, 0x920A, 0x920B, 0x920C,
+ 0x920F, 0x9212, 0x9213, 0x9216, 0x9217, 0x9218, 0x9219, 0x921A,
+ 0x921B, 0x921C, 0x921D, 0x921F, 0x9220, 0x9221, 0x9222, 0x9224,
+ 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922F, 0x9231,
+ 0x9232, 0x9235, 0x9236, 0x923B, 0x923C, 0x9241, 0x9242, 0x9243,
+ 0x9244, 0x9246, 0x9247, 0x924A, 0x924B, 0x924C, 0x924E, 0x924F,
+ 0x9250, 0x9252, 0x9253, 0x9254, 0x9256, 0x9258, 0x9259, 0x925C,
+ 0x925D, 0x925F, 0x9260, 0x9261, 0x9263, 0x9264, 0x9265, 0x9267,
+ 0x9268, 0x9269, 0x926A, 0x926B, 0x926E, 0x926F, 0x9270, 0x9271,
+ 0x9272, 0x9273, 0x9275, 0x9276, 0x9277, 0x9279, 0x927C, 0x927D,
+ 0x927E, 0x9281, 0x9282, 0x9284, 0x9286, 0x9287, 0x9288, 0x9289,
+ 0x928A, 0x928B, 0x928C, 0x928D, 0x928F, 0x9290, 0x9292, 0x9294,
+ 0x9295, 0x9297, 0x9299, 0x929B, 0x929D, 0x929E, 0x929F, 0x92A1,
+ 0x92A2, 0x92A4, 0x92A7, 0x92AD, 0x92AF, 0x92B0, 0x92B2, 0x92B3,
+ 0x92B4, 0x92B5, 0x92B6, 0x92B8, 0x92BA, 0x92BD, 0x92BE, 0x92BF,
+ 0x92C0, 0x92C2, 0x92C4, 0x92C6, 0x92C9, 0x92CA, 0x92CB, 0x92CD,
+ 0x92CE, 0x92D0, 0x92D1, 0x92D3, 0x92D4, 0x92D5, 0x92D6, 0x92D7,
+ 0x92D8, 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DE, 0x92E0, 0x92E1,
+ 0x92E2, 0x92E7, 0x92E9, 0x92EB, 0x92EC, 0x92F2, 0x92F3, 0x92F4,
+ 0x92F5, 0x92F7, 0x92F9, 0x92FA, 0x92FB, 0x92FD, 0x92FE, 0x92FF,
+ 0x9300, 0x9302, 0x9303, 0x9304, 0x9305, 0x9309, 0x930A, 0x930B,
+ 0x930C, 0x930D, 0x930E, 0x930F, 0x9311, 0x9313, 0x9314, 0x9316,
+ 0x9317, 0x931C, 0x931D, 0x931E, 0x9321, 0x9323, 0x9324, 0x9325,
+ 0x9327, 0x9329, 0x932A, 0x932C, 0x932D, 0x9330, 0x9331, 0x9334,
+ 0x9335, 0x9337, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933F,
+ 0x9342, 0x9344, 0x9345, 0x9348, 0x9349, 0x934A, 0x934C, 0x934E,
+ 0x934F, 0x9350, 0x9351, 0x9352, 0x9353, 0x9355, 0x9356, 0x9357,
+ 0x9359, 0x935A, 0x935C, 0x935D, 0x935E, 0x935F, 0x9360, 0x9361,
+ 0x9362, 0x9363, 0x9366, 0x9367, 0x9368, 0x936B, 0x936D, 0x936E,
+ 0x936F, 0x9371, 0x9372, 0x9373, 0x9374, 0x9377, 0x9378, 0x9379,
+ 0x937B, 0x937C, 0x937D, 0x937F, 0x9380, 0x9381, 0x9383, 0x9385,
+ 0x9386, 0x9388, 0x9389, 0x938B, 0x938C, 0x938D, 0x938E, 0x9390,
+ 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9397, 0x9399, 0x939A,
+ 0x939B, 0x939C, 0x939D, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x93A4,
+ 0x93A5, 0x93A8, 0x93AB, 0x93AD, 0x93AF, 0x93B1, 0x93B2, 0x93B4,
+ 0x93B6, 0x93B7, 0x93B9, 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE,
+ 0x93C0, 0x93C1, 0x93C2, 0x93C4, 0x93C5, 0x93C6, 0x93C9, 0x93CB,
+ 0x93CE, 0x93CF, 0x93D0, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D9,
+ 0x93DA, 0x93DB, 0x93E0, 0x93E3, 0x93E5, 0x93E6, 0x93E7, 0x93E9,
+ 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1,
+ 0x93F2, 0x93F3, 0x93F4, 0x93F6, 0x93F8, 0x93FA, 0x93FB, 0x93FC,
+ 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9404, 0x9405,
+ 0x9406, 0x9407, 0x9408, 0x9409, 0x940A, 0x940C, 0x940D, 0x940E,
+ 0x940F, 0x9411, 0x9415, 0x9416, 0x9417, 0x941A, 0x941B, 0x941C,
+ 0x941E, 0x941F, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9429,
+ 0x942A, 0x942B, 0x942C, 0x942D, 0x942F, 0x9430, 0x9431, 0x9434,
+ 0x9436, 0x9437, 0x9439, 0x943B, 0x943C, 0x943D, 0x9440, 0x9441,
+ 0x9442, 0x9443, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944B,
+ 0x944D, 0x944E, 0x944F, 0x9450, 0x9451, 0x9453, 0x9455, 0x9456,
+ 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D, 0x945E,
+ 0x945F, 0x9461, 0x9462, 0x9464, 0x9466, 0x9467, 0x9468, 0x9469,
+ 0x946A, 0x946C, 0x946E, 0x946F, 0x9471, 0x9473, 0x9474, 0x9475,
+ 0x9476, 0x9478, 0x947A, 0x947B, 0x9480, 0x9481, 0x9482, 0x9483,
+ 0x9484, 0x9491, 0x9496, 0x9498, 0x94C7, 0x94CF, 0x94D3, 0x94D4,
+ 0x94DA, 0x94E6, 0x94FB, 0x951C, 0x9520, 0x9527, 0x9533, 0x953D,
+ 0x9543, 0x9548, 0x954B, 0x9555, 0x955A, 0x9560, 0x956E, 0x9574,
+ 0x9575, 0x9578, 0x9579, 0x957A, 0x957B, 0x957C, 0x957D, 0x957E,
+ 0x9581, 0x9584, 0x9585, 0x9587, 0x9588, 0x958A, 0x958D, 0x9590,
+ 0x9592, 0x9595, 0x9596, 0x9597, 0x9599, 0x959A, 0x959B, 0x959C,
+ 0x959D, 0x959E, 0x959F, 0x95A0, 0x95A2, 0x95A6, 0x95A7, 0x95AA,
+ 0x95AE, 0x95AF, 0x95B0, 0x95B1, 0x95B3, 0x95B4, 0x95B5, 0x95B7,
+ 0x95B8, 0x95BA, 0x95C0, 0x95C1, 0x95C2, 0x95C4, 0x95C5, 0x95C7,
+ 0x95C9, 0x95CD, 0x95CE, 0x95CF, 0x95D1, 0x95D2, 0x95D3, 0x95D7,
+ 0x95D8, 0x95D9, 0x95DA, 0x95DB, 0x95DD, 0x95DF, 0x95E0, 0x95E3,
+ 0x95E4, 0x95E6, 0x95E7, 0x95EC, 0x95FF, 0x9607, 0x9613, 0x9618,
+ 0x961B, 0x961E, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626, 0x9627,
+ 0x9628, 0x9629, 0x962B, 0x962C, 0x962D, 0x962F, 0x9630, 0x9637,
+ 0x9638, 0x9639, 0x963A, 0x963E, 0x9641, 0x9643, 0x964A, 0x964E,
+ 0x964F, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9659, 0x965A,
+ 0x965C, 0x965E, 0x9660, 0x9665, 0x9666, 0x966B, 0x966D, 0x966E,
+ 0x966F, 0x9671, 0x9679, 0x967A, 0x967B, 0x967C, 0x967E, 0x967F,
+ 0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968C,
+ 0x9691, 0x9692, 0x9693, 0x9696, 0x969A, 0x969D, 0x969E, 0x969F,
+ 0x96A0, 0x96A1, 0x96A2, 0x96A3, 0x96A4, 0x96A5, 0x96A6, 0x96A9,
+ 0x96AB, 0x96AC, 0x96AD, 0x96AE, 0x96AF, 0x96B2, 0x96B5, 0x96B7,
+ 0x96BA, 0x96BF, 0x96C2, 0x96C3, 0x96C8, 0x96CA, 0x96CB, 0x96D0,
+ 0x96D1, 0x96D3, 0x96D4, 0x96D7, 0x96D8, 0x96DA, 0x96DD, 0x96DE,
+ 0x96DF, 0x96E1, 0x96E4, 0x96E5, 0x96E6, 0x96E7, 0x96EB, 0x96EC,
+ 0x96ED, 0x96EE, 0x96F0, 0x96F1, 0x96F4, 0x96F5, 0x96F8, 0x96FA,
+ 0x96FC, 0x96FD, 0x96FF, 0x9702, 0x9703, 0x9705, 0x970A, 0x970B,
+ 0x970C, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715, 0x9717, 0x9718,
+ 0x9719, 0x971A, 0x971B, 0x971D, 0x971F, 0x9720, 0x9721, 0x9722,
+ 0x9723, 0x9724, 0x9725, 0x9726, 0x9728, 0x9729, 0x972B, 0x972C,
+ 0x972E, 0x972F, 0x9731, 0x9733, 0x9734, 0x9735, 0x9736, 0x9737,
+ 0x973A, 0x973B, 0x973C, 0x973F, 0x9740, 0x9741, 0x9743, 0x9745,
+ 0x9746, 0x9747, 0x9749, 0x974A, 0x974B, 0x974C, 0x974D, 0x974E,
+ 0x974F, 0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975C,
+ 0x975D, 0x975F, 0x9763, 0x9764, 0x9766, 0x9767, 0x976A, 0x976B,
+ 0x976C, 0x976D, 0x976E, 0x976F, 0x9770, 0x9771, 0x9772, 0x9775,
+ 0x9777, 0x9778, 0x9779, 0x977A, 0x977B, 0x977D, 0x977E, 0x977F,
+ 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787, 0x9788,
+ 0x9789, 0x978A, 0x978C, 0x978E, 0x9790, 0x9793, 0x9795, 0x9796,
+ 0x9797, 0x9799, 0x979A, 0x979B, 0x979C, 0x979D, 0x979E, 0x979F,
+ 0x97A1, 0x97A2, 0x97A4, 0x97A5, 0x97A7, 0x97A8, 0x97A9, 0x97AA,
+ 0x97AC, 0x97AE, 0x97B0, 0x97B1, 0x97B3, 0x97B5, 0x97B6, 0x97B7,
+ 0x97B8, 0x97B9, 0x97BA, 0x97BB, 0x97BC, 0x97BE, 0x97BF, 0x97C0,
+ 0x97C1, 0x97C2, 0x97C4, 0x97C5, 0x97C7, 0x97C8, 0x97CA, 0x97CD,
+ 0x97CE, 0x97CF, 0x97D0, 0x97D1, 0x97D2, 0x97D4, 0x97D5, 0x97D6,
+ 0x97D7, 0x97D8, 0x97DA, 0x97DB, 0x97DD, 0x97DF, 0x97E0, 0x97E1,
+ 0x97E2, 0x97E3, 0x97E4, 0x97E5, 0x97E8, 0x97EE, 0x97EF, 0x97F0,
+ 0x97F1, 0x97F2, 0x97F4, 0x97F7, 0x97F8, 0x97F9, 0x97FA, 0x97FB,
+ 0x97FC, 0x97FD, 0x97FE, 0x9800, 0x9804, 0x9809, 0x980B, 0x980D,
+ 0x9814, 0x9815, 0x9816, 0x9819, 0x981A, 0x981B, 0x981D, 0x981E,
+ 0x981F, 0x9820, 0x9822, 0x9823, 0x9825, 0x9827, 0x9828, 0x9829,
+ 0x982A, 0x982B, 0x982C, 0x982E, 0x982F, 0x9831, 0x9832, 0x9833,
+ 0x9834, 0x9835, 0x9836, 0x9839, 0x983A, 0x983C, 0x983E, 0x983F,
+ 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9847, 0x9848,
+ 0x9849, 0x984A, 0x984B, 0x984F, 0x9850, 0x9851, 0x9852, 0x9855,
+ 0x9856, 0x9857, 0x985A, 0x985C, 0x985D, 0x985F, 0x9860, 0x9861,
+ 0x9863, 0x9864, 0x9866, 0x9868, 0x9869, 0x986A, 0x986D, 0x986E,
+ 0x9872, 0x988B, 0x988E, 0x9892, 0x9895, 0x9899, 0x98A3, 0x98A9,
+ 0x98AA, 0x98AB, 0x98AC, 0x98AD, 0x98B0, 0x98B2, 0x98B4, 0x98B5,
+ 0x98B7, 0x98B8, 0x98B9, 0x98BA, 0x98BB, 0x98BD, 0x98BE, 0x98BF,
+ 0x98C0, 0x98C1, 0x98C2, 0x98C3, 0x98C5, 0x98C7, 0x98C9, 0x98CA,
+ 0x98CB, 0x98CC, 0x98CD, 0x98CF, 0x98D0, 0x98D4, 0x98D6, 0x98D7,
+ 0x98DC, 0x98DD, 0x98E1, 0x98E3, 0x98E4, 0x98E5, 0x98E6, 0x98EC,
+ 0x98EE, 0x98F0, 0x98F1, 0x98F3, 0x98F5, 0x98F6, 0x98F7, 0x98F8,
+ 0x98F9, 0x98FA, 0x98FB, 0x98FF, 0x9900, 0x9901, 0x9902, 0x9904,
+ 0x9906, 0x9907, 0x9908, 0x990B, 0x990E, 0x990F, 0x9914, 0x9915,
+ 0x9916, 0x9917, 0x9919, 0x991A, 0x991C, 0x991D, 0x991F, 0x9920,
+ 0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9929, 0x992A,
+ 0x992B, 0x992C, 0x992D, 0x992F, 0x9930, 0x9931, 0x9932, 0x9934,
+ 0x9935, 0x9936, 0x9938, 0x9939, 0x993A, 0x993B, 0x993D, 0x9940,
+ 0x9941, 0x9942, 0x9944, 0x9946, 0x9947, 0x994D, 0x994E, 0x994F,
+ 0x9950, 0x9953, 0x9956, 0x9958, 0x9959, 0x995A, 0x995B, 0x995D,
+ 0x995F, 0x9960, 0x9961, 0x9964, 0x9966, 0x9973, 0x9978, 0x9979,
+ 0x997B, 0x997E, 0x9982, 0x9983, 0x9989, 0x998C, 0x998E, 0x999A,
+ 0x999B, 0x999C, 0x999D, 0x999E, 0x999F, 0x99A0, 0x99A1, 0x99A2,
+ 0x99A3, 0x99A4, 0x99A6, 0x99A7, 0x99A9, 0x99AA, 0x99AB, 0x99AF,
+ 0x99B0, 0x99B2, 0x99B5, 0x99B6, 0x99B7, 0x99B8, 0x99B9, 0x99BA,
+ 0x99BB, 0x99BC, 0x99BD, 0x99BE, 0x99BF, 0x99C0, 0x99C2, 0x99C3,
+ 0x99C4, 0x99C5, 0x99C6, 0x99C7, 0x99C8, 0x99C9, 0x99CA, 0x99CB,
+ 0x99CC, 0x99CD, 0x99CE, 0x99CF, 0x99D3, 0x99D6, 0x99D7, 0x99DA,
+ 0x99DC, 0x99DE, 0x99E0, 0x99E3, 0x99E4, 0x99E5, 0x99E6, 0x99E7,
+ 0x99E8, 0x99E9, 0x99EA, 0x99EB, 0x99EC, 0x99EE, 0x99EF, 0x99F0,
+ 0x99F2, 0x99F3, 0x99F4, 0x99F5, 0x99F6, 0x99F7, 0x99F8, 0x99F9,
+ 0x99FA, 0x99FB, 0x99FC, 0x99FD, 0x99FE, 0x9A00, 0x9A02, 0x9A03,
+ 0x9A04, 0x9A06, 0x9A07, 0x9A08, 0x9A09, 0x9A0A, 0x9A0B, 0x9A0C,
+ 0x9A10, 0x9A11, 0x9A12, 0x9A13, 0x9A14, 0x9A15, 0x9A17, 0x9A18,
+ 0x9A1A, 0x9A1B, 0x9A1C, 0x9A1D, 0x9A1E, 0x9A1F, 0x9A20, 0x9A21,
+ 0x9A22, 0x9A23, 0x9A24, 0x9A25, 0x9A26, 0x9A27, 0x9A28, 0x9A29,
+ 0x9A2A, 0x9A2C, 0x9A2F, 0x9A31, 0x9A32, 0x9A33, 0x9A34, 0x9A35,
+ 0x9A39, 0x9A3A, 0x9A3B, 0x9A3C, 0x9A3D, 0x9A3F, 0x9A46, 0x9A47,
+ 0x9A48, 0x9A49, 0x9A4B, 0x9A4C, 0x9A4E, 0x9A50, 0x9A51, 0x9A52,
+ 0x9A53, 0x9A54, 0x9A56, 0x9A58, 0x9A59, 0x9A5C, 0x9A5D, 0x9A5E,
+ 0x9A60, 0x9A61, 0x9A63, 0x9A66, 0x9A67, 0x9A68, 0x9A69, 0x9A6B,
+ 0x9A72, 0x9A83, 0x9A89, 0x9A8D, 0x9A8E, 0x9A94, 0x9A95, 0x9A99,
+ 0x9AA6, 0x9AA9, 0x9AAA, 0x9AAB, 0x9AAC, 0x9AAD, 0x9AAE, 0x9AB2,
+ 0x9AB3, 0x9AB4, 0x9AB5, 0x9AB9, 0x9ABB, 0x9ABD, 0x9ABE, 0x9ABF,
+ 0x9AC3, 0x9AC4, 0x9AC6, 0x9AC7, 0x9AC8, 0x9AC9, 0x9ACA, 0x9ACD,
+ 0x9ACE, 0x9AD0, 0x9AD7, 0x9AD9, 0x9ADA, 0x9ADB, 0x9ADC, 0x9ADD,
+ 0x9ADE, 0x9AE0, 0x9AE2, 0x9AE3, 0x9AE4, 0x9AE5, 0x9AE7, 0x9AE8,
+ 0x9AE9, 0x9AEA, 0x9AEC, 0x9AF0, 0x9AF1, 0x9AF2, 0x9AF3, 0x9AF4,
+ 0x9AF5, 0x9AF6, 0x9AF7, 0x9AF8, 0x9AFA, 0x9AFC, 0x9AFD, 0x9AFE,
+ 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B04, 0x9B05, 0x9B07, 0x9B09,
+ 0x9B0A, 0x9B0B, 0x9B0C, 0x9B0E, 0x9B10, 0x9B11, 0x9B12, 0x9B14,
+ 0x9B15, 0x9B16, 0x9B17, 0x9B18, 0x9B19, 0x9B1B, 0x9B1C, 0x9B1D,
+ 0x9B1E, 0x9B20, 0x9B21, 0x9B24, 0x9B26, 0x9B28, 0x9B2A, 0x9B2B,
+ 0x9B2C, 0x9B2D, 0x9B30, 0x9B33, 0x9B34, 0x9B35, 0x9B36, 0x9B37,
+ 0x9B38, 0x9B39, 0x9B3A, 0x9B3D, 0x9B3E, 0x9B3F, 0x9B40, 0x9B46,
+ 0x9B4A, 0x9B4B, 0x9B4C, 0x9B50, 0x9B52, 0x9B53, 0x9B55, 0x9B56,
+ 0x9B57, 0x9B59, 0x9B5B, 0x9B5C, 0x9B5D, 0x9B5E, 0x9B5F, 0x9B60,
+ 0x9B61, 0x9B62, 0x9B63, 0x9B64, 0x9B65, 0x9B66, 0x9B67, 0x9B68,
+ 0x9B69, 0x9B6A, 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B70, 0x9B71,
+ 0x9B72, 0x9B73, 0x9B75, 0x9B76, 0x9B78, 0x9B79, 0x9B7A, 0x9B7B,
+ 0x9B7C, 0x9B7D, 0x9B7E, 0x9B7F, 0x9B80, 0x9B82, 0x9B84, 0x9B85,
+ 0x9B86, 0x9B87, 0x9B88, 0x9B89, 0x9B8A, 0x9B8B, 0x9B8C, 0x9B8D,
+ 0x9B8F, 0x9B93, 0x9B94, 0x9B95, 0x9B96, 0x9B97, 0x9B98, 0x9B99,
+ 0x9B9B, 0x9B9C, 0x9B9F, 0x9BA0, 0x9BA1, 0x9BA2, 0x9BA3, 0x9BA4,
+ 0x9BA5, 0x9BA6, 0x9BA7, 0x9BA8, 0x9BA9, 0x9BAC, 0x9BAF, 0x9BB0,
+ 0x9BB1, 0x9BB2, 0x9BB3, 0x9BB4, 0x9BB5, 0x9BB6, 0x9BB7, 0x9BB8,
+ 0x9BB9, 0x9BBA, 0x9BBB, 0x9BBC, 0x9BBD, 0x9BBE, 0x9BBF, 0x9BC2,
+ 0x9BC3, 0x9BC4, 0x9BC5, 0x9BC6, 0x9BC8, 0x9BCB, 0x9BCC, 0x9BCD,
+ 0x9BCE, 0x9BCF, 0x9BD0, 0x9BD1, 0x9BD2, 0x9BD3, 0x9BD5, 0x9BD7,
+ 0x9BD8, 0x9BD9, 0x9BDA, 0x9BDC, 0x9BDE, 0x9BDF, 0x9BE0, 0x9BE3,
+ 0x9BE5, 0x9BE6, 0x9BE9, 0x9BEC, 0x9BED, 0x9BEE, 0x9BEF, 0x9BF1,
+ 0x9BF2, 0x9BF3, 0x9BF5, 0x9BF6, 0x9BF7, 0x9BF8, 0x9BF9, 0x9BFA,
+ 0x9BFB, 0x9BFC, 0x9BFE, 0x9C00, 0x9C01, 0x9C02, 0x9C03, 0x9C04,
+ 0x9C05, 0x9C06, 0x9C07, 0x9C0A, 0x9C0B, 0x9C0C, 0x9C0E, 0x9C0F,
+ 0x9C11, 0x9C14, 0x9C15, 0x9C16, 0x9C17, 0x9C18, 0x9C19, 0x9C1A,
+ 0x9C1B, 0x9C1C, 0x9C1D, 0x9C1E, 0x9C1F, 0x9C21, 0x9C22, 0x9C24,
+ 0x9C26, 0x9C27, 0x9C2A, 0x9C2B, 0x9C2C, 0x9C2E, 0x9C2F, 0x9C30,
+ 0x9C34, 0x9C36, 0x9C38, 0x9C3A, 0x9C3C, 0x9C3D, 0x9C3F, 0x9C40,
+ 0x9C41, 0x9C42, 0x9C43, 0x9C44, 0x9C46, 0x9C47, 0x9C4A, 0x9C4B,
+ 0x9C4C, 0x9C4D, 0x9C4E, 0x9C4F, 0x9C50, 0x9C51, 0x9C53, 0x9C55,
+ 0x9C59, 0x9C5A, 0x9C5B, 0x9C5C, 0x9C5E, 0x9C60, 0x9C61, 0x9C62,
+ 0x9C63, 0x9C64, 0x9C65, 0x9C66, 0x9C68, 0x9C69, 0x9C6A, 0x9C6B,
+ 0x9C6C, 0x9C6E, 0x9C6F, 0x9C70, 0x9C71, 0x9C72, 0x9C73, 0x9C74,
+ 0x9C75, 0x9C76, 0x9C77, 0x9C79, 0x9C7B, 0x9C7D, 0x9C7E, 0x9C80,
+ 0x9C83, 0x9C84, 0x9C89, 0x9C8A, 0x9C8C, 0x9C8F, 0x9C93, 0x9C96,
+ 0x9C97, 0x9C98, 0x9C99, 0x9C9D, 0x9CAA, 0x9CAC, 0x9CAF, 0x9CB9,
+ 0x9CBE, 0x9CBF, 0x9CC0, 0x9CC1, 0x9CC2, 0x9CC8, 0x9CC9, 0x9CD1,
+ 0x9CD2, 0x9CDA, 0x9CDB, 0x9CE0, 0x9CE1, 0x9CE3, 0x9CE4, 0x9CE6,
+ 0x9CE7, 0x9CE8, 0x9CEA, 0x9CEB, 0x9CED, 0x9CEE, 0x9CEF, 0x9CF0,
+ 0x9CF1, 0x9CF2, 0x9CF5, 0x9CF7, 0x9CF8, 0x9CF9, 0x9CFA, 0x9CFB,
+ 0x9CFC, 0x9CFD, 0x9CFE, 0x9CFF, 0x9D00, 0x9D01, 0x9D02, 0x9D03,
+ 0x9D04, 0x9D05, 0x9D08, 0x9D0A, 0x9D0B, 0x9D0C, 0x9D0D, 0x9D0E,
+ 0x9D0F, 0x9D10, 0x9D11, 0x9D12, 0x9D13, 0x9D14, 0x9D16, 0x9D17,
+ 0x9D18, 0x9D19, 0x9D1A, 0x9D1C, 0x9D1E, 0x9D20, 0x9D21, 0x9D22,
+ 0x9D24, 0x9D25, 0x9D27, 0x9D29, 0x9D2A, 0x9D2B, 0x9D2C, 0x9D2D,
+ 0x9D2E, 0x9D31, 0x9D32, 0x9D33, 0x9D34, 0x9D35, 0x9D36, 0x9D37,
+ 0x9D38, 0x9D39, 0x9D3A, 0x9D3C, 0x9D3D, 0x9D3E, 0x9D40, 0x9D41,
+ 0x9D43, 0x9D44, 0x9D45, 0x9D46, 0x9D47, 0x9D48, 0x9D49, 0x9D4A,
+ 0x9D4B, 0x9D4C, 0x9D4D, 0x9D4E, 0x9D4F, 0x9D50, 0x9D54, 0x9D55,
+ 0x9D56, 0x9D57, 0x9D58, 0x9D59, 0x9D5A, 0x9D5B, 0x9D5E, 0x9D5F,
+ 0x9D62, 0x9D63, 0x9D64, 0x9D65, 0x9D66, 0x9D67, 0x9D68, 0x9D69,
+ 0x9D6B, 0x9D6D, 0x9D6E, 0x9D70, 0x9D71, 0x9D73, 0x9D74, 0x9D75,
+ 0x9D76, 0x9D77, 0x9D78, 0x9D79, 0x9D7A, 0x9D7B, 0x9D7C, 0x9D7D,
+ 0x9D7E, 0x9D7F, 0x9D80, 0x9D81, 0x9D82, 0x9D83, 0x9D84, 0x9D85,
+ 0x9D86, 0x9D88, 0x9D8A, 0x9D8B, 0x9D8C, 0x9D8D, 0x9D8E, 0x9D8F,
+ 0x9D90, 0x9D91, 0x9D92, 0x9D94, 0x9D95, 0x9D96, 0x9D97, 0x9D99,
+ 0x9D9B, 0x9D9C, 0x9D9D, 0x9D9E, 0x9D9F, 0x9DA0, 0x9DA1, 0x9DA2,
+ 0x9DA3, 0x9DA4, 0x9DA6, 0x9DA7, 0x9DA8, 0x9DAA, 0x9DAB, 0x9DAC,
+ 0x9DAD, 0x9DAE, 0x9DB0, 0x9DB1, 0x9DB2, 0x9DB3, 0x9DB5, 0x9DB6,
+ 0x9DB7, 0x9DB8, 0x9DB9, 0x9DBA, 0x9DBD, 0x9DBE, 0x9DBF, 0x9DC1,
+ 0x9DC3, 0x9DC5, 0x9DC6, 0x9DC7, 0x9DC8, 0x9DC9, 0x9DCA, 0x9DCB,
+ 0x9DCC, 0x9DCD, 0x9DCE, 0x9DCF, 0x9DD0, 0x9DD1, 0x9DD2, 0x9DD4,
+ 0x9DD5, 0x9DD6, 0x9DD8, 0x9DDB, 0x9DDC, 0x9DDD, 0x9DDE, 0x9DDF,
+ 0x9DE0, 0x9DE1, 0x9DE2, 0x9DE3, 0x9DE4, 0x9DE7, 0x9DE8, 0x9DE9,
+ 0x9DEA, 0x9DEB, 0x9DEC, 0x9DED, 0x9DEE, 0x9DF0, 0x9DF1, 0x9DF4,
+ 0x9DF5, 0x9DF6, 0x9DF7, 0x9DFB, 0x9DFC, 0x9DFD, 0x9DFE, 0x9DFF,
+ 0x9E00, 0x9E01, 0x9E02, 0x9E03, 0x9E04, 0x9E05, 0x9E06, 0x9E07,
+ 0x9E08, 0x9E09, 0x9E0A, 0x9E0B, 0x9E0D, 0x9E0E, 0x9E0F, 0x9E10,
+ 0x9E11, 0x9E12, 0x9E13, 0x9E14, 0x9E16, 0x9E17, 0x9E18, 0x9E19,
+ 0x9E1C, 0x9E24, 0x9E27, 0x9E2E, 0x9E30, 0x9E34, 0x9E3B, 0x9E3C,
+ 0x9E40, 0x9E4D, 0x9E50, 0x9E52, 0x9E53, 0x9E54, 0x9E56, 0x9E59,
+ 0x9E5D, 0x9E5F, 0x9E60, 0x9E61, 0x9E62, 0x9E65, 0x9E6E, 0x9E6F,
+ 0x9E72, 0x9E74, 0x9E76, 0x9E77, 0x9E78, 0x9E7B, 0x9E80, 0x9E81,
+ 0x9E83, 0x9E84, 0x9E85, 0x9E86, 0x9E89, 0x9E8A, 0x9E8C, 0x9E8D,
+ 0x9E8E, 0x9E8F, 0x9E90, 0x9E91, 0x9E94, 0x9E95, 0x9E96, 0x9E98,
+ 0x9E99, 0x9E9A, 0x9E9B, 0x9E9C, 0x9E9E, 0x9EA0, 0x9EA1, 0x9EA2,
+ 0x9EA3, 0x9EA4, 0x9EA7, 0x9EA8, 0x9EAA, 0x9EAB, 0x9EAC, 0x9EAD,
+ 0x9EAE, 0x9EB0, 0x9EB1, 0x9EB2, 0x9EB3, 0x9EB6, 0x9EB7, 0x9EB9,
+ 0x9EBA, 0x9EBC, 0x9EBF, 0x9EC0, 0x9EC1, 0x9EC2, 0x9EC3, 0x9EC5,
+ 0x9EC6, 0x9EC7, 0x9EC8, 0x9ECA, 0x9ECB, 0x9ED0, 0x9ED2, 0x9ED3,
+ 0x9ED5, 0x9ED6, 0x9ED7, 0x9ED9, 0x9EDA, 0x9EE1, 0x9EE3, 0x9EE4,
+ 0x9EE6, 0x9EEB, 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF3,
+ 0x9EF5, 0x9EF6, 0x9EF8, 0x9EFA, 0x9F00, 0x9F01, 0x9F02, 0x9F03,
+ 0x9F04, 0x9F05, 0x9F06, 0x9F07, 0x9F08, 0x9F0A, 0x9F0C, 0x9F0F,
+ 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F18, 0x9F1A, 0x9F1B, 0x9F1C,
+ 0x9F1D, 0x9F1E, 0x9F1F, 0x9F21, 0x9F23, 0x9F24, 0x9F25, 0x9F26,
+ 0x9F27, 0x9F28, 0x9F29, 0x9F2A, 0x9F2B, 0x9F2D, 0x9F2E, 0x9F30,
+ 0x9F31, 0x9F32, 0x9F33, 0x9F34, 0x9F35, 0x9F36, 0x9F38, 0x9F3A,
+ 0x9F3C, 0x9F3F, 0x9F40, 0x9F41, 0x9F42, 0x9F43, 0x9F45, 0x9F46,
+ 0x9F47, 0x9F48, 0x9F49, 0x9F4C, 0x9F4D, 0x9F4E, 0x9F53, 0x9F55,
+ 0x9F56, 0x9F57, 0x9F58, 0x9F5A, 0x9F5B, 0x9F5D, 0x9F5E, 0x9F62,
+ 0x9F64, 0x9F65, 0x9F67, 0x9F68, 0x9F69, 0x9F6B, 0x9F6D, 0x9F6E,
+ 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F74, 0x9F75, 0x9F76, 0x9F78,
+ 0x9F79, 0x9F7A, 0x9F7B, 0x9F7C, 0x9F7D, 0x9F7E, 0x9F81, 0x9F82,
+ 0x9F8E, 0x9F8F, 0x9F91, 0x9F92, 0x9F93, 0x9F96, 0x9F97, 0x9F98,
+ 0x9F9D, 0x9F9E, 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA4, 0x9FA5, 0xF92C,
+ 0xFA0D, 0xFA0E, 0xFA0F, 0xFA11, 0xFA13, 0xFA14, 0xFA18, 0xFA1F,
+ 0xFA20, 0xFA21, 0xFA23, 0xFA24, 0xFA27, 0xFA28, 0xFA29, 0x2E81,
+ 0x0000, 0x0000, 0x0000, 0x2E84, 0x3473, 0x3447, 0x2E88, 0x2E8B,
+ 0x9FB4, 0x359E, 0x361A, 0x360E, 0x2E8C, 0x2E97, 0x396E, 0x3918,
+ 0x9FB5, 0x39CF, 0x39DF, 0x3A73, 0x39D0, 0x9FB6, 0x9FB7, 0x3B4E,
+ 0x3C6E, 0x3CE0, 0x2EA7, 0x0000, 0x9FB8, 0x2EAA, 0x4056, 0x415F,
+ 0x2EAE, 0x4337, 0x2EB3, 0x2EB6, 0x2EB7, 0x0000, 0x43B1, 0x43AC,
+ 0x2EBB, 0x43DD, 0x44D6, 0x4661, 0x464C, 0x9FB9, 0x4723, 0x4729,
+ 0x477C, 0x478D, 0x2ECA, 0x4947, 0x497A, 0x497D, 0x4982, 0x4983,
+ 0x4985, 0x4986, 0x499F, 0x499B, 0x49B7, 0x49B6, 0x9FBA, 0x0000,
+ 0x4CA3, 0x4C9F, 0x4CA0, 0x4CA1, 0x4C77, 0x4CA2, 0x4D13, 0x4D14,
+ 0x4D15, 0x4D16, 0x4D17, 0x4D18, 0x4D19, 0x4DAE, 0x9FBB, 0x0020,
+ 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+ 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+ 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+ 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x00FC, 0x00A9,
+ 0x2122, 0x2026, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+ 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B, 0x00E8,
+ 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2, 0x00F2,
+ 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA, 0x01DC,
+ 0x00FC, 0x00EA, 0x0251, 0x1E3F, 0x0144, 0x0148, 0x01F9, 0x0261,
+ 0x0020, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F, 0x20AC, 0x3041,
+ 0x3047, 0x3043, 0x304B, 0x304B, 0x3051, 0x3051, 0x3053, 0x3053,
+ 0x3049, 0x3064, 0x3045, 0x308E, 0x3083, 0x3087, 0x3085, 0x3094,
+ 0x30A1, 0x30A7, 0x30A3, 0x30F5, 0x30F6, 0x30B3, 0x30B3, 0x30A9,
+ 0x30C3, 0x30A5, 0x30EE, 0x30E3, 0x30E7, 0x30E5, 0x30F7, 0x30F9,
+ 0x30F8, 0x30FA, 0x30FC, 0x3033, 0x3034, 0x3035, 0x3038, 0x3039,
+ 0x303A, 0x312A, 0x312B, 0x312C, 0x31A0, 0x31A1, 0x31A2, 0x31A3,
+ 0x31A4, 0x31A5, 0x31A6, 0x31A7, 0x31A8, 0x31A9, 0x31AA, 0x31AB,
+ 0x31AC, 0x31AD, 0x31AE, 0x31AF, 0x31B0, 0x31B1, 0x31B2, 0x31B3,
+ 0x31B4, 0x31B5, 0x31B6, 0x31B7, 0x2E80, 0x2E82, 0x2E83, 0x2E85,
+ 0x2E86, 0x2E87, 0x2E89, 0x2E8A, 0x2E8D, 0x2E8E, 0x2E8F, 0x2E90,
+ 0x2E91, 0x2E92, 0x2E93, 0x2E94, 0x2E95, 0x2E96, 0x2E98, 0x2E99,
+ 0x2E9B, 0x2E9C, 0x2E9D, 0x2E9E, 0x2E9F, 0x2EA0, 0x2EA1, 0x2EA2,
+ 0x2EA3, 0x2EA4, 0x2EA5, 0x2EA6, 0x2EA8, 0x2EA9, 0x2EAB, 0x2EAC,
+ 0x2EAD, 0x2EAF, 0x2EB0, 0x2EB1, 0x2EB2, 0x2EB4, 0x2EB5, 0x2EB8,
+ 0x2EB9, 0x2EBA, 0x2EBC, 0x2EBD, 0x2EBE, 0x2EBF, 0x2EC0, 0x2EC1,
+ 0x2EC2, 0x2EC3, 0x2EC4, 0x2EC5, 0x2EC6, 0x2EC7, 0x2EC8, 0x2EC9,
+ 0x2ECB, 0x2ECC, 0x2ECD, 0x2ECE, 0x2ECF, 0x2ED0, 0x2ED1, 0x2ED2,
+ 0x2ED3, 0x2ED4, 0x2ED5, 0x2ED6, 0x2ED7, 0x2ED8, 0x2ED9, 0x2EDA,
+ 0x2EDB, 0x2EDC, 0x2EDD, 0x2EDE, 0x2EDF, 0x2EE0, 0x2EE1, 0x2EE2,
+ 0x2EE3, 0x2EE4, 0x2EE5, 0x2EE6, 0x2EE7, 0x2EE8, 0x2EE9, 0x2EEA,
+ 0x2EEB, 0x2EEC, 0x2EED, 0x2EEE, 0x2EEF, 0x2EF0, 0x2EF1, 0x2EF2,
+ 0x2EF3, 0x3400, 0x3401, 0x3402, 0x3403, 0x3404, 0x3405, 0x3406,
+ 0x3407, 0x3408, 0x3409, 0x340A, 0x340B, 0x340C, 0x340D, 0x340E,
+ 0x340F, 0x3410, 0x3411, 0x3412, 0x3413, 0x3414, 0x3415, 0x3416,
+ 0x3417, 0x3418, 0x3419, 0x341A, 0x341B, 0x341C, 0x341D, 0x341E,
+ 0x341F, 0x3420, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426,
+ 0x3427, 0x3428, 0x3429, 0x342A, 0x342B, 0x342C, 0x342D, 0x342E,
+ 0x342F, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436,
+ 0x3437, 0x3438, 0x3439, 0x343A, 0x343B, 0x343C, 0x343D, 0x343E,
+ 0x343F, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,
+ 0x3448, 0x3449, 0x344A, 0x344B, 0x344C, 0x344D, 0x344E, 0x344F,
+ 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456, 0x3457,
+ 0x3458, 0x3459, 0x345A, 0x345B, 0x345C, 0x345D, 0x345E, 0x345F,
+ 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466, 0x3467,
+ 0x3468, 0x3469, 0x346A, 0x346B, 0x346C, 0x346D, 0x346E, 0x346F,
+ 0x3470, 0x3471, 0x3472, 0x3474, 0x3475, 0x3476, 0x3477, 0x3478,
+ 0x3479, 0x347A, 0x347B, 0x347C, 0x347D, 0x347E, 0x347F, 0x3480,
+ 0x3481, 0x3482, 0x3483, 0x3484, 0x3485, 0x3486, 0x3487, 0x3488,
+ 0x3489, 0x348A, 0x348B, 0x348C, 0x348D, 0x348E, 0x348F, 0x3490,
+ 0x3491, 0x3492, 0x3493, 0x3494, 0x3495, 0x3496, 0x3497, 0x3498,
+ 0x3499, 0x349A, 0x349B, 0x349C, 0x349D, 0x349E, 0x349F, 0x34A0,
+ 0x34A1, 0x34A2, 0x34A3, 0x34A4, 0x34A5, 0x34A6, 0x34A7, 0x34A8,
+ 0x34A9, 0x34AA, 0x34AB, 0x34AC, 0x34AD, 0x34AE, 0x34AF, 0x34B0,
+ 0x34B1, 0x34B2, 0x34B3, 0x34B4, 0x34B5, 0x34B6, 0x34B7, 0x34B8,
+ 0x34B9, 0x34BA, 0x34BB, 0x34BC, 0x34BD, 0x34BE, 0x34BF, 0x34C0,
+ 0x34C1, 0x34C2, 0x34C3, 0x34C4, 0x34C5, 0x34C6, 0x34C7, 0x34C8,
+ 0x34C9, 0x34CA, 0x34CB, 0x34CC, 0x34CD, 0x34CE, 0x34CF, 0x34D0,
+ 0x34D1, 0x34D2, 0x34D3, 0x34D4, 0x34D5, 0x34D6, 0x34D7, 0x34D8,
+ 0x34D9, 0x34DA, 0x34DB, 0x34DC, 0x34DD, 0x34DE, 0x34DF, 0x34E0,
+ 0x34E1, 0x34E2, 0x34E3, 0x34E4, 0x34E5, 0x34E6, 0x34E7, 0x34E8,
+ 0x34E9, 0x34EA, 0x34EB, 0x34EC, 0x34ED, 0x34EE, 0x34EF, 0x34F0,
+ 0x34F1, 0x34F2, 0x34F3, 0x34F4, 0x34F5, 0x34F6, 0x34F7, 0x34F8,
+ 0x34F9, 0x34FA, 0x34FB, 0x34FC, 0x34FD, 0x34FE, 0x34FF, 0x3500,
+ 0x3501, 0x3502, 0x3503, 0x3504, 0x3505, 0x3506, 0x3507, 0x3508,
+ 0x3509, 0x350A, 0x350B, 0x350C, 0x350D, 0x350E, 0x350F, 0x3510,
+ 0x3511, 0x3512, 0x3513, 0x3514, 0x3515, 0x3516, 0x3517, 0x3518,
+ 0x3519, 0x351A, 0x351B, 0x351C, 0x351D, 0x351E, 0x351F, 0x3520,
+ 0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528,
+ 0x3529, 0x352A, 0x352B, 0x352C, 0x352D, 0x352E, 0x352F, 0x3530,
+ 0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,
+ 0x3539, 0x353A, 0x353B, 0x353C, 0x353D, 0x353E, 0x353F, 0x3540,
+ 0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548,
+ 0x3549, 0x354A, 0x354B, 0x354C, 0x354D, 0x354E, 0x354F, 0x3550,
+ 0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558,
+ 0x3559, 0x355A, 0x355B, 0x355C, 0x355D, 0x355E, 0x355F, 0x3560,
+ 0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568,
+ 0x3569, 0x356A, 0x356B, 0x356C, 0x356D, 0x356E, 0x356F, 0x3570,
+ 0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578,
+ 0x3579, 0x357A, 0x357B, 0x357C, 0x357D, 0x357E, 0x357F, 0x3580,
+ 0x3581, 0x3582, 0x3583, 0x3584, 0x3585, 0x3586, 0x3587, 0x3588,
+ 0x3589, 0x358A, 0x358B, 0x358C, 0x358D, 0x358E, 0x358F, 0x3590,
+ 0x3591, 0x3592, 0x3593, 0x3594, 0x3595, 0x3596, 0x3597, 0x3598,
+ 0x3599, 0x359A, 0x359B, 0x359C, 0x359D, 0x359F, 0x35A0, 0x35A1,
+ 0x35A2, 0x35A3, 0x35A4, 0x35A5, 0x35A6, 0x35A7, 0x35A8, 0x35A9,
+ 0x35AA, 0x35AB, 0x35AC, 0x35AD, 0x35AE, 0x35AF, 0x35B0, 0x35B1,
+ 0x35B2, 0x35B3, 0x35B4, 0x35B5, 0x35B6, 0x35B7, 0x35B8, 0x35B9,
+ 0x35BA, 0x35BB, 0x35BC, 0x35BD, 0x35BE, 0x35BF, 0x35C0, 0x35C1,
+ 0x35C2, 0x35C3, 0x35C4, 0x35C5, 0x35C6, 0x35C7, 0x35C8, 0x35C9,
+ 0x35CA, 0x35CB, 0x35CC, 0x35CD, 0x35CE, 0x35CF, 0x35D0, 0x35D1,
+ 0x35D2, 0x35D3, 0x35D4, 0x35D5, 0x35D6, 0x35D7, 0x35D8, 0x35D9,
+ 0x35DA, 0x35DB, 0x35DC, 0x35DD, 0x35DE, 0x35DF, 0x35E0, 0x35E1,
+ 0x35E2, 0x35E3, 0x35E4, 0x35E5, 0x35E6, 0x35E7, 0x35E8, 0x35E9,
+ 0x35EA, 0x35EB, 0x35EC, 0x35ED, 0x35EE, 0x35EF, 0x35F0, 0x35F1,
+ 0x35F2, 0x35F3, 0x35F4, 0x35F5, 0x35F6, 0x35F7, 0x35F8, 0x35F9,
+ 0x35FA, 0x35FB, 0x35FC, 0x35FD, 0x35FE, 0x35FF, 0x3600, 0x3601,
+ 0x3602, 0x3603, 0x3604, 0x3605, 0x3606, 0x3607, 0x3608, 0x3609,
+ 0x360A, 0x360B, 0x360C, 0x360D, 0x360F, 0x3610, 0x3611, 0x3612,
+ 0x3613, 0x3614, 0x3615, 0x3616, 0x3617, 0x3618, 0x3619, 0x361B,
+ 0x361C, 0x361D, 0x361E, 0x361F, 0x3620, 0x3621, 0x3622, 0x3623,
+ 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362A, 0x362B,
+ 0x362C, 0x362D, 0x362E, 0x362F, 0x3630, 0x3631, 0x3632, 0x3633,
+ 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363A, 0x363B,
+ 0x363C, 0x363D, 0x363E, 0x363F, 0x3640, 0x3641, 0x3642, 0x3643,
+ 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364A, 0x364B,
+ 0x364C, 0x364D, 0x364E, 0x364F, 0x3650, 0x3651, 0x3652, 0x3653,
+ 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365A, 0x365B,
+ 0x365C, 0x365D, 0x365E, 0x365F, 0x3660, 0x3661, 0x3662, 0x3663,
+ 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366A, 0x366B,
+ 0x366C, 0x366D, 0x366E, 0x366F, 0x3670, 0x3671, 0x3672, 0x3673,
+ 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367A, 0x367B,
+ 0x367C, 0x367D, 0x367E, 0x367F, 0x3680, 0x3681, 0x3682, 0x3683,
+ 0x3684, 0x3685, 0x3686, 0x3687, 0x3688, 0x3689, 0x368A, 0x368B,
+ 0x368C, 0x368D, 0x368E, 0x368F, 0x3690, 0x3691, 0x3692, 0x3693,
+ 0x3694, 0x3695, 0x3696, 0x3697, 0x3698, 0x3699, 0x369A, 0x369B,
+ 0x369C, 0x369D, 0x369E, 0x369F, 0x36A0, 0x36A1, 0x36A2, 0x36A3,
+ 0x36A4, 0x36A5, 0x36A6, 0x36A7, 0x36A8, 0x36A9, 0x36AA, 0x36AB,
+ 0x36AC, 0x36AD, 0x36AE, 0x36AF, 0x36B0, 0x36B1, 0x36B2, 0x36B3,
+ 0x36B4, 0x36B5, 0x36B6, 0x36B7, 0x36B8, 0x36B9, 0x36BA, 0x36BB,
+ 0x36BC, 0x36BD, 0x36BE, 0x36BF, 0x36C0, 0x36C1, 0x36C2, 0x36C3,
+ 0x36C4, 0x36C5, 0x36C6, 0x36C7, 0x36C8, 0x36C9, 0x36CA, 0x36CB,
+ 0x36CC, 0x36CD, 0x36CE, 0x36CF, 0x36D0, 0x36D1, 0x36D2, 0x36D3,
+ 0x36D4, 0x36D5, 0x36D6, 0x36D7, 0x36D8, 0x36D9, 0x36DA, 0x36DB,
+ 0x36DC, 0x36DD, 0x36DE, 0x36DF, 0x36E0, 0x36E1, 0x36E2, 0x36E3,
+ 0x36E4, 0x36E5, 0x36E6, 0x36E7, 0x36E8, 0x36E9, 0x36EA, 0x36EB,
+ 0x36EC, 0x36ED, 0x36EE, 0x36EF, 0x36F0, 0x36F1, 0x36F2, 0x36F3,
+ 0x36F4, 0x36F5, 0x36F6, 0x36F7, 0x36F8, 0x36F9, 0x36FA, 0x36FB,
+ 0x36FC, 0x36FD, 0x36FE, 0x36FF, 0x3700, 0x3701, 0x3702, 0x3703,
+ 0x3704, 0x3705, 0x3706, 0x3707, 0x3708, 0x3709, 0x370A, 0x370B,
+ 0x370C, 0x370D, 0x370E, 0x370F, 0x3710, 0x3711, 0x3712, 0x3713,
+ 0x3714, 0x3715, 0x3716, 0x3717, 0x3718, 0x3719, 0x371A, 0x371B,
+ 0x371C, 0x371D, 0x371E, 0x371F, 0x3720, 0x3721, 0x3722, 0x3723,
+ 0x3724, 0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372A, 0x372B,
+ 0x372C, 0x372D, 0x372E, 0x372F, 0x3730, 0x3731, 0x3732, 0x3733,
+ 0x3734, 0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373A, 0x373B,
+ 0x373C, 0x373D, 0x373E, 0x373F, 0x3740, 0x3741, 0x3742, 0x3743,
+ 0x3744, 0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374A, 0x374B,
+ 0x374C, 0x374D, 0x374E, 0x374F, 0x3750, 0x3751, 0x3752, 0x3753,
+ 0x3754, 0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375A, 0x375B,
+ 0x375C, 0x375D, 0x375E, 0x375F, 0x3760, 0x3761, 0x3762, 0x3763,
+ 0x3764, 0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376A, 0x376B,
+ 0x376C, 0x376D, 0x376E, 0x376F, 0x3770, 0x3771, 0x3772, 0x3773,
+ 0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377A, 0x377B,
+ 0x377C, 0x377D, 0x377E, 0x377F, 0x3780, 0x3781, 0x3782, 0x3783,
+ 0x3784, 0x3785, 0x3786, 0x3787, 0x3788, 0x3789, 0x378A, 0x378B,
+ 0x378C, 0x378D, 0x378E, 0x378F, 0x3790, 0x3791, 0x3792, 0x3793,
+ 0x3794, 0x3795, 0x3796, 0x3797, 0x3798, 0x3799, 0x379A, 0x379B,
+ 0x379C, 0x379D, 0x379E, 0x379F, 0x37A0, 0x37A1, 0x37A2, 0x37A3,
+ 0x37A4, 0x37A5, 0x37A6, 0x37A7, 0x37A8, 0x37A9, 0x37AA, 0x37AB,
+ 0x37AC, 0x37AD, 0x37AE, 0x37AF, 0x37B0, 0x37B1, 0x37B2, 0x37B3,
+ 0x37B4, 0x37B5, 0x37B6, 0x37B7, 0x37B8, 0x37B9, 0x37BA, 0x37BB,
+ 0x37BC, 0x37BD, 0x37BE, 0x37BF, 0x37C0, 0x37C1, 0x37C2, 0x37C3,
+ 0x37C4, 0x37C5, 0x37C6, 0x37C7, 0x37C8, 0x37C9, 0x37CA, 0x37CB,
+ 0x37CC, 0x37CD, 0x37CE, 0x37CF, 0x37D0, 0x37D1, 0x37D2, 0x37D3,
+ 0x37D4, 0x37D5, 0x37D6, 0x37D7, 0x37D8, 0x37D9, 0x37DA, 0x37DB,
+ 0x37DC, 0x37DD, 0x37DE, 0x37DF, 0x37E0, 0x37E1, 0x37E2, 0x37E3,
+ 0x37E4, 0x37E5, 0x37E6, 0x37E7, 0x37E8, 0x37E9, 0x37EA, 0x37EB,
+ 0x37EC, 0x37ED, 0x37EE, 0x37EF, 0x37F0, 0x37F1, 0x37F2, 0x37F3,
+ 0x37F4, 0x37F5, 0x37F6, 0x37F7, 0x37F8, 0x37F9, 0x37FA, 0x37FB,
+ 0x37FC, 0x37FD, 0x37FE, 0x37FF, 0x3800, 0x3801, 0x3802, 0x3803,
+ 0x3804, 0x3805, 0x3806, 0x3807, 0x3808, 0x3809, 0x380A, 0x380B,
+ 0x380C, 0x380D, 0x380E, 0x380F, 0x3810, 0x3811, 0x3812, 0x3813,
+ 0x3814, 0x3815, 0x3816, 0x3817, 0x3818, 0x3819, 0x381A, 0x381B,
+ 0x381C, 0x381D, 0x381E, 0x381F, 0x3820, 0x3821, 0x3822, 0x3823,
+ 0x3824, 0x3825, 0x3826, 0x3827, 0x3828, 0x3829, 0x382A, 0x382B,
+ 0x382C, 0x382D, 0x382E, 0x382F, 0x3830, 0x3831, 0x3832, 0x3833,
+ 0x3834, 0x3835, 0x3836, 0x3837, 0x3838, 0x3839, 0x383A, 0x383B,
+ 0x383C, 0x383D, 0x383E, 0x383F, 0x3840, 0x3841, 0x3842, 0x3843,
+ 0x3844, 0x3845, 0x3846, 0x3847, 0x3848, 0x3849, 0x384A, 0x384B,
+ 0x384C, 0x384D, 0x384E, 0x384F, 0x3850, 0x3851, 0x3852, 0x3853,
+ 0x3854, 0x3855, 0x3856, 0x3857, 0x3858, 0x3859, 0x385A, 0x385B,
+ 0x385C, 0x385D, 0x385E, 0x385F, 0x3860, 0x3861, 0x3862, 0x3863,
+ 0x3864, 0x3865, 0x3866, 0x3867, 0x3868, 0x3869, 0x386A, 0x386B,
+ 0x386C, 0x386D, 0x386E, 0x386F, 0x3870, 0x3871, 0x3872, 0x3873,
+ 0x3874, 0x3875, 0x3876, 0x3877, 0x3878, 0x3879, 0x387A, 0x387B,
+ 0x387C, 0x387D, 0x387E, 0x387F, 0x3880, 0x3881, 0x3882, 0x3883,
+ 0x3884, 0x3885, 0x3886, 0x3887, 0x3888, 0x3889, 0x388A, 0x388B,
+ 0x388C, 0x388D, 0x388E, 0x388F, 0x3890, 0x3891, 0x3892, 0x3893,
+ 0x3894, 0x3895, 0x3896, 0x3897, 0x3898, 0x3899, 0x389A, 0x389B,
+ 0x389C, 0x389D, 0x389E, 0x389F, 0x38A0, 0x38A1, 0x38A2, 0x38A3,
+ 0x38A4, 0x38A5, 0x38A6, 0x38A7, 0x38A8, 0x38A9, 0x38AA, 0x38AB,
+ 0x38AC, 0x38AD, 0x38AE, 0x38AF, 0x38B0, 0x38B1, 0x38B2, 0x38B3,
+ 0x38B4, 0x38B5, 0x38B6, 0x38B7, 0x38B8, 0x38B9, 0x38BA, 0x38BB,
+ 0x38BC, 0x38BD, 0x38BE, 0x38BF, 0x38C0, 0x38C1, 0x38C2, 0x38C3,
+ 0x38C4, 0x38C5, 0x38C6, 0x38C7, 0x38C8, 0x38C9, 0x38CA, 0x38CB,
+ 0x38CC, 0x38CD, 0x38CE, 0x38CF, 0x38D0, 0x38D1, 0x38D2, 0x38D3,
+ 0x38D4, 0x38D5, 0x38D6, 0x38D7, 0x38D8, 0x38D9, 0x38DA, 0x38DB,
+ 0x38DC, 0x38DD, 0x38DE, 0x38DF, 0x38E0, 0x38E1, 0x38E2, 0x38E3,
+ 0x38E4, 0x38E5, 0x38E6, 0x38E7, 0x38E8, 0x38E9, 0x38EA, 0x38EB,
+ 0x38EC, 0x38ED, 0x38EE, 0x38EF, 0x38F0, 0x38F1, 0x38F2, 0x38F3,
+ 0x38F4, 0x38F5, 0x38F6, 0x38F7, 0x38F8, 0x38F9, 0x38FA, 0x38FB,
+ 0x38FC, 0x38FD, 0x38FE, 0x38FF, 0x3900, 0x3901, 0x3902, 0x3903,
+ 0x3904, 0x3905, 0x3906, 0x3907, 0x3908, 0x3909, 0x390A, 0x390B,
+ 0x390C, 0x390D, 0x390E, 0x390F, 0x3910, 0x3911, 0x3912, 0x3913,
+ 0x3914, 0x3915, 0x3916, 0x3917, 0x3919, 0x391A, 0x391B, 0x391C,
+ 0x391D, 0x391E, 0x391F, 0x3920, 0x3921, 0x3922, 0x3923, 0x3924,
+ 0x3925, 0x3926, 0x3927, 0x3928, 0x3929, 0x392A, 0x392B, 0x392C,
+ 0x392D, 0x392E, 0x392F, 0x3930, 0x3931, 0x3932, 0x3933, 0x3934,
+ 0x3935, 0x3936, 0x3937, 0x3938, 0x3939, 0x393A, 0x393B, 0x393C,
+ 0x393D, 0x393E, 0x393F, 0x3940, 0x3941, 0x3942, 0x3943, 0x3944,
+ 0x3945, 0x3946, 0x3947, 0x3948, 0x3949, 0x394A, 0x394B, 0x394C,
+ 0x394D, 0x394E, 0x394F, 0x3950, 0x3951, 0x3952, 0x3953, 0x3954,
+ 0x3955, 0x3956, 0x3957, 0x3958, 0x3959, 0x395A, 0x395B, 0x395C,
+ 0x395D, 0x395E, 0x395F, 0x3960, 0x3961, 0x3962, 0x3963, 0x3964,
+ 0x3965, 0x3966, 0x3967, 0x3968, 0x3969, 0x396A, 0x396B, 0x396C,
+ 0x396D, 0x396F, 0x3970, 0x3971, 0x3972, 0x3973, 0x3974, 0x3975,
+ 0x3976, 0x3977, 0x3978, 0x3979, 0x397A, 0x397B, 0x397C, 0x397D,
+ 0x397E, 0x397F, 0x3980, 0x3981, 0x3982, 0x3983, 0x3984, 0x3985,
+ 0x3986, 0x3987, 0x3988, 0x3989, 0x398A, 0x398B, 0x398C, 0x398D,
+ 0x398E, 0x398F, 0x3990, 0x3991, 0x3992, 0x3993, 0x3994, 0x3995,
+ 0x3996, 0x3997, 0x3998, 0x3999, 0x399A, 0x399B, 0x399C, 0x399D,
+ 0x399E, 0x399F, 0x39A0, 0x39A1, 0x39A2, 0x39A3, 0x39A4, 0x39A5,
+ 0x39A6, 0x39A7, 0x39A8, 0x39A9, 0x39AA, 0x39AB, 0x39AC, 0x39AD,
+ 0x39AE, 0x39AF, 0x39B0, 0x39B1, 0x39B2, 0x39B3, 0x39B4, 0x39B5,
+ 0x39B6, 0x39B7, 0x39B8, 0x39B9, 0x39BA, 0x39BB, 0x39BC, 0x39BD,
+ 0x39BE, 0x39BF, 0x39C0, 0x39C1, 0x39C2, 0x39C3, 0x39C4, 0x39C5,
+ 0x39C6, 0x39C7, 0x39C8, 0x39C9, 0x39CA, 0x39CB, 0x39CC, 0x39CD,
+ 0x39CE, 0x39D1, 0x39D2, 0x39D3, 0x39D4, 0x39D5, 0x39D6, 0x39D7,
+ 0x39D8, 0x39D9, 0x39DA, 0x39DB, 0x39DC, 0x39DD, 0x39DE, 0x39E0,
+ 0x39E1, 0x39E2, 0x39E3, 0x39E4, 0x39E5, 0x39E6, 0x39E7, 0x39E8,
+ 0x39E9, 0x39EA, 0x39EB, 0x39EC, 0x39ED, 0x39EE, 0x39EF, 0x39F0,
+ 0x39F1, 0x39F2, 0x39F3, 0x39F4, 0x39F5, 0x39F6, 0x39F7, 0x39F8,
+ 0x39F9, 0x39FA, 0x39FB, 0x39FC, 0x39FD, 0x39FE, 0x39FF, 0x3A00,
+ 0x3A01, 0x3A02, 0x3A03, 0x3A04, 0x3A05, 0x3A06, 0x3A07, 0x3A08,
+ 0x3A09, 0x3A0A, 0x3A0B, 0x3A0C, 0x3A0D, 0x3A0E, 0x3A0F, 0x3A10,
+ 0x3A11, 0x3A12, 0x3A13, 0x3A14, 0x3A15, 0x3A16, 0x3A17, 0x3A18,
+ 0x3A19, 0x3A1A, 0x3A1B, 0x3A1C, 0x3A1D, 0x3A1E, 0x3A1F, 0x3A20,
+ 0x3A21, 0x3A22, 0x3A23, 0x3A24, 0x3A25, 0x3A26, 0x3A27, 0x3A28,
+ 0x3A29, 0x3A2A, 0x3A2B, 0x3A2C, 0x3A2D, 0x3A2E, 0x3A2F, 0x3A30,
+ 0x3A31, 0x3A32, 0x3A33, 0x3A34, 0x3A35, 0x3A36, 0x3A37, 0x3A38,
+ 0x3A39, 0x3A3A, 0x3A3B, 0x3A3C, 0x3A3D, 0x3A3E, 0x3A3F, 0x3A40,
+ 0x3A41, 0x3A42, 0x3A43, 0x3A44, 0x3A45, 0x3A46, 0x3A47, 0x3A48,
+ 0x3A49, 0x3A4A, 0x3A4B, 0x3A4C, 0x3A4D, 0x3A4E, 0x3A4F, 0x3A50,
+ 0x3A51, 0x3A52, 0x3A53, 0x3A54, 0x3A55, 0x3A56, 0x3A57, 0x3A58,
+ 0x3A59, 0x3A5A, 0x3A5B, 0x3A5C, 0x3A5D, 0x3A5E, 0x3A5F, 0x3A60,
+ 0x3A61, 0x3A62, 0x3A63, 0x3A64, 0x3A65, 0x3A66, 0x3A67, 0x3A68,
+ 0x3A69, 0x3A6A, 0x3A6B, 0x3A6C, 0x3A6D, 0x3A6E, 0x3A6F, 0x3A70,
+ 0x3A71, 0x3A72, 0x3A74, 0x3A75, 0x3A76, 0x3A77, 0x3A78, 0x3A79,
+ 0x3A7A, 0x3A7B, 0x3A7C, 0x3A7D, 0x3A7E, 0x3A7F, 0x3A80, 0x3A81,
+ 0x3A82, 0x3A83, 0x3A84, 0x3A85, 0x3A86, 0x3A87, 0x3A88, 0x3A89,
+ 0x3A8A, 0x3A8B, 0x3A8C, 0x3A8D, 0x3A8E, 0x3A8F, 0x3A90, 0x3A91,
+ 0x3A92, 0x3A93, 0x3A94, 0x3A95, 0x3A96, 0x3A97, 0x3A98, 0x3A99,
+ 0x3A9A, 0x3A9B, 0x3A9C, 0x3A9D, 0x3A9E, 0x3A9F, 0x3AA0, 0x3AA1,
+ 0x3AA2, 0x3AA3, 0x3AA4, 0x3AA5, 0x3AA6, 0x3AA7, 0x3AA8, 0x3AA9,
+ 0x3AAA, 0x3AAB, 0x3AAC, 0x3AAD, 0x3AAE, 0x3AAF, 0x3AB0, 0x3AB1,
+ 0x3AB2, 0x3AB3, 0x3AB4, 0x3AB5, 0x3AB6, 0x3AB7, 0x3AB8, 0x3AB9,
+ 0x3ABA, 0x3ABB, 0x3ABC, 0x3ABD, 0x3ABE, 0x3ABF, 0x3AC0, 0x3AC1,
+ 0x3AC2, 0x3AC3, 0x3AC4, 0x3AC5, 0x3AC6, 0x3AC7, 0x3AC8, 0x3AC9,
+ 0x3ACA, 0x3ACB, 0x3ACC, 0x3ACD, 0x3ACE, 0x3ACF, 0x3AD0, 0x3AD1,
+ 0x3AD2, 0x3AD3, 0x3AD4, 0x3AD5, 0x3AD6, 0x3AD7, 0x3AD8, 0x3AD9,
+ 0x3ADA, 0x3ADB, 0x3ADC, 0x3ADD, 0x3ADE, 0x3ADF, 0x3AE0, 0x3AE1,
+ 0x3AE2, 0x3AE3, 0x3AE4, 0x3AE5, 0x3AE6, 0x3AE7, 0x3AE8, 0x3AE9,
+ 0x3AEA, 0x3AEB, 0x3AEC, 0x3AED, 0x3AEE, 0x3AEF, 0x3AF0, 0x3AF1,
+ 0x3AF2, 0x3AF3, 0x3AF4, 0x3AF5, 0x3AF6, 0x3AF7, 0x3AF8, 0x3AF9,
+ 0x3AFA, 0x3AFB, 0x3AFC, 0x3AFD, 0x3AFE, 0x3AFF, 0x3B00, 0x3B01,
+ 0x3B02, 0x3B03, 0x3B04, 0x3B05, 0x3B06, 0x3B07, 0x3B08, 0x3B09,
+ 0x3B0A, 0x3B0B, 0x3B0C, 0x3B0D, 0x3B0E, 0x3B0F, 0x3B10, 0x3B11,
+ 0x3B12, 0x3B13, 0x3B14, 0x3B15, 0x3B16, 0x3B17, 0x3B18, 0x3B19,
+ 0x3B1A, 0x3B1B, 0x3B1C, 0x3B1D, 0x3B1E, 0x3B1F, 0x3B20, 0x3B21,
+ 0x3B22, 0x3B23, 0x3B24, 0x3B25, 0x3B26, 0x3B27, 0x3B28, 0x3B29,
+ 0x3B2A, 0x3B2B, 0x3B2C, 0x3B2D, 0x3B2E, 0x3B2F, 0x3B30, 0x3B31,
+ 0x3B32, 0x3B33, 0x3B34, 0x3B35, 0x3B36, 0x3B37, 0x3B38, 0x3B39,
+ 0x3B3A, 0x3B3B, 0x3B3C, 0x3B3D, 0x3B3E, 0x3B3F, 0x3B40, 0x3B41,
+ 0x3B42, 0x3B43, 0x3B44, 0x3B45, 0x3B46, 0x3B47, 0x3B48, 0x3B49,
+ 0x3B4A, 0x3B4B, 0x3B4C, 0x3B4D, 0x3B4F, 0x3B50, 0x3B51, 0x3B52,
+ 0x3B53, 0x3B54, 0x3B55, 0x3B56, 0x3B57, 0x3B58, 0x3B59, 0x3B5A,
+ 0x3B5B, 0x3B5C, 0x3B5D, 0x3B5E, 0x3B5F, 0x3B60, 0x3B61, 0x3B62,
+ 0x3B63, 0x3B64, 0x3B65, 0x3B66, 0x3B67, 0x3B68, 0x3B69, 0x3B6A,
+ 0x3B6B, 0x3B6C, 0x3B6D, 0x3B6E, 0x3B6F, 0x3B70, 0x3B71, 0x3B72,
+ 0x3B73, 0x3B74, 0x3B75, 0x3B76, 0x3B77, 0x3B78, 0x3B79, 0x3B7A,
+ 0x3B7B, 0x3B7C, 0x3B7D, 0x3B7E, 0x3B7F, 0x3B80, 0x3B81, 0x3B82,
+ 0x3B83, 0x3B84, 0x3B85, 0x3B86, 0x3B87, 0x3B88, 0x3B89, 0x3B8A,
+ 0x3B8B, 0x3B8C, 0x3B8D, 0x3B8E, 0x3B8F, 0x3B90, 0x3B91, 0x3B92,
+ 0x3B93, 0x3B94, 0x3B95, 0x3B96, 0x3B97, 0x3B98, 0x3B99, 0x3B9A,
+ 0x3B9B, 0x3B9C, 0x3B9D, 0x3B9E, 0x3B9F, 0x3BA0, 0x3BA1, 0x3BA2,
+ 0x3BA3, 0x3BA4, 0x3BA5, 0x3BA6, 0x3BA7, 0x3BA8, 0x3BA9, 0x3BAA,
+ 0x3BAB, 0x3BAC, 0x3BAD, 0x3BAE, 0x3BAF, 0x3BB0, 0x3BB1, 0x3BB2,
+ 0x3BB3, 0x3BB4, 0x3BB5, 0x3BB6, 0x3BB7, 0x3BB8, 0x3BB9, 0x3BBA,
+ 0x3BBB, 0x3BBC, 0x3BBD, 0x3BBE, 0x3BBF, 0x3BC0, 0x3BC1, 0x3BC2,
+ 0x3BC3, 0x3BC4, 0x3BC5, 0x3BC6, 0x3BC7, 0x3BC8, 0x3BC9, 0x3BCA,
+ 0x3BCB, 0x3BCC, 0x3BCD, 0x3BCE, 0x3BCF, 0x3BD0, 0x3BD1, 0x3BD2,
+ 0x3BD3, 0x3BD4, 0x3BD5, 0x3BD6, 0x3BD7, 0x3BD8, 0x3BD9, 0x3BDA,
+ 0x3BDB, 0x3BDC, 0x3BDD, 0x3BDE, 0x3BDF, 0x3BE0, 0x3BE1, 0x3BE2,
+ 0x3BE3, 0x3BE4, 0x3BE5, 0x3BE6, 0x3BE7, 0x3BE8, 0x3BE9, 0x3BEA,
+ 0x3BEB, 0x3BEC, 0x3BED, 0x3BEE, 0x3BEF, 0x3BF0, 0x3BF1, 0x3BF2,
+ 0x3BF3, 0x3BF4, 0x3BF5, 0x3BF6, 0x3BF7, 0x3BF8, 0x3BF9, 0x3BFA,
+ 0x3BFB, 0x3BFC, 0x3BFD, 0x3BFE, 0x3BFF, 0x3C00, 0x3C01, 0x3C02,
+ 0x3C03, 0x3C04, 0x3C05, 0x3C06, 0x3C07, 0x3C08, 0x3C09, 0x3C0A,
+ 0x3C0B, 0x3C0C, 0x3C0D, 0x3C0E, 0x3C0F, 0x3C10, 0x3C11, 0x3C12,
+ 0x3C13, 0x3C14, 0x3C15, 0x3C16, 0x3C17, 0x3C18, 0x3C19, 0x3C1A,
+ 0x3C1B, 0x3C1C, 0x3C1D, 0x3C1E, 0x3C1F, 0x3C20, 0x3C21, 0x3C22,
+ 0x3C23, 0x3C24, 0x3C25, 0x3C26, 0x3C27, 0x3C28, 0x3C29, 0x3C2A,
+ 0x3C2B, 0x3C2C, 0x3C2D, 0x3C2E, 0x3C2F, 0x3C30, 0x3C31, 0x3C32,
+ 0x3C33, 0x3C34, 0x3C35, 0x3C36, 0x3C37, 0x3C38, 0x3C39, 0x3C3A,
+ 0x3C3B, 0x3C3C, 0x3C3D, 0x3C3E, 0x3C3F, 0x3C40, 0x3C41, 0x3C42,
+ 0x3C43, 0x3C44, 0x3C45, 0x3C46, 0x3C47, 0x3C48, 0x3C49, 0x3C4A,
+ 0x3C4B, 0x3C4C, 0x3C4D, 0x3C4E, 0x3C4F, 0x3C50, 0x3C51, 0x3C52,
+ 0x3C53, 0x3C54, 0x3C55, 0x3C56, 0x3C57, 0x3C58, 0x3C59, 0x3C5A,
+ 0x3C5B, 0x3C5C, 0x3C5D, 0x3C5E, 0x3C5F, 0x3C60, 0x3C61, 0x3C62,
+ 0x3C63, 0x3C64, 0x3C65, 0x3C66, 0x3C67, 0x3C68, 0x3C69, 0x3C6A,
+ 0x3C6B, 0x3C6C, 0x3C6D, 0x3C6F, 0x3C70, 0x3C71, 0x3C72, 0x3C73,
+ 0x3C74, 0x3C75, 0x3C76, 0x3C77, 0x3C78, 0x3C79, 0x3C7A, 0x3C7B,
+ 0x3C7C, 0x3C7D, 0x3C7E, 0x3C7F, 0x3C80, 0x3C81, 0x3C82, 0x3C83,
+ 0x3C84, 0x3C85, 0x3C86, 0x3C87, 0x3C88, 0x3C89, 0x3C8A, 0x3C8B,
+ 0x3C8C, 0x3C8D, 0x3C8E, 0x3C8F, 0x3C90, 0x3C91, 0x3C92, 0x3C93,
+ 0x3C94, 0x3C95, 0x3C96, 0x3C97, 0x3C98, 0x3C99, 0x3C9A, 0x3C9B,
+ 0x3C9C, 0x3C9D, 0x3C9E, 0x3C9F, 0x3CA0, 0x3CA1, 0x3CA2, 0x3CA3,
+ 0x3CA4, 0x3CA5, 0x3CA6, 0x3CA7, 0x3CA8, 0x3CA9, 0x3CAA, 0x3CAB,
+ 0x3CAC, 0x3CAD, 0x3CAE, 0x3CAF, 0x3CB0, 0x3CB1, 0x3CB2, 0x3CB3,
+ 0x3CB4, 0x3CB5, 0x3CB6, 0x3CB7, 0x3CB8, 0x3CB9, 0x3CBA, 0x3CBB,
+ 0x3CBC, 0x3CBD, 0x3CBE, 0x3CBF, 0x3CC0, 0x3CC1, 0x3CC2, 0x3CC3,
+ 0x3CC4, 0x3CC5, 0x3CC6, 0x3CC7, 0x3CC8, 0x3CC9, 0x3CCA, 0x3CCB,
+ 0x3CCC, 0x3CCD, 0x3CCE, 0x3CCF, 0x3CD0, 0x3CD1, 0x3CD2, 0x3CD3,
+ 0x3CD4, 0x3CD5, 0x3CD6, 0x3CD7, 0x3CD8, 0x3CD9, 0x3CDA, 0x3CDB,
+ 0x3CDC, 0x3CDD, 0x3CDE, 0x3CDF, 0x3CE1, 0x3CE2, 0x3CE3, 0x3CE4,
+ 0x3CE5, 0x3CE6, 0x3CE7, 0x3CE8, 0x3CE9, 0x3CEA, 0x3CEB, 0x3CEC,
+ 0x3CED, 0x3CEE, 0x3CEF, 0x3CF0, 0x3CF1, 0x3CF2, 0x3CF3, 0x3CF4,
+ 0x3CF5, 0x3CF6, 0x3CF7, 0x3CF8, 0x3CF9, 0x3CFA, 0x3CFB, 0x3CFC,
+ 0x3CFD, 0x3CFE, 0x3CFF, 0x3D00, 0x3D01, 0x3D02, 0x3D03, 0x3D04,
+ 0x3D05, 0x3D06, 0x3D07, 0x3D08, 0x3D09, 0x3D0A, 0x3D0B, 0x3D0C,
+ 0x3D0D, 0x3D0E, 0x3D0F, 0x3D10, 0x3D11, 0x3D12, 0x3D13, 0x3D14,
+ 0x3D15, 0x3D16, 0x3D17, 0x3D18, 0x3D19, 0x3D1A, 0x3D1B, 0x3D1C,
+ 0x3D1D, 0x3D1E, 0x3D1F, 0x3D20, 0x3D21, 0x3D22, 0x3D23, 0x3D24,
+ 0x3D25, 0x3D26, 0x3D27, 0x3D28, 0x3D29, 0x3D2A, 0x3D2B, 0x3D2C,
+ 0x3D2D, 0x3D2E, 0x3D2F, 0x3D30, 0x3D31, 0x3D32, 0x3D33, 0x3D34,
+ 0x3D35, 0x3D36, 0x3D37, 0x3D38, 0x3D39, 0x3D3A, 0x3D3B, 0x3D3C,
+ 0x3D3D, 0x3D3E, 0x3D3F, 0x3D40, 0x3D41, 0x3D42, 0x3D43, 0x3D44,
+ 0x3D45, 0x3D46, 0x3D47, 0x3D48, 0x3D49, 0x3D4A, 0x3D4B, 0x3D4C,
+ 0x3D4D, 0x3D4E, 0x3D4F, 0x3D50, 0x3D51, 0x3D52, 0x3D53, 0x3D54,
+ 0x3D55, 0x3D56, 0x3D57, 0x3D58, 0x3D59, 0x3D5A, 0x3D5B, 0x3D5C,
+ 0x3D5D, 0x3D5E, 0x3D5F, 0x3D60, 0x3D61, 0x3D62, 0x3D63, 0x3D64,
+ 0x3D65, 0x3D66, 0x3D67, 0x3D68, 0x3D69, 0x3D6A, 0x3D6B, 0x3D6C,
+ 0x3D6D, 0x3D6E, 0x3D6F, 0x3D70, 0x3D71, 0x3D72, 0x3D73, 0x3D74,
+ 0x3D75, 0x3D76, 0x3D77, 0x3D78, 0x3D79, 0x3D7A, 0x3D7B, 0x3D7C,
+ 0x3D7D, 0x3D7E, 0x3D7F, 0x3D80, 0x3D81, 0x3D82, 0x3D83, 0x3D84,
+ 0x3D85, 0x3D86, 0x3D87, 0x3D88, 0x3D89, 0x3D8A, 0x3D8B, 0x3D8C,
+ 0x3D8D, 0x3D8E, 0x3D8F, 0x3D90, 0x3D91, 0x3D92, 0x3D93, 0x3D94,
+ 0x3D95, 0x3D96, 0x3D97, 0x3D98, 0x3D99, 0x3D9A, 0x3D9B, 0x3D9C,
+ 0x3D9D, 0x3D9E, 0x3D9F, 0x3DA0, 0x3DA1, 0x3DA2, 0x3DA3, 0x3DA4,
+ 0x3DA5, 0x3DA6, 0x3DA7, 0x3DA8, 0x3DA9, 0x3DAA, 0x3DAB, 0x3DAC,
+ 0x3DAD, 0x3DAE, 0x3DAF, 0x3DB0, 0x3DB1, 0x3DB2, 0x3DB3, 0x3DB4,
+ 0x3DB5, 0x3DB6, 0x3DB7, 0x3DB8, 0x3DB9, 0x3DBA, 0x3DBB, 0x3DBC,
+ 0x3DBD, 0x3DBE, 0x3DBF, 0x3DC0, 0x3DC1, 0x3DC2, 0x3DC3, 0x3DC4,
+ 0x3DC5, 0x3DC6, 0x3DC7, 0x3DC8, 0x3DC9, 0x3DCA, 0x3DCB, 0x3DCC,
+ 0x3DCD, 0x3DCE, 0x3DCF, 0x3DD0, 0x3DD1, 0x3DD2, 0x3DD3, 0x3DD4,
+ 0x3DD5, 0x3DD6, 0x3DD7, 0x3DD8, 0x3DD9, 0x3DDA, 0x3DDB, 0x3DDC,
+ 0x3DDD, 0x3DDE, 0x3DDF, 0x3DE0, 0x3DE1, 0x3DE2, 0x3DE3, 0x3DE4,
+ 0x3DE5, 0x3DE6, 0x3DE7, 0x3DE8, 0x3DE9, 0x3DEA, 0x3DEB, 0x3DEC,
+ 0x3DED, 0x3DEE, 0x3DEF, 0x3DF0, 0x3DF1, 0x3DF2, 0x3DF3, 0x3DF4,
+ 0x3DF5, 0x3DF6, 0x3DF7, 0x3DF8, 0x3DF9, 0x3DFA, 0x3DFB, 0x3DFC,
+ 0x3DFD, 0x3DFE, 0x3DFF, 0x3E00, 0x3E01, 0x3E02, 0x3E03, 0x3E04,
+ 0x3E05, 0x3E06, 0x3E07, 0x3E08, 0x3E09, 0x3E0A, 0x3E0B, 0x3E0C,
+ 0x3E0D, 0x3E0E, 0x3E0F, 0x3E10, 0x3E11, 0x3E12, 0x3E13, 0x3E14,
+ 0x3E15, 0x3E16, 0x3E17, 0x3E18, 0x3E19, 0x3E1A, 0x3E1B, 0x3E1C,
+ 0x3E1D, 0x3E1E, 0x3E1F, 0x3E20, 0x3E21, 0x3E22, 0x3E23, 0x3E24,
+ 0x3E25, 0x3E26, 0x3E27, 0x3E28, 0x3E29, 0x3E2A, 0x3E2B, 0x3E2C,
+ 0x3E2D, 0x3E2E, 0x3E2F, 0x3E30, 0x3E31, 0x3E32, 0x3E33, 0x3E34,
+ 0x3E35, 0x3E36, 0x3E37, 0x3E38, 0x3E39, 0x3E3A, 0x3E3B, 0x3E3C,
+ 0x3E3D, 0x3E3E, 0x3E3F, 0x3E40, 0x3E41, 0x3E42, 0x3E43, 0x3E44,
+ 0x3E45, 0x3E46, 0x3E47, 0x3E48, 0x3E49, 0x3E4A, 0x3E4B, 0x3E4C,
+ 0x3E4D, 0x3E4E, 0x3E4F, 0x3E50, 0x3E51, 0x3E52, 0x3E53, 0x3E54,
+ 0x3E55, 0x3E56, 0x3E57, 0x3E58, 0x3E59, 0x3E5A, 0x3E5B, 0x3E5C,
+ 0x3E5D, 0x3E5E, 0x3E5F, 0x3E60, 0x3E61, 0x3E62, 0x3E63, 0x3E64,
+ 0x3E65, 0x3E66, 0x3E67, 0x3E68, 0x3E69, 0x3E6A, 0x3E6B, 0x3E6C,
+ 0x3E6D, 0x3E6E, 0x3E6F, 0x3E70, 0x3E71, 0x3E72, 0x3E73, 0x3E74,
+ 0x3E75, 0x3E76, 0x3E77, 0x3E78, 0x3E79, 0x3E7A, 0x3E7B, 0x3E7C,
+ 0x3E7D, 0x3E7E, 0x3E7F, 0x3E80, 0x3E81, 0x3E82, 0x3E83, 0x3E84,
+ 0x3E85, 0x3E86, 0x3E87, 0x3E88, 0x3E89, 0x3E8A, 0x3E8B, 0x3E8C,
+ 0x3E8D, 0x3E8E, 0x3E8F, 0x3E90, 0x3E91, 0x3E92, 0x3E93, 0x3E94,
+ 0x3E95, 0x3E96, 0x3E97, 0x3E98, 0x3E99, 0x3E9A, 0x3E9B, 0x3E9C,
+ 0x3E9D, 0x3E9E, 0x3E9F, 0x3EA0, 0x3EA1, 0x3EA2, 0x3EA3, 0x3EA4,
+ 0x3EA5, 0x3EA6, 0x3EA7, 0x3EA8, 0x3EA9, 0x3EAA, 0x3EAB, 0x3EAC,
+ 0x3EAD, 0x3EAE, 0x3EAF, 0x3EB0, 0x3EB1, 0x3EB2, 0x3EB3, 0x3EB4,
+ 0x3EB5, 0x3EB6, 0x3EB7, 0x3EB8, 0x3EB9, 0x3EBA, 0x3EBB, 0x3EBC,
+ 0x3EBD, 0x3EBE, 0x3EBF, 0x3EC0, 0x3EC1, 0x3EC2, 0x3EC3, 0x3EC4,
+ 0x3EC5, 0x3EC6, 0x3EC7, 0x3EC8, 0x3EC9, 0x3ECA, 0x3ECB, 0x3ECC,
+ 0x3ECD, 0x3ECE, 0x3ECF, 0x3ED0, 0x3ED1, 0x3ED2, 0x3ED3, 0x3ED4,
+ 0x3ED5, 0x3ED6, 0x3ED7, 0x3ED8, 0x3ED9, 0x3EDA, 0x3EDB, 0x3EDC,
+ 0x3EDD, 0x3EDE, 0x3EDF, 0x3EE0, 0x3EE1, 0x3EE2, 0x3EE3, 0x3EE4,
+ 0x3EE5, 0x3EE6, 0x3EE7, 0x3EE8, 0x3EE9, 0x3EEA, 0x3EEB, 0x3EEC,
+ 0x3EED, 0x3EEE, 0x3EEF, 0x3EF0, 0x3EF1, 0x3EF2, 0x3EF3, 0x3EF4,
+ 0x3EF5, 0x3EF6, 0x3EF7, 0x3EF8, 0x3EF9, 0x3EFA, 0x3EFB, 0x3EFC,
+ 0x3EFD, 0x3EFE, 0x3EFF, 0x3F00, 0x3F01, 0x3F02, 0x3F03, 0x3F04,
+ 0x3F05, 0x3F06, 0x3F07, 0x3F08, 0x3F09, 0x3F0A, 0x3F0B, 0x3F0C,
+ 0x3F0D, 0x3F0E, 0x3F0F, 0x3F10, 0x3F11, 0x3F12, 0x3F13, 0x3F14,
+ 0x3F15, 0x3F16, 0x3F17, 0x3F18, 0x3F19, 0x3F1A, 0x3F1B, 0x3F1C,
+ 0x3F1D, 0x3F1E, 0x3F1F, 0x3F20, 0x3F21, 0x3F22, 0x3F23, 0x3F24,
+ 0x3F25, 0x3F26, 0x3F27, 0x3F28, 0x3F29, 0x3F2A, 0x3F2B, 0x3F2C,
+ 0x3F2D, 0x3F2E, 0x3F2F, 0x3F30, 0x3F31, 0x3F32, 0x3F33, 0x3F34,
+ 0x3F35, 0x3F36, 0x3F37, 0x3F38, 0x3F39, 0x3F3A, 0x3F3B, 0x3F3C,
+ 0x3F3D, 0x3F3E, 0x3F3F, 0x3F40, 0x3F41, 0x3F42, 0x3F43, 0x3F44,
+ 0x3F45, 0x3F46, 0x3F47, 0x3F48, 0x3F49, 0x3F4A, 0x3F4B, 0x3F4C,
+ 0x3F4D, 0x3F4E, 0x3F4F, 0x3F50, 0x3F51, 0x3F52, 0x3F53, 0x3F54,
+ 0x3F55, 0x3F56, 0x3F57, 0x3F58, 0x3F59, 0x3F5A, 0x3F5B, 0x3F5C,
+ 0x3F5D, 0x3F5E, 0x3F5F, 0x3F60, 0x3F61, 0x3F62, 0x3F63, 0x3F64,
+ 0x3F65, 0x3F66, 0x3F67, 0x3F68, 0x3F69, 0x3F6A, 0x3F6B, 0x3F6C,
+ 0x3F6D, 0x3F6E, 0x3F6F, 0x3F70, 0x3F71, 0x3F72, 0x3F73, 0x3F74,
+ 0x3F75, 0x3F76, 0x3F77, 0x3F78, 0x3F79, 0x3F7A, 0x3F7B, 0x3F7C,
+ 0x3F7D, 0x3F7E, 0x3F7F, 0x3F80, 0x3F81, 0x3F82, 0x3F83, 0x3F84,
+ 0x3F85, 0x3F86, 0x3F87, 0x3F88, 0x3F89, 0x3F8A, 0x3F8B, 0x3F8C,
+ 0x3F8D, 0x3F8E, 0x3F8F, 0x3F90, 0x3F91, 0x3F92, 0x3F93, 0x3F94,
+ 0x3F95, 0x3F96, 0x3F97, 0x3F98, 0x3F99, 0x3F9A, 0x3F9B, 0x3F9C,
+ 0x3F9D, 0x3F9E, 0x3F9F, 0x3FA0, 0x3FA1, 0x3FA2, 0x3FA3, 0x3FA4,
+ 0x3FA5, 0x3FA6, 0x3FA7, 0x3FA8, 0x3FA9, 0x3FAA, 0x3FAB, 0x3FAC,
+ 0x3FAD, 0x3FAE, 0x3FAF, 0x3FB0, 0x3FB1, 0x3FB2, 0x3FB3, 0x3FB4,
+ 0x3FB5, 0x3FB6, 0x3FB7, 0x3FB8, 0x3FB9, 0x3FBA, 0x3FBB, 0x3FBC,
+ 0x3FBD, 0x3FBE, 0x3FBF, 0x3FC0, 0x3FC1, 0x3FC2, 0x3FC3, 0x3FC4,
+ 0x3FC5, 0x3FC6, 0x3FC7, 0x3FC8, 0x3FC9, 0x3FCA, 0x3FCB, 0x3FCC,
+ 0x3FCD, 0x3FCE, 0x3FCF, 0x3FD0, 0x3FD1, 0x3FD2, 0x3FD3, 0x3FD4,
+ 0x3FD5, 0x3FD6, 0x3FD7, 0x3FD8, 0x3FD9, 0x3FDA, 0x3FDB, 0x3FDC,
+ 0x3FDD, 0x3FDE, 0x3FDF, 0x3FE0, 0x3FE1, 0x3FE2, 0x3FE3, 0x3FE4,
+ 0x3FE5, 0x3FE6, 0x3FE7, 0x3FE8, 0x3FE9, 0x3FEA, 0x3FEB, 0x3FEC,
+ 0x3FED, 0x3FEE, 0x3FEF, 0x3FF0, 0x3FF1, 0x3FF2, 0x3FF3, 0x3FF4,
+ 0x3FF5, 0x3FF6, 0x3FF7, 0x3FF8, 0x3FF9, 0x3FFA, 0x3FFB, 0x3FFC,
+ 0x3FFD, 0x3FFE, 0x3FFF, 0x4000, 0x4001, 0x4002, 0x4003, 0x4004,
+ 0x4005, 0x4006, 0x4007, 0x4008, 0x4009, 0x400A, 0x400B, 0x400C,
+ 0x400D, 0x400E, 0x400F, 0x4010, 0x4011, 0x4012, 0x4013, 0x4014,
+ 0x4015, 0x4016, 0x4017, 0x4018, 0x4019, 0x401A, 0x401B, 0x401C,
+ 0x401D, 0x401E, 0x401F, 0x4020, 0x4021, 0x4022, 0x4023, 0x4024,
+ 0x4025, 0x4026, 0x4027, 0x4028, 0x4029, 0x402A, 0x402B, 0x402C,
+ 0x402D, 0x402E, 0x402F, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034,
+ 0x4035, 0x4036, 0x4037, 0x4038, 0x4039, 0x403A, 0x403B, 0x403C,
+ 0x403D, 0x403E, 0x403F, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044,
+ 0x4045, 0x4046, 0x4047, 0x4048, 0x4049, 0x404A, 0x404B, 0x404C,
+ 0x404D, 0x404E, 0x404F, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054,
+ 0x4055, 0x4057, 0x4058, 0x4059, 0x405A, 0x405B, 0x405C, 0x405D,
+ 0x405E, 0x405F, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065,
+ 0x4066, 0x4067, 0x4068, 0x4069, 0x406A, 0x406B, 0x406C, 0x406D,
+ 0x406E, 0x406F, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075,
+ 0x4076, 0x4077, 0x4078, 0x4079, 0x407A, 0x407B, 0x407C, 0x407D,
+ 0x407E, 0x407F, 0x4080, 0x4081, 0x4082, 0x4083, 0x4084, 0x4085,
+ 0x4086, 0x4087, 0x4088, 0x4089, 0x408A, 0x408B, 0x408C, 0x408D,
+ 0x408E, 0x408F, 0x4090, 0x4091, 0x4092, 0x4093, 0x4094, 0x4095,
+ 0x4096, 0x4097, 0x4098, 0x4099, 0x409A, 0x409B, 0x409C, 0x409D,
+ 0x409E, 0x409F, 0x40A0, 0x40A1, 0x40A2, 0x40A3, 0x40A4, 0x40A5,
+ 0x40A6, 0x40A7, 0x40A8, 0x40A9, 0x40AA, 0x40AB, 0x40AC, 0x40AD,
+ 0x40AE, 0x40AF, 0x40B0, 0x40B1, 0x40B2, 0x40B3, 0x40B4, 0x40B5,
+ 0x40B6, 0x40B7, 0x40B8, 0x40B9, 0x40BA, 0x40BB, 0x40BC, 0x40BD,
+ 0x40BE, 0x40BF, 0x40C0, 0x40C1, 0x40C2, 0x40C3, 0x40C4, 0x40C5,
+ 0x40C6, 0x40C7, 0x40C8, 0x40C9, 0x40CA, 0x40CB, 0x40CC, 0x40CD,
+ 0x40CE, 0x40CF, 0x40D0, 0x40D1, 0x40D2, 0x40D3, 0x40D4, 0x40D5,
+ 0x40D6, 0x40D7, 0x40D8, 0x40D9, 0x40DA, 0x40DB, 0x40DC, 0x40DD,
+ 0x40DE, 0x40DF, 0x40E0, 0x40E1, 0x40E2, 0x40E3, 0x40E4, 0x40E5,
+ 0x40E6, 0x40E7, 0x40E8, 0x40E9, 0x40EA, 0x40EB, 0x40EC, 0x40ED,
+ 0x40EE, 0x40EF, 0x40F0, 0x40F1, 0x40F2, 0x40F3, 0x40F4, 0x40F5,
+ 0x40F6, 0x40F7, 0x40F8, 0x40F9, 0x40FA, 0x40FB, 0x40FC, 0x40FD,
+ 0x40FE, 0x40FF, 0x4100, 0x4101, 0x4102, 0x4103, 0x4104, 0x4105,
+ 0x4106, 0x4107, 0x4108, 0x4109, 0x410A, 0x410B, 0x410C, 0x410D,
+ 0x410E, 0x410F, 0x4110, 0x4111, 0x4112, 0x4113, 0x4114, 0x4115,
+ 0x4116, 0x4117, 0x4118, 0x4119, 0x411A, 0x411B, 0x411C, 0x411D,
+ 0x411E, 0x411F, 0x4120, 0x4121, 0x4122, 0x4123, 0x4124, 0x4125,
+ 0x4126, 0x4127, 0x4128, 0x4129, 0x412A, 0x412B, 0x412C, 0x412D,
+ 0x412E, 0x412F, 0x4130, 0x4131, 0x4132, 0x4133, 0x4134, 0x4135,
+ 0x4136, 0x4137, 0x4138, 0x4139, 0x413A, 0x413B, 0x413C, 0x413D,
+ 0x413E, 0x413F, 0x4140, 0x4141, 0x4142, 0x4143, 0x4144, 0x4145,
+ 0x4146, 0x4147, 0x4148, 0x4149, 0x414A, 0x414B, 0x414C, 0x414D,
+ 0x414E, 0x414F, 0x4150, 0x4151, 0x4152, 0x4153, 0x4154, 0x4155,
+ 0x4156, 0x4157, 0x4158, 0x4159, 0x415A, 0x415B, 0x415C, 0x415D,
+ 0x415E, 0x4160, 0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166,
+ 0x4167, 0x4168, 0x4169, 0x416A, 0x416B, 0x416C, 0x416D, 0x416E,
+ 0x416F, 0x4170, 0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176,
+ 0x4177, 0x4178, 0x4179, 0x417A, 0x417B, 0x417C, 0x417D, 0x417E,
+ 0x417F, 0x4180, 0x4181, 0x4182, 0x4183, 0x4184, 0x4185, 0x4186,
+ 0x4187, 0x4188, 0x4189, 0x418A, 0x418B, 0x418C, 0x418D, 0x418E,
+ 0x418F, 0x4190, 0x4191, 0x4192, 0x4193, 0x4194, 0x4195, 0x4196,
+ 0x4197, 0x4198, 0x4199, 0x419A, 0x419B, 0x419C, 0x419D, 0x419E,
+ 0x419F, 0x41A0, 0x41A1, 0x41A2, 0x41A3, 0x41A4, 0x41A5, 0x41A6,
+ 0x41A7, 0x41A8, 0x41A9, 0x41AA, 0x41AB, 0x41AC, 0x41AD, 0x41AE,
+ 0x41AF, 0x41B0, 0x41B1, 0x41B2, 0x41B3, 0x41B4, 0x41B5, 0x41B6,
+ 0x41B7, 0x41B8, 0x41B9, 0x41BA, 0x41BB, 0x41BC, 0x41BD, 0x41BE,
+ 0x41BF, 0x41C0, 0x41C1, 0x41C2, 0x41C3, 0x41C4, 0x41C5, 0x41C6,
+ 0x41C7, 0x41C8, 0x41C9, 0x41CA, 0x41CB, 0x41CC, 0x41CD, 0x41CE,
+ 0x41CF, 0x41D0, 0x41D1, 0x41D2, 0x41D3, 0x41D4, 0x41D5, 0x41D6,
+ 0x41D7, 0x41D8, 0x41D9, 0x41DA, 0x41DB, 0x41DC, 0x41DD, 0x41DE,
+ 0x41DF, 0x41E0, 0x41E1, 0x41E2, 0x41E3, 0x41E4, 0x41E5, 0x41E6,
+ 0x41E7, 0x41E8, 0x41E9, 0x41EA, 0x41EB, 0x41EC, 0x41ED, 0x41EE,
+ 0x41EF, 0x41F0, 0x41F1, 0x41F2, 0x41F3, 0x41F4, 0x41F5, 0x41F6,
+ 0x41F7, 0x41F8, 0x41F9, 0x41FA, 0x41FB, 0x41FC, 0x41FD, 0x41FE,
+ 0x41FF, 0x4200, 0x4201, 0x4202, 0x4203, 0x4204, 0x4205, 0x4206,
+ 0x4207, 0x4208, 0x4209, 0x420A, 0x420B, 0x420C, 0x420D, 0x420E,
+ 0x420F, 0x4210, 0x4211, 0x4212, 0x4213, 0x4214, 0x4215, 0x4216,
+ 0x4217, 0x4218, 0x4219, 0x421A, 0x421B, 0x421C, 0x421D, 0x421E,
+ 0x421F, 0x4220, 0x4221, 0x4222, 0x4223, 0x4224, 0x4225, 0x4226,
+ 0x4227, 0x4228, 0x4229, 0x422A, 0x422B, 0x422C, 0x422D, 0x422E,
+ 0x422F, 0x4230, 0x4231, 0x4232, 0x4233, 0x4234, 0x4235, 0x4236,
+ 0x4237, 0x4238, 0x4239, 0x423A, 0x423B, 0x423C, 0x423D, 0x423E,
+ 0x423F, 0x4240, 0x4241, 0x4242, 0x4243, 0x4244, 0x4245, 0x4246,
+ 0x4247, 0x4248, 0x4249, 0x424A, 0x424B, 0x424C, 0x424D, 0x424E,
+ 0x424F, 0x4250, 0x4251, 0x4252, 0x4253, 0x4254, 0x4255, 0x4256,
+ 0x4257, 0x4258, 0x4259, 0x425A, 0x425B, 0x425C, 0x425D, 0x425E,
+ 0x425F, 0x4260, 0x4261, 0x4262, 0x4263, 0x4264, 0x4265, 0x4266,
+ 0x4267, 0x4268, 0x4269, 0x426A, 0x426B, 0x426C, 0x426D, 0x426E,
+ 0x426F, 0x4270, 0x4271, 0x4272, 0x4273, 0x4274, 0x4275, 0x4276,
+ 0x4277, 0x4278, 0x4279, 0x427A, 0x427B, 0x427C, 0x427D, 0x427E,
+ 0x427F, 0x4280, 0x4281, 0x4282, 0x4283, 0x4284, 0x4285, 0x4286,
+ 0x4287, 0x4288, 0x4289, 0x428A, 0x428B, 0x428C, 0x428D, 0x428E,
+ 0x428F, 0x4290, 0x4291, 0x4292, 0x4293, 0x4294, 0x4295, 0x4296,
+ 0x4297, 0x4298, 0x4299, 0x429A, 0x429B, 0x429C, 0x429D, 0x429E,
+ 0x429F, 0x42A0, 0x42A1, 0x42A2, 0x42A3, 0x42A4, 0x42A5, 0x42A6,
+ 0x42A7, 0x42A8, 0x42A9, 0x42AA, 0x42AB, 0x42AC, 0x42AD, 0x42AE,
+ 0x42AF, 0x42B0, 0x42B1, 0x42B2, 0x42B3, 0x42B4, 0x42B5, 0x42B6,
+ 0x42B7, 0x42B8, 0x42B9, 0x42BA, 0x42BB, 0x42BC, 0x42BD, 0x42BE,
+ 0x42BF, 0x42C0, 0x42C1, 0x42C2, 0x42C3, 0x42C4, 0x42C5, 0x42C6,
+ 0x42C7, 0x42C8, 0x42C9, 0x42CA, 0x42CB, 0x42CC, 0x42CD, 0x42CE,
+ 0x42CF, 0x42D0, 0x42D1, 0x42D2, 0x42D3, 0x42D4, 0x42D5, 0x42D6,
+ 0x42D7, 0x42D8, 0x42D9, 0x42DA, 0x42DB, 0x42DC, 0x42DD, 0x42DE,
+ 0x42DF, 0x42E0, 0x42E1, 0x42E2, 0x42E3, 0x42E4, 0x42E5, 0x42E6,
+ 0x42E7, 0x42E8, 0x42E9, 0x42EA, 0x42EB, 0x42EC, 0x42ED, 0x42EE,
+ 0x42EF, 0x42F0, 0x42F1, 0x42F2, 0x42F3, 0x42F4, 0x42F5, 0x42F6,
+ 0x42F7, 0x42F8, 0x42F9, 0x42FA, 0x42FB, 0x42FC, 0x42FD, 0x42FE,
+ 0x42FF, 0x4300, 0x4301, 0x4302, 0x4303, 0x4304, 0x4305, 0x4306,
+ 0x4307, 0x4308, 0x4309, 0x430A, 0x430B, 0x430C, 0x430D, 0x430E,
+ 0x430F, 0x4310, 0x4311, 0x4312, 0x4313, 0x4314, 0x4315, 0x4316,
+ 0x4317, 0x4318, 0x4319, 0x431A, 0x431B, 0x431C, 0x431D, 0x431E,
+ 0x431F, 0x4320, 0x4321, 0x4322, 0x4323, 0x4324, 0x4325, 0x4326,
+ 0x4327, 0x4328, 0x4329, 0x432A, 0x432B, 0x432C, 0x432D, 0x432E,
+ 0x432F, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334, 0x4335, 0x4336,
+ 0x4338, 0x4339, 0x433A, 0x433B, 0x433C, 0x433D, 0x433E, 0x433F,
+ 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345, 0x4346, 0x4347,
+ 0x4348, 0x4349, 0x434A, 0x434B, 0x434C, 0x434D, 0x434E, 0x434F,
+ 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355, 0x4356, 0x4357,
+ 0x4358, 0x4359, 0x435A, 0x435B, 0x435C, 0x435D, 0x435E, 0x435F,
+ 0x4360, 0x4361, 0x4362, 0x4363, 0x4364, 0x4365, 0x4366, 0x4367,
+ 0x4368, 0x4369, 0x436A, 0x436B, 0x436C, 0x436D, 0x436E, 0x436F,
+ 0x4370, 0x4371, 0x4372, 0x4373, 0x4374, 0x4375, 0x4376, 0x4377,
+ 0x4378, 0x4379, 0x437A, 0x437B, 0x437C, 0x437D, 0x437E, 0x437F,
+ 0x4380, 0x4381, 0x4382, 0x4383, 0x4384, 0x4385, 0x4386, 0x4387,
+ 0x4388, 0x4389, 0x438A, 0x438B, 0x438C, 0x438D, 0x438E, 0x438F,
+ 0x4390, 0x4391, 0x4392, 0x4393, 0x4394, 0x4395, 0x4396, 0x4397,
+ 0x4398, 0x4399, 0x439A, 0x439B, 0x439C, 0x439D, 0x439E, 0x439F,
+ 0x43A0, 0x43A1, 0x43A2, 0x43A3, 0x43A4, 0x43A5, 0x43A6, 0x43A7,
+ 0x43A8, 0x43A9, 0x43AA, 0x43AB, 0x43AD, 0x43AE, 0x43AF, 0x43B0,
+ 0x43B2, 0x43B3, 0x43B4, 0x43B5, 0x43B6, 0x43B7, 0x43B8, 0x43B9,
+ 0x43BA, 0x43BB, 0x43BC, 0x43BD, 0x43BE, 0x43BF, 0x43C0, 0x43C1,
+ 0x43C2, 0x43C3, 0x43C4, 0x43C5, 0x43C6, 0x43C7, 0x43C8, 0x43C9,
+ 0x43CA, 0x43CB, 0x43CC, 0x43CD, 0x43CE, 0x43CF, 0x43D0, 0x43D1,
+ 0x43D2, 0x43D3, 0x43D4, 0x43D5, 0x43D6, 0x43D7, 0x43D8, 0x43D9,
+ 0x43DA, 0x43DB, 0x43DC, 0x43DE, 0x43DF, 0x43E0, 0x43E1, 0x43E2,
+ 0x43E3, 0x43E4, 0x43E5, 0x43E6, 0x43E7, 0x43E8, 0x43E9, 0x43EA,
+ 0x43EB, 0x43EC, 0x43ED, 0x43EE, 0x43EF, 0x43F0, 0x43F1, 0x43F2,
+ 0x43F3, 0x43F4, 0x43F5, 0x43F6, 0x43F7, 0x43F8, 0x43F9, 0x43FA,
+ 0x43FB, 0x43FC, 0x43FD, 0x43FE, 0x43FF, 0x4400, 0x4401, 0x4402,
+ 0x4403, 0x4404, 0x4405, 0x4406, 0x4407, 0x4408, 0x4409, 0x440A,
+ 0x440B, 0x440C, 0x440D, 0x440E, 0x440F, 0x4410, 0x4411, 0x4412,
+ 0x4413, 0x4414, 0x4415, 0x4416, 0x4417, 0x4418, 0x4419, 0x441A,
+ 0x441B, 0x441C, 0x441D, 0x441E, 0x441F, 0x4420, 0x4421, 0x4422,
+ 0x4423, 0x4424, 0x4425, 0x4426, 0x4427, 0x4428, 0x4429, 0x442A,
+ 0x442B, 0x442C, 0x442D, 0x442E, 0x442F, 0x4430, 0x4431, 0x4432,
+ 0x4433, 0x4434, 0x4435, 0x4436, 0x4437, 0x4438, 0x4439, 0x443A,
+ 0x443B, 0x443C, 0x443D, 0x443E, 0x443F, 0x4440, 0x4441, 0x4442,
+ 0x4443, 0x4444, 0x4445, 0x4446, 0x4447, 0x4448, 0x4449, 0x444A,
+ 0x444B, 0x444C, 0x444D, 0x444E, 0x444F, 0x4450, 0x4451, 0x4452,
+ 0x4453, 0x4454, 0x4455, 0x4456, 0x4457, 0x4458, 0x4459, 0x445A,
+ 0x445B, 0x445C, 0x445D, 0x445E, 0x445F, 0x4460, 0x4461, 0x4462,
+ 0x4463, 0x4464, 0x4465, 0x4466, 0x4467, 0x4468, 0x4469, 0x446A,
+ 0x446B, 0x446C, 0x446D, 0x446E, 0x446F, 0x4470, 0x4471, 0x4472,
+ 0x4473, 0x4474, 0x4475, 0x4476, 0x4477, 0x4478, 0x4479, 0x447A,
+ 0x447B, 0x447C, 0x447D, 0x447E, 0x447F, 0x4480, 0x4481, 0x4482,
+ 0x4483, 0x4484, 0x4485, 0x4486, 0x4487, 0x4488, 0x4489, 0x448A,
+ 0x448B, 0x448C, 0x448D, 0x448E, 0x448F, 0x4490, 0x4491, 0x4492,
+ 0x4493, 0x4494, 0x4495, 0x4496, 0x4497, 0x4498, 0x4499, 0x449A,
+ 0x449B, 0x449C, 0x449D, 0x449E, 0x449F, 0x44A0, 0x44A1, 0x44A2,
+ 0x44A3, 0x44A4, 0x44A5, 0x44A6, 0x44A7, 0x44A8, 0x44A9, 0x44AA,
+ 0x44AB, 0x44AC, 0x44AD, 0x44AE, 0x44AF, 0x44B0, 0x44B1, 0x44B2,
+ 0x44B3, 0x44B4, 0x44B5, 0x44B6, 0x44B7, 0x44B8, 0x44B9, 0x44BA,
+ 0x44BB, 0x44BC, 0x44BD, 0x44BE, 0x44BF, 0x44C0, 0x44C1, 0x44C2,
+ 0x44C3, 0x44C4, 0x44C5, 0x44C6, 0x44C7, 0x44C8, 0x44C9, 0x44CA,
+ 0x44CB, 0x44CC, 0x44CD, 0x44CE, 0x44CF, 0x44D0, 0x44D1, 0x44D2,
+ 0x44D3, 0x44D4, 0x44D5, 0x44D7, 0x44D8, 0x44D9, 0x44DA, 0x44DB,
+ 0x44DC, 0x44DD, 0x44DE, 0x44DF, 0x44E0, 0x44E1, 0x44E2, 0x44E3,
+ 0x44E4, 0x44E5, 0x44E6, 0x44E7, 0x44E8, 0x44E9, 0x44EA, 0x44EB,
+ 0x44EC, 0x44ED, 0x44EE, 0x44EF, 0x44F0, 0x44F1, 0x44F2, 0x44F3,
+ 0x44F4, 0x44F5, 0x44F6, 0x44F7, 0x44F8, 0x44F9, 0x44FA, 0x44FB,
+ 0x44FC, 0x44FD, 0x44FE, 0x44FF, 0x4500, 0x4501, 0x4502, 0x4503,
+ 0x4504, 0x4505, 0x4506, 0x4507, 0x4508, 0x4509, 0x450A, 0x450B,
+ 0x450C, 0x450D, 0x450E, 0x450F, 0x4510, 0x4511, 0x4512, 0x4513,
+ 0x4514, 0x4515, 0x4516, 0x4517, 0x4518, 0x4519, 0x451A, 0x451B,
+ 0x451C, 0x451D, 0x451E, 0x451F, 0x4520, 0x4521, 0x4522, 0x4523,
+ 0x4524, 0x4525, 0x4526, 0x4527, 0x4528, 0x4529, 0x452A, 0x452B,
+ 0x452C, 0x452D, 0x452E, 0x452F, 0x4530, 0x4531, 0x4532, 0x4533,
+ 0x4534, 0x4535, 0x4536, 0x4537, 0x4538, 0x4539, 0x453A, 0x453B,
+ 0x453C, 0x453D, 0x453E, 0x453F, 0x4540, 0x4541, 0x4542, 0x4543,
+ 0x4544, 0x4545, 0x4546, 0x4547, 0x4548, 0x4549, 0x454A, 0x454B,
+ 0x454C, 0x454D, 0x454E, 0x454F, 0x4550, 0x4551, 0x4552, 0x4553,
+ 0x4554, 0x4555, 0x4556, 0x4557, 0x4558, 0x4559, 0x455A, 0x455B,
+ 0x455C, 0x455D, 0x455E, 0x455F, 0x4560, 0x4561, 0x4562, 0x4563,
+ 0x4564, 0x4565, 0x4566, 0x4567, 0x4568, 0x4569, 0x456A, 0x456B,
+ 0x456C, 0x456D, 0x456E, 0x456F, 0x4570, 0x4571, 0x4572, 0x4573,
+ 0x4574, 0x4575, 0x4576, 0x4577, 0x4578, 0x4579, 0x457A, 0x457B,
+ 0x457C, 0x457D, 0x457E, 0x457F, 0x4580, 0x4581, 0x4582, 0x4583,
+ 0x4584, 0x4585, 0x4586, 0x4587, 0x4588, 0x4589, 0x458A, 0x458B,
+ 0x458C, 0x458D, 0x458E, 0x458F, 0x4590, 0x4591, 0x4592, 0x4593,
+ 0x4594, 0x4595, 0x4596, 0x4597, 0x4598, 0x4599, 0x459A, 0x459B,
+ 0x459C, 0x459D, 0x459E, 0x459F, 0x45A0, 0x45A1, 0x45A2, 0x45A3,
+ 0x45A4, 0x45A5, 0x45A6, 0x45A7, 0x45A8, 0x45A9, 0x45AA, 0x45AB,
+ 0x45AC, 0x45AD, 0x45AE, 0x45AF, 0x45B0, 0x45B1, 0x45B2, 0x45B3,
+ 0x45B4, 0x45B5, 0x45B6, 0x45B7, 0x45B8, 0x45B9, 0x45BA, 0x45BB,
+ 0x45BC, 0x45BD, 0x45BE, 0x45BF, 0x45C0, 0x45C1, 0x45C2, 0x45C3,
+ 0x45C4, 0x45C5, 0x45C6, 0x45C7, 0x45C8, 0x45C9, 0x45CA, 0x45CB,
+ 0x45CC, 0x45CD, 0x45CE, 0x45CF, 0x45D0, 0x45D1, 0x45D2, 0x45D3,
+ 0x45D4, 0x45D5, 0x45D6, 0x45D7, 0x45D8, 0x45D9, 0x45DA, 0x45DB,
+ 0x45DC, 0x45DD, 0x45DE, 0x45DF, 0x45E0, 0x45E1, 0x45E2, 0x45E3,
+ 0x45E4, 0x45E5, 0x45E6, 0x45E7, 0x45E8, 0x45E9, 0x45EA, 0x45EB,
+ 0x45EC, 0x45ED, 0x45EE, 0x45EF, 0x45F0, 0x45F1, 0x45F2, 0x45F3,
+ 0x45F4, 0x45F5, 0x45F6, 0x45F7, 0x45F8, 0x45F9, 0x45FA, 0x45FB,
+ 0x45FC, 0x45FD, 0x45FE, 0x45FF, 0x4600, 0x4601, 0x4602, 0x4603,
+ 0x4604, 0x4605, 0x4606, 0x4607, 0x4608, 0x4609, 0x460A, 0x460B,
+ 0x460C, 0x460D, 0x460E, 0x460F, 0x4610, 0x4611, 0x4612, 0x4613,
+ 0x4614, 0x4615, 0x4616, 0x4617, 0x4618, 0x4619, 0x461A, 0x461B,
+ 0x461C, 0x461D, 0x461E, 0x461F, 0x4620, 0x4621, 0x4622, 0x4623,
+ 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462A, 0x462B,
+ 0x462C, 0x462D, 0x462E, 0x462F, 0x4630, 0x4631, 0x4632, 0x4633,
+ 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463A, 0x463B,
+ 0x463C, 0x463D, 0x463E, 0x463F, 0x4640, 0x4641, 0x4642, 0x4643,
+ 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464A, 0x464B,
+ 0x464D, 0x464E, 0x464F, 0x4650, 0x4651, 0x4652, 0x4653, 0x4654,
+ 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465A, 0x465B, 0x465C,
+ 0x465D, 0x465E, 0x465F, 0x4660, 0x4662, 0x4663, 0x4664, 0x4665,
+ 0x4666, 0x4667, 0x4668, 0x4669, 0x466A, 0x466B, 0x466C, 0x466D,
+ 0x466E, 0x466F, 0x4670, 0x4671, 0x4672, 0x4673, 0x4674, 0x4675,
+ 0x4676, 0x4677, 0x4678, 0x4679, 0x467A, 0x467B, 0x467C, 0x467D,
+ 0x467E, 0x467F, 0x4680, 0x4681, 0x4682, 0x4683, 0x4684, 0x4685,
+ 0x4686, 0x4687, 0x4688, 0x4689, 0x468A, 0x468B, 0x468C, 0x468D,
+ 0x468E, 0x468F, 0x4690, 0x4691, 0x4692, 0x4693, 0x4694, 0x4695,
+ 0x4696, 0x4697, 0x4698, 0x4699, 0x469A, 0x469B, 0x469C, 0x469D,
+ 0x469E, 0x469F, 0x46A0, 0x46A1, 0x46A2, 0x46A3, 0x46A4, 0x46A5,
+ 0x46A6, 0x46A7, 0x46A8, 0x46A9, 0x46AA, 0x46AB, 0x46AC, 0x46AD,
+ 0x46AE, 0x46AF, 0x46B0, 0x46B1, 0x46B2, 0x46B3, 0x46B4, 0x46B5,
+ 0x46B6, 0x46B7, 0x46B8, 0x46B9, 0x46BA, 0x46BB, 0x46BC, 0x46BD,
+ 0x46BE, 0x46BF, 0x46C0, 0x46C1, 0x46C2, 0x46C3, 0x46C4, 0x46C5,
+ 0x46C6, 0x46C7, 0x46C8, 0x46C9, 0x46CA, 0x46CB, 0x46CC, 0x46CD,
+ 0x46CE, 0x46CF, 0x46D0, 0x46D1, 0x46D2, 0x46D3, 0x46D4, 0x46D5,
+ 0x46D6, 0x46D7, 0x46D8, 0x46D9, 0x46DA, 0x46DB, 0x46DC, 0x46DD,
+ 0x46DE, 0x46DF, 0x46E0, 0x46E1, 0x46E2, 0x46E3, 0x46E4, 0x46E5,
+ 0x46E6, 0x46E7, 0x46E8, 0x46E9, 0x46EA, 0x46EB, 0x46EC, 0x46ED,
+ 0x46EE, 0x46EF, 0x46F0, 0x46F1, 0x46F2, 0x46F3, 0x46F4, 0x46F5,
+ 0x46F6, 0x46F7, 0x46F8, 0x46F9, 0x46FA, 0x46FB, 0x46FC, 0x46FD,
+ 0x46FE, 0x46FF, 0x4700, 0x4701, 0x4702, 0x4703, 0x4704, 0x4705,
+ 0x4706, 0x4707, 0x4708, 0x4709, 0x470A, 0x470B, 0x470C, 0x470D,
+ 0x470E, 0x470F, 0x4710, 0x4711, 0x4712, 0x4713, 0x4714, 0x4715,
+ 0x4716, 0x4717, 0x4718, 0x4719, 0x471A, 0x471B, 0x471C, 0x471D,
+ 0x471E, 0x471F, 0x4720, 0x4721, 0x4722, 0x4724, 0x4725, 0x4726,
+ 0x4727, 0x4728, 0x472A, 0x472B, 0x472C, 0x472D, 0x472E, 0x472F,
+ 0x4730, 0x4731, 0x4732, 0x4733, 0x4734, 0x4735, 0x4736, 0x4737,
+ 0x4738, 0x4739, 0x473A, 0x473B, 0x473C, 0x473D, 0x473E, 0x473F,
+ 0x4740, 0x4741, 0x4742, 0x4743, 0x4744, 0x4745, 0x4746, 0x4747,
+ 0x4748, 0x4749, 0x474A, 0x474B, 0x474C, 0x474D, 0x474E, 0x474F,
+ 0x4750, 0x4751, 0x4752, 0x4753, 0x4754, 0x4755, 0x4756, 0x4757,
+ 0x4758, 0x4759, 0x475A, 0x475B, 0x475C, 0x475D, 0x475E, 0x475F,
+ 0x4760, 0x4761, 0x4762, 0x4763, 0x4764, 0x4765, 0x4766, 0x4767,
+ 0x4768, 0x4769, 0x476A, 0x476B, 0x476C, 0x476D, 0x476E, 0x476F,
+ 0x4770, 0x4771, 0x4772, 0x4773, 0x4774, 0x4775, 0x4776, 0x4777,
+ 0x4778, 0x4779, 0x477A, 0x477B, 0x477D, 0x477E, 0x477F, 0x4780,
+ 0x4781, 0x4782, 0x4783, 0x4784, 0x4785, 0x4786, 0x4787, 0x4788,
+ 0x4789, 0x478A, 0x478B, 0x478C, 0x478E, 0x478F, 0x4790, 0x4791,
+ 0x4792, 0x4793, 0x4794, 0x4795, 0x4796, 0x4797, 0x4798, 0x4799,
+ 0x479A, 0x479B, 0x479C, 0x479D, 0x479E, 0x479F, 0x47A0, 0x47A1,
+ 0x47A2, 0x47A3, 0x47A4, 0x47A5, 0x47A6, 0x47A7, 0x47A8, 0x47A9,
+ 0x47AA, 0x47AB, 0x47AC, 0x47AD, 0x47AE, 0x47AF, 0x47B0, 0x47B1,
+ 0x47B2, 0x47B3, 0x47B4, 0x47B5, 0x47B6, 0x47B7, 0x47B8, 0x47B9,
+ 0x47BA, 0x47BB, 0x47BC, 0x47BD, 0x47BE, 0x47BF, 0x47C0, 0x47C1,
+ 0x47C2, 0x47C3, 0x47C4, 0x47C5, 0x47C6, 0x47C7, 0x47C8, 0x47C9,
+ 0x47CA, 0x47CB, 0x47CC, 0x47CD, 0x47CE, 0x47CF, 0x47D0, 0x47D1,
+ 0x47D2, 0x47D3, 0x47D4, 0x47D5, 0x47D6, 0x47D7, 0x47D8, 0x47D9,
+ 0x47DA, 0x47DB, 0x47DC, 0x47DD, 0x47DE, 0x47DF, 0x47E0, 0x47E1,
+ 0x47E2, 0x47E3, 0x47E4, 0x47E5, 0x47E6, 0x47E7, 0x47E8, 0x47E9,
+ 0x47EA, 0x47EB, 0x47EC, 0x47ED, 0x47EE, 0x47EF, 0x47F0, 0x47F1,
+ 0x47F2, 0x47F3, 0x47F4, 0x47F5, 0x47F6, 0x47F7, 0x47F8, 0x47F9,
+ 0x47FA, 0x47FB, 0x47FC, 0x47FD, 0x47FE, 0x47FF, 0x4800, 0x4801,
+ 0x4802, 0x4803, 0x4804, 0x4805, 0x4806, 0x4807, 0x4808, 0x4809,
+ 0x480A, 0x480B, 0x480C, 0x480D, 0x480E, 0x480F, 0x4810, 0x4811,
+ 0x4812, 0x4813, 0x4814, 0x4815, 0x4816, 0x4817, 0x4818, 0x4819,
+ 0x481A, 0x481B, 0x481C, 0x481D, 0x481E, 0x481F, 0x4820, 0x4821,
+ 0x4822, 0x4823, 0x4824, 0x4825, 0x4826, 0x4827, 0x4828, 0x4829,
+ 0x482A, 0x482B, 0x482C, 0x482D, 0x482E, 0x482F, 0x4830, 0x4831,
+ 0x4832, 0x4833, 0x4834, 0x4835, 0x4836, 0x4837, 0x4838, 0x4839,
+ 0x483A, 0x483B, 0x483C, 0x483D, 0x483E, 0x483F, 0x4840, 0x4841,
+ 0x4842, 0x4843, 0x4844, 0x4845, 0x4846, 0x4847, 0x4848, 0x4849,
+ 0x484A, 0x484B, 0x484C, 0x484D, 0x484E, 0x484F, 0x4850, 0x4851,
+ 0x4852, 0x4853, 0x4854, 0x4855, 0x4856, 0x4857, 0x4858, 0x4859,
+ 0x485A, 0x485B, 0x485C, 0x485D, 0x485E, 0x485F, 0x4860, 0x4861,
+ 0x4862, 0x4863, 0x4864, 0x4865, 0x4866, 0x4867, 0x4868, 0x4869,
+ 0x486A, 0x486B, 0x486C, 0x486D, 0x486E, 0x486F, 0x4870, 0x4871,
+ 0x4872, 0x4873, 0x4874, 0x4875, 0x4876, 0x4877, 0x4878, 0x4879,
+ 0x487A, 0x487B, 0x487C, 0x487D, 0x487E, 0x487F, 0x4880, 0x4881,
+ 0x4882, 0x4883, 0x4884, 0x4885, 0x4886, 0x4887, 0x4888, 0x4889,
+ 0x488A, 0x488B, 0x488C, 0x488D, 0x488E, 0x488F, 0x4890, 0x4891,
+ 0x4892, 0x4893, 0x4894, 0x4895, 0x4896, 0x4897, 0x4898, 0x4899,
+ 0x489A, 0x489B, 0x489C, 0x489D, 0x489E, 0x489F, 0x48A0, 0x48A1,
+ 0x48A2, 0x48A3, 0x48A4, 0x48A5, 0x48A6, 0x48A7, 0x48A8, 0x48A9,
+ 0x48AA, 0x48AB, 0x48AC, 0x48AD, 0x48AE, 0x48AF, 0x48B0, 0x48B1,
+ 0x48B2, 0x48B3, 0x48B4, 0x48B5, 0x48B6, 0x48B7, 0x48B8, 0x48B9,
+ 0x48BA, 0x48BB, 0x48BC, 0x48BD, 0x48BE, 0x48BF, 0x48C0, 0x48C1,
+ 0x48C2, 0x48C3, 0x48C4, 0x48C5, 0x48C6, 0x48C7, 0x48C8, 0x48C9,
+ 0x48CA, 0x48CB, 0x48CC, 0x48CD, 0x48CE, 0x48CF, 0x48D0, 0x48D1,
+ 0x48D2, 0x48D3, 0x48D4, 0x48D5, 0x48D6, 0x48D7, 0x48D8, 0x48D9,
+ 0x48DA, 0x48DB, 0x48DC, 0x48DD, 0x48DE, 0x48DF, 0x48E0, 0x48E1,
+ 0x48E2, 0x48E3, 0x48E4, 0x48E5, 0x48E6, 0x48E7, 0x48E8, 0x48E9,
+ 0x48EA, 0x48EB, 0x48EC, 0x48ED, 0x48EE, 0x48EF, 0x48F0, 0x48F1,
+ 0x48F2, 0x48F3, 0x48F4, 0x48F5, 0x48F6, 0x48F7, 0x48F8, 0x48F9,
+ 0x48FA, 0x48FB, 0x48FC, 0x48FD, 0x48FE, 0x48FF, 0x4900, 0x4901,
+ 0x4902, 0x4903, 0x4904, 0x4905, 0x4906, 0x4907, 0x4908, 0x4909,
+ 0x490A, 0x490B, 0x490C, 0x490D, 0x490E, 0x490F, 0x4910, 0x4911,
+ 0x4912, 0x4913, 0x4914, 0x4915, 0x4916, 0x4917, 0x4918, 0x4919,
+ 0x491A, 0x491B, 0x491C, 0x491D, 0x491E, 0x491F, 0x4920, 0x4921,
+ 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928, 0x4929,
+ 0x492A, 0x492B, 0x492C, 0x492D, 0x492E, 0x492F, 0x4930, 0x4931,
+ 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938, 0x4939,
+ 0x493A, 0x493B, 0x493C, 0x493D, 0x493E, 0x493F, 0x4940, 0x4941,
+ 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4948, 0x4949, 0x494A,
+ 0x494B, 0x494C, 0x494D, 0x494E, 0x494F, 0x4950, 0x4951, 0x4952,
+ 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958, 0x4959, 0x495A,
+ 0x495B, 0x495C, 0x495D, 0x495E, 0x495F, 0x4960, 0x4961, 0x4962,
+ 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968, 0x4969, 0x496A,
+ 0x496B, 0x496C, 0x496D, 0x496E, 0x496F, 0x4970, 0x4971, 0x4972,
+ 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978, 0x4979, 0x497B,
+ 0x497C, 0x497E, 0x497F, 0x4980, 0x4981, 0x4984, 0x4987, 0x4988,
+ 0x4989, 0x498A, 0x498B, 0x498C, 0x498D, 0x498E, 0x498F, 0x4990,
+ 0x4991, 0x4992, 0x4993, 0x4994, 0x4995, 0x4996, 0x4997, 0x4998,
+ 0x4999, 0x499A, 0x499C, 0x499D, 0x499E, 0x49A0, 0x49A1, 0x49A2,
+ 0x49A3, 0x49A4, 0x49A5, 0x49A6, 0x49A7, 0x49A8, 0x49A9, 0x49AA,
+ 0x49AB, 0x49AC, 0x49AD, 0x49AE, 0x49AF, 0x49B0, 0x49B1, 0x49B2,
+ 0x49B3, 0x49B4, 0x49B5, 0x49B8, 0x49B9, 0x49BA, 0x49BB, 0x49BC,
+ 0x49BD, 0x49BE, 0x49BF, 0x49C0, 0x49C1, 0x49C2, 0x49C3, 0x49C4,
+ 0x49C5, 0x49C6, 0x49C7, 0x49C8, 0x49C9, 0x49CA, 0x49CB, 0x49CC,
+ 0x49CD, 0x49CE, 0x49CF, 0x49D0, 0x49D1, 0x49D2, 0x49D3, 0x49D4,
+ 0x49D5, 0x49D6, 0x49D7, 0x49D8, 0x49D9, 0x49DA, 0x49DB, 0x49DC,
+ 0x49DD, 0x49DE, 0x49DF, 0x49E0, 0x49E1, 0x49E2, 0x49E3, 0x49E4,
+ 0x49E5, 0x49E6, 0x49E7, 0x49E8, 0x49E9, 0x49EA, 0x49EB, 0x49EC,
+ 0x49ED, 0x49EE, 0x49EF, 0x49F0, 0x49F1, 0x49F2, 0x49F3, 0x49F4,
+ 0x49F5, 0x49F6, 0x49F7, 0x49F8, 0x49F9, 0x49FA, 0x49FB, 0x49FC,
+ 0x49FD, 0x49FE, 0x49FF, 0x4A00, 0x4A01, 0x4A02, 0x4A03, 0x4A04,
+ 0x4A05, 0x4A06, 0x4A07, 0x4A08, 0x4A09, 0x4A0A, 0x4A0B, 0x4A0C,
+ 0x4A0D, 0x4A0E, 0x4A0F, 0x4A10, 0x4A11, 0x4A12, 0x4A13, 0x4A14,
+ 0x4A15, 0x4A16, 0x4A17, 0x4A18, 0x4A19, 0x4A1A, 0x4A1B, 0x4A1C,
+ 0x4A1D, 0x4A1E, 0x4A1F, 0x4A20, 0x4A21, 0x4A22, 0x4A23, 0x4A24,
+ 0x4A25, 0x4A26, 0x4A27, 0x4A28, 0x4A29, 0x4A2A, 0x4A2B, 0x4A2C,
+ 0x4A2D, 0x4A2E, 0x4A2F, 0x4A30, 0x4A31, 0x4A32, 0x4A33, 0x4A34,
+ 0x4A35, 0x4A36, 0x4A37, 0x4A38, 0x4A39, 0x4A3A, 0x4A3B, 0x4A3C,
+ 0x4A3D, 0x4A3E, 0x4A3F, 0x4A40, 0x4A41, 0x4A42, 0x4A43, 0x4A44,
+ 0x4A45, 0x4A46, 0x4A47, 0x4A48, 0x4A49, 0x4A4A, 0x4A4B, 0x4A4C,
+ 0x4A4D, 0x4A4E, 0x4A4F, 0x4A50, 0x4A51, 0x4A52, 0x4A53, 0x4A54,
+ 0x4A55, 0x4A56, 0x4A57, 0x4A58, 0x4A59, 0x4A5A, 0x4A5B, 0x4A5C,
+ 0x4A5D, 0x4A5E, 0x4A5F, 0x4A60, 0x4A61, 0x4A62, 0x4A63, 0x4A64,
+ 0x4A65, 0x4A66, 0x4A67, 0x4A68, 0x4A69, 0x4A6A, 0x4A6B, 0x4A6C,
+ 0x4A6D, 0x4A6E, 0x4A6F, 0x4A70, 0x4A71, 0x4A72, 0x4A73, 0x4A74,
+ 0x4A75, 0x4A76, 0x4A77, 0x4A78, 0x4A79, 0x4A7A, 0x4A7B, 0x4A7C,
+ 0x4A7D, 0x4A7E, 0x4A7F, 0x4A80, 0x4A81, 0x4A82, 0x4A83, 0x4A84,
+ 0x4A85, 0x4A86, 0x4A87, 0x4A88, 0x4A89, 0x4A8A, 0x4A8B, 0x4A8C,
+ 0x4A8D, 0x4A8E, 0x4A8F, 0x4A90, 0x4A91, 0x4A92, 0x4A93, 0x4A94,
+ 0x4A95, 0x4A96, 0x4A97, 0x4A98, 0x4A99, 0x4A9A, 0x4A9B, 0x4A9C,
+ 0x4A9D, 0x4A9E, 0x4A9F, 0x4AA0, 0x4AA1, 0x4AA2, 0x4AA3, 0x4AA4,
+ 0x4AA5, 0x4AA6, 0x4AA7, 0x4AA8, 0x4AA9, 0x4AAA, 0x4AAB, 0x4AAC,
+ 0x4AAD, 0x4AAE, 0x4AAF, 0x4AB0, 0x4AB1, 0x4AB2, 0x4AB3, 0x4AB4,
+ 0x4AB5, 0x4AB6, 0x4AB7, 0x4AB8, 0x4AB9, 0x4ABA, 0x4ABB, 0x4ABC,
+ 0x4ABD, 0x4ABE, 0x4ABF, 0x4AC0, 0x4AC1, 0x4AC2, 0x4AC3, 0x4AC4,
+ 0x4AC5, 0x4AC6, 0x4AC7, 0x4AC8, 0x4AC9, 0x4ACA, 0x4ACB, 0x4ACC,
+ 0x4ACD, 0x4ACE, 0x4ACF, 0x4AD0, 0x4AD1, 0x4AD2, 0x4AD3, 0x4AD4,
+ 0x4AD5, 0x4AD6, 0x4AD7, 0x4AD8, 0x4AD9, 0x4ADA, 0x4ADB, 0x4ADC,
+ 0x4ADD, 0x4ADE, 0x4ADF, 0x4AE0, 0x4AE1, 0x4AE2, 0x4AE3, 0x4AE4,
+ 0x4AE5, 0x4AE6, 0x4AE7, 0x4AE8, 0x4AE9, 0x4AEA, 0x4AEB, 0x4AEC,
+ 0x4AED, 0x4AEE, 0x4AEF, 0x4AF0, 0x4AF1, 0x4AF2, 0x4AF3, 0x4AF4,
+ 0x4AF5, 0x4AF6, 0x4AF7, 0x4AF8, 0x4AF9, 0x4AFA, 0x4AFB, 0x4AFC,
+ 0x4AFD, 0x4AFE, 0x4AFF, 0x4B00, 0x4B01, 0x4B02, 0x4B03, 0x4B04,
+ 0x4B05, 0x4B06, 0x4B07, 0x4B08, 0x4B09, 0x4B0A, 0x4B0B, 0x4B0C,
+ 0x4B0D, 0x4B0E, 0x4B0F, 0x4B10, 0x4B11, 0x4B12, 0x4B13, 0x4B14,
+ 0x4B15, 0x4B16, 0x4B17, 0x4B18, 0x4B19, 0x4B1A, 0x4B1B, 0x4B1C,
+ 0x4B1D, 0x4B1E, 0x4B1F, 0x4B20, 0x4B21, 0x4B22, 0x4B23, 0x4B24,
+ 0x4B25, 0x4B26, 0x4B27, 0x4B28, 0x4B29, 0x4B2A, 0x4B2B, 0x4B2C,
+ 0x4B2D, 0x4B2E, 0x4B2F, 0x4B30, 0x4B31, 0x4B32, 0x4B33, 0x4B34,
+ 0x4B35, 0x4B36, 0x4B37, 0x4B38, 0x4B39, 0x4B3A, 0x4B3B, 0x4B3C,
+ 0x4B3D, 0x4B3E, 0x4B3F, 0x4B40, 0x4B41, 0x4B42, 0x4B43, 0x4B44,
+ 0x4B45, 0x4B46, 0x4B47, 0x4B48, 0x4B49, 0x4B4A, 0x4B4B, 0x4B4C,
+ 0x4B4D, 0x4B4E, 0x4B4F, 0x4B50, 0x4B51, 0x4B52, 0x4B53, 0x4B54,
+ 0x4B55, 0x4B56, 0x4B57, 0x4B58, 0x4B59, 0x4B5A, 0x4B5B, 0x4B5C,
+ 0x4B5D, 0x4B5E, 0x4B5F, 0x4B60, 0x4B61, 0x4B62, 0x4B63, 0x4B64,
+ 0x4B65, 0x4B66, 0x4B67, 0x4B68, 0x4B69, 0x4B6A, 0x4B6B, 0x4B6C,
+ 0x4B6D, 0x4B6E, 0x4B6F, 0x4B70, 0x4B71, 0x4B72, 0x4B73, 0x4B74,
+ 0x4B75, 0x4B76, 0x4B77, 0x4B78, 0x4B79, 0x4B7A, 0x4B7B, 0x4B7C,
+ 0x4B7D, 0x4B7E, 0x4B7F, 0x4B80, 0x4B81, 0x4B82, 0x4B83, 0x4B84,
+ 0x4B85, 0x4B86, 0x4B87, 0x4B88, 0x4B89, 0x4B8A, 0x4B8B, 0x4B8C,
+ 0x4B8D, 0x4B8E, 0x4B8F, 0x4B90, 0x4B91, 0x4B92, 0x4B93, 0x4B94,
+ 0x4B95, 0x4B96, 0x4B97, 0x4B98, 0x4B99, 0x4B9A, 0x4B9B, 0x4B9C,
+ 0x4B9D, 0x4B9E, 0x4B9F, 0x4BA0, 0x4BA1, 0x4BA2, 0x4BA3, 0x4BA4,
+ 0x4BA5, 0x4BA6, 0x4BA7, 0x4BA8, 0x4BA9, 0x4BAA, 0x4BAB, 0x4BAC,
+ 0x4BAD, 0x4BAE, 0x4BAF, 0x4BB0, 0x4BB1, 0x4BB2, 0x4BB3, 0x4BB4,
+ 0x4BB5, 0x4BB6, 0x4BB7, 0x4BB8, 0x4BB9, 0x4BBA, 0x4BBB, 0x4BBC,
+ 0x4BBD, 0x4BBE, 0x4BBF, 0x4BC0, 0x4BC1, 0x4BC2, 0x4BC3, 0x4BC4,
+ 0x4BC5, 0x4BC6, 0x4BC7, 0x4BC8, 0x4BC9, 0x4BCA, 0x4BCB, 0x4BCC,
+ 0x4BCD, 0x4BCE, 0x4BCF, 0x4BD0, 0x4BD1, 0x4BD2, 0x4BD3, 0x4BD4,
+ 0x4BD5, 0x4BD6, 0x4BD7, 0x4BD8, 0x4BD9, 0x4BDA, 0x4BDB, 0x4BDC,
+ 0x4BDD, 0x4BDE, 0x4BDF, 0x4BE0, 0x4BE1, 0x4BE2, 0x4BE3, 0x4BE4,
+ 0x4BE5, 0x4BE6, 0x4BE7, 0x4BE8, 0x4BE9, 0x4BEA, 0x4BEB, 0x4BEC,
+ 0x4BED, 0x4BEE, 0x4BEF, 0x4BF0, 0x4BF1, 0x4BF2, 0x4BF3, 0x4BF4,
+ 0x4BF5, 0x4BF6, 0x4BF7, 0x4BF8, 0x4BF9, 0x4BFA, 0x4BFB, 0x4BFC,
+ 0x4BFD, 0x4BFE, 0x4BFF, 0x4C00, 0x4C01, 0x4C02, 0x4C03, 0x4C04,
+ 0x4C05, 0x4C06, 0x4C07, 0x4C08, 0x4C09, 0x4C0A, 0x4C0B, 0x4C0C,
+ 0x4C0D, 0x4C0E, 0x4C0F, 0x4C10, 0x4C11, 0x4C12, 0x4C13, 0x4C14,
+ 0x4C15, 0x4C16, 0x4C17, 0x4C18, 0x4C19, 0x4C1A, 0x4C1B, 0x4C1C,
+ 0x4C1D, 0x4C1E, 0x4C1F, 0x4C20, 0x4C21, 0x4C22, 0x4C23, 0x4C24,
+ 0x4C25, 0x4C26, 0x4C27, 0x4C28, 0x4C29, 0x4C2A, 0x4C2B, 0x4C2C,
+ 0x4C2D, 0x4C2E, 0x4C2F, 0x4C30, 0x4C31, 0x4C32, 0x4C33, 0x4C34,
+ 0x4C35, 0x4C36, 0x4C37, 0x4C38, 0x4C39, 0x4C3A, 0x4C3B, 0x4C3C,
+ 0x4C3D, 0x4C3E, 0x4C3F, 0x4C40, 0x4C41, 0x4C42, 0x4C43, 0x4C44,
+ 0x4C45, 0x4C46, 0x4C47, 0x4C48, 0x4C49, 0x4C4A, 0x4C4B, 0x4C4C,
+ 0x4C4D, 0x4C4E, 0x4C4F, 0x4C50, 0x4C51, 0x4C52, 0x4C53, 0x4C54,
+ 0x4C55, 0x4C56, 0x4C57, 0x4C58, 0x4C59, 0x4C5A, 0x4C5B, 0x4C5C,
+ 0x4C5D, 0x4C5E, 0x4C5F, 0x4C60, 0x4C61, 0x4C62, 0x4C63, 0x4C64,
+ 0x4C65, 0x4C66, 0x4C67, 0x4C68, 0x4C69, 0x4C6A, 0x4C6B, 0x4C6C,
+ 0x4C6D, 0x4C6E, 0x4C6F, 0x4C70, 0x4C71, 0x4C72, 0x4C73, 0x4C74,
+ 0x4C75, 0x4C76, 0x4C78, 0x4C79, 0x4C7A, 0x4C7B, 0x4C7C, 0x4C7D,
+ 0x4C7E, 0x4C7F, 0x4C80, 0x4C81, 0x4C82, 0x4C83, 0x4C84, 0x4C85,
+ 0x4C86, 0x4C87, 0x4C88, 0x4C89, 0x4C8A, 0x4C8B, 0x4C8C, 0x4C8D,
+ 0x4C8E, 0x4C8F, 0x4C90, 0x4C91, 0x4C92, 0x4C93, 0x4C94, 0x4C95,
+ 0x4C96, 0x4C97, 0x4C98, 0x4C99, 0x4C9A, 0x4C9B, 0x4C9C, 0x4C9D,
+ 0x4C9E, 0x4CA4, 0x4CA5, 0x4CA6, 0x4CA7, 0x4CA8, 0x4CA9, 0x4CAA,
+ 0x4CAB, 0x4CAC, 0x4CAD, 0x4CAE, 0x4CAF, 0x4CB0, 0x4CB1, 0x4CB2,
+ 0x4CB3, 0x4CB4, 0x4CB5, 0x4CB6, 0x4CB7, 0x4CB8, 0x4CB9, 0x4CBA,
+ 0x4CBB, 0x4CBC, 0x4CBD, 0x4CBE, 0x4CBF, 0x4CC0, 0x4CC1, 0x4CC2,
+ 0x4CC3, 0x4CC4, 0x4CC5, 0x4CC6, 0x4CC7, 0x4CC8, 0x4CC9, 0x4CCA,
+ 0x4CCB, 0x4CCC, 0x4CCD, 0x4CCE, 0x4CCF, 0x4CD0, 0x4CD1, 0x4CD2,
+ 0x4CD3, 0x4CD4, 0x4CD5, 0x4CD6, 0x4CD7, 0x4CD8, 0x4CD9, 0x4CDA,
+ 0x4CDB, 0x4CDC, 0x4CDD, 0x4CDE, 0x4CDF, 0x4CE0, 0x4CE1, 0x4CE2,
+ 0x4CE3, 0x4CE4, 0x4CE5, 0x4CE6, 0x4CE7, 0x4CE8, 0x4CE9, 0x4CEA,
+ 0x4CEB, 0x4CEC, 0x4CED, 0x4CEE, 0x4CEF, 0x4CF0, 0x4CF1, 0x4CF2,
+ 0x4CF3, 0x4CF4, 0x4CF5, 0x4CF6, 0x4CF7, 0x4CF8, 0x4CF9, 0x4CFA,
+ 0x4CFB, 0x4CFC, 0x4CFD, 0x4CFE, 0x4CFF, 0x4D00, 0x4D01, 0x4D02,
+ 0x4D03, 0x4D04, 0x4D05, 0x4D06, 0x4D07, 0x4D08, 0x4D09, 0x4D0A,
+ 0x4D0B, 0x4D0C, 0x4D0D, 0x4D0E, 0x4D0F, 0x4D10, 0x4D11, 0x4D12,
+ 0x4D1A, 0x4D1B, 0x4D1C, 0x4D1D, 0x4D1E, 0x4D1F, 0x4D20, 0x4D21,
+ 0x4D22, 0x4D23, 0x4D24, 0x4D25, 0x4D26, 0x4D27, 0x4D28, 0x4D29,
+ 0x4D2A, 0x4D2B, 0x4D2C, 0x4D2D, 0x4D2E, 0x4D2F, 0x4D30, 0x4D31,
+ 0x4D32, 0x4D33, 0x4D34, 0x4D35, 0x4D36, 0x4D37, 0x4D38, 0x4D39,
+ 0x4D3A, 0x4D3B, 0x4D3C, 0x4D3D, 0x4D3E, 0x4D3F, 0x4D40, 0x4D41,
+ 0x4D42, 0x4D43, 0x4D44, 0x4D45, 0x4D46, 0x4D47, 0x4D48, 0x4D49,
+ 0x4D4A, 0x4D4B, 0x4D4C, 0x4D4D, 0x4D4E, 0x4D4F, 0x4D50, 0x4D51,
+ 0x4D52, 0x4D53, 0x4D54, 0x4D55, 0x4D56, 0x4D57, 0x4D58, 0x4D59,
+ 0x4D5A, 0x4D5B, 0x4D5C, 0x4D5D, 0x4D5E, 0x4D5F, 0x4D60, 0x4D61,
+ 0x4D62, 0x4D63, 0x4D64, 0x4D65, 0x4D66, 0x4D67, 0x4D68, 0x4D69,
+ 0x4D6A, 0x4D6B, 0x4D6C, 0x4D6D, 0x4D6E, 0x4D6F, 0x4D70, 0x4D71,
+ 0x4D72, 0x4D73, 0x4D74, 0x4D75, 0x4D76, 0x4D77, 0x4D78, 0x4D79,
+ 0x4D7A, 0x4D7B, 0x4D7C, 0x4D7D, 0x4D7E, 0x4D7F, 0x4D80, 0x4D81,
+ 0x4D82, 0x4D83, 0x4D84, 0x4D85, 0x4D86, 0x4D87, 0x4D88, 0x4D89,
+ 0x4D8A, 0x4D8B, 0x4D8C, 0x4D8D, 0x4D8E, 0x4D8F, 0x4D90, 0x4D91,
+ 0x4D92, 0x4D93, 0x4D94, 0x4D95, 0x4D96, 0x4D97, 0x4D98, 0x4D99,
+ 0x4D9A, 0x4D9B, 0x4D9C, 0x4D9D, 0x4D9E, 0x4D9F, 0x4DA0, 0x4DA1,
+ 0x4DA2, 0x4DA3, 0x4DA4, 0x4DA5, 0x4DA6, 0x4DA7, 0x4DA8, 0x4DA9,
+ 0x4DAA, 0x4DAB, 0x4DAC, 0x4DAD, 0x4DAF, 0x4DB0, 0x4DB1, 0x4DB2,
+ 0x4DB3, 0x4DB4, 0x4DB5, 0x20AC, 0x00A5, 0x20AC, 0x0024, 0x303F,
+ 0xA000, 0xA001, 0xA002, 0xA003, 0xA004, 0xA005, 0xA006, 0xA007,
+ 0xA008, 0xA009, 0xA00A, 0xA00B, 0xA00C, 0xA00D, 0xA00E, 0xA00F,
+ 0xA010, 0xA011, 0xA012, 0xA013, 0xA014, 0xA015, 0xA016, 0xA017,
+ 0xA018, 0xA019, 0xA01A, 0xA01B, 0xA01C, 0xA01D, 0xA01E, 0xA01F,
+ 0xA020, 0xA021, 0xA022, 0xA023, 0xA024, 0xA025, 0xA026, 0xA027,
+ 0xA028, 0xA029, 0xA02A, 0xA02B, 0xA02C, 0xA02D, 0xA02E, 0xA02F,
+ 0xA030, 0xA031, 0xA032, 0xA033, 0xA034, 0xA035, 0xA036, 0xA037,
+ 0xA038, 0xA039, 0xA03A, 0xA03B, 0xA03C, 0xA03D, 0xA03E, 0xA03F,
+ 0xA040, 0xA041, 0xA042, 0xA043, 0xA044, 0xA045, 0xA046, 0xA047,
+ 0xA048, 0xA049, 0xA04A, 0xA04B, 0xA04C, 0xA04D, 0xA04E, 0xA04F,
+ 0xA050, 0xA051, 0xA052, 0xA053, 0xA054, 0xA055, 0xA056, 0xA057,
+ 0xA058, 0xA059, 0xA05A, 0xA05B, 0xA05C, 0xA05D, 0xA05E, 0xA05F,
+ 0xA060, 0xA061, 0xA062, 0xA063, 0xA064, 0xA065, 0xA066, 0xA067,
+ 0xA068, 0xA069, 0xA06A, 0xA06B, 0xA06C, 0xA06D, 0xA06E, 0xA06F,
+ 0xA070, 0xA071, 0xA072, 0xA073, 0xA074, 0xA075, 0xA076, 0xA077,
+ 0xA078, 0xA079, 0xA07A, 0xA07B, 0xA07C, 0xA07D, 0xA07E, 0xA07F,
+ 0xA080, 0xA081, 0xA082, 0xA083, 0xA084, 0xA085, 0xA086, 0xA087,
+ 0xA088, 0xA089, 0xA08A, 0xA08B, 0xA08C, 0xA08D, 0xA08E, 0xA08F,
+ 0xA090, 0xA091, 0xA092, 0xA093, 0xA094, 0xA095, 0xA096, 0xA097,
+ 0xA098, 0xA099, 0xA09A, 0xA09B, 0xA09C, 0xA09D, 0xA09E, 0xA09F,
+ 0xA0A0, 0xA0A1, 0xA0A2, 0xA0A3, 0xA0A4, 0xA0A5, 0xA0A6, 0xA0A7,
+ 0xA0A8, 0xA0A9, 0xA0AA, 0xA0AB, 0xA0AC, 0xA0AD, 0xA0AE, 0xA0AF,
+ 0xA0B0, 0xA0B1, 0xA0B2, 0xA0B3, 0xA0B4, 0xA0B5, 0xA0B6, 0xA0B7,
+ 0xA0B8, 0xA0B9, 0xA0BA, 0xA0BB, 0xA0BC, 0xA0BD, 0xA0BE, 0xA0BF,
+ 0xA0C0, 0xA0C1, 0xA0C2, 0xA0C3, 0xA0C4, 0xA0C5, 0xA0C6, 0xA0C7,
+ 0xA0C8, 0xA0C9, 0xA0CA, 0xA0CB, 0xA0CC, 0xA0CD, 0xA0CE, 0xA0CF,
+ 0xA0D0, 0xA0D1, 0xA0D2, 0xA0D3, 0xA0D4, 0xA0D5, 0xA0D6, 0xA0D7,
+ 0xA0D8, 0xA0D9, 0xA0DA, 0xA0DB, 0xA0DC, 0xA0DD, 0xA0DE, 0xA0DF,
+ 0xA0E0, 0xA0E1, 0xA0E2, 0xA0E3, 0xA0E4, 0xA0E5, 0xA0E6, 0xA0E7,
+ 0xA0E8, 0xA0E9, 0xA0EA, 0xA0EB, 0xA0EC, 0xA0ED, 0xA0EE, 0xA0EF,
+ 0xA0F0, 0xA0F1, 0xA0F2, 0xA0F3, 0xA0F4, 0xA0F5, 0xA0F6, 0xA0F7,
+ 0xA0F8, 0xA0F9, 0xA0FA, 0xA0FB, 0xA0FC, 0xA0FD, 0xA0FE, 0xA0FF,
+ 0xA100, 0xA101, 0xA102, 0xA103, 0xA104, 0xA105, 0xA106, 0xA107,
+ 0xA108, 0xA109, 0xA10A, 0xA10B, 0xA10C, 0xA10D, 0xA10E, 0xA10F,
+ 0xA110, 0xA111, 0xA112, 0xA113, 0xA114, 0xA115, 0xA116, 0xA117,
+ 0xA118, 0xA119, 0xA11A, 0xA11B, 0xA11C, 0xA11D, 0xA11E, 0xA11F,
+ 0xA120, 0xA121, 0xA122, 0xA123, 0xA124, 0xA125, 0xA126, 0xA127,
+ 0xA128, 0xA129, 0xA12A, 0xA12B, 0xA12C, 0xA12D, 0xA12E, 0xA12F,
+ 0xA130, 0xA131, 0xA132, 0xA133, 0xA134, 0xA135, 0xA136, 0xA137,
+ 0xA138, 0xA139, 0xA13A, 0xA13B, 0xA13C, 0xA13D, 0xA13E, 0xA13F,
+ 0xA140, 0xA141, 0xA142, 0xA143, 0xA144, 0xA145, 0xA146, 0xA147,
+ 0xA148, 0xA149, 0xA14A, 0xA14B, 0xA14C, 0xA14D, 0xA14E, 0xA14F,
+ 0xA150, 0xA151, 0xA152, 0xA153, 0xA154, 0xA155, 0xA156, 0xA157,
+ 0xA158, 0xA159, 0xA15A, 0xA15B, 0xA15C, 0xA15D, 0xA15E, 0xA15F,
+ 0xA160, 0xA161, 0xA162, 0xA163, 0xA164, 0xA165, 0xA166, 0xA167,
+ 0xA168, 0xA169, 0xA16A, 0xA16B, 0xA16C, 0xA16D, 0xA16E, 0xA16F,
+ 0xA170, 0xA171, 0xA172, 0xA173, 0xA174, 0xA175, 0xA176, 0xA177,
+ 0xA178, 0xA179, 0xA17A, 0xA17B, 0xA17C, 0xA17D, 0xA17E, 0xA17F,
+ 0xA180, 0xA181, 0xA182, 0xA183, 0xA184, 0xA185, 0xA186, 0xA187,
+ 0xA188, 0xA189, 0xA18A, 0xA18B, 0xA18C, 0xA18D, 0xA18E, 0xA18F,
+ 0xA190, 0xA191, 0xA192, 0xA193, 0xA194, 0xA195, 0xA196, 0xA197,
+ 0xA198, 0xA199, 0xA19A, 0xA19B, 0xA19C, 0xA19D, 0xA19E, 0xA19F,
+ 0xA1A0, 0xA1A1, 0xA1A2, 0xA1A3, 0xA1A4, 0xA1A5, 0xA1A6, 0xA1A7,
+ 0xA1A8, 0xA1A9, 0xA1AA, 0xA1AB, 0xA1AC, 0xA1AD, 0xA1AE, 0xA1AF,
+ 0xA1B0, 0xA1B1, 0xA1B2, 0xA1B3, 0xA1B4, 0xA1B5, 0xA1B6, 0xA1B7,
+ 0xA1B8, 0xA1B9, 0xA1BA, 0xA1BB, 0xA1BC, 0xA1BD, 0xA1BE, 0xA1BF,
+ 0xA1C0, 0xA1C1, 0xA1C2, 0xA1C3, 0xA1C4, 0xA1C5, 0xA1C6, 0xA1C7,
+ 0xA1C8, 0xA1C9, 0xA1CA, 0xA1CB, 0xA1CC, 0xA1CD, 0xA1CE, 0xA1CF,
+ 0xA1D0, 0xA1D1, 0xA1D2, 0xA1D3, 0xA1D4, 0xA1D5, 0xA1D6, 0xA1D7,
+ 0xA1D8, 0xA1D9, 0xA1DA, 0xA1DB, 0xA1DC, 0xA1DD, 0xA1DE, 0xA1DF,
+ 0xA1E0, 0xA1E1, 0xA1E2, 0xA1E3, 0xA1E4, 0xA1E5, 0xA1E6, 0xA1E7,
+ 0xA1E8, 0xA1E9, 0xA1EA, 0xA1EB, 0xA1EC, 0xA1ED, 0xA1EE, 0xA1EF,
+ 0xA1F0, 0xA1F1, 0xA1F2, 0xA1F3, 0xA1F4, 0xA1F5, 0xA1F6, 0xA1F7,
+ 0xA1F8, 0xA1F9, 0xA1FA, 0xA1FB, 0xA1FC, 0xA1FD, 0xA1FE, 0xA1FF,
+ 0xA200, 0xA201, 0xA202, 0xA203, 0xA204, 0xA205, 0xA206, 0xA207,
+ 0xA208, 0xA209, 0xA20A, 0xA20B, 0xA20C, 0xA20D, 0xA20E, 0xA20F,
+ 0xA210, 0xA211, 0xA212, 0xA213, 0xA214, 0xA215, 0xA216, 0xA217,
+ 0xA218, 0xA219, 0xA21A, 0xA21B, 0xA21C, 0xA21D, 0xA21E, 0xA21F,
+ 0xA220, 0xA221, 0xA222, 0xA223, 0xA224, 0xA225, 0xA226, 0xA227,
+ 0xA228, 0xA229, 0xA22A, 0xA22B, 0xA22C, 0xA22D, 0xA22E, 0xA22F,
+ 0xA230, 0xA231, 0xA232, 0xA233, 0xA234, 0xA235, 0xA236, 0xA237,
+ 0xA238, 0xA239, 0xA23A, 0xA23B, 0xA23C, 0xA23D, 0xA23E, 0xA23F,
+ 0xA240, 0xA241, 0xA242, 0xA243, 0xA244, 0xA245, 0xA246, 0xA247,
+ 0xA248, 0xA249, 0xA24A, 0xA24B, 0xA24C, 0xA24D, 0xA24E, 0xA24F,
+ 0xA250, 0xA251, 0xA252, 0xA253, 0xA254, 0xA255, 0xA256, 0xA257,
+ 0xA258, 0xA259, 0xA25A, 0xA25B, 0xA25C, 0xA25D, 0xA25E, 0xA25F,
+ 0xA260, 0xA261, 0xA262, 0xA263, 0xA264, 0xA265, 0xA266, 0xA267,
+ 0xA268, 0xA269, 0xA26A, 0xA26B, 0xA26C, 0xA26D, 0xA26E, 0xA26F,
+ 0xA270, 0xA271, 0xA272, 0xA273, 0xA274, 0xA275, 0xA276, 0xA277,
+ 0xA278, 0xA279, 0xA27A, 0xA27B, 0xA27C, 0xA27D, 0xA27E, 0xA27F,
+ 0xA280, 0xA281, 0xA282, 0xA283, 0xA284, 0xA285, 0xA286, 0xA287,
+ 0xA288, 0xA289, 0xA28A, 0xA28B, 0xA28C, 0xA28D, 0xA28E, 0xA28F,
+ 0xA290, 0xA291, 0xA292, 0xA293, 0xA294, 0xA295, 0xA296, 0xA297,
+ 0xA298, 0xA299, 0xA29A, 0xA29B, 0xA29C, 0xA29D, 0xA29E, 0xA29F,
+ 0xA2A0, 0xA2A1, 0xA2A2, 0xA2A3, 0xA2A4, 0xA2A5, 0xA2A6, 0xA2A7,
+ 0xA2A8, 0xA2A9, 0xA2AA, 0xA2AB, 0xA2AC, 0xA2AD, 0xA2AE, 0xA2AF,
+ 0xA2B0, 0xA2B1, 0xA2B2, 0xA2B3, 0xA2B4, 0xA2B5, 0xA2B6, 0xA2B7,
+ 0xA2B8, 0xA2B9, 0xA2BA, 0xA2BB, 0xA2BC, 0xA2BD, 0xA2BE, 0xA2BF,
+ 0xA2C0, 0xA2C1, 0xA2C2, 0xA2C3, 0xA2C4, 0xA2C5, 0xA2C6, 0xA2C7,
+ 0xA2C8, 0xA2C9, 0xA2CA, 0xA2CB, 0xA2CC, 0xA2CD, 0xA2CE, 0xA2CF,
+ 0xA2D0, 0xA2D1, 0xA2D2, 0xA2D3, 0xA2D4, 0xA2D5, 0xA2D6, 0xA2D7,
+ 0xA2D8, 0xA2D9, 0xA2DA, 0xA2DB, 0xA2DC, 0xA2DD, 0xA2DE, 0xA2DF,
+ 0xA2E0, 0xA2E1, 0xA2E2, 0xA2E3, 0xA2E4, 0xA2E5, 0xA2E6, 0xA2E7,
+ 0xA2E8, 0xA2E9, 0xA2EA, 0xA2EB, 0xA2EC, 0xA2ED, 0xA2EE, 0xA2EF,
+ 0xA2F0, 0xA2F1, 0xA2F2, 0xA2F3, 0xA2F4, 0xA2F5, 0xA2F6, 0xA2F7,
+ 0xA2F8, 0xA2F9, 0xA2FA, 0xA2FB, 0xA2FC, 0xA2FD, 0xA2FE, 0xA2FF,
+ 0xA300, 0xA301, 0xA302, 0xA303, 0xA304, 0xA305, 0xA306, 0xA307,
+ 0xA308, 0xA309, 0xA30A, 0xA30B, 0xA30C, 0xA30D, 0xA30E, 0xA30F,
+ 0xA310, 0xA311, 0xA312, 0xA313, 0xA314, 0xA315, 0xA316, 0xA317,
+ 0xA318, 0xA319, 0xA31A, 0xA31B, 0xA31C, 0xA31D, 0xA31E, 0xA31F,
+ 0xA320, 0xA321, 0xA322, 0xA323, 0xA324, 0xA325, 0xA326, 0xA327,
+ 0xA328, 0xA329, 0xA32A, 0xA32B, 0xA32C, 0xA32D, 0xA32E, 0xA32F,
+ 0xA330, 0xA331, 0xA332, 0xA333, 0xA334, 0xA335, 0xA336, 0xA337,
+ 0xA338, 0xA339, 0xA33A, 0xA33B, 0xA33C, 0xA33D, 0xA33E, 0xA33F,
+ 0xA340, 0xA341, 0xA342, 0xA343, 0xA344, 0xA345, 0xA346, 0xA347,
+ 0xA348, 0xA349, 0xA34A, 0xA34B, 0xA34C, 0xA34D, 0xA34E, 0xA34F,
+ 0xA350, 0xA351, 0xA352, 0xA353, 0xA354, 0xA355, 0xA356, 0xA357,
+ 0xA358, 0xA359, 0xA35A, 0xA35B, 0xA35C, 0xA35D, 0xA35E, 0xA35F,
+ 0xA360, 0xA361, 0xA362, 0xA363, 0xA364, 0xA365, 0xA366, 0xA367,
+ 0xA368, 0xA369, 0xA36A, 0xA36B, 0xA36C, 0xA36D, 0xA36E, 0xA36F,
+ 0xA370, 0xA371, 0xA372, 0xA373, 0xA374, 0xA375, 0xA376, 0xA377,
+ 0xA378, 0xA379, 0xA37A, 0xA37B, 0xA37C, 0xA37D, 0xA37E, 0xA37F,
+ 0xA380, 0xA381, 0xA382, 0xA383, 0xA384, 0xA385, 0xA386, 0xA387,
+ 0xA388, 0xA389, 0xA38A, 0xA38B, 0xA38C, 0xA38D, 0xA38E, 0xA38F,
+ 0xA390, 0xA391, 0xA392, 0xA393, 0xA394, 0xA395, 0xA396, 0xA397,
+ 0xA398, 0xA399, 0xA39A, 0xA39B, 0xA39C, 0xA39D, 0xA39E, 0xA39F,
+ 0xA3A0, 0xA3A1, 0xA3A2, 0xA3A3, 0xA3A4, 0xA3A5, 0xA3A6, 0xA3A7,
+ 0xA3A8, 0xA3A9, 0xA3AA, 0xA3AB, 0xA3AC, 0xA3AD, 0xA3AE, 0xA3AF,
+ 0xA3B0, 0xA3B1, 0xA3B2, 0xA3B3, 0xA3B4, 0xA3B5, 0xA3B6, 0xA3B7,
+ 0xA3B8, 0xA3B9, 0xA3BA, 0xA3BB, 0xA3BC, 0xA3BD, 0xA3BE, 0xA3BF,
+ 0xA3C0, 0xA3C1, 0xA3C2, 0xA3C3, 0xA3C4, 0xA3C5, 0xA3C6, 0xA3C7,
+ 0xA3C8, 0xA3C9, 0xA3CA, 0xA3CB, 0xA3CC, 0xA3CD, 0xA3CE, 0xA3CF,
+ 0xA3D0, 0xA3D1, 0xA3D2, 0xA3D3, 0xA3D4, 0xA3D5, 0xA3D6, 0xA3D7,
+ 0xA3D8, 0xA3D9, 0xA3DA, 0xA3DB, 0xA3DC, 0xA3DD, 0xA3DE, 0xA3DF,
+ 0xA3E0, 0xA3E1, 0xA3E2, 0xA3E3, 0xA3E4, 0xA3E5, 0xA3E6, 0xA3E7,
+ 0xA3E8, 0xA3E9, 0xA3EA, 0xA3EB, 0xA3EC, 0xA3ED, 0xA3EE, 0xA3EF,
+ 0xA3F0, 0xA3F1, 0xA3F2, 0xA3F3, 0xA3F4, 0xA3F5, 0xA3F6, 0xA3F7,
+ 0xA3F8, 0xA3F9, 0xA3FA, 0xA3FB, 0xA3FC, 0xA3FD, 0xA3FE, 0xA3FF,
+ 0xA400, 0xA401, 0xA402, 0xA403, 0xA404, 0xA405, 0xA406, 0xA407,
+ 0xA408, 0xA409, 0xA40A, 0xA40B, 0xA40C, 0xA40D, 0xA40E, 0xA40F,
+ 0xA410, 0xA411, 0xA412, 0xA413, 0xA414, 0xA415, 0xA416, 0xA417,
+ 0xA418, 0xA419, 0xA41A, 0xA41B, 0xA41C, 0xA41D, 0xA41E, 0xA41F,
+ 0xA420, 0xA421, 0xA422, 0xA423, 0xA424, 0xA425, 0xA426, 0xA427,
+ 0xA428, 0xA429, 0xA42A, 0xA42B, 0xA42C, 0xA42D, 0xA42E, 0xA42F,
+ 0xA430, 0xA431, 0xA432, 0xA433, 0xA434, 0xA435, 0xA436, 0xA437,
+ 0xA438, 0xA439, 0xA43A, 0xA43B, 0xA43C, 0xA43D, 0xA43E, 0xA43F,
+ 0xA440, 0xA441, 0xA442, 0xA443, 0xA444, 0xA445, 0xA446, 0xA447,
+ 0xA448, 0xA449, 0xA44A, 0xA44B, 0xA44C, 0xA44D, 0xA44E, 0xA44F,
+ 0xA450, 0xA451, 0xA452, 0xA453, 0xA454, 0xA455, 0xA456, 0xA457,
+ 0xA458, 0xA459, 0xA45A, 0xA45B, 0xA45C, 0xA45D, 0xA45E, 0xA45F,
+ 0xA460, 0xA461, 0xA462, 0xA463, 0xA464, 0xA465, 0xA466, 0xA467,
+ 0xA468, 0xA469, 0xA46A, 0xA46B, 0xA46C, 0xA46D, 0xA46E, 0xA46F,
+ 0xA470, 0xA471, 0xA472, 0xA473, 0xA474, 0xA475, 0xA476, 0xA477,
+ 0xA478, 0xA479, 0xA47A, 0xA47B, 0xA47C, 0xA47D, 0xA47E, 0xA47F,
+ 0xA480, 0xA481, 0xA482, 0xA483, 0xA484, 0xA485, 0xA486, 0xA487,
+ 0xA488, 0xA489, 0xA48A, 0xA48B, 0xA48C, 0xA490, 0xA491, 0xA492,
+ 0xA493, 0xA494, 0xA495, 0xA496, 0xA497, 0xA498, 0xA499, 0xA49A,
+ 0xA49B, 0xA49C, 0xA49D, 0xA49E, 0xA49F, 0xA4A0, 0xA4A1, 0xA4A2,
+ 0xA4A3, 0xA4A4, 0xA4A5, 0xA4A6, 0xA4A7, 0xA4A8, 0xA4A9, 0xA4AA,
+ 0xA4AB, 0xA4AC, 0xA4AD, 0xA4AE, 0xA4AF, 0xA4B0, 0xA4B1, 0xA4B2,
+ 0xA4B3, 0xA4B4, 0xA4B5, 0xA4B6, 0xA4B7, 0xA4B8, 0xA4B9, 0xA4BA,
+ 0xA4BB, 0xA4BC, 0xA4BD, 0xA4BE, 0xA4BF, 0xA4C0, 0xA4C1, 0xA4C2,
+ 0xA4C3, 0xA4C4, 0xA4C5, 0xA4C6,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
new file mode 100644
index 0000000000..f216f8a769
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB_EUC_H_0[90 * 3] = {
+ 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0xA1A1, 0xA1FE, 0x0060,
+ 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA,
+ 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7,
+ 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A,
+ 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
+ 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E, 0xABA1, 0xABC0, 0x038C,
+ 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A, 0xB2A1, 0xB2FE, 0x0468,
+ 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524, 0xB5A1, 0xB5FE, 0x0582,
+ 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E, 0xB8A1, 0xB8FE, 0x069C,
+ 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758, 0xBBA1, 0xBBFE, 0x07B6,
+ 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872, 0xBEA1, 0xBEFE, 0x08D0,
+ 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C, 0xC1A1, 0xC1FE, 0x09EA,
+ 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6, 0xC4A1, 0xC4FE, 0x0B04,
+ 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0, 0xC7A1, 0xC7FE, 0x0C1E,
+ 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA, 0xCAA1, 0xCAFE, 0x0D38,
+ 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4, 0xCDA1, 0xCDFE, 0x0E52,
+ 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E, 0xD0A1, 0xD0FE, 0x0F6C,
+ 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028, 0xD3A1, 0xD3FE, 0x1086,
+ 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142, 0xD6A1, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257, 0xD9A1, 0xD9FE, 0x12B5,
+ 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371, 0xDCA1, 0xDCFE, 0x13CF,
+ 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B, 0xDFA1, 0xDFFE, 0x14E9,
+ 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5, 0xE2A1, 0xE2FE, 0x1603,
+ 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF, 0xE5A1, 0xE5FE, 0x171D,
+ 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9, 0xE8A1, 0xE8FE, 0x1837,
+ 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3, 0xEBA1, 0xEBFE, 0x1951,
+ 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D, 0xEEA1, 0xEEFE, 0x1A6B,
+ 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27, 0xF1A1, 0xF1FE, 0x1B85,
+ 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41, 0xF4A1, 0xF4FE, 0x1C9F,
+ 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B, 0xF7A1, 0xF7FE, 0x1DB9,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
new file mode 100644
index 0000000000..d71cd351fb
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GB_EUC_V_0[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
new file mode 100644
index 0000000000..c7c486b9a4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp
@@ -0,0 +1,1365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK_EUC_H_2[4071 * 3] = {
+ 0x0020, 0x0020, 0x1E24, 0x0021, 0x007E, 0x032E, 0x8140, 0x8178, 0x2758,
+ 0x8179, 0x8179, 0x2059, 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796,
+ 0x8186, 0x8186, 0x21F1, 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2,
+ 0x81EE, 0x81F5, 0x2802, 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A,
+ 0x8240, 0x8252, 0x2812, 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825,
+ 0x8262, 0x8262, 0x21B5, 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC,
+ 0x8275, 0x8279, 0x2844, 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849,
+ 0x827D, 0x827D, 0x1E62, 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20,
+ 0x8281, 0x8282, 0x284C, 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E,
+ 0x8290, 0x8290, 0x205C, 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194,
+ 0x82A6, 0x82C7, 0x286E, 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281,
+ 0x82CA, 0x82E0, 0x2890, 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7,
+ 0x82E3, 0x82E3, 0x210A, 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8,
+ 0x82ED, 0x82ED, 0x267F, 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E,
+ 0x82F3, 0x82F6, 0x28B4, 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB,
+ 0x82F9, 0x82F9, 0x226C, 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117,
+ 0x82FC, 0x82FE, 0x28B9, 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8,
+ 0x8342, 0x8344, 0x28BD, 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0,
+ 0x8348, 0x8348, 0x1FB9, 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8,
+ 0x834D, 0x8352, 0x28C5, 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB,
+ 0x8357, 0x8357, 0x20C2, 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195,
+ 0x835F, 0x8364, 0x28D4, 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3,
+ 0x8367, 0x8371, 0x28DA, 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5,
+ 0x8378, 0x8378, 0x2210, 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF,
+ 0x837B, 0x837B, 0x28EB, 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC,
+ 0x837E, 0x837E, 0x1FE4, 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED,
+ 0x8386, 0x8386, 0x22D6, 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0,
+ 0x838A, 0x838A, 0x22CE, 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681,
+ 0x838E, 0x8393, 0x28F6, 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC,
+ 0x839E, 0x839E, 0x2231, 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93,
+ 0x83A7, 0x83AA, 0x290C, 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910,
+ 0x83AE, 0x83AE, 0x22D7, 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1,
+ 0x83B1, 0x83B9, 0x2912, 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B,
+ 0x83C9, 0x83C9, 0x2025, 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF,
+ 0x83F7, 0x83FE, 0x2955, 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9,
+ 0x8451, 0x8470, 0x296D, 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D,
+ 0x8474, 0x8474, 0x2263, 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683,
+ 0x8478, 0x847E, 0x2991, 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17,
+ 0x8483, 0x848D, 0x299A, 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5,
+ 0x8492, 0x8492, 0x22CA, 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8,
+ 0x849D, 0x849D, 0x1F4F, 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF,
+ 0x84A2, 0x84A2, 0x2036, 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4,
+ 0x84A5, 0x84A5, 0x22C9, 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5,
+ 0x84A9, 0x84A9, 0x1F75, 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE,
+ 0x84C6, 0x84D2, 0x29D2, 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF,
+ 0x84D5, 0x84D5, 0x21A9, 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6,
+ 0x84D8, 0x84D8, 0x29E1, 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003,
+ 0x84DB, 0x84DC, 0x29E2, 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4,
+ 0x84EA, 0x84EA, 0x2323, 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011,
+ 0x84EF, 0x84F0, 0x29F3, 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5,
+ 0x8540, 0x8550, 0x2A02, 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E,
+ 0x8553, 0x8553, 0x2A13, 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14,
+ 0x855E, 0x855E, 0x20EF, 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0,
+ 0x8567, 0x857E, 0x2A24, 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1,
+ 0x8588, 0x858A, 0x2A43, 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46,
+ 0x8592, 0x8592, 0x21F9, 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010,
+ 0x8597, 0x8597, 0x2A4F, 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50,
+ 0x85A2, 0x85A2, 0x1E5A, 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2,
+ 0x85B3, 0x85FE, 0x2A68, 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D,
+ 0x864B, 0x8653, 0x2ABE, 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7,
+ 0x8668, 0x8668, 0x236C, 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0,
+ 0x8696, 0x8696, 0x219C, 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9,
+ 0x869A, 0x86A0, 0x2B08, 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F,
+ 0x86CA, 0x86CA, 0x210B, 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE,
+ 0x86CD, 0x86CD, 0x2B38, 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39,
+ 0x86D1, 0x86D1, 0x222C, 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8,
+ 0x86DD, 0x86DD, 0x22C0, 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F,
+ 0x86E2, 0x86E7, 0x2B48, 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E,
+ 0x86EE, 0x86EE, 0x2379, 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372,
+ 0x86F5, 0x86FE, 0x2B58, 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62,
+ 0x8744, 0x8744, 0x237C, 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0,
+ 0x874A, 0x874A, 0x2B69, 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74,
+ 0x874D, 0x874E, 0x2B6A, 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C,
+ 0x8757, 0x8757, 0x1F4C, 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378,
+ 0x875B, 0x875B, 0x21CF, 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75,
+ 0x875E, 0x875E, 0x2371, 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369,
+ 0x8761, 0x8765, 0x2B77, 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C,
+ 0x877A, 0x877A, 0x236F, 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370,
+ 0x877E, 0x877E, 0x2B91, 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376,
+ 0x8782, 0x8782, 0x2373, 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F,
+ 0x8787, 0x8787, 0x2B96, 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97,
+ 0x878A, 0x878A, 0x20B5, 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB,
+ 0x878E, 0x878E, 0x2672, 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E,
+ 0x8794, 0x8797, 0x2B9E, 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2,
+ 0x879D, 0x879D, 0x2375, 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382,
+ 0x87A4, 0x87A6, 0x2BAB, 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE,
+ 0x87B3, 0x87B3, 0x236B, 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039,
+ 0x87B6, 0x87BA, 0x2BBA, 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF,
+ 0x87BF, 0x87BF, 0x237D, 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2,
+ 0x87C2, 0x87C2, 0x2381, 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B,
+ 0x87CB, 0x87CB, 0x237E, 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA,
+ 0x87CF, 0x87CF, 0x22DB, 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A,
+ 0x87D3, 0x87D3, 0x2689, 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697,
+ 0x87D6, 0x87D9, 0x2BCF, 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3,
+ 0x87F7, 0x87F7, 0x2383, 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF,
+ 0x87FA, 0x87FA, 0x218F, 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246,
+ 0x8841, 0x8841, 0x2248, 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E,
+ 0x8845, 0x8845, 0x2BF6, 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7,
+ 0x8880, 0x88B9, 0x2C2F, 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69,
+ 0x88CC, 0x88CC, 0x228B, 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85,
+ 0x88D5, 0x88D6, 0x2C81, 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83,
+ 0x88DF, 0x88DF, 0x232C, 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E,
+ 0x88E6, 0x88F1, 0x2C8F, 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38,
+ 0x88F4, 0x88F5, 0x2C9B, 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D,
+ 0x8940, 0x894A, 0x2CA5, 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339,
+ 0x894D, 0x894D, 0x2CB0, 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1,
+ 0x8950, 0x8950, 0x232D, 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F,
+ 0x8955, 0x895C, 0x2CB5, 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD,
+ 0x895F, 0x895F, 0x232F, 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D,
+ 0x896E, 0x8970, 0x2CCB, 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE,
+ 0x897C, 0x897C, 0x1EC2, 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA,
+ 0x898B, 0x898B, 0x22B2, 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF,
+ 0x899A, 0x899D, 0x2CF2, 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6,
+ 0x89A6, 0x89A6, 0x20D9, 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD,
+ 0x89A9, 0x89AE, 0x2CFE, 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04,
+ 0x89BA, 0x89BA, 0x21ED, 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007,
+ 0x89BF, 0x89BF, 0x2326, 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11,
+ 0x89C4, 0x89C4, 0x1F52, 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328,
+ 0x89C7, 0x89C7, 0x2D14, 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15,
+ 0x89CE, 0x89CE, 0x1E2B, 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE,
+ 0x89D2, 0x89D7, 0x2D1C, 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22,
+ 0x89DB, 0x89DB, 0x2138, 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081,
+ 0x89F5, 0x89FE, 0x2D3C, 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C,
+ 0x8A42, 0x8A58, 0x2D47, 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE,
+ 0x8A5B, 0x8A5B, 0x2D5E, 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F,
+ 0x8A5E, 0x8A5E, 0x1EFA, 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD,
+ 0x8A7A, 0x8A7E, 0x2D7A, 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F,
+ 0x8AE5, 0x8AFE, 0x2DE3, 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E,
+ 0x8B45, 0x8B48, 0x2E01, 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05,
+ 0x8B7A, 0x8B7A, 0x23FC, 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39,
+ 0x8B8C, 0x8B8C, 0x2069, 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7,
+ 0x8B9F, 0x8BB2, 0x2E56, 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A,
+ 0x8BB9, 0x8BB9, 0x23FD, 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8,
+ 0x8BBF, 0x8BC5, 0x2E73, 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A,
+ 0x8BC8, 0x8BC8, 0x23FE, 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B,
+ 0x8BD4, 0x8BD4, 0x2401, 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF,
+ 0x8BDD, 0x8BE4, 0x2E8C, 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94,
+ 0x8BEB, 0x8BEB, 0x2221, 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122,
+ 0x8BF1, 0x8BFE, 0x2E9D, 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB,
+ 0x8C45, 0x8C4E, 0x2EAF, 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9,
+ 0x8C57, 0x8C57, 0x21E5, 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057,
+ 0x8C5D, 0x8C7E, 0x2EC4, 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5,
+ 0x8C8C, 0x8C8C, 0x2EF1, 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3,
+ 0x8C8F, 0x8C8F, 0x2121, 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4,
+ 0x8C92, 0x8C92, 0x1FE5, 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A,
+ 0x8C9A, 0x8C9A, 0x1E37, 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E,
+ 0x8CA3, 0x8CA3, 0x22A6, 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00,
+ 0x8CA6, 0x8CA6, 0x1EDA, 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01,
+ 0x8CC0, 0x8CC0, 0x235C, 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050,
+ 0x8CD3, 0x8CD3, 0x1E67, 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4,
+ 0x8CD6, 0x8CD8, 0x2F2B, 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E,
+ 0x8CF9, 0x8CF9, 0x1F16, 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52,
+ 0x8D73, 0x8D73, 0x2389, 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7,
+ 0x8D76, 0x8D7A, 0x2F86, 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B,
+ 0x8D80, 0x8D87, 0x2F8E, 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96,
+ 0x8D8F, 0x8D8F, 0x1F1A, 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B,
+ 0x8D9F, 0x8DB8, 0x2FAA, 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4,
+ 0x8DE2, 0x8DE2, 0x2391, 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271,
+ 0x8DE5, 0x8DE6, 0x2FED, 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF,
+ 0x8DF7, 0x8DF7, 0x238E, 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D,
+ 0x8E40, 0x8E45, 0x3004, 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A,
+ 0x8E56, 0x8E56, 0x2390, 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033,
+ 0x8E59, 0x8E59, 0x301A, 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B,
+ 0x8E68, 0x8E68, 0x1FE9, 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055,
+ 0x8E6F, 0x8E6F, 0x302D, 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E,
+ 0x8E80, 0x8E80, 0x2324, 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143,
+ 0x8E9C, 0x8E9E, 0x3056, 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059,
+ 0x8EA4, 0x8EA4, 0x2277, 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7,
+ 0x8EA8, 0x8EAB, 0x305F, 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063,
+ 0x8EAE, 0x8EAE, 0x2384, 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387,
+ 0x8EBE, 0x8EBE, 0x2386, 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290,
+ 0x8EC4, 0x8EC4, 0x3076, 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077,
+ 0x8ECD, 0x8ECD, 0x1E32, 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E,
+ 0x8ED6, 0x8ED6, 0x1F13, 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085,
+ 0x8EEC, 0x8EEC, 0x1FE0, 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB,
+ 0x8F52, 0x8F52, 0x2087, 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE,
+ 0x8F55, 0x8F55, 0x1EF6, 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD,
+ 0x8F5D, 0x8F5D, 0x2045, 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178,
+ 0x8F65, 0x8F7E, 0x30C9, 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5,
+ 0x8F87, 0x8F87, 0x30E9, 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA,
+ 0x8F95, 0x8F95, 0x266E, 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0,
+ 0x8F98, 0x8F9A, 0x30F7, 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA,
+ 0x8F9D, 0x8F9D, 0x2188, 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C,
+ 0x8FA2, 0x8FBC, 0x30FE, 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119,
+ 0x8FC4, 0x8FC4, 0x1EA1, 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393,
+ 0x8FC7, 0x8FCC, 0x3120, 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126,
+ 0x8FD8, 0x8FD8, 0x1E7C, 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156,
+ 0x9080, 0x909C, 0x3195, 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E,
+ 0x909F, 0x90B9, 0x31B2, 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD,
+ 0x90C0, 0x90C0, 0x2095, 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2,
+ 0x90C5, 0x90C5, 0x23B9, 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28,
+ 0x90DC, 0x90DC, 0x23BD, 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5,
+ 0x90EE, 0x90EF, 0x31FA, 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC,
+ 0x90F7, 0x90F7, 0x23B3, 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209,
+ 0x9142, 0x9142, 0x2162, 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E,
+ 0x914C, 0x914C, 0x3213, 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214,
+ 0x9151, 0x9151, 0x23B7, 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F,
+ 0x9155, 0x9155, 0x24DF, 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2,
+ 0x915A, 0x915A, 0x214E, 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052,
+ 0x915E, 0x9160, 0x321E, 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221,
+ 0x9163, 0x9163, 0x20EB, 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232,
+ 0x916F, 0x9175, 0x322C, 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233,
+ 0x917A, 0x917A, 0x201B, 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE,
+ 0x917D, 0x917E, 0x3236, 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE,
+ 0x9185, 0x918C, 0x323C, 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244,
+ 0x9191, 0x9191, 0x2089, 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1,
+ 0x9194, 0x9196, 0x3248, 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B,
+ 0x919B, 0x919B, 0x2214, 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE,
+ 0x91AA, 0x91AA, 0x2223, 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B,
+ 0x91BA, 0x91BA, 0x268C, 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269,
+ 0x91BF, 0x91BF, 0x24E0, 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8,
+ 0x91C4, 0x91CC, 0x326F, 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278,
+ 0x91D0, 0x91D0, 0x1FFE, 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1,
+ 0x91D3, 0x91D3, 0x327A, 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B,
+ 0x91D6, 0x91D6, 0x1FCE, 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E,
+ 0x91D9, 0x91D9, 0x2021, 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1,
+ 0x91E0, 0x91E1, 0x3282, 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284,
+ 0x91EA, 0x91EA, 0x24A4, 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273,
+ 0x91F1, 0x91F1, 0x3290, 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291,
+ 0x9240, 0x927E, 0x329D, 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1,
+ 0x92B7, 0x92CD, 0x3312, 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329,
+ 0x92D0, 0x92D0, 0x235D, 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682,
+ 0x92D5, 0x92DE, 0x332D, 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A,
+ 0x92E1, 0x92FD, 0x3337, 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354,
+ 0x9350, 0x9350, 0x21FF, 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58,
+ 0x935E, 0x936F, 0x3370, 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382,
+ 0x9376, 0x9376, 0x1EB6, 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F,
+ 0x938C, 0x938C, 0x20DB, 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360,
+ 0x939E, 0x93A4, 0x33AB, 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2,
+ 0x93A7, 0x93A7, 0x2040, 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E,
+ 0x93B5, 0x93B7, 0x33BF, 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2,
+ 0x93BB, 0x93BB, 0x235E, 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A,
+ 0x93BE, 0x93C5, 0x33C5, 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD,
+ 0x93CF, 0x93CF, 0x2093, 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F,
+ 0x93D8, 0x93DA, 0x33DC, 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54,
+ 0x93DD, 0x93E0, 0x33DF, 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3,
+ 0x93E4, 0x93E4, 0x20C0, 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5,
+ 0x93E9, 0x93E9, 0x2160, 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D,
+ 0x93EC, 0x93EC, 0x1F8E, 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9,
+ 0x93EF, 0x93EF, 0x2047, 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262,
+ 0x93F2, 0x93F3, 0x33EB, 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2,
+ 0x93F6, 0x93F9, 0x33ED, 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1,
+ 0x93FE, 0x93FE, 0x1FCC, 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72,
+ 0x9445, 0x944C, 0x33F8, 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400,
+ 0x9450, 0x9450, 0x1E52, 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C,
+ 0x9453, 0x9453, 0x228F, 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED,
+ 0x9456, 0x9457, 0x3403, 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405,
+ 0x945B, 0x945B, 0x1E2D, 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366,
+ 0x945E, 0x945E, 0x3407, 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408,
+ 0x9464, 0x9464, 0x2363, 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A,
+ 0x9467, 0x946D, 0x340D, 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414,
+ 0x9472, 0x9472, 0x1FF6, 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364,
+ 0x9475, 0x9475, 0x3418, 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419,
+ 0x9478, 0x9478, 0x2367, 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D,
+ 0x947B, 0x947E, 0x341B, 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056,
+ 0x9482, 0x9482, 0x2163, 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9,
+ 0x9488, 0x9488, 0x1FFC, 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E,
+ 0x94A2, 0x94B2, 0x343B, 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C,
+ 0x94B5, 0x94B5, 0x2142, 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E,
+ 0x94C0, 0x94C0, 0x1E43, 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4,
+ 0x94CD, 0x94D7, 0x3461, 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C,
+ 0x94E0, 0x94E0, 0x1ED7, 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491,
+ 0x9572, 0x9572, 0x212D, 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF,
+ 0x9583, 0x9583, 0x229B, 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256,
+ 0x959F, 0x959F, 0x24A8, 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79,
+ 0x95B4, 0x95B9, 0x34FF, 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505,
+ 0x95CF, 0x95CF, 0x24A7, 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686,
+ 0x95D2, 0x95D2, 0x24A6, 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE,
+ 0x95D5, 0x95E0, 0x351B, 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527,
+ 0x95E7, 0x95E7, 0x1FE7, 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112,
+ 0x95F2, 0x95F7, 0x3535, 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B,
+ 0x95FE, 0x95FE, 0x1F5C, 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4,
+ 0x9657, 0x967B, 0x3556, 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B,
+ 0x9680, 0x96FE, 0x357D, 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A,
+ 0x9768, 0x976B, 0x3623, 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627,
+ 0x976E, 0x976E, 0x246D, 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638,
+ 0x9796, 0x9796, 0x246B, 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E,
+ 0x979D, 0x979D, 0x1ECE, 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272,
+ 0x97A4, 0x97BE, 0x3658, 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673,
+ 0x97EE, 0x97EE, 0x21FE, 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE,
+ 0x97F8, 0x97FE, 0x36A9, 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475,
+ 0x9846, 0x9848, 0x36B5, 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8,
+ 0x984F, 0x984F, 0x1F6F, 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468,
+ 0x9872, 0x9872, 0x36DE, 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF,
+ 0x9880, 0x9880, 0x36EA, 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB,
+ 0x988B, 0x988B, 0x1F27, 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4,
+ 0x98A0, 0x98A0, 0x247C, 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1,
+ 0x98AB, 0x98B5, 0x3710, 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005,
+ 0x98B8, 0x98B9, 0x371B, 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D,
+ 0x98C7, 0x98C7, 0x203E, 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C,
+ 0x98CC, 0x98CF, 0x372C, 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730,
+ 0x98D3, 0x98D3, 0x2204, 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3,
+ 0x98E4, 0x98E4, 0x2140, 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741,
+ 0x98EF, 0x98EF, 0x2474, 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD,
+ 0x98F3, 0x98FE, 0x374C, 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68,
+ 0x9944, 0x9944, 0x375B, 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C,
+ 0x9966, 0x9966, 0x2472, 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5,
+ 0x996F, 0x9974, 0x3783, 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789,
+ 0x997A, 0x997A, 0x1F8B, 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D,
+ 0x9980, 0x9984, 0x3790, 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795,
+ 0x9989, 0x9989, 0x2482, 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1,
+ 0x998F, 0x9990, 0x379C, 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E,
+ 0x9999, 0x9999, 0x1F38, 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485,
+ 0x99AA, 0x99AF, 0x37B4, 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E,
+ 0x99B2, 0x99B2, 0x37BA, 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486,
+ 0x99B5, 0x99B5, 0x2471, 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483,
+ 0x99BE, 0x99BE, 0x2470, 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469,
+ 0x99C1, 0x99C1, 0x37C3, 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4,
+ 0x99C9, 0x99C9, 0x246F, 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481,
+ 0x99CF, 0x99D0, 0x37CE, 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0,
+ 0x99DA, 0x99DA, 0x1FF5, 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4,
+ 0x99E1, 0x99E4, 0x37DD, 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1,
+ 0x99E8, 0x99E8, 0x2479, 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E,
+ 0x99ED, 0x99F3, 0x37E6, 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED,
+ 0x9A40, 0x9A49, 0x37F7, 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801,
+ 0x9A57, 0x9A57, 0x20AD, 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB,
+ 0x9A66, 0x9A66, 0x381A, 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B,
+ 0x9A71, 0x9A71, 0x2159, 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013,
+ 0x9A77, 0x9A77, 0x1F33, 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F,
+ 0x9A88, 0x9A88, 0x1E5C, 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488,
+ 0x9A8D, 0x9A90, 0x383A, 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E,
+ 0x9A97, 0x9A97, 0x248A, 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489,
+ 0x9A9B, 0x9A9B, 0x248B, 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83,
+ 0x9A9F, 0x9AA1, 0x3847, 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB,
+ 0x9AA4, 0x9AA9, 0x384A, 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850,
+ 0x9AD0, 0x9AD0, 0x24C0, 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D,
+ 0x9AD7, 0x9AD9, 0x387A, 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D,
+ 0x9AE2, 0x9AE2, 0x20CA, 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7,
+ 0x9AE5, 0x9AE5, 0x24C2, 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E,
+ 0x9B80, 0x9BD0, 0x38DD, 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E,
+ 0x9BDC, 0x9BDC, 0x23DB, 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A,
+ 0x9C53, 0x9C53, 0x205E, 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244,
+ 0x9C5A, 0x9C5A, 0x23E2, 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4,
+ 0x9C5D, 0x9C74, 0x3973, 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B,
+ 0x9C79, 0x9C79, 0x1E66, 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993,
+ 0x9C86, 0x9C86, 0x1F63, 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD,
+ 0x9C9E, 0x9CAA, 0x39AF, 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC,
+ 0x9CCA, 0x9CCA, 0x22B5, 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26,
+ 0x9CD0, 0x9CE5, 0x39DE, 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088,
+ 0x9CE8, 0x9CEB, 0x39F4, 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8,
+ 0x9CEE, 0x9CEE, 0x2341, 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B,
+ 0x9CFC, 0x9CFD, 0x3A05, 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07,
+ 0x9D42, 0x9D42, 0x2124, 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048,
+ 0x9D47, 0x9D47, 0x23E0, 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077,
+ 0x9D4E, 0x9D4E, 0x3A11, 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12,
+ 0x9D61, 0x9D61, 0x20B1, 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41,
+ 0x9D69, 0x9D69, 0x201C, 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8,
+ 0x9D6F, 0x9D70, 0x3A2D, 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F,
+ 0x9D75, 0x9D75, 0x1F9B, 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F,
+ 0x9D7C, 0x9D7C, 0x3A37, 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38,
+ 0x9D80, 0x9D89, 0x3A39, 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43,
+ 0x9D8D, 0x9D8D, 0x1FB4, 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7,
+ 0x9D92, 0x9D98, 0x3A48, 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F,
+ 0x9DA1, 0x9DA1, 0x23E1, 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56,
+ 0x9DA7, 0x9DA7, 0x23EA, 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3,
+ 0x9DAD, 0x9DAD, 0x210E, 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6,
+ 0x9DB3, 0x9DB3, 0x2004, 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D,
+ 0x9DBF, 0x9DC5, 0x3A6C, 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73,
+ 0x9DC9, 0x9DC9, 0x2264, 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2,
+ 0x9DCE, 0x9DD1, 0x3A78, 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C,
+ 0x9DD5, 0x9DD5, 0x1EC4, 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6,
+ 0x9DE2, 0x9DE2, 0x20A9, 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B,
+ 0x9DF2, 0x9DF3, 0x3A97, 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99,
+ 0x9DF7, 0x9DF7, 0x268B, 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76,
+ 0x9DFB, 0x9DFC, 0x3A9D, 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F,
+ 0x9E40, 0x9E44, 0x3AA0, 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5,
+ 0x9E48, 0x9E48, 0x2191, 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7,
+ 0x9E52, 0x9E52, 0x1F9C, 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA,
+ 0x9E55, 0x9E55, 0x3AB0, 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1,
+ 0x9E5D, 0x9E5D, 0x23E9, 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7,
+ 0x9E61, 0x9E61, 0x21D5, 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6,
+ 0x9E64, 0x9E66, 0x3ABA, 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD,
+ 0x9E6C, 0x9E6C, 0x1E4F, 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9,
+ 0x9E70, 0x9E71, 0x3AC3, 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5,
+ 0x9E74, 0x9E74, 0x23EC, 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6,
+ 0x9E7B, 0x9E7B, 0x23D8, 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB,
+ 0x9E80, 0x9E84, 0x3ACD, 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2,
+ 0x9E87, 0x9E87, 0x23ED, 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA,
+ 0x9E92, 0x9E95, 0x3ADC, 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8,
+ 0x9E98, 0x9EA1, 0x3AE0, 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA,
+ 0x9EA6, 0x9EA6, 0x200B, 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166,
+ 0x9EAA, 0x9EAD, 0x3AEF, 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3,
+ 0x9EB3, 0x9EB3, 0x2189, 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7,
+ 0x9EB7, 0x9EB7, 0x23E7, 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3,
+ 0x9EF6, 0x9EFE, 0x3B36, 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A,
+ 0x9F4F, 0x9F6E, 0x3B4D, 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D,
+ 0x9F80, 0x9F91, 0x3B7C, 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E,
+ 0x9F98, 0x9F98, 0x24D6, 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A,
+ 0x9FA7, 0x9FA8, 0x3BA0, 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2,
+ 0x9FAC, 0x9FAC, 0x24D5, 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228,
+ 0x9FCA, 0x9FCC, 0x3BC0, 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3,
+ 0x9FE1, 0x9FE1, 0x20FC, 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87,
+ 0x9FEC, 0x9FED, 0x3BDF, 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1,
+ 0x9FF4, 0x9FF4, 0x1EBA, 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119,
+ 0x9FFE, 0x9FFE, 0x3BEE, 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C,
+ 0xA044, 0xA045, 0x3BF2, 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4,
+ 0xA049, 0xA049, 0x2227, 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F,
+ 0xA04F, 0xA053, 0x3BFA, 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF,
+ 0xA05A, 0xA05A, 0x1F5D, 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC,
+ 0xA062, 0xA062, 0x3C0A, 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B,
+ 0xA071, 0xA071, 0x2149, 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046,
+ 0xA075, 0xA07E, 0x3C1A, 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24,
+ 0xA091, 0xA091, 0x2190, 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208,
+ 0xA095, 0xA095, 0x3C36, 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37,
+ 0xA0A9, 0xA0A9, 0x24C3, 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC,
+ 0xA0C0, 0xA0CD, 0x3C5E, 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C,
+ 0xA0D9, 0xA0D9, 0x1ED1, 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC,
+ 0xA0DF, 0xA0ED, 0x3C7A, 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89,
+ 0xA1A1, 0xA1FE, 0x0060, 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE,
+ 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,
+ 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,
+ 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,
+ 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,
+ 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,
+ 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,
+ 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,
+ 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,
+ 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,
+ 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,
+ 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,
+ 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,
+ 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,
+ 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,
+ 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,
+ 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,
+ 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,
+ 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,
+ 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,
+ 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,
+ 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,
+ 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,
+ 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,
+ 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,
+ 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,
+ 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,
+ 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,
+ 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,
+ 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,
+ 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,
+ 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,
+ 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,
+ 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,
+ 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,
+ 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,
+ 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,
+ 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,
+ 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,
+ 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,
+ 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,
+ 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,
+ 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,
+ 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,
+ 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,
+ 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,
+ 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,
+ 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,
+ 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,
+ 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,
+ 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,
+ 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,
+ 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,
+ 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,
+ 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,
+ 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,
+ 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,
+ 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,
+ 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,
+ 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,
+ 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,
+ 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,
+ 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,
+ 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,
+ 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,
+ 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,
+ 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,
+ 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,
+ 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,
+ 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,
+ 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,
+ 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,
+ 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,
+ 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,
+ 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,
+ 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,
+ 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,
+ 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,
+ 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,
+ 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,
+ 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,
+ 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,
+ 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,
+ 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,
+ 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,
+ 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,
+ 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,
+ 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,
+ 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,
+ 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,
+ 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,
+ 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,
+ 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,
+ 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,
+ 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,
+ 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,
+ 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,
+ 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,
+ 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,
+ 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,
+ 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,
+ 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,
+ 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,
+ 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,
+ 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,
+ 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,
+ 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,
+ 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,
+ 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,
+ 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,
+ 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,
+ 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,
+ 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,
+ 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,
+ 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,
+ 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,
+ 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,
+ 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,
+ 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,
+ 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,
+ 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,
+ 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,
+ 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,
+ 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,
+ 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,
+ 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,
+ 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,
+ 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,
+ 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,
+ 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,
+ 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,
+ 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,
+ 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,
+ 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,
+ 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,
+ 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,
+ 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,
+ 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,
+ 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,
+ 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,
+ 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,
+ 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,
+ 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,
+ 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,
+ 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,
+ 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,
+ 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,
+ 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,
+ 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,
+ 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,
+ 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,
+ 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,
+ 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,
+ 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,
+ 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,
+ 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,
+ 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,
+ 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,
+ 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,
+ 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,
+ 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,
+ 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,
+ 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,
+ 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,
+ 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,
+ 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,
+ 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,
+ 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,
+ 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,
+ 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,
+ 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,
+ 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,
+ 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,
+ 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,
+ 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,
+ 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,
+ 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,
+ 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,
+ 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,
+ 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,
+ 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,
+ 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,
+ 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,
+ 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,
+ 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,
+ 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,
+ 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,
+ 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,
+ 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,
+ 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,
+ 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,
+ 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,
+ 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,
+ 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,
+ 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,
+ 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,
+ 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,
+ 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,
+ 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,
+ 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,
+ 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,
+ 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,
+ 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,
+ 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,
+ 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,
+ 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,
+ 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,
+ 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,
+ 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,
+ 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,
+ 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,
+ 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,
+ 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,
+ 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,
+ 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,
+ 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,
+ 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,
+ 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,
+ 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,
+ 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,
+ 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,
+ 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,
+ 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,
+ 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,
+ 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,
+ 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,
+ 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,
+ 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,
+ 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,
+ 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,
+ 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,
+ 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,
+ 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,
+ 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,
+ 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,
+ 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,
+ 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,
+ 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,
+ 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,
+ 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,
+ 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,
+ 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,
+ 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,
+ 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,
+ 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,
+ 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,
+ 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,
+ 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,
+ 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,
+ 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,
+ 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,
+ 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,
+ 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,
+ 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,
+ 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,
+ 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,
+ 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,
+ 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,
+ 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,
+ 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,
+ 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,
+ 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,
+ 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,
+ 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,
+ 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,
+ 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,
+ 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,
+ 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,
+ 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,
+ 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,
+ 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,
+ 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,
+ 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,
+ 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,
+ 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,
+ 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,
+ 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,
+ 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,
+ 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,
+ 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,
+ 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,
+ 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,
+ 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,
+ 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,
+ 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,
+ 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,
+ 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,
+ 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,
+ 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,
+ 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,
+ 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,
+ 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,
+ 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,
+ 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,
+ 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,
+ 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,
+ 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,
+ 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,
+ 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,
+ 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,
+ 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,
+ 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,
+ 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,
+ 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,
+ 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,
+ 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,
+ 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,
+ 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,
+ 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,
+ 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,
+ 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,
+ 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,
+ 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,
+ 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,
+ 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,
+ 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,
+ 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,
+ 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,
+ 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,
+ 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,
+ 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,
+ 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,
+ 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,
+ 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,
+ 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,
+ 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,
+ 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,
+ 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,
+ 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,
+ 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,
+ 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,
+ 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,
+ 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,
+ 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,
+ 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,
+ 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,
+ 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,
+ 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,
+ 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,
+ 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,
+ 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,
+ 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,
+ 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,
+ 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,
+ 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,
+ 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,
+ 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,
+ 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,
+ 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,
+ 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,
+ 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,
+ 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,
+ 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,
+ 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,
+ 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,
+ 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,
+ 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,
+ 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,
+ 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,
+ 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,
+ 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,
+ 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,
+ 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,
+ 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,
+ 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,
+ 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,
+ 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,
+ 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,
+ 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,
+ 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,
+ 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,
+ 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,
+ 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,
+ 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,
+ 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,
+ 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,
+ 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,
+ 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,
+ 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,
+ 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,
+ 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,
+ 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,
+ 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,
+ 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,
+ 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,
+ 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,
+ 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,
+ 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,
+ 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,
+ 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,
+ 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,
+ 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,
+ 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,
+ 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,
+ 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,
+ 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,
+ 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,
+ 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,
+ 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,
+ 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,
+ 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,
+ 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,
+ 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,
+ 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,
+ 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,
+ 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,
+ 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,
+ 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,
+ 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,
+ 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,
+ 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,
+ 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,
+ 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,
+ 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,
+ 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,
+ 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,
+ 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,
+ 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,
+ 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,
+ 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,
+ 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,
+ 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,
+ 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,
+ 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,
+ 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,
+ 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,
+ 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,
+ 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,
+ 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,
+ 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,
+ 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,
+ 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,
+ 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,
+ 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,
+ 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,
+ 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,
+ 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,
+ 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,
+ 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,
+ 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,
+ 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,
+ 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,
+ 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,
+ 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,
+ 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,
+ 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,
+ 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,
+ 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,
+ 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,
+ 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,
+ 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,
+ 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,
+ 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,
+ 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,
+ 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,
+ 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,
+ 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,
+ 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,
+ 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,
+ 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,
+ 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,
+ 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,
+ 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,
+ 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,
+ 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,
+ 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,
+ 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,
+ 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,
+ 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,
+ 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,
+ 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,
+ 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,
+ 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,
+ 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,
+ 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,
+ 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,
+ 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,
+ 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,
+ 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,
+ 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,
+ 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,
+ 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,
+ 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,
+ 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,
+ 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,
+ 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,
+ 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,
+ 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,
+ 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,
+ 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,
+ 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,
+ 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,
+ 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,
+ 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,
+ 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,
+ 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,
+ 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,
+ 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,
+ 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,
+ 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,
+ 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,
+ 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,
+ 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,
+ 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,
+ 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,
+ 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,
+ 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,
+ 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,
+ 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,
+ 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,
+ 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,
+ 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,
+ 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,
+ 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,
+ 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,
+ 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,
+ 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,
+ 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,
+ 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,
+ 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,
+ 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,
+ 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,
+ 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,
+ 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,
+ 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,
+ 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,
+ 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,
+ 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,
+ 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,
+ 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,
+ 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,
+ 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,
+ 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,
+ 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,
+ 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,
+ 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,
+ 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,
+ 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,
+ 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,
+ 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,
+ 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,
+ 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,
+ 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,
+ 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,
+ 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,
+ 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,
+ 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,
+ 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,
+ 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,
+ 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,
+ 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,
+ 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,
+ 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,
+ 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,
+ 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,
+ 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,
+ 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,
+ 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,
+ 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,
+ 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,
+ 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,
+ 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,
+ 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,
+ 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,
+ 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,
+ 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,
+ 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,
+ 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,
+ 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,
+ 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,
+ 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,
+ 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,
+ 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,
+ 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,
+ 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,
+ 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,
+ 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,
+ 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,
+ 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,
+ 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,
+ 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,
+ 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,
+ 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,
+ 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,
+ 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,
+ 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,
+ 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,
+ 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,
+ 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,
+ 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,
+ 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,
+ 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,
+ 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,
+ 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,
+ 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,
+ 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,
+ 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,
+ 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,
+ 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,
+ 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,
+ 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,
+ 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,
+ 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,
+ 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,
+ 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,
+ 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,
+ 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,
+ 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,
+ 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,
+ 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,
+ 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,
+ 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,
+ 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,
+ 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,
+ 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,
+ 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,
+ 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,
+ 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,
+ 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,
+ 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,
+ 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,
+ 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,
+ 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,
+ 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,
+ 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,
+ 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,
+ 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,
+ 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,
+ 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,
+ 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,
+ 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,
+ 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,
+ 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,
+ 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,
+ 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,
+ 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,
+ 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,
+ 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,
+ 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,
+ 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,
+ 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,
+ 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,
+ 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,
+ 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,
+ 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,
+ 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,
+ 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,
+ 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,
+ 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,
+ 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,
+ 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,
+ 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,
+ 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,
+ 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,
+ 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,
+ 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,
+ 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,
+ 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,
+ 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,
+ 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,
+ 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,
+ 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,
+ 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,
+ 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,
+ 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,
+ 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,
+ 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,
+ 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,
+ 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,
+ 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,
+ 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,
+ 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,
+ 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,
+ 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,
+ 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,
+ 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,
+ 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,
+ 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,
+ 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,
+ 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,
+ 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,
+ 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,
+ 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,
+ 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,
+ 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,
+ 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,
+ 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,
+ 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,
+ 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,
+ 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,
+ 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,
+ 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,
+ 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,
+ 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,
+ 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,
+ 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,
+ 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,
+ 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,
+ 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,
+ 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,
+ 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,
+ 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,
+ 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,
+ 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,
+ 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,
+ 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,
+ 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,
+ 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,
+ 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,
+ 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,
+ 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,
+ 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,
+ 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,
+ 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,
+ 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,
+ 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,
+ 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,
+ 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,
+ 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,
+ 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,
+ 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,
+ 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,
+ 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,
+ 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,
+ 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,
+ 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,
+ 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,
+ 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,
+ 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,
+ 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,
+ 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,
+ 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,
+ 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,
+ 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,
+ 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,
+ 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,
+ 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,
+ 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,
+ 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,
+ 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,
+ 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,
+ 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,
+ 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,
+ 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,
+ 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,
+ 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,
+ 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,
+ 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,
+ 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,
+ 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,
+ 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,
+ 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,
+ 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,
+ 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,
+ 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,
+ 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,
+ 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,
+ 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,
+ 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,
+ 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,
+ 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,
+ 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,
+ 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,
+ 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,
+ 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,
+ 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,
+ 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,
+ 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,
+ 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,
+ 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,
+ 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,
+ 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,
+ 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,
+ 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,
+ 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,
+ 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,
+ 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,
+ 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,
+ 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,
+ 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,
+ 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,
+ 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,
+ 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,
+ 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,
+ 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,
+ 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,
+ 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,
+ 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,
+ 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,
+ 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,
+ 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,
+ 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,
+ 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,
+ 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,
+ 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,
+ 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,
+ 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,
+ 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,
+ 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,
+ 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,
+ 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,
+ 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,
+ 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,
+ 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,
+ 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,
+ 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,
+ 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,
+ 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,
+ 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,
+ 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,
+ 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,
+ 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,
+ 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,
+ 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,
+ 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,
+ 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,
+ 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,
+ 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,
+ 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,
+ 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,
+ 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,
+ 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,
+ 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,
+ 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,
+ 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,
+ 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,
+ 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,
+ 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,
+ 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,
+ 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,
+ 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,
+ 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,
+ 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,
+ 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,
+ 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,
+ 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,
+ 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,
+ 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,
+ 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,
+ 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,
+ 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,
+ 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,
+ 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,
+ 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,
+ 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,
+ 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,
+ 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,
+ 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,
+ 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,
+ 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,
+ 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,
+ 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,
+ 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,
+ 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,
+ 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,
+ 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,
+ 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,
+ 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,
+ 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,
+ 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,
+ 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,
+ 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,
+ 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,
+ 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,
+ 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,
+ 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,
+ 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,
+ 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,
+ 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,
+ 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,
+ 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,
+ 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,
+ 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,
+ 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,
+ 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,
+ 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,
+ 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,
+ 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,
+ 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,
+ 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,
+ 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,
+ 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,
+ 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,
+ 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,
+ 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,
+ 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,
+ 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,
+ 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,
+ 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,
+ 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,
+ 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,
+ 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,
+ 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,
+ 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,
+ 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,
+ 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,
+ 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,
+ 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,
+ 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,
+ 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,
+ 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,
+ 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,
+ 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,
+ 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,
+ 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,
+ 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,
+ 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,
+ 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,
+ 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,
+ 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,
+ 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,
+ 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,
+ 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,
+ 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,
+ 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,
+ 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,
+ 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,
+ 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,
+ 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,
+ 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,
+ 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,
+ 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,
+ 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,
+ 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,
+ 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,
+ 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,
+ 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,
+ 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,
+ 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,
+ 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,
+ 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,
+ 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,
+ 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,
+ 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,
+ 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,
+ 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,
+ 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,
+ 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,
+ 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,
+ 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,
+ 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,
+ 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,
+ 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,
+ 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,
+ 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,
+ 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,
+ 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,
+ 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,
+ 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp
new file mode 100644
index 0000000000..50aadda386
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK_EUC_V_2[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp
new file mode 100644
index 0000000000..221301e70b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp
@@ -0,0 +1,1706 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK2K_H_5[4071 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,
+ 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,
+ 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,
+ 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,
+ 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,
+ 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,
+ 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,
+ 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,
+ 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,
+ 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,
+ 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,
+ 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,
+ 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,
+ 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,
+ 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,
+ 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,
+ 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,
+ 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,
+ 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,
+ 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,
+ 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,
+ 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,
+ 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,
+ 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,
+ 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,
+ 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,
+ 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,
+ 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,
+ 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,
+ 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,
+ 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,
+ 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,
+ 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,
+ 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,
+ 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,
+ 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,
+ 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,
+ 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,
+ 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,
+ 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,
+ 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,
+ 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,
+ 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,
+ 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,
+ 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,
+ 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,
+ 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,
+ 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,
+ 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,
+ 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,
+ 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,
+ 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,
+ 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,
+ 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,
+ 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,
+ 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,
+ 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,
+ 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,
+ 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,
+ 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,
+ 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,
+ 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,
+ 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,
+ 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,
+ 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,
+ 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,
+ 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,
+ 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,
+ 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,
+ 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,
+ 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,
+ 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,
+ 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,
+ 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,
+ 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,
+ 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,
+ 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,
+ 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,
+ 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,
+ 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,
+ 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,
+ 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,
+ 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,
+ 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,
+ 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,
+ 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,
+ 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,
+ 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,
+ 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,
+ 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,
+ 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,
+ 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,
+ 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,
+ 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,
+ 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,
+ 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,
+ 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,
+ 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,
+ 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,
+ 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,
+ 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,
+ 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,
+ 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,
+ 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,
+ 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,
+ 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,
+ 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,
+ 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,
+ 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,
+ 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,
+ 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,
+ 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,
+ 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,
+ 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,
+ 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,
+ 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,
+ 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,
+ 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,
+ 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,
+ 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,
+ 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,
+ 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,
+ 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,
+ 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,
+ 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,
+ 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,
+ 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,
+ 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,
+ 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,
+ 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,
+ 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,
+ 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,
+ 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,
+ 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,
+ 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,
+ 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,
+ 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,
+ 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,
+ 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,
+ 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,
+ 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,
+ 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,
+ 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,
+ 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,
+ 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,
+ 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,
+ 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,
+ 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,
+ 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,
+ 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,
+ 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,
+ 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,
+ 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,
+ 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,
+ 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,
+ 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,
+ 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,
+ 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,
+ 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,
+ 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,
+ 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,
+ 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,
+ 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,
+ 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,
+ 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,
+ 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,
+ 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,
+ 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,
+ 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,
+ 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,
+ 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,
+ 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,
+ 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,
+ 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,
+ 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,
+ 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,
+ 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,
+ 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,
+ 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,
+ 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,
+ 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,
+ 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,
+ 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,
+ 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,
+ 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,
+ 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,
+ 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,
+ 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,
+ 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,
+ 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,
+ 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,
+ 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,
+ 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,
+ 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,
+ 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,
+ 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,
+ 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,
+ 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,
+ 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,
+ 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,
+ 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,
+ 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,
+ 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,
+ 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,
+ 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,
+ 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,
+ 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,
+ 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,
+ 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,
+ 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,
+ 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,
+ 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,
+ 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,
+ 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,
+ 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,
+ 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,
+ 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,
+ 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,
+ 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,
+ 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,
+ 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,
+ 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,
+ 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,
+ 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,
+ 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,
+ 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,
+ 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,
+ 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,
+ 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,
+ 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,
+ 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,
+ 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,
+ 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,
+ 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,
+ 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,
+ 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,
+ 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,
+ 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,
+ 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,
+ 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,
+ 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,
+ 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,
+ 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,
+ 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,
+ 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,
+ 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,
+ 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,
+ 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,
+ 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,
+ 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,
+ 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,
+ 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,
+ 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,
+ 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,
+ 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,
+ 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,
+ 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,
+ 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,
+ 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,
+ 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,
+ 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,
+ 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,
+ 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,
+ 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,
+ 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,
+ 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,
+ 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,
+ 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,
+ 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,
+ 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,
+ 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,
+ 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,
+ 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,
+ 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,
+ 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,
+ 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,
+ 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,
+ 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,
+ 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,
+ 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,
+ 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,
+ 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,
+ 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,
+ 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,
+ 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,
+ 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,
+ 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,
+ 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,
+ 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,
+ 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,
+ 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,
+ 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,
+ 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,
+ 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,
+ 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,
+ 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,
+ 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,
+ 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,
+ 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,
+ 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,
+ 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,
+ 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,
+ 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,
+ 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,
+ 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,
+ 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,
+ 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,
+ 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,
+ 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,
+ 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,
+ 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,
+ 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,
+ 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,
+ 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,
+ 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,
+ 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,
+ 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,
+ 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,
+ 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,
+ 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,
+ 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,
+ 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,
+ 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,
+ 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,
+ 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,
+ 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,
+ 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,
+ 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,
+ 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,
+ 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,
+ 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,
+ 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,
+ 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,
+ 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,
+ 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,
+ 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,
+ 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,
+ 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,
+ 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,
+ 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,
+ 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,
+ 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,
+ 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,
+ 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,
+ 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,
+ 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,
+ 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,
+ 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,
+ 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,
+ 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,
+ 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,
+ 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,
+ 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,
+ 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,
+ 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,
+ 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,
+ 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,
+ 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,
+ 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,
+ 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,
+ 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,
+ 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,
+ 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,
+ 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,
+ 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,
+ 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,
+ 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,
+ 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,
+ 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,
+ 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,
+ 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,
+ 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,
+ 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,
+ 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,
+ 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,
+ 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,
+ 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,
+ 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,
+ 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,
+ 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,
+ 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,
+ 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,
+ 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,
+ 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,
+ 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,
+ 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,
+ 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,
+ 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,
+ 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,
+ 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,
+ 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,
+ 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,
+ 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,
+ 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,
+ 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,
+ 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,
+ 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,
+ 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,
+ 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,
+ 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,
+ 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,
+ 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,
+ 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,
+ 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,
+ 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,
+ 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,
+ 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,
+ 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,
+ 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E3, 0xA2E3, 0x5751,
+ 0xA2E5, 0xA2EE, 0x00F0, 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106,
+ 0xA4A1, 0xA4F3, 0x0164, 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D,
+ 0xA6C1, 0xA6F5, 0x0225, 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B,
+ 0xA840, 0xA87E, 0x26B3, 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C,
+ 0xA8C5, 0xA8EA, 0x02BC, 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720,
+ 0xA95C, 0xA95C, 0x2722, 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742,
+ 0xA996, 0xA996, 0x1E17, 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99,
+ 0xAA4D, 0xAA4D, 0x21B6, 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6,
+ 0xAA71, 0xAA71, 0x2235, 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397,
+ 0xAA74, 0xAA76, 0x3CC9, 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC,
+ 0xAA7A, 0xAA7A, 0x223F, 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE,
+ 0xAA80, 0xAA99, 0x3CD1, 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB,
+ 0xAA9C, 0xAA9C, 0x2396, 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC,
+ 0xAA9F, 0xAA9F, 0x20A2, 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E,
+ 0xAB40, 0xAB40, 0x1F64, 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B,
+ 0xAB44, 0xAB44, 0x3CF0, 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139,
+ 0xAB47, 0xAB47, 0x3CF1, 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1,
+ 0xAB4A, 0xAB4A, 0x239A, 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399,
+ 0xAB4E, 0xAB7E, 0x3CF4, 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C,
+ 0xAC40, 0xAC45, 0x3D46, 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C,
+ 0xAC71, 0xAC71, 0x2460, 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C,
+ 0xAC7D, 0xAC7E, 0x3D80, 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D,
+ 0xAC8E, 0xAC92, 0x3D8F, 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A,
+ 0xAC95, 0xACA0, 0x3D94, 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461,
+ 0xAD4A, 0xAD5D, 0x3DA9, 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD,
+ 0xAD61, 0xAD61, 0x2462, 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54,
+ 0xAD69, 0xAD73, 0x3DC5, 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0,
+ 0xAD80, 0xAD81, 0x3DDA, 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC,
+ 0xAD87, 0xAD87, 0x245D, 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463,
+ 0xAD8C, 0xAD90, 0x3DE3, 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8,
+ 0xAE40, 0xAE53, 0x3DF7, 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B,
+ 0xAE62, 0xAE62, 0x1E70, 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F,
+ 0xAE81, 0xAE84, 0x3E34, 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38,
+ 0xAE8B, 0xAE8B, 0x1F4E, 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1,
+ 0xAE95, 0xAE9F, 0x3E45, 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50,
+ 0xAF64, 0xAF64, 0x1FC6, 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE,
+ 0xAF7C, 0xAF7E, 0x3E8A, 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01,
+ 0xAF83, 0xAF83, 0x2200, 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2,
+ 0xAF8F, 0xAF8F, 0x1E97, 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB,
+ 0xAF92, 0xAF9B, 0x3E9A, 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4,
+ 0xAF9F, 0xAF9F, 0x2028, 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7,
+ 0xB041, 0xB042, 0x25AF, 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1,
+ 0xB045, 0xB04E, 0x3EA9, 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3,
+ 0xB054, 0xB054, 0x1E4E, 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202,
+ 0xB058, 0xB058, 0x25AB, 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9,
+ 0xB05B, 0xB05B, 0x25AD, 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6,
+ 0xB05E, 0xB05E, 0x3EBB, 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4,
+ 0xB062, 0xB062, 0x222F, 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7,
+ 0xB065, 0xB06B, 0x3EBC, 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3,
+ 0xB07D, 0xB07D, 0x1E25, 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4,
+ 0xB097, 0xB097, 0x25C0, 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A,
+ 0xB09A, 0xB0A0, 0x3EEC, 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3,
+ 0xB14B, 0xB14B, 0x226E, 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD,
+ 0xB14E, 0xB14E, 0x3EFF, 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2,
+ 0xB151, 0xB151, 0x3F00, 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01,
+ 0xB180, 0xB196, 0x3F2D, 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44,
+ 0xB1A1, 0xB1FE, 0x040A, 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF,
+ 0xB242, 0xB266, 0x3F4E, 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73,
+ 0xB26D, 0xB26D, 0x2074, 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687,
+ 0xB275, 0xB27E, 0x3F7E, 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88,
+ 0xB289, 0xB289, 0x268D, 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0,
+ 0xB29B, 0xB2A0, 0x3FA0, 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6,
+ 0xB343, 0xB343, 0x1FAB, 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8,
+ 0xB371, 0xB37E, 0x3FD5, 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9,
+ 0xB389, 0xB38B, 0x3FEB, 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE,
+ 0xB38E, 0xB38E, 0x21FA, 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6,
+ 0xB440, 0xB453, 0x4001, 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015,
+ 0xB458, 0xB458, 0x24E4, 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6,
+ 0xB45F, 0xB45F, 0x20F7, 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B,
+ 0xB462, 0xB474, 0x401E, 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031,
+ 0xB47E, 0xB47E, 0x24EC, 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB,
+ 0xB484, 0xB488, 0x403C, 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041,
+ 0xB493, 0xB493, 0x24EA, 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524,
+ 0xB540, 0xB540, 0x4057, 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058,
+ 0xB54B, 0xB54B, 0x1E27, 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6,
+ 0xB557, 0xB559, 0x406B, 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012,
+ 0xB55C, 0xB55C, 0x1EEC, 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8,
+ 0xB562, 0xB57E, 0x4072, 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66,
+ 0xB59D, 0xB59D, 0x24DC, 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582,
+ 0xB640, 0xB651, 0x40AE, 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0,
+ 0xB655, 0xB655, 0x24DD, 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E,
+ 0xB65A, 0xB65A, 0x40C5, 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8,
+ 0xB65D, 0xB67E, 0x40C6, 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0,
+ 0xB740, 0xB74D, 0x4109, 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117,
+ 0xB751, 0xB751, 0x1E80, 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677,
+ 0xB75A, 0xB763, 0x4120, 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69,
+ 0xB766, 0xB766, 0x222B, 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F,
+ 0xB778, 0xB778, 0x1F5B, 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B,
+ 0xB781, 0xB781, 0x4140, 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141,
+ 0xB7A1, 0xB7FE, 0x063E, 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0,
+ 0xB844, 0xB844, 0x2186, 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED,
+ 0xB847, 0xB84C, 0x4163, 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169,
+ 0xB851, 0xB851, 0x1FEA, 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4,
+ 0xB85B, 0xB85B, 0x20E1, 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8,
+ 0xB85E, 0xB85E, 0x2260, 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2,
+ 0xB861, 0xB876, 0x4176, 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C,
+ 0xB880, 0xB881, 0x4193, 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195,
+ 0xB8A1, 0xB8FE, 0x069C, 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41,
+ 0xB951, 0xB960, 0x41C3, 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3,
+ 0xB97B, 0xB97B, 0x1F86, 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF,
+ 0xB99D, 0xB99D, 0x1FB3, 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF,
+ 0xB9A1, 0xB9FE, 0x06FA, 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4,
+ 0xBA43, 0xBA43, 0x4210, 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211,
+ 0xBA56, 0xBA56, 0x25E3, 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111,
+ 0xBA5A, 0xBA5F, 0x4224, 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A,
+ 0xBA6A, 0xBA6A, 0x25E7, 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041,
+ 0xBA75, 0xBA7E, 0x423C, 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA,
+ 0xBA85, 0xBA85, 0x424A, 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B,
+ 0xBA88, 0xBA88, 0x25EC, 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB,
+ 0xBA8E, 0xBA9D, 0x4250, 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D,
+ 0xBAA0, 0xBAA0, 0x4260, 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7,
+ 0xBB41, 0xBB48, 0x4261, 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269,
+ 0xBB58, 0xBB58, 0x25E9, 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE,
+ 0xBB5C, 0xBB5C, 0x203A, 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693,
+ 0xBB61, 0xBB64, 0x427C, 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED,
+ 0xBB67, 0xBB67, 0x4280, 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281,
+ 0xBB6A, 0xBB6A, 0x2065, 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3,
+ 0xBB6F, 0xBB7E, 0x4285, 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6,
+ 0xBC40, 0xBC51, 0x42B6, 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC,
+ 0xBC54, 0xBC59, 0x42C8, 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE,
+ 0xBC61, 0xBC61, 0x269B, 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3,
+ 0xBC64, 0xBC64, 0x42D5, 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6,
+ 0xBC67, 0xBC67, 0x25F4, 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B,
+ 0xBC6A, 0xBC6C, 0x42D8, 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB,
+ 0xBC6F, 0xBC6F, 0x1F7B, 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D,
+ 0xBC72, 0xBC72, 0x42DD, 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48,
+ 0xBC75, 0xBC75, 0x241C, 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF,
+ 0xBC79, 0xBC79, 0x219A, 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091,
+ 0xBC7C, 0xBC7D, 0x42DF, 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1,
+ 0xBC82, 0xBC82, 0x2423, 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422,
+ 0xBC85, 0xBC85, 0x42E3, 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4,
+ 0xBC88, 0xBC88, 0x228D, 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8,
+ 0xBC8B, 0xBC8B, 0x2421, 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3,
+ 0xBC90, 0xBC99, 0x42E8, 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426,
+ 0xBC9C, 0xBC9C, 0x2425, 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2,
+ 0xBCA1, 0xBCFE, 0x0814, 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A,
+ 0xBD43, 0xBD43, 0x2424, 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428,
+ 0xBD46, 0xBD47, 0x42F8, 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429,
+ 0xBD4A, 0xBD4A, 0x42FA, 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB,
+ 0xBD4D, 0xBD4D, 0x22BE, 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31,
+ 0xBD50, 0xBD56, 0x42FD, 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304,
+ 0xBD59, 0xBD59, 0x1FB5, 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B,
+ 0xBD67, 0xBD67, 0x1FAF, 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068,
+ 0xBD6B, 0xBD6B, 0x21E4, 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21,
+ 0xBD70, 0xBD70, 0x4316, 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317,
+ 0xBD79, 0xBD79, 0x217C, 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D,
+ 0xBD7C, 0xBD7D, 0x431E, 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320,
+ 0xBD81, 0xBD81, 0x1FD1, 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33,
+ 0xBD8A, 0xBD8A, 0x4328, 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329,
+ 0xBD8E, 0xBD8E, 0x242E, 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430,
+ 0xBD91, 0xBD91, 0x21DB, 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158,
+ 0xBD98, 0xBD9A, 0x4331, 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334,
+ 0xBDA1, 0xBDFE, 0x0872, 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9,
+ 0xBE44, 0xBE44, 0x433C, 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D,
+ 0xBE49, 0xBE49, 0x1E8E, 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340,
+ 0xBE51, 0xBE51, 0x21C5, 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192,
+ 0xBE54, 0xBE54, 0x4346, 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19,
+ 0xBE57, 0xBE57, 0x218C, 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3,
+ 0xBE5A, 0xBE5C, 0x4347, 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438,
+ 0xBE5F, 0xBE5F, 0x2432, 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A,
+ 0xBE62, 0xBE62, 0x1E9C, 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085,
+ 0xBE65, 0xBE68, 0x434B, 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F,
+ 0xBE6C, 0xBE6C, 0x243B, 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7,
+ 0xBE70, 0xBE70, 0x2433, 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054,
+ 0xBE77, 0xBE77, 0x21DE, 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434,
+ 0xBE7A, 0xBE7B, 0x4359, 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89,
+ 0xBE7E, 0xBE7E, 0x243C, 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E,
+ 0xBE84, 0xBE84, 0x1ED8, 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF,
+ 0xBE87, 0xBE87, 0x2445, 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249,
+ 0xBE8A, 0xBE8B, 0x4360, 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362,
+ 0xBE8E, 0xBE8E, 0x1E47, 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363,
+ 0xBE92, 0xBE92, 0x2086, 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196,
+ 0xBE96, 0xBE96, 0x4367, 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F,
+ 0xBE99, 0xBE99, 0x4368, 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369,
+ 0xBE9C, 0xBE9C, 0x2442, 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E,
+ 0xBEA0, 0xBEA0, 0x436C, 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6,
+ 0xBF41, 0xBF4C, 0x436D, 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446,
+ 0xBF4F, 0xBF4F, 0x244B, 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379,
+ 0xBF55, 0xBF55, 0x2427, 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D,
+ 0xBF60, 0xBF60, 0x1F0F, 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447,
+ 0xBF63, 0xBF63, 0x2449, 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387,
+ 0xBF68, 0xBF68, 0x21C2, 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E,
+ 0xBF6D, 0xBF6F, 0x438D, 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390,
+ 0xBF72, 0xBF72, 0x244A, 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391,
+ 0xBF76, 0xBF76, 0x22BB, 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393,
+ 0xBF79, 0xBF79, 0x2694, 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6,
+ 0xBF7C, 0xBF7C, 0x2051, 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E,
+ 0xBF80, 0xBF81, 0x4395, 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D,
+ 0xBF84, 0xBF88, 0x4397, 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451,
+ 0xBF8B, 0xBF94, 0x439C, 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6,
+ 0xBF97, 0xBF97, 0x2289, 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7,
+ 0xBF9D, 0xBF9D, 0x2454, 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E,
+ 0xC040, 0xC040, 0x20FB, 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440,
+ 0xC045, 0xC04A, 0x43B1, 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61,
+ 0xC04D, 0xC04D, 0x269D, 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A,
+ 0xC050, 0xC050, 0x2456, 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458,
+ 0xC053, 0xC054, 0x43B8, 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA,
+ 0xC05B, 0xC05B, 0x221A, 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A,
+ 0xC05F, 0xC05F, 0x244D, 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1,
+ 0xC069, 0xC069, 0x2453, 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420,
+ 0xC06C, 0xC06C, 0x43CA, 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685,
+ 0xC06F, 0xC06F, 0x43CB, 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC,
+ 0xC074, 0xC074, 0x2224, 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF,
+ 0xC077, 0xC077, 0x21BA, 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A,
+ 0xC07A, 0xC07B, 0x43D1, 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3,
+ 0xC080, 0xC09A, 0x43D5, 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0,
+ 0xC09D, 0xC09D, 0x269A, 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C,
+ 0xC140, 0xC14F, 0x43F4, 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404,
+ 0xC154, 0xC154, 0x1E2C, 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062,
+ 0xC160, 0xC160, 0x24F1, 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2,
+ 0xC163, 0xC174, 0x4412, 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424,
+ 0xC178, 0xC178, 0x2215, 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C,
+ 0xC195, 0xC195, 0x21AE, 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA,
+ 0xC240, 0xC24D, 0x444C, 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A,
+ 0xC265, 0xC265, 0x25C2, 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1,
+ 0xC268, 0xC27C, 0x4471, 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486,
+ 0xC280, 0xC283, 0x4487, 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B,
+ 0xC293, 0xC293, 0x2017, 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125,
+ 0xC296, 0xC296, 0x214D, 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4,
+ 0xC299, 0xC299, 0x209D, 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A,
+ 0xC29C, 0xC29C, 0x25C3, 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179,
+ 0xC2A1, 0xC2FE, 0x0A48, 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E,
+ 0xC343, 0xC343, 0x2155, 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2,
+ 0xC37C, 0xC37E, 0x44D7, 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7,
+ 0xC385, 0xC39A, 0x44DE, 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4,
+ 0xC3A1, 0xC3FE, 0x0AA6, 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123,
+ 0xC44A, 0xC44B, 0x4502, 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504,
+ 0xC454, 0xC454, 0x24C9, 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094,
+ 0xC459, 0xC45A, 0x450E, 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510,
+ 0xC463, 0xC463, 0x1E77, 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06,
+ 0xC478, 0xC479, 0x452A, 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C,
+ 0xC480, 0xC480, 0x4530, 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531,
+ 0xC491, 0xC491, 0x1EAD, 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8,
+ 0xC494, 0xC497, 0x4540, 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544,
+ 0xC49A, 0xC49A, 0x20C5, 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA,
+ 0xC49D, 0xC4A0, 0x4546, 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A,
+ 0xC544, 0xC544, 0x1FF0, 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6,
+ 0xC547, 0xC54A, 0x454F, 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE,
+ 0xC54D, 0xC551, 0x4553, 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558,
+ 0xC55F, 0xC55F, 0x2161, 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B,
+ 0xC564, 0xC564, 0x21D9, 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9,
+ 0xC567, 0xC57E, 0x4567, 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61,
+ 0xC594, 0xC59B, 0x4592, 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A,
+ 0xC59E, 0xC59E, 0x1F98, 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62,
+ 0xC640, 0xC640, 0x459D, 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E,
+ 0xC644, 0xC644, 0x1F88, 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8,
+ 0xC648, 0xC662, 0x45A2, 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD,
+ 0xC672, 0xC672, 0x2336, 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7,
+ 0xC6A1, 0xC6FE, 0x0BC0, 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB,
+ 0xC767, 0xC76E, 0x461E, 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626,
+ 0xC776, 0xC776, 0x1F7D, 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333,
+ 0xC77C, 0xC77E, 0x4630, 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E,
+ 0xC840, 0xC840, 0x4654, 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655,
+ 0xC84F, 0xC84F, 0x2334, 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1,
+ 0xC853, 0xC865, 0x4664, 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677,
+ 0xC86E, 0xC86E, 0x2349, 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B,
+ 0xC880, 0xC886, 0x468D, 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694,
+ 0xC892, 0xC892, 0x2347, 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193,
+ 0xC895, 0xC898, 0x469F, 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3,
+ 0xC89D, 0xC89D, 0x1F62, 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C,
+ 0xC940, 0xC94E, 0x46A9, 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348,
+ 0xC951, 0xC96D, 0x46B8, 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5,
+ 0xC970, 0xC970, 0x2345, 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12,
+ 0xC978, 0xC97E, 0x46DC, 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018,
+ 0xC990, 0xC990, 0x2335, 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C,
+ 0xC99D, 0xC9A0, 0x46FD, 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701,
+ 0xCA4E, 0xCA4E, 0x266F, 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351,
+ 0xCA57, 0xCA58, 0x4716, 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718,
+ 0xCA5C, 0xCA5C, 0x2338, 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B,
+ 0xCA62, 0xCA6D, 0x471E, 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A,
+ 0xCA72, 0xCA72, 0x234F, 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D,
+ 0xCA78, 0xCA7A, 0x4731, 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331,
+ 0xCA7D, 0xCA7D, 0x4734, 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735,
+ 0xCA81, 0xCA81, 0x233B, 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350,
+ 0xCA8A, 0xCA8D, 0x473D, 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6,
+ 0xCA90, 0xCA91, 0x4741, 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743,
+ 0xCA9A, 0xCA9A, 0x2355, 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38,
+ 0xCB40, 0xCB42, 0x4750, 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753,
+ 0xCB45, 0xCB45, 0x1F74, 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330,
+ 0xCB48, 0xCB4A, 0x4755, 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758,
+ 0xCB4E, 0xCB4E, 0x20DA, 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A,
+ 0xCB58, 0xCB5C, 0x4762, 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767,
+ 0xCB5F, 0xCB5F, 0x2107, 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F,
+ 0xCB6B, 0xCB7A, 0x4772, 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343,
+ 0xCB7D, 0xCB7E, 0x4782, 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212,
+ 0xCB88, 0xCB8D, 0x478B, 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791,
+ 0xCB92, 0xCB92, 0x2359, 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254,
+ 0xCB9D, 0xCB9D, 0x479D, 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E,
+ 0xCBA1, 0xCBFE, 0x0D96, 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357,
+ 0xCC42, 0xCC48, 0x47A0, 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042,
+ 0xCC4B, 0xCC4B, 0x2153, 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB,
+ 0xCC50, 0xCC5B, 0x47AA, 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6,
+ 0xCC60, 0xCC60, 0x2356, 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337,
+ 0xCC65, 0xCC6C, 0x47BC, 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4,
+ 0xCC79, 0xCC79, 0x2353, 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061,
+ 0xCC7E, 0xCC7E, 0x47D2, 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95,
+ 0xCC8F, 0xCC93, 0x47E1, 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6,
+ 0xCC96, 0xCC96, 0x1F42, 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8,
+ 0xCC9E, 0xCCA0, 0x47ED, 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0,
+ 0xCD80, 0xCD8F, 0x482F, 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F,
+ 0xCD98, 0xCD98, 0x25D7, 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52,
+ 0xCE40, 0xCE66, 0x484E, 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875,
+ 0xCE72, 0xCE72, 0x21B2, 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B,
+ 0xCE81, 0xCE81, 0x219E, 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC,
+ 0xCE88, 0xCE9A, 0x4891, 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4,
+ 0xCE9E, 0xCE9E, 0x2226, 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0,
+ 0xCF40, 0xCF4D, 0x48A8, 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6,
+ 0xCF55, 0xCF55, 0x227B, 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE,
+ 0xCF59, 0xCF5B, 0x48BE, 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1,
+ 0xCF6C, 0xCF6C, 0x25D5, 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B,
+ 0xCF74, 0xCF74, 0x48D6, 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7,
+ 0xCF78, 0xCF78, 0x1E89, 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9,
+ 0xCF7D, 0xCF7E, 0x48DC, 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211,
+ 0xCF82, 0xCF88, 0x48DF, 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6,
+ 0xCF8B, 0xCF92, 0x48E6, 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF,
+ 0xCF95, 0xCF9D, 0x48EE, 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7,
+ 0xCFA0, 0xCFA0, 0x25D8, 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8,
+ 0xD04D, 0xD04D, 0x1F29, 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B,
+ 0xD052, 0xD054, 0x4908, 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B,
+ 0xD05C, 0xD05C, 0x2297, 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690,
+ 0xD061, 0xD066, 0x4914, 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A,
+ 0xD06C, 0xD06C, 0x2198, 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88,
+ 0xD06F, 0xD07C, 0x491F, 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D,
+ 0xD080, 0xD0A0, 0x492E, 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F,
+ 0xD155, 0xD155, 0x25F1, 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C,
+ 0xD15A, 0xD160, 0x4967, 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC,
+ 0xD163, 0xD174, 0x496E, 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980,
+ 0xD17D, 0xD17D, 0x2676, 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988,
+ 0xD19D, 0xD19D, 0x1FE1, 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5,
+ 0xD1A1, 0xD1FE, 0x0FCA, 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7,
+ 0xD243, 0xD243, 0x22DD, 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD,
+ 0xD24E, 0xD25B, 0x49B2, 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0,
+ 0xD263, 0xD263, 0x25BC, 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6,
+ 0xD268, 0xD268, 0x25BF, 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187,
+ 0xD26E, 0xD26E, 0x49CD, 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE,
+ 0xD272, 0xD272, 0x1E7F, 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD,
+ 0xD276, 0xD27E, 0x49D2, 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96,
+ 0xD28B, 0xD28D, 0x49E5, 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8,
+ 0xD292, 0xD292, 0x2084, 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136,
+ 0xD296, 0xD296, 0x49ED, 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE,
+ 0xD2A0, 0xD2A0, 0x24BA, 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6,
+ 0xD344, 0xD344, 0x24BC, 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4,
+ 0xD349, 0xD349, 0x49FD, 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE,
+ 0xD34D, 0xD34D, 0x24BD, 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE,
+ 0xD351, 0xD354, 0x4A02, 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06,
+ 0xD358, 0xD358, 0x1FD2, 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD,
+ 0xD35C, 0xD35C, 0x4A0A, 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D,
+ 0xD35F, 0xD377, 0x4A0B, 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24,
+ 0xD37A, 0xD37A, 0x260A, 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94,
+ 0xD37D, 0xD37E, 0x4A26, 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF,
+ 0xD386, 0xD386, 0x1ECB, 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D,
+ 0xD38B, 0xD38B, 0x1F77, 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB,
+ 0xD38E, 0xD38E, 0x4A31, 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32,
+ 0xD391, 0xD391, 0x216F, 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0,
+ 0xD394, 0xD395, 0x4A34, 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36,
+ 0xD398, 0xD398, 0x22E2, 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37,
+ 0xD39B, 0xD39B, 0x1F78, 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2,
+ 0xD39F, 0xD39F, 0x4A3A, 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086,
+ 0xD440, 0xD440, 0x4A3B, 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C,
+ 0xD445, 0xD445, 0x1FD3, 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5,
+ 0xD448, 0xD44B, 0x4A40, 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44,
+ 0xD44F, 0xD44F, 0x211F, 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD,
+ 0xD454, 0xD455, 0x4A49, 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B,
+ 0xD458, 0xD458, 0x22E7, 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282,
+ 0xD45D, 0xD461, 0x4A4F, 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54,
+ 0xD467, 0xD467, 0x22E8, 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4,
+ 0xD46F, 0xD46F, 0x4A5E, 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F,
+ 0xD472, 0xD472, 0x22EB, 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9,
+ 0xD475, 0xD475, 0x20BD, 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA,
+ 0xD479, 0xD47A, 0x4A63, 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65,
+ 0xD47E, 0xD47E, 0x1E9E, 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6,
+ 0xD483, 0xD483, 0x21E7, 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69,
+ 0xD487, 0xD487, 0x2137, 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C,
+ 0xD48B, 0xD48B, 0x4A6D, 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2,
+ 0xD48E, 0xD48E, 0x1F37, 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E,
+ 0xD491, 0xD491, 0x22EF, 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10,
+ 0xD494, 0xD494, 0x21C8, 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1,
+ 0xD497, 0xD49B, 0x4A70, 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75,
+ 0xD49F, 0xD49F, 0x22EE, 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4,
+ 0xD540, 0xD542, 0x4A78, 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E,
+ 0xD545, 0xD545, 0x22EC, 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B,
+ 0xD54A, 0xD54A, 0x20FE, 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9,
+ 0xD550, 0xD550, 0x4A81, 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82,
+ 0xD554, 0xD554, 0x2236, 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7,
+ 0xD557, 0xD559, 0x4A85, 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88,
+ 0xD55C, 0xD55C, 0x1E82, 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89,
+ 0xD55F, 0xD55F, 0x21A4, 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8,
+ 0xD562, 0xD562, 0x2151, 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60,
+ 0xD565, 0xD567, 0x4A8B, 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E,
+ 0xD56C, 0xD56C, 0x2145, 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC,
+ 0xD56F, 0xD571, 0x4A92, 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95,
+ 0xD575, 0xD575, 0x1EF5, 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218,
+ 0xD579, 0xD57A, 0x4A99, 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B,
+ 0xD57E, 0xD57E, 0x2300, 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4,
+ 0xD582, 0xD583, 0x4A9E, 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0,
+ 0xD586, 0xD586, 0x22FD, 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA,
+ 0xD589, 0xD589, 0x4AA2, 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3,
+ 0xD58C, 0xD58C, 0x22FB, 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC,
+ 0xD58F, 0xD58F, 0x2027, 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060,
+ 0xD594, 0xD594, 0x22FF, 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE,
+ 0xD599, 0xD599, 0x1EC7, 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C,
+ 0xD59C, 0xD59E, 0x4AAC, 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF,
+ 0xD5A1, 0xD5FE, 0x1142, 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0,
+ 0xD642, 0xD642, 0x230A, 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1,
+ 0xD647, 0xD647, 0x2303, 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307,
+ 0xD64A, 0xD64A, 0x230B, 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F,
+ 0xD64E, 0xD64E, 0x4AB7, 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8,
+ 0xD652, 0xD652, 0x2302, 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D,
+ 0xD655, 0xD655, 0x4ABA, 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB,
+ 0xD658, 0xD658, 0x2308, 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC,
+ 0xD65B, 0xD65B, 0x4ABD, 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305,
+ 0xD65E, 0xD65E, 0x2197, 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171,
+ 0xD661, 0xD661, 0x2298, 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57,
+ 0xD666, 0xD668, 0x4AC2, 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5,
+ 0xD66B, 0xD66B, 0x2311, 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304,
+ 0xD670, 0xD670, 0x4AC9, 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35,
+ 0xD673, 0xD673, 0x4ACA, 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310,
+ 0xD676, 0xD676, 0x1FA3, 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6,
+ 0xD679, 0xD67B, 0x4ACC, 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF,
+ 0xD680, 0xD682, 0x4AD1, 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4,
+ 0xD686, 0xD686, 0x2312, 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313,
+ 0xD689, 0xD68D, 0x4AD6, 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB,
+ 0xD694, 0xD694, 0x1FBA, 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078,
+ 0xD69A, 0xD6A0, 0x4AE4, 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB,
+ 0xD743, 0xD743, 0x2288, 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316,
+ 0xD749, 0xD749, 0x1F6B, 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314,
+ 0xD751, 0xD751, 0x4AF8, 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315,
+ 0xD754, 0xD754, 0x2168, 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4,
+ 0xD757, 0xD763, 0x4AFA, 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07,
+ 0xD767, 0xD767, 0x2219, 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09,
+ 0xD76C, 0xD76C, 0x20D5, 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A,
+ 0xD770, 0xD774, 0x4B0E, 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13,
+ 0xD778, 0xD778, 0x1ED3, 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B,
+ 0xD783, 0xD783, 0x1E49, 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B,
+ 0xD788, 0xD78A, 0x4B21, 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8,
+ 0xD78D, 0xD78D, 0x4B24, 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319,
+ 0xD790, 0xD794, 0x4B25, 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A,
+ 0xD797, 0xD797, 0x2317, 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE,
+ 0xD840, 0xD84C, 0x4B34, 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41,
+ 0xD853, 0xD853, 0x1EFD, 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71,
+ 0xD890, 0xD890, 0x1E3B, 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81,
+ 0xD893, 0xD893, 0x1F0C, 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24,
+ 0xD896, 0xD899, 0x4B82, 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65,
+ 0xD89C, 0xD89C, 0x1EF0, 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30,
+ 0xD89F, 0xD89F, 0x2261, 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257,
+ 0xD940, 0xD940, 0x4B87, 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB,
+ 0xD943, 0xD943, 0x4B88, 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8,
+ 0xD946, 0xD946, 0x1F39, 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48,
+ 0xD949, 0xD949, 0x2070, 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A,
+ 0xD94C, 0xD94C, 0x24AC, 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176,
+ 0xD94F, 0xD94F, 0x24AD, 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B,
+ 0xD952, 0xD952, 0x1F45, 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B,
+ 0xD955, 0xD955, 0x202F, 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0,
+ 0xD958, 0xD958, 0x4B8C, 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F,
+ 0xD95B, 0xD95B, 0x4B8D, 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E,
+ 0xD963, 0xD963, 0x24B2, 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51,
+ 0xD966, 0xD966, 0x4B94, 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95,
+ 0xD96C, 0xD96C, 0x24B3, 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F,
+ 0xD96F, 0xD96F, 0x4B9A, 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B,
+ 0xD972, 0xD972, 0x20B4, 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB,
+ 0xD975, 0xD975, 0x2072, 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C,
+ 0xD978, 0xD978, 0x1F0A, 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D,
+ 0xD97C, 0xD97C, 0x2291, 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278,
+ 0xD980, 0xD980, 0x1ED4, 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3,
+ 0xD988, 0xD98C, 0x4BA5, 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7,
+ 0xD98F, 0xD98F, 0x1F28, 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7,
+ 0xD992, 0xD996, 0x4BAA, 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1,
+ 0xD999, 0xD99A, 0x4BAF, 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1,
+ 0xD99D, 0xD99D, 0x225B, 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2,
+ 0xD9A0, 0xD9A0, 0x2115, 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3,
+ 0xDA41, 0xDA41, 0x222A, 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4,
+ 0xDA48, 0xDA48, 0x213D, 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15,
+ 0xDA4E, 0xDA4E, 0x225C, 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14,
+ 0xDA74, 0xDA76, 0x4BE1, 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4,
+ 0xDA80, 0xDA84, 0x4BEB, 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0,
+ 0xDA8E, 0xDA8E, 0x25F8, 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313,
+ 0xDB40, 0xDB5F, 0x4C0A, 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A,
+ 0xDB78, 0xDB78, 0x2230, 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47,
+ 0xDB84, 0xDB84, 0x25FD, 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600,
+ 0xDB8C, 0xDB97, 0x4C51, 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D,
+ 0xDBA1, 0xDBFE, 0x1371, 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF,
+ 0xDC46, 0xDC4E, 0x4C6A, 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C,
+ 0xDC51, 0xDC51, 0x2602, 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D,
+ 0xDC54, 0xDC54, 0x4C74, 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE,
+ 0xDC57, 0xDC57, 0x2603, 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601,
+ 0xDC5E, 0xDC61, 0x4C7A, 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E,
+ 0xDC66, 0xDC66, 0x1EA3, 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81,
+ 0xDC6B, 0xDC6B, 0x2607, 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0,
+ 0xDC7D, 0xDC7E, 0x4C94, 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B,
+ 0xDC88, 0xDC88, 0x2267, 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6,
+ 0xDC8B, 0xDC8D, 0x4C9D, 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0,
+ 0xDC90, 0xDC90, 0x248C, 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D,
+ 0xDC98, 0xDC9A, 0x4CA7, 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA,
+ 0xDCA0, 0xDCA0, 0x2494, 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE,
+ 0xDD46, 0xDD46, 0x2493, 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E,
+ 0xDD4E, 0xDD52, 0x4CBA, 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491,
+ 0xDD55, 0xDD55, 0x2496, 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492,
+ 0xDD58, 0xDD58, 0x4CBF, 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0,
+ 0xDD5E, 0xDD5E, 0x1FB1, 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A,
+ 0xDD61, 0xDD61, 0x4CC5, 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6,
+ 0xDD64, 0xDD64, 0x2258, 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7,
+ 0xDD6D, 0xDD6D, 0x249B, 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09,
+ 0xDD70, 0xDD70, 0x20E6, 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026,
+ 0xDD77, 0xDD77, 0x249F, 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D,
+ 0xDD7B, 0xDD7E, 0x4CD4, 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B,
+ 0xDD82, 0xDD82, 0x249C, 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A,
+ 0xDD86, 0xDD86, 0x205B, 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70,
+ 0xDD8C, 0xDD8E, 0x4CDF, 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2,
+ 0xDD94, 0xDD94, 0x213B, 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07,
+ 0xDD98, 0xDD99, 0x4CE8, 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237,
+ 0xDD9C, 0xDD9D, 0x4CEA, 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC,
+ 0xDDA0, 0xDDA0, 0x21B3, 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245,
+ 0xDE41, 0xDE41, 0x24A1, 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8,
+ 0xDE45, 0xDE47, 0x4CEF, 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0,
+ 0xDE4A, 0xDE4E, 0x4CF2, 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7,
+ 0xDE5A, 0xDE5A, 0x1F46, 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380,
+ 0xDE5D, 0xDE5D, 0x2495, 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490,
+ 0xDE60, 0xDE6A, 0x4D03, 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E,
+ 0xDE6F, 0xDE6F, 0x1E9D, 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A,
+ 0xDE72, 0xDE72, 0x20AA, 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D,
+ 0xDE92, 0xDE92, 0x267B, 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2,
+ 0xDEA0, 0xDEA0, 0x4D3B, 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E,
+ 0xDF41, 0xDF41, 0x4D3C, 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D,
+ 0xDF4D, 0xDF4D, 0x1FBB, 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253,
+ 0xDF5D, 0xDF5D, 0x4D55, 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6,
+ 0xDF60, 0xDF60, 0x218E, 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC,
+ 0xDF65, 0xDF65, 0x4D59, 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A,
+ 0xDF68, 0xDF68, 0x224A, 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133,
+ 0xDF6E, 0xDF73, 0x4D5F, 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65,
+ 0xDF77, 0xDF77, 0x20CF, 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67,
+ 0xDF7A, 0xDF7A, 0x220F, 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029,
+ 0xDF7D, 0xDF7D, 0x4D69, 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55,
+ 0xDF81, 0xDF82, 0x4D6A, 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C,
+ 0xDF85, 0xDF85, 0x1E46, 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063,
+ 0xDF8A, 0xDF8A, 0x23F3, 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9,
+ 0xE040, 0xE04F, 0x4D86, 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96,
+ 0xE05D, 0xE05D, 0x2233, 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320,
+ 0xE06A, 0xE06B, 0x4DAD, 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF,
+ 0xE075, 0xE075, 0x22BC, 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C,
+ 0xE078, 0xE078, 0x4DB8, 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9,
+ 0xE080, 0xE086, 0x4DBE, 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5,
+ 0xE08D, 0xE08D, 0x2287, 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D,
+ 0xE090, 0xE090, 0x1EAB, 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D,
+ 0xE093, 0xE093, 0x4DCC, 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD,
+ 0xE097, 0xE097, 0x231B, 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547,
+ 0xE140, 0xE141, 0x4DD8, 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA,
+ 0xE164, 0xE164, 0x2255, 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F,
+ 0xE169, 0xE173, 0x4DFE, 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4,
+ 0xE176, 0xE17E, 0x4E09, 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B,
+ 0xE185, 0xE185, 0x21D8, 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA,
+ 0xE188, 0xE188, 0x4E17, 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18,
+ 0xE18C, 0xE18C, 0x2134, 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3,
+ 0xE191, 0xE191, 0x24F8, 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7,
+ 0xE194, 0xE194, 0x1EC8, 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C,
+ 0xE198, 0xE198, 0x2280, 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5,
+ 0xE19F, 0xE19F, 0x24FB, 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5,
+ 0xE240, 0xE240, 0x4E24, 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25,
+ 0xE243, 0xE243, 0x1EED, 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD,
+ 0xE250, 0xE250, 0x4E31, 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32,
+ 0xE253, 0xE253, 0x24FE, 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33,
+ 0xE25A, 0xE25A, 0x2508, 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38,
+ 0xE25E, 0xE25E, 0x2506, 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF,
+ 0xE263, 0xE263, 0x2090, 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD,
+ 0xE268, 0xE268, 0x1F25, 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503,
+ 0xE26B, 0xE26B, 0x2502, 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A,
+ 0xE26F, 0xE26F, 0x20A6, 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5,
+ 0xE279, 0xE27C, 0x4E4B, 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F,
+ 0xE280, 0xE280, 0x2507, 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505,
+ 0xE283, 0xE288, 0x4E50, 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56,
+ 0xE28B, 0xE28B, 0x2515, 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C,
+ 0xE28F, 0xE28F, 0x2031, 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B,
+ 0xE293, 0xE293, 0x250F, 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509,
+ 0xE296, 0xE297, 0x4E5B, 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234,
+ 0xE29A, 0xE29A, 0x2513, 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D,
+ 0xE2A0, 0xE2A0, 0x2501, 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61,
+ 0xE342, 0xE342, 0x2517, 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63,
+ 0xE347, 0xE347, 0x2518, 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56,
+ 0xE34C, 0xE34E, 0x4E69, 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C,
+ 0xE351, 0xE351, 0x20D3, 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A,
+ 0xE355, 0xE355, 0x20CE, 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510,
+ 0xE359, 0xE35B, 0x4E71, 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74,
+ 0xE360, 0xE360, 0x250A, 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511,
+ 0xE368, 0xE370, 0x4E7C, 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85,
+ 0xE373, 0xE373, 0x251E, 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86,
+ 0xE378, 0xE378, 0x252D, 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89,
+ 0xE37C, 0xE37C, 0x2532, 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B,
+ 0xE380, 0xE389, 0x4E8C, 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96,
+ 0xE38C, 0xE38C, 0x252C, 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528,
+ 0xE390, 0xE390, 0x4E99, 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A,
+ 0xE393, 0xE393, 0x252F, 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC,
+ 0xE396, 0xE398, 0x4E9C, 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F,
+ 0xE39C, 0xE39C, 0x2535, 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D,
+ 0xE39F, 0xE39F, 0x2526, 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661,
+ 0xE440, 0xE440, 0x2534, 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F,
+ 0xE443, 0xE443, 0x2531, 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3,
+ 0xE448, 0xE448, 0x2525, 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD,
+ 0xE44F, 0xE44F, 0x4EAB, 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC,
+ 0xE452, 0xE452, 0x2172, 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD,
+ 0xE458, 0xE458, 0x204F, 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543,
+ 0xE45B, 0xE45B, 0x4EB2, 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3,
+ 0xE45E, 0xE45E, 0x1E3C, 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529,
+ 0xE463, 0xE464, 0x4EB7, 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9,
+ 0xE468, 0xE468, 0x1EFF, 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F,
+ 0xE474, 0xE474, 0x4EC5, 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6,
+ 0xE479, 0xE479, 0x2523, 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A,
+ 0xE47C, 0xE47C, 0x2545, 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D,
+ 0xE480, 0xE480, 0x4ECA, 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB,
+ 0xE484, 0xE484, 0x2103, 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C,
+ 0xE487, 0xE487, 0x253B, 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD,
+ 0xE48D, 0xE48D, 0x2540, 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD,
+ 0xE490, 0xE492, 0x4ED2, 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5,
+ 0xE498, 0xE498, 0x254B, 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547,
+ 0xE49E, 0xE49F, 0x254F, 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF,
+ 0xE540, 0xE545, 0x4EDE, 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4,
+ 0xE548, 0xE548, 0x2546, 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C,
+ 0xE54C, 0xE54D, 0x4EE7, 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552,
+ 0xE550, 0xE550, 0x2530, 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9,
+ 0xE555, 0xE555, 0x2551, 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC,
+ 0xE558, 0xE558, 0x20D2, 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8,
+ 0xE55D, 0xE55D, 0x4EF0, 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1,
+ 0xE561, 0xE561, 0x21AB, 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D,
+ 0xE565, 0xE565, 0x1EA5, 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C,
+ 0xE569, 0xE569, 0x2080, 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D,
+ 0xE56D, 0xE56D, 0x4EF9, 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA,
+ 0xE575, 0xE575, 0x254A, 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00,
+ 0xE578, 0xE578, 0x254E, 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC,
+ 0xE57C, 0xE57C, 0x2554, 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05,
+ 0xE581, 0xE581, 0x1F3C, 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5,
+ 0xE584, 0xE589, 0x4F07, 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D,
+ 0xE58E, 0xE58E, 0x2268, 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6,
+ 0xE592, 0xE599, 0x4F12, 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553,
+ 0xE59C, 0xE59E, 0x4F1A, 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D,
+ 0xE5A1, 0xE5FE, 0x171D, 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E,
+ 0xE644, 0xE644, 0x2559, 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97,
+ 0xE64A, 0xE64A, 0x2555, 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D,
+ 0xE64F, 0xE651, 0x4F28, 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B,
+ 0xE656, 0xE656, 0x207C, 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A,
+ 0xE659, 0xE65A, 0x4F2F, 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31,
+ 0xE65E, 0xE65E, 0x1E34, 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E,
+ 0xE66A, 0xE66A, 0x4F3D, 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E,
+ 0xE675, 0xE675, 0x21A2, 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47,
+ 0xE679, 0xE679, 0x2563, 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49,
+ 0xE67C, 0xE67C, 0x252E, 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A,
+ 0xE680, 0xE680, 0x1F1B, 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283,
+ 0xE683, 0xE683, 0x4F4C, 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D,
+ 0xE687, 0xE687, 0x20A0, 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565,
+ 0xE68A, 0xE68B, 0x4F50, 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52,
+ 0xE693, 0xE693, 0x2562, 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C,
+ 0xE698, 0xE69A, 0x4F5B, 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020,
+ 0xE69D, 0xE69E, 0x4F5E, 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A,
+ 0xE6A1, 0xE6FE, 0x177B, 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E,
+ 0xE744, 0xE747, 0x4F63, 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C,
+ 0xE74A, 0xE74C, 0x4F67, 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B,
+ 0xE750, 0xE750, 0x1E6F, 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4,
+ 0xE753, 0xE753, 0x2567, 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B,
+ 0xE756, 0xE758, 0x4F6C, 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F,
+ 0xE766, 0xE766, 0x252B, 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571,
+ 0xE769, 0xE769, 0x4F7C, 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D,
+ 0xE774, 0xE774, 0x2522, 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533,
+ 0xE77D, 0xE77E, 0x4F8D, 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A,
+ 0xE783, 0xE783, 0x4F91, 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573,
+ 0xE786, 0xE786, 0x256F, 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293,
+ 0xE78B, 0xE78B, 0x2578, 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570,
+ 0xE790, 0xE791, 0x4F98, 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A,
+ 0xE798, 0xE799, 0x2541, 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F,
+ 0xE7A0, 0xE7A0, 0x201A, 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4,
+ 0xE843, 0xE843, 0x257A, 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7,
+ 0xE846, 0xE846, 0x2177, 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B,
+ 0xE84A, 0xE84A, 0x4FAA, 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB,
+ 0xE84F, 0xE84F, 0x257B, 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3,
+ 0xE855, 0xE859, 0x4FB2, 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7,
+ 0xE85C, 0xE85C, 0x2566, 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93,
+ 0xE863, 0xE863, 0x4FBD, 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE,
+ 0xE870, 0xE870, 0x2514, 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D,
+ 0xE874, 0xE874, 0x4FCB, 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC,
+ 0xE87C, 0xE87C, 0x2574, 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E,
+ 0xE881, 0xE881, 0x4FD4, 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5,
+ 0xE887, 0xE887, 0x209F, 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576,
+ 0xE88A, 0xE88B, 0x4FDA, 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF,
+ 0xE88E, 0xE88E, 0x261C, 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC,
+ 0xE8A1, 0xE8FE, 0x1837, 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75,
+ 0xE94D, 0xE953, 0x4FF9, 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000,
+ 0xE956, 0xE956, 0x23BF, 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001,
+ 0xE95A, 0xE95A, 0x23C0, 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45,
+ 0xE95E, 0xE95E, 0x5005, 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4,
+ 0xE961, 0xE961, 0x5006, 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104,
+ 0xE964, 0xE964, 0x5007, 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008,
+ 0xE967, 0xE967, 0x1F87, 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009,
+ 0xE96C, 0xE96C, 0x2269, 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43,
+ 0xE976, 0xE976, 0x5014, 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679,
+ 0xE979, 0xE979, 0x1EEB, 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35,
+ 0xE97D, 0xE97D, 0x208A, 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7,
+ 0xE981, 0xE981, 0x23C9, 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018,
+ 0xE987, 0xE987, 0x224F, 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB,
+ 0xE98C, 0xE98D, 0x501F, 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021,
+ 0xE990, 0xE990, 0x21F7, 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE,
+ 0xE993, 0xE993, 0x23CA, 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022,
+ 0xE998, 0xE998, 0x23D0, 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C,
+ 0xE99C, 0xE99C, 0x5027, 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028,
+ 0xE99F, 0xE99F, 0x1FEE, 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895,
+ 0xEA40, 0xEA40, 0x1FF8, 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3,
+ 0xEA45, 0xEA47, 0x502C, 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4,
+ 0xEA4A, 0xEA4A, 0x1E98, 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C,
+ 0xEA51, 0xEA51, 0x5034, 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035,
+ 0xEA55, 0xEA55, 0x1E71, 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037,
+ 0xEA59, 0xEA59, 0x23C5, 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A,
+ 0xEA81, 0xEA83, 0x505E, 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061,
+ 0xEA87, 0xEA87, 0x2284, 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C,
+ 0xEA8F, 0xEA8F, 0x5069, 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D,
+ 0xEA92, 0xEA95, 0x506A, 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E,
+ 0xEAA0, 0xEAA0, 0x1ED9, 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077,
+ 0xEB41, 0xEB41, 0x1FB2, 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252,
+ 0xEB46, 0xEB47, 0x507B, 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D,
+ 0xEB53, 0xEB53, 0x2157, 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF,
+ 0xEB56, 0xEB5A, 0x5088, 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D,
+ 0xEB5D, 0xEB5D, 0x203D, 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015,
+ 0xEB61, 0xEB61, 0x5090, 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091,
+ 0xEB6D, 0xEB6D, 0x2156, 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144,
+ 0xEB71, 0xEB71, 0x509D, 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257,
+ 0xEB74, 0xEB77, 0x509E, 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092,
+ 0xEB7A, 0xEB7E, 0x50A2, 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250,
+ 0xEB86, 0xEB89, 0x50AC, 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0,
+ 0xEBA1, 0xEBFE, 0x1951, 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8,
+ 0xEC47, 0xEC55, 0x50CC, 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB,
+ 0xEC5A, 0xEC5A, 0x260C, 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E,
+ 0xEC5D, 0xEC5F, 0x50DF, 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2,
+ 0xEC6E, 0xEC6E, 0x260B, 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3,
+ 0xEC77, 0xEC7E, 0x50F6, 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23,
+ 0xEC97, 0xECA0, 0x5114, 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E,
+ 0xED46, 0xED46, 0x2695, 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E,
+ 0xED59, 0xED5D, 0x5135, 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A,
+ 0xED61, 0xED61, 0x2692, 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F,
+ 0xED65, 0xED65, 0x513E, 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD,
+ 0xED68, 0xED6D, 0x513F, 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145,
+ 0xED74, 0xED74, 0x2465, 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467,
+ 0xED78, 0xED78, 0x514C, 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D,
+ 0xED80, 0xED90, 0x5152, 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163,
+ 0xED93, 0xED93, 0x2209, 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9,
+ 0xED96, 0xED96, 0x5164, 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146,
+ 0xED99, 0xED99, 0x25C5, 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165,
+ 0xED9C, 0xED9C, 0x245E, 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F,
+ 0xED9F, 0xED9F, 0x5167, 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D,
+ 0xEE40, 0xEE40, 0x25C7, 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A,
+ 0xEE43, 0xEE43, 0x1E2F, 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168,
+ 0xEE48, 0xEE48, 0x20BF, 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B,
+ 0xEE4D, 0xEE4D, 0x25C9, 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8,
+ 0xEE53, 0xEE54, 0x5172, 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174,
+ 0xEE57, 0xEE57, 0x25CB, 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D,
+ 0xEE5F, 0xEE60, 0x517B, 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D,
+ 0xEE68, 0xEE68, 0x25CC, 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183,
+ 0xEE6C, 0xEE6C, 0x20B9, 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181,
+ 0xEE6F, 0xEE76, 0x5186, 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E,
+ 0xEE7D, 0xEE7D, 0x2173, 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD,
+ 0xEE81, 0xEE84, 0x5193, 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6,
+ 0xEE87, 0xEE89, 0x5197, 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1,
+ 0xEE8C, 0xEE8C, 0x519A, 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B,
+ 0xEE90, 0xEE90, 0x2008, 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0,
+ 0xEE95, 0xEE96, 0x51A0, 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2,
+ 0xEE99, 0xEE99, 0x1F2A, 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72,
+ 0xEE9E, 0xEE9E, 0x25D3, 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B,
+ 0xEF40, 0xEF40, 0x21BE, 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044,
+ 0xEF43, 0xEF43, 0x51A8, 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3,
+ 0xEF46, 0xEF4B, 0x51A9, 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF,
+ 0xEF52, 0xEF53, 0x24CC, 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698,
+ 0xEF56, 0xEF56, 0x51B5, 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6,
+ 0xEF5A, 0xEF5A, 0x24CE, 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF,
+ 0xEF61, 0xEF67, 0x51BD, 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4,
+ 0xEF6A, 0xEF6A, 0x24D0, 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1,
+ 0xEF6D, 0xEF76, 0x51C6, 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0,
+ 0xEF7A, 0xEF7A, 0x239B, 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E,
+ 0xEF7D, 0xEF7E, 0x51D3, 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D,
+ 0xEF83, 0xEF84, 0x239F, 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1,
+ 0xEF87, 0xEF87, 0x51D8, 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9,
+ 0xEF8B, 0xEF8B, 0x221E, 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2,
+ 0xEF8E, 0xEF94, 0x51DC, 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36,
+ 0xEF97, 0xEF97, 0x2135, 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD,
+ 0xEF9D, 0xEF9D, 0x51E7, 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8,
+ 0xEFA1, 0xEFFE, 0x1AC9, 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3,
+ 0xF042, 0xF042, 0x2203, 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7,
+ 0xF045, 0xF046, 0x51EC, 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097,
+ 0xF049, 0xF049, 0x1EE4, 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238,
+ 0xF04F, 0xF050, 0x51F2, 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4,
+ 0xF054, 0xF054, 0x1F9A, 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3,
+ 0xF058, 0xF05D, 0x51F8, 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE,
+ 0xF068, 0xF068, 0x239C, 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6,
+ 0xF06D, 0xF070, 0x520A, 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E,
+ 0xF073, 0xF073, 0x2035, 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F,
+ 0xF078, 0xF078, 0x23A8, 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075,
+ 0xF07B, 0xF07C, 0x5213, 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB,
+ 0xF081, 0xF081, 0x1FEB, 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215,
+ 0xF087, 0xF087, 0x1F6A, 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219,
+ 0xF08B, 0xF08B, 0x2666, 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667,
+ 0xF091, 0xF091, 0x521F, 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220,
+ 0xF096, 0xF096, 0x23AD, 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27,
+ 0xF140, 0xF151, 0x522D, 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242,
+ 0xF154, 0xF154, 0x1F02, 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183,
+ 0xF158, 0xF158, 0x5241, 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9,
+ 0xF15B, 0xF166, 0x5242, 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E,
+ 0xF176, 0xF176, 0x22A5, 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA,
+ 0xF179, 0xF179, 0x525C, 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82,
+ 0xF17C, 0xF17D, 0x525D, 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404,
+ 0xF181, 0xF181, 0x525F, 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260,
+ 0xF184, 0xF184, 0x2184, 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403,
+ 0xF187, 0xF187, 0x5262, 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B,
+ 0xF18A, 0xF193, 0x5263, 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D,
+ 0xF198, 0xF198, 0x2067, 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85,
+ 0xF240, 0xF244, 0x5278, 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D,
+ 0xF247, 0xF247, 0x1E83, 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F,
+ 0xF24C, 0xF252, 0x5281, 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7,
+ 0xF255, 0xF255, 0x240D, 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412,
+ 0xF25D, 0xF25E, 0x528E, 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290,
+ 0xF271, 0xF271, 0x23F0, 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411,
+ 0xF274, 0xF274, 0x2414, 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170,
+ 0xF277, 0xF27B, 0x52A3, 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C,
+ 0xF27E, 0xF27E, 0x2415, 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066,
+ 0xF286, 0xF286, 0x52AD, 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413,
+ 0xF289, 0xF289, 0x2410, 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1,
+ 0xF28D, 0xF290, 0x52AE, 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2,
+ 0xF294, 0xF294, 0x2409, 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418,
+ 0xF297, 0xF29B, 0x52B5, 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA,
+ 0xF29E, 0xF29E, 0x21FC, 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3,
+ 0xF340, 0xF340, 0x1FC1, 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD,
+ 0xF345, 0xF345, 0x229C, 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E,
+ 0xF349, 0xF349, 0x52C2, 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419,
+ 0xF34C, 0xF34F, 0x52C3, 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7,
+ 0xF361, 0xF361, 0x1E29, 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661,
+ 0xF375, 0xF375, 0x52E9, 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174,
+ 0xF378, 0xF378, 0x2663, 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA,
+ 0xF380, 0xF38B, 0x52EF, 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB,
+ 0xF3A0, 0xF3A0, 0x214C, 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E,
+ 0xF445, 0xF445, 0x267A, 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0,
+ 0xF451, 0xF456, 0x531D, 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323,
+ 0xF459, 0xF459, 0x1ED0, 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096,
+ 0xF45C, 0xF45C, 0x5325, 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326,
+ 0xF462, 0xF462, 0x23C8, 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E,
+ 0xF465, 0xF474, 0x532B, 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B,
+ 0xF47C, 0xF47C, 0x2664, 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239,
+ 0xF480, 0xF493, 0x5342, 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356,
+ 0xF499, 0xF499, 0x261F, 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E,
+ 0xF49D, 0xF4A0, 0x535C, 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360,
+ 0xF545, 0xF545, 0x2620, 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621,
+ 0xF548, 0xF551, 0x5366, 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370,
+ 0xF554, 0xF554, 0x2627, 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625,
+ 0xF557, 0xF55D, 0x5371, 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378,
+ 0xF561, 0xF561, 0x262E, 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A,
+ 0xF56E, 0xF56E, 0x262A, 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385,
+ 0xF571, 0xF571, 0x2628, 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386,
+ 0xF580, 0xF584, 0x5392, 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630,
+ 0xF587, 0xF58B, 0x5397, 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C,
+ 0xF58E, 0xF58E, 0x200D, 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D,
+ 0xF599, 0xF599, 0x2645, 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A,
+ 0xF59C, 0xF59F, 0x53A7, 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD,
+ 0xF640, 0xF640, 0x53AB, 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC,
+ 0xF645, 0xF645, 0x263D, 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF,
+ 0xF648, 0xF648, 0x263E, 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F,
+ 0xF64C, 0xF64C, 0x1FC0, 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B,
+ 0xF650, 0xF653, 0x53B3, 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7,
+ 0xF658, 0xF658, 0x2644, 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639,
+ 0xF662, 0xF662, 0x53C2, 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3,
+ 0xF66C, 0xF66C, 0x2647, 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB,
+ 0xF671, 0xF671, 0x2649, 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648,
+ 0xF675, 0xF675, 0x53D0, 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108,
+ 0xF678, 0xF67E, 0x53D1, 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D,
+ 0xF686, 0xF687, 0x53DD, 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF,
+ 0xF68A, 0xF68A, 0x2651, 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650,
+ 0xF68E, 0xF68E, 0x2652, 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F,
+ 0xF693, 0xF695, 0x53E5, 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E,
+ 0xF698, 0xF698, 0x2653, 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657,
+ 0xF69B, 0xF69B, 0x53E9, 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA,
+ 0xF69E, 0xF69E, 0x2633, 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656,
+ 0xF6A1, 0xF6FE, 0x1D5B, 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654,
+ 0xF743, 0xF748, 0x53EE, 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4,
+ 0xF74C, 0xF74C, 0x2655, 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6,
+ 0xF756, 0xF756, 0x265B, 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A,
+ 0xF759, 0xF759, 0x53FF, 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E,
+ 0xF75C, 0xF75C, 0x262F, 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646,
+ 0xF762, 0xF762, 0x5404, 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405,
+ 0xF76B, 0xF76B, 0x265C, 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C,
+ 0xF772, 0xF77B, 0x5411, 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B,
+ 0xF77E, 0xF77E, 0x2631, 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9,
+ 0xF840, 0xF841, 0x543D, 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F,
+ 0xF846, 0xF846, 0x2580, 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC,
+ 0xF84A, 0xF84F, 0x5444, 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B,
+ 0xF852, 0xF852, 0x544A, 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B,
+ 0xF863, 0xF863, 0x2583, 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A,
+ 0xF866, 0xF866, 0x21EE, 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182,
+ 0xF873, 0xF877, 0x5466, 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B,
+ 0xF87A, 0xF87A, 0x2587, 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588,
+ 0xF87D, 0xF87E, 0x546D, 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584,
+ 0xF882, 0xF883, 0x5470, 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472,
+ 0xF886, 0xF886, 0x21EF, 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A,
+ 0xF88E, 0xF88E, 0x258C, 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47,
+ 0xF89A, 0xF89C, 0x5483, 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486,
+ 0xF8A0, 0xF8A0, 0x258D, 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0,
+ 0xF94F, 0xF94F, 0x2592, 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496,
+ 0xF959, 0xF959, 0x2594, 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E,
+ 0xF95D, 0xF95D, 0x2591, 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0,
+ 0xF967, 0xF967, 0x2597, 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6,
+ 0xF96A, 0xF96B, 0x54A9, 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB,
+ 0xF96F, 0xF96F, 0x20F6, 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC,
+ 0xF985, 0xF985, 0x2585, 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599,
+ 0xF988, 0xF990, 0x54C2, 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB,
+ 0xF996, 0xF996, 0x259A, 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B,
+ 0xF999, 0xF9A0, 0x54D0, 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D,
+ 0xFA43, 0xFA45, 0x54DA, 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD,
+ 0xFA4C, 0xFA4C, 0x234C, 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44,
+ 0xFA52, 0xFA57, 0x54E6, 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0,
+ 0xFA5A, 0xFA5C, 0x54EC, 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF,
+ 0xFA5F, 0xFA5F, 0x259F, 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C,
+ 0xFA62, 0xFA6F, 0x54F1, 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF,
+ 0xFA74, 0xFA74, 0x20AE, 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B,
+ 0xFA77, 0xFA77, 0x25A3, 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A,
+ 0xFA83, 0xFA83, 0x2589, 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D,
+ 0xFA8D, 0xFA8D, 0x25A4, 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6,
+ 0xFA91, 0xFA91, 0x2593, 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7,
+ 0xFA97, 0xFA97, 0x2222, 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B,
+ 0xFB40, 0xFB48, 0x5523, 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C,
+ 0xFB52, 0xFB52, 0x2586, 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1,
+ 0xFB58, 0xFB58, 0x25AA, 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590,
+ 0xFB5B, 0xFB5B, 0x258E, 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688,
+ 0xFB76, 0xFB78, 0x5552, 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB,
+ 0xFB7B, 0xFB7B, 0x5555, 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4,
+ 0xFB7E, 0xFB7E, 0x5556, 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F,
+ 0xFB91, 0xFB9B, 0x5567, 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572,
+ 0xFB9F, 0xFB9F, 0x25F7, 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575,
+ 0xFC44, 0xFC44, 0x2696, 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F,
+ 0xFC4A, 0xFC59, 0x557D, 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D,
+ 0xFC63, 0xFC63, 0x1EC1, 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3,
+ 0xFC69, 0xFC6E, 0x5599, 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F,
+ 0xFC71, 0xFC71, 0x268A, 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669,
+ 0xFC75, 0xFC76, 0x55A2, 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4,
+ 0xFC80, 0xFC82, 0x55AA, 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD,
+ 0xFC8A, 0xFC8A, 0x2673, 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9,
+ 0xFD52, 0xFD52, 0x20C6, 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB,
+ 0xFD57, 0xFD57, 0x24D3, 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE,
+ 0xFD5A, 0xFD5A, 0x260F, 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611,
+ 0xFD60, 0xFD61, 0x55E3, 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5,
+ 0xFD65, 0xFD65, 0x2610, 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030,
+ 0xFD68, 0xFD68, 0x55E7, 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8,
+ 0xFD6C, 0xFD6C, 0x2614, 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616,
+ 0xFD71, 0xFD71, 0x55ED, 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE,
+ 0xFD78, 0xFD78, 0x20F2, 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617,
+ 0xFD7E, 0xFD7E, 0x55F7, 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037,
+ 0xFD89, 0xFD8A, 0x5600, 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602,
+ 0xFD8F, 0xFD8F, 0x1F22, 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605,
+ 0xFD94, 0xFD94, 0x1F34, 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02,
+ 0xFD9E, 0xFD9E, 0x40D3, 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083,
+ 0xFE40, 0xFE40, 0x1259, 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
+extern const unsigned short g_FXCMAP_GBK2K_H_5_DWord[1017 * 4] = {
+ 0x8130, 0x8436, 0x8436, 0x5752, 0x8138, 0xFD38, 0xFD39, 0x579C, 0x8138, 0xFE30, 0xFE39, 0x579E,
+ 0x8139, 0x8130, 0x8137, 0x57A8, 0x8139, 0x8139, 0x8139, 0x57B0, 0x8139, 0x8230, 0x8239, 0x57B1,
+ 0x8139, 0x8330, 0x8339, 0x57BB, 0x8139, 0x8430, 0x8439, 0x57C5, 0x8139, 0x8530, 0x8539, 0x57CF,
+ 0x8139, 0x8630, 0x8639, 0x57D9, 0x8139, 0x8730, 0x8739, 0x57E3, 0x8139, 0x8830, 0x8839, 0x57ED,
+ 0x8139, 0x8930, 0x8939, 0x57F7, 0x8139, 0x8B32, 0x8B32, 0x1042, 0x8139, 0x8B33, 0x8B33, 0x1263,
+ 0x8139, 0x8B34, 0x8B34, 0x1272, 0x8139, 0x8B35, 0x8B35, 0x1265, 0x8139, 0x8B36, 0x8B36, 0x1059,
+ 0x8139, 0x8B37, 0x8B37, 0x2793, 0x8139, 0x8B38, 0x8B38, 0x063D, 0x8139, 0x8B39, 0x8B39, 0x1303,
+ 0x8139, 0x8C30, 0x8C30, 0x0CA6, 0x8139, 0x8C31, 0x8C31, 0x0638, 0x8139, 0x8C32, 0x8C32, 0x0CC6,
+ 0x8139, 0x8C33, 0x8C33, 0x03D6, 0x8139, 0x8C34, 0x8C34, 0x129D, 0x8139, 0x8C35, 0x8C35, 0x1314,
+ 0x8139, 0x8C36, 0x8C36, 0x130F, 0x8139, 0x8C37, 0x8C37, 0x082B, 0x8139, 0x8C38, 0x8C38, 0x1399,
+ 0x8139, 0x8C39, 0x8C39, 0x0597, 0x8139, 0x8D30, 0x8D30, 0x09EF, 0x8139, 0x8D31, 0x8D31, 0x12FC,
+ 0x8139, 0x8D32, 0x8D32, 0x1266, 0x8139, 0x8D33, 0x8D33, 0x1284, 0x8139, 0x8D34, 0x8D34, 0x2A1A,
+ 0x8139, 0x8D35, 0x8D35, 0x0D45, 0x8139, 0x8D36, 0x8D36, 0x047E, 0x8139, 0x8D37, 0x8D37, 0x1352,
+ 0x8139, 0x8D38, 0x8D38, 0x04CC, 0x8139, 0x8D39, 0x8D39, 0x139C, 0x8139, 0x8E30, 0x8E30, 0x10BB,
+ 0x8139, 0x8E31, 0x8E31, 0x0967, 0x8139, 0x8E32, 0x8E32, 0x1593, 0x8139, 0x8E33, 0x8E33, 0x0E72,
+ 0x8139, 0x8E34, 0x8E34, 0x0D56, 0x8139, 0x8E35, 0x8E35, 0x161C, 0x8139, 0x8E36, 0x8E36, 0x2D2D,
+ 0x8139, 0x8E37, 0x8E37, 0x0F13, 0x8139, 0x8E38, 0x8E38, 0x0576, 0x8139, 0x8E39, 0x8E39, 0x0B6F,
+ 0x8139, 0x8F30, 0x8F30, 0x1230, 0x8139, 0x8F31, 0x8F31, 0x172E, 0x8139, 0x8F32, 0x8F32, 0x056A,
+ 0x8139, 0x8F33, 0x8F33, 0x0F6C, 0x8139, 0x8F34, 0x8F34, 0x14B6, 0x8139, 0x8F35, 0x8F35, 0x0D43,
+ 0x8139, 0x8F36, 0x8F36, 0x1774, 0x8139, 0x8F37, 0x8F37, 0x0CF6, 0x8139, 0x8F38, 0x8F38, 0x1815,
+ 0x8139, 0x8F39, 0x8F39, 0x06FD, 0x8139, 0x9030, 0x9030, 0x082D, 0x8139, 0x9031, 0x9031, 0x08BE,
+ 0x8139, 0x9032, 0x9032, 0x06C4, 0x8139, 0x9033, 0x9033, 0x1813, 0x8139, 0x9034, 0x9034, 0x073C,
+ 0x8139, 0x9035, 0x9035, 0x1398, 0x8139, 0x9036, 0x9036, 0x14AD, 0x8139, 0x9037, 0x9037, 0x14F6,
+ 0x8139, 0x9038, 0x9038, 0x0706, 0x8139, 0x9039, 0x9039, 0x1762, 0x8139, 0x9130, 0x9130, 0x15EE,
+ 0x8139, 0x9131, 0x9131, 0x15E0, 0x8139, 0x9132, 0x9132, 0x0F8F, 0x8139, 0x9133, 0x9133, 0x06E5,
+ 0x8139, 0x9134, 0x9134, 0x3292, 0x8139, 0x9135, 0x9135, 0x0D6D, 0x8139, 0x9136, 0x9136, 0x11A6,
+ 0x8139, 0x9137, 0x9137, 0x1909, 0x8139, 0x9138, 0x9138, 0x0ED3, 0x8139, 0x9139, 0x9139, 0x05F6,
+ 0x8139, 0x9230, 0x9230, 0x08C0, 0x8139, 0x9231, 0x9231, 0x065A, 0x8139, 0x9232, 0x9232, 0x0EED,
+ 0x8139, 0x9233, 0x9233, 0x0CB0, 0x8139, 0x9234, 0x9234, 0x10FE, 0x8139, 0x9235, 0x9235, 0x1105,
+ 0x8139, 0x9236, 0x9236, 0x0B21, 0x8139, 0x9237, 0x9237, 0x0C34, 0x8139, 0x9238, 0x9238, 0x11B8,
+ 0x8139, 0x9239, 0x9239, 0x0578, 0x8139, 0x9330, 0x9330, 0x19BD, 0x8139, 0x9331, 0x9331, 0x0EF2,
+ 0x8139, 0x9332, 0x9332, 0x0431, 0x8139, 0x9333, 0x9333, 0x0AB0, 0x8139, 0x9334, 0x9334, 0x0D66,
+ 0x8139, 0x9335, 0x9335, 0x0C17, 0x8139, 0x9336, 0x9336, 0x0DA3, 0x8139, 0x9337, 0x9337, 0x0805,
+ 0x8139, 0x9338, 0x9338, 0x1203, 0x8139, 0x9339, 0x9339, 0x06B3, 0x8139, 0x9430, 0x9430, 0x1269,
+ 0x8139, 0x9431, 0x9431, 0x169D, 0x8139, 0x9432, 0x9432, 0x0BCB, 0x8139, 0x9433, 0x9433, 0x0FE9,
+ 0x8139, 0x9434, 0x9434, 0x0B64, 0x8139, 0x9435, 0x9435, 0x0C89, 0x8139, 0x9436, 0x9436, 0x0FC9,
+ 0x8139, 0x9437, 0x9437, 0x10D6, 0x8139, 0x9438, 0x9438, 0x0728, 0x8139, 0x9439, 0x9439, 0x0E90,
+ 0x8139, 0x9530, 0x9530, 0x06C5, 0x8139, 0x9531, 0x9531, 0x0D33, 0x8139, 0x9532, 0x9532, 0x10A8,
+ 0x8139, 0x9533, 0x9533, 0x0E42, 0x8139, 0x9534, 0x9534, 0x1BC6, 0x8139, 0x9535, 0x9535, 0x1B60,
+ 0x8139, 0x9536, 0x9536, 0x3EBF, 0x8139, 0x9537, 0x9537, 0x03E2, 0x8139, 0x9538, 0x9538, 0x0BC3,
+ 0x8139, 0x9539, 0x9539, 0x0AF8, 0x8139, 0x9630, 0x9630, 0x0B22, 0x8139, 0x9631, 0x9631, 0x0AB1,
+ 0x8139, 0x9632, 0x9632, 0x0D4F, 0x8139, 0x9633, 0x9633, 0x0D46, 0x8139, 0x9634, 0x9634, 0x0D55,
+ 0x8139, 0x9635, 0x9635, 0x40CB, 0x8139, 0x9636, 0x9636, 0x0783, 0x8139, 0x9637, 0x9637, 0x0FD1,
+ 0x8139, 0x9638, 0x9638, 0x09EB, 0x8139, 0x9639, 0x9639, 0x11F0, 0x8139, 0x9730, 0x9730, 0x0ADC,
+ 0x8139, 0x9731, 0x9731, 0x1CE7, 0x8139, 0x9732, 0x9732, 0x1C5E, 0x8139, 0x9733, 0x9733, 0x0EA9,
+ 0x8139, 0x9734, 0x9734, 0x101B, 0x8139, 0x9735, 0x9735, 0x10D5, 0x8139, 0x9736, 0x9736, 0x09BA,
+ 0x8139, 0x9737, 0x9737, 0x0637, 0x8139, 0x9738, 0x9738, 0x1BCB, 0x8139, 0x9739, 0x9739, 0x0639,
+ 0x8139, 0x9830, 0x9830, 0x1A1E, 0x8139, 0x9831, 0x9831, 0x0CBD, 0x8139, 0x9832, 0x9832, 0x04E1,
+ 0x8139, 0x9833, 0x9833, 0x1231, 0x8139, 0x9834, 0x9834, 0x11C0, 0x8139, 0x9835, 0x9835, 0x08F9,
+ 0x8139, 0x9836, 0x9836, 0x0D19, 0x8139, 0x9837, 0x9837, 0x1618, 0x8139, 0x9838, 0x9838, 0x11DA,
+ 0x8139, 0x9839, 0x9839, 0x1CDC, 0x8139, 0x9930, 0x9930, 0x0CE4, 0x8139, 0x9931, 0x9931, 0x45A2,
+ 0x8139, 0x9932, 0x9932, 0x1BF0, 0x8139, 0x9933, 0x9933, 0x050B, 0x8139, 0x9934, 0x9934, 0x0FD3,
+ 0x8139, 0x9935, 0x9935, 0x0F9B, 0x8139, 0x9936, 0x9936, 0x1049, 0x8139, 0x9937, 0x9937, 0x49DC,
+ 0x8139, 0x9938, 0x9938, 0x1F96, 0x8139, 0x9939, 0x9939, 0x0898, 0x8139, 0x9A30, 0x9A30, 0x0FFD,
+ 0x8139, 0x9A31, 0x9A31, 0x0721, 0x8139, 0x9A32, 0x9A32, 0x05F8, 0x8139, 0x9A33, 0x9A33, 0x1D15,
+ 0x8139, 0x9A34, 0x9A34, 0x1D50, 0x8139, 0x9A35, 0x9A35, 0x1E3B, 0x8139, 0x9A36, 0x9A36, 0x0505,
+ 0x8139, 0x9A37, 0x9A37, 0x123C, 0x8139, 0x9A38, 0x9A38, 0x1240, 0x8139, 0x9A39, 0x9A39, 0x0D26,
+ 0x8139, 0x9B30, 0x9B30, 0x1E7B, 0x8139, 0x9B31, 0x9B31, 0x0F8C, 0x8139, 0x9B32, 0x9B32, 0x04E2,
+ 0x8139, 0x9B33, 0x9B33, 0x4D13, 0x8139, 0x9B34, 0x9B34, 0x105F, 0x8139, 0x9B35, 0x9B35, 0x10B4,
+ 0x8139, 0x9B36, 0x9B36, 0x4E18, 0x8139, 0x9B37, 0x9B37, 0x09DA, 0x8139, 0x9B38, 0x9B38, 0x08C1,
+ 0x8139, 0x9B39, 0x9B39, 0x1E75, 0x8139, 0x9C30, 0x9C30, 0x207D, 0x8139, 0x9C31, 0x9C31, 0x06B2,
+ 0x8139, 0x9C32, 0x9C32, 0x09EE, 0x8139, 0x9C33, 0x9C33, 0x1D79, 0x8139, 0x9C34, 0x9C34, 0x10CF,
+ 0x8139, 0x9C35, 0x9C35, 0x50EA, 0x8139, 0x9C36, 0x9C36, 0x0664, 0x8139, 0x9C37, 0x9C37, 0x0AEB,
+ 0x8139, 0x9C38, 0x9C38, 0x06EA, 0x8139, 0x9C39, 0x9C39, 0x218D, 0x8139, 0x9D30, 0x9D30, 0x08F1,
+ 0x8139, 0x9D31, 0x9D31, 0x107B, 0x8139, 0x9D32, 0x9D32, 0x2209, 0x8139, 0x9D33, 0x9D33, 0x1F00,
+ 0x8139, 0x9D34, 0x9D34, 0x1EF4, 0x8139, 0x9D35, 0x9D35, 0x0D4A, 0x8139, 0x9D36, 0x9D36, 0x0D6E,
+ 0x8139, 0x9D37, 0x9D37, 0x0F50, 0x8139, 0x9D38, 0x9D38, 0x206D, 0x8139, 0x9D39, 0x9D39, 0x0720,
+ 0x8139, 0x9E30, 0x9E30, 0x06DA, 0x8139, 0x9E31, 0x9E31, 0x1DEC, 0x8139, 0x9E32, 0x9E32, 0x1ED0,
+ 0x8139, 0x9E33, 0x9E33, 0x139B, 0x8139, 0x9E34, 0x9E34, 0x1260, 0x8139, 0x9E35, 0x9E35, 0x0746,
+ 0x8139, 0x9E36, 0x9E36, 0x2239, 0x8139, 0x9E37, 0x9E37, 0x209C, 0x8139, 0x9E38, 0x9E38, 0x2688,
+ 0x8139, 0x9E39, 0x9E39, 0x0A60, 0x8139, 0x9F30, 0x9F30, 0x2071, 0x8139, 0x9F31, 0x9F31, 0x0A90,
+ 0x8139, 0x9F32, 0x9F32, 0x5586, 0x8139, 0x9F33, 0x9F33, 0x0D89, 0x8139, 0x9F34, 0x9F34, 0x0791,
+ 0x8139, 0x9F35, 0x9F35, 0x1A55, 0x8139, 0x9F36, 0x9F36, 0x2618, 0x8139, 0x9F37, 0x9F37, 0x05E5,
+ 0x8139, 0x9F38, 0x9F38, 0x071D, 0x8139, 0x9F39, 0x9F39, 0x0D8A, 0x8139, 0xA030, 0xA030, 0x0430,
+ 0x8139, 0xA031, 0xA031, 0x20C6, 0x8139, 0xA032, 0xA032, 0x1E86, 0x8139, 0xA033, 0xA033, 0x2037,
+ 0x8139, 0xA034, 0xA034, 0x1F34, 0x8139, 0xA035, 0xA035, 0x12F3, 0x8139, 0xA533, 0xA535, 0x577B,
+ 0x8139, 0xA538, 0xA539, 0x577E, 0x8139, 0xA630, 0xA630, 0x5780, 0x8139, 0xA634, 0xA634, 0x5755,
+ 0x8139, 0xA636, 0xA636, 0x5767, 0x8139, 0xA735, 0xA735, 0x5776, 0x8139, 0xA736, 0xA736, 0x5778,
+ 0x8139, 0xA737, 0xA737, 0x5777, 0x8139, 0xA738, 0xA738, 0x5779, 0x8139, 0xA836, 0xA838, 0x5781,
+ 0x8139, 0xB434, 0xB439, 0x5784, 0x8139, 0xB530, 0xB539, 0x578A, 0x8139, 0xB630, 0xB637, 0x5794,
+ 0x8139, 0xEE39, 0xEE39, 0x5801, 0x8139, 0xEF30, 0xEF39, 0x5802, 0x8139, 0xF030, 0xF039, 0x580C,
+ 0x8139, 0xF130, 0xF139, 0x5816, 0x8139, 0xF230, 0xF239, 0x5820, 0x8139, 0xF330, 0xF339, 0x582A,
+ 0x8139, 0xF430, 0xF439, 0x5834, 0x8139, 0xF530, 0xF539, 0x583E, 0x8139, 0xF630, 0xF639, 0x5848,
+ 0x8139, 0xF730, 0xF739, 0x5852, 0x8139, 0xF830, 0xF839, 0x585C, 0x8139, 0xF930, 0xF939, 0x5866,
+ 0x8139, 0xFA30, 0xFA39, 0x5870, 0x8139, 0xFB30, 0xFB39, 0x587A, 0x8139, 0xFC30, 0xFC39, 0x5884,
+ 0x8139, 0xFD30, 0xFD39, 0x588E, 0x8139, 0xFE30, 0xFE39, 0x5898, 0x8230, 0x8130, 0x8139, 0x58A2,
+ 0x8230, 0x8230, 0x8239, 0x58AC, 0x8230, 0x8330, 0x8339, 0x58B6, 0x8230, 0x8430, 0x8439, 0x58C0,
+ 0x8230, 0x8530, 0x8539, 0x58CA, 0x8230, 0x8630, 0x8639, 0x58D4, 0x8230, 0x8730, 0x8739, 0x58DE,
+ 0x8230, 0x8830, 0x8839, 0x58E8, 0x8230, 0x8930, 0x8939, 0x58F2, 0x8230, 0x8A30, 0x8A39, 0x58FC,
+ 0x8230, 0x8B30, 0x8B39, 0x5906, 0x8230, 0x8C30, 0x8C39, 0x5910, 0x8230, 0x8D30, 0x8D39, 0x591A,
+ 0x8230, 0x8E30, 0x8E39, 0x5924, 0x8230, 0x8F30, 0x8F39, 0x592E, 0x8230, 0x9030, 0x9039, 0x5938,
+ 0x8230, 0x9130, 0x9139, 0x5942, 0x8230, 0x9230, 0x9239, 0x594C, 0x8230, 0x9330, 0x9339, 0x5956,
+ 0x8230, 0x9430, 0x9439, 0x5960, 0x8230, 0x9530, 0x9539, 0x596A, 0x8230, 0x9630, 0x9639, 0x5974,
+ 0x8230, 0x9730, 0x9739, 0x597E, 0x8230, 0x9830, 0x9839, 0x5988, 0x8230, 0x9930, 0x9939, 0x5992,
+ 0x8230, 0x9A30, 0x9A39, 0x599C, 0x8230, 0x9B30, 0x9B39, 0x59A6, 0x8230, 0x9C30, 0x9C39, 0x59B0,
+ 0x8230, 0x9D30, 0x9D39, 0x59BA, 0x8230, 0x9E30, 0x9E39, 0x59C4, 0x8230, 0x9F30, 0x9F39, 0x59CE,
+ 0x8230, 0xA030, 0xA039, 0x59D8, 0x8230, 0xA130, 0xA139, 0x59E2, 0x8230, 0xA230, 0xA239, 0x59EC,
+ 0x8230, 0xA330, 0xA339, 0x59F6, 0x8230, 0xA430, 0xA439, 0x5A00, 0x8230, 0xA530, 0xA539, 0x5A0A,
+ 0x8230, 0xA630, 0xA639, 0x5A14, 0x8230, 0xA730, 0xA739, 0x5A1E, 0x8230, 0xA830, 0xA839, 0x5A28,
+ 0x8230, 0xA930, 0xA939, 0x5A32, 0x8230, 0xAA30, 0xAA39, 0x5A3C, 0x8230, 0xAB30, 0xAB39, 0x5A46,
+ 0x8230, 0xAC30, 0xAC39, 0x5A50, 0x8230, 0xAD30, 0xAD39, 0x5A5A, 0x8230, 0xAE30, 0xAE39, 0x5A64,
+ 0x8230, 0xAF30, 0xAF39, 0x5A6E, 0x8230, 0xB030, 0xB039, 0x5A78, 0x8230, 0xB130, 0xB139, 0x5A82,
+ 0x8230, 0xB230, 0xB239, 0x5A8C, 0x8230, 0xB330, 0xB339, 0x5A96, 0x8230, 0xB430, 0xB439, 0x5AA0,
+ 0x8230, 0xB530, 0xB539, 0x5AAA, 0x8230, 0xB630, 0xB639, 0x5AB4, 0x8230, 0xB730, 0xB739, 0x5ABE,
+ 0x8230, 0xB830, 0xB839, 0x5AC8, 0x8230, 0xB930, 0xB939, 0x5AD2, 0x8230, 0xBA30, 0xBA39, 0x5ADC,
+ 0x8230, 0xBB30, 0xBB39, 0x5AE6, 0x8230, 0xBC30, 0xBC39, 0x5AF0, 0x8230, 0xBD30, 0xBD39, 0x5AFA,
+ 0x8230, 0xBE30, 0xBE39, 0x5B04, 0x8230, 0xBF30, 0xBF39, 0x5B0E, 0x8230, 0xC030, 0xC039, 0x5B18,
+ 0x8230, 0xC130, 0xC139, 0x5B22, 0x8230, 0xC230, 0xC239, 0x5B2C, 0x8230, 0xC330, 0xC339, 0x5B36,
+ 0x8230, 0xC430, 0xC439, 0x5B40, 0x8230, 0xC530, 0xC539, 0x5B4A, 0x8230, 0xC630, 0xC639, 0x5B54,
+ 0x8230, 0xC730, 0xC739, 0x5B5E, 0x8230, 0xC830, 0xC839, 0x5B68, 0x8230, 0xC930, 0xC939, 0x5B72,
+ 0x8230, 0xCA30, 0xCA39, 0x5B7C, 0x8230, 0xCB30, 0xCB39, 0x5B86, 0x8230, 0xCC30, 0xCC39, 0x5B90,
+ 0x8230, 0xCD30, 0xCD39, 0x5B9A, 0x8230, 0xCE30, 0xCE39, 0x5BA4, 0x8230, 0xCF30, 0xCF39, 0x5BAE,
+ 0x8230, 0xD030, 0xD039, 0x5BB8, 0x8230, 0xD130, 0xD139, 0x5BC2, 0x8230, 0xD230, 0xD239, 0x5BCC,
+ 0x8230, 0xD330, 0xD339, 0x5BD6, 0x8230, 0xD430, 0xD439, 0x5BE0, 0x8230, 0xD530, 0xD539, 0x5BEA,
+ 0x8230, 0xD630, 0xD639, 0x5BF4, 0x8230, 0xD730, 0xD739, 0x5BFE, 0x8230, 0xD830, 0xD839, 0x5C08,
+ 0x8230, 0xD930, 0xD939, 0x5C12, 0x8230, 0xDA30, 0xDA39, 0x5C1C, 0x8230, 0xDB30, 0xDB39, 0x5C26,
+ 0x8230, 0xDC30, 0xDC39, 0x5C30, 0x8230, 0xDD30, 0xDD39, 0x5C3A, 0x8230, 0xDE30, 0xDE39, 0x5C44,
+ 0x8230, 0xDF30, 0xDF39, 0x5C4E, 0x8230, 0xE030, 0xE039, 0x5C58, 0x8230, 0xE130, 0xE139, 0x5C62,
+ 0x8230, 0xE230, 0xE239, 0x5C6C, 0x8230, 0xE330, 0xE339, 0x5C76, 0x8230, 0xE430, 0xE439, 0x5C80,
+ 0x8230, 0xE530, 0xE539, 0x5C8A, 0x8230, 0xE630, 0xE639, 0x5C94, 0x8230, 0xE730, 0xE739, 0x5C9E,
+ 0x8230, 0xE830, 0xE839, 0x5CA8, 0x8230, 0xE930, 0xE939, 0x5CB2, 0x8230, 0xEA30, 0xEA39, 0x5CBC,
+ 0x8230, 0xEB30, 0xEB39, 0x5CC6, 0x8230, 0xEC30, 0xEC39, 0x5CD0, 0x8230, 0xED30, 0xED39, 0x5CDA,
+ 0x8230, 0xEE30, 0xEE39, 0x5CE4, 0x8230, 0xEF30, 0xEF39, 0x5CEE, 0x8230, 0xF030, 0xF039, 0x5CF8,
+ 0x8230, 0xF130, 0xF139, 0x5D02, 0x8230, 0xF230, 0xF239, 0x5D0C, 0x8230, 0xF330, 0xF339, 0x5D16,
+ 0x8230, 0xF430, 0xF439, 0x5D20, 0x8230, 0xF530, 0xF539, 0x5D2A, 0x8230, 0xF630, 0xF639, 0x5D34,
+ 0x8230, 0xF730, 0xF739, 0x5D3E, 0x8230, 0xF830, 0xF839, 0x5D48, 0x8230, 0xF930, 0xF939, 0x5D52,
+ 0x8230, 0xFA30, 0xFA39, 0x5D5C, 0x8230, 0xFB30, 0xFB39, 0x5D66, 0x8230, 0xFC30, 0xFC39, 0x5D70,
+ 0x8230, 0xFD30, 0xFD39, 0x5D7A, 0x8230, 0xFE30, 0xFE39, 0x5D84, 0x8231, 0x8130, 0x8139, 0x5D8E,
+ 0x8231, 0x8230, 0x8239, 0x5D98, 0x8231, 0x8330, 0x8339, 0x5DA2, 0x8231, 0x8430, 0x8439, 0x5DAC,
+ 0x8231, 0x8530, 0x8539, 0x5DB6, 0x8231, 0x8630, 0x8639, 0x5DC0, 0x8231, 0x8730, 0x8739, 0x5DCA,
+ 0x8231, 0x8830, 0x8839, 0x5DD4, 0x8231, 0x8930, 0x8939, 0x5DDE, 0x8231, 0x8A30, 0x8A39, 0x5DE8,
+ 0x8231, 0x8B30, 0x8B39, 0x5DF2, 0x8231, 0x8C30, 0x8C39, 0x5DFC, 0x8231, 0x8D30, 0x8D39, 0x5E06,
+ 0x8231, 0x8E30, 0x8E39, 0x5E10, 0x8231, 0x8F30, 0x8F39, 0x5E1A, 0x8231, 0x9030, 0x9039, 0x5E24,
+ 0x8231, 0x9130, 0x9139, 0x5E2E, 0x8231, 0x9230, 0x9239, 0x5E38, 0x8231, 0x9330, 0x9339, 0x5E42,
+ 0x8231, 0x9430, 0x9439, 0x5E4C, 0x8231, 0x9530, 0x9539, 0x5E56, 0x8231, 0x9630, 0x9639, 0x5E60,
+ 0x8231, 0x9730, 0x9739, 0x5E6A, 0x8231, 0x9830, 0x9839, 0x5E74, 0x8231, 0x9930, 0x9939, 0x5E7E,
+ 0x8231, 0x9A30, 0x9A39, 0x5E88, 0x8231, 0x9B30, 0x9B39, 0x5E92, 0x8231, 0x9C30, 0x9C39, 0x5E9C,
+ 0x8231, 0x9D30, 0x9D39, 0x5EA6, 0x8231, 0x9E30, 0x9E39, 0x5EB0, 0x8231, 0x9F30, 0x9F39, 0x5EBA,
+ 0x8231, 0xA030, 0xA039, 0x5EC4, 0x8231, 0xA130, 0xA139, 0x5ECE, 0x8231, 0xA230, 0xA239, 0x5ED8,
+ 0x8231, 0xA330, 0xA339, 0x5EE2, 0x8231, 0xA430, 0xA439, 0x5EEC, 0x8231, 0xA530, 0xA539, 0x5EF6,
+ 0x8231, 0xA630, 0xA639, 0x5F00, 0x8231, 0xA730, 0xA739, 0x5F0A, 0x8231, 0xA830, 0xA839, 0x5F14,
+ 0x8231, 0xA930, 0xA939, 0x5F1E, 0x8231, 0xAA30, 0xAA39, 0x5F28, 0x8231, 0xAB30, 0xAB39, 0x5F32,
+ 0x8231, 0xAC30, 0xAC39, 0x5F3C, 0x8231, 0xAD30, 0xAD39, 0x5F46, 0x8231, 0xAE30, 0xAE39, 0x5F50,
+ 0x8231, 0xAF30, 0xAF39, 0x5F5A, 0x8231, 0xB030, 0xB039, 0x5F64, 0x8231, 0xB130, 0xB139, 0x5F6E,
+ 0x8231, 0xB230, 0xB239, 0x5F78, 0x8231, 0xB330, 0xB339, 0x5F82, 0x8231, 0xB430, 0xB439, 0x5F8C,
+ 0x8231, 0xB530, 0xB539, 0x5F96, 0x8231, 0xB630, 0xB639, 0x5FA0, 0x8231, 0xB730, 0xB739, 0x5FAA,
+ 0x8231, 0xB830, 0xB839, 0x5FB4, 0x8231, 0xB930, 0xB939, 0x5FBE, 0x8231, 0xBA30, 0xBA39, 0x5FC8,
+ 0x8231, 0xBB30, 0xBB39, 0x5FD2, 0x8231, 0xBC30, 0xBC39, 0x5FDC, 0x8231, 0xBD30, 0xBD39, 0x5FE6,
+ 0x8231, 0xBE30, 0xBE39, 0x5FF0, 0x8231, 0xBF30, 0xBF39, 0x5FFA, 0x8231, 0xC030, 0xC039, 0x6004,
+ 0x8231, 0xC130, 0xC139, 0x600E, 0x8231, 0xC230, 0xC239, 0x6018, 0x8231, 0xC330, 0xC339, 0x6022,
+ 0x8231, 0xC430, 0xC439, 0x602C, 0x8231, 0xC530, 0xC539, 0x6036, 0x8231, 0xC630, 0xC639, 0x6040,
+ 0x8231, 0xC730, 0xC739, 0x604A, 0x8231, 0xC830, 0xC839, 0x6054, 0x8231, 0xC930, 0xC939, 0x605E,
+ 0x8231, 0xCA30, 0xCA39, 0x6068, 0x8231, 0xCB30, 0xCB39, 0x6072, 0x8231, 0xCC30, 0xCC39, 0x607C,
+ 0x8231, 0xCD30, 0xCD39, 0x6086, 0x8231, 0xCE30, 0xCE39, 0x6090, 0x8231, 0xCF30, 0xCF39, 0x609A,
+ 0x8231, 0xD030, 0xD039, 0x60A4, 0x8231, 0xD130, 0xD139, 0x60AE, 0x8231, 0xD230, 0xD239, 0x60B8,
+ 0x8231, 0xD330, 0xD339, 0x60C2, 0x8231, 0xD430, 0xD439, 0x60CC, 0x8231, 0xD530, 0xD539, 0x60D6,
+ 0x8231, 0xD630, 0xD639, 0x60E0, 0x8231, 0xD730, 0xD739, 0x60EA, 0x8231, 0xD830, 0xD839, 0x60F4,
+ 0x8231, 0xD930, 0xD939, 0x60FE, 0x8231, 0xDA30, 0xDA39, 0x6108, 0x8231, 0xDB30, 0xDB39, 0x6112,
+ 0x8231, 0xDC30, 0xDC39, 0x611C, 0x8231, 0xDD30, 0xDD39, 0x6126, 0x8231, 0xDE30, 0xDE39, 0x6130,
+ 0x8231, 0xDF30, 0xDF39, 0x613A, 0x8231, 0xE030, 0xE039, 0x6144, 0x8231, 0xE130, 0xE139, 0x614E,
+ 0x8231, 0xE230, 0xE239, 0x6158, 0x8231, 0xE330, 0xE339, 0x6162, 0x8231, 0xE430, 0xE439, 0x616C,
+ 0x8231, 0xE530, 0xE539, 0x6176, 0x8231, 0xE630, 0xE639, 0x6180, 0x8231, 0xE730, 0xE739, 0x618A,
+ 0x8231, 0xE830, 0xE839, 0x6194, 0x8231, 0xE930, 0xE939, 0x619E, 0x8231, 0xEA30, 0xEA39, 0x61A8,
+ 0x8231, 0xEB30, 0xEB39, 0x61B2, 0x8231, 0xEC30, 0xEC39, 0x61BC, 0x8231, 0xED30, 0xED39, 0x61C6,
+ 0x8231, 0xEE30, 0xEE39, 0x61D0, 0x8231, 0xEF30, 0xEF39, 0x61DA, 0x8231, 0xF030, 0xF039, 0x61E4,
+ 0x8231, 0xF130, 0xF139, 0x61EE, 0x8231, 0xF230, 0xF239, 0x61F8, 0x8231, 0xF330, 0xF339, 0x6202,
+ 0x8231, 0xF430, 0xF439, 0x620C, 0x8231, 0xF530, 0xF539, 0x6216, 0x8231, 0xF630, 0xF639, 0x6220,
+ 0x8231, 0xF730, 0xF739, 0x622A, 0x8231, 0xF830, 0xF839, 0x6234, 0x8231, 0xF930, 0xF939, 0x623E,
+ 0x8231, 0xFA30, 0xFA39, 0x6248, 0x8231, 0xFB30, 0xFB39, 0x6252, 0x8231, 0xFC30, 0xFC39, 0x625C,
+ 0x8231, 0xFD30, 0xFD39, 0x6266, 0x8231, 0xFE30, 0xFE39, 0x6270, 0x8232, 0x8130, 0x8139, 0x627A,
+ 0x8232, 0x8230, 0x8239, 0x6284, 0x8232, 0x8330, 0x8339, 0x628E, 0x8232, 0x8430, 0x8439, 0x6298,
+ 0x8232, 0x8530, 0x8539, 0x62A2, 0x8232, 0x8630, 0x8639, 0x62AC, 0x8232, 0x8730, 0x8739, 0x62B6,
+ 0x8232, 0x8830, 0x8839, 0x62C0, 0x8232, 0x8930, 0x8939, 0x62CA, 0x8232, 0x8A30, 0x8A39, 0x62D4,
+ 0x8232, 0x8B30, 0x8B39, 0x62DE, 0x8232, 0x8C30, 0x8C39, 0x62E8, 0x8232, 0x8D30, 0x8D39, 0x62F2,
+ 0x8232, 0x8E30, 0x8E39, 0x62FC, 0x8232, 0x8F30, 0x8F39, 0x6306, 0x8232, 0x9030, 0x9039, 0x6310,
+ 0x8232, 0x9130, 0x9139, 0x631A, 0x8232, 0x9230, 0x9239, 0x6324, 0x8232, 0x9330, 0x9339, 0x632E,
+ 0x8232, 0x9430, 0x9439, 0x6338, 0x8232, 0x9530, 0x9539, 0x6342, 0x8232, 0x9630, 0x9639, 0x634C,
+ 0x8232, 0x9730, 0x9739, 0x6356, 0x8232, 0x9830, 0x9839, 0x6360, 0x8232, 0x9930, 0x9939, 0x636A,
+ 0x8232, 0x9A30, 0x9A39, 0x6374, 0x8232, 0x9B30, 0x9B39, 0x637E, 0x8232, 0x9C30, 0x9C39, 0x6388,
+ 0x8232, 0x9D30, 0x9D39, 0x6392, 0x8232, 0x9E30, 0x9E39, 0x639C, 0x8232, 0x9F30, 0x9F39, 0x63A6,
+ 0x8232, 0xA030, 0xA039, 0x63B0, 0x8232, 0xA130, 0xA139, 0x63BA, 0x8232, 0xA230, 0xA239, 0x63C4,
+ 0x8232, 0xA330, 0xA339, 0x63CE, 0x8232, 0xA430, 0xA439, 0x63D8, 0x8232, 0xA530, 0xA539, 0x63E2,
+ 0x8232, 0xA630, 0xA639, 0x63EC, 0x8232, 0xA730, 0xA739, 0x63F6, 0x8232, 0xA830, 0xA839, 0x6400,
+ 0x8232, 0xA930, 0xA939, 0x640A, 0x8232, 0xAA30, 0xAA39, 0x6414, 0x8232, 0xAB30, 0xAB39, 0x641E,
+ 0x8232, 0xAC30, 0xAC39, 0x6428, 0x8232, 0xAD30, 0xAD39, 0x6432, 0x8232, 0xAE30, 0xAE39, 0x643C,
+ 0x8232, 0xAF30, 0xAF39, 0x6446, 0x8232, 0xB030, 0xB039, 0x6450, 0x8232, 0xB130, 0xB139, 0x645A,
+ 0x8232, 0xB230, 0xB239, 0x6464, 0x8232, 0xB330, 0xB339, 0x646E, 0x8232, 0xB430, 0xB439, 0x6478,
+ 0x8232, 0xB530, 0xB539, 0x6482, 0x8232, 0xB630, 0xB639, 0x648C, 0x8232, 0xB730, 0xB739, 0x6496,
+ 0x8232, 0xB830, 0xB839, 0x64A0, 0x8232, 0xB930, 0xB939, 0x64AA, 0x8232, 0xBA30, 0xBA39, 0x64B4,
+ 0x8232, 0xBB30, 0xBB39, 0x64BE, 0x8232, 0xBC30, 0xBC39, 0x64C8, 0x8232, 0xBD30, 0xBD39, 0x64D2,
+ 0x8232, 0xBE30, 0xBE39, 0x64DC, 0x8232, 0xBF30, 0xBF39, 0x64E6, 0x8232, 0xC030, 0xC039, 0x64F0,
+ 0x8232, 0xC130, 0xC139, 0x64FA, 0x8232, 0xC230, 0xC239, 0x6504, 0x8232, 0xC330, 0xC339, 0x650E,
+ 0x8232, 0xC430, 0xC439, 0x6518, 0x8232, 0xC530, 0xC539, 0x6522, 0x8232, 0xC630, 0xC639, 0x652C,
+ 0x8232, 0xC730, 0xC739, 0x6536, 0x8232, 0xC830, 0xC839, 0x6540, 0x8232, 0xC930, 0xC939, 0x654A,
+ 0x8232, 0xCA30, 0xCA39, 0x6554, 0x8232, 0xCB30, 0xCB39, 0x655E, 0x8232, 0xCC30, 0xCC39, 0x6568,
+ 0x8232, 0xCD30, 0xCD39, 0x6572, 0x8232, 0xCE30, 0xCE39, 0x657C, 0x8232, 0xCF30, 0xCF39, 0x6586,
+ 0x8232, 0xD030, 0xD039, 0x6590, 0x8232, 0xD130, 0xD139, 0x659A, 0x8232, 0xD230, 0xD239, 0x65A4,
+ 0x8232, 0xD330, 0xD339, 0x65AE, 0x8232, 0xD430, 0xD439, 0x65B8, 0x8232, 0xD530, 0xD539, 0x65C2,
+ 0x8232, 0xD630, 0xD639, 0x65CC, 0x8232, 0xD730, 0xD739, 0x65D6, 0x8232, 0xD830, 0xD839, 0x65E0,
+ 0x8232, 0xD930, 0xD939, 0x65EA, 0x8232, 0xDA30, 0xDA39, 0x65F4, 0x8232, 0xDB30, 0xDB39, 0x65FE,
+ 0x8232, 0xDC30, 0xDC39, 0x6608, 0x8232, 0xDD30, 0xDD39, 0x6612, 0x8232, 0xDE30, 0xDE39, 0x661C,
+ 0x8232, 0xDF30, 0xDF39, 0x6626, 0x8232, 0xE030, 0xE039, 0x6630, 0x8232, 0xE130, 0xE139, 0x663A,
+ 0x8232, 0xE230, 0xE239, 0x6644, 0x8232, 0xE330, 0xE339, 0x664E, 0x8232, 0xE430, 0xE439, 0x6658,
+ 0x8232, 0xE530, 0xE539, 0x6662, 0x8232, 0xE630, 0xE639, 0x666C, 0x8232, 0xE730, 0xE739, 0x6676,
+ 0x8232, 0xE830, 0xE839, 0x6680, 0x8232, 0xE930, 0xE939, 0x668A, 0x8232, 0xEA30, 0xEA39, 0x6694,
+ 0x8232, 0xEB30, 0xEB39, 0x669E, 0x8232, 0xEC30, 0xEC39, 0x66A8, 0x8232, 0xED30, 0xED39, 0x66B2,
+ 0x8232, 0xEE30, 0xEE39, 0x66BC, 0x8232, 0xEF30, 0xEF39, 0x66C6, 0x8232, 0xF030, 0xF039, 0x66D0,
+ 0x8232, 0xF130, 0xF139, 0x66DA, 0x8232, 0xF230, 0xF239, 0x66E4, 0x8232, 0xF330, 0xF339, 0x66EE,
+ 0x8232, 0xF430, 0xF439, 0x66F8, 0x8232, 0xF530, 0xF539, 0x6702, 0x8232, 0xF630, 0xF639, 0x670C,
+ 0x8232, 0xF730, 0xF739, 0x6716, 0x8232, 0xF830, 0xF839, 0x6720, 0x8232, 0xF930, 0xF939, 0x672A,
+ 0x8232, 0xFA30, 0xFA39, 0x6734, 0x8232, 0xFB30, 0xFB39, 0x673E, 0x8232, 0xFC30, 0xFC39, 0x6748,
+ 0x8232, 0xFD30, 0xFD39, 0x6752, 0x8232, 0xFE30, 0xFE39, 0x675C, 0x8233, 0x8130, 0x8139, 0x6766,
+ 0x8233, 0x8230, 0x8239, 0x6770, 0x8233, 0x8330, 0x8339, 0x677A, 0x8233, 0x8430, 0x8439, 0x6784,
+ 0x8233, 0x8530, 0x8539, 0x678E, 0x8233, 0x8630, 0x8639, 0x6798, 0x8233, 0x8730, 0x8739, 0x67A2,
+ 0x8233, 0x8830, 0x8839, 0x67AC, 0x8233, 0x8930, 0x8939, 0x67B6, 0x8233, 0x8A30, 0x8A39, 0x67C0,
+ 0x8233, 0x8B30, 0x8B39, 0x67CA, 0x8233, 0x8C30, 0x8C39, 0x67D4, 0x8233, 0x8D30, 0x8D39, 0x67DE,
+ 0x8233, 0x8E30, 0x8E39, 0x67E8, 0x8233, 0x8F30, 0x8F39, 0x67F2, 0x8233, 0x9030, 0x9039, 0x67FC,
+ 0x8233, 0x9130, 0x9139, 0x6806, 0x8233, 0x9230, 0x9239, 0x6810, 0x8233, 0x9330, 0x9339, 0x681A,
+ 0x8233, 0x9430, 0x9439, 0x6824, 0x8233, 0x9530, 0x9539, 0x682E, 0x8233, 0x9630, 0x9639, 0x6838,
+ 0x8233, 0x9730, 0x9739, 0x6842, 0x8233, 0x9830, 0x9839, 0x684C, 0x8233, 0x9930, 0x9939, 0x6856,
+ 0x8233, 0x9A30, 0x9A39, 0x6860, 0x8233, 0x9B30, 0x9B39, 0x686A, 0x8233, 0x9C30, 0x9C39, 0x6874,
+ 0x8233, 0x9D30, 0x9D39, 0x687E, 0x8233, 0x9E30, 0x9E39, 0x6888, 0x8233, 0x9F30, 0x9F39, 0x6892,
+ 0x8233, 0xA030, 0xA039, 0x689C, 0x8233, 0xA130, 0xA139, 0x68A6, 0x8233, 0xA230, 0xA239, 0x68B0,
+ 0x8233, 0xA330, 0xA339, 0x68BA, 0x8233, 0xA430, 0xA439, 0x68C4, 0x8233, 0xA530, 0xA539, 0x68CE,
+ 0x8233, 0xA630, 0xA639, 0x68D8, 0x8233, 0xA730, 0xA739, 0x68E2, 0x8233, 0xA830, 0xA839, 0x68EC,
+ 0x8233, 0xA930, 0xA939, 0x68F6, 0x8233, 0xAA30, 0xAA39, 0x6900, 0x8233, 0xAB30, 0xAB39, 0x690A,
+ 0x8233, 0xAC30, 0xAC39, 0x6914, 0x8233, 0xAD30, 0xAD39, 0x691E, 0x8233, 0xAE30, 0xAE39, 0x6928,
+ 0x8233, 0xAF30, 0xAF39, 0x6932, 0x8233, 0xB030, 0xB039, 0x693C, 0x8233, 0xB130, 0xB139, 0x6946,
+ 0x8233, 0xB230, 0xB239, 0x6950, 0x8233, 0xB330, 0xB339, 0x695A, 0x8233, 0xB430, 0xB439, 0x6964,
+ 0x8233, 0xB530, 0xB539, 0x696E, 0x8233, 0xB630, 0xB639, 0x6978, 0x8233, 0xB730, 0xB739, 0x6982,
+ 0x8233, 0xB830, 0xB839, 0x698C, 0x8233, 0xB930, 0xB939, 0x6996, 0x8233, 0xBA30, 0xBA39, 0x69A0,
+ 0x8233, 0xBB30, 0xBB39, 0x69AA, 0x8233, 0xBC30, 0xBC39, 0x69B4, 0x8233, 0xBD30, 0xBD39, 0x69BE,
+ 0x8233, 0xBE30, 0xBE39, 0x69C8, 0x8233, 0xBF30, 0xBF39, 0x69D2, 0x8233, 0xC030, 0xC039, 0x69DC,
+ 0x8233, 0xC130, 0xC139, 0x69E6, 0x8233, 0xC230, 0xC239, 0x69F0, 0x8233, 0xC330, 0xC339, 0x69FA,
+ 0x8233, 0xC430, 0xC439, 0x6A04, 0x8233, 0xC530, 0xC539, 0x6A0E, 0x8233, 0xC630, 0xC639, 0x6A18,
+ 0x8233, 0xC730, 0xC739, 0x6A22, 0x8233, 0xC830, 0xC839, 0x6A2C, 0x8233, 0xC930, 0xC939, 0x6A36,
+ 0x8233, 0xCA30, 0xCA39, 0x6A40, 0x8233, 0xCB30, 0xCB39, 0x6A4A, 0x8233, 0xCC30, 0xCC39, 0x6A54,
+ 0x8233, 0xCD30, 0xCD39, 0x6A5E, 0x8233, 0xCE30, 0xCE39, 0x6A68, 0x8233, 0xCF30, 0xCF39, 0x6A72,
+ 0x8233, 0xD030, 0xD039, 0x6A7C, 0x8233, 0xD130, 0xD139, 0x6A86, 0x8233, 0xD230, 0xD239, 0x6A90,
+ 0x8233, 0xD330, 0xD339, 0x6A9A, 0x8233, 0xD430, 0xD439, 0x6AA4, 0x8233, 0xD530, 0xD539, 0x6AAE,
+ 0x8233, 0xD630, 0xD639, 0x6AB8, 0x8233, 0xD730, 0xD739, 0x6AC2, 0x8233, 0xD830, 0xD839, 0x6ACC,
+ 0x8233, 0xD930, 0xD939, 0x6AD6, 0x8233, 0xDA30, 0xDA39, 0x6AE0, 0x8233, 0xDB30, 0xDB39, 0x6AEA,
+ 0x8233, 0xDC30, 0xDC39, 0x6AF4, 0x8233, 0xDD30, 0xDD39, 0x6AFE, 0x8233, 0xDE30, 0xDE39, 0x6B08,
+ 0x8233, 0xDF30, 0xDF39, 0x6B12, 0x8233, 0xE030, 0xE039, 0x6B1C, 0x8233, 0xE130, 0xE139, 0x6B26,
+ 0x8233, 0xE230, 0xE239, 0x6B30, 0x8233, 0xE330, 0xE339, 0x6B3A, 0x8233, 0xE430, 0xE439, 0x6B44,
+ 0x8233, 0xE530, 0xE539, 0x6B4E, 0x8233, 0xE630, 0xE639, 0x6B58, 0x8233, 0xE730, 0xE739, 0x6B62,
+ 0x8233, 0xE830, 0xE839, 0x6B6C, 0x8233, 0xE930, 0xE939, 0x6B76, 0x8233, 0xEA30, 0xEA39, 0x6B80,
+ 0x8233, 0xEB30, 0xEB39, 0x6B8A, 0x8233, 0xEC30, 0xEC39, 0x6B94, 0x8233, 0xED30, 0xED39, 0x6B9E,
+ 0x8233, 0xEE30, 0xEE39, 0x6BA8, 0x8233, 0xEF30, 0xEF39, 0x6BB2, 0x8233, 0xF030, 0xF039, 0x6BBC,
+ 0x8233, 0xF130, 0xF139, 0x6BC6, 0x8233, 0xF230, 0xF239, 0x6BD0, 0x8233, 0xF330, 0xF339, 0x6BDA,
+ 0x8233, 0xF430, 0xF439, 0x6BE4, 0x8233, 0xF530, 0xF539, 0x6BEE, 0x8233, 0xF630, 0xF639, 0x6BF8,
+ 0x8233, 0xF730, 0xF739, 0x6C02, 0x8233, 0xF830, 0xF839, 0x6C0C, 0x8233, 0xF930, 0xF939, 0x6C16,
+ 0x8233, 0xFA30, 0xFA39, 0x6C20, 0x8233, 0xFB30, 0xFB39, 0x6C2A, 0x8233, 0xFC30, 0xFC39, 0x6C34,
+ 0x8233, 0xFD30, 0xFD39, 0x6C3E, 0x8233, 0xFE30, 0xFE39, 0x6C48, 0x8234, 0x8130, 0x8139, 0x6C52,
+ 0x8234, 0x8230, 0x8239, 0x6C5C, 0x8234, 0x8330, 0x8339, 0x6C66, 0x8234, 0x8430, 0x8439, 0x6C70,
+ 0x8234, 0x8530, 0x8539, 0x6C7A, 0x8234, 0x8630, 0x8639, 0x6C84, 0x8234, 0x8730, 0x8739, 0x6C8E,
+ 0x8234, 0x8830, 0x8839, 0x6C98, 0x8234, 0x8930, 0x8939, 0x6CA2, 0x8234, 0x8A30, 0x8A39, 0x6CAC,
+ 0x8234, 0x8B30, 0x8B39, 0x6CB6, 0x8234, 0x8C30, 0x8C39, 0x6CC0, 0x8234, 0x8D30, 0x8D39, 0x6CCA,
+ 0x8234, 0x8E30, 0x8E39, 0x6CD4, 0x8234, 0x8F30, 0x8F39, 0x6CDE, 0x8234, 0x9030, 0x9039, 0x6CE8,
+ 0x8234, 0x9130, 0x9139, 0x6CF2, 0x8234, 0x9230, 0x9239, 0x6CFC, 0x8234, 0x9330, 0x9339, 0x6D06,
+ 0x8234, 0x9430, 0x9439, 0x6D10, 0x8234, 0x9530, 0x9539, 0x6D1A, 0x8234, 0x9630, 0x9639, 0x6D24,
+ 0x8234, 0x9730, 0x9739, 0x6D2E, 0x8234, 0x9830, 0x9839, 0x6D38, 0x8234, 0x9930, 0x9939, 0x6D42,
+ 0x8234, 0x9A30, 0x9A39, 0x6D4C, 0x8234, 0x9B30, 0x9B39, 0x6D56, 0x8234, 0x9C30, 0x9C39, 0x6D60,
+ 0x8234, 0x9D30, 0x9D39, 0x6D6A, 0x8234, 0x9E30, 0x9E39, 0x6D74, 0x8234, 0x9F30, 0x9F39, 0x6D7E,
+ 0x8234, 0xA030, 0xA039, 0x6D88, 0x8234, 0xA130, 0xA139, 0x6D92, 0x8234, 0xA230, 0xA239, 0x6D9C,
+ 0x8234, 0xA330, 0xA339, 0x6DA6, 0x8234, 0xA430, 0xA439, 0x6DB0, 0x8234, 0xA530, 0xA539, 0x6DBA,
+ 0x8234, 0xA630, 0xA639, 0x6DC4, 0x8234, 0xA730, 0xA739, 0x6DCE, 0x8234, 0xA830, 0xA839, 0x6DD8,
+ 0x8234, 0xA930, 0xA939, 0x6DE2, 0x8234, 0xAA30, 0xAA39, 0x6DEC, 0x8234, 0xAB30, 0xAB39, 0x6DF6,
+ 0x8234, 0xAC30, 0xAC39, 0x6E00, 0x8234, 0xAD30, 0xAD39, 0x6E0A, 0x8234, 0xAE30, 0xAE39, 0x6E14,
+ 0x8234, 0xAF30, 0xAF39, 0x6E1E, 0x8234, 0xB030, 0xB039, 0x6E28, 0x8234, 0xB130, 0xB139, 0x6E32,
+ 0x8234, 0xB230, 0xB239, 0x6E3C, 0x8234, 0xB330, 0xB339, 0x6E46, 0x8234, 0xB430, 0xB439, 0x6E50,
+ 0x8234, 0xB530, 0xB539, 0x6E5A, 0x8234, 0xB630, 0xB639, 0x6E64, 0x8234, 0xB730, 0xB739, 0x6E6E,
+ 0x8234, 0xB830, 0xB839, 0x6E78, 0x8234, 0xB930, 0xB939, 0x6E82, 0x8234, 0xBA30, 0xBA39, 0x6E8C,
+ 0x8234, 0xBB30, 0xBB39, 0x6E96, 0x8234, 0xBC30, 0xBC39, 0x6EA0, 0x8234, 0xBD30, 0xBD39, 0x6EAA,
+ 0x8234, 0xBE30, 0xBE39, 0x6EB4, 0x8234, 0xBF30, 0xBF39, 0x6EBE, 0x8234, 0xC030, 0xC039, 0x6EC8,
+ 0x8234, 0xC130, 0xC139, 0x6ED2, 0x8234, 0xC230, 0xC239, 0x6EDC, 0x8234, 0xC330, 0xC339, 0x6EE6,
+ 0x8234, 0xC430, 0xC439, 0x6EF0, 0x8234, 0xC530, 0xC539, 0x6EFA, 0x8234, 0xC630, 0xC639, 0x6F04,
+ 0x8234, 0xC730, 0xC739, 0x6F0E, 0x8234, 0xC830, 0xC839, 0x6F18, 0x8234, 0xC930, 0xC939, 0x6F22,
+ 0x8234, 0xCA30, 0xCA39, 0x6F2C, 0x8234, 0xCB30, 0xCB39, 0x6F36, 0x8234, 0xCC30, 0xCC39, 0x6F40,
+ 0x8234, 0xCD30, 0xCD39, 0x6F4A, 0x8234, 0xCE30, 0xCE39, 0x6F54, 0x8234, 0xCF30, 0xCF39, 0x6F5E,
+ 0x8234, 0xD030, 0xD039, 0x6F68, 0x8234, 0xD130, 0xD139, 0x6F72, 0x8234, 0xD230, 0xD239, 0x6F7C,
+ 0x8234, 0xD330, 0xD339, 0x6F86, 0x8234, 0xD430, 0xD439, 0x6F90, 0x8234, 0xD530, 0xD539, 0x6F9A,
+ 0x8234, 0xD630, 0xD639, 0x6FA4, 0x8234, 0xD730, 0xD739, 0x6FAE, 0x8234, 0xD830, 0xD839, 0x6FB8,
+ 0x8234, 0xD930, 0xD939, 0x6FC2, 0x8234, 0xDA30, 0xDA39, 0x6FCC, 0x8234, 0xDB30, 0xDB39, 0x6FD6,
+ 0x8234, 0xDC30, 0xDC39, 0x6FE0, 0x8234, 0xDD30, 0xDD39, 0x6FEA, 0x8234, 0xDE30, 0xDE39, 0x6FF4,
+ 0x8234, 0xDF30, 0xDF39, 0x6FFE, 0x8234, 0xE030, 0xE039, 0x7008, 0x8234, 0xE130, 0xE139, 0x7012,
+ 0x8234, 0xE230, 0xE239, 0x701C, 0x8234, 0xE330, 0xE339, 0x7026, 0x8234, 0xE430, 0xE439, 0x7030,
+ 0x8234, 0xE530, 0xE539, 0x703A, 0x8234, 0xE630, 0xE639, 0x7044, 0x8234, 0xE730, 0xE739, 0x704E,
+ 0x8234, 0xE830, 0xE839, 0x7058, 0x8234, 0xE930, 0xE939, 0x7062, 0x8234, 0xEA30, 0xEA39, 0x706C,
+ 0x8234, 0xEB30, 0xEB39, 0x7076, 0x8234, 0xEC30, 0xEC39, 0x7080, 0x8234, 0xED30, 0xED39, 0x708A,
+ 0x8234, 0xEE30, 0xEE39, 0x7094, 0x8234, 0xEF30, 0xEF39, 0x709E, 0x8234, 0xF030, 0xF039, 0x70A8,
+ 0x8234, 0xF130, 0xF139, 0x70B2, 0x8234, 0xF230, 0xF239, 0x70BC, 0x8234, 0xF330, 0xF339, 0x70C6,
+ 0x8234, 0xF430, 0xF439, 0x70D0, 0x8234, 0xF530, 0xF539, 0x70DA, 0x8234, 0xF630, 0xF639, 0x70E4,
+ 0x8234, 0xF730, 0xF739, 0x70EE, 0x8234, 0xF830, 0xF839, 0x70F8, 0x8234, 0xF930, 0xF939, 0x7102,
+ 0x8234, 0xFA30, 0xFA39, 0x710C, 0x8234, 0xFB30, 0xFB39, 0x7116, 0x8234, 0xFC30, 0xFC39, 0x7120,
+ 0x8234, 0xFD30, 0xFD39, 0x712A, 0x8234, 0xFE30, 0xFE39, 0x7134, 0x8235, 0x8130, 0x8139, 0x713E,
+ 0x8235, 0x8230, 0x8239, 0x7148, 0x8235, 0x8330, 0x8339, 0x7152, 0x8235, 0x8430, 0x8439, 0x715C,
+ 0x8235, 0x8530, 0x8539, 0x7166, 0x8235, 0x8630, 0x8639, 0x7170, 0x8235, 0x8730, 0x8738, 0x717A,
+ 0x8235, 0x9833, 0x9839, 0x7188, 0x8235, 0x9930, 0x9939, 0x718F, 0x8235, 0x9A30, 0x9A39, 0x7199,
+ 0x8235, 0x9B30, 0x9B39, 0x71A3, 0x8235, 0x9C30, 0x9C39, 0x71AD, 0x8235, 0x9D30, 0x9D39, 0x71B7,
+ 0x8235, 0x9E30, 0x9E39, 0x71C1, 0x8235, 0x9F30, 0x9F39, 0x71CB, 0x8235, 0xA030, 0xA039, 0x71D5,
+ 0x8235, 0xA130, 0xA139, 0x71DF, 0x8235, 0xA230, 0xA239, 0x71E9, 0x8235, 0xA330, 0xA339, 0x71F3,
+ 0x8235, 0xA430, 0xA439, 0x71FD, 0x8235, 0xA530, 0xA539, 0x7207, 0x8235, 0xA630, 0xA639, 0x7211,
+ 0x8235, 0xA730, 0xA739, 0x721B, 0x8235, 0xA830, 0xA839, 0x7225, 0x8235, 0xA930, 0xA939, 0x722F,
+ 0x8235, 0xAA30, 0xAA39, 0x7239, 0x8235, 0xAB30, 0xAB39, 0x7243, 0x8235, 0xAC30, 0xAC39, 0x724D,
+ 0x8235, 0xAD30, 0xAD39, 0x7257, 0x8235, 0xAE30, 0xAE39, 0x7261, 0x8235, 0xAF30, 0xAF39, 0x726B,
+ 0x8235, 0xB030, 0xB039, 0x7275, 0x8235, 0xB130, 0xB139, 0x727F, 0x8235, 0xB230, 0xB239, 0x7289,
+ 0x8235, 0xB330, 0xB339, 0x7293, 0x8235, 0xB430, 0xB439, 0x729D, 0x8235, 0xB530, 0xB539, 0x72A7,
+ 0x8235, 0xB630, 0xB639, 0x72B1, 0x8235, 0xB730, 0xB739, 0x72BB, 0x8235, 0xB830, 0xB839, 0x72C5,
+ 0x8235, 0xB930, 0xB939, 0x72CF, 0x8235, 0xBA30, 0xBA39, 0x72D9, 0x8235, 0xBB30, 0xBB39, 0x72E3,
+ 0x8235, 0xBC30, 0xBC39, 0x72ED, 0x8235, 0xBD30, 0xBD39, 0x72F7, 0x8235, 0xBE30, 0xBE39, 0x7301,
+ 0x8235, 0xBF30, 0xBF39, 0x730B, 0x8235, 0xC030, 0xC039, 0x7315, 0x8235, 0xC130, 0xC139, 0x731F,
+ 0x8235, 0xC230, 0xC239, 0x7329, 0x8235, 0xC330, 0xC339, 0x7333, 0x8235, 0xC430, 0xC439, 0x733D,
+ 0x8235, 0xC530, 0xC539, 0x7347, 0x8235, 0xC630, 0xC639, 0x7351, 0x8235, 0xC730, 0xC739, 0x735B,
+ 0x8235, 0xC830, 0xC839, 0x7365, 0x8235, 0xC930, 0xC939, 0x736F, 0x8235, 0xCA30, 0xCA39, 0x7379,
+ 0x8235, 0xCB30, 0xCB39, 0x7383, 0x8235, 0xCC30, 0xCC39, 0x738D, 0x8235, 0xCD30, 0xCD39, 0x7397,
+ 0x8235, 0xCE30, 0xCE39, 0x73A1, 0x8235, 0xCF30, 0xCF39, 0x73AB, 0x8235, 0xD030, 0xD039, 0x73B5,
+ 0x8235, 0xD130, 0xD139, 0x73BF, 0x8235, 0xD230, 0xD239, 0x73C9, 0x8235, 0xD330, 0xD339, 0x73D3,
+ 0x8235, 0xD430, 0xD439, 0x73DD, 0x8235, 0xD530, 0xD539, 0x73E7, 0x8235, 0xD630, 0xD639, 0x73F1,
+ 0x8235, 0xD730, 0xD739, 0x73FB, 0x8235, 0xD830, 0xD839, 0x7405, 0x8235, 0xD930, 0xD939, 0x740F,
+ 0x8235, 0xDA30, 0xDA39, 0x7419, 0x8235, 0xDB30, 0xDB39, 0x7423, 0x8235, 0xDC30, 0xDC39, 0x742D,
+ 0x8235, 0xDD30, 0xDD39, 0x7437, 0x8235, 0xDE30, 0xDE39, 0x7441, 0x8235, 0xDF30, 0xDF39, 0x744B,
+ 0x8235, 0xE030, 0xE039, 0x7455, 0x8235, 0xE130, 0xE139, 0x745F, 0x8235, 0xE230, 0xE239, 0x7469,
+ 0x8235, 0xE330, 0xE339, 0x7473, 0x8235, 0xE430, 0xE439, 0x747D, 0x8235, 0xE530, 0xE539, 0x7487,
+ 0x8235, 0xE630, 0xE639, 0x7491, 0x8235, 0xE730, 0xE739, 0x749B, 0x8235, 0xE830, 0xE839, 0x74A5,
+ 0x8235, 0xE930, 0xE939, 0x74AF, 0x8235, 0xEA30, 0xEA39, 0x74B9, 0x8235, 0xEB30, 0xEB39, 0x74C3,
+ 0x8235, 0xEC30, 0xEC39, 0x74CD, 0x8235, 0xED30, 0xED39, 0x74D7, 0x8235, 0xEE30, 0xEE39, 0x74E1,
+ 0x8235, 0xEF30, 0xEF39, 0x74EB, 0x8235, 0xF030, 0xF039, 0x74F5, 0x8235, 0xF130, 0xF139, 0x74FF,
+ 0x8235, 0xF230, 0xF239, 0x7509, 0x8235, 0xF330, 0xF339, 0x7513, 0x8235, 0xF430, 0xF439, 0x751D,
+ 0x8235, 0xF530, 0xF539, 0x7527, 0x8235, 0xF630, 0xF639, 0x7531, 0x8235, 0xF730, 0xF739, 0x753B,
+ 0x8235, 0xF830, 0xF839, 0x7545, 0x8235, 0xF930, 0xF939, 0x754F, 0x8235, 0xFA30, 0xFA39, 0x7559,
+ 0x8235, 0xFB30, 0xFB39, 0x7563, 0x8235, 0xFC30, 0xFC39, 0x756D, 0x8235, 0xFD30, 0xFD39, 0x7577,
+ 0x8235, 0xFE30, 0xFE39, 0x7581, 0x8236, 0x8130, 0x8139, 0x758B, 0x8236, 0x8230, 0x8239, 0x7595,
+ 0x8236, 0x8330, 0x8339, 0x759F, 0x8236, 0x8430, 0x8439, 0x75A9, 0x8236, 0x8530, 0x8539, 0x75B3,
+ 0x8236, 0x8630, 0x8639, 0x75BD, 0x8236, 0x8730, 0x8739, 0x75C7, 0x8236, 0x8830, 0x8839, 0x75D1,
+ 0x8236, 0x8930, 0x8939, 0x75DB, 0x8236, 0x8A30, 0x8A39, 0x75E5, 0x8236, 0x8B30, 0x8B39, 0x75EF,
+ 0x8236, 0x8C30, 0x8C39, 0x75F9, 0x8236, 0x8D30, 0x8D39, 0x7603, 0x8236, 0x8E30, 0x8E37, 0x760D,
+ 0x8236, 0x8F31, 0x8F39, 0x7615, 0x8236, 0x9030, 0x9039, 0x761E, 0x8236, 0x9130, 0x9139, 0x7628,
+ 0x8236, 0x9230, 0x9239, 0x7632, 0x8236, 0x9330, 0x9339, 0x763C, 0x8236, 0x9430, 0x9435, 0x7646,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp
new file mode 100644
index 0000000000..2fcd85b941
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBK2K_V_5[41 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F, 0xA4A1, 0xA4A1, 0x5757,
+ 0xA4A3, 0xA4A3, 0x5759, 0xA4A5, 0xA4A5, 0x5762, 0xA4A7, 0xA4A7, 0x5758,
+ 0xA4A9, 0xA4A9, 0x5760, 0xA4C3, 0xA4C3, 0x5761, 0xA4E3, 0xA4E3, 0x5764,
+ 0xA4E5, 0xA4E5, 0x5766, 0xA4E7, 0xA4E7, 0x5765, 0xA4EE, 0xA4EE, 0x5763,
+ 0xA5A1, 0xA5A1, 0x5768, 0xA5A3, 0xA5A3, 0x576A, 0xA5A5, 0xA5A5, 0x5771,
+ 0xA5A7, 0xA5A7, 0x5769, 0xA5A9, 0xA5A9, 0x576F, 0xA5C3, 0xA5C3, 0x5770,
+ 0xA5E3, 0xA5E3, 0x5773, 0xA5E5, 0xA5E5, 0x5775, 0xA5E7, 0xA5E7, 0x5774,
+ 0xA5EE, 0xA5EE, 0x5772, 0xA960, 0xA960, 0x577A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
new file mode 100644
index 0000000000..ebb16594da
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp
@@ -0,0 +1,1365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBKp_EUC_H_2[4070 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8140, 0x8178, 0x2758, 0x8179, 0x8179, 0x2059,
+ 0x817A, 0x817E, 0x2791, 0x8180, 0x8185, 0x2796, 0x8186, 0x8186, 0x21F1,
+ 0x8187, 0x81EC, 0x279C, 0x81ED, 0x81ED, 0x1FF2, 0x81EE, 0x81F5, 0x2802,
+ 0x81F6, 0x81F6, 0x205D, 0x81F7, 0x81FE, 0x280A, 0x8240, 0x8252, 0x2812,
+ 0x8253, 0x8253, 0x269C, 0x8254, 0x8261, 0x2825, 0x8262, 0x8262, 0x21B5,
+ 0x8263, 0x8273, 0x2833, 0x8274, 0x8274, 0x22CC, 0x8275, 0x8279, 0x2844,
+ 0x827A, 0x827A, 0x2016, 0x827B, 0x827C, 0x2849, 0x827D, 0x827D, 0x1E62,
+ 0x827E, 0x827E, 0x284B, 0x8280, 0x8280, 0x1F20, 0x8281, 0x8282, 0x284C,
+ 0x8283, 0x8283, 0x207F, 0x8284, 0x828F, 0x284E, 0x8290, 0x8290, 0x205C,
+ 0x8291, 0x82A4, 0x285A, 0x82A5, 0x82A5, 0x2194, 0x82A6, 0x82C7, 0x286E,
+ 0x82C8, 0x82C8, 0x1E65, 0x82C9, 0x82C9, 0x2281, 0x82CA, 0x82E0, 0x2890,
+ 0x82E1, 0x82E1, 0x22CD, 0x82E2, 0x82E2, 0x28A7, 0x82E3, 0x82E3, 0x210A,
+ 0x82E4, 0x82E4, 0x1E3E, 0x82E5, 0x82EC, 0x28A8, 0x82ED, 0x82ED, 0x267F,
+ 0x82EE, 0x82F1, 0x28B0, 0x82F2, 0x82F2, 0x222E, 0x82F3, 0x82F6, 0x28B4,
+ 0x82F7, 0x82F7, 0x1E96, 0x82F8, 0x82F8, 0x22CB, 0x82F9, 0x82F9, 0x226C,
+ 0x82FA, 0x82FA, 0x28B8, 0x82FB, 0x82FB, 0x2117, 0x82FC, 0x82FE, 0x28B9,
+ 0x8340, 0x8340, 0x28BC, 0x8341, 0x8341, 0x20E8, 0x8342, 0x8344, 0x28BD,
+ 0x8345, 0x8345, 0x22D4, 0x8346, 0x8347, 0x28C0, 0x8348, 0x8348, 0x1FB9,
+ 0x8349, 0x834B, 0x28C2, 0x834C, 0x834C, 0x22D8, 0x834D, 0x8352, 0x28C5,
+ 0x8353, 0x8353, 0x20DF, 0x8354, 0x8356, 0x28CB, 0x8357, 0x8357, 0x20C2,
+ 0x8358, 0x835D, 0x28CE, 0x835E, 0x835E, 0x2195, 0x835F, 0x8364, 0x28D4,
+ 0x8365, 0x8365, 0x1FAC, 0x8366, 0x8366, 0x22D3, 0x8367, 0x8371, 0x28DA,
+ 0x8372, 0x8372, 0x1F81, 0x8373, 0x8377, 0x28E5, 0x8378, 0x8378, 0x2210,
+ 0x8379, 0x8379, 0x28EA, 0x837A, 0x837A, 0x22CF, 0x837B, 0x837B, 0x28EB,
+ 0x837C, 0x837C, 0x2213, 0x837D, 0x837D, 0x28EC, 0x837E, 0x837E, 0x1FE4,
+ 0x8380, 0x8380, 0x1F90, 0x8381, 0x8385, 0x28ED, 0x8386, 0x8386, 0x22D6,
+ 0x8387, 0x8388, 0x28F2, 0x8389, 0x8389, 0x22D0, 0x838A, 0x838A, 0x22CE,
+ 0x838B, 0x838C, 0x28F4, 0x838D, 0x838D, 0x2681, 0x838E, 0x8393, 0x28F6,
+ 0x8394, 0x8394, 0x1E76, 0x8395, 0x839D, 0x28FC, 0x839E, 0x839E, 0x2231,
+ 0x839F, 0x83A5, 0x2905, 0x83A6, 0x83A6, 0x1E93, 0x83A7, 0x83AA, 0x290C,
+ 0x83AB, 0x83AB, 0x22D2, 0x83AC, 0x83AD, 0x2910, 0x83AE, 0x83AE, 0x22D7,
+ 0x83AF, 0x83AF, 0x22D5, 0x83B0, 0x83B0, 0x22D1, 0x83B1, 0x83B9, 0x2912,
+ 0x83BA, 0x83BA, 0x1EE5, 0x83BB, 0x83C8, 0x291B, 0x83C9, 0x83C9, 0x2025,
+ 0x83CA, 0x83F5, 0x2929, 0x83F6, 0x83F6, 0x1ECF, 0x83F7, 0x83FE, 0x2955,
+ 0x8440, 0x844F, 0x295D, 0x8450, 0x8450, 0x1FD9, 0x8451, 0x8470, 0x296D,
+ 0x8471, 0x8471, 0x22C8, 0x8472, 0x8473, 0x298D, 0x8474, 0x8474, 0x2263,
+ 0x8475, 0x8476, 0x298F, 0x8477, 0x8477, 0x2683, 0x8478, 0x847E, 0x2991,
+ 0x8480, 0x8481, 0x2998, 0x8482, 0x8482, 0x1F17, 0x8483, 0x848D, 0x299A,
+ 0x848E, 0x848E, 0x1F2B, 0x848F, 0x8491, 0x29A5, 0x8492, 0x8492, 0x22CA,
+ 0x8493, 0x8493, 0x1E99, 0x8494, 0x849C, 0x29A8, 0x849D, 0x849D, 0x1F4F,
+ 0x849E, 0x84A0, 0x29B1, 0x84A1, 0x84A1, 0x1FCF, 0x84A2, 0x84A2, 0x2036,
+ 0x84A3, 0x84A3, 0x1F3A, 0x84A4, 0x84A4, 0x29B4, 0x84A5, 0x84A5, 0x22C9,
+ 0x84A6, 0x84A6, 0x1F99, 0x84A7, 0x84A8, 0x29B5, 0x84A9, 0x84A9, 0x1F75,
+ 0x84AA, 0x84C4, 0x29B7, 0x84C5, 0x84C5, 0x1FBE, 0x84C6, 0x84D2, 0x29D2,
+ 0x84D3, 0x84D3, 0x1ECD, 0x84D4, 0x84D4, 0x29DF, 0x84D5, 0x84D5, 0x21A9,
+ 0x84D6, 0x84D6, 0x29E0, 0x84D7, 0x84D7, 0x21E6, 0x84D8, 0x84D8, 0x29E1,
+ 0x84D9, 0x84D9, 0x2127, 0x84DA, 0x84DA, 0x2003, 0x84DB, 0x84DC, 0x29E2,
+ 0x84DD, 0x84DD, 0x2132, 0x84DE, 0x84E9, 0x29E4, 0x84EA, 0x84EA, 0x2323,
+ 0x84EB, 0x84ED, 0x29F0, 0x84EE, 0x84EE, 0x2011, 0x84EF, 0x84F0, 0x29F3,
+ 0x84F1, 0x84F1, 0x20F5, 0x84F2, 0x84FE, 0x29F5, 0x8540, 0x8550, 0x2A02,
+ 0x8551, 0x8551, 0x22C5, 0x8552, 0x8552, 0x1F5E, 0x8553, 0x8553, 0x2A13,
+ 0x8554, 0x8554, 0x22C6, 0x8555, 0x855D, 0x2A14, 0x855E, 0x855E, 0x20EF,
+ 0x855F, 0x8565, 0x2A1D, 0x8566, 0x8566, 0x21D0, 0x8567, 0x857E, 0x2A24,
+ 0x8580, 0x8586, 0x2A3C, 0x8587, 0x8587, 0x22C1, 0x8588, 0x858A, 0x2A43,
+ 0x858B, 0x858B, 0x1E64, 0x858C, 0x8591, 0x2A46, 0x8592, 0x8592, 0x21F9,
+ 0x8593, 0x8595, 0x2A4C, 0x8596, 0x8596, 0x2010, 0x8597, 0x8597, 0x2A4F,
+ 0x8598, 0x8598, 0x22C2, 0x8599, 0x85A1, 0x2A50, 0x85A2, 0x85A2, 0x1E5A,
+ 0x85A3, 0x85B1, 0x2A59, 0x85B2, 0x85B2, 0x1EA2, 0x85B3, 0x85FE, 0x2A68,
+ 0x8640, 0x8649, 0x2AB4, 0x864A, 0x864A, 0x236D, 0x864B, 0x8653, 0x2ABE,
+ 0x8654, 0x8654, 0x2247, 0x8655, 0x8667, 0x2AC7, 0x8668, 0x8668, 0x236C,
+ 0x8669, 0x867E, 0x2ADA, 0x8680, 0x8695, 0x2AF0, 0x8696, 0x8696, 0x219C,
+ 0x8697, 0x8698, 0x2B06, 0x8699, 0x8699, 0x20C9, 0x869A, 0x86A0, 0x2B08,
+ 0x86A1, 0x86A1, 0x21F0, 0x86A2, 0x86C9, 0x2B0F, 0x86CA, 0x86CA, 0x210B,
+ 0x86CB, 0x86CB, 0x2B37, 0x86CC, 0x86CC, 0x20DE, 0x86CD, 0x86CD, 0x2B38,
+ 0x86CE, 0x86CE, 0x1EAA, 0x86CF, 0x86D0, 0x2B39, 0x86D1, 0x86D1, 0x222C,
+ 0x86D2, 0x86DB, 0x2B3B, 0x86DC, 0x86DC, 0x20D8, 0x86DD, 0x86DD, 0x22C0,
+ 0x86DE, 0x86E0, 0x2B45, 0x86E1, 0x86E1, 0x206F, 0x86E2, 0x86E7, 0x2B48,
+ 0x86E8, 0x86E8, 0x21A1, 0x86E9, 0x86ED, 0x2B4E, 0x86EE, 0x86EE, 0x2379,
+ 0x86EF, 0x86F3, 0x2B53, 0x86F4, 0x86F4, 0x2372, 0x86F5, 0x86FE, 0x2B58,
+ 0x8740, 0x8740, 0x216A, 0x8741, 0x8743, 0x2B62, 0x8744, 0x8744, 0x237C,
+ 0x8745, 0x8748, 0x2B65, 0x8749, 0x8749, 0x20B0, 0x874A, 0x874A, 0x2B69,
+ 0x874B, 0x874B, 0x237A, 0x874C, 0x874C, 0x1E74, 0x874D, 0x874E, 0x2B6A,
+ 0x874F, 0x874F, 0x2377, 0x8750, 0x8756, 0x2B6C, 0x8757, 0x8757, 0x1F4C,
+ 0x8758, 0x8759, 0x2B73, 0x875A, 0x875A, 0x2378, 0x875B, 0x875B, 0x21CF,
+ 0x875C, 0x875C, 0x2368, 0x875D, 0x875D, 0x2B75, 0x875E, 0x875E, 0x2371,
+ 0x875F, 0x875F, 0x2B76, 0x8760, 0x8760, 0x2369, 0x8761, 0x8765, 0x2B77,
+ 0x8766, 0x8766, 0x2674, 0x8767, 0x8779, 0x2B7C, 0x877A, 0x877A, 0x236F,
+ 0x877B, 0x877C, 0x2B8F, 0x877D, 0x877D, 0x2370, 0x877E, 0x877E, 0x2B91,
+ 0x8780, 0x8780, 0x2B92, 0x8781, 0x8781, 0x2376, 0x8782, 0x8782, 0x2373,
+ 0x8783, 0x8785, 0x2B93, 0x8786, 0x8786, 0x237F, 0x8787, 0x8787, 0x2B96,
+ 0x8788, 0x8788, 0x2374, 0x8789, 0x8789, 0x2B97, 0x878A, 0x878A, 0x20B5,
+ 0x878B, 0x878C, 0x2B98, 0x878D, 0x878D, 0x1EDB, 0x878E, 0x878E, 0x2672,
+ 0x878F, 0x8792, 0x2B9A, 0x8793, 0x8793, 0x236E, 0x8794, 0x8797, 0x2B9E,
+ 0x8798, 0x8798, 0x21B7, 0x8799, 0x879C, 0x2BA2, 0x879D, 0x879D, 0x2375,
+ 0x879E, 0x87A2, 0x2BA6, 0x87A3, 0x87A3, 0x2382, 0x87A4, 0x87A6, 0x2BAB,
+ 0x87A7, 0x87A7, 0x209E, 0x87A8, 0x87B2, 0x2BAE, 0x87B3, 0x87B3, 0x236B,
+ 0x87B4, 0x87B4, 0x2BB9, 0x87B5, 0x87B5, 0x2039, 0x87B6, 0x87BA, 0x2BBA,
+ 0x87BB, 0x87BB, 0x269F, 0x87BC, 0x87BE, 0x2BBF, 0x87BF, 0x87BF, 0x237D,
+ 0x87C0, 0x87C0, 0x21F5, 0x87C1, 0x87C1, 0x2BC2, 0x87C2, 0x87C2, 0x2381,
+ 0x87C3, 0x87C9, 0x2BC3, 0x87CA, 0x87CA, 0x237B, 0x87CB, 0x87CB, 0x237E,
+ 0x87CC, 0x87CC, 0x21CC, 0x87CD, 0x87CE, 0x2BCA, 0x87CF, 0x87CF, 0x22DB,
+ 0x87D0, 0x87D1, 0x2BCC, 0x87D2, 0x87D2, 0x236A, 0x87D3, 0x87D3, 0x2689,
+ 0x87D4, 0x87D4, 0x2BCE, 0x87D5, 0x87D5, 0x2697, 0x87D6, 0x87D9, 0x2BCF,
+ 0x87DA, 0x87DA, 0x22A1, 0x87DB, 0x87F6, 0x2BD3, 0x87F7, 0x87F7, 0x2383,
+ 0x87F8, 0x87F8, 0x1F3D, 0x87F9, 0x87F9, 0x2BEF, 0x87FA, 0x87FA, 0x218F,
+ 0x87FB, 0x87FE, 0x2BF0, 0x8840, 0x8840, 0x2246, 0x8841, 0x8841, 0x2248,
+ 0x8842, 0x8843, 0x2BF4, 0x8844, 0x8844, 0x217E, 0x8845, 0x8845, 0x2BF6,
+ 0x8846, 0x8846, 0x2180, 0x8847, 0x887E, 0x2BF7, 0x8880, 0x88B9, 0x2C2F,
+ 0x88BA, 0x88BA, 0x232A, 0x88BB, 0x88CB, 0x2C69, 0x88CC, 0x88CC, 0x228B,
+ 0x88CD, 0x88D3, 0x2C7A, 0x88D4, 0x88D4, 0x1F85, 0x88D5, 0x88D6, 0x2C81,
+ 0x88D7, 0x88D7, 0x2325, 0x88D8, 0x88DE, 0x2C83, 0x88DF, 0x88DF, 0x232C,
+ 0x88E0, 0x88E4, 0x2C8A, 0x88E5, 0x88E5, 0x232E, 0x88E6, 0x88F1, 0x2C8F,
+ 0x88F2, 0x88F2, 0x2205, 0x88F3, 0x88F3, 0x1E38, 0x88F4, 0x88F5, 0x2C9B,
+ 0x88F6, 0x88F6, 0x1E73, 0x88F7, 0x88FE, 0x2C9D, 0x8940, 0x894A, 0x2CA5,
+ 0x894B, 0x894B, 0x1FE3, 0x894C, 0x894C, 0x2339, 0x894D, 0x894D, 0x2CB0,
+ 0x894E, 0x894E, 0x232B, 0x894F, 0x894F, 0x2CB1, 0x8950, 0x8950, 0x232D,
+ 0x8951, 0x8953, 0x2CB2, 0x8954, 0x8954, 0x217F, 0x8955, 0x895C, 0x2CB5,
+ 0x895D, 0x895D, 0x21A7, 0x895E, 0x895E, 0x2CBD, 0x895F, 0x895F, 0x232F,
+ 0x8960, 0x896C, 0x2CBE, 0x896D, 0x896D, 0x1E7D, 0x896E, 0x8970, 0x2CCB,
+ 0x8971, 0x8971, 0x20D6, 0x8972, 0x897B, 0x2CCE, 0x897C, 0x897C, 0x1EC2,
+ 0x897D, 0x897E, 0x2CD8, 0x8980, 0x898A, 0x2CDA, 0x898B, 0x898B, 0x22B2,
+ 0x898C, 0x8998, 0x2CE5, 0x8999, 0x8999, 0x1EDF, 0x899A, 0x899D, 0x2CF2,
+ 0x899E, 0x899E, 0x1EF9, 0x899F, 0x89A5, 0x2CF6, 0x89A6, 0x89A6, 0x20D9,
+ 0x89A7, 0x89A7, 0x2CFD, 0x89A8, 0x89A8, 0x1FDD, 0x89A9, 0x89AE, 0x2CFE,
+ 0x89AF, 0x89AF, 0x2167, 0x89B0, 0x89B9, 0x2D04, 0x89BA, 0x89BA, 0x21ED,
+ 0x89BB, 0x89BD, 0x2D0E, 0x89BE, 0x89BE, 0x2007, 0x89BF, 0x89BF, 0x2326,
+ 0x89C0, 0x89C0, 0x2329, 0x89C1, 0x89C3, 0x2D11, 0x89C4, 0x89C4, 0x1F52,
+ 0x89C5, 0x89C5, 0x203B, 0x89C6, 0x89C6, 0x2328, 0x89C7, 0x89C7, 0x2D14,
+ 0x89C8, 0x89C8, 0x2327, 0x89C9, 0x89CD, 0x2D15, 0x89CE, 0x89CE, 0x1E2B,
+ 0x89CF, 0x89D0, 0x2D1A, 0x89D1, 0x89D1, 0x22AE, 0x89D2, 0x89D7, 0x2D1C,
+ 0x89D8, 0x89D8, 0x1F49, 0x89D9, 0x89DA, 0x2D22, 0x89DB, 0x89DB, 0x2138,
+ 0x89DC, 0x89F3, 0x2D24, 0x89F4, 0x89F4, 0x2081, 0x89F5, 0x89FE, 0x2D3C,
+ 0x8A40, 0x8A40, 0x2D46, 0x8A41, 0x8A41, 0x1F7C, 0x8A42, 0x8A58, 0x2D47,
+ 0x8A59, 0x8A59, 0x235B, 0x8A5A, 0x8A5A, 0x1EDE, 0x8A5B, 0x8A5B, 0x2D5E,
+ 0x8A5C, 0x8A5C, 0x1FA2, 0x8A5D, 0x8A5D, 0x2D5F, 0x8A5E, 0x8A5E, 0x1EFA,
+ 0x8A5F, 0x8A78, 0x2D60, 0x8A79, 0x8A79, 0x22AD, 0x8A7A, 0x8A7E, 0x2D7A,
+ 0x8A80, 0x8AE3, 0x2D7F, 0x8AE4, 0x8AE4, 0x203F, 0x8AE5, 0x8AFE, 0x2DE3,
+ 0x8B40, 0x8B43, 0x2DFD, 0x8B44, 0x8B44, 0x1F0E, 0x8B45, 0x8B48, 0x2E01,
+ 0x8B49, 0x8B49, 0x23F9, 0x8B4A, 0x8B79, 0x2E05, 0x8B7A, 0x8B7A, 0x23FC,
+ 0x8B7B, 0x8B7E, 0x2E35, 0x8B80, 0x8B8B, 0x2E39, 0x8B8C, 0x8B8C, 0x2069,
+ 0x8B8D, 0x8B9D, 0x2E45, 0x8B9E, 0x8B9E, 0x23F7, 0x8B9F, 0x8BB2, 0x2E56,
+ 0x8BB3, 0x8BB3, 0x23F6, 0x8BB4, 0x8BB8, 0x2E6A, 0x8BB9, 0x8BB9, 0x23FD,
+ 0x8BBA, 0x8BBD, 0x2E6F, 0x8BBE, 0x8BBE, 0x23F8, 0x8BBF, 0x8BC5, 0x2E73,
+ 0x8BC6, 0x8BC6, 0x23FA, 0x8BC7, 0x8BC7, 0x2E7A, 0x8BC8, 0x8BC8, 0x23FE,
+ 0x8BC9, 0x8BC9, 0x1FA8, 0x8BCA, 0x8BD3, 0x2E7B, 0x8BD4, 0x8BD4, 0x2401,
+ 0x8BD5, 0x8BDB, 0x2E85, 0x8BDC, 0x8BDC, 0x23FF, 0x8BDD, 0x8BE4, 0x2E8C,
+ 0x8BE5, 0x8BE5, 0x2400, 0x8BE6, 0x8BEA, 0x2E94, 0x8BEB, 0x8BEB, 0x2221,
+ 0x8BEC, 0x8BEF, 0x2E99, 0x8BF0, 0x8BF0, 0x2122, 0x8BF1, 0x8BFE, 0x2E9D,
+ 0x8C40, 0x8C43, 0x2EAB, 0x8C44, 0x8C44, 0x23FB, 0x8C45, 0x8C4E, 0x2EAF,
+ 0x8C4F, 0x8C4F, 0x215A, 0x8C50, 0x8C56, 0x2EB9, 0x8C57, 0x8C57, 0x21E5,
+ 0x8C58, 0x8C5B, 0x2EC0, 0x8C5C, 0x8C5C, 0x2057, 0x8C5D, 0x8C7E, 0x2EC4,
+ 0x8C80, 0x8C8A, 0x2EE6, 0x8C8B, 0x8C8B, 0x20E5, 0x8C8C, 0x8C8C, 0x2EF1,
+ 0x8C8D, 0x8C8D, 0x212F, 0x8C8E, 0x8C8E, 0x20A3, 0x8C8F, 0x8C8F, 0x2121,
+ 0x8C90, 0x8C90, 0x2EF2, 0x8C91, 0x8C91, 0x21D4, 0x8C92, 0x8C92, 0x1FE5,
+ 0x8C93, 0x8C98, 0x2EF3, 0x8C99, 0x8C99, 0x1E8A, 0x8C9A, 0x8C9A, 0x1E37,
+ 0x8C9B, 0x8CA1, 0x2EF9, 0x8CA2, 0x8CA2, 0x1F9E, 0x8CA3, 0x8CA3, 0x22A6,
+ 0x8CA4, 0x8CA4, 0x21E8, 0x8CA5, 0x8CA5, 0x2F00, 0x8CA6, 0x8CA6, 0x1EDA,
+ 0x8CA7, 0x8CA7, 0x1EB9, 0x8CA8, 0x8CBF, 0x2F01, 0x8CC0, 0x8CC0, 0x235C,
+ 0x8CC1, 0x8CD1, 0x2F19, 0x8CD2, 0x8CD2, 0x2050, 0x8CD3, 0x8CD3, 0x1E67,
+ 0x8CD4, 0x8CD4, 0x2F2A, 0x8CD5, 0x8CD5, 0x23F4, 0x8CD6, 0x8CD8, 0x2F2B,
+ 0x8CD9, 0x8CD9, 0x213E, 0x8CDA, 0x8CF8, 0x2F2E, 0x8CF9, 0x8CF9, 0x1F16,
+ 0x8CFA, 0x8CFE, 0x2F4D, 0x8D40, 0x8D72, 0x2F52, 0x8D73, 0x8D73, 0x2389,
+ 0x8D74, 0x8D74, 0x2F85, 0x8D75, 0x8D75, 0x1EB7, 0x8D76, 0x8D7A, 0x2F86,
+ 0x8D7B, 0x8D7B, 0x21B4, 0x8D7C, 0x8D7E, 0x2F8B, 0x8D80, 0x8D87, 0x2F8E,
+ 0x8D88, 0x8D88, 0x238F, 0x8D89, 0x8D8E, 0x2F96, 0x8D8F, 0x8D8F, 0x1F1A,
+ 0x8D90, 0x8D9D, 0x2F9C, 0x8D9E, 0x8D9E, 0x238B, 0x8D9F, 0x8DB8, 0x2FAA,
+ 0x8DB9, 0x8DB9, 0x238A, 0x8DBA, 0x8DE1, 0x2FC4, 0x8DE2, 0x8DE2, 0x2391,
+ 0x8DE3, 0x8DE3, 0x2FEC, 0x8DE4, 0x8DE4, 0x2271, 0x8DE5, 0x8DE6, 0x2FED,
+ 0x8DE7, 0x8DE7, 0x2388, 0x8DE8, 0x8DF6, 0x2FEF, 0x8DF7, 0x8DF7, 0x238E,
+ 0x8DF8, 0x8DFD, 0x2FFE, 0x8DFE, 0x8DFE, 0x238D, 0x8E40, 0x8E45, 0x3004,
+ 0x8E46, 0x8E46, 0x238C, 0x8E47, 0x8E55, 0x300A, 0x8E56, 0x8E56, 0x2390,
+ 0x8E57, 0x8E57, 0x3019, 0x8E58, 0x8E58, 0x2033, 0x8E59, 0x8E59, 0x301A,
+ 0x8E5A, 0x8E5A, 0x223C, 0x8E5B, 0x8E67, 0x301B, 0x8E68, 0x8E68, 0x1FE9,
+ 0x8E69, 0x8E6D, 0x3028, 0x8E6E, 0x8E6E, 0x2055, 0x8E6F, 0x8E6F, 0x302D,
+ 0x8E70, 0x8E70, 0x2392, 0x8E71, 0x8E7E, 0x302E, 0x8E80, 0x8E80, 0x2324,
+ 0x8E81, 0x8E9A, 0x303C, 0x8E9B, 0x8E9B, 0x2143, 0x8E9C, 0x8E9E, 0x3056,
+ 0x8E9F, 0x8E9F, 0x2129, 0x8EA0, 0x8EA3, 0x3059, 0x8EA4, 0x8EA4, 0x2277,
+ 0x8EA5, 0x8EA6, 0x305D, 0x8EA7, 0x8EA7, 0x1EA7, 0x8EA8, 0x8EAB, 0x305F,
+ 0x8EAC, 0x8EAC, 0x2285, 0x8EAD, 0x8EAD, 0x3063, 0x8EAE, 0x8EAE, 0x2384,
+ 0x8EAF, 0x8EBC, 0x3064, 0x8EBD, 0x8EBD, 0x2387, 0x8EBE, 0x8EBE, 0x2386,
+ 0x8EBF, 0x8EC2, 0x3072, 0x8EC3, 0x8EC3, 0x2290, 0x8EC4, 0x8EC4, 0x3076,
+ 0x8EC5, 0x8EC5, 0x1E44, 0x8EC6, 0x8ECC, 0x3077, 0x8ECD, 0x8ECD, 0x1E32,
+ 0x8ECE, 0x8ECE, 0x2385, 0x8ECF, 0x8ED5, 0x307E, 0x8ED6, 0x8ED6, 0x1F13,
+ 0x8ED7, 0x8ED7, 0x1F73, 0x8ED8, 0x8EEB, 0x3085, 0x8EEC, 0x8EEC, 0x1FE0,
+ 0x8EED, 0x8EFE, 0x3099, 0x8F40, 0x8F51, 0x30AB, 0x8F52, 0x8F52, 0x2087,
+ 0x8F53, 0x8F53, 0x1E78, 0x8F54, 0x8F54, 0x23AE, 0x8F55, 0x8F55, 0x1EF6,
+ 0x8F56, 0x8F56, 0x1F31, 0x8F57, 0x8F5C, 0x30BD, 0x8F5D, 0x8F5D, 0x2045,
+ 0x8F5E, 0x8F63, 0x30C3, 0x8F64, 0x8F64, 0x2178, 0x8F65, 0x8F7E, 0x30C9,
+ 0x8F80, 0x8F85, 0x30E3, 0x8F86, 0x8F86, 0x23F5, 0x8F87, 0x8F87, 0x30E9,
+ 0x8F88, 0x8F88, 0x2275, 0x8F89, 0x8F94, 0x30EA, 0x8F95, 0x8F95, 0x266E,
+ 0x8F96, 0x8F96, 0x30F6, 0x8F97, 0x8F97, 0x1EB0, 0x8F98, 0x8F9A, 0x30F7,
+ 0x8F9B, 0x8F9B, 0x2083, 0x8F9C, 0x8F9C, 0x30FA, 0x8F9D, 0x8F9D, 0x2188,
+ 0x8F9E, 0x8FA0, 0x30FB, 0x8FA1, 0x8FA1, 0x267C, 0x8FA2, 0x8FBC, 0x30FE,
+ 0x8FBD, 0x8FBD, 0x1FC5, 0x8FBE, 0x8FC3, 0x3119, 0x8FC4, 0x8FC4, 0x1EA1,
+ 0x8FC5, 0x8FC5, 0x311F, 0x8FC6, 0x8FC6, 0x2393, 0x8FC7, 0x8FCC, 0x3120,
+ 0x8FCD, 0x8FCD, 0x1F0B, 0x8FCE, 0x8FD7, 0x3126, 0x8FD8, 0x8FD8, 0x1E7C,
+ 0x8FD9, 0x8FFE, 0x3130, 0x9040, 0x907E, 0x3156, 0x9080, 0x909C, 0x3195,
+ 0x909D, 0x909D, 0x23B4, 0x909E, 0x909E, 0x207E, 0x909F, 0x90B9, 0x31B2,
+ 0x90BA, 0x90BA, 0x1EE3, 0x90BB, 0x90BF, 0x31CD, 0x90C0, 0x90C0, 0x2095,
+ 0x90C1, 0x90C1, 0x23BB, 0x90C2, 0x90C4, 0x31D2, 0x90C5, 0x90C5, 0x23B9,
+ 0x90C6, 0x90DA, 0x31D5, 0x90DB, 0x90DB, 0x1E28, 0x90DC, 0x90DC, 0x23BD,
+ 0x90DD, 0x90EC, 0x31EA, 0x90ED, 0x90ED, 0x23B5, 0x90EE, 0x90EF, 0x31FA,
+ 0x90F0, 0x90F0, 0x23BA, 0x90F1, 0x90F6, 0x31FC, 0x90F7, 0x90F7, 0x23B3,
+ 0x90F8, 0x90FE, 0x3202, 0x9140, 0x9141, 0x3209, 0x9142, 0x9142, 0x2162,
+ 0x9143, 0x914A, 0x320B, 0x914B, 0x914B, 0x1E5E, 0x914C, 0x914C, 0x3213,
+ 0x914D, 0x914D, 0x1E5D, 0x914E, 0x9150, 0x3214, 0x9151, 0x9151, 0x23B7,
+ 0x9152, 0x9153, 0x3217, 0x9154, 0x9154, 0x1F2F, 0x9155, 0x9155, 0x24DF,
+ 0x9156, 0x9158, 0x3219, 0x9159, 0x9159, 0x23B2, 0x915A, 0x915A, 0x214E,
+ 0x915B, 0x915C, 0x321C, 0x915D, 0x915D, 0x2052, 0x915E, 0x9160, 0x321E,
+ 0x9161, 0x9161, 0x23BC, 0x9162, 0x9162, 0x3221, 0x9163, 0x9163, 0x20EB,
+ 0x9164, 0x916D, 0x3222, 0x916E, 0x916E, 0x2232, 0x916F, 0x9175, 0x322C,
+ 0x9176, 0x9176, 0x1E3F, 0x9177, 0x9179, 0x3233, 0x917A, 0x917A, 0x201B,
+ 0x917B, 0x917B, 0x20BC, 0x917C, 0x917C, 0x23BE, 0x917D, 0x917E, 0x3236,
+ 0x9180, 0x9183, 0x3238, 0x9184, 0x9184, 0x1EAE, 0x9185, 0x918C, 0x323C,
+ 0x918D, 0x918D, 0x1EFB, 0x918E, 0x9190, 0x3244, 0x9191, 0x9191, 0x2089,
+ 0x9192, 0x9192, 0x3247, 0x9193, 0x9193, 0x23B1, 0x9194, 0x9196, 0x3248,
+ 0x9197, 0x9197, 0x21C4, 0x9198, 0x919A, 0x324B, 0x919B, 0x919B, 0x2214,
+ 0x919C, 0x91A8, 0x324E, 0x91A9, 0x91A9, 0x1FDE, 0x91AA, 0x91AA, 0x2223,
+ 0x91AB, 0x91AB, 0x23B6, 0x91AC, 0x91B9, 0x325B, 0x91BA, 0x91BA, 0x268C,
+ 0x91BB, 0x91BB, 0x24DE, 0x91BC, 0x91BE, 0x3269, 0x91BF, 0x91BF, 0x24E0,
+ 0x91C0, 0x91C2, 0x326C, 0x91C3, 0x91C3, 0x23B8, 0x91C4, 0x91CC, 0x326F,
+ 0x91CD, 0x91CD, 0x1E81, 0x91CE, 0x91CF, 0x3278, 0x91D0, 0x91D0, 0x1FFE,
+ 0x91D1, 0x91D1, 0x1F51, 0x91D2, 0x91D2, 0x21E1, 0x91D3, 0x91D3, 0x327A,
+ 0x91D4, 0x91D4, 0x23B0, 0x91D5, 0x91D5, 0x327B, 0x91D6, 0x91D6, 0x1FCE,
+ 0x91D7, 0x91D7, 0x327C, 0x91D8, 0x91D8, 0x211E, 0x91D9, 0x91D9, 0x2021,
+ 0x91DA, 0x91DE, 0x327D, 0x91DF, 0x91DF, 0x24E1, 0x91E0, 0x91E1, 0x3282,
+ 0x91E2, 0x91E2, 0x24A3, 0x91E3, 0x91E9, 0x3284, 0x91EA, 0x91EA, 0x24A4,
+ 0x91EB, 0x91EF, 0x328B, 0x91F0, 0x91F0, 0x2273, 0x91F1, 0x91F1, 0x3290,
+ 0x91F2, 0x91F2, 0x21B0, 0x91F3, 0x91FE, 0x3291, 0x9240, 0x927E, 0x329D,
+ 0x9280, 0x92B5, 0x32DC, 0x92B6, 0x92B6, 0x21D1, 0x92B7, 0x92CD, 0x3312,
+ 0x92CE, 0x92CE, 0x211C, 0x92CF, 0x92CF, 0x3329, 0x92D0, 0x92D0, 0x235D,
+ 0x92D1, 0x92D3, 0x332A, 0x92D4, 0x92D4, 0x2682, 0x92D5, 0x92DE, 0x332D,
+ 0x92DF, 0x92DF, 0x210D, 0x92E0, 0x92E0, 0x205A, 0x92E1, 0x92FD, 0x3337,
+ 0x92FE, 0x92FE, 0x1F8D, 0x9340, 0x934F, 0x3354, 0x9350, 0x9350, 0x21FF,
+ 0x9351, 0x935C, 0x3364, 0x935D, 0x935D, 0x1F58, 0x935E, 0x936F, 0x3370,
+ 0x9370, 0x9370, 0x215B, 0x9371, 0x9375, 0x3382, 0x9376, 0x9376, 0x1EB6,
+ 0x9377, 0x937E, 0x3387, 0x9380, 0x938B, 0x338F, 0x938C, 0x938C, 0x20DB,
+ 0x938D, 0x939C, 0x339B, 0x939D, 0x939D, 0x2360, 0x939E, 0x93A4, 0x33AB,
+ 0x93A5, 0x93A5, 0x2361, 0x93A6, 0x93A6, 0x33B2, 0x93A7, 0x93A7, 0x2040,
+ 0x93A8, 0x93B3, 0x33B3, 0x93B4, 0x93B4, 0x228E, 0x93B5, 0x93B7, 0x33BF,
+ 0x93B8, 0x93B8, 0x1FDF, 0x93B9, 0x93BA, 0x33C2, 0x93BB, 0x93BB, 0x235E,
+ 0x93BC, 0x93BC, 0x33C4, 0x93BD, 0x93BD, 0x1E6A, 0x93BE, 0x93C5, 0x33C5,
+ 0x93C6, 0x93C6, 0x2002, 0x93C7, 0x93CE, 0x33CD, 0x93CF, 0x93CF, 0x2093,
+ 0x93D0, 0x93D6, 0x33D5, 0x93D7, 0x93D7, 0x235F, 0x93D8, 0x93DA, 0x33DC,
+ 0x93DB, 0x93DB, 0x1EAC, 0x93DC, 0x93DC, 0x1E54, 0x93DD, 0x93E0, 0x33DF,
+ 0x93E1, 0x93E1, 0x1F08, 0x93E2, 0x93E3, 0x33E3, 0x93E4, 0x93E4, 0x20C0,
+ 0x93E5, 0x93E5, 0x2362, 0x93E6, 0x93E8, 0x33E5, 0x93E9, 0x93E9, 0x2160,
+ 0x93EA, 0x93EA, 0x33E8, 0x93EB, 0x93EB, 0x219D, 0x93EC, 0x93EC, 0x1F8E,
+ 0x93ED, 0x93ED, 0x222D, 0x93EE, 0x93EE, 0x33E9, 0x93EF, 0x93EF, 0x2047,
+ 0x93F0, 0x93F0, 0x33EA, 0x93F1, 0x93F1, 0x2262, 0x93F2, 0x93F3, 0x33EB,
+ 0x93F4, 0x93F4, 0x1F67, 0x93F5, 0x93F5, 0x1EB2, 0x93F6, 0x93F9, 0x33ED,
+ 0x93FA, 0x93FA, 0x1EA9, 0x93FB, 0x93FD, 0x33F1, 0x93FE, 0x93FE, 0x1FCC,
+ 0x9440, 0x9443, 0x33F4, 0x9444, 0x9444, 0x1F72, 0x9445, 0x944C, 0x33F8,
+ 0x944D, 0x944D, 0x2098, 0x944E, 0x944F, 0x3400, 0x9450, 0x9450, 0x1E52,
+ 0x9451, 0x9451, 0x20A4, 0x9452, 0x9452, 0x1F1C, 0x9453, 0x9453, 0x228F,
+ 0x9454, 0x9454, 0x3402, 0x9455, 0x9455, 0x1FED, 0x9456, 0x9457, 0x3403,
+ 0x9458, 0x9458, 0x2365, 0x9459, 0x945A, 0x3405, 0x945B, 0x945B, 0x1E2D,
+ 0x945C, 0x945C, 0x2152, 0x945D, 0x945D, 0x2366, 0x945E, 0x945E, 0x3407,
+ 0x945F, 0x945F, 0x20FA, 0x9460, 0x9463, 0x3408, 0x9464, 0x9464, 0x2363,
+ 0x9465, 0x9465, 0x340C, 0x9466, 0x9466, 0x209A, 0x9467, 0x946D, 0x340D,
+ 0x946E, 0x946E, 0x203C, 0x946F, 0x9471, 0x3414, 0x9472, 0x9472, 0x1FF6,
+ 0x9473, 0x9473, 0x3417, 0x9474, 0x9474, 0x2364, 0x9475, 0x9475, 0x3418,
+ 0x9476, 0x9476, 0x1E69, 0x9477, 0x9477, 0x3419, 0x9478, 0x9478, 0x2367,
+ 0x9479, 0x9479, 0x341A, 0x947A, 0x947A, 0x211D, 0x947B, 0x947E, 0x341B,
+ 0x9480, 0x9480, 0x2259, 0x9481, 0x9481, 0x2056, 0x9482, 0x9482, 0x2163,
+ 0x9483, 0x9486, 0x341F, 0x9487, 0x9487, 0x1FA9, 0x9488, 0x9488, 0x1FFC,
+ 0x9489, 0x94A0, 0x3423, 0x94A1, 0x94A1, 0x1E2E, 0x94A2, 0x94B2, 0x343B,
+ 0x94B3, 0x94B3, 0x1EBC, 0x94B4, 0x94B4, 0x344C, 0x94B5, 0x94B5, 0x2142,
+ 0x94B6, 0x94BE, 0x344D, 0x94BF, 0x94BF, 0x201E, 0x94C0, 0x94C0, 0x1E43,
+ 0x94C1, 0x94CB, 0x3456, 0x94CC, 0x94CC, 0x24D4, 0x94CD, 0x94D7, 0x3461,
+ 0x94D8, 0x94D8, 0x226F, 0x94D9, 0x94DF, 0x346C, 0x94E0, 0x94E0, 0x1ED7,
+ 0x94E1, 0x94FE, 0x3473, 0x9540, 0x9571, 0x3491, 0x9572, 0x9572, 0x212D,
+ 0x9573, 0x957E, 0x34C3, 0x9580, 0x9582, 0x34CF, 0x9583, 0x9583, 0x229B,
+ 0x9584, 0x959D, 0x34D2, 0x959E, 0x959E, 0x2256, 0x959F, 0x959F, 0x24A8,
+ 0x95A0, 0x95B2, 0x34EC, 0x95B3, 0x95B3, 0x1E79, 0x95B4, 0x95B9, 0x34FF,
+ 0x95BA, 0x95BA, 0x225A, 0x95BB, 0x95CE, 0x3505, 0x95CF, 0x95CF, 0x24A7,
+ 0x95D0, 0x95D0, 0x3519, 0x95D1, 0x95D1, 0x2686, 0x95D2, 0x95D2, 0x24A6,
+ 0x95D3, 0x95D3, 0x351A, 0x95D4, 0x95D4, 0x21CE, 0x95D5, 0x95E0, 0x351B,
+ 0x95E1, 0x95E1, 0x24A9, 0x95E2, 0x95E6, 0x3527, 0x95E7, 0x95E7, 0x1FE7,
+ 0x95E8, 0x95F0, 0x352C, 0x95F1, 0x95F1, 0x2112, 0x95F2, 0x95F7, 0x3535,
+ 0x95F8, 0x95F8, 0x213C, 0x95F9, 0x95FD, 0x353B, 0x95FE, 0x95FE, 0x1F5C,
+ 0x9640, 0x9655, 0x3540, 0x9656, 0x9656, 0x24C4, 0x9657, 0x967B, 0x3556,
+ 0x967C, 0x967C, 0x1ECC, 0x967D, 0x967E, 0x357B, 0x9680, 0x96FE, 0x357D,
+ 0x9740, 0x9766, 0x35FC, 0x9767, 0x9767, 0x246A, 0x9768, 0x976B, 0x3623,
+ 0x976C, 0x976C, 0x2175, 0x976D, 0x976D, 0x3627, 0x976E, 0x976E, 0x246D,
+ 0x976F, 0x977E, 0x3628, 0x9780, 0x9795, 0x3638, 0x9796, 0x9796, 0x246B,
+ 0x9797, 0x9797, 0x225F, 0x9798, 0x979C, 0x364E, 0x979D, 0x979D, 0x1ECE,
+ 0x979E, 0x97A2, 0x3653, 0x97A3, 0x97A3, 0x2272, 0x97A4, 0x97BE, 0x3658,
+ 0x97BF, 0x97BF, 0x2473, 0x97C0, 0x97ED, 0x3673, 0x97EE, 0x97EE, 0x21FE,
+ 0x97EF, 0x97F6, 0x36A1, 0x97F7, 0x97F7, 0x1EFE, 0x97F8, 0x97FE, 0x36A9,
+ 0x9840, 0x9844, 0x36B0, 0x9845, 0x9845, 0x2475, 0x9846, 0x9848, 0x36B5,
+ 0x9849, 0x9849, 0x220A, 0x984A, 0x984E, 0x36B8, 0x984F, 0x984F, 0x1F6F,
+ 0x9850, 0x9870, 0x36BD, 0x9871, 0x9871, 0x2468, 0x9872, 0x9872, 0x36DE,
+ 0x9873, 0x9873, 0x2100, 0x9874, 0x987E, 0x36DF, 0x9880, 0x9880, 0x36EA,
+ 0x9881, 0x9881, 0x2476, 0x9882, 0x988A, 0x36EB, 0x988B, 0x988B, 0x1F27,
+ 0x988C, 0x988C, 0x20D7, 0x988D, 0x989F, 0x36F4, 0x98A0, 0x98A0, 0x247C,
+ 0x98A1, 0x98A9, 0x3707, 0x98AA, 0x98AA, 0x1FA1, 0x98AB, 0x98B5, 0x3710,
+ 0x98B6, 0x98B6, 0x22AA, 0x98B7, 0x98B7, 0x2005, 0x98B8, 0x98B9, 0x371B,
+ 0x98BA, 0x98BA, 0x246C, 0x98BB, 0x98C6, 0x371D, 0x98C7, 0x98C7, 0x203E,
+ 0x98C8, 0x98CA, 0x3729, 0x98CB, 0x98CB, 0x1E4C, 0x98CC, 0x98CF, 0x372C,
+ 0x98D0, 0x98D0, 0x213A, 0x98D1, 0x98D2, 0x3730, 0x98D3, 0x98D3, 0x2204,
+ 0x98D4, 0x98E2, 0x3732, 0x98E3, 0x98E3, 0x20C3, 0x98E4, 0x98E4, 0x2140,
+ 0x98E5, 0x98E5, 0x2477, 0x98E6, 0x98EE, 0x3741, 0x98EF, 0x98EF, 0x2474,
+ 0x98F0, 0x98F1, 0x374A, 0x98F2, 0x98F2, 0x20DD, 0x98F3, 0x98FE, 0x374C,
+ 0x9940, 0x9942, 0x3758, 0x9943, 0x9943, 0x1F68, 0x9944, 0x9944, 0x375B,
+ 0x9945, 0x9945, 0x2185, 0x9946, 0x9965, 0x375C, 0x9966, 0x9966, 0x2472,
+ 0x9967, 0x996D, 0x377C, 0x996E, 0x996E, 0x1EB5, 0x996F, 0x9974, 0x3783,
+ 0x9975, 0x9975, 0x2478, 0x9976, 0x9979, 0x3789, 0x997A, 0x997A, 0x1F8B,
+ 0x997B, 0x997B, 0x2484, 0x997C, 0x997E, 0x378D, 0x9980, 0x9984, 0x3790,
+ 0x9985, 0x9985, 0x2699, 0x9986, 0x9988, 0x3795, 0x9989, 0x9989, 0x2482,
+ 0x998A, 0x998D, 0x3798, 0x998E, 0x998E, 0x20A1, 0x998F, 0x9990, 0x379C,
+ 0x9991, 0x9991, 0x1F92, 0x9992, 0x9998, 0x379E, 0x9999, 0x9999, 0x1F38,
+ 0x999A, 0x99A8, 0x37A5, 0x99A9, 0x99A9, 0x2485, 0x99AA, 0x99AF, 0x37B4,
+ 0x99B0, 0x99B0, 0x2480, 0x99B1, 0x99B1, 0x246E, 0x99B2, 0x99B2, 0x37BA,
+ 0x99B3, 0x99B3, 0x247B, 0x99B4, 0x99B4, 0x2486, 0x99B5, 0x99B5, 0x2471,
+ 0x99B6, 0x99BC, 0x37BB, 0x99BD, 0x99BD, 0x2483, 0x99BE, 0x99BE, 0x2470,
+ 0x99BF, 0x99BF, 0x37C2, 0x99C0, 0x99C0, 0x2469, 0x99C1, 0x99C1, 0x37C3,
+ 0x99C2, 0x99C2, 0x247F, 0x99C3, 0x99C8, 0x37C4, 0x99C9, 0x99C9, 0x246F,
+ 0x99CA, 0x99CD, 0x37CA, 0x99CE, 0x99CE, 0x2481, 0x99CF, 0x99D0, 0x37CE,
+ 0x99D1, 0x99D1, 0x2220, 0x99D2, 0x99D9, 0x37D0, 0x99DA, 0x99DA, 0x1FF5,
+ 0x99DB, 0x99DF, 0x37D8, 0x99E0, 0x99E0, 0x20F4, 0x99E1, 0x99E4, 0x37DD,
+ 0x99E5, 0x99E5, 0x247D, 0x99E6, 0x99E7, 0x37E1, 0x99E8, 0x99E8, 0x2479,
+ 0x99E9, 0x99EB, 0x37E3, 0x99EC, 0x99EC, 0x247E, 0x99ED, 0x99F3, 0x37E6,
+ 0x99F4, 0x99F4, 0x247A, 0x99F5, 0x99FE, 0x37ED, 0x9A40, 0x9A49, 0x37F7,
+ 0x9A4A, 0x9A4A, 0x20E3, 0x9A4B, 0x9A56, 0x3801, 0x9A57, 0x9A57, 0x20AD,
+ 0x9A58, 0x9A64, 0x380D, 0x9A65, 0x9A65, 0x24CB, 0x9A66, 0x9A66, 0x381A,
+ 0x9A67, 0x9A67, 0x1F53, 0x9A68, 0x9A70, 0x381B, 0x9A71, 0x9A71, 0x2159,
+ 0x9A72, 0x9A75, 0x3824, 0x9A76, 0x9A76, 0x2013, 0x9A77, 0x9A77, 0x1F33,
+ 0x9A78, 0x9A7E, 0x3828, 0x9A80, 0x9A87, 0x382F, 0x9A88, 0x9A88, 0x1E5C,
+ 0x9A89, 0x9A8B, 0x3837, 0x9A8C, 0x9A8C, 0x2488, 0x9A8D, 0x9A90, 0x383A,
+ 0x9A91, 0x9A91, 0x2487, 0x9A92, 0x9A96, 0x383E, 0x9A97, 0x9A97, 0x248A,
+ 0x9A98, 0x9A99, 0x3843, 0x9A9A, 0x9A9A, 0x2489, 0x9A9B, 0x9A9B, 0x248B,
+ 0x9A9C, 0x9A9D, 0x3845, 0x9A9E, 0x9A9E, 0x1F83, 0x9A9F, 0x9AA1, 0x3847,
+ 0x9AA2, 0x9AA2, 0x210F, 0x9AA3, 0x9AA3, 0x1FDB, 0x9AA4, 0x9AA9, 0x384A,
+ 0x9AAA, 0x9AAA, 0x20AF, 0x9AAB, 0x9ACF, 0x3850, 0x9AD0, 0x9AD0, 0x24C0,
+ 0x9AD1, 0x9AD5, 0x3875, 0x9AD6, 0x9AD6, 0x226D, 0x9AD7, 0x9AD9, 0x387A,
+ 0x9ADA, 0x9ADA, 0x24C1, 0x9ADB, 0x9AE1, 0x387D, 0x9AE2, 0x9AE2, 0x20CA,
+ 0x9AE3, 0x9AE3, 0x3884, 0x9AE4, 0x9AE4, 0x20E7, 0x9AE5, 0x9AE5, 0x24C2,
+ 0x9AE6, 0x9AFE, 0x3885, 0x9B40, 0x9B7E, 0x389E, 0x9B80, 0x9BD0, 0x38DD,
+ 0x9BD1, 0x9BD1, 0x23DC, 0x9BD2, 0x9BDB, 0x392E, 0x9BDC, 0x9BDC, 0x23DB,
+ 0x9BDD, 0x9BFE, 0x3938, 0x9C40, 0x9C52, 0x395A, 0x9C53, 0x9C53, 0x205E,
+ 0x9C54, 0x9C58, 0x396D, 0x9C59, 0x9C59, 0x2244, 0x9C5A, 0x9C5A, 0x23E2,
+ 0x9C5B, 0x9C5B, 0x3972, 0x9C5C, 0x9C5C, 0x20D4, 0x9C5D, 0x9C74, 0x3973,
+ 0x9C75, 0x9C75, 0x219F, 0x9C76, 0x9C78, 0x398B, 0x9C79, 0x9C79, 0x1E66,
+ 0x9C7A, 0x9C7E, 0x398E, 0x9C80, 0x9C85, 0x3993, 0x9C86, 0x9C86, 0x1F63,
+ 0x9C87, 0x9C9C, 0x3999, 0x9C9D, 0x9C9D, 0x23DD, 0x9C9E, 0x9CAA, 0x39AF,
+ 0x9CAB, 0x9CAB, 0x216B, 0x9CAC, 0x9CC9, 0x39BC, 0x9CCA, 0x9CCA, 0x22B5,
+ 0x9CCB, 0x9CCE, 0x39DA, 0x9CCF, 0x9CCF, 0x1F26, 0x9CD0, 0x9CE5, 0x39DE,
+ 0x9CE6, 0x9CE6, 0x1E63, 0x9CE7, 0x9CE7, 0x2088, 0x9CE8, 0x9CEB, 0x39F4,
+ 0x9CEC, 0x9CEC, 0x1EBD, 0x9CED, 0x9CED, 0x39F8, 0x9CEE, 0x9CEE, 0x2341,
+ 0x9CEF, 0x9CFA, 0x39F9, 0x9CFB, 0x9CFB, 0x1F4B, 0x9CFC, 0x9CFD, 0x3A05,
+ 0x9CFE, 0x9CFE, 0x2292, 0x9D40, 0x9D41, 0x3A07, 0x9D42, 0x9D42, 0x2124,
+ 0x9D43, 0x9D45, 0x3A09, 0x9D46, 0x9D46, 0x2048, 0x9D47, 0x9D47, 0x23E0,
+ 0x9D48, 0x9D4C, 0x3A0C, 0x9D4D, 0x9D4D, 0x2077, 0x9D4E, 0x9D4E, 0x3A11,
+ 0x9D4F, 0x9D4F, 0x223A, 0x9D50, 0x9D60, 0x3A12, 0x9D61, 0x9D61, 0x20B1,
+ 0x9D62, 0x9D67, 0x3A23, 0x9D68, 0x9D68, 0x1F41, 0x9D69, 0x9D69, 0x201C,
+ 0x9D6A, 0x9D6D, 0x3A29, 0x9D6E, 0x9D6E, 0x22B8, 0x9D6F, 0x9D70, 0x3A2D,
+ 0x9D71, 0x9D71, 0x2276, 0x9D72, 0x9D74, 0x3A2F, 0x9D75, 0x9D75, 0x1F9B,
+ 0x9D76, 0x9D7A, 0x3A32, 0x9D7B, 0x9D7B, 0x1F9F, 0x9D7C, 0x9D7C, 0x3A37,
+ 0x9D7D, 0x9D7D, 0x25CA, 0x9D7E, 0x9D7E, 0x3A38, 0x9D80, 0x9D89, 0x3A39,
+ 0x9D8A, 0x9D8A, 0x20BE, 0x9D8B, 0x9D8C, 0x3A43, 0x9D8D, 0x9D8D, 0x1FB4,
+ 0x9D8E, 0x9D90, 0x3A45, 0x9D91, 0x9D91, 0x23D7, 0x9D92, 0x9D98, 0x3A48,
+ 0x9D99, 0x9D99, 0x2105, 0x9D9A, 0x9DA0, 0x3A4F, 0x9DA1, 0x9DA1, 0x23E1,
+ 0x9DA2, 0x9DA2, 0x1FEC, 0x9DA3, 0x9DA6, 0x3A56, 0x9DA7, 0x9DA7, 0x23EA,
+ 0x9DA8, 0x9DAB, 0x3A5A, 0x9DAC, 0x9DAC, 0x23E3, 0x9DAD, 0x9DAD, 0x210E,
+ 0x9DAE, 0x9DB1, 0x3A5E, 0x9DB2, 0x9DB2, 0x1FA6, 0x9DB3, 0x9DB3, 0x2004,
+ 0x9DB4, 0x9DBD, 0x3A62, 0x9DBE, 0x9DBE, 0x1F9D, 0x9DBF, 0x9DC5, 0x3A6C,
+ 0x9DC6, 0x9DC6, 0x23E5, 0x9DC7, 0x9DC8, 0x3A73, 0x9DC9, 0x9DC9, 0x2264,
+ 0x9DCA, 0x9DCC, 0x3A75, 0x9DCD, 0x9DCD, 0x24E2, 0x9DCE, 0x9DD1, 0x3A78,
+ 0x9DD2, 0x9DD2, 0x23DE, 0x9DD3, 0x9DD4, 0x3A7C, 0x9DD5, 0x9DD5, 0x1EC4,
+ 0x9DD6, 0x9DE0, 0x3A7E, 0x9DE1, 0x9DE1, 0x22B6, 0x9DE2, 0x9DE2, 0x20A9,
+ 0x9DE3, 0x9DF0, 0x3A89, 0x9DF1, 0x9DF1, 0x212B, 0x9DF2, 0x9DF3, 0x3A97,
+ 0x9DF4, 0x9DF4, 0x20A5, 0x9DF5, 0x9DF6, 0x3A99, 0x9DF7, 0x9DF7, 0x268B,
+ 0x9DF8, 0x9DF9, 0x3A9B, 0x9DFA, 0x9DFA, 0x1F76, 0x9DFB, 0x9DFC, 0x3A9D,
+ 0x9DFD, 0x9DFD, 0x216D, 0x9DFE, 0x9DFE, 0x3A9F, 0x9E40, 0x9E44, 0x3AA0,
+ 0x9E45, 0x9E45, 0x2001, 0x9E46, 0x9E47, 0x3AA5, 0x9E48, 0x9E48, 0x2191,
+ 0x9E49, 0x9E49, 0x1E50, 0x9E4A, 0x9E51, 0x3AA7, 0x9E52, 0x9E52, 0x1F9C,
+ 0x9E53, 0x9E53, 0x3AAF, 0x9E54, 0x9E54, 0x23DA, 0x9E55, 0x9E55, 0x3AB0,
+ 0x9E56, 0x9E56, 0x2053, 0x9E57, 0x9E5C, 0x3AB1, 0x9E5D, 0x9E5D, 0x23E9,
+ 0x9E5E, 0x9E5E, 0x23E4, 0x9E5F, 0x9E60, 0x3AB7, 0x9E61, 0x9E61, 0x21D5,
+ 0x9E62, 0x9E62, 0x3AB9, 0x9E63, 0x9E63, 0x23E6, 0x9E64, 0x9E66, 0x3ABA,
+ 0x9E67, 0x9E67, 0x23DF, 0x9E68, 0x9E6B, 0x3ABD, 0x9E6C, 0x9E6C, 0x1E4F,
+ 0x9E6D, 0x9E6E, 0x3AC1, 0x9E6F, 0x9E6F, 0x23D9, 0x9E70, 0x9E71, 0x3AC3,
+ 0x9E72, 0x9E72, 0x2014, 0x9E73, 0x9E73, 0x3AC5, 0x9E74, 0x9E74, 0x23EC,
+ 0x9E75, 0x9E75, 0x23EB, 0x9E76, 0x9E7A, 0x3AC6, 0x9E7B, 0x9E7B, 0x23D8,
+ 0x9E7C, 0x9E7C, 0x23EE, 0x9E7D, 0x9E7E, 0x3ACB, 0x9E80, 0x9E84, 0x3ACD,
+ 0x9E85, 0x9E85, 0x268E, 0x9E86, 0x9E86, 0x3AD2, 0x9E87, 0x9E87, 0x23ED,
+ 0x9E88, 0x9E90, 0x3AD3, 0x9E91, 0x9E91, 0x1FFA, 0x9E92, 0x9E95, 0x3ADC,
+ 0x9E96, 0x9E96, 0x23D6, 0x9E97, 0x9E97, 0x23E8, 0x9E98, 0x9EA1, 0x3AE0,
+ 0x9EA2, 0x9EA2, 0x2106, 0x9EA3, 0x9EA5, 0x3AEA, 0x9EA6, 0x9EA6, 0x200B,
+ 0x9EA7, 0x9EA8, 0x3AED, 0x9EA9, 0x9EA9, 0x2166, 0x9EAA, 0x9EAD, 0x3AEF,
+ 0x9EAE, 0x9EAE, 0x23EF, 0x9EAF, 0x9EB2, 0x3AF3, 0x9EB3, 0x9EB3, 0x2189,
+ 0x9EB4, 0x9EB4, 0x2058, 0x9EB5, 0x9EB6, 0x3AF7, 0x9EB7, 0x9EB7, 0x23E7,
+ 0x9EB8, 0x9EF4, 0x3AF9, 0x9EF5, 0x9EF5, 0x21A3, 0x9EF6, 0x9EFE, 0x3B36,
+ 0x9F40, 0x9F4D, 0x3B3F, 0x9F4E, 0x9F4E, 0x217A, 0x9F4F, 0x9F6E, 0x3B4D,
+ 0x9F6F, 0x9F6F, 0x21A5, 0x9F70, 0x9F7E, 0x3B6D, 0x9F80, 0x9F91, 0x3B7C,
+ 0x9F92, 0x9F92, 0x2022, 0x9F93, 0x9F97, 0x3B8E, 0x9F98, 0x9F98, 0x24D6,
+ 0x9F99, 0x9FA5, 0x3B93, 0x9FA6, 0x9FA6, 0x233A, 0x9FA7, 0x9FA8, 0x3BA0,
+ 0x9FA9, 0x9FA9, 0x1EEE, 0x9FAA, 0x9FAB, 0x3BA2, 0x9FAC, 0x9FAC, 0x24D5,
+ 0x9FAD, 0x9FC8, 0x3BA4, 0x9FC9, 0x9FC9, 0x2228, 0x9FCA, 0x9FCC, 0x3BC0,
+ 0x9FCD, 0x9FCD, 0x24D7, 0x9FCE, 0x9FE0, 0x3BC3, 0x9FE1, 0x9FE1, 0x20FC,
+ 0x9FE2, 0x9FEA, 0x3BD6, 0x9FEB, 0x9FEB, 0x1E87, 0x9FEC, 0x9FED, 0x3BDF,
+ 0x9FEE, 0x9FEE, 0x24D8, 0x9FEF, 0x9FF3, 0x3BE1, 0x9FF4, 0x9FF4, 0x1EBA,
+ 0x9FF5, 0x9FFC, 0x3BE6, 0x9FFD, 0x9FFD, 0x2119, 0x9FFE, 0x9FFE, 0x3BEE,
+ 0xA040, 0xA042, 0x3BEF, 0xA043, 0xA043, 0x216C, 0xA044, 0xA045, 0x3BF2,
+ 0xA046, 0xA046, 0x24D9, 0xA047, 0xA048, 0x3BF4, 0xA049, 0xA049, 0x2227,
+ 0xA04A, 0xA04D, 0x3BF6, 0xA04E, 0xA04E, 0x1E5F, 0xA04F, 0xA053, 0x3BFA,
+ 0xA054, 0xA054, 0x229F, 0xA055, 0xA059, 0x3BFF, 0xA05A, 0xA05A, 0x1F5D,
+ 0xA05B, 0xA060, 0x3C04, 0xA061, 0xA061, 0x1FBC, 0xA062, 0xA062, 0x3C0A,
+ 0xA063, 0xA063, 0x24DA, 0xA064, 0xA070, 0x3C0B, 0xA071, 0xA071, 0x2149,
+ 0xA072, 0xA073, 0x3C18, 0xA074, 0xA074, 0x2046, 0xA075, 0xA07E, 0x3C1A,
+ 0xA080, 0xA080, 0x2000, 0xA081, 0xA090, 0x3C24, 0xA091, 0xA091, 0x2190,
+ 0xA092, 0xA093, 0x3C34, 0xA094, 0xA094, 0x2208, 0xA095, 0xA095, 0x3C36,
+ 0xA096, 0xA096, 0x1EE6, 0xA097, 0xA0A8, 0x3C37, 0xA0A9, 0xA0A9, 0x24C3,
+ 0xA0AA, 0xA0BE, 0x3C49, 0xA0BF, 0xA0BF, 0x20CC, 0xA0C0, 0xA0CD, 0x3C5E,
+ 0xA0CE, 0xA0CE, 0x2340, 0xA0CF, 0xA0D8, 0x3C6C, 0xA0D9, 0xA0D9, 0x1ED1,
+ 0xA0DA, 0xA0DD, 0x3C76, 0xA0DE, 0xA0DE, 0x21AC, 0xA0DF, 0xA0ED, 0x3C7A,
+ 0xA0EE, 0xA0EE, 0x22AF, 0xA0EF, 0xA0FE, 0x3C89, 0xA1A1, 0xA1FE, 0x0060,
+ 0xA2A1, 0xA2AA, 0x26A9, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
+ 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
+ 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
+ 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA840, 0xA87E, 0x26B3,
+ 0xA880, 0xA895, 0x26F2, 0xA8A1, 0xA8C0, 0x029C, 0xA8C5, 0xA8EA, 0x02BC,
+ 0xA940, 0xA957, 0x2708, 0xA959, 0xA95A, 0x2720, 0xA95C, 0xA95C, 0x2722,
+ 0xA960, 0xA97E, 0x2723, 0xA980, 0xA995, 0x2742, 0xA996, 0xA996, 0x1E17,
+ 0xA9A4, 0xA9EF, 0x02E2, 0xAA40, 0xAA4C, 0x3C99, 0xAA4D, 0xAA4D, 0x21B6,
+ 0xAA4E, 0xAA4E, 0x1E3D, 0xAA4F, 0xAA70, 0x3CA6, 0xAA71, 0xAA71, 0x2235,
+ 0xAA72, 0xAA72, 0x3CC8, 0xAA73, 0xAA73, 0x2397, 0xAA74, 0xAA76, 0x3CC9,
+ 0xAA77, 0xAA77, 0x2395, 0xAA78, 0xAA79, 0x3CCC, 0xAA7A, 0xAA7A, 0x223F,
+ 0xAA7B, 0xAA7B, 0x212A, 0xAA7C, 0xAA7E, 0x3CCE, 0xAA80, 0xAA99, 0x3CD1,
+ 0xAA9A, 0xAA9A, 0x1ED2, 0xAA9B, 0xAA9B, 0x3CEB, 0xAA9C, 0xAA9C, 0x2396,
+ 0xAA9D, 0xAA9D, 0x2398, 0xAA9E, 0xAA9E, 0x3CEC, 0xAA9F, 0xAA9F, 0x20A2,
+ 0xAAA0, 0xAAA0, 0x3CED, 0xAAA1, 0xAAFE, 0x032E, 0xAB40, 0xAB40, 0x1F64,
+ 0xAB41, 0xAB42, 0x3CEE, 0xAB43, 0xAB43, 0x202B, 0xAB44, 0xAB44, 0x3CF0,
+ 0xAB45, 0xAB45, 0x2394, 0xAB46, 0xAB46, 0x2139, 0xAB47, 0xAB47, 0x3CF1,
+ 0xAB48, 0xAB48, 0x215F, 0xAB49, 0xAB49, 0x21C1, 0xAB4A, 0xAB4A, 0x239A,
+ 0xAB4B, 0xAB4C, 0x3CF2, 0xAB4D, 0xAB4D, 0x2399, 0xAB4E, 0xAB7E, 0x3CF4,
+ 0xAB80, 0xABA0, 0x3D25, 0xABA1, 0xABC0, 0x038C, 0xAC40, 0xAC45, 0x3D46,
+ 0xAC46, 0xAC46, 0x21C0, 0xAC47, 0xAC70, 0x3D4C, 0xAC71, 0xAC71, 0x2460,
+ 0xAC72, 0xAC7B, 0x3D76, 0xAC7C, 0xAC7C, 0x245C, 0xAC7D, 0xAC7E, 0x3D80,
+ 0xAC80, 0xAC8C, 0x3D82, 0xAC8D, 0xAC8D, 0x215D, 0xAC8E, 0xAC92, 0x3D8F,
+ 0xAC93, 0xAC93, 0x2225, 0xAC94, 0xAC94, 0x206A, 0xAC95, 0xACA0, 0x3D94,
+ 0xAD40, 0xAD48, 0x3DA0, 0xAD49, 0xAD49, 0x2461, 0xAD4A, 0xAD5D, 0x3DA9,
+ 0xAD5E, 0xAD5E, 0x245B, 0xAD5F, 0xAD60, 0x3DBD, 0xAD61, 0xAD61, 0x2462,
+ 0xAD62, 0xAD67, 0x3DBF, 0xAD68, 0xAD68, 0x1F54, 0xAD69, 0xAD73, 0x3DC5,
+ 0xAD74, 0xAD74, 0x245F, 0xAD75, 0xAD7E, 0x3DD0, 0xAD80, 0xAD81, 0x3DDA,
+ 0xAD82, 0xAD82, 0x20EC, 0xAD83, 0xAD86, 0x3DDC, 0xAD87, 0xAD87, 0x245D,
+ 0xAD88, 0xAD8A, 0x3DE0, 0xAD8B, 0xAD8B, 0x2463, 0xAD8C, 0xAD90, 0x3DE3,
+ 0xAD91, 0xAD91, 0x2464, 0xAD92, 0xADA0, 0x3DE8, 0xAE40, 0xAE53, 0x3DF7,
+ 0xAE54, 0xAE54, 0x24A5, 0xAE55, 0xAE61, 0x3E0B, 0xAE62, 0xAE62, 0x1E70,
+ 0xAE63, 0xAE7E, 0x3E18, 0xAE80, 0xAE80, 0x208F, 0xAE81, 0xAE84, 0x3E34,
+ 0xAE85, 0xAE85, 0x1E42, 0xAE86, 0xAE8A, 0x3E38, 0xAE8B, 0xAE8B, 0x1F4E,
+ 0xAE8C, 0xAE93, 0x3E3D, 0xAE94, 0xAE94, 0x1EB1, 0xAE95, 0xAE9F, 0x3E45,
+ 0xAEA0, 0xAEA0, 0x1E8B, 0xAF40, 0xAF63, 0x3E50, 0xAF64, 0xAF64, 0x1FC6,
+ 0xAF65, 0xAF7A, 0x3E74, 0xAF7B, 0xAF7B, 0x25AE, 0xAF7C, 0xAF7E, 0x3E8A,
+ 0xAF80, 0xAF81, 0x3E8D, 0xAF82, 0xAF82, 0x1F01, 0xAF83, 0xAF83, 0x2200,
+ 0xAF84, 0xAF8D, 0x3E8F, 0xAF8E, 0xAF8E, 0x25B2, 0xAF8F, 0xAF8F, 0x1E97,
+ 0xAF90, 0xAF90, 0x3E99, 0xAF91, 0xAF91, 0x20AB, 0xAF92, 0xAF9B, 0x3E9A,
+ 0xAF9C, 0xAF9C, 0x25B3, 0xAF9D, 0xAF9E, 0x3EA4, 0xAF9F, 0xAF9F, 0x2028,
+ 0xAFA0, 0xAFA0, 0x3EA6, 0xB040, 0xB040, 0x3EA7, 0xB041, 0xB042, 0x25AF,
+ 0xB043, 0xB043, 0x3EA8, 0xB044, 0xB044, 0x25B1, 0xB045, 0xB04E, 0x3EA9,
+ 0xB04F, 0xB04F, 0x25AC, 0xB050, 0xB053, 0x3EB3, 0xB054, 0xB054, 0x1E4E,
+ 0xB055, 0xB056, 0x3EB7, 0xB057, 0xB057, 0x2202, 0xB058, 0xB058, 0x25AB,
+ 0xB059, 0xB059, 0x2286, 0xB05A, 0xB05A, 0x3EB9, 0xB05B, 0xB05B, 0x25AD,
+ 0xB05C, 0xB05C, 0x3EBA, 0xB05D, 0xB05D, 0x25B6, 0xB05E, 0xB05E, 0x3EBB,
+ 0xB05F, 0xB05F, 0x21E3, 0xB060, 0xB061, 0x25B4, 0xB062, 0xB062, 0x222F,
+ 0xB063, 0xB063, 0x2165, 0xB064, 0xB064, 0x25B7, 0xB065, 0xB06B, 0x3EBC,
+ 0xB06C, 0xB06C, 0x1EE9, 0xB06D, 0xB07C, 0x3EC3, 0xB07D, 0xB07D, 0x1E25,
+ 0xB07E, 0xB07E, 0x3ED3, 0xB080, 0xB096, 0x3ED4, 0xB097, 0xB097, 0x25C0,
+ 0xB098, 0xB098, 0x3EEB, 0xB099, 0xB099, 0x229A, 0xB09A, 0xB0A0, 0x3EEC,
+ 0xB0A1, 0xB0FE, 0x03AC, 0xB140, 0xB14A, 0x3EF3, 0xB14B, 0xB14B, 0x226E,
+ 0xB14C, 0xB14C, 0x3EFE, 0xB14D, 0xB14D, 0x1FBD, 0xB14E, 0xB14E, 0x3EFF,
+ 0xB14F, 0xB14F, 0x1F84, 0xB150, 0xB150, 0x20B2, 0xB151, 0xB151, 0x3F00,
+ 0xB152, 0xB152, 0x2043, 0xB153, 0xB17E, 0x3F01, 0xB180, 0xB196, 0x3F2D,
+ 0xB197, 0xB197, 0x2684, 0xB198, 0xB1A0, 0x3F44, 0xB1A1, 0xB1FE, 0x040A,
+ 0xB240, 0xB240, 0x3F4D, 0xB241, 0xB241, 0x24EF, 0xB242, 0xB266, 0x3F4E,
+ 0xB267, 0xB267, 0x24EE, 0xB268, 0xB26C, 0x3F73, 0xB26D, 0xB26D, 0x2074,
+ 0xB26E, 0xB273, 0x3F78, 0xB274, 0xB274, 0x2687, 0xB275, 0xB27E, 0x3F7E,
+ 0xB280, 0xB280, 0x24F0, 0xB281, 0xB288, 0x3F88, 0xB289, 0xB289, 0x268D,
+ 0xB28A, 0xB299, 0x3F90, 0xB29A, 0xB29A, 0x22A0, 0xB29B, 0xB2A0, 0x3FA0,
+ 0xB2A1, 0xB2FE, 0x0468, 0xB340, 0xB342, 0x3FA6, 0xB343, 0xB343, 0x1FAB,
+ 0xB344, 0xB36F, 0x3FA9, 0xB370, 0xB370, 0x26A8, 0xB371, 0xB37E, 0x3FD5,
+ 0xB380, 0xB387, 0x3FE3, 0xB388, 0xB388, 0x24E9, 0xB389, 0xB38B, 0x3FEB,
+ 0xB38C, 0xB38C, 0x24E5, 0xB38D, 0xB38D, 0x3FEE, 0xB38E, 0xB38E, 0x21FA,
+ 0xB38F, 0xB3A0, 0x3FEF, 0xB3A1, 0xB3FE, 0x04C6, 0xB440, 0xB453, 0x4001,
+ 0xB454, 0xB454, 0x2148, 0xB455, 0xB457, 0x4015, 0xB458, 0xB458, 0x24E4,
+ 0xB459, 0xB45D, 0x4018, 0xB45E, 0xB45E, 0x24E6, 0xB45F, 0xB45F, 0x20F7,
+ 0xB460, 0xB460, 0x401D, 0xB461, 0xB461, 0x206B, 0xB462, 0xB474, 0x401E,
+ 0xB475, 0xB475, 0x22A7, 0xB476, 0xB47D, 0x4031, 0xB47E, 0xB47E, 0x24EC,
+ 0xB480, 0xB482, 0x4039, 0xB483, 0xB483, 0x24EB, 0xB484, 0xB488, 0x403C,
+ 0xB489, 0xB489, 0x24E3, 0xB48A, 0xB492, 0x4041, 0xB493, 0xB493, 0x24EA,
+ 0xB494, 0xB4A0, 0x404A, 0xB4A1, 0xB4FE, 0x0524, 0xB540, 0xB540, 0x4057,
+ 0xB541, 0xB541, 0x1E92, 0xB542, 0xB54A, 0x4058, 0xB54B, 0xB54B, 0x1E27,
+ 0xB54C, 0xB555, 0x4061, 0xB556, 0xB556, 0x1FE6, 0xB557, 0xB559, 0x406B,
+ 0xB55A, 0xB55A, 0x24E7, 0xB55B, 0xB55B, 0x2012, 0xB55C, 0xB55C, 0x1EEC,
+ 0xB55D, 0xB560, 0x406E, 0xB561, 0xB561, 0x24E8, 0xB562, 0xB57E, 0x4072,
+ 0xB580, 0xB59B, 0x408F, 0xB59C, 0xB59C, 0x1F66, 0xB59D, 0xB59D, 0x24DC,
+ 0xB59E, 0xB5A0, 0x40AB, 0xB5A1, 0xB5FE, 0x0582, 0xB640, 0xB651, 0x40AE,
+ 0xB652, 0xB652, 0x26A2, 0xB653, 0xB654, 0x40C0, 0xB655, 0xB655, 0x24DD,
+ 0xB656, 0xB658, 0x40C2, 0xB659, 0xB659, 0x200E, 0xB65A, 0xB65A, 0x40C5,
+ 0xB65B, 0xB65B, 0x24DB, 0xB65C, 0xB65C, 0x1EB8, 0xB65D, 0xB67E, 0x40C6,
+ 0xB680, 0xB6A0, 0x40E8, 0xB6A1, 0xB6FE, 0x05E0, 0xB740, 0xB74D, 0x4109,
+ 0xB74E, 0xB74E, 0x2295, 0xB74F, 0xB750, 0x4117, 0xB751, 0xB751, 0x1E80,
+ 0xB752, 0xB758, 0x4119, 0xB759, 0xB759, 0x2677, 0xB75A, 0xB763, 0x4120,
+ 0xB764, 0xB764, 0x2624, 0xB765, 0xB765, 0x1F69, 0xB766, 0xB766, 0x222B,
+ 0xB767, 0xB776, 0x412A, 0xB777, 0xB777, 0x257F, 0xB778, 0xB778, 0x1F5B,
+ 0xB779, 0xB77E, 0x413A, 0xB780, 0xB780, 0x219B, 0xB781, 0xB781, 0x4140,
+ 0xB782, 0xB782, 0x267D, 0xB783, 0xB7A0, 0x4141, 0xB7A1, 0xB7FE, 0x063E,
+ 0xB840, 0xB842, 0x415F, 0xB843, 0xB843, 0x21A0, 0xB844, 0xB844, 0x2186,
+ 0xB845, 0xB845, 0x4162, 0xB846, 0xB846, 0x20ED, 0xB847, 0xB84C, 0x4163,
+ 0xB84D, 0xB84D, 0x25B9, 0xB84E, 0xB850, 0x4169, 0xB851, 0xB851, 0x1FEA,
+ 0xB852, 0xB859, 0x416C, 0xB85A, 0xB85A, 0x1EA4, 0xB85B, 0xB85B, 0x20E1,
+ 0xB85C, 0xB85C, 0x4174, 0xB85D, 0xB85D, 0x25B8, 0xB85E, 0xB85E, 0x2260,
+ 0xB85F, 0xB85F, 0x4175, 0xB860, 0xB860, 0x20E2, 0xB861, 0xB876, 0x4176,
+ 0xB877, 0xB877, 0x2141, 0xB878, 0xB87E, 0x418C, 0xB880, 0xB881, 0x4193,
+ 0xB882, 0xB882, 0x1FC7, 0xB883, 0xB8A0, 0x4195, 0xB8A1, 0xB8FE, 0x069C,
+ 0xB940, 0xB94F, 0x41B3, 0xB950, 0xB950, 0x1E41, 0xB951, 0xB960, 0x41C3,
+ 0xB961, 0xB961, 0x25E4, 0xB962, 0xB97A, 0x41D3, 0xB97B, 0xB97B, 0x1F86,
+ 0xB97C, 0xB97E, 0x41EC, 0xB980, 0xB99C, 0x41EF, 0xB99D, 0xB99D, 0x1FB3,
+ 0xB99E, 0xB99F, 0x420C, 0xB9A0, 0xB9A0, 0x1EEF, 0xB9A1, 0xB9FE, 0x06FA,
+ 0xBA40, 0xBA41, 0x420E, 0xBA42, 0xBA42, 0x22A4, 0xBA43, 0xBA43, 0x4210,
+ 0xBA44, 0xBA44, 0x25E8, 0xBA45, 0xBA55, 0x4211, 0xBA56, 0xBA56, 0x25E3,
+ 0xBA57, 0xBA58, 0x4222, 0xBA59, 0xBA59, 0x2111, 0xBA5A, 0xBA5F, 0x4224,
+ 0xBA60, 0xBA60, 0x25E6, 0xBA61, 0xBA69, 0x422A, 0xBA6A, 0xBA6A, 0x25E7,
+ 0xBA6B, 0xBA73, 0x4233, 0xBA74, 0xBA74, 0x2041, 0xBA75, 0xBA7E, 0x423C,
+ 0xBA80, 0xBA83, 0x4246, 0xBA84, 0xBA84, 0x25EA, 0xBA85, 0xBA85, 0x424A,
+ 0xBA86, 0xBA86, 0x1F8F, 0xBA87, 0xBA87, 0x424B, 0xBA88, 0xBA88, 0x25EC,
+ 0xBA89, 0xBA8C, 0x424C, 0xBA8D, 0xBA8D, 0x25EB, 0xBA8E, 0xBA9D, 0x4250,
+ 0xBA9E, 0xBA9E, 0x20D0, 0xBA9F, 0xBA9F, 0x201D, 0xBAA0, 0xBAA0, 0x4260,
+ 0xBAA1, 0xBAFE, 0x0758, 0xBB40, 0xBB40, 0x1FF7, 0xBB41, 0xBB48, 0x4261,
+ 0xBB49, 0xBB49, 0x1E8D, 0xBB4A, 0xBB57, 0x4269, 0xBB58, 0xBB58, 0x25E9,
+ 0xBB59, 0xBB5A, 0x4277, 0xBB5B, 0xBB5B, 0x25EE, 0xBB5C, 0xBB5C, 0x203A,
+ 0xBB5D, 0xBB5F, 0x4279, 0xBB60, 0xBB60, 0x2693, 0xBB61, 0xBB64, 0x427C,
+ 0xBB65, 0xBB65, 0x25E5, 0xBB66, 0xBB66, 0x25ED, 0xBB67, 0xBB67, 0x4280,
+ 0xBB68, 0xBB68, 0x2009, 0xBB69, 0xBB69, 0x4281, 0xBB6A, 0xBB6A, 0x2065,
+ 0xBB6B, 0xBB6D, 0x4282, 0xBB6E, 0xBB6E, 0x26A3, 0xBB6F, 0xBB7E, 0x4285,
+ 0xBB80, 0xBBA0, 0x4295, 0xBBA1, 0xBBFE, 0x07B6, 0xBC40, 0xBC51, 0x42B6,
+ 0xBC52, 0xBC52, 0x25F5, 0xBC53, 0xBC53, 0x1EFC, 0xBC54, 0xBC59, 0x42C8,
+ 0xBC5A, 0xBC5A, 0x2024, 0xBC5B, 0xBC60, 0x42CE, 0xBC61, 0xBC61, 0x269B,
+ 0xBC62, 0xBC62, 0x42D4, 0xBC63, 0xBC63, 0x25F3, 0xBC64, 0xBC64, 0x42D5,
+ 0xBC65, 0xBC65, 0x22D9, 0xBC66, 0xBC66, 0x42D6, 0xBC67, 0xBC67, 0x25F4,
+ 0xBC68, 0xBC68, 0x42D7, 0xBC69, 0xBC69, 0x241B, 0xBC6A, 0xBC6C, 0x42D8,
+ 0xBC6D, 0xBC6D, 0x1FC8, 0xBC6E, 0xBC6E, 0x42DB, 0xBC6F, 0xBC6F, 0x1F7B,
+ 0xBC70, 0xBC70, 0x42DC, 0xBC71, 0xBC71, 0x241D, 0xBC72, 0xBC72, 0x42DD,
+ 0xBC73, 0xBC73, 0x224C, 0xBC74, 0xBC74, 0x1F48, 0xBC75, 0xBC75, 0x241C,
+ 0xBC76, 0xBC77, 0x241E, 0xBC78, 0xBC78, 0x20FF, 0xBC79, 0xBC79, 0x219A,
+ 0xBC7A, 0xBC7A, 0x42DE, 0xBC7B, 0xBC7B, 0x2091, 0xBC7C, 0xBC7D, 0x42DF,
+ 0xBC7E, 0xBC7E, 0x20A7, 0xBC80, 0xBC81, 0x42E1, 0xBC82, 0xBC82, 0x2423,
+ 0xBC83, 0xBC83, 0x1E9B, 0xBC84, 0xBC84, 0x2422, 0xBC85, 0xBC85, 0x42E3,
+ 0xBC86, 0xBC86, 0x2110, 0xBC87, 0xBC87, 0x42E4, 0xBC88, 0xBC88, 0x228D,
+ 0xBC89, 0xBC89, 0x1F71, 0xBC8A, 0xBC8A, 0x1EF8, 0xBC8B, 0xBC8B, 0x2421,
+ 0xBC8C, 0xBC8E, 0x42E5, 0xBC8F, 0xBC8F, 0x1EF3, 0xBC90, 0xBC99, 0x42E8,
+ 0xBC9A, 0xBC9A, 0x21B1, 0xBC9B, 0xBC9B, 0x2426, 0xBC9C, 0xBC9C, 0x2425,
+ 0xBC9D, 0xBC9D, 0x2120, 0xBC9E, 0xBCA0, 0x42F2, 0xBCA1, 0xBCFE, 0x0814,
+ 0xBD40, 0xBD41, 0x42F5, 0xBD42, 0xBD42, 0x211A, 0xBD43, 0xBD43, 0x2424,
+ 0xBD44, 0xBD44, 0x42F7, 0xBD45, 0xBD45, 0x2428, 0xBD46, 0xBD47, 0x42F8,
+ 0xBD48, 0xBD48, 0x242A, 0xBD49, 0xBD49, 0x2429, 0xBD4A, 0xBD4A, 0x42FA,
+ 0xBD4B, 0xBD4B, 0x2294, 0xBD4C, 0xBD4C, 0x42FB, 0xBD4D, 0xBD4D, 0x22BE,
+ 0xBD4E, 0xBD4E, 0x42FC, 0xBD4F, 0xBD4F, 0x1E31, 0xBD50, 0xBD56, 0x42FD,
+ 0xBD57, 0xBD57, 0x242C, 0xBD58, 0xBD58, 0x4304, 0xBD59, 0xBD59, 0x1FB5,
+ 0xBD5A, 0xBD65, 0x4305, 0xBD66, 0xBD66, 0x242B, 0xBD67, 0xBD67, 0x1FAF,
+ 0xBD68, 0xBD69, 0x4311, 0xBD6A, 0xBD6A, 0x2068, 0xBD6B, 0xBD6B, 0x21E4,
+ 0xBD6C, 0xBD6E, 0x4313, 0xBD6F, 0xBD6F, 0x1F21, 0xBD70, 0xBD70, 0x4316,
+ 0xBD71, 0xBD71, 0x2101, 0xBD72, 0xBD78, 0x4317, 0xBD79, 0xBD79, 0x217C,
+ 0xBD7A, 0xBD7A, 0x214A, 0xBD7B, 0xBD7B, 0x242D, 0xBD7C, 0xBD7D, 0x431E,
+ 0xBD7E, 0xBD7E, 0x1FD4, 0xBD80, 0xBD80, 0x4320, 0xBD81, 0xBD81, 0x1FD1,
+ 0xBD82, 0xBD88, 0x4321, 0xBD89, 0xBD89, 0x1E33, 0xBD8A, 0xBD8A, 0x4328,
+ 0xBD8B, 0xBD8B, 0x242F, 0xBD8C, 0xBD8D, 0x4329, 0xBD8E, 0xBD8E, 0x242E,
+ 0xBD8F, 0xBD8F, 0x432B, 0xBD90, 0xBD90, 0x2430, 0xBD91, 0xBD91, 0x21DB,
+ 0xBD92, 0xBD96, 0x432C, 0xBD97, 0xBD97, 0x2158, 0xBD98, 0xBD9A, 0x4331,
+ 0xBD9B, 0xBD9B, 0x1FC2, 0xBD9C, 0xBDA0, 0x4334, 0xBDA1, 0xBDFE, 0x0872,
+ 0xBE40, 0xBE42, 0x4339, 0xBE43, 0xBE43, 0x22B9, 0xBE44, 0xBE44, 0x433C,
+ 0xBE45, 0xBE45, 0x2436, 0xBE46, 0xBE48, 0x433D, 0xBE49, 0xBE49, 0x1E8E,
+ 0xBE4A, 0xBE4A, 0x2439, 0xBE4B, 0xBE50, 0x4340, 0xBE51, 0xBE51, 0x21C5,
+ 0xBE52, 0xBE52, 0x2437, 0xBE53, 0xBE53, 0x2192, 0xBE54, 0xBE54, 0x4346,
+ 0xBE55, 0xBE55, 0x243A, 0xBE56, 0xBE56, 0x1F19, 0xBE57, 0xBE57, 0x218C,
+ 0xBE58, 0xBE58, 0x1E40, 0xBE59, 0xBE59, 0x22B3, 0xBE5A, 0xBE5C, 0x4347,
+ 0xBE5D, 0xBE5D, 0x205F, 0xBE5E, 0xBE5E, 0x2438, 0xBE5F, 0xBE5F, 0x2432,
+ 0xBE60, 0xBE60, 0x2274, 0xBE61, 0xBE61, 0x434A, 0xBE62, 0xBE62, 0x1E9C,
+ 0xBE63, 0xBE63, 0x2431, 0xBE64, 0xBE64, 0x2085, 0xBE65, 0xBE68, 0x434B,
+ 0xBE69, 0xBE69, 0x2435, 0xBE6A, 0xBE6B, 0x434F, 0xBE6C, 0xBE6C, 0x243B,
+ 0xBE6D, 0xBE6E, 0x4351, 0xBE6F, 0xBE6F, 0x1FB7, 0xBE70, 0xBE70, 0x2433,
+ 0xBE71, 0xBE75, 0x4353, 0xBE76, 0xBE76, 0x2054, 0xBE77, 0xBE77, 0x21DE,
+ 0xBE78, 0xBE78, 0x4358, 0xBE79, 0xBE79, 0x2434, 0xBE7A, 0xBE7B, 0x4359,
+ 0xBE7C, 0xBE7C, 0x243D, 0xBE7D, 0xBE7D, 0x1F89, 0xBE7E, 0xBE7E, 0x243C,
+ 0xBE80, 0xBE82, 0x435B, 0xBE83, 0xBE83, 0x1F6E, 0xBE84, 0xBE84, 0x1ED8,
+ 0xBE85, 0xBE85, 0x435E, 0xBE86, 0xBE86, 0x1EBF, 0xBE87, 0xBE87, 0x2445,
+ 0xBE88, 0xBE88, 0x435F, 0xBE89, 0xBE89, 0x2249, 0xBE8A, 0xBE8B, 0x4360,
+ 0xBE8C, 0xBE8C, 0x2441, 0xBE8D, 0xBE8D, 0x4362, 0xBE8E, 0xBE8E, 0x1E47,
+ 0xBE8F, 0xBE8F, 0x1F56, 0xBE90, 0xBE91, 0x4363, 0xBE92, 0xBE92, 0x2086,
+ 0xBE93, 0xBE94, 0x4365, 0xBE95, 0xBE95, 0x2196, 0xBE96, 0xBE96, 0x4367,
+ 0xBE97, 0xBE97, 0x2443, 0xBE98, 0xBE98, 0x243F, 0xBE99, 0xBE99, 0x4368,
+ 0xBE9A, 0xBE9A, 0x2023, 0xBE9B, 0xBE9B, 0x4369, 0xBE9C, 0xBE9C, 0x2442,
+ 0xBE9D, 0xBE9E, 0x436A, 0xBE9F, 0xBE9F, 0x243E, 0xBEA0, 0xBEA0, 0x436C,
+ 0xBEA1, 0xBEFE, 0x08D0, 0xBF40, 0xBF40, 0x26A6, 0xBF41, 0xBF4C, 0x436D,
+ 0xBF4D, 0xBF4D, 0x234E, 0xBF4E, 0xBF4E, 0x2446, 0xBF4F, 0xBF4F, 0x244B,
+ 0xBF50, 0xBF50, 0x2444, 0xBF51, 0xBF54, 0x4379, 0xBF55, 0xBF55, 0x2427,
+ 0xBF56, 0xBF56, 0x244C, 0xBF57, 0xBF5F, 0x437D, 0xBF60, 0xBF60, 0x1F0F,
+ 0xBF61, 0xBF61, 0x4386, 0xBF62, 0xBF62, 0x2447, 0xBF63, 0xBF63, 0x2449,
+ 0xBF64, 0xBF64, 0x2448, 0xBF65, 0xBF67, 0x4387, 0xBF68, 0xBF68, 0x21C2,
+ 0xBF69, 0xBF6B, 0x438A, 0xBF6C, 0xBF6C, 0x216E, 0xBF6D, 0xBF6F, 0x438D,
+ 0xBF70, 0xBF70, 0x1F03, 0xBF71, 0xBF71, 0x4390, 0xBF72, 0xBF72, 0x244A,
+ 0xBF73, 0xBF73, 0x215C, 0xBF74, 0xBF75, 0x4391, 0xBF76, 0xBF76, 0x22BB,
+ 0xBF77, 0xBF77, 0x2450, 0xBF78, 0xBF78, 0x4393, 0xBF79, 0xBF79, 0x2694,
+ 0xBF7A, 0xBF7A, 0x244F, 0xBF7B, 0xBF7B, 0x25F6, 0xBF7C, 0xBF7C, 0x2051,
+ 0xBF7D, 0xBF7D, 0x4394, 0xBF7E, 0xBF7E, 0x244E, 0xBF80, 0xBF81, 0x4395,
+ 0xBF82, 0xBF82, 0x22BA, 0xBF83, 0xBF83, 0x1F6D, 0xBF84, 0xBF88, 0x4397,
+ 0xBF89, 0xBF89, 0x2452, 0xBF8A, 0xBF8A, 0x2451, 0xBF8B, 0xBF94, 0x439C,
+ 0xBF95, 0xBF95, 0x2455, 0xBF96, 0xBF96, 0x43A6, 0xBF97, 0xBF97, 0x2289,
+ 0xBF98, 0xBF98, 0x2116, 0xBF99, 0xBF9C, 0x43A7, 0xBF9D, 0xBF9D, 0x2454,
+ 0xBF9E, 0xBFA0, 0x43AB, 0xBFA1, 0xBFFE, 0x092E, 0xC040, 0xC040, 0x20FB,
+ 0xC041, 0xC043, 0x43AE, 0xC044, 0xC044, 0x2440, 0xC045, 0xC04A, 0x43B1,
+ 0xC04B, 0xC04B, 0x2126, 0xC04C, 0xC04C, 0x1F61, 0xC04D, 0xC04D, 0x269D,
+ 0xC04E, 0xC04E, 0x43B7, 0xC04F, 0xC04F, 0x1F8A, 0xC050, 0xC050, 0x2456,
+ 0xC051, 0xC051, 0x2459, 0xC052, 0xC052, 0x2458, 0xC053, 0xC054, 0x43B8,
+ 0xC055, 0xC055, 0x1FAE, 0xC056, 0xC05A, 0x43BA, 0xC05B, 0xC05B, 0x221A,
+ 0xC05C, 0xC05D, 0x43BF, 0xC05E, 0xC05E, 0x1F7A, 0xC05F, 0xC05F, 0x244D,
+ 0xC060, 0xC060, 0x2457, 0xC061, 0xC068, 0x43C1, 0xC069, 0xC069, 0x2453,
+ 0xC06A, 0xC06A, 0x43C9, 0xC06B, 0xC06B, 0x2420, 0xC06C, 0xC06C, 0x43CA,
+ 0xC06D, 0xC06D, 0x21DF, 0xC06E, 0xC06E, 0x2685, 0xC06F, 0xC06F, 0x43CB,
+ 0xC070, 0xC070, 0x1E6E, 0xC071, 0xC073, 0x43CC, 0xC074, 0xC074, 0x2224,
+ 0xC075, 0xC075, 0x2670, 0xC076, 0xC076, 0x43CF, 0xC077, 0xC077, 0x21BA,
+ 0xC078, 0xC078, 0x43D0, 0xC079, 0xC079, 0x245A, 0xC07A, 0xC07B, 0x43D1,
+ 0xC07C, 0xC07C, 0x1FFF, 0xC07D, 0xC07E, 0x43D3, 0xC080, 0xC09A, 0x43D5,
+ 0xC09B, 0xC09B, 0x25E2, 0xC09C, 0xC09C, 0x43F0, 0xC09D, 0xC09D, 0x269A,
+ 0xC09E, 0xC0A0, 0x43F1, 0xC0A1, 0xC0FE, 0x098C, 0xC140, 0xC14F, 0x43F4,
+ 0xC150, 0xC150, 0x1EEA, 0xC151, 0xC153, 0x4404, 0xC154, 0xC154, 0x1E2C,
+ 0xC155, 0xC15E, 0x4407, 0xC15F, 0xC15F, 0x2062, 0xC160, 0xC160, 0x24F1,
+ 0xC161, 0xC161, 0x4411, 0xC162, 0xC162, 0x24F2, 0xC163, 0xC174, 0x4412,
+ 0xC175, 0xC175, 0x25F2, 0xC176, 0xC177, 0x4424, 0xC178, 0xC178, 0x2215,
+ 0xC179, 0xC17E, 0x4426, 0xC180, 0xC194, 0x442C, 0xC195, 0xC195, 0x21AE,
+ 0xC196, 0xC1A0, 0x4441, 0xC1A1, 0xC1FE, 0x09EA, 0xC240, 0xC24D, 0x444C,
+ 0xC24E, 0xC24E, 0x20E0, 0xC24F, 0xC264, 0x445A, 0xC265, 0xC265, 0x25C2,
+ 0xC266, 0xC266, 0x4470, 0xC267, 0xC267, 0x25C1, 0xC268, 0xC27C, 0x4471,
+ 0xC27D, 0xC27D, 0x2128, 0xC27E, 0xC27E, 0x4486, 0xC280, 0xC283, 0x4487,
+ 0xC284, 0xC284, 0x2199, 0xC285, 0xC292, 0x448B, 0xC293, 0xC293, 0x2017,
+ 0xC294, 0xC294, 0x1EA0, 0xC295, 0xC295, 0x2125, 0xC296, 0xC296, 0x214D,
+ 0xC297, 0xC297, 0x4499, 0xC298, 0xC298, 0x25C4, 0xC299, 0xC299, 0x209D,
+ 0xC29A, 0xC29A, 0x228A, 0xC29B, 0xC29B, 0x449A, 0xC29C, 0xC29C, 0x25C3,
+ 0xC29D, 0xC29F, 0x449B, 0xC2A0, 0xC2A0, 0x2179, 0xC2A1, 0xC2FE, 0x0A48,
+ 0xC340, 0xC340, 0x2038, 0xC341, 0xC342, 0x449E, 0xC343, 0xC343, 0x2155,
+ 0xC344, 0xC37A, 0x44A0, 0xC37B, 0xC37B, 0x21D2, 0xC37C, 0xC37E, 0x44D7,
+ 0xC380, 0xC383, 0x44DA, 0xC384, 0xC384, 0x24C7, 0xC385, 0xC39A, 0x44DE,
+ 0xC39B, 0xC39B, 0x2279, 0xC39C, 0xC3A0, 0x44F4, 0xC3A1, 0xC3FE, 0x0AA6,
+ 0xC440, 0xC448, 0x44F9, 0xC449, 0xC449, 0x2123, 0xC44A, 0xC44B, 0x4502,
+ 0xC44C, 0xC44C, 0x24C5, 0xC44D, 0xC453, 0x4504, 0xC454, 0xC454, 0x24C9,
+ 0xC455, 0xC457, 0x450B, 0xC458, 0xC458, 0x2094, 0xC459, 0xC45A, 0x450E,
+ 0xC45B, 0xC45B, 0x2296, 0xC45C, 0xC462, 0x4510, 0xC463, 0xC463, 0x1E77,
+ 0xC464, 0xC476, 0x4517, 0xC477, 0xC477, 0x1F06, 0xC478, 0xC479, 0x452A,
+ 0xC47A, 0xC47A, 0x1FA5, 0xC47B, 0xC47E, 0x452C, 0xC480, 0xC480, 0x4530,
+ 0xC481, 0xC481, 0x2099, 0xC482, 0xC490, 0x4531, 0xC491, 0xC491, 0x1EAD,
+ 0xC492, 0xC492, 0x24C8, 0xC493, 0xC493, 0x20A8, 0xC494, 0xC497, 0x4540,
+ 0xC498, 0xC498, 0x201F, 0xC499, 0xC499, 0x4544, 0xC49A, 0xC49A, 0x20C5,
+ 0xC49B, 0xC49B, 0x4545, 0xC49C, 0xC49C, 0x24CA, 0xC49D, 0xC4A0, 0x4546,
+ 0xC4A1, 0xC4FE, 0x0B04, 0xC540, 0xC543, 0x454A, 0xC544, 0xC544, 0x1FF0,
+ 0xC545, 0xC545, 0x454E, 0xC546, 0xC546, 0x24C6, 0xC547, 0xC54A, 0x454F,
+ 0xC54B, 0xC54B, 0x225D, 0xC54C, 0xC54C, 0x22DE, 0xC54D, 0xC551, 0x4553,
+ 0xC552, 0xC552, 0x202C, 0xC553, 0xC55E, 0x4558, 0xC55F, 0xC55F, 0x2161,
+ 0xC560, 0xC562, 0x4564, 0xC563, 0xC563, 0x223B, 0xC564, 0xC564, 0x21D9,
+ 0xC565, 0xC565, 0x1FCB, 0xC566, 0xC566, 0x1FC9, 0xC567, 0xC57E, 0x4567,
+ 0xC580, 0xC592, 0x457F, 0xC593, 0xC593, 0x1E61, 0xC594, 0xC59B, 0x4592,
+ 0xC59C, 0xC59C, 0x25EF, 0xC59D, 0xC59D, 0x459A, 0xC59E, 0xC59E, 0x1F98,
+ 0xC59F, 0xC5A0, 0x459B, 0xC5A1, 0xC5FE, 0x0B62, 0xC640, 0xC640, 0x459D,
+ 0xC641, 0xC641, 0x25F0, 0xC642, 0xC643, 0x459E, 0xC644, 0xC644, 0x1F88,
+ 0xC645, 0xC646, 0x45A0, 0xC647, 0xC647, 0x21F8, 0xC648, 0xC662, 0x45A2,
+ 0xC663, 0xC663, 0x2322, 0xC664, 0xC671, 0x45BD, 0xC672, 0xC672, 0x2336,
+ 0xC673, 0xC67E, 0x45CB, 0xC680, 0xC6A0, 0x45D7, 0xC6A1, 0xC6FE, 0x0BC0,
+ 0xC740, 0xC765, 0x45F8, 0xC766, 0xC766, 0x22AB, 0xC767, 0xC76E, 0x461E,
+ 0xC76F, 0xC76F, 0x1FBF, 0xC770, 0xC775, 0x4626, 0xC776, 0xC776, 0x1F7D,
+ 0xC777, 0xC77A, 0x462C, 0xC77B, 0xC77B, 0x2333, 0xC77C, 0xC77E, 0x4630,
+ 0xC780, 0xC7A0, 0x4633, 0xC7A1, 0xC7FE, 0x0C1E, 0xC840, 0xC840, 0x4654,
+ 0xC841, 0xC841, 0x1F4D, 0xC842, 0xC84E, 0x4655, 0xC84F, 0xC84F, 0x2334,
+ 0xC850, 0xC851, 0x4662, 0xC852, 0xC852, 0x1FF1, 0xC853, 0xC865, 0x4664,
+ 0xC866, 0xC866, 0x218B, 0xC867, 0xC86D, 0x4677, 0xC86E, 0xC86E, 0x2349,
+ 0xC86F, 0xC87D, 0x467E, 0xC87E, 0xC87E, 0x220B, 0xC880, 0xC886, 0x468D,
+ 0xC887, 0xC887, 0x2346, 0xC888, 0xC891, 0x4694, 0xC892, 0xC892, 0x2347,
+ 0xC893, 0xC893, 0x469E, 0xC894, 0xC894, 0x2193, 0xC895, 0xC898, 0x469F,
+ 0xC899, 0xC899, 0x26A1, 0xC89A, 0xC89C, 0x46A3, 0xC89D, 0xC89D, 0x1F62,
+ 0xC89E, 0xC8A0, 0x46A6, 0xC8A1, 0xC8FE, 0x0C7C, 0xC940, 0xC94E, 0x46A9,
+ 0xC94F, 0xC94F, 0x234D, 0xC950, 0xC950, 0x2348, 0xC951, 0xC96D, 0x46B8,
+ 0xC96E, 0xC96E, 0x1E60, 0xC96F, 0xC96F, 0x46D5, 0xC970, 0xC970, 0x2345,
+ 0xC971, 0xC976, 0x46D6, 0xC977, 0xC977, 0x1F12, 0xC978, 0xC97E, 0x46DC,
+ 0xC980, 0xC98E, 0x46E3, 0xC98F, 0xC98F, 0x2018, 0xC990, 0xC990, 0x2335,
+ 0xC991, 0xC99B, 0x46F2, 0xC99C, 0xC99C, 0x233C, 0xC99D, 0xC9A0, 0x46FD,
+ 0xC9A1, 0xC9FE, 0x0CDA, 0xCA40, 0xCA4D, 0x4701, 0xCA4E, 0xCA4E, 0x266F,
+ 0xCA4F, 0xCA55, 0x470F, 0xCA56, 0xCA56, 0x2351, 0xCA57, 0xCA58, 0x4716,
+ 0xCA59, 0xCA59, 0x1FA0, 0xCA5A, 0xCA5B, 0x4718, 0xCA5C, 0xCA5C, 0x2338,
+ 0xCA5D, 0xCA60, 0x471A, 0xCA61, 0xCA61, 0x221B, 0xCA62, 0xCA6D, 0x471E,
+ 0xCA6E, 0xCA6E, 0x2342, 0xCA6F, 0xCA71, 0x472A, 0xCA72, 0xCA72, 0x234F,
+ 0xCA73, 0xCA76, 0x472D, 0xCA77, 0xCA77, 0x233D, 0xCA78, 0xCA7A, 0x4731,
+ 0xCA7B, 0xCA7B, 0x2344, 0xCA7C, 0xCA7C, 0x2331, 0xCA7D, 0xCA7D, 0x4734,
+ 0xCA7E, 0xCA7E, 0x234B, 0xCA80, 0xCA80, 0x4735, 0xCA81, 0xCA81, 0x233B,
+ 0xCA82, 0xCA88, 0x4736, 0xCA89, 0xCA89, 0x2350, 0xCA8A, 0xCA8D, 0x473D,
+ 0xCA8E, 0xCA8E, 0x1EB4, 0xCA8F, 0xCA8F, 0x21A6, 0xCA90, 0xCA91, 0x4741,
+ 0xCA92, 0xCA92, 0x21CB, 0xCA93, 0xCA99, 0x4743, 0xCA9A, 0xCA9A, 0x2355,
+ 0xCA9B, 0xCAA0, 0x474A, 0xCAA1, 0xCAFE, 0x0D38, 0xCB40, 0xCB42, 0x4750,
+ 0xCB43, 0xCB43, 0x233E, 0xCB44, 0xCB44, 0x4753, 0xCB45, 0xCB45, 0x1F74,
+ 0xCB46, 0xCB46, 0x4754, 0xCB47, 0xCB47, 0x2330, 0xCB48, 0xCB4A, 0x4755,
+ 0xCB4B, 0xCB4B, 0x2680, 0xCB4C, 0xCB4D, 0x4758, 0xCB4E, 0xCB4E, 0x20DA,
+ 0xCB4F, 0xCB56, 0x475A, 0xCB57, 0xCB57, 0x234A, 0xCB58, 0xCB5C, 0x4762,
+ 0xCB5D, 0xCB5D, 0x1F91, 0xCB5E, 0xCB5E, 0x4767, 0xCB5F, 0xCB5F, 0x2107,
+ 0xCB60, 0xCB69, 0x4768, 0xCB6A, 0xCB6A, 0x233F, 0xCB6B, 0xCB7A, 0x4772,
+ 0xCB7B, 0xCB7B, 0x1FF4, 0xCB7C, 0xCB7C, 0x2343, 0xCB7D, 0xCB7E, 0x4782,
+ 0xCB80, 0xCB86, 0x4784, 0xCB87, 0xCB87, 0x2212, 0xCB88, 0xCB8D, 0x478B,
+ 0xCB8E, 0xCB8E, 0x2207, 0xCB8F, 0xCB91, 0x4791, 0xCB92, 0xCB92, 0x2359,
+ 0xCB93, 0xCB9B, 0x4794, 0xCB9C, 0xCB9C, 0x2254, 0xCB9D, 0xCB9D, 0x479D,
+ 0xCB9E, 0xCB9E, 0x2332, 0xCB9F, 0xCBA0, 0x479E, 0xCBA1, 0xCBFE, 0x0D96,
+ 0xCC40, 0xCC40, 0x1E26, 0xCC41, 0xCC41, 0x2357, 0xCC42, 0xCC48, 0x47A0,
+ 0xCC49, 0xCC49, 0x2358, 0xCC4A, 0xCC4A, 0x2042, 0xCC4B, 0xCC4B, 0x2153,
+ 0xCC4C, 0xCC4E, 0x47A7, 0xCC4F, 0xCC4F, 0x20BB, 0xCC50, 0xCC5B, 0x47AA,
+ 0xCC5C, 0xCC5C, 0x235A, 0xCC5D, 0xCC5F, 0x47B6, 0xCC60, 0xCC60, 0x2356,
+ 0xCC61, 0xCC63, 0x47B9, 0xCC64, 0xCC64, 0x2337, 0xCC65, 0xCC6C, 0x47BC,
+ 0xCC6D, 0xCC6D, 0x1FF9, 0xCC6E, 0xCC78, 0x47C4, 0xCC79, 0xCC79, 0x2353,
+ 0xCC7A, 0xCC7C, 0x47CF, 0xCC7D, 0xCC7D, 0x2061, 0xCC7E, 0xCC7E, 0x47D2,
+ 0xCC80, 0xCC8D, 0x47D3, 0xCC8E, 0xCC8E, 0x1E95, 0xCC8F, 0xCC93, 0x47E1,
+ 0xCC94, 0xCC94, 0x2049, 0xCC95, 0xCC95, 0x47E6, 0xCC96, 0xCC96, 0x1F42,
+ 0xCC97, 0xCC9C, 0x47E7, 0xCC9D, 0xCC9D, 0x1FE8, 0xCC9E, 0xCCA0, 0x47ED,
+ 0xCCA1, 0xCCFE, 0x0DF4, 0xCD40, 0xCD7E, 0x47F0, 0xCD80, 0xCD8F, 0x482F,
+ 0xCD90, 0xCD90, 0x25DA, 0xCD91, 0xCD97, 0x483F, 0xCD98, 0xCD98, 0x25D7,
+ 0xCD99, 0xCDA0, 0x4846, 0xCDA1, 0xCDFE, 0x0E52, 0xCE40, 0xCE66, 0x484E,
+ 0xCE67, 0xCE67, 0x212E, 0xCE68, 0xCE71, 0x4875, 0xCE72, 0xCE72, 0x21B2,
+ 0xCE73, 0xCE7E, 0x487F, 0xCE80, 0xCE80, 0x488B, 0xCE81, 0xCE81, 0x219E,
+ 0xCE82, 0xCE86, 0x488C, 0xCE87, 0xCE87, 0x25DC, 0xCE88, 0xCE9A, 0x4891,
+ 0xCE9B, 0xCE9B, 0x206C, 0xCE9C, 0xCE9D, 0x48A4, 0xCE9E, 0xCE9E, 0x2226,
+ 0xCE9F, 0xCEA0, 0x48A6, 0xCEA1, 0xCEFE, 0x0EB0, 0xCF40, 0xCF4D, 0x48A8,
+ 0xCF4E, 0xCF4E, 0x25E0, 0xCF4F, 0xCF54, 0x48B6, 0xCF55, 0xCF55, 0x227B,
+ 0xCF56, 0xCF57, 0x48BC, 0xCF58, 0xCF58, 0x25DE, 0xCF59, 0xCF5B, 0x48BE,
+ 0xCF5C, 0xCF5C, 0x25E1, 0xCF5D, 0xCF6B, 0x48C1, 0xCF6C, 0xCF6C, 0x25D5,
+ 0xCF6D, 0xCF72, 0x48D0, 0xCF73, 0xCF73, 0x1E6B, 0xCF74, 0xCF74, 0x48D6,
+ 0xCF75, 0xCF75, 0x25DB, 0xCF76, 0xCF77, 0x48D7, 0xCF78, 0xCF78, 0x1E89,
+ 0xCF79, 0xCF7B, 0x48D9, 0xCF7C, 0xCF7C, 0x25D9, 0xCF7D, 0xCF7E, 0x48DC,
+ 0xCF80, 0xCF80, 0x48DE, 0xCF81, 0xCF81, 0x2211, 0xCF82, 0xCF88, 0x48DF,
+ 0xCF89, 0xCF89, 0x2229, 0xCF8A, 0xCF8A, 0x25D6, 0xCF8B, 0xCF92, 0x48E6,
+ 0xCF93, 0xCF93, 0x25DD, 0xCF94, 0xCF94, 0x25DF, 0xCF95, 0xCF9D, 0x48EE,
+ 0xCF9E, 0xCF9E, 0x1FEF, 0xCF9F, 0xCF9F, 0x48F7, 0xCFA0, 0xCFA0, 0x25D8,
+ 0xCFA1, 0xCFFE, 0x0F0E, 0xD040, 0xD04C, 0x48F8, 0xD04D, 0xD04D, 0x1F29,
+ 0xD04E, 0xD050, 0x4905, 0xD051, 0xD051, 0x1E5B, 0xD052, 0xD054, 0x4908,
+ 0xD055, 0xD055, 0x2076, 0xD056, 0xD05B, 0x490B, 0xD05C, 0xD05C, 0x2297,
+ 0xD05D, 0xD05F, 0x4911, 0xD060, 0xD060, 0x2690, 0xD061, 0xD066, 0x4914,
+ 0xD067, 0xD067, 0x213F, 0xD068, 0xD06B, 0x491A, 0xD06C, 0xD06C, 0x2198,
+ 0xD06D, 0xD06D, 0x491E, 0xD06E, 0xD06E, 0x1E88, 0xD06F, 0xD07C, 0x491F,
+ 0xD07D, 0xD07D, 0x228C, 0xD07E, 0xD07E, 0x492D, 0xD080, 0xD0A0, 0x492E,
+ 0xD0A1, 0xD0FE, 0x0F6C, 0xD140, 0xD154, 0x494F, 0xD155, 0xD155, 0x25F1,
+ 0xD156, 0xD158, 0x4964, 0xD159, 0xD159, 0x200C, 0xD15A, 0xD160, 0x4967,
+ 0xD161, 0xD161, 0x1E58, 0xD162, 0xD162, 0x22AC, 0xD163, 0xD174, 0x496E,
+ 0xD175, 0xD175, 0x26A7, 0xD176, 0xD17C, 0x4980, 0xD17D, 0xD17D, 0x2676,
+ 0xD17E, 0xD17E, 0x4987, 0xD180, 0xD19C, 0x4988, 0xD19D, 0xD19D, 0x1FE1,
+ 0xD19E, 0xD19E, 0x25BB, 0xD19F, 0xD1A0, 0x49A5, 0xD1A1, 0xD1FE, 0x0FCA,
+ 0xD240, 0xD240, 0x25BE, 0xD241, 0xD242, 0x49A7, 0xD243, 0xD243, 0x22DD,
+ 0xD244, 0xD24C, 0x49A9, 0xD24D, 0xD24D, 0x25BD, 0xD24E, 0xD25B, 0x49B2,
+ 0xD25C, 0xD25C, 0x1E2A, 0xD25D, 0xD262, 0x49C0, 0xD263, 0xD263, 0x25BC,
+ 0xD264, 0xD264, 0x25BA, 0xD265, 0xD267, 0x49C6, 0xD268, 0xD268, 0x25BF,
+ 0xD269, 0xD26C, 0x49C9, 0xD26D, 0xD26D, 0x2187, 0xD26E, 0xD26E, 0x49CD,
+ 0xD26F, 0xD26F, 0x266B, 0xD270, 0xD271, 0x49CE, 0xD272, 0xD272, 0x1E7F,
+ 0xD273, 0xD274, 0x49D0, 0xD275, 0xD275, 0x21AD, 0xD276, 0xD27E, 0x49D2,
+ 0xD280, 0xD289, 0x49DB, 0xD28A, 0xD28A, 0x1F96, 0xD28B, 0xD28D, 0x49E5,
+ 0xD28E, 0xD28E, 0x1F32, 0xD28F, 0xD291, 0x49E8, 0xD292, 0xD292, 0x2084,
+ 0xD293, 0xD294, 0x49EB, 0xD295, 0xD295, 0x2136, 0xD296, 0xD296, 0x49ED,
+ 0xD297, 0xD297, 0x24B8, 0xD298, 0xD29F, 0x49EE, 0xD2A0, 0xD2A0, 0x24BA,
+ 0xD2A1, 0xD2FE, 0x1028, 0xD340, 0xD343, 0x49F6, 0xD344, 0xD344, 0x24BC,
+ 0xD345, 0xD347, 0x49FA, 0xD348, 0xD348, 0x20E4, 0xD349, 0xD349, 0x49FD,
+ 0xD34A, 0xD34A, 0x24B9, 0xD34B, 0xD34C, 0x49FE, 0xD34D, 0xD34D, 0x24BD,
+ 0xD34E, 0xD34F, 0x4A00, 0xD350, 0xD350, 0x24BE, 0xD351, 0xD354, 0x4A02,
+ 0xD355, 0xD355, 0x24BF, 0xD356, 0xD357, 0x4A06, 0xD358, 0xD358, 0x1FD2,
+ 0xD359, 0xD35A, 0x4A08, 0xD35B, 0xD35B, 0x1FFD, 0xD35C, 0xD35C, 0x4A0A,
+ 0xD35D, 0xD35D, 0x24BB, 0xD35E, 0xD35E, 0x1F2D, 0xD35F, 0xD377, 0x4A0B,
+ 0xD378, 0xD378, 0x2609, 0xD379, 0xD379, 0x4A24, 0xD37A, 0xD37A, 0x260A,
+ 0xD37B, 0xD37B, 0x4A25, 0xD37C, 0xD37C, 0x1E94, 0xD37D, 0xD37E, 0x4A26,
+ 0xD380, 0xD384, 0x4A28, 0xD385, 0xD385, 0x22DF, 0xD386, 0xD386, 0x1ECB,
+ 0xD387, 0xD387, 0x1F0D, 0xD388, 0xD38A, 0x4A2D, 0xD38B, 0xD38B, 0x1F77,
+ 0xD38C, 0xD38C, 0x4A30, 0xD38D, 0xD38D, 0x21EB, 0xD38E, 0xD38E, 0x4A31,
+ 0xD38F, 0xD38F, 0x22E1, 0xD390, 0xD390, 0x4A32, 0xD391, 0xD391, 0x216F,
+ 0xD392, 0xD392, 0x4A33, 0xD393, 0xD393, 0x22E0, 0xD394, 0xD395, 0x4A34,
+ 0xD396, 0xD396, 0x21EA, 0xD397, 0xD397, 0x4A36, 0xD398, 0xD398, 0x22E2,
+ 0xD399, 0xD399, 0x20CB, 0xD39A, 0xD39A, 0x4A37, 0xD39B, 0xD39B, 0x1F78,
+ 0xD39C, 0xD39D, 0x4A38, 0xD39E, 0xD39E, 0x1EE2, 0xD39F, 0xD39F, 0x4A3A,
+ 0xD3A0, 0xD3A0, 0x21F2, 0xD3A1, 0xD3FE, 0x1086, 0xD440, 0xD440, 0x4A3B,
+ 0xD441, 0xD441, 0x2150, 0xD442, 0xD444, 0x4A3C, 0xD445, 0xD445, 0x1FD3,
+ 0xD446, 0xD446, 0x4A3F, 0xD447, 0xD447, 0x22E5, 0xD448, 0xD44B, 0x4A40,
+ 0xD44C, 0xD44C, 0x1EF2, 0xD44D, 0xD44E, 0x4A44, 0xD44F, 0xD44F, 0x211F,
+ 0xD450, 0xD452, 0x4A46, 0xD453, 0xD453, 0x21DD, 0xD454, 0xD455, 0x4A49,
+ 0xD456, 0xD456, 0x2154, 0xD457, 0xD457, 0x4A4B, 0xD458, 0xD458, 0x22E7,
+ 0xD459, 0xD45B, 0x4A4C, 0xD45C, 0xD45C, 0x2282, 0xD45D, 0xD461, 0x4A4F,
+ 0xD462, 0xD462, 0x22E6, 0xD463, 0xD466, 0x4A54, 0xD467, 0xD467, 0x22E8,
+ 0xD468, 0xD46D, 0x4A58, 0xD46E, 0xD46E, 0x22E4, 0xD46F, 0xD46F, 0x4A5E,
+ 0xD470, 0xD470, 0x226A, 0xD471, 0xD471, 0x4A5F, 0xD472, 0xD472, 0x22EB,
+ 0xD473, 0xD473, 0x4A60, 0xD474, 0xD474, 0x22E9, 0xD475, 0xD475, 0x20BD,
+ 0xD476, 0xD477, 0x4A61, 0xD478, 0xD478, 0x22EA, 0xD479, 0xD47A, 0x4A63,
+ 0xD47B, 0xD47B, 0x22BD, 0xD47C, 0xD47D, 0x4A65, 0xD47E, 0xD47E, 0x1E9E,
+ 0xD480, 0xD481, 0x4A67, 0xD482, 0xD482, 0x22F6, 0xD483, 0xD483, 0x21E7,
+ 0xD484, 0xD484, 0x2216, 0xD485, 0xD486, 0x4A69, 0xD487, 0xD487, 0x2137,
+ 0xD488, 0xD489, 0x4A6B, 0xD48A, 0xD48A, 0x212C, 0xD48B, 0xD48B, 0x4A6D,
+ 0xD48C, 0xD48C, 0x1E68, 0xD48D, 0xD48D, 0x22F2, 0xD48E, 0xD48E, 0x1F37,
+ 0xD48F, 0xD48F, 0x22F3, 0xD490, 0xD490, 0x4A6E, 0xD491, 0xD491, 0x22EF,
+ 0xD492, 0xD492, 0x1F50, 0xD493, 0xD493, 0x1F10, 0xD494, 0xD494, 0x21C8,
+ 0xD495, 0xD495, 0x4A6F, 0xD496, 0xD496, 0x22F1, 0xD497, 0xD49B, 0x4A70,
+ 0xD49C, 0xD49C, 0x22F0, 0xD49D, 0xD49E, 0x4A75, 0xD49F, 0xD49F, 0x22EE,
+ 0xD4A0, 0xD4A0, 0x4A77, 0xD4A1, 0xD4FE, 0x10E4, 0xD540, 0xD542, 0x4A78,
+ 0xD543, 0xD543, 0x22ED, 0xD544, 0xD544, 0x229E, 0xD545, 0xD545, 0x22EC,
+ 0xD546, 0xD546, 0x1FE2, 0xD547, 0xD549, 0x4A7B, 0xD54A, 0xD54A, 0x20FE,
+ 0xD54B, 0xD54D, 0x4A7E, 0xD54E, 0xD54F, 0x22F9, 0xD550, 0xD550, 0x4A81,
+ 0xD551, 0xD551, 0x1EAF, 0xD552, 0xD553, 0x4A82, 0xD554, 0xD554, 0x2236,
+ 0xD555, 0xD555, 0x4A84, 0xD556, 0xD556, 0x22F7, 0xD557, 0xD559, 0x4A85,
+ 0xD55A, 0xD55A, 0x223D, 0xD55B, 0xD55B, 0x4A88, 0xD55C, 0xD55C, 0x1E82,
+ 0xD55D, 0xD55D, 0x1FB6, 0xD55E, 0xD55E, 0x4A89, 0xD55F, 0xD55F, 0x21A4,
+ 0xD560, 0xD560, 0x21AA, 0xD561, 0xD561, 0x22F8, 0xD562, 0xD562, 0x2151,
+ 0xD563, 0xD563, 0x4A8A, 0xD564, 0xD564, 0x1F60, 0xD565, 0xD567, 0x4A8B,
+ 0xD568, 0xD568, 0x2147, 0xD569, 0xD56B, 0x4A8E, 0xD56C, 0xD56C, 0x2145,
+ 0xD56D, 0xD56D, 0x4A91, 0xD56E, 0xD56E, 0x1FDC, 0xD56F, 0xD571, 0x4A92,
+ 0xD572, 0xD572, 0x2301, 0xD573, 0xD574, 0x4A95, 0xD575, 0xD575, 0x1EF5,
+ 0xD576, 0xD577, 0x4A97, 0xD578, 0xD578, 0x2218, 0xD579, 0xD57A, 0x4A99,
+ 0xD57B, 0xD57B, 0x1EC6, 0xD57C, 0xD57D, 0x4A9B, 0xD57E, 0xD57E, 0x2300,
+ 0xD580, 0xD580, 0x4A9D, 0xD581, 0xD581, 0x22B4, 0xD582, 0xD583, 0x4A9E,
+ 0xD584, 0xD584, 0x2169, 0xD585, 0xD585, 0x4AA0, 0xD586, 0xD586, 0x22FD,
+ 0xD587, 0xD587, 0x4AA1, 0xD588, 0xD588, 0x20EA, 0xD589, 0xD589, 0x4AA2,
+ 0xD58A, 0xD58A, 0x22F4, 0xD58B, 0xD58B, 0x4AA3, 0xD58C, 0xD58C, 0x22FB,
+ 0xD58D, 0xD58D, 0x4AA4, 0xD58E, 0xD58E, 0x22FC, 0xD58F, 0xD58F, 0x2027,
+ 0xD590, 0xD592, 0x4AA5, 0xD593, 0xD593, 0x2060, 0xD594, 0xD594, 0x22FF,
+ 0xD595, 0xD597, 0x4AA8, 0xD598, 0xD598, 0x22FE, 0xD599, 0xD599, 0x1EC7,
+ 0xD59A, 0xD59A, 0x4AAB, 0xD59B, 0xD59B, 0x230C, 0xD59C, 0xD59E, 0x4AAC,
+ 0xD59F, 0xD59F, 0x22F5, 0xD5A0, 0xD5A0, 0x4AAF, 0xD5A1, 0xD5FE, 0x1142,
+ 0xD640, 0xD640, 0x2306, 0xD641, 0xD641, 0x4AB0, 0xD642, 0xD642, 0x230A,
+ 0xD643, 0xD643, 0x21D3, 0xD644, 0xD646, 0x4AB1, 0xD647, 0xD647, 0x2303,
+ 0xD648, 0xD648, 0x4AB4, 0xD649, 0xD649, 0x2307, 0xD64A, 0xD64A, 0x230B,
+ 0xD64B, 0xD64C, 0x4AB5, 0xD64D, 0xD64D, 0x1F5F, 0xD64E, 0xD64E, 0x4AB7,
+ 0xD64F, 0xD64F, 0x2309, 0xD650, 0xD651, 0x4AB8, 0xD652, 0xD652, 0x2302,
+ 0xD653, 0xD653, 0x1F04, 0xD654, 0xD654, 0x229D, 0xD655, 0xD655, 0x4ABA,
+ 0xD656, 0xD656, 0x21FB, 0xD657, 0xD657, 0x4ABB, 0xD658, 0xD658, 0x2308,
+ 0xD659, 0xD659, 0x4ABC, 0xD65A, 0xD65A, 0x20AC, 0xD65B, 0xD65B, 0x4ABD,
+ 0xD65C, 0xD65C, 0x208E, 0xD65D, 0xD65D, 0x2305, 0xD65E, 0xD65E, 0x2197,
+ 0xD65F, 0xD65F, 0x4ABE, 0xD660, 0xD660, 0x2171, 0xD661, 0xD661, 0x2298,
+ 0xD662, 0xD664, 0x4ABF, 0xD665, 0xD665, 0x1F57, 0xD666, 0xD668, 0x4AC2,
+ 0xD669, 0xD669, 0x2082, 0xD66A, 0xD66A, 0x4AC5, 0xD66B, 0xD66B, 0x2311,
+ 0xD66C, 0xD66E, 0x4AC6, 0xD66F, 0xD66F, 0x2304, 0xD670, 0xD670, 0x4AC9,
+ 0xD671, 0xD671, 0x230F, 0xD672, 0xD672, 0x1E35, 0xD673, 0xD673, 0x4ACA,
+ 0xD674, 0xD674, 0x20D1, 0xD675, 0xD675, 0x2310, 0xD676, 0xD676, 0x1FA3,
+ 0xD677, 0xD677, 0x4ACB, 0xD678, 0xD678, 0x21D6, 0xD679, 0xD67B, 0x4ACC,
+ 0xD67C, 0xD67C, 0x2206, 0xD67D, 0xD67E, 0x4ACF, 0xD680, 0xD682, 0x4AD1,
+ 0xD683, 0xD683, 0x230D, 0xD684, 0xD685, 0x4AD4, 0xD686, 0xD686, 0x2312,
+ 0xD687, 0xD687, 0x208D, 0xD688, 0xD688, 0x2313, 0xD689, 0xD68D, 0x4AD6,
+ 0xD68E, 0xD68E, 0x22E3, 0xD68F, 0xD693, 0x4ADB, 0xD694, 0xD694, 0x1FBA,
+ 0xD695, 0xD698, 0x4AE0, 0xD699, 0xD699, 0x2078, 0xD69A, 0xD6A0, 0x4AE4,
+ 0xD6A1, 0xD6FE, 0x11A0, 0xD740, 0xD742, 0x4AEB, 0xD743, 0xD743, 0x2288,
+ 0xD744, 0xD747, 0x4AEE, 0xD748, 0xD748, 0x2316, 0xD749, 0xD749, 0x1F6B,
+ 0xD74A, 0xD74F, 0x4AF2, 0xD750, 0xD750, 0x2314, 0xD751, 0xD751, 0x4AF8,
+ 0xD752, 0xD752, 0x2130, 0xD753, 0xD753, 0x2315, 0xD754, 0xD754, 0x2168,
+ 0xD755, 0xD755, 0x4AF9, 0xD756, 0xD756, 0x20C4, 0xD757, 0xD763, 0x4AFA,
+ 0xD764, 0xD764, 0x2318, 0xD765, 0xD766, 0x4B07, 0xD767, 0xD767, 0x2219,
+ 0xD768, 0xD768, 0x2217, 0xD769, 0xD76B, 0x4B09, 0xD76C, 0xD76C, 0x20D5,
+ 0xD76D, 0xD76E, 0x4B0C, 0xD76F, 0xD76F, 0x1F4A, 0xD770, 0xD774, 0x4B0E,
+ 0xD775, 0xD775, 0x2240, 0xD776, 0xD777, 0x4B13, 0xD778, 0xD778, 0x1ED3,
+ 0xD779, 0xD77E, 0x4B15, 0xD780, 0xD782, 0x4B1B, 0xD783, 0xD783, 0x1E49,
+ 0xD784, 0xD786, 0x4B1E, 0xD787, 0xD787, 0x261B, 0xD788, 0xD78A, 0x4B21,
+ 0xD78B, 0xD78B, 0x1E6D, 0xD78C, 0xD78C, 0x20F8, 0xD78D, 0xD78D, 0x4B24,
+ 0xD78E, 0xD78E, 0x1FFB, 0xD78F, 0xD78F, 0x2319, 0xD790, 0xD794, 0x4B25,
+ 0xD795, 0xD795, 0x230E, 0xD796, 0xD796, 0x4B2A, 0xD797, 0xD797, 0x2317,
+ 0xD798, 0xD7A0, 0x4B2B, 0xD7A1, 0xD7F9, 0x11FE, 0xD840, 0xD84C, 0x4B34,
+ 0xD84D, 0xD84D, 0x20C8, 0xD84E, 0xD852, 0x4B41, 0xD853, 0xD853, 0x1EFD,
+ 0xD854, 0xD87E, 0x4B46, 0xD880, 0xD88F, 0x4B71, 0xD890, 0xD890, 0x1E3B,
+ 0xD891, 0xD891, 0x227F, 0xD892, 0xD892, 0x4B81, 0xD893, 0xD893, 0x1F0C,
+ 0xD894, 0xD894, 0x1E59, 0xD895, 0xD895, 0x1F24, 0xD896, 0xD899, 0x4B82,
+ 0xD89A, 0xD89A, 0x20BA, 0xD89B, 0xD89B, 0x1F65, 0xD89C, 0xD89C, 0x1EF0,
+ 0xD89D, 0xD89D, 0x2164, 0xD89E, 0xD89E, 0x1F30, 0xD89F, 0xD89F, 0x2261,
+ 0xD8A0, 0xD8A0, 0x4B86, 0xD8A1, 0xD8FE, 0x1257, 0xD940, 0xD940, 0x4B87,
+ 0xD941, 0xD941, 0x22A2, 0xD942, 0xD942, 0x24AB, 0xD943, 0xD943, 0x4B88,
+ 0xD944, 0xD944, 0x24AF, 0xD945, 0xD945, 0x1EE8, 0xD946, 0xD946, 0x1F39,
+ 0xD947, 0xD947, 0x4B89, 0xD948, 0xD948, 0x1E48, 0xD949, 0xD949, 0x2070,
+ 0xD94A, 0xD94A, 0x1EA8, 0xD94B, 0xD94B, 0x4B8A, 0xD94C, 0xD94C, 0x24AC,
+ 0xD94D, 0xD94D, 0x1EF7, 0xD94E, 0xD94E, 0x2176, 0xD94F, 0xD94F, 0x24AD,
+ 0xD950, 0xD950, 0x4B8B, 0xD951, 0xD951, 0x207B, 0xD952, 0xD952, 0x1F45,
+ 0xD953, 0xD953, 0x24AA, 0xD954, 0xD954, 0x204B, 0xD955, 0xD955, 0x202F,
+ 0xD956, 0xD956, 0x1F5A, 0xD957, 0xD957, 0x24B0, 0xD958, 0xD958, 0x4B8C,
+ 0xD959, 0xD959, 0x22B7, 0xD95A, 0xD95A, 0x1F7F, 0xD95B, 0xD95B, 0x4B8D,
+ 0xD95C, 0xD95C, 0x2265, 0xD95D, 0xD962, 0x4B8E, 0xD963, 0xD963, 0x24B2,
+ 0xD964, 0xD964, 0x211B, 0xD965, 0xD965, 0x1E51, 0xD966, 0xD966, 0x4B94,
+ 0xD967, 0xD967, 0x24B4, 0xD968, 0xD96B, 0x4B95, 0xD96C, 0xD96C, 0x24B3,
+ 0xD96D, 0xD96D, 0x4B99, 0xD96E, 0xD96E, 0x1E9F, 0xD96F, 0xD96F, 0x4B9A,
+ 0xD970, 0xD970, 0x2118, 0xD971, 0xD971, 0x4B9B, 0xD972, 0xD972, 0x20B4,
+ 0xD973, 0xD973, 0x23AF, 0xD974, 0xD974, 0x21BB, 0xD975, 0xD975, 0x2072,
+ 0xD976, 0xD976, 0x1F95, 0xD977, 0xD977, 0x4B9C, 0xD978, 0xD978, 0x1F0A,
+ 0xD979, 0xD979, 0x24B6, 0xD97A, 0xD97B, 0x4B9D, 0xD97C, 0xD97C, 0x2291,
+ 0xD97D, 0xD97D, 0x24B5, 0xD97E, 0xD97E, 0x2278, 0xD980, 0xD980, 0x1ED4,
+ 0xD981, 0xD986, 0x4B9F, 0xD987, 0xD987, 0x1FF3, 0xD988, 0xD98C, 0x4BA5,
+ 0xD98D, 0xD98D, 0x22A9, 0xD98E, 0xD98E, 0x24B7, 0xD98F, 0xD98F, 0x1F28,
+ 0xD990, 0xD990, 0x2109, 0xD991, 0xD991, 0x22C7, 0xD992, 0xD996, 0x4BAA,
+ 0xD997, 0xD997, 0x24AE, 0xD998, 0xD998, 0x22B1, 0xD999, 0xD99A, 0x4BAF,
+ 0xD99B, 0xD99B, 0x2266, 0xD99C, 0xD99C, 0x4BB1, 0xD99D, 0xD99D, 0x225B,
+ 0xD99E, 0xD99E, 0x22C4, 0xD99F, 0xD99F, 0x4BB2, 0xD9A0, 0xD9A0, 0x2115,
+ 0xD9A1, 0xD9FE, 0x12B5, 0xDA40, 0xDA40, 0x4BB3, 0xDA41, 0xDA41, 0x222A,
+ 0xDA42, 0xDA42, 0x24B1, 0xDA43, 0xDA47, 0x4BB4, 0xDA48, 0xDA48, 0x213D,
+ 0xDA49, 0xDA4C, 0x4BB9, 0xDA4D, 0xDA4D, 0x1F15, 0xDA4E, 0xDA4E, 0x225C,
+ 0xDA4F, 0xDA72, 0x4BBD, 0xDA73, 0xDA73, 0x1F14, 0xDA74, 0xDA76, 0x4BE1,
+ 0xDA77, 0xDA77, 0x227A, 0xDA78, 0xDA7E, 0x4BE4, 0xDA80, 0xDA84, 0x4BEB,
+ 0xDA85, 0xDA85, 0x20EE, 0xDA86, 0xDA8D, 0x4BF0, 0xDA8E, 0xDA8E, 0x25F8,
+ 0xDA8F, 0xDAA0, 0x4BF8, 0xDAA1, 0xDAFE, 0x1313, 0xDB40, 0xDB5F, 0x4C0A,
+ 0xDB60, 0xDB60, 0x1F94, 0xDB61, 0xDB77, 0x4C2A, 0xDB78, 0xDB78, 0x2230,
+ 0xDB79, 0xDB7E, 0x4C41, 0xDB80, 0xDB83, 0x4C47, 0xDB84, 0xDB84, 0x25FD,
+ 0xDB85, 0xDB8A, 0x4C4B, 0xDB8B, 0xDB8B, 0x2600, 0xDB8C, 0xDB97, 0x4C51,
+ 0xDB98, 0xDB98, 0x2606, 0xDB99, 0xDBA0, 0x4C5D, 0xDBA1, 0xDBFE, 0x1371,
+ 0xDC40, 0xDC44, 0x4C65, 0xDC45, 0xDC45, 0x25FF, 0xDC46, 0xDC4E, 0x4C6A,
+ 0xDC4F, 0xDC4F, 0x25FC, 0xDC50, 0xDC50, 0x1E8C, 0xDC51, 0xDC51, 0x2602,
+ 0xDC52, 0xDC52, 0x4C73, 0xDC53, 0xDC53, 0x224D, 0xDC54, 0xDC54, 0x4C74,
+ 0xDC55, 0xDC55, 0x2604, 0xDC56, 0xDC56, 0x25FE, 0xDC57, 0xDC57, 0x2603,
+ 0xDC58, 0xDC5C, 0x4C75, 0xDC5D, 0xDC5D, 0x2601, 0xDC5E, 0xDC61, 0x4C7A,
+ 0xDC62, 0xDC62, 0x2605, 0xDC63, 0xDC65, 0x4C7E, 0xDC66, 0xDC66, 0x1EA3,
+ 0xDC67, 0xDC67, 0x2608, 0xDC68, 0xDC6A, 0x4C81, 0xDC6B, 0xDC6B, 0x2607,
+ 0xDC6C, 0xDC7B, 0x4C84, 0xDC7C, 0xDC7C, 0x20F0, 0xDC7D, 0xDC7E, 0x4C94,
+ 0xDC80, 0xDC86, 0x4C96, 0xDC87, 0xDC87, 0x1E7B, 0xDC88, 0xDC88, 0x2267,
+ 0xDC89, 0xDC89, 0x1F36, 0xDC8A, 0xDC8A, 0x1FD6, 0xDC8B, 0xDC8D, 0x4C9D,
+ 0xDC8E, 0xDC8E, 0x21E0, 0xDC8F, 0xDC8F, 0x4CA0, 0xDC90, 0xDC90, 0x248C,
+ 0xDC91, 0xDC96, 0x4CA1, 0xDC97, 0xDC97, 0x248D, 0xDC98, 0xDC9A, 0x4CA7,
+ 0xDC9B, 0xDC9B, 0x2102, 0xDC9C, 0xDC9F, 0x4CAA, 0xDCA0, 0xDCA0, 0x2494,
+ 0xDCA1, 0xDCFE, 0x13CF, 0xDD40, 0xDD45, 0x4CAE, 0xDD46, 0xDD46, 0x2493,
+ 0xDD47, 0xDD4C, 0x4CB4, 0xDD4D, 0xDD4D, 0x248E, 0xDD4E, 0xDD52, 0x4CBA,
+ 0xDD53, 0xDD53, 0x2299, 0xDD54, 0xDD54, 0x2491, 0xDD55, 0xDD55, 0x2496,
+ 0xDD56, 0xDD56, 0x248F, 0xDD57, 0xDD57, 0x2492, 0xDD58, 0xDD58, 0x4CBF,
+ 0xDD59, 0xDD59, 0x2497, 0xDD5A, 0xDD5D, 0x4CC0, 0xDD5E, 0xDD5E, 0x1FB1,
+ 0xDD5F, 0xDD5F, 0x4CC4, 0xDD60, 0xDD60, 0x249A, 0xDD61, 0xDD61, 0x4CC5,
+ 0xDD62, 0xDD62, 0x2499, 0xDD63, 0xDD63, 0x4CC6, 0xDD64, 0xDD64, 0x2258,
+ 0xDD65, 0xDD65, 0x2498, 0xDD66, 0xDD6C, 0x4CC7, 0xDD6D, 0xDD6D, 0x249B,
+ 0xDD6E, 0xDD6E, 0x4CCE, 0xDD6F, 0xDD6F, 0x1F09, 0xDD70, 0xDD70, 0x20E6,
+ 0xDD71, 0xDD75, 0x4CCF, 0xDD76, 0xDD76, 0x2026, 0xDD77, 0xDD77, 0x249F,
+ 0xDD78, 0xDD78, 0x1F59, 0xDD79, 0xDD7A, 0x249D, 0xDD7B, 0xDD7E, 0x4CD4,
+ 0xDD80, 0xDD80, 0x4CD8, 0xDD81, 0xDD81, 0x1F3B, 0xDD82, 0xDD82, 0x249C,
+ 0xDD83, 0xDD84, 0x4CD9, 0xDD85, 0xDD85, 0x1E3A, 0xDD86, 0xDD86, 0x205B,
+ 0xDD87, 0xDD8A, 0x4CDB, 0xDD8B, 0xDD8B, 0x1F70, 0xDD8C, 0xDD8E, 0x4CDF,
+ 0xDD8F, 0xDD8F, 0x24A0, 0xDD90, 0xDD93, 0x4CE2, 0xDD94, 0xDD94, 0x213B,
+ 0xDD95, 0xDD96, 0x4CE6, 0xDD97, 0xDD97, 0x1F07, 0xDD98, 0xDD99, 0x4CE8,
+ 0xDD9A, 0xDD9A, 0x2270, 0xDD9B, 0xDD9B, 0x2237, 0xDD9C, 0xDD9D, 0x4CEA,
+ 0xDD9E, 0xDD9E, 0x24D2, 0xDD9F, 0xDD9F, 0x4CEC, 0xDDA0, 0xDDA0, 0x21B3,
+ 0xDDA1, 0xDDFE, 0x142D, 0xDE40, 0xDE40, 0x2245, 0xDE41, 0xDE41, 0x24A1,
+ 0xDE42, 0xDE43, 0x4CED, 0xDE44, 0xDE44, 0x22A8, 0xDE45, 0xDE47, 0x4CEF,
+ 0xDE48, 0xDE48, 0x227C, 0xDE49, 0xDE49, 0x1FB0, 0xDE4A, 0xDE4E, 0x4CF2,
+ 0xDE4F, 0xDE4F, 0x24A2, 0xDE50, 0xDE59, 0x4CF7, 0xDE5A, 0xDE5A, 0x1F46,
+ 0xDE5B, 0xDE5B, 0x4D01, 0xDE5C, 0xDE5C, 0x2380, 0xDE5D, 0xDE5D, 0x2495,
+ 0xDE5E, 0xDE5E, 0x4D02, 0xDE5F, 0xDE5F, 0x2490, 0xDE60, 0xDE6A, 0x4D03,
+ 0xDE6B, 0xDE6B, 0x1E30, 0xDE6C, 0xDE6E, 0x4D0E, 0xDE6F, 0xDE6F, 0x1E9D,
+ 0xDE70, 0xDE70, 0x1E4B, 0xDE71, 0xDE71, 0x1E4A, 0xDE72, 0xDE72, 0x20AA,
+ 0xDE73, 0xDE7E, 0x4D11, 0xDE80, 0xDE91, 0x4D1D, 0xDE92, 0xDE92, 0x267B,
+ 0xDE93, 0xDE9E, 0x4D2F, 0xDE9F, 0xDE9F, 0x23F2, 0xDEA0, 0xDEA0, 0x4D3B,
+ 0xDEA1, 0xDEFE, 0x148B, 0xDF40, 0xDF40, 0x227E, 0xDF41, 0xDF41, 0x4D3C,
+ 0xDF42, 0xDF42, 0x2019, 0xDF43, 0xDF4C, 0x4D3D, 0xDF4D, 0xDF4D, 0x1FBB,
+ 0xDF4E, 0xDF5B, 0x4D47, 0xDF5C, 0xDF5C, 0x2253, 0xDF5D, 0xDF5D, 0x4D55,
+ 0xDF5E, 0xDF5E, 0x1F3E, 0xDF5F, 0xDF5F, 0x1EA6, 0xDF60, 0xDF60, 0x218E,
+ 0xDF61, 0xDF63, 0x4D56, 0xDF64, 0xDF64, 0x21EC, 0xDF65, 0xDF65, 0x4D59,
+ 0xDF66, 0xDF66, 0x1EBE, 0xDF67, 0xDF67, 0x4D5A, 0xDF68, 0xDF68, 0x224A,
+ 0xDF69, 0xDF6C, 0x4D5B, 0xDF6D, 0xDF6D, 0x2133, 0xDF6E, 0xDF73, 0x4D5F,
+ 0xDF74, 0xDF74, 0x1E84, 0xDF75, 0xDF76, 0x4D65, 0xDF77, 0xDF77, 0x20CF,
+ 0xDF78, 0xDF78, 0x21E2, 0xDF79, 0xDF79, 0x4D67, 0xDF7A, 0xDF7A, 0x220F,
+ 0xDF7B, 0xDF7B, 0x4D68, 0xDF7C, 0xDF7C, 0x2029, 0xDF7D, 0xDF7D, 0x4D69,
+ 0xDF7E, 0xDF7E, 0x2073, 0xDF80, 0xDF80, 0x1F55, 0xDF81, 0xDF82, 0x4D6A,
+ 0xDF83, 0xDF83, 0x23F1, 0xDF84, 0xDF84, 0x4D6C, 0xDF85, 0xDF85, 0x1E46,
+ 0xDF86, 0xDF88, 0x4D6D, 0xDF89, 0xDF89, 0x2063, 0xDF8A, 0xDF8A, 0x23F3,
+ 0xDF8B, 0xDFA0, 0x4D70, 0xDFA1, 0xDFFE, 0x14E9, 0xE040, 0xE04F, 0x4D86,
+ 0xE050, 0xE050, 0x231E, 0xE051, 0xE05C, 0x4D96, 0xE05D, 0xE05D, 0x2233,
+ 0xE05E, 0xE068, 0x4DA2, 0xE069, 0xE069, 0x2320, 0xE06A, 0xE06B, 0x4DAD,
+ 0xE06C, 0xE06C, 0x21C7, 0xE06D, 0xE074, 0x4DAF, 0xE075, 0xE075, 0x22BC,
+ 0xE076, 0xE076, 0x4DB7, 0xE077, 0xE077, 0x231C, 0xE078, 0xE078, 0x4DB8,
+ 0xE079, 0xE079, 0x2251, 0xE07A, 0xE07E, 0x4DB9, 0xE080, 0xE086, 0x4DBE,
+ 0xE087, 0xE087, 0x1EBB, 0xE088, 0xE08C, 0x4DC5, 0xE08D, 0xE08D, 0x2287,
+ 0xE08E, 0xE08E, 0x4DCA, 0xE08F, 0xE08F, 0x202D, 0xE090, 0xE090, 0x1EAB,
+ 0xE091, 0xE091, 0x4DCB, 0xE092, 0xE092, 0x231D, 0xE093, 0xE093, 0x4DCC,
+ 0xE094, 0xE094, 0x231F, 0xE095, 0xE096, 0x4DCD, 0xE097, 0xE097, 0x231B,
+ 0xE098, 0xE0A0, 0x4DCF, 0xE0A1, 0xE0FE, 0x1547, 0xE140, 0xE141, 0x4DD8,
+ 0xE142, 0xE142, 0x2321, 0xE143, 0xE163, 0x4DDA, 0xE164, 0xE164, 0x2255,
+ 0xE165, 0xE167, 0x4DFB, 0xE168, 0xE168, 0x1E8F, 0xE169, 0xE173, 0x4DFE,
+ 0xE174, 0xE174, 0x220C, 0xE175, 0xE175, 0x1FA4, 0xE176, 0xE17E, 0x4E09,
+ 0xE180, 0xE183, 0x4E12, 0xE184, 0xE184, 0x209B, 0xE185, 0xE185, 0x21D8,
+ 0xE186, 0xE186, 0x4E16, 0xE187, 0xE187, 0x25FA, 0xE188, 0xE188, 0x4E17,
+ 0xE189, 0xE189, 0x25F9, 0xE18A, 0xE18B, 0x4E18, 0xE18C, 0xE18C, 0x2134,
+ 0xE18D, 0xE18D, 0x4E1A, 0xE18E, 0xE190, 0x24F3, 0xE191, 0xE191, 0x24F8,
+ 0xE192, 0xE192, 0x4E1B, 0xE193, 0xE193, 0x24F7, 0xE194, 0xE194, 0x1EC8,
+ 0xE195, 0xE195, 0x24F6, 0xE196, 0xE197, 0x4E1C, 0xE198, 0xE198, 0x2280,
+ 0xE199, 0xE19D, 0x4E1E, 0xE19E, 0xE19E, 0x1EC5, 0xE19F, 0xE19F, 0x24FB,
+ 0xE1A0, 0xE1A0, 0x4E23, 0xE1A1, 0xE1FE, 0x15A5, 0xE240, 0xE240, 0x4E24,
+ 0xE241, 0xE241, 0x24FA, 0xE242, 0xE242, 0x4E25, 0xE243, 0xE243, 0x1EED,
+ 0xE244, 0xE24E, 0x4E26, 0xE24F, 0xE24F, 0x24FD, 0xE250, 0xE250, 0x4E31,
+ 0xE251, 0xE251, 0x24F9, 0xE252, 0xE252, 0x4E32, 0xE253, 0xE253, 0x24FE,
+ 0xE254, 0xE254, 0x20CD, 0xE255, 0xE259, 0x4E33, 0xE25A, 0xE25A, 0x2508,
+ 0xE25B, 0xE25B, 0x2504, 0xE25C, 0xE25D, 0x4E38, 0xE25E, 0xE25E, 0x2506,
+ 0xE25F, 0xE261, 0x4E3A, 0xE262, 0xE262, 0x24FF, 0xE263, 0xE263, 0x2090,
+ 0xE264, 0xE266, 0x4E3D, 0xE267, 0xE267, 0x1EDD, 0xE268, 0xE268, 0x1F25,
+ 0xE269, 0xE269, 0x4E40, 0xE26A, 0xE26A, 0x2503, 0xE26B, 0xE26B, 0x2502,
+ 0xE26C, 0xE26D, 0x4E41, 0xE26E, 0xE26E, 0x1E7A, 0xE26F, 0xE26F, 0x20A6,
+ 0xE270, 0xE277, 0x4E43, 0xE278, 0xE278, 0x1FD5, 0xE279, 0xE27C, 0x4E4B,
+ 0xE27D, 0xE27D, 0x1F11, 0xE27E, 0xE27E, 0x4E4F, 0xE280, 0xE280, 0x2507,
+ 0xE281, 0xE281, 0x2500, 0xE282, 0xE282, 0x2505, 0xE283, 0xE288, 0x4E50,
+ 0xE289, 0xE289, 0x2519, 0xE28A, 0xE28A, 0x4E56, 0xE28B, 0xE28B, 0x2515,
+ 0xE28C, 0xE28D, 0x4E57, 0xE28E, 0xE28E, 0x250C, 0xE28F, 0xE28F, 0x2031,
+ 0xE290, 0xE291, 0x4E59, 0xE292, 0xE292, 0x250B, 0xE293, 0xE293, 0x250F,
+ 0xE294, 0xE294, 0x251A, 0xE295, 0xE295, 0x2509, 0xE296, 0xE297, 0x4E5B,
+ 0xE298, 0xE298, 0x250E, 0xE299, 0xE299, 0x2234, 0xE29A, 0xE29A, 0x2513,
+ 0xE29B, 0xE29B, 0x1F80, 0xE29C, 0xE29F, 0x4E5D, 0xE2A0, 0xE2A0, 0x2501,
+ 0xE2A1, 0xE2FE, 0x1603, 0xE340, 0xE341, 0x4E61, 0xE342, 0xE342, 0x2517,
+ 0xE343, 0xE343, 0x2516, 0xE344, 0xE346, 0x4E63, 0xE347, 0xE347, 0x2518,
+ 0xE348, 0xE34A, 0x4E66, 0xE34B, 0xE34B, 0x1E56, 0xE34C, 0xE34E, 0x4E69,
+ 0xE34F, 0xE34F, 0x250D, 0xE350, 0xE350, 0x4E6C, 0xE351, 0xE351, 0x20D3,
+ 0xE352, 0xE353, 0x4E6D, 0xE354, 0xE354, 0x207A, 0xE355, 0xE355, 0x20CE,
+ 0xE356, 0xE357, 0x4E6F, 0xE358, 0xE358, 0x2510, 0xE359, 0xE35B, 0x4E71,
+ 0xE35C, 0xE35C, 0x1E55, 0xE35D, 0xE35F, 0x4E74, 0xE360, 0xE360, 0x250A,
+ 0xE361, 0xE365, 0x4E77, 0xE366, 0xE367, 0x2511, 0xE368, 0xE370, 0x4E7C,
+ 0xE371, 0xE371, 0x1FAA, 0xE372, 0xE372, 0x4E85, 0xE373, 0xE373, 0x251E,
+ 0xE374, 0xE374, 0x1F1F, 0xE375, 0xE377, 0x4E86, 0xE378, 0xE378, 0x252D,
+ 0xE379, 0xE379, 0x221D, 0xE37A, 0xE37B, 0x4E89, 0xE37C, 0xE37C, 0x2532,
+ 0xE37D, 0xE37D, 0x4E8B, 0xE37E, 0xE37E, 0x217B, 0xE380, 0xE389, 0x4E8C,
+ 0xE38A, 0xE38A, 0x21AF, 0xE38B, 0xE38B, 0x4E96, 0xE38C, 0xE38C, 0x252C,
+ 0xE38D, 0xE38E, 0x4E97, 0xE38F, 0xE38F, 0x2528, 0xE390, 0xE390, 0x4E99,
+ 0xE391, 0xE391, 0x208C, 0xE392, 0xE392, 0x4E9A, 0xE393, 0xE393, 0x252F,
+ 0xE394, 0xE394, 0x4E9B, 0xE395, 0xE395, 0x21BC, 0xE396, 0xE398, 0x4E9C,
+ 0xE399, 0xE399, 0x251D, 0xE39A, 0xE39B, 0x4E9F, 0xE39C, 0xE39C, 0x2535,
+ 0xE39D, 0xE39D, 0x4EA1, 0xE39E, 0xE39E, 0x220D, 0xE39F, 0xE39F, 0x2526,
+ 0xE3A0, 0xE3A0, 0x4EA2, 0xE3A1, 0xE3FE, 0x1661, 0xE440, 0xE440, 0x2534,
+ 0xE441, 0xE441, 0x252A, 0xE442, 0xE442, 0x251F, 0xE443, 0xE443, 0x2531,
+ 0xE444, 0xE444, 0x251C, 0xE445, 0xE447, 0x4EA3, 0xE448, 0xE448, 0x2525,
+ 0xE449, 0xE44D, 0x4EA6, 0xE44E, 0xE44E, 0x21CD, 0xE44F, 0xE44F, 0x4EAB,
+ 0xE450, 0xE450, 0x21DA, 0xE451, 0xE451, 0x4EAC, 0xE452, 0xE452, 0x2172,
+ 0xE453, 0xE453, 0x253E, 0xE454, 0xE457, 0x4EAD, 0xE458, 0xE458, 0x204F,
+ 0xE459, 0xE459, 0x4EB1, 0xE45A, 0xE45A, 0x2543, 0xE45B, 0xE45B, 0x4EB2,
+ 0xE45C, 0xE45C, 0x21D7, 0xE45D, 0xE45D, 0x4EB3, 0xE45E, 0xE45E, 0x1E3C,
+ 0xE45F, 0xE461, 0x4EB4, 0xE462, 0xE462, 0x2529, 0xE463, 0xE464, 0x4EB7,
+ 0xE465, 0xE465, 0x2521, 0xE466, 0xE467, 0x4EB9, 0xE468, 0xE468, 0x1EFF,
+ 0xE469, 0xE472, 0x4EBB, 0xE473, 0xE473, 0x253F, 0xE474, 0xE474, 0x4EC5,
+ 0xE475, 0xE475, 0x2544, 0xE476, 0xE478, 0x4EC6, 0xE479, 0xE479, 0x2523,
+ 0xE47A, 0xE47A, 0x1E90, 0xE47B, 0xE47B, 0x253A, 0xE47C, 0xE47C, 0x2545,
+ 0xE47D, 0xE47D, 0x4EC9, 0xE47E, 0xE47E, 0x253D, 0xE480, 0xE480, 0x4ECA,
+ 0xE481, 0xE481, 0x20C1, 0xE482, 0xE483, 0x4ECB, 0xE484, 0xE484, 0x2103,
+ 0xE485, 0xE485, 0x2520, 0xE486, 0xE486, 0x253C, 0xE487, 0xE487, 0x253B,
+ 0xE488, 0xE488, 0x2538, 0xE489, 0xE48C, 0x4ECD, 0xE48D, 0xE48D, 0x2540,
+ 0xE48E, 0xE48E, 0x4ED1, 0xE48F, 0xE48F, 0x1FCD, 0xE490, 0xE492, 0x4ED2,
+ 0xE493, 0xE493, 0x1F18, 0xE494, 0xE497, 0x4ED5, 0xE498, 0xE498, 0x254B,
+ 0xE499, 0xE49C, 0x4ED9, 0xE49D, 0xE49D, 0x2547, 0xE49E, 0xE49F, 0x254F,
+ 0xE4A0, 0xE4A0, 0x4EDD, 0xE4A1, 0xE4FE, 0x16BF, 0xE540, 0xE545, 0x4EDE,
+ 0xE546, 0xE546, 0x22B0, 0xE547, 0xE547, 0x4EE4, 0xE548, 0xE548, 0x2546,
+ 0xE549, 0xE54A, 0x4EE5, 0xE54B, 0xE54B, 0x254C, 0xE54C, 0xE54D, 0x4EE7,
+ 0xE54E, 0xE54E, 0x1E9A, 0xE54F, 0xE54F, 0x2552, 0xE550, 0xE550, 0x2530,
+ 0xE551, 0xE551, 0x2549, 0xE552, 0xE554, 0x4EE9, 0xE555, 0xE555, 0x2551,
+ 0xE556, 0xE556, 0x1ECA, 0xE557, 0xE557, 0x4EEC, 0xE558, 0xE558, 0x20D2,
+ 0xE559, 0xE55B, 0x4EED, 0xE55C, 0xE55C, 0x1FB8, 0xE55D, 0xE55D, 0x4EF0,
+ 0xE55E, 0xE55E, 0x2079, 0xE55F, 0xE560, 0x4EF1, 0xE561, 0xE561, 0x21AB,
+ 0xE562, 0xE563, 0x4EF3, 0xE564, 0xE564, 0x254D, 0xE565, 0xE565, 0x1EA5,
+ 0xE566, 0xE567, 0x4EF5, 0xE568, 0xE568, 0x204C, 0xE569, 0xE569, 0x2080,
+ 0xE56A, 0xE56B, 0x4EF7, 0xE56C, 0xE56C, 0x266D, 0xE56D, 0xE56D, 0x4EF9,
+ 0xE56E, 0xE56E, 0x2537, 0xE56F, 0xE574, 0x4EFA, 0xE575, 0xE575, 0x254A,
+ 0xE576, 0xE576, 0x21B8, 0xE577, 0xE577, 0x4F00, 0xE578, 0xE578, 0x254E,
+ 0xE579, 0xE57A, 0x4F01, 0xE57B, 0xE57B, 0x24FC, 0xE57C, 0xE57C, 0x2554,
+ 0xE57D, 0xE57E, 0x4F03, 0xE580, 0xE580, 0x4F05, 0xE581, 0xE581, 0x1F3C,
+ 0xE582, 0xE582, 0x4F06, 0xE583, 0xE583, 0x1ED5, 0xE584, 0xE589, 0x4F07,
+ 0xE58A, 0xE58A, 0x2556, 0xE58B, 0xE58D, 0x4F0D, 0xE58E, 0xE58E, 0x2268,
+ 0xE58F, 0xE590, 0x4F10, 0xE591, 0xE591, 0x1ED6, 0xE592, 0xE599, 0x4F12,
+ 0xE59A, 0xE59A, 0x2557, 0xE59B, 0xE59B, 0x2553, 0xE59C, 0xE59E, 0x4F1A,
+ 0xE59F, 0xE59F, 0x2548, 0xE5A0, 0xE5A0, 0x4F1D, 0xE5A1, 0xE5FE, 0x171D,
+ 0xE640, 0xE640, 0x20DC, 0xE641, 0xE643, 0x4F1E, 0xE644, 0xE644, 0x2559,
+ 0xE645, 0xE648, 0x4F21, 0xE649, 0xE649, 0x1F97, 0xE64A, 0xE64A, 0x2555,
+ 0xE64B, 0xE64D, 0x4F25, 0xE64E, 0xE64E, 0x227D, 0xE64F, 0xE651, 0x4F28,
+ 0xE652, 0xE652, 0x257E, 0xE653, 0xE655, 0x4F2B, 0xE656, 0xE656, 0x207C,
+ 0xE657, 0xE657, 0x4F2E, 0xE658, 0xE658, 0x255A, 0xE659, 0xE65A, 0x4F2F,
+ 0xE65B, 0xE65B, 0x255E, 0xE65C, 0xE65D, 0x4F31, 0xE65E, 0xE65E, 0x1E34,
+ 0xE65F, 0xE668, 0x4F33, 0xE669, 0xE669, 0x215E, 0xE66A, 0xE66A, 0x4F3D,
+ 0xE66B, 0xE66B, 0x2560, 0xE66C, 0xE674, 0x4F3E, 0xE675, 0xE675, 0x21A2,
+ 0xE676, 0xE676, 0x2354, 0xE677, 0xE678, 0x4F47, 0xE679, 0xE679, 0x2563,
+ 0xE67A, 0xE67A, 0x2527, 0xE67B, 0xE67B, 0x4F49, 0xE67C, 0xE67C, 0x252E,
+ 0xE67D, 0xE67D, 0x2558, 0xE67E, 0xE67E, 0x4F4A, 0xE680, 0xE680, 0x1F1B,
+ 0xE681, 0xE681, 0x4F4B, 0xE682, 0xE682, 0x2283, 0xE683, 0xE683, 0x4F4C,
+ 0xE684, 0xE684, 0x2564, 0xE685, 0xE686, 0x4F4D, 0xE687, 0xE687, 0x20A0,
+ 0xE688, 0xE688, 0x4F4F, 0xE689, 0xE689, 0x2565, 0xE68A, 0xE68B, 0x4F50,
+ 0xE68C, 0xE68C, 0x2561, 0xE68D, 0xE692, 0x4F52, 0xE693, 0xE693, 0x2562,
+ 0xE694, 0xE696, 0x4F58, 0xE697, 0xE697, 0x256C, 0xE698, 0xE69A, 0x4F5B,
+ 0xE69B, 0xE69B, 0x256D, 0xE69C, 0xE69C, 0x2020, 0xE69D, 0xE69E, 0x4F5E,
+ 0xE69F, 0xE69F, 0x255F, 0xE6A0, 0xE6A0, 0x256A, 0xE6A1, 0xE6FE, 0x177B,
+ 0xE740, 0xE742, 0x4F60, 0xE743, 0xE743, 0x256E, 0xE744, 0xE747, 0x4F63,
+ 0xE748, 0xE748, 0x2539, 0xE749, 0xE749, 0x255C, 0xE74A, 0xE74C, 0x4F67,
+ 0xE74D, 0xE74E, 0x2568, 0xE74F, 0xE74F, 0x256B, 0xE750, 0xE750, 0x1E6F,
+ 0xE751, 0xE751, 0x4F6A, 0xE752, 0xE752, 0x1FC4, 0xE753, 0xE753, 0x2567,
+ 0xE754, 0xE754, 0x4F6B, 0xE755, 0xE755, 0x255B, 0xE756, 0xE758, 0x4F6C,
+ 0xE759, 0xE759, 0x261D, 0xE75A, 0xE765, 0x4F6F, 0xE766, 0xE766, 0x252B,
+ 0xE767, 0xE767, 0x4F7B, 0xE768, 0xE768, 0x2571, 0xE769, 0xE769, 0x4F7C,
+ 0xE76A, 0xE76A, 0x2577, 0xE76B, 0xE773, 0x4F7D, 0xE774, 0xE774, 0x2522,
+ 0xE775, 0xE77B, 0x4F86, 0xE77C, 0xE77C, 0x2533, 0xE77D, 0xE77E, 0x4F8D,
+ 0xE780, 0xE781, 0x4F8F, 0xE782, 0xE782, 0x202A, 0xE783, 0xE783, 0x4F91,
+ 0xE784, 0xE784, 0x2536, 0xE785, 0xE785, 0x2573, 0xE786, 0xE786, 0x256F,
+ 0xE787, 0xE789, 0x4F92, 0xE78A, 0xE78A, 0x2293, 0xE78B, 0xE78B, 0x2578,
+ 0xE78C, 0xE78E, 0x4F95, 0xE78F, 0xE78F, 0x2570, 0xE790, 0xE791, 0x4F98,
+ 0xE792, 0xE792, 0x2575, 0xE793, 0xE797, 0x4F9A, 0xE798, 0xE799, 0x2541,
+ 0xE79A, 0xE79A, 0x255D, 0xE79B, 0xE79F, 0x4F9F, 0xE7A0, 0xE7A0, 0x201A,
+ 0xE7A1, 0xE7FE, 0x17D9, 0xE840, 0xE842, 0x4FA4, 0xE843, 0xE843, 0x257A,
+ 0xE844, 0xE844, 0x2006, 0xE845, 0xE845, 0x4FA7, 0xE846, 0xE846, 0x2177,
+ 0xE847, 0xE848, 0x4FA8, 0xE849, 0xE849, 0x251B, 0xE84A, 0xE84A, 0x4FAA,
+ 0xE84B, 0xE84B, 0x2524, 0xE84C, 0xE84E, 0x4FAB, 0xE84F, 0xE84F, 0x257B,
+ 0xE850, 0xE853, 0x4FAE, 0xE854, 0xE854, 0x22A3, 0xE855, 0xE859, 0x4FB2,
+ 0xE85A, 0xE85A, 0x2579, 0xE85B, 0xE85B, 0x4FB7, 0xE85C, 0xE85C, 0x2566,
+ 0xE85D, 0xE861, 0x4FB8, 0xE862, 0xE862, 0x1F93, 0xE863, 0xE863, 0x4FBD,
+ 0xE864, 0xE864, 0x257C, 0xE865, 0xE86F, 0x4FBE, 0xE870, 0xE870, 0x2514,
+ 0xE871, 0xE872, 0x4FC9, 0xE873, 0xE873, 0x257D, 0xE874, 0xE874, 0x4FCB,
+ 0xE875, 0xE875, 0x2572, 0xE876, 0xE87B, 0x4FCC, 0xE87C, 0xE87C, 0x2574,
+ 0xE87D, 0xE87E, 0x4FD2, 0xE880, 0xE880, 0x224E, 0xE881, 0xE881, 0x4FD4,
+ 0xE882, 0xE882, 0x21C6, 0xE883, 0xE886, 0x4FD5, 0xE887, 0xE887, 0x209F,
+ 0xE888, 0xE888, 0x4FD9, 0xE889, 0xE889, 0x2576, 0xE88A, 0xE88B, 0x4FDA,
+ 0xE88C, 0xE88C, 0x2064, 0xE88D, 0xE88D, 0x22BF, 0xE88E, 0xE88E, 0x261C,
+ 0xE88F, 0xE88F, 0x225E, 0xE890, 0xE8A0, 0x4FDC, 0xE8A1, 0xE8FE, 0x1837,
+ 0xE940, 0xE94B, 0x4FED, 0xE94C, 0xE94C, 0x1E75, 0xE94D, 0xE953, 0x4FF9,
+ 0xE954, 0xE954, 0x207D, 0xE955, 0xE955, 0x5000, 0xE956, 0xE956, 0x23BF,
+ 0xE957, 0xE957, 0x2113, 0xE958, 0xE959, 0x5001, 0xE95A, 0xE95A, 0x23C0,
+ 0xE95B, 0xE95C, 0x5003, 0xE95D, 0xE95D, 0x1E45, 0xE95E, 0xE95E, 0x5005,
+ 0xE95F, 0xE95F, 0x1FD8, 0xE960, 0xE960, 0x23C4, 0xE961, 0xE961, 0x5006,
+ 0xE962, 0xE962, 0x23C2, 0xE963, 0xE963, 0x2104, 0xE964, 0xE964, 0x5007,
+ 0xE965, 0xE965, 0x21BD, 0xE966, 0xE966, 0x5008, 0xE967, 0xE967, 0x1F87,
+ 0xE968, 0xE968, 0x23C3, 0xE969, 0xE96B, 0x5009, 0xE96C, 0xE96C, 0x2269,
+ 0xE96D, 0xE974, 0x500C, 0xE975, 0xE975, 0x1F43, 0xE976, 0xE976, 0x5014,
+ 0xE977, 0xE977, 0x1F1E, 0xE978, 0xE978, 0x2679, 0xE979, 0xE979, 0x1EEB,
+ 0xE97A, 0xE97B, 0x5015, 0xE97C, 0xE97C, 0x1F35, 0xE97D, 0xE97D, 0x208A,
+ 0xE97E, 0xE97E, 0x5017, 0xE980, 0xE980, 0x23C7, 0xE981, 0xE981, 0x23C9,
+ 0xE982, 0xE982, 0x23C6, 0xE983, 0xE986, 0x5018, 0xE987, 0xE987, 0x224F,
+ 0xE988, 0xE98A, 0x501C, 0xE98B, 0xE98B, 0x23CB, 0xE98C, 0xE98D, 0x501F,
+ 0xE98E, 0xE98E, 0x21F3, 0xE98F, 0xE98F, 0x5021, 0xE990, 0xE990, 0x21F7,
+ 0xE991, 0xE991, 0x23CF, 0xE992, 0xE992, 0x23CE, 0xE993, 0xE993, 0x23CA,
+ 0xE994, 0xE994, 0x23CD, 0xE995, 0xE997, 0x5022, 0xE998, 0xE998, 0x23D0,
+ 0xE999, 0xE99A, 0x5025, 0xE99B, 0xE99B, 0x266C, 0xE99C, 0xE99C, 0x5027,
+ 0xE99D, 0xE99D, 0x23C1, 0xE99E, 0xE99E, 0x5028, 0xE99F, 0xE99F, 0x1FEE,
+ 0xE9A0, 0xE9A0, 0x23D1, 0xE9A1, 0xE9FE, 0x1895, 0xEA40, 0xEA40, 0x1FF8,
+ 0xEA41, 0xEA43, 0x5029, 0xEA44, 0xEA44, 0x23D3, 0xEA45, 0xEA47, 0x502C,
+ 0xEA48, 0xEA48, 0x23D2, 0xEA49, 0xEA49, 0x23D4, 0xEA4A, 0xEA4A, 0x1E98,
+ 0xEA4B, 0xEA4F, 0x502F, 0xEA50, 0xEA50, 0x1F2C, 0xEA51, 0xEA51, 0x5034,
+ 0xEA52, 0xEA52, 0x23D5, 0xEA53, 0xEA54, 0x5035, 0xEA55, 0xEA55, 0x1E71,
+ 0xEA56, 0xEA56, 0x2691, 0xEA57, 0xEA58, 0x5037, 0xEA59, 0xEA59, 0x23C5,
+ 0xEA5A, 0xEA7E, 0x5039, 0xEA80, 0xEA80, 0x231A, 0xEA81, 0xEA83, 0x505E,
+ 0xEA84, 0xEA84, 0x2114, 0xEA85, 0xEA86, 0x5061, 0xEA87, 0xEA87, 0x2284,
+ 0xEA88, 0xEA8D, 0x5063, 0xEA8E, 0xEA8E, 0x221C, 0xEA8F, 0xEA8F, 0x5069,
+ 0xEA90, 0xEA90, 0x1E7E, 0xEA91, 0xEA91, 0x204D, 0xEA92, 0xEA95, 0x506A,
+ 0xEA96, 0xEA96, 0x2201, 0xEA97, 0xEA9F, 0x506E, 0xEAA0, 0xEAA0, 0x1ED9,
+ 0xEAA1, 0xEAFE, 0x18F3, 0xEB40, 0xEB40, 0x5077, 0xEB41, 0xEB41, 0x1FB2,
+ 0xEB42, 0xEB44, 0x5078, 0xEB45, 0xEB45, 0x2252, 0xEB46, 0xEB47, 0x507B,
+ 0xEB48, 0xEB48, 0x1F79, 0xEB49, 0xEB52, 0x507D, 0xEB53, 0xEB53, 0x2157,
+ 0xEB54, 0xEB54, 0x5087, 0xEB55, 0xEB55, 0x21BF, 0xEB56, 0xEB5A, 0x5088,
+ 0xEB5B, 0xEB5B, 0x221F, 0xEB5C, 0xEB5C, 0x508D, 0xEB5D, 0xEB5D, 0x203D,
+ 0xEB5E, 0xEB5F, 0x508E, 0xEB60, 0xEB60, 0x2015, 0xEB61, 0xEB61, 0x5090,
+ 0xEB62, 0xEB62, 0x26A5, 0xEB63, 0xEB6C, 0x5091, 0xEB6D, 0xEB6D, 0x2156,
+ 0xEB6E, 0xEB6F, 0x509B, 0xEB70, 0xEB70, 0x2144, 0xEB71, 0xEB71, 0x509D,
+ 0xEB72, 0xEB72, 0x1E91, 0xEB73, 0xEB73, 0x2257, 0xEB74, 0xEB77, 0x509E,
+ 0xEB78, 0xEB78, 0x200A, 0xEB79, 0xEB79, 0x2092, 0xEB7A, 0xEB7E, 0x50A2,
+ 0xEB80, 0xEB84, 0x50A7, 0xEB85, 0xEB85, 0x2250, 0xEB86, 0xEB89, 0x50AC,
+ 0xEB8A, 0xEB8A, 0x1EC3, 0xEB8B, 0xEBA0, 0x50B0, 0xEBA1, 0xEBFE, 0x1951,
+ 0xEC40, 0xEC45, 0x50C6, 0xEC46, 0xEC46, 0x21A8, 0xEC47, 0xEC55, 0x50CC,
+ 0xEC56, 0xEC56, 0x260D, 0xEC57, 0xEC59, 0x50DB, 0xEC5A, 0xEC5A, 0x260C,
+ 0xEC5B, 0xEC5B, 0x50DE, 0xEC5C, 0xEC5C, 0x260E, 0xEC5D, 0xEC5F, 0x50DF,
+ 0xEC60, 0xEC60, 0x2032, 0xEC61, 0xEC6D, 0x50E2, 0xEC6E, 0xEC6E, 0x260B,
+ 0xEC6F, 0xEC75, 0x50EF, 0xEC76, 0xEC76, 0x22C3, 0xEC77, 0xEC7E, 0x50F6,
+ 0xEC80, 0xEC95, 0x50FE, 0xEC96, 0xEC96, 0x1F23, 0xEC97, 0xECA0, 0x5114,
+ 0xECA1, 0xECFE, 0x19AF, 0xED40, 0xED45, 0x511E, 0xED46, 0xED46, 0x2695,
+ 0xED47, 0xED57, 0x5124, 0xED58, 0xED58, 0x265E, 0xED59, 0xED5D, 0x5135,
+ 0xED5E, 0xED5E, 0x265D, 0xED5F, 0xED60, 0x513A, 0xED61, 0xED61, 0x2692,
+ 0xED62, 0xED63, 0x513C, 0xED64, 0xED64, 0x265F, 0xED65, 0xED65, 0x513E,
+ 0xED66, 0xED66, 0x218D, 0xED67, 0xED67, 0x20FD, 0xED68, 0xED6D, 0x513F,
+ 0xED6E, 0xED6E, 0x1F40, 0xED6F, 0xED73, 0x5145, 0xED74, 0xED74, 0x2465,
+ 0xED75, 0xED76, 0x514A, 0xED77, 0xED77, 0x2467, 0xED78, 0xED78, 0x514C,
+ 0xED79, 0xED79, 0x2466, 0xED7A, 0xED7E, 0x514D, 0xED80, 0xED90, 0x5152,
+ 0xED91, 0xED91, 0x21C9, 0xED92, 0xED92, 0x5163, 0xED93, 0xED93, 0x2209,
+ 0xED94, 0xED94, 0x1EC9, 0xED95, 0xED95, 0x20E9, 0xED96, 0xED96, 0x5164,
+ 0xED97, 0xED97, 0x21CA, 0xED98, 0xED98, 0x2146, 0xED99, 0xED99, 0x25C5,
+ 0xED9A, 0xED9A, 0x21DC, 0xED9B, 0xED9B, 0x5165, 0xED9C, 0xED9C, 0x245E,
+ 0xED9D, 0xED9D, 0x5166, 0xED9E, 0xED9E, 0x214F, 0xED9F, 0xED9F, 0x5167,
+ 0xEDA0, 0xEDA0, 0x25C6, 0xEDA1, 0xEDFE, 0x1A0D, 0xEE40, 0xEE40, 0x25C7,
+ 0xEE41, 0xEE41, 0x2241, 0xEE42, 0xEE42, 0x218A, 0xEE43, 0xEE43, 0x1E2F,
+ 0xEE44, 0xEE44, 0x1EDC, 0xEE45, 0xEE47, 0x5168, 0xEE48, 0xEE48, 0x20BF,
+ 0xEE49, 0xEE49, 0x2034, 0xEE4A, 0xEE4C, 0x516B, 0xEE4D, 0xEE4D, 0x25C9,
+ 0xEE4E, 0xEE51, 0x516E, 0xEE52, 0xEE52, 0x25C8, 0xEE53, 0xEE54, 0x5172,
+ 0xEE55, 0xEE55, 0x220E, 0xEE56, 0xEE56, 0x5174, 0xEE57, 0xEE57, 0x25CB,
+ 0xEE58, 0xEE5D, 0x5175, 0xEE5E, 0xEE5E, 0x217D, 0xEE5F, 0xEE60, 0x517B,
+ 0xEE61, 0xEE61, 0x1F7E, 0xEE62, 0xEE67, 0x517D, 0xEE68, 0xEE68, 0x25CC,
+ 0xEE69, 0xEE69, 0x1FC3, 0xEE6A, 0xEE6B, 0x5183, 0xEE6C, 0xEE6C, 0x20B9,
+ 0xEE6D, 0xEE6D, 0x5185, 0xEE6E, 0xEE6E, 0x2181, 0xEE6F, 0xEE76, 0x5186,
+ 0xEE77, 0xEE77, 0x1FDA, 0xEE78, 0xEE7C, 0x518E, 0xEE7D, 0xEE7D, 0x2173,
+ 0xEE7E, 0xEE7E, 0x1EE1, 0xEE80, 0xEE80, 0x25CD, 0xEE81, 0xEE84, 0x5193,
+ 0xEE85, 0xEE85, 0x25CE, 0xEE86, 0xEE86, 0x21F6, 0xEE87, 0xEE89, 0x5197,
+ 0xEE8A, 0xEE8A, 0x224B, 0xEE8B, 0xEE8B, 0x25D1, 0xEE8C, 0xEE8C, 0x519A,
+ 0xEE8D, 0xEE8D, 0x1EC0, 0xEE8E, 0xEE8F, 0x519B, 0xEE90, 0xEE90, 0x2008,
+ 0xEE91, 0xEE93, 0x519D, 0xEE94, 0xEE94, 0x25D0, 0xEE95, 0xEE96, 0x51A0,
+ 0xEE97, 0xEE97, 0x25D2, 0xEE98, 0xEE98, 0x51A2, 0xEE99, 0xEE99, 0x1F2A,
+ 0xEE9A, 0xEE9C, 0x51A3, 0xEE9D, 0xEE9D, 0x1E72, 0xEE9E, 0xEE9E, 0x25D3,
+ 0xEE9F, 0xEEA0, 0x51A6, 0xEEA1, 0xEEFE, 0x1A6B, 0xEF40, 0xEF40, 0x21BE,
+ 0xEF41, 0xEF41, 0x25D4, 0xEF42, 0xEF42, 0x2044, 0xEF43, 0xEF43, 0x51A8,
+ 0xEF44, 0xEF44, 0x25CF, 0xEF45, 0xEF45, 0x20F3, 0xEF46, 0xEF4B, 0x51A9,
+ 0xEF4C, 0xEF4C, 0x1F00, 0xEF4D, 0xEF51, 0x51AF, 0xEF52, 0xEF53, 0x24CC,
+ 0xEF54, 0xEF54, 0x51B4, 0xEF55, 0xEF55, 0x2698, 0xEF56, 0xEF56, 0x51B5,
+ 0xEF57, 0xEF57, 0x2678, 0xEF58, 0xEF59, 0x51B6, 0xEF5A, 0xEF5A, 0x24CE,
+ 0xEF5B, 0xEF5F, 0x51B8, 0xEF60, 0xEF60, 0x24CF, 0xEF61, 0xEF67, 0x51BD,
+ 0xEF68, 0xEF68, 0x20B8, 0xEF69, 0xEF69, 0x51C4, 0xEF6A, 0xEF6A, 0x24D0,
+ 0xEF6B, 0xEF6B, 0x51C5, 0xEF6C, 0xEF6C, 0x24D1, 0xEF6D, 0xEF76, 0x51C6,
+ 0xEF77, 0xEF77, 0x1EF4, 0xEF78, 0xEF79, 0x51D0, 0xEF7A, 0xEF7A, 0x239B,
+ 0xEF7B, 0xEF7B, 0x51D2, 0xEF7C, 0xEF7C, 0x267E, 0xEF7D, 0xEF7E, 0x51D3,
+ 0xEF80, 0xEF81, 0x51D5, 0xEF82, 0xEF82, 0x239D, 0xEF83, 0xEF84, 0x239F,
+ 0xEF85, 0xEF85, 0x51D7, 0xEF86, 0xEF86, 0x23A1, 0xEF87, 0xEF87, 0x51D8,
+ 0xEF88, 0xEF88, 0x1EF1, 0xEF89, 0xEF8A, 0x51D9, 0xEF8B, 0xEF8B, 0x221E,
+ 0xEF8C, 0xEF8C, 0x51DB, 0xEF8D, 0xEF8D, 0x23A2, 0xEF8E, 0xEF94, 0x51DC,
+ 0xEF95, 0xEF95, 0x214B, 0xEF96, 0xEF96, 0x1E36, 0xEF97, 0xEF97, 0x2135,
+ 0xEF98, 0xEF9B, 0x51E3, 0xEF9C, 0xEF9C, 0x1FAD, 0xEF9D, 0xEF9D, 0x51E7,
+ 0xEF9E, 0xEF9E, 0x1E53, 0xEF9F, 0xEFA0, 0x51E8, 0xEFA1, 0xEFFE, 0x1AC9,
+ 0xF040, 0xF040, 0x51EA, 0xF041, 0xF041, 0x23A3, 0xF042, 0xF042, 0x2203,
+ 0xF043, 0xF043, 0x51EB, 0xF044, 0xF044, 0x1EE7, 0xF045, 0xF046, 0x51EC,
+ 0xF047, 0xF047, 0x23A4, 0xF048, 0xF048, 0x2097, 0xF049, 0xF049, 0x1EE4,
+ 0xF04A, 0xF04D, 0x51EE, 0xF04E, 0xF04E, 0x2238, 0xF04F, 0xF050, 0x51F2,
+ 0xF051, 0xF051, 0x23A5, 0xF052, 0xF053, 0x51F4, 0xF054, 0xF054, 0x1F9A,
+ 0xF055, 0xF056, 0x51F6, 0xF057, 0xF057, 0x21C3, 0xF058, 0xF05D, 0x51F8,
+ 0xF05E, 0xF05E, 0x1F2E, 0xF05F, 0xF067, 0x51FE, 0xF068, 0xF068, 0x239C,
+ 0xF069, 0xF06B, 0x5207, 0xF06C, 0xF06C, 0x23A6, 0xF06D, 0xF070, 0x520A,
+ 0xF071, 0xF071, 0x239E, 0xF072, 0xF072, 0x520E, 0xF073, 0xF073, 0x2035,
+ 0xF074, 0xF074, 0x23A7, 0xF075, 0xF077, 0x520F, 0xF078, 0xF078, 0x23A8,
+ 0xF079, 0xF079, 0x5212, 0xF07A, 0xF07A, 0x2075, 0xF07B, 0xF07C, 0x5213,
+ 0xF07D, 0xF07E, 0x23A9, 0xF080, 0xF080, 0x23AB, 0xF081, 0xF081, 0x1FEB,
+ 0xF082, 0xF082, 0x23AC, 0xF083, 0xF086, 0x5215, 0xF087, 0xF087, 0x1F6A,
+ 0xF088, 0xF088, 0x20F9, 0xF089, 0xF08A, 0x5219, 0xF08B, 0xF08B, 0x2666,
+ 0xF08C, 0xF08F, 0x521B, 0xF090, 0xF090, 0x2667, 0xF091, 0xF091, 0x521F,
+ 0xF092, 0xF092, 0x1E6C, 0xF093, 0xF095, 0x5220, 0xF096, 0xF096, 0x23AD,
+ 0xF097, 0xF0A0, 0x5223, 0xF0A1, 0xF0FE, 0x1B27, 0xF140, 0xF151, 0x522D,
+ 0xF152, 0xF152, 0x206D, 0xF153, 0xF153, 0x2242, 0xF154, 0xF154, 0x1F02,
+ 0xF155, 0xF156, 0x523F, 0xF157, 0xF157, 0x2183, 0xF158, 0xF158, 0x5241,
+ 0xF159, 0xF159, 0x1E85, 0xF15A, 0xF15A, 0x21E9, 0xF15B, 0xF166, 0x5242,
+ 0xF167, 0xF167, 0x1E57, 0xF168, 0xF175, 0x524E, 0xF176, 0xF176, 0x22A5,
+ 0xF177, 0xF177, 0x2407, 0xF178, 0xF178, 0x1FCA, 0xF179, 0xF179, 0x525C,
+ 0xF17A, 0xF17A, 0x2402, 0xF17B, 0xF17B, 0x1F82, 0xF17C, 0xF17D, 0x525D,
+ 0xF17E, 0xF17E, 0x2408, 0xF180, 0xF180, 0x2404, 0xF181, 0xF181, 0x525F,
+ 0xF182, 0xF182, 0x2131, 0xF183, 0xF183, 0x5260, 0xF184, 0xF184, 0x2184,
+ 0xF185, 0xF185, 0x5261, 0xF186, 0xF186, 0x2403, 0xF187, 0xF187, 0x5262,
+ 0xF188, 0xF188, 0x206E, 0xF189, 0xF189, 0x240B, 0xF18A, 0xF193, 0x5263,
+ 0xF194, 0xF194, 0x1F3F, 0xF195, 0xF197, 0x526D, 0xF198, 0xF198, 0x2067,
+ 0xF199, 0xF1A0, 0x5270, 0xF1A1, 0xF1FE, 0x1B85, 0xF240, 0xF244, 0x5278,
+ 0xF245, 0xF245, 0x1FD7, 0xF246, 0xF246, 0x527D, 0xF247, 0xF247, 0x1E83,
+ 0xF248, 0xF24A, 0x527E, 0xF24B, 0xF24B, 0x240F, 0xF24C, 0xF252, 0x5281,
+ 0xF253, 0xF253, 0x240E, 0xF254, 0xF254, 0x20C7, 0xF255, 0xF255, 0x240D,
+ 0xF256, 0xF25B, 0x5288, 0xF25C, 0xF25C, 0x2412, 0xF25D, 0xF25E, 0x528E,
+ 0xF25F, 0xF25F, 0x20B7, 0xF260, 0xF270, 0x5290, 0xF271, 0xF271, 0x23F0,
+ 0xF272, 0xF272, 0x52A1, 0xF273, 0xF273, 0x2411, 0xF274, 0xF274, 0x2414,
+ 0xF275, 0xF275, 0x52A2, 0xF276, 0xF276, 0x2170, 0xF277, 0xF27B, 0x52A3,
+ 0xF27C, 0xF27C, 0x2405, 0xF27D, 0xF27D, 0x210C, 0xF27E, 0xF27E, 0x2415,
+ 0xF280, 0xF284, 0x52A8, 0xF285, 0xF285, 0x2066, 0xF286, 0xF286, 0x52AD,
+ 0xF287, 0xF287, 0x2352, 0xF288, 0xF288, 0x2413, 0xF289, 0xF289, 0x2410,
+ 0xF28A, 0xF28B, 0x2416, 0xF28C, 0xF28C, 0x20F1, 0xF28D, 0xF290, 0x52AE,
+ 0xF291, 0xF291, 0x240A, 0xF292, 0xF293, 0x52B2, 0xF294, 0xF294, 0x2409,
+ 0xF295, 0xF295, 0x52B4, 0xF296, 0xF296, 0x2418, 0xF297, 0xF29B, 0x52B5,
+ 0xF29C, 0xF29C, 0x1FA7, 0xF29D, 0xF29D, 0x52BA, 0xF29E, 0xF29E, 0x21FC,
+ 0xF29F, 0xF2A0, 0x52BB, 0xF2A1, 0xF2FE, 0x1BE3, 0xF340, 0xF340, 0x1FC1,
+ 0xF341, 0xF341, 0x2406, 0xF342, 0xF344, 0x52BD, 0xF345, 0xF345, 0x229C,
+ 0xF346, 0xF347, 0x52C0, 0xF348, 0xF348, 0x204E, 0xF349, 0xF349, 0x52C2,
+ 0xF34A, 0xF34A, 0x241A, 0xF34B, 0xF34B, 0x2419, 0xF34C, 0xF34F, 0x52C3,
+ 0xF350, 0xF350, 0x240C, 0xF351, 0xF360, 0x52C7, 0xF361, 0xF361, 0x1E29,
+ 0xF362, 0xF373, 0x52D7, 0xF374, 0xF374, 0x2661, 0xF375, 0xF375, 0x52E9,
+ 0xF376, 0xF376, 0x26A4, 0xF377, 0xF377, 0x2174, 0xF378, 0xF378, 0x2663,
+ 0xF379, 0xF379, 0x2662, 0xF37A, 0xF37E, 0x52EA, 0xF380, 0xF38B, 0x52EF,
+ 0xF38C, 0xF38C, 0x2675, 0xF38D, 0xF39F, 0x52FB, 0xF3A0, 0xF3A0, 0x214C,
+ 0xF3A1, 0xF3FE, 0x1C41, 0xF440, 0xF444, 0x530E, 0xF445, 0xF445, 0x267A,
+ 0xF446, 0xF44F, 0x5313, 0xF450, 0xF450, 0x26A0, 0xF451, 0xF456, 0x531D,
+ 0xF457, 0xF457, 0x2668, 0xF458, 0xF458, 0x5323, 0xF459, 0xF459, 0x1ED0,
+ 0xF45A, 0xF45A, 0x5324, 0xF45B, 0xF45B, 0x2096, 0xF45C, 0xF45C, 0x5325,
+ 0xF45D, 0xF45D, 0x23CC, 0xF45E, 0xF461, 0x5326, 0xF462, 0xF462, 0x23C8,
+ 0xF463, 0xF463, 0x532A, 0xF464, 0xF464, 0x223E, 0xF465, 0xF474, 0x532B,
+ 0xF475, 0xF475, 0x2665, 0xF476, 0xF47B, 0x533B, 0xF47C, 0xF47C, 0x2664,
+ 0xF47D, 0xF47D, 0x5341, 0xF47E, 0xF47E, 0x2239, 0xF480, 0xF493, 0x5342,
+ 0xF494, 0xF494, 0x204A, 0xF495, 0xF498, 0x5356, 0xF499, 0xF499, 0x261F,
+ 0xF49A, 0xF49B, 0x535A, 0xF49C, 0xF49C, 0x261E, 0xF49D, 0xF4A0, 0x535C,
+ 0xF4A1, 0xF4FE, 0x1C9F, 0xF540, 0xF544, 0x5360, 0xF545, 0xF545, 0x2620,
+ 0xF546, 0xF546, 0x5365, 0xF547, 0xF547, 0x2621, 0xF548, 0xF551, 0x5366,
+ 0xF552, 0xF552, 0x2622, 0xF553, 0xF553, 0x5370, 0xF554, 0xF554, 0x2627,
+ 0xF555, 0xF555, 0x1E39, 0xF556, 0xF556, 0x2625, 0xF557, 0xF55D, 0x5371,
+ 0xF55E, 0xF55E, 0x2629, 0xF55F, 0xF560, 0x5378, 0xF561, 0xF561, 0x262E,
+ 0xF562, 0xF562, 0x262B, 0xF563, 0xF56D, 0x537A, 0xF56E, 0xF56E, 0x262A,
+ 0xF56F, 0xF56F, 0x262D, 0xF570, 0xF570, 0x5385, 0xF571, 0xF571, 0x2628,
+ 0xF572, 0xF572, 0x21B9, 0xF573, 0xF57E, 0x5386, 0xF580, 0xF584, 0x5392,
+ 0xF585, 0xF585, 0x2636, 0xF586, 0xF586, 0x2630, 0xF587, 0xF58B, 0x5397,
+ 0xF58C, 0xF58C, 0x2638, 0xF58D, 0xF58D, 0x539C, 0xF58E, 0xF58E, 0x200D,
+ 0xF58F, 0xF58F, 0x2637, 0xF590, 0xF598, 0x539D, 0xF599, 0xF599, 0x2645,
+ 0xF59A, 0xF59A, 0x53A6, 0xF59B, 0xF59B, 0x263A, 0xF59C, 0xF59F, 0x53A7,
+ 0xF5A0, 0xF5A0, 0x2643, 0xF5A1, 0xF5FE, 0x1CFD, 0xF640, 0xF640, 0x53AB,
+ 0xF641, 0xF641, 0x2640, 0xF642, 0xF644, 0x53AC, 0xF645, 0xF645, 0x263D,
+ 0xF646, 0xF646, 0x2641, 0xF647, 0xF647, 0x53AF, 0xF648, 0xF648, 0x263E,
+ 0xF649, 0xF64A, 0x53B0, 0xF64B, 0xF64B, 0x263F, 0xF64C, 0xF64C, 0x1FC0,
+ 0xF64D, 0xF64D, 0x53B2, 0xF64E, 0xF64F, 0x263B, 0xF650, 0xF653, 0x53B3,
+ 0xF654, 0xF654, 0x2642, 0xF655, 0xF657, 0x53B7, 0xF658, 0xF658, 0x2644,
+ 0xF659, 0xF660, 0x53BA, 0xF661, 0xF661, 0x2639, 0xF662, 0xF662, 0x53C2,
+ 0xF663, 0xF663, 0x264C, 0xF664, 0xF66B, 0x53C3, 0xF66C, 0xF66C, 0x2647,
+ 0xF66D, 0xF66D, 0x264B, 0xF66E, 0xF670, 0x53CB, 0xF671, 0xF671, 0x2649,
+ 0xF672, 0xF673, 0x53CE, 0xF674, 0xF674, 0x2648, 0xF675, 0xF675, 0x53D0,
+ 0xF676, 0xF676, 0x264A, 0xF677, 0xF677, 0x2108, 0xF678, 0xF67E, 0x53D1,
+ 0xF680, 0xF684, 0x53D8, 0xF685, 0xF685, 0x264D, 0xF686, 0xF687, 0x53DD,
+ 0xF688, 0xF688, 0x2634, 0xF689, 0xF689, 0x53DF, 0xF68A, 0xF68A, 0x2651,
+ 0xF68B, 0xF68C, 0x53E0, 0xF68D, 0xF68D, 0x2650, 0xF68E, 0xF68E, 0x2652,
+ 0xF68F, 0xF691, 0x53E2, 0xF692, 0xF692, 0x264F, 0xF693, 0xF695, 0x53E5,
+ 0xF696, 0xF696, 0x2632, 0xF697, 0xF697, 0x264E, 0xF698, 0xF698, 0x2653,
+ 0xF699, 0xF699, 0x53E8, 0xF69A, 0xF69A, 0x2657, 0xF69B, 0xF69B, 0x53E9,
+ 0xF69C, 0xF69C, 0x2635, 0xF69D, 0xF69D, 0x53EA, 0xF69E, 0xF69E, 0x2633,
+ 0xF69F, 0xF69F, 0x53EB, 0xF6A0, 0xF6A0, 0x2656, 0xF6A1, 0xF6FE, 0x1D5B,
+ 0xF740, 0xF741, 0x53EC, 0xF742, 0xF742, 0x2654, 0xF743, 0xF748, 0x53EE,
+ 0xF749, 0xF749, 0x2658, 0xF74A, 0xF74B, 0x53F4, 0xF74C, 0xF74C, 0x2655,
+ 0xF74D, 0xF74D, 0x1E4D, 0xF74E, 0xF755, 0x53F6, 0xF756, 0xF756, 0x265B,
+ 0xF757, 0xF757, 0x53FE, 0xF758, 0xF758, 0x265A, 0xF759, 0xF759, 0x53FF,
+ 0xF75A, 0xF75A, 0x2659, 0xF75B, 0xF75B, 0x202E, 0xF75C, 0xF75C, 0x262F,
+ 0xF75D, 0xF760, 0x5400, 0xF761, 0xF761, 0x2646, 0xF762, 0xF762, 0x5404,
+ 0xF763, 0xF763, 0x2626, 0xF764, 0xF76A, 0x5405, 0xF76B, 0xF76B, 0x265C,
+ 0xF76C, 0xF770, 0x540C, 0xF771, 0xF771, 0x262C, 0xF772, 0xF77B, 0x5411,
+ 0xF77C, 0xF77C, 0x2623, 0xF77D, 0xF77D, 0x541B, 0xF77E, 0xF77E, 0x2631,
+ 0xF780, 0xF7A0, 0x541C, 0xF7A1, 0xF7FE, 0x1DB9, 0xF840, 0xF841, 0x543D,
+ 0xF842, 0xF842, 0x209C, 0xF843, 0xF845, 0x543F, 0xF846, 0xF846, 0x2580,
+ 0xF847, 0xF848, 0x5442, 0xF849, 0xF849, 0x22DC, 0xF84A, 0xF84F, 0x5444,
+ 0xF850, 0xF850, 0x1F05, 0xF851, 0xF851, 0x208B, 0xF852, 0xF852, 0x544A,
+ 0xF853, 0xF853, 0x2581, 0xF854, 0xF862, 0x544B, 0xF863, 0xF863, 0x2583,
+ 0xF864, 0xF864, 0x2582, 0xF865, 0xF865, 0x545A, 0xF866, 0xF866, 0x21EE,
+ 0xF867, 0xF871, 0x545B, 0xF872, 0xF872, 0x2182, 0xF873, 0xF877, 0x5466,
+ 0xF878, 0xF878, 0x2243, 0xF879, 0xF879, 0x546B, 0xF87A, 0xF87A, 0x2587,
+ 0xF87B, 0xF87B, 0x546C, 0xF87C, 0xF87C, 0x2588, 0xF87D, 0xF87E, 0x546D,
+ 0xF880, 0xF880, 0x546F, 0xF881, 0xF881, 0x2584, 0xF882, 0xF883, 0x5470,
+ 0xF884, 0xF884, 0x21FD, 0xF885, 0xF885, 0x5472, 0xF886, 0xF886, 0x21EF,
+ 0xF887, 0xF88C, 0x5473, 0xF88D, 0xF88D, 0x258A, 0xF88E, 0xF88E, 0x258C,
+ 0xF88F, 0xF898, 0x5479, 0xF899, 0xF899, 0x1F47, 0xF89A, 0xF89C, 0x5483,
+ 0xF89D, 0xF89D, 0x1F1D, 0xF89E, 0xF89F, 0x5486, 0xF8A0, 0xF8A0, 0x258D,
+ 0xF940, 0xF94D, 0x5488, 0xF94E, 0xF94E, 0x1FD0, 0xF94F, 0xF94F, 0x2592,
+ 0xF950, 0xF950, 0x258F, 0xF951, 0xF958, 0x5496, 0xF959, 0xF959, 0x2594,
+ 0xF95A, 0xF95A, 0x1EE0, 0xF95B, 0xF95C, 0x549E, 0xF95D, 0xF95D, 0x2591,
+ 0xF95E, 0xF95E, 0x2595, 0xF95F, 0xF966, 0x54A0, 0xF967, 0xF967, 0x2597,
+ 0xF968, 0xF968, 0x54A8, 0xF969, 0xF969, 0x20B6, 0xF96A, 0xF96B, 0x54A9,
+ 0xF96C, 0xF96C, 0x2598, 0xF96D, 0xF96E, 0x54AB, 0xF96F, 0xF96F, 0x20F6,
+ 0xF970, 0xF97E, 0x54AD, 0xF980, 0xF984, 0x54BC, 0xF985, 0xF985, 0x2585,
+ 0xF986, 0xF986, 0x54C1, 0xF987, 0xF987, 0x2599, 0xF988, 0xF990, 0x54C2,
+ 0xF991, 0xF991, 0x2596, 0xF992, 0xF995, 0x54CB, 0xF996, 0xF996, 0x259A,
+ 0xF997, 0xF997, 0x54CF, 0xF998, 0xF998, 0x259B, 0xF999, 0xF9A0, 0x54D0,
+ 0xFA40, 0xFA41, 0x54D8, 0xFA42, 0xFA42, 0x259D, 0xFA43, 0xFA45, 0x54DA,
+ 0xFA46, 0xFA46, 0x259E, 0xFA47, 0xFA4B, 0x54DD, 0xFA4C, 0xFA4C, 0x234C,
+ 0xFA4D, 0xFA50, 0x54E2, 0xFA51, 0xFA51, 0x1F44, 0xFA52, 0xFA57, 0x54E6,
+ 0xFA58, 0xFA58, 0x2660, 0xFA59, 0xFA59, 0x25A0, 0xFA5A, 0xFA5C, 0x54EC,
+ 0xFA5D, 0xFA5D, 0x259C, 0xFA5E, 0xFA5E, 0x54EF, 0xFA5F, 0xFA5F, 0x259F,
+ 0xFA60, 0xFA60, 0x54F0, 0xFA61, 0xFA61, 0x1F6C, 0xFA62, 0xFA6F, 0x54F1,
+ 0xFA70, 0xFA70, 0x25A2, 0xFA71, 0xFA73, 0x54FF, 0xFA74, 0xFA74, 0x20AE,
+ 0xFA75, 0xFA75, 0x5502, 0xFA76, 0xFA76, 0x258B, 0xFA77, 0xFA77, 0x25A3,
+ 0xFA78, 0xFA7E, 0x5503, 0xFA80, 0xFA82, 0x550A, 0xFA83, 0xFA83, 0x2589,
+ 0xFA84, 0xFA84, 0x25A5, 0xFA85, 0xFA8C, 0x550D, 0xFA8D, 0xFA8D, 0x25A4,
+ 0xFA8E, 0xFA8F, 0x5515, 0xFA90, 0xFA90, 0x25A6, 0xFA91, 0xFA91, 0x2593,
+ 0xFA92, 0xFA95, 0x5517, 0xFA96, 0xFA96, 0x25A7, 0xFA97, 0xFA97, 0x2222,
+ 0xFA98, 0xFA98, 0x25A9, 0xFA99, 0xFAA0, 0x551B, 0xFB40, 0xFB48, 0x5523,
+ 0xFB49, 0xFB49, 0x25A8, 0xFB4A, 0xFB51, 0x552C, 0xFB52, 0xFB52, 0x2586,
+ 0xFB53, 0xFB56, 0x5534, 0xFB57, 0xFB57, 0x25A1, 0xFB58, 0xFB58, 0x25AA,
+ 0xFB59, 0xFB59, 0x5538, 0xFB5A, 0xFB5A, 0x2590, 0xFB5B, 0xFB5B, 0x258E,
+ 0xFB5C, 0xFB74, 0x5539, 0xFB75, 0xFB75, 0x2688, 0xFB76, 0xFB78, 0x5552,
+ 0xFB79, 0xFB79, 0x269E, 0xFB7A, 0xFB7A, 0x25FB, 0xFB7B, 0xFB7B, 0x5555,
+ 0xFB7C, 0xFB7C, 0x1F8C, 0xFB7D, 0xFB7D, 0x21F4, 0xFB7E, 0xFB7E, 0x5556,
+ 0xFB80, 0xFB8F, 0x5557, 0xFB90, 0xFB90, 0x200F, 0xFB91, 0xFB9B, 0x5567,
+ 0xFB9C, 0xFB9C, 0x2071, 0xFB9D, 0xFB9E, 0x5572, 0xFB9F, 0xFB9F, 0x25F7,
+ 0xFBA0, 0xFBA0, 0x5574, 0xFC40, 0xFC43, 0x5575, 0xFC44, 0xFC44, 0x2696,
+ 0xFC45, 0xFC48, 0x5579, 0xFC49, 0xFC49, 0x268F, 0xFC4A, 0xFC59, 0x557D,
+ 0xFC5A, 0xFC5A, 0x22DA, 0xFC5B, 0xFC62, 0x558D, 0xFC63, 0xFC63, 0x1EC1,
+ 0xFC64, 0xFC67, 0x5595, 0xFC68, 0xFC68, 0x1EB3, 0xFC69, 0xFC6E, 0x5599,
+ 0xFC6F, 0xFC6F, 0x266A, 0xFC70, 0xFC70, 0x559F, 0xFC71, 0xFC71, 0x268A,
+ 0xFC72, 0xFC73, 0x55A0, 0xFC74, 0xFC74, 0x2669, 0xFC75, 0xFC76, 0x55A2,
+ 0xFC77, 0xFC78, 0x2618, 0xFC79, 0xFC7E, 0x55A4, 0xFC80, 0xFC82, 0x55AA,
+ 0xFC83, 0xFC83, 0x261A, 0xFC84, 0xFC89, 0x55AD, 0xFC8A, 0xFC8A, 0x2673,
+ 0xFC8B, 0xFCA0, 0x55B3, 0xFD40, 0xFD51, 0x55C9, 0xFD52, 0xFD52, 0x20C6,
+ 0xFD53, 0xFD53, 0x226B, 0xFD54, 0xFD56, 0x55DB, 0xFD57, 0xFD57, 0x24D3,
+ 0xFD58, 0xFD58, 0x1E86, 0xFD59, 0xFD59, 0x55DE, 0xFD5A, 0xFD5A, 0x260F,
+ 0xFD5B, 0xFD5E, 0x55DF, 0xFD5F, 0xFD5F, 0x2611, 0xFD60, 0xFD61, 0x55E3,
+ 0xFD62, 0xFD62, 0x2613, 0xFD63, 0xFD64, 0x55E5, 0xFD65, 0xFD65, 0x2610,
+ 0xFD66, 0xFD66, 0x2612, 0xFD67, 0xFD67, 0x2030, 0xFD68, 0xFD68, 0x55E7,
+ 0xFD69, 0xFD69, 0x2671, 0xFD6A, 0xFD6B, 0x55E8, 0xFD6C, 0xFD6C, 0x2614,
+ 0xFD6D, 0xFD6F, 0x55EA, 0xFD70, 0xFD70, 0x2616, 0xFD71, 0xFD71, 0x55ED,
+ 0xFD72, 0xFD72, 0x2615, 0xFD73, 0xFD77, 0x55EE, 0xFD78, 0xFD78, 0x20F2,
+ 0xFD79, 0xFD7C, 0x55F3, 0xFD7D, 0xFD7D, 0x2617, 0xFD7E, 0xFD7E, 0x55F7,
+ 0xFD80, 0xFD87, 0x55F8, 0xFD88, 0xFD88, 0x2037, 0xFD89, 0xFD8A, 0x5600,
+ 0xFD8B, 0xFD8B, 0x20B3, 0xFD8C, 0xFD8E, 0x5602, 0xFD8F, 0xFD8F, 0x1F22,
+ 0xFD90, 0xFD90, 0x24ED, 0xFD91, 0xFD93, 0x5605, 0xFD94, 0xFD94, 0x1F34,
+ 0xFD95, 0xFD9C, 0x5608, 0xFD9D, 0xFD9D, 0x0A02, 0xFD9E, 0xFD9E, 0x40D3,
+ 0xFD9F, 0xFD9F, 0x200C, 0xFDA0, 0xFDA0, 0x5083, 0xFE40, 0xFE40, 0x1259,
+ 0xFE41, 0xFE7E, 0x5610, 0xFE80, 0xFEA0, 0x564E,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp
new file mode 100644
index 0000000000..97d9798847
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBKp_EUC_V_2[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
new file mode 100644
index 0000000000..1b3e072a6c
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBpc_EUC_H_0[91 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x1E20, 0x00FD, 0x00FF, 0x1E21,
+ 0xA1A1, 0xA1FE, 0x0060, 0xA2B1, 0xA2E2, 0x00BE, 0xA2E5, 0xA2EE, 0x00F0,
+ 0xA2F1, 0xA2FC, 0x00FA, 0xA3A1, 0xA3FE, 0x0106, 0xA4A1, 0xA4F3, 0x0164,
+ 0xA5A1, 0xA5F6, 0x01B7, 0xA6A1, 0xA6B8, 0x020D, 0xA6C1, 0xA6F5, 0x0225,
+ 0xA7A1, 0xA7C1, 0x025A, 0xA7D1, 0xA7F1, 0x027B, 0xA8A1, 0xA8C0, 0x029C,
+ 0xA8C5, 0xA8EA, 0x02BC, 0xA9A4, 0xA9EF, 0x02E2, 0xAAA1, 0xAAFE, 0x032E,
+ 0xABA1, 0xABC0, 0x038C, 0xB0A1, 0xB0FE, 0x03AC, 0xB1A1, 0xB1FE, 0x040A,
+ 0xB2A1, 0xB2FE, 0x0468, 0xB3A1, 0xB3FE, 0x04C6, 0xB4A1, 0xB4FE, 0x0524,
+ 0xB5A1, 0xB5FE, 0x0582, 0xB6A1, 0xB6FE, 0x05E0, 0xB7A1, 0xB7FE, 0x063E,
+ 0xB8A1, 0xB8FE, 0x069C, 0xB9A1, 0xB9FE, 0x06FA, 0xBAA1, 0xBAFE, 0x0758,
+ 0xBBA1, 0xBBFE, 0x07B6, 0xBCA1, 0xBCFE, 0x0814, 0xBDA1, 0xBDFE, 0x0872,
+ 0xBEA1, 0xBEFE, 0x08D0, 0xBFA1, 0xBFFE, 0x092E, 0xC0A1, 0xC0FE, 0x098C,
+ 0xC1A1, 0xC1FE, 0x09EA, 0xC2A1, 0xC2FE, 0x0A48, 0xC3A1, 0xC3FE, 0x0AA6,
+ 0xC4A1, 0xC4FE, 0x0B04, 0xC5A1, 0xC5FE, 0x0B62, 0xC6A1, 0xC6FE, 0x0BC0,
+ 0xC7A1, 0xC7FE, 0x0C1E, 0xC8A1, 0xC8FE, 0x0C7C, 0xC9A1, 0xC9FE, 0x0CDA,
+ 0xCAA1, 0xCAFE, 0x0D38, 0xCBA1, 0xCBFE, 0x0D96, 0xCCA1, 0xCCFE, 0x0DF4,
+ 0xCDA1, 0xCDFE, 0x0E52, 0xCEA1, 0xCEFE, 0x0EB0, 0xCFA1, 0xCFFE, 0x0F0E,
+ 0xD0A1, 0xD0FE, 0x0F6C, 0xD1A1, 0xD1FE, 0x0FCA, 0xD2A1, 0xD2FE, 0x1028,
+ 0xD3A1, 0xD3FE, 0x1086, 0xD4A1, 0xD4FE, 0x10E4, 0xD5A1, 0xD5FE, 0x1142,
+ 0xD6A1, 0xD6FE, 0x11A0, 0xD7A1, 0xD7F9, 0x11FE, 0xD8A1, 0xD8FE, 0x1257,
+ 0xD9A1, 0xD9FE, 0x12B5, 0xDAA1, 0xDAFE, 0x1313, 0xDBA1, 0xDBFE, 0x1371,
+ 0xDCA1, 0xDCFE, 0x13CF, 0xDDA1, 0xDDFE, 0x142D, 0xDEA1, 0xDEFE, 0x148B,
+ 0xDFA1, 0xDFFE, 0x14E9, 0xE0A1, 0xE0FE, 0x1547, 0xE1A1, 0xE1FE, 0x15A5,
+ 0xE2A1, 0xE2FE, 0x1603, 0xE3A1, 0xE3FE, 0x1661, 0xE4A1, 0xE4FE, 0x16BF,
+ 0xE5A1, 0xE5FE, 0x171D, 0xE6A1, 0xE6FE, 0x177B, 0xE7A1, 0xE7FE, 0x17D9,
+ 0xE8A1, 0xE8FE, 0x1837, 0xE9A1, 0xE9FE, 0x1895, 0xEAA1, 0xEAFE, 0x18F3,
+ 0xEBA1, 0xEBFE, 0x1951, 0xECA1, 0xECFE, 0x19AF, 0xEDA1, 0xEDFE, 0x1A0D,
+ 0xEEA1, 0xEEFE, 0x1A6B, 0xEFA1, 0xEFFE, 0x1AC9, 0xF0A1, 0xF0FE, 0x1B27,
+ 0xF1A1, 0xF1FE, 0x1B85, 0xF2A1, 0xF2FE, 0x1BE3, 0xF3A1, 0xF3FE, 0x1C41,
+ 0xF4A1, 0xF4FE, 0x1C9F, 0xF5A1, 0xF5FE, 0x1CFD, 0xF6A1, 0xF6FE, 0x1D5B,
+ 0xF7A1, 0xF7FE, 0x1DB9,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
new file mode 100644
index 0000000000..be469f2eea
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_GBpc_EUC_V_0[20 * 3] = {
+ 0xA1A2, 0xA1A2, 0x023F, 0xA1A3, 0xA1A3, 0x023E, 0xA1AA, 0xA1AA, 0x0256,
+ 0xA1AB, 0xA1AC, 0x1E18, 0xA1AD, 0xA1AD, 0x0257, 0xA1B2, 0xA1BF, 0x0246,
+ 0xA1FE, 0xA1FE, 0x1E1A, 0xA3A1, 0xA3A1, 0x0242, 0xA3A8, 0xA3A9, 0x0244,
+ 0xA3AC, 0xA3AC, 0x023D, 0xA3AE, 0xA3AE, 0x1E1B, 0xA3BA, 0xA3BB, 0x0240,
+ 0xA3BD, 0xA3BD, 0x1E1C, 0xA3BF, 0xA3BF, 0x0243, 0xA3DB, 0xA3DB, 0x1E1D,
+ 0xA3DD, 0xA3DD, 0x1E1E, 0xA3DF, 0xA3DF, 0x0258, 0xA3FB, 0xA3FB, 0x0254,
+ 0xA3FD, 0xA3FD, 0x0255, 0xA3FE, 0xA3FE, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
new file mode 100644
index 0000000000..30003729df
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp
@@ -0,0 +1,4617 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniGB_UCS2_H_4[13825 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A4, 0x00A4, 0x00A7, 0x00A5, 0x00A5, 0x5752,
+ 0x00A7, 0x00A7, 0x00AB, 0x00A8, 0x00A8, 0x0066, 0x00B0, 0x00B0, 0x00A2,
+ 0x00B1, 0x00B1, 0x007F, 0x00D7, 0x00D7, 0x0080, 0x00E0, 0x00E0, 0x029F,
+ 0x00E1, 0x00E1, 0x029D, 0x00E8, 0x00E8, 0x02A3, 0x00E9, 0x00E9, 0x02A1,
+ 0x00EA, 0x00EA, 0x02B5, 0x00EC, 0x00EC, 0x02A7, 0x00ED, 0x00ED, 0x02A5,
+ 0x00F2, 0x00F2, 0x02AB, 0x00F3, 0x00F3, 0x02A9, 0x00F7, 0x00F7, 0x0081,
+ 0x00F9, 0x00F9, 0x02AF, 0x00FA, 0x00FA, 0x02AD, 0x00FC, 0x00FC, 0x02B4,
+ 0x0101, 0x0101, 0x029C, 0x0113, 0x0113, 0x02A0, 0x011B, 0x011B, 0x02A2,
+ 0x012B, 0x012B, 0x02A4, 0x014D, 0x014D, 0x02A8, 0x016B, 0x016B, 0x02AC,
+ 0x01CE, 0x01CE, 0x029E, 0x01D0, 0x01D0, 0x02A6, 0x01D2, 0x01D2, 0x02AA,
+ 0x01D4, 0x01D4, 0x02AE, 0x01D6, 0x01D6, 0x02B0, 0x01D8, 0x01D8, 0x02B1,
+ 0x01DA, 0x01DA, 0x02B2, 0x01DC, 0x01DC, 0x02B3, 0x01F9, 0x01F9, 0x02BA,
+ 0x02C7, 0x02C7, 0x0065, 0x02C9, 0x02C9, 0x0064, 0x02CA, 0x02CB, 0x26B3,
+ 0x02D9, 0x02D9, 0x26B5, 0x0391, 0x03A1, 0x020D, 0x03A3, 0x03A9, 0x021E,
+ 0x03B1, 0x03C1, 0x0225, 0x03C3, 0x03C9, 0x0236, 0x0401, 0x0401, 0x0260,
+ 0x0410, 0x0415, 0x025A, 0x0416, 0x0435, 0x0261, 0x0436, 0x044F, 0x0282,
+ 0x0451, 0x0451, 0x0281, 0x1E3F, 0x1E3F, 0x02B7, 0x2010, 0x2010, 0x2722,
+ 0x2013, 0x2013, 0x26B6, 0x2014, 0x2014, 0x0069, 0x2015, 0x2015, 0x26B7,
+ 0x2016, 0x2016, 0x006B, 0x2018, 0x2019, 0x006D, 0x201C, 0x201D, 0x006F,
+ 0x2025, 0x2025, 0x26B8, 0x2026, 0x2026, 0x006C, 0x2030, 0x2030, 0x00AA,
+ 0x2032, 0x2033, 0x00A3, 0x2035, 0x2035, 0x26B9, 0x203B, 0x203B, 0x00B8,
+ 0x20AC, 0x20AC, 0x5751, 0x2103, 0x2103, 0x00A5, 0x2105, 0x2105, 0x26BA,
+ 0x2109, 0x2109, 0x26BB, 0x2116, 0x2116, 0x00AC, 0x2121, 0x2121, 0x2720,
+ 0x2160, 0x216B, 0x00FA, 0x2170, 0x2179, 0x26A9, 0x2190, 0x2191, 0x00BA,
+ 0x2192, 0x2192, 0x00B9, 0x2193, 0x2193, 0x00BC, 0x2196, 0x2199, 0x26BC,
+ 0x2208, 0x2208, 0x0089, 0x220F, 0x220F, 0x0086, 0x2211, 0x2211, 0x0085,
+ 0x2215, 0x2215, 0x26C0, 0x221A, 0x221A, 0x008B, 0x221D, 0x221D, 0x0097,
+ 0x221E, 0x221E, 0x009D, 0x221F, 0x221F, 0x26C1, 0x2220, 0x2220, 0x008E,
+ 0x2223, 0x2223, 0x26C2, 0x2225, 0x2225, 0x008D, 0x2227, 0x2228, 0x0083,
+ 0x2229, 0x2229, 0x0088, 0x222A, 0x222A, 0x0087, 0x222B, 0x222B, 0x0091,
+ 0x222E, 0x222E, 0x0092, 0x2234, 0x2234, 0x009F, 0x2235, 0x2235, 0x009E,
+ 0x2236, 0x2236, 0x0082, 0x2237, 0x2237, 0x008A, 0x223D, 0x223D, 0x0096,
+ 0x2248, 0x2248, 0x0095, 0x224C, 0x224C, 0x0094, 0x2252, 0x2252, 0x26C3,
+ 0x2260, 0x2260, 0x0098, 0x2261, 0x2261, 0x0093, 0x2264, 0x2265, 0x009B,
+ 0x2266, 0x2267, 0x26C4, 0x226E, 0x226F, 0x0099, 0x2295, 0x2295, 0x2704,
+ 0x2299, 0x2299, 0x0090, 0x22A5, 0x22A5, 0x008C, 0x22BF, 0x22BF, 0x26C6,
+ 0x22EF, 0x22EF, 0x006C, 0x2312, 0x2312, 0x008F, 0x2460, 0x2469, 0x00E6,
+ 0x2474, 0x2487, 0x00D2, 0x2488, 0x249B, 0x00BE, 0x2500, 0x254B, 0x02E2,
+ 0x2550, 0x2573, 0x26C7, 0x2581, 0x258F, 0x26EB, 0x2593, 0x2595, 0x26FA,
+ 0x25A0, 0x25A0, 0x00B5, 0x25A1, 0x25A1, 0x00B4, 0x25B2, 0x25B2, 0x00B7,
+ 0x25B3, 0x25B3, 0x00B6, 0x25BC, 0x25BD, 0x26FD, 0x25C6, 0x25C6, 0x00B3,
+ 0x25C7, 0x25C7, 0x00B2, 0x25CB, 0x25CB, 0x00AF, 0x25CE, 0x25CE, 0x00B1,
+ 0x25CF, 0x25CF, 0x00B0, 0x25E2, 0x25E5, 0x26FF, 0x2605, 0x2605, 0x00AE,
+ 0x2606, 0x2606, 0x00AD, 0x2609, 0x2609, 0x2703, 0x2640, 0x2640, 0x00A1,
+ 0x2642, 0x2642, 0x00A0, 0x2E80, 0x2E80, 0x579C, 0x2E81, 0x2E81, 0x561F,
+ 0x2E82, 0x2E83, 0x579D, 0x2E84, 0x2E84, 0x5623, 0x2E85, 0x2E87, 0x579F,
+ 0x2E88, 0x2E88, 0x5626, 0x2E89, 0x2E8A, 0x57A2, 0x2E8B, 0x2E8B, 0x5627,
+ 0x2E8C, 0x2E8C, 0x562C, 0x2E8D, 0x2E96, 0x57A4, 0x2E97, 0x2E97, 0x562D,
+ 0x2E98, 0x2E99, 0x57AE, 0x2E9B, 0x2EA6, 0x57B0, 0x2EA7, 0x2EA7, 0x563A,
+ 0x2EA8, 0x2EA9, 0x57BC, 0x2EAA, 0x2EAA, 0x563D, 0x2EAB, 0x2EAD, 0x57BE,
+ 0x2EAE, 0x2EAE, 0x5640, 0x2EAF, 0x2EB2, 0x57C1, 0x2EB3, 0x2EB3, 0x5642,
+ 0x2EB4, 0x2EB5, 0x57C5, 0x2EB6, 0x2EB7, 0x5643, 0x2EB8, 0x2EBA, 0x57C7,
+ 0x2EBB, 0x2EBB, 0x5648, 0x2EBC, 0x2EC9, 0x57CA, 0x2ECA, 0x2ECA, 0x5652,
+ 0x2ECB, 0x2EF3, 0x57D8, 0x2F00, 0x2F00, 0x1042, 0x2F01, 0x2F01, 0x1263,
+ 0x2F02, 0x2F02, 0x1272, 0x2F03, 0x2F03, 0x1265, 0x2F04, 0x2F04, 0x1059,
+ 0x2F05, 0x2F05, 0x2793, 0x2F06, 0x2F06, 0x063D, 0x2F07, 0x2F07, 0x1303,
+ 0x2F08, 0x2F08, 0x0CA6, 0x2F09, 0x2F09, 0x0638, 0x2F0A, 0x2F0A, 0x0CC6,
+ 0x2F0B, 0x2F0B, 0x03D6, 0x2F0C, 0x2F0C, 0x129D, 0x2F0D, 0x2F0D, 0x1314,
+ 0x2F0E, 0x2F0E, 0x130F, 0x2F0F, 0x2F0F, 0x082B, 0x2F10, 0x2F10, 0x1399,
+ 0x2F11, 0x2F11, 0x0597, 0x2F12, 0x2F12, 0x09EF, 0x2F13, 0x2F13, 0x12FC,
+ 0x2F14, 0x2F14, 0x1266, 0x2F15, 0x2F15, 0x1284, 0x2F16, 0x2F16, 0x2A1A,
+ 0x2F17, 0x2F17, 0x0D45, 0x2F18, 0x2F18, 0x047E, 0x2F19, 0x2F19, 0x1352,
+ 0x2F1A, 0x2F1A, 0x04CC, 0x2F1B, 0x2F1B, 0x139C, 0x2F1C, 0x2F1C, 0x10BB,
+ 0x2F1D, 0x2F1D, 0x0967, 0x2F1E, 0x2F1E, 0x1593, 0x2F1F, 0x2F1F, 0x0E72,
+ 0x2F20, 0x2F20, 0x0D56, 0x2F21, 0x2F21, 0x161C, 0x2F22, 0x2F22, 0x2D2D,
+ 0x2F23, 0x2F23, 0x0F13, 0x2F24, 0x2F24, 0x0576, 0x2F25, 0x2F25, 0x0B6F,
+ 0x2F26, 0x2F26, 0x1230, 0x2F27, 0x2F27, 0x172E, 0x2F28, 0x2F28, 0x056A,
+ 0x2F29, 0x2F29, 0x0F6C, 0x2F2A, 0x2F2A, 0x14B6, 0x2F2B, 0x2F2B, 0x0D43,
+ 0x2F2C, 0x2F2C, 0x1774, 0x2F2D, 0x2F2D, 0x0CF6, 0x2F2E, 0x2F2E, 0x1815,
+ 0x2F2F, 0x2F2F, 0x06FD, 0x2F30, 0x2F30, 0x082D, 0x2F31, 0x2F31, 0x08BE,
+ 0x2F32, 0x2F32, 0x06C4, 0x2F33, 0x2F33, 0x1813, 0x2F34, 0x2F34, 0x073C,
+ 0x2F35, 0x2F35, 0x1398, 0x2F36, 0x2F36, 0x14AD, 0x2F37, 0x2F37, 0x14F6,
+ 0x2F38, 0x2F38, 0x0706, 0x2F39, 0x2F39, 0x1762, 0x2F3A, 0x2F3A, 0x15EE,
+ 0x2F3B, 0x2F3B, 0x15E0, 0x2F3C, 0x2F3C, 0x0F8F, 0x2F3D, 0x2F3D, 0x06E5,
+ 0x2F3E, 0x2F3E, 0x3292, 0x2F3F, 0x2F3F, 0x0D6D, 0x2F40, 0x2F40, 0x11A6,
+ 0x2F41, 0x2F41, 0x1909, 0x2F42, 0x2F42, 0x0ED3, 0x2F43, 0x2F43, 0x05F6,
+ 0x2F44, 0x2F44, 0x08C0, 0x2F45, 0x2F45, 0x065A, 0x2F46, 0x2F46, 0x0EED,
+ 0x2F47, 0x2F47, 0x0CB0, 0x2F48, 0x2F48, 0x10FE, 0x2F49, 0x2F49, 0x1105,
+ 0x2F4A, 0x2F4A, 0x0B21, 0x2F4B, 0x2F4B, 0x0C34, 0x2F4C, 0x2F4C, 0x11B8,
+ 0x2F4D, 0x2F4D, 0x0578, 0x2F4E, 0x2F4E, 0x19BD, 0x2F4F, 0x2F4F, 0x0EF2,
+ 0x2F50, 0x2F50, 0x0431, 0x2F51, 0x2F51, 0x0AB0, 0x2F52, 0x2F52, 0x0D66,
+ 0x2F53, 0x2F53, 0x0C17, 0x2F54, 0x2F54, 0x0DA3, 0x2F55, 0x2F55, 0x0805,
+ 0x2F56, 0x2F56, 0x1203, 0x2F57, 0x2F57, 0x06B3, 0x2F58, 0x2F58, 0x1269,
+ 0x2F59, 0x2F59, 0x169D, 0x2F5A, 0x2F5A, 0x0BCB, 0x2F5B, 0x2F5B, 0x0FE9,
+ 0x2F5C, 0x2F5C, 0x0B64, 0x2F5D, 0x2F5D, 0x0C89, 0x2F5E, 0x2F5E, 0x0FC9,
+ 0x2F5F, 0x2F5F, 0x10D6, 0x2F60, 0x2F60, 0x0728, 0x2F61, 0x2F61, 0x0E90,
+ 0x2F62, 0x2F62, 0x06C5, 0x2F63, 0x2F63, 0x0D33, 0x2F64, 0x2F64, 0x10A8,
+ 0x2F65, 0x2F65, 0x0E42, 0x2F66, 0x2F66, 0x1BC6, 0x2F67, 0x2F67, 0x1B60,
+ 0x2F68, 0x2F68, 0x3EBF, 0x2F69, 0x2F69, 0x03E2, 0x2F6A, 0x2F6A, 0x0BC3,
+ 0x2F6B, 0x2F6B, 0x0AF8, 0x2F6C, 0x2F6C, 0x0B22, 0x2F6D, 0x2F6D, 0x0AB1,
+ 0x2F6E, 0x2F6E, 0x0D4F, 0x2F6F, 0x2F6F, 0x0D46, 0x2F70, 0x2F70, 0x0D55,
+ 0x2F71, 0x2F71, 0x40CB, 0x2F72, 0x2F72, 0x0783, 0x2F73, 0x2F73, 0x0FD1,
+ 0x2F74, 0x2F74, 0x09EB, 0x2F75, 0x2F75, 0x11F0, 0x2F76, 0x2F76, 0x0ADC,
+ 0x2F77, 0x2F77, 0x1CE7, 0x2F78, 0x2F78, 0x1C5E, 0x2F79, 0x2F79, 0x0EA9,
+ 0x2F7A, 0x2F7A, 0x101B, 0x2F7B, 0x2F7B, 0x10D5, 0x2F7C, 0x2F7C, 0x09BA,
+ 0x2F7D, 0x2F7D, 0x0637, 0x2F7E, 0x2F7E, 0x1BCB, 0x2F7F, 0x2F7F, 0x0639,
+ 0x2F80, 0x2F80, 0x1A1E, 0x2F81, 0x2F81, 0x0CBD, 0x2F82, 0x2F82, 0x04E1,
+ 0x2F83, 0x2F83, 0x1231, 0x2F84, 0x2F84, 0x11C0, 0x2F85, 0x2F85, 0x08F9,
+ 0x2F86, 0x2F86, 0x0D19, 0x2F87, 0x2F87, 0x1618, 0x2F88, 0x2F88, 0x11DA,
+ 0x2F89, 0x2F89, 0x1CDC, 0x2F8A, 0x2F8A, 0x0CE4, 0x2F8B, 0x2F8B, 0x45A2,
+ 0x2F8C, 0x2F8C, 0x1BF0, 0x2F8D, 0x2F8D, 0x050B, 0x2F8E, 0x2F8E, 0x0FD3,
+ 0x2F8F, 0x2F8F, 0x0F9B, 0x2F90, 0x2F90, 0x1049, 0x2F91, 0x2F91, 0x49DC,
+ 0x2F92, 0x2F92, 0x1F96, 0x2F93, 0x2F93, 0x0898, 0x2F94, 0x2F94, 0x0FFD,
+ 0x2F95, 0x2F95, 0x0721, 0x2F96, 0x2F96, 0x05F8, 0x2F97, 0x2F97, 0x1D15,
+ 0x2F98, 0x2F98, 0x1D50, 0x2F99, 0x2F99, 0x1E3B, 0x2F9A, 0x2F9A, 0x0505,
+ 0x2F9B, 0x2F9B, 0x123C, 0x2F9C, 0x2F9C, 0x1240, 0x2F9D, 0x2F9D, 0x0D26,
+ 0x2F9E, 0x2F9E, 0x1E7B, 0x2F9F, 0x2F9F, 0x0F8C, 0x2FA0, 0x2FA0, 0x04E2,
+ 0x2FA1, 0x2FA1, 0x4D13, 0x2FA2, 0x2FA2, 0x105F, 0x2FA3, 0x2FA3, 0x10B4,
+ 0x2FA4, 0x2FA4, 0x4E18, 0x2FA5, 0x2FA5, 0x09DA, 0x2FA6, 0x2FA6, 0x08C1,
+ 0x2FA7, 0x2FA7, 0x1E75, 0x2FA8, 0x2FA8, 0x207D, 0x2FA9, 0x2FA9, 0x06B2,
+ 0x2FAA, 0x2FAA, 0x09EE, 0x2FAB, 0x2FAB, 0x1D79, 0x2FAC, 0x2FAC, 0x10CF,
+ 0x2FAD, 0x2FAD, 0x50EA, 0x2FAE, 0x2FAE, 0x0664, 0x2FAF, 0x2FAF, 0x0AEB,
+ 0x2FB0, 0x2FB0, 0x06EA, 0x2FB1, 0x2FB1, 0x218D, 0x2FB2, 0x2FB2, 0x08F1,
+ 0x2FB3, 0x2FB3, 0x107B, 0x2FB4, 0x2FB4, 0x2209, 0x2FB5, 0x2FB5, 0x1F00,
+ 0x2FB6, 0x2FB6, 0x1EF4, 0x2FB7, 0x2FB7, 0x0D4A, 0x2FB8, 0x2FB8, 0x0D6E,
+ 0x2FB9, 0x2FB9, 0x0F50, 0x2FBA, 0x2FBA, 0x206D, 0x2FBB, 0x2FBB, 0x0720,
+ 0x2FBC, 0x2FBC, 0x06DA, 0x2FBD, 0x2FBD, 0x1DEC, 0x2FBE, 0x2FBE, 0x1ED0,
+ 0x2FBF, 0x2FBF, 0x139B, 0x2FC0, 0x2FC0, 0x1260, 0x2FC1, 0x2FC1, 0x0746,
+ 0x2FC2, 0x2FC2, 0x2239, 0x2FC3, 0x2FC3, 0x209C, 0x2FC4, 0x2FC4, 0x2688,
+ 0x2FC5, 0x2FC5, 0x0A60, 0x2FC6, 0x2FC6, 0x2071, 0x2FC7, 0x2FC7, 0x0A90,
+ 0x2FC8, 0x2FC8, 0x5586, 0x2FC9, 0x2FC9, 0x0D89, 0x2FCA, 0x2FCA, 0x0791,
+ 0x2FCB, 0x2FCB, 0x1A55, 0x2FCC, 0x2FCC, 0x2618, 0x2FCD, 0x2FCD, 0x05E5,
+ 0x2FCE, 0x2FCE, 0x071D, 0x2FCF, 0x2FCF, 0x0D8A, 0x2FD0, 0x2FD0, 0x0430,
+ 0x2FD1, 0x2FD1, 0x20C6, 0x2FD2, 0x2FD2, 0x1E86, 0x2FD3, 0x2FD3, 0x2037,
+ 0x2FD4, 0x2FD4, 0x1F34, 0x2FD5, 0x2FD5, 0x12F3, 0x2FF0, 0x2FFB, 0x274C,
+ 0x3000, 0x3002, 0x0060, 0x3003, 0x3003, 0x0067, 0x3005, 0x3005, 0x0068,
+ 0x3006, 0x3006, 0x2728, 0x3007, 0x3007, 0x1E17, 0x3008, 0x300F, 0x0073,
+ 0x3010, 0x3011, 0x007D, 0x3012, 0x3012, 0x2705, 0x3013, 0x3013, 0x00BD,
+ 0x3014, 0x3015, 0x0071, 0x3016, 0x3017, 0x007B, 0x301D, 0x301E, 0x2706,
+ 0x3021, 0x3029, 0x2708, 0x3033, 0x3035, 0x577B, 0x3038, 0x303A, 0x577E,
+ 0x303E, 0x303E, 0x274B, 0x303F, 0x303F, 0x5755, 0x3041, 0x3093, 0x0164,
+ 0x3094, 0x3094, 0x5767, 0x309B, 0x309C, 0x2724, 0x309D, 0x309E, 0x2729,
+ 0x30A1, 0x30F6, 0x01B7, 0x30F7, 0x30FA, 0x5776, 0x30FB, 0x30FB, 0x0063,
+ 0x30FC, 0x30FC, 0x2723, 0x30FD, 0x30FE, 0x2726, 0x3105, 0x3129, 0x02BC,
+ 0x312A, 0x312C, 0x5781, 0x31A0, 0x31B7, 0x5784, 0x3220, 0x3229, 0x00F0,
+ 0x3231, 0x3231, 0x2721, 0x32A3, 0x32A3, 0x2711, 0x338E, 0x338F, 0x2712,
+ 0x339C, 0x339E, 0x2714, 0x33A1, 0x33A1, 0x2717, 0x33C4, 0x33C4, 0x2718,
+ 0x33CE, 0x33CE, 0x2719, 0x33D1, 0x33D2, 0x271A, 0x33D5, 0x33D5, 0x271C,
+ 0x3400, 0x3446, 0x5801, 0x3447, 0x3447, 0x5625, 0x3448, 0x3472, 0x5848,
+ 0x3473, 0x3473, 0x5624, 0x3474, 0x34FF, 0x5873, 0x3500, 0x359D, 0x58FF,
+ 0x359E, 0x359E, 0x5629, 0x359F, 0x35FF, 0x599D, 0x3600, 0x360D, 0x59FE,
+ 0x360E, 0x360E, 0x562B, 0x360F, 0x3619, 0x5A0C, 0x361A, 0x361A, 0x562A,
+ 0x361B, 0x36FF, 0x5A17, 0x3700, 0x37FF, 0x5AFC, 0x3800, 0x38FF, 0x5BFC,
+ 0x3900, 0x3917, 0x5CFC, 0x3918, 0x3918, 0x562F, 0x3919, 0x396D, 0x5D14,
+ 0x396E, 0x396E, 0x562E, 0x396F, 0x39CE, 0x5D69, 0x39CF, 0x39CF, 0x5631,
+ 0x39D0, 0x39D0, 0x5634, 0x39D1, 0x39DE, 0x5DC9, 0x39DF, 0x39DF, 0x5632,
+ 0x39E0, 0x39FF, 0x5DD7, 0x3A00, 0x3A72, 0x5DF7, 0x3A73, 0x3A73, 0x5633,
+ 0x3A74, 0x3AFF, 0x5E6A, 0x3B00, 0x3B4D, 0x5EF6, 0x3B4E, 0x3B4E, 0x5637,
+ 0x3B4F, 0x3BFF, 0x5F44, 0x3C00, 0x3C6D, 0x5FF5, 0x3C6E, 0x3C6E, 0x5638,
+ 0x3C6F, 0x3CDF, 0x6063, 0x3CE0, 0x3CE0, 0x5639, 0x3CE1, 0x3CFF, 0x60D4,
+ 0x3D00, 0x3DFF, 0x60F3, 0x3E00, 0x3EFF, 0x61F3, 0x3F00, 0x3FFF, 0x62F3,
+ 0x4000, 0x4055, 0x63F3, 0x4056, 0x4056, 0x563E, 0x4057, 0x40FF, 0x6449,
+ 0x4100, 0x415E, 0x64F2, 0x415F, 0x415F, 0x563F, 0x4160, 0x41FF, 0x6551,
+ 0x4200, 0x42FF, 0x65F1, 0x4300, 0x4336, 0x66F1, 0x4337, 0x4337, 0x5641,
+ 0x4338, 0x43AB, 0x6728, 0x43AC, 0x43AC, 0x5647, 0x43AD, 0x43B0, 0x679C,
+ 0x43B1, 0x43B1, 0x5646, 0x43B2, 0x43DC, 0x67A0, 0x43DD, 0x43DD, 0x5649,
+ 0x43DE, 0x43FF, 0x67CB, 0x4400, 0x44D5, 0x67ED, 0x44D6, 0x44D6, 0x564A,
+ 0x44D7, 0x44FF, 0x68C3, 0x4500, 0x45FF, 0x68EC, 0x4600, 0x464B, 0x69EC,
+ 0x464C, 0x464C, 0x564C, 0x464D, 0x4660, 0x6A38, 0x4661, 0x4661, 0x564B,
+ 0x4662, 0x46FF, 0x6A4C, 0x4700, 0x4722, 0x6AEA, 0x4723, 0x4723, 0x564E,
+ 0x4724, 0x4728, 0x6B0D, 0x4729, 0x4729, 0x564F, 0x472A, 0x477B, 0x6B12,
+ 0x477C, 0x477C, 0x5650, 0x477D, 0x478C, 0x6B64, 0x478D, 0x478D, 0x5651,
+ 0x478E, 0x47FF, 0x6B74, 0x4800, 0x48FF, 0x6BE6, 0x4900, 0x4946, 0x6CE6,
+ 0x4947, 0x4947, 0x5653, 0x4948, 0x4979, 0x6D2D, 0x497A, 0x497A, 0x5654,
+ 0x497B, 0x497C, 0x6D5F, 0x497D, 0x497D, 0x5655, 0x497E, 0x4981, 0x6D61,
+ 0x4982, 0x4983, 0x5656, 0x4984, 0x4984, 0x6D65, 0x4985, 0x4986, 0x5658,
+ 0x4987, 0x499A, 0x6D66, 0x499B, 0x499B, 0x565B, 0x499C, 0x499E, 0x6D7A,
+ 0x499F, 0x499F, 0x565A, 0x49A0, 0x49B5, 0x6D7D, 0x49B6, 0x49B6, 0x565D,
+ 0x49B7, 0x49B7, 0x565C, 0x49B8, 0x49FF, 0x6D93, 0x4A00, 0x4AFF, 0x6DDB,
+ 0x4B00, 0x4BFF, 0x6EDB, 0x4C00, 0x4C76, 0x6FDB, 0x4C77, 0x4C77, 0x5664,
+ 0x4C78, 0x4C9E, 0x7052, 0x4C9F, 0x4CA1, 0x5661, 0x4CA2, 0x4CA2, 0x5665,
+ 0x4CA3, 0x4CA3, 0x5660, 0x4CA4, 0x4CFF, 0x7079, 0x4D00, 0x4D12, 0x70D5,
+ 0x4D13, 0x4D19, 0x5666, 0x4D1A, 0x4DAD, 0x70E8, 0x4DAE, 0x4DAE, 0x566D,
+ 0x4DAF, 0x4DB5, 0x717C, 0x4E00, 0x4E00, 0x1042, 0x4E01, 0x4E01, 0x05E0,
+ 0x4E02, 0x4E02, 0x2758, 0x4E03, 0x4E03, 0x0BFE, 0x4E04, 0x4E06, 0x2759,
+ 0x4E07, 0x4E07, 0x0EA3, 0x4E08, 0x4E08, 0x116A, 0x4E09, 0x4E09, 0x0CD8,
+ 0x4E0A, 0x4E0A, 0x0D08, 0x4E0B, 0x4E0B, 0x0F2F, 0x4E0C, 0x4E0C, 0x1258,
+ 0x4E0D, 0x4E0D, 0x0482, 0x4E0E, 0x4E0E, 0x10D0, 0x4E0F, 0x4E0F, 0x275C,
+ 0x4E10, 0x4E10, 0x125A, 0x4E11, 0x4E11, 0x0518, 0x4E12, 0x4E12, 0x275D,
+ 0x4E13, 0x4E13, 0x1205, 0x4E14, 0x4E14, 0x0C4F, 0x4E15, 0x4E15, 0x125D,
+ 0x4E16, 0x4E16, 0x0D57, 0x4E17, 0x4E17, 0x275E, 0x4E18, 0x4E18, 0x0C6D,
+ 0x4E19, 0x4E19, 0x0464, 0x4E1A, 0x4E1A, 0x103C, 0x4E1B, 0x4E1B, 0x0557,
+ 0x4E1C, 0x4E1C, 0x05EA, 0x4E1D, 0x4E1D, 0x0DB4, 0x4E1E, 0x4E1E, 0x125F,
+ 0x4E1F, 0x4E21, 0x275F, 0x4E22, 0x4E22, 0x05E9, 0x4E23, 0x4E23, 0x2762,
+ 0x4E24, 0x4E24, 0x0A06, 0x4E25, 0x4E25, 0x0FF8, 0x4E26, 0x4E26, 0x2763,
+ 0x4E27, 0x4E27, 0x0CDE, 0x4E28, 0x4E28, 0x1263, 0x4E29, 0x4E29, 0x2764,
+ 0x4E2A, 0x4E2A, 0x06F1, 0x4E2B, 0x4E2B, 0x0FE7, 0x4E2C, 0x4E2C, 0x169C,
+ 0x4E2D, 0x4E2D, 0x11CF, 0x4E2E, 0x4E2F, 0x2765, 0x4E30, 0x4E30, 0x067E,
+ 0x4E31, 0x4E31, 0x2767, 0x4E32, 0x4E32, 0x0531, 0x4E33, 0x4E33, 0x2768,
+ 0x4E34, 0x4E34, 0x0A22, 0x4E35, 0x4E35, 0x2769, 0x4E36, 0x4E36, 0x1272,
+ 0x4E37, 0x4E37, 0x276A, 0x4E38, 0x4E38, 0x0E99, 0x4E39, 0x4E39, 0x0585,
+ 0x4E3A, 0x4E3A, 0x0EB9, 0x4E3B, 0x4E3B, 0x11F6, 0x4E3C, 0x4E3C, 0x276B,
+ 0x4E3D, 0x4E3D, 0x09E1, 0x4E3E, 0x4E3E, 0x0908, 0x4E3F, 0x4E3F, 0x1265,
+ 0x4E40, 0x4E42, 0x276C, 0x4E43, 0x4E43, 0x0B2E, 0x4E44, 0x4E44, 0x276F,
+ 0x4E45, 0x4E45, 0x08F2, 0x4E46, 0x4E46, 0x2770, 0x4E47, 0x4E47, 0x1267,
+ 0x4E48, 0x4E48, 0x0AB9, 0x4E49, 0x4E49, 0x106C, 0x4E4A, 0x4E4A, 0x2771,
+ 0x4E4B, 0x4E4B, 0x11AD, 0x4E4C, 0x4E4C, 0x0EE9, 0x4E4D, 0x4E4D, 0x1148,
+ 0x4E4E, 0x4E4E, 0x07AC, 0x4E4F, 0x4E4F, 0x0643, 0x4E50, 0x4E50, 0x09C1,
+ 0x4E51, 0x4E51, 0x2772, 0x4E52, 0x4E52, 0x0BD8, 0x4E53, 0x4E53, 0x0B93,
+ 0x4E54, 0x4E54, 0x0C44, 0x4E55, 0x4E55, 0x2773, 0x4E56, 0x4E56, 0x072D,
+ 0x4E57, 0x4E57, 0x2774, 0x4E58, 0x4E58, 0x04F0, 0x4E59, 0x4E59, 0x1059,
+ 0x4E5A, 0x4E5B, 0x2775, 0x4E5C, 0x4E5C, 0x1275, 0x4E5D, 0x4E5D, 0x08F4,
+ 0x4E5E, 0x4E5E, 0x0C11, 0x4E5F, 0x4E5F, 0x1039, 0x4E60, 0x4E60, 0x0F1D,
+ 0x4E61, 0x4E61, 0x0F54, 0x4E62, 0x4E65, 0x2777, 0x4E66, 0x4E66, 0x0D80,
+ 0x4E67, 0x4E68, 0x277B, 0x4E69, 0x4E69, 0x1276, 0x4E6A, 0x4E6F, 0x277D,
+ 0x4E70, 0x4E70, 0x0A99, 0x4E71, 0x4E71, 0x0A79, 0x4E72, 0x4E72, 0x2783,
+ 0x4E73, 0x4E73, 0x0CC4, 0x4E74, 0x4E7D, 0x2784, 0x4E7E, 0x4E7E, 0x0C29,
+ 0x4E7F, 0x4E81, 0x278E, 0x4E82, 0x4E82, 0x2059, 0x4E83, 0x4E85, 0x2791,
+ 0x4E86, 0x4E86, 0x0A14, 0x4E87, 0x4E87, 0x2794, 0x4E88, 0x4E88, 0x10CD,
+ 0x4E89, 0x4E89, 0x119A, 0x4E8A, 0x4E8A, 0x2795, 0x4E8B, 0x4E8B, 0x0D59,
+ 0x4E8C, 0x4E8C, 0x063D, 0x4E8D, 0x4E8D, 0x1257, 0x4E8E, 0x4E8E, 0x10BF,
+ 0x4E8F, 0x4E8F, 0x0984, 0x4E90, 0x4E90, 0x2796, 0x4E91, 0x4E91, 0x1109,
+ 0x4E92, 0x4E92, 0x07BA, 0x4E93, 0x4E93, 0x1277, 0x4E94, 0x4E94, 0x0EF4,
+ 0x4E95, 0x4E95, 0x08DD, 0x4E96, 0x4E97, 0x2797, 0x4E98, 0x4E98, 0x125E,
+ 0x4E99, 0x4E99, 0x2799, 0x4E9A, 0x4E9A, 0x0FF0, 0x4E9B, 0x4E9B, 0x0F74,
+ 0x4E9C, 0x4E9D, 0x279A, 0x4E9E, 0x4E9E, 0x21F1, 0x4E9F, 0x4E9F, 0x1273,
+ 0x4EA0, 0x4EA0, 0x1303, 0x4EA1, 0x4EA1, 0x0EA7, 0x4EA2, 0x4EA2, 0x0947,
+ 0x4EA3, 0x4EA3, 0x279C, 0x4EA4, 0x4EA4, 0x088C, 0x4EA5, 0x4EA5, 0x075C,
+ 0x4EA6, 0x4EA6, 0x1067, 0x4EA7, 0x4EA7, 0x04C1, 0x4EA8, 0x4EA8, 0x0797,
+ 0x4EA9, 0x4EA9, 0x0B19, 0x4EAA, 0x4EAA, 0x279D, 0x4EAB, 0x4EAB, 0x0F5A,
+ 0x4EAC, 0x4EAC, 0x08D8, 0x4EAD, 0x4EAD, 0x0E55, 0x4EAE, 0x4EAE, 0x0A0A,
+ 0x4EAF, 0x4EB1, 0x279E, 0x4EB2, 0x4EB2, 0x0C54, 0x4EB3, 0x4EB3, 0x1305,
+ 0x4EB4, 0x4EB4, 0x27A1, 0x4EB5, 0x4EB5, 0x1308, 0x4EB6, 0x4EB9, 0x27A2,
+ 0x4EBA, 0x4EBA, 0x0CA6, 0x4EBB, 0x4EBB, 0x129F, 0x4EBC, 0x4EBE, 0x27A6,
+ 0x4EBF, 0x4EBF, 0x1061, 0x4EC0, 0x4EC0, 0x0D49, 0x4EC1, 0x4EC1, 0x0CA5,
+ 0x4EC2, 0x4EC2, 0x12A2, 0x4EC3, 0x4EC3, 0x12A0, 0x4EC4, 0x4EC4, 0x127C,
+ 0x4EC5, 0x4EC5, 0x08C7, 0x4EC6, 0x4EC6, 0x0BEC, 0x4EC7, 0x4EC7, 0x0515,
+ 0x4EC8, 0x4EC8, 0x27A9, 0x4EC9, 0x4EC9, 0x12A1, 0x4ECA, 0x4ECA, 0x08C2,
+ 0x4ECB, 0x4ECB, 0x08BA, 0x4ECC, 0x4ECC, 0x27AA, 0x4ECD, 0x4ECD, 0x0CAF,
+ 0x4ECE, 0x4ECE, 0x0556, 0x4ECF, 0x4ED0, 0x27AB, 0x4ED1, 0x4ED1, 0x0A7F,
+ 0x4ED2, 0x4ED2, 0x27AD, 0x4ED3, 0x4ED3, 0x049D, 0x4ED4, 0x4ED4, 0x122D,
+ 0x4ED5, 0x4ED5, 0x0D62, 0x4ED6, 0x4ED6, 0x0DF0, 0x4ED7, 0x4ED7, 0x116D,
+ 0x4ED8, 0x4ED8, 0x06B1, 0x4ED9, 0x4ED9, 0x0F36, 0x4EDA, 0x4EDC, 0x27AE,
+ 0x4EDD, 0x4EDD, 0x12EE, 0x4EDE, 0x4EDE, 0x12A6, 0x4EDF, 0x4EDF, 0x0C27,
+ 0x4EE0, 0x4EE0, 0x27B1, 0x4EE1, 0x4EE1, 0x12A4, 0x4EE2, 0x4EE2, 0x27B2,
+ 0x4EE3, 0x4EE3, 0x057D, 0x4EE4, 0x4EE4, 0x0A37, 0x4EE5, 0x4EE5, 0x105B,
+ 0x4EE6, 0x4EE7, 0x27B3, 0x4EE8, 0x4EE8, 0x12A3, 0x4EE9, 0x4EE9, 0x27B5,
+ 0x4EEA, 0x4EEA, 0x104E, 0x4EEB, 0x4EEB, 0x12A5, 0x4EEC, 0x4EEC, 0x0ACC,
+ 0x4EED, 0x4EEF, 0x27B6, 0x4EF0, 0x4EF0, 0x101F, 0x4EF1, 0x4EF1, 0x27B9,
+ 0x4EF2, 0x4EF2, 0x11D8, 0x4EF3, 0x4EF3, 0x12A8, 0x4EF4, 0x4EF4, 0x27BA,
+ 0x4EF5, 0x4EF5, 0x12AB, 0x4EF6, 0x4EF6, 0x0871, 0x4EF7, 0x4EF7, 0x084E,
+ 0x4EF8, 0x4EFA, 0x27BB, 0x4EFB, 0x4EFB, 0x0CA9, 0x4EFC, 0x4EFC, 0x27BE,
+ 0x4EFD, 0x4EFD, 0x067A, 0x4EFE, 0x4EFE, 0x27BF, 0x4EFF, 0x4EFF, 0x065F,
+ 0x4F00, 0x4F00, 0x27C0, 0x4F01, 0x4F01, 0x0C12, 0x4F02, 0x4F08, 0x27C1,
+ 0x4F09, 0x4F09, 0x12AE, 0x4F0A, 0x4F0A, 0x1048, 0x4F0B, 0x4F0C, 0x27C8,
+ 0x4F0D, 0x4F0D, 0x0EF8, 0x4F0E, 0x4F0E, 0x0832, 0x4F0F, 0x4F0F, 0x0699,
+ 0x4F10, 0x4F10, 0x0642, 0x4F11, 0x4F11, 0x0FA8, 0x4F12, 0x4F16, 0x27CA,
+ 0x4F17, 0x4F17, 0x11D9, 0x4F18, 0x4F18, 0x10AA, 0x4F19, 0x4F19, 0x0804,
+ 0x4F1A, 0x4F1A, 0x07F6, 0x4F1B, 0x4F1B, 0x12A7, 0x4F1C, 0x4F1D, 0x27CF,
+ 0x4F1E, 0x4F1E, 0x0CDA, 0x4F1F, 0x4F1F, 0x0EBF, 0x4F20, 0x4F20, 0x052E,
+ 0x4F21, 0x4F21, 0x27D1, 0x4F22, 0x4F22, 0x12A9, 0x4F23, 0x4F23, 0x27D2,
+ 0x4F24, 0x4F24, 0x0D04, 0x4F25, 0x4F25, 0x12AC, 0x4F26, 0x4F26, 0x0A7E,
+ 0x4F27, 0x4F27, 0x12AD, 0x4F28, 0x4F29, 0x27D3, 0x4F2A, 0x4F2A, 0x0EC0,
+ 0x4F2B, 0x4F2B, 0x12AF, 0x4F2C, 0x4F2E, 0x27D5, 0x4F2F, 0x4F2F, 0x0475,
+ 0x4F30, 0x4F30, 0x0719, 0x4F31, 0x4F31, 0x27D8, 0x4F32, 0x4F32, 0x12B7,
+ 0x4F33, 0x4F33, 0x27D9, 0x4F34, 0x4F34, 0x03F4, 0x4F35, 0x4F35, 0x27DA,
+ 0x4F36, 0x4F36, 0x0A2F, 0x4F37, 0x4F37, 0x27DB, 0x4F38, 0x4F38, 0x0D25,
+ 0x4F39, 0x4F39, 0x27DC, 0x4F3A, 0x4F3A, 0x0DBA, 0x4F3B, 0x4F3B, 0x27DD,
+ 0x4F3C, 0x4F3C, 0x0DBB, 0x4F3D, 0x4F3D, 0x12B8, 0x4F3E, 0x4F42, 0x27DE,
+ 0x4F43, 0x4F43, 0x05C9, 0x4F44, 0x4F45, 0x27E3, 0x4F46, 0x4F46, 0x058C,
+ 0x4F47, 0x4F4C, 0x27E5, 0x4F4D, 0x4F4D, 0x0ECA, 0x4F4E, 0x4F4E, 0x05AE,
+ 0x4F4F, 0x4F4F, 0x11FE, 0x4F50, 0x4F50, 0x1251, 0x4F51, 0x4F51, 0x10B8,
+ 0x4F52, 0x4F52, 0x27EB, 0x4F53, 0x4F53, 0x0E38, 0x4F54, 0x4F54, 0x27EC,
+ 0x4F55, 0x4F55, 0x0785, 0x4F56, 0x4F56, 0x27ED, 0x4F57, 0x4F57, 0x12B6,
+ 0x4F58, 0x4F58, 0x12F0, 0x4F59, 0x4F59, 0x10C5, 0x4F5A, 0x4F5A, 0x12B3,
+ 0x4F5B, 0x4F5B, 0x068D, 0x4F5C, 0x4F5C, 0x1254, 0x4F5D, 0x4F5D, 0x12B4,
+ 0x4F5E, 0x4F5E, 0x12B0, 0x4F5F, 0x4F5F, 0x12B5, 0x4F60, 0x4F60, 0x0B46,
+ 0x4F61, 0x4F62, 0x27EE, 0x4F63, 0x4F63, 0x109B, 0x4F64, 0x4F64, 0x12AA,
+ 0x4F65, 0x4F65, 0x12F1, 0x4F66, 0x4F66, 0x27F0, 0x4F67, 0x4F67, 0x12B1,
+ 0x4F68, 0x4F68, 0x27F1, 0x4F69, 0x4F69, 0x0BA6, 0x4F6A, 0x4F6B, 0x27F2,
+ 0x4F6C, 0x4F6C, 0x09BB, 0x4F6D, 0x4F6E, 0x27F4, 0x4F6F, 0x4F6F, 0x1019,
+ 0x4F70, 0x4F70, 0x03E6, 0x4F71, 0x4F72, 0x27F6, 0x4F73, 0x4F73, 0x0844,
+ 0x4F74, 0x4F74, 0x12BA, 0x4F75, 0x4F75, 0x27F8, 0x4F76, 0x4F76, 0x12B9,
+ 0x4F77, 0x4F7A, 0x27F9, 0x4F7B, 0x4F7B, 0x12C0, 0x4F7C, 0x4F7C, 0x12C2,
+ 0x4F7D, 0x4F7D, 0x27FD, 0x4F7E, 0x4F7E, 0x12BF, 0x4F7F, 0x4F7F, 0x0D50,
+ 0x4F80, 0x4F82, 0x27FE, 0x4F83, 0x4F83, 0x12BD, 0x4F84, 0x4F84, 0x11B5,
+ 0x4F85, 0x4F85, 0x2801, 0x4F86, 0x4F86, 0x1FF2, 0x4F87, 0x4F87, 0x2802,
+ 0x4F88, 0x4F88, 0x0503, 0x4F89, 0x4F89, 0x12BC, 0x4F8A, 0x4F8A, 0x2803,
+ 0x4F8B, 0x4F8B, 0x09E8, 0x4F8C, 0x4F8C, 0x2804, 0x4F8D, 0x4F8D, 0x0D63,
+ 0x4F8E, 0x4F8E, 0x2805, 0x4F8F, 0x4F8F, 0x12BE, 0x4F90, 0x4F90, 0x2806,
+ 0x4F91, 0x4F91, 0x12BB, 0x4F92, 0x4F93, 0x2807, 0x4F94, 0x4F94, 0x12C4,
+ 0x4F95, 0x4F95, 0x2809, 0x4F96, 0x4F96, 0x205D, 0x4F97, 0x4F97, 0x05F0,
+ 0x4F98, 0x4F9A, 0x280A, 0x4F9B, 0x4F9B, 0x0702, 0x4F9C, 0x4F9C, 0x280D,
+ 0x4F9D, 0x4F9D, 0x1047, 0x4F9E, 0x4F9F, 0x280E, 0x4FA0, 0x4FA0, 0x0F2D,
+ 0x4FA1, 0x4FA2, 0x2810, 0x4FA3, 0x4FA3, 0x0A69, 0x4FA4, 0x4FA4, 0x2812,
+ 0x4FA5, 0x4FA5, 0x0895, 0x4FA6, 0x4FA6, 0x118D, 0x4FA7, 0x4FA7, 0x04A7,
+ 0x4FA8, 0x4FA8, 0x0C45, 0x4FA9, 0x4FA9, 0x0978, 0x4FAA, 0x4FAA, 0x12C1,
+ 0x4FAB, 0x4FAB, 0x2813, 0x4FAC, 0x4FAC, 0x12C3, 0x4FAD, 0x4FAD, 0x2814,
+ 0x4FAE, 0x4FAE, 0x0EF9, 0x4FAF, 0x4FAF, 0x07A5, 0x4FB0, 0x4FB4, 0x2815,
+ 0x4FB5, 0x4FB5, 0x0C53, 0x4FB6, 0x4FBE, 0x281A, 0x4FBF, 0x4FBF, 0x044C,
+ 0x4FC0, 0x4FC1, 0x2823, 0x4FC2, 0x4FC2, 0x269C, 0x4FC3, 0x4FC3, 0x055C,
+ 0x4FC4, 0x4FC4, 0x062C, 0x4FC5, 0x4FC5, 0x12C8, 0x4FC6, 0x4FC9, 0x2825,
+ 0x4FCA, 0x4FCA, 0x092E, 0x4FCB, 0x4FCD, 0x2829, 0x4FCE, 0x4FCE, 0x12F2,
+ 0x4FCF, 0x4FCF, 0x0C4B, 0x4FD0, 0x4FD0, 0x09E9, 0x4FD1, 0x4FD1, 0x12CC,
+ 0x4FD2, 0x4FD6, 0x282C, 0x4FD7, 0x4FD7, 0x0DCC, 0x4FD8, 0x4FD8, 0x069A,
+ 0x4FD9, 0x4FD9, 0x2831, 0x4FDA, 0x4FDA, 0x12C9, 0x4FDB, 0x4FDB, 0x2832,
+ 0x4FDC, 0x4FDC, 0x12CB, 0x4FDD, 0x4FDD, 0x040C, 0x4FDE, 0x4FDE, 0x10C6,
+ 0x4FDF, 0x4FDF, 0x12CD, 0x4FE0, 0x4FE0, 0x21B5, 0x4FE1, 0x4FE1, 0x0F90,
+ 0x4FE2, 0x4FE2, 0x2833, 0x4FE3, 0x4FE3, 0x12CA, 0x4FE4, 0x4FE5, 0x2834,
+ 0x4FE6, 0x4FE6, 0x12C5, 0x4FE7, 0x4FE7, 0x2836, 0x4FE8, 0x4FE8, 0x12C6,
+ 0x4FE9, 0x4FE9, 0x09F2, 0x4FEA, 0x4FEA, 0x12C7, 0x4FEB, 0x4FEC, 0x2837,
+ 0x4FED, 0x4FED, 0x0866, 0x4FEE, 0x4FEE, 0x0FA9, 0x4FEF, 0x4FEF, 0x06A4,
+ 0x4FF0, 0x4FF0, 0x2839, 0x4FF1, 0x4FF1, 0x0912, 0x4FF2, 0x4FF2, 0x283A,
+ 0x4FF3, 0x4FF3, 0x12D1, 0x4FF4, 0x4FF7, 0x283B, 0x4FF8, 0x4FF8, 0x12CE,
+ 0x4FF9, 0x4FF9, 0x283F, 0x4FFA, 0x4FFA, 0x03BE, 0x4FFB, 0x4FFD, 0x2840,
+ 0x4FFE, 0x4FFE, 0x12D6, 0x4FFF, 0x4FFF, 0x2843, 0x5000, 0x5000, 0x22CC,
+ 0x5001, 0x5005, 0x2844, 0x5006, 0x5006, 0x2016, 0x5007, 0x5008, 0x2849,
+ 0x5009, 0x5009, 0x1E62, 0x500A, 0x500A, 0x284B, 0x500B, 0x500B, 0x1F20,
+ 0x500C, 0x500C, 0x12D8, 0x500D, 0x500D, 0x041F, 0x500E, 0x500E, 0x284C,
+ 0x500F, 0x500F, 0x12D3, 0x5010, 0x5010, 0x284D, 0x5011, 0x5011, 0x207F,
+ 0x5012, 0x5012, 0x059A, 0x5013, 0x5013, 0x284E, 0x5014, 0x5014, 0x0922,
+ 0x5015, 0x5017, 0x284F, 0x5018, 0x5018, 0x0E1B, 0x5019, 0x5019, 0x07A9,
+ 0x501A, 0x501A, 0x1057, 0x501B, 0x501B, 0x2852, 0x501C, 0x501C, 0x12D7,
+ 0x501D, 0x501E, 0x2853, 0x501F, 0x501F, 0x08B9, 0x5020, 0x5020, 0x2855,
+ 0x5021, 0x5021, 0x04D0, 0x5022, 0x5024, 0x2856, 0x5025, 0x5025, 0x12D9,
+ 0x5026, 0x5026, 0x091A, 0x5027, 0x5027, 0x2859, 0x5028, 0x5028, 0x12DA,
+ 0x5029, 0x5029, 0x12CF, 0x502A, 0x502A, 0x0B42, 0x502B, 0x502B, 0x205C,
+ 0x502C, 0x502C, 0x12D2, 0x502D, 0x502D, 0x12D5, 0x502E, 0x502E, 0x12D4,
+ 0x502F, 0x5039, 0x285A, 0x503A, 0x503A, 0x114F, 0x503B, 0x503B, 0x2865,
+ 0x503C, 0x503C, 0x11B4, 0x503D, 0x503D, 0x2866, 0x503E, 0x503E, 0x0C60,
+ 0x503F, 0x5042, 0x2867, 0x5043, 0x5043, 0x12DC, 0x5044, 0x5046, 0x286B,
+ 0x5047, 0x5047, 0x084C, 0x5048, 0x5048, 0x12DE, 0x5049, 0x5049, 0x2194,
+ 0x504A, 0x504B, 0x286E, 0x504C, 0x504C, 0x12D0, 0x504D, 0x504D, 0x2870,
+ 0x504E, 0x504E, 0x12DF, 0x504F, 0x504F, 0x0BCA, 0x5050, 0x5054, 0x2871,
+ 0x5055, 0x5055, 0x12DD, 0x5056, 0x5059, 0x2876, 0x505A, 0x505A, 0x1253,
+ 0x505B, 0x505B, 0x287A, 0x505C, 0x505C, 0x0E54, 0x505D, 0x5064, 0x287B,
+ 0x5065, 0x5065, 0x0872, 0x5066, 0x506B, 0x2883, 0x506C, 0x506C, 0x12E0,
+ 0x506D, 0x5073, 0x2889, 0x5074, 0x5074, 0x1E65, 0x5075, 0x5075, 0x2281,
+ 0x5076, 0x5076, 0x0B7D, 0x5077, 0x5077, 0x0E66, 0x5078, 0x507A, 0x2890,
+ 0x507B, 0x507B, 0x12E1, 0x507C, 0x507D, 0x2893, 0x507E, 0x507E, 0x12DB,
+ 0x507F, 0x507F, 0x04CA, 0x5080, 0x5080, 0x098B, 0x5081, 0x5084, 0x2895,
+ 0x5085, 0x5085, 0x06B0, 0x5086, 0x5087, 0x2899, 0x5088, 0x5088, 0x09E7,
+ 0x5089, 0x508C, 0x289B, 0x508D, 0x508D, 0x0403, 0x508E, 0x5095, 0x289F,
+ 0x5096, 0x5096, 0x22CD, 0x5097, 0x5097, 0x28A7, 0x5098, 0x5098, 0x210A,
+ 0x5099, 0x5099, 0x1E3E, 0x509A, 0x50A1, 0x28A8, 0x50A2, 0x50A2, 0x267F,
+ 0x50A3, 0x50A3, 0x0579, 0x50A4, 0x50A4, 0x28B0, 0x50A5, 0x50A5, 0x12E2,
+ 0x50A6, 0x50A6, 0x28B1, 0x50A7, 0x50A7, 0x12E3, 0x50A8, 0x50A8, 0x0525,
+ 0x50A9, 0x50A9, 0x12E4, 0x50AA, 0x50AB, 0x28B2, 0x50AC, 0x50AC, 0x0562,
+ 0x50AD, 0x50AD, 0x222E, 0x50AE, 0x50B1, 0x28B4, 0x50B2, 0x50B2, 0x03CC,
+ 0x50B3, 0x50B3, 0x1E96, 0x50B4, 0x50B4, 0x22CB, 0x50B5, 0x50B5, 0x226C,
+ 0x50B6, 0x50B6, 0x28B8, 0x50B7, 0x50B7, 0x2117, 0x50B8, 0x50B9, 0x28B9,
+ 0x50BA, 0x50BA, 0x12E5, 0x50BB, 0x50BB, 0x0CEE, 0x50BC, 0x50BD, 0x28BB,
+ 0x50BE, 0x50BE, 0x20E8, 0x50BF, 0x50C1, 0x28BD, 0x50C2, 0x50C2, 0x22D4,
+ 0x50C3, 0x50C4, 0x28C0, 0x50C5, 0x50C5, 0x1FB9, 0x50C6, 0x50C8, 0x28C2,
+ 0x50C9, 0x50C9, 0x22D8, 0x50CA, 0x50CE, 0x28C5, 0x50CF, 0x50CF, 0x0F5E,
+ 0x50D0, 0x50D0, 0x28CA, 0x50D1, 0x50D1, 0x20DF, 0x50D2, 0x50D4, 0x28CB,
+ 0x50D5, 0x50D5, 0x20C2, 0x50D6, 0x50D6, 0x12E6, 0x50D7, 0x50D9, 0x28CE,
+ 0x50DA, 0x50DA, 0x0A0E, 0x50DB, 0x50DD, 0x28D1, 0x50DE, 0x50DE, 0x2195,
+ 0x50DF, 0x50E4, 0x28D4, 0x50E5, 0x50E5, 0x1FAC, 0x50E6, 0x50E6, 0x12EA,
+ 0x50E7, 0x50E7, 0x0CE7, 0x50E8, 0x50E8, 0x22D3, 0x50E9, 0x50EB, 0x28DA,
+ 0x50EC, 0x50EC, 0x12E9, 0x50ED, 0x50ED, 0x12E8, 0x50EE, 0x50EE, 0x12EB,
+ 0x50EF, 0x50F2, 0x28DD, 0x50F3, 0x50F3, 0x0DD0, 0x50F4, 0x50F4, 0x28E1,
+ 0x50F5, 0x50F5, 0x087A, 0x50F6, 0x50F8, 0x28E2, 0x50F9, 0x50F9, 0x1F81,
+ 0x50FA, 0x50FA, 0x28E5, 0x50FB, 0x50FB, 0x0BC6, 0x50FC, 0x50FF, 0x28E6,
+ 0x5100, 0x5100, 0x2210, 0x5101, 0x5101, 0x28EA, 0x5102, 0x5102, 0x22CF,
+ 0x5103, 0x5103, 0x28EB, 0x5104, 0x5104, 0x2213, 0x5105, 0x5105, 0x28EC,
+ 0x5106, 0x5106, 0x12E7, 0x5107, 0x5107, 0x12EC, 0x5108, 0x5108, 0x1FE4,
+ 0x5109, 0x5109, 0x1F90, 0x510A, 0x510A, 0x28ED, 0x510B, 0x510B, 0x12ED,
+ 0x510C, 0x510F, 0x28EE, 0x5110, 0x5110, 0x22D6, 0x5111, 0x5111, 0x28F2,
+ 0x5112, 0x5112, 0x0CC0, 0x5113, 0x5113, 0x28F3, 0x5114, 0x5114, 0x22D0,
+ 0x5115, 0x5115, 0x22CE, 0x5116, 0x5117, 0x28F4, 0x5118, 0x5118, 0x2681,
+ 0x5119, 0x511E, 0x28F6, 0x511F, 0x511F, 0x1E76, 0x5120, 0x5120, 0x28FC,
+ 0x5121, 0x5121, 0x09C7, 0x5122, 0x5129, 0x28FD, 0x512A, 0x512A, 0x2231,
+ 0x512B, 0x5131, 0x2905, 0x5132, 0x5132, 0x1E93, 0x5133, 0x5136, 0x290C,
+ 0x5137, 0x5137, 0x22D2, 0x5138, 0x5139, 0x2910, 0x513A, 0x513A, 0x22D7,
+ 0x513B, 0x513B, 0x22D5, 0x513C, 0x513C, 0x22D1, 0x513D, 0x513E, 0x2912,
+ 0x513F, 0x513F, 0x0638, 0x5140, 0x5140, 0x1259, 0x5141, 0x5141, 0x110D,
+ 0x5142, 0x5142, 0x2914, 0x5143, 0x5143, 0x10ED, 0x5144, 0x5144, 0x0FA1,
+ 0x5145, 0x5145, 0x0509, 0x5146, 0x5146, 0x1178, 0x5147, 0x5147, 0x2915,
+ 0x5148, 0x5148, 0x0F35, 0x5149, 0x5149, 0x073B, 0x514A, 0x514A, 0x2916,
+ 0x514B, 0x514B, 0x0958, 0x514C, 0x514C, 0x2917, 0x514D, 0x514D, 0x0AE7,
+ 0x514E, 0x5150, 0x2918, 0x5151, 0x5151, 0x0611, 0x5152, 0x5152, 0x1EE5,
+ 0x5153, 0x5153, 0x291B, 0x5154, 0x5154, 0x0E74, 0x5155, 0x5155, 0x1302,
+ 0x5156, 0x5156, 0x1304, 0x5157, 0x5159, 0x291C, 0x515A, 0x515A, 0x0594,
+ 0x515B, 0x515B, 0x291F, 0x515C, 0x515C, 0x05F4, 0x515D, 0x5161, 0x2920,
+ 0x5162, 0x5162, 0x08D3, 0x5163, 0x5164, 0x2925, 0x5165, 0x5165, 0x0CC6,
+ 0x5166, 0x5167, 0x2927, 0x5168, 0x5168, 0x0C86, 0x5169, 0x5169, 0x2025,
+ 0x516A, 0x516A, 0x2929, 0x516B, 0x516B, 0x03D6, 0x516C, 0x516C, 0x0704,
+ 0x516D, 0x516D, 0x0A42, 0x516E, 0x516E, 0x12F6, 0x516F, 0x516F, 0x292A,
+ 0x5170, 0x5170, 0x09A7, 0x5171, 0x5171, 0x070B, 0x5172, 0x5172, 0x292B,
+ 0x5173, 0x5173, 0x0731, 0x5174, 0x5174, 0x0F96, 0x5175, 0x5175, 0x0461,
+ 0x5176, 0x5176, 0x0C03, 0x5177, 0x5177, 0x090E, 0x5178, 0x5178, 0x05C5,
+ 0x5179, 0x5179, 0x1225, 0x517A, 0x517A, 0x292C, 0x517B, 0x517B, 0x1021,
+ 0x517C, 0x517C, 0x0859, 0x517D, 0x517D, 0x0D75, 0x517E, 0x517F, 0x292D,
+ 0x5180, 0x5180, 0x0830, 0x5181, 0x5181, 0x12FA, 0x5182, 0x5182, 0x129D,
+ 0x5183, 0x5184, 0x292F, 0x5185, 0x5185, 0x0B3D, 0x5186, 0x5187, 0x2931,
+ 0x5188, 0x5188, 0x06CF, 0x5189, 0x5189, 0x0C98, 0x518A, 0x518B, 0x2933,
+ 0x518C, 0x518C, 0x04A8, 0x518D, 0x518D, 0x111C, 0x518E, 0x5191, 0x2935,
+ 0x5192, 0x5192, 0x0AB5, 0x5193, 0x5194, 0x2939, 0x5195, 0x5195, 0x0AE6,
+ 0x5196, 0x5196, 0x1314, 0x5197, 0x5197, 0x0CBA, 0x5198, 0x5198, 0x293B,
+ 0x5199, 0x5199, 0x0F7F, 0x519A, 0x519A, 0x293C, 0x519B, 0x519B, 0x092B,
+ 0x519C, 0x519C, 0x0B6A, 0x519D, 0x519F, 0x293D, 0x51A0, 0x51A0, 0x0733,
+ 0x51A1, 0x51A1, 0x2940, 0x51A2, 0x51A2, 0x1315, 0x51A3, 0x51A3, 0x2941,
+ 0x51A4, 0x51A4, 0x10EC, 0x51A5, 0x51A5, 0x1316, 0x51A6, 0x51AA, 0x2942,
+ 0x51AB, 0x51AB, 0x130F, 0x51AC, 0x51AC, 0x05EB, 0x51AD, 0x51AE, 0x2947,
+ 0x51AF, 0x51AF, 0x0688, 0x51B0, 0x51B0, 0x0462, 0x51B1, 0x51B1, 0x1310,
+ 0x51B2, 0x51B2, 0x050A, 0x51B3, 0x51B3, 0x0925, 0x51B4, 0x51B4, 0x2949,
+ 0x51B5, 0x51B5, 0x0983, 0x51B6, 0x51B6, 0x1038, 0x51B7, 0x51B7, 0x09CF,
+ 0x51B8, 0x51BA, 0x294A, 0x51BB, 0x51BB, 0x05F2, 0x51BC, 0x51BC, 0x1312,
+ 0x51BD, 0x51BD, 0x1311, 0x51BE, 0x51BF, 0x294D, 0x51C0, 0x51C0, 0x08EA,
+ 0x51C1, 0x51C3, 0x294F, 0x51C4, 0x51C4, 0x0BFF, 0x51C5, 0x51C5, 0x2952,
+ 0x51C6, 0x51C6, 0x1219, 0x51C7, 0x51C7, 0x1313, 0x51C8, 0x51C8, 0x2953,
+ 0x51C9, 0x51C9, 0x0A02, 0x51CA, 0x51CA, 0x2954, 0x51CB, 0x51CB, 0x05D3,
+ 0x51CC, 0x51CC, 0x0A31, 0x51CD, 0x51CD, 0x1ECF, 0x51CE, 0x51CE, 0x2955,
+ 0x51CF, 0x51CF, 0x0868, 0x51D0, 0x51D0, 0x2956, 0x51D1, 0x51D1, 0x0558,
+ 0x51D2, 0x51DA, 0x2957, 0x51DB, 0x51DB, 0x0A26, 0x51DC, 0x51DC, 0x2960,
+ 0x51DD, 0x51DD, 0x0B60, 0x51DE, 0x51DF, 0x2961, 0x51E0, 0x51E0, 0x082B,
+ 0x51E1, 0x51E1, 0x064F, 0x51E2, 0x51E3, 0x2963, 0x51E4, 0x51E4, 0x068C,
+ 0x51E5, 0x51EA, 0x2965, 0x51EB, 0x51EB, 0x1300, 0x51EC, 0x51EC, 0x296B,
+ 0x51ED, 0x51ED, 0x0BDD, 0x51EE, 0x51EE, 0x296C, 0x51EF, 0x51EF, 0x093A,
+ 0x51F0, 0x51F0, 0x07E0, 0x51F1, 0x51F1, 0x1FD9, 0x51F2, 0x51F2, 0x296D,
+ 0x51F3, 0x51F3, 0x05AB, 0x51F4, 0x51F4, 0x296E, 0x51F5, 0x51F5, 0x1399,
+ 0x51F6, 0x51F6, 0x0FA2, 0x51F7, 0x51F7, 0x296F, 0x51F8, 0x51F8, 0x0E6A,
+ 0x51F9, 0x51F9, 0x03C7, 0x51FA, 0x51FA, 0x051B, 0x51FB, 0x51FB, 0x080C,
+ 0x51FC, 0x51FC, 0x139A, 0x51FD, 0x51FD, 0x0766, 0x51FE, 0x51FE, 0x2970,
+ 0x51FF, 0x51FF, 0x1127, 0x5200, 0x5200, 0x0597, 0x5201, 0x5201, 0x05D4,
+ 0x5202, 0x5202, 0x128C, 0x5203, 0x5203, 0x0CAB, 0x5204, 0x5205, 0x2971,
+ 0x5206, 0x5206, 0x0673, 0x5207, 0x5207, 0x0C4D, 0x5208, 0x5208, 0x128D,
+ 0x5209, 0x5209, 0x2973, 0x520A, 0x520A, 0x093C, 0x520B, 0x520C, 0x2974,
+ 0x520D, 0x520D, 0x138B, 0x520E, 0x520E, 0x128E, 0x520F, 0x5210, 0x2976,
+ 0x5211, 0x5211, 0x0F97, 0x5212, 0x5212, 0x07C3, 0x5213, 0x5215, 0x2978,
+ 0x5216, 0x5216, 0x196E, 0x5217, 0x5217, 0x0A19, 0x5218, 0x5218, 0x0A3E,
+ 0x5219, 0x5219, 0x1135, 0x521A, 0x521A, 0x06D0, 0x521B, 0x521B, 0x0537,
+ 0x521C, 0x521C, 0x297B, 0x521D, 0x521D, 0x051A, 0x521E, 0x521F, 0x297C,
+ 0x5220, 0x5220, 0x0CF7, 0x5221, 0x5223, 0x297E, 0x5224, 0x5224, 0x0B91,
+ 0x5225, 0x5227, 0x2981, 0x5228, 0x5228, 0x0B9A, 0x5229, 0x5229, 0x09E6,
+ 0x522A, 0x522A, 0x2984, 0x522B, 0x522B, 0x0459, 0x522C, 0x522C, 0x2985,
+ 0x522D, 0x522D, 0x128F, 0x522E, 0x522E, 0x0727, 0x522F, 0x522F, 0x2986,
+ 0x5230, 0x5230, 0x059E, 0x5231, 0x5232, 0x2987, 0x5233, 0x5233, 0x1290,
+ 0x5234, 0x5235, 0x2989, 0x5236, 0x5236, 0x11C5, 0x5237, 0x5237, 0x0D97,
+ 0x5238, 0x5238, 0x0C8A, 0x5239, 0x5239, 0x0CEB, 0x523A, 0x523A, 0x054F,
+ 0x523B, 0x523B, 0x0959, 0x523C, 0x523C, 0x298B, 0x523D, 0x523D, 0x074D,
+ 0x523E, 0x523E, 0x298C, 0x523F, 0x5240, 0x1291, 0x5241, 0x5241, 0x0626,
+ 0x5242, 0x5242, 0x0834, 0x5243, 0x5243, 0x0E3D, 0x5244, 0x5244, 0x22C8,
+ 0x5245, 0x5246, 0x298D, 0x5247, 0x5247, 0x2263, 0x5248, 0x5249, 0x298F,
+ 0x524A, 0x524A, 0x0F64, 0x524B, 0x524B, 0x2683, 0x524C, 0x524C, 0x1293,
+ 0x524D, 0x524D, 0x0C2D, 0x524E, 0x524F, 0x2991, 0x5250, 0x5250, 0x0729,
+ 0x5251, 0x5251, 0x0874, 0x5252, 0x5253, 0x2993, 0x5254, 0x5254, 0x0E31,
+ 0x5255, 0x5255, 0x2995, 0x5256, 0x5256, 0x0BE9, 0x5257, 0x525A, 0x2996,
+ 0x525B, 0x525B, 0x1F17, 0x525C, 0x525C, 0x1296, 0x525D, 0x525D, 0x299A,
+ 0x525E, 0x525E, 0x1294, 0x525F, 0x5260, 0x299B, 0x5261, 0x5261, 0x1295,
+ 0x5262, 0x5264, 0x299D, 0x5265, 0x5265, 0x0409, 0x5266, 0x5266, 0x29A0,
+ 0x5267, 0x5267, 0x0916, 0x5268, 0x5268, 0x29A1, 0x5269, 0x5269, 0x0D3A,
+ 0x526A, 0x526A, 0x0867, 0x526B, 0x526D, 0x29A2, 0x526E, 0x526E, 0x1F2B,
+ 0x526F, 0x526F, 0x06AC, 0x5270, 0x5271, 0x29A5, 0x5272, 0x5272, 0x06E9,
+ 0x5273, 0x5273, 0x29A7, 0x5274, 0x5274, 0x22CA, 0x5275, 0x5275, 0x1E99,
+ 0x5276, 0x527C, 0x29A8, 0x527D, 0x527D, 0x1298, 0x527E, 0x527E, 0x29AF,
+ 0x527F, 0x527F, 0x089C, 0x5280, 0x5280, 0x29B0, 0x5281, 0x5281, 0x129A,
+ 0x5282, 0x5282, 0x1299, 0x5283, 0x5283, 0x1F4F, 0x5284, 0x5286, 0x29B1,
+ 0x5287, 0x5287, 0x1FCF, 0x5288, 0x5288, 0x0BBD, 0x5289, 0x5289, 0x2036,
+ 0x528A, 0x528A, 0x1F3A, 0x528B, 0x528B, 0x29B4, 0x528C, 0x528C, 0x22C9,
+ 0x528D, 0x528D, 0x1F99, 0x528E, 0x528F, 0x29B5, 0x5290, 0x5290, 0x129B,
+ 0x5291, 0x5291, 0x1F75, 0x5292, 0x5292, 0x29B7, 0x5293, 0x5293, 0x129C,
+ 0x5294, 0x529A, 0x29B8, 0x529B, 0x529B, 0x09EF, 0x529C, 0x529C, 0x29BF,
+ 0x529D, 0x529D, 0x0C8B, 0x529E, 0x529E, 0x03F7, 0x529F, 0x529F, 0x06FF,
+ 0x52A0, 0x52A0, 0x0846, 0x52A1, 0x52A1, 0x0F00, 0x52A2, 0x52A2, 0x138D,
+ 0x52A3, 0x52A3, 0x0A1C, 0x52A4, 0x52A7, 0x29C0, 0x52A8, 0x52A8, 0x05EE,
+ 0x52A9, 0x52A9, 0x11F9, 0x52AA, 0x52AA, 0x0B6D, 0x52AB, 0x52AB, 0x08AA,
+ 0x52AC, 0x52AD, 0x138E, 0x52AE, 0x52B0, 0x29C4, 0x52B1, 0x52B1, 0x09E3,
+ 0x52B2, 0x52B2, 0x08D1, 0x52B3, 0x52B3, 0x09B8, 0x52B4, 0x52BD, 0x29C7,
+ 0x52BE, 0x52BE, 0x1390, 0x52BF, 0x52BF, 0x0D5D, 0x52C0, 0x52C0, 0x29D1,
+ 0x52C1, 0x52C1, 0x1FBE, 0x52C2, 0x52C2, 0x29D2, 0x52C3, 0x52C3, 0x0471,
+ 0x52C4, 0x52C6, 0x29D3, 0x52C7, 0x52C7, 0x10A7, 0x52C8, 0x52C8, 0x29D6,
+ 0x52C9, 0x52C9, 0x0AE8, 0x52CA, 0x52CA, 0x29D7, 0x52CB, 0x52CB, 0x0FD4,
+ 0x52CC, 0x52CF, 0x29D8, 0x52D0, 0x52D0, 0x1392, 0x52D1, 0x52D1, 0x29DC,
+ 0x52D2, 0x52D2, 0x09C0, 0x52D3, 0x52D4, 0x29DD, 0x52D5, 0x52D5, 0x1ECD,
+ 0x52D6, 0x52D6, 0x1393, 0x52D7, 0x52D7, 0x29DF, 0x52D8, 0x52D8, 0x093E,
+ 0x52D9, 0x52D9, 0x21A9, 0x52DA, 0x52DA, 0x29E0, 0x52DB, 0x52DB, 0x21E6,
+ 0x52DC, 0x52DC, 0x29E1, 0x52DD, 0x52DD, 0x2127, 0x52DE, 0x52DE, 0x2003,
+ 0x52DF, 0x52DF, 0x0B1F, 0x52E0, 0x52E1, 0x29E2, 0x52E2, 0x52E2, 0x2132,
+ 0x52E3, 0x52E3, 0x29E4, 0x52E4, 0x52E4, 0x0C57, 0x52E5, 0x52EF, 0x29E5,
+ 0x52F0, 0x52F0, 0x1394, 0x52F1, 0x52F1, 0x2323, 0x52F2, 0x52F4, 0x29F0,
+ 0x52F5, 0x52F5, 0x2011, 0x52F6, 0x52F7, 0x29F3, 0x52F8, 0x52F8, 0x20F5,
+ 0x52F9, 0x52F9, 0x12FC, 0x52FA, 0x52FA, 0x0D10, 0x52FB, 0x52FD, 0x29F5,
+ 0x52FE, 0x52FE, 0x070D, 0x52FF, 0x52FF, 0x0EFF, 0x5300, 0x5300, 0x110B,
+ 0x5301, 0x5304, 0x29F8, 0x5305, 0x5305, 0x0407, 0x5306, 0x5306, 0x0555,
+ 0x5307, 0x5307, 0x29FC, 0x5308, 0x5308, 0x0FA4, 0x5309, 0x530C, 0x29FD,
+ 0x530D, 0x530D, 0x12FD, 0x530E, 0x530E, 0x2A01, 0x530F, 0x530F, 0x14B5,
+ 0x5310, 0x5310, 0x12FF, 0x5311, 0x5314, 0x2A02, 0x5315, 0x5315, 0x1266,
+ 0x5316, 0x5316, 0x07C4, 0x5317, 0x5317, 0x041A, 0x5318, 0x5318, 0x2A06,
+ 0x5319, 0x5319, 0x04FC, 0x531A, 0x531A, 0x1284, 0x531B, 0x531C, 0x2A07,
+ 0x531D, 0x531D, 0x1114, 0x531E, 0x531F, 0x2A09, 0x5320, 0x5320, 0x0884,
+ 0x5321, 0x5321, 0x097C, 0x5322, 0x5322, 0x2A0B, 0x5323, 0x5323, 0x0F28,
+ 0x5324, 0x5325, 0x2A0C, 0x5326, 0x5326, 0x1286, 0x5327, 0x5329, 0x2A0E,
+ 0x532A, 0x532A, 0x0668, 0x532B, 0x532C, 0x2A11, 0x532D, 0x532D, 0x22C5,
+ 0x532E, 0x532E, 0x1287, 0x532F, 0x532F, 0x1F5E, 0x5330, 0x5330, 0x2A13,
+ 0x5331, 0x5331, 0x22C6, 0x5332, 0x5338, 0x2A14, 0x5339, 0x5339, 0x0BC4,
+ 0x533A, 0x533A, 0x0C75, 0x533B, 0x533B, 0x1044, 0x533C, 0x533D, 0x2A1B,
+ 0x533E, 0x533E, 0x1288, 0x533F, 0x533F, 0x0B47, 0x5340, 0x5340, 0x20EF,
+ 0x5341, 0x5341, 0x0D45, 0x5342, 0x5342, 0x2A1D, 0x5343, 0x5343, 0x0C24,
+ 0x5344, 0x5344, 0x2A1E, 0x5345, 0x5345, 0x125C, 0x5346, 0x5346, 0x2A1F,
+ 0x5347, 0x5347, 0x0D36, 0x5348, 0x5348, 0x0EF6, 0x5349, 0x5349, 0x07F1,
+ 0x534A, 0x534A, 0x03F6, 0x534B, 0x534D, 0x2A20, 0x534E, 0x534E, 0x07BF,
+ 0x534F, 0x534F, 0x0F78, 0x5350, 0x5350, 0x2A23, 0x5351, 0x5351, 0x0419,
+ 0x5352, 0x5352, 0x1241, 0x5353, 0x5353, 0x121C, 0x5354, 0x5354, 0x21D0,
+ 0x5355, 0x5355, 0x0586, 0x5356, 0x5356, 0x0A9B, 0x5357, 0x5357, 0x0B32,
+ 0x5358, 0x5359, 0x2A24, 0x535A, 0x535A, 0x0470, 0x535B, 0x535B, 0x2A26,
+ 0x535C, 0x535C, 0x047E, 0x535D, 0x535D, 0x2A27, 0x535E, 0x535E, 0x044E,
+ 0x535F, 0x535F, 0x14FA, 0x5360, 0x5360, 0x115D, 0x5361, 0x5361, 0x0935,
+ 0x5362, 0x5362, 0x0A53, 0x5363, 0x5363, 0x128B, 0x5364, 0x5364, 0x0A58,
+ 0x5365, 0x5365, 0x2A28, 0x5366, 0x5366, 0x128A, 0x5367, 0x5367, 0x0EE3,
+ 0x5368, 0x5368, 0x2A29, 0x5369, 0x5369, 0x1352, 0x536A, 0x536A, 0x2A2A,
+ 0x536B, 0x536B, 0x0ECF, 0x536C, 0x536D, 0x2A2B, 0x536E, 0x536E, 0x126A,
+ 0x536F, 0x536F, 0x0AB3, 0x5370, 0x5370, 0x1086, 0x5371, 0x5371, 0x0EB2,
+ 0x5372, 0x5372, 0x2A2D, 0x5373, 0x5373, 0x0827, 0x5374, 0x5374, 0x0C8F,
+ 0x5375, 0x5375, 0x0A78, 0x5376, 0x5376, 0x2A2E, 0x5377, 0x5377, 0x091C,
+ 0x5378, 0x5378, 0x0F81, 0x5379, 0x5379, 0x2A2F, 0x537A, 0x537A, 0x1353,
+ 0x537B, 0x537E, 0x2A30, 0x537F, 0x537F, 0x0C61, 0x5380, 0x5381, 0x2A34,
+ 0x5382, 0x5382, 0x04CC, 0x5383, 0x5383, 0x2A36, 0x5384, 0x5384, 0x0631,
+ 0x5385, 0x5385, 0x0E4F, 0x5386, 0x5386, 0x09E5, 0x5387, 0x5388, 0x2A37,
+ 0x5389, 0x5389, 0x09E2, 0x538A, 0x538A, 0x2A39, 0x538B, 0x538B, 0x0FE2,
+ 0x538C, 0x538C, 0x100A, 0x538D, 0x538D, 0x127D, 0x538E, 0x5394, 0x2A3A,
+ 0x5395, 0x5395, 0x04A5, 0x5396, 0x5397, 0x2A41, 0x5398, 0x5398, 0x09D0,
+ 0x5399, 0x5399, 0x22C1, 0x539A, 0x539A, 0x07A8, 0x539B, 0x539C, 0x2A43,
+ 0x539D, 0x539D, 0x127E, 0x539E, 0x539E, 0x2A45, 0x539F, 0x539F, 0x10F0,
+ 0x53A0, 0x53A0, 0x1E64, 0x53A1, 0x53A1, 0x2A46, 0x53A2, 0x53A2, 0x0F4E,
+ 0x53A3, 0x53A3, 0x127F, 0x53A4, 0x53A4, 0x2A47, 0x53A5, 0x53A5, 0x1280,
+ 0x53A6, 0x53A6, 0x0F30, 0x53A7, 0x53A7, 0x2A48, 0x53A8, 0x53A8, 0x051D,
+ 0x53A9, 0x53A9, 0x08F6, 0x53AA, 0x53AC, 0x2A49, 0x53AD, 0x53AD, 0x21F9,
+ 0x53AE, 0x53AE, 0x1281, 0x53AF, 0x53B1, 0x2A4C, 0x53B2, 0x53B2, 0x2010,
+ 0x53B3, 0x53B3, 0x2A4F, 0x53B4, 0x53B4, 0x22C2, 0x53B5, 0x53B5, 0x2A50,
+ 0x53B6, 0x53B6, 0x139C, 0x53B7, 0x53BA, 0x2A51, 0x53BB, 0x53BB, 0x0C80,
+ 0x53BC, 0x53BE, 0x2A55, 0x53BF, 0x53BF, 0x0F45, 0x53C0, 0x53C0, 0x2A58,
+ 0x53C1, 0x53C1, 0x0CD9, 0x53C2, 0x53C2, 0x0495, 0x53C3, 0x53C3, 0x1E5A,
+ 0x53C4, 0x53C7, 0x2A59, 0x53C8, 0x53C8, 0x10BB, 0x53C9, 0x53C9, 0x04AD,
+ 0x53CA, 0x53CA, 0x0823, 0x53CB, 0x53CB, 0x10B6, 0x53CC, 0x53CC, 0x0DA0,
+ 0x53CD, 0x53CD, 0x0651, 0x53CE, 0x53D0, 0x2A5D, 0x53D1, 0x53D1, 0x063F,
+ 0x53D2, 0x53D3, 0x2A60, 0x53D4, 0x53D4, 0x0D7C, 0x53D5, 0x53D5, 0x2A62,
+ 0x53D6, 0x53D6, 0x0C7C, 0x53D7, 0x53D7, 0x0D73, 0x53D8, 0x53D8, 0x044D,
+ 0x53D9, 0x53D9, 0x0FBB, 0x53DA, 0x53DA, 0x2A63, 0x53DB, 0x53DB, 0x0B92,
+ 0x53DC, 0x53DE, 0x2A64, 0x53DF, 0x53DF, 0x1395, 0x53E0, 0x53E0, 0x05DF,
+ 0x53E1, 0x53E1, 0x2A67, 0x53E2, 0x53E2, 0x1EA2, 0x53E3, 0x53E3, 0x0967,
+ 0x53E4, 0x53E4, 0x071E, 0x53E5, 0x53E5, 0x0913, 0x53E6, 0x53E6, 0x0A36,
+ 0x53E7, 0x53E7, 0x2A68, 0x53E8, 0x53E8, 0x14FE, 0x53E9, 0x53E9, 0x14FD,
+ 0x53EA, 0x53EA, 0x11BA, 0x53EB, 0x53EB, 0x08A1, 0x53EC, 0x53EC, 0x117A,
+ 0x53ED, 0x53ED, 0x03D3, 0x53EE, 0x53EE, 0x05E2, 0x53EF, 0x53EF, 0x0956,
+ 0x53F0, 0x53F0, 0x0DFB, 0x53F1, 0x53F1, 0x14FB, 0x53F2, 0x53F2, 0x0D4E,
+ 0x53F3, 0x53F3, 0x10B7, 0x53F4, 0x53F4, 0x2A69, 0x53F5, 0x53F5, 0x1285,
+ 0x53F6, 0x53F6, 0x103D, 0x53F7, 0x53F7, 0x077C, 0x53F8, 0x53F8, 0x0DB3,
+ 0x53F9, 0x53F9, 0x0E11, 0x53FA, 0x53FA, 0x2A6A, 0x53FB, 0x53FB, 0x14FF,
+ 0x53FC, 0x53FC, 0x05D1, 0x53FD, 0x53FD, 0x14FC, 0x53FE, 0x53FF, 0x2A6B,
+ 0x5400, 0x5400, 0x2A6D, 0x5401, 0x5401, 0x10DA, 0x5402, 0x5402, 0x2A6E,
+ 0x5403, 0x5403, 0x04F9, 0x5404, 0x5404, 0x06F2, 0x5405, 0x5405, 0x2A6F,
+ 0x5406, 0x5406, 0x1502, 0x5407, 0x5407, 0x2A70, 0x5408, 0x5408, 0x0786,
+ 0x5409, 0x5409, 0x081D, 0x540A, 0x540A, 0x05D6, 0x540B, 0x540B, 0x2A71,
+ 0x540C, 0x540C, 0x0E5D, 0x540D, 0x540D, 0x0B00, 0x540E, 0x540E, 0x07AA,
+ 0x540F, 0x540F, 0x09DF, 0x5410, 0x5410, 0x0E73, 0x5411, 0x5411, 0x0F5F,
+ 0x5412, 0x5412, 0x1500, 0x5413, 0x5413, 0x0F32, 0x5414, 0x5414, 0x2A72,
+ 0x5415, 0x5415, 0x0A67, 0x5416, 0x5416, 0x1501, 0x5417, 0x5417, 0x0A97,
+ 0x5418, 0x541A, 0x2A73, 0x541B, 0x541B, 0x092C, 0x541C, 0x541C, 0x2A76,
+ 0x541D, 0x541D, 0x0A28, 0x541E, 0x541E, 0x0E7D, 0x541F, 0x541F, 0x107E,
+ 0x5420, 0x5420, 0x066A, 0x5421, 0x5421, 0x1509, 0x5422, 0x5422, 0x2A77,
+ 0x5423, 0x5423, 0x150C, 0x5424, 0x5425, 0x2A78, 0x5426, 0x5426, 0x068E,
+ 0x5427, 0x5427, 0x03D4, 0x5428, 0x5428, 0x0615, 0x5429, 0x5429, 0x0671,
+ 0x542A, 0x542A, 0x2A7A, 0x542B, 0x542B, 0x0763, 0x542C, 0x542C, 0x0E50,
+ 0x542D, 0x542D, 0x0961, 0x542E, 0x542E, 0x0DA6, 0x542F, 0x542F, 0x0C13,
+ 0x5430, 0x5430, 0x2A7B, 0x5431, 0x5431, 0x11A7, 0x5432, 0x5432, 0x150D,
+ 0x5433, 0x5433, 0x2A7C, 0x5434, 0x5434, 0x0EF1, 0x5435, 0x5435, 0x04D8,
+ 0x5436, 0x5437, 0x2A7D, 0x5438, 0x5438, 0x0F0B, 0x5439, 0x5439, 0x0538,
+ 0x543A, 0x543A, 0x2A7F, 0x543B, 0x543B, 0x0ED6, 0x543C, 0x543C, 0x07A7,
+ 0x543D, 0x543D, 0x2A80, 0x543E, 0x543E, 0x0EF0, 0x543F, 0x543F, 0x2A81,
+ 0x5440, 0x5440, 0x0FE6, 0x5441, 0x5442, 0x2A82, 0x5443, 0x5443, 0x1508,
+ 0x5444, 0x5445, 0x2A84, 0x5446, 0x5446, 0x0577, 0x5447, 0x5447, 0x2A86,
+ 0x5448, 0x5448, 0x04EF, 0x5449, 0x5449, 0x2A87, 0x544A, 0x544A, 0x06E1,
+ 0x544B, 0x544B, 0x1503, 0x544C, 0x544F, 0x2A88, 0x5450, 0x5450, 0x0B28,
+ 0x5451, 0x5451, 0x2A8C, 0x5452, 0x5454, 0x1504, 0x5455, 0x5455, 0x0B7C,
+ 0x5456, 0x5456, 0x1507, 0x5457, 0x5457, 0x150A, 0x5458, 0x5458, 0x10F4,
+ 0x5459, 0x5459, 0x150B, 0x545A, 0x545A, 0x2A8D, 0x545B, 0x545B, 0x0C37,
+ 0x545C, 0x545C, 0x0EE7, 0x545D, 0x5461, 0x2A8E, 0x5462, 0x5462, 0x0B3B,
+ 0x5463, 0x5463, 0x2A93, 0x5464, 0x5464, 0x1512, 0x5465, 0x5465, 0x2A94,
+ 0x5466, 0x5466, 0x1517, 0x5467, 0x5467, 0x2A95, 0x5468, 0x5468, 0x11DB,
+ 0x5469, 0x5470, 0x2A96, 0x5471, 0x5471, 0x1511, 0x5472, 0x5472, 0x1522,
+ 0x5473, 0x5473, 0x0EC5, 0x5474, 0x5474, 0x2A9E, 0x5475, 0x5475, 0x077E,
+ 0x5476, 0x5476, 0x1516, 0x5477, 0x5477, 0x1510, 0x5478, 0x5478, 0x0B9F,
+ 0x5479, 0x547A, 0x2A9F, 0x547B, 0x547B, 0x0D24, 0x547C, 0x547C, 0x07AB,
+ 0x547D, 0x547D, 0x0B01, 0x547E, 0x547F, 0x2AA1, 0x5480, 0x5480, 0x0906,
+ 0x5481, 0x5481, 0x2AA3, 0x5482, 0x5482, 0x150E, 0x5483, 0x5483, 0x2AA4,
+ 0x5484, 0x5484, 0x1515, 0x5485, 0x5485, 0x2AA5, 0x5486, 0x5486, 0x0B99,
+ 0x5487, 0x548A, 0x2AA6, 0x548B, 0x548B, 0x1147, 0x548C, 0x548C, 0x0784,
+ 0x548D, 0x548D, 0x2AAA, 0x548E, 0x548E, 0x08FB, 0x548F, 0x548F, 0x10A2,
+ 0x5490, 0x5490, 0x06BB, 0x5491, 0x5491, 0x2AAB, 0x5492, 0x5492, 0x11E3,
+ 0x5493, 0x5493, 0x2AAC, 0x5494, 0x5494, 0x150F, 0x5495, 0x5495, 0x0717,
+ 0x5496, 0x5496, 0x0934, 0x5497, 0x5498, 0x2AAD, 0x5499, 0x5499, 0x0A45,
+ 0x549A, 0x549B, 0x1513, 0x549C, 0x549C, 0x2AAF, 0x549D, 0x549D, 0x1518,
+ 0x549E, 0x54A2, 0x2AB0, 0x54A3, 0x54A3, 0x1523, 0x54A4, 0x54A4, 0x152D,
+ 0x54A5, 0x54A5, 0x2AB5, 0x54A6, 0x54A6, 0x151F, 0x54A7, 0x54A7, 0x151E,
+ 0x54A8, 0x54A8, 0x1226, 0x54A9, 0x54AA, 0x152B, 0x54AB, 0x54AB, 0x1767,
+ 0x54AC, 0x54AC, 0x102E, 0x54AD, 0x54AD, 0x151A, 0x54AE, 0x54AE, 0x2AB6,
+ 0x54AF, 0x54AF, 0x0936, 0x54B0, 0x54B0, 0x2AB7, 0x54B1, 0x54B1, 0x111E,
+ 0x54B2, 0x54B2, 0x2AB8, 0x54B3, 0x54B3, 0x0955, 0x54B4, 0x54B4, 0x151C,
+ 0x54B5, 0x54B7, 0x2AB9, 0x54B8, 0x54B8, 0x0F39, 0x54B9, 0x54BA, 0x2ABC,
+ 0x54BB, 0x54BB, 0x1525, 0x54BC, 0x54BC, 0x236D, 0x54BD, 0x54BD, 0x0FF3,
+ 0x54BE, 0x54BE, 0x2ABE, 0x54BF, 0x54BF, 0x1526, 0x54C0, 0x54C0, 0x03B2,
+ 0x54C1, 0x54C1, 0x0BD6, 0x54C2, 0x54C2, 0x151B, 0x54C3, 0x54C3, 0x2ABF,
+ 0x54C4, 0x54C4, 0x079C, 0x54C5, 0x54C5, 0x2AC0, 0x54C6, 0x54C6, 0x061E,
+ 0x54C7, 0x54C7, 0x0E8C, 0x54C8, 0x54C8, 0x0757, 0x54C9, 0x54C9, 0x1118,
+ 0x54CA, 0x54CB, 0x2AC1, 0x54CC, 0x54CC, 0x1527, 0x54CD, 0x54CD, 0x0F59,
+ 0x54CE, 0x54CE, 0x03B0, 0x54CF, 0x54CF, 0x152F, 0x54D0, 0x54D0, 0x1519,
+ 0x54D1, 0x54D1, 0x0FEF, 0x54D2, 0x54D2, 0x151D, 0x54D3, 0x54D4, 0x1520,
+ 0x54D5, 0x54D5, 0x1524, 0x54D6, 0x54D6, 0x2AC3, 0x54D7, 0x54D7, 0x07BE,
+ 0x54D8, 0x54D8, 0x2AC4, 0x54D9, 0x54DA, 0x1528, 0x54DB, 0x54DB, 0x2AC5,
+ 0x54DC, 0x54DC, 0x152A, 0x54DD, 0x54DD, 0x152E, 0x54DE, 0x54DE, 0x1530,
+ 0x54DF, 0x54DF, 0x1099, 0x54E0, 0x54E0, 0x2AC6, 0x54E1, 0x54E1, 0x2247,
+ 0x54E2, 0x54E4, 0x2AC7, 0x54E5, 0x54E5, 0x06E2, 0x54E6, 0x54E6, 0x0B77,
+ 0x54E7, 0x54E7, 0x1532, 0x54E8, 0x54E8, 0x0D13, 0x54E9, 0x54E9, 0x09F1,
+ 0x54EA, 0x54EA, 0x0B27, 0x54EB, 0x54EC, 0x2ACA, 0x54ED, 0x54ED, 0x096B,
+ 0x54EE, 0x54EE, 0x0F65, 0x54EF, 0x54F1, 0x2ACC, 0x54F2, 0x54F2, 0x117D,
+ 0x54F3, 0x54F3, 0x1536, 0x54F4, 0x54F9, 0x2ACF, 0x54FA, 0x54FA, 0x047F,
+ 0x54FB, 0x54FB, 0x2AD5, 0x54FC, 0x54FC, 0x0796, 0x54FD, 0x54FD, 0x1534,
+ 0x54FE, 0x54FE, 0x2AD6, 0x54FF, 0x54FF, 0x1391, 0x5500, 0x5500, 0x2AD7,
+ 0x5501, 0x5501, 0x100D, 0x5502, 0x5503, 0x2AD8, 0x5504, 0x5504, 0x236C,
+ 0x5505, 0x5505, 0x2ADA, 0x5506, 0x5506, 0x0DE9, 0x5507, 0x5507, 0x0540,
+ 0x5508, 0x5508, 0x2ADB, 0x5509, 0x5509, 0x03B1, 0x550A, 0x550E, 0x2ADC,
+ 0x550F, 0x550F, 0x1539, 0x5510, 0x5510, 0x0E19, 0x5511, 0x5511, 0x153A,
+ 0x5512, 0x5513, 0x2AE1, 0x5514, 0x5514, 0x1535, 0x5515, 0x551A, 0x2AE3,
+ 0x551B, 0x551B, 0x1531, 0x551C, 0x551F, 0x2AE9, 0x5520, 0x5520, 0x1533,
+ 0x5521, 0x5521, 0x2AED, 0x5522, 0x5523, 0x1537, 0x5524, 0x5524, 0x07D2,
+ 0x5525, 0x5526, 0x2AEE, 0x5527, 0x5527, 0x153B, 0x5528, 0x5529, 0x2AF0,
+ 0x552A, 0x552A, 0x153C, 0x552B, 0x552B, 0x2AF2, 0x552C, 0x552C, 0x07B8,
+ 0x552D, 0x552D, 0x2AF3, 0x552E, 0x552E, 0x0D72, 0x552F, 0x552F, 0x0EB7,
+ 0x5530, 0x5530, 0x154D, 0x5531, 0x5531, 0x04CF, 0x5532, 0x5532, 0x2AF4,
+ 0x5533, 0x5533, 0x154C, 0x5534, 0x5536, 0x2AF5, 0x5537, 0x5537, 0x1547,
+ 0x5538, 0x553B, 0x2AF8, 0x553C, 0x553C, 0x1546, 0x553D, 0x553D, 0x2AFC,
+ 0x553E, 0x553E, 0x0E8A, 0x553F, 0x553F, 0x1544, 0x5540, 0x5540, 0x2AFD,
+ 0x5541, 0x5541, 0x1542, 0x5542, 0x5542, 0x2AFE, 0x5543, 0x5543, 0x095D,
+ 0x5544, 0x5544, 0x1221, 0x5545, 0x5545, 0x2AFF, 0x5546, 0x5546, 0x0D05,
+ 0x5547, 0x5548, 0x2B00, 0x5549, 0x5549, 0x1540, 0x554A, 0x554A, 0x03AC,
+ 0x554B, 0x554E, 0x2B02, 0x554F, 0x554F, 0x219C, 0x5550, 0x5550, 0x1545,
+ 0x5551, 0x5552, 0x2B06, 0x5553, 0x5553, 0x20C9, 0x5554, 0x5554, 0x2B08,
+ 0x5555, 0x5555, 0x1543, 0x5556, 0x5556, 0x1548, 0x5557, 0x555B, 0x2B09,
+ 0x555C, 0x555C, 0x154E, 0x555D, 0x555D, 0x2B0E, 0x555E, 0x555E, 0x21F0,
+ 0x555F, 0x5560, 0x2B0F, 0x5561, 0x5561, 0x0665, 0x5562, 0x5563, 0x2B11,
+ 0x5564, 0x5564, 0x0BC0, 0x5565, 0x5565, 0x0CEF, 0x5566, 0x5566, 0x099D,
+ 0x5567, 0x5567, 0x153D, 0x5568, 0x5569, 0x2B13, 0x556A, 0x556A, 0x0B7F,
+ 0x556B, 0x556B, 0x2B15, 0x556C, 0x556C, 0x127A, 0x556D, 0x556D, 0x1541,
+ 0x556E, 0x556E, 0x0B59, 0x556F, 0x5574, 0x2B16, 0x5575, 0x5577, 0x1549,
+ 0x5578, 0x5578, 0x0F70, 0x5579, 0x557A, 0x2B1C, 0x557B, 0x557B, 0x155A,
+ 0x557C, 0x557C, 0x0E37, 0x557D, 0x557D, 0x2B1E, 0x557E, 0x557E, 0x1557,
+ 0x557F, 0x557F, 0x2B1F, 0x5580, 0x5580, 0x0933, 0x5581, 0x5581, 0x1555,
+ 0x5582, 0x5582, 0x0EC8, 0x5583, 0x5583, 0x1551, 0x5584, 0x5584, 0x0CFF,
+ 0x5585, 0x5586, 0x2B20, 0x5587, 0x5587, 0x0999, 0x5588, 0x5588, 0x1554,
+ 0x5589, 0x5589, 0x07A4, 0x558A, 0x558A, 0x0767, 0x558B, 0x558B, 0x154F,
+ 0x558C, 0x558E, 0x2B22, 0x558F, 0x558F, 0x153E, 0x5590, 0x5590, 0x2B25,
+ 0x5591, 0x5591, 0x1559, 0x5592, 0x5593, 0x2B26, 0x5594, 0x5594, 0x155E,
+ 0x5595, 0x5597, 0x2B28, 0x5598, 0x5598, 0x0530, 0x5599, 0x5599, 0x155F,
+ 0x559A, 0x559B, 0x2B2B, 0x559C, 0x559C, 0x0F1F, 0x559D, 0x559D, 0x077F,
+ 0x559E, 0x559E, 0x2B2D, 0x559F, 0x559F, 0x1556, 0x55A0, 0x55A6, 0x2B2E,
+ 0x55A7, 0x55A7, 0x0FC5, 0x55A8, 0x55A9, 0x2B35, 0x55AA, 0x55AA, 0x210B,
+ 0x55AB, 0x55AB, 0x2B37, 0x55AC, 0x55AC, 0x20DE, 0x55AD, 0x55AD, 0x2B38,
+ 0x55AE, 0x55AE, 0x1EAA, 0x55AF, 0x55B0, 0x2B39, 0x55B1, 0x55B1, 0x1552,
+ 0x55B2, 0x55B2, 0x222C, 0x55B3, 0x55B3, 0x113E, 0x55B4, 0x55B4, 0x2B3B,
+ 0x55B5, 0x55B5, 0x153F, 0x55B6, 0x55B6, 0x2B3C, 0x55B7, 0x55B7, 0x0BA8,
+ 0x55B8, 0x55B8, 0x2B3D, 0x55B9, 0x55B9, 0x1553, 0x55BA, 0x55BA, 0x2B3E,
+ 0x55BB, 0x55BB, 0x10DC, 0x55BC, 0x55BC, 0x2B3F, 0x55BD, 0x55BE, 0x155C,
+ 0x55BF, 0x55C3, 0x2B40, 0x55C4, 0x55C4, 0x156A, 0x55C5, 0x55C5, 0x0FAC,
+ 0x55C6, 0x55C6, 0x20D8, 0x55C7, 0x55C7, 0x22C0, 0x55C8, 0x55C8, 0x2B45,
+ 0x55C9, 0x55C9, 0x1562, 0x55CA, 0x55CB, 0x2B46, 0x55CC, 0x55CD, 0x156F,
+ 0x55CE, 0x55CE, 0x206F, 0x55CF, 0x55D0, 0x2B48, 0x55D1, 0x55D1, 0x1564,
+ 0x55D2, 0x55D2, 0x1550, 0x55D3, 0x55D3, 0x0CDD, 0x55D4, 0x55D4, 0x1567,
+ 0x55D5, 0x55D5, 0x2B4A, 0x55D6, 0x55D6, 0x1558, 0x55D7, 0x55D9, 0x2B4B,
+ 0x55DA, 0x55DA, 0x21A1, 0x55DB, 0x55DB, 0x2B4E, 0x55DC, 0x55DC, 0x0D5F,
+ 0x55DD, 0x55DD, 0x1569, 0x55DE, 0x55DE, 0x2B4F, 0x55DF, 0x55DF, 0x155B,
+ 0x55E0, 0x55E0, 0x2B50, 0x55E1, 0x55E1, 0x0EDA, 0x55E2, 0x55E2, 0x2B51,
+ 0x55E3, 0x55E3, 0x0DB8, 0x55E4, 0x55E4, 0x1573, 0x55E5, 0x55E5, 0x156C,
+ 0x55E6, 0x55E6, 0x1568, 0x55E7, 0x55E7, 0x2B52, 0x55E8, 0x55E8, 0x1571,
+ 0x55E9, 0x55E9, 0x2379, 0x55EA, 0x55EA, 0x1560, 0x55EB, 0x55EC, 0x1565,
+ 0x55ED, 0x55EE, 0x2B53, 0x55EF, 0x55EF, 0x156B, 0x55F0, 0x55F1, 0x2B55,
+ 0x55F2, 0x55F3, 0x156D, 0x55F4, 0x55F4, 0x2B57, 0x55F5, 0x55F5, 0x1572,
+ 0x55F6, 0x55F6, 0x2372, 0x55F7, 0x55F7, 0x1561, 0x55F8, 0x55FC, 0x2B58,
+ 0x55FD, 0x55FD, 0x0DC9, 0x55FE, 0x55FE, 0x157B, 0x55FF, 0x55FF, 0x2B5D,
+ 0x5600, 0x5600, 0x157C, 0x5601, 0x5601, 0x1578, 0x5602, 0x5605, 0x2B5E,
+ 0x5606, 0x5606, 0x216A, 0x5607, 0x5607, 0x2B62, 0x5608, 0x5608, 0x1576,
+ 0x5609, 0x5609, 0x0841, 0x560A, 0x560B, 0x2B63, 0x560C, 0x560C, 0x1577,
+ 0x560D, 0x560D, 0x237C, 0x560E, 0x560E, 0x06BD, 0x560F, 0x560F, 0x127B,
+ 0x5610, 0x5613, 0x2B65, 0x5614, 0x5614, 0x20B0, 0x5615, 0x5615, 0x2B69,
+ 0x5616, 0x5616, 0x237A, 0x5617, 0x5617, 0x1E74, 0x5618, 0x5618, 0x0FB5,
+ 0x5619, 0x561A, 0x2B6A, 0x561B, 0x561B, 0x0A96, 0x561C, 0x561C, 0x2377,
+ 0x561D, 0x561D, 0x2B6C, 0x561E, 0x561E, 0x1575, 0x561F, 0x561F, 0x1563,
+ 0x5620, 0x5622, 0x2B6D, 0x5623, 0x5623, 0x157A, 0x5624, 0x5624, 0x1579,
+ 0x5625, 0x5626, 0x2B70, 0x5627, 0x5627, 0x157D, 0x5628, 0x5628, 0x2B72,
+ 0x5629, 0x5629, 0x1F4C, 0x562A, 0x562B, 0x2B73, 0x562C, 0x562C, 0x1582,
+ 0x562D, 0x562D, 0x157E, 0x562E, 0x562E, 0x2378, 0x562F, 0x562F, 0x21CF,
+ 0x5630, 0x5630, 0x2368, 0x5631, 0x5631, 0x11F5, 0x5632, 0x5632, 0x04D5,
+ 0x5633, 0x5633, 0x2B75, 0x5634, 0x5634, 0x1249, 0x5635, 0x5635, 0x2371,
+ 0x5636, 0x5636, 0x0DB0, 0x5637, 0x5637, 0x2B76, 0x5638, 0x5638, 0x2369,
+ 0x5639, 0x5639, 0x1580, 0x563A, 0x563A, 0x2B77, 0x563B, 0x563B, 0x0F0A,
+ 0x563C, 0x563E, 0x2B78, 0x563F, 0x563F, 0x0790, 0x5640, 0x5640, 0x2B7B,
+ 0x5641, 0x5641, 0x2674, 0x5642, 0x564B, 0x2B7C, 0x564C, 0x564C, 0x1587,
+ 0x564D, 0x564D, 0x1583, 0x564E, 0x564E, 0x1034, 0x564F, 0x5653, 0x2B86,
+ 0x5654, 0x5654, 0x1588, 0x5655, 0x5656, 0x2B8B, 0x5657, 0x5657, 0x1581,
+ 0x5658, 0x5658, 0x157F, 0x5659, 0x5659, 0x1585, 0x565A, 0x565B, 0x2B8D,
+ 0x565C, 0x565C, 0x1586, 0x565D, 0x565D, 0x236F, 0x565E, 0x565F, 0x2B8F,
+ 0x5660, 0x5660, 0x2370, 0x5661, 0x5661, 0x2B91, 0x5662, 0x5662, 0x1584,
+ 0x5663, 0x5663, 0x2B92, 0x5664, 0x5664, 0x158A, 0x5665, 0x5665, 0x2376,
+ 0x5666, 0x5666, 0x2373, 0x5667, 0x5667, 0x2B93, 0x5668, 0x5668, 0x0C16,
+ 0x5669, 0x5669, 0x1262, 0x566A, 0x566A, 0x112E, 0x566B, 0x566B, 0x158C,
+ 0x566C, 0x566C, 0x0D60, 0x566D, 0x566E, 0x2B94, 0x566F, 0x566F, 0x237F,
+ 0x5670, 0x5670, 0x2B96, 0x5671, 0x5671, 0x158B, 0x5672, 0x5672, 0x2374,
+ 0x5673, 0x5673, 0x2B97, 0x5674, 0x5674, 0x20B5, 0x5675, 0x5675, 0x2B98,
+ 0x5676, 0x5676, 0x06BC, 0x5677, 0x5677, 0x2B99, 0x5678, 0x5678, 0x1EDB,
+ 0x5679, 0x5679, 0x2672, 0x567A, 0x567A, 0x2B9A, 0x567B, 0x567C, 0x158D,
+ 0x567D, 0x567F, 0x2B9B, 0x5680, 0x5680, 0x236E, 0x5681, 0x5684, 0x2B9E,
+ 0x5685, 0x5685, 0x158F, 0x5686, 0x5686, 0x1589, 0x5687, 0x5687, 0x21B7,
+ 0x5688, 0x568B, 0x2BA2, 0x568C, 0x568C, 0x2375, 0x568D, 0x568D, 0x2BA6,
+ 0x568E, 0x568E, 0x0776, 0x568F, 0x568F, 0x0E3A, 0x5690, 0x5692, 0x2BA7,
+ 0x5693, 0x5693, 0x1590, 0x5694, 0x5694, 0x2BAA, 0x5695, 0x5695, 0x2382,
+ 0x5696, 0x5698, 0x2BAB, 0x5699, 0x5699, 0x209E, 0x569A, 0x56A2, 0x2BAE,
+ 0x56A3, 0x56A3, 0x0F66, 0x56A4, 0x56A5, 0x2BB7, 0x56A6, 0x56A6, 0x236B,
+ 0x56A7, 0x56A7, 0x2BB9, 0x56A8, 0x56A8, 0x2039, 0x56A9, 0x56AD, 0x2BBA,
+ 0x56AE, 0x56AE, 0x269F, 0x56AF, 0x56AF, 0x1591, 0x56B0, 0x56B2, 0x2BBF,
+ 0x56B3, 0x56B3, 0x237D, 0x56B4, 0x56B4, 0x21F5, 0x56B5, 0x56B5, 0x2BC2,
+ 0x56B6, 0x56B6, 0x2381, 0x56B7, 0x56B7, 0x0C9D, 0x56B8, 0x56BB, 0x2BC3,
+ 0x56BC, 0x56BC, 0x0891, 0x56BD, 0x56BF, 0x2BC7, 0x56C0, 0x56C0, 0x237B,
+ 0x56C1, 0x56C1, 0x237E, 0x56C2, 0x56C2, 0x21CC, 0x56C3, 0x56C4, 0x2BCA,
+ 0x56C5, 0x56C5, 0x22DB, 0x56C6, 0x56C7, 0x2BCC, 0x56C8, 0x56C8, 0x236A,
+ 0x56C9, 0x56C9, 0x2689, 0x56CA, 0x56CA, 0x0B35, 0x56CB, 0x56CB, 0x2BCE,
+ 0x56CC, 0x56CC, 0x2697, 0x56CD, 0x56D0, 0x2BCF, 0x56D1, 0x56D1, 0x22A1,
+ 0x56D2, 0x56D3, 0x2BD3, 0x56D4, 0x56D4, 0x1592, 0x56D5, 0x56D6, 0x2BD5,
+ 0x56D7, 0x56D7, 0x1593, 0x56D8, 0x56D9, 0x2BD7, 0x56DA, 0x56DA, 0x0C71,
+ 0x56DB, 0x56DB, 0x0DB9, 0x56DC, 0x56DC, 0x2BD9, 0x56DD, 0x56DD, 0x1594,
+ 0x56DE, 0x56DE, 0x07ED, 0x56DF, 0x56DF, 0x126C, 0x56E0, 0x56E0, 0x1079,
+ 0x56E1, 0x56E1, 0x1595, 0x56E2, 0x56E2, 0x0E76, 0x56E3, 0x56E3, 0x2BDA,
+ 0x56E4, 0x56E4, 0x0619, 0x56E5, 0x56EA, 0x2BDB, 0x56EB, 0x56EB, 0x1597,
+ 0x56EC, 0x56EC, 0x2BE1, 0x56ED, 0x56ED, 0x10F3, 0x56EE, 0x56EF, 0x2BE2,
+ 0x56F0, 0x56F0, 0x0992, 0x56F1, 0x56F1, 0x0554, 0x56F2, 0x56F3, 0x2BE4,
+ 0x56F4, 0x56F4, 0x0EB6, 0x56F5, 0x56F5, 0x1596, 0x56F6, 0x56F8, 0x2BE6,
+ 0x56F9, 0x56F9, 0x1598, 0x56FA, 0x56FA, 0x0725, 0x56FB, 0x56FC, 0x2BE9,
+ 0x56FD, 0x56FD, 0x0753, 0x56FE, 0x56FE, 0x0E6D, 0x56FF, 0x56FF, 0x1599,
+ 0x5700, 0x5702, 0x2BEB, 0x5703, 0x5703, 0x0BF3, 0x5704, 0x5704, 0x159A,
+ 0x5705, 0x5705, 0x2BEE, 0x5706, 0x5706, 0x10F5, 0x5707, 0x5707, 0x2383,
+ 0x5708, 0x5708, 0x0C81, 0x5709, 0x5709, 0x159C, 0x570A, 0x570A, 0x159B,
+ 0x570B, 0x570B, 0x1F3D, 0x570C, 0x570C, 0x2BEF, 0x570D, 0x570D, 0x218F,
+ 0x570E, 0x5711, 0x2BF0, 0x5712, 0x5712, 0x2246, 0x5713, 0x5713, 0x2248,
+ 0x5714, 0x5715, 0x2BF4, 0x5716, 0x5716, 0x217E, 0x5717, 0x5717, 0x2BF6,
+ 0x5718, 0x5718, 0x2180, 0x5719, 0x571B, 0x2BF7, 0x571C, 0x571C, 0x159D,
+ 0x571D, 0x571E, 0x2BFA, 0x571F, 0x571F, 0x0E72, 0x5720, 0x5722, 0x2BFC,
+ 0x5723, 0x5723, 0x0D3C, 0x5724, 0x5727, 0x2BFF, 0x5728, 0x5728, 0x111D,
+ 0x5729, 0x5729, 0x13A7, 0x572A, 0x572A, 0x13A9, 0x572B, 0x572B, 0x2C03,
+ 0x572C, 0x572C, 0x13A8, 0x572D, 0x572D, 0x0740, 0x572E, 0x572F, 0x13AC,
+ 0x5730, 0x5730, 0x05B9, 0x5731, 0x5732, 0x2C04, 0x5733, 0x5733, 0x13AA,
+ 0x5734, 0x5738, 0x2C06, 0x5739, 0x5739, 0x13AB, 0x573A, 0x573A, 0x04C6,
+ 0x573B, 0x573B, 0x13AF, 0x573C, 0x573D, 0x2C0B, 0x573E, 0x573E, 0x080D,
+ 0x573F, 0x573F, 0x2C0D, 0x5740, 0x5740, 0x11B6, 0x5741, 0x5741, 0x2C0E,
+ 0x5742, 0x5742, 0x13B0, 0x5743, 0x5746, 0x2C0F, 0x5747, 0x5747, 0x0928,
+ 0x5748, 0x5749, 0x2C13, 0x574A, 0x574A, 0x0658, 0x574B, 0x574B, 0x2C15,
+ 0x574C, 0x574C, 0x13A0, 0x574D, 0x574D, 0x0E01, 0x574E, 0x574E, 0x093F,
+ 0x574F, 0x574F, 0x07CA, 0x5750, 0x5750, 0x1255, 0x5751, 0x5751, 0x0960,
+ 0x5752, 0x5756, 0x2C16, 0x5757, 0x5757, 0x0976, 0x5758, 0x5759, 0x2C1B,
+ 0x575A, 0x575A, 0x0854, 0x575B, 0x575B, 0x0E06, 0x575C, 0x575C, 0x13AE,
+ 0x575D, 0x575D, 0x03DE, 0x575E, 0x575E, 0x0EFA, 0x575F, 0x575F, 0x0675,
+ 0x5760, 0x5760, 0x1216, 0x5761, 0x5761, 0x0BE1, 0x5762, 0x5763, 0x2C1D,
+ 0x5764, 0x5764, 0x098F, 0x5765, 0x5765, 0x2C1F, 0x5766, 0x5766, 0x0E0C,
+ 0x5767, 0x5767, 0x2C20, 0x5768, 0x5768, 0x13B7, 0x5769, 0x5769, 0x13B1,
+ 0x576A, 0x576A, 0x0BD9, 0x576B, 0x576B, 0x13B3, 0x576C, 0x576C, 0x2C21,
+ 0x576D, 0x576D, 0x13B8, 0x576E, 0x576E, 0x2C22, 0x576F, 0x576F, 0x0BB8,
+ 0x5770, 0x5772, 0x2C23, 0x5773, 0x5773, 0x13BA, 0x5774, 0x5775, 0x2C26,
+ 0x5776, 0x5776, 0x13B9, 0x5777, 0x5777, 0x094D, 0x5778, 0x577A, 0x2C28,
+ 0x577B, 0x577B, 0x13B6, 0x577C, 0x577C, 0x13B5, 0x577D, 0x5781, 0x2C2B,
+ 0x5782, 0x5782, 0x053C, 0x5783, 0x5783, 0x0997, 0x5784, 0x5784, 0x0A49,
+ 0x5785, 0x5785, 0x13B2, 0x5786, 0x5786, 0x13B4, 0x5787, 0x578A, 0x2C30,
+ 0x578B, 0x578B, 0x0F98, 0x578C, 0x578C, 0x13BD, 0x578D, 0x5791, 0x2C34,
+ 0x5792, 0x5792, 0x09C8, 0x5793, 0x5793, 0x13C2, 0x5794, 0x579A, 0x2C39,
+ 0x579B, 0x579B, 0x0621, 0x579C, 0x579F, 0x2C40, 0x57A0, 0x57A0, 0x13C3,
+ 0x57A1, 0x57A1, 0x13A2, 0x57A2, 0x57A2, 0x0711, 0x57A3, 0x57A3, 0x10EE,
+ 0x57A4, 0x57A4, 0x13BC, 0x57A5, 0x57A5, 0x2C44, 0x57A6, 0x57A6, 0x095E,
+ 0x57A7, 0x57A7, 0x13C0, 0x57A8, 0x57A8, 0x2C45, 0x57A9, 0x57A9, 0x13A1,
+ 0x57AA, 0x57AA, 0x2C46, 0x57AB, 0x57AB, 0x05C7, 0x57AC, 0x57AC, 0x2C47,
+ 0x57AD, 0x57AD, 0x13BB, 0x57AE, 0x57AE, 0x0972, 0x57AF, 0x57B1, 0x2C48,
+ 0x57B2, 0x57B2, 0x13BE, 0x57B3, 0x57B3, 0x2C4B, 0x57B4, 0x57B4, 0x13C1,
+ 0x57B5, 0x57B7, 0x2C4C, 0x57B8, 0x57B8, 0x13C9, 0x57B9, 0x57C1, 0x2C4F,
+ 0x57C2, 0x57C2, 0x06FA, 0x57C3, 0x57C3, 0x03AE, 0x57C4, 0x57CA, 0x2C58,
+ 0x57CB, 0x57CB, 0x0A98, 0x57CC, 0x57CD, 0x2C5F, 0x57CE, 0x57CE, 0x04EC,
+ 0x57CF, 0x57CF, 0x13BF, 0x57D0, 0x57D1, 0x2C61, 0x57D2, 0x57D2, 0x13C8,
+ 0x57D3, 0x57D3, 0x2C63, 0x57D4, 0x57D4, 0x0BF1, 0x57D5, 0x57D5, 0x13C4,
+ 0x57D6, 0x57D7, 0x2C64, 0x57D8, 0x57D8, 0x13C5, 0x57D9, 0x57D9, 0x13C7,
+ 0x57DA, 0x57DA, 0x13C6, 0x57DB, 0x57DC, 0x2C66, 0x57DD, 0x57DD, 0x13CE,
+ 0x57DE, 0x57DE, 0x2C68, 0x57DF, 0x57DF, 0x10D7, 0x57E0, 0x57E0, 0x0481,
+ 0x57E1, 0x57E1, 0x232A, 0x57E2, 0x57E3, 0x2C69, 0x57E4, 0x57E4, 0x13CD,
+ 0x57E5, 0x57EC, 0x2C6B, 0x57ED, 0x57ED, 0x13D2, 0x57EE, 0x57EE, 0x2C73,
+ 0x57EF, 0x57EF, 0x13CB, 0x57F0, 0x57F3, 0x2C74, 0x57F4, 0x57F4, 0x13CA,
+ 0x57F5, 0x57F6, 0x2C78, 0x57F7, 0x57F7, 0x228B, 0x57F8, 0x57F8, 0x13CC,
+ 0x57F9, 0x57F9, 0x0BA1, 0x57FA, 0x57FA, 0x080E, 0x57FB, 0x57FC, 0x2C7A,
+ 0x57FD, 0x57FD, 0x13D1, 0x57FE, 0x57FF, 0x2C7C, 0x5800, 0x5800, 0x13D3,
+ 0x5801, 0x5801, 0x2C7E, 0x5802, 0x5802, 0x0E16, 0x5803, 0x5804, 0x2C7F,
+ 0x5805, 0x5805, 0x1F85, 0x5806, 0x5806, 0x0610, 0x5807, 0x5807, 0x144C,
+ 0x5808, 0x5809, 0x2C81, 0x580A, 0x580A, 0x2325, 0x580B, 0x580B, 0x13CF,
+ 0x580C, 0x580C, 0x2C83, 0x580D, 0x580D, 0x13D0, 0x580E, 0x5810, 0x2C84,
+ 0x5811, 0x5811, 0x0C32, 0x5812, 0x5814, 0x2C87, 0x5815, 0x5815, 0x0628,
+ 0x5816, 0x5816, 0x232C, 0x5817, 0x5818, 0x2C8A, 0x5819, 0x5819, 0x13D5,
+ 0x581A, 0x581C, 0x2C8C, 0x581D, 0x581D, 0x232E, 0x581E, 0x581E, 0x13D4,
+ 0x581F, 0x581F, 0x2C8F, 0x5820, 0x5820, 0x13D7, 0x5821, 0x5821, 0x040D,
+ 0x5822, 0x5823, 0x2C90, 0x5824, 0x5824, 0x05AD, 0x5825, 0x5829, 0x2C92,
+ 0x582A, 0x582A, 0x093D, 0x582B, 0x582E, 0x2C97, 0x582F, 0x582F, 0x2205,
+ 0x5830, 0x5830, 0x1008, 0x5831, 0x5831, 0x1E38, 0x5832, 0x5833, 0x2C9B,
+ 0x5834, 0x5834, 0x1E73, 0x5835, 0x5835, 0x0601, 0x5836, 0x5843, 0x2C9D,
+ 0x5844, 0x5844, 0x13D6, 0x5845, 0x5849, 0x2CAB, 0x584A, 0x584A, 0x1FE3,
+ 0x584B, 0x584B, 0x2339, 0x584C, 0x584C, 0x0DEF, 0x584D, 0x584D, 0x19A3,
+ 0x584E, 0x584E, 0x2CB0, 0x584F, 0x584F, 0x232B, 0x5850, 0x5850, 0x2CB1,
+ 0x5851, 0x5851, 0x0DD1, 0x5852, 0x5852, 0x232D, 0x5853, 0x5853, 0x2CB2,
+ 0x5854, 0x5854, 0x0DF3, 0x5855, 0x5856, 0x2CB3, 0x5857, 0x5857, 0x217F,
+ 0x5858, 0x5858, 0x0E14, 0x5859, 0x585D, 0x2CB5, 0x585E, 0x585E, 0x0CD6,
+ 0x585F, 0x5861, 0x2CBA, 0x5862, 0x5862, 0x21A7, 0x5863, 0x5863, 0x2CBD,
+ 0x5864, 0x5864, 0x232F, 0x5865, 0x5865, 0x13D8, 0x5866, 0x586A, 0x2CBE,
+ 0x586B, 0x586B, 0x0E41, 0x586C, 0x586C, 0x13D9, 0x586D, 0x5874, 0x2CC3,
+ 0x5875, 0x5875, 0x1E7D, 0x5876, 0x5878, 0x2CCB, 0x5879, 0x5879, 0x20D6,
+ 0x587A, 0x587D, 0x2CCE, 0x587E, 0x587E, 0x13A3, 0x587F, 0x587F, 0x2CD2,
+ 0x5880, 0x5880, 0x13DD, 0x5881, 0x5881, 0x13DA, 0x5882, 0x5882, 0x2CD3,
+ 0x5883, 0x5883, 0x08E2, 0x5884, 0x5884, 0x2CD4, 0x5885, 0x5885, 0x0D92,
+ 0x5886, 0x5888, 0x2CD5, 0x5889, 0x5889, 0x13DB, 0x588A, 0x588A, 0x1EC2,
+ 0x588B, 0x5891, 0x2CD8, 0x5892, 0x5892, 0x0D03, 0x5893, 0x5893, 0x0B1C,
+ 0x5894, 0x5898, 0x2CDF, 0x5899, 0x5899, 0x0C3A, 0x589A, 0x589A, 0x13DC,
+ 0x589B, 0x589B, 0x2CE4, 0x589C, 0x589C, 0x22B2, 0x589D, 0x589D, 0x2CE5,
+ 0x589E, 0x589E, 0x1139, 0x589F, 0x589F, 0x0FB1, 0x58A0, 0x58A7, 0x2CE6,
+ 0x58A8, 0x58A8, 0x0B0E, 0x58A9, 0x58A9, 0x0614, 0x58AA, 0x58AD, 0x2CEE,
+ 0x58AE, 0x58AE, 0x1EDF, 0x58AF, 0x58B2, 0x2CF2, 0x58B3, 0x58B3, 0x1EF9,
+ 0x58B4, 0x58BA, 0x2CF6, 0x58BB, 0x58BB, 0x20D9, 0x58BC, 0x58BC, 0x13A4,
+ 0x58BD, 0x58BD, 0x2CFD, 0x58BE, 0x58BE, 0x1FDD, 0x58BF, 0x58C0, 0x2CFE,
+ 0x58C1, 0x58C1, 0x0443, 0x58C2, 0x58C4, 0x2D00, 0x58C5, 0x58C5, 0x13A5,
+ 0x58C6, 0x58C6, 0x2D03, 0x58C7, 0x58C7, 0x2167, 0x58C8, 0x58D0, 0x2D04,
+ 0x58D1, 0x58D1, 0x13A6, 0x58D2, 0x58D2, 0x2D0D, 0x58D3, 0x58D3, 0x21ED,
+ 0x58D4, 0x58D4, 0x2D0E, 0x58D5, 0x58D5, 0x0775, 0x58D6, 0x58D7, 0x2D0F,
+ 0x58D8, 0x58D8, 0x2007, 0x58D9, 0x58D9, 0x2326, 0x58DA, 0x58DA, 0x2329,
+ 0x58DB, 0x58DD, 0x2D11, 0x58DE, 0x58DE, 0x1F52, 0x58DF, 0x58DF, 0x203B,
+ 0x58E0, 0x58E0, 0x2328, 0x58E1, 0x58E1, 0x2D14, 0x58E2, 0x58E2, 0x2327,
+ 0x58E3, 0x58E3, 0x2D15, 0x58E4, 0x58E4, 0x0C9B, 0x58E5, 0x58E8, 0x2D16,
+ 0x58E9, 0x58E9, 0x1E2B, 0x58EA, 0x58EA, 0x2D1A, 0x58EB, 0x58EB, 0x0D56,
+ 0x58EC, 0x58EC, 0x0CA4, 0x58ED, 0x58ED, 0x2D1B, 0x58EE, 0x58EE, 0x1210,
+ 0x58EF, 0x58EF, 0x22AE, 0x58F0, 0x58F0, 0x0D32, 0x58F1, 0x58F2, 0x2D1C,
+ 0x58F3, 0x58F3, 0x0954, 0x58F4, 0x58F5, 0x2D1E, 0x58F6, 0x58F6, 0x07AF,
+ 0x58F7, 0x58F8, 0x2D20, 0x58F9, 0x58F9, 0x1043, 0x58FA, 0x58FA, 0x1F49,
+ 0x58FB, 0x58FC, 0x2D22, 0x58FD, 0x58FD, 0x2138, 0x58FE, 0x58FF, 0x2D24,
+ 0x5900, 0x5901, 0x2D26, 0x5902, 0x5902, 0x161C, 0x5903, 0x5903, 0x2D28,
+ 0x5904, 0x5904, 0x0529, 0x5905, 0x5906, 0x2D29, 0x5907, 0x5907, 0x0421,
+ 0x5908, 0x590C, 0x2D2B, 0x590D, 0x590D, 0x06AF, 0x590E, 0x590E, 0x2D30,
+ 0x590F, 0x590F, 0x0F31, 0x5910, 0x5913, 0x2D31, 0x5914, 0x5914, 0x12FB,
+ 0x5915, 0x5915, 0x0F13, 0x5916, 0x5916, 0x0E93, 0x5917, 0x5918, 0x2D35,
+ 0x5919, 0x5919, 0x1301, 0x591A, 0x591A, 0x061F, 0x591B, 0x591B, 0x2D37,
+ 0x591C, 0x591C, 0x1040, 0x591D, 0x591E, 0x2D38, 0x591F, 0x591F, 0x0714,
+ 0x5920, 0x5921, 0x2D3A, 0x5922, 0x5922, 0x2081, 0x5923, 0x5923, 0x2D3C,
+ 0x5924, 0x5924, 0x161B, 0x5925, 0x5925, 0x1619, 0x5926, 0x5926, 0x2D3D,
+ 0x5927, 0x5927, 0x0576, 0x5928, 0x5928, 0x2D3E, 0x5929, 0x5929, 0x0E3F,
+ 0x592A, 0x592A, 0x0DFE, 0x592B, 0x592B, 0x068F, 0x592C, 0x592C, 0x2D3F,
+ 0x592D, 0x592D, 0x1268, 0x592E, 0x592E, 0x1014, 0x592F, 0x592F, 0x0772,
+ 0x5930, 0x5930, 0x2D40, 0x5931, 0x5931, 0x0D3E, 0x5932, 0x5933, 0x2D41,
+ 0x5934, 0x5934, 0x0E68, 0x5935, 0x5936, 0x2D43, 0x5937, 0x5937, 0x104B,
+ 0x5938, 0x5938, 0x0971, 0x5939, 0x5939, 0x0843, 0x593A, 0x593A, 0x0620,
+ 0x593B, 0x593B, 0x2D45, 0x593C, 0x593C, 0x14AF, 0x593D, 0x593D, 0x2D46,
+ 0x593E, 0x593E, 0x1F7C, 0x593F, 0x5940, 0x2D47, 0x5941, 0x5941, 0x14B0,
+ 0x5942, 0x5942, 0x138C, 0x5943, 0x5943, 0x2D49, 0x5944, 0x5944, 0x1002,
+ 0x5945, 0x5946, 0x2D4A, 0x5947, 0x5947, 0x0C05, 0x5948, 0x5948, 0x0B31,
+ 0x5949, 0x5949, 0x068B, 0x594A, 0x594A, 0x2D4C, 0x594B, 0x594B, 0x0679,
+ 0x594C, 0x594D, 0x2D4D, 0x594E, 0x594E, 0x0989, 0x594F, 0x594F, 0x123D,
+ 0x5950, 0x5950, 0x2D4F, 0x5951, 0x5951, 0x0C14, 0x5952, 0x5953, 0x2D50,
+ 0x5954, 0x5954, 0x0425, 0x5955, 0x5955, 0x14B2, 0x5956, 0x5956, 0x0882,
+ 0x5957, 0x5957, 0x0E2A, 0x5958, 0x5958, 0x14B4, 0x5959, 0x5959, 0x2D52,
+ 0x595A, 0x595A, 0x14B3, 0x595B, 0x595F, 0x2D53, 0x5960, 0x5960, 0x05CD,
+ 0x5961, 0x5961, 0x2D58, 0x5962, 0x5962, 0x0D16, 0x5963, 0x5964, 0x2D59,
+ 0x5965, 0x5965, 0x03CD, 0x5966, 0x5968, 0x2D5B, 0x5969, 0x5969, 0x235B,
+ 0x596A, 0x596A, 0x1EDE, 0x596B, 0x596B, 0x2D5E, 0x596C, 0x596C, 0x1FA2,
+ 0x596D, 0x596D, 0x2D5F, 0x596E, 0x596E, 0x1EFA, 0x596F, 0x5972, 0x2D60,
+ 0x5973, 0x5973, 0x0B6F, 0x5974, 0x5974, 0x0B6C, 0x5975, 0x5975, 0x2D64,
+ 0x5976, 0x5976, 0x0B2F, 0x5977, 0x5977, 0x2D65, 0x5978, 0x5978, 0x085C,
+ 0x5979, 0x5979, 0x0DF2, 0x597A, 0x597C, 0x2D66, 0x597D, 0x597D, 0x077A,
+ 0x597E, 0x5980, 0x2D69, 0x5981, 0x5981, 0x1775, 0x5982, 0x5982, 0x0CC2,
+ 0x5983, 0x5983, 0x1776, 0x5984, 0x5984, 0x0EAE, 0x5985, 0x5985, 0x2D6C,
+ 0x5986, 0x5986, 0x120E, 0x5987, 0x5987, 0x06B9, 0x5988, 0x5988, 0x0A8F,
+ 0x5989, 0x5989, 0x2D6D, 0x598A, 0x598A, 0x0CAC, 0x598B, 0x598C, 0x2D6E,
+ 0x598D, 0x598D, 0x1777, 0x598E, 0x5991, 0x2D70, 0x5992, 0x5992, 0x0609,
+ 0x5993, 0x5993, 0x083E, 0x5994, 0x5995, 0x2D74, 0x5996, 0x5996, 0x1026,
+ 0x5997, 0x5997, 0x177B, 0x5998, 0x5998, 0x2D76, 0x5999, 0x5999, 0x0AF3,
+ 0x599A, 0x599C, 0x2D77, 0x599D, 0x599D, 0x22AD, 0x599E, 0x599E, 0x177E,
+ 0x599F, 0x59A2, 0x2D7A, 0x59A3, 0x59A3, 0x177A, 0x59A4, 0x59A4, 0x177F,
+ 0x59A5, 0x59A5, 0x0E88, 0x59A6, 0x59A7, 0x2D7E, 0x59A8, 0x59A8, 0x065E,
+ 0x59A9, 0x59AA, 0x1778, 0x59AB, 0x59AB, 0x177D, 0x59AC, 0x59AD, 0x2D80,
+ 0x59AE, 0x59AE, 0x0B40, 0x59AF, 0x59AF, 0x1782, 0x59B0, 0x59B1, 0x2D82,
+ 0x59B2, 0x59B2, 0x1781, 0x59B3, 0x59B8, 0x2D84, 0x59B9, 0x59B9, 0x0AC8,
+ 0x59BA, 0x59BA, 0x2D8A, 0x59BB, 0x59BB, 0x0BFD, 0x59BC, 0x59BD, 0x2D8B,
+ 0x59BE, 0x59BE, 0x1784, 0x59BF, 0x59C5, 0x2D8D, 0x59C6, 0x59C6, 0x0B1A,
+ 0x59C7, 0x59C9, 0x2D94, 0x59CA, 0x59CA, 0x177C, 0x59CB, 0x59CB, 0x0D53,
+ 0x59CC, 0x59CF, 0x2D97, 0x59D0, 0x59D0, 0x08B4, 0x59D1, 0x59D1, 0x071C,
+ 0x59D2, 0x59D2, 0x1780, 0x59D3, 0x59D3, 0x0FA0, 0x59D4, 0x59D4, 0x0EBE,
+ 0x59D5, 0x59D6, 0x2D9B, 0x59D7, 0x59D7, 0x1783, 0x59D8, 0x59D8, 0x178A,
+ 0x59D9, 0x59D9, 0x2D9D, 0x59DA, 0x59DA, 0x102D, 0x59DB, 0x59DB, 0x2D9E,
+ 0x59DC, 0x59DC, 0x087B, 0x59DD, 0x59DD, 0x1787, 0x59DE, 0x59E2, 0x2D9F,
+ 0x59E3, 0x59E3, 0x1789, 0x59E4, 0x59E4, 0x2DA4, 0x59E5, 0x59E5, 0x09BC,
+ 0x59E6, 0x59E7, 0x2DA5, 0x59E8, 0x59E8, 0x1053, 0x59E9, 0x59EB, 0x2DA7,
+ 0x59EC, 0x59EC, 0x081A, 0x59ED, 0x59F8, 0x2DAA, 0x59F9, 0x59F9, 0x178B,
+ 0x59FA, 0x59FA, 0x2DB6, 0x59FB, 0x59FB, 0x107D, 0x59FC, 0x59FE, 0x2DB7,
+ 0x59FF, 0x59FF, 0x1228, 0x5A00, 0x5A00, 0x2DBA, 0x5A01, 0x5A01, 0x0EAF,
+ 0x5A02, 0x5A02, 0x2DBB, 0x5A03, 0x5A03, 0x0E8F, 0x5A04, 0x5A04, 0x0A4D,
+ 0x5A05, 0x5A06, 0x1785, 0x5A07, 0x5A07, 0x0890, 0x5A08, 0x5A08, 0x1788,
+ 0x5A09, 0x5A09, 0x178D, 0x5A0A, 0x5A0B, 0x2DBC, 0x5A0C, 0x5A0C, 0x178C,
+ 0x5A0D, 0x5A10, 0x2DBE, 0x5A11, 0x5A11, 0x1790, 0x5A12, 0x5A12, 0x2DC2,
+ 0x5A13, 0x5A13, 0x1792, 0x5A14, 0x5A17, 0x2DC3, 0x5A18, 0x5A18, 0x0B52,
+ 0x5A19, 0x5A1B, 0x2DC7, 0x5A1C, 0x5A1C, 0x0B2B, 0x5A1D, 0x5A1E, 0x2DCA,
+ 0x5A1F, 0x5A1F, 0x0919, 0x5A20, 0x5A20, 0x0D28, 0x5A21, 0x5A22, 0x2DCC,
+ 0x5A23, 0x5A23, 0x1791, 0x5A24, 0x5A24, 0x2DCE, 0x5A25, 0x5A25, 0x062F,
+ 0x5A26, 0x5A28, 0x2DCF, 0x5A29, 0x5A29, 0x0AE9, 0x5A2A, 0x5A30, 0x2DD2,
+ 0x5A31, 0x5A31, 0x10CE, 0x5A32, 0x5A32, 0x178E, 0x5A33, 0x5A33, 0x2DD9,
+ 0x5A34, 0x5A34, 0x178F, 0x5A35, 0x5A35, 0x2DDA, 0x5A36, 0x5A36, 0x0C7D,
+ 0x5A37, 0x5A3B, 0x2DDB, 0x5A3C, 0x5A3C, 0x1797, 0x5A3D, 0x5A3F, 0x2DE0,
+ 0x5A40, 0x5A40, 0x1793, 0x5A41, 0x5A41, 0x203F, 0x5A42, 0x5A45, 0x2DE3,
+ 0x5A46, 0x5A46, 0x0BE4, 0x5A47, 0x5A48, 0x2DE7, 0x5A49, 0x5A49, 0x0EA2,
+ 0x5A4A, 0x5A4A, 0x1795, 0x5A4B, 0x5A54, 0x2DE9, 0x5A55, 0x5A55, 0x1796,
+ 0x5A56, 0x5A59, 0x2DF3, 0x5A5A, 0x5A5A, 0x07FE, 0x5A5B, 0x5A61, 0x2DF7,
+ 0x5A62, 0x5A62, 0x1798, 0x5A63, 0x5A65, 0x2DFE, 0x5A66, 0x5A66, 0x1F0E,
+ 0x5A67, 0x5A67, 0x1794, 0x5A68, 0x5A69, 0x2E01, 0x5A6A, 0x5A6A, 0x09A2,
+ 0x5A6B, 0x5A6C, 0x2E03, 0x5A6D, 0x5A6D, 0x23F9, 0x5A6E, 0x5A73, 0x2E05,
+ 0x5A74, 0x5A74, 0x1089, 0x5A75, 0x5A75, 0x1799, 0x5A76, 0x5A76, 0x0D2D,
+ 0x5A77, 0x5A77, 0x179D, 0x5A78, 0x5A79, 0x2E0B, 0x5A7A, 0x5A7A, 0x179E,
+ 0x5A7B, 0x5A7E, 0x2E0D, 0x5A7F, 0x5A7F, 0x0FC1, 0x5A80, 0x5A91, 0x2E11,
+ 0x5A92, 0x5A92, 0x0AC2, 0x5A93, 0x5A99, 0x2E23, 0x5A9A, 0x5A9A, 0x0AC9,
+ 0x5A9B, 0x5A9B, 0x179C, 0x5A9C, 0x5AA6, 0x2E2A, 0x5AA7, 0x5AA7, 0x23FC,
+ 0x5AA8, 0x5AA9, 0x2E35, 0x5AAA, 0x5AAA, 0x179B, 0x5AAB, 0x5AB1, 0x2E37,
+ 0x5AB2, 0x5AB2, 0x17A1, 0x5AB3, 0x5AB3, 0x0F1E, 0x5AB4, 0x5AB4, 0x2E3E,
+ 0x5AB5, 0x5AB5, 0x19A4, 0x5AB6, 0x5AB7, 0x2E3F, 0x5AB8, 0x5AB8, 0x17A4,
+ 0x5AB9, 0x5ABC, 0x2E41, 0x5ABD, 0x5ABD, 0x2069, 0x5ABE, 0x5ABE, 0x179F,
+ 0x5ABF, 0x5AC0, 0x2E45, 0x5AC1, 0x5AC1, 0x0851, 0x5AC2, 0x5AC2, 0x0CE2,
+ 0x5AC3, 0x5AC8, 0x2E47, 0x5AC9, 0x5AC9, 0x0828, 0x5ACA, 0x5ACB, 0x2E4D,
+ 0x5ACC, 0x5ACC, 0x0F40, 0x5ACD, 0x5AD1, 0x2E4F, 0x5AD2, 0x5AD2, 0x17A2,
+ 0x5AD3, 0x5AD3, 0x2E54, 0x5AD4, 0x5AD4, 0x17A3, 0x5AD5, 0x5AD5, 0x2E55,
+ 0x5AD6, 0x5AD6, 0x17A8, 0x5AD7, 0x5AD7, 0x23F7, 0x5AD8, 0x5AD8, 0x17AA,
+ 0x5AD9, 0x5ADB, 0x2E56, 0x5ADC, 0x5ADC, 0x17AB, 0x5ADD, 0x5ADF, 0x2E59,
+ 0x5AE0, 0x5AE0, 0x17A5, 0x5AE1, 0x5AE1, 0x05B6, 0x5AE2, 0x5AE2, 0x2E5C,
+ 0x5AE3, 0x5AE3, 0x17A6, 0x5AE4, 0x5AE5, 0x2E5D, 0x5AE6, 0x5AE6, 0x17A9,
+ 0x5AE7, 0x5AE8, 0x2E5F, 0x5AE9, 0x5AE9, 0x0B3E, 0x5AEA, 0x5AEA, 0x2E61,
+ 0x5AEB, 0x5AEB, 0x17A0, 0x5AEC, 0x5AF0, 0x2E62, 0x5AF1, 0x5AF1, 0x17A7,
+ 0x5AF2, 0x5AF4, 0x2E67, 0x5AF5, 0x5AF5, 0x23F6, 0x5AF6, 0x5AFA, 0x2E6A,
+ 0x5AFB, 0x5AFB, 0x23FD, 0x5AFC, 0x5AFF, 0x2E6F, 0x5B00, 0x5B00, 0x23F8,
+ 0x5B01, 0x5B07, 0x2E73, 0x5B08, 0x5B08, 0x23FA, 0x5B09, 0x5B09, 0x17AC,
+ 0x5B0A, 0x5B0A, 0x2E7A, 0x5B0B, 0x5B0B, 0x23FE, 0x5B0C, 0x5B0C, 0x1FA8,
+ 0x5B0D, 0x5B15, 0x2E7B, 0x5B16, 0x5B16, 0x17AE, 0x5B17, 0x5B17, 0x17AD,
+ 0x5B18, 0x5B18, 0x2E84, 0x5B19, 0x5B19, 0x2401, 0x5B1A, 0x5B20, 0x2E85,
+ 0x5B21, 0x5B21, 0x23FF, 0x5B22, 0x5B29, 0x2E8C, 0x5B2A, 0x5B2A, 0x2400,
+ 0x5B2B, 0x5B2F, 0x2E94, 0x5B30, 0x5B30, 0x2221, 0x5B31, 0x5B31, 0x2E99,
+ 0x5B32, 0x5B32, 0x17AF, 0x5B33, 0x5B33, 0x2E9A, 0x5B34, 0x5B34, 0x130C,
+ 0x5B35, 0x5B36, 0x2E9B, 0x5B37, 0x5B37, 0x17B0, 0x5B38, 0x5B38, 0x2122,
+ 0x5B39, 0x5B3F, 0x2E9D, 0x5B40, 0x5B40, 0x17B1, 0x5B41, 0x5B4B, 0x2EA4,
+ 0x5B4C, 0x5B4C, 0x23FB, 0x5B4D, 0x5B4F, 0x2EAF, 0x5B50, 0x5B50, 0x1230,
+ 0x5B51, 0x5B51, 0x17B7, 0x5B52, 0x5B52, 0x2EB2, 0x5B53, 0x5B53, 0x17B8,
+ 0x5B54, 0x5B54, 0x0964, 0x5B55, 0x5B55, 0x1113, 0x5B56, 0x5B56, 0x2EB3,
+ 0x5B57, 0x5B57, 0x1233, 0x5B58, 0x5B58, 0x0569, 0x5B59, 0x5B59, 0x0DE4,
+ 0x5B5A, 0x5B5A, 0x17B4, 0x5B5B, 0x5B5B, 0x1279, 0x5B5C, 0x5B5C, 0x122B,
+ 0x5B5D, 0x5B5D, 0x0F6D, 0x5B5E, 0x5B5E, 0x2EB4, 0x5B5F, 0x5B5F, 0x0AD4,
+ 0x5B60, 0x5B61, 0x2EB5, 0x5B62, 0x5B62, 0x17B9, 0x5B63, 0x5B63, 0x0831,
+ 0x5B64, 0x5B64, 0x071B, 0x5B65, 0x5B65, 0x17B5, 0x5B66, 0x5B66, 0x0FD0,
+ 0x5B67, 0x5B68, 0x2EB7, 0x5B69, 0x5B69, 0x0759, 0x5B6A, 0x5B6A, 0x0A76,
+ 0x5B6B, 0x5B6B, 0x215A, 0x5B6C, 0x5B6C, 0x1261, 0x5B6D, 0x5B6F, 0x2EB9,
+ 0x5B70, 0x5B70, 0x0D82, 0x5B71, 0x5B71, 0x176A, 0x5B72, 0x5B72, 0x2EBC,
+ 0x5B73, 0x5B73, 0x17B6, 0x5B74, 0x5B74, 0x2EBD, 0x5B75, 0x5B75, 0x0692,
+ 0x5B76, 0x5B77, 0x2EBE, 0x5B78, 0x5B78, 0x21E5, 0x5B79, 0x5B79, 0x2EC0,
+ 0x5B7A, 0x5B7A, 0x0CC1, 0x5B7B, 0x5B7C, 0x2EC1, 0x5B7D, 0x5B7D, 0x0B58,
+ 0x5B7E, 0x5B7E, 0x2EC3, 0x5B7F, 0x5B7F, 0x2057, 0x5B80, 0x5B80, 0x172E,
+ 0x5B81, 0x5B81, 0x0B61, 0x5B82, 0x5B82, 0x2EC4, 0x5B83, 0x5B83, 0x0DF1,
+ 0x5B84, 0x5B84, 0x172F, 0x5B85, 0x5B85, 0x114D, 0x5B86, 0x5B86, 0x2EC5,
+ 0x5B87, 0x5B87, 0x10D3, 0x5B88, 0x5B88, 0x0D6F, 0x5B89, 0x5B89, 0x03BD,
+ 0x5B8A, 0x5B8A, 0x2EC6, 0x5B8B, 0x5B8B, 0x0DC3, 0x5B8C, 0x5B8C, 0x0E9B,
+ 0x5B8D, 0x5B8E, 0x2EC7, 0x5B8F, 0x5B8F, 0x07A1, 0x5B90, 0x5B92, 0x2EC9,
+ 0x5B93, 0x5B93, 0x1731, 0x5B94, 0x5B94, 0x2ECC, 0x5B95, 0x5B95, 0x1730,
+ 0x5B96, 0x5B96, 0x2ECD, 0x5B97, 0x5B97, 0x1237, 0x5B98, 0x5B98, 0x0732,
+ 0x5B99, 0x5B99, 0x11E5, 0x5B9A, 0x5B9A, 0x05E7, 0x5B9B, 0x5B9B, 0x0EA1,
+ 0x5B9C, 0x5B9C, 0x1052, 0x5B9D, 0x5B9D, 0x040F, 0x5B9E, 0x5B9E, 0x0D4C,
+ 0x5B9F, 0x5B9F, 0x2ECE, 0x5BA0, 0x5BA0, 0x050D, 0x5BA1, 0x5BA1, 0x0D2C,
+ 0x5BA2, 0x5BA2, 0x095A, 0x5BA3, 0x5BA3, 0x0FC6, 0x5BA4, 0x5BA4, 0x0D69,
+ 0x5BA5, 0x5BA5, 0x1732, 0x5BA6, 0x5BA6, 0x07D7, 0x5BA7, 0x5BA9, 0x2ECF,
+ 0x5BAA, 0x5BAA, 0x0F49, 0x5BAB, 0x5BAB, 0x0705, 0x5BAC, 0x5BAF, 0x2ED2,
+ 0x5BB0, 0x5BB0, 0x111A, 0x5BB1, 0x5BB2, 0x2ED6, 0x5BB3, 0x5BB3, 0x075D,
+ 0x5BB4, 0x5BB4, 0x1010, 0x5BB5, 0x5BB5, 0x0F69, 0x5BB6, 0x5BB6, 0x0845,
+ 0x5BB7, 0x5BB7, 0x2ED8, 0x5BB8, 0x5BB8, 0x1733, 0x5BB9, 0x5BB9, 0x0CB8,
+ 0x5BBA, 0x5BBC, 0x2ED9, 0x5BBD, 0x5BBD, 0x097A, 0x5BBE, 0x5BBE, 0x045F,
+ 0x5BBF, 0x5BBF, 0x0DD3, 0x5BC0, 0x5BC1, 0x2EDC, 0x5BC2, 0x5BC2, 0x0838,
+ 0x5BC3, 0x5BC3, 0x2EDE, 0x5BC4, 0x5BC4, 0x0837, 0x5BC5, 0x5BC5, 0x1081,
+ 0x5BC6, 0x5BC6, 0x0AE1, 0x5BC7, 0x5BC7, 0x0969, 0x5BC8, 0x5BCB, 0x2EDF,
+ 0x5BCC, 0x5BCC, 0x06B6, 0x5BCD, 0x5BCF, 0x2EE3, 0x5BD0, 0x5BD0, 0x0AC7,
+ 0x5BD1, 0x5BD1, 0x2EE6, 0x5BD2, 0x5BD2, 0x0765, 0x5BD3, 0x5BD3, 0x10E5,
+ 0x5BD4, 0x5BDC, 0x2EE7, 0x5BDD, 0x5BDD, 0x0C5B, 0x5BDE, 0x5BDE, 0x0B12,
+ 0x5BDF, 0x5BDF, 0x04B3, 0x5BE0, 0x5BE0, 0x2EF0, 0x5BE1, 0x5BE1, 0x072A,
+ 0x5BE2, 0x5BE2, 0x20E5, 0x5BE3, 0x5BE3, 0x2EF1, 0x5BE4, 0x5BE4, 0x1737,
+ 0x5BE5, 0x5BE5, 0x0A11, 0x5BE6, 0x5BE6, 0x212F, 0x5BE7, 0x5BE7, 0x20A3,
+ 0x5BE8, 0x5BE8, 0x1150, 0x5BE9, 0x5BE9, 0x2121, 0x5BEA, 0x5BEA, 0x2EF2,
+ 0x5BEB, 0x5BEB, 0x21D4, 0x5BEC, 0x5BEC, 0x1FE5, 0x5BED, 0x5BED, 0x2EF3,
+ 0x5BEE, 0x5BEE, 0x1738, 0x5BEF, 0x5BEF, 0x2EF4, 0x5BF0, 0x5BF0, 0x173A,
+ 0x5BF1, 0x5BF4, 0x2EF5, 0x5BF5, 0x5BF5, 0x1E8A, 0x5BF6, 0x5BF6, 0x1E37,
+ 0x5BF7, 0x5BF7, 0x2EF9, 0x5BF8, 0x5BF8, 0x056A, 0x5BF9, 0x5BF9, 0x0613,
+ 0x5BFA, 0x5BFA, 0x0DB7, 0x5BFB, 0x5BFB, 0x0FD9, 0x5BFC, 0x5BFC, 0x059D,
+ 0x5BFD, 0x5BFE, 0x2EFA, 0x5BFF, 0x5BFF, 0x0D70, 0x5C00, 0x5C00, 0x2EFC,
+ 0x5C01, 0x5C01, 0x067F, 0x5C02, 0x5C03, 0x2EFD, 0x5C04, 0x5C04, 0x0D1D,
+ 0x5C05, 0x5C05, 0x2EFF, 0x5C06, 0x5C06, 0x087C, 0x5C07, 0x5C07, 0x1F9E,
+ 0x5C08, 0x5C08, 0x22A6, 0x5C09, 0x5C09, 0x0ECD, 0x5C0A, 0x5C0A, 0x124D,
+ 0x5C0B, 0x5C0B, 0x21E8, 0x5C0C, 0x5C0C, 0x2F00, 0x5C0D, 0x5C0D, 0x1EDA,
+ 0x5C0E, 0x5C0E, 0x1EB9, 0x5C0F, 0x5C0F, 0x0F6C, 0x5C10, 0x5C10, 0x2F01,
+ 0x5C11, 0x5C11, 0x0D12, 0x5C12, 0x5C13, 0x2F02, 0x5C14, 0x5C14, 0x063A,
+ 0x5C15, 0x5C15, 0x17B2, 0x5C16, 0x5C16, 0x0855, 0x5C17, 0x5C17, 0x2F04,
+ 0x5C18, 0x5C18, 0x04E3, 0x5C19, 0x5C19, 0x2F05, 0x5C1A, 0x5C1A, 0x0D09,
+ 0x5C1B, 0x5C1B, 0x2F06, 0x5C1C, 0x5C1C, 0x17B3, 0x5C1D, 0x5C1D, 0x04C7,
+ 0x5C1E, 0x5C21, 0x2F07, 0x5C22, 0x5C22, 0x14B6, 0x5C23, 0x5C23, 0x2F0B,
+ 0x5C24, 0x5C24, 0x10AD, 0x5C25, 0x5C25, 0x14B7, 0x5C26, 0x5C26, 0x2F0C,
+ 0x5C27, 0x5C27, 0x1029, 0x5C28, 0x5C2B, 0x2F0D, 0x5C2C, 0x5C2C, 0x14B8,
+ 0x5C2D, 0x5C30, 0x2F11, 0x5C31, 0x5C31, 0x08FC, 0x5C32, 0x5C33, 0x2F15,
+ 0x5C34, 0x5C34, 0x14B9, 0x5C35, 0x5C36, 0x2F17, 0x5C37, 0x5C37, 0x235C,
+ 0x5C38, 0x5C38, 0x0D43, 0x5C39, 0x5C39, 0x1083, 0x5C3A, 0x5C3A, 0x0504,
+ 0x5C3B, 0x5C3B, 0x1766, 0x5C3C, 0x5C3C, 0x0B44, 0x5C3D, 0x5C3D, 0x08D0,
+ 0x5C3E, 0x5C3E, 0x0EC1, 0x5C3F, 0x5C3F, 0x0B55, 0x5C40, 0x5C40, 0x0905,
+ 0x5C41, 0x5C41, 0x0BC7, 0x5C42, 0x5C42, 0x04AA, 0x5C43, 0x5C44, 0x2F19,
+ 0x5C45, 0x5C45, 0x0902, 0x5C46, 0x5C47, 0x2F1B, 0x5C48, 0x5C48, 0x0C79,
+ 0x5C49, 0x5C49, 0x0E3E, 0x5C4A, 0x5C4A, 0x08BD, 0x5C4B, 0x5C4B, 0x0EEC,
+ 0x5C4C, 0x5C4D, 0x2F1D, 0x5C4E, 0x5C4E, 0x0D51, 0x5C4F, 0x5C4F, 0x0BE0,
+ 0x5C50, 0x5C50, 0x1768, 0x5C51, 0x5C51, 0x0F87, 0x5C52, 0x5C54, 0x2F1F,
+ 0x5C55, 0x5C55, 0x115A, 0x5C56, 0x5C58, 0x2F22, 0x5C59, 0x5C59, 0x1769,
+ 0x5C5A, 0x5C5D, 0x2F25, 0x5C5E, 0x5C5E, 0x0D8B, 0x5C5F, 0x5C5F, 0x2F29,
+ 0x5C60, 0x5C60, 0x0E71, 0x5C61, 0x5C61, 0x0A6C, 0x5C62, 0x5C62, 0x2050,
+ 0x5C63, 0x5C63, 0x176B, 0x5C64, 0x5C64, 0x1E67, 0x5C65, 0x5C65, 0x0A6B,
+ 0x5C66, 0x5C66, 0x176C, 0x5C67, 0x5C67, 0x2F2A, 0x5C68, 0x5C68, 0x23F4,
+ 0x5C69, 0x5C6B, 0x2F2B, 0x5C6C, 0x5C6C, 0x213E, 0x5C6D, 0x5C6D, 0x2F2E,
+ 0x5C6E, 0x5C6E, 0x1774, 0x5C6F, 0x5C6F, 0x0E7E, 0x5C70, 0x5C70, 0x2F2F,
+ 0x5C71, 0x5C71, 0x0CF6, 0x5C72, 0x5C78, 0x2F30, 0x5C79, 0x5C79, 0x1060,
+ 0x5C7A, 0x5C7A, 0x15AC, 0x5C7B, 0x5C7E, 0x2F37, 0x5C7F, 0x5C7F, 0x10D1,
+ 0x5C80, 0x5C80, 0x2F3B, 0x5C81, 0x5C81, 0x0DDF, 0x5C82, 0x5C82, 0x0C10,
+ 0x5C83, 0x5C87, 0x2F3C, 0x5C88, 0x5C88, 0x15B0, 0x5C89, 0x5C8B, 0x2F41,
+ 0x5C8C, 0x5C8C, 0x15AB, 0x5C8D, 0x5C8D, 0x15AD, 0x5C8E, 0x5C8F, 0x2F44,
+ 0x5C90, 0x5C90, 0x15AE, 0x5C91, 0x5C91, 0x15B3, 0x5C92, 0x5C93, 0x2F46,
+ 0x5C94, 0x5C94, 0x04B4, 0x5C95, 0x5C95, 0x2F48, 0x5C96, 0x5C96, 0x15AF,
+ 0x5C97, 0x5C97, 0x06D5, 0x5C98, 0x5C99, 0x15B1, 0x5C9A, 0x5C9A, 0x15B4,
+ 0x5C9B, 0x5C9B, 0x059B, 0x5C9C, 0x5C9C, 0x15B5, 0x5C9D, 0x5CA0, 0x2F49,
+ 0x5CA1, 0x5CA1, 0x1F16, 0x5CA2, 0x5CA2, 0x15B7, 0x5CA3, 0x5CA3, 0x15BC,
+ 0x5CA4, 0x5CA8, 0x2F4D, 0x5CA9, 0x5CA9, 0x0FFB, 0x5CAA, 0x5CAA, 0x2F52,
+ 0x5CAB, 0x5CAB, 0x15BA, 0x5CAC, 0x5CAC, 0x15B9, 0x5CAD, 0x5CAD, 0x0A34,
+ 0x5CAE, 0x5CB0, 0x2F53, 0x5CB1, 0x5CB1, 0x15BB, 0x5CB2, 0x5CB2, 0x2F56,
+ 0x5CB3, 0x5CB3, 0x1103, 0x5CB4, 0x5CB4, 0x2F57, 0x5CB5, 0x5CB5, 0x15B6,
+ 0x5CB6, 0x5CB6, 0x2F58, 0x5CB7, 0x5CB7, 0x15BE, 0x5CB8, 0x5CB8, 0x03C1,
+ 0x5CB9, 0x5CBC, 0x2F59, 0x5CBD, 0x5CBD, 0x15B8, 0x5CBE, 0x5CBE, 0x2F5D,
+ 0x5CBF, 0x5CBF, 0x0986, 0x5CC0, 0x5CC0, 0x2F5E, 0x5CC1, 0x5CC1, 0x15BD,
+ 0x5CC2, 0x5CC3, 0x2F5F, 0x5CC4, 0x5CC4, 0x15BF, 0x5CC5, 0x5CCA, 0x2F61,
+ 0x5CCB, 0x5CCB, 0x15C2, 0x5CCC, 0x5CD1, 0x2F67, 0x5CD2, 0x5CD2, 0x15C0,
+ 0x5CD3, 0x5CD8, 0x2F6D, 0x5CD9, 0x5CD9, 0x11C4, 0x5CDA, 0x5CE0, 0x2F73,
+ 0x5CE1, 0x5CE1, 0x0F2C, 0x5CE2, 0x5CE3, 0x2F7A, 0x5CE4, 0x5CE4, 0x15C1,
+ 0x5CE5, 0x5CE5, 0x15C3, 0x5CE6, 0x5CE6, 0x0A74, 0x5CE7, 0x5CE7, 0x2F7C,
+ 0x5CE8, 0x5CE8, 0x062A, 0x5CE9, 0x5CE9, 0x2F7D, 0x5CEA, 0x5CEA, 0x10DD,
+ 0x5CEB, 0x5CEC, 0x2F7E, 0x5CED, 0x5CED, 0x0C4A, 0x5CEE, 0x5CEF, 0x2F80,
+ 0x5CF0, 0x5CF0, 0x0682, 0x5CF1, 0x5CF3, 0x2F82, 0x5CF4, 0x5CF4, 0x2389,
+ 0x5CF5, 0x5CF5, 0x2F85, 0x5CF6, 0x5CF6, 0x1EB7, 0x5CF7, 0x5CFA, 0x2F86,
+ 0x5CFB, 0x5CFB, 0x092D, 0x5CFC, 0x5CFC, 0x2F8A, 0x5CFD, 0x5CFD, 0x21B4,
+ 0x5CFE, 0x5CFF, 0x2F8B, 0x5D00, 0x5D01, 0x2F8D, 0x5D02, 0x5D03, 0x15C4,
+ 0x5D04, 0x5D05, 0x2F8F, 0x5D06, 0x5D06, 0x15CB, 0x5D07, 0x5D07, 0x050C,
+ 0x5D08, 0x5D0C, 0x2F91, 0x5D0D, 0x5D0D, 0x238F, 0x5D0E, 0x5D0E, 0x0C08,
+ 0x5D0F, 0x5D13, 0x2F96, 0x5D14, 0x5D14, 0x0561, 0x5D15, 0x5D15, 0x2F9B,
+ 0x5D16, 0x5D16, 0x0FEB, 0x5D17, 0x5D17, 0x1F1A, 0x5D18, 0x5D1A, 0x2F9C,
+ 0x5D1B, 0x5D1B, 0x15CC, 0x5D1C, 0x5D1D, 0x2F9F, 0x5D1E, 0x5D1E, 0x15CA,
+ 0x5D1F, 0x5D23, 0x2FA1, 0x5D24, 0x5D24, 0x15C9, 0x5D25, 0x5D25, 0x2FA6,
+ 0x5D26, 0x5D26, 0x15C7, 0x5D27, 0x5D27, 0x15C6, 0x5D28, 0x5D28, 0x2FA7,
+ 0x5D29, 0x5D29, 0x0429, 0x5D2A, 0x5D2B, 0x2FA8, 0x5D2C, 0x5D2C, 0x238B,
+ 0x5D2D, 0x5D2D, 0x1159, 0x5D2E, 0x5D2E, 0x15C8, 0x5D2F, 0x5D33, 0x2FAA,
+ 0x5D34, 0x5D34, 0x15CF, 0x5D35, 0x5D3C, 0x2FAF, 0x5D3D, 0x5D3D, 0x15D0,
+ 0x5D3E, 0x5D3E, 0x15CE, 0x5D3F, 0x5D46, 0x2FB7, 0x5D47, 0x5D47, 0x1B22,
+ 0x5D48, 0x5D49, 0x2FBF, 0x5D4A, 0x5D4A, 0x15D7, 0x5D4B, 0x5D4B, 0x15D6,
+ 0x5D4C, 0x5D4C, 0x0C33, 0x5D4D, 0x5D4F, 0x2FC1, 0x5D50, 0x5D50, 0x238A,
+ 0x5D51, 0x5D57, 0x2FC4, 0x5D58, 0x5D58, 0x15CD, 0x5D59, 0x5D5A, 0x2FCB,
+ 0x5D5B, 0x5D5B, 0x15D2, 0x5D5C, 0x5D5C, 0x2FCD, 0x5D5D, 0x5D5D, 0x15D4,
+ 0x5D5E, 0x5D68, 0x2FCE, 0x5D69, 0x5D69, 0x15D8, 0x5D6A, 0x5D6A, 0x2FD9,
+ 0x5D6B, 0x5D6B, 0x15D5, 0x5D6C, 0x5D6C, 0x15D1, 0x5D6D, 0x5D6E, 0x2FDA,
+ 0x5D6F, 0x5D6F, 0x15D3, 0x5D70, 0x5D73, 0x2FDC, 0x5D74, 0x5D74, 0x15D9,
+ 0x5D75, 0x5D80, 0x2FE0, 0x5D81, 0x5D81, 0x2391, 0x5D82, 0x5D82, 0x15DA,
+ 0x5D83, 0x5D83, 0x2FEC, 0x5D84, 0x5D84, 0x2271, 0x5D85, 0x5D86, 0x2FED,
+ 0x5D87, 0x5D87, 0x2388, 0x5D88, 0x5D96, 0x2FEF, 0x5D97, 0x5D97, 0x238E,
+ 0x5D98, 0x5D98, 0x2FFE, 0x5D99, 0x5D99, 0x15DB, 0x5D9A, 0x5D9C, 0x2FFF,
+ 0x5D9D, 0x5D9D, 0x15DC, 0x5D9E, 0x5D9F, 0x3002, 0x5DA0, 0x5DA0, 0x238D,
+ 0x5DA1, 0x5DA6, 0x3004, 0x5DA7, 0x5DA7, 0x238C, 0x5DA8, 0x5DB6, 0x300A,
+ 0x5DB7, 0x5DB7, 0x15DE, 0x5DB8, 0x5DB8, 0x2390, 0x5DB9, 0x5DB9, 0x3019,
+ 0x5DBA, 0x5DBA, 0x2033, 0x5DBB, 0x5DBB, 0x301A, 0x5DBC, 0x5DBC, 0x223C,
+ 0x5DBD, 0x5DC4, 0x301B, 0x5DC5, 0x5DC5, 0x15DF, 0x5DC6, 0x5DCA, 0x3023,
+ 0x5DCB, 0x5DCB, 0x1FE9, 0x5DCC, 0x5DCC, 0x3028, 0x5DCD, 0x5DCD, 0x0EB0,
+ 0x5DCE, 0x5DD1, 0x3029, 0x5DD2, 0x5DD2, 0x2055, 0x5DD3, 0x5DD3, 0x302D,
+ 0x5DD4, 0x5DD4, 0x2392, 0x5DD5, 0x5DDA, 0x302E, 0x5DDB, 0x5DDB, 0x1815,
+ 0x5DDC, 0x5DDC, 0x3034, 0x5DDD, 0x5DDD, 0x052B, 0x5DDE, 0x5DDE, 0x11DC,
+ 0x5DDF, 0x5DE0, 0x3035, 0x5DE1, 0x5DE1, 0x0FDB, 0x5DE2, 0x5DE2, 0x04D7,
+ 0x5DE3, 0x5DE4, 0x3037, 0x5DE5, 0x5DE5, 0x06FD, 0x5DE6, 0x5DE6, 0x1250,
+ 0x5DE7, 0x5DE7, 0x0C46, 0x5DE8, 0x5DE8, 0x090D, 0x5DE9, 0x5DE9, 0x0707,
+ 0x5DEA, 0x5DEA, 0x3039, 0x5DEB, 0x5DEB, 0x0EE6, 0x5DEC, 0x5DED, 0x303A,
+ 0x5DEE, 0x5DEE, 0x04B5, 0x5DEF, 0x5DEF, 0x139F, 0x5DF0, 0x5DF0, 0x2324,
+ 0x5DF1, 0x5DF1, 0x082D, 0x5DF2, 0x5DF2, 0x1058, 0x5DF3, 0x5DF3, 0x0DBD,
+ 0x5DF4, 0x5DF4, 0x03D8, 0x5DF5, 0x5DF6, 0x303C, 0x5DF7, 0x5DF7, 0x0F5C,
+ 0x5DF8, 0x5DFC, 0x303E, 0x5DFD, 0x5DFD, 0x12F7, 0x5DFE, 0x5DFE, 0x08BE,
+ 0x5DFF, 0x5DFF, 0x3043, 0x5E00, 0x5E00, 0x3044, 0x5E01, 0x5E01, 0x043B,
+ 0x5E02, 0x5E02, 0x0D67, 0x5E03, 0x5E03, 0x0483, 0x5E04, 0x5E04, 0x3045,
+ 0x5E05, 0x5E05, 0x0D9C, 0x5E06, 0x5E06, 0x0648, 0x5E07, 0x5E07, 0x3046,
+ 0x5E08, 0x5E08, 0x0D3D, 0x5E09, 0x5E0B, 0x3047, 0x5E0C, 0x5E0C, 0x0F10,
+ 0x5E0D, 0x5E0E, 0x304A, 0x5E0F, 0x5E0F, 0x159E, 0x5E10, 0x5E10, 0x116B,
+ 0x5E11, 0x5E11, 0x15A1, 0x5E12, 0x5E13, 0x304C, 0x5E14, 0x5E14, 0x15A0,
+ 0x5E15, 0x5E15, 0x0B82, 0x5E16, 0x5E16, 0x0E4E, 0x5E17, 0x5E17, 0x304E,
+ 0x5E18, 0x5E18, 0x09FA, 0x5E19, 0x5E19, 0x159F, 0x5E1A, 0x5E1A, 0x11E2,
+ 0x5E1B, 0x5E1B, 0x0476, 0x5E1C, 0x5E1C, 0x11C3, 0x5E1D, 0x5E1D, 0x05BC,
+ 0x5E1E, 0x5E24, 0x304F, 0x5E25, 0x5E25, 0x2143, 0x5E26, 0x5E26, 0x057B,
+ 0x5E27, 0x5E27, 0x11A0, 0x5E28, 0x5E2A, 0x3056, 0x5E2B, 0x5E2B, 0x2129,
+ 0x5E2C, 0x5E2C, 0x3059, 0x5E2D, 0x5E2D, 0x0F1C, 0x5E2E, 0x5E2E, 0x03FA,
+ 0x5E2F, 0x5E30, 0x305A, 0x5E31, 0x5E31, 0x15A2, 0x5E32, 0x5E32, 0x305C,
+ 0x5E33, 0x5E33, 0x2277, 0x5E34, 0x5E35, 0x305D, 0x5E36, 0x5E36, 0x1EA7,
+ 0x5E37, 0x5E37, 0x15A5, 0x5E38, 0x5E38, 0x04C8, 0x5E39, 0x5E3A, 0x305F,
+ 0x5E3B, 0x5E3C, 0x15A3, 0x5E3D, 0x5E3D, 0x0AB6, 0x5E3E, 0x5E3F, 0x3061,
+ 0x5E40, 0x5E40, 0x2285, 0x5E41, 0x5E41, 0x3063, 0x5E42, 0x5E42, 0x0AE2,
+ 0x5E43, 0x5E43, 0x2384, 0x5E44, 0x5E44, 0x15A6, 0x5E45, 0x5E45, 0x0696,
+ 0x5E46, 0x5E4B, 0x3064, 0x5E4C, 0x5E4C, 0x07E4, 0x5E4D, 0x5E53, 0x306A,
+ 0x5E54, 0x5E54, 0x15A7, 0x5E55, 0x5E55, 0x0B1E, 0x5E56, 0x5E56, 0x3071,
+ 0x5E57, 0x5E57, 0x2387, 0x5E58, 0x5E58, 0x2386, 0x5E59, 0x5E5A, 0x3072,
+ 0x5E5B, 0x5E5B, 0x15A8, 0x5E5C, 0x5E5D, 0x3074, 0x5E5E, 0x5E5E, 0x15A9,
+ 0x5E5F, 0x5E5F, 0x2290, 0x5E60, 0x5E60, 0x3076, 0x5E61, 0x5E61, 0x15AA,
+ 0x5E62, 0x5E62, 0x0534, 0x5E63, 0x5E63, 0x1E44, 0x5E64, 0x5E6A, 0x3077,
+ 0x5E6B, 0x5E6B, 0x1E32, 0x5E6C, 0x5E6C, 0x2385, 0x5E6D, 0x5E71, 0x307E,
+ 0x5E72, 0x5E72, 0x06C4, 0x5E73, 0x5E73, 0x0BDC, 0x5E74, 0x5E74, 0x0B4D,
+ 0x5E75, 0x5E75, 0x3083, 0x5E76, 0x5E76, 0x0469, 0x5E77, 0x5E77, 0x3084,
+ 0x5E78, 0x5E78, 0x0F9D, 0x5E79, 0x5E79, 0x1F13, 0x5E7A, 0x5E7A, 0x1813,
+ 0x5E7B, 0x5E7B, 0x07D8, 0x5E7C, 0x5E7C, 0x10BC, 0x5E7D, 0x5E7D, 0x10A9,
+ 0x5E7E, 0x5E7E, 0x1F73, 0x5E7F, 0x5E7F, 0x073C, 0x5E80, 0x5E80, 0x1631,
+ 0x5E81, 0x5E83, 0x3085, 0x5E84, 0x5E84, 0x120C, 0x5E85, 0x5E85, 0x3088,
+ 0x5E86, 0x5E86, 0x0C69, 0x5E87, 0x5E87, 0x043C, 0x5E88, 0x5E89, 0x3089,
+ 0x5E8A, 0x5E8A, 0x0535, 0x5E8B, 0x5E8B, 0x1633, 0x5E8C, 0x5E8E, 0x308B,
+ 0x5E8F, 0x5E8F, 0x0FBD, 0x5E90, 0x5E90, 0x0A55, 0x5E91, 0x5E91, 0x1632,
+ 0x5E92, 0x5E92, 0x308E, 0x5E93, 0x5E93, 0x096F, 0x5E94, 0x5E94, 0x108B,
+ 0x5E95, 0x5E95, 0x05B8, 0x5E96, 0x5E96, 0x1634, 0x5E97, 0x5E97, 0x05CB,
+ 0x5E98, 0x5E98, 0x308F, 0x5E99, 0x5E99, 0x0AF2, 0x5E9A, 0x5E9A, 0x06F8,
+ 0x5E9B, 0x5E9B, 0x3090, 0x5E9C, 0x5E9C, 0x06A9, 0x5E9D, 0x5E9D, 0x3091,
+ 0x5E9E, 0x5E9E, 0x0B94, 0x5E9F, 0x5E9F, 0x066C, 0x5EA0, 0x5EA0, 0x1636,
+ 0x5EA1, 0x5EA4, 0x3092, 0x5EA5, 0x5EA5, 0x1635, 0x5EA6, 0x5EA6, 0x0607,
+ 0x5EA7, 0x5EA7, 0x1256, 0x5EA8, 0x5EAA, 0x3096, 0x5EAB, 0x5EAB, 0x1FE0,
+ 0x5EAC, 0x5EAC, 0x3099, 0x5EAD, 0x5EAD, 0x0E56, 0x5EAE, 0x5EB2, 0x309A,
+ 0x5EB3, 0x5EB3, 0x163A, 0x5EB4, 0x5EB4, 0x309F, 0x5EB5, 0x5EB5, 0x1638,
+ 0x5EB6, 0x5EB6, 0x0D93, 0x5EB7, 0x5EB7, 0x0942, 0x5EB8, 0x5EB8, 0x109E,
+ 0x5EB9, 0x5EB9, 0x1637, 0x5EBA, 0x5EBD, 0x30A0, 0x5EBE, 0x5EBE, 0x1639,
+ 0x5EBF, 0x5EC8, 0x30A4, 0x5EC9, 0x5EC9, 0x09F7, 0x5ECA, 0x5ECA, 0x09B3,
+ 0x5ECB, 0x5ED0, 0x30AE, 0x5ED1, 0x5ED1, 0x163D, 0x5ED2, 0x5ED2, 0x163C,
+ 0x5ED3, 0x5ED3, 0x0995, 0x5ED4, 0x5ED5, 0x30B4, 0x5ED6, 0x5ED6, 0x0A17,
+ 0x5ED7, 0x5EDA, 0x30B6, 0x5EDB, 0x5EDB, 0x163E, 0x5EDC, 0x5EDE, 0x30BA,
+ 0x5EDF, 0x5EDF, 0x2087, 0x5EE0, 0x5EE0, 0x1E78, 0x5EE1, 0x5EE1, 0x23AE,
+ 0x5EE2, 0x5EE2, 0x1EF6, 0x5EE3, 0x5EE3, 0x1F31, 0x5EE4, 0x5EE7, 0x30BD,
+ 0x5EE8, 0x5EE8, 0x163F, 0x5EE9, 0x5EE9, 0x30C1, 0x5EEA, 0x5EEA, 0x1640,
+ 0x5EEB, 0x5EEB, 0x30C2, 0x5EEC, 0x5EEC, 0x2045, 0x5EED, 0x5EF2, 0x30C3,
+ 0x5EF3, 0x5EF3, 0x2178, 0x5EF4, 0x5EF4, 0x1398, 0x5EF5, 0x5EF5, 0x30C9,
+ 0x5EF6, 0x5EF6, 0x0FFC, 0x5EF7, 0x5EF7, 0x0E53, 0x5EF8, 0x5EF9, 0x30CA,
+ 0x5EFA, 0x5EFA, 0x0879, 0x5EFB, 0x5EFD, 0x30CC, 0x5EFE, 0x5EFE, 0x14AD,
+ 0x5EFF, 0x5EFF, 0x125B, 0x5F00, 0x5F00, 0x0937, 0x5F01, 0x5F01, 0x139D,
+ 0x5F02, 0x5F02, 0x1073, 0x5F03, 0x5F03, 0x0C19, 0x5F04, 0x5F04, 0x0B6B,
+ 0x5F05, 0x5F07, 0x30CF, 0x5F08, 0x5F08, 0x14AE, 0x5F09, 0x5F09, 0x30D2,
+ 0x5F0A, 0x5F0A, 0x0440, 0x5F0B, 0x5F0B, 0x14F6, 0x5F0C, 0x5F0E, 0x30D3,
+ 0x5F0F, 0x5F0F, 0x0D54, 0x5F10, 0x5F10, 0x30D6, 0x5F11, 0x5F11, 0x14F9,
+ 0x5F12, 0x5F12, 0x30D7, 0x5F13, 0x5F13, 0x0706, 0x5F14, 0x5F14, 0x30D8,
+ 0x5F15, 0x5F15, 0x1084, 0x5F16, 0x5F16, 0x30D9, 0x5F17, 0x5F17, 0x06A0,
+ 0x5F18, 0x5F18, 0x07A2, 0x5F19, 0x5F1A, 0x30DA, 0x5F1B, 0x5F1B, 0x04FF,
+ 0x5F1C, 0x5F1E, 0x30DC, 0x5F1F, 0x5F1F, 0x05BD, 0x5F20, 0x5F20, 0x1166,
+ 0x5F21, 0x5F24, 0x30DF, 0x5F25, 0x5F25, 0x0ADB, 0x5F26, 0x5F26, 0x0F3F,
+ 0x5F27, 0x5F27, 0x07B6, 0x5F28, 0x5F28, 0x30E3, 0x5F29, 0x5F29, 0x176F,
+ 0x5F2A, 0x5F2A, 0x176E, 0x5F2B, 0x5F2C, 0x30E4, 0x5F2D, 0x5F2D, 0x1770,
+ 0x5F2E, 0x5F2E, 0x30E6, 0x5F2F, 0x5F2F, 0x0E95, 0x5F30, 0x5F30, 0x30E7,
+ 0x5F31, 0x5F31, 0x0CD0, 0x5F32, 0x5F32, 0x30E8, 0x5F33, 0x5F33, 0x23F5,
+ 0x5F34, 0x5F34, 0x30E9, 0x5F35, 0x5F35, 0x2275, 0x5F36, 0x5F38, 0x30EA,
+ 0x5F39, 0x5F39, 0x0590, 0x5F3A, 0x5F3A, 0x0C3C, 0x5F3B, 0x5F3B, 0x30ED,
+ 0x5F3C, 0x5F3C, 0x1772, 0x5F3D, 0x5F3F, 0x30EE, 0x5F40, 0x5F40, 0x19BE,
+ 0x5F41, 0x5F45, 0x30F1, 0x5F46, 0x5F46, 0x266E, 0x5F47, 0x5F47, 0x30F6,
+ 0x5F48, 0x5F48, 0x1EB0, 0x5F49, 0x5F4B, 0x30F7, 0x5F4C, 0x5F4C, 0x2083,
+ 0x5F4D, 0x5F4D, 0x30FA, 0x5F4E, 0x5F4E, 0x2188, 0x5F4F, 0x5F4F, 0x30FB,
+ 0x5F50, 0x5F50, 0x1762, 0x5F51, 0x5F51, 0x30FC, 0x5F52, 0x5F52, 0x0742,
+ 0x5F53, 0x5F53, 0x0592, 0x5F54, 0x5F54, 0x30FD, 0x5F55, 0x5F55, 0x0A63,
+ 0x5F56, 0x5F56, 0x1764, 0x5F57, 0x5F57, 0x1763, 0x5F58, 0x5F58, 0x1765,
+ 0x5F59, 0x5F59, 0x267C, 0x5F5A, 0x5F5C, 0x30FE, 0x5F5D, 0x5F5D, 0x1054,
+ 0x5F5E, 0x5F60, 0x3101, 0x5F61, 0x5F61, 0x15EE, 0x5F62, 0x5F62, 0x0F99,
+ 0x5F63, 0x5F63, 0x3104, 0x5F64, 0x5F64, 0x0E5F, 0x5F65, 0x5F65, 0x3105,
+ 0x5F66, 0x5F66, 0x100E, 0x5F67, 0x5F68, 0x3106, 0x5F69, 0x5F69, 0x0491,
+ 0x5F6A, 0x5F6A, 0x0454, 0x5F6B, 0x5F6B, 0x3108, 0x5F6C, 0x5F6C, 0x045B,
+ 0x5F6D, 0x5F6D, 0x0BAE, 0x5F6E, 0x5F6F, 0x3109, 0x5F70, 0x5F70, 0x1164,
+ 0x5F71, 0x5F71, 0x1095, 0x5F72, 0x5F72, 0x310B, 0x5F73, 0x5F73, 0x15E0,
+ 0x5F74, 0x5F76, 0x310C, 0x5F77, 0x5F77, 0x15E1, 0x5F78, 0x5F78, 0x310F,
+ 0x5F79, 0x5F79, 0x1062, 0x5F7A, 0x5F7A, 0x3110, 0x5F7B, 0x5F7B, 0x04DE,
+ 0x5F7C, 0x5F7C, 0x0434, 0x5F7D, 0x5F7F, 0x3111, 0x5F80, 0x5F80, 0x0EAA,
+ 0x5F81, 0x5F81, 0x1198, 0x5F82, 0x5F82, 0x15E2, 0x5F83, 0x5F83, 0x3114,
+ 0x5F84, 0x5F84, 0x08E5, 0x5F85, 0x5F85, 0x0580, 0x5F86, 0x5F86, 0x3115,
+ 0x5F87, 0x5F87, 0x15E3, 0x5F88, 0x5F88, 0x0793, 0x5F89, 0x5F89, 0x15E4,
+ 0x5F8A, 0x5F8A, 0x07C7, 0x5F8B, 0x5F8B, 0x0A70, 0x5F8C, 0x5F8C, 0x15E5,
+ 0x5F8D, 0x5F8F, 0x3116, 0x5F90, 0x5F90, 0x0FB7, 0x5F91, 0x5F91, 0x1FC5,
+ 0x5F92, 0x5F92, 0x0E6E, 0x5F93, 0x5F94, 0x3119, 0x5F95, 0x5F95, 0x15E6,
+ 0x5F96, 0x5F96, 0x311B, 0x5F97, 0x5F97, 0x05A4, 0x5F98, 0x5F98, 0x0B88,
+ 0x5F99, 0x5F99, 0x15E7, 0x5F9A, 0x5F9B, 0x311C, 0x5F9C, 0x5F9C, 0x15E8,
+ 0x5F9D, 0x5F9D, 0x311E, 0x5F9E, 0x5F9E, 0x1EA1, 0x5F9F, 0x5F9F, 0x311F,
+ 0x5FA0, 0x5FA0, 0x2393, 0x5FA1, 0x5FA1, 0x10DE, 0x5FA2, 0x5FA7, 0x3120,
+ 0x5FA8, 0x5FA8, 0x15E9, 0x5FA9, 0x5FA9, 0x1F0B, 0x5FAA, 0x5FAA, 0x0FD6,
+ 0x5FAB, 0x5FAC, 0x3126, 0x5FAD, 0x5FAD, 0x15EA, 0x5FAE, 0x5FAE, 0x0EB1,
+ 0x5FAF, 0x5FB4, 0x3128, 0x5FB5, 0x5FB5, 0x15EB, 0x5FB6, 0x5FB6, 0x312E,
+ 0x5FB7, 0x5FB7, 0x05A3, 0x5FB8, 0x5FB8, 0x312F, 0x5FB9, 0x5FB9, 0x1E7C,
+ 0x5FBA, 0x5FBB, 0x3130, 0x5FBC, 0x5FBC, 0x15EC, 0x5FBD, 0x5FBD, 0x07EA,
+ 0x5FBE, 0x5FC2, 0x3132, 0x5FC3, 0x5FC3, 0x0F8F, 0x5FC4, 0x5FC4, 0x1642,
+ 0x5FC5, 0x5FC5, 0x0441, 0x5FC6, 0x5FC6, 0x106B, 0x5FC7, 0x5FC8, 0x3137,
+ 0x5FC9, 0x5FC9, 0x1643, 0x5FCA, 0x5FCB, 0x3139, 0x5FCC, 0x5FCC, 0x083C,
+ 0x5FCD, 0x5FCD, 0x0CA7, 0x5FCE, 0x5FCE, 0x313B, 0x5FCF, 0x5FCF, 0x1645,
+ 0x5FD0, 0x5FD0, 0x1A0C, 0x5FD1, 0x5FD1, 0x1A0B, 0x5FD2, 0x5FD2, 0x14F7,
+ 0x5FD3, 0x5FD5, 0x313C, 0x5FD6, 0x5FD6, 0x1644, 0x5FD7, 0x5FD7, 0x11BD,
+ 0x5FD8, 0x5FD8, 0x0EAD, 0x5FD9, 0x5FD9, 0x0AAB, 0x5FDA, 0x5FDC, 0x313F,
+ 0x5FDD, 0x5FDD, 0x1683, 0x5FDE, 0x5FDF, 0x3142, 0x5FE0, 0x5FE0, 0x11D1,
+ 0x5FE1, 0x5FE1, 0x1649, 0x5FE2, 0x5FE3, 0x3144, 0x5FE4, 0x5FE4, 0x164A,
+ 0x5FE5, 0x5FE6, 0x3146, 0x5FE7, 0x5FE7, 0x10AC, 0x5FE8, 0x5FE9, 0x3148,
+ 0x5FEA, 0x5FEA, 0x164E, 0x5FEB, 0x5FEB, 0x0979, 0x5FEC, 0x5FEC, 0x314A,
+ 0x5FED, 0x5FED, 0x164F, 0x5FEE, 0x5FEE, 0x1647, 0x5FEF, 0x5FF0, 0x314B,
+ 0x5FF1, 0x5FF1, 0x04E5, 0x5FF2, 0x5FF4, 0x314D, 0x5FF5, 0x5FF5, 0x0B51,
+ 0x5FF6, 0x5FF7, 0x3150, 0x5FF8, 0x5FF8, 0x1650, 0x5FF9, 0x5FFA, 0x3152,
+ 0x5FFB, 0x5FFB, 0x0F8E, 0x5FFC, 0x5FFC, 0x3154, 0x5FFD, 0x5FFD, 0x07AD,
+ 0x5FFE, 0x5FFE, 0x164B, 0x5FFF, 0x5FFF, 0x067B, 0x6000, 0x6000, 0x07C8,
+ 0x6001, 0x6001, 0x0DFF, 0x6002, 0x6002, 0x0DC0, 0x6003, 0x6003, 0x1646,
+ 0x6004, 0x6004, 0x1648, 0x6005, 0x6006, 0x164C, 0x6007, 0x6009, 0x3155,
+ 0x600A, 0x600A, 0x1659, 0x600B, 0x600C, 0x3158, 0x600D, 0x600D, 0x1656,
+ 0x600E, 0x600E, 0x1138, 0x600F, 0x600F, 0x1655, 0x6010, 0x6011, 0x315A,
+ 0x6012, 0x6012, 0x0B6E, 0x6013, 0x6013, 0x315C, 0x6014, 0x6014, 0x119B,
+ 0x6015, 0x6015, 0x0B83, 0x6016, 0x6016, 0x0487, 0x6017, 0x6018, 0x315D,
+ 0x6019, 0x6019, 0x1651, 0x601A, 0x601A, 0x315F, 0x601B, 0x601B, 0x1654,
+ 0x601C, 0x601C, 0x09F8, 0x601D, 0x601D, 0x0DB1, 0x601E, 0x601F, 0x3160,
+ 0x6020, 0x6020, 0x0582, 0x6021, 0x6021, 0x165B, 0x6022, 0x6024, 0x3162,
+ 0x6025, 0x6025, 0x0824, 0x6026, 0x6026, 0x1653, 0x6027, 0x6027, 0x0F9F,
+ 0x6028, 0x6028, 0x10FC, 0x6029, 0x6029, 0x1657, 0x602A, 0x602A, 0x072F,
+ 0x602B, 0x602B, 0x1658, 0x602C, 0x602E, 0x3165, 0x602F, 0x602F, 0x0C50,
+ 0x6030, 0x6034, 0x3168, 0x6035, 0x6035, 0x1652, 0x6036, 0x603A, 0x316D,
+ 0x603B, 0x603B, 0x1239, 0x603C, 0x603C, 0x1A0D, 0x603D, 0x603E, 0x3172,
+ 0x603F, 0x603F, 0x165A, 0x6040, 0x6040, 0x3174, 0x6041, 0x6041, 0x1A11,
+ 0x6042, 0x6042, 0x1660, 0x6043, 0x6043, 0x0D68, 0x6044, 0x604A, 0x3175,
+ 0x604B, 0x604B, 0x09FE, 0x604C, 0x604C, 0x317C, 0x604D, 0x604D, 0x07E5,
+ 0x604E, 0x604F, 0x317D, 0x6050, 0x6050, 0x0963, 0x6051, 0x6051, 0x317F,
+ 0x6052, 0x6052, 0x079A, 0x6053, 0x6054, 0x3180, 0x6055, 0x6055, 0x0D96,
+ 0x6056, 0x6058, 0x3182, 0x6059, 0x6059, 0x1A12, 0x605A, 0x605A, 0x1A0F,
+ 0x605B, 0x605C, 0x3185, 0x605D, 0x605D, 0x1A0E, 0x605E, 0x6061, 0x3187,
+ 0x6062, 0x6062, 0x07EB, 0x6063, 0x6063, 0x1A13, 0x6064, 0x6064, 0x0FBF,
+ 0x6065, 0x6066, 0x318B, 0x6067, 0x6067, 0x1A10, 0x6068, 0x6068, 0x0795,
+ 0x6069, 0x6069, 0x0636, 0x606A, 0x606A, 0x1661, 0x606B, 0x606B, 0x05F1,
+ 0x606C, 0x606C, 0x0E44, 0x606D, 0x606D, 0x0700, 0x606E, 0x606E, 0x318D,
+ 0x606F, 0x606F, 0x0F0F, 0x6070, 0x6070, 0x0C1E, 0x6071, 0x6072, 0x318E,
+ 0x6073, 0x6073, 0x095F, 0x6074, 0x6075, 0x3190, 0x6076, 0x6076, 0x0630,
+ 0x6077, 0x6077, 0x3192, 0x6078, 0x6079, 0x165C, 0x607A, 0x607A, 0x165F,
+ 0x607B, 0x607B, 0x165E, 0x607C, 0x607C, 0x0B38, 0x607D, 0x607D, 0x1662,
+ 0x607E, 0x607E, 0x3193, 0x607F, 0x607F, 0x10A6, 0x6080, 0x6082, 0x3194,
+ 0x6083, 0x6083, 0x1667, 0x6084, 0x6084, 0x0C41, 0x6085, 0x6088, 0x3197,
+ 0x6089, 0x6089, 0x0F11, 0x608A, 0x608B, 0x319B, 0x608C, 0x608C, 0x1669,
+ 0x608D, 0x608D, 0x076E, 0x608E, 0x6091, 0x319D, 0x6092, 0x6092, 0x1668,
+ 0x6093, 0x6093, 0x31A1, 0x6094, 0x6094, 0x07EF, 0x6095, 0x6095, 0x31A2,
+ 0x6096, 0x6096, 0x1663, 0x6097, 0x6099, 0x31A3, 0x609A, 0x609A, 0x1664,
+ 0x609B, 0x609B, 0x166A, 0x609C, 0x609C, 0x31A6, 0x609D, 0x609D, 0x1666,
+ 0x609E, 0x609E, 0x31A7, 0x609F, 0x609F, 0x0F01, 0x60A0, 0x60A0, 0x10AB,
+ 0x60A1, 0x60A2, 0x31A8, 0x60A3, 0x60A3, 0x07D1, 0x60A4, 0x60A5, 0x31AA,
+ 0x60A6, 0x60A6, 0x1106, 0x60A7, 0x60A7, 0x31AC, 0x60A8, 0x60A8, 0x0B5D,
+ 0x60A9, 0x60AA, 0x31AD, 0x60AB, 0x60AB, 0x1A14, 0x60AC, 0x60AC, 0x0FC7,
+ 0x60AD, 0x60AD, 0x1665, 0x60AE, 0x60AE, 0x31AF, 0x60AF, 0x60AF, 0x0AFA,
+ 0x60B0, 0x60B0, 0x31B0, 0x60B1, 0x60B1, 0x166D, 0x60B2, 0x60B2, 0x0418,
+ 0x60B3, 0x60B3, 0x31B1, 0x60B4, 0x60B4, 0x1672, 0x60B5, 0x60B5, 0x23B4,
+ 0x60B6, 0x60B6, 0x207E, 0x60B7, 0x60B7, 0x31B2, 0x60B8, 0x60B8, 0x0835,
+ 0x60B9, 0x60BA, 0x31B3, 0x60BB, 0x60BB, 0x166C, 0x60BC, 0x60BC, 0x05A0,
+ 0x60BD, 0x60C4, 0x31B5, 0x60C5, 0x60C5, 0x0C66, 0x60C6, 0x60C6, 0x1670,
+ 0x60C7, 0x60C9, 0x31BD, 0x60CA, 0x60CA, 0x08D9, 0x60CB, 0x60CB, 0x0EA0,
+ 0x60CC, 0x60D0, 0x31C0, 0x60D1, 0x60D1, 0x0808, 0x60D2, 0x60D4, 0x31C5,
+ 0x60D5, 0x60D5, 0x0E3B, 0x60D6, 0x60D7, 0x31C8, 0x60D8, 0x60D8, 0x166F,
+ 0x60D9, 0x60D9, 0x31CA, 0x60DA, 0x60DA, 0x1671, 0x60DB, 0x60DB, 0x31CB,
+ 0x60DC, 0x60DC, 0x0F14, 0x60DD, 0x60DD, 0x166E, 0x60DE, 0x60DE, 0x31CC,
+ 0x60DF, 0x60DF, 0x0EB8, 0x60E0, 0x60E0, 0x07F2, 0x60E1, 0x60E1, 0x1EE3,
+ 0x60E2, 0x60E5, 0x31CD, 0x60E6, 0x60E6, 0x05CC, 0x60E7, 0x60E7, 0x0914,
+ 0x60E8, 0x60E8, 0x0499, 0x60E9, 0x60E9, 0x04F2, 0x60EA, 0x60EA, 0x31D1,
+ 0x60EB, 0x60EB, 0x0422, 0x60EC, 0x60EC, 0x166B, 0x60ED, 0x60ED, 0x0498,
+ 0x60EE, 0x60EE, 0x058D, 0x60EF, 0x60EF, 0x0738, 0x60F0, 0x60F0, 0x0627,
+ 0x60F1, 0x60F1, 0x2095, 0x60F2, 0x60F2, 0x23BB, 0x60F3, 0x60F3, 0x0F58,
+ 0x60F4, 0x60F4, 0x1677, 0x60F5, 0x60F5, 0x31D2, 0x60F6, 0x60F6, 0x07E1,
+ 0x60F7, 0x60F8, 0x31D3, 0x60F9, 0x60F9, 0x0CA2, 0x60FA, 0x60FA, 0x0F95,
+ 0x60FB, 0x60FB, 0x23B9, 0x60FC, 0x60FF, 0x31D5, 0x6100, 0x6100, 0x1678,
+ 0x6101, 0x6101, 0x0513, 0x6102, 0x6105, 0x31D9, 0x6106, 0x6106, 0x1A15,
+ 0x6107, 0x6107, 0x31DD, 0x6108, 0x6108, 0x10DF, 0x6109, 0x6109, 0x10C9,
+ 0x610A, 0x610C, 0x31DE, 0x610D, 0x610D, 0x1A16, 0x610E, 0x610E, 0x1679,
+ 0x610F, 0x610F, 0x1069, 0x6110, 0x6114, 0x31E1, 0x6115, 0x6115, 0x1675,
+ 0x6116, 0x6119, 0x31E6, 0x611A, 0x611A, 0x10C3, 0x611B, 0x611B, 0x1E28,
+ 0x611C, 0x611C, 0x23BD, 0x611D, 0x611E, 0x31EA, 0x611F, 0x611F, 0x06CB,
+ 0x6120, 0x6120, 0x1673, 0x6121, 0x6122, 0x31EC, 0x6123, 0x6123, 0x1676,
+ 0x6124, 0x6124, 0x067C, 0x6125, 0x6125, 0x31EE, 0x6126, 0x6126, 0x1674,
+ 0x6127, 0x6127, 0x098D, 0x6128, 0x612A, 0x31EF, 0x612B, 0x612B, 0x167A,
+ 0x612C, 0x6133, 0x31F2, 0x6134, 0x6134, 0x23B5, 0x6135, 0x6136, 0x31FA,
+ 0x6137, 0x6137, 0x23BA, 0x6138, 0x613D, 0x31FC, 0x613E, 0x613E, 0x23B3,
+ 0x613F, 0x613F, 0x10FB, 0x6140, 0x6147, 0x3202, 0x6148, 0x6148, 0x054B,
+ 0x6149, 0x6149, 0x320A, 0x614A, 0x614A, 0x167B, 0x614B, 0x614B, 0x2162,
+ 0x614C, 0x614C, 0x07DA, 0x614D, 0x614D, 0x320B, 0x614E, 0x614E, 0x0D30,
+ 0x614F, 0x6150, 0x320C, 0x6151, 0x6151, 0x0D1E, 0x6152, 0x6154, 0x320E,
+ 0x6155, 0x6155, 0x0B20, 0x6156, 0x6157, 0x3211, 0x6158, 0x6158, 0x1E5E,
+ 0x6159, 0x6159, 0x3213, 0x615A, 0x615A, 0x1E5D, 0x615B, 0x615C, 0x3214,
+ 0x615D, 0x615D, 0x1A17, 0x615E, 0x615E, 0x3216, 0x615F, 0x615F, 0x23B7,
+ 0x6160, 0x6161, 0x3217, 0x6162, 0x6162, 0x0AA4, 0x6163, 0x6163, 0x1F2F,
+ 0x6164, 0x6164, 0x24DF, 0x6165, 0x6166, 0x3219, 0x6167, 0x6167, 0x07F0,
+ 0x6168, 0x6168, 0x093B, 0x6169, 0x6169, 0x321B, 0x616A, 0x616A, 0x23B2,
+ 0x616B, 0x616B, 0x214E, 0x616C, 0x616D, 0x321C, 0x616E, 0x616E, 0x2052,
+ 0x616F, 0x616F, 0x321E, 0x6170, 0x6170, 0x0ECE, 0x6171, 0x6172, 0x321F,
+ 0x6173, 0x6173, 0x23BC, 0x6174, 0x6174, 0x3221, 0x6175, 0x6175, 0x167C,
+ 0x6176, 0x6176, 0x20EB, 0x6177, 0x6177, 0x0943, 0x6178, 0x6181, 0x3222,
+ 0x6182, 0x6182, 0x2232, 0x6183, 0x6189, 0x322C, 0x618A, 0x618A, 0x1E3F,
+ 0x618B, 0x618B, 0x0458, 0x618C, 0x618D, 0x3233, 0x618E, 0x618E, 0x113A,
+ 0x618F, 0x618F, 0x3235, 0x6190, 0x6190, 0x201B, 0x6191, 0x6191, 0x20BC,
+ 0x6192, 0x6192, 0x23BE, 0x6193, 0x6193, 0x3236, 0x6194, 0x6194, 0x167E,
+ 0x6195, 0x6199, 0x3237, 0x619A, 0x619A, 0x1EAE, 0x619B, 0x619C, 0x323C,
+ 0x619D, 0x619D, 0x1A19, 0x619E, 0x61A3, 0x323E, 0x61A4, 0x61A4, 0x1EFB,
+ 0x61A5, 0x61A6, 0x3244, 0x61A7, 0x61A7, 0x167F, 0x61A8, 0x61A8, 0x0760,
+ 0x61A9, 0x61A9, 0x1A18, 0x61AA, 0x61AA, 0x3246, 0x61AB, 0x61AB, 0x2089,
+ 0x61AC, 0x61AC, 0x167D, 0x61AD, 0x61AD, 0x3247, 0x61AE, 0x61AE, 0x23B1,
+ 0x61AF, 0x61B1, 0x3248, 0x61B2, 0x61B2, 0x21C4, 0x61B3, 0x61B5, 0x324B,
+ 0x61B6, 0x61B6, 0x2214, 0x61B7, 0x61B7, 0x1680, 0x61B8, 0x61BD, 0x324E,
+ 0x61BE, 0x61BE, 0x076D, 0x61BF, 0x61C1, 0x3254, 0x61C2, 0x61C2, 0x05ED,
+ 0x61C3, 0x61C6, 0x3257, 0x61C7, 0x61C7, 0x1FDE, 0x61C8, 0x61C8, 0x0F83,
+ 0x61C9, 0x61C9, 0x2223, 0x61CA, 0x61CA, 0x03CE, 0x61CB, 0x61CB, 0x1A1A,
+ 0x61CC, 0x61CC, 0x23B6, 0x61CD, 0x61D0, 0x325B, 0x61D1, 0x61D1, 0x1A1B,
+ 0x61D2, 0x61D2, 0x09AC, 0x61D3, 0x61D3, 0x325F, 0x61D4, 0x61D4, 0x1681,
+ 0x61D5, 0x61DD, 0x3260, 0x61DE, 0x61DE, 0x268C, 0x61DF, 0x61DF, 0x24DE,
+ 0x61E0, 0x61E2, 0x3269, 0x61E3, 0x61E3, 0x24E0, 0x61E4, 0x61E5, 0x326C,
+ 0x61E6, 0x61E6, 0x0B74, 0x61E7, 0x61E7, 0x326E, 0x61E8, 0x61E8, 0x23B8,
+ 0x61E9, 0x61F1, 0x326F, 0x61F2, 0x61F2, 0x1E81, 0x61F3, 0x61F4, 0x3278,
+ 0x61F5, 0x61F5, 0x1682, 0x61F6, 0x61F6, 0x1FFE, 0x61F7, 0x61F7, 0x1F51,
+ 0x61F8, 0x61F8, 0x21E1, 0x61F9, 0x61F9, 0x327A, 0x61FA, 0x61FA, 0x23B0,
+ 0x61FB, 0x61FB, 0x327B, 0x61FC, 0x61FC, 0x1FCE, 0x61FD, 0x61FD, 0x327C,
+ 0x61FE, 0x61FE, 0x211E, 0x61FF, 0x61FF, 0x13E0, 0x6200, 0x6200, 0x2021,
+ 0x6201, 0x6205, 0x327D, 0x6206, 0x6206, 0x1A1C, 0x6207, 0x6207, 0x24E1,
+ 0x6208, 0x6208, 0x06E5, 0x6209, 0x6209, 0x3282, 0x620A, 0x620A, 0x0EFB,
+ 0x620B, 0x620B, 0x18F9, 0x620C, 0x620C, 0x0FB2, 0x620D, 0x620D, 0x0D90,
+ 0x620E, 0x620E, 0x0CB1, 0x620F, 0x620F, 0x0F24, 0x6210, 0x6210, 0x04EE,
+ 0x6211, 0x6211, 0x0EE1, 0x6212, 0x6212, 0x08B5, 0x6213, 0x6213, 0x3283,
+ 0x6214, 0x6214, 0x24A3, 0x6215, 0x6215, 0x169E, 0x6216, 0x6216, 0x0807,
+ 0x6217, 0x6217, 0x18FA, 0x6218, 0x6218, 0x115E, 0x6219, 0x6219, 0x3284,
+ 0x621A, 0x621A, 0x0BFC, 0x621B, 0x621B, 0x18FB, 0x621C, 0x621E, 0x3285,
+ 0x621F, 0x621F, 0x18FC, 0x6220, 0x6220, 0x3288, 0x6221, 0x6221, 0x18FE,
+ 0x6222, 0x6222, 0x18FD, 0x6223, 0x6223, 0x3289, 0x6224, 0x6224, 0x1900,
+ 0x6225, 0x6225, 0x18FF, 0x6226, 0x6226, 0x328A, 0x6227, 0x6227, 0x24A4,
+ 0x6228, 0x6229, 0x328B, 0x622A, 0x622A, 0x08A9, 0x622B, 0x622B, 0x328D,
+ 0x622C, 0x622C, 0x1901, 0x622D, 0x622D, 0x328E, 0x622E, 0x622E, 0x0A65,
+ 0x622F, 0x622F, 0x328F, 0x6230, 0x6230, 0x2273, 0x6231, 0x6231, 0x3290,
+ 0x6232, 0x6232, 0x21B0, 0x6233, 0x6233, 0x0544, 0x6234, 0x6234, 0x057A,
+ 0x6235, 0x6236, 0x3291, 0x6237, 0x6237, 0x07BC, 0x6238, 0x623C, 0x3293,
+ 0x623D, 0x623D, 0x19F4, 0x623E, 0x623E, 0x19F3, 0x623F, 0x623F, 0x065C,
+ 0x6240, 0x6240, 0x0DEE, 0x6241, 0x6241, 0x044B, 0x6242, 0x6242, 0x3298,
+ 0x6243, 0x6243, 0x19F5, 0x6244, 0x6246, 0x3299, 0x6247, 0x6247, 0x0D01,
+ 0x6248, 0x6249, 0x19F6, 0x624A, 0x624A, 0x329C, 0x624B, 0x624B, 0x0D6D,
+ 0x624C, 0x624C, 0x14BA, 0x624D, 0x624D, 0x048C, 0x624E, 0x624E, 0x113D,
+ 0x624F, 0x6250, 0x329D, 0x6251, 0x6251, 0x0BEA, 0x6252, 0x6252, 0x03D2,
+ 0x6253, 0x6253, 0x0575, 0x6254, 0x6254, 0x0CAE, 0x6255, 0x6257, 0x329F,
+ 0x6258, 0x6258, 0x0E81, 0x6259, 0x625A, 0x32A2, 0x625B, 0x625B, 0x0945,
+ 0x625C, 0x6262, 0x32A4, 0x6263, 0x6263, 0x0968, 0x6264, 0x6265, 0x32AB,
+ 0x6266, 0x6266, 0x0C21, 0x6267, 0x6267, 0x11B3, 0x6268, 0x6268, 0x32AD,
+ 0x6269, 0x6269, 0x0994, 0x626A, 0x626A, 0x14BB, 0x626B, 0x626B, 0x0CE1,
+ 0x626C, 0x626C, 0x1018, 0x626D, 0x626D, 0x0B65, 0x626E, 0x626E, 0x03F2,
+ 0x626F, 0x626F, 0x04DB, 0x6270, 0x6270, 0x0CA0, 0x6271, 0x6272, 0x32AE,
+ 0x6273, 0x6273, 0x03ED, 0x6274, 0x6275, 0x32B0, 0x6276, 0x6276, 0x0693,
+ 0x6277, 0x6278, 0x32B2, 0x6279, 0x6279, 0x0BBB, 0x627A, 0x627B, 0x32B4,
+ 0x627C, 0x627C, 0x0632, 0x627D, 0x627D, 0x32B6, 0x627E, 0x627E, 0x1173,
+ 0x627F, 0x627F, 0x04F5, 0x6280, 0x6280, 0x082F, 0x6281, 0x6283, 0x32B7,
+ 0x6284, 0x6284, 0x04D2, 0x6285, 0x6288, 0x32BA, 0x6289, 0x6289, 0x0920,
+ 0x628A, 0x628A, 0x03DC, 0x628B, 0x6290, 0x32BE, 0x6291, 0x6291, 0x105D,
+ 0x6292, 0x6292, 0x0D7A, 0x6293, 0x6293, 0x1202, 0x6294, 0x6294, 0x32C4,
+ 0x6295, 0x6295, 0x0E67, 0x6296, 0x6296, 0x05F5, 0x6297, 0x6297, 0x0946,
+ 0x6298, 0x6298, 0x117C, 0x6299, 0x6299, 0x32C5, 0x629A, 0x629A, 0x06A2,
+ 0x629B, 0x629B, 0x0B98, 0x629C, 0x629E, 0x32C6, 0x629F, 0x629F, 0x14BC,
+ 0x62A0, 0x62A0, 0x0966, 0x62A1, 0x62A1, 0x0A7C, 0x62A2, 0x62A2, 0x0C3D,
+ 0x62A3, 0x62A3, 0x32C9, 0x62A4, 0x62A4, 0x07B9, 0x62A5, 0x62A5, 0x0411,
+ 0x62A6, 0x62A7, 0x32CA, 0x62A8, 0x62A8, 0x0BAB, 0x62A9, 0x62AA, 0x32CC,
+ 0x62AB, 0x62AB, 0x0BBC, 0x62AC, 0x62AC, 0x0DFA, 0x62AD, 0x62B0, 0x32CE,
+ 0x62B1, 0x62B1, 0x0410, 0x62B2, 0x62B4, 0x32D2, 0x62B5, 0x62B5, 0x05B7,
+ 0x62B6, 0x62B8, 0x32D5, 0x62B9, 0x62B9, 0x0B0B, 0x62BA, 0x62BA, 0x32D8,
+ 0x62BB, 0x62BB, 0x14BD, 0x62BC, 0x62BC, 0x0FE3, 0x62BD, 0x62BD, 0x050E,
+ 0x62BE, 0x62BE, 0x32D9, 0x62BF, 0x62BF, 0x0AF7, 0x62C0, 0x62C1, 0x32DA,
+ 0x62C2, 0x62C2, 0x0694, 0x62C3, 0x62C3, 0x32DC, 0x62C4, 0x62C4, 0x11F3,
+ 0x62C5, 0x62C5, 0x0584, 0x62C6, 0x62C6, 0x04B7, 0x62C7, 0x62C7, 0x0B17,
+ 0x62C8, 0x62C8, 0x0B4C, 0x62C9, 0x62C9, 0x0998, 0x62CA, 0x62CA, 0x14BE,
+ 0x62CB, 0x62CB, 0x32DD, 0x62CC, 0x62CC, 0x03F3, 0x62CD, 0x62CD, 0x0B85,
+ 0x62CE, 0x62CE, 0x0A29, 0x62CF, 0x62CF, 0x32DE, 0x62D0, 0x62D0, 0x072E,
+ 0x62D1, 0x62D1, 0x32DF, 0x62D2, 0x62D2, 0x090B, 0x62D3, 0x62D3, 0x0E89,
+ 0x62D4, 0x62D4, 0x03D9, 0x62D5, 0x62D5, 0x32E0, 0x62D6, 0x62D6, 0x0E80,
+ 0x62D7, 0x62D7, 0x14C0, 0x62D8, 0x62D8, 0x08FF, 0x62D9, 0x62D9, 0x121B,
+ 0x62DA, 0x62DA, 0x14BF, 0x62DB, 0x62DB, 0x1171, 0x62DC, 0x62DC, 0x03E8,
+ 0x62DD, 0x62DE, 0x32E1, 0x62DF, 0x62DF, 0x0B45, 0x62E0, 0x62E1, 0x32E3,
+ 0x62E2, 0x62E2, 0x0A4A, 0x62E3, 0x62E3, 0x0863, 0x62E4, 0x62E4, 0x32E5,
+ 0x62E5, 0x62E5, 0x109A, 0x62E6, 0x62E6, 0x09A4, 0x62E7, 0x62E7, 0x0B62,
+ 0x62E8, 0x62E8, 0x046D, 0x62E9, 0x62E9, 0x1134, 0x62EA, 0x62EB, 0x32E6,
+ 0x62EC, 0x62EC, 0x0993, 0x62ED, 0x62ED, 0x0D5A, 0x62EE, 0x62EE, 0x14C1,
+ 0x62EF, 0x62EF, 0x119D, 0x62F0, 0x62F0, 0x32E8, 0x62F1, 0x62F1, 0x0709,
+ 0x62F2, 0x62F2, 0x32E9, 0x62F3, 0x62F3, 0x0C88, 0x62F4, 0x62F4, 0x0D9E,
+ 0x62F5, 0x62F5, 0x32EA, 0x62F6, 0x62F6, 0x14C3, 0x62F7, 0x62F7, 0x094A,
+ 0x62F8, 0x62FB, 0x32EB, 0x62FC, 0x62FC, 0x0BD3, 0x62FD, 0x62FD, 0x1204,
+ 0x62FE, 0x62FE, 0x0D47, 0x62FF, 0x62FF, 0x0B26, 0x6300, 0x6300, 0x32EF,
+ 0x6301, 0x6301, 0x04FB, 0x6302, 0x6302, 0x072B, 0x6303, 0x6306, 0x32F0,
+ 0x6307, 0x6307, 0x11B7, 0x6308, 0x6308, 0x194E, 0x6309, 0x6309, 0x03BF,
+ 0x630A, 0x630D, 0x32F4, 0x630E, 0x630E, 0x0973, 0x630F, 0x6310, 0x32F8,
+ 0x6311, 0x6311, 0x0E47, 0x6312, 0x6315, 0x32FA, 0x6316, 0x6316, 0x0E8B,
+ 0x6317, 0x6319, 0x32FE, 0x631A, 0x631A, 0x11BE, 0x631B, 0x631B, 0x0A75,
+ 0x631C, 0x631C, 0x3301, 0x631D, 0x631D, 0x0EDD, 0x631E, 0x631E, 0x0DF5,
+ 0x631F, 0x631F, 0x0F79, 0x6320, 0x6320, 0x0B36, 0x6321, 0x6321, 0x0593,
+ 0x6322, 0x6322, 0x14C2, 0x6323, 0x6323, 0x1196, 0x6324, 0x6324, 0x082A,
+ 0x6325, 0x6325, 0x07E8, 0x6326, 0x6327, 0x3302, 0x6328, 0x6328, 0x03AF,
+ 0x6329, 0x6329, 0x3304, 0x632A, 0x632A, 0x0B73, 0x632B, 0x632B, 0x056F,
+ 0x632C, 0x632E, 0x3305, 0x632F, 0x632F, 0x1192, 0x6330, 0x6331, 0x3308,
+ 0x6332, 0x6332, 0x194F, 0x6333, 0x6338, 0x330A, 0x6339, 0x6339, 0x14C4,
+ 0x633A, 0x633A, 0x0E57, 0x633B, 0x633C, 0x3310, 0x633D, 0x633D, 0x0E9D,
+ 0x633E, 0x633E, 0x21D1, 0x633F, 0x6341, 0x3312, 0x6342, 0x6342, 0x0EF5,
+ 0x6343, 0x6343, 0x14C6, 0x6344, 0x6344, 0x3315, 0x6345, 0x6345, 0x0E62,
+ 0x6346, 0x6346, 0x0991, 0x6347, 0x6348, 0x3316, 0x6349, 0x6349, 0x121A,
+ 0x634A, 0x634A, 0x3318, 0x634B, 0x634B, 0x14C5, 0x634C, 0x634C, 0x03D1,
+ 0x634D, 0x634D, 0x076B, 0x634E, 0x634E, 0x0D0C, 0x634F, 0x634F, 0x0B56,
+ 0x6350, 0x6350, 0x0917, 0x6351, 0x6354, 0x3319, 0x6355, 0x6355, 0x047D,
+ 0x6356, 0x635D, 0x331D, 0x635E, 0x635E, 0x09B7, 0x635F, 0x635F, 0x0DE5,
+ 0x6360, 0x6360, 0x3325, 0x6361, 0x6361, 0x0864, 0x6362, 0x6362, 0x07D0,
+ 0x6363, 0x6363, 0x0598, 0x6364, 0x6366, 0x3326, 0x6367, 0x6367, 0x0BB6,
+ 0x6368, 0x6368, 0x211C, 0x6369, 0x6369, 0x14D0, 0x636A, 0x636A, 0x3329,
+ 0x636B, 0x636B, 0x235D, 0x636C, 0x636C, 0x332A, 0x636D, 0x636D, 0x14CD,
+ 0x636E, 0x636E, 0x090C, 0x636F, 0x6370, 0x332B, 0x6371, 0x6371, 0x14C9,
+ 0x6372, 0x6372, 0x2682, 0x6373, 0x6375, 0x332D, 0x6376, 0x6376, 0x053A,
+ 0x6377, 0x6377, 0x08AE, 0x6378, 0x6379, 0x3330, 0x637A, 0x637A, 0x14CA,
+ 0x637B, 0x637B, 0x0B50, 0x637C, 0x637F, 0x3332, 0x6380, 0x6380, 0x0F33,
+ 0x6381, 0x6381, 0x3336, 0x6382, 0x6382, 0x05C1, 0x6383, 0x6383, 0x210D,
+ 0x6384, 0x6384, 0x205A, 0x6385, 0x6386, 0x3337, 0x6387, 0x6387, 0x061D,
+ 0x6388, 0x6388, 0x0D71, 0x6389, 0x6389, 0x05D5, 0x638A, 0x638A, 0x14CF,
+ 0x638B, 0x638B, 0x3339, 0x638C, 0x638C, 0x1167, 0x638D, 0x638D, 0x333A,
+ 0x638E, 0x638E, 0x14CB, 0x638F, 0x638F, 0x0E20, 0x6390, 0x6390, 0x0C1D,
+ 0x6391, 0x6391, 0x333B, 0x6392, 0x6392, 0x0B86, 0x6393, 0x6395, 0x333C,
+ 0x6396, 0x6396, 0x103B, 0x6397, 0x6397, 0x333F, 0x6398, 0x6398, 0x0921,
+ 0x6399, 0x639F, 0x3340, 0x63A0, 0x63A0, 0x0A7A, 0x63A1, 0x63A1, 0x3347,
+ 0x63A2, 0x63A2, 0x0E10, 0x63A3, 0x63A3, 0x04DD, 0x63A4, 0x63A4, 0x3348,
+ 0x63A5, 0x63A5, 0x08A4, 0x63A6, 0x63A6, 0x3349, 0x63A7, 0x63A7, 0x0965,
+ 0x63A8, 0x63A8, 0x0E77, 0x63A9, 0x63A9, 0x1003, 0x63AA, 0x63AA, 0x056E,
+ 0x63AB, 0x63AB, 0x334A, 0x63AC, 0x63AC, 0x14CE, 0x63AD, 0x63AD, 0x14C7,
+ 0x63AE, 0x63AE, 0x14D1, 0x63AF, 0x63AF, 0x334B, 0x63B0, 0x63B0, 0x1950,
+ 0x63B1, 0x63B2, 0x334C, 0x63B3, 0x63B3, 0x0A57, 0x63B4, 0x63B4, 0x14CC,
+ 0x63B5, 0x63B6, 0x334E, 0x63B7, 0x63B7, 0x11BF, 0x63B8, 0x63B8, 0x0588,
+ 0x63B9, 0x63B9, 0x3350, 0x63BA, 0x63BA, 0x04BB, 0x63BB, 0x63BB, 0x3351,
+ 0x63BC, 0x63BC, 0x14D2, 0x63BD, 0x63BD, 0x3352, 0x63BE, 0x63BE, 0x14DC,
+ 0x63BF, 0x63BF, 0x3353, 0x63C0, 0x63C0, 0x1F8D, 0x63C1, 0x63C3, 0x3354,
+ 0x63C4, 0x63C4, 0x14D7, 0x63C5, 0x63C5, 0x3357, 0x63C6, 0x63C6, 0x14DB,
+ 0x63C7, 0x63C8, 0x3358, 0x63C9, 0x63C9, 0x0CBB, 0x63CA, 0x63CC, 0x335A,
+ 0x63CD, 0x63CD, 0x123E, 0x63CE, 0x63CE, 0x14D9, 0x63CF, 0x63CF, 0x0AED,
+ 0x63D0, 0x63D0, 0x0E34, 0x63D1, 0x63D1, 0x335D, 0x63D2, 0x63D2, 0x04AC,
+ 0x63D3, 0x63D5, 0x335E, 0x63D6, 0x63D6, 0x1045, 0x63D7, 0x63D9, 0x3361,
+ 0x63DA, 0x63DA, 0x21FF, 0x63DB, 0x63DD, 0x3364, 0x63DE, 0x63DE, 0x14D8,
+ 0x63DF, 0x63DF, 0x3367, 0x63E0, 0x63E0, 0x14D5, 0x63E1, 0x63E1, 0x0EE4,
+ 0x63E2, 0x63E2, 0x3368, 0x63E3, 0x63E3, 0x052A, 0x63E4, 0x63E8, 0x3369,
+ 0x63E9, 0x63E9, 0x0938, 0x63EA, 0x63EA, 0x08ED, 0x63EB, 0x63EC, 0x336E,
+ 0x63ED, 0x63ED, 0x08A3, 0x63EE, 0x63EE, 0x1F58, 0x63EF, 0x63F1, 0x3370,
+ 0x63F2, 0x63F2, 0x14D3, 0x63F3, 0x63F3, 0x3373, 0x63F4, 0x63F4, 0x10F1,
+ 0x63F5, 0x63F5, 0x3374, 0x63F6, 0x63F6, 0x14C8, 0x63F7, 0x63F7, 0x3375,
+ 0x63F8, 0x63F8, 0x14D4, 0x63F9, 0x63FC, 0x3376, 0x63FD, 0x63FD, 0x09AA,
+ 0x63FE, 0x63FE, 0x337A, 0x63FF, 0x63FF, 0x14D6, 0x6400, 0x6400, 0x04BA,
+ 0x6401, 0x6401, 0x06E4, 0x6402, 0x6402, 0x0A4E, 0x6403, 0x6404, 0x337B,
+ 0x6405, 0x6405, 0x0892, 0x6406, 0x640A, 0x337D, 0x640B, 0x640B, 0x14DF,
+ 0x640C, 0x640C, 0x14E2, 0x640D, 0x640D, 0x215B, 0x640E, 0x640E, 0x3382,
+ 0x640F, 0x640F, 0x0472, 0x6410, 0x6410, 0x0527, 0x6411, 0x6412, 0x3383,
+ 0x6413, 0x6413, 0x056D, 0x6414, 0x6414, 0x0CDF, 0x6415, 0x6416, 0x3385,
+ 0x6417, 0x6417, 0x1EB6, 0x6418, 0x641A, 0x3387, 0x641B, 0x641B, 0x14E0,
+ 0x641C, 0x641C, 0x0DC6, 0x641D, 0x641D, 0x338A, 0x641E, 0x641E, 0x06DE,
+ 0x641F, 0x641F, 0x338B, 0x6420, 0x6420, 0x14E1, 0x6421, 0x6421, 0x14E4,
+ 0x6422, 0x6425, 0x338C, 0x6426, 0x6426, 0x14E3, 0x6427, 0x6429, 0x3390,
+ 0x642A, 0x642A, 0x0E15, 0x642B, 0x642B, 0x3393, 0x642C, 0x642C, 0x03EC,
+ 0x642D, 0x642D, 0x0571, 0x642E, 0x6433, 0x3394, 0x6434, 0x6434, 0x1736,
+ 0x6435, 0x6435, 0x339A, 0x6436, 0x6436, 0x20DB, 0x6437, 0x6439, 0x339B,
+ 0x643A, 0x643A, 0x0F7A, 0x643B, 0x643C, 0x339E, 0x643D, 0x643D, 0x04B2,
+ 0x643E, 0x643E, 0x33A0, 0x643F, 0x643F, 0x1951, 0x6440, 0x6440, 0x33A1,
+ 0x6441, 0x6441, 0x14DE, 0x6442, 0x6443, 0x33A2, 0x6444, 0x6444, 0x0D1C,
+ 0x6445, 0x6445, 0x14DD, 0x6446, 0x6446, 0x03E5, 0x6447, 0x6447, 0x1028,
+ 0x6448, 0x6448, 0x0460, 0x6449, 0x6449, 0x33A4, 0x644A, 0x644A, 0x0E02,
+ 0x644B, 0x6450, 0x33A5, 0x6451, 0x6451, 0x2360, 0x6452, 0x6452, 0x14DA,
+ 0x6453, 0x6453, 0x33AB, 0x6454, 0x6454, 0x0D99, 0x6455, 0x6457, 0x33AC,
+ 0x6458, 0x6458, 0x114B, 0x6459, 0x645B, 0x33AF, 0x645C, 0x645C, 0x2361,
+ 0x645D, 0x645D, 0x33B2, 0x645E, 0x645E, 0x14E5, 0x645F, 0x645F, 0x2040,
+ 0x6460, 0x6466, 0x33B3, 0x6467, 0x6467, 0x0560, 0x6468, 0x6468, 0x33BA,
+ 0x6469, 0x6469, 0x0B09, 0x646A, 0x646C, 0x33BB, 0x646D, 0x646D, 0x14E7,
+ 0x646E, 0x646E, 0x33BE, 0x646F, 0x646F, 0x228E, 0x6470, 0x6472, 0x33BF,
+ 0x6473, 0x6473, 0x1FDF, 0x6474, 0x6475, 0x33C2, 0x6476, 0x6476, 0x235E,
+ 0x6477, 0x6477, 0x33C4, 0x6478, 0x6479, 0x0B03, 0x647A, 0x647A, 0x14E9,
+ 0x647B, 0x647B, 0x1E6A, 0x647C, 0x6481, 0x33C5, 0x6482, 0x6482, 0x0A15,
+ 0x6483, 0x6483, 0x33CB, 0x6484, 0x6484, 0x14E6, 0x6485, 0x6485, 0x091E,
+ 0x6486, 0x6486, 0x33CC, 0x6487, 0x6487, 0x0BD1, 0x6488, 0x6488, 0x2002,
+ 0x6489, 0x6490, 0x33CD, 0x6491, 0x6491, 0x04EA, 0x6492, 0x6492, 0x0CD1,
+ 0x6493, 0x6493, 0x2093, 0x6494, 0x6494, 0x33D5, 0x6495, 0x6495, 0x0DAF,
+ 0x6496, 0x6496, 0x14E8, 0x6497, 0x6498, 0x33D6, 0x6499, 0x6499, 0x14EC,
+ 0x649A, 0x649D, 0x33D8, 0x649E, 0x649E, 0x120F, 0x649F, 0x649F, 0x235F,
+ 0x64A0, 0x64A2, 0x33DC, 0x64A3, 0x64A3, 0x1EAC, 0x64A4, 0x64A4, 0x04DC,
+ 0x64A5, 0x64A5, 0x1E54, 0x64A6, 0x64A8, 0x33DF, 0x64A9, 0x64A9, 0x0A0C,
+ 0x64AA, 0x64AA, 0x33E2, 0x64AB, 0x64AB, 0x1F08, 0x64AC, 0x64AC, 0x0C48,
+ 0x64AD, 0x64AD, 0x046C, 0x64AE, 0x64AE, 0x056C, 0x64AF, 0x64AF, 0x33E3,
+ 0x64B0, 0x64B0, 0x1208, 0x64B1, 0x64B1, 0x33E4, 0x64B2, 0x64B2, 0x20C0,
+ 0x64B3, 0x64B3, 0x2362, 0x64B4, 0x64B4, 0x33E5, 0x64B5, 0x64B5, 0x0B4F,
+ 0x64B6, 0x64B6, 0x33E6, 0x64B7, 0x64B8, 0x14EA, 0x64B9, 0x64B9, 0x33E7,
+ 0x64BA, 0x64BA, 0x14ED, 0x64BB, 0x64BB, 0x2160, 0x64BC, 0x64BC, 0x076A,
+ 0x64BD, 0x64BD, 0x33E8, 0x64BE, 0x64BE, 0x219D, 0x64BF, 0x64BF, 0x1F8E,
+ 0x64C0, 0x64C0, 0x14EE, 0x64C1, 0x64C1, 0x222D, 0x64C2, 0x64C2, 0x09C9,
+ 0x64C3, 0x64C3, 0x33E9, 0x64C4, 0x64C4, 0x2047, 0x64C5, 0x64C5, 0x0CFC,
+ 0x64C6, 0x64C6, 0x33EA, 0x64C7, 0x64C7, 0x2262, 0x64C8, 0x64C9, 0x33EB,
+ 0x64CA, 0x64CA, 0x1F67, 0x64CB, 0x64CB, 0x1EB2, 0x64CC, 0x64CC, 0x33ED,
+ 0x64CD, 0x64CD, 0x04A0, 0x64CE, 0x64CE, 0x0C63, 0x64CF, 0x64CF, 0x33EE,
+ 0x64D0, 0x64D0, 0x14EF, 0x64D1, 0x64D1, 0x33EF, 0x64D2, 0x64D2, 0x0C59,
+ 0x64D3, 0x64D3, 0x33F0, 0x64D4, 0x64D4, 0x1EA9, 0x64D5, 0x64D6, 0x33F1,
+ 0x64D7, 0x64D7, 0x14F0, 0x64D8, 0x64D8, 0x1952, 0x64D9, 0x64D9, 0x33F3,
+ 0x64DA, 0x64DA, 0x1FCC, 0x64DB, 0x64DD, 0x33F4, 0x64DE, 0x64DE, 0x0DC8,
+ 0x64DF, 0x64DF, 0x33F7, 0x64E0, 0x64E0, 0x1F72, 0x64E1, 0x64E1, 0x33F8,
+ 0x64E2, 0x64E2, 0x14F2, 0x64E3, 0x64E3, 0x33F9, 0x64E4, 0x64E4, 0x14F1,
+ 0x64E5, 0x64E5, 0x33FA, 0x64E6, 0x64E6, 0x0488, 0x64E7, 0x64EB, 0x33FB,
+ 0x64EC, 0x64EC, 0x2098, 0x64ED, 0x64EE, 0x3400, 0x64EF, 0x64EF, 0x1E52,
+ 0x64F0, 0x64F0, 0x20A4, 0x64F1, 0x64F1, 0x1F1C, 0x64F2, 0x64F2, 0x228F,
+ 0x64F3, 0x64F3, 0x3402, 0x64F4, 0x64F4, 0x1FED, 0x64F5, 0x64F6, 0x3403,
+ 0x64F7, 0x64F7, 0x2365, 0x64F8, 0x64F9, 0x3405, 0x64FA, 0x64FA, 0x1E2D,
+ 0x64FB, 0x64FB, 0x2152, 0x64FC, 0x64FC, 0x2366, 0x64FD, 0x64FD, 0x3407,
+ 0x64FE, 0x64FE, 0x20FA, 0x64FF, 0x64FF, 0x3408, 0x6500, 0x6500, 0x0B8B,
+ 0x6501, 0x6503, 0x3409, 0x6504, 0x6504, 0x2363, 0x6505, 0x6505, 0x340C,
+ 0x6506, 0x6506, 0x209A, 0x6507, 0x6508, 0x340D, 0x6509, 0x6509, 0x14F3,
+ 0x650A, 0x650E, 0x340F, 0x650F, 0x650F, 0x203C, 0x6510, 0x6511, 0x3414,
+ 0x6512, 0x6512, 0x111F, 0x6513, 0x6513, 0x3416, 0x6514, 0x6514, 0x1FF6,
+ 0x6515, 0x6515, 0x3417, 0x6516, 0x6516, 0x2364, 0x6517, 0x6517, 0x3418,
+ 0x6518, 0x6518, 0x0C9C, 0x6519, 0x6519, 0x1E69, 0x651A, 0x651A, 0x3419,
+ 0x651B, 0x651B, 0x2367, 0x651C, 0x651C, 0x341A, 0x651D, 0x651D, 0x211D,
+ 0x651E, 0x6521, 0x341B, 0x6522, 0x6522, 0x2259, 0x6523, 0x6523, 0x2056,
+ 0x6524, 0x6524, 0x2163, 0x6525, 0x6525, 0x14F4, 0x6526, 0x6529, 0x341F,
+ 0x652A, 0x652A, 0x1FA9, 0x652B, 0x652B, 0x091F, 0x652C, 0x652C, 0x1FFC,
+ 0x652D, 0x652D, 0x3423, 0x652E, 0x652E, 0x14F5, 0x652F, 0x652F, 0x11A6,
+ 0x6530, 0x6533, 0x3424, 0x6534, 0x6534, 0x1909, 0x6535, 0x6535, 0x1966,
+ 0x6536, 0x6536, 0x0D6C, 0x6537, 0x6537, 0x3428, 0x6538, 0x6538, 0x12B2,
+ 0x6539, 0x6539, 0x06BF, 0x653A, 0x653A, 0x3429, 0x653B, 0x653B, 0x06FE,
+ 0x653C, 0x653D, 0x342A, 0x653E, 0x653E, 0x0662, 0x653F, 0x653F, 0x119F,
+ 0x6540, 0x6544, 0x342C, 0x6545, 0x6545, 0x0723, 0x6546, 0x6547, 0x3431,
+ 0x6548, 0x6548, 0x0F72, 0x6549, 0x6549, 0x1CCB, 0x654A, 0x654B, 0x3433,
+ 0x654C, 0x654C, 0x05B1, 0x654D, 0x654E, 0x3435, 0x654F, 0x654F, 0x0AF9,
+ 0x6550, 0x6550, 0x3437, 0x6551, 0x6551, 0x08F7, 0x6552, 0x6554, 0x3438,
+ 0x6555, 0x6555, 0x1967, 0x6556, 0x6556, 0x03C8, 0x6557, 0x6557, 0x1E2E,
+ 0x6558, 0x6558, 0x343B, 0x6559, 0x6559, 0x089D, 0x655A, 0x655A, 0x343C,
+ 0x655B, 0x655B, 0x09FB, 0x655C, 0x655C, 0x343D, 0x655D, 0x655D, 0x043F,
+ 0x655E, 0x655E, 0x04CD, 0x655F, 0x6561, 0x343E, 0x6562, 0x6562, 0x06CD,
+ 0x6563, 0x6563, 0x0CDB, 0x6564, 0x6565, 0x3441, 0x6566, 0x6566, 0x0617,
+ 0x6567, 0x656A, 0x3443, 0x656B, 0x656B, 0x1968, 0x656C, 0x656C, 0x08E3,
+ 0x656D, 0x656F, 0x3447, 0x6570, 0x6570, 0x0D94, 0x6571, 0x6571, 0x344A,
+ 0x6572, 0x6572, 0x0C40, 0x6573, 0x6573, 0x344B, 0x6574, 0x6574, 0x119C,
+ 0x6575, 0x6575, 0x1EBC, 0x6576, 0x6576, 0x344C, 0x6577, 0x6577, 0x0690,
+ 0x6578, 0x6578, 0x2142, 0x6579, 0x6581, 0x344D, 0x6582, 0x6582, 0x201E,
+ 0x6583, 0x6583, 0x1E43, 0x6584, 0x6586, 0x3456, 0x6587, 0x6587, 0x0ED3,
+ 0x6588, 0x658A, 0x3459, 0x658B, 0x658B, 0x114C, 0x658C, 0x658C, 0x045C,
+ 0x658D, 0x658F, 0x345C, 0x6590, 0x6590, 0x19C1, 0x6591, 0x6591, 0x03EA,
+ 0x6592, 0x6592, 0x345F, 0x6593, 0x6593, 0x19C3, 0x6594, 0x6594, 0x3460,
+ 0x6595, 0x6595, 0x24D4, 0x6596, 0x6596, 0x3461, 0x6597, 0x6597, 0x05F6,
+ 0x6598, 0x6598, 0x3462, 0x6599, 0x6599, 0x0A18, 0x659A, 0x659A, 0x3463,
+ 0x659B, 0x659B, 0x1D56, 0x659C, 0x659C, 0x0F7C, 0x659D, 0x659E, 0x3464,
+ 0x659F, 0x659F, 0x1186, 0x65A0, 0x65A0, 0x3466, 0x65A1, 0x65A1, 0x0EE2,
+ 0x65A2, 0x65A3, 0x3467, 0x65A4, 0x65A4, 0x08C0, 0x65A5, 0x65A5, 0x0507,
+ 0x65A6, 0x65A6, 0x3469, 0x65A7, 0x65A7, 0x06A6, 0x65A8, 0x65A8, 0x346A,
+ 0x65A9, 0x65A9, 0x1157, 0x65AA, 0x65AA, 0x346B, 0x65AB, 0x65AB, 0x1A29,
+ 0x65AC, 0x65AC, 0x226F, 0x65AD, 0x65AD, 0x060E, 0x65AE, 0x65AE, 0x346C,
+ 0x65AF, 0x65AF, 0x0DAE, 0x65B0, 0x65B0, 0x0F8D, 0x65B1, 0x65B6, 0x346D,
+ 0x65B7, 0x65B7, 0x1ED7, 0x65B8, 0x65B8, 0x3473, 0x65B9, 0x65B9, 0x065A,
+ 0x65BA, 0x65BB, 0x3474, 0x65BC, 0x65BC, 0x19C4, 0x65BD, 0x65BD, 0x0D40,
+ 0x65BE, 0x65C0, 0x3476, 0x65C1, 0x65C1, 0x0B95, 0x65C2, 0x65C2, 0x3479,
+ 0x65C3, 0x65C3, 0x19C7, 0x65C4, 0x65C4, 0x19C6, 0x65C5, 0x65C5, 0x0A6A,
+ 0x65C6, 0x65C6, 0x19C5, 0x65C7, 0x65CA, 0x347A, 0x65CB, 0x65CB, 0x0FC8,
+ 0x65CC, 0x65CC, 0x19C8, 0x65CD, 0x65CD, 0x347E, 0x65CE, 0x65CE, 0x19C9,
+ 0x65CF, 0x65CF, 0x1242, 0x65D0, 0x65D1, 0x347F, 0x65D2, 0x65D2, 0x19CA,
+ 0x65D3, 0x65D5, 0x3481, 0x65D6, 0x65D6, 0x19CB, 0x65D7, 0x65D7, 0x0C0B,
+ 0x65D8, 0x65DF, 0x3484, 0x65E0, 0x65E0, 0x0EED, 0x65E1, 0x65E1, 0x348C,
+ 0x65E2, 0x65E2, 0x083B, 0x65E3, 0x65E4, 0x348D, 0x65E5, 0x65E5, 0x0CB0,
+ 0x65E6, 0x65E6, 0x058A, 0x65E7, 0x65E7, 0x08F8, 0x65E8, 0x65E8, 0x11BB,
+ 0x65E9, 0x65E9, 0x112A, 0x65EA, 0x65EB, 0x348F, 0x65EC, 0x65EC, 0x0FD7,
+ 0x65ED, 0x65ED, 0x0FBC, 0x65EE, 0x65F0, 0x190A, 0x65F1, 0x65F1, 0x076C,
+ 0x65F2, 0x65F5, 0x3491, 0x65F6, 0x65F6, 0x0D48, 0x65F7, 0x65F7, 0x0982,
+ 0x65F8, 0x65F9, 0x3495, 0x65FA, 0x65FA, 0x0EAB, 0x65FB, 0x65FF, 0x3497,
+ 0x6600, 0x6600, 0x1912, 0x6601, 0x6601, 0x349C, 0x6602, 0x6602, 0x03C5,
+ 0x6603, 0x6603, 0x1910, 0x6604, 0x6605, 0x349D, 0x6606, 0x6606, 0x0990,
+ 0x6607, 0x6609, 0x349F, 0x660A, 0x660A, 0x190D, 0x660B, 0x660B, 0x34A2,
+ 0x660C, 0x660C, 0x04C4, 0x660D, 0x660D, 0x34A3, 0x660E, 0x660E, 0x0AFC,
+ 0x660F, 0x660F, 0x07FD, 0x6610, 0x6612, 0x34A4, 0x6613, 0x6613, 0x105E,
+ 0x6614, 0x6614, 0x0F03, 0x6615, 0x6615, 0x1911, 0x6616, 0x6618, 0x34A7,
+ 0x6619, 0x6619, 0x190E, 0x661A, 0x661C, 0x34AA, 0x661D, 0x661D, 0x1915,
+ 0x661E, 0x661E, 0x34AD, 0x661F, 0x661F, 0x0F92, 0x6620, 0x6620, 0x1098,
+ 0x6621, 0x6624, 0x34AE, 0x6625, 0x6625, 0x053D, 0x6626, 0x6626, 0x34B2,
+ 0x6627, 0x6627, 0x0AC6, 0x6628, 0x6628, 0x124F, 0x6629, 0x662C, 0x34B3,
+ 0x662D, 0x662D, 0x1172, 0x662E, 0x662E, 0x34B7, 0x662F, 0x662F, 0x0D5E,
+ 0x6630, 0x6630, 0x34B8, 0x6631, 0x6631, 0x1917, 0x6632, 0x6633, 0x34B9,
+ 0x6634, 0x6634, 0x1916, 0x6635, 0x6635, 0x1919, 0x6636, 0x6636, 0x1918,
+ 0x6637, 0x663B, 0x34BB, 0x663C, 0x663C, 0x11E6, 0x663D, 0x663D, 0x34C0,
+ 0x663E, 0x663E, 0x0F41, 0x663F, 0x6640, 0x34C1, 0x6641, 0x6641, 0x191D,
+ 0x6642, 0x6642, 0x212D, 0x6643, 0x6643, 0x07E3, 0x6644, 0x664A, 0x34C3,
+ 0x664B, 0x664B, 0x08CB, 0x664C, 0x664C, 0x0D07, 0x664D, 0x664E, 0x34CA,
+ 0x664F, 0x664F, 0x191E, 0x6650, 0x6651, 0x34CC, 0x6652, 0x6652, 0x0CF2,
+ 0x6653, 0x6653, 0x0F6B, 0x6654, 0x6654, 0x191C, 0x6655, 0x6655, 0x1111,
+ 0x6656, 0x6656, 0x191F, 0x6657, 0x6657, 0x1921, 0x6658, 0x6659, 0x34CE,
+ 0x665A, 0x665A, 0x0E9E, 0x665B, 0x665C, 0x34D0, 0x665D, 0x665D, 0x229B,
+ 0x665E, 0x665E, 0x34D2, 0x665F, 0x665F, 0x191B, 0x6660, 0x6660, 0x34D3,
+ 0x6661, 0x6661, 0x1920, 0x6662, 0x6663, 0x34D4, 0x6664, 0x6664, 0x0EFD,
+ 0x6665, 0x6665, 0x34D6, 0x6666, 0x6666, 0x07F3, 0x6667, 0x6667, 0x34D7,
+ 0x6668, 0x6668, 0x04E4, 0x6669, 0x666D, 0x34D8, 0x666E, 0x666E, 0x0BF4,
+ 0x666F, 0x666F, 0x08DF, 0x6670, 0x6670, 0x0F09, 0x6671, 0x6673, 0x34DD,
+ 0x6674, 0x6674, 0x0C64, 0x6675, 0x6675, 0x34E0, 0x6676, 0x6676, 0x08D6,
+ 0x6677, 0x6677, 0x1922, 0x6678, 0x6679, 0x34E1, 0x667A, 0x667A, 0x11C6,
+ 0x667B, 0x667D, 0x34E3, 0x667E, 0x667E, 0x0A09, 0x667F, 0x6681, 0x34E6,
+ 0x6682, 0x6682, 0x1120, 0x6683, 0x6683, 0x34E9, 0x6684, 0x6684, 0x1923,
+ 0x6685, 0x6686, 0x34EA, 0x6687, 0x6687, 0x0F2B, 0x6688, 0x6688, 0x2256,
+ 0x6689, 0x6689, 0x24A8, 0x668A, 0x668B, 0x34EC, 0x668C, 0x668C, 0x1924,
+ 0x668D, 0x6690, 0x34EE, 0x6691, 0x6691, 0x0D85, 0x6692, 0x6695, 0x34F2,
+ 0x6696, 0x6696, 0x0B70, 0x6697, 0x6697, 0x03C0, 0x6698, 0x669C, 0x34F6,
+ 0x669D, 0x669D, 0x1926, 0x669E, 0x66A1, 0x34FB, 0x66A2, 0x66A2, 0x1E79,
+ 0x66A3, 0x66A6, 0x34FF, 0x66A7, 0x66A7, 0x1925, 0x66A8, 0x66A8, 0x1CDD,
+ 0x66A9, 0x66AA, 0x3503, 0x66AB, 0x66AB, 0x225A, 0x66AC, 0x66AD, 0x3505,
+ 0x66AE, 0x66AE, 0x0B1D, 0x66AF, 0x66B3, 0x3507, 0x66B4, 0x66B4, 0x0412,
+ 0x66B5, 0x66B8, 0x350C, 0x66B9, 0x66B9, 0x175B, 0x66BA, 0x66BD, 0x3510,
+ 0x66BE, 0x66BE, 0x1927, 0x66BF, 0x66C3, 0x3514, 0x66C4, 0x66C4, 0x24A7,
+ 0x66C5, 0x66C5, 0x3519, 0x66C6, 0x66C6, 0x2686, 0x66C7, 0x66C7, 0x24A6,
+ 0x66C8, 0x66C8, 0x351A, 0x66C9, 0x66C9, 0x21CE, 0x66CA, 0x66D5, 0x351B,
+ 0x66D6, 0x66D6, 0x24A9, 0x66D7, 0x66D8, 0x3527, 0x66D9, 0x66D9, 0x0D86,
+ 0x66DA, 0x66DA, 0x3529, 0x66DB, 0x66DC, 0x1928, 0x66DD, 0x66DD, 0x0BF7,
+ 0x66DE, 0x66DF, 0x352A, 0x66E0, 0x66E0, 0x1FE7, 0x66E1, 0x66E5, 0x352C,
+ 0x66E6, 0x66E6, 0x192A, 0x66E7, 0x66E8, 0x3531, 0x66E9, 0x66E9, 0x192B,
+ 0x66EA, 0x66EB, 0x3533, 0x66EC, 0x66EC, 0x2112, 0x66ED, 0x66EF, 0x3535,
+ 0x66F0, 0x66F0, 0x10FE, 0x66F1, 0x66F1, 0x3538, 0x66F2, 0x66F2, 0x0C77,
+ 0x66F3, 0x66F3, 0x103E, 0x66F4, 0x66F4, 0x06F7, 0x66F5, 0x66F6, 0x3539,
+ 0x66F7, 0x66F7, 0x1914, 0x66F8, 0x66F8, 0x213C, 0x66F9, 0x66F9, 0x04A3,
+ 0x66FA, 0x66FB, 0x353B, 0x66FC, 0x66FC, 0x0AA3, 0x66FD, 0x66FD, 0x353D,
+ 0x66FE, 0x66FE, 0x113B, 0x66FF, 0x66FF, 0x0E39, 0x6700, 0x6700, 0x124B,
+ 0x6701, 0x6702, 0x353E, 0x6703, 0x6703, 0x1F5C, 0x6704, 0x6707, 0x3540,
+ 0x6708, 0x6708, 0x1105, 0x6709, 0x6709, 0x10B5, 0x670A, 0x670A, 0x1973,
+ 0x670B, 0x670B, 0x0BB4, 0x670C, 0x670C, 0x3544, 0x670D, 0x670D, 0x069B,
+ 0x670E, 0x670F, 0x3545, 0x6710, 0x6710, 0x1984, 0x6711, 0x6713, 0x3547,
+ 0x6714, 0x6714, 0x0DAC, 0x6715, 0x6715, 0x198E, 0x6716, 0x6716, 0x354A,
+ 0x6717, 0x6717, 0x09B5, 0x6718, 0x671A, 0x354B, 0x671B, 0x671B, 0x0EAC,
+ 0x671C, 0x671C, 0x354E, 0x671D, 0x671D, 0x04D4, 0x671E, 0x671E, 0x354F,
+ 0x671F, 0x671F, 0x0BF9, 0x6720, 0x6725, 0x3550, 0x6726, 0x6726, 0x19AC,
+ 0x6727, 0x6727, 0x24C4, 0x6728, 0x6728, 0x0B21, 0x6729, 0x6729, 0x3556,
+ 0x672A, 0x672A, 0x0EC3, 0x672B, 0x672B, 0x0B0C, 0x672C, 0x672C, 0x0427,
+ 0x672D, 0x672D, 0x1140, 0x672E, 0x672E, 0x3557, 0x672F, 0x672F, 0x0D8C,
+ 0x6730, 0x6730, 0x3558, 0x6731, 0x6731, 0x11EB, 0x6732, 0x6733, 0x3559,
+ 0x6734, 0x6734, 0x0BF2, 0x6735, 0x6735, 0x0623, 0x6736, 0x6739, 0x355B,
+ 0x673A, 0x673A, 0x080F, 0x673B, 0x673C, 0x355F, 0x673D, 0x673D, 0x0FAB,
+ 0x673E, 0x673F, 0x3561, 0x6740, 0x6740, 0x0CEA, 0x6741, 0x6741, 0x3563,
+ 0x6742, 0x6742, 0x1116, 0x6743, 0x6743, 0x0C83, 0x6744, 0x6745, 0x3564,
+ 0x6746, 0x6746, 0x06C6, 0x6747, 0x6747, 0x3566, 0x6748, 0x6748, 0x1854,
+ 0x6749, 0x6749, 0x0CF5, 0x674A, 0x674B, 0x3567, 0x674C, 0x674C, 0x1851,
+ 0x674D, 0x674D, 0x3569, 0x674E, 0x674E, 0x09D9, 0x674F, 0x674F, 0x0F9E,
+ 0x6750, 0x6750, 0x048B, 0x6751, 0x6751, 0x0568, 0x6752, 0x6752, 0x356A,
+ 0x6753, 0x6753, 0x1852, 0x6754, 0x6755, 0x356B, 0x6756, 0x6756, 0x1169,
+ 0x6757, 0x675B, 0x356D, 0x675C, 0x675C, 0x0604, 0x675D, 0x675D, 0x3572,
+ 0x675E, 0x675E, 0x1853, 0x675F, 0x675F, 0x0D8F, 0x6760, 0x6760, 0x06D7,
+ 0x6761, 0x6761, 0x0E48, 0x6762, 0x6764, 0x3573, 0x6765, 0x6765, 0x099F,
+ 0x6766, 0x6767, 0x3576, 0x6768, 0x6768, 0x1017, 0x6769, 0x6769, 0x1855,
+ 0x676A, 0x676A, 0x1858, 0x676B, 0x676C, 0x3578, 0x676D, 0x676D, 0x0773,
+ 0x676E, 0x676E, 0x357A, 0x676F, 0x676F, 0x0416, 0x6770, 0x6770, 0x08AD,
+ 0x6771, 0x6771, 0x1ECC, 0x6772, 0x6772, 0x190F, 0x6773, 0x6773, 0x1859,
+ 0x6774, 0x6774, 0x357B, 0x6775, 0x6775, 0x185C, 0x6776, 0x6776, 0x357C,
+ 0x6777, 0x6777, 0x1861, 0x6778, 0x677B, 0x357D, 0x677C, 0x677C, 0x1862,
+ 0x677D, 0x677D, 0x3581, 0x677E, 0x677E, 0x0DBE, 0x677F, 0x677F, 0x03F0,
+ 0x6780, 0x6780, 0x3582, 0x6781, 0x6781, 0x081E, 0x6782, 0x6783, 0x3583,
+ 0x6784, 0x6784, 0x0712, 0x6785, 0x6786, 0x3585, 0x6787, 0x6787, 0x1857,
+ 0x6788, 0x6788, 0x3587, 0x6789, 0x6789, 0x0EA8, 0x678A, 0x678A, 0x3588,
+ 0x678B, 0x678B, 0x1860, 0x678C, 0x678F, 0x3589, 0x6790, 0x6790, 0x0F05,
+ 0x6791, 0x6794, 0x358D, 0x6795, 0x6795, 0x118E, 0x6796, 0x6796, 0x3591,
+ 0x6797, 0x6797, 0x0A1F, 0x6798, 0x6798, 0x185A, 0x6799, 0x6799, 0x3592,
+ 0x679A, 0x679A, 0x0ABB, 0x679B, 0x679B, 0x3593, 0x679C, 0x679C, 0x0754,
+ 0x679D, 0x679D, 0x11A5, 0x679E, 0x679E, 0x185E, 0x679F, 0x67A1, 0x3594,
+ 0x67A2, 0x67A2, 0x0D77, 0x67A3, 0x67A3, 0x1129, 0x67A4, 0x67A4, 0x3597,
+ 0x67A5, 0x67A5, 0x1856, 0x67A6, 0x67A6, 0x3598, 0x67A7, 0x67A7, 0x185B,
+ 0x67A8, 0x67A8, 0x185D, 0x67A9, 0x67A9, 0x3599, 0x67AA, 0x67AA, 0x0C36,
+ 0x67AB, 0x67AB, 0x0680, 0x67AC, 0x67AC, 0x359A, 0x67AD, 0x67AD, 0x185F,
+ 0x67AE, 0x67AE, 0x359B, 0x67AF, 0x67AF, 0x096A, 0x67B0, 0x67B0, 0x1868,
+ 0x67B1, 0x67B2, 0x359C, 0x67B3, 0x67B3, 0x186D, 0x67B4, 0x67B4, 0x359E,
+ 0x67B5, 0x67B5, 0x186B, 0x67B6, 0x67B6, 0x084F, 0x67B7, 0x67B7, 0x0842,
+ 0x67B8, 0x67B8, 0x1871, 0x67B9, 0x67C0, 0x359F, 0x67C1, 0x67C1, 0x1874,
+ 0x67C2, 0x67C2, 0x35A7, 0x67C3, 0x67C3, 0x1870, 0x67C4, 0x67C4, 0x0463,
+ 0x67C5, 0x67CE, 0x35A8, 0x67CF, 0x67CF, 0x03E3, 0x67D0, 0x67D0, 0x0B16,
+ 0x67D1, 0x67D1, 0x06C7, 0x67D2, 0x67D2, 0x0C01, 0x67D3, 0x67D3, 0x0C99,
+ 0x67D4, 0x67D4, 0x0CBC, 0x67D5, 0x67D7, 0x35B2, 0x67D8, 0x67D8, 0x1865,
+ 0x67D9, 0x67D9, 0x186A, 0x67DA, 0x67DA, 0x186C, 0x67DB, 0x67DB, 0x35B5,
+ 0x67DC, 0x67DC, 0x074A, 0x67DD, 0x67DD, 0x186E, 0x67DE, 0x67DE, 0x1252,
+ 0x67DF, 0x67DF, 0x35B6, 0x67E0, 0x67E0, 0x0B5E, 0x67E1, 0x67E1, 0x35B7,
+ 0x67E2, 0x67E2, 0x1872, 0x67E3, 0x67E4, 0x35B8, 0x67E5, 0x67E5, 0x04B0,
+ 0x67E6, 0x67E8, 0x35BA, 0x67E9, 0x67E9, 0x1867, 0x67EA, 0x67EB, 0x35BD,
+ 0x67EC, 0x67EC, 0x0860, 0x67ED, 0x67EE, 0x35BF, 0x67EF, 0x67EF, 0x094F,
+ 0x67F0, 0x67F0, 0x1863, 0x67F1, 0x67F1, 0x11F8, 0x67F2, 0x67F2, 0x35C1,
+ 0x67F3, 0x67F3, 0x0A41, 0x67F4, 0x67F4, 0x04B8, 0x67F5, 0x67FC, 0x35C2,
+ 0x67FD, 0x67FD, 0x1875, 0x67FE, 0x67FE, 0x35CA, 0x67FF, 0x67FF, 0x0D58,
+ 0x6800, 0x6800, 0x186F, 0x6801, 0x6804, 0x35CB, 0x6805, 0x6805, 0x1145,
+ 0x6806, 0x6806, 0x35CF, 0x6807, 0x6807, 0x0453, 0x6808, 0x6808, 0x115C,
+ 0x6809, 0x6809, 0x1864, 0x680A, 0x680A, 0x1866, 0x680B, 0x680B, 0x05EF,
+ 0x680C, 0x680C, 0x1869, 0x680D, 0x680D, 0x35D0, 0x680E, 0x680E, 0x1873,
+ 0x680F, 0x680F, 0x09A3, 0x6810, 0x6810, 0x35D1, 0x6811, 0x6811, 0x0D8E,
+ 0x6812, 0x6812, 0x35D2, 0x6813, 0x6813, 0x0D9D, 0x6814, 0x6815, 0x35D3,
+ 0x6816, 0x6816, 0x0BFB, 0x6817, 0x6817, 0x09E0, 0x6818, 0x681C, 0x35D5,
+ 0x681D, 0x681D, 0x187F, 0x681E, 0x6820, 0x35DA, 0x6821, 0x6821, 0x0F6E,
+ 0x6822, 0x6828, 0x35DD, 0x6829, 0x6829, 0x1888, 0x682A, 0x682A, 0x11E9,
+ 0x682B, 0x6831, 0x35E4, 0x6832, 0x6833, 0x1876, 0x6834, 0x6836, 0x35EB,
+ 0x6837, 0x6837, 0x1022, 0x6838, 0x6838, 0x0782, 0x6839, 0x6839, 0x06F4,
+ 0x683A, 0x683B, 0x35EE, 0x683C, 0x683C, 0x06EC, 0x683D, 0x683D, 0x1117,
+ 0x683E, 0x683E, 0x1885, 0x683F, 0x683F, 0x35F0, 0x6840, 0x6840, 0x1884,
+ 0x6841, 0x6841, 0x1882, 0x6842, 0x6842, 0x0749, 0x6843, 0x6843, 0x0E25,
+ 0x6844, 0x6844, 0x187C, 0x6845, 0x6845, 0x0EB5, 0x6846, 0x6846, 0x097F,
+ 0x6847, 0x6847, 0x35F1, 0x6848, 0x6848, 0x03C3, 0x6849, 0x6849, 0x1887,
+ 0x684A, 0x684A, 0x1886, 0x684B, 0x684B, 0x35F2, 0x684C, 0x684C, 0x121D,
+ 0x684D, 0x684D, 0x35F3, 0x684E, 0x684E, 0x187A, 0x684F, 0x684F, 0x35F4,
+ 0x6850, 0x6850, 0x0E5A, 0x6851, 0x6851, 0x0CDC, 0x6852, 0x6852, 0x35F5,
+ 0x6853, 0x6853, 0x07CD, 0x6854, 0x6854, 0x08AC, 0x6855, 0x6855, 0x1880,
+ 0x6856, 0x685F, 0x35F6, 0x6860, 0x6861, 0x1878, 0x6862, 0x6862, 0x187B,
+ 0x6863, 0x6863, 0x0596, 0x6864, 0x6864, 0x187D, 0x6865, 0x6865, 0x0C42,
+ 0x6866, 0x6866, 0x1881, 0x6867, 0x6867, 0x1883, 0x6868, 0x6868, 0x0881,
+ 0x6869, 0x6869, 0x120B, 0x686A, 0x686A, 0x3600, 0x686B, 0x686B, 0x188E,
+ 0x686C, 0x6873, 0x3601, 0x6874, 0x6874, 0x188B, 0x6875, 0x6875, 0x3609,
+ 0x6876, 0x6876, 0x0E61, 0x6877, 0x6877, 0x188C, 0x6878, 0x6880, 0x360A,
+ 0x6881, 0x6881, 0x0A03, 0x6882, 0x6882, 0x3613, 0x6883, 0x6883, 0x187E,
+ 0x6884, 0x6884, 0x3614, 0x6885, 0x6885, 0x0ABC, 0x6886, 0x6886, 0x03FB,
+ 0x6887, 0x688E, 0x3615, 0x688F, 0x688F, 0x188A, 0x6890, 0x6892, 0x361D,
+ 0x6893, 0x6893, 0x188D, 0x6894, 0x6896, 0x3620, 0x6897, 0x6897, 0x06FC,
+ 0x6898, 0x6898, 0x246A, 0x6899, 0x689C, 0x3623, 0x689D, 0x689D, 0x2175,
+ 0x689E, 0x689E, 0x3627, 0x689F, 0x689F, 0x246D, 0x68A0, 0x68A1, 0x3628,
+ 0x68A2, 0x68A2, 0x0D0B, 0x68A3, 0x68A5, 0x362A, 0x68A6, 0x68A6, 0x0AD3,
+ 0x68A7, 0x68A7, 0x0EEF, 0x68A8, 0x68A8, 0x09D1, 0x68A9, 0x68AC, 0x362D,
+ 0x68AD, 0x68AD, 0x0DE8, 0x68AE, 0x68AE, 0x3631, 0x68AF, 0x68AF, 0x0E30,
+ 0x68B0, 0x68B0, 0x0F80, 0x68B1, 0x68B2, 0x3632, 0x68B3, 0x68B3, 0x0D78,
+ 0x68B4, 0x68B4, 0x3634, 0x68B5, 0x68B5, 0x1889, 0x68B6, 0x68BF, 0x3635,
+ 0x68C0, 0x68C0, 0x085F, 0x68C1, 0x68C1, 0x363F, 0x68C2, 0x68C2, 0x188F,
+ 0x68C3, 0x68C8, 0x3640, 0x68C9, 0x68C9, 0x0AE3, 0x68CA, 0x68CA, 0x3646,
+ 0x68CB, 0x68CB, 0x0C04, 0x68CC, 0x68CC, 0x3647, 0x68CD, 0x68CD, 0x0750,
+ 0x68CE, 0x68D1, 0x3648, 0x68D2, 0x68D2, 0x03FF, 0x68D3, 0x68D4, 0x364C,
+ 0x68D5, 0x68D5, 0x1235, 0x68D6, 0x68D6, 0x246B, 0x68D7, 0x68D7, 0x225F,
+ 0x68D8, 0x68D8, 0x081F, 0x68D9, 0x68D9, 0x364E, 0x68DA, 0x68DA, 0x0BB0,
+ 0x68DB, 0x68DE, 0x364F, 0x68DF, 0x68DF, 0x1ECE, 0x68E0, 0x68E0, 0x0E17,
+ 0x68E1, 0x68E2, 0x3653, 0x68E3, 0x68E3, 0x189A, 0x68E4, 0x68E6, 0x3655,
+ 0x68E7, 0x68E7, 0x2272, 0x68E8, 0x68ED, 0x3658, 0x68EE, 0x68EE, 0x0CE6,
+ 0x68EF, 0x68EF, 0x365E, 0x68F0, 0x68F0, 0x1896, 0x68F1, 0x68F1, 0x09CD,
+ 0x68F2, 0x68F4, 0x365F, 0x68F5, 0x68F5, 0x0950, 0x68F6, 0x68F8, 0x3662,
+ 0x68F9, 0x68F9, 0x1894, 0x68FA, 0x68FA, 0x0730, 0x68FB, 0x68FB, 0x3665,
+ 0x68FC, 0x68FC, 0x1891, 0x68FD, 0x68FF, 0x3666, 0x6900, 0x6900, 0x3669,
+ 0x6901, 0x6901, 0x1898, 0x6902, 0x6904, 0x366A, 0x6905, 0x6905, 0x1055,
+ 0x6906, 0x690A, 0x366D, 0x690B, 0x690B, 0x1897, 0x690C, 0x690C, 0x3672,
+ 0x690D, 0x690D, 0x11B1, 0x690E, 0x690E, 0x1212, 0x690F, 0x690F, 0x2473,
+ 0x6910, 0x6910, 0x189B, 0x6911, 0x6911, 0x3673, 0x6912, 0x6912, 0x0888,
+ 0x6913, 0x691E, 0x3674, 0x691F, 0x6920, 0x1892, 0x6921, 0x6923, 0x3680,
+ 0x6924, 0x6924, 0x1895, 0x6925, 0x692C, 0x3683, 0x692D, 0x692D, 0x0E87,
+ 0x692E, 0x692F, 0x368B, 0x6930, 0x6930, 0x1033, 0x6931, 0x6933, 0x368D,
+ 0x6934, 0x6934, 0x18A6, 0x6935, 0x6938, 0x3690, 0x6939, 0x6939, 0x189D,
+ 0x693A, 0x693C, 0x3694, 0x693D, 0x693D, 0x052D, 0x693E, 0x693E, 0x3697,
+ 0x693F, 0x693F, 0x053E, 0x6940, 0x6941, 0x3698, 0x6942, 0x6942, 0x189F,
+ 0x6943, 0x6949, 0x369A, 0x694A, 0x694A, 0x21FE, 0x694B, 0x6952, 0x36A1,
+ 0x6953, 0x6953, 0x1EFE, 0x6954, 0x6954, 0x0F73, 0x6955, 0x6956, 0x36A9,
+ 0x6957, 0x6957, 0x1899, 0x6958, 0x6959, 0x36AB, 0x695A, 0x695A, 0x0523,
+ 0x695B, 0x695C, 0x36AD, 0x695D, 0x695D, 0x18A0, 0x695E, 0x695E, 0x09CE,
+ 0x695F, 0x695F, 0x36AF, 0x6960, 0x6960, 0x189E, 0x6961, 0x6962, 0x36B0,
+ 0x6963, 0x6963, 0x18AD, 0x6964, 0x6965, 0x36B2, 0x6966, 0x6966, 0x18AC,
+ 0x6967, 0x6967, 0x36B4, 0x6968, 0x6968, 0x2475, 0x6969, 0x696A, 0x36B5,
+ 0x696B, 0x696B, 0x18A2, 0x696C, 0x696C, 0x36B7, 0x696D, 0x696D, 0x220A,
+ 0x696E, 0x696E, 0x1890, 0x696F, 0x6970, 0x36B8, 0x6971, 0x6971, 0x189C,
+ 0x6972, 0x6974, 0x36BA, 0x6975, 0x6975, 0x1F6F, 0x6976, 0x6976, 0x36BD,
+ 0x6977, 0x6977, 0x0939, 0x6978, 0x6978, 0x18A5, 0x6979, 0x6979, 0x18AE,
+ 0x697A, 0x697B, 0x36BE, 0x697C, 0x697C, 0x0A4C, 0x697D, 0x697F, 0x36C0,
+ 0x6980, 0x6980, 0x18A3, 0x6981, 0x6981, 0x36C3, 0x6982, 0x6982, 0x06C0,
+ 0x6983, 0x6983, 0x36C4, 0x6984, 0x6984, 0x18A1, 0x6985, 0x6985, 0x36C5,
+ 0x6986, 0x6986, 0x10C1, 0x6987, 0x6988, 0x18A8, 0x6989, 0x6989, 0x18AB,
+ 0x698A, 0x698C, 0x36C6, 0x698D, 0x698D, 0x18BB, 0x698E, 0x6993, 0x36C9,
+ 0x6994, 0x6994, 0x09B1, 0x6995, 0x6995, 0x18B9, 0x6996, 0x6997, 0x36CF,
+ 0x6998, 0x6998, 0x18A4, 0x6999, 0x699A, 0x36D1, 0x699B, 0x699B, 0x18AF,
+ 0x699C, 0x699C, 0x03FC, 0x699D, 0x69A6, 0x36D3, 0x69A7, 0x69A7, 0x18B0,
+ 0x69A8, 0x69A8, 0x1146, 0x69A9, 0x69A9, 0x36DD, 0x69AA, 0x69AA, 0x2468,
+ 0x69AB, 0x69AB, 0x18B2, 0x69AC, 0x69AC, 0x36DE, 0x69AD, 0x69AD, 0x18B3,
+ 0x69AE, 0x69AE, 0x2100, 0x69AF, 0x69B0, 0x36DF, 0x69B1, 0x69B1, 0x18B5,
+ 0x69B2, 0x69B3, 0x36E1, 0x69B4, 0x69B4, 0x0A3A, 0x69B5, 0x69B6, 0x36E3,
+ 0x69B7, 0x69B7, 0x0C91, 0x69B8, 0x69BA, 0x36E5, 0x69BB, 0x69BB, 0x18B1,
+ 0x69BC, 0x69BE, 0x36E8, 0x69BF, 0x69BF, 0x2476, 0x69C0, 0x69C0, 0x36EB,
+ 0x69C1, 0x69C1, 0x18B6, 0x69C2, 0x69C9, 0x36EC, 0x69CA, 0x69CA, 0x18B7,
+ 0x69CB, 0x69CB, 0x1F27, 0x69CC, 0x69CC, 0x18A7, 0x69CD, 0x69CD, 0x20D7,
+ 0x69CE, 0x69CE, 0x18AA, 0x69CF, 0x69CF, 0x36F4, 0x69D0, 0x69D0, 0x07C6,
+ 0x69D1, 0x69D3, 0x36F5, 0x69D4, 0x69D4, 0x18B4, 0x69D5, 0x69DA, 0x36F8,
+ 0x69DB, 0x69DB, 0x086A, 0x69DC, 0x69DE, 0x36FE, 0x69DF, 0x69DF, 0x18B8,
+ 0x69E0, 0x69E0, 0x18BA, 0x69E1, 0x69E6, 0x3701, 0x69E7, 0x69E7, 0x247C,
+ 0x69E8, 0x69EC, 0x3707, 0x69ED, 0x69ED, 0x18BE, 0x69EE, 0x69F1, 0x370C,
+ 0x69F2, 0x69F2, 0x18C2, 0x69F3, 0x69F3, 0x1FA1, 0x69F4, 0x69FC, 0x3710,
+ 0x69FD, 0x69FD, 0x04A2, 0x69FE, 0x69FE, 0x3719, 0x69FF, 0x69FF, 0x18BC,
+ 0x6A00, 0x6A00, 0x371A, 0x6A01, 0x6A01, 0x22AA, 0x6A02, 0x6A02, 0x2005,
+ 0x6A03, 0x6A04, 0x371B, 0x6A05, 0x6A05, 0x246C, 0x6A06, 0x6A09, 0x371D,
+ 0x6A0A, 0x6A0A, 0x064B, 0x6A0B, 0x6A12, 0x3721, 0x6A13, 0x6A13, 0x203E,
+ 0x6A14, 0x6A16, 0x3729, 0x6A17, 0x6A18, 0x18BF, 0x6A19, 0x6A19, 0x1E4C,
+ 0x6A1A, 0x6A1D, 0x372C, 0x6A1E, 0x6A1E, 0x213A, 0x6A1F, 0x6A1F, 0x1162,
+ 0x6A20, 0x6A20, 0x3730, 0x6A21, 0x6A21, 0x0B06, 0x6A22, 0x6A22, 0x3731,
+ 0x6A23, 0x6A23, 0x2204, 0x6A24, 0x6A27, 0x3732, 0x6A28, 0x6A28, 0x18CC,
+ 0x6A29, 0x6A29, 0x3736, 0x6A2A, 0x6A2A, 0x0798, 0x6A2B, 0x6A2E, 0x3737,
+ 0x6A2F, 0x6A2F, 0x18BD, 0x6A30, 0x6A30, 0x373B, 0x6A31, 0x6A31, 0x1088,
+ 0x6A32, 0x6A34, 0x373C, 0x6A35, 0x6A35, 0x18C8, 0x6A36, 0x6A37, 0x373F,
+ 0x6A38, 0x6A38, 0x20C3, 0x6A39, 0x6A39, 0x2140, 0x6A3A, 0x6A3A, 0x2477,
+ 0x6A3B, 0x6A3C, 0x3741, 0x6A3D, 0x6A3D, 0x18CB, 0x6A3E, 0x6A3E, 0x18C4,
+ 0x6A3F, 0x6A43, 0x3743, 0x6A44, 0x6A44, 0x18C3, 0x6A45, 0x6A46, 0x3748,
+ 0x6A47, 0x6A47, 0x0C3E, 0x6A48, 0x6A48, 0x2474, 0x6A49, 0x6A4A, 0x374A,
+ 0x6A4B, 0x6A4B, 0x20DD, 0x6A4C, 0x6A4F, 0x374C, 0x6A50, 0x6A50, 0x18C6,
+ 0x6A51, 0x6A57, 0x3750, 0x6A58, 0x6A58, 0x18CD, 0x6A59, 0x6A59, 0x04ED,
+ 0x6A5A, 0x6A5A, 0x3757, 0x6A5B, 0x6A5B, 0x18C7, 0x6A5C, 0x6A5E, 0x3758,
+ 0x6A5F, 0x6A5F, 0x1F68, 0x6A60, 0x6A60, 0x375B, 0x6A61, 0x6A61, 0x0F5D,
+ 0x6A62, 0x6A62, 0x2185, 0x6A63, 0x6A64, 0x375C, 0x6A65, 0x6A65, 0x18C1,
+ 0x6A66, 0x6A70, 0x375E, 0x6A71, 0x6A71, 0x051C, 0x6A72, 0x6A78, 0x3769,
+ 0x6A79, 0x6A79, 0x18CA, 0x6A7A, 0x6A7B, 0x3770, 0x6A7C, 0x6A7C, 0x18CE,
+ 0x6A7D, 0x6A7F, 0x3772, 0x6A80, 0x6A80, 0x0E07, 0x6A81, 0x6A83, 0x3775,
+ 0x6A84, 0x6A84, 0x0F1A, 0x6A85, 0x6A88, 0x3778, 0x6A89, 0x6A89, 0x2472,
+ 0x6A8A, 0x6A8D, 0x377C, 0x6A8E, 0x6A8E, 0x18C9, 0x6A8F, 0x6A8F, 0x3780,
+ 0x6A90, 0x6A90, 0x18D0, 0x6A91, 0x6A91, 0x18CF, 0x6A92, 0x6A93, 0x3781,
+ 0x6A94, 0x6A94, 0x1EB5, 0x6A95, 0x6A96, 0x3783, 0x6A97, 0x6A97, 0x18D2,
+ 0x6A98, 0x6A9B, 0x3785, 0x6A9C, 0x6A9C, 0x2478, 0x6A9D, 0x6A9F, 0x3789,
+ 0x6AA0, 0x6AA0, 0x18C5, 0x6AA1, 0x6AA1, 0x378C, 0x6AA2, 0x6AA2, 0x1F8B,
+ 0x6AA3, 0x6AA3, 0x2484, 0x6AA4, 0x6AA8, 0x378D, 0x6AA9, 0x6AA9, 0x18D1,
+ 0x6AAA, 0x6AAA, 0x3792, 0x6AAB, 0x6AAB, 0x18D3, 0x6AAC, 0x6AAC, 0x0ACF,
+ 0x6AAD, 0x6AAE, 0x3793, 0x6AAF, 0x6AAF, 0x2699, 0x6AB0, 0x6AB2, 0x3795,
+ 0x6AB3, 0x6AB3, 0x2482, 0x6AB4, 0x6AB7, 0x3798, 0x6AB8, 0x6AB8, 0x20A1,
+ 0x6AB9, 0x6ABA, 0x379C, 0x6ABB, 0x6ABB, 0x1F92, 0x6ABC, 0x6AC2, 0x379E,
+ 0x6AC3, 0x6AC3, 0x1F38, 0x6AC4, 0x6AD2, 0x37A5, 0x6AD3, 0x6AD3, 0x2485,
+ 0x6AD4, 0x6AD9, 0x37B4, 0x6ADA, 0x6ADA, 0x2480, 0x6ADB, 0x6ADB, 0x246E,
+ 0x6ADC, 0x6ADC, 0x37BA, 0x6ADD, 0x6ADD, 0x247B, 0x6ADE, 0x6ADE, 0x2486,
+ 0x6ADF, 0x6ADF, 0x2471, 0x6AE0, 0x6AE6, 0x37BB, 0x6AE7, 0x6AE7, 0x2483,
+ 0x6AE8, 0x6AE8, 0x2470, 0x6AE9, 0x6AE9, 0x37C2, 0x6AEA, 0x6AEA, 0x2469,
+ 0x6AEB, 0x6AEB, 0x37C3, 0x6AEC, 0x6AEC, 0x247F, 0x6AED, 0x6AF2, 0x37C4,
+ 0x6AF3, 0x6AF3, 0x246F, 0x6AF4, 0x6AF7, 0x37CA, 0x6AF8, 0x6AF8, 0x2481,
+ 0x6AF9, 0x6AFA, 0x37CE, 0x6AFB, 0x6AFB, 0x2220, 0x6AFC, 0x6AFF, 0x37D0,
+ 0x6B00, 0x6B03, 0x37D4, 0x6B04, 0x6B04, 0x1FF5, 0x6B05, 0x6B09, 0x37D8,
+ 0x6B0A, 0x6B0A, 0x20F4, 0x6B0B, 0x6B0E, 0x37DD, 0x6B0F, 0x6B0F, 0x247D,
+ 0x6B10, 0x6B11, 0x37E1, 0x6B12, 0x6B12, 0x2479, 0x6B13, 0x6B15, 0x37E3,
+ 0x6B16, 0x6B16, 0x247E, 0x6B17, 0x6B1D, 0x37E6, 0x6B1E, 0x6B1E, 0x247A,
+ 0x6B1F, 0x6B1F, 0x37ED, 0x6B20, 0x6B20, 0x0C34, 0x6B21, 0x6B21, 0x0551,
+ 0x6B22, 0x6B22, 0x07CB, 0x6B23, 0x6B23, 0x0F8B, 0x6B24, 0x6B24, 0x19B1,
+ 0x6B25, 0x6B26, 0x37EE, 0x6B27, 0x6B27, 0x0B78, 0x6B28, 0x6B31, 0x37F0,
+ 0x6B32, 0x6B32, 0x10E0, 0x6B33, 0x6B36, 0x37FA, 0x6B37, 0x6B37, 0x19B2,
+ 0x6B38, 0x6B38, 0x37FE, 0x6B39, 0x6B39, 0x19B3, 0x6B3A, 0x6B3A, 0x0BFA,
+ 0x6B3B, 0x6B3C, 0x37FF, 0x6B3D, 0x6B3D, 0x20E3, 0x6B3E, 0x6B3E, 0x097B,
+ 0x6B3F, 0x6B42, 0x3801, 0x6B43, 0x6B43, 0x19B4, 0x6B44, 0x6B45, 0x3805,
+ 0x6B46, 0x6B46, 0x19B5, 0x6B47, 0x6B47, 0x0F75, 0x6B48, 0x6B48, 0x3807,
+ 0x6B49, 0x6B49, 0x0C35, 0x6B4A, 0x6B4B, 0x3808, 0x6B4C, 0x6B4C, 0x06E3,
+ 0x6B4D, 0x6B4F, 0x380A, 0x6B50, 0x6B50, 0x20AD, 0x6B51, 0x6B58, 0x380D,
+ 0x6B59, 0x6B59, 0x19B6, 0x6B5A, 0x6B5E, 0x3815, 0x6B5F, 0x6B5F, 0x24CB,
+ 0x6B60, 0x6B60, 0x381A, 0x6B61, 0x6B61, 0x1F53, 0x6B62, 0x6B62, 0x11B8,
+ 0x6B63, 0x6B63, 0x119E, 0x6B64, 0x6B64, 0x054E, 0x6B65, 0x6B65, 0x0484,
+ 0x6B66, 0x6B66, 0x0EF3, 0x6B67, 0x6B67, 0x0C06, 0x6B68, 0x6B69, 0x381B,
+ 0x6B6A, 0x6B6A, 0x0E92, 0x6B6B, 0x6B71, 0x381D, 0x6B72, 0x6B72, 0x2159,
+ 0x6B73, 0x6B76, 0x3824, 0x6B77, 0x6B77, 0x2013, 0x6B78, 0x6B78, 0x1F33,
+ 0x6B79, 0x6B79, 0x0578, 0x6B7A, 0x6B7A, 0x3828, 0x6B7B, 0x6B7B, 0x0DB5,
+ 0x6B7C, 0x6B7C, 0x0852, 0x6B7D, 0x6B80, 0x3829, 0x6B81, 0x6B82, 0x18D6,
+ 0x6B83, 0x6B83, 0x1013, 0x6B84, 0x6B84, 0x18D9, 0x6B85, 0x6B85, 0x382D,
+ 0x6B86, 0x6B86, 0x057C, 0x6B87, 0x6B87, 0x18D8, 0x6B88, 0x6B88, 0x382E,
+ 0x6B89, 0x6B89, 0x0FDC, 0x6B8A, 0x6B8A, 0x0D79, 0x6B8B, 0x6B8B, 0x0497,
+ 0x6B8C, 0x6B8C, 0x382F, 0x6B8D, 0x6B8D, 0x18DC, 0x6B8E, 0x6B91, 0x3830,
+ 0x6B92, 0x6B93, 0x18DA, 0x6B94, 0x6B95, 0x3834, 0x6B96, 0x6B96, 0x11B2,
+ 0x6B97, 0x6B97, 0x3836, 0x6B98, 0x6B98, 0x1E5C, 0x6B99, 0x6B99, 0x3837,
+ 0x6B9A, 0x6B9B, 0x18DD, 0x6B9C, 0x6B9D, 0x3838, 0x6B9E, 0x6B9E, 0x2488,
+ 0x6B9F, 0x6BA0, 0x383A, 0x6BA1, 0x6BA1, 0x18DF, 0x6BA2, 0x6BA3, 0x383C,
+ 0x6BA4, 0x6BA4, 0x2487, 0x6BA5, 0x6BA9, 0x383E, 0x6BAA, 0x6BAA, 0x18E0,
+ 0x6BAB, 0x6BAB, 0x248A, 0x6BAC, 0x6BAD, 0x3843, 0x6BAE, 0x6BAE, 0x2489,
+ 0x6BAF, 0x6BAF, 0x248B, 0x6BB0, 0x6BB1, 0x3845, 0x6BB2, 0x6BB2, 0x1F83,
+ 0x6BB3, 0x6BB3, 0x19BD, 0x6BB4, 0x6BB4, 0x0B7A, 0x6BB5, 0x6BB5, 0x060D,
+ 0x6BB6, 0x6BB6, 0x3847, 0x6BB7, 0x6BB7, 0x107A, 0x6BB8, 0x6BB9, 0x3848,
+ 0x6BBA, 0x6BBA, 0x210F, 0x6BBB, 0x6BBB, 0x1FDB, 0x6BBC, 0x6BBE, 0x384A,
+ 0x6BBF, 0x6BBF, 0x05CF, 0x6BC0, 0x6BC0, 0x384D, 0x6BC1, 0x6BC1, 0x07EE,
+ 0x6BC2, 0x6BC2, 0x19BF, 0x6BC3, 0x6BC4, 0x384E, 0x6BC5, 0x6BC5, 0x106A,
+ 0x6BC6, 0x6BC6, 0x20AF, 0x6BC7, 0x6BCA, 0x3850, 0x6BCB, 0x6BCB, 0x0EF2,
+ 0x6BCC, 0x6BCC, 0x3854, 0x6BCD, 0x6BCD, 0x0B1B, 0x6BCE, 0x6BCE, 0x3855,
+ 0x6BCF, 0x6BCF, 0x0AC4, 0x6BD0, 0x6BD1, 0x3856, 0x6BD2, 0x6BD2, 0x05FD,
+ 0x6BD3, 0x6BD3, 0x126F, 0x6BD4, 0x6BD4, 0x0431, 0x6BD5, 0x6BD5, 0x0438,
+ 0x6BD6, 0x6BD6, 0x043A, 0x6BD7, 0x6BD7, 0x0BBF, 0x6BD8, 0x6BD8, 0x3858,
+ 0x6BD9, 0x6BD9, 0x0439, 0x6BDA, 0x6BDA, 0x3859, 0x6BDB, 0x6BDB, 0x0AB0,
+ 0x6BDC, 0x6BE0, 0x385A, 0x6BE1, 0x6BE1, 0x1152, 0x6BE2, 0x6BE9, 0x385F,
+ 0x6BEA, 0x6BEA, 0x1954, 0x6BEB, 0x6BEB, 0x0778, 0x6BEC, 0x6BEE, 0x3867,
+ 0x6BEF, 0x6BEF, 0x0E0D, 0x6BF0, 0x6BF2, 0x386A, 0x6BF3, 0x6BF3, 0x1955,
+ 0x6BF4, 0x6BF4, 0x386D, 0x6BF5, 0x6BF5, 0x1957, 0x6BF6, 0x6BF8, 0x386E,
+ 0x6BF9, 0x6BF9, 0x1958, 0x6BFA, 0x6BFC, 0x3871, 0x6BFD, 0x6BFD, 0x1956,
+ 0x6BFE, 0x6BFE, 0x3874, 0x6BFF, 0x6BFF, 0x24C0, 0x6C00, 0x6C04, 0x3875,
+ 0x6C05, 0x6C05, 0x1959, 0x6C06, 0x6C06, 0x195B, 0x6C07, 0x6C07, 0x195A,
+ 0x6C08, 0x6C08, 0x226D, 0x6C09, 0x6C0B, 0x387A, 0x6C0C, 0x6C0C, 0x24C1,
+ 0x6C0D, 0x6C0D, 0x195C, 0x6C0E, 0x6C0E, 0x387D, 0x6C0F, 0x6C0F, 0x0D66,
+ 0x6C10, 0x6C10, 0x126B, 0x6C11, 0x6C11, 0x0AF6, 0x6C12, 0x6C12, 0x387E,
+ 0x6C13, 0x6C13, 0x0AAA, 0x6C14, 0x6C14, 0x0C17, 0x6C15, 0x6C15, 0x195D,
+ 0x6C16, 0x6C16, 0x0B2D, 0x6C17, 0x6C17, 0x387F, 0x6C18, 0x6C1A, 0x195E,
+ 0x6C1B, 0x6C1B, 0x0672, 0x6C1C, 0x6C1E, 0x3880, 0x6C1F, 0x6C1F, 0x0697,
+ 0x6C20, 0x6C20, 0x3883, 0x6C21, 0x6C21, 0x1961, 0x6C22, 0x6C22, 0x0C5F,
+ 0x6C23, 0x6C23, 0x20CA, 0x6C24, 0x6C24, 0x1963, 0x6C25, 0x6C25, 0x3884,
+ 0x6C26, 0x6C26, 0x075B, 0x6C27, 0x6C27, 0x101E, 0x6C28, 0x6C28, 0x03BC,
+ 0x6C29, 0x6C29, 0x1962, 0x6C2A, 0x6C2A, 0x1964, 0x6C2B, 0x6C2B, 0x20E7,
+ 0x6C2C, 0x6C2C, 0x24C2, 0x6C2D, 0x6C2D, 0x3885, 0x6C2E, 0x6C2E, 0x058B,
+ 0x6C2F, 0x6C2F, 0x0A6F, 0x6C30, 0x6C30, 0x0C65, 0x6C31, 0x6C31, 0x3886,
+ 0x6C32, 0x6C32, 0x1965, 0x6C33, 0x6C33, 0x3887, 0x6C34, 0x6C34, 0x0DA3,
+ 0x6C35, 0x6C35, 0x169F, 0x6C36, 0x6C37, 0x3888, 0x6C38, 0x6C38, 0x10A5,
+ 0x6C39, 0x6C3C, 0x388A, 0x6C3D, 0x6C3D, 0x12EF, 0x6C3E, 0x6C3F, 0x388E,
+ 0x6C40, 0x6C40, 0x0E52, 0x6C41, 0x6C41, 0x11AC, 0x6C42, 0x6C42, 0x0C70,
+ 0x6C43, 0x6C45, 0x3890, 0x6C46, 0x6C46, 0x12F4, 0x6C47, 0x6C47, 0x07F8,
+ 0x6C48, 0x6C48, 0x3893, 0x6C49, 0x6C49, 0x0771, 0x6C4A, 0x6C4A, 0x16A2,
+ 0x6C4B, 0x6C4F, 0x3894, 0x6C50, 0x6C50, 0x0F18, 0x6C51, 0x6C53, 0x3899,
+ 0x6C54, 0x6C54, 0x16A0, 0x6C55, 0x6C55, 0x0D00, 0x6C56, 0x6C56, 0x389C,
+ 0x6C57, 0x6C57, 0x0770, 0x6C58, 0x6C5A, 0x389D, 0x6C5B, 0x6C5B, 0x0FDD,
+ 0x6C5C, 0x6C5C, 0x16A1, 0x6C5D, 0x6C5D, 0x0CC5, 0x6C5E, 0x6C5E, 0x0708,
+ 0x6C5F, 0x6C5F, 0x087E, 0x6C60, 0x6C60, 0x04FD, 0x6C61, 0x6C61, 0x0EEA,
+ 0x6C62, 0x6C63, 0x38A0, 0x6C64, 0x6C64, 0x0E13, 0x6C65, 0x6C67, 0x38A2,
+ 0x6C68, 0x6C69, 0x16A8, 0x6C6A, 0x6C6A, 0x0EA5, 0x6C6B, 0x6C6F, 0x38A5,
+ 0x6C70, 0x6C70, 0x0E00, 0x6C71, 0x6C71, 0x38AA, 0x6C72, 0x6C72, 0x0826,
+ 0x6C73, 0x6C73, 0x38AB, 0x6C74, 0x6C74, 0x16AA, 0x6C75, 0x6C75, 0x38AC,
+ 0x6C76, 0x6C76, 0x16AB, 0x6C77, 0x6C78, 0x38AD, 0x6C79, 0x6C79, 0x0FA5,
+ 0x6C7A, 0x6C7C, 0x38AF, 0x6C7D, 0x6C7D, 0x0C1A, 0x6C7E, 0x6C7E, 0x0677,
+ 0x6C7F, 0x6C80, 0x38B2, 0x6C81, 0x6C81, 0x0C5C, 0x6C82, 0x6C82, 0x1051,
+ 0x6C83, 0x6C83, 0x0EE5, 0x6C84, 0x6C84, 0x38B4, 0x6C85, 0x6C85, 0x16A4,
+ 0x6C86, 0x6C86, 0x16AC, 0x6C87, 0x6C87, 0x38B5, 0x6C88, 0x6C88, 0x0D2B,
+ 0x6C89, 0x6C89, 0x04E6, 0x6C8A, 0x6C8B, 0x38B6, 0x6C8C, 0x6C8C, 0x16A7,
+ 0x6C8D, 0x6C8E, 0x38B8, 0x6C8F, 0x6C8F, 0x0C02, 0x6C90, 0x6C90, 0x16A5,
+ 0x6C91, 0x6C92, 0x38BA, 0x6C93, 0x6C93, 0x1A1F, 0x6C94, 0x6C94, 0x16A6,
+ 0x6C95, 0x6C98, 0x38BC, 0x6C99, 0x6C99, 0x0CEC, 0x6C9A, 0x6C9A, 0x38C0,
+ 0x6C9B, 0x6C9B, 0x0BA7, 0x6C9C, 0x6C9E, 0x38C1, 0x6C9F, 0x6C9F, 0x070E,
+ 0x6CA0, 0x6CA0, 0x38C4, 0x6CA1, 0x6CA1, 0x0AC0, 0x6CA2, 0x6CA2, 0x38C5,
+ 0x6CA3, 0x6CA3, 0x16A3, 0x6CA4, 0x6CA4, 0x0B7E, 0x6CA5, 0x6CA5, 0x09ED,
+ 0x6CA6, 0x6CA6, 0x0A80, 0x6CA7, 0x6CA7, 0x049E, 0x6CA8, 0x6CA8, 0x38C6,
+ 0x6CA9, 0x6CA9, 0x16AD, 0x6CAA, 0x6CAA, 0x07BB, 0x6CAB, 0x6CAB, 0x0B10,
+ 0x6CAC, 0x6CAC, 0x38C7, 0x6CAD, 0x6CAD, 0x16B0, 0x6CAE, 0x6CAE, 0x0909,
+ 0x6CAF, 0x6CB0, 0x38C8, 0x6CB1, 0x6CB1, 0x16BB, 0x6CB2, 0x6CB2, 0x16B5,
+ 0x6CB3, 0x6CB3, 0x078A, 0x6CB4, 0x6CB7, 0x38CA, 0x6CB8, 0x6CB8, 0x066D,
+ 0x6CB9, 0x6CB9, 0x10B2, 0x6CBA, 0x6CBA, 0x38CE, 0x6CBB, 0x6CBB, 0x11CD,
+ 0x6CBC, 0x6CBC, 0x1174, 0x6CBD, 0x6CBD, 0x071A, 0x6CBE, 0x6CBE, 0x1155,
+ 0x6CBF, 0x6CBF, 0x1001, 0x6CC0, 0x6CC3, 0x38CF, 0x6CC4, 0x6CC4, 0x0F84,
+ 0x6CC5, 0x6CC5, 0x0C73, 0x6CC6, 0x6CC8, 0x38D3, 0x6CC9, 0x6CC9, 0x0C85,
+ 0x6CCA, 0x6CCA, 0x047B, 0x6CCB, 0x6CCB, 0x38D6, 0x6CCC, 0x6CCC, 0x0ADF,
+ 0x6CCD, 0x6CCF, 0x38D7, 0x6CD0, 0x6CD0, 0x16AE, 0x6CD1, 0x6CD2, 0x38DA,
+ 0x6CD3, 0x6CD3, 0x16BC, 0x6CD4, 0x6CD4, 0x16AF, 0x6CD5, 0x6CD5, 0x0645,
+ 0x6CD6, 0x6CD6, 0x16B7, 0x6CD7, 0x6CD7, 0x16B4, 0x6CD8, 0x6CDA, 0x38DC,
+ 0x6CDB, 0x6CDB, 0x0657, 0x6CDC, 0x6CDD, 0x38DF, 0x6CDE, 0x6CDE, 0x0B63,
+ 0x6CDF, 0x6CDF, 0x38E1, 0x6CE0, 0x6CE0, 0x16B6, 0x6CE1, 0x6CE1, 0x0B9E,
+ 0x6CE2, 0x6CE2, 0x046F, 0x6CE3, 0x6CE3, 0x0C1B, 0x6CE4, 0x6CE4, 0x38E2,
+ 0x6CE5, 0x6CE5, 0x0B43, 0x6CE6, 0x6CE7, 0x38E3, 0x6CE8, 0x6CE8, 0x11FF,
+ 0x6CE9, 0x6CE9, 0x38E5, 0x6CEA, 0x6CEA, 0x09CC, 0x6CEB, 0x6CEB, 0x16B9,
+ 0x6CEC, 0x6CED, 0x38E6, 0x6CEE, 0x6CEE, 0x16BA, 0x6CEF, 0x6CEF, 0x16BD,
+ 0x6CF0, 0x6CF0, 0x0DFC, 0x6CF1, 0x6CF1, 0x16B3, 0x6CF2, 0x6CF2, 0x38E8,
+ 0x6CF3, 0x6CF3, 0x10A3, 0x6CF4, 0x6CF4, 0x38E9, 0x6CF5, 0x6CF5, 0x042C,
+ 0x6CF6, 0x6CF6, 0x1A20, 0x6CF7, 0x6CF8, 0x16B1, 0x6CF9, 0x6CF9, 0x38EA,
+ 0x6CFA, 0x6CFA, 0x16B8, 0x6CFB, 0x6CFB, 0x0F85, 0x6CFC, 0x6CFC, 0x0BE2,
+ 0x6CFD, 0x6CFD, 0x1136, 0x6CFE, 0x6CFE, 0x16BE, 0x6CFF, 0x6CFF, 0x38EB,
+ 0x6D00, 0x6D00, 0x38EC, 0x6D01, 0x6D01, 0x08B1, 0x6D02, 0x6D03, 0x38ED,
+ 0x6D04, 0x6D04, 0x16C5, 0x6D05, 0x6D06, 0x38EF, 0x6D07, 0x6D07, 0x16C4,
+ 0x6D08, 0x6D0A, 0x38F1, 0x6D0B, 0x6D0B, 0x101C, 0x6D0C, 0x6D0C, 0x16C1,
+ 0x6D0D, 0x6D0D, 0x38F4, 0x6D0E, 0x6D0E, 0x16C7, 0x6D0F, 0x6D11, 0x38F5,
+ 0x6D12, 0x6D12, 0x0CD2, 0x6D13, 0x6D16, 0x38F8, 0x6D17, 0x6D17, 0x0F21,
+ 0x6D18, 0x6D18, 0x38FC, 0x6D19, 0x6D19, 0x16C6, 0x6D1A, 0x6D1A, 0x16CC,
+ 0x6D1B, 0x6D1B, 0x0A8C, 0x6D1C, 0x6D1D, 0x38FD, 0x6D1E, 0x6D1E, 0x05F3,
+ 0x6D1F, 0x6D24, 0x38FF, 0x6D25, 0x6D25, 0x08C3, 0x6D26, 0x6D26, 0x3905,
+ 0x6D27, 0x6D27, 0x16C0, 0x6D28, 0x6D29, 0x3906, 0x6D2A, 0x6D2A, 0x07A0,
+ 0x6D2B, 0x6D2B, 0x16C8, 0x6D2C, 0x6D2D, 0x3908, 0x6D2E, 0x6D2E, 0x16CA,
+ 0x6D2F, 0x6D30, 0x390A, 0x6D31, 0x6D31, 0x063C, 0x6D32, 0x6D32, 0x11DD,
+ 0x6D33, 0x6D33, 0x16D0, 0x6D34, 0x6D34, 0x390C, 0x6D35, 0x6D35, 0x16CB,
+ 0x6D36, 0x6D38, 0x390D, 0x6D39, 0x6D39, 0x16BF, 0x6D3A, 0x6D3A, 0x3910,
+ 0x6D3B, 0x6D3B, 0x0803, 0x6D3C, 0x6D3C, 0x0E8E, 0x6D3D, 0x6D3D, 0x0C1F,
+ 0x6D3E, 0x6D3E, 0x0B8A, 0x6D3F, 0x6D40, 0x3911, 0x6D41, 0x6D41, 0x0A40,
+ 0x6D42, 0x6D42, 0x3913, 0x6D43, 0x6D43, 0x16C2, 0x6D44, 0x6D44, 0x3914,
+ 0x6D45, 0x6D45, 0x0C30, 0x6D46, 0x6D46, 0x087D, 0x6D47, 0x6D47, 0x088E,
+ 0x6D48, 0x6D48, 0x16C3, 0x6D49, 0x6D49, 0x3915, 0x6D4A, 0x6D4A, 0x1224,
+ 0x6D4B, 0x6D4B, 0x04A9, 0x6D4C, 0x6D4C, 0x3916, 0x6D4D, 0x6D4D, 0x16C9,
+ 0x6D4E, 0x6D4E, 0x0836, 0x6D4F, 0x6D4F, 0x16CD, 0x6D50, 0x6D50, 0x3917,
+ 0x6D51, 0x6D51, 0x0800, 0x6D52, 0x6D52, 0x16CE, 0x6D53, 0x6D53, 0x0B69,
+ 0x6D54, 0x6D54, 0x16CF, 0x6D55, 0x6D58, 0x3918, 0x6D59, 0x6D59, 0x1184,
+ 0x6D5A, 0x6D5A, 0x0930, 0x6D5B, 0x6D5B, 0x391C, 0x6D5C, 0x6D5C, 0x16D8,
+ 0x6D5D, 0x6D5D, 0x391D, 0x6D5E, 0x6D5E, 0x16D5, 0x6D5F, 0x6D5F, 0x391E,
+ 0x6D60, 0x6D60, 0x16D9, 0x6D61, 0x6D62, 0x391F, 0x6D63, 0x6D63, 0x16DB,
+ 0x6D64, 0x6D65, 0x3921, 0x6D66, 0x6D66, 0x0BF5, 0x6D67, 0x6D68, 0x3923,
+ 0x6D69, 0x6D69, 0x077D, 0x6D6A, 0x6D6A, 0x09B6, 0x6D6B, 0x6D6D, 0x3925,
+ 0x6D6E, 0x6D6E, 0x069C, 0x6D6F, 0x6D6F, 0x16D2, 0x6D70, 0x6D73, 0x3928,
+ 0x6D74, 0x6D74, 0x10E4, 0x6D75, 0x6D76, 0x392C, 0x6D77, 0x6D77, 0x075A,
+ 0x6D78, 0x6D78, 0x08CF, 0x6D79, 0x6D79, 0x23DC, 0x6D7A, 0x6D7B, 0x392E,
+ 0x6D7C, 0x6D7C, 0x16DA, 0x6D7D, 0x6D81, 0x3930, 0x6D82, 0x6D82, 0x0E70,
+ 0x6D83, 0x6D84, 0x3935, 0x6D85, 0x6D85, 0x0B5C, 0x6D86, 0x6D86, 0x3937,
+ 0x6D87, 0x6D87, 0x23DB, 0x6D88, 0x6D88, 0x0F68, 0x6D89, 0x6D89, 0x0D1F,
+ 0x6D8A, 0x6D8B, 0x3938, 0x6D8C, 0x6D8C, 0x10A4, 0x6D8D, 0x6D8D, 0x393A,
+ 0x6D8E, 0x6D8E, 0x0F3E, 0x6D8F, 0x6D90, 0x393B, 0x6D91, 0x6D91, 0x16D1,
+ 0x6D92, 0x6D92, 0x393D, 0x6D93, 0x6D94, 0x16D6, 0x6D95, 0x6D95, 0x0E3C,
+ 0x6D96, 0x6D9A, 0x393E, 0x6D9B, 0x6D9B, 0x0E21, 0x6D9C, 0x6D9C, 0x3943,
+ 0x6D9D, 0x6D9D, 0x09BF, 0x6D9E, 0x6D9E, 0x16D3, 0x6D9F, 0x6D9F, 0x09F9,
+ 0x6DA0, 0x6DA0, 0x16D4, 0x6DA1, 0x6DA1, 0x0EDF, 0x6DA2, 0x6DA2, 0x3944,
+ 0x6DA3, 0x6DA3, 0x07D6, 0x6DA4, 0x6DA4, 0x05B4, 0x6DA5, 0x6DA5, 0x3945,
+ 0x6DA6, 0x6DA6, 0x0CCE, 0x6DA7, 0x6DA7, 0x0878, 0x6DA8, 0x6DA8, 0x1168,
+ 0x6DA9, 0x6DA9, 0x0CE5, 0x6DAA, 0x6DAA, 0x069D, 0x6DAB, 0x6DAB, 0x16E8,
+ 0x6DAC, 0x6DAD, 0x3946, 0x6DAE, 0x6DAE, 0x16EA, 0x6DAF, 0x6DAF, 0x0FED,
+ 0x6DB0, 0x6DB1, 0x3948, 0x6DB2, 0x6DB2, 0x1041, 0x6DB3, 0x6DB4, 0x394A,
+ 0x6DB5, 0x6DB5, 0x0764, 0x6DB6, 0x6DB7, 0x394C, 0x6DB8, 0x6DB8, 0x078B,
+ 0x6DB9, 0x6DBE, 0x394E, 0x6DBF, 0x6DBF, 0x16E1, 0x6DC0, 0x6DC0, 0x05CE,
+ 0x6DC1, 0x6DC3, 0x3954, 0x6DC4, 0x6DC4, 0x122A, 0x6DC5, 0x6DC5, 0x16DE,
+ 0x6DC6, 0x6DC6, 0x0F6A, 0x6DC7, 0x6DC7, 0x16DD, 0x6DC8, 0x6DCA, 0x3957,
+ 0x6DCB, 0x6DCB, 0x0A25, 0x6DCC, 0x6DCC, 0x0E1D, 0x6DCD, 0x6DD0, 0x395A,
+ 0x6DD1, 0x6DD1, 0x0D7E, 0x6DD2, 0x6DD5, 0x395E, 0x6DD6, 0x6DD6, 0x0B3A,
+ 0x6DD7, 0x6DD7, 0x3962, 0x6DD8, 0x6DD8, 0x0E27, 0x6DD9, 0x6DD9, 0x16E6,
+ 0x6DDA, 0x6DDC, 0x3963, 0x6DDD, 0x6DDD, 0x16E5, 0x6DDE, 0x6DDE, 0x16DF,
+ 0x6DDF, 0x6DDF, 0x3966, 0x6DE0, 0x6DE0, 0x16E2, 0x6DE1, 0x6DE1, 0x058E,
+ 0x6DE2, 0x6DE3, 0x3967, 0x6DE4, 0x6DE4, 0x10BE, 0x6DE5, 0x6DE5, 0x3969,
+ 0x6DE6, 0x6DE6, 0x16E4, 0x6DE7, 0x6DE9, 0x396A, 0x6DEA, 0x6DEA, 0x205E,
+ 0x6DEB, 0x6DEB, 0x1080, 0x6DEC, 0x6DEC, 0x0566, 0x6DED, 0x6DED, 0x396D,
+ 0x6DEE, 0x6DEE, 0x07C9, 0x6DEF, 0x6DF0, 0x396E, 0x6DF1, 0x6DF1, 0x0D27,
+ 0x6DF2, 0x6DF2, 0x3970, 0x6DF3, 0x6DF3, 0x0541, 0x6DF4, 0x6DF4, 0x3971,
+ 0x6DF5, 0x6DF5, 0x2244, 0x6DF6, 0x6DF6, 0x23E2, 0x6DF7, 0x6DF7, 0x0801,
+ 0x6DF8, 0x6DF8, 0x3972, 0x6DF9, 0x6DF9, 0x0FF6, 0x6DFA, 0x6DFA, 0x20D4,
+ 0x6DFB, 0x6DFB, 0x0E40, 0x6DFC, 0x6DFC, 0x1A21, 0x6DFD, 0x6DFF, 0x3973,
+ 0x6E00, 0x6E04, 0x3976, 0x6E05, 0x6E05, 0x0C62, 0x6E06, 0x6E09, 0x397B,
+ 0x6E0A, 0x6E0A, 0x10EB, 0x6E0B, 0x6E0B, 0x397F, 0x6E0C, 0x6E0C, 0x16E9,
+ 0x6E0D, 0x6E0D, 0x1232, 0x6E0E, 0x6E0E, 0x16E0, 0x6E0F, 0x6E0F, 0x3980,
+ 0x6E10, 0x6E10, 0x0876, 0x6E11, 0x6E11, 0x16E3, 0x6E12, 0x6E13, 0x3981,
+ 0x6E14, 0x6E14, 0x10CB, 0x6E15, 0x6E15, 0x3983, 0x6E16, 0x6E16, 0x16E7,
+ 0x6E17, 0x6E17, 0x0D31, 0x6E18, 0x6E19, 0x3984, 0x6E1A, 0x6E1A, 0x16DC,
+ 0x6E1B, 0x6E1C, 0x3986, 0x6E1D, 0x6E1D, 0x10CA, 0x6E1E, 0x6E1F, 0x3988,
+ 0x6E20, 0x6E20, 0x0C7B, 0x6E21, 0x6E21, 0x0608, 0x6E22, 0x6E22, 0x398A,
+ 0x6E23, 0x6E23, 0x113F, 0x6E24, 0x6E24, 0x047A, 0x6E25, 0x6E25, 0x16F5,
+ 0x6E26, 0x6E26, 0x219F, 0x6E27, 0x6E28, 0x398B, 0x6E29, 0x6E29, 0x0ED1,
+ 0x6E2A, 0x6E2A, 0x398D, 0x6E2B, 0x6E2B, 0x16EB, 0x6E2C, 0x6E2C, 0x1E66,
+ 0x6E2D, 0x6E2D, 0x0ECB, 0x6E2E, 0x6E2E, 0x398E, 0x6E2F, 0x6E2F, 0x06D6,
+ 0x6E30, 0x6E31, 0x398F, 0x6E32, 0x6E32, 0x16F4, 0x6E33, 0x6E33, 0x3991,
+ 0x6E34, 0x6E34, 0x0957, 0x6E35, 0x6E37, 0x3992, 0x6E38, 0x6E38, 0x10B3,
+ 0x6E39, 0x6E39, 0x3995, 0x6E3A, 0x6E3A, 0x0AF1, 0x6E3B, 0x6E3D, 0x3996,
+ 0x6E3E, 0x6E3E, 0x1F63, 0x6E3F, 0x6E42, 0x3999, 0x6E43, 0x6E43, 0x0B89,
+ 0x6E44, 0x6E44, 0x16F6, 0x6E45, 0x6E4C, 0x399D, 0x6E4D, 0x6E4D, 0x0E75,
+ 0x6E4E, 0x6E4E, 0x16ED, 0x6E4F, 0x6E52, 0x39A5, 0x6E53, 0x6E54, 0x16F2,
+ 0x6E55, 0x6E55, 0x39A9, 0x6E56, 0x6E56, 0x07B5, 0x6E57, 0x6E57, 0x39AA,
+ 0x6E58, 0x6E58, 0x0F53, 0x6E59, 0x6E5A, 0x39AB, 0x6E5B, 0x6E5B, 0x1160,
+ 0x6E5C, 0x6E5D, 0x39AD, 0x6E5E, 0x6E5E, 0x23DD, 0x6E5F, 0x6E5F, 0x16F0,
+ 0x6E60, 0x6E6A, 0x39AF, 0x6E6B, 0x6E6B, 0x16EE, 0x6E6C, 0x6E6D, 0x39BA,
+ 0x6E6E, 0x6E6E, 0x16EC, 0x6E6F, 0x6E6F, 0x216B, 0x6E70, 0x6E7D, 0x39BC,
+ 0x6E7E, 0x6E7E, 0x0E96, 0x6E7F, 0x6E7F, 0x0D41, 0x6E80, 0x6E82, 0x39CA,
+ 0x6E83, 0x6E83, 0x098E, 0x6E84, 0x6E84, 0x39CD, 0x6E85, 0x6E85, 0x0877,
+ 0x6E86, 0x6E86, 0x16F1, 0x6E87, 0x6E88, 0x39CE, 0x6E89, 0x6E89, 0x06C3,
+ 0x6E8A, 0x6E8E, 0x39D0, 0x6E8F, 0x6E8F, 0x1705, 0x6E90, 0x6E90, 0x10F7,
+ 0x6E91, 0x6E95, 0x39D5, 0x6E96, 0x6E96, 0x22B5, 0x6E97, 0x6E97, 0x39DA,
+ 0x6E98, 0x6E98, 0x16F9, 0x6E99, 0x6E9B, 0x39DB, 0x6E9C, 0x6E9C, 0x0A38,
+ 0x6E9D, 0x6E9D, 0x1F26, 0x6E9E, 0x6E9E, 0x39DE, 0x6E9F, 0x6E9F, 0x1707,
+ 0x6EA0, 0x6EA1, 0x39DF, 0x6EA2, 0x6EA2, 0x106E, 0x6EA3, 0x6EA4, 0x39E1,
+ 0x6EA5, 0x6EA5, 0x16FD, 0x6EA6, 0x6EA6, 0x39E3, 0x6EA7, 0x6EA7, 0x16FE,
+ 0x6EA8, 0x6EA9, 0x39E4, 0x6EAA, 0x6EAA, 0x0F17, 0x6EAB, 0x6EAE, 0x39E6,
+ 0x6EAF, 0x6EAF, 0x0DD2, 0x6EB0, 0x6EB0, 0x39EA, 0x6EB1, 0x6EB1, 0x16F8,
+ 0x6EB2, 0x6EB2, 0x16EF, 0x6EB3, 0x6EB3, 0x39EB, 0x6EB4, 0x6EB4, 0x1703,
+ 0x6EB5, 0x6EB5, 0x39EC, 0x6EB6, 0x6EB6, 0x0CB7, 0x6EB7, 0x6EB7, 0x1701,
+ 0x6EB8, 0x6EB9, 0x39ED, 0x6EBA, 0x6EBA, 0x0B4A, 0x6EBB, 0x6EBB, 0x1700,
+ 0x6EBC, 0x6EBC, 0x39EF, 0x6EBD, 0x6EBD, 0x16FF, 0x6EBE, 0x6EC0, 0x39F0,
+ 0x6EC1, 0x6EC1, 0x0521, 0x6EC2, 0x6EC2, 0x1706, 0x6EC3, 0x6EC3, 0x39F3,
+ 0x6EC4, 0x6EC4, 0x1E63, 0x6EC5, 0x6EC5, 0x2088, 0x6EC6, 0x6EC6, 0x39F4,
+ 0x6EC7, 0x6EC7, 0x05C2, 0x6EC8, 0x6ECA, 0x39F5, 0x6ECB, 0x6ECB, 0x1229,
+ 0x6ECC, 0x6ECC, 0x1EBD, 0x6ECD, 0x6ECD, 0x39F8, 0x6ECE, 0x6ECE, 0x2341,
+ 0x6ECF, 0x6ECF, 0x1704, 0x6ED0, 0x6ED0, 0x39F9, 0x6ED1, 0x6ED1, 0x07C1,
+ 0x6ED2, 0x6ED2, 0x39FA, 0x6ED3, 0x6ED3, 0x122F, 0x6ED4, 0x6ED4, 0x0E22,
+ 0x6ED5, 0x6ED5, 0x19A8, 0x6ED6, 0x6ED6, 0x39FB, 0x6ED7, 0x6ED7, 0x1702,
+ 0x6ED8, 0x6ED9, 0x39FC, 0x6EDA, 0x6EDA, 0x074F, 0x6EDB, 0x6EDD, 0x39FE,
+ 0x6EDE, 0x6EDE, 0x11CC, 0x6EDF, 0x6EDF, 0x16F7, 0x6EE0, 0x6EE0, 0x16FA,
+ 0x6EE1, 0x6EE1, 0x0AA1, 0x6EE2, 0x6EE2, 0x16FC, 0x6EE3, 0x6EE3, 0x3A01,
+ 0x6EE4, 0x6EE4, 0x0A72, 0x6EE5, 0x6EE5, 0x09AF, 0x6EE6, 0x6EE6, 0x0A77,
+ 0x6EE7, 0x6EE7, 0x3A02, 0x6EE8, 0x6EE8, 0x045E, 0x6EE9, 0x6EE9, 0x0E05,
+ 0x6EEA, 0x6EEB, 0x3A03, 0x6EEC, 0x6EEC, 0x1F4B, 0x6EED, 0x6EEE, 0x3A05,
+ 0x6EEF, 0x6EEF, 0x2292, 0x6EF0, 0x6EF1, 0x3A07, 0x6EF2, 0x6EF2, 0x2124,
+ 0x6EF3, 0x6EF3, 0x3A09, 0x6EF4, 0x6EF4, 0x05AF, 0x6EF5, 0x6EF6, 0x3A0A,
+ 0x6EF7, 0x6EF7, 0x2048, 0x6EF8, 0x6EF8, 0x23E0, 0x6EF9, 0x6EF9, 0x170D,
+ 0x6EFA, 0x6EFE, 0x3A0C, 0x6EFF, 0x6EFF, 0x2077, 0x6F00, 0x6F00, 0x3A11,
+ 0x6F01, 0x6F01, 0x223A, 0x6F02, 0x6F02, 0x0BCE, 0x6F03, 0x6F05, 0x3A12,
+ 0x6F06, 0x6F06, 0x0C00, 0x6F07, 0x6F08, 0x3A15, 0x6F09, 0x6F09, 0x1713,
+ 0x6F0A, 0x6F0E, 0x3A17, 0x6F0F, 0x6F0F, 0x0A50, 0x6F10, 0x6F12, 0x3A1C,
+ 0x6F13, 0x6F13, 0x09D7, 0x6F14, 0x6F14, 0x1006, 0x6F15, 0x6F15, 0x170C,
+ 0x6F16, 0x6F19, 0x3A1F, 0x6F1A, 0x6F1A, 0x20B1, 0x6F1B, 0x6F1F, 0x3A23,
+ 0x6F20, 0x6F20, 0x0B11, 0x6F21, 0x6F21, 0x3A28, 0x6F22, 0x6F22, 0x1F41,
+ 0x6F23, 0x6F23, 0x201C, 0x6F24, 0x6F24, 0x170B, 0x6F25, 0x6F28, 0x3A29,
+ 0x6F29, 0x6F29, 0x1714, 0x6F2A, 0x6F2A, 0x1712, 0x6F2B, 0x6F2B, 0x0AA5,
+ 0x6F2C, 0x6F2C, 0x22B8, 0x6F2D, 0x6F2D, 0x16FB, 0x6F2E, 0x6F2E, 0x3A2D,
+ 0x6F2F, 0x6F2F, 0x170E, 0x6F30, 0x6F30, 0x3A2E, 0x6F31, 0x6F31, 0x0D95,
+ 0x6F32, 0x6F32, 0x2276, 0x6F33, 0x6F33, 0x1165, 0x6F34, 0x6F35, 0x3A2F,
+ 0x6F36, 0x6F36, 0x170F, 0x6F37, 0x6F37, 0x3A31, 0x6F38, 0x6F38, 0x1F9B,
+ 0x6F39, 0x6F3D, 0x3A32, 0x6F3E, 0x6F3E, 0x1023, 0x6F3F, 0x6F3F, 0x1F9F,
+ 0x6F40, 0x6F40, 0x3A37, 0x6F41, 0x6F41, 0x25CA, 0x6F42, 0x6F45, 0x3A38,
+ 0x6F46, 0x6F47, 0x1709, 0x6F48, 0x6F4A, 0x3A3C, 0x6F4B, 0x6F4B, 0x1710,
+ 0x6F4C, 0x6F4C, 0x3A3F, 0x6F4D, 0x6F4D, 0x0EBA, 0x6F4E, 0x6F50, 0x3A40,
+ 0x6F51, 0x6F51, 0x20BE, 0x6F52, 0x6F53, 0x3A43, 0x6F54, 0x6F54, 0x1FB4,
+ 0x6F55, 0x6F57, 0x3A45, 0x6F58, 0x6F58, 0x0B8C, 0x6F59, 0x6F59, 0x23D7,
+ 0x6F5A, 0x6F5B, 0x3A48, 0x6F5C, 0x6F5C, 0x0C2E, 0x6F5D, 0x6F5D, 0x3A4A,
+ 0x6F5E, 0x6F5E, 0x0A61, 0x6F5F, 0x6F61, 0x3A4B, 0x6F62, 0x6F62, 0x1708,
+ 0x6F63, 0x6F63, 0x3A4E, 0x6F64, 0x6F64, 0x2105, 0x6F65, 0x6F65, 0x3A4F,
+ 0x6F66, 0x6F66, 0x0A13, 0x6F67, 0x6F6C, 0x3A50, 0x6F6D, 0x6F6D, 0x0E09,
+ 0x6F6E, 0x6F6E, 0x04D6, 0x6F6F, 0x6F6F, 0x23E1, 0x6F70, 0x6F70, 0x1FEC,
+ 0x6F71, 0x6F71, 0x3A56, 0x6F72, 0x6F72, 0x1719, 0x6F73, 0x6F73, 0x3A57,
+ 0x6F74, 0x6F74, 0x1711, 0x6F75, 0x6F76, 0x3A58, 0x6F77, 0x6F77, 0x23EA,
+ 0x6F78, 0x6F78, 0x1718, 0x6F79, 0x6F79, 0x3A5A, 0x6F7A, 0x6F7A, 0x171B,
+ 0x6F7B, 0x6F7B, 0x3A5B, 0x6F7C, 0x6F7C, 0x171A, 0x6F7D, 0x6F7E, 0x3A5C,
+ 0x6F7F, 0x6F7F, 0x23E3, 0x6F80, 0x6F80, 0x210E, 0x6F81, 0x6F83, 0x3A5E,
+ 0x6F84, 0x6F84, 0x04F3, 0x6F85, 0x6F85, 0x3A61, 0x6F86, 0x6F86, 0x1FA6,
+ 0x6F87, 0x6F87, 0x2004, 0x6F88, 0x6F88, 0x04DF, 0x6F89, 0x6F89, 0x1715,
+ 0x6F8A, 0x6F8B, 0x3A62, 0x6F8C, 0x6F8C, 0x1717, 0x6F8D, 0x6F8D, 0x1716,
+ 0x6F8E, 0x6F8E, 0x0BAD, 0x6F8F, 0x6F96, 0x3A64, 0x6F97, 0x6F97, 0x1F9D,
+ 0x6F98, 0x6F9B, 0x3A6C, 0x6F9C, 0x6F9C, 0x09A8, 0x6F9D, 0x6F9F, 0x3A70,
+ 0x6FA0, 0x6FA0, 0x23E5, 0x6FA1, 0x6FA1, 0x112B, 0x6FA2, 0x6FA3, 0x3A73,
+ 0x6FA4, 0x6FA4, 0x2264, 0x6FA5, 0x6FA6, 0x3A75, 0x6FA7, 0x6FA7, 0x171E,
+ 0x6FA8, 0x6FA8, 0x3A77, 0x6FA9, 0x6FA9, 0x24E2, 0x6FAA, 0x6FAD, 0x3A78,
+ 0x6FAE, 0x6FAE, 0x23DE, 0x6FAF, 0x6FB0, 0x3A7C, 0x6FB1, 0x6FB1, 0x1EC4,
+ 0x6FB2, 0x6FB2, 0x3A7E, 0x6FB3, 0x6FB3, 0x03CF, 0x6FB4, 0x6FB5, 0x3A7F,
+ 0x6FB6, 0x6FB6, 0x1720, 0x6FB7, 0x6FB8, 0x3A81, 0x6FB9, 0x6FB9, 0x171F,
+ 0x6FBA, 0x6FBF, 0x3A83, 0x6FC0, 0x6FC0, 0x0817, 0x6FC1, 0x6FC1, 0x22B6,
+ 0x6FC2, 0x6FC2, 0x1721, 0x6FC3, 0x6FC3, 0x20A9, 0x6FC4, 0x6FC8, 0x3A89,
+ 0x6FC9, 0x6FC9, 0x171D, 0x6FCA, 0x6FD0, 0x3A8E, 0x6FD1, 0x6FD1, 0x171C,
+ 0x6FD2, 0x6FD2, 0x045D, 0x6FD3, 0x6FD4, 0x3A95, 0x6FD5, 0x6FD5, 0x212B,
+ 0x6FD6, 0x6FD7, 0x3A97, 0x6FD8, 0x6FD8, 0x20A5, 0x6FD9, 0x6FDA, 0x3A99,
+ 0x6FDB, 0x6FDB, 0x268B, 0x6FDC, 0x6FDD, 0x3A9B, 0x6FDE, 0x6FDE, 0x1724,
+ 0x6FDF, 0x6FDF, 0x1F76, 0x6FE0, 0x6FE0, 0x1725, 0x6FE1, 0x6FE1, 0x1722,
+ 0x6FE2, 0x6FE3, 0x3A9D, 0x6FE4, 0x6FE4, 0x216D, 0x6FE5, 0x6FEA, 0x3A9F,
+ 0x6FEB, 0x6FEB, 0x2001, 0x6FEC, 0x6FED, 0x3AA5, 0x6FEE, 0x6FEE, 0x1723,
+ 0x6FEF, 0x6FEF, 0x1726, 0x6FF0, 0x6FF0, 0x2191, 0x6FF1, 0x6FF1, 0x1E50,
+ 0x6FF2, 0x6FF9, 0x3AA7, 0x6FFA, 0x6FFA, 0x1F9C, 0x6FFB, 0x6FFB, 0x3AAF,
+ 0x6FFC, 0x6FFC, 0x23DA, 0x6FFD, 0x6FFD, 0x3AB0, 0x6FFE, 0x6FFE, 0x2053,
+ 0x6FFF, 0x6FFF, 0x3AB1, 0x7000, 0x7004, 0x3AB2, 0x7005, 0x7005, 0x23E9,
+ 0x7006, 0x7006, 0x23E4, 0x7007, 0x7008, 0x3AB7, 0x7009, 0x7009, 0x21D5,
+ 0x700A, 0x700A, 0x3AB9, 0x700B, 0x700B, 0x23E6, 0x700C, 0x700E, 0x3ABA,
+ 0x700F, 0x700F, 0x23DF, 0x7010, 0x7010, 0x3ABD, 0x7011, 0x7011, 0x0BF8,
+ 0x7012, 0x7014, 0x3ABE, 0x7015, 0x7015, 0x1E4F, 0x7016, 0x7017, 0x3AC1,
+ 0x7018, 0x7018, 0x23D9, 0x7019, 0x7019, 0x3AC3, 0x701A, 0x701A, 0x1727,
+ 0x701B, 0x701B, 0x1729, 0x701C, 0x701C, 0x3AC4, 0x701D, 0x701D, 0x2014,
+ 0x701E, 0x701E, 0x3AC5, 0x701F, 0x701F, 0x23EC, 0x7020, 0x7020, 0x23EB,
+ 0x7021, 0x7022, 0x3AC6, 0x7023, 0x7023, 0x1728, 0x7024, 0x7026, 0x3AC8,
+ 0x7027, 0x7027, 0x23D8, 0x7028, 0x7028, 0x23EE, 0x7029, 0x702F, 0x3ACB,
+ 0x7030, 0x7030, 0x268E, 0x7031, 0x7031, 0x3AD2, 0x7032, 0x7032, 0x23ED,
+ 0x7033, 0x7034, 0x3AD3, 0x7035, 0x7035, 0x172B, 0x7036, 0x7038, 0x3AD5,
+ 0x7039, 0x7039, 0x172A, 0x703A, 0x703D, 0x3AD8, 0x703E, 0x703E, 0x1FFA,
+ 0x703F, 0x7042, 0x3ADC, 0x7043, 0x7043, 0x23D6, 0x7044, 0x7044, 0x23E8,
+ 0x7045, 0x704B, 0x3AE0, 0x704C, 0x704C, 0x0739, 0x704D, 0x704E, 0x3AE7,
+ 0x704F, 0x704F, 0x172C, 0x7050, 0x7050, 0x3AE9, 0x7051, 0x7051, 0x2106,
+ 0x7052, 0x7054, 0x3AEA, 0x7055, 0x7055, 0x200B, 0x7056, 0x7057, 0x3AED,
+ 0x7058, 0x7058, 0x2166, 0x7059, 0x705C, 0x3AEF, 0x705D, 0x705D, 0x23EF,
+ 0x705E, 0x705E, 0x172D, 0x705F, 0x7062, 0x3AF3, 0x7063, 0x7063, 0x2189,
+ 0x7064, 0x7064, 0x2058, 0x7065, 0x7066, 0x3AF7, 0x7067, 0x7067, 0x23E7,
+ 0x7068, 0x706A, 0x3AF9, 0x706B, 0x706B, 0x0805, 0x706C, 0x706C, 0x19EF,
+ 0x706D, 0x706D, 0x0AF5, 0x706E, 0x706E, 0x3AFC, 0x706F, 0x706F, 0x05A7,
+ 0x7070, 0x7070, 0x07E7, 0x7071, 0x7074, 0x3AFD, 0x7075, 0x7075, 0x0A32,
+ 0x7076, 0x7076, 0x1131, 0x7077, 0x7077, 0x3B01, 0x7078, 0x7078, 0x08F3,
+ 0x7079, 0x707B, 0x3B02, 0x707C, 0x707C, 0x1223, 0x707D, 0x707D, 0x3B05,
+ 0x707E, 0x707E, 0x1119, 0x707F, 0x707F, 0x049A, 0x7080, 0x7080, 0x19CC,
+ 0x7081, 0x7084, 0x3B06, 0x7085, 0x7085, 0x1913, 0x7086, 0x7088, 0x3B0A,
+ 0x7089, 0x7089, 0x0A56, 0x708A, 0x708A, 0x0539, 0x708B, 0x708D, 0x3B0D,
+ 0x708E, 0x708E, 0x1000, 0x708F, 0x7091, 0x3B10, 0x7092, 0x7092, 0x04D9,
+ 0x7093, 0x7093, 0x3B13, 0x7094, 0x7094, 0x0C8D, 0x7095, 0x7095, 0x0948,
+ 0x7096, 0x7096, 0x19CE, 0x7097, 0x7098, 0x3B14, 0x7099, 0x7099, 0x11CA,
+ 0x709A, 0x709B, 0x3B16, 0x709C, 0x709C, 0x19CD, 0x709D, 0x709D, 0x19CF,
+ 0x709E, 0x70AA, 0x3B18, 0x70AB, 0x70AB, 0x19D3, 0x70AC, 0x70AC, 0x0915,
+ 0x70AD, 0x70AD, 0x0E12, 0x70AE, 0x70AE, 0x0B9B, 0x70AF, 0x70AF, 0x08EB,
+ 0x70B0, 0x70B0, 0x3B25, 0x70B1, 0x70B1, 0x19D4, 0x70B2, 0x70B2, 0x3B26,
+ 0x70B3, 0x70B3, 0x0467, 0x70B4, 0x70B6, 0x3B27, 0x70B7, 0x70B7, 0x19D2,
+ 0x70B8, 0x70B8, 0x1149, 0x70B9, 0x70B9, 0x05C4, 0x70BA, 0x70BA, 0x3B2A,
+ 0x70BB, 0x70BB, 0x19D0, 0x70BC, 0x70BC, 0x09FF, 0x70BD, 0x70BD, 0x0508,
+ 0x70BE, 0x70BF, 0x3B2B, 0x70C0, 0x70C0, 0x19D1, 0x70C1, 0x70C1, 0x0DAD,
+ 0x70C2, 0x70C2, 0x09AE, 0x70C3, 0x70C3, 0x0E51, 0x70C4, 0x70C7, 0x3B2D,
+ 0x70C8, 0x70C8, 0x0A1B, 0x70C9, 0x70C9, 0x3B31, 0x70CA, 0x70CA, 0x19D6,
+ 0x70CB, 0x70CE, 0x3B32, 0x70CF, 0x70CF, 0x21A3, 0x70D0, 0x70D7, 0x3B36,
+ 0x70D8, 0x70D8, 0x079D, 0x70D9, 0x70D9, 0x09BE, 0x70DA, 0x70DA, 0x3B3E,
+ 0x70DB, 0x70DB, 0x11F1, 0x70DC, 0x70DE, 0x3B3F, 0x70DF, 0x70DF, 0x0FF5,
+ 0x70E0, 0x70E3, 0x3B42, 0x70E4, 0x70E4, 0x094B, 0x70E5, 0x70E5, 0x3B46,
+ 0x70E6, 0x70E6, 0x0650, 0x70E7, 0x70E7, 0x0D0E, 0x70E8, 0x70E8, 0x19D5,
+ 0x70E9, 0x70E9, 0x07F7, 0x70EA, 0x70EA, 0x3B47, 0x70EB, 0x70EB, 0x0E1F,
+ 0x70EC, 0x70EC, 0x08CE, 0x70ED, 0x70ED, 0x0CA3, 0x70EE, 0x70EE, 0x3B48,
+ 0x70EF, 0x70EF, 0x0F16, 0x70F0, 0x70F3, 0x3B49, 0x70F4, 0x70F4, 0x217A,
+ 0x70F5, 0x70F6, 0x3B4D, 0x70F7, 0x70F7, 0x0E9A, 0x70F8, 0x70F8, 0x3B4F,
+ 0x70F9, 0x70F9, 0x0BAC, 0x70FA, 0x70FC, 0x3B50, 0x70FD, 0x70FD, 0x0686,
+ 0x70FE, 0x70FF, 0x3B53, 0x7100, 0x7108, 0x3B55, 0x7109, 0x7109, 0x0FF2,
+ 0x710A, 0x710A, 0x076F, 0x710B, 0x710F, 0x3B5E, 0x7110, 0x7110, 0x19D7,
+ 0x7111, 0x7112, 0x3B63, 0x7113, 0x7113, 0x19D8, 0x7114, 0x7114, 0x3B65,
+ 0x7115, 0x7115, 0x07D5, 0x7116, 0x7116, 0x19D9, 0x7117, 0x7117, 0x3B66,
+ 0x7118, 0x7118, 0x19F0, 0x7119, 0x7119, 0x0423, 0x711A, 0x711A, 0x0676,
+ 0x711B, 0x7120, 0x3B67, 0x7121, 0x7121, 0x21A5, 0x7122, 0x7125, 0x3B6D,
+ 0x7126, 0x7126, 0x088A, 0x7127, 0x712E, 0x3B71, 0x712F, 0x712F, 0x19DA,
+ 0x7130, 0x7130, 0x100F, 0x7131, 0x7131, 0x19DB, 0x7132, 0x7135, 0x3B79,
+ 0x7136, 0x7136, 0x0C96, 0x7137, 0x7144, 0x3B7D, 0x7145, 0x7145, 0x19DF,
+ 0x7146, 0x7148, 0x3B8B, 0x7149, 0x7149, 0x2022, 0x714A, 0x714A, 0x19E1,
+ 0x714B, 0x714B, 0x3B8E, 0x714C, 0x714C, 0x07E2, 0x714D, 0x714D, 0x3B8F,
+ 0x714E, 0x714E, 0x0858, 0x714F, 0x7151, 0x3B90, 0x7152, 0x7152, 0x24D6,
+ 0x7153, 0x715B, 0x3B93, 0x715C, 0x715C, 0x19DD, 0x715D, 0x715D, 0x3B9C,
+ 0x715E, 0x715E, 0x0CF0, 0x715F, 0x7161, 0x3B9D, 0x7162, 0x7162, 0x233A,
+ 0x7163, 0x7163, 0x3BA0, 0x7164, 0x7164, 0x0ABF, 0x7165, 0x7165, 0x3BA1,
+ 0x7166, 0x7166, 0x19F1, 0x7167, 0x7167, 0x1176, 0x7168, 0x7168, 0x19DE,
+ 0x7169, 0x7169, 0x1EEE, 0x716A, 0x716B, 0x3BA2, 0x716C, 0x716C, 0x24D5,
+ 0x716D, 0x716D, 0x3BA4, 0x716E, 0x716E, 0x11F2, 0x716F, 0x7171, 0x3BA5,
+ 0x7172, 0x7172, 0x19E0, 0x7173, 0x7173, 0x19DC, 0x7174, 0x7177, 0x3BA8,
+ 0x7178, 0x7178, 0x19E2, 0x7179, 0x7179, 0x3BAC, 0x717A, 0x717A, 0x19E3,
+ 0x717B, 0x717C, 0x3BAD, 0x717D, 0x717D, 0x0CF8, 0x717E, 0x7183, 0x3BAF,
+ 0x7184, 0x7184, 0x0F15, 0x7185, 0x7189, 0x3BB5, 0x718A, 0x718A, 0x0FA7,
+ 0x718B, 0x718E, 0x3BBA, 0x718F, 0x718F, 0x0FD5, 0x7190, 0x7191, 0x3BBE,
+ 0x7192, 0x7192, 0x2228, 0x7193, 0x7193, 0x3BC0, 0x7194, 0x7194, 0x0CB6,
+ 0x7195, 0x7196, 0x3BC1, 0x7197, 0x7197, 0x24D7, 0x7198, 0x7198, 0x19E4,
+ 0x7199, 0x7199, 0x0F04, 0x719A, 0x719E, 0x3BC3, 0x719F, 0x719F, 0x0D83,
+ 0x71A0, 0x71A0, 0x19E8, 0x71A1, 0x71A7, 0x3BC8, 0x71A8, 0x71A8, 0x19E7,
+ 0x71A9, 0x71AB, 0x3BCF, 0x71AC, 0x71AC, 0x03C9, 0x71AD, 0x71B0, 0x3BD2,
+ 0x71B1, 0x71B1, 0x20FC, 0x71B2, 0x71B2, 0x3BD6, 0x71B3, 0x71B3, 0x19E5,
+ 0x71B4, 0x71B4, 0x3BD7, 0x71B5, 0x71B5, 0x19E6, 0x71B6, 0x71B8, 0x3BD8,
+ 0x71B9, 0x71B9, 0x19F2, 0x71BA, 0x71BD, 0x3BDB, 0x71BE, 0x71BE, 0x1E87,
+ 0x71BF, 0x71C0, 0x3BDF, 0x71C1, 0x71C1, 0x24D8, 0x71C2, 0x71C2, 0x3BE1,
+ 0x71C3, 0x71C3, 0x0C97, 0x71C4, 0x71C7, 0x3BE2, 0x71C8, 0x71C8, 0x1EBA,
+ 0x71C9, 0x71CD, 0x3BE6, 0x71CE, 0x71CE, 0x0A10, 0x71CF, 0x71D1, 0x3BEB,
+ 0x71D2, 0x71D2, 0x2119, 0x71D3, 0x71D3, 0x3BEE, 0x71D4, 0x71D4, 0x19EA,
+ 0x71D5, 0x71D5, 0x1009, 0x71D6, 0x71D8, 0x3BEF, 0x71D9, 0x71D9, 0x216C,
+ 0x71DA, 0x71DB, 0x3BF2, 0x71DC, 0x71DC, 0x24D9, 0x71DD, 0x71DE, 0x3BF4,
+ 0x71DF, 0x71DF, 0x2227, 0x71E0, 0x71E0, 0x19E9, 0x71E1, 0x71E4, 0x3BF6,
+ 0x71E5, 0x71E5, 0x1132, 0x71E6, 0x71E6, 0x1E5F, 0x71E7, 0x71E7, 0x19EB,
+ 0x71E8, 0x71EC, 0x3BFA, 0x71ED, 0x71ED, 0x229F, 0x71EE, 0x71EE, 0x1396,
+ 0x71EF, 0x71F3, 0x3BFF, 0x71F4, 0x71F4, 0x1F5D, 0x71F5, 0x71F8, 0x3C04,
+ 0x71F9, 0x71F9, 0x19EC, 0x71FA, 0x71FB, 0x3C08, 0x71FC, 0x71FC, 0x1FBC,
+ 0x71FD, 0x71FD, 0x3C0A, 0x71FE, 0x71FE, 0x24DA, 0x71FF, 0x71FF, 0x3C0B,
+ 0x7200, 0x7205, 0x3C0C, 0x7206, 0x7206, 0x0415, 0x7207, 0x720C, 0x3C12,
+ 0x720D, 0x720D, 0x2149, 0x720E, 0x720F, 0x3C18, 0x7210, 0x7210, 0x2046,
+ 0x7211, 0x721A, 0x3C1A, 0x721B, 0x721B, 0x2000, 0x721C, 0x721C, 0x3C24,
+ 0x721D, 0x721D, 0x19ED, 0x721E, 0x7227, 0x3C25, 0x7228, 0x7228, 0x19EE,
+ 0x7229, 0x7229, 0x3C2F, 0x722A, 0x722A, 0x1203, 0x722B, 0x722B, 0x3C30,
+ 0x722C, 0x722C, 0x0B81, 0x722D, 0x722F, 0x3C31, 0x7230, 0x7230, 0x196C,
+ 0x7231, 0x7231, 0x03B9, 0x7232, 0x7232, 0x2190, 0x7233, 0x7234, 0x3C34,
+ 0x7235, 0x7235, 0x0923, 0x7236, 0x7236, 0x06B3, 0x7237, 0x7237, 0x1036,
+ 0x7238, 0x7238, 0x03E1, 0x7239, 0x7239, 0x05DA, 0x723A, 0x723A, 0x2208,
+ 0x723B, 0x723B, 0x1269, 0x723C, 0x723C, 0x3C36, 0x723D, 0x723D, 0x0DA1,
+ 0x723E, 0x723E, 0x1EE6, 0x723F, 0x723F, 0x169D, 0x7240, 0x7246, 0x3C37,
+ 0x7247, 0x7247, 0x0BCB, 0x7248, 0x7248, 0x03F1, 0x7249, 0x724B, 0x3C3E,
+ 0x724C, 0x724C, 0x0B87, 0x724D, 0x724D, 0x1969, 0x724E, 0x7251, 0x3C41,
+ 0x7252, 0x7252, 0x196A, 0x7253, 0x7255, 0x3C45, 0x7256, 0x7256, 0x196B,
+ 0x7257, 0x7257, 0x3C48, 0x7258, 0x7258, 0x24C3, 0x7259, 0x7259, 0x0FE9,
+ 0x725A, 0x725A, 0x3C49, 0x725B, 0x725B, 0x0B64, 0x725C, 0x725C, 0x3C4A,
+ 0x725D, 0x725D, 0x1944, 0x725E, 0x725E, 0x3C4B, 0x725F, 0x725F, 0x0B15,
+ 0x7260, 0x7260, 0x3C4C, 0x7261, 0x7261, 0x0B18, 0x7262, 0x7262, 0x09B9,
+ 0x7263, 0x7265, 0x3C4D, 0x7266, 0x7266, 0x1945, 0x7267, 0x7267, 0x0B24,
+ 0x7268, 0x7268, 0x3C50, 0x7269, 0x7269, 0x0EFE, 0x726A, 0x726D, 0x3C51,
+ 0x726E, 0x726E, 0x1942, 0x726F, 0x726F, 0x1946, 0x7270, 0x7271, 0x3C55,
+ 0x7272, 0x7272, 0x0D35, 0x7273, 0x7274, 0x3C57, 0x7275, 0x7275, 0x0C20,
+ 0x7276, 0x7278, 0x3C59, 0x7279, 0x7279, 0x0E2B, 0x727A, 0x727A, 0x0F0D,
+ 0x727B, 0x727C, 0x3C5C, 0x727D, 0x727D, 0x20CC, 0x727E, 0x727F, 0x1947,
+ 0x7280, 0x7280, 0x0F19, 0x7281, 0x7281, 0x09D2, 0x7282, 0x7283, 0x3C5E,
+ 0x7284, 0x7284, 0x1949, 0x7285, 0x7289, 0x3C60, 0x728A, 0x728A, 0x05FE,
+ 0x728B, 0x728B, 0x194A, 0x728C, 0x728C, 0x3C65, 0x728D, 0x728D, 0x194B,
+ 0x728E, 0x728E, 0x3C66, 0x728F, 0x728F, 0x194C, 0x7290, 0x7291, 0x3C67,
+ 0x7292, 0x7292, 0x194D, 0x7293, 0x7295, 0x3C69, 0x7296, 0x7296, 0x2340,
+ 0x7297, 0x729E, 0x3C6C, 0x729F, 0x729F, 0x1943, 0x72A0, 0x72A1, 0x3C74,
+ 0x72A2, 0x72A2, 0x1ED1, 0x72A3, 0x72A6, 0x3C76, 0x72A7, 0x72A7, 0x21AC,
+ 0x72A8, 0x72AB, 0x3C7A, 0x72AC, 0x72AC, 0x0C89, 0x72AD, 0x72AD, 0x15EF,
+ 0x72AE, 0x72AE, 0x3C7E, 0x72AF, 0x72AF, 0x0655, 0x72B0, 0x72B0, 0x15F0,
+ 0x72B1, 0x72B3, 0x3C7F, 0x72B4, 0x72B4, 0x15F1, 0x72B5, 0x72B5, 0x3C82,
+ 0x72B6, 0x72B6, 0x1211, 0x72B7, 0x72B8, 0x15F2, 0x72B9, 0x72B9, 0x10B1,
+ 0x72BA, 0x72BF, 0x3C83, 0x72C0, 0x72C0, 0x22AF, 0x72C1, 0x72C1, 0x15F5,
+ 0x72C2, 0x72C2, 0x097E, 0x72C3, 0x72C3, 0x15F4, 0x72C4, 0x72C4, 0x05B3,
+ 0x72C5, 0x72C7, 0x3C89, 0x72C8, 0x72C8, 0x0420, 0x72C9, 0x72CC, 0x3C8C,
+ 0x72CD, 0x72CD, 0x15F7, 0x72CE, 0x72CE, 0x15F6, 0x72CF, 0x72CF, 0x3C90,
+ 0x72D0, 0x72D0, 0x07B3, 0x72D1, 0x72D1, 0x3C91, 0x72D2, 0x72D2, 0x15F8,
+ 0x72D3, 0x72D6, 0x3C92, 0x72D7, 0x72D7, 0x0710, 0x72D8, 0x72D8, 0x3C96,
+ 0x72D9, 0x72D9, 0x0900, 0x72DA, 0x72DD, 0x3C97, 0x72DE, 0x72DE, 0x0B5F,
+ 0x72DF, 0x72DF, 0x3C9B, 0x72E0, 0x72E0, 0x0794, 0x72E1, 0x72E1, 0x0897,
+ 0x72E2, 0x72E7, 0x3C9C, 0x72E8, 0x72E8, 0x15F9, 0x72E9, 0x72E9, 0x15FB,
+ 0x72EA, 0x72EB, 0x3CA2, 0x72EC, 0x72EC, 0x05FF, 0x72ED, 0x72ED, 0x0F2E,
+ 0x72EE, 0x72EE, 0x0D3F, 0x72EF, 0x72EF, 0x15FA, 0x72F0, 0x72F0, 0x1199,
+ 0x72F1, 0x72F1, 0x10E1, 0x72F2, 0x72F2, 0x15FC, 0x72F3, 0x72F3, 0x1600,
+ 0x72F4, 0x72F4, 0x15FD, 0x72F5, 0x72F6, 0x3CA4, 0x72F7, 0x72F7, 0x15FE,
+ 0x72F8, 0x72F8, 0x09D5, 0x72F9, 0x72F9, 0x21B6, 0x72FA, 0x72FB, 0x1602,
+ 0x72FC, 0x72FC, 0x09B2, 0x72FD, 0x72FD, 0x1E3D, 0x72FE, 0x72FF, 0x3CA6,
+ 0x7300, 0x7300, 0x3CA8, 0x7301, 0x7301, 0x15FF, 0x7302, 0x7302, 0x3CA9,
+ 0x7303, 0x7303, 0x1601, 0x7304, 0x7309, 0x3CAA, 0x730A, 0x730A, 0x1607,
+ 0x730B, 0x730D, 0x3CB0, 0x730E, 0x730E, 0x0A1D, 0x730F, 0x7312, 0x3CB3,
+ 0x7313, 0x7313, 0x1605, 0x7314, 0x7314, 0x3CB7, 0x7315, 0x7315, 0x160A,
+ 0x7316, 0x7316, 0x04C5, 0x7317, 0x7317, 0x1604, 0x7318, 0x731A, 0x3CB8,
+ 0x731B, 0x731B, 0x0AD2, 0x731C, 0x731C, 0x0489, 0x731D, 0x731D, 0x1609,
+ 0x731E, 0x731E, 0x1608, 0x731F, 0x7320, 0x3CBB, 0x7321, 0x7321, 0x1606,
+ 0x7322, 0x7322, 0x160B, 0x7323, 0x7324, 0x3CBD, 0x7325, 0x7325, 0x160D,
+ 0x7326, 0x7328, 0x3CBF, 0x7329, 0x7329, 0x0F94, 0x732A, 0x732A, 0x11EC,
+ 0x732B, 0x732B, 0x0AAD, 0x732C, 0x732C, 0x160E, 0x732D, 0x732D, 0x3CC2,
+ 0x732E, 0x732E, 0x0F44, 0x732F, 0x7330, 0x3CC3, 0x7331, 0x7331, 0x1610,
+ 0x7332, 0x7333, 0x3CC5, 0x7334, 0x7334, 0x07A6, 0x7335, 0x7335, 0x3CC7,
+ 0x7336, 0x7336, 0x2235, 0x7337, 0x7337, 0x18D4, 0x7338, 0x7338, 0x160F,
+ 0x7339, 0x7339, 0x160C, 0x733A, 0x733A, 0x3CC8, 0x733B, 0x733B, 0x2397,
+ 0x733C, 0x733D, 0x3CC9, 0x733E, 0x733E, 0x07C0, 0x733F, 0x733F, 0x10F6,
+ 0x7340, 0x7340, 0x3CCB, 0x7341, 0x7341, 0x2395, 0x7342, 0x7343, 0x3CCC,
+ 0x7344, 0x7344, 0x223F, 0x7345, 0x7345, 0x212A, 0x7346, 0x734C, 0x3CCE,
+ 0x734D, 0x734D, 0x1612, 0x734E, 0x734F, 0x3CD5, 0x7350, 0x7350, 0x1611,
+ 0x7351, 0x7351, 0x3CD7, 0x7352, 0x7352, 0x18D5, 0x7353, 0x7356, 0x3CD8,
+ 0x7357, 0x7357, 0x1613, 0x7358, 0x735F, 0x3CDC, 0x7360, 0x7360, 0x1614,
+ 0x7361, 0x7367, 0x3CE4, 0x7368, 0x7368, 0x1ED2, 0x7369, 0x7369, 0x3CEB,
+ 0x736A, 0x736A, 0x2396, 0x736B, 0x736B, 0x2398, 0x736C, 0x736C, 0x1615,
+ 0x736D, 0x736D, 0x0DF4, 0x736E, 0x736E, 0x3CEC, 0x736F, 0x736F, 0x1616,
+ 0x7370, 0x7370, 0x20A2, 0x7371, 0x7371, 0x3CED, 0x7372, 0x7372, 0x1F64,
+ 0x7373, 0x7374, 0x3CEE, 0x7375, 0x7375, 0x202B, 0x7376, 0x7376, 0x3CF0,
+ 0x7377, 0x7377, 0x2394, 0x7378, 0x7378, 0x2139, 0x7379, 0x7379, 0x3CF1,
+ 0x737A, 0x737A, 0x215F, 0x737B, 0x737B, 0x21C1, 0x737C, 0x737C, 0x239A,
+ 0x737D, 0x737D, 0x3CF2, 0x737E, 0x737E, 0x1617, 0x737F, 0x737F, 0x3CF3,
+ 0x7380, 0x7380, 0x2399, 0x7381, 0x7383, 0x3CF4, 0x7384, 0x7384, 0x0FC9,
+ 0x7385, 0x7386, 0x3CF7, 0x7387, 0x7387, 0x0A71, 0x7388, 0x7388, 0x3CF9,
+ 0x7389, 0x7389, 0x10D6, 0x738A, 0x738A, 0x3CFA, 0x738B, 0x738B, 0x0EA6,
+ 0x738C, 0x738D, 0x3CFB, 0x738E, 0x738E, 0x1818, 0x738F, 0x7390, 0x3CFD,
+ 0x7391, 0x7391, 0x1819, 0x7392, 0x7395, 0x3CFF, 0x7396, 0x7396, 0x08F0,
+ 0x7397, 0x739A, 0x3D03, 0x739B, 0x739B, 0x0A91, 0x739C, 0x739E, 0x3D07,
+ 0x739F, 0x739F, 0x181C, 0x73A0, 0x73A1, 0x3D0A, 0x73A2, 0x73A2, 0x181B,
+ 0x73A3, 0x73A8, 0x3D0C, 0x73A9, 0x73A9, 0x0E97, 0x73AA, 0x73AA, 0x3D12,
+ 0x73AB, 0x73AB, 0x0ABA, 0x73AC, 0x73AD, 0x3D13, 0x73AE, 0x73AE, 0x181A,
+ 0x73AF, 0x73AF, 0x07CC, 0x73B0, 0x73B0, 0x0F43, 0x73B1, 0x73B1, 0x3D15,
+ 0x73B2, 0x73B2, 0x0A2A, 0x73B3, 0x73B3, 0x1821, 0x73B4, 0x73B6, 0x3D16,
+ 0x73B7, 0x73B7, 0x1820, 0x73B8, 0x73B9, 0x3D19, 0x73BA, 0x73BA, 0x182C,
+ 0x73BB, 0x73BB, 0x046A, 0x73BC, 0x73BF, 0x3D1B, 0x73C0, 0x73C0, 0x1822,
+ 0x73C1, 0x73C1, 0x3D1F, 0x73C2, 0x73C2, 0x181E, 0x73C3, 0x73C7, 0x3D20,
+ 0x73C8, 0x73C8, 0x1824, 0x73C9, 0x73C9, 0x1823, 0x73CA, 0x73CA, 0x0CF3,
+ 0x73CB, 0x73CC, 0x3D25, 0x73CD, 0x73CD, 0x1185, 0x73CE, 0x73CE, 0x3D27,
+ 0x73CF, 0x73CF, 0x181D, 0x73D0, 0x73D0, 0x0646, 0x73D1, 0x73D1, 0x181F,
+ 0x73D2, 0x73D8, 0x3D28, 0x73D9, 0x73D9, 0x1826, 0x73DA, 0x73DD, 0x3D2F,
+ 0x73DE, 0x73DE, 0x182B, 0x73DF, 0x73DF, 0x3D33, 0x73E0, 0x73E0, 0x11E8,
+ 0x73E1, 0x73E4, 0x3D34, 0x73E5, 0x73E5, 0x1825, 0x73E6, 0x73E6, 0x3D38,
+ 0x73E7, 0x73E7, 0x182A, 0x73E8, 0x73E8, 0x3D39, 0x73E9, 0x73E9, 0x1829,
+ 0x73EA, 0x73EC, 0x3D3A, 0x73ED, 0x73ED, 0x03EB, 0x73EE, 0x73F1, 0x3D3D,
+ 0x73F2, 0x73F2, 0x182D, 0x73F3, 0x73FD, 0x3D41, 0x73FE, 0x73FE, 0x21C0,
+ 0x73FF, 0x73FF, 0x3D4C, 0x7400, 0x7402, 0x3D4D, 0x7403, 0x7403, 0x0C6F,
+ 0x7404, 0x7404, 0x3D50, 0x7405, 0x7405, 0x09B0, 0x7406, 0x7406, 0x09D8,
+ 0x7407, 0x7408, 0x3D51, 0x7409, 0x7409, 0x0A39, 0x740A, 0x740A, 0x1828,
+ 0x740B, 0x740E, 0x3D53, 0x740F, 0x740F, 0x182E, 0x7410, 0x7410, 0x0DEB,
+ 0x7411, 0x7419, 0x3D57, 0x741A, 0x741A, 0x1838, 0x741B, 0x741B, 0x1837,
+ 0x741C, 0x7421, 0x3D60, 0x7422, 0x7422, 0x121E, 0x7423, 0x7424, 0x3D66,
+ 0x7425, 0x7425, 0x1832, 0x7426, 0x7426, 0x1831, 0x7427, 0x7427, 0x3D68,
+ 0x7428, 0x7428, 0x1833, 0x7429, 0x7429, 0x3D69, 0x742A, 0x742A, 0x182F,
+ 0x742B, 0x742B, 0x3D6A, 0x742C, 0x742C, 0x1836, 0x742D, 0x742D, 0x3D6B,
+ 0x742E, 0x742E, 0x1835, 0x742F, 0x742F, 0x3D6C, 0x7430, 0x7430, 0x1834,
+ 0x7431, 0x7432, 0x3D6D, 0x7433, 0x7433, 0x0A1E, 0x7434, 0x7434, 0x0C56,
+ 0x7435, 0x7435, 0x0BBE, 0x7436, 0x7436, 0x0B84, 0x7437, 0x743B, 0x3D6F,
+ 0x743C, 0x743C, 0x0C6A, 0x743D, 0x743E, 0x3D74, 0x743F, 0x743F, 0x2460,
+ 0x7440, 0x7440, 0x3D76, 0x7441, 0x7441, 0x1839, 0x7442, 0x744A, 0x3D77,
+ 0x744B, 0x744B, 0x245C, 0x744C, 0x7454, 0x3D80, 0x7455, 0x7455, 0x183C,
+ 0x7456, 0x7456, 0x3D89, 0x7457, 0x7457, 0x183B, 0x7458, 0x7458, 0x3D8A,
+ 0x7459, 0x7459, 0x183D, 0x745A, 0x745A, 0x07AE, 0x745B, 0x745B, 0x1830,
+ 0x745C, 0x745C, 0x183A, 0x745D, 0x745D, 0x3D8B, 0x745E, 0x745E, 0x0CCB,
+ 0x745F, 0x745F, 0x0CE3, 0x7460, 0x7462, 0x3D8C, 0x7463, 0x7463, 0x215D,
+ 0x7464, 0x7468, 0x3D8F, 0x7469, 0x7469, 0x2225, 0x746A, 0x746A, 0x206A,
+ 0x746B, 0x746C, 0x3D94, 0x746D, 0x746D, 0x183F, 0x746E, 0x746F, 0x3D96,
+ 0x7470, 0x7470, 0x073E, 0x7471, 0x7475, 0x3D98, 0x7476, 0x7476, 0x1027,
+ 0x7477, 0x7477, 0x183E, 0x7478, 0x747D, 0x3D9D, 0x747E, 0x747E, 0x1840,
+ 0x747F, 0x747F, 0x3DA3, 0x7480, 0x7481, 0x1843, 0x7482, 0x7482, 0x3DA4,
+ 0x7483, 0x7483, 0x09F0, 0x7484, 0x7486, 0x3DA5, 0x7487, 0x7487, 0x1845,
+ 0x7488, 0x7488, 0x3DA8, 0x7489, 0x7489, 0x2461, 0x748A, 0x748A, 0x3DA9,
+ 0x748B, 0x748B, 0x1846, 0x748C, 0x748D, 0x3DAA, 0x748E, 0x748E, 0x1842,
+ 0x748F, 0x748F, 0x3DAC, 0x7490, 0x7490, 0x184A, 0x7491, 0x749B, 0x3DAD,
+ 0x749C, 0x749C, 0x1841, 0x749D, 0x749D, 0x3DB8, 0x749E, 0x749E, 0x1847,
+ 0x749F, 0x74A2, 0x3DB9, 0x74A3, 0x74A3, 0x245B, 0x74A4, 0x74A5, 0x3DBD,
+ 0x74A6, 0x74A6, 0x2462, 0x74A7, 0x74A7, 0x184B, 0x74A8, 0x74A9, 0x1848,
+ 0x74AA, 0x74AF, 0x3DBF, 0x74B0, 0x74B0, 0x1F54, 0x74B1, 0x74B9, 0x3DC5,
+ 0x74BA, 0x74BA, 0x184D, 0x74BB, 0x74BC, 0x3DCE, 0x74BD, 0x74BD, 0x245F,
+ 0x74BE, 0x74C9, 0x3DD0, 0x74CA, 0x74CA, 0x20EC, 0x74CB, 0x74CE, 0x3DDC,
+ 0x74CF, 0x74CF, 0x245D, 0x74D0, 0x74D1, 0x3DE0, 0x74D2, 0x74D2, 0x184C,
+ 0x74D3, 0x74D3, 0x3DE2, 0x74D4, 0x74D4, 0x2463, 0x74D5, 0x74D9, 0x3DE3,
+ 0x74DA, 0x74DA, 0x2464, 0x74DB, 0x74DB, 0x3DE8, 0x74DC, 0x74DC, 0x0728,
+ 0x74DD, 0x74DD, 0x3DE9, 0x74DE, 0x74DE, 0x1B32, 0x74DF, 0x74DF, 0x3DEA,
+ 0x74E0, 0x74E0, 0x1B33, 0x74E1, 0x74E1, 0x3DEB, 0x74E2, 0x74E2, 0x0BCF,
+ 0x74E3, 0x74E3, 0x03F5, 0x74E4, 0x74E4, 0x0C9A, 0x74E5, 0x74E5, 0x3DEC,
+ 0x74E6, 0x74E6, 0x0E90, 0x74E7, 0x74ED, 0x3DED, 0x74EE, 0x74EE, 0x0EDC,
+ 0x74EF, 0x74EF, 0x1903, 0x74F0, 0x74F3, 0x3DF4, 0x74F4, 0x74F4, 0x1904,
+ 0x74F5, 0x74F5, 0x3DF8, 0x74F6, 0x74F6, 0x0BDE, 0x74F7, 0x74F7, 0x054C,
+ 0x74F8, 0x74FE, 0x3DF9, 0x74FF, 0x74FF, 0x1905, 0x7500, 0x7503, 0x3E00,
+ 0x7504, 0x7504, 0x1188, 0x7505, 0x750B, 0x3E04, 0x750C, 0x750C, 0x24A5,
+ 0x750D, 0x750D, 0x1485, 0x750E, 0x750E, 0x3E0B, 0x750F, 0x750F, 0x1906,
+ 0x7510, 0x7510, 0x3E0C, 0x7511, 0x7511, 0x1907, 0x7512, 0x7512, 0x3E0D,
+ 0x7513, 0x7513, 0x1908, 0x7514, 0x7517, 0x3E0E, 0x7518, 0x7518, 0x06C5,
+ 0x7519, 0x7519, 0x14F8, 0x751A, 0x751A, 0x0D2E, 0x751B, 0x751B, 0x3E12,
+ 0x751C, 0x751C, 0x0E43, 0x751D, 0x751E, 0x3E13, 0x751F, 0x751F, 0x0D33,
+ 0x7520, 0x7522, 0x3E15, 0x7523, 0x7523, 0x1E70, 0x7524, 0x7524, 0x3E18,
+ 0x7525, 0x7525, 0x0D34, 0x7526, 0x7527, 0x3E19, 0x7528, 0x7528, 0x10A8,
+ 0x7529, 0x7529, 0x0D9B, 0x752A, 0x752A, 0x3E1B, 0x752B, 0x752B, 0x06A1,
+ 0x752C, 0x752C, 0x1B34, 0x752D, 0x752D, 0x042B, 0x752E, 0x752E, 0x3E1C,
+ 0x752F, 0x752F, 0x1734, 0x7530, 0x7530, 0x0E42, 0x7531, 0x7531, 0x10AE,
+ 0x7532, 0x7532, 0x084A, 0x7533, 0x7533, 0x0D23, 0x7534, 0x7534, 0x3E1D,
+ 0x7535, 0x7535, 0x05C8, 0x7536, 0x7536, 0x3E1E, 0x7537, 0x7537, 0x0B33,
+ 0x7538, 0x7538, 0x05CA, 0x7539, 0x7539, 0x3E1F, 0x753A, 0x753A, 0x1A78,
+ 0x753B, 0x753B, 0x07C2, 0x753C, 0x753D, 0x3E20, 0x753E, 0x753E, 0x1816,
+ 0x753F, 0x753F, 0x3E22, 0x7540, 0x7540, 0x1A79, 0x7541, 0x7544, 0x3E23,
+ 0x7545, 0x7545, 0x04CE, 0x7546, 0x7547, 0x3E27, 0x7548, 0x7548, 0x1A7C,
+ 0x7549, 0x754A, 0x3E29, 0x754B, 0x754B, 0x1A7B, 0x754C, 0x754C, 0x08B8,
+ 0x754D, 0x754D, 0x3E2B, 0x754E, 0x754E, 0x1A7A, 0x754F, 0x754F, 0x0EC6,
+ 0x7550, 0x7553, 0x3E2C, 0x7554, 0x7554, 0x0B90, 0x7555, 0x7558, 0x3E30,
+ 0x7559, 0x7559, 0x0A3D, 0x755A, 0x755A, 0x139E, 0x755B, 0x755B, 0x1A7D,
+ 0x755C, 0x755C, 0x0FBE, 0x755D, 0x755D, 0x208F, 0x755E, 0x7561, 0x3E34,
+ 0x7562, 0x7562, 0x1E42, 0x7563, 0x7564, 0x3E38, 0x7565, 0x7565, 0x0A7B,
+ 0x7566, 0x7566, 0x0C07, 0x7567, 0x7569, 0x3E3A, 0x756A, 0x756A, 0x0649,
+ 0x756B, 0x756B, 0x1F4E, 0x756C, 0x7571, 0x3E3D, 0x7572, 0x7572, 0x1A7E,
+ 0x7573, 0x7573, 0x3E43, 0x7574, 0x7574, 0x0510, 0x7575, 0x7575, 0x3E44,
+ 0x7576, 0x7576, 0x1EB1, 0x7577, 0x7577, 0x3E45, 0x7578, 0x7578, 0x0810,
+ 0x7579, 0x7579, 0x1A7F, 0x757A, 0x757E, 0x3E46, 0x757F, 0x757F, 0x1814,
+ 0x7580, 0x7582, 0x3E4B, 0x7583, 0x7583, 0x1A80, 0x7584, 0x7585, 0x3E4E,
+ 0x7586, 0x7586, 0x087F, 0x7587, 0x7587, 0x1E8B, 0x7588, 0x758A, 0x3E50,
+ 0x758B, 0x758B, 0x1BC6, 0x758C, 0x758E, 0x3E53, 0x758F, 0x758F, 0x0D7F,
+ 0x7590, 0x7590, 0x3E56, 0x7591, 0x7591, 0x1050, 0x7592, 0x7592, 0x1B60,
+ 0x7593, 0x7593, 0x3E57, 0x7594, 0x7594, 0x1B61, 0x7595, 0x7595, 0x3E58,
+ 0x7596, 0x7596, 0x1B62, 0x7597, 0x7597, 0x0A0F, 0x7598, 0x7598, 0x3E59,
+ 0x7599, 0x7599, 0x06E8, 0x759A, 0x759A, 0x08FD, 0x759B, 0x759C, 0x3E5A,
+ 0x759D, 0x759D, 0x1B64, 0x759E, 0x759E, 0x3E5C, 0x759F, 0x759F, 0x0B72,
+ 0x75A0, 0x75A0, 0x1B63, 0x75A1, 0x75A1, 0x101A, 0x75A2, 0x75A2, 0x3E5D,
+ 0x75A3, 0x75A3, 0x1B66, 0x75A4, 0x75A4, 0x03D7, 0x75A5, 0x75A5, 0x08BB,
+ 0x75A6, 0x75AA, 0x3E5E, 0x75AB, 0x75AB, 0x1066, 0x75AC, 0x75AC, 0x1B65,
+ 0x75AD, 0x75AD, 0x3E63, 0x75AE, 0x75AE, 0x0532, 0x75AF, 0x75AF, 0x0685,
+ 0x75B0, 0x75B0, 0x1B6C, 0x75B1, 0x75B1, 0x1B6B, 0x75B2, 0x75B2, 0x0BC2,
+ 0x75B3, 0x75B4, 0x1B67, 0x75B5, 0x75B5, 0x0546, 0x75B6, 0x75B7, 0x3E64,
+ 0x75B8, 0x75B8, 0x1B69, 0x75B9, 0x75B9, 0x118F, 0x75BA, 0x75BB, 0x3E66,
+ 0x75BC, 0x75BC, 0x0E2E, 0x75BD, 0x75BD, 0x0901, 0x75BE, 0x75BE, 0x0825,
+ 0x75BF, 0x75C1, 0x3E68, 0x75C2, 0x75C2, 0x1B6E, 0x75C3, 0x75C3, 0x1B6D,
+ 0x75C4, 0x75C4, 0x1B6A, 0x75C5, 0x75C5, 0x0468, 0x75C6, 0x75C6, 0x3E6B,
+ 0x75C7, 0x75C7, 0x11A1, 0x75C8, 0x75C8, 0x109D, 0x75C9, 0x75C9, 0x08E6,
+ 0x75CA, 0x75CA, 0x0C87, 0x75CB, 0x75CC, 0x3E6C, 0x75CD, 0x75CD, 0x1B70,
+ 0x75CE, 0x75D1, 0x3E6E, 0x75D2, 0x75D2, 0x1020, 0x75D3, 0x75D3, 0x3E72,
+ 0x75D4, 0x75D4, 0x11CB, 0x75D5, 0x75D5, 0x0792, 0x75D6, 0x75D6, 0x1B6F,
+ 0x75D7, 0x75D7, 0x3E73, 0x75D8, 0x75D8, 0x05FA, 0x75D9, 0x75D9, 0x1FC6,
+ 0x75DA, 0x75DA, 0x3E74, 0x75DB, 0x75DB, 0x0E65, 0x75DC, 0x75DD, 0x3E75,
+ 0x75DE, 0x75DE, 0x0BC5, 0x75DF, 0x75E1, 0x3E77, 0x75E2, 0x75E2, 0x09EA,
+ 0x75E3, 0x75E3, 0x1B71, 0x75E4, 0x75E4, 0x1B74, 0x75E5, 0x75E5, 0x3E7A,
+ 0x75E6, 0x75E6, 0x1B73, 0x75E7, 0x75E7, 0x1B76, 0x75E8, 0x75E8, 0x1B72,
+ 0x75E9, 0x75E9, 0x3E7B, 0x75EA, 0x75EA, 0x07D3, 0x75EB, 0x75EB, 0x1B75,
+ 0x75EC, 0x75EF, 0x3E7C, 0x75F0, 0x75F0, 0x0E08, 0x75F1, 0x75F1, 0x1B78,
+ 0x75F2, 0x75F3, 0x3E80, 0x75F4, 0x75F4, 0x04FA, 0x75F5, 0x75F8, 0x3E82,
+ 0x75F9, 0x75F9, 0x043D, 0x75FA, 0x75FB, 0x3E86, 0x75FC, 0x75FC, 0x1B79,
+ 0x75FD, 0x75FE, 0x3E88, 0x75FF, 0x75FF, 0x1B7A, 0x7600, 0x7600, 0x1B7C,
+ 0x7601, 0x7601, 0x0564, 0x7602, 0x7602, 0x25AE, 0x7603, 0x7603, 0x1B77,
+ 0x7604, 0x7604, 0x3E8A, 0x7605, 0x7605, 0x1B7D, 0x7606, 0x7609, 0x3E8B,
+ 0x760A, 0x760A, 0x1B80, 0x760B, 0x760B, 0x1F01, 0x760C, 0x760C, 0x1B7E,
+ 0x760D, 0x760D, 0x2200, 0x760E, 0x760F, 0x3E8F, 0x7610, 0x7610, 0x1B7B,
+ 0x7611, 0x7614, 0x3E91, 0x7615, 0x7615, 0x1B83, 0x7616, 0x7616, 0x3E95,
+ 0x7617, 0x7617, 0x1B7F, 0x7618, 0x7618, 0x1B82, 0x7619, 0x7619, 0x1B84,
+ 0x761A, 0x761A, 0x3E96, 0x761B, 0x761B, 0x1B85, 0x761C, 0x761D, 0x3E97,
+ 0x761E, 0x761E, 0x25B2, 0x761F, 0x761F, 0x0ED0, 0x7620, 0x7620, 0x1B88,
+ 0x7621, 0x7621, 0x1E97, 0x7622, 0x7622, 0x1B87, 0x7623, 0x7623, 0x3E99,
+ 0x7624, 0x7624, 0x0A3F, 0x7625, 0x7625, 0x1B81, 0x7626, 0x7626, 0x0D74,
+ 0x7627, 0x7627, 0x20AB, 0x7628, 0x7628, 0x3E9A, 0x7629, 0x7629, 0x0574,
+ 0x762A, 0x762A, 0x045A, 0x762B, 0x762B, 0x0E04, 0x762C, 0x762C, 0x3E9B,
+ 0x762D, 0x762D, 0x1B8A, 0x762E, 0x762F, 0x3E9C, 0x7630, 0x7630, 0x1B8B,
+ 0x7631, 0x7632, 0x3E9E, 0x7633, 0x7633, 0x1B90, 0x7634, 0x7634, 0x116F,
+ 0x7635, 0x7635, 0x1B8D, 0x7636, 0x7637, 0x3EA0, 0x7638, 0x7638, 0x0C8E,
+ 0x7639, 0x763A, 0x3EA2, 0x763B, 0x763B, 0x25B3, 0x763C, 0x763C, 0x1B86,
+ 0x763D, 0x763D, 0x3EA4, 0x763E, 0x763E, 0x1B8F, 0x763F, 0x763F, 0x1B8C,
+ 0x7640, 0x7640, 0x1B89, 0x7641, 0x7641, 0x3EA5, 0x7642, 0x7642, 0x2028,
+ 0x7643, 0x7643, 0x1B8E, 0x7644, 0x7645, 0x3EA6, 0x7646, 0x7647, 0x25AF,
+ 0x7648, 0x7648, 0x3EA8, 0x7649, 0x7649, 0x25B1, 0x764A, 0x764B, 0x3EA9,
+ 0x764C, 0x764C, 0x03B4, 0x764D, 0x764D, 0x1B91, 0x764E, 0x7653, 0x3EAB,
+ 0x7654, 0x7654, 0x1B93, 0x7655, 0x7655, 0x3EB1, 0x7656, 0x7656, 0x1B95,
+ 0x7657, 0x7657, 0x3EB2, 0x7658, 0x7658, 0x25AC, 0x7659, 0x765B, 0x3EB3,
+ 0x765C, 0x765C, 0x1B94, 0x765D, 0x765D, 0x3EB6, 0x765E, 0x765E, 0x1B92,
+ 0x765F, 0x765F, 0x1E4E, 0x7660, 0x7661, 0x3EB7, 0x7662, 0x7662, 0x2202,
+ 0x7663, 0x7663, 0x0FCB, 0x7664, 0x7664, 0x25AB, 0x7665, 0x7665, 0x2286,
+ 0x7666, 0x7666, 0x3EB9, 0x7667, 0x7667, 0x25AD, 0x7668, 0x7668, 0x3EBA,
+ 0x7669, 0x7669, 0x25B6, 0x766A, 0x766A, 0x3EBB, 0x766B, 0x766B, 0x1B96,
+ 0x766C, 0x766C, 0x21E3, 0x766D, 0x766E, 0x25B4, 0x766F, 0x766F, 0x1B97,
+ 0x7670, 0x7670, 0x222F, 0x7671, 0x7671, 0x2165, 0x7672, 0x7672, 0x25B7,
+ 0x7673, 0x7677, 0x3EBC, 0x7678, 0x7678, 0x0748, 0x7679, 0x767A, 0x3EC1,
+ 0x767B, 0x767B, 0x05A8, 0x767C, 0x767C, 0x1EE9, 0x767D, 0x767D, 0x03E2,
+ 0x767E, 0x767E, 0x03E4, 0x767F, 0x7681, 0x3EC3, 0x7682, 0x7682, 0x1130,
+ 0x7683, 0x7683, 0x3EC6, 0x7684, 0x7684, 0x05A5, 0x7685, 0x7685, 0x3EC7,
+ 0x7686, 0x7686, 0x08A5, 0x7687, 0x7687, 0x07DF, 0x7688, 0x7688, 0x1B2D,
+ 0x7689, 0x768A, 0x3EC8, 0x768B, 0x768B, 0x06D9, 0x768C, 0x768D, 0x3ECA,
+ 0x768E, 0x768E, 0x1B2E, 0x768F, 0x7690, 0x3ECC, 0x7691, 0x7691, 0x03B3,
+ 0x7692, 0x7692, 0x3ECE, 0x7693, 0x7693, 0x1B2F, 0x7694, 0x7695, 0x3ECF,
+ 0x7696, 0x7696, 0x0E9F, 0x7697, 0x7698, 0x3ED1, 0x7699, 0x7699, 0x1B30,
+ 0x769A, 0x769A, 0x1E25, 0x769B, 0x76A3, 0x3ED3, 0x76A4, 0x76A4, 0x1B31,
+ 0x76A5, 0x76AD, 0x3EDC, 0x76AE, 0x76AE, 0x0BC3, 0x76AF, 0x76B0, 0x3EE5,
+ 0x76B1, 0x76B1, 0x11E4, 0x76B2, 0x76B2, 0x1BC8, 0x76B3, 0x76B3, 0x3EE7,
+ 0x76B4, 0x76B4, 0x1BC9, 0x76B5, 0x76B7, 0x3EE8, 0x76B8, 0x76B8, 0x25C0,
+ 0x76B9, 0x76B9, 0x3EEB, 0x76BA, 0x76BA, 0x229A, 0x76BB, 0x76BE, 0x3EEC,
+ 0x76BF, 0x76BF, 0x0AF8, 0x76C0, 0x76C1, 0x3EF0, 0x76C2, 0x76C2, 0x10C0,
+ 0x76C3, 0x76C4, 0x3EF2, 0x76C5, 0x76C5, 0x11D0, 0x76C6, 0x76C6, 0x0BA9,
+ 0x76C7, 0x76C7, 0x3EF4, 0x76C8, 0x76C8, 0x1094, 0x76C9, 0x76C9, 0x3EF5,
+ 0x76CA, 0x76CA, 0x106D, 0x76CB, 0x76CC, 0x3EF6, 0x76CD, 0x76CD, 0x1A8B,
+ 0x76CE, 0x76CE, 0x03C6, 0x76CF, 0x76CF, 0x1156, 0x76D0, 0x76D0, 0x0FF7,
+ 0x76D1, 0x76D1, 0x0853, 0x76D2, 0x76D2, 0x0787, 0x76D3, 0x76D3, 0x3EF8,
+ 0x76D4, 0x76D4, 0x0985, 0x76D5, 0x76D5, 0x3EF9, 0x76D6, 0x76D6, 0x06C2,
+ 0x76D7, 0x76D7, 0x05A2, 0x76D8, 0x76D8, 0x0B8D, 0x76D9, 0x76DA, 0x3EFA,
+ 0x76DB, 0x76DB, 0x0D39, 0x76DC, 0x76DD, 0x3EFC, 0x76DE, 0x76DE, 0x226E,
+ 0x76DF, 0x76DF, 0x0AD0, 0x76E0, 0x76E0, 0x3EFE, 0x76E1, 0x76E1, 0x1FBD,
+ 0x76E2, 0x76E2, 0x3EFF, 0x76E3, 0x76E3, 0x1F84, 0x76E4, 0x76E4, 0x20B2,
+ 0x76E5, 0x76E5, 0x1A8C, 0x76E6, 0x76E6, 0x3F00, 0x76E7, 0x76E7, 0x2043,
+ 0x76E8, 0x76ED, 0x3F01, 0x76EE, 0x76EE, 0x0B22, 0x76EF, 0x76EF, 0x05E1,
+ 0x76F0, 0x76F0, 0x3F07, 0x76F1, 0x76F1, 0x1A58, 0x76F2, 0x76F2, 0x0AA9,
+ 0x76F3, 0x76F3, 0x3F08, 0x76F4, 0x76F4, 0x11B0, 0x76F5, 0x76F7, 0x3F09,
+ 0x76F8, 0x76F8, 0x0F4D, 0x76F9, 0x76F9, 0x1A5B, 0x76FA, 0x76FB, 0x3F0C,
+ 0x76FC, 0x76FC, 0x0B8F, 0x76FD, 0x76FD, 0x3F0E, 0x76FE, 0x76FE, 0x061B,
+ 0x76FF, 0x76FF, 0x3F0F, 0x7700, 0x7700, 0x3F10, 0x7701, 0x7701, 0x0D38,
+ 0x7702, 0x7703, 0x3F11, 0x7704, 0x7704, 0x1A59, 0x7705, 0x7706, 0x3F13,
+ 0x7707, 0x7708, 0x1A5C, 0x7709, 0x7709, 0x0AC1, 0x770A, 0x770A, 0x3F15,
+ 0x770B, 0x770B, 0x0941, 0x770C, 0x770C, 0x3F16, 0x770D, 0x770D, 0x1A5A,
+ 0x770E, 0x7718, 0x3F17, 0x7719, 0x7719, 0x1A60, 0x771A, 0x771A, 0x1A5E,
+ 0x771B, 0x771E, 0x3F22, 0x771F, 0x771F, 0x1187, 0x7720, 0x7720, 0x0AE4,
+ 0x7721, 0x7721, 0x3F26, 0x7722, 0x7722, 0x1A5F, 0x7723, 0x7725, 0x3F27,
+ 0x7726, 0x7726, 0x1A62, 0x7727, 0x7727, 0x3F2A, 0x7728, 0x7728, 0x1144,
+ 0x7729, 0x7729, 0x0FCC, 0x772A, 0x772C, 0x3F2B, 0x772D, 0x772D, 0x1A61,
+ 0x772E, 0x772E, 0x3F2E, 0x772F, 0x772F, 0x0AD5, 0x7730, 0x7734, 0x3F2F,
+ 0x7735, 0x7735, 0x1A63, 0x7736, 0x7736, 0x0981, 0x7737, 0x7737, 0x091B,
+ 0x7738, 0x7738, 0x1A64, 0x7739, 0x7739, 0x3F34, 0x773A, 0x773A, 0x0E4A,
+ 0x773B, 0x773B, 0x3F35, 0x773C, 0x773C, 0x1004, 0x773D, 0x773F, 0x3F36,
+ 0x7740, 0x7740, 0x1222, 0x7741, 0x7741, 0x1197, 0x7742, 0x7742, 0x3F39,
+ 0x7743, 0x7743, 0x1A68, 0x7744, 0x7746, 0x3F3A, 0x7747, 0x7747, 0x1A67,
+ 0x7748, 0x774E, 0x3F3D, 0x774F, 0x774F, 0x2684, 0x7750, 0x7751, 0x1A65,
+ 0x7752, 0x7759, 0x3F44, 0x775A, 0x775A, 0x1A69, 0x775B, 0x775B, 0x08D5,
+ 0x775C, 0x775D, 0x3F4C, 0x775E, 0x775E, 0x24EF, 0x775F, 0x7760, 0x3F4E,
+ 0x7761, 0x7761, 0x0DA4, 0x7762, 0x7762, 0x1A6B, 0x7763, 0x7763, 0x05FC,
+ 0x7764, 0x7764, 0x3F50, 0x7765, 0x7765, 0x1A6C, 0x7766, 0x7766, 0x0B23,
+ 0x7767, 0x7767, 0x3F51, 0x7768, 0x7768, 0x1A6A, 0x7769, 0x776A, 0x3F52,
+ 0x776B, 0x776B, 0x08AF, 0x776C, 0x776C, 0x048E, 0x776D, 0x7778, 0x3F54,
+ 0x7779, 0x7779, 0x0602, 0x777A, 0x777C, 0x3F60, 0x777D, 0x777D, 0x1A6F,
+ 0x777E, 0x777E, 0x1270, 0x777F, 0x777F, 0x1A6D, 0x7780, 0x7780, 0x1A70,
+ 0x7781, 0x7783, 0x3F63, 0x7784, 0x7784, 0x0AEE, 0x7785, 0x7785, 0x0517,
+ 0x7786, 0x778B, 0x3F66, 0x778C, 0x778C, 0x1A71, 0x778D, 0x778D, 0x1A6E,
+ 0x778E, 0x778E, 0x0F26, 0x778F, 0x7790, 0x3F6C, 0x7791, 0x7791, 0x1A72,
+ 0x7792, 0x7792, 0x0A9E, 0x7793, 0x7797, 0x3F6E, 0x7798, 0x7798, 0x24EE,
+ 0x7799, 0x779D, 0x3F73, 0x779E, 0x779E, 0x2074, 0x779F, 0x77A0, 0x1A73,
+ 0x77A1, 0x77A1, 0x3F78, 0x77A2, 0x77A2, 0x1495, 0x77A3, 0x77A4, 0x3F79,
+ 0x77A5, 0x77A5, 0x0BD2, 0x77A6, 0x77A6, 0x3F7B, 0x77A7, 0x77A7, 0x0C43,
+ 0x77A8, 0x77A8, 0x3F7C, 0x77A9, 0x77A9, 0x11F4, 0x77AA, 0x77AA, 0x05AA,
+ 0x77AB, 0x77AB, 0x3F7D, 0x77AC, 0x77AC, 0x0DA7, 0x77AD, 0x77AD, 0x2687,
+ 0x77AE, 0x77AF, 0x3F7E, 0x77B0, 0x77B0, 0x1A75, 0x77B1, 0x77B2, 0x3F80,
+ 0x77B3, 0x77B3, 0x0E5C, 0x77B4, 0x77B4, 0x3F82, 0x77B5, 0x77B5, 0x1A76,
+ 0x77B6, 0x77BA, 0x3F83, 0x77BB, 0x77BB, 0x1151, 0x77BC, 0x77BC, 0x24F0,
+ 0x77BD, 0x77BD, 0x1A77, 0x77BE, 0x77BE, 0x3F88, 0x77BF, 0x77BF, 0x1D7E,
+ 0x77C0, 0x77C6, 0x3F89, 0x77C7, 0x77C7, 0x268D, 0x77C8, 0x77CC, 0x3F90,
+ 0x77CD, 0x77CD, 0x1397, 0x77CE, 0x77D6, 0x3F95, 0x77D7, 0x77D7, 0x0526,
+ 0x77D8, 0x77D9, 0x3F9E, 0x77DA, 0x77DA, 0x22A0, 0x77DB, 0x77DB, 0x0AB1,
+ 0x77DC, 0x77DC, 0x1BCA, 0x77DD, 0x77E1, 0x3FA0, 0x77E2, 0x77E2, 0x0D4F,
+ 0x77E3, 0x77E3, 0x105A, 0x77E4, 0x77E4, 0x3FA5, 0x77E5, 0x77E5, 0x11A9,
+ 0x77E6, 0x77E6, 0x3FA6, 0x77E7, 0x77E7, 0x1B1A, 0x77E8, 0x77E8, 0x3FA7,
+ 0x77E9, 0x77E9, 0x0907, 0x77EA, 0x77EA, 0x3FA8, 0x77EB, 0x77EB, 0x0894,
+ 0x77EC, 0x77EC, 0x1B1B, 0x77ED, 0x77ED, 0x060B, 0x77EE, 0x77EE, 0x03B6,
+ 0x77EF, 0x77EF, 0x1FAB, 0x77F0, 0x77F2, 0x3FA9, 0x77F3, 0x77F3, 0x0D46,
+ 0x77F4, 0x77F5, 0x3FAC, 0x77F6, 0x77F6, 0x1A22, 0x77F7, 0x77F7, 0x3FAE,
+ 0x77F8, 0x77F8, 0x1A23, 0x77F9, 0x77FC, 0x3FAF, 0x77FD, 0x77FD, 0x0F08,
+ 0x77FE, 0x77FE, 0x064C, 0x77FF, 0x77FF, 0x0980, 0x7800, 0x7800, 0x1A24,
+ 0x7801, 0x7801, 0x0A92, 0x7802, 0x7802, 0x0CE9, 0x7803, 0x7808, 0x3FB3,
+ 0x7809, 0x7809, 0x1A25, 0x780A, 0x780B, 0x3FB9, 0x780C, 0x780C, 0x0C15,
+ 0x780D, 0x780D, 0x0940, 0x780E, 0x7810, 0x3FBB, 0x7811, 0x7811, 0x1A28,
+ 0x7812, 0x7812, 0x0BB9, 0x7813, 0x7813, 0x3FBE, 0x7814, 0x7814, 0x0FF9,
+ 0x7815, 0x7815, 0x3FBF, 0x7816, 0x7816, 0x1206, 0x7817, 0x7818, 0x1A26,
+ 0x7819, 0x7819, 0x3FC0, 0x781A, 0x781A, 0x100B, 0x781B, 0x781B, 0x3FC1,
+ 0x781C, 0x781D, 0x1A2B, 0x781E, 0x781E, 0x3FC2, 0x781F, 0x781F, 0x1A30,
+ 0x7820, 0x7822, 0x3FC3, 0x7823, 0x7823, 0x1A34, 0x7824, 0x7824, 0x3FC6,
+ 0x7825, 0x7825, 0x1A32, 0x7826, 0x7826, 0x1A3A, 0x7827, 0x7827, 0x1189,
+ 0x7828, 0x7828, 0x3FC7, 0x7829, 0x7829, 0x1A35, 0x782A, 0x782B, 0x3FC8,
+ 0x782C, 0x782C, 0x1A33, 0x782D, 0x782D, 0x1A2A, 0x782E, 0x782F, 0x3FCA,
+ 0x7830, 0x7830, 0x0BAA, 0x7831, 0x7833, 0x3FCC, 0x7834, 0x7834, 0x0BE5,
+ 0x7835, 0x7836, 0x3FCF, 0x7837, 0x7837, 0x0D22, 0x7838, 0x7838, 0x1115,
+ 0x7839, 0x783B, 0x1A2D, 0x783C, 0x783C, 0x1A31, 0x783D, 0x783D, 0x3FD1,
+ 0x783E, 0x783E, 0x09E4, 0x783F, 0x783F, 0x3FD2, 0x7840, 0x7840, 0x0524,
+ 0x7841, 0x7842, 0x3FD3, 0x7843, 0x7843, 0x26A8, 0x7844, 0x7844, 0x3FD5,
+ 0x7845, 0x7845, 0x0741, 0x7846, 0x7846, 0x3FD6, 0x7847, 0x7847, 0x1A3C,
+ 0x7848, 0x784B, 0x3FD7, 0x784C, 0x784C, 0x1A3D, 0x784D, 0x784D, 0x3FDB,
+ 0x784E, 0x784E, 0x1A36, 0x784F, 0x784F, 0x3FDC, 0x7850, 0x7850, 0x1A3B,
+ 0x7851, 0x7851, 0x3FDD, 0x7852, 0x7852, 0x0F07, 0x7853, 0x7854, 0x3FDE,
+ 0x7855, 0x7855, 0x0DAB, 0x7856, 0x7857, 0x1A38, 0x7858, 0x785C, 0x3FE0,
+ 0x785D, 0x785D, 0x0F62, 0x785E, 0x7863, 0x3FE5, 0x7864, 0x7864, 0x24E9,
+ 0x7865, 0x7867, 0x3FEB, 0x7868, 0x7868, 0x24E5, 0x7869, 0x7869, 0x3FEE,
+ 0x786A, 0x786A, 0x1A3E, 0x786B, 0x786B, 0x0A3B, 0x786C, 0x786C, 0x1097,
+ 0x786D, 0x786D, 0x1A37, 0x786E, 0x786E, 0x0C92, 0x786F, 0x786F, 0x21FA,
+ 0x7870, 0x7876, 0x3FEF, 0x7877, 0x7877, 0x0862, 0x7878, 0x787B, 0x3FF6,
+ 0x787C, 0x787C, 0x0BB1, 0x787D, 0x7886, 0x3FFA, 0x7887, 0x7887, 0x1A42,
+ 0x7888, 0x7888, 0x4004, 0x7889, 0x7889, 0x05D0, 0x788A, 0x788B, 0x4005,
+ 0x788C, 0x788C, 0x0A5C, 0x788D, 0x788D, 0x03B8, 0x788E, 0x788E, 0x0DDE,
+ 0x788F, 0x7890, 0x4007, 0x7891, 0x7891, 0x0417, 0x7892, 0x7892, 0x4009,
+ 0x7893, 0x7893, 0x1A40, 0x7894, 0x7896, 0x400A, 0x7897, 0x7897, 0x0E9C,
+ 0x7898, 0x7898, 0x05C3, 0x7899, 0x7899, 0x400D, 0x789A, 0x789A, 0x1A41,
+ 0x789B, 0x789B, 0x1A3F, 0x789C, 0x789C, 0x1A43, 0x789D, 0x789E, 0x400E,
+ 0x789F, 0x789F, 0x05DB, 0x78A0, 0x78A0, 0x4010, 0x78A1, 0x78A1, 0x1A44,
+ 0x78A2, 0x78A2, 0x4011, 0x78A3, 0x78A3, 0x1A45, 0x78A4, 0x78A4, 0x4012,
+ 0x78A5, 0x78A5, 0x1A48, 0x78A6, 0x78A6, 0x4013, 0x78A7, 0x78A7, 0x0435,
+ 0x78A8, 0x78A8, 0x4014, 0x78A9, 0x78A9, 0x2148, 0x78AA, 0x78AC, 0x4015,
+ 0x78AD, 0x78AD, 0x24E4, 0x78AE, 0x78AF, 0x4018, 0x78B0, 0x78B0, 0x0BB7,
+ 0x78B1, 0x78B1, 0x0861, 0x78B2, 0x78B2, 0x1A46, 0x78B3, 0x78B3, 0x0E0F,
+ 0x78B4, 0x78B4, 0x04B1, 0x78B5, 0x78B7, 0x401A, 0x78B8, 0x78B8, 0x24E6,
+ 0x78B9, 0x78B9, 0x1A47, 0x78BA, 0x78BA, 0x20F7, 0x78BB, 0x78BB, 0x401D,
+ 0x78BC, 0x78BC, 0x206B, 0x78BD, 0x78BD, 0x401E, 0x78BE, 0x78BE, 0x0B4E,
+ 0x78BF, 0x78C0, 0x401F, 0x78C1, 0x78C1, 0x0548, 0x78C2, 0x78C4, 0x4021,
+ 0x78C5, 0x78C5, 0x0400, 0x78C6, 0x78C8, 0x4024, 0x78C9, 0x78C9, 0x1A4B,
+ 0x78CA, 0x78CA, 0x09C5, 0x78CB, 0x78CB, 0x056B, 0x78CC, 0x78CF, 0x4027,
+ 0x78D0, 0x78D0, 0x0B8E, 0x78D1, 0x78D3, 0x402B, 0x78D4, 0x78D4, 0x1A49,
+ 0x78D5, 0x78D5, 0x0951, 0x78D6, 0x78D8, 0x402E, 0x78D9, 0x78D9, 0x1A4A,
+ 0x78DA, 0x78DA, 0x22A7, 0x78DB, 0x78E2, 0x4031, 0x78E3, 0x78E3, 0x24EC,
+ 0x78E4, 0x78E6, 0x4039, 0x78E7, 0x78E7, 0x24EB, 0x78E8, 0x78E8, 0x0B08,
+ 0x78E9, 0x78EB, 0x403C, 0x78EC, 0x78EC, 0x1A4C, 0x78ED, 0x78EE, 0x403F,
+ 0x78EF, 0x78EF, 0x24E3, 0x78F0, 0x78F1, 0x4041, 0x78F2, 0x78F2, 0x1A4D,
+ 0x78F3, 0x78F3, 0x4043, 0x78F4, 0x78F4, 0x1A4F, 0x78F5, 0x78F6, 0x4044,
+ 0x78F7, 0x78F7, 0x0A20, 0x78F8, 0x78F9, 0x4046, 0x78FA, 0x78FA, 0x07DC,
+ 0x78FB, 0x78FC, 0x4048, 0x78FD, 0x78FD, 0x24EA, 0x78FE, 0x78FF, 0x404A,
+ 0x7900, 0x7900, 0x404C, 0x7901, 0x7901, 0x0889, 0x7902, 0x7904, 0x404D,
+ 0x7905, 0x7905, 0x1A4E, 0x7906, 0x790D, 0x4050, 0x790E, 0x790E, 0x1E92,
+ 0x790F, 0x7912, 0x4058, 0x7913, 0x7913, 0x1A50, 0x7914, 0x7918, 0x405C,
+ 0x7919, 0x7919, 0x1E27, 0x791A, 0x791D, 0x4061, 0x791E, 0x791E, 0x1A52,
+ 0x791F, 0x7923, 0x4065, 0x7924, 0x7924, 0x1A51, 0x7925, 0x7925, 0x406A,
+ 0x7926, 0x7926, 0x1FE6, 0x7927, 0x7929, 0x406B, 0x792A, 0x792A, 0x24E7,
+ 0x792B, 0x792B, 0x2012, 0x792C, 0x792C, 0x1EEC, 0x792D, 0x7930, 0x406E,
+ 0x7931, 0x7931, 0x24E8, 0x7932, 0x7933, 0x4072, 0x7934, 0x7934, 0x1A53,
+ 0x7935, 0x7939, 0x4074, 0x793A, 0x793A, 0x0D55, 0x793B, 0x793B, 0x19F8,
+ 0x793C, 0x793C, 0x09DC, 0x793D, 0x793D, 0x4079, 0x793E, 0x793E, 0x0D20,
+ 0x793F, 0x793F, 0x407A, 0x7940, 0x7940, 0x19F9, 0x7941, 0x7941, 0x0C0D,
+ 0x7942, 0x7945, 0x407B, 0x7946, 0x7946, 0x19FA, 0x7947, 0x7947, 0x407F,
+ 0x7948, 0x7948, 0x0C0C, 0x7949, 0x7949, 0x19FB, 0x794A, 0x7952, 0x4080,
+ 0x7953, 0x7953, 0x19FE, 0x7954, 0x7955, 0x4089, 0x7956, 0x7956, 0x1243,
+ 0x7957, 0x7957, 0x1A01, 0x7958, 0x7959, 0x408B, 0x795A, 0x795A, 0x19FF,
+ 0x795B, 0x795C, 0x19FC, 0x795D, 0x795D, 0x1200, 0x795E, 0x795E, 0x0D2A,
+ 0x795F, 0x795F, 0x0DE3, 0x7960, 0x7960, 0x1A02, 0x7961, 0x7961, 0x408D,
+ 0x7962, 0x7962, 0x1A00, 0x7963, 0x7964, 0x408E, 0x7965, 0x7965, 0x0F56,
+ 0x7966, 0x7966, 0x4090, 0x7967, 0x7967, 0x1A04, 0x7968, 0x7968, 0x0BD0,
+ 0x7969, 0x796C, 0x4091, 0x796D, 0x796D, 0x0833, 0x796E, 0x796E, 0x4095,
+ 0x796F, 0x796F, 0x1A03, 0x7970, 0x7976, 0x4096, 0x7977, 0x7977, 0x059C,
+ 0x7978, 0x7978, 0x080B, 0x7979, 0x7979, 0x409D, 0x797A, 0x797A, 0x1A05,
+ 0x797B, 0x797F, 0x409E, 0x7980, 0x7980, 0x130B, 0x7981, 0x7981, 0x08CC,
+ 0x7982, 0x7983, 0x40A3, 0x7984, 0x7984, 0x0A62, 0x7985, 0x7985, 0x1A06,
+ 0x7986, 0x7989, 0x40A5, 0x798A, 0x798A, 0x1A07, 0x798B, 0x798C, 0x40A9,
+ 0x798D, 0x798D, 0x1F66, 0x798E, 0x798E, 0x24DC, 0x798F, 0x798F, 0x069E,
+ 0x7990, 0x7999, 0x40AB, 0x799A, 0x799A, 0x1A08, 0x799B, 0x79A5, 0x40B5,
+ 0x79A6, 0x79A6, 0x26A2, 0x79A7, 0x79A7, 0x1A09, 0x79A8, 0x79A9, 0x40C0,
+ 0x79AA, 0x79AA, 0x24DD, 0x79AB, 0x79AD, 0x40C2, 0x79AE, 0x79AE, 0x200E,
+ 0x79AF, 0x79AF, 0x40C5, 0x79B0, 0x79B0, 0x24DB, 0x79B1, 0x79B1, 0x1EB8,
+ 0x79B2, 0x79B2, 0x40C6, 0x79B3, 0x79B3, 0x1A0A, 0x79B4, 0x79B8, 0x40C7,
+ 0x79B9, 0x79B9, 0x10D2, 0x79BA, 0x79BA, 0x1264, 0x79BB, 0x79BB, 0x09D6,
+ 0x79BC, 0x79BC, 0x40CC, 0x79BD, 0x79BD, 0x0C5A, 0x79BE, 0x79BE, 0x0783,
+ 0x79BF, 0x79BF, 0x40CD, 0x79C0, 0x79C0, 0x0FAE, 0x79C1, 0x79C1, 0x0DB2,
+ 0x79C2, 0x79C2, 0x40CE, 0x79C3, 0x79C3, 0x0E6B, 0x79C4, 0x79C5, 0x40CF,
+ 0x79C6, 0x79C6, 0x06CC, 0x79C7, 0x79C8, 0x40D1, 0x79C9, 0x79C9, 0x0465,
+ 0x79CA, 0x79CA, 0x40D3, 0x79CB, 0x79CB, 0x0C6C, 0x79CC, 0x79CC, 0x40D4,
+ 0x79CD, 0x79CD, 0x11D5, 0x79CE, 0x79D0, 0x40D5, 0x79D1, 0x79D1, 0x0953,
+ 0x79D2, 0x79D2, 0x0AF0, 0x79D3, 0x79D4, 0x40D8, 0x79D5, 0x79D5, 0x1B1D,
+ 0x79D6, 0x79D7, 0x40DA, 0x79D8, 0x79D8, 0x0ADD, 0x79D9, 0x79DE, 0x40DC,
+ 0x79DF, 0x79DF, 0x123F, 0x79E0, 0x79E2, 0x40E2, 0x79E3, 0x79E3, 0x1B1F,
+ 0x79E4, 0x79E4, 0x04F8, 0x79E5, 0x79E5, 0x40E5, 0x79E6, 0x79E6, 0x0C55,
+ 0x79E7, 0x79E7, 0x1016, 0x79E8, 0x79E8, 0x40E6, 0x79E9, 0x79E9, 0x11C7,
+ 0x79EA, 0x79EA, 0x40E7, 0x79EB, 0x79EB, 0x1B20, 0x79EC, 0x79EC, 0x40E8,
+ 0x79ED, 0x79ED, 0x1B1E, 0x79EE, 0x79EE, 0x40E9, 0x79EF, 0x79EF, 0x0812,
+ 0x79F0, 0x79F0, 0x04EB, 0x79F1, 0x79F7, 0x40EA, 0x79F8, 0x79F8, 0x08A6,
+ 0x79F9, 0x79FA, 0x40F1, 0x79FB, 0x79FB, 0x104D, 0x79FC, 0x79FC, 0x40F3,
+ 0x79FD, 0x79FD, 0x07F5, 0x79FE, 0x79FF, 0x40F4, 0x7A00, 0x7A00, 0x0F0E,
+ 0x7A01, 0x7A01, 0x40F6, 0x7A02, 0x7A02, 0x1B24, 0x7A03, 0x7A03, 0x1B23,
+ 0x7A04, 0x7A05, 0x40F7, 0x7A06, 0x7A06, 0x1B21, 0x7A07, 0x7A0A, 0x40F9,
+ 0x7A0B, 0x7A0B, 0x04F1, 0x7A0C, 0x7A0C, 0x40FD, 0x7A0D, 0x7A0D, 0x0D0D,
+ 0x7A0E, 0x7A0E, 0x0DA5, 0x7A0F, 0x7A13, 0x40FE, 0x7A14, 0x7A14, 0x1B26,
+ 0x7A15, 0x7A16, 0x4103, 0x7A17, 0x7A17, 0x03E9, 0x7A18, 0x7A19, 0x4105,
+ 0x7A1A, 0x7A1A, 0x11C8, 0x7A1B, 0x7A1D, 0x4107, 0x7A1E, 0x7A1E, 0x1B25,
+ 0x7A1F, 0x7A1F, 0x410A, 0x7A20, 0x7A20, 0x0512, 0x7A21, 0x7A22, 0x410B,
+ 0x7A23, 0x7A23, 0x1D8F, 0x7A24, 0x7A2D, 0x410D, 0x7A2E, 0x7A2E, 0x2295,
+ 0x7A2F, 0x7A30, 0x4117, 0x7A31, 0x7A31, 0x1E80, 0x7A32, 0x7A32, 0x4119,
+ 0x7A33, 0x7A33, 0x0ED7, 0x7A34, 0x7A36, 0x411A, 0x7A37, 0x7A37, 0x1B28,
+ 0x7A38, 0x7A38, 0x411D, 0x7A39, 0x7A39, 0x1B27, 0x7A3A, 0x7A3A, 0x411E,
+ 0x7A3B, 0x7A3B, 0x059F, 0x7A3C, 0x7A3C, 0x084D, 0x7A3D, 0x7A3D, 0x0811,
+ 0x7A3E, 0x7A3E, 0x411F, 0x7A3F, 0x7A3F, 0x06E0, 0x7A40, 0x7A40, 0x2677,
+ 0x7A41, 0x7A45, 0x4120, 0x7A46, 0x7A46, 0x0B25, 0x7A47, 0x7A4B, 0x4125,
+ 0x7A4C, 0x7A4C, 0x2624, 0x7A4D, 0x7A4D, 0x1F69, 0x7A4E, 0x7A4E, 0x222B,
+ 0x7A4F, 0x7A50, 0x412A, 0x7A51, 0x7A51, 0x1B29, 0x7A52, 0x7A56, 0x412C,
+ 0x7A57, 0x7A57, 0x0DE0, 0x7A58, 0x7A60, 0x4131, 0x7A61, 0x7A61, 0x257F,
+ 0x7A62, 0x7A62, 0x1F5B, 0x7A63, 0x7A68, 0x413A, 0x7A69, 0x7A69, 0x219B,
+ 0x7A6A, 0x7A6A, 0x4140, 0x7A6B, 0x7A6B, 0x267D, 0x7A6C, 0x7A6F, 0x4141,
+ 0x7A70, 0x7A70, 0x1B2C, 0x7A71, 0x7A73, 0x4145, 0x7A74, 0x7A74, 0x0FD1,
+ 0x7A75, 0x7A75, 0x4148, 0x7A76, 0x7A76, 0x08EE, 0x7A77, 0x7A77, 0x0C6B,
+ 0x7A78, 0x7A79, 0x1B9A, 0x7A7A, 0x7A7A, 0x0962, 0x7A7B, 0x7A7E, 0x4149,
+ 0x7A7F, 0x7A7F, 0x052C, 0x7A80, 0x7A80, 0x1B9C, 0x7A81, 0x7A81, 0x0E6C,
+ 0x7A82, 0x7A82, 0x414D, 0x7A83, 0x7A83, 0x0C51, 0x7A84, 0x7A84, 0x114E,
+ 0x7A85, 0x7A85, 0x414E, 0x7A86, 0x7A86, 0x1B9D, 0x7A87, 0x7A87, 0x414F,
+ 0x7A88, 0x7A88, 0x1B9E, 0x7A89, 0x7A8C, 0x4150, 0x7A8D, 0x7A8D, 0x0C4C,
+ 0x7A8E, 0x7A90, 0x4154, 0x7A91, 0x7A91, 0x102B, 0x7A92, 0x7A92, 0x11CE,
+ 0x7A93, 0x7A94, 0x4157, 0x7A95, 0x7A95, 0x1B9F, 0x7A96, 0x7A96, 0x08A2,
+ 0x7A97, 0x7A97, 0x0533, 0x7A98, 0x7A98, 0x08EC, 0x7A99, 0x7A9B, 0x4159,
+ 0x7A9C, 0x7A9C, 0x055F, 0x7A9D, 0x7A9D, 0x0EE0, 0x7A9E, 0x7A9E, 0x415C,
+ 0x7A9F, 0x7A9F, 0x096C, 0x7AA0, 0x7AA0, 0x1BA1, 0x7AA1, 0x7AA4, 0x415D,
+ 0x7AA5, 0x7AA5, 0x0987, 0x7AA6, 0x7AA6, 0x1BA0, 0x7AA7, 0x7AA7, 0x4161,
+ 0x7AA8, 0x7AA8, 0x1BA3, 0x7AA9, 0x7AA9, 0x21A0, 0x7AAA, 0x7AAA, 0x2186,
+ 0x7AAB, 0x7AAB, 0x4162, 0x7AAC, 0x7AAC, 0x1BA2, 0x7AAD, 0x7AAD, 0x1BA4,
+ 0x7AAE, 0x7AAE, 0x20ED, 0x7AAF, 0x7AB2, 0x4163, 0x7AB3, 0x7AB3, 0x1BA5,
+ 0x7AB4, 0x7AB5, 0x4167, 0x7AB6, 0x7AB6, 0x25B9, 0x7AB7, 0x7AB9, 0x4169,
+ 0x7ABA, 0x7ABA, 0x1FEA, 0x7ABB, 0x7ABE, 0x416C, 0x7ABF, 0x7ABF, 0x0A47,
+ 0x7AC0, 0x7AC3, 0x4170, 0x7AC4, 0x7AC4, 0x1EA4, 0x7AC5, 0x7AC5, 0x20E1,
+ 0x7AC6, 0x7AC6, 0x4174, 0x7AC7, 0x7AC7, 0x25B8, 0x7AC8, 0x7AC8, 0x2260,
+ 0x7AC9, 0x7AC9, 0x4175, 0x7ACA, 0x7ACA, 0x20E2, 0x7ACB, 0x7ACB, 0x09EB,
+ 0x7ACC, 0x7AD5, 0x4176, 0x7AD6, 0x7AD6, 0x0D91, 0x7AD7, 0x7AD8, 0x4180,
+ 0x7AD9, 0x7AD9, 0x115F, 0x7ADA, 0x7ADD, 0x4182, 0x7ADE, 0x7ADE, 0x08E9,
+ 0x7ADF, 0x7ADF, 0x08E8, 0x7AE0, 0x7AE0, 0x1163, 0x7AE1, 0x7AE2, 0x4186,
+ 0x7AE3, 0x7AE3, 0x092F, 0x7AE4, 0x7AE4, 0x4188, 0x7AE5, 0x7AE5, 0x0E60,
+ 0x7AE6, 0x7AE6, 0x1B99, 0x7AE7, 0x7AE9, 0x4189, 0x7AEA, 0x7AEA, 0x2141,
+ 0x7AEB, 0x7AEC, 0x418C, 0x7AED, 0x7AED, 0x08B0, 0x7AEE, 0x7AEE, 0x418E,
+ 0x7AEF, 0x7AEF, 0x060A, 0x7AF0, 0x7AF5, 0x418F, 0x7AF6, 0x7AF6, 0x1FC7,
+ 0x7AF7, 0x7AF8, 0x4195, 0x7AF9, 0x7AF9, 0x11F0, 0x7AFA, 0x7AFA, 0x1C63,
+ 0x7AFB, 0x7AFC, 0x4197, 0x7AFD, 0x7AFD, 0x1C64, 0x7AFE, 0x7AFE, 0x4199,
+ 0x7AFF, 0x7AFF, 0x06C8, 0x7B00, 0x7B02, 0x419A, 0x7B03, 0x7B04, 0x1C66,
+ 0x7B05, 0x7B05, 0x419D, 0x7B06, 0x7B06, 0x03D5, 0x7B07, 0x7B07, 0x419E,
+ 0x7B08, 0x7B08, 0x1C65, 0x7B09, 0x7B09, 0x419F, 0x7B0A, 0x7B0A, 0x1C69,
+ 0x7B0B, 0x7B0B, 0x0DE6, 0x7B0C, 0x7B0E, 0x41A0, 0x7B0F, 0x7B0F, 0x1C6B,
+ 0x7B10, 0x7B10, 0x41A3, 0x7B11, 0x7B11, 0x0F71, 0x7B12, 0x7B13, 0x41A4,
+ 0x7B14, 0x7B14, 0x0433, 0x7B15, 0x7B15, 0x1C68, 0x7B16, 0x7B18, 0x41A6,
+ 0x7B19, 0x7B19, 0x1C6F, 0x7B1A, 0x7B1A, 0x41A9, 0x7B1B, 0x7B1B, 0x05B2,
+ 0x7B1C, 0x7B1D, 0x41AA, 0x7B1E, 0x7B1E, 0x1C77, 0x7B1F, 0x7B1F, 0x41AC,
+ 0x7B20, 0x7B20, 0x1C72, 0x7B21, 0x7B23, 0x41AD, 0x7B24, 0x7B24, 0x1C74,
+ 0x7B25, 0x7B25, 0x1C73, 0x7B26, 0x7B26, 0x0698, 0x7B27, 0x7B27, 0x41B0,
+ 0x7B28, 0x7B28, 0x0428, 0x7B29, 0x7B29, 0x41B1, 0x7B2A, 0x7B2A, 0x1C6E,
+ 0x7B2B, 0x7B2B, 0x1C6A, 0x7B2C, 0x7B2C, 0x05BB, 0x7B2D, 0x7B2D, 0x41B2,
+ 0x7B2E, 0x7B2E, 0x1C70, 0x7B2F, 0x7B30, 0x41B3, 0x7B31, 0x7B31, 0x1C71,
+ 0x7B32, 0x7B32, 0x41B5, 0x7B33, 0x7B33, 0x1C75, 0x7B34, 0x7B37, 0x41B6,
+ 0x7B38, 0x7B38, 0x1C6D, 0x7B39, 0x7B39, 0x41BA, 0x7B3A, 0x7B3A, 0x0856,
+ 0x7B3B, 0x7B3B, 0x41BB, 0x7B3C, 0x7B3C, 0x0A46, 0x7B3D, 0x7B3D, 0x41BC,
+ 0x7B3E, 0x7B3E, 0x1C76, 0x7B3F, 0x7B44, 0x41BD, 0x7B45, 0x7B45, 0x1C7A,
+ 0x7B46, 0x7B46, 0x1E41, 0x7B47, 0x7B47, 0x1C6C, 0x7B48, 0x7B48, 0x41C3,
+ 0x7B49, 0x7B49, 0x05A9, 0x7B4A, 0x7B4A, 0x41C4, 0x7B4B, 0x7B4B, 0x08BF,
+ 0x7B4C, 0x7B4C, 0x1C7C, 0x7B4D, 0x7B4E, 0x41C5, 0x7B4F, 0x7B4F, 0x0641,
+ 0x7B50, 0x7B50, 0x097D, 0x7B51, 0x7B51, 0x11FD, 0x7B52, 0x7B52, 0x0E63,
+ 0x7B53, 0x7B53, 0x41C7, 0x7B54, 0x7B54, 0x0573, 0x7B55, 0x7B55, 0x41C8,
+ 0x7B56, 0x7B56, 0x04A6, 0x7B57, 0x7B57, 0x41C9, 0x7B58, 0x7B58, 0x1C78,
+ 0x7B59, 0x7B59, 0x41CA, 0x7B5A, 0x7B5A, 0x1C79, 0x7B5B, 0x7B5B, 0x0CF1,
+ 0x7B5C, 0x7B5C, 0x41CB, 0x7B5D, 0x7B5D, 0x1C7D, 0x7B5E, 0x7B5F, 0x41CC,
+ 0x7B60, 0x7B60, 0x1C7E, 0x7B61, 0x7B61, 0x41CE, 0x7B62, 0x7B62, 0x1C81,
+ 0x7B63, 0x7B66, 0x41CF, 0x7B67, 0x7B67, 0x25E4, 0x7B68, 0x7B6D, 0x41D3,
+ 0x7B6E, 0x7B6E, 0x1C7F, 0x7B6F, 0x7B70, 0x41D9, 0x7B71, 0x7B71, 0x1C83,
+ 0x7B72, 0x7B72, 0x1C82, 0x7B73, 0x7B74, 0x41DB, 0x7B75, 0x7B75, 0x1C7B,
+ 0x7B76, 0x7B76, 0x41DD, 0x7B77, 0x7B77, 0x0977, 0x7B78, 0x7B78, 0x41DE,
+ 0x7B79, 0x7B79, 0x0514, 0x7B7A, 0x7B7A, 0x41DF, 0x7B7B, 0x7B7B, 0x1C80,
+ 0x7B7C, 0x7B7D, 0x41E0, 0x7B7E, 0x7B7E, 0x0C26, 0x7B7F, 0x7B7F, 0x41E2,
+ 0x7B80, 0x7B80, 0x0865, 0x7B81, 0x7B84, 0x41E3, 0x7B85, 0x7B85, 0x1C8B,
+ 0x7B86, 0x7B8A, 0x41E7, 0x7B8B, 0x7B8B, 0x1F86, 0x7B8C, 0x7B8C, 0x41EC,
+ 0x7B8D, 0x7B8D, 0x0718, 0x7B8E, 0x7B8F, 0x41ED, 0x7B90, 0x7B90, 0x1C84,
+ 0x7B91, 0x7B93, 0x41EF, 0x7B94, 0x7B94, 0x0474, 0x7B95, 0x7B95, 0x0813,
+ 0x7B96, 0x7B96, 0x41F2, 0x7B97, 0x7B97, 0x0DD8, 0x7B98, 0x7B9B, 0x41F3,
+ 0x7B9C, 0x7B9C, 0x1C8D, 0x7B9D, 0x7B9D, 0x1C89, 0x7B9E, 0x7BA0, 0x41F7,
+ 0x7BA1, 0x7BA1, 0x0735, 0x7BA2, 0x7BA2, 0x1C8E, 0x7BA3, 0x7BA5, 0x41FA,
+ 0x7BA6, 0x7BA7, 0x1C85, 0x7BA8, 0x7BA8, 0x1C8A, 0x7BA9, 0x7BA9, 0x0A88,
+ 0x7BAA, 0x7BAA, 0x1C8C, 0x7BAB, 0x7BAB, 0x1C8F, 0x7BAC, 0x7BAC, 0x1C88,
+ 0x7BAD, 0x7BAD, 0x0870, 0x7BAE, 0x7BB0, 0x41FD, 0x7BB1, 0x7BB1, 0x0F51,
+ 0x7BB2, 0x7BB3, 0x4200, 0x7BB4, 0x7BB4, 0x1C90, 0x7BB5, 0x7BB7, 0x4202,
+ 0x7BB8, 0x7BB8, 0x1C87, 0x7BB9, 0x7BBF, 0x4205, 0x7BC0, 0x7BC0, 0x1FB3,
+ 0x7BC1, 0x7BC1, 0x1C92, 0x7BC2, 0x7BC3, 0x420C, 0x7BC4, 0x7BC4, 0x1EEF,
+ 0x7BC5, 0x7BC5, 0x420E, 0x7BC6, 0x7BC6, 0x120A, 0x7BC7, 0x7BC7, 0x0BC9,
+ 0x7BC8, 0x7BC8, 0x420F, 0x7BC9, 0x7BC9, 0x22A4, 0x7BCA, 0x7BCA, 0x4210,
+ 0x7BCB, 0x7BCB, 0x25E8, 0x7BCC, 0x7BCC, 0x1C93, 0x7BCD, 0x7BD0, 0x4211,
+ 0x7BD1, 0x7BD1, 0x1C91, 0x7BD2, 0x7BD2, 0x4215, 0x7BD3, 0x7BD3, 0x0A4F,
+ 0x7BD4, 0x7BD8, 0x4216, 0x7BD9, 0x7BD9, 0x06D8, 0x7BDA, 0x7BDA, 0x1C95,
+ 0x7BDB, 0x7BDC, 0x421B, 0x7BDD, 0x7BDD, 0x1C94, 0x7BDE, 0x7BE0, 0x421D,
+ 0x7BE1, 0x7BE1, 0x055E, 0x7BE2, 0x7BE3, 0x4220, 0x7BE4, 0x7BE4, 0x25E3,
+ 0x7BE5, 0x7BE6, 0x1C96, 0x7BE7, 0x7BE8, 0x4222, 0x7BE9, 0x7BE9, 0x2111,
+ 0x7BEA, 0x7BEA, 0x1C98, 0x7BEB, 0x7BED, 0x4224, 0x7BEE, 0x7BEE, 0x09A5,
+ 0x7BEF, 0x7BF0, 0x4227, 0x7BF1, 0x7BF1, 0x09D4, 0x7BF2, 0x7BF2, 0x4229,
+ 0x7BF3, 0x7BF3, 0x25E6, 0x7BF4, 0x7BF6, 0x422A, 0x7BF7, 0x7BF7, 0x0BB2,
+ 0x7BF8, 0x7BFB, 0x422D, 0x7BFC, 0x7BFC, 0x1C9B, 0x7BFD, 0x7BFD, 0x4231,
+ 0x7BFE, 0x7BFE, 0x1C9A, 0x7BFF, 0x7BFF, 0x4232, 0x7C00, 0x7C00, 0x25E7,
+ 0x7C01, 0x7C06, 0x4233, 0x7C07, 0x7C07, 0x055B, 0x7C08, 0x7C0A, 0x4239,
+ 0x7C0B, 0x7C0B, 0x1C9E, 0x7C0C, 0x7C0C, 0x1C99, 0x7C0D, 0x7C0D, 0x2041,
+ 0x7C0E, 0x7C0E, 0x423C, 0x7C0F, 0x7C0F, 0x1C9C, 0x7C10, 0x7C15, 0x423D,
+ 0x7C16, 0x7C16, 0x1C9D, 0x7C17, 0x7C1D, 0x4243, 0x7C1E, 0x7C1E, 0x25EA,
+ 0x7C1F, 0x7C1F, 0x1C9F, 0x7C20, 0x7C20, 0x424A, 0x7C21, 0x7C21, 0x1F8F,
+ 0x7C22, 0x7C22, 0x424B, 0x7C23, 0x7C23, 0x25EC, 0x7C24, 0x7C25, 0x424C,
+ 0x7C26, 0x7C26, 0x1CA1, 0x7C27, 0x7C27, 0x07DE, 0x7C28, 0x7C29, 0x424E,
+ 0x7C2A, 0x7C2A, 0x1CA0, 0x7C2B, 0x7C2B, 0x25EB, 0x7C2C, 0x7C37, 0x4250,
+ 0x7C38, 0x7C38, 0x1CA2, 0x7C39, 0x7C3C, 0x425C, 0x7C3D, 0x7C3D, 0x20D0,
+ 0x7C3E, 0x7C3E, 0x201D, 0x7C3F, 0x7C3F, 0x0485, 0x7C40, 0x7C40, 0x1CA4,
+ 0x7C41, 0x7C41, 0x1CA3, 0x7C42, 0x7C42, 0x4260, 0x7C43, 0x7C43, 0x1FF7,
+ 0x7C44, 0x7C4B, 0x4261, 0x7C4C, 0x7C4C, 0x1E8D, 0x7C4D, 0x7C4D, 0x0821,
+ 0x7C4E, 0x7C5B, 0x4269, 0x7C5C, 0x7C5C, 0x25E9, 0x7C5D, 0x7C5E, 0x4277,
+ 0x7C5F, 0x7C5F, 0x25EE, 0x7C60, 0x7C60, 0x203A, 0x7C61, 0x7C63, 0x4279,
+ 0x7C64, 0x7C64, 0x2693, 0x7C65, 0x7C68, 0x427C, 0x7C69, 0x7C69, 0x25E5,
+ 0x7C6A, 0x7C6A, 0x25ED, 0x7C6B, 0x7C6B, 0x4280, 0x7C6C, 0x7C6C, 0x2009,
+ 0x7C6D, 0x7C6D, 0x4281, 0x7C6E, 0x7C6E, 0x2065, 0x7C6F, 0x7C71, 0x4282,
+ 0x7C72, 0x7C72, 0x26A3, 0x7C73, 0x7C73, 0x0ADC, 0x7C74, 0x7C74, 0x12F5,
+ 0x7C75, 0x7C7A, 0x4285, 0x7C7B, 0x7C7B, 0x09CB, 0x7C7C, 0x7C7C, 0x1CCA,
+ 0x7C7D, 0x7C7D, 0x122E, 0x7C7E, 0x7C88, 0x428B, 0x7C89, 0x7C89, 0x0678,
+ 0x7C8A, 0x7C90, 0x4296, 0x7C91, 0x7C91, 0x1CCC, 0x7C92, 0x7C92, 0x09EC,
+ 0x7C93, 0x7C94, 0x429D, 0x7C95, 0x7C95, 0x0BE8, 0x7C96, 0x7C96, 0x429F,
+ 0x7C97, 0x7C97, 0x0559, 0x7C98, 0x7C98, 0x1154, 0x7C99, 0x7C9B, 0x42A0,
+ 0x7C9C, 0x7C9C, 0x1CCE, 0x7C9D, 0x7C9D, 0x1CCD, 0x7C9E, 0x7C9E, 0x1CCF,
+ 0x7C9F, 0x7C9F, 0x0DCF, 0x7CA0, 0x7CA1, 0x42A3, 0x7CA2, 0x7CA2, 0x1CD0,
+ 0x7CA3, 0x7CA3, 0x42A5, 0x7CA4, 0x7CA4, 0x1104, 0x7CA5, 0x7CA5, 0x11DF,
+ 0x7CA6, 0x7CA9, 0x42A6, 0x7CAA, 0x7CAA, 0x067D, 0x7CAB, 0x7CAD, 0x42AA,
+ 0x7CAE, 0x7CAE, 0x0A01, 0x7CAF, 0x7CB0, 0x42AD, 0x7CB1, 0x7CB1, 0x0A04,
+ 0x7CB2, 0x7CB2, 0x1CD1, 0x7CB3, 0x7CB3, 0x08DB, 0x7CB4, 0x7CB8, 0x42AF,
+ 0x7CB9, 0x7CB9, 0x0565, 0x7CBA, 0x7CBB, 0x42B4, 0x7CBC, 0x7CBD, 0x1CD2,
+ 0x7CBE, 0x7CBE, 0x08DA, 0x7CBF, 0x7CC0, 0x42B6, 0x7CC1, 0x7CC1, 0x1CD4,
+ 0x7CC2, 0x7CC4, 0x42B8, 0x7CC5, 0x7CC5, 0x1CD9, 0x7CC6, 0x7CC6, 0x42BB,
+ 0x7CC7, 0x7CC7, 0x1CD5, 0x7CC8, 0x7CC8, 0x1CD8, 0x7CC9, 0x7CC9, 0x42BC,
+ 0x7CCA, 0x7CCA, 0x07B4, 0x7CCB, 0x7CCB, 0x42BD, 0x7CCC, 0x7CCD, 0x1CD6,
+ 0x7CCE, 0x7CD4, 0x42BE, 0x7CD5, 0x7CD5, 0x06DD, 0x7CD6, 0x7CD6, 0x0E1A,
+ 0x7CD7, 0x7CD7, 0x1CDA, 0x7CD8, 0x7CD8, 0x42C5, 0x7CD9, 0x7CD9, 0x04A1,
+ 0x7CDA, 0x7CDB, 0x42C6, 0x7CDC, 0x7CDC, 0x0AD8, 0x7CDD, 0x7CDD, 0x25F5,
+ 0x7CDE, 0x7CDE, 0x1EFC, 0x7CDF, 0x7CDF, 0x1126, 0x7CE0, 0x7CE0, 0x0944,
+ 0x7CE1, 0x7CE6, 0x42C8, 0x7CE7, 0x7CE7, 0x2024, 0x7CE8, 0x7CE8, 0x1CDB,
+ 0x7CE9, 0x7CEE, 0x42CE, 0x7CEF, 0x7CEF, 0x0B75, 0x7CF0, 0x7CF0, 0x269B,
+ 0x7CF1, 0x7CF1, 0x42D4, 0x7CF2, 0x7CF2, 0x25F3, 0x7CF3, 0x7CF3, 0x42D5,
+ 0x7CF4, 0x7CF4, 0x22D9, 0x7CF5, 0x7CF5, 0x42D6, 0x7CF6, 0x7CF6, 0x25F4,
+ 0x7CF7, 0x7CF7, 0x42D7, 0x7CF8, 0x7CF8, 0x1CE7, 0x7CF9, 0x7CF9, 0x241B,
+ 0x7CFA, 0x7CFA, 0x42D8, 0x7CFB, 0x7CFB, 0x0F22, 0x7CFC, 0x7CFD, 0x42D9,
+ 0x7CFE, 0x7CFE, 0x1FC8, 0x7CFF, 0x7CFF, 0x42DB, 0x7D00, 0x7D00, 0x1F7B,
+ 0x7D01, 0x7D01, 0x42DC, 0x7D02, 0x7D02, 0x241D, 0x7D03, 0x7D03, 0x42DD,
+ 0x7D04, 0x7D04, 0x224C, 0x7D05, 0x7D05, 0x1F48, 0x7D06, 0x7D06, 0x241C,
+ 0x7D07, 0x7D08, 0x241E, 0x7D09, 0x7D09, 0x20FF, 0x7D0A, 0x7D0A, 0x0ED8,
+ 0x7D0B, 0x7D0B, 0x219A, 0x7D0C, 0x7D0C, 0x42DE, 0x7D0D, 0x7D0D, 0x2091,
+ 0x7D0E, 0x7D0F, 0x42DF, 0x7D10, 0x7D10, 0x20A7, 0x7D11, 0x7D12, 0x42E1,
+ 0x7D13, 0x7D13, 0x2423, 0x7D14, 0x7D14, 0x1E9B, 0x7D15, 0x7D15, 0x2422,
+ 0x7D16, 0x7D16, 0x42E3, 0x7D17, 0x7D17, 0x2110, 0x7D18, 0x7D18, 0x42E4,
+ 0x7D19, 0x7D19, 0x228D, 0x7D1A, 0x7D1A, 0x1F71, 0x7D1B, 0x7D1B, 0x1EF8,
+ 0x7D1C, 0x7D1C, 0x2421, 0x7D1D, 0x7D1F, 0x42E5, 0x7D20, 0x7D20, 0x0DCD,
+ 0x7D21, 0x7D21, 0x1EF3, 0x7D22, 0x7D22, 0x0DEC, 0x7D23, 0x7D26, 0x42E8,
+ 0x7D27, 0x7D27, 0x08C5, 0x7D28, 0x7D2A, 0x42EC, 0x7D2B, 0x7D2B, 0x122C,
+ 0x7D2C, 0x7D2E, 0x42EF, 0x7D2F, 0x7D2F, 0x09C6, 0x7D30, 0x7D30, 0x21B1,
+ 0x7D31, 0x7D31, 0x2426, 0x7D32, 0x7D32, 0x2425, 0x7D33, 0x7D33, 0x2120,
+ 0x7D34, 0x7D38, 0x42F2, 0x7D39, 0x7D39, 0x211A, 0x7D3A, 0x7D3A, 0x2424,
+ 0x7D3B, 0x7D3B, 0x42F7, 0x7D3C, 0x7D3C, 0x2428, 0x7D3D, 0x7D3E, 0x42F8,
+ 0x7D3F, 0x7D3F, 0x242A, 0x7D40, 0x7D40, 0x2429, 0x7D41, 0x7D41, 0x42FA,
+ 0x7D42, 0x7D42, 0x2294, 0x7D43, 0x7D43, 0x42FB, 0x7D44, 0x7D44, 0x22BE,
+ 0x7D45, 0x7D45, 0x42FC, 0x7D46, 0x7D46, 0x1E31, 0x7D47, 0x7D4D, 0x42FD,
+ 0x7D4E, 0x7D4E, 0x242C, 0x7D4F, 0x7D4F, 0x4304, 0x7D50, 0x7D50, 0x1FB5,
+ 0x7D51, 0x7D5C, 0x4305, 0x7D5D, 0x7D5D, 0x242B, 0x7D5E, 0x7D5E, 0x1FAF,
+ 0x7D5F, 0x7D60, 0x4311, 0x7D61, 0x7D61, 0x2068, 0x7D62, 0x7D62, 0x21E4,
+ 0x7D63, 0x7D65, 0x4313, 0x7D66, 0x7D66, 0x1F21, 0x7D67, 0x7D67, 0x4316,
+ 0x7D68, 0x7D68, 0x2101, 0x7D69, 0x7D6D, 0x4317, 0x7D6E, 0x7D6E, 0x0FC0,
+ 0x7D6F, 0x7D70, 0x431C, 0x7D71, 0x7D71, 0x217C, 0x7D72, 0x7D72, 0x214A,
+ 0x7D73, 0x7D73, 0x242D, 0x7D74, 0x7D75, 0x431E, 0x7D76, 0x7D76, 0x1FD4,
+ 0x7D77, 0x7D77, 0x1CE8, 0x7D78, 0x7D78, 0x4320, 0x7D79, 0x7D79, 0x1FD1,
+ 0x7D7A, 0x7D80, 0x4321, 0x7D81, 0x7D81, 0x1E33, 0x7D82, 0x7D82, 0x4328,
+ 0x7D83, 0x7D83, 0x242F, 0x7D84, 0x7D85, 0x4329, 0x7D86, 0x7D86, 0x242E,
+ 0x7D87, 0x7D87, 0x432B, 0x7D88, 0x7D88, 0x2430, 0x7D89, 0x7D89, 0x21DB,
+ 0x7D8A, 0x7D8E, 0x432C, 0x7D8F, 0x7D8F, 0x2158, 0x7D90, 0x7D92, 0x4331,
+ 0x7D93, 0x7D93, 0x1FC2, 0x7D94, 0x7D9B, 0x4334, 0x7D9C, 0x7D9C, 0x22B9,
+ 0x7D9D, 0x7D9D, 0x433C, 0x7D9E, 0x7D9E, 0x2436, 0x7D9F, 0x7DA1, 0x433D,
+ 0x7DA2, 0x7DA2, 0x1E8E, 0x7DA3, 0x7DA3, 0x2439, 0x7DA4, 0x7DA5, 0x4340,
+ 0x7DA6, 0x7DA6, 0x1CE9, 0x7DA7, 0x7DAA, 0x4342, 0x7DAB, 0x7DAB, 0x21C5,
+ 0x7DAC, 0x7DAC, 0x2437, 0x7DAD, 0x7DAD, 0x2192, 0x7DAE, 0x7DAE, 0x1CEA,
+ 0x7DAF, 0x7DAF, 0x4346, 0x7DB0, 0x7DB0, 0x243A, 0x7DB1, 0x7DB1, 0x1F19,
+ 0x7DB2, 0x7DB2, 0x218C, 0x7DB3, 0x7DB3, 0x1E40, 0x7DB4, 0x7DB4, 0x22B3,
+ 0x7DB5, 0x7DB7, 0x4347, 0x7DB8, 0x7DB8, 0x205F, 0x7DB9, 0x7DB9, 0x2438,
+ 0x7DBA, 0x7DBA, 0x2432, 0x7DBB, 0x7DBB, 0x2274, 0x7DBC, 0x7DBC, 0x434A,
+ 0x7DBD, 0x7DBD, 0x1E9C, 0x7DBE, 0x7DBE, 0x2431, 0x7DBF, 0x7DBF, 0x2085,
+ 0x7DC0, 0x7DC3, 0x434B, 0x7DC4, 0x7DC4, 0x2435, 0x7DC5, 0x7DC6, 0x434F,
+ 0x7DC7, 0x7DC7, 0x243B, 0x7DC8, 0x7DC9, 0x4351, 0x7DCA, 0x7DCA, 0x1FB7,
+ 0x7DCB, 0x7DCB, 0x2433, 0x7DCC, 0x7DD0, 0x4353, 0x7DD1, 0x7DD1, 0x2054,
+ 0x7DD2, 0x7DD2, 0x21DE, 0x7DD3, 0x7DD3, 0x4358, 0x7DD4, 0x7DD4, 0x2434,
+ 0x7DD5, 0x7DD6, 0x4359, 0x7DD7, 0x7DD7, 0x243D, 0x7DD8, 0x7DD8, 0x1F89,
+ 0x7DD9, 0x7DD9, 0x243C, 0x7DDA, 0x7DDC, 0x435B, 0x7DDD, 0x7DDD, 0x1F6E,
+ 0x7DDE, 0x7DDE, 0x1ED8, 0x7DDF, 0x7DDF, 0x435E, 0x7DE0, 0x7DE0, 0x1EBF,
+ 0x7DE1, 0x7DE1, 0x2445, 0x7DE2, 0x7DE2, 0x435F, 0x7DE3, 0x7DE3, 0x2249,
+ 0x7DE4, 0x7DE5, 0x4360, 0x7DE6, 0x7DE6, 0x2441, 0x7DE7, 0x7DE7, 0x4362,
+ 0x7DE8, 0x7DE8, 0x1E47, 0x7DE9, 0x7DE9, 0x1F56, 0x7DEA, 0x7DEB, 0x4363,
+ 0x7DEC, 0x7DEC, 0x2086, 0x7DED, 0x7DEE, 0x4365, 0x7DEF, 0x7DEF, 0x2196,
+ 0x7DF0, 0x7DF0, 0x4367, 0x7DF1, 0x7DF1, 0x2443, 0x7DF2, 0x7DF2, 0x243F,
+ 0x7DF3, 0x7DF3, 0x4368, 0x7DF4, 0x7DF4, 0x2023, 0x7DF5, 0x7DF5, 0x4369,
+ 0x7DF6, 0x7DF6, 0x2442, 0x7DF7, 0x7DF8, 0x436A, 0x7DF9, 0x7DF9, 0x243E,
+ 0x7DFA, 0x7DFA, 0x436C, 0x7DFB, 0x7DFB, 0x26A6, 0x7DFC, 0x7DFF, 0x436D,
+ 0x7E00, 0x7E07, 0x4371, 0x7E08, 0x7E08, 0x234E, 0x7E09, 0x7E09, 0x2446,
+ 0x7E0A, 0x7E0A, 0x244B, 0x7E0B, 0x7E0B, 0x2444, 0x7E0C, 0x7E0F, 0x4379,
+ 0x7E10, 0x7E10, 0x2427, 0x7E11, 0x7E11, 0x244C, 0x7E12, 0x7E1A, 0x437D,
+ 0x7E1B, 0x7E1B, 0x1F0F, 0x7E1C, 0x7E1C, 0x4386, 0x7E1D, 0x7E1D, 0x2447,
+ 0x7E1E, 0x7E1E, 0x2449, 0x7E1F, 0x7E1F, 0x2448, 0x7E20, 0x7E22, 0x4387,
+ 0x7E23, 0x7E23, 0x21C2, 0x7E24, 0x7E26, 0x438A, 0x7E27, 0x7E27, 0x216E,
+ 0x7E28, 0x7E2A, 0x438D, 0x7E2B, 0x7E2B, 0x1F03, 0x7E2C, 0x7E2C, 0x4390,
+ 0x7E2D, 0x7E2D, 0x244A, 0x7E2E, 0x7E2E, 0x215C, 0x7E2F, 0x7E30, 0x4391,
+ 0x7E31, 0x7E31, 0x22BB, 0x7E32, 0x7E32, 0x2450, 0x7E33, 0x7E33, 0x4393,
+ 0x7E34, 0x7E34, 0x2694, 0x7E35, 0x7E35, 0x244F, 0x7E36, 0x7E36, 0x25F6,
+ 0x7E37, 0x7E37, 0x2051, 0x7E38, 0x7E38, 0x4394, 0x7E39, 0x7E39, 0x244E,
+ 0x7E3A, 0x7E3A, 0x4395, 0x7E3B, 0x7E3B, 0x1DFB, 0x7E3C, 0x7E3C, 0x4396,
+ 0x7E3D, 0x7E3D, 0x22BA, 0x7E3E, 0x7E3E, 0x1F6D, 0x7E3F, 0x7E40, 0x4397,
+ 0x7E41, 0x7E41, 0x064E, 0x7E42, 0x7E44, 0x4399, 0x7E45, 0x7E45, 0x2452,
+ 0x7E46, 0x7E46, 0x2451, 0x7E47, 0x7E47, 0x1CEB, 0x7E48, 0x7E51, 0x439C,
+ 0x7E52, 0x7E52, 0x2455, 0x7E53, 0x7E53, 0x43A6, 0x7E54, 0x7E54, 0x2289,
+ 0x7E55, 0x7E55, 0x2116, 0x7E56, 0x7E59, 0x43A7, 0x7E5A, 0x7E5A, 0x2454,
+ 0x7E5B, 0x7E5D, 0x43AB, 0x7E5E, 0x7E5E, 0x20FB, 0x7E5F, 0x7E61, 0x43AE,
+ 0x7E62, 0x7E62, 0x2440, 0x7E63, 0x7E68, 0x43B1, 0x7E69, 0x7E69, 0x2126,
+ 0x7E6A, 0x7E6A, 0x1F61, 0x7E6B, 0x7E6B, 0x269D, 0x7E6C, 0x7E6C, 0x43B7,
+ 0x7E6D, 0x7E6D, 0x1F8A, 0x7E6E, 0x7E6E, 0x2456, 0x7E6F, 0x7E6F, 0x2459,
+ 0x7E70, 0x7E70, 0x2458, 0x7E71, 0x7E72, 0x43B8, 0x7E73, 0x7E73, 0x1FAE,
+ 0x7E74, 0x7E78, 0x43BA, 0x7E79, 0x7E79, 0x221A, 0x7E7A, 0x7E7B, 0x43BF,
+ 0x7E7C, 0x7E7C, 0x1F7A, 0x7E7D, 0x7E7D, 0x244D, 0x7E7E, 0x7E7E, 0x2457,
+ 0x7E7F, 0x7E81, 0x43C1, 0x7E82, 0x7E82, 0x1248, 0x7E83, 0x7E87, 0x43C4,
+ 0x7E88, 0x7E88, 0x2453, 0x7E89, 0x7E89, 0x43C9, 0x7E8A, 0x7E8A, 0x2420,
+ 0x7E8B, 0x7E8B, 0x43CA, 0x7E8C, 0x7E8C, 0x21DF, 0x7E8D, 0x7E8D, 0x2685,
+ 0x7E8E, 0x7E8E, 0x43CB, 0x7E8F, 0x7E8F, 0x1E6E, 0x7E90, 0x7E92, 0x43CC,
+ 0x7E93, 0x7E93, 0x2224, 0x7E94, 0x7E94, 0x2670, 0x7E95, 0x7E95, 0x43CF,
+ 0x7E96, 0x7E96, 0x21BA, 0x7E97, 0x7E97, 0x43D0, 0x7E98, 0x7E98, 0x245A,
+ 0x7E99, 0x7E9A, 0x43D1, 0x7E9B, 0x7E9B, 0x1CEC, 0x7E9C, 0x7E9C, 0x1FFF,
+ 0x7E9D, 0x7E9E, 0x43D3, 0x7E9F, 0x7E9F, 0x17D3, 0x7EA0, 0x7EA0, 0x08EF,
+ 0x7EA1, 0x7EA1, 0x17D4, 0x7EA2, 0x7EA2, 0x07A3, 0x7EA3, 0x7EA3, 0x17D5,
+ 0x7EA4, 0x7EA4, 0x0F38, 0x7EA5, 0x7EA5, 0x17D6, 0x7EA6, 0x7EA6, 0x10FF,
+ 0x7EA7, 0x7EA7, 0x0829, 0x7EA8, 0x7EA9, 0x17D7, 0x7EAA, 0x7EAA, 0x0840,
+ 0x7EAB, 0x7EAB, 0x0CAD, 0x7EAC, 0x7EAC, 0x0EC2, 0x7EAD, 0x7EAD, 0x17D9,
+ 0x7EAE, 0x7EAE, 0x43D5, 0x7EAF, 0x7EAF, 0x0542, 0x7EB0, 0x7EB0, 0x17DA,
+ 0x7EB1, 0x7EB1, 0x0CED, 0x7EB2, 0x7EB2, 0x06D4, 0x7EB3, 0x7EB3, 0x0B2C,
+ 0x7EB4, 0x7EB4, 0x43D6, 0x7EB5, 0x7EB5, 0x123A, 0x7EB6, 0x7EB6, 0x0A81,
+ 0x7EB7, 0x7EB7, 0x0674, 0x7EB8, 0x7EB8, 0x11BC, 0x7EB9, 0x7EB9, 0x0ED5,
+ 0x7EBA, 0x7EBA, 0x0661, 0x7EBB, 0x7EBC, 0x43D7, 0x7EBD, 0x7EBD, 0x0B67,
+ 0x7EBE, 0x7EBE, 0x17DB, 0x7EBF, 0x7EBF, 0x0F4C, 0x7EC0, 0x7EC2, 0x17DC,
+ 0x7EC3, 0x7EC3, 0x0A00, 0x7EC4, 0x7EC4, 0x1246, 0x7EC5, 0x7EC5, 0x0D29,
+ 0x7EC6, 0x7EC6, 0x0F25, 0x7EC7, 0x7EC7, 0x11AE, 0x7EC8, 0x7EC8, 0x11D4,
+ 0x7EC9, 0x7EC9, 0x17DF, 0x7ECA, 0x7ECA, 0x03F8, 0x7ECB, 0x7ECC, 0x17E0,
+ 0x7ECD, 0x7ECD, 0x0D15, 0x7ECE, 0x7ECE, 0x1076, 0x7ECF, 0x7ECF, 0x08DC,
+ 0x7ED0, 0x7ED0, 0x17E2, 0x7ED1, 0x7ED1, 0x03FE, 0x7ED2, 0x7ED2, 0x0CB9,
+ 0x7ED3, 0x7ED3, 0x08B2, 0x7ED4, 0x7ED4, 0x17E3, 0x7ED5, 0x7ED5, 0x0CA1,
+ 0x7ED6, 0x7ED6, 0x43D9, 0x7ED7, 0x7ED7, 0x17E4, 0x7ED8, 0x7ED8, 0x07FB,
+ 0x7ED9, 0x7ED9, 0x06F3, 0x7EDA, 0x7EDA, 0x0FCD, 0x7EDB, 0x7EDB, 0x17E5,
+ 0x7EDC, 0x7EDC, 0x0A8E, 0x7EDD, 0x7EDD, 0x0927, 0x7EDE, 0x7EDE, 0x089B,
+ 0x7EDF, 0x7EDF, 0x0E64, 0x7EE0, 0x7EE1, 0x17E6, 0x7EE2, 0x7EE2, 0x091D,
+ 0x7EE3, 0x7EE3, 0x0FB0, 0x7EE4, 0x7EE4, 0x43DA, 0x7EE5, 0x7EE5, 0x0DDC,
+ 0x7EE6, 0x7EE6, 0x0E23, 0x7EE7, 0x7EE7, 0x083F, 0x7EE8, 0x7EE8, 0x17E8,
+ 0x7EE9, 0x7EE9, 0x081B, 0x7EEA, 0x7EEA, 0x0FC2, 0x7EEB, 0x7EEB, 0x17E9,
+ 0x7EEC, 0x7EEC, 0x43DB, 0x7EED, 0x7EED, 0x0FC3, 0x7EEE, 0x7EEF, 0x17EA,
+ 0x7EF0, 0x7EF0, 0x0545, 0x7EF1, 0x7EF2, 0x17EC, 0x7EF3, 0x7EF3, 0x0D37,
+ 0x7EF4, 0x7EF4, 0x0EBB, 0x7EF5, 0x7EF5, 0x0AE5, 0x7EF6, 0x7EF6, 0x17EF,
+ 0x7EF7, 0x7EF7, 0x042A, 0x7EF8, 0x7EF8, 0x0516, 0x7EF9, 0x7EF9, 0x43DC,
+ 0x7EFA, 0x7EFB, 0x17F0, 0x7EFC, 0x7EFC, 0x1238, 0x7EFD, 0x7EFD, 0x1161,
+ 0x7EFE, 0x7EFE, 0x17F2, 0x7EFF, 0x7EFF, 0x0A73, 0x7F00, 0x7F00, 0x1217,
+ 0x7F01, 0x7F03, 0x17F3, 0x7F04, 0x7F04, 0x085D, 0x7F05, 0x7F05, 0x0AEA,
+ 0x7F06, 0x7F06, 0x09AD, 0x7F07, 0x7F08, 0x17F6, 0x7F09, 0x7F09, 0x081C,
+ 0x7F0A, 0x7F0A, 0x43DD, 0x7F0B, 0x7F0C, 0x17F8, 0x7F0D, 0x7F0D, 0x17EE,
+ 0x7F0E, 0x7F0E, 0x060F, 0x7F0F, 0x7F0F, 0x17FA, 0x7F10, 0x7F10, 0x43DE,
+ 0x7F11, 0x7F12, 0x17FB, 0x7F13, 0x7F13, 0x07CF, 0x7F14, 0x7F14, 0x05BF,
+ 0x7F15, 0x7F15, 0x0A6D, 0x7F16, 0x7F16, 0x0449, 0x7F17, 0x7F17, 0x17FD,
+ 0x7F18, 0x7F18, 0x10F8, 0x7F19, 0x7F19, 0x17FE, 0x7F1A, 0x7F1A, 0x06BA,
+ 0x7F1B, 0x7F1B, 0x1800, 0x7F1C, 0x7F1C, 0x17FF, 0x7F1D, 0x7F1D, 0x0689,
+ 0x7F1E, 0x7F1E, 0x43DF, 0x7F1F, 0x7F1F, 0x1801, 0x7F20, 0x7F20, 0x04BF,
+ 0x7F21, 0x7F27, 0x1802, 0x7F28, 0x7F28, 0x108C, 0x7F29, 0x7F29, 0x0DEA,
+ 0x7F2A, 0x7F2D, 0x1809, 0x7F2E, 0x7F2E, 0x0D02, 0x7F2F, 0x7F33, 0x180D,
+ 0x7F34, 0x7F34, 0x089A, 0x7F35, 0x7F35, 0x1812, 0x7F36, 0x7F36, 0x1C5E,
+ 0x7F37, 0x7F37, 0x43E0, 0x7F38, 0x7F38, 0x06D2, 0x7F39, 0x7F39, 0x43E1,
+ 0x7F3A, 0x7F3A, 0x0C8C, 0x7F3B, 0x7F41, 0x43E2, 0x7F42, 0x7F42, 0x1C5F,
+ 0x7F43, 0x7F43, 0x43E9, 0x7F44, 0x7F45, 0x1C60, 0x7F46, 0x7F4B, 0x43EA,
+ 0x7F4C, 0x7F4C, 0x25E2, 0x7F4D, 0x7F4D, 0x43F0, 0x7F4E, 0x7F4E, 0x269A,
+ 0x7F4F, 0x7F4F, 0x43F1, 0x7F50, 0x7F50, 0x0737, 0x7F51, 0x7F51, 0x0EA9,
+ 0x7F52, 0x7F53, 0x43F2, 0x7F54, 0x7F54, 0x129E, 0x7F55, 0x7F55, 0x0768,
+ 0x7F56, 0x7F56, 0x43F4, 0x7F57, 0x7F57, 0x0A85, 0x7F58, 0x7F58, 0x1A81,
+ 0x7F59, 0x7F59, 0x43F5, 0x7F5A, 0x7F5A, 0x0640, 0x7F5B, 0x7F5E, 0x43F6,
+ 0x7F5F, 0x7F5F, 0x1A83, 0x7F60, 0x7F60, 0x43FA, 0x7F61, 0x7F61, 0x1A82,
+ 0x7F62, 0x7F62, 0x03E0, 0x7F63, 0x7F67, 0x43FB, 0x7F68, 0x7F68, 0x1A85,
+ 0x7F69, 0x7F69, 0x1177, 0x7F6A, 0x7F6A, 0x124C, 0x7F6B, 0x7F6D, 0x4400,
+ 0x7F6E, 0x7F6E, 0x11C2, 0x7F6F, 0x7F6F, 0x4403, 0x7F70, 0x7F70, 0x1EEA,
+ 0x7F71, 0x7F71, 0x1A87, 0x7F72, 0x7F72, 0x0D87, 0x7F73, 0x7F73, 0x4404,
+ 0x7F74, 0x7F74, 0x1A86, 0x7F75, 0x7F76, 0x4405, 0x7F77, 0x7F77, 0x1E2C,
+ 0x7F78, 0x7F78, 0x4407, 0x7F79, 0x7F79, 0x1A88, 0x7F7A, 0x7F7D, 0x4408,
+ 0x7F7E, 0x7F7E, 0x1A8A, 0x7F7F, 0x7F80, 0x440C, 0x7F81, 0x7F81, 0x1A89,
+ 0x7F82, 0x7F84, 0x440E, 0x7F85, 0x7F85, 0x2062, 0x7F86, 0x7F86, 0x24F1,
+ 0x7F87, 0x7F87, 0x4411, 0x7F88, 0x7F88, 0x24F2, 0x7F89, 0x7F89, 0x4412,
+ 0x7F8A, 0x7F8A, 0x101B, 0x7F8B, 0x7F8B, 0x4413, 0x7F8C, 0x7F8C, 0x0C39,
+ 0x7F8D, 0x7F8D, 0x4414, 0x7F8E, 0x7F8E, 0x0AC5, 0x7F8F, 0x7F93, 0x4415,
+ 0x7F94, 0x7F94, 0x06DC, 0x7F95, 0x7F99, 0x441A, 0x7F9A, 0x7F9A, 0x0A30,
+ 0x7F9B, 0x7F9C, 0x441F, 0x7F9D, 0x7F9D, 0x1CC4, 0x7F9E, 0x7F9E, 0x0FAA,
+ 0x7F9F, 0x7F9F, 0x1CC5, 0x7FA0, 0x7FA0, 0x4421, 0x7FA1, 0x7FA1, 0x0F48,
+ 0x7FA2, 0x7FA3, 0x4422, 0x7FA4, 0x7FA4, 0x0C95, 0x7FA5, 0x7FA5, 0x25F2,
+ 0x7FA6, 0x7FA6, 0x4424, 0x7FA7, 0x7FA7, 0x1CC6, 0x7FA8, 0x7FA8, 0x4425,
+ 0x7FA9, 0x7FA9, 0x2215, 0x7FAA, 0x7FAE, 0x4426, 0x7FAF, 0x7FB0, 0x1CC7,
+ 0x7FB1, 0x7FB1, 0x442B, 0x7FB2, 0x7FB2, 0x1CC9, 0x7FB3, 0x7FB7, 0x442C,
+ 0x7FB8, 0x7FB8, 0x130E, 0x7FB9, 0x7FB9, 0x06F9, 0x7FBA, 0x7FBB, 0x4431,
+ 0x7FBC, 0x7FBC, 0x176D, 0x7FBD, 0x7FBD, 0x10D5, 0x7FBE, 0x7FBE, 0x4433,
+ 0x7FBF, 0x7FBF, 0x1CDE, 0x7FC0, 0x7FC0, 0x4434, 0x7FC1, 0x7FC1, 0x0EDB,
+ 0x7FC2, 0x7FC4, 0x4435, 0x7FC5, 0x7FC5, 0x0506, 0x7FC6, 0x7FC9, 0x4438,
+ 0x7FCA, 0x7FCA, 0x1B98, 0x7FCB, 0x7FCB, 0x443C, 0x7FCC, 0x7FCC, 0x1075,
+ 0x7FCD, 0x7FCD, 0x443D, 0x7FCE, 0x7FCE, 0x1CDF, 0x7FCF, 0x7FD1, 0x443E,
+ 0x7FD2, 0x7FD2, 0x21AE, 0x7FD3, 0x7FD3, 0x4441, 0x7FD4, 0x7FD4, 0x0F55,
+ 0x7FD5, 0x7FD5, 0x1CE0, 0x7FD6, 0x7FD7, 0x4442, 0x7FD8, 0x7FD8, 0x0C49,
+ 0x7FD9, 0x7FDE, 0x4444, 0x7FDF, 0x7FDF, 0x05B5, 0x7FE0, 0x7FE0, 0x0567,
+ 0x7FE1, 0x7FE1, 0x1CE2, 0x7FE2, 0x7FE4, 0x444A, 0x7FE5, 0x7FE5, 0x1CE1,
+ 0x7FE6, 0x7FE6, 0x1CE3, 0x7FE7, 0x7FE8, 0x444D, 0x7FE9, 0x7FE9, 0x1CE4,
+ 0x7FEA, 0x7FED, 0x444F, 0x7FEE, 0x7FEE, 0x1CE5, 0x7FEF, 0x7FEF, 0x4453,
+ 0x7FF0, 0x7FF0, 0x0769, 0x7FF1, 0x7FF1, 0x03CA, 0x7FF2, 0x7FF2, 0x4454,
+ 0x7FF3, 0x7FF3, 0x1CE6, 0x7FF4, 0x7FF8, 0x4455, 0x7FF9, 0x7FF9, 0x20E0,
+ 0x7FFA, 0x7FFA, 0x445A, 0x7FFB, 0x7FFB, 0x064A, 0x7FFC, 0x7FFC, 0x1074,
+ 0x7FFD, 0x7FFF, 0x445B, 0x8000, 0x8000, 0x1032, 0x8001, 0x8001, 0x09BA,
+ 0x8002, 0x8002, 0x445E, 0x8003, 0x8003, 0x0949, 0x8004, 0x8004, 0x1953,
+ 0x8005, 0x8005, 0x1180, 0x8006, 0x8006, 0x191A, 0x8007, 0x800A, 0x445F,
+ 0x800B, 0x800B, 0x1BD7, 0x800C, 0x800C, 0x0637, 0x800D, 0x800D, 0x0D98,
+ 0x800E, 0x800F, 0x4463, 0x8010, 0x8010, 0x0B30, 0x8011, 0x8011, 0x4465,
+ 0x8012, 0x8012, 0x1BCB, 0x8013, 0x8013, 0x4466, 0x8014, 0x8014, 0x1BCC,
+ 0x8015, 0x8015, 0x06F6, 0x8016, 0x8016, 0x1BCD, 0x8017, 0x8017, 0x077B,
+ 0x8018, 0x8018, 0x1108, 0x8019, 0x8019, 0x03DD, 0x801A, 0x801B, 0x4467,
+ 0x801C, 0x801C, 0x1BCE, 0x801D, 0x801F, 0x4469, 0x8020, 0x8020, 0x1BCF,
+ 0x8021, 0x8021, 0x446C, 0x8022, 0x8022, 0x1BD0, 0x8023, 0x8024, 0x446D,
+ 0x8025, 0x8027, 0x1BD1, 0x8028, 0x8028, 0x1BD5, 0x8029, 0x8029, 0x1BD4,
+ 0x802A, 0x802A, 0x0B96, 0x802B, 0x802B, 0x446F, 0x802C, 0x802C, 0x25C2,
+ 0x802D, 0x802D, 0x4470, 0x802E, 0x802E, 0x25C1, 0x802F, 0x8030, 0x4471,
+ 0x8031, 0x8031, 0x1BD6, 0x8032, 0x8032, 0x4473, 0x8033, 0x8033, 0x0639,
+ 0x8034, 0x8034, 0x4474, 0x8035, 0x8035, 0x1BD8, 0x8036, 0x8036, 0x1035,
+ 0x8037, 0x8037, 0x14B1, 0x8038, 0x8038, 0x0DBF, 0x8039, 0x803A, 0x4475,
+ 0x803B, 0x803B, 0x0501, 0x803C, 0x803C, 0x4477, 0x803D, 0x803D, 0x0583,
+ 0x803E, 0x803E, 0x4478, 0x803F, 0x803F, 0x06FB, 0x8040, 0x8041, 0x4479,
+ 0x8042, 0x8042, 0x0B57, 0x8043, 0x8043, 0x1BD9, 0x8044, 0x8045, 0x447B,
+ 0x8046, 0x8046, 0x1BDA, 0x8047, 0x8049, 0x447D, 0x804A, 0x804A, 0x0A0D,
+ 0x804B, 0x804B, 0x0A44, 0x804C, 0x804C, 0x11AF, 0x804D, 0x804D, 0x1BDB,
+ 0x804E, 0x8051, 0x4480, 0x8052, 0x8052, 0x1BDC, 0x8053, 0x8053, 0x4484,
+ 0x8054, 0x8054, 0x09F3, 0x8055, 0x8055, 0x4485, 0x8056, 0x8056, 0x2128,
+ 0x8057, 0x8057, 0x4486, 0x8058, 0x8058, 0x0BD7, 0x8059, 0x8059, 0x4487,
+ 0x805A, 0x805A, 0x090A, 0x805B, 0x805D, 0x4488, 0x805E, 0x805E, 0x2199,
+ 0x805F, 0x8068, 0x448B, 0x8069, 0x8069, 0x1BDD, 0x806A, 0x806A, 0x0552,
+ 0x806B, 0x806E, 0x4495, 0x806F, 0x806F, 0x2017, 0x8070, 0x8070, 0x1EA0,
+ 0x8071, 0x8071, 0x1BDE, 0x8072, 0x8072, 0x2125, 0x8073, 0x8073, 0x214D,
+ 0x8074, 0x8074, 0x4499, 0x8075, 0x8075, 0x25C4, 0x8076, 0x8076, 0x209D,
+ 0x8077, 0x8077, 0x228A, 0x8078, 0x8078, 0x449A, 0x8079, 0x8079, 0x25C3,
+ 0x807A, 0x807C, 0x449B, 0x807D, 0x807D, 0x2179, 0x807E, 0x807E, 0x2038,
+ 0x807F, 0x807F, 0x1A1E, 0x8080, 0x8080, 0x1A1D, 0x8081, 0x8082, 0x449E,
+ 0x8083, 0x8083, 0x0DD5, 0x8084, 0x8084, 0x1065, 0x8085, 0x8085, 0x2155,
+ 0x8086, 0x8086, 0x0DB6, 0x8087, 0x8087, 0x1179, 0x8088, 0x8088, 0x44A0,
+ 0x8089, 0x8089, 0x0CBD, 0x808A, 0x808A, 0x44A1, 0x808B, 0x808B, 0x09CA,
+ 0x808C, 0x808C, 0x0814, 0x808D, 0x8092, 0x44A2, 0x8093, 0x8093, 0x1971,
+ 0x8094, 0x8095, 0x44A8, 0x8096, 0x8096, 0x0F6F, 0x8097, 0x8097, 0x44AA,
+ 0x8098, 0x8098, 0x11E1, 0x8099, 0x8099, 0x44AB, 0x809A, 0x809A, 0x0606,
+ 0x809B, 0x809B, 0x06D3, 0x809C, 0x809C, 0x1970, 0x809D, 0x809D, 0x06C9,
+ 0x809E, 0x809E, 0x44AC, 0x809F, 0x809F, 0x196F, 0x80A0, 0x80A0, 0x04CB,
+ 0x80A1, 0x80A1, 0x0722, 0x80A2, 0x80A2, 0x11AA, 0x80A3, 0x80A3, 0x44AD,
+ 0x80A4, 0x80A4, 0x0691, 0x80A5, 0x80A5, 0x0667, 0x80A6, 0x80A8, 0x44AE,
+ 0x80A9, 0x80A9, 0x085A, 0x80AA, 0x80AA, 0x065B, 0x80AB, 0x80AB, 0x1976,
+ 0x80AC, 0x80AC, 0x44B1, 0x80AD, 0x80AD, 0x1977, 0x80AE, 0x80AE, 0x03C4,
+ 0x80AF, 0x80AF, 0x095C, 0x80B0, 0x80B0, 0x44B2, 0x80B1, 0x80B1, 0x1975,
+ 0x80B2, 0x80B2, 0x10E2, 0x80B3, 0x80B3, 0x44B3, 0x80B4, 0x80B4, 0x1978,
+ 0x80B5, 0x80B6, 0x44B4, 0x80B7, 0x80B7, 0x1979, 0x80B8, 0x80B9, 0x44B6,
+ 0x80BA, 0x80BA, 0x066B, 0x80BB, 0x80BB, 0x44B8, 0x80BC, 0x80BC, 0x1972,
+ 0x80BD, 0x80BD, 0x1974, 0x80BE, 0x80BE, 0x0D2F, 0x80BF, 0x80BF, 0x11D6,
+ 0x80C0, 0x80C0, 0x116E, 0x80C1, 0x80C1, 0x0F7D, 0x80C2, 0x80C2, 0x197F,
+ 0x80C3, 0x80C3, 0x0EC7, 0x80C4, 0x80C4, 0x1980, 0x80C5, 0x80C5, 0x44B9,
+ 0x80C6, 0x80C6, 0x0589, 0x80C7, 0x80CB, 0x44BA, 0x80CC, 0x80CC, 0x041C,
+ 0x80CD, 0x80CD, 0x1982, 0x80CE, 0x80CE, 0x0DF8, 0x80CF, 0x80D5, 0x44BF,
+ 0x80D6, 0x80D6, 0x0B97, 0x80D7, 0x80D7, 0x1983, 0x80D8, 0x80D8, 0x44C6,
+ 0x80D9, 0x80D9, 0x1981, 0x80DA, 0x80DA, 0x0BA0, 0x80DB, 0x80DB, 0x197E,
+ 0x80DC, 0x80DC, 0x0D3B, 0x80DD, 0x80DD, 0x1985, 0x80DE, 0x80DE, 0x0406,
+ 0x80DF, 0x80E0, 0x44C7, 0x80E1, 0x80E1, 0x07B1, 0x80E2, 0x80E3, 0x44C9,
+ 0x80E4, 0x80E4, 0x126D, 0x80E5, 0x80E5, 0x1BC7, 0x80E6, 0x80E6, 0x44CB,
+ 0x80E7, 0x80EA, 0x197A, 0x80EB, 0x80EB, 0x1986, 0x80EC, 0x80EC, 0x179A,
+ 0x80ED, 0x80ED, 0x1989, 0x80EE, 0x80EE, 0x44CC, 0x80EF, 0x80EF, 0x0975,
+ 0x80F0, 0x80F0, 0x104F, 0x80F1, 0x80F1, 0x1987, 0x80F2, 0x80F2, 0x198C,
+ 0x80F3, 0x80F3, 0x06E7, 0x80F4, 0x80F4, 0x1988, 0x80F5, 0x80F5, 0x44CD,
+ 0x80F6, 0x80F6, 0x088B, 0x80F7, 0x80F7, 0x44CE, 0x80F8, 0x80F8, 0x0FA3,
+ 0x80F9, 0x80F9, 0x44CF, 0x80FA, 0x80FA, 0x03C2, 0x80FB, 0x80FB, 0x44D0,
+ 0x80FC, 0x80FC, 0x198D, 0x80FD, 0x80FD, 0x0B3F, 0x80FE, 0x80FF, 0x44D1,
+ 0x8100, 0x8101, 0x44D3, 0x8102, 0x8102, 0x11AB, 0x8103, 0x8104, 0x44D5,
+ 0x8105, 0x8105, 0x21D2, 0x8106, 0x8106, 0x0563, 0x8107, 0x8108, 0x44D7,
+ 0x8109, 0x8109, 0x0A9D, 0x810A, 0x810A, 0x082C, 0x810B, 0x810C, 0x44D9,
+ 0x810D, 0x810E, 0x198A, 0x810F, 0x810F, 0x1123, 0x8110, 0x8110, 0x0C09,
+ 0x8111, 0x8111, 0x0B37, 0x8112, 0x8112, 0x198F, 0x8113, 0x8113, 0x0B68,
+ 0x8114, 0x8114, 0x1309, 0x8115, 0x8115, 0x44DB, 0x8116, 0x8116, 0x0478,
+ 0x8117, 0x8117, 0x44DC, 0x8118, 0x8118, 0x1994, 0x8119, 0x8119, 0x44DD,
+ 0x811A, 0x811A, 0x0896, 0x811B, 0x811B, 0x24C7, 0x811C, 0x811D, 0x44DE,
+ 0x811E, 0x811E, 0x1992, 0x811F, 0x812B, 0x44E0, 0x812C, 0x812C, 0x1993,
+ 0x812D, 0x812E, 0x44ED, 0x812F, 0x812F, 0x06A7, 0x8130, 0x8130, 0x44EF,
+ 0x8131, 0x8131, 0x0E82, 0x8132, 0x8132, 0x1995, 0x8133, 0x8135, 0x44F0,
+ 0x8136, 0x8136, 0x1991, 0x8137, 0x8137, 0x44F3, 0x8138, 0x8138, 0x09FC,
+ 0x8139, 0x8139, 0x2279, 0x813A, 0x813D, 0x44F4, 0x813E, 0x813E, 0x0BC1,
+ 0x813F, 0x8145, 0x44F8, 0x8146, 0x8146, 0x0E46, 0x8147, 0x8147, 0x44FF,
+ 0x8148, 0x8148, 0x1996, 0x8149, 0x8149, 0x4500, 0x814A, 0x814A, 0x099B,
+ 0x814B, 0x814B, 0x103F, 0x814C, 0x814C, 0x1997, 0x814D, 0x814D, 0x4501,
+ 0x814E, 0x814E, 0x2123, 0x814F, 0x814F, 0x4502, 0x8150, 0x8150, 0x06AA,
+ 0x8151, 0x8151, 0x06A8, 0x8152, 0x8152, 0x4503, 0x8153, 0x8153, 0x1998,
+ 0x8154, 0x8154, 0x0C38, 0x8155, 0x8155, 0x0EA4, 0x8156, 0x8156, 0x24C5,
+ 0x8157, 0x8158, 0x4504, 0x8159, 0x815A, 0x199A, 0x815B, 0x815F, 0x4506,
+ 0x8160, 0x8160, 0x199D, 0x8161, 0x8161, 0x24C9, 0x8162, 0x8164, 0x450B,
+ 0x8165, 0x8165, 0x0F93, 0x8166, 0x8166, 0x2094, 0x8167, 0x8167, 0x19A2,
+ 0x8168, 0x8168, 0x450E, 0x8169, 0x8169, 0x199E, 0x816A, 0x816A, 0x450F,
+ 0x816B, 0x816B, 0x2296, 0x816C, 0x816C, 0x4510, 0x816D, 0x816D, 0x19A1,
+ 0x816E, 0x816E, 0x0CD4, 0x816F, 0x816F, 0x4511, 0x8170, 0x8170, 0x1025,
+ 0x8171, 0x8171, 0x199C, 0x8172, 0x8173, 0x4512, 0x8174, 0x8174, 0x1999,
+ 0x8175, 0x8177, 0x4514, 0x8178, 0x8178, 0x1E77, 0x8179, 0x8179, 0x06B4,
+ 0x817A, 0x817A, 0x0F46, 0x817B, 0x817B, 0x0B48, 0x817C, 0x817D, 0x199F,
+ 0x817E, 0x817E, 0x0E2D, 0x817F, 0x817F, 0x0E79, 0x8180, 0x8180, 0x03FD,
+ 0x8181, 0x8181, 0x4517, 0x8182, 0x8182, 0x19A6, 0x8183, 0x8187, 0x4518,
+ 0x8188, 0x8188, 0x19A5, 0x8189, 0x8189, 0x451D, 0x818A, 0x818A, 0x0479,
+ 0x818B, 0x818E, 0x451E, 0x818F, 0x818F, 0x06DB, 0x8190, 0x8190, 0x4522,
+ 0x8191, 0x8191, 0x19A7, 0x8192, 0x8197, 0x4523, 0x8198, 0x8198, 0x0455,
+ 0x8199, 0x8199, 0x4529, 0x819A, 0x819A, 0x1F06, 0x819B, 0x819B, 0x0E18,
+ 0x819C, 0x819C, 0x0B07, 0x819D, 0x819D, 0x0F12, 0x819E, 0x819F, 0x452A,
+ 0x81A0, 0x81A0, 0x1FA5, 0x81A1, 0x81A2, 0x452C, 0x81A3, 0x81A3, 0x19A9,
+ 0x81A4, 0x81A5, 0x452E, 0x81A6, 0x81A6, 0x19B0, 0x81A7, 0x81A7, 0x4530,
+ 0x81A8, 0x81A8, 0x0BB3, 0x81A9, 0x81A9, 0x2099, 0x81AA, 0x81AA, 0x19AA,
+ 0x81AB, 0x81B2, 0x4531, 0x81B3, 0x81B3, 0x0CFE, 0x81B4, 0x81B9, 0x4539,
+ 0x81BA, 0x81BA, 0x1641, 0x81BB, 0x81BB, 0x19AE, 0x81BC, 0x81BC, 0x453F,
+ 0x81BD, 0x81BD, 0x1EAD, 0x81BE, 0x81BE, 0x24C8, 0x81BF, 0x81BF, 0x20A8,
+ 0x81C0, 0x81C0, 0x0E7F, 0x81C1, 0x81C1, 0x19AF, 0x81C2, 0x81C2, 0x0444,
+ 0x81C3, 0x81C3, 0x109C, 0x81C4, 0x81C5, 0x4540, 0x81C6, 0x81C6, 0x1063,
+ 0x81C7, 0x81C8, 0x4542, 0x81C9, 0x81C9, 0x201F, 0x81CA, 0x81CA, 0x19AD,
+ 0x81CB, 0x81CB, 0x4544, 0x81CC, 0x81CC, 0x19AB, 0x81CD, 0x81CD, 0x20C5,
+ 0x81CE, 0x81CE, 0x4545, 0x81CF, 0x81CF, 0x24CA, 0x81D0, 0x81D7, 0x4546,
+ 0x81D8, 0x81D8, 0x1FF0, 0x81D9, 0x81D9, 0x454E, 0x81DA, 0x81DA, 0x24C6,
+ 0x81DB, 0x81DE, 0x454F, 0x81DF, 0x81DF, 0x225D, 0x81E0, 0x81E0, 0x22DE,
+ 0x81E1, 0x81E2, 0x4553, 0x81E3, 0x81E3, 0x04E1, 0x81E4, 0x81E6, 0x4555,
+ 0x81E7, 0x81E7, 0x1902, 0x81E8, 0x81E8, 0x202C, 0x81E9, 0x81E9, 0x4558,
+ 0x81EA, 0x81EA, 0x1231, 0x81EB, 0x81EB, 0x4559, 0x81EC, 0x81EC, 0x1CA9,
+ 0x81ED, 0x81ED, 0x0519, 0x81EE, 0x81F2, 0x455A, 0x81F3, 0x81F4, 0x11C0,
+ 0x81F5, 0x81F9, 0x455F, 0x81FA, 0x81FA, 0x2161, 0x81FB, 0x81FB, 0x118A,
+ 0x81FC, 0x81FC, 0x08F9, 0x81FD, 0x81FD, 0x4564, 0x81FE, 0x81FE, 0x1CA5,
+ 0x81FF, 0x81FF, 0x4565, 0x8200, 0x8200, 0x102F, 0x8201, 0x8202, 0x1CA6,
+ 0x8203, 0x8203, 0x4566, 0x8204, 0x8204, 0x1CA8, 0x8205, 0x8205, 0x08FA,
+ 0x8206, 0x8206, 0x10C4, 0x8207, 0x8207, 0x223B, 0x8208, 0x8208, 0x21D9,
+ 0x8209, 0x8209, 0x1FCB, 0x820A, 0x820A, 0x1FC9, 0x820B, 0x820B, 0x4567,
+ 0x820C, 0x820D, 0x0D19, 0x820E, 0x820F, 0x4568, 0x8210, 0x8210, 0x1C62,
+ 0x8211, 0x8211, 0x456A, 0x8212, 0x8212, 0x0D7D, 0x8213, 0x8213, 0x456B,
+ 0x8214, 0x8214, 0x0E45, 0x8215, 0x821A, 0x456C, 0x821B, 0x821B, 0x1618,
+ 0x821C, 0x821C, 0x0DA9, 0x821D, 0x821D, 0x4572, 0x821E, 0x821E, 0x0EF7,
+ 0x821F, 0x821F, 0x11DA, 0x8220, 0x8220, 0x4573, 0x8221, 0x8223, 0x1CAB,
+ 0x8224, 0x8227, 0x4574, 0x8228, 0x8228, 0x1CB0, 0x8229, 0x8229, 0x4578,
+ 0x822A, 0x822A, 0x0774, 0x822B, 0x822B, 0x1CB1, 0x822C, 0x822C, 0x03EE,
+ 0x822D, 0x822D, 0x1CAE, 0x822E, 0x822E, 0x4579, 0x822F, 0x822F, 0x1CAF,
+ 0x8230, 0x8230, 0x0873, 0x8231, 0x8231, 0x049C, 0x8232, 0x8232, 0x457A,
+ 0x8233, 0x8234, 0x1CB4, 0x8235, 0x8235, 0x0625, 0x8236, 0x8236, 0x0477,
+ 0x8237, 0x8237, 0x0F3C, 0x8238, 0x8238, 0x1CB2, 0x8239, 0x8239, 0x052F,
+ 0x823A, 0x823A, 0x457B, 0x823B, 0x823B, 0x1CB3, 0x823C, 0x823D, 0x457C,
+ 0x823E, 0x823E, 0x1CB6, 0x823F, 0x8243, 0x457E, 0x8244, 0x8244, 0x1CB7,
+ 0x8245, 0x8246, 0x4583, 0x8247, 0x8247, 0x0E58, 0x8248, 0x8248, 0x4585,
+ 0x8249, 0x8249, 0x1CB8, 0x824A, 0x824A, 0x4586, 0x824B, 0x824B, 0x1CB9,
+ 0x824C, 0x824E, 0x4587, 0x824F, 0x824F, 0x1CBA, 0x8250, 0x8257, 0x458A,
+ 0x8258, 0x8258, 0x0DC7, 0x8259, 0x8259, 0x1E61, 0x825A, 0x825A, 0x1CBB,
+ 0x825B, 0x825E, 0x4592, 0x825F, 0x825F, 0x1CBC, 0x8260, 0x8263, 0x4596,
+ 0x8264, 0x8264, 0x25EF, 0x8265, 0x8265, 0x459A, 0x8266, 0x8266, 0x1F98,
+ 0x8267, 0x8267, 0x459B, 0x8268, 0x8268, 0x1CBD, 0x8269, 0x826A, 0x459C,
+ 0x826B, 0x826B, 0x25F0, 0x826C, 0x826D, 0x459E, 0x826E, 0x826E, 0x1CDC,
+ 0x826F, 0x826F, 0x0A05, 0x8270, 0x8270, 0x085B, 0x8271, 0x8271, 0x1F88,
+ 0x8272, 0x8272, 0x0CE4, 0x8273, 0x8273, 0x1007, 0x8274, 0x8274, 0x1771,
+ 0x8275, 0x8276, 0x45A0, 0x8277, 0x8277, 0x21F8, 0x8278, 0x8278, 0x45A2,
+ 0x8279, 0x8279, 0x13E1, 0x827A, 0x827A, 0x105C, 0x827B, 0x827C, 0x45A3,
+ 0x827D, 0x827D, 0x13E2, 0x827E, 0x827E, 0x03B7, 0x827F, 0x827F, 0x13E3,
+ 0x8280, 0x8281, 0x45A5, 0x8282, 0x8282, 0x08AB, 0x8283, 0x8283, 0x45A7,
+ 0x8284, 0x8284, 0x13E7, 0x8285, 0x8287, 0x45A8, 0x8288, 0x8288, 0x1278,
+ 0x8289, 0x8289, 0x45AB, 0x828A, 0x828A, 0x13E5, 0x828B, 0x828B, 0x10D8,
+ 0x828C, 0x828C, 0x45AC, 0x828D, 0x828D, 0x0D0F, 0x828E, 0x828E, 0x13E8,
+ 0x828F, 0x828F, 0x13E4, 0x8290, 0x8290, 0x45AD, 0x8291, 0x8291, 0x13E9,
+ 0x8292, 0x8292, 0x0AA7, 0x8293, 0x8296, 0x45AE, 0x8297, 0x8297, 0x13EA,
+ 0x8298, 0x8298, 0x13F3, 0x8299, 0x8299, 0x13EB, 0x829A, 0x829B, 0x45B2,
+ 0x829C, 0x829C, 0x0EEE, 0x829D, 0x829D, 0x11A4, 0x829E, 0x829E, 0x45B4,
+ 0x829F, 0x829F, 0x13FD, 0x82A0, 0x82A0, 0x45B5, 0x82A1, 0x82A1, 0x13FB,
+ 0x82A2, 0x82A3, 0x45B6, 0x82A4, 0x82A4, 0x1400, 0x82A5, 0x82A5, 0x08B7,
+ 0x82A6, 0x82A6, 0x0A52, 0x82A7, 0x82A7, 0x45B8, 0x82A8, 0x82A8, 0x13E6,
+ 0x82A9, 0x82A9, 0x13F9, 0x82AA, 0x82AA, 0x13FC, 0x82AB, 0x82AB, 0x13EC,
+ 0x82AC, 0x82AC, 0x066F, 0x82AD, 0x82AD, 0x03D0, 0x82AE, 0x82AE, 0x13F5,
+ 0x82AF, 0x82AF, 0x0F89, 0x82B0, 0x82B0, 0x13EF, 0x82B1, 0x82B1, 0x07BD,
+ 0x82B2, 0x82B2, 0x45B9, 0x82B3, 0x82B3, 0x0659, 0x82B4, 0x82B4, 0x13FA,
+ 0x82B5, 0x82B6, 0x45BA, 0x82B7, 0x82B7, 0x13F4, 0x82B8, 0x82B8, 0x13ED,
+ 0x82B9, 0x82B9, 0x0C58, 0x82BA, 0x82BA, 0x45BC, 0x82BB, 0x82BB, 0x2322,
+ 0x82BC, 0x82BC, 0x45BD, 0x82BD, 0x82BD, 0x0FE8, 0x82BE, 0x82BE, 0x13EE,
+ 0x82BF, 0x82C0, 0x45BE, 0x82C1, 0x82C1, 0x13F8, 0x82C2, 0x82C3, 0x45C0,
+ 0x82C4, 0x82C4, 0x13FE, 0x82C5, 0x82C6, 0x45C2, 0x82C7, 0x82C7, 0x0EBC,
+ 0x82C8, 0x82C8, 0x13F0, 0x82C9, 0x82C9, 0x45C4, 0x82CA, 0x82CA, 0x13F1,
+ 0x82CB, 0x82CC, 0x13F6, 0x82CD, 0x82CD, 0x049B, 0x82CE, 0x82CE, 0x13FF,
+ 0x82CF, 0x82CF, 0x0DCA, 0x82D0, 0x82D0, 0x45C5, 0x82D1, 0x82D1, 0x10FA,
+ 0x82D2, 0x82D2, 0x1409, 0x82D3, 0x82D3, 0x140D, 0x82D4, 0x82D4, 0x0DF9,
+ 0x82D5, 0x82D5, 0x1414, 0x82D6, 0x82D6, 0x45C6, 0x82D7, 0x82D7, 0x0AEC,
+ 0x82D8, 0x82D8, 0x140A, 0x82D9, 0x82DA, 0x45C7, 0x82DB, 0x82DB, 0x094E,
+ 0x82DC, 0x82DC, 0x1407, 0x82DD, 0x82DD, 0x45C9, 0x82DE, 0x82DE, 0x0405,
+ 0x82DF, 0x82DF, 0x070F, 0x82E0, 0x82E0, 0x1413, 0x82E1, 0x82E1, 0x1401,
+ 0x82E2, 0x82E2, 0x45CA, 0x82E3, 0x82E3, 0x13F2, 0x82E4, 0x82E4, 0x1404,
+ 0x82E5, 0x82E5, 0x0CCF, 0x82E6, 0x82E6, 0x096D, 0x82E7, 0x82E7, 0x2336,
+ 0x82E8, 0x82EA, 0x45CB, 0x82EB, 0x82EB, 0x0CF4, 0x82EC, 0x82EE, 0x45CE,
+ 0x82EF, 0x82EF, 0x0426, 0x82F0, 0x82F0, 0x45D1, 0x82F1, 0x82F1, 0x1087,
+ 0x82F2, 0x82F3, 0x45D2, 0x82F4, 0x82F4, 0x1408, 0x82F5, 0x82F6, 0x45D4,
+ 0x82F7, 0x82F7, 0x1403, 0x82F8, 0x82F8, 0x45D6, 0x82F9, 0x82F9, 0x0BDA,
+ 0x82FA, 0x82FA, 0x45D7, 0x82FB, 0x82FB, 0x140C, 0x82FC, 0x82FF, 0x45D8,
+ 0x8300, 0x8300, 0x45DC, 0x8301, 0x8301, 0x121F, 0x8302, 0x8302, 0x0AB4,
+ 0x8303, 0x8303, 0x0653, 0x8304, 0x8304, 0x0C4E, 0x8305, 0x8305, 0x0AAE,
+ 0x8306, 0x8306, 0x1410, 0x8307, 0x8307, 0x1406, 0x8308, 0x8308, 0x1419,
+ 0x8309, 0x8309, 0x1402, 0x830A, 0x830B, 0x45DD, 0x830C, 0x830C, 0x140B,
+ 0x830D, 0x830D, 0x45DF, 0x830E, 0x830E, 0x08D4, 0x830F, 0x830F, 0x1405,
+ 0x8310, 0x8310, 0x45E0, 0x8311, 0x8311, 0x140E, 0x8312, 0x8313, 0x45E1,
+ 0x8314, 0x8315, 0x1411, 0x8316, 0x8316, 0x45E3, 0x8317, 0x8317, 0x1426,
+ 0x8318, 0x8319, 0x45E4, 0x831A, 0x831A, 0x140F, 0x831B, 0x831B, 0x142E,
+ 0x831C, 0x831C, 0x1415, 0x831D, 0x8326, 0x45E6, 0x8327, 0x8327, 0x085E,
+ 0x8328, 0x8328, 0x0547, 0x8329, 0x832A, 0x45F0, 0x832B, 0x832B, 0x0AA8,
+ 0x832C, 0x832C, 0x04AE, 0x832D, 0x832D, 0x1428, 0x832E, 0x832E, 0x45F2,
+ 0x832F, 0x832F, 0x1420, 0x8330, 0x8330, 0x45F3, 0x8331, 0x8331, 0x141D,
+ 0x8332, 0x8332, 0x45F4, 0x8333, 0x8333, 0x142A, 0x8334, 0x8334, 0x141C,
+ 0x8335, 0x8335, 0x1077, 0x8336, 0x8336, 0x04AF, 0x8337, 0x8337, 0x45F5,
+ 0x8338, 0x8338, 0x0CB2, 0x8339, 0x8339, 0x0CBE, 0x833A, 0x833A, 0x1429,
+ 0x833B, 0x833B, 0x45F6, 0x833C, 0x833C, 0x141B, 0x833D, 0x833F, 0x45F7,
+ 0x8340, 0x8340, 0x1425, 0x8341, 0x8342, 0x45FA, 0x8343, 0x8343, 0x1423,
+ 0x8344, 0x8345, 0x45FC, 0x8346, 0x8346, 0x08D2, 0x8347, 0x8347, 0x1422,
+ 0x8348, 0x8348, 0x45FE, 0x8349, 0x8349, 0x04A4, 0x834A, 0x834E, 0x45FF,
+ 0x834F, 0x834F, 0x1421, 0x8350, 0x8350, 0x0869, 0x8351, 0x8351, 0x1416,
+ 0x8352, 0x8352, 0x07D9, 0x8353, 0x8353, 0x4604, 0x8354, 0x8354, 0x09DE,
+ 0x8355, 0x8359, 0x4605, 0x835A, 0x835A, 0x0847, 0x835B, 0x835C, 0x1417,
+ 0x835D, 0x835D, 0x460A, 0x835E, 0x835E, 0x141F, 0x835F, 0x835F, 0x1424,
+ 0x8360, 0x8360, 0x1427, 0x8361, 0x8361, 0x0595, 0x8362, 0x8362, 0x460B,
+ 0x8363, 0x8363, 0x0CB4, 0x8364, 0x8364, 0x07FC, 0x8365, 0x8365, 0x142C,
+ 0x8366, 0x8366, 0x142B, 0x8367, 0x8367, 0x1090, 0x8368, 0x8368, 0x142D,
+ 0x8369, 0x8369, 0x142F, 0x836A, 0x836A, 0x1431, 0x836B, 0x836B, 0x1078,
+ 0x836C, 0x836C, 0x1430, 0x836D, 0x836E, 0x1432, 0x836F, 0x836F, 0x1030,
+ 0x8370, 0x8376, 0x460C, 0x8377, 0x8377, 0x0780, 0x8378, 0x8378, 0x1435,
+ 0x8379, 0x837A, 0x4613, 0x837B, 0x837B, 0x1442, 0x837C, 0x837C, 0x143D,
+ 0x837D, 0x837D, 0x1440, 0x837E, 0x8384, 0x4615, 0x8385, 0x8385, 0x143C,
+ 0x8386, 0x8386, 0x0BED, 0x8387, 0x8388, 0x461C, 0x8389, 0x8389, 0x09DD,
+ 0x838A, 0x838A, 0x22AB, 0x838B, 0x838D, 0x461E, 0x838E, 0x838E, 0x0CE8,
+ 0x838F, 0x8391, 0x4621, 0x8392, 0x8392, 0x141A, 0x8393, 0x8393, 0x143A,
+ 0x8394, 0x8395, 0x4624, 0x8396, 0x8396, 0x1FBF, 0x8397, 0x8397, 0x4626,
+ 0x8398, 0x8398, 0x1443, 0x8399, 0x839A, 0x4627, 0x839B, 0x839B, 0x141E,
+ 0x839C, 0x839C, 0x143B, 0x839D, 0x839D, 0x4629, 0x839E, 0x839E, 0x1444,
+ 0x839F, 0x839F, 0x462A, 0x83A0, 0x83A0, 0x1438, 0x83A1, 0x83A1, 0x462B,
+ 0x83A2, 0x83A2, 0x1F7D, 0x83A3, 0x83A6, 0x462C, 0x83A7, 0x83A7, 0x2333,
+ 0x83A8, 0x83A8, 0x1445, 0x83A9, 0x83A9, 0x143F, 0x83AA, 0x83AA, 0x1439,
+ 0x83AB, 0x83AB, 0x0B0D, 0x83AC, 0x83AF, 0x4630, 0x83B0, 0x83B0, 0x1434,
+ 0x83B1, 0x83B1, 0x099E, 0x83B2, 0x83B2, 0x09F4, 0x83B3, 0x83B4, 0x1436,
+ 0x83B5, 0x83B5, 0x4634, 0x83B6, 0x83B6, 0x143E, 0x83B7, 0x83B7, 0x0806,
+ 0x83B8, 0x83B8, 0x1441, 0x83B9, 0x83B9, 0x108D, 0x83BA, 0x83BA, 0x1446,
+ 0x83BB, 0x83BB, 0x4635, 0x83BC, 0x83BC, 0x1447, 0x83BD, 0x83BD, 0x0AAC,
+ 0x83BE, 0x83BF, 0x4636, 0x83C0, 0x83C0, 0x145E, 0x83C1, 0x83C1, 0x1448,
+ 0x83C2, 0x83C4, 0x4638, 0x83C5, 0x83C5, 0x145D, 0x83C6, 0x83C6, 0x463B,
+ 0x83C7, 0x83C7, 0x0716, 0x83C8, 0x83C9, 0x463C, 0x83CA, 0x83CA, 0x0904,
+ 0x83CB, 0x83CB, 0x463E, 0x83CC, 0x83CC, 0x0929, 0x83CD, 0x83CE, 0x463F,
+ 0x83CF, 0x83CF, 0x0781, 0x83D0, 0x83D3, 0x4641, 0x83D4, 0x83D4, 0x1456,
+ 0x83D5, 0x83D5, 0x4645, 0x83D6, 0x83D6, 0x1451, 0x83D7, 0x83D7, 0x4646,
+ 0x83D8, 0x83D8, 0x144B, 0x83D9, 0x83DB, 0x4647, 0x83DC, 0x83DC, 0x0492,
+ 0x83DD, 0x83DD, 0x144F, 0x83DE, 0x83DE, 0x464A, 0x83DF, 0x83DF, 0x1457,
+ 0x83E0, 0x83E0, 0x046B, 0x83E1, 0x83E1, 0x1461, 0x83E2, 0x83E4, 0x464B,
+ 0x83E5, 0x83E5, 0x144A, 0x83E6, 0x83E8, 0x464E, 0x83E9, 0x83E9, 0x0BEF,
+ 0x83EA, 0x83EA, 0x145C, 0x83EB, 0x83EE, 0x4651, 0x83EF, 0x83EF, 0x1F4D,
+ 0x83F0, 0x83F0, 0x1460, 0x83F1, 0x83F1, 0x0A2B, 0x83F2, 0x83F2, 0x0663,
+ 0x83F3, 0x83F7, 0x4655, 0x83F8, 0x83F9, 0x145A, 0x83FA, 0x83FC, 0x465A,
+ 0x83FD, 0x83FD, 0x1450, 0x83FE, 0x83FF, 0x465D, 0x8400, 0x8400, 0x465F,
+ 0x8401, 0x8401, 0x1449, 0x8402, 0x8402, 0x4660, 0x8403, 0x8403, 0x1459,
+ 0x8404, 0x8404, 0x0E24, 0x8405, 0x8405, 0x4661, 0x8406, 0x8406, 0x1455,
+ 0x8407, 0x8407, 0x2334, 0x8408, 0x8409, 0x4662, 0x840A, 0x840A, 0x1FF1,
+ 0x840B, 0x840B, 0x144E, 0x840C, 0x840C, 0x0ACD, 0x840D, 0x840D, 0x0BDB,
+ 0x840E, 0x840E, 0x0EBD, 0x840F, 0x840F, 0x1458, 0x8410, 0x8410, 0x4664,
+ 0x8411, 0x8411, 0x1454, 0x8412, 0x8417, 0x4665, 0x8418, 0x8418, 0x144D,
+ 0x8419, 0x841B, 0x466B, 0x841C, 0x841C, 0x1452, 0x841D, 0x841D, 0x0A83,
+ 0x841E, 0x8423, 0x466E, 0x8424, 0x8425, 0x108E, 0x8426, 0x8426, 0x145F,
+ 0x8427, 0x8427, 0x0F61, 0x8428, 0x8428, 0x0CD3, 0x8429, 0x842B, 0x4674,
+ 0x842C, 0x842C, 0x218B, 0x842D, 0x8430, 0x4677, 0x8431, 0x8431, 0x1472,
+ 0x8432, 0x8434, 0x467B, 0x8435, 0x8435, 0x2349, 0x8436, 0x8437, 0x467E,
+ 0x8438, 0x8438, 0x1453, 0x8439, 0x843B, 0x4680, 0x843C, 0x843C, 0x146C,
+ 0x843D, 0x843D, 0x0A8B, 0x843E, 0x8445, 0x4683, 0x8446, 0x8446, 0x146D,
+ 0x8447, 0x8448, 0x468B, 0x8449, 0x8449, 0x220B, 0x844A, 0x8450, 0x468D,
+ 0x8451, 0x8451, 0x1463, 0x8452, 0x8452, 0x2346, 0x8453, 0x8456, 0x4694,
+ 0x8457, 0x8457, 0x11F7, 0x8458, 0x8458, 0x4698, 0x8459, 0x8459, 0x1465,
+ 0x845A, 0x845A, 0x1464, 0x845B, 0x845B, 0x06EB, 0x845C, 0x845C, 0x1462,
+ 0x845D, 0x8460, 0x4699, 0x8461, 0x8461, 0x0BEE, 0x8462, 0x8462, 0x469D,
+ 0x8463, 0x8463, 0x05EC, 0x8464, 0x8464, 0x2347, 0x8465, 0x8465, 0x469E,
+ 0x8466, 0x8466, 0x2193, 0x8467, 0x8468, 0x469F, 0x8469, 0x8469, 0x146E,
+ 0x846A, 0x846A, 0x46A1, 0x846B, 0x846B, 0x07B0, 0x846C, 0x846C, 0x1124,
+ 0x846D, 0x846D, 0x1473, 0x846E, 0x846E, 0x46A2, 0x846F, 0x846F, 0x26A1,
+ 0x8470, 0x8470, 0x46A3, 0x8471, 0x8471, 0x0553, 0x8472, 0x8472, 0x46A4,
+ 0x8473, 0x8473, 0x1466, 0x8474, 0x8474, 0x46A5, 0x8475, 0x8475, 0x0988,
+ 0x8476, 0x8476, 0x146F, 0x8477, 0x8477, 0x1F62, 0x8478, 0x8478, 0x146B,
+ 0x8479, 0x8479, 0x46A6, 0x847A, 0x847A, 0x1469, 0x847B, 0x8481, 0x46A7,
+ 0x8482, 0x8482, 0x05BA, 0x8483, 0x8486, 0x46AE, 0x8487, 0x8488, 0x1467,
+ 0x8489, 0x8489, 0x146A, 0x848A, 0x848A, 0x46B2, 0x848B, 0x848B, 0x0880,
+ 0x848C, 0x848C, 0x1470, 0x848D, 0x848D, 0x46B3, 0x848E, 0x848E, 0x1471,
+ 0x848F, 0x8492, 0x46B4, 0x8493, 0x8493, 0x234D, 0x8494, 0x8494, 0x2348,
+ 0x8495, 0x8496, 0x46B8, 0x8497, 0x8497, 0x1481, 0x8498, 0x8498, 0x46BA,
+ 0x8499, 0x8499, 0x0ACE, 0x849A, 0x849B, 0x46BB, 0x849C, 0x849C, 0x0DD7,
+ 0x849D, 0x84A0, 0x46BD, 0x84A1, 0x84A1, 0x147E, 0x84A2, 0x84AE, 0x46C1,
+ 0x84AF, 0x84AF, 0x1297, 0x84B0, 0x84B1, 0x46CE, 0x84B2, 0x84B2, 0x0BF0,
+ 0x84B3, 0x84B3, 0x46D0, 0x84B4, 0x84B4, 0x1480, 0x84B5, 0x84B7, 0x46D1,
+ 0x84B8, 0x84B8, 0x1195, 0x84B9, 0x84B9, 0x147F, 0x84BA, 0x84BA, 0x147C,
+ 0x84BB, 0x84BB, 0x46D4, 0x84BC, 0x84BC, 0x1E60, 0x84BD, 0x84BD, 0x1478,
+ 0x84BE, 0x84BE, 0x46D5, 0x84BF, 0x84BF, 0x147B, 0x84C0, 0x84C0, 0x2345,
+ 0x84C1, 0x84C1, 0x1474, 0x84C2, 0x84C3, 0x46D6, 0x84C4, 0x84C4, 0x0FB9,
+ 0x84C5, 0x84C8, 0x46D8, 0x84C9, 0x84C9, 0x0CB3, 0x84CA, 0x84CA, 0x147A,
+ 0x84CB, 0x84CB, 0x1F12, 0x84CC, 0x84CC, 0x46DC, 0x84CD, 0x84CD, 0x1475,
+ 0x84CE, 0x84CF, 0x46DD, 0x84D0, 0x84D0, 0x1476, 0x84D1, 0x84D1, 0x0DE7,
+ 0x84D2, 0x84D2, 0x46DF, 0x84D3, 0x84D3, 0x1479, 0x84D4, 0x84D5, 0x46E0,
+ 0x84D6, 0x84D6, 0x0436, 0x84D7, 0x84DC, 0x46E2, 0x84DD, 0x84DD, 0x09A1,
+ 0x84DE, 0x84DE, 0x46E8, 0x84DF, 0x84DF, 0x082E, 0x84E0, 0x84E0, 0x147D,
+ 0x84E1, 0x84E2, 0x46E9, 0x84E3, 0x84E3, 0x1483, 0x84E4, 0x84E4, 0x46EB,
+ 0x84E5, 0x84E5, 0x1482, 0x84E6, 0x84E6, 0x1477, 0x84E7, 0x84EB, 0x46EC,
+ 0x84EC, 0x84EC, 0x0BAF, 0x84ED, 0x84ED, 0x46F1, 0x84EE, 0x84EE, 0x2018,
+ 0x84EF, 0x84EF, 0x2335, 0x84F0, 0x84F0, 0x1487, 0x84F1, 0x84FB, 0x46F2,
+ 0x84FC, 0x84FC, 0x148E, 0x84FD, 0x84FD, 0x233C, 0x84FE, 0x84FE, 0x46FD,
+ 0x84FF, 0x84FF, 0x148D, 0x8500, 0x850B, 0x46FE, 0x850C, 0x850C, 0x1484,
+ 0x850D, 0x8510, 0x470A, 0x8511, 0x8511, 0x0AF4, 0x8512, 0x8512, 0x470E,
+ 0x8513, 0x8513, 0x0AA2, 0x8514, 0x8514, 0x266F, 0x8515, 0x8516, 0x470F,
+ 0x8517, 0x8517, 0x1182, 0x8518, 0x8519, 0x4711, 0x851A, 0x851A, 0x0EC4,
+ 0x851B, 0x851D, 0x4713, 0x851E, 0x851E, 0x2351, 0x851F, 0x851F, 0x1489,
+ 0x8520, 0x8520, 0x4716, 0x8521, 0x8521, 0x0493, 0x8522, 0x8522, 0x4717,
+ 0x8523, 0x8523, 0x1FA0, 0x8524, 0x8525, 0x4718, 0x8526, 0x8526, 0x2338,
+ 0x8527, 0x852A, 0x471A, 0x852B, 0x852B, 0x0B4B, 0x852C, 0x852C, 0x0D76,
+ 0x852D, 0x852D, 0x221B, 0x852E, 0x8536, 0x471E, 0x8537, 0x8537, 0x0C3B,
+ 0x8538, 0x8538, 0x1486, 0x8539, 0x8539, 0x1488, 0x853A, 0x853A, 0x148A,
+ 0x853B, 0x853B, 0x148C, 0x853C, 0x853C, 0x03B5, 0x853D, 0x853D, 0x0437,
+ 0x853E, 0x8540, 0x4727, 0x8541, 0x8541, 0x2342, 0x8542, 0x8542, 0x472A,
+ 0x8543, 0x8543, 0x1496, 0x8544, 0x8545, 0x472B, 0x8546, 0x8546, 0x234F,
+ 0x8547, 0x8547, 0x472D, 0x8548, 0x8548, 0x1490, 0x8549, 0x8549, 0x0887,
+ 0x854A, 0x854A, 0x0CCA, 0x854B, 0x854D, 0x472E, 0x854E, 0x854E, 0x233D,
+ 0x854F, 0x8551, 0x4731, 0x8552, 0x8552, 0x2344, 0x8553, 0x8553, 0x2331,
+ 0x8554, 0x8554, 0x4734, 0x8555, 0x8555, 0x234B, 0x8556, 0x8556, 0x148B,
+ 0x8557, 0x8557, 0x4735, 0x8558, 0x8558, 0x233B, 0x8559, 0x8559, 0x148F,
+ 0x855A, 0x855D, 0x4736, 0x855E, 0x855E, 0x1493, 0x855F, 0x8561, 0x473A,
+ 0x8562, 0x8562, 0x2350, 0x8563, 0x8563, 0x473D, 0x8564, 0x8564, 0x1492,
+ 0x8565, 0x8567, 0x473E, 0x8568, 0x8568, 0x1491, 0x8569, 0x8569, 0x1EB4,
+ 0x856A, 0x856A, 0x21A6, 0x856B, 0x856C, 0x4741, 0x856D, 0x856D, 0x21CB,
+ 0x856E, 0x8571, 0x4743, 0x8572, 0x8572, 0x1497, 0x8573, 0x8573, 0x4747,
+ 0x8574, 0x8574, 0x110F, 0x8575, 0x8576, 0x4748, 0x8577, 0x8577, 0x2355,
+ 0x8578, 0x8578, 0x474A, 0x8579, 0x8579, 0x149D, 0x857A, 0x857A, 0x1494,
+ 0x857B, 0x857B, 0x1498, 0x857C, 0x857D, 0x474B, 0x857E, 0x857E, 0x09C4,
+ 0x857F, 0x8583, 0x474D, 0x8584, 0x8584, 0x040A, 0x8585, 0x8585, 0x14A0,
+ 0x8586, 0x8586, 0x4752, 0x8587, 0x8587, 0x149B, 0x8588, 0x8588, 0x233E,
+ 0x8589, 0x8589, 0x4753, 0x858A, 0x858A, 0x1F74, 0x858B, 0x858B, 0x4754,
+ 0x858C, 0x858C, 0x2330, 0x858D, 0x858E, 0x4755, 0x858F, 0x858F, 0x149C,
+ 0x8590, 0x8590, 0x4757, 0x8591, 0x8591, 0x2680, 0x8592, 0x8593, 0x4758,
+ 0x8594, 0x8594, 0x20DA, 0x8595, 0x859A, 0x475A, 0x859B, 0x859B, 0x0FCF,
+ 0x859C, 0x859C, 0x149F, 0x859D, 0x859E, 0x4760, 0x859F, 0x859F, 0x234A,
+ 0x85A0, 0x85A3, 0x4762, 0x85A4, 0x85A4, 0x1499, 0x85A5, 0x85A5, 0x4766,
+ 0x85A6, 0x85A6, 0x1F91, 0x85A7, 0x85A7, 0x4767, 0x85A8, 0x85A8, 0x149A,
+ 0x85A9, 0x85A9, 0x2107, 0x85AA, 0x85AA, 0x0F88, 0x85AB, 0x85AD, 0x4768,
+ 0x85AE, 0x85AE, 0x149E, 0x85AF, 0x85AF, 0x0D84, 0x85B0, 0x85B0, 0x14A3,
+ 0x85B1, 0x85B6, 0x476B, 0x85B7, 0x85B7, 0x14A2, 0x85B8, 0x85B8, 0x4771,
+ 0x85B9, 0x85B9, 0x14A1, 0x85BA, 0x85BA, 0x233F, 0x85BB, 0x85C0, 0x4772,
+ 0x85C1, 0x85C1, 0x14A5, 0x85C2, 0x85C8, 0x4778, 0x85C9, 0x85C9, 0x08B6,
+ 0x85CA, 0x85CC, 0x477F, 0x85CD, 0x85CD, 0x1FF4, 0x85CE, 0x85CE, 0x2343,
+ 0x85CF, 0x85CF, 0x049F, 0x85D0, 0x85D0, 0x0AEF, 0x85D1, 0x85D2, 0x4782,
+ 0x85D3, 0x85D3, 0x14A4, 0x85D4, 0x85D4, 0x4784, 0x85D5, 0x85D5, 0x0B7B,
+ 0x85D6, 0x85DB, 0x4785, 0x85DC, 0x85DC, 0x14A6, 0x85DD, 0x85DD, 0x2212,
+ 0x85DE, 0x85E3, 0x478B, 0x85E4, 0x85E4, 0x0E2C, 0x85E5, 0x85E5, 0x2207,
+ 0x85E6, 0x85E8, 0x4791, 0x85E9, 0x85E9, 0x0647, 0x85EA, 0x85EA, 0x2359,
+ 0x85EB, 0x85F3, 0x4794, 0x85F4, 0x85F4, 0x2254, 0x85F5, 0x85F5, 0x479D,
+ 0x85F6, 0x85F6, 0x2332, 0x85F7, 0x85F8, 0x479E, 0x85F9, 0x85F9, 0x1E26,
+ 0x85FA, 0x85FA, 0x2357, 0x85FB, 0x85FB, 0x1128, 0x85FC, 0x85FE, 0x47A0,
+ 0x85FF, 0x85FF, 0x14A7, 0x8600, 0x8603, 0x47A3, 0x8604, 0x8604, 0x2358,
+ 0x8605, 0x8605, 0x14A9, 0x8606, 0x8606, 0x2042, 0x8607, 0x8607, 0x2153,
+ 0x8608, 0x860A, 0x47A7, 0x860B, 0x860B, 0x20BB, 0x860C, 0x8610, 0x47AA,
+ 0x8611, 0x8611, 0x0B05, 0x8612, 0x8615, 0x47AF, 0x8616, 0x8616, 0x14AB,
+ 0x8617, 0x8619, 0x47B3, 0x861A, 0x861A, 0x235A, 0x861B, 0x861D, 0x47B6,
+ 0x861E, 0x861E, 0x2356, 0x861F, 0x8621, 0x47B9, 0x8622, 0x8622, 0x2337,
+ 0x8623, 0x8626, 0x47BC, 0x8627, 0x8627, 0x14A8, 0x8628, 0x8628, 0x47C0,
+ 0x8629, 0x8629, 0x14AA, 0x862A, 0x862C, 0x47C1, 0x862D, 0x862D, 0x1FF9,
+ 0x862E, 0x8637, 0x47C4, 0x8638, 0x8638, 0x115B, 0x8639, 0x8639, 0x47CE,
+ 0x863A, 0x863A, 0x2353, 0x863B, 0x863B, 0x47CF, 0x863C, 0x863C, 0x14AC,
+ 0x863D, 0x863E, 0x47D0, 0x863F, 0x863F, 0x2061, 0x8640, 0x864C, 0x47D2,
+ 0x864D, 0x864D, 0x1BF0, 0x864E, 0x864E, 0x07B7, 0x864F, 0x864F, 0x0A59,
+ 0x8650, 0x8650, 0x0B71, 0x8651, 0x8651, 0x0A6E, 0x8652, 0x8653, 0x47DF,
+ 0x8654, 0x8654, 0x1BF1, 0x8655, 0x8655, 0x1E95, 0x8656, 0x8659, 0x47E1,
+ 0x865A, 0x865A, 0x0FB4, 0x865B, 0x865B, 0x47E5, 0x865C, 0x865C, 0x2049,
+ 0x865D, 0x865D, 0x47E6, 0x865E, 0x865E, 0x10C2, 0x865F, 0x865F, 0x1F42,
+ 0x8660, 0x8661, 0x47E7, 0x8662, 0x8662, 0x196D, 0x8663, 0x8666, 0x47E9,
+ 0x8667, 0x8667, 0x1FE8, 0x8668, 0x866A, 0x47ED, 0x866B, 0x866B, 0x050B,
+ 0x866C, 0x866C, 0x1BF2, 0x866D, 0x866D, 0x47F0, 0x866E, 0x866E, 0x1BF3,
+ 0x866F, 0x8670, 0x47F1, 0x8671, 0x8671, 0x0D44, 0x8672, 0x8678, 0x47F3,
+ 0x8679, 0x8679, 0x079E, 0x867A, 0x867A, 0x1BF5, 0x867B, 0x867B, 0x1BF7,
+ 0x867C, 0x867C, 0x1BF6, 0x867D, 0x867D, 0x0DD9, 0x867E, 0x867E, 0x0F27,
+ 0x867F, 0x867F, 0x1BF4, 0x8680, 0x8680, 0x0D4B, 0x8681, 0x8681, 0x1056,
+ 0x8682, 0x8682, 0x0A93, 0x8683, 0x8689, 0x47FA, 0x868A, 0x868A, 0x0ED2,
+ 0x868B, 0x868B, 0x1BFA, 0x868C, 0x868C, 0x0401, 0x868D, 0x868D, 0x1BF9,
+ 0x868E, 0x8692, 0x4801, 0x8693, 0x8693, 0x1C00, 0x8694, 0x8694, 0x4806,
+ 0x8695, 0x8695, 0x0496, 0x8696, 0x869B, 0x4807, 0x869C, 0x869C, 0x0FEA,
+ 0x869D, 0x869D, 0x1BFC, 0x869E, 0x86A2, 0x480D, 0x86A3, 0x86A3, 0x1BFE,
+ 0x86A4, 0x86A4, 0x112C, 0x86A5, 0x86A6, 0x4812, 0x86A7, 0x86A7, 0x1BFD,
+ 0x86A8, 0x86A8, 0x1BF8, 0x86A9, 0x86A9, 0x1C01, 0x86AA, 0x86AA, 0x1BFF,
+ 0x86AB, 0x86AB, 0x4814, 0x86AC, 0x86AC, 0x1BFB, 0x86AD, 0x86AE, 0x4815,
+ 0x86AF, 0x86AF, 0x1C09, 0x86B0, 0x86B0, 0x1C06, 0x86B1, 0x86B1, 0x1C08,
+ 0x86B2, 0x86B3, 0x4817, 0x86B4, 0x86B4, 0x1C0C, 0x86B5, 0x86B5, 0x1C04,
+ 0x86B6, 0x86B6, 0x1C02, 0x86B7, 0x86B9, 0x4819, 0x86BA, 0x86BA, 0x1C07,
+ 0x86BB, 0x86BF, 0x481C, 0x86C0, 0x86C0, 0x11FA, 0x86C1, 0x86C3, 0x4821,
+ 0x86C4, 0x86C4, 0x1C03, 0x86C5, 0x86C5, 0x4824, 0x86C6, 0x86C6, 0x0C76,
+ 0x86C7, 0x86C7, 0x0D18, 0x86C8, 0x86C8, 0x4825, 0x86C9, 0x86C9, 0x1C0A,
+ 0x86CA, 0x86CA, 0x071F, 0x86CB, 0x86CB, 0x0591, 0x86CC, 0x86CD, 0x4826,
+ 0x86CE, 0x86CE, 0x1C05, 0x86CF, 0x86CF, 0x1C0B, 0x86D0, 0x86D0, 0x1C12,
+ 0x86D1, 0x86D1, 0x1C18, 0x86D2, 0x86D3, 0x4828, 0x86D4, 0x86D4, 0x07EC,
+ 0x86D5, 0x86D7, 0x482A, 0x86D8, 0x86D8, 0x1C17, 0x86D9, 0x86D9, 0x0E8D,
+ 0x86DA, 0x86DA, 0x482D, 0x86DB, 0x86DB, 0x11EA, 0x86DC, 0x86DD, 0x482E,
+ 0x86DE, 0x86DE, 0x1C14, 0x86DF, 0x86DF, 0x1C16, 0x86E0, 0x86E3, 0x4830,
+ 0x86E4, 0x86E4, 0x06ED, 0x86E5, 0x86E8, 0x4834, 0x86E9, 0x86E9, 0x1C0D,
+ 0x86EA, 0x86EC, 0x4838, 0x86ED, 0x86ED, 0x1C10, 0x86EE, 0x86EE, 0x0AA0,
+ 0x86EF, 0x86EF, 0x483B, 0x86F0, 0x86F0, 0x117E, 0x86F1, 0x86F2, 0x1C0E,
+ 0x86F3, 0x86F3, 0x1C11, 0x86F4, 0x86F4, 0x1C15, 0x86F5, 0x86F7, 0x483C,
+ 0x86F8, 0x86F8, 0x1C1B, 0x86F9, 0x86F9, 0x10A1, 0x86FA, 0x86FA, 0x25DA,
+ 0x86FB, 0x86FD, 0x483F, 0x86FE, 0x86FE, 0x0629, 0x86FF, 0x86FF, 0x4842,
+ 0x8700, 0x8700, 0x0D88, 0x8701, 0x8701, 0x4843, 0x8702, 0x8702, 0x0681,
+ 0x8703, 0x8703, 0x1C19, 0x8704, 0x8705, 0x4844, 0x8706, 0x8706, 0x25D7,
+ 0x8707, 0x8707, 0x1C1A, 0x8708, 0x8708, 0x1C1C, 0x8709, 0x8709, 0x1C1F,
+ 0x870A, 0x870A, 0x1C1D, 0x870B, 0x870C, 0x4846, 0x870D, 0x870D, 0x1C1E,
+ 0x870E, 0x8711, 0x4848, 0x8712, 0x8712, 0x0FFA, 0x8713, 0x8713, 0x1C13,
+ 0x8714, 0x8714, 0x484C, 0x8715, 0x8715, 0x0E7A, 0x8716, 0x8716, 0x484D,
+ 0x8717, 0x8717, 0x0EDE, 0x8718, 0x8718, 0x11A8, 0x8719, 0x8719, 0x484E,
+ 0x871A, 0x871A, 0x1C25, 0x871B, 0x871B, 0x484F, 0x871C, 0x871C, 0x0AE0,
+ 0x871D, 0x871D, 0x4850, 0x871E, 0x871E, 0x1C22, 0x871F, 0x8720, 0x4851,
+ 0x8721, 0x8721, 0x099A, 0x8722, 0x8722, 0x1C2E, 0x8723, 0x8723, 0x1C20,
+ 0x8724, 0x8724, 0x4853, 0x8725, 0x8725, 0x1C23, 0x8726, 0x8728, 0x4854,
+ 0x8729, 0x8729, 0x1C2A, 0x872A, 0x872D, 0x4857, 0x872E, 0x872E, 0x1C24,
+ 0x872F, 0x8730, 0x485B, 0x8731, 0x8731, 0x1C29, 0x8732, 0x8733, 0x485D,
+ 0x8734, 0x8734, 0x1C28, 0x8735, 0x8736, 0x485F, 0x8737, 0x8737, 0x1C2B,
+ 0x8738, 0x873A, 0x4861, 0x873B, 0x873B, 0x1C21, 0x873C, 0x873D, 0x4864,
+ 0x873E, 0x873E, 0x1C26, 0x873F, 0x873F, 0x1C2C, 0x8740, 0x8746, 0x4866,
+ 0x8747, 0x8747, 0x1091, 0x8748, 0x8748, 0x1C27, 0x8749, 0x8749, 0x04BC,
+ 0x874A, 0x874B, 0x486D, 0x874C, 0x874C, 0x1C34, 0x874D, 0x874D, 0x486F,
+ 0x874E, 0x874E, 0x0F76, 0x874F, 0x8752, 0x4870, 0x8753, 0x8753, 0x1C37,
+ 0x8754, 0x8754, 0x4874, 0x8755, 0x8755, 0x212E, 0x8756, 0x8756, 0x4875,
+ 0x8757, 0x8757, 0x07DD, 0x8758, 0x8758, 0x4876, 0x8759, 0x8759, 0x1C3B,
+ 0x875A, 0x875F, 0x4877, 0x8760, 0x8760, 0x1C32, 0x8761, 0x8762, 0x487D,
+ 0x8763, 0x8763, 0x1C38, 0x8764, 0x8764, 0x1C3A, 0x8765, 0x8765, 0x1C3C,
+ 0x8766, 0x8766, 0x21B2, 0x8767, 0x876D, 0x487F, 0x876E, 0x876E, 0x1C35,
+ 0x876F, 0x876F, 0x4886, 0x8770, 0x8770, 0x1C33, 0x8771, 0x8773, 0x4887,
+ 0x8774, 0x8774, 0x07B2, 0x8775, 0x8775, 0x488A, 0x8776, 0x8776, 0x05DC,
+ 0x8777, 0x8777, 0x488B, 0x8778, 0x8778, 0x219E, 0x8779, 0x877A, 0x488C,
+ 0x877B, 0x877B, 0x1C31, 0x877C, 0x877C, 0x1C39, 0x877D, 0x877E, 0x1C2F,
+ 0x877F, 0x8781, 0x488E, 0x8782, 0x8782, 0x1C2D, 0x8783, 0x8783, 0x1C46,
+ 0x8784, 0x8784, 0x25DC, 0x8785, 0x8785, 0x1C43, 0x8786, 0x8787, 0x4891,
+ 0x8788, 0x8788, 0x1C42, 0x8789, 0x878A, 0x4893, 0x878B, 0x878B, 0x1C36,
+ 0x878C, 0x878C, 0x4895, 0x878D, 0x878D, 0x0CB5, 0x878E, 0x8792, 0x4896,
+ 0x8793, 0x8793, 0x1C3D, 0x8794, 0x8796, 0x489B, 0x8797, 0x8797, 0x1C45,
+ 0x8798, 0x879D, 0x489E, 0x879E, 0x879E, 0x206C, 0x879F, 0x879F, 0x0AFD,
+ 0x87A0, 0x87A1, 0x48A4, 0x87A2, 0x87A2, 0x2226, 0x87A3, 0x87A7, 0x48A6,
+ 0x87A8, 0x87A8, 0x1C3F, 0x87A9, 0x87AA, 0x48AB, 0x87AB, 0x87AB, 0x1C47,
+ 0x87AC, 0x87AC, 0x1C49, 0x87AD, 0x87AD, 0x1C44, 0x87AE, 0x87AE, 0x48AD,
+ 0x87AF, 0x87AF, 0x1C3E, 0x87B0, 0x87B2, 0x48AE, 0x87B3, 0x87B3, 0x1C4B,
+ 0x87B4, 0x87B4, 0x48B1, 0x87B5, 0x87B5, 0x1C4A, 0x87B6, 0x87B9, 0x48B2,
+ 0x87BA, 0x87BA, 0x0A84, 0x87BB, 0x87BB, 0x25E0, 0x87BC, 0x87BC, 0x48B6,
+ 0x87BD, 0x87BD, 0x1C4E, 0x87BE, 0x87BF, 0x48B7, 0x87C0, 0x87C0, 0x1C50,
+ 0x87C1, 0x87C3, 0x48B9, 0x87C4, 0x87C4, 0x227B, 0x87C5, 0x87C5, 0x48BC,
+ 0x87C6, 0x87C6, 0x1C41, 0x87C7, 0x87C7, 0x48BD, 0x87C8, 0x87C8, 0x25DE,
+ 0x87C9, 0x87C9, 0x48BE, 0x87CA, 0x87CA, 0x1C51, 0x87CB, 0x87CB, 0x1C4C,
+ 0x87CC, 0x87CD, 0x48BF, 0x87CE, 0x87CE, 0x25E1, 0x87CF, 0x87D0, 0x48C1,
+ 0x87D1, 0x87D1, 0x1C4F, 0x87D2, 0x87D2, 0x1C40, 0x87D3, 0x87D3, 0x1C4D,
+ 0x87D4, 0x87DA, 0x48C3, 0x87DB, 0x87DB, 0x1C52, 0x87DC, 0x87DF, 0x48CA,
+ 0x87E0, 0x87E0, 0x1C54, 0x87E1, 0x87E2, 0x48CE, 0x87E3, 0x87E3, 0x25D5,
+ 0x87E4, 0x87E4, 0x48D0, 0x87E5, 0x87E5, 0x1C48, 0x87E6, 0x87E9, 0x48D1,
+ 0x87EA, 0x87EA, 0x1C53, 0x87EB, 0x87EB, 0x48D5, 0x87EC, 0x87EC, 0x1E6B,
+ 0x87ED, 0x87ED, 0x48D6, 0x87EE, 0x87EE, 0x1C55, 0x87EF, 0x87EF, 0x25DB,
+ 0x87F0, 0x87F1, 0x48D7, 0x87F2, 0x87F2, 0x1E89, 0x87F3, 0x87F5, 0x48D9,
+ 0x87F6, 0x87F6, 0x25D9, 0x87F7, 0x87F8, 0x48DC, 0x87F9, 0x87F9, 0x0F82,
+ 0x87FA, 0x87FA, 0x48DE, 0x87FB, 0x87FB, 0x2211, 0x87FC, 0x87FD, 0x48DF,
+ 0x87FE, 0x87FE, 0x1C58, 0x87FF, 0x87FF, 0x48E1, 0x8800, 0x8802, 0x48E2,
+ 0x8803, 0x8803, 0x130D, 0x8804, 0x8804, 0x48E5, 0x8805, 0x8805, 0x2229,
+ 0x8806, 0x8806, 0x25D6, 0x8807, 0x8809, 0x48E6, 0x880A, 0x880A, 0x1C59,
+ 0x880B, 0x880F, 0x48E9, 0x8810, 0x8810, 0x25DD, 0x8811, 0x8811, 0x25DF,
+ 0x8812, 0x8812, 0x48EE, 0x8813, 0x8813, 0x1C57, 0x8814, 0x8814, 0x48EF,
+ 0x8815, 0x8815, 0x0CBF, 0x8816, 0x8816, 0x1C56, 0x8817, 0x881A, 0x48F0,
+ 0x881B, 0x881B, 0x1C5A, 0x881C, 0x881E, 0x48F4, 0x881F, 0x881F, 0x1FEF,
+ 0x8820, 0x8820, 0x48F7, 0x8821, 0x8821, 0x1C5B, 0x8822, 0x8822, 0x0543,
+ 0x8823, 0x8823, 0x25D8, 0x8824, 0x8830, 0x48F8, 0x8831, 0x8831, 0x1F29,
+ 0x8832, 0x8832, 0x1A8D, 0x8833, 0x8835, 0x4905, 0x8836, 0x8836, 0x1E5B,
+ 0x8837, 0x8838, 0x4908, 0x8839, 0x8839, 0x1C5C, 0x883A, 0x883A, 0x490A,
+ 0x883B, 0x883B, 0x2076, 0x883C, 0x883C, 0x1C5D, 0x883D, 0x883F, 0x490B,
+ 0x8840, 0x8840, 0x0FD3, 0x8841, 0x8843, 0x490E, 0x8844, 0x8844, 0x1CAA,
+ 0x8845, 0x8845, 0x0F91, 0x8846, 0x8846, 0x2297, 0x8847, 0x8849, 0x4911,
+ 0x884A, 0x884A, 0x2690, 0x884B, 0x884B, 0x4914, 0x884C, 0x884C, 0x0F9B,
+ 0x884D, 0x884D, 0x1005, 0x884E, 0x8852, 0x4915, 0x8853, 0x8853, 0x213F,
+ 0x8854, 0x8854, 0x0F3B, 0x8855, 0x8856, 0x491A, 0x8857, 0x8857, 0x08A7,
+ 0x8858, 0x8858, 0x491C, 0x8859, 0x8859, 0x0FEC, 0x885A, 0x885A, 0x491D,
+ 0x885B, 0x885B, 0x2198, 0x885C, 0x885C, 0x491E, 0x885D, 0x885D, 0x1E88,
+ 0x885E, 0x8860, 0x491F, 0x8861, 0x8861, 0x0799, 0x8862, 0x8862, 0x15ED,
+ 0x8863, 0x8863, 0x1049, 0x8864, 0x8864, 0x1BA6, 0x8865, 0x8865, 0x0480,
+ 0x8866, 0x8867, 0x4922, 0x8868, 0x8868, 0x0456, 0x8869, 0x8869, 0x1BA7,
+ 0x886A, 0x886A, 0x4924, 0x886B, 0x886B, 0x0CF9, 0x886C, 0x886C, 0x04E9,
+ 0x886D, 0x886D, 0x4925, 0x886E, 0x886E, 0x1306, 0x886F, 0x886F, 0x4926,
+ 0x8870, 0x8870, 0x0D9A, 0x8871, 0x8871, 0x4927, 0x8872, 0x8872, 0x1BA8,
+ 0x8873, 0x8876, 0x4928, 0x8877, 0x8877, 0x11D3, 0x8878, 0x8878, 0x492C,
+ 0x8879, 0x8879, 0x228C, 0x887A, 0x887C, 0x492D, 0x887D, 0x887D, 0x1BA9,
+ 0x887E, 0x887E, 0x1CBE, 0x887F, 0x887F, 0x1BAA, 0x8880, 0x8880, 0x4930,
+ 0x8881, 0x8881, 0x10EF, 0x8882, 0x8882, 0x1BAB, 0x8883, 0x8883, 0x4931,
+ 0x8884, 0x8884, 0x03CB, 0x8885, 0x8885, 0x1CBF, 0x8886, 0x8887, 0x4932,
+ 0x8888, 0x8888, 0x1CC0, 0x8889, 0x888A, 0x4934, 0x888B, 0x888B, 0x057F,
+ 0x888C, 0x888C, 0x4936, 0x888D, 0x888D, 0x0B9C, 0x888E, 0x8891, 0x4937,
+ 0x8892, 0x8892, 0x0E0E, 0x8893, 0x8895, 0x493B, 0x8896, 0x8896, 0x0FAF,
+ 0x8897, 0x889B, 0x493E, 0x889C, 0x889C, 0x0E91, 0x889D, 0x88A1, 0x4943,
+ 0x88A2, 0x88A2, 0x1BAC, 0x88A3, 0x88A3, 0x4948, 0x88A4, 0x88A4, 0x1307,
+ 0x88A5, 0x88AA, 0x4949, 0x88AB, 0x88AB, 0x0424, 0x88AC, 0x88AC, 0x494F,
+ 0x88AD, 0x88AD, 0x0F1B, 0x88AE, 0x88B0, 0x4950, 0x88B1, 0x88B1, 0x069F,
+ 0x88B2, 0x88B6, 0x4953, 0x88B7, 0x88B7, 0x1BAE, 0x88B8, 0x88BB, 0x4958,
+ 0x88BC, 0x88BC, 0x1BAF, 0x88BD, 0x88C0, 0x495C, 0x88C1, 0x88C1, 0x048A,
+ 0x88C2, 0x88C2, 0x0A1A, 0x88C3, 0x88C4, 0x4960, 0x88C5, 0x88C5, 0x120D,
+ 0x88C6, 0x88C6, 0x1BAD, 0x88C7, 0x88C8, 0x4962, 0x88C9, 0x88C9, 0x1BB0,
+ 0x88CA, 0x88CA, 0x25F1, 0x88CB, 0x88CD, 0x4964, 0x88CE, 0x88CE, 0x1BB2,
+ 0x88CF, 0x88CF, 0x200C, 0x88D0, 0x88D1, 0x4967, 0x88D2, 0x88D2, 0x130A,
+ 0x88D3, 0x88D3, 0x4969, 0x88D4, 0x88D4, 0x1068, 0x88D5, 0x88D5, 0x10E6,
+ 0x88D6, 0x88D7, 0x496A, 0x88D8, 0x88D8, 0x1CC1, 0x88D9, 0x88D9, 0x0C94,
+ 0x88DA, 0x88DB, 0x496C, 0x88DC, 0x88DC, 0x1E58, 0x88DD, 0x88DD, 0x22AC,
+ 0x88DE, 0x88DE, 0x496E, 0x88DF, 0x88DF, 0x1CC2, 0x88E0, 0x88E1, 0x496F,
+ 0x88E2, 0x88E2, 0x1BB1, 0x88E3, 0x88E3, 0x1BB3, 0x88E4, 0x88E4, 0x0970,
+ 0x88E5, 0x88E5, 0x1BB4, 0x88E6, 0x88E7, 0x4971, 0x88E8, 0x88E8, 0x1BB8,
+ 0x88E9, 0x88EF, 0x4973, 0x88F0, 0x88F0, 0x1BBA, 0x88F1, 0x88F1, 0x1BB5,
+ 0x88F2, 0x88F2, 0x497A, 0x88F3, 0x88F3, 0x0D0A, 0x88F4, 0x88F4, 0x0BA2,
+ 0x88F5, 0x88F7, 0x497B, 0x88F8, 0x88F8, 0x0A8A, 0x88F9, 0x88F9, 0x0755,
+ 0x88FA, 0x88FB, 0x497E, 0x88FC, 0x88FC, 0x1BB7, 0x88FD, 0x88FD, 0x26A7,
+ 0x88FE, 0x88FE, 0x1BB9, 0x88FF, 0x88FF, 0x4980, 0x8900, 0x8901, 0x4981,
+ 0x8902, 0x8902, 0x072C, 0x8903, 0x8906, 0x4983, 0x8907, 0x8907, 0x2676,
+ 0x8908, 0x8909, 0x4987, 0x890A, 0x890A, 0x1BBF, 0x890B, 0x890F, 0x4989,
+ 0x8910, 0x8910, 0x078D, 0x8911, 0x8911, 0x498E, 0x8912, 0x8912, 0x0408,
+ 0x8913, 0x8913, 0x1BBD, 0x8914, 0x8918, 0x498F, 0x8919, 0x8919, 0x1BBC,
+ 0x891A, 0x891A, 0x1BB6, 0x891B, 0x891B, 0x1BBE, 0x891C, 0x8920, 0x4994,
+ 0x8921, 0x8921, 0x1BBB, 0x8922, 0x8924, 0x4999, 0x8925, 0x8925, 0x0CC7,
+ 0x8926, 0x8929, 0x499C, 0x892A, 0x892A, 0x0E7B, 0x892B, 0x892B, 0x1BC1,
+ 0x892C, 0x892F, 0x49A0, 0x8930, 0x8930, 0x1739, 0x8931, 0x8931, 0x49A4,
+ 0x8932, 0x8932, 0x1FE1, 0x8933, 0x8933, 0x25BB, 0x8934, 0x8934, 0x1BC0,
+ 0x8935, 0x8935, 0x49A5, 0x8936, 0x8936, 0x1BC2, 0x8937, 0x8937, 0x49A6,
+ 0x8938, 0x8938, 0x25BE, 0x8939, 0x893A, 0x49A7, 0x893B, 0x893B, 0x22DD,
+ 0x893C, 0x8940, 0x49A9, 0x8941, 0x8941, 0x1BC3, 0x8942, 0x8943, 0x49AE,
+ 0x8944, 0x8944, 0x0F52, 0x8945, 0x8946, 0x49B0, 0x8947, 0x8947, 0x25BD,
+ 0x8948, 0x8955, 0x49B2, 0x8956, 0x8956, 0x1E2A, 0x8957, 0x895C, 0x49C0,
+ 0x895D, 0x895D, 0x25BC, 0x895E, 0x895E, 0x1CC3, 0x895F, 0x895F, 0x08C4,
+ 0x8960, 0x8960, 0x25BA, 0x8961, 0x8963, 0x49C6, 0x8964, 0x8964, 0x25BF,
+ 0x8965, 0x8965, 0x49C9, 0x8966, 0x8966, 0x1BC4, 0x8967, 0x8969, 0x49CA,
+ 0x896A, 0x896A, 0x2187, 0x896B, 0x896B, 0x49CD, 0x896C, 0x896C, 0x266B,
+ 0x896D, 0x896E, 0x49CE, 0x896F, 0x896F, 0x1E7F, 0x8970, 0x8971, 0x49D0,
+ 0x8972, 0x8972, 0x21AD, 0x8973, 0x897A, 0x49D2, 0x897B, 0x897B, 0x1BC5,
+ 0x897C, 0x897E, 0x49DA, 0x897F, 0x897F, 0x0F06, 0x8980, 0x8980, 0x49DD,
+ 0x8981, 0x8981, 0x1031, 0x8982, 0x8982, 0x49DE, 0x8983, 0x8983, 0x1BDF,
+ 0x8984, 0x8985, 0x49DF, 0x8986, 0x8986, 0x06AD, 0x8987, 0x898A, 0x49E1,
+ 0x898B, 0x898B, 0x1F96, 0x898C, 0x898E, 0x49E5, 0x898F, 0x898F, 0x1F32,
+ 0x8990, 0x8992, 0x49E8, 0x8993, 0x8993, 0x2084, 0x8994, 0x8995, 0x49EB,
+ 0x8996, 0x8996, 0x2136, 0x8997, 0x8997, 0x49ED, 0x8998, 0x8998, 0x24B8,
+ 0x8999, 0x89A0, 0x49EE, 0x89A1, 0x89A1, 0x24BA, 0x89A2, 0x89A5, 0x49F6,
+ 0x89A6, 0x89A6, 0x24BC, 0x89A7, 0x89A9, 0x49FA, 0x89AA, 0x89AA, 0x20E4,
+ 0x89AB, 0x89AB, 0x49FD, 0x89AC, 0x89AC, 0x24B9, 0x89AD, 0x89AE, 0x49FE,
+ 0x89AF, 0x89AF, 0x24BD, 0x89B0, 0x89B1, 0x4A00, 0x89B2, 0x89B2, 0x24BE,
+ 0x89B3, 0x89B6, 0x4A02, 0x89B7, 0x89B7, 0x24BF, 0x89B8, 0x89B9, 0x4A06,
+ 0x89BA, 0x89BA, 0x1FD2, 0x89BB, 0x89BC, 0x4A08, 0x89BD, 0x89BD, 0x1FFD,
+ 0x89BE, 0x89BE, 0x4A0A, 0x89BF, 0x89BF, 0x24BB, 0x89C0, 0x89C0, 0x1F2D,
+ 0x89C1, 0x89C1, 0x086E, 0x89C2, 0x89C2, 0x0734, 0x89C3, 0x89C3, 0x4A0B,
+ 0x89C4, 0x89C4, 0x073F, 0x89C5, 0x89C5, 0x0ADE, 0x89C6, 0x89C6, 0x0D6A,
+ 0x89C7, 0x89C7, 0x193A, 0x89C8, 0x89C8, 0x09AB, 0x89C9, 0x89C9, 0x0924,
+ 0x89CA, 0x89CC, 0x193B, 0x89CD, 0x89CD, 0x4A0C, 0x89CE, 0x89D1, 0x193E,
+ 0x89D2, 0x89D2, 0x0898, 0x89D3, 0x89D5, 0x4A0D, 0x89D6, 0x89D6, 0x1D57,
+ 0x89D7, 0x89D9, 0x4A10, 0x89DA, 0x89DA, 0x1D59, 0x89DB, 0x89DB, 0x4A13,
+ 0x89DC, 0x89DC, 0x1D5A, 0x89DD, 0x89DD, 0x4A14, 0x89DE, 0x89DE, 0x1D58,
+ 0x89DF, 0x89E2, 0x4A15, 0x89E3, 0x89E3, 0x08B3, 0x89E4, 0x89E4, 0x4A19,
+ 0x89E5, 0x89E5, 0x1D5B, 0x89E6, 0x89E6, 0x0528, 0x89E7, 0x89EA, 0x4A1A,
+ 0x89EB, 0x89EB, 0x1D5C, 0x89EC, 0x89EE, 0x4A1E, 0x89EF, 0x89EF, 0x1D5D,
+ 0x89F0, 0x89F2, 0x4A21, 0x89F3, 0x89F3, 0x19C0, 0x89F4, 0x89F4, 0x2609,
+ 0x89F5, 0x89F5, 0x4A24, 0x89F6, 0x89F6, 0x260A, 0x89F7, 0x89F7, 0x4A25,
+ 0x89F8, 0x89F8, 0x1E94, 0x89F9, 0x89FF, 0x4A26, 0x8A00, 0x8A00, 0x0FFD,
+ 0x8A01, 0x8A01, 0x22DF, 0x8A02, 0x8A02, 0x1ECB, 0x8A03, 0x8A03, 0x1F0D,
+ 0x8A04, 0x8A06, 0x4A2D, 0x8A07, 0x8A07, 0x12FE, 0x8A08, 0x8A08, 0x1F77,
+ 0x8A09, 0x8A09, 0x4A30, 0x8A0A, 0x8A0A, 0x21EB, 0x8A0B, 0x8A0B, 0x4A31,
+ 0x8A0C, 0x8A0C, 0x22E1, 0x8A0D, 0x8A0D, 0x4A32, 0x8A0E, 0x8A0E, 0x216F,
+ 0x8A0F, 0x8A0F, 0x4A33, 0x8A10, 0x8A10, 0x22E0, 0x8A11, 0x8A12, 0x4A34,
+ 0x8A13, 0x8A13, 0x21EA, 0x8A14, 0x8A14, 0x4A36, 0x8A15, 0x8A15, 0x22E2,
+ 0x8A16, 0x8A16, 0x20CB, 0x8A17, 0x8A17, 0x4A37, 0x8A18, 0x8A18, 0x1F78,
+ 0x8A19, 0x8A1A, 0x4A38, 0x8A1B, 0x8A1B, 0x1EE2, 0x8A1C, 0x8A1C, 0x4A3A,
+ 0x8A1D, 0x8A1D, 0x21F2, 0x8A1E, 0x8A1E, 0x4A3B, 0x8A1F, 0x8A1F, 0x2150,
+ 0x8A20, 0x8A22, 0x4A3C, 0x8A23, 0x8A23, 0x1FD3, 0x8A24, 0x8A24, 0x4A3F,
+ 0x8A25, 0x8A25, 0x22E5, 0x8A26, 0x8A29, 0x4A40, 0x8A2A, 0x8A2A, 0x1EF2,
+ 0x8A2B, 0x8A2C, 0x4A44, 0x8A2D, 0x8A2D, 0x211F, 0x8A2E, 0x8A30, 0x4A46,
+ 0x8A31, 0x8A31, 0x21DD, 0x8A32, 0x8A33, 0x4A49, 0x8A34, 0x8A34, 0x2154,
+ 0x8A35, 0x8A35, 0x4A4B, 0x8A36, 0x8A36, 0x22E7, 0x8A37, 0x8A39, 0x4A4C,
+ 0x8A3A, 0x8A3A, 0x2282, 0x8A3B, 0x8A3D, 0x4A4F, 0x8A3E, 0x8A3E, 0x1D5E,
+ 0x8A3F, 0x8A40, 0x4A52, 0x8A41, 0x8A41, 0x22E6, 0x8A42, 0x8A45, 0x4A54,
+ 0x8A46, 0x8A46, 0x22E8, 0x8A47, 0x8A47, 0x4A58, 0x8A48, 0x8A48, 0x1A84,
+ 0x8A49, 0x8A4D, 0x4A59, 0x8A4E, 0x8A4E, 0x22E4, 0x8A4F, 0x8A4F, 0x4A5E,
+ 0x8A50, 0x8A50, 0x226A, 0x8A51, 0x8A51, 0x4A5F, 0x8A52, 0x8A52, 0x22EB,
+ 0x8A53, 0x8A53, 0x4A60, 0x8A54, 0x8A54, 0x22E9, 0x8A55, 0x8A55, 0x20BD,
+ 0x8A56, 0x8A57, 0x4A61, 0x8A58, 0x8A58, 0x22EA, 0x8A59, 0x8A5A, 0x4A63,
+ 0x8A5B, 0x8A5B, 0x22BD, 0x8A5C, 0x8A5D, 0x4A65, 0x8A5E, 0x8A5E, 0x1E9E,
+ 0x8A5F, 0x8A60, 0x4A67, 0x8A61, 0x8A61, 0x22F6, 0x8A62, 0x8A62, 0x21E7,
+ 0x8A63, 0x8A63, 0x2216, 0x8A64, 0x8A65, 0x4A69, 0x8A66, 0x8A66, 0x2137,
+ 0x8A67, 0x8A68, 0x4A6B, 0x8A69, 0x8A69, 0x212C, 0x8A6A, 0x8A6A, 0x4A6D,
+ 0x8A6B, 0x8A6B, 0x1E68, 0x8A6C, 0x8A6C, 0x22F2, 0x8A6D, 0x8A6D, 0x1F37,
+ 0x8A6E, 0x8A6E, 0x22F3, 0x8A6F, 0x8A6F, 0x4A6E, 0x8A70, 0x8A70, 0x22EF,
+ 0x8A71, 0x8A71, 0x1F50, 0x8A72, 0x8A72, 0x1F10, 0x8A73, 0x8A73, 0x21C8,
+ 0x8A74, 0x8A74, 0x4A6F, 0x8A75, 0x8A75, 0x22F1, 0x8A76, 0x8A78, 0x4A70,
+ 0x8A79, 0x8A79, 0x1153, 0x8A7A, 0x8A7B, 0x4A73, 0x8A7C, 0x8A7C, 0x22F0,
+ 0x8A7D, 0x8A7E, 0x4A75, 0x8A7F, 0x8A7F, 0x22EE, 0x8A80, 0x8A83, 0x4A77,
+ 0x8A84, 0x8A84, 0x22ED, 0x8A85, 0x8A85, 0x229E, 0x8A86, 0x8A86, 0x22EC,
+ 0x8A87, 0x8A87, 0x1FE2, 0x8A88, 0x8A88, 0x4A7B, 0x8A89, 0x8A89, 0x10E3,
+ 0x8A8A, 0x8A8A, 0x0E2F, 0x8A8B, 0x8A8C, 0x4A7C, 0x8A8D, 0x8A8D, 0x20FE,
+ 0x8A8E, 0x8A90, 0x4A7E, 0x8A91, 0x8A92, 0x22F9, 0x8A93, 0x8A93, 0x0D5B,
+ 0x8A94, 0x8A94, 0x4A81, 0x8A95, 0x8A95, 0x1EAF, 0x8A96, 0x8A97, 0x4A82,
+ 0x8A98, 0x8A98, 0x2236, 0x8A99, 0x8A99, 0x4A84, 0x8A9A, 0x8A9A, 0x22F7,
+ 0x8A9B, 0x8A9D, 0x4A85, 0x8A9E, 0x8A9E, 0x223D, 0x8A9F, 0x8A9F, 0x4A88,
+ 0x8AA0, 0x8AA0, 0x1E82, 0x8AA1, 0x8AA1, 0x1FB6, 0x8AA2, 0x8AA2, 0x4A89,
+ 0x8AA3, 0x8AA3, 0x21A4, 0x8AA4, 0x8AA4, 0x21AA, 0x8AA5, 0x8AA5, 0x22F8,
+ 0x8AA6, 0x8AA6, 0x2151, 0x8AA7, 0x8AA7, 0x4A8A, 0x8AA8, 0x8AA8, 0x1F60,
+ 0x8AA9, 0x8AAB, 0x4A8B, 0x8AAC, 0x8AAC, 0x2147, 0x8AAD, 0x8AAF, 0x4A8E,
+ 0x8AB0, 0x8AB0, 0x2145, 0x8AB1, 0x8AB1, 0x4A91, 0x8AB2, 0x8AB2, 0x1FDC,
+ 0x8AB3, 0x8AB5, 0x4A92, 0x8AB6, 0x8AB6, 0x2301, 0x8AB7, 0x8AB8, 0x4A95,
+ 0x8AB9, 0x8AB9, 0x1EF5, 0x8ABA, 0x8ABB, 0x4A97, 0x8ABC, 0x8ABC, 0x2218,
+ 0x8ABD, 0x8ABE, 0x4A99, 0x8ABF, 0x8ABF, 0x1EC6, 0x8AC0, 0x8AC1, 0x4A9B,
+ 0x8AC2, 0x8AC2, 0x2300, 0x8AC3, 0x8AC3, 0x4A9D, 0x8AC4, 0x8AC4, 0x22B4,
+ 0x8AC5, 0x8AC6, 0x4A9E, 0x8AC7, 0x8AC7, 0x2169, 0x8AC8, 0x8AC8, 0x4AA0,
+ 0x8AC9, 0x8AC9, 0x22FD, 0x8ACA, 0x8ACA, 0x4AA1, 0x8ACB, 0x8ACB, 0x20EA,
+ 0x8ACC, 0x8ACC, 0x4AA2, 0x8ACD, 0x8ACD, 0x22F4, 0x8ACE, 0x8ACE, 0x4AA3,
+ 0x8ACF, 0x8ACF, 0x22FB, 0x8AD0, 0x8AD0, 0x4AA4, 0x8AD1, 0x8AD1, 0x22FC,
+ 0x8AD2, 0x8AD2, 0x2027, 0x8AD3, 0x8AD5, 0x4AA5, 0x8AD6, 0x8AD6, 0x2060,
+ 0x8AD7, 0x8AD7, 0x22FF, 0x8AD8, 0x8ADA, 0x4AA8, 0x8ADB, 0x8ADB, 0x22FE,
+ 0x8ADC, 0x8ADC, 0x1EC7, 0x8ADD, 0x8ADD, 0x4AAB, 0x8ADE, 0x8ADE, 0x230C,
+ 0x8ADF, 0x8AE1, 0x4AAC, 0x8AE2, 0x8AE2, 0x22F5, 0x8AE3, 0x8AE3, 0x4AAF,
+ 0x8AE4, 0x8AE4, 0x2306, 0x8AE5, 0x8AE5, 0x4AB0, 0x8AE6, 0x8AE6, 0x230A,
+ 0x8AE7, 0x8AE7, 0x21D3, 0x8AE8, 0x8AEA, 0x4AB1, 0x8AEB, 0x8AEB, 0x2303,
+ 0x8AEC, 0x8AEC, 0x4AB4, 0x8AED, 0x8AED, 0x2307, 0x8AEE, 0x8AEE, 0x230B,
+ 0x8AEF, 0x8AF0, 0x4AB5, 0x8AF1, 0x8AF1, 0x1F5F, 0x8AF2, 0x8AF2, 0x4AB7,
+ 0x8AF3, 0x8AF3, 0x2309, 0x8AF4, 0x8AF5, 0x4AB8, 0x8AF6, 0x8AF6, 0x2302,
+ 0x8AF7, 0x8AF7, 0x1F04, 0x8AF8, 0x8AF8, 0x229D, 0x8AF9, 0x8AF9, 0x4ABA,
+ 0x8AFA, 0x8AFA, 0x21FB, 0x8AFB, 0x8AFB, 0x4ABB, 0x8AFC, 0x8AFC, 0x2308,
+ 0x8AFD, 0x8AFD, 0x4ABC, 0x8AFE, 0x8AFE, 0x20AC, 0x8AFF, 0x8AFF, 0x4ABD,
+ 0x8B00, 0x8B00, 0x208E, 0x8B01, 0x8B01, 0x2305, 0x8B02, 0x8B02, 0x2197,
+ 0x8B03, 0x8B03, 0x4ABE, 0x8B04, 0x8B04, 0x2171, 0x8B05, 0x8B05, 0x2298,
+ 0x8B06, 0x8B06, 0x4ABF, 0x8B07, 0x8B07, 0x173C, 0x8B08, 0x8B09, 0x4AC0,
+ 0x8B0A, 0x8B0A, 0x1F57, 0x8B0B, 0x8B0D, 0x4AC2, 0x8B0E, 0x8B0E, 0x2082,
+ 0x8B0F, 0x8B0F, 0x4AC5, 0x8B10, 0x8B10, 0x2311, 0x8B11, 0x8B13, 0x4AC6,
+ 0x8B14, 0x8B14, 0x2304, 0x8B15, 0x8B15, 0x4AC9, 0x8B16, 0x8B16, 0x230F,
+ 0x8B17, 0x8B17, 0x1E35, 0x8B18, 0x8B18, 0x4ACA, 0x8B19, 0x8B19, 0x20D1,
+ 0x8B1A, 0x8B1A, 0x2310, 0x8B1B, 0x8B1B, 0x1FA3, 0x8B1C, 0x8B1C, 0x4ACB,
+ 0x8B1D, 0x8B1D, 0x21D6, 0x8B1E, 0x8B20, 0x4ACC, 0x8B21, 0x8B21, 0x2206,
+ 0x8B22, 0x8B25, 0x4ACF, 0x8B26, 0x8B26, 0x1D5F, 0x8B27, 0x8B27, 0x4AD3,
+ 0x8B28, 0x8B28, 0x230D, 0x8B29, 0x8B2A, 0x4AD4, 0x8B2B, 0x8B2B, 0x2312,
+ 0x8B2C, 0x8B2C, 0x208D, 0x8B2D, 0x8B2D, 0x2313, 0x8B2E, 0x8B32, 0x4AD6,
+ 0x8B33, 0x8B33, 0x22E3, 0x8B34, 0x8B38, 0x4ADB, 0x8B39, 0x8B39, 0x1FBA,
+ 0x8B3A, 0x8B3D, 0x4AE0, 0x8B3E, 0x8B3E, 0x2078, 0x8B3F, 0x8B48, 0x4AE4,
+ 0x8B49, 0x8B49, 0x2288, 0x8B4A, 0x8B4D, 0x4AEE, 0x8B4E, 0x8B4E, 0x2316,
+ 0x8B4F, 0x8B4F, 0x1F6B, 0x8B50, 0x8B55, 0x4AF2, 0x8B56, 0x8B56, 0x2314,
+ 0x8B57, 0x8B57, 0x4AF8, 0x8B58, 0x8B58, 0x2130, 0x8B59, 0x8B59, 0x2315,
+ 0x8B5A, 0x8B5A, 0x2168, 0x8B5B, 0x8B5B, 0x4AF9, 0x8B5C, 0x8B5C, 0x20C4,
+ 0x8B5D, 0x8B65, 0x4AFA, 0x8B66, 0x8B66, 0x08DE, 0x8B67, 0x8B6A, 0x4B03,
+ 0x8B6B, 0x8B6B, 0x2318, 0x8B6C, 0x8B6C, 0x0BC8, 0x8B6D, 0x8B6E, 0x4B07,
+ 0x8B6F, 0x8B6F, 0x2219, 0x8B70, 0x8B70, 0x2217, 0x8B71, 0x8B73, 0x4B09,
+ 0x8B74, 0x8B74, 0x20D5, 0x8B75, 0x8B76, 0x4B0C, 0x8B77, 0x8B77, 0x1F4A,
+ 0x8B78, 0x8B7C, 0x4B0E, 0x8B7D, 0x8B7D, 0x2240, 0x8B7E, 0x8B7F, 0x4B13,
+ 0x8B80, 0x8B80, 0x1ED3, 0x8B81, 0x8B89, 0x4B15, 0x8B8A, 0x8B8A, 0x1E49,
+ 0x8B8B, 0x8B8D, 0x4B1E, 0x8B8E, 0x8B8E, 0x261B, 0x8B8F, 0x8B91, 0x4B21,
+ 0x8B92, 0x8B92, 0x1E6D, 0x8B93, 0x8B93, 0x20F8, 0x8B94, 0x8B94, 0x4B24,
+ 0x8B95, 0x8B95, 0x1FFB, 0x8B96, 0x8B96, 0x2319, 0x8B97, 0x8B9B, 0x4B25,
+ 0x8B9C, 0x8B9C, 0x230E, 0x8B9D, 0x8B9D, 0x4B2A, 0x8B9E, 0x8B9E, 0x2317,
+ 0x8B9F, 0x8B9F, 0x4B2B, 0x8BA0, 0x8BA0, 0x1317, 0x8BA1, 0x8BA1, 0x0839,
+ 0x8BA2, 0x8BA2, 0x05E8, 0x8BA3, 0x8BA3, 0x06B7, 0x8BA4, 0x8BA4, 0x0CAA,
+ 0x8BA5, 0x8BA5, 0x0818, 0x8BA6, 0x8BA7, 0x1318, 0x8BA8, 0x8BA8, 0x0E29,
+ 0x8BA9, 0x8BA9, 0x0C9E, 0x8BAA, 0x8BAA, 0x131A, 0x8BAB, 0x8BAB, 0x0C1C,
+ 0x8BAC, 0x8BAC, 0x4B2C, 0x8BAD, 0x8BAD, 0x0FDE, 0x8BAE, 0x8BAE, 0x1070,
+ 0x8BAF, 0x8BAF, 0x0FDF, 0x8BB0, 0x8BB0, 0x083A, 0x8BB1, 0x8BB1, 0x4B2D,
+ 0x8BB2, 0x8BB2, 0x0883, 0x8BB3, 0x8BB3, 0x07F9, 0x8BB4, 0x8BB5, 0x131B,
+ 0x8BB6, 0x8BB6, 0x0FF1, 0x8BB7, 0x8BB7, 0x131D, 0x8BB8, 0x8BB8, 0x0FB8,
+ 0x8BB9, 0x8BB9, 0x062E, 0x8BBA, 0x8BBA, 0x0A82, 0x8BBB, 0x8BBB, 0x4B2E,
+ 0x8BBC, 0x8BBC, 0x0DC4, 0x8BBD, 0x8BBD, 0x068A, 0x8BBE, 0x8BBE, 0x0D21,
+ 0x8BBF, 0x8BBF, 0x0660, 0x8BC0, 0x8BC0, 0x0926, 0x8BC1, 0x8BC1, 0x11A3,
+ 0x8BC2, 0x8BC3, 0x131E, 0x8BC4, 0x8BC4, 0x0BDF, 0x8BC5, 0x8BC5, 0x1244,
+ 0x8BC6, 0x8BC6, 0x0D4D, 0x8BC7, 0x8BC7, 0x4B2F, 0x8BC8, 0x8BC8, 0x114A,
+ 0x8BC9, 0x8BC9, 0x0DD4, 0x8BCA, 0x8BCA, 0x1190, 0x8BCB, 0x8BCB, 0x1320,
+ 0x8BCC, 0x8BCC, 0x11DE, 0x8BCD, 0x8BCD, 0x054D, 0x8BCE, 0x8BCE, 0x1322,
+ 0x8BCF, 0x8BCF, 0x1321, 0x8BD0, 0x8BD0, 0x4B30, 0x8BD1, 0x8BD1, 0x1072,
+ 0x8BD2, 0x8BD4, 0x1323, 0x8BD5, 0x8BD5, 0x0D6B, 0x8BD6, 0x8BD6, 0x1326,
+ 0x8BD7, 0x8BD7, 0x0D42, 0x8BD8, 0x8BD9, 0x1327, 0x8BDA, 0x8BDA, 0x04F4,
+ 0x8BDB, 0x8BDB, 0x11EE, 0x8BDC, 0x8BDC, 0x1329, 0x8BDD, 0x8BDD, 0x07C5,
+ 0x8BDE, 0x8BDE, 0x058F, 0x8BDF, 0x8BE0, 0x132A, 0x8BE1, 0x8BE1, 0x0747,
+ 0x8BE2, 0x8BE2, 0x0FD8, 0x8BE3, 0x8BE3, 0x106F, 0x8BE4, 0x8BE4, 0x132C,
+ 0x8BE5, 0x8BE5, 0x06BE, 0x8BE6, 0x8BE6, 0x0F57, 0x8BE7, 0x8BE7, 0x04B6,
+ 0x8BE8, 0x8BE9, 0x132D, 0x8BEA, 0x8BEA, 0x4B31, 0x8BEB, 0x8BEB, 0x08BC,
+ 0x8BEC, 0x8BEC, 0x0EEB, 0x8BED, 0x8BED, 0x10D4, 0x8BEE, 0x8BEE, 0x132F,
+ 0x8BEF, 0x8BEF, 0x0F02, 0x8BF0, 0x8BF0, 0x1330, 0x8BF1, 0x8BF1, 0x10BA,
+ 0x8BF2, 0x8BF2, 0x07FA, 0x8BF3, 0x8BF3, 0x1331, 0x8BF4, 0x8BF4, 0x0DAA,
+ 0x8BF5, 0x8BF5, 0x0DC5, 0x8BF6, 0x8BF6, 0x1332, 0x8BF7, 0x8BF7, 0x0C68,
+ 0x8BF8, 0x8BF8, 0x11ED, 0x8BF9, 0x8BF9, 0x1333, 0x8BFA, 0x8BFA, 0x0B76,
+ 0x8BFB, 0x8BFB, 0x0600, 0x8BFC, 0x8BFC, 0x1334, 0x8BFD, 0x8BFD, 0x0669,
+ 0x8BFE, 0x8BFE, 0x095B, 0x8BFF, 0x8BFF, 0x1335, 0x8C00, 0x8C00, 0x1336,
+ 0x8C01, 0x8C01, 0x0DA2, 0x8C02, 0x8C02, 0x1337, 0x8C03, 0x8C03, 0x05D8,
+ 0x8C04, 0x8C04, 0x1338, 0x8C05, 0x8C05, 0x0A0B, 0x8C06, 0x8C06, 0x1218,
+ 0x8C07, 0x8C07, 0x1339, 0x8C08, 0x8C08, 0x0E0B, 0x8C09, 0x8C09, 0x4B32,
+ 0x8C0A, 0x8C0A, 0x1071, 0x8C0B, 0x8C0B, 0x0B14, 0x8C0C, 0x8C0C, 0x133A,
+ 0x8C0D, 0x8C0D, 0x05DE, 0x8C0E, 0x8C0E, 0x07E6, 0x8C0F, 0x8C0F, 0x133B,
+ 0x8C10, 0x8C10, 0x0F7E, 0x8C11, 0x8C12, 0x133C, 0x8C13, 0x8C13, 0x0ECC,
+ 0x8C14, 0x8C16, 0x133E, 0x8C17, 0x8C17, 0x04BE, 0x8C18, 0x8C18, 0x1343,
+ 0x8C19, 0x8C19, 0x1341, 0x8C1A, 0x8C1A, 0x1011, 0x8C1B, 0x8C1B, 0x1342,
+ 0x8C1C, 0x8C1C, 0x0ADA, 0x8C1D, 0x8C1D, 0x1344, 0x8C1E, 0x8C1E, 0x4B33,
+ 0x8C1F, 0x8C21, 0x1345, 0x8C22, 0x8C22, 0x0F86, 0x8C23, 0x8C23, 0x102C,
+ 0x8C24, 0x8C24, 0x0404, 0x8C25, 0x8C25, 0x1348, 0x8C26, 0x8C26, 0x0C28,
+ 0x8C27, 0x8C27, 0x1349, 0x8C28, 0x8C28, 0x08C8, 0x8C29, 0x8C29, 0x0AA6,
+ 0x8C2A, 0x8C2B, 0x134A, 0x8C2C, 0x8C2C, 0x0B02, 0x8C2D, 0x8C2D, 0x0E0A,
+ 0x8C2E, 0x8C2F, 0x134C, 0x8C30, 0x8C30, 0x09A9, 0x8C31, 0x8C31, 0x0BF6,
+ 0x8C32, 0x8C33, 0x134E, 0x8C34, 0x8C34, 0x0C31, 0x8C35, 0x8C36, 0x1350,
+ 0x8C37, 0x8C37, 0x0721, 0x8C38, 0x8C40, 0x4B34, 0x8C41, 0x8C41, 0x0802,
+ 0x8C42, 0x8C45, 0x4B3D, 0x8C46, 0x8C46, 0x05F8, 0x8C47, 0x8C47, 0x1CF6,
+ 0x8C48, 0x8C48, 0x20C8, 0x8C49, 0x8C49, 0x1CF7, 0x8C4A, 0x8C4B, 0x4B41,
+ 0x8C4C, 0x8C4C, 0x0E94, 0x8C4D, 0x8C4F, 0x4B43, 0x8C50, 0x8C50, 0x1EFD,
+ 0x8C51, 0x8C54, 0x4B46, 0x8C55, 0x8C55, 0x1D15, 0x8C56, 0x8C59, 0x4B4A,
+ 0x8C5A, 0x8C5A, 0x1990, 0x8C5B, 0x8C60, 0x4B4E, 0x8C61, 0x8C61, 0x0F60,
+ 0x8C62, 0x8C62, 0x07D4, 0x8C63, 0x8C69, 0x4B54, 0x8C6A, 0x8C6A, 0x0777,
+ 0x8C6B, 0x8C6B, 0x10E8, 0x8C6C, 0x8C72, 0x4B5B, 0x8C73, 0x8C73, 0x15DD,
+ 0x8C74, 0x8C77, 0x4B62, 0x8C78, 0x8C78, 0x1D50, 0x8C79, 0x8C79, 0x0413,
+ 0x8C7A, 0x8C7A, 0x04B9, 0x8C7B, 0x8C81, 0x4B66, 0x8C82, 0x8C82, 0x1D51,
+ 0x8C83, 0x8C84, 0x4B6D, 0x8C85, 0x8C85, 0x1D53, 0x8C86, 0x8C88, 0x4B6F,
+ 0x8C89, 0x8C89, 0x0788, 0x8C8A, 0x8C8A, 0x1D52, 0x8C8B, 0x8C8B, 0x4B72,
+ 0x8C8C, 0x8C8C, 0x0AB7, 0x8C8D, 0x8C93, 0x4B73, 0x8C94, 0x8C94, 0x1D55,
+ 0x8C95, 0x8C97, 0x4B7A, 0x8C98, 0x8C98, 0x1D54, 0x8C99, 0x8C9C, 0x4B7D,
+ 0x8C9D, 0x8C9D, 0x1E3B, 0x8C9E, 0x8C9E, 0x227F, 0x8C9F, 0x8C9F, 0x4B81,
+ 0x8CA0, 0x8CA0, 0x1F0C, 0x8CA1, 0x8CA1, 0x1E59, 0x8CA2, 0x8CA2, 0x1F24,
+ 0x8CA3, 0x8CA6, 0x4B82, 0x8CA7, 0x8CA7, 0x20BA, 0x8CA8, 0x8CA8, 0x1F65,
+ 0x8CA9, 0x8CA9, 0x1EF0, 0x8CAA, 0x8CAA, 0x2164, 0x8CAB, 0x8CAB, 0x1F30,
+ 0x8CAC, 0x8CAC, 0x2261, 0x8CAD, 0x8CAE, 0x4B86, 0x8CAF, 0x8CAF, 0x22A2,
+ 0x8CB0, 0x8CB0, 0x24AB, 0x8CB1, 0x8CB1, 0x4B88, 0x8CB2, 0x8CB2, 0x24AF,
+ 0x8CB3, 0x8CB3, 0x1EE8, 0x8CB4, 0x8CB4, 0x1F39, 0x8CB5, 0x8CB5, 0x4B89,
+ 0x8CB6, 0x8CB6, 0x1E48, 0x8CB7, 0x8CB7, 0x2070, 0x8CB8, 0x8CB8, 0x1EA8,
+ 0x8CB9, 0x8CB9, 0x4B8A, 0x8CBA, 0x8CBA, 0x24AC, 0x8CBB, 0x8CBB, 0x1EF7,
+ 0x8CBC, 0x8CBC, 0x2176, 0x8CBD, 0x8CBD, 0x24AD, 0x8CBE, 0x8CBE, 0x4B8B,
+ 0x8CBF, 0x8CBF, 0x207B, 0x8CC0, 0x8CC0, 0x1F45, 0x8CC1, 0x8CC1, 0x24AA,
+ 0x8CC2, 0x8CC2, 0x204B, 0x8CC3, 0x8CC3, 0x202F, 0x8CC4, 0x8CC4, 0x1F5A,
+ 0x8CC5, 0x8CC5, 0x24B0, 0x8CC6, 0x8CC6, 0x4B8C, 0x8CC7, 0x8CC7, 0x22B7,
+ 0x8CC8, 0x8CC8, 0x1F7F, 0x8CC9, 0x8CC9, 0x4B8D, 0x8CCA, 0x8CCA, 0x2265,
+ 0x8CCB, 0x8CD0, 0x4B8E, 0x8CD1, 0x8CD1, 0x24B2, 0x8CD2, 0x8CD2, 0x211B,
+ 0x8CD3, 0x8CD3, 0x1E51, 0x8CD4, 0x8CD4, 0x4B94, 0x8CD5, 0x8CD5, 0x24B4,
+ 0x8CD6, 0x8CD9, 0x4B95, 0x8CDA, 0x8CDA, 0x24B3, 0x8CDB, 0x8CDB, 0x4B99,
+ 0x8CDC, 0x8CDC, 0x1E9F, 0x8CDD, 0x8CDD, 0x4B9A, 0x8CDE, 0x8CDE, 0x2118,
+ 0x8CDF, 0x8CDF, 0x4B9B, 0x8CE0, 0x8CE0, 0x20B4, 0x8CE1, 0x8CE1, 0x23AF,
+ 0x8CE2, 0x8CE2, 0x21BB, 0x8CE3, 0x8CE3, 0x2072, 0x8CE4, 0x8CE4, 0x1F95,
+ 0x8CE5, 0x8CE5, 0x4B9C, 0x8CE6, 0x8CE6, 0x1F0A, 0x8CE7, 0x8CE7, 0x24B6,
+ 0x8CE8, 0x8CE9, 0x4B9D, 0x8CEA, 0x8CEA, 0x2291, 0x8CEB, 0x8CEB, 0x24B5,
+ 0x8CEC, 0x8CEC, 0x2278, 0x8CED, 0x8CED, 0x1ED4, 0x8CEE, 0x8CF3, 0x4B9F,
+ 0x8CF4, 0x8CF4, 0x1FF3, 0x8CF5, 0x8CF9, 0x4BA5, 0x8CFA, 0x8CFA, 0x22A9,
+ 0x8CFB, 0x8CFB, 0x24B7, 0x8CFC, 0x8CFC, 0x1F28, 0x8CFD, 0x8CFD, 0x2109,
+ 0x8CFE, 0x8CFE, 0x22C7, 0x8CFF, 0x8CFF, 0x4BAA, 0x8D00, 0x8D03, 0x4BAB,
+ 0x8D04, 0x8D04, 0x24AE, 0x8D05, 0x8D05, 0x22B1, 0x8D06, 0x8D07, 0x4BAF,
+ 0x8D08, 0x8D08, 0x2266, 0x8D09, 0x8D09, 0x4BB1, 0x8D0A, 0x8D0A, 0x225B,
+ 0x8D0B, 0x8D0B, 0x22C4, 0x8D0C, 0x8D0C, 0x4BB2, 0x8D0D, 0x8D0D, 0x2115,
+ 0x8D0E, 0x8D0E, 0x4BB3, 0x8D0F, 0x8D0F, 0x222A, 0x8D10, 0x8D10, 0x24B1,
+ 0x8D11, 0x8D15, 0x4BB4, 0x8D16, 0x8D16, 0x213D, 0x8D17, 0x8D1A, 0x4BB9,
+ 0x8D1B, 0x8D1B, 0x1F15, 0x8D1C, 0x8D1C, 0x225C, 0x8D1D, 0x8D1D, 0x041D,
+ 0x8D1E, 0x8D1E, 0x118B, 0x8D1F, 0x8D1F, 0x06B5, 0x8D20, 0x8D20, 0x4BBD,
+ 0x8D21, 0x8D21, 0x070A, 0x8D22, 0x8D22, 0x048D, 0x8D23, 0x8D23, 0x1133,
+ 0x8D24, 0x8D24, 0x0F3A, 0x8D25, 0x8D25, 0x03E7, 0x8D26, 0x8D26, 0x116C,
+ 0x8D27, 0x8D27, 0x080A, 0x8D28, 0x8D28, 0x11C9, 0x8D29, 0x8D29, 0x0654,
+ 0x8D2A, 0x8D2A, 0x0E03, 0x8D2B, 0x8D2B, 0x0BD5, 0x8D2C, 0x8D2C, 0x044A,
+ 0x8D2D, 0x8D2D, 0x0713, 0x8D2E, 0x8D2E, 0x11FB, 0x8D2F, 0x8D2F, 0x073A,
+ 0x8D30, 0x8D30, 0x063E, 0x8D31, 0x8D31, 0x086D, 0x8D32, 0x8D33, 0x192C,
+ 0x8D34, 0x8D34, 0x0E4C, 0x8D35, 0x8D35, 0x074C, 0x8D36, 0x8D36, 0x192E,
+ 0x8D37, 0x8D37, 0x057E, 0x8D38, 0x8D38, 0x0AB8, 0x8D39, 0x8D39, 0x066E,
+ 0x8D3A, 0x8D3A, 0x078F, 0x8D3B, 0x8D3B, 0x192F, 0x8D3C, 0x8D3C, 0x1137,
+ 0x8D3D, 0x8D3D, 0x1930, 0x8D3E, 0x8D3E, 0x0849, 0x8D3F, 0x8D3F, 0x07F4,
+ 0x8D40, 0x8D40, 0x1931, 0x8D41, 0x8D41, 0x0A27, 0x8D42, 0x8D42, 0x0A5F,
+ 0x8D43, 0x8D43, 0x1122, 0x8D44, 0x8D44, 0x1227, 0x8D45, 0x8D46, 0x1932,
+ 0x8D47, 0x8D47, 0x1936, 0x8D48, 0x8D49, 0x1934, 0x8D4A, 0x8D4A, 0x0D17,
+ 0x8D4B, 0x8D4B, 0x06AE, 0x8D4C, 0x8D4C, 0x0603, 0x8D4D, 0x8D4D, 0x1937,
+ 0x8D4E, 0x8D4E, 0x0D81, 0x8D4F, 0x8D4F, 0x0D06, 0x8D50, 0x8D50, 0x0550,
+ 0x8D51, 0x8D52, 0x4BBE, 0x8D53, 0x8D53, 0x163B, 0x8D54, 0x8D54, 0x0BA3,
+ 0x8D55, 0x8D55, 0x1938, 0x8D56, 0x8D56, 0x09A0, 0x8D57, 0x8D57, 0x4BC0,
+ 0x8D58, 0x8D58, 0x1215, 0x8D59, 0x8D59, 0x1939, 0x8D5A, 0x8D5A, 0x1209,
+ 0x8D5B, 0x8D5B, 0x0CD7, 0x8D5C, 0x8D5C, 0x1289, 0x8D5D, 0x8D5D, 0x1283,
+ 0x8D5E, 0x8D5E, 0x1121, 0x8D5F, 0x8D5F, 0x4BC1, 0x8D60, 0x8D60, 0x113C,
+ 0x8D61, 0x8D61, 0x0CFD, 0x8D62, 0x8D62, 0x1093, 0x8D63, 0x8D63, 0x06CE,
+ 0x8D64, 0x8D64, 0x0505, 0x8D65, 0x8D65, 0x4BC2, 0x8D66, 0x8D66, 0x0D1B,
+ 0x8D67, 0x8D67, 0x1CF4, 0x8D68, 0x8D6A, 0x4BC3, 0x8D6B, 0x8D6B, 0x078C,
+ 0x8D6C, 0x8D6C, 0x4BC6, 0x8D6D, 0x8D6D, 0x1CF5, 0x8D6E, 0x8D6F, 0x4BC7,
+ 0x8D70, 0x8D70, 0x123C, 0x8D71, 0x8D72, 0x4BC9, 0x8D73, 0x8D73, 0x1CEF,
+ 0x8D74, 0x8D74, 0x06AB, 0x8D75, 0x8D75, 0x1175, 0x8D76, 0x8D76, 0x06CA,
+ 0x8D77, 0x8D77, 0x0C0F, 0x8D78, 0x8D80, 0x4BCB, 0x8D81, 0x8D81, 0x04E8,
+ 0x8D82, 0x8D83, 0x4BD4, 0x8D84, 0x8D84, 0x1CF0, 0x8D85, 0x8D85, 0x04D1,
+ 0x8D86, 0x8D89, 0x4BD6, 0x8D8A, 0x8D8A, 0x1100, 0x8D8B, 0x8D8B, 0x0C74,
+ 0x8D8C, 0x8D90, 0x4BDA, 0x8D91, 0x8D91, 0x1CF2, 0x8D92, 0x8D93, 0x4BDF,
+ 0x8D94, 0x8D94, 0x1CF1, 0x8D95, 0x8D95, 0x1F14, 0x8D96, 0x8D98, 0x4BE1,
+ 0x8D99, 0x8D99, 0x227A, 0x8D9A, 0x8D9E, 0x4BE4, 0x8D9F, 0x8D9F, 0x0E1E,
+ 0x8DA0, 0x8DA2, 0x4BE9, 0x8DA3, 0x8DA3, 0x0C7F, 0x8DA4, 0x8DA7, 0x4BEC,
+ 0x8DA8, 0x8DA8, 0x20EE, 0x8DA9, 0x8DB0, 0x4BF0, 0x8DB1, 0x8DB1, 0x1CF3,
+ 0x8DB2, 0x8DB2, 0x25F8, 0x8DB3, 0x8DB3, 0x1240, 0x8DB4, 0x8DB4, 0x0B80,
+ 0x8DB5, 0x8DB5, 0x1D1C, 0x8DB6, 0x8DB7, 0x4BF8, 0x8DB8, 0x8DB8, 0x1D17,
+ 0x8DB9, 0x8DB9, 0x4BFA, 0x8DBA, 0x8DBA, 0x1D1F, 0x8DBB, 0x8DBB, 0x4BFB,
+ 0x8DBC, 0x8DBC, 0x1D1E, 0x8DBD, 0x8DBD, 0x4BFC, 0x8DBE, 0x8DBE, 0x11B9,
+ 0x8DBF, 0x8DBF, 0x1D1D, 0x8DC0, 0x8DC2, 0x4BFD, 0x8DC3, 0x8DC3, 0x1101,
+ 0x8DC4, 0x8DC4, 0x1D20, 0x8DC5, 0x8DC5, 0x4C00, 0x8DC6, 0x8DC6, 0x1D28,
+ 0x8DC7, 0x8DCA, 0x4C01, 0x8DCB, 0x8DCB, 0x03DA, 0x8DCC, 0x8DCC, 0x05D9,
+ 0x8DCD, 0x8DCD, 0x4C05, 0x8DCE, 0x8DCF, 0x1D25, 0x8DD0, 0x8DD0, 0x4C06,
+ 0x8DD1, 0x8DD1, 0x0B9D, 0x8DD2, 0x8DD5, 0x4C07, 0x8DD6, 0x8DD7, 0x1D21,
+ 0x8DD8, 0x8DD9, 0x4C0B, 0x8DDA, 0x8DDA, 0x1D23, 0x8DDB, 0x8DDB, 0x1D27,
+ 0x8DDC, 0x8DDC, 0x4C0D, 0x8DDD, 0x8DDD, 0x090F, 0x8DDE, 0x8DDE, 0x1D24,
+ 0x8DDF, 0x8DDF, 0x06F5, 0x8DE0, 0x8DE2, 0x4C0E, 0x8DE3, 0x8DE3, 0x1D2C,
+ 0x8DE4, 0x8DE4, 0x1D2F, 0x8DE5, 0x8DE7, 0x4C11, 0x8DE8, 0x8DE8, 0x0974,
+ 0x8DE9, 0x8DE9, 0x4C14, 0x8DEA, 0x8DEA, 0x074B, 0x8DEB, 0x8DEB, 0x1D18,
+ 0x8DEC, 0x8DEC, 0x1D29, 0x8DED, 0x8DEE, 0x4C15, 0x8DEF, 0x8DEF, 0x0A5E,
+ 0x8DF0, 0x8DF2, 0x4C17, 0x8DF3, 0x8DF3, 0x0E4B, 0x8DF4, 0x8DF4, 0x4C1A,
+ 0x8DF5, 0x8DF5, 0x086C, 0x8DF6, 0x8DF6, 0x4C1B, 0x8DF7, 0x8DF8, 0x1D2A,
+ 0x8DF9, 0x8DF9, 0x1D2D, 0x8DFA, 0x8DFA, 0x0624, 0x8DFB, 0x8DFB, 0x1D2E,
+ 0x8DFC, 0x8DFC, 0x4C1C, 0x8DFD, 0x8DFD, 0x1D31, 0x8DFE, 0x8DFF, 0x4C1D,
+ 0x8E00, 0x8E04, 0x4C1F, 0x8E05, 0x8E05, 0x1D19, 0x8E06, 0x8E08, 0x4C24,
+ 0x8E09, 0x8E09, 0x1D30, 0x8E0A, 0x8E0A, 0x10A0, 0x8E0B, 0x8E0B, 0x4C27,
+ 0x8E0C, 0x8E0C, 0x0511, 0x8E0D, 0x8E0E, 0x4C28, 0x8E0F, 0x8E0F, 0x0DF7,
+ 0x8E10, 0x8E10, 0x1F94, 0x8E11, 0x8E13, 0x4C2A, 0x8E14, 0x8E14, 0x1D32,
+ 0x8E15, 0x8E1C, 0x4C2D, 0x8E1D, 0x8E1D, 0x1D33, 0x8E1E, 0x8E1E, 0x0910,
+ 0x8E1F, 0x8E1F, 0x1D34, 0x8E20, 0x8E21, 0x4C35, 0x8E22, 0x8E22, 0x0E32,
+ 0x8E23, 0x8E23, 0x1D37, 0x8E24, 0x8E28, 0x4C37, 0x8E29, 0x8E29, 0x048F,
+ 0x8E2A, 0x8E2A, 0x1236, 0x8E2B, 0x8E2B, 0x4C3C, 0x8E2C, 0x8E2C, 0x1D35,
+ 0x8E2D, 0x8E2D, 0x4C3D, 0x8E2E, 0x8E2E, 0x1D36, 0x8E2F, 0x8E2F, 0x1D38,
+ 0x8E30, 0x8E30, 0x4C3E, 0x8E31, 0x8E31, 0x1D3E, 0x8E32, 0x8E33, 0x4C3F,
+ 0x8E34, 0x8E34, 0x2230, 0x8E35, 0x8E35, 0x1D3C, 0x8E36, 0x8E38, 0x4C41,
+ 0x8E39, 0x8E39, 0x1D3B, 0x8E3A, 0x8E3A, 0x1D39, 0x8E3B, 0x8E3C, 0x4C44,
+ 0x8E3D, 0x8E3D, 0x1D3D, 0x8E3E, 0x8E3F, 0x4C46, 0x8E40, 0x8E40, 0x1D3A,
+ 0x8E41, 0x8E42, 0x1D40, 0x8E43, 0x8E43, 0x4C48, 0x8E44, 0x8E44, 0x0E36,
+ 0x8E45, 0x8E46, 0x4C49, 0x8E47, 0x8E47, 0x173B, 0x8E48, 0x8E48, 0x0599,
+ 0x8E49, 0x8E49, 0x1D3F, 0x8E4A, 0x8E4A, 0x1D44, 0x8E4B, 0x8E4B, 0x0DF6,
+ 0x8E4C, 0x8E4C, 0x25FD, 0x8E4D, 0x8E50, 0x4C4B, 0x8E51, 0x8E52, 0x1D42,
+ 0x8E53, 0x8E54, 0x4C4F, 0x8E55, 0x8E55, 0x2600, 0x8E56, 0x8E58, 0x4C51,
+ 0x8E59, 0x8E59, 0x1D1A, 0x8E5A, 0x8E62, 0x4C54, 0x8E63, 0x8E63, 0x2606,
+ 0x8E64, 0x8E65, 0x4C5D, 0x8E66, 0x8E66, 0x042D, 0x8E67, 0x8E68, 0x4C5F,
+ 0x8E69, 0x8E69, 0x1D1B, 0x8E6A, 0x8E6B, 0x4C61, 0x8E6C, 0x8E6C, 0x05A6,
+ 0x8E6D, 0x8E6D, 0x04AB, 0x8E6E, 0x8E6E, 0x4C63, 0x8E6F, 0x8E6F, 0x1D48,
+ 0x8E70, 0x8E70, 0x1D45, 0x8E71, 0x8E71, 0x4C64, 0x8E72, 0x8E72, 0x0616,
+ 0x8E73, 0x8E73, 0x4C65, 0x8E74, 0x8E74, 0x1D49, 0x8E75, 0x8E75, 0x4C66,
+ 0x8E76, 0x8E76, 0x1D46, 0x8E77, 0x8E79, 0x4C67, 0x8E7A, 0x8E7A, 0x25FF,
+ 0x8E7B, 0x8E7B, 0x4C6A, 0x8E7C, 0x8E7C, 0x1D47, 0x8E7D, 0x8E7E, 0x4C6B,
+ 0x8E7F, 0x8E7F, 0x055D, 0x8E80, 0x8E80, 0x4C6D, 0x8E81, 0x8E81, 0x112D,
+ 0x8E82, 0x8E84, 0x4C6E, 0x8E85, 0x8E85, 0x1D4A, 0x8E86, 0x8E86, 0x4C71,
+ 0x8E87, 0x8E87, 0x051E, 0x8E88, 0x8E88, 0x4C72, 0x8E89, 0x8E89, 0x25FC,
+ 0x8E8A, 0x8E8A, 0x1E8C, 0x8E8B, 0x8E8B, 0x2602, 0x8E8C, 0x8E8C, 0x4C73,
+ 0x8E8D, 0x8E8D, 0x224D, 0x8E8E, 0x8E8E, 0x4C74, 0x8E8F, 0x8E8F, 0x1D4B,
+ 0x8E90, 0x8E90, 0x1D4D, 0x8E91, 0x8E91, 0x2604, 0x8E92, 0x8E92, 0x25FE,
+ 0x8E93, 0x8E93, 0x2603, 0x8E94, 0x8E94, 0x1D4C, 0x8E95, 0x8E99, 0x4C75,
+ 0x8E9A, 0x8E9A, 0x2601, 0x8E9B, 0x8E9B, 0x4C7A, 0x8E9C, 0x8E9C, 0x1D4E,
+ 0x8E9D, 0x8E9D, 0x4C7B, 0x8E9E, 0x8E9E, 0x1D4F, 0x8E9F, 0x8EA0, 0x4C7C,
+ 0x8EA1, 0x8EA1, 0x2605, 0x8EA2, 0x8EA4, 0x4C7E, 0x8EA5, 0x8EA5, 0x1EA3,
+ 0x8EA6, 0x8EA6, 0x2608, 0x8EA7, 0x8EA9, 0x4C81, 0x8EAA, 0x8EAA, 0x2607,
+ 0x8EAB, 0x8EAB, 0x0D26, 0x8EAC, 0x8EAC, 0x0703, 0x8EAD, 0x8EAE, 0x4C84,
+ 0x8EAF, 0x8EAF, 0x0C78, 0x8EB0, 0x8EB1, 0x4C86, 0x8EB2, 0x8EB2, 0x0622,
+ 0x8EB3, 0x8EB9, 0x4C88, 0x8EBA, 0x8EBA, 0x0E1C, 0x8EBB, 0x8EBF, 0x4C8F,
+ 0x8EC0, 0x8EC0, 0x20F0, 0x8EC1, 0x8EC9, 0x4C94, 0x8ECA, 0x8ECA, 0x1E7B,
+ 0x8ECB, 0x8ECB, 0x2267, 0x8ECC, 0x8ECC, 0x1F36, 0x8ECD, 0x8ECD, 0x1FD6,
+ 0x8ECE, 0x8ECE, 0x18F8, 0x8ECF, 0x8ED1, 0x4C9D, 0x8ED2, 0x8ED2, 0x21E0,
+ 0x8ED3, 0x8ED3, 0x4CA0, 0x8ED4, 0x8ED4, 0x248C, 0x8ED5, 0x8EDA, 0x4CA1,
+ 0x8EDB, 0x8EDB, 0x248D, 0x8EDC, 0x8EDE, 0x4CA7, 0x8EDF, 0x8EDF, 0x2102,
+ 0x8EE0, 0x8EE3, 0x4CAA, 0x8EE4, 0x8EE4, 0x2494, 0x8EE5, 0x8EEA, 0x4CAE,
+ 0x8EEB, 0x8EEB, 0x2493, 0x8EEC, 0x8EF1, 0x4CB4, 0x8EF2, 0x8EF2, 0x248E,
+ 0x8EF3, 0x8EF7, 0x4CBA, 0x8EF8, 0x8EF8, 0x2299, 0x8EF9, 0x8EF9, 0x2491,
+ 0x8EFA, 0x8EFA, 0x2496, 0x8EFB, 0x8EFB, 0x248F, 0x8EFC, 0x8EFC, 0x2492,
+ 0x8EFD, 0x8EFD, 0x4CBF, 0x8EFE, 0x8EFE, 0x2497, 0x8EFF, 0x8EFF, 0x4CC0,
+ 0x8F00, 0x8F02, 0x4CC1, 0x8F03, 0x8F03, 0x1FB1, 0x8F04, 0x8F04, 0x4CC4,
+ 0x8F05, 0x8F05, 0x249A, 0x8F06, 0x8F06, 0x4CC5, 0x8F07, 0x8F07, 0x2499,
+ 0x8F08, 0x8F08, 0x4CC6, 0x8F09, 0x8F09, 0x2258, 0x8F0A, 0x8F0A, 0x2498,
+ 0x8F0B, 0x8F11, 0x4CC7, 0x8F12, 0x8F12, 0x249B, 0x8F13, 0x8F13, 0x4CCE,
+ 0x8F14, 0x8F14, 0x1F09, 0x8F15, 0x8F15, 0x20E6, 0x8F16, 0x8F1A, 0x4CCF,
+ 0x8F1B, 0x8F1B, 0x2026, 0x8F1C, 0x8F1C, 0x249F, 0x8F1D, 0x8F1D, 0x1F59,
+ 0x8F1E, 0x8F1F, 0x249D, 0x8F20, 0x8F24, 0x4CD4, 0x8F25, 0x8F25, 0x1F3B,
+ 0x8F26, 0x8F26, 0x249C, 0x8F27, 0x8F28, 0x4CD9, 0x8F29, 0x8F29, 0x1E3A,
+ 0x8F2A, 0x8F2A, 0x205B, 0x8F2B, 0x8F2E, 0x4CDB, 0x8F2F, 0x8F2F, 0x1F70,
+ 0x8F30, 0x8F32, 0x4CDF, 0x8F33, 0x8F33, 0x24A0, 0x8F34, 0x8F37, 0x4CE2,
+ 0x8F38, 0x8F38, 0x213B, 0x8F39, 0x8F3A, 0x4CE6, 0x8F3B, 0x8F3B, 0x1F07,
+ 0x8F3C, 0x8F3D, 0x4CE8, 0x8F3E, 0x8F3E, 0x2270, 0x8F3F, 0x8F3F, 0x2237,
+ 0x8F40, 0x8F41, 0x4CEA, 0x8F42, 0x8F42, 0x24D2, 0x8F43, 0x8F43, 0x4CEC,
+ 0x8F44, 0x8F44, 0x21B3, 0x8F45, 0x8F45, 0x2245, 0x8F46, 0x8F46, 0x24A1,
+ 0x8F47, 0x8F48, 0x4CED, 0x8F49, 0x8F49, 0x22A8, 0x8F4A, 0x8F4C, 0x4CEF,
+ 0x8F4D, 0x8F4D, 0x227C, 0x8F4E, 0x8F4E, 0x1FB0, 0x8F4F, 0x8F53, 0x4CF2,
+ 0x8F54, 0x8F54, 0x24A2, 0x8F55, 0x8F5E, 0x4CF7, 0x8F5F, 0x8F5F, 0x1F46,
+ 0x8F60, 0x8F60, 0x4D01, 0x8F61, 0x8F61, 0x2380, 0x8F62, 0x8F62, 0x2495,
+ 0x8F63, 0x8F63, 0x4D02, 0x8F64, 0x8F64, 0x2490, 0x8F65, 0x8F65, 0x4D03,
+ 0x8F66, 0x8F66, 0x04DA, 0x8F67, 0x8F67, 0x1141, 0x8F68, 0x8F68, 0x0745,
+ 0x8F69, 0x8F69, 0x0FC4, 0x8F6A, 0x8F6A, 0x4D04, 0x8F6B, 0x8F6B, 0x18E1,
+ 0x8F6C, 0x8F6C, 0x1207, 0x8F6D, 0x8F6D, 0x18E2, 0x8F6E, 0x8F6E, 0x0A7D,
+ 0x8F6F, 0x8F6F, 0x0CC8, 0x8F70, 0x8F70, 0x079B, 0x8F71, 0x8F73, 0x18E3,
+ 0x8F74, 0x8F74, 0x11E0, 0x8F75, 0x8F76, 0x18E6, 0x8F77, 0x8F77, 0x18E9,
+ 0x8F78, 0x8F78, 0x18E8, 0x8F79, 0x8F7A, 0x18EA, 0x8F7B, 0x8F7B, 0x0C5E,
+ 0x8F7C, 0x8F7C, 0x18EC, 0x8F7D, 0x8F7D, 0x111B, 0x8F7E, 0x8F7E, 0x18ED,
+ 0x8F7F, 0x8F7F, 0x089F, 0x8F80, 0x8F80, 0x4D05, 0x8F81, 0x8F82, 0x18EE,
+ 0x8F83, 0x8F83, 0x08A0, 0x8F84, 0x8F84, 0x18F0, 0x8F85, 0x8F85, 0x06A3,
+ 0x8F86, 0x8F86, 0x0A07, 0x8F87, 0x8F87, 0x18F1, 0x8F88, 0x8F88, 0x041B,
+ 0x8F89, 0x8F89, 0x07E9, 0x8F8A, 0x8F8A, 0x074E, 0x8F8B, 0x8F8B, 0x18F2,
+ 0x8F8C, 0x8F8C, 0x4D06, 0x8F8D, 0x8F8F, 0x18F3, 0x8F90, 0x8F90, 0x0695,
+ 0x8F91, 0x8F91, 0x0820, 0x8F92, 0x8F92, 0x4D07, 0x8F93, 0x8F93, 0x0D7B,
+ 0x8F94, 0x8F94, 0x1574, 0x8F95, 0x8F95, 0x10F2, 0x8F96, 0x8F96, 0x0F2A,
+ 0x8F97, 0x8F97, 0x1158, 0x8F98, 0x8F98, 0x18F6, 0x8F99, 0x8F99, 0x117F,
+ 0x8F9A, 0x8F9A, 0x18F7, 0x8F9B, 0x8F9B, 0x0F8C, 0x8F9C, 0x8F9C, 0x0715,
+ 0x8F9D, 0x8F9D, 0x4D08, 0x8F9E, 0x8F9E, 0x054A, 0x8F9F, 0x8F9F, 0x0442,
+ 0x8FA0, 0x8FA2, 0x4D09, 0x8FA3, 0x8FA3, 0x099C, 0x8FA4, 0x8FA5, 0x4D0C,
+ 0x8FA6, 0x8FA6, 0x1E30, 0x8FA7, 0x8FA7, 0x4D0E, 0x8FA8, 0x8FA9, 0x044F,
+ 0x8FAA, 0x8FAA, 0x4D0F, 0x8FAB, 0x8FAB, 0x0451, 0x8FAC, 0x8FAC, 0x4D10,
+ 0x8FAD, 0x8FAD, 0x1E9D, 0x8FAE, 0x8FAE, 0x1E4B, 0x8FAF, 0x8FAF, 0x1E4A,
+ 0x8FB0, 0x8FB0, 0x04E2, 0x8FB1, 0x8FB1, 0x0CC3, 0x8FB2, 0x8FB2, 0x20AA,
+ 0x8FB3, 0x8FB5, 0x4D11, 0x8FB6, 0x8FB6, 0x173D, 0x8FB7, 0x8FB8, 0x4D14,
+ 0x8FB9, 0x8FB9, 0x0448, 0x8FBA, 0x8FBC, 0x4D16, 0x8FBD, 0x8FBD, 0x0A12,
+ 0x8FBE, 0x8FBE, 0x0572, 0x8FBF, 0x8FC0, 0x4D19, 0x8FC1, 0x8FC1, 0x0C25,
+ 0x8FC2, 0x8FC2, 0x10BD, 0x8FC3, 0x8FC3, 0x4D1B, 0x8FC4, 0x8FC4, 0x0C18,
+ 0x8FC5, 0x8FC5, 0x0FE1, 0x8FC6, 0x8FC6, 0x4D1C, 0x8FC7, 0x8FC7, 0x0756,
+ 0x8FC8, 0x8FC8, 0x0A9C, 0x8FC9, 0x8FCD, 0x4D1D, 0x8FCE, 0x8FCE, 0x1092,
+ 0x8FCF, 0x8FCF, 0x4D22, 0x8FD0, 0x8FD0, 0x110E, 0x8FD1, 0x8FD1, 0x08CD,
+ 0x8FD2, 0x8FD2, 0x4D23, 0x8FD3, 0x8FD3, 0x173E, 0x8FD4, 0x8FD4, 0x0652,
+ 0x8FD5, 0x8FD5, 0x173F, 0x8FD6, 0x8FD7, 0x4D24, 0x8FD8, 0x8FD8, 0x07CE,
+ 0x8FD9, 0x8FD9, 0x1183, 0x8FDA, 0x8FDA, 0x4D26, 0x8FDB, 0x8FDB, 0x08C9,
+ 0x8FDC, 0x8FDC, 0x10F9, 0x8FDD, 0x8FDD, 0x0EB4, 0x8FDE, 0x8FDE, 0x09F5,
+ 0x8FDF, 0x8FDF, 0x04FE, 0x8FE0, 0x8FE1, 0x4D27, 0x8FE2, 0x8FE2, 0x0E49,
+ 0x8FE3, 0x8FE3, 0x4D29, 0x8FE4, 0x8FE4, 0x1742, 0x8FE5, 0x8FE5, 0x1740,
+ 0x8FE6, 0x8FE6, 0x1744, 0x8FE7, 0x8FE7, 0x4D2A, 0x8FE8, 0x8FE8, 0x1746,
+ 0x8FE9, 0x8FE9, 0x1743, 0x8FEA, 0x8FEA, 0x05B0, 0x8FEB, 0x8FEB, 0x0BE7,
+ 0x8FEC, 0x8FEC, 0x4D2B, 0x8FED, 0x8FED, 0x05DD, 0x8FEE, 0x8FEE, 0x1741,
+ 0x8FEF, 0x8FEF, 0x4D2C, 0x8FF0, 0x8FF0, 0x0D8D, 0x8FF1, 0x8FF2, 0x4D2D,
+ 0x8FF3, 0x8FF3, 0x1745, 0x8FF4, 0x8FF4, 0x267B, 0x8FF5, 0x8FF6, 0x4D2F,
+ 0x8FF7, 0x8FF7, 0x0AD9, 0x8FF8, 0x8FF8, 0x042E, 0x8FF9, 0x8FF9, 0x0816,
+ 0x8FFA, 0x8FFC, 0x4D31, 0x8FFD, 0x8FFD, 0x1214, 0x8FFE, 0x8FFF, 0x4D34,
+ 0x9000, 0x9000, 0x0E7C, 0x9001, 0x9001, 0x0DC2, 0x9002, 0x9002, 0x0D61,
+ 0x9003, 0x9003, 0x0E26, 0x9004, 0x9004, 0x1748, 0x9005, 0x9005, 0x1747,
+ 0x9006, 0x9006, 0x0B49, 0x9007, 0x9008, 0x4D36, 0x9009, 0x9009, 0x0FCA,
+ 0x900A, 0x900A, 0x0FE0, 0x900B, 0x900B, 0x1749, 0x900C, 0x900C, 0x4D38,
+ 0x900D, 0x900D, 0x174C, 0x900E, 0x900E, 0x4D39, 0x900F, 0x900F, 0x0E69,
+ 0x9010, 0x9010, 0x11EF, 0x9011, 0x9011, 0x174B, 0x9012, 0x9012, 0x05BE,
+ 0x9013, 0x9013, 0x4D3A, 0x9014, 0x9014, 0x0E6F, 0x9015, 0x9015, 0x23F2,
+ 0x9016, 0x9016, 0x174D, 0x9017, 0x9017, 0x05F9, 0x9018, 0x9018, 0x4D3B,
+ 0x9019, 0x9019, 0x227E, 0x901A, 0x901A, 0x0E59, 0x901B, 0x901B, 0x073D,
+ 0x901C, 0x901C, 0x4D3C, 0x901D, 0x901D, 0x0D5C, 0x901E, 0x901E, 0x04F6,
+ 0x901F, 0x901F, 0x0DCE, 0x9020, 0x9020, 0x112F, 0x9021, 0x9021, 0x174E,
+ 0x9022, 0x9022, 0x0687, 0x9023, 0x9023, 0x2019, 0x9024, 0x9025, 0x4D3D,
+ 0x9026, 0x9026, 0x174A, 0x9027, 0x902C, 0x4D3F, 0x902D, 0x902D, 0x1751,
+ 0x902E, 0x902E, 0x0581, 0x902F, 0x902F, 0x1752, 0x9030, 0x9031, 0x4D45,
+ 0x9032, 0x9032, 0x1FBB, 0x9033, 0x9034, 0x4D47, 0x9035, 0x9036, 0x174F,
+ 0x9037, 0x9037, 0x4D49, 0x9038, 0x9038, 0x1064, 0x9039, 0x903A, 0x4D4A,
+ 0x903B, 0x903B, 0x0A86, 0x903C, 0x903C, 0x042F, 0x903D, 0x903D, 0x4D4C,
+ 0x903E, 0x903E, 0x10C7, 0x903F, 0x9040, 0x4D4D, 0x9041, 0x9041, 0x061C,
+ 0x9042, 0x9042, 0x0DE1, 0x9043, 0x9043, 0x4D4F, 0x9044, 0x9044, 0x1753,
+ 0x9045, 0x9046, 0x4D50, 0x9047, 0x9047, 0x10DB, 0x9048, 0x904A, 0x4D52,
+ 0x904B, 0x904B, 0x2253, 0x904C, 0x904C, 0x4D55, 0x904D, 0x904D, 0x0452,
+ 0x904E, 0x904E, 0x1F3E, 0x904F, 0x904F, 0x0633, 0x9050, 0x9050, 0x1756,
+ 0x9051, 0x9052, 0x1754, 0x9053, 0x9053, 0x05A1, 0x9054, 0x9054, 0x1EA6,
+ 0x9055, 0x9055, 0x218E, 0x9056, 0x9056, 0x4D56, 0x9057, 0x9057, 0x104C,
+ 0x9058, 0x9058, 0x1758, 0x9059, 0x905A, 0x4D57, 0x905B, 0x905B, 0x175A,
+ 0x905C, 0x905C, 0x21EC, 0x905D, 0x905D, 0x4D59, 0x905E, 0x905E, 0x1EBE,
+ 0x905F, 0x905F, 0x4D5A, 0x9060, 0x9060, 0x224A, 0x9061, 0x9061, 0x4D5B,
+ 0x9062, 0x9062, 0x1759, 0x9063, 0x9063, 0x0C2F, 0x9064, 0x9064, 0x4D5C,
+ 0x9065, 0x9065, 0x102A, 0x9066, 0x9067, 0x4D5D, 0x9068, 0x9068, 0x1757,
+ 0x9069, 0x9069, 0x2133, 0x906A, 0x906C, 0x4D5F, 0x906D, 0x906D, 0x1125,
+ 0x906E, 0x906E, 0x117B, 0x906F, 0x9071, 0x4D62, 0x9072, 0x9072, 0x1E84,
+ 0x9073, 0x9073, 0x4D65, 0x9074, 0x9074, 0x175C, 0x9075, 0x9075, 0x124E,
+ 0x9076, 0x9076, 0x4D66, 0x9077, 0x9077, 0x20CF, 0x9078, 0x9078, 0x21E2,
+ 0x9079, 0x9079, 0x4D67, 0x907A, 0x907A, 0x220F, 0x907B, 0x907B, 0x4D68,
+ 0x907C, 0x907C, 0x2029, 0x907D, 0x907D, 0x175D, 0x907E, 0x907E, 0x4D69,
+ 0x907F, 0x907F, 0x0445, 0x9080, 0x9080, 0x1024, 0x9081, 0x9081, 0x2073,
+ 0x9082, 0x9082, 0x175E, 0x9083, 0x9083, 0x1760, 0x9084, 0x9084, 0x1F55,
+ 0x9085, 0x9086, 0x4D6A, 0x9087, 0x9087, 0x23F1, 0x9088, 0x9088, 0x175F,
+ 0x9089, 0x9089, 0x4D6C, 0x908A, 0x908A, 0x1E46, 0x908B, 0x908B, 0x1761,
+ 0x908C, 0x908E, 0x4D6D, 0x908F, 0x908F, 0x2063, 0x9090, 0x9090, 0x23F3,
+ 0x9091, 0x9091, 0x105F, 0x9092, 0x9092, 0x4D70, 0x9093, 0x9093, 0x05AC,
+ 0x9094, 0x9094, 0x4D71, 0x9095, 0x9095, 0x1817, 0x9096, 0x9096, 0x4D72,
+ 0x9097, 0x9097, 0x1367, 0x9098, 0x9098, 0x4D73, 0x9099, 0x9099, 0x136A,
+ 0x909A, 0x909A, 0x4D74, 0x909B, 0x909B, 0x1368, 0x909C, 0x909C, 0x4D75,
+ 0x909D, 0x909D, 0x1369, 0x909E, 0x90A0, 0x4D76, 0x90A1, 0x90A1, 0x136C,
+ 0x90A2, 0x90A2, 0x0F9A, 0x90A3, 0x90A3, 0x0B2A, 0x90A4, 0x90A5, 0x4D79,
+ 0x90A6, 0x90A6, 0x03F9, 0x90A7, 0x90A9, 0x4D7B, 0x90AA, 0x90AA, 0x0F7B,
+ 0x90AB, 0x90AB, 0x4D7E, 0x90AC, 0x90AC, 0x136B, 0x90AD, 0x90AD, 0x4D7F,
+ 0x90AE, 0x90AE, 0x10AF, 0x90AF, 0x90AF, 0x0761, 0x90B0, 0x90B0, 0x1372,
+ 0x90B1, 0x90B1, 0x0C6E, 0x90B2, 0x90B2, 0x4D80, 0x90B3, 0x90B3, 0x136E,
+ 0x90B4, 0x90B4, 0x136D, 0x90B5, 0x90B5, 0x0D14, 0x90B6, 0x90B6, 0x136F,
+ 0x90B7, 0x90B7, 0x4D81, 0x90B8, 0x90B8, 0x1371, 0x90B9, 0x90B9, 0x123B,
+ 0x90BA, 0x90BA, 0x1370, 0x90BB, 0x90BB, 0x0A23, 0x90BC, 0x90BD, 0x4D82,
+ 0x90BE, 0x90BE, 0x1375, 0x90BF, 0x90C0, 0x4D84, 0x90C1, 0x90C1, 0x10D9,
+ 0x90C2, 0x90C3, 0x4D86, 0x90C4, 0x90C4, 0x1377, 0x90C5, 0x90C5, 0x1374,
+ 0x90C6, 0x90C6, 0x4D88, 0x90C7, 0x90C7, 0x1378, 0x90C8, 0x90C9, 0x4D89,
+ 0x90CA, 0x90CA, 0x088D, 0x90CB, 0x90CD, 0x4D8B, 0x90CE, 0x90CE, 0x09B4,
+ 0x90CF, 0x90CF, 0x1373, 0x90D0, 0x90D0, 0x1376, 0x90D1, 0x90D1, 0x11A2,
+ 0x90D2, 0x90D2, 0x4D8E, 0x90D3, 0x90D3, 0x1379, 0x90D4, 0x90D6, 0x4D8F,
+ 0x90D7, 0x90D7, 0x137D, 0x90D8, 0x90DA, 0x4D92, 0x90DB, 0x90DB, 0x137E,
+ 0x90DC, 0x90DC, 0x137C, 0x90DD, 0x90DD, 0x0779, 0x90DE, 0x90DE, 0x4D95,
+ 0x90DF, 0x90DF, 0x231E, 0x90E0, 0x90E0, 0x4D96, 0x90E1, 0x90E1, 0x0931,
+ 0x90E2, 0x90E2, 0x137B, 0x90E3, 0x90E5, 0x4D97, 0x90E6, 0x90E6, 0x137A,
+ 0x90E7, 0x90E7, 0x110A, 0x90E8, 0x90E8, 0x0486, 0x90E9, 0x90EA, 0x4D9A,
+ 0x90EB, 0x90EB, 0x137F, 0x90EC, 0x90EC, 0x4D9C, 0x90ED, 0x90ED, 0x0752,
+ 0x90EE, 0x90EE, 0x4D9D, 0x90EF, 0x90EF, 0x1380, 0x90F0, 0x90F3, 0x4D9E,
+ 0x90F4, 0x90F4, 0x04E0, 0x90F5, 0x90F5, 0x2233, 0x90F6, 0x90F7, 0x4DA2,
+ 0x90F8, 0x90F8, 0x0587, 0x90F9, 0x90FC, 0x4DA4, 0x90FD, 0x90FD, 0x05FB,
+ 0x90FE, 0x90FE, 0x1381, 0x90FF, 0x90FF, 0x4DA8, 0x9100, 0x9101, 0x4DA9,
+ 0x9102, 0x9102, 0x0634, 0x9103, 0x9103, 0x4DAB, 0x9104, 0x9104, 0x1382,
+ 0x9105, 0x9105, 0x4DAC, 0x9106, 0x9106, 0x2320, 0x9107, 0x9108, 0x4DAD,
+ 0x9109, 0x9109, 0x21C7, 0x910A, 0x9111, 0x4DAF, 0x9112, 0x9112, 0x22BC,
+ 0x9113, 0x9113, 0x4DB7, 0x9114, 0x9114, 0x231C, 0x9115, 0x9115, 0x4DB8,
+ 0x9116, 0x9116, 0x2251, 0x9117, 0x9118, 0x4DB9, 0x9119, 0x9119, 0x0432,
+ 0x911A, 0x911D, 0x4DBB, 0x911E, 0x911E, 0x1384, 0x911F, 0x9121, 0x4DBF,
+ 0x9122, 0x9122, 0x1383, 0x9123, 0x9123, 0x1385, 0x9124, 0x9126, 0x4DC2,
+ 0x9127, 0x9127, 0x1EBB, 0x9128, 0x912C, 0x4DC5, 0x912D, 0x912D, 0x2287,
+ 0x912E, 0x912E, 0x4DCA, 0x912F, 0x912F, 0x1387, 0x9130, 0x9130, 0x202D,
+ 0x9131, 0x9131, 0x1386, 0x9132, 0x9132, 0x1EAB, 0x9133, 0x9133, 0x4DCB,
+ 0x9134, 0x9134, 0x231D, 0x9135, 0x9135, 0x4DCC, 0x9136, 0x9136, 0x231F,
+ 0x9137, 0x9138, 0x4DCD, 0x9139, 0x9139, 0x1388, 0x913A, 0x913A, 0x231B,
+ 0x913B, 0x9142, 0x4DCF, 0x9143, 0x9143, 0x1389, 0x9144, 0x9145, 0x4DD7,
+ 0x9146, 0x9146, 0x138A, 0x9147, 0x9147, 0x4DD9, 0x9148, 0x9148, 0x2321,
+ 0x9149, 0x9149, 0x10B4, 0x914A, 0x914A, 0x1CF8, 0x914B, 0x914B, 0x0C72,
+ 0x914C, 0x914C, 0x1220, 0x914D, 0x914D, 0x0BA5, 0x914E, 0x914F, 0x1CFA,
+ 0x9150, 0x9150, 0x1CF9, 0x9151, 0x9151, 0x4DDA, 0x9152, 0x9152, 0x08F5,
+ 0x9153, 0x9156, 0x4DDB, 0x9157, 0x9157, 0x0FBA, 0x9158, 0x9159, 0x4DDF,
+ 0x915A, 0x915A, 0x0670, 0x915B, 0x915C, 0x4DE1, 0x915D, 0x915D, 0x1110,
+ 0x915E, 0x915E, 0x0DFD, 0x915F, 0x9160, 0x4DE3, 0x9161, 0x9161, 0x1CFE,
+ 0x9162, 0x9162, 0x1CFD, 0x9163, 0x9163, 0x075F, 0x9164, 0x9164, 0x1CFC,
+ 0x9165, 0x9165, 0x0DCB, 0x9166, 0x9168, 0x4DE5, 0x9169, 0x9169, 0x1D00,
+ 0x916A, 0x916A, 0x09BD, 0x916B, 0x916B, 0x4DE8, 0x916C, 0x916C, 0x050F,
+ 0x916D, 0x916D, 0x4DE9, 0x916E, 0x916E, 0x0E5B, 0x916F, 0x916F, 0x1D01,
+ 0x9170, 0x9170, 0x1CFF, 0x9171, 0x9171, 0x0885, 0x9172, 0x9172, 0x1D04,
+ 0x9173, 0x9173, 0x4DEA, 0x9174, 0x9174, 0x1D05, 0x9175, 0x9175, 0x089E,
+ 0x9176, 0x9176, 0x0ABD, 0x9177, 0x9177, 0x096E, 0x9178, 0x9178, 0x0DD6,
+ 0x9179, 0x9179, 0x1D06, 0x917A, 0x917C, 0x4DEB, 0x917D, 0x917E, 0x1D02,
+ 0x917F, 0x917F, 0x0B53, 0x9180, 0x9184, 0x4DEE, 0x9185, 0x9185, 0x1D08,
+ 0x9186, 0x9186, 0x4DF3, 0x9187, 0x9187, 0x053F, 0x9188, 0x9188, 0x4DF4,
+ 0x9189, 0x9189, 0x124A, 0x918A, 0x918A, 0x4DF5, 0x918B, 0x918B, 0x055A,
+ 0x918C, 0x918C, 0x1D07, 0x918D, 0x918D, 0x1D0A, 0x918E, 0x918F, 0x4DF6,
+ 0x9190, 0x9190, 0x1D09, 0x9191, 0x9191, 0x1D0B, 0x9192, 0x9192, 0x0F9C,
+ 0x9193, 0x9195, 0x4DF8, 0x9196, 0x9196, 0x2255, 0x9197, 0x9199, 0x4DFB,
+ 0x919A, 0x919A, 0x0AD6, 0x919B, 0x919B, 0x0C84, 0x919C, 0x919C, 0x1E8F,
+ 0x919D, 0x91A1, 0x4DFE, 0x91A2, 0x91A3, 0x1D0C, 0x91A4, 0x91A9, 0x4E03,
+ 0x91AA, 0x91AA, 0x1D0E, 0x91AB, 0x91AB, 0x220C, 0x91AC, 0x91AC, 0x1FA4,
+ 0x91AD, 0x91AF, 0x1D0F, 0x91B0, 0x91B3, 0x4E09, 0x91B4, 0x91B4, 0x1D13,
+ 0x91B5, 0x91B5, 0x1D12, 0x91B6, 0x91B9, 0x4E0D, 0x91BA, 0x91BA, 0x1D14,
+ 0x91BB, 0x91BF, 0x4E11, 0x91C0, 0x91C0, 0x209B, 0x91C1, 0x91C1, 0x21D8,
+ 0x91C2, 0x91C2, 0x4E16, 0x91C3, 0x91C3, 0x25FA, 0x91C4, 0x91C4, 0x4E17,
+ 0x91C5, 0x91C5, 0x25F9, 0x91C6, 0x91C6, 0x4E18, 0x91C7, 0x91C7, 0x0490,
+ 0x91C8, 0x91C8, 0x4E19, 0x91C9, 0x91C9, 0x10B9, 0x91CA, 0x91CA, 0x0D64,
+ 0x91CB, 0x91CB, 0x2134, 0x91CC, 0x91CC, 0x09DA, 0x91CD, 0x91CD, 0x11D7,
+ 0x91CE, 0x91CE, 0x1037, 0x91CF, 0x91CF, 0x0A08, 0x91D0, 0x91D0, 0x4E1A,
+ 0x91D1, 0x91D1, 0x08C1, 0x91D2, 0x91D4, 0x24F3, 0x91D5, 0x91D5, 0x24F8,
+ 0x91D6, 0x91D6, 0x4E1B, 0x91D7, 0x91D7, 0x24F7, 0x91D8, 0x91D8, 0x1EC8,
+ 0x91D9, 0x91D9, 0x24F6, 0x91DA, 0x91DB, 0x4E1C, 0x91DC, 0x91DC, 0x06A5,
+ 0x91DD, 0x91DD, 0x2280, 0x91DE, 0x91E2, 0x4E1E, 0x91E3, 0x91E3, 0x1EC5,
+ 0x91E4, 0x91E4, 0x24FB, 0x91E5, 0x91E6, 0x4E23, 0x91E7, 0x91E7, 0x24FA,
+ 0x91E8, 0x91E8, 0x4E25, 0x91E9, 0x91E9, 0x1EED, 0x91EA, 0x91F4, 0x4E26,
+ 0x91F5, 0x91F5, 0x24FD, 0x91F6, 0x91F6, 0x4E31, 0x91F7, 0x91F7, 0x24F9,
+ 0x91F8, 0x91F8, 0x4E32, 0x91F9, 0x91F9, 0x24FE, 0x91FA, 0x91FA, 0x20CD,
+ 0x91FB, 0x91FF, 0x4E33, 0x9200, 0x9200, 0x2508, 0x9201, 0x9201, 0x2504,
+ 0x9202, 0x9203, 0x4E38, 0x9204, 0x9204, 0x2506, 0x9205, 0x9207, 0x4E3A,
+ 0x9208, 0x9208, 0x24FF, 0x9209, 0x9209, 0x2090, 0x920A, 0x920C, 0x4E3D,
+ 0x920D, 0x920D, 0x1EDD, 0x920E, 0x920E, 0x1F25, 0x920F, 0x920F, 0x4E40,
+ 0x9210, 0x9210, 0x2503, 0x9211, 0x9211, 0x2502, 0x9212, 0x9213, 0x4E41,
+ 0x9214, 0x9214, 0x1E7A, 0x9215, 0x9215, 0x20A6, 0x9216, 0x921D, 0x4E43,
+ 0x921E, 0x921E, 0x1FD5, 0x921F, 0x9222, 0x4E4B, 0x9223, 0x9223, 0x1F11,
+ 0x9224, 0x9224, 0x4E4F, 0x9225, 0x9225, 0x2507, 0x9226, 0x9226, 0x2500,
+ 0x9227, 0x9227, 0x2505, 0x9228, 0x922D, 0x4E50, 0x922E, 0x922E, 0x2519,
+ 0x922F, 0x922F, 0x4E56, 0x9230, 0x9230, 0x2515, 0x9231, 0x9232, 0x4E57,
+ 0x9233, 0x9233, 0x250C, 0x9234, 0x9234, 0x2031, 0x9235, 0x9236, 0x4E59,
+ 0x9237, 0x9237, 0x250B, 0x9238, 0x9238, 0x250F, 0x9239, 0x9239, 0x251A,
+ 0x923A, 0x923A, 0x2509, 0x923B, 0x923C, 0x4E5B, 0x923D, 0x923D, 0x250E,
+ 0x923E, 0x923E, 0x2234, 0x923F, 0x923F, 0x2513, 0x9240, 0x9240, 0x1F80,
+ 0x9241, 0x9244, 0x4E5D, 0x9245, 0x9245, 0x2501, 0x9246, 0x9247, 0x4E61,
+ 0x9248, 0x9248, 0x2517, 0x9249, 0x9249, 0x2516, 0x924A, 0x924C, 0x4E63,
+ 0x924D, 0x924D, 0x2518, 0x924E, 0x9250, 0x4E66, 0x9251, 0x9251, 0x1E56,
+ 0x9252, 0x9254, 0x4E69, 0x9255, 0x9255, 0x250D, 0x9256, 0x9256, 0x4E6C,
+ 0x9257, 0x9257, 0x20D3, 0x9258, 0x9259, 0x4E6D, 0x925A, 0x925A, 0x207A,
+ 0x925B, 0x925B, 0x20CE, 0x925C, 0x925D, 0x4E6F, 0x925E, 0x925E, 0x2510,
+ 0x925F, 0x9261, 0x4E71, 0x9262, 0x9262, 0x1E55, 0x9263, 0x9265, 0x4E74,
+ 0x9266, 0x9266, 0x250A, 0x9267, 0x926B, 0x4E77, 0x926C, 0x926D, 0x2511,
+ 0x926E, 0x9273, 0x4E7C, 0x9274, 0x9274, 0x086B, 0x9275, 0x9277, 0x4E82,
+ 0x9278, 0x9278, 0x1FAA, 0x9279, 0x9279, 0x4E85, 0x927A, 0x927A, 0x251E,
+ 0x927B, 0x927B, 0x1F1F, 0x927C, 0x927E, 0x4E86, 0x927F, 0x927F, 0x252D,
+ 0x9280, 0x9280, 0x221D, 0x9281, 0x9282, 0x4E89, 0x9283, 0x9283, 0x2532,
+ 0x9284, 0x9284, 0x4E8B, 0x9285, 0x9285, 0x217B, 0x9286, 0x928D, 0x4E8C,
+ 0x928E, 0x928E, 0x1D80, 0x928F, 0x9290, 0x4E94, 0x9291, 0x9291, 0x21AF,
+ 0x9292, 0x9292, 0x4E96, 0x9293, 0x9293, 0x252C, 0x9294, 0x9295, 0x4E97,
+ 0x9296, 0x9296, 0x2528, 0x9297, 0x9297, 0x4E99, 0x9298, 0x9298, 0x208C,
+ 0x9299, 0x9299, 0x4E9A, 0x929A, 0x929A, 0x252F, 0x929B, 0x929B, 0x4E9B,
+ 0x929C, 0x929C, 0x21BC, 0x929D, 0x929F, 0x4E9C, 0x92A0, 0x92A0, 0x251D,
+ 0x92A1, 0x92A2, 0x4E9F, 0x92A3, 0x92A3, 0x2535, 0x92A4, 0x92A4, 0x4EA1,
+ 0x92A5, 0x92A5, 0x220D, 0x92A6, 0x92A6, 0x2526, 0x92A7, 0x92A7, 0x4EA2,
+ 0x92A8, 0x92A8, 0x2534, 0x92A9, 0x92A9, 0x252A, 0x92AA, 0x92AA, 0x251F,
+ 0x92AB, 0x92AB, 0x2531, 0x92AC, 0x92AC, 0x251C, 0x92AD, 0x92AD, 0x4EA3,
+ 0x92AE, 0x92AE, 0x1D81, 0x92AF, 0x92B0, 0x4EA4, 0x92B1, 0x92B1, 0x2525,
+ 0x92B2, 0x92B6, 0x4EA6, 0x92B7, 0x92B7, 0x21CD, 0x92B8, 0x92B8, 0x4EAB,
+ 0x92B9, 0x92B9, 0x21DA, 0x92BA, 0x92BA, 0x4EAC, 0x92BB, 0x92BB, 0x2172,
+ 0x92BC, 0x92BC, 0x253E, 0x92BD, 0x92C0, 0x4EAD, 0x92C1, 0x92C1, 0x204F,
+ 0x92C2, 0x92C2, 0x4EB1, 0x92C3, 0x92C3, 0x2543, 0x92C4, 0x92C4, 0x4EB2,
+ 0x92C5, 0x92C5, 0x21D7, 0x92C6, 0x92C6, 0x4EB3, 0x92C7, 0x92C7, 0x1E3C,
+ 0x92C8, 0x92C8, 0x1D82, 0x92C9, 0x92CB, 0x4EB4, 0x92CC, 0x92CC, 0x2529,
+ 0x92CD, 0x92CE, 0x4EB7, 0x92CF, 0x92CF, 0x2521, 0x92D0, 0x92D1, 0x4EB9,
+ 0x92D2, 0x92D2, 0x1EFF, 0x92D3, 0x92DC, 0x4EBB, 0x92DD, 0x92DD, 0x253F,
+ 0x92DE, 0x92DE, 0x4EC5, 0x92DF, 0x92DF, 0x2544, 0x92E0, 0x92E2, 0x4EC6,
+ 0x92E3, 0x92E3, 0x2523, 0x92E4, 0x92E4, 0x1E90, 0x92E5, 0x92E5, 0x253A,
+ 0x92E6, 0x92E6, 0x2545, 0x92E7, 0x92E7, 0x4EC9, 0x92E8, 0x92E8, 0x253D,
+ 0x92E9, 0x92E9, 0x4ECA, 0x92EA, 0x92EA, 0x20C1, 0x92EB, 0x92EC, 0x4ECB,
+ 0x92ED, 0x92ED, 0x2103, 0x92EE, 0x92EE, 0x2520, 0x92EF, 0x92EF, 0x253C,
+ 0x92F0, 0x92F0, 0x253B, 0x92F1, 0x92F1, 0x2538, 0x92F2, 0x92F5, 0x4ECD,
+ 0x92F6, 0x92F6, 0x2540, 0x92F7, 0x92F7, 0x4ED1, 0x92F8, 0x92F8, 0x1FCD,
+ 0x92F9, 0x92FB, 0x4ED2, 0x92FC, 0x92FC, 0x1F18, 0x92FD, 0x92FF, 0x4ED5,
+ 0x9300, 0x9300, 0x4ED8, 0x9301, 0x9301, 0x254B, 0x9302, 0x9305, 0x4ED9,
+ 0x9306, 0x9306, 0x2547, 0x9307, 0x9308, 0x254F, 0x9309, 0x930F, 0x4EDD,
+ 0x9310, 0x9310, 0x22B0, 0x9311, 0x9311, 0x4EE4, 0x9312, 0x9312, 0x2546,
+ 0x9313, 0x9314, 0x4EE5, 0x9315, 0x9315, 0x254C, 0x9316, 0x9317, 0x4EE7,
+ 0x9318, 0x9318, 0x1E9A, 0x9319, 0x9319, 0x2552, 0x931A, 0x931A, 0x2530,
+ 0x931B, 0x931B, 0x2549, 0x931C, 0x931E, 0x4EE9, 0x931F, 0x931F, 0x2551,
+ 0x9320, 0x9320, 0x1ECA, 0x9321, 0x9321, 0x4EEC, 0x9322, 0x9322, 0x20D2,
+ 0x9323, 0x9325, 0x4EED, 0x9326, 0x9326, 0x1FB8, 0x9327, 0x9327, 0x4EF0,
+ 0x9328, 0x9328, 0x2079, 0x9329, 0x932A, 0x4EF1, 0x932B, 0x932B, 0x21AB,
+ 0x932C, 0x932D, 0x4EF3, 0x932E, 0x932E, 0x254D, 0x932F, 0x932F, 0x1EA5,
+ 0x9330, 0x9331, 0x4EF5, 0x9332, 0x9332, 0x204C, 0x9333, 0x9333, 0x2080,
+ 0x9334, 0x9335, 0x4EF7, 0x9336, 0x9336, 0x266D, 0x9337, 0x9337, 0x4EF9,
+ 0x9338, 0x9338, 0x2537, 0x9339, 0x933D, 0x4EFA, 0x933E, 0x933E, 0x1D83,
+ 0x933F, 0x933F, 0x4EFF, 0x9340, 0x9340, 0x254A, 0x9341, 0x9341, 0x21B8,
+ 0x9342, 0x9342, 0x4F00, 0x9343, 0x9343, 0x254E, 0x9344, 0x9345, 0x4F01,
+ 0x9346, 0x9346, 0x24FC, 0x9347, 0x9347, 0x2554, 0x9348, 0x934A, 0x4F03,
+ 0x934B, 0x934B, 0x1F3C, 0x934C, 0x934C, 0x4F06, 0x934D, 0x934D, 0x1ED5,
+ 0x934E, 0x9353, 0x4F07, 0x9354, 0x9354, 0x2556, 0x9355, 0x9357, 0x4F0D,
+ 0x9358, 0x9358, 0x2268, 0x9359, 0x935A, 0x4F10, 0x935B, 0x935B, 0x1ED6,
+ 0x935C, 0x9363, 0x4F12, 0x9364, 0x9364, 0x2557, 0x9365, 0x9365, 0x2553,
+ 0x9366, 0x9368, 0x4F1A, 0x9369, 0x9369, 0x2548, 0x936A, 0x936A, 0x1D84,
+ 0x936B, 0x936B, 0x4F1D, 0x936C, 0x936C, 0x20DC, 0x936D, 0x936F, 0x4F1E,
+ 0x9370, 0x9370, 0x2559, 0x9371, 0x9374, 0x4F21, 0x9375, 0x9375, 0x1F97,
+ 0x9376, 0x9376, 0x2555, 0x9377, 0x9379, 0x4F25, 0x937A, 0x937A, 0x227D,
+ 0x937B, 0x937D, 0x4F28, 0x937E, 0x937E, 0x257E, 0x937F, 0x9381, 0x4F2B,
+ 0x9382, 0x9382, 0x207C, 0x9383, 0x9383, 0x4F2E, 0x9384, 0x9384, 0x255A,
+ 0x9385, 0x9386, 0x4F2F, 0x9387, 0x9387, 0x255E, 0x9388, 0x9389, 0x4F31,
+ 0x938A, 0x938A, 0x1E34, 0x938B, 0x938E, 0x4F33, 0x938F, 0x938F, 0x1D86,
+ 0x9390, 0x9395, 0x4F37, 0x9396, 0x9396, 0x215E, 0x9397, 0x9397, 0x4F3D,
+ 0x9398, 0x9398, 0x2560, 0x9399, 0x93A1, 0x4F3E, 0x93A2, 0x93A2, 0x21A2,
+ 0x93A3, 0x93A3, 0x2354, 0x93A4, 0x93A5, 0x4F47, 0x93A6, 0x93A6, 0x2563,
+ 0x93A7, 0x93A7, 0x2527, 0x93A8, 0x93A8, 0x4F49, 0x93A9, 0x93A9, 0x252E,
+ 0x93AA, 0x93AA, 0x2558, 0x93AB, 0x93AB, 0x4F4A, 0x93AC, 0x93AC, 0x1F1B,
+ 0x93AD, 0x93AD, 0x4F4B, 0x93AE, 0x93AE, 0x2283, 0x93AF, 0x93AF, 0x4F4C,
+ 0x93B0, 0x93B0, 0x2564, 0x93B1, 0x93B2, 0x4F4D, 0x93B3, 0x93B3, 0x20A0,
+ 0x93B4, 0x93B4, 0x4F4F, 0x93B5, 0x93B5, 0x2565, 0x93B6, 0x93B7, 0x4F50,
+ 0x93B8, 0x93B8, 0x2561, 0x93B9, 0x93BE, 0x4F52, 0x93BF, 0x93BF, 0x2562,
+ 0x93C0, 0x93C2, 0x4F58, 0x93C3, 0x93C3, 0x256C, 0x93C4, 0x93C6, 0x4F5B,
+ 0x93C7, 0x93C7, 0x256D, 0x93C8, 0x93C8, 0x2020, 0x93C9, 0x93C9, 0x4F5E,
+ 0x93CA, 0x93CA, 0x1D85, 0x93CB, 0x93CB, 0x4F5F, 0x93CC, 0x93CC, 0x255F,
+ 0x93CD, 0x93CD, 0x256A, 0x93CE, 0x93D0, 0x4F60, 0x93D1, 0x93D1, 0x256E,
+ 0x93D2, 0x93D5, 0x4F63, 0x93D6, 0x93D6, 0x1E01, 0x93D7, 0x93D7, 0x2539,
+ 0x93D8, 0x93D8, 0x255C, 0x93D9, 0x93DB, 0x4F67, 0x93DC, 0x93DD, 0x2568,
+ 0x93DE, 0x93DE, 0x256B, 0x93DF, 0x93DF, 0x1E6F, 0x93E0, 0x93E0, 0x4F6A,
+ 0x93E1, 0x93E1, 0x1FC4, 0x93E2, 0x93E2, 0x2567, 0x93E3, 0x93E3, 0x4F6B,
+ 0x93E4, 0x93E4, 0x255B, 0x93E5, 0x93E7, 0x4F6C, 0x93E8, 0x93E8, 0x261D,
+ 0x93E9, 0x93F4, 0x4F6F, 0x93F5, 0x93F5, 0x252B, 0x93F6, 0x93F6, 0x4F7B,
+ 0x93F7, 0x93F7, 0x2571, 0x93F8, 0x93F8, 0x4F7C, 0x93F9, 0x93F9, 0x2577,
+ 0x93FA, 0x93FF, 0x4F7D, 0x9400, 0x9402, 0x4F83, 0x9403, 0x9403, 0x2522,
+ 0x9404, 0x940A, 0x4F86, 0x940B, 0x940B, 0x2533, 0x940C, 0x940F, 0x4F8D,
+ 0x9410, 0x9410, 0x202A, 0x9411, 0x9411, 0x4F91, 0x9412, 0x9412, 0x2536,
+ 0x9413, 0x9413, 0x2573, 0x9414, 0x9414, 0x256F, 0x9415, 0x9417, 0x4F92,
+ 0x9418, 0x9418, 0x2293, 0x9419, 0x9419, 0x2578, 0x941A, 0x941C, 0x4F95,
+ 0x941D, 0x941D, 0x2570, 0x941E, 0x941F, 0x4F98, 0x9420, 0x9420, 0x2575,
+ 0x9421, 0x9425, 0x4F9A, 0x9426, 0x9427, 0x2541, 0x9428, 0x9428, 0x255D,
+ 0x9429, 0x942D, 0x4F9F, 0x942E, 0x942E, 0x201A, 0x942F, 0x9431, 0x4FA4,
+ 0x9432, 0x9432, 0x257A, 0x9433, 0x9433, 0x2006, 0x9434, 0x9434, 0x4FA7,
+ 0x9435, 0x9435, 0x2177, 0x9436, 0x9437, 0x4FA8, 0x9438, 0x9438, 0x251B,
+ 0x9439, 0x9439, 0x4FAA, 0x943A, 0x943A, 0x2524, 0x943B, 0x943D, 0x4FAB,
+ 0x943E, 0x943E, 0x1D87, 0x943F, 0x943F, 0x257B, 0x9440, 0x9443, 0x4FAE,
+ 0x9444, 0x9444, 0x22A3, 0x9445, 0x9449, 0x4FB2, 0x944A, 0x944A, 0x2579,
+ 0x944B, 0x944B, 0x4FB7, 0x944C, 0x944C, 0x2566, 0x944D, 0x9451, 0x4FB8,
+ 0x9452, 0x9452, 0x1F93, 0x9453, 0x9453, 0x4FBD, 0x9454, 0x9454, 0x257C,
+ 0x9455, 0x945F, 0x4FBE, 0x9460, 0x9460, 0x2514, 0x9461, 0x9462, 0x4FC9,
+ 0x9463, 0x9463, 0x257D, 0x9464, 0x9464, 0x4FCB, 0x9465, 0x9465, 0x2572,
+ 0x9466, 0x946A, 0x4FCC, 0x946B, 0x946B, 0x1D88, 0x946C, 0x946C, 0x4FD1,
+ 0x946D, 0x946D, 0x2574, 0x946E, 0x946F, 0x4FD2, 0x9470, 0x9470, 0x224E,
+ 0x9471, 0x9471, 0x4FD4, 0x9472, 0x9472, 0x21C6, 0x9473, 0x9476, 0x4FD5,
+ 0x9477, 0x9477, 0x209F, 0x9478, 0x9478, 0x4FD9, 0x9479, 0x9479, 0x2576,
+ 0x947A, 0x947B, 0x4FDA, 0x947C, 0x947C, 0x2064, 0x947D, 0x947D, 0x22BF,
+ 0x947E, 0x947E, 0x261C, 0x947F, 0x947F, 0x225E, 0x9480, 0x9484, 0x4FDC,
+ 0x9485, 0x9487, 0x1A8E, 0x9488, 0x9488, 0x118C, 0x9489, 0x9489, 0x05E3,
+ 0x948A, 0x948A, 0x1A92, 0x948B, 0x948B, 0x1A91, 0x948C, 0x948D, 0x1A93,
+ 0x948E, 0x948E, 0x0C22, 0x948F, 0x9490, 0x1A95, 0x9491, 0x9491, 0x4FE1,
+ 0x9492, 0x9492, 0x064D, 0x9493, 0x9493, 0x05D7, 0x9494, 0x9494, 0x1A97,
+ 0x9495, 0x9495, 0x1A99, 0x9496, 0x9496, 0x4FE2, 0x9497, 0x9497, 0x1A98,
+ 0x9498, 0x9498, 0x4FE3, 0x9499, 0x9499, 0x06C1, 0x949A, 0x949C, 0x1A9A,
+ 0x949D, 0x949D, 0x061A, 0x949E, 0x949E, 0x04D3, 0x949F, 0x949F, 0x11D2,
+ 0x94A0, 0x94A0, 0x0B29, 0x94A1, 0x94A1, 0x041E, 0x94A2, 0x94A2, 0x06D1,
+ 0x94A3, 0x94A4, 0x1A9D, 0x94A5, 0x94A5, 0x1102, 0x94A6, 0x94A6, 0x0C52,
+ 0x94A7, 0x94A7, 0x092A, 0x94A8, 0x94A8, 0x0EE8, 0x94A9, 0x94A9, 0x070C,
+ 0x94AA, 0x94AA, 0x1AA0, 0x94AB, 0x94AB, 0x1A9F, 0x94AC, 0x94AC, 0x1AA2,
+ 0x94AD, 0x94AD, 0x1AA1, 0x94AE, 0x94AE, 0x0B66, 0x94AF, 0x94B0, 0x1AA3,
+ 0x94B1, 0x94B1, 0x0C2B, 0x94B2, 0x94B2, 0x1AA5, 0x94B3, 0x94B3, 0x0C2C,
+ 0x94B4, 0x94B4, 0x1AA6, 0x94B5, 0x94B5, 0x046E, 0x94B6, 0x94BA, 0x1AA7,
+ 0x94BB, 0x94BB, 0x1247, 0x94BC, 0x94BD, 0x1AAC, 0x94BE, 0x94BE, 0x084B,
+ 0x94BF, 0x94BF, 0x1AAE, 0x94C0, 0x94C0, 0x10B0, 0x94C1, 0x94C1, 0x0E4D,
+ 0x94C2, 0x94C2, 0x0473, 0x94C3, 0x94C3, 0x0A2E, 0x94C4, 0x94C4, 0x1AAF,
+ 0x94C5, 0x94C5, 0x0C23, 0x94C6, 0x94C6, 0x0AB2, 0x94C7, 0x94C7, 0x4FE4,
+ 0x94C8, 0x94CE, 0x1AB0, 0x94CF, 0x94CF, 0x4FE5, 0x94D0, 0x94D2, 0x1AB7,
+ 0x94D3, 0x94D4, 0x4FE6, 0x94D5, 0x94D7, 0x1ABA, 0x94D8, 0x94D8, 0x1ABE,
+ 0x94D9, 0x94D9, 0x1ABD, 0x94DA, 0x94DA, 0x4FE8, 0x94DB, 0x94DB, 0x1ABF,
+ 0x94DC, 0x94DC, 0x0E5E, 0x94DD, 0x94DD, 0x0A68, 0x94DE, 0x94E0, 0x1AC0,
+ 0x94E1, 0x94E1, 0x1142, 0x94E2, 0x94E2, 0x1AC3, 0x94E3, 0x94E3, 0x0F20,
+ 0x94E4, 0x94E5, 0x1AC4, 0x94E6, 0x94E6, 0x4FE9, 0x94E7, 0x94E8, 0x1AC6,
+ 0x94E9, 0x94E9, 0x1AC9, 0x94EA, 0x94EA, 0x1AC8, 0x94EB, 0x94EB, 0x1ACA,
+ 0x94EC, 0x94EC, 0x06F0, 0x94ED, 0x94ED, 0x0AFF, 0x94EE, 0x94EF, 0x1ACB,
+ 0x94F0, 0x94F0, 0x0893, 0x94F1, 0x94F1, 0x1046, 0x94F2, 0x94F2, 0x04C0,
+ 0x94F3, 0x94F5, 0x1ACD, 0x94F6, 0x94F6, 0x107F, 0x94F7, 0x94F7, 0x1AD0,
+ 0x94F8, 0x94F8, 0x11FC, 0x94F9, 0x94F9, 0x1AD1, 0x94FA, 0x94FA, 0x0BEB,
+ 0x94FB, 0x94FB, 0x4FEA, 0x94FC, 0x94FD, 0x1AD2, 0x94FE, 0x94FE, 0x09FD,
+ 0x94FF, 0x94FF, 0x1AD4, 0x9500, 0x9500, 0x0F67, 0x9501, 0x9501, 0x0DED,
+ 0x9502, 0x9502, 0x1AD6, 0x9503, 0x9503, 0x1AD5, 0x9504, 0x9504, 0x051F,
+ 0x9505, 0x9505, 0x0751, 0x9506, 0x9507, 0x1AD7, 0x9508, 0x9508, 0x0FAD,
+ 0x9509, 0x950A, 0x1AD9, 0x950B, 0x950B, 0x0683, 0x950C, 0x950C, 0x0F8A,
+ 0x950D, 0x950F, 0x1ADB, 0x9510, 0x9510, 0x0CCC, 0x9511, 0x9511, 0x0E33,
+ 0x9512, 0x9516, 0x1ADE, 0x9517, 0x9517, 0x1181, 0x9518, 0x9518, 0x1AE3,
+ 0x9519, 0x9519, 0x0570, 0x951A, 0x951A, 0x0AAF, 0x951B, 0x951B, 0x1AE4,
+ 0x951C, 0x951C, 0x4FEB, 0x951D, 0x951F, 0x1AE5, 0x9520, 0x9520, 0x4FEC,
+ 0x9521, 0x9521, 0x0F0C, 0x9522, 0x9522, 0x1AE8, 0x9523, 0x9523, 0x0A87,
+ 0x9524, 0x9524, 0x053B, 0x9525, 0x9525, 0x1213, 0x9526, 0x9526, 0x08C6,
+ 0x9527, 0x9527, 0x4FED, 0x9528, 0x9528, 0x0F34, 0x9529, 0x9529, 0x1AEB,
+ 0x952A, 0x952B, 0x1AE9, 0x952C, 0x952C, 0x1AEC, 0x952D, 0x952D, 0x05E6,
+ 0x952E, 0x952E, 0x086F, 0x952F, 0x952F, 0x0911, 0x9530, 0x9530, 0x0AD1,
+ 0x9531, 0x9532, 0x1AED, 0x9533, 0x9533, 0x4FEE, 0x9534, 0x9534, 0x1AEF,
+ 0x9535, 0x9535, 0x1AF7, 0x9536, 0x9538, 0x1AF0, 0x9539, 0x9539, 0x0C3F,
+ 0x953A, 0x953A, 0x1B19, 0x953B, 0x953B, 0x060C, 0x953C, 0x953C, 0x1AF3,
+ 0x953D, 0x953D, 0x4FEF, 0x953E, 0x953F, 0x1AF4, 0x9540, 0x9540, 0x0605,
+ 0x9541, 0x9541, 0x0AC3, 0x9542, 0x9542, 0x1AF6, 0x9543, 0x9543, 0x4FF0,
+ 0x9544, 0x9546, 0x1AF8, 0x9547, 0x9547, 0x1193, 0x9548, 0x9548, 0x4FF1,
+ 0x9549, 0x9549, 0x1AFB, 0x954A, 0x954A, 0x0B5A, 0x954B, 0x954B, 0x4FF2,
+ 0x954C, 0x954C, 0x1AFC, 0x954D, 0x954D, 0x0B5B, 0x954E, 0x954F, 0x1AFD,
+ 0x9550, 0x9550, 0x06DF, 0x9551, 0x9551, 0x0402, 0x9552, 0x9554, 0x1AFF,
+ 0x9555, 0x9555, 0x4FF3, 0x9556, 0x9559, 0x1B02, 0x955A, 0x955A, 0x4FF4,
+ 0x955B, 0x955B, 0x1B06, 0x955C, 0x955C, 0x08E4, 0x955D, 0x955D, 0x1B09,
+ 0x955E, 0x955F, 0x1B07, 0x9560, 0x9560, 0x4FF5, 0x9561, 0x9562, 0x1B0A,
+ 0x9563, 0x9563, 0x0A16, 0x9564, 0x956C, 0x1B0C, 0x956D, 0x956D, 0x09C3,
+ 0x956E, 0x956E, 0x4FF6, 0x956F, 0x956F, 0x1B15, 0x9570, 0x9570, 0x09F6,
+ 0x9571, 0x9573, 0x1B16, 0x9574, 0x9575, 0x4FF7, 0x9576, 0x9576, 0x0F4F,
+ 0x9577, 0x9577, 0x1E75, 0x9578, 0x957E, 0x4FF9, 0x957F, 0x957F, 0x04C9,
+ 0x9580, 0x9580, 0x207D, 0x9581, 0x9581, 0x5000, 0x9582, 0x9582, 0x23BF,
+ 0x9583, 0x9583, 0x2113, 0x9584, 0x9585, 0x5001, 0x9586, 0x9586, 0x23C0,
+ 0x9587, 0x9588, 0x5003, 0x9589, 0x9589, 0x1E45, 0x958A, 0x958A, 0x5005,
+ 0x958B, 0x958B, 0x1FD8, 0x958C, 0x958C, 0x23C4, 0x958D, 0x958D, 0x5006,
+ 0x958E, 0x958E, 0x23C2, 0x958F, 0x958F, 0x2104, 0x9590, 0x9590, 0x5007,
+ 0x9591, 0x9591, 0x21BD, 0x9592, 0x9592, 0x5008, 0x9593, 0x9593, 0x1F87,
+ 0x9594, 0x9594, 0x23C3, 0x9595, 0x9597, 0x5009, 0x9598, 0x9598, 0x2269,
+ 0x9599, 0x95A0, 0x500C, 0x95A1, 0x95A1, 0x1F43, 0x95A2, 0x95A2, 0x5014,
+ 0x95A3, 0x95A3, 0x1F1E, 0x95A4, 0x95A4, 0x2679, 0x95A5, 0x95A5, 0x1EEB,
+ 0x95A6, 0x95A7, 0x5015, 0x95A8, 0x95A8, 0x1F35, 0x95A9, 0x95A9, 0x208A,
+ 0x95AA, 0x95AA, 0x5017, 0x95AB, 0x95AB, 0x23C7, 0x95AC, 0x95AC, 0x23C9,
+ 0x95AD, 0x95AD, 0x23C6, 0x95AE, 0x95B1, 0x5018, 0x95B2, 0x95B2, 0x224F,
+ 0x95B3, 0x95B5, 0x501C, 0x95B6, 0x95B6, 0x23CB, 0x95B7, 0x95B8, 0x501F,
+ 0x95B9, 0x95B9, 0x21F3, 0x95BA, 0x95BA, 0x5021, 0x95BB, 0x95BB, 0x21F7,
+ 0x95BC, 0x95BC, 0x23CF, 0x95BD, 0x95BD, 0x23CE, 0x95BE, 0x95BE, 0x23CA,
+ 0x95BF, 0x95BF, 0x23CD, 0x95C0, 0x95C2, 0x5022, 0x95C3, 0x95C3, 0x23D0,
+ 0x95C4, 0x95C5, 0x5025, 0x95C6, 0x95C6, 0x266C, 0x95C7, 0x95C7, 0x5027,
+ 0x95C8, 0x95C8, 0x23C1, 0x95C9, 0x95C9, 0x5028, 0x95CA, 0x95CA, 0x1FEE,
+ 0x95CB, 0x95CB, 0x23D1, 0x95CC, 0x95CC, 0x1FF8, 0x95CD, 0x95CF, 0x5029,
+ 0x95D0, 0x95D0, 0x23D3, 0x95D1, 0x95D3, 0x502C, 0x95D4, 0x95D4, 0x23D2,
+ 0x95D5, 0x95D5, 0x23D4, 0x95D6, 0x95D6, 0x1E98, 0x95D7, 0x95DB, 0x502F,
+ 0x95DC, 0x95DC, 0x1F2C, 0x95DD, 0x95DD, 0x5034, 0x95DE, 0x95DE, 0x23D5,
+ 0x95DF, 0x95E0, 0x5035, 0x95E1, 0x95E1, 0x1E71, 0x95E2, 0x95E2, 0x2691,
+ 0x95E3, 0x95E4, 0x5037, 0x95E5, 0x95E5, 0x23C5, 0x95E6, 0x95E7, 0x5039,
+ 0x95E8, 0x95E8, 0x0ACA, 0x95E9, 0x95E9, 0x1685, 0x95EA, 0x95EA, 0x0CFA,
+ 0x95EB, 0x95EB, 0x1686, 0x95EC, 0x95EC, 0x503B, 0x95ED, 0x95ED, 0x043E,
+ 0x95EE, 0x95EE, 0x0ED9, 0x95EF, 0x95EF, 0x0536, 0x95F0, 0x95F0, 0x0CCD,
+ 0x95F1, 0x95F1, 0x1687, 0x95F2, 0x95F2, 0x0F3D, 0x95F3, 0x95F3, 0x1688,
+ 0x95F4, 0x95F4, 0x0857, 0x95F5, 0x95F6, 0x1689, 0x95F7, 0x95F7, 0x0ACB,
+ 0x95F8, 0x95F8, 0x1143, 0x95F9, 0x95F9, 0x0B39, 0x95FA, 0x95FA, 0x0744,
+ 0x95FB, 0x95FB, 0x0ED4, 0x95FC, 0x95FC, 0x168B, 0x95FD, 0x95FD, 0x0AFB,
+ 0x95FE, 0x95FE, 0x168C, 0x95FF, 0x95FF, 0x503C, 0x9600, 0x9600, 0x0644,
+ 0x9601, 0x9601, 0x06EE, 0x9602, 0x9602, 0x0789, 0x9603, 0x9604, 0x168D,
+ 0x9605, 0x9605, 0x1107, 0x9606, 0x9606, 0x168F, 0x9607, 0x9607, 0x503D,
+ 0x9608, 0x9608, 0x1690, 0x9609, 0x9609, 0x0FF4, 0x960A, 0x960D, 0x1691,
+ 0x960E, 0x960E, 0x0FFF, 0x960F, 0x960F, 0x1695, 0x9610, 0x9610, 0x04C2,
+ 0x9611, 0x9611, 0x09A6, 0x9612, 0x9612, 0x1696, 0x9613, 0x9613, 0x503E,
+ 0x9614, 0x9614, 0x0996, 0x9615, 0x9617, 0x1697, 0x9618, 0x9618, 0x503F,
+ 0x9619, 0x961A, 0x169A, 0x961B, 0x961B, 0x5040, 0x961C, 0x961C, 0x06B2,
+ 0x961D, 0x961D, 0x1354, 0x961E, 0x961E, 0x5041, 0x961F, 0x961F, 0x0612,
+ 0x9620, 0x9620, 0x5042, 0x9621, 0x9621, 0x1356, 0x9622, 0x9622, 0x1355,
+ 0x9623, 0x9629, 0x5043, 0x962A, 0x962A, 0x1358, 0x962B, 0x962D, 0x504A,
+ 0x962E, 0x962E, 0x0CC9, 0x962F, 0x9630, 0x504D, 0x9631, 0x9631, 0x1357,
+ 0x9632, 0x9632, 0x065D, 0x9633, 0x9633, 0x101D, 0x9634, 0x9634, 0x107C,
+ 0x9635, 0x9635, 0x1194, 0x9636, 0x9636, 0x08A8, 0x9637, 0x963A, 0x504F,
+ 0x963B, 0x963B, 0x1245, 0x963C, 0x963C, 0x135A, 0x963D, 0x963D, 0x1359,
+ 0x963E, 0x963E, 0x5053, 0x963F, 0x963F, 0x03AD, 0x9640, 0x9640, 0x0E84,
+ 0x9641, 0x9641, 0x5054, 0x9642, 0x9642, 0x135B, 0x9643, 0x9643, 0x5055,
+ 0x9644, 0x9644, 0x06B8, 0x9645, 0x9645, 0x083D, 0x9646, 0x9646, 0x0A64,
+ 0x9647, 0x9647, 0x0A4B, 0x9648, 0x9648, 0x04E7, 0x9649, 0x9649, 0x135C,
+ 0x964A, 0x964A, 0x5056, 0x964B, 0x964B, 0x0A51, 0x964C, 0x964C, 0x0B13,
+ 0x964D, 0x964D, 0x0886, 0x964E, 0x964F, 0x5057, 0x9650, 0x9650, 0x0F4B,
+ 0x9651, 0x9653, 0x5059, 0x9654, 0x9654, 0x135D, 0x9655, 0x9655, 0x0CFB,
+ 0x9656, 0x9657, 0x505C, 0x9658, 0x9658, 0x231A, 0x9659, 0x965A, 0x505E,
+ 0x965B, 0x965B, 0x0446, 0x965C, 0x965C, 0x5060, 0x965D, 0x965D, 0x2114,
+ 0x965E, 0x965E, 0x5061, 0x965F, 0x965F, 0x135E, 0x9660, 0x9660, 0x5062,
+ 0x9661, 0x9661, 0x05F7, 0x9662, 0x9662, 0x10FD, 0x9663, 0x9663, 0x2284,
+ 0x9664, 0x9664, 0x0522, 0x9665, 0x9666, 0x5063, 0x9667, 0x9667, 0x135F,
+ 0x9668, 0x9668, 0x110C, 0x9669, 0x9669, 0x0F42, 0x966A, 0x966A, 0x0BA4,
+ 0x966B, 0x966B, 0x5065, 0x966C, 0x966C, 0x1360, 0x966D, 0x966F, 0x5066,
+ 0x9670, 0x9670, 0x221C, 0x9671, 0x9671, 0x5069, 0x9672, 0x9672, 0x1361,
+ 0x9673, 0x9673, 0x1E7E, 0x9674, 0x9674, 0x1362, 0x9675, 0x9675, 0x0A33,
+ 0x9676, 0x9676, 0x0E28, 0x9677, 0x9677, 0x0F4A, 0x9678, 0x9678, 0x204D,
+ 0x9679, 0x967C, 0x506A, 0x967D, 0x967D, 0x2201, 0x967E, 0x9684, 0x506E,
+ 0x9685, 0x9685, 0x10CC, 0x9686, 0x9686, 0x0A48, 0x9687, 0x9687, 0x5075,
+ 0x9688, 0x9688, 0x1363, 0x9689, 0x9689, 0x5076, 0x968A, 0x968A, 0x1ED9,
+ 0x968B, 0x968B, 0x0DDA, 0x968C, 0x968C, 0x5077, 0x968D, 0x968D, 0x1364,
+ 0x968E, 0x968E, 0x1FB2, 0x968F, 0x968F, 0x0DDB, 0x9690, 0x9690, 0x1085,
+ 0x9691, 0x9693, 0x5078, 0x9694, 0x9694, 0x06EF, 0x9695, 0x9695, 0x2252,
+ 0x9696, 0x9696, 0x507B, 0x9697, 0x9697, 0x1365, 0x9698, 0x9698, 0x03BA,
+ 0x9699, 0x9699, 0x0F23, 0x969A, 0x969A, 0x507C, 0x969B, 0x969B, 0x1F79,
+ 0x969C, 0x969C, 0x1170, 0x969D, 0x96A6, 0x507D, 0x96A7, 0x96A7, 0x0DE2,
+ 0x96A8, 0x96A8, 0x2157, 0x96A9, 0x96A9, 0x5087, 0x96AA, 0x96AA, 0x21BF,
+ 0x96AB, 0x96AF, 0x5088, 0x96B0, 0x96B0, 0x1366, 0x96B1, 0x96B1, 0x221F,
+ 0x96B2, 0x96B2, 0x508D, 0x96B3, 0x96B3, 0x1684, 0x96B4, 0x96B4, 0x203D,
+ 0x96B5, 0x96B5, 0x508E, 0x96B6, 0x96B6, 0x09EE, 0x96B7, 0x96B7, 0x508F,
+ 0x96B8, 0x96B8, 0x2015, 0x96B9, 0x96B9, 0x1D79, 0x96BA, 0x96BA, 0x5090,
+ 0x96BB, 0x96BB, 0x26A5, 0x96BC, 0x96BD, 0x1D7A, 0x96BE, 0x96BE, 0x0B34,
+ 0x96BF, 0x96BF, 0x5091, 0x96C0, 0x96C0, 0x0C93, 0x96C1, 0x96C1, 0x100C,
+ 0x96C2, 0x96C3, 0x5092, 0x96C4, 0x96C4, 0x0FA6, 0x96C5, 0x96C5, 0x0FEE,
+ 0x96C6, 0x96C6, 0x0822, 0x96C7, 0x96C7, 0x0726, 0x96C8, 0x96C8, 0x5094,
+ 0x96C9, 0x96C9, 0x1B1C, 0x96CA, 0x96CB, 0x5095, 0x96CC, 0x96CC, 0x0549,
+ 0x96CD, 0x96CD, 0x109F, 0x96CE, 0x96CE, 0x1D7C, 0x96CF, 0x96CF, 0x0520,
+ 0x96D0, 0x96D1, 0x5097, 0x96D2, 0x96D2, 0x1D7D, 0x96D3, 0x96D4, 0x5099,
+ 0x96D5, 0x96D5, 0x05D2, 0x96D6, 0x96D6, 0x2156, 0x96D7, 0x96D8, 0x509B,
+ 0x96D9, 0x96D9, 0x2144, 0x96DA, 0x96DA, 0x509D, 0x96DB, 0x96DB, 0x1E91,
+ 0x96DC, 0x96DC, 0x2257, 0x96DD, 0x96DF, 0x509E, 0x96E0, 0x96E0, 0x1D7F,
+ 0x96E1, 0x96E1, 0x50A1, 0x96E2, 0x96E2, 0x200A, 0x96E3, 0x96E3, 0x2092,
+ 0x96E4, 0x96E7, 0x50A2, 0x96E8, 0x96E8, 0x10CF, 0x96E9, 0x96E9, 0x1D61,
+ 0x96EA, 0x96EA, 0x0FD2, 0x96EB, 0x96EE, 0x50A6, 0x96EF, 0x96EF, 0x1D63,
+ 0x96F0, 0x96F1, 0x50AA, 0x96F2, 0x96F2, 0x2250, 0x96F3, 0x96F3, 0x1D62,
+ 0x96F4, 0x96F5, 0x50AC, 0x96F6, 0x96F6, 0x0A2C, 0x96F7, 0x96F7, 0x09C2,
+ 0x96F8, 0x96F8, 0x50AE, 0x96F9, 0x96F9, 0x040B, 0x96FA, 0x96FA, 0x50AF,
+ 0x96FB, 0x96FB, 0x1EC3, 0x96FC, 0x96FD, 0x50B0, 0x96FE, 0x96FE, 0x0EFC,
+ 0x96FF, 0x96FF, 0x50B2, 0x9700, 0x9700, 0x0FB3, 0x9701, 0x9701, 0x1D65,
+ 0x9702, 0x9703, 0x50B3, 0x9704, 0x9704, 0x0F63, 0x9705, 0x9705, 0x50B5,
+ 0x9706, 0x9706, 0x1D64, 0x9707, 0x9707, 0x1191, 0x9708, 0x9708, 0x1D66,
+ 0x9709, 0x9709, 0x0ABE, 0x970A, 0x970C, 0x50B6, 0x970D, 0x970D, 0x0809,
+ 0x970E, 0x970E, 0x1D68, 0x970F, 0x970F, 0x1D67, 0x9710, 0x9712, 0x50B9,
+ 0x9713, 0x9713, 0x0B41, 0x9714, 0x9715, 0x50BC, 0x9716, 0x9716, 0x0A21,
+ 0x9717, 0x971B, 0x50BE, 0x971C, 0x971C, 0x0D9F, 0x971D, 0x971D, 0x50C3,
+ 0x971E, 0x971E, 0x0F29, 0x971F, 0x9726, 0x50C4, 0x9727, 0x9727, 0x21A8,
+ 0x9728, 0x9729, 0x50CC, 0x972A, 0x972A, 0x1D69, 0x972B, 0x972C, 0x50CE,
+ 0x972D, 0x972D, 0x1D6A, 0x972E, 0x972F, 0x50D0, 0x9730, 0x9730, 0x1D6B,
+ 0x9731, 0x9731, 0x50D2, 0x9732, 0x9732, 0x0A5D, 0x9733, 0x9737, 0x50D3,
+ 0x9738, 0x9738, 0x03DF, 0x9739, 0x9739, 0x0BBA, 0x973A, 0x973C, 0x50D8,
+ 0x973D, 0x973D, 0x260D, 0x973E, 0x973E, 0x1D6C, 0x973F, 0x9741, 0x50DB,
+ 0x9742, 0x9742, 0x260C, 0x9743, 0x9743, 0x50DE, 0x9744, 0x9744, 0x260E,
+ 0x9745, 0x9747, 0x50DF, 0x9748, 0x9748, 0x2032, 0x9749, 0x9751, 0x50E2,
+ 0x9752, 0x9752, 0x0C5D, 0x9753, 0x9753, 0x1D60, 0x9754, 0x9755, 0x50EB,
+ 0x9756, 0x9756, 0x08E7, 0x9757, 0x9758, 0x50ED, 0x9759, 0x9759, 0x08E1,
+ 0x975A, 0x975A, 0x260B, 0x975B, 0x975B, 0x05C6, 0x975C, 0x975D, 0x50EF,
+ 0x975E, 0x975E, 0x0664, 0x975F, 0x975F, 0x50F1, 0x9760, 0x9760, 0x094C,
+ 0x9761, 0x9761, 0x0AD7, 0x9762, 0x9762, 0x0AEB, 0x9763, 0x9764, 0x50F2,
+ 0x9765, 0x9765, 0x1282, 0x9766, 0x9767, 0x50F4, 0x9768, 0x9768, 0x22C3,
+ 0x9769, 0x9769, 0x06EA, 0x976A, 0x9772, 0x50F6, 0x9773, 0x9773, 0x08CA,
+ 0x9774, 0x9774, 0x0FCE, 0x9775, 0x9775, 0x50FF, 0x9776, 0x9776, 0x03DB,
+ 0x9777, 0x977B, 0x5100, 0x977C, 0x977C, 0x1DC8, 0x977D, 0x9784, 0x5105,
+ 0x9785, 0x9785, 0x1DC9, 0x9786, 0x978A, 0x510D, 0x978B, 0x978B, 0x0F77,
+ 0x978C, 0x978C, 0x5112, 0x978D, 0x978D, 0x03BB, 0x978E, 0x978E, 0x5113,
+ 0x978F, 0x978F, 0x1F23, 0x9790, 0x9790, 0x5114, 0x9791, 0x9792, 0x1DCA,
+ 0x9793, 0x9793, 0x5115, 0x9794, 0x9794, 0x1DCC, 0x9795, 0x9797, 0x5116,
+ 0x9798, 0x9798, 0x0C47, 0x9799, 0x979F, 0x5119, 0x97A0, 0x97A0, 0x08FE,
+ 0x97A1, 0x97A2, 0x5120, 0x97A3, 0x97A3, 0x1DCF, 0x97A4, 0x97A5, 0x5122,
+ 0x97A6, 0x97A6, 0x2695, 0x97A7, 0x97AA, 0x5124, 0x97AB, 0x97AB, 0x1DCE,
+ 0x97AC, 0x97AC, 0x5128, 0x97AD, 0x97AD, 0x0447, 0x97AE, 0x97AE, 0x5129,
+ 0x97AF, 0x97AF, 0x1DCD, 0x97B0, 0x97B1, 0x512A, 0x97B2, 0x97B2, 0x1DD0,
+ 0x97B3, 0x97B3, 0x512C, 0x97B4, 0x97B4, 0x1DD1, 0x97B5, 0x97BC, 0x512D,
+ 0x97BD, 0x97BD, 0x265E, 0x97BE, 0x97C2, 0x5135, 0x97C3, 0x97C3, 0x265D,
+ 0x97C4, 0x97C5, 0x513A, 0x97C6, 0x97C6, 0x2692, 0x97C7, 0x97C8, 0x513C,
+ 0x97C9, 0x97C9, 0x265F, 0x97CA, 0x97CA, 0x513E, 0x97CB, 0x97CB, 0x218D,
+ 0x97CC, 0x97CC, 0x20FD, 0x97CD, 0x97D2, 0x513F, 0x97D3, 0x97D3, 0x1F40,
+ 0x97D4, 0x97D8, 0x5145, 0x97D9, 0x97D9, 0x2465, 0x97DA, 0x97DB, 0x514A,
+ 0x97DC, 0x97DC, 0x2467, 0x97DD, 0x97DD, 0x514C, 0x97DE, 0x97DE, 0x2466,
+ 0x97DF, 0x97E5, 0x514D, 0x97E6, 0x97E6, 0x0EB3, 0x97E7, 0x97E7, 0x0CA8,
+ 0x97E8, 0x97E8, 0x5154, 0x97E9, 0x97E9, 0x0762, 0x97EA, 0x97EC, 0x184E,
+ 0x97ED, 0x97ED, 0x08F1, 0x97EE, 0x97F2, 0x5155, 0x97F3, 0x97F3, 0x107B,
+ 0x97F4, 0x97F4, 0x515A, 0x97F5, 0x97F5, 0x1112, 0x97F6, 0x97F6, 0x0D11,
+ 0x97F7, 0x97FE, 0x515B, 0x97FF, 0x97FF, 0x21C9, 0x9800, 0x9800, 0x5163,
+ 0x9801, 0x9801, 0x2209, 0x9802, 0x9802, 0x1EC9, 0x9803, 0x9803, 0x20E9,
+ 0x9804, 0x9804, 0x5164, 0x9805, 0x9805, 0x21CA, 0x9806, 0x9806, 0x2146,
+ 0x9807, 0x9807, 0x25C5, 0x9808, 0x9808, 0x21DC, 0x9809, 0x9809, 0x5165,
+ 0x980A, 0x980A, 0x245E, 0x980B, 0x980B, 0x5166, 0x980C, 0x980C, 0x214F,
+ 0x980D, 0x980D, 0x5167, 0x980E, 0x980F, 0x25C6, 0x9810, 0x9810, 0x2241,
+ 0x9811, 0x9811, 0x218A, 0x9812, 0x9812, 0x1E2F, 0x9813, 0x9813, 0x1EDC,
+ 0x9814, 0x9816, 0x5168, 0x9817, 0x9817, 0x20BF, 0x9818, 0x9818, 0x2034,
+ 0x9819, 0x981B, 0x516B, 0x981C, 0x981C, 0x25C9, 0x981D, 0x9820, 0x516E,
+ 0x9821, 0x9821, 0x25C8, 0x9822, 0x9823, 0x5172, 0x9824, 0x9824, 0x220E,
+ 0x9825, 0x9825, 0x5174, 0x9826, 0x9826, 0x25CB, 0x9827, 0x982C, 0x5175,
+ 0x982D, 0x982D, 0x217D, 0x982E, 0x982F, 0x517B, 0x9830, 0x9830, 0x1F7E,
+ 0x9831, 0x9836, 0x517D, 0x9837, 0x9837, 0x25CC, 0x9838, 0x9838, 0x1FC3,
+ 0x9839, 0x983A, 0x5183, 0x983B, 0x983B, 0x20B9, 0x983C, 0x983C, 0x5185,
+ 0x983D, 0x983D, 0x2181, 0x983E, 0x9845, 0x5186, 0x9846, 0x9846, 0x1FDA,
+ 0x9847, 0x984B, 0x518E, 0x984C, 0x984C, 0x2173, 0x984D, 0x984D, 0x1EE1,
+ 0x984E, 0x984E, 0x25CD, 0x984F, 0x9852, 0x5193, 0x9853, 0x9853, 0x25CE,
+ 0x9854, 0x9854, 0x21F6, 0x9855, 0x9857, 0x5197, 0x9858, 0x9858, 0x224B,
+ 0x9859, 0x9859, 0x25D1, 0x985A, 0x985A, 0x519A, 0x985B, 0x985B, 0x1EC0,
+ 0x985C, 0x985D, 0x519B, 0x985E, 0x985E, 0x2008, 0x985F, 0x9861, 0x519D,
+ 0x9862, 0x9862, 0x25D0, 0x9863, 0x9864, 0x51A0, 0x9865, 0x9865, 0x25D2,
+ 0x9866, 0x9866, 0x51A2, 0x9867, 0x9867, 0x1F2A, 0x9868, 0x986A, 0x51A3,
+ 0x986B, 0x986B, 0x1E72, 0x986C, 0x986C, 0x25D3, 0x986D, 0x986E, 0x51A6,
+ 0x986F, 0x986F, 0x21BE, 0x9870, 0x9870, 0x25D4, 0x9871, 0x9871, 0x2044,
+ 0x9872, 0x9872, 0x51A8, 0x9873, 0x9873, 0x25CF, 0x9874, 0x9874, 0x20F3,
+ 0x9875, 0x9875, 0x103A, 0x9876, 0x9876, 0x05E4, 0x9877, 0x9877, 0x0C67,
+ 0x9878, 0x9878, 0x1BE0, 0x9879, 0x9879, 0x0F5B, 0x987A, 0x987A, 0x0DA8,
+ 0x987B, 0x987B, 0x0FB6, 0x987C, 0x987C, 0x1827, 0x987D, 0x987D, 0x0E98,
+ 0x987E, 0x987E, 0x0724, 0x987F, 0x987F, 0x0618, 0x9880, 0x9880, 0x1BE1,
+ 0x9881, 0x9881, 0x03EF, 0x9882, 0x9882, 0x0DC1, 0x9883, 0x9883, 0x1BE2,
+ 0x9884, 0x9884, 0x10E7, 0x9885, 0x9885, 0x0A54, 0x9886, 0x9886, 0x0A35,
+ 0x9887, 0x9887, 0x0BE3, 0x9888, 0x9888, 0x08E0, 0x9889, 0x9889, 0x1BE3,
+ 0x988A, 0x988A, 0x0848, 0x988B, 0x988B, 0x51A9, 0x988C, 0x988D, 0x1BE4,
+ 0x988E, 0x988E, 0x51AA, 0x988F, 0x988F, 0x1BE6, 0x9890, 0x9890, 0x104A,
+ 0x9891, 0x9891, 0x0BD4, 0x9892, 0x9892, 0x51AB, 0x9893, 0x9893, 0x0E78,
+ 0x9894, 0x9894, 0x1BE7, 0x9895, 0x9895, 0x51AC, 0x9896, 0x9896, 0x1096,
+ 0x9897, 0x9897, 0x0952, 0x9898, 0x9898, 0x0E35, 0x9899, 0x9899, 0x51AD,
+ 0x989A, 0x989B, 0x1BE8, 0x989C, 0x989C, 0x0FFE, 0x989D, 0x989D, 0x062D,
+ 0x989E, 0x989F, 0x1BEA, 0x98A0, 0x98A0, 0x05C0, 0x98A1, 0x98A2, 0x1BEC,
+ 0x98A3, 0x98A3, 0x51AE, 0x98A4, 0x98A4, 0x04C3, 0x98A5, 0x98A6, 0x1BEE,
+ 0x98A7, 0x98A7, 0x0C82, 0x98A8, 0x98A8, 0x1F00, 0x98A9, 0x98AD, 0x51AF,
+ 0x98AE, 0x98AF, 0x24CC, 0x98B0, 0x98B0, 0x51B4, 0x98B1, 0x98B1, 0x2698,
+ 0x98B2, 0x98B2, 0x51B5, 0x98B3, 0x98B3, 0x2678, 0x98B4, 0x98B5, 0x51B6,
+ 0x98B6, 0x98B6, 0x24CE, 0x98B7, 0x98BB, 0x51B8, 0x98BC, 0x98BC, 0x24CF,
+ 0x98BD, 0x98C3, 0x51BD, 0x98C4, 0x98C4, 0x20B8, 0x98C5, 0x98C5, 0x51C4,
+ 0x98C6, 0x98C6, 0x24D0, 0x98C7, 0x98C7, 0x51C5, 0x98C8, 0x98C8, 0x24D1,
+ 0x98C9, 0x98CD, 0x51C6, 0x98CE, 0x98CE, 0x0684, 0x98CF, 0x98D0, 0x51CB,
+ 0x98D1, 0x98D3, 0x19B7, 0x98D4, 0x98D4, 0x51CD, 0x98D5, 0x98D5, 0x19BA,
+ 0x98D6, 0x98D7, 0x51CE, 0x98D8, 0x98D8, 0x0BCD, 0x98D9, 0x98DA, 0x19BB,
+ 0x98DB, 0x98DB, 0x1EF4, 0x98DC, 0x98DD, 0x51D0, 0x98DE, 0x98DE, 0x0666,
+ 0x98DF, 0x98DF, 0x0D4A, 0x98E0, 0x98E0, 0x239B, 0x98E1, 0x98E1, 0x51D2,
+ 0x98E2, 0x98E2, 0x267E, 0x98E3, 0x98E6, 0x51D3, 0x98E7, 0x98E7, 0x161A,
+ 0x98E8, 0x98E8, 0x1DE7, 0x98E9, 0x98E9, 0x239D, 0x98EA, 0x98EB, 0x239F,
+ 0x98EC, 0x98EC, 0x51D7, 0x98ED, 0x98ED, 0x23A1, 0x98EE, 0x98EE, 0x51D8,
+ 0x98EF, 0x98EF, 0x1EF1, 0x98F0, 0x98F1, 0x51D9, 0x98F2, 0x98F2, 0x221E,
+ 0x98F3, 0x98F3, 0x51DB, 0x98F4, 0x98F4, 0x23A2, 0x98F5, 0x98FB, 0x51DC,
+ 0x98FC, 0x98FC, 0x214B, 0x98FD, 0x98FD, 0x1E36, 0x98FE, 0x98FE, 0x2135,
+ 0x98FF, 0x98FF, 0x51E3, 0x9900, 0x9902, 0x51E4, 0x9903, 0x9903, 0x1FAD,
+ 0x9904, 0x9904, 0x51E7, 0x9905, 0x9905, 0x1E53, 0x9906, 0x9908, 0x51E8,
+ 0x9909, 0x9909, 0x23A3, 0x990A, 0x990A, 0x2203, 0x990B, 0x990B, 0x51EB,
+ 0x990C, 0x990C, 0x1EE7, 0x990D, 0x990D, 0x1DE8, 0x990E, 0x990F, 0x51EC,
+ 0x9910, 0x9910, 0x0494, 0x9911, 0x9911, 0x23A4, 0x9912, 0x9912, 0x2097,
+ 0x9913, 0x9913, 0x1EE4, 0x9914, 0x9917, 0x51EE, 0x9918, 0x9918, 0x2238,
+ 0x9919, 0x991A, 0x51F2, 0x991B, 0x991B, 0x23A5, 0x991C, 0x991D, 0x51F4,
+ 0x991E, 0x991E, 0x1F9A, 0x991F, 0x9920, 0x51F6, 0x9921, 0x9921, 0x21C3,
+ 0x9922, 0x9927, 0x51F8, 0x9928, 0x9928, 0x1F2E, 0x9929, 0x992D, 0x51FE,
+ 0x992E, 0x992E, 0x1DE9, 0x992F, 0x9932, 0x5203, 0x9933, 0x9933, 0x239C,
+ 0x9934, 0x9936, 0x5207, 0x9937, 0x9937, 0x23A6, 0x9938, 0x993B, 0x520A,
+ 0x993C, 0x993C, 0x239E, 0x993D, 0x993D, 0x520E, 0x993E, 0x993E, 0x2035,
+ 0x993F, 0x993F, 0x23A7, 0x9940, 0x9942, 0x520F, 0x9943, 0x9943, 0x23A8,
+ 0x9944, 0x9944, 0x5212, 0x9945, 0x9945, 0x2075, 0x9946, 0x9947, 0x5213,
+ 0x9948, 0x994A, 0x23A9, 0x994B, 0x994B, 0x1FEB, 0x994C, 0x994C, 0x23AC,
+ 0x994D, 0x9950, 0x5215, 0x9951, 0x9951, 0x1F6A, 0x9952, 0x9952, 0x20F9,
+ 0x9953, 0x9953, 0x5219, 0x9954, 0x9954, 0x1DEB, 0x9955, 0x9955, 0x1DEA,
+ 0x9956, 0x9956, 0x521A, 0x9957, 0x9957, 0x2666, 0x9958, 0x995B, 0x521B,
+ 0x995C, 0x995C, 0x2667, 0x995D, 0x995D, 0x521F, 0x995E, 0x995E, 0x1E6C,
+ 0x995F, 0x9961, 0x5220, 0x9962, 0x9962, 0x23AD, 0x9963, 0x9963, 0x161D,
+ 0x9964, 0x9964, 0x5223, 0x9965, 0x9965, 0x0815, 0x9966, 0x9966, 0x5224,
+ 0x9967, 0x996C, 0x161E, 0x996D, 0x996D, 0x0656, 0x996E, 0x996E, 0x1082,
+ 0x996F, 0x996F, 0x0875, 0x9970, 0x9970, 0x0D65, 0x9971, 0x9971, 0x040E,
+ 0x9972, 0x9972, 0x0DBC, 0x9973, 0x9973, 0x5225, 0x9974, 0x9974, 0x1624,
+ 0x9975, 0x9975, 0x063B, 0x9976, 0x9976, 0x0C9F, 0x9977, 0x9977, 0x1625,
+ 0x9978, 0x9979, 0x5226, 0x997A, 0x997A, 0x0899, 0x997B, 0x997B, 0x5228,
+ 0x997C, 0x997C, 0x0466, 0x997D, 0x997D, 0x1626, 0x997E, 0x997E, 0x5229,
+ 0x997F, 0x997F, 0x0635, 0x9980, 0x9980, 0x1627, 0x9981, 0x9981, 0x0B3C,
+ 0x9982, 0x9983, 0x522A, 0x9984, 0x9984, 0x1628, 0x9985, 0x9985, 0x0F47,
+ 0x9986, 0x9986, 0x0736, 0x9987, 0x9987, 0x1629, 0x9988, 0x9988, 0x098C,
+ 0x9989, 0x9989, 0x522C, 0x998A, 0x998A, 0x162A, 0x998B, 0x998B, 0x04BD,
+ 0x998C, 0x998C, 0x522D, 0x998D, 0x998D, 0x162B, 0x998E, 0x998E, 0x522E,
+ 0x998F, 0x998F, 0x0A3C, 0x9990, 0x9991, 0x162C, 0x9992, 0x9992, 0x0A9F,
+ 0x9993, 0x9995, 0x162E, 0x9996, 0x9996, 0x0D6E, 0x9997, 0x9997, 0x126E,
+ 0x9998, 0x9998, 0x12F9, 0x9999, 0x9999, 0x0F50, 0x999A, 0x99A4, 0x522F,
+ 0x99A5, 0x99A5, 0x1B2B, 0x99A6, 0x99A7, 0x523A, 0x99A8, 0x99A8, 0x13DE,
+ 0x99A9, 0x99AB, 0x523C, 0x99AC, 0x99AC, 0x206D, 0x99AD, 0x99AD, 0x2242,
+ 0x99AE, 0x99AE, 0x1F02, 0x99AF, 0x99B0, 0x523F, 0x99B1, 0x99B1, 0x2183,
+ 0x99B2, 0x99B2, 0x5241, 0x99B3, 0x99B3, 0x1E85, 0x99B4, 0x99B4, 0x21E9,
+ 0x99B5, 0x99C0, 0x5242, 0x99C1, 0x99C1, 0x1E57, 0x99C2, 0x99CF, 0x524E,
+ 0x99D0, 0x99D0, 0x22A5, 0x99D1, 0x99D1, 0x2407, 0x99D2, 0x99D2, 0x1FCA,
+ 0x99D3, 0x99D3, 0x525C, 0x99D4, 0x99D4, 0x2402, 0x99D5, 0x99D5, 0x1F82,
+ 0x99D6, 0x99D7, 0x525D, 0x99D8, 0x99D8, 0x2408, 0x99D9, 0x99D9, 0x2404,
+ 0x99DA, 0x99DA, 0x525F, 0x99DB, 0x99DB, 0x2131, 0x99DC, 0x99DC, 0x5260,
+ 0x99DD, 0x99DD, 0x2184, 0x99DE, 0x99DE, 0x5261, 0x99DF, 0x99DF, 0x2403,
+ 0x99E0, 0x99E0, 0x5262, 0x99E1, 0x99E1, 0x206E, 0x99E2, 0x99E2, 0x240B,
+ 0x99E3, 0x99EC, 0x5263, 0x99ED, 0x99ED, 0x1F3F, 0x99EE, 0x99F0, 0x526D,
+ 0x99F1, 0x99F1, 0x2067, 0x99F2, 0x99FE, 0x5270, 0x99FF, 0x99FF, 0x1FD7,
+ 0x9A00, 0x9A00, 0x527D, 0x9A01, 0x9A01, 0x1E83, 0x9A02, 0x9A04, 0x527E,
+ 0x9A05, 0x9A05, 0x240F, 0x9A06, 0x9A0C, 0x5281, 0x9A0D, 0x9A0D, 0x240E,
+ 0x9A0E, 0x9A0E, 0x20C7, 0x9A0F, 0x9A0F, 0x240D, 0x9A10, 0x9A15, 0x5288,
+ 0x9A16, 0x9A16, 0x2412, 0x9A17, 0x9A18, 0x528E, 0x9A19, 0x9A19, 0x20B7,
+ 0x9A1A, 0x9A2A, 0x5290, 0x9A2B, 0x9A2B, 0x23F0, 0x9A2C, 0x9A2C, 0x52A1,
+ 0x9A2D, 0x9A2D, 0x2411, 0x9A2E, 0x9A2E, 0x2414, 0x9A2F, 0x9A2F, 0x52A2,
+ 0x9A30, 0x9A30, 0x2170, 0x9A31, 0x9A35, 0x52A3, 0x9A36, 0x9A36, 0x2405,
+ 0x9A37, 0x9A37, 0x210C, 0x9A38, 0x9A38, 0x2415, 0x9A39, 0x9A3D, 0x52A8,
+ 0x9A3E, 0x9A3E, 0x2066, 0x9A3F, 0x9A3F, 0x52AD, 0x9A40, 0x9A40, 0x2352,
+ 0x9A41, 0x9A41, 0x2413, 0x9A42, 0x9A42, 0x2410, 0x9A43, 0x9A44, 0x2416,
+ 0x9A45, 0x9A45, 0x20F1, 0x9A46, 0x9A49, 0x52AE, 0x9A4A, 0x9A4A, 0x240A,
+ 0x9A4B, 0x9A4C, 0x52B2, 0x9A4D, 0x9A4D, 0x2409, 0x9A4E, 0x9A4E, 0x52B4,
+ 0x9A4F, 0x9A4F, 0x2418, 0x9A50, 0x9A54, 0x52B5, 0x9A55, 0x9A55, 0x1FA7,
+ 0x9A56, 0x9A56, 0x52BA, 0x9A57, 0x9A57, 0x21FC, 0x9A58, 0x9A59, 0x52BB,
+ 0x9A5A, 0x9A5A, 0x1FC1, 0x9A5B, 0x9A5B, 0x2406, 0x9A5C, 0x9A5E, 0x52BD,
+ 0x9A5F, 0x9A5F, 0x229C, 0x9A60, 0x9A61, 0x52C0, 0x9A62, 0x9A62, 0x204E,
+ 0x9A63, 0x9A63, 0x52C2, 0x9A64, 0x9A64, 0x241A, 0x9A65, 0x9A65, 0x2419,
+ 0x9A66, 0x9A69, 0x52C3, 0x9A6A, 0x9A6A, 0x240C, 0x9A6B, 0x9A6B, 0x52C7,
+ 0x9A6C, 0x9A6C, 0x0A94, 0x9A6D, 0x9A6D, 0x10E9, 0x9A6E, 0x9A6E, 0x0E85,
+ 0x9A6F, 0x9A6F, 0x0FDA, 0x9A70, 0x9A70, 0x0500, 0x9A71, 0x9A71, 0x0C7A,
+ 0x9A72, 0x9A72, 0x52C8, 0x9A73, 0x9A73, 0x047C, 0x9A74, 0x9A74, 0x0A66,
+ 0x9A75, 0x9A75, 0x17BA, 0x9A76, 0x9A76, 0x0D52, 0x9A77, 0x9A78, 0x17BB,
+ 0x9A79, 0x9A79, 0x0903, 0x9A7A, 0x9A7A, 0x17BD, 0x9A7B, 0x9A7B, 0x1201,
+ 0x9A7C, 0x9A7C, 0x0E86, 0x9A7D, 0x9A7D, 0x17BF, 0x9A7E, 0x9A7E, 0x0850,
+ 0x9A7F, 0x9A7F, 0x17BE, 0x9A80, 0x9A81, 0x17C0, 0x9A82, 0x9A82, 0x0A95,
+ 0x9A83, 0x9A83, 0x52C9, 0x9A84, 0x9A84, 0x088F, 0x9A85, 0x9A85, 0x17C2,
+ 0x9A86, 0x9A86, 0x0A8D, 0x9A87, 0x9A87, 0x075E, 0x9A88, 0x9A88, 0x17C3,
+ 0x9A89, 0x9A89, 0x52CA, 0x9A8A, 0x9A8A, 0x17C4, 0x9A8B, 0x9A8B, 0x04F7,
+ 0x9A8C, 0x9A8C, 0x1012, 0x9A8D, 0x9A8E, 0x52CB, 0x9A8F, 0x9A8F, 0x0932,
+ 0x9A90, 0x9A90, 0x17C5, 0x9A91, 0x9A91, 0x0C0E, 0x9A92, 0x9A93, 0x17C6,
+ 0x9A94, 0x9A95, 0x52CD, 0x9A96, 0x9A96, 0x17C8, 0x9A97, 0x9A97, 0x0BCC,
+ 0x9A98, 0x9A98, 0x17C9, 0x9A99, 0x9A99, 0x52CF, 0x9A9A, 0x9A9A, 0x0CE0,
+ 0x9A9B, 0x9A9D, 0x17CA, 0x9A9E, 0x9A9E, 0x1735, 0x9A9F, 0x9AA0, 0x17CD,
+ 0x9AA1, 0x9AA1, 0x0A89, 0x9AA2, 0x9AA3, 0x17CF, 0x9AA4, 0x9AA4, 0x11E7,
+ 0x9AA5, 0x9AA5, 0x17D1, 0x9AA6, 0x9AA6, 0x52D0, 0x9AA7, 0x9AA7, 0x17D2,
+ 0x9AA8, 0x9AA8, 0x0720, 0x9AA9, 0x9AAE, 0x52D1, 0x9AAF, 0x9AAF, 0x1E29,
+ 0x9AB0, 0x9AB0, 0x1DD3, 0x9AB1, 0x9AB1, 0x1DD2, 0x9AB2, 0x9AB5, 0x52D7,
+ 0x9AB6, 0x9AB6, 0x1DD6, 0x9AB7, 0x9AB7, 0x1DD4, 0x9AB8, 0x9AB8, 0x0758,
+ 0x9AB9, 0x9AB9, 0x52DB, 0x9ABA, 0x9ABA, 0x1DD7, 0x9ABB, 0x9ABB, 0x52DC,
+ 0x9ABC, 0x9ABC, 0x1DD8, 0x9ABD, 0x9ABF, 0x52DD, 0x9AC0, 0x9AC0, 0x1DDA,
+ 0x9AC1, 0x9AC1, 0x1DD9, 0x9AC2, 0x9AC2, 0x1DDC, 0x9AC3, 0x9AC4, 0x52E0,
+ 0x9AC5, 0x9AC5, 0x1DDB, 0x9AC6, 0x9ACA, 0x52E2, 0x9ACB, 0x9ACC, 0x1DDD,
+ 0x9ACD, 0x9ACE, 0x52E7, 0x9ACF, 0x9ACF, 0x2661, 0x9AD0, 0x9AD0, 0x52E9,
+ 0x9AD1, 0x9AD1, 0x1DDF, 0x9AD2, 0x9AD2, 0x26A4, 0x9AD3, 0x9AD3, 0x0DDD,
+ 0x9AD4, 0x9AD4, 0x2174, 0x9AD5, 0x9AD5, 0x2663, 0x9AD6, 0x9AD6, 0x2662,
+ 0x9AD7, 0x9AD7, 0x52EA, 0x9AD8, 0x9AD8, 0x06DA, 0x9AD9, 0x9ADE, 0x52EB,
+ 0x9ADF, 0x9ADF, 0x1DEC, 0x9AE0, 0x9AE0, 0x52F1, 0x9AE1, 0x9AE1, 0x1DED,
+ 0x9AE2, 0x9AE5, 0x52F2, 0x9AE6, 0x9AE6, 0x1DEE, 0x9AE7, 0x9AEA, 0x52F6,
+ 0x9AEB, 0x9AEB, 0x1DF0, 0x9AEC, 0x9AEC, 0x52FA, 0x9AED, 0x9AED, 0x1DF2,
+ 0x9AEE, 0x9AEE, 0x2675, 0x9AEF, 0x9AEF, 0x1DEF, 0x9AF0, 0x9AF8, 0x52FB,
+ 0x9AF9, 0x9AF9, 0x1DF3, 0x9AFA, 0x9AFA, 0x5304, 0x9AFB, 0x9AFB, 0x1DF1,
+ 0x9AFC, 0x9AFF, 0x5305, 0x9B00, 0x9B02, 0x5309, 0x9B03, 0x9B03, 0x1234,
+ 0x9B04, 0x9B05, 0x530C, 0x9B06, 0x9B06, 0x214C, 0x9B07, 0x9B07, 0x530E,
+ 0x9B08, 0x9B08, 0x1DF4, 0x9B09, 0x9B0C, 0x530F, 0x9B0D, 0x9B0D, 0x267A,
+ 0x9B0E, 0x9B0E, 0x5313, 0x9B0F, 0x9B0F, 0x1DF5, 0x9B10, 0x9B12, 0x5314,
+ 0x9B13, 0x9B13, 0x1DF6, 0x9B14, 0x9B19, 0x5317, 0x9B1A, 0x9B1A, 0x26A0,
+ 0x9B1B, 0x9B1E, 0x531D, 0x9B1F, 0x9B1F, 0x1DF7, 0x9B20, 0x9B21, 0x5321,
+ 0x9B22, 0x9B22, 0x2668, 0x9B23, 0x9B23, 0x1DF8, 0x9B24, 0x9B24, 0x5323,
+ 0x9B25, 0x9B25, 0x1ED0, 0x9B26, 0x9B26, 0x5324, 0x9B27, 0x9B27, 0x2096,
+ 0x9B28, 0x9B28, 0x5325, 0x9B29, 0x9B29, 0x23CC, 0x9B2A, 0x9B2D, 0x5326,
+ 0x9B2E, 0x9B2E, 0x23C8, 0x9B2F, 0x9B2F, 0x139B, 0x9B30, 0x9B30, 0x532A,
+ 0x9B31, 0x9B31, 0x223E, 0x9B32, 0x9B32, 0x1260, 0x9B33, 0x9B3A, 0x532B,
+ 0x9B3B, 0x9B3B, 0x1773, 0x9B3C, 0x9B3C, 0x0746, 0x9B3D, 0x9B40, 0x5333,
+ 0x9B41, 0x9B41, 0x098A, 0x9B42, 0x9B42, 0x07FF, 0x9B43, 0x9B43, 0x1DE1,
+ 0x9B44, 0x9B44, 0x0BE6, 0x9B45, 0x9B45, 0x1DE0, 0x9B46, 0x9B46, 0x5337,
+ 0x9B47, 0x9B47, 0x1DE2, 0x9B48, 0x9B48, 0x1DE4, 0x9B49, 0x9B49, 0x1DE3,
+ 0x9B4A, 0x9B4C, 0x5338, 0x9B4D, 0x9B4D, 0x1DE5, 0x9B4E, 0x9B4E, 0x2665,
+ 0x9B4F, 0x9B4F, 0x0EC9, 0x9B50, 0x9B50, 0x533B, 0x9B51, 0x9B51, 0x1DE6,
+ 0x9B52, 0x9B53, 0x533C, 0x9B54, 0x9B54, 0x0B0A, 0x9B55, 0x9B57, 0x533E,
+ 0x9B58, 0x9B58, 0x2664, 0x9B59, 0x9B59, 0x5341, 0x9B5A, 0x9B5A, 0x2239,
+ 0x9B5B, 0x9B6E, 0x5342, 0x9B6F, 0x9B6F, 0x204A, 0x9B70, 0x9B73, 0x5356,
+ 0x9B74, 0x9B74, 0x261F, 0x9B75, 0x9B76, 0x535A, 0x9B77, 0x9B77, 0x261E,
+ 0x9B78, 0x9B80, 0x535C, 0x9B81, 0x9B81, 0x2620, 0x9B82, 0x9B82, 0x5365,
+ 0x9B83, 0x9B83, 0x2621, 0x9B84, 0x9B8D, 0x5366, 0x9B8E, 0x9B8E, 0x2622,
+ 0x9B8F, 0x9B8F, 0x5370, 0x9B90, 0x9B90, 0x2627, 0x9B91, 0x9B91, 0x1E39,
+ 0x9B92, 0x9B92, 0x2625, 0x9B93, 0x9B99, 0x5371, 0x9B9A, 0x9B9A, 0x2629,
+ 0x9B9B, 0x9B9C, 0x5378, 0x9B9D, 0x9B9D, 0x262E, 0x9B9E, 0x9B9E, 0x262B,
+ 0x9B9F, 0x9BA9, 0x537A, 0x9BAA, 0x9BAA, 0x262A, 0x9BAB, 0x9BAB, 0x262D,
+ 0x9BAC, 0x9BAC, 0x5385, 0x9BAD, 0x9BAD, 0x2628, 0x9BAE, 0x9BAE, 0x21B9,
+ 0x9BAF, 0x9BBF, 0x5386, 0x9BC0, 0x9BC0, 0x2636, 0x9BC1, 0x9BC1, 0x2630,
+ 0x9BC2, 0x9BC6, 0x5397, 0x9BC7, 0x9BC7, 0x2638, 0x9BC8, 0x9BC8, 0x539C,
+ 0x9BC9, 0x9BC9, 0x200D, 0x9BCA, 0x9BCA, 0x2637, 0x9BCB, 0x9BD3, 0x539D,
+ 0x9BD4, 0x9BD4, 0x2645, 0x9BD5, 0x9BD5, 0x53A6, 0x9BD6, 0x9BD6, 0x263A,
+ 0x9BD7, 0x9BDA, 0x53A7, 0x9BDB, 0x9BDB, 0x2643, 0x9BDC, 0x9BDC, 0x53AB,
+ 0x9BDD, 0x9BDD, 0x2640, 0x9BDE, 0x9BE0, 0x53AC, 0x9BE1, 0x9BE1, 0x263D,
+ 0x9BE2, 0x9BE2, 0x2641, 0x9BE3, 0x9BE3, 0x53AF, 0x9BE4, 0x9BE4, 0x263E,
+ 0x9BE5, 0x9BE6, 0x53B0, 0x9BE7, 0x9BE7, 0x263F, 0x9BE8, 0x9BE8, 0x1FC0,
+ 0x9BE9, 0x9BE9, 0x53B2, 0x9BEA, 0x9BEB, 0x263B, 0x9BEC, 0x9BEF, 0x53B3,
+ 0x9BF0, 0x9BF0, 0x2642, 0x9BF1, 0x9BF3, 0x53B7, 0x9BF4, 0x9BF4, 0x2644,
+ 0x9BF5, 0x9BFC, 0x53BA, 0x9BFD, 0x9BFD, 0x2639, 0x9BFE, 0x9BFE, 0x53C2,
+ 0x9BFF, 0x9BFF, 0x264C, 0x9C00, 0x9C07, 0x53C3, 0x9C08, 0x9C08, 0x2647,
+ 0x9C09, 0x9C09, 0x264B, 0x9C0A, 0x9C0C, 0x53CB, 0x9C0D, 0x9C0D, 0x2649,
+ 0x9C0E, 0x9C0F, 0x53CE, 0x9C10, 0x9C10, 0x2648, 0x9C11, 0x9C11, 0x53D0,
+ 0x9C12, 0x9C12, 0x264A, 0x9C13, 0x9C13, 0x2108, 0x9C14, 0x9C1F, 0x53D1,
+ 0x9C20, 0x9C20, 0x264D, 0x9C21, 0x9C22, 0x53DD, 0x9C23, 0x9C23, 0x2634,
+ 0x9C24, 0x9C24, 0x53DF, 0x9C25, 0x9C25, 0x2651, 0x9C26, 0x9C27, 0x53E0,
+ 0x9C28, 0x9C28, 0x2650, 0x9C29, 0x9C29, 0x2652, 0x9C2A, 0x9C2C, 0x53E2,
+ 0x9C2D, 0x9C2D, 0x264F, 0x9C2E, 0x9C30, 0x53E5, 0x9C31, 0x9C31, 0x2632,
+ 0x9C32, 0x9C32, 0x264E, 0x9C33, 0x9C33, 0x2653, 0x9C34, 0x9C34, 0x53E8,
+ 0x9C35, 0x9C35, 0x2657, 0x9C36, 0x9C36, 0x53E9, 0x9C37, 0x9C37, 0x2635,
+ 0x9C38, 0x9C38, 0x53EA, 0x9C39, 0x9C39, 0x2633, 0x9C3A, 0x9C3A, 0x53EB,
+ 0x9C3B, 0x9C3B, 0x2656, 0x9C3C, 0x9C3D, 0x53EC, 0x9C3E, 0x9C3E, 0x2654,
+ 0x9C3F, 0x9C44, 0x53EE, 0x9C45, 0x9C45, 0x2658, 0x9C46, 0x9C47, 0x53F4,
+ 0x9C48, 0x9C48, 0x2655, 0x9C49, 0x9C49, 0x1E4D, 0x9C4A, 0x9C51, 0x53F6,
+ 0x9C52, 0x9C52, 0x265B, 0x9C53, 0x9C53, 0x53FE, 0x9C54, 0x9C54, 0x265A,
+ 0x9C55, 0x9C55, 0x53FF, 0x9C56, 0x9C56, 0x2659, 0x9C57, 0x9C57, 0x202E,
+ 0x9C58, 0x9C58, 0x262F, 0x9C59, 0x9C5C, 0x5400, 0x9C5D, 0x9C5D, 0x2646,
+ 0x9C5E, 0x9C5E, 0x5404, 0x9C5F, 0x9C5F, 0x2626, 0x9C60, 0x9C66, 0x5405,
+ 0x9C67, 0x9C67, 0x265C, 0x9C68, 0x9C6C, 0x540C, 0x9C6D, 0x9C6D, 0x262C,
+ 0x9C6E, 0x9C77, 0x5411, 0x9C78, 0x9C78, 0x2623, 0x9C79, 0x9C79, 0x541B,
+ 0x9C7A, 0x9C7A, 0x2631, 0x9C7B, 0x9C7B, 0x541C, 0x9C7C, 0x9C7C, 0x10C8,
+ 0x9C7D, 0x9C7E, 0x541D, 0x9C7F, 0x9C7F, 0x1D89, 0x9C80, 0x9C80, 0x541F,
+ 0x9C81, 0x9C81, 0x0A5A, 0x9C82, 0x9C82, 0x1D8A, 0x9C83, 0x9C84, 0x5420,
+ 0x9C85, 0x9C88, 0x1D8B, 0x9C89, 0x9C8A, 0x5422, 0x9C8B, 0x9C8B, 0x1D90,
+ 0x9C8C, 0x9C8C, 0x5424, 0x9C8D, 0x9C8D, 0x0414, 0x9C8E, 0x9C8E, 0x1D91,
+ 0x9C8F, 0x9C8F, 0x5425, 0x9C90, 0x9C92, 0x1D92, 0x9C93, 0x9C93, 0x5426,
+ 0x9C94, 0x9C95, 0x1D95, 0x9C96, 0x9C99, 0x5427, 0x9C9A, 0x9C9B, 0x1D97,
+ 0x9C9C, 0x9C9C, 0x0F37, 0x9C9D, 0x9C9D, 0x542B, 0x9C9E, 0x9CA3, 0x1D99,
+ 0x9CA4, 0x9CA4, 0x09DB, 0x9CA5, 0x9CA9, 0x1D9F, 0x9CAA, 0x9CAA, 0x542C,
+ 0x9CAB, 0x9CAB, 0x1DA4, 0x9CAC, 0x9CAC, 0x542D, 0x9CAD, 0x9CAE, 0x1DA5,
+ 0x9CAF, 0x9CAF, 0x542E, 0x9CB0, 0x9CB7, 0x1DA7, 0x9CB8, 0x9CB8, 0x08D7,
+ 0x9CB9, 0x9CB9, 0x542F, 0x9CBA, 0x9CBD, 0x1DAF, 0x9CBE, 0x9CC2, 0x5430,
+ 0x9CC3, 0x9CC3, 0x0CD5, 0x9CC4, 0x9CC7, 0x1DB3, 0x9CC8, 0x9CC9, 0x5435,
+ 0x9CCA, 0x9CD0, 0x1DB7, 0x9CD1, 0x9CD2, 0x5437, 0x9CD3, 0x9CD5, 0x1DBE,
+ 0x9CD6, 0x9CD6, 0x0457, 0x9CD7, 0x9CD9, 0x1DC1, 0x9CDA, 0x9CDB, 0x5439,
+ 0x9CDC, 0x9CDD, 0x1DC4, 0x9CDE, 0x9CDE, 0x0A24, 0x9CDF, 0x9CDF, 0x1DC6,
+ 0x9CE0, 0x9CE1, 0x543B, 0x9CE2, 0x9CE2, 0x1DC7, 0x9CE3, 0x9CE4, 0x543D,
+ 0x9CE5, 0x9CE5, 0x209C, 0x9CE6, 0x9CE8, 0x543F, 0x9CE9, 0x9CE9, 0x2580,
+ 0x9CEA, 0x9CEB, 0x5442, 0x9CEC, 0x9CEC, 0x22DC, 0x9CED, 0x9CF2, 0x5444,
+ 0x9CF3, 0x9CF3, 0x1F05, 0x9CF4, 0x9CF4, 0x208B, 0x9CF5, 0x9CF5, 0x544A,
+ 0x9CF6, 0x9CF6, 0x2581, 0x9CF7, 0x9CFF, 0x544B, 0x9D00, 0x9D05, 0x5454,
+ 0x9D06, 0x9D06, 0x2583, 0x9D07, 0x9D07, 0x2582, 0x9D08, 0x9D08, 0x545A,
+ 0x9D09, 0x9D09, 0x21EE, 0x9D0A, 0x9D14, 0x545B, 0x9D15, 0x9D15, 0x2182,
+ 0x9D16, 0x9D1A, 0x5466, 0x9D1B, 0x9D1B, 0x2243, 0x9D1C, 0x9D1C, 0x546B,
+ 0x9D1D, 0x9D1D, 0x2587, 0x9D1E, 0x9D1E, 0x546C, 0x9D1F, 0x9D1F, 0x2588,
+ 0x9D20, 0x9D22, 0x546D, 0x9D23, 0x9D23, 0x2584, 0x9D24, 0x9D25, 0x5470,
+ 0x9D26, 0x9D26, 0x21FD, 0x9D27, 0x9D27, 0x5472, 0x9D28, 0x9D28, 0x21EF,
+ 0x9D29, 0x9D2E, 0x5473, 0x9D2F, 0x9D2F, 0x258A, 0x9D30, 0x9D30, 0x258C,
+ 0x9D31, 0x9D3A, 0x5479, 0x9D3B, 0x9D3B, 0x1F47, 0x9D3C, 0x9D3E, 0x5483,
+ 0x9D3F, 0x9D3F, 0x1F1D, 0x9D40, 0x9D41, 0x5486, 0x9D42, 0x9D42, 0x258D,
+ 0x9D43, 0x9D50, 0x5488, 0x9D51, 0x9D51, 0x1FD0, 0x9D52, 0x9D52, 0x2592,
+ 0x9D53, 0x9D53, 0x258F, 0x9D54, 0x9D5B, 0x5496, 0x9D5C, 0x9D5C, 0x2594,
+ 0x9D5D, 0x9D5D, 0x1EE0, 0x9D5E, 0x9D5F, 0x549E, 0x9D60, 0x9D60, 0x2591,
+ 0x9D61, 0x9D61, 0x2595, 0x9D62, 0x9D69, 0x54A0, 0x9D6A, 0x9D6A, 0x2597,
+ 0x9D6B, 0x9D6B, 0x54A8, 0x9D6C, 0x9D6C, 0x20B6, 0x9D6D, 0x9D6E, 0x54A9,
+ 0x9D6F, 0x9D6F, 0x2598, 0x9D70, 0x9D71, 0x54AB, 0x9D72, 0x9D72, 0x20F6,
+ 0x9D73, 0x9D86, 0x54AD, 0x9D87, 0x9D87, 0x2585, 0x9D88, 0x9D88, 0x54C1,
+ 0x9D89, 0x9D89, 0x2599, 0x9D8A, 0x9D92, 0x54C2, 0x9D93, 0x9D93, 0x2596,
+ 0x9D94, 0x9D97, 0x54CB, 0x9D98, 0x9D98, 0x259A, 0x9D99, 0x9D99, 0x54CF,
+ 0x9D9A, 0x9D9A, 0x259B, 0x9D9B, 0x9DA4, 0x54D0, 0x9DA5, 0x9DA5, 0x259D,
+ 0x9DA6, 0x9DA8, 0x54DA, 0x9DA9, 0x9DA9, 0x259E, 0x9DAA, 0x9DAE, 0x54DD,
+ 0x9DAF, 0x9DAF, 0x234C, 0x9DB0, 0x9DB3, 0x54E2, 0x9DB4, 0x9DB4, 0x1F44,
+ 0x9DB5, 0x9DBA, 0x54E6, 0x9DBB, 0x9DBB, 0x2660, 0x9DBC, 0x9DBC, 0x25A0,
+ 0x9DBD, 0x9DBF, 0x54EC, 0x9DC0, 0x9DC0, 0x259C, 0x9DC1, 0x9DC1, 0x54EF,
+ 0x9DC2, 0x9DC2, 0x259F, 0x9DC3, 0x9DC3, 0x54F0, 0x9DC4, 0x9DC4, 0x1F6C,
+ 0x9DC5, 0x9DD2, 0x54F1, 0x9DD3, 0x9DD3, 0x25A2, 0x9DD4, 0x9DD6, 0x54FF,
+ 0x9DD7, 0x9DD7, 0x20AE, 0x9DD8, 0x9DD8, 0x5502, 0x9DD9, 0x9DD9, 0x258B,
+ 0x9DDA, 0x9DDA, 0x25A3, 0x9DDB, 0x9DE4, 0x5503, 0x9DE5, 0x9DE5, 0x2589,
+ 0x9DE6, 0x9DE6, 0x25A5, 0x9DE7, 0x9DEE, 0x550D, 0x9DEF, 0x9DEF, 0x25A4,
+ 0x9DF0, 0x9DF1, 0x5515, 0x9DF2, 0x9DF2, 0x25A6, 0x9DF3, 0x9DF3, 0x2593,
+ 0x9DF4, 0x9DF7, 0x5517, 0x9DF8, 0x9DF8, 0x25A7, 0x9DF9, 0x9DF9, 0x2222,
+ 0x9DFA, 0x9DFA, 0x25A9, 0x9DFB, 0x9DFF, 0x551B, 0x9E00, 0x9E0B, 0x5520,
+ 0x9E0C, 0x9E0C, 0x25A8, 0x9E0D, 0x9E14, 0x552C, 0x9E15, 0x9E15, 0x2586,
+ 0x9E16, 0x9E19, 0x5534, 0x9E1A, 0x9E1A, 0x25A1, 0x9E1B, 0x9E1B, 0x25AA,
+ 0x9E1C, 0x9E1C, 0x5538, 0x9E1D, 0x9E1D, 0x2590, 0x9E1E, 0x9E1E, 0x258E,
+ 0x9E1F, 0x9E1F, 0x0B54, 0x9E20, 0x9E20, 0x1B35, 0x9E21, 0x9E21, 0x0819,
+ 0x9E22, 0x9E22, 0x1B36, 0x9E23, 0x9E23, 0x0AFE, 0x9E24, 0x9E24, 0x5539,
+ 0x9E25, 0x9E25, 0x0B79, 0x9E26, 0x9E26, 0x0FE4, 0x9E27, 0x9E27, 0x553A,
+ 0x9E28, 0x9E2C, 0x1B37, 0x9E2D, 0x9E2D, 0x0FE5, 0x9E2E, 0x9E2E, 0x553B,
+ 0x9E2F, 0x9E2F, 0x1015, 0x9E30, 0x9E30, 0x553C, 0x9E31, 0x9E31, 0x1B3D,
+ 0x9E32, 0x9E32, 0x1B3C, 0x9E33, 0x9E33, 0x10EA, 0x9E34, 0x9E34, 0x553D,
+ 0x9E35, 0x9E35, 0x0E83, 0x9E36, 0x9E36, 0x1B3E, 0x9E37, 0x9E37, 0x1B40,
+ 0x9E38, 0x9E38, 0x1B3F, 0x9E39, 0x9E3A, 0x1B41, 0x9E3B, 0x9E3C, 0x553E,
+ 0x9E3D, 0x9E3D, 0x06E6, 0x9E3E, 0x9E3E, 0x1B43, 0x9E3F, 0x9E3F, 0x079F,
+ 0x9E40, 0x9E40, 0x5540, 0x9E41, 0x9E42, 0x1B44, 0x9E43, 0x9E43, 0x0918,
+ 0x9E44, 0x9E44, 0x1B46, 0x9E45, 0x9E45, 0x062B, 0x9E46, 0x9E49, 0x1B47,
+ 0x9E4A, 0x9E4A, 0x0C90, 0x9E4B, 0x9E4C, 0x1B4B, 0x9E4D, 0x9E4D, 0x5541,
+ 0x9E4E, 0x9E4E, 0x1B4D, 0x9E4F, 0x9E4F, 0x0BB5, 0x9E50, 0x9E50, 0x5542,
+ 0x9E51, 0x9E51, 0x1B4E, 0x9E52, 0x9E54, 0x5543, 0x9E55, 0x9E55, 0x1B4F,
+ 0x9E56, 0x9E56, 0x5546, 0x9E57, 0x9E57, 0x1B50, 0x9E58, 0x9E58, 0x1DD5,
+ 0x9E59, 0x9E59, 0x5547, 0x9E5A, 0x9E5C, 0x1B51, 0x9E5D, 0x9E5D, 0x5548,
+ 0x9E5E, 0x9E5E, 0x1B54, 0x9E5F, 0x9E62, 0x5549, 0x9E63, 0x9E63, 0x1B55,
+ 0x9E64, 0x9E64, 0x078E, 0x9E65, 0x9E65, 0x554D, 0x9E66, 0x9E6C, 0x1B56,
+ 0x9E6D, 0x9E6D, 0x1B5E, 0x9E6E, 0x9E6F, 0x554E, 0x9E70, 0x9E70, 0x108A,
+ 0x9E71, 0x9E71, 0x1B5D, 0x9E72, 0x9E72, 0x5550, 0x9E73, 0x9E73, 0x1B5F,
+ 0x9E74, 0x9E74, 0x5551, 0x9E75, 0x9E75, 0x2688, 0x9E76, 0x9E78, 0x5552,
+ 0x9E79, 0x9E79, 0x269E, 0x9E7A, 0x9E7A, 0x25FB, 0x9E7B, 0x9E7B, 0x5555,
+ 0x9E7C, 0x9E7C, 0x1F8C, 0x9E7D, 0x9E7D, 0x21F4, 0x9E7E, 0x9E7E, 0x1D16,
+ 0x9E7F, 0x9E7F, 0x0A60, 0x9E80, 0x9E81, 0x5556, 0x9E82, 0x9E82, 0x1DFC,
+ 0x9E83, 0x9E86, 0x5558, 0x9E87, 0x9E88, 0x1DFD, 0x9E89, 0x9E8A, 0x555C,
+ 0x9E8B, 0x9E8B, 0x1DFF, 0x9E8C, 0x9E91, 0x555E, 0x9E92, 0x9E92, 0x1E00,
+ 0x9E93, 0x9E93, 0x0A5B, 0x9E94, 0x9E96, 0x5564, 0x9E97, 0x9E97, 0x200F,
+ 0x9E98, 0x9E9C, 0x5567, 0x9E9D, 0x9E9D, 0x1E02, 0x9E9E, 0x9E9E, 0x556C,
+ 0x9E9F, 0x9E9F, 0x1E03, 0x9EA0, 0x9EA4, 0x556D, 0x9EA5, 0x9EA5, 0x2071,
+ 0x9EA6, 0x9EA6, 0x0A9A, 0x9EA7, 0x9EA8, 0x5572, 0x9EA9, 0x9EA9, 0x25F7,
+ 0x9EAA, 0x9EAE, 0x5574, 0x9EAF, 0x9EAF, 0x2696, 0x9EB0, 0x9EB3, 0x5579,
+ 0x9EB4, 0x9EB4, 0x1CEE, 0x9EB5, 0x9EB5, 0x268F, 0x9EB6, 0x9EB7, 0x557D,
+ 0x9EB8, 0x9EB8, 0x1CED, 0x9EB9, 0x9EBA, 0x557F, 0x9EBB, 0x9EBB, 0x0A90,
+ 0x9EBC, 0x9EBC, 0x5581, 0x9EBD, 0x9EBE, 0x1DF9, 0x9EBF, 0x9EC3, 0x5582,
+ 0x9EC4, 0x9EC4, 0x07DB, 0x9EC5, 0x9EC8, 0x5587, 0x9EC9, 0x9EC9, 0x12F8,
+ 0x9ECA, 0x9ECB, 0x558B, 0x9ECC, 0x9ECC, 0x22DA, 0x9ECD, 0x9ECD, 0x0D89,
+ 0x9ECE, 0x9ECE, 0x09D3, 0x9ECF, 0x9ECF, 0x1B2A, 0x9ED0, 0x9ED0, 0x558D,
+ 0x9ED1, 0x9ED1, 0x0791, 0x9ED2, 0x9ED3, 0x558E, 0x9ED4, 0x9ED4, 0x0C2A,
+ 0x9ED5, 0x9ED7, 0x5590, 0x9ED8, 0x9ED8, 0x0B0F, 0x9ED9, 0x9EDA, 0x5593,
+ 0x9EDB, 0x9EDD, 0x1E04, 0x9EDE, 0x9EDE, 0x1EC1, 0x9EDF, 0x9EDF, 0x1E08,
+ 0x9EE0, 0x9EE0, 0x1E07, 0x9EE1, 0x9EE1, 0x5595, 0x9EE2, 0x9EE2, 0x1E09,
+ 0x9EE3, 0x9EE4, 0x5596, 0x9EE5, 0x9EE5, 0x1E0C, 0x9EE6, 0x9EE6, 0x5598,
+ 0x9EE7, 0x9EE7, 0x1E0B, 0x9EE8, 0x9EE8, 0x1EB3, 0x9EE9, 0x9EE9, 0x1E0A,
+ 0x9EEA, 0x9EEA, 0x1E0D, 0x9EEB, 0x9EEE, 0x5599, 0x9EEF, 0x9EEF, 0x1E0E,
+ 0x9EF0, 0x9EF1, 0x559D, 0x9EF2, 0x9EF2, 0x266A, 0x9EF3, 0x9EF3, 0x559F,
+ 0x9EF4, 0x9EF4, 0x268A, 0x9EF5, 0x9EF6, 0x55A0, 0x9EF7, 0x9EF7, 0x2669,
+ 0x9EF8, 0x9EF8, 0x55A2, 0x9EF9, 0x9EF9, 0x1A55, 0x9EFA, 0x9EFA, 0x55A3,
+ 0x9EFB, 0x9EFC, 0x1A56, 0x9EFD, 0x9EFD, 0x2618, 0x9EFE, 0x9EFE, 0x1D76,
+ 0x9EFF, 0x9EFF, 0x2619, 0x9F00, 0x9F08, 0x55A4, 0x9F09, 0x9F09, 0x261A,
+ 0x9F0A, 0x9F0A, 0x55AD, 0x9F0B, 0x9F0B, 0x1D77, 0x9F0C, 0x9F0C, 0x55AE,
+ 0x9F0D, 0x9F0D, 0x1D78, 0x9F0E, 0x9F0E, 0x05E5, 0x9F0F, 0x9F0F, 0x55AF,
+ 0x9F10, 0x9F10, 0x1274, 0x9F11, 0x9F12, 0x55B0, 0x9F13, 0x9F13, 0x071D,
+ 0x9F14, 0x9F14, 0x55B2, 0x9F15, 0x9F15, 0x2673, 0x9F16, 0x9F16, 0x55B3,
+ 0x9F17, 0x9F17, 0x1271, 0x9F18, 0x9F18, 0x55B4, 0x9F19, 0x9F19, 0x13DF,
+ 0x9F1A, 0x9F1F, 0x55B5, 0x9F20, 0x9F20, 0x0D8A, 0x9F21, 0x9F21, 0x55BB,
+ 0x9F22, 0x9F22, 0x1E0F, 0x9F23, 0x9F2B, 0x55BC, 0x9F2C, 0x9F2C, 0x1E10,
+ 0x9F2D, 0x9F2E, 0x55C5, 0x9F2F, 0x9F2F, 0x1E11, 0x9F30, 0x9F36, 0x55C7,
+ 0x9F37, 0x9F37, 0x1E13, 0x9F38, 0x9F38, 0x55CE, 0x9F39, 0x9F39, 0x1E12,
+ 0x9F3A, 0x9F3A, 0x55CF, 0x9F3B, 0x9F3B, 0x0430, 0x9F3C, 0x9F3C, 0x55D0,
+ 0x9F3D, 0x9F3E, 0x1E14, 0x9F3F, 0x9F43, 0x55D1, 0x9F44, 0x9F44, 0x1E16,
+ 0x9F45, 0x9F49, 0x55D6, 0x9F4A, 0x9F4A, 0x20C6, 0x9F4B, 0x9F4B, 0x226B,
+ 0x9F4C, 0x9F4E, 0x55DB, 0x9F4F, 0x9F4F, 0x24D3, 0x9F50, 0x9F50, 0x0C0A,
+ 0x9F51, 0x9F51, 0x19C2, 0x9F52, 0x9F52, 0x1E86, 0x9F53, 0x9F53, 0x55DE,
+ 0x9F54, 0x9F54, 0x260F, 0x9F55, 0x9F58, 0x55DF, 0x9F59, 0x9F59, 0x2611,
+ 0x9F5A, 0x9F5B, 0x55E3, 0x9F5C, 0x9F5C, 0x2613, 0x9F5D, 0x9F5E, 0x55E5,
+ 0x9F5F, 0x9F5F, 0x2610, 0x9F60, 0x9F60, 0x2612, 0x9F61, 0x9F61, 0x2030,
+ 0x9F62, 0x9F62, 0x55E7, 0x9F63, 0x9F63, 0x2671, 0x9F64, 0x9F65, 0x55E8,
+ 0x9F66, 0x9F66, 0x2614, 0x9F67, 0x9F69, 0x55EA, 0x9F6A, 0x9F6A, 0x2616,
+ 0x9F6B, 0x9F6B, 0x55ED, 0x9F6C, 0x9F6C, 0x2615, 0x9F6D, 0x9F71, 0x55EE,
+ 0x9F72, 0x9F72, 0x20F2, 0x9F73, 0x9F76, 0x55F3, 0x9F77, 0x9F77, 0x2617,
+ 0x9F78, 0x9F7E, 0x55F7, 0x9F7F, 0x9F7F, 0x0502, 0x9F80, 0x9F80, 0x1D6D,
+ 0x9F81, 0x9F82, 0x55FE, 0x9F83, 0x9F83, 0x1D6E, 0x9F84, 0x9F84, 0x0A2D,
+ 0x9F85, 0x9F8A, 0x1D6F, 0x9F8B, 0x9F8B, 0x0C7E, 0x9F8C, 0x9F8C, 0x1D75,
+ 0x9F8D, 0x9F8D, 0x2037, 0x9F8E, 0x9F8F, 0x5600, 0x9F90, 0x9F90, 0x20B3,
+ 0x9F91, 0x9F93, 0x5602, 0x9F94, 0x9F94, 0x1F22, 0x9F95, 0x9F95, 0x24ED,
+ 0x9F96, 0x9F98, 0x5605, 0x9F99, 0x9F99, 0x0A43, 0x9F9A, 0x9F9A, 0x0701,
+ 0x9F9B, 0x9F9B, 0x1A54, 0x9F9C, 0x9F9C, 0x1F34, 0x9F9D, 0x9F9E, 0x5608,
+ 0x9F9F, 0x9F9F, 0x0743, 0x9FA0, 0x9FA0, 0x12F3, 0x9FA1, 0x9FA5, 0x560A,
+ 0xE816, 0xE818, 0x5620, 0xE81E, 0xE81E, 0x5628, 0xE826, 0xE826, 0x5630,
+ 0xE82B, 0xE82C, 0x5635, 0xE831, 0xE832, 0x563B, 0xE83B, 0xE83B, 0x5645,
+ 0xE843, 0xE843, 0x564D, 0xE854, 0xE855, 0x565E, 0xE864, 0xE864, 0x566E,
+ 0xF92C, 0xF92C, 0x560F, 0xFA0D, 0xFA0F, 0x5610, 0xFA11, 0xFA11, 0x5613,
+ 0xFA13, 0xFA14, 0x5614, 0xFA18, 0xFA18, 0x5616, 0xFA1F, 0xFA21, 0x5617,
+ 0xFA23, 0xFA24, 0x561A, 0xFA27, 0xFA29, 0x561C, 0xFE30, 0xFE30, 0x271D,
+ 0xFE49, 0xFE52, 0x272B, 0xFE54, 0xFE57, 0x2735, 0xFE59, 0xFE66, 0x2739,
+ 0xFE68, 0xFE6B, 0x2747, 0xFF01, 0xFF03, 0x0106, 0xFF04, 0xFF04, 0x00A6,
+ 0xFF05, 0xFF5D, 0x010A, 0xFF5E, 0xFF5E, 0x006A, 0xFFE0, 0xFFE1, 0x00A8,
+ 0xFFE2, 0xFFE2, 0x271E, 0xFFE3, 0xFFE3, 0x0163, 0xFFE4, 0xFFE4, 0x271F,
+ 0xFFE5, 0xFFE5, 0x0109,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp
new file mode 100644
index 0000000000..9891a69c55
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp
@@ -0,0 +1,16 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniGB_UCS2_V_4[24 * 3] = {
+ 0x2014, 0x2014, 0x0256, 0x2026, 0x2026, 0x0257, 0x2225, 0x2225, 0x1E1C,
+ 0x3001, 0x3001, 0x023F, 0x3002, 0x3002, 0x023E, 0x3008, 0x300F, 0x0248,
+ 0x3010, 0x3011, 0x0252, 0x3013, 0x3013, 0x1E1A, 0x3014, 0x3015, 0x0246,
+ 0x3016, 0x3017, 0x0250, 0xFF01, 0xFF01, 0x0242, 0xFF08, 0xFF09, 0x0244,
+ 0xFF0C, 0xFF0C, 0x023D, 0xFF0E, 0xFF0E, 0x1E1B, 0xFF1A, 0xFF1B, 0x0240,
+ 0xFF1D, 0xFF1D, 0x1E1C, 0xFF1F, 0xFF1F, 0x0243, 0xFF3B, 0xFF3B, 0x1E1D,
+ 0xFF3D, 0xFF3D, 0x1E1E, 0xFF3F, 0xFF3F, 0x0258, 0xFF5B, 0xFF5B, 0x0254,
+ 0xFF5D, 0xFF5D, 0x0255, 0xFF5E, 0xFF5E, 0x1E18, 0xFFE3, 0xFFE3, 0x1E1F,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp b/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp
new file mode 100644
index 0000000000..b0739b1b37
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_GB_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_GB_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_GBpc_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_GBpc_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_GBK_EUC_H_2[];
+extern const FX_WORD g_FXCMAP_GBK_EUC_V_2[];
+extern const FX_WORD g_FXCMAP_GBKp_EUC_H_2[];
+extern const FX_WORD g_FXCMAP_GBKp_EUC_V_2[];
+extern const FX_WORD g_FXCMAP_GBK2K_H_5[];
+extern const FX_WORD g_FXCMAP_GBK2K_H_5_DWord[];
+extern const FX_WORD g_FXCMAP_GBK2K_V_5[];
+extern const FX_WORD g_FXCMAP_UniGB_UCS2_H_4[];
+extern const FX_WORD g_FXCMAP_UniGB_UCS2_V_4[];
+extern const FX_WORD g_FXCMAP_GB1CID2Unicode_5[];
+static const FXCMAP_CMap g_FXCMAP_GB1_cmaps[] = {
+ { "GB-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_H_0, 90, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "GB-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GB_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "GBpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_H_0, 91, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "GBpc-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBpc_EUC_V_0, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "GBK-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_H_2, 4071, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "GBK-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBK_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "GBKp-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_H_2, 4070, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "GBKp-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_GBKp_EUC_V_2, 20, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "GBK2K-H", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_H_5, 4071, FXCMAP_CMap::Single, g_FXCMAP_GBK2K_H_5_DWord, 1017, -4 },
+ { "GBK2K-V", FXCMAP_CMap::Range, g_FXCMAP_GBK2K_V_5, 41, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniGB-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniGB-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniGB-UTF16-H", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_H_4, 13825, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniGB-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniGB_UCS2_V_4, 24, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedGB1CMaps()
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_pMapList = g_FXCMAP_GB1_cmaps;
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_GB1].m_Count = sizeof g_FXCMAP_GB1_cmaps / sizeof (FXCMAP_CMap);
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_pMap = g_FXCMAP_GB1CID2Unicode_5;
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_GB1].m_Count = 30284;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
new file mode 100644
index 0000000000..9399e63115
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_83pv_RKSJ_H_1[222 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
+ 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x857E, 0x00E8,
+ 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,
+ 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,
+ 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,
+ 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x8780, 0x878F, 0x1DB8,
+ 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301,
+ 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF,
+ 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502,
+ 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B,
+ 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736,
+ 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F,
+ 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A,
+ 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3,
+ 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E,
+ 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7,
+ 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2,
+ 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B,
+ 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA,
+ 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114,
+ 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F,
+ 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348,
+ 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443,
+ 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C,
+ 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677,
+ 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0,
+ 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB,
+ 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4,
+ 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF,
+ 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18,
+ 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13,
+ 0xEAA3, 0xEAA4, 0x205C, 0xEB40, 0xEB40, 0x0279, 0xEB41, 0xEB42, 0x1ECF,
+ 0xEB43, 0xEB4F, 0x027C, 0xEB50, 0xEB51, 0x1ED1, 0xEB52, 0xEB5A, 0x028B,
+ 0xEB5B, 0xEB5D, 0x1ED3, 0xEB5E, 0xEB5F, 0x0297, 0xEB60, 0xEB64, 0x1ED6,
+ 0xEB65, 0xEB68, 0x029E, 0xEB69, 0xEB7A, 0x1EDB, 0xEB7B, 0xEB7E, 0x02B4,
+ 0xEB80, 0xEB80, 0x02B8, 0xEB81, 0xEB81, 0x1EED, 0xEB82, 0xEBAC, 0x02BA,
+ 0xEBB8, 0xEBBF, 0x02E5, 0xEBC8, 0xEBCE, 0x02ED, 0xEBDA, 0xEBE8, 0x02F4,
+ 0xEBF0, 0xEBF7, 0x0303, 0xEBFC, 0xEBFC, 0x030B, 0xEC4F, 0xEC58, 0x030C,
+ 0xEC60, 0xEC79, 0x0316, 0xEC81, 0xEC9A, 0x0330, 0xEC9F, 0xEC9F, 0x1EEE,
+ 0xECA0, 0xECA0, 0x034B, 0xECA1, 0xECA1, 0x1EEF, 0xECA2, 0xECA2, 0x034D,
+ 0xECA3, 0xECA3, 0x1EF0, 0xECA4, 0xECA4, 0x034F, 0xECA5, 0xECA5, 0x1EF1,
+ 0xECA6, 0xECA6, 0x0351, 0xECA7, 0xECA7, 0x1EF2, 0xECA8, 0xECC0, 0x0353,
+ 0xECC1, 0xECC1, 0x1EF3, 0xECC2, 0xECE0, 0x036D, 0xECE1, 0xECE1, 0x1EF4,
+ 0xECE2, 0xECE2, 0x038D, 0xECE3, 0xECE3, 0x1EF5, 0xECE4, 0xECE4, 0x038F,
+ 0xECE5, 0xECE5, 0x1EF6, 0xECE6, 0xECEB, 0x0391, 0xECEC, 0xECEC, 0x1EF7,
+ 0xECED, 0xECF1, 0x0398, 0xED40, 0xED40, 0x1EF8, 0xED41, 0xED41, 0x039E,
+ 0xED42, 0xED42, 0x1EF9, 0xED43, 0xED43, 0x03A0, 0xED44, 0xED44, 0x1EFA,
+ 0xED45, 0xED45, 0x03A2, 0xED46, 0xED46, 0x1EFB, 0xED47, 0xED47, 0x03A4,
+ 0xED48, 0xED48, 0x1EFC, 0xED49, 0xED61, 0x03A6, 0xED62, 0xED62, 0x1EFD,
+ 0xED63, 0xED7E, 0x03C0, 0xED80, 0xED82, 0x03DC, 0xED83, 0xED83, 0x1EFE,
+ 0xED84, 0xED84, 0x03E0, 0xED85, 0xED85, 0x1EFF, 0xED86, 0xED86, 0x03E2,
+ 0xED87, 0xED87, 0x1F00, 0xED88, 0xED8D, 0x03E4, 0xED8E, 0xED8E, 0x1F01,
+ 0xED8F, 0xED94, 0x03EB, 0xED95, 0xED96, 0x1F02, 0xED9F, 0xEDB6, 0x03F3,
+ 0xEDBF, 0xEDD6, 0x040B, 0xEE40, 0xEE5D, 0x1D83, 0xEE5F, 0xEE6E, 0x1F04,
+ 0xEE6F, 0xEE75, 0x1DB1, 0xEE80, 0xEE81, 0x1F14, 0xEE82, 0xEE8F, 0x1DBA,
+ 0xEE90, 0xEE90, 0x02FA, 0xEE91, 0xEE91, 0x02F9, 0xEE92, 0xEE92, 0x0301,
+ 0xEE93, 0xEE99, 0x1DC8, 0xEE9A, 0xEE9A, 0x0300, 0xEE9B, 0xEE9C, 0x1DCF,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
new file mode 100644
index 0000000000..f41ca62b92
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90ms_RKSJ_H_2[171 * 3] = {
+ 0x0020, 0x007D, 0x00E7, 0x007E, 0x007E, 0x0277, 0x00A0, 0x00DF, 0x0146,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83,
+ 0x875F, 0x8760, 0x1DA1, 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4,
+ 0x8763, 0x8763, 0x1F68, 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A,
+ 0x8766, 0x8767, 0x1DA8, 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB,
+ 0x876B, 0x876B, 0x1F6B, 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F,
+ 0x876F, 0x8775, 0x1DB1, 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8,
+ 0x8784, 0x8784, 0x1F77, 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA,
+ 0x8791, 0x8791, 0x02F9, 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8,
+ 0x879A, 0x879A, 0x0300, 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465,
+ 0x8940, 0x897E, 0x04C3, 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F,
+ 0x8A80, 0x8AFC, 0x05BE, 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A,
+ 0x8C40, 0x8C7E, 0x06F7, 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3,
+ 0x8D80, 0x8DFC, 0x07F2, 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE,
+ 0x8F40, 0x8F7E, 0x092B, 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7,
+ 0x9080, 0x90FC, 0x0A26, 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2,
+ 0x9240, 0x927E, 0x0B5F, 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B,
+ 0x9380, 0x93FC, 0x0C5A, 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16,
+ 0x9540, 0x957E, 0x0D93, 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F,
+ 0x9680, 0x96FC, 0x0E8E, 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A,
+ 0x9840, 0x9872, 0x0FC7, 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058,
+ 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153,
+ 0x9B40, 0x9B7E, 0x11D0, 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C,
+ 0x9C80, 0x9CFC, 0x12CB, 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387,
+ 0x9E40, 0x9E7E, 0x1404, 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0,
+ 0x9F80, 0x9FFC, 0x14FF, 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB,
+ 0xE140, 0xE17E, 0x1638, 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4,
+ 0xE280, 0xE2FC, 0x1733, 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF,
+ 0xE440, 0xE47E, 0x186C, 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928,
+ 0xE580, 0xE5FC, 0x1967, 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23,
+ 0xE740, 0xE77E, 0x1AA0, 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C,
+ 0xE880, 0xE8FC, 0x1B9B, 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57,
+ 0xEA40, 0xEA7E, 0x1CD4, 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C,
+ 0xED40, 0xED7E, 0x20A7, 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9,
+ 0xEDB5, 0xEDFC, 0x211A, 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1,
+ 0xEEEF, 0xEEF8, 0x1F9C, 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,
+ 0xFA40, 0xFA49, 0x1F9C, 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF,
+ 0xFA55, 0xFA57, 0x1F45, 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA,
+ 0xFA5A, 0xFA5A, 0x1F77, 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7,
+ 0xFA80, 0xFACF, 0x20CA, 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A,
+ 0xFB40, 0xFB7E, 0x2146, 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp
new file mode 100644
index 0000000000..caf81ed563
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90ms_RKSJ_V_2[78 * 3] = {
+ 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+ 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+ 0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,
+ 0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,
+ 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,
+ 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,
+ 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,
+ 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+ 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+ 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+ 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+ 0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,
+ 0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,
+ 0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,
+ 0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,
+ 0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,
+ 0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,
+ 0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,
+ 0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,
+ 0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,
+ 0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,
+ 0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,
+ 0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,
+ 0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,
+ 0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
new file mode 100644
index 0000000000..d0d8c2d0f3
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90msp_RKSJ_H_2[170 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+ 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
+ 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
+ 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+ 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,
+ 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,
+ 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x849F, 0x849F, 0x1D37,
+ 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43, 0x84A2, 0x84A2, 0x1D47,
+ 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B, 0x84A5, 0x84A5, 0x1D53,
+ 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B, 0x84A8, 0x84A8, 0x1D6B,
+ 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38, 0x84AB, 0x84AB, 0x1D3A,
+ 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A, 0x84AE, 0x84AE, 0x1D52,
+ 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A, 0x84B1, 0x84B1, 0x1D6A,
+ 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72, 0x84B4, 0x84B4, 0x1D82,
+ 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66, 0x84B7, 0x84B7, 0x1D5F,
+ 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76, 0x84BA, 0x84BA, 0x1D54,
+ 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C, 0x84BD, 0x84BD, 0x1D6F,
+ 0x84BE, 0x84BE, 0x1D79, 0x8740, 0x875D, 0x1D83, 0x875F, 0x8760, 0x1DA1,
+ 0x8761, 0x8761, 0x1F66, 0x8762, 0x8762, 0x1DA4, 0x8763, 0x8763, 0x1F68,
+ 0x8764, 0x8764, 0x1DA6, 0x8765, 0x8765, 0x1F6A, 0x8766, 0x8767, 0x1DA8,
+ 0x8768, 0x8768, 0x1F6C, 0x8769, 0x876A, 0x1DAB, 0x876B, 0x876B, 0x1F6B,
+ 0x876C, 0x876D, 0x1DAE, 0x876E, 0x876E, 0x1F6F, 0x876F, 0x8775, 0x1DB1,
+ 0x877E, 0x877E, 0x2083, 0x8780, 0x8783, 0x1DB8, 0x8784, 0x8784, 0x1F77,
+ 0x8785, 0x878F, 0x1DBD, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,
+ 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,
+ 0x879B, 0x879C, 0x1DCF, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
+ 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
+ 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
+ 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
+ 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
+ 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
+ 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
+ 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
+ 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
+ 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
+ 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
+ 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
+ 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
+ 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
+ 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
+ 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
+ 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
+ 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
+ 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
+ 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
+ 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
+ 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
+ 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xED40, 0xED7E, 0x20A7,
+ 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,
+ 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,
+ 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45, 0xFA40, 0xFA49, 0x1F9C,
+ 0xFA4A, 0xFA53, 0x1D97, 0xFA54, 0xFA54, 0x02EF, 0xFA55, 0xFA57, 0x1F45,
+ 0xFA58, 0xFA58, 0x1DC2, 0xFA59, 0xFA59, 0x1DBA, 0xFA5A, 0xFA5A, 0x1F77,
+ 0xFA5B, 0xFA5B, 0x0300, 0xFA5C, 0xFA7E, 0x20A7, 0xFA80, 0xFACF, 0x20CA,
+ 0xFAD0, 0xFAD0, 0x07C9, 0xFAD1, 0xFAFC, 0x211A, 0xFB40, 0xFB7E, 0x2146,
+ 0xFB80, 0xFBFC, 0x2185, 0xFC40, 0xFC4B, 0x2202,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp
new file mode 100644
index 0000000000..f558c6a93a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90msp_RKSJ_V_2[78 * 3] = {
+ 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+ 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+ 0x8169, 0x817A, 0x1EDB, 0x8181, 0x8181, 0x1EED, 0x81A8, 0x81A8, 0x02E3,
+ 0x81A9, 0x81A9, 0x02E2, 0x81AA, 0x81AB, 0x02E0, 0x81AC, 0x81AC, 0x204E,
+ 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0,
+ 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3,
+ 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6,
+ 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+ 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+ 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+ 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+ 0x849F, 0x849F, 0x1D39, 0x84A0, 0x84A0, 0x1D37, 0x84A1, 0x84A1, 0x1D47,
+ 0x84A2, 0x84A2, 0x1D4F, 0x84A3, 0x84A3, 0x1D4B, 0x84A4, 0x84A4, 0x1D43,
+ 0x84A5, 0x84A5, 0x1D63, 0x84A6, 0x84A6, 0x1D5B, 0x84A7, 0x84A7, 0x1D6B,
+ 0x84A8, 0x84A8, 0x1D53, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D3A,
+ 0x84AB, 0x84AB, 0x1D38, 0x84AC, 0x84AC, 0x1D4A, 0x84AD, 0x84AD, 0x1D52,
+ 0x84AE, 0x84AE, 0x1D4E, 0x84AF, 0x84AF, 0x1D46, 0x84B0, 0x84B0, 0x1D6A,
+ 0x84B1, 0x84B1, 0x1D62, 0x84B2, 0x84B2, 0x1D72, 0x84B3, 0x84B3, 0x1D5A,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D66, 0x84B6, 0x84B6, 0x1D5F,
+ 0x84B7, 0x84B7, 0x1D6E, 0x84B8, 0x84B8, 0x1D57, 0x84B9, 0x84B9, 0x1D79,
+ 0x84BA, 0x84BA, 0x1D67, 0x84BB, 0x84BB, 0x1D5C, 0x84BC, 0x84BC, 0x1D6F,
+ 0x84BD, 0x84BD, 0x1D54, 0x84BE, 0x84BE, 0x1D76, 0x875F, 0x8760, 0x1F04,
+ 0x8761, 0x8761, 0x2089, 0x8762, 0x8762, 0x1F07, 0x8763, 0x8763, 0x2093,
+ 0x8764, 0x8764, 0x1F09, 0x8765, 0x8765, 0x2092, 0x8766, 0x8767, 0x1F0B,
+ 0x8768, 0x8768, 0x2098, 0x8769, 0x876A, 0x1F0E, 0x876B, 0x876B, 0x209C,
+ 0x876C, 0x876D, 0x1F11, 0x876E, 0x876E, 0x209D, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
new file mode 100644
index 0000000000..504d4dc3c7
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp
@@ -0,0 +1,96 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_90pv_RKSJ_H_1[263 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0080, 0x0080, 0x0061, 0x00A0, 0x00DF, 0x0146,
+ 0x00FD, 0x00FD, 0x0098, 0x00FE, 0x00FE, 0x00E4, 0x00FF, 0x00FF, 0x007C,
+ 0x8140, 0x817E, 0x0279, 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5,
+ 0x81C8, 0x81CE, 0x02ED, 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303,
+ 0x81FC, 0x81FC, 0x030B, 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316,
+ 0x8281, 0x829A, 0x0330, 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x8540, 0x8553, 0x1D83,
+ 0x855E, 0x8571, 0x1F87, 0x857C, 0x857E, 0x205E, 0x8580, 0x8585, 0x2061,
+ 0x8591, 0x859A, 0x1F7D, 0x859F, 0x85A8, 0x1D97, 0x85A9, 0x85AA, 0x2021,
+ 0x85AB, 0x85AD, 0x2067, 0x85B3, 0x85BC, 0x1F9C, 0x85BD, 0x85C1, 0x206A,
+ 0x85DB, 0x85F4, 0x1FB0, 0x8640, 0x8640, 0x1DB1, 0x8641, 0x8641, 0x1FFA,
+ 0x8642, 0x8642, 0x1DB2, 0x8643, 0x8643, 0x1F54, 0x8644, 0x8644, 0x1F56,
+ 0x8645, 0x8645, 0x206F, 0x8646, 0x8646, 0x1DB7, 0x8647, 0x8647, 0x1F57,
+ 0x8648, 0x8648, 0x1DB3, 0x8649, 0x8649, 0x1F55, 0x864A, 0x864A, 0x1DB4,
+ 0x864B, 0x864B, 0x2070, 0x864C, 0x864D, 0x1DB5, 0x864E, 0x864E, 0x1F65,
+ 0x864F, 0x8655, 0x1F58, 0x8656, 0x8656, 0x2071, 0x8657, 0x8657, 0x1F64,
+ 0x8658, 0x8659, 0x1F62, 0x865A, 0x865C, 0x1F5F, 0x865D, 0x865D, 0x2072,
+ 0x869B, 0x869D, 0x1DBA, 0x869E, 0x869E, 0x2073, 0x869F, 0x869F, 0x1F52,
+ 0x86A0, 0x86A1, 0x1F50, 0x86A2, 0x86A2, 0x1F53, 0x86A3, 0x86A3, 0x2013,
+ 0x86A4, 0x86A4, 0x2015, 0x86A5, 0x86A5, 0x2014, 0x86A6, 0x86A6, 0x2016,
+ 0x86B3, 0x86B3, 0x1F7A, 0x86B4, 0x86B4, 0x1F78, 0x86B5, 0x86B5, 0x2074,
+ 0x86C7, 0x86CA, 0x201B, 0x86CB, 0x86CE, 0x2075, 0x86CF, 0x86CF, 0x1F4E,
+ 0x86D0, 0x86D0, 0x1F4D, 0x86D1, 0x86D1, 0x1F4C, 0x86D2, 0x86D2, 0x1F4B,
+ 0x86D3, 0x86D6, 0x200E, 0x8740, 0x8746, 0x2005, 0x8747, 0x8747, 0x1FD6,
+ 0x8748, 0x8748, 0x200C, 0x8749, 0x8749, 0x1FD1, 0x874A, 0x874A, 0x1FCA,
+ 0x874B, 0x874B, 0x1DC4, 0x874C, 0x874C, 0x1FD7, 0x874D, 0x874D, 0x1DC2,
+ 0x874E, 0x874E, 0x1FD2, 0x874F, 0x874F, 0x1FCD, 0x8750, 0x8750, 0x1DC3,
+ 0x8751, 0x8751, 0x1FD5, 0x8752, 0x8752, 0x1FD3, 0x8753, 0x8753, 0x1FCF,
+ 0x8754, 0x8754, 0x1FD4, 0x8755, 0x8755, 0x1FD0, 0x8756, 0x8757, 0x1FCB,
+ 0x8758, 0x8758, 0x1FCE, 0x8791, 0x8792, 0x207D, 0x8793, 0x8797, 0x1DBD,
+ 0x8798, 0x8798, 0x1FDA, 0x8799, 0x8799, 0x1FE5, 0x879A, 0x879A, 0x207F,
+ 0x879B, 0x879B, 0x1FDE, 0x879C, 0x879C, 0x1FFF, 0x879D, 0x879D, 0x2080,
+ 0x879E, 0x879E, 0x201F, 0x879F, 0x879F, 0x1DA1, 0x87A0, 0x87A0, 0x1F66,
+ 0x87A1, 0x87A1, 0x1DA4, 0x87A2, 0x87A2, 0x1DA2, 0x87A3, 0x87A3, 0x1F67,
+ 0x87A4, 0x87A4, 0x1FF7, 0x87A5, 0x87A6, 0x2087, 0x87A7, 0x87A7, 0x1F6A,
+ 0x87A8, 0x87A8, 0x1DA8, 0x87A9, 0x87AA, 0x1F68, 0x87AB, 0x87AB, 0x1DA6,
+ 0x87AC, 0x87AC, 0x1DA9, 0x87AD, 0x87AD, 0x1DAF, 0x87AE, 0x87AE, 0x1F6E,
+ 0x87AF, 0x87AF, 0x1F6C, 0x87B0, 0x87B0, 0x1DAB, 0x87B1, 0x87B1, 0x1F6D,
+ 0x87B2, 0x87B2, 0x1F6B, 0x87B3, 0x87B3, 0x1DAC, 0x87B4, 0x87B4, 0x1F6F,
+ 0x87B5, 0x87B5, 0x1DAE, 0x87BD, 0x87BD, 0x1F70, 0x87BE, 0x87BF, 0x1F73,
+ 0x87C0, 0x87C1, 0x1F71, 0x87E5, 0x87E7, 0x1DC5, 0x87E8, 0x87E8, 0x2083,
+ 0x87FA, 0x87FA, 0x1F76, 0x87FB, 0x87FC, 0x2081, 0x8840, 0x8840, 0x1DC8,
+ 0x8841, 0x8842, 0x1DCD, 0x8854, 0x8855, 0x1DB8, 0x8868, 0x8868, 0x1F16,
+ 0x886A, 0x886D, 0x2079, 0x889F, 0x88FC, 0x0465, 0x8940, 0x897E, 0x04C3,
+ 0x8980, 0x89FC, 0x0502, 0x8A40, 0x8A7E, 0x057F, 0x8A80, 0x8AFC, 0x05BE,
+ 0x8B40, 0x8B7E, 0x063B, 0x8B80, 0x8BFC, 0x067A, 0x8C40, 0x8C7E, 0x06F7,
+ 0x8C80, 0x8CFC, 0x0736, 0x8D40, 0x8D7E, 0x07B3, 0x8D80, 0x8DFC, 0x07F2,
+ 0x8E40, 0x8E7E, 0x086F, 0x8E80, 0x8EFC, 0x08AE, 0x8F40, 0x8F7E, 0x092B,
+ 0x8F80, 0x8FFC, 0x096A, 0x9040, 0x907E, 0x09E7, 0x9080, 0x90FC, 0x0A26,
+ 0x9140, 0x917E, 0x0AA3, 0x9180, 0x91FC, 0x0AE2, 0x9240, 0x927E, 0x0B5F,
+ 0x9280, 0x92FC, 0x0B9E, 0x9340, 0x937E, 0x0C1B, 0x9380, 0x93FC, 0x0C5A,
+ 0x9440, 0x947E, 0x0CD7, 0x9480, 0x94FC, 0x0D16, 0x9540, 0x957E, 0x0D93,
+ 0x9580, 0x95FC, 0x0DD2, 0x9640, 0x967E, 0x0E4F, 0x9680, 0x96FC, 0x0E8E,
+ 0x9740, 0x977E, 0x0F0B, 0x9780, 0x97FC, 0x0F4A, 0x9840, 0x9872, 0x0FC7,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x997E, 0x1058, 0x9980, 0x99FC, 0x1097,
+ 0x9A40, 0x9A7E, 0x1114, 0x9A80, 0x9AFC, 0x1153, 0x9B40, 0x9B7E, 0x11D0,
+ 0x9B80, 0x9BFC, 0x120F, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CFC, 0x12CB,
+ 0x9D40, 0x9D7E, 0x1348, 0x9D80, 0x9DFC, 0x1387, 0x9E40, 0x9E7E, 0x1404,
+ 0x9E80, 0x9EFC, 0x1443, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FFC, 0x14FF,
+ 0xE040, 0xE07E, 0x157C, 0xE080, 0xE0FC, 0x15BB, 0xE140, 0xE17E, 0x1638,
+ 0xE180, 0xE1FC, 0x1677, 0xE240, 0xE27E, 0x16F4, 0xE280, 0xE2FC, 0x1733,
+ 0xE340, 0xE37E, 0x17B0, 0xE380, 0xE3FC, 0x17EF, 0xE440, 0xE47E, 0x186C,
+ 0xE480, 0xE4FC, 0x18AB, 0xE540, 0xE57E, 0x1928, 0xE580, 0xE5FC, 0x1967,
+ 0xE640, 0xE67E, 0x19E4, 0xE680, 0xE6FC, 0x1A23, 0xE740, 0xE77E, 0x1AA0,
+ 0xE780, 0xE7FC, 0x1ADF, 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8FC, 0x1B9B,
+ 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9FC, 0x1C57, 0xEA40, 0xEA7E, 0x1CD4,
+ 0xEA80, 0xEAA2, 0x1D13, 0xEAA3, 0xEAA4, 0x205C, 0xEB41, 0xEB42, 0x1ECF,
+ 0xEB50, 0xEB51, 0x1ED1, 0xEB5B, 0xEB5D, 0x1ED3, 0xEB60, 0xEB64, 0x1ED6,
+ 0xEB69, 0xEB7A, 0x1EDB, 0xEB81, 0xEB81, 0x1EED, 0xEC9F, 0xEC9F, 0x1EEE,
+ 0xECA1, 0xECA1, 0x1EEF, 0xECA3, 0xECA3, 0x1EF0, 0xECA5, 0xECA5, 0x1EF1,
+ 0xECA7, 0xECA7, 0x1EF2, 0xECC1, 0xECC1, 0x1EF3, 0xECE1, 0xECE1, 0x1EF4,
+ 0xECE3, 0xECE3, 0x1EF5, 0xECE5, 0xECE5, 0x1EF6, 0xECEC, 0xECEC, 0x1EF7,
+ 0xED40, 0xED40, 0x1EF8, 0xED42, 0xED42, 0x1EF9, 0xED44, 0xED44, 0x1EFA,
+ 0xED46, 0xED46, 0x1EFB, 0xED48, 0xED48, 0x1EFC, 0xED62, 0xED62, 0x1EFD,
+ 0xED83, 0xED83, 0x1EFE, 0xED85, 0xED85, 0x1EFF, 0xED87, 0xED87, 0x1F00,
+ 0xED8E, 0xED8E, 0x1F01, 0xED95, 0xED96, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
new file mode 100644
index 0000000000..fd580d50a1
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp
@@ -0,0 +1,220 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Add_RKSJ_H_1[635 * 3] = {
+ 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+ 0x8180, 0x81AC, 0x02B8, 0x81B8, 0x81BF, 0x02E5, 0x81C8, 0x81CE, 0x02ED,
+ 0x81DA, 0x81E8, 0x02F4, 0x81F0, 0x81F7, 0x0303, 0x81FC, 0x81FC, 0x030B,
+ 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+ 0x829F, 0x82F1, 0x034A, 0x82F2, 0x82F4, 0x1F16, 0x8340, 0x837E, 0x039D,
+ 0x8380, 0x8396, 0x03DC, 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B,
+ 0x8440, 0x8460, 0x0423, 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453,
+ 0x849F, 0x849F, 0x1D37, 0x84A0, 0x84A0, 0x1D39, 0x84A1, 0x84A1, 0x1D43,
+ 0x84A2, 0x84A2, 0x1D47, 0x84A3, 0x84A3, 0x1D4F, 0x84A4, 0x84A4, 0x1D4B,
+ 0x84A5, 0x84A5, 0x1D53, 0x84A6, 0x84A6, 0x1D63, 0x84A7, 0x84A7, 0x1D5B,
+ 0x84A8, 0x84A8, 0x1D6B, 0x84A9, 0x84A9, 0x1D73, 0x84AA, 0x84AA, 0x1D38,
+ 0x84AB, 0x84AB, 0x1D3A, 0x84AC, 0x84AC, 0x1D46, 0x84AD, 0x84AD, 0x1D4A,
+ 0x84AE, 0x84AE, 0x1D52, 0x84AF, 0x84AF, 0x1D4E, 0x84B0, 0x84B0, 0x1D5A,
+ 0x84B1, 0x84B1, 0x1D6A, 0x84B2, 0x84B2, 0x1D62, 0x84B3, 0x84B3, 0x1D72,
+ 0x84B4, 0x84B4, 0x1D82, 0x84B5, 0x84B5, 0x1D57, 0x84B6, 0x84B6, 0x1D66,
+ 0x84B7, 0x84B7, 0x1D5F, 0x84B8, 0x84B8, 0x1D6E, 0x84B9, 0x84B9, 0x1D76,
+ 0x84BA, 0x84BA, 0x1D54, 0x84BB, 0x84BB, 0x1D67, 0x84BC, 0x84BC, 0x1D5C,
+ 0x84BD, 0x84BD, 0x1D6F, 0x84BE, 0x84BE, 0x1D79, 0x889F, 0x889F, 0x0465,
+ 0x88A0, 0x88A0, 0x1DD1, 0x88A1, 0x88AF, 0x0467, 0x88B0, 0x88B0, 0x1F19,
+ 0x88B1, 0x88B8, 0x0477, 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480,
+ 0x88EC, 0x88EC, 0x1DD3, 0x88ED, 0x88EE, 0x04B3, 0x88EF, 0x88EF, 0x1F1A,
+ 0x88F0, 0x88F0, 0x04B6, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,
+ 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,
+ 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8951, 0x04CD, 0x8952, 0x8952, 0x1F1B,
+ 0x8953, 0x8953, 0x04D6, 0x8954, 0x8954, 0x1DD7, 0x8955, 0x8957, 0x04D8,
+ 0x8958, 0x8958, 0x1F1C, 0x8959, 0x895B, 0x04DC, 0x895C, 0x895C, 0x1DDA,
+ 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB, 0x8962, 0x897E, 0x04E5,
+ 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC, 0x898C, 0x89A5, 0x050E,
+ 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x0529, 0x89A8, 0x89A8, 0x1DDE,
+ 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF, 0x89DF, 0x89E4, 0x0561,
+ 0x89E5, 0x89E5, 0x1F1D, 0x89E6, 0x89F7, 0x0568, 0x89F8, 0x89F8, 0x1DE0,
+ 0x89F9, 0x89FC, 0x057B, 0x8A40, 0x8A40, 0x057F, 0x8A41, 0x8A41, 0x1DE2,
+ 0x8A42, 0x8A7E, 0x0581, 0x8A80, 0x8A8A, 0x05BE, 0x8A8B, 0x8A8B, 0x1DE4,
+ 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5, 0x8A94, 0x8A99, 0x05D2,
+ 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,
+ 0x8AC1, 0x8ACA, 0x05FF, 0x8ACB, 0x8ACB, 0x1DE8, 0x8ACC, 0x8AE2, 0x060A,
+ 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,
+ 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,
+ 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B81, 0x067A, 0x8B82, 0x8B82, 0x1F1E,
+ 0x8B83, 0x8B87, 0x067D, 0x8B88, 0x8B88, 0x1F1F, 0x8B89, 0x8B9F, 0x0683,
+ 0x8BA0, 0x8BA0, 0x1DEC, 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED,
+ 0x8BA9, 0x8BBF, 0x06A3, 0x8BC0, 0x8BC0, 0x1F20, 0x8BC1, 0x8BCC, 0x06BB,
+ 0x8BCD, 0x8BCD, 0x1DEE, 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF,
+ 0x8BEC, 0x8BF1, 0x06E6, 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED,
+ 0x8BF9, 0x8BF9, 0x1DF1, 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2,
+ 0x8BFC, 0x8BFC, 0x06F6, 0x8C40, 0x8C55, 0x06F7, 0x8C56, 0x8C56, 0x1DF4,
+ 0x8C57, 0x8C70, 0x070E, 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C7E, 0x0729,
+ 0x8C80, 0x8C90, 0x0736, 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C9C, 0x0748,
+ 0x8C9D, 0x8C9D, 0x1F21, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,
+ 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,
+ 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,
+ 0x8D4B, 0x8D7E, 0x07BE, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,
+ 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,
+ 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,
+ 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,
+ 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,
+ 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,
+ 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,
+ 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E5F, 0x0888, 0x8E60, 0x8E60, 0x1F22,
+ 0x8E61, 0x8E7E, 0x0890, 0x8E80, 0x8EC5, 0x08AE, 0x8EC6, 0x8EC6, 0x1E0D,
+ 0x8EC7, 0x8EDA, 0x08F5, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,
+ 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,
+ 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,
+ 0x8F8C, 0x8F8C, 0x1E13, 0x8F8D, 0x8F91, 0x0977, 0x8F92, 0x8F93, 0x1E15,
+ 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,
+ 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FD2, 0x099C, 0x8FD3, 0x8FD3, 0x1E1A,
+ 0x8FD4, 0x8FDC, 0x09BE, 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8,
+ 0x8FE2, 0x8FE2, 0x1E1C, 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7,
+ 0x9049, 0x9049, 0x1E1D, 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1F23,
+ 0x9079, 0x907E, 0x0A20, 0x9080, 0x9080, 0x1E1F, 0x9081, 0x909F, 0x0A27,
+ 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90E3, 0x0A47, 0x90E4, 0x90E4, 0x1E23,
+ 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90EF, 0x1E24, 0x90F0, 0x90F6, 0x0A96,
+ 0x90F7, 0x90F7, 0x1E26, 0x90F8, 0x90F8, 0x1F24, 0x90F9, 0x90F9, 0x0A9F,
+ 0x90FA, 0x90FB, 0x1F25, 0x90FC, 0x90FC, 0x0AA2, 0x9140, 0x9145, 0x0AA3,
+ 0x9146, 0x9146, 0x1E28, 0x9147, 0x9157, 0x0AAA, 0x9158, 0x9158, 0x1E29,
+ 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A, 0x916C, 0x916D, 0x0ACF,
+ 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2, 0x917E, 0x917E, 0x1E2C,
+ 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D, 0x918A, 0x91B4, 0x0AEC,
+ 0x91B5, 0x91B5, 0x1F27, 0x91B6, 0x91BA, 0x0B18, 0x91BB, 0x91BB, 0x1E2E,
+ 0x91BC, 0x91CA, 0x0B1E, 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E,
+ 0x91DA, 0x91DA, 0x1E30, 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31,
+ 0x91E2, 0x91EC, 0x0B44, 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91FA, 0x0B50,
+ 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E, 0x9240, 0x9245, 0x0B5F,
+ 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66, 0x9248, 0x9248, 0x1E37,
+ 0x9249, 0x924B, 0x0B68, 0x924C, 0x924D, 0x1E39, 0x924E, 0x925B, 0x0B6D,
+ 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C, 0x9280, 0x928F, 0x0B9E,
+ 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF, 0x9295, 0x9295, 0x1E3D,
+ 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E, 0x929D, 0x92BA, 0x0BBB,
+ 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA, 0x92C6, 0x92C6, 0x1E40,
+ 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41, 0x92C9, 0x92CC, 0x0BE7,
+ 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92FC, 0x0BEC, 0x9340, 0x9340, 0x0C1B,
+ 0x9341, 0x9341, 0x1E44, 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45,
+ 0x9347, 0x934C, 0x0C22, 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29,
+ 0x9355, 0x9355, 0x1E47, 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48,
+ 0x935F, 0x9366, 0x0C3A, 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43,
+ 0x936A, 0x936A, 0x1E4A, 0x936B, 0x936F, 0x0C46, 0x9370, 0x9370, 0x1F28,
+ 0x9371, 0x9371, 0x1E4C, 0x9372, 0x937E, 0x0C4D, 0x9380, 0x9383, 0x0C5A,
+ 0x9384, 0x9384, 0x1E4D, 0x9385, 0x9397, 0x0C5F, 0x9398, 0x9398, 0x1E4E,
+ 0x9399, 0x93BF, 0x0C73, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,
+ 0x93D2, 0x93D2, 0x1E51, 0x93D3, 0x93D8, 0x0CAD, 0x93D9, 0x93D9, 0x1E53,
+ 0x93DA, 0x93E3, 0x0CB4, 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0,
+ 0x93E8, 0x93E8, 0x1E58, 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1EC0,
+ 0x93F5, 0x93FC, 0x0CCF, 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59,
+ 0x9449, 0x9449, 0x1F29, 0x944A, 0x9457, 0x0CE1, 0x9458, 0x9458, 0x1E5A,
+ 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B, 0x9477, 0x947E, 0x0D0E,
+ 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C, 0x9488, 0x9488, 0x0D1E,
+ 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20, 0x948D, 0x948D, 0x1E5E,
+ 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F, 0x94A3, 0x94AB, 0x0D39,
+ 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43, 0x94AE, 0x94AE, 0x1E61,
+ 0x94AF, 0x94BD, 0x0D45, 0x94BE, 0x94BE, 0x1F2A, 0x94BF, 0x94D1, 0x0D55,
+ 0x94D2, 0x94D2, 0x1E62, 0x94D3, 0x94F2, 0x0D69, 0x94F3, 0x94F3, 0x1E64,
+ 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93, 0x9541, 0x9542, 0x1E65,
+ 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67, 0x954F, 0x9550, 0x0DA2,
+ 0x9551, 0x9551, 0x1E68, 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69,
+ 0x9555, 0x955E, 0x0DA8, 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3,
+ 0x956D, 0x956D, 0x1E6B, 0x956E, 0x957E, 0x0DC1, 0x9580, 0x95C0, 0x0DD2,
+ 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14, 0x95CB, 0x95CB, 0x1E6E,
+ 0x95CC, 0x95D0, 0x0E1E, 0x95D1, 0x95D1, 0x1F2B, 0x95D2, 0x95D7, 0x0E24,
+ 0x95D8, 0x95D8, 0x1E6F, 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70,
+ 0x95F8, 0x95FC, 0x0E4A, 0x9640, 0x9647, 0x0E4F, 0x9648, 0x9648, 0x1E72,
+ 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73, 0x966B, 0x967E, 0x0E7A,
+ 0x9680, 0x968F, 0x0E8E, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9697, 0x0E9F,
+ 0x9698, 0x9698, 0x1F2C, 0x9699, 0x96CA, 0x0EA7, 0x96CB, 0x96CB, 0x1E75,
+ 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,
+ 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,
+ 0x96E1, 0x96F7, 0x0EEF, 0x96F8, 0x96F8, 0x1E79, 0x96F9, 0x96F9, 0x0F07,
+ 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FC, 0x0F09, 0x9740, 0x9750, 0x0F0B,
+ 0x9751, 0x9751, 0x1E7C, 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D,
+ 0x9770, 0x9772, 0x0F3B, 0x9773, 0x9773, 0x1E7E, 0x9774, 0x977E, 0x0F3F,
+ 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F, 0x978A, 0x97F7, 0x0F54,
+ 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FA, 0x1F2D, 0x97FB, 0x97FC, 0x0FC5,
+ 0x9840, 0x9840, 0x1E83, 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84,
+ 0x9851, 0x9857, 0x0FD8, 0x9858, 0x9858, 0x1E85, 0x9859, 0x9872, 0x0FE0,
+ 0x989F, 0x98FC, 0x0FFA, 0x9940, 0x9940, 0x1058, 0x9941, 0x9941, 0x1F2E,
+ 0x9942, 0x995B, 0x105A, 0x995C, 0x995C, 0x1E86, 0x995D, 0x996B, 0x1075,
+ 0x996C, 0x996C, 0x1E89, 0x996D, 0x997E, 0x1085, 0x9980, 0x99B5, 0x1097,
+ 0x99B6, 0x99B6, 0x1F2F, 0x99B7, 0x99FC, 0x10CE, 0x9A40, 0x9A4E, 0x1114,
+ 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,
+ 0x9A5A, 0x9A66, 0x112E, 0x9A67, 0x9A67, 0x1F30, 0x9A68, 0x9A7C, 0x113C,
+ 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,
+ 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9A8C, 0x1F31, 0x9A8D, 0x9AC1, 0x1160,
+ 0x9AC2, 0x9AC2, 0x1E8F, 0x9AC3, 0x9AC3, 0x1F32, 0x9AC4, 0x9AE9, 0x1197,
+ 0x9AEA, 0x9AEA, 0x1F33, 0x9AEB, 0x9AFC, 0x11BE, 0x9B40, 0x9B5B, 0x11D0,
+ 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED, 0x9B80, 0x9B82, 0x120F,
+ 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B97, 0x1213, 0x9B98, 0x9B98, 0x1F34,
+ 0x9B99, 0x9B9F, 0x1228, 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BFA, 0x1230,
+ 0x9BFB, 0x9BFC, 0x1F35, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,
+ 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D46, 0x1348,
+ 0x9D47, 0x9D47, 0x1F37, 0x9D48, 0x9D7E, 0x1350, 0x9D80, 0x9D80, 0x1E95,
+ 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96, 0x9D8D, 0x9DB6, 0x1394,
+ 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DF7, 0x13BF, 0x9DF8, 0x9DF8, 0x1F38,
+ 0x9DF9, 0x9DFC, 0x1400, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,
+ 0x9E65, 0x9E7E, 0x1429, 0x9E80, 0x9E8A, 0x1443, 0x9E8B, 0x9E8B, 0x1E9B,
+ 0x9E8C, 0x9EFC, 0x144F, 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9F80, 0x14FF,
+ 0x9F81, 0x9F81, 0x1F39, 0x9F82, 0x9FCD, 0x1501, 0x9FCE, 0x9FCE, 0x1E9D,
+ 0x9FCF, 0x9FD3, 0x154E, 0x9FD4, 0x9FD4, 0x1F3A, 0x9FD5, 0x9FF3, 0x1554,
+ 0x9FF4, 0x9FF4, 0x1F3B, 0x9FF5, 0x9FFC, 0x1574, 0xE040, 0xE07E, 0x157C,
+ 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,
+ 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,
+ 0xE0DE, 0xE0FC, 0x1619, 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1,
+ 0xE14B, 0xE17E, 0x1643, 0xE180, 0xE1EC, 0x1677, 0xE1ED, 0xE1ED, 0x1EA5,
+ 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4, 0xE269, 0xE269, 0x1EA6,
+ 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7, 0xE274, 0xE277, 0x1728,
+ 0xE278, 0xE278, 0x1F3C, 0xE279, 0xE27E, 0x172D, 0xE280, 0xE2B6, 0x1733,
+ 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2BD, 0x176B, 0xE2BE, 0xE2BE, 0x1F3D,
+ 0xE2BF, 0xE2E1, 0x1772, 0xE2E2, 0xE2E2, 0x1EA9, 0xE2E3, 0xE2EB, 0x1796,
+ 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0, 0xE340, 0xE357, 0x17B0,
+ 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9, 0xE35A, 0xE35A, 0x1EAC,
+ 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD, 0xE366, 0xE37E, 0x17D6,
+ 0xE380, 0xE3C6, 0x17EF, 0xE3C7, 0xE3C7, 0x1F3E, 0xE3C8, 0xE3FC, 0x1837,
+ 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB, 0xE484, 0xE484, 0x1EAF,
+ 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0, 0xE48A, 0xE491, 0x18B5,
+ 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B8, 0x18BE, 0xE4B9, 0xE4B9, 0x1EB3,
+ 0xE4BA, 0xE4CA, 0x18E5, 0xE4CB, 0xE4CB, 0x1F3F, 0xE4CC, 0xE4FC, 0x18F7,
+ 0xE540, 0xE57E, 0x1928, 0xE580, 0xE59D, 0x1967, 0xE59E, 0xE59E, 0x1F40,
+ 0xE59F, 0xE5B9, 0x1986, 0xE5BA, 0xE5BB, 0x1F41, 0xE5BC, 0xE5EC, 0x19A3,
+ 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5, 0xE640, 0xE650, 0x19E4,
+ 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67E, 0x19F6, 0xE680, 0xE685, 0x1A23,
+ 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE6E6, 0x1A2A, 0xE6E7, 0xE6E7, 0x1EBC,
+ 0xE6E8, 0xE6FC, 0x1A8B, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,
+ 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE7A6, 0x1ADF, 0xE7A7, 0xE7A7, 0x1EC1,
+ 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2, 0xE7BC, 0xE7FC, 0x1B1B,
+ 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE8CE, 0x1B9B, 0xE8CF, 0xE8CF, 0x1EC7,
+ 0xE8D0, 0xE8FC, 0x1BEB, 0xE940, 0xE977, 0x1C18, 0xE978, 0xE978, 0x1F43,
+ 0xE979, 0xE97E, 0x1C51, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,
+ 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CB, 0x1C92,
+ 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9FC, 0x1CA4, 0xEA40, 0xEA6F, 0x1CD4,
+ 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA71, 0x1F44, 0xEA72, 0xEA7E, 0x1D06,
+ 0xEA80, 0xEA9C, 0x1D13, 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEAA2, 0x1D31,
+ 0xEAA3, 0xEAA4, 0x205C, 0xEC40, 0xEC42, 0x1F45, 0xEC46, 0xEC46, 0x1F48,
+ 0xEC47, 0xEC47, 0x0300, 0xEC48, 0xEC48, 0x02FA, 0xEC49, 0xEC49, 0x02F9,
+ 0xEC4D, 0xEC57, 0x1F49, 0xEC5B, 0xEC5D, 0x1DB1, 0xEC5E, 0xEC5E, 0x1F54,
+ 0xEC5F, 0xEC5F, 0x1DB7, 0xEC60, 0xEC62, 0x1F55, 0xEC63, 0xEC65, 0x1DB4,
+ 0xEC66, 0xEC6F, 0x1F58, 0xEC70, 0xEC70, 0x0303, 0xEC71, 0xEC71, 0x1F62,
+ 0xEC72, 0xEC72, 0x0304, 0xEC73, 0xEC74, 0x1F63, 0xEC76, 0xEC76, 0x1F65,
+ 0xEC78, 0xEC78, 0x1DA4, 0xEC79, 0xEC79, 0x1DA1, 0xEC7A, 0xEC7A, 0x1F66,
+ 0xEC7B, 0xEC7B, 0x1DA2, 0xEC7C, 0xEC7E, 0x1F67, 0xEC80, 0xEC80, 0x1DA6,
+ 0xEC81, 0xEC81, 0x1F6A, 0xEC82, 0xEC82, 0x1DA8, 0xEC83, 0xEC83, 0x1DAC,
+ 0xEC84, 0xEC84, 0x1F6B, 0xEC85, 0xEC85, 0x1DAE, 0xEC86, 0xEC86, 0x1DAB,
+ 0xEC87, 0xEC88, 0x1F6C, 0xEC89, 0xEC89, 0x1DAF, 0xEC8A, 0xEC90, 0x1F6E,
+ 0xEC94, 0xEC99, 0x1F75, 0xEC9A, 0xEC9A, 0x1DBA, 0xEC9B, 0xEC9B, 0x1F7B,
+ 0xEC9E, 0xEC9E, 0x1F7C, 0xECA7, 0xECB0, 0x1F7D, 0xECB2, 0xECC5, 0x1F87,
+ 0xECC7, 0xECDA, 0x1D83, 0xECDB, 0xECDB, 0x1F9B, 0xECDC, 0xECE5, 0x1D97,
+ 0xECE9, 0xECFC, 0x1F9C, 0xED40, 0xED59, 0x1FB0, 0xED64, 0xED64, 0x1F16,
+ 0xED68, 0xED69, 0x1FCA, 0xED6A, 0xED6A, 0x1DC4, 0xED6B, 0xED6D, 0x1FCC,
+ 0xED6E, 0xED6E, 0x1DC3, 0xED6F, 0xED73, 0x1FCF, 0xED74, 0xED74, 0x1DC2,
+ 0xED75, 0xED78, 0x1FD4, 0xED7C, 0xED7E, 0x1FD8, 0xED80, 0xED8A, 0x1FDB,
+ 0xED8F, 0xED9E, 0x1FE6, 0xEF40, 0xEF41, 0x1ECF, 0xEF42, 0xEF42, 0x204C,
+ 0xEF43, 0xEF43, 0x2052, 0xEF44, 0xEF4D, 0x1ED1, 0xEF4E, 0xEF4E, 0x205A,
+ 0xEF4F, 0xEF4F, 0x2053, 0xEF50, 0xEF50, 0x2058, 0xEF51, 0xEF51, 0x2055,
+ 0xEF52, 0xEF63, 0x1EDB, 0xEF64, 0xEF79, 0x1EEE, 0xEF7A, 0xEF7B, 0x2048,
+ 0xEF8D, 0xEF90, 0x02E0, 0xEF91, 0xEF94, 0x1FF6,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
new file mode 100644
index 0000000000..8736184dbe
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Add_RKSJ_V_1[57 * 3] = {
+ 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+ 0x8150, 0x8151, 0x1ED1, 0x815B, 0x815D, 0x1ED3, 0x8160, 0x8164, 0x1ED6,
+ 0x8165, 0x8165, 0x205A, 0x8166, 0x8166, 0x2053, 0x8167, 0x8167, 0x2058,
+ 0x8168, 0x8168, 0x2055, 0x8169, 0x817A, 0x1EDB, 0x829F, 0x829F, 0x1EEE,
+ 0x82A1, 0x82A1, 0x1EEF, 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1,
+ 0x82A7, 0x82A7, 0x1EF2, 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4,
+ 0x82E3, 0x82E3, 0x1EF5, 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7,
+ 0x82F3, 0x82F4, 0x2048, 0x8340, 0x8340, 0x1EF8, 0x8342, 0x8342, 0x1EF9,
+ 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB, 0x8348, 0x8348, 0x1EFC,
+ 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE, 0x8385, 0x8385, 0x1EFF,
+ 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01, 0x8395, 0x8396, 0x1F02,
+ 0xEC78, 0xEC78, 0x1F07, 0xEC79, 0xEC79, 0x1F04, 0xEC7A, 0xEC7A, 0x2089,
+ 0xEC7B, 0xEC7B, 0x1F05, 0xEC7C, 0xEC7C, 0x208A, 0xEC7D, 0xEC7E, 0x2093,
+ 0xEC80, 0xEC80, 0x1F09, 0xEC81, 0xEC81, 0x2092, 0xEC82, 0xEC82, 0x1F0B,
+ 0xEC83, 0xEC83, 0x1F0F, 0xEC84, 0xEC84, 0x209C, 0xEC85, 0xEC85, 0x1F11,
+ 0xEC86, 0xEC86, 0x1F0E, 0xEC87, 0xEC87, 0x2098, 0xEC88, 0xEC88, 0x209B,
+ 0xEC89, 0xEC89, 0x1F12, 0xEC8A, 0xEC8A, 0x2097, 0xEC8B, 0xEC8C, 0x209D,
+ 0xEC8D, 0xEC8D, 0x20A6, 0xEC8E, 0xEC8E, 0x20A5, 0xEC8F, 0xEC8F, 0x20A1,
+ 0xEC90, 0xEC90, 0x20A4, 0xEC95, 0xEC95, 0x2084, 0xEF92, 0xEF92, 0x208D,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
new file mode 100644
index 0000000000..e0080a1059
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp
@@ -0,0 +1,1939 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Japan1CID2Unicode_4[15444] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303,
+ 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3,
+ 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A,
+ 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022,
+ 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301,
+ 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B,
+ 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152,
+ 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D,
+ 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5,
+ 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3,
+ 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC,
+ 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4,
+ 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD,
+ 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160,
+ 0x0178, 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x0020,
+ 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+ 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+ 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+ 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF60, 0xFF61,
+ 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69,
+ 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71,
+ 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79,
+ 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81,
+ 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89,
+ 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91,
+ 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99,
+ 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0xFF40, 0x30F0,
+ 0x30F1, 0x30EE, 0x30AB, 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0,
+ 0x30B2, 0x30B4, 0x30B6, 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0,
+ 0x30C2, 0x30C5, 0x30C7, 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4,
+ 0x30D6, 0x30D7, 0x30D9, 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x301D,
+ 0x301E, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506,
+ 0x2507, 0x2508, 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E,
+ 0x250F, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516,
+ 0x2517, 0x2518, 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E,
+ 0x251F, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,
+ 0x2527, 0x2528, 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E,
+ 0x252F, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,
+ 0x2537, 0x2538, 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E,
+ 0x253F, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,
+ 0x2547, 0x2548, 0x2549, 0x254A, 0x254B, 0x2032, 0x00A8, 0x2036,
+ 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E, 0x300F,
+ 0x3010, 0x3011, 0x2012, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
+ 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
+ 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
+ 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x00C4,
+ 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7, 0x00D1, 0x00F1,
+ 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF, 0x00BD, 0x00D6,
+ 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC, 0x00E2, 0x00EA,
+ 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x25B2, 0x00E1, 0x007E,
+ 0x0030, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,
+ 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,
+ 0xFF3E, 0x203E, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,
+ 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,
+ 0xFF3C, 0xFF5E, 0x2016, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,
+ 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,
+ 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,
+ 0xFF04, 0x00A2, 0x00A3, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,
+ 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x203B, 0x3012,
+ 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0x2208, 0x220B, 0x2286,
+ 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0x00AC,
+ 0x21D2, 0x21D4, 0x2200, 0x2203, 0x2220, 0x22A5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,
+ 0x2235, 0x222B, 0x222C, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A,
+ 0x2020, 0x2021, 0x00B6, 0x25EF, 0xFF10, 0xFF11, 0xFF12, 0xFF13,
+ 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18, 0xFF19, 0xFF21, 0xFF22,
+ 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A,
+ 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32,
+ 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A,
+ 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
+ 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
+ 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
+ 0xFF59, 0xFF5A, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+ 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E,
+ 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,
+ 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E,
+ 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,
+ 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
+ 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
+ 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E,
+ 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086,
+ 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E,
+ 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2, 0x30A3,
+ 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30AB,
+ 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2, 0x30B3,
+ 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB,
+ 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3,
+ 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB,
+ 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3,
+ 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB,
+ 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3,
+ 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
+ 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
+ 0x30F4, 0x30F5, 0x30F6, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395,
+ 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D,
+ 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6,
+ 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5,
+ 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD,
+ 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,
+ 0x03C7, 0x03C8, 0x03C9, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414,
+ 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B,
+ 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423,
+ 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B,
+ 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433,
+ 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A,
+ 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442,
+ 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A,
+ 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0x4E9C, 0x5516, 0x5A03,
+ 0x963F, 0x54C0, 0x611B, 0x6328, 0x59F6, 0x9022, 0x8475, 0x831C,
+ 0x7A50, 0x60AA, 0x63E1, 0x6E25, 0x65ED, 0x8466, 0x82A6, 0x9BF5,
+ 0x6893, 0x5727, 0x65A1, 0x6271, 0x5B9B, 0x59D0, 0x867B, 0x98F4,
+ 0x7D62, 0x7DBE, 0x9B8E, 0x6216, 0x7C9F, 0x88B7, 0x5B89, 0x5EB5,
+ 0x6309, 0x6697, 0x6848, 0x95C7, 0x978D, 0x674F, 0x4EE5, 0x4F0A,
+ 0x4F4D, 0x4F9D, 0x5049, 0x56F2, 0x5937, 0x59D4, 0x5A01, 0x5C09,
+ 0x60DF, 0x610F, 0x6170, 0x6613, 0x6905, 0x70BA, 0x754F, 0x7570,
+ 0x79FB, 0x7DAD, 0x7DEF, 0x80C3, 0x840E, 0x8863, 0x8B02, 0x9055,
+ 0x907A, 0x533B, 0x4E95, 0x4EA5, 0x57DF, 0x80B2, 0x90C1, 0x78EF,
+ 0x4E00, 0x58F1, 0x6EA2, 0x9038, 0x7A32, 0x8328, 0x828B, 0x9C2F,
+ 0x5141, 0x5370, 0x54BD, 0x54E1, 0x56E0, 0x59FB, 0x5F15, 0x98F2,
+ 0x6DEB, 0x80E4, 0x852D, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B,
+ 0x53F3, 0x5B87, 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C,
+ 0x7ABA, 0x4E11, 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D,
+ 0x851A, 0x9C3B, 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642,
+ 0x4E91, 0x904B, 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30,
+ 0x5F71, 0x6620, 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B,
+ 0x76C8, 0x7A4E, 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2,
+ 0x75AB, 0x76CA, 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E,
+ 0x53AD, 0x5186, 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028,
+ 0x63A9, 0x63F4, 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5,
+ 0x733F, 0x7E01, 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B,
+ 0x5869, 0x65BC, 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80,
+ 0x5FDC, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,
+ 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,
+ 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,
+ 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,
+ 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,
+ 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,
+ 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,
+ 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,
+ 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,
+ 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,
+ 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,
+ 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, 0x9B41,
+ 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686, 0x7D75, 0x82A5,
+ 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE, 0x5916, 0x54B3,
+ 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D, 0x84CB, 0x8857,
+ 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9, 0x57A3, 0x67FF,
+ 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3, 0x62E1, 0x64B9,
+ 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B, 0x899A, 0x89D2,
+ 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769, 0x5B66, 0x5CB3,
+ 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B, 0x6A7F, 0x68B6,
+ 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC, 0x6D3B, 0x6E07,
+ 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39, 0x53F6, 0x691B,
+ 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2, 0x91DC, 0x938C,
+ 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, 0x7CA5, 0x5208, 0x82C5,
+ 0x74E6, 0x4E7E, 0x4F83, 0x51A0, 0x5BD2, 0x520A, 0x52D8, 0x52E7,
+ 0x5DFB, 0x559A, 0x582A, 0x59E6, 0x5B8C, 0x5B98, 0x5BDB, 0x5E72,
+ 0x5E79, 0x60A3, 0x611F, 0x6163, 0x61BE, 0x63DB, 0x6562, 0x67D1,
+ 0x6853, 0x68FA, 0x6B3E, 0x6B53, 0x6C57, 0x6F22, 0x6F97, 0x6F45,
+ 0x74B0, 0x7518, 0x76E3, 0x770B, 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9,
+ 0x7F36, 0x7FF0, 0x809D, 0x8266, 0x839E, 0x89B3, 0x8ACC, 0x8CAB,
+ 0x9084, 0x9451, 0x9593, 0x9591, 0x95A2, 0x9665, 0x97D3, 0x9928,
+ 0x8218, 0x4E38, 0x542B, 0x5CB8, 0x5DCC, 0x73A9, 0x764C, 0x773C,
+ 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1, 0x9811, 0x9854, 0x9858, 0x4F01,
+ 0x4F0E, 0x5371, 0x559C, 0x5668, 0x57FA, 0x5947, 0x5B09, 0x5BC4,
+ 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC, 0x63EE, 0x673A, 0x65D7, 0x65E2,
+ 0x671F, 0x68CB, 0x68C4, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D,
+ 0x757F, 0x7948, 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18,
+ 0x8CB4, 0x8D77, 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80,
+ 0x507D, 0x5100, 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A,
+ 0x72A0, 0x7591, 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC,
+ 0x83CA, 0x97A0, 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70,
+ 0x7827, 0x6775, 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006,
+ 0x4E18, 0x4E45, 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13,
+ 0x6025, 0x6551, 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403,
+ 0x7A76, 0x7AAE, 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B,
+ 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A,
+ 0x8A31, 0x8DDD, 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB,
+ 0x4EAC, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,
+ 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,
+ 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,
+ 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,
+ 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,
+ 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,
+ 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,
+ 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,
+ 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,
+ 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,
+ 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,
+ 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, 0x6398,
+ 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A, 0x9688, 0x7C82,
+ 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B, 0x85AB, 0x8A13,
+ 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941, 0x4FC2, 0x50BE,
+ 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B, 0x5951, 0x5F62,
+ 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2, 0x643A, 0x656C,
+ 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB, 0x7D4C, 0x7D99,
+ 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08, 0x8A63, 0x8B66,
+ 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8, 0x5287, 0x621F,
+ 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20, 0x6C7A, 0x6F54,
+ 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6, 0x5039, 0x5026,
+ 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F, 0x5805, 0x5ACC,
+ 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, 0x691C, 0x6A29, 0x727D,
+ 0x72AC, 0x732E, 0x7814, 0x786F, 0x7D79, 0x770C, 0x80A9, 0x898B,
+ 0x8B19, 0x8CE2, 0x8ED2, 0x9063, 0x9375, 0x967A, 0x9855, 0x9A13,
+ 0x9E78, 0x5143, 0x539F, 0x53B3, 0x5E7B, 0x5F26, 0x6E1B, 0x6E90,
+ 0x7384, 0x73FE, 0x7D43, 0x8237, 0x8A00, 0x8AFA, 0x9650, 0x4E4E,
+ 0x500B, 0x53E4, 0x547C, 0x56FA, 0x59D1, 0x5B64, 0x5DF1, 0x5EAB,
+ 0x5F27, 0x6238, 0x6545, 0x67AF, 0x6E56, 0x72D0, 0x7CCA, 0x88B4,
+ 0x80A1, 0x80E1, 0x83F0, 0x864E, 0x8A87, 0x8DE8, 0x9237, 0x96C7,
+ 0x9867, 0x9F13, 0x4E94, 0x4E92, 0x4F0D, 0x5348, 0x5449, 0x543E,
+ 0x5A2F, 0x5F8C, 0x5FA1, 0x609F, 0x68A7, 0x6A8E, 0x745A, 0x7881,
+ 0x8A9E, 0x8AA4, 0x8B77, 0x9190, 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C,
+ 0x4FAF, 0x5019, 0x5016, 0x5149, 0x516C, 0x529F, 0x52B9, 0x52FE,
+ 0x539A, 0x53E3, 0x5411, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D,
+ 0x5B54, 0x5B5D, 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83,
+ 0x5E9A, 0x5EB7, 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7,
+ 0x653B, 0x6602, 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB,
+ 0x6C5F, 0x6D2A, 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C,
+ 0x7A3F, 0x7CE0, 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003,
+ 0x80AF, 0x80B1, 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861,
+ 0x8B1B, 0x8CA2, 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC,
+ 0x95A4, 0x964D, 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB,
+ 0x53F7, 0x5408, 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9,
+ 0x514B, 0x523B, 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2,
+ 0x7344, 0x6F09, 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB,
+ 0x8FBC, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,
+ 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,
+ 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,
+ 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,
+ 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,
+ 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,
+ 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,
+ 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,
+ 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,
+ 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,
+ 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,
+ 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, 0x5BDF,
+ 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9, 0x96D1, 0x7690,
+ 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652, 0x4E09, 0x5098,
+ 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F, 0x71E6, 0x73CA,
+ 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB, 0x9178, 0x9910,
+ 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A, 0x4F7F, 0x523A,
+ 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB, 0x59C9, 0x59FF,
+ 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D, 0x6307, 0x652F,
+ 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62, 0x6B7B, 0x6C0F,
+ 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B, 0x80A2, 0x8102,
+ 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C, 0x8AEE, 0x8CC7,
+ 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C, 0x4F8D, 0x5150,
+ 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, 0x6B21, 0x6ECB, 0x6CBB,
+ 0x723E, 0x74BD, 0x75D4, 0x78C1, 0x793A, 0x800C, 0x8033, 0x81EA,
+ 0x8494, 0x8F9E, 0x6C50, 0x9E7F, 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA,
+ 0x8EF8, 0x5B8D, 0x96EB, 0x4E03, 0x53F1, 0x57F7, 0x5931, 0x5AC9,
+ 0x5BA4, 0x6089, 0x6E7F, 0x6F06, 0x75BE, 0x8CEA, 0x5B9F, 0x8500,
+ 0x7BE0, 0x5072, 0x67F4, 0x829D, 0x5C61, 0x854A, 0x7E1E, 0x820E,
+ 0x5199, 0x5C04, 0x6368, 0x8D66, 0x659C, 0x716E, 0x793E, 0x7D17,
+ 0x8005, 0x8B1D, 0x8ECA, 0x906E, 0x86C7, 0x90AA, 0x501F, 0x52FA,
+ 0x5C3A, 0x6753, 0x707C, 0x7235, 0x914C, 0x91C8, 0x932B, 0x82E5,
+ 0x5BC2, 0x5F31, 0x60F9, 0x4E3B, 0x53D6, 0x5B88, 0x624B, 0x6731,
+ 0x6B8A, 0x72E9, 0x73E0, 0x7A2E, 0x816B, 0x8DA3, 0x9152, 0x9996,
+ 0x5112, 0x53D7, 0x546A, 0x5BFF, 0x6388, 0x6A39, 0x7DAC, 0x9700,
+ 0x56DA, 0x53CE, 0x5468, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101,
+ 0x62FE, 0x6D32, 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED,
+ 0x821F, 0x8490, 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031,
+ 0x914B, 0x916C, 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341,
+ 0x5F93, 0x620E, 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD,
+ 0x9283, 0x53D4, 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B,
+ 0x587E, 0x719F, 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625,
+ 0x77AC, 0x7AE3, 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F,
+ 0x6B89, 0x6DF3, 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075,
+ 0x9187, 0x9806, 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A,
+ 0x5EB6, 0x7DD2, 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9,
+ 0x53D9, 0x5973, 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7,
+ 0x511F, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,
+ 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,
+ 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,
+ 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,
+ 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,
+ 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,
+ 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,
+ 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,
+ 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,
+ 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,
+ 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,
+ 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, 0x62ED,
+ 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272, 0x89E6, 0x98DF,
+ 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5, 0x5507, 0x5A20,
+ 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B, 0x68EE,
+ 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,
+ 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B,
+ 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC,
+ 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D,
+ 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439,
+ 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761, 0x7C8B, 0x7FE0,
+ 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F, 0x745E, 0x9AC4,
+ 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB, 0x636E, 0x6749,
+ 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A, 0x5BF8,
+ 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,
+ 0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2,
+ 0x6816, 0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056,
+ 0x58F0, 0x88FD, 0x897F, 0x8AA0, 0x8A93, 0x8ACB, 0x901D, 0x9192,
+ 0x9752, 0x9759, 0x6589, 0x7A0E, 0x8106, 0x96BB, 0x5E2D, 0x60DC,
+ 0x621A, 0x65A5, 0x6614, 0x6790, 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E,
+ 0x810A, 0x8CAC, 0x8D64, 0x8DE1, 0x8E5F, 0x78A9, 0x5207, 0x62D9,
+ 0x63A5, 0x6442, 0x6298, 0x8A2D, 0x7A83, 0x7BC0, 0x8AAC, 0x96EA,
+ 0x7D76, 0x820C, 0x8749, 0x4ED9, 0x5148, 0x5343, 0x5360, 0x5BA3,
+ 0x5C02, 0x5C16, 0x5DDD, 0x6226, 0x6247, 0x64B0, 0x6813, 0x6834,
+ 0x6CC9, 0x6D45, 0x6D17, 0x67D3, 0x6F5C, 0x714E, 0x717D, 0x65CB,
+ 0x7A7F, 0x7BAD, 0x7DDA, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239,
+ 0x85A6, 0x8A6E, 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291,
+ 0x9583, 0x9BAE, 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985,
+ 0x7E55, 0x81B3, 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE,
+ 0x66FD, 0x695A, 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF,
+ 0x7C97, 0x7D20, 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20,
+ 0x50E7, 0x5275, 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F,
+ 0x723D, 0x5B8B, 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383,
+ 0x633F, 0x63BB, 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD,
+ 0x6F15, 0x71E5, 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF,
+ 0x7D9C, 0x8061, 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5,
+ 0x8D70, 0x9001, 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897,
+ 0x618E, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,
+ 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,
+ 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,
+ 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,
+ 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,
+ 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,
+ 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,
+ 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,
+ 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,
+ 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,
+ 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,
+ 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, 0x53E9,
+ 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD, 0x7AEA, 0x8FBF,
+ 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0, 0x4E39, 0x5358,
+ 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E, 0x6DE1, 0x6E5B,
+ 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D, 0x80C6, 0x86CB,
+ 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD, 0x6696, 0x6A80,
+ 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730, 0x5F1B, 0x6065,
+ 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4, 0x8718, 0x9045,
+ 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4, 0x9010, 0x79E9,
+ 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2, 0x5B99, 0x5FE0,
+ 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877, 0x8A3B, 0x914E,
+ 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7, 0x8457, 0x8CAF,
+ 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, 0x5E16, 0x5E33, 0x5E81,
+ 0x5F14, 0x5F35, 0x5F6B, 0x5FB4, 0x61F2, 0x6311, 0x66A2, 0x671D,
+ 0x6F6E, 0x7252, 0x753A, 0x773A, 0x8074, 0x8139, 0x8178, 0x8776,
+ 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3, 0x929A, 0x9577, 0x9802, 0x9CE5,
+ 0x52C5, 0x6357, 0x76F4, 0x6715, 0x6C88, 0x73CD, 0x8CC3, 0x93AE,
+ 0x9673, 0x6D25, 0x589C, 0x690E, 0x69CC, 0x8FFD, 0x939A, 0x75DB,
+ 0x901A, 0x585A, 0x6802, 0x63B4, 0x69FB, 0x4F43, 0x6F2C, 0x67D8,
+ 0x8FBB, 0x8526, 0x7DB4, 0x9354, 0x693F, 0x6F70, 0x576A, 0x58F7,
+ 0x5B2C, 0x7D2C, 0x722A, 0x540A, 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E,
+ 0x505C, 0x5075, 0x5243, 0x8C9E, 0x5448, 0x5824, 0x5B9A, 0x5E1D,
+ 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F, 0x608C, 0x62B5, 0x633A, 0x63D0,
+ 0x68AF, 0x6C40, 0x7887, 0x798E, 0x7A0B, 0x7DE0, 0x8247, 0x8A02,
+ 0x8AE6, 0x8E44, 0x9013, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5,
+ 0x6458, 0x64E2, 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1,
+ 0x6EBA, 0x54F2, 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178,
+ 0x586B, 0x5929, 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC,
+ 0x8EE2, 0x985B, 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB,
+ 0x514E, 0x5410, 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597,
+ 0x675C, 0x6E21, 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D,
+ 0x7825, 0x783A, 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012,
+ 0x515A, 0x51AC, 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957,
+ 0x5B95, 0x5CF6, 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843,
+ 0x68BC, 0x68DF, 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8,
+ 0x5F53, 0x75D8, 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71,
+ 0x5230, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,
+ 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,
+ 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,
+ 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,
+ 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,
+ 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,
+ 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,
+ 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,
+ 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,
+ 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,
+ 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,
+ 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, 0x5982,
+ 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D, 0x6FE1, 0x79B0,
+ 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74, 0x5FF5, 0x637B,
+ 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B, 0x57DC, 0x56A2,
+ 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF, 0x8FB2, 0x8997,
+ 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777, 0x6CE2, 0x6D3E,
+ 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC, 0x4FF3, 0x5EC3,
+ 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C, 0x80CC, 0x80BA,
+ 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885, 0x6973, 0x7164,
+ 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019, 0x877F, 0x79E4,
+ 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD, 0x67CF, 0x6CCA,
+ 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB, 0x66DD, 0x6F20,
+ 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, 0x51FD, 0x7BB1, 0x7872,
+ 0x7BB8, 0x8087, 0x7B48, 0x6AE8, 0x5E61, 0x808C, 0x7551, 0x7560,
+ 0x516B, 0x9262, 0x6E8C, 0x767A, 0x9197, 0x9AEA, 0x4F10, 0x7F70,
+ 0x629C, 0x7B4F, 0x95A5, 0x9CE9, 0x567A, 0x5859, 0x86E4, 0x96BC,
+ 0x4F34, 0x5224, 0x534A, 0x53CD, 0x53DB, 0x5E06, 0x642C, 0x6591,
+ 0x677F, 0x6C3E, 0x6C4E, 0x7248, 0x72AF, 0x73ED, 0x7554, 0x7E41,
+ 0x822C, 0x85E9, 0x8CA9, 0x7BC4, 0x91C6, 0x7169, 0x9812, 0x98EF,
+ 0x633D, 0x6669, 0x756A, 0x76E4, 0x78D0, 0x8543, 0x86EE, 0x532A,
+ 0x5351, 0x5426, 0x5983, 0x5E87, 0x5F7C, 0x60B2, 0x6249, 0x6279,
+ 0x62AB, 0x6590, 0x6BD4, 0x6CCC, 0x75B2, 0x76AE, 0x7891, 0x79D8,
+ 0x7DCB, 0x7F77, 0x80A5, 0x88AB, 0x8AB9, 0x8CBB, 0x907F, 0x975E,
+ 0x98DB, 0x6A0B, 0x7C38, 0x5099, 0x5C3E, 0x5FAE, 0x6787, 0x6BD8,
+ 0x7435, 0x7709, 0x7F8E, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B,
+ 0x9AED, 0x5F66, 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562,
+ 0x7B46, 0x903C, 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C,
+ 0x4FF5, 0x5F6A, 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868,
+ 0x8A55, 0x8C79, 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328,
+ 0x92F2, 0x849C, 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C,
+ 0x7015, 0x8CA7, 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8,
+ 0x57E0, 0x592B, 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016,
+ 0x6276, 0x6577, 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150,
+ 0x819A, 0x8299, 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644,
+ 0x4FAE, 0x64AB, 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01,
+ 0x6953, 0x98A8, 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45,
+ 0x670D, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,
+ 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,
+ 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,
+ 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,
+ 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,
+ 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,
+ 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,
+ 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,
+ 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,
+ 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,
+ 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,
+ 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, 0x6CD5,
+ 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3, 0x840C, 0x84EC,
+ 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2, 0x98FD, 0x9CF3,
+ 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A, 0x59A8, 0x5E3D,
+ 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0, 0x68D2, 0x5192,
+ 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF, 0x927E, 0x9632,
+ 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8, 0x64B2, 0x6734,
+ 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1, 0x6B86, 0x5800,
+ 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6, 0x6469, 0x78E8,
+ 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A, 0x6BCE, 0x54E9,
+ 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE, 0x9C52, 0x685D,
+ 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB, 0x8FC4, 0x4FAD,
+ 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, 0x6F2B, 0x8513, 0x5473,
+ 0x672A, 0x9B45, 0x5DF3, 0x7B95, 0x5CAC, 0x5BC6, 0x871C, 0x6E4A,
+ 0x84D1, 0x7A14, 0x8108, 0x5999, 0x7C8D, 0x6C11, 0x7720, 0x52D9,
+ 0x5922, 0x7121, 0x725F, 0x77DB, 0x9727, 0x9D61, 0x690B, 0x5A7F,
+ 0x5A18, 0x51A5, 0x540D, 0x547D, 0x660E, 0x76DF, 0x8FF7, 0x9298,
+ 0x9CF4, 0x59EA, 0x725D, 0x6EC5, 0x514D, 0x68C9, 0x7DBF, 0x7DEC,
+ 0x9762, 0x9EBA, 0x6478, 0x6A21, 0x8302, 0x5984, 0x5B5F, 0x6BDB,
+ 0x731B, 0x76F2, 0x7DB2, 0x8017, 0x8499, 0x5132, 0x6728, 0x9ED9,
+ 0x76EE, 0x6762, 0x52FF, 0x9905, 0x5C24, 0x623B, 0x7C7E, 0x8CB0,
+ 0x554F, 0x60B6, 0x7D0B, 0x9580, 0x5301, 0x4E5F, 0x51B6, 0x591C,
+ 0x723A, 0x8036, 0x91CE, 0x5F25, 0x77E2, 0x5384, 0x5F79, 0x7D04,
+ 0x85AC, 0x8A33, 0x8E8D, 0x9756, 0x67F3, 0x85AE, 0x9453, 0x6109,
+ 0x6108, 0x6CB9, 0x7652, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A,
+ 0x52C7, 0x53CB, 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709,
+ 0x67DA, 0x6E67, 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5,
+ 0x8A98, 0x904A, 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88,
+ 0x4F59, 0x4E0E, 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996,
+ 0x5BB9, 0x5EB8, 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8,
+ 0x6D0B, 0x6EB6, 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449,
+ 0x84C9, 0x8981, 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E,
+ 0x6291, 0x6B32, 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85,
+ 0x87BA, 0x88F8, 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61,
+ 0x843D, 0x916A, 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD,
+ 0x862D, 0x89A7, 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406,
+ 0x7483, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,
+ 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,
+ 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,
+ 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,
+ 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,
+ 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,
+ 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,
+ 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,
+ 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,
+ 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,
+ 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,
+ 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, 0x84EE,
+ 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089, 0x8CC2, 0x8DEF,
+ 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717, 0x697C, 0x6994,
+ 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001, 0x807E, 0x874B,
+ 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332, 0x8AD6, 0x502D,
+ 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1, 0x67A0, 0x9DF2,
+ 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568, 0x6900, 0x6E7E,
+ 0x7897, 0x8155, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36,
+ 0x4E3C, 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B,
+ 0x4E8A, 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2,
+ 0x4EB0, 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2,
+ 0x4ED7, 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30,
+ 0x4F5B, 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98,
+ 0x4F7B, 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118,
+ 0x4FD4, 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0,
+ 0x4FE4, 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005,
+ 0x4F1C, 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011,
+ 0x5006, 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A,
+ 0x5056, 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2,
+ 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5, 0x50ED,
+ 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102, 0x5116,
+ 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C, 0x513B,
+ 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8, 0x5169,
+ 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189, 0x518F,
+ 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2, 0x51A9,
+ 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5, 0x51BD,
+ 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED, 0x51F0,
+ 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227, 0x522A,
+ 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C, 0x525E,
+ 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D, 0x528D,
+ 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, 0x8FA7, 0x52AC,
+ 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD, 0x52D7, 0x52DE, 0x52E3,
+ 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5, 0x52F8, 0x52F9, 0x5306,
+ 0x5308, 0x7538, 0x530D, 0x5310, 0x530F, 0x5315, 0x531A, 0x5323,
+ 0x532F, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346, 0x5345, 0x4E17,
+ 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369, 0x536E, 0x5918, 0x537B,
+ 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6, 0x53A5, 0x53AE, 0x53B0,
+ 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF, 0x66FC, 0x71EE, 0x53EE,
+ 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D, 0x5440, 0x542C, 0x542D,
+ 0x543C, 0x542E, 0x5436, 0x5429, 0x541D, 0x544E, 0x548F, 0x5475,
+ 0x548E, 0x545F, 0x5471, 0x5477, 0x5470, 0x5492, 0x547B, 0x5480,
+ 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7, 0x54A2, 0x54B8, 0x54A5,
+ 0x54AC, 0x54C4, 0x54C8, 0x54A8, 0x54AB, 0x54C2, 0x54A4, 0x54BE,
+ 0x54BC, 0x54D8, 0x54E5, 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE,
+ 0x54ED, 0x54FA, 0x54E2, 0x5539, 0x5540, 0x5563, 0x554C, 0x552E,
+ 0x555C, 0x5545, 0x5556, 0x5557, 0x5538, 0x5533, 0x555D, 0x5599,
+ 0x5580, 0x54AF, 0x558A, 0x559F, 0x557B, 0x557E, 0x5598, 0x559E,
+ 0x55AE, 0x557C, 0x5583, 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5,
+ 0x55DF, 0x55C4, 0x55DC, 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616,
+ 0x55FE, 0x55FD, 0x561B, 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634,
+ 0x5636, 0x5632, 0x5638, 0x566B, 0x5664, 0x562F, 0x566C, 0x566A,
+ 0x5686, 0x5680, 0x568A, 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE,
+ 0x56B6, 0x56B4, 0x56C2, 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8,
+ 0x56CE, 0x56D1, 0x56D3, 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF,
+ 0x5704, 0x5709, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716,
+ 0x55C7, 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740,
+ 0x574F, 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793,
+ 0x57A0, 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4,
+ 0x57D2, 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D,
+ 0x5872, 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D,
+ 0x5879, 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB,
+ 0x58B8, 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8,
+ 0x58E5, 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB,
+ 0x58FC, 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925,
+ 0x592C, 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950,
+ 0x594E, 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969,
+ 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2, 0x59C6,
+ 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F, 0x5A11,
+ 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35, 0x5A36,
+ 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2, 0x5ABD,
+ 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB, 0x5B0C,
+ 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E, 0x5B43,
+ 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65, 0x5B69,
+ 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80, 0x5B83,
+ 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0, 0x5BE4,
+ 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6, 0x5BF3,
+ 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22, 0x5C28,
+ 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, 0x5C50, 0x5C4F,
+ 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76, 0x5C79, 0x5C8C, 0x5C91,
+ 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6, 0x5CBC, 0x5CB7, 0x5CC5,
+ 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD, 0x5CFA, 0x5CED, 0x5D8C,
+ 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C, 0x5D1F, 0x5D1B, 0x5D11,
+ 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18, 0x5D4C, 0x5D52, 0x5D4E,
+ 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87, 0x5D84, 0x5D82, 0x5DA2,
+ 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90, 0x5DB7, 0x5DBC, 0x5DC9,
+ 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB, 0x5DEB, 0x5DF2, 0x5DF5,
+ 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B, 0x5E36, 0x5E37, 0x5E44,
+ 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54, 0x5E5F, 0x5E62, 0x5E64,
+ 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC, 0x5E7F, 0x5EA0, 0x5EC1,
+ 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA,
+ 0x5EDB, 0x5EE2, 0x5EE1, 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3,
+ 0x5EF0, 0x5EF4, 0x5EF8, 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C,
+ 0x5F0B, 0x5F11, 0x5F16, 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48,
+ 0x5F4C, 0x5F4E, 0x5F2F, 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61,
+ 0x5F6D, 0x5F73, 0x5F77, 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88,
+ 0x5F91, 0x5F87, 0x5F9E, 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD,
+ 0x5FBC, 0x5FD6, 0x5FFB, 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3,
+ 0x5FFF, 0x6021, 0x6060, 0x6019, 0x6010, 0x6029, 0x600E, 0x6031,
+ 0x601B, 0x6015, 0x602B, 0x6026, 0x600F, 0x603A, 0x605A, 0x6041,
+ 0x606A, 0x6077, 0x605F, 0x604A, 0x6046, 0x604D, 0x6063, 0x6043,
+ 0x6064, 0x6042, 0x606C, 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7,
+ 0x6083, 0x609A, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7,
+ 0x608B, 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD,
+ 0x60C6, 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7,
+ 0x6100, 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D,
+ 0x610E, 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C,
+ 0x612C, 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158,
+ 0x6159, 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F,
+ 0x615D, 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194,
+ 0x619A, 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9,
+ 0x61F7, 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD,
+ 0x61E6, 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC,
+ 0x61FE, 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B,
+ 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233, 0x6241,
+ 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C, 0x6282,
+ 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283, 0x6294,
+ 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4, 0x62C8,
+ 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9, 0x630C,
+ 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5, 0x6350,
+ 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380, 0x63AB,
+ 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B, 0x6369,
+ 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2, 0x63F6,
+ 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651D,
+ 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E, 0x652A,
+ 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, 0x64DA, 0x64D2,
+ 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2, 0x64F1, 0x64E7, 0x8209,
+ 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF, 0x652C, 0x64F6, 0x64F4,
+ 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518, 0x651C, 0x6505, 0x6524,
+ 0x6523, 0x652B, 0x6534, 0x6535, 0x6537, 0x6536, 0x6538, 0x754B,
+ 0x6548, 0x6556, 0x6555, 0x654D, 0x6558, 0x655E, 0x655D, 0x6572,
+ 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B, 0x659F, 0x65AB, 0x65B7,
+ 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC, 0x65D2, 0x65DB, 0x65D9,
+ 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A, 0x6603, 0x65FB, 0x6773,
+ 0x6635, 0x6636, 0x6634, 0x661C, 0x664F, 0x6644, 0x6649, 0x6641,
+ 0x665E, 0x665D, 0x6664, 0x6667, 0x6668, 0x665F, 0x6662, 0x6670,
+ 0x6683, 0x6688, 0x668E, 0x6689, 0x6684, 0x6698, 0x669D, 0x66C1,
+ 0x66B9, 0x66C9, 0x66BE, 0x66BC, 0x66C4, 0x66B8, 0x66D6, 0x66DA,
+ 0x66E0, 0x663F, 0x66E6, 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F,
+ 0x6716, 0x671E, 0x6726, 0x6727, 0x9738, 0x672E, 0x673F, 0x6736,
+ 0x6741, 0x6738, 0x6737, 0x6746, 0x675E, 0x6760, 0x6759, 0x6763,
+ 0x6764, 0x6789, 0x6770, 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B,
+ 0x67A6, 0x67A1, 0x6785, 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3,
+ 0x67E9, 0x67B8, 0x67E4, 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9,
+ 0x67CE, 0x67C6, 0x67E7, 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840,
+ 0x684D, 0x6832, 0x684E, 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877,
+ 0x687F, 0x689F, 0x688F, 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883,
+ 0x6AAE, 0x68B9, 0x6874, 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D,
+ 0x687E, 0x6901, 0x68CA, 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1,
+ 0x690C, 0x68CD, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904,
+ 0x68D7, 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A,
+ 0x691A, 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978,
+ 0x696B, 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959,
+ 0x6930, 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE,
+ 0x69D0, 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA,
+ 0x69DD, 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C,
+ 0x6995, 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A,
+ 0x69F9, 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14,
+ 0x69EB, 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C,
+ 0x6A72, 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48,
+ 0x6A38, 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3,
+ 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3, 0x6AAC,
+ 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB, 0x6B05,
+ 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38, 0x6B37,
+ 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50, 0x6B59,
+ 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F, 0x6B80,
+ 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4, 0x6BAA,
+ 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC, 0x6BC6,
+ 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF, 0x9EBE,
+ 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E, 0x6C55,
+ 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B, 0x6C7E,
+ 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3, 0x6CBD,
+ 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, 0x6CBA, 0x6CDB,
+ 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D, 0x6D36, 0x6D2B, 0x6D3D,
+ 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12, 0x6D0C, 0x6D63, 0x6D93,
+ 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E, 0x6D95, 0x6FE4, 0x6D85,
+ 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7, 0x6DE6, 0x6DB8, 0x6DC6,
+ 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2, 0x6DC5, 0x6DFA, 0x6DD9,
+ 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D, 0x6E6E, 0x6E2E, 0x6E19,
+ 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B, 0x6E2B, 0x6E76, 0x6E4D,
+ 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24, 0x6EFF, 0x6E1D, 0x6E38,
+ 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7, 0x6ED3, 0x6EBD, 0x6EAF,
+ 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F, 0x6EA5, 0x6EC2, 0x6E9F,
+ 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8, 0x6EFE, 0x6F3F, 0x6EF2,
+ 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86,
+ 0x6F7A, 0x6F78, 0x6F81, 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D,
+ 0x6F82, 0x6F7C, 0x6F58, 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3,
+ 0x6FA3, 0x6FA1, 0x6FA4, 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5,
+ 0x6FEC, 0x6FD4, 0x6FD8, 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B,
+ 0x6FFA, 0x7011, 0x7001, 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74,
+ 0x701D, 0x7018, 0x701F, 0x7030, 0x703E, 0x7032, 0x7051, 0x7063,
+ 0x7099, 0x7092, 0x70AF, 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE,
+ 0x70DF, 0x70CB, 0x70DD, 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119,
+ 0x7165, 0x7155, 0x7188, 0x7166, 0x7162, 0x714C, 0x7156, 0x716C,
+ 0x718F, 0x71FB, 0x7184, 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9,
+ 0x71BE, 0x71D2, 0x71C9, 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7,
+ 0x71F5, 0x71FC, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228,
+ 0x722D, 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240,
+ 0x7246, 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287,
+ 0x7292, 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6,
+ 0x72C4, 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7,
+ 0x500F, 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F,
+ 0x7329, 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A,
+ 0x7368, 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3,
+ 0x73CE, 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405,
+ 0x746F, 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F,
+ 0x7459, 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476,
+ 0x747E, 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1,
+ 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0, 0x74F1,
+ 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E, 0x750D,
+ 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544, 0x754D,
+ 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564, 0x7567,
+ 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758A,
+ 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3, 0x75C2,
+ 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1, 0x75CD,
+ 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF, 0x75FC,
+ 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D, 0x7609,
+ 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,
+ 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661, 0x7662,
+ 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, 0x7672, 0x7676,
+ 0x7678, 0x767C, 0x7680, 0x7683, 0x7688, 0x768B, 0x768E, 0x7696,
+ 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4, 0x76B8, 0x76B9, 0x76BA,
+ 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE, 0x76E1, 0x76E5, 0x76E7,
+ 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707, 0x7704, 0x7729, 0x7724,
+ 0x771E, 0x7725, 0x7726, 0x771B, 0x7737, 0x7738, 0x7747, 0x775A,
+ 0x7768, 0x776B, 0x775B, 0x7765, 0x777F, 0x777E, 0x7779, 0x778E,
+ 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0, 0x77B6, 0x77B9, 0x77BF,
+ 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD, 0x77D7, 0x77DA, 0x77DC,
+ 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812, 0x7926, 0x7820, 0x792A,
+ 0x7845, 0x788E, 0x7874, 0x7886, 0x787C, 0x789A, 0x788C, 0x78A3,
+ 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6, 0x78CB, 0x78D4, 0x78BE,
+ 0x78BC, 0x78C5, 0x78CA, 0x78EC, 0x78E7, 0x78DA, 0x78FD, 0x78F4,
+ 0x7907, 0x7912, 0x7911, 0x7919, 0x792C, 0x792B, 0x7940, 0x7960,
+ 0x7957, 0x795F, 0x795A, 0x7955, 0x7953, 0x797A, 0x797F, 0x798A,
+ 0x799D, 0x79A7, 0x9F4B, 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA,
+ 0x79C9, 0x79D5, 0x79E7, 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D,
+ 0x7A18, 0x7A19, 0x7A20, 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E,
+ 0x7A37, 0x7A43, 0x7A57, 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D,
+ 0x7A70, 0x7A79, 0x7A7D, 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96,
+ 0x7AA9, 0x7AC8, 0x7AB0, 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083,
+ 0x7AC7, 0x7ACA, 0x7ACD, 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA,
+ 0x7ADD, 0x7AE1, 0x7AE2, 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F,
+ 0x7B0A, 0x7B06, 0x7B33, 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28,
+ 0x7B36, 0x7B50, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45,
+ 0x7B75, 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E,
+ 0x7B9D, 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92,
+ 0x7B8F, 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4,
+ 0x7BC6, 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60,
+ 0x7C00, 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6,
+ 0x7C23, 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C,
+ 0x7C43, 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64,
+ 0x7C56, 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD,
+ 0x7CA2, 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE,
+ 0x7CB9, 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC,
+ 0x7CE2, 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06,
+ 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E, 0x7D32,
+ 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72, 0x7D68,
+ 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F, 0x7D7D,
+ 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD, 0x7DAB,
+ 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0, 0x7DD8,
+ 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05, 0x7E0A,
+ 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B, 0x7E22,
+ 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37, 0x7E32,
+ 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A, 0x7E79,
+ 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D, 0x8FAE,
+ 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93, 0x7E94,
+ 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, 0x7F45, 0x7F4C,
+ 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55, 0x7F54, 0x7F58, 0x7F5F,
+ 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78, 0x7F82, 0x7F86, 0x7F83,
+ 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E, 0x7F9D, 0x7F9A, 0x7FA3,
+ 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6, 0x7FB8, 0x8B71, 0x7FC5,
+ 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FF3,
+ 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B, 0x8012, 0x8018, 0x8019,
+ 0x801C, 0x8021, 0x8028, 0x803F, 0x803B, 0x804A, 0x8046, 0x8052,
+ 0x8058, 0x805A, 0x805F, 0x8062, 0x8068, 0x8073, 0x8072, 0x8070,
+ 0x8076, 0x8079, 0x807D, 0x807F, 0x8084, 0x8086, 0x8085, 0x809B,
+ 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC, 0x80DB, 0x80E5, 0x80D9,
+ 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109, 0x80EF, 0x80F1, 0x811B,
+ 0x8129, 0x8123, 0x812F, 0x814B, 0x968B, 0x8146, 0x813E, 0x8153,
+ 0x8151, 0x80FC, 0x8171, 0x816E, 0x8165, 0x8166, 0x8174, 0x8183,
+ 0x8188, 0x818A, 0x8180, 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3,
+ 0x815F, 0x8193, 0x81A9, 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD,
+ 0x81C0, 0x81C2, 0x81BA, 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8,
+ 0x81C8, 0x81DA, 0x81DF, 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE,
+ 0x8201, 0x8202, 0x8205, 0x8207, 0x820A, 0x820D, 0x8210, 0x8216,
+ 0x8229, 0x822B, 0x8238, 0x8233, 0x8240, 0x8259, 0x8258, 0x825D,
+ 0x825A, 0x825F, 0x8264, 0x8262, 0x8268, 0x826A, 0x826B, 0x822E,
+ 0x8271, 0x8277, 0x8278, 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F,
+ 0x82BB, 0x82AC, 0x82E1, 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3,
+ 0x82FA, 0x8393, 0x8303, 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC,
+ 0x8309, 0x82D9, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340,
+ 0x8339, 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385,
+ 0x839A, 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387,
+ 0x838A, 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8,
+ 0x83F4, 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B,
+ 0x83C1, 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420,
+ 0x83BD, 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A,
+ 0x8484, 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446,
+ 0x842C, 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF,
+ 0x849F, 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6,
+ 0x84D6, 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C,
+ 0x851F, 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548,
+ 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588, 0x8591,
+ 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587, 0x859C,
+ 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9, 0x85D0,
+ 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613, 0x860B,
+ 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F, 0x864D,
+ 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3, 0x86A9,
+ 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6, 0x86B0,
+ 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC, 0x86DF,
+ 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86FB,
+ 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F, 0x8737,
+ 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778, 0x874C,
+ 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, 0x8753, 0x8763,
+ 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782, 0x87AF, 0x87CB, 0x87BD,
+ 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4, 0x87B3, 0x87C7, 0x87C6,
+ 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F, 0x880D, 0x87FE, 0x87F6,
+ 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816, 0x8815, 0x8822, 0x8821,
+ 0x8831, 0x8836, 0x8839, 0x8827, 0x883B, 0x8844, 0x8842, 0x8852,
+ 0x8859, 0x885E, 0x8862, 0x886B, 0x8881, 0x887E, 0x889E, 0x8875,
+ 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897, 0x8892, 0x88AE, 0x8899,
+ 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF, 0x88B1, 0x88C3, 0x88C4,
+ 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9, 0x8902, 0x88FC, 0x88F4,
+ 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A, 0x8913, 0x8943, 0x891E,
+ 0x8925, 0x892A, 0x892B, 0x8941, 0x8944, 0x893B, 0x8936, 0x8938,
+ 0x894C, 0x891D, 0x8960, 0x895E, 0x8966, 0x8964, 0x896D, 0x896A,
+ 0x896F, 0x8974, 0x8977, 0x897E, 0x8983, 0x8988, 0x898A, 0x8993,
+ 0x8998, 0x89A1, 0x89A9, 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA,
+ 0x89BD, 0x89BF, 0x89C0, 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4,
+ 0x89F8, 0x8A03, 0x8A16, 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25,
+ 0x8A36, 0x8A41, 0x8A5B, 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D,
+ 0x8A6C, 0x8A62, 0x8A85, 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91,
+ 0x8AA5, 0x8AA6, 0x8A9A, 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA,
+ 0x8AEB, 0x8AF3, 0x8AE7, 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2,
+ 0x8AF7, 0x8ADE, 0x8ADB, 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16,
+ 0x8B10, 0x8B17, 0x8B20, 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E,
+ 0x8B28, 0x8B41, 0x8B4C, 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B,
+ 0x8B5A, 0x8B6B, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80,
+ 0x8B8C, 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A,
+ 0x8C41, 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62,
+ 0x8C6C, 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D,
+ 0x8C8E, 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD,
+ 0x8CB2, 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3,
+ 0x8CDA, 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07,
+ 0x8D0F, 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16,
+ 0x8D67, 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE,
+ 0x8DBA, 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA,
+ 0x8DEB, 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D,
+ 0x8E1E, 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A,
+ 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64, 0x8E60,
+ 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81, 0x8E87,
+ 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94, 0x8E99,
+ 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE, 0x8EC5,
+ 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB, 0x8EFE,
+ 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C, 0x8F1F,
+ 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45, 0x8F42,
+ 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C, 0x8F62,
+ 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF, 0x8FB7,
+ 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4, 0x9005,
+ 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E, 0x9016,
+ 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, 0x904F, 0x9050,
+ 0x9051, 0x9052, 0x900E, 0x9049, 0x903E, 0x9056, 0x9058, 0x905E,
+ 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072, 0x9082, 0x907D, 0x9081,
+ 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8, 0x90AF, 0x90B1, 0x90B5,
+ 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102, 0x9112, 0x9119, 0x9132,
+ 0x9130, 0x914A, 0x9156, 0x9158, 0x9163, 0x9165, 0x9169, 0x9173,
+ 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2, 0x91AB, 0x91AF, 0x91AA,
+ 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1, 0x91C9, 0x91CB, 0x91D0,
+ 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC, 0x91F5, 0x91F6, 0x921E,
+ 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211, 0x925E, 0x9257, 0x9245,
+ 0x9249, 0x9264, 0x9248, 0x9295, 0x923F, 0x924B, 0x9250, 0x929C,
+ 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF, 0x92B9, 0x92B7, 0x92E9,
+ 0x930F, 0x92FA, 0x9344, 0x932E, 0x9319, 0x9322, 0x931A, 0x9323,
+ 0x933A, 0x9335, 0x933B, 0x935C, 0x9360, 0x937C, 0x936E, 0x9356,
+ 0x93B0, 0x93AC, 0x93AD, 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8,
+ 0x93E5, 0x93D8, 0x93C3, 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A,
+ 0x9414, 0x9413, 0x9403, 0x9407, 0x9410, 0x9436, 0x942B, 0x9435,
+ 0x9421, 0x943A, 0x9441, 0x9452, 0x9444, 0x945B, 0x9460, 0x9462,
+ 0x945E, 0x946A, 0x9229, 0x9470, 0x9475, 0x9477, 0x947D, 0x945A,
+ 0x947C, 0x947E, 0x9481, 0x947F, 0x9582, 0x9587, 0x958A, 0x9594,
+ 0x9596, 0x9598, 0x9599, 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC,
+ 0x95BB, 0x95B9, 0x95BE, 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC,
+ 0x95D5, 0x95D4, 0x95D6, 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621,
+ 0x9628, 0x962E, 0x962F, 0x9642, 0x964C, 0x964F, 0x964B, 0x9677,
+ 0x965C, 0x965E, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D,
+ 0x9698, 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0,
+ 0x96B4, 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD,
+ 0x894D, 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708,
+ 0x9713, 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A,
+ 0x9730, 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742,
+ 0x9749, 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B,
+ 0x9771, 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B,
+ 0x978F, 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4,
+ 0x97C3, 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2,
+ 0x7ADF, 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821,
+ 0x9837, 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870,
+ 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6, 0x98C4,
+ 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912, 0x9914,
+ 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C, 0x992E,
+ 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B, 0x9951,
+ 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD, 0x99AE,
+ 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED, 0x99EE,
+ 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05, 0x99E2,
+ 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43, 0x9A3E,
+ 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65, 0x9A64,
+ 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0, 0x9ACF,
+ 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3, 0x9AE6,
+ 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, 0x9AFB, 0x9B06,
+ 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23, 0x9B25, 0x9B27, 0x9B28,
+ 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32, 0x9B44, 0x9B43, 0x9B4F,
+ 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74, 0x9B93, 0x9B83, 0x9B91,
+ 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8, 0x9BB4, 0x9BC0, 0x9BCA,
+ 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2, 0x9BE3, 0x9BE2, 0x9BE4,
+ 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1, 0x9BF0, 0x9C15, 0x9C14,
+ 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08, 0x9C12, 0x9C0A, 0x9C04,
+ 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21, 0x9C30, 0x9C47, 0x9C32,
+ 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67, 0x9C76, 0x9C78, 0x9CE7,
+ 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB, 0x9D03, 0x9D06, 0x9D2A,
+ 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44, 0x9D15, 0x9D12, 0x9D41,
+ 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51,
+ 0x9D50, 0x9D59, 0x9D72, 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A,
+ 0x9D9A, 0x9DA4, 0x9DA9, 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8,
+ 0x9DBA, 0x9DC6, 0x9DCF, 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6,
+ 0x9DED, 0x9DEF, 0x9DFD, 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79,
+ 0x9E7D, 0x9E81, 0x9E88, 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91,
+ 0x9E9D, 0x9EA5, 0x9EA9, 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC,
+ 0x9ECE, 0x9ECF, 0x9ED0, 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0,
+ 0x9EE5, 0x9EE8, 0x9EEF, 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB,
+ 0x9EFC, 0x9EFD, 0x9F07, 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C,
+ 0x9F3E, 0x9F4A, 0x9F52, 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61,
+ 0x9F66, 0x9F67, 0x9F6C, 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95,
+ 0x9F9C, 0x9FA0, 0x582F, 0x69C7, 0x9059, 0x7464, 0x2642, 0x2500,
+ 0x2501, 0x2502, 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508,
+ 0x2509, 0x250A, 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510,
+ 0x2511, 0x2512, 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518,
+ 0x2519, 0x251A, 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520,
+ 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528,
+ 0x2529, 0x252A, 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530,
+ 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538,
+ 0x2539, 0x253A, 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540,
+ 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,
+ 0x2549, 0x254A, 0x254B, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
+ 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C,
+ 0x246D, 0x246E, 0x246F, 0x2470, 0x2471, 0x2472, 0x2473, 0x2160,
+ 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+ 0x2169, 0x3349, 0x3314, 0x3322, 0x334D, 0x3318, 0x3327, 0x3303,
+ 0x3336, 0x3351, 0x3357, 0x330D, 0x3326, 0x3323, 0x332B, 0x334A,
+ 0x333B, 0x339C, 0x339D, 0x339E, 0x338E, 0x338F, 0x33C4, 0x33A1,
+ 0x301D, 0x301F, 0x2116, 0x33CD, 0x2121, 0x32A4, 0x32A5, 0x32A6,
+ 0x32A7, 0x32A8, 0x3231, 0x3232, 0x3239, 0x337E, 0x337D, 0x337C,
+ 0x222E, 0x2211, 0x221A, 0x22A5, 0x2220, 0x221F, 0x22BF, 0x2229,
+ 0x222A, 0x555E, 0x98F4, 0x6EA2, 0x9C2F, 0x6DEB, 0x8FC2, 0x6B1D,
+ 0x53A9, 0x958F, 0x5642, 0x990C, 0x7130, 0x8956, 0x9DD7, 0x8FE6,
+ 0x6062, 0x62D0, 0x6666, 0x559D, 0x845B, 0x9784, 0x5699, 0x6F97,
+ 0x7FF0, 0x7FEB, 0x5FBD, 0x7947, 0x4FE0, 0x537F, 0x50C5, 0x8EC0,
+ 0x55B0, 0x6ADB, 0x5C51, 0x9774, 0x7941, 0x6167, 0x7A3D, 0x7E6B,
+ 0x834A, 0x9699, 0x5026, 0x5ACC, 0x6372, 0x9E7C, 0x8AFA, 0x5DF7,
+ 0x663B, 0x6E9D, 0x9EB4, 0x9D60, 0x7511, 0x91C7, 0x698A, 0x6805,
+ 0x85A9, 0x9BD6, 0x9306, 0x73CA, 0x53F1, 0x5C62, 0x906E, 0x6753,
+ 0x707C, 0x7E61, 0x914B, 0x66D9, 0x6E1A, 0x85AF, 0x85F7, 0x54E8,
+ 0x5EE0, 0x68A2, 0x8523, 0x91AC, 0x9798, 0x8755, 0x9771, 0x9017,
+ 0x7FE0, 0x647A, 0x901D, 0x87EC, 0x64B0, 0x6813, 0x714E, 0x717D,
+ 0x8A6E, 0x564C, 0x9061, 0x5275, 0x6414, 0x7626, 0x905C, 0x9A52,
+ 0x817F, 0x9EDB, 0x5544, 0x6FEF, 0x7422, 0x86F8, 0x5DFD, 0x8FBF,
+ 0x68DA, 0x9C48, 0x6A3D, 0x7C1E, 0x8A3B, 0x7026, 0x51CB, 0x6357,
+ 0x69CC, 0x939A, 0x585A, 0x6451, 0x912D, 0x64E2, 0x6EBA, 0x5861,
+ 0x985A, 0x5835, 0x5C60, 0x83DF, 0x8CED, 0x5858, 0x79B1, 0x9D07,
+ 0x7006, 0x701E, 0x5678, 0x9041, 0x9813, 0x90A3, 0x8B0E, 0x7058,
+ 0x6962, 0x79B0, 0x56CA, 0x724C, 0x9019, 0x79E4, 0x525D, 0x7BB8,
+ 0x6F51, 0x91B1, 0x633D, 0x6249, 0x6A0B, 0x67CA, 0x7A17, 0x903C,
+ 0x5A9B, 0x8B2C, 0x5EDF, 0x7015, 0x983B, 0x853D, 0x77A5, 0x5A29,
+ 0x5E96, 0x6CE1, 0x84EC, 0x9830, 0x9C52, 0x9EB5, 0x5132, 0x9905,
+ 0x7C7E, 0x9453, 0x6108, 0x7652, 0x7337, 0x7194, 0x8000, 0x840A,
+ 0x907C, 0x6F23, 0x7149, 0x84EE, 0x6994, 0x881F, 0x5154, 0x5189,
+ 0x5195, 0x51A4, 0x5539, 0x5533, 0x55E4, 0x5632, 0x56A5, 0x580B,
+ 0x5ABE, 0x5BC3, 0x5C5B, 0x5E64, 0x6097, 0x6369, 0x6406, 0x6522,
+ 0x6583, 0x67A6, 0x67B4, 0x689B, 0x688E, 0x6E6E, 0x71D7, 0x7228,
+ 0x73CE, 0x7504, 0x750D, 0x7515, 0x7693, 0x787C, 0x7A31, 0x9F9D,
+ 0x7B99, 0x7C90, 0x7CAE, 0x7D9B, 0x7DAE, 0x7D9F, 0x7FD4, 0x822E,
+ 0x828D, 0x82D2, 0x8323, 0x8375, 0x8517, 0x853E, 0x8782, 0x87D2,
+ 0x890A, 0x89AF, 0x8ADE, 0x8B41, 0x8DDA, 0x8E09, 0x8F13, 0x8FEA,
+ 0x8FE9, 0x9058, 0x6248, 0x91C1, 0x95BB, 0x7762, 0x9724, 0x9760,
+ 0x976D, 0x9824, 0x9B2E, 0x9B97, 0x9BF2, 0x9EAA, 0x9F9C, 0x3001,
+ 0x3002, 0x203E, 0xFF3F, 0x30FC, 0x2015, 0x2010, 0x301C, 0x2016,
+ 0xFF5C, 0x2026, 0x2025, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B,
+ 0xFF3D, 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C,
+ 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0xFF1D, 0x3041, 0x3043,
+ 0x3045, 0x3047, 0x3049, 0x3063, 0x3083, 0x3085, 0x3087, 0x308E,
+ 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30C3, 0x30E3, 0x30E5,
+ 0x30E7, 0x30EE, 0x30F5, 0x30F6, 0x3349, 0x3314, 0x3322, 0x334D,
+ 0x3318, 0x3327, 0x3303, 0x3336, 0x3351, 0x3357, 0x330D, 0x3326,
+ 0x3323, 0x332B, 0x334A, 0x333B, 0x301D, 0x301E, 0x3094, 0x304B,
+ 0x3051, 0x82A6, 0x8328, 0x5653, 0x53A9, 0x7259, 0x6C72, 0x7B08,
+ 0x9957, 0x62F3, 0x9910, 0x976D, 0x717D, 0x7A7F, 0x7BAD, 0x63C3,
+ 0x83DF, 0x7962, 0x53DB, 0x7BC7, 0x8FC4, 0x7C3E, 0x50CA, 0x5315,
+ 0x55A9, 0x56AE, 0x5819, 0x591B, 0x5C28, 0x5ED0, 0x5ECF, 0x6241,
+ 0x66C1, 0x6C08, 0x6E23, 0x6EEC, 0x7A97, 0x7BDD, 0x7FE9, 0x8422,
+ 0x8759, 0x880E, 0x87D2, 0x9A19, 0x9EAD, 0xFFE4, 0xFF07, 0xFF02,
+ 0x11A8, 0x25C1, 0x25B7, 0x21E9, 0x21E7, 0x21E6, 0x21E8, 0x25A2,
+ 0x2667, 0x2661, 0x2664, 0x2662, 0x33A0, 0x33A2, 0x33A4, 0x33A5,
+ 0x3397, 0x2113, 0x3398, 0x33B3, 0x33B2, 0x33B1, 0x33B0, 0x3385,
+ 0x3386, 0x3387, 0x33CB, 0x3390, 0x33D4, 0x3396, 0x3322, 0x3316,
+ 0x3318, 0x3315, 0x3303, 0x3323, 0x3357, 0x3342, 0x3339, 0x333B,
+ 0x3300, 0x3331, 0x3347, 0x331E, 0x332A, 0x33CD, 0x337F, 0x2121,
+ 0x260E, 0x3036, 0x3020, 0x00A9, 0x00AE, 0x0000, 0x2488, 0x2489,
+ 0x248A, 0x248B, 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x2474,
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,
+ 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484,
+ 0x2485, 0x2486, 0x2487, 0x3251, 0x2170, 0x2171, 0x2172, 0x2173,
+ 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x3252, 0x3253,
+ 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325A, 0x325B,
+ 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3,
+ 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB,
+ 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3,
+ 0x24B4, 0x24B5, 0x3243, 0x323D, 0x323F, 0x3234, 0x3238, 0x3233,
+ 0x323C, 0x3242, 0x323E, 0x3236, 0x3235, 0x323B, 0x3240, 0x323A,
+ 0x32B0, 0x32AD, 0x32A9, 0x32AF, 0x3294, 0x32AA, 0x3298, 0x32AB,
+ 0x3292, 0x3291, 0x3293, 0x32AC, 0x32AE, 0x3296, 0x23A9, 0x23A8,
+ 0x23A7, 0xFE38, 0x23AD, 0x23AC, 0x23AB, 0xFE38, 0x23AB, 0x23AC,
+ 0x23AD, 0xFE38, 0x23A7, 0x23A8, 0x23A9, 0xFE38, 0x33CC, 0x3305,
+ 0x00BD, 0x00BC, 0x339F, 0x33A3, 0x33A6, 0xFFFD, 0xFFFD, 0x329E,
+ 0x3388, 0x3389, 0x33C8, 0x222D, 0x5370, 0x3230, 0x322A, 0x322B,
+ 0x322C, 0x322D, 0x322E, 0x322F, 0x3237, 0x3241, 0x27A1, 0x21E6,
+ 0x21E7, 0x21E9, 0x25C9, 0x2660, 0x2665, 0x2663, 0x2666, 0x2600,
+ 0x2601, 0x2602, 0x2603, 0x261E, 0x261C, 0x261D, 0x261F, 0x3299,
+ 0x24EA, 0x216A, 0x216B, 0xFF10, 0xFF10, 0x3000, 0x2581, 0x2582,
+ 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588, 0x258F, 0x258E,
+ 0x258D, 0x258C, 0x258B, 0x258A, 0x2589, 0x2594, 0x2595, 0x256D,
+ 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561, 0x25E2,
+ 0x25E3, 0x25E5, 0x25E4, 0x25CF, 0x0ED0, 0x2571, 0x2572, 0x2573,
+ 0x304B, 0x3051, 0x9022, 0x8FBB, 0xFF0C, 0x00B0, 0x3013, 0x309C,
+ 0x309B, 0x02CF, 0xFF0E, 0x2018, 0x2019, 0x201C, 0x201D, 0x201C,
+ 0x201E, 0x2018, 0x201A, 0x02BA, 0x51DC, 0x7199, 0x2776, 0x2777,
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x0000,
+ 0x0000, 0x0000, 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x217F,
+ 0x210A, 0x2109, 0x0000, 0x0000, 0x3004, 0x21C6, 0x21C4, 0x21C5,
+ 0x0000, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x5927, 0x5C0F, 0x329D,
+ 0x63A7, 0x0000, 0x0000, 0x337B, 0x337F, 0x0000, 0x0000, 0x3333,
+ 0x334E, 0x3322, 0x3316, 0x3305, 0x3305, 0x3305, 0x3333, 0x334E,
+ 0x334E, 0x334E, 0x3303, 0x3318, 0x3315, 0x3339, 0x3339, 0x3339,
+ 0x3357, 0x3342, 0x3342, 0x3342, 0x3323, 0x333B, 0x3300, 0x331E,
+ 0x331E, 0x331E, 0x332A, 0x332A, 0x332A, 0x3347, 0x3331, 0x7E8A,
+ 0x891C, 0x9348, 0x9288, 0x84DC, 0x4FC9, 0x70BB, 0x6631, 0x68C8,
+ 0x92F9, 0x66FB, 0x5F45, 0x4E28, 0x4EE1, 0x4EFC, 0x4F00, 0x4F03,
+ 0x4F39, 0x4F56, 0x4F92, 0x4F8A, 0x4F9A, 0x4F94, 0x4FCD, 0x5040,
+ 0x5022, 0x4FFF, 0x501E, 0x5046, 0x5070, 0x5042, 0x5094, 0x50F4,
+ 0x50D8, 0x514A, 0x5164, 0x519D, 0x51BE, 0x51EC, 0x5215, 0x529C,
+ 0x52A6, 0x52C0, 0x52DB, 0x5300, 0x5307, 0x5324, 0x5372, 0x5393,
+ 0x53B2, 0x53DD, 0xFA0E, 0x549C, 0x548A, 0x54A9, 0x54FF, 0x5586,
+ 0x5759, 0x5765, 0x57AC, 0x57C8, 0x57C7, 0xFA0F, 0xFA10, 0x589E,
+ 0x58B2, 0x590B, 0x5953, 0x595B, 0x595D, 0x5963, 0x59A4, 0x59BA,
+ 0x5B56, 0x5BC0, 0x752F, 0x5BD8, 0x5BEC, 0x5C1E, 0x5CA6, 0x5CBA,
+ 0x5CF5, 0x5D27, 0x5D53, 0xFA11, 0x5D42, 0x5D6D, 0x5DB8, 0x5DB9,
+ 0x5DD0, 0x5F21, 0x5F34, 0x5F67, 0x5FB7, 0x5FDE, 0x605D, 0x6085,
+ 0x608A, 0x60DE, 0x60D5, 0x6120, 0x60F2, 0x6111, 0x6137, 0x6130,
+ 0x6198, 0x6213, 0x62A6, 0x63F5, 0x6460, 0x649D, 0x64CE, 0x654E,
+ 0x6600, 0x6615, 0x6609, 0x662E, 0x661E, 0x6624, 0x6665, 0x6657,
+ 0x6659, 0xFA12, 0x6673, 0x6699, 0x66A0, 0x66B2, 0x66BF, 0x66FA,
+ 0x670E, 0xF929, 0x6766, 0x67BB, 0x6852, 0x67C0, 0x6801, 0x6844,
+ 0x68CF, 0xFA13, 0x6968, 0xFA14, 0x6998, 0x69E2, 0x6A30, 0x6A6B,
+ 0x6A46, 0x6A73, 0x6A7E, 0x6AE2, 0x6AE4, 0x6BD6, 0x6C3F, 0x6C5C,
+ 0x6C86, 0x6C6F, 0x6CDA, 0x6D04, 0x6D87, 0x6D6F, 0x6D96, 0x6DAC,
+ 0x6DCF, 0x6DF8, 0x6DF2, 0x6DFC, 0x6E39, 0x6E5C, 0x6E27, 0x6E3C,
+ 0x6EBF, 0x6F88, 0x6FB5, 0x6FF5, 0x7005, 0x7007, 0x7028, 0x7085,
+ 0x70AB, 0x710F, 0x7104, 0x715C, 0x7146, 0x7147, 0xFA15, 0x71C1,
+ 0x71FE, 0x72B1, 0x72BE, 0x7324, 0xFA16, 0x7377, 0x73BD, 0x73C9,
+ 0x73D6, 0x73E3, 0x73D2, 0x7407, 0x73F5, 0x7426, 0x742A, 0x7429,
+ 0x742E, 0x7462, 0x7489, 0x749F, 0x7501, 0x756F, 0x7682, 0x769C,
+ 0x769E, 0x769B, 0x76A6, 0xFA17, 0x7746, 0x52AF, 0x7821, 0x784E,
+ 0x7864, 0x787A, 0x7930, 0xFA18, 0xFA19, 0xFA1A, 0x7994, 0xFA1B,
+ 0x799B, 0x7AD1, 0x7AE7, 0xFA1C, 0x7AEB, 0x7B9E, 0xFA1D, 0x7D48,
+ 0x7D5C, 0x7DB7, 0x7DA0, 0x7DD6, 0x7E52, 0x7F47, 0x7FA1, 0xFA1E,
+ 0x8301, 0x8362, 0x837F, 0x83C7, 0x83F6, 0x8448, 0x84B4, 0x8553,
+ 0x8559, 0x856B, 0xFA1F, 0x85B0, 0xFA20, 0xFA21, 0x8807, 0x88F5,
+ 0x8A12, 0x8A37, 0x8A79, 0x8AA7, 0x8ABE, 0x8ADF, 0xFA22, 0x8AF6,
+ 0x8B53, 0x8B7F, 0x8CF0, 0x8CF4, 0x8D12, 0x8D76, 0xFA23, 0x8ECF,
+ 0xFA24, 0xFA25, 0x9067, 0x90DE, 0xFA26, 0x9115, 0x9127, 0x91DA,
+ 0x91D7, 0x91DE, 0x91ED, 0x91EE, 0x91E4, 0x91E5, 0x9206, 0x9210,
+ 0x920A, 0x923A, 0x9240, 0x923C, 0x924E, 0x9259, 0x9251, 0x9239,
+ 0x9267, 0x92A7, 0x9277, 0x9278, 0x92E7, 0x92D7, 0x92D9, 0x92D0,
+ 0xFA27, 0x92D5, 0x92E0, 0x92D3, 0x9325, 0x9321, 0x92FB, 0xFA28,
+ 0x931E, 0x92FF, 0x931D, 0x9302, 0x9370, 0x9357, 0x93A4, 0x93C6,
+ 0x93DE, 0x93F8, 0x9431, 0x9445, 0x9448, 0x9592, 0xF9DC, 0xFA29,
+ 0x969D, 0x96AF, 0x9733, 0x973B, 0x9743, 0x974D, 0x974F, 0x9751,
+ 0x9755, 0x9857, 0x9865, 0xFA2A, 0xFA2B, 0x9927, 0xFA2C, 0x999E,
+ 0x9A4E, 0x9AD9, 0x9ADC, 0x9B75, 0x9B72, 0x9B8F, 0x9BB1, 0x9BBB,
+ 0x9C00, 0x9D70, 0x9D6B, 0xFA2D, 0x9E19, 0x9ED1, 0x00AC, 0x005C,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
+ 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
+ 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
+ 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
+ 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
+ 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
+ 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
+ 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
+ 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
+ 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
+ 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
+ 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
+ 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
+ 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
+ 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
+ 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
+ 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x2002, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
+ 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0xFF40, 0x2032, 0x00A8,
+ 0x2036, 0x00C4, 0x00F9, 0x00E9, 0x00ED, 0x00DF, 0x00E7, 0x00C7,
+ 0x00D1, 0x00F1, 0x00A2, 0x00A3, 0x00F3, 0x00FA, 0x00A1, 0x00BF,
+ 0x00BD, 0x00D6, 0x00DC, 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00DC,
+ 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FC, 0x00E0, 0x00E9, 0x00E1,
+ 0x007E, 0x0030, 0x00AC, 0x005C, 0xFF60, 0xFF61, 0xFF62, 0xFF63,
+ 0xFF64, 0xFF65, 0xFF66, 0xFF67, 0xFF68, 0xFF69, 0xFF6A, 0xFF6B,
+ 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, 0xFF70, 0xFF71, 0xFF72, 0xFF73,
+ 0xFF74, 0xFF75, 0xFF76, 0xFF77, 0xFF78, 0xFF79, 0xFF7A, 0xFF7B,
+ 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, 0xFF80, 0xFF81, 0xFF82, 0xFF83,
+ 0xFF84, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0xFF8A, 0xFF8B,
+ 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, 0xFF90, 0xFF91, 0xFF92, 0xFF93,
+ 0xFF94, 0xFF95, 0xFF96, 0xFF97, 0xFF98, 0xFF99, 0xFF9A, 0xFF9B,
+ 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, 0x30F0, 0x30F1, 0x30EE, 0x30AB,
+ 0x30B1, 0x30F4, 0x30AC, 0x30AE, 0x30B0, 0x30B2, 0x30B4, 0x30B6,
+ 0x30B8, 0x30BA, 0x30BC, 0x30BE, 0x30C0, 0x30C2, 0x30C5, 0x30C7,
+ 0x30C9, 0x30D0, 0x30D1, 0x30D3, 0x30D4, 0x30D6, 0x30D7, 0x30D9,
+ 0x30DA, 0x30DC, 0x30DD, 0xFF60, 0x3092, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x3083, 0x3085, 0x3087, 0x3063, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3093, 0x3090, 0x3091, 0x308E, 0x304C, 0x304E,
+ 0x3050, 0x3052, 0x3054, 0x3056, 0x3068, 0x305A, 0x305C, 0x305E,
+ 0x3060, 0x3062, 0x3065, 0x3067, 0x3069, 0x3070, 0x3071, 0x3073,
+ 0x3074, 0x3076, 0x3077, 0x3079, 0x307A, 0x307C, 0x307D, 0x301D,
+ 0x301E, 0x005B, 0x005D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300E,
+ 0x300F, 0x3010, 0x3011, 0x2012, 0xFF60, 0x2500, 0x2501, 0x2502,
+ 0x2503, 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A,
+ 0x250B, 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512,
+ 0x2513, 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A,
+ 0x251B, 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522,
+ 0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A,
+ 0x252B, 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532,
+ 0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A,
+ 0x253B, 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542,
+ 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A,
+ 0x254B, 0x25B2, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
+ 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
+ 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
+ 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
+ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
+ 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
+ 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
+ 0x016F, 0x0169, 0x0251, 0x0251, 0x0251, 0x01FD, 0x00E6, 0x0254,
+ 0x0254, 0x0254, 0x0259, 0x0259, 0x0259, 0x025A, 0x025A, 0x025A,
+ 0x025B, 0x025B, 0x025B, 0x006A, 0x014B, 0x0275, 0x028C, 0x028C,
+ 0x028C, 0x0292, 0x0283, 0x02D0, 0x0020, 0x0021, 0x0022, 0x0023,
+ 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
+ 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B,
+ 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043,
+ 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
+ 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
+ 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B,
+ 0x00A5, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
+ 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
+ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B,
+ 0x00A6, 0x007D, 0x0303, 0x02BC, 0x005C, 0x02BB, 0x007C, 0x007E,
+ 0x00A1, 0x00A2, 0x00A3, 0x2044, 0x0192, 0x00A7, 0x00A4, 0x201C,
+ 0x00AB, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2012, 0x2020, 0x2021,
+ 0x00B7, 0x00B6, 0x2022, 0x201A, 0x201E, 0x201D, 0x00BB, 0x2026,
+ 0x2030, 0x00BF, 0x0301, 0x0302, 0x00AF, 0x0306, 0x0307, 0x0308,
+ 0x030A, 0x00B8, 0x030B, 0x0328, 0x030C, 0x0336, 0x00C6, 0x00AA,
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00E6, 0x0131, 0x0142, 0x00F8,
+ 0x0153, 0x00DF, 0x002D, 0x00A9, 0x00AC, 0x00AE, 0x00B0, 0x00B1,
+ 0x00B2, 0x00B3, 0x00B5, 0x00B9, 0x00BC, 0x00BD, 0x00BE, 0x00C0,
+ 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C7, 0x00C8, 0x00C9,
+ 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00D0, 0x00D1,
+ 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D9, 0x00DA,
+ 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00E0, 0x00E1, 0x00E2, 0x00E3,
+ 0x00E4, 0x00E5, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC,
+ 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4,
+ 0x00F5, 0x00F6, 0x00F7, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD,
+ 0x00FE, 0x00FF, 0x0160, 0x0178, 0x017D, 0x0305, 0x0161, 0x2122,
+ 0x017E, 0x0030, 0x20AC, 0x2126, 0x2032, 0x2033, 0xFB00, 0xFB03,
+ 0xFB04, 0x0101, 0x012B, 0x016B, 0x0113, 0x014D, 0x0100, 0x012A,
+ 0x016A, 0x0112, 0x014C, 0x215B, 0x215C, 0x215D, 0x215E, 0x2153,
+ 0x2154, 0x2070, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079,
+ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
+ 0x2088, 0x2089, 0x01CD, 0x011A, 0x0000, 0x1EBC, 0x01CF, 0x0000,
+ 0x0128, 0x01D1, 0x0000, 0x01D3, 0x016E, 0x0168, 0x01CE, 0x011B,
+ 0x0000, 0x1EBD, 0x01D0, 0x0000, 0x0129, 0x01D2, 0x0000, 0x01D4,
+ 0x016F, 0x0169, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
+ 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
+ 0x003A, 0x003B, 0x00B7, 0x20AC, 0x0000, 0x2153, 0x2154, 0x00BE,
+ 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x215B, 0x215C, 0x215D, 0x215E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x0030, 0x2163, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2170, 0x2171,
+ 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179,
+ 0x217A, 0x217B, 0x0000, 0x0000, 0x0000, 0x2160, 0x2161, 0x2162,
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A,
+ 0x216B, 0x0000, 0x0000, 0x0000, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
+ 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
+ 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
+ 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+ 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x3220, 0x3221,
+ 0x3222, 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x55B6, 0x5408, 0x6CEB, 0x554F, 0x7B54, 0x4F8B,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x3063, 0x624D, 0x3007, 0x4E00,
+ 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D,
+ 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D,
+ 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09,
+ 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x3064, 0x624D,
+ 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B,
+ 0x4E5D, 0x5341, 0x3007, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94,
+ 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x30B3, 0x3063, 0x30C3,
+ 0x30A9, 0x0000, 0x0000, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464,
+ 0x2465, 0x2466, 0x2467, 0x2468, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4, 0x24D5, 0x24D6,
+ 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC, 0x24DD, 0x24DE,
+ 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4, 0x24E5, 0x24E6,
+ 0x24E7, 0x24E8, 0x24E9, 0x24B6, 0x24B7, 0x24B8, 0x24B9, 0x24BA,
+ 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1, 0x24C2,
+ 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9, 0x24CA,
+ 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x3042, 0x3044, 0x3046,
+ 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055,
+ 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066,
+ 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072,
+ 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
+ 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
+ 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x32D0, 0x32D1, 0x32D2,
+ 0x32D3, 0x32D4, 0x32D5, 0x32D6, 0x32D7, 0x32D8, 0x32D9, 0x32DA,
+ 0x32DB, 0x32DC, 0x32DD, 0x32DE, 0x32DF, 0x32E0, 0x32E1, 0x32E2,
+ 0x32E3, 0x32E4, 0x32E5, 0x32E6, 0x32E7, 0x32E8, 0x32E9, 0x32EA,
+ 0x32EB, 0x32EC, 0x32ED, 0x32EE, 0x32EF, 0x32F0, 0x32F1, 0x32F2,
+ 0x32F3, 0x32F4, 0x32F5, 0x32F6, 0x32F7, 0x32F8, 0x32F9, 0x32FA,
+ 0x32FB, 0x32FC, 0x32FD, 0x32FE, 0x30F3, 0x3280, 0x3281, 0x3282,
+ 0x3283, 0x3284, 0x3285, 0x3286, 0x3287, 0x3288, 0x3289, 0x3290,
+ 0x328A, 0x328B, 0x328C, 0x328D, 0x328E, 0x328F, 0x8ABF, 0x329F,
+ 0x526F, 0x6E1B, 0x6A19, 0x6B20, 0x57FA, 0x7981, 0x32A0, 0x32A1,
+ 0x329B, 0x329A, 0x32A3, 0x32A2, 0x3297, 0x51FA, 0x329C, 0x3295,
+ 0x6E08, 0x5897, 0x554F, 0x7B54, 0x4F8B, 0x96FB, 0x25CC, 0x0030,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
+ 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073,
+ 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D,
+ 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D,
+ 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C,
+ 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E,
+ 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089,
+ 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092,
+ 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD,
+ 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD,
+ 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC,
+ 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE,
+ 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
+ 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F,
+ 0x554F, 0x7B54, 0x4F8B, 0x25CF, 0x0030, 0x0000, 0x0031, 0x0000,
+ 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000,
+ 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065,
+ 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D,
+ 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075,
+ 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043,
+ 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B,
+ 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053,
+ 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042,
+ 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051,
+ 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061,
+ 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E,
+ 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080,
+ 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B,
+ 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2,
+ 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1,
+ 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
+ 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE,
+ 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB,
+ 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5,
+ 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x8CA0, 0x52DD,
+ 0x554F, 0x7B54, 0x4F8B, 0x25A1, 0x25A1, 0x0030, 0x0000, 0x0031,
+ 0x0000, 0x0032, 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035,
+ 0x0000, 0x0036, 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
+ 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042,
+ 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A,
+ 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052,
+ 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A,
+ 0x3042, 0x3044, 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F,
+ 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F,
+ 0x3061, 0x3064, 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D,
+ 0x306E, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A,
+ 0x308B, 0x308C, 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
+ 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF,
+ 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF,
+ 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
+ 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA,
+ 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3,
+ 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F,
+ 0x7B54, 0x4F8B, 0x25A0, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032,
+ 0x0000, 0x0033, 0x0000, 0x0034, 0x0000, 0x0035, 0x0000, 0x0036,
+ 0x0000, 0x0037, 0x0000, 0x0038, 0x0000, 0x0039, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x3042, 0x3044,
+ 0x3046, 0x3048, 0x304A, 0x304B, 0x304D, 0x304F, 0x3051, 0x3053,
+ 0x3055, 0x3057, 0x3059, 0x305B, 0x305D, 0x305F, 0x3061, 0x3064,
+ 0x3066, 0x3068, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x307F, 0x3080, 0x3081,
+ 0x3082, 0x3084, 0x3086, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C,
+ 0x308D, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4,
+ 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3,
+ 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4,
+ 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC,
+ 0x30ED, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708,
+ 0x706B, 0x6C34, 0x6728, 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B,
+ 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0033, 0x0000,
+ 0x0034, 0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0037, 0x0000,
+ 0x0038, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,
+ 0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,
+ 0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,
+ 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,
+ 0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3090,
+ 0x3091, 0x3092, 0x3093, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA,
+ 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9,
+ 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA,
+ 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8,
+ 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F0,
+ 0x30F1, 0x30F2, 0x30F3, 0x65E5, 0x6708, 0x706B, 0x6C34, 0x6728,
+ 0x91D1, 0x571F, 0x554F, 0x7B54, 0x4F8B, 0x25A0, 0x33C2, 0x33CD,
+ 0x2116, 0x0000, 0x33D8, 0x33DA, 0x2121, 0x2122, 0x0000, 0x2100,
+ 0x33C2, 0x0000, 0x33C4, 0x2105, 0x3397, 0x3371, 0x3398, 0x2113,
+ 0x338D, 0x339B, 0x3396, 0x0000, 0x0000, 0x33D7, 0x33D8, 0x0000,
+ 0x0000, 0x0000, 0x3301, 0x3302, 0x3304, 0x3306, 0x0000, 0x3308,
+ 0x0000, 0x3307, 0x330A, 0x0000, 0x3309, 0x0000, 0x330B, 0x0000,
+ 0x330C, 0x330E, 0x330F, 0x3310, 0x3311, 0x3312, 0x3313, 0x0000,
+ 0x3317, 0x0000, 0x3319, 0x0000, 0x331A, 0x331B, 0x331C, 0x331D,
+ 0x331F, 0x3320, 0x3321, 0x3324, 0x0000, 0x3325, 0x0000, 0x0000,
+ 0x3328, 0x3329, 0x0000, 0x332D, 0x0000, 0x0000, 0x332E, 0x332F,
+ 0x3330, 0x3332, 0x0000, 0x0000, 0x3334, 0x3335, 0x333C, 0x0000,
+ 0x0000, 0x0000, 0x3337, 0x0000, 0x3338, 0x333A, 0x333D, 0x3341,
+ 0x333E, 0x333F, 0x3340, 0x3343, 0x3344, 0x3345, 0x3346, 0x3348,
+ 0x334B, 0x334C, 0x334F, 0x3350, 0x0000, 0x0000, 0x3352, 0x3354,
+ 0x0000, 0x0000, 0x3353, 0x3355, 0x3356, 0x0000, 0x3301, 0x3302,
+ 0x3304, 0x3306, 0x0000, 0x3308, 0x0000, 0x3307, 0x330A, 0x0000,
+ 0x3309, 0x0000, 0x330B, 0x0000, 0x330C, 0x330E, 0x330F, 0x3310,
+ 0x3311, 0x3312, 0x3313, 0x0000, 0x3317, 0x0000, 0x3319, 0x0000,
+ 0x331A, 0x331B, 0x331C, 0x331D, 0x331F, 0x3320, 0x3321, 0x3324,
+ 0x0000, 0x3325, 0x0000, 0x0000, 0x3328, 0x3329, 0x0000, 0x332D,
+ 0x0000, 0x0000, 0x332E, 0x332F, 0x3330, 0x3332, 0x0000, 0x0000,
+ 0x3334, 0x3335, 0x333C, 0x0000, 0x0000, 0x0000, 0x3337, 0x0000,
+ 0x3338, 0x333A, 0x333D, 0x3341, 0x333E, 0x333F, 0x3340, 0x3343,
+ 0x3344, 0x3345, 0x3346, 0x3348, 0x334B, 0x334C, 0x334F, 0x3350,
+ 0x0000, 0x0000, 0x3352, 0x3354, 0x0000, 0x0000, 0x3353, 0x3355,
+ 0x3356, 0x337E, 0x337D, 0x337C, 0x337B, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x002D,
+ 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
+ 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
+ 0x0000, 0x2135, 0x03D0, 0x220A, 0x210F, 0x00B5, 0x03C6, 0x03DB,
+ 0x03D1, 0xFFFD, 0x2668, 0x2669, 0x266C, 0xFF1A, 0x00A9, 0x00A9,
+ 0x00AE, 0x00AE, 0x303B, 0x303B, 0x3033, 0x3034, 0x3035, 0x203C,
+ 0x2049, 0x0021, 0x203C, 0x2049, 0x244A, 0x0000, 0x2213, 0x2260,
+ 0x2243, 0x2272, 0x2273, 0x300C, 0x300D, 0x300E, 0x300F, 0x301A,
+ 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x300C, 0x300D, 0x300E,
+ 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF5F, 0xFF60, 0x239B,
+ 0x239D, 0x239E, 0x23A0, 0x239D, 0x239B, 0x23A0, 0x239E, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0x23A1,
+ 0x23A3, 0x23A4, 0x23A6, 0x23A3, 0x23A1, 0x23A6, 0x23A4, 0xFF5C,
+ 0x2015, 0x301D, 0x301E, 0x2018, 0x2019, 0x2018, 0x2019, 0x2702,
+ 0x2702, 0x2702, 0x2702, 0x303D, 0x3012, 0x309F, 0x534D, 0x2207,
+ 0x2205, 0x22A0, 0x2296, 0x2298, 0x2295, 0x2297, 0x229E, 0x2295,
+ 0x0021, 0x25B3, 0x25C0, 0x25B6, 0x21E6, 0x21E8, 0x21E7, 0x21E9,
+ 0x21D0, 0x2194, 0x2198, 0x2199, 0x2196, 0x2197, 0x21CC, 0x21C6,
+ 0x21C4, 0x21C5, 0x2190, 0x2192, 0x2191, 0x2193, 0x2194, 0x2195,
+ 0x2504, 0x2506, 0x3030, 0x2307, 0x3030, 0x2307, 0x3030, 0x2307,
+ 0x3030, 0x2307, 0x3030, 0x2307, 0x2740, 0x273F, 0x25A1, 0x25A0,
+ 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25A1, 0x25AB, 0x25A0, 0x25AA,
+ 0x271A, 0x271A, 0x25C7, 0x25C6, 0x25C7, 0x25C7, 0x25C7, 0x25C7,
+ 0x25C7, 0x25C6, 0x25C6, 0x25CE, 0x25C9, 0x25CB, 0x25E6, 0x25CF,
+ 0x2022, 0x2756, 0x2756, 0x2756, 0x2756, 0x3008, 0x3009, 0x3008,
+ 0x3009, 0x300A, 0x300B, 0x300A, 0x300B, 0x3053, 0x3053, 0x30B3,
+ 0x30B3, 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
+ 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C,
+ 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053,
+ 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A,
+ 0x305B, 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062,
+ 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A,
+ 0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072,
+ 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A,
+ 0x307B, 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082,
+ 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A,
+ 0x308B, 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092,
+ 0x3093, 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3,
+ 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5,
+ 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1,
+ 0x30B2, 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8,
+ 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0,
+ 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8,
+ 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0,
+ 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8,
+ 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8,
+ 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0,
+ 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA,
+ 0x309D, 0x309E, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+ 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304B, 0x304C, 0x304D,
+ 0x304E, 0x304F, 0x3050, 0x3051, 0x3051, 0x3052, 0x3053, 0x3053,
+ 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,
+ 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,
+ 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,
+ 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,
+ 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,
+ 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,
+ 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,
+ 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
+ 0x3094, 0x30FD, 0x30FE, 0x30FC, 0x30A1, 0x30A2, 0x30A3, 0x30A4,
+ 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA, 0x30F5, 0x30AB,
+ 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30F6, 0x30B1, 0x30B2,
+ 0x30B3, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9,
+ 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1,
+ 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9,
+ 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1,
+ 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9,
+ 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1,
+ 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9,
+ 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1,
+ 0x30F2, 0x30F3, 0x30F4, 0x30F7, 0x30F8, 0x30F9, 0x30FA, 0x3001,
+ 0x3002, 0x30FB, 0xFF0A, 0x203B, 0x25CB, 0x25CE, 0x25C9, 0x25B3,
+ 0x25B2, 0x30FD, 0x30FE, 0x309D, 0x309E, 0xFF08, 0xFF09, 0x3014,
+ 0x3015, 0xFF08, 0xFF09, 0x3014, 0x3015, 0x0030, 0x0031, 0x0032,
+ 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x3041,
+ 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049,
+ 0x304A, 0x304B, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F, 0x3050,
+ 0x3051, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, 0x3094, 0x3041, 0x3043, 0x3045,
+ 0x3047, 0x3049, 0x304B, 0x3051, 0x3063, 0x3083, 0x3085, 0x3087,
+ 0x308E, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30F5, 0x30AC, 0x30AD, 0x30AE,
+ 0x30AF, 0x30B0, 0x30B1, 0x30F6, 0x30B2, 0x30B3, 0x30B4, 0x30B5,
+ 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD,
+ 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5,
+ 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD,
+ 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5,
+ 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD,
+ 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5,
+ 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,
+ 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30A1,
+ 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30F5, 0x30F6, 0x30C3, 0x30E3,
+ 0x30E5, 0x30E7, 0x30EE, 0x30FC, 0x30FC, 0x6CE8, 0x20AC, 0x2126,
+ 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
+ 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
+ 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
+ 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
+ 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
+ 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
+ 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
+ 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0251, 0x0251,
+ 0x0251, 0x01FD, 0x00E6, 0x0254, 0x0254, 0x0254, 0x0259, 0x0259,
+ 0x0259, 0x025A, 0x025A, 0x025A, 0x025B, 0x025B, 0x025B, 0x006A,
+ 0x014B, 0x0275, 0x028C, 0x028C, 0x028C, 0x0292, 0x0283, 0x02D0,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x00A5, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x00A6, 0x007D, 0x0303, 0x02BC,
+ 0x005C, 0x02BB, 0x007C, 0x007E, 0x00A1, 0x00A2, 0x00A3, 0x2044,
+ 0x0192, 0x00A7, 0x00A4, 0x201C, 0x00AB, 0x2039, 0x203A, 0xFB01,
+ 0xFB02, 0x2012, 0x2020, 0x2021, 0x00B7, 0x00B6, 0x2022, 0x201A,
+ 0x201E, 0x201D, 0x00BB, 0x2026, 0x2030, 0x00BF, 0x0301, 0x0302,
+ 0x00AF, 0x0306, 0x0307, 0x0308, 0x030A, 0x00B8, 0x030B, 0x0328,
+ 0x030C, 0x0336, 0x00C6, 0x00AA, 0x0141, 0x00D8, 0x0152, 0x00BA,
+ 0x00E6, 0x0131, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x002D, 0x00A9,
+ 0x00AC, 0x00AE, 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B5, 0x00B9,
+ 0x00BC, 0x00BD, 0x00BE, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4,
+ 0x00C5, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD,
+ 0x00CE, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5,
+ 0x00D6, 0x00D7, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E7, 0x00E8,
+ 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0,
+ 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F9,
+ 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, 0x0160, 0x0178,
+ 0x017D, 0x0305, 0x0161, 0x2122, 0x017E, 0x0030, 0x20AC, 0x2126,
+ 0x2032, 0x2033, 0xFB00, 0xFB03, 0xFB04, 0x0101, 0x012B, 0x016B,
+ 0x0113, 0x014D, 0x0100, 0x012A, 0x016A, 0x0112, 0x014C, 0x215B,
+ 0x215C, 0x215D, 0x215E, 0x2153, 0x2154, 0x2070, 0x2074, 0x2075,
+ 0x2076, 0x2077, 0x2078, 0x2079, 0x2080, 0x2081, 0x2082, 0x2083,
+ 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x01CD, 0x011A,
+ 0x0000, 0x1EBC, 0x01CF, 0x0000, 0x0128, 0x01D1, 0x0000, 0x01D3,
+ 0x016E, 0x0168, 0x01CE, 0x011B, 0x0000, 0x1EBD, 0x01D0, 0x0000,
+ 0x0129, 0x01D2, 0x0000, 0x01D4, 0x016F, 0x0169, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0336, 0x002D, 0x003D, 0x002C, 0x0028, 0x0029, 0x002E, 0x002F,
+ 0x003A, 0x003B, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
+ 0x0036, 0x0037, 0x0038, 0x0039, 0x0336, 0x002D, 0x003D, 0x002C,
+ 0x0028, 0x0029, 0x002E, 0x002F, 0x003A, 0x003B, 0x00B7, 0x002D,
+ 0x003D, 0x2103, 0x2640, 0x2642, 0x3013, 0x3012, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x301A, 0x301B, 0x3018, 0x3019, 0xFF08, 0xFF09,
+ 0x301D, 0x301E, 0x2018, 0x2019, 0x201C, 0x201D, 0x0027, 0x0022,
+ 0x9038, 0x8B01, 0x7DE3, 0x9EC3, 0x6EAB, 0x798D, 0x6094, 0x6D77,
+ 0x6168, 0x6982, 0x6E34, 0x8910, 0x6F22, 0x5668, 0x65E2, 0x7948,
+ 0x865B, 0x97FF, 0x52E4, 0x8B39, 0x63ED, 0x64CA, 0x784F, 0x7A40,
+ 0x6BBA, 0x7949, 0x8996, 0x716E, 0x793E, 0x8005, 0x81ED, 0x795D,
+ 0x6691, 0x7F72, 0x6D89, 0x72C0, 0x613C, 0x771E, 0x7BC0, 0x7956,
+ 0x50E7, 0x5C64, 0x5DE2, 0x618E, 0x8D08, 0x537D, 0x5606, 0x8457,
+ 0x5FB5, 0x61F2, 0x93AD, 0x798E, 0x9B2D, 0x7A81, 0x96E3, 0x6885,
+ 0x7E41, 0x6669, 0x5351, 0x7891, 0x8CD3, 0x654F, 0x4FAE, 0x5002,
+ 0x5840, 0x52C9, 0x6B65, 0x58A8, 0x6BCF, 0x514D, 0x623E, 0x7950,
+ 0x6B04, 0x9686, 0x865C, 0x6DDA, 0x985E, 0x66C6, 0x6B77, 0x7DF4,
+ 0x934A, 0x5ECA, 0x9304, 0x6982, 0x51B4, 0x634C, 0x86DB, 0x9089,
+ 0x9022, 0x5049, 0x7DEF, 0x9055, 0x53A9, 0x990C, 0x885B, 0x5EF6,
+ 0x6CBF, 0x925B, 0x7FC1, 0x82BD, 0x96C5, 0x5BB3, 0x6168, 0x6982,
+ 0x6BBB, 0x6562, 0x8CAB, 0x5DCC, 0x9811, 0x5E30, 0x8ECC, 0x7AAE,
+ 0x5747, 0x5091, 0x7A74, 0x5065, 0x5EFA, 0x9237, 0x6A8E, 0x4EA4,
+ 0x516C, 0x66F4, 0x6821, 0x786C, 0x7D5E, 0x8003, 0x8CFC, 0x964D,
+ 0x62F7, 0x7F6A, 0x4F7F, 0x53F2, 0x59C9, 0x8B1D, 0x90AA, 0x53CE,
+ 0x8F2F, 0x67D4, 0x77AC, 0x821C, 0x696F, 0x677E, 0x8A1F, 0x4E08,
+ 0x57F4, 0x690D, 0x8077, 0x89AA, 0x9042, 0x636E, 0x6442, 0x8239,
+ 0x7DCF, 0x8061, 0x50CF, 0x8A95, 0x6065, 0x5146, 0x773A, 0x8074,
+ 0x8DF3, 0x5EAD, 0x5EF7, 0x8247, 0x6843, 0x9003, 0x6D3E, 0x6392,
+ 0x8F29, 0x73ED, 0x9812, 0x60B2, 0x6249, 0x6590, 0x7DCB, 0x8AB9,
+ 0x8CA7, 0x7236, 0x847A, 0x5206, 0x5674, 0x61A4, 0x7C89, 0x7D1B,
+ 0x96F0, 0x853D, 0x4FBF, 0x6367, 0x76C6, 0x685D, 0x8108, 0x8036,
+ 0x7FFC, 0x540F, 0x96A3, 0x9E9F, 0x9E97, 0x806F, 0x807E, 0x6E7E,
+ 0x5085, 0x5193, 0x51DB, 0x5315, 0x5340, 0x96D9, 0x55A9, 0x56C1,
+ 0x570D, 0x58AB, 0x59DA, 0x5A36, 0x5ABE, 0x5D4E, 0x5D87, 0x5DC9,
+ 0x5DD3, 0x5F2D, 0x5F98, 0x60D8, 0x613D, 0x61FE, 0x6268, 0x62CF,
+ 0x651D, 0x640F, 0x64F2, 0x655D, 0x665F, 0x67A9, 0x67E7, 0x696B,
+ 0x6930, 0x69A7, 0x6A44, 0x6A90, 0x6C08, 0x6C13, 0x6E23, 0x6F11,
+ 0x6EFE, 0x6F3E, 0x71FF, 0x73E5, 0x7432, 0x745F, 0x74E0, 0x750C,
+ 0x7672, 0x792A, 0x78D4, 0x79BA, 0x7A19, 0x7A95, 0x7CF2, 0x7D73,
+ 0x7DDD, 0x7E35, 0x7FAE, 0x7FE1, 0x805A, 0x805F, 0x8073, 0x8070,
+ 0x8076, 0x8153, 0x818A, 0x81B5, 0x81CD, 0x83F2, 0x8555, 0x85D5,
+ 0x871A, 0x8836, 0x889E, 0x88D8, 0x88F4, 0x892B, 0x893B, 0x896A,
+ 0x896F, 0x8A1D, 0x8D05, 0x8D0F, 0x9F4E, 0x8E91, 0x8EA1, 0x9052,
+ 0x900E, 0x9130, 0x9156, 0x9158, 0x9165, 0x9173, 0x9172, 0x91A2,
+ 0x91AF, 0x91AA, 0x91B4, 0x91BA, 0x9477, 0x9698, 0x973D, 0x9760,
+ 0x9771, 0x980C, 0x9873, 0x98C3, 0x9A45, 0x9B4D, 0x9B58, 0x9BC6,
+ 0x9BE1, 0x9BF1, 0x9D48, 0x9DCF, 0x9F08, 0x6271, 0x6697, 0x610F,
+ 0x8863, 0x9055, 0x907A, 0x78EF, 0x54E1, 0x2ED7, 0x2EBD, 0x53A9,
+ 0x74DC, 0x904B, 0x990C, 0x885E, 0x92B3, 0x95B1, 0x5EF6, 0x63F4,
+ 0x6CBF, 0x7159, 0x9060, 0x925B, 0x65BC, 0x5F80, 0x7FC1, 0x5378,
+ 0x97F3, 0x5316, 0x82B1, 0x83D3, 0x8CA8, 0x904E, 0x82BD, 0x96C5,
+ 0x9913, 0x5EFB, 0x7070, 0x5BB3, 0x6168, 0x6168, 0x6168, 0x69EA,
+ 0x6982, 0x676E, 0x89D2, 0x9694, 0x5272, 0x8F44, 0x938C, 0x82C5,
+ 0x5BD2, 0x74B0, 0x7DE9, 0x7F36, 0x9084, 0x9592, 0x97D3, 0x8218,
+ 0x5371, 0x559C, 0x3402, 0x3402, 0x5E7E, 0x65E3, 0x671F, 0x6A5F,
+ 0x8D77, 0x98E2, 0x5409, 0x55AB, 0x8650, 0x9006, 0x53CA, 0x5438,
+ 0x6025, 0x7D1A, 0x5DE8, 0x62D2, 0x8DDD, 0x9B5A, 0x9B5A, 0x537F,
+ 0x5F3A, 0x6050, 0x69C1, 0x6A4B, 0x6A4B, 0x9115, 0x97FF, 0x9957,
+ 0x6681, 0x2EA9, 0x8FD1, 0x5036, 0x77E9, 0x5177, 0x865E, 0x7A7A,
+ 0x9047, 0x6ADB, 0x5553, 0x5951, 0x6075, 0x6167, 0x8FCE, 0x5091,
+ 0x6F54, 0x7A74, 0x2EBC, 0x2EBC, 0x517C, 0x5238, 0x61B2, 0x6743,
+ 0x80A9, 0x8B19, 0x9063, 0x539F, 0x8A01, 0x6236, 0x96C7, 0x9867,
+ 0x5433, 0x5A1B, 0x8AA4, 0x5DE5, 0x614C, 0x6285, 0x63A7, 0x69CB,
+ 0x6D69, 0x6E2F, 0x8015, 0x8154, 0x8352, 0x8B1B, 0x8CFC, 0x543F,
+ 0x9177, 0x8170, 0x7511, 0x8FBC, 0x4ECA, 0x9396, 0x5EA7, 0x5F69,
+ 0x63A1, 0x6B72, 0x83DC, 0x51B4, 0x54B2, 0x524A, 0x7522, 0x9910,
+ 0x59FF, 0x59FF, 0x5DFF, 0x8AEE, 0x8AEE, 0x8CC7, 0x8CC7, 0x6B21,
+ 0x6B21, 0x6ECB, 0x73BA, 0x53F1, 0x6368, 0x659C, 0x90AA, 0x52FA,
+ 0x7235, 0x7235, 0x914C, 0x5F31, 0x4E3B, 0x53D7, 0x6388, 0x5468,
+ 0x7D42, 0x7FD2, 0x8846, 0x9031, 0x4F4F, 0x8853, 0x8FF0, 0x5DE1,
+ 0x9075, 0x9075, 0x6240, 0x66F8, 0x5973, 0x52DD, 0x5546, 0x5BB5,
+ 0x5C06, 0x2E8C, 0x2E8D, 0x5C19, 0x6D88, 0x785D, 0x8096, 0x4E08,
+ 0x5B82, 0x57CE, 0x60C5, 0x57F4, 0x98FE, 0x690D, 0x6B96, 0x98DF,
+ 0x98E0, 0x2EDE, 0x378D, 0x4FB5, 0x2E97, 0x6D78, 0x771F, 0x9032,
+ 0x4EBB, 0x4EBA, 0x5203, 0x5C0B, 0x8A0A, 0x8A0A, 0x8FC5, 0x8870,
+ 0x9042, 0x351F, 0x52E2, 0x6210, 0x76DB, 0x8056, 0x8980, 0x8AA0,
+ 0x8ACB, 0x975C, 0x975C, 0x7A05, 0x8106, 0x96BB, 0x7C4D, 0x7BC0,
+ 0x8AAA, 0x96EA, 0x7D76, 0x6247, 0x6F98, 0x7FA1, 0x8239, 0x9078,
+ 0x9077, 0x524D, 0x5168, 0x6383, 0x63F7, 0x7626, 0x8D70, 0x9001,
+ 0x906D, 0x9020, 0x2ECA, 0x901F, 0x8CCA, 0x5C0A, 0x5C0A, 0x59A5,
+ 0x6CF0, 0x9000, 0x902E, 0x968A, 0x9BDB, 0x5927, 0x3427, 0x7027,
+ 0x9054, 0x812B, 0x4E39, 0x6B4E, 0x70AD, 0x8A95, 0x6696, 0x5024,
+ 0x7F6E, 0x7BC9, 0x2EAE, 0x7B51, 0x9010, 0x67F1, 0x6CE8, 0x99D0,
+ 0x5F6B, 0x5FB5, 0x61F2, 0x671D, 0x6F6E, 0x8ABF, 0x76F4, 0x6715,
+ 0x6715, 0x589C, 0x8FFD, 0x901A, 0x576A, 0x91E3, 0x5448, 0x5E1D,
+ 0x7A0B, 0x7684, 0x9069, 0x8FED, 0x6DFB, 0x514E, 0x9014, 0x783A,
+ 0x5721, 0x571F, 0x51AC, 0x5510, 0x7CD6, 0x85E4, 0x8B04, 0x9003,
+ 0x900F, 0x9A30, 0x5C0E, 0x9053, 0x5451, 0x3B88, 0x5167, 0x8089,
+ 0x4E73, 0x5FCD, 0x8A8D, 0x5BE7, 0x7D0D, 0x8987, 0x6D3E, 0x80BA,
+ 0x535A, 0x8584, 0x8FEB, 0x7E1B, 0x8087, 0x4E37, 0x6F51, 0x91B1,
+ 0x4F34, 0x5224, 0x534A, 0x5E06, 0x7554, 0x6669, 0x8543, 0x907F,
+ 0x5FAE, 0x9F3B, 0x5339, 0x2EAA, 0x5F65, 0x59EC, 0x59EB, 0x8A55,
+ 0x5E99, 0x75C5, 0x5A66, 0x6577, 0x6D6E, 0x8CA0, 0x8CA0, 0x670D,
+ 0x8986, 0x4E19, 0x5E63, 0x5E73, 0x5F0A, 0x8511, 0x504F, 0x7DE8,
+ 0x8FD4, 0x904D, 0x7C3F, 0x5305, 0x5D29, 0x62B1, 0x670B, 0x7832,
+ 0x7E2B, 0x80DE, 0x840C, 0x90A6, 0x90A6, 0x98FD, 0x9D6C, 0x4EA1,
+ 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x671B, 0x671B, 0x5192, 0x6469,
+ 0x7FFB, 0x51E1, 0x78E8, 0x9B54, 0x2FC7, 0x69D9, 0x685D, 0x4FE3,
+ 0x53C8, 0x7E6D, 0x9EBF, 0x8108, 0x660E, 0x76DF, 0x8FF7, 0x5984,
+ 0x52D0, 0x76F2, 0x8017, 0x623E, 0x7D0B, 0x9580, 0x7D04, 0x8E8D,
+ 0x687A, 0x687A, 0x6801, 0x6109, 0x8AED, 0x8F38, 0x52C7, 0x6709,
+ 0x7336, 0x7336, 0x7337, 0x88D5, 0x904A, 0x66DC, 0x2EB7, 0x8981,
+ 0x990A, 0x7FCC, 0x7FFC, 0x8EB6, 0x862D, 0x7387, 0x9F8D, 0x9F8D,
+ 0x65C5, 0x6881, 0x71D0, 0x96A3, 0x9C57, 0x9E9F, 0x7C7B, 0x5EC9,
+ 0x6190, 0x9023, 0x6717, 0x8002, 0x8107, 0x50CA, 0x511A, 0x5154,
+ 0x5195, 0x2E87, 0x528D, 0x52D7, 0x52F9, 0x5349, 0x353E, 0x53DF,
+ 0x66FC, 0x5533, 0x55E4, 0x5455, 0x56C0, 0x5939, 0x5A1C, 0x5AC2,
+ 0x5B73, 0x5BC3, 0x5C14, 0x37E2, 0x5CE6, 0x5E54, 0x4E48, 0x5EE3,
+ 0x6097, 0x62D4, 0x62CC, 0x641C, 0x63C6, 0x6428, 0x8209, 0x631B,
+ 0x665F, 0x665F, 0x6663, 0x66F5, 0x675E, 0x689D, 0x688D, 0x69F6,
+ 0x6961, 0x5BE8, 0x5BE8, 0x69BB, 0x6BCC, 0x6F11, 0x6E17, 0x6F98,
+ 0x6CAA, 0x6CAA, 0x701B, 0x7162, 0x723B, 0x4E2C, 0x731C, 0x74CA,
+ 0x74EF, 0x7575, 0x75EC, 0x764E, 0x3FB1, 0x776A, 0x77A9, 0x7940,
+ 0x7953, 0x7953, 0x9F4B, 0x79AE, 0x9083, 0x7B53, 0x7C11, 0x7C14,
+ 0x4264, 0x7C50, 0x7C58, 0x7D46, 0x7D63, 0x7E22, 0x7E22, 0x7E48,
+ 0x7E35, 0x7E43, 0x7E8C, 0x7F50, 0x7F51, 0x7F51, 0x7F51, 0x7FC5,
+ 0x7FC6, 0x7FE9, 0x8141, 0x4453, 0x8258, 0x8279, 0x2EBF, 0x2EC0,
+ 0x82E3, 0x5179, 0x83A2, 0x8420, 0x83BD, 0x84F4, 0x856D, 0x8587,
+ 0x85F4, 0x4E55, 0x8737, 0x873B, 0x8805, 0x87BD, 0x867D, 0x8836,
+ 0x8944, 0x88C6, 0x89BD, 0x8ADB, 0x8B3E, 0x8B5A, 0x8D73, 0x8D99,
+ 0x8DCB, 0x8E34, 0x8E4A, 0x8FEF, 0x9087, 0x8FFA, 0x901E, 0x9035,
+ 0x9050, 0x8FC8, 0x9081, 0x908A, 0x908A, 0x908A, 0x908A, 0x908A,
+ 0x908A, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x9089,
+ 0x9089, 0x9089, 0x9089, 0x9089, 0x9089, 0x92CF, 0x93DD, 0x95BC,
+ 0x9621, 0x96B2, 0x975C, 0x9839, 0x98EB, 0x9903, 0x9909, 0x9945,
+ 0x9945, 0x994B, 0x9A08, 0x9A5F, 0x9A65, 0x9AEF, 0x9B18, 0x9BDF,
+ 0x9D09, 0x9D08, 0x9EA5, 0x9ECC, 0x9F08, 0x9F4A, 0x9F63, 0x9F67,
+ 0x9F6C, 0x7199, 0x7199, 0x891C, 0x68C8, 0x66FB, 0x5F45, 0x5300,
+ 0x5389, 0x5953, 0xFA11, 0x6852, 0x6A73, 0x6D87, 0xFA15, 0x8A12,
+ 0x4E04, 0x4E05, 0x4E1F, 0x4E2B, 0x4E2F, 0x4E30, 0x4E40, 0x4E41,
+ 0x4E44, 0x4E5A, 0x4E7F, 0x4E8D, 0x4E96, 0x4EB9, 0x4ED0, 0x4EE0,
+ 0x4EFD, 0x4EFF, 0x4F0B, 0x4F15, 0x4F60, 0x4F3B, 0x4F49, 0x4F54,
+ 0x4F7A, 0x4F7D, 0x4F7E, 0x4F97, 0x4FBE, 0x4FCF, 0x4FFD, 0x5000,
+ 0x5001, 0x5010, 0x501B, 0x5027, 0x502E, 0x5057, 0x5066, 0x506A,
+ 0x503B, 0x508F, 0x5096, 0x509C, 0x50CC, 0x50E6, 0x50E9, 0x50EF,
+ 0x5108, 0x510B, 0x5110, 0x511B, 0x511E, 0x515F, 0x51A1, 0x51BC,
+ 0x51DE, 0x51EE, 0x51F4, 0x5201, 0x5202, 0x5213, 0x5249, 0x5261,
+ 0x5266, 0x5293, 0x52C8, 0x52F0, 0x530A, 0x530B, 0x533E, 0x534C,
+ 0x534B, 0x5361, 0x536C, 0x53AB, 0x53DA, 0x53E6, 0x53F5, 0x5427,
+ 0x544D, 0x5466, 0x546B, 0x5474, 0x548D, 0x5496, 0x54A1, 0x54AD,
+ 0x54B9, 0x54BF, 0x54C6, 0x54CD, 0x550E, 0x552B, 0x5535, 0x554A,
+ 0x5560, 0x5561, 0x5588, 0x558E, 0x5608, 0x560E, 0x560F, 0x5637,
+ 0x563F, 0x5649, 0x564B, 0x564F, 0x5666, 0x5669, 0x566F, 0x5671,
+ 0x5672, 0x5695, 0x569A, 0x56AC, 0x56AD, 0x56B1, 0x56C9, 0x56DD,
+ 0x56E4, 0x570A, 0x5715, 0x5723, 0x572F, 0x5733, 0x5734, 0x574C,
+ 0x5770, 0x578C, 0x579C, 0x57B8, 0x57E6, 0x57ED, 0x57F5, 0x57F6,
+ 0x57FF, 0x5809, 0x5820, 0x5832, 0x587C, 0x5880, 0x58A9, 0x58CE,
+ 0x58D0, 0x58D4, 0x58DA, 0x58E9, 0x590C, 0x5924, 0x592F, 0x5961,
+ 0x596D, 0x59CA, 0x59D2, 0x59DD, 0x59E3, 0x59E4, 0x5A04, 0x5A0C,
+ 0x5A23, 0x5A47, 0x5A55, 0x5A63, 0x5A6D, 0x5A7E, 0x5A9E, 0x5AA7,
+ 0x5AAC, 0x5AB3, 0x5AE0, 0x5B00, 0x5B19, 0x5B25, 0x5B2D, 0x5B41,
+ 0x5B7C, 0x5B7E, 0x5B7F, 0x5B8A, 0x5C23, 0x5C2B, 0x5C30, 0x5C63,
+ 0x5C69, 0x5C7C, 0x5CCB, 0x5CD2, 0x5CF4, 0x5D24, 0x5D26, 0x5D43,
+ 0x5D46, 0x5D4A, 0x5D92, 0x5D94, 0x5D99, 0x5DA0, 0x5DD8, 0x5DE0,
+ 0x5DF8, 0x5E00, 0x5E12, 0x5E14, 0x5E15, 0x5E18, 0x5E2E, 0x5E58,
+ 0x5E6B, 0x5E6C, 0x5EA8, 0x5EAA, 0x5EBE, 0x5EBF, 0x5ECB, 0x5ED2,
+ 0x5F07, 0x5F0E, 0x5F1C, 0x5F1D, 0x5F22, 0x5F28, 0x5F36, 0x5F3B,
+ 0x5F40, 0x5F50, 0x5F58, 0x5F64, 0x5F89, 0x5F9C, 0x5FA7, 0x5FA4,
+ 0x5FAF, 0x5FB8, 0x5FC4, 0x5FC9, 0x5FE1, 0x5FE9, 0x5FED, 0x5FFC,
+ 0x6017, 0x601A, 0x6033, 0x6061, 0x607F, 0x609E, 0x60A4, 0x60B0,
+ 0x60CB, 0x60DB, 0x60F8, 0x6112, 0x6113, 0x6114, 0x611C, 0x617C,
+ 0x618D, 0x619F, 0x61A8, 0x61C2, 0x61DF, 0x6215, 0x6229, 0x6243,
+ 0x6246, 0x624C, 0x6251, 0x6256, 0x62C4, 0x62FC, 0x630A, 0x630D,
+ 0x6318, 0x6339, 0x6342, 0x6343, 0x6365, 0x6374, 0x637D, 0x6384,
+ 0x6387, 0x6390, 0x639E, 0x63D1, 0x63DC, 0x6409, 0x6410, 0x6422,
+ 0x6454, 0x645B, 0x646D, 0x647B, 0x64BE, 0x64BF, 0x64E5, 0x64F7,
+ 0x64FB, 0x6504, 0x6516, 0x6519, 0x6547, 0x6567, 0x6581, 0x6585,
+ 0x65C2, 0x65F0, 0x65F2, 0x662C, 0x664C, 0x665B, 0x665C, 0x6661,
+ 0x666B, 0x6677, 0x66A4, 0x66C8, 0x66EC, 0x6705, 0x6713, 0x6733,
+ 0x6748, 0x674C, 0x6776, 0x677B, 0x67B0, 0x67B2, 0x67F9, 0x67D7,
+ 0x67D9, 0x67F0, 0x682C, 0x6830, 0x6831, 0x685B, 0x6872, 0x6875,
+ 0x687A, 0x6884, 0x68A5, 0x68B2, 0x68D0, 0x68D6, 0x68E8, 0x68ED,
+ 0x68F0, 0x68F1, 0x68FC, 0x6911, 0x6913, 0x6935, 0x693B, 0x6957,
+ 0x6963, 0x6972, 0x697F, 0x6980, 0x69A6, 0x69AD, 0x69B7, 0x69D6,
+ 0x69D7, 0x6A01, 0x6A0F, 0x6A15, 0x6A28, 0x6A34, 0x6A3E, 0x6A45,
+ 0x6A50, 0x6A51, 0x6A56, 0x6A5B, 0x6A83, 0x6A89, 0x6A91, 0x6A9D,
+ 0x6A9E, 0x6A9F, 0x6ADC, 0x6AE7, 0x6AEC, 0x6B1E, 0x6B24, 0x6B35,
+ 0x6B46, 0x6B56, 0x6B60, 0x6B82, 0x6BBE, 0x6BE1, 0x6BF1, 0x6C10,
+ 0x6C33, 0x6C35, 0x6C3A, 0x6C59, 0x6C76, 0x6C7B, 0x6C85, 0x6C95,
+ 0x6C9C, 0x6CD0, 0x6CD4, 0x6CD6, 0x6CE0, 0x6CEB, 0x6CEC, 0x6CEE,
+ 0x6D0A, 0x6D0E, 0x6D11, 0x6D2E, 0x6D57, 0x6D5E, 0x6D65, 0x6D82,
+ 0x6DBF, 0x6DC4, 0x6DCA, 0x6DD6, 0x6DE9, 0x6E22, 0x6E51, 0x6EC7,
+ 0x6ECA, 0x6ECE, 0x6EFD, 0x6F1A, 0x6F2A, 0x6F2F, 0x6F33, 0x6F5A,
+ 0x6F5E, 0x6F62, 0x6F7D, 0x6F8B, 0x6F8D, 0x6F92, 0x6F94, 0x6F9A,
+ 0x6FA7, 0x6FA8, 0x6FB6, 0x6FDA, 0x6FDE, 0x6FF9, 0x7039, 0x703C,
+ 0x704A, 0x7054, 0x705D, 0x705E, 0x7064, 0x706C, 0x707E, 0x7081,
+ 0x7095, 0x70B7, 0x70D3, 0x70D4, 0x70D8, 0x70DC, 0x7107, 0x7120,
+ 0x7131, 0x714A, 0x7152, 0x7160, 0x7179, 0x7192, 0x71B3, 0x71CB,
+ 0x71D3, 0x71D6, 0x7200, 0x721D, 0x722B, 0x7238, 0x7241, 0x7253,
+ 0x7255, 0x7256, 0x725C, 0x728D, 0x72AD, 0x72B4, 0x72C7, 0x72FB,
+ 0x7304, 0x7305, 0x7328, 0x7331, 0x7343, 0x736C, 0x737C, 0x7383,
+ 0x7385, 0x7386, 0x7395, 0x739E, 0x739F, 0x73A0, 0x73A6, 0x73AB,
+ 0x73B5, 0x73B7, 0x73BC, 0x73CF, 0x73D9, 0x73E9, 0x73F4, 0x73FD,
+ 0x7404, 0x740A, 0x741A, 0x741B, 0x7424, 0x7428, 0x742C, 0x742F,
+ 0x7430, 0x7431, 0x7439, 0x7444, 0x7447, 0x744B, 0x744D, 0x7451,
+ 0x7457, 0x7466, 0x746B, 0x7471, 0x7480, 0x7485, 0x7486, 0x7487,
+ 0x7490, 0x7498, 0x749C, 0x74A0, 0x74A3, 0x74A8, 0x74AB, 0x74B5,
+ 0x74BF, 0x74C8, 0x74DA, 0x74DE, 0x754E, 0x7579, 0x7581, 0x7590,
+ 0x7592, 0x7593, 0x75B4, 0x75E4, 0x75F9, 0x7600, 0x760A, 0x7615,
+ 0x7616, 0x7619, 0x761E, 0x762D, 0x7635, 0x7643, 0x764B, 0x7665,
+ 0x766D, 0x766F, 0x7671, 0x7674, 0x76A4, 0x76A5, 0x76C5, 0x76CC,
+ 0x76EC, 0x76FC, 0x7734, 0x7736, 0x775C, 0x775F, 0x7760, 0x7772,
+ 0x777D, 0x7795, 0x77AA, 0x77E6, 0x77F0, 0x77F4, 0x7806, 0x7822,
+ 0x782D, 0x782E, 0x7830, 0x7835, 0x7868, 0x789E, 0x78C8, 0x78CC,
+ 0x78CE, 0x78E4, 0x78E0, 0x78E1, 0x78F2, 0x78F7, 0x78FB, 0x7931,
+ 0x7934, 0x793B, 0x793D, 0x7945, 0x795B, 0x795C, 0x798B, 0x7996,
+ 0x7998, 0x79B8, 0x79BB, 0x79CA, 0x79DA, 0x7A03, 0x7A09, 0x7A11,
+ 0x7A1E, 0x7A2D, 0x7A39, 0x7A45, 0x7A4C, 0x7A5D, 0x7A60, 0x7A6D,
+ 0x7A78, 0x7AA0, 0x7AA3, 0x7AB3, 0x7ABB, 0x7ABC, 0x7AC6, 0x7B07,
+ 0x7B14, 0x7B27, 0x7B31, 0x7B47, 0x7B4E, 0x7B60, 0x7B69, 0x7B6D,
+ 0x7B72, 0x7B91, 0x7BAF, 0x7BD7, 0x7BD9, 0x7C0B, 0x7C0F, 0x7C20,
+ 0x7C26, 0x7C31, 0x7C36, 0x7C51, 0x7C59, 0x7C67, 0x7C6E, 0x7C70,
+ 0x7CBC, 0x7CBF, 0x7CC8, 0x7CC9, 0x7CD7, 0x7CD9, 0x7CDD, 0x7CEB,
+ 0x7D07, 0x7D08, 0x7D09, 0x7D13, 0x7D1D, 0x7D23, 0x7D41, 0x7D53,
+ 0x7D59, 0x7D5D, 0x7D7A, 0x7D86, 0x7D8B, 0x7D8C, 0x7DCC, 0x7DEB,
+ 0x7DF1, 0x7DF9, 0x7E08, 0x7E11, 0x7E15, 0x7E20, 0x7E47, 0x7E62,
+ 0x7E6E, 0x7E73, 0x7E8D, 0x7E91, 0x7E98, 0x7F44, 0x7F4F, 0x7F52,
+ 0x7F53, 0x7F61, 0x7F91, 0x7FBF, 0x7FCE, 0x7FDF, 0x7FE5, 0x7FEC,
+ 0x7FEE, 0x7FEF, 0x7FFA, 0x800E, 0x8011, 0x8014, 0x8024, 0x8026,
+ 0x803A, 0x803C, 0x8060, 0x8071, 0x8075, 0x809E, 0x80A6, 0x80AB,
+ 0x80D7, 0x80D8, 0x8116, 0x8118, 0x813A, 0x814A, 0x814C, 0x8181,
+ 0x8184, 0x81B4, 0x81CF, 0x81F9, 0x8203, 0x8221, 0x8232, 0x8234,
+ 0x8246, 0x824B, 0x824F, 0x828E, 0x82AE, 0x82B7, 0x82BE, 0x82C6,
+ 0x82FE, 0x8343, 0x8351, 0x8355, 0x8386, 0x838D, 0x8392, 0x8398,
+ 0x83A9, 0x83BF, 0x83C0, 0x83EA, 0x840F, 0x8411, 0x844A, 0x8476,
+ 0x84A8, 0x84AF, 0x84C0, 0x84C2, 0x84F0, 0x84FD, 0x850C, 0x8534,
+ 0x855E, 0x858F, 0x85B7, 0x85CE, 0x85AD, 0x8612, 0x8629, 0x8652,
+ 0x8663, 0x866C, 0x866F, 0x867A, 0x868D, 0x8691, 0x8698, 0x86A7,
+ 0x86A8, 0x86FA, 0x86FD, 0x870B, 0x8713, 0x8719, 0x871E, 0x8728,
+ 0x873E, 0x8771, 0x8788, 0x8799, 0x87AC, 0x87AD, 0x87B5, 0x87D6,
+ 0x87EB, 0x87ED, 0x8801, 0x8803, 0x8806, 0x880B, 0x8814, 0x881C,
+ 0x8856, 0x885F, 0x8864, 0x8898, 0x88AA, 0x88BD, 0x88BE, 0x88CA,
+ 0x88D2, 0x88DB, 0x88F0, 0x88F1, 0x8906, 0x8918, 0x8919, 0x891A,
+ 0x8927, 0x8930, 0x893E, 0x897B, 0x89D4, 0x89D6, 0x89E5, 0x89F1,
+ 0x8A07, 0x8A0F, 0x8A15, 0x8A22, 0x8A4E, 0x8A7F, 0x8AF4, 0x8B1F,
+ 0x8B37, 0x8B43, 0x8B44, 0x8B54, 0x8B9C, 0x8B9E, 0x8C47, 0x8C54,
+ 0x8C73, 0x8CA4, 0x8CD9, 0x8CE1, 0x8CF8, 0x8CFE, 0x8D1B, 0x8D69,
+ 0x8D6C, 0x8D84, 0x8D8D, 0x8D95, 0x8DA6, 0x8DC6, 0x8DCE, 0x8DE4,
+ 0x8DEC, 0x8E20, 0x8E4B, 0x8E6C, 0x8E70, 0x8E7A, 0x8E92, 0x8EAE,
+ 0x8EB3, 0x8ED1, 0x8ED4, 0x8EF9, 0x8F17, 0x8F36, 0x8FA6, 0x8FB5,
+ 0x8FB6, 0x8FC6, 0x8FE0, 0x8FE4, 0x8FF6, 0x9002, 0x902C, 0x9044,
+ 0x9088, 0x9095, 0x9099, 0x909B, 0x90A2, 0x90B4, 0x90D7, 0x90DD,
+ 0x90F4, 0x9117, 0x911C, 0x9131, 0x913A, 0x913D, 0x9148, 0x915B,
+ 0x9161, 0x9164, 0x918E, 0x919E, 0x91A8, 0x91AD, 0x91AE, 0x91B2,
+ 0x91BC, 0x91F0, 0x91F7, 0x91FB, 0x9207, 0x9228, 0x9233, 0x9238,
+ 0x9243, 0x9247, 0x924F, 0x9260, 0x92C2, 0x92CB, 0x92CC, 0x92DF,
+ 0x930D, 0x9315, 0x931F, 0x9327, 0x9347, 0x9352, 0x9365, 0x936A,
+ 0x936D, 0x939B, 0x93BA, 0x93A9, 0x93C1, 0x93CA, 0x93E2, 0x93FA,
+ 0x93FD, 0x940F, 0x9434, 0x943F, 0x9455, 0x946B, 0x9472, 0x9578,
+ 0x95A6, 0x95A9, 0x95AB, 0x95B4, 0x95BD, 0x95DA, 0x961D, 0x9641,
+ 0x9658, 0x9684, 0x96A4, 0x96A9, 0x96D2, 0x5DB2, 0x96DE, 0x96E9,
+ 0x96F1, 0x9702, 0x9709, 0x975A, 0x9763, 0x976E, 0x9773, 0x979A,
+ 0x97A2, 0x97B5, 0x97B6, 0x97D9, 0x97DE, 0x97F4, 0x980A, 0x980E,
+ 0x981E, 0x9823, 0x982B, 0x983E, 0x9852, 0x9853, 0x9859, 0x986C,
+ 0x98B8, 0x98BA, 0x98BF, 0x98C8, 0x98E5, 0x9932, 0x9933, 0x9940,
+ 0x994D, 0x995C, 0x995F, 0x99B1, 0x99B9, 0x99BA, 0x99C9, 0x9A02,
+ 0x9A16, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A36, 0x9A38, 0x9A4A,
+ 0x9A56, 0x9AB5, 0x9AB6, 0x9AF9, 0x9B03, 0x9B20, 0x9B33, 0x9B34,
+ 0x9B73, 0x9B79, 0x9BA7, 0x9BC1, 0x9BC7, 0x9BD7, 0x9BE7, 0x9BEB,
+ 0x9BF7, 0x9BFA, 0x9BFD, 0x9C0B, 0x9C27, 0x9C2A, 0x9C36, 0x9C41,
+ 0x9C53, 0x9C63, 0x9C6A, 0x9C77, 0x9D02, 0x9D42, 0x9D47, 0x9D63,
+ 0x9D69, 0x9D7C, 0x9D7E, 0x9D8D, 0x9DB1, 0x9DC3, 0x9DC7, 0x9DD6,
+ 0x9DDF, 0x9DEB, 0x9DF4, 0x9E15, 0x9E1D, 0x9EA4, 0x9EA8, 0x9EAC,
+ 0x9EE7, 0x9EEE, 0x9F10, 0x9F12, 0x9F17, 0x9F19, 0x9F2F, 0x9F37,
+ 0x9F39, 0x9F41, 0x9F45, 0x9F57, 0x9F68, 0x9F71, 0x9F75, 0x9F90,
+ 0x9F94, 0x9FA2, 0x4E30, 0x3405, 0x4F60, 0x5620, 0x5ECB, 0x2E95,
+ 0x60A4, 0x69D7, 0x6B24, 0x6FF9, 0x6EE6, 0x71B3, 0x2EA4, 0x7AC6,
+ 0x7F61, 0x8071, 0x809E, 0x2ECC, 0x91F0, 0x5DB2, 0x97DE, 0x4FD3,
+ 0x50D9, 0x50F0, 0x51C3, 0x5676, 0x6A54, 0x6D01, 0x6DD0, 0x6E42,
+ 0x6ED9, 0x73E4, 0x7421, 0x756C, 0x7851, 0x87F5, 0xFFFD, 0x73A8,
+ 0x3AF3, 0x34DB, 0x440C, 0x3E8A, 0xFFFD, 0xFFFD, 0x4BE8, 0xFFFD,
+ 0x3EDA, 0x3B22, 0xFFFD, 0x457A, 0x4093, 0xFFFD, 0x4665, 0x4103,
+ 0x4293, 0x46AE, 0x3488, 0xFFFD,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
new file mode 100644
index 0000000000..f0e01e1e23
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_EUC_H_1[120 * 3] = {
+ 0x0020, 0x007E, 0x00E7, 0x8EA0, 0x8EDF, 0x0146, 0xA1A1, 0xA1FE, 0x0279,
+ 0xA2A1, 0xA2AE, 0x02D7, 0xA2BA, 0xA2C1, 0x02E5, 0xA2CA, 0xA2D0, 0x02ED,
+ 0xA2DC, 0xA2EA, 0x02F4, 0xA2F2, 0xA2F9, 0x0303, 0xA2FE, 0xA2FE, 0x030B,
+ 0xA3B0, 0xA3B9, 0x030C, 0xA3C1, 0xA3DA, 0x0316, 0xA3E1, 0xA3FA, 0x0330,
+ 0xA4A1, 0xA4F3, 0x034A, 0xA5A1, 0xA5F6, 0x039D, 0xA6A1, 0xA6B8, 0x03F3,
+ 0xA6C1, 0xA6D8, 0x040B, 0xA7A1, 0xA7C1, 0x0423, 0xA7D1, 0xA7F1, 0x0444,
+ 0xA8A1, 0xA8A1, 0x1D37, 0xA8A2, 0xA8A2, 0x1D39, 0xA8A3, 0xA8A3, 0x1D43,
+ 0xA8A4, 0xA8A4, 0x1D47, 0xA8A5, 0xA8A5, 0x1D4F, 0xA8A6, 0xA8A6, 0x1D4B,
+ 0xA8A7, 0xA8A7, 0x1D53, 0xA8A8, 0xA8A8, 0x1D63, 0xA8A9, 0xA8A9, 0x1D5B,
+ 0xA8AA, 0xA8AA, 0x1D6B, 0xA8AB, 0xA8AB, 0x1D73, 0xA8AC, 0xA8AC, 0x1D38,
+ 0xA8AD, 0xA8AD, 0x1D3A, 0xA8AE, 0xA8AE, 0x1D46, 0xA8AF, 0xA8AF, 0x1D4A,
+ 0xA8B0, 0xA8B0, 0x1D52, 0xA8B1, 0xA8B1, 0x1D4E, 0xA8B2, 0xA8B2, 0x1D5A,
+ 0xA8B3, 0xA8B3, 0x1D6A, 0xA8B4, 0xA8B4, 0x1D62, 0xA8B5, 0xA8B5, 0x1D72,
+ 0xA8B6, 0xA8B6, 0x1D82, 0xA8B7, 0xA8B7, 0x1D57, 0xA8B8, 0xA8B8, 0x1D66,
+ 0xA8B9, 0xA8B9, 0x1D5F, 0xA8BA, 0xA8BA, 0x1D6E, 0xA8BB, 0xA8BB, 0x1D76,
+ 0xA8BC, 0xA8BC, 0x1D54, 0xA8BD, 0xA8BD, 0x1D67, 0xA8BE, 0xA8BE, 0x1D5C,
+ 0xA8BF, 0xA8BF, 0x1D6F, 0xA8C0, 0xA8C0, 0x1D79, 0xB0A1, 0xB0FE, 0x0465,
+ 0xB1A1, 0xB1FE, 0x04C3, 0xB2A1, 0xB2FE, 0x0521, 0xB3A1, 0xB3FE, 0x057F,
+ 0xB4A1, 0xB4FE, 0x05DD, 0xB5A1, 0xB5FE, 0x063B, 0xB6A1, 0xB6FE, 0x0699,
+ 0xB7A1, 0xB7FE, 0x06F7, 0xB8A1, 0xB8FE, 0x0755, 0xB9A1, 0xB9FE, 0x07B3,
+ 0xBAA1, 0xBAFE, 0x0811, 0xBBA1, 0xBBFE, 0x086F, 0xBCA1, 0xBCFE, 0x08CD,
+ 0xBDA1, 0xBDFE, 0x092B, 0xBEA1, 0xBEFE, 0x0989, 0xBFA1, 0xBFFE, 0x09E7,
+ 0xC0A1, 0xC0FE, 0x0A45, 0xC1A1, 0xC1FE, 0x0AA3, 0xC2A1, 0xC2FE, 0x0B01,
+ 0xC3A1, 0xC3FE, 0x0B5F, 0xC4A1, 0xC4FE, 0x0BBD, 0xC5A1, 0xC5FE, 0x0C1B,
+ 0xC6A1, 0xC6FE, 0x0C79, 0xC7A1, 0xC7FE, 0x0CD7, 0xC8A1, 0xC8FE, 0x0D35,
+ 0xC9A1, 0xC9FE, 0x0D93, 0xCAA1, 0xCAFE, 0x0DF1, 0xCBA1, 0xCBFE, 0x0E4F,
+ 0xCCA1, 0xCCFE, 0x0EAD, 0xCDA1, 0xCDFE, 0x0F0B, 0xCEA1, 0xCEFE, 0x0F69,
+ 0xCFA1, 0xCFD3, 0x0FC7, 0xD0A1, 0xD0FE, 0x0FFA, 0xD1A1, 0xD1FE, 0x1058,
+ 0xD2A1, 0xD2FE, 0x10B6, 0xD3A1, 0xD3FE, 0x1114, 0xD4A1, 0xD4FE, 0x1172,
+ 0xD5A1, 0xD5FE, 0x11D0, 0xD6A1, 0xD6FE, 0x122E, 0xD7A1, 0xD7FE, 0x128C,
+ 0xD8A1, 0xD8FE, 0x12EA, 0xD9A1, 0xD9FE, 0x1348, 0xDAA1, 0xDAFE, 0x13A6,
+ 0xDBA1, 0xDBFE, 0x1404, 0xDCA1, 0xDCFE, 0x1462, 0xDDA1, 0xDDFE, 0x14C0,
+ 0xDEA1, 0xDEFE, 0x151E, 0xDFA1, 0xDFFE, 0x157C, 0xE0A1, 0xE0FE, 0x15DA,
+ 0xE1A1, 0xE1FE, 0x1638, 0xE2A1, 0xE2FE, 0x1696, 0xE3A1, 0xE3FE, 0x16F4,
+ 0xE4A1, 0xE4FE, 0x1752, 0xE5A1, 0xE5FE, 0x17B0, 0xE6A1, 0xE6FE, 0x180E,
+ 0xE7A1, 0xE7FE, 0x186C, 0xE8A1, 0xE8FE, 0x18CA, 0xE9A1, 0xE9FE, 0x1928,
+ 0xEAA1, 0xEAFE, 0x1986, 0xEBA1, 0xEBFE, 0x19E4, 0xECA1, 0xECFE, 0x1A42,
+ 0xEDA1, 0xEDFE, 0x1AA0, 0xEEA1, 0xEEFE, 0x1AFE, 0xEFA1, 0xEFFE, 0x1B5C,
+ 0xF0A1, 0xF0FE, 0x1BBA, 0xF1A1, 0xF1FE, 0x1C18, 0xF2A1, 0xF2FE, 0x1C76,
+ 0xF3A1, 0xF3FE, 0x1CD4, 0xF4A1, 0xF4A4, 0x1D32, 0xF4A5, 0xF4A6, 0x205C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp
new file mode 100644
index 0000000000..3b4fb79b3a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_EUC_V_1[27 * 3] = {
+ 0xA1A2, 0xA1A3, 0x1ECF, 0xA1B1, 0xA1B2, 0x1ED1, 0xA1BC, 0xA1BE, 0x1ED3,
+ 0xA1C1, 0xA1C5, 0x1ED6, 0xA1CA, 0xA1DB, 0x1EDB, 0xA1E1, 0xA1E1, 0x1EED,
+ 0xA4A1, 0xA4A1, 0x1EEE, 0xA4A3, 0xA4A3, 0x1EEF, 0xA4A5, 0xA4A5, 0x1EF0,
+ 0xA4A7, 0xA4A7, 0x1EF1, 0xA4A9, 0xA4A9, 0x1EF2, 0xA4C3, 0xA4C3, 0x1EF3,
+ 0xA4E3, 0xA4E3, 0x1EF4, 0xA4E5, 0xA4E5, 0x1EF5, 0xA4E7, 0xA4E7, 0x1EF6,
+ 0xA4EE, 0xA4EE, 0x1EF7, 0xA5A1, 0xA5A1, 0x1EF8, 0xA5A3, 0xA5A3, 0x1EF9,
+ 0xA5A5, 0xA5A5, 0x1EFA, 0xA5A7, 0xA5A7, 0x1EFB, 0xA5A9, 0xA5A9, 0x1EFC,
+ 0xA5C3, 0xA5C3, 0x1EFD, 0xA5E3, 0xA5E3, 0x1EFE, 0xA5E5, 0xA5E5, 0x1EFF,
+ 0xA5E7, 0xA5E7, 0x1F00, 0xA5EE, 0xA5EE, 0x1F01, 0xA5F5, 0xA5F6, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp
new file mode 100644
index 0000000000..a269ba6c2c
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp
@@ -0,0 +1,230 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Ext_RKSJ_H_2[665 * 3] = {
+ 0x0020, 0x007E, 0x00E7, 0x00A0, 0x00DF, 0x0146, 0x8140, 0x817E, 0x0279,
+ 0x8180, 0x8188, 0x02B8, 0x8189, 0x8189, 0x1D36, 0x818A, 0x81AC, 0x02C2,
+ 0x824F, 0x8258, 0x030C, 0x8260, 0x8279, 0x0316, 0x8281, 0x829A, 0x0330,
+ 0x829F, 0x82F1, 0x034A, 0x8340, 0x837E, 0x039D, 0x8380, 0x8396, 0x03DC,
+ 0x839F, 0x83B6, 0x03F3, 0x83BF, 0x83D6, 0x040B, 0x8440, 0x8460, 0x0423,
+ 0x8470, 0x847E, 0x0444, 0x8480, 0x8491, 0x0453, 0x8540, 0x857E, 0x00E8,
+ 0x8580, 0x8580, 0x0186, 0x8581, 0x859E, 0x0128, 0x859F, 0x85DD, 0x0147,
+ 0x85DE, 0x85FC, 0x0187, 0x8640, 0x867E, 0x01A6, 0x8680, 0x8691, 0x01E5,
+ 0x8692, 0x8692, 0x0127, 0x8693, 0x869E, 0x01F7, 0x86A2, 0x86ED, 0x1D37,
+ 0x8740, 0x875D, 0x1D83, 0x875F, 0x8775, 0x1DA1, 0x877E, 0x877E, 0x2083,
+ 0x8780, 0x878F, 0x1DB8, 0x8790, 0x8790, 0x02FA, 0x8791, 0x8791, 0x02F9,
+ 0x8792, 0x8792, 0x0301, 0x8793, 0x8799, 0x1DC8, 0x879A, 0x879A, 0x0300,
+ 0x879B, 0x879C, 0x1DCF, 0x889F, 0x889F, 0x0465, 0x88A0, 0x88A0, 0x1DD1,
+ 0x88A1, 0x88B0, 0x0467, 0x88B1, 0x88B1, 0x1CA2, 0x88B2, 0x88B8, 0x0478,
+ 0x88B9, 0x88B9, 0x1DD2, 0x88BA, 0x88EB, 0x0480, 0x88EC, 0x88EC, 0x1DD3,
+ 0x88ED, 0x88F0, 0x04B3, 0x88F1, 0x88F1, 0x1DD4, 0x88F2, 0x88F9, 0x04B8,
+ 0x88FA, 0x88FA, 0x1DD5, 0x88FB, 0x88FC, 0x04C1, 0x8940, 0x8948, 0x04C3,
+ 0x8949, 0x8949, 0x1DD6, 0x894A, 0x8953, 0x04CD, 0x8954, 0x8954, 0x1DD7,
+ 0x8955, 0x8957, 0x04D8, 0x8958, 0x8958, 0x1DD8, 0x8959, 0x895A, 0x04DC,
+ 0x895B, 0x895C, 0x1DD9, 0x895D, 0x8960, 0x04E0, 0x8961, 0x8961, 0x1DDB,
+ 0x8962, 0x897E, 0x04E5, 0x8980, 0x898A, 0x0502, 0x898B, 0x898B, 0x1DDC,
+ 0x898C, 0x89A5, 0x050E, 0x89A6, 0x89A6, 0x1DDD, 0x89A7, 0x89A7, 0x1CC9,
+ 0x89A8, 0x89A8, 0x1DDE, 0x89A9, 0x89DD, 0x052B, 0x89DE, 0x89DE, 0x1DDF,
+ 0x89DF, 0x89F7, 0x0561, 0x89F8, 0x89F8, 0x1DE0, 0x89F9, 0x89FA, 0x057B,
+ 0x89FB, 0x89FB, 0x1DE1, 0x89FC, 0x89FC, 0x057E, 0x8A40, 0x8A40, 0x057F,
+ 0x8A41, 0x8A41, 0x1DE2, 0x8A42, 0x8A60, 0x0581, 0x8A61, 0x8A61, 0x1961,
+ 0x8A62, 0x8A67, 0x05A1, 0x8A68, 0x8A68, 0x139F, 0x8A69, 0x8A7E, 0x05A8,
+ 0x8A80, 0x8A84, 0x05BE, 0x8A85, 0x8A85, 0x1DE3, 0x8A86, 0x8A8A, 0x05C4,
+ 0x8A8B, 0x8A8B, 0x1DE4, 0x8A8C, 0x8A92, 0x05CA, 0x8A93, 0x8A93, 0x1DE5,
+ 0x8A94, 0x8A95, 0x05D2, 0x8A96, 0x8A96, 0x1731, 0x8A97, 0x8A99, 0x05D5,
+ 0x8A9A, 0x8A9A, 0x1DE6, 0x8A9B, 0x8ABF, 0x05D9, 0x8AC0, 0x8AC0, 0x1DE7,
+ 0x8AC1, 0x8AC1, 0x1572, 0x8AC2, 0x8ACA, 0x0600, 0x8ACB, 0x8ACB, 0x1DE8,
+ 0x8ACC, 0x8ACF, 0x060A, 0x8AD0, 0x8AD0, 0x1A20, 0x8AD1, 0x8AE2, 0x060F,
+ 0x8AE3, 0x8AE3, 0x1DE9, 0x8AE4, 0x8AFC, 0x0622, 0x8B40, 0x8B49, 0x063B,
+ 0x8B4A, 0x8B4A, 0x1DEA, 0x8B4B, 0x8B5E, 0x0646, 0x8B5F, 0x8B5F, 0x1DEB,
+ 0x8B60, 0x8B7E, 0x065B, 0x8B80, 0x8B9F, 0x067A, 0x8BA0, 0x8BA0, 0x1DEC,
+ 0x8BA1, 0x8BA7, 0x069B, 0x8BA8, 0x8BA8, 0x1DED, 0x8BA9, 0x8BC3, 0x06A3,
+ 0x8BC4, 0x8BC4, 0x1D32, 0x8BC5, 0x8BCC, 0x06BF, 0x8BCD, 0x8BCD, 0x1DEE,
+ 0x8BCE, 0x8BEA, 0x06C8, 0x8BEB, 0x8BEB, 0x1DEF, 0x8BEC, 0x8BF1, 0x06E6,
+ 0x8BF2, 0x8BF2, 0x1DF0, 0x8BF3, 0x8BF8, 0x06ED, 0x8BF9, 0x8BF9, 0x1DF1,
+ 0x8BFA, 0x8BFA, 0x06F4, 0x8BFB, 0x8BFB, 0x1DF2, 0x8BFC, 0x8BFC, 0x06F6,
+ 0x8C40, 0x8C42, 0x06F7, 0x8C43, 0x8C43, 0x1DF3, 0x8C44, 0x8C55, 0x06FB,
+ 0x8C56, 0x8C56, 0x1DF4, 0x8C57, 0x8C63, 0x070E, 0x8C64, 0x8C64, 0x1DF5,
+ 0x8C65, 0x8C6C, 0x071C, 0x8C6D, 0x8C6D, 0x1DF6, 0x8C6E, 0x8C70, 0x0725,
+ 0x8C71, 0x8C71, 0x1DF7, 0x8C72, 0x8C73, 0x0729, 0x8C74, 0x8C74, 0x1DF8,
+ 0x8C75, 0x8C79, 0x072C, 0x8C7A, 0x8C7A, 0x1C0D, 0x8C7B, 0x8C7E, 0x0732,
+ 0x8C80, 0x8C83, 0x0736, 0x8C84, 0x8C84, 0x1DF9, 0x8C85, 0x8C90, 0x073B,
+ 0x8C91, 0x8C91, 0x1DFA, 0x8C92, 0x8C98, 0x0748, 0x8C99, 0x8C99, 0x1DFB,
+ 0x8C9A, 0x8C9D, 0x0750, 0x8C9E, 0x8C9E, 0x1DFC, 0x8C9F, 0x8CB1, 0x0755,
+ 0x8CB2, 0x8CB2, 0x1DFD, 0x8CB3, 0x8CBE, 0x0769, 0x8CBF, 0x8CBF, 0x1DFE,
+ 0x8CC0, 0x8CFC, 0x0776, 0x8D40, 0x8D49, 0x07B3, 0x8D4A, 0x8D4A, 0x1DFF,
+ 0x8D4B, 0x8D55, 0x07BE, 0x8D56, 0x8D56, 0x1E00, 0x8D57, 0x8D60, 0x07CA,
+ 0x8D61, 0x8D61, 0x1E01, 0x8D62, 0x8D7A, 0x07D5, 0x8D7B, 0x8D7B, 0x16DD,
+ 0x8D7C, 0x8D7E, 0x07EF, 0x8D80, 0x8D8C, 0x07F2, 0x8D8D, 0x8D8D, 0x1E02,
+ 0x8D8E, 0x8D93, 0x0800, 0x8D94, 0x8D94, 0x1E03, 0x8D95, 0x8D98, 0x0807,
+ 0x8D99, 0x8D99, 0x1E04, 0x8D9A, 0x8DD0, 0x080C, 0x8DD1, 0x8DD1, 0x1E05,
+ 0x8DD2, 0x8DE4, 0x0844, 0x8DE5, 0x8DE5, 0x1E06, 0x8DE6, 0x8DF1, 0x0858,
+ 0x8DF2, 0x8DF2, 0x1E07, 0x8DF3, 0x8DFC, 0x0865, 0x8E40, 0x8E45, 0x086F,
+ 0x8E46, 0x8E46, 0x1E08, 0x8E47, 0x8E48, 0x0876, 0x8E49, 0x8E49, 0x1E09,
+ 0x8E4A, 0x8E4A, 0x0879, 0x8E4B, 0x8E4B, 0x1E0A, 0x8E4C, 0x8E57, 0x087B,
+ 0x8E58, 0x8E58, 0x1E0B, 0x8E59, 0x8E7E, 0x0888, 0x8E80, 0x8EB5, 0x08AE,
+ 0x8EB6, 0x8EB6, 0x1E0C, 0x8EB7, 0x8EC5, 0x08E5, 0x8EC6, 0x8EC6, 0x1E0D,
+ 0x8EC7, 0x8EC7, 0x1929, 0x8EC8, 0x8ED4, 0x08F6, 0x8ED5, 0x8ED5, 0x1E0E,
+ 0x8ED6, 0x8EDA, 0x0904, 0x8EDB, 0x8EDC, 0x1E0F, 0x8EDD, 0x8EFC, 0x090B,
+ 0x8F40, 0x8F49, 0x092B, 0x8F4A, 0x8F4A, 0x1E11, 0x8F4B, 0x8F54, 0x0936,
+ 0x8F55, 0x8F55, 0x1E12, 0x8F56, 0x8F7E, 0x0941, 0x8F80, 0x8F8B, 0x096A,
+ 0x8F8C, 0x8F8D, 0x1E13, 0x8F8E, 0x8F91, 0x0978, 0x8F92, 0x8F93, 0x1E15,
+ 0x8F94, 0x8FA2, 0x097E, 0x8FA3, 0x8FA3, 0x1E17, 0x8FA4, 0x8FB0, 0x098E,
+ 0x8FB1, 0x8FB1, 0x1E18, 0x8FB2, 0x8FBC, 0x099C, 0x8FBD, 0x8FBD, 0x1E19,
+ 0x8FBE, 0x8FD2, 0x09A8, 0x8FD3, 0x8FD3, 0x1E1A, 0x8FD4, 0x8FDC, 0x09BE,
+ 0x8FDD, 0x8FDD, 0x1E1B, 0x8FDE, 0x8FE1, 0x09C8, 0x8FE2, 0x8FE2, 0x1E1C,
+ 0x8FE3, 0x8FFC, 0x09CD, 0x9040, 0x9048, 0x09E7, 0x9049, 0x9049, 0x1E1D,
+ 0x904A, 0x9077, 0x09F1, 0x9078, 0x9078, 0x1E1E, 0x9079, 0x907E, 0x0A20,
+ 0x9080, 0x9080, 0x1E1F, 0x9081, 0x9088, 0x0A27, 0x9089, 0x9089, 0x1E20,
+ 0x908A, 0x909F, 0x0A30, 0x90A0, 0x90A0, 0x1E21, 0x90A1, 0x90BF, 0x0A47,
+ 0x90C0, 0x90C0, 0x1E22, 0x90C1, 0x90E3, 0x0A67, 0x90E4, 0x90E4, 0x1E23,
+ 0x90E5, 0x90EE, 0x0A8B, 0x90EF, 0x90F0, 0x1E24, 0x90F1, 0x90F6, 0x0A97,
+ 0x90F7, 0x90F8, 0x1E26, 0x90F9, 0x90FC, 0x0A9F, 0x9140, 0x9145, 0x0AA3,
+ 0x9146, 0x9146, 0x1E28, 0x9147, 0x9147, 0x1A6E, 0x9148, 0x9157, 0x0AAB,
+ 0x9158, 0x9158, 0x1E29, 0x9159, 0x916A, 0x0ABC, 0x916B, 0x916B, 0x1E2A,
+ 0x916C, 0x916D, 0x0ACF, 0x916E, 0x916E, 0x1E2B, 0x916F, 0x917D, 0x0AD2,
+ 0x917E, 0x917E, 0x1E2C, 0x9180, 0x9188, 0x0AE2, 0x9189, 0x9189, 0x1E2D,
+ 0x918A, 0x91BA, 0x0AEC, 0x91BB, 0x91BB, 0x1E2E, 0x91BC, 0x91CA, 0x0B1E,
+ 0x91CB, 0x91CB, 0x1E2F, 0x91CC, 0x91D9, 0x0B2E, 0x91DA, 0x91DA, 0x1E30,
+ 0x91DB, 0x91E0, 0x0B3D, 0x91E1, 0x91E1, 0x1E31, 0x91E2, 0x91EC, 0x0B44,
+ 0x91ED, 0x91ED, 0x1E32, 0x91EE, 0x91F2, 0x0B50, 0x91F3, 0x91F4, 0x1E33,
+ 0x91F5, 0x91FA, 0x0B57, 0x91FB, 0x91FB, 0x1E35, 0x91FC, 0x91FC, 0x0B5E,
+ 0x9240, 0x9245, 0x0B5F, 0x9246, 0x9246, 0x1E36, 0x9247, 0x9247, 0x0B66,
+ 0x9248, 0x9249, 0x1E37, 0x924A, 0x924B, 0x0B69, 0x924C, 0x924D, 0x1E39,
+ 0x924E, 0x925B, 0x0B6D, 0x925C, 0x925C, 0x1E3B, 0x925D, 0x927E, 0x0B7C,
+ 0x9280, 0x928F, 0x0B9E, 0x9290, 0x9290, 0x1E3C, 0x9291, 0x9294, 0x0BAF,
+ 0x9295, 0x9295, 0x1E3D, 0x9296, 0x929B, 0x0BB4, 0x929C, 0x929C, 0x1E3E,
+ 0x929D, 0x92BA, 0x0BBB, 0x92BB, 0x92BB, 0x1E3F, 0x92BC, 0x92C5, 0x0BDA,
+ 0x92C6, 0x92C6, 0x1E40, 0x92C7, 0x92C7, 0x0BE5, 0x92C8, 0x92C8, 0x1E41,
+ 0x92C9, 0x92CA, 0x0BE7, 0x92CB, 0x92CB, 0x1E42, 0x92CC, 0x92CC, 0x0BEA,
+ 0x92CD, 0x92CD, 0x1E43, 0x92CE, 0x92D8, 0x0BEC, 0x92D9, 0x92D9, 0x11B5,
+ 0x92DA, 0x92FC, 0x0BF8, 0x9340, 0x9340, 0x0C1B, 0x9341, 0x9341, 0x1E44,
+ 0x9342, 0x9345, 0x0C1D, 0x9346, 0x9346, 0x1E45, 0x9347, 0x934C, 0x0C22,
+ 0x934D, 0x934D, 0x1E46, 0x934E, 0x9354, 0x0C29, 0x9355, 0x9355, 0x1E47,
+ 0x9356, 0x935D, 0x0C31, 0x935E, 0x935E, 0x1E48, 0x935F, 0x9366, 0x0C3A,
+ 0x9367, 0x9367, 0x1E49, 0x9368, 0x9369, 0x0C43, 0x936A, 0x936A, 0x1E4A,
+ 0x936B, 0x936F, 0x0C46, 0x9370, 0x9371, 0x1E4B, 0x9372, 0x9375, 0x0C4D,
+ 0x9376, 0x9376, 0x16DF, 0x9377, 0x937E, 0x0C52, 0x9380, 0x9383, 0x0C5A,
+ 0x9384, 0x9384, 0x1E4D, 0x9385, 0x938D, 0x0C5F, 0x938E, 0x938E, 0x1450,
+ 0x938F, 0x9392, 0x0C69, 0x9393, 0x9393, 0x1536, 0x9394, 0x9397, 0x0C6E,
+ 0x9398, 0x9398, 0x1E4E, 0x9399, 0x93BB, 0x0C73, 0x93BC, 0x93BC, 0x1E4F,
+ 0x93BD, 0x93BF, 0x0C97, 0x93C0, 0x93C0, 0x1E50, 0x93C1, 0x93D1, 0x0C9B,
+ 0x93D2, 0x93D3, 0x1E51, 0x93D4, 0x93D8, 0x0CAE, 0x93D9, 0x93DA, 0x1E53,
+ 0x93DB, 0x93DE, 0x0CB5, 0x93DF, 0x93DF, 0x1E55, 0x93E0, 0x93E3, 0x0CBA,
+ 0x93E4, 0x93E5, 0x1E56, 0x93E6, 0x93E7, 0x0CC0, 0x93E8, 0x93E8, 0x1E58,
+ 0x93E9, 0x93F3, 0x0CC3, 0x93F4, 0x93F4, 0x1AED, 0x93F5, 0x93FC, 0x0CCF,
+ 0x9440, 0x9447, 0x0CD7, 0x9448, 0x9448, 0x1E59, 0x9449, 0x9457, 0x0CE0,
+ 0x9458, 0x9458, 0x1E5A, 0x9459, 0x9475, 0x0CF0, 0x9476, 0x9476, 0x1E5B,
+ 0x9477, 0x947E, 0x0D0E, 0x9480, 0x9486, 0x0D16, 0x9487, 0x9487, 0x1E5C,
+ 0x9488, 0x9488, 0x1989, 0x9489, 0x9489, 0x1E5D, 0x948A, 0x948C, 0x0D20,
+ 0x948D, 0x948D, 0x1E5E, 0x948E, 0x94A1, 0x0D24, 0x94A2, 0x94A2, 0x1E5F,
+ 0x94A3, 0x94AB, 0x0D39, 0x94AC, 0x94AC, 0x1E60, 0x94AD, 0x94AD, 0x0D43,
+ 0x94AE, 0x94AE, 0x1E61, 0x94AF, 0x94D1, 0x0D45, 0x94D2, 0x94D2, 0x1E62,
+ 0x94D3, 0x94DF, 0x0D69, 0x94E0, 0x94E0, 0x1E63, 0x94E1, 0x94F2, 0x0D77,
+ 0x94F3, 0x94F3, 0x1E64, 0x94F4, 0x94FC, 0x0D8A, 0x9540, 0x9540, 0x0D93,
+ 0x9541, 0x9542, 0x1E65, 0x9543, 0x954D, 0x0D96, 0x954E, 0x954E, 0x1E67,
+ 0x954F, 0x954F, 0x143B, 0x9550, 0x9550, 0x0DA3, 0x9551, 0x9551, 0x1E68,
+ 0x9552, 0x9553, 0x0DA5, 0x9554, 0x9554, 0x1E69, 0x9555, 0x955E, 0x0DA8,
+ 0x955F, 0x955F, 0x1E6A, 0x9560, 0x956C, 0x0DB3, 0x956D, 0x956D, 0x1E6B,
+ 0x956E, 0x956F, 0x0DC1, 0x9570, 0x9570, 0x1E6C, 0x9571, 0x957E, 0x0DC4,
+ 0x9580, 0x95C0, 0x0DD2, 0x95C1, 0x95C1, 0x1E6D, 0x95C2, 0x95CA, 0x0E14,
+ 0x95CB, 0x95CB, 0x1E6E, 0x95CC, 0x95D7, 0x0E1E, 0x95D8, 0x95D8, 0x1E6F,
+ 0x95D9, 0x95F6, 0x0E2B, 0x95F7, 0x95F7, 0x1E70, 0x95F8, 0x95FC, 0x0E4A,
+ 0x9640, 0x9640, 0x0E4F, 0x9641, 0x9641, 0x1E71, 0x9642, 0x9647, 0x0E51,
+ 0x9648, 0x9648, 0x1E72, 0x9649, 0x9669, 0x0E58, 0x966A, 0x966A, 0x1E73,
+ 0x966B, 0x967E, 0x0E7A, 0x9680, 0x9689, 0x0E8E, 0x968A, 0x968A, 0x1D33,
+ 0x968B, 0x968F, 0x0E99, 0x9690, 0x9690, 0x1E74, 0x9691, 0x9698, 0x0E9F,
+ 0x9699, 0x9699, 0x102F, 0x969A, 0x96CA, 0x0EA8, 0x96CB, 0x96CB, 0x1E75,
+ 0x96CC, 0x96D6, 0x0EDA, 0x96D7, 0x96D7, 0x1E76, 0x96D8, 0x96DC, 0x0EE6,
+ 0x96DD, 0x96DD, 0x1E77, 0x96DE, 0x96DF, 0x0EEC, 0x96E0, 0x96E0, 0x1E78,
+ 0x96E1, 0x96F6, 0x0EEF, 0x96F7, 0x96F7, 0x1935, 0x96F8, 0x96F8, 0x1E79,
+ 0x96F9, 0x96F9, 0x0F07, 0x96FA, 0x96FA, 0x1E7A, 0x96FB, 0x96FB, 0x0F09,
+ 0x96FC, 0x96FC, 0x1E7B, 0x9740, 0x9750, 0x0F0B, 0x9751, 0x9751, 0x1E7C,
+ 0x9752, 0x976E, 0x0F1D, 0x976F, 0x976F, 0x1E7D, 0x9770, 0x9772, 0x0F3B,
+ 0x9773, 0x9773, 0x1E7E, 0x9774, 0x9778, 0x0F3F, 0x9779, 0x9779, 0x1D34,
+ 0x977A, 0x977E, 0x0F45, 0x9780, 0x9788, 0x0F4A, 0x9789, 0x9789, 0x1E7F,
+ 0x978A, 0x97C8, 0x0F54, 0x97C9, 0x97C9, 0x1E80, 0x97CA, 0x97F7, 0x0F94,
+ 0x97F8, 0x97F9, 0x1E81, 0x97FA, 0x97FC, 0x0FC4, 0x9840, 0x9840, 0x1E83,
+ 0x9841, 0x984F, 0x0FC8, 0x9850, 0x9850, 0x1E84, 0x9851, 0x9854, 0x0FD8,
+ 0x9855, 0x9855, 0x1777, 0x9856, 0x9857, 0x0FDD, 0x9858, 0x9858, 0x1E85,
+ 0x9859, 0x9872, 0x0FE0, 0x989F, 0x98D3, 0x0FFA, 0x98D4, 0x98D4, 0x0EA7,
+ 0x98D5, 0x98FC, 0x1030, 0x9940, 0x995B, 0x1058, 0x995C, 0x995C, 0x1E86,
+ 0x995D, 0x9965, 0x1075, 0x9966, 0x9966, 0x1E87, 0x9967, 0x9969, 0x107F,
+ 0x996A, 0x996A, 0x1E88, 0x996B, 0x996B, 0x1083, 0x996C, 0x996C, 0x1E89,
+ 0x996D, 0x997E, 0x1085, 0x9980, 0x99FC, 0x1097, 0x9A40, 0x9A4E, 0x1114,
+ 0x9A4F, 0x9A4F, 0x1E8A, 0x9A50, 0x9A58, 0x1124, 0x9A59, 0x9A59, 0x1E8B,
+ 0x9A5A, 0x9A6E, 0x112E, 0x9A6F, 0x9A6F, 0x1E8C, 0x9A70, 0x9A7C, 0x1144,
+ 0x9A7D, 0x9A7D, 0x1E8D, 0x9A7E, 0x9A7E, 0x1152, 0x9A80, 0x9A8A, 0x1153,
+ 0x9A8B, 0x9A8B, 0x1E8E, 0x9A8C, 0x9AC1, 0x115F, 0x9AC2, 0x9AC2, 0x1E8F,
+ 0x9AC3, 0x9AE1, 0x1196, 0x9AE2, 0x9AE2, 0x0BF7, 0x9AE3, 0x9AFC, 0x11B6,
+ 0x9B40, 0x9B5B, 0x11D0, 0x9B5C, 0x9B5C, 0x1E90, 0x9B5D, 0x9B7E, 0x11ED,
+ 0x9B80, 0x9B82, 0x120F, 0x9B83, 0x9B83, 0x1E91, 0x9B84, 0x9B9F, 0x1213,
+ 0x9BA0, 0x9BA0, 0x1E92, 0x9BA1, 0x9BEF, 0x1230, 0x9BF0, 0x9BF0, 0x1E93,
+ 0x9BF1, 0x9BFC, 0x1280, 0x9C40, 0x9C7E, 0x128C, 0x9C80, 0x9CA1, 0x12CB,
+ 0x9CA2, 0x9CA2, 0x1E94, 0x9CA3, 0x9CFC, 0x12EE, 0x9D40, 0x9D7E, 0x1348,
+ 0x9D80, 0x9D80, 0x1E95, 0x9D81, 0x9D8B, 0x1388, 0x9D8C, 0x9D8C, 0x1E96,
+ 0x9D8D, 0x9D97, 0x1394, 0x9D98, 0x9D98, 0x05A7, 0x9D99, 0x9DB6, 0x13A0,
+ 0x9DB7, 0x9DB7, 0x1E97, 0x9DB8, 0x9DCA, 0x13BF, 0x9DCB, 0x9DCB, 0x1E98,
+ 0x9DCC, 0x9DFC, 0x13D3, 0x9E40, 0x9E63, 0x1404, 0x9E64, 0x9E64, 0x1E99,
+ 0x9E65, 0x9E68, 0x1429, 0x9E69, 0x9E69, 0x1E9A, 0x9E6A, 0x9E76, 0x142E,
+ 0x9E77, 0x9E77, 0x0DA2, 0x9E78, 0x9E7E, 0x143C, 0x9E80, 0x9E8A, 0x1443,
+ 0x9E8B, 0x9E8B, 0x1E9B, 0x9E8C, 0x9E8C, 0x144F, 0x9E8D, 0x9E8D, 0x0C68,
+ 0x9E8E, 0x9E93, 0x1451, 0x9E94, 0x9E94, 0x1E9C, 0x9E95, 0x9EFC, 0x1458,
+ 0x9F40, 0x9F7E, 0x14C0, 0x9F80, 0x9FB6, 0x14FF, 0x9FB7, 0x9FB7, 0x0C6D,
+ 0x9FB8, 0x9FCD, 0x1537, 0x9FCE, 0x9FCE, 0x1E9D, 0x9FCF, 0x9FF2, 0x154E,
+ 0x9FF3, 0x9FF3, 0x05FF, 0x9FF4, 0x9FFC, 0x1573, 0xE040, 0xE07E, 0x157C,
+ 0xE080, 0xE092, 0x15BB, 0xE093, 0xE093, 0x1E9E, 0xE094, 0xE0A3, 0x15CF,
+ 0xE0A4, 0xE0A4, 0x1E9F, 0xE0A5, 0xE0DC, 0x15E0, 0xE0DD, 0xE0DD, 0x1EA0,
+ 0xE0DE, 0xE0F3, 0x1619, 0xE0F4, 0xE0F4, 0x1D35, 0xE0F5, 0xE0FC, 0x1630,
+ 0xE140, 0xE149, 0x1638, 0xE14A, 0xE14A, 0x1EA1, 0xE14B, 0xE14E, 0x1643,
+ 0xE14F, 0xE150, 0x1EA2, 0xE151, 0xE17E, 0x1649, 0xE180, 0xE1A8, 0x1677,
+ 0xE1A9, 0xE1A9, 0x1EA4, 0xE1AA, 0xE1E5, 0x16A1, 0xE1E6, 0xE1E6, 0x07EE,
+ 0xE1E7, 0xE1E7, 0x16DE, 0xE1E8, 0xE1E8, 0x0C51, 0xE1E9, 0xE1EC, 0x16E0,
+ 0xE1ED, 0xE1ED, 0x1EA5, 0xE1EE, 0xE1FC, 0x16E5, 0xE240, 0xE268, 0x16F4,
+ 0xE269, 0xE269, 0x1EA6, 0xE26A, 0xE272, 0x171E, 0xE273, 0xE273, 0x1EA7,
+ 0xE274, 0xE27C, 0x1728, 0xE27D, 0xE27D, 0x05D4, 0xE27E, 0xE27E, 0x1732,
+ 0xE280, 0xE2B6, 0x1733, 0xE2B7, 0xE2B7, 0x1EA8, 0xE2B8, 0xE2C3, 0x176B,
+ 0xE2C4, 0xE2C4, 0x0FDC, 0xE2C5, 0xE2E1, 0x1778, 0xE2E2, 0xE2E2, 0x1EA9,
+ 0xE2E3, 0xE2EB, 0x1796, 0xE2EC, 0xE2EC, 0x1EAA, 0xE2ED, 0xE2FC, 0x17A0,
+ 0xE340, 0xE357, 0x17B0, 0xE358, 0xE358, 0x1EAB, 0xE359, 0xE359, 0x17C9,
+ 0xE35A, 0xE35A, 0x1EAC, 0xE35B, 0xE364, 0x17CB, 0xE365, 0xE365, 0x1EAD,
+ 0xE366, 0xE37E, 0x17D6, 0xE380, 0xE3C3, 0x17EF, 0xE3C4, 0xE3C4, 0x1EAE,
+ 0xE3C5, 0xE3FC, 0x1834, 0xE440, 0xE47E, 0x186C, 0xE480, 0xE483, 0x18AB,
+ 0xE484, 0xE484, 0x1EAF, 0xE485, 0xE488, 0x18B0, 0xE489, 0xE489, 0x1EB0,
+ 0xE48A, 0xE491, 0x18B5, 0xE492, 0xE492, 0x1EB1, 0xE493, 0xE4B1, 0x18BE,
+ 0xE4B2, 0xE4B2, 0x1EB2, 0xE4B3, 0xE4B8, 0x18DE, 0xE4B9, 0xE4B9, 0x1EB3,
+ 0xE4BA, 0xE4F1, 0x18E5, 0xE4F2, 0xE4F2, 0x1EB4, 0xE4F3, 0xE4FC, 0x191E,
+ 0xE540, 0xE540, 0x1928, 0xE541, 0xE541, 0x08F5, 0xE542, 0xE54C, 0x192A,
+ 0xE54D, 0xE54D, 0x0F05, 0xE54E, 0xE55A, 0x1936, 0xE55B, 0xE55B, 0x1EB5,
+ 0xE55C, 0xE578, 0x1944, 0xE579, 0xE579, 0x05A0, 0xE57A, 0xE57E, 0x1962,
+ 0xE580, 0xE5A1, 0x1967, 0xE5A2, 0xE5A2, 0x0D1E, 0xE5A3, 0xE5A4, 0x198A,
+ 0xE5A5, 0xE5A5, 0x1EB6, 0xE5A6, 0xE5BA, 0x198D, 0xE5BB, 0xE5BB, 0x1EB7,
+ 0xE5BC, 0xE5EC, 0x19A3, 0xE5ED, 0xE5ED, 0x1EB8, 0xE5EE, 0xE5FC, 0x19D5,
+ 0xE640, 0xE650, 0x19E4, 0xE651, 0xE651, 0x1EB9, 0xE652, 0xE67B, 0x19F6,
+ 0xE67C, 0xE67C, 0x060E, 0xE67D, 0xE67E, 0x1A21, 0xE680, 0xE685, 0x1A23,
+ 0xE686, 0xE686, 0x1EBA, 0xE687, 0xE695, 0x1A2A, 0xE696, 0xE696, 0x1EBB,
+ 0xE697, 0xE6CA, 0x1A3A, 0xE6CB, 0xE6CB, 0x0AAA, 0xE6CC, 0xE6E6, 0x1A6F,
+ 0xE6E7, 0xE6E7, 0x1EBC, 0xE6E8, 0xE6F1, 0x1A8B, 0xE6F2, 0xE6F2, 0x1EBD,
+ 0xE6F3, 0xE6FC, 0x1A96, 0xE740, 0xE76C, 0x1AA0, 0xE76D, 0xE76D, 0x1EBE,
+ 0xE76E, 0xE77E, 0x1ACE, 0xE780, 0xE78B, 0x1ADF, 0xE78C, 0xE78C, 0x1EBF,
+ 0xE78D, 0xE78D, 0x1AEC, 0xE78E, 0xE78E, 0x1EC0, 0xE78F, 0xE7A6, 0x1AEE,
+ 0xE7A7, 0xE7A7, 0x1EC1, 0xE7A8, 0xE7BA, 0x1B07, 0xE7BB, 0xE7BB, 0x1EC2,
+ 0xE7BC, 0xE7D4, 0x1B1B, 0xE7D5, 0xE7D5, 0x1EC3, 0xE7D6, 0xE7FC, 0x1B35,
+ 0xE840, 0xE87E, 0x1B5C, 0xE880, 0xE884, 0x1B9B, 0xE885, 0xE885, 0x1EC4,
+ 0xE886, 0xE8B0, 0x1BA1, 0xE8B1, 0xE8B1, 0x1EC5, 0xE8B2, 0xE8C2, 0x1BCD,
+ 0xE8C3, 0xE8C3, 0x1EC6, 0xE8C4, 0xE8CE, 0x1BDF, 0xE8CF, 0xE8CF, 0x1EC7,
+ 0xE8D0, 0xE8D4, 0x1BEB, 0xE8D5, 0xE8D5, 0x1EC8, 0xE8D6, 0xE8F1, 0x1BF1,
+ 0xE8F2, 0xE8F2, 0x0731, 0xE8F3, 0xE8F3, 0x1EC9, 0xE8F4, 0xE8FC, 0x1C0F,
+ 0xE940, 0xE97E, 0x1C18, 0xE980, 0xE9AA, 0x1C57, 0xE9AB, 0xE9AB, 0x1ECA,
+ 0xE9AC, 0xE9B9, 0x1C83, 0xE9BA, 0xE9BA, 0x1ECB, 0xE9BB, 0xE9CA, 0x1C92,
+ 0xE9CB, 0xE9CB, 0x0477, 0xE9CC, 0xE9CC, 0x1ECC, 0xE9CD, 0xE9F1, 0x1CA4,
+ 0xE9F2, 0xE9F2, 0x0529, 0xE9F3, 0xE9FC, 0x1CCA, 0xEA40, 0xEA6F, 0x1CD4,
+ 0xEA70, 0xEA70, 0x1ECD, 0xEA71, 0xEA7E, 0x1D05, 0xEA80, 0xEA9C, 0x1D13,
+ 0xEA9D, 0xEA9D, 0x1ECE, 0xEA9E, 0xEA9E, 0x1D31, 0xED40, 0xED7E, 0x20A7,
+ 0xED80, 0xEDB3, 0x20E6, 0xEDB4, 0xEDB4, 0x07C9, 0xEDB5, 0xEDFC, 0x211A,
+ 0xEE40, 0xEE7E, 0x2162, 0xEE80, 0xEEEC, 0x21A1, 0xEEEF, 0xEEF8, 0x1F9C,
+ 0xEEF9, 0xEEF9, 0x02EF, 0xEEFA, 0xEEFC, 0x1F45,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp
new file mode 100644
index 0000000000..d57dce98db
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Ext_RKSJ_V_2[39 * 3] = {
+ 0x8141, 0x8142, 0x1ECF, 0x8143, 0x8143, 0x204C, 0x8144, 0x8144, 0x2052,
+ 0x814A, 0x814A, 0x2050, 0x814B, 0x814B, 0x204F, 0x815B, 0x815D, 0x1ED3,
+ 0x8160, 0x8164, 0x1ED6, 0x8165, 0x8165, 0x2059, 0x8166, 0x8166, 0x2054,
+ 0x8167, 0x8167, 0x2057, 0x8168, 0x8168, 0x2056, 0x8169, 0x817A, 0x1EDB,
+ 0x818B, 0x818B, 0x204D, 0x818C, 0x818C, 0x2051, 0x818D, 0x818D, 0x205B,
+ 0x81AC, 0x81AC, 0x204E, 0x829F, 0x829F, 0x1EEE, 0x82A1, 0x82A1, 0x1EEF,
+ 0x82A3, 0x82A3, 0x1EF0, 0x82A5, 0x82A5, 0x1EF1, 0x82A7, 0x82A7, 0x1EF2,
+ 0x82C1, 0x82C1, 0x1EF3, 0x82E1, 0x82E1, 0x1EF4, 0x82E3, 0x82E3, 0x1EF5,
+ 0x82E5, 0x82E5, 0x1EF6, 0x82EC, 0x82EC, 0x1EF7, 0x8340, 0x8340, 0x1EF8,
+ 0x8342, 0x8342, 0x1EF9, 0x8344, 0x8344, 0x1EFA, 0x8346, 0x8346, 0x1EFB,
+ 0x8348, 0x8348, 0x1EFC, 0x8362, 0x8362, 0x1EFD, 0x8383, 0x8383, 0x1EFE,
+ 0x8385, 0x8385, 0x1EFF, 0x8387, 0x8387, 0x1F00, 0x838E, 0x838E, 0x1F01,
+ 0x8395, 0x8396, 0x1F02, 0x875F, 0x876E, 0x1F04, 0x8780, 0x8781, 0x1F14,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
new file mode 100644
index 0000000000..e14e699c8d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_H_1[118 * 3] = {
+ 0x2121, 0x217E, 0x0279, 0x2221, 0x222E, 0x02D7, 0x223A, 0x2241, 0x02E5,
+ 0x224A, 0x2250, 0x02ED, 0x225C, 0x226A, 0x02F4, 0x2272, 0x2279, 0x0303,
+ 0x227E, 0x227E, 0x030B, 0x2330, 0x2339, 0x030C, 0x2341, 0x235A, 0x0316,
+ 0x2361, 0x237A, 0x0330, 0x2421, 0x2473, 0x034A, 0x2521, 0x2576, 0x039D,
+ 0x2621, 0x2638, 0x03F3, 0x2641, 0x2658, 0x040B, 0x2721, 0x2741, 0x0423,
+ 0x2751, 0x2771, 0x0444, 0x2821, 0x2821, 0x1D37, 0x2822, 0x2822, 0x1D39,
+ 0x2823, 0x2823, 0x1D43, 0x2824, 0x2824, 0x1D47, 0x2825, 0x2825, 0x1D4F,
+ 0x2826, 0x2826, 0x1D4B, 0x2827, 0x2827, 0x1D53, 0x2828, 0x2828, 0x1D63,
+ 0x2829, 0x2829, 0x1D5B, 0x282A, 0x282A, 0x1D6B, 0x282B, 0x282B, 0x1D73,
+ 0x282C, 0x282C, 0x1D38, 0x282D, 0x282D, 0x1D3A, 0x282E, 0x282E, 0x1D46,
+ 0x282F, 0x282F, 0x1D4A, 0x2830, 0x2830, 0x1D52, 0x2831, 0x2831, 0x1D4E,
+ 0x2832, 0x2832, 0x1D5A, 0x2833, 0x2833, 0x1D6A, 0x2834, 0x2834, 0x1D62,
+ 0x2835, 0x2835, 0x1D72, 0x2836, 0x2836, 0x1D82, 0x2837, 0x2837, 0x1D57,
+ 0x2838, 0x2838, 0x1D66, 0x2839, 0x2839, 0x1D5F, 0x283A, 0x283A, 0x1D6E,
+ 0x283B, 0x283B, 0x1D76, 0x283C, 0x283C, 0x1D54, 0x283D, 0x283D, 0x1D67,
+ 0x283E, 0x283E, 0x1D5C, 0x283F, 0x283F, 0x1D6F, 0x2840, 0x2840, 0x1D79,
+ 0x3021, 0x307E, 0x0465, 0x3121, 0x317E, 0x04C3, 0x3221, 0x327E, 0x0521,
+ 0x3321, 0x337E, 0x057F, 0x3421, 0x347E, 0x05DD, 0x3521, 0x357E, 0x063B,
+ 0x3621, 0x367E, 0x0699, 0x3721, 0x377E, 0x06F7, 0x3821, 0x387E, 0x0755,
+ 0x3921, 0x397E, 0x07B3, 0x3A21, 0x3A7E, 0x0811, 0x3B21, 0x3B7E, 0x086F,
+ 0x3C21, 0x3C7E, 0x08CD, 0x3D21, 0x3D7E, 0x092B, 0x3E21, 0x3E7E, 0x0989,
+ 0x3F21, 0x3F7E, 0x09E7, 0x4021, 0x407E, 0x0A45, 0x4121, 0x417E, 0x0AA3,
+ 0x4221, 0x427E, 0x0B01, 0x4321, 0x437E, 0x0B5F, 0x4421, 0x447E, 0x0BBD,
+ 0x4521, 0x457E, 0x0C1B, 0x4621, 0x467E, 0x0C79, 0x4721, 0x477E, 0x0CD7,
+ 0x4821, 0x487E, 0x0D35, 0x4921, 0x497E, 0x0D93, 0x4A21, 0x4A7E, 0x0DF1,
+ 0x4B21, 0x4B7E, 0x0E4F, 0x4C21, 0x4C7E, 0x0EAD, 0x4D21, 0x4D7E, 0x0F0B,
+ 0x4E21, 0x4E7E, 0x0F69, 0x4F21, 0x4F53, 0x0FC7, 0x5021, 0x507E, 0x0FFA,
+ 0x5121, 0x517E, 0x1058, 0x5221, 0x527E, 0x10B6, 0x5321, 0x537E, 0x1114,
+ 0x5421, 0x547E, 0x1172, 0x5521, 0x557E, 0x11D0, 0x5621, 0x567E, 0x122E,
+ 0x5721, 0x577E, 0x128C, 0x5821, 0x587E, 0x12EA, 0x5921, 0x597E, 0x1348,
+ 0x5A21, 0x5A7E, 0x13A6, 0x5B21, 0x5B7E, 0x1404, 0x5C21, 0x5C7E, 0x1462,
+ 0x5D21, 0x5D7E, 0x14C0, 0x5E21, 0x5E7E, 0x151E, 0x5F21, 0x5F7E, 0x157C,
+ 0x6021, 0x607E, 0x15DA, 0x6121, 0x617E, 0x1638, 0x6221, 0x627E, 0x1696,
+ 0x6321, 0x637E, 0x16F4, 0x6421, 0x647E, 0x1752, 0x6521, 0x657E, 0x17B0,
+ 0x6621, 0x667E, 0x180E, 0x6721, 0x677E, 0x186C, 0x6821, 0x687E, 0x18CA,
+ 0x6921, 0x697E, 0x1928, 0x6A21, 0x6A7E, 0x1986, 0x6B21, 0x6B7E, 0x19E4,
+ 0x6C21, 0x6C7E, 0x1A42, 0x6D21, 0x6D7E, 0x1AA0, 0x6E21, 0x6E7E, 0x1AFE,
+ 0x6F21, 0x6F7E, 0x1B5C, 0x7021, 0x707E, 0x1BBA, 0x7121, 0x717E, 0x1C18,
+ 0x7221, 0x727E, 0x1C76, 0x7321, 0x737E, 0x1CD4, 0x7421, 0x7424, 0x1D32,
+ 0x7425, 0x7426, 0x205C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp
new file mode 100644
index 0000000000..9983758c84
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_H_4[4 * 3] = {
+ 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,
+ 0x00A5, 0x00A5, 0x0123,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
new file mode 100644
index 0000000000..a59420ac5f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp
@@ -0,0 +1,75 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_HW_V_4[199 * 3] = {
+ 0x0020, 0x005B, 0x00E7, 0x005C, 0x005C, 0x220F, 0x005D, 0x007E, 0x0124,
+ 0x00A5, 0x00A5, 0x0123, 0x00B0, 0x00B0, 0x204D, 0x2010, 0x2010, 0x1ED5,
+ 0x2015, 0x2015, 0x1ED4, 0x2016, 0x2016, 0x1ED7, 0x2018, 0x2019, 0x2059,
+ 0x201C, 0x201D, 0x2057, 0x2025, 0x2025, 0x1EDA, 0x2026, 0x2026, 0x1ED9,
+ 0x2032, 0x2032, 0x2051, 0x2033, 0x2033, 0x205B, 0x2190, 0x2190, 0x02E2,
+ 0x2191, 0x2191, 0x02E0, 0x2192, 0x2192, 0x02E3, 0x2193, 0x2193, 0x02E1,
+ 0x2195, 0x2195, 0x2FB6, 0x21C4, 0x21C4, 0x2077, 0x21C5, 0x21C5, 0x2076,
+ 0x21C6, 0x21C6, 0x2078, 0x21E6, 0x21E6, 0x1F4C, 0x21E7, 0x21E7, 0x1F4E,
+ 0x21E8, 0x21E8, 0x1F4B, 0x21E9, 0x21E9, 0x1F4D, 0x2225, 0x2225, 0x1ED7,
+ 0x223C, 0x223C, 0x1ED6, 0x22EF, 0x22EF, 0x1ED9, 0x2500, 0x2501, 0x1D39,
+ 0x2502, 0x2503, 0x1D37, 0x2504, 0x2505, 0x1D3D, 0x2506, 0x2507, 0x1D3B,
+ 0x2508, 0x2509, 0x1D41, 0x250A, 0x250B, 0x1D3F, 0x250C, 0x250C, 0x1D47,
+ 0x250D, 0x250D, 0x1D49, 0x250E, 0x250E, 0x1D48, 0x250F, 0x250F, 0x1D4A,
+ 0x2510, 0x2510, 0x1D4F, 0x2511, 0x2511, 0x1D51, 0x2512, 0x2512, 0x1D50,
+ 0x2513, 0x2513, 0x1D52, 0x2514, 0x2514, 0x1D43, 0x2515, 0x2515, 0x1D45,
+ 0x2516, 0x2516, 0x1D44, 0x2517, 0x2517, 0x1D46, 0x2518, 0x2518, 0x1D4B,
+ 0x2519, 0x2519, 0x1D4D, 0x251A, 0x251A, 0x1D4C, 0x251B, 0x251B, 0x1D4E,
+ 0x251C, 0x251C, 0x1D63, 0x251D, 0x251D, 0x1D67, 0x251E, 0x251E, 0x1D65,
+ 0x251F, 0x251F, 0x1D64, 0x2520, 0x2520, 0x1D66, 0x2521, 0x2521, 0x1D69,
+ 0x2522, 0x2522, 0x1D68, 0x2523, 0x2524, 0x1D6A, 0x2525, 0x2525, 0x1D6F,
+ 0x2526, 0x2526, 0x1D6D, 0x2527, 0x2527, 0x1D6C, 0x2528, 0x2528, 0x1D6E,
+ 0x2529, 0x2529, 0x1D71, 0x252A, 0x252A, 0x1D70, 0x252B, 0x252B, 0x1D72,
+ 0x252C, 0x252C, 0x1D5B, 0x252D, 0x252F, 0x1D5D, 0x2530, 0x2530, 0x1D5C,
+ 0x2531, 0x2533, 0x1D60, 0x2534, 0x2534, 0x1D53, 0x2535, 0x2537, 0x1D55,
+ 0x2538, 0x2538, 0x1D54, 0x2539, 0x253B, 0x1D58, 0x253D, 0x253F, 0x1D77,
+ 0x2540, 0x2540, 0x1D75, 0x2541, 0x2541, 0x1D74, 0x2542, 0x2542, 0x1D76,
+ 0x2543, 0x2543, 0x1D7B, 0x2544, 0x2544, 0x1D7D, 0x2545, 0x2545, 0x1D7A,
+ 0x2546, 0x2546, 0x1D7C, 0x2547, 0x2547, 0x1D81, 0x2548, 0x2548, 0x1D80,
+ 0x2549, 0x254A, 0x1D7E, 0x261C, 0x261C, 0x201D, 0x261D, 0x261D, 0x201B,
+ 0x261E, 0x261E, 0x201E, 0x261F, 0x261F, 0x201C, 0x2702, 0x2702, 0x2F92,
+ 0x27A1, 0x27A1, 0x2011, 0x3001, 0x3002, 0x1ECF, 0x3008, 0x3011, 0x1EE3,
+ 0x3013, 0x3013, 0x204E, 0x3014, 0x3015, 0x1EDD, 0x301C, 0x301C, 0x1ED6,
+ 0x301D, 0x301D, 0x1F14, 0x301F, 0x301F, 0x1F15, 0x3041, 0x3041, 0x1EEE,
+ 0x3043, 0x3043, 0x1EEF, 0x3045, 0x3045, 0x1EF0, 0x3047, 0x3047, 0x1EF1,
+ 0x3049, 0x3049, 0x1EF2, 0x3063, 0x3063, 0x1EF3, 0x3083, 0x3083, 0x1EF4,
+ 0x3085, 0x3085, 0x1EF5, 0x3087, 0x3087, 0x1EF6, 0x308E, 0x308E, 0x1EF7,
+ 0x309B, 0x309B, 0x2050, 0x309C, 0x309C, 0x204F, 0x30A1, 0x30A1, 0x1EF8,
+ 0x30A3, 0x30A3, 0x1EF9, 0x30A5, 0x30A5, 0x1EFA, 0x30A7, 0x30A7, 0x1EFB,
+ 0x30A9, 0x30A9, 0x1EFC, 0x30C3, 0x30C3, 0x1EFD, 0x30E3, 0x30E3, 0x1EFE,
+ 0x30E5, 0x30E5, 0x1EFF, 0x30E7, 0x30E7, 0x1F00, 0x30EE, 0x30EE, 0x1F01,
+ 0x30F5, 0x30F6, 0x1F02, 0x30FC, 0x30FC, 0x1ED3, 0x3300, 0x3300, 0x209E,
+ 0x3301, 0x3302, 0x2EB6, 0x3303, 0x3303, 0x2092, 0x3304, 0x3304, 0x2EB8,
+ 0x3305, 0x3305, 0x208D, 0x3306, 0x3306, 0x2EB9, 0x3307, 0x3307, 0x2EBD,
+ 0x3308, 0x3308, 0x2EBB, 0x3309, 0x3309, 0x2EC0, 0x330A, 0x330A, 0x2EBE,
+ 0x330B, 0x330B, 0x2EC2, 0x330C, 0x330C, 0x2EC4, 0x330D, 0x330D, 0x1F0E,
+ 0x330E, 0x3313, 0x2EC5, 0x3314, 0x3314, 0x1F05, 0x3315, 0x3315, 0x2094,
+ 0x3316, 0x3316, 0x208A, 0x3317, 0x3317, 0x2ECC, 0x3318, 0x3318, 0x2093,
+ 0x3319, 0x3319, 0x2ECE, 0x331A, 0x331D, 0x2ED0, 0x331E, 0x331E, 0x20A1,
+ 0x331F, 0x3321, 0x2ED4, 0x3322, 0x3322, 0x2089, 0x3323, 0x3323, 0x209C,
+ 0x3324, 0x3324, 0x2ED7, 0x3325, 0x3325, 0x2ED9, 0x3326, 0x3326, 0x1F0F,
+ 0x3327, 0x3327, 0x1F09, 0x3328, 0x3329, 0x2EDC, 0x332A, 0x332A, 0x20A4,
+ 0x332B, 0x332B, 0x1F11, 0x332D, 0x332D, 0x2EDF, 0x332E, 0x3330, 0x2EE2,
+ 0x3331, 0x3331, 0x20A6, 0x3332, 0x3332, 0x2EE5, 0x3333, 0x3333, 0x208E,
+ 0x3334, 0x3335, 0x2EE8, 0x3336, 0x3336, 0x1F0B, 0x3337, 0x3337, 0x2EEE,
+ 0x3338, 0x3338, 0x2EF0, 0x3339, 0x3339, 0x2097, 0x333A, 0x333A, 0x2EF1,
+ 0x333B, 0x333B, 0x209D, 0x333C, 0x333C, 0x2EEA, 0x333D, 0x333D, 0x2EF2,
+ 0x333E, 0x3340, 0x2EF4, 0x3341, 0x3341, 0x2EF3, 0x3342, 0x3342, 0x209B,
+ 0x3343, 0x3346, 0x2EF7, 0x3347, 0x3347, 0x20A5, 0x3348, 0x3348, 0x2EFB,
+ 0x3349, 0x3349, 0x1F04, 0x334A, 0x334A, 0x1F12, 0x334B, 0x334C, 0x2EFC,
+ 0x334D, 0x334D, 0x1F07, 0x334E, 0x334E, 0x2091, 0x334F, 0x3350, 0x2EFE,
+ 0x3351, 0x3351, 0x1F0C, 0x3352, 0x3352, 0x2F02, 0x3353, 0x3353, 0x2F06,
+ 0x3354, 0x3354, 0x2F03, 0x3355, 0x3356, 0x2F07, 0x3357, 0x3357, 0x2098,
+ 0x337F, 0x337F, 0x2084, 0xFF08, 0xFF09, 0x1EDB, 0xFF0C, 0xFF0C, 0x204C,
+ 0xFF0E, 0xFF0E, 0x2052, 0xFF1D, 0xFF1D, 0x1EED, 0xFF3B, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0xFF3D, 0x1EE0, 0xFF3F, 0xFF3F, 0x1ED2, 0xFF5B, 0xFF5B, 0x1EE1,
+ 0xFF5C, 0xFF5C, 0x1ED8, 0xFF5D, 0xFF5D, 0x1EE2, 0xFF5E, 0xFF5E, 0x1ED6,
+ 0xFFE3, 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
new file mode 100644
index 0000000000..35f0b71518
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp
@@ -0,0 +1,2451 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_H_4[9772 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x005D, 0x007D, 0x005E, 0x007E, 0x005F, 0x00A1, 0x0065,
+ 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B, 0x00A5, 0x003D,
+ 0x00A6, 0x0063, 0x00A7, 0x02D0, 0x00A8, 0x0287, 0x00A9, 0x0098,
+ 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099, 0x00AD, 0x0097,
+ 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3, 0x00B1, 0x02B6,
+ 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285, 0x00B5, 0x009F,
+ 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086, 0x00B9, 0x00A0,
+ 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1, 0x00BD, 0x00A2,
+ 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4, 0x00C1, 0x00A5,
+ 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8, 0x00C5, 0x00A9,
+ 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB, 0x00C9, 0x00AC,
+ 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF, 0x00CD, 0x00B0,
+ 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3, 0x00D1, 0x00B4,
+ 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7, 0x00D5, 0x00B8,
+ 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E, 0x00D9, 0x00BB,
+ 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE, 0x00DD, 0x00BF,
+ 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1, 0x00E1, 0x00C2,
+ 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5, 0x00E5, 0x00C6,
+ 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8, 0x00E9, 0x00C9,
+ 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC, 0x00ED, 0x00CD,
+ 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0, 0x00F1, 0x00D1,
+ 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4, 0x00F5, 0x00D5,
+ 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094, 0x00F9, 0x00D8,
+ 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB, 0x00FD, 0x00DC,
+ 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496, 0x0101, 0x2491,
+ 0x0112, 0x2499, 0x0113, 0x2494, 0x011A, 0x24B3, 0x011B, 0x24BF,
+ 0x0127, 0x2F3C, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
+ 0x012B, 0x2492, 0x0131, 0x0092, 0x0141, 0x008D, 0x0142, 0x0093,
+ 0x014B, 0x24DC, 0x014C, 0x249A, 0x014D, 0x2495, 0x0152, 0x008F,
+ 0x0153, 0x0095, 0x0160, 0x00DF, 0x0161, 0x00E3, 0x0168, 0x24BD,
+ 0x0169, 0x24C9, 0x016A, 0x2498, 0x016B, 0x2493, 0x016E, 0x24BC,
+ 0x016F, 0x24C8, 0x0178, 0x00E0, 0x017D, 0x00E1, 0x017E, 0x00E5,
+ 0x01C0, 0x0063, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
+ 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
+ 0x01D4, 0x24C7, 0x01FD, 0x24CD, 0x0251, 0x24CA, 0x0254, 0x24CF,
+ 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8, 0x0275, 0x24DD,
+ 0x0283, 0x24E2, 0x028C, 0x24DE, 0x0292, 0x24E1, 0x02D0, 0x24E3,
+ 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080, 0x0303, 0x005F,
+ 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082, 0x0307, 0x0083,
+ 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087, 0x030C, 0x0089,
+ 0x0327, 0x0086, 0x0328, 0x0088, 0x0332, 0x0040, 0x0336, 0x008A,
+ 0x0361, 0x02F6, 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5,
+ 0x0394, 0x03F6, 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9,
+ 0x0398, 0x03FA, 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD,
+ 0x039C, 0x03FE, 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401,
+ 0x03A0, 0x0402, 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405,
+ 0x03A5, 0x0406, 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409,
+ 0x03A9, 0x040A, 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D,
+ 0x03B4, 0x040E, 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411,
+ 0x03B8, 0x0412, 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415,
+ 0x03BC, 0x0416, 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419,
+ 0x03C0, 0x041A, 0x03C1, 0x041B, 0x03C3, 0x041C, 0x03C4, 0x041D,
+ 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
+ 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03DB, 0x2F3F,
+ 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424, 0x0412, 0x0425,
+ 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428, 0x0416, 0x042A,
+ 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D, 0x041A, 0x042E,
+ 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431, 0x041E, 0x0432,
+ 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435, 0x0422, 0x0436,
+ 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439, 0x0426, 0x043A,
+ 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D, 0x042A, 0x043E,
+ 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441, 0x042E, 0x0442,
+ 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445, 0x0432, 0x0446,
+ 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449, 0x0436, 0x044B,
+ 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E, 0x043A, 0x044F,
+ 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452, 0x043E, 0x0453,
+ 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456, 0x0442, 0x0457,
+ 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A, 0x0446, 0x045B,
+ 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E, 0x044A, 0x045F,
+ 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462, 0x044E, 0x0463,
+ 0x044F, 0x0464, 0x0451, 0x044A, 0x045B, 0x2F3C, 0x1EBC, 0x24B5,
+ 0x1EBD, 0x24C1, 0x2002, 0x00E7, 0x2003, 0x0279, 0x2010, 0x0296,
+ 0x2011, 0x000E, 0x2012, 0x0072, 0x2013, 0x0072, 0x2014, 0x008A,
+ 0x2015, 0x0295, 0x2016, 0x029A, 0x2018, 0x029E, 0x2019, 0x029F,
+ 0x201A, 0x0078, 0x201C, 0x02A0, 0x201D, 0x02A1, 0x201E, 0x0079,
+ 0x2020, 0x0308, 0x2021, 0x0309, 0x2022, 0x0077, 0x2025, 0x029D,
+ 0x2026, 0x029C, 0x2030, 0x0304, 0x2032, 0x02C4, 0x2033, 0x02C5,
+ 0x2039, 0x006E, 0x203A, 0x006F, 0x203B, 0x02DE, 0x203C, 0x2F4F,
+ 0x203E, 0x0145, 0x2044, 0x0068, 0x2049, 0x2F50, 0x2070, 0x24A1,
+ 0x2074, 0x24A2, 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5,
+ 0x2078, 0x24A6, 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9,
+ 0x2082, 0x24AA, 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD,
+ 0x2086, 0x24AE, 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1,
+ 0x20AC, 0x248A, 0x20DD, 0x030B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
+ 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
+ 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
+ 0x2126, 0x248B, 0x212B, 0x0303, 0x2135, 0x2F39, 0x2153, 0x249F,
+ 0x2154, 0x24A0, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
+ 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
+ 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
+ 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
+ 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
+ 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
+ 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
+ 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
+ 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2195, 0x2FB7,
+ 0x2196, 0x2FAC, 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB,
+ 0x21C4, 0x2076, 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CC, 0x2FAE,
+ 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
+ 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
+ 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
+ 0x2208, 0x02E5, 0x220A, 0x2F3B, 0x220B, 0x02E6, 0x2211, 0x1DC9,
+ 0x2212, 0x02B5, 0x2213, 0x2F56, 0x221A, 0x02FD, 0x221D, 0x02FF,
+ 0x221E, 0x02BF, 0x221F, 0x1DCD, 0x2220, 0x02F4, 0x2225, 0x029A,
+ 0x2227, 0x02ED, 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB,
+ 0x222B, 0x0301, 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8,
+ 0x2234, 0x02C0, 0x2235, 0x0300, 0x223C, 0x0299, 0x223D, 0x02FE,
+ 0x2243, 0x2F58, 0x2252, 0x02FA, 0x2260, 0x02BA, 0x2261, 0x02F9,
+ 0x2266, 0x02BD, 0x2267, 0x02BE, 0x226A, 0x02FB, 0x226B, 0x02FC,
+ 0x2272, 0x2F59, 0x2273, 0x2F5A, 0x2282, 0x02E9, 0x2283, 0x02EA,
+ 0x2286, 0x02E7, 0x2287, 0x02E8, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
+ 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229D, 0x2F9A, 0x229E, 0x2F9E,
+ 0x22A0, 0x2F99, 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22EE, 0x1ED9,
+ 0x22EF, 0x029C, 0x2300, 0x2F98, 0x2307, 0x2FBB, 0x2312, 0x02F6,
+ 0x244A, 0x2F54, 0x2460, 0x1D83, 0x2461, 0x1D84, 0x2462, 0x1D85,
+ 0x2463, 0x1D86, 0x2464, 0x1D87, 0x2465, 0x1D88, 0x2466, 0x1D89,
+ 0x2467, 0x1D8A, 0x2468, 0x1D8B, 0x2469, 0x1D8C, 0x246A, 0x1D8D,
+ 0x246B, 0x1D8E, 0x246C, 0x1D8F, 0x246D, 0x1D90, 0x246E, 0x1D91,
+ 0x246F, 0x1D92, 0x2470, 0x1D93, 0x2471, 0x1D94, 0x2472, 0x1D95,
+ 0x2473, 0x1D96, 0x2474, 0x1F87, 0x2475, 0x1F88, 0x2476, 0x1F89,
+ 0x2477, 0x1F8A, 0x2478, 0x1F8B, 0x2479, 0x1F8C, 0x247A, 0x1F8D,
+ 0x247B, 0x1F8E, 0x247C, 0x1F8F, 0x247D, 0x1F90, 0x247E, 0x1F91,
+ 0x247F, 0x1F92, 0x2480, 0x1F93, 0x2481, 0x1F94, 0x2482, 0x1F95,
+ 0x2483, 0x1F96, 0x2484, 0x1F97, 0x2485, 0x1F98, 0x2486, 0x1F99,
+ 0x2487, 0x1F9A, 0x2488, 0x1F7E, 0x2489, 0x1F7F, 0x248A, 0x1F80,
+ 0x248B, 0x1F81, 0x248C, 0x1F82, 0x248D, 0x1F83, 0x248E, 0x1F84,
+ 0x248F, 0x1F85, 0x2490, 0x1F86, 0x249C, 0x1FB0, 0x249D, 0x1FB1,
+ 0x249E, 0x1FB2, 0x249F, 0x1FB3, 0x24A0, 0x1FB4, 0x24A1, 0x1FB5,
+ 0x24A2, 0x1FB6, 0x24A3, 0x1FB7, 0x24A4, 0x1FB8, 0x24A5, 0x1FB9,
+ 0x24A6, 0x1FBA, 0x24A7, 0x1FBB, 0x24A8, 0x1FBC, 0x24A9, 0x1FBD,
+ 0x24AA, 0x1FBE, 0x24AB, 0x1FBF, 0x24AC, 0x1FC0, 0x24AD, 0x1FC1,
+ 0x24AE, 0x1FC2, 0x24AF, 0x1FC3, 0x24B0, 0x1FC4, 0x24B1, 0x1FC5,
+ 0x24B2, 0x1FC6, 0x24B3, 0x1FC7, 0x24B4, 0x1FC8, 0x24B5, 0x1FC9,
+ 0x24B6, 0x2863, 0x24B7, 0x2864, 0x24B8, 0x2865, 0x24B9, 0x2866,
+ 0x24BA, 0x2867, 0x24BB, 0x2868, 0x24BC, 0x2869, 0x24BD, 0x286A,
+ 0x24BE, 0x286B, 0x24BF, 0x286C, 0x24C0, 0x286D, 0x24C1, 0x286E,
+ 0x24C2, 0x286F, 0x24C3, 0x2870, 0x24C4, 0x2871, 0x24C5, 0x2872,
+ 0x24C6, 0x2873, 0x24C7, 0x2874, 0x24C8, 0x2875, 0x24C9, 0x2876,
+ 0x24CA, 0x2877, 0x24CB, 0x2878, 0x24CC, 0x2879, 0x24CD, 0x287A,
+ 0x24CE, 0x287B, 0x24CF, 0x287C, 0x24D0, 0x2849, 0x24D1, 0x284A,
+ 0x24D2, 0x284B, 0x24D3, 0x284C, 0x24D4, 0x284D, 0x24D5, 0x284E,
+ 0x24D6, 0x284F, 0x24D7, 0x2850, 0x24D8, 0x2851, 0x24D9, 0x2852,
+ 0x24DA, 0x2853, 0x24DB, 0x2854, 0x24DC, 0x2855, 0x24DD, 0x2856,
+ 0x24DE, 0x2857, 0x24DF, 0x2858, 0x24E0, 0x2859, 0x24E1, 0x285A,
+ 0x24E2, 0x285B, 0x24E3, 0x285C, 0x24E4, 0x285D, 0x24E5, 0x285E,
+ 0x24E6, 0x285F, 0x24E7, 0x2860, 0x24E8, 0x2861, 0x24E9, 0x2862,
+ 0x24EA, 0x2020, 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39,
+ 0x2503, 0x1D3A, 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D,
+ 0x2507, 0x1D3E, 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41,
+ 0x250B, 0x1D42, 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45,
+ 0x250F, 0x1D46, 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49,
+ 0x2513, 0x1D4A, 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D,
+ 0x2517, 0x1D4E, 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51,
+ 0x251B, 0x1D52, 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55,
+ 0x251F, 0x1D56, 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59,
+ 0x2523, 0x1D5A, 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D,
+ 0x2527, 0x1D5E, 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61,
+ 0x252B, 0x1D62, 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65,
+ 0x252F, 0x1D66, 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69,
+ 0x2533, 0x1D6A, 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D,
+ 0x2537, 0x1D6E, 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71,
+ 0x253B, 0x1D72, 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75,
+ 0x253F, 0x1D76, 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79,
+ 0x2543, 0x1D7A, 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D,
+ 0x2547, 0x1D7E, 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81,
+ 0x254B, 0x1D82, 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E,
+ 0x256A, 0x203D, 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A,
+ 0x2570, 0x2039, 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047,
+ 0x2581, 0x2026, 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029,
+ 0x2585, 0x202A, 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D,
+ 0x2589, 0x2034, 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031,
+ 0x258D, 0x2030, 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035,
+ 0x2595, 0x2036, 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F,
+ 0x25AA, 0x2FCF, 0x25AB, 0x2FCD, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
+ 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
+ 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
+ 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
+ 0x25CF, 0x02D4, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
+ 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
+ 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
+ 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2612, 0x2F99, 0x261C, 0x201C,
+ 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E, 0x2640, 0x02C2,
+ 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51, 0x2662, 0x1F53,
+ 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014, 0x2666, 0x2016,
+ 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43, 0x266A, 0x0307,
+ 0x266C, 0x2F44, 0x266D, 0x0306, 0x266F, 0x0305, 0x2702, 0x2F90,
+ 0x271A, 0x2FD1, 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F,
+ 0x2778, 0x2060, 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063,
+ 0x277C, 0x2064, 0x277D, 0x2065, 0x277E, 0x2066, 0x27A1, 0x200E,
+ 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
+ 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
+ 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
+ 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
+ 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9F, 0x0E3C,
+ 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962, 0x2EA3, 0x399D,
+ 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC, 0x2EA9, 0x35A1,
+ 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x08D4, 0x2EAD, 0x3A39,
+ 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97, 0x2EB3, 0x376D,
+ 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3, 0x2EBD, 0x354E,
+ 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777, 0x2EC1, 0x078B,
+ 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62, 0x2EC6, 0x3572,
+ 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50, 0x2ECF, 0x3B9E,
+ 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E, 0x2ED7, 0x354D,
+ 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619, 0x2EDF, 0x3618,
+ 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B, 0x2EEB, 0x0A6A,
+ 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F, 0x2F00, 0x04B0,
+ 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001, 0x2F04, 0x0535,
+ 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E, 0x2F08, 0x0A13,
+ 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40, 0x2F0C, 0x107B,
+ 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093, 0x2F10, 0x1098,
+ 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6, 0x2F14, 0x10CD,
+ 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947, 0x2F18, 0x0E7C,
+ 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8, 0x2F1C, 0x0EA2,
+ 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54, 0x2F20, 0x089C,
+ 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26, 0x2F24, 0x0B47,
+ 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E, 0x2F28, 0x0A47,
+ 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228, 0x2F2C, 0x1232,
+ 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB, 0x2F30, 0x077E,
+ 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283, 0x2F34, 0x1285,
+ 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0, 0x2F38, 0x0677,
+ 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1, 0x2F3C, 0x09FA,
+ 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916, 0x2F40, 0x08A7,
+ 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47, 0x2F44, 0x06CC,
+ 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4, 0x2F48, 0x140C,
+ 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D, 0x2F4C, 0x08AD,
+ 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8, 0x2F50, 0x0D7A,
+ 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502, 0x2F54, 0x0A2B,
+ 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5, 0x2F58, 0x15E4,
+ 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567, 0x2F5C, 0x0687,
+ 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4, 0x2F60, 0x04DD,
+ 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C, 0x2F64, 0x0F3B,
+ 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00, 0x2F68, 0x1697,
+ 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C, 0x2F6C, 0x0EE8,
+ 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74, 0x2F70, 0x08D4,
+ 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740, 0x2F74, 0x0F71,
+ 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3, 0x2F78, 0x0608,
+ 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB, 0x2F7C, 0x0FDD,
+ 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6, 0x2F80, 0x1853,
+ 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7, 0x2F84, 0x08B8,
+ 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6, 0x2F88, 0x0938,
+ 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2, 0x2F8C, 0x194F,
+ 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6, 0x2F90, 0x04A5,
+ 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF, 0x2F94, 0x0774,
+ 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56, 0x2F98, 0x1A59,
+ 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8, 0x2F9C, 0x0B0D,
+ 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F, 0x2FA0, 0x0B62,
+ 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB, 0x2FA4, 0x0D64,
+ 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5, 0x2FA8, 0x0EF3,
+ 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB, 0x2FAC, 0x04CD,
+ 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8, 0x2FB0, 0x05B5,
+ 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B, 0x2FB4, 0x0E17,
+ 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF, 0x2FB8, 0x091F,
+ 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E, 0x2FBC, 0x07F4,
+ 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83, 0x2FC0, 0x1C84,
+ 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7, 0x2FC4, 0x1CF6,
+ 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91, 0x2FC8, 0x340B,
+ 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16, 0x2FCC, 0x1D19,
+ 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF, 0x2FD0, 0x0D93,
+ 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E, 0x2FD4, 0x1D30,
+ 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A, 0x3002, 0x027B,
+ 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291, 0x3006, 0x0292,
+ 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB, 0x300A, 0x02AC,
+ 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF, 0x300E, 0x02B0,
+ 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3, 0x3012, 0x02DF,
+ 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5, 0x301C, 0x0299,
+ 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A, 0x3030, 0x2FBA,
+ 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E, 0x3036, 0x1F79,
+ 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
+ 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
+ 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
+ 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
+ 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
+ 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
+ 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
+ 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
+ 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
+ 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
+ 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
+ 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
+ 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
+ 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
+ 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
+ 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
+ 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
+ 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
+ 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
+ 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
+ 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
+ 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
+ 0x30A1, 0x039D, 0x30A2, 0x039E, 0x30A3, 0x039F, 0x30A4, 0x03A0,
+ 0x30A5, 0x03A1, 0x30A6, 0x03A2, 0x30A7, 0x03A3, 0x30A8, 0x03A4,
+ 0x30A9, 0x03A5, 0x30AA, 0x03A6, 0x30AB, 0x03A7, 0x30AC, 0x03A8,
+ 0x30AD, 0x03A9, 0x30AE, 0x03AA, 0x30AF, 0x03AB, 0x30B0, 0x03AC,
+ 0x30B1, 0x03AD, 0x30B2, 0x03AE, 0x30B3, 0x03AF, 0x30B4, 0x03B0,
+ 0x30B5, 0x03B1, 0x30B6, 0x03B2, 0x30B7, 0x03B3, 0x30B8, 0x03B4,
+ 0x30B9, 0x03B5, 0x30BA, 0x03B6, 0x30BB, 0x03B7, 0x30BC, 0x03B8,
+ 0x30BD, 0x03B9, 0x30BE, 0x03BA, 0x30BF, 0x03BB, 0x30C0, 0x03BC,
+ 0x30C1, 0x03BD, 0x30C2, 0x03BE, 0x30C3, 0x03BF, 0x30C4, 0x03C0,
+ 0x30C5, 0x03C1, 0x30C6, 0x03C2, 0x30C7, 0x03C3, 0x30C8, 0x03C4,
+ 0x30C9, 0x03C5, 0x30CA, 0x03C6, 0x30CB, 0x03C7, 0x30CC, 0x03C8,
+ 0x30CD, 0x03C9, 0x30CE, 0x03CA, 0x30CF, 0x03CB, 0x30D0, 0x03CC,
+ 0x30D1, 0x03CD, 0x30D2, 0x03CE, 0x30D3, 0x03CF, 0x30D4, 0x03D0,
+ 0x30D5, 0x03D1, 0x30D6, 0x03D2, 0x30D7, 0x03D3, 0x30D8, 0x03D4,
+ 0x30D9, 0x03D5, 0x30DA, 0x03D6, 0x30DB, 0x03D7, 0x30DC, 0x03D8,
+ 0x30DD, 0x03D9, 0x30DE, 0x03DA, 0x30DF, 0x03DB, 0x30E0, 0x03DC,
+ 0x30E1, 0x03DD, 0x30E2, 0x03DE, 0x30E3, 0x03DF, 0x30E4, 0x03E0,
+ 0x30E5, 0x03E1, 0x30E6, 0x03E2, 0x30E7, 0x03E3, 0x30E8, 0x03E4,
+ 0x30E9, 0x03E5, 0x30EA, 0x03E6, 0x30EB, 0x03E7, 0x30EC, 0x03E8,
+ 0x30ED, 0x03E9, 0x30EE, 0x03EA, 0x30EF, 0x03EB, 0x30F0, 0x03EC,
+ 0x30F1, 0x03ED, 0x30F2, 0x03EE, 0x30F3, 0x03EF, 0x30F4, 0x03F0,
+ 0x30F5, 0x03F1, 0x30F6, 0x03F2, 0x30F7, 0x2079, 0x30F8, 0x207A,
+ 0x30F9, 0x207B, 0x30FA, 0x207C, 0x30FB, 0x027E, 0x30FC, 0x0294,
+ 0x30FD, 0x028B, 0x30FE, 0x028C, 0x3220, 0x278E, 0x3221, 0x278F,
+ 0x3222, 0x2790, 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793,
+ 0x3226, 0x2794, 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797,
+ 0x322A, 0x2006, 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009,
+ 0x322E, 0x200A, 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2,
+ 0x3232, 0x1DC3, 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4,
+ 0x3236, 0x1FD3, 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4,
+ 0x323A, 0x1FD7, 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB,
+ 0x323E, 0x1FD2, 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D,
+ 0x3242, 0x1FD1, 0x3243, 0x1FCA, 0x3280, 0x28DD, 0x3281, 0x28DE,
+ 0x3282, 0x28DF, 0x3283, 0x28E0, 0x3284, 0x28E1, 0x3285, 0x28E2,
+ 0x3286, 0x28E3, 0x3287, 0x28E4, 0x3288, 0x28E5, 0x3289, 0x28E6,
+ 0x328A, 0x28E8, 0x328B, 0x28E9, 0x328C, 0x28EA, 0x328D, 0x28EB,
+ 0x328E, 0x28EC, 0x328F, 0x28ED, 0x3290, 0x28E7, 0x3291, 0x1FE1,
+ 0x3292, 0x1FE0, 0x3293, 0x1FE2, 0x3294, 0x1FDC, 0x3295, 0x28FF,
+ 0x3296, 0x1FE5, 0x3297, 0x28FC, 0x3298, 0x1FDE, 0x3299, 0x201F,
+ 0x329A, 0x28F9, 0x329B, 0x28F8, 0x329C, 0x28FE, 0x329D, 0x207F,
+ 0x329E, 0x1FFF, 0x329F, 0x28EF, 0x32A0, 0x28F6, 0x32A1, 0x28F7,
+ 0x32A2, 0x28FB, 0x32A3, 0x28FA, 0x32A4, 0x1DBD, 0x32A5, 0x1DBE,
+ 0x32A6, 0x1DBF, 0x32A7, 0x1DC0, 0x32A8, 0x1DC1, 0x32A9, 0x1FDA,
+ 0x32AA, 0x1FDD, 0x32AB, 0x1FDF, 0x32AC, 0x1FE3, 0x32AD, 0x1FD9,
+ 0x32AE, 0x1FE4, 0x32AF, 0x1FDB, 0x32B0, 0x1FD8, 0x32D0, 0x28AD,
+ 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0, 0x32D4, 0x28B1,
+ 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4, 0x32D8, 0x28B5,
+ 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8, 0x32DC, 0x28B9,
+ 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC, 0x32E0, 0x28BD,
+ 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0, 0x32E4, 0x28C1,
+ 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4, 0x32E8, 0x28C5,
+ 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8, 0x32EC, 0x28C9,
+ 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC, 0x32F0, 0x28CD,
+ 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0, 0x32F4, 0x28D1,
+ 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4, 0x32F8, 0x28D5,
+ 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8, 0x32FC, 0x28D9,
+ 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70, 0x3301, 0x2E62,
+ 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64, 0x3305, 0x1FF7,
+ 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67, 0x3309, 0x2E6C,
+ 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70, 0x330D, 0x1DAB,
+ 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73, 0x3311, 0x2E74,
+ 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2, 0x3315, 0x1F69,
+ 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68, 0x3319, 0x2E7A,
+ 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E, 0x331D, 0x2E7F,
+ 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81, 0x3321, 0x2E82,
+ 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83, 0x3325, 0x2E85,
+ 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88, 0x3329, 0x2E89,
+ 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B, 0x332E, 0x2E8E,
+ 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71, 0x3332, 0x2E91,
+ 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95, 0x3336, 0x1DA8,
+ 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E, 0x333A, 0x2E9D,
+ 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E, 0x333E, 0x2EA0,
+ 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F, 0x3342, 0x1F6D,
+ 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5, 0x3346, 0x2EA6,
+ 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1, 0x334A, 0x1DAF,
+ 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4, 0x334E, 0x2088,
+ 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9, 0x3352, 0x2EAE,
+ 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3, 0x3356, 0x2EB4,
+ 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083, 0x337C, 0x1DC7,
+ 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76, 0x3385, 0x1F5F,
+ 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000, 0x3389, 0x2001,
+ 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5, 0x3390, 0x1F63,
+ 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A, 0x339B, 0x2E59,
+ 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3, 0x339F, 0x1FFA,
+ 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55, 0x33A3, 0x1FFB,
+ 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC, 0x33B0, 0x1F5E,
+ 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B, 0x33C2, 0x2E50,
+ 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62, 0x33CC, 0x1FF6,
+ 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D, 0x33D8, 0x2E5E,
+ 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B, 0x3427, 0x3656,
+ 0x3488, 0x3C52, 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E,
+ 0x378D, 0x361A, 0x37E2, 0x372B, 0x3AF3, 0x3C40, 0x3B22, 0x3C49,
+ 0x3B88, 0x368D, 0x3E8A, 0x3C43, 0x3EDA, 0x3C48, 0x3FB1, 0x3754,
+ 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4264, 0x3760, 0x4293, 0x3C50,
+ 0x440C, 0x3C42, 0x4453, 0x3773, 0x457A, 0x3C4B, 0x4665, 0x3C4E,
+ 0x46AE, 0x3C51, 0x4BE8, 0x3C46, 0x4E00, 0x04B0, 0x4E01, 0x0BB8,
+ 0x4E03, 0x08E3, 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA,
+ 0x4E08, 0x09CE, 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C,
+ 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E10, 0x0FFB, 0x4E11, 0x04D1,
+ 0x4E14, 0x05CC, 0x4E15, 0x0FFC, 0x4E16, 0x0A48, 0x4E17, 0x10D7,
+ 0x4E18, 0x0670, 0x4E19, 0x0E0A, 0x4E1E, 0x09CF, 0x4E1F, 0x37DA,
+ 0x4E21, 0x0F86, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E2A, 0x0FFD,
+ 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4, 0x4E2F, 0x37DC,
+ 0x4E30, 0x37DD, 0x4E31, 0x0FFE, 0x4E32, 0x06F2, 0x4E36, 0x0FFF,
+ 0x4E37, 0x369D, 0x4E38, 0x0619, 0x4E39, 0x0B6E, 0x4E3B, 0x0913,
+ 0x4E3C, 0x1000, 0x4E3F, 0x1001, 0x4E40, 0x37DE, 0x4E41, 0x37DF,
+ 0x4E42, 0x1002, 0x4E43, 0x0CEB, 0x4E44, 0x37E0, 0x4E45, 0x0671,
+ 0x4E48, 0x372E, 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777,
+ 0x4E4F, 0x0E61, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
+ 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
+ 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E71, 0x0F5A,
+ 0x4E73, 0x0CD5, 0x4E7E, 0x05E1, 0x4E7F, 0x37E2, 0x4E80, 0x064F,
+ 0x4E82, 0x1005, 0x4E85, 0x1006, 0x4E86, 0x0F83, 0x4E88, 0x0F27,
+ 0x4E89, 0x0AEA, 0x4E8A, 0x1008, 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB,
+ 0x4E8D, 0x37E3, 0x4E8E, 0x100B, 0x4E91, 0x04E0, 0x4E92, 0x0793,
+ 0x4E94, 0x0792, 0x4E95, 0x04AA, 0x4E96, 0x37E4, 0x4E98, 0x0FF1,
+ 0x4E99, 0x0FF0, 0x4E9B, 0x0823, 0x4E9C, 0x0465, 0x4E9E, 0x100C,
+ 0x4E9F, 0x100D, 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F,
+ 0x4EA4, 0x07A6, 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696,
+ 0x4EAB, 0x0697, 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84,
+ 0x4EB0, 0x1010, 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5,
+ 0x4EBA, 0x0A13, 0x4EBB, 0x3620, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
+ 0x4EC2, 0x1017, 0x4EC4, 0x1015, 0x4EC6, 0x1016, 0x4EC7, 0x0672,
+ 0x4ECA, 0x0813, 0x4ECB, 0x0570, 0x4ECD, 0x1014, 0x4ECE, 0x1013,
+ 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6, 0x4ED4, 0x0894, 0x4ED5, 0x0893,
+ 0x4ED6, 0x0B1E, 0x4ED7, 0x1018, 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B,
+ 0x4EDD, 0x0290, 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7,
+ 0x4EE1, 0x20B4, 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E,
+ 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF2, 0x0BA5,
+ 0x4EF6, 0x0745, 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5,
+ 0x4EFD, 0x37E8, 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627,
+ 0x4F03, 0x20B7, 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA,
+ 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
+ 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F1A, 0x0571, 0x4F1C, 0x1040,
+ 0x4F1D, 0x0C3B, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F34, 0x0D50,
+ 0x4F36, 0x0FAA, 0x4F38, 0x09F3, 0x4F39, 0x20B8, 0x4F3A, 0x0895,
+ 0x4F3B, 0x37ED, 0x4F3C, 0x08C5, 0x4F3D, 0x0540, 0x4F43, 0x0BED,
+ 0x4F46, 0x0B60, 0x4F47, 0x1023, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
+ 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
+ 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
+ 0x4F57, 0x1022, 0x4F59, 0x0F28, 0x4F5A, 0x101E, 0x4F5B, 0x1020,
+ 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3, 0x4F60, 0x37EC,
+ 0x4F69, 0x1029, 0x4F6F, 0x102C, 0x4F70, 0x102A, 0x4F73, 0x0542,
+ 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F7A, 0x37F0, 0x4F7B, 0x1028,
+ 0x4F7C, 0x07A7, 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896,
+ 0x4F83, 0x05E2, 0x4F86, 0x102D, 0x4F88, 0x1025, 0x4F8A, 0x20BB,
+ 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6, 0x4F8F, 0x1026, 0x4F91, 0x102B,
+ 0x4F92, 0x20BA, 0x4F94, 0x20BD, 0x4F96, 0x102E, 0x4F97, 0x37F3,
+ 0x4F98, 0x1027, 0x4F9A, 0x20BC, 0x4F9B, 0x0699, 0x4F9D, 0x0491,
+ 0x4FA0, 0x069A, 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7,
+ 0x4FAE, 0x0DE0, 0x4FAF, 0x07A8, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
+ 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E, 0x4FC3, 0x0B05,
+ 0x4FC4, 0x0564, 0x4FC9, 0x20AC, 0x4FCA, 0x095D, 0x4FCD, 0x20BE,
+ 0x4FCE, 0x1032, 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035,
+ 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
+ 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
+ 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
+ 0x4FE5, 0x1039, 0x4FEE, 0x092E, 0x4FEF, 0x1046, 0x4FF3, 0x0D06,
+ 0x4FF5, 0x0DA8, 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536,
+ 0x4FFD, 0x37F6, 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7,
+ 0x5001, 0x37F8, 0x5002, 0x3447, 0x5005, 0x103F, 0x5006, 0x1048,
+ 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500D, 0x0D12, 0x500F, 0x1600,
+ 0x5010, 0x37F9, 0x5011, 0x1047, 0x5012, 0x0C57, 0x5014, 0x103C,
+ 0x5016, 0x07AA, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
+ 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042, 0x5022, 0x20C0,
+ 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E, 0x5026, 0x0747,
+ 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043, 0x502A, 0x103D,
+ 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7, 0x502E, 0x37FC,
+ 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800, 0x5040, 0x20BF,
+ 0x5042, 0x20C5, 0x5043, 0x1049, 0x5046, 0x20C3, 0x5047, 0x104A,
+ 0x5048, 0x104E, 0x5049, 0x0492, 0x504F, 0x0E20, 0x5050, 0x104D,
+ 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD, 0x505A, 0x104F,
+ 0x505C, 0x0C00, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
+ 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
+ 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5078, 0x1052, 0x507D, 0x0650,
+ 0x5080, 0x1053, 0x5085, 0x1055, 0x508D, 0x0E63, 0x508F, 0x3801,
+ 0x5091, 0x073C, 0x5094, 0x20C6, 0x5096, 0x3802, 0x5098, 0x087F,
+ 0x5099, 0x0D8B, 0x509A, 0x1054, 0x509C, 0x3803, 0x50AC, 0x0835,
+ 0x50AD, 0x0F2D, 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056,
+ 0x50B5, 0x0834, 0x50B7, 0x0987, 0x50BE, 0x070F, 0x50C2, 0x105B,
+ 0x50C5, 0x06C7, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
+ 0x50CD, 0x0C87, 0x50CF, 0x0AFE, 0x50D1, 0x069B, 0x50D5, 0x0E7B,
+ 0x50D6, 0x105C, 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85,
+ 0x50DE, 0x105D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
+ 0x50E7, 0x0AD0, 0x50E9, 0x3806, 0x50ED, 0x105F, 0x50EE, 0x1061,
+ 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F4, 0x20C7, 0x50F5, 0x1063,
+ 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x5100, 0x0651, 0x5101, 0x1065,
+ 0x5102, 0x1066, 0x5104, 0x052F, 0x5108, 0x3808, 0x5109, 0x1064,
+ 0x510B, 0x3809, 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069,
+ 0x5115, 0x1068, 0x5116, 0x1067, 0x5118, 0x102F, 0x511A, 0x106A,
+ 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
+ 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5137, 0x106D, 0x513A, 0x106C,
+ 0x513B, 0x106F, 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071,
+ 0x5141, 0x04B8, 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946,
+ 0x5146, 0x0BB9, 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB,
+ 0x514A, 0x20C9, 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4,
+ 0x514E, 0x0C40, 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074,
+ 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D, 0x5162, 0x1075,
+ 0x5164, 0x20CA, 0x5165, 0x0CD6, 0x5167, 0x368E, 0x5168, 0x0AB6,
+ 0x5169, 0x1077, 0x516A, 0x1078, 0x516B, 0x0D40, 0x516C, 0x07AC,
+ 0x516D, 0x0FE1, 0x516E, 0x1079, 0x5171, 0x069E, 0x5175, 0x0E0C,
+ 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
+ 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B, 0x5185, 0x0CBA,
+ 0x5186, 0x0501, 0x5189, 0x107E, 0x518A, 0x086D, 0x518C, 0x107D,
+ 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
+ 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
+ 0x5197, 0x09D1, 0x5199, 0x08F8, 0x519D, 0x20CB, 0x51A0, 0x05E3,
+ 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A4, 0x1084, 0x51A5, 0x0EC9,
+ 0x51A6, 0x1085, 0x51A8, 0x0DCC, 0x51A9, 0x1087, 0x51AA, 0x1088,
+ 0x51AB, 0x1089, 0x51AC, 0x0C59, 0x51B0, 0x108D, 0x51B1, 0x108B,
+ 0x51B2, 0x108C, 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E,
+ 0x51B6, 0x0EF6, 0x51B7, 0x0FAC, 0x51BC, 0x380F, 0x51BD, 0x108F,
+ 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C, 0x51C5, 0x1090,
+ 0x51C6, 0x0964, 0x51C9, 0x1091, 0x51CB, 0x0BBA, 0x51CC, 0x0F87,
+ 0x51CD, 0x0C5A, 0x51D6, 0x10DA, 0x51DB, 0x1092, 0x51DC, 0x205C,
+ 0x51DD, 0x06BD, 0x51DE, 0x3810, 0x51E0, 0x1093, 0x51E1, 0x0E8C,
+ 0x51E6, 0x0972, 0x51E7, 0x0B5C, 0x51E9, 0x1095, 0x51EA, 0x0CBC,
+ 0x51EC, 0x20CD, 0x51ED, 0x1096, 0x51EE, 0x3811, 0x51F0, 0x1097,
+ 0x51F1, 0x058C, 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F,
+ 0x51F8, 0x0CA4, 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35,
+ 0x51FE, 0x1099, 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814,
+ 0x5203, 0x0A15, 0x5204, 0x109A, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
+ 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
+ 0x5211, 0x0710, 0x5213, 0x3815, 0x5214, 0x109C, 0x5215, 0x20CE,
+ 0x5217, 0x0FBB, 0x521D, 0x0973, 0x5224, 0x0D51, 0x5225, 0x0E1C,
+ 0x5227, 0x109E, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522E, 0x10A0,
+ 0x5230, 0x0C78, 0x5233, 0x10A1, 0x5236, 0x0A4D, 0x5237, 0x086E,
+ 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
+ 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07, 0x5249, 0x3816,
+ 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6, 0x524D, 0x0AB2,
+ 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5256, 0x0E64, 0x525B, 0x07F6,
+ 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5261, 0x3817, 0x5263, 0x074B,
+ 0x5264, 0x084E, 0x5265, 0x0D23, 0x5266, 0x3818, 0x5269, 0x10AB,
+ 0x526A, 0x10A9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
+ 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
+ 0x527D, 0x10AE, 0x527F, 0x10AD, 0x5283, 0x05A2, 0x5287, 0x0736,
+ 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528D, 0x10AF, 0x5291, 0x10B4,
+ 0x5292, 0x10B1, 0x5293, 0x3819, 0x5294, 0x10B0, 0x529B, 0x0F97,
+ 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
+ 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52, 0x52AB, 0x07F7,
+ 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D, 0x52B1, 0x0FAD,
+ 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE, 0x52BC, 0x10B9,
+ 0x52BE, 0x058D, 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84,
+ 0x52C5, 0x0BD8, 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29,
+ 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D2, 0x1BEE, 0x52D5, 0x0C88,
+ 0x52D7, 0x10BD, 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2,
+ 0x52DD, 0x0989, 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2,
+ 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
+ 0x52E7, 0x05E7, 0x52F0, 0x381B, 0x52F2, 0x0704, 0x52F3, 0x10C3,
+ 0x52F5, 0x10C4, 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907,
+ 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
+ 0x5302, 0x0CCF, 0x5305, 0x0E41, 0x5306, 0x10C7, 0x5307, 0x20D4,
+ 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D, 0x530D, 0x10CA,
+ 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5315, 0x10CD, 0x5316, 0x053D,
+ 0x5317, 0x0E7A, 0x5319, 0x086C, 0x531A, 0x10CE, 0x531D, 0x0ADB,
+ 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
+ 0x532A, 0x0D6F, 0x532F, 0x10D0, 0x5331, 0x10D1, 0x5333, 0x10D2,
+ 0x5338, 0x10D3, 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9,
+ 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
+ 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5, 0x5347, 0x098B,
+ 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52, 0x534B, 0x3820,
+ 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70, 0x5352, 0x0B14,
+ 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6, 0x5358, 0x0B6F,
+ 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB, 0x5360, 0x0A8E,
+ 0x5361, 0x3821, 0x5366, 0x070B, 0x5369, 0x10DC, 0x536C, 0x3822,
+ 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9, 0x5371, 0x0629,
+ 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B, 0x5375, 0x0F5B,
+ 0x5377, 0x10E0, 0x5378, 0x0537, 0x537B, 0x10DF, 0x537D, 0x3435,
+ 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
+ 0x5393, 0x20D7, 0x5396, 0x10E2, 0x5398, 0x0F9A, 0x539A, 0x07B0,
+ 0x539F, 0x076A, 0x53A0, 0x10E3, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
+ 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AB, 0x3823, 0x53AD, 0x0500,
+ 0x53AE, 0x10E6, 0x53B0, 0x10E7, 0x53B2, 0x20D8, 0x53B3, 0x076B,
+ 0x53B6, 0x10E8, 0x53BB, 0x0688, 0x53C2, 0x0880, 0x53C3, 0x10E9,
+ 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674, 0x53CB, 0x0F11,
+ 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929, 0x53D4, 0x0951,
+ 0x53D6, 0x0914, 0x53D7, 0x0921, 0x53D9, 0x0980, 0x53DA, 0x3824,
+ 0x53DB, 0x0D54, 0x53DD, 0x20D9, 0x53DF, 0x10EC, 0x53E1, 0x04E5,
+ 0x53E2, 0x0AD3, 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF,
+ 0x53E6, 0x3825, 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E,
+ 0x53EB, 0x06A3, 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF,
+ 0x53EF, 0x0544, 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899,
+ 0x53F3, 0x04C8, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
+ 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
+ 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
+ 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
+ 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x541B, 0x0705,
+ 0x541D, 0x10FC, 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5426, 0x0D71,
+ 0x5427, 0x3827, 0x5429, 0x10FB, 0x542B, 0x061A, 0x542C, 0x10F6,
+ 0x542D, 0x10F7, 0x542E, 0x10F9, 0x5433, 0x35C0, 0x5436, 0x10FA,
+ 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD, 0x543C, 0x10F8,
+ 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF, 0x5440, 0x10F5,
+ 0x5442, 0x0FCA, 0x5446, 0x0E42, 0x5448, 0x0C04, 0x5449, 0x0796,
+ 0x544A, 0x0802, 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5,
+ 0x5455, 0x3723, 0x545F, 0x1101, 0x5466, 0x3829, 0x5468, 0x092A,
+ 0x546A, 0x0922, 0x546B, 0x382A, 0x5470, 0x1104, 0x5471, 0x1102,
+ 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF, 0x5476, 0x1108,
+ 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A, 0x547D, 0x0ECB,
+ 0x5480, 0x1107, 0x5484, 0x1109, 0x5486, 0x110B, 0x548A, 0x20DC,
+ 0x548B, 0x0860, 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100,
+ 0x548F, 0x10FE, 0x5490, 0x110A, 0x5492, 0x1105, 0x5496, 0x382D,
+ 0x549C, 0x20DB, 0x54A1, 0x382E, 0x54A2, 0x110D, 0x54A4, 0x1116,
+ 0x54A5, 0x110F, 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AB, 0x1114,
+ 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AF, 0x1131, 0x54B2, 0x0859,
+ 0x54B3, 0x058F, 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BC, 0x1118,
+ 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831, 0x54C0, 0x0469,
+ 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C4, 0x1111, 0x54C6, 0x3832,
+ 0x54C7, 0x110C, 0x54C8, 0x1112, 0x54C9, 0x0838, 0x54CD, 0x3833,
+ 0x54D8, 0x1119, 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A,
+ 0x54E6, 0x111B, 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54ED, 0x1120,
+ 0x54EE, 0x111F, 0x54F2, 0x0C29, 0x54FA, 0x1121, 0x54FD, 0x111E,
+ 0x54FF, 0x20DE, 0x5504, 0x04D6, 0x5506, 0x0826, 0x5507, 0x09F6,
+ 0x550E, 0x3834, 0x550F, 0x111C, 0x5510, 0x0C5C, 0x5514, 0x111D,
+ 0x5516, 0x0466, 0x552B, 0x3835, 0x552E, 0x1127, 0x552F, 0x0F0D,
+ 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836, 0x5538, 0x112C,
+ 0x5539, 0x1123, 0x553E, 0x0B23, 0x5540, 0x1124, 0x5544, 0x0B4F,
+ 0x5545, 0x1129, 0x5546, 0x098E, 0x554A, 0x3837, 0x554C, 0x1126,
+ 0x554F, 0x0EF0, 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B,
+ 0x555C, 0x1128, 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838,
+ 0x5561, 0x3839, 0x5563, 0x1125, 0x557B, 0x1134, 0x557C, 0x1139,
+ 0x557E, 0x1135, 0x5580, 0x1130, 0x5583, 0x113A, 0x5584, 0x0AB3,
+ 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
+ 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x5598, 0x1136,
+ 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
+ 0x559E, 0x1137, 0x559F, 0x1133, 0x55A7, 0x074C, 0x55A8, 0x113D,
+ 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664, 0x55AC, 0x06A4,
+ 0x55AE, 0x1138, 0x55B0, 0x06EC, 0x55B6, 0x04E6, 0x55C4, 0x1141,
+ 0x55C5, 0x113F, 0x55C7, 0x1178, 0x55D4, 0x1144, 0x55DA, 0x113E,
+ 0x55DC, 0x1142, 0x55DF, 0x1140, 0x55E3, 0x089A, 0x55E4, 0x1143,
+ 0x55F7, 0x1146, 0x55F9, 0x114B, 0x55FD, 0x1149, 0x55FE, 0x1148,
+ 0x5606, 0x0B70, 0x5608, 0x383C, 0x5609, 0x0545, 0x560E, 0x383D,
+ 0x560F, 0x383E, 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990,
+ 0x5618, 0x04D5, 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5629, 0x055E,
+ 0x562F, 0x1155, 0x5631, 0x09E4, 0x5632, 0x1151, 0x5634, 0x114F,
+ 0x5636, 0x1150, 0x5637, 0x383F, 0x5638, 0x1152, 0x563F, 0x3840,
+ 0x5642, 0x04DF, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
+ 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D, 0x5653, 0x1F1B,
+ 0x565B, 0x05D8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
+ 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
+ 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848, 0x5674, 0x0DFE,
+ 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C, 0x5680, 0x1159,
+ 0x5686, 0x1158, 0x5687, 0x05A3, 0x568A, 0x115A, 0x568F, 0x115D,
+ 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
+ 0x56A0, 0x115B, 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56AC, 0x384B,
+ 0x56AD, 0x384C, 0x56AE, 0x115F, 0x56B1, 0x384D, 0x56B4, 0x1161,
+ 0x56B6, 0x1160, 0x56BC, 0x1163, 0x56C0, 0x1166, 0x56C1, 0x1164,
+ 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C8, 0x1167, 0x56C9, 0x384E,
+ 0x56CA, 0x1E5A, 0x56CE, 0x1168, 0x56D1, 0x1169, 0x56D3, 0x116A,
+ 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56DA, 0x0928, 0x56DB, 0x089B,
+ 0x56DD, 0x384F, 0x56DE, 0x0573, 0x56E0, 0x04BC, 0x56E3, 0x0B82,
+ 0x56E4, 0x3850, 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F2, 0x0493,
+ 0x56F3, 0x0A24, 0x56F9, 0x116D, 0x56FA, 0x077B, 0x56FD, 0x0803,
+ 0x56FF, 0x116F, 0x5700, 0x116E, 0x5703, 0x0E30, 0x5704, 0x1170,
+ 0x5708, 0x1172, 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173,
+ 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
+ 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571C, 0x1179,
+ 0x571F, 0x0C54, 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A,
+ 0x5727, 0x0479, 0x5728, 0x084F, 0x572D, 0x0713, 0x572F, 0x3854,
+ 0x5730, 0x0B8D, 0x5733, 0x3855, 0x5734, 0x3856, 0x5737, 0x117B,
+ 0x5738, 0x117C, 0x573B, 0x117E, 0x5740, 0x117F, 0x5742, 0x0854,
+ 0x5747, 0x06C9, 0x574A, 0x0E65, 0x574C, 0x3857, 0x574E, 0x117D,
+ 0x574F, 0x1180, 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0,
+ 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
+ 0x5769, 0x1181, 0x576A, 0x0BF6, 0x5770, 0x3858, 0x577F, 0x1185,
+ 0x5782, 0x0A28, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
+ 0x578C, 0x3859, 0x5793, 0x1187, 0x579C, 0x385A, 0x57A0, 0x1188,
+ 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57AA, 0x118B,
+ 0x57AC, 0x20E2, 0x57B0, 0x118C, 0x57B3, 0x1189, 0x57B8, 0x385B,
+ 0x57C0, 0x1182, 0x57C3, 0x118D, 0x57C6, 0x118E, 0x57C7, 0x20E4,
+ 0x57C8, 0x20E3, 0x57CB, 0x0E92, 0x57CE, 0x09D3, 0x57D2, 0x1190,
+ 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D6, 0x1193, 0x57DC, 0x0CEE,
+ 0x57DF, 0x04AC, 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E6, 0x385C,
+ 0x57ED, 0x385D, 0x57F4, 0x09E5, 0x57F5, 0x385E, 0x57F6, 0x385F,
+ 0x57F7, 0x08E5, 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FC, 0x085B,
+ 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A, 0x5805, 0x074E,
+ 0x5806, 0x0B2F, 0x5809, 0x3861, 0x580A, 0x1192, 0x580B, 0x1195,
+ 0x5815, 0x0B24, 0x5819, 0x1196, 0x581D, 0x1197, 0x5820, 0x3862,
+ 0x5821, 0x1199, 0x5824, 0x0C05, 0x582A, 0x05EA, 0x582F, 0x1D32,
+ 0x5830, 0x0503, 0x5831, 0x0E43, 0x5832, 0x3863, 0x5834, 0x09D4,
+ 0x5835, 0x0C42, 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D,
+ 0x5841, 0x0FA5, 0x584A, 0x0574, 0x584B, 0x119B, 0x5851, 0x0ABC,
+ 0x5852, 0x119E, 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E,
+ 0x5859, 0x0D4D, 0x585A, 0x0BE9, 0x585E, 0x0839, 0x5861, 0x1E47,
+ 0x5862, 0x119A, 0x5869, 0x0518, 0x586B, 0x0C30, 0x5870, 0x119C,
+ 0x5872, 0x1198, 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864,
+ 0x587E, 0x0958, 0x5880, 0x3865, 0x5883, 0x06A5, 0x5885, 0x11A1,
+ 0x5893, 0x0E38, 0x5897, 0x0AFF, 0x589C, 0x0BE2, 0x589E, 0x20E7,
+ 0x589F, 0x11A3, 0x58A8, 0x0E7D, 0x58A9, 0x3866, 0x58AB, 0x11A4,
+ 0x58AE, 0x11A9, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
+ 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BE, 0x0816,
+ 0x58C1, 0x0E19, 0x58C5, 0x11AA, 0x58C7, 0x0B83, 0x58CA, 0x0575,
+ 0x58CC, 0x09D5, 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC,
+ 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
+ 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
+ 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E4, 0x11B2, 0x58E5, 0x11B0,
+ 0x58E9, 0x386B, 0x58EB, 0x089C, 0x58EC, 0x0A17, 0x58EE, 0x0AD6,
+ 0x58EF, 0x11B4, 0x58F0, 0x0A60, 0x58F1, 0x04B1, 0x58F2, 0x0D1A,
+ 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
+ 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5909, 0x0E21,
+ 0x590A, 0x11BB, 0x590B, 0x20E9, 0x590C, 0x386C, 0x590F, 0x0546,
+ 0x5910, 0x11BC, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
+ 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
+ 0x5922, 0x0EC0, 0x5924, 0x386D, 0x5925, 0x11BF, 0x5927, 0x0B47,
+ 0x5929, 0x0C31, 0x592A, 0x0B20, 0x592B, 0x0DC9, 0x592C, 0x11C0,
+ 0x592D, 0x11C1, 0x592E, 0x051D, 0x592F, 0x386E, 0x5931, 0x08E6,
+ 0x5932, 0x11C2, 0x5937, 0x0494, 0x5938, 0x11C3, 0x5939, 0x3725,
+ 0x593E, 0x11C4, 0x5944, 0x0504, 0x5947, 0x062D, 0x5948, 0x0CB8,
+ 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
+ 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
+ 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x595A, 0x11C9, 0x595B, 0x20EB,
+ 0x595D, 0x20EC, 0x5960, 0x11CC, 0x5961, 0x386F, 0x5962, 0x11CB,
+ 0x5963, 0x20ED, 0x5965, 0x051E, 0x5967, 0x11CD, 0x5968, 0x0991,
+ 0x5969, 0x11CF, 0x596A, 0x0B63, 0x596C, 0x11CE, 0x596D, 0x3870,
+ 0x596E, 0x0E03, 0x5973, 0x0981, 0x5974, 0x0C55, 0x5978, 0x11D0,
+ 0x597D, 0x07B7, 0x5981, 0x11D1, 0x5982, 0x0CD7, 0x5983, 0x0D72,
+ 0x5984, 0x0EDD, 0x598A, 0x0CDB, 0x598D, 0x11DA, 0x5993, 0x0652,
+ 0x5996, 0x0F2F, 0x5999, 0x0EBB, 0x599B, 0x1239, 0x599D, 0x11D2,
+ 0x59A3, 0x11D5, 0x59A4, 0x20EE, 0x59A5, 0x0B25, 0x59A8, 0x0E66,
+ 0x59AC, 0x0C44, 0x59B2, 0x11D6, 0x59B9, 0x0E93, 0x59BA, 0x20EF,
+ 0x59BB, 0x083A, 0x59BE, 0x0992, 0x59C6, 0x11D7, 0x59C9, 0x089E,
+ 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59D0, 0x047D, 0x59D1, 0x077C,
+ 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495, 0x59D9, 0x11DB,
+ 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873, 0x59E3, 0x3874,
+ 0x59E4, 0x3875, 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E8, 0x11D8,
+ 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59F6, 0x046C,
+ 0x59FB, 0x04BD, 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467,
+ 0x5A04, 0x3876, 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A11, 0x11DF,
+ 0x5A18, 0x0EC8, 0x5A1A, 0x11E2, 0x5A1B, 0x35C1, 0x5A1C, 0x11E0,
+ 0x5A1F, 0x11DE, 0x5A20, 0x09F7, 0x5A23, 0x3878, 0x5A25, 0x11DD,
+ 0x5A29, 0x0E2A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
+ 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
+ 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
+ 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A66, 0x0DCA, 0x5A6A, 0x11E9,
+ 0x5A6C, 0x11E4, 0x5A6D, 0x387C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
+ 0x5A92, 0x0D14, 0x5A9A, 0x11EA, 0x5A9B, 0x0DA4, 0x5A9E, 0x387E,
+ 0x5AA7, 0x387F, 0x5AAC, 0x3880, 0x5AB3, 0x3881, 0x5ABC, 0x11EB,
+ 0x5ABD, 0x11EF, 0x5ABE, 0x11EC, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
+ 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F, 0x5AD0, 0x11FB,
+ 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2,
+ 0x5AE3, 0x11F0, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AFA, 0x11F5,
+ 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B09, 0x062E, 0x5B0B, 0x11F8,
+ 0x5B0C, 0x11F7, 0x5B16, 0x11F9, 0x5B19, 0x3884, 0x5B22, 0x09D6,
+ 0x5B25, 0x3885, 0x5B2A, 0x11FC, 0x5B2C, 0x0BF8, 0x5B2D, 0x3886,
+ 0x5B30, 0x04E7, 0x5B32, 0x11FA, 0x5B36, 0x11FD, 0x5B3E, 0x11FE,
+ 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
+ 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B54, 0x07B8, 0x5B55, 0x1203,
+ 0x5B56, 0x20F0, 0x5B57, 0x08C8, 0x5B58, 0x0B18, 0x5B5A, 0x1204,
+ 0x5B5B, 0x1205, 0x5B5C, 0x08A8, 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE,
+ 0x5B63, 0x0642, 0x5B64, 0x077D, 0x5B65, 0x1206, 0x5B66, 0x05B6,
+ 0x5B69, 0x1207, 0x5B6B, 0x0B19, 0x5B70, 0x1208, 0x5B71, 0x1230,
+ 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B78, 0x120B, 0x5B7A, 0x120D,
+ 0x5B7C, 0x3888, 0x5B7E, 0x3889, 0x5B7F, 0x388A, 0x5B80, 0x120E,
+ 0x5B82, 0x3610, 0x5B83, 0x120F, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
+ 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
+ 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B95, 0x0C60,
+ 0x5B97, 0x092B, 0x5B98, 0x05ED, 0x5B99, 0x0BA6, 0x5B9A, 0x0C06,
+ 0x5B9B, 0x047C, 0x5B9C, 0x0653, 0x5B9D, 0x0E45, 0x5B9F, 0x08EE,
+ 0x5BA2, 0x066C, 0x5BA3, 0x0A8F, 0x5BA4, 0x08E8, 0x5BA5, 0x0F12,
+ 0x5BA6, 0x1210, 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590,
+ 0x5BB4, 0x0505, 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB8, 0x1211,
+ 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
+ 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
+ 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BD0, 0x1216,
+ 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215, 0x5BD8, 0x20F3,
+ 0x5BDB, 0x05EE, 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F,
+ 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
+ 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
+ 0x5BEB, 0x121C, 0x5BEC, 0x20F4, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
+ 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E, 0x5BF8, 0x0A47,
+ 0x5BFA, 0x08C9, 0x5BFE, 0x0B30, 0x5BFF, 0x0923, 0x5C01, 0x0DE7,
+ 0x5C02, 0x0A90, 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995,
+ 0x5C07, 0x1221, 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A,
+ 0x5C0B, 0x0A18, 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996,
+ 0x5C11, 0x0997, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
+ 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C20, 0x1225,
+ 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC, 0x5C28, 0x1227,
+ 0x5C2B, 0x388D, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
+ 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908, 0x5C3B, 0x09F2,
+ 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C, 0x5C3F, 0x0CD8,
+ 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689, 0x5C46, 0x122B,
+ 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530, 0x5C4D, 0x08A1,
+ 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E, 0x5C51, 0x06F5,
+ 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C5B, 0x1E92, 0x5C5E, 0x0B10,
+ 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
+ 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C69, 0x3890, 0x5C6C, 0x1231,
+ 0x5C6E, 0x1232, 0x5C6F, 0x0CAE, 0x5C71, 0x0881, 0x5C76, 0x1234,
+ 0x5C79, 0x1235, 0x5C7C, 0x3891, 0x5C8C, 0x1236, 0x5C90, 0x0630,
+ 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5CA1, 0x052C, 0x5CA6, 0x20F6,
+ 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAB, 0x123A, 0x5CAC, 0x0EB4,
+ 0x5CB1, 0x0B32, 0x5CB3, 0x05B7, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
+ 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
+ 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CCB, 0x3892,
+ 0x5CD2, 0x3893, 0x5CD9, 0x1242, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6,
+ 0x5CE6, 0x372C, 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248,
+ 0x5CED, 0x1246, 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894,
+ 0x5CF5, 0x20F8, 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E,
+ 0x5CFD, 0x1244, 0x5D07, 0x0A38, 0x5D0B, 0x1249, 0x5D0E, 0x085A,
+ 0x5D11, 0x124F, 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591,
+ 0x5D17, 0x124B, 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252,
+ 0x5D1B, 0x124E, 0x5D1F, 0x124D, 0x5D22, 0x1251, 0x5D24, 0x3895,
+ 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48, 0x5D42, 0x20FC,
+ 0x5D43, 0x3897, 0x5D46, 0x3898, 0x5D4A, 0x3899, 0x5D4B, 0x1258,
+ 0x5D4C, 0x1255, 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256,
+ 0x5D53, 0x20FA, 0x5D5C, 0x124C, 0x5D69, 0x0A39, 0x5D6C, 0x1259,
+ 0x5D6D, 0x20FD, 0x5D6F, 0x0827, 0x5D73, 0x125A, 0x5D76, 0x125B,
+ 0x5D82, 0x125E, 0x5D84, 0x125D, 0x5D87, 0x125C, 0x5D8B, 0x0C62,
+ 0x5D8C, 0x1247, 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B,
+ 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
+ 0x5DAC, 0x1261, 0x5DAE, 0x1262, 0x5DB2, 0x3BA5, 0x5DB7, 0x1265,
+ 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
+ 0x5DBD, 0x1263, 0x5DC9, 0x1267, 0x5DCC, 0x061C, 0x5DCD, 0x1268,
+ 0x5DD0, 0x2100, 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B,
+ 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
+ 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
+ 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC, 0x5DE8, 0x068A,
+ 0x5DEB, 0x126D, 0x5DEE, 0x0829, 0x5DF1, 0x077E, 0x5DF2, 0x126E,
+ 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9, 0x5DF5, 0x126F, 0x5DF7, 0x07BD,
+ 0x5DF8, 0x38A0, 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA,
+ 0x5DFF, 0x35E2, 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD,
+ 0x5E06, 0x0D55, 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273,
+ 0x5E12, 0x38A2, 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD,
+ 0x5E18, 0x38A5, 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274,
+ 0x5E1D, 0x0C07, 0x5E25, 0x0A29, 0x5E2B, 0x08A3, 0x5E2D, 0x0A6E,
+ 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C, 0x5E33, 0x0BBE,
+ 0x5E36, 0x1275, 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67,
+ 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
+ 0x5E47, 0x1280, 0x5E4C, 0x0E88, 0x5E4E, 0x127A, 0x5E54, 0x127C,
+ 0x5E55, 0x0E99, 0x5E57, 0x127B, 0x5E58, 0x38A7, 0x5E5F, 0x127D,
+ 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
+ 0x5E6B, 0x38A8, 0x5E6C, 0x38A9, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
+ 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E78, 0x07BE,
+ 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C, 0x5E7C, 0x0F2E,
+ 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285, 0x5E81, 0x0BBF,
+ 0x5E83, 0x07BF, 0x5E84, 0x0999, 0x5E87, 0x0D73, 0x5E8A, 0x099A,
+ 0x5E8F, 0x0982, 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33,
+ 0x5E99, 0x36B0, 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286,
+ 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
+ 0x5EAB, 0x077F, 0x5EAD, 0x0C09, 0x5EB5, 0x0487, 0x5EB6, 0x0978,
+ 0x5EB7, 0x07C1, 0x5EB8, 0x0F31, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
+ 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC8, 0x1289,
+ 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x38AE, 0x5ECF, 0x128B,
+ 0x5ED0, 0x128A, 0x5ED2, 0x38AF, 0x5ED3, 0x05A5, 0x5ED6, 0x128C,
+ 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E, 0x5EDF, 0x0DB2,
+ 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291, 0x5EE3, 0x128D,
+ 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295, 0x5EF0, 0x1298,
+ 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299, 0x5EF6, 0x0506,
+ 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EFA, 0x0750, 0x5EFB, 0x0576,
+ 0x5EFC, 0x0CEC, 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F01, 0x0E2B,
+ 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0, 0x5F09, 0x129D,
+ 0x5F0A, 0x0E10, 0x5F0B, 0x12A0, 0x5F0C, 0x0FFA, 0x5F0D, 0x100A,
+ 0x5F0E, 0x38B1, 0x5F0F, 0x08DC, 0x5F10, 0x0CCD, 0x5F11, 0x12A1,
+ 0x5F13, 0x0677, 0x5F14, 0x0BC0, 0x5F15, 0x04BE, 0x5F16, 0x12A2,
+ 0x5F17, 0x0DF6, 0x5F18, 0x07C2, 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2,
+ 0x5F1D, 0x38B3, 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4,
+ 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
+ 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
+ 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
+ 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
+ 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6, 0x5F45, 0x20B2,
+ 0x5F48, 0x12A7, 0x5F4A, 0x06A8, 0x5F4C, 0x12A8, 0x5F4E, 0x12A9,
+ 0x5F50, 0x38B9, 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F56, 0x12AC,
+ 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
+ 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F64, 0x38BB,
+ 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103, 0x5F69, 0x083C,
+ 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD, 0x5F6D, 0x12B0,
+ 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F73, 0x12B1, 0x5F77, 0x12B2,
+ 0x5F79, 0x0EFE, 0x5F7C, 0x0D74, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
+ 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
+ 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
+ 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F90, 0x0983,
+ 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948, 0x5F97, 0x0C98,
+ 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD, 0x5F9E, 0x12BA,
+ 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA4, 0x38BF, 0x5FA7, 0x38BE,
+ 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE, 0x5FAA, 0x0965, 0x5FAD, 0x12BF,
+ 0x5FAE, 0x0D8D, 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3,
+ 0x5FB5, 0x3438, 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A,
+ 0x5FBC, 0x12C0, 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2,
+ 0x5FC5, 0x0D9E, 0x5FC9, 0x38C3, 0x5FCC, 0x0633, 0x5FCD, 0x0CDC,
+ 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
+ 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
+ 0x5FE1, 0x38C4, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5, 0x5FEB, 0x0577,
+ 0x5FED, 0x38C6, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF5, 0x0CE6,
+ 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7, 0x5FFD, 0x080C,
+ 0x5FFF, 0x12C8, 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC,
+ 0x6012, 0x0C56, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
+ 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0, 0x601C, 0x0FAF,
+ 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9, 0x6025, 0x0678,
+ 0x6026, 0x12D3, 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD,
+ 0x602A, 0x0578, 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF,
+ 0x6033, 0x38CA, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
+ 0x6043, 0x12DF, 0x6046, 0x12DC, 0x604A, 0x12DB, 0x604B, 0x0FC0,
+ 0x604D, 0x12DD, 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6055, 0x0984,
+ 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
+ 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
+ 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6068, 0x0818, 0x6069, 0x0538,
+ 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2, 0x606D, 0x06AB,
+ 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719, 0x6077, 0x12D9,
+ 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8, 0x6084, 0x12EA,
+ 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108, 0x608B, 0x12F0,
+ 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE, 0x6094, 0x0579,
+ 0x6096, 0x12EC, 0x6097, 0x12ED, 0x609A, 0x12E9, 0x609B, 0x12EB,
+ 0x609E, 0x38CD, 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1,
+ 0x60A4, 0x38CE, 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A9, 0x0CF0,
+ 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B2, 0x0D75, 0x60B3, 0x12C7,
+ 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1, 0x60B8, 0x12F2,
+ 0x60BC, 0x0C63, 0x60BD, 0x12F7, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
+ 0x60C7, 0x0CAF, 0x60CB, 0x38D0, 0x60D1, 0x0FED, 0x60D3, 0x12F4,
+ 0x60D5, 0x210A, 0x60D8, 0x12FA, 0x60DA, 0x080D, 0x60DB, 0x38D1,
+ 0x60DC, 0x0A6F, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
+ 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
+ 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C, 0x60F3, 0x0ADD,
+ 0x60F4, 0x1301, 0x60F6, 0x12FE, 0x60F7, 0x12FF, 0x60F8, 0x38D2,
+ 0x60F9, 0x0912, 0x60FA, 0x1302, 0x60FB, 0x1305, 0x6100, 0x1300,
+ 0x6101, 0x092F, 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08,
+ 0x6109, 0x0F07, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
+ 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4, 0x6114, 0x38D5,
+ 0x6115, 0x12FC, 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6,
+ 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
+ 0x6128, 0x130B, 0x612C, 0x1310, 0x6130, 0x210F, 0x6134, 0x1311,
+ 0x6137, 0x210E, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
+ 0x613F, 0x130E, 0x6142, 0x1313, 0x6144, 0x1314, 0x6147, 0x1309,
+ 0x6148, 0x08CA, 0x614A, 0x130D, 0x614B, 0x0B36, 0x614C, 0x07C4,
+ 0x614D, 0x12FB, 0x614E, 0x09FB, 0x6153, 0x1321, 0x6155, 0x0E39,
+ 0x6158, 0x1317, 0x6159, 0x1318, 0x615A, 0x1319, 0x615D, 0x1320,
+ 0x615F, 0x131F, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6165, 0x131D,
+ 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A, 0x616E, 0x0F80,
+ 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E, 0x6173, 0x1315,
+ 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A, 0x6177, 0x1316,
+ 0x617C, 0x38D7, 0x617E, 0x0F47, 0x6182, 0x0F15, 0x6187, 0x1325,
+ 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
+ 0x6191, 0x132A, 0x6194, 0x1327, 0x6196, 0x1324, 0x6198, 0x2110,
+ 0x6199, 0x1323, 0x619A, 0x1328, 0x619F, 0x38D9, 0x61A4, 0x0E00,
+ 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C, 0x61AB, 0x132B,
+ 0x61AC, 0x1326, 0x61AE, 0x132C, 0x61B2, 0x0751, 0x61B6, 0x0531,
+ 0x61BA, 0x1334, 0x61BE, 0x05F4, 0x61C2, 0x38DB, 0x61C3, 0x1332,
+ 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331, 0x61C9, 0x132F,
+ 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D, 0x61CD, 0x1337,
+ 0x61D0, 0x057B, 0x61DF, 0x38DC, 0x61E3, 0x1339, 0x61E6, 0x1338,
+ 0x61F2, 0x0BC4, 0x61F4, 0x133C, 0x61F6, 0x133A, 0x61F7, 0x1330,
+ 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
+ 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6208, 0x1342,
+ 0x6209, 0x1343, 0x620A, 0x0E3A, 0x620C, 0x1345, 0x620D, 0x1344,
+ 0x620E, 0x0949, 0x6210, 0x0A52, 0x6211, 0x0566, 0x6212, 0x057C,
+ 0x6213, 0x2111, 0x6214, 0x1346, 0x6215, 0x38DD, 0x6216, 0x0483,
+ 0x621A, 0x0A70, 0x621B, 0x1347, 0x621D, 0x1A64, 0x621E, 0x1348,
+ 0x621F, 0x0737, 0x6221, 0x1349, 0x6226, 0x0A93, 0x6229, 0x38DE,
+ 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
+ 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37, 0x6236, 0x35BD,
+ 0x6238, 0x0781, 0x623B, 0x0EED, 0x623E, 0x344E, 0x623F, 0x0E6A,
+ 0x6240, 0x0974, 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0,
+ 0x6247, 0x0A94, 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916,
+ 0x624C, 0x38E1, 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2,
+ 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
+ 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354, 0x6263, 0x1352,
+ 0x6268, 0x1355, 0x626E, 0x0E01, 0x6271, 0x047B, 0x6276, 0x0DD0,
+ 0x6279, 0x0D77, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
+ 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
+ 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6291, 0x0F48,
+ 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F, 0x6295, 0x0C64,
+ 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82, 0x629B, 0x136D,
+ 0x629C, 0x0D48, 0x629E, 0x0B52, 0x62A6, 0x2112, 0x62AB, 0x0D78,
+ 0x62AC, 0x13B2, 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3,
+ 0x62BB, 0x1362, 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B,
+ 0x62C4, 0x38E4, 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C,
+ 0x62C8, 0x1367, 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369,
+ 0x62CD, 0x0D25, 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361,
+ 0x62D2, 0x068B, 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D7, 0x1360,
+ 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DB, 0x099F, 0x62DC, 0x1368,
+ 0x62DD, 0x0D08, 0x62E0, 0x068C, 0x62E1, 0x05A6, 0x62EC, 0x05C5,
+ 0x62ED, 0x09E7, 0x62EE, 0x1370, 0x62EF, 0x1375, 0x62F1, 0x1371,
+ 0x62F3, 0x0753, 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB,
+ 0x62FC, 0x38E5, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
+ 0x6302, 0x1373, 0x6307, 0x08A6, 0x6308, 0x1374, 0x6309, 0x0488,
+ 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7, 0x6311, 0x0BC5,
+ 0x6318, 0x38E8, 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC,
+ 0x6327, 0x1372, 0x6328, 0x046B, 0x632B, 0x0833, 0x632F, 0x09FC,
+ 0x6339, 0x38E9, 0x633A, 0x0C0E, 0x633D, 0x0D68, 0x633E, 0x1378,
+ 0x633F, 0x0AE0, 0x6342, 0x38EA, 0x6343, 0x38EB, 0x6349, 0x0B0A,
+ 0x634C, 0x0879, 0x634D, 0x1379, 0x634F, 0x137B, 0x6350, 0x1377,
+ 0x6355, 0x0E31, 0x6357, 0x0BD9, 0x635C, 0x0ADE, 0x6365, 0x38EC,
+ 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
+ 0x636E, 0x0A3E, 0x6372, 0x0754, 0x6374, 0x38ED, 0x6376, 0x1380,
+ 0x6377, 0x09A1, 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637D, 0x38EE,
+ 0x6380, 0x137E, 0x6383, 0x0ADF, 0x6384, 0x38EF, 0x6387, 0x38F0,
+ 0x6388, 0x0924, 0x6389, 0x1383, 0x638C, 0x09A0, 0x638E, 0x137D,
+ 0x638F, 0x1382, 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6396, 0x137C,
+ 0x6398, 0x06F7, 0x639B, 0x05BB, 0x639E, 0x38F2, 0x639F, 0x1384,
+ 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73, 0x63A3, 0x1381,
+ 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A, 0x63A9, 0x0508,
+ 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F, 0x63B2, 0x071D,
+ 0x63B4, 0x0BEB, 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BE, 0x1388,
+ 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
+ 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
+ 0x63D2, 0x138E, 0x63D6, 0x0F16, 0x63DA, 0x0F32, 0x63DB, 0x05F5,
+ 0x63DC, 0x38F4, 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E9, 0x1389,
+ 0x63ED, 0x341C, 0x63EE, 0x0634, 0x63F4, 0x0509, 0x63F5, 0x2113,
+ 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63FA, 0x0F33, 0x6406, 0x1393,
+ 0x6409, 0x38F5, 0x640D, 0x0B1B, 0x640F, 0x139A, 0x6410, 0x38F6,
+ 0x6413, 0x1394, 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398,
+ 0x641C, 0x137A, 0x6422, 0x38F7, 0x6426, 0x1395, 0x6428, 0x1399,
+ 0x642C, 0x0D56, 0x642D, 0x0C65, 0x6434, 0x1392, 0x6436, 0x1396,
+ 0x643A, 0x071E, 0x643E, 0x0861, 0x6442, 0x0A81, 0x644E, 0x139E,
+ 0x6451, 0x1E43, 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645B, 0x38F9,
+ 0x6460, 0x2114, 0x6467, 0x139B, 0x6469, 0x0E8E, 0x646D, 0x38FA,
+ 0x646F, 0x139C, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x647A, 0x0A46,
+ 0x647B, 0x38FB, 0x6483, 0x0738, 0x6488, 0x13A4, 0x6492, 0x0883,
+ 0x6493, 0x13A1, 0x6495, 0x13A0, 0x649A, 0x0CE8, 0x649D, 0x2115,
+ 0x649E, 0x0C8D, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
+ 0x64AB, 0x0DE1, 0x64AD, 0x0CFB, 0x64AE, 0x0871, 0x64B0, 0x0A95,
+ 0x64B2, 0x0E7E, 0x64B9, 0x05A7, 0x64BB, 0x13AA, 0x64BC, 0x13A5,
+ 0x64BE, 0x38FC, 0x64BF, 0x38FD, 0x64C1, 0x0F34, 0x64C2, 0x13AC,
+ 0x64C5, 0x13A8, 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CD, 0x0AE2,
+ 0x64CE, 0x2116, 0x64D2, 0x13A7, 0x64D4, 0x1366, 0x64D8, 0x13AB,
+ 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
+ 0x64E3, 0x13B3, 0x64E5, 0x38FE, 0x64E6, 0x0872, 0x64E7, 0x13AE,
+ 0x64EC, 0x0656, 0x64EF, 0x13B4, 0x64F1, 0x13AD, 0x64F2, 0x13B8,
+ 0x64F4, 0x13B7, 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9,
+ 0x64FB, 0x3900, 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x6500, 0x13BA,
+ 0x6504, 0x3901, 0x6505, 0x13BE, 0x6516, 0x3902, 0x6518, 0x13BC,
+ 0x6519, 0x3903, 0x651C, 0x13BD, 0x651D, 0x1397, 0x6522, 0x1E97,
+ 0x6523, 0x13C0, 0x6524, 0x13BF, 0x652A, 0x139F, 0x652B, 0x13C1,
+ 0x652C, 0x13B5, 0x652F, 0x08A7, 0x6534, 0x13C2, 0x6535, 0x13C3,
+ 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
+ 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6545, 0x0782,
+ 0x6547, 0x3904, 0x6548, 0x13C8, 0x654D, 0x13CB, 0x654E, 0x2117,
+ 0x654F, 0x0DC4, 0x6551, 0x0679, 0x6555, 0x13CA, 0x6556, 0x13C9,
+ 0x6557, 0x0D0A, 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE,
+ 0x655E, 0x13CD, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
+ 0x6567, 0x3905, 0x656C, 0x071F, 0x6570, 0x0A3A, 0x6572, 0x13CF,
+ 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1, 0x6578, 0x13D0,
+ 0x6581, 0x3906, 0x6582, 0x13D1, 0x6583, 0x13D2, 0x6585, 0x3907,
+ 0x6587, 0x0E08, 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658C, 0x0DBE,
+ 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6597, 0x0C47,
+ 0x6599, 0x0F89, 0x659B, 0x13D4, 0x659C, 0x08FC, 0x659F, 0x13D5,
+ 0x65A1, 0x047A, 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2,
+ 0x65AB, 0x13D6, 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9,
+ 0x65B0, 0x09FD, 0x65B7, 0x13D7, 0x65B9, 0x0E4D, 0x65BC, 0x0519,
+ 0x65BD, 0x08AA, 0x65C1, 0x13DA, 0x65C2, 0x3908, 0x65C3, 0x13D8,
+ 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9, 0x65CB, 0x0A9F,
+ 0x65CC, 0x13DC, 0x65CF, 0x0B12, 0x65D2, 0x13DD, 0x65D7, 0x0636,
+ 0x65D9, 0x13DF, 0x65DB, 0x13DE, 0x65E0, 0x13E0, 0x65E1, 0x13E1,
+ 0x65E2, 0x0637, 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74,
+ 0x65E7, 0x0686, 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966,
+ 0x65ED, 0x0474, 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A,
+ 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x6600, 0x2118, 0x6602, 0x07C9,
+ 0x6603, 0x13E5, 0x6606, 0x081B, 0x6607, 0x09A2, 0x6609, 0x211A,
+ 0x660A, 0x13E4, 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A,
+ 0x6613, 0x049B, 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB,
+ 0x661E, 0x211C, 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6624, 0x211D,
+ 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862, 0x662C, 0x390B,
+ 0x662D, 0x09A4, 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6631, 0x20AE,
+ 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9, 0x663B, 0x1E00,
+ 0x663C, 0x0BA9, 0x663F, 0x1409, 0x6641, 0x13EF, 0x6642, 0x08CC,
+ 0x6643, 0x07CA, 0x6644, 0x13ED, 0x6649, 0x13EE, 0x664B, 0x09FE,
+ 0x664C, 0x390C, 0x664F, 0x13EC, 0x6652, 0x087D, 0x6657, 0x211F,
+ 0x6659, 0x2120, 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1,
+ 0x665E, 0x13F0, 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6,
+ 0x6663, 0x373A, 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580,
+ 0x6667, 0x13F3, 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666B, 0x3910,
+ 0x666E, 0x0DD3, 0x666F, 0x0720, 0x6670, 0x13F7, 0x6673, 0x2122,
+ 0x6674, 0x0A56, 0x6676, 0x09A5, 0x6677, 0x3911, 0x667A, 0x0B90,
+ 0x6681, 0x06BF, 0x6683, 0x13F8, 0x6684, 0x13FC, 0x6687, 0x054B,
+ 0x6688, 0x13F9, 0x6689, 0x13FB, 0x668E, 0x13FA, 0x6691, 0x0975,
+ 0x6696, 0x0B86, 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123,
+ 0x669D, 0x13FE, 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912,
+ 0x66A6, 0x0FB9, 0x66AB, 0x0891, 0x66AE, 0x0E3B, 0x66B2, 0x2125,
+ 0x66B4, 0x0E6B, 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BC, 0x1403,
+ 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C1, 0x13FF, 0x66C4, 0x1404,
+ 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913, 0x66C9, 0x1401,
+ 0x66D6, 0x1406, 0x66D9, 0x0976, 0x66DA, 0x1407, 0x66DC, 0x0F35,
+ 0x66DD, 0x0D2E, 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E9, 0x140B,
+ 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
+ 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
+ 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
+ 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
+ 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744, 0x6709, 0x0F17,
+ 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128, 0x670F, 0x140F,
+ 0x6713, 0x3916, 0x6714, 0x0863, 0x6715, 0x0BDB, 0x6716, 0x1410,
+ 0x6717, 0x0FD5, 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411,
+ 0x671F, 0x0638, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
+ 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
+ 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
+ 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419, 0x673A, 0x0635,
+ 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418, 0x6743, 0x35B7,
+ 0x6746, 0x141B, 0x6748, 0x3918, 0x6749, 0x0A3F, 0x674C, 0x3919,
+ 0x674E, 0x0F65, 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C,
+ 0x6753, 0x0909, 0x6756, 0x09DB, 0x6759, 0x141E, 0x675C, 0x0C48,
+ 0x675E, 0x141C, 0x675F, 0x0B0B, 0x6760, 0x141D, 0x6761, 0x09DA,
+ 0x6762, 0x0EE9, 0x6763, 0x141F, 0x6764, 0x1420, 0x6765, 0x0F52,
+ 0x6766, 0x212A, 0x676A, 0x1425, 0x676D, 0x07CC, 0x676E, 0x3571,
+ 0x676F, 0x0D0B, 0x6770, 0x1422, 0x6771, 0x0C66, 0x6772, 0x13E3,
+ 0x6773, 0x13E7, 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD,
+ 0x677B, 0x391B, 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58,
+ 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421, 0x678B, 0x1427,
+ 0x678C, 0x1426, 0x6790, 0x0A73, 0x6795, 0x0E9B, 0x6797, 0x0F9B,
+ 0x679A, 0x0E95, 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE,
+ 0x67A1, 0x1429, 0x67A2, 0x0A3B, 0x67A6, 0x1428, 0x67A9, 0x1423,
+ 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B2, 0x391D, 0x67B3, 0x142F,
+ 0x67B4, 0x142D, 0x67B6, 0x054D, 0x67B7, 0x142B, 0x67B8, 0x1431,
+ 0x67B9, 0x1437, 0x67BB, 0x212B, 0x67C0, 0x212D, 0x67C1, 0x0B28,
+ 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67CA, 0x0D94, 0x67CE, 0x1438,
+ 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7, 0x67D3, 0x0A9B,
+ 0x67D4, 0x094A, 0x67D7, 0x391F, 0x67D8, 0x0BEF, 0x67D9, 0x3920,
+ 0x67DA, 0x0F18, 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435,
+ 0x67E4, 0x1432, 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E,
+ 0x67EE, 0x1436, 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA,
+ 0x67F3, 0x0F04, 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F9, 0x391E,
+ 0x67FB, 0x082A, 0x67FE, 0x0E9D, 0x67FF, 0x059F, 0x6801, 0x212E,
+ 0x6802, 0x0BEA, 0x6803, 0x0CA2, 0x6804, 0x04EB, 0x6805, 0x1E07,
+ 0x6813, 0x0A96, 0x6816, 0x0A58, 0x6817, 0x0700, 0x681E, 0x143C,
+ 0x6821, 0x07CD, 0x6822, 0x05DA, 0x6829, 0x143E, 0x682A, 0x05D2,
+ 0x682B, 0x1444, 0x682C, 0x3922, 0x6830, 0x3923, 0x6831, 0x3924,
+ 0x6832, 0x1441, 0x6834, 0x0A97, 0x6838, 0x05A9, 0x6839, 0x081C,
+ 0x683C, 0x05A8, 0x683D, 0x083F, 0x6840, 0x143F, 0x6841, 0x073B,
+ 0x6842, 0x0721, 0x6843, 0x0C67, 0x6844, 0x212F, 0x6846, 0x143D,
+ 0x6848, 0x048A, 0x684D, 0x1440, 0x684E, 0x1442, 0x6850, 0x06C5,
+ 0x6851, 0x0702, 0x6852, 0x212C, 0x6853, 0x05F8, 0x6854, 0x0665,
+ 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
+ 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x6872, 0x3926,
+ 0x6874, 0x1452, 0x6875, 0x3927, 0x6876, 0x0533, 0x6877, 0x1447,
+ 0x687A, 0x3928, 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A,
+ 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x688D, 0x1457,
+ 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6893, 0x0478, 0x6894, 0x144C,
+ 0x6897, 0x07CE, 0x689B, 0x144E, 0x689D, 0x144D, 0x689F, 0x1449,
+ 0x68A0, 0x1454, 0x68A2, 0x09A7, 0x68A5, 0x392A, 0x68A6, 0x11BE,
+ 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AD, 0x144B, 0x68AF, 0x0C10,
+ 0x68B0, 0x0581, 0x68B1, 0x081D, 0x68B2, 0x392B, 0x68B3, 0x1443,
+ 0x68B5, 0x1453, 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455,
+ 0x68BC, 0x0C68, 0x68C4, 0x063A, 0x68C6, 0x1473, 0x68C8, 0x20AF,
+ 0x68C9, 0x0ED5, 0x68CA, 0x145A, 0x68CB, 0x0639, 0x68CD, 0x1461,
+ 0x68CF, 0x2130, 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462,
+ 0x68D5, 0x1464, 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C,
+ 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
+ 0x68E3, 0x1469, 0x68E7, 0x1463, 0x68E8, 0x392E, 0x68ED, 0x392F,
+ 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
+ 0x68F2, 0x0A57, 0x68F9, 0x146B, 0x68FA, 0x05F9, 0x68FC, 0x3932,
+ 0x6900, 0x0FF6, 0x6901, 0x1459, 0x6904, 0x1467, 0x6905, 0x049C,
+ 0x6908, 0x145B, 0x690B, 0x0EC6, 0x690C, 0x1460, 0x690D, 0x09E8,
+ 0x690E, 0x0BE3, 0x690F, 0x1456, 0x6911, 0x3933, 0x6912, 0x1466,
+ 0x6913, 0x3934, 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF,
+ 0x691C, 0x0755, 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471,
+ 0x6925, 0x146A, 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F,
+ 0x6930, 0x1480, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
+ 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E, 0x693F, 0x0BF4,
+ 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
+ 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695C, 0x1476,
+ 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7, 0x6961, 0x1481,
+ 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6968, 0x2132, 0x696A, 0x1485,
+ 0x696B, 0x1478, 0x696D, 0x06C0, 0x696E, 0x147B, 0x696F, 0x0967,
+ 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D, 0x6975, 0x06C3,
+ 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474, 0x697C, 0x0FD6,
+ 0x697D, 0x05B8, 0x697E, 0x147A, 0x697F, 0x393A, 0x6980, 0x393B,
+ 0x6981, 0x1484, 0x6982, 0x0593, 0x698A, 0x0857, 0x698E, 0x04FF,
+ 0x6991, 0x1495, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6998, 0x2134,
+ 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496, 0x69A6, 0x393C,
+ 0x69A7, 0x1493, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69B1, 0x14A4,
+ 0x69B2, 0x1486, 0x69B4, 0x1499, 0x69B7, 0x393E, 0x69BB, 0x1491,
+ 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C1, 0x148A, 0x69C3, 0x1492,
+ 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF, 0x69CC, 0x0BE4,
+ 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69D0, 0x1488, 0x69D3, 0x148B,
+ 0x69D6, 0x393F, 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98,
+ 0x69DD, 0x1490, 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E7, 0x14A2,
+ 0x69E8, 0x149B, 0x69EA, 0x356F, 0x69EB, 0x14A8, 0x69ED, 0x14A6,
+ 0x69F2, 0x14A1, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
+ 0x69FD, 0x0AE7, 0x69FF, 0x149E, 0x6A01, 0x3941, 0x6A02, 0x149C,
+ 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89, 0x6A0C, 0x14AF,
+ 0x6A0F, 0x3942, 0x6A12, 0x14AA, 0x6A13, 0x14AD, 0x6A14, 0x14A7,
+ 0x6A15, 0x3943, 0x6A17, 0x0BB2, 0x6A19, 0x0DAA, 0x6A1B, 0x149D,
+ 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
+ 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
+ 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A34, 0x3945,
+ 0x6A35, 0x09A9, 0x6A36, 0x14B1, 0x6A38, 0x14B8, 0x6A39, 0x0925,
+ 0x6A3A, 0x05D0, 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A44, 0x14AE,
+ 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
+ 0x6A4B, 0x06AE, 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A54, 0x3C34,
+ 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5, 0x6A5B, 0x394B,
+ 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4, 0x6A66, 0x14B6,
+ 0x6A6B, 0x2137, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
+ 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87, 0x6A83, 0x394C,
+ 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8D, 0x14BB, 0x6A8E, 0x079D,
+ 0x6A90, 0x14BA, 0x6A91, 0x394E, 0x6A97, 0x14C0, 0x6A9C, 0x143B,
+ 0x6A9D, 0x394F, 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC,
+ 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AAA, 0x14CB, 0x6AAC, 0x14C7,
+ 0x6AAE, 0x1450, 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2,
+ 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AD1, 0x14C9,
+ 0x6AD3, 0x0FCC, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3, 0x6ADC, 0x3952,
+ 0x6ADE, 0x14C8, 0x6ADF, 0x14CA, 0x6AE2, 0x213B, 0x6AE4, 0x213C,
+ 0x6AE7, 0x3953, 0x6AE8, 0x0D3B, 0x6AEA, 0x14CD, 0x6AEC, 0x3954,
+ 0x6AFA, 0x14D1, 0x6AFB, 0x14CE, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
+ 0x6B0A, 0x149F, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B1D, 0x04D7,
+ 0x6B1E, 0x3955, 0x6B1F, 0x14D5, 0x6B20, 0x073D, 0x6B21, 0x08CD,
+ 0x6B23, 0x06CD, 0x6B24, 0x3956, 0x6B27, 0x0524, 0x6B32, 0x0F49,
+ 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
+ 0x6B3A, 0x0657, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA, 0x6B43, 0x14DC,
+ 0x6B46, 0x3958, 0x6B47, 0x14DB, 0x6B49, 0x14DD, 0x6B4C, 0x054E,
+ 0x6B4E, 0x0B75, 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0,
+ 0x6B56, 0x3959, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
+ 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
+ 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B69, 0x0E32,
+ 0x6B6A, 0x0FEA, 0x6B6F, 0x08C3, 0x6B72, 0x35D9, 0x6B73, 0x0840,
+ 0x6B74, 0x0FBA, 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5,
+ 0x6B7B, 0x08AE, 0x6B7F, 0x14E6, 0x6B80, 0x14E7, 0x6B82, 0x395B,
+ 0x6B83, 0x14E9, 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968,
+ 0x6B8A, 0x0918, 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC,
+ 0x6B96, 0x09E9, 0x6B98, 0x14EB, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
+ 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAF, 0x14F1, 0x6BB1, 0x14F3,
+ 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
+ 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
+ 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D, 0x6BC5, 0x063D,
+ 0x6BC6, 0x14F7, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
+ 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
+ 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD8, 0x0D8F, 0x6BDB, 0x0EDF,
+ 0x6BDF, 0x14FA, 0x6BE1, 0x395D, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
+ 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD, 0x6C08, 0x1500,
+ 0x6C0F, 0x08AF, 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501,
+ 0x6C14, 0x1502, 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505,
+ 0x6C24, 0x1504, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
+ 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x3962, 0x6C3E, 0x0D59,
+ 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B, 0x6C42, 0x067B,
+ 0x6C4E, 0x0D5A, 0x6C50, 0x08DA, 0x6C55, 0x1507, 0x6C57, 0x05FC,
+ 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5C, 0x213F, 0x6C5D, 0x0CCA,
+ 0x6C5E, 0x1506, 0x6C5F, 0x07D0, 0x6C60, 0x0B91, 0x6C62, 0x1508,
+ 0x6C68, 0x1510, 0x6C6A, 0x1509, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
+ 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C76, 0x3964, 0x6C7A, 0x073E,
+ 0x6C7B, 0x3965, 0x6C7D, 0x063F, 0x6C7E, 0x150F, 0x6C81, 0x150D,
+ 0x6C82, 0x150A, 0x6C83, 0x0F4A, 0x6C85, 0x3966, 0x6C86, 0x2140,
+ 0x6C88, 0x0BDC, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
+ 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C95, 0x3967, 0x6C96, 0x052D,
+ 0x6C99, 0x082B, 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968,
+ 0x6CA1, 0x0E85, 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5,
+ 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F, 0x6CB8, 0x0DF8,
+ 0x6CB9, 0x0F09, 0x6CBA, 0x151E, 0x6CBB, 0x08CF, 0x6CBC, 0x09AA,
+ 0x6CBD, 0x1517, 0x6CBE, 0x151D, 0x6CBF, 0x050A, 0x6CC1, 0x06AF,
+ 0x6CC4, 0x1514, 0x6CC5, 0x1519, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
+ 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD3, 0x1516, 0x6CD4, 0x396A,
+ 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518, 0x6CD9, 0x1521,
+ 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDD, 0x151A, 0x6CE0, 0x396C,
+ 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE, 0x6CE3, 0x067D, 0x6CE5, 0x0C1F,
+ 0x6CE8, 0x0BAB, 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E,
+ 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
+ 0x6CF3, 0x04ED, 0x6D01, 0x3C35, 0x6D04, 0x2143, 0x6D0A, 0x3970,
+ 0x6D0B, 0x0F38, 0x6D0C, 0x152D, 0x6D0E, 0x3971, 0x6D11, 0x3972,
+ 0x6D12, 0x152C, 0x6D17, 0x0A9A, 0x6D19, 0x1529, 0x6D1B, 0x0F56,
+ 0x6D1E, 0x0C8E, 0x6D1F, 0x1523, 0x6D25, 0x0BE1, 0x6D29, 0x04EE,
+ 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973, 0x6D32, 0x0931,
+ 0x6D33, 0x152B, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
+ 0x6D3B, 0x05C6, 0x6D3D, 0x1527, 0x6D3E, 0x0CFF, 0x6D41, 0x0F76,
+ 0x6D44, 0x09DC, 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D59, 0x1533,
+ 0x6D5A, 0x1531, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975, 0x6D63, 0x152E,
+ 0x6D64, 0x1530, 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2,
+ 0x6D6A, 0x0FD8, 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145,
+ 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
+ 0x6D82, 0x3977, 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB,
+ 0x6D89, 0x342A, 0x6D8C, 0x0F1A, 0x6D8E, 0x1534, 0x6D93, 0x152F,
+ 0x6D95, 0x1535, 0x6D96, 0x2146, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
+ 0x6D9C, 0x0C9A, 0x6DAC, 0x2147, 0x6DAF, 0x0594, 0x6DB2, 0x04F7,
+ 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DBC, 0x0F8B, 0x6DBF, 0x3978,
+ 0x6DC0, 0x0F4E, 0x6DC4, 0x3979, 0x6DC5, 0x1545, 0x6DC6, 0x153F,
+ 0x6DC7, 0x153C, 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542,
+ 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
+ 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
+ 0x6DDA, 0x3453, 0x6DDE, 0x1541, 0x6DE1, 0x0B76, 0x6DE4, 0x1548,
+ 0x6DE6, 0x153D, 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A,
+ 0x6DEB, 0x04C0, 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF1, 0x0A02,
+ 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF7, 0x081E,
+ 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546, 0x6DFB, 0x0C34,
+ 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7, 0x6E08, 0x0841,
+ 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C, 0x6E13, 0x0722,
+ 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F, 0x6E1A, 0x0977,
+ 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1F, 0x1558, 0x6E20, 0x068E,
+ 0x6E21, 0x0C49, 0x6E22, 0x397D, 0x6E23, 0x1553, 0x6E24, 0x155C,
+ 0x6E25, 0x0473, 0x6E26, 0x04D4, 0x6E27, 0x214E, 0x6E29, 0x0539,
+ 0x6E2B, 0x1555, 0x6E2C, 0x0B0C, 0x6E2D, 0x154C, 0x6E2E, 0x154E,
+ 0x6E2F, 0x07D3, 0x6E34, 0x3412, 0x6E38, 0x155F, 0x6E39, 0x214C,
+ 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
+ 0x6E43, 0x1559, 0x6E4A, 0x0EB7, 0x6E4D, 0x1557, 0x6E4E, 0x155B,
+ 0x6E51, 0x397E, 0x6E56, 0x0784, 0x6E58, 0x09AD, 0x6E5B, 0x0B77,
+ 0x6E5C, 0x214D, 0x6E5F, 0x1551, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
+ 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E76, 0x1556,
+ 0x6E7E, 0x0FF7, 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560,
+ 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E96, 0x096A,
+ 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4, 0x6E9F, 0x156F,
+ 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EAA, 0x1561, 0x6EAB, 0x340C,
+ 0x6EAF, 0x1567, 0x6EB2, 0x1569, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
+ 0x6EBA, 0x0C28, 0x6EBD, 0x1566, 0x6EBF, 0x2150, 0x6EC2, 0x156E,
+ 0x6EC4, 0x1568, 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563,
+ 0x6ECA, 0x3980, 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981,
+ 0x6ED1, 0x05C8, 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B,
+ 0x6ED9, 0x3C38, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A, 0x6EE6, 0x3C24,
+ 0x6EEC, 0x1573, 0x6EEF, 0x1579, 0x6EF2, 0x1577, 0x6EF4, 0x0C23,
+ 0x6EF7, 0x157E, 0x6EF8, 0x1574, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
+ 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
+ 0x6F09, 0x0809, 0x6F0F, 0x0FD9, 0x6F11, 0x1571, 0x6F13, 0x157D,
+ 0x6F14, 0x050B, 0x6F15, 0x0AE8, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
+ 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD,
+ 0x6F2C, 0x0BEE, 0x6F2F, 0x3985, 0x6F31, 0x1578, 0x6F32, 0x157A,
+ 0x6F33, 0x3986, 0x6F38, 0x0AB4, 0x6F3E, 0x157C, 0x6F3F, 0x1576,
+ 0x6F41, 0x1570, 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F54, 0x073F,
+ 0x6F58, 0x158A, 0x6F5A, 0x3987, 0x6F5B, 0x1585, 0x6F5C, 0x0A9C,
+ 0x6F5E, 0x3988, 0x6F5F, 0x05C1, 0x6F62, 0x3989, 0x6F64, 0x096B,
+ 0x6F66, 0x158E, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8, 0x6F6F, 0x1584,
+ 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581, 0x6F7A, 0x1580,
+ 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F80, 0x1583, 0x6F81, 0x1582,
+ 0x6F82, 0x1588, 0x6F84, 0x0A45, 0x6F86, 0x157F, 0x6F88, 0x2151,
+ 0x6F8B, 0x398B, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F91, 0x158C,
+ 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F97, 0x05FE, 0x6F98, 0x363C,
+ 0x6F9A, 0x398F, 0x6FA1, 0x1591, 0x6FA3, 0x1590, 0x6FA4, 0x1592,
+ 0x6FA7, 0x3990, 0x6FA8, 0x3991, 0x6FAA, 0x1595, 0x6FB1, 0x0C3D,
+ 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB9, 0x1593,
+ 0x6FC0, 0x0739, 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1,
+ 0x6FC6, 0x1594, 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A,
+ 0x6FDA, 0x3993, 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596,
+ 0x6FE0, 0x07FC, 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FEB, 0x0F5E,
+ 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF1, 0x159B,
+ 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4, 0x6FF9, 0x3995,
+ 0x6FFA, 0x15A0, 0x6FFE, 0x15A4, 0x7001, 0x15A2, 0x7005, 0x2154,
+ 0x7006, 0x1E50, 0x7007, 0x2155, 0x7009, 0x159E, 0x700B, 0x159F,
+ 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0, 0x7018, 0x15A9,
+ 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8, 0x701E, 0x0CAC,
+ 0x701F, 0x15AA, 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156,
+ 0x702C, 0x0A49, 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996,
+ 0x703C, 0x3997, 0x703E, 0x15AC, 0x704A, 0x3998, 0x704C, 0x1572,
+ 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF, 0x705D, 0x399A,
+ 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C, 0x706B, 0x0550,
+ 0x706C, 0x399D, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7078, 0x067E,
+ 0x707C, 0x090A, 0x707D, 0x0842, 0x707E, 0x399E, 0x7081, 0x399F,
+ 0x7085, 0x2157, 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C,
+ 0x7092, 0x15B1, 0x7095, 0x39A0, 0x7099, 0x15B0, 0x70AB, 0x2158,
+ 0x70AC, 0x15B4, 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2,
+ 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5, 0x70B9, 0x0C3A,
+ 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD, 0x70CB, 0x15B9,
+ 0x70CF, 0x04CA, 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D8, 0x39A4,
+ 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA, 0x70DF, 0x15B8,
+ 0x70F1, 0x15B3, 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7104, 0x215A,
+ 0x7107, 0x39A6, 0x7109, 0x15BC, 0x710F, 0x2159, 0x7114, 0x050D,
+ 0x7119, 0x15BF, 0x711A, 0x0E02, 0x711C, 0x15BE, 0x7120, 0x39A7,
+ 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x7130, 0x1DDC, 0x7131, 0x39A8,
+ 0x7136, 0x0AB5, 0x713C, 0x09AE, 0x7146, 0x215C, 0x7147, 0x215D,
+ 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
+ 0x7152, 0x39AA, 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E,
+ 0x715C, 0x215B, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
+ 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7169, 0x0D65,
+ 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC, 0x717D, 0x0A9E,
+ 0x7184, 0x15CA, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
+ 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7199, 0x205D,
+ 0x719F, 0x0959, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71B1, 0x0CE4,
+ 0x71B3, 0x39AE, 0x71B9, 0x15CF, 0x71BE, 0x15D0, 0x71C1, 0x215F,
+ 0x71C3, 0x0CE9, 0x71C8, 0x0C6F, 0x71C9, 0x15D2, 0x71CB, 0x39AF,
+ 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1, 0x71D3, 0x39B0,
+ 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1, 0x71D7, 0x15CE,
+ 0x71DF, 0x114E, 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886,
+ 0x71E7, 0x15D7, 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE,
+ 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
+ 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
+ 0x720D, 0x15DC, 0x7210, 0x15DD, 0x721B, 0x15DE, 0x721D, 0x39B3,
+ 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
+ 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7235, 0x090B,
+ 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x723A, 0x0EF8, 0x723B, 0x15E4,
+ 0x723C, 0x15E5, 0x723D, 0x0AD8, 0x723E, 0x08D0, 0x723F, 0x15E6,
+ 0x7240, 0x15E7, 0x7241, 0x39B6, 0x7246, 0x15E8, 0x7247, 0x0E22,
+ 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x7252, 0x0BC9,
+ 0x7253, 0x39B7, 0x7255, 0x39B8, 0x7256, 0x39B9, 0x7258, 0x15EA,
+ 0x7259, 0x0567, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
+ 0x725F, 0x0EC2, 0x7261, 0x0534, 0x7262, 0x0FDA, 0x7267, 0x0E80,
+ 0x7269, 0x0DFA, 0x7272, 0x0A5B, 0x7274, 0x15EB, 0x7279, 0x0C9B,
+ 0x727D, 0x0757, 0x727E, 0x15EC, 0x7280, 0x0844, 0x7281, 0x15EE,
+ 0x7282, 0x15ED, 0x7287, 0x15EF, 0x728D, 0x39BB, 0x7292, 0x15F0,
+ 0x7296, 0x15F1, 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3,
+ 0x72AC, 0x0758, 0x72AD, 0x39BC, 0x72AF, 0x0D5C, 0x72B1, 0x2161,
+ 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD, 0x72B9, 0x15F4,
+ 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C2, 0x06B0, 0x72C3, 0x15F6,
+ 0x72C4, 0x15F8, 0x72C6, 0x15F7, 0x72C7, 0x39BE, 0x72CE, 0x15F9,
+ 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
+ 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
+ 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1, 0x72F7, 0x15FF,
+ 0x72F8, 0x0B6A, 0x72F9, 0x15FE, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
+ 0x72FD, 0x0D18, 0x7304, 0x39C0, 0x7305, 0x39C1, 0x730A, 0x1602,
+ 0x7316, 0x1604, 0x7317, 0x1601, 0x731B, 0x0EE0, 0x731C, 0x1603,
+ 0x731D, 0x1605, 0x731F, 0x0F8C, 0x7324, 0x2163, 0x7325, 0x1609,
+ 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4, 0x732B, 0x0CE3,
+ 0x732E, 0x0759, 0x732F, 0x1607, 0x7331, 0x39C3, 0x7334, 0x1606,
+ 0x7336, 0x0F1B, 0x7337, 0x0F1C, 0x733E, 0x160A, 0x733F, 0x0510,
+ 0x7343, 0x39C4, 0x7344, 0x0808, 0x7345, 0x08B0, 0x734E, 0x160B,
+ 0x734F, 0x160C, 0x7357, 0x160E, 0x7363, 0x094D, 0x7368, 0x1610,
+ 0x736A, 0x160F, 0x736C, 0x39C5, 0x7370, 0x1611, 0x7372, 0x05AB,
+ 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612, 0x737A, 0x1615,
+ 0x737B, 0x1614, 0x737C, 0x39C6, 0x7383, 0x39C7, 0x7384, 0x0770,
+ 0x7385, 0x39C8, 0x7386, 0x39C9, 0x7387, 0x0F70, 0x7389, 0x06C4,
+ 0x738B, 0x0526, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x739E, 0x39CB,
+ 0x739F, 0x39CC, 0x73A0, 0x39CD, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
+ 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
+ 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73BA, 0x35EA, 0x73BB, 0x1619,
+ 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73C0, 0x161A, 0x73C2, 0x0551,
+ 0x73C8, 0x1616, 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CD, 0x0BDD,
+ 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
+ 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E3, 0x2169,
+ 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E9, 0x39D5, 0x73EA, 0x0714,
+ 0x73ED, 0x0D5D, 0x73EE, 0x161C, 0x73F1, 0x1637, 0x73F4, 0x39D6,
+ 0x73F5, 0x216C, 0x73F8, 0x1622, 0x73FD, 0x39D7, 0x73FE, 0x0771,
+ 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F, 0x7406, 0x0F67,
+ 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9, 0x741A, 0x39DA,
+ 0x741B, 0x39DB, 0x7421, 0x3C3A, 0x7422, 0x0B56, 0x7424, 0x39DC,
+ 0x7425, 0x1621, 0x7426, 0x216D, 0x7428, 0x39DD, 0x7429, 0x216F,
+ 0x742A, 0x216E, 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF,
+ 0x7430, 0x39E0, 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E,
+ 0x7434, 0x06CF, 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2,
+ 0x743A, 0x1624, 0x743F, 0x1626, 0x7441, 0x1629, 0x7444, 0x39E3,
+ 0x7447, 0x39E4, 0x744B, 0x39E5, 0x744D, 0x39E6, 0x7451, 0x39E7,
+ 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
+ 0x745B, 0x04EF, 0x745C, 0x162A, 0x745E, 0x0A36, 0x745F, 0x1627,
+ 0x7460, 0x0FA4, 0x7462, 0x2171, 0x7463, 0x162D, 0x7464, 0x1D35,
+ 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E, 0x746B, 0x39EA,
+ 0x746F, 0x1620, 0x7470, 0x162C, 0x7471, 0x39EB, 0x7473, 0x082C,
+ 0x7476, 0x162F, 0x747E, 0x1630, 0x7480, 0x39EC, 0x7483, 0x0F68,
+ 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7489, 0x2172,
+ 0x748B, 0x1631, 0x7490, 0x39F0, 0x7498, 0x39F1, 0x749C, 0x39F2,
+ 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A2, 0x161E,
+ 0x74A3, 0x39F4, 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74AB, 0x39F6,
+ 0x74B0, 0x0600, 0x74B5, 0x39F7, 0x74BD, 0x08D1, 0x74BF, 0x39F8,
+ 0x74C8, 0x39F9, 0x74CA, 0x1634, 0x74CF, 0x1635, 0x74D4, 0x1636,
+ 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74E0, 0x1638,
+ 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E6, 0x05E0, 0x74E7, 0x163A,
+ 0x74E9, 0x163B, 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E,
+ 0x74F1, 0x163F, 0x74F2, 0x163D, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
+ 0x74F8, 0x1640, 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642,
+ 0x7505, 0x1644, 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646,
+ 0x7511, 0x080B, 0x7513, 0x1649, 0x7515, 0x1648, 0x7518, 0x0601,
+ 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A, 0x751F, 0x0A5C,
+ 0x7522, 0x35DE, 0x7523, 0x0888, 0x7525, 0x051B, 0x7526, 0x164B,
+ 0x7528, 0x0F3B, 0x752B, 0x0E33, 0x752C, 0x164C, 0x752F, 0x20F2,
+ 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5, 0x7533, 0x0A03,
+ 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA, 0x753B, 0x0568,
+ 0x753C, 0x164D, 0x7544, 0x164E, 0x7546, 0x1653, 0x7549, 0x1651,
+ 0x754A, 0x1650, 0x754B, 0x13C7, 0x754C, 0x0584, 0x754D, 0x164F,
+ 0x754E, 0x39FC, 0x754F, 0x049E, 0x7551, 0x0D3E, 0x7554, 0x0D5E,
+ 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
+ 0x755D, 0x0A4A, 0x7560, 0x0D3F, 0x7562, 0x0D9F, 0x7564, 0x1656,
+ 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657, 0x7569, 0x1655,
+ 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B, 0x756D, 0x1659,
+ 0x756F, 0x2175, 0x7570, 0x049F, 0x7573, 0x09DE, 0x7574, 0x165E,
+ 0x7575, 0x3751, 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A,
+ 0x7579, 0x39FD, 0x757F, 0x0640, 0x7581, 0x39FE, 0x7582, 0x1661,
+ 0x7586, 0x165C, 0x7587, 0x165D, 0x7589, 0x1660, 0x758A, 0x165F,
+ 0x758B, 0x0D97, 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF,
+ 0x7591, 0x0659, 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662,
+ 0x759A, 0x1663, 0x759D, 0x1664, 0x75A3, 0x1666, 0x75A5, 0x1665,
+ 0x75AB, 0x04F8, 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668,
+ 0x75B4, 0x3A02, 0x75B5, 0x166A, 0x75B8, 0x166C, 0x75B9, 0x0A04,
+ 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75C2, 0x1667,
+ 0x75C3, 0x1669, 0x75C5, 0x0DB4, 0x75C7, 0x09B1, 0x75CA, 0x1670,
+ 0x75CD, 0x166F, 0x75D2, 0x1671, 0x75D4, 0x08D2, 0x75D5, 0x081F,
+ 0x75D8, 0x0C71, 0x75D9, 0x1672, 0x75DB, 0x0BE7, 0x75DE, 0x1674,
+ 0x75E2, 0x0F69, 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E9, 0x0AEB,
+ 0x75EC, 0x3752, 0x75F0, 0x1679, 0x75F2, 0x167B, 0x75F3, 0x167C,
+ 0x75F4, 0x0B92, 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677,
+ 0x75FE, 0x1675, 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678,
+ 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760D, 0x167E,
+ 0x7615, 0x3A07, 0x7616, 0x3A08, 0x7619, 0x3A09, 0x761E, 0x3A0A,
+ 0x761F, 0x1680, 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684,
+ 0x7624, 0x1685, 0x7626, 0x1E2D, 0x7627, 0x1681, 0x762D, 0x3A0B,
+ 0x7630, 0x1687, 0x7634, 0x1686, 0x7635, 0x3A0C, 0x763B, 0x1688,
+ 0x7642, 0x0F8D, 0x7643, 0x3A0D, 0x7646, 0x168B, 0x7647, 0x1689,
+ 0x7648, 0x168A, 0x764B, 0x3A0E, 0x764C, 0x061E, 0x764E, 0x3753,
+ 0x7652, 0x0F0A, 0x7656, 0x0E1A, 0x7658, 0x168D, 0x765C, 0x168C,
+ 0x7661, 0x168E, 0x7662, 0x168F, 0x7665, 0x3A0F, 0x7667, 0x1693,
+ 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
+ 0x766D, 0x3A10, 0x766F, 0x3A11, 0x7670, 0x1695, 0x7671, 0x3A12,
+ 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697, 0x7678, 0x1698,
+ 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699, 0x767D, 0x0D28,
+ 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7682, 0x2176, 0x7683, 0x169B,
+ 0x7684, 0x0C24, 0x7686, 0x0585, 0x7687, 0x07D6, 0x7688, 0x169C,
+ 0x768B, 0x169D, 0x768E, 0x169E, 0x7690, 0x0877, 0x7693, 0x16A0,
+ 0x7696, 0x169F, 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179,
+ 0x769C, 0x2177, 0x769E, 0x2178, 0x76A4, 0x3A14, 0x76A5, 0x3A15,
+ 0x76A6, 0x217A, 0x76AE, 0x0D7D, 0x76B0, 0x16A3, 0x76B4, 0x16A4,
+ 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
+ 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C, 0x76C5, 0x3A16,
+ 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76CA, 0x04F9, 0x76CC, 0x3A17,
+ 0x76CD, 0x16A9, 0x76D2, 0x16AB, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
+ 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC, 0x76DF, 0x0ECD,
+ 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B, 0x76E5, 0x16AE,
+ 0x76E7, 0x16AF, 0x76EA, 0x16B0, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
+ 0x76F2, 0x0EE1, 0x76F4, 0x0BDA, 0x76F8, 0x0AEC, 0x76FB, 0x16B2,
+ 0x76FC, 0x3A19, 0x76FE, 0x096C, 0x7701, 0x09B2, 0x7704, 0x16B5,
+ 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770B, 0x0603,
+ 0x770C, 0x075D, 0x771B, 0x16BB, 0x771E, 0x16B8, 0x771F, 0x0A05,
+ 0x7720, 0x0EBE, 0x7724, 0x16B7, 0x7725, 0x16B9, 0x7726, 0x16BA,
+ 0x7729, 0x16B6, 0x7734, 0x3A1A, 0x7736, 0x3A1B, 0x7737, 0x16BC,
+ 0x7738, 0x16BD, 0x773A, 0x0BCB, 0x773C, 0x061F, 0x7740, 0x0BA3,
+ 0x7746, 0x217C, 0x7747, 0x16BE, 0x775A, 0x16BF, 0x775B, 0x16C2,
+ 0x775C, 0x3A1C, 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D,
+ 0x7762, 0x1EC5, 0x7763, 0x0C9C, 0x7765, 0x16C3, 0x7766, 0x0E81,
+ 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1, 0x7772, 0x3A1F,
+ 0x7779, 0x16C6, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
+ 0x778B, 0x16C8, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7795, 0x3A21,
+ 0x779E, 0x16CB, 0x77A0, 0x16CA, 0x77A5, 0x0E1D, 0x77A9, 0x3756,
+ 0x77AA, 0x3A22, 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77B0, 0x16CC,
+ 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B9, 0x16CE, 0x77BB, 0x16D2,
+ 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BF, 0x16CF, 0x77C7, 0x16D3,
+ 0x77CD, 0x16D4, 0x77D7, 0x16D5, 0x77DA, 0x16D6, 0x77DB, 0x0EC3,
+ 0x77DC, 0x16D7, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E5, 0x0B8C,
+ 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3, 0x77ED, 0x0B79,
+ 0x77EE, 0x16D9, 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F3, 0x0A74,
+ 0x77F4, 0x3A25, 0x77FC, 0x16DA, 0x7802, 0x082D, 0x7806, 0x3A26,
+ 0x780C, 0x16DB, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
+ 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27, 0x7825, 0x0C50,
+ 0x7826, 0x0846, 0x7827, 0x0668, 0x782D, 0x3A28, 0x782E, 0x3A29,
+ 0x7830, 0x3A2A, 0x7832, 0x0E52, 0x7834, 0x0D01, 0x7835, 0x3A2B,
+ 0x783A, 0x0C51, 0x783F, 0x07EE, 0x7845, 0x16E0, 0x784E, 0x217F,
+ 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785D, 0x09B3, 0x7864, 0x2180,
+ 0x7868, 0x3A2C, 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786F, 0x075B,
+ 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
+ 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12, 0x788C, 0x16E6,
+ 0x788D, 0x0595, 0x788E, 0x16E1, 0x7891, 0x0D7E, 0x7893, 0x04D2,
+ 0x7895, 0x085C, 0x7897, 0x0FF8, 0x789A, 0x16E5, 0x789E, 0x3A2D,
+ 0x78A3, 0x16E7, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
+ 0x78AF, 0x16EA, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BC, 0x16F0,
+ 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1, 0x78C6, 0x16EC,
+ 0x78C8, 0x3A2E, 0x78CA, 0x16F2, 0x78CB, 0x16ED, 0x78CC, 0x3A2F,
+ 0x78CE, 0x3A30, 0x78D0, 0x0D6C, 0x78D1, 0x16EB, 0x78D4, 0x16EE,
+ 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
+ 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3, 0x78EF, 0x04AF,
+ 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35, 0x78FB, 0x3A36,
+ 0x78FD, 0x16F6, 0x7901, 0x09B4, 0x7907, 0x16F8, 0x790E, 0x0AC5,
+ 0x7911, 0x16FA, 0x7912, 0x16F9, 0x7919, 0x16FB, 0x7926, 0x16DD,
+ 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC, 0x7930, 0x2182,
+ 0x7931, 0x3A37, 0x7934, 0x3A38, 0x793A, 0x08D4, 0x793B, 0x3A39,
+ 0x793C, 0x0FB1, 0x793D, 0x3A3A, 0x793E, 0x08FE, 0x7940, 0x16FE,
+ 0x7941, 0x070D, 0x7945, 0x3A3B, 0x7947, 0x065A, 0x7948, 0x0641,
+ 0x7949, 0x08B1, 0x7950, 0x0F1E, 0x7953, 0x1704, 0x7955, 0x1703,
+ 0x7956, 0x0AC6, 0x7957, 0x1700, 0x795A, 0x1702, 0x795B, 0x3A3C,
+ 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
+ 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7968, 0x0DAE,
+ 0x796D, 0x0847, 0x7977, 0x0C72, 0x797A, 0x1705, 0x797F, 0x1706,
+ 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3, 0x7985, 0x0AB7,
+ 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552, 0x798E, 0x0C13,
+ 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7996, 0x3A3F, 0x7998, 0x3A40,
+ 0x799B, 0x2188, 0x799D, 0x1708, 0x79A6, 0x0694, 0x79A7, 0x1709,
+ 0x79AA, 0x170B, 0x79AE, 0x170C, 0x79B0, 0x0CDF, 0x79B1, 0x1E4E,
+ 0x79B3, 0x170D, 0x79B8, 0x3A41, 0x79B9, 0x170E, 0x79BA, 0x170F,
+ 0x79BB, 0x3A42, 0x79BD, 0x06D1, 0x79BE, 0x0553, 0x79BF, 0x0C9D,
+ 0x79C0, 0x0932, 0x79C1, 0x08B2, 0x79C9, 0x1710, 0x79CA, 0x3A43,
+ 0x79CB, 0x0933, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D5, 0x1711,
+ 0x79D8, 0x0D7F, 0x79DA, 0x3A44, 0x79DF, 0x0AC7, 0x79E1, 0x1714,
+ 0x79E3, 0x1715, 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712,
+ 0x79E9, 0x0B9F, 0x79EC, 0x1713, 0x79F0, 0x09B6, 0x79FB, 0x04A0,
+ 0x7A00, 0x0643, 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716,
+ 0x7A09, 0x3A46, 0x7A0B, 0x0C14, 0x7A0D, 0x1717, 0x7A0E, 0x0A6B,
+ 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A17, 0x0D95, 0x7A18, 0x1718,
+ 0x7A19, 0x1719, 0x7A1A, 0x0B93, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48,
+ 0x7A1F, 0x171B, 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B,
+ 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A39, 0x3A4A,
+ 0x7A3B, 0x171E, 0x7A3C, 0x0554, 0x7A3D, 0x0724, 0x7A3E, 0x171F,
+ 0x7A3F, 0x07D8, 0x7A40, 0x0804, 0x7A42, 0x0E36, 0x7A43, 0x1721,
+ 0x7A45, 0x3A4B, 0x7A46, 0x0E82, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
+ 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
+ 0x7A57, 0x1722, 0x7A5D, 0x3A4D, 0x7A60, 0x3A4E, 0x7A61, 0x1724,
+ 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A69, 0x1726, 0x7A6B, 0x05AD,
+ 0x7A6D, 0x3A4F, 0x7A70, 0x1728, 0x7A74, 0x0740, 0x7A76, 0x0680,
+ 0x7A78, 0x3A50, 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A,
+ 0x7A7F, 0x0AA0, 0x7A81, 0x0CA5, 0x7A83, 0x0A84, 0x7A84, 0x0865,
+ 0x7A88, 0x172B, 0x7A92, 0x0BA0, 0x7A93, 0x0AED, 0x7A95, 0x172D,
+ 0x7A96, 0x172F, 0x7A97, 0x172C, 0x7A98, 0x172E, 0x7A9F, 0x06F8,
+ 0x7AA0, 0x3A51, 0x7AA3, 0x3A52, 0x7AA9, 0x1730, 0x7AAA, 0x06FC,
+ 0x7AAE, 0x0681, 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53,
+ 0x7AB6, 0x1733, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54, 0x7ABC, 0x3A55,
+ 0x7ABF, 0x1736, 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734,
+ 0x7AC6, 0x3A56, 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739,
+ 0x7ACB, 0x0F71, 0x7ACD, 0x173A, 0x7ACF, 0x173B, 0x7AD1, 0x2189,
+ 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C, 0x7AD9, 0x173E,
+ 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740, 0x7ADF, 0x1C08,
+ 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742, 0x7AE3, 0x0961,
+ 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A, 0x7AEA, 0x0B66,
+ 0x7AEB, 0x218C, 0x7AED, 0x1744, 0x7AEF, 0x0B7A, 0x7AF0, 0x1745,
+ 0x7AF6, 0x069D, 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF,
+ 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753, 0x7B06, 0x1749,
+ 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748, 0x7B0B, 0x1755,
+ 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B14, 0x3A58, 0x7B18, 0x174B,
+ 0x7B19, 0x174C, 0x7B1B, 0x0C25, 0x7B1E, 0x174D, 0x7B20, 0x05BC,
+ 0x7B25, 0x0A20, 0x7B26, 0x0DD6, 0x7B27, 0x3A59, 0x7B28, 0x174F,
+ 0x7B2C, 0x0B48, 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E,
+ 0x7B36, 0x1750, 0x7B39, 0x086B, 0x7B45, 0x1757, 0x7B46, 0x0DA0,
+ 0x7B47, 0x3A5B, 0x7B48, 0x0D3A, 0x7B49, 0x0C73, 0x7B4B, 0x06D2,
+ 0x7B4C, 0x1756, 0x7B4D, 0x1754, 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49,
+ 0x7B50, 0x1751, 0x7B51, 0x0B9C, 0x7B52, 0x0C75, 0x7B53, 0x375D,
+ 0x7B54, 0x0C74, 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D,
+ 0x7B65, 0x1759, 0x7B67, 0x175B, 0x7B69, 0x3A5E, 0x7B6C, 0x175E,
+ 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B70, 0x175C, 0x7B71, 0x175D,
+ 0x7B72, 0x3A60, 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B7A, 0x1752,
+ 0x7B86, 0x0E1F, 0x7B87, 0x0555, 0x7B8B, 0x1766, 0x7B8D, 0x1763,
+ 0x7B8F, 0x1768, 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29,
+ 0x7B95, 0x0EB3, 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A,
+ 0x7B9A, 0x1765, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
+ 0x7B9F, 0x1762, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B, 0x7BAD, 0x0AA1,
+ 0x7BAF, 0x3A62, 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB8, 0x0D38,
+ 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63, 0x7BC6, 0x1770,
+ 0x7BC7, 0x0E23, 0x7BC9, 0x0B99, 0x7BCB, 0x176B, 0x7BCC, 0x176D,
+ 0x7BCF, 0x176E, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64, 0x7BDD, 0x1771,
+ 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E, 0x7BE5, 0x1776, 0x7BE6, 0x1775,
+ 0x7BE9, 0x1772, 0x7BED, 0x0FDC, 0x7BF3, 0x177B, 0x7BF6, 0x177F,
+ 0x7BF7, 0x177C, 0x7C00, 0x1778, 0x7C07, 0x1779, 0x7C0B, 0x3A65,
+ 0x7C0D, 0x177E, 0x7C0F, 0x3A66, 0x7C11, 0x1773, 0x7C12, 0x10EA,
+ 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D, 0x7C1E, 0x1E3B,
+ 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606, 0x7C23, 0x1780,
+ 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C2A, 0x1782, 0x7C2B, 0x1785,
+ 0x7C31, 0x3A69, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
+ 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
+ 0x7C43, 0x1788, 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A,
+ 0x7C50, 0x178C, 0x7C51, 0x3A6B, 0x7C54, 0x1789, 0x7C56, 0x1790,
+ 0x7C58, 0x178D, 0x7C59, 0x3A6C, 0x7C5F, 0x178E, 0x7C60, 0x1777,
+ 0x7C64, 0x178F, 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C6C, 0x1792,
+ 0x7C6E, 0x3A6E, 0x7C70, 0x3A6F, 0x7C73, 0x0E16, 0x7C75, 0x1793,
+ 0x7C7B, 0x370E, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6, 0x7C82, 0x06FF,
+ 0x7C83, 0x1794, 0x7C89, 0x0E04, 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC,
+ 0x7C90, 0x1795, 0x7C92, 0x0F7B, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
+ 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9F, 0x0484, 0x7CA1, 0x179A,
+ 0x7CA2, 0x1798, 0x7CA4, 0x1796, 0x7CA5, 0x05DD, 0x7CA7, 0x09B9,
+ 0x7CA8, 0x179B, 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F,
+ 0x7CB1, 0x179E, 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB9, 0x17A0,
+ 0x7CBC, 0x3A70, 0x7CBD, 0x17A1, 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71,
+ 0x7CC0, 0x17A2, 0x7CC2, 0x17A4, 0x7CC5, 0x17A3, 0x7CC8, 0x3A72,
+ 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCE, 0x0ABA, 0x7CD2, 0x17A6,
+ 0x7CD6, 0x0C76, 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75,
+ 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
+ 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE7, 0x0F90, 0x7CEB, 0x3A77,
+ 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC, 0x7CF6, 0x17AD,
+ 0x7CF8, 0x08B3, 0x7CFA, 0x17AE, 0x7CFB, 0x0725, 0x7CFE, 0x0684,
+ 0x7D00, 0x0644, 0x7D02, 0x17B0, 0x7D04, 0x0EFF, 0x7D05, 0x07DA,
+ 0x7D06, 0x17AF, 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A,
+ 0x7D0A, 0x17B3, 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5,
+ 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
+ 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
+ 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D20, 0x0AC9, 0x7D21, 0x0E70,
+ 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5, 0x7D2C, 0x0BF9,
+ 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849, 0x7D32, 0x17B7,
+ 0x7D33, 0x0A08, 0x7D35, 0x17B9, 0x7D39, 0x09BA, 0x7D3A, 0x0820,
+ 0x7D3F, 0x17B8, 0x7D41, 0x3A7E, 0x7D42, 0x0934, 0x7D43, 0x0772,
+ 0x7D44, 0x0ACA, 0x7D45, 0x17B4, 0x7D46, 0x17BA, 0x7D48, 0x218F,
+ 0x7D4B, 0x17B5, 0x7D4C, 0x0726, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
+ 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D56, 0x17BC, 0x7D59, 0x3A80,
+ 0x7D5B, 0x17C5, 0x7D5C, 0x2190, 0x7D5D, 0x3A81, 0x7D5E, 0x07DC,
+ 0x7D61, 0x0F57, 0x7D62, 0x0480, 0x7D63, 0x17C2, 0x7D66, 0x0685,
+ 0x7D68, 0x17BF, 0x7D6E, 0x17C0, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
+ 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
+ 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D86, 0x3A83, 0x7D89, 0x17C4,
+ 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8F, 0x17C6, 0x7D93, 0x17C3,
+ 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
+ 0x7D9F, 0x17D5, 0x7DA0, 0x2192, 0x7DA2, 0x17D1, 0x7DA3, 0x17CB,
+ 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1, 0x7DAE, 0x17CA,
+ 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD, 0x7DB2, 0x0EE2,
+ 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC, 0x7DB7, 0x2191, 0x7DB8, 0x17D4,
+ 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
+ 0x7DBF, 0x0ED6, 0x7DC7, 0x17CD, 0x7DCA, 0x06D3, 0x7DCB, 0x0D80,
+ 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF, 0x7DD1, 0x0F98, 0x7DD2, 0x0979,
+ 0x7DD5, 0x17FD, 0x7DD6, 0x2193, 0x7DD8, 0x17D7, 0x7DDA, 0x0AA2,
+ 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA, 0x7DE0, 0x0C15,
+ 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9, 0x7DE8, 0x0E24,
+ 0x7DE9, 0x0607, 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2,
+ 0x7DF1, 0x3A88, 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF9, 0x3A89,
+ 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4, 0x7E05, 0x17DE,
+ 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF, 0x7E0B, 0x17E6,
+ 0x7E11, 0x3A8B, 0x7E12, 0x17E2, 0x7E15, 0x3A8C, 0x7E1B, 0x0D31,
+ 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
+ 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E2B, 0x0E53,
+ 0x7E2E, 0x0956, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
+ 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0, 0x7E3B, 0x17EA,
+ 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F, 0x7E43, 0x17ED,
+ 0x7E46, 0x17E8, 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3,
+ 0x7E4B, 0x0728, 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB,
+ 0x7E55, 0x0AB8, 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6,
+ 0x7E5D, 0x17F2, 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F,
+ 0x7E66, 0x17E9, 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8,
+ 0x7E6B, 0x1DF7, 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E70, 0x0701,
+ 0x7E73, 0x3A91, 0x7E79, 0x17F7, 0x7E7B, 0x17FB, 0x7E7C, 0x17FA,
+ 0x7E7D, 0x17FE, 0x7E7F, 0x1800, 0x7E82, 0x088A, 0x7E83, 0x17FC,
+ 0x7E88, 0x1801, 0x7E89, 0x1802, 0x7E8A, 0x20A7, 0x7E8C, 0x1803,
+ 0x7E8D, 0x3A92, 0x7E8E, 0x1809, 0x7E8F, 0x0C35, 0x7E90, 0x1805,
+ 0x7E91, 0x3A93, 0x7E92, 0x1804, 0x7E93, 0x1806, 0x7E94, 0x1807,
+ 0x7E96, 0x1808, 0x7E98, 0x3A94, 0x7E9B, 0x180A, 0x7E9C, 0x180B,
+ 0x7F36, 0x0608, 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F44, 0x3A95,
+ 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
+ 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
+ 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
+ 0x7F58, 0x1816, 0x7F5F, 0x1817, 0x7F60, 0x1818, 0x7F61, 0x3A99,
+ 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A, 0x7F6A, 0x0851,
+ 0x7F6B, 0x0729, 0x7F6E, 0x0B94, 0x7F70, 0x0D47, 0x7F72, 0x097A,
+ 0x7F75, 0x0D03, 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336,
+ 0x7F82, 0x181D, 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E,
+ 0x7F87, 0x1821, 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8C, 0x1822,
+ 0x7F8E, 0x0D92, 0x7F91, 0x3A9A, 0x7F94, 0x1823, 0x7F9A, 0x1826,
+ 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA3, 0x1827,
+ 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B, 0x7FAE, 0x182B,
+ 0x7FAF, 0x1828, 0x7FB2, 0x1829, 0x7FB6, 0x182C, 0x7FB8, 0x182D,
+ 0x7FB9, 0x182A, 0x7FBD, 0x04CB, 0x7FBF, 0x3A9B, 0x7FC1, 0x0527,
+ 0x7FC5, 0x182F, 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C,
+ 0x7FCE, 0x3A9C, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
+ 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834, 0x7FE5, 0x3A9E,
+ 0x7FE6, 0x1835, 0x7FE9, 0x1836, 0x7FEB, 0x0621, 0x7FEC, 0x3A9F,
+ 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1, 0x7FF0, 0x0609, 0x7FF3, 0x1837,
+ 0x7FF9, 0x1838, 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D,
+ 0x8000, 0x0F3E, 0x8001, 0x0FDD, 0x8002, 0x3713, 0x8003, 0x07DF,
+ 0x8004, 0x183B, 0x8005, 0x0900, 0x8006, 0x183A, 0x800B, 0x183C,
+ 0x800C, 0x08D5, 0x800E, 0x3AA3, 0x8010, 0x0B31, 0x8011, 0x3AA4,
+ 0x8012, 0x183D, 0x8014, 0x3AA5, 0x8015, 0x07DE, 0x8017, 0x0EE3,
+ 0x8018, 0x183E, 0x8019, 0x183F, 0x801C, 0x1840, 0x8021, 0x1841,
+ 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x8033, 0x08D6,
+ 0x8036, 0x0EF9, 0x803A, 0x3AA8, 0x803B, 0x1844, 0x803C, 0x3AA9,
+ 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8046, 0x1846, 0x804A, 0x1845,
+ 0x8052, 0x1847, 0x8056, 0x0A5F, 0x8058, 0x1848, 0x805A, 0x1849,
+ 0x805E, 0x0E09, 0x805F, 0x184A, 0x8060, 0x3AAA, 0x8061, 0x0AF1,
+ 0x8062, 0x184B, 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F,
+ 0x8071, 0x3AAB, 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC,
+ 0x8075, 0x3AAC, 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851,
+ 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
+ 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8089, 0x0CD1,
+ 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x8093, 0x1858, 0x8096, 0x09BB,
+ 0x8098, 0x0D9C, 0x809A, 0x1859, 0x809B, 0x1857, 0x809D, 0x060A,
+ 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A5, 0x0D82,
+ 0x80A6, 0x3AAE, 0x80A9, 0x075E, 0x80AA, 0x0E71, 0x80AB, 0x3AAF,
+ 0x80AC, 0x185C, 0x80AD, 0x185A, 0x80AF, 0x07E0, 0x80B1, 0x07E1,
+ 0x80B2, 0x04AD, 0x80B4, 0x0858, 0x80BA, 0x0D0F, 0x80C3, 0x04A3,
+ 0x80C4, 0x1861, 0x80C6, 0x0B7E, 0x80CC, 0x0D0E, 0x80CE, 0x0B3B,
+ 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
+ 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
+ 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E, 0x80EF, 0x1865,
+ 0x80F1, 0x1866, 0x80F4, 0x0C91, 0x80F8, 0x06B3, 0x80FC, 0x1871,
+ 0x80FD, 0x0CF3, 0x8102, 0x08B7, 0x8105, 0x06B4, 0x8106, 0x0A6C,
+ 0x8107, 0x0FEC, 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78,
+ 0x8116, 0x3AB2, 0x8118, 0x3AB3, 0x811A, 0x066D, 0x811B, 0x1867,
+ 0x8123, 0x1869, 0x8129, 0x1868, 0x812B, 0x3659, 0x812F, 0x186A,
+ 0x8131, 0x0B64, 0x8133, 0x0CF4, 0x8139, 0x0BCD, 0x813A, 0x3AB4,
+ 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
+ 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
+ 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
+ 0x815F, 0x1880, 0x8165, 0x1874, 0x8166, 0x1875, 0x816B, 0x091C,
+ 0x816E, 0x1873, 0x8170, 0x080A, 0x8171, 0x1872, 0x8174, 0x1876,
+ 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
+ 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
+ 0x8184, 0x3AB8, 0x8188, 0x1878, 0x818A, 0x1879, 0x818F, 0x07E3,
+ 0x8193, 0x1881, 0x8195, 0x187D, 0x819A, 0x0DD8, 0x819C, 0x0E9A,
+ 0x819D, 0x0D9A, 0x81A0, 0x187C, 0x81A3, 0x187F, 0x81A4, 0x187E,
+ 0x81A8, 0x0E72, 0x81A9, 0x1882, 0x81B0, 0x1883, 0x81B3, 0x0AB9,
+ 0x81B4, 0x3AB9, 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A,
+ 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
+ 0x81C2, 0x1889, 0x81C6, 0x0532, 0x81C8, 0x1890, 0x81C9, 0x188B,
+ 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
+ 0x81D8, 0x188F, 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DF, 0x1892,
+ 0x81E0, 0x1893, 0x81E3, 0x0A09, 0x81E5, 0x0569, 0x81E7, 0x1894,
+ 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81ED, 0x0937, 0x81F3, 0x08B8,
+ 0x81F4, 0x0B95, 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896,
+ 0x81FC, 0x04D3, 0x81FE, 0x1897, 0x8201, 0x1898, 0x8202, 0x1899,
+ 0x8203, 0x3ABC, 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5,
+ 0x8209, 0x13AF, 0x820A, 0x189C, 0x820C, 0x0A89, 0x820D, 0x189D,
+ 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8216, 0x189F,
+ 0x8217, 0x0E2E, 0x8218, 0x0618, 0x821B, 0x0AA6, 0x821C, 0x0962,
+ 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8229, 0x18A0,
+ 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60, 0x822E, 0x18AF,
+ 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF, 0x8235, 0x0B29,
+ 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2, 0x8239, 0x0AA7,
+ 0x8240, 0x18A4, 0x8246, 0x3AC0, 0x8247, 0x0C16, 0x824B, 0x3AC1,
+ 0x824F, 0x3AC2, 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8,
+ 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8262, 0x18AB, 0x8264, 0x18AA,
+ 0x8266, 0x060B, 0x8268, 0x18AC, 0x826A, 0x18AD, 0x826B, 0x18AE,
+ 0x826E, 0x0821, 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED,
+ 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
+ 0x827E, 0x18B3, 0x828B, 0x04B6, 0x828D, 0x18B4, 0x828E, 0x3AC3,
+ 0x8292, 0x18B5, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
+ 0x82A5, 0x0587, 0x82A6, 0x0476, 0x82AB, 0x18B6, 0x82AC, 0x18B9,
+ 0x82AD, 0x0D04, 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B1, 0x0556,
+ 0x82B3, 0x0E55, 0x82B7, 0x3AC5, 0x82B8, 0x0733, 0x82B9, 0x06D4,
+ 0x82BB, 0x18B8, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82C5, 0x05DF,
+ 0x82C6, 0x3AC7, 0x82D1, 0x0513, 0x82D2, 0x18BD, 0x82D3, 0x0FB2,
+ 0x82D4, 0x0B3D, 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557,
+ 0x82DC, 0x18C7, 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA,
+ 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
+ 0x82EB, 0x0CA9, 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE,
+ 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3, 0x82FE, 0x3AC8,
+ 0x8301, 0x2198, 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558,
+ 0x8305, 0x05DB, 0x8306, 0x18C6, 0x8309, 0x18C8, 0x830E, 0x072A,
+ 0x8316, 0x18CC, 0x8317, 0x18D5, 0x8318, 0x18D6, 0x831C, 0x046F,
+ 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4, 0x832F, 0x18D3,
+ 0x8331, 0x18CE, 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA,
+ 0x8336, 0x0BA1, 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x8340, 0x18CF,
+ 0x8343, 0x3AC9, 0x8345, 0x18D2, 0x8349, 0x0AF2, 0x834A, 0x072B,
+ 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
+ 0x8355, 0x3ACB, 0x8358, 0x0AF3, 0x8362, 0x2199, 0x8373, 0x18E3,
+ 0x8375, 0x18E4, 0x8377, 0x0559, 0x837B, 0x052E, 0x837C, 0x18E1,
+ 0x837F, 0x219A, 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF,
+ 0x8389, 0x18E6, 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE,
+ 0x8392, 0x3ACE, 0x8393, 0x18C1, 0x8396, 0x18DC, 0x8398, 0x3ACF,
+ 0x839A, 0x18D8, 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5,
+ 0x83A2, 0x18DB, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
+ 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
+ 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
+ 0x83C7, 0x219B, 0x83CA, 0x0660, 0x83CC, 0x06D5, 0x83CE, 0x18EB,
+ 0x83D3, 0x055B, 0x83D6, 0x09BC, 0x83D8, 0x18EE, 0x83DC, 0x084A,
+ 0x83DF, 0x0C4B, 0x83E0, 0x18F3, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
+ 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
+ 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
+ 0x83FB, 0x18FB, 0x83FD, 0x18EC, 0x8403, 0x18ED, 0x8404, 0x0C92,
+ 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF, 0x840C, 0x0E56,
+ 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4, 0x8411, 0x3AD5,
+ 0x8413, 0x18E9, 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21,
+ 0x842A, 0x18FD, 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B,
+ 0x8438, 0x18F9, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
+ 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
+ 0x8457, 0x0BB6, 0x845B, 0x05C9, 0x8461, 0x0DE4, 0x8462, 0x190D,
+ 0x8463, 0x0C79, 0x8466, 0x0475, 0x8469, 0x1906, 0x846B, 0x1902,
+ 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904, 0x846F, 0x1909,
+ 0x8471, 0x0CE2, 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901,
+ 0x8479, 0x190A, 0x847A, 0x0DEA, 0x8482, 0x1905, 0x8484, 0x1900,
+ 0x848B, 0x09BD, 0x8490, 0x0939, 0x8494, 0x08D8, 0x8499, 0x0EE4,
+ 0x849C, 0x0DB9, 0x849F, 0x1910, 0x84A1, 0x1919, 0x84A8, 0x3AD8,
+ 0x84AD, 0x1903, 0x84AF, 0x3AD9, 0x84B2, 0x05D5, 0x84B4, 0x219E,
+ 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BB, 0x1913, 0x84BC, 0x0AF5,
+ 0x84BF, 0x190F, 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB,
+ 0x84C4, 0x0B9D, 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C,
+ 0x84CB, 0x0596, 0x84CD, 0x1912, 0x84D0, 0x1915, 0x84D1, 0x0EB8,
+ 0x84D6, 0x1918, 0x84D9, 0x1911, 0x84DA, 0x1914, 0x84DC, 0x20AB,
+ 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84F0, 0x3ADC, 0x84F4, 0x191C,
+ 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
+ 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
+ 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
+ 0x851A, 0x04D8, 0x851F, 0x1920, 0x8521, 0x191A, 0x8523, 0x1E1A,
+ 0x8526, 0x0BF1, 0x852C, 0x191F, 0x852D, 0x04C2, 0x8534, 0x3ADF,
+ 0x8535, 0x0B02, 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924,
+ 0x8541, 0x1928, 0x8543, 0x0D6D, 0x8548, 0x1927, 0x8549, 0x09BE,
+ 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x8553, 0x219F,
+ 0x8555, 0x192B, 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0,
+ 0x855A, 0x18FF, 0x855E, 0x3AE0, 0x8563, 0x1925, 0x8568, 0x0FF5,
+ 0x8569, 0x0C7A, 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932,
+ 0x8577, 0x1938, 0x857E, 0x1939, 0x8580, 0x192C, 0x8584, 0x0D2C,
+ 0x8587, 0x1936, 0x8588, 0x192E, 0x858A, 0x1930, 0x858F, 0x3AE1,
+ 0x8590, 0x193A, 0x8591, 0x192F, 0x8594, 0x1933, 0x8597, 0x0514,
+ 0x8599, 0x0CBD, 0x859B, 0x1934, 0x859C, 0x1937, 0x85A4, 0x192D,
+ 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875, 0x85AA, 0x0A0B,
+ 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4, 0x85AE, 0x0F05,
+ 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2, 0x85B9, 0x193E,
+ 0x85BA, 0x193C, 0x85C1, 0x0FF4, 0x85C9, 0x193B, 0x85CD, 0x0F5F,
+ 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F, 0x85D5, 0x1940,
+ 0x85DC, 0x1943, 0x85DD, 0x1941, 0x85E4, 0x0C7B, 0x85E5, 0x1942,
+ 0x85E9, 0x0D61, 0x85EA, 0x1935, 0x85F4, 0x3780, 0x85F7, 0x097D,
+ 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
+ 0x8602, 0x1929, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
+ 0x860B, 0x1947, 0x8612, 0x3AE5, 0x8613, 0x1946, 0x8616, 0x14D0,
+ 0x8617, 0x14C1, 0x861A, 0x194C, 0x8622, 0x194B, 0x8629, 0x3AE6,
+ 0x862D, 0x0F60, 0x862F, 0x16B1, 0x8630, 0x194D, 0x863F, 0x194E,
+ 0x864D, 0x194F, 0x864E, 0x078B, 0x8650, 0x066E, 0x8652, 0x3AE7,
+ 0x8654, 0x1951, 0x8655, 0x1094, 0x865A, 0x068F, 0x865B, 0x3418,
+ 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952, 0x8663, 0x3AE8,
+ 0x8667, 0x1953, 0x866B, 0x0BAC, 0x866C, 0x3AE9, 0x866F, 0x3AEA,
+ 0x8671, 0x1954, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
+ 0x867D, 0x3786, 0x868A, 0x0563, 0x868B, 0x1959, 0x868C, 0x195A,
+ 0x868D, 0x3AEC, 0x8691, 0x3AED, 0x8693, 0x1955, 0x8695, 0x088B,
+ 0x8698, 0x3AEE, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
+ 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
+ 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B6, 0x195B, 0x86C4, 0x195D,
+ 0x86C6, 0x195E, 0x86C7, 0x0904, 0x86C9, 0x1960, 0x86CB, 0x0B7F,
+ 0x86CD, 0x072C, 0x86CE, 0x05A0, 0x86D4, 0x1963, 0x86D9, 0x059D,
+ 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967, 0x86E4, 0x0D4E,
+ 0x86E9, 0x1965, 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E,
+ 0x86EF, 0x1969, 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1,
+ 0x86FB, 0x196F, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
+ 0x8702, 0x0E58, 0x8703, 0x196E, 0x8706, 0x196B, 0x8708, 0x196C,
+ 0x8709, 0x1971, 0x870A, 0x1974, 0x870B, 0x3AF3, 0x870D, 0x1972,
+ 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8718, 0x0B96,
+ 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6, 0x871E, 0x3AF6,
+ 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A, 0x8734, 0x1975,
+ 0x8737, 0x1977, 0x873B, 0x1978, 0x873E, 0x3AF8, 0x873F, 0x1976,
+ 0x8749, 0x0A8A, 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980,
+ 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8759, 0x1985,
+ 0x875F, 0x197D, 0x8760, 0x197C, 0x8763, 0x1987, 0x8766, 0x055C,
+ 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
+ 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E, 0x877F, 0x0D1E,
+ 0x8782, 0x198C, 0x8788, 0x3AFA, 0x878D, 0x0F25, 0x8799, 0x3AFB,
+ 0x879F, 0x198B, 0x87A2, 0x198A, 0x87AB, 0x1993, 0x87AC, 0x3AFC,
+ 0x87AD, 0x3AFD, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
+ 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87C0, 0x1990,
+ 0x87C4, 0x1994, 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87CB, 0x198E,
+ 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF, 0x87E0, 0x199B,
+ 0x87EB, 0x3B00, 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999,
+ 0x87F2, 0x199A, 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0,
+ 0x87F9, 0x0588, 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02,
+ 0x8803, 0x3B03, 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6,
+ 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
+ 0x8811, 0x19A3, 0x8814, 0x3B06, 0x8815, 0x19A5, 0x8816, 0x19A4,
+ 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
+ 0x8823, 0x1961, 0x8827, 0x19AB, 0x8831, 0x19A8, 0x8836, 0x19A9,
+ 0x8839, 0x19AA, 0x883B, 0x19AC, 0x8840, 0x0742, 0x8842, 0x19AE,
+ 0x8844, 0x19AD, 0x8846, 0x093A, 0x884C, 0x07E6, 0x884D, 0x1524,
+ 0x8852, 0x19AF, 0x8853, 0x095B, 0x8856, 0x3B08, 0x8857, 0x0597,
+ 0x8859, 0x19B0, 0x885B, 0x04F4, 0x885D, 0x09BF, 0x885E, 0x19B1,
+ 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2, 0x8863, 0x04A5,
+ 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x886B, 0x19B3, 0x8870, 0x0A30,
+ 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
+ 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
+ 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
+ 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
+ 0x889E, 0x19B6, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
+ 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
+ 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BD, 0x3B0D,
+ 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C1, 0x084B, 0x88C2, 0x0FBE,
+ 0x88C3, 0x19C6, 0x88C4, 0x19C7, 0x88C5, 0x0AF7, 0x88C6, 0x3789,
+ 0x88CA, 0x3B0F, 0x88CF, 0x0F6A, 0x88D2, 0x3B10, 0x88D4, 0x19C8,
+ 0x88D5, 0x0F1F, 0x88D8, 0x19C9, 0x88D9, 0x19CA, 0x88DB, 0x3B11,
+ 0x88DC, 0x0E34, 0x88DD, 0x19CB, 0x88DF, 0x0830, 0x88E1, 0x0F6B,
+ 0x88E8, 0x19D0, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
+ 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
+ 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
+ 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14, 0x8907, 0x0DF3,
+ 0x890A, 0x19D4, 0x890C, 0x19D3, 0x8910, 0x05CA, 0x8912, 0x0E59,
+ 0x8913, 0x19D5, 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17,
+ 0x891C, 0x20A8, 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8,
+ 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
+ 0x8936, 0x19DE, 0x8938, 0x19DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
+ 0x8941, 0x19DB, 0x8943, 0x19D6, 0x8944, 0x19DC, 0x894C, 0x19E0,
+ 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895E, 0x19E3, 0x895F, 0x06D7,
+ 0x8960, 0x19E2, 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7,
+ 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8972, 0x093B, 0x8974, 0x19E9,
+ 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897E, 0x19EB, 0x897F, 0x0A62,
+ 0x8980, 0x362E, 0x8981, 0x0F41, 0x8983, 0x19EC, 0x8986, 0x0DF4,
+ 0x8987, 0x0CFC, 0x8988, 0x19ED, 0x898A, 0x19EE, 0x898B, 0x075F,
+ 0x898F, 0x0646, 0x8993, 0x19EF, 0x8996, 0x08B9, 0x8997, 0x0CF7,
+ 0x8998, 0x19F0, 0x899A, 0x05AE, 0x89A1, 0x19F1, 0x89A6, 0x19F3,
+ 0x89A7, 0x0F61, 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4,
+ 0x89AF, 0x19F5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89BA, 0x19F7,
+ 0x89BD, 0x19F8, 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF,
+ 0x89D4, 0x3B1C, 0x89D6, 0x3B1D, 0x89DA, 0x19FB, 0x89DC, 0x19FC,
+ 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E, 0x89E6, 0x09EE,
+ 0x89E7, 0x19FE, 0x89F1, 0x3B1F, 0x89F4, 0x19FF, 0x89F8, 0x1A00,
+ 0x8A00, 0x0774, 0x8A01, 0x35BC, 0x8A02, 0x0C17, 0x8A03, 0x1A01,
+ 0x8A07, 0x3B20, 0x8A08, 0x072D, 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04,
+ 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21, 0x8A10, 0x1A03, 0x8A12, 0x21A8,
+ 0x8A13, 0x0707, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
+ 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
+ 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07, 0x8A2A, 0x0E5A,
+ 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01, 0x8A34, 0x0ACC,
+ 0x8A36, 0x1A08, 0x8A37, 0x21A9, 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE,
+ 0x8A3C, 0x09C2, 0x8A41, 0x1A09, 0x8A46, 0x1A0C, 0x8A48, 0x1A0D,
+ 0x8A4E, 0x3B24, 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B,
+ 0x8A54, 0x09C3, 0x8A55, 0x0DB0, 0x8A5B, 0x1A0A, 0x8A5E, 0x08BA,
+ 0x8A60, 0x04F5, 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC,
+ 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
+ 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
+ 0x8A73, 0x09C4, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E, 0x8A7F, 0x3B25,
+ 0x8A82, 0x1A13, 0x8A84, 0x1A14, 0x8A85, 0x1A12, 0x8A87, 0x078C,
+ 0x8A89, 0x0F2A, 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A91, 0x1A17,
+ 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A98, 0x0F20, 0x8A9A, 0x1A1A,
+ 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16, 0x8AA3, 0x1A1B,
+ 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19, 0x8AA7, 0x21AB,
+ 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86, 0x8AAD, 0x0CA1,
+ 0x8AB0, 0x0B6D, 0x8AB2, 0x055D, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
+ 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
+ 0x8AC7, 0x0B8A, 0x8ACB, 0x0A65, 0x8ACC, 0x060E, 0x8ACD, 0x1A1D,
+ 0x8ACF, 0x0A21, 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8ADA, 0x1A1F,
+ 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADE, 0x1A29, 0x8ADF, 0x21AD,
+ 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27, 0x8AE4, 0x1A23,
+ 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20, 0x8AED, 0x0F0B,
+ 0x8AEE, 0x08BE, 0x8AF1, 0x1A24, 0x8AF3, 0x1A21, 0x8AF4, 0x3B26,
+ 0x8AF6, 0x21AF, 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775,
+ 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
+ 0x8B04, 0x0C7D, 0x8B07, 0x1A2C, 0x8B0C, 0x1A2B, 0x8B0E, 0x0CBE,
+ 0x8B10, 0x1A30, 0x8B14, 0x1A25, 0x8B16, 0x1A2F, 0x8B17, 0x1A31,
+ 0x8B19, 0x0760, 0x8B1A, 0x1A2D, 0x8B1B, 0x07E8, 0x8B1D, 0x0901,
+ 0x8B1F, 0x3B27, 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35,
+ 0x8B28, 0x1A38, 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B33, 0x1A33,
+ 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
+ 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A,
+ 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
+ 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B5A, 0x1A40, 0x8B5B, 0x1A3F,
+ 0x8B5C, 0x0DDA, 0x8B5F, 0x1A42, 0x8B66, 0x072F, 0x8B6B, 0x1A41,
+ 0x8B6C, 0x1A43, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
+ 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B77, 0x07A2, 0x8B7D, 0x1A46,
+ 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B83, 0x088C, 0x8B8A, 0x13D3,
+ 0x8B8C, 0x1A48, 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A,
+ 0x8B93, 0x1A4B, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D, 0x8B9A, 0x1A4E,
+ 0x8B9C, 0x3B2C, 0x8B9E, 0x3B2D, 0x8C37, 0x0B69, 0x8C3A, 0x1A4F,
+ 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C46, 0x0C7E, 0x8C47, 0x3B2E,
+ 0x8C48, 0x1A52, 0x8C4A, 0x0E5B, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
+ 0x8C50, 0x1A55, 0x8C54, 0x3B2F, 0x8C55, 0x1A56, 0x8C5A, 0x0CB2,
+ 0x8C61, 0x09C5, 0x8C62, 0x1A57, 0x8C6A, 0x07FD, 0x8C6B, 0x1007,
+ 0x8C6C, 0x1A58, 0x8C73, 0x3B30, 0x8C78, 0x1A59, 0x8C79, 0x0DB1,
+ 0x8C7A, 0x1A5A, 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D,
+ 0x8C89, 0x1A5C, 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F,
+ 0x8C8E, 0x1A60, 0x8C94, 0x1A61, 0x8C98, 0x1A63, 0x8C9D, 0x058B,
+ 0x8C9E, 0x0C03, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
+ 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
+ 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
+ 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
+ 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
+ 0x8CB8, 0x0B3F, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37, 0x8CBD, 0x1A67,
+ 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D, 0x8CC2, 0x0FCE,
+ 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C,
+ 0x8CCA, 0x0B11, 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0,
+ 0x8CD3, 0x0DC2, 0x8CD9, 0x3B32, 0x8CDA, 0x1A70, 0x8CDB, 0x088D,
+ 0x8CDC, 0x08C0, 0x8CDE, 0x09C6, 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33,
+ 0x8CE2, 0x0761, 0x8CE3, 0x1A6F, 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC,
+ 0x8CEA, 0x08ED, 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF4, 0x21B3,
+ 0x8CF8, 0x3B34, 0x8CFA, 0x1A72, 0x8CFB, 0x1A73, 0x8CFC, 0x07EA,
+ 0x8CFD, 0x1A71, 0x8CFE, 0x3B35, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
+ 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D0A, 0x1A76, 0x8D0B, 0x0622,
+ 0x8D0D, 0x1A79, 0x8D0F, 0x1A78, 0x8D10, 0x1A7A, 0x8D12, 0x21B4,
+ 0x8D13, 0x1A7C, 0x8D14, 0x1A7E, 0x8D16, 0x1A7F, 0x8D1B, 0x3B36,
+ 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
+ 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D70, 0x0AF8,
+ 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD, 0x8D76, 0x21B5,
+ 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39, 0x8D85, 0x0BD2,
+ 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D95, 0x3B3B, 0x8D99, 0x1A85,
+ 0x8DA3, 0x091D, 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DB3, 0x0B0D,
+ 0x8DBA, 0x1A88, 0x8DBE, 0x1A87, 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D,
+ 0x8DCB, 0x1A8E, 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89,
+ 0x8DD6, 0x1A8B, 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691,
+ 0x8DDF, 0x1A91, 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F,
+ 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
+ 0x8DEF, 0x0FCF, 0x8DF3, 0x0BD3, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93,
+ 0x8DFF, 0x1A96, 0x8E08, 0x1A94, 0x8E09, 0x1A95, 0x8E0A, 0x0F43,
+ 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E1D, 0x1A97, 0x8E1E, 0x1A98,
+ 0x8E1F, 0x1A9A, 0x8E20, 0x3B41, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D,
+ 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E42, 0x1A9B, 0x8E44, 0x0C19,
+ 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1, 0x8E4A, 0x1A9F,
+ 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E50, 0x1AA3, 0x8E55, 0x1AAA,
+ 0x8E59, 0x1AA5, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7, 0x8E63, 0x1AA9,
+ 0x8E64, 0x1AA6, 0x8E6C, 0x3B43, 0x8E70, 0x3B44, 0x8E72, 0x1AAC,
+ 0x8E74, 0x093D, 0x8E76, 0x1AAB, 0x8E7A, 0x3B45, 0x8E7C, 0x1AAD,
+ 0x8E81, 0x1AAE, 0x8E84, 0x1AB1, 0x8E85, 0x1AB0, 0x8E87, 0x1AAF,
+ 0x8E8A, 0x1AB3, 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E91, 0x1AB5,
+ 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E99, 0x1AB7,
+ 0x8EA1, 0x1AB9, 0x8EAA, 0x1AB8, 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA,
+ 0x8EAE, 0x3B47, 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD,
+ 0x8EB3, 0x3B48, 0x8EB6, 0x3703, 0x8EBE, 0x1ABE, 0x8EC0, 0x1DEF,
+ 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0, 0x8ECA, 0x0902,
+ 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709, 0x8ECF, 0x21B7,
+ 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A, 0x8EDB, 0x1AC2,
+ 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3, 0x8EEB, 0x1AC6,
+ 0x8EF8, 0x08E0, 0x8EF9, 0x3B4B, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
+ 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F03, 0x05B1, 0x8F05, 0x1AC9,
+ 0x8F09, 0x084C, 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB,
+ 0x8F13, 0x1ACD, 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C,
+ 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
+ 0x8F1F, 0x1ACF, 0x8F26, 0x1AD2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0,
+ 0x8F2F, 0x093E, 0x8F33, 0x1AD3, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C,
+ 0x8F39, 0x1AD5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
+ 0x8F42, 0x1AD7, 0x8F44, 0x05CB, 0x8F45, 0x1AD6, 0x8F46, 0x1ADB,
+ 0x8F49, 0x1ADA, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
+ 0x8F57, 0x1ADD, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
+ 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
+ 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA3, 0x1AE4,
+ 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5, 0x8FAD, 0x1AE5,
+ 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62, 0x8FB1, 0x09F1,
+ 0x8FB2, 0x0CF6, 0x8FB5, 0x3B4F, 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7,
+ 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0, 0x8FBC, 0x0810, 0x8FBF, 0x0B67,
+ 0x8FC2, 0x04CC, 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x3B51,
+ 0x8FC8, 0x3799, 0x8FCE, 0x0734, 0x8FD1, 0x06D9, 0x8FD4, 0x0E26,
+ 0x8FDA, 0x1AE8, 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53,
+ 0x8FE5, 0x1AE9, 0x8FE6, 0x0560, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
+ 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEF, 0x1AEC, 0x8FF0, 0x095C,
+ 0x8FF4, 0x1AEE, 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD,
+ 0x8FF9, 0x1AF0, 0x8FFA, 0x1AF1, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
+ 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9005, 0x1AEF,
+ 0x9006, 0x066F, 0x900B, 0x1AF8, 0x900D, 0x1AF5, 0x900E, 0x1B02,
+ 0x900F, 0x0C81, 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A,
+ 0x9014, 0x0C4D, 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26,
+ 0x9019, 0x0D1D, 0x901A, 0x0BE8, 0x901D, 0x0A66, 0x901E, 0x1AF6,
+ 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
+ 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902E, 0x0B41,
+ 0x9031, 0x093F, 0x9032, 0x0A10, 0x9035, 0x1AFB, 0x9036, 0x1AFA,
+ 0x9038, 0x04B3, 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04,
+ 0x9041, 0x0CB3, 0x9042, 0x0A31, 0x9044, 0x3B57, 0x9045, 0x0B97,
+ 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
+ 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE, 0x9050, 0x1AFF,
+ 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93, 0x9054, 0x0B61,
+ 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06, 0x9059, 0x1D34,
+ 0x905C, 0x0B1D, 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE,
+ 0x9063, 0x0763, 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08,
+ 0x9069, 0x0C26, 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09,
+ 0x9072, 0x1B0C, 0x9075, 0x096F, 0x9076, 0x1B0A, 0x9077, 0x0AAD,
+ 0x9078, 0x0AAC, 0x907A, 0x04A8, 0x907C, 0x0F93, 0x907D, 0x1B0E,
+ 0x907F, 0x0D86, 0x9080, 0x1B10, 0x9081, 0x1B0F, 0x9082, 0x1B0D,
+ 0x9083, 0x1737, 0x9084, 0x0610, 0x9087, 0x1AED, 0x9088, 0x3B58,
+ 0x9089, 0x1B12, 0x908A, 0x1B11, 0x908F, 0x1B13, 0x9091, 0x0F22,
+ 0x9095, 0x3B59, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A2, 0x3B5C,
+ 0x90A3, 0x0CB9, 0x90A6, 0x0E5C, 0x90A8, 0x1B14, 0x90AA, 0x0905,
+ 0x90AF, 0x1B15, 0x90B1, 0x1B16, 0x90B4, 0x3B5D, 0x90B5, 0x1B17,
+ 0x90B8, 0x0C1B, 0x90C1, 0x04AE, 0x90CA, 0x07EB, 0x90CE, 0x0FE0,
+ 0x90D7, 0x3B5E, 0x90DB, 0x1B1B, 0x90DD, 0x3B5F, 0x90DE, 0x21BB,
+ 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
+ 0x90ED, 0x05B2, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F7, 0x06B7,
+ 0x90FD, 0x0C4E, 0x9102, 0x1B1C, 0x9112, 0x1B1D, 0x9115, 0x21BD,
+ 0x9117, 0x3B61, 0x9119, 0x1B1E, 0x911C, 0x3B62, 0x9127, 0x21BE,
+ 0x912D, 0x0C1C, 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F,
+ 0x913A, 0x3B64, 0x913D, 0x3B65, 0x9148, 0x3B66, 0x9149, 0x0CAB,
+ 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
+ 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
+ 0x9158, 0x1B23, 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23,
+ 0x9163, 0x1B24, 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9169, 0x1B26,
+ 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
+ 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E, 0x9182, 0x1B2B,
+ 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918B, 0x1B29, 0x918D, 0x0B49,
+ 0x918E, 0x3B6A, 0x9190, 0x07A3, 0x9192, 0x0A67, 0x9197, 0x0D44,
+ 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
+ 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
+ 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B1, 0x1E61,
+ 0x91B2, 0x3B6F, 0x91B4, 0x1B31, 0x91B5, 0x1B30, 0x91B8, 0x09E2,
+ 0x91BA, 0x1B32, 0x91BC, 0x3B70, 0x91C0, 0x1B33, 0x91C1, 0x1B34,
+ 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D, 0x91C9, 0x1B35,
+ 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F, 0x91CE, 0x0EFA,
+ 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA, 0x91D6, 0x1B38,
+ 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF, 0x91DB, 0x1B3B,
+ 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1, 0x91DF, 0x1B39,
+ 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4, 0x91E5, 0x21C5,
+ 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91ED, 0x21C2, 0x91EE, 0x21C3,
+ 0x91F0, 0x3B71, 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72,
+ 0x91FB, 0x3B73, 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9206, 0x21C6,
+ 0x9207, 0x3B74, 0x920A, 0x21C8, 0x920D, 0x0CB7, 0x920E, 0x05A1,
+ 0x9210, 0x21C7, 0x9211, 0x1B44, 0x9214, 0x1B41, 0x9215, 0x1B43,
+ 0x921E, 0x1B3F, 0x9228, 0x3B75, 0x9229, 0x1B8A, 0x922C, 0x1B42,
+ 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E, 0x9238, 0x3B77,
+ 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB, 0x923F, 0x1B4C,
+ 0x9240, 0x21CA, 0x9243, 0x3B78, 0x9244, 0x0C2E, 0x9245, 0x1B47,
+ 0x9247, 0x3B79, 0x9248, 0x1B4A, 0x9249, 0x1B48, 0x924B, 0x1B4D,
+ 0x924E, 0x21CC, 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE,
+ 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
+ 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9262, 0x0D41, 0x9264, 0x1B49,
+ 0x9266, 0x09C8, 0x9267, 0x21D0, 0x9271, 0x07ED, 0x9277, 0x21D2,
+ 0x9278, 0x21D3, 0x927E, 0x0E76, 0x9280, 0x06DC, 0x9283, 0x0950,
+ 0x9285, 0x0C94, 0x9288, 0x20AA, 0x9291, 0x0AAF, 0x9293, 0x1B51,
+ 0x9295, 0x1B4B, 0x9296, 0x1B50, 0x9298, 0x0ECF, 0x929A, 0x0BD4,
+ 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x92A7, 0x21D1, 0x92AD, 0x0AAE,
+ 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92C2, 0x3B7C,
+ 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CF, 0x1B54, 0x92D0, 0x21D7,
+ 0x92D2, 0x0E5D, 0x92D3, 0x21DB, 0x92D5, 0x21D9, 0x92D7, 0x21D5,
+ 0x92D9, 0x21D6, 0x92DF, 0x3B7F, 0x92E0, 0x21DA, 0x92E4, 0x0985,
+ 0x92E7, 0x21D4, 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6,
+ 0x92F2, 0x0DB8, 0x92F3, 0x0BB0, 0x92F8, 0x0692, 0x92F9, 0x20B0,
+ 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
+ 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
+ 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9315, 0x3B81, 0x9318, 0x0A34,
+ 0x9319, 0x1B5C, 0x931A, 0x1B5E, 0x931D, 0x21E2, 0x931E, 0x21E0,
+ 0x931F, 0x3B82, 0x9320, 0x09E3, 0x9321, 0x21DD, 0x9322, 0x1B5D,
+ 0x9323, 0x1B5F, 0x9325, 0x21DC, 0x9326, 0x06CB, 0x9327, 0x3B83,
+ 0x9328, 0x0DB7, 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B,
+ 0x932F, 0x0868, 0x9332, 0x0FE5, 0x9335, 0x1B61, 0x933A, 0x1B60,
+ 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84, 0x9348, 0x20A9,
+ 0x934A, 0x3458, 0x934B, 0x0CC1, 0x934D, 0x0C4F, 0x9352, 0x3B85,
+ 0x9354, 0x0BF3, 0x9356, 0x1B67, 0x9357, 0x21E5, 0x935B, 0x0B81,
+ 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9365, 0x3B86, 0x936A, 0x3B87,
+ 0x936C, 0x0703, 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4,
+ 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9, 0x938C, 0x05D7,
+ 0x9394, 0x1B6B, 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6,
+ 0x939B, 0x3B89, 0x93A4, 0x21E6, 0x93A7, 0x0599, 0x93A9, 0x3B8B,
+ 0x93AC, 0x1B69, 0x93AD, 0x1B6A, 0x93AE, 0x0BDF, 0x93B0, 0x1B68,
+ 0x93B9, 0x1B6C, 0x93BA, 0x3B8A, 0x93C1, 0x3B8C, 0x93C3, 0x1B72,
+ 0x93C6, 0x21E7, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93D0, 0x1B74,
+ 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E, 0x93D8, 0x1B71,
+ 0x93DD, 0x1B73, 0x93DE, 0x21E8, 0x93E1, 0x06B8, 0x93E2, 0x3B8E,
+ 0x93E4, 0x1B76, 0x93E5, 0x1B70, 0x93E8, 0x1B6F, 0x93F8, 0x21E9,
+ 0x93FA, 0x3B8F, 0x93FD, 0x3B90, 0x9403, 0x1B7A, 0x9407, 0x1B7B,
+ 0x940F, 0x3B91, 0x9410, 0x1B7C, 0x9413, 0x1B79, 0x9414, 0x1B78,
+ 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
+ 0x942B, 0x1B7E, 0x9431, 0x21EA, 0x9434, 0x3B92, 0x9435, 0x1B7F,
+ 0x9436, 0x1B7D, 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943F, 0x3B93,
+ 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
+ 0x9451, 0x0611, 0x9452, 0x1B83, 0x9453, 0x0F06, 0x9455, 0x3B94,
+ 0x945A, 0x1B8F, 0x945B, 0x1B85, 0x945E, 0x1B88, 0x9460, 0x1B86,
+ 0x9462, 0x1B87, 0x946A, 0x1B89, 0x946B, 0x3B95, 0x9470, 0x1B8B,
+ 0x9472, 0x3B96, 0x9475, 0x1B8C, 0x9477, 0x1B8D, 0x947C, 0x1B90,
+ 0x947D, 0x1B8E, 0x947E, 0x1B91, 0x947F, 0x1B93, 0x9481, 0x1B92,
+ 0x9577, 0x0BD5, 0x9578, 0x3B97, 0x9580, 0x0EF3, 0x9582, 0x1B94,
+ 0x9583, 0x0AB0, 0x9587, 0x1B95, 0x9589, 0x0E14, 0x958A, 0x1B96,
+ 0x958B, 0x0589, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
+ 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
+ 0x9599, 0x1B9A, 0x95A0, 0x1B9B, 0x95A2, 0x0614, 0x95A3, 0x05B3,
+ 0x95A4, 0x07F0, 0x95A5, 0x0D4A, 0x95A6, 0x3B98, 0x95A7, 0x1B9D,
+ 0x95A8, 0x1B9C, 0x95A9, 0x3B99, 0x95AB, 0x3B9A, 0x95AD, 0x1B9E,
+ 0x95B1, 0x3555, 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B9, 0x1BA1,
+ 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
+ 0x95C3, 0x1BA5, 0x95C7, 0x048B, 0x95CA, 0x1BA3, 0x95CC, 0x1BA7,
+ 0x95CD, 0x1BA6, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8, 0x95D6, 0x1BAA,
+ 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB, 0x95E1, 0x1BAC,
+ 0x95E2, 0x1BAE, 0x95E5, 0x1BAD, 0x961C, 0x0DDE, 0x961D, 0x3B9E,
+ 0x9621, 0x1BAF, 0x9628, 0x1BB0, 0x962A, 0x0855, 0x962E, 0x1BB1,
+ 0x962F, 0x1BB2, 0x9632, 0x0E77, 0x963B, 0x0ACD, 0x963F, 0x0468,
+ 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3, 0x9644, 0x0DDF,
+ 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1, 0x964F, 0x1BB5,
+ 0x9650, 0x0776, 0x9658, 0x3BA0, 0x965B, 0x0E15, 0x965C, 0x1BB8,
+ 0x965D, 0x1BBA, 0x965E, 0x1BB9, 0x965F, 0x1BBB, 0x9662, 0x04C3,
+ 0x9663, 0x0A1E, 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC,
+ 0x966A, 0x0D1C, 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD,
+ 0x9673, 0x0BE0, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
+ 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967D, 0x0F45, 0x9684, 0x3BA1,
+ 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE, 0x968A, 0x0B42,
+ 0x968B, 0x186C, 0x968D, 0x1BBF, 0x968E, 0x058A, 0x968F, 0x0A35,
+ 0x9694, 0x05B4, 0x9695, 0x1BC1, 0x9697, 0x1BC2, 0x9698, 0x1BC0,
+ 0x9699, 0x073A, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
+ 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A7, 0x1BC4,
+ 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3, 0x96AF, 0x21F1,
+ 0x96B0, 0x1BC7, 0x96B1, 0x1BC5, 0x96B2, 0x1BC6, 0x96B4, 0x1BC8,
+ 0x96B6, 0x1BC9, 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB,
+ 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96C0, 0x0A43, 0x96C1, 0x0623,
+ 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942, 0x96C7, 0x078F,
+ 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1, 0x96CD, 0x1BCF,
+ 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4, 0x96D5, 0x1BD3,
+ 0x96D6, 0x1992, 0x96D9, 0x10EB, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1,
+ 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
+ 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96F0, 0x0E07,
+ 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5, 0x96F7, 0x0F55,
+ 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927, 0x9702, 0x3BA9,
+ 0x9704, 0x1BD5, 0x9706, 0x1BD6, 0x9707, 0x0A12, 0x9708, 0x1BD7,
+ 0x9709, 0x3BAA, 0x970A, 0x0FB6, 0x970D, 0x1BD2, 0x970E, 0x1BD9,
+ 0x970F, 0x1BDB, 0x9711, 0x1BDA, 0x9713, 0x1BD8, 0x9716, 0x1BDC,
+ 0x9719, 0x1BDD, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9724, 0x1BDE,
+ 0x9727, 0x0EC4, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9732, 0x0FD0,
+ 0x9733, 0x21F2, 0x9738, 0x1414, 0x9739, 0x1BE1, 0x973B, 0x21F3,
+ 0x973D, 0x1BE2, 0x973E, 0x1BE3, 0x9742, 0x1BE7, 0x9743, 0x21F4,
+ 0x9744, 0x1BE4, 0x9746, 0x1BE5, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
+ 0x974D, 0x21F5, 0x974F, 0x21F6, 0x9751, 0x21F7, 0x9752, 0x0A68,
+ 0x9755, 0x21F8, 0x9756, 0x0F03, 0x9759, 0x0A69, 0x975A, 0x3BAB,
+ 0x975C, 0x1BE9, 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06,
+ 0x9762, 0x0ED8, 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC,
+ 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976B, 0x1BEF, 0x976D, 0x0A1F,
+ 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE, 0x9774, 0x06FA,
+ 0x9779, 0x1BF1, 0x977A, 0x1BF5, 0x977C, 0x1BF3, 0x9781, 0x1BF4,
+ 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
+ 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9798, 0x09CC,
+ 0x979A, 0x3BAF, 0x979C, 0x1BFA, 0x97A0, 0x0661, 0x97A2, 0x3BB0,
+ 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB, 0x97AB, 0x1A34,
+ 0x97AD, 0x0E2C, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF, 0x97B5, 0x3BB1,
+ 0x97B6, 0x3BB2, 0x97C3, 0x1C00, 0x97C6, 0x1C01, 0x97C8, 0x1C02,
+ 0x97CB, 0x1C03, 0x97D3, 0x0616, 0x97D9, 0x3BB3, 0x97DC, 0x1C04,
+ 0x97DE, 0x3BB4, 0x97ED, 0x1C05, 0x97EE, 0x0CD9, 0x97F2, 0x1C07,
+ 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
+ 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
+ 0x9803, 0x0812, 0x9805, 0x07F2, 0x9806, 0x0971, 0x9808, 0x0A22,
+ 0x980A, 0x3BB6, 0x980C, 0x1C0C, 0x980E, 0x3BB7, 0x980F, 0x1C0B,
+ 0x9810, 0x0F2C, 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4,
+ 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731, 0x981E, 0x3BB8,
+ 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E, 0x982B, 0x3BBA,
+ 0x982C, 0x0E79, 0x982D, 0x0C84, 0x9830, 0x1E73, 0x9834, 0x04F2,
+ 0x9837, 0x1C10, 0x9838, 0x1C0D, 0x9839, 0x37B3, 0x983B, 0x0DC3,
+ 0x983C, 0x0F54, 0x983D, 0x1C11, 0x983E, 0x3BBB, 0x9846, 0x1C12,
+ 0x984B, 0x1C14, 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA,
+ 0x984F, 0x1C13, 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625,
+ 0x9855, 0x0766, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
+ 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9865, 0x21FA,
+ 0x9867, 0x0790, 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16,
+ 0x9870, 0x1C17, 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19,
+ 0x98A8, 0x0DE9, 0x98AA, 0x1C1B, 0x98AF, 0x1C1C, 0x98B1, 0x1C1D,
+ 0x98B6, 0x1C1E, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BF, 0x3BC2,
+ 0x98C3, 0x1C20, 0x98C4, 0x1C1F, 0x98C6, 0x1C21, 0x98C8, 0x3BC3,
+ 0x98DB, 0x0D88, 0x98DC, 0x1839, 0x98DF, 0x09EF, 0x98E0, 0x3618,
+ 0x98E2, 0x064C, 0x98E5, 0x3BC4, 0x98E9, 0x1C22, 0x98EB, 0x1C23,
+ 0x98ED, 0x10C1, 0x98EE, 0x14DA, 0x98EF, 0x0D67, 0x98F2, 0x04BF,
+ 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E, 0x98FE, 0x09E6,
+ 0x9903, 0x1C24, 0x9905, 0x0EEB, 0x9909, 0x1C25, 0x990A, 0x0F46,
+ 0x990C, 0x04E4, 0x9910, 0x088F, 0x9912, 0x1C26, 0x9913, 0x056E,
+ 0x9914, 0x1C27, 0x9918, 0x1C28, 0x991D, 0x1C2A, 0x991E, 0x1C2B,
+ 0x9920, 0x1C2D, 0x9921, 0x1C29, 0x9924, 0x1C2C, 0x9927, 0x21FD,
+ 0x9928, 0x0617, 0x992C, 0x1C2E, 0x992E, 0x1C2F, 0x9932, 0x3BC5,
+ 0x9933, 0x3BC6, 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7,
+ 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9949, 0x1C33, 0x994B, 0x1C36,
+ 0x994C, 0x1C39, 0x994D, 0x3BC8, 0x9950, 0x1C35, 0x9951, 0x1C37,
+ 0x9952, 0x1C38, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x995C, 0x3BC9,
+ 0x995F, 0x3BCA, 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C,
+ 0x9999, 0x07F3, 0x999E, 0x21FF, 0x99A5, 0x1C3D, 0x99A8, 0x059C,
+ 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F, 0x99B1, 0x3BCB,
+ 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC, 0x99BA, 0x3BCD,
+ 0x99BC, 0x1C40, 0x99C1, 0x0D33, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
+ 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
+ 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D5, 0x056F, 0x99D8, 0x1C44,
+ 0x99DB, 0x1C42, 0x99DD, 0x1C43, 0x99DF, 0x1C41, 0x99E2, 0x1C4F,
+ 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F1, 0x1C48, 0x99F2, 0x1C49,
+ 0x99F8, 0x1C4B, 0x99FB, 0x1C4A, 0x99FF, 0x0963, 0x9A01, 0x1C4C,
+ 0x9A02, 0x3BCF, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0E, 0x064D,
+ 0x9A0F, 0x1C4D, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
+ 0x9A19, 0x1C50, 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D,
+ 0x9A2B, 0x1C51, 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85,
+ 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
+ 0x9A40, 0x1C55, 0x9A42, 0x1C54, 0x9A43, 0x1C56, 0x9A45, 0x1C53,
+ 0x9A4A, 0x3BD7, 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A52, 0x1E2F,
+ 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A5A, 0x06BB,
+ 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D, 0x9A64, 0x1C5F,
+ 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62, 0x9A6B, 0x1C61,
+ 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9,
+ 0x9AB6, 0x3BDA, 0x9AB8, 0x059A, 0x9ABC, 0x1C65, 0x9AC0, 0x1C66,
+ 0x9AC4, 0x0A37, 0x9ACF, 0x1C67, 0x9AD1, 0x1C68, 0x9AD3, 0x1C69,
+ 0x9AD4, 0x1C6A, 0x9AD8, 0x07F4, 0x9AD9, 0x2201, 0x9ADC, 0x2202,
+ 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E,
+ 0x9AE6, 0x1C6F, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71, 0x9AED, 0x0D98,
+ 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74, 0x9AF4, 0x1C73,
+ 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76, 0x9B03, 0x3BDC,
+ 0x9B06, 0x1C77, 0x9B18, 0x1C78, 0x9B1A, 0x1C79, 0x9B1F, 0x1C7A,
+ 0x9B20, 0x3BDD, 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D,
+ 0x9B27, 0x1C7E, 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81,
+ 0x9B2D, 0x343C, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83, 0x9B31, 0x14D4,
+ 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF, 0x9B3B, 0x17A9,
+ 0x9B3C, 0x064E, 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86,
+ 0x9B44, 0x1C85, 0x9B45, 0x0EB1, 0x9B4D, 0x1C88, 0x9B4E, 0x1C89,
+ 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90, 0x9B58, 0x1C8B,
+ 0x9B5A, 0x0695, 0x9B6F, 0x0FCB, 0x9B72, 0x2204, 0x9B73, 0x3BE0,
+ 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B79, 0x3BE1, 0x9B83, 0x1C8E,
+ 0x9B8E, 0x0482, 0x9B8F, 0x2205, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
+ 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9F, 0x1C92,
+ 0x9BA0, 0x1C93, 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C,
+ 0x9BAB, 0x087B, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB1, 0x2206,
+ 0x9BB4, 0x1C95, 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BC0, 0x1C96,
+ 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4, 0x9BC9, 0x07A5,
+ 0x9BCA, 0x1C97, 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C,
+ 0x9BD4, 0x1CA0, 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BDB, 0x0B44,
+ 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E, 0x9BE3, 0x1C9D,
+ 0x9BE4, 0x1C9F, 0x9BE7, 0x3BE6, 0x9BE8, 0x0735, 0x9BEB, 0x3BE7,
+ 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3, 0x9BF5, 0x0477,
+ 0x9BF7, 0x3BE8, 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9C00, 0x2208,
+ 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC, 0x9C09, 0x1CA8,
+ 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA, 0x9C0D, 0x05C0,
+ 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9, 0x9C14, 0x1CA7,
+ 0x9C15, 0x1CA6, 0x9C1B, 0x1CB1, 0x9C21, 0x1CB4, 0x9C24, 0x1CB3,
+ 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB,
+ 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7, 0x9C30, 0x1CB5, 0x9C32, 0x1CB7,
+ 0x9C36, 0x3BEE, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2, 0x9C3B, 0x04D9,
+ 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6,
+ 0x9C48, 0x0B6B, 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C57, 0x0FA2,
+ 0x9C5A, 0x1CBA, 0x9C60, 0x1CBB, 0x9C63, 0x3BF1, 0x9C67, 0x1CBC,
+ 0x9C6A, 0x3BF2, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
+ 0x9CE5, 0x0BD7, 0x9CE7, 0x1CBF, 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4,
+ 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0,
+ 0x9CF6, 0x0CA8, 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6,
+ 0x9D07, 0x0C96, 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0E, 0x052A,
+ 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D1B, 0x0517, 0x9D1F, 0x1CCB,
+ 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9, 0x9D2A, 0x1CC7,
+ 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D3B, 0x07F5, 0x9D3E, 0x1CD1,
+ 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D44, 0x1CCC,
+ 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3, 0x9D50, 0x1CD8,
+ 0x9D51, 0x1CD7, 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4,
+ 0x9D5E, 0x1CD5, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D63, 0x3BF7,
+ 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6B, 0x220A, 0x9D6C, 0x0E60,
+ 0x9D6F, 0x1CDE, 0x9D70, 0x2209, 0x9D72, 0x1CDA, 0x9D7A, 0x1CDF,
+ 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB,
+ 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D9A, 0x1CE0, 0x9DA4, 0x1CE1,
+ 0x9DA9, 0x1CE2, 0x9DAB, 0x1CDD, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
+ 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB8, 0x1CE7, 0x9DBA, 0x1CE8,
+ 0x9DBB, 0x1CE6, 0x9DC1, 0x1CE5, 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD,
+ 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9, 0x9DC7, 0x3BFE, 0x9DCF, 0x1CEA,
+ 0x9DD3, 0x1CED, 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC,
+ 0x9DDF, 0x3C00, 0x9DE6, 0x1CEF, 0x9DEB, 0x3C01, 0x9DED, 0x1CF0,
+ 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE,
+ 0x9DF9, 0x0B4B, 0x9DFA, 0x085D, 0x9DFD, 0x1CF2, 0x9E15, 0x3C03,
+ 0x9E19, 0x220C, 0x9E1A, 0x1CF3, 0x9E1B, 0x1CF4, 0x9E1D, 0x3C04,
+ 0x9E1E, 0x1CF5, 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7,
+ 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB, 0x9E81, 0x1CF9,
+ 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB, 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF,
+ 0x9E92, 0x1CFD, 0x9E93, 0x0FE2, 0x9E95, 0x1CFE, 0x9E97, 0x0FB7,
+ 0x9E9D, 0x1D00, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
+ 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
+ 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EB4, 0x1E02, 0x9EB5, 0x1E75,
+ 0x9EB8, 0x1D03, 0x9EB9, 0x07FF, 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91,
+ 0x9EBC, 0x1284, 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B,
+ 0x9EC4, 0x052B, 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08,
+ 0x9ECF, 0x1D09, 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807,
+ 0x9ED4, 0x1D0B, 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43,
+ 0x9EDC, 0x1D0C, 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EE0, 0x1D0F,
+ 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11, 0x9EEE, 0x3C09,
+ 0x9EEF, 0x1D12, 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15,
+ 0x9EF9, 0x1D16, 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19,
+ 0x9F07, 0x1D1A, 0x9F08, 0x1D1B, 0x9F0E, 0x0C1E, 0x9F10, 0x3C0A,
+ 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F15, 0x1D1D, 0x9F17, 0x3C0C,
+ 0x9F19, 0x3C0D, 0x9F20, 0x0ACF, 0x9F21, 0x1D1E, 0x9F2C, 0x1D1F,
+ 0x9F2F, 0x3C0E, 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3B, 0x0D93,
+ 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12, 0x9F4A, 0x1D21,
+ 0x9F4B, 0x170A, 0x9F4E, 0x1A7B, 0x9F4F, 0x1C06, 0x9F52, 0x1D22,
+ 0x9F54, 0x1D23, 0x9F57, 0x3C13, 0x9F5F, 0x1D25, 0x9F60, 0x1D26,
+ 0x9F61, 0x1D27, 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28,
+ 0x9F67, 0x1D29, 0x9F68, 0x3C14, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
+ 0x9F71, 0x3C15, 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E,
+ 0x9F77, 0x1D2C, 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18,
+ 0x9F95, 0x1D2F, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9FA0, 0x1D31,
+ 0x9FA2, 0x3C19, 0xF929, 0x2129, 0xF9DC, 0x21EE, 0xFA0E, 0x20DA,
+ 0xFA0F, 0x20E5, 0xFA10, 0x20E6, 0xFA11, 0x20FB, 0xFA12, 0x2121,
+ 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x215E, 0xFA16, 0x2164,
+ 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
+ 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
+ 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
+ 0xFA23, 0x21B6, 0xFA24, 0x21B8, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
+ 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
+ 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFB00, 0x248E,
+ 0xFB01, 0x0070, 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490,
+ 0xFE30, 0x1EDA, 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2,
+ 0xFE35, 0x1EDB, 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2,
+ 0xFE39, 0x1EDD, 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC,
+ 0xFE3D, 0x1EE5, 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4,
+ 0xFE41, 0x1EE7, 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA,
+ 0xFF01, 0x0282, 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8,
+ 0xFF05, 0x02CB, 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2,
+ 0xFF09, 0x02A3, 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C,
+ 0xFF0D, 0x02B5, 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C,
+ 0xFF11, 0x030D, 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310,
+ 0xFF15, 0x0311, 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314,
+ 0xFF19, 0x0315, 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB,
+ 0xFF1D, 0x02B9, 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF,
+ 0xFF21, 0x0316, 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319,
+ 0xFF25, 0x031A, 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D,
+ 0xFF29, 0x031E, 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321,
+ 0xFF2D, 0x0322, 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325,
+ 0xFF31, 0x0326, 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329,
+ 0xFF35, 0x032A, 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D,
+ 0xFF39, 0x032E, 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298,
+ 0xFF3D, 0x02A7, 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286,
+ 0xFF41, 0x0330, 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333,
+ 0xFF45, 0x0334, 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337,
+ 0xFF49, 0x0338, 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B,
+ 0xFF4D, 0x033C, 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F,
+ 0xFF51, 0x0340, 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343,
+ 0xFF55, 0x0344, 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347,
+ 0xFF59, 0x0348, 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B,
+ 0xFF5D, 0x02A9, 0xFF5E, 0x0299, 0xFF61, 0x0147, 0xFF62, 0x0148,
+ 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B, 0xFF66, 0x014C,
+ 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F, 0xFF6A, 0x0150,
+ 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153, 0xFF6E, 0x0154,
+ 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157, 0xFF72, 0x0158,
+ 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B, 0xFF76, 0x015C,
+ 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F, 0xFF7A, 0x0160,
+ 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163, 0xFF7E, 0x0164,
+ 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167, 0xFF82, 0x0168,
+ 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B, 0xFF86, 0x016C,
+ 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F, 0xFF8A, 0x0170,
+ 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173, 0xFF8E, 0x0174,
+ 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177, 0xFF92, 0x0178,
+ 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B, 0xFF96, 0x017C,
+ 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F, 0xFF9A, 0x0180,
+ 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183, 0xFF9E, 0x0184,
+ 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA, 0xFFE2, 0x02EF,
+ 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7, 0xFFE8, 0x0143,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
new file mode 100644
index 0000000000..52f1008c83
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UCS2_V_4[251 * 2] = {
+ 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
+ 0x2018, 0x2059, 0x2019, 0x205A, 0x201C, 0x2057, 0x201D, 0x2058,
+ 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
+ 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
+ 0x2195, 0x2FB6, 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078,
+ 0x21E6, 0x1F4C, 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D,
+ 0x2225, 0x1ED7, 0x223C, 0x1ED6, 0x22EF, 0x1ED9, 0x2500, 0x1D39,
+ 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38, 0x2504, 0x1D3D,
+ 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C, 0x2508, 0x1D41,
+ 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40, 0x250C, 0x1D47,
+ 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A, 0x2510, 0x1D4F,
+ 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52, 0x2514, 0x1D43,
+ 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46, 0x2518, 0x1D4B,
+ 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E, 0x251C, 0x1D63,
+ 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64, 0x2520, 0x1D66,
+ 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A, 0x2524, 0x1D6B,
+ 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C, 0x2528, 0x1D6E,
+ 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72, 0x252C, 0x1D5B,
+ 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F, 0x2530, 0x1D5C,
+ 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62, 0x2534, 0x1D53,
+ 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57, 0x2538, 0x1D54,
+ 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A, 0x253D, 0x1D77,
+ 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75, 0x2541, 0x1D74,
+ 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D, 0x2545, 0x1D7A,
+ 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80, 0x2549, 0x1D7E,
+ 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B, 0x261E, 0x201E,
+ 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011, 0x3001, 0x1ECF,
+ 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4, 0x300A, 0x1EE5,
+ 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8, 0x300E, 0x1EE9,
+ 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC, 0x3013, 0x204E,
+ 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x301C, 0x1ED6, 0x301D, 0x1F14,
+ 0x301F, 0x1F15, 0x3041, 0x1EEE, 0x3043, 0x1EEF, 0x3045, 0x1EF0,
+ 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3, 0x3083, 0x1EF4,
+ 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7, 0x309B, 0x2050,
+ 0x309C, 0x204F, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
+ 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
+ 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
+ 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x3300, 0x209E, 0x3301, 0x2EB6,
+ 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
+ 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
+ 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
+ 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
+ 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
+ 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
+ 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
+ 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
+ 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
+ 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
+ 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
+ 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
+ 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
+ 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
+ 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
+ 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
+ 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
+ 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
+ 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
+ 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
+ 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
+ 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
+ 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
+ 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
new file mode 100644
index 0000000000..1cc2312a13
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp
@@ -0,0 +1,3449 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5[13241 * 2] = {
+ 0x0020, 0x0001, 0x0021, 0x0002, 0x0022, 0x0003, 0x0023, 0x0004,
+ 0x0024, 0x0005, 0x0025, 0x0006, 0x0026, 0x0007, 0x0027, 0x0008,
+ 0x0028, 0x0009, 0x0029, 0x000A, 0x002A, 0x000B, 0x002B, 0x000C,
+ 0x002C, 0x000D, 0x002D, 0x000E, 0x002E, 0x000F, 0x002F, 0x0010,
+ 0x0030, 0x0011, 0x0031, 0x0012, 0x0032, 0x0013, 0x0033, 0x0014,
+ 0x0034, 0x0015, 0x0035, 0x0016, 0x0036, 0x0017, 0x0037, 0x0018,
+ 0x0038, 0x0019, 0x0039, 0x001A, 0x003A, 0x001B, 0x003B, 0x001C,
+ 0x003C, 0x001D, 0x003D, 0x001E, 0x003E, 0x001F, 0x003F, 0x0020,
+ 0x0040, 0x0021, 0x0041, 0x0022, 0x0042, 0x0023, 0x0043, 0x0024,
+ 0x0044, 0x0025, 0x0045, 0x0026, 0x0046, 0x0027, 0x0047, 0x0028,
+ 0x0048, 0x0029, 0x0049, 0x002A, 0x004A, 0x002B, 0x004B, 0x002C,
+ 0x004C, 0x002D, 0x004D, 0x002E, 0x004E, 0x002F, 0x004F, 0x0030,
+ 0x0050, 0x0031, 0x0051, 0x0032, 0x0052, 0x0033, 0x0053, 0x0034,
+ 0x0054, 0x0035, 0x0055, 0x0036, 0x0056, 0x0037, 0x0057, 0x0038,
+ 0x0058, 0x0039, 0x0059, 0x003A, 0x005A, 0x003B, 0x005B, 0x003C,
+ 0x005C, 0x0061, 0x005D, 0x003E, 0x005E, 0x003F, 0x005F, 0x0040,
+ 0x0060, 0x0041, 0x0061, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0049, 0x0069, 0x004A, 0x006A, 0x004B, 0x006B, 0x004C,
+ 0x006C, 0x004D, 0x006D, 0x004E, 0x006E, 0x004F, 0x006F, 0x0050,
+ 0x0070, 0x0051, 0x0071, 0x0052, 0x0072, 0x0053, 0x0073, 0x0054,
+ 0x0074, 0x0055, 0x0075, 0x0056, 0x0076, 0x0057, 0x0077, 0x0058,
+ 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005B, 0x007B, 0x005C,
+ 0x007C, 0x0063, 0x007D, 0x005E, 0x007E, 0x0064, 0x00A0, 0x0001,
+ 0x00A1, 0x0065, 0x00A2, 0x0066, 0x00A3, 0x0067, 0x00A4, 0x006B,
+ 0x00A5, 0x003D, 0x00A6, 0x005D, 0x00A7, 0x02D0, 0x00A8, 0x0287,
+ 0x00A9, 0x0098, 0x00AA, 0x008C, 0x00AB, 0x006D, 0x00AC, 0x0099,
+ 0x00AD, 0x0097, 0x00AE, 0x009A, 0x00AF, 0x0081, 0x00B0, 0x02C3,
+ 0x00B1, 0x02B6, 0x00B2, 0x009D, 0x00B3, 0x009E, 0x00B4, 0x0285,
+ 0x00B5, 0x009F, 0x00B6, 0x030A, 0x00B7, 0x0075, 0x00B8, 0x0086,
+ 0x00B9, 0x00A0, 0x00BA, 0x0090, 0x00BB, 0x007B, 0x00BC, 0x00A1,
+ 0x00BD, 0x00A2, 0x00BE, 0x00A3, 0x00BF, 0x007E, 0x00C0, 0x00A4,
+ 0x00C1, 0x00A5, 0x00C2, 0x00A6, 0x00C3, 0x00A7, 0x00C4, 0x00A8,
+ 0x00C5, 0x00A9, 0x00C6, 0x008B, 0x00C7, 0x00AA, 0x00C8, 0x00AB,
+ 0x00C9, 0x00AC, 0x00CA, 0x00AD, 0x00CB, 0x00AE, 0x00CC, 0x00AF,
+ 0x00CD, 0x00B0, 0x00CE, 0x00B1, 0x00CF, 0x00B2, 0x00D0, 0x00B3,
+ 0x00D1, 0x00B4, 0x00D2, 0x00B5, 0x00D3, 0x00B6, 0x00D4, 0x00B7,
+ 0x00D5, 0x00B8, 0x00D6, 0x00B9, 0x00D7, 0x02B7, 0x00D8, 0x008E,
+ 0x00D9, 0x00BB, 0x00DA, 0x00BC, 0x00DB, 0x00BD, 0x00DC, 0x00BE,
+ 0x00DD, 0x00BF, 0x00DE, 0x00C0, 0x00DF, 0x0096, 0x00E0, 0x00C1,
+ 0x00E1, 0x00C2, 0x00E2, 0x00C3, 0x00E3, 0x00C4, 0x00E4, 0x00C5,
+ 0x00E5, 0x00C6, 0x00E6, 0x0091, 0x00E7, 0x00C7, 0x00E8, 0x00C8,
+ 0x00E9, 0x00C9, 0x00EA, 0x00CA, 0x00EB, 0x00CB, 0x00EC, 0x00CC,
+ 0x00ED, 0x00CD, 0x00EE, 0x00CE, 0x00EF, 0x00CF, 0x00F0, 0x00D0,
+ 0x00F1, 0x00D1, 0x00F2, 0x00D2, 0x00F3, 0x00D3, 0x00F4, 0x00D4,
+ 0x00F5, 0x00D5, 0x00F6, 0x00D6, 0x00F7, 0x02B8, 0x00F8, 0x0094,
+ 0x00F9, 0x00D8, 0x00FA, 0x00D9, 0x00FB, 0x00DA, 0x00FC, 0x00DB,
+ 0x00FD, 0x00DC, 0x00FE, 0x00DD, 0x00FF, 0x00DE, 0x0100, 0x2496,
+ 0x0101, 0x2491, 0x0102, 0x3D8C, 0x0103, 0x3D99, 0x0104, 0x3D79,
+ 0x0105, 0x3D81, 0x0106, 0x3D8E, 0x0107, 0x3D9B, 0x0108, 0x3DA7,
+ 0x0109, 0x3DAD, 0x010C, 0x3D8F, 0x010D, 0x3D9C, 0x010E, 0x3D91,
+ 0x010F, 0x3D9E, 0x0111, 0x3D9F, 0x0112, 0x2499, 0x0113, 0x2494,
+ 0x0118, 0x3D90, 0x0119, 0x3D9D, 0x011A, 0x24B3, 0x011B, 0x24BF,
+ 0x011C, 0x3DA8, 0x011D, 0x3DAE, 0x0124, 0x3DA9, 0x0125, 0x3DAF,
+ 0x0127, 0x3DC8, 0x0128, 0x24B8, 0x0129, 0x24C4, 0x012A, 0x2497,
+ 0x012B, 0x2492, 0x0131, 0x0092, 0x0134, 0x3DAA, 0x0135, 0x3DB0,
+ 0x0139, 0x3D8D, 0x013A, 0x3D9A, 0x013D, 0x3D7B, 0x013E, 0x3D83,
+ 0x0141, 0x008D, 0x0142, 0x0093, 0x0143, 0x3D92, 0x0144, 0x3DA0,
+ 0x0147, 0x3D93, 0x0148, 0x3DA1, 0x014B, 0x24DC, 0x014C, 0x249A,
+ 0x014D, 0x2495, 0x0150, 0x3D94, 0x0151, 0x3DA2, 0x0152, 0x008F,
+ 0x0153, 0x0095, 0x0154, 0x3D8B, 0x0155, 0x3D98, 0x0158, 0x3D95,
+ 0x0159, 0x3DA3, 0x015A, 0x3D7C, 0x015B, 0x3D84, 0x015C, 0x3DAB,
+ 0x015D, 0x3DB1, 0x015E, 0x3D7D, 0x015F, 0x3D86, 0x0160, 0x00DF,
+ 0x0161, 0x00E3, 0x0162, 0x3D97, 0x0163, 0x3DA5, 0x0164, 0x3D7E,
+ 0x0165, 0x3D87, 0x0168, 0x24BD, 0x0169, 0x24C9, 0x016A, 0x2498,
+ 0x016B, 0x2493, 0x016C, 0x3DAC, 0x016D, 0x3DB2, 0x016E, 0x24BC,
+ 0x016F, 0x24C8, 0x0170, 0x3D96, 0x0171, 0x3DA4, 0x0178, 0x00E0,
+ 0x0179, 0x3D7F, 0x017A, 0x3D88, 0x017B, 0x3D80, 0x017C, 0x3D8A,
+ 0x017D, 0x00E1, 0x017E, 0x00E5, 0x0192, 0x0069, 0x0193, 0x3DD2,
+ 0x01C2, 0x3DCD, 0x01CD, 0x24B2, 0x01CE, 0x24BE, 0x01CF, 0x24B6,
+ 0x01D0, 0x24C2, 0x01D1, 0x24B9, 0x01D2, 0x24C5, 0x01D3, 0x24BB,
+ 0x01D4, 0x24C7, 0x01D6, 0x3D75, 0x01D8, 0x3D76, 0x01DA, 0x3D77,
+ 0x01DC, 0x3D78, 0x01F8, 0x3D73, 0x01F9, 0x3D74, 0x01FD, 0x24CD,
+ 0x0250, 0x3DD8, 0x0251, 0x24CA, 0x0252, 0x3DDC, 0x0253, 0x3DCE,
+ 0x0254, 0x24CF, 0x0255, 0x3DE1, 0x0256, 0x3DBA, 0x0257, 0x3DCF,
+ 0x0258, 0x3DD5, 0x0259, 0x24D2, 0x025A, 0x24D5, 0x025B, 0x24D8,
+ 0x025C, 0x3DD6, 0x025E, 0x3DD7, 0x025F, 0x3DC1, 0x0260, 0x3DD1,
+ 0x0261, 0x3DC5, 0x0262, 0x3E0B, 0x0263, 0x3E0C, 0x0264, 0x3DDB,
+ 0x0265, 0x3DDE, 0x0266, 0x3DCB, 0x0267, 0x3DE4, 0x0268, 0x3DD3,
+ 0x026A, 0x3E0D, 0x026C, 0x3DB6, 0x026D, 0x3DC0, 0x026E, 0x3DB7,
+ 0x026F, 0x3DD9, 0x0270, 0x3DC6, 0x0271, 0x3DB3, 0x0272, 0x3DC2,
+ 0x0273, 0x3DBB, 0x0274, 0x3E0E, 0x0275, 0x24DD, 0x0276, 0x3E0F,
+ 0x0278, 0x3E10, 0x0279, 0x3DB8, 0x027A, 0x3DE3, 0x027B, 0x3DBF,
+ 0x027D, 0x3DBC, 0x027E, 0x3DB5, 0x0280, 0x3E11, 0x0281, 0x3DC7,
+ 0x0282, 0x3DBD, 0x0283, 0x24E2, 0x0284, 0x3DD0, 0x0288, 0x3DB9,
+ 0x0289, 0x3DD4, 0x028A, 0x3DDA, 0x028B, 0x3DB4, 0x028C, 0x24DE,
+ 0x028D, 0x3DDD, 0x028E, 0x3DC4, 0x028F, 0x3E12, 0x0290, 0x3DBE,
+ 0x0291, 0x3DE2, 0x0292, 0x24E1, 0x0294, 0x3DCA, 0x0295, 0x3DC9,
+ 0x0298, 0x3DCC, 0x0299, 0x3E13, 0x029C, 0x3E14, 0x029D, 0x3DC3,
+ 0x029F, 0x3E15, 0x02A1, 0x3DE0, 0x02A2, 0x3DDF, 0x02B0, 0x3E16,
+ 0x02B2, 0x3E17, 0x02B7, 0x3E18, 0x02BB, 0x0062, 0x02BC, 0x0060,
+ 0x02C1, 0x3E19, 0x02C6, 0x0080, 0x02C7, 0x3D85, 0x02C8, 0x3DE6,
+ 0x02CC, 0x3DE7, 0x02D0, 0x24E3, 0x02D1, 0x3DE8, 0x02D8, 0x3D7A,
+ 0x02D9, 0x3DA6, 0x02DA, 0x0085, 0x02DB, 0x3D82, 0x02DC, 0x005F,
+ 0x02DD, 0x3D89, 0x02DE, 0x3DFB, 0x02E0, 0x3E1A, 0x02E1, 0x3E1B,
+ 0x02E5, 0x3DEB, 0x02E6, 0x3DEC, 0x02E7, 0x3DED, 0x02E8, 0x3DEE,
+ 0x02E9, 0x3DEF, 0x0300, 0x0041, 0x0301, 0x007F, 0x0302, 0x0080,
+ 0x0303, 0x005F, 0x0304, 0x0081, 0x0305, 0x00E2, 0x0306, 0x0082,
+ 0x0307, 0x0083, 0x0308, 0x0084, 0x030A, 0x0085, 0x030B, 0x0087,
+ 0x030C, 0x0089, 0x030F, 0x3DEA, 0x0318, 0x3E02, 0x0319, 0x3E03,
+ 0x031A, 0x3E07, 0x031C, 0x3DF5, 0x031D, 0x3E00, 0x031E, 0x3E01,
+ 0x031F, 0x3DF6, 0x0320, 0x3DF7, 0x0324, 0x3DFC, 0x0325, 0x3DF2,
+ 0x0327, 0x0086, 0x0328, 0x0088, 0x0329, 0x3DF9, 0x032A, 0x3E04,
+ 0x032C, 0x3DF3, 0x032F, 0x3DFA, 0x0330, 0x3DFD, 0x0332, 0x0040,
+ 0x0334, 0x3DFF, 0x0336, 0x008A, 0x0339, 0x3DF4, 0x033A, 0x3E05,
+ 0x033B, 0x3E06, 0x033C, 0x3DFE, 0x033D, 0x3DF8, 0x0361, 0x3DE5,
+ 0x0391, 0x03F3, 0x0392, 0x03F4, 0x0393, 0x03F5, 0x0394, 0x03F6,
+ 0x0395, 0x03F7, 0x0396, 0x03F8, 0x0397, 0x03F9, 0x0398, 0x03FA,
+ 0x0399, 0x03FB, 0x039A, 0x03FC, 0x039B, 0x03FD, 0x039C, 0x03FE,
+ 0x039D, 0x03FF, 0x039E, 0x0400, 0x039F, 0x0401, 0x03A0, 0x0402,
+ 0x03A1, 0x0403, 0x03A3, 0x0404, 0x03A4, 0x0405, 0x03A5, 0x0406,
+ 0x03A6, 0x0407, 0x03A7, 0x0408, 0x03A8, 0x0409, 0x03A9, 0x040A,
+ 0x03B1, 0x040B, 0x03B2, 0x040C, 0x03B3, 0x040D, 0x03B4, 0x040E,
+ 0x03B5, 0x040F, 0x03B6, 0x0410, 0x03B7, 0x0411, 0x03B8, 0x0412,
+ 0x03B9, 0x0413, 0x03BA, 0x0414, 0x03BB, 0x0415, 0x03BC, 0x0416,
+ 0x03BD, 0x0417, 0x03BE, 0x0418, 0x03BF, 0x0419, 0x03C0, 0x041A,
+ 0x03C1, 0x041B, 0x03C2, 0x3F5E, 0x03C3, 0x041C, 0x03C4, 0x041D,
+ 0x03C5, 0x041E, 0x03C6, 0x041F, 0x03C7, 0x0420, 0x03C8, 0x0421,
+ 0x03C9, 0x0422, 0x03D0, 0x2F3A, 0x03D1, 0x2F40, 0x03D5, 0x2F3E,
+ 0x03DB, 0x2F3F, 0x0401, 0x0429, 0x0410, 0x0423, 0x0411, 0x0424,
+ 0x0412, 0x0425, 0x0413, 0x0426, 0x0414, 0x0427, 0x0415, 0x0428,
+ 0x0416, 0x042A, 0x0417, 0x042B, 0x0418, 0x042C, 0x0419, 0x042D,
+ 0x041A, 0x042E, 0x041B, 0x042F, 0x041C, 0x0430, 0x041D, 0x0431,
+ 0x041E, 0x0432, 0x041F, 0x0433, 0x0420, 0x0434, 0x0421, 0x0435,
+ 0x0422, 0x0436, 0x0423, 0x0437, 0x0424, 0x0438, 0x0425, 0x0439,
+ 0x0426, 0x043A, 0x0427, 0x043B, 0x0428, 0x043C, 0x0429, 0x043D,
+ 0x042A, 0x043E, 0x042B, 0x043F, 0x042C, 0x0440, 0x042D, 0x0441,
+ 0x042E, 0x0442, 0x042F, 0x0443, 0x0430, 0x0444, 0x0431, 0x0445,
+ 0x0432, 0x0446, 0x0433, 0x0447, 0x0434, 0x0448, 0x0435, 0x0449,
+ 0x0436, 0x044B, 0x0437, 0x044C, 0x0438, 0x044D, 0x0439, 0x044E,
+ 0x043A, 0x044F, 0x043B, 0x0450, 0x043C, 0x0451, 0x043D, 0x0452,
+ 0x043E, 0x0453, 0x043F, 0x0454, 0x0440, 0x0455, 0x0441, 0x0456,
+ 0x0442, 0x0457, 0x0443, 0x0458, 0x0444, 0x0459, 0x0445, 0x045A,
+ 0x0446, 0x045B, 0x0447, 0x045C, 0x0448, 0x045D, 0x0449, 0x045E,
+ 0x044A, 0x045F, 0x044B, 0x0460, 0x044C, 0x0461, 0x044D, 0x0462,
+ 0x044E, 0x0463, 0x044F, 0x0464, 0x0451, 0x044A, 0x1E3E, 0x3D71,
+ 0x1E3F, 0x3D72, 0x1EBC, 0x24B5, 0x1EBD, 0x24C1, 0x1F70, 0x24CC,
+ 0x1F71, 0x24CB, 0x1F72, 0x24DA, 0x1F73, 0x24D9, 0x2002, 0x00E7,
+ 0x2003, 0x0279, 0x2010, 0x0296, 0x2011, 0x000E, 0x2012, 0x0072,
+ 0x2013, 0x0072, 0x2014, 0x008A, 0x2015, 0x0295, 0x2016, 0x029A,
+ 0x2018, 0x0062, 0x2019, 0x0060, 0x201A, 0x0078, 0x201C, 0x006C,
+ 0x201D, 0x007A, 0x201E, 0x0079, 0x2020, 0x0308, 0x2021, 0x0309,
+ 0x2022, 0x0077, 0x2025, 0x029D, 0x2026, 0x029C, 0x2030, 0x0304,
+ 0x2032, 0x02C4, 0x2033, 0x02C5, 0x2039, 0x006E, 0x203A, 0x006F,
+ 0x203B, 0x02DE, 0x203C, 0x2F4F, 0x203E, 0x00E2, 0x203F, 0x3DE9,
+ 0x2042, 0x3F9A, 0x2044, 0x0068, 0x2047, 0x3F96, 0x2048, 0x3F97,
+ 0x2049, 0x2F50, 0x2051, 0x3F99, 0x2070, 0x24A1, 0x2074, 0x24A2,
+ 0x2075, 0x24A3, 0x2076, 0x24A4, 0x2077, 0x24A5, 0x2078, 0x24A6,
+ 0x2079, 0x24A7, 0x2080, 0x24A8, 0x2081, 0x24A9, 0x2082, 0x24AA,
+ 0x2083, 0x24AB, 0x2084, 0x24AC, 0x2085, 0x24AD, 0x2086, 0x24AE,
+ 0x2087, 0x24AF, 0x2088, 0x24B0, 0x2089, 0x24B1, 0x20AC, 0x248A,
+ 0x20DD, 0x3FC8, 0x20DE, 0x2B1B, 0x2100, 0x2E4F, 0x2103, 0x02C6,
+ 0x2105, 0x2E53, 0x2109, 0x2071, 0x210A, 0x2070, 0x210F, 0x2F3C,
+ 0x2113, 0x1F59, 0x2116, 0x1DBA, 0x2121, 0x1F77, 0x2122, 0x00E4,
+ 0x2126, 0x248B, 0x2127, 0x3C9B, 0x212B, 0x0303, 0x2135, 0x2F39,
+ 0x213B, 0x2073, 0x2153, 0x249F, 0x2154, 0x24A0, 0x2155, 0x3D6F,
+ 0x2156, 0x2639, 0x2157, 0x263A, 0x2158, 0x263B, 0x2159, 0x263C,
+ 0x215A, 0x263D, 0x215B, 0x249B, 0x215C, 0x249C, 0x215D, 0x249D,
+ 0x215E, 0x249E, 0x2160, 0x1D97, 0x2161, 0x1D98, 0x2162, 0x1D99,
+ 0x2163, 0x1D9A, 0x2164, 0x1D9B, 0x2165, 0x1D9C, 0x2166, 0x1D9D,
+ 0x2167, 0x1D9E, 0x2168, 0x1D9F, 0x2169, 0x1DA0, 0x216A, 0x2021,
+ 0x216B, 0x2022, 0x2170, 0x1F9C, 0x2171, 0x1F9D, 0x2172, 0x1F9E,
+ 0x2173, 0x1F9F, 0x2174, 0x1FA0, 0x2175, 0x1FA1, 0x2176, 0x1FA2,
+ 0x2177, 0x1FA3, 0x2178, 0x1FA4, 0x2179, 0x1FA5, 0x217A, 0x206A,
+ 0x217B, 0x206B, 0x217F, 0x206F, 0x2190, 0x02E1, 0x2191, 0x02E2,
+ 0x2192, 0x02E0, 0x2193, 0x02E3, 0x2194, 0x2FA9, 0x2196, 0x2FAC,
+ 0x2197, 0x2FAD, 0x2198, 0x2FAA, 0x2199, 0x2FAB, 0x21C4, 0x2076,
+ 0x21C5, 0x2077, 0x21C6, 0x2075, 0x21CB, 0x2FAF, 0x21CC, 0x2FAE,
+ 0x21D0, 0x2FA8, 0x21D2, 0x02F0, 0x21D4, 0x02F1, 0x21E6, 0x1F4D,
+ 0x21E7, 0x1F4C, 0x21E8, 0x1F4E, 0x21E9, 0x1F4B, 0x2200, 0x02F2,
+ 0x2202, 0x02F7, 0x2203, 0x02F3, 0x2205, 0x2F98, 0x2207, 0x02F8,
+ 0x2208, 0x02E5, 0x2209, 0x3C74, 0x220A, 0x2F3B, 0x220B, 0x02E6,
+ 0x2211, 0x1DC9, 0x2212, 0x02B5, 0x2213, 0x2F56, 0x2219, 0x0075,
+ 0x221A, 0x02FD, 0x221D, 0x02FF, 0x221E, 0x02BF, 0x221F, 0x1DCD,
+ 0x2220, 0x02F4, 0x2225, 0x3C81, 0x2226, 0x3C82, 0x2227, 0x02ED,
+ 0x2228, 0x02EE, 0x2229, 0x02EC, 0x222A, 0x02EB, 0x222B, 0x0301,
+ 0x222C, 0x0302, 0x222D, 0x2003, 0x222E, 0x1DC8, 0x2234, 0x02C0,
+ 0x2235, 0x0300, 0x223C, 0x0064, 0x223D, 0x02FE, 0x2243, 0x2F58,
+ 0x2245, 0x3C93, 0x2248, 0x3C94, 0x2252, 0x02FA, 0x2260, 0x02BA,
+ 0x2261, 0x02F9, 0x2262, 0x3C91, 0x2266, 0x02BD, 0x2267, 0x02BE,
+ 0x226A, 0x02FB, 0x226B, 0x02FC, 0x2272, 0x2F59, 0x2273, 0x2F5A,
+ 0x2276, 0x3C95, 0x2277, 0x3C96, 0x2282, 0x02E9, 0x2283, 0x02EA,
+ 0x2284, 0x3C70, 0x2285, 0x3C71, 0x2286, 0x02E7, 0x2287, 0x02E8,
+ 0x228A, 0x3C72, 0x228B, 0x3C73, 0x2295, 0x2F9C, 0x2296, 0x2F9A,
+ 0x2297, 0x2F9D, 0x2298, 0x2F9B, 0x229E, 0x3E22, 0x22A0, 0x2F99,
+ 0x22A5, 0x02F5, 0x22BF, 0x1DCE, 0x22DA, 0x3D6D, 0x22DB, 0x3D6E,
+ 0x2305, 0x3C76, 0x2306, 0x3C77, 0x2307, 0x2FBB, 0x2312, 0x02F6,
+ 0x2318, 0x3D70, 0x239B, 0x2F6F, 0x239C, 0x2F87, 0x239D, 0x2F70,
+ 0x239E, 0x2F71, 0x239F, 0x2F87, 0x23A0, 0x2F72, 0x23A1, 0x2F77,
+ 0x23A2, 0x2F87, 0x23A3, 0x2F78, 0x23A4, 0x2F79, 0x23A5, 0x2F87,
+ 0x23A6, 0x2F7A, 0x23A7, 0x1FF2, 0x23A8, 0x1FF3, 0x23A9, 0x1FF4,
+ 0x23AA, 0x2F87, 0x23AB, 0x1FEE, 0x23AC, 0x1FEF, 0x23AD, 0x1FF0,
+ 0x23B0, 0x3FB8, 0x23B1, 0x3FB9, 0x23BE, 0x3F7D, 0x23BF, 0x3F7E,
+ 0x23C0, 0x3F7F, 0x23C1, 0x3F80, 0x23C2, 0x3F81, 0x23C3, 0x3F82,
+ 0x23C4, 0x3F83, 0x23C5, 0x3F84, 0x23C6, 0x3F85, 0x23C7, 0x3F86,
+ 0x23C8, 0x3F87, 0x23C9, 0x3F88, 0x23CA, 0x3F89, 0x23CB, 0x3F8A,
+ 0x23CC, 0x3F8B, 0x23CE, 0x3F91, 0x2423, 0x3F90, 0x2460, 0x1D83,
+ 0x2461, 0x1D84, 0x2462, 0x1D85, 0x2463, 0x1D86, 0x2464, 0x1D87,
+ 0x2465, 0x1D88, 0x2466, 0x1D89, 0x2467, 0x1D8A, 0x2468, 0x1D8B,
+ 0x2469, 0x1D8C, 0x246A, 0x1D8D, 0x246B, 0x1D8E, 0x246C, 0x1D8F,
+ 0x246D, 0x1D90, 0x246E, 0x1D91, 0x246F, 0x1D92, 0x2470, 0x1D93,
+ 0x2471, 0x1D94, 0x2472, 0x1D95, 0x2473, 0x1D96, 0x2474, 0x1F87,
+ 0x2475, 0x1F88, 0x2476, 0x1F89, 0x2477, 0x1F8A, 0x2478, 0x1F8B,
+ 0x2479, 0x1F8C, 0x247A, 0x1F8D, 0x247B, 0x1F8E, 0x247C, 0x1F8F,
+ 0x247D, 0x1F90, 0x247E, 0x1F91, 0x247F, 0x1F92, 0x2480, 0x1F93,
+ 0x2481, 0x1F94, 0x2482, 0x1F95, 0x2483, 0x1F96, 0x2484, 0x1F97,
+ 0x2485, 0x1F98, 0x2486, 0x1F99, 0x2487, 0x1F9A, 0x2488, 0x1F7E,
+ 0x2489, 0x1F7F, 0x248A, 0x1F80, 0x248B, 0x1F81, 0x248C, 0x1F82,
+ 0x248D, 0x1F83, 0x248E, 0x1F84, 0x248F, 0x1F85, 0x2490, 0x1F86,
+ 0x249C, 0x1FB0, 0x249D, 0x1FB1, 0x249E, 0x1FB2, 0x249F, 0x1FB3,
+ 0x24A0, 0x1FB4, 0x24A1, 0x1FB5, 0x24A2, 0x1FB6, 0x24A3, 0x1FB7,
+ 0x24A4, 0x1FB8, 0x24A5, 0x1FB9, 0x24A6, 0x1FBA, 0x24A7, 0x1FBB,
+ 0x24A8, 0x1FBC, 0x24A9, 0x1FBD, 0x24AA, 0x1FBE, 0x24AB, 0x1FBF,
+ 0x24AC, 0x1FC0, 0x24AD, 0x1FC1, 0x24AE, 0x1FC2, 0x24AF, 0x1FC3,
+ 0x24B0, 0x1FC4, 0x24B1, 0x1FC5, 0x24B2, 0x1FC6, 0x24B3, 0x1FC7,
+ 0x24B4, 0x1FC8, 0x24B5, 0x1FC9, 0x24B6, 0x2863, 0x24B7, 0x2864,
+ 0x24B8, 0x2865, 0x24B9, 0x2866, 0x24BA, 0x2867, 0x24BB, 0x2868,
+ 0x24BC, 0x2869, 0x24BD, 0x286A, 0x24BE, 0x286B, 0x24BF, 0x286C,
+ 0x24C0, 0x286D, 0x24C1, 0x286E, 0x24C2, 0x286F, 0x24C3, 0x2870,
+ 0x24C4, 0x2871, 0x24C5, 0x2872, 0x24C6, 0x2873, 0x24C7, 0x2874,
+ 0x24C8, 0x2875, 0x24C9, 0x2876, 0x24CA, 0x2877, 0x24CB, 0x2878,
+ 0x24CC, 0x2879, 0x24CD, 0x287A, 0x24CE, 0x287B, 0x24CF, 0x287C,
+ 0x24D0, 0x2849, 0x24D1, 0x284A, 0x24D2, 0x284B, 0x24D3, 0x284C,
+ 0x24D4, 0x284D, 0x24D5, 0x284E, 0x24D6, 0x284F, 0x24D7, 0x2850,
+ 0x24D8, 0x2851, 0x24D9, 0x2852, 0x24DA, 0x2853, 0x24DB, 0x2854,
+ 0x24DC, 0x2855, 0x24DD, 0x2856, 0x24DE, 0x2857, 0x24DF, 0x2858,
+ 0x24E0, 0x2859, 0x24E1, 0x285A, 0x24E2, 0x285B, 0x24E3, 0x285C,
+ 0x24E4, 0x285D, 0x24E5, 0x285E, 0x24E6, 0x285F, 0x24E7, 0x2860,
+ 0x24E8, 0x2861, 0x24E9, 0x2862, 0x24EA, 0x2020, 0x24EB, 0x2913,
+ 0x24EC, 0x2914, 0x24ED, 0x2915, 0x24EE, 0x2916, 0x24EF, 0x2917,
+ 0x24F0, 0x2918, 0x24F1, 0x2919, 0x24F2, 0x291A, 0x24F3, 0x291B,
+ 0x24F4, 0x291C, 0x24F5, 0x3F5F, 0x24F6, 0x3F60, 0x24F7, 0x3F61,
+ 0x24F8, 0x3F62, 0x24F9, 0x3F63, 0x24FA, 0x3F64, 0x24FB, 0x3F65,
+ 0x24FC, 0x3F66, 0x24FD, 0x3F67, 0x24FE, 0x3F68, 0x24FF, 0x2907,
+ 0x2500, 0x1D37, 0x2501, 0x1D38, 0x2502, 0x1D39, 0x2503, 0x1D3A,
+ 0x2504, 0x1D3B, 0x2505, 0x1D3C, 0x2506, 0x1D3D, 0x2507, 0x1D3E,
+ 0x2508, 0x1D3F, 0x2509, 0x1D40, 0x250A, 0x1D41, 0x250B, 0x1D42,
+ 0x250C, 0x1D43, 0x250D, 0x1D44, 0x250E, 0x1D45, 0x250F, 0x1D46,
+ 0x2510, 0x1D47, 0x2511, 0x1D48, 0x2512, 0x1D49, 0x2513, 0x1D4A,
+ 0x2514, 0x1D4B, 0x2515, 0x1D4C, 0x2516, 0x1D4D, 0x2517, 0x1D4E,
+ 0x2518, 0x1D4F, 0x2519, 0x1D50, 0x251A, 0x1D51, 0x251B, 0x1D52,
+ 0x251C, 0x1D53, 0x251D, 0x1D54, 0x251E, 0x1D55, 0x251F, 0x1D56,
+ 0x2520, 0x1D57, 0x2521, 0x1D58, 0x2522, 0x1D59, 0x2523, 0x1D5A,
+ 0x2524, 0x1D5B, 0x2525, 0x1D5C, 0x2526, 0x1D5D, 0x2527, 0x1D5E,
+ 0x2528, 0x1D5F, 0x2529, 0x1D60, 0x252A, 0x1D61, 0x252B, 0x1D62,
+ 0x252C, 0x1D63, 0x252D, 0x1D64, 0x252E, 0x1D65, 0x252F, 0x1D66,
+ 0x2530, 0x1D67, 0x2531, 0x1D68, 0x2532, 0x1D69, 0x2533, 0x1D6A,
+ 0x2534, 0x1D6B, 0x2535, 0x1D6C, 0x2536, 0x1D6D, 0x2537, 0x1D6E,
+ 0x2538, 0x1D6F, 0x2539, 0x1D70, 0x253A, 0x1D71, 0x253B, 0x1D72,
+ 0x253C, 0x1D73, 0x253D, 0x1D74, 0x253E, 0x1D75, 0x253F, 0x1D76,
+ 0x2540, 0x1D77, 0x2541, 0x1D78, 0x2542, 0x1D79, 0x2543, 0x1D7A,
+ 0x2544, 0x1D7B, 0x2545, 0x1D7C, 0x2546, 0x1D7D, 0x2547, 0x1D7E,
+ 0x2548, 0x1D7F, 0x2549, 0x1D80, 0x254A, 0x1D81, 0x254B, 0x1D82,
+ 0x2550, 0x203B, 0x255E, 0x203C, 0x2561, 0x203E, 0x256A, 0x203D,
+ 0x256D, 0x2037, 0x256E, 0x2038, 0x256F, 0x203A, 0x2570, 0x2039,
+ 0x2571, 0x2045, 0x2572, 0x2046, 0x2573, 0x2047, 0x2581, 0x2026,
+ 0x2582, 0x2027, 0x2583, 0x2028, 0x2584, 0x2029, 0x2585, 0x202A,
+ 0x2586, 0x202B, 0x2587, 0x202C, 0x2588, 0x202D, 0x2589, 0x2034,
+ 0x258A, 0x2033, 0x258B, 0x2032, 0x258C, 0x2031, 0x258D, 0x2030,
+ 0x258E, 0x202F, 0x258F, 0x202E, 0x2594, 0x2035, 0x2595, 0x2036,
+ 0x25A0, 0x02D9, 0x25A1, 0x02D8, 0x25A2, 0x1F4F, 0x25AA, 0x2FCF,
+ 0x25AB, 0x2FCD, 0x25B1, 0x3F6B, 0x25B2, 0x02DB, 0x25B3, 0x02DA,
+ 0x25B6, 0x2FA3, 0x25B7, 0x1F4A, 0x25BC, 0x02DD, 0x25BD, 0x02DC,
+ 0x25C0, 0x2FA2, 0x25C1, 0x1F49, 0x25C6, 0x02D7, 0x25C7, 0x02D6,
+ 0x25C9, 0x2012, 0x25CB, 0x02D3, 0x25CC, 0x2906, 0x25CE, 0x02D5,
+ 0x25CF, 0x02D4, 0x25D0, 0x3F92, 0x25D1, 0x3F93, 0x25D2, 0x3F94,
+ 0x25D3, 0x3F95, 0x25E2, 0x203F, 0x25E3, 0x2040, 0x25E4, 0x2042,
+ 0x25E5, 0x2041, 0x25E6, 0x2FDE, 0x25EF, 0x030B, 0x2600, 0x2017,
+ 0x2601, 0x2018, 0x2602, 0x2019, 0x2603, 0x201A, 0x2605, 0x02D2,
+ 0x2606, 0x02D1, 0x260E, 0x1F78, 0x2616, 0x3F69, 0x2617, 0x3F6A,
+ 0x261C, 0x201C, 0x261D, 0x201D, 0x261E, 0x201B, 0x261F, 0x201E,
+ 0x2640, 0x02C2, 0x2642, 0x02C1, 0x2660, 0x2013, 0x2661, 0x1F51,
+ 0x2662, 0x1F53, 0x2663, 0x2015, 0x2664, 0x1F52, 0x2665, 0x2014,
+ 0x2666, 0x2016, 0x2667, 0x1F50, 0x2668, 0x2F42, 0x2669, 0x2F43,
+ 0x266A, 0x0307, 0x266B, 0x3F48, 0x266C, 0x2F44, 0x266D, 0x0306,
+ 0x266E, 0x3F47, 0x266F, 0x0305, 0x2672, 0x3FBA, 0x2673, 0x3FBB,
+ 0x2674, 0x3FBC, 0x2675, 0x3FBD, 0x2676, 0x3FBE, 0x2677, 0x3FBF,
+ 0x2678, 0x3FC0, 0x2679, 0x3FC1, 0x267A, 0x3FC2, 0x267B, 0x3FC3,
+ 0x267C, 0x3FC4, 0x267D, 0x3FC5, 0x26A0, 0x2FA0, 0x2702, 0x2F90,
+ 0x2713, 0x3F8E, 0x271A, 0x2FD1, 0x273F, 0x2FC5, 0x2740, 0x2FC4,
+ 0x2756, 0x2FE3, 0x2776, 0x205E, 0x2777, 0x205F, 0x2778, 0x2060,
+ 0x2779, 0x2061, 0x277A, 0x2062, 0x277B, 0x2063, 0x277C, 0x2064,
+ 0x277D, 0x2065, 0x277E, 0x2066, 0x277F, 0x2912, 0x27A1, 0x200E,
+ 0x2934, 0x3F49, 0x2935, 0x3F4A, 0x29BF, 0x3F4B, 0x29FA, 0x3F4F,
+ 0x29FB, 0x3F50, 0x2B05, 0x200F, 0x2B06, 0x2010, 0x2B07, 0x2011,
+ 0x2E83, 0x37E1, 0x2E85, 0x3620, 0x2E87, 0x3719, 0x2E89, 0x3814,
+ 0x2E8B, 0x371E, 0x2E8C, 0x3609, 0x2E8D, 0x360A, 0x2E8E, 0x1071,
+ 0x2E8F, 0x388C, 0x2E90, 0x1226, 0x2E92, 0x0EB2, 0x2E93, 0x1283,
+ 0x2E94, 0x12AB, 0x2E95, 0x3C1F, 0x2E96, 0x38C2, 0x2E97, 0x361C,
+ 0x2E98, 0x38E1, 0x2E99, 0x13C3, 0x2E9B, 0x13E1, 0x2E9E, 0x45E5,
+ 0x2E9F, 0x0E3C, 0x2EA0, 0x0EBD, 0x2EA1, 0x3961, 0x2EA2, 0x3962,
+ 0x2EA3, 0x399D, 0x2EA4, 0x3C26, 0x2EA6, 0x374D, 0x2EA8, 0x39BC,
+ 0x2EA9, 0x35A1, 0x2EAA, 0x36AB, 0x2EAB, 0x3A97, 0x2EAC, 0x4ABA,
+ 0x2EAD, 0x3A39, 0x2EAE, 0x3662, 0x2EB1, 0x3A98, 0x2EB2, 0x3A97,
+ 0x2EB3, 0x376D, 0x2EB7, 0x36FE, 0x2EB9, 0x3713, 0x2EBC, 0x35B3,
+ 0x2EBD, 0x354E, 0x2EBE, 0x3775, 0x2EBF, 0x3776, 0x2EC0, 0x3777,
+ 0x2EC1, 0x078B, 0x2EC2, 0x3B0A, 0x2EC3, 0x362E, 0x2EC4, 0x0A62,
+ 0x2EC6, 0x3572, 0x2ECA, 0x364A, 0x2ECC, 0x3C2B, 0x2ECD, 0x3B50,
+ 0x2ECF, 0x3B9E, 0x2ED1, 0x0BD5, 0x2ED2, 0x3B97, 0x2ED6, 0x3B9E,
+ 0x2ED7, 0x354D, 0x2ED8, 0x0A68, 0x2EDD, 0x3617, 0x2EDE, 0x3619,
+ 0x2EDF, 0x3618, 0x2EE4, 0x064E, 0x2EE8, 0x0D34, 0x2EE9, 0x052B,
+ 0x2EEB, 0x0A6A, 0x2EED, 0x08C3, 0x2EEF, 0x0F7D, 0x2EF2, 0x064F,
+ 0x2F00, 0x04B0, 0x2F01, 0x20B3, 0x2F02, 0x0FFF, 0x2F03, 0x1001,
+ 0x2F04, 0x0535, 0x2F05, 0x1006, 0x2F06, 0x0CCB, 0x2F07, 0x100E,
+ 0x2F08, 0x0A13, 0x2F09, 0x1070, 0x2F0A, 0x0CD6, 0x2F0B, 0x0D40,
+ 0x2F0C, 0x107B, 0x2F0D, 0x1083, 0x2F0E, 0x1089, 0x2F0F, 0x1093,
+ 0x2F10, 0x1098, 0x2F11, 0x0C5B, 0x2F12, 0x0F97, 0x2F13, 0x10C6,
+ 0x2F14, 0x10CD, 0x2F15, 0x10CE, 0x2F16, 0x10D3, 0x2F17, 0x0947,
+ 0x2F18, 0x0E7C, 0x2F19, 0x10DC, 0x2F1A, 0x10E1, 0x2F1B, 0x10E8,
+ 0x2F1C, 0x0EA2, 0x2F1D, 0x07B1, 0x2F1E, 0x116B, 0x2F1F, 0x0C54,
+ 0x2F20, 0x089C, 0x2F21, 0x11BA, 0x2F22, 0x11BB, 0x2F23, 0x0F26,
+ 0x2F24, 0x0B47, 0x2F25, 0x0981, 0x2F26, 0x08A0, 0x2F27, 0x120E,
+ 0x2F28, 0x0A47, 0x2F29, 0x0996, 0x2F2A, 0x1226, 0x2F2B, 0x1228,
+ 0x2F2C, 0x1232, 0x2F2D, 0x0881, 0x2F2E, 0x126C, 0x2F2F, 0x07BB,
+ 0x2F30, 0x077E, 0x2F31, 0x06CA, 0x2F32, 0x05EF, 0x2F33, 0x1283,
+ 0x2F34, 0x1285, 0x2F35, 0x1299, 0x2F36, 0x129B, 0x2F37, 0x12A0,
+ 0x2F38, 0x0677, 0x2F39, 0x38B9, 0x2F3A, 0x12AF, 0x2F3B, 0x12B1,
+ 0x2F3C, 0x09FA, 0x2F3D, 0x1342, 0x2F3E, 0x0781, 0x2F3F, 0x0916,
+ 0x2F40, 0x08A7, 0x2F41, 0x13C2, 0x2F42, 0x0E08, 0x2F43, 0x0C47,
+ 0x2F44, 0x06CC, 0x2F45, 0x0E4D, 0x2F46, 0x13E0, 0x2F47, 0x0CD4,
+ 0x2F48, 0x140C, 0x2F49, 0x0744, 0x2F4A, 0x0EE6, 0x2F4B, 0x073D,
+ 0x2F4C, 0x08AD, 0x2F4D, 0x14E5, 0x2F4E, 0x14F4, 0x2F4F, 0x14F8,
+ 0x2F50, 0x0D7A, 0x2F51, 0x0EDF, 0x2F52, 0x08AF, 0x2F53, 0x1502,
+ 0x2F54, 0x0A2B, 0x2F55, 0x0550, 0x2F56, 0x0BFA, 0x2F57, 0x0DD5,
+ 0x2F58, 0x15E4, 0x2F59, 0x15E6, 0x2F5A, 0x0E22, 0x2F5B, 0x0567,
+ 0x2F5C, 0x0687, 0x2F5D, 0x0758, 0x2F5E, 0x0770, 0x2F5F, 0x06C4,
+ 0x2F60, 0x04DD, 0x2F61, 0x05E0, 0x2F62, 0x0601, 0x2F63, 0x0A5C,
+ 0x2F64, 0x0F3B, 0x2F65, 0x0C3E, 0x2F66, 0x0D97, 0x2F67, 0x3A00,
+ 0x2F68, 0x1697, 0x2F69, 0x0D28, 0x2F6A, 0x0D7D, 0x2F6B, 0x087C,
+ 0x2F6C, 0x0EE8, 0x2F6D, 0x0EC3, 0x2F6E, 0x0EFC, 0x2F6F, 0x0A74,
+ 0x2F70, 0x08D4, 0x2F71, 0x3A41, 0x2F72, 0x0553, 0x2F73, 0x0740,
+ 0x2F74, 0x0F71, 0x2F75, 0x0B9B, 0x2F76, 0x0E16, 0x2F77, 0x08B3,
+ 0x2F78, 0x0608, 0x2F79, 0x1813, 0x2F7A, 0x0F3D, 0x2F7B, 0x04CB,
+ 0x2F7C, 0x0FDD, 0x2F7D, 0x08D5, 0x2F7E, 0x183D, 0x2F7F, 0x08D6,
+ 0x2F80, 0x1853, 0x2F81, 0x0CD1, 0x2F82, 0x0A09, 0x2F83, 0x08D7,
+ 0x2F84, 0x08B8, 0x2F85, 0x04D3, 0x2F86, 0x0A89, 0x2F87, 0x0AA6,
+ 0x2F88, 0x0938, 0x2F89, 0x0821, 0x2F8A, 0x09ED, 0x2F8B, 0x18B2,
+ 0x2F8C, 0x194F, 0x2F8D, 0x0BAC, 0x2F8E, 0x0742, 0x2F8F, 0x07E6,
+ 0x2F90, 0x04A5, 0x2F91, 0x19EB, 0x2F92, 0x075F, 0x2F93, 0x05AF,
+ 0x2F94, 0x0774, 0x2F95, 0x0B69, 0x2F96, 0x0C7E, 0x2F97, 0x1A56,
+ 0x2F98, 0x1A59, 0x2F99, 0x058B, 0x2F9A, 0x0A7A, 0x2F9B, 0x0AF8,
+ 0x2F9C, 0x0B0D, 0x2F9D, 0x0A0E, 0x2F9E, 0x0902, 0x2F9F, 0x0A0F,
+ 0x2FA0, 0x0B62, 0x2FA1, 0x3B4F, 0x2FA2, 0x0F22, 0x2FA3, 0x0CAB,
+ 0x2FA4, 0x0D64, 0x2FA5, 0x0F6C, 0x2FA6, 0x06DA, 0x2FA7, 0x0BD5,
+ 0x2FA8, 0x0EF3, 0x2FA9, 0x0DDE, 0x2FAA, 0x1BC9, 0x2FAB, 0x1BCB,
+ 0x2FAC, 0x04CD, 0x2FAD, 0x21F7, 0x2FAE, 0x0D87, 0x2FAF, 0x0ED8,
+ 0x2FB0, 0x05B5, 0x2FB1, 0x1C03, 0x2FB2, 0x1C05, 0x2FB3, 0x053B,
+ 0x2FB4, 0x0E17, 0x2FB5, 0x0DE9, 0x2FB6, 0x0D88, 0x2FB7, 0x09EF,
+ 0x2FB8, 0x091F, 0x2FB9, 0x07F3, 0x2FBA, 0x0D05, 0x2FBB, 0x080E,
+ 0x2FBC, 0x07F4, 0x2FBD, 0x1C6C, 0x2FBE, 0x1C7D, 0x2FBF, 0x1C83,
+ 0x2FC0, 0x1C84, 0x2FC1, 0x064E, 0x2FC2, 0x0695, 0x2FC3, 0x0BD7,
+ 0x2FC4, 0x1CF6, 0x2FC5, 0x08DB, 0x2FC6, 0x1D01, 0x2FC7, 0x0E91,
+ 0x2FC8, 0x340B, 0x2FC9, 0x066A, 0x2FCA, 0x0807, 0x2FCB, 0x1D16,
+ 0x2FCC, 0x1D19, 0x2FCD, 0x0C1E, 0x2FCE, 0x0791, 0x2FCF, 0x0ACF,
+ 0x2FD0, 0x0D93, 0x2FD1, 0x1D21, 0x2FD2, 0x1D22, 0x2FD3, 0x0F7E,
+ 0x2FD4, 0x1D30, 0x2FD5, 0x1D31, 0x3000, 0x0279, 0x3001, 0x027A,
+ 0x3002, 0x027B, 0x3003, 0x028F, 0x3004, 0x2074, 0x3005, 0x0291,
+ 0x3006, 0x0292, 0x3007, 0x0293, 0x3008, 0x02AA, 0x3009, 0x02AB,
+ 0x300A, 0x02AC, 0x300B, 0x02AD, 0x300C, 0x02AE, 0x300D, 0x02AF,
+ 0x300E, 0x02B0, 0x300F, 0x02B1, 0x3010, 0x02B2, 0x3011, 0x02B3,
+ 0x3012, 0x02DF, 0x3013, 0x02E4, 0x3014, 0x02A4, 0x3015, 0x02A5,
+ 0x3016, 0x3F45, 0x3017, 0x3F46, 0x3018, 0x2F61, 0x3019, 0x2F62,
+ 0x301C, 0x0299, 0x301D, 0x1DB8, 0x301F, 0x1DB9, 0x3020, 0x1F7A,
+ 0x3030, 0x2FBA, 0x3033, 0x2F4C, 0x3034, 0x2F4D, 0x3035, 0x2F4E,
+ 0x3036, 0x1F79, 0x303B, 0x2F4A, 0x303C, 0x3F42, 0x303D, 0x2F93,
+ 0x3041, 0x034A, 0x3042, 0x034B, 0x3043, 0x034C, 0x3044, 0x034D,
+ 0x3045, 0x034E, 0x3046, 0x034F, 0x3047, 0x0350, 0x3048, 0x0351,
+ 0x3049, 0x0352, 0x304A, 0x0353, 0x304B, 0x0354, 0x304C, 0x0355,
+ 0x304D, 0x0356, 0x304E, 0x0357, 0x304F, 0x0358, 0x3050, 0x0359,
+ 0x3051, 0x035A, 0x3052, 0x035B, 0x3053, 0x035C, 0x3054, 0x035D,
+ 0x3055, 0x035E, 0x3056, 0x035F, 0x3057, 0x0360, 0x3058, 0x0361,
+ 0x3059, 0x0362, 0x305A, 0x0363, 0x305B, 0x0364, 0x305C, 0x0365,
+ 0x305D, 0x0366, 0x305E, 0x0367, 0x305F, 0x0368, 0x3060, 0x0369,
+ 0x3061, 0x036A, 0x3062, 0x036B, 0x3063, 0x036C, 0x3064, 0x036D,
+ 0x3065, 0x036E, 0x3066, 0x036F, 0x3067, 0x0370, 0x3068, 0x0371,
+ 0x3069, 0x0372, 0x306A, 0x0373, 0x306B, 0x0374, 0x306C, 0x0375,
+ 0x306D, 0x0376, 0x306E, 0x0377, 0x306F, 0x0378, 0x3070, 0x0379,
+ 0x3071, 0x037A, 0x3072, 0x037B, 0x3073, 0x037C, 0x3074, 0x037D,
+ 0x3075, 0x037E, 0x3076, 0x037F, 0x3077, 0x0380, 0x3078, 0x0381,
+ 0x3079, 0x0382, 0x307A, 0x0383, 0x307B, 0x0384, 0x307C, 0x0385,
+ 0x307D, 0x0386, 0x307E, 0x0387, 0x307F, 0x0388, 0x3080, 0x0389,
+ 0x3081, 0x038A, 0x3082, 0x038B, 0x3083, 0x038C, 0x3084, 0x038D,
+ 0x3085, 0x038E, 0x3086, 0x038F, 0x3087, 0x0390, 0x3088, 0x0391,
+ 0x3089, 0x0392, 0x308A, 0x0393, 0x308B, 0x0394, 0x308C, 0x0395,
+ 0x308D, 0x0396, 0x308E, 0x0397, 0x308F, 0x0398, 0x3090, 0x0399,
+ 0x3091, 0x039A, 0x3092, 0x039B, 0x3093, 0x039C, 0x3094, 0x1F16,
+ 0x3095, 0x1F17, 0x3096, 0x1F18, 0x3099, 0x3FC6, 0x309A, 0x3FC7,
+ 0x309B, 0x0283, 0x309C, 0x0284, 0x309D, 0x028D, 0x309E, 0x028E,
+ 0x309F, 0x2F95, 0x30A0, 0x3F4D, 0x30A1, 0x039D, 0x30A2, 0x039E,
+ 0x30A3, 0x039F, 0x30A4, 0x03A0, 0x30A5, 0x03A1, 0x30A6, 0x03A2,
+ 0x30A7, 0x03A3, 0x30A8, 0x03A4, 0x30A9, 0x03A5, 0x30AA, 0x03A6,
+ 0x30AB, 0x03A7, 0x30AC, 0x03A8, 0x30AD, 0x03A9, 0x30AE, 0x03AA,
+ 0x30AF, 0x03AB, 0x30B0, 0x03AC, 0x30B1, 0x03AD, 0x30B2, 0x03AE,
+ 0x30B3, 0x03AF, 0x30B4, 0x03B0, 0x30B5, 0x03B1, 0x30B6, 0x03B2,
+ 0x30B7, 0x03B3, 0x30B8, 0x03B4, 0x30B9, 0x03B5, 0x30BA, 0x03B6,
+ 0x30BB, 0x03B7, 0x30BC, 0x03B8, 0x30BD, 0x03B9, 0x30BE, 0x03BA,
+ 0x30BF, 0x03BB, 0x30C0, 0x03BC, 0x30C1, 0x03BD, 0x30C2, 0x03BE,
+ 0x30C3, 0x03BF, 0x30C4, 0x03C0, 0x30C5, 0x03C1, 0x30C6, 0x03C2,
+ 0x30C7, 0x03C3, 0x30C8, 0x03C4, 0x30C9, 0x03C5, 0x30CA, 0x03C6,
+ 0x30CB, 0x03C7, 0x30CC, 0x03C8, 0x30CD, 0x03C9, 0x30CE, 0x03CA,
+ 0x30CF, 0x03CB, 0x30D0, 0x03CC, 0x30D1, 0x03CD, 0x30D2, 0x03CE,
+ 0x30D3, 0x03CF, 0x30D4, 0x03D0, 0x30D5, 0x03D1, 0x30D6, 0x03D2,
+ 0x30D7, 0x03D3, 0x30D8, 0x03D4, 0x30D9, 0x03D5, 0x30DA, 0x03D6,
+ 0x30DB, 0x03D7, 0x30DC, 0x03D8, 0x30DD, 0x03D9, 0x30DE, 0x03DA,
+ 0x30DF, 0x03DB, 0x30E0, 0x03DC, 0x30E1, 0x03DD, 0x30E2, 0x03DE,
+ 0x30E3, 0x03DF, 0x30E4, 0x03E0, 0x30E5, 0x03E1, 0x30E6, 0x03E2,
+ 0x30E7, 0x03E3, 0x30E8, 0x03E4, 0x30E9, 0x03E5, 0x30EA, 0x03E6,
+ 0x30EB, 0x03E7, 0x30EC, 0x03E8, 0x30ED, 0x03E9, 0x30EE, 0x03EA,
+ 0x30EF, 0x03EB, 0x30F0, 0x03EC, 0x30F1, 0x03ED, 0x30F2, 0x03EE,
+ 0x30F3, 0x03EF, 0x30F4, 0x03F0, 0x30F5, 0x03F1, 0x30F6, 0x03F2,
+ 0x30F7, 0x2079, 0x30F8, 0x207A, 0x30F9, 0x207B, 0x30FA, 0x207C,
+ 0x30FB, 0x027E, 0x30FC, 0x0294, 0x30FD, 0x028B, 0x30FE, 0x028C,
+ 0x30FF, 0x3F43, 0x3190, 0x3F9B, 0x3191, 0x3F9C, 0x3192, 0x3F9D,
+ 0x3193, 0x3F9E, 0x3194, 0x3F9F, 0x3195, 0x3FA0, 0x3196, 0x3FA1,
+ 0x3197, 0x3FA2, 0x3198, 0x3FA3, 0x3199, 0x3FA4, 0x319A, 0x3FA5,
+ 0x319B, 0x3FA6, 0x319C, 0x3FA7, 0x319D, 0x3FA8, 0x319E, 0x3FA9,
+ 0x319F, 0x3FAA, 0x31F0, 0x3F6C, 0x31F1, 0x3F6D, 0x31F2, 0x3F6E,
+ 0x31F3, 0x3F6F, 0x31F4, 0x3F70, 0x31F5, 0x3F71, 0x31F6, 0x3F72,
+ 0x31F7, 0x3F73, 0x31F8, 0x3F74, 0x31F9, 0x3F75, 0x31FA, 0x3F77,
+ 0x31FB, 0x3F78, 0x31FC, 0x3F79, 0x31FD, 0x3F7A, 0x31FE, 0x3F7B,
+ 0x31FF, 0x3F7C, 0x3220, 0x278E, 0x3221, 0x278F, 0x3222, 0x2790,
+ 0x3223, 0x2791, 0x3224, 0x2792, 0x3225, 0x2793, 0x3226, 0x2794,
+ 0x3227, 0x2795, 0x3228, 0x2796, 0x3229, 0x2797, 0x322A, 0x2006,
+ 0x322B, 0x2007, 0x322C, 0x2008, 0x322D, 0x2009, 0x322E, 0x200A,
+ 0x322F, 0x200B, 0x3230, 0x2005, 0x3231, 0x1DC2, 0x3232, 0x1DC3,
+ 0x3233, 0x1FCF, 0x3234, 0x1FCD, 0x3235, 0x1FD4, 0x3236, 0x1FD3,
+ 0x3237, 0x200C, 0x3238, 0x1FCE, 0x3239, 0x1DC4, 0x323A, 0x1FD7,
+ 0x323B, 0x1FD5, 0x323C, 0x1FD0, 0x323D, 0x1FCB, 0x323E, 0x1FD2,
+ 0x323F, 0x1FCC, 0x3240, 0x1FD6, 0x3241, 0x200D, 0x3242, 0x1FD1,
+ 0x3243, 0x1FCA, 0x3251, 0x1F9B, 0x3252, 0x1FA6, 0x3253, 0x1FA7,
+ 0x3254, 0x1FA8, 0x3255, 0x1FA9, 0x3256, 0x1FAA, 0x3257, 0x1FAB,
+ 0x3258, 0x1FAC, 0x3259, 0x1FAD, 0x325A, 0x1FAE, 0x325B, 0x1FAF,
+ 0x325C, 0x2804, 0x325D, 0x2805, 0x325E, 0x2806, 0x325F, 0x2807,
+ 0x3280, 0x28DD, 0x3281, 0x28DE, 0x3282, 0x28DF, 0x3283, 0x28E0,
+ 0x3284, 0x28E1, 0x3285, 0x28E2, 0x3286, 0x28E3, 0x3287, 0x28E4,
+ 0x3288, 0x28E5, 0x3289, 0x28E6, 0x328A, 0x28E8, 0x328B, 0x28E9,
+ 0x328C, 0x28EA, 0x328D, 0x28EB, 0x328E, 0x28EC, 0x328F, 0x28ED,
+ 0x3290, 0x28E7, 0x3291, 0x1FE1, 0x3292, 0x1FE0, 0x3293, 0x1FE2,
+ 0x3294, 0x1FDC, 0x3295, 0x28FF, 0x3296, 0x1FE5, 0x3297, 0x28FC,
+ 0x3298, 0x1FDE, 0x3299, 0x201F, 0x329A, 0x28F9, 0x329B, 0x28F8,
+ 0x329C, 0x28FE, 0x329D, 0x207F, 0x329E, 0x1FFF, 0x329F, 0x28EF,
+ 0x32A0, 0x28F6, 0x32A1, 0x28F7, 0x32A2, 0x28FB, 0x32A3, 0x28FA,
+ 0x32A4, 0x1DBD, 0x32A5, 0x1DBE, 0x32A6, 0x1DBF, 0x32A7, 0x1DC0,
+ 0x32A8, 0x1DC1, 0x32A9, 0x1FDA, 0x32AA, 0x1FDD, 0x32AB, 0x1FDF,
+ 0x32AC, 0x1FE3, 0x32AD, 0x1FD9, 0x32AE, 0x1FE4, 0x32AF, 0x1FDB,
+ 0x32B0, 0x1FD8, 0x32B1, 0x2808, 0x32B2, 0x2809, 0x32B3, 0x280A,
+ 0x32B4, 0x280B, 0x32B5, 0x280C, 0x32B6, 0x280D, 0x32B7, 0x280E,
+ 0x32B8, 0x280F, 0x32B9, 0x2810, 0x32BA, 0x2811, 0x32BB, 0x2812,
+ 0x32BC, 0x2813, 0x32BD, 0x2814, 0x32BE, 0x2815, 0x32BF, 0x2816,
+ 0x32D0, 0x28AD, 0x32D1, 0x28AE, 0x32D2, 0x28AF, 0x32D3, 0x28B0,
+ 0x32D4, 0x28B1, 0x32D5, 0x28B2, 0x32D6, 0x28B3, 0x32D7, 0x28B4,
+ 0x32D8, 0x28B5, 0x32D9, 0x28B6, 0x32DA, 0x28B7, 0x32DB, 0x28B8,
+ 0x32DC, 0x28B9, 0x32DD, 0x28BA, 0x32DE, 0x28BB, 0x32DF, 0x28BC,
+ 0x32E0, 0x28BD, 0x32E1, 0x28BE, 0x32E2, 0x28BF, 0x32E3, 0x28C0,
+ 0x32E4, 0x28C1, 0x32E5, 0x28C2, 0x32E6, 0x28C3, 0x32E7, 0x28C4,
+ 0x32E8, 0x28C5, 0x32E9, 0x28C6, 0x32EA, 0x28C7, 0x32EB, 0x28C8,
+ 0x32EC, 0x28C9, 0x32ED, 0x28CA, 0x32EE, 0x28CB, 0x32EF, 0x28CC,
+ 0x32F0, 0x28CD, 0x32F1, 0x28CE, 0x32F2, 0x28CF, 0x32F3, 0x28D0,
+ 0x32F4, 0x28D1, 0x32F5, 0x28D2, 0x32F6, 0x28D3, 0x32F7, 0x28D4,
+ 0x32F8, 0x28D5, 0x32F9, 0x28D6, 0x32FA, 0x28D7, 0x32FB, 0x28D8,
+ 0x32FC, 0x28D9, 0x32FD, 0x28DA, 0x32FE, 0x28DB, 0x3300, 0x1F70,
+ 0x3301, 0x2E62, 0x3302, 0x2E63, 0x3303, 0x1F6A, 0x3304, 0x2E64,
+ 0x3305, 0x1FF7, 0x3306, 0x2E65, 0x3307, 0x2E69, 0x3308, 0x2E67,
+ 0x3309, 0x2E6C, 0x330A, 0x2E6A, 0x330B, 0x2E6E, 0x330C, 0x2E70,
+ 0x330D, 0x1DAB, 0x330E, 0x2E71, 0x330F, 0x2E72, 0x3310, 0x2E73,
+ 0x3311, 0x2E74, 0x3312, 0x2E75, 0x3313, 0x2E76, 0x3314, 0x1DA2,
+ 0x3315, 0x1F69, 0x3316, 0x1F67, 0x3317, 0x2E78, 0x3318, 0x1F68,
+ 0x3319, 0x2E7A, 0x331A, 0x2E7C, 0x331B, 0x2E7D, 0x331C, 0x2E7E,
+ 0x331D, 0x2E7F, 0x331E, 0x1F73, 0x331F, 0x2E80, 0x3320, 0x2E81,
+ 0x3321, 0x2E82, 0x3322, 0x1F66, 0x3323, 0x1F6B, 0x3324, 0x2E83,
+ 0x3325, 0x2E85, 0x3326, 0x1DAC, 0x3327, 0x1DA6, 0x3328, 0x2E88,
+ 0x3329, 0x2E89, 0x332A, 0x1F74, 0x332B, 0x1DAE, 0x332D, 0x2E8B,
+ 0x332E, 0x2E8E, 0x332F, 0x2E8F, 0x3330, 0x2E90, 0x3331, 0x1F71,
+ 0x3332, 0x2E91, 0x3333, 0x2087, 0x3334, 0x2E94, 0x3335, 0x2E95,
+ 0x3336, 0x1DA8, 0x3337, 0x2E9A, 0x3338, 0x2E9C, 0x3339, 0x1F6E,
+ 0x333A, 0x2E9D, 0x333B, 0x1F6F, 0x333C, 0x2E96, 0x333D, 0x2E9E,
+ 0x333E, 0x2EA0, 0x333F, 0x2EA1, 0x3340, 0x2EA2, 0x3341, 0x2E9F,
+ 0x3342, 0x1F6D, 0x3343, 0x2EA3, 0x3344, 0x2EA4, 0x3345, 0x2EA5,
+ 0x3346, 0x2EA6, 0x3347, 0x1F72, 0x3348, 0x2EA7, 0x3349, 0x1DA1,
+ 0x334A, 0x1DAF, 0x334B, 0x2EA8, 0x334C, 0x2EA9, 0x334D, 0x1DA4,
+ 0x334E, 0x2088, 0x334F, 0x2EAA, 0x3350, 0x2EAB, 0x3351, 0x1DA9,
+ 0x3352, 0x2EAE, 0x3353, 0x2EB2, 0x3354, 0x2EAF, 0x3355, 0x2EB3,
+ 0x3356, 0x2EB4, 0x3357, 0x1F6C, 0x3371, 0x2E55, 0x337B, 0x2083,
+ 0x337C, 0x1DC7, 0x337D, 0x1DC6, 0x337E, 0x1DC5, 0x337F, 0x1F76,
+ 0x3385, 0x1F5F, 0x3386, 0x1F60, 0x3387, 0x1F61, 0x3388, 0x2000,
+ 0x3389, 0x2001, 0x338D, 0x2E58, 0x338E, 0x1DB4, 0x338F, 0x1DB5,
+ 0x3390, 0x1F63, 0x3396, 0x1F65, 0x3397, 0x1F58, 0x3398, 0x1F5A,
+ 0x339B, 0x2E59, 0x339C, 0x1DB1, 0x339D, 0x1DB2, 0x339E, 0x1DB3,
+ 0x339F, 0x1FFA, 0x33A0, 0x1F54, 0x33A1, 0x1DB7, 0x33A2, 0x1F55,
+ 0x33A3, 0x1FFB, 0x33A4, 0x1F56, 0x33A5, 0x1F57, 0x33A6, 0x1FFC,
+ 0x33B0, 0x1F5E, 0x33B1, 0x1F5D, 0x33B2, 0x1F5C, 0x33B3, 0x1F5B,
+ 0x33C2, 0x2E50, 0x33C4, 0x1DB6, 0x33C8, 0x2002, 0x33CB, 0x1F62,
+ 0x33CC, 0x1FF6, 0x33CD, 0x1DBB, 0x33D4, 0x1F64, 0x33D7, 0x2E5D,
+ 0x33D8, 0x2E5E, 0x33DA, 0x2E4B, 0x3402, 0x3582, 0x3405, 0x3C1B,
+ 0x3406, 0x435A, 0x3427, 0x3656, 0x342C, 0x435E, 0x342E, 0x3788,
+ 0x3468, 0x36DF, 0x346A, 0x4375, 0x3488, 0x3C52, 0x3492, 0x438E,
+ 0x34B5, 0x4199, 0x34BC, 0x4397, 0x34C1, 0x47D0, 0x34C7, 0x439B,
+ 0x34DB, 0x3C41, 0x351F, 0x3629, 0x353E, 0x371E, 0x355D, 0x43BD,
+ 0x355E, 0x43BE, 0x3563, 0x43C0, 0x356E, 0x43C4, 0x35A6, 0x43D9,
+ 0x35A8, 0x43DB, 0x35C5, 0x43E1, 0x35DA, 0x43EA, 0x35DE, 0x4E63,
+ 0x35F4, 0x43F3, 0x3605, 0x43FA, 0x3614, 0x4ABB, 0x364A, 0x4421,
+ 0x3691, 0x4441, 0x3696, 0x4445, 0x3699, 0x4443, 0x36CF, 0x4456,
+ 0x3761, 0x4478, 0x3762, 0x4479, 0x376B, 0x447D, 0x376C, 0x447C,
+ 0x3775, 0x4480, 0x378D, 0x361A, 0x37C1, 0x448E, 0x37E2, 0x372B,
+ 0x37E8, 0x44A2, 0x37F4, 0x44A5, 0x37FD, 0x44A8, 0x3800, 0x44AA,
+ 0x382F, 0x44B4, 0x3836, 0x44B5, 0x3840, 0x44B6, 0x385C, 0x44BA,
+ 0x3861, 0x44BC, 0x38A1, 0x4ECB, 0x38AD, 0x4ABC, 0x38FA, 0x361C,
+ 0x3917, 0x44D9, 0x391A, 0x44DC, 0x396F, 0x44EB, 0x39A4, 0x4E9A,
+ 0x39B8, 0x4E9B, 0x3A5C, 0x4E9F, 0x3A6E, 0x4531, 0x3A73, 0x4534,
+ 0x3A85, 0x4EAE, 0x3AC4, 0x4EA7, 0x3ACB, 0x4EA8, 0x3AD6, 0x4543,
+ 0x3AD7, 0x455E, 0x3AEA, 0x454D, 0x3AF3, 0x3C40, 0x3B0E, 0x4558,
+ 0x3B1A, 0x455C, 0x3B1C, 0x455D, 0x3B22, 0x3C49, 0x3B6D, 0x458C,
+ 0x3B77, 0x4585, 0x3B87, 0x45A2, 0x3B88, 0x368D, 0x3B8D, 0x45A4,
+ 0x3BA4, 0x45AA, 0x3BB6, 0x420E, 0x3BC3, 0x420F, 0x3BCD, 0x45B8,
+ 0x3BF0, 0x45C9, 0x3BF3, 0x4EB7, 0x3C0F, 0x4217, 0x3C26, 0x45DF,
+ 0x3CC3, 0x45FC, 0x3CD2, 0x4601, 0x3D11, 0x4625, 0x3D1E, 0x4630,
+ 0x3D31, 0x4EBE, 0x3D4E, 0x1DE7, 0x3D64, 0x464A, 0x3D9A, 0x4658,
+ 0x3DC0, 0x466A, 0x3DCC, 0x4ABD, 0x3DD4, 0x466F, 0x3E05, 0x467B,
+ 0x3E3F, 0x4248, 0x3E40, 0x4ECA, 0x3E60, 0x468B, 0x3E66, 0x468D,
+ 0x3E68, 0x468E, 0x3E83, 0x4695, 0x3E8A, 0x3C43, 0x3E94, 0x469B,
+ 0x3EDA, 0x3C48, 0x3F57, 0x46CB, 0x3F72, 0x4258, 0x3F75, 0x46D9,
+ 0x3F77, 0x46DB, 0x3FAE, 0x46ED, 0x3FB1, 0x3754, 0x3FC9, 0x46F8,
+ 0x3FD7, 0x46FD, 0x3FDC, 0x4ABE, 0x4039, 0x470F, 0x4058, 0x4716,
+ 0x4093, 0x3C4C, 0x4103, 0x3C4F, 0x4105, 0x473B, 0x4148, 0x4747,
+ 0x414F, 0x474A, 0x4163, 0x474E, 0x41B4, 0x475D, 0x41BF, 0x4760,
+ 0x41E6, 0x476B, 0x41EE, 0x476F, 0x41F3, 0x476C, 0x4207, 0x4776,
+ 0x420E, 0x4779, 0x4264, 0x3760, 0x4293, 0x3C50, 0x42C6, 0x479F,
+ 0x42D6, 0x47AA, 0x42DD, 0x47AE, 0x4302, 0x47BC, 0x432B, 0x47C9,
+ 0x4343, 0x47CB, 0x43EE, 0x47F7, 0x43F0, 0x47FA, 0x4408, 0x4800,
+ 0x440C, 0x3C42, 0x4417, 0x4802, 0x441C, 0x4803, 0x4422, 0x4805,
+ 0x4453, 0x3773, 0x445B, 0x42A4, 0x4476, 0x481C, 0x447A, 0x481D,
+ 0x4491, 0x4823, 0x44B3, 0x483E, 0x44BE, 0x483C, 0x44D4, 0x483D,
+ 0x4508, 0x485C, 0x450D, 0x4858, 0x4525, 0x377E, 0x4543, 0x486C,
+ 0x457A, 0x3C4B, 0x459D, 0x42D4, 0x45B8, 0x48A0, 0x45BE, 0x4ABF,
+ 0x45E5, 0x48BA, 0x45EA, 0x42D9, 0x460F, 0x48CA, 0x4610, 0x4AC0,
+ 0x4641, 0x48D8, 0x4665, 0x3C4E, 0x46A1, 0x48E9, 0x46AE, 0x3C51,
+ 0x46AF, 0x48ED, 0x470C, 0x4902, 0x471F, 0x4EFB, 0x4764, 0x4918,
+ 0x47E6, 0x3790, 0x47FD, 0x4924, 0x4816, 0x492E, 0x481E, 0x4F01,
+ 0x4844, 0x42F5, 0x484E, 0x493A, 0x48B5, 0x495B, 0x49B0, 0x431F,
+ 0x49E7, 0x49D2, 0x49FA, 0x49D6, 0x4A04, 0x49DB, 0x4A29, 0x49DE,
+ 0x4ABC, 0x49F6, 0x4B38, 0x35DF, 0x4B3B, 0x4A0E, 0x4B7E, 0x4AC1,
+ 0x4BC2, 0x4A33, 0x4BCA, 0x4A35, 0x4BD2, 0x4A37, 0x4BE8, 0x3C46,
+ 0x4C17, 0x4334, 0x4C20, 0x4A48, 0x4C38, 0x4AC2, 0x4CC4, 0x4A84,
+ 0x4CD1, 0x4A87, 0x4CE1, 0x4AC3, 0x4D07, 0x4A9B, 0x4D77, 0x4AAB,
+ 0x4E00, 0x04B0, 0x4E01, 0x0BB8, 0x4E02, 0x4352, 0x4E03, 0x08E3,
+ 0x4E04, 0x37D8, 0x4E05, 0x37D9, 0x4E07, 0x0EAA, 0x4E08, 0x09CE,
+ 0x4E09, 0x087E, 0x4E0A, 0x09CD, 0x4E0B, 0x053C, 0x4E0C, 0x4AC4,
+ 0x4E0D, 0x0DC6, 0x4E0E, 0x0F29, 0x4E0F, 0x4353, 0x4E10, 0x0FFB,
+ 0x4E11, 0x04D1, 0x4E12, 0x4354, 0x4E14, 0x05CC, 0x4E15, 0x0FFC,
+ 0x4E16, 0x0A48, 0x4E17, 0x10D7, 0x4E18, 0x0670, 0x4E19, 0x0E0A,
+ 0x4E1E, 0x09CF, 0x4E1F, 0x37DA, 0x4E21, 0x0F86, 0x4E23, 0x4AC5,
+ 0x4E24, 0x4AC6, 0x4E26, 0x0E12, 0x4E28, 0x20B3, 0x4E29, 0x4355,
+ 0x4E2A, 0x0FFD, 0x4E2B, 0x37DB, 0x4E2C, 0x374D, 0x4E2D, 0x0BA4,
+ 0x4E2E, 0x4356, 0x4E2F, 0x37DC, 0x4E30, 0x37DD, 0x4E31, 0x0FFE,
+ 0x4E32, 0x06F2, 0x4E36, 0x0FFF, 0x4E37, 0x369D, 0x4E38, 0x0619,
+ 0x4E39, 0x0B6E, 0x4E3B, 0x0913, 0x4E3C, 0x1000, 0x4E3F, 0x1001,
+ 0x4E40, 0x37DE, 0x4E41, 0x37DF, 0x4E42, 0x1002, 0x4E43, 0x0CEB,
+ 0x4E44, 0x37E0, 0x4E45, 0x0671, 0x4E47, 0x4357, 0x4E48, 0x372E,
+ 0x4E4B, 0x0CED, 0x4E4D, 0x0CBB, 0x4E4E, 0x0777, 0x4E4F, 0x0E61,
+ 0x4E51, 0x4359, 0x4E55, 0x1950, 0x4E56, 0x1003, 0x4E57, 0x09D0,
+ 0x4E58, 0x1004, 0x4E59, 0x0535, 0x4E5A, 0x37E1, 0x4E5D, 0x06DD,
+ 0x4E5E, 0x07A4, 0x4E5F, 0x0EF5, 0x4E62, 0x1233, 0x4E69, 0x435C,
+ 0x4E71, 0x0F5A, 0x4E73, 0x0CD5, 0x4E79, 0x4AC7, 0x4E7E, 0x05E1,
+ 0x4E7F, 0x37E2, 0x4E80, 0x064F, 0x4E82, 0x1005, 0x4E85, 0x1006,
+ 0x4E86, 0x0F83, 0x4E88, 0x0F27, 0x4E89, 0x0AEA, 0x4E8A, 0x1008,
+ 0x4E8B, 0x08C4, 0x4E8C, 0x0CCB, 0x4E8D, 0x37E3, 0x4E8E, 0x100B,
+ 0x4E91, 0x04E0, 0x4E92, 0x0793, 0x4E94, 0x0792, 0x4E95, 0x04AA,
+ 0x4E96, 0x37E4, 0x4E98, 0x0FF1, 0x4E99, 0x0FF0, 0x4E9B, 0x0823,
+ 0x4E9C, 0x0465, 0x4E9D, 0x435D, 0x4E9E, 0x100C, 0x4E9F, 0x100D,
+ 0x4EA0, 0x100E, 0x4EA1, 0x0E62, 0x4EA2, 0x100F, 0x4EA4, 0x07A6,
+ 0x4EA5, 0x04AB, 0x4EA6, 0x0EA0, 0x4EA8, 0x0696, 0x4EAB, 0x0697,
+ 0x4EAC, 0x0698, 0x4EAD, 0x0BFE, 0x4EAE, 0x0F84, 0x4EB0, 0x1010,
+ 0x4EB3, 0x1011, 0x4EB6, 0x1012, 0x4EB9, 0x37E5, 0x4EBA, 0x0A13,
+ 0x4EBB, 0x3620, 0x4EBC, 0x435F, 0x4EC0, 0x0944, 0x4EC1, 0x0A14,
+ 0x4EC2, 0x1017, 0x4EC3, 0x4360, 0x4EC4, 0x1015, 0x4EC6, 0x1016,
+ 0x4EC7, 0x0672, 0x4EC8, 0x4361, 0x4ECA, 0x0813, 0x4ECB, 0x0570,
+ 0x4ECD, 0x1014, 0x4ECE, 0x1013, 0x4ECF, 0x0DF9, 0x4ED0, 0x37E6,
+ 0x4ED4, 0x0894, 0x4ED5, 0x0893, 0x4ED6, 0x0B1E, 0x4ED7, 0x1018,
+ 0x4ED8, 0x0DC7, 0x4ED9, 0x0A8B, 0x4EDA, 0x4363, 0x4EDD, 0x0290,
+ 0x4EDE, 0x1019, 0x4EDF, 0x101B, 0x4EE0, 0x37E7, 0x4EE1, 0x20B4,
+ 0x4EE3, 0x0B45, 0x4EE4, 0x0FA9, 0x4EE5, 0x048E, 0x4EEB, 0x4362,
+ 0x4EED, 0x101A, 0x4EEE, 0x053E, 0x4EF0, 0x06BC, 0x4EF1, 0x4364,
+ 0x4EF2, 0x0BA5, 0x4EF3, 0x4AC8, 0x4EF5, 0x4365, 0x4EF6, 0x0745,
+ 0x4EF7, 0x101C, 0x4EFB, 0x0CDA, 0x4EFC, 0x20B5, 0x4EFD, 0x37E8,
+ 0x4EFF, 0x37E9, 0x4F00, 0x20B6, 0x4F01, 0x0627, 0x4F03, 0x20B7,
+ 0x4F09, 0x101D, 0x4F0A, 0x048F, 0x4F0B, 0x37EA, 0x4F0C, 0x4AC9,
+ 0x4F0D, 0x0794, 0x4F0E, 0x0628, 0x4F0F, 0x0DEC, 0x4F10, 0x0D46,
+ 0x4F11, 0x0673, 0x4F15, 0x37EB, 0x4F16, 0x4366, 0x4F19, 0x4ACA,
+ 0x4F1A, 0x0571, 0x4F1C, 0x1040, 0x4F1D, 0x0C3B, 0x4F2B, 0x4ACB,
+ 0x4F2E, 0x4ACC, 0x4F2F, 0x0D22, 0x4F30, 0x101F, 0x4F31, 0x4ACD,
+ 0x4F34, 0x0D50, 0x4F36, 0x0FAA, 0x4F37, 0x4368, 0x4F38, 0x09F3,
+ 0x4F39, 0x20B8, 0x4F3A, 0x0895, 0x4F3B, 0x37ED, 0x4F3C, 0x08C5,
+ 0x4F3D, 0x0540, 0x4F3E, 0x4369, 0x4F43, 0x0BED, 0x4F46, 0x0B60,
+ 0x4F47, 0x1023, 0x4F48, 0x418B, 0x4F49, 0x37EE, 0x4F4D, 0x0490,
+ 0x4F4E, 0x0BFF, 0x4F4F, 0x0945, 0x4F50, 0x0824, 0x4F51, 0x0F0E,
+ 0x4F53, 0x0B2E, 0x4F54, 0x37EF, 0x4F55, 0x053F, 0x4F56, 0x20B9,
+ 0x4F57, 0x1022, 0x4F58, 0x436A, 0x4F59, 0x0F28, 0x4F5A, 0x101E,
+ 0x4F5B, 0x1020, 0x4F5C, 0x085E, 0x4F5D, 0x1021, 0x4F5E, 0x11D3,
+ 0x4F5F, 0x418C, 0x4F60, 0x37EC, 0x4F64, 0x4367, 0x4F69, 0x1029,
+ 0x4F6A, 0x418D, 0x4F6C, 0x418E, 0x4F6F, 0x102C, 0x4F70, 0x102A,
+ 0x4F73, 0x0542, 0x4F75, 0x0E0B, 0x4F76, 0x1024, 0x4F77, 0x436C,
+ 0x4F78, 0x436D, 0x4F7A, 0x37F0, 0x4F7B, 0x1028, 0x4F7C, 0x07A7,
+ 0x4F7D, 0x37F1, 0x4F7E, 0x37F2, 0x4F7F, 0x0896, 0x4F82, 0x436E,
+ 0x4F83, 0x05E2, 0x4F84, 0x4ACE, 0x4F85, 0x436F, 0x4F86, 0x102D,
+ 0x4F88, 0x1025, 0x4F8A, 0x20BB, 0x4F8B, 0x0FAB, 0x4F8D, 0x08C6,
+ 0x4F8F, 0x1026, 0x4F91, 0x102B, 0x4F92, 0x20BA, 0x4F94, 0x20BD,
+ 0x4F96, 0x102E, 0x4F97, 0x37F3, 0x4F98, 0x1027, 0x4F9A, 0x20BC,
+ 0x4F9B, 0x0699, 0x4F9D, 0x0491, 0x4F9E, 0x4ACF, 0x4FA0, 0x069A,
+ 0x4FA1, 0x0541, 0x4FAB, 0x11D4, 0x4FAD, 0x0EA7, 0x4FAE, 0x0DE0,
+ 0x4FAF, 0x07A8, 0x4FB2, 0x4371, 0x4FB5, 0x09F5, 0x4FB6, 0x0F7F,
+ 0x4FB7, 0x4AD0, 0x4FBE, 0x37F4, 0x4FBF, 0x0E28, 0x4FC2, 0x070E,
+ 0x4FC3, 0x0B05, 0x4FC4, 0x0564, 0x4FC5, 0x4372, 0x4FC9, 0x20AC,
+ 0x4FCA, 0x095D, 0x4FCB, 0x4373, 0x4FCD, 0x20BE, 0x4FCE, 0x1032,
+ 0x4FCF, 0x37F5, 0x4FD0, 0x1037, 0x4FD1, 0x1035, 0x4FD2, 0x4374,
+ 0x4FD3, 0x3C2F, 0x4FD4, 0x1030, 0x4FD7, 0x0B0F, 0x4FD8, 0x1033,
+ 0x4FDA, 0x1036, 0x4FDB, 0x1034, 0x4FDD, 0x0E2D, 0x4FDF, 0x1031,
+ 0x4FE0, 0x1DEC, 0x4FE1, 0x09F4, 0x4FE3, 0x0EA1, 0x4FE4, 0x1038,
+ 0x4FE5, 0x1039, 0x4FE6, 0x4370, 0x4FEE, 0x092E, 0x4FEF, 0x1046,
+ 0x4FF1, 0x35A3, 0x4FF2, 0x4376, 0x4FF3, 0x0D06, 0x4FF5, 0x0DA8,
+ 0x4FF6, 0x1041, 0x4FF8, 0x0E40, 0x4FFA, 0x0536, 0x4FFD, 0x37F6,
+ 0x4FFE, 0x1045, 0x4FFF, 0x20C1, 0x5000, 0x37F7, 0x5001, 0x37F8,
+ 0x5002, 0x4F4B, 0x5004, 0x4AD1, 0x5005, 0x103F, 0x5006, 0x1048,
+ 0x5009, 0x0AD4, 0x500B, 0x0778, 0x500C, 0x4AD2, 0x500D, 0x0D12,
+ 0x500E, 0x418F, 0x500F, 0x1600, 0x5010, 0x37F9, 0x5011, 0x1047,
+ 0x5012, 0x0C57, 0x5013, 0x4377, 0x5014, 0x103C, 0x5016, 0x07AA,
+ 0x5018, 0x4190, 0x5019, 0x07A9, 0x501A, 0x103A, 0x501B, 0x37FA,
+ 0x501C, 0x4378, 0x501E, 0x20C2, 0x501F, 0x0906, 0x5021, 0x1042,
+ 0x5022, 0x20C0, 0x5023, 0x0E3F, 0x5024, 0x0B8B, 0x5025, 0x103E,
+ 0x5026, 0x0747, 0x5027, 0x37FB, 0x5028, 0x103B, 0x5029, 0x1043,
+ 0x502A, 0x103D, 0x502B, 0x0F99, 0x502C, 0x1044, 0x502D, 0x0FE7,
+ 0x502E, 0x37FC, 0x5036, 0x06DE, 0x5039, 0x0746, 0x503B, 0x3800,
+ 0x5040, 0x20BF, 0x5041, 0x4191, 0x5042, 0x20C5, 0x5043, 0x1049,
+ 0x5046, 0x20C3, 0x5047, 0x104A, 0x5048, 0x104E, 0x5049, 0x0492,
+ 0x504C, 0x4AD3, 0x504E, 0x4379, 0x504F, 0x0E20, 0x5050, 0x104D,
+ 0x5053, 0x437A, 0x5055, 0x104C, 0x5056, 0x1050, 0x5057, 0x37FD,
+ 0x505A, 0x104F, 0x505C, 0x0C00, 0x505F, 0x4AD4, 0x5062, 0x4AD5,
+ 0x5063, 0x437B, 0x5065, 0x0748, 0x5066, 0x37FE, 0x506A, 0x37FF,
+ 0x506C, 0x1051, 0x5070, 0x20C4, 0x5072, 0x08F1, 0x5074, 0x0B06,
+ 0x5075, 0x0C01, 0x5076, 0x06EE, 0x5077, 0x4AD6, 0x5078, 0x1052,
+ 0x507D, 0x0650, 0x5080, 0x1053, 0x5085, 0x1055, 0x5088, 0x437D,
+ 0x508D, 0x0E63, 0x508E, 0x4AD7, 0x508F, 0x3801, 0x5091, 0x073C,
+ 0x5092, 0x437E, 0x5093, 0x437F, 0x5094, 0x20C6, 0x5095, 0x4380,
+ 0x5096, 0x3802, 0x5098, 0x087F, 0x5099, 0x0D8B, 0x509A, 0x1054,
+ 0x509C, 0x3803, 0x509E, 0x4AD8, 0x50A2, 0x4AD9, 0x50A3, 0x437C,
+ 0x50AA, 0x4381, 0x50AC, 0x0835, 0x50AD, 0x0F2D, 0x50B1, 0x4383,
+ 0x50B2, 0x1057, 0x50B3, 0x105A, 0x50B4, 0x1056, 0x50B5, 0x0834,
+ 0x50B7, 0x0987, 0x50BA, 0x4384, 0x50BB, 0x4385, 0x50BE, 0x070F,
+ 0x50C2, 0x105B, 0x50C3, 0x4ADA, 0x50C4, 0x4386, 0x50C5, 0x06C7,
+ 0x50C7, 0x4387, 0x50C9, 0x1058, 0x50CA, 0x1059, 0x50CC, 0x3804,
+ 0x50CD, 0x0C87, 0x50CE, 0x438A, 0x50CF, 0x0AFE, 0x50D0, 0x4193,
+ 0x50D1, 0x069B, 0x50D4, 0x438C, 0x50D5, 0x0E7B, 0x50D6, 0x105C,
+ 0x50D8, 0x20C8, 0x50D9, 0x3C30, 0x50DA, 0x0F85, 0x50DE, 0x105D,
+ 0x50E1, 0x438D, 0x50E3, 0x1060, 0x50E5, 0x105E, 0x50E6, 0x3805,
+ 0x50E7, 0x0AD0, 0x50E8, 0x4ADB, 0x50E9, 0x3806, 0x50ED, 0x105F,
+ 0x50EE, 0x1061, 0x50EF, 0x3807, 0x50F0, 0x3C31, 0x50F1, 0x4ADC,
+ 0x50F2, 0x4192, 0x50F3, 0x4388, 0x50F4, 0x20C7, 0x50F5, 0x1063,
+ 0x50F9, 0x1062, 0x50FB, 0x0E18, 0x50FE, 0x4ADD, 0x5100, 0x0651,
+ 0x5101, 0x1065, 0x5102, 0x1066, 0x5103, 0x4195, 0x5104, 0x052F,
+ 0x5106, 0x4194, 0x5107, 0x4ADE, 0x5108, 0x3808, 0x5109, 0x1064,
+ 0x510B, 0x3809, 0x510C, 0x4ADF, 0x510D, 0x4AE0, 0x510E, 0x4AE1,
+ 0x5110, 0x380A, 0x5112, 0x0920, 0x5114, 0x1069, 0x5115, 0x1068,
+ 0x5116, 0x1067, 0x5117, 0x4390, 0x5118, 0x102F, 0x511A, 0x106A,
+ 0x511B, 0x380B, 0x511E, 0x380C, 0x511F, 0x0988, 0x5121, 0x106B,
+ 0x512A, 0x0F0F, 0x5132, 0x0EE5, 0x5133, 0x4AE2, 0x5135, 0x4196,
+ 0x5137, 0x106D, 0x5138, 0x4AE3, 0x513A, 0x106C, 0x513B, 0x106F,
+ 0x513C, 0x106E, 0x513F, 0x1070, 0x5140, 0x1071, 0x5141, 0x04B8,
+ 0x5143, 0x0769, 0x5144, 0x0711, 0x5145, 0x0946, 0x5146, 0x0BB9,
+ 0x5147, 0x069C, 0x5148, 0x0A8C, 0x5149, 0x07AB, 0x514A, 0x20C9,
+ 0x514B, 0x0800, 0x514C, 0x1073, 0x514D, 0x0ED4, 0x514E, 0x0C40,
+ 0x5150, 0x08C7, 0x5152, 0x1072, 0x5154, 0x1074, 0x5155, 0x4197,
+ 0x5157, 0x4198, 0x515A, 0x0C58, 0x515C, 0x05D3, 0x515F, 0x380D,
+ 0x5160, 0x4392, 0x5162, 0x1075, 0x5164, 0x20CA, 0x5165, 0x0CD6,
+ 0x5167, 0x368E, 0x5168, 0x0AB6, 0x5169, 0x1077, 0x516A, 0x1078,
+ 0x516B, 0x0D40, 0x516C, 0x07AC, 0x516D, 0x0FE1, 0x516E, 0x1079,
+ 0x5171, 0x069E, 0x5173, 0x4394, 0x5174, 0x4AE4, 0x5175, 0x0E0C,
+ 0x5176, 0x0B16, 0x5177, 0x06E9, 0x5178, 0x0C2F, 0x5179, 0x3779,
+ 0x517B, 0x47D9, 0x517C, 0x0749, 0x5180, 0x107A, 0x5182, 0x107B,
+ 0x5183, 0x4395, 0x5184, 0x4AE5, 0x5185, 0x0CBA, 0x5186, 0x0501,
+ 0x5189, 0x107E, 0x518A, 0x086D, 0x518B, 0x4396, 0x518C, 0x107D,
+ 0x518D, 0x0836, 0x518F, 0x107F, 0x5190, 0x185B, 0x5191, 0x1080,
+ 0x5192, 0x0E6F, 0x5193, 0x1081, 0x5195, 0x1082, 0x5196, 0x1083,
+ 0x5197, 0x09D1, 0x5198, 0x4398, 0x5199, 0x08F8, 0x519D, 0x20CB,
+ 0x51A0, 0x05E3, 0x51A1, 0x380E, 0x51A2, 0x1086, 0x51A3, 0x4399,
+ 0x51A4, 0x1084, 0x51A5, 0x0EC9, 0x51A6, 0x1085, 0x51A8, 0x0DCC,
+ 0x51A9, 0x1087, 0x51AA, 0x1088, 0x51AB, 0x1089, 0x51AC, 0x0C59,
+ 0x51AD, 0x439A, 0x51B0, 0x108D, 0x51B1, 0x108B, 0x51B2, 0x108C,
+ 0x51B3, 0x108A, 0x51B4, 0x0853, 0x51B5, 0x108E, 0x51B6, 0x0EF6,
+ 0x51B7, 0x0FAC, 0x51B8, 0x4AE6, 0x51BA, 0x4AE7, 0x51BC, 0x380F,
+ 0x51BD, 0x108F, 0x51BE, 0x20CC, 0x51C3, 0x3C32, 0x51C4, 0x0A4C,
+ 0x51C5, 0x1090, 0x51C6, 0x0964, 0x51C8, 0x4AE8, 0x51C9, 0x1091,
+ 0x51CA, 0x419A, 0x51CB, 0x0BBA, 0x51CC, 0x0F87, 0x51CD, 0x0C5A,
+ 0x51CF, 0x4AE9, 0x51D1, 0x4AEA, 0x51D3, 0x4AEB, 0x51D4, 0x4AEC,
+ 0x51D6, 0x10DA, 0x51D8, 0x4AED, 0x51DB, 0x1092, 0x51DC, 0x205C,
+ 0x51DD, 0x06BD, 0x51DE, 0x4F4C, 0x51DF, 0x4AEE, 0x51E0, 0x1093,
+ 0x51E1, 0x0E8C, 0x51E2, 0x419B, 0x51E6, 0x0972, 0x51E7, 0x0B5C,
+ 0x51E9, 0x1095, 0x51EA, 0x0CBC, 0x51EC, 0x20CD, 0x51ED, 0x1096,
+ 0x51EE, 0x3811, 0x51F0, 0x1097, 0x51F1, 0x058C, 0x51F3, 0x439D,
+ 0x51F4, 0x3812, 0x51F5, 0x1098, 0x51F6, 0x069F, 0x51F8, 0x0CA4,
+ 0x51F9, 0x051C, 0x51FA, 0x095A, 0x51FD, 0x0D35, 0x51FE, 0x1099,
+ 0x5200, 0x0C5B, 0x5201, 0x3813, 0x5202, 0x3814, 0x5203, 0x0A15,
+ 0x5204, 0x109A, 0x5205, 0x4AEF, 0x5206, 0x0DFC, 0x5207, 0x0A7E,
+ 0x5208, 0x05DE, 0x520A, 0x05E5, 0x520B, 0x109B, 0x520E, 0x109D,
+ 0x5211, 0x0710, 0x5212, 0x439E, 0x5213, 0x3815, 0x5214, 0x109C,
+ 0x5215, 0x20CE, 0x5216, 0x439F, 0x5217, 0x0FBB, 0x521D, 0x0973,
+ 0x5224, 0x0D51, 0x5225, 0x0E1C, 0x5226, 0x4AF0, 0x5227, 0x109E,
+ 0x5228, 0x4AF1, 0x5229, 0x0F62, 0x522A, 0x109F, 0x522B, 0x4AF2,
+ 0x522E, 0x10A0, 0x5230, 0x0C78, 0x5231, 0x4AF3, 0x5232, 0x4AF4,
+ 0x5233, 0x10A1, 0x5235, 0x4AF5, 0x5236, 0x0A4D, 0x5237, 0x086E,
+ 0x5238, 0x074A, 0x5239, 0x10A2, 0x523A, 0x0897, 0x523B, 0x0801,
+ 0x523C, 0x4AF6, 0x5243, 0x0C02, 0x5244, 0x10A4, 0x5247, 0x0B07,
+ 0x5249, 0x3816, 0x524A, 0x085F, 0x524B, 0x10A5, 0x524C, 0x10A6,
+ 0x524D, 0x0AB2, 0x524F, 0x10A3, 0x5254, 0x10A8, 0x5255, 0x43A1,
+ 0x5256, 0x0E64, 0x5257, 0x419C, 0x525A, 0x4AF7, 0x525B, 0x07F6,
+ 0x525C, 0x43A2, 0x525D, 0x1E5E, 0x525E, 0x10A7, 0x5260, 0x4AF8,
+ 0x5261, 0x3817, 0x5263, 0x074B, 0x5264, 0x084E, 0x5265, 0x0D23,
+ 0x5266, 0x3818, 0x5269, 0x10AB, 0x526A, 0x10A9, 0x526C, 0x43A3,
+ 0x526E, 0x4AF9, 0x526F, 0x0DED, 0x5270, 0x09D2, 0x5271, 0x10B2,
+ 0x5272, 0x05C2, 0x5273, 0x10AC, 0x5274, 0x10AA, 0x5275, 0x0AD1,
+ 0x5277, 0x43A4, 0x5278, 0x4AFA, 0x5279, 0x4AFB, 0x527D, 0x10AE,
+ 0x527F, 0x10AD, 0x5282, 0x43A6, 0x5283, 0x05A2, 0x5284, 0x43A5,
+ 0x5287, 0x0736, 0x5288, 0x10B3, 0x5289, 0x0F75, 0x528A, 0x4AFC,
+ 0x528C, 0x4AFD, 0x528D, 0x10AF, 0x5291, 0x10B4, 0x5292, 0x10B1,
+ 0x5293, 0x3819, 0x5294, 0x10B0, 0x5298, 0x43A8, 0x529B, 0x0F97,
+ 0x529C, 0x20CF, 0x529F, 0x07AD, 0x52A0, 0x0543, 0x52A3, 0x0FBC,
+ 0x52A4, 0x43AA, 0x52A6, 0x20D0, 0x52A9, 0x097F, 0x52AA, 0x0C52,
+ 0x52AB, 0x07F7, 0x52AC, 0x10B7, 0x52AD, 0x10B8, 0x52AF, 0x217D,
+ 0x52B1, 0x0FAD, 0x52B4, 0x0FD1, 0x52B5, 0x10BA, 0x52B9, 0x07AE,
+ 0x52BA, 0x43AB, 0x52BB, 0x43AC, 0x52BC, 0x10B9, 0x52BE, 0x058D,
+ 0x52C0, 0x20D1, 0x52C1, 0x10BB, 0x52C3, 0x0E84, 0x52C5, 0x0BD8,
+ 0x52C7, 0x0F10, 0x52C8, 0x381A, 0x52C9, 0x0E29, 0x52CA, 0x43AD,
+ 0x52CC, 0x419D, 0x52CD, 0x10BC, 0x52D0, 0x36E8, 0x52D1, 0x43AE,
+ 0x52D2, 0x1BEE, 0x52D5, 0x0C88, 0x52D6, 0x419E, 0x52D7, 0x10BD,
+ 0x52D8, 0x05E6, 0x52D9, 0x0EBF, 0x52DB, 0x20D2, 0x52DD, 0x0989,
+ 0x52DE, 0x10BE, 0x52DF, 0x0E37, 0x52E0, 0x10C2, 0x52E1, 0x4AFE,
+ 0x52E2, 0x0A4E, 0x52E3, 0x10BF, 0x52E4, 0x06C8, 0x52E6, 0x10C0,
+ 0x52E7, 0x05E7, 0x52E9, 0x4AFF, 0x52F0, 0x381B, 0x52F1, 0x4B00,
+ 0x52F2, 0x0704, 0x52F3, 0x10C3, 0x52F5, 0x10C4, 0x52F7, 0x43B0,
+ 0x52F8, 0x10C5, 0x52F9, 0x10C6, 0x52FA, 0x0907, 0x52FB, 0x419F,
+ 0x52FE, 0x07AF, 0x52FF, 0x0EEA, 0x5300, 0x20D3, 0x5301, 0x0EF4,
+ 0x5302, 0x0CCF, 0x5303, 0x4B01, 0x5305, 0x0E41, 0x5306, 0x10C7,
+ 0x5307, 0x4F4D, 0x5308, 0x10C8, 0x530A, 0x381C, 0x530B, 0x381D,
+ 0x530D, 0x10CA, 0x530F, 0x10CC, 0x5310, 0x10CB, 0x5311, 0x4B02,
+ 0x5315, 0x10CD, 0x5316, 0x053D, 0x5317, 0x0E7A, 0x5319, 0x086C,
+ 0x531A, 0x10CE, 0x531C, 0x41A0, 0x531D, 0x0ADB, 0x531F, 0x4B03,
+ 0x5320, 0x098A, 0x5321, 0x06A1, 0x5323, 0x10CF, 0x5324, 0x20D5,
+ 0x532A, 0x0D6F, 0x532D, 0x4B04, 0x532F, 0x10D0, 0x5331, 0x10D1,
+ 0x5332, 0x4B05, 0x5333, 0x10D2, 0x5335, 0x43B1, 0x5338, 0x10D3,
+ 0x5339, 0x0D96, 0x533A, 0x06E0, 0x533B, 0x04A9, 0x533D, 0x4B06,
+ 0x533E, 0x381E, 0x533F, 0x0C97, 0x5340, 0x10D4, 0x5341, 0x0947,
+ 0x5342, 0x43B2, 0x5343, 0x0A8D, 0x5345, 0x10D6, 0x5346, 0x10D5,
+ 0x5347, 0x098B, 0x5348, 0x0795, 0x5349, 0x10D8, 0x534A, 0x0D52,
+ 0x534B, 0x3820, 0x534C, 0x381F, 0x534D, 0x10D9, 0x5351, 0x0D70,
+ 0x5352, 0x0B14, 0x5353, 0x0B4E, 0x5354, 0x06A0, 0x5357, 0x0CC6,
+ 0x5358, 0x0B6F, 0x535A, 0x0D24, 0x535C, 0x0E7C, 0x535E, 0x10DB,
+ 0x5360, 0x0A8E, 0x5361, 0x3821, 0x5363, 0x41A1, 0x5365, 0x4B07,
+ 0x5366, 0x070B, 0x5367, 0x43B5, 0x5369, 0x10DC, 0x536C, 0x3822,
+ 0x536D, 0x4B08, 0x536E, 0x10DD, 0x536F, 0x04CE, 0x5370, 0x04B9,
+ 0x5371, 0x0629, 0x5372, 0x20D6, 0x5373, 0x0B08, 0x5374, 0x066B,
+ 0x5375, 0x0F5B, 0x5377, 0x10E0, 0x5378, 0x0537, 0x5379, 0x4B09,
+ 0x537A, 0x43B6, 0x537B, 0x10DF, 0x537D, 0x3435, 0x537E, 0x4B0A,
+ 0x537F, 0x06A2, 0x5382, 0x10E1, 0x5384, 0x0EFD, 0x5389, 0x37D0,
+ 0x5393, 0x20D7, 0x5394, 0x4B0B, 0x5396, 0x10E2, 0x5398, 0x0F9A,
+ 0x5399, 0x4B0C, 0x539A, 0x07B0, 0x539D, 0x41A2, 0x539F, 0x076A,
+ 0x53A0, 0x10E3, 0x53A4, 0x43B7, 0x53A5, 0x10E5, 0x53A6, 0x10E4,
+ 0x53A8, 0x0A25, 0x53A9, 0x04DB, 0x53AA, 0x4B0D, 0x53AB, 0x3823,
+ 0x53AD, 0x0500, 0x53AE, 0x10E6, 0x53AF, 0x4B0E, 0x53B0, 0x10E7,
+ 0x53B2, 0x20D8, 0x53B3, 0x076B, 0x53B4, 0x43B8, 0x53B6, 0x10E8,
+ 0x53B7, 0x43BA, 0x53BA, 0x4B0F, 0x53BB, 0x0688, 0x53C0, 0x43BB,
+ 0x53C1, 0x4B10, 0x53C2, 0x0880, 0x53C3, 0x10E9, 0x53C4, 0x4B11,
+ 0x53C5, 0x4B12, 0x53C8, 0x0EA2, 0x53C9, 0x0825, 0x53CA, 0x0674,
+ 0x53CB, 0x0F11, 0x53CC, 0x0AD2, 0x53CD, 0x0D53, 0x53CE, 0x0929,
+ 0x53D4, 0x0951, 0x53D5, 0x43BF, 0x53D6, 0x0914, 0x53D7, 0x0921,
+ 0x53D9, 0x0980, 0x53DA, 0x3824, 0x53DB, 0x0D54, 0x53DD, 0x20D9,
+ 0x53DF, 0x10EC, 0x53E0, 0x4B13, 0x53E1, 0x04E5, 0x53E2, 0x0AD3,
+ 0x53E3, 0x07B1, 0x53E4, 0x0779, 0x53E5, 0x06DF, 0x53E6, 0x3825,
+ 0x53E8, 0x10F0, 0x53E9, 0x0B5F, 0x53EA, 0x0B5E, 0x53EB, 0x06A3,
+ 0x53EC, 0x098C, 0x53ED, 0x10F1, 0x53EE, 0x10EF, 0x53EF, 0x0544,
+ 0x53F0, 0x0B46, 0x53F1, 0x08E4, 0x53F2, 0x0899, 0x53F3, 0x04C8,
+ 0x53F4, 0x43C1, 0x53F5, 0x3826, 0x53F6, 0x05CE, 0x53F7, 0x07F8,
+ 0x53F8, 0x0898, 0x53FA, 0x10F2, 0x5401, 0x10F3, 0x5403, 0x0663,
+ 0x5404, 0x05A4, 0x5408, 0x07F9, 0x5409, 0x0662, 0x540A, 0x0BFB,
+ 0x540B, 0x04C7, 0x540C, 0x0C89, 0x540D, 0x0ECA, 0x540E, 0x07B3,
+ 0x540F, 0x0F63, 0x5410, 0x0C41, 0x5411, 0x07B2, 0x5412, 0x41A3,
+ 0x5413, 0x4B14, 0x541B, 0x0705, 0x541D, 0x10FC, 0x541E, 0x368C,
+ 0x541F, 0x06DB, 0x5420, 0x0E78, 0x5424, 0x43C2, 0x5426, 0x0D71,
+ 0x5427, 0x3827, 0x5428, 0x43C3, 0x5429, 0x10FB, 0x542A, 0x4B15,
+ 0x542B, 0x061A, 0x542C, 0x10F6, 0x542D, 0x10F7, 0x542E, 0x10F9,
+ 0x5431, 0x4B16, 0x5433, 0x35C0, 0x5434, 0x4B17, 0x5435, 0x4B18,
+ 0x5436, 0x10FA, 0x5438, 0x0675, 0x5439, 0x0A27, 0x543B, 0x0DFD,
+ 0x543C, 0x10F8, 0x543D, 0x10F4, 0x543E, 0x0797, 0x543F, 0x35CF,
+ 0x5440, 0x10F5, 0x5442, 0x0FCA, 0x5443, 0x43C5, 0x5446, 0x0E42,
+ 0x5448, 0x0C04, 0x5449, 0x0796, 0x544A, 0x0802, 0x544C, 0x4B19,
+ 0x544D, 0x3828, 0x544E, 0x10FD, 0x5451, 0x0CB5, 0x5455, 0x3723,
+ 0x545F, 0x1101, 0x5462, 0x43C6, 0x5466, 0x3829, 0x5468, 0x092A,
+ 0x546A, 0x0922, 0x546B, 0x382A, 0x546C, 0x43C7, 0x5470, 0x1104,
+ 0x5471, 0x1102, 0x5473, 0x0EAF, 0x5474, 0x382B, 0x5475, 0x10FF,
+ 0x5476, 0x1108, 0x5477, 0x1103, 0x547B, 0x1106, 0x547C, 0x077A,
+ 0x547D, 0x0ECB, 0x547F, 0x41A4, 0x5480, 0x1107, 0x5484, 0x1109,
+ 0x5486, 0x110B, 0x5488, 0x41A5, 0x548A, 0x20DC, 0x548B, 0x0860,
+ 0x548C, 0x0FE8, 0x548D, 0x382C, 0x548E, 0x1100, 0x548F, 0x10FE,
+ 0x5490, 0x110A, 0x5492, 0x1105, 0x5495, 0x43C8, 0x5496, 0x382D,
+ 0x549C, 0x20DB, 0x54A0, 0x43C9, 0x54A1, 0x382E, 0x54A2, 0x110D,
+ 0x54A4, 0x1116, 0x54A5, 0x110F, 0x54A6, 0x43CA, 0x54A7, 0x4B1A,
+ 0x54A8, 0x1113, 0x54A9, 0x20DD, 0x54AA, 0x4B1B, 0x54AB, 0x1114,
+ 0x54AC, 0x1110, 0x54AD, 0x382F, 0x54AE, 0x43CB, 0x54AF, 0x1131,
+ 0x54B1, 0x4B1C, 0x54B2, 0x0859, 0x54B3, 0x058F, 0x54B7, 0x43CC,
+ 0x54B8, 0x110E, 0x54B9, 0x3830, 0x54BA, 0x43CD, 0x54BB, 0x4B1D,
+ 0x54BC, 0x1118, 0x54BD, 0x04BA, 0x54BE, 0x1117, 0x54BF, 0x3831,
+ 0x54C0, 0x0469, 0x54C1, 0x0DBC, 0x54C2, 0x1115, 0x54C3, 0x43CE,
+ 0x54C4, 0x1111, 0x54C6, 0x3832, 0x54C7, 0x110C, 0x54C8, 0x1112,
+ 0x54C9, 0x0838, 0x54CD, 0x3833, 0x54CE, 0x4B1E, 0x54D8, 0x1119,
+ 0x54E1, 0x04BB, 0x54E2, 0x1122, 0x54E5, 0x111A, 0x54E6, 0x111B,
+ 0x54E8, 0x098D, 0x54E9, 0x0E97, 0x54EA, 0x4B1F, 0x54EC, 0x43D0,
+ 0x54ED, 0x1120, 0x54EE, 0x111F, 0x54EF, 0x43D1, 0x54F1, 0x43D2,
+ 0x54F2, 0x0C29, 0x54F3, 0x43D3, 0x54FA, 0x1121, 0x54FC, 0x4B20,
+ 0x54FD, 0x111E, 0x54FF, 0x20DE, 0x5500, 0x43D4, 0x5501, 0x43D5,
+ 0x5504, 0x04D6, 0x5505, 0x4B21, 0x5506, 0x0826, 0x5507, 0x09F6,
+ 0x5508, 0x4B22, 0x5509, 0x43D6, 0x550E, 0x3834, 0x550F, 0x111C,
+ 0x5510, 0x0C5C, 0x5514, 0x111D, 0x5515, 0x4B23, 0x5516, 0x0466,
+ 0x5527, 0x4B24, 0x552A, 0x4B25, 0x552B, 0x3835, 0x552E, 0x1127,
+ 0x552F, 0x0F0D, 0x5531, 0x098F, 0x5533, 0x112D, 0x5535, 0x3836,
+ 0x5536, 0x4B26, 0x5538, 0x112C, 0x5539, 0x1123, 0x553C, 0x43D7,
+ 0x553E, 0x0B23, 0x5540, 0x1124, 0x5541, 0x43D8, 0x5544, 0x0B4F,
+ 0x5545, 0x1129, 0x5546, 0x098E, 0x5547, 0x43DA, 0x554A, 0x3837,
+ 0x554C, 0x1126, 0x554F, 0x0EF0, 0x5550, 0x41A6, 0x5551, 0x4B27,
+ 0x5553, 0x0712, 0x5556, 0x112A, 0x5557, 0x112B, 0x555C, 0x1128,
+ 0x555D, 0x112E, 0x555E, 0x1DD1, 0x5560, 0x3838, 0x5561, 0x4F54,
+ 0x5563, 0x1125, 0x5564, 0x43DC, 0x5566, 0x4B28, 0x557B, 0x1134,
+ 0x557C, 0x1139, 0x557D, 0x43DE, 0x557E, 0x1135, 0x5580, 0x1130,
+ 0x5581, 0x41A7, 0x5582, 0x43DF, 0x5583, 0x113A, 0x5584, 0x0AB3,
+ 0x5586, 0x20DF, 0x5587, 0x113C, 0x5588, 0x383A, 0x5589, 0x07B4,
+ 0x558A, 0x1132, 0x558B, 0x0BBB, 0x558E, 0x383B, 0x558F, 0x4B29,
+ 0x5591, 0x43E0, 0x5592, 0x4B2A, 0x5594, 0x4B2B, 0x5598, 0x1136,
+ 0x5599, 0x112F, 0x559A, 0x05E9, 0x559C, 0x062A, 0x559D, 0x05C3,
+ 0x559E, 0x1137, 0x559F, 0x1133, 0x55A4, 0x4B2C, 0x55A7, 0x074C,
+ 0x55A8, 0x113D, 0x55A9, 0x113B, 0x55AA, 0x0AD5, 0x55AB, 0x0664,
+ 0x55AC, 0x06A4, 0x55AD, 0x41A8, 0x55AE, 0x1138, 0x55B0, 0x06EC,
+ 0x55B2, 0x4B2D, 0x55B6, 0x04E6, 0x55BF, 0x43E5, 0x55C3, 0x4B2E,
+ 0x55C4, 0x1141, 0x55C5, 0x113F, 0x55C6, 0x4B2F, 0x55C7, 0x1178,
+ 0x55C9, 0x43E6, 0x55CC, 0x43E7, 0x55CE, 0x41A9, 0x55D1, 0x43E8,
+ 0x55D2, 0x43E2, 0x55D3, 0x4B30, 0x55D4, 0x1144, 0x55DA, 0x113E,
+ 0x55DB, 0x4B31, 0x55DC, 0x1142, 0x55DD, 0x43E9, 0x55DF, 0x1140,
+ 0x55E2, 0x43EB, 0x55E3, 0x089A, 0x55E4, 0x1143, 0x55E9, 0x43ED,
+ 0x55EC, 0x4B32, 0x55EE, 0x4B33, 0x55F1, 0x4B34, 0x55F6, 0x4B35,
+ 0x55F7, 0x1146, 0x55F8, 0x4B36, 0x55F9, 0x114B, 0x55FD, 0x1149,
+ 0x55FE, 0x1148, 0x5605, 0x4B37, 0x5606, 0x0B70, 0x5607, 0x43F0,
+ 0x5608, 0x383C, 0x5609, 0x0545, 0x560D, 0x4B38, 0x560E, 0x383D,
+ 0x560F, 0x383E, 0x5610, 0x43F1, 0x5611, 0x4B39, 0x5612, 0x4B3A,
+ 0x5614, 0x1145, 0x5616, 0x1147, 0x5617, 0x0990, 0x5618, 0x04D5,
+ 0x561B, 0x114A, 0x5620, 0x3C1D, 0x5628, 0x43EE, 0x5629, 0x055E,
+ 0x562C, 0x4B3B, 0x562F, 0x1155, 0x5630, 0x43F2, 0x5631, 0x09E4,
+ 0x5632, 0x1151, 0x5634, 0x114F, 0x5635, 0x4B3C, 0x5636, 0x1150,
+ 0x5637, 0x383F, 0x5638, 0x1152, 0x5639, 0x4B3D, 0x563B, 0x41AA,
+ 0x563D, 0x43F4, 0x563F, 0x3840, 0x5640, 0x43F5, 0x5642, 0x04DF,
+ 0x5647, 0x43F6, 0x5649, 0x3841, 0x564B, 0x3842, 0x564C, 0x0ABB,
+ 0x564D, 0x4B3E, 0x564E, 0x114C, 0x564F, 0x3843, 0x5650, 0x114D,
+ 0x5653, 0x1F1B, 0x5654, 0x4B3F, 0x565B, 0x05D8, 0x565E, 0x43F7,
+ 0x5660, 0x43F8, 0x5664, 0x1154, 0x5666, 0x3844, 0x5668, 0x062B,
+ 0x5669, 0x3845, 0x566A, 0x1157, 0x566B, 0x1153, 0x566C, 0x1156,
+ 0x566D, 0x43F9, 0x566F, 0x3846, 0x5671, 0x3847, 0x5672, 0x3848,
+ 0x5674, 0x0DFE, 0x5676, 0x3C33, 0x5678, 0x0CAD, 0x567A, 0x0D4C,
+ 0x5680, 0x1159, 0x5685, 0x4B40, 0x5686, 0x1158, 0x5687, 0x05A3,
+ 0x5688, 0x43FB, 0x568A, 0x115A, 0x568C, 0x43FC, 0x568F, 0x115D,
+ 0x5694, 0x115C, 0x5695, 0x3849, 0x5699, 0x1DE6, 0x569A, 0x384A,
+ 0x569D, 0x43FD, 0x569E, 0x41AB, 0x569F, 0x4B41, 0x56A0, 0x115B,
+ 0x56A2, 0x0CEF, 0x56A5, 0x115E, 0x56A6, 0x4B42, 0x56A8, 0x43FE,
+ 0x56A9, 0x41AC, 0x56AC, 0x384B, 0x56AD, 0x384C, 0x56AE, 0x115F,
+ 0x56B1, 0x384D, 0x56B2, 0x43FF, 0x56B3, 0x41AD, 0x56B4, 0x1161,
+ 0x56B6, 0x1160, 0x56B7, 0x4B43, 0x56BC, 0x1163, 0x56C0, 0x1166,
+ 0x56C1, 0x1164, 0x56C2, 0x1162, 0x56C3, 0x1165, 0x56C5, 0x4400,
+ 0x56C8, 0x1167, 0x56C9, 0x384E, 0x56CA, 0x1E5A, 0x56CC, 0x4B44,
+ 0x56CD, 0x4401, 0x56CE, 0x1168, 0x56CF, 0x4B45, 0x56D1, 0x1169,
+ 0x56D3, 0x116A, 0x56D7, 0x116B, 0x56D8, 0x107C, 0x56D9, 0x4B46,
+ 0x56DA, 0x0928, 0x56DB, 0x089B, 0x56DD, 0x384F, 0x56DE, 0x0573,
+ 0x56DF, 0x4402, 0x56E0, 0x04BC, 0x56E1, 0x4B47, 0x56E3, 0x0B82,
+ 0x56E4, 0x3850, 0x56E8, 0x4403, 0x56EB, 0x4B48, 0x56ED, 0x4B49,
+ 0x56EE, 0x116C, 0x56F0, 0x0814, 0x56F1, 0x4B4A, 0x56F2, 0x0493,
+ 0x56F3, 0x0A24, 0x56F6, 0x4404, 0x56F7, 0x4405, 0x56F9, 0x116D,
+ 0x56FA, 0x077B, 0x56FD, 0x0803, 0x56FF, 0x116F, 0x5700, 0x116E,
+ 0x5703, 0x0E30, 0x5704, 0x1170, 0x5707, 0x4B4B, 0x5708, 0x1172,
+ 0x5709, 0x1171, 0x570A, 0x3851, 0x570B, 0x1173, 0x570C, 0x4B4C,
+ 0x570D, 0x1174, 0x570F, 0x074D, 0x5712, 0x0502, 0x5713, 0x1175,
+ 0x5715, 0x3852, 0x5716, 0x1177, 0x5718, 0x1176, 0x571A, 0x4B4D,
+ 0x571B, 0x4B4E, 0x571C, 0x1179, 0x571D, 0x4B4F, 0x571F, 0x0C54,
+ 0x5721, 0x3680, 0x5723, 0x3853, 0x5726, 0x117A, 0x5727, 0x0479,
+ 0x5728, 0x084F, 0x5729, 0x4408, 0x572C, 0x4B50, 0x572D, 0x0713,
+ 0x572E, 0x4B51, 0x572F, 0x3854, 0x5730, 0x0B8D, 0x5733, 0x3855,
+ 0x5734, 0x3856, 0x5737, 0x117B, 0x5738, 0x117C, 0x573B, 0x117E,
+ 0x573D, 0x4B52, 0x573E, 0x4B53, 0x5740, 0x117F, 0x5742, 0x0854,
+ 0x5745, 0x440A, 0x5746, 0x440B, 0x5747, 0x06C9, 0x574A, 0x0E65,
+ 0x574C, 0x3857, 0x574D, 0x440C, 0x574E, 0x117D, 0x574F, 0x1180,
+ 0x5750, 0x0831, 0x5751, 0x07B5, 0x5759, 0x20E0, 0x575F, 0x4B54,
+ 0x5761, 0x1184, 0x5764, 0x0815, 0x5765, 0x20E1, 0x5766, 0x0B71,
+ 0x5768, 0x440E, 0x5769, 0x1181, 0x576A, 0x0BF6, 0x576B, 0x4B55,
+ 0x576D, 0x4B56, 0x576F, 0x440F, 0x5770, 0x3858, 0x5773, 0x4410,
+ 0x5774, 0x4411, 0x5775, 0x4412, 0x5777, 0x41AE, 0x577A, 0x4B57,
+ 0x577B, 0x4413, 0x577C, 0x41AF, 0x577F, 0x1185, 0x5782, 0x0A28,
+ 0x5783, 0x4B58, 0x5788, 0x1183, 0x5789, 0x1186, 0x578B, 0x0715,
+ 0x578C, 0x3859, 0x5793, 0x1187, 0x5797, 0x4B59, 0x579A, 0x4416,
+ 0x579C, 0x385A, 0x579D, 0x4417, 0x579E, 0x4418, 0x57A0, 0x1188,
+ 0x57A2, 0x07B6, 0x57A3, 0x059E, 0x57A4, 0x118A, 0x57A8, 0x4419,
+ 0x57AA, 0x118B, 0x57AC, 0x20E2, 0x57AE, 0x4B5A, 0x57B0, 0x118C,
+ 0x57B3, 0x1189, 0x57B8, 0x385B, 0x57C0, 0x1182, 0x57C3, 0x118D,
+ 0x57C6, 0x118E, 0x57C7, 0x20E4, 0x57C8, 0x20E3, 0x57CB, 0x0E92,
+ 0x57CC, 0x441C, 0x57CE, 0x09D3, 0x57CF, 0x41B1, 0x57D2, 0x1190,
+ 0x57D3, 0x1191, 0x57D4, 0x118F, 0x57D5, 0x4B5B, 0x57D6, 0x1193,
+ 0x57D7, 0x441A, 0x57DC, 0x0CEE, 0x57DE, 0x441F, 0x57DF, 0x04AC,
+ 0x57E0, 0x0DC8, 0x57E3, 0x1194, 0x57E4, 0x41B2, 0x57E6, 0x385C,
+ 0x57E7, 0x4B5C, 0x57ED, 0x385D, 0x57F0, 0x4420, 0x57F4, 0x09E5,
+ 0x57F5, 0x385E, 0x57F6, 0x385F, 0x57F7, 0x08E5, 0x57F8, 0x4422,
+ 0x57F9, 0x0D13, 0x57FA, 0x062C, 0x57FB, 0x4423, 0x57FC, 0x085B,
+ 0x57FD, 0x4424, 0x57FF, 0x3860, 0x5800, 0x0E87, 0x5802, 0x0C8A,
+ 0x5804, 0x4425, 0x5805, 0x074E, 0x5806, 0x0B2F, 0x5809, 0x3861,
+ 0x580A, 0x1192, 0x580B, 0x1195, 0x580D, 0x4B5D, 0x5815, 0x0B24,
+ 0x5819, 0x1196, 0x581D, 0x1197, 0x581E, 0x4426, 0x5820, 0x3862,
+ 0x5821, 0x1199, 0x5824, 0x0C05, 0x5826, 0x4B5E, 0x5827, 0x4427,
+ 0x582A, 0x05EA, 0x582F, 0x1D32, 0x5830, 0x0503, 0x5831, 0x0E43,
+ 0x5832, 0x3863, 0x5834, 0x09D4, 0x5835, 0x0C42, 0x5839, 0x4428,
+ 0x583A, 0x0856, 0x583D, 0x119F, 0x5840, 0x0E0D, 0x5841, 0x0FA5,
+ 0x5849, 0x442A, 0x584A, 0x0574, 0x584B, 0x119B, 0x584C, 0x442B,
+ 0x584D, 0x4B5F, 0x584F, 0x4B60, 0x5851, 0x0ABC, 0x5852, 0x119E,
+ 0x5854, 0x0C5D, 0x5857, 0x0C43, 0x5858, 0x0C5E, 0x5859, 0x0D4D,
+ 0x585A, 0x0BE9, 0x585E, 0x0839, 0x585F, 0x4B61, 0x5861, 0x1E47,
+ 0x5862, 0x119A, 0x5864, 0x41B3, 0x5867, 0x442C, 0x5869, 0x0518,
+ 0x586B, 0x0C30, 0x586D, 0x4B62, 0x5870, 0x119C, 0x5872, 0x1198,
+ 0x5875, 0x0A16, 0x5879, 0x11A0, 0x587C, 0x3864, 0x587E, 0x0958,
+ 0x587F, 0x4B63, 0x5880, 0x3865, 0x5881, 0x4B64, 0x5883, 0x06A5,
+ 0x5885, 0x11A1, 0x5889, 0x41B4, 0x588A, 0x442D, 0x588B, 0x442E,
+ 0x588D, 0x442F, 0x588F, 0x4430, 0x5890, 0x4431, 0x5893, 0x0E38,
+ 0x5894, 0x4432, 0x5897, 0x0AFF, 0x5898, 0x4B65, 0x589C, 0x0BE2,
+ 0x589D, 0x4433, 0x589E, 0x20E7, 0x589F, 0x11A3, 0x58A8, 0x0E7D,
+ 0x58A9, 0x3866, 0x58AA, 0x4434, 0x58AB, 0x11A4, 0x58AE, 0x11A9,
+ 0x58B1, 0x4435, 0x58B2, 0x20E8, 0x58B3, 0x0DFF, 0x58B8, 0x11A8,
+ 0x58B9, 0x11A2, 0x58BA, 0x11A5, 0x58BB, 0x11A7, 0x58BC, 0x4B66,
+ 0x58BE, 0x0816, 0x58C1, 0x0E19, 0x58C3, 0x4437, 0x58C5, 0x11AA,
+ 0x58C7, 0x0B83, 0x58CA, 0x0575, 0x58CC, 0x09D5, 0x58CD, 0x4438,
+ 0x58CE, 0x3867, 0x58D0, 0x3868, 0x58D1, 0x11AC, 0x58D2, 0x41B6,
+ 0x58D3, 0x11AB, 0x58D4, 0x3869, 0x58D5, 0x07FA, 0x58D7, 0x11AD,
+ 0x58D8, 0x11AF, 0x58D9, 0x11AE, 0x58DA, 0x386A, 0x58DC, 0x11B1,
+ 0x58DE, 0x11A6, 0x58DF, 0x11B3, 0x58E0, 0x41B7, 0x58E2, 0x4439,
+ 0x58E4, 0x11B2, 0x58E5, 0x11B0, 0x58E9, 0x386B, 0x58EB, 0x089C,
+ 0x58EC, 0x0A17, 0x58EE, 0x0AD6, 0x58EF, 0x11B4, 0x58F0, 0x0A60,
+ 0x58F1, 0x04B1, 0x58F2, 0x0D1A, 0x58F3, 0x443A, 0x58F4, 0x443B,
+ 0x58F7, 0x0BF7, 0x58F9, 0x11B6, 0x58FA, 0x11B5, 0x58FB, 0x11B7,
+ 0x58FC, 0x11B8, 0x58FD, 0x11B9, 0x5902, 0x11BA, 0x5905, 0x443C,
+ 0x5906, 0x443D, 0x5909, 0x0E21, 0x590A, 0x11BB, 0x590B, 0x20E9,
+ 0x590C, 0x386C, 0x590D, 0x443E, 0x590F, 0x0546, 0x5910, 0x11BC,
+ 0x5914, 0x443F, 0x5915, 0x0F26, 0x5916, 0x058E, 0x5918, 0x10DE,
+ 0x5919, 0x0952, 0x591A, 0x0B1F, 0x591B, 0x11BD, 0x591C, 0x0EF7,
+ 0x591F, 0x4B67, 0x5922, 0x0EC0, 0x5923, 0x4B68, 0x5924, 0x386D,
+ 0x5925, 0x11BF, 0x5927, 0x0B47, 0x5929, 0x0C31, 0x592A, 0x0B20,
+ 0x592B, 0x0DC9, 0x592C, 0x11C0, 0x592D, 0x11C1, 0x592E, 0x051D,
+ 0x592F, 0x386E, 0x5931, 0x08E6, 0x5932, 0x11C2, 0x5937, 0x0494,
+ 0x5938, 0x11C3, 0x5939, 0x3725, 0x593D, 0x4442, 0x593E, 0x11C4,
+ 0x5944, 0x0504, 0x5946, 0x4444, 0x5947, 0x062D, 0x5948, 0x0CB8,
+ 0x5949, 0x0E44, 0x594E, 0x11C8, 0x594F, 0x0AD7, 0x5950, 0x11C7,
+ 0x5951, 0x0716, 0x5953, 0x20EA, 0x5954, 0x0E89, 0x5955, 0x11C6,
+ 0x5957, 0x0C5F, 0x5958, 0x11CA, 0x5959, 0x4B69, 0x595A, 0x11C9,
+ 0x595B, 0x20EB, 0x595D, 0x20EC, 0x595F, 0x4447, 0x5960, 0x11CC,
+ 0x5961, 0x386F, 0x5962, 0x11CB, 0x5963, 0x20ED, 0x5965, 0x051E,
+ 0x5967, 0x11CD, 0x5968, 0x0991, 0x5969, 0x11CF, 0x596A, 0x0B63,
+ 0x596C, 0x11CE, 0x596D, 0x3870, 0x596E, 0x0E03, 0x5973, 0x0981,
+ 0x5974, 0x0C55, 0x5975, 0x4449, 0x5976, 0x444A, 0x5978, 0x11D0,
+ 0x5979, 0x4B6A, 0x597C, 0x444B, 0x597D, 0x07B7, 0x5981, 0x11D1,
+ 0x5982, 0x0CD7, 0x5983, 0x0D72, 0x5984, 0x0EDD, 0x598A, 0x0CDB,
+ 0x598B, 0x41B9, 0x598D, 0x11DA, 0x5992, 0x41BA, 0x5993, 0x0652,
+ 0x5996, 0x0F2F, 0x5997, 0x4B6B, 0x5999, 0x0EBB, 0x599B, 0x1239,
+ 0x599D, 0x11D2, 0x599F, 0x444C, 0x59A3, 0x11D5, 0x59A4, 0x20EE,
+ 0x59A5, 0x0B25, 0x59A8, 0x0E66, 0x59AC, 0x0C44, 0x59AE, 0x444D,
+ 0x59AF, 0x4B6C, 0x59B2, 0x11D6, 0x59B3, 0x4B6D, 0x59B9, 0x0E93,
+ 0x59BA, 0x20EF, 0x59BB, 0x083A, 0x59BC, 0x444E, 0x59BE, 0x0992,
+ 0x59C3, 0x41BB, 0x59C6, 0x11D7, 0x59C8, 0x444F, 0x59C9, 0x089E,
+ 0x59CA, 0x3871, 0x59CB, 0x089D, 0x59CD, 0x4450, 0x59D0, 0x047D,
+ 0x59D1, 0x077C, 0x59D2, 0x3872, 0x59D3, 0x0A4F, 0x59D4, 0x0495,
+ 0x59D9, 0x11DB, 0x59DA, 0x11DC, 0x59DC, 0x11D9, 0x59DD, 0x3873,
+ 0x59DE, 0x4451, 0x59DF, 0x4B6E, 0x59E3, 0x3874, 0x59E4, 0x3875,
+ 0x59E5, 0x04DA, 0x59E6, 0x05EB, 0x59E7, 0x4452, 0x59E8, 0x11D8,
+ 0x59EA, 0x0ED1, 0x59EB, 0x0DA3, 0x59EC, 0x36AD, 0x59EE, 0x4453,
+ 0x59F1, 0x4B6F, 0x59F6, 0x046C, 0x59F8, 0x4B70, 0x59FB, 0x04BD,
+ 0x59FF, 0x089F, 0x5A01, 0x0496, 0x5A03, 0x0467, 0x5A04, 0x3876,
+ 0x5A09, 0x11E1, 0x5A0C, 0x3877, 0x5A0D, 0x4457, 0x5A11, 0x11DF,
+ 0x5A13, 0x41BC, 0x5A17, 0x4458, 0x5A18, 0x0EC8, 0x5A1A, 0x11E2,
+ 0x5A1B, 0x35C1, 0x5A1C, 0x11E0, 0x5A1F, 0x11DE, 0x5A20, 0x09F7,
+ 0x5A23, 0x3878, 0x5A25, 0x11DD, 0x5A27, 0x4459, 0x5A29, 0x0E2A,
+ 0x5A2D, 0x445A, 0x5A2F, 0x0798, 0x5A35, 0x11E6, 0x5A36, 0x11E7,
+ 0x5A3C, 0x0993, 0x5A40, 0x11E3, 0x5A41, 0x0FD2, 0x5A46, 0x0D02,
+ 0x5A47, 0x3879, 0x5A49, 0x11E5, 0x5A55, 0x387A, 0x5A5A, 0x0817,
+ 0x5A62, 0x11E8, 0x5A63, 0x387B, 0x5A65, 0x445B, 0x5A66, 0x0DCA,
+ 0x5A67, 0x41BD, 0x5A6A, 0x11E9, 0x5A6C, 0x11E4, 0x5A6D, 0x387C,
+ 0x5A77, 0x41BE, 0x5A7A, 0x445C, 0x5A7E, 0x387D, 0x5A7F, 0x0EC7,
+ 0x5A84, 0x41BF, 0x5A8B, 0x445D, 0x5A92, 0x0D14, 0x5A9A, 0x11EA,
+ 0x5A9B, 0x0DA4, 0x5A9C, 0x445E, 0x5A9E, 0x387E, 0x5A9F, 0x445F,
+ 0x5AA0, 0x4460, 0x5AA2, 0x4461, 0x5AA7, 0x387F, 0x5AAC, 0x3880,
+ 0x5AB1, 0x4462, 0x5AB2, 0x4B71, 0x5AB3, 0x3881, 0x5AB5, 0x4463,
+ 0x5AB8, 0x4B72, 0x5ABA, 0x4464, 0x5ABC, 0x11EB, 0x5ABD, 0x11EF,
+ 0x5ABE, 0x11EC, 0x5ABF, 0x4465, 0x5AC1, 0x0547, 0x5AC2, 0x11EE,
+ 0x5AC4, 0x41C0, 0x5AC9, 0x08E7, 0x5ACB, 0x11ED, 0x5ACC, 0x074F,
+ 0x5AD0, 0x11FB, 0x5AD6, 0x11F4, 0x5AD7, 0x11F1, 0x5ADA, 0x4466,
+ 0x5ADC, 0x4467, 0x5AE0, 0x3882, 0x5AE1, 0x0BA2, 0x5AE3, 0x11F0,
+ 0x5AE5, 0x4468, 0x5AE6, 0x11F2, 0x5AE9, 0x11F3, 0x5AEA, 0x4B73,
+ 0x5AEE, 0x446A, 0x5AF0, 0x4469, 0x5AF5, 0x446B, 0x5AF6, 0x4B74,
+ 0x5AFA, 0x11F5, 0x5AFB, 0x11F6, 0x5B00, 0x3883, 0x5B08, 0x446C,
+ 0x5B09, 0x062E, 0x5B0B, 0x11F8, 0x5B0C, 0x11F7, 0x5B16, 0x11F9,
+ 0x5B17, 0x446D, 0x5B19, 0x3884, 0x5B1B, 0x4B75, 0x5B1D, 0x4B76,
+ 0x5B21, 0x4B77, 0x5B22, 0x09D6, 0x5B25, 0x3885, 0x5B2A, 0x11FC,
+ 0x5B2C, 0x0BF8, 0x5B2D, 0x3886, 0x5B30, 0x04E7, 0x5B32, 0x11FA,
+ 0x5B34, 0x446E, 0x5B36, 0x11FD, 0x5B38, 0x4B78, 0x5B3E, 0x11FE,
+ 0x5B40, 0x1201, 0x5B41, 0x3887, 0x5B43, 0x11FF, 0x5B45, 0x1200,
+ 0x5B4C, 0x446F, 0x5B50, 0x08A0, 0x5B51, 0x1202, 0x5B52, 0x4470,
+ 0x5B54, 0x07B8, 0x5B55, 0x1203, 0x5B56, 0x20F0, 0x5B57, 0x08C8,
+ 0x5B58, 0x0B18, 0x5B5A, 0x1204, 0x5B5B, 0x1205, 0x5B5C, 0x08A8,
+ 0x5B5D, 0x07B9, 0x5B5F, 0x0EDE, 0x5B63, 0x0642, 0x5B64, 0x077D,
+ 0x5B65, 0x1206, 0x5B66, 0x05B6, 0x5B68, 0x4471, 0x5B69, 0x1207,
+ 0x5B6B, 0x0B19, 0x5B6F, 0x4472, 0x5B70, 0x1208, 0x5B71, 0x1230,
+ 0x5B73, 0x1209, 0x5B75, 0x120A, 0x5B76, 0x3728, 0x5B78, 0x120B,
+ 0x5B7A, 0x120D, 0x5B7C, 0x3888, 0x5B7D, 0x41C2, 0x5B7E, 0x3889,
+ 0x5B7F, 0x388A, 0x5B80, 0x120E, 0x5B81, 0x4473, 0x5B82, 0x3610,
+ 0x5B83, 0x120F, 0x5B84, 0x4474, 0x5B85, 0x0B50, 0x5B87, 0x04C9,
+ 0x5B88, 0x0915, 0x5B89, 0x0486, 0x5B8A, 0x388B, 0x5B8B, 0x0AD9,
+ 0x5B8C, 0x05EC, 0x5B8D, 0x08E1, 0x5B8F, 0x07BA, 0x5B93, 0x41C3,
+ 0x5B95, 0x0C60, 0x5B96, 0x4476, 0x5B97, 0x092B, 0x5B98, 0x05ED,
+ 0x5B99, 0x0BA6, 0x5B9A, 0x0C06, 0x5B9B, 0x047C, 0x5B9C, 0x0653,
+ 0x5B9D, 0x0E45, 0x5B9F, 0x08EE, 0x5BA2, 0x066C, 0x5BA3, 0x0A8F,
+ 0x5BA4, 0x08E8, 0x5BA5, 0x0F12, 0x5BA6, 0x1210, 0x5BAC, 0x4477,
+ 0x5BAE, 0x0676, 0x5BB0, 0x083B, 0x5BB3, 0x0590, 0x5BB4, 0x0505,
+ 0x5BB5, 0x0994, 0x5BB6, 0x0548, 0x5BB7, 0x4B79, 0x5BB8, 0x1211,
+ 0x5BB9, 0x0F30, 0x5BBF, 0x0953, 0x5BC0, 0x20F1, 0x5BC2, 0x0910,
+ 0x5BC3, 0x1212, 0x5BC4, 0x062F, 0x5BC5, 0x0CAA, 0x5BC6, 0x0EB5,
+ 0x5BC7, 0x1213, 0x5BC9, 0x1214, 0x5BCC, 0x0DCB, 0x5BCE, 0x447A,
+ 0x5BD0, 0x1216, 0x5BD2, 0x05E4, 0x5BD3, 0x06EF, 0x5BD4, 0x1215,
+ 0x5BD6, 0x447B, 0x5BD7, 0x4B7A, 0x5BD8, 0x20F3, 0x5BDB, 0x05EE,
+ 0x5BDD, 0x09F8, 0x5BDE, 0x121A, 0x5BDF, 0x086F, 0x5BE0, 0x4B7B,
+ 0x5BE1, 0x0549, 0x5BE2, 0x1219, 0x5BE4, 0x1217, 0x5BE5, 0x121B,
+ 0x5BE6, 0x1218, 0x5BE7, 0x0CE1, 0x5BE8, 0x148E, 0x5BE9, 0x09F9,
+ 0x5BEB, 0x121C, 0x5BEC, 0x4F4E, 0x5BEE, 0x0F88, 0x5BF0, 0x121D,
+ 0x5BF1, 0x447E, 0x5BF3, 0x121F, 0x5BF5, 0x0BBC, 0x5BF6, 0x121E,
+ 0x5BF8, 0x0A47, 0x5BFA, 0x08C9, 0x5BFD, 0x447F, 0x5BFE, 0x0B30,
+ 0x5BFF, 0x0923, 0x5C01, 0x0DE7, 0x5C02, 0x0A90, 0x5C03, 0x4481,
+ 0x5C04, 0x08F9, 0x5C05, 0x1220, 0x5C06, 0x0995, 0x5C07, 0x1221,
+ 0x5C08, 0x1222, 0x5C09, 0x0497, 0x5C0A, 0x0B1A, 0x5C0B, 0x0A18,
+ 0x5C0D, 0x1223, 0x5C0E, 0x0C8B, 0x5C0F, 0x0996, 0x5C11, 0x0997,
+ 0x5C12, 0x41C4, 0x5C13, 0x1224, 0x5C14, 0x372A, 0x5C16, 0x0A91,
+ 0x5C19, 0x360B, 0x5C1A, 0x0998, 0x5C1E, 0x20F5, 0x5C1F, 0x4B7C,
+ 0x5C20, 0x1225, 0x5C22, 0x1226, 0x5C23, 0x388C, 0x5C24, 0x0EEC,
+ 0x5C28, 0x1227, 0x5C29, 0x4482, 0x5C2A, 0x4B7D, 0x5C2B, 0x388D,
+ 0x5C2C, 0x4B7E, 0x5C2D, 0x06BE, 0x5C30, 0x388E, 0x5C31, 0x092C,
+ 0x5C36, 0x4B7F, 0x5C38, 0x1228, 0x5C39, 0x1229, 0x5C3A, 0x0908,
+ 0x5C3B, 0x09F2, 0x5C3C, 0x0CCC, 0x5C3D, 0x0A1A, 0x5C3E, 0x0D8C,
+ 0x5C3F, 0x0CD8, 0x5C40, 0x06C1, 0x5C41, 0x122A, 0x5C45, 0x0689,
+ 0x5C46, 0x122B, 0x5C48, 0x06F6, 0x5C4A, 0x0CA7, 0x5C4B, 0x0530,
+ 0x5C4D, 0x08A1, 0x5C4E, 0x122C, 0x5C4F, 0x122F, 0x5C50, 0x122E,
+ 0x5C51, 0x06F5, 0x5C53, 0x122D, 0x5C55, 0x0C32, 0x5C59, 0x4B80,
+ 0x5C5B, 0x1E92, 0x5C5C, 0x4B81, 0x5C5E, 0x0B10, 0x5C5F, 0x4484,
+ 0x5C60, 0x0C45, 0x5C61, 0x08F4, 0x5C62, 0x1E0D, 0x5C63, 0x388F,
+ 0x5C64, 0x0ADA, 0x5C65, 0x0F64, 0x5C67, 0x4485, 0x5C68, 0x4486,
+ 0x5C69, 0x3890, 0x5C6C, 0x1231, 0x5C6D, 0x4B82, 0x5C6E, 0x1232,
+ 0x5C6F, 0x0CAE, 0x5C70, 0x4487, 0x5C71, 0x0881, 0x5C76, 0x1234,
+ 0x5C79, 0x1235, 0x5C7A, 0x41C7, 0x5C7C, 0x3891, 0x5C88, 0x448C,
+ 0x5C8A, 0x448D, 0x5C8C, 0x1236, 0x5C8F, 0x41C8, 0x5C90, 0x0630,
+ 0x5C91, 0x1237, 0x5C94, 0x1238, 0x5C9F, 0x41C9, 0x5CA0, 0x4491,
+ 0x5CA1, 0x052C, 0x5CA2, 0x4492, 0x5CA3, 0x41CA, 0x5CA6, 0x20F6,
+ 0x5CA7, 0x4493, 0x5CA8, 0x0ABD, 0x5CA9, 0x0620, 0x5CAA, 0x41CB,
+ 0x5CAB, 0x123A, 0x5CAC, 0x0EB4, 0x5CAD, 0x4495, 0x5CB1, 0x0B32,
+ 0x5CB3, 0x05B7, 0x5CB5, 0x4496, 0x5CB6, 0x123C, 0x5CB7, 0x123E,
+ 0x5CB8, 0x061B, 0x5CBA, 0x20F7, 0x5CBB, 0x123B, 0x5CBC, 0x123D,
+ 0x5CBE, 0x1240, 0x5CC5, 0x123F, 0x5CC7, 0x1241, 0x5CC9, 0x4498,
+ 0x5CCB, 0x3892, 0x5CD0, 0x41CC, 0x5CD2, 0x3893, 0x5CD9, 0x1242,
+ 0x5CDD, 0x4B83, 0x5CE0, 0x0C95, 0x5CE1, 0x06A6, 0x5CE6, 0x372C,
+ 0x5CE8, 0x0565, 0x5CE9, 0x1243, 0x5CEA, 0x1248, 0x5CED, 0x1246,
+ 0x5CEF, 0x0E47, 0x5CF0, 0x0E46, 0x5CF4, 0x3894, 0x5CF5, 0x20F8,
+ 0x5CF6, 0x0C61, 0x5CFA, 0x1245, 0x5CFB, 0x095E, 0x5CFD, 0x1244,
+ 0x5D01, 0x4B84, 0x5D06, 0x449B, 0x5D07, 0x0A38, 0x5D0B, 0x1249,
+ 0x5D0D, 0x41CE, 0x5D0E, 0x085A, 0x5D10, 0x449C, 0x5D11, 0x124F,
+ 0x5D14, 0x1250, 0x5D15, 0x124A, 0x5D16, 0x0591, 0x5D17, 0x124B,
+ 0x5D18, 0x1254, 0x5D19, 0x1253, 0x5D1A, 0x1252, 0x5D1B, 0x124E,
+ 0x5D1D, 0x449E, 0x5D1F, 0x124D, 0x5D20, 0x449F, 0x5D22, 0x1251,
+ 0x5D24, 0x3895, 0x5D26, 0x3896, 0x5D27, 0x20F9, 0x5D29, 0x0E48,
+ 0x5D2B, 0x449D, 0x5D31, 0x44A0, 0x5D34, 0x4B85, 0x5D39, 0x44A1,
+ 0x5D3D, 0x4B86, 0x5D42, 0x20FC, 0x5D43, 0x3897, 0x5D46, 0x3898,
+ 0x5D47, 0x41CF, 0x5D4A, 0x3899, 0x5D4B, 0x1258, 0x5D4C, 0x1255,
+ 0x5D4E, 0x1257, 0x5D50, 0x0F5C, 0x5D52, 0x1256, 0x5D53, 0x20FA,
+ 0x5D59, 0x4B87, 0x5D5C, 0x124C, 0x5D61, 0x44A3, 0x5D69, 0x0A39,
+ 0x5D6A, 0x44A4, 0x5D6C, 0x1259, 0x5D6D, 0x20FD, 0x5D6F, 0x0827,
+ 0x5D70, 0x44A6, 0x5D73, 0x125A, 0x5D76, 0x125B, 0x5D7E, 0x4B88,
+ 0x5D81, 0x41D0, 0x5D82, 0x125E, 0x5D83, 0x4B89, 0x5D84, 0x125D,
+ 0x5D87, 0x125C, 0x5D88, 0x44A9, 0x5D8B, 0x0C62, 0x5D8C, 0x1247,
+ 0x5D90, 0x1264, 0x5D92, 0x389A, 0x5D94, 0x389B, 0x5D97, 0x44AB,
+ 0x5D99, 0x389C, 0x5D9D, 0x1260, 0x5DA0, 0x389D, 0x5DA2, 0x125F,
+ 0x5DA4, 0x41D1, 0x5DA7, 0x41D2, 0x5DAC, 0x1261, 0x5DAE, 0x1262,
+ 0x5DB0, 0x44AC, 0x5DB2, 0x3C2D, 0x5DB4, 0x44AD, 0x5DB7, 0x1265,
+ 0x5DB8, 0x20FE, 0x5DB9, 0x20FF, 0x5DBA, 0x0FAE, 0x5DBC, 0x1266,
+ 0x5DBD, 0x1263, 0x5DC7, 0x4B8A, 0x5DC9, 0x1267, 0x5DCB, 0x41D3,
+ 0x5DCC, 0x061C, 0x5DCD, 0x1268, 0x5DD0, 0x2100, 0x5DD1, 0x44AF,
+ 0x5DD2, 0x126A, 0x5DD3, 0x1269, 0x5DD6, 0x126B, 0x5DD7, 0x44B0,
+ 0x5DD8, 0x389E, 0x5DDB, 0x126C, 0x5DDD, 0x0A92, 0x5DDE, 0x092D,
+ 0x5DE0, 0x389F, 0x5DE1, 0x096E, 0x5DE2, 0x3432, 0x5DE3, 0x0AE5,
+ 0x5DE4, 0x44B2, 0x5DE5, 0x07BB, 0x5DE6, 0x0828, 0x5DE7, 0x07BC,
+ 0x5DE8, 0x068A, 0x5DE9, 0x44B3, 0x5DEB, 0x126D, 0x5DEE, 0x0829,
+ 0x5DF1, 0x077E, 0x5DF2, 0x126E, 0x5DF3, 0x0EB2, 0x5DF4, 0x0CF9,
+ 0x5DF5, 0x126F, 0x5DF7, 0x07BD, 0x5DF8, 0x38A0, 0x5DF9, 0x4B8B,
+ 0x5DFB, 0x05E8, 0x5DFD, 0x0B65, 0x5DFE, 0x06CA, 0x5DFF, 0x35E2,
+ 0x5E00, 0x38A1, 0x5E02, 0x08A2, 0x5E03, 0x0DCD, 0x5E06, 0x0D55,
+ 0x5E0B, 0x1270, 0x5E0C, 0x0631, 0x5E11, 0x1273, 0x5E12, 0x38A2,
+ 0x5E14, 0x38A3, 0x5E15, 0x38A4, 0x5E16, 0x0BBD, 0x5E18, 0x38A5,
+ 0x5E19, 0x1272, 0x5E1A, 0x1271, 0x5E1B, 0x1274, 0x5E1D, 0x0C07,
+ 0x5E1F, 0x44B7, 0x5E25, 0x0A29, 0x5E28, 0x4B8C, 0x5E2B, 0x08A3,
+ 0x5E2D, 0x0A6E, 0x5E2E, 0x38A6, 0x5E2F, 0x0B33, 0x5E30, 0x063C,
+ 0x5E32, 0x4B8D, 0x5E33, 0x0BBE, 0x5E35, 0x4B8E, 0x5E36, 0x1275,
+ 0x5E37, 0x1276, 0x5E38, 0x09D7, 0x5E3D, 0x0E67, 0x5E3E, 0x44B8,
+ 0x5E40, 0x1279, 0x5E43, 0x1278, 0x5E44, 0x1277, 0x5E45, 0x0DEF,
+ 0x5E47, 0x1280, 0x5E49, 0x44B9, 0x5E4C, 0x0E88, 0x5E4E, 0x127A,
+ 0x5E54, 0x127C, 0x5E55, 0x0E99, 0x5E56, 0x44BB, 0x5E57, 0x127B,
+ 0x5E58, 0x38A7, 0x5E5B, 0x4B8F, 0x5E5E, 0x41D4, 0x5E5F, 0x127D,
+ 0x5E61, 0x0D3C, 0x5E62, 0x127E, 0x5E63, 0x0E0E, 0x5E64, 0x127F,
+ 0x5E68, 0x4B90, 0x5E6A, 0x4B91, 0x5E6B, 0x38A8, 0x5E6C, 0x38A9,
+ 0x5E6D, 0x44BD, 0x5E6E, 0x44BE, 0x5E72, 0x05EF, 0x5E73, 0x0E0F,
+ 0x5E74, 0x0CE5, 0x5E75, 0x1281, 0x5E76, 0x1282, 0x5E77, 0x4B92,
+ 0x5E78, 0x07BE, 0x5E79, 0x05F0, 0x5E7A, 0x1283, 0x5E7B, 0x076C,
+ 0x5E7C, 0x0F2E, 0x5E7D, 0x0F13, 0x5E7E, 0x0632, 0x5E7F, 0x1285,
+ 0x5E80, 0x4B93, 0x5E81, 0x0BBF, 0x5E83, 0x07BF, 0x5E84, 0x0999,
+ 0x5E87, 0x0D73, 0x5E8A, 0x099A, 0x5E8B, 0x4B94, 0x5E8F, 0x0982,
+ 0x5E95, 0x0C08, 0x5E96, 0x0E49, 0x5E97, 0x0C33, 0x5E99, 0x36B0,
+ 0x5E9A, 0x07C0, 0x5E9C, 0x0DCE, 0x5EA0, 0x1286, 0x5EA5, 0x44C0,
+ 0x5EA6, 0x0C53, 0x5EA7, 0x0832, 0x5EA8, 0x38AA, 0x5EAA, 0x38AB,
+ 0x5EAB, 0x077F, 0x5EAC, 0x44C1, 0x5EAD, 0x0C09, 0x5EB3, 0x4B95,
+ 0x5EB5, 0x0487, 0x5EB6, 0x0978, 0x5EB7, 0x07C1, 0x5EB8, 0x0F31,
+ 0x5EB9, 0x44C2, 0x5EBD, 0x4B96, 0x5EBE, 0x38AC, 0x5EBF, 0x38AD,
+ 0x5EC1, 0x1287, 0x5EC2, 0x1288, 0x5EC3, 0x0D07, 0x5EC6, 0x44C3,
+ 0x5EC8, 0x1289, 0x5EC9, 0x0FBF, 0x5ECA, 0x0FD3, 0x5ECB, 0x3C1E,
+ 0x5ECF, 0x128B, 0x5ED0, 0x128A, 0x5ED1, 0x4B97, 0x5ED2, 0x38AF,
+ 0x5ED3, 0x05A5, 0x5ED4, 0x4B98, 0x5ED5, 0x4B99, 0x5ED6, 0x128C,
+ 0x5ED9, 0x44C4, 0x5EDA, 0x128F, 0x5EDB, 0x1290, 0x5EDD, 0x128E,
+ 0x5EDF, 0x0DB2, 0x5EE0, 0x099B, 0x5EE1, 0x1292, 0x5EE2, 0x1291,
+ 0x5EE3, 0x128D, 0x5EE8, 0x1293, 0x5EE9, 0x1294, 0x5EEC, 0x1295,
+ 0x5EF0, 0x1298, 0x5EF1, 0x1296, 0x5EF3, 0x1297, 0x5EF4, 0x1299,
+ 0x5EF6, 0x0506, 0x5EF7, 0x0C0A, 0x5EF8, 0x129A, 0x5EF9, 0x41D5,
+ 0x5EFA, 0x0750, 0x5EFB, 0x0576, 0x5EFC, 0x0CEC, 0x5EFD, 0x44C6,
+ 0x5EFE, 0x129B, 0x5EFF, 0x0CD3, 0x5F00, 0x41D6, 0x5F01, 0x0E2B,
+ 0x5F02, 0x41D7, 0x5F03, 0x129C, 0x5F04, 0x0FD4, 0x5F07, 0x38B0,
+ 0x5F08, 0x44C7, 0x5F09, 0x129D, 0x5F0A, 0x0E10, 0x5F0B, 0x12A0,
+ 0x5F0C, 0x0FFA, 0x5F0D, 0x100A, 0x5F0E, 0x38B1, 0x5F0F, 0x08DC,
+ 0x5F10, 0x0CCD, 0x5F11, 0x12A1, 0x5F13, 0x0677, 0x5F14, 0x0BC0,
+ 0x5F15, 0x04BE, 0x5F16, 0x12A2, 0x5F17, 0x0DF6, 0x5F18, 0x07C2,
+ 0x5F1B, 0x0B8E, 0x5F1C, 0x38B2, 0x5F1D, 0x38B3, 0x5F1E, 0x44C9,
+ 0x5F1F, 0x0C0B, 0x5F21, 0x2101, 0x5F22, 0x38B4, 0x5F23, 0x41D8,
+ 0x5F25, 0x0EFB, 0x5F26, 0x076D, 0x5F27, 0x0780, 0x5F28, 0x38B5,
+ 0x5F29, 0x12A3, 0x5F2D, 0x12A4, 0x5F2F, 0x12AA, 0x5F31, 0x0911,
+ 0x5F34, 0x2102, 0x5F35, 0x0BC1, 0x5F36, 0x38B6, 0x5F37, 0x06A7,
+ 0x5F38, 0x12A5, 0x5F3A, 0x3598, 0x5F3B, 0x38B7, 0x5F3C, 0x0D9D,
+ 0x5F3D, 0x41D9, 0x5F3E, 0x0B84, 0x5F40, 0x38B8, 0x5F41, 0x12A6,
+ 0x5F45, 0x20B2, 0x5F47, 0x44CA, 0x5F48, 0x12A7, 0x5F4A, 0x06A8,
+ 0x5F4C, 0x12A8, 0x5F4D, 0x4B9A, 0x5F4E, 0x12A9, 0x5F50, 0x38B9,
+ 0x5F51, 0x12AB, 0x5F53, 0x0C70, 0x5F54, 0x41DA, 0x5F56, 0x12AC,
+ 0x5F57, 0x12AD, 0x5F58, 0x38BA, 0x5F59, 0x12AE, 0x5F5C, 0x129F,
+ 0x5F5D, 0x129E, 0x5F61, 0x12AF, 0x5F62, 0x0717, 0x5F63, 0x44CB,
+ 0x5F64, 0x38BB, 0x5F65, 0x36AC, 0x5F66, 0x0D99, 0x5F67, 0x2103,
+ 0x5F69, 0x083C, 0x5F6A, 0x0DA9, 0x5F6B, 0x0BC2, 0x5F6C, 0x0DBD,
+ 0x5F6D, 0x12B0, 0x5F70, 0x099C, 0x5F71, 0x04E8, 0x5F72, 0x44CC,
+ 0x5F73, 0x12B1, 0x5F77, 0x12B2, 0x5F79, 0x0EFE, 0x5F7C, 0x0D74,
+ 0x5F7D, 0x41DB, 0x5F7E, 0x44CD, 0x5F7F, 0x12B5, 0x5F80, 0x051F,
+ 0x5F81, 0x0A50, 0x5F82, 0x12B4, 0x5F83, 0x12B3, 0x5F84, 0x0718,
+ 0x5F85, 0x0B34, 0x5F87, 0x12B9, 0x5F88, 0x12B7, 0x5F89, 0x38BC,
+ 0x5F8A, 0x12B6, 0x5F8B, 0x0F6F, 0x5F8C, 0x0799, 0x5F8F, 0x44CE,
+ 0x5F90, 0x0983, 0x5F91, 0x12B8, 0x5F92, 0x0C46, 0x5F93, 0x0948,
+ 0x5F97, 0x0C98, 0x5F98, 0x12BC, 0x5F99, 0x12BB, 0x5F9C, 0x38BD,
+ 0x5F9E, 0x12BA, 0x5FA0, 0x12BD, 0x5FA1, 0x079A, 0x5FA2, 0x44CF,
+ 0x5FA4, 0x38BF, 0x5FA7, 0x38BE, 0x5FA8, 0x12BE, 0x5FA9, 0x0DEE,
+ 0x5FAA, 0x0965, 0x5FAC, 0x4B9B, 0x5FAD, 0x12BF, 0x5FAE, 0x0D8D,
+ 0x5FAF, 0x38C0, 0x5FB3, 0x0C99, 0x5FB4, 0x0BC3, 0x5FB5, 0x3438,
+ 0x5FB7, 0x2104, 0x5FB8, 0x38C1, 0x5FB9, 0x0C2A, 0x5FBC, 0x12C0,
+ 0x5FBD, 0x0645, 0x5FC3, 0x09FA, 0x5FC4, 0x38C2, 0x5FC5, 0x0D9E,
+ 0x5FC7, 0x44D0, 0x5FC9, 0x38C3, 0x5FCB, 0x44D1, 0x5FCC, 0x0633,
+ 0x5FCD, 0x0CDC, 0x5FD2, 0x44D2, 0x5FD3, 0x44D3, 0x5FD4, 0x44D4,
+ 0x5FD6, 0x12C1, 0x5FD7, 0x08A4, 0x5FD8, 0x0E68, 0x5FD9, 0x0E69,
+ 0x5FDC, 0x0520, 0x5FDD, 0x12C6, 0x5FDE, 0x2105, 0x5FE0, 0x0BA7,
+ 0x5FE1, 0x38C4, 0x5FE2, 0x44D5, 0x5FE4, 0x12C3, 0x5FE9, 0x38C5,
+ 0x5FEA, 0x4B9C, 0x5FEB, 0x0577, 0x5FED, 0x38C6, 0x5FEE, 0x44D6,
+ 0x5FEF, 0x44D7, 0x5FF0, 0x12F6, 0x5FF1, 0x12C5, 0x5FF3, 0x44D8,
+ 0x5FF5, 0x0CE6, 0x5FF8, 0x12C4, 0x5FFB, 0x12C2, 0x5FFC, 0x38C7,
+ 0x5FFD, 0x080C, 0x5FFF, 0x12C8, 0x6007, 0x4B9D, 0x600D, 0x41DC,
+ 0x600E, 0x12CE, 0x600F, 0x12D4, 0x6010, 0x12CC, 0x6012, 0x0C56,
+ 0x6014, 0x41DD, 0x6015, 0x12D1, 0x6016, 0x0DCF, 0x6017, 0x38C8,
+ 0x6018, 0x41DE, 0x6019, 0x12CB, 0x601A, 0x38C9, 0x601B, 0x12D0,
+ 0x601C, 0x0FAF, 0x601D, 0x08A5, 0x6020, 0x0B35, 0x6021, 0x12C9,
+ 0x6022, 0x44DA, 0x6024, 0x44DB, 0x6025, 0x0678, 0x6026, 0x12D3,
+ 0x6027, 0x0A51, 0x6028, 0x0507, 0x6029, 0x12CD, 0x602A, 0x0578,
+ 0x602B, 0x12D2, 0x602F, 0x06A9, 0x6031, 0x12CF, 0x6033, 0x38CA,
+ 0x6035, 0x41DF, 0x603A, 0x12D5, 0x6041, 0x12D7, 0x6042, 0x12E1,
+ 0x6043, 0x12DF, 0x6046, 0x12DC, 0x6047, 0x41E0, 0x6049, 0x4B9E,
+ 0x604A, 0x12DB, 0x604B, 0x0FC0, 0x604C, 0x44DD, 0x604D, 0x12DD,
+ 0x6050, 0x06AA, 0x6052, 0x07C3, 0x6054, 0x4B9F, 0x6055, 0x0984,
+ 0x6059, 0x12E4, 0x605A, 0x12D6, 0x605D, 0x2106, 0x605F, 0x12DA,
+ 0x6060, 0x12CA, 0x6061, 0x38CB, 0x6062, 0x057A, 0x6063, 0x12DE,
+ 0x6064, 0x12E0, 0x6065, 0x0B8F, 0x6067, 0x4BA0, 0x6068, 0x0818,
+ 0x6069, 0x0538, 0x606A, 0x12D8, 0x606B, 0x12E3, 0x606C, 0x12E2,
+ 0x606D, 0x06AB, 0x606F, 0x0B09, 0x6070, 0x05C4, 0x6075, 0x0719,
+ 0x6077, 0x12D9, 0x607F, 0x38CC, 0x6081, 0x12E5, 0x6083, 0x12E8,
+ 0x6084, 0x12EA, 0x6085, 0x2107, 0x6089, 0x08E9, 0x608A, 0x2108,
+ 0x608B, 0x12F0, 0x608C, 0x0C0C, 0x608D, 0x12E6, 0x6092, 0x12EE,
+ 0x6094, 0x0579, 0x6095, 0x44DE, 0x6096, 0x12EC, 0x6097, 0x12ED,
+ 0x609A, 0x12E9, 0x609B, 0x12EB, 0x609D, 0x41E1, 0x609E, 0x38CD,
+ 0x609F, 0x079B, 0x60A0, 0x0F14, 0x60A3, 0x05F1, 0x60A4, 0x38CE,
+ 0x60A6, 0x04FB, 0x60A7, 0x12EF, 0x60A8, 0x44DF, 0x60A9, 0x0CF0,
+ 0x60AA, 0x0471, 0x60B0, 0x38CF, 0x60B1, 0x44E1, 0x60B2, 0x0D75,
+ 0x60B3, 0x12C7, 0x60B4, 0x12F5, 0x60B5, 0x12F9, 0x60B6, 0x0EF1,
+ 0x60B8, 0x12F2, 0x60BB, 0x4BA1, 0x60BC, 0x0C63, 0x60BD, 0x12F7,
+ 0x60BE, 0x44E2, 0x60C4, 0x4BA2, 0x60C5, 0x09D8, 0x60C6, 0x12F8,
+ 0x60C7, 0x0CAF, 0x60C8, 0x44E3, 0x60CB, 0x38D0, 0x60D1, 0x0FED,
+ 0x60D3, 0x12F4, 0x60D4, 0x41E2, 0x60D5, 0x210A, 0x60D8, 0x12FA,
+ 0x60D9, 0x44E4, 0x60DA, 0x080D, 0x60DB, 0x38D1, 0x60DC, 0x0A6F,
+ 0x60DD, 0x41E3, 0x60DE, 0x2109, 0x60DF, 0x0498, 0x60E0, 0x12F3,
+ 0x60E1, 0x12F1, 0x60E3, 0x0ADC, 0x60E7, 0x12E7, 0x60E8, 0x0882,
+ 0x60EE, 0x44E5, 0x60F0, 0x0B26, 0x60F1, 0x1306, 0x60F2, 0x210C,
+ 0x60F3, 0x0ADD, 0x60F4, 0x1301, 0x60F5, 0x44E6, 0x60F6, 0x12FE,
+ 0x60F7, 0x12FF, 0x60F8, 0x38D2, 0x60F9, 0x0912, 0x60FA, 0x1302,
+ 0x60FB, 0x1305, 0x60FD, 0x4BA3, 0x6100, 0x1300, 0x6101, 0x092F,
+ 0x6103, 0x1303, 0x6106, 0x12FD, 0x6108, 0x0F08, 0x6109, 0x0F07,
+ 0x610A, 0x4BA4, 0x610D, 0x1307, 0x610E, 0x1308, 0x610F, 0x0499,
+ 0x6110, 0x44E7, 0x6111, 0x210D, 0x6112, 0x38D3, 0x6113, 0x38D4,
+ 0x6114, 0x38D5, 0x6115, 0x12FC, 0x6116, 0x4BA5, 0x6119, 0x44E8,
+ 0x611A, 0x06EA, 0x611B, 0x046A, 0x611C, 0x38D6, 0x611E, 0x44E9,
+ 0x611F, 0x05F2, 0x6120, 0x210B, 0x6121, 0x1304, 0x6127, 0x130C,
+ 0x6128, 0x130B, 0x612A, 0x4BA6, 0x612B, 0x41E4, 0x612C, 0x1310,
+ 0x6130, 0x210F, 0x6134, 0x1311, 0x6136, 0x4BA7, 0x6137, 0x210E,
+ 0x613A, 0x44EA, 0x613C, 0x130F, 0x613D, 0x1312, 0x613E, 0x130A,
+ 0x613F, 0x130E, 0x6141, 0x44EC, 0x6142, 0x1313, 0x6144, 0x1314,
+ 0x6146, 0x44ED, 0x6147, 0x1309, 0x6148, 0x08CA, 0x614A, 0x130D,
+ 0x614B, 0x0B36, 0x614C, 0x07C4, 0x614D, 0x12FB, 0x614E, 0x09FB,
+ 0x6153, 0x1321, 0x6155, 0x0E39, 0x6158, 0x1317, 0x6159, 0x1318,
+ 0x615A, 0x1319, 0x615D, 0x1320, 0x615E, 0x4BA8, 0x615F, 0x131F,
+ 0x6160, 0x44EE, 0x6162, 0x0EAB, 0x6163, 0x05F3, 0x6164, 0x4BA9,
+ 0x6165, 0x131D, 0x6167, 0x071B, 0x6168, 0x0592, 0x616B, 0x131A,
+ 0x616E, 0x0F80, 0x616F, 0x131C, 0x6170, 0x049A, 0x6171, 0x131E,
+ 0x6173, 0x1315, 0x6174, 0x131B, 0x6175, 0x1322, 0x6176, 0x071A,
+ 0x6177, 0x1316, 0x617B, 0x4BAA, 0x617C, 0x38D7, 0x617D, 0x4BAB,
+ 0x617E, 0x0F47, 0x617F, 0x4BAC, 0x6182, 0x0F15, 0x6187, 0x1325,
+ 0x618A, 0x1329, 0x618D, 0x38D8, 0x618E, 0x0B00, 0x6190, 0x0FC1,
+ 0x6191, 0x132A, 0x6192, 0x44F0, 0x6193, 0x44F1, 0x6194, 0x1327,
+ 0x6196, 0x1324, 0x6197, 0x44F2, 0x6198, 0x2110, 0x6199, 0x1323,
+ 0x619A, 0x1328, 0x619D, 0x4BAD, 0x619F, 0x38D9, 0x61A4, 0x0E00,
+ 0x61A5, 0x44F3, 0x61A7, 0x0C8C, 0x61A8, 0x38DA, 0x61A9, 0x071C,
+ 0x61AB, 0x132B, 0x61AC, 0x1326, 0x61AD, 0x44F4, 0x61AE, 0x132C,
+ 0x61B2, 0x0751, 0x61B6, 0x0531, 0x61B8, 0x4BAE, 0x61B9, 0x41E6,
+ 0x61BA, 0x1334, 0x61BC, 0x41E5, 0x61BE, 0x05F4, 0x61C2, 0x38DB,
+ 0x61C3, 0x1332, 0x61C6, 0x1333, 0x61C7, 0x0819, 0x61C8, 0x1331,
+ 0x61C9, 0x132F, 0x61CA, 0x132E, 0x61CB, 0x1335, 0x61CC, 0x132D,
+ 0x61CD, 0x1337, 0x61D0, 0x057B, 0x61D5, 0x44F6, 0x61DC, 0x4BAF,
+ 0x61DD, 0x44F7, 0x61DF, 0x38DC, 0x61E2, 0x4BB0, 0x61E3, 0x1339,
+ 0x61E5, 0x4BB1, 0x61E6, 0x1338, 0x61E8, 0x4BB2, 0x61F2, 0x0BC4,
+ 0x61F4, 0x133C, 0x61F5, 0x44F8, 0x61F6, 0x133A, 0x61F7, 0x1330,
+ 0x61F8, 0x0752, 0x61FA, 0x133B, 0x61FC, 0x133F, 0x61FD, 0x133E,
+ 0x61FE, 0x1340, 0x61FF, 0x133D, 0x6200, 0x1341, 0x6204, 0x4BB3,
+ 0x6207, 0x4BB4, 0x6208, 0x1342, 0x6209, 0x1343, 0x620A, 0x0E3A,
+ 0x620C, 0x1345, 0x620D, 0x1344, 0x620E, 0x0949, 0x6210, 0x0A52,
+ 0x6211, 0x0566, 0x6212, 0x057C, 0x6213, 0x2111, 0x6214, 0x1346,
+ 0x6215, 0x38DD, 0x6216, 0x0483, 0x621A, 0x0A70, 0x621B, 0x1347,
+ 0x621D, 0x1A64, 0x621E, 0x1348, 0x621F, 0x0737, 0x6221, 0x1349,
+ 0x6222, 0x41E7, 0x6223, 0x44FA, 0x6226, 0x0A93, 0x6229, 0x38DE,
+ 0x622A, 0x134A, 0x622E, 0x134B, 0x622F, 0x0654, 0x6230, 0x134C,
+ 0x6231, 0x4BB5, 0x6232, 0x134D, 0x6233, 0x134E, 0x6234, 0x0B37,
+ 0x6236, 0x35BD, 0x6238, 0x0781, 0x6239, 0x4BB6, 0x623B, 0x0EED,
+ 0x623D, 0x4BB7, 0x623E, 0x344E, 0x623F, 0x0E6A, 0x6240, 0x0974,
+ 0x6241, 0x134F, 0x6243, 0x38DF, 0x6246, 0x38E0, 0x6247, 0x0A94,
+ 0x6248, 0x1B1A, 0x6249, 0x0D76, 0x624B, 0x0916, 0x624C, 0x38E1,
+ 0x624D, 0x083D, 0x624E, 0x1350, 0x6251, 0x38E2, 0x6252, 0x44FB,
+ 0x6253, 0x0B27, 0x6255, 0x0DF7, 0x6256, 0x38E3, 0x6258, 0x0B51,
+ 0x625A, 0x41E8, 0x625B, 0x1353, 0x625E, 0x1351, 0x6260, 0x1354,
+ 0x6261, 0x44FC, 0x6263, 0x1352, 0x6264, 0x44FD, 0x6268, 0x1355,
+ 0x626D, 0x44FF, 0x626E, 0x0E01, 0x626F, 0x41E9, 0x6271, 0x047B,
+ 0x6273, 0x4500, 0x6276, 0x0DD0, 0x6279, 0x0D77, 0x627A, 0x4BB8,
+ 0x627B, 0x44FE, 0x627C, 0x1356, 0x627E, 0x1359, 0x627F, 0x099D,
+ 0x6280, 0x0655, 0x6282, 0x1357, 0x6283, 0x135E, 0x6284, 0x099E,
+ 0x6285, 0x35C5, 0x6289, 0x1358, 0x628A, 0x0CFA, 0x6290, 0x4BB9,
+ 0x6291, 0x0F48, 0x6292, 0x135A, 0x6293, 0x135B, 0x6294, 0x135F,
+ 0x6295, 0x0C64, 0x6296, 0x135C, 0x6297, 0x07C5, 0x6298, 0x0A82,
+ 0x6299, 0x4501, 0x629B, 0x136D, 0x629C, 0x0D48, 0x629E, 0x0B52,
+ 0x62A6, 0x2112, 0x62A8, 0x4BBA, 0x62AB, 0x0D78, 0x62AC, 0x13B2,
+ 0x62B1, 0x0E4A, 0x62B5, 0x0C0D, 0x62B9, 0x0EA3, 0x62BB, 0x1362,
+ 0x62BC, 0x0521, 0x62BD, 0x0BA8, 0x62C2, 0x136B, 0x62C4, 0x38E4,
+ 0x62C5, 0x0B72, 0x62C6, 0x1365, 0x62C7, 0x136C, 0x62C8, 0x1367,
+ 0x62C9, 0x136E, 0x62CA, 0x136A, 0x62CC, 0x1369, 0x62CD, 0x0D25,
+ 0x62CF, 0x1363, 0x62D0, 0x057D, 0x62D1, 0x1361, 0x62D2, 0x068B,
+ 0x62D3, 0x0B53, 0x62D4, 0x135D, 0x62D5, 0x4502, 0x62D6, 0x41EA,
+ 0x62D7, 0x1360, 0x62D8, 0x07C6, 0x62D9, 0x0A7F, 0x62DA, 0x4BBB,
+ 0x62DB, 0x099F, 0x62DC, 0x1368, 0x62DD, 0x0D08, 0x62E0, 0x068C,
+ 0x62E1, 0x05A6, 0x62EC, 0x05C5, 0x62ED, 0x09E7, 0x62EE, 0x1370,
+ 0x62EF, 0x1375, 0x62F1, 0x1371, 0x62F3, 0x0753, 0x62F4, 0x4BBC,
+ 0x62F5, 0x1376, 0x62F6, 0x0870, 0x62F7, 0x07FB, 0x62FC, 0x38E5,
+ 0x62FD, 0x4504, 0x62FE, 0x0930, 0x62FF, 0x1364, 0x6301, 0x08CB,
+ 0x6302, 0x1373, 0x6303, 0x4505, 0x6307, 0x08A6, 0x6308, 0x1374,
+ 0x6309, 0x0488, 0x630A, 0x38E6, 0x630C, 0x136F, 0x630D, 0x38E7,
+ 0x6310, 0x4506, 0x6311, 0x0BC5, 0x6316, 0x4BBD, 0x6318, 0x38E8,
+ 0x6319, 0x068D, 0x631B, 0x3737, 0x631F, 0x06AC, 0x6327, 0x1372,
+ 0x6328, 0x046B, 0x632A, 0x4BBE, 0x632B, 0x0833, 0x632F, 0x09FC,
+ 0x6332, 0x4509, 0x6335, 0x450A, 0x6336, 0x4BBF, 0x6339, 0x38E9,
+ 0x633A, 0x0C0E, 0x633B, 0x450B, 0x633C, 0x450C, 0x633D, 0x0D68,
+ 0x633E, 0x1378, 0x633F, 0x0AE0, 0x6341, 0x450D, 0x6342, 0x38EA,
+ 0x6343, 0x38EB, 0x6344, 0x450E, 0x6346, 0x4BC0, 0x6349, 0x0B0A,
+ 0x634B, 0x4BC1, 0x634C, 0x0879, 0x634D, 0x1379, 0x634E, 0x450F,
+ 0x634F, 0x137B, 0x6350, 0x1377, 0x6353, 0x4BC2, 0x6355, 0x0E31,
+ 0x6357, 0x0BD9, 0x6359, 0x4511, 0x635C, 0x0ADE, 0x6365, 0x38EC,
+ 0x6367, 0x0E4B, 0x6368, 0x08FA, 0x6369, 0x1387, 0x636B, 0x1386,
+ 0x636C, 0x4514, 0x636E, 0x0A3E, 0x6371, 0x4BC3, 0x6372, 0x0754,
+ 0x6374, 0x38ED, 0x6375, 0x4BC4, 0x6376, 0x1380, 0x6377, 0x09A1,
+ 0x637A, 0x0CC0, 0x637B, 0x0CE7, 0x637C, 0x41EB, 0x637D, 0x38EE,
+ 0x637F, 0x4BC5, 0x6380, 0x137E, 0x6382, 0x4BC6, 0x6383, 0x0ADF,
+ 0x6384, 0x38EF, 0x6387, 0x38F0, 0x6388, 0x0924, 0x6389, 0x1383,
+ 0x638A, 0x4BC7, 0x638C, 0x09A0, 0x638E, 0x137D, 0x638F, 0x1382,
+ 0x6390, 0x38F1, 0x6392, 0x0D09, 0x6394, 0x4517, 0x6396, 0x137C,
+ 0x6398, 0x06F7, 0x6399, 0x4515, 0x639B, 0x05BB, 0x639E, 0x38F2,
+ 0x639F, 0x1384, 0x63A0, 0x0F73, 0x63A1, 0x083E, 0x63A2, 0x0B73,
+ 0x63A3, 0x1381, 0x63A5, 0x0A80, 0x63A7, 0x07C7, 0x63A8, 0x0A2A,
+ 0x63A9, 0x0508, 0x63AA, 0x0ABE, 0x63AB, 0x137F, 0x63AC, 0x065F,
+ 0x63AE, 0x4BC8, 0x63AF, 0x4BC9, 0x63B2, 0x071D, 0x63B4, 0x0BEB,
+ 0x63B5, 0x1385, 0x63BB, 0x0AE1, 0x63BD, 0x4518, 0x63BE, 0x1388,
+ 0x63C0, 0x138A, 0x63C3, 0x0B17, 0x63C4, 0x1390, 0x63C6, 0x138B,
+ 0x63C9, 0x138D, 0x63CF, 0x0DB3, 0x63D0, 0x0C0F, 0x63D1, 0x38F3,
+ 0x63D2, 0x138E, 0x63D4, 0x4519, 0x63D5, 0x451A, 0x63D6, 0x0F16,
+ 0x63DA, 0x0F32, 0x63DB, 0x05F5, 0x63DC, 0x38F4, 0x63E0, 0x451B,
+ 0x63E1, 0x0472, 0x63E3, 0x138C, 0x63E5, 0x41EC, 0x63E9, 0x1389,
+ 0x63EA, 0x4BCA, 0x63EB, 0x451C, 0x63EC, 0x451D, 0x63ED, 0x341C,
+ 0x63EE, 0x0634, 0x63F2, 0x451E, 0x63F4, 0x0509, 0x63F5, 0x2113,
+ 0x63F6, 0x138F, 0x63F7, 0x3644, 0x63F8, 0x4BCB, 0x63F9, 0x4BCC,
+ 0x63FA, 0x0F33, 0x6406, 0x1393, 0x6409, 0x38F5, 0x640D, 0x0B1B,
+ 0x640F, 0x139A, 0x6410, 0x38F6, 0x6412, 0x4BCD, 0x6413, 0x1394,
+ 0x6414, 0x1E2C, 0x6416, 0x1391, 0x6417, 0x1398, 0x6418, 0x4BCE,
+ 0x641C, 0x137A, 0x641E, 0x451F, 0x6420, 0x4BCF, 0x6422, 0x38F7,
+ 0x6424, 0x4BD0, 0x6425, 0x4520, 0x6426, 0x1395, 0x6428, 0x1399,
+ 0x6429, 0x4521, 0x642A, 0x4BD1, 0x642C, 0x0D56, 0x642D, 0x0C65,
+ 0x642F, 0x4522, 0x6434, 0x1392, 0x6435, 0x4BD2, 0x6436, 0x1396,
+ 0x643A, 0x071E, 0x643D, 0x4BD3, 0x643E, 0x0861, 0x643F, 0x4BD4,
+ 0x6442, 0x0A81, 0x644E, 0x139E, 0x6451, 0x1E43, 0x6452, 0x4BD5,
+ 0x6454, 0x38F8, 0x6458, 0x0C20, 0x645A, 0x4523, 0x645B, 0x38F9,
+ 0x645D, 0x4524, 0x645F, 0x4BD6, 0x6460, 0x2114, 0x6467, 0x139B,
+ 0x6469, 0x0E8E, 0x646D, 0x38FA, 0x646F, 0x139C, 0x6473, 0x4525,
+ 0x6474, 0x4BD7, 0x6476, 0x139D, 0x6478, 0x0EDA, 0x6479, 0x41ED,
+ 0x647A, 0x0A46, 0x647B, 0x38FB, 0x647D, 0x4526, 0x6483, 0x0738,
+ 0x6487, 0x4527, 0x6488, 0x13A4, 0x6490, 0x4BD8, 0x6491, 0x4528,
+ 0x6492, 0x0883, 0x6493, 0x13A1, 0x6495, 0x13A0, 0x6498, 0x4BD9,
+ 0x6499, 0x4BDA, 0x649A, 0x0CE8, 0x649D, 0x2115, 0x649E, 0x0C8D,
+ 0x649F, 0x4529, 0x64A4, 0x0C2B, 0x64A5, 0x13A2, 0x64A9, 0x13A3,
+ 0x64AB, 0x0DE1, 0x64AC, 0x4BDB, 0x64AD, 0x0CFB, 0x64AE, 0x0871,
+ 0x64B0, 0x0A95, 0x64B2, 0x0E7E, 0x64B3, 0x4BDC, 0x64B9, 0x05A7,
+ 0x64BB, 0x13AA, 0x64BC, 0x13A5, 0x64BE, 0x38FC, 0x64BF, 0x38FD,
+ 0x64C1, 0x0F34, 0x64C2, 0x13AC, 0x64C4, 0x41EE, 0x64C5, 0x13A8,
+ 0x64C7, 0x13A9, 0x64CA, 0x341D, 0x64CB, 0x452A, 0x64CC, 0x452B,
+ 0x64CD, 0x0AE2, 0x64CE, 0x2116, 0x64D0, 0x41EF, 0x64D2, 0x13A7,
+ 0x64D4, 0x1366, 0x64D5, 0x452C, 0x64D7, 0x452D, 0x64D8, 0x13AB,
+ 0x64DA, 0x13A6, 0x64E0, 0x13B0, 0x64E1, 0x13B1, 0x64E2, 0x0C21,
+ 0x64E3, 0x13B3, 0x64E4, 0x452F, 0x64E5, 0x38FE, 0x64E6, 0x0872,
+ 0x64E7, 0x13AE, 0x64EC, 0x0656, 0x64ED, 0x4BDD, 0x64EF, 0x13B4,
+ 0x64F0, 0x4BDE, 0x64F1, 0x13AD, 0x64F2, 0x13B8, 0x64F4, 0x13B7,
+ 0x64F6, 0x13B6, 0x64F7, 0x38FF, 0x64FA, 0x13B9, 0x64FB, 0x3900,
+ 0x64FD, 0x13BB, 0x64FE, 0x09D9, 0x64FF, 0x4530, 0x6500, 0x13BA,
+ 0x6504, 0x3901, 0x6505, 0x13BE, 0x650F, 0x4532, 0x6514, 0x4533,
+ 0x6516, 0x3902, 0x6518, 0x13BC, 0x6519, 0x3903, 0x651B, 0x4BDF,
+ 0x651C, 0x13BD, 0x651D, 0x1397, 0x651E, 0x4535, 0x651F, 0x4BE0,
+ 0x6522, 0x1E97, 0x6523, 0x13C0, 0x6524, 0x13BF, 0x6529, 0x41F0,
+ 0x652A, 0x139F, 0x652B, 0x13C1, 0x652C, 0x13B5, 0x652E, 0x4BE1,
+ 0x652F, 0x08A7, 0x6532, 0x4536, 0x6534, 0x13C2, 0x6535, 0x13C3,
+ 0x6536, 0x13C5, 0x6537, 0x13C4, 0x6538, 0x13C6, 0x6539, 0x057E,
+ 0x653B, 0x07C8, 0x653E, 0x0E4C, 0x653F, 0x0A53, 0x6544, 0x4537,
+ 0x6545, 0x0782, 0x6547, 0x3904, 0x6548, 0x13C8, 0x6549, 0x4BE2,
+ 0x654D, 0x13CB, 0x654E, 0x2117, 0x654F, 0x0DC4, 0x6551, 0x0679,
+ 0x6554, 0x4538, 0x6555, 0x13CA, 0x6556, 0x13C9, 0x6557, 0x0D0A,
+ 0x6558, 0x13CC, 0x6559, 0x06AD, 0x655D, 0x13CE, 0x655E, 0x13CD,
+ 0x6560, 0x4BE3, 0x6562, 0x05F6, 0x6563, 0x0884, 0x6566, 0x0CB0,
+ 0x6567, 0x3905, 0x656B, 0x4539, 0x656C, 0x071F, 0x6570, 0x0A3A,
+ 0x6572, 0x13CF, 0x6574, 0x0A54, 0x6575, 0x0C22, 0x6577, 0x0DD1,
+ 0x6578, 0x13D0, 0x657A, 0x453A, 0x6581, 0x3906, 0x6582, 0x13D1,
+ 0x6583, 0x13D2, 0x6584, 0x453B, 0x6585, 0x3907, 0x6587, 0x0E08,
+ 0x6588, 0x120C, 0x6589, 0x0A6A, 0x658A, 0x453C, 0x658C, 0x0DBE,
+ 0x658E, 0x0848, 0x6590, 0x0D79, 0x6591, 0x0D57, 0x6592, 0x4BE4,
+ 0x6595, 0x4BE5, 0x6597, 0x0C47, 0x6599, 0x0F89, 0x659B, 0x13D4,
+ 0x659C, 0x08FC, 0x659D, 0x41F1, 0x659F, 0x13D5, 0x65A1, 0x047A,
+ 0x65A4, 0x06CC, 0x65A5, 0x0A71, 0x65A7, 0x0DD2, 0x65AB, 0x13D6,
+ 0x65AC, 0x0890, 0x65AD, 0x0B85, 0x65AF, 0x08A9, 0x65B0, 0x09FD,
+ 0x65B2, 0x453D, 0x65B4, 0x4BE6, 0x65B5, 0x453E, 0x65B7, 0x13D7,
+ 0x65B8, 0x453F, 0x65B9, 0x0E4D, 0x65BC, 0x0519, 0x65BD, 0x08AA,
+ 0x65BE, 0x4BE7, 0x65BF, 0x4540, 0x65C1, 0x13DA, 0x65C2, 0x3908,
+ 0x65C3, 0x13D8, 0x65C4, 0x13DB, 0x65C5, 0x0F81, 0x65C6, 0x13D9,
+ 0x65C8, 0x4BE8, 0x65C9, 0x4541, 0x65CB, 0x0A9F, 0x65CC, 0x13DC,
+ 0x65CE, 0x4BE9, 0x65CF, 0x0B12, 0x65D0, 0x4BEA, 0x65D2, 0x13DD,
+ 0x65D4, 0x4542, 0x65D7, 0x0636, 0x65D9, 0x13DF, 0x65DB, 0x13DE,
+ 0x65DF, 0x4BEB, 0x65E0, 0x13E0, 0x65E1, 0x13E1, 0x65E2, 0x0637,
+ 0x65E3, 0x3585, 0x65E5, 0x0CD4, 0x65E6, 0x0B74, 0x65E7, 0x0686,
+ 0x65E8, 0x08AB, 0x65E9, 0x0AE3, 0x65EC, 0x0966, 0x65ED, 0x0474,
+ 0x65F0, 0x3909, 0x65F1, 0x13E2, 0x65F2, 0x390A, 0x65F9, 0x4544,
+ 0x65FA, 0x0522, 0x65FB, 0x13E6, 0x65FC, 0x4545, 0x6600, 0x2118,
+ 0x6602, 0x07C9, 0x6603, 0x13E5, 0x6604, 0x4546, 0x6606, 0x081B,
+ 0x6607, 0x09A2, 0x6608, 0x4547, 0x6609, 0x211A, 0x660A, 0x13E4,
+ 0x660C, 0x09A3, 0x660E, 0x0ECC, 0x660F, 0x081A, 0x6613, 0x049B,
+ 0x6614, 0x0A72, 0x6615, 0x2119, 0x661C, 0x13EB, 0x661E, 0x4F50,
+ 0x661F, 0x0A55, 0x6620, 0x04E9, 0x6621, 0x4548, 0x6622, 0x41F3,
+ 0x6624, 0x211D, 0x6625, 0x095F, 0x6627, 0x0E94, 0x6628, 0x0862,
+ 0x662A, 0x4549, 0x662B, 0x41F4, 0x662C, 0x390B, 0x662D, 0x09A4,
+ 0x662E, 0x211B, 0x662F, 0x0A4B, 0x6630, 0x41F5, 0x6631, 0x20AE,
+ 0x6633, 0x41F6, 0x6634, 0x13EA, 0x6635, 0x13E8, 0x6636, 0x13E9,
+ 0x663A, 0x41F2, 0x663B, 0x1E00, 0x663C, 0x0BA9, 0x663F, 0x1409,
+ 0x6641, 0x13EF, 0x6642, 0x08CC, 0x6643, 0x07CA, 0x6644, 0x13ED,
+ 0x6645, 0x454A, 0x6648, 0x41F7, 0x6649, 0x13EE, 0x664B, 0x09FE,
+ 0x664C, 0x390C, 0x664E, 0x454C, 0x664F, 0x13EC, 0x6651, 0x454B,
+ 0x6652, 0x087D, 0x6657, 0x211F, 0x6659, 0x2120, 0x665A, 0x3441,
+ 0x665B, 0x390D, 0x665C, 0x390E, 0x665D, 0x13F1, 0x665E, 0x13F0,
+ 0x665F, 0x13F5, 0x6661, 0x390F, 0x6662, 0x13F6, 0x6663, 0x373A,
+ 0x6664, 0x13F2, 0x6665, 0x211E, 0x6666, 0x0580, 0x6667, 0x13F3,
+ 0x6668, 0x13F4, 0x6669, 0x0D69, 0x666A, 0x4551, 0x666B, 0x3910,
+ 0x666C, 0x4552, 0x666D, 0x4553, 0x666E, 0x0DD3, 0x666F, 0x0720,
+ 0x6670, 0x13F7, 0x6673, 0x2122, 0x6674, 0x0A56, 0x6676, 0x09A5,
+ 0x6677, 0x41F9, 0x6678, 0x41FA, 0x667A, 0x0B90, 0x667B, 0x4554,
+ 0x667E, 0x4BEC, 0x6680, 0x4555, 0x6681, 0x06BF, 0x6683, 0x13F8,
+ 0x6684, 0x13FC, 0x6687, 0x054B, 0x6688, 0x13F9, 0x6689, 0x13FB,
+ 0x668B, 0x4BED, 0x668C, 0x4BEE, 0x668D, 0x41FB, 0x668E, 0x13FA,
+ 0x6690, 0x4556, 0x6691, 0x0975, 0x6692, 0x4557, 0x6696, 0x0B86,
+ 0x6697, 0x0489, 0x6698, 0x13FD, 0x6699, 0x2123, 0x669D, 0x13FE,
+ 0x66A0, 0x2124, 0x66A2, 0x0BC6, 0x66A4, 0x3912, 0x66A6, 0x0FB9,
+ 0x66AB, 0x0891, 0x66AD, 0x4559, 0x66AE, 0x0E3B, 0x66B1, 0x455A,
+ 0x66B2, 0x2125, 0x66B3, 0x4BEF, 0x66B4, 0x0E6B, 0x66B5, 0x455B,
+ 0x66B8, 0x1405, 0x66B9, 0x1400, 0x66BB, 0x41FC, 0x66BC, 0x1403,
+ 0x66BE, 0x1402, 0x66BF, 0x2126, 0x66C0, 0x4BF0, 0x66C1, 0x13FF,
+ 0x66C4, 0x1404, 0x66C6, 0x3455, 0x66C7, 0x0CB6, 0x66C8, 0x3913,
+ 0x66C9, 0x1401, 0x66CF, 0x4BF1, 0x66D6, 0x1406, 0x66D9, 0x0976,
+ 0x66DA, 0x1407, 0x66DB, 0x41FD, 0x66DC, 0x0F35, 0x66DD, 0x0D2E,
+ 0x66E0, 0x1408, 0x66E6, 0x140A, 0x66E8, 0x41FE, 0x66E9, 0x140B,
+ 0x66EC, 0x3914, 0x66F0, 0x140C, 0x66F2, 0x06C2, 0x66F3, 0x04EA,
+ 0x66F4, 0x07CB, 0x66F5, 0x140D, 0x66F7, 0x140E, 0x66F8, 0x097B,
+ 0x66F9, 0x0AE4, 0x66FA, 0x2127, 0x66FB, 0x20B1, 0x66FC, 0x10ED,
+ 0x66FD, 0x0AC0, 0x66FE, 0x0ABF, 0x66FF, 0x0B38, 0x6700, 0x0837,
+ 0x6701, 0x455F, 0x6703, 0x104B, 0x6705, 0x3915, 0x6708, 0x0744,
+ 0x6709, 0x0F17, 0x670B, 0x0E4E, 0x670D, 0x0DF0, 0x670E, 0x2128,
+ 0x670F, 0x140F, 0x6712, 0x4560, 0x6713, 0x3916, 0x6714, 0x0863,
+ 0x6715, 0x0BDB, 0x6716, 0x1410, 0x6717, 0x0FD5, 0x6719, 0x4562,
+ 0x671B, 0x0E6C, 0x671D, 0x0BC7, 0x671E, 0x1411, 0x671F, 0x0638,
+ 0x6725, 0x4BF2, 0x6726, 0x1412, 0x6727, 0x1413, 0x6728, 0x0EE6,
+ 0x672A, 0x0EB0, 0x672B, 0x0EA4, 0x672C, 0x0E8A, 0x672D, 0x0873,
+ 0x672E, 0x1415, 0x6731, 0x0917, 0x6733, 0x3917, 0x6734, 0x0E7F,
+ 0x6735, 0x4BF3, 0x6736, 0x1417, 0x6737, 0x141A, 0x6738, 0x1419,
+ 0x673A, 0x0635, 0x673D, 0x067A, 0x673F, 0x1416, 0x6741, 0x1418,
+ 0x6743, 0x35B7, 0x6746, 0x141B, 0x6747, 0x41FF, 0x6748, 0x3918,
+ 0x6749, 0x0A3F, 0x674C, 0x3919, 0x674D, 0x4565, 0x674E, 0x0F65,
+ 0x674F, 0x048D, 0x6750, 0x0850, 0x6751, 0x0B1C, 0x6753, 0x0909,
+ 0x6754, 0x4566, 0x6755, 0x4BF4, 0x6756, 0x09DB, 0x6759, 0x141E,
+ 0x675C, 0x0C48, 0x675D, 0x4567, 0x675E, 0x141C, 0x675F, 0x0B0B,
+ 0x6760, 0x141D, 0x6761, 0x09DA, 0x6762, 0x0EE9, 0x6763, 0x141F,
+ 0x6764, 0x1420, 0x6765, 0x0F52, 0x6766, 0x212A, 0x676A, 0x1425,
+ 0x676D, 0x07CC, 0x676E, 0x3571, 0x676F, 0x0D0B, 0x6770, 0x1422,
+ 0x6771, 0x0C66, 0x6772, 0x13E3, 0x6773, 0x13E7, 0x6774, 0x456B,
+ 0x6775, 0x0669, 0x6776, 0x391A, 0x6777, 0x0CFD, 0x677B, 0x391B,
+ 0x677C, 0x1424, 0x677E, 0x09A6, 0x677F, 0x0D58, 0x6780, 0x4BF5,
+ 0x6781, 0x4200, 0x6785, 0x142A, 0x6787, 0x0D8E, 0x6789, 0x1421,
+ 0x678B, 0x1427, 0x678C, 0x1426, 0x678F, 0x4BF6, 0x6790, 0x0A73,
+ 0x6791, 0x4BF7, 0x6792, 0x456D, 0x6793, 0x4201, 0x6795, 0x0E9B,
+ 0x6797, 0x0F9B, 0x6798, 0x4202, 0x679A, 0x0E95, 0x679B, 0x4203,
+ 0x679C, 0x054C, 0x679D, 0x08AC, 0x67A0, 0x0FEE, 0x67A1, 0x1429,
+ 0x67A2, 0x0A3B, 0x67A4, 0x4BF8, 0x67A6, 0x1428, 0x67A9, 0x1423,
+ 0x67AF, 0x0783, 0x67B0, 0x391C, 0x67B1, 0x4BF9, 0x67B2, 0x391D,
+ 0x67B3, 0x142F, 0x67B4, 0x142D, 0x67B5, 0x4BFA, 0x67B6, 0x054D,
+ 0x67B7, 0x142B, 0x67B8, 0x1431, 0x67B9, 0x1437, 0x67BB, 0x212B,
+ 0x67BE, 0x4BFB, 0x67C0, 0x212D, 0x67C1, 0x0B28, 0x67C3, 0x4571,
+ 0x67C4, 0x0E11, 0x67C6, 0x1439, 0x67C8, 0x4572, 0x67CA, 0x0D94,
+ 0x67CE, 0x1438, 0x67CF, 0x0D26, 0x67D0, 0x0E6D, 0x67D1, 0x05F7,
+ 0x67D2, 0x4573, 0x67D3, 0x0A9B, 0x67D4, 0x094A, 0x67D7, 0x391F,
+ 0x67D8, 0x0BEF, 0x67D9, 0x3920, 0x67DA, 0x0F18, 0x67DB, 0x4574,
+ 0x67DD, 0x1434, 0x67DE, 0x1433, 0x67E2, 0x1435, 0x67E4, 0x1432,
+ 0x67E7, 0x143A, 0x67E9, 0x1430, 0x67EC, 0x142E, 0x67EE, 0x1436,
+ 0x67EF, 0x142C, 0x67F0, 0x3921, 0x67F1, 0x0BAA, 0x67F3, 0x0F04,
+ 0x67F4, 0x08F2, 0x67F5, 0x0864, 0x67F7, 0x4575, 0x67F9, 0x391E,
+ 0x67FA, 0x1E9A, 0x67FB, 0x082A, 0x67FC, 0x4204, 0x67FE, 0x0E9D,
+ 0x67FF, 0x059F, 0x6801, 0x36F2, 0x6802, 0x0BEA, 0x6803, 0x0CA2,
+ 0x6804, 0x04EB, 0x6805, 0x1E07, 0x6810, 0x4570, 0x6813, 0x0A96,
+ 0x6816, 0x0A58, 0x6817, 0x0700, 0x6818, 0x4579, 0x681D, 0x4205,
+ 0x681E, 0x143C, 0x681F, 0x457A, 0x6821, 0x07CD, 0x6822, 0x05DA,
+ 0x6828, 0x4BFC, 0x6829, 0x143E, 0x682A, 0x05D2, 0x682B, 0x1444,
+ 0x682C, 0x3922, 0x682D, 0x457B, 0x6830, 0x3923, 0x6831, 0x3924,
+ 0x6832, 0x1441, 0x6833, 0x457D, 0x6834, 0x0A97, 0x6838, 0x05A9,
+ 0x6839, 0x081C, 0x683B, 0x457E, 0x683C, 0x05A8, 0x683D, 0x083F,
+ 0x683E, 0x457F, 0x6840, 0x143F, 0x6841, 0x073B, 0x6842, 0x0721,
+ 0x6843, 0x0C67, 0x6844, 0x212F, 0x6845, 0x4580, 0x6846, 0x143D,
+ 0x6848, 0x048A, 0x6849, 0x4581, 0x684C, 0x4582, 0x684D, 0x1440,
+ 0x684E, 0x1442, 0x6850, 0x06C5, 0x6851, 0x0702, 0x6852, 0x212C,
+ 0x6853, 0x05F8, 0x6854, 0x0665, 0x6855, 0x4583, 0x6857, 0x4584,
+ 0x6859, 0x1445, 0x685B, 0x3925, 0x685C, 0x0869, 0x685D, 0x0E9F,
+ 0x685F, 0x0885, 0x6863, 0x1446, 0x6867, 0x0DA2, 0x686B, 0x4586,
+ 0x686E, 0x4587, 0x6872, 0x3926, 0x6874, 0x1452, 0x6875, 0x3927,
+ 0x6876, 0x0533, 0x6877, 0x1447, 0x687A, 0x3928, 0x687C, 0x4588,
+ 0x687E, 0x1458, 0x687F, 0x1448, 0x6881, 0x0F8A, 0x6882, 0x4589,
+ 0x6883, 0x144F, 0x6884, 0x3929, 0x6885, 0x0D15, 0x6886, 0x4BFD,
+ 0x688D, 0x1457, 0x688E, 0x1E9C, 0x688F, 0x144A, 0x6890, 0x458A,
+ 0x6893, 0x0478, 0x6894, 0x144C, 0x6896, 0x458B, 0x6897, 0x07CE,
+ 0x6898, 0x458D, 0x6899, 0x458E, 0x689A, 0x458F, 0x689B, 0x144E,
+ 0x689C, 0x4590, 0x689D, 0x144D, 0x689F, 0x1449, 0x68A0, 0x1454,
+ 0x68A2, 0x09A7, 0x68A3, 0x4206, 0x68A5, 0x392A, 0x68A6, 0x11BE,
+ 0x68A7, 0x079C, 0x68A8, 0x0F66, 0x68AA, 0x4591, 0x68AB, 0x4592,
+ 0x68AD, 0x144B, 0x68AF, 0x0C10, 0x68B0, 0x0581, 0x68B1, 0x081D,
+ 0x68B2, 0x392B, 0x68B3, 0x1443, 0x68B4, 0x4593, 0x68B5, 0x1453,
+ 0x68B6, 0x05BF, 0x68B9, 0x1451, 0x68BA, 0x1455, 0x68BB, 0x4594,
+ 0x68BC, 0x0C68, 0x68C3, 0x4598, 0x68C4, 0x063A, 0x68C5, 0x4599,
+ 0x68C6, 0x1473, 0x68C8, 0x20AF, 0x68C9, 0x0ED5, 0x68CA, 0x145A,
+ 0x68CB, 0x0639, 0x68CC, 0x459A, 0x68CD, 0x1461, 0x68CF, 0x2130,
+ 0x68D0, 0x392C, 0x68D2, 0x0E6E, 0x68D4, 0x1462, 0x68D5, 0x1464,
+ 0x68D6, 0x392D, 0x68D7, 0x1468, 0x68D8, 0x145C, 0x68D9, 0x459B,
+ 0x68DA, 0x0B68, 0x68DF, 0x0C69, 0x68E0, 0x146C, 0x68E1, 0x145F,
+ 0x68E3, 0x1469, 0x68E4, 0x459C, 0x68E5, 0x459D, 0x68E7, 0x1463,
+ 0x68E8, 0x392E, 0x68EB, 0x4BFE, 0x68EC, 0x459E, 0x68ED, 0x392F,
+ 0x68EE, 0x09FF, 0x68EF, 0x146D, 0x68F0, 0x3930, 0x68F1, 0x3931,
+ 0x68F2, 0x0A57, 0x68F5, 0x4BFF, 0x68F7, 0x459F, 0x68F9, 0x146B,
+ 0x68FA, 0x05F9, 0x68FB, 0x4595, 0x68FC, 0x3932, 0x6900, 0x0FF6,
+ 0x6901, 0x1459, 0x6903, 0x45A0, 0x6904, 0x1467, 0x6905, 0x049C,
+ 0x6907, 0x45A1, 0x6908, 0x145B, 0x690A, 0x4207, 0x690B, 0x0EC6,
+ 0x690C, 0x1460, 0x690D, 0x09E8, 0x690E, 0x0BE3, 0x690F, 0x1456,
+ 0x6911, 0x3933, 0x6912, 0x1466, 0x6913, 0x3934, 0x6917, 0x4C00,
+ 0x6919, 0x0A40, 0x691A, 0x1470, 0x691B, 0x05CF, 0x691C, 0x0755,
+ 0x6921, 0x1472, 0x6922, 0x145D, 0x6923, 0x1471, 0x6925, 0x146A,
+ 0x6926, 0x145E, 0x6928, 0x146E, 0x692A, 0x146F, 0x6930, 0x1480,
+ 0x6933, 0x4C01, 0x6934, 0x0CA6, 0x6935, 0x3935, 0x6936, 0x1465,
+ 0x6938, 0x4C02, 0x6939, 0x147C, 0x693B, 0x3936, 0x693D, 0x147E,
+ 0x693F, 0x0BF4, 0x6942, 0x420A, 0x6946, 0x45A5, 0x6949, 0x4208,
+ 0x694A, 0x0F36, 0x6953, 0x0DE8, 0x6954, 0x1479, 0x6955, 0x0B2A,
+ 0x6957, 0x3937, 0x6959, 0x147F, 0x695A, 0x0AC1, 0x695B, 0x4C03,
+ 0x695C, 0x1476, 0x695D, 0x1483, 0x695E, 0x1482, 0x6960, 0x0CC7,
+ 0x6961, 0x1481, 0x6962, 0x0CC2, 0x6963, 0x3938, 0x6964, 0x420B,
+ 0x6965, 0x4C04, 0x6968, 0x2132, 0x6969, 0x45A6, 0x696A, 0x1485,
+ 0x696B, 0x1478, 0x696C, 0x45A7, 0x696D, 0x06C0, 0x696E, 0x147B,
+ 0x696F, 0x0967, 0x6972, 0x3939, 0x6973, 0x0D16, 0x6974, 0x147D,
+ 0x6975, 0x06C3, 0x6977, 0x1475, 0x6978, 0x1477, 0x6979, 0x1474,
+ 0x697A, 0x45A8, 0x697C, 0x0FD6, 0x697D, 0x05B8, 0x697E, 0x147A,
+ 0x697F, 0x393A, 0x6980, 0x393B, 0x6981, 0x1484, 0x6982, 0x0593,
+ 0x6986, 0x3740, 0x698A, 0x0857, 0x698E, 0x04FF, 0x6991, 0x1495,
+ 0x6992, 0x45A9, 0x6994, 0x0FD7, 0x6995, 0x1498, 0x6996, 0x45AB,
+ 0x6998, 0x2134, 0x699B, 0x0A00, 0x699C, 0x1497, 0x69A0, 0x1496,
+ 0x69A5, 0x420C, 0x69A6, 0x393C, 0x69A7, 0x1493, 0x69A8, 0x4C05,
+ 0x69AB, 0x4C06, 0x69AD, 0x393D, 0x69AE, 0x1487, 0x69AF, 0x4C07,
+ 0x69B0, 0x45AC, 0x69B1, 0x14A4, 0x69B2, 0x1486, 0x69B4, 0x1499,
+ 0x69B7, 0x393E, 0x69BA, 0x45AD, 0x69BB, 0x1491, 0x69BC, 0x45AE,
+ 0x69BE, 0x148C, 0x69BF, 0x1489, 0x69C0, 0x45AF, 0x69C1, 0x148A,
+ 0x69C3, 0x1492, 0x69C7, 0x1D33, 0x69CA, 0x148F, 0x69CB, 0x07CF,
+ 0x69CC, 0x0BE4, 0x69CD, 0x0AE6, 0x69CE, 0x148D, 0x69CF, 0x420D,
+ 0x69D0, 0x1488, 0x69D1, 0x45B0, 0x69D3, 0x148B, 0x69D6, 0x393F,
+ 0x69D7, 0x3940, 0x69D8, 0x0F37, 0x69D9, 0x0E98, 0x69DD, 0x1490,
+ 0x69DE, 0x149A, 0x69E2, 0x2135, 0x69E3, 0x45B4, 0x69E5, 0x4C08,
+ 0x69E7, 0x14A2, 0x69E8, 0x149B, 0x69E9, 0x4210, 0x69EA, 0x3411,
+ 0x69EB, 0x14A8, 0x69ED, 0x14A6, 0x69EE, 0x45B5, 0x69EF, 0x45B6,
+ 0x69F1, 0x4C09, 0x69F2, 0x14A1, 0x69F3, 0x45B7, 0x69F4, 0x45B9,
+ 0x69F5, 0x4211, 0x69F6, 0x373F, 0x69F9, 0x14A0, 0x69FB, 0x0BEC,
+ 0x69FD, 0x0AE7, 0x69FE, 0x45BA, 0x69FF, 0x149E, 0x6A01, 0x3941,
+ 0x6A02, 0x149C, 0x6A05, 0x14A3, 0x6A0A, 0x14A9, 0x6A0B, 0x0D89,
+ 0x6A0C, 0x14AF, 0x6A0F, 0x3942, 0x6A11, 0x45BB, 0x6A12, 0x14AA,
+ 0x6A13, 0x14AD, 0x6A14, 0x14A7, 0x6A15, 0x3943, 0x6A17, 0x0BB2,
+ 0x6A19, 0x0DAA, 0x6A1A, 0x45BC, 0x6A1B, 0x149D, 0x6A1D, 0x45BD,
+ 0x6A1E, 0x14A5, 0x6A1F, 0x09A8, 0x6A21, 0x0EDB, 0x6A22, 0x14B9,
+ 0x6A23, 0x14AC, 0x6A28, 0x3944, 0x6A29, 0x0756, 0x6A2A, 0x0523,
+ 0x6A2B, 0x05BD, 0x6A2E, 0x1494, 0x6A30, 0x2136, 0x6A32, 0x45BF,
+ 0x6A33, 0x45C0, 0x6A34, 0x3945, 0x6A35, 0x09A9, 0x6A36, 0x14B1,
+ 0x6A38, 0x14B8, 0x6A39, 0x0925, 0x6A3A, 0x05D0, 0x6A3B, 0x4213,
+ 0x6A3D, 0x0B6C, 0x6A3E, 0x3946, 0x6A3F, 0x45C1, 0x6A44, 0x14AE,
+ 0x6A45, 0x3947, 0x6A46, 0x2138, 0x6A47, 0x14B3, 0x6A48, 0x14B7,
+ 0x6A49, 0x45C2, 0x6A4A, 0x4C0A, 0x6A4B, 0x06AE, 0x6A4E, 0x45C4,
+ 0x6A50, 0x3948, 0x6A51, 0x3949, 0x6A52, 0x45C5, 0x6A54, 0x3C34,
+ 0x6A55, 0x4C0B, 0x6A56, 0x394A, 0x6A58, 0x0666, 0x6A59, 0x14B5,
+ 0x6A5B, 0x394B, 0x6A5F, 0x063B, 0x6A61, 0x0CA3, 0x6A62, 0x14B4,
+ 0x6A64, 0x45C6, 0x6A66, 0x14B6, 0x6A67, 0x4C0C, 0x6A6B, 0x2137,
+ 0x6A71, 0x4C0D, 0x6A72, 0x14B0, 0x6A73, 0x2139, 0x6A78, 0x14B2,
+ 0x6A7A, 0x45C3, 0x6A7E, 0x213A, 0x6A7F, 0x05BE, 0x6A80, 0x0B87,
+ 0x6A83, 0x394C, 0x6A84, 0x14BD, 0x6A89, 0x394D, 0x6A8B, 0x45C8,
+ 0x6A8D, 0x14BB, 0x6A8E, 0x079D, 0x6A90, 0x14BA, 0x6A91, 0x394E,
+ 0x6A94, 0x4215, 0x6A97, 0x14C0, 0x6A9C, 0x143B, 0x6A9D, 0x394F,
+ 0x6A9E, 0x3950, 0x6A9F, 0x3951, 0x6AA0, 0x14BC, 0x6AA1, 0x45CA,
+ 0x6AA2, 0x14BE, 0x6AA3, 0x14BF, 0x6AA5, 0x4216, 0x6AAA, 0x14CB,
+ 0x6AAB, 0x45CC, 0x6AAC, 0x14C7, 0x6AAE, 0x1450, 0x6AAF, 0x4C0E,
+ 0x6AB3, 0x14C6, 0x6AB8, 0x14C5, 0x6ABB, 0x14C2, 0x6ABD, 0x45CD,
+ 0x6AC1, 0x14AB, 0x6AC2, 0x14C4, 0x6AC3, 0x14C3, 0x6AC6, 0x45CE,
+ 0x6AC8, 0x4C0F, 0x6AC9, 0x4C10, 0x6AD0, 0x45D0, 0x6AD1, 0x14C9,
+ 0x6AD3, 0x0FCC, 0x6AD4, 0x45CF, 0x6ADA, 0x14CC, 0x6ADB, 0x06F3,
+ 0x6ADC, 0x3952, 0x6ADD, 0x45D1, 0x6ADE, 0x14C8, 0x6ADF, 0x14CA,
+ 0x6AE2, 0x213B, 0x6AE4, 0x213C, 0x6AE7, 0x3953, 0x6AE8, 0x0D3B,
+ 0x6AEA, 0x14CD, 0x6AEC, 0x3954, 0x6AF1, 0x45D4, 0x6AF2, 0x45D5,
+ 0x6AF3, 0x45D6, 0x6AF8, 0x4EB8, 0x6AFA, 0x14D1, 0x6AFB, 0x14CE,
+ 0x6AFD, 0x45D7, 0x6B03, 0x4C11, 0x6B04, 0x0F5D, 0x6B05, 0x14CF,
+ 0x6B0A, 0x149F, 0x6B0B, 0x45D9, 0x6B0F, 0x45DA, 0x6B10, 0x45DB,
+ 0x6B11, 0x45DC, 0x6B12, 0x14D2, 0x6B16, 0x14D3, 0x6B17, 0x45DE,
+ 0x6B1B, 0x4218, 0x6B1D, 0x04D7, 0x6B1E, 0x3955, 0x6B1F, 0x14D5,
+ 0x6B20, 0x073D, 0x6B21, 0x08CD, 0x6B23, 0x06CD, 0x6B24, 0x3956,
+ 0x6B27, 0x0524, 0x6B2C, 0x4219, 0x6B2F, 0x45E0, 0x6B32, 0x0F49,
+ 0x6B35, 0x3957, 0x6B37, 0x14D7, 0x6B38, 0x14D6, 0x6B39, 0x14D9,
+ 0x6B3A, 0x0657, 0x6B3B, 0x4C12, 0x6B3D, 0x06CE, 0x6B3E, 0x05FA,
+ 0x6B3F, 0x4C13, 0x6B43, 0x14DC, 0x6B46, 0x3958, 0x6B47, 0x14DB,
+ 0x6B49, 0x14DD, 0x6B4A, 0x45E1, 0x6B4C, 0x054E, 0x6B4E, 0x0B75,
+ 0x6B50, 0x14DE, 0x6B53, 0x05FB, 0x6B54, 0x14E0, 0x6B56, 0x3959,
+ 0x6B58, 0x45E2, 0x6B59, 0x14DF, 0x6B5B, 0x14E1, 0x6B5F, 0x14E2,
+ 0x6B60, 0x395A, 0x6B61, 0x14E3, 0x6B62, 0x08AD, 0x6B63, 0x0A59,
+ 0x6B64, 0x0811, 0x6B65, 0x344A, 0x6B66, 0x0DE2, 0x6B67, 0x421A,
+ 0x6B69, 0x0E32, 0x6B6A, 0x0FEA, 0x6B6C, 0x45E3, 0x6B6F, 0x08C3,
+ 0x6B72, 0x35D9, 0x6B73, 0x0840, 0x6B74, 0x0FBA, 0x6B75, 0x45E4,
+ 0x6B77, 0x3456, 0x6B78, 0x14E4, 0x6B79, 0x14E5, 0x6B7A, 0x45E5,
+ 0x6B7B, 0x08AE, 0x6B7D, 0x4C14, 0x6B7E, 0x4C15, 0x6B7F, 0x14E6,
+ 0x6B80, 0x14E7, 0x6B81, 0x45E6, 0x6B82, 0x395B, 0x6B83, 0x14E9,
+ 0x6B84, 0x14E8, 0x6B86, 0x0E86, 0x6B89, 0x0968, 0x6B8A, 0x0918,
+ 0x6B8B, 0x0892, 0x6B8D, 0x14EA, 0x6B95, 0x14EC, 0x6B96, 0x09E9,
+ 0x6B98, 0x14EB, 0x6B9B, 0x45E7, 0x6B9E, 0x14ED, 0x6BA4, 0x14EE,
+ 0x6BA9, 0x421B, 0x6BAA, 0x14EF, 0x6BAB, 0x14F0, 0x6BAD, 0x421C,
+ 0x6BAE, 0x45E8, 0x6BAF, 0x14F1, 0x6BB0, 0x4C16, 0x6BB1, 0x14F3,
+ 0x6BB2, 0x14F2, 0x6BB3, 0x14F4, 0x6BB4, 0x0525, 0x6BB5, 0x0B88,
+ 0x6BB7, 0x14F5, 0x6BBA, 0x0874, 0x6BBB, 0x05AA, 0x6BBC, 0x14F6,
+ 0x6BBD, 0x45EA, 0x6BBE, 0x395C, 0x6BBF, 0x0C3C, 0x6BC0, 0x119D,
+ 0x6BC5, 0x063D, 0x6BC6, 0x14F7, 0x6BC7, 0x45EB, 0x6BC8, 0x45EC,
+ 0x6BC9, 0x45ED, 0x6BCB, 0x14F8, 0x6BCC, 0x3744, 0x6BCD, 0x0E3C,
+ 0x6BCE, 0x0E96, 0x6BCF, 0x344C, 0x6BD2, 0x0C9F, 0x6BD3, 0x14F9,
+ 0x6BD4, 0x0D7A, 0x6BD6, 0x213D, 0x6BD7, 0x421D, 0x6BD8, 0x0D8F,
+ 0x6BDA, 0x45EE, 0x6BDB, 0x0EDF, 0x6BDF, 0x14FA, 0x6BE1, 0x395D,
+ 0x6BE6, 0x45EF, 0x6BE7, 0x45F0, 0x6BEB, 0x14FC, 0x6BEC, 0x14FB,
+ 0x6BEE, 0x45F1, 0x6BEF, 0x14FE, 0x6BF1, 0x395E, 0x6BF3, 0x14FD,
+ 0x6BF7, 0x4C17, 0x6BF9, 0x4C18, 0x6BFF, 0x421E, 0x6C02, 0x45F2,
+ 0x6C04, 0x4C19, 0x6C05, 0x421F, 0x6C08, 0x1500, 0x6C09, 0x4C1A,
+ 0x6C0A, 0x45F3, 0x6C0D, 0x4C1B, 0x6C0E, 0x45F4, 0x6C0F, 0x08AF,
+ 0x6C10, 0x395F, 0x6C11, 0x0EBD, 0x6C13, 0x1501, 0x6C14, 0x1502,
+ 0x6C17, 0x063E, 0x6C1B, 0x1503, 0x6C23, 0x1505, 0x6C24, 0x1504,
+ 0x6C2C, 0x4C1C, 0x6C33, 0x3960, 0x6C34, 0x0A2B, 0x6C35, 0x3961,
+ 0x6C36, 0x45F5, 0x6C37, 0x0DAB, 0x6C38, 0x04EC, 0x6C3A, 0x4F55,
+ 0x6C3E, 0x0D59, 0x6C3F, 0x213E, 0x6C40, 0x0C11, 0x6C41, 0x094B,
+ 0x6C42, 0x067B, 0x6C4A, 0x4C1D, 0x6C4D, 0x45F7, 0x6C4E, 0x0D5A,
+ 0x6C50, 0x08DA, 0x6C52, 0x4C1E, 0x6C54, 0x4C1F, 0x6C55, 0x1507,
+ 0x6C57, 0x05FC, 0x6C59, 0x3963, 0x6C5A, 0x051A, 0x6C5B, 0x45F8,
+ 0x6C5C, 0x213F, 0x6C5D, 0x0CCA, 0x6C5E, 0x1506, 0x6C5F, 0x07D0,
+ 0x6C60, 0x0B91, 0x6C62, 0x1508, 0x6C67, 0x460A, 0x6C68, 0x1510,
+ 0x6C6A, 0x1509, 0x6C6D, 0x45F9, 0x6C6F, 0x2141, 0x6C70, 0x0B21,
+ 0x6C72, 0x067C, 0x6C73, 0x1511, 0x6C74, 0x4220, 0x6C76, 0x3964,
+ 0x6C79, 0x4C20, 0x6C7A, 0x073E, 0x6C7B, 0x3965, 0x6C7D, 0x063F,
+ 0x6C7E, 0x150F, 0x6C81, 0x150D, 0x6C82, 0x150A, 0x6C83, 0x0F4A,
+ 0x6C84, 0x45FA, 0x6C85, 0x3966, 0x6C86, 0x2140, 0x6C88, 0x0BDC,
+ 0x6C89, 0x45FB, 0x6C8C, 0x0CB1, 0x6C8D, 0x150B, 0x6C90, 0x1513,
+ 0x6C92, 0x1512, 0x6C93, 0x06F9, 0x6C94, 0x45FD, 0x6C95, 0x3967,
+ 0x6C96, 0x052D, 0x6C97, 0x45FE, 0x6C98, 0x4221, 0x6C99, 0x082B,
+ 0x6C9A, 0x150C, 0x6C9B, 0x150E, 0x6C9C, 0x3968, 0x6CA1, 0x0E85,
+ 0x6CA2, 0x0B54, 0x6CAA, 0x3749, 0x6CAB, 0x0EA5, 0x6CAC, 0x4C21,
+ 0x6CAD, 0x45FF, 0x6CAE, 0x151B, 0x6CB1, 0x151C, 0x6CB3, 0x054F,
+ 0x6CB4, 0x4C22, 0x6CB8, 0x0DF8, 0x6CB9, 0x0F09, 0x6CBA, 0x151E,
+ 0x6CBB, 0x08CF, 0x6CBC, 0x09AA, 0x6CBD, 0x1517, 0x6CBE, 0x151D,
+ 0x6CBF, 0x050A, 0x6CC1, 0x06AF, 0x6CC2, 0x4600, 0x6CC4, 0x1514,
+ 0x6CC5, 0x1519, 0x6CC6, 0x4223, 0x6CC9, 0x0A98, 0x6CCA, 0x0D27,
+ 0x6CCC, 0x0D7B, 0x6CD0, 0x3969, 0x6CD2, 0x4C23, 0x6CD3, 0x1516,
+ 0x6CD4, 0x396A, 0x6CD5, 0x0E4F, 0x6CD6, 0x396B, 0x6CD7, 0x1518,
+ 0x6CD9, 0x1521, 0x6CDA, 0x2142, 0x6CDB, 0x151F, 0x6CDC, 0x4602,
+ 0x6CDD, 0x151A, 0x6CE0, 0x396C, 0x6CE1, 0x0E50, 0x6CE2, 0x0CFE,
+ 0x6CE3, 0x067D, 0x6CE5, 0x0C1F, 0x6CE8, 0x0BAB, 0x6CE9, 0x4603,
+ 0x6CEA, 0x1522, 0x6CEB, 0x396D, 0x6CEC, 0x396E, 0x6CED, 0x4604,
+ 0x6CEE, 0x396F, 0x6CEF, 0x1520, 0x6CF0, 0x0B39, 0x6CF1, 0x1515,
+ 0x6CF3, 0x04ED, 0x6CFB, 0x4222, 0x6D00, 0x4606, 0x6D01, 0x3C35,
+ 0x6D04, 0x2143, 0x6D0A, 0x3970, 0x6D0B, 0x0F38, 0x6D0C, 0x152D,
+ 0x6D0E, 0x3971, 0x6D11, 0x3972, 0x6D12, 0x152C, 0x6D17, 0x0A9A,
+ 0x6D19, 0x1529, 0x6D1B, 0x0F56, 0x6D1E, 0x0C8E, 0x6D1F, 0x1523,
+ 0x6D24, 0x4607, 0x6D25, 0x0BE1, 0x6D26, 0x4608, 0x6D27, 0x4609,
+ 0x6D29, 0x04EE, 0x6D2A, 0x07D1, 0x6D2B, 0x1526, 0x6D2E, 0x3973,
+ 0x6D2F, 0x460B, 0x6D31, 0x4224, 0x6D32, 0x0931, 0x6D33, 0x152B,
+ 0x6D34, 0x461E, 0x6D35, 0x152A, 0x6D36, 0x1525, 0x6D38, 0x1528,
+ 0x6D39, 0x4225, 0x6D3B, 0x05C6, 0x6D3C, 0x460C, 0x6D3D, 0x1527,
+ 0x6D3E, 0x0CFF, 0x6D3F, 0x4226, 0x6D41, 0x0F76, 0x6D44, 0x09DC,
+ 0x6D45, 0x0A99, 0x6D57, 0x3974, 0x6D58, 0x4227, 0x6D59, 0x1533,
+ 0x6D5A, 0x1531, 0x6D5B, 0x460D, 0x6D5C, 0x0DBF, 0x6D5E, 0x3975,
+ 0x6D60, 0x460E, 0x6D61, 0x4C24, 0x6D63, 0x152E, 0x6D64, 0x1530,
+ 0x6D65, 0x3976, 0x6D66, 0x04DC, 0x6D69, 0x07D2, 0x6D6A, 0x0FD8,
+ 0x6D6C, 0x059B, 0x6D6E, 0x0DD4, 0x6D6F, 0x2145, 0x6D70, 0x460F,
+ 0x6D74, 0x0F4B, 0x6D77, 0x0582, 0x6D78, 0x0A01, 0x6D79, 0x1532,
+ 0x6D7C, 0x4C25, 0x6D80, 0x4610, 0x6D81, 0x4611, 0x6D82, 0x3977,
+ 0x6D85, 0x1537, 0x6D87, 0x2144, 0x6D88, 0x09AB, 0x6D89, 0x342A,
+ 0x6D8A, 0x4612, 0x6D8C, 0x0F1A, 0x6D8D, 0x4613, 0x6D8E, 0x1534,
+ 0x6D91, 0x4614, 0x6D93, 0x152F, 0x6D94, 0x4228, 0x6D95, 0x1535,
+ 0x6D96, 0x2146, 0x6D98, 0x4615, 0x6D99, 0x0FA6, 0x6D9B, 0x0C6D,
+ 0x6D9C, 0x0C9A, 0x6DAA, 0x4229, 0x6DAB, 0x461A, 0x6DAC, 0x2147,
+ 0x6DAE, 0x461B, 0x6DAF, 0x0594, 0x6DB2, 0x04F7, 0x6DB4, 0x461C,
+ 0x6DB5, 0x153B, 0x6DB8, 0x153E, 0x6DB9, 0x4C26, 0x6DBC, 0x0F8B,
+ 0x6DBF, 0x3978, 0x6DC0, 0x0F4E, 0x6DC2, 0x461D, 0x6DC4, 0x3979,
+ 0x6DC5, 0x1545, 0x6DC6, 0x153F, 0x6DC7, 0x153C, 0x6DC8, 0x461F,
+ 0x6DCA, 0x397A, 0x6DCB, 0x0F9C, 0x6DCC, 0x1542, 0x6DCE, 0x4620,
+ 0x6DCF, 0x2148, 0x6DD0, 0x3C36, 0x6DD1, 0x0954, 0x6DD2, 0x1544,
+ 0x6DD5, 0x1549, 0x6DD6, 0x397B, 0x6DD8, 0x0C6B, 0x6DD9, 0x1547,
+ 0x6DDA, 0x3453, 0x6DDB, 0x422A, 0x6DDD, 0x422B, 0x6DDE, 0x1541,
+ 0x6DDF, 0x4621, 0x6DE1, 0x0B76, 0x6DE4, 0x1548, 0x6DE6, 0x153D,
+ 0x6DE8, 0x1543, 0x6DE9, 0x397C, 0x6DEA, 0x154A, 0x6DEB, 0x04C0,
+ 0x6DEC, 0x1540, 0x6DEE, 0x154B, 0x6DF0, 0x4C27, 0x6DF1, 0x0A02,
+ 0x6DF2, 0x214A, 0x6DF3, 0x0969, 0x6DF5, 0x0DF5, 0x6DF6, 0x4622,
+ 0x6DF7, 0x081E, 0x6DF8, 0x2149, 0x6DF9, 0x1538, 0x6DFA, 0x1546,
+ 0x6DFB, 0x0C34, 0x6DFC, 0x214B, 0x6E05, 0x0A5A, 0x6E07, 0x05C7,
+ 0x6E08, 0x0841, 0x6E09, 0x09AC, 0x6E0A, 0x153A, 0x6E0B, 0x094C,
+ 0x6E13, 0x0722, 0x6E15, 0x1539, 0x6E17, 0x3746, 0x6E19, 0x154F,
+ 0x6E1A, 0x0977, 0x6E1B, 0x076E, 0x6E1D, 0x155E, 0x6E1E, 0x4624,
+ 0x6E1F, 0x1558, 0x6E20, 0x068E, 0x6E21, 0x0C49, 0x6E22, 0x397D,
+ 0x6E23, 0x1553, 0x6E24, 0x155C, 0x6E25, 0x0473, 0x6E26, 0x04D4,
+ 0x6E27, 0x214E, 0x6E29, 0x0539, 0x6E2B, 0x1555, 0x6E2C, 0x0B0C,
+ 0x6E2D, 0x154C, 0x6E2E, 0x154E, 0x6E2F, 0x07D3, 0x6E32, 0x4626,
+ 0x6E34, 0x3412, 0x6E36, 0x4623, 0x6E38, 0x155F, 0x6E39, 0x214C,
+ 0x6E3A, 0x155A, 0x6E3C, 0x214F, 0x6E3E, 0x1552, 0x6E42, 0x3C37,
+ 0x6E43, 0x1559, 0x6E44, 0x422C, 0x6E45, 0x4C28, 0x6E48, 0x4627,
+ 0x6E49, 0x4628, 0x6E4A, 0x0EB7, 0x6E4B, 0x4629, 0x6E4C, 0x462A,
+ 0x6E4D, 0x1557, 0x6E4E, 0x155B, 0x6E4F, 0x462B, 0x6E51, 0x397E,
+ 0x6E53, 0x462C, 0x6E54, 0x462D, 0x6E56, 0x0784, 0x6E57, 0x462E,
+ 0x6E58, 0x09AD, 0x6E5B, 0x0B77, 0x6E5C, 0x214D, 0x6E5E, 0x422D,
+ 0x6E5F, 0x1551, 0x6E63, 0x462F, 0x6E67, 0x0F19, 0x6E6B, 0x1554,
+ 0x6E6E, 0x154D, 0x6E6F, 0x0C6C, 0x6E72, 0x1550, 0x6E73, 0x4C29,
+ 0x6E76, 0x1556, 0x6E7B, 0x4C2A, 0x6E7D, 0x4C2B, 0x6E7E, 0x0FF7,
+ 0x6E7F, 0x08EA, 0x6E80, 0x0EAC, 0x6E82, 0x1560, 0x6E89, 0x4C2C,
+ 0x6E8C, 0x0D42, 0x6E8F, 0x156C, 0x6E90, 0x076F, 0x6E93, 0x4631,
+ 0x6E96, 0x096A, 0x6E98, 0x1562, 0x6E9C, 0x0F77, 0x6E9D, 0x07D4,
+ 0x6E9F, 0x156F, 0x6EA2, 0x04B2, 0x6EA5, 0x156D, 0x6EA7, 0x4632,
+ 0x6EAA, 0x1561, 0x6EAB, 0x340C, 0x6EAF, 0x1567, 0x6EB1, 0x422E,
+ 0x6EB2, 0x1569, 0x6EB4, 0x4633, 0x6EB6, 0x0F39, 0x6EB7, 0x1564,
+ 0x6EBA, 0x0C28, 0x6EBC, 0x4C2D, 0x6EBD, 0x1566, 0x6EBF, 0x2150,
+ 0x6EC1, 0x422F, 0x6EC2, 0x156E, 0x6EC3, 0x4634, 0x6EC4, 0x1568,
+ 0x6EC5, 0x0ED3, 0x6EC7, 0x397F, 0x6EC9, 0x1563, 0x6ECA, 0x3980,
+ 0x6ECB, 0x08CE, 0x6ECC, 0x157B, 0x6ECE, 0x3981, 0x6ED1, 0x05C8,
+ 0x6ED3, 0x1565, 0x6ED4, 0x156A, 0x6ED5, 0x156B, 0x6ED9, 0x3C38,
+ 0x6EDA, 0x4C2E, 0x6EDB, 0x4C2F, 0x6EDD, 0x0B4C, 0x6EDE, 0x0B3A,
+ 0x6EE6, 0x3C24, 0x6EEB, 0x4636, 0x6EEC, 0x1573, 0x6EEF, 0x1579,
+ 0x6EF2, 0x1577, 0x6EF4, 0x0C23, 0x6EF7, 0x157E, 0x6EF8, 0x1574,
+ 0x6EF9, 0x4637, 0x6EFB, 0x4638, 0x6EFD, 0x3982, 0x6EFE, 0x1575,
+ 0x6EFF, 0x155D, 0x6F01, 0x0693, 0x6F02, 0x0DAC, 0x6F06, 0x08EB,
+ 0x6F09, 0x0809, 0x6F0A, 0x4639, 0x6F0C, 0x463A, 0x6F0F, 0x0FD9,
+ 0x6F10, 0x4230, 0x6F11, 0x1571, 0x6F13, 0x157D, 0x6F14, 0x050B,
+ 0x6F15, 0x0AE8, 0x6F18, 0x463B, 0x6F1A, 0x3983, 0x6F20, 0x0D2F,
+ 0x6F22, 0x05FD, 0x6F23, 0x0FC2, 0x6F25, 0x463C, 0x6F26, 0x4C30,
+ 0x6F29, 0x4C31, 0x6F2A, 0x3984, 0x6F2B, 0x0EAD, 0x6F2C, 0x0BEE,
+ 0x6F2F, 0x3985, 0x6F30, 0x4C32, 0x6F31, 0x1578, 0x6F32, 0x157A,
+ 0x6F33, 0x3986, 0x6F35, 0x4635, 0x6F36, 0x463D, 0x6F38, 0x0AB4,
+ 0x6F3C, 0x463E, 0x6F3E, 0x157C, 0x6F3F, 0x1576, 0x6F41, 0x1570,
+ 0x6F45, 0x05FF, 0x6F51, 0x1E60, 0x6F52, 0x4640, 0x6F54, 0x073F,
+ 0x6F57, 0x4641, 0x6F58, 0x158A, 0x6F59, 0x4231, 0x6F5A, 0x3987,
+ 0x6F5B, 0x1585, 0x6F5C, 0x0A9C, 0x6F5E, 0x3988, 0x6F5F, 0x05C1,
+ 0x6F60, 0x4642, 0x6F61, 0x4232, 0x6F62, 0x3989, 0x6F64, 0x096B,
+ 0x6F66, 0x158E, 0x6F68, 0x4643, 0x6F6D, 0x1587, 0x6F6E, 0x0BC8,
+ 0x6F6F, 0x1584, 0x6F70, 0x0BF5, 0x6F74, 0x15A7, 0x6F78, 0x1581,
+ 0x6F7A, 0x1580, 0x6F7C, 0x1589, 0x6F7D, 0x398A, 0x6F7E, 0x4233,
+ 0x6F80, 0x1583, 0x6F81, 0x1582, 0x6F82, 0x1588, 0x6F84, 0x0A45,
+ 0x6F86, 0x157F, 0x6F87, 0x4C33, 0x6F88, 0x2151, 0x6F8B, 0x398B,
+ 0x6F8C, 0x4234, 0x6F8D, 0x398C, 0x6F8E, 0x158B, 0x6F90, 0x4644,
+ 0x6F91, 0x158C, 0x6F92, 0x398D, 0x6F94, 0x398E, 0x6F96, 0x4645,
+ 0x6F97, 0x05FE, 0x6F98, 0x363C, 0x6F9A, 0x398F, 0x6F9D, 0x4C34,
+ 0x6F9F, 0x4647, 0x6FA0, 0x4235, 0x6FA1, 0x1591, 0x6FA3, 0x1590,
+ 0x6FA4, 0x1592, 0x6FA5, 0x4648, 0x6FA7, 0x3990, 0x6FA8, 0x3991,
+ 0x6FAA, 0x1595, 0x6FAE, 0x4C35, 0x6FAF, 0x4649, 0x6FB1, 0x0C3D,
+ 0x6FB3, 0x158F, 0x6FB5, 0x2152, 0x6FB6, 0x3992, 0x6FB7, 0x4C36,
+ 0x6FB9, 0x1593, 0x6FBC, 0x4236, 0x6FBE, 0x4646, 0x6FC0, 0x0739,
+ 0x6FC1, 0x0B59, 0x6FC2, 0x158D, 0x6FC3, 0x0CF1, 0x6FC6, 0x1594,
+ 0x6FC7, 0x4237, 0x6FC8, 0x464B, 0x6FC9, 0x464C, 0x6FCA, 0x4238,
+ 0x6FD4, 0x1599, 0x6FD5, 0x1597, 0x6FD8, 0x159A, 0x6FDA, 0x3993,
+ 0x6FDB, 0x159D, 0x6FDE, 0x3994, 0x6FDF, 0x1596, 0x6FE0, 0x07FC,
+ 0x6FE1, 0x0CDE, 0x6FE4, 0x1536, 0x6FE9, 0x464D, 0x6FEB, 0x0F5E,
+ 0x6FEC, 0x1598, 0x6FEE, 0x159C, 0x6FEF, 0x0B55, 0x6FF0, 0x4239,
+ 0x6FF1, 0x159B, 0x6FF3, 0x1586, 0x6FF5, 0x2153, 0x6FF6, 0x1BA4,
+ 0x6FF9, 0x3C23, 0x6FFA, 0x15A0, 0x6FFC, 0x464F, 0x6FFE, 0x15A4,
+ 0x7000, 0x4650, 0x7001, 0x15A2, 0x7005, 0x2154, 0x7006, 0x1E50,
+ 0x7007, 0x2155, 0x7009, 0x159E, 0x700A, 0x4651, 0x700B, 0x159F,
+ 0x700D, 0x4C37, 0x700F, 0x15A3, 0x7011, 0x15A1, 0x7015, 0x0DC0,
+ 0x7018, 0x15A9, 0x701A, 0x15A6, 0x701B, 0x15A5, 0x701D, 0x15A8,
+ 0x701E, 0x0CAC, 0x701F, 0x15AA, 0x7020, 0x4C38, 0x7023, 0x4652,
+ 0x7026, 0x0BB3, 0x7027, 0x0B4D, 0x7028, 0x2156, 0x702C, 0x0A49,
+ 0x7030, 0x15AB, 0x7032, 0x15AD, 0x7039, 0x3996, 0x703A, 0x4654,
+ 0x703C, 0x3997, 0x703E, 0x15AC, 0x7043, 0x4655, 0x7047, 0x4656,
+ 0x7049, 0x4C39, 0x704A, 0x4F52, 0x704B, 0x4657, 0x704C, 0x1572,
+ 0x704E, 0x423A, 0x7051, 0x15AE, 0x7054, 0x3999, 0x7058, 0x0CBF,
+ 0x705D, 0x399A, 0x705E, 0x399B, 0x7063, 0x15AF, 0x7064, 0x399C,
+ 0x7065, 0x4659, 0x7069, 0x465A, 0x706B, 0x0550, 0x706C, 0x399D,
+ 0x706E, 0x465B, 0x706F, 0x0C6E, 0x7070, 0x0583, 0x7075, 0x423B,
+ 0x7076, 0x465C, 0x7078, 0x067E, 0x707C, 0x090A, 0x707D, 0x0842,
+ 0x707E, 0x399E, 0x7081, 0x399F, 0x7085, 0x2157, 0x7086, 0x465D,
+ 0x7089, 0x0FCD, 0x708A, 0x0A2C, 0x708E, 0x050C, 0x7092, 0x15B1,
+ 0x7095, 0x39A0, 0x7097, 0x465E, 0x7098, 0x4C3A, 0x7099, 0x15B0,
+ 0x709F, 0x4660, 0x70A4, 0x423C, 0x70AB, 0x2158, 0x70AC, 0x15B4,
+ 0x70AD, 0x0B78, 0x70AE, 0x15B7, 0x70AF, 0x15B2, 0x70B0, 0x4C3B,
+ 0x70B1, 0x4661, 0x70B3, 0x15B6, 0x70B7, 0x39A1, 0x70B8, 0x15B5,
+ 0x70B9, 0x0C3A, 0x70BA, 0x049D, 0x70BB, 0x20AD, 0x70C8, 0x0FBD,
+ 0x70CA, 0x4664, 0x70CB, 0x15B9, 0x70CF, 0x04CA, 0x70D1, 0x4665,
+ 0x70D3, 0x39A2, 0x70D4, 0x39A3, 0x70D5, 0x4C3C, 0x70D6, 0x4C3D,
+ 0x70D8, 0x39A4, 0x70D9, 0x15BB, 0x70DC, 0x39A5, 0x70DD, 0x15BA,
+ 0x70DF, 0x15B8, 0x70E4, 0x423D, 0x70EC, 0x4663, 0x70F1, 0x15B3,
+ 0x70F9, 0x0E51, 0x70FD, 0x15BD, 0x7103, 0x4666, 0x7104, 0x215A,
+ 0x7106, 0x4667, 0x7107, 0x39A6, 0x7108, 0x4668, 0x7109, 0x15BC,
+ 0x710C, 0x4669, 0x710F, 0x2159, 0x7114, 0x050D, 0x7119, 0x15BF,
+ 0x711A, 0x0E02, 0x711C, 0x15BE, 0x711E, 0x423F, 0x7120, 0x39A7,
+ 0x7121, 0x0EC1, 0x7126, 0x09AF, 0x712B, 0x423E, 0x712E, 0x4240,
+ 0x712F, 0x466B, 0x7130, 0x1DDC, 0x7131, 0x39A8, 0x7136, 0x0AB5,
+ 0x713C, 0x09AE, 0x7145, 0x4C3E, 0x7146, 0x215C, 0x7147, 0x215D,
+ 0x7149, 0x0FC3, 0x714A, 0x39A9, 0x714C, 0x15C5, 0x714E, 0x0A9D,
+ 0x7150, 0x466C, 0x7151, 0x4241, 0x7152, 0x39AA, 0x7153, 0x466D,
+ 0x7155, 0x15C1, 0x7156, 0x15C6, 0x7159, 0x050E, 0x715C, 0x215B,
+ 0x715E, 0x466E, 0x7160, 0x39AB, 0x7162, 0x15C4, 0x7164, 0x0D17,
+ 0x7165, 0x15C0, 0x7166, 0x15C3, 0x7167, 0x09B0, 0x7168, 0x4242,
+ 0x7169, 0x0D65, 0x716C, 0x15C7, 0x716E, 0x08FD, 0x7179, 0x39AC,
+ 0x717D, 0x0A9E, 0x7180, 0x4671, 0x7184, 0x15CA, 0x7185, 0x4243,
+ 0x7187, 0x4244, 0x7188, 0x15C2, 0x718A, 0x06FD, 0x718F, 0x15C8,
+ 0x7192, 0x39AD, 0x7194, 0x0F3A, 0x7195, 0x15CB, 0x7196, 0x4670,
+ 0x7199, 0x205D, 0x719B, 0x4672, 0x719F, 0x0959, 0x71A0, 0x4673,
+ 0x71A2, 0x4674, 0x71A8, 0x15CC, 0x71AC, 0x15CD, 0x71AE, 0x4675,
+ 0x71AF, 0x4676, 0x71B1, 0x0CE4, 0x71B2, 0x4C3F, 0x71B3, 0x3C25,
+ 0x71B9, 0x15CF, 0x71BA, 0x4245, 0x71BE, 0x15D0, 0x71C1, 0x215F,
+ 0x71C3, 0x0CE9, 0x71C4, 0x4246, 0x71C8, 0x0C6F, 0x71C9, 0x15D2,
+ 0x71CB, 0x39AF, 0x71CE, 0x15D4, 0x71D0, 0x0F9D, 0x71D2, 0x15D1,
+ 0x71D3, 0x39B0, 0x71D4, 0x15D3, 0x71D5, 0x050F, 0x71D6, 0x39B1,
+ 0x71D7, 0x15CE, 0x71D9, 0x4678, 0x71DC, 0x4679, 0x71DF, 0x114E,
+ 0x71E0, 0x15D5, 0x71E5, 0x0AE9, 0x71E6, 0x0886, 0x71E7, 0x15D7,
+ 0x71EC, 0x15D6, 0x71ED, 0x09EA, 0x71EE, 0x10EE, 0x71F4, 0x4C40,
+ 0x71F5, 0x15D8, 0x71F9, 0x15DA, 0x71FB, 0x15C9, 0x71FC, 0x15D9,
+ 0x71FE, 0x2160, 0x71FF, 0x15DB, 0x7200, 0x39B2, 0x7206, 0x0D30,
+ 0x7207, 0x467A, 0x720D, 0x15DC, 0x7210, 0x15DD, 0x7215, 0x4247,
+ 0x7217, 0x4C41, 0x721B, 0x15DE, 0x721D, 0x39B3, 0x721F, 0x4C42,
+ 0x7228, 0x15DF, 0x722A, 0x0BFA, 0x722B, 0x39B4, 0x722C, 0x15E1,
+ 0x722D, 0x15E0, 0x7230, 0x15E2, 0x7232, 0x15E3, 0x7234, 0x467C,
+ 0x7235, 0x090B, 0x7236, 0x0DD5, 0x7238, 0x39B5, 0x7239, 0x467D,
+ 0x723A, 0x0EF8, 0x723B, 0x15E4, 0x723C, 0x15E5, 0x723D, 0x0AD8,
+ 0x723E, 0x08D0, 0x723F, 0x15E6, 0x7240, 0x15E7, 0x7241, 0x39B6,
+ 0x7242, 0x467E, 0x7243, 0x4C43, 0x7246, 0x15E8, 0x7247, 0x0E22,
+ 0x7248, 0x0D5B, 0x724B, 0x15E9, 0x724C, 0x0D0D, 0x724F, 0x4C44,
+ 0x7250, 0x4C45, 0x7252, 0x0BC9, 0x7253, 0x39B7, 0x7255, 0x39B8,
+ 0x7256, 0x39B9, 0x7257, 0x467F, 0x7258, 0x15EA, 0x7259, 0x0567,
+ 0x725A, 0x4C46, 0x725B, 0x0687, 0x725C, 0x39BA, 0x725D, 0x0ED2,
+ 0x725F, 0x0EC2, 0x7260, 0x4C47, 0x7261, 0x0534, 0x7262, 0x0FDA,
+ 0x7263, 0x4680, 0x7267, 0x0E80, 0x7268, 0x4C48, 0x7269, 0x0DFA,
+ 0x726E, 0x4682, 0x726F, 0x4683, 0x7272, 0x0A5B, 0x7274, 0x15EB,
+ 0x7277, 0x4C49, 0x7278, 0x4684, 0x7279, 0x0C9B, 0x727D, 0x0757,
+ 0x727E, 0x15EC, 0x727F, 0x4685, 0x7280, 0x0844, 0x7281, 0x15EE,
+ 0x7282, 0x15ED, 0x7284, 0x4C4A, 0x7287, 0x15EF, 0x728D, 0x39BB,
+ 0x728E, 0x4686, 0x7292, 0x15F0, 0x7296, 0x15F1, 0x729B, 0x4249,
+ 0x72A0, 0x0658, 0x72A2, 0x15F2, 0x72A7, 0x15F3, 0x72AC, 0x0758,
+ 0x72AD, 0x39BC, 0x72AE, 0x4688, 0x72AF, 0x0D5C, 0x72B0, 0x4689,
+ 0x72B1, 0x2161, 0x72B2, 0x15F5, 0x72B4, 0x39BD, 0x72B6, 0x09DD,
+ 0x72B9, 0x15F4, 0x72BE, 0x2162, 0x72C0, 0x342B, 0x72C1, 0x468A,
+ 0x72C2, 0x06B0, 0x72C3, 0x15F6, 0x72C4, 0x15F8, 0x72C6, 0x15F7,
+ 0x72C7, 0x39BE, 0x72C9, 0x4C4B, 0x72CC, 0x468C, 0x72CE, 0x15F9,
+ 0x72D0, 0x0785, 0x72D2, 0x15FA, 0x72D7, 0x06E1, 0x72D9, 0x0AC2,
+ 0x72DB, 0x080F, 0x72E0, 0x15FC, 0x72E1, 0x15FD, 0x72E2, 0x15FB,
+ 0x72E5, 0x4C4C, 0x72E9, 0x0919, 0x72EC, 0x0CA0, 0x72ED, 0x06B1,
+ 0x72F3, 0x468F, 0x72F4, 0x4C4D, 0x72F7, 0x15FF, 0x72F8, 0x0B6A,
+ 0x72F9, 0x15FE, 0x72FA, 0x4690, 0x72FB, 0x39BF, 0x72FC, 0x0FDB,
+ 0x72FD, 0x0D18, 0x7302, 0x4C4E, 0x7304, 0x39C0, 0x7305, 0x39C1,
+ 0x7307, 0x4691, 0x730A, 0x1602, 0x730B, 0x4C4F, 0x7312, 0x4692,
+ 0x7316, 0x1604, 0x7317, 0x1601, 0x7318, 0x4693, 0x7319, 0x4694,
+ 0x731B, 0x0EE0, 0x731C, 0x1603, 0x731D, 0x1605, 0x731E, 0x4C50,
+ 0x731F, 0x0F8C, 0x7322, 0x4C51, 0x7324, 0x2163, 0x7325, 0x1609,
+ 0x7327, 0x424B, 0x7328, 0x39C2, 0x7329, 0x1608, 0x732A, 0x0BB4,
+ 0x732B, 0x0CE3, 0x732C, 0x4697, 0x732E, 0x0759, 0x732F, 0x1607,
+ 0x7331, 0x39C3, 0x7333, 0x4698, 0x7334, 0x1606, 0x7336, 0x0F1B,
+ 0x7337, 0x0F1C, 0x7339, 0x4696, 0x733A, 0x4C52, 0x733B, 0x4C53,
+ 0x733D, 0x4699, 0x733E, 0x160A, 0x733F, 0x0510, 0x7343, 0x39C4,
+ 0x7344, 0x0808, 0x7345, 0x08B0, 0x734D, 0x4C54, 0x734E, 0x160B,
+ 0x734F, 0x160C, 0x7350, 0x424C, 0x7352, 0x469A, 0x7357, 0x160E,
+ 0x7358, 0x4C55, 0x7363, 0x094D, 0x7366, 0x424D, 0x7367, 0x4C56,
+ 0x7368, 0x1610, 0x736A, 0x160F, 0x736B, 0x469C, 0x736C, 0x39C5,
+ 0x736E, 0x469E, 0x736F, 0x469F, 0x7370, 0x1611, 0x7371, 0x46A0,
+ 0x7372, 0x05AB, 0x7375, 0x1613, 0x7377, 0x2165, 0x7378, 0x1612,
+ 0x737A, 0x1615, 0x737B, 0x1614, 0x737C, 0x39C6, 0x7381, 0x46A1,
+ 0x7383, 0x39C7, 0x7384, 0x0770, 0x7385, 0x39C8, 0x7386, 0x39C9,
+ 0x7387, 0x0F70, 0x7389, 0x06C4, 0x738A, 0x46A2, 0x738B, 0x0526,
+ 0x7394, 0x46A3, 0x7395, 0x39CA, 0x7396, 0x06E2, 0x7398, 0x46A4,
+ 0x739C, 0x46A5, 0x739E, 0x39CB, 0x739F, 0x39CC, 0x73A0, 0x39CD,
+ 0x73A2, 0x424E, 0x73A5, 0x46A6, 0x73A6, 0x39CE, 0x73A8, 0x3C3F,
+ 0x73A9, 0x061D, 0x73AB, 0x39CF, 0x73B2, 0x0FB0, 0x73B3, 0x1617,
+ 0x73B5, 0x39D0, 0x73B7, 0x39D1, 0x73B9, 0x46A7, 0x73BA, 0x35EA,
+ 0x73BB, 0x1619, 0x73BC, 0x39D2, 0x73BD, 0x2166, 0x73BF, 0x46A8,
+ 0x73C0, 0x161A, 0x73C2, 0x0551, 0x73C5, 0x46A9, 0x73C8, 0x1616,
+ 0x73C9, 0x2167, 0x73CA, 0x0887, 0x73CB, 0x46AA, 0x73CD, 0x0BDD,
+ 0x73CE, 0x1618, 0x73CF, 0x39D3, 0x73D2, 0x216A, 0x73D6, 0x2168,
+ 0x73D9, 0x39D4, 0x73DE, 0x161D, 0x73E0, 0x091A, 0x73E1, 0x46AB,
+ 0x73E3, 0x2169, 0x73E4, 0x3C39, 0x73E5, 0x161B, 0x73E7, 0x46AC,
+ 0x73E9, 0x39D5, 0x73EA, 0x0714, 0x73ED, 0x0D5D, 0x73EE, 0x161C,
+ 0x73F1, 0x1637, 0x73F4, 0x39D6, 0x73F5, 0x216C, 0x73F8, 0x1622,
+ 0x73F9, 0x46AD, 0x73FA, 0x46AF, 0x73FD, 0x39D7, 0x73FE, 0x0771,
+ 0x7401, 0x46B0, 0x7403, 0x067F, 0x7404, 0x39D8, 0x7405, 0x161F,
+ 0x7406, 0x0F67, 0x7407, 0x216B, 0x7409, 0x0F78, 0x740A, 0x39D9,
+ 0x7413, 0x46AE, 0x741A, 0x39DA, 0x741B, 0x39DB, 0x7421, 0x3C3A,
+ 0x7422, 0x0B56, 0x7424, 0x39DC, 0x7425, 0x1621, 0x7426, 0x216D,
+ 0x7428, 0x39DD, 0x7429, 0x216F, 0x742A, 0x216E, 0x742B, 0x424F,
+ 0x742C, 0x39DE, 0x742E, 0x2170, 0x742F, 0x39DF, 0x7430, 0x39E0,
+ 0x7431, 0x39E1, 0x7432, 0x1623, 0x7433, 0x0F9E, 0x7434, 0x06CF,
+ 0x7435, 0x0D90, 0x7436, 0x0D00, 0x7439, 0x39E2, 0x743A, 0x1624,
+ 0x743F, 0x1626, 0x7440, 0x46B2, 0x7441, 0x1629, 0x7443, 0x46B3,
+ 0x7444, 0x39E3, 0x7446, 0x4250, 0x7447, 0x39E4, 0x744B, 0x39E5,
+ 0x744D, 0x39E6, 0x7451, 0x39E7, 0x7452, 0x46B4, 0x7453, 0x46B1,
+ 0x7455, 0x1625, 0x7457, 0x39E8, 0x7459, 0x1628, 0x745A, 0x079E,
+ 0x745B, 0x04EF, 0x745C, 0x162A, 0x745D, 0x46B5, 0x745E, 0x0A36,
+ 0x745F, 0x1627, 0x7460, 0x0FA4, 0x7462, 0x4251, 0x7463, 0x162D,
+ 0x7464, 0x1D35, 0x7466, 0x39E9, 0x7469, 0x162B, 0x746A, 0x162E,
+ 0x746B, 0x39EA, 0x746D, 0x4252, 0x746F, 0x1620, 0x7470, 0x162C,
+ 0x7471, 0x39EB, 0x7472, 0x4C57, 0x7473, 0x082C, 0x7476, 0x162F,
+ 0x747E, 0x1630, 0x7480, 0x39EC, 0x7481, 0x46B6, 0x7483, 0x0F68,
+ 0x7485, 0x39ED, 0x7486, 0x39EE, 0x7487, 0x39EF, 0x7488, 0x46B7,
+ 0x7489, 0x2172, 0x748B, 0x1631, 0x7490, 0x39F0, 0x7492, 0x46B9,
+ 0x7497, 0x46BA, 0x7498, 0x39F1, 0x7499, 0x46BB, 0x749C, 0x39F2,
+ 0x749E, 0x1632, 0x749F, 0x2173, 0x74A0, 0x39F3, 0x74A1, 0x46BC,
+ 0x74A2, 0x161E, 0x74A3, 0x39F4, 0x74A5, 0x46BD, 0x74A6, 0x4253,
+ 0x74A7, 0x1633, 0x74A8, 0x39F5, 0x74A9, 0x4254, 0x74AA, 0x46BE,
+ 0x74AB, 0x39F6, 0x74AF, 0x4C58, 0x74B0, 0x0600, 0x74B5, 0x39F7,
+ 0x74B9, 0x46BF, 0x74BA, 0x46C1, 0x74BB, 0x46C0, 0x74BD, 0x08D1,
+ 0x74BF, 0x39F8, 0x74C8, 0x39F9, 0x74C9, 0x4255, 0x74CA, 0x1634,
+ 0x74CF, 0x1635, 0x74D4, 0x1636, 0x74D6, 0x46C2, 0x74D8, 0x46C3,
+ 0x74DA, 0x39FA, 0x74DC, 0x04DD, 0x74DE, 0x39FB, 0x74DF, 0x4C59,
+ 0x74E0, 0x1638, 0x74E2, 0x0DAD, 0x74E3, 0x1639, 0x74E4, 0x4C5A,
+ 0x74E6, 0x05E0, 0x74E7, 0x163A, 0x74E9, 0x163B, 0x74EB, 0x46C4,
+ 0x74EE, 0x163C, 0x74EF, 0x3750, 0x74F0, 0x163E, 0x74F1, 0x163F,
+ 0x74F2, 0x163D, 0x74F4, 0x4C5B, 0x74F6, 0x0DC5, 0x74F7, 0x1641,
+ 0x74F8, 0x1640, 0x74FA, 0x46C6, 0x74FB, 0x4C5C, 0x74FF, 0x4256,
+ 0x7501, 0x2174, 0x7503, 0x1643, 0x7504, 0x1642, 0x7505, 0x1644,
+ 0x750C, 0x1645, 0x750D, 0x1647, 0x750E, 0x1646, 0x7511, 0x080B,
+ 0x7513, 0x1649, 0x7515, 0x1648, 0x7516, 0x4C5D, 0x7517, 0x4257,
+ 0x7518, 0x0601, 0x751A, 0x0A19, 0x751C, 0x0C36, 0x751E, 0x164A,
+ 0x751F, 0x0A5C, 0x7520, 0x46C8, 0x7521, 0x4C5E, 0x7522, 0x35DE,
+ 0x7523, 0x0888, 0x7524, 0x46C9, 0x7525, 0x051B, 0x7526, 0x164B,
+ 0x7528, 0x0F3B, 0x752A, 0x46CA, 0x752B, 0x0E33, 0x752C, 0x164C,
+ 0x752F, 0x20F2, 0x7530, 0x0C3E, 0x7531, 0x0F1D, 0x7532, 0x07D5,
+ 0x7533, 0x0A03, 0x7537, 0x0B89, 0x7538, 0x10C9, 0x753A, 0x0BCA,
+ 0x753B, 0x0568, 0x753C, 0x164D, 0x753D, 0x46CD, 0x753E, 0x46CE,
+ 0x753F, 0x4C5F, 0x7540, 0x46CF, 0x7544, 0x164E, 0x7546, 0x1653,
+ 0x7548, 0x46D0, 0x7549, 0x1651, 0x754A, 0x1650, 0x754B, 0x13C7,
+ 0x754C, 0x0584, 0x754D, 0x164F, 0x754E, 0x39FC, 0x754F, 0x049E,
+ 0x7550, 0x46D1, 0x7551, 0x0D3E, 0x7552, 0x46D2, 0x7554, 0x0D5E,
+ 0x7559, 0x0F79, 0x755A, 0x1654, 0x755B, 0x1652, 0x755C, 0x0B9A,
+ 0x755D, 0x0A4A, 0x755E, 0x4C60, 0x7560, 0x0D3F, 0x7562, 0x0D9F,
+ 0x7564, 0x1656, 0x7565, 0x0F74, 0x7566, 0x0723, 0x7567, 0x1657,
+ 0x7569, 0x1655, 0x756A, 0x0D6A, 0x756B, 0x1658, 0x756C, 0x3C3B,
+ 0x756D, 0x1659, 0x756F, 0x2175, 0x7570, 0x049F, 0x7571, 0x46D4,
+ 0x7572, 0x46D3, 0x7573, 0x09DE, 0x7574, 0x165E, 0x7575, 0x3751,
+ 0x7576, 0x165B, 0x7577, 0x0CC5, 0x7578, 0x165A, 0x7579, 0x39FD,
+ 0x757A, 0x46D5, 0x757D, 0x46D6, 0x757E, 0x46D7, 0x757F, 0x0640,
+ 0x7581, 0x39FE, 0x7582, 0x1661, 0x7586, 0x165C, 0x7587, 0x165D,
+ 0x7589, 0x1660, 0x758A, 0x165F, 0x758B, 0x0D97, 0x758C, 0x46D8,
+ 0x758E, 0x0AC4, 0x758F, 0x0AC3, 0x7590, 0x39FF, 0x7591, 0x0659,
+ 0x7592, 0x3A00, 0x7593, 0x3A01, 0x7594, 0x1662, 0x7599, 0x4C61,
+ 0x759A, 0x1663, 0x759D, 0x1664, 0x75A2, 0x46DA, 0x75A3, 0x1666,
+ 0x75A4, 0x4C62, 0x75A5, 0x1665, 0x75AB, 0x04F8, 0x75B0, 0x46DC,
+ 0x75B1, 0x166E, 0x75B2, 0x0D7C, 0x75B3, 0x1668, 0x75B4, 0x3A02,
+ 0x75B5, 0x166A, 0x75B7, 0x46DD, 0x75B8, 0x166C, 0x75B9, 0x0A04,
+ 0x75BC, 0x166D, 0x75BD, 0x166B, 0x75BE, 0x08EC, 0x75BF, 0x46DE,
+ 0x75C0, 0x46DF, 0x75C1, 0x4C63, 0x75C2, 0x1667, 0x75C3, 0x1669,
+ 0x75C4, 0x4C64, 0x75C5, 0x0DB4, 0x75C6, 0x46E0, 0x75C7, 0x09B1,
+ 0x75CA, 0x1670, 0x75CC, 0x4C65, 0x75CD, 0x166F, 0x75CE, 0x4259,
+ 0x75CF, 0x46E1, 0x75D2, 0x1671, 0x75D3, 0x46E2, 0x75D4, 0x08D2,
+ 0x75D5, 0x081F, 0x75D7, 0x4C66, 0x75D8, 0x0C71, 0x75D9, 0x1672,
+ 0x75DB, 0x0BE7, 0x75DC, 0x4C67, 0x75DD, 0x46E3, 0x75DE, 0x1674,
+ 0x75DF, 0x46E4, 0x75E0, 0x46E5, 0x75E1, 0x4C68, 0x75E2, 0x0F69,
+ 0x75E3, 0x1673, 0x75E4, 0x3A03, 0x75E7, 0x46E6, 0x75E9, 0x0AEB,
+ 0x75EC, 0x3752, 0x75EE, 0x46E7, 0x75EF, 0x4C69, 0x75F0, 0x1679,
+ 0x75F1, 0x46E8, 0x75F2, 0x167B, 0x75F3, 0x167C, 0x75F4, 0x0B92,
+ 0x75F9, 0x3A04, 0x75FA, 0x167A, 0x75FC, 0x1677, 0x75FE, 0x1675,
+ 0x75FF, 0x1676, 0x7600, 0x3A05, 0x7601, 0x1678, 0x7602, 0x425A,
+ 0x7603, 0x46E9, 0x7604, 0x4C6A, 0x7607, 0x46EB, 0x7608, 0x425B,
+ 0x7609, 0x167F, 0x760A, 0x3A06, 0x760B, 0x167D, 0x760C, 0x4C6B,
+ 0x760D, 0x167E, 0x760F, 0x46EC, 0x7613, 0x46EF, 0x7615, 0x3A07,
+ 0x7616, 0x3A08, 0x7618, 0x46EA, 0x7619, 0x3A09, 0x761B, 0x46F0,
+ 0x761C, 0x46F1, 0x761D, 0x4C6C, 0x761E, 0x3A0A, 0x761F, 0x1680,
+ 0x7620, 0x1682, 0x7621, 0x1683, 0x7622, 0x1684, 0x7624, 0x1685,
+ 0x7625, 0x46F3, 0x7626, 0x3645, 0x7627, 0x1681, 0x7628, 0x46F4,
+ 0x762D, 0x3A0B, 0x7630, 0x1687, 0x7632, 0x4C6D, 0x7633, 0x46F6,
+ 0x7634, 0x1686, 0x7635, 0x3A0C, 0x7638, 0x4C6E, 0x763B, 0x1688,
+ 0x763C, 0x46F5, 0x7641, 0x46F9, 0x7642, 0x0F8D, 0x7643, 0x3A0D,
+ 0x7645, 0x4C6F, 0x7646, 0x168B, 0x7647, 0x1689, 0x7648, 0x168A,
+ 0x7649, 0x46FB, 0x764A, 0x4C70, 0x764B, 0x3A0E, 0x764C, 0x061E,
+ 0x764E, 0x3753, 0x7652, 0x0F0A, 0x7655, 0x46FC, 0x7656, 0x0E1A,
+ 0x7658, 0x168D, 0x765C, 0x168C, 0x765F, 0x4C71, 0x7661, 0x168E,
+ 0x7662, 0x168F, 0x7664, 0x425C, 0x7665, 0x3A0F, 0x7667, 0x1693,
+ 0x7668, 0x1690, 0x7669, 0x1691, 0x766A, 0x1692, 0x766C, 0x1694,
+ 0x766D, 0x3A10, 0x766E, 0x46FE, 0x766F, 0x3A11, 0x7670, 0x1695,
+ 0x7671, 0x3A12, 0x7672, 0x1696, 0x7674, 0x3A13, 0x7676, 0x1697,
+ 0x7678, 0x1698, 0x767A, 0x0D43, 0x767B, 0x0C4A, 0x767C, 0x1699,
+ 0x767D, 0x0D28, 0x767E, 0x0DA6, 0x7680, 0x169A, 0x7681, 0x425D,
+ 0x7682, 0x2176, 0x7683, 0x169B, 0x7684, 0x0C24, 0x7686, 0x0585,
+ 0x7687, 0x07D6, 0x7688, 0x169C, 0x768B, 0x169D, 0x768E, 0x169E,
+ 0x7690, 0x0877, 0x7693, 0x16A0, 0x7695, 0x46FF, 0x7696, 0x169F,
+ 0x7699, 0x16A1, 0x769A, 0x16A2, 0x769B, 0x2179, 0x769C, 0x2177,
+ 0x769D, 0x425E, 0x769E, 0x2178, 0x76A0, 0x4701, 0x76A1, 0x4700,
+ 0x76A4, 0x3A14, 0x76A5, 0x3A15, 0x76A6, 0x217A, 0x76A7, 0x4702,
+ 0x76A8, 0x4703, 0x76AA, 0x425F, 0x76AD, 0x4C72, 0x76AE, 0x0D7D,
+ 0x76AF, 0x4704, 0x76B0, 0x16A3, 0x76B4, 0x16A4, 0x76B6, 0x4260,
+ 0x76B7, 0x1D1C, 0x76B8, 0x16A5, 0x76B9, 0x16A6, 0x76BA, 0x16A7,
+ 0x76BD, 0x4C73, 0x76BF, 0x087C, 0x76C2, 0x16A8, 0x76C3, 0x0D0C,
+ 0x76C5, 0x3A16, 0x76C6, 0x0E8D, 0x76C8, 0x04F0, 0x76C9, 0x4706,
+ 0x76CA, 0x04F9, 0x76CC, 0x3A17, 0x76CD, 0x16A9, 0x76CE, 0x4261,
+ 0x76D2, 0x16AB, 0x76D4, 0x4262, 0x76D6, 0x16AA, 0x76D7, 0x0C6A,
+ 0x76D9, 0x4C74, 0x76DB, 0x0A5D, 0x76DC, 0x14D8, 0x76DE, 0x16AC,
+ 0x76DF, 0x0ECD, 0x76E1, 0x16AD, 0x76E3, 0x0602, 0x76E4, 0x0D6B,
+ 0x76E5, 0x16AE, 0x76E6, 0x4263, 0x76E7, 0x16AF, 0x76E8, 0x4708,
+ 0x76EA, 0x16B0, 0x76EB, 0x4C75, 0x76EC, 0x3A18, 0x76EE, 0x0EE8,
+ 0x76F0, 0x4C76, 0x76F1, 0x4264, 0x76F2, 0x0EE1, 0x76F4, 0x0BDA,
+ 0x76F8, 0x0AEC, 0x76F9, 0x4C77, 0x76FB, 0x16B2, 0x76FC, 0x3A19,
+ 0x76FE, 0x096C, 0x7700, 0x4C78, 0x7701, 0x09B2, 0x7704, 0x16B5,
+ 0x7707, 0x16B4, 0x7708, 0x16B3, 0x7709, 0x0D91, 0x770A, 0x4265,
+ 0x770B, 0x0603, 0x770C, 0x075D, 0x770E, 0x4C79, 0x7717, 0x470A,
+ 0x7719, 0x4266, 0x771A, 0x470B, 0x771B, 0x16BB, 0x771E, 0x16B8,
+ 0x771F, 0x0A05, 0x7720, 0x0EBE, 0x7722, 0x4C7A, 0x7724, 0x16B7,
+ 0x7725, 0x16B9, 0x7726, 0x16BA, 0x7728, 0x4C7B, 0x7729, 0x16B6,
+ 0x772D, 0x470C, 0x772F, 0x4C7C, 0x7734, 0x3A1A, 0x7735, 0x470D,
+ 0x7736, 0x3A1B, 0x7737, 0x16BC, 0x7738, 0x16BD, 0x7739, 0x4C7D,
+ 0x773A, 0x0BCB, 0x773C, 0x061F, 0x773E, 0x4C7E, 0x7740, 0x0BA3,
+ 0x7745, 0x4C7F, 0x7746, 0x217C, 0x7747, 0x16BE, 0x774A, 0x4C80,
+ 0x774D, 0x4267, 0x774E, 0x4268, 0x774F, 0x4C81, 0x7758, 0x4712,
+ 0x775A, 0x16BF, 0x775B, 0x16C2, 0x775C, 0x3A1C, 0x775E, 0x4C82,
+ 0x775F, 0x3A1D, 0x7760, 0x3A1E, 0x7761, 0x0A2D, 0x7762, 0x1EC5,
+ 0x7763, 0x0C9C, 0x7764, 0x4C83, 0x7765, 0x16C3, 0x7766, 0x0E81,
+ 0x7767, 0x4C84, 0x7768, 0x16C0, 0x776A, 0x3755, 0x776B, 0x16C1,
+ 0x776C, 0x4C85, 0x7772, 0x3A1F, 0x7779, 0x16C6, 0x777A, 0x4269,
+ 0x777C, 0x4714, 0x777D, 0x3A20, 0x777E, 0x16C5, 0x777F, 0x16C4,
+ 0x7780, 0x426A, 0x7784, 0x4C86, 0x778B, 0x16C8, 0x778C, 0x4C87,
+ 0x778D, 0x4C88, 0x778E, 0x16C7, 0x7791, 0x16C9, 0x7794, 0x426B,
+ 0x7795, 0x3A21, 0x7796, 0x4C89, 0x779A, 0x4717, 0x779E, 0x16CB,
+ 0x779F, 0x4718, 0x77A0, 0x16CA, 0x77A2, 0x4719, 0x77A4, 0x471A,
+ 0x77A5, 0x0E1D, 0x77A7, 0x4C8A, 0x77A9, 0x3756, 0x77AA, 0x3A22,
+ 0x77AC, 0x0960, 0x77AD, 0x0F8E, 0x77AF, 0x4C8B, 0x77B0, 0x16CC,
+ 0x77B3, 0x0C8F, 0x77B6, 0x16CD, 0x77B7, 0x4C8C, 0x77B9, 0x16CE,
+ 0x77BB, 0x16D2, 0x77BC, 0x16D0, 0x77BD, 0x16D1, 0x77BE, 0x4C8D,
+ 0x77BF, 0x16CF, 0x77C7, 0x16D3, 0x77C9, 0x4C8E, 0x77CD, 0x16D4,
+ 0x77D1, 0x4C8F, 0x77D7, 0x16D5, 0x77D9, 0x4C90, 0x77DA, 0x16D6,
+ 0x77DB, 0x0EC3, 0x77DC, 0x16D7, 0x77DE, 0x471B, 0x77DF, 0x471C,
+ 0x77E0, 0x426C, 0x77E2, 0x0EFC, 0x77E3, 0x16D8, 0x77E4, 0x471D,
+ 0x77E5, 0x0B8C, 0x77E6, 0x3A23, 0x77E7, 0x0D20, 0x77E9, 0x06E3,
+ 0x77EA, 0x471E, 0x77EC, 0x471F, 0x77ED, 0x0B79, 0x77EE, 0x16D9,
+ 0x77EF, 0x06B2, 0x77F0, 0x3A24, 0x77F1, 0x4C91, 0x77F3, 0x0A74,
+ 0x77F4, 0x3A25, 0x77FB, 0x4720, 0x77FC, 0x16DA, 0x7802, 0x082D,
+ 0x7805, 0x4722, 0x7806, 0x3A26, 0x7809, 0x4723, 0x780C, 0x16DB,
+ 0x780D, 0x4724, 0x7812, 0x16DC, 0x7814, 0x075A, 0x7815, 0x0845,
+ 0x7819, 0x4725, 0x7820, 0x16DE, 0x7821, 0x217E, 0x7822, 0x3A27,
+ 0x7825, 0x0C50, 0x7826, 0x0846, 0x7827, 0x0668, 0x782C, 0x4726,
+ 0x782D, 0x3A28, 0x782E, 0x3A29, 0x7830, 0x3A2A, 0x7832, 0x0E52,
+ 0x7834, 0x0D01, 0x7835, 0x3A2B, 0x7837, 0x4C92, 0x783A, 0x0C51,
+ 0x783F, 0x07EE, 0x7843, 0x426E, 0x7845, 0x16E0, 0x7847, 0x4727,
+ 0x784E, 0x217F, 0x784F, 0x341E, 0x7851, 0x3C3C, 0x785C, 0x4C93,
+ 0x785D, 0x09B3, 0x7864, 0x2180, 0x7868, 0x3A2C, 0x786A, 0x4728,
+ 0x786B, 0x0F7A, 0x786C, 0x07D7, 0x786E, 0x426F, 0x786F, 0x075B,
+ 0x7872, 0x0D37, 0x7874, 0x16E2, 0x787A, 0x2181, 0x787C, 0x16E4,
+ 0x787E, 0x4C94, 0x7881, 0x079F, 0x7886, 0x16E3, 0x7887, 0x0C12,
+ 0x788A, 0x472A, 0x788C, 0x16E6, 0x788D, 0x0595, 0x788E, 0x16E1,
+ 0x7891, 0x0D7E, 0x7893, 0x04D2, 0x7894, 0x472B, 0x7895, 0x085C,
+ 0x7897, 0x0FF8, 0x7898, 0x4C95, 0x789A, 0x16E5, 0x789D, 0x472D,
+ 0x789E, 0x3A2D, 0x789F, 0x472E, 0x78A1, 0x4C96, 0x78A3, 0x16E7,
+ 0x78A4, 0x472C, 0x78A7, 0x0E1B, 0x78A9, 0x0A7D, 0x78AA, 0x16E9,
+ 0x78AD, 0x4272, 0x78AF, 0x16EA, 0x78B0, 0x4270, 0x78B1, 0x4C97,
+ 0x78B3, 0x4C98, 0x78B5, 0x16E8, 0x78BA, 0x05AC, 0x78BB, 0x472F,
+ 0x78BC, 0x16F0, 0x78BE, 0x16EF, 0x78C1, 0x08D3, 0x78C5, 0x16F1,
+ 0x78C6, 0x16EC, 0x78C8, 0x3A2E, 0x78C9, 0x4C99, 0x78CA, 0x16F2,
+ 0x78CB, 0x16ED, 0x78CC, 0x3A2F, 0x78CE, 0x3A30, 0x78D0, 0x0D6C,
+ 0x78D1, 0x16EB, 0x78D3, 0x4C9A, 0x78D4, 0x16EE, 0x78D5, 0x4730,
+ 0x78DA, 0x16F5, 0x78E0, 0x3A32, 0x78E1, 0x3A33, 0x78E4, 0x3A31,
+ 0x78E6, 0x4731, 0x78E7, 0x16F4, 0x78E8, 0x0E8F, 0x78EC, 0x16F3,
+ 0x78EF, 0x04AF, 0x78F2, 0x3A34, 0x78F4, 0x16F7, 0x78F7, 0x3A35,
+ 0x78F9, 0x4732, 0x78FA, 0x4733, 0x78FB, 0x3A36, 0x78FD, 0x16F6,
+ 0x78FE, 0x4734, 0x7900, 0x4273, 0x7901, 0x09B4, 0x7907, 0x16F8,
+ 0x790C, 0x4C9B, 0x790E, 0x0AC5, 0x7910, 0x4736, 0x7911, 0x16FA,
+ 0x7912, 0x16F9, 0x7919, 0x16FB, 0x791B, 0x4737, 0x791C, 0x4274,
+ 0x791F, 0x4C9C, 0x7925, 0x4738, 0x7926, 0x16DD, 0x7927, 0x4C9D,
+ 0x7928, 0x4C9E, 0x792A, 0x16DF, 0x792B, 0x16FD, 0x792C, 0x16FC,
+ 0x792E, 0x4275, 0x7930, 0x2182, 0x7931, 0x3A37, 0x7934, 0x4276,
+ 0x793A, 0x08D4, 0x793B, 0x3A39, 0x793C, 0x0FB1, 0x793D, 0x3A3A,
+ 0x793E, 0x08FE, 0x793F, 0x4C9F, 0x7940, 0x16FE, 0x7941, 0x070D,
+ 0x7942, 0x4CA0, 0x7945, 0x3A3B, 0x7946, 0x4277, 0x7947, 0x065A,
+ 0x7948, 0x0641, 0x7949, 0x08B1, 0x794A, 0x4739, 0x7950, 0x0F1E,
+ 0x7953, 0x1704, 0x7954, 0x4CA1, 0x7955, 0x1703, 0x7956, 0x0AC6,
+ 0x7957, 0x1700, 0x7958, 0x473A, 0x795A, 0x1702, 0x795B, 0x3A3C,
+ 0x795C, 0x3A3D, 0x795D, 0x0955, 0x795E, 0x0A06, 0x795F, 0x1701,
+ 0x7960, 0x16FF, 0x7962, 0x0CE0, 0x7965, 0x09B5, 0x7967, 0x473C,
+ 0x7968, 0x0DAE, 0x796B, 0x4CA2, 0x796D, 0x0847, 0x7972, 0x473D,
+ 0x7977, 0x0C72, 0x7979, 0x4278, 0x797A, 0x1705, 0x797C, 0x4CA3,
+ 0x797F, 0x1706, 0x7980, 0x171C, 0x7981, 0x06D0, 0x7984, 0x0FE3,
+ 0x7985, 0x0AB7, 0x798A, 0x1707, 0x798B, 0x3A3E, 0x798D, 0x0552,
+ 0x798E, 0x0C13, 0x798F, 0x0DF1, 0x7994, 0x2186, 0x7995, 0x473E,
+ 0x7996, 0x3A3F, 0x7998, 0x3A40, 0x799B, 0x2188, 0x799D, 0x1708,
+ 0x79A1, 0x473F, 0x79A6, 0x0694, 0x79A7, 0x1709, 0x79A9, 0x4740,
+ 0x79AA, 0x170B, 0x79AB, 0x4CA4, 0x79AE, 0x170C, 0x79B0, 0x0CDF,
+ 0x79B1, 0x1E4E, 0x79B3, 0x170D, 0x79B4, 0x4741, 0x79B8, 0x3A41,
+ 0x79B9, 0x170E, 0x79BA, 0x170F, 0x79BB, 0x3A42, 0x79BD, 0x06D1,
+ 0x79BE, 0x0553, 0x79BF, 0x0C9D, 0x79C0, 0x0932, 0x79C1, 0x08B2,
+ 0x79C2, 0x4742, 0x79C4, 0x4CA5, 0x79C7, 0x4743, 0x79C8, 0x4279,
+ 0x79C9, 0x1710, 0x79CA, 0x3A43, 0x79CB, 0x0933, 0x79CC, 0x4744,
+ 0x79CD, 0x4745, 0x79D1, 0x054A, 0x79D2, 0x0DB5, 0x79D4, 0x427B,
+ 0x79D5, 0x1711, 0x79D6, 0x4746, 0x79D8, 0x0D7F, 0x79DA, 0x3A44,
+ 0x79DE, 0x427C, 0x79DF, 0x0AC7, 0x79E1, 0x1714, 0x79E3, 0x1715,
+ 0x79E4, 0x0D1F, 0x79E6, 0x0A07, 0x79E7, 0x1712, 0x79E9, 0x0B9F,
+ 0x79EA, 0x4CA6, 0x79EB, 0x427D, 0x79EC, 0x1713, 0x79ED, 0x427E,
+ 0x79F0, 0x09B6, 0x79FB, 0x04A0, 0x7A00, 0x0643, 0x7A02, 0x4CA7,
+ 0x7A03, 0x3A45, 0x7A05, 0x3633, 0x7A08, 0x1716, 0x7A09, 0x3A46,
+ 0x7A0A, 0x474B, 0x7A0B, 0x0C14, 0x7A0C, 0x4CA8, 0x7A0D, 0x1717,
+ 0x7A0E, 0x0A6B, 0x7A11, 0x3A47, 0x7A14, 0x0EB9, 0x7A15, 0x474C,
+ 0x7A17, 0x0D95, 0x7A18, 0x1718, 0x7A19, 0x1719, 0x7A1A, 0x0B93,
+ 0x7A1B, 0x474D, 0x7A1C, 0x0F8F, 0x7A1E, 0x3A48, 0x7A1F, 0x171B,
+ 0x7A20, 0x171A, 0x7A2D, 0x3A49, 0x7A2E, 0x091B, 0x7A30, 0x4CA9,
+ 0x7A31, 0x171D, 0x7A32, 0x04B4, 0x7A37, 0x1720, 0x7A38, 0x474F,
+ 0x7A39, 0x3A4A, 0x7A3A, 0x4CAA, 0x7A3B, 0x171E, 0x7A3C, 0x0554,
+ 0x7A3D, 0x0724, 0x7A3E, 0x171F, 0x7A3F, 0x07D8, 0x7A40, 0x0804,
+ 0x7A42, 0x0E36, 0x7A43, 0x1721, 0x7A44, 0x4CAB, 0x7A45, 0x3A4B,
+ 0x7A46, 0x0E82, 0x7A47, 0x4750, 0x7A49, 0x1723, 0x7A4C, 0x3A4C,
+ 0x7A4D, 0x0A75, 0x7A4E, 0x04F1, 0x7A4F, 0x053A, 0x7A50, 0x0470,
+ 0x7A56, 0x4751, 0x7A57, 0x1722, 0x7A59, 0x4752, 0x7A5C, 0x4753,
+ 0x7A5D, 0x3A4D, 0x7A5F, 0x4754, 0x7A60, 0x4F56, 0x7A61, 0x1724,
+ 0x7A62, 0x1725, 0x7A63, 0x09DF, 0x7A67, 0x4755, 0x7A69, 0x1726,
+ 0x7A6A, 0x4756, 0x7A6B, 0x05AD, 0x7A6D, 0x3A4F, 0x7A70, 0x1728,
+ 0x7A74, 0x0740, 0x7A75, 0x4757, 0x7A76, 0x0680, 0x7A78, 0x3A50,
+ 0x7A79, 0x1729, 0x7A7A, 0x06ED, 0x7A7D, 0x172A, 0x7A7F, 0x0AA0,
+ 0x7A80, 0x4CAC, 0x7A81, 0x0CA5, 0x7A82, 0x4758, 0x7A83, 0x0A84,
+ 0x7A84, 0x0865, 0x7A85, 0x427F, 0x7A86, 0x4CAD, 0x7A88, 0x172B,
+ 0x7A8A, 0x4759, 0x7A90, 0x475A, 0x7A92, 0x0BA0, 0x7A93, 0x0AED,
+ 0x7A94, 0x4CAE, 0x7A95, 0x172D, 0x7A96, 0x172F, 0x7A97, 0x172C,
+ 0x7A98, 0x172E, 0x7A9F, 0x06F8, 0x7AA0, 0x3A51, 0x7AA3, 0x3A52,
+ 0x7AA9, 0x1730, 0x7AAA, 0x06FC, 0x7AAC, 0x475B, 0x7AAE, 0x0681,
+ 0x7AAF, 0x0F3C, 0x7AB0, 0x1732, 0x7AB3, 0x3A53, 0x7AB5, 0x4CAF,
+ 0x7AB6, 0x1733, 0x7AB9, 0x475E, 0x7ABA, 0x04D0, 0x7ABB, 0x3A54,
+ 0x7ABC, 0x3A55, 0x7ABD, 0x4CB0, 0x7ABE, 0x475F, 0x7ABF, 0x1736,
+ 0x7AC3, 0x05D4, 0x7AC4, 0x1735, 0x7AC5, 0x1734, 0x7AC6, 0x3A56,
+ 0x7AC7, 0x1738, 0x7AC8, 0x1731, 0x7ACA, 0x1739, 0x7ACB, 0x0F71,
+ 0x7ACC, 0x4761, 0x7ACD, 0x173A, 0x7ACE, 0x4281, 0x7ACF, 0x173B,
+ 0x7AD1, 0x2189, 0x7AD2, 0x11C5, 0x7AD3, 0x173D, 0x7AD5, 0x173C,
+ 0x7AD9, 0x173E, 0x7ADA, 0x173F, 0x7ADC, 0x0F7D, 0x7ADD, 0x1740,
+ 0x7ADF, 0x1C08, 0x7AE0, 0x09B7, 0x7AE1, 0x1741, 0x7AE2, 0x1742,
+ 0x7AE3, 0x0961, 0x7AE5, 0x0C90, 0x7AE6, 0x1743, 0x7AE7, 0x218A,
+ 0x7AE8, 0x4762, 0x7AEA, 0x0B66, 0x7AEB, 0x218C, 0x7AED, 0x1744,
+ 0x7AEF, 0x0B7A, 0x7AF0, 0x1745, 0x7AF4, 0x4763, 0x7AF6, 0x069D,
+ 0x7AF8, 0x1076, 0x7AF9, 0x0B9B, 0x7AFA, 0x08DF, 0x7AFD, 0x4282,
+ 0x7AFE, 0x4CB1, 0x7AFF, 0x0604, 0x7B02, 0x1746, 0x7B04, 0x1753,
+ 0x7B06, 0x1749, 0x7B07, 0x3A57, 0x7B08, 0x0682, 0x7B0A, 0x1748,
+ 0x7B0B, 0x1755, 0x7B0F, 0x1747, 0x7B11, 0x09B8, 0x7B12, 0x4283,
+ 0x7B14, 0x3A58, 0x7B18, 0x174B, 0x7B19, 0x174C, 0x7B1B, 0x0C25,
+ 0x7B1E, 0x174D, 0x7B20, 0x05BC, 0x7B25, 0x0A20, 0x7B26, 0x0DD6,
+ 0x7B27, 0x3A59, 0x7B28, 0x174F, 0x7B2A, 0x4768, 0x7B2B, 0x4CB2,
+ 0x7B2C, 0x0B48, 0x7B2D, 0x4284, 0x7B2E, 0x4769, 0x7B2F, 0x476A,
+ 0x7B31, 0x3A5A, 0x7B33, 0x174A, 0x7B35, 0x174E, 0x7B36, 0x1750,
+ 0x7B39, 0x086B, 0x7B3B, 0x4285, 0x7B3D, 0x4767, 0x7B41, 0x476E,
+ 0x7B45, 0x1757, 0x7B46, 0x0DA0, 0x7B47, 0x3A5B, 0x7B48, 0x0D3A,
+ 0x7B49, 0x0C73, 0x7B4B, 0x06D2, 0x7B4C, 0x1756, 0x7B4D, 0x1754,
+ 0x7B4E, 0x3A5C, 0x7B4F, 0x0D49, 0x7B50, 0x1751, 0x7B51, 0x0B9C,
+ 0x7B52, 0x0C75, 0x7B53, 0x375D, 0x7B54, 0x0C74, 0x7B55, 0x4770,
+ 0x7B56, 0x0866, 0x7B5D, 0x1769, 0x7B60, 0x3A5D, 0x7B64, 0x4772,
+ 0x7B65, 0x1759, 0x7B66, 0x4773, 0x7B67, 0x175B, 0x7B69, 0x3A5E,
+ 0x7B6C, 0x175E, 0x7B6D, 0x3A5F, 0x7B6E, 0x175F, 0x7B6F, 0x4286,
+ 0x7B70, 0x175C, 0x7B71, 0x175D, 0x7B72, 0x3A60, 0x7B73, 0x4774,
+ 0x7B74, 0x175A, 0x7B75, 0x1758, 0x7B77, 0x4CB3, 0x7B79, 0x4771,
+ 0x7B7A, 0x1752, 0x7B7F, 0x476D, 0x7B86, 0x0E1F, 0x7B87, 0x0555,
+ 0x7B8B, 0x1766, 0x7B8D, 0x1763, 0x7B8F, 0x1768, 0x7B90, 0x4777,
+ 0x7B91, 0x3A61, 0x7B92, 0x1767, 0x7B94, 0x0D29, 0x7B95, 0x0EB3,
+ 0x7B97, 0x0889, 0x7B98, 0x1761, 0x7B99, 0x176A, 0x7B9A, 0x1765,
+ 0x7B9B, 0x4778, 0x7B9C, 0x1764, 0x7B9D, 0x1760, 0x7B9E, 0x218D,
+ 0x7B9F, 0x1762, 0x7BA0, 0x4CB4, 0x7BA1, 0x0605, 0x7BAA, 0x0B7B,
+ 0x7BAC, 0x4CB5, 0x7BAD, 0x0AA1, 0x7BAF, 0x3A62, 0x7BB0, 0x4CB6,
+ 0x7BB1, 0x0D36, 0x7BB4, 0x176F, 0x7BB5, 0x477A, 0x7BB8, 0x0D38,
+ 0x7BBC, 0x477B, 0x7BC0, 0x0A85, 0x7BC1, 0x176C, 0x7BC4, 0x0D63,
+ 0x7BC5, 0x477C, 0x7BC6, 0x1770, 0x7BC7, 0x0E23, 0x7BC9, 0x0B99,
+ 0x7BCA, 0x477D, 0x7BCB, 0x176B, 0x7BCC, 0x176D, 0x7BCF, 0x176E,
+ 0x7BD4, 0x4780, 0x7BD6, 0x4781, 0x7BD7, 0x3A63, 0x7BD9, 0x3A64,
+ 0x7BDA, 0x4782, 0x7BDD, 0x1771, 0x7BE0, 0x08F0, 0x7BE4, 0x0C9E,
+ 0x7BE5, 0x1776, 0x7BE6, 0x1775, 0x7BE8, 0x4CB7, 0x7BE9, 0x1772,
+ 0x7BEA, 0x4783, 0x7BED, 0x0FDC, 0x7BF0, 0x4784, 0x7BF2, 0x4CB8,
+ 0x7BF3, 0x177B, 0x7BF6, 0x177F, 0x7BF7, 0x177C, 0x7BF8, 0x4CB9,
+ 0x7BFC, 0x4CBA, 0x7BFE, 0x4CBB, 0x7C00, 0x1778, 0x7C01, 0x4287,
+ 0x7C03, 0x4785, 0x7C07, 0x1779, 0x7C09, 0x4CBC, 0x7C0B, 0x3A65,
+ 0x7C0D, 0x177E, 0x7C0E, 0x4786, 0x7C0F, 0x3A66, 0x7C11, 0x1773,
+ 0x7C12, 0x10EA, 0x7C13, 0x177A, 0x7C14, 0x1774, 0x7C17, 0x177D,
+ 0x7C1E, 0x1E3B, 0x7C1F, 0x1783, 0x7C20, 0x3A67, 0x7C21, 0x0606,
+ 0x7C23, 0x1780, 0x7C26, 0x3A68, 0x7C27, 0x1781, 0x7C28, 0x4CBD,
+ 0x7C2A, 0x1782, 0x7C2B, 0x1785, 0x7C2F, 0x4CBE, 0x7C31, 0x3A69,
+ 0x7C33, 0x4288, 0x7C36, 0x3A6A, 0x7C37, 0x1784, 0x7C38, 0x0D8A,
+ 0x7C3D, 0x1786, 0x7C3E, 0x0FC4, 0x7C3F, 0x0E3D, 0x7C40, 0x178B,
+ 0x7C42, 0x4CBF, 0x7C43, 0x1788, 0x7C45, 0x4787, 0x7C4A, 0x4788,
+ 0x7C4C, 0x1787, 0x7C4D, 0x0A76, 0x7C4F, 0x178A, 0x7C50, 0x178C,
+ 0x7C51, 0x3A6B, 0x7C52, 0x4CC0, 0x7C53, 0x4CC1, 0x7C54, 0x1789,
+ 0x7C56, 0x1790, 0x7C57, 0x4789, 0x7C58, 0x178D, 0x7C59, 0x3A6C,
+ 0x7C5B, 0x4CC2, 0x7C5C, 0x4CC3, 0x7C5D, 0x4CC4, 0x7C5E, 0x478A,
+ 0x7C5F, 0x178E, 0x7C60, 0x1777, 0x7C61, 0x478B, 0x7C64, 0x178F,
+ 0x7C65, 0x1791, 0x7C67, 0x3A6D, 0x7C69, 0x478C, 0x7C6C, 0x1792,
+ 0x7C6D, 0x428A, 0x7C6E, 0x3A6E, 0x7C6F, 0x478D, 0x7C70, 0x3A6F,
+ 0x7C72, 0x4CC5, 0x7C73, 0x0E16, 0x7C75, 0x1793, 0x7C79, 0x428B,
+ 0x7C7B, 0x370E, 0x7C7D, 0x4CC6, 0x7C7E, 0x0EEE, 0x7C81, 0x06C6,
+ 0x7C82, 0x06FF, 0x7C83, 0x1794, 0x7C87, 0x4CC7, 0x7C89, 0x0E04,
+ 0x7C8B, 0x0A2E, 0x7C8D, 0x0EBC, 0x7C8F, 0x428C, 0x7C90, 0x1795,
+ 0x7C92, 0x0F7B, 0x7C94, 0x428D, 0x7C95, 0x0D2A, 0x7C97, 0x0AC8,
+ 0x7C98, 0x0CEA, 0x7C9B, 0x0957, 0x7C9E, 0x4CC8, 0x7C9F, 0x0484,
+ 0x7CA0, 0x428E, 0x7CA1, 0x179A, 0x7CA2, 0x1798, 0x7CA4, 0x1796,
+ 0x7CA5, 0x05DD, 0x7CA6, 0x4791, 0x7CA7, 0x09B9, 0x7CA8, 0x179B,
+ 0x7CAB, 0x1799, 0x7CAD, 0x1797, 0x7CAE, 0x179F, 0x7CB1, 0x179E,
+ 0x7CB2, 0x179D, 0x7CB3, 0x179C, 0x7CB6, 0x4793, 0x7CB7, 0x4794,
+ 0x7CB9, 0x17A0, 0x7CBA, 0x4CC9, 0x7CBC, 0x3A70, 0x7CBD, 0x17A1,
+ 0x7CBE, 0x0A5E, 0x7CBF, 0x3A71, 0x7CC0, 0x17A2, 0x7CC2, 0x17A4,
+ 0x7CC4, 0x4796, 0x7CC5, 0x17A3, 0x7CC7, 0x4CCA, 0x7CC8, 0x3A72,
+ 0x7CC9, 0x3A73, 0x7CCA, 0x0786, 0x7CCD, 0x4798, 0x7CCE, 0x0ABA,
+ 0x7CD2, 0x17A6, 0x7CD3, 0x4CCB, 0x7CD5, 0x428F, 0x7CD6, 0x0C76,
+ 0x7CD7, 0x3A74, 0x7CD8, 0x17A5, 0x7CD9, 0x3A75, 0x7CDA, 0x4CCC,
+ 0x7CDC, 0x17A7, 0x7CDD, 0x3A76, 0x7CDE, 0x0E05, 0x7CDF, 0x0AEE,
+ 0x7CE0, 0x07D9, 0x7CE2, 0x17A8, 0x7CE6, 0x479B, 0x7CE7, 0x0F90,
+ 0x7CEB, 0x3A77, 0x7CEF, 0x17AA, 0x7CF2, 0x17AB, 0x7CF4, 0x17AC,
+ 0x7CF5, 0x479D, 0x7CF6, 0x17AD, 0x7CF8, 0x08B3, 0x7CFA, 0x17AE,
+ 0x7CFB, 0x0725, 0x7CFE, 0x0684, 0x7D00, 0x0644, 0x7D02, 0x17B0,
+ 0x7D03, 0x479E, 0x7D04, 0x0EFF, 0x7D05, 0x07DA, 0x7D06, 0x17AF,
+ 0x7D07, 0x3A78, 0x7D08, 0x3A79, 0x7D09, 0x3A7A, 0x7D0A, 0x17B3,
+ 0x7D0B, 0x0EF2, 0x7D0D, 0x0CF2, 0x7D10, 0x0DA5, 0x7D12, 0x47A0,
+ 0x7D13, 0x3A7B, 0x7D14, 0x096D, 0x7D15, 0x17B2, 0x7D17, 0x08FF,
+ 0x7D18, 0x07DB, 0x7D19, 0x08B4, 0x7D1A, 0x0683, 0x7D1B, 0x0E06,
+ 0x7D1C, 0x17B1, 0x7D1D, 0x3A7C, 0x7D1E, 0x47A1, 0x7D20, 0x0AC9,
+ 0x7D21, 0x0E70, 0x7D22, 0x0867, 0x7D23, 0x3A7D, 0x7D2B, 0x08B5,
+ 0x7D2C, 0x0BF9, 0x7D2E, 0x17B6, 0x7D2F, 0x0FA7, 0x7D30, 0x0849,
+ 0x7D31, 0x4290, 0x7D32, 0x17B7, 0x7D33, 0x0A08, 0x7D35, 0x17B9,
+ 0x7D39, 0x09BA, 0x7D3A, 0x0820, 0x7D3C, 0x4CCD, 0x7D3D, 0x47A4,
+ 0x7D3E, 0x47A5, 0x7D3F, 0x17B8, 0x7D40, 0x47A6, 0x7D41, 0x3A7E,
+ 0x7D42, 0x0934, 0x7D43, 0x0772, 0x7D44, 0x0ACA, 0x7D45, 0x17B4,
+ 0x7D46, 0x17BA, 0x7D47, 0x47A7, 0x7D48, 0x218F, 0x7D4B, 0x17B5,
+ 0x7D4C, 0x0726, 0x7D4D, 0x4CCE, 0x7D4E, 0x17BD, 0x7D4F, 0x17C1,
+ 0x7D50, 0x0741, 0x7D53, 0x3A7F, 0x7D55, 0x363A, 0x7D56, 0x17BC,
+ 0x7D59, 0x3A80, 0x7D5A, 0x47AB, 0x7D5B, 0x17C5, 0x7D5C, 0x4291,
+ 0x7D5D, 0x3A81, 0x7D5E, 0x07DC, 0x7D61, 0x0F57, 0x7D62, 0x0480,
+ 0x7D63, 0x17C2, 0x7D66, 0x0685, 0x7D68, 0x17BF, 0x7D6A, 0x47AC,
+ 0x7D6E, 0x17C0, 0x7D70, 0x47AD, 0x7D71, 0x0C77, 0x7D72, 0x17BE,
+ 0x7D73, 0x17BB, 0x7D75, 0x0586, 0x7D76, 0x0A88, 0x7D79, 0x075C,
+ 0x7D7A, 0x3A82, 0x7D7D, 0x17C7, 0x7D7F, 0x47AF, 0x7D82, 0x4CCF,
+ 0x7D83, 0x4292, 0x7D85, 0x4CD0, 0x7D86, 0x3A83, 0x7D88, 0x47B1,
+ 0x7D89, 0x17C4, 0x7D8B, 0x3A84, 0x7D8C, 0x3A85, 0x7D8D, 0x4CD1,
+ 0x7D8F, 0x17C6, 0x7D91, 0x4CD2, 0x7D93, 0x17C3, 0x7D97, 0x47B2,
+ 0x7D99, 0x0727, 0x7D9A, 0x0B13, 0x7D9B, 0x17C8, 0x7D9C, 0x0AF0,
+ 0x7D9D, 0x47B4, 0x7D9E, 0x4CD3, 0x7D9F, 0x17D5, 0x7DA0, 0x2192,
+ 0x7DA2, 0x17D1, 0x7DA3, 0x17CB, 0x7DA6, 0x4293, 0x7DA7, 0x47B5,
+ 0x7DAA, 0x47B6, 0x7DAB, 0x17CF, 0x7DAC, 0x0926, 0x7DAD, 0x04A1,
+ 0x7DAE, 0x17CA, 0x7DAF, 0x17D2, 0x7DB0, 0x17D6, 0x7DB1, 0x07DD,
+ 0x7DB2, 0x0EE2, 0x7DB3, 0x4CD4, 0x7DB4, 0x0BF2, 0x7DB5, 0x17CC,
+ 0x7DB6, 0x47B7, 0x7DB7, 0x2191, 0x7DB8, 0x17D4, 0x7DB9, 0x4CD5,
+ 0x7DBA, 0x17C9, 0x7DBB, 0x0B7C, 0x7DBD, 0x17CE, 0x7DBE, 0x0481,
+ 0x7DBF, 0x0ED6, 0x7DC0, 0x47B8, 0x7DC2, 0x4294, 0x7DC7, 0x17CD,
+ 0x7DCA, 0x06D3, 0x7DCB, 0x0D80, 0x7DCC, 0x3A86, 0x7DCF, 0x0AEF,
+ 0x7DD0, 0x4CD6, 0x7DD1, 0x0F98, 0x7DD2, 0x0979, 0x7DD5, 0x17FD,
+ 0x7DD6, 0x2193, 0x7DD7, 0x47B9, 0x7DD8, 0x17D7, 0x7DD9, 0x47BA,
+ 0x7DDA, 0x0AA2, 0x7DDC, 0x17D3, 0x7DDD, 0x17D8, 0x7DDE, 0x17DA,
+ 0x7DE0, 0x0C15, 0x7DE1, 0x17DD, 0x7DE3, 0x340A, 0x7DE4, 0x17D9,
+ 0x7DE5, 0x4CD7, 0x7DE6, 0x47BB, 0x7DE8, 0x0E24, 0x7DE9, 0x0607,
+ 0x7DEB, 0x3A87, 0x7DEC, 0x0ED7, 0x7DEF, 0x04A2, 0x7DF1, 0x3A88,
+ 0x7DF2, 0x17DC, 0x7DF4, 0x0FC5, 0x7DF5, 0x4CD8, 0x7DF6, 0x4CD9,
+ 0x7DF9, 0x3A89, 0x7DFB, 0x17DB, 0x7E01, 0x0511, 0x7E04, 0x0CC4,
+ 0x7E05, 0x17DE, 0x7E08, 0x3A8A, 0x7E09, 0x17E5, 0x7E0A, 0x17DF,
+ 0x7E0B, 0x17E6, 0x7E10, 0x47BF, 0x7E11, 0x3A8B, 0x7E12, 0x17E2,
+ 0x7E15, 0x3A8C, 0x7E17, 0x47C0, 0x7E1B, 0x0D31, 0x7E1D, 0x47C1,
+ 0x7E1E, 0x08F6, 0x7E1F, 0x17E4, 0x7E20, 0x3A8D, 0x7E21, 0x17E1,
+ 0x7E22, 0x17E7, 0x7E23, 0x17E0, 0x7E26, 0x094E, 0x7E27, 0x47C2,
+ 0x7E28, 0x4295, 0x7E2B, 0x0E53, 0x7E2C, 0x47C3, 0x7E2E, 0x0956,
+ 0x7E2F, 0x4CDA, 0x7E31, 0x17E3, 0x7E32, 0x17EF, 0x7E35, 0x17EB,
+ 0x7E36, 0x4CDB, 0x7E37, 0x17EE, 0x7E39, 0x17EC, 0x7E3A, 0x17F0,
+ 0x7E3B, 0x17EA, 0x7E3D, 0x17D0, 0x7E3E, 0x0A77, 0x7E41, 0x0D5F,
+ 0x7E43, 0x17ED, 0x7E44, 0x4CDC, 0x7E45, 0x47C4, 0x7E46, 0x17E8,
+ 0x7E47, 0x3A8E, 0x7E48, 0x3767, 0x7E4A, 0x0AA3, 0x7E4B, 0x0728,
+ 0x7E4D, 0x0935, 0x7E52, 0x2194, 0x7E54, 0x09EB, 0x7E55, 0x0AB8,
+ 0x7E56, 0x17F3, 0x7E59, 0x17F5, 0x7E5A, 0x17F6, 0x7E5D, 0x17F2,
+ 0x7E5E, 0x17F4, 0x7E61, 0x1E11, 0x7E62, 0x3A8F, 0x7E66, 0x17E9,
+ 0x7E67, 0x17F1, 0x7E69, 0x17F9, 0x7E6A, 0x17F8, 0x7E6B, 0x1DF7,
+ 0x7E6D, 0x0EA8, 0x7E6E, 0x3A90, 0x7E6F, 0x4CDD, 0x7E70, 0x0701,
+ 0x7E73, 0x3A91, 0x7E75, 0x47C5, 0x7E78, 0x4CDE, 0x7E79, 0x17F7,
+ 0x7E7B, 0x17FB, 0x7E7C, 0x17FA, 0x7E7D, 0x17FE, 0x7E7E, 0x47C6,
+ 0x7E7F, 0x1800, 0x7E81, 0x4CDF, 0x7E82, 0x088A, 0x7E83, 0x17FC,
+ 0x7E86, 0x47C7, 0x7E87, 0x47C8, 0x7E88, 0x1801, 0x7E89, 0x1802,
+ 0x7E8A, 0x20A7, 0x7E8C, 0x1803, 0x7E8D, 0x3A92, 0x7E8E, 0x1809,
+ 0x7E8F, 0x0C35, 0x7E90, 0x1805, 0x7E91, 0x3A93, 0x7E92, 0x1804,
+ 0x7E93, 0x1806, 0x7E94, 0x1807, 0x7E96, 0x1808, 0x7E98, 0x3A94,
+ 0x7E9A, 0x47CA, 0x7E9B, 0x180A, 0x7E9C, 0x180B, 0x7F36, 0x0608,
+ 0x7F38, 0x180C, 0x7F3A, 0x180D, 0x7F3B, 0x47CD, 0x7F3C, 0x47CC,
+ 0x7F3D, 0x4CE0, 0x7F3E, 0x47CE, 0x7F43, 0x47CF, 0x7F44, 0x3A95,
+ 0x7F45, 0x180E, 0x7F47, 0x2195, 0x7F4C, 0x180F, 0x7F4D, 0x1810,
+ 0x7F4E, 0x1811, 0x7F4F, 0x3A96, 0x7F50, 0x1812, 0x7F51, 0x1813,
+ 0x7F52, 0x3A97, 0x7F53, 0x3A98, 0x7F54, 0x1815, 0x7F55, 0x1814,
+ 0x7F58, 0x1816, 0x7F5B, 0x4CE1, 0x7F5D, 0x4CE2, 0x7F5F, 0x1817,
+ 0x7F60, 0x1818, 0x7F61, 0x3A99, 0x7F63, 0x47D3, 0x7F64, 0x47D4,
+ 0x7F65, 0x4CE3, 0x7F67, 0x181B, 0x7F68, 0x1819, 0x7F69, 0x181A,
+ 0x7F6A, 0x0851, 0x7F6B, 0x0729, 0x7F6D, 0x47D5, 0x7F6E, 0x0B94,
+ 0x7F70, 0x0D47, 0x7F71, 0x4CE4, 0x7F72, 0x097A, 0x7F75, 0x0D03,
+ 0x7F77, 0x0D81, 0x7F78, 0x181C, 0x7F79, 0x1336, 0x7F7D, 0x47D6,
+ 0x7F7E, 0x47D7, 0x7F7F, 0x4CE5, 0x7F80, 0x4CE6, 0x7F82, 0x181D,
+ 0x7F83, 0x181F, 0x7F85, 0x0F4F, 0x7F86, 0x181E, 0x7F87, 0x1821,
+ 0x7F88, 0x1820, 0x7F8A, 0x0F3D, 0x7F8B, 0x4CE7, 0x7F8C, 0x1822,
+ 0x7F8E, 0x0D92, 0x7F90, 0x47D8, 0x7F91, 0x3A9A, 0x7F94, 0x1823,
+ 0x7F96, 0x47DB, 0x7F97, 0x4296, 0x7F9A, 0x1826, 0x7F9C, 0x47DC,
+ 0x7F9D, 0x1825, 0x7F9E, 0x1824, 0x7FA1, 0x2196, 0x7FA2, 0x4CE8,
+ 0x7FA3, 0x1827, 0x7FA4, 0x0708, 0x7FA8, 0x0AA4, 0x7FA9, 0x065B,
+ 0x7FAD, 0x47DD, 0x7FAE, 0x182B, 0x7FAF, 0x1828, 0x7FB2, 0x1829,
+ 0x7FB6, 0x182C, 0x7FB8, 0x182D, 0x7FB9, 0x182A, 0x7FBD, 0x04CB,
+ 0x7FBF, 0x3A9B, 0x7FC1, 0x0527, 0x7FC3, 0x47DF, 0x7FC5, 0x182F,
+ 0x7FC6, 0x1830, 0x7FCA, 0x1831, 0x7FCC, 0x0F4C, 0x7FCE, 0x3A9C,
+ 0x7FCF, 0x47E0, 0x7FD2, 0x0936, 0x7FD4, 0x1833, 0x7FD5, 0x1832,
+ 0x7FDB, 0x4297, 0x7FDF, 0x3A9D, 0x7FE0, 0x0A2F, 0x7FE1, 0x1834,
+ 0x7FE3, 0x47E1, 0x7FE5, 0x3A9E, 0x7FE6, 0x1835, 0x7FE9, 0x1836,
+ 0x7FEB, 0x0621, 0x7FEC, 0x3A9F, 0x7FEE, 0x3AA0, 0x7FEF, 0x3AA1,
+ 0x7FF0, 0x0609, 0x7FF2, 0x47E2, 0x7FF3, 0x1837, 0x7FF9, 0x1838,
+ 0x7FFA, 0x3AA2, 0x7FFB, 0x0E8B, 0x7FFC, 0x0F4D, 0x7FFD, 0x4CE9,
+ 0x7FFE, 0x4CEA, 0x7FFF, 0x4CEB, 0x8000, 0x0F3E, 0x8001, 0x0FDD,
+ 0x8002, 0x3713, 0x8003, 0x07DF, 0x8004, 0x183B, 0x8005, 0x0900,
+ 0x8006, 0x183A, 0x8007, 0x4CEC, 0x8008, 0x47E4, 0x800A, 0x47E3,
+ 0x800B, 0x183C, 0x800C, 0x08D5, 0x800D, 0x4CED, 0x800E, 0x3AA3,
+ 0x8010, 0x0B31, 0x8011, 0x3AA4, 0x8012, 0x183D, 0x8014, 0x3AA5,
+ 0x8015, 0x07DE, 0x8016, 0x47E5, 0x8017, 0x0EE3, 0x8018, 0x183E,
+ 0x8019, 0x183F, 0x801C, 0x1840, 0x801E, 0x4CEE, 0x8021, 0x1841,
+ 0x8024, 0x3AA6, 0x8026, 0x3AA7, 0x8028, 0x1842, 0x802C, 0x47E6,
+ 0x8030, 0x47E7, 0x8033, 0x08D6, 0x8035, 0x4298, 0x8036, 0x0EF9,
+ 0x8037, 0x4299, 0x8039, 0x4CEF, 0x803A, 0x3AA8, 0x803B, 0x1844,
+ 0x803C, 0x3AA9, 0x803D, 0x0B7D, 0x803F, 0x1843, 0x8043, 0x47E8,
+ 0x8046, 0x1846, 0x804A, 0x1845, 0x8052, 0x1847, 0x8056, 0x0A5F,
+ 0x8058, 0x1848, 0x805A, 0x1849, 0x805E, 0x0E09, 0x805F, 0x184A,
+ 0x8060, 0x3AAA, 0x8061, 0x0AF1, 0x8062, 0x184B, 0x8066, 0x47E9,
+ 0x8068, 0x184C, 0x806F, 0x0FC6, 0x8070, 0x184F, 0x8071, 0x3AAB,
+ 0x8072, 0x184E, 0x8073, 0x184D, 0x8074, 0x0BCC, 0x8075, 0x3AAC,
+ 0x8076, 0x1850, 0x8077, 0x09EC, 0x8079, 0x1851, 0x807B, 0x47EA,
+ 0x807D, 0x1852, 0x807E, 0x0FDE, 0x807F, 0x1853, 0x8084, 0x1854,
+ 0x8085, 0x1856, 0x8086, 0x1855, 0x8087, 0x0D39, 0x8088, 0x4CF0,
+ 0x8089, 0x0CD1, 0x808B, 0x0FE4, 0x808C, 0x0D3D, 0x808E, 0x4CF1,
+ 0x8093, 0x1858, 0x8096, 0x09BB, 0x8098, 0x0D9C, 0x8099, 0x47EB,
+ 0x809A, 0x1859, 0x809B, 0x1857, 0x809C, 0x47EC, 0x809D, 0x060A,
+ 0x809E, 0x3AAD, 0x80A1, 0x0788, 0x80A2, 0x08B6, 0x80A4, 0x47ED,
+ 0x80A5, 0x0D82, 0x80A6, 0x3AAE, 0x80A7, 0x47EE, 0x80A9, 0x075E,
+ 0x80AA, 0x0E71, 0x80AB, 0x3AAF, 0x80AC, 0x185C, 0x80AD, 0x185A,
+ 0x80AF, 0x07E0, 0x80B1, 0x07E1, 0x80B2, 0x04AD, 0x80B4, 0x0858,
+ 0x80B8, 0x47EF, 0x80BA, 0x0D0F, 0x80C3, 0x04A3, 0x80C4, 0x1861,
+ 0x80C5, 0x47F1, 0x80C6, 0x0B7E, 0x80CA, 0x429A, 0x80CC, 0x0D0E,
+ 0x80CE, 0x0B3B, 0x80CF, 0x4CF2, 0x80D4, 0x4CF3, 0x80D5, 0x47F2,
+ 0x80D6, 0x1863, 0x80D7, 0x3AB0, 0x80D8, 0x3AB1, 0x80D9, 0x185F,
+ 0x80DA, 0x1862, 0x80DB, 0x185D, 0x80DD, 0x1860, 0x80DE, 0x0E54,
+ 0x80E0, 0x429B, 0x80E1, 0x0789, 0x80E4, 0x04C1, 0x80E5, 0x185E,
+ 0x80E6, 0x47F3, 0x80ED, 0x4CF4, 0x80EF, 0x1865, 0x80F0, 0x4CF5,
+ 0x80F1, 0x1866, 0x80F3, 0x429C, 0x80F4, 0x0C91, 0x80F5, 0x47F5,
+ 0x80F7, 0x4CF6, 0x80F8, 0x06B3, 0x80FA, 0x4CF7, 0x80FB, 0x47F6,
+ 0x80FC, 0x1871, 0x80FD, 0x0CF3, 0x80FE, 0x4CF8, 0x8102, 0x08B7,
+ 0x8103, 0x4CF9, 0x8105, 0x06B4, 0x8106, 0x0A6C, 0x8107, 0x0FEC,
+ 0x8108, 0x0EBA, 0x8109, 0x1864, 0x810A, 0x0A78, 0x810D, 0x47F4,
+ 0x8116, 0x3AB2, 0x8117, 0x4CFA, 0x8118, 0x3AB3, 0x811A, 0x066D,
+ 0x811B, 0x1867, 0x811E, 0x47F9, 0x8123, 0x1869, 0x8124, 0x47FB,
+ 0x8127, 0x47FC, 0x8129, 0x1868, 0x812B, 0x3659, 0x812C, 0x47FD,
+ 0x812F, 0x186A, 0x8130, 0x4CFB, 0x8131, 0x0B64, 0x8133, 0x0CF4,
+ 0x8135, 0x47F8, 0x8139, 0x0BCD, 0x813A, 0x3AB4, 0x813D, 0x47FF,
+ 0x813E, 0x186E, 0x8141, 0x3772, 0x8146, 0x186D, 0x814A, 0x3AB5,
+ 0x814B, 0x186B, 0x814C, 0x3AB6, 0x814E, 0x0A1B, 0x8150, 0x0DD7,
+ 0x8151, 0x1870, 0x8153, 0x186F, 0x8154, 0x07E2, 0x8155, 0x0FF9,
+ 0x8157, 0x4CFC, 0x815F, 0x1880, 0x8160, 0x429D, 0x8165, 0x1874,
+ 0x8166, 0x1875, 0x8167, 0x429E, 0x8168, 0x429F, 0x8169, 0x4801,
+ 0x816B, 0x091C, 0x816D, 0x42A0, 0x816E, 0x1873, 0x816F, 0x4CFD,
+ 0x8170, 0x080A, 0x8171, 0x1872, 0x8173, 0x4CFE, 0x8174, 0x1876,
+ 0x8178, 0x0BCE, 0x8179, 0x0DF2, 0x817A, 0x0AA5, 0x817F, 0x0B3C,
+ 0x8180, 0x187A, 0x8181, 0x3AB7, 0x8182, 0x187B, 0x8183, 0x1877,
+ 0x8184, 0x3AB8, 0x8185, 0x4804, 0x8188, 0x1878, 0x818A, 0x1879,
+ 0x818B, 0x4CFF, 0x818F, 0x07E3, 0x8190, 0x4D00, 0x8193, 0x1881,
+ 0x8195, 0x187D, 0x8198, 0x4806, 0x819A, 0x0DD8, 0x819B, 0x4D01,
+ 0x819C, 0x0E9A, 0x819D, 0x0D9A, 0x819E, 0x4D02, 0x81A0, 0x187C,
+ 0x81A3, 0x187F, 0x81A4, 0x187E, 0x81A8, 0x0E72, 0x81A9, 0x1882,
+ 0x81B0, 0x1883, 0x81B2, 0x4807, 0x81B3, 0x0AB9, 0x81B4, 0x3AB9,
+ 0x81B5, 0x1884, 0x81B8, 0x1886, 0x81BA, 0x188A, 0x81BB, 0x42A1,
+ 0x81BD, 0x1887, 0x81BE, 0x1885, 0x81BF, 0x0CF5, 0x81C0, 0x1888,
+ 0x81C1, 0x4808, 0x81C2, 0x1889, 0x81C3, 0x4809, 0x81C6, 0x0532,
+ 0x81C8, 0x1890, 0x81C9, 0x188B, 0x81CA, 0x42A2, 0x81CB, 0x4D03,
+ 0x81CD, 0x188C, 0x81CF, 0x3ABA, 0x81D1, 0x188D, 0x81D3, 0x0B01,
+ 0x81D5, 0x4D04, 0x81D6, 0x480A, 0x81D7, 0x42A3, 0x81D8, 0x188F,
+ 0x81D9, 0x188E, 0x81DA, 0x1891, 0x81DB, 0x480B, 0x81DD, 0x4D05,
+ 0x81DE, 0x4D06, 0x81DF, 0x1892, 0x81E0, 0x1893, 0x81E1, 0x4D07,
+ 0x81E3, 0x0A09, 0x81E4, 0x480D, 0x81E5, 0x0569, 0x81E7, 0x1894,
+ 0x81E8, 0x0F9F, 0x81EA, 0x08D7, 0x81EC, 0x480F, 0x81ED, 0x0937,
+ 0x81EF, 0x4D08, 0x81F3, 0x08B8, 0x81F4, 0x0B95, 0x81F6, 0x4D09,
+ 0x81F9, 0x3ABB, 0x81FA, 0x1895, 0x81FB, 0x1896, 0x81FC, 0x04D3,
+ 0x81FD, 0x4810, 0x81FE, 0x1897, 0x81FF, 0x4811, 0x8200, 0x4D0A,
+ 0x8201, 0x1898, 0x8202, 0x1899, 0x8203, 0x3ABC, 0x8204, 0x4813,
+ 0x8205, 0x189A, 0x8207, 0x189B, 0x8208, 0x06B5, 0x8209, 0x13AF,
+ 0x820A, 0x189C, 0x820B, 0x4D0B, 0x820C, 0x0A89, 0x820D, 0x189D,
+ 0x820E, 0x08F7, 0x8210, 0x189E, 0x8212, 0x1009, 0x8213, 0x4D0C,
+ 0x8214, 0x4D0D, 0x8216, 0x189F, 0x8217, 0x0E2E, 0x8218, 0x0618,
+ 0x8219, 0x4815, 0x821A, 0x4D0E, 0x821B, 0x0AA6, 0x821C, 0x0962,
+ 0x821E, 0x0DE3, 0x821F, 0x0938, 0x8221, 0x3ABD, 0x8222, 0x4816,
+ 0x8229, 0x18A0, 0x822A, 0x07E4, 0x822B, 0x18A1, 0x822C, 0x0D60,
+ 0x822E, 0x18AF, 0x8232, 0x3ABE, 0x8233, 0x18A3, 0x8234, 0x3ABF,
+ 0x8235, 0x0B29, 0x8236, 0x0D2B, 0x8237, 0x0773, 0x8238, 0x18A2,
+ 0x8239, 0x0AA7, 0x823A, 0x4D0F, 0x823C, 0x4818, 0x8240, 0x18A4,
+ 0x8244, 0x4D10, 0x8245, 0x481A, 0x8246, 0x3AC0, 0x8247, 0x0C16,
+ 0x8249, 0x4819, 0x824B, 0x3AC1, 0x824F, 0x3AC2, 0x8257, 0x481E,
+ 0x8258, 0x18A6, 0x8259, 0x18A5, 0x825A, 0x18A8, 0x825C, 0x4820,
+ 0x825D, 0x18A7, 0x825F, 0x18A9, 0x8260, 0x42A5, 0x8262, 0x18AB,
+ 0x8263, 0x4821, 0x8264, 0x18AA, 0x8266, 0x060B, 0x8268, 0x18AC,
+ 0x826A, 0x18AD, 0x826B, 0x18AE, 0x826D, 0x4D11, 0x826E, 0x0821,
+ 0x826F, 0x0F91, 0x8271, 0x18B0, 0x8272, 0x09ED, 0x8274, 0x42A6,
+ 0x8276, 0x0512, 0x8277, 0x18B1, 0x8278, 0x18B2, 0x8279, 0x3775,
+ 0x827D, 0x4824, 0x827E, 0x18B3, 0x827F, 0x4825, 0x8283, 0x4826,
+ 0x8284, 0x4D12, 0x8289, 0x4D13, 0x828A, 0x4827, 0x828B, 0x04B6,
+ 0x828D, 0x18B4, 0x828E, 0x3AC3, 0x8291, 0x4D14, 0x8292, 0x18B5,
+ 0x8293, 0x4828, 0x8299, 0x0DD9, 0x829D, 0x08F3, 0x829F, 0x18B7,
+ 0x82A1, 0x42A8, 0x82A3, 0x42A9, 0x82A4, 0x42AA, 0x82A5, 0x0587,
+ 0x82A6, 0x0476, 0x82A7, 0x4829, 0x82A8, 0x482A, 0x82A9, 0x42AB,
+ 0x82AA, 0x4D15, 0x82AB, 0x18B6, 0x82AC, 0x18B9, 0x82AD, 0x0D04,
+ 0x82AE, 0x3AC4, 0x82AF, 0x0A0A, 0x82B0, 0x4D16, 0x82B1, 0x0556,
+ 0x82B2, 0x482B, 0x82B3, 0x0E55, 0x82B4, 0x482C, 0x82B7, 0x3AC5,
+ 0x82B8, 0x0733, 0x82B9, 0x06D4, 0x82BA, 0x482D, 0x82BB, 0x18B8,
+ 0x82BC, 0x482E, 0x82BD, 0x056A, 0x82BE, 0x3AC6, 0x82BF, 0x42AC,
+ 0x82C5, 0x05DF, 0x82C6, 0x3AC7, 0x82D0, 0x4D17, 0x82D1, 0x0513,
+ 0x82D2, 0x18BD, 0x82D3, 0x0FB2, 0x82D4, 0x0B3D, 0x82D5, 0x42AD,
+ 0x82D7, 0x0DB6, 0x82D9, 0x18C9, 0x82DB, 0x0557, 0x82DC, 0x18C7,
+ 0x82DE, 0x18C5, 0x82DF, 0x18BC, 0x82E1, 0x18BA, 0x82E2, 0x482F,
+ 0x82E3, 0x18BB, 0x82E5, 0x090F, 0x82E6, 0x06E4, 0x82E7, 0x0BB5,
+ 0x82E8, 0x4830, 0x82EA, 0x4D18, 0x82EB, 0x0CA9, 0x82EF, 0x4D19,
+ 0x82F1, 0x04F3, 0x82F3, 0x18BF, 0x82F4, 0x18BE, 0x82F6, 0x4D1A,
+ 0x82F7, 0x4831, 0x82F9, 0x18C4, 0x82FA, 0x18C0, 0x82FB, 0x18C3,
+ 0x82FD, 0x42AE, 0x82FE, 0x3AC8, 0x8300, 0x42AF, 0x8301, 0x2198,
+ 0x8302, 0x0EDC, 0x8303, 0x18C2, 0x8304, 0x0558, 0x8305, 0x05DB,
+ 0x8306, 0x18C6, 0x8307, 0x4832, 0x8308, 0x4833, 0x8309, 0x18C8,
+ 0x830C, 0x4834, 0x830E, 0x072A, 0x8316, 0x18CC, 0x8317, 0x18D5,
+ 0x8318, 0x18D6, 0x831B, 0x4836, 0x831C, 0x046F, 0x831D, 0x4837,
+ 0x8322, 0x42B0, 0x8323, 0x18DD, 0x8328, 0x04B5, 0x832B, 0x18D4,
+ 0x832D, 0x42B1, 0x832F, 0x18D3, 0x8330, 0x4838, 0x8331, 0x18CE,
+ 0x8332, 0x18CD, 0x8334, 0x18CB, 0x8335, 0x18CA, 0x8336, 0x0BA1,
+ 0x8338, 0x0B5B, 0x8339, 0x18D0, 0x833A, 0x42B2, 0x833C, 0x4839,
+ 0x8340, 0x18CF, 0x8343, 0x3AC9, 0x8344, 0x483A, 0x8345, 0x18D2,
+ 0x8346, 0x1DF8, 0x8347, 0x42B3, 0x8349, 0x0AF2, 0x834A, 0x072B,
+ 0x834F, 0x04E3, 0x8350, 0x18D1, 0x8351, 0x3ACA, 0x8352, 0x07E5,
+ 0x8354, 0x4835, 0x8355, 0x3ACB, 0x8356, 0x4D1B, 0x8357, 0x483B,
+ 0x8358, 0x0AF3, 0x835A, 0x377A, 0x8362, 0x2199, 0x8363, 0x456F,
+ 0x8373, 0x18E3, 0x8375, 0x18E4, 0x8377, 0x0559, 0x8378, 0x4D1C,
+ 0x837B, 0x052E, 0x837C, 0x18E1, 0x837D, 0x42B4, 0x837F, 0x219A,
+ 0x8385, 0x18D7, 0x8386, 0x3ACC, 0x8387, 0x18DF, 0x8389, 0x18E6,
+ 0x838A, 0x18E0, 0x838D, 0x3ACD, 0x838E, 0x18DE, 0x8392, 0x3ACE,
+ 0x8393, 0x18C1, 0x8394, 0x483F, 0x8395, 0x4840, 0x8396, 0x18DC,
+ 0x8398, 0x3ACF, 0x839A, 0x18D8, 0x839B, 0x4841, 0x839D, 0x4842,
+ 0x839E, 0x060C, 0x839F, 0x18DA, 0x83A0, 0x18E5, 0x83A2, 0x18DB,
+ 0x83A7, 0x42B5, 0x83A8, 0x18E7, 0x83A9, 0x3AD0, 0x83AA, 0x18D9,
+ 0x83AB, 0x0D32, 0x83B1, 0x0F53, 0x83B5, 0x18E2, 0x83BD, 0x18F8,
+ 0x83BF, 0x3AD1, 0x83C0, 0x3AD2, 0x83C1, 0x18F0, 0x83C5, 0x0A41,
+ 0x83C7, 0x219B, 0x83C9, 0x4843, 0x83CA, 0x0660, 0x83CC, 0x06D5,
+ 0x83CE, 0x18EB, 0x83CF, 0x42B6, 0x83D0, 0x4844, 0x83D1, 0x42B7,
+ 0x83D3, 0x055B, 0x83D4, 0x4845, 0x83D6, 0x09BC, 0x83D8, 0x18EE,
+ 0x83DC, 0x084A, 0x83DD, 0x4846, 0x83DF, 0x0C4B, 0x83E0, 0x18F3,
+ 0x83E1, 0x42B8, 0x83E5, 0x4847, 0x83E9, 0x0E3E, 0x83EA, 0x3AD3,
+ 0x83EB, 0x18EA, 0x83EF, 0x055A, 0x83F0, 0x078A, 0x83F1, 0x0D9B,
+ 0x83F2, 0x18F4, 0x83F4, 0x18E8, 0x83F6, 0x219C, 0x83F7, 0x18F1,
+ 0x83F8, 0x4D1D, 0x83F9, 0x4848, 0x83FB, 0x18FB, 0x83FC, 0x4D1E,
+ 0x83FD, 0x18EC, 0x8401, 0x42B9, 0x8403, 0x18ED, 0x8404, 0x0C92,
+ 0x8406, 0x42BA, 0x8407, 0x18F2, 0x840A, 0x1E7F, 0x840B, 0x18EF,
+ 0x840C, 0x0E56, 0x840D, 0x18F5, 0x840E, 0x04A4, 0x840F, 0x3AD4,
+ 0x8411, 0x3AD5, 0x8413, 0x18E9, 0x8415, 0x4849, 0x8417, 0x484B,
+ 0x8420, 0x18F7, 0x8422, 0x18F6, 0x8429, 0x0D21, 0x842A, 0x18FD,
+ 0x842C, 0x1908, 0x8431, 0x05DC, 0x8435, 0x190B, 0x8438, 0x18F9,
+ 0x8439, 0x484C, 0x843C, 0x18FE, 0x843D, 0x0F58, 0x8446, 0x1907,
+ 0x8448, 0x219D, 0x8449, 0x0F3F, 0x844A, 0x3AD6, 0x844E, 0x0F72,
+ 0x844F, 0x484D, 0x8451, 0x484E, 0x8452, 0x484F, 0x8457, 0x0BB6,
+ 0x8458, 0x4D1F, 0x8459, 0x4850, 0x845A, 0x4851, 0x845B, 0x05C9,
+ 0x845C, 0x4852, 0x845F, 0x42BB, 0x8461, 0x0DE4, 0x8462, 0x190D,
+ 0x8463, 0x0C79, 0x8465, 0x4854, 0x8466, 0x0475, 0x8469, 0x1906,
+ 0x846B, 0x1902, 0x846C, 0x0AF4, 0x846D, 0x18FC, 0x846E, 0x1904,
+ 0x846F, 0x1909, 0x8470, 0x42BC, 0x8471, 0x0CE2, 0x8473, 0x42BD,
+ 0x8475, 0x046E, 0x8476, 0x3AD7, 0x8477, 0x1901, 0x8478, 0x4855,
+ 0x8479, 0x190A, 0x847A, 0x0DEA, 0x847C, 0x4856, 0x8481, 0x4857,
+ 0x8482, 0x1905, 0x8484, 0x1900, 0x8485, 0x42BE, 0x848B, 0x09BD,
+ 0x8490, 0x0939, 0x8493, 0x4D20, 0x8494, 0x08D8, 0x8497, 0x4859,
+ 0x8499, 0x0EE4, 0x849C, 0x0DB9, 0x849E, 0x42BF, 0x849F, 0x1910,
+ 0x84A1, 0x1919, 0x84A6, 0x485A, 0x84A8, 0x3AD8, 0x84AD, 0x1903,
+ 0x84AF, 0x3AD9, 0x84B1, 0x4D21, 0x84B2, 0x05D5, 0x84B4, 0x219E,
+ 0x84B8, 0x09E0, 0x84B9, 0x190E, 0x84BA, 0x42C0, 0x84BB, 0x1913,
+ 0x84BC, 0x0AF5, 0x84BD, 0x4D22, 0x84BE, 0x485B, 0x84BF, 0x190F,
+ 0x84C0, 0x3ADA, 0x84C1, 0x1916, 0x84C2, 0x3ADB, 0x84C4, 0x0B9D,
+ 0x84C6, 0x1917, 0x84C9, 0x0F40, 0x84CA, 0x190C, 0x84CB, 0x0596,
+ 0x84CD, 0x1912, 0x84CE, 0x485D, 0x84CF, 0x485E, 0x84D0, 0x1915,
+ 0x84D1, 0x0EB8, 0x84D3, 0x485F, 0x84D6, 0x1918, 0x84D9, 0x1911,
+ 0x84DA, 0x1914, 0x84DC, 0x20AB, 0x84E7, 0x4861, 0x84EA, 0x4862,
+ 0x84EC, 0x0E57, 0x84EE, 0x0FC7, 0x84EF, 0x4863, 0x84F0, 0x3ADC,
+ 0x84F1, 0x4864, 0x84F4, 0x191C, 0x84FA, 0x4865, 0x84FB, 0x4D23,
+ 0x84FC, 0x1923, 0x84FD, 0x3ADD, 0x84FF, 0x191B, 0x8500, 0x08EF,
+ 0x8506, 0x18FA, 0x850C, 0x3ADE, 0x8511, 0x0E1E, 0x8513, 0x0EAE,
+ 0x8514, 0x1922, 0x8515, 0x1921, 0x8517, 0x191D, 0x8518, 0x191E,
+ 0x851A, 0x04D8, 0x851B, 0x4866, 0x851E, 0x42C3, 0x851F, 0x1920,
+ 0x8521, 0x191A, 0x8523, 0x1E1A, 0x8524, 0x4867, 0x8525, 0x4868,
+ 0x8526, 0x0BF1, 0x852B, 0x4869, 0x852C, 0x191F, 0x852D, 0x04C2,
+ 0x852F, 0x42C4, 0x8532, 0x42C2, 0x8534, 0x3ADF, 0x8535, 0x0B02,
+ 0x853D, 0x0E13, 0x853E, 0x1EB5, 0x8540, 0x1924, 0x8541, 0x1928,
+ 0x8543, 0x0D6D, 0x8546, 0x4D24, 0x8548, 0x1927, 0x8549, 0x09BE,
+ 0x854A, 0x08F5, 0x854B, 0x192A, 0x854E, 0x06B6, 0x854F, 0x486A,
+ 0x8551, 0x486D, 0x8553, 0x219F, 0x8555, 0x192B, 0x8556, 0x4D25,
+ 0x8557, 0x0DEB, 0x8558, 0x1926, 0x8559, 0x21A0, 0x855A, 0x18FF,
+ 0x855D, 0x4D26, 0x855E, 0x3AE0, 0x8561, 0x486E, 0x8562, 0x486F,
+ 0x8563, 0x1925, 0x8564, 0x42C5, 0x8568, 0x0FF5, 0x8569, 0x0C7A,
+ 0x856A, 0x0DE5, 0x856B, 0x21A1, 0x856D, 0x1932, 0x856F, 0x486B,
+ 0x8577, 0x1938, 0x857A, 0x42C6, 0x857B, 0x4871, 0x857D, 0x4872,
+ 0x857E, 0x1939, 0x857F, 0x4873, 0x8580, 0x192C, 0x8581, 0x4874,
+ 0x8584, 0x0D2C, 0x8585, 0x4D27, 0x8586, 0x4875, 0x8587, 0x1936,
+ 0x8588, 0x192E, 0x858A, 0x1930, 0x858C, 0x42C7, 0x858F, 0x3AE1,
+ 0x8590, 0x193A, 0x8591, 0x192F, 0x8593, 0x4876, 0x8594, 0x1933,
+ 0x8597, 0x0514, 0x8598, 0x4D28, 0x8599, 0x0CBD, 0x859B, 0x1934,
+ 0x859C, 0x1937, 0x859D, 0x4877, 0x859F, 0x4878, 0x85A2, 0x42C8,
+ 0x85A4, 0x192D, 0x85A6, 0x0AA8, 0x85A8, 0x1931, 0x85A9, 0x0875,
+ 0x85AA, 0x0A0B, 0x85AB, 0x0706, 0x85AC, 0x0F00, 0x85AD, 0x3AE4,
+ 0x85AE, 0x0F05, 0x85AF, 0x097C, 0x85B0, 0x21A3, 0x85B7, 0x3AE2,
+ 0x85B9, 0x193E, 0x85BA, 0x193C, 0x85BC, 0x487C, 0x85C1, 0x0FF4,
+ 0x85C7, 0x487D, 0x85C9, 0x193B, 0x85CA, 0x487E, 0x85CB, 0x42C9,
+ 0x85CD, 0x0F5F, 0x85CE, 0x3AE3, 0x85CF, 0x193D, 0x85D0, 0x193F,
+ 0x85D5, 0x1940, 0x85D8, 0x487F, 0x85D9, 0x4880, 0x85DC, 0x1943,
+ 0x85DD, 0x1941, 0x85DF, 0x4881, 0x85E1, 0x4882, 0x85E4, 0x0C7B,
+ 0x85E5, 0x1942, 0x85E6, 0x4883, 0x85E9, 0x0D61, 0x85EA, 0x1935,
+ 0x85ED, 0x42CA, 0x85F4, 0x3780, 0x85F6, 0x4884, 0x85F7, 0x097D,
+ 0x85F9, 0x1944, 0x85FA, 0x1949, 0x85FB, 0x0AF6, 0x85FE, 0x1948,
+ 0x85FF, 0x42CB, 0x8600, 0x4885, 0x8602, 0x1929, 0x8604, 0x42CC,
+ 0x8605, 0x42CD, 0x8606, 0x194A, 0x8607, 0x0ACB, 0x860A, 0x1945,
+ 0x860B, 0x1947, 0x8610, 0x42CE, 0x8611, 0x4886, 0x8612, 0x3AE5,
+ 0x8613, 0x1946, 0x8616, 0x14D0, 0x8617, 0x14C1, 0x8618, 0x42D0,
+ 0x861A, 0x194C, 0x861E, 0x4887, 0x8621, 0x4888, 0x8622, 0x194B,
+ 0x8624, 0x4889, 0x8627, 0x488A, 0x8629, 0x3AE6, 0x862D, 0x0F60,
+ 0x862F, 0x16B1, 0x8630, 0x194D, 0x8638, 0x42D1, 0x8639, 0x488C,
+ 0x863C, 0x488D, 0x863F, 0x194E, 0x8640, 0x488F, 0x8641, 0x41B8,
+ 0x8642, 0x4D29, 0x8646, 0x4D2A, 0x864D, 0x194F, 0x864E, 0x078B,
+ 0x8650, 0x066E, 0x8652, 0x3AE7, 0x8653, 0x4890, 0x8654, 0x1951,
+ 0x8655, 0x1094, 0x8656, 0x4891, 0x8657, 0x42D2, 0x865A, 0x068F,
+ 0x865B, 0x3418, 0x865C, 0x0F82, 0x865E, 0x06EB, 0x865F, 0x1952,
+ 0x8662, 0x42D3, 0x8663, 0x3AE8, 0x8667, 0x1953, 0x866B, 0x0BAC,
+ 0x866C, 0x3AE9, 0x866F, 0x3AEA, 0x8671, 0x1954, 0x8675, 0x42D5,
+ 0x8677, 0x4892, 0x8679, 0x0CD2, 0x867A, 0x3AEB, 0x867B, 0x047E,
+ 0x867D, 0x3786, 0x8687, 0x4893, 0x8689, 0x4894, 0x868A, 0x0563,
+ 0x868B, 0x1959, 0x868C, 0x195A, 0x868D, 0x3AEC, 0x8691, 0x3AED,
+ 0x8693, 0x1955, 0x8695, 0x088B, 0x8698, 0x3AEE, 0x869C, 0x4895,
+ 0x869D, 0x4896, 0x86A3, 0x1956, 0x86A4, 0x0CF8, 0x86A7, 0x3AEF,
+ 0x86A8, 0x3AF0, 0x86A9, 0x1957, 0x86AA, 0x1958, 0x86AB, 0x1962,
+ 0x86AF, 0x195C, 0x86B0, 0x195F, 0x86B1, 0x4897, 0x86B3, 0x4898,
+ 0x86B6, 0x195B, 0x86B8, 0x42D6, 0x86C0, 0x4D2B, 0x86C1, 0x4899,
+ 0x86C3, 0x489A, 0x86C4, 0x195D, 0x86C6, 0x195E, 0x86C7, 0x0904,
+ 0x86C9, 0x1960, 0x86CB, 0x0B7F, 0x86CD, 0x072C, 0x86CE, 0x05A0,
+ 0x86D1, 0x489B, 0x86D4, 0x1963, 0x86D5, 0x489C, 0x86D7, 0x489D,
+ 0x86D9, 0x059D, 0x86DB, 0x1968, 0x86DE, 0x1964, 0x86DF, 0x1967,
+ 0x86E3, 0x489E, 0x86E4, 0x0D4E, 0x86E6, 0x489F, 0x86E9, 0x1965,
+ 0x86EC, 0x1966, 0x86ED, 0x0DBA, 0x86EE, 0x0D6E, 0x86EF, 0x1969,
+ 0x86F8, 0x0B5D, 0x86F9, 0x1973, 0x86FA, 0x3AF1, 0x86FB, 0x196F,
+ 0x86FC, 0x42D7, 0x86FD, 0x3AF2, 0x86FE, 0x056B, 0x8700, 0x196D,
+ 0x8702, 0x0E58, 0x8703, 0x196E, 0x8705, 0x48A1, 0x8706, 0x196B,
+ 0x8707, 0x48A2, 0x8708, 0x196C, 0x8709, 0x1971, 0x870A, 0x1974,
+ 0x870B, 0x3AF3, 0x870D, 0x1972, 0x870E, 0x48A3, 0x8710, 0x48A4,
+ 0x8711, 0x1970, 0x8712, 0x196A, 0x8713, 0x3AF4, 0x8714, 0x4D2C,
+ 0x8718, 0x0B96, 0x8719, 0x3AF5, 0x871A, 0x197B, 0x871C, 0x0EB6,
+ 0x871E, 0x3AF6, 0x871F, 0x48A5, 0x8721, 0x48A6, 0x8722, 0x4D2D,
+ 0x8723, 0x48A7, 0x8725, 0x1979, 0x8728, 0x3AF7, 0x8729, 0x197A,
+ 0x872E, 0x4D2E, 0x8731, 0x48A8, 0x8734, 0x1975, 0x8737, 0x1977,
+ 0x8739, 0x4D2F, 0x873A, 0x48A9, 0x873B, 0x1978, 0x873E, 0x3AF8,
+ 0x873F, 0x1976, 0x8740, 0x48AA, 0x8743, 0x48AB, 0x8749, 0x0A8A,
+ 0x874B, 0x0FDF, 0x874C, 0x197F, 0x874E, 0x1980, 0x8751, 0x48AC,
+ 0x8753, 0x1986, 0x8755, 0x09F0, 0x8757, 0x1982, 0x8758, 0x48AD,
+ 0x8759, 0x1985, 0x875D, 0x4D30, 0x875F, 0x197D, 0x8760, 0x197C,
+ 0x8763, 0x1987, 0x8764, 0x48AE, 0x8765, 0x48AF, 0x8766, 0x055C,
+ 0x8768, 0x1983, 0x876A, 0x1988, 0x876E, 0x1984, 0x8771, 0x3AF9,
+ 0x8772, 0x48B0, 0x8774, 0x1981, 0x8776, 0x0BCF, 0x8778, 0x197E,
+ 0x877B, 0x4D31, 0x877C, 0x48B1, 0x877F, 0x0D1E, 0x8782, 0x198C,
+ 0x8787, 0x42D8, 0x8788, 0x3AFA, 0x8789, 0x48B5, 0x878B, 0x48B6,
+ 0x878C, 0x4D32, 0x878D, 0x0F25, 0x878E, 0x4D33, 0x8793, 0x48B7,
+ 0x8797, 0x4D34, 0x8798, 0x4D35, 0x8799, 0x3AFB, 0x879E, 0x4D36,
+ 0x879F, 0x198B, 0x87A0, 0x48B8, 0x87A2, 0x198A, 0x87A3, 0x4D37,
+ 0x87A7, 0x48B4, 0x87AB, 0x1993, 0x87AC, 0x3AFC, 0x87AD, 0x3AFD,
+ 0x87AE, 0x4D38, 0x87AF, 0x198D, 0x87B3, 0x1995, 0x87B5, 0x3AFE,
+ 0x87BA, 0x0F50, 0x87BB, 0x1998, 0x87BD, 0x198F, 0x87BE, 0x48BB,
+ 0x87BF, 0x4D39, 0x87C0, 0x1990, 0x87C1, 0x48BD, 0x87C4, 0x1994,
+ 0x87C6, 0x1997, 0x87C7, 0x1996, 0x87C9, 0x4D3A, 0x87CB, 0x198E,
+ 0x87CE, 0x48BE, 0x87D0, 0x1991, 0x87D2, 0x19A2, 0x87D6, 0x3AFF,
+ 0x87DA, 0x4D3B, 0x87DF, 0x48BF, 0x87E0, 0x199B, 0x87E3, 0x48C1,
+ 0x87E5, 0x48C2, 0x87E6, 0x48C3, 0x87EA, 0x48C4, 0x87EB, 0x3B00,
+ 0x87EC, 0x1E23, 0x87ED, 0x3B01, 0x87EF, 0x1999, 0x87F2, 0x199A,
+ 0x87F5, 0x3C3D, 0x87F6, 0x199F, 0x87F7, 0x19A0, 0x87F9, 0x0588,
+ 0x87FB, 0x065C, 0x87FE, 0x199E, 0x8801, 0x3B02, 0x8803, 0x4F58,
+ 0x8805, 0x1989, 0x8806, 0x3B04, 0x8807, 0x21A6, 0x880A, 0x42DA,
+ 0x880B, 0x3B05, 0x880D, 0x199D, 0x880E, 0x19A1, 0x880F, 0x199C,
+ 0x8810, 0x42DB, 0x8811, 0x19A3, 0x8813, 0x48C5, 0x8814, 0x3B06,
+ 0x8815, 0x19A5, 0x8816, 0x19A4, 0x8818, 0x4D3C, 0x881B, 0x4D3D,
+ 0x881C, 0x3B07, 0x881F, 0x1E85, 0x8821, 0x19A7, 0x8822, 0x19A6,
+ 0x8823, 0x1961, 0x8827, 0x19AB, 0x8828, 0x48C6, 0x882D, 0x4D3E,
+ 0x882E, 0x48C7, 0x8831, 0x19A8, 0x8832, 0x48C8, 0x8836, 0x19A9,
+ 0x8839, 0x19AA, 0x883A, 0x4D3F, 0x883B, 0x19AC, 0x883C, 0x48C9,
+ 0x8840, 0x0742, 0x8842, 0x19AE, 0x8844, 0x19AD, 0x8845, 0x4D40,
+ 0x8846, 0x093A, 0x884A, 0x48CB, 0x884B, 0x4D41, 0x884C, 0x07E6,
+ 0x884D, 0x1524, 0x884E, 0x4D42, 0x8852, 0x19AF, 0x8853, 0x095B,
+ 0x8855, 0x4D43, 0x8856, 0x3B08, 0x8857, 0x0597, 0x8858, 0x48CC,
+ 0x8859, 0x19B0, 0x885A, 0x4D44, 0x885B, 0x04F4, 0x885D, 0x09BF,
+ 0x885E, 0x19B1, 0x885F, 0x3B09, 0x8861, 0x07E7, 0x8862, 0x19B2,
+ 0x8863, 0x04A5, 0x8864, 0x3B0A, 0x8868, 0x0DAF, 0x8869, 0x48CF,
+ 0x886B, 0x19B3, 0x886E, 0x4D45, 0x886F, 0x48D1, 0x8870, 0x0A30,
+ 0x8872, 0x19BA, 0x8875, 0x19B7, 0x8877, 0x0BAD, 0x887D, 0x19B8,
+ 0x887E, 0x19B5, 0x887F, 0x06D6, 0x8881, 0x19B4, 0x8882, 0x19BB,
+ 0x8888, 0x070C, 0x888B, 0x0B3E, 0x888D, 0x19C1, 0x8892, 0x19BD,
+ 0x8896, 0x0B15, 0x8897, 0x19BC, 0x8898, 0x3B0B, 0x8899, 0x19BF,
+ 0x889A, 0x4D46, 0x889B, 0x4D47, 0x889C, 0x4D48, 0x889E, 0x19B6,
+ 0x88A0, 0x48D2, 0x88A2, 0x19C0, 0x88A4, 0x19C2, 0x88AA, 0x3B0C,
+ 0x88AB, 0x0D83, 0x88AE, 0x19BE, 0x88B0, 0x19C3, 0x88B1, 0x19C5,
+ 0x88B4, 0x0787, 0x88B5, 0x19B9, 0x88B7, 0x0485, 0x88BC, 0x48D3,
+ 0x88BD, 0x3B0D, 0x88BE, 0x3B0E, 0x88BF, 0x19C4, 0x88C0, 0x48D4,
+ 0x88C1, 0x084B, 0x88C2, 0x0FBE, 0x88C3, 0x19C6, 0x88C4, 0x19C7,
+ 0x88C5, 0x0AF7, 0x88C6, 0x3789, 0x88CA, 0x3B0F, 0x88CD, 0x4D49,
+ 0x88CE, 0x42DC, 0x88CF, 0x0F6A, 0x88D1, 0x48D6, 0x88D2, 0x3B10,
+ 0x88D3, 0x48D7, 0x88D4, 0x19C8, 0x88D5, 0x0F1F, 0x88D8, 0x19C9,
+ 0x88D9, 0x19CA, 0x88DB, 0x3B11, 0x88DC, 0x0E34, 0x88DD, 0x19CB,
+ 0x88DF, 0x0830, 0x88E0, 0x4D4A, 0x88E1, 0x0F6B, 0x88E8, 0x19D0,
+ 0x88EF, 0x4D4B, 0x88F0, 0x3B12, 0x88F1, 0x3B13, 0x88F2, 0x19D1,
+ 0x88F3, 0x09C0, 0x88F4, 0x19CF, 0x88F5, 0x21A7, 0x88F8, 0x0F51,
+ 0x88F9, 0x19CC, 0x88FC, 0x19CE, 0x88FD, 0x0A61, 0x88FE, 0x0A44,
+ 0x8901, 0x48D9, 0x8902, 0x19CD, 0x8904, 0x19D2, 0x8906, 0x3B14,
+ 0x8907, 0x0DF3, 0x890A, 0x19D4, 0x890C, 0x19D3, 0x890E, 0x4D4C,
+ 0x890F, 0x4D4D, 0x8910, 0x05CA, 0x8912, 0x0E59, 0x8913, 0x19D5,
+ 0x8918, 0x3B15, 0x8919, 0x3B16, 0x891A, 0x3B17, 0x891C, 0x20A8,
+ 0x891D, 0x19E1, 0x891E, 0x19D7, 0x8925, 0x19D8, 0x8926, 0x4D4E,
+ 0x8927, 0x3B18, 0x892A, 0x19D9, 0x892B, 0x19DA, 0x8930, 0x3B19,
+ 0x8932, 0x42DE, 0x8935, 0x4D4F, 0x8936, 0x19DE, 0x8937, 0x48DB,
+ 0x8938, 0x19DF, 0x8939, 0x42DF, 0x893B, 0x19DD, 0x893E, 0x3B1A,
+ 0x8940, 0x42E0, 0x8941, 0x19DB, 0x8942, 0x48DD, 0x8943, 0x19D6,
+ 0x8944, 0x19DC, 0x8945, 0x48DE, 0x8949, 0x48DF, 0x894C, 0x19E0,
+ 0x894D, 0x1BD0, 0x8956, 0x0528, 0x895A, 0x4D50, 0x895C, 0x4D51,
+ 0x895E, 0x19E3, 0x895F, 0x06D7, 0x8960, 0x19E2, 0x8962, 0x48E1,
+ 0x8964, 0x19E5, 0x8966, 0x19E4, 0x896A, 0x19E7, 0x896B, 0x4D52,
+ 0x896D, 0x19E6, 0x896F, 0x19E8, 0x8970, 0x4D53, 0x8972, 0x093B,
+ 0x8974, 0x19E9, 0x8977, 0x19EA, 0x897B, 0x3B1B, 0x897C, 0x4D54,
+ 0x897E, 0x19EB, 0x897F, 0x0A62, 0x8980, 0x362E, 0x8981, 0x0F41,
+ 0x8983, 0x19EC, 0x8986, 0x0DF4, 0x8987, 0x0CFC, 0x8988, 0x19ED,
+ 0x8989, 0x48E2, 0x898A, 0x19EE, 0x898B, 0x075F, 0x898F, 0x0646,
+ 0x8990, 0x48E3, 0x8993, 0x19EF, 0x8994, 0x42E1, 0x8996, 0x08B9,
+ 0x8997, 0x0CF7, 0x8998, 0x19F0, 0x899A, 0x05AE, 0x899F, 0x48E4,
+ 0x89A1, 0x19F1, 0x89A5, 0x4D55, 0x89A6, 0x19F3, 0x89A7, 0x0F61,
+ 0x89A9, 0x19F2, 0x89AA, 0x0A0C, 0x89AC, 0x19F4, 0x89AF, 0x19F5,
+ 0x89B0, 0x48E5, 0x89B2, 0x19F6, 0x89B3, 0x060D, 0x89B5, 0x4D56,
+ 0x89B7, 0x48E6, 0x89BA, 0x19F7, 0x89BC, 0x4D57, 0x89BD, 0x19F8,
+ 0x89BF, 0x19F9, 0x89C0, 0x19FA, 0x89D2, 0x05AF, 0x89D4, 0x3B1C,
+ 0x89D5, 0x4D58, 0x89D6, 0x3B1D, 0x89D8, 0x48E7, 0x89DA, 0x19FB,
+ 0x89DC, 0x19FC, 0x89DD, 0x19FD, 0x89E3, 0x0572, 0x89E5, 0x3B1E,
+ 0x89E6, 0x09EE, 0x89E7, 0x19FE, 0x89EB, 0x48E8, 0x89F1, 0x3B1F,
+ 0x89F3, 0x48EA, 0x89F4, 0x19FF, 0x89F6, 0x42E2, 0x89F8, 0x1A00,
+ 0x89FD, 0x48EB, 0x89FF, 0x48EC, 0x8A00, 0x0774, 0x8A01, 0x35BC,
+ 0x8A02, 0x0C17, 0x8A03, 0x1A01, 0x8A07, 0x3B20, 0x8A08, 0x072D,
+ 0x8A0A, 0x0A1C, 0x8A0C, 0x1A04, 0x8A0E, 0x0C7C, 0x8A0F, 0x3B21,
+ 0x8A10, 0x1A03, 0x8A11, 0x48EE, 0x8A12, 0x21A8, 0x8A13, 0x0707,
+ 0x8A14, 0x48EF, 0x8A15, 0x3B22, 0x8A16, 0x1A02, 0x8A17, 0x0B57,
+ 0x8A18, 0x0647, 0x8A1B, 0x1A05, 0x8A1D, 0x1A06, 0x8A1F, 0x09C1,
+ 0x8A21, 0x48F1, 0x8A22, 0x3B23, 0x8A23, 0x0743, 0x8A25, 0x1A07,
+ 0x8A2A, 0x0E5A, 0x8A2D, 0x0A83, 0x8A31, 0x0690, 0x8A33, 0x0F01,
+ 0x8A34, 0x0ACC, 0x8A35, 0x48F2, 0x8A36, 0x1A08, 0x8A37, 0x21A9,
+ 0x8A3A, 0x0A0D, 0x8A3B, 0x0BAE, 0x8A3C, 0x09C2, 0x8A3E, 0x48F3,
+ 0x8A41, 0x1A09, 0x8A45, 0x48F4, 0x8A46, 0x1A0C, 0x8A47, 0x42E3,
+ 0x8A48, 0x1A0D, 0x8A49, 0x4D59, 0x8A4D, 0x48F5, 0x8A4E, 0x3B24,
+ 0x8A50, 0x082E, 0x8A51, 0x0B22, 0x8A52, 0x1A0B, 0x8A54, 0x09C3,
+ 0x8A55, 0x0DB0, 0x8A57, 0x4D5A, 0x8A58, 0x48F6, 0x8A5B, 0x1A0A,
+ 0x8A5D, 0x42E4, 0x8A5E, 0x08BA, 0x8A60, 0x04F5, 0x8A61, 0x42E5,
+ 0x8A62, 0x1A11, 0x8A63, 0x072E, 0x8A66, 0x08BC, 0x8A67, 0x4D5B,
+ 0x8A69, 0x08BB, 0x8A6B, 0x0FF3, 0x8A6C, 0x1A10, 0x8A6D, 0x1A0F,
+ 0x8A6E, 0x0AA9, 0x8A70, 0x0667, 0x8A71, 0x0FE9, 0x8A72, 0x0598,
+ 0x8A73, 0x09C4, 0x8A75, 0x42E6, 0x8A79, 0x21AA, 0x8A7C, 0x1A0E,
+ 0x8A7E, 0x4D5C, 0x8A7F, 0x3B25, 0x8A82, 0x1A13, 0x8A84, 0x1A14,
+ 0x8A85, 0x1A12, 0x8A86, 0x4D5D, 0x8A87, 0x078C, 0x8A89, 0x0F2A,
+ 0x8A8C, 0x08BD, 0x8A8D, 0x0CDD, 0x8A90, 0x48F8, 0x8A91, 0x1A17,
+ 0x8A93, 0x0A64, 0x8A95, 0x0B80, 0x8A96, 0x4D5E, 0x8A98, 0x0F20,
+ 0x8A9A, 0x1A1A, 0x8A9E, 0x07A0, 0x8AA0, 0x0A63, 0x8AA1, 0x1A16,
+ 0x8AA3, 0x1A1B, 0x8AA4, 0x07A1, 0x8AA5, 0x1A18, 0x8AA6, 0x1A19,
+ 0x8AA7, 0x21AB, 0x8AA8, 0x1A15, 0x8AAA, 0x3638, 0x8AAC, 0x0A86,
+ 0x8AAD, 0x0CA1, 0x8AAE, 0x48F7, 0x8AB0, 0x0B6D, 0x8AB2, 0x055D,
+ 0x8AB6, 0x4D5F, 0x8AB7, 0x48F9, 0x8AB9, 0x0D84, 0x8ABC, 0x065D,
+ 0x8ABE, 0x21AC, 0x8ABF, 0x0BD0, 0x8AC2, 0x1A1E, 0x8AC4, 0x1A1C,
+ 0x8AC7, 0x0B8A, 0x8AC9, 0x4D60, 0x8ACB, 0x0A65, 0x8ACC, 0x060E,
+ 0x8ACD, 0x1A1D, 0x8ACF, 0x0A21, 0x8AD0, 0x42E7, 0x8AD1, 0x4D61,
+ 0x8AD2, 0x0F92, 0x8AD6, 0x0FE6, 0x8AD7, 0x48FA, 0x8ADA, 0x1A1F,
+ 0x8ADB, 0x1A2A, 0x8ADC, 0x0BD1, 0x8ADD, 0x4D62, 0x8ADE, 0x1A29,
+ 0x8ADF, 0x21AD, 0x8AE0, 0x1A26, 0x8AE1, 0x1A2E, 0x8AE2, 0x1A27,
+ 0x8AE4, 0x1A23, 0x8AE6, 0x0C18, 0x8AE7, 0x1A22, 0x8AEB, 0x1A20,
+ 0x8AEC, 0x4D63, 0x8AED, 0x0F0B, 0x8AEE, 0x08BE, 0x8AF1, 0x1A24,
+ 0x8AF3, 0x1A21, 0x8AF4, 0x3B26, 0x8AF5, 0x4D64, 0x8AF6, 0x21AF,
+ 0x8AF7, 0x1A28, 0x8AF8, 0x097E, 0x8AFA, 0x0775, 0x8AFC, 0x48FB,
+ 0x8AFE, 0x0B5A, 0x8B00, 0x0E73, 0x8B01, 0x04FC, 0x8B02, 0x04A6,
+ 0x8B04, 0x0C7D, 0x8B05, 0x48FE, 0x8B06, 0x4D65, 0x8B07, 0x1A2C,
+ 0x8B0A, 0x48FD, 0x8B0C, 0x1A2B, 0x8B0D, 0x48FF, 0x8B0E, 0x0CBE,
+ 0x8B0F, 0x4D66, 0x8B10, 0x1A30, 0x8B11, 0x4D67, 0x8B14, 0x1A25,
+ 0x8B16, 0x1A2F, 0x8B17, 0x1A31, 0x8B19, 0x0760, 0x8B1A, 0x1A2D,
+ 0x8B1B, 0x07E8, 0x8B1C, 0x4900, 0x8B1D, 0x0901, 0x8B1F, 0x3B27,
+ 0x8B20, 0x1A32, 0x8B21, 0x0F42, 0x8B26, 0x1A35, 0x8B28, 0x1A38,
+ 0x8B2B, 0x1A36, 0x8B2C, 0x0DA7, 0x8B2D, 0x4901, 0x8B33, 0x1A33,
+ 0x8B37, 0x3B28, 0x8B39, 0x06D8, 0x8B3E, 0x1A37, 0x8B41, 0x1A39,
+ 0x8B43, 0x3B29, 0x8B44, 0x3B2A, 0x8B45, 0x4D68, 0x8B46, 0x42E8,
+ 0x8B49, 0x1A3D, 0x8B4C, 0x1A3A, 0x8B4E, 0x1A3C, 0x8B4F, 0x1A3B,
+ 0x8B51, 0x4903, 0x8B52, 0x4D69, 0x8B53, 0x21B0, 0x8B54, 0x3B2B,
+ 0x8B56, 0x1A3E, 0x8B58, 0x08DD, 0x8B59, 0x42E9, 0x8B5A, 0x1A40,
+ 0x8B5B, 0x1A3F, 0x8B5C, 0x0DDA, 0x8B5E, 0x4904, 0x8B5F, 0x1A42,
+ 0x8B66, 0x072F, 0x8B69, 0x42EA, 0x8B6B, 0x1A41, 0x8B6C, 0x1A43,
+ 0x8B6D, 0x4D6A, 0x8B6F, 0x1A44, 0x8B70, 0x065E, 0x8B71, 0x182E,
+ 0x8B72, 0x09E1, 0x8B74, 0x1A45, 0x8B76, 0x4905, 0x8B77, 0x07A2,
+ 0x8B78, 0x4D6B, 0x8B7C, 0x4D6C, 0x8B7D, 0x1A46, 0x8B7E, 0x4D6D,
+ 0x8B7F, 0x21B1, 0x8B80, 0x1A47, 0x8B81, 0x4906, 0x8B83, 0x088C,
+ 0x8B85, 0x4D6E, 0x8B8A, 0x13D3, 0x8B8B, 0x4907, 0x8B8C, 0x1A48,
+ 0x8B8E, 0x1A49, 0x8B90, 0x093C, 0x8B92, 0x1A4A, 0x8B93, 0x1A4B,
+ 0x8B94, 0x4908, 0x8B95, 0x4909, 0x8B96, 0x1A4C, 0x8B99, 0x1A4D,
+ 0x8B9A, 0x1A4E, 0x8B9C, 0x3B2C, 0x8B9D, 0x42EB, 0x8B9E, 0x3B2D,
+ 0x8B9F, 0x4D6F, 0x8C37, 0x0B69, 0x8C39, 0x490A, 0x8C3A, 0x1A4F,
+ 0x8C3D, 0x490C, 0x8C3F, 0x1A51, 0x8C41, 0x1A50, 0x8C45, 0x490F,
+ 0x8C46, 0x0C7E, 0x8C47, 0x3B2E, 0x8C48, 0x1A52, 0x8C49, 0x42EC,
+ 0x8C4A, 0x0E5B, 0x8C4B, 0x4D70, 0x8C4C, 0x1A53, 0x8C4E, 0x1A54,
+ 0x8C4F, 0x4910, 0x8C50, 0x1A55, 0x8C53, 0x4D71, 0x8C54, 0x3B2F,
+ 0x8C55, 0x1A56, 0x8C57, 0x4911, 0x8C5A, 0x0CB2, 0x8C61, 0x09C5,
+ 0x8C62, 0x1A57, 0x8C68, 0x42ED, 0x8C69, 0x4912, 0x8C6A, 0x07FD,
+ 0x8C6B, 0x1007, 0x8C6C, 0x1A58, 0x8C6D, 0x4913, 0x8C73, 0x3B30,
+ 0x8C78, 0x1A59, 0x8C79, 0x0DB1, 0x8C7A, 0x1A5A, 0x8C7B, 0x4D72,
+ 0x8C7C, 0x1A62, 0x8C82, 0x1A5B, 0x8C85, 0x1A5D, 0x8C89, 0x1A5C,
+ 0x8C8A, 0x1A5E, 0x8C8C, 0x0E74, 0x8C8D, 0x1A5F, 0x8C8E, 0x1A60,
+ 0x8C92, 0x4916, 0x8C93, 0x4915, 0x8C94, 0x1A61, 0x8C98, 0x1A63,
+ 0x8C99, 0x4917, 0x8C9B, 0x4919, 0x8C9D, 0x058B, 0x8C9E, 0x0C03,
+ 0x8C9F, 0x354C, 0x8CA0, 0x0DDB, 0x8CA1, 0x0852, 0x8CA2, 0x07E9,
+ 0x8CA4, 0x3B31, 0x8CA7, 0x0DC1, 0x8CA8, 0x055F, 0x8CA9, 0x0D62,
+ 0x8CAA, 0x1A66, 0x8CAB, 0x060F, 0x8CAC, 0x0A79, 0x8CAD, 0x1A65,
+ 0x8CAE, 0x1A6A, 0x8CAF, 0x0BB7, 0x8CB0, 0x0EEF, 0x8CB2, 0x1A68,
+ 0x8CB3, 0x1A69, 0x8CB4, 0x0648, 0x8CB6, 0x1A6B, 0x8CB7, 0x0D19,
+ 0x8CB8, 0x0B3F, 0x8CBA, 0x4D73, 0x8CBB, 0x0D85, 0x8CBC, 0x0C37,
+ 0x8CBD, 0x1A67, 0x8CBF, 0x0E75, 0x8CC0, 0x056C, 0x8CC1, 0x1A6D,
+ 0x8CC2, 0x0FCE, 0x8CC3, 0x0BDE, 0x8CC4, 0x0FEB, 0x8CC5, 0x4D74,
+ 0x8CC7, 0x08BF, 0x8CC8, 0x1A6C, 0x8CC9, 0x4D75, 0x8CCA, 0x0B11,
+ 0x8CCD, 0x1A7D, 0x8CCE, 0x0AAA, 0x8CD1, 0x0CD0, 0x8CD2, 0x4D76,
+ 0x8CD3, 0x0DC2, 0x8CD5, 0x491B, 0x8CD6, 0x491A, 0x8CD9, 0x3B32,
+ 0x8CDA, 0x1A70, 0x8CDB, 0x088D, 0x8CDC, 0x08C0, 0x8CDE, 0x09C6,
+ 0x8CE0, 0x0D1B, 0x8CE1, 0x3B33, 0x8CE2, 0x0761, 0x8CE3, 0x1A6F,
+ 0x8CE4, 0x1A6E, 0x8CE6, 0x0DDC, 0x8CEA, 0x08ED, 0x8CEC, 0x4D77,
+ 0x8CED, 0x0C4C, 0x8CF0, 0x21B2, 0x8CF1, 0x491D, 0x8CF4, 0x21B3,
+ 0x8CF5, 0x4D78, 0x8CF7, 0x4D79, 0x8CF8, 0x3B34, 0x8CFA, 0x1A72,
+ 0x8CFB, 0x1A73, 0x8CFC, 0x07EA, 0x8CFD, 0x1A71, 0x8CFE, 0x3B35,
+ 0x8D01, 0x4D7A, 0x8D03, 0x4D7B, 0x8D04, 0x1A74, 0x8D05, 0x1A75,
+ 0x8D07, 0x1A77, 0x8D08, 0x0B03, 0x8D09, 0x491F, 0x8D0A, 0x1A76,
+ 0x8D0B, 0x0622, 0x8D0D, 0x1A79, 0x8D0E, 0x4920, 0x8D0F, 0x1A78,
+ 0x8D10, 0x1A7A, 0x8D12, 0x21B4, 0x8D13, 0x1A7C, 0x8D14, 0x1A7E,
+ 0x8D16, 0x1A7F, 0x8D17, 0x4D7C, 0x8D1B, 0x3B36, 0x8D1C, 0x4D7D,
+ 0x8D64, 0x0A7A, 0x8D66, 0x08FB, 0x8D67, 0x1A80, 0x8D69, 0x3B37,
+ 0x8D6B, 0x05B0, 0x8D6C, 0x3B38, 0x8D6D, 0x1A81, 0x8D6E, 0x4D7E,
+ 0x8D70, 0x0AF8, 0x8D71, 0x1A82, 0x8D73, 0x1A83, 0x8D74, 0x0DDD,
+ 0x8D76, 0x21B5, 0x8D77, 0x0649, 0x8D81, 0x1A84, 0x8D84, 0x3B39,
+ 0x8D85, 0x0BD2, 0x8D8A, 0x04FD, 0x8D8D, 0x3B3A, 0x8D91, 0x4D7F,
+ 0x8D95, 0x3B3B, 0x8D99, 0x1A85, 0x8D9F, 0x4D80, 0x8DA3, 0x091D,
+ 0x8DA6, 0x3B3C, 0x8DA8, 0x0A3C, 0x8DAB, 0x4D81, 0x8DAF, 0x42EE,
+ 0x8DB2, 0x4D82, 0x8DB3, 0x0B0D, 0x8DBA, 0x1A88, 0x8DBE, 0x1A87,
+ 0x8DC2, 0x1A86, 0x8DC6, 0x3B3D, 0x8DC8, 0x4921, 0x8DCB, 0x1A8E,
+ 0x8DCC, 0x1A8C, 0x8DCE, 0x3B3E, 0x8DCF, 0x1A89, 0x8DD1, 0x42EF,
+ 0x8DD5, 0x4D83, 0x8DD6, 0x1A8B, 0x8DD7, 0x42F0, 0x8DD9, 0x4922,
+ 0x8DDA, 0x1A8A, 0x8DDB, 0x1A8D, 0x8DDD, 0x0691, 0x8DDF, 0x1A91,
+ 0x8DE1, 0x0A7B, 0x8DE3, 0x1A92, 0x8DE4, 0x3B3F, 0x8DE7, 0x4D84,
+ 0x8DE8, 0x078D, 0x8DEA, 0x1A8F, 0x8DEB, 0x1A90, 0x8DEC, 0x3B40,
+ 0x8DEF, 0x0FCF, 0x8DF1, 0x4D85, 0x8DF2, 0x4D86, 0x8DF3, 0x0BD3,
+ 0x8DF4, 0x4D87, 0x8DF5, 0x0AAB, 0x8DFC, 0x1A93, 0x8DFD, 0x4925,
+ 0x8DFF, 0x1A96, 0x8E01, 0x4D88, 0x8E06, 0x4926, 0x8E08, 0x1A94,
+ 0x8E09, 0x1A95, 0x8E0A, 0x0F43, 0x8E0B, 0x4D89, 0x8E0C, 0x4923,
+ 0x8E0F, 0x0C7F, 0x8E10, 0x1A99, 0x8E14, 0x4928, 0x8E16, 0x4929,
+ 0x8E1D, 0x1A97, 0x8E1E, 0x1A98, 0x8E1F, 0x1A9A, 0x8E20, 0x3B41,
+ 0x8E21, 0x492A, 0x8E22, 0x492B, 0x8E23, 0x42F1, 0x8E26, 0x4D8A,
+ 0x8E27, 0x492C, 0x8E2A, 0x1AA8, 0x8E30, 0x1A9D, 0x8E31, 0x4D8B,
+ 0x8E34, 0x1A9E, 0x8E35, 0x1A9C, 0x8E36, 0x492F, 0x8E39, 0x4930,
+ 0x8E3D, 0x42F2, 0x8E40, 0x4D8C, 0x8E41, 0x4D8D, 0x8E42, 0x1A9B,
+ 0x8E44, 0x0C19, 0x8E47, 0x1AA0, 0x8E48, 0x1AA4, 0x8E49, 0x1AA1,
+ 0x8E4A, 0x1A9F, 0x8E4B, 0x3B42, 0x8E4C, 0x1AA2, 0x8E4D, 0x4D8E,
+ 0x8E4F, 0x4D8F, 0x8E50, 0x1AA3, 0x8E54, 0x4931, 0x8E55, 0x1AAA,
+ 0x8E59, 0x1AA5, 0x8E5C, 0x4D90, 0x8E5F, 0x0A7C, 0x8E60, 0x1AA7,
+ 0x8E61, 0x4D91, 0x8E62, 0x4932, 0x8E63, 0x1AA9, 0x8E64, 0x1AA6,
+ 0x8E69, 0x4D92, 0x8E6C, 0x3B43, 0x8E6D, 0x4933, 0x8E6F, 0x4934,
+ 0x8E70, 0x3B44, 0x8E71, 0x4D93, 0x8E72, 0x1AAC, 0x8E74, 0x093D,
+ 0x8E75, 0x4D94, 0x8E76, 0x1AAB, 0x8E77, 0x4D95, 0x8E7A, 0x3B45,
+ 0x8E7B, 0x42F3, 0x8E7C, 0x1AAD, 0x8E81, 0x1AAE, 0x8E84, 0x1AB1,
+ 0x8E85, 0x1AB0, 0x8E87, 0x1AAF, 0x8E89, 0x4D96, 0x8E8A, 0x1AB3,
+ 0x8E8B, 0x1AB2, 0x8E8D, 0x0F02, 0x8E90, 0x4D97, 0x8E91, 0x1AB5,
+ 0x8E92, 0x3B46, 0x8E93, 0x1AB4, 0x8E94, 0x1AB6, 0x8E95, 0x4D98,
+ 0x8E98, 0x4935, 0x8E99, 0x1AB7, 0x8E9A, 0x4D99, 0x8E9E, 0x4936,
+ 0x8EA1, 0x1AB9, 0x8EA7, 0x4D9A, 0x8EA9, 0x4D9B, 0x8EAA, 0x1AB8,
+ 0x8EAB, 0x0A0E, 0x8EAC, 0x1ABA, 0x8EAD, 0x4D9C, 0x8EAE, 0x3B47,
+ 0x8EAF, 0x06E5, 0x8EB0, 0x1ABB, 0x8EB1, 0x1ABD, 0x8EB3, 0x3B48,
+ 0x8EB5, 0x4937, 0x8EB6, 0x3703, 0x8EBB, 0x4938, 0x8EBE, 0x1ABE,
+ 0x8EC0, 0x1DEF, 0x8EC5, 0x1ABF, 0x8EC6, 0x1ABC, 0x8EC8, 0x1AC0,
+ 0x8ECA, 0x0902, 0x8ECB, 0x1AC1, 0x8ECC, 0x064A, 0x8ECD, 0x0709,
+ 0x8ECF, 0x21B7, 0x8ED1, 0x3B49, 0x8ED2, 0x0762, 0x8ED4, 0x3B4A,
+ 0x8EDB, 0x1AC2, 0x8EDF, 0x0CC8, 0x8EE2, 0x0C38, 0x8EE3, 0x1AC3,
+ 0x8EE8, 0x4D9D, 0x8EEB, 0x1AC6, 0x8EF0, 0x4D9E, 0x8EF8, 0x08E0,
+ 0x8EF9, 0x3B4B, 0x8EFA, 0x42F6, 0x8EFB, 0x1AC5, 0x8EFC, 0x1AC4,
+ 0x8EFD, 0x0730, 0x8EFE, 0x1AC7, 0x8F00, 0x493C, 0x8F03, 0x05B1,
+ 0x8F05, 0x1AC9, 0x8F07, 0x4D9F, 0x8F08, 0x493D, 0x8F09, 0x084C,
+ 0x8F0A, 0x1AC8, 0x8F0C, 0x1AD1, 0x8F12, 0x1ACB, 0x8F13, 0x1ACD,
+ 0x8F14, 0x0E35, 0x8F15, 0x1ACA, 0x8F17, 0x3B4C, 0x8F18, 0x4DA0,
+ 0x8F19, 0x1ACC, 0x8F1B, 0x1AD0, 0x8F1C, 0x1ACE, 0x8F1D, 0x064B,
+ 0x8F1E, 0x42F7, 0x8F1F, 0x1ACF, 0x8F25, 0x4DA1, 0x8F26, 0x1AD2,
+ 0x8F27, 0x4DA2, 0x8F29, 0x0D10, 0x8F2A, 0x0FA0, 0x8F2B, 0x493E,
+ 0x8F2C, 0x4DA3, 0x8F2D, 0x42F8, 0x8F2F, 0x093E, 0x8F33, 0x1AD3,
+ 0x8F35, 0x4DA4, 0x8F36, 0x3B4D, 0x8F38, 0x0F0C, 0x8F39, 0x1AD5,
+ 0x8F3A, 0x4DA5, 0x8F3B, 0x1AD4, 0x8F3E, 0x1AD8, 0x8F3F, 0x0F2B,
+ 0x8F40, 0x493F, 0x8F42, 0x1AD7, 0x8F43, 0x4DA6, 0x8F44, 0x05CB,
+ 0x8F45, 0x1AD6, 0x8F46, 0x1ADB, 0x8F47, 0x4DA7, 0x8F49, 0x1ADA,
+ 0x8F4A, 0x4940, 0x8F4C, 0x1AD9, 0x8F4D, 0x0C2C, 0x8F4E, 0x1ADC,
+ 0x8F51, 0x4DA8, 0x8F54, 0x42F9, 0x8F55, 0x4DA9, 0x8F57, 0x1ADD,
+ 0x8F58, 0x4941, 0x8F5C, 0x1ADE, 0x8F5F, 0x07FE, 0x8F61, 0x06FB,
+ 0x8F62, 0x1ADF, 0x8F63, 0x1AE0, 0x8F64, 0x1AE1, 0x8F9B, 0x0A0F,
+ 0x8F9C, 0x1AE2, 0x8F9E, 0x08D9, 0x8F9F, 0x1AE3, 0x8FA0, 0x4DAA,
+ 0x8FA1, 0x4DAB, 0x8FA2, 0x4DAC, 0x8FA3, 0x1AE4, 0x8FA4, 0x4943,
+ 0x8FA5, 0x4DAD, 0x8FA6, 0x3B4E, 0x8FA7, 0x10B6, 0x8FA8, 0x10B5,
+ 0x8FAD, 0x1AE5, 0x8FAE, 0x17FF, 0x8FAF, 0x1AE6, 0x8FB0, 0x0B62,
+ 0x8FB1, 0x09F1, 0x8FB2, 0x0CF6, 0x8FB4, 0x4944, 0x8FB5, 0x3B4F,
+ 0x8FB6, 0x3B50, 0x8FB7, 0x1AE7, 0x8FBA, 0x0E25, 0x8FBB, 0x0BF0,
+ 0x8FBC, 0x0810, 0x8FBF, 0x0B67, 0x8FC1, 0x4946, 0x8FC2, 0x04CC,
+ 0x8FC4, 0x0EA6, 0x8FC5, 0x0A1D, 0x8FC6, 0x4947, 0x8FC8, 0x3799,
+ 0x8FCA, 0x4949, 0x8FCD, 0x494A, 0x8FCE, 0x0734, 0x8FD1, 0x06D9,
+ 0x8FD3, 0x494B, 0x8FD4, 0x0E26, 0x8FD5, 0x494C, 0x8FDA, 0x1AE8,
+ 0x8FE0, 0x3B52, 0x8FE2, 0x1AEA, 0x8FE4, 0x3B53, 0x8FE5, 0x1AE9,
+ 0x8FE6, 0x0560, 0x8FE8, 0x42FB, 0x8FE9, 0x0CCE, 0x8FEA, 0x1AEB,
+ 0x8FEB, 0x0D2D, 0x8FED, 0x0C2D, 0x8FEE, 0x42FC, 0x8FEF, 0x1AEC,
+ 0x8FF0, 0x095C, 0x8FF1, 0x494D, 0x8FF4, 0x1AEE, 0x8FF5, 0x494E,
+ 0x8FF6, 0x3B54, 0x8FF7, 0x0ECE, 0x8FF8, 0x1AFD, 0x8FF9, 0x1AF0,
+ 0x8FFA, 0x1AF1, 0x8FFB, 0x494F, 0x8FFD, 0x0BE5, 0x9000, 0x0B40,
+ 0x9001, 0x0AF9, 0x9002, 0x3B55, 0x9003, 0x0C80, 0x9004, 0x4DAE,
+ 0x9005, 0x1AEF, 0x9006, 0x066F, 0x9008, 0x42FD, 0x900B, 0x1AF8,
+ 0x900C, 0x4950, 0x900D, 0x1AF5, 0x900E, 0x1B02, 0x900F, 0x0C81,
+ 0x9010, 0x0B9E, 0x9011, 0x1AF2, 0x9013, 0x0C1A, 0x9014, 0x0C4D,
+ 0x9015, 0x1AF3, 0x9016, 0x1AF7, 0x9017, 0x0A26, 0x9019, 0x0D1D,
+ 0x901A, 0x0BE8, 0x901B, 0x4DAF, 0x901D, 0x0A66, 0x901E, 0x1AF6,
+ 0x901F, 0x0B0E, 0x9020, 0x0B04, 0x9021, 0x1AF4, 0x9022, 0x046D,
+ 0x9023, 0x0FC8, 0x9027, 0x1AF9, 0x902C, 0x3B56, 0x902D, 0x42FE,
+ 0x902E, 0x0B41, 0x902F, 0x4DB0, 0x9031, 0x093F, 0x9032, 0x0A10,
+ 0x9035, 0x1AFB, 0x9036, 0x1AFA, 0x9037, 0x4951, 0x9038, 0x04B3,
+ 0x9039, 0x1AFC, 0x903C, 0x0DA1, 0x903E, 0x1B04, 0x9041, 0x0CB3,
+ 0x9042, 0x0A31, 0x9043, 0x4953, 0x9044, 0x3B57, 0x9045, 0x0B97,
+ 0x9047, 0x06F0, 0x9049, 0x1B03, 0x904A, 0x0F21, 0x904B, 0x04E1,
+ 0x904C, 0x4DB1, 0x904D, 0x0E27, 0x904E, 0x0561, 0x904F, 0x1AFE,
+ 0x9050, 0x1AFF, 0x9051, 0x1B00, 0x9052, 0x1B01, 0x9053, 0x0C93,
+ 0x9054, 0x0B61, 0x9055, 0x04A7, 0x9056, 0x1B05, 0x9058, 0x1B06,
+ 0x9059, 0x1D34, 0x905B, 0x4DB2, 0x905C, 0x0B1D, 0x905D, 0x4954,
+ 0x905E, 0x1B07, 0x9060, 0x0515, 0x9061, 0x0ACE, 0x9063, 0x0763,
+ 0x9065, 0x0F44, 0x9067, 0x21BA, 0x9068, 0x1B08, 0x9069, 0x0C26,
+ 0x906D, 0x0AFA, 0x906E, 0x0903, 0x906F, 0x1B09, 0x9070, 0x4DB3,
+ 0x9072, 0x1B0C, 0x9074, 0x4DB4, 0x9075, 0x096F, 0x9076, 0x1B0A,
+ 0x9077, 0x0AAD, 0x9078, 0x0AAC, 0x9079, 0x4DB5, 0x907A, 0x04A8,
+ 0x907C, 0x0F93, 0x907D, 0x1B0E, 0x907F, 0x0D86, 0x9080, 0x1B10,
+ 0x9081, 0x1B0F, 0x9082, 0x1B0D, 0x9083, 0x1737, 0x9084, 0x0610,
+ 0x9085, 0x4957, 0x9087, 0x1AED, 0x9088, 0x3B58, 0x9089, 0x1B12,
+ 0x908A, 0x1B11, 0x908B, 0x4DB6, 0x908C, 0x4958, 0x908F, 0x1B13,
+ 0x9090, 0x4959, 0x9091, 0x0F22, 0x9095, 0x3B59, 0x9097, 0x42FF,
+ 0x9098, 0x4DB7, 0x9099, 0x3B5A, 0x909B, 0x3B5B, 0x90A0, 0x4DB8,
+ 0x90A1, 0x495A, 0x90A2, 0x3B5C, 0x90A3, 0x0CB9, 0x90A6, 0x0E5C,
+ 0x90A8, 0x1B14, 0x90AA, 0x0905, 0x90AF, 0x1B15, 0x90B0, 0x495C,
+ 0x90B1, 0x1B16, 0x90B2, 0x4DB9, 0x90B3, 0x4300, 0x90B4, 0x3B5D,
+ 0x90B5, 0x1B17, 0x90B6, 0x495D, 0x90B8, 0x0C1B, 0x90BD, 0x4DBA,
+ 0x90BE, 0x4301, 0x90C1, 0x04AE, 0x90C3, 0x495E, 0x90C4, 0x4302,
+ 0x90C5, 0x4303, 0x90C7, 0x4304, 0x90C8, 0x495F, 0x90C9, 0x4DBB,
+ 0x90CA, 0x07EB, 0x90CE, 0x0FE0, 0x90D7, 0x3B5E, 0x90DB, 0x1B1B,
+ 0x90DC, 0x4961, 0x90DD, 0x3B5F, 0x90DE, 0x21BB, 0x90DF, 0x4962,
+ 0x90E1, 0x070A, 0x90E2, 0x1B18, 0x90E4, 0x1B19, 0x90E8, 0x0DE6,
+ 0x90EB, 0x4967, 0x90ED, 0x05B2, 0x90EF, 0x4305, 0x90F0, 0x4DBC,
+ 0x90F2, 0x4965, 0x90F4, 0x3B60, 0x90F5, 0x0F23, 0x90F6, 0x4964,
+ 0x90F7, 0x06B7, 0x90FD, 0x0C4E, 0x90FE, 0x4968, 0x90FF, 0x4969,
+ 0x9100, 0x4966, 0x9102, 0x1B1C, 0x9104, 0x496A, 0x9105, 0x4DBD,
+ 0x9106, 0x496B, 0x9112, 0x1B1D, 0x9114, 0x4306, 0x9115, 0x21BD,
+ 0x9116, 0x4307, 0x9117, 0x3B61, 0x9118, 0x496C, 0x9119, 0x1B1E,
+ 0x911C, 0x3B62, 0x911E, 0x496D, 0x9122, 0x4308, 0x9123, 0x4309,
+ 0x9125, 0x4DBE, 0x9127, 0x21BE, 0x912D, 0x0C1C, 0x912F, 0x430A,
+ 0x9130, 0x1B20, 0x9131, 0x3B63, 0x9132, 0x1B1F, 0x9134, 0x430B,
+ 0x9137, 0x496E, 0x9139, 0x496F, 0x913A, 0x3B64, 0x913D, 0x3B65,
+ 0x9146, 0x4970, 0x9147, 0x4971, 0x9148, 0x3B66, 0x9149, 0x0CAB,
+ 0x914A, 0x1B21, 0x914B, 0x0940, 0x914C, 0x090C, 0x914D, 0x0D11,
+ 0x914E, 0x0BAF, 0x9152, 0x091E, 0x9154, 0x0A32, 0x9156, 0x1B22,
+ 0x9157, 0x4972, 0x9158, 0x1B23, 0x9159, 0x4973, 0x915A, 0x4DBF,
+ 0x915B, 0x3B67, 0x9161, 0x3B68, 0x9162, 0x0A23, 0x9163, 0x1B24,
+ 0x9164, 0x3B69, 0x9165, 0x1B25, 0x9167, 0x4DC0, 0x9169, 0x1B26,
+ 0x916A, 0x0F59, 0x916C, 0x0941, 0x9172, 0x1B28, 0x9173, 0x1B27,
+ 0x9174, 0x4974, 0x9175, 0x07EC, 0x9177, 0x0805, 0x9178, 0x088E,
+ 0x9179, 0x4975, 0x917A, 0x4DC1, 0x9182, 0x1B2B, 0x9183, 0x430C,
+ 0x9185, 0x4976, 0x9187, 0x0970, 0x9189, 0x1B2A, 0x918A, 0x4DC2,
+ 0x918B, 0x1B29, 0x918D, 0x0B49, 0x918E, 0x3B6A, 0x9190, 0x07A3,
+ 0x9191, 0x4DC3, 0x9192, 0x0A67, 0x9195, 0x4DC4, 0x9197, 0x0D44,
+ 0x919C, 0x0943, 0x919E, 0x3B6B, 0x91A2, 0x1B2C, 0x91A4, 0x09C7,
+ 0x91A8, 0x3B6C, 0x91AA, 0x1B2F, 0x91AB, 0x1B2D, 0x91AC, 0x1E1B,
+ 0x91AD, 0x3B6D, 0x91AE, 0x3B6E, 0x91AF, 0x1B2E, 0x91B0, 0x4DC5,
+ 0x91B1, 0x1E61, 0x91B2, 0x3B6F, 0x91B3, 0x4977, 0x91B4, 0x1B31,
+ 0x91B5, 0x1B30, 0x91B6, 0x4978, 0x91B8, 0x09E2, 0x91BA, 0x1B32,
+ 0x91BB, 0x4DC6, 0x91BC, 0x3B70, 0x91BD, 0x4DC7, 0x91C0, 0x1B33,
+ 0x91C1, 0x1B34, 0x91C2, 0x4DC8, 0x91C3, 0x4979, 0x91C4, 0x497A,
+ 0x91C5, 0x4DC9, 0x91C6, 0x0D64, 0x91C7, 0x0843, 0x91C8, 0x090D,
+ 0x91C9, 0x1B35, 0x91CB, 0x1B36, 0x91CC, 0x0F6C, 0x91CD, 0x094F,
+ 0x91CE, 0x0EFA, 0x91CF, 0x0F94, 0x91D0, 0x1B37, 0x91D1, 0x06DA,
+ 0x91D6, 0x1B38, 0x91D7, 0x21C0, 0x91D8, 0x0C1D, 0x91DA, 0x21BF,
+ 0x91DB, 0x1B3B, 0x91DC, 0x05D6, 0x91DD, 0x0A11, 0x91DE, 0x21C1,
+ 0x91DF, 0x1B39, 0x91E1, 0x1B3A, 0x91E3, 0x0BFC, 0x91E4, 0x21C4,
+ 0x91E5, 0x21C5, 0x91E6, 0x0E83, 0x91E7, 0x06F4, 0x91EC, 0x497D,
+ 0x91ED, 0x21C2, 0x91EE, 0x21C3, 0x91F0, 0x3B71, 0x91F1, 0x430D,
+ 0x91F5, 0x1B3D, 0x91F6, 0x1B3E, 0x91F7, 0x3B72, 0x91FB, 0x3B73,
+ 0x91FC, 0x1B3C, 0x91FF, 0x1B40, 0x9200, 0x4DCA, 0x9201, 0x497E,
+ 0x9206, 0x21C6, 0x9207, 0x3B74, 0x9209, 0x4DCB, 0x920A, 0x21C8,
+ 0x920D, 0x0CB7, 0x920E, 0x05A1, 0x9210, 0x21C7, 0x9211, 0x1B44,
+ 0x9214, 0x1B41, 0x9215, 0x1B43, 0x9216, 0x497F, 0x9217, 0x4980,
+ 0x921E, 0x1B3F, 0x9223, 0x4DCC, 0x9228, 0x3B75, 0x9229, 0x1B8A,
+ 0x922C, 0x1B42, 0x9233, 0x3B76, 0x9234, 0x0FB3, 0x9237, 0x078E,
+ 0x9238, 0x3B77, 0x9239, 0x21CF, 0x923A, 0x21C9, 0x923C, 0x21CB,
+ 0x923F, 0x1B4C, 0x9240, 0x21CA, 0x9242, 0x4982, 0x9243, 0x3B78,
+ 0x9244, 0x0C2E, 0x9245, 0x1B47, 0x9247, 0x3B79, 0x9248, 0x1B4A,
+ 0x9249, 0x1B48, 0x924A, 0x4983, 0x924B, 0x1B4D, 0x924E, 0x21CC,
+ 0x924F, 0x3B7A, 0x9250, 0x1B4E, 0x9251, 0x21CE, 0x9256, 0x4984,
+ 0x9257, 0x1B46, 0x9259, 0x21CD, 0x925A, 0x1B53, 0x925B, 0x0516,
+ 0x925E, 0x1B45, 0x9260, 0x3B7B, 0x9261, 0x4985, 0x9262, 0x0D41,
+ 0x9264, 0x1B49, 0x9265, 0x4986, 0x9266, 0x09C8, 0x9267, 0x21D0,
+ 0x9268, 0x4987, 0x9271, 0x07ED, 0x9276, 0x4DCD, 0x9277, 0x21D2,
+ 0x9278, 0x21D3, 0x927C, 0x4989, 0x927D, 0x498A, 0x927E, 0x0E76,
+ 0x927F, 0x498B, 0x9280, 0x06DC, 0x9283, 0x0950, 0x9285, 0x0C94,
+ 0x9288, 0x20AA, 0x9289, 0x498C, 0x928D, 0x498D, 0x928E, 0x4DCE,
+ 0x9291, 0x0AAF, 0x9293, 0x1B51, 0x9295, 0x1B4B, 0x9296, 0x1B50,
+ 0x9297, 0x498E, 0x9298, 0x0ECF, 0x9299, 0x498F, 0x929A, 0x0BD4,
+ 0x929B, 0x1B52, 0x929C, 0x1B4F, 0x929F, 0x4990, 0x92A7, 0x21D1,
+ 0x92AB, 0x4991, 0x92AD, 0x0AAE, 0x92AF, 0x4DCF, 0x92B2, 0x4994,
+ 0x92B3, 0x3554, 0x92B7, 0x1B56, 0x92B9, 0x1B55, 0x92BB, 0x4DD0,
+ 0x92BC, 0x4DD1, 0x92BF, 0x4995, 0x92C0, 0x4996, 0x92C1, 0x4DD2,
+ 0x92C2, 0x3B7C, 0x92C3, 0x4DD3, 0x92C5, 0x4DD4, 0x92C6, 0x4997,
+ 0x92C8, 0x4DD5, 0x92CB, 0x3B7D, 0x92CC, 0x3B7E, 0x92CE, 0x4998,
+ 0x92CF, 0x1B54, 0x92D0, 0x21D7, 0x92D2, 0x0E5D, 0x92D3, 0x21DB,
+ 0x92D5, 0x21D9, 0x92D7, 0x21D5, 0x92D9, 0x21D6, 0x92DF, 0x3B7F,
+ 0x92E0, 0x21DA, 0x92E4, 0x0985, 0x92E5, 0x4999, 0x92E7, 0x21D4,
+ 0x92E9, 0x1B57, 0x92EA, 0x0E2F, 0x92ED, 0x04F6, 0x92F2, 0x0DB8,
+ 0x92F3, 0x0BB0, 0x92F7, 0x499D, 0x92F8, 0x0692, 0x92F9, 0x20B0,
+ 0x92FA, 0x1B59, 0x92FB, 0x21DE, 0x92FC, 0x07EF, 0x92FF, 0x21E1,
+ 0x9302, 0x21E3, 0x9304, 0x345A, 0x9306, 0x087A, 0x930D, 0x3B80,
+ 0x930F, 0x1B58, 0x9310, 0x0A33, 0x9311, 0x499A, 0x9314, 0x4DD6,
+ 0x9315, 0x3B81, 0x9318, 0x0A34, 0x9319, 0x1B5C, 0x931A, 0x1B5E,
+ 0x931D, 0x21E2, 0x931E, 0x21E0, 0x931F, 0x3B82, 0x9320, 0x09E3,
+ 0x9321, 0x21DD, 0x9322, 0x1B5D, 0x9323, 0x1B5F, 0x9325, 0x21DC,
+ 0x9326, 0x06CB, 0x9327, 0x3B83, 0x9328, 0x0DB7, 0x9329, 0x499E,
+ 0x932B, 0x090E, 0x932C, 0x0FC9, 0x932E, 0x1B5B, 0x932F, 0x0868,
+ 0x9332, 0x0FE5, 0x9333, 0x4DD7, 0x9335, 0x1B61, 0x9336, 0x4DD8,
+ 0x933A, 0x1B60, 0x933B, 0x1B62, 0x9344, 0x1B5A, 0x9347, 0x3B84,
+ 0x9348, 0x20A9, 0x9349, 0x430E, 0x934A, 0x3458, 0x934B, 0x0CC1,
+ 0x934D, 0x0C4F, 0x9351, 0x49A1, 0x9352, 0x3B85, 0x9354, 0x0BF3,
+ 0x9356, 0x1B67, 0x9357, 0x21E5, 0x9358, 0x4DD9, 0x935A, 0x49A2,
+ 0x935B, 0x0B81, 0x935C, 0x1B63, 0x9360, 0x1B64, 0x9364, 0x430F,
+ 0x9365, 0x4310, 0x936A, 0x3B87, 0x936B, 0x49A3, 0x936C, 0x0703,
+ 0x936D, 0x3B88, 0x936E, 0x1B66, 0x9370, 0x21E4, 0x9371, 0x49A4,
+ 0x9373, 0x49A5, 0x9375, 0x0764, 0x937C, 0x1B65, 0x937E, 0x09C9,
+ 0x937F, 0x4DDA, 0x9382, 0x4DDB, 0x9388, 0x49A9, 0x938A, 0x4DDC,
+ 0x938B, 0x49AA, 0x938C, 0x05D7, 0x938F, 0x49AB, 0x9394, 0x1B6B,
+ 0x9396, 0x082F, 0x9397, 0x0AFB, 0x939A, 0x0BE6, 0x939B, 0x3B89,
+ 0x939E, 0x49AC, 0x93A1, 0x49A6, 0x93A3, 0x4311, 0x93A4, 0x21E6,
+ 0x93A7, 0x0599, 0x93A9, 0x3B8B, 0x93AC, 0x1B69, 0x93AD, 0x1B6A,
+ 0x93AE, 0x0BDF, 0x93B0, 0x1B68, 0x93B9, 0x1B6C, 0x93BA, 0x3B8A,
+ 0x93BB, 0x4DDD, 0x93C1, 0x3B8C, 0x93C3, 0x1B72, 0x93C6, 0x21E7,
+ 0x93C7, 0x49B1, 0x93C8, 0x1B75, 0x93CA, 0x3B8D, 0x93CC, 0x4DDE,
+ 0x93D0, 0x1B74, 0x93D1, 0x0C27, 0x93D6, 0x1B6D, 0x93D7, 0x1B6E,
+ 0x93D8, 0x1B71, 0x93DC, 0x49B2, 0x93DD, 0x1B73, 0x93DE, 0x21E8,
+ 0x93DF, 0x4312, 0x93E1, 0x06B8, 0x93E2, 0x3B8E, 0x93E4, 0x1B76,
+ 0x93E5, 0x1B70, 0x93E6, 0x4DDF, 0x93E7, 0x49B3, 0x93E8, 0x1B6F,
+ 0x93F1, 0x49B0, 0x93F5, 0x49AD, 0x93F8, 0x21E9, 0x93F9, 0x4DE0,
+ 0x93FA, 0x3B8F, 0x93FB, 0x49B7, 0x93FD, 0x3B90, 0x9402, 0x4DE1,
+ 0x9403, 0x1B7A, 0x9404, 0x4313, 0x9407, 0x1B7B, 0x9409, 0x49B4,
+ 0x940D, 0x4DE2, 0x940E, 0x4DE3, 0x940F, 0x3B91, 0x9410, 0x1B7C,
+ 0x9413, 0x1B79, 0x9414, 0x1B78, 0x9416, 0x49B5, 0x9417, 0x49B6,
+ 0x9418, 0x09CA, 0x9419, 0x0C82, 0x941A, 0x1B77, 0x9421, 0x1B80,
+ 0x942B, 0x1B7E, 0x942E, 0x4DE4, 0x9431, 0x21EA, 0x9432, 0x49B8,
+ 0x9433, 0x4314, 0x9434, 0x3B92, 0x9435, 0x1B7F, 0x9436, 0x1B7D,
+ 0x9438, 0x0B58, 0x943A, 0x1B81, 0x943B, 0x49B9, 0x943F, 0x3B93,
+ 0x9441, 0x1B82, 0x9444, 0x1B84, 0x9445, 0x21EB, 0x9448, 0x21EC,
+ 0x944A, 0x4315, 0x944C, 0x4DE5, 0x9451, 0x0611, 0x9452, 0x1B83,
+ 0x9453, 0x0F06, 0x9455, 0x3B94, 0x945A, 0x1B8F, 0x945B, 0x1B85,
+ 0x945E, 0x1B88, 0x9460, 0x1B86, 0x9462, 0x1B87, 0x9463, 0x4316,
+ 0x946A, 0x1B89, 0x946B, 0x3B95, 0x946D, 0x49BC, 0x946F, 0x49BD,
+ 0x9470, 0x1B8B, 0x9471, 0x4317, 0x9472, 0x3B96, 0x9475, 0x1B8C,
+ 0x9477, 0x1B8D, 0x947C, 0x1B90, 0x947D, 0x1B8E, 0x947E, 0x1B91,
+ 0x947F, 0x1B93, 0x9481, 0x1B92, 0x9577, 0x0BD5, 0x9578, 0x3B97,
+ 0x9579, 0x49BE, 0x9580, 0x0EF3, 0x9582, 0x1B94, 0x9583, 0x0AB0,
+ 0x9586, 0x49BF, 0x9587, 0x1B95, 0x9588, 0x4DE6, 0x9589, 0x0E14,
+ 0x958A, 0x1B96, 0x958B, 0x0589, 0x958C, 0x49C0, 0x958D, 0x49C1,
+ 0x958E, 0x4318, 0x958F, 0x04DE, 0x9591, 0x0613, 0x9592, 0x21ED,
+ 0x9593, 0x0612, 0x9594, 0x1B97, 0x9596, 0x1B98, 0x9598, 0x1B99,
+ 0x9599, 0x1B9A, 0x959F, 0x4319, 0x95A0, 0x1B9B, 0x95A1, 0x4DE7,
+ 0x95A2, 0x0614, 0x95A3, 0x05B3, 0x95A4, 0x07F0, 0x95A5, 0x0D4A,
+ 0x95A6, 0x3B98, 0x95A7, 0x1B9D, 0x95A8, 0x1B9C, 0x95A9, 0x3B99,
+ 0x95AB, 0x4F59, 0x95AC, 0x431A, 0x95AD, 0x1B9E, 0x95B1, 0x3555,
+ 0x95B2, 0x04FE, 0x95B4, 0x3B9B, 0x95B6, 0x431B, 0x95B9, 0x1BA1,
+ 0x95BB, 0x1BA0, 0x95BC, 0x1B9F, 0x95BD, 0x3B9C, 0x95BE, 0x1BA2,
+ 0x95BF, 0x4DE8, 0x95C3, 0x1BA5, 0x95C6, 0x4DE9, 0x95C7, 0x048B,
+ 0x95C8, 0x49C4, 0x95C9, 0x4DEA, 0x95CA, 0x1BA3, 0x95CB, 0x431C,
+ 0x95CC, 0x1BA7, 0x95CD, 0x1BA6, 0x95D0, 0x431D, 0x95D1, 0x4DEB,
+ 0x95D2, 0x4DEC, 0x95D3, 0x431E, 0x95D4, 0x1BA9, 0x95D5, 0x1BA8,
+ 0x95D6, 0x1BAA, 0x95D8, 0x0C86, 0x95DA, 0x3B9D, 0x95DC, 0x1BAB,
+ 0x95DE, 0x4320, 0x95E0, 0x4DED, 0x95E1, 0x1BAC, 0x95E2, 0x1BAE,
+ 0x95E4, 0x4DEE, 0x95E5, 0x1BAD, 0x95E6, 0x4DEF, 0x961C, 0x0DDE,
+ 0x961D, 0x3B9E, 0x9621, 0x1BAF, 0x9624, 0x4DF0, 0x9628, 0x1BB0,
+ 0x962A, 0x0855, 0x962C, 0x49C7, 0x962E, 0x1BB1, 0x962F, 0x1BB2,
+ 0x9631, 0x4DF1, 0x9632, 0x0E77, 0x9633, 0x49C8, 0x9634, 0x49C9,
+ 0x9638, 0x4DF2, 0x963B, 0x0ACD, 0x963C, 0x49CB, 0x963D, 0x4DF3,
+ 0x963F, 0x0468, 0x9640, 0x0B2B, 0x9641, 0x3B9F, 0x9642, 0x1BB3,
+ 0x9644, 0x0DDF, 0x964B, 0x1BB6, 0x964C, 0x1BB4, 0x964D, 0x07F1,
+ 0x964F, 0x1BB5, 0x9650, 0x0776, 0x9654, 0x4DF4, 0x9658, 0x3BA0,
+ 0x965B, 0x0E15, 0x965C, 0x1BB8, 0x965D, 0x1BBA, 0x965E, 0x1BB9,
+ 0x965F, 0x1BBB, 0x9661, 0x49CC, 0x9662, 0x04C3, 0x9663, 0x0A1E,
+ 0x9664, 0x0986, 0x9665, 0x0615, 0x9666, 0x1BBC, 0x966A, 0x0D1C,
+ 0x966C, 0x1BBE, 0x9670, 0x04C4, 0x9672, 0x1BBD, 0x9673, 0x0BE0,
+ 0x9674, 0x4DF5, 0x9675, 0x0F95, 0x9676, 0x0C83, 0x9677, 0x1BB7,
+ 0x9678, 0x0F6E, 0x967A, 0x0765, 0x967B, 0x4DF6, 0x967D, 0x0F45,
+ 0x967F, 0x4DF7, 0x9681, 0x4DF8, 0x9682, 0x49CE, 0x9683, 0x4DF9,
+ 0x9684, 0x3BA1, 0x9685, 0x06F1, 0x9686, 0x0F7C, 0x9688, 0x06FE,
+ 0x9689, 0x4DFA, 0x968A, 0x0B42, 0x968B, 0x186C, 0x968D, 0x1BBF,
+ 0x968E, 0x058A, 0x968F, 0x0A35, 0x9694, 0x05B4, 0x9695, 0x1BC1,
+ 0x9696, 0x4DFB, 0x9697, 0x1BC2, 0x9698, 0x1BC0, 0x9699, 0x073A,
+ 0x969A, 0x49D0, 0x969B, 0x084D, 0x969C, 0x09CB, 0x969D, 0x21F0,
+ 0x96A0, 0x04C5, 0x96A3, 0x0FA1, 0x96A4, 0x3BA2, 0x96A5, 0x4321,
+ 0x96A7, 0x1BC4, 0x96A8, 0x1B0B, 0x96A9, 0x3BA3, 0x96AA, 0x1BC3,
+ 0x96AE, 0x4DFC, 0x96AF, 0x21F1, 0x96B0, 0x1BC7, 0x96B1, 0x1BC5,
+ 0x96B2, 0x1BC6, 0x96B3, 0x49D3, 0x96B4, 0x1BC8, 0x96B6, 0x1BC9,
+ 0x96B7, 0x0FB4, 0x96B8, 0x1BCA, 0x96B9, 0x1BCB, 0x96BA, 0x49D4,
+ 0x96BB, 0x0A6D, 0x96BC, 0x0D4F, 0x96BD, 0x49D5, 0x96C0, 0x0A43,
+ 0x96C1, 0x0623, 0x96C4, 0x0F24, 0x96C5, 0x056D, 0x96C6, 0x0942,
+ 0x96C7, 0x078F, 0x96C9, 0x1BCE, 0x96CB, 0x1BCD, 0x96CC, 0x08C1,
+ 0x96CD, 0x1BCF, 0x96CE, 0x1BCC, 0x96D1, 0x0876, 0x96D2, 0x3BA4,
+ 0x96D5, 0x1BD3, 0x96D6, 0x1992, 0x96D8, 0x49D8, 0x96D9, 0x10EB,
+ 0x96DA, 0x49D9, 0x96DB, 0x0A3D, 0x96DC, 0x1BD1, 0x96DD, 0x49DA,
+ 0x96DE, 0x3BA6, 0x96E2, 0x0F6D, 0x96E3, 0x0CC9, 0x96E8, 0x04CD,
+ 0x96E9, 0x3BA7, 0x96EA, 0x0A87, 0x96EB, 0x08E2, 0x96EF, 0x4322,
+ 0x96F0, 0x0E07, 0x96F1, 0x3BA8, 0x96F2, 0x04E2, 0x96F6, 0x0FB5,
+ 0x96F7, 0x0F55, 0x96F9, 0x1BD4, 0x96FB, 0x0C3F, 0x9700, 0x0927,
+ 0x9702, 0x3BA9, 0x9703, 0x4DFD, 0x9704, 0x1BD5, 0x9706, 0x1BD6,
+ 0x9707, 0x0A12, 0x9708, 0x1BD7, 0x9709, 0x3BAA, 0x970A, 0x0FB6,
+ 0x970D, 0x1BD2, 0x970E, 0x1BD9, 0x970F, 0x1BDB, 0x9711, 0x1BDA,
+ 0x9713, 0x1BD8, 0x9714, 0x49DC, 0x9716, 0x1BDC, 0x9719, 0x1BDD,
+ 0x971B, 0x4DFE, 0x971C, 0x0AFC, 0x971E, 0x0562, 0x9721, 0x4DFF,
+ 0x9722, 0x4E00, 0x9723, 0x49DD, 0x9724, 0x1BDE, 0x9727, 0x0EC4,
+ 0x9728, 0x4E01, 0x972A, 0x1BDF, 0x9730, 0x1BE0, 0x9731, 0x4E02,
+ 0x9732, 0x0FD0, 0x9733, 0x21F2, 0x9736, 0x49DF, 0x9738, 0x1414,
+ 0x9739, 0x1BE1, 0x973B, 0x21F3, 0x973D, 0x1BE2, 0x973E, 0x1BE3,
+ 0x9741, 0x49E0, 0x9742, 0x1BE7, 0x9743, 0x21F4, 0x9744, 0x1BE4,
+ 0x9746, 0x1BE5, 0x9747, 0x49E1, 0x9748, 0x1BE6, 0x9749, 0x1BE8,
+ 0x974D, 0x21F5, 0x974E, 0x4323, 0x974F, 0x21F6, 0x9751, 0x21F7,
+ 0x9752, 0x0A68, 0x9755, 0x4F5A, 0x9756, 0x0F03, 0x9757, 0x49E2,
+ 0x9759, 0x0A69, 0x975A, 0x3BAB, 0x975B, 0x49E3, 0x975C, 0x1BE9,
+ 0x975E, 0x0D87, 0x9760, 0x1BEA, 0x9761, 0x1D06, 0x9762, 0x0ED8,
+ 0x9763, 0x3BAC, 0x9764, 0x1BEB, 0x9766, 0x1BEC, 0x9767, 0x4E03,
+ 0x9768, 0x1BED, 0x9769, 0x05B5, 0x976A, 0x49E4, 0x976B, 0x1BEF,
+ 0x976D, 0x0A1F, 0x976E, 0x3BAD, 0x9771, 0x1BF0, 0x9773, 0x3BAE,
+ 0x9774, 0x06FA, 0x9776, 0x4E04, 0x9779, 0x1BF1, 0x977A, 0x1BF5,
+ 0x977C, 0x1BF3, 0x977D, 0x4E05, 0x977F, 0x4E06, 0x9781, 0x1BF4,
+ 0x9784, 0x05D1, 0x9785, 0x1BF2, 0x9786, 0x1BF6, 0x978B, 0x1BF7,
+ 0x978D, 0x048C, 0x978F, 0x1BF8, 0x9790, 0x1BF9, 0x9795, 0x4324,
+ 0x9796, 0x49E7, 0x9798, 0x09CC, 0x9799, 0x4E07, 0x979A, 0x3BAF,
+ 0x979C, 0x1BFA, 0x979E, 0x49E8, 0x979F, 0x4E08, 0x97A0, 0x0661,
+ 0x97A2, 0x3BB0, 0x97A3, 0x1BFD, 0x97A6, 0x1BFC, 0x97A8, 0x1BFB,
+ 0x97AB, 0x1A34, 0x97AC, 0x4E09, 0x97AD, 0x0E2C, 0x97AE, 0x4325,
+ 0x97B1, 0x49E9, 0x97B2, 0x49EA, 0x97B3, 0x1BFE, 0x97B4, 0x1BFF,
+ 0x97B5, 0x3BB1, 0x97B6, 0x3BB2, 0x97B9, 0x4E0A, 0x97BA, 0x4326,
+ 0x97BE, 0x49EB, 0x97C1, 0x4327, 0x97C3, 0x1C00, 0x97C6, 0x1C01,
+ 0x97C8, 0x1C02, 0x97C9, 0x4328, 0x97CB, 0x1C03, 0x97CC, 0x49EC,
+ 0x97CD, 0x4E0B, 0x97D1, 0x49ED, 0x97D3, 0x0616, 0x97D4, 0x49EE,
+ 0x97D8, 0x49EF, 0x97D9, 0x3BB3, 0x97DB, 0x4329, 0x97DC, 0x1C04,
+ 0x97DE, 0x3BB4, 0x97E0, 0x4E0C, 0x97E1, 0x49F0, 0x97ED, 0x1C05,
+ 0x97EE, 0x0CD9, 0x97EF, 0x4E0D, 0x97F1, 0x49F1, 0x97F2, 0x1C07,
+ 0x97F3, 0x053B, 0x97F4, 0x3BB5, 0x97F5, 0x1C0A, 0x97F6, 0x1C09,
+ 0x97FB, 0x04C6, 0x97FF, 0x06B9, 0x9801, 0x0E17, 0x9802, 0x0BD6,
+ 0x9803, 0x0812, 0x9804, 0x49F2, 0x9805, 0x07F2, 0x9806, 0x0971,
+ 0x9807, 0x4E0E, 0x9808, 0x0A22, 0x980A, 0x3BB6, 0x980C, 0x1C0C,
+ 0x980D, 0x49F3, 0x980E, 0x3BB7, 0x980F, 0x1C0B, 0x9810, 0x0F2C,
+ 0x9811, 0x0624, 0x9812, 0x0D66, 0x9813, 0x0CB4, 0x9814, 0x49F4,
+ 0x9816, 0x49F5, 0x9817, 0x0A42, 0x9818, 0x0F96, 0x981A, 0x0731,
+ 0x981E, 0x3BB8, 0x9821, 0x1C0F, 0x9823, 0x3BB9, 0x9824, 0x1C0E,
+ 0x9825, 0x49FA, 0x9826, 0x4E0F, 0x982B, 0x3BBA, 0x982C, 0x0E79,
+ 0x982D, 0x0C84, 0x982E, 0x4E10, 0x9830, 0x1E73, 0x9832, 0x49F8,
+ 0x9833, 0x49F9, 0x9834, 0x04F2, 0x9837, 0x1C10, 0x9838, 0x1C0D,
+ 0x9839, 0x37B3, 0x983B, 0x0DC3, 0x983C, 0x0F54, 0x983D, 0x1C11,
+ 0x983E, 0x3BBB, 0x9846, 0x1C12, 0x9847, 0x49FB, 0x984B, 0x1C14,
+ 0x984C, 0x0B4A, 0x984D, 0x05B9, 0x984E, 0x05BA, 0x984F, 0x1C13,
+ 0x9852, 0x3BBC, 0x9853, 0x3BBD, 0x9854, 0x0625, 0x9855, 0x0766,
+ 0x9856, 0x432A, 0x9857, 0x21F9, 0x9858, 0x0626, 0x9859, 0x3BBE,
+ 0x985A, 0x1E48, 0x985B, 0x0C39, 0x985E, 0x0FA8, 0x9862, 0x4E11,
+ 0x9863, 0x4E12, 0x9865, 0x21FA, 0x9866, 0x49FC, 0x9867, 0x0790,
+ 0x986B, 0x1C15, 0x986C, 0x3BBF, 0x986F, 0x1C16, 0x9870, 0x1C17,
+ 0x9871, 0x1C18, 0x9873, 0x1C1A, 0x9874, 0x1C19, 0x98A8, 0x0DE9,
+ 0x98AA, 0x1C1B, 0x98AB, 0x49FD, 0x98AD, 0x49FE, 0x98AF, 0x1C1C,
+ 0x98B0, 0x49FF, 0x98B1, 0x1C1D, 0x98B4, 0x4E13, 0x98B6, 0x1C1E,
+ 0x98B7, 0x4A01, 0x98B8, 0x3BC0, 0x98BA, 0x3BC1, 0x98BB, 0x4A02,
+ 0x98BC, 0x4A03, 0x98BF, 0x3BC2, 0x98C2, 0x4A04, 0x98C3, 0x1C20,
+ 0x98C4, 0x1C1F, 0x98C5, 0x4E14, 0x98C6, 0x1C21, 0x98C7, 0x4A05,
+ 0x98C8, 0x3BC3, 0x98CB, 0x4A06, 0x98DB, 0x0D88, 0x98DC, 0x1839,
+ 0x98DF, 0x09EF, 0x98E0, 0x3618, 0x98E1, 0x4A07, 0x98E2, 0x064C,
+ 0x98E3, 0x4A08, 0x98E5, 0x3BC4, 0x98E7, 0x432B, 0x98E9, 0x1C22,
+ 0x98EA, 0x4A09, 0x98EB, 0x1C23, 0x98ED, 0x10C1, 0x98EE, 0x14DA,
+ 0x98EF, 0x0D67, 0x98F0, 0x4A0A, 0x98F1, 0x4A0B, 0x98F2, 0x04BF,
+ 0x98F3, 0x4A0C, 0x98F4, 0x047F, 0x98FC, 0x08C2, 0x98FD, 0x0E5E,
+ 0x98FE, 0x09E6, 0x9902, 0x4E15, 0x9903, 0x1C24, 0x9905, 0x0EEB,
+ 0x9908, 0x4A0D, 0x9909, 0x1C25, 0x990A, 0x0F46, 0x990C, 0x04E4,
+ 0x9910, 0x088F, 0x9911, 0x4E16, 0x9912, 0x1C26, 0x9913, 0x056E,
+ 0x9914, 0x1C27, 0x9915, 0x4E17, 0x9916, 0x4A10, 0x9917, 0x4A11,
+ 0x9918, 0x1C28, 0x991A, 0x4A13, 0x991B, 0x4A14, 0x991C, 0x4A15,
+ 0x991D, 0x1C2A, 0x991E, 0x1C2B, 0x9920, 0x1C2D, 0x9921, 0x1C29,
+ 0x9924, 0x1C2C, 0x9927, 0x21FD, 0x9928, 0x0617, 0x992C, 0x1C2E,
+ 0x992E, 0x1C2F, 0x9931, 0x4A17, 0x9932, 0x3BC5, 0x9933, 0x3BC6,
+ 0x9935, 0x4E18, 0x993A, 0x4A18, 0x993B, 0x4A19, 0x993C, 0x4A1A,
+ 0x993D, 0x1C30, 0x993E, 0x1C31, 0x9940, 0x3BC7, 0x9941, 0x4A1B,
+ 0x9942, 0x1C32, 0x9945, 0x1C34, 0x9946, 0x4A1C, 0x9948, 0x4E19,
+ 0x9949, 0x1C33, 0x994B, 0x1C36, 0x994C, 0x1C39, 0x994D, 0x3BC8,
+ 0x994E, 0x4A1D, 0x9950, 0x1C35, 0x9951, 0x1C37, 0x9952, 0x1C38,
+ 0x9954, 0x4E1A, 0x9955, 0x1C3A, 0x9957, 0x06BA, 0x9958, 0x432C,
+ 0x995C, 0x3BC9, 0x995E, 0x4E1B, 0x995F, 0x3BCA, 0x9960, 0x4A1E,
+ 0x9996, 0x091F, 0x9997, 0x1C3B, 0x9998, 0x1C3C, 0x9999, 0x07F3,
+ 0x999E, 0x21FF, 0x99A3, 0x4A1F, 0x99A5, 0x1C3D, 0x99A6, 0x4A20,
+ 0x99A8, 0x059C, 0x99AC, 0x0D05, 0x99AD, 0x1C3E, 0x99AE, 0x1C3F,
+ 0x99B1, 0x3BCB, 0x99B3, 0x0B98, 0x99B4, 0x0CC3, 0x99B9, 0x3BCC,
+ 0x99BA, 0x3BCD, 0x99BC, 0x1C40, 0x99BD, 0x4A21, 0x99BF, 0x4A22,
+ 0x99C1, 0x0D33, 0x99C3, 0x4A23, 0x99C4, 0x0B2C, 0x99C5, 0x04FA,
+ 0x99C6, 0x06E6, 0x99C8, 0x06E7, 0x99C9, 0x3BCE, 0x99D0, 0x0BB1,
+ 0x99D1, 0x1C45, 0x99D2, 0x06E8, 0x99D4, 0x4A24, 0x99D5, 0x056F,
+ 0x99D8, 0x1C44, 0x99D9, 0x4A25, 0x99DB, 0x1C42, 0x99DD, 0x1C43,
+ 0x99DE, 0x4A26, 0x99DF, 0x1C41, 0x99E1, 0x4E1C, 0x99E2, 0x1C4F,
+ 0x99ED, 0x1C46, 0x99EE, 0x1C47, 0x99F0, 0x4A28, 0x99F1, 0x1C48,
+ 0x99F2, 0x1C49, 0x99F8, 0x1C4B, 0x99F9, 0x4A29, 0x99FB, 0x1C4A,
+ 0x99FC, 0x4A2A, 0x99FF, 0x0963, 0x9A01, 0x1C4C, 0x9A02, 0x3BCF,
+ 0x9A03, 0x432D, 0x9A05, 0x1C4E, 0x9A08, 0x37BA, 0x9A0A, 0x4A2B,
+ 0x9A0C, 0x4E1D, 0x9A0E, 0x064D, 0x9A0F, 0x1C4D, 0x9A10, 0x4E1E,
+ 0x9A11, 0x4A2C, 0x9A12, 0x0AFD, 0x9A13, 0x0767, 0x9A16, 0x3BD0,
+ 0x9A19, 0x1C50, 0x9A1A, 0x4A2D, 0x9A20, 0x4A2E, 0x9A23, 0x4E1F,
+ 0x9A24, 0x3BD1, 0x9A27, 0x3BD2, 0x9A28, 0x0B2D, 0x9A2B, 0x1C51,
+ 0x9A2D, 0x3BD3, 0x9A2E, 0x3BD4, 0x9A30, 0x0C85, 0x9A31, 0x4A2F,
+ 0x9A36, 0x3BD5, 0x9A37, 0x1C52, 0x9A38, 0x3BD6, 0x9A3E, 0x1C57,
+ 0x9A40, 0x1C55, 0x9A41, 0x4E20, 0x9A42, 0x1C54, 0x9A43, 0x1C56,
+ 0x9A44, 0x4A30, 0x9A45, 0x1C53, 0x9A4A, 0x3BD7, 0x9A4C, 0x4A31,
+ 0x9A4D, 0x1C59, 0x9A4E, 0x2200, 0x9A51, 0x4E21, 0x9A52, 0x1E2F,
+ 0x9A55, 0x1C58, 0x9A56, 0x3BD8, 0x9A57, 0x1C5B, 0x9A58, 0x4A32,
+ 0x9A5A, 0x06BB, 0x9A5B, 0x1C5A, 0x9A5F, 0x1C5C, 0x9A62, 0x1C5D,
+ 0x9A64, 0x1C5F, 0x9A65, 0x1C5E, 0x9A69, 0x1C60, 0x9A6A, 0x1C62,
+ 0x9A6B, 0x1C61, 0x9AA8, 0x080E, 0x9AAD, 0x1C63, 0x9AAF, 0x4A34,
+ 0x9AB0, 0x1C64, 0x9AB5, 0x3BD9, 0x9AB6, 0x3BDA, 0x9AB7, 0x4A36,
+ 0x9AB8, 0x059A, 0x9AB9, 0x4A38, 0x9ABC, 0x1C65, 0x9ABD, 0x4E22,
+ 0x9ABE, 0x4E23, 0x9AC0, 0x1C66, 0x9AC1, 0x432E, 0x9AC3, 0x432F,
+ 0x9AC4, 0x0A37, 0x9AC6, 0x4A3A, 0x9ACE, 0x4330, 0x9ACF, 0x1C67,
+ 0x9AD0, 0x4A3B, 0x9AD1, 0x1C68, 0x9AD2, 0x4A3C, 0x9AD3, 0x1C69,
+ 0x9AD4, 0x1C6A, 0x9AD5, 0x4A3D, 0x9AD6, 0x4331, 0x9AD8, 0x07F4,
+ 0x9AD9, 0x2201, 0x9ADC, 0x2202, 0x9ADE, 0x1C6B, 0x9ADF, 0x1C6C,
+ 0x9AE0, 0x4A3E, 0x9AE2, 0x1C6D, 0x9AE3, 0x1C6E, 0x9AE5, 0x4A3F,
+ 0x9AE6, 0x1C6F, 0x9AE9, 0x4A40, 0x9AEA, 0x0D45, 0x9AEB, 0x1C71,
+ 0x9AED, 0x0D98, 0x9AEE, 0x1C72, 0x9AEF, 0x1C70, 0x9AF1, 0x1C74,
+ 0x9AF4, 0x1C73, 0x9AF7, 0x1C75, 0x9AF9, 0x3BDB, 0x9AFB, 0x1C76,
+ 0x9B01, 0x4E24, 0x9B02, 0x4332, 0x9B03, 0x3BDC, 0x9B06, 0x1C77,
+ 0x9B08, 0x4333, 0x9B09, 0x4E25, 0x9B0B, 0x4E26, 0x9B0C, 0x4A41,
+ 0x9B0D, 0x4E27, 0x9B0E, 0x4E28, 0x9B10, 0x4A42, 0x9B12, 0x4A43,
+ 0x9B16, 0x4A44, 0x9B18, 0x1C78, 0x9B19, 0x4E29, 0x9B1A, 0x1C79,
+ 0x9B1C, 0x4A45, 0x9B1D, 0x4F49, 0x9B1F, 0x1C7A, 0x9B20, 0x3BDD,
+ 0x9B22, 0x1C7B, 0x9B23, 0x1C7C, 0x9B25, 0x1C7D, 0x9B27, 0x1C7E,
+ 0x9B28, 0x1C7F, 0x9B29, 0x1C80, 0x9B2A, 0x1C81, 0x9B2B, 0x4A46,
+ 0x9B2C, 0x4F4A, 0x9B2D, 0x4335, 0x9B2E, 0x1C82, 0x9B2F, 0x1C83,
+ 0x9B31, 0x14D4, 0x9B32, 0x1C84, 0x9B33, 0x3BDE, 0x9B34, 0x3BDF,
+ 0x9B35, 0x4E2A, 0x9B3B, 0x17A9, 0x9B3C, 0x064E, 0x9B3D, 0x4A47,
+ 0x9B41, 0x057F, 0x9B42, 0x0822, 0x9B43, 0x1C86, 0x9B44, 0x1C85,
+ 0x9B45, 0x0EB1, 0x9B48, 0x4E2B, 0x9B4B, 0x4A49, 0x9B4D, 0x1C88,
+ 0x9B4E, 0x1C89, 0x9B4F, 0x1C87, 0x9B51, 0x1C8A, 0x9B54, 0x0E90,
+ 0x9B55, 0x4E2C, 0x9B58, 0x1C8B, 0x9B5A, 0x0695, 0x9B5E, 0x4336,
+ 0x9B63, 0x4A4A, 0x9B65, 0x4A4B, 0x9B66, 0x4337, 0x9B68, 0x4E2D,
+ 0x9B6B, 0x4A4C, 0x9B6C, 0x4A4D, 0x9B6F, 0x0FCB, 0x9B72, 0x2204,
+ 0x9B73, 0x3BE0, 0x9B74, 0x1C8C, 0x9B75, 0x2203, 0x9B76, 0x4A4E,
+ 0x9B77, 0x4A4F, 0x9B79, 0x3BE1, 0x9B80, 0x4E2E, 0x9B83, 0x1C8E,
+ 0x9B84, 0x4338, 0x9B86, 0x4E2F, 0x9B8A, 0x4339, 0x9B8E, 0x0482,
+ 0x9B8F, 0x2205, 0x9B90, 0x4E30, 0x9B91, 0x1C8F, 0x9B92, 0x0DFB,
+ 0x9B93, 0x1C8D, 0x9B96, 0x1C90, 0x9B97, 0x1C91, 0x9B9D, 0x4E31,
+ 0x9B9E, 0x433A, 0x9B9F, 0x1C92, 0x9BA0, 0x1C93, 0x9BA6, 0x4A50,
+ 0x9BA7, 0x3BE2, 0x9BA8, 0x1C94, 0x9BAA, 0x0E9C, 0x9BAB, 0x087B,
+ 0x9BAC, 0x4A51, 0x9BAD, 0x086A, 0x9BAE, 0x0AB1, 0x9BB0, 0x4E32,
+ 0x9BB1, 0x2206, 0x9BB2, 0x4A53, 0x9BB4, 0x1C95, 0x9BB8, 0x4A54,
+ 0x9BB9, 0x1C98, 0x9BBB, 0x2207, 0x9BBE, 0x4A55, 0x9BBF, 0x4E33,
+ 0x9BC0, 0x1C96, 0x9BC1, 0x3BE3, 0x9BC6, 0x1C99, 0x9BC7, 0x3BE4,
+ 0x9BC8, 0x4E34, 0x9BC9, 0x07A5, 0x9BCA, 0x1C97, 0x9BCE, 0x433B,
+ 0x9BCF, 0x1C9A, 0x9BD1, 0x1C9B, 0x9BD2, 0x1C9C, 0x9BD4, 0x1CA0,
+ 0x9BD6, 0x0878, 0x9BD7, 0x3BE5, 0x9BD8, 0x4A57, 0x9BDB, 0x0B44,
+ 0x9BDD, 0x4A58, 0x9BDF, 0x37BF, 0x9BE1, 0x1CA1, 0x9BE2, 0x1C9E,
+ 0x9BE3, 0x1C9D, 0x9BE4, 0x1C9F, 0x9BE5, 0x433C, 0x9BE7, 0x3BE6,
+ 0x9BE8, 0x0735, 0x9BEA, 0x4A59, 0x9BEB, 0x3BE7, 0x9BEE, 0x4A5B,
+ 0x9BEF, 0x4A5A, 0x9BF0, 0x1CA5, 0x9BF1, 0x1CA4, 0x9BF2, 0x1CA3,
+ 0x9BF3, 0x4A56, 0x9BF5, 0x0477, 0x9BF7, 0x3BE8, 0x9BF8, 0x433D,
+ 0x9BFA, 0x3BE9, 0x9BFD, 0x3BEA, 0x9BFF, 0x4E35, 0x9C00, 0x2208,
+ 0x9C02, 0x4E36, 0x9C04, 0x1CAF, 0x9C06, 0x1CAB, 0x9C08, 0x1CAC,
+ 0x9C09, 0x1CA8, 0x9C0A, 0x1CAE, 0x9C0B, 0x3BEB, 0x9C0C, 0x1CAA,
+ 0x9C0D, 0x05C0, 0x9C10, 0x0FF2, 0x9C12, 0x1CAD, 0x9C13, 0x1CA9,
+ 0x9C14, 0x1CA7, 0x9C15, 0x1CA6, 0x9C16, 0x4A5F, 0x9C18, 0x4A60,
+ 0x9C19, 0x4A61, 0x9C1A, 0x4A62, 0x9C1B, 0x1CB1, 0x9C1C, 0x4E37,
+ 0x9C1D, 0x4A63, 0x9C21, 0x1CB4, 0x9C22, 0x4A64, 0x9C23, 0x433E,
+ 0x9C24, 0x1CB3, 0x9C25, 0x1CB2, 0x9C27, 0x3BEC, 0x9C29, 0x4A65,
+ 0x9C2A, 0x3BED, 0x9C2D, 0x0DBB, 0x9C2E, 0x1CB0, 0x9C2F, 0x04B7,
+ 0x9C30, 0x1CB5, 0x9C31, 0x4A67, 0x9C32, 0x1CB7, 0x9C35, 0x4E38,
+ 0x9C36, 0x3BEE, 0x9C37, 0x4A68, 0x9C39, 0x05CD, 0x9C3A, 0x1CA2,
+ 0x9C3B, 0x04D9, 0x9C3E, 0x1CB9, 0x9C41, 0x3BEF, 0x9C44, 0x4E39,
+ 0x9C45, 0x4A69, 0x9C46, 0x1CB8, 0x9C47, 0x1CB6, 0x9C48, 0x0B6B,
+ 0x9C49, 0x4A6C, 0x9C4A, 0x4A6D, 0x9C4F, 0x433F, 0x9C50, 0x4340,
+ 0x9C52, 0x0E9E, 0x9C53, 0x3BF0, 0x9C54, 0x4A6F, 0x9C56, 0x4E3A,
+ 0x9C57, 0x0FA2, 0x9C58, 0x4A70, 0x9C5A, 0x1CBA, 0x9C5B, 0x4A71,
+ 0x9C5C, 0x4A6A, 0x9C5D, 0x4A72, 0x9C5F, 0x4A73, 0x9C60, 0x1CBB,
+ 0x9C61, 0x4E3B, 0x9C63, 0x3BF1, 0x9C65, 0x4341, 0x9C67, 0x1CBC,
+ 0x9C68, 0x4E3C, 0x9C69, 0x4A74, 0x9C6A, 0x4A75, 0x9C6B, 0x4A76,
+ 0x9C6D, 0x4A77, 0x9C6E, 0x4A78, 0x9C70, 0x3BF2, 0x9C72, 0x4A79,
+ 0x9C75, 0x4A7A, 0x9C76, 0x1CBD, 0x9C77, 0x3BF3, 0x9C78, 0x1CBE,
+ 0x9C7A, 0x4A7B, 0x9CE5, 0x0BD7, 0x9CE6, 0x4A7C, 0x9CE7, 0x1CBF,
+ 0x9CE9, 0x0D4B, 0x9CEB, 0x1CC4, 0x9CEC, 0x1CC0, 0x9CF0, 0x1CC1,
+ 0x9CF2, 0x4A7D, 0x9CF3, 0x0E5F, 0x9CF4, 0x0ED0, 0x9CF6, 0x0CA8,
+ 0x9D02, 0x3BF4, 0x9D03, 0x1CC5, 0x9D06, 0x1CC6, 0x9D07, 0x0C96,
+ 0x9D08, 0x1CC3, 0x9D09, 0x1CC2, 0x9D0B, 0x4A7E, 0x9D0E, 0x052A,
+ 0x9D11, 0x4A80, 0x9D12, 0x1CCE, 0x9D15, 0x1CCD, 0x9D17, 0x4A81,
+ 0x9D18, 0x4A82, 0x9D1B, 0x0517, 0x9D1D, 0x4342, 0x9D1E, 0x4343,
+ 0x9D1F, 0x1CCB, 0x9D23, 0x1CCA, 0x9D26, 0x1CC8, 0x9D28, 0x05D9,
+ 0x9D2A, 0x1CC7, 0x9D2B, 0x08DE, 0x9D2C, 0x0529, 0x9D30, 0x4E3D,
+ 0x9D32, 0x4A86, 0x9D3B, 0x07F5, 0x9D3D, 0x4E3E, 0x9D3E, 0x1CD1,
+ 0x9D3F, 0x1CD0, 0x9D41, 0x1CCF, 0x9D42, 0x3BF5, 0x9D43, 0x4344,
+ 0x9D44, 0x1CCC, 0x9D46, 0x1CD2, 0x9D47, 0x3BF6, 0x9D48, 0x1CD3,
+ 0x9D4A, 0x4A88, 0x9D50, 0x1CD8, 0x9D51, 0x1CD7, 0x9D52, 0x4345,
+ 0x9D59, 0x1CD9, 0x9D5C, 0x04CF, 0x9D5D, 0x1CD4, 0x9D5E, 0x1CD5,
+ 0x9D5F, 0x4A89, 0x9D60, 0x0806, 0x9D61, 0x0EC5, 0x9D62, 0x4A8A,
+ 0x9D63, 0x3BF7, 0x9D64, 0x1CD6, 0x9D69, 0x3BF8, 0x9D6A, 0x4E3F,
+ 0x9D6B, 0x220A, 0x9D6C, 0x0E60, 0x9D6F, 0x1CDE, 0x9D70, 0x2209,
+ 0x9D72, 0x1CDA, 0x9D73, 0x4A8D, 0x9D76, 0x4A8E, 0x9D77, 0x4A8F,
+ 0x9D7A, 0x1CDF, 0x9D7B, 0x4E40, 0x9D7C, 0x3BF9, 0x9D7E, 0x3BFA,
+ 0x9D84, 0x4A90, 0x9D87, 0x1CDC, 0x9D89, 0x1CDB, 0x9D8A, 0x4346,
+ 0x9D8D, 0x3BFB, 0x9D8F, 0x0732, 0x9D96, 0x4347, 0x9D99, 0x4A91,
+ 0x9D9A, 0x1CE0, 0x9DA1, 0x4A92, 0x9DA4, 0x1CE1, 0x9DA9, 0x1CE2,
+ 0x9DAB, 0x1CDD, 0x9DAC, 0x4349, 0x9DAF, 0x1CC9, 0x9DB1, 0x3BFC,
+ 0x9DB2, 0x1CE3, 0x9DB4, 0x0BFD, 0x9DB5, 0x4A94, 0x9DB8, 0x1CE7,
+ 0x9DB9, 0x4A95, 0x9DBA, 0x1CE8, 0x9DBB, 0x1CE6, 0x9DBC, 0x434A,
+ 0x9DBD, 0x4A96, 0x9DBF, 0x4A93, 0x9DC0, 0x4348, 0x9DC1, 0x1CE5,
+ 0x9DC2, 0x1CEB, 0x9DC3, 0x3BFD, 0x9DC4, 0x1CE4, 0x9DC6, 0x1CE9,
+ 0x9DC7, 0x3BFE, 0x9DC9, 0x4A97, 0x9DCF, 0x1CEA, 0x9DD3, 0x1CED,
+ 0x9DD6, 0x3BFF, 0x9DD7, 0x1DDE, 0x9DD9, 0x1CEC, 0x9DDA, 0x4A98,
+ 0x9DDF, 0x3C00, 0x9DE0, 0x4A99, 0x9DE3, 0x4A9A, 0x9DE5, 0x4E41,
+ 0x9DE6, 0x1CEF, 0x9DE7, 0x434C, 0x9DE9, 0x4E42, 0x9DEB, 0x3C01,
+ 0x9DED, 0x1CF0, 0x9DEF, 0x1CF1, 0x9DF2, 0x0FEF, 0x9DF3, 0x4E43,
+ 0x9DF4, 0x3C02, 0x9DF8, 0x1CEE, 0x9DF9, 0x0B4B, 0x9DFA, 0x085D,
+ 0x9DFD, 0x1CF2, 0x9E02, 0x4A9D, 0x9E07, 0x434D, 0x9E0A, 0x4A9C,
+ 0x9E0D, 0x4A9E, 0x9E15, 0x3C03, 0x9E19, 0x220C, 0x9E1A, 0x1CF3,
+ 0x9E1B, 0x1CF4, 0x9E1C, 0x4A9F, 0x9E1D, 0x3C04, 0x9E1E, 0x1CF5,
+ 0x9E75, 0x1CF6, 0x9E78, 0x0768, 0x9E79, 0x1CF7, 0x9E7A, 0x4E44,
+ 0x9E7B, 0x4AA0, 0x9E7C, 0x1DFD, 0x9E7D, 0x1CF8, 0x9E7F, 0x08DB,
+ 0x9E80, 0x4AA2, 0x9E81, 0x1CF9, 0x9E82, 0x4E45, 0x9E83, 0x4E46,
+ 0x9E84, 0x4E47, 0x9E85, 0x4AA3, 0x9E88, 0x1CFA, 0x9E8B, 0x1CFB,
+ 0x9E8C, 0x1CFC, 0x9E91, 0x1CFF, 0x9E92, 0x1CFD, 0x9E93, 0x0FE2,
+ 0x9E95, 0x1CFE, 0x9E97, 0x0FB7, 0x9E9B, 0x4AA4, 0x9E9D, 0x1D00,
+ 0x9E9E, 0x434E, 0x9E9F, 0x0FA3, 0x9EA4, 0x3C05, 0x9EA5, 0x1D01,
+ 0x9EA6, 0x0D34, 0x9EA8, 0x3C06, 0x9EA9, 0x1D02, 0x9EAA, 0x1D04,
+ 0x9EAC, 0x3C07, 0x9EAD, 0x1D05, 0x9EAF, 0x434F, 0x9EB0, 0x4E48,
+ 0x9EB4, 0x1E02, 0x9EB5, 0x1E75, 0x9EB8, 0x1D03, 0x9EB9, 0x07FF,
+ 0x9EBA, 0x0ED9, 0x9EBB, 0x0E91, 0x9EBC, 0x1284, 0x9EBD, 0x4AA6,
+ 0x9EBE, 0x14FF, 0x9EBF, 0x0EA9, 0x9EC3, 0x340B, 0x9EC4, 0x052B,
+ 0x9ECC, 0x1D07, 0x9ECD, 0x066A, 0x9ECE, 0x1D08, 0x9ECF, 0x1D09,
+ 0x9ED0, 0x1D0A, 0x9ED1, 0x220D, 0x9ED2, 0x0807, 0x9ED4, 0x1D0B,
+ 0x9ED8, 0x160D, 0x9ED9, 0x0EE7, 0x9EDB, 0x0B43, 0x9EDC, 0x1D0C,
+ 0x9EDD, 0x1D0E, 0x9EDE, 0x1D0D, 0x9EDF, 0x4AA8, 0x9EE0, 0x1D0F,
+ 0x9EE4, 0x4E49, 0x9EE5, 0x1D10, 0x9EE7, 0x3C08, 0x9EE8, 0x1D11,
+ 0x9EEE, 0x3C09, 0x9EEF, 0x1D12, 0x9EF0, 0x4E4A, 0x9EF2, 0x4E4B,
+ 0x9EF4, 0x1D13, 0x9EF6, 0x1D14, 0x9EF7, 0x1D15, 0x9EF9, 0x1D16,
+ 0x9EFB, 0x1D17, 0x9EFC, 0x1D18, 0x9EFD, 0x1D19, 0x9EFF, 0x4AA9,
+ 0x9F02, 0x4AAA, 0x9F03, 0x4AAC, 0x9F07, 0x1D1A, 0x9F08, 0x1D1B,
+ 0x9F09, 0x4E4C, 0x9F0E, 0x0C1E, 0x9F0F, 0x4E4D, 0x9F10, 0x3C0A,
+ 0x9F12, 0x3C0B, 0x9F13, 0x0791, 0x9F14, 0x4E4E, 0x9F15, 0x1D1D,
+ 0x9F17, 0x3C0C, 0x9F19, 0x3C0D, 0x9F1B, 0x4E4F, 0x9F20, 0x0ACF,
+ 0x9F21, 0x1D1E, 0x9F22, 0x4E50, 0x9F26, 0x4E51, 0x9F2A, 0x4E52,
+ 0x9F2B, 0x4E53, 0x9F2C, 0x1D1F, 0x9F2F, 0x3C0E, 0x9F34, 0x4E54,
+ 0x9F37, 0x3C0F, 0x9F39, 0x3C10, 0x9F3A, 0x4AAD, 0x9F3B, 0x0D93,
+ 0x9F3D, 0x4AAE, 0x9F3E, 0x1D20, 0x9F41, 0x3C11, 0x9F45, 0x3C12,
+ 0x9F46, 0x4AAF, 0x9F4A, 0x1D21, 0x9F4B, 0x170A, 0x9F4E, 0x1A7B,
+ 0x9F4F, 0x1C06, 0x9F52, 0x1D22, 0x9F53, 0x4AB0, 0x9F54, 0x1D23,
+ 0x9F55, 0x4AB1, 0x9F57, 0x3C13, 0x9F58, 0x4AB2, 0x9F5A, 0x4E55,
+ 0x9F5D, 0x4AB4, 0x9F5F, 0x1D25, 0x9F60, 0x1D26, 0x9F61, 0x1D27,
+ 0x9F62, 0x0FB8, 0x9F63, 0x1D24, 0x9F66, 0x1D28, 0x9F67, 0x1D29,
+ 0x9F68, 0x3C14, 0x9F69, 0x4AB6, 0x9F6A, 0x1D2B, 0x9F6C, 0x1D2A,
+ 0x9F6D, 0x4AB7, 0x9F6F, 0x4E56, 0x9F70, 0x4AB8, 0x9F71, 0x3C15,
+ 0x9F72, 0x1D2D, 0x9F75, 0x3C16, 0x9F76, 0x1D2E, 0x9F77, 0x1D2C,
+ 0x9F8D, 0x0F7E, 0x9F90, 0x3C17, 0x9F94, 0x3C18, 0x9F95, 0x1D2F,
+ 0x9F97, 0x4350, 0x9F9C, 0x1D30, 0x9F9D, 0x1727, 0x9F9E, 0x4E57,
+ 0x9FA0, 0x1D31, 0x9FA2, 0x3C19, 0x9FA5, 0x4E58, 0xF860, 0x3C54,
+ 0xF861, 0x3C55, 0xF862, 0x3C56, 0xF87A, 0x3C57, 0xF87F, 0x3C58,
+ 0xF909, 0x35AB, 0xF91D, 0x3450, 0xF91F, 0x3704, 0xF928, 0x4F4F,
+ 0xF929, 0x4F51, 0xF936, 0x3452, 0xF95F, 0x3693, 0xF970, 0x3420,
+ 0xF983, 0x3708, 0xF992, 0x1E81, 0xF993, 0x1E82, 0xF999, 0x1E83,
+ 0xF99A, 0x3711, 0xF9A2, 0x370F, 0xF9C3, 0x1E80, 0xF9D0, 0x3454,
+ 0xF9DC, 0x3451, 0xF9EC, 0x1E46, 0xFA03, 0x3684, 0xFA0E, 0x20DA,
+ 0xFA0F, 0x20E5, 0xFA10, 0x1E42, 0xFA11, 0x37D2, 0xFA12, 0x2121,
+ 0xFA13, 0x2131, 0xFA14, 0x2133, 0xFA15, 0x4F53, 0xFA16, 0x2164,
+ 0xFA17, 0x217B, 0xFA18, 0x2183, 0xFA19, 0x2184, 0xFA1A, 0x2185,
+ 0xFA1B, 0x2187, 0xFA1C, 0x218B, 0xFA1D, 0x218E, 0xFA1E, 0x2197,
+ 0xFA1F, 0x21A2, 0xFA20, 0x21A4, 0xFA21, 0x21A5, 0xFA22, 0x21AE,
+ 0xFA23, 0x21B6, 0xFA24, 0x4948, 0xFA25, 0x21B9, 0xFA26, 0x21BC,
+ 0xFA27, 0x21D8, 0xFA28, 0x21DF, 0xFA29, 0x21EF, 0xFA2A, 0x21FB,
+ 0xFA2B, 0x21FC, 0xFA2C, 0x21FE, 0xFA2D, 0x220B, 0xFA30, 0x3446,
+ 0xFA31, 0x3430, 0xFA32, 0x344D, 0xFA33, 0x3449, 0xFA34, 0x341A,
+ 0xFA35, 0x3442, 0xFA36, 0x1DE3, 0xFA37, 0x3436, 0xFA38, 0x3415,
+ 0xFA39, 0x3448, 0xFA3A, 0x344B, 0xFA3B, 0x3431, 0xFA3C, 0x41C5,
+ 0xFA3D, 0x340E, 0xFA3E, 0x3410, 0xFA3F, 0x3433, 0xFA40, 0x3439,
+ 0xFA41, 0x3445, 0xFA42, 0x3416, 0xFA43, 0x3428, 0xFA44, 0x343F,
+ 0xFA45, 0x340F, 0xFA46, 0x1E14, 0xFA47, 0x3414, 0xFA48, 0x3423,
+ 0xFA49, 0x3C26, 0xFA4A, 0x1E34, 0xFA4B, 0x3443, 0xFA4C, 0x3424,
+ 0xFA4D, 0x3421, 0xFA4E, 0x3417, 0xFA4F, 0x344F, 0xFA50, 0x342F,
+ 0xFA51, 0x3427, 0xFA52, 0x340D, 0xFA53, 0x343B, 0xFA54, 0x341F,
+ 0xFA55, 0x343D, 0xFA56, 0x342E, 0xFA57, 0x3457, 0xFA58, 0x47BE,
+ 0xFA59, 0x3440, 0xFA5A, 0x3429, 0xFA5B, 0x3425, 0xFA5C, 0x3426,
+ 0xFA5D, 0x3777, 0xFA5E, 0x3776, 0xFA5F, 0x3437, 0xFA60, 0x3413,
+ 0xFA61, 0x3422, 0xFA62, 0x3409, 0xFA63, 0x341B, 0xFA64, 0x3444,
+ 0xFA65, 0x3434, 0xFA66, 0x3C2B, 0xFA67, 0x3408, 0xFA68, 0x343E,
+ 0xFA69, 0x3419, 0xFA6A, 0x1E6C, 0xFB00, 0x248E, 0xFB01, 0x0070,
+ 0xFB02, 0x0071, 0xFB03, 0x248F, 0xFB04, 0x2490, 0xFE30, 0x1EDA,
+ 0xFE31, 0x1ED4, 0xFE32, 0x1ED5, 0xFE33, 0x1ED2, 0xFE35, 0x1EDB,
+ 0xFE36, 0x1EDC, 0xFE37, 0x1EE1, 0xFE38, 0x1EE2, 0xFE39, 0x1EDD,
+ 0xFE3A, 0x1EDE, 0xFE3B, 0x1EEB, 0xFE3C, 0x1EEC, 0xFE3D, 0x1EE5,
+ 0xFE3E, 0x1EE6, 0xFE3F, 0x1EE3, 0xFE40, 0x1EE4, 0xFE41, 0x1EE7,
+ 0xFE42, 0x1EE8, 0xFE43, 0x1EE9, 0xFE44, 0x1EEA, 0xFE45, 0x315F,
+ 0xFE46, 0x3160, 0xFE47, 0x1EDF, 0xFE48, 0x1EE0, 0xFF01, 0x0282,
+ 0xFF02, 0x1F47, 0xFF03, 0x02CC, 0xFF04, 0x02C8, 0xFF05, 0x02CB,
+ 0xFF06, 0x02CD, 0xFF07, 0x1F46, 0xFF08, 0x02A2, 0xFF09, 0x02A3,
+ 0xFF0A, 0x02CE, 0xFF0B, 0x02B4, 0xFF0C, 0x027C, 0xFF0D, 0x02B5,
+ 0xFF0E, 0x027D, 0xFF0F, 0x0297, 0xFF10, 0x030C, 0xFF11, 0x030D,
+ 0xFF12, 0x030E, 0xFF13, 0x030F, 0xFF14, 0x0310, 0xFF15, 0x0311,
+ 0xFF16, 0x0312, 0xFF17, 0x0313, 0xFF18, 0x0314, 0xFF19, 0x0315,
+ 0xFF1A, 0x027F, 0xFF1B, 0x0280, 0xFF1C, 0x02BB, 0xFF1D, 0x02B9,
+ 0xFF1E, 0x02BC, 0xFF1F, 0x0281, 0xFF20, 0x02CF, 0xFF21, 0x0316,
+ 0xFF22, 0x0317, 0xFF23, 0x0318, 0xFF24, 0x0319, 0xFF25, 0x031A,
+ 0xFF26, 0x031B, 0xFF27, 0x031C, 0xFF28, 0x031D, 0xFF29, 0x031E,
+ 0xFF2A, 0x031F, 0xFF2B, 0x0320, 0xFF2C, 0x0321, 0xFF2D, 0x0322,
+ 0xFF2E, 0x0323, 0xFF2F, 0x0324, 0xFF30, 0x0325, 0xFF31, 0x0326,
+ 0xFF32, 0x0327, 0xFF33, 0x0328, 0xFF34, 0x0329, 0xFF35, 0x032A,
+ 0xFF36, 0x032B, 0xFF37, 0x032C, 0xFF38, 0x032D, 0xFF39, 0x032E,
+ 0xFF3A, 0x032F, 0xFF3B, 0x02A6, 0xFF3C, 0x0298, 0xFF3D, 0x02A7,
+ 0xFF3E, 0x0288, 0xFF3F, 0x028A, 0xFF40, 0x0286, 0xFF41, 0x0330,
+ 0xFF42, 0x0331, 0xFF43, 0x0332, 0xFF44, 0x0333, 0xFF45, 0x0334,
+ 0xFF46, 0x0335, 0xFF47, 0x0336, 0xFF48, 0x0337, 0xFF49, 0x0338,
+ 0xFF4A, 0x0339, 0xFF4B, 0x033A, 0xFF4C, 0x033B, 0xFF4D, 0x033C,
+ 0xFF4E, 0x033D, 0xFF4F, 0x033E, 0xFF50, 0x033F, 0xFF51, 0x0340,
+ 0xFF52, 0x0341, 0xFF53, 0x0342, 0xFF54, 0x0343, 0xFF55, 0x0344,
+ 0xFF56, 0x0345, 0xFF57, 0x0346, 0xFF58, 0x0347, 0xFF59, 0x0348,
+ 0xFF5A, 0x0349, 0xFF5B, 0x02A8, 0xFF5C, 0x029B, 0xFF5D, 0x02A9,
+ 0xFF5E, 0x0299, 0xFF5F, 0x2F63, 0xFF60, 0x2F64, 0xFF61, 0x0147,
+ 0xFF62, 0x0148, 0xFF63, 0x0149, 0xFF64, 0x014A, 0xFF65, 0x014B,
+ 0xFF66, 0x014C, 0xFF67, 0x014D, 0xFF68, 0x014E, 0xFF69, 0x014F,
+ 0xFF6A, 0x0150, 0xFF6B, 0x0151, 0xFF6C, 0x0152, 0xFF6D, 0x0153,
+ 0xFF6E, 0x0154, 0xFF6F, 0x0155, 0xFF70, 0x0156, 0xFF71, 0x0157,
+ 0xFF72, 0x0158, 0xFF73, 0x0159, 0xFF74, 0x015A, 0xFF75, 0x015B,
+ 0xFF76, 0x015C, 0xFF77, 0x015D, 0xFF78, 0x015E, 0xFF79, 0x015F,
+ 0xFF7A, 0x0160, 0xFF7B, 0x0161, 0xFF7C, 0x0162, 0xFF7D, 0x0163,
+ 0xFF7E, 0x0164, 0xFF7F, 0x0165, 0xFF80, 0x0166, 0xFF81, 0x0167,
+ 0xFF82, 0x0168, 0xFF83, 0x0169, 0xFF84, 0x016A, 0xFF85, 0x016B,
+ 0xFF86, 0x016C, 0xFF87, 0x016D, 0xFF88, 0x016E, 0xFF89, 0x016F,
+ 0xFF8A, 0x0170, 0xFF8B, 0x0171, 0xFF8C, 0x0172, 0xFF8D, 0x0173,
+ 0xFF8E, 0x0174, 0xFF8F, 0x0175, 0xFF90, 0x0176, 0xFF91, 0x0177,
+ 0xFF92, 0x0178, 0xFF93, 0x0179, 0xFF94, 0x017A, 0xFF95, 0x017B,
+ 0xFF96, 0x017C, 0xFF97, 0x017D, 0xFF98, 0x017E, 0xFF99, 0x017F,
+ 0xFF9A, 0x0180, 0xFF9B, 0x0181, 0xFF9C, 0x0182, 0xFF9D, 0x0183,
+ 0xFF9E, 0x0184, 0xFF9F, 0x0185, 0xFFE0, 0x02C9, 0xFFE1, 0x02CA,
+ 0xFFE2, 0x02EF, 0xFFE3, 0x0289, 0xFFE4, 0x1F45, 0xFFE5, 0x02C7,
+ 0xFFE8, 0x0143,
+};
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_H_5_DWord[384 * 3] = {
+ 0xD840, 0xDC0B, 0x360F, 0xD840, 0xDC89, 0x4351, 0xD840, 0xDC8A, 0x371C,
+ 0xD840, 0xDCA2, 0x4358, 0xD840, 0xDCA4, 0x435B, 0xD840, 0xDCB0, 0x3781,
+ 0xD840, 0xDCF5, 0x4E59, 0xD840, 0xDD58, 0x4E6B, 0xD840, 0xDDA2, 0x3621,
+ 0xD840, 0xDE13, 0x436B, 0xD840, 0xDF2B, 0x4382, 0xD840, 0xDF71, 0x438B,
+ 0xD840, 0xDF81, 0x4389, 0xD840, 0xDFF9, 0x438F, 0xD841, 0xDC4A, 0x4391,
+ 0xD841, 0xDD09, 0x4393, 0xD841, 0xDDB1, 0x4E70, 0xD841, 0xDDD6, 0x439C,
+ 0xD841, 0xDE11, 0x37D6, 0xD841, 0xDE28, 0x3719, 0xD841, 0xDEEC, 0x4E73,
+ 0xD841, 0xDF4F, 0x43A0, 0xD842, 0xDC07, 0x43A7, 0xD842, 0xDC3A, 0x43A9,
+ 0xD842, 0xDCB9, 0x43AF, 0xD842, 0xDD0E, 0x34D3, 0xD842, 0xDD7C, 0x43B3,
+ 0xD842, 0xDD9D, 0x43B4, 0xD842, 0xDE64, 0x35BB, 0xD842, 0xDED3, 0x43B9,
+ 0xD842, 0xDF1D, 0x43BC, 0xD842, 0xDF9F, 0x35EB, 0xD842, 0xDFB7, 0x358A,
+ 0xD843, 0xDD45, 0x43CF, 0xD843, 0xDD58, 0x4E7A, 0xD843, 0xDDE1, 0x43DD,
+ 0xD843, 0xDE64, 0x43EC, 0xD843, 0xDE6D, 0x43E4, 0xD843, 0xDE95, 0x43E3,
+ 0xD843, 0xDF5F, 0x43EF, 0xD844, 0xDE01, 0x4406, 0xD844, 0xDE3D, 0x3681,
+ 0xD844, 0xDE55, 0x4407, 0xD844, 0xDE74, 0x440D, 0xD844, 0xDE7B, 0x4409,
+ 0xD844, 0xDED7, 0x4415, 0xD844, 0xDEE4, 0x4414, 0xD844, 0xDEFD, 0x441B,
+ 0xD844, 0xDF1B, 0x41B0, 0xD844, 0xDF36, 0x441D, 0xD844, 0xDF44, 0x441E,
+ 0xD844, 0xDFC4, 0x4429, 0xD845, 0xDC6D, 0x4436, 0xD845, 0xDC6E, 0x41B5,
+ 0xD845, 0xDDD7, 0x4440, 0xD845, 0xDE47, 0x4448, 0xD845, 0xDEB4, 0x41C6,
+ 0xD845, 0xDF06, 0x4454, 0xD845, 0xDF42, 0x4455, 0xD846, 0xDCBD, 0x41C1,
+ 0xD846, 0xDDC3, 0x4475, 0xD846, 0xDE1A, 0x1E91, 0xD847, 0xDC56, 0x4483,
+ 0xD847, 0xDD2D, 0x4488, 0xD847, 0xDD45, 0x4489, 0xD847, 0xDD62, 0x448B,
+ 0xD847, 0xDD78, 0x448A, 0xD847, 0xDD92, 0x4494, 0xD847, 0xDD9C, 0x4490,
+ 0xD847, 0xDDA1, 0x448F, 0xD847, 0xDDB7, 0x4497, 0xD847, 0xDDE0, 0x4499,
+ 0xD847, 0xDE33, 0x449A, 0xD847, 0xDE34, 0x41CD, 0xD847, 0xDF1E, 0x44A7,
+ 0xD847, 0xDF76, 0x44AE, 0xD847, 0xDFFA, 0x44B1, 0xD848, 0xDD7B, 0x44BF,
+ 0xD848, 0xDE18, 0x4AA1, 0xD848, 0xDF1E, 0x44C5, 0xD848, 0xDFAD, 0x44C8,
+ 0xD849, 0xDE09, 0x3C53, 0xD849, 0xDEF3, 0x44E0, 0xD84A, 0xDC5B, 0x44EF,
+ 0xD84A, 0xDCAB, 0x44F5, 0xD84A, 0xDD8F, 0x44F9, 0xD84A, 0xDEB8, 0x4503,
+ 0xD84A, 0xDF46, 0x4510, 0xD84A, 0xDF4F, 0x4507, 0xD84A, 0xDF50, 0x4508,
+ 0xD84A, 0xDFA6, 0x4513, 0xD84B, 0xDC1D, 0x4512, 0xD84B, 0xDC24, 0x4516,
+ 0xD84B, 0xDDE1, 0x452E, 0xD84B, 0xDE42, 0x4E9C, 0xD84B, 0xDFEB, 0x4EA2,
+ 0xD84C, 0xDDB6, 0x4550, 0xD84C, 0xDDC3, 0x454E, 0xD84C, 0xDDC4, 0x41F8,
+ 0xD84C, 0xDDF5, 0x454F, 0xD84C, 0xDF72, 0x4561, 0xD84C, 0xDFD0, 0x4568,
+ 0xD84C, 0xDFD2, 0x4564, 0xD84C, 0xDFD3, 0x4563, 0xD84C, 0xDFD5, 0x456A,
+ 0xD84C, 0xDFDA, 0x456C, 0xD84C, 0xDFDF, 0x456E, 0xD84C, 0xDFE4, 0x4569,
+ 0xD84C, 0xDFFE, 0x3C3E, 0xD84D, 0xDC4A, 0x4576, 0xD84D, 0xDC4B, 0x4578,
+ 0xD84D, 0xDC51, 0x4577, 0xD84D, 0xDC65, 0x457C, 0xD84D, 0xDCE4, 0x4596,
+ 0xD84D, 0xDD5A, 0x4597, 0xD84D, 0xDD94, 0x45A3, 0xD84D, 0xDDC4, 0x4209,
+ 0xD84D, 0xDE38, 0x45B3, 0xD84D, 0xDE39, 0x45B1, 0xD84D, 0xDE3A, 0x3C21,
+ 0xD84D, 0xDE47, 0x45B2, 0xD84D, 0xDF0C, 0x45C7, 0xD84D, 0xDF1C, 0x45BE,
+ 0xD84D, 0xDF3F, 0x4212, 0xD84D, 0xDF63, 0x4214, 0xD84D, 0xDF64, 0x45CB,
+ 0xD84D, 0xDFE7, 0x45D3, 0xD84D, 0xDFFF, 0x45D2, 0xD84E, 0xDC24, 0x45D8,
+ 0xD84E, 0xDC3D, 0x45DD, 0xD84E, 0xDE98, 0x45E9, 0xD84F, 0xDC7F, 0x45F6,
+ 0xD84F, 0xDCBE, 0x37D5, 0xD84F, 0xDCFE, 0x3650, 0xD84F, 0xDD00, 0x4605,
+ 0xD84F, 0xDD0E, 0x47DA, 0xD84F, 0xDD40, 0x4616, 0xD84F, 0xDDD3, 0x4619,
+ 0xD84F, 0xDDF9, 0x4618, 0xD84F, 0xDDFA, 0x4617, 0xD84F, 0xDF7E, 0x463F,
+ 0xD850, 0xDC4B, 0x4EC8, 0xD850, 0xDC96, 0x464E, 0xD850, 0xDD03, 0x4653,
+ 0xD850, 0xDDC6, 0x465F, 0xD850, 0xDDFE, 0x4662, 0xD850, 0xDEEE, 0x37CA,
+ 0xD850, 0xDFBC, 0x4677, 0xD850, 0xDFD0, 0x1E9E, 0xD851, 0xDE29, 0x4681,
+ 0xD851, 0xDEA5, 0x4687, 0xD851, 0xDFF1, 0x424A, 0xD852, 0xDC96, 0x469D,
+ 0xD852, 0xDE4D, 0x46B8, 0xD852, 0xDF56, 0x46C5, 0xD852, 0xDF6F, 0x46C7,
+ 0xD853, 0xDC16, 0x46CC, 0xD853, 0xDD14, 0x36AB, 0xD853, 0xDE04, 0x4E5A,
+ 0xD853, 0xDE0E, 0x46EE, 0xD853, 0xDE37, 0x46F2, 0xD853, 0xDE6A, 0x46F7,
+ 0xD853, 0xDE8B, 0x46FA, 0xD853, 0xDFF2, 0x4E5B, 0xD854, 0xDC4A, 0x4705,
+ 0xD854, 0xDC55, 0x4707, 0xD854, 0xDD22, 0x4709, 0xD854, 0xDDA9, 0x470E,
+ 0xD854, 0xDDCD, 0x4711, 0xD854, 0xDDE5, 0x4710, 0xD854, 0xDE1E, 0x4713,
+ 0xD854, 0xDE4C, 0x4715, 0xD855, 0xDC2E, 0x4721, 0xD855, 0xDC8E, 0x426D,
+ 0xD855, 0xDCD9, 0x4729, 0xD855, 0xDD0E, 0x4271, 0xD855, 0xDDA7, 0x4735,
+ 0xD855, 0xDE7F, 0x36FB, 0xD855, 0xDF71, 0x427A, 0xD855, 0xDFA9, 0x4748,
+ 0xD855, 0xDFB4, 0x4749, 0xD856, 0xDC74, 0x1DF6, 0xD856, 0xDDC4, 0x4280,
+ 0xD856, 0xDDCC, 0x4E90, 0xD856, 0xDDD4, 0x475C, 0xD856, 0xDEE3, 0x4765,
+ 0xD856, 0xDEE4, 0x4764, 0xD856, 0xDEF1, 0x4766, 0xD856, 0xDFB2, 0x4775,
+ 0xD857, 0xDC4B, 0x477E, 0xD857, 0xDC64, 0x477F, 0xD857, 0xDDA1, 0x4289,
+ 0xD857, 0xDE2E, 0x478E, 0xD857, 0xDE56, 0x478F, 0xD857, 0xDE62, 0x4792,
+ 0xD857, 0xDE65, 0x4790, 0xD857, 0xDEC2, 0x4797, 0xD857, 0xDED8, 0x4795,
+ 0xD857, 0xDEE8, 0x4799, 0xD857, 0xDF23, 0x479A, 0xD857, 0xDF5C, 0x479C,
+ 0xD857, 0xDFD4, 0x47A3, 0xD857, 0xDFE0, 0x47A2, 0xD857, 0xDFFB, 0x47A9,
+ 0xD858, 0xDC0C, 0x47A8, 0xD858, 0xDC17, 0x47B0, 0xD858, 0xDC60, 0x47B3,
+ 0xD858, 0xDCED, 0x47BD, 0xD858, 0xDE70, 0x47D1, 0xD858, 0xDE86, 0x47D2,
+ 0xD858, 0xDF4C, 0x4F57, 0xD859, 0xDC02, 0x47DE, 0xD859, 0xDE7E, 0x47F0,
+ 0xD859, 0xDEB0, 0x3714, 0xD859, 0xDF1D, 0x47FE, 0xD85A, 0xDCDD, 0x480C,
+ 0xD85A, 0xDCEA, 0x480E, 0xD85A, 0xDD51, 0x354E, 0xD85A, 0xDD6F, 0x4812,
+ 0xD85A, 0xDD99, 0x3736, 0xD85A, 0xDDDD, 0x4814, 0xD85A, 0xDE1E, 0x4817,
+ 0xD85A, 0xDE58, 0x481B, 0xD85A, 0xDE8C, 0x481F, 0xD85A, 0xDEB7, 0x4822,
+ 0xD85A, 0xDEFF, 0x42A7, 0xD85B, 0xDC29, 0x4446, 0xD85B, 0xDC73, 0x484A,
+ 0xD85B, 0xDC9E, 0x4EEE, 0xD85B, 0xDCDD, 0x4853, 0xD85B, 0xDE40, 0x42C1,
+ 0xD85B, 0xDE65, 0x4860, 0xD85B, 0xDF94, 0x4870, 0xD85B, 0xDFF6, 0x487A,
+ 0xD85B, 0xDFF7, 0x487B, 0xD85B, 0xDFF8, 0x4879, 0xD85C, 0xDCF4, 0x42CF,
+ 0xD85C, 0xDD0D, 0x488B, 0xD85C, 0xDD39, 0x488E, 0xD85C, 0xDFDA, 0x48B3,
+ 0xD85C, 0xDFDB, 0x48B2, 0xD85C, 0xDFFE, 0x48B9, 0xD85D, 0xDC10, 0x48BC,
+ 0xD85D, 0xDC49, 0x48C0, 0xD85D, 0xDE14, 0x48CE, 0xD85D, 0xDE15, 0x48CD,
+ 0xD85D, 0xDE31, 0x48D0, 0xD85D, 0xDE84, 0x42DD, 0xD85D, 0xDE93, 0x48D5,
+ 0xD85D, 0xDF0E, 0x48DA, 0xD85D, 0xDF23, 0x48DC, 0xD85D, 0xDF52, 0x48E0,
+ 0xD85E, 0xDD85, 0x48F0, 0xD85E, 0xDDB4, 0x4EA5, 0xD85E, 0xDE84, 0x48FC,
+ 0xD85E, 0xDFB3, 0x490B, 0xD85E, 0xDFBE, 0x490D, 0xD85E, 0xDFC7, 0x490E,
+ 0xD85F, 0xDC3C, 0x4EFC, 0xD85F, 0xDCB8, 0x4914, 0xD85F, 0xDD73, 0x4E5C,
+ 0xD85F, 0xDDA0, 0x491C, 0xD85F, 0xDE10, 0x491E, 0xD85F, 0xDFB7, 0x364A,
+ 0xD860, 0xDC8A, 0x4927, 0xD860, 0xDCBB, 0x492D, 0xD860, 0xDE77, 0x42F4,
+ 0xD860, 0xDE82, 0x4939, 0xD860, 0xDEF3, 0x493B, 0xD860, 0xDFCD, 0x42FA,
+ 0xD861, 0xDC0C, 0x4942, 0xD861, 0xDC55, 0x4945, 0xD861, 0xDD6B, 0x4952,
+ 0xD861, 0xDDC8, 0x4955, 0xD861, 0xDDC9, 0x4956, 0xD861, 0xDED7, 0x4960,
+ 0xD861, 0xDEFA, 0x4963, 0xD862, 0xDD46, 0x497C, 0xD862, 0xDD49, 0x497B,
+ 0xD862, 0xDD6B, 0x4981, 0xD862, 0xDD87, 0x37AD, 0xD862, 0xDD88, 0x4988,
+ 0xD862, 0xDDBA, 0x4992, 0xD862, 0xDDBB, 0x4993, 0xD862, 0xDE1E, 0x499B,
+ 0xD862, 0xDE29, 0x499C, 0xD862, 0xDE43, 0x49A0, 0xD862, 0xDE71, 0x499F,
+ 0xD862, 0xDE99, 0x49A7, 0xD862, 0xDECD, 0x49A8, 0xD862, 0xDEDD, 0x49AF,
+ 0xD862, 0xDEE4, 0x49AE, 0xD862, 0xDFC1, 0x49BA, 0xD862, 0xDFEF, 0x49BB,
+ 0xD863, 0xDCDD, 0x1DD9, 0xD863, 0xDD10, 0x49C2, 0xD863, 0xDD71, 0x49C3,
+ 0xD863, 0xDDFB, 0x49C5, 0xD863, 0xDE17, 0x37B0, 0xD863, 0xDE1F, 0x49C6,
+ 0xD863, 0xDE36, 0x49CA, 0xD863, 0xDE89, 0x49CD, 0xD863, 0xDEEB, 0x49CF,
+ 0xD863, 0xDEF6, 0x1DF9, 0xD863, 0xDF32, 0x49D1, 0xD863, 0xDFF8, 0x49D7,
+ 0xD864, 0xDEA0, 0x49E5, 0xD864, 0xDEB1, 0x49E6, 0xD865, 0xDC90, 0x49F7,
+ 0xD865, 0xDDCF, 0x4A00, 0xD865, 0xDE7F, 0x3619, 0xD865, 0xDEF0, 0x4A0F,
+ 0xD865, 0xDF19, 0x4A12, 0xD865, 0xDF50, 0x4A16, 0xD866, 0xDCC6, 0x4A27,
+ 0xD866, 0xDE72, 0x4A39, 0xD867, 0xDD4B, 0x3595, 0xD867, 0xDDDB, 0x4A52,
+ 0xD867, 0xDE15, 0x4A5C, 0xD867, 0xDE3D, 0x4F5B, 0xD867, 0xDE49, 0x4A5E,
+ 0xD867, 0xDE8A, 0x4A5D, 0xD867, 0xDEC4, 0x4A66, 0xD867, 0xDEDB, 0x4A6E,
+ 0xD867, 0xDEE9, 0x4A6B, 0xD867, 0xDFCE, 0x4A7F, 0xD867, 0xDFD7, 0x4A7F,
+ 0xD868, 0xDC1A, 0x4A85, 0xD868, 0xDC2F, 0x4A83, 0xD868, 0xDC82, 0x4A8C,
+ 0xD868, 0xDCF9, 0x4A8B, 0xD868, 0xDD90, 0x434B, 0xD868, 0xDEB2, 0x4E68,
+ 0xD868, 0xDF8C, 0x4AA5, 0xD869, 0xDC37, 0x4AA7, 0xD869, 0xDDF1, 0x4AB3,
+ 0xD869, 0xDE02, 0x4AB5, 0xD869, 0xDE1A, 0x4F5C, 0xD869, 0xDEB2, 0x4AB9,
+ 0xD87E, 0xDC04, 0x3C1C, 0xD87E, 0xDC0F, 0x1E86, 0xD87E, 0xDC15, 0x4E5D,
+ 0xD87E, 0xDC18, 0x1E89, 0xD87E, 0xDC1A, 0x3682, 0xD87E, 0xDC22, 0x3574,
+ 0xD87E, 0xDC28, 0x35EF, 0xD87E, 0xDC2C, 0x371D, 0xD87E, 0xDC33, 0x3597,
+ 0xD87E, 0xDC3F, 0x35F7, 0xD87E, 0xDC46, 0x4E5E, 0xD87E, 0xDC52, 0x3611,
+ 0xD87E, 0xDC62, 0x36AE, 0xD87E, 0xDC6D, 0x3729, 0xD87E, 0xDC73, 0x3608,
+ 0xD87E, 0xDC77, 0x1E4A, 0xD87E, 0xDC84, 0x1E36, 0xD87E, 0xDC99, 0x4E5F,
+ 0xD87E, 0xDC9A, 0x3668, 0xD87E, 0xDCA6, 0x4E60, 0xD87E, 0xDCAC, 0x35B6,
+ 0xD87E, 0xDCB2, 0x362B, 0xD87E, 0xDCB6, 0x3731, 0xD87E, 0xDCD3, 0x1E88,
+ 0xD87E, 0xDCDB, 0x373C, 0xD87E, 0xDCDC, 0x1E0F, 0xD87E, 0xDCE1, 0x37D3,
+ 0xD87E, 0xDCE5, 0x4E61, 0xD87E, 0xDCEA, 0x356F, 0xD87E, 0xDCED, 0x1DF1,
+ 0xD87E, 0xDCFC, 0x3558, 0xD87E, 0xDD03, 0x35C8, 0xD87E, 0xDD0B, 0x35E9,
+ 0xD87E, 0xDD0F, 0x366C, 0xD87E, 0xDD1A, 0x365C, 0xD87E, 0xDD20, 0x1E9F,
+ 0xD87E, 0xDD21, 0x35F1, 0xD87E, 0xDD45, 0x342D, 0xD87E, 0xDD47, 0x361E,
+ 0xD87E, 0xDD6C, 0x3764, 0xD87E, 0xDD95, 0x3566, 0xD87E, 0xDDD0, 0x36F4,
+ 0xD87E, 0xDDDE, 0x4E62, 0xD87E, 0xDDDF, 0x36F5, 0xD87E, 0xDDF4, 0x3BA5,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
new file mode 100644
index 0000000000..ac83c75aec
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp
@@ -0,0 +1,81 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniJIS_UTF16_V_5[289 * 2] = {
+ 0x00B0, 0x204D, 0x2010, 0x1ED5, 0x2015, 0x1ED4, 0x2016, 0x1ED7,
+ 0x2025, 0x1EDA, 0x2026, 0x1ED9, 0x2032, 0x2051, 0x2033, 0x205B,
+ 0x2190, 0x02E2, 0x2191, 0x02E0, 0x2192, 0x02E3, 0x2193, 0x02E1,
+ 0x21C4, 0x2077, 0x21C5, 0x2076, 0x21C6, 0x2078, 0x21E6, 0x1F4C,
+ 0x21E7, 0x1F4E, 0x21E8, 0x1F4B, 0x21E9, 0x1F4D, 0x239B, 0x2F74,
+ 0x239C, 0x2F88, 0x239D, 0x2F73, 0x239E, 0x2F76, 0x239F, 0x2F88,
+ 0x23A0, 0x2F75, 0x23A1, 0x2F7C, 0x23A2, 0x2F88, 0x23A3, 0x2F7B,
+ 0x23A4, 0x2F7E, 0x23A5, 0x2F88, 0x23A6, 0x2F7D, 0x23A7, 0x1FE8,
+ 0x23A8, 0x1FE7, 0x23A9, 0x1FE6, 0x23AA, 0x2F88, 0x23AB, 0x1FEC,
+ 0x23AC, 0x1FEB, 0x23AD, 0x1FEA, 0x23B0, 0x3FDE, 0x23B1, 0x3FDF,
+ 0x2500, 0x1D39, 0x2501, 0x1D3A, 0x2502, 0x1D37, 0x2503, 0x1D38,
+ 0x2504, 0x1D3D, 0x2505, 0x1D3E, 0x2506, 0x1D3B, 0x2507, 0x1D3C,
+ 0x2508, 0x1D41, 0x2509, 0x1D42, 0x250A, 0x1D3F, 0x250B, 0x1D40,
+ 0x250C, 0x1D47, 0x250D, 0x1D49, 0x250E, 0x1D48, 0x250F, 0x1D4A,
+ 0x2510, 0x1D4F, 0x2511, 0x1D51, 0x2512, 0x1D50, 0x2513, 0x1D52,
+ 0x2514, 0x1D43, 0x2515, 0x1D45, 0x2516, 0x1D44, 0x2517, 0x1D46,
+ 0x2518, 0x1D4B, 0x2519, 0x1D4D, 0x251A, 0x1D4C, 0x251B, 0x1D4E,
+ 0x251C, 0x1D63, 0x251D, 0x1D67, 0x251E, 0x1D65, 0x251F, 0x1D64,
+ 0x2520, 0x1D66, 0x2521, 0x1D69, 0x2522, 0x1D68, 0x2523, 0x1D6A,
+ 0x2524, 0x1D6B, 0x2525, 0x1D6F, 0x2526, 0x1D6D, 0x2527, 0x1D6C,
+ 0x2528, 0x1D6E, 0x2529, 0x1D71, 0x252A, 0x1D70, 0x252B, 0x1D72,
+ 0x252C, 0x1D5B, 0x252D, 0x1D5D, 0x252E, 0x1D5E, 0x252F, 0x1D5F,
+ 0x2530, 0x1D5C, 0x2531, 0x1D60, 0x2532, 0x1D61, 0x2533, 0x1D62,
+ 0x2534, 0x1D53, 0x2535, 0x1D55, 0x2536, 0x1D56, 0x2537, 0x1D57,
+ 0x2538, 0x1D54, 0x2539, 0x1D58, 0x253A, 0x1D59, 0x253B, 0x1D5A,
+ 0x253D, 0x1D77, 0x253E, 0x1D78, 0x253F, 0x1D79, 0x2540, 0x1D75,
+ 0x2541, 0x1D74, 0x2542, 0x1D76, 0x2543, 0x1D7B, 0x2544, 0x1D7D,
+ 0x2545, 0x1D7A, 0x2546, 0x1D7C, 0x2547, 0x1D81, 0x2548, 0x1D80,
+ 0x2549, 0x1D7E, 0x254A, 0x1D7F, 0x261C, 0x201D, 0x261D, 0x201B,
+ 0x261E, 0x201E, 0x261F, 0x201C, 0x2702, 0x2F92, 0x27A1, 0x2011,
+ 0x3001, 0x1ECF, 0x3002, 0x1ED0, 0x3008, 0x1EE3, 0x3009, 0x1EE4,
+ 0x300A, 0x1EE5, 0x300B, 0x1EE6, 0x300C, 0x1EE7, 0x300D, 0x1EE8,
+ 0x300E, 0x1EE9, 0x300F, 0x1EEA, 0x3010, 0x1EEB, 0x3011, 0x1EEC,
+ 0x3014, 0x1EDD, 0x3015, 0x1EDE, 0x3016, 0x3FC9, 0x3017, 0x3FCA,
+ 0x3018, 0x2F6B, 0x3019, 0x2F6C, 0x301C, 0x1ED6, 0x301D, 0x1F14,
+ 0x301F, 0x1F15, 0x303B, 0x2F4B, 0x3041, 0x1EEE, 0x3043, 0x1EEF,
+ 0x3045, 0x1EF0, 0x3047, 0x1EF1, 0x3049, 0x1EF2, 0x3063, 0x1EF3,
+ 0x3083, 0x1EF4, 0x3085, 0x1EF5, 0x3087, 0x1EF6, 0x308E, 0x1EF7,
+ 0x3095, 0x2048, 0x3096, 0x2049, 0x309B, 0x2050, 0x309C, 0x204F,
+ 0x30A0, 0x3FCB, 0x30A1, 0x1EF8, 0x30A3, 0x1EF9, 0x30A5, 0x1EFA,
+ 0x30A7, 0x1EFB, 0x30A9, 0x1EFC, 0x30C3, 0x1EFD, 0x30E3, 0x1EFE,
+ 0x30E5, 0x1EFF, 0x30E7, 0x1F00, 0x30EE, 0x1F01, 0x30F5, 0x1F02,
+ 0x30F6, 0x1F03, 0x30FC, 0x1ED3, 0x31F0, 0x3FCD, 0x31F1, 0x3FCE,
+ 0x31F2, 0x3FCF, 0x31F3, 0x3FD0, 0x31F4, 0x3FD1, 0x31F5, 0x3FD2,
+ 0x31F6, 0x3FD3, 0x31F7, 0x3FD4, 0x31F8, 0x3FD5, 0x31F9, 0x3FD6,
+ 0x31FA, 0x3FD8, 0x31FB, 0x3FD9, 0x31FC, 0x3FDA, 0x31FD, 0x3FDB,
+ 0x31FE, 0x3FDC, 0x31FF, 0x3FDD, 0x3300, 0x209E, 0x3301, 0x2EB6,
+ 0x3302, 0x2EB7, 0x3303, 0x2092, 0x3304, 0x2EB8, 0x3305, 0x208D,
+ 0x3306, 0x2EB9, 0x3307, 0x2EBD, 0x3308, 0x2EBB, 0x3309, 0x2EC0,
+ 0x330A, 0x2EBE, 0x330B, 0x2EC2, 0x330C, 0x2EC4, 0x330D, 0x1F0E,
+ 0x330E, 0x2EC5, 0x330F, 0x2EC6, 0x3310, 0x2EC7, 0x3311, 0x2EC8,
+ 0x3312, 0x2EC9, 0x3313, 0x2ECA, 0x3314, 0x1F05, 0x3315, 0x2094,
+ 0x3316, 0x208A, 0x3317, 0x2ECC, 0x3318, 0x2093, 0x3319, 0x2ECE,
+ 0x331A, 0x2ED0, 0x331B, 0x2ED1, 0x331C, 0x2ED2, 0x331D, 0x2ED3,
+ 0x331E, 0x20A1, 0x331F, 0x2ED4, 0x3320, 0x2ED5, 0x3321, 0x2ED6,
+ 0x3322, 0x2089, 0x3323, 0x209C, 0x3324, 0x2ED7, 0x3325, 0x2ED9,
+ 0x3326, 0x1F0F, 0x3327, 0x1F09, 0x3328, 0x2EDC, 0x3329, 0x2EDD,
+ 0x332A, 0x20A4, 0x332B, 0x1F11, 0x332D, 0x2EDF, 0x332E, 0x2EE2,
+ 0x332F, 0x2EE3, 0x3330, 0x2EE4, 0x3331, 0x20A6, 0x3332, 0x2EE5,
+ 0x3333, 0x208E, 0x3334, 0x2EE8, 0x3335, 0x2EE9, 0x3336, 0x1F0B,
+ 0x3337, 0x2EEE, 0x3338, 0x2EF0, 0x3339, 0x2097, 0x333A, 0x2EF1,
+ 0x333B, 0x209D, 0x333C, 0x2EEA, 0x333D, 0x2EF2, 0x333E, 0x2EF4,
+ 0x333F, 0x2EF5, 0x3340, 0x2EF6, 0x3341, 0x2EF3, 0x3342, 0x209B,
+ 0x3343, 0x2EF7, 0x3344, 0x2EF8, 0x3345, 0x2EF9, 0x3346, 0x2EFA,
+ 0x3347, 0x20A5, 0x3348, 0x2EFB, 0x3349, 0x1F04, 0x334A, 0x1F12,
+ 0x334B, 0x2EFC, 0x334C, 0x2EFD, 0x334D, 0x1F07, 0x334E, 0x2091,
+ 0x334F, 0x2EFE, 0x3350, 0x2EFF, 0x3351, 0x1F0C, 0x3352, 0x2F02,
+ 0x3353, 0x2F06, 0x3354, 0x2F03, 0x3355, 0x2F07, 0x3356, 0x2F08,
+ 0x3357, 0x2098, 0x337F, 0x2084, 0xFF08, 0x1EDB, 0xFF09, 0x1EDC,
+ 0xFF0C, 0x204C, 0xFF0E, 0x2052, 0xFF1D, 0x1EED, 0xFF3B, 0x1EDF,
+ 0xFF3D, 0x1EE0, 0xFF3F, 0x1ED2, 0xFF5B, 0x1EE1, 0xFF5C, 0x1ED8,
+ 0xFF5D, 0x1EE2, 0xFF5E, 0x1ED6, 0xFF5F, 0x2F6D, 0xFF60, 0x2F6E,
+ 0xFFE3, 0x1ED1,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp
new file mode 100644
index 0000000000..b9c00b6052
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_V_1[27 * 3] = {
+ 0x2122, 0x2123, 0x1ECF, 0x2131, 0x2132, 0x1ED1, 0x213C, 0x213E, 0x1ED3,
+ 0x2141, 0x2145, 0x1ED6, 0x214A, 0x215B, 0x1EDB, 0x2161, 0x2161, 0x1EED,
+ 0x2421, 0x2421, 0x1EEE, 0x2423, 0x2423, 0x1EEF, 0x2425, 0x2425, 0x1EF0,
+ 0x2427, 0x2427, 0x1EF1, 0x2429, 0x2429, 0x1EF2, 0x2443, 0x2443, 0x1EF3,
+ 0x2463, 0x2463, 0x1EF4, 0x2465, 0x2465, 0x1EF5, 0x2467, 0x2467, 0x1EF6,
+ 0x246E, 0x246E, 0x1EF7, 0x2521, 0x2521, 0x1EF8, 0x2523, 0x2523, 0x1EF9,
+ 0x2525, 0x2525, 0x1EFA, 0x2527, 0x2527, 0x1EFB, 0x2529, 0x2529, 0x1EFC,
+ 0x2543, 0x2543, 0x1EFD, 0x2563, 0x2563, 0x1EFE, 0x2565, 0x2565, 0x1EFF,
+ 0x2567, 0x2567, 0x1F00, 0x256E, 0x256E, 0x1F01, 0x2575, 0x2576, 0x1F02,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp b/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp
new file mode 100644
index 0000000000..80a47cc93f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp
@@ -0,0 +1,62 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_83pv_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_90ms_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_90ms_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_90msp_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_90msp_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_90pv_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_Add_RKSJ_H_1[];
+extern const FX_WORD g_FXCMAP_Add_RKSJ_V_1[];
+extern const FX_WORD g_FXCMAP_EUC_H_1[];
+extern const FX_WORD g_FXCMAP_EUC_V_1[];
+extern const FX_WORD g_FXCMAP_Ext_RKSJ_H_2[];
+extern const FX_WORD g_FXCMAP_Ext_RKSJ_V_2[];
+extern const FX_WORD g_FXCMAP_H_1[];
+extern const FX_WORD g_FXCMAP_V_1[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_H_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_V_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_H_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UCS2_HW_V_4[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_H_0_DWord[];
+extern const FX_WORD g_FXCMAP_UniJIS_UTF16_V_0[];
+extern const FX_WORD g_FXCMAP_Japan1CID2Unicode_4[];
+static const FXCMAP_CMap g_FXCMAP_Japan1_cmaps[] = {
+ { "83pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_83pv_RKSJ_H_1, 222, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "90ms-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_H_2, 171, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "90ms-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90ms_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "90msp-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_H_2, 170, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "90msp-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_90msp_RKSJ_V_2, 78, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "90pv-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_90pv_RKSJ_H_1, 263, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "Add-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_H_1, 635, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "Add-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Add_RKSJ_V_1, 57, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "EUC-H", FXCMAP_CMap::Range, g_FXCMAP_EUC_H_1, 120, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "EUC-V", FXCMAP_CMap::Range, g_FXCMAP_EUC_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "Ext-RKSJ-H", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_H_2, 665, FXCMAP_CMap::None, NULL, 0, -4 },
+ { "Ext-RKSJ-V", FXCMAP_CMap::Range, g_FXCMAP_Ext_RKSJ_V_2, 39, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "H", FXCMAP_CMap::Range, g_FXCMAP_H_1, 118, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "V", FXCMAP_CMap::Range, g_FXCMAP_V_1, 27, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniJIS-UCS2-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniJIS-UCS2-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniJIS-UCS2-HW-H", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_H_4, 4, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "UniJIS-UCS2-HW-V", FXCMAP_CMap::Range, g_FXCMAP_UniJIS_UCS2_HW_V_4, 199, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniJIS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_H_4, 9772, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniJIS-UTF16-V", FXCMAP_CMap::Single, g_FXCMAP_UniJIS_UCS2_V_4, 251, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedJapan1CMaps()
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_pMapList = g_FXCMAP_Japan1_cmaps;
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_JAPAN1].m_Count = sizeof g_FXCMAP_Japan1_cmaps / sizeof (FXCMAP_CMap);
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_pMap = g_FXCMAP_Japan1CID2Unicode_4;
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_JAPAN1].m_Count = 15444;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
new file mode 100644
index 0000000000..f5f7a99b61
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp
@@ -0,0 +1,2302 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_Korea1CID2Unicode_2[18352] = {
+ 0xFFFD, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026,
+ 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E,
+ 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036,
+ 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
+ 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046,
+ 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E,
+ 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
+ 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E,
+ 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066,
+ 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E,
+ 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076,
+ 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E,
+ 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x3000, 0x3001, 0x3002,
+ 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x2013, 0x2014, 0x2016,
+ 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014, 0x3015,
+ 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
+ 0x3010, 0x3011, 0x00B1, 0x00D7, 0x00F7, 0x2260, 0x2264, 0x2265,
+ 0x221E, 0x2234, 0x00B0, 0x2032, 0x2033, 0x2103, 0x212B, 0xFFE0,
+ 0xFFE1, 0xFFE5, 0x2642, 0x2640, 0x2220, 0x22A5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x00A7, 0x203B, 0x2606, 0x2605, 0x25CB,
+ 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2,
+ 0x25BD, 0x25BC, 0x2192, 0x2190, 0x2191, 0x2193, 0x2194, 0x3013,
+ 0x226A, 0x226B, 0x221A, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C,
+ 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229,
+ 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4,
+ 0x02DC, 0x02C7, 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB,
+ 0x00A1, 0x00BF, 0x2236, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109,
+ 0x2030, 0x25C1, 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661,
+ 0x2665, 0x2667, 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1,
+ 0x2592, 0x25A4, 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668,
+ 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195,
+ 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C,
+ 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121,
+ 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08,
+ 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, 0xFF10,
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,
+ 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF20,
+ 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28,
+ 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30,
+ 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38,
+ 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F, 0xFF40,
+ 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48,
+ 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50,
+ 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58,
+ 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, 0x3131, 0x3132,
+ 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A,
+ 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141, 0x3142,
+ 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A,
+ 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151, 0x3152,
+ 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A,
+ 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161, 0x3162,
+ 0x3163, 0x3165, 0x3166, 0x3167, 0x3168, 0x3169, 0x316A, 0x316B,
+ 0x316C, 0x316D, 0x316E, 0x316F, 0x3170, 0x3171, 0x3172, 0x3173,
+ 0x3174, 0x3175, 0x3176, 0x3177, 0x3178, 0x3179, 0x317A, 0x317B,
+ 0x317C, 0x317D, 0x317E, 0x317F, 0x3180, 0x3181, 0x3182, 0x3183,
+ 0x3184, 0x3185, 0x3186, 0x3187, 0x3188, 0x3189, 0x318A, 0x318B,
+ 0x318C, 0x318D, 0x318E, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,
+ 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2160, 0x2161, 0x2162,
+ 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x0391,
+ 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399,
+ 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1,
+ 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1,
+ 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9,
+ 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1,
+ 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x2500,
+ 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C, 0x252C, 0x2524,
+ 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513, 0x251B, 0x2517,
+ 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520, 0x252F, 0x2528,
+ 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538, 0x2542, 0x2512,
+ 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E, 0x250D, 0x251E,
+ 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252A, 0x252D,
+ 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253A, 0x253D,
+ 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547,
+ 0x2548, 0x2549, 0x254A, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398,
+ 0x33C4, 0x33A3, 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B,
+ 0x339C, 0x339D, 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA,
+ 0x338D, 0x338E, 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7,
+ 0x33A8, 0x33B0, 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6,
+ 0x33B7, 0x33B8, 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384,
+ 0x33BA, 0x33BB, 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391,
+ 0x3392, 0x3393, 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B,
+ 0x338C, 0x33D6, 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9,
+ 0x33AA, 0x33AB, 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9,
+ 0x33DC, 0x33C6, 0x00C6, 0x00D0, 0x00AA, 0x0126, 0x0132, 0x013F,
+ 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A, 0x3260,
+ 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268,
+ 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E, 0x326F, 0x3270,
+ 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278,
+ 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2, 0x24D3, 0x24D4,
+ 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA, 0x24DB, 0x24DC,
+ 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2, 0x24E3, 0x24E4,
+ 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460, 0x2461, 0x2462,
+ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246A,
+ 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153, 0x2154, 0x00BC,
+ 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, 0x00E6, 0x0111, 0x00F0,
+ 0x0127, 0x0131, 0x0133, 0x0138, 0x0140, 0x0142, 0x00F8, 0x0153,
+ 0x00DF, 0x00FE, 0x0167, 0x014B, 0x0149, 0x3200, 0x3201, 0x3202,
+ 0x3203, 0x3204, 0x3205, 0x3206, 0x3207, 0x3208, 0x3209, 0x320A,
+ 0x320B, 0x320C, 0x320D, 0x320E, 0x320F, 0x3210, 0x3211, 0x3212,
+ 0x3213, 0x3214, 0x3215, 0x3216, 0x3217, 0x3218, 0x3219, 0x321A,
+ 0x321B, 0x249C, 0x249D, 0x249E, 0x249F, 0x24A0, 0x24A1, 0x24A2,
+ 0x24A3, 0x24A4, 0x24A5, 0x24A6, 0x24A7, 0x24A8, 0x24A9, 0x24AA,
+ 0x24AB, 0x24AC, 0x24AD, 0x24AE, 0x24AF, 0x24B0, 0x24B1, 0x24B2,
+ 0x24B3, 0x24B4, 0x24B5, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
+ 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480,
+ 0x2481, 0x2482, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081,
+ 0x2082, 0x2083, 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
+ 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D,
+ 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,
+ 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D,
+ 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,
+ 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D,
+ 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,
+ 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D,
+ 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,
+ 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D,
+ 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093, 0x30A1, 0x30A2,
+ 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, 0x30A8, 0x30A9, 0x30AA,
+ 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF, 0x30B0, 0x30B1, 0x30B2,
+ 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7, 0x30B8, 0x30B9, 0x30BA,
+ 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF, 0x30C0, 0x30C1, 0x30C2,
+ 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7, 0x30C8, 0x30C9, 0x30CA,
+ 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D0, 0x30D1, 0x30D2,
+ 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7, 0x30D8, 0x30D9, 0x30DA,
+ 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2,
+ 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7, 0x30E8, 0x30E9, 0x30EA,
+ 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2,
+ 0x30F3, 0x30F4, 0x30F5, 0x30F6, 0x0410, 0x0411, 0x0412, 0x0413,
+ 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A,
+ 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422,
+ 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A,
+ 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432,
+ 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,
+ 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441,
+ 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,
+ 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, 0xAC00, 0xAC01,
+ 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC10, 0xAC11, 0xAC12,
+ 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17, 0xAC19, 0xAC1A, 0xAC1B,
+ 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C, 0xAC2D, 0xAC2F, 0xAC30,
+ 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40, 0xAC4B, 0xAC4D, 0xAC54,
+ 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74, 0xAC77, 0xAC78, 0xAC7A,
+ 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85, 0xAC86, 0xAC89, 0xAC8A,
+ 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C, 0xAC9D, 0xAC9F, 0xACA0,
+ 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC, 0xACAF, 0xACB0, 0xACB8,
+ 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1, 0xACC4, 0xACC8, 0xACCC,
+ 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4, 0xACE7, 0xACE8, 0xACEA,
+ 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3, 0xACF5, 0xACF6, 0xACFC,
+ 0xACFD, 0xAD00, 0xAD04, 0xAD06, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11,
+ 0xAD18, 0xAD1C, 0xAD20, 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35,
+ 0xAD38, 0xAD3C, 0xAD44, 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54,
+ 0xAD58, 0xAD61, 0xAD63, 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74,
+ 0xAD75, 0xAD76, 0xAD7B, 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82,
+ 0xAD88, 0xAD89, 0xAD8C, 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7,
+ 0xADC0, 0xADC1, 0xADC4, 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC,
+ 0xADE0, 0xADE4, 0xADF8, 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01,
+ 0xAE08, 0xAE09, 0xAE0B, 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34,
+ 0xAE37, 0xAE38, 0xAE3A, 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46,
+ 0xAE4A, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C,
+ 0xAE5D, 0xAE5F, 0xAE60, 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C,
+ 0xAE70, 0xAE78, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85,
+ 0xAE8C, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD,
+ 0xAECF, 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB,
+ 0xAEED, 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10,
+ 0xAF2C, 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F,
+ 0xAF41, 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D,
+ 0xAF64, 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91,
+ 0xAF95, 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8,
+ 0xAFC9, 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9,
+ 0xAFF0, 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C,
+ 0xB010, 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048,
+ 0xB04A, 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059,
+ 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D, 0xB08F,
+ 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0, 0xB0A1,
+ 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE, 0xB0AF,
+ 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4, 0xB0C5,
+ 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8, 0xB0E0,
+ 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112, 0xB113,
+ 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124, 0xB125,
+ 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139, 0xB140,
+ 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155, 0xB158,
+ 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182, 0xB188,
+ 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198, 0xB19C,
+ 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, 0xB1DF, 0xB1E8,
+ 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB, 0xB1FD, 0xB204, 0xB205,
+ 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215, 0xB217, 0xB219, 0xB220,
+ 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260, 0xB268, 0xB269, 0xB274,
+ 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289, 0xB290, 0xB291, 0xB294,
+ 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1, 0xB2A3, 0xB2A5, 0xB2A6,
+ 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8, 0xB2C9, 0xB2CC, 0xB2D0,
+ 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD, 0xB2E2, 0xB2E4, 0xB2E5,
+ 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F3,
+ 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9, 0xB2FA, 0xB2FB, 0xB2FF,
+ 0xB300, 0xB301, 0xB304, 0xB308, 0xB310, 0xB311, 0xB313, 0xB314,
+ 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356, 0xB358, 0xB35B, 0xB35C,
+ 0xB35E, 0xB35F, 0xB364, 0xB365, 0xB367, 0xB369, 0xB36B, 0xB36E,
+ 0xB370, 0xB371, 0xB374, 0xB378, 0xB380, 0xB381, 0xB383, 0xB384,
+ 0xB385, 0xB38C, 0xB390, 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC,
+ 0xB3C4, 0xB3C5, 0xB3C8, 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4,
+ 0xB3D5, 0xB3D7, 0xB3D9, 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8,
+ 0xB3FC, 0xB410, 0xB418, 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B,
+ 0xB434, 0xB450, 0xB451, 0xB454, 0xB458, 0xB460, 0xB461, 0xB463,
+ 0xB465, 0xB46C, 0xB480, 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC,
+ 0xB4B5, 0xB4B7, 0xB4B9, 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5,
+ 0xB4DC, 0xB4DD, 0xB4E0, 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED,
+ 0xB4EF, 0xB4F1, 0xB4F8, 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C,
+ 0xB524, 0xB525, 0xB527, 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531,
+ 0xB534, 0xB538, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B,
+ 0xB54C, 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560,
+ 0xB561, 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0,
+ 0xB5B1, 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0,
+ 0xB5C4, 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC,
+ 0xB610, 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648,
+ 0xB664, 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC,
+ 0xB6B1, 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705,
+ 0xB728, 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B,
+ 0xB744, 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768,
+ 0xB770, 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784,
+ 0xB78C, 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797,
+ 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB, 0xB7AC,
+ 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC, 0xB7ED,
+ 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801, 0xB807,
+ 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B, 0xB81D,
+ 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837, 0xB838,
+ 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D, 0xB860,
+ 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C, 0xB88D,
+ 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3, 0xB8C5,
+ 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8, 0xB8E9,
+ 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904, 0xB918,
+ 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F, 0xB951,
+ 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, 0xB96B, 0xB96D,
+ 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984, 0xB985, 0xB987, 0xB989,
+ 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD, 0xB9B0, 0xB9B4, 0xB9BC,
+ 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9, 0xB9CC, 0xB9CE, 0xB9CF,
+ 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9, 0xB9DB, 0xB9DD, 0xB9DE,
+ 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8, 0xB9EC, 0xB9F4, 0xB9F5,
+ 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00, 0xBA01, 0xBA08, 0xBA15,
+ 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42, 0xBA48, 0xBA49, 0xBA4B,
+ 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55, 0xBA58, 0xBA5C, 0xBA64,
+ 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70, 0xBA71, 0xBA74, 0xBA78,
+ 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C, 0xBAA8, 0xBAA9, 0xBAAB,
+ 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9, 0xBABB, 0xBABD, 0xBAC4,
+ 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F,
+ 0xBB11, 0xBB18, 0xBB1C, 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35,
+ 0xBB36, 0xBB38, 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45,
+ 0xBB47, 0xBB49, 0xBB4D, 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61,
+ 0xBB63, 0xBB6C, 0xBB88, 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC,
+ 0xBBB4, 0xBBB7, 0xBBC0, 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8,
+ 0xBBF9, 0xBBFC, 0xBBFF, 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B,
+ 0xBC0C, 0xBC0D, 0xBC0F, 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17,
+ 0xBC18, 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25,
+ 0xBC27, 0xBC29, 0xBC2D, 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40,
+ 0xBC41, 0xBC43, 0xBC44, 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50,
+ 0xBC5D, 0xBC84, 0xBC85, 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94,
+ 0xBC95, 0xBC97, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7,
+ 0xBCA8, 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD,
+ 0xBCC0, 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8,
+ 0xBCDC, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05,
+ 0xBD07, 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48,
+ 0xBD49, 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80,
+ 0xBD81, 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91,
+ 0xBD93, 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8,
+ 0xBDD4, 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8,
+ 0xBE00, 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C,
+ 0xBE1D, 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54,
+ 0xBE55, 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64,
+ 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75, 0xBE7B,
+ 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F, 0xBE90,
+ 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4, 0xBED7,
+ 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01, 0xBF08,
+ 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40, 0xBF41,
+ 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0, 0xBFC5,
+ 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1, 0xC03C,
+ 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090, 0xC091,
+ 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC, 0xC0AD,
+ 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC, 0xC0BD,
+ 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC, 0xC0D0,
+ 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, 0xC0E5, 0xC0E8,
+ 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9, 0xC100, 0xC104, 0xC108,
+ 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC123,
+ 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D, 0xC12F, 0xC130, 0xC131,
+ 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140, 0xC148, 0xC149, 0xC14B,
+ 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158, 0xC15C, 0xC164, 0xC165,
+ 0xC167, 0xC168, 0xC169, 0xC170, 0xC174, 0xC178, 0xC185, 0xC18C,
+ 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196, 0xC19C, 0xC19D, 0xC19F,
+ 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC, 0xC1B0, 0xC1BD, 0xC1C4,
+ 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8, 0xC1E0, 0xC1E4, 0xC1E8,
+ 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD, 0xC200, 0xC204, 0xC20C,
+ 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219, 0xC21C, 0xC21F, 0xC220,
+ 0xC228, 0xC229, 0xC22B, 0xC22D, 0xC22F, 0xC231, 0xC232, 0xC234,
+ 0xC248, 0xC250, 0xC251, 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C,
+ 0xC26D, 0xC270, 0xC274, 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288,
+ 0xC289, 0xC290, 0xC298, 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8,
+ 0xC2AC, 0xC2AD, 0xC2B4, 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD,
+ 0xC2E0, 0xC2E3, 0xC2E4, 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1,
+ 0xC2F6, 0xC2F8, 0xC2F9, 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309,
+ 0xC30C, 0xC30D, 0xC313, 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324,
+ 0xC325, 0xC328, 0xC329, 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370,
+ 0xC372, 0xC378, 0xC379, 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C,
+ 0xC3C0, 0xC3D8, 0xC3D9, 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8,
+ 0xC3E9, 0xC3ED, 0xC3F4, 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424,
+ 0xC42C, 0xC430, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465,
+ 0xC468, 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C,
+ 0xC4B8, 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA,
+ 0xC4FF, 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528,
+ 0xC529, 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544,
+ 0xC545, 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553,
+ 0xC554, 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560,
+ 0xC561, 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575,
+ 0xC57C, 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F,
+ 0xC591, 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4,
+ 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4,
+ 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE,
+ 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3, 0xC5E5,
+ 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7, 0xC5FC,
+ 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,
+ 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624,
+ 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634,
+ 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648,
+ 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660,
+ 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680, 0xC688,
+ 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C, 0xC6A4,
+ 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8, 0xC6B9,
+ 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD, 0xC6D0,
+ 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,
+ 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C,
+ 0xC714, 0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728,
+ 0xC730, 0xC731, 0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740,
+ 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F, 0xC751, 0xC752, 0xC753,
+ 0xC754, 0xC755, 0xC756, 0xC757, 0xC758, 0xC75C, 0xC760, 0xC768,
+ 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C, 0xC77D, 0xC77E, 0xC783,
+ 0xC784, 0xC785, 0xC787, 0xC788, 0xC789, 0xC78A, 0xC78E, 0xC790,
+ 0xC791, 0xC794, 0xC796, 0xC797, 0xC798, 0xC79A, 0xC7A0, 0xC7A1,
+ 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC, 0xC7AD, 0xC7B0, 0xC7B4,
+ 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1, 0xC7C8, 0xC7C9, 0xC7CC,
+ 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4, 0xC7E8, 0xC7EC, 0xC800,
+ 0xC801, 0xC804, 0xC808, 0xC80A, 0xC810, 0xC811, 0xC813, 0xC815,
+ 0xC816, 0xC81C, 0xC81D, 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F,
+ 0xC831, 0xC838, 0xC83C, 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D,
+ 0xC854, 0xC870, 0xC871, 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881,
+ 0xC883, 0xC885, 0xC886, 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894,
+ 0xC89D, 0xC89F, 0xC8A1, 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8,
+ 0xC8CC, 0xC8D4, 0xC8D5, 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4,
+ 0xC8F5, 0xC8FC, 0xC8FD, 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C,
+ 0xC90D, 0xC90F, 0xC911, 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951,
+ 0xC954, 0xC958, 0xC960, 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974,
+ 0xC97C, 0xC988, 0xC989, 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B,
+ 0xC99D, 0xC9C0, 0xC9C1, 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0,
+ 0xC9D1, 0xC9D3, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD,
+ 0xC9E0, 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0,
+ 0xC9F1, 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B,
+ 0xCA0C, 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50,
+ 0xCA54, 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D,
+ 0xCA84, 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD,
+ 0xCACF, 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4,
+ 0xCB08, 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48,
+ 0xCB49, 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78,
+ 0xCB79, 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C,
+ 0xCC0D, 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27,
+ 0xCC28, 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B,
+ 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C, 0xCC54,
+ 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66, 0xCC68,
+ 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8, 0xCCA9,
+ 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC, 0xCCC4,
+ 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC, 0xCCF0,
+ 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19, 0xCD1B,
+ 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60, 0xCD64,
+ 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94, 0xCD95,
+ 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0, 0xCDC4,
+ 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9, 0xCDFB,
+ 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20, 0xCE21,
+ 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, 0xCE58, 0xCE59,
+ 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68, 0xCE69, 0xCE6B, 0xCE6D,
+ 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84, 0xCE85, 0xCE87, 0xCE89,
+ 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0, 0xCEA1, 0xCEA3, 0xCEA4,
+ 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4, 0xCEE5, 0xCEE8, 0xCEEB,
+ 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8, 0xCEF9, 0xCF00, 0xCF01,
+ 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13, 0xCF15, 0xCF1C, 0xCF20,
+ 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30, 0xCF31, 0xCF38, 0xCF54,
+ 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65, 0xCF67, 0xCF69, 0xCF70,
+ 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85, 0xCF8C, 0xCFA1, 0xCFA8,
+ 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4, 0xCFE8, 0xCFF0, 0xCFF1,
+ 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004, 0xD011, 0xD018, 0xD02D,
+ 0xD034, 0xD035, 0xD038, 0xD03C, 0xD044, 0xD045, 0xD047, 0xD049,
+ 0xD050, 0xD054, 0xD058, 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074,
+ 0xD07C, 0xD07D, 0xD081, 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4,
+ 0xD0B5, 0xD0B7, 0xD0B9, 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9,
+ 0xD0D0, 0xD0D1, 0xD0D3, 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0,
+ 0xD0E4, 0xD0EC, 0xD0ED, 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D,
+ 0xD130, 0xD131, 0xD134, 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143,
+ 0xD144, 0xD145, 0xD14C, 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D,
+ 0xD15F, 0xD161, 0xD168, 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0,
+ 0xD1A1, 0xD1A4, 0xD1A8, 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA,
+ 0xD1BC, 0xD1C0, 0xD1D8, 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210,
+ 0xD22C, 0xD22D, 0xD230, 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241,
+ 0xD248, 0xD25C, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290,
+ 0xD291, 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8,
+ 0xD2B9, 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB,
+ 0xD2D4, 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4,
+ 0xD2F8, 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E,
+ 0xD310, 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321,
+ 0xD325, 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B,
+ 0xD33C, 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384,
+ 0xD38C, 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C,
+ 0xD3A0, 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC,
+ 0xD3C4, 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3,
+ 0xD3EC, 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401,
+ 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464, 0xD46D,
+ 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482, 0xD488,
+ 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0, 0xD4D4,
+ 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB, 0xD4FD,
+ 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C, 0xD53D,
+ 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558, 0xD559,
+ 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D, 0xD574,
+ 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588, 0xD589,
+ 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2, 0xD5D8,
+ 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC, 0xD5F4,
+ 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608, 0xD610,
+ 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, 0xD624, 0xD62D,
+ 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645, 0xD648, 0xD649, 0xD64B,
+ 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658, 0xD65C, 0xD667, 0xD669,
+ 0xD670, 0xD671, 0xD674, 0xD683, 0xD685, 0xD68C, 0xD68D, 0xD690,
+ 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8, 0xD6AC, 0xD6B0, 0xD6B9,
+ 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC, 0xD6D1, 0xD6D4, 0xD6D7,
+ 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0, 0xD6F5, 0xD6FC, 0xD6FD,
+ 0xD700, 0xD704, 0xD711, 0xD718, 0xD719, 0xD71C, 0xD720, 0xD728,
+ 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735, 0xD738, 0xD73C, 0xD744,
+ 0xD747, 0xD749, 0xD750, 0xD751, 0xD754, 0xD756, 0xD757, 0xD758,
+ 0xD759, 0xD760, 0xD761, 0xD763, 0xD765, 0xD769, 0xD76C, 0xD770,
+ 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788, 0xD789, 0xD78C, 0xD790,
+ 0xD798, 0xD799, 0xD79B, 0xD79D, 0x4F3D, 0x4F73, 0x5047, 0x50F9,
+ 0x52A0, 0x53EF, 0x5475, 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687,
+ 0x67B6, 0x67B7, 0x67EF, 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB,
+ 0x8304, 0x8857, 0x8888, 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6,
+ 0x99D5, 0x523B, 0x5374, 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF,
+ 0x811A, 0x89BA, 0x89D2, 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978,
+ 0x59E6, 0x5E72, 0x5E79, 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F,
+ 0x6F97, 0x764E, 0x770B, 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D,
+ 0x826E, 0x8271, 0x8AEB, 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34,
+ 0x78A3, 0x7AED, 0x845B, 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E,
+ 0x582A, 0x5D4C, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44,
+ 0x6E1B, 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451,
+ 0x9452, 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598,
+ 0x525B, 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A,
+ 0x6177, 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C,
+ 0x8154, 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47,
+ 0x4ECB, 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168,
+ 0x6539, 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5,
+ 0x84CB, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0x7CB3, 0x7FB9,
+ 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E, 0x64DA,
+ 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0x907D, 0x9245,
+ 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA, 0x6106, 0x6957,
+ 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E, 0x5091, 0x6770,
+ 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, 0x77BC, 0x9210, 0x9ED4,
+ 0x52AB, 0x602F, 0x8FF2, 0x5048, 0x61A9, 0x63ED, 0x64CA, 0x683C,
+ 0x6A84, 0x6FC0, 0x8188, 0x89A1, 0x9694, 0x5805, 0x727D, 0x72AC,
+ 0x7504, 0x7D79, 0x7E6D, 0x80A9, 0x898B, 0x8B74, 0x9063, 0x9D51,
+ 0x6289, 0x6C7A, 0x6F54, 0x7D50, 0x7F3A, 0x8A23, 0x517C, 0x614A,
+ 0x7B9D, 0x8B19, 0x9257, 0x938C, 0x4EAC, 0x4FD3, 0x501E, 0x50BE,
+ 0x5106, 0x52C1, 0x52CD, 0x537F, 0x5770, 0x5883, 0x5E9A, 0x5F91,
+ 0x6176, 0x61AC, 0x64CE, 0x656C, 0x666F, 0x66BB, 0x66F4, 0x6897,
+ 0x6D87, 0x7085, 0x70F1, 0x749F, 0x74A5, 0x74CA, 0x75D9, 0x786C,
+ 0x78EC, 0x7ADF, 0x7AF6, 0x7D45, 0x7D93, 0x8015, 0x803F, 0x811B,
+ 0x8396, 0x8B66, 0x8F15, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A,
+ 0x9BE8, 0x4FC2, 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8,
+ 0x6212, 0x6842, 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE,
+ 0x7A3D, 0x7CFB, 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E,
+ 0x9DC4, 0x53E4, 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64,
+ 0x5C3B, 0x5EAB, 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF,
+ 0x69C1, 0x6CBD, 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003,
+ 0x80A1, 0x818F, 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4,
+ 0x8AA5, 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED,
+ 0x659B, 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764,
+ 0x5D11, 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4,
+ 0x6C68, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, 0x79D1,
+ 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B, 0x9846, 0x5ED3,
+ 0x69E8, 0x85FF, 0x90ED, 0x51A0, 0x5B98, 0x5BEC, 0x6163, 0x68FA,
+ 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1, 0x7F50, 0x83C5, 0x89C0,
+ 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D, 0x62EC, 0x9002, 0x4F8A,
+ 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0, 0x6D38, 0x709A, 0x72C2,
+ 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366, 0x639B, 0x7F6B, 0x4E56,
+ 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127, 0x62D0, 0x69D0, 0x9B41,
+ 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4, 0x50D1, 0x54AC, 0x55AC,
+ 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E, 0x6821, 0x6A4B, 0x72E1,
+ 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0, 0x854E, 0x86DF, 0x8F03,
+ 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D,
+ 0x4EC7, 0x4FF1, 0x5177, 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E,
+ 0x5614, 0x5775, 0x57A2, 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8,
+ 0x6551, 0x67B8, 0x67E9, 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42,
+ 0x6E9D, 0x7078, 0x72D7, 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76,
+ 0x7D7F, 0x8009, 0x81FC, 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33,
+ 0x8CFC, 0x8EC0, 0x9011, 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45,
+ 0x9CE9, 0x9DD7, 0x9F9C, 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB,
+ 0x9EB4, 0x541B, 0x7A98, 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800,
+ 0x5C48, 0x6398, 0x7A9F, 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E,
+ 0x8EAC, 0x5026, 0x5238, 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372,
+ 0x6B0A, 0x6DC3, 0x7737, 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5,
+ 0x673A, 0x6AC3, 0x6F70, 0x8A6D, 0x8ECC, 0x994B, 0x6677, 0x6B78,
+ 0x8CB4, 0x9B3C, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB, 0x73EA,
+ 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73, 0x9035,
+ 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E, 0x6A58,
+ 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975, 0x9699, 0x50C5,
+ 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF, 0x747E, 0x7B4B,
+ 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949, 0x4ECA, 0x5997,
+ 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981, 0x79BD, 0x82A9, 0x887E,
+ 0x887F, 0x895F, 0x9326, 0x4F0B, 0x53CA, 0x6025, 0x6271, 0x6C72,
+ 0x7D1A, 0x7D66, 0x4E98, 0x5162, 0x77DC, 0x80AF, 0x4F01, 0x4F0E,
+ 0x5176, 0x5180, 0x55DC, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914,
+ 0x5947, 0x5993, 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC,
+ 0x6280, 0x65D7, 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4,
+ 0x6A5F, 0x6B3A, 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426,
+ 0x742A, 0x7482, 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941,
+ 0x7947, 0x7948, 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006,
+ 0x802D, 0x808C, 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324,
+ 0x98E2, 0x9951, 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76,
+ 0x5409, 0x62EE, 0x6854, 0x91D1, 0x55AB, 0x513A, 0x5A1C, 0x61E6,
+ 0x62CF, 0x62FF, 0x90A3, 0x8AFE, 0x6696, 0x7156, 0x96E3, 0x634F,
+ 0x637A, 0x5357, 0x678F, 0x6960, 0x6E73, 0x7537, 0x7D0D, 0x8872,
+ 0x56CA, 0x5A18, 0x4E43, 0x5167, 0x5948, 0x67F0, 0x8010, 0x5973,
+ 0x5E74, 0x649A, 0x79CA, 0x5FF5, 0x606C, 0x62C8, 0x637B, 0x5BE7,
+ 0x5BD7, 0x52AA, 0x5974, 0x5F29, 0x6012, 0x7459, 0x99D1, 0x6FC3,
+ 0x81BF, 0x8FB2, 0x60F1, 0x8166, 0x5C3F, 0x5AE9, 0x8A25, 0x677B,
+ 0x7D10, 0x80FD, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336,
+ 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56, 0x65B7,
+ 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E, 0x7DDE,
+ 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A, 0x75B8,
+ 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1, 0x6E5B,
+ 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983, 0x8AC7,
+ 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D, 0x5510,
+ 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576, 0x7CD6,
+ 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D, 0x5CB1,
+ 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B, 0x8CB8,
+ 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200, 0x5230,
+ 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B, 0x5EA6,
+ 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, 0x68F9, 0x6AC2,
+ 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE, 0x76DC, 0x7779, 0x79B1,
+ 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3, 0x8E48, 0x9003, 0x9014,
+ 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC, 0x6BD2, 0x7006, 0x7258,
+ 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4, 0x7E9B, 0x8B80, 0x58A9,
+ 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C, 0x711E, 0x71C9, 0x8C5A,
+ 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC, 0x51CD, 0x52D5, 0x540C,
+ 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E, 0x6F7C, 0x75BC, 0x77B3,
+ 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C, 0x6597, 0x675C, 0x6793,
+ 0x75D8, 0x7AC7, 0x8373, 0x8C46, 0x9017, 0x982D, 0x5C6F, 0x81C0,
+ 0x829A, 0x9041, 0x906F, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8,
+ 0x767B, 0x7B49, 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6,
+ 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6D1B, 0x70D9,
+ 0x73DE, 0x7D61, 0x843D, 0x916A, 0x99F1, 0x4E82, 0x5375, 0x6B04,
+ 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C, 0x8FA3, 0x5D50,
+ 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C, 0x85CD, 0x8964,
+ 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717, 0x6D6A, 0x72FC,
+ 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D, 0x5FA0, 0x840A,
+ 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169, 0x51C9, 0x6881,
+ 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2, 0x8F1B, 0x91CF,
+ 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E, 0x623E, 0x65C5,
+ 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD, 0x9A62, 0x9A6A,
+ 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D, 0x792B, 0x8F62,
+ 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, 0x7149, 0x7489, 0x7DF4,
+ 0x806F, 0x84EE, 0x8F26, 0x9023, 0x934A, 0x51BD, 0x5217, 0x52A3,
+ 0x6D0C, 0x70C8, 0x88C2, 0x5EC9, 0x6582, 0x6BAE, 0x6FC2, 0x7C3E,
+ 0x7375, 0x4EE4, 0x4F36, 0x56F9, 0x5CBA, 0x5DBA, 0x601C, 0x73B2,
+ 0x7B2D, 0x7F9A, 0x7FCE, 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748,
+ 0x9818, 0x9F61, 0x4F8B, 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE,
+ 0x6488, 0x64C4, 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001,
+ 0x8606, 0x865C, 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75,
+ 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6,
+ 0x58DF, 0x5F04, 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121,
+ 0x7028, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,
+ 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,
+ 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,
+ 0x5F8B, 0x6144, 0x6817, 0x9686, 0x52D2, 0x808B, 0x51DC, 0x51CC,
+ 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229, 0x5398,
+ 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C, 0x7281,
+ 0x72F8, 0x7406, 0x7483, 0x75E2, 0x7C6C, 0x7F79, 0x7FB8, 0x8389,
+ 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9, 0x541D, 0x6F7E,
+ 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57, 0x9E9F, 0x6797,
+ 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, 0x7ACB, 0x7B20, 0x7C92,
+ 0x6469, 0x746A, 0x75F2, 0x78BC, 0x78E8, 0x99AC, 0x9B54, 0x9EBB,
+ 0x5BDE, 0x5E55, 0x6F20, 0x819C, 0x83AB, 0x9088, 0x4E07, 0x534D,
+ 0x5A29, 0x5DD2, 0x5F4E, 0x6162, 0x633D, 0x6669, 0x66FC, 0x6EFF,
+ 0x6F2B, 0x7063, 0x779E, 0x842C, 0x8513, 0x883B, 0x8F13, 0x9945,
+ 0x9C3B, 0x551C, 0x62B9, 0x672B, 0x6CAB, 0x8309, 0x896A, 0x977A,
+ 0x4EA1, 0x5984, 0x5FD8, 0x5FD9, 0x671B, 0x7DB2, 0x7F54, 0x8292,
+ 0x832B, 0x83BD, 0x8F1E, 0x9099, 0x57CB, 0x59B9, 0x5A92, 0x5BD0,
+ 0x6627, 0x679A, 0x6885, 0x6BCF, 0x7164, 0x7F75, 0x8CB7, 0x8CE3,
+ 0x9081, 0x9B45, 0x8108, 0x8C8A, 0x964C, 0x9A40, 0x9EA5, 0x5B5F,
+ 0x6C13, 0x731B, 0x76F2, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D,
+ 0x5195, 0x52C9, 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC,
+ 0x9762, 0x9EB5, 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E,
+ 0x669D, 0x6927, 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F,
+ 0x9169, 0x9298, 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6,
+ 0x5E3D, 0x6155, 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD,
+ 0x6BDB, 0x725F, 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC,
+ 0x8305, 0x8B00, 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE,
+ 0x7766, 0x7A46, 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499,
+ 0x536F, 0x5893, 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A,
+ 0x732B, 0x7AD7, 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB,
+ 0x620A, 0x62C7, 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121,
+ 0x73F7, 0x755D, 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF,
+ 0x9727, 0x9D61, 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F,
+ 0x6587, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,
+ 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,
+ 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, 0x767C,
+ 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023, 0x508D, 0x574A,
+ 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E, 0x65B9, 0x65C1,
+ 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21, 0x80AA, 0x8180,
+ 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17, 0x90A6, 0x9632,
+ 0x9F90, 0x500D, 0x4FF3, 0x57F9, 0x5F98, 0x62DC, 0x6392, 0x676F,
+ 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA, 0x88F4, 0x88F5, 0x8919,
+ 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F, 0x4F70, 0x5E1B, 0x67CF,
+ 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61, 0x6A0A, 0x7169, 0x71D4,
+ 0x756A, 0x7E41, 0x8543, 0x85E9, 0x98DC, 0x4F10, 0x7B4F, 0x7F70,
+ 0x95A5, 0x51E1, 0x5E06, 0x68B5, 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF,
+ 0x7BC4, 0x8303, 0x6CD5, 0x743A, 0x50FB, 0x5288, 0x58C1, 0x64D8,
+ 0x6A97, 0x74A7, 0x7656, 0x78A7, 0x8617, 0x95E2, 0x9739, 0x535E,
+ 0x5F01, 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49,
+ 0x9F08, 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A,
+ 0x67C4, 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27,
+ 0x9920, 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65,
+ 0x6D11, 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913,
+ 0x8B5C, 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9,
+ 0x670D, 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39,
+ 0x8F3B, 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01,
+ 0x5CEF, 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B,
+ 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF,
+ 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66,
+ 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0x6276, 0x6577, 0x65A7, 0x6D6E,
+ 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150, 0x8151, 0x819A,
+ 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6, 0x8CFB, 0x8D74,
+ 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9, 0x9CE7, 0x5317,
+ 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E, 0x5FFF, 0x61A4,
+ 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89, 0x7CDE, 0x7D1B,
+ 0x82AC, 0x8CC1, 0x96F0, 0x4F5B, 0x5F17, 0x5F7F, 0x62C2, 0x5D29,
+ 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C, 0x4E15, 0x5099, 0x5315,
+ 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87, 0x60B2, 0x618A, 0x6249,
+ 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4, 0x6BD6, 0x6BD7, 0x6BD8,
+ 0x6CB8, 0x7435, 0x75FA, 0x7812, 0x7891, 0x79D5, 0x79D8, 0x7C83,
+ 0x7DCB, 0x7FE1, 0x80A5, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8,
+ 0x8AB9, 0x8B6C, 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC,
+ 0x5B2A, 0x5F6C, 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015,
+ 0x725D, 0x73AD, 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058,
+ 0x9A01, 0x4E4D, 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F,
+ 0x4FDF, 0x50FF, 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB,
+ 0x5962, 0x5A11, 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99,
+ 0x601D, 0x6368, 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B,
+ 0x6C99, 0x6CD7, 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940,
+ 0x7960, 0x79C1, 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E,
+ 0x84D1, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,
+ 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0x6714, 0x5098,
+ 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523, 0x759D, 0x7B97,
+ 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA, 0x715E, 0x85A9,
+ 0x4E09, 0x6749, 0x68EE, 0x6E17, 0x829F, 0x8518, 0x886B, 0x63F7,
+ 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7, 0x50CF, 0x511F, 0x5546,
+ 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0, 0x5E38, 0x5E8A, 0x5EA0,
+ 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58, 0x723D, 0x7240, 0x72C0,
+ 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3, 0x89F4, 0x8A73, 0x8C61,
+ 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD, 0x55C7, 0x7A61, 0x7D22,
+ 0x8272, 0x7272, 0x751F, 0x7525, 0x7B19, 0x5885, 0x58FB, 0x5DBC,
+ 0x5E8F, 0x5EB6, 0x5F90, 0x6055, 0x6292, 0x637F, 0x654D, 0x6691,
+ 0x66D9, 0x66F8, 0x6816, 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E,
+ 0x7DD6, 0x7F72, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D,
+ 0x92E4, 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614,
+ 0x6673, 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6,
+ 0x91CB, 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3,
+ 0x6247, 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487,
+ 0x74BF, 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3,
+ 0x8239, 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425,
+ 0x994D, 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B,
+ 0x820C, 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261,
+ 0x66B9, 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D,
+ 0x6D89, 0x71EE, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,
+ 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, 0x8056,
+ 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2, 0x6B72, 0x6D17,
+ 0x7A05, 0x7B39, 0x7D30, 0x8CB0, 0x53EC, 0x562F, 0x5851, 0x5BB5,
+ 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383, 0x6414, 0x662D, 0x68B3,
+ 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4, 0x71D2, 0x7526, 0x758F,
+ 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B, 0x7D20, 0x7D39, 0x852C,
+ 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061, 0x90B5, 0x92B7, 0x97F6,
+ 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91, 0x7C9F, 0x7E8C, 0x8B16,
+ 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D, 0x84C0, 0x905C, 0x98E1,
+ 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE, 0x8A1F, 0x8AA6, 0x9001,
+ 0x980C, 0x5237, 0x7051, 0x788E, 0x9396, 0x8870, 0x91D7, 0x4FEE,
+ 0x53D7, 0x55FD, 0x56DA, 0x5782, 0x58FD, 0x5AC2, 0x5B88, 0x5CAB,
+ 0x5CC0, 0x5E25, 0x6101, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536,
+ 0x6578, 0x6A39, 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9,
+ 0x7378, 0x7407, 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA,
+ 0x7CB9, 0x7D8F, 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490,
+ 0x84DA, 0x85EA, 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083,
+ 0x916C, 0x9296, 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700,
+ 0x9808, 0x9996, 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70,
+ 0x5BBF, 0x6DD1, 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD,
+ 0x5DE1, 0x5F87, 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53,
+ 0x6B89, 0x6D35, 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14,
+ 0x8123, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,
+ 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,
+ 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0x8FC5, 0x5931, 0x5BA4,
+ 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, 0x6DF1, 0x700B,
+ 0x751A, 0x82AF, 0x8AF6, 0x4EC0, 0x5341, 0x96D9, 0x6C0F, 0x4E9E,
+ 0x4FC4, 0x5152, 0x555E, 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD,
+ 0x83AA, 0x86FE, 0x8859, 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09,
+ 0x9D5D, 0x580A, 0x5CB3, 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1,
+ 0x6A02, 0x6E25, 0x9102, 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89,
+ 0x5CB8, 0x6309, 0x664F, 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854,
+ 0x9B9F, 0x65A1, 0x8B01, 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6,
+ 0x5EB5, 0x6697, 0x764C, 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE,
+ 0x9D28, 0x4EF0, 0x592E, 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26,
+ 0x5393, 0x54C0, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D,
+ 0x827E, 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A,
+ 0x814B, 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B,
+ 0x51B6, 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0x91CE,
+ 0x5F31, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5, 0x8E8D, 0x4F6F,
+ 0x58E4, 0x5B43, 0x6059, 0x63DA, 0x6518, 0x656D, 0x6698, 0x694A,
+ 0x6A23, 0x6D0B, 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70,
+ 0x7F8A, 0x8944, 0x8B93, 0x91C0, 0x967D, 0x990A, 0x5704, 0x5FA1,
+ 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD, 0x9B5A, 0x9F6C,
+ 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043, 0x5830, 0x5F66,
+ 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA, 0x513C, 0x56B4,
+ 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186, 0x4E88, 0x4F59,
+ 0x5982, 0x6B5F, 0x6C5D, 0x74B5, 0x7916, 0x8207, 0x8245, 0x8339,
+ 0x8F3F, 0x8F5D, 0x9918, 0x4EA6, 0x57DF, 0x5F79, 0x6613, 0x75AB,
+ 0x7E79, 0x8B6F, 0x9006, 0x9A5B, 0x56A5, 0x5827, 0x59F8, 0x5A1F,
+ 0x5BB4, 0x5EF6, 0x6350, 0x633B, 0x693D, 0x6C87, 0x6CBF, 0x6D8E,
+ 0x6D93, 0x6DF5, 0x6F14, 0x70DF, 0x7136, 0x7159, 0x71C3, 0x71D5,
+ 0x784F, 0x786F, 0x7B75, 0x7DE3, 0x7E2F, 0x884D, 0x8EDF, 0x925B,
+ 0x9CF6, 0x6085, 0x6D85, 0x71B1, 0x95B1, 0x53AD, 0x67D3, 0x708E,
+ 0x7130, 0x7430, 0x8276, 0x82D2, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4,
+ 0x71C1, 0x8449, 0x584B, 0x5DB8, 0x5F71, 0x6620, 0x668E, 0x6979,
+ 0x69AE, 0x6C38, 0x6CF3, 0x6E36, 0x6F41, 0x6FDA, 0x701B, 0x702F,
+ 0x7150, 0x71DF, 0x7370, 0x745B, 0x74D4, 0x76C8, 0x7A4E, 0x7E93,
+ 0x82F1, 0x8A60, 0x8FCE, 0x9348, 0x9719, 0x4E42, 0x502A, 0x5208,
+ 0x53E1, 0x66F3, 0x6C6D, 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE,
+ 0x85DD, 0x8602, 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0x92B3, 0x9713,
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0x61CA,
+ 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, 0x70CF, 0x71AC,
+ 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32, 0x9F07, 0x5C4B, 0x6C83,
+ 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465, 0x761F, 0x7A69, 0x7E15,
+ 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE, 0x7515, 0x7670, 0x7FC1,
+ 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6, 0x7AA9, 0x7AAA, 0x81E5,
+ 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C, 0x5B9B, 0x68A1, 0x6900,
+ 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897, 0x7DE9, 0x7FEB, 0x8118,
+ 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811, 0x66F0, 0x5F80, 0x65FA,
+ 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03, 0x6B6A, 0x77EE, 0x5916,
+ 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0x50E5, 0x51F9, 0x582F, 0x592D,
+ 0x5996, 0x59DA, 0x5BE5, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE,
+ 0x66DC, 0x6A48, 0x71FF, 0x7464, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E,
+ 0x8000, 0x8170, 0x87EF, 0x8981, 0x8B20, 0x9059, 0x9080, 0x9952,
+ 0x617E, 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD,
+ 0x5197, 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995,
+ 0x6D8C, 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073,
+ 0x8338, 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0x4E8E, 0x4F51, 0x5076,
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0x6A52,
+ 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, 0x904B, 0x9695,
+ 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90, 0x718A, 0x96C4, 0x5143,
+ 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3, 0x5A9B, 0x5AC4, 0x5BC3,
+ 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39, 0x6E72, 0x6E90, 0x7230,
+ 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45, 0x9060, 0x9662, 0x9858,
+ 0x9D1B, 0x6708, 0x8D8A, 0x925E, 0x4F4D, 0x5049, 0x50DE, 0x5371,
+ 0x570D, 0x59D4, 0x5A01, 0x5C09, 0x6170, 0x6690, 0x6E2D, 0x7232,
+ 0x744B, 0x7DEF, 0x80C3, 0x840E, 0x8466, 0x853F, 0x875F, 0x885B,
+ 0x8918, 0x8B02, 0x9055, 0x97CB, 0x9B4F, 0x4E73, 0x4F91, 0x5112,
+ 0x516A, 0x552F, 0x55A9, 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE,
+ 0x60A0, 0x60DF, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0x67D4,
+ 0x67DA, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0x6E38, 0x6FE1, 0x7336,
+ 0x7337, 0x745C, 0x7531, 0x7652, 0x7DAD, 0x81FE, 0x8438, 0x88D5,
+ 0x8A98, 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A,
+ 0x9149, 0x91C9, 0x936E, 0x5809, 0x6BD3, 0x8089, 0x80B2, 0x5141,
+ 0x596B, 0x5C39, 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0x9217, 0x958F,
+ 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D, 0x57A0, 0x6069, 0x6147,
+ 0x6BB7, 0x8ABE, 0x9280, 0x96B1, 0x4E59, 0x541F, 0x6DEB, 0x852D,
+ 0x9670, 0x97F3, 0x98EE, 0x63D6, 0x6CE3, 0x9091, 0x51DD, 0x61C9,
+ 0x81BA, 0x9DF9, 0x4F9D, 0x501A, 0x5100, 0x5B9C, 0x610F, 0x61FF,
+ 0x64EC, 0x6905, 0x6BC5, 0x7591, 0x77E3, 0x7FA9, 0x8264, 0x858F,
+ 0x87FB, 0x8863, 0x8ABC, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A,
+ 0x5937, 0x59E8, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0x723E, 0x73E5,
+ 0x7570, 0x75CD, 0x79FB, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,
+ 0x8CBD, 0x8CB3, 0x9087, 0x98F4, 0x990C, 0x7037, 0x76CA, 0x7FCA,
+ 0x7FCC, 0x7FFC, 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0x54BD,
+ 0x56E0, 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0x7D6A, 0x8335,
+ 0x8693, 0x8A8D, 0x976D, 0x9777, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9,
+ 0x65E5, 0x6EA2, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A,
+ 0x59D9, 0x6041, 0x7A14, 0x834F, 0x8CC3, 0x5165, 0x5344, 0x4ECD,
+ 0x5269, 0x5B55, 0x82BF, 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF,
+ 0x5B50, 0x5B57, 0x5B5C, 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E,
+ 0x7386, 0x74F7, 0x75B5, 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328,
+ 0x8517, 0x85C9, 0x8AEE, 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC,
+ 0x65AB, 0x6628, 0x707C, 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C,
+ 0x96C0, 0x9D72, 0x5B71, 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91,
+ 0x66AB, 0x6F5B, 0x7BB4, 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7,
+ 0x5320, 0x5834, 0x58BB, 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84,
+ 0x5F35, 0x638C, 0x66B2, 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F,
+ 0x7246, 0x7350, 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7,
+ 0x838A, 0x846C, 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC,
+ 0x9577, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,
+ 0x6575, 0x6EF4, 0x72C4, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D, 0x7E3E,
+ 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F, 0x8FEA,
+ 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168, 0x5178,
+ 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55, 0x5EDB,
+ 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, 0x714E, 0x7420,
+ 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C, 0x7B8B, 0x7BAD, 0x7BC6,
+ 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F, 0x9293, 0x9322, 0x942B,
+ 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207, 0x622A, 0x6298, 0x6D59,
+ 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360, 0x5CBE, 0x5E97, 0x6F38,
+ 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE, 0x63A5, 0x647A, 0x8776,
+ 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075, 0x5448, 0x59C3, 0x5B9A,
+ 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5, 0x633A, 0x653F, 0x6574,
+ 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968, 0x6A89, 0x6B63, 0x6C40,
+ 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E, 0x70A1, 0x738E, 0x73FD,
+ 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B, 0x7A7D, 0x7CBE, 0x7D8E,
+ 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D, 0x914A, 0x91D8, 0x9266,
+ 0x92CC, 0x9320, 0x9706, 0x9756, 0x975C, 0x9802, 0x9F0E, 0x5236,
+ 0x5291, 0x557C, 0x5824, 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF,
+ 0x6FDF, 0x796D, 0x7B2C, 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44,
+ 0x918D, 0x9664, 0x969B, 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146,
+ 0x51CB, 0x52A9, 0x5632, 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9,
+ 0x6641, 0x66FA, 0x66F9, 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15,
+ 0x6F6E, 0x7167, 0x71E5, 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A,
+ 0x79DF, 0x7A20, 0x7A95, 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087,
+ 0x85FB, 0x86A4, 0x8A54, 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D,
+ 0x91E3, 0x963B, 0x96D5, 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3,
+ 0x5B58, 0x5C0A, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E,
+ 0x60B0, 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C,
+ 0x7E31, 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750,
+ 0x5DE6, 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A,
+ 0x59DD, 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE,
+ 0x5EDA, 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A,
+ 0x6F8D, 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2,
+ 0x821F, 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031,
+ 0x914E, 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101,
+ 0x51C6, 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96,
+ 0x6FEC, 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB,
+ 0x99FF, 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB,
+ 0x696B, 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD,
+ 0x7511, 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA,
+ 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F, 0x652F,
+ 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A, 0x6F2C,
+ 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102, 0x81F3,
+ 0x829D, 0x82B7, 0x8718, 0x8A8C, 0x8D04, 0x8DBE, 0x9072, 0x76F4,
+ 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4, 0x5875, 0x632F,
+ 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84, 0x6D25, 0x6EB1,
+ 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1, 0x771E, 0x778B,
+ 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897, 0x8A3A, 0x8CD1,
+ 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673, 0x9707, 0x4F84,
+ 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6, 0x75BE, 0x79E9,
+ 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED, 0x659F, 0x6715,
+ 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2,
+ 0x6F84, 0x4E14, 0x4F98, 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE,
+ 0x6B21, 0x6B64, 0x78CB, 0x7B9A, 0x8E49, 0x8ECA, 0x906E, 0x6349,
+ 0x643E, 0x7740, 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF,
+ 0x71E6, 0x74A8, 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98,
+ 0x8B9A, 0x8D0A, 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6,
+ 0x672D, 0x7D2E, 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA,
+ 0x65AC, 0x7AD9, 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531,
+ 0x5A3C, 0x5EE0, 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2,
+ 0x69CD, 0x6EC4, 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259,
+ 0x83D6, 0x84BC, 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1,
+ 0x7826, 0x7DB5, 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5,
+ 0x7B56, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0x5254,
+ 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC, 0x7620,
+ 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598, 0x5929,
+ 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B, 0x85A6,
+ 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6, 0x51F8,
+ 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F, 0x8F4D,
+ 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB, 0x7C3D,
+ 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377, 0x7252,
+ 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674, 0x6DF8,
+ 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0x5243, 0x66FF, 0x6D95,
+ 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4, 0x521D, 0x527F,
+ 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, 0x6912, 0x695A, 0x6A35,
+ 0x7092, 0x7126, 0x785D, 0x7901, 0x790E, 0x79D2, 0x7A0D, 0x8096,
+ 0x8278, 0x82D5, 0x8349, 0x8549, 0x8C82, 0x8D85, 0x9162, 0x918B,
+ 0x91AE, 0x4FC3, 0x56D1, 0x71ED, 0x77D7, 0x8700, 0x89F8, 0x5BF8,
+ 0x5FD6, 0x6751, 0x90A8, 0x53E2, 0x585A, 0x5BF5, 0x60A4, 0x6181,
+ 0x6460, 0x7E3D, 0x8070, 0x8525, 0x9283, 0x64AE, 0x50AC, 0x5D14,
+ 0x6700, 0x589C, 0x62BD, 0x63A8, 0x690E, 0x6978, 0x6A1E, 0x6E6B,
+ 0x76BA, 0x79CB, 0x82BB, 0x8429, 0x8ACF, 0x8DA8, 0x8FFD, 0x9112,
+ 0x914B, 0x919C, 0x9310, 0x9318, 0x939A, 0x96DB, 0x9A36, 0x9C0D,
+ 0x4E11, 0x755C, 0x795D, 0x7AFA, 0x7B51, 0x7BC9, 0x7E2E, 0x84C4,
+ 0x8E59, 0x8E74, 0x8EF8, 0x9010, 0x6625, 0x693F, 0x7443, 0x51FA,
+ 0x672E, 0x9EDC, 0x5145, 0x5FE0, 0x6C96, 0x87F2, 0x885D, 0x8877,
+ 0x60B4, 0x81B5, 0x8403, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36,
+ 0x5C31, 0x708A, 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189,
+ 0x9A5F, 0x9DF2, 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64,
+ 0x4F88, 0x5024, 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB,
+ 0x6DC4, 0x71BE, 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7,
+ 0x7DFB, 0x7F6E, 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52,
+ 0x5247, 0x52C5, 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5,
+ 0x5BE2, 0x6795, 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C,
+ 0x87C4, 0x79E4, 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE,
+ 0x59A5, 0x60F0, 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640,
+ 0x99B1, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0x6258, 0x64E2,
+ 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, 0x9438,
+ 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E, 0x7058, 0x70AD,
+ 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708, 0x803D, 0x8CAA,
+ 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F, 0x8569, 0x514C,
+ 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86, 0x6C70, 0x6CF0, 0x7B1E,
+ 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1, 0x64C7, 0x6FA4, 0x6491,
+ 0x6504, 0x514E, 0x5410, 0x571F, 0x8A0E, 0x615F, 0x6876, 0x75DB,
+ 0x7B52, 0x7D71, 0x901A, 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000,
+ 0x9839, 0x5078, 0x5957, 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D,
+ 0x7279, 0x95D6, 0x5761, 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA,
+ 0x6777, 0x6CE2, 0x6D3E, 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD,
+ 0x8DDB, 0x9817, 0x5224, 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9,
+ 0x8FA6, 0x9211, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504,
+ 0x6096, 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987,
+ 0x8C9D, 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F,
+ 0x6241, 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19,
+ 0x8CB6, 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16,
+ 0x5E63, 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B,
+ 0x4F48, 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03,
+ 0x6016, 0x629B, 0x62B1, 0x6355, 0x6CE1, 0x6D66, 0x75B1, 0x7832,
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,
+ 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02, 0x74E2,
+ 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, 0x54C1, 0x7A1F,
+ 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE, 0x5F7C, 0x62AB, 0x75B2,
+ 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339, 0x5F3C, 0x5FC5, 0x6CCC,
+ 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE, 0x999D, 0x4E4F, 0x903C,
+ 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8, 0x6630, 0x6CB3, 0x7455,
+ 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E, 0x9C15, 0x58D1, 0x5B78,
+ 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068, 0x608D, 0x65F1, 0x6C57,
+ 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0, 0x9591, 0x9592, 0x9650,
+ 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B, 0x54B8, 0x5563, 0x558A,
+ 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C, 0x9677, 0x9E79, 0x5408,
+ 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4, 0x965C, 0x4EA2, 0x4F09,
+ 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297, 0x676D, 0x6841, 0x6C86,
+ 0x6E2F, 0x7F38, 0x809B, 0x822A, 0x9805, 0x4EA5, 0x5055, 0x54B3,
+ 0x5793, 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023,
+ 0x87F9, 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE,
+ 0x6838, 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411,
+ 0x56AE, 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653,
+ 0x589F, 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47,
+ 0x96AA, 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4,
+ 0x5F26, 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE,
+ 0x7729, 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0x8CE2,
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,
+ 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,
+ 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, 0x5F62,
+ 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192, 0x73E9, 0x7469,
+ 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3, 0x99A8, 0x516E,
+ 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A, 0x91AF, 0x978B,
+ 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D, 0x5CB5, 0x5F27,
+ 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69, 0x6DCF, 0x6E56,
+ 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0, 0x7425, 0x745A,
+ 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1, 0x82A6, 0x846B,
+ 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A, 0x93AC, 0x9800,
+ 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F, 0x6DF7, 0x6E3E,
+ 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4, 0x5F18, 0x6C5E,
+ 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C, 0x9D3B, 0x5316,
+ 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, 0x798D, 0x79BE, 0x82B1,
+ 0x83EF, 0x8A71, 0x8B41, 0x8CA8, 0x9774, 0x64F4, 0x652B, 0x78BA,
+ 0x78BB, 0x7A6B, 0x4E38, 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3,
+ 0x63DB, 0x6B61, 0x6665, 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08,
+ 0x9084, 0x9A69, 0x9C25, 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA,
+ 0x51F0, 0x5E4C, 0x5FA8, 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643,
+ 0x6644, 0x69A5, 0x6CC1, 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C,
+ 0x7687, 0x7BC1, 0x7C27, 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3,
+ 0x532F, 0x56DE, 0x5EFB, 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666,
+ 0x6703, 0x6A9C, 0x6DEE, 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE,
+ 0x8334, 0x86D4, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B,
+ 0x9404, 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F,
+ 0x6D8D, 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019,
+ 0x539A, 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D,
+ 0x7166, 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104,
+ 0x718F, 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684,
+ 0x714A, 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE,
+ 0x6689, 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB,
+ 0x7566, 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308,
+ 0x6D36, 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403,
+ 0x5C79, 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070,
+ 0x6D3D, 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD,
+ 0x59EC, 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6,
+ 0x7199, 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70,
+ 0x3001, 0x3002, 0x2025, 0x00AD, 0x2015, 0x2225, 0xFF5E, 0x3014,
+ 0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E,
+ 0x300F, 0x3010, 0x3011, 0x3013, 0xFF01, 0xFF08, 0xFF09, 0xFF0C,
+ 0xFF0E, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, 0xFF3B,
+ 0xFF3D, 0xFF3F, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0x0020, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029,
+ 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049,
+ 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069,
+ 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079,
+ 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C, 0x231C,
+ 0x231F, 0x0000, 0x0000, 0x0000, 0x0000, 0x300E, 0x300F, 0x300A,
+ 0x300B, 0x3008, 0x3009, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028,
+ 0x0029, 0x0028, 0x0029, 0x0000, 0x0000, 0x0028, 0x0029, 0x0000,
+ 0x0000, 0x3016, 0x3017, 0x3016, 0x3017, 0x3018, 0x3019, 0x005B,
+ 0x005D, 0x0000, 0x0000, 0x263E, 0x263D, 0x2021, 0x2021, 0x2020,
+ 0x2021, 0x0000, 0x2217, 0x0000, 0x0000, 0x201F, 0x201B, 0x02D6,
+ 0x02D7, 0x00D7, 0x221E, 0x0000, 0x00B1, 0x2213, 0x003E, 0x003C,
+ 0x003D, 0x2260, 0x207D, 0x207E, 0x007B, 0x007D, 0x0000, 0x0000,
+ 0x2229, 0x222A, 0x2282, 0x2208, 0x03A3, 0x0021, 0x0000, 0x3021,
+ 0x3022, 0x3023, 0x0000, 0x0000, 0x0000, 0x4E03, 0x0000, 0x0000,
+ 0x5341, 0x0000, 0x0000, 0x0027, 0x3014, 0x3015, 0x002A, 0x0000,
+ 0x2217, 0x002A, 0xCDCD, 0x3001, 0x3002, 0x0028, 0x0029, 0x0028,
+ 0x0029, 0x0028, 0x0029, 0x3016, 0x3017, 0x3010, 0x3011, 0x0000,
+ 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x00B6, 0x0000, 0x0000,
+ 0x22EF, 0x2237, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x278A, 0x278B,
+ 0x278C, 0x278D, 0x278E, 0x278F, 0x2790, 0x2791, 0x2792, 0x2793,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x24B6, 0x24B7, 0x24B8, 0x24B9,
+ 0x24BA, 0x24BB, 0x24BC, 0x24BD, 0x24BE, 0x24BF, 0x24C0, 0x24C1,
+ 0x24C2, 0x24C3, 0x24C4, 0x24C5, 0x24C6, 0x24C7, 0x24C8, 0x24C9,
+ 0x24CA, 0x24CB, 0x24CC, 0x24CD, 0x24CE, 0x24CF, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x22CF, 0x22CE, 0x22CF, 0x22CE, 0x2280,
+ 0x2281, 0x2270, 0x2271, 0x2272, 0x2273, 0x0000, 0x228A, 0x0000,
+ 0x228B, 0x2276, 0x2277, 0x2279, 0x22DA, 0x22DB, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2221, 0x2245, 0x2243, 0x2248, 0x0000, 0x22A4,
+ 0x22AB, 0x0000, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x0000, 0x2460, 0x2461, 0x2462,
+ 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0021, 0x00B0, 0x0027, 0x0022, 0x2034, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x2020, 0x2020, 0x2021,
+ 0x2020, 0x00A7, 0x0023, 0x002A, 0x002A, 0x0000, 0x0000, 0x2042,
+ 0x002A, 0x0000, 0x0000, 0x2042, 0x002A, 0x0000, 0x0000, 0x2022,
+ 0x20DF, 0x20DF, 0x0000, 0x20DF, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x261C, 0x261E, 0x0000, 0x0000, 0x20DE, 0x0000, 0x20DE, 0x20DE,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x20DD, 0x20DD, 0x271A, 0x2716,
+ 0x0000, 0x25EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x25CC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A9, 0x0000, 0x0000,
+ 0x262F, 0x0000, 0x262F, 0x262F, 0x0000, 0x0000, 0x0000, 0x3020,
+ 0x0000, 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C,
+ 0x277D, 0x277E, 0x277F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x2642, 0x22A9, 0x3036, 0x25CB, 0x25D3,
+ 0x25A1, 0x2302, 0x0000, 0x25AD, 0x25AD, 0x0000, 0x0000, 0x0000,
+ 0x25C7, 0x0000, 0x0000, 0x2206, 0x22BF, 0x231E, 0x0000, 0x2225,
+ 0x2226, 0x0000, 0x2253, 0x2251, 0x2266, 0x2267, 0x2213, 0x2295,
+ 0x2296, 0x2297, 0x20DD, 0x2314, 0x0000, 0x0000, 0x2262, 0x0000,
+ 0x25B1, 0x0000, 0x2222, 0x2250, 0x00D8, 0x234A, 0x22A3, 0x0338,
+ 0x0000, 0x226E, 0x226F, 0x2285, 0x2284, 0x2209, 0x220C, 0x22BB,
+ 0x0016, 0x225A, 0x2306, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x329E, 0x0000, 0x203C, 0x003F, 0x0000, 0x003F, 0x22C4,
+ 0x25C7, 0x22C4, 0x25C6, 0x25AB, 0x25A1, 0x25AB, 0x25A0, 0x25E6,
+ 0x25CB, 0x25E6, 0x25CF, 0x25BD, 0x25B3, 0x25B7, 0x25C1, 0x2726,
+ 0x25CF, 0x25A0, 0x0000, 0x25CA, 0x3231, 0x3239, 0x33CB, 0x2483,
+ 0x2494, 0x2495, 0x2496, 0x2497, 0x0029, 0x0029, 0x0029, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x2192, 0x2190,
+ 0x2191, 0x2193, 0x2196, 0x2197, 0x2198, 0x2199, 0x21D0, 0x21CF,
+ 0x21CD, 0x21D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x279C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x27BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x21D1, 0x21D3,
+ 0x0000, 0x279E, 0x0000, 0x0000, 0x0000, 0x279E, 0x0000, 0x0000,
+ 0x21B5, 0x21B1, 0x0000, 0x21B4, 0x21B0, 0x21B3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x21E6, 0x21E8, 0x21E7, 0x21E9, 0x21BC, 0x21C0, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x21C0, 0x21BC, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x21C4, 0x21C5, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E,
+ 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x002E, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487, 0x0029,
+ 0x0029, 0x0029, 0x0029, 0x0029, 0x0029, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x3294, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x32A5, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x0029, 0x0029, 0x0029, 0x0029, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x2794, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E0, 0x21E1,
+ 0x21E2, 0x21E3, 0x0000, 0x27A1, 0x0000, 0x0000, 0x21E6, 0x21E8,
+ 0x21E7, 0x21E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x261D, 0x261F,
+ 0x0000, 0x0000, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD, 0x20DD,
+ 0x20DD, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x005D, 0x005D, 0x005D, 0x005D, 0x005D,
+ 0x005D, 0x005D, 0x005D, 0x005D, 0x005D, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x3290, 0x328A, 0x328B, 0x328C,
+ 0x328D, 0x328E, 0x328F, 0x20DE, 0x20DE, 0x20DE, 0x20DE, 0x20DE,
+ 0x20DE, 0x20DE, 0x300C, 0x300D, 0x300E, 0x300F, 0x21E8, 0x21E6,
+ 0x21E7, 0x21E9, 0x0022, 0x301F, 0x301D, 0x2036, 0x0060, 0x3001,
+ 0x0000, 0x0021, 0x3021, 0x002C, 0x3002, 0xAC02, 0xAC03, 0xAC05,
+ 0xAC06, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E, 0xAC0F, 0xAC18, 0xAC1E,
+ 0xAC1F, 0xAC21, 0xAC22, 0xAC23, 0xAC25, 0xAC26, 0xAC27, 0xAC28,
+ 0xAC29, 0xAC2A, 0xAC2B, 0xAC2E, 0xAC32, 0xAC33, 0xAC34, 0xAC35,
+ 0xAC36, 0xAC37, 0xAC3A, 0xAC3B, 0xAC3D, 0xAC3E, 0xAC3F, 0xAC41,
+ 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46, 0xAC47, 0xAC48, 0xAC49,
+ 0xAC4A, 0xAC4C, 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53,
+ 0xAC55, 0xAC56, 0xAC57, 0xAC59, 0xAC5A, 0xAC5B, 0xAC5D, 0xAC5E,
+ 0xAC5F, 0xAC60, 0xAC61, 0xAC62, 0xAC63, 0xAC64, 0xAC65, 0xAC66,
+ 0xAC67, 0xAC68, 0xAC69, 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E,
+ 0xAC6F, 0xAC72, 0xAC73, 0xAC75, 0xAC76, 0xAC79, 0xAC7B, 0xAC7C,
+ 0xAC7D, 0xAC7E, 0xAC7F, 0xAC82, 0xAC87, 0xAC88, 0xAC8D, 0xAC8E,
+ 0xAC8F, 0xAC91, 0xAC92, 0xAC93, 0xAC95, 0xAC96, 0xAC97, 0xAC98,
+ 0xAC99, 0xAC9A, 0xAC9B, 0xAC9E, 0xACA2, 0xACA3, 0xACA4, 0xACA5,
+ 0xACA6, 0xACA7, 0xACAB, 0xACAD, 0xACAE, 0xACB1, 0xACB2, 0xACB3,
+ 0xACB4, 0xACB5, 0xACB6, 0xACB7, 0xACBA, 0xACBE, 0xACBF, 0xACC0,
+ 0xACC2, 0xACC3, 0xACC5, 0xACC6, 0xACC7, 0xACC9, 0xACCA, 0xACCB,
+ 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2, 0xACD3, 0xACD4,
+ 0xACD6, 0xACD8, 0xACD9, 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE,
+ 0xACDF, 0xACE2, 0xACE3, 0xACE5, 0xACE6, 0xACE9, 0xACEB, 0xACED,
+ 0xACEE, 0xACF2, 0xACF4, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB,
+ 0xACFE, 0xACFF, 0xAD01, 0xAD02, 0xAD03, 0xAD05, 0xAD07, 0xAD08,
+ 0xAD09, 0xAD0A, 0xAD0B, 0xAD0E, 0xAD10, 0xAD12, 0xAD13, 0xAD14,
+ 0xAD15, 0xAD16, 0xAD17, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1D, 0xAD1E,
+ 0xAD1F, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26, 0xAD27,
+ 0xAD28, 0xAD2A, 0xAD2B, 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32,
+ 0xAD33, 0xAD36, 0xAD37, 0xAD39, 0xAD3A, 0xAD3B, 0xAD3D, 0xAD3E,
+ 0xAD3F, 0xAD40, 0xAD41, 0xAD42, 0xAD43, 0xAD46, 0xAD48, 0xAD4A,
+ 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, 0xAD51, 0xAD52, 0xAD53,
+ 0xAD55, 0xAD56, 0xAD57, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D,
+ 0xAD5E, 0xAD5F, 0xAD60, 0xAD62, 0xAD64, 0xAD65, 0xAD66, 0xAD67,
+ 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, 0xAD6E, 0xAD6F, 0xAD71, 0xAD72,
+ 0xAD77, 0xAD78, 0xAD79, 0xAD7A, 0xAD7E, 0xAD80, 0xAD83, 0xAD84,
+ 0xAD85, 0xAD86, 0xAD87, 0xAD8A, 0xAD8B, 0xAD8D, 0xAD8E, 0xAD8F,
+ 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96, 0xAD97, 0xAD98,
+ 0xAD99, 0xAD9A, 0xAD9B, 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2,
+ 0xADA3, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA, 0xADAB,
+ 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2, 0xADB3,
+ 0xADB4, 0xADB5, 0xADB6, 0xADB8, 0xADB9, 0xADBA, 0xADBB, 0xADBC,
+ 0xADBD, 0xADBE, 0xADBF, 0xADC2, 0xADC3, 0xADC5, 0xADC6, 0xADC7,
+ 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE, 0xADCF, 0xADD2,
+ 0xADD4, 0xADD5, 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB,
+ 0xADDD, 0xADDE, 0xADDF, 0xADE1, 0xADE2, 0xADE3, 0xADE5, 0xADE6,
+ 0xADE7, 0xADE8, 0xADE9, 0xADEA, 0xADEB, 0xADEC, 0xADED, 0xADEE,
+ 0xADEF, 0xADF0, 0xADF1, 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6,
+ 0xADF7, 0xADFA, 0xADFB, 0xADFD, 0xADFE, 0xAE02, 0xAE03, 0xAE04,
+ 0xAE05, 0xAE06, 0xAE07, 0xAE0A, 0xAE0C, 0xAE0E, 0xAE0F, 0xAE10,
+ 0xAE11, 0xAE12, 0xAE13, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19,
+ 0xAE1A, 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21,
+ 0xAE22, 0xAE23, 0xAE24, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,
+ 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, 0xAE32, 0xAE33,
+ 0xAE35, 0xAE36, 0xAE39, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E, 0xAE3F,
+ 0xAE42, 0xAE44, 0xAE47, 0xAE48, 0xAE49, 0xAE4B, 0xAE4F, 0xAE51,
+ 0xAE52, 0xAE53, 0xAE55, 0xAE57, 0xAE58, 0xAE59, 0xAE5A, 0xAE5B,
+ 0xAE5E, 0xAE62, 0xAE63, 0xAE64, 0xAE66, 0xAE67, 0xAE6A, 0xAE6B,
+ 0xAE6D, 0xAE6E, 0xAE6F, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75,
+ 0xAE76, 0xAE77, 0xAE7A, 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82,
+ 0xAE83, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A, 0xAE8B, 0xAE8D,
+ 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92, 0xAE93, 0xAE94, 0xAE95,
+ 0xAE96, 0xAE97, 0xAE98, 0xAE99, 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D,
+ 0xAE9E, 0xAE9F, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5,
+ 0xAEA6, 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD,
+ 0xAEAE, 0xAEAF, 0xAEB0, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,
+ 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, 0xAEBF, 0xAEC1,
+ 0xAEC2, 0xAEC3, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,
+ 0xAECB, 0xAECE, 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7,
+ 0xAEDA, 0xAEDB, 0xAEDD, 0xAEDE, 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2,
+ 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6, 0xAEE7, 0xAEE9, 0xAEEA, 0xAEEC,
+ 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, 0xAEF5, 0xAEF6,
+ 0xAEF7, 0xAEF9, 0xAEFA, 0xAEFB, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00,
+ 0xAF01, 0xAF02, 0xAF03, 0xAF04, 0xAF05, 0xAF06, 0xAF09, 0xAF0A,
+ 0xAF0B, 0xAF0C, 0xAF0E, 0xAF0F, 0xAF11, 0xAF12, 0xAF13, 0xAF14,
+ 0xAF15, 0xAF16, 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C,
+ 0xAF1D, 0xAF1E, 0xAF1F, 0xAF20, 0xAF21, 0xAF22, 0xAF23, 0xAF24,
+ 0xAF25, 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, 0xAF2E,
+ 0xAF2F, 0xAF31, 0xAF33, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39,
+ 0xAF3A, 0xAF3B, 0xAF3E, 0xAF40, 0xAF44, 0xAF45, 0xAF46, 0xAF47,
+ 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E, 0xAF4F, 0xAF51, 0xAF52,
+ 0xAF53, 0xAF54, 0xAF55, 0xAF56, 0xAF57, 0xAF58, 0xAF59, 0xAF5A,
+ 0xAF5B, 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, 0xAF66,
+ 0xAF67, 0xAF68, 0xAF69, 0xAF6A, 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E,
+ 0xAF6F, 0xAF70, 0xAF71, 0xAF72, 0xAF73, 0xAF74, 0xAF75, 0xAF76,
+ 0xAF77, 0xAF78, 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F,
+ 0xAF81, 0xAF82, 0xAF83, 0xAF85, 0xAF86, 0xAF87, 0xAF89, 0xAF8A,
+ 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E, 0xAF8F, 0xAF92, 0xAF93, 0xAF94,
+ 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, 0xAF9D, 0xAF9E,
+ 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2, 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6,
+ 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA, 0xAFAB, 0xAFAC, 0xAFAD, 0xAFAE,
+ 0xAFAF, 0xAFB0, 0xAFB1, 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6,
+ 0xAFB7, 0xAFBA, 0xAFBB, 0xAFBD, 0xAFBE, 0xAFBF, 0xAFC1, 0xAFC2,
+ 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6, 0xAFCA, 0xAFCC, 0xAFCF, 0xAFD0,
+ 0xAFD1, 0xAFD2, 0xAFD3, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9,
+ 0xAFDA, 0xAFDB, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,
+ 0xAFE3, 0xAFE4, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFEA, 0xAFEB, 0xAFEC,
+ 0xAFED, 0xAFEE, 0xAFEF, 0xAFF2, 0xAFF3, 0xAFF5, 0xAFF6, 0xAFF7,
+ 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE, 0xAFFF, 0xB002,
+ 0xB003, 0xB005, 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B,
+ 0xB00D, 0xB00E, 0xB00F, 0xB011, 0xB012, 0xB013, 0xB015, 0xB016,
+ 0xB017, 0xB018, 0xB019, 0xB01A, 0xB01B, 0xB01E, 0xB01F, 0xB020,
+ 0xB021, 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, 0xB029,
+ 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E, 0xB02F, 0xB030, 0xB031,
+ 0xB032, 0xB033, 0xB034, 0xB035, 0xB036, 0xB037, 0xB038, 0xB039,
+ 0xB03A, 0xB03B, 0xB03C, 0xB03D, 0xB03E, 0xB03F, 0xB040, 0xB041,
+ 0xB042, 0xB043, 0xB046, 0xB047, 0xB049, 0xB04B, 0xB04D, 0xB04F,
+ 0xB050, 0xB051, 0xB052, 0xB056, 0xB058, 0xB05A, 0xB05B, 0xB05C,
+ 0xB05E, 0xB05F, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065,
+ 0xB066, 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D,
+ 0xB06E, 0xB06F, 0xB070, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,
+ 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, 0xB07E, 0xB07F,
+ 0xB081, 0xB082, 0xB083, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089,
+ 0xB08A, 0xB08B, 0xB08E, 0xB090, 0xB092, 0xB093, 0xB094, 0xB095,
+ 0xB096, 0xB097, 0xB09B, 0xB09D, 0xB09E, 0xB0A3, 0xB0A4, 0xB0A5,
+ 0xB0A6, 0xB0A7, 0xB0AA, 0xB0B0, 0xB0B2, 0xB0B6, 0xB0B7, 0xB0B9,
+ 0xB0BA, 0xB0BB, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,
+ 0xB0C3, 0xB0C6, 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF,
+ 0xB0D2, 0xB0D3, 0xB0D5, 0xB0D6, 0xB0D7, 0xB0D9, 0xB0DA, 0xB0DB,
+ 0xB0DC, 0xB0DD, 0xB0DE, 0xB0DF, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4,
+ 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, 0xB0EC, 0xB0ED,
+ 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2, 0xB0F3, 0xB0F4, 0xB0F5,
+ 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA, 0xB0FB, 0xB0FC, 0xB0FD,
+ 0xB0FE, 0xB0FF, 0xB100, 0xB101, 0xB102, 0xB103, 0xB104, 0xB105,
+ 0xB106, 0xB107, 0xB10A, 0xB10D, 0xB10E, 0xB10F, 0xB111, 0xB114,
+ 0xB115, 0xB116, 0xB117, 0xB11A, 0xB11E, 0xB11F, 0xB120, 0xB121,
+ 0xB122, 0xB126, 0xB127, 0xB129, 0xB12A, 0xB12B, 0xB12D, 0xB12E,
+ 0xB12F, 0xB130, 0xB131, 0xB132, 0xB133, 0xB136, 0xB13A, 0xB13B,
+ 0xB13C, 0xB13D, 0xB13E, 0xB13F, 0xB142, 0xB143, 0xB145, 0xB146,
+ 0xB147, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E, 0xB14F,
+ 0xB152, 0xB153, 0xB156, 0xB157, 0xB159, 0xB15A, 0xB15B, 0xB15D,
+ 0xB15E, 0xB15F, 0xB161, 0xB162, 0xB163, 0xB164, 0xB165, 0xB166,
+ 0xB167, 0xB168, 0xB169, 0xB16A, 0xB16B, 0xB16C, 0xB16D, 0xB16E,
+ 0xB16F, 0xB170, 0xB171, 0xB172, 0xB173, 0xB174, 0xB175, 0xB176,
+ 0xB177, 0xB17A, 0xB17B, 0xB17D, 0xB17E, 0xB17F, 0xB181, 0xB183,
+ 0xB184, 0xB185, 0xB186, 0xB187, 0xB18A, 0xB18C, 0xB18E, 0xB18F,
+ 0xB190, 0xB191, 0xB195, 0xB196, 0xB197, 0xB199, 0xB19A, 0xB19B,
+ 0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2, 0xB1A3, 0xB1A4,
+ 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A9, 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD,
+ 0xB1AE, 0xB1AF, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5,
+ 0xB1B6, 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD,
+ 0xB1BE, 0xB1BF, 0xB1C0, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,
+ 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, 0xB1CD, 0xB1CE,
+ 0xB1CF, 0xB1D1, 0xB1D2, 0xB1D3, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8,
+ 0xB1D9, 0xB1DA, 0xB1DB, 0xB1DE, 0xB1E0, 0xB1E1, 0xB1E2, 0xB1E3,
+ 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, 0xB1EA, 0xB1EB, 0xB1ED, 0xB1EE,
+ 0xB1EF, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6, 0xB1F7,
+ 0xB1F8, 0xB1FA, 0xB1FC, 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202,
+ 0xB203, 0xB206, 0xB207, 0xB209, 0xB20A, 0xB20D, 0xB20E, 0xB20F,
+ 0xB210, 0xB211, 0xB212, 0xB213, 0xB216, 0xB218, 0xB21A, 0xB21B,
+ 0xB21C, 0xB21D, 0xB21E, 0xB21F, 0xB221, 0xB222, 0xB223, 0xB224,
+ 0xB225, 0xB226, 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C,
+ 0xB22D, 0xB22E, 0xB22F, 0xB230, 0xB231, 0xB232, 0xB233, 0xB235,
+ 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, 0xB23D, 0xB23E,
+ 0xB23F, 0xB240, 0xB241, 0xB242, 0xB243, 0xB244, 0xB245, 0xB246,
+ 0xB247, 0xB248, 0xB249, 0xB24A, 0xB24B, 0xB24C, 0xB24D, 0xB24E,
+ 0xB24F, 0xB250, 0xB251, 0xB252, 0xB253, 0xB254, 0xB255, 0xB256,
+ 0xB257, 0xB259, 0xB25A, 0xB25B, 0xB25D, 0xB25E, 0xB25F, 0xB261,
+ 0xB262, 0xB263, 0xB264, 0xB265, 0xB266, 0xB267, 0xB26A, 0xB26B,
+ 0xB26C, 0xB26D, 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273,
+ 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A, 0xB27B, 0xB27D, 0xB27E,
+ 0xB27F, 0xB280, 0xB281, 0xB282, 0xB283, 0xB286, 0xB287, 0xB288,
+ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, 0xB292, 0xB293,
+ 0xB295, 0xB296, 0xB297, 0xB29B, 0xB29C, 0xB29D, 0xB29E, 0xB29F,
+ 0xB2A2, 0xB2A4, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AB, 0xB2AD, 0xB2AE,
+ 0xB2AF, 0xB2B1, 0xB2B2, 0xB2B3, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8,
+ 0xB2B9, 0xB2BA, 0xB2BB, 0xB2BC, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0,
+ 0xB2C1, 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, 0xB2CA,
+ 0xB2CB, 0xB2CD, 0xB2CE, 0xB2CF, 0xB2D1, 0xB2D3, 0xB2D4, 0xB2D5,
+ 0xB2D6, 0xB2D7, 0xB2DA, 0xB2DC, 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1,
+ 0xB2E3, 0xB2E7, 0xB2E9, 0xB2EA, 0xB2F0, 0xB2F1, 0xB2F2, 0xB2F6,
+ 0xB2FC, 0xB2FD, 0xB2FE, 0xB302, 0xB303, 0xB305, 0xB306, 0xB307,
+ 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E, 0xB30F, 0xB312,
+ 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, 0xB31D, 0xB31E,
+ 0xB31F, 0xB320, 0xB321, 0xB322, 0xB323, 0xB324, 0xB325, 0xB326,
+ 0xB327, 0xB328, 0xB329, 0xB32A, 0xB32B, 0xB32C, 0xB32D, 0xB32E,
+ 0xB32F, 0xB330, 0xB331, 0xB332, 0xB333, 0xB334, 0xB335, 0xB336,
+ 0xB337, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,
+ 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,
+ 0xB347, 0xB348, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D, 0xB34E,
+ 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, 0xB357, 0xB359, 0xB35A,
+ 0xB35D, 0xB360, 0xB361, 0xB362, 0xB363, 0xB366, 0xB368, 0xB36A,
+ 0xB36C, 0xB36D, 0xB36F, 0xB372, 0xB373, 0xB375, 0xB376, 0xB377,
+ 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E, 0xB37F, 0xB382,
+ 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, 0xB38D, 0xB38E,
+ 0xB38F, 0xB391, 0xB392, 0xB393, 0xB395, 0xB396, 0xB397, 0xB398,
+ 0xB399, 0xB39A, 0xB39B, 0xB39C, 0xB39D, 0xB39E, 0xB39F, 0xB3A2,
+ 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, 0xB3A9, 0xB3AA, 0xB3AB,
+ 0xB3AD, 0xB3AE, 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4,
+ 0xB3B5, 0xB3B6, 0xB3B7, 0xB3B8, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC,
+ 0xB3BD, 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, 0xB3C6,
+ 0xB3C7, 0xB3C9, 0xB3CA, 0xB3CD, 0xB3CF, 0xB3D1, 0xB3D2, 0xB3D3,
+ 0xB3D6, 0xB3D8, 0xB3DA, 0xB3DC, 0xB3DE, 0xB3DF, 0xB3E1, 0xB3E2,
+ 0xB3E3, 0xB3E5, 0xB3E6, 0xB3E7, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC,
+ 0xB3ED, 0xB3EE, 0xB3EF, 0xB3F0, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4,
+ 0xB3F5, 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, 0xB3FD,
+ 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402, 0xB403, 0xB404, 0xB405,
+ 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A, 0xB40B, 0xB40C, 0xB40D,
+ 0xB40E, 0xB40F, 0xB411, 0xB412, 0xB413, 0xB414, 0xB415, 0xB416,
+ 0xB417, 0xB419, 0xB41A, 0xB41B, 0xB41D, 0xB41E, 0xB41F, 0xB421,
+ 0xB422, 0xB423, 0xB424, 0xB425, 0xB426, 0xB427, 0xB42A, 0xB42C,
+ 0xB42D, 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, 0xB435,
+ 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A, 0xB43B, 0xB43C, 0xB43D,
+ 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442, 0xB443, 0xB444, 0xB445,
+ 0xB446, 0xB447, 0xB448, 0xB449, 0xB44A, 0xB44B, 0xB44C, 0xB44D,
+ 0xB44E, 0xB44F, 0xB452, 0xB453, 0xB455, 0xB456, 0xB457, 0xB459,
+ 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E, 0xB45F, 0xB462, 0xB464,
+ 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, 0xB46D, 0xB46E,
+ 0xB46F, 0xB470, 0xB471, 0xB472, 0xB473, 0xB474, 0xB475, 0xB476,
+ 0xB477, 0xB478, 0xB479, 0xB47A, 0xB47B, 0xB47C, 0xB47D, 0xB47E,
+ 0xB47F, 0xB481, 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487,
+ 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E, 0xB48F, 0xB490,
+ 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496, 0xB497, 0xB498,
+ 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49E, 0xB49F, 0xB4A0, 0xB4A1,
+ 0xB4A2, 0xB4A3, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A9, 0xB4AA, 0xB4AB,
+ 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2, 0xB4B3, 0xB4B4,
+ 0xB4B6, 0xB4B8, 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF,
+ 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C5, 0xB4C6, 0xB4C7, 0xB4C9, 0xB4CA,
+ 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE, 0xB4CF, 0xB4D1, 0xB4D2, 0xB4D3,
+ 0xB4D4, 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, 0xB4DE,
+ 0xB4DF, 0xB4E1, 0xB4E2, 0xB4E5, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,
+ 0xB4EB, 0xB4EE, 0xB4F0, 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6,
+ 0xB4F7, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE, 0xB4FF,
+ 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506, 0xB507,
+ 0xB508, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D, 0xB50E, 0xB50F,
+ 0xB510, 0xB511, 0xB512, 0xB513, 0xB516, 0xB517, 0xB519, 0xB51A,
+ 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522, 0xB523, 0xB526,
+ 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, 0xB532, 0xB533, 0xB535,
+ 0xB536, 0xB537, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,
+ 0xB53F, 0xB542, 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54E,
+ 0xB54F, 0xB551, 0xB552, 0xB553, 0xB555, 0xB556, 0xB557, 0xB558,
+ 0xB559, 0xB55A, 0xB55B, 0xB55E, 0xB562, 0xB563, 0xB564, 0xB565,
+ 0xB566, 0xB567, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D,
+ 0xB56E, 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575,
+ 0xB576, 0xB577, 0xB578, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,
+ 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, 0xB584, 0xB585,
+ 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A, 0xB58B, 0xB58C, 0xB58D,
+ 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592, 0xB593, 0xB594, 0xB595,
+ 0xB596, 0xB597, 0xB598, 0xB599, 0xB59A, 0xB59B, 0xB59C, 0xB59D,
+ 0xB59E, 0xB59F, 0xB5A2, 0xB5A3, 0xB5A5, 0xB5A6, 0xB5A7, 0xB5A9,
+ 0xB5AC, 0xB5AD, 0xB5AE, 0xB5AF, 0xB5B2, 0xB5B6, 0xB5B7, 0xB5B8,
+ 0xB5B9, 0xB5BA, 0xB5BE, 0xB5BF, 0xB5C1, 0xB5C2, 0xB5C3, 0xB5C5,
+ 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA, 0xB5CB, 0xB5CE, 0xB5D2,
+ 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, 0xB5D9, 0xB5DA, 0xB5DB,
+ 0xB5DC, 0xB5DD, 0xB5DE, 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3,
+ 0xB5E4, 0xB5E5, 0xB5E6, 0xB5E7, 0xB5E8, 0xB5E9, 0xB5EA, 0xB5EB,
+ 0xB5ED, 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, 0xB5F4,
+ 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA, 0xB5FB, 0xB5FC,
+ 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602, 0xB603, 0xB604,
+ 0xB605, 0xB606, 0xB607, 0xB608, 0xB609, 0xB60A, 0xB60B, 0xB60C,
+ 0xB60D, 0xB60E, 0xB60F, 0xB612, 0xB613, 0xB615, 0xB616, 0xB617,
+ 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E, 0xB61F, 0xB620,
+ 0xB621, 0xB622, 0xB623, 0xB624, 0xB626, 0xB627, 0xB628, 0xB629,
+ 0xB62A, 0xB62B, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,
+ 0xB633, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A, 0xB63B,
+ 0xB63C, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641, 0xB642, 0xB643,
+ 0xB644, 0xB645, 0xB646, 0xB647, 0xB649, 0xB64A, 0xB64B, 0xB64C,
+ 0xB64D, 0xB64E, 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654,
+ 0xB655, 0xB656, 0xB657, 0xB658, 0xB659, 0xB65A, 0xB65B, 0xB65C,
+ 0xB65D, 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, 0xB665,
+ 0xB666, 0xB667, 0xB669, 0xB66A, 0xB66B, 0xB66C, 0xB66D, 0xB66E,
+ 0xB66F, 0xB670, 0xB671, 0xB672, 0xB673, 0xB674, 0xB675, 0xB676,
+ 0xB677, 0xB678, 0xB679, 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E,
+ 0xB67F, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,
+ 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,
+ 0xB68F, 0xB690, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695, 0xB696,
+ 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, 0xB69E, 0xB69F, 0xB6A1,
+ 0xB6A2, 0xB6A3, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,
+ 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5,
+ 0xB6B6, 0xB6B7, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD,
+ 0xB6BE, 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5,
+ 0xB6C6, 0xB6C7, 0xB6C8, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,
+ 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, 0xB6D5, 0xB6D6,
+ 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA, 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE,
+ 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2, 0xB6E3, 0xB6E4, 0xB6E5, 0xB6E6,
+ 0xB6E7, 0xB6E8, 0xB6E9, 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE,
+ 0xB6EF, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F5, 0xB6F6, 0xB6F7, 0xB6F9,
+ 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE, 0xB6FF, 0xB702, 0xB703,
+ 0xB704, 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, 0xB70C,
+ 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712, 0xB713, 0xB714,
+ 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A, 0xB71B, 0xB71C,
+ 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721, 0xB722, 0xB723, 0xB724,
+ 0xB725, 0xB726, 0xB727, 0xB72A, 0xB72B, 0xB72D, 0xB72E, 0xB731,
+ 0xB732, 0xB733, 0xB734, 0xB735, 0xB736, 0xB737, 0xB73A, 0xB73C,
+ 0xB73D, 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, 0xB745,
+ 0xB746, 0xB747, 0xB749, 0xB74A, 0xB74B, 0xB74D, 0xB74E, 0xB74F,
+ 0xB750, 0xB751, 0xB752, 0xB753, 0xB756, 0xB757, 0xB758, 0xB759,
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, 0xB761, 0xB762,
+ 0xB763, 0xB765, 0xB766, 0xB767, 0xB769, 0xB76A, 0xB76B, 0xB76C,
+ 0xB76D, 0xB76E, 0xB76F, 0xB772, 0xB774, 0xB776, 0xB777, 0xB778,
+ 0xB779, 0xB77A, 0xB77B, 0xB77E, 0xB77F, 0xB781, 0xB782, 0xB783,
+ 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A, 0xB78B, 0xB78E,
+ 0xB793, 0xB794, 0xB795, 0xB79A, 0xB79B, 0xB79D, 0xB79E, 0xB79F,
+ 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6, 0xB7A7, 0xB7AA,
+ 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, 0xB7B6, 0xB7B7,
+ 0xB7B9, 0xB7BA, 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0,
+ 0xB7C1, 0xB7C2, 0xB7C3, 0xB7C4, 0xB7C5, 0xB7C6, 0xB7C8, 0xB7CA,
+ 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, 0xB7D0, 0xB7D1, 0xB7D2,
+ 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6, 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA,
+ 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE, 0xB7DF, 0xB7E0, 0xB7E1, 0xB7E2,
+ 0xB7E3, 0xB7E4, 0xB7E5, 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA,
+ 0xB7EB, 0xB7EE, 0xB7EF, 0xB7F1, 0xB7F2, 0xB7F3, 0xB7F5, 0xB7F6,
+ 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA, 0xB7FB, 0xB7FE, 0xB802, 0xB803,
+ 0xB804, 0xB805, 0xB806, 0xB80A, 0xB80B, 0xB80D, 0xB80E, 0xB80F,
+ 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816, 0xB817, 0xB81A,
+ 0xB81C, 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, 0xB826,
+ 0xB827, 0xB829, 0xB82A, 0xB82B, 0xB82D, 0xB82E, 0xB82F, 0xB830,
+ 0xB831, 0xB832, 0xB833, 0xB836, 0xB83A, 0xB83B, 0xB83C, 0xB83D,
+ 0xB83E, 0xB83F, 0xB841, 0xB842, 0xB843, 0xB845, 0xB846, 0xB847,
+ 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E, 0xB84F,
+ 0xB850, 0xB852, 0xB854, 0xB855, 0xB856, 0xB857, 0xB858, 0xB859,
+ 0xB85A, 0xB85B, 0xB85E, 0xB85F, 0xB861, 0xB862, 0xB863, 0xB865,
+ 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A, 0xB86B, 0xB86E, 0xB870,
+ 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, 0xB879, 0xB87A,
+ 0xB87B, 0xB87D, 0xB87E, 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883,
+ 0xB884, 0xB885, 0xB886, 0xB887, 0xB888, 0xB889, 0xB88A, 0xB88B,
+ 0xB88C, 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, 0xB894,
+ 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A, 0xB89B, 0xB89C,
+ 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2, 0xB8A3, 0xB8A4,
+ 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A9, 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD,
+ 0xB8AE, 0xB8AF, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B5, 0xB8B6, 0xB8B7,
+ 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE, 0xB8BF, 0xB8C2,
+ 0xB8C4, 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, 0xB8CD,
+ 0xB8CE, 0xB8CF, 0xB8D1, 0xB8D2, 0xB8D3, 0xB8D5, 0xB8D6, 0xB8D7,
+ 0xB8D8, 0xB8D9, 0xB8DA, 0xB8DB, 0xB8DC, 0xB8DE, 0xB8E0, 0xB8E2,
+ 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, 0xB8EA, 0xB8EB, 0xB8ED,
+ 0xB8EE, 0xB8EF, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,
+ 0xB8F7, 0xB8FA, 0xB8FC, 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902,
+ 0xB903, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A, 0xB90B,
+ 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912, 0xB913,
+ 0xB914, 0xB915, 0xB916, 0xB917, 0xB919, 0xB91A, 0xB91B, 0xB91C,
+ 0xB91D, 0xB91E, 0xB91F, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925,
+ 0xB926, 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D,
+ 0xB92E, 0xB92F, 0xB930, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,
+ 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, 0xB93E, 0xB93F,
+ 0xB941, 0xB942, 0xB943, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949,
+ 0xB94A, 0xB94B, 0xB94D, 0xB94E, 0xB950, 0xB952, 0xB953, 0xB954,
+ 0xB955, 0xB956, 0xB957, 0xB95A, 0xB95B, 0xB95D, 0xB95E, 0xB95F,
+ 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966, 0xB967, 0xB96A,
+ 0xB96C, 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, 0xB976,
+ 0xB977, 0xB979, 0xB97A, 0xB97B, 0xB97D, 0xB97E, 0xB97F, 0xB980,
+ 0xB981, 0xB982, 0xB983, 0xB986, 0xB988, 0xB98B, 0xB98C, 0xB98F,
+ 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996, 0xB997,
+ 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E, 0xB99F,
+ 0xB9A0, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5, 0xB9A6, 0xB9A7,
+ 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, 0xB9AE, 0xB9AF, 0xB9B1, 0xB9B2,
+ 0xB9B3, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA, 0xB9BB,
+ 0xB9BE, 0xB9C0, 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7,
+ 0xB9CA, 0xB9CB, 0xB9CD, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6, 0xB9D7,
+ 0xB9DA, 0xB9DC, 0xB9DF, 0xB9E0, 0xB9E2, 0xB9E6, 0xB9E7, 0xB9E9,
+ 0xB9EA, 0xB9EB, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,
+ 0xB9F3, 0xB9F6, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, 0xBA02,
+ 0xBA03, 0xBA04, 0xBA05, 0xBA06, 0xBA07, 0xBA09, 0xBA0A, 0xBA0B,
+ 0xBA0C, 0xBA0D, 0xBA0E, 0xBA0F, 0xBA10, 0xBA11, 0xBA12, 0xBA13,
+ 0xBA14, 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, 0xBA1C,
+ 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22, 0xBA23, 0xBA24,
+ 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A, 0xBA2B, 0xBA2C,
+ 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31, 0xBA32, 0xBA33, 0xBA34,
+ 0xBA35, 0xBA36, 0xBA37, 0xBA3A, 0xBA3B, 0xBA3D, 0xBA3E, 0xBA3F,
+ 0xBA41, 0xBA43, 0xBA44, 0xBA45, 0xBA46, 0xBA47, 0xBA4A, 0xBA4C,
+ 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA56, 0xBA57, 0xBA59, 0xBA5A,
+ 0xBA5B, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62, 0xBA63,
+ 0xBA66, 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, 0xBA72,
+ 0xBA73, 0xBA75, 0xBA76, 0xBA77, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C,
+ 0xBA7D, 0xBA7E, 0xBA7F, 0xBA80, 0xBA81, 0xBA82, 0xBA86, 0xBA88,
+ 0xBA89, 0xBA8A, 0xBA8B, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91,
+ 0xBA92, 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99,
+ 0xBA9A, 0xBA9B, 0xBA9C, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,
+ 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, 0xBAAA, 0xBAAD,
+ 0xBAAE, 0xBAAF, 0xBAB1, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6, 0xBAB7,
+ 0xBABA, 0xBABC, 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3,
+ 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC9, 0xBACA, 0xBACB, 0xBACC, 0xBACD,
+ 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2, 0xBAD3, 0xBAD4, 0xBAD5,
+ 0xBAD6, 0xBAD7, 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF,
+ 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6, 0xBAE7,
+ 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE, 0xBAEF,
+ 0xBAF0, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5, 0xBAF6, 0xBAF7,
+ 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB01,
+ 0xBB02, 0xBB03, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,
+ 0xBB0B, 0xBB0C, 0xBB0E, 0xBB10, 0xBB12, 0xBB13, 0xBB14, 0xBB15,
+ 0xBB16, 0xBB17, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1D, 0xBB1E, 0xBB1F,
+ 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26, 0xBB27, 0xBB28,
+ 0xBB2A, 0xBB2C, 0xBB2D, 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32,
+ 0xBB33, 0xBB37, 0xBB39, 0xBB3A, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,
+ 0xBB43, 0xBB46, 0xBB48, 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4E, 0xBB51,
+ 0xBB52, 0xBB53, 0xBB55, 0xBB56, 0xBB57, 0xBB59, 0xBB5A, 0xBB5B,
+ 0xBB5C, 0xBB5D, 0xBB5E, 0xBB5F, 0xBB60, 0xBB62, 0xBB64, 0xBB65,
+ 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, 0xBB6D, 0xBB6E,
+ 0xBB6F, 0xBB70, 0xBB71, 0xBB72, 0xBB73, 0xBB74, 0xBB75, 0xBB76,
+ 0xBB77, 0xBB78, 0xBB79, 0xBB7A, 0xBB7B, 0xBB7C, 0xBB7D, 0xBB7E,
+ 0xBB7F, 0xBB80, 0xBB81, 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86,
+ 0xBB87, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8D, 0xBB8E, 0xBB8F, 0xBB91,
+ 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96, 0xBB97, 0xBB98, 0xBB99,
+ 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D, 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1,
+ 0xBBA2, 0xBBA3, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA9, 0xBBAA, 0xBBAB,
+ 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2, 0xBBB3, 0xBBB5,
+ 0xBBB6, 0xBBB8, 0xBBB9, 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE,
+ 0xBBBF, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC5, 0xBBC6, 0xBBC7, 0xBBC9,
+ 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE, 0xBBCF, 0xBBD1, 0xBBD2,
+ 0xBBD4, 0xBBD5, 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB,
+ 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2, 0xBBE3,
+ 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA, 0xBBEB,
+ 0xBBEC, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1, 0xBBF2, 0xBBF3,
+ 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, 0xBBFA, 0xBBFB, 0xBBFD, 0xBBFE,
+ 0xBC01, 0xBC03, 0xBC04, 0xBC05, 0xBC06, 0xBC07, 0xBC0A, 0xBC0E,
+ 0xBC10, 0xBC12, 0xBC13, 0xBC19, 0xBC1A, 0xBC20, 0xBC21, 0xBC22,
+ 0xBC23, 0xBC26, 0xBC28, 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2E, 0xBC2F,
+ 0xBC32, 0xBC33, 0xBC35, 0xBC36, 0xBC37, 0xBC39, 0xBC3A, 0xBC3B,
+ 0xBC3C, 0xBC3D, 0xBC3E, 0xBC3F, 0xBC42, 0xBC46, 0xBC47, 0xBC48,
+ 0xBC4A, 0xBC4B, 0xBC4E, 0xBC4F, 0xBC51, 0xBC52, 0xBC53, 0xBC54,
+ 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A, 0xBC5B, 0xBC5C,
+ 0xBC5E, 0xBC5F, 0xBC60, 0xBC61, 0xBC62, 0xBC63, 0xBC64, 0xBC65,
+ 0xBC66, 0xBC67, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D,
+ 0xBC6E, 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75,
+ 0xBC76, 0xBC77, 0xBC78, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
+ 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, 0xBC86, 0xBC87,
+ 0xBC89, 0xBC8A, 0xBC8D, 0xBC8F, 0xBC90, 0xBC91, 0xBC92, 0xBC93,
+ 0xBC96, 0xBC98, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, 0xBCA2,
+ 0xBCA3, 0xBCA5, 0xBCA6, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD,
+ 0xBCAE, 0xBCAF, 0xBCB2, 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA,
+ 0xBCBB, 0xBCBE, 0xBCBF, 0xBCC1, 0xBCC2, 0xBCC3, 0xBCC5, 0xBCC6,
+ 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA, 0xBCCB, 0xBCCC, 0xBCCE, 0xBCD2,
+ 0xBCD3, 0xBCD4, 0xBCD6, 0xBCD7, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDD,
+ 0xBCDE, 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5,
+ 0xBCE6, 0xBCE7, 0xBCE8, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,
+ 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, 0xBCF7, 0xBCF9,
+ 0xBCFA, 0xBCFB, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,
+ 0xBD03, 0xBD06, 0xBD08, 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E,
+ 0xBD0F, 0xBD11, 0xBD12, 0xBD13, 0xBD15, 0xBD16, 0xBD17, 0xBD18,
+ 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E, 0xBD1F, 0xBD20,
+ 0xBD21, 0xBD22, 0xBD23, 0xBD25, 0xBD26, 0xBD27, 0xBD28, 0xBD29,
+ 0xBD2A, 0xBD2B, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,
+ 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,
+ 0xBD3B, 0xBD3C, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD41, 0xBD42, 0xBD43,
+ 0xBD44, 0xBD45, 0xBD46, 0xBD47, 0xBD4A, 0xBD4B, 0xBD4D, 0xBD4E,
+ 0xBD4F, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56, 0xBD57,
+ 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D, 0xBD5E, 0xBD5F, 0xBD60, 0xBD61,
+ 0xBD62, 0xBD63, 0xBD65, 0xBD66, 0xBD67, 0xBD69, 0xBD6A, 0xBD6B,
+ 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72, 0xBD73,
+ 0xBD74, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79, 0xBD7A, 0xBD7B,
+ 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, 0xBD82, 0xBD83, 0xBD85, 0xBD86,
+ 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E, 0xBD8F, 0xBD92, 0xBD94, 0xBD96,
+ 0xBD97, 0xBD98, 0xBD9B, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1,
+ 0xBDA2, 0xBDA3, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,
+ 0xBDAB, 0xBDAC, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB1, 0xBDB2, 0xBDB3,
+ 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC,
+ 0xBDBD, 0xBDBE, 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4,
+ 0xBDC5, 0xBDC6, 0xBDC7, 0xBDC8, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC,
+ 0xBDCD, 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, 0xBDD6,
+ 0xBDD7, 0xBDD9, 0xBDDA, 0xBDDB, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0,
+ 0xBDE1, 0xBDE2, 0xBDE3, 0xBDE4, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8,
+ 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, 0xBDF1, 0xBDF2,
+ 0xBDF3, 0xBDF5, 0xBDF6, 0xBDF7, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC,
+ 0xBDFD, 0xBDFE, 0xBDFF, 0xBE01, 0xBE02, 0xBE04, 0xBE06, 0xBE07,
+ 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, 0xBE0E, 0xBE0F, 0xBE11, 0xBE12,
+ 0xBE13, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A, 0xBE1B,
+ 0xBE1E, 0xBE20, 0xBE21, 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26,
+ 0xBE27, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,
+ 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,
+ 0xBE37, 0xBE38, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D, 0xBE3E,
+ 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, 0xBE46, 0xBE47, 0xBE49,
+ 0xBE4A, 0xBE4B, 0xBE4D, 0xBE4F, 0xBE50, 0xBE51, 0xBE52, 0xBE53,
+ 0xBE56, 0xBE58, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, 0xBE62, 0xBE63,
+ 0xBE65, 0xBE66, 0xBE67, 0xBE69, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,
+ 0xBE6F, 0xBE72, 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7E,
+ 0xBE7F, 0xBE81, 0xBE82, 0xBE83, 0xBE85, 0xBE86, 0xBE87, 0xBE88,
+ 0xBE89, 0xBE8A, 0xBE8B, 0xBE8E, 0xBE92, 0xBE93, 0xBE94, 0xBE95,
+ 0xBE96, 0xBE97, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E, 0xBE9F,
+ 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6, 0xBEA7,
+ 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD, 0xBEAE, 0xBEAF, 0xBEB0,
+ 0xBEB1, 0xBEB2, 0xBEB3, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8,
+ 0xBEB9, 0xBEBA, 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0,
+ 0xBEC1, 0xBEC2, 0xBEC3, 0xBEC4, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8,
+ 0xBEC9, 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, 0xBED2,
+ 0xBED3, 0xBED5, 0xBED6, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD,
+ 0xBEDE, 0xBEDF, 0xBEE1, 0xBEE2, 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9,
+ 0xBEEA, 0xBEEB, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,
+ 0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,
+ 0xBEFB, 0xBEFC, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF02, 0xBF03,
+ 0xBF04, 0xBF05, 0xBF06, 0xBF07, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D,
+ 0xBF0E, 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15,
+ 0xBF16, 0xBF17, 0xBF1A, 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22,
+ 0xBF23, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,
+ 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,
+ 0xBF33, 0xBF34, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39, 0xBF3A,
+ 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, 0xBF42, 0xBF43, 0xBF45,
+ 0xBF46, 0xBF47, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,
+ 0xBF4F, 0xBF52, 0xBF53, 0xBF54, 0xBF56, 0xBF57, 0xBF58, 0xBF59,
+ 0xBF5A, 0xBF5B, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61,
+ 0xBF62, 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69,
+ 0xBF6A, 0xBF6B, 0xBF6C, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,
+ 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, 0xBF78, 0xBF79,
+ 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E, 0xBF7F, 0xBF80, 0xBF81,
+ 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86, 0xBF87, 0xBF88, 0xBF89,
+ 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D, 0xBF8E, 0xBF8F, 0xBF90, 0xBF91,
+ 0xBF92, 0xBF93, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,
+ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,
+ 0xBFA3, 0xBFA4, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9, 0xBFAA,
+ 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, 0xBFB1, 0xBFB2, 0xBFB3,
+ 0xBFB4, 0xBFB5, 0xBFB6, 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB,
+ 0xBFBC, 0xBFBD, 0xBFBE, 0xBFBF, 0xBFC0, 0xBFC1, 0xBFC2, 0xBFC3,
+ 0xBFC4, 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, 0xBFCE,
+ 0xBFCF, 0xBFD1, 0xBFD2, 0xBFD3, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8,
+ 0xBFD9, 0xBFDA, 0xBFDB, 0xBFDD, 0xBFDE, 0xBFE0, 0xBFE2, 0xBFE3,
+ 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB,
+ 0xBFEC, 0xBFED, 0xBFEE, 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3,
+ 0xBFF4, 0xBFF5, 0xBFF6, 0xBFF7, 0xBFF8, 0xBFF9, 0xBFFA, 0xBFFB,
+ 0xBFFC, 0xBFFD, 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003,
+ 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A, 0xC00B,
+ 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012, 0xC013,
+ 0xC014, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019, 0xC01A, 0xC01B,
+ 0xC01C, 0xC01D, 0xC01E, 0xC01F, 0xC020, 0xC021, 0xC022, 0xC023,
+ 0xC024, 0xC025, 0xC026, 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B,
+ 0xC02C, 0xC02D, 0xC02E, 0xC02F, 0xC030, 0xC031, 0xC032, 0xC033,
+ 0xC034, 0xC035, 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B,
+ 0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042, 0xC043, 0xC044,
+ 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A, 0xC04B, 0xC04C,
+ 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC052, 0xC053, 0xC054, 0xC055,
+ 0xC056, 0xC057, 0xC059, 0xC05A, 0xC05B, 0xC05D, 0xC05E, 0xC05F,
+ 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066, 0xC067, 0xC06A,
+ 0xC06B, 0xC06C, 0xC06D, 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072,
+ 0xC073, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,
+ 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,
+ 0xC083, 0xC084, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089, 0xC08A,
+ 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, 0xC092, 0xC093, 0xC095,
+ 0xC096, 0xC097, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
+ 0xC09F, 0xC0A2, 0xC0A4, 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA,
+ 0xC0AB, 0xC0AE, 0xC0B1, 0xC0B2, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,
+ 0xC0BB, 0xC0BE, 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C6, 0xC0C7, 0xC0CA,
+ 0xC0CB, 0xC0CD, 0xC0CE, 0xC0CF, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4,
+ 0xC0D5, 0xC0D6, 0xC0D7, 0xC0DA, 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1,
+ 0xC0E2, 0xC0E3, 0xC0E6, 0xC0E7, 0xC0E9, 0xC0EA, 0xC0EB, 0xC0ED,
+ 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2, 0xC0F3, 0xC0F6, 0xC0F8,
+ 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, 0xC101, 0xC102,
+ 0xC103, 0xC105, 0xC106, 0xC107, 0xC109, 0xC10A, 0xC10B, 0xC10C,
+ 0xC10D, 0xC10E, 0xC10F, 0xC111, 0xC112, 0xC113, 0xC114, 0xC116,
+ 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, 0xC121, 0xC122, 0xC125,
+ 0xC128, 0xC129, 0xC12A, 0xC12B, 0xC12E, 0xC132, 0xC133, 0xC134,
+ 0xC135, 0xC137, 0xC13A, 0xC13B, 0xC13D, 0xC13E, 0xC13F, 0xC141,
+ 0xC142, 0xC143, 0xC144, 0xC145, 0xC146, 0xC147, 0xC14A, 0xC14E,
+ 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, 0xC156, 0xC157, 0xC159,
+ 0xC15A, 0xC15B, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,
+ 0xC163, 0xC166, 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F,
+ 0xC171, 0xC172, 0xC173, 0xC175, 0xC176, 0xC177, 0xC179, 0xC17A,
+ 0xC17B, 0xC17C, 0xC17D, 0xC17E, 0xC17F, 0xC180, 0xC181, 0xC182,
+ 0xC183, 0xC184, 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B,
+ 0xC18F, 0xC191, 0xC192, 0xC193, 0xC195, 0xC197, 0xC198, 0xC199,
+ 0xC19A, 0xC19B, 0xC19E, 0xC1A0, 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A6,
+ 0xC1A7, 0xC1AA, 0xC1AB, 0xC1AD, 0xC1AE, 0xC1AF, 0xC1B1, 0xC1B2,
+ 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6, 0xC1B7, 0xC1B8, 0xC1B9, 0xC1BA,
+ 0xC1BB, 0xC1BC, 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3,
+ 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C9, 0xC1CA, 0xC1CB, 0xC1CD, 0xC1CE,
+ 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2, 0xC1D3, 0xC1D5, 0xC1D6, 0xC1D9,
+ 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, 0xC1E1, 0xC1E2,
+ 0xC1E3, 0xC1E5, 0xC1E6, 0xC1E7, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC,
+ 0xC1ED, 0xC1EE, 0xC1EF, 0xC1F2, 0xC1F4, 0xC1F5, 0xC1F6, 0xC1F7,
+ 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, 0xC1FE, 0xC1FF, 0xC201, 0xC202,
+ 0xC203, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A, 0xC20B,
+ 0xC20E, 0xC210, 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217,
+ 0xC21A, 0xC21B, 0xC21D, 0xC21E, 0xC221, 0xC222, 0xC223, 0xC224,
+ 0xC225, 0xC226, 0xC227, 0xC22A, 0xC22C, 0xC22E, 0xC230, 0xC233,
+ 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A, 0xC23B, 0xC23C,
+ 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242, 0xC243, 0xC244,
+ 0xC245, 0xC246, 0xC247, 0xC249, 0xC24A, 0xC24B, 0xC24C, 0xC24D,
+ 0xC24E, 0xC24F, 0xC252, 0xC253, 0xC255, 0xC256, 0xC257, 0xC259,
+ 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E, 0xC25F, 0xC261, 0xC262,
+ 0xC263, 0xC264, 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B,
+ 0xC26E, 0xC26F, 0xC271, 0xC272, 0xC273, 0xC275, 0xC276, 0xC277,
+ 0xC278, 0xC279, 0xC27A, 0xC27B, 0xC27E, 0xC280, 0xC282, 0xC283,
+ 0xC284, 0xC285, 0xC286, 0xC287, 0xC28A, 0xC28B, 0xC28C, 0xC28D,
+ 0xC28E, 0xC28F, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,
+ 0xC297, 0xC299, 0xC29A, 0xC29C, 0xC29E, 0xC29F, 0xC2A0, 0xC2A1,
+ 0xC2A2, 0xC2A3, 0xC2A6, 0xC2A7, 0xC2A9, 0xC2AA, 0xC2AB, 0xC2AE,
+ 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2, 0xC2B3, 0xC2B6, 0xC2B8, 0xC2BA,
+ 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, 0xC2C0, 0xC2C1, 0xC2C2,
+ 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6, 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA,
+ 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE, 0xC2CF, 0xC2D0, 0xC2D1, 0xC2D2,
+ 0xC2D3, 0xC2D4, 0xC2D5, 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA,
+ 0xC2DB, 0xC2DE, 0xC2DF, 0xC2E1, 0xC2E2, 0xC2E5, 0xC2E6, 0xC2E7,
+ 0xC2E8, 0xC2E9, 0xC2EA, 0xC2EE, 0xC2F0, 0xC2F2, 0xC2F3, 0xC2F4,
+ 0xC2F5, 0xC2F7, 0xC2FA, 0xC2FD, 0xC2FE, 0xC2FF, 0xC301, 0xC302,
+ 0xC303, 0xC304, 0xC305, 0xC306, 0xC307, 0xC30A, 0xC30B, 0xC30E,
+ 0xC30F, 0xC310, 0xC311, 0xC312, 0xC316, 0xC317, 0xC319, 0xC31A,
+ 0xC31B, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322, 0xC323,
+ 0xC326, 0xC327, 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F,
+ 0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336, 0xC337,
+ 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E, 0xC33F,
+ 0xC340, 0xC341, 0xC342, 0xC343, 0xC344, 0xC346, 0xC347, 0xC348,
+ 0xC349, 0xC34A, 0xC34B, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350,
+ 0xC351, 0xC352, 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358,
+ 0xC359, 0xC35A, 0xC35B, 0xC35C, 0xC35D, 0xC35E, 0xC35F, 0xC360,
+ 0xC361, 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, 0xC36A,
+ 0xC36B, 0xC36D, 0xC36E, 0xC36F, 0xC371, 0xC373, 0xC374, 0xC375,
+ 0xC376, 0xC377, 0xC37A, 0xC37B, 0xC37E, 0xC37F, 0xC380, 0xC381,
+ 0xC382, 0xC383, 0xC385, 0xC386, 0xC387, 0xC389, 0xC38A, 0xC38B,
+ 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392, 0xC393, 0xC394,
+ 0xC395, 0xC396, 0xC397, 0xC398, 0xC399, 0xC39A, 0xC39B, 0xC39C,
+ 0xC39D, 0xC39E, 0xC39F, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4,
+ 0xC3A5, 0xC3A6, 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC,
+ 0xC3AD, 0xC3AE, 0xC3AF, 0xC3B0, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4,
+ 0xC3B5, 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, 0xC3BC,
+ 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C1, 0xC3C2, 0xC3C3, 0xC3C4, 0xC3C5,
+ 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA, 0xC3CB, 0xC3CC, 0xC3CD,
+ 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1, 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5,
+ 0xC3D6, 0xC3D7, 0xC3DA, 0xC3DB, 0xC3DD, 0xC3DE, 0xC3E1, 0xC3E3,
+ 0xC3E4, 0xC3E5, 0xC3E6, 0xC3E7, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3EE,
+ 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, 0xC3F6, 0xC3F7, 0xC3F9,
+ 0xC3FA, 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401,
+ 0xC402, 0xC403, 0xC404, 0xC405, 0xC406, 0xC407, 0xC409, 0xC40A,
+ 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, 0xC411, 0xC412, 0xC413,
+ 0xC414, 0xC415, 0xC416, 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B,
+ 0xC41C, 0xC41D, 0xC41E, 0xC41F, 0xC420, 0xC421, 0xC422, 0xC423,
+ 0xC425, 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, 0xC42D,
+ 0xC42E, 0xC42F, 0xC431, 0xC432, 0xC433, 0xC435, 0xC436, 0xC437,
+ 0xC438, 0xC439, 0xC43A, 0xC43B, 0xC43E, 0xC43F, 0xC440, 0xC441,
+ 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, 0xC449, 0xC44A,
+ 0xC44B, 0xC44C, 0xC44D, 0xC44E, 0xC44F, 0xC450, 0xC451, 0xC452,
+ 0xC453, 0xC454, 0xC455, 0xC456, 0xC457, 0xC458, 0xC459, 0xC45A,
+ 0xC45B, 0xC45C, 0xC45D, 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462,
+ 0xC463, 0xC466, 0xC467, 0xC469, 0xC46A, 0xC46B, 0xC46D, 0xC46E,
+ 0xC46F, 0xC470, 0xC471, 0xC472, 0xC473, 0xC476, 0xC477, 0xC478,
+ 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, 0xC481, 0xC482,
+ 0xC483, 0xC484, 0xC485, 0xC486, 0xC487, 0xC488, 0xC489, 0xC48A,
+ 0xC48B, 0xC48C, 0xC48D, 0xC48E, 0xC48F, 0xC490, 0xC491, 0xC492,
+ 0xC493, 0xC495, 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B,
+ 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2, 0xC4A3, 0xC4A4,
+ 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA, 0xC4AB, 0xC4AC,
+ 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1, 0xC4B2, 0xC4B3, 0xC4B4,
+ 0xC4B5, 0xC4B6, 0xC4B7, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BD, 0xC4BE,
+ 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,
+ 0xC4C7, 0xC4C8, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD, 0xC4CE,
+ 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, 0xC4D4, 0xC4D5, 0xC4D6,
+ 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA, 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE,
+ 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2, 0xC4E3, 0xC4E4, 0xC4E5, 0xC4E6,
+ 0xC4E7, 0xC4E8, 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF,
+ 0xC4F2, 0xC4F3, 0xC4F5, 0xC4F6, 0xC4F7, 0xC4F9, 0xC4FB, 0xC4FC,
+ 0xC4FD, 0xC4FE, 0xC502, 0xC503, 0xC504, 0xC505, 0xC506, 0xC507,
+ 0xC508, 0xC509, 0xC50A, 0xC50B, 0xC50D, 0xC50E, 0xC50F, 0xC511,
+ 0xC512, 0xC513, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,
+ 0xC51B, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521, 0xC522, 0xC523,
+ 0xC524, 0xC525, 0xC526, 0xC527, 0xC52A, 0xC52B, 0xC52D, 0xC52E,
+ 0xC52F, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536, 0xC537,
+ 0xC53A, 0xC53C, 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543,
+ 0xC546, 0xC547, 0xC54B, 0xC54F, 0xC550, 0xC551, 0xC552, 0xC556,
+ 0xC55A, 0xC55B, 0xC55C, 0xC55F, 0xC562, 0xC563, 0xC565, 0xC566,
+ 0xC567, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E, 0xC56F,
+ 0xC572, 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, 0xC57E,
+ 0xC57F, 0xC581, 0xC582, 0xC583, 0xC585, 0xC586, 0xC588, 0xC589,
+ 0xC58A, 0xC58B, 0xC58E, 0xC590, 0xC592, 0xC593, 0xC594, 0xC596,
+ 0xC599, 0xC59A, 0xC59B, 0xC59D, 0xC59E, 0xC59F, 0xC5A1, 0xC5A2,
+ 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6, 0xC5A7, 0xC5A8, 0xC5AA, 0xC5AB,
+ 0xC5AC, 0xC5AD, 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3,
+ 0xC5B6, 0xC5B7, 0xC5BA, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2, 0xC5C3,
+ 0xC5CB, 0xC5CD, 0xC5CF, 0xC5D2, 0xC5D3, 0xC5D5, 0xC5D6, 0xC5D7,
+ 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE, 0xC5DF, 0xC5E2,
+ 0xC5E4, 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, 0xC5EF,
+ 0xC5F1, 0xC5F2, 0xC5F3, 0xC5F5, 0xC5F8, 0xC5F9, 0xC5FA, 0xC5FB,
+ 0xC602, 0xC603, 0xC604, 0xC609, 0xC60A, 0xC60B, 0xC60D, 0xC60E,
+ 0xC60F, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616, 0xC617,
+ 0xC61A, 0xC61D, 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623,
+ 0xC626, 0xC627, 0xC629, 0xC62A, 0xC62B, 0xC62F, 0xC631, 0xC632,
+ 0xC636, 0xC638, 0xC63A, 0xC63C, 0xC63D, 0xC63E, 0xC63F, 0xC642,
+ 0xC643, 0xC645, 0xC646, 0xC647, 0xC649, 0xC64A, 0xC64B, 0xC64C,
+ 0xC64D, 0xC64E, 0xC64F, 0xC652, 0xC656, 0xC657, 0xC658, 0xC659,
+ 0xC65A, 0xC65B, 0xC65E, 0xC65F, 0xC661, 0xC662, 0xC663, 0xC664,
+ 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A, 0xC66B, 0xC66D,
+ 0xC66E, 0xC670, 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677,
+ 0xC67A, 0xC67B, 0xC67D, 0xC67E, 0xC67F, 0xC681, 0xC682, 0xC683,
+ 0xC684, 0xC685, 0xC686, 0xC687, 0xC68A, 0xC68C, 0xC68E, 0xC68F,
+ 0xC690, 0xC691, 0xC692, 0xC693, 0xC696, 0xC697, 0xC699, 0xC69A,
+ 0xC69B, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2, 0xC6A3,
+ 0xC6A6, 0xC6A8, 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF,
+ 0xC6B2, 0xC6B3, 0xC6B5, 0xC6B6, 0xC6B7, 0xC6BB, 0xC6BC, 0xC6BD,
+ 0xC6BE, 0xC6BF, 0xC6C2, 0xC6C4, 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9,
+ 0xC6CA, 0xC6CB, 0xC6CE, 0xC6CF, 0xC6D1, 0xC6D2, 0xC6D3, 0xC6D5,
+ 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA, 0xC6DB, 0xC6DE, 0xC6DF,
+ 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, 0xC6EA, 0xC6EB,
+ 0xC6ED, 0xC6EE, 0xC6EF, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5,
+ 0xC6F6, 0xC6F7, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FE, 0xC6FF, 0xC700,
+ 0xC701, 0xC702, 0xC703, 0xC706, 0xC707, 0xC709, 0xC70A, 0xC70B,
+ 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712, 0xC713, 0xC716,
+ 0xC718, 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, 0xC722,
+ 0xC723, 0xC725, 0xC726, 0xC727, 0xC729, 0xC72A, 0xC72B, 0xC72C,
+ 0xC72D, 0xC72E, 0xC72F, 0xC732, 0xC734, 0xC736, 0xC738, 0xC739,
+ 0xC73A, 0xC73B, 0xC73E, 0xC73F, 0xC741, 0xC742, 0xC743, 0xC745,
+ 0xC746, 0xC747, 0xC748, 0xC749, 0xC74B, 0xC74E, 0xC750, 0xC759,
+ 0xC75A, 0xC75B, 0xC75D, 0xC75E, 0xC75F, 0xC761, 0xC762, 0xC763,
+ 0xC764, 0xC765, 0xC766, 0xC767, 0xC769, 0xC76A, 0xC76C, 0xC76D,
+ 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, 0xC776, 0xC777,
+ 0xC779, 0xC77A, 0xC77B, 0xC77F, 0xC780, 0xC781, 0xC782, 0xC786,
+ 0xC78B, 0xC78C, 0xC78D, 0xC78F, 0xC792, 0xC793, 0xC795, 0xC799,
+ 0xC79B, 0xC79C, 0xC79D, 0xC79E, 0xC79F, 0xC7A2, 0xC7A7, 0xC7A8,
+ 0xC7A9, 0xC7AA, 0xC7AB, 0xC7AE, 0xC7AF, 0xC7B1, 0xC7B2, 0xC7B3,
+ 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA, 0xC7BB, 0xC7BE,
+ 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, 0xC7CA, 0xC7CB,
+ 0xC7CD, 0xC7CF, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,
+ 0xC7D7, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DE, 0xC7DF, 0xC7E0,
+ 0xC7E1, 0xC7E2, 0xC7E3, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E9, 0xC7EA,
+ 0xC7EB, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2, 0xC7F3,
+ 0xC7F4, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9, 0xC7FA, 0xC7FB,
+ 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, 0xC802, 0xC803, 0xC805, 0xC806,
+ 0xC807, 0xC809, 0xC80B, 0xC80C, 0xC80D, 0xC80E, 0xC80F, 0xC812,
+ 0xC814, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, 0xC81E, 0xC81F,
+ 0xC821, 0xC822, 0xC823, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829,
+ 0xC82A, 0xC82B, 0xC82E, 0xC830, 0xC832, 0xC833, 0xC834, 0xC835,
+ 0xC836, 0xC837, 0xC839, 0xC83A, 0xC83B, 0xC83D, 0xC83E, 0xC83F,
+ 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846, 0xC847, 0xC84A,
+ 0xC84B, 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, 0xC855,
+ 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A, 0xC85B, 0xC85C, 0xC85D,
+ 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862, 0xC863, 0xC864, 0xC865,
+ 0xC866, 0xC867, 0xC868, 0xC869, 0xC86A, 0xC86B, 0xC86C, 0xC86D,
+ 0xC86E, 0xC86F, 0xC872, 0xC873, 0xC875, 0xC876, 0xC877, 0xC879,
+ 0xC87B, 0xC87C, 0xC87D, 0xC87E, 0xC87F, 0xC882, 0xC884, 0xC888,
+ 0xC889, 0xC88A, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892, 0xC893,
+ 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A, 0xC89B, 0xC89C,
+ 0xC89E, 0xC8A0, 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7,
+ 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE, 0xC8AF, 0xC8B0,
+ 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6, 0xC8B7, 0xC8B8,
+ 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2,
+ 0xC8C3, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C9, 0xC8CA, 0xC8CB, 0xC8CD,
+ 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2, 0xC8D3, 0xC8D6, 0xC8D8,
+ 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, 0xC8E2, 0xC8E3,
+ 0xC8E5, 0xC8E6, 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC,
+ 0xC8ED, 0xC8EE, 0xC8EF, 0xC8F0, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4,
+ 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, 0xC8FE, 0xC8FF,
+ 0xC901, 0xC902, 0xC903, 0xC907, 0xC908, 0xC909, 0xC90A, 0xC90B,
+ 0xC90E, 0xC910, 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917,
+ 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E, 0xC91F, 0xC920,
+ 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926, 0xC927, 0xC928,
+ 0xC929, 0xC92A, 0xC92B, 0xC92D, 0xC92E, 0xC92F, 0xC930, 0xC931,
+ 0xC932, 0xC933, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,
+ 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,
+ 0xC943, 0xC944, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949, 0xC94A,
+ 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, 0xC952, 0xC953, 0xC955,
+ 0xC956, 0xC957, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,
+ 0xC95F, 0xC962, 0xC964, 0xC965, 0xC966, 0xC967, 0xC968, 0xC969,
+ 0xC96A, 0xC96B, 0xC96D, 0xC96E, 0xC96F, 0xC971, 0xC972, 0xC973,
+ 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A, 0xC97B, 0xC97D,
+ 0xC97E, 0xC97F, 0xC980, 0xC981, 0xC982, 0xC983, 0xC984, 0xC985,
+ 0xC986, 0xC987, 0xC98A, 0xC98B, 0xC98D, 0xC98E, 0xC98F, 0xC991,
+ 0xC992, 0xC993, 0xC994, 0xC995, 0xC996, 0xC997, 0xC99A, 0xC99C,
+ 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, 0xC9A4, 0xC9A5,
+ 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA, 0xC9AB, 0xC9AC, 0xC9AD,
+ 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2, 0xC9B3, 0xC9B4, 0xC9B5,
+ 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9, 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD,
+ 0xC9BE, 0xC9BF, 0xC9C2, 0xC9C3, 0xC9C5, 0xC9C6, 0xC9C9, 0xC9CB,
+ 0xC9CC, 0xC9CD, 0xC9CE, 0xC9CF, 0xC9D2, 0xC9D4, 0xC9D7, 0xC9D8,
+ 0xC9DB, 0xC9DE, 0xC9DF, 0xC9E1, 0xC9E3, 0xC9E5, 0xC9E6, 0xC9E8,
+ 0xC9E9, 0xC9EA, 0xC9EB, 0xC9EE, 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5,
+ 0xC9F6, 0xC9F7, 0xC9FA, 0xC9FB, 0xC9FD, 0xC9FE, 0xC9FF, 0xCA01,
+ 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06, 0xCA07, 0xCA0A, 0xCA0E,
+ 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, 0xCA15, 0xCA16, 0xCA17,
+ 0xCA19, 0xCA1A, 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20,
+ 0xCA21, 0xCA22, 0xCA23, 0xCA24, 0xCA25, 0xCA26, 0xCA27, 0xCA28,
+ 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, 0xCA30, 0xCA31,
+ 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36, 0xCA37, 0xCA38, 0xCA39,
+ 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E, 0xCA3F, 0xCA40, 0xCA41,
+ 0xCA42, 0xCA43, 0xCA44, 0xCA45, 0xCA46, 0xCA47, 0xCA48, 0xCA49,
+ 0xCA4A, 0xCA4B, 0xCA4E, 0xCA4F, 0xCA51, 0xCA52, 0xCA53, 0xCA55,
+ 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A, 0xCA5B, 0xCA5E, 0xCA62,
+ 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, 0xCA69, 0xCA6A, 0xCA6B,
+ 0xCA6C, 0xCA6D, 0xCA6E, 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73,
+ 0xCA74, 0xCA75, 0xCA76, 0xCA77, 0xCA78, 0xCA79, 0xCA7A, 0xCA7B,
+ 0xCA7C, 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, 0xCA85,
+ 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A, 0xCA8B, 0xCA8C, 0xCA8D,
+ 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92, 0xCA93, 0xCA94, 0xCA95,
+ 0xCA96, 0xCA97, 0xCA99, 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E,
+ 0xCA9F, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,
+ 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,
+ 0xCAAF, 0xCAB0, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5, 0xCAB6,
+ 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, 0xCABE, 0xCABF, 0xCAC1,
+ 0xCAC2, 0xCAC3, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,
+ 0xCACB, 0xCACE, 0xCAD0, 0xCAD2, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7,
+ 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE, 0xCADF, 0xCAE1, 0xCAE2,
+ 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6, 0xCAE7, 0xCAE8, 0xCAE9, 0xCAEA,
+ 0xCAEB, 0xCAED, 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3,
+ 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA, 0xCAFB, 0xCAFC,
+ 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02, 0xCB03, 0xCB04,
+ 0xCB05, 0xCB06, 0xCB07, 0xCB09, 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D,
+ 0xCB0E, 0xCB0F, 0xCB11, 0xCB12, 0xCB13, 0xCB15, 0xCB16, 0xCB17,
+ 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E, 0xCB1F, 0xCB22,
+ 0xCB23, 0xCB24, 0xCB25, 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A,
+ 0xCB2B, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,
+ 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,
+ 0xCB3B, 0xCB3C, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB42, 0xCB43,
+ 0xCB44, 0xCB45, 0xCB46, 0xCB47, 0xCB4A, 0xCB4B, 0xCB4D, 0xCB4E,
+ 0xCB4F, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56, 0xCB57,
+ 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62,
+ 0xCB63, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A, 0xCB6B,
+ 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72, 0xCB73,
+ 0xCB74, 0xCB75, 0xCB76, 0xCB77, 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D,
+ 0xCB7E, 0xCB7F, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85,
+ 0xCB86, 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D,
+ 0xCB8E, 0xCB8F, 0xCB90, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,
+ 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, 0xCB9D, 0xCB9E,
+ 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2, 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6,
+ 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA, 0xCBAB, 0xCBAC, 0xCBAD, 0xCBAE,
+ 0xCBAF, 0xCBB0, 0xCBB1, 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6,
+ 0xCBB7, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE, 0xCBBF,
+ 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6, 0xCBC7,
+ 0xCBC8, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD, 0xCBCE, 0xCBCF,
+ 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8,
+ 0xCBD9, 0xCBDA, 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0,
+ 0xCBE1, 0xCBE2, 0xCBE3, 0xCBE5, 0xCBE6, 0xCBE8, 0xCBEA, 0xCBEB,
+ 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3,
+ 0xCBF4, 0xCBF5, 0xCBF6, 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB,
+ 0xCBFC, 0xCBFD, 0xCBFE, 0xCBFF, 0xCC00, 0xCC01, 0xCC02, 0xCC03,
+ 0xCC04, 0xCC05, 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B,
+ 0xCC0E, 0xCC0F, 0xCC11, 0xCC12, 0xCC13, 0xCC15, 0xCC16, 0xCC17,
+ 0xCC18, 0xCC19, 0xCC1A, 0xCC1B, 0xCC1E, 0xCC1F, 0xCC20, 0xCC23,
+ 0xCC24, 0xCC25, 0xCC26, 0xCC2A, 0xCC2B, 0xCC2D, 0xCC2F, 0xCC31,
+ 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36, 0xCC37, 0xCC3A, 0xCC3F,
+ 0xCC40, 0xCC41, 0xCC42, 0xCC43, 0xCC46, 0xCC47, 0xCC49, 0xCC4A,
+ 0xCC4B, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52, 0xCC53,
+ 0xCC56, 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, 0xCC61,
+ 0xCC62, 0xCC63, 0xCC65, 0xCC67, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C,
+ 0xCC6D, 0xCC6E, 0xCC6F, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC76,
+ 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, 0xCC7C, 0xCC7D, 0xCC7E,
+ 0xCC7F, 0xCC80, 0xCC81, 0xCC82, 0xCC83, 0xCC84, 0xCC85, 0xCC86,
+ 0xCC87, 0xCC88, 0xCC89, 0xCC8A, 0xCC8B, 0xCC8C, 0xCC8D, 0xCC8E,
+ 0xCC8F, 0xCC90, 0xCC91, 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96,
+ 0xCC97, 0xCC9A, 0xCC9B, 0xCC9D, 0xCC9E, 0xCC9F, 0xCCA1, 0xCCA2,
+ 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6, 0xCCA7, 0xCCAA, 0xCCAE, 0xCCAF,
+ 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, 0xCCB6, 0xCCB7, 0xCCB9, 0xCCBA,
+ 0xCCBB, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2, 0xCCC3,
+ 0xCCC6, 0xCCC8, 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF,
+ 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD5, 0xCCD6, 0xCCD7, 0xCCD8, 0xCCD9,
+ 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE, 0xCCDF, 0xCCE0, 0xCCE1,
+ 0xCCE2, 0xCCE3, 0xCCE5, 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA,
+ 0xCCEB, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF1, 0xCCF2, 0xCCF3, 0xCCF4,
+ 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA, 0xCCFB, 0xCCFC,
+ 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD02, 0xCD03, 0xCD04, 0xCD05,
+ 0xCD06, 0xCD07, 0xCD0A, 0xCD0B, 0xCD0D, 0xCD0E, 0xCD0F, 0xCD11,
+ 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16, 0xCD17, 0xCD1A, 0xCD1C,
+ 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, 0xCD25, 0xCD26,
+ 0xCD27, 0xCD29, 0xCD2A, 0xCD2B, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30,
+ 0xCD31, 0xCD32, 0xCD33, 0xCD34, 0xCD35, 0xCD36, 0xCD37, 0xCD38,
+ 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, 0xCD40, 0xCD41,
+ 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46, 0xCD47, 0xCD48, 0xCD49,
+ 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E, 0xCD4F, 0xCD50, 0xCD51,
+ 0xCD52, 0xCD53, 0xCD54, 0xCD55, 0xCD56, 0xCD57, 0xCD58, 0xCD59,
+ 0xCD5A, 0xCD5B, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD61, 0xCD62, 0xCD63,
+ 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A, 0xCD6B, 0xCD6E,
+ 0xCD70, 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, 0xCD79,
+ 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E, 0xCD7F, 0xCD80, 0xCD81,
+ 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86, 0xCD87, 0xCD89, 0xCD8A,
+ 0xCD8B, 0xCD8C, 0xCD8D, 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92,
+ 0xCD93, 0xCD96, 0xCD97, 0xCD99, 0xCD9A, 0xCD9B, 0xCD9D, 0xCD9E,
+ 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2, 0xCDA3, 0xCDA6, 0xCDA8, 0xCDAA,
+ 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, 0xCDB1, 0xCDB2, 0xCDB3,
+ 0xCDB4, 0xCDB5, 0xCDB6, 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB,
+ 0xCDBC, 0xCDBD, 0xCDBE, 0xCDBF, 0xCDC0, 0xCDC1, 0xCDC2, 0xCDC3,
+ 0xCDC5, 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, 0xCDCD,
+ 0xCDCE, 0xCDCF, 0xCDD1, 0xCDD2, 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6,
+ 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA, 0xCDDB, 0xCDDC, 0xCDDD, 0xCDDE,
+ 0xCDDF, 0xCDE0, 0xCDE1, 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6,
+ 0xCDE7, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDED, 0xCDEE, 0xCDEF, 0xCDF1,
+ 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6, 0xCDF7, 0xCDFA, 0xCDFC,
+ 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, 0xCE05, 0xCE06,
+ 0xCE07, 0xCE09, 0xCE0A, 0xCE0B, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10,
+ 0xCE11, 0xCE12, 0xCE13, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE1A,
+ 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, 0xCE22, 0xCE23, 0xCE25,
+ 0xCE26, 0xCE27, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,
+ 0xCE2F, 0xCE32, 0xCE34, 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A,
+ 0xCE3B, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,
+ 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,
+ 0xCE4B, 0xCE4C, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51, 0xCE52,
+ 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, 0xCE5A, 0xCE5B, 0xCE5D,
+ 0xCE5E, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66, 0xCE67, 0xCE6A,
+ 0xCE6C, 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, 0xCE76,
+ 0xCE77, 0xCE79, 0xCE7A, 0xCE7B, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80,
+ 0xCE81, 0xCE82, 0xCE83, 0xCE86, 0xCE88, 0xCE8A, 0xCE8B, 0xCE8C,
+ 0xCE8D, 0xCE8E, 0xCE8F, 0xCE92, 0xCE93, 0xCE95, 0xCE96, 0xCE97,
+ 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E, 0xCE9F, 0xCEA2,
+ 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, 0xCEAE, 0xCEAF,
+ 0xCEB0, 0xCEB1, 0xCEB2, 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7,
+ 0xCEB8, 0xCEB9, 0xCEBA, 0xCEBB, 0xCEBC, 0xCEBD, 0xCEBE, 0xCEBF,
+ 0xCEC0, 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, 0xCEC8,
+ 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE, 0xCECF, 0xCED0,
+ 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6, 0xCED7, 0xCED8,
+ 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD, 0xCEDE, 0xCEDF, 0xCEE0,
+ 0xCEE1, 0xCEE2, 0xCEE3, 0xCEE6, 0xCEE7, 0xCEE9, 0xCEEA, 0xCEED,
+ 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2, 0xCEF3, 0xCEF6, 0xCEFA,
+ 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, 0xCF02, 0xCF03, 0xCF05,
+ 0xCF06, 0xCF07, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,
+ 0xCF0F, 0xCF12, 0xCF14, 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A,
+ 0xCF1B, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF21, 0xCF22, 0xCF23, 0xCF25,
+ 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A, 0xCF2B, 0xCF2E, 0xCF32,
+ 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, 0xCF39, 0xCF3A, 0xCF3B,
+ 0xCF3C, 0xCF3D, 0xCF3E, 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43,
+ 0xCF44, 0xCF45, 0xCF46, 0xCF47, 0xCF48, 0xCF49, 0xCF4A, 0xCF4B,
+ 0xCF4C, 0xCF4D, 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53,
+ 0xCF56, 0xCF57, 0xCF59, 0xCF5A, 0xCF5B, 0xCF5D, 0xCF5E, 0xCF5F,
+ 0xCF60, 0xCF61, 0xCF62, 0xCF63, 0xCF66, 0xCF68, 0xCF6A, 0xCF6B,
+ 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, 0xCF72, 0xCF73, 0xCF75, 0xCF76,
+ 0xCF77, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E, 0xCF7F,
+ 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF86, 0xCF87, 0xCF88, 0xCF89,
+ 0xCF8A, 0xCF8B, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,
+ 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,
+ 0xCF9B, 0xCF9C, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA2, 0xCFA3,
+ 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC,
+ 0xCFAD, 0xCFAE, 0xCFAF, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5,
+ 0xCFB6, 0xCFB7, 0xCFB8, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,
+ 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, 0xCFC5, 0xCFC6,
+ 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA, 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE,
+ 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2, 0xCFD3, 0xCFD4, 0xCFD5, 0xCFD6,
+ 0xCFD7, 0xCFD8, 0xCFD9, 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE,
+ 0xCFDF, 0xCFE2, 0xCFE3, 0xCFE5, 0xCFE6, 0xCFE7, 0xCFE9, 0xCFEA,
+ 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE, 0xCFEF, 0xCFF2, 0xCFF4, 0xCFF6,
+ 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, 0xCFFD, 0xCFFE, 0xCFFF,
+ 0xD001, 0xD002, 0xD003, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009,
+ 0xD00A, 0xD00B, 0xD00C, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD012,
+ 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, 0xD019, 0xD01A, 0xD01B,
+ 0xD01C, 0xD01D, 0xD01E, 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023,
+ 0xD024, 0xD025, 0xD026, 0xD027, 0xD028, 0xD029, 0xD02A, 0xD02B,
+ 0xD02C, 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, 0xD036,
+ 0xD037, 0xD039, 0xD03A, 0xD03B, 0xD03D, 0xD03E, 0xD03F, 0xD040,
+ 0xD041, 0xD042, 0xD043, 0xD046, 0xD048, 0xD04A, 0xD04B, 0xD04C,
+ 0xD04D, 0xD04E, 0xD04F, 0xD051, 0xD052, 0xD053, 0xD055, 0xD056,
+ 0xD057, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E, 0xD05F,
+ 0xD061, 0xD062, 0xD063, 0xD064, 0xD065, 0xD066, 0xD067, 0xD068,
+ 0xD069, 0xD06A, 0xD06B, 0xD06E, 0xD06F, 0xD071, 0xD072, 0xD073,
+ 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A, 0xD07B, 0xD07E,
+ 0xD07F, 0xD080, 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087,
+ 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E, 0xD08F,
+ 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096, 0xD097,
+ 0xD098, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D, 0xD09E, 0xD09F,
+ 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, 0xD0A6, 0xD0A7, 0xD0A9, 0xD0AA,
+ 0xD0AB, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2, 0xD0B3,
+ 0xD0B6, 0xD0B8, 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF,
+ 0xD0C2, 0xD0C3, 0xD0C5, 0xD0C6, 0xD0C7, 0xD0CA, 0xD0CB, 0xD0CC,
+ 0xD0CD, 0xD0CE, 0xD0CF, 0xD0D2, 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9,
+ 0xD0DA, 0xD0DB, 0xD0DE, 0xD0DF, 0xD0E1, 0xD0E2, 0xD0E3, 0xD0E5,
+ 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA, 0xD0EB, 0xD0EE, 0xD0F2,
+ 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, 0xD0F9, 0xD0FA, 0xD0FB,
+ 0xD0FC, 0xD0FD, 0xD0FE, 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103,
+ 0xD104, 0xD105, 0xD106, 0xD107, 0xD108, 0xD109, 0xD10A, 0xD10B,
+ 0xD10C, 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, 0xD114,
+ 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A, 0xD11B, 0xD11C,
+ 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122, 0xD123, 0xD124,
+ 0xD125, 0xD126, 0xD127, 0xD128, 0xD129, 0xD12A, 0xD12B, 0xD12C,
+ 0xD12D, 0xD12E, 0xD12F, 0xD132, 0xD133, 0xD135, 0xD136, 0xD137,
+ 0xD139, 0xD13B, 0xD13C, 0xD13D, 0xD13E, 0xD13F, 0xD142, 0xD146,
+ 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, 0xD14E, 0xD14F, 0xD151,
+ 0xD152, 0xD153, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,
+ 0xD15B, 0xD15E, 0xD160, 0xD162, 0xD163, 0xD164, 0xD165, 0xD166,
+ 0xD167, 0xD169, 0xD16A, 0xD16B, 0xD16D, 0xD16E, 0xD16F, 0xD170,
+ 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176, 0xD177, 0xD178,
+ 0xD179, 0xD17A, 0xD17B, 0xD17D, 0xD17E, 0xD17F, 0xD180, 0xD181,
+ 0xD182, 0xD183, 0xD185, 0xD186, 0xD187, 0xD189, 0xD18A, 0xD18B,
+ 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192, 0xD193,
+ 0xD194, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199, 0xD19A, 0xD19B,
+ 0xD19C, 0xD19D, 0xD19E, 0xD19F, 0xD1A2, 0xD1A3, 0xD1A5, 0xD1A6,
+ 0xD1A7, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE, 0xD1AF,
+ 0xD1B2, 0xD1B4, 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BB, 0xD1BD,
+ 0xD1BE, 0xD1BF, 0xD1C1, 0xD1C2, 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6,
+ 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA, 0xD1CB, 0xD1CC, 0xD1CD, 0xD1CE,
+ 0xD1CF, 0xD1D0, 0xD1D1, 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6,
+ 0xD1D7, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE, 0xD1DF,
+ 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6, 0xD1E7,
+ 0xD1E8, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED, 0xD1EE, 0xD1EF,
+ 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F9,
+ 0xD1FA, 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201,
+ 0xD202, 0xD203, 0xD204, 0xD205, 0xD206, 0xD208, 0xD20A, 0xD20B,
+ 0xD20C, 0xD20D, 0xD20E, 0xD20F, 0xD211, 0xD212, 0xD213, 0xD214,
+ 0xD215, 0xD216, 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C,
+ 0xD21D, 0xD21E, 0xD21F, 0xD220, 0xD221, 0xD222, 0xD223, 0xD224,
+ 0xD225, 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, 0xD22E,
+ 0xD22F, 0xD231, 0xD232, 0xD233, 0xD235, 0xD236, 0xD237, 0xD238,
+ 0xD239, 0xD23A, 0xD23B, 0xD23E, 0xD240, 0xD242, 0xD243, 0xD244,
+ 0xD245, 0xD246, 0xD247, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D,
+ 0xD24E, 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255,
+ 0xD256, 0xD257, 0xD258, 0xD259, 0xD25A, 0xD25B, 0xD25D, 0xD25E,
+ 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, 0xD265, 0xD266, 0xD267,
+ 0xD268, 0xD269, 0xD26A, 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F,
+ 0xD270, 0xD271, 0xD272, 0xD273, 0xD274, 0xD275, 0xD276, 0xD277,
+ 0xD278, 0xD279, 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F,
+ 0xD282, 0xD283, 0xD285, 0xD286, 0xD287, 0xD289, 0xD28A, 0xD28B,
+ 0xD28C, 0xD28D, 0xD28E, 0xD28F, 0xD292, 0xD293, 0xD294, 0xD296,
+ 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, 0xD29D, 0xD29E, 0xD29F,
+ 0xD2A1, 0xD2A2, 0xD2A3, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9,
+ 0xD2AA, 0xD2AB, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B2, 0xD2B3,
+ 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, 0xD2BA, 0xD2BB, 0xD2BD, 0xD2BE,
+ 0xD2C1, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6, 0xD2C7, 0xD2CA, 0xD2CC,
+ 0xD2CD, 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, 0xD2D5,
+ 0xD2D6, 0xD2D7, 0xD2D9, 0xD2DA, 0xD2DB, 0xD2DD, 0xD2DE, 0xD2DF,
+ 0xD2E0, 0xD2E1, 0xD2E2, 0xD2E3, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,
+ 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, 0xD2F2, 0xD2F3,
+ 0xD2F5, 0xD2F6, 0xD2F7, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD,
+ 0xD2FE, 0xD2FF, 0xD302, 0xD304, 0xD306, 0xD307, 0xD308, 0xD309,
+ 0xD30A, 0xD30B, 0xD30F, 0xD311, 0xD312, 0xD313, 0xD315, 0xD317,
+ 0xD318, 0xD319, 0xD31A, 0xD31B, 0xD31E, 0xD322, 0xD323, 0xD324,
+ 0xD326, 0xD327, 0xD32A, 0xD32B, 0xD32D, 0xD32E, 0xD32F, 0xD331,
+ 0xD332, 0xD333, 0xD334, 0xD335, 0xD336, 0xD337, 0xD33A, 0xD33E,
+ 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, 0xD346, 0xD347, 0xD348,
+ 0xD349, 0xD34A, 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350,
+ 0xD351, 0xD352, 0xD353, 0xD354, 0xD355, 0xD356, 0xD357, 0xD358,
+ 0xD359, 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, 0xD360,
+ 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366, 0xD367, 0xD368,
+ 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E, 0xD36F, 0xD370,
+ 0xD371, 0xD372, 0xD373, 0xD374, 0xD375, 0xD376, 0xD377, 0xD378,
+ 0xD379, 0xD37A, 0xD37B, 0xD37E, 0xD37F, 0xD381, 0xD382, 0xD383,
+ 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A, 0xD38B, 0xD38E,
+ 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, 0xD39A, 0xD39B,
+ 0xD39D, 0xD39E, 0xD39F, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5,
+ 0xD3A6, 0xD3A7, 0xD3AA, 0xD3AC, 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1,
+ 0xD3B2, 0xD3B3, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B9, 0xD3BA, 0xD3BB,
+ 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2, 0xD3C3, 0xD3C6,
+ 0xD3C7, 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, 0xD3D1,
+ 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6, 0xD3D7, 0xD3D9, 0xD3DA,
+ 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE, 0xD3DF, 0xD3E0, 0xD3E2, 0xD3E4,
+ 0xD3E5, 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, 0xD3EE,
+ 0xD3EF, 0xD3F1, 0xD3F2, 0xD3F3, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8,
+ 0xD3F9, 0xD3FA, 0xD3FB, 0xD3FE, 0xD400, 0xD402, 0xD403, 0xD404,
+ 0xD405, 0xD406, 0xD407, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D,
+ 0xD40E, 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415,
+ 0xD416, 0xD417, 0xD418, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41E,
+ 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, 0xD424, 0xD425, 0xD426,
+ 0xD427, 0xD428, 0xD429, 0xD42A, 0xD42B, 0xD42C, 0xD42D, 0xD42E,
+ 0xD42F, 0xD430, 0xD431, 0xD432, 0xD433, 0xD434, 0xD435, 0xD436,
+ 0xD437, 0xD438, 0xD439, 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E,
+ 0xD43F, 0xD441, 0xD442, 0xD443, 0xD445, 0xD446, 0xD447, 0xD448,
+ 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E, 0xD44F, 0xD450,
+ 0xD451, 0xD452, 0xD453, 0xD454, 0xD455, 0xD456, 0xD457, 0xD458,
+ 0xD459, 0xD45A, 0xD45B, 0xD45D, 0xD45E, 0xD45F, 0xD461, 0xD462,
+ 0xD463, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A, 0xD46B,
+ 0xD46C, 0xD46E, 0xD470, 0xD471, 0xD472, 0xD473, 0xD474, 0xD475,
+ 0xD476, 0xD477, 0xD47A, 0xD47B, 0xD47D, 0xD47E, 0xD481, 0xD483,
+ 0xD484, 0xD485, 0xD486, 0xD487, 0xD48A, 0xD48C, 0xD48E, 0xD48F,
+ 0xD490, 0xD491, 0xD492, 0xD493, 0xD495, 0xD496, 0xD497, 0xD498,
+ 0xD499, 0xD49A, 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0,
+ 0xD4A1, 0xD4A2, 0xD4A3, 0xD4A4, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8,
+ 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, 0xD4B0, 0xD4B1,
+ 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6, 0xD4B7, 0xD4B8, 0xD4B9,
+ 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE, 0xD4BF, 0xD4C0, 0xD4C1,
+ 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5, 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9,
+ 0xD4CA, 0xD4CB, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D1, 0xD4D2, 0xD4D3,
+ 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA, 0xD4DB, 0xD4DD,
+ 0xD4DE, 0xD4E0, 0xD4E1, 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6,
+ 0xD4E7, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4ED, 0xD4EE, 0xD4EF, 0xD4F1,
+ 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6, 0xD4F7, 0xD4F9, 0xD4FA,
+ 0xD4FC, 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, 0xD505,
+ 0xD506, 0xD507, 0xD509, 0xD50A, 0xD50B, 0xD50D, 0xD50E, 0xD50F,
+ 0xD510, 0xD511, 0xD512, 0xD513, 0xD516, 0xD518, 0xD519, 0xD51A,
+ 0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, 0xD520, 0xD521, 0xD522,
+ 0xD523, 0xD524, 0xD525, 0xD526, 0xD527, 0xD528, 0xD529, 0xD52A,
+ 0xD52B, 0xD52C, 0xD52D, 0xD52E, 0xD52F, 0xD530, 0xD531, 0xD532,
+ 0xD533, 0xD534, 0xD535, 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A,
+ 0xD53B, 0xD53E, 0xD53F, 0xD541, 0xD542, 0xD543, 0xD545, 0xD546,
+ 0xD547, 0xD548, 0xD549, 0xD54A, 0xD54B, 0xD54E, 0xD550, 0xD552,
+ 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, 0xD55A, 0xD55B, 0xD55D,
+ 0xD55E, 0xD55F, 0xD561, 0xD562, 0xD563, 0xD564, 0xD566, 0xD567,
+ 0xD56A, 0xD56C, 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573,
+ 0xD576, 0xD577, 0xD579, 0xD57A, 0xD57B, 0xD57D, 0xD57E, 0xD57F,
+ 0xD580, 0xD581, 0xD582, 0xD583, 0xD586, 0xD58A, 0xD58B, 0xD58C,
+ 0xD58D, 0xD58E, 0xD58F, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595,
+ 0xD596, 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D,
+ 0xD59E, 0xD59F, 0xD5A0, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A6,
+ 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, 0xD5AC, 0xD5AD, 0xD5AE,
+ 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2, 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6,
+ 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA, 0xD5BB, 0xD5BC, 0xD5BD, 0xD5BE,
+ 0xD5BF, 0xD5C0, 0xD5C1, 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6,
+ 0xD5C7, 0xD5CA, 0xD5CB, 0xD5CD, 0xD5CE, 0xD5CF, 0xD5D1, 0xD5D3,
+ 0xD5D4, 0xD5D5, 0xD5D6, 0xD5D7, 0xD5DA, 0xD5DC, 0xD5DE, 0xD5DF,
+ 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, 0xD5E6, 0xD5E7, 0xD5E9, 0xD5EA,
+ 0xD5EB, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2, 0xD5F3,
+ 0xD5F6, 0xD5F8, 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF,
+ 0xD602, 0xD603, 0xD605, 0xD606, 0xD607, 0xD609, 0xD60A, 0xD60B,
+ 0xD60C, 0xD60D, 0xD60E, 0xD60F, 0xD612, 0xD616, 0xD617, 0xD618,
+ 0xD619, 0xD61A, 0xD61B, 0xD61D, 0xD61E, 0xD61F, 0xD621, 0xD622,
+ 0xD623, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A, 0xD62B,
+ 0xD62C, 0xD62E, 0xD62F, 0xD630, 0xD631, 0xD632, 0xD633, 0xD634,
+ 0xD635, 0xD636, 0xD637, 0xD63A, 0xD63B, 0xD63D, 0xD63E, 0xD63F,
+ 0xD641, 0xD642, 0xD643, 0xD644, 0xD646, 0xD647, 0xD64A, 0xD64C,
+ 0xD64E, 0xD64F, 0xD650, 0xD652, 0xD653, 0xD656, 0xD657, 0xD659,
+ 0xD65A, 0xD65B, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,
+ 0xD663, 0xD664, 0xD665, 0xD666, 0xD668, 0xD66A, 0xD66B, 0xD66C,
+ 0xD66D, 0xD66E, 0xD66F, 0xD672, 0xD673, 0xD675, 0xD676, 0xD677,
+ 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E, 0xD67F,
+ 0xD680, 0xD681, 0xD682, 0xD684, 0xD686, 0xD687, 0xD688, 0xD689,
+ 0xD68A, 0xD68B, 0xD68E, 0xD68F, 0xD691, 0xD692, 0xD693, 0xD695,
+ 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A, 0xD69B, 0xD69C, 0xD69E,
+ 0xD6A0, 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, 0xD6A9,
+ 0xD6AA, 0xD6AB, 0xD6AD, 0xD6AE, 0xD6AF, 0xD6B1, 0xD6B2, 0xD6B3,
+ 0xD6B4, 0xD6B5, 0xD6B6, 0xD6B7, 0xD6B8, 0xD6BA, 0xD6BC, 0xD6BD,
+ 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, 0xD6C6, 0xD6C7,
+ 0xD6C9, 0xD6CA, 0xD6CB, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D2,
+ 0xD6D3, 0xD6D5, 0xD6D6, 0xD6D8, 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD,
+ 0xD6DE, 0xD6DF, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E5, 0xD6E6, 0xD6E7,
+ 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE, 0xD6EF, 0xD6F1,
+ 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA,
+ 0xD6FB, 0xD6FE, 0xD6FF, 0xD701, 0xD702, 0xD703, 0xD705, 0xD706,
+ 0xD707, 0xD708, 0xD709, 0xD70A, 0xD70B, 0xD70C, 0xD70D, 0xD70E,
+ 0xD70F, 0xD710, 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717,
+ 0xD71A, 0xD71B, 0xD71D, 0xD71E, 0xD71F, 0xD721, 0xD722, 0xD723,
+ 0xD724, 0xD725, 0xD726, 0xD727, 0xD72A, 0xD72C, 0xD72E, 0xD72F,
+ 0xD730, 0xD731, 0xD732, 0xD733, 0xD736, 0xD737, 0xD739, 0xD73A,
+ 0xD73B, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742, 0xD743,
+ 0xD745, 0xD746, 0xD748, 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E,
+ 0xD74F, 0xD752, 0xD753, 0xD755, 0xD75A, 0xD75B, 0xD75C, 0xD75D,
+ 0xD75E, 0xD75F, 0xD762, 0xD764, 0xD766, 0xD767, 0xD768, 0xD76A,
+ 0xD76B, 0xD76D, 0xD76E, 0xD76F, 0xD771, 0xD772, 0xD773, 0xD775,
+ 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A, 0xD77B, 0xD77E, 0xD77F,
+ 0xD780, 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, 0xD78A,
+ 0xD78B, 0xD78D, 0xD78E, 0xD78F, 0xD791, 0xD792, 0xD793, 0xD794,
+ 0xD795, 0xD796, 0xD797, 0xD79A, 0xD79C, 0xD79E, 0xD79F, 0xD7A0,
+ 0xD7A1, 0xD7A2, 0xD7A3, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024,
+ 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,
+ 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034,
+ 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C,
+ 0x003D, 0x003E, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044,
+ 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C,
+ 0x004D, 0x004E, 0x004F, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054,
+ 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C,
+ 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062, 0x0063, 0x0064,
+ 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C,
+ 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+ 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C,
+ 0x007D, 0x007E, 0x20A9, 0x2010, 0x00A9, 0x2122, 0x22EF, 0x0020,
+ 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+ 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+ 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+ 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+ 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068,
+ 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078,
+ 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x203E, 0x007E, 0x005C,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
new file mode 100644
index 0000000000..cd261239ee
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSC_EUC_H_0[467 * 3] = {
+ 0x0020, 0x007E, 0x1F9E, 0xA1A1, 0xA1FE, 0x0065, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA6A1, 0xA6E4, 0x0207, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA9A1, 0xA9FE, 0x02F5, 0xAAA1, 0xAAF3, 0x0353,
+ 0xABA1, 0xABF6, 0x03A6, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
+ 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
+ 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
+ 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
+ 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
+ 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
+ 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
+ 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
+ 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
+ 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
+ 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
+ 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
+ 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
+ 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
+ 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
+ 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
+ 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
+ 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
+ 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
+ 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
+ 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
+ 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
+ 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
+ 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
+ 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
+ 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
+ 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
+ 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
+ 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
+ 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
+ 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
+ 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
+ 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
+ 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
+ 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
+ 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
+ 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
+ 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
+ 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
+ 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
+ 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
+ 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
+ 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
+ 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
+ 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
+ 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
+ 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
+ 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
+ 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
+ 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
+ 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
+ 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
+ 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
+ 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
+ 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
+ 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
+ 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
+ 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
+ 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
+ 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
+ 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
+ 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
+ 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
+ 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
+ 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
+ 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
+ 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
+ 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
+ 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
+ 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
+ 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
+ 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
+ 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
+ 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
+ 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
+ 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
+ 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
+ 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
+ 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
+ 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
+ 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
+ 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
+ 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
+ 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
+ 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
+ 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
+ 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
+ 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
+ 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
+ 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
+ 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
+ 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
+ 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
+ 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
+ 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
+ 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
+ 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
+ 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
+ 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
+ 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
+ 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
+ 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
+ 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
+ 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
+ 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
+ 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
+ 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
+ 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
+ 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
+ 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
+ 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
+ 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
+ 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
+ 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
+ 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
+ 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
+ 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
+ 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
+ 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
+ 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
+ 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
+ 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
+ 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
+ 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
+ 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
+ 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
+ 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
+ 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
+ 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
+ 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
+ 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
+ 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
+ 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
+ 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
+ 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
+ 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
+ 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
+ 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
+ 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
+ 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
+ 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
+ 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
new file mode 100644
index 0000000000..e75a6a3b4f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSC_EUC_V_0[16 * 3] = {
+ 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+ 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+ 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+ 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+ 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+ 0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
new file mode 100644
index 0000000000..d95bab8287
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp
@@ -0,0 +1,233 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_HW_H_1[675 * 3] = {
+ 0x0020, 0x007E, 0x1F9E, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
+ 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
+ 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
+ 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
+ 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
+ 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
+ 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
+ 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
+ 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
+ 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
+ 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
+ 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
+ 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
+ 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
+ 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
+ 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
+ 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
+ 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
+ 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
+ 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
+ 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
+ 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
+ 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
+ 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
+ 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
+ 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
+ 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
+ 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
+ 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
+ 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
+ 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
+ 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
+ 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
+ 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
+ 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
+ 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
+ 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
+ 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
+ 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
+ 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
+ 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
+ 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
+ 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
+ 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
+ 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
+ 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
+ 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
+ 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
+ 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
+ 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
+ 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
+ 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
+ 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
+ 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
+ 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
+ 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
+ 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
+ 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
+ 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
+ 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
+ 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
+ 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
+ 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
+ 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
+ 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
+ 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
+ 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
+ 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
+ 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
+ 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
+ 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
+ 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
+ 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
+ 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
+ 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
+ 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
+ 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
+ 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
+ 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
+ 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
+ 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
+ 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
+ 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
+ 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
+ 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
+ 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
+ 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
+ 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
+ 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
+ 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
+ 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
+ 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
+ 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
+ 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
+ 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
+ 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
+ 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
+ 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
+ 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
+ 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
+ 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
+ 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
+ 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
+ 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
+ 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
+ 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
+ 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
+ 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
+ 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
+ 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
+ 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
+ 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
+ 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
+ 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
+ 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
+ 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
+ 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
+ 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
+ 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
+ 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
+ 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
+ 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
+ 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
+ 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
+ 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
+ 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
+ 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
+ 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
+ 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
+ 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
+ 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
+ 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
+ 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
+ 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
+ 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
+ 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
+ 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
+ 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
+ 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
+ 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
+ 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
+ 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
+ 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
+ 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
+ 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
+ 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
+ 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
+ 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
+ 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
+ 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
+ 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
+ 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
+ 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
+ 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
+ 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
+ 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
+ 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
+ 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
+ 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
+ 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
+ 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
+ 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
+ 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
+ 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
+ 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
+ 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
+ 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
+ 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
+ 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
+ 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
+ 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
+ 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
+ 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
+ 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
+ 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
+ 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
+ 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
+ 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
+ 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
+ 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
+ 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
+ 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
+ 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
+ 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
+ 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
+ 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
+ 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
+ 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
+ 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
+ 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
+ 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
+ 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
+ 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
+ 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
+ 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
+ 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
+ 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
+ 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
+ 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
+ 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp
new file mode 100644
index 0000000000..0730561c34
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_HW_V_1[16 * 3] = {
+ 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+ 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+ 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+ 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+ 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+ 0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
new file mode 100644
index 0000000000..6464f2f5e9
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp
@@ -0,0 +1,233 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_H_1[675 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x8141, 0x815A, 0x2475, 0x8161, 0x817A, 0x248F,
+ 0x8181, 0x81FE, 0x24A9, 0x8241, 0x825A, 0x2527, 0x8261, 0x827A, 0x2541,
+ 0x8281, 0x82FE, 0x255B, 0x8341, 0x835A, 0x25D9, 0x8361, 0x837A, 0x25F3,
+ 0x8381, 0x83FE, 0x260D, 0x8441, 0x845A, 0x268B, 0x8461, 0x847A, 0x26A5,
+ 0x8481, 0x84FE, 0x26BF, 0x8541, 0x855A, 0x273D, 0x8561, 0x857A, 0x2757,
+ 0x8581, 0x85FE, 0x2771, 0x8641, 0x865A, 0x27EF, 0x8661, 0x867A, 0x2809,
+ 0x8681, 0x86FE, 0x2823, 0x8741, 0x875A, 0x28A1, 0x8761, 0x877A, 0x28BB,
+ 0x8781, 0x87FE, 0x28D5, 0x8841, 0x885A, 0x2953, 0x8861, 0x887A, 0x296D,
+ 0x8881, 0x88FE, 0x2987, 0x8941, 0x895A, 0x2A05, 0x8961, 0x897A, 0x2A1F,
+ 0x8981, 0x89FE, 0x2A39, 0x8A41, 0x8A5A, 0x2AB7, 0x8A61, 0x8A7A, 0x2AD1,
+ 0x8A81, 0x8AFE, 0x2AEB, 0x8B41, 0x8B5A, 0x2B69, 0x8B61, 0x8B7A, 0x2B83,
+ 0x8B81, 0x8BFE, 0x2B9D, 0x8C41, 0x8C5A, 0x2C1B, 0x8C61, 0x8C7A, 0x2C35,
+ 0x8C81, 0x8CFE, 0x2C4F, 0x8D41, 0x8D5A, 0x2CCD, 0x8D61, 0x8D7A, 0x2CE7,
+ 0x8D81, 0x8DFE, 0x2D01, 0x8E41, 0x8E5A, 0x2D7F, 0x8E61, 0x8E7A, 0x2D99,
+ 0x8E81, 0x8EFE, 0x2DB3, 0x8F41, 0x8F5A, 0x2E31, 0x8F61, 0x8F7A, 0x2E4B,
+ 0x8F81, 0x8FFE, 0x2E65, 0x9041, 0x905A, 0x2EE3, 0x9061, 0x907A, 0x2EFD,
+ 0x9081, 0x90FE, 0x2F17, 0x9141, 0x915A, 0x2F95, 0x9161, 0x917A, 0x2FAF,
+ 0x9181, 0x91FE, 0x2FC9, 0x9241, 0x925A, 0x3047, 0x9261, 0x927A, 0x3061,
+ 0x9281, 0x92FE, 0x307B, 0x9341, 0x935A, 0x30F9, 0x9361, 0x937A, 0x3113,
+ 0x9381, 0x93FE, 0x312D, 0x9441, 0x945A, 0x31AB, 0x9461, 0x947A, 0x31C5,
+ 0x9481, 0x94FE, 0x31DF, 0x9541, 0x955A, 0x325D, 0x9561, 0x957A, 0x3277,
+ 0x9581, 0x95FE, 0x3291, 0x9641, 0x965A, 0x330F, 0x9661, 0x967A, 0x3329,
+ 0x9681, 0x96FE, 0x3343, 0x9741, 0x975A, 0x33C1, 0x9761, 0x977A, 0x33DB,
+ 0x9781, 0x97FE, 0x33F5, 0x9841, 0x985A, 0x3473, 0x9861, 0x987A, 0x348D,
+ 0x9881, 0x98FE, 0x34A7, 0x9941, 0x995A, 0x3525, 0x9961, 0x997A, 0x353F,
+ 0x9981, 0x99FE, 0x3559, 0x9A41, 0x9A5A, 0x35D7, 0x9A61, 0x9A7A, 0x35F1,
+ 0x9A81, 0x9AFE, 0x360B, 0x9B41, 0x9B5A, 0x3689, 0x9B61, 0x9B7A, 0x36A3,
+ 0x9B81, 0x9BFE, 0x36BD, 0x9C41, 0x9C5A, 0x373B, 0x9C61, 0x9C7A, 0x3755,
+ 0x9C81, 0x9CFE, 0x376F, 0x9D41, 0x9D5A, 0x37ED, 0x9D61, 0x9D7A, 0x3807,
+ 0x9D81, 0x9DFE, 0x3821, 0x9E41, 0x9E5A, 0x389F, 0x9E61, 0x9E7A, 0x38B9,
+ 0x9E81, 0x9EFE, 0x38D3, 0x9F41, 0x9F5A, 0x3951, 0x9F61, 0x9F7A, 0x396B,
+ 0x9F81, 0x9FFE, 0x3985, 0xA041, 0xA05A, 0x3A03, 0xA061, 0xA07A, 0x3A1D,
+ 0xA081, 0xA0FE, 0x3A37, 0xA141, 0xA15A, 0x3AB5, 0xA161, 0xA17A, 0x3ACF,
+ 0xA181, 0xA1A0, 0x3AE9, 0xA1A1, 0xA1FE, 0x0065, 0xA241, 0xA25A, 0x3B09,
+ 0xA261, 0xA27A, 0x3B23, 0xA281, 0xA2A0, 0x3B3D, 0xA2A1, 0xA2E5, 0x00C3,
+ 0xA341, 0xA35A, 0x3B5D, 0xA361, 0xA37A, 0x3B77, 0xA381, 0xA3A0, 0x3B91,
+ 0xA3A1, 0xA3FE, 0x0108, 0xA441, 0xA45A, 0x3BB1, 0xA461, 0xA47A, 0x3BCB,
+ 0xA481, 0xA4A0, 0x3BE5, 0xA4A1, 0xA4D3, 0x0166, 0xA4D5, 0xA4FE, 0x0199,
+ 0xA541, 0xA55A, 0x3C05, 0xA561, 0xA57A, 0x3C1F, 0xA581, 0xA5A0, 0x3C39,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5E1, 0xA5F8, 0x01EF, 0xA641, 0xA65A, 0x3C59, 0xA661, 0xA67A, 0x3C73,
+ 0xA681, 0xA6A0, 0x3C8D, 0xA6A1, 0xA6E4, 0x0207, 0xA741, 0xA75A, 0x3CAD,
+ 0xA761, 0xA77A, 0x3CC7, 0xA781, 0xA7A0, 0x3CE1, 0xA7A1, 0xA7EF, 0x024B,
+ 0xA841, 0xA85A, 0x3D01, 0xA861, 0xA87A, 0x3D1B, 0xA881, 0xA8A0, 0x3D35,
+ 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E, 0xA8A8, 0xA8AF, 0x029F,
+ 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA95A, 0x3D55, 0xA961, 0xA97A, 0x3D6F,
+ 0xA981, 0xA9A0, 0x3D89, 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA5A, 0x3DA9,
+ 0xAA61, 0xAA7A, 0x3DC3, 0xAA81, 0xAAA0, 0x3DDD, 0xAAA1, 0xAAF3, 0x0353,
+ 0xAB41, 0xAB5A, 0x3DFD, 0xAB61, 0xAB7A, 0x3E17, 0xAB81, 0xABA0, 0x3E31,
+ 0xABA1, 0xABF6, 0x03A6, 0xAC41, 0xAC5A, 0x3E51, 0xAC61, 0xAC7A, 0x3E6B,
+ 0xAC81, 0xACA0, 0x3E85, 0xACA1, 0xACC1, 0x03FC, 0xACD1, 0xACF1, 0x041D,
+ 0xAD41, 0xAD5A, 0x3EA5, 0xAD61, 0xAD7A, 0x3EBF, 0xAD81, 0xADA0, 0x3ED9,
+ 0xAE41, 0xAE5A, 0x3EF9, 0xAE61, 0xAE7A, 0x3F13, 0xAE81, 0xAEA0, 0x3F2D,
+ 0xAF41, 0xAF5A, 0x3F4D, 0xAF61, 0xAF7A, 0x3F67, 0xAF81, 0xAFA0, 0x3F81,
+ 0xB041, 0xB05A, 0x3FA1, 0xB061, 0xB07A, 0x3FBB, 0xB081, 0xB0A0, 0x3FD5,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB141, 0xB15A, 0x3FF5, 0xB161, 0xB17A, 0x400F,
+ 0xB181, 0xB1A0, 0x4029, 0xB1A1, 0xB1FE, 0x049C, 0xB241, 0xB25A, 0x4049,
+ 0xB261, 0xB27A, 0x4063, 0xB281, 0xB2A0, 0x407D, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB341, 0xB35A, 0x409D, 0xB361, 0xB37A, 0x40B7, 0xB381, 0xB3A0, 0x40D1,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB441, 0xB45A, 0x40F1, 0xB461, 0xB47A, 0x410B,
+ 0xB481, 0xB4A0, 0x4125, 0xB4A1, 0xB4FE, 0x05B6, 0xB541, 0xB55A, 0x4145,
+ 0xB561, 0xB57A, 0x415F, 0xB581, 0xB5A0, 0x4179, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB641, 0xB65A, 0x4199, 0xB661, 0xB67A, 0x41B3, 0xB681, 0xB6A0, 0x41CD,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB741, 0xB75A, 0x41ED, 0xB761, 0xB77A, 0x4207,
+ 0xB781, 0xB7A0, 0x4221, 0xB7A1, 0xB7FE, 0x06D0, 0xB841, 0xB85A, 0x4241,
+ 0xB861, 0xB87A, 0x425B, 0xB881, 0xB8A0, 0x4275, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB941, 0xB95A, 0x4295, 0xB961, 0xB97A, 0x42AF, 0xB981, 0xB9A0, 0x42C9,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBA41, 0xBA5A, 0x42E9, 0xBA61, 0xBA7A, 0x4303,
+ 0xBA81, 0xBAA0, 0x431D, 0xBAA1, 0xBAFE, 0x07EA, 0xBB41, 0xBB5A, 0x433D,
+ 0xBB61, 0xBB7A, 0x4357, 0xBB81, 0xBBA0, 0x4371, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBC41, 0xBC5A, 0x4391, 0xBC61, 0xBC7A, 0x43AB, 0xBC81, 0xBCA0, 0x43C5,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBD41, 0xBD5A, 0x43E5, 0xBD61, 0xBD7A, 0x43FF,
+ 0xBD81, 0xBDA0, 0x4419, 0xBDA1, 0xBDFE, 0x0904, 0xBE41, 0xBE5A, 0x4439,
+ 0xBE61, 0xBE7A, 0x4453, 0xBE81, 0xBEA0, 0x446D, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBF41, 0xBF5A, 0x448D, 0xBF61, 0xBF7A, 0x44A7, 0xBF81, 0xBFA0, 0x44C1,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC041, 0xC05A, 0x44E1, 0xC061, 0xC07A, 0x44FB,
+ 0xC081, 0xC0A0, 0x4515, 0xC0A1, 0xC0FE, 0x0A1E, 0xC141, 0xC15A, 0x4535,
+ 0xC161, 0xC17A, 0x454F, 0xC181, 0xC1A0, 0x4569, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC241, 0xC25A, 0x4589, 0xC261, 0xC27A, 0x45A3, 0xC281, 0xC2A0, 0x45BD,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC341, 0xC35A, 0x45DD, 0xC361, 0xC37A, 0x45F7,
+ 0xC381, 0xC3A0, 0x4611, 0xC3A1, 0xC3FE, 0x0B38, 0xC441, 0xC45A, 0x4631,
+ 0xC461, 0xC47A, 0x464B, 0xC481, 0xC4A0, 0x4665, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC541, 0xC55A, 0x4685, 0xC561, 0xC57A, 0x469F, 0xC581, 0xC5A0, 0x46B9,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC641, 0xC652, 0x46D9, 0xC6A1, 0xC6FE, 0x0C52,
+ 0xC7A1, 0xC7FE, 0x0CB0, 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C,
+ 0xCBA1, 0xCBCF, 0x0DCA, 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9,
+ 0xCBD6, 0xCBD6, 0x0E5E, 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D,
+ 0xCBE8, 0xCBFE, 0x0E0E, 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83,
+ 0xCDCF, 0xCDCF, 0x0D84, 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC,
+ 0xCDE9, 0xCDFE, 0x0EC9, 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA,
+ 0xCEAE, 0xCEFE, 0x0EEB, 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E,
+ 0xCFFC, 0xCFFE, 0x0F96, 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A,
+ 0xD0A3, 0xD0B7, 0x0F9A, 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF,
+ 0xD0D0, 0xD0D0, 0x0E7C, 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023,
+ 0xD0DE, 0xD0FE, 0x0FD2, 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116,
+ 0xD1D5, 0xD1D5, 0x103C, 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117,
+ 0xD1D9, 0xD1DA, 0x1028, 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A,
+ 0xD1E2, 0xD1E2, 0x16A8, 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122,
+ 0xD1E7, 0xD1E7, 0x102B, 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C,
+ 0xD1ED, 0xD1ED, 0x1127, 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A,
+ 0xD1F1, 0xD1F1, 0x102E, 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F,
+ 0xD1F6, 0xD1F6, 0x112F, 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133,
+ 0xD1FB, 0xD1FB, 0x1035, 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139,
+ 0xD2A1, 0xD2A1, 0x1036, 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037,
+ 0xD2A7, 0xD2AA, 0x113C, 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A,
+ 0xD2AD, 0xD2AD, 0x1144, 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148,
+ 0xD2B3, 0xD2BD, 0x103F, 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A,
+ 0xD2C2, 0xD2C3, 0x11A1, 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D,
+ 0xD2C6, 0xD2CA, 0x11A6, 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E,
+ 0xD2CD, 0xD2CE, 0x11AD, 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7,
+ 0xD2D8, 0xD2D8, 0x104F, 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050,
+ 0xD2DE, 0xD2DF, 0x11C1, 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3,
+ 0xD2E2, 0xD2E2, 0x11C6, 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4,
+ 0xD2E5, 0xD2E8, 0x11D6, 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0,
+ 0xD2EC, 0xD2EF, 0x1055, 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201,
+ 0xD2F6, 0xD2F6, 0x1059, 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A,
+ 0xD3A1, 0xD3FE, 0x1060, 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE,
+ 0xD4E7, 0xD4FB, 0x1103, 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118,
+ 0xD5A1, 0xD5A4, 0x111A, 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E,
+ 0xD5AB, 0xD5AB, 0x102B, 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060,
+ 0xD5AF, 0xD5FE, 0x1125, 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047,
+ 0xD6B9, 0xD6CC, 0x118C, 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0,
+ 0xD7A1, 0xD7CA, 0x11D1, 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB,
+ 0xD7E4, 0xD7E4, 0x1918, 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D,
+ 0xD9A1, 0xD9FE, 0x128B, 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347,
+ 0xDBC5, 0xDBC5, 0x141F, 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A,
+ 0xDBE5, 0xDBFE, 0x1389, 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E,
+ 0xDCA6, 0xDCFE, 0x13A7, 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7,
+ 0xDDA6, 0xDDD4, 0x1404, 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433,
+ 0xDDF4, 0xDDF4, 0x1DB7, 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B,
+ 0xDEFC, 0xDEFC, 0x15D0, 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7,
+ 0xDFA1, 0xDFB2, 0x14B7, 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9,
+ 0xDFE1, 0xDFE1, 0x14F2, 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D,
+ 0xDFE9, 0xDFFE, 0x14FC, 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771,
+ 0xE0F2, 0xE0FE, 0x1562, 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554,
+ 0xE1AE, 0xE1EC, 0x157B, 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA,
+ 0xE2A1, 0xE2FE, 0x15CB, 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61,
+ 0xE3F6, 0xE3FE, 0x167D, 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686,
+ 0xE4A9, 0xE4A9, 0x162E, 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2,
+ 0xE5AE, 0xE5AE, 0x16F2, 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149,
+ 0xE5B3, 0xE5B8, 0x16F1, 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7,
+ 0xE5BB, 0xE5BC, 0x114D, 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F,
+ 0xE5C5, 0xE5CD, 0x16FF, 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708,
+ 0xE5D0, 0xE5D0, 0x1154, 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155,
+ 0xE5D3, 0xE5D5, 0x170A, 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D,
+ 0xE5FA, 0xE5FB, 0x115A, 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730,
+ 0xE5FE, 0xE5FE, 0x115C, 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731,
+ 0xE6A4, 0xE6A4, 0x1161, 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162,
+ 0xE6A8, 0xE6AC, 0x1735, 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A,
+ 0xE6AF, 0xE6B1, 0x1167, 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A,
+ 0xE6B4, 0xE6B6, 0x173C, 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F,
+ 0xE6BC, 0xE6BC, 0x116F, 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040,
+ 0xE6C5, 0xE6C5, 0x1749, 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A,
+ 0xE6CA, 0xE6CA, 0x1041, 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174,
+ 0xE6D3, 0xE6D5, 0x1753, 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756,
+ 0xE6D9, 0xE6D9, 0x1176, 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042,
+ 0xE6DD, 0xE6DE, 0x175A, 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C,
+ 0xE6E1, 0xE6E1, 0x1178, 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A,
+ 0xE6E5, 0xE6E5, 0x1179, 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F,
+ 0xE6E8, 0xE6E8, 0x117C, 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E,
+ 0xE6EC, 0xE6EC, 0x192F, 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181,
+ 0xE6F0, 0xE6F0, 0x1763, 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554,
+ 0xE6F3, 0xE6F4, 0x1764, 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043,
+ 0xE6F7, 0xE6F7, 0x1046, 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185,
+ 0xE6FA, 0xE6FE, 0x1767, 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C,
+ 0xE7A6, 0xE7A6, 0x1188, 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189,
+ 0xE7AA, 0xE7AA, 0x118B, 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047,
+ 0xE7AD, 0xE7AD, 0x118D, 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E,
+ 0xE7B1, 0xE7BE, 0x1775, 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783,
+ 0xE7C1, 0xE7C1, 0x1E67, 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191,
+ 0xE7C7, 0xE7C7, 0x1193, 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195,
+ 0xE7CC, 0xE7CC, 0x178B, 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C,
+ 0xE7CF, 0xE7D0, 0x1197, 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A,
+ 0xE7D4, 0xE7DE, 0x178F, 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A,
+ 0xE7E4, 0xE7E4, 0x119D, 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E,
+ 0xE7E7, 0xE7F6, 0x179F, 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF,
+ 0xE8A1, 0xE8E6, 0x17B6, 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC,
+ 0xE8F0, 0xE8F0, 0x11C9, 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803,
+ 0xE8F7, 0xE8F7, 0x11CB, 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8,
+ 0xE8FA, 0xE8FA, 0x1809, 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A,
+ 0xE8FE, 0xE8FE, 0x11CD, 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0,
+ 0xE9A8, 0xE9AB, 0x1812, 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816,
+ 0xE9CC, 0xE9CC, 0x11D3, 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34,
+ 0xE9F8, 0xE9FE, 0x185F, 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB,
+ 0xEAC2, 0xEAE4, 0x1886, 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9,
+ 0xEAF4, 0xEAF4, 0x1057, 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3,
+ 0xEAF8, 0xEAFB, 0x18B9, 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD,
+ 0xEAFE, 0xEAFE, 0x11E6, 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8,
+ 0xEBA5, 0xEBA6, 0x18C1, 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3,
+ 0xEBA9, 0xEBA9, 0x11EC, 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4,
+ 0xEBBA, 0xEBBB, 0x11EE, 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0,
+ 0xEBBE, 0xEBC0, 0x18D4, 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3,
+ 0xEBC3, 0xEBC5, 0x18D7, 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA,
+ 0xEBCC, 0xEBCC, 0x11F7, 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8,
+ 0xEBD2, 0xEBD2, 0x15B0, 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB,
+ 0xEBD9, 0xEBFE, 0x18E5, 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206,
+ 0xECA7, 0xECA7, 0x1208, 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A,
+ 0xECAB, 0xECAE, 0x1912, 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C,
+ 0xECB2, 0xECB2, 0x105B, 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211,
+ 0xECB6, 0xECB7, 0x1918, 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A,
+ 0xECBA, 0xECBA, 0x1215, 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218,
+ 0xECC2, 0xECC4, 0x1920, 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C,
+ 0xECC7, 0xECC8, 0x1923, 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925,
+ 0xECD5, 0xECD5, 0x121E, 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220,
+ 0xECDF, 0xECE0, 0x1936, 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938,
+ 0xECE4, 0xECE4, 0x1224, 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225,
+ 0xECE9, 0xECF6, 0x193C, 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A,
+ 0xECFA, 0xECFA, 0x122A, 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D,
+ 0xEDA4, 0xEDED, 0x194F, 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999,
+ 0xEEA1, 0xEEDA, 0x19A9, 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3,
+ 0xEFA1, 0xEFFE, 0x1A06, 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2,
+ 0xF2A1, 0xF2BC, 0x1B20, 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C,
+ 0xF2FA, 0xF2FA, 0x168B, 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C,
+ 0xF3B1, 0xF3B1, 0x105F, 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9,
+ 0xF4A7, 0xF4A7, 0x1954, 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C,
+ 0xF4EF, 0xF4FE, 0x1C25, 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93,
+ 0xF6F4, 0xF6F4, 0x10B7, 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3,
+ 0xF6F7, 0xF6FE, 0x1CE7, 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097,
+ 0xF7B9, 0xF7C7, 0x1D06, 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15,
+ 0xF7D3, 0xF7D3, 0x10F4, 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A,
+ 0xF8DB, 0xF8DB, 0x1D94, 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0,
+ 0xF8F1, 0xF8FE, 0x1D98, 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D,
+ 0xFAA2, 0xFAA2, 0x0DE6, 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C,
+ 0xFAE7, 0xFAFE, 0x1E47, 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD,
+ 0xFCA9, 0xFCA9, 0x0EE7, 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp
new file mode 100644
index 0000000000..70f1d459d4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCms_UHC_V_1[16 * 3] = {
+ 0xA1A2, 0xA1A3, 0x1F78, 0xA1A5, 0xA1A5, 0x1F7A, 0xA1A6, 0xA1A6, 0x2080,
+ 0xA1A9, 0xA1AB, 0x1F7B, 0xA1AD, 0xA1AD, 0x1F7E, 0xA1B2, 0xA1BD, 0x1F7F,
+ 0xA1EB, 0xA1EB, 0x1F8B, 0xA3A1, 0xA3A1, 0x1F8C, 0xA3A8, 0xA3A9, 0x1F8D,
+ 0xA3AC, 0xA3AC, 0x1F8F, 0xA3AE, 0xA3AE, 0x1F90, 0xA3BA, 0xA3BF, 0x1F91,
+ 0xA3DB, 0xA3DB, 0x1F97, 0xA3DD, 0xA3DD, 0x1F98, 0xA3DF, 0xA3DF, 0x1F99,
+ 0xA3FB, 0xA3FE, 0x1F9A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
new file mode 100644
index 0000000000..b062fc6316
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_KSCpc_EUC_H_0[509 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x0081, 0x0083, 0x0060, 0x00FE, 0x00FF, 0x0063,
+ 0xA141, 0xA17D, 0x1FFF, 0xA181, 0xA19A, 0x203C, 0xA19C, 0xA1A0, 0x2056,
+ 0xA1A1, 0xA1A1, 0x0065, 0xA1A2, 0xA1A3, 0x205B, 0xA1A4, 0xA1FE, 0x0068,
+ 0xA241, 0xA24C, 0x205D, 0xA2A1, 0xA2E5, 0x00C3, 0xA2E6, 0xA2FE, 0x2069,
+ 0xA341, 0xA37D, 0x2082, 0xA381, 0xA39F, 0x20BF, 0xA3A1, 0xA3FE, 0x0108,
+ 0xA441, 0xA47D, 0x20DE, 0xA481, 0xA49F, 0x211B, 0xA4A1, 0xA4D3, 0x0166,
+ 0xA4D5, 0xA4FE, 0x0199, 0xA541, 0xA57D, 0x213A, 0xA581, 0xA58B, 0x2177,
+ 0xA5A1, 0xA5AA, 0x01C3, 0xA5B0, 0xA5B9, 0x01CD, 0xA5C1, 0xA5D8, 0x01D7,
+ 0xA5DA, 0xA5DE, 0x2182, 0xA5E1, 0xA5F8, 0x01EF, 0xA5F9, 0xA5FC, 0x2187,
+ 0xA641, 0xA67D, 0x218B, 0xA681, 0xA68A, 0x21C8, 0xA68D, 0xA693, 0x21D2,
+ 0xA696, 0xA69B, 0x21D9, 0xA69E, 0xA69F, 0x21DF, 0xA6A1, 0xA6E4, 0x0207,
+ 0xA6E5, 0xA6FE, 0x21E1, 0xA741, 0xA77D, 0x21FB, 0xA781, 0xA79F, 0x2238,
+ 0xA7A1, 0xA7EF, 0x024B, 0xA7F0, 0xA7FE, 0x2257, 0xA841, 0xA87D, 0x2266,
+ 0xA881, 0xA89F, 0x22A3, 0xA8A1, 0xA8A4, 0x029A, 0xA8A6, 0xA8A6, 0x029E,
+ 0xA8A8, 0xA8AF, 0x029F, 0xA8B1, 0xA8FE, 0x02A7, 0xA941, 0xA974, 0x22C2,
+ 0xA9A1, 0xA9FE, 0x02F5, 0xAA41, 0xAA7D, 0x22F6, 0xAA81, 0xAA9F, 0x2333,
+ 0xAAA1, 0xAAF3, 0x0353, 0xAAF4, 0xAAFE, 0x2352, 0xAB41, 0xAB7D, 0x235D,
+ 0xAB81, 0xAB9F, 0x239A, 0xABA1, 0xABF6, 0x03A6, 0xABF7, 0xABFA, 0x23B9,
+ 0xABFB, 0xABFD, 0x2472, 0xAC41, 0xAC7D, 0x23BD, 0xAC81, 0xAC97, 0x23FA,
+ 0xACA1, 0xACC1, 0x03FC, 0xACC2, 0xACD0, 0x2411, 0xACD1, 0xACF1, 0x041D,
+ 0xACF2, 0xACF6, 0x2420, 0xAD41, 0xAD7D, 0x2425, 0xADA1, 0xADB0, 0x2462,
+ 0xB0A1, 0xB0FE, 0x043E, 0xB1A1, 0xB1FE, 0x049C, 0xB2A1, 0xB2FE, 0x04FA,
+ 0xB3A1, 0xB3FE, 0x0558, 0xB4A1, 0xB4FE, 0x05B6, 0xB5A1, 0xB5FE, 0x0614,
+ 0xB6A1, 0xB6FE, 0x0672, 0xB7A1, 0xB7FE, 0x06D0, 0xB8A1, 0xB8FE, 0x072E,
+ 0xB9A1, 0xB9FE, 0x078C, 0xBAA1, 0xBAFE, 0x07EA, 0xBBA1, 0xBBFE, 0x0848,
+ 0xBCA1, 0xBCFE, 0x08A6, 0xBDA1, 0xBDFE, 0x0904, 0xBEA1, 0xBEFE, 0x0962,
+ 0xBFA1, 0xBFFE, 0x09C0, 0xC0A1, 0xC0FE, 0x0A1E, 0xC1A1, 0xC1FE, 0x0A7C,
+ 0xC2A1, 0xC2FE, 0x0ADA, 0xC3A1, 0xC3FE, 0x0B38, 0xC4A1, 0xC4FE, 0x0B96,
+ 0xC5A1, 0xC5FE, 0x0BF4, 0xC6A1, 0xC6FE, 0x0C52, 0xC7A1, 0xC7FE, 0x0CB0,
+ 0xC8A1, 0xC8FE, 0x0D0E, 0xCAA1, 0xCAFE, 0x0D6C, 0xCBA1, 0xCBCF, 0x0DCA,
+ 0xCBD0, 0xCBD0, 0x1014, 0xCBD1, 0xCBD5, 0x0DF9, 0xCBD6, 0xCBD6, 0x0E5E,
+ 0xCBD7, 0xCBE6, 0x0DFE, 0xCBE7, 0xCBE7, 0x1B8D, 0xCBE8, 0xCBFE, 0x0E0E,
+ 0xCCA1, 0xCCFE, 0x0E25, 0xCDA1, 0xCDCE, 0x0E83, 0xCDCF, 0xCDCF, 0x0D84,
+ 0xCDD0, 0xCDE7, 0x0EB1, 0xCDE8, 0xCDE8, 0x1EDC, 0xCDE9, 0xCDFE, 0x0EC9,
+ 0xCEA1, 0xCEAC, 0x0EDF, 0xCEAD, 0xCEAD, 0x0EDA, 0xCEAE, 0xCEFE, 0x0EEB,
+ 0xCFA1, 0xCFFA, 0x0F3C, 0xCFFB, 0xCFFB, 0x0F3E, 0xCFFC, 0xCFFE, 0x0F96,
+ 0xD0A1, 0xD0A1, 0x0F99, 0xD0A2, 0xD0A2, 0x0F6A, 0xD0A3, 0xD0B7, 0x0F9A,
+ 0xD0B8, 0xD0B8, 0x0F6A, 0xD0B9, 0xD0CF, 0x0FAF, 0xD0D0, 0xD0D0, 0x0E7C,
+ 0xD0D1, 0xD0DC, 0x0FC6, 0xD0DD, 0xD0DD, 0x1023, 0xD0DE, 0xD0FE, 0x0FD2,
+ 0xD1A1, 0xD1D3, 0x0FF3, 0xD1D4, 0xD1D4, 0x1116, 0xD1D5, 0xD1D5, 0x103C,
+ 0xD1D6, 0xD1D7, 0x1026, 0xD1D8, 0xD1D8, 0x1117, 0xD1D9, 0xD1DA, 0x1028,
+ 0xD1DB, 0xD1E0, 0x1118, 0xD1E1, 0xD1E1, 0x102A, 0xD1E2, 0xD1E2, 0x16A8,
+ 0xD1E3, 0xD1E5, 0x111E, 0xD1E6, 0xD1E6, 0x1122, 0xD1E7, 0xD1E7, 0x102B,
+ 0xD1E8, 0xD1EB, 0x1123, 0xD1EC, 0xD1EC, 0x102C, 0xD1ED, 0xD1ED, 0x1127,
+ 0xD1EE, 0xD1EE, 0x102D, 0xD1EF, 0xD1F0, 0x112A, 0xD1F1, 0xD1F1, 0x102E,
+ 0xD1F2, 0xD1F2, 0x112C, 0xD1F3, 0xD1F5, 0x102F, 0xD1F6, 0xD1F6, 0x112F,
+ 0xD1F7, 0xD1F9, 0x1032, 0xD1FA, 0xD1FA, 0x1133, 0xD1FB, 0xD1FB, 0x1035,
+ 0xD1FC, 0xD1FD, 0x1136, 0xD1FE, 0xD1FE, 0x1139, 0xD2A1, 0xD2A1, 0x1036,
+ 0xD2A2, 0xD2A3, 0x113A, 0xD2A4, 0xD2A6, 0x1037, 0xD2A7, 0xD2AA, 0x113C,
+ 0xD2AB, 0xD2AB, 0x1143, 0xD2AC, 0xD2AC, 0x103A, 0xD2AD, 0xD2AD, 0x1144,
+ 0xD2AE, 0xD2B1, 0x103B, 0xD2B2, 0xD2B2, 0x1148, 0xD2B3, 0xD2BD, 0x103F,
+ 0xD2BE, 0xD2BE, 0x119F, 0xD2BF, 0xD2C1, 0x104A, 0xD2C2, 0xD2C3, 0x11A1,
+ 0xD2C4, 0xD2C4, 0x11A5, 0xD2C5, 0xD2C5, 0x104D, 0xD2C6, 0xD2CA, 0x11A6,
+ 0xD2CB, 0xD2CB, 0x11AC, 0xD2CC, 0xD2CC, 0x104E, 0xD2CD, 0xD2CE, 0x11AD,
+ 0xD2CF, 0xD2D4, 0x11B0, 0xD2D5, 0xD2D7, 0x11B7, 0xD2D8, 0xD2D8, 0x104F,
+ 0xD2D9, 0xD2DA, 0x11BD, 0xD2DB, 0xD2DD, 0x1050, 0xD2DE, 0xD2DF, 0x11C1,
+ 0xD2E0, 0xD2E0, 0x1053, 0xD2E1, 0xD2E1, 0x11C3, 0xD2E2, 0xD2E2, 0x11C6,
+ 0xD2E3, 0xD2E3, 0x1054, 0xD2E4, 0xD2E4, 0x11D4, 0xD2E5, 0xD2E8, 0x11D6,
+ 0xD2E9, 0xD2EA, 0x11DB, 0xD2EB, 0xD2EB, 0x11E0, 0xD2EC, 0xD2EF, 0x1055,
+ 0xD2F0, 0xD2F3, 0x11FC, 0xD2F4, 0xD2F5, 0x1201, 0xD2F6, 0xD2F6, 0x1059,
+ 0xD2F7, 0xD2F8, 0x1203, 0xD2F9, 0xD2FE, 0x105A, 0xD3A1, 0xD3FE, 0x1060,
+ 0xD4A1, 0xD4E5, 0x10BE, 0xD4E6, 0xD4E6, 0x10DE, 0xD4E7, 0xD4FB, 0x1103,
+ 0xD4FC, 0xD4FC, 0x1028, 0xD4FD, 0xD4FE, 0x1118, 0xD5A1, 0xD5A4, 0x111A,
+ 0xD5A5, 0xD5A5, 0x16A8, 0xD5A6, 0xD5AA, 0x111E, 0xD5AB, 0xD5AB, 0x102B,
+ 0xD5AC, 0xD5AD, 0x1123, 0xD5AE, 0xD5AE, 0x1060, 0xD5AF, 0xD5FE, 0x1125,
+ 0xD6A1, 0xD6B7, 0x1175, 0xD6B8, 0xD6B8, 0x1047, 0xD6B9, 0xD6CC, 0x118C,
+ 0xD6CD, 0xD6CD, 0x104C, 0xD6CE, 0xD6FE, 0x11A0, 0xD7A1, 0xD7CA, 0x11D1,
+ 0xD7CB, 0xD7CB, 0x15B0, 0xD7CC, 0xD7E3, 0x11FB, 0xD7E4, 0xD7E4, 0x1918,
+ 0xD7E5, 0xD7FE, 0x1213, 0xD8A1, 0xD8FE, 0x122D, 0xD9A1, 0xD9FE, 0x128B,
+ 0xDAA1, 0xDAFE, 0x12E9, 0xDBA1, 0xDBC4, 0x1347, 0xDBC5, 0xDBC5, 0x141F,
+ 0xDBC6, 0xDBE3, 0x136B, 0xDBE4, 0xDBE4, 0x133A, 0xDBE5, 0xDBFE, 0x1389,
+ 0xDCA1, 0xDCA4, 0x13A3, 0xDCA5, 0xDCA5, 0x1D5E, 0xDCA6, 0xDCFE, 0x13A7,
+ 0xDDA1, 0xDDA4, 0x1400, 0xDDA5, 0xDDA5, 0x13D7, 0xDDA6, 0xDDD4, 0x1404,
+ 0xDDD5, 0xDDD5, 0x13F5, 0xDDD6, 0xDDF3, 0x1433, 0xDDF4, 0xDDF4, 0x1DB7,
+ 0xDDF5, 0xDDFE, 0x1451, 0xDEA1, 0xDEFB, 0x145B, 0xDEFC, 0xDEFC, 0x15D0,
+ 0xDEFD, 0xDEFD, 0x14B6, 0xDEFE, 0xDEFE, 0x14F7, 0xDFA1, 0xDFB2, 0x14B7,
+ 0xDFB3, 0xDFB3, 0x1BAB, 0xDFB4, 0xDFE0, 0x14C9, 0xDFE1, 0xDFE1, 0x14F2,
+ 0xDFE2, 0xDFE7, 0x14F6, 0xDFE8, 0xDFE8, 0x156D, 0xDFE9, 0xDFFE, 0x14FC,
+ 0xE0A1, 0xE0F0, 0x1512, 0xE0F1, 0xE0F1, 0x1771, 0xE0F2, 0xE0FE, 0x1562,
+ 0xE1A1, 0xE1AC, 0x156F, 0xE1AD, 0xE1AD, 0x1554, 0xE1AE, 0xE1EC, 0x157B,
+ 0xE1ED, 0xE1ED, 0x14C5, 0xE1EE, 0xE1FE, 0x15BA, 0xE2A1, 0xE2FE, 0x15CB,
+ 0xE3A1, 0xE3F4, 0x1629, 0xE3F5, 0xE3F5, 0x1B61, 0xE3F6, 0xE3FE, 0x167D,
+ 0xE4A1, 0xE4A1, 0x1CCA, 0xE4A2, 0xE4A8, 0x1686, 0xE4A9, 0xE4A9, 0x162E,
+ 0xE4AA, 0xE4FE, 0x168D, 0xE5A1, 0xE5AD, 0x16E2, 0xE5AE, 0xE5AE, 0x16F2,
+ 0xE5AF, 0xE5B0, 0x16EF, 0xE5B1, 0xE5B2, 0x1149, 0xE5B3, 0xE5B8, 0x16F1,
+ 0xE5B9, 0xE5B9, 0x114B, 0xE5BA, 0xE5BA, 0x16F7, 0xE5BB, 0xE5BC, 0x114D,
+ 0xE5BD, 0xE5C3, 0x16F8, 0xE5C4, 0xE5C4, 0x114F, 0xE5C5, 0xE5CD, 0x16FF,
+ 0xE5CE, 0xE5CE, 0x1153, 0xE5CF, 0xE5CF, 0x1708, 0xE5D0, 0xE5D0, 0x1154,
+ 0xE5D1, 0xE5D1, 0x1709, 0xE5D2, 0xE5D2, 0x1155, 0xE5D3, 0xE5D5, 0x170A,
+ 0xE5D6, 0xE5D6, 0x1157, 0xE5D7, 0xE5F9, 0x170D, 0xE5FA, 0xE5FB, 0x115A,
+ 0xE5FC, 0xE5FC, 0x103F, 0xE5FD, 0xE5FD, 0x1730, 0xE5FE, 0xE5FE, 0x115C,
+ 0xE6A1, 0xE6A1, 0x115F, 0xE6A2, 0xE6A3, 0x1731, 0xE6A4, 0xE6A4, 0x1161,
+ 0xE6A5, 0xE6A6, 0x1733, 0xE6A7, 0xE6A7, 0x1162, 0xE6A8, 0xE6AC, 0x1735,
+ 0xE6AD, 0xE6AD, 0x1165, 0xE6AE, 0xE6AE, 0x173A, 0xE6AF, 0xE6B1, 0x1167,
+ 0xE6B2, 0xE6B2, 0x173B, 0xE6B3, 0xE6B3, 0x116A, 0xE6B4, 0xE6B6, 0x173C,
+ 0xE6B7, 0xE6B8, 0x116B, 0xE6B9, 0xE6BB, 0x173F, 0xE6BC, 0xE6BC, 0x116F,
+ 0xE6BD, 0xE6C3, 0x1742, 0xE6C4, 0xE6C4, 0x1040, 0xE6C5, 0xE6C5, 0x1749,
+ 0xE6C6, 0xE6C7, 0x1171, 0xE6C8, 0xE6C9, 0x174A, 0xE6CA, 0xE6CA, 0x1041,
+ 0xE6CB, 0xE6D1, 0x174C, 0xE6D2, 0xE6D2, 0x1174, 0xE6D3, 0xE6D5, 0x1753,
+ 0xE6D6, 0xE6D6, 0x1175, 0xE6D7, 0xE6D8, 0x1756, 0xE6D9, 0xE6D9, 0x1176,
+ 0xE6DA, 0xE6DB, 0x1758, 0xE6DC, 0xE6DC, 0x1042, 0xE6DD, 0xE6DE, 0x175A,
+ 0xE6DF, 0xE6DF, 0x1177, 0xE6E0, 0xE6E0, 0x175C, 0xE6E1, 0xE6E1, 0x1178,
+ 0xE6E2, 0xE6E3, 0x175D, 0xE6E4, 0xE6E4, 0x117A, 0xE6E5, 0xE6E5, 0x1179,
+ 0xE6E6, 0xE6E6, 0x117B, 0xE6E7, 0xE6E7, 0x175F, 0xE6E8, 0xE6E8, 0x117C,
+ 0xE6E9, 0xE6E9, 0x1760, 0xE6EA, 0xE6EB, 0x117E, 0xE6EC, 0xE6EC, 0x192F,
+ 0xE6ED, 0xE6EE, 0x1761, 0xE6EF, 0xE6EF, 0x1181, 0xE6F0, 0xE6F0, 0x1763,
+ 0xE6F1, 0xE6F1, 0x1182, 0xE6F2, 0xE6F2, 0x1554, 0xE6F3, 0xE6F4, 0x1764,
+ 0xE6F5, 0xE6F5, 0x1183, 0xE6F6, 0xE6F6, 0x1043, 0xE6F7, 0xE6F7, 0x1046,
+ 0xE6F8, 0xE6F8, 0x1766, 0xE6F9, 0xE6F9, 0x1185, 0xE6FA, 0xE6FE, 0x1767,
+ 0xE7A1, 0xE7A1, 0x1187, 0xE7A2, 0xE7A5, 0x176C, 0xE7A6, 0xE7A6, 0x1188,
+ 0xE7A7, 0xE7A8, 0x1770, 0xE7A9, 0xE7A9, 0x1189, 0xE7AA, 0xE7AA, 0x118B,
+ 0xE7AB, 0xE7AB, 0x1772, 0xE7AC, 0xE7AC, 0x1047, 0xE7AD, 0xE7AD, 0x118D,
+ 0xE7AE, 0xE7AF, 0x1773, 0xE7B0, 0xE7B0, 0x118E, 0xE7B1, 0xE7BE, 0x1775,
+ 0xE7BF, 0xE7BF, 0x118F, 0xE7C0, 0xE7C0, 0x1783, 0xE7C1, 0xE7C1, 0x1E67,
+ 0xE7C2, 0xE7C5, 0x1784, 0xE7C6, 0xE7C6, 0x1191, 0xE7C7, 0xE7C7, 0x1193,
+ 0xE7C8, 0xE7CA, 0x1788, 0xE7CB, 0xE7CB, 0x1195, 0xE7CC, 0xE7CC, 0x178B,
+ 0xE7CD, 0xE7CD, 0x1196, 0xE7CE, 0xE7CE, 0x178C, 0xE7CF, 0xE7D0, 0x1197,
+ 0xE7D1, 0xE7D2, 0x178D, 0xE7D3, 0xE7D3, 0x119A, 0xE7D4, 0xE7DE, 0x178F,
+ 0xE7DF, 0xE7DF, 0x119C, 0xE7E0, 0xE7E3, 0x179A, 0xE7E4, 0xE7E4, 0x119D,
+ 0xE7E5, 0xE7E5, 0x179E, 0xE7E6, 0xE7E6, 0x119E, 0xE7E7, 0xE7F6, 0x179F,
+ 0xE7F7, 0xE7F7, 0x16A5, 0xE7F8, 0xE7FE, 0x17AF, 0xE8A1, 0xE8E6, 0x17B6,
+ 0xE8E7, 0xE8E8, 0x11C7, 0xE8E9, 0xE8EF, 0x17FC, 0xE8F0, 0xE8F0, 0x11C9,
+ 0xE8F1, 0xE8F1, 0x1054, 0xE8F2, 0xE8F6, 0x1803, 0xE8F7, 0xE8F7, 0x11CB,
+ 0xE8F8, 0xE8F8, 0x1808, 0xE8F9, 0xE8F9, 0x16A8, 0xE8FA, 0xE8FA, 0x1809,
+ 0xE8FB, 0xE8FB, 0x11CC, 0xE8FC, 0xE8FD, 0x180A, 0xE8FE, 0xE8FE, 0x11CD,
+ 0xE9A1, 0xE9A6, 0x180C, 0xE9A7, 0xE9A7, 0x11D0, 0xE9A8, 0xE9AB, 0x1812,
+ 0xE9AC, 0xE9AC, 0x11D1, 0xE9AD, 0xE9CB, 0x1816, 0xE9CC, 0xE9CC, 0x11D3,
+ 0xE9CD, 0xE9F6, 0x1835, 0xE9F7, 0xE9F7, 0x1F34, 0xE9F8, 0xE9FE, 0x185F,
+ 0xEAA1, 0xEAC0, 0x1866, 0xEAC1, 0xEAC1, 0x17EB, 0xEAC2, 0xEAE4, 0x1886,
+ 0xEAE5, 0xEAE5, 0x11E1, 0xEAE6, 0xEAF3, 0x18A9, 0xEAF4, 0xEAF4, 0x1057,
+ 0xEAF5, 0xEAF6, 0x18B7, 0xEAF7, 0xEAF7, 0x11E3, 0xEAF8, 0xEAFB, 0x18B9,
+ 0xEAFC, 0xEAFC, 0x11E5, 0xEAFD, 0xEAFD, 0x18BD, 0xEAFE, 0xEAFE, 0x11E6,
+ 0xEBA1, 0xEBA3, 0x18BE, 0xEBA4, 0xEBA4, 0x11E8, 0xEBA5, 0xEBA6, 0x18C1,
+ 0xEBA7, 0xEBA7, 0x11EA, 0xEBA8, 0xEBA8, 0x18C3, 0xEBA9, 0xEBA9, 0x11EC,
+ 0xEBAA, 0xEBAA, 0x1058, 0xEBAB, 0xEBB9, 0x18C4, 0xEBBA, 0xEBBB, 0x11EE,
+ 0xEBBC, 0xEBBC, 0x18D3, 0xEBBD, 0xEBBD, 0x11F0, 0xEBBE, 0xEBC0, 0x18D4,
+ 0xEBC1, 0xEBC1, 0x11F1, 0xEBC2, 0xEBC2, 0x11F3, 0xEBC3, 0xEBC5, 0x18D7,
+ 0xEBC6, 0xEBC7, 0x11F4, 0xEBC8, 0xEBCB, 0x18DA, 0xEBCC, 0xEBCC, 0x11F7,
+ 0xEBCD, 0xEBCE, 0x18DE, 0xEBCF, 0xEBD1, 0x11F8, 0xEBD2, 0xEBD2, 0x15B0,
+ 0xEBD3, 0xEBD7, 0x18E0, 0xEBD8, 0xEBD8, 0x11FB, 0xEBD9, 0xEBFE, 0x18E5,
+ 0xECA1, 0xECA5, 0x190B, 0xECA6, 0xECA6, 0x1206, 0xECA7, 0xECA7, 0x1208,
+ 0xECA8, 0xECA9, 0x1910, 0xECAA, 0xECAA, 0x120A, 0xECAB, 0xECAE, 0x1912,
+ 0xECAF, 0xECAF, 0x173E, 0xECB0, 0xECB1, 0x120C, 0xECB2, 0xECB2, 0x105B,
+ 0xECB3, 0xECB4, 0x1916, 0xECB5, 0xECB5, 0x1211, 0xECB6, 0xECB7, 0x1918,
+ 0xECB8, 0xECB8, 0x1213, 0xECB9, 0xECB9, 0x191A, 0xECBA, 0xECBA, 0x1215,
+ 0xECBB, 0xECBF, 0x191B, 0xECC0, 0xECC1, 0x1218, 0xECC2, 0xECC4, 0x1920,
+ 0xECC5, 0xECC5, 0x121A, 0xECC6, 0xECC6, 0x121C, 0xECC7, 0xECC8, 0x1923,
+ 0xECC9, 0xECCA, 0x105C, 0xECCB, 0xECD4, 0x1925, 0xECD5, 0xECD5, 0x121E,
+ 0xECD6, 0xECDC, 0x192F, 0xECDD, 0xECDE, 0x1220, 0xECDF, 0xECE0, 0x1936,
+ 0xECE1, 0xECE1, 0x1222, 0xECE2, 0xECE3, 0x1938, 0xECE4, 0xECE4, 0x1224,
+ 0xECE5, 0xECE6, 0x193A, 0xECE7, 0xECE8, 0x1225, 0xECE9, 0xECF6, 0x193C,
+ 0xECF7, 0xECF8, 0x1227, 0xECF9, 0xECF9, 0x194A, 0xECFA, 0xECFA, 0x122A,
+ 0xECFB, 0xECFE, 0x194B, 0xEDA1, 0xEDA3, 0x122D, 0xEDA4, 0xEDED, 0x194F,
+ 0xEDEE, 0xEDEE, 0x14E7, 0xEDEF, 0xEDFE, 0x1999, 0xEEA1, 0xEEDA, 0x19A9,
+ 0xEEDB, 0xEEDB, 0x195E, 0xEEDC, 0xEEFE, 0x19E3, 0xEFA1, 0xEFFE, 0x1A06,
+ 0xF0A1, 0xF0FE, 0x1A64, 0xF1A1, 0xF1FE, 0x1AC2, 0xF2A1, 0xF2BC, 0x1B20,
+ 0xF2BD, 0xF2BD, 0x1663, 0xF2BE, 0xF2F9, 0x1B3C, 0xF2FA, 0xF2FA, 0x168B,
+ 0xF2FB, 0xF2FE, 0x1B78, 0xF3A1, 0xF3B0, 0x1B7C, 0xF3B1, 0xF3B1, 0x105F,
+ 0xF3B2, 0xF3FE, 0x1B8C, 0xF4A1, 0xF4A6, 0x1BD9, 0xF4A7, 0xF4A7, 0x1954,
+ 0xF4A8, 0xF4ED, 0x1BDF, 0xF4EE, 0xF4EE, 0x1A1C, 0xF4EF, 0xF4FE, 0x1C25,
+ 0xF5A1, 0xF5FE, 0x1C35, 0xF6A1, 0xF6F3, 0x1C93, 0xF6F4, 0xF6F4, 0x10B7,
+ 0xF6F5, 0xF6F5, 0x1CE6, 0xF6F6, 0xF6F6, 0x1BE3, 0xF6F7, 0xF6FE, 0x1CE7,
+ 0xF7A1, 0xF7B7, 0x1CEF, 0xF7B8, 0xF7B8, 0x1097, 0xF7B9, 0xF7C7, 0x1D06,
+ 0xF7C8, 0xF7C8, 0x10AA, 0xF7C9, 0xF7D2, 0x1D15, 0xF7D3, 0xF7D3, 0x10F4,
+ 0xF7D4, 0xF7FE, 0x1D1F, 0xF8A1, 0xF8DA, 0x1D4A, 0xF8DB, 0xF8DB, 0x1D94,
+ 0xF8DC, 0xF8EF, 0x1D84, 0xF8F0, 0xF8F0, 0x13E0, 0xF8F1, 0xF8FE, 0x1D98,
+ 0xF9A1, 0xF9FE, 0x1DA6, 0xFAA1, 0xFAA1, 0x1E1D, 0xFAA2, 0xFAA2, 0x0DE6,
+ 0xFAA3, 0xFAE5, 0x1E04, 0xFAE6, 0xFAE6, 0x0E3C, 0xFAE7, 0xFAFE, 0x1E47,
+ 0xFBA1, 0xFBFE, 0x1E5F, 0xFCA1, 0xFCA8, 0x1EBD, 0xFCA9, 0xFCA9, 0x0EE7,
+ 0xFCAA, 0xFCFE, 0x1EC5, 0xFDA1, 0xFDFE, 0x1F1A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
new file mode 100644
index 0000000000..62b6ea57ef
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp
@@ -0,0 +1,2806 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UCS2_H_1[8394 * 3] = {
+ 0x0020, 0x007E, 0x0001, 0x00A1, 0x00A1, 0x00D0, 0x00A4, 0x00A4, 0x00D6,
+ 0x00A7, 0x00A7, 0x009B, 0x00A8, 0x00A8, 0x006B, 0x00AA, 0x00AA, 0x029C,
+ 0x00AB, 0x00AB, 0x00B0, 0x00B0, 0x00B0, 0x008A, 0x00B1, 0x00B1, 0x0082,
+ 0x00B2, 0x00B3, 0x034B, 0x00B4, 0x00B4, 0x00C7, 0x00B6, 0x00B6, 0x00F4,
+ 0x00B8, 0x00B8, 0x00CE, 0x00B9, 0x00B9, 0x034A, 0x00BA, 0x00BA, 0x02A3,
+ 0x00BB, 0x00BB, 0x00B1, 0x00BC, 0x00BC, 0x02EF, 0x00BD, 0x00BD, 0x02EC,
+ 0x00BE, 0x00BE, 0x02F0, 0x00BF, 0x00BF, 0x00D1, 0x00C6, 0x00C6, 0x029A,
+ 0x00D0, 0x00D0, 0x029B, 0x00D7, 0x00D7, 0x0083, 0x00D8, 0x00D8, 0x02A1,
+ 0x00DE, 0x00DE, 0x02A4, 0x00DF, 0x00DF, 0x0300, 0x00E6, 0x00E6, 0x02F5,
+ 0x00F0, 0x00F0, 0x02F7, 0x00F7, 0x00F7, 0x0084, 0x00F8, 0x00F8, 0x02FE,
+ 0x00FE, 0x00FE, 0x0301, 0x0111, 0x0111, 0x02F6, 0x0126, 0x0126, 0x029D,
+ 0x0127, 0x0127, 0x02F8, 0x0131, 0x0131, 0x02F9, 0x0132, 0x0132, 0x029E,
+ 0x0133, 0x0133, 0x02FA, 0x0138, 0x0138, 0x02FB, 0x013F, 0x013F, 0x029F,
+ 0x0140, 0x0140, 0x02FC, 0x0141, 0x0141, 0x02A0, 0x0142, 0x0142, 0x02FD,
+ 0x0149, 0x0149, 0x0304, 0x014A, 0x014A, 0x02A6, 0x014B, 0x014B, 0x0303,
+ 0x0152, 0x0152, 0x02A2, 0x0153, 0x0153, 0x02FF, 0x0166, 0x0166, 0x02A5,
+ 0x0167, 0x0167, 0x0302, 0x02BC, 0x02BC, 0x2053, 0x02C7, 0x02C7, 0x00C9,
+ 0x02D8, 0x02D8, 0x00CA, 0x02D9, 0x02D9, 0x00CD, 0x02DA, 0x02DA, 0x00CC,
+ 0x02DB, 0x02DB, 0x00CF, 0x02DC, 0x02DC, 0x00C8, 0x02DD, 0x02DD, 0x00CB,
+ 0x0391, 0x03A1, 0x01D7, 0x03A3, 0x03A9, 0x01E8, 0x03B1, 0x03C1, 0x01EF,
+ 0x03C3, 0x03C9, 0x0200, 0x0401, 0x0401, 0x0402, 0x0410, 0x0415, 0x03FC,
+ 0x0416, 0x0435, 0x0403, 0x0436, 0x044F, 0x0424, 0x0451, 0x0451, 0x0423,
+ 0x2013, 0x2014, 0x006D, 0x2016, 0x2016, 0x006F, 0x2018, 0x2019, 0x0072,
+ 0x201B, 0x201B, 0x202E, 0x201C, 0x201D, 0x0074, 0x201F, 0x201F, 0x202D,
+ 0x2020, 0x2021, 0x00F5, 0x2022, 0x2022, 0x219F, 0x2025, 0x2026, 0x0069,
+ 0x2030, 0x2030, 0x00D8, 0x2032, 0x2033, 0x008B, 0x2034, 0x2034, 0x2186,
+ 0x2035, 0x2035, 0x246E, 0x2036, 0x2036, 0x246C, 0x2039, 0x203A, 0x21A4,
+ 0x203B, 0x203B, 0x009C, 0x203C, 0x203C, 0x223B, 0x2042, 0x2042, 0x2197,
+ 0x2074, 0x2074, 0x034D, 0x207A, 0x207B, 0x202F, 0x207C, 0x207C, 0x2038,
+ 0x207D, 0x207E, 0x203A, 0x207F, 0x207F, 0x034E, 0x2081, 0x2084, 0x034F,
+ 0x2103, 0x2103, 0x008D, 0x2109, 0x2109, 0x00D7, 0x2113, 0x2113, 0x024E,
+ 0x2116, 0x2116, 0x0102, 0x2121, 0x2121, 0x0107, 0x2122, 0x2122, 0x0104,
+ 0x2126, 0x2126, 0x0283, 0x212B, 0x212B, 0x008E, 0x2153, 0x2154, 0x02ED,
+ 0x215B, 0x215E, 0x02F1, 0x2160, 0x2169, 0x01CD, 0x2170, 0x2179, 0x01C3,
+ 0x2190, 0x2191, 0x00AB, 0x2192, 0x2192, 0x00AA, 0x2193, 0x2194, 0x00AD,
+ 0x2195, 0x2195, 0x00F7, 0x2196, 0x2196, 0x00FA, 0x2197, 0x2197, 0x00F8,
+ 0x2198, 0x2198, 0x00FB, 0x2199, 0x2199, 0x00F9, 0x21B0, 0x21B0, 0x22A4,
+ 0x21B1, 0x21B1, 0x22A1, 0x21B2, 0x21B2, 0x22A0, 0x21B3, 0x21B3, 0x22A5,
+ 0x21B4, 0x21B4, 0x22A3, 0x21BC, 0x21BC, 0x22B4, 0x21C0, 0x21C0, 0x22B5,
+ 0x21C4, 0x21C5, 0x22C0, 0x21CD, 0x21CD, 0x2270, 0x21CF, 0x21CF, 0x226F,
+ 0x21D0, 0x21D0, 0x226E, 0x21D1, 0x21D1, 0x2296, 0x21D2, 0x21D2, 0x00C3,
+ 0x21D3, 0x21D3, 0x2297, 0x21D4, 0x21D4, 0x00C4, 0x21E0, 0x21E0, 0x23E6,
+ 0x21E1, 0x21E1, 0x23E8, 0x21E2, 0x21E2, 0x23E7, 0x21E3, 0x21E3, 0x23E9,
+ 0x21E6, 0x21E6, 0x23EE, 0x21E7, 0x21E7, 0x23F0, 0x21E8, 0x21E8, 0x23EF,
+ 0x21E9, 0x21E9, 0x23F1, 0x2200, 0x2200, 0x00C5, 0x2202, 0x2202, 0x0097,
+ 0x2203, 0x2203, 0x00C6, 0x2206, 0x2206, 0x220B, 0x2207, 0x2207, 0x0098,
+ 0x2208, 0x2208, 0x00B8, 0x2209, 0x2209, 0x222D, 0x220B, 0x220B, 0x00B9,
+ 0x220C, 0x220C, 0x222E, 0x220F, 0x220F, 0x00D5, 0x2211, 0x2211, 0x00D4,
+ 0x2213, 0x2213, 0x2216, 0x221A, 0x221A, 0x00B2, 0x221D, 0x221D, 0x00B4,
+ 0x221E, 0x221E, 0x0088, 0x221F, 0x221F, 0x220D, 0x2220, 0x2220, 0x0094,
+ 0x2222, 0x2222, 0x2222, 0x2225, 0x2226, 0x220F, 0x2227, 0x2228, 0x00C0,
+ 0x2229, 0x2229, 0x00BF, 0x222A, 0x222A, 0x00BE, 0x222B, 0x222C, 0x00B6,
+ 0x222E, 0x222E, 0x00D3, 0x2234, 0x2234, 0x0089, 0x2235, 0x2235, 0x00B5,
+ 0x2236, 0x2236, 0x00D2, 0x2237, 0x2237, 0x2081, 0x223D, 0x223D, 0x00B3,
+ 0x2243, 0x2243, 0x2134, 0x2245, 0x2245, 0x2133, 0x2248, 0x2248, 0x2135,
+ 0x2250, 0x2250, 0x2223, 0x2251, 0x2251, 0x2213, 0x2252, 0x2252, 0x009A,
+ 0x2253, 0x2253, 0x2212, 0x225A, 0x225A, 0x2231, 0x2260, 0x2260, 0x0085,
+ 0x2261, 0x2261, 0x0099, 0x2262, 0x2262, 0x221E, 0x2264, 0x2265, 0x0086,
+ 0x2266, 0x2267, 0x2214, 0x226E, 0x226F, 0x2229, 0x2270, 0x2273, 0x2121,
+ 0x2276, 0x2277, 0x2129, 0x2279, 0x2279, 0x212B, 0x227A, 0x227B, 0x211B,
+ 0x2280, 0x2281, 0x211F, 0x2282, 0x2283, 0x00BC, 0x2284, 0x2284, 0x222C,
+ 0x2285, 0x2285, 0x222B, 0x2286, 0x2287, 0x00BA, 0x228A, 0x228A, 0x2126,
+ 0x228B, 0x228B, 0x2128, 0x2295, 0x2297, 0x2217, 0x22A3, 0x22A3, 0x2226,
+ 0x22A4, 0x22A4, 0x2137, 0x22A5, 0x22A5, 0x0095, 0x22BB, 0x22BC, 0x222F,
+ 0x22CE, 0x22CF, 0x211D, 0x22DA, 0x22DB, 0x212C, 0x22EE, 0x22EE, 0x2080,
+ 0x22EF, 0x22EF, 0x006A, 0x2306, 0x2306, 0x2232, 0x2312, 0x2312, 0x0096,
+ 0x2314, 0x2314, 0x221B, 0x2460, 0x246E, 0x02DD, 0x246F, 0x2473, 0x2257,
+ 0x2474, 0x2482, 0x033B, 0x2483, 0x2487, 0x2352, 0x249C, 0x24B5, 0x0321,
+ 0x24B6, 0x24CF, 0x20C4, 0x24D0, 0x24E9, 0x02C3, 0x2500, 0x2500, 0x0207,
+ 0x2501, 0x2501, 0x0212, 0x2502, 0x2502, 0x0208, 0x2503, 0x2503, 0x0213,
+ 0x250C, 0x250C, 0x0209, 0x250D, 0x250D, 0x022E, 0x250E, 0x250E, 0x022D,
+ 0x250F, 0x250F, 0x0214, 0x2510, 0x2510, 0x020A, 0x2511, 0x2511, 0x0228,
+ 0x2512, 0x2512, 0x0227, 0x2513, 0x2513, 0x0215, 0x2514, 0x2514, 0x020C,
+ 0x2515, 0x2515, 0x022C, 0x2516, 0x2516, 0x022B, 0x2517, 0x2517, 0x0217,
+ 0x2518, 0x2518, 0x020B, 0x2519, 0x2519, 0x022A, 0x251A, 0x251A, 0x0229,
+ 0x251B, 0x251B, 0x0216, 0x251C, 0x251C, 0x020D, 0x251D, 0x251D, 0x0222,
+ 0x251E, 0x251F, 0x022F, 0x2520, 0x2520, 0x021D, 0x2521, 0x2522, 0x0231,
+ 0x2523, 0x2523, 0x0218, 0x2524, 0x2524, 0x020F, 0x2525, 0x2525, 0x0224,
+ 0x2526, 0x2527, 0x0233, 0x2528, 0x2528, 0x021F, 0x2529, 0x252A, 0x0235,
+ 0x252B, 0x252B, 0x021A, 0x252C, 0x252C, 0x020E, 0x252D, 0x252E, 0x0237,
+ 0x252F, 0x252F, 0x021E, 0x2530, 0x2530, 0x0223, 0x2531, 0x2532, 0x0239,
+ 0x2533, 0x2533, 0x0219, 0x2534, 0x2534, 0x0210, 0x2535, 0x2536, 0x023B,
+ 0x2537, 0x2537, 0x0220, 0x2538, 0x2538, 0x0225, 0x2539, 0x253A, 0x023D,
+ 0x253B, 0x253B, 0x021B, 0x253C, 0x253C, 0x0211, 0x253D, 0x253E, 0x023F,
+ 0x253F, 0x253F, 0x0221, 0x2540, 0x2541, 0x0241, 0x2542, 0x2542, 0x0226,
+ 0x2543, 0x254A, 0x0243, 0x254B, 0x254B, 0x021C, 0x2592, 0x2592, 0x00E8,
+ 0x25A0, 0x25A0, 0x00A5, 0x25A1, 0x25A1, 0x00A4, 0x25A3, 0x25A3, 0x00E5,
+ 0x25A4, 0x25A5, 0x00E9, 0x25A6, 0x25A6, 0x00ED, 0x25A7, 0x25A7, 0x00EC,
+ 0x25A8, 0x25A8, 0x00EB, 0x25A9, 0x25A9, 0x00EE, 0x25B1, 0x25B1, 0x2220,
+ 0x25B2, 0x25B2, 0x00A7, 0x25B3, 0x25B3, 0x00A6, 0x25B5, 0x25B5, 0x224C,
+ 0x25B6, 0x25B6, 0x00DC, 0x25B7, 0x25B7, 0x00DB, 0x25B9, 0x25B9, 0x224D,
+ 0x25BC, 0x25BC, 0x00A9, 0x25BD, 0x25BD, 0x00A8, 0x25BF, 0x25BF, 0x224B,
+ 0x25C0, 0x25C0, 0x00DA, 0x25C1, 0x25C1, 0x00D9, 0x25C3, 0x25C3, 0x224E,
+ 0x25C6, 0x25C6, 0x00A3, 0x25C7, 0x25C7, 0x00A2, 0x25C8, 0x25C8, 0x00E4,
+ 0x25C9, 0x25C9, 0x00E3, 0x25CA, 0x25CA, 0x2253, 0x25CB, 0x25CB, 0x009F,
+ 0x25CC, 0x25CC, 0x21BF, 0x25CE, 0x25CE, 0x00A1, 0x25CF, 0x25CF, 0x00A0,
+ 0x25D0, 0x25D1, 0x00E6, 0x25E6, 0x25E6, 0x2247, 0x25EF, 0x25EF, 0x21B9,
+ 0x2605, 0x2605, 0x009E, 0x2606, 0x2606, 0x009D, 0x260E, 0x260E, 0x00F1,
+ 0x260F, 0x260F, 0x00F0, 0x261C, 0x261C, 0x00F2, 0x261D, 0x261D, 0x2406,
+ 0x261E, 0x261E, 0x00F3, 0x261F, 0x261F, 0x2407, 0x262F, 0x262F, 0x21D8,
+ 0x2640, 0x2640, 0x0093, 0x2642, 0x2642, 0x0092, 0x2660, 0x2661, 0x00DE,
+ 0x2663, 0x2663, 0x00E2, 0x2664, 0x2664, 0x00DD, 0x2665, 0x2665, 0x00E0,
+ 0x2667, 0x2667, 0x00E1, 0x2668, 0x2668, 0x00EF, 0x2669, 0x266A, 0x00FD,
+ 0x266C, 0x266C, 0x00FF, 0x266D, 0x266D, 0x00FC, 0x266F, 0x266F, 0x2192,
+ 0x2716, 0x2716, 0x21B7, 0x271A, 0x271A, 0x21B6, 0x273D, 0x273D, 0x219C,
+ 0x2756, 0x2756, 0x21BD, 0x2776, 0x277F, 0x21E1, 0x278A, 0x2793, 0x2096,
+ 0x3000, 0x3002, 0x0065, 0x3003, 0x3003, 0x006C, 0x3008, 0x3011, 0x0078,
+ 0x3012, 0x3012, 0x21FC, 0x3013, 0x3013, 0x00AF, 0x3014, 0x3015, 0x0076,
+ 0x3016, 0x3019, 0x201B, 0x301E, 0x301F, 0x246A, 0x3020, 0x3020, 0x21DF,
+ 0x3036, 0x3036, 0x21FD, 0x3041, 0x3093, 0x0353, 0x30A1, 0x30F6, 0x03A6,
+ 0x30FB, 0x30FB, 0x0068, 0x30FC, 0x30FC, 0x2472, 0x3131, 0x3163, 0x0166,
+ 0x3164, 0x3164, 0x0065, 0x3165, 0x318E, 0x0199, 0x3200, 0x321B, 0x0305,
+ 0x321C, 0x321C, 0x0101, 0x3231, 0x3231, 0x2254, 0x3239, 0x3239, 0x2255,
+ 0x3260, 0x327B, 0x02A7, 0x327F, 0x327F, 0x0100, 0x328A, 0x328F, 0x2455,
+ 0x3290, 0x3290, 0x2454, 0x3294, 0x3294, 0x2378, 0x329E, 0x329E, 0x2239,
+ 0x32A5, 0x32A5, 0x2388, 0x3380, 0x3384, 0x0273, 0x3388, 0x3389, 0x0264,
+ 0x338A, 0x338C, 0x0286, 0x338D, 0x338F, 0x0260, 0x3390, 0x3394, 0x027E,
+ 0x3395, 0x3397, 0x024B, 0x3398, 0x3398, 0x024F, 0x3399, 0x33A2, 0x0255,
+ 0x33A3, 0x33A6, 0x0251, 0x33A7, 0x33A8, 0x0267, 0x33A9, 0x33AC, 0x028F,
+ 0x33AD, 0x33AF, 0x028B, 0x33B0, 0x33B9, 0x0269, 0x33BA, 0x33BF, 0x0278,
+ 0x33C0, 0x33C1, 0x0284, 0x33C2, 0x33C2, 0x0105, 0x33C3, 0x33C3, 0x0296,
+ 0x33C4, 0x33C4, 0x0250, 0x33C5, 0x33C5, 0x028A, 0x33C6, 0x33C6, 0x0299,
+ 0x33C7, 0x33C7, 0x0103, 0x33C8, 0x33C8, 0x0266, 0x33C9, 0x33C9, 0x0297,
+ 0x33CA, 0x33CA, 0x025F, 0x33CB, 0x33CB, 0x2256, 0x33CF, 0x33CF, 0x0263,
+ 0x33D0, 0x33D0, 0x0294, 0x33D3, 0x33D3, 0x0295, 0x33D6, 0x33D6, 0x0289,
+ 0x33D8, 0x33D8, 0x0106, 0x33DB, 0x33DB, 0x028E, 0x33DC, 0x33DC, 0x0298,
+ 0x33DD, 0x33DD, 0x0293, 0x4E00, 0x4E00, 0x193C, 0x4E01, 0x4E01, 0x1A30,
+ 0x4E03, 0x4E03, 0x1CC4, 0x4E07, 0x4E07, 0x123E, 0x4E08, 0x4E08, 0x1986,
+ 0x4E09, 0x4E09, 0x14C8, 0x4E0A, 0x4E0A, 0x14D3, 0x4E0B, 0x4E0B, 0x1DC0,
+ 0x4E0D, 0x4E0D, 0x13F5, 0x4E11, 0x4E11, 0x1C78, 0x4E14, 0x4E14, 0x1B81,
+ 0x4E15, 0x4E15, 0x143D, 0x4E16, 0x4E16, 0x1574, 0x4E18, 0x4E18, 0x0F35,
+ 0x4E19, 0x4E19, 0x13B1, 0x4E1E, 0x4E1E, 0x1632, 0x4E2D, 0x4E2D, 0x1B0A,
+ 0x4E32, 0x4E32, 0x0EDA, 0x4E38, 0x4E38, 0x1ECA, 0x4E39, 0x4E39, 0x1060,
+ 0x4E3B, 0x4E3B, 0x1ACC, 0x4E42, 0x4E42, 0x178D, 0x4E43, 0x4E43, 0x103A,
+ 0x4E45, 0x4E45, 0x0F36, 0x4E4B, 0x4E4B, 0x1B1E, 0x4E4D, 0x4E4D, 0x1479,
+ 0x4E4E, 0x4E4E, 0x1E78, 0x4E4F, 0x4E4F, 0x1DBE, 0x4E56, 0x4E56, 0x0F0F,
+ 0x4E58, 0x4E58, 0x1633, 0x4E59, 0x4E59, 0x18EC, 0x4E5D, 0x4E5D, 0x0F37,
+ 0x4E5E, 0x4E5E, 0x0E1D, 0x4E5F, 0x4E5F, 0x16E6, 0x4E6B, 0x4E6B, 0x0DAC,
+ 0x4E6D, 0x4E6D, 0x10E9, 0x4E73, 0x4E73, 0x18A5, 0x4E76, 0x4E76, 0x13E4,
+ 0x4E77, 0x4E77, 0x14C3, 0x4E7E, 0x4E7E, 0x0E11, 0x4E82, 0x4E82, 0x1125,
+ 0x4E86, 0x4E86, 0x11C7, 0x4E88, 0x4E88, 0x172E, 0x4E8B, 0x4E8B, 0x147A,
+ 0x4E8C, 0x4E8C, 0x190D, 0x4E8E, 0x4E8E, 0x1835, 0x4E90, 0x4E90, 0x186C,
+ 0x4E91, 0x4E91, 0x185E, 0x4E92, 0x4E92, 0x1E79, 0x4E94, 0x4E94, 0x17A1,
+ 0x4E95, 0x4E95, 0x1A31, 0x4E98, 0x4E98, 0x0FDA, 0x4E9B, 0x4E9B, 0x147B,
+ 0x4E9E, 0x4E9E, 0x168F, 0x4EA1, 0x4EA1, 0x1258, 0x4EA2, 0x4EA2, 0x1DF6,
+ 0x4EA4, 0x4EA4, 0x0F1C, 0x4EA5, 0x4EA5, 0x1E05, 0x4EA6, 0x4EA6, 0x173B,
+ 0x4EA8, 0x4EA8, 0x1E5B, 0x4EAB, 0x4EAB, 0x1E1E, 0x4EAC, 0x4EAC, 0x0E4C,
+ 0x4EAD, 0x4EAD, 0x1A32, 0x4EAE, 0x4EAE, 0x114B, 0x4EB6, 0x4EB6, 0x1061,
+ 0x4EBA, 0x4EBA, 0x192B, 0x4EC0, 0x4EC0, 0x168B, 0x4EC1, 0x4EC1, 0x192C,
+ 0x4EC4, 0x4EC4, 0x1CA3, 0x4EC7, 0x4EC7, 0x0F38, 0x4ECA, 0x4ECA, 0x0FC6,
+ 0x4ECB, 0x4ECB, 0x0DE8, 0x4ECD, 0x4ECD, 0x194F, 0x4ED4, 0x4ED4, 0x1953,
+ 0x4ED5, 0x4ED5, 0x147C, 0x4ED6, 0x4ED6, 0x1CD4, 0x4ED7, 0x4ED7, 0x1987,
+ 0x4ED8, 0x4ED8, 0x13F6, 0x4ED9, 0x4ED9, 0x152A, 0x4EDD, 0x4EDD, 0x10EB,
+ 0x4EDF, 0x4EDF, 0x1BEC, 0x4EE3, 0x4EE3, 0x109A, 0x4EE4, 0x4EE4, 0x1189,
+ 0x4EE5, 0x4EE5, 0x190E, 0x4EF0, 0x4EF0, 0x16C9, 0x4EF2, 0x4EF2, 0x1B0B,
+ 0x4EF6, 0x4EF6, 0x0E12, 0x4EF7, 0x4EF7, 0x0DE9, 0x4EFB, 0x4EFB, 0x1945,
+ 0x4F01, 0x4F01, 0x0FDE, 0x4F09, 0x4F09, 0x1DF7, 0x4F0A, 0x4F0A, 0x190F,
+ 0x4F0B, 0x4F0B, 0x0FD3, 0x4F0D, 0x4F0D, 0x17A2, 0x4F0E, 0x4F0E, 0x0FDF,
+ 0x4F0F, 0x4F0F, 0x13D2, 0x4F10, 0x4F10, 0x138D, 0x4F11, 0x4F11, 0x1F45,
+ 0x4F2F, 0x4F2F, 0x137C, 0x4F34, 0x4F34, 0x1329, 0x4F36, 0x4F36, 0x118A,
+ 0x4F38, 0x4F38, 0x1667, 0x4F3A, 0x4F3A, 0x147D, 0x4F3C, 0x4F3C, 0x147E,
+ 0x4F3D, 0x4F3D, 0x0D6C, 0x4F43, 0x4F43, 0x19F3, 0x4F46, 0x4F46, 0x1062,
+ 0x4F47, 0x4F47, 0x19BF, 0x4F48, 0x4F48, 0x1D78, 0x4F4D, 0x4F4D, 0x188C,
+ 0x4F4E, 0x4F4E, 0x19C0, 0x4F4F, 0x4F4F, 0x1ACD, 0x4F50, 0x4F50, 0x1AC6,
+ 0x4F51, 0x4F51, 0x1836, 0x4F55, 0x4F55, 0x1DC1, 0x4F59, 0x4F59, 0x172F,
+ 0x4F5A, 0x4F5A, 0x193D, 0x4F5B, 0x4F5B, 0x1433, 0x4F5C, 0x4F5C, 0x196D,
+ 0x4F69, 0x4F69, 0x1D4E, 0x4F6F, 0x4F6F, 0x16F7, 0x4F70, 0x4F70, 0x137D,
+ 0x4F73, 0x4F73, 0x0D6D, 0x4F76, 0x4F76, 0x101F, 0x4F7A, 0x4F7A, 0x19F4,
+ 0x4F7E, 0x4F7E, 0x193E, 0x4F7F, 0x4F7F, 0x147F, 0x4F81, 0x4F81, 0x1668,
+ 0x4F83, 0x4F83, 0x0D94, 0x4F84, 0x4F84, 0x1B67, 0x4F86, 0x4F86, 0x1144,
+ 0x4F88, 0x4F88, 0x1CA8, 0x4F8A, 0x4F8A, 0x0EFF, 0x4F8B, 0x4F8B, 0x119A,
+ 0x4F8D, 0x4F8D, 0x163C, 0x4F8F, 0x4F8F, 0x1ACE, 0x4F91, 0x4F91, 0x18A6,
+ 0x4F96, 0x4F96, 0x11F2, 0x4F98, 0x4F98, 0x1B82, 0x4F9B, 0x4F9B, 0x0ECA,
+ 0x4F9D, 0x4F9D, 0x18FA, 0x4FAE, 0x4FAE, 0x129C, 0x4FAF, 0x4FAF, 0x1F1E,
+ 0x4FB5, 0x4FB5, 0x1CC7, 0x4FB6, 0x4FB6, 0x1158, 0x4FBF, 0x4FBF, 0x1D5E,
+ 0x4FC2, 0x4FC2, 0x0E79, 0x4FC3, 0x4FC3, 0x1C49, 0x4FC4, 0x4FC4, 0x1690,
+ 0x4FC9, 0x4FC9, 0x17A3, 0x4FCA, 0x4FCA, 0x1AF6, 0x4FCE, 0x4FCE, 0x1A7E,
+ 0x4FD1, 0x4FD1, 0x181E, 0x4FD3, 0x4FD3, 0x0E4D, 0x4FD4, 0x4FD4, 0x1E36,
+ 0x4FD7, 0x4FD7, 0x15A1, 0x4FDA, 0x4FDA, 0x1205, 0x4FDD, 0x4FDD, 0x13C2,
+ 0x4FDF, 0x4FDF, 0x1480, 0x4FE0, 0x4FE0, 0x1E4F, 0x4FE1, 0x4FE1, 0x1669,
+ 0x4FEE, 0x4FEE, 0x15BF, 0x4FEF, 0x4FEF, 0x13F7, 0x4FF1, 0x4FF1, 0x0F39,
+ 0x4FF3, 0x4FF3, 0x136A, 0x4FF5, 0x4FF5, 0x1D98, 0x4FF8, 0x4FF8, 0x13E5,
+ 0x4FFA, 0x4FFA, 0x1725, 0x5002, 0x5002, 0x13B2, 0x5006, 0x5006, 0x114C,
+ 0x5009, 0x5009, 0x1BB4, 0x500B, 0x500B, 0x0DEA, 0x500D, 0x500D, 0x1369,
+ 0x5011, 0x5011, 0x12E4, 0x5012, 0x5012, 0x10AD, 0x5016, 0x5016, 0x1E19,
+ 0x5019, 0x5019, 0x1F1F, 0x501A, 0x501A, 0x18FB, 0x501C, 0x501C, 0x1BDE,
+ 0x501E, 0x501E, 0x0E4E, 0x501F, 0x501F, 0x1B83, 0x5021, 0x5021, 0x1BB5,
+ 0x5023, 0x5023, 0x134D, 0x5024, 0x5024, 0x1CA9, 0x5026, 0x5026, 0x0F81,
+ 0x5027, 0x5027, 0x1AB5, 0x5028, 0x5028, 0x0E01, 0x502A, 0x502A, 0x178E,
+ 0x502B, 0x502B, 0x11F3, 0x502C, 0x502C, 0x1CE2, 0x502D, 0x502D, 0x17F3,
+ 0x503B, 0x503B, 0x16E7, 0x5043, 0x5043, 0x171D, 0x5047, 0x5047, 0x0D6E,
+ 0x5048, 0x5048, 0x0E2B, 0x5049, 0x5049, 0x188D, 0x504F, 0x504F, 0x1D5F,
+ 0x5055, 0x5055, 0x1E06, 0x505A, 0x505A, 0x1ACF, 0x505C, 0x505C, 0x1A33,
+ 0x5065, 0x5065, 0x0E13, 0x5074, 0x5074, 0x1CA2, 0x5075, 0x5075, 0x1A34,
+ 0x5076, 0x5076, 0x1837, 0x5078, 0x5078, 0x1D29, 0x5080, 0x5080, 0x0F10,
+ 0x5085, 0x5085, 0x13F8, 0x508D, 0x508D, 0x134E, 0x5091, 0x5091, 0x0E1E,
+ 0x5098, 0x5098, 0x14B7, 0x5099, 0x5099, 0x143E, 0x50AC, 0x50AC, 0x1C5E,
+ 0x50AD, 0x50AD, 0x181F, 0x50B2, 0x50B2, 0x17A4, 0x50B3, 0x50B3, 0x19F5,
+ 0x50B5, 0x50B5, 0x1BCA, 0x50B7, 0x50B7, 0x14D4, 0x50BE, 0x50BE, 0x0E4F,
+ 0x50C5, 0x50C5, 0x0FB7, 0x50C9, 0x50C9, 0x1C09, 0x50CA, 0x50CA, 0x152B,
+ 0x50CF, 0x50CF, 0x14D5, 0x50D1, 0x50D1, 0x0F1D, 0x50D5, 0x50D5, 0x13D3,
+ 0x50D6, 0x50D6, 0x1F63, 0x50DA, 0x50DA, 0x11C8, 0x50DE, 0x50DE, 0x188E,
+ 0x50E5, 0x50E5, 0x17FC, 0x50E7, 0x50E7, 0x1634, 0x50ED, 0x50ED, 0x1BAA,
+ 0x50F9, 0x50F9, 0x0D6F, 0x50FB, 0x50FB, 0x139C, 0x50FF, 0x50FF, 0x1481,
+ 0x5100, 0x5100, 0x18FC, 0x5101, 0x5101, 0x1AF7, 0x5104, 0x5104, 0x1718,
+ 0x5106, 0x5106, 0x0E50, 0x5109, 0x5109, 0x0E21, 0x5112, 0x5112, 0x18A7,
+ 0x511F, 0x511F, 0x14D6, 0x5121, 0x5121, 0x11BF, 0x512A, 0x512A, 0x1838,
+ 0x5132, 0x5132, 0x19C1, 0x5137, 0x5137, 0x1159, 0x513A, 0x513A, 0x1025,
+ 0x513C, 0x513C, 0x1726, 0x5140, 0x5140, 0x17C9, 0x5141, 0x5141, 0x18D7,
+ 0x5143, 0x5143, 0x186F, 0x5144, 0x5144, 0x1E5C, 0x5145, 0x5145, 0x1C8A,
+ 0x5146, 0x5146, 0x1A7F, 0x5147, 0x5147, 0x1F4D, 0x5148, 0x5148, 0x152C,
+ 0x5149, 0x5149, 0x0F00, 0x514B, 0x514B, 0x0FB0, 0x514C, 0x514C, 0x1D07,
+ 0x514D, 0x514D, 0x127F, 0x514E, 0x514E, 0x1D19, 0x5152, 0x5152, 0x1691,
+ 0x515C, 0x515C, 0x10FC, 0x5162, 0x5162, 0x0FDB, 0x5165, 0x5165, 0x194D,
+ 0x5167, 0x5167, 0x103B, 0x5168, 0x5168, 0x19F6, 0x5169, 0x5169, 0x114D,
+ 0x516A, 0x516A, 0x18A8, 0x516B, 0x516B, 0x1D4B, 0x516C, 0x516C, 0x0ECB,
+ 0x516D, 0x516D, 0x11EF, 0x516E, 0x516E, 0x1E6F, 0x5171, 0x5171, 0x0ECC,
+ 0x5175, 0x5175, 0x13B3, 0x5176, 0x5176, 0x0FE0, 0x5177, 0x5177, 0x0F3A,
+ 0x5178, 0x5178, 0x19F7, 0x517C, 0x517C, 0x0E46, 0x5180, 0x5180, 0x0FE1,
+ 0x5186, 0x5186, 0x172D, 0x518A, 0x518A, 0x1BD6, 0x518D, 0x518D, 0x19AA,
+ 0x5192, 0x5192, 0x129D, 0x5195, 0x5195, 0x1280, 0x5197, 0x5197, 0x1820,
+ 0x51A0, 0x51A0, 0x0EEB, 0x51A5, 0x51A5, 0x128C, 0x51AA, 0x51AA, 0x127D,
+ 0x51AC, 0x51AC, 0x10EC, 0x51B6, 0x51B6, 0x16E8, 0x51B7, 0x51B7, 0x1148,
+ 0x51BD, 0x51BD, 0x117D, 0x51C4, 0x51C4, 0x1BDA, 0x51C6, 0x51C6, 0x1AF8,
+ 0x51C9, 0x51C9, 0x114E, 0x51CB, 0x51CB, 0x1A80, 0x51CC, 0x51CC, 0x11FF,
+ 0x51CD, 0x51CD, 0x10ED, 0x51DC, 0x51DC, 0x11FE, 0x51DD, 0x51DD, 0x18F6,
+ 0x51DE, 0x51DE, 0x1F64, 0x51E1, 0x51E1, 0x1391, 0x51F0, 0x51F0, 0x1EE0,
+ 0x51F1, 0x51F1, 0x0DEB, 0x51F6, 0x51F6, 0x1F4E, 0x51F8, 0x51F8, 0x1BFF,
+ 0x51F9, 0x51F9, 0x17FD, 0x51FA, 0x51FA, 0x1C87, 0x51FD, 0x51FD, 0x1DE3,
+ 0x5200, 0x5200, 0x10AE, 0x5203, 0x5203, 0x192D, 0x5206, 0x5206, 0x1420,
+ 0x5207, 0x5207, 0x1A1C, 0x5208, 0x5208, 0x178F, 0x520A, 0x520A, 0x0D95,
+ 0x520E, 0x520E, 0x12E5, 0x5211, 0x5211, 0x1E5D, 0x5217, 0x5217, 0x117E,
+ 0x521D, 0x521D, 0x1C2E, 0x5224, 0x5224, 0x1D42, 0x5225, 0x5225, 0x13AD,
+ 0x5229, 0x5229, 0x1206, 0x522A, 0x522A, 0x14B8, 0x522E, 0x522E, 0x0EFB,
+ 0x5230, 0x5230, 0x10AF, 0x5236, 0x5236, 0x1A67, 0x5237, 0x5237, 0x15B9,
+ 0x5238, 0x5238, 0x0F82, 0x5239, 0x5239, 0x1BA5, 0x523A, 0x523A, 0x1954,
+ 0x523B, 0x523B, 0x0D89, 0x5243, 0x5243, 0x1C25, 0x5247, 0x5247, 0x1CC0,
+ 0x524A, 0x524A, 0x14B5, 0x524B, 0x524B, 0x0FB1, 0x524C, 0x524C, 0x112D,
+ 0x524D, 0x524D, 0x19F8, 0x5254, 0x5254, 0x1BDF, 0x5256, 0x5256, 0x13F9,
+ 0x525B, 0x525B, 0x0DD0, 0x525D, 0x525D, 0x1316, 0x5261, 0x5261, 0x1557,
+ 0x5269, 0x5269, 0x1950, 0x526A, 0x526A, 0x19F9, 0x526F, 0x526F, 0x13FA,
+ 0x5272, 0x5272, 0x1DE1, 0x5275, 0x5275, 0x1BB6, 0x527D, 0x527D, 0x1D99,
+ 0x527F, 0x527F, 0x1C2F, 0x5283, 0x5283, 0x1F0C, 0x5287, 0x5287, 0x0FB2,
+ 0x5288, 0x5288, 0x139D, 0x5289, 0x5289, 0x11E1, 0x528D, 0x528D, 0x0E22,
+ 0x5291, 0x5291, 0x1A68, 0x5292, 0x5292, 0x0E23, 0x529B, 0x529B, 0x116A,
+ 0x529F, 0x529F, 0x0ECD, 0x52A0, 0x52A0, 0x0D70, 0x52A3, 0x52A3, 0x117F,
+ 0x52A4, 0x52A4, 0x0FB8, 0x52A9, 0x52A9, 0x1A81, 0x52AA, 0x52AA, 0x1049,
+ 0x52AB, 0x52AB, 0x0E28, 0x52BE, 0x52BE, 0x1E17, 0x52C1, 0x52C1, 0x0E51,
+ 0x52C3, 0x52C3, 0x1342, 0x52C5, 0x52C5, 0x1CC1, 0x52C7, 0x52C7, 0x1821,
+ 0x52C9, 0x52C9, 0x1281, 0x52CD, 0x52CD, 0x0E52, 0x52D2, 0x52D2, 0x11FC,
+ 0x52D5, 0x52D5, 0x10EE, 0x52D6, 0x52D6, 0x1855, 0x52D8, 0x52D8, 0x0DB6,
+ 0x52D9, 0x52D9, 0x12CC, 0x52DB, 0x52DB, 0x1F2B, 0x52DD, 0x52DD, 0x1635,
+ 0x52DE, 0x52DE, 0x119F, 0x52DF, 0x52DF, 0x129E, 0x52E2, 0x52E2, 0x1575,
+ 0x52E3, 0x52E3, 0x19DB, 0x52E4, 0x52E4, 0x0FB9, 0x52F3, 0x52F3, 0x1F2C,
+ 0x52F5, 0x52F5, 0x115A, 0x52F8, 0x52F8, 0x0F83, 0x52FA, 0x52FA, 0x196E,
+ 0x52FB, 0x52FB, 0x0FA9, 0x52FE, 0x52FE, 0x0F3B, 0x52FF, 0x52FF, 0x12F0,
+ 0x5305, 0x5305, 0x1D79, 0x5308, 0x5308, 0x1F4F, 0x530D, 0x530D, 0x1D7A,
+ 0x530F, 0x530F, 0x1D7B, 0x5310, 0x5310, 0x13D4, 0x5315, 0x5315, 0x143F,
+ 0x5316, 0x5316, 0x1EB7, 0x5317, 0x5317, 0x141F, 0x5319, 0x5319, 0x163D,
+ 0x5320, 0x5320, 0x1988, 0x5321, 0x5321, 0x0F01, 0x5323, 0x5323, 0x0DCA,
+ 0x532A, 0x532A, 0x1440, 0x532F, 0x532F, 0x1EF8, 0x5339, 0x5339, 0x1DB4,
+ 0x533F, 0x533F, 0x105C, 0x5340, 0x5340, 0x0F3C, 0x5341, 0x5341, 0x168C,
+ 0x5343, 0x5343, 0x1BED, 0x5344, 0x5344, 0x194E, 0x5347, 0x5347, 0x1636,
+ 0x5348, 0x5348, 0x17A5, 0x5349, 0x5349, 0x1F3A, 0x534A, 0x534A, 0x132A,
+ 0x534D, 0x534D, 0x123F, 0x5351, 0x5351, 0x1441, 0x5352, 0x5352, 0x1AB2,
+ 0x5353, 0x5353, 0x1CE3, 0x5354, 0x5354, 0x1E50, 0x5357, 0x5357, 0x1031,
+ 0x535A, 0x535A, 0x1317, 0x535C, 0x535C, 0x13D5, 0x535E, 0x535E, 0x13A7,
+ 0x5360, 0x5360, 0x1A24, 0x5366, 0x5366, 0x0F0C, 0x5368, 0x5368, 0x154A,
+ 0x536F, 0x536F, 0x12C0, 0x5370, 0x5370, 0x192E, 0x5371, 0x5371, 0x188F,
+ 0x5374, 0x5374, 0x0D8A, 0x5375, 0x5375, 0x1126, 0x5377, 0x5377, 0x0F84,
+ 0x537D, 0x537D, 0x1B0E, 0x537F, 0x537F, 0x0E53, 0x5384, 0x5384, 0x16DB,
+ 0x5393, 0x5393, 0x16D0, 0x5398, 0x5398, 0x1207, 0x539A, 0x539A, 0x1F20,
+ 0x539F, 0x539F, 0x1870, 0x53A0, 0x53A0, 0x1CA4, 0x53A5, 0x53A5, 0x0F8B,
+ 0x53A6, 0x53A6, 0x1DC2, 0x53AD, 0x53AD, 0x1765, 0x53BB, 0x53BB, 0x0E02,
+ 0x53C3, 0x53C3, 0x1BAB, 0x53C8, 0x53C8, 0x1839, 0x53C9, 0x53C9, 0x1B84,
+ 0x53CA, 0x53CA, 0x0FD4, 0x53CB, 0x53CB, 0x183A, 0x53CD, 0x53CD, 0x132B,
+ 0x53D4, 0x53D4, 0x15FC, 0x53D6, 0x53D6, 0x1C94, 0x53D7, 0x53D7, 0x15C0,
+ 0x53DB, 0x53DB, 0x132C, 0x53E1, 0x53E1, 0x1790, 0x53E2, 0x53E2, 0x1C53,
+ 0x53E3, 0x53E3, 0x0F3D, 0x53E4, 0x53E4, 0x0E91, 0x53E5, 0x53E5, 0x0F3E,
+ 0x53E9, 0x53E9, 0x0E92, 0x53EA, 0x53EA, 0x1B1F, 0x53EB, 0x53EB, 0x0F9A,
+ 0x53EC, 0x53EC, 0x157C, 0x53ED, 0x53ED, 0x1D4C, 0x53EF, 0x53EF, 0x0D71,
+ 0x53F0, 0x53F0, 0x1D08, 0x53F1, 0x53F1, 0x1B68, 0x53F2, 0x53F2, 0x1482,
+ 0x53F3, 0x53F3, 0x183B, 0x53F8, 0x53F8, 0x1483, 0x5403, 0x5403, 0x1F57,
+ 0x5404, 0x5404, 0x0D8B, 0x5408, 0x5408, 0x1DEF, 0x5409, 0x5409, 0x1020,
+ 0x540A, 0x540A, 0x19DC, 0x540C, 0x540C, 0x10EF, 0x540D, 0x540D, 0x128D,
+ 0x540E, 0x540E, 0x1F21, 0x540F, 0x540F, 0x1208, 0x5410, 0x5410, 0x1D1A,
+ 0x5411, 0x5411, 0x1E1F, 0x541B, 0x541B, 0x0F71, 0x541D, 0x541D, 0x121E,
+ 0x541F, 0x541F, 0x18ED, 0x5420, 0x5420, 0x1D6E, 0x5426, 0x5426, 0x13FB,
+ 0x5429, 0x5429, 0x1421, 0x542B, 0x542B, 0x1DE4, 0x5433, 0x5433, 0x17A7,
+ 0x5438, 0x5438, 0x1F5E, 0x5439, 0x5439, 0x1C95, 0x543B, 0x543B, 0x12E6,
+ 0x543C, 0x543C, 0x1F22, 0x543E, 0x543E, 0x17A6, 0x5442, 0x5442, 0x115B,
+ 0x5448, 0x5448, 0x1A35, 0x544A, 0x544A, 0x0E93, 0x5451, 0x5451, 0x1CF0,
+ 0x5468, 0x5468, 0x1AD3, 0x546A, 0x546A, 0x1AD2, 0x5471, 0x5471, 0x0E94,
+ 0x5473, 0x5473, 0x12F3, 0x5475, 0x5475, 0x0D72, 0x547B, 0x547B, 0x166A,
+ 0x547C, 0x547C, 0x1E7A, 0x547D, 0x547D, 0x128E, 0x5480, 0x5480, 0x19C2,
+ 0x5486, 0x5486, 0x1D7C, 0x548C, 0x548C, 0x1EB8, 0x548E, 0x548E, 0x0F3F,
+ 0x5490, 0x5490, 0x13FC, 0x54A4, 0x54A4, 0x1CD5, 0x54A8, 0x54A8, 0x1955,
+ 0x54AB, 0x54AB, 0x1B20, 0x54AC, 0x54AC, 0x0F1E, 0x54B3, 0x54B3, 0x1E07,
+ 0x54B8, 0x54B8, 0x1DE5, 0x54BD, 0x54BD, 0x192F, 0x54C0, 0x54C0, 0x16D1,
+ 0x54C1, 0x54C1, 0x1DA6, 0x54C4, 0x54C4, 0x1EAD, 0x54C8, 0x54C8, 0x1DF0,
+ 0x54C9, 0x54C9, 0x19AB, 0x54E1, 0x54E1, 0x1871, 0x54E5, 0x54E5, 0x0D73,
+ 0x54E8, 0x54E8, 0x1C30, 0x54ED, 0x54ED, 0x0EB7, 0x54EE, 0x54EE, 0x1F11,
+ 0x54F2, 0x54F2, 0x1C00, 0x54FA, 0x54FA, 0x1D7D, 0x5504, 0x5504, 0x1D4F,
+ 0x5506, 0x5506, 0x1484, 0x5507, 0x5507, 0x1B44, 0x550E, 0x550E, 0x1209,
+ 0x5510, 0x5510, 0x108F, 0x551C, 0x551C, 0x1251, 0x552F, 0x552F, 0x18A9,
+ 0x5531, 0x5531, 0x1BB7, 0x5535, 0x5535, 0x16BD, 0x553E, 0x553E, 0x1CD6,
+ 0x5544, 0x5544, 0x1CE4, 0x5546, 0x5546, 0x14D7, 0x554F, 0x554F, 0x12E7,
+ 0x5553, 0x5553, 0x0E7A, 0x5556, 0x5556, 0x1079, 0x555E, 0x555E, 0x1692,
+ 0x5563, 0x5563, 0x1DE6, 0x557C, 0x557C, 0x1A69, 0x5580, 0x5580, 0x0DFB,
+ 0x5584, 0x5584, 0x152D, 0x5586, 0x5586, 0x1C01, 0x5587, 0x5587, 0x1116,
+ 0x5589, 0x5589, 0x1F23, 0x558A, 0x558A, 0x1DE7, 0x5598, 0x5598, 0x1BEE,
+ 0x5599, 0x5599, 0x1F3B, 0x559A, 0x559A, 0x1ECB, 0x559C, 0x559C, 0x1F65,
+ 0x559D, 0x559D, 0x0DAD, 0x55A7, 0x55A7, 0x1F36, 0x55A9, 0x55A9, 0x18AA,
+ 0x55AA, 0x55AA, 0x14D8, 0x55AB, 0x55AB, 0x1024, 0x55AC, 0x55AC, 0x0F1F,
+ 0x55AE, 0x55AE, 0x1063, 0x55C5, 0x55C5, 0x1F24, 0x55C7, 0x55C7, 0x14F5,
+ 0x55D4, 0x55D4, 0x1B45, 0x55DA, 0x55DA, 0x17A8, 0x55DC, 0x55DC, 0x0FE2,
+ 0x55DF, 0x55DF, 0x1B85, 0x55E3, 0x55E3, 0x1485, 0x55E4, 0x55E4, 0x1CAA,
+ 0x55FD, 0x55FD, 0x15C1, 0x55FE, 0x55FE, 0x1AD4, 0x5606, 0x5606, 0x1CF1,
+ 0x5609, 0x5609, 0x0D74, 0x5614, 0x5614, 0x0F40, 0x5617, 0x5617, 0x14D9,
+ 0x562F, 0x562F, 0x157D, 0x5632, 0x5632, 0x1A82, 0x5634, 0x5634, 0x1C96,
+ 0x5636, 0x5636, 0x163E, 0x5653, 0x5653, 0x1E27, 0x5668, 0x5668, 0x0FE3,
+ 0x566B, 0x566B, 0x1F66, 0x5674, 0x5674, 0x1422, 0x5686, 0x5686, 0x1F12,
+ 0x56A5, 0x56A5, 0x1744, 0x56AC, 0x56AC, 0x1467, 0x56AE, 0x56AE, 0x1E20,
+ 0x56B4, 0x56B4, 0x1727, 0x56BC, 0x56BC, 0x196F, 0x56CA, 0x56CA, 0x1038,
+ 0x56CD, 0x56CD, 0x1F67, 0x56D1, 0x56D1, 0x1C4A, 0x56DA, 0x56DA, 0x15C2,
+ 0x56DB, 0x56DB, 0x1486, 0x56DE, 0x56DE, 0x1EF9, 0x56E0, 0x56E0, 0x1930,
+ 0x56F0, 0x56F0, 0x0EBE, 0x56F9, 0x56F9, 0x118B, 0x56FA, 0x56FA, 0x0E95,
+ 0x5703, 0x5703, 0x1D7E, 0x5704, 0x5704, 0x170E, 0x5708, 0x5708, 0x0F85,
+ 0x570B, 0x570B, 0x0F6B, 0x570D, 0x570D, 0x1890, 0x5712, 0x5712, 0x1873,
+ 0x5713, 0x5713, 0x1872, 0x5716, 0x5716, 0x10B0, 0x5718, 0x5718, 0x1064,
+ 0x571F, 0x571F, 0x1D1B, 0x5728, 0x5728, 0x19AC, 0x572D, 0x572D, 0x0F9B,
+ 0x5730, 0x5730, 0x1B21, 0x573B, 0x573B, 0x0FE4, 0x5740, 0x5740, 0x1B22,
+ 0x5742, 0x5742, 0x1D43, 0x5747, 0x5747, 0x0FAA, 0x574A, 0x574A, 0x134F,
+ 0x574D, 0x574D, 0x107A, 0x574E, 0x574E, 0x0DB7, 0x5750, 0x5750, 0x1AC7,
+ 0x5751, 0x5751, 0x0DFD, 0x5761, 0x5761, 0x1D32, 0x5764, 0x5764, 0x0EBF,
+ 0x5766, 0x5766, 0x1CF2, 0x576A, 0x576A, 0x1D69, 0x576E, 0x576E, 0x109C,
+ 0x5770, 0x5770, 0x0E54, 0x5775, 0x5775, 0x0F41, 0x577C, 0x577C, 0x1CE5,
+ 0x5782, 0x5782, 0x15C3, 0x5788, 0x5788, 0x109B, 0x578B, 0x578B, 0x1E5E,
+ 0x5793, 0x5793, 0x1E08, 0x57A0, 0x57A0, 0x18E5, 0x57A2, 0x57A2, 0x0F42,
+ 0x57A3, 0x57A3, 0x1874, 0x57C3, 0x57C3, 0x16D2, 0x57C7, 0x57C7, 0x1822,
+ 0x57C8, 0x57C8, 0x1AF9, 0x57CB, 0x57CB, 0x1264, 0x57CE, 0x57CE, 0x1562,
+ 0x57DF, 0x57DF, 0x173C, 0x57E0, 0x57E0, 0x13FD, 0x57F0, 0x57F0, 0x1BCB,
+ 0x57F4, 0x57F4, 0x1658, 0x57F7, 0x57F7, 0x1B78, 0x57F9, 0x57F9, 0x136B,
+ 0x57FA, 0x57FA, 0x0FE5, 0x57FC, 0x57FC, 0x0FE6, 0x5800, 0x5800, 0x0F77,
+ 0x5802, 0x5802, 0x1090, 0x5805, 0x5805, 0x0E35, 0x5806, 0x5806, 0x1D23,
+ 0x5808, 0x5808, 0x0DD1, 0x5809, 0x5809, 0x18D3, 0x580A, 0x580A, 0x16A1,
+ 0x581E, 0x581E, 0x1C13, 0x5821, 0x5821, 0x13C3, 0x5824, 0x5824, 0x1A6A,
+ 0x5827, 0x5827, 0x1745, 0x582A, 0x582A, 0x0DB8, 0x582F, 0x582F, 0x17FE,
+ 0x5830, 0x5830, 0x171E, 0x5831, 0x5831, 0x13C4, 0x5834, 0x5834, 0x1989,
+ 0x5835, 0x5835, 0x10B1, 0x583A, 0x583A, 0x0E7B, 0x584A, 0x584A, 0x0F11,
+ 0x584B, 0x584B, 0x1772, 0x584F, 0x584F, 0x0DEC, 0x5851, 0x5851, 0x157E,
+ 0x5854, 0x5854, 0x1D00, 0x5857, 0x5857, 0x10B2, 0x5858, 0x5858, 0x1091,
+ 0x585A, 0x585A, 0x1C54, 0x585E, 0x585E, 0x14F2, 0x5861, 0x5861, 0x19FA,
+ 0x5862, 0x5862, 0x17A9, 0x5864, 0x5864, 0x1F2D, 0x5875, 0x5875, 0x1B46,
+ 0x5879, 0x5879, 0x1BAC, 0x587C, 0x587C, 0x19FB, 0x587E, 0x587E, 0x15FD,
+ 0x5883, 0x5883, 0x0E55, 0x5885, 0x5885, 0x14FD, 0x5889, 0x5889, 0x1823,
+ 0x5893, 0x5893, 0x12C1, 0x589C, 0x589C, 0x1C61, 0x589E, 0x589E, 0x1B13,
+ 0x589F, 0x589F, 0x1E28, 0x58A8, 0x58A8, 0x12E2, 0x58A9, 0x58A9, 0x10DF,
+ 0x58AE, 0x58AE, 0x1CD7, 0x58B3, 0x58B3, 0x1423, 0x58BA, 0x58BA, 0x17AA,
+ 0x58BB, 0x58BB, 0x198A, 0x58BE, 0x58BE, 0x0D96, 0x58C1, 0x58C1, 0x139E,
+ 0x58C5, 0x58C5, 0x17CA, 0x58C7, 0x58C7, 0x1065, 0x58CE, 0x58CE, 0x1F2E,
+ 0x58D1, 0x58D1, 0x1DCE, 0x58D3, 0x58D3, 0x16C5, 0x58D5, 0x58D5, 0x1E7B,
+ 0x58D8, 0x58D8, 0x11D4, 0x58D9, 0x58D9, 0x0F02, 0x58DE, 0x58DE, 0x0F12,
+ 0x58DF, 0x58DF, 0x11B8, 0x58E4, 0x58E4, 0x16F8, 0x58EB, 0x58EB, 0x1487,
+ 0x58EC, 0x58EC, 0x1946, 0x58EF, 0x58EF, 0x198B, 0x58F9, 0x58F9, 0x193F,
+ 0x58FA, 0x58FA, 0x1E7C, 0x58FB, 0x58FB, 0x14FE, 0x58FD, 0x58FD, 0x15C4,
+ 0x590F, 0x590F, 0x1DC3, 0x5914, 0x5914, 0x0FE7, 0x5915, 0x5915, 0x151B,
+ 0x5916, 0x5916, 0x17F7, 0x5919, 0x5919, 0x15FE, 0x591A, 0x591A, 0x105E,
+ 0x591C, 0x591C, 0x16E9, 0x5922, 0x5922, 0x12BD, 0x5927, 0x5927, 0x109D,
+ 0x5929, 0x5929, 0x1BEF, 0x592A, 0x592A, 0x1D09, 0x592B, 0x592B, 0x13FE,
+ 0x592D, 0x592D, 0x17FF, 0x592E, 0x592E, 0x16CA, 0x5931, 0x5931, 0x167E,
+ 0x5937, 0x5937, 0x1910, 0x593E, 0x593E, 0x1E51, 0x5944, 0x5944, 0x1728,
+ 0x5947, 0x5947, 0x0FE8, 0x5948, 0x5948, 0x103C, 0x5949, 0x5949, 0x13E6,
+ 0x594E, 0x594E, 0x0F9C, 0x594F, 0x594F, 0x1AD5, 0x5950, 0x5950, 0x1ECC,
+ 0x5951, 0x5951, 0x0E7C, 0x5954, 0x5954, 0x1424, 0x5955, 0x5955, 0x1E32,
+ 0x5957, 0x5957, 0x1D2A, 0x595A, 0x595A, 0x1E09, 0x5960, 0x5960, 0x19FC,
+ 0x5962, 0x5962, 0x1488, 0x5967, 0x5967, 0x17AB, 0x596A, 0x596A, 0x1CFA,
+ 0x596B, 0x596B, 0x18D8, 0x596C, 0x596C, 0x198C, 0x596D, 0x596D, 0x151C,
+ 0x596E, 0x596E, 0x1425, 0x5973, 0x5973, 0x103F, 0x5974, 0x5974, 0x104A,
+ 0x5978, 0x5978, 0x0D97, 0x597D, 0x597D, 0x1E7D, 0x5982, 0x5982, 0x1730,
+ 0x5983, 0x5983, 0x1442, 0x5984, 0x5984, 0x1259, 0x598A, 0x598A, 0x1947,
+ 0x5993, 0x5993, 0x0FE9, 0x5996, 0x5996, 0x1800, 0x5997, 0x5997, 0x0FC7,
+ 0x5999, 0x5999, 0x12C2, 0x59A5, 0x59A5, 0x1CD8, 0x59A8, 0x59A8, 0x1350,
+ 0x59AC, 0x59AC, 0x1D2B, 0x59B9, 0x59B9, 0x1265, 0x59BB, 0x59BB, 0x1BDB,
+ 0x59BE, 0x59BE, 0x1C14, 0x59C3, 0x59C3, 0x1A36, 0x59C6, 0x59C6, 0x129F,
+ 0x59C9, 0x59C9, 0x1956, 0x59CB, 0x59CB, 0x163F, 0x59D0, 0x59D0, 0x19C3,
+ 0x59D1, 0x59D1, 0x0E96, 0x59D3, 0x59D3, 0x1563, 0x59D4, 0x59D4, 0x1891,
+ 0x59D9, 0x59D9, 0x1948, 0x59DA, 0x59DA, 0x1801, 0x59DC, 0x59DC, 0x0DD2,
+ 0x59DD, 0x59DD, 0x1AD0, 0x59E6, 0x59E6, 0x0D98, 0x59E8, 0x59E8, 0x1911,
+ 0x59EA, 0x59EA, 0x1B69, 0x59EC, 0x59EC, 0x1F68, 0x59EE, 0x59EE, 0x1DF8,
+ 0x59F8, 0x59F8, 0x1746, 0x59FB, 0x59FB, 0x1931, 0x59FF, 0x59FF, 0x1957,
+ 0x5A01, 0x5A01, 0x1892, 0x5A03, 0x5A03, 0x17F4, 0x5A11, 0x5A11, 0x1489,
+ 0x5A18, 0x5A18, 0x1039, 0x5A1B, 0x5A1B, 0x17AC, 0x5A1C, 0x5A1C, 0x1026,
+ 0x5A1F, 0x5A1F, 0x1747, 0x5A20, 0x5A20, 0x166B, 0x5A25, 0x5A25, 0x1693,
+ 0x5A29, 0x5A29, 0x1240, 0x5A36, 0x5A36, 0x1C97, 0x5A3C, 0x5A3C, 0x1BB8,
+ 0x5A41, 0x5A41, 0x11D5, 0x5A46, 0x5A46, 0x1D33, 0x5A49, 0x5A49, 0x17DB,
+ 0x5A5A, 0x5A5A, 0x1EA4, 0x5A62, 0x5A62, 0x1443, 0x5A66, 0x5A66, 0x13FF,
+ 0x5A92, 0x5A92, 0x1266, 0x5A9A, 0x5A9A, 0x12F4, 0x5A9B, 0x5A9B, 0x1875,
+ 0x5AA4, 0x5AA4, 0x1640, 0x5AC1, 0x5AC1, 0x0D75, 0x5AC2, 0x5AC2, 0x15C5,
+ 0x5AC4, 0x5AC4, 0x1876, 0x5AC9, 0x5AC9, 0x1B6A, 0x5ACC, 0x5ACC, 0x1E4E,
+ 0x5AE1, 0x5AE1, 0x19DD, 0x5AE6, 0x5AE6, 0x1DF9, 0x5AE9, 0x5AE9, 0x1055,
+ 0x5B05, 0x5B05, 0x1EB9, 0x5B09, 0x5B09, 0x1F69, 0x5B0B, 0x5B0B, 0x152E,
+ 0x5B0C, 0x5B0C, 0x0F20, 0x5B16, 0x5B16, 0x1D6F, 0x5B2A, 0x5B2A, 0x1468,
+ 0x5B40, 0x5B40, 0x14DA, 0x5B43, 0x5B43, 0x16F9, 0x5B50, 0x5B50, 0x1958,
+ 0x5B51, 0x5B51, 0x1E4A, 0x5B54, 0x5B54, 0x0ECE, 0x5B55, 0x5B55, 0x1951,
+ 0x5B57, 0x5B57, 0x1959, 0x5B58, 0x5B58, 0x1AB0, 0x5B5A, 0x5B5A, 0x1400,
+ 0x5B5C, 0x5B5C, 0x195A, 0x5B5D, 0x5B5D, 0x1F13, 0x5B5F, 0x5B5F, 0x1277,
+ 0x5B63, 0x5B63, 0x0E7D, 0x5B64, 0x5B64, 0x0E97, 0x5B69, 0x5B69, 0x1E0A,
+ 0x5B6B, 0x5B6B, 0x15AA, 0x5B70, 0x5B70, 0x15FF, 0x5B71, 0x5B71, 0x197A,
+ 0x5B75, 0x5B75, 0x1401, 0x5B78, 0x5B78, 0x1DCF, 0x5B7A, 0x5B7A, 0x18AB,
+ 0x5B7C, 0x5B7C, 0x1723, 0x5B85, 0x5B85, 0x10AA, 0x5B87, 0x5B87, 0x183C,
+ 0x5B88, 0x5B88, 0x15C6, 0x5B89, 0x5B89, 0x16AF, 0x5B8B, 0x5B8B, 0x15B1,
+ 0x5B8C, 0x5B8C, 0x17DC, 0x5B8F, 0x5B8F, 0x0F18, 0x5B93, 0x5B93, 0x13D6,
+ 0x5B95, 0x5B95, 0x1D03, 0x5B96, 0x5B96, 0x1F0E, 0x5B97, 0x5B97, 0x1AB6,
+ 0x5B98, 0x5B98, 0x0EEC, 0x5B99, 0x5B99, 0x1AD6, 0x5B9A, 0x5B9A, 0x1A37,
+ 0x5B9B, 0x5B9B, 0x17DD, 0x5B9C, 0x5B9C, 0x18FD, 0x5BA2, 0x5BA2, 0x0DFC,
+ 0x5BA3, 0x5BA3, 0x152F, 0x5BA4, 0x5BA4, 0x167F, 0x5BA5, 0x5BA5, 0x18AC,
+ 0x5BA6, 0x5BA6, 0x1ECD, 0x5BAC, 0x5BAC, 0x1564, 0x5BAE, 0x5BAE, 0x0F7B,
+ 0x5BB0, 0x5BB0, 0x19AD, 0x5BB3, 0x5BB3, 0x1E0B, 0x5BB4, 0x5BB4, 0x1748,
+ 0x5BB5, 0x5BB5, 0x157F, 0x5BB6, 0x5BB6, 0x0D76, 0x5BB8, 0x5BB8, 0x166C,
+ 0x5BB9, 0x5BB9, 0x1824, 0x5BBF, 0x5BBF, 0x1600, 0x5BC0, 0x5BC0, 0x1BCC,
+ 0x5BC2, 0x5BC2, 0x19DE, 0x5BC3, 0x5BC3, 0x1877, 0x5BC4, 0x5BC4, 0x0FEA,
+ 0x5BC5, 0x5BC5, 0x1932, 0x5BC6, 0x5BC6, 0x1313, 0x5BC7, 0x5BC7, 0x0F43,
+ 0x5BCC, 0x5BCC, 0x1402, 0x5BD0, 0x5BD0, 0x1267, 0x5BD2, 0x5BD2, 0x1DD3,
+ 0x5BD3, 0x5BD3, 0x183D, 0x5BD4, 0x5BD4, 0x1659, 0x5BD7, 0x5BD7, 0x1048,
+ 0x5BDE, 0x5BDE, 0x1238, 0x5BDF, 0x5BDF, 0x1BA6, 0x5BE1, 0x5BE1, 0x0EDB,
+ 0x5BE2, 0x5BE2, 0x1CC8, 0x5BE4, 0x5BE4, 0x17AD, 0x5BE5, 0x5BE5, 0x1802,
+ 0x5BE6, 0x5BE6, 0x1680, 0x5BE7, 0x5BE7, 0x1047, 0x5BE8, 0x5BE8, 0x1BCD,
+ 0x5BE9, 0x5BE9, 0x1682, 0x5BEB, 0x5BEB, 0x148A, 0x5BEC, 0x5BEC, 0x0EED,
+ 0x5BEE, 0x5BEE, 0x11C9, 0x5BEF, 0x5BEF, 0x1AFA, 0x5BF5, 0x5BF5, 0x1C55,
+ 0x5BF6, 0x5BF6, 0x13C5, 0x5BF8, 0x5BF8, 0x1C4F, 0x5BFA, 0x5BFA, 0x148B,
+ 0x5C01, 0x5C01, 0x13E7, 0x5C04, 0x5C04, 0x148C, 0x5C07, 0x5C07, 0x198D,
+ 0x5C08, 0x5C08, 0x19FD, 0x5C09, 0x5C09, 0x1893, 0x5C0A, 0x5C0A, 0x1AB1,
+ 0x5C0B, 0x5C0B, 0x1683, 0x5C0D, 0x5C0D, 0x109E, 0x5C0E, 0x5C0E, 0x10B3,
+ 0x5C0F, 0x5C0F, 0x1580, 0x5C11, 0x5C11, 0x1581, 0x5C16, 0x5C16, 0x1C0A,
+ 0x5C19, 0x5C19, 0x14DB, 0x5C24, 0x5C24, 0x183E, 0x5C28, 0x5C28, 0x1351,
+ 0x5C31, 0x5C31, 0x1C98, 0x5C38, 0x5C38, 0x1641, 0x5C39, 0x5C39, 0x18D9,
+ 0x5C3A, 0x5C3A, 0x1BE0, 0x5C3B, 0x5C3B, 0x0E98, 0x5C3C, 0x5C3C, 0x105A,
+ 0x5C3E, 0x5C3E, 0x12F5, 0x5C3F, 0x5C3F, 0x1054, 0x5C40, 0x5C40, 0x0F6C,
+ 0x5C45, 0x5C45, 0x0E03, 0x5C46, 0x5C46, 0x0E7E, 0x5C48, 0x5C48, 0x0F78,
+ 0x5C4B, 0x5C4B, 0x17BE, 0x5C4D, 0x5C4D, 0x1643, 0x5C4E, 0x5C4E, 0x1642,
+ 0x5C51, 0x5C51, 0x154B, 0x5C55, 0x5C55, 0x19FE, 0x5C5B, 0x5C5B, 0x13B4,
+ 0x5C60, 0x5C60, 0x10B4, 0x5C62, 0x5C62, 0x11D6, 0x5C64, 0x5C64, 0x1CA7,
+ 0x5C65, 0x5C65, 0x120A, 0x5C6C, 0x5C6C, 0x15A2, 0x5C6F, 0x5C6F, 0x1106,
+ 0x5C71, 0x5C71, 0x14B9, 0x5C79, 0x5C79, 0x1F58, 0x5C90, 0x5C90, 0x0FEB,
+ 0x5C91, 0x5C91, 0x197F, 0x5CA1, 0x5CA1, 0x0DD3, 0x5CA9, 0x5CA9, 0x16BE,
+ 0x5CAB, 0x5CAB, 0x15C7, 0x5CAC, 0x5CAC, 0x0DCB, 0x5CB1, 0x5CB1, 0x109F,
+ 0x5CB3, 0x5CB3, 0x16A2, 0x5CB5, 0x5CB5, 0x1E7E, 0x5CB7, 0x5CB7, 0x1306,
+ 0x5CB8, 0x5CB8, 0x16B0, 0x5CBA, 0x5CBA, 0x118C, 0x5CBE, 0x5CBE, 0x1A25,
+ 0x5CC0, 0x5CC0, 0x15C8, 0x5CD9, 0x5CD9, 0x1CAB, 0x5CE0, 0x5CE0, 0x14DC,
+ 0x5CE8, 0x5CE8, 0x1694, 0x5CEF, 0x5CF0, 0x13E8, 0x5CF4, 0x5CF4, 0x1E37,
+ 0x5CF6, 0x5CF6, 0x10B5, 0x5CFB, 0x5CFB, 0x1AFB, 0x5CFD, 0x5CFD, 0x1E52,
+ 0x5D07, 0x5D07, 0x1627, 0x5D0D, 0x5D0D, 0x1145, 0x5D0E, 0x5D0E, 0x0FEC,
+ 0x5D11, 0x5D11, 0x0EC0, 0x5D14, 0x5D14, 0x1C5F, 0x5D16, 0x5D16, 0x16D3,
+ 0x5D17, 0x5D17, 0x0DD4, 0x5D19, 0x5D19, 0x11F4, 0x5D27, 0x5D27, 0x1628,
+ 0x5D29, 0x5D29, 0x1437, 0x5D4B, 0x5D4B, 0x12F6, 0x5D4C, 0x5D4C, 0x0DB9,
+ 0x5D50, 0x5D50, 0x112F, 0x5D69, 0x5D69, 0x1629, 0x5D6C, 0x5D6C, 0x17F8,
+ 0x5D6F, 0x5D6F, 0x1B86, 0x5D87, 0x5D87, 0x0F44, 0x5D8B, 0x5D8B, 0x10B6,
+ 0x5D9D, 0x5D9D, 0x110D, 0x5DA0, 0x5DA0, 0x0F21, 0x5DA2, 0x5DA2, 0x1803,
+ 0x5DAA, 0x5DAA, 0x172B, 0x5DB8, 0x5DB8, 0x1773, 0x5DBA, 0x5DBA, 0x118D,
+ 0x5DBC, 0x5DBC, 0x14FF, 0x5DBD, 0x5DBD, 0x16A3, 0x5DCD, 0x5DCD, 0x17F9,
+ 0x5DD2, 0x5DD2, 0x1241, 0x5DD6, 0x5DD6, 0x16BF, 0x5DDD, 0x5DDD, 0x1BF0,
+ 0x5DDE, 0x5DDE, 0x1AD7, 0x5DE1, 0x5DE1, 0x1608, 0x5DE2, 0x5DE2, 0x1582,
+ 0x5DE5, 0x5DE5, 0x0ECF, 0x5DE6, 0x5DE6, 0x1AC8, 0x5DE7, 0x5DE7, 0x0F22,
+ 0x5DE8, 0x5DE8, 0x0E04, 0x5DEB, 0x5DEB, 0x12CD, 0x5DEE, 0x5DEE, 0x1B87,
+ 0x5DF1, 0x5DF1, 0x0FED, 0x5DF2, 0x5DF2, 0x1912, 0x5DF3, 0x5DF3, 0x148D,
+ 0x5DF4, 0x5DF4, 0x1D34, 0x5DF7, 0x5DF7, 0x1DFA, 0x5DFD, 0x5DFD, 0x15AB,
+ 0x5DFE, 0x5DFE, 0x0E14, 0x5E02, 0x5E02, 0x1644, 0x5E03, 0x5E03, 0x1D7F,
+ 0x5E06, 0x5E06, 0x1392, 0x5E0C, 0x5E0C, 0x1F6A, 0x5E11, 0x5E11, 0x1D04,
+ 0x5E16, 0x5E16, 0x1C15, 0x5E19, 0x5E19, 0x1B6B, 0x5E1B, 0x5E1B, 0x137E,
+ 0x5E1D, 0x5E1D, 0x1A6B, 0x5E25, 0x5E25, 0x15C9, 0x5E2B, 0x5E2B, 0x148E,
+ 0x5E2D, 0x5E2D, 0x151D, 0x5E33, 0x5E33, 0x198E, 0x5E36, 0x5E36, 0x10A0,
+ 0x5E38, 0x5E38, 0x14DD, 0x5E3D, 0x5E3D, 0x12A0, 0x5E3F, 0x5E3F, 0x1F25,
+ 0x5E40, 0x5E40, 0x1A38, 0x5E44, 0x5E44, 0x16A4, 0x5E45, 0x5E45, 0x1D93,
+ 0x5E47, 0x5E47, 0x1352, 0x5E4C, 0x5E4C, 0x1EE1, 0x5E55, 0x5E55, 0x1239,
+ 0x5E5F, 0x5E5F, 0x1CAC, 0x5E61, 0x5E61, 0x1384, 0x5E62, 0x5E62, 0x1092,
+ 0x5E63, 0x5E63, 0x1D70, 0x5E72, 0x5E72, 0x0D99, 0x5E73, 0x5E73, 0x1D6A,
+ 0x5E74, 0x5E74, 0x1040, 0x5E77, 0x5E77, 0x13B5, 0x5E78, 0x5E78, 0x1E1A,
+ 0x5E79, 0x5E79, 0x0D9A, 0x5E7B, 0x5E7B, 0x1ECE, 0x5E7C, 0x5E7D, 0x18AD,
+ 0x5E7E, 0x5E7E, 0x0FEE, 0x5E84, 0x5E84, 0x198F, 0x5E87, 0x5E87, 0x1444,
+ 0x5E8A, 0x5E8A, 0x14DE, 0x5E8F, 0x5E8F, 0x1500, 0x5E95, 0x5E95, 0x19C4,
+ 0x5E97, 0x5E97, 0x1A26, 0x5E9A, 0x5E9A, 0x0E56, 0x5E9C, 0x5E9C, 0x1403,
+ 0x5EA0, 0x5EA0, 0x14DF, 0x5EA6, 0x5EA6, 0x10B7, 0x5EA7, 0x5EA7, 0x1AC9,
+ 0x5EAB, 0x5EAB, 0x0E99, 0x5EAD, 0x5EAD, 0x1A39, 0x5EB5, 0x5EB5, 0x16C0,
+ 0x5EB6, 0x5EB6, 0x1501, 0x5EB7, 0x5EB7, 0x0DD5, 0x5EB8, 0x5EB8, 0x1825,
+ 0x5EBE, 0x5EBE, 0x18AF, 0x5EC2, 0x5EC2, 0x14E0, 0x5EC8, 0x5EC8, 0x1DC4,
+ 0x5EC9, 0x5EC9, 0x1183, 0x5ECA, 0x5ECA, 0x113C, 0x5ED0, 0x5ED0, 0x0F45,
+ 0x5ED3, 0x5ED3, 0x0EE7, 0x5ED6, 0x5ED6, 0x11CA, 0x5EDA, 0x5EDA, 0x1AD8,
+ 0x5EDB, 0x5EDB, 0x19FF, 0x5EDF, 0x5EDF, 0x12C3, 0x5EE0, 0x5EE0, 0x1BB9,
+ 0x5EE2, 0x5EE2, 0x1D71, 0x5EE3, 0x5EE3, 0x0F03, 0x5EEC, 0x5EEC, 0x115C,
+ 0x5EF3, 0x5EF3, 0x1C1D, 0x5EF6, 0x5EF6, 0x1749, 0x5EF7, 0x5EF7, 0x1A3A,
+ 0x5EFA, 0x5EFA, 0x0E15, 0x5EFB, 0x5EFB, 0x1EFA, 0x5F01, 0x5F01, 0x13A8,
+ 0x5F04, 0x5F04, 0x11B9, 0x5F0A, 0x5F0A, 0x1D72, 0x5F0F, 0x5F0F, 0x165A,
+ 0x5F11, 0x5F11, 0x1645, 0x5F13, 0x5F13, 0x0F7C, 0x5F14, 0x5F14, 0x1A83,
+ 0x5F15, 0x5F15, 0x1933, 0x5F17, 0x5F17, 0x1434, 0x5F18, 0x5F18, 0x1EAE,
+ 0x5F1B, 0x5F1B, 0x1913, 0x5F1F, 0x5F1F, 0x1A6C, 0x5F26, 0x5F26, 0x1E38,
+ 0x5F27, 0x5F27, 0x1E7F, 0x5F29, 0x5F29, 0x104B, 0x5F31, 0x5F31, 0x16F0,
+ 0x5F35, 0x5F35, 0x1990, 0x5F3A, 0x5F3A, 0x0DD6, 0x5F3C, 0x5F3C, 0x1DB5,
+ 0x5F48, 0x5F48, 0x1CF3, 0x5F4A, 0x5F4A, 0x0DD7, 0x5F4C, 0x5F4C, 0x12F7,
+ 0x5F4E, 0x5F4E, 0x1242, 0x5F56, 0x5F56, 0x1066, 0x5F57, 0x5F57, 0x1E70,
+ 0x5F59, 0x5F59, 0x1F3D, 0x5F5B, 0x5F5B, 0x1914, 0x5F62, 0x5F62, 0x1E5F,
+ 0x5F66, 0x5F66, 0x171F, 0x5F67, 0x5F67, 0x1856, 0x5F69, 0x5F69, 0x1BCE,
+ 0x5F6A, 0x5F6A, 0x1D9A, 0x5F6B, 0x5F6B, 0x1A84, 0x5F6C, 0x5F6C, 0x1469,
+ 0x5F6D, 0x5F6D, 0x1D59, 0x5F70, 0x5F70, 0x1BBA, 0x5F71, 0x5F71, 0x1774,
+ 0x5F77, 0x5F77, 0x1353, 0x5F79, 0x5F79, 0x173D, 0x5F7C, 0x5F7C, 0x1DAD,
+ 0x5F7F, 0x5F7F, 0x1435, 0x5F80, 0x5F80, 0x17EE, 0x5F81, 0x5F81, 0x1A3B,
+ 0x5F85, 0x5F85, 0x10A1, 0x5F87, 0x5F87, 0x1609, 0x5F8A, 0x5F8A, 0x1EFB,
+ 0x5F8B, 0x5F8B, 0x11F8, 0x5F8C, 0x5F8C, 0x1F26, 0x5F90, 0x5F90, 0x1502,
+ 0x5F91, 0x5F91, 0x0E57, 0x5F92, 0x5F92, 0x10B8, 0x5F97, 0x5F97, 0x110C,
+ 0x5F98, 0x5F98, 0x136C, 0x5F99, 0x5F99, 0x148F, 0x5F9E, 0x5F9E, 0x1AB7,
+ 0x5FA0, 0x5FA0, 0x1146, 0x5FA1, 0x5FA1, 0x170F, 0x5FA8, 0x5FA8, 0x1EE2,
+ 0x5FA9, 0x5FA9, 0x13D7, 0x5FAA, 0x5FAA, 0x160A, 0x5FAE, 0x5FAE, 0x12F8,
+ 0x5FB5, 0x5FB5, 0x1B7E, 0x5FB7, 0x5FB7, 0x10AB, 0x5FB9, 0x5FB9, 0x1C02,
+ 0x5FBD, 0x5FBD, 0x1F3E, 0x5FC3, 0x5FC3, 0x1684, 0x5FC5, 0x5FC5, 0x1DB6,
+ 0x5FCC, 0x5FCC, 0x0FEF, 0x5FCD, 0x5FCD, 0x1934, 0x5FD6, 0x5FD6, 0x1C50,
+ 0x5FD7, 0x5FD7, 0x1B23, 0x5FD8, 0x5FD9, 0x125A, 0x5FE0, 0x5FE0, 0x1C8B,
+ 0x5FEB, 0x5FEB, 0x1CD3, 0x5FF5, 0x5FF5, 0x1043, 0x5FFD, 0x5FFD, 0x1EAA,
+ 0x5FFF, 0x5FFF, 0x1426, 0x600F, 0x600F, 0x16CB, 0x6012, 0x6012, 0x104C,
+ 0x6016, 0x6016, 0x1D80, 0x601C, 0x601C, 0x118E, 0x601D, 0x601D, 0x1490,
+ 0x6020, 0x6020, 0x1D0A, 0x6021, 0x6021, 0x1915, 0x6025, 0x6025, 0x0FD5,
+ 0x6027, 0x6027, 0x1565, 0x6028, 0x6028, 0x1878, 0x602A, 0x602A, 0x0F13,
+ 0x602F, 0x602F, 0x0E29, 0x6041, 0x6041, 0x1949, 0x6042, 0x6042, 0x160B,
+ 0x6043, 0x6043, 0x1646, 0x604D, 0x604D, 0x1EE3, 0x6050, 0x6050, 0x0ED0,
+ 0x6052, 0x6052, 0x1DFB, 0x6055, 0x6055, 0x1503, 0x6059, 0x6059, 0x16FA,
+ 0x605D, 0x605D, 0x0EFC, 0x6062, 0x6062, 0x1EFC, 0x6063, 0x6063, 0x195B,
+ 0x6064, 0x6064, 0x1F4A, 0x6065, 0x6065, 0x1CAD, 0x6068, 0x6068, 0x1DD4,
+ 0x6069, 0x6069, 0x18E6, 0x606A, 0x606A, 0x0D8C, 0x606C, 0x606C, 0x1044,
+ 0x606D, 0x606D, 0x0ED1, 0x606F, 0x606F, 0x165B, 0x6070, 0x6070, 0x1F5F,
+ 0x6085, 0x6085, 0x1761, 0x6089, 0x6089, 0x1681, 0x608C, 0x608C, 0x1A6D,
+ 0x608D, 0x608D, 0x1DD5, 0x6094, 0x6094, 0x1EFD, 0x6096, 0x6096, 0x1D50,
+ 0x609A, 0x609A, 0x15B2, 0x609B, 0x609B, 0x1A00, 0x609F, 0x609F, 0x17AE,
+ 0x60A0, 0x60A0, 0x18B0, 0x60A3, 0x60A3, 0x1ECF, 0x60A4, 0x60A4, 0x1C56,
+ 0x60A7, 0x60A7, 0x120B, 0x60B0, 0x60B0, 0x1AB8, 0x60B2, 0x60B2, 0x1445,
+ 0x60B3, 0x60B3, 0x10AC, 0x60B4, 0x60B4, 0x1C90, 0x60B6, 0x60B6, 0x1307,
+ 0x60B8, 0x60B8, 0x0E7F, 0x60BC, 0x60BC, 0x10B9, 0x60BD, 0x60BD, 0x1BDC,
+ 0x60C5, 0x60C5, 0x1A3C, 0x60C7, 0x60C7, 0x10E0, 0x60D1, 0x60D1, 0x1EA1,
+ 0x60DA, 0x60DA, 0x1EAB, 0x60DC, 0x60DC, 0x151E, 0x60DF, 0x60DF, 0x18B1,
+ 0x60E0, 0x60E0, 0x1E71, 0x60E1, 0x60E1, 0x16A5, 0x60F0, 0x60F0, 0x1CD9,
+ 0x60F1, 0x60F1, 0x1052, 0x60F3, 0x60F3, 0x14E1, 0x60F6, 0x60F6, 0x1EE4,
+ 0x60F9, 0x60F9, 0x16EA, 0x60FA, 0x60FA, 0x1566, 0x60FB, 0x60FB, 0x1CA5,
+ 0x6101, 0x6101, 0x15CA, 0x6106, 0x6106, 0x0E16, 0x6108, 0x6109, 0x18B2,
+ 0x610D, 0x610D, 0x1308, 0x610E, 0x610E, 0x1D5D, 0x610F, 0x610F, 0x18FE,
+ 0x6115, 0x6115, 0x16A6, 0x611A, 0x611A, 0x183F, 0x611B, 0x611B, 0x16D4,
+ 0x611F, 0x611F, 0x0DBA, 0x6127, 0x6127, 0x0F14, 0x6130, 0x6130, 0x1EE5,
+ 0x6134, 0x6134, 0x1BBB, 0x6137, 0x6137, 0x0DED, 0x613C, 0x613C, 0x166D,
+ 0x613E, 0x613E, 0x0DEE, 0x613F, 0x613F, 0x1879, 0x6142, 0x6142, 0x1826,
+ 0x6144, 0x6144, 0x11F9, 0x6147, 0x6147, 0x18E7, 0x6148, 0x6148, 0x195C,
+ 0x614A, 0x614A, 0x0E47, 0x614B, 0x614B, 0x1D0B, 0x614C, 0x614C, 0x1EE6,
+ 0x6153, 0x6153, 0x1D9B, 0x6155, 0x6155, 0x12A1, 0x6158, 0x6159, 0x1BAD,
+ 0x615D, 0x615D, 0x1D2F, 0x615F, 0x615F, 0x1D1D, 0x6162, 0x6162, 0x1243,
+ 0x6163, 0x6163, 0x0EEE, 0x6164, 0x6164, 0x0D8D, 0x6167, 0x6167, 0x1E72,
+ 0x6168, 0x6168, 0x0DEF, 0x616B, 0x616B, 0x1AB9, 0x616E, 0x616E, 0x115D,
+ 0x6170, 0x6170, 0x1894, 0x6176, 0x6176, 0x0E58, 0x6177, 0x6177, 0x0DD8,
+ 0x617D, 0x617D, 0x1BE1, 0x617E, 0x617E, 0x1818, 0x6181, 0x6181, 0x1C57,
+ 0x6182, 0x6182, 0x1840, 0x618A, 0x618A, 0x1446, 0x618E, 0x618E, 0x1B14,
+ 0x6190, 0x6190, 0x1171, 0x6191, 0x6191, 0x1475, 0x6194, 0x6194, 0x1C31,
+ 0x6198, 0x6198, 0x1F6C, 0x6199, 0x6199, 0x1F6B, 0x619A, 0x619A, 0x1CF4,
+ 0x61A4, 0x61A4, 0x1427, 0x61A7, 0x61A7, 0x10F0, 0x61A9, 0x61A9, 0x0E2C,
+ 0x61AB, 0x61AB, 0x1309, 0x61AC, 0x61AC, 0x0E59, 0x61AE, 0x61AE, 0x12CE,
+ 0x61B2, 0x61B2, 0x1E2B, 0x61B6, 0x61B6, 0x1719, 0x61BA, 0x61BA, 0x107B,
+ 0x61BE, 0x61BE, 0x0DBB, 0x61C3, 0x61C3, 0x0FBA, 0x61C7, 0x61C7, 0x0D9B,
+ 0x61C8, 0x61C8, 0x1E0C, 0x61C9, 0x61C9, 0x18F7, 0x61CA, 0x61CA, 0x17AF,
+ 0x61CB, 0x61CB, 0x12CF, 0x61E6, 0x61E6, 0x1027, 0x61F2, 0x61F2, 0x1B7F,
+ 0x61F6, 0x61F6, 0x1117, 0x61F7, 0x61F7, 0x1EFE, 0x61F8, 0x61F8, 0x1E39,
+ 0x61FA, 0x61FA, 0x1BAF, 0x61FC, 0x61FC, 0x0F46, 0x61FF, 0x61FF, 0x18FF,
+ 0x6200, 0x6200, 0x1172, 0x6207, 0x6207, 0x1093, 0x6208, 0x6208, 0x0EDC,
+ 0x620A, 0x620A, 0x12D0, 0x620C, 0x620C, 0x1623, 0x620D, 0x620D, 0x15CB,
+ 0x620E, 0x620E, 0x18E1, 0x6210, 0x6210, 0x1567, 0x6211, 0x6211, 0x1695,
+ 0x6212, 0x6212, 0x0E80, 0x6216, 0x6216, 0x1EA2, 0x621A, 0x621A, 0x1BE2,
+ 0x621F, 0x621F, 0x0FB3, 0x6221, 0x6221, 0x0DBC, 0x622A, 0x622A, 0x1A1D,
+ 0x622E, 0x622E, 0x11F0, 0x6230, 0x6230, 0x1A01, 0x6231, 0x6231, 0x1F6D,
+ 0x6234, 0x6234, 0x10A2, 0x6236, 0x6236, 0x1E80, 0x623E, 0x623E, 0x115E,
+ 0x623F, 0x623F, 0x1354, 0x6240, 0x6240, 0x1583, 0x6241, 0x6241, 0x1D60,
+ 0x6247, 0x6247, 0x1530, 0x6248, 0x6248, 0x1E81, 0x6249, 0x6249, 0x1447,
+ 0x624B, 0x624B, 0x15CC, 0x624D, 0x624D, 0x19AE, 0x6253, 0x6253, 0x1CDA,
+ 0x6258, 0x6258, 0x1CE6, 0x626E, 0x626E, 0x1428, 0x6271, 0x6271, 0x0FD6,
+ 0x6276, 0x6276, 0x1404, 0x6279, 0x6279, 0x1448, 0x627C, 0x627C, 0x16DC,
+ 0x627F, 0x627F, 0x1637, 0x6280, 0x6280, 0x0FF0, 0x6284, 0x6284, 0x1C32,
+ 0x6289, 0x6289, 0x0E40, 0x628A, 0x628A, 0x1D35, 0x6291, 0x6291, 0x171A,
+ 0x6292, 0x6292, 0x1504, 0x6295, 0x6295, 0x1D2C, 0x6297, 0x6297, 0x1DFC,
+ 0x6298, 0x6298, 0x1A1E, 0x629B, 0x629B, 0x1D81, 0x62AB, 0x62AB, 0x1DAE,
+ 0x62B1, 0x62B1, 0x1D82, 0x62B5, 0x62B5, 0x19C5, 0x62B9, 0x62B9, 0x1252,
+ 0x62BC, 0x62BC, 0x16C6, 0x62BD, 0x62BD, 0x1C62, 0x62C2, 0x62C2, 0x1436,
+ 0x62C7, 0x62C7, 0x12D1, 0x62C8, 0x62C8, 0x1045, 0x62C9, 0x62C9, 0x1139,
+ 0x62CC, 0x62CC, 0x132D, 0x62CD, 0x62CD, 0x1318, 0x62CF, 0x62CF, 0x1028,
+ 0x62D0, 0x62D0, 0x0F15, 0x62D2, 0x62D2, 0x0E05, 0x62D3, 0x62D3, 0x1BE3,
+ 0x62D4, 0x62D4, 0x1343, 0x62D6, 0x62D6, 0x1CDB, 0x62D7, 0x62D7, 0x1804,
+ 0x62D8, 0x62D8, 0x0F47, 0x62D9, 0x62D9, 0x1AB3, 0x62DB, 0x62DB, 0x1C33,
+ 0x62DC, 0x62DC, 0x136D, 0x62EC, 0x62EC, 0x0EFD, 0x62ED, 0x62ED, 0x165C,
+ 0x62EE, 0x62EE, 0x1021, 0x62EF, 0x62EF, 0x1B16, 0x62F1, 0x62F1, 0x0ED2,
+ 0x62F3, 0x62F3, 0x0F86, 0x62F7, 0x62F7, 0x0E9A, 0x62FE, 0x62FE, 0x162E,
+ 0x62FF, 0x62FF, 0x1029, 0x6301, 0x6301, 0x1B24, 0x6307, 0x6307, 0x1B25,
+ 0x6309, 0x6309, 0x16B1, 0x6311, 0x6311, 0x10BA, 0x632B, 0x632B, 0x1ACA,
+ 0x632F, 0x632F, 0x1B47, 0x633A, 0x633A, 0x1A3D, 0x633B, 0x633B, 0x174B,
+ 0x633D, 0x633D, 0x1244, 0x633E, 0x633E, 0x1E53, 0x6349, 0x6349, 0x1B8F,
+ 0x634C, 0x634C, 0x1D4D, 0x634F, 0x634F, 0x102F, 0x6350, 0x6350, 0x174A,
+ 0x6355, 0x6355, 0x1D83, 0x6367, 0x6367, 0x13EA, 0x6368, 0x6368, 0x1491,
+ 0x636E, 0x636E, 0x0E06, 0x6372, 0x6372, 0x0F87, 0x6377, 0x6377, 0x1C16,
+ 0x637A, 0x637A, 0x1030, 0x637B, 0x637B, 0x1046, 0x637F, 0x637F, 0x1505,
+ 0x6383, 0x6383, 0x1584, 0x6388, 0x6388, 0x15CD, 0x6389, 0x6389, 0x10BB,
+ 0x638C, 0x638C, 0x1991, 0x6392, 0x6392, 0x136E, 0x6396, 0x6396, 0x16DD,
+ 0x6398, 0x6398, 0x0F79, 0x639B, 0x639B, 0x0F0D, 0x63A0, 0x63A0, 0x1149,
+ 0x63A1, 0x63A1, 0x1BCF, 0x63A2, 0x63A2, 0x1CFC, 0x63A5, 0x63A5, 0x1A2D,
+ 0x63A7, 0x63A7, 0x0ED3, 0x63A8, 0x63A8, 0x1C63, 0x63A9, 0x63A9, 0x1729,
+ 0x63AA, 0x63AA, 0x1A85, 0x63C0, 0x63C0, 0x0D9C, 0x63C4, 0x63C4, 0x18B4,
+ 0x63C6, 0x63C6, 0x0F9D, 0x63CF, 0x63CF, 0x12C4, 0x63D0, 0x63D0, 0x1A6E,
+ 0x63D6, 0x63D6, 0x18F3, 0x63DA, 0x63DA, 0x16FB, 0x63DB, 0x63DB, 0x1ED0,
+ 0x63E1, 0x63E1, 0x16A7, 0x63ED, 0x63ED, 0x0E2D, 0x63EE, 0x63EE, 0x1F3F,
+ 0x63F4, 0x63F4, 0x187A, 0x63F6, 0x63F6, 0x16EB, 0x63F7, 0x63F7, 0x14CF,
+ 0x640D, 0x640D, 0x15AC, 0x640F, 0x640F, 0x1319, 0x6414, 0x6414, 0x1585,
+ 0x6416, 0x6416, 0x1805, 0x6417, 0x6417, 0x10BC, 0x641C, 0x641C, 0x15CE,
+ 0x6422, 0x6422, 0x1B48, 0x642C, 0x642C, 0x132E, 0x642D, 0x642D, 0x1D01,
+ 0x643A, 0x643A, 0x1F46, 0x643E, 0x643E, 0x1B90, 0x6458, 0x6458, 0x19DF,
+ 0x6460, 0x6460, 0x1C58, 0x6469, 0x6469, 0x1230, 0x646F, 0x646F, 0x1B26,
+ 0x6478, 0x6479, 0x12A2, 0x647A, 0x647A, 0x1A2E, 0x6488, 0x6488, 0x11A0,
+ 0x6491, 0x6491, 0x1D17, 0x6492, 0x6492, 0x14C4, 0x6493, 0x6493, 0x1806,
+ 0x649A, 0x649A, 0x1041, 0x649E, 0x649E, 0x1094, 0x64A4, 0x64A4, 0x1C03,
+ 0x64A5, 0x64A5, 0x1344, 0x64AB, 0x64AB, 0x12D2, 0x64AD, 0x64AD, 0x1D36,
+ 0x64AE, 0x64AE, 0x1C5D, 0x64B0, 0x64B0, 0x1B96, 0x64B2, 0x64B2, 0x131A,
+ 0x64BB, 0x64BB, 0x1074, 0x64C1, 0x64C1, 0x17CB, 0x64C4, 0x64C4, 0x11A1,
+ 0x64C5, 0x64C5, 0x1BF1, 0x64C7, 0x64C7, 0x1D15, 0x64CA, 0x64CA, 0x0E2E,
+ 0x64CD, 0x64CD, 0x1A86, 0x64CE, 0x64CE, 0x0E5A, 0x64D2, 0x64D2, 0x0FC8,
+ 0x64D4, 0x64D4, 0x107C, 0x64D8, 0x64D8, 0x139F, 0x64DA, 0x64DA, 0x0E07,
+ 0x64E1, 0x64E1, 0x10A3, 0x64E2, 0x64E2, 0x1CE7, 0x64E5, 0x64E5, 0x1130,
+ 0x64E6, 0x64E6, 0x1BA7, 0x64E7, 0x64E7, 0x0E08, 0x64EC, 0x64EC, 0x1900,
+ 0x64F2, 0x64F2, 0x1BE4, 0x64F4, 0x64F4, 0x1EC5, 0x64FA, 0x64FA, 0x1D37,
+ 0x64FE, 0x64FE, 0x1807, 0x6500, 0x6500, 0x132F, 0x6504, 0x6504, 0x1D18,
+ 0x6518, 0x6518, 0x16FC, 0x651D, 0x651D, 0x155F, 0x6523, 0x6523, 0x1173,
+ 0x652A, 0x652A, 0x0F23, 0x652B, 0x652B, 0x1EC6, 0x652C, 0x652C, 0x1131,
+ 0x652F, 0x652F, 0x1B27, 0x6536, 0x6536, 0x15CF, 0x6537, 0x6537, 0x0E9B,
+ 0x6538, 0x6538, 0x18B5, 0x6539, 0x6539, 0x0DF0, 0x653B, 0x653B, 0x0ED4,
+ 0x653E, 0x653E, 0x1355, 0x653F, 0x653F, 0x1A3E, 0x6545, 0x6545, 0x0E9C,
+ 0x6548, 0x6548, 0x1F14, 0x654D, 0x654D, 0x1506, 0x654E, 0x654E, 0x0F24,
+ 0x654F, 0x654F, 0x130A, 0x6551, 0x6551, 0x0F48, 0x6556, 0x6556, 0x17B0,
+ 0x6557, 0x6557, 0x1D51, 0x655E, 0x655E, 0x1BBC, 0x6562, 0x6562, 0x0DBD,
+ 0x6563, 0x6563, 0x14BA, 0x6566, 0x6566, 0x10E1, 0x656C, 0x656C, 0x0E5B,
+ 0x656D, 0x656D, 0x16FD, 0x6572, 0x6572, 0x0E9D, 0x6574, 0x6574, 0x1A3F,
+ 0x6575, 0x6575, 0x19E0, 0x6577, 0x6577, 0x1405, 0x6578, 0x6578, 0x15D0,
+ 0x657E, 0x657E, 0x1531, 0x6582, 0x6582, 0x1184, 0x6583, 0x6583, 0x1D73,
+ 0x6585, 0x6585, 0x1F15, 0x6587, 0x6587, 0x12E8, 0x658C, 0x658C, 0x146A,
+ 0x6590, 0x6590, 0x1449, 0x6591, 0x6591, 0x1330, 0x6597, 0x6597, 0x10FD,
+ 0x6599, 0x6599, 0x11CB, 0x659B, 0x659B, 0x0EB8, 0x659C, 0x659C, 0x1492,
+ 0x659F, 0x659F, 0x1B76, 0x65A1, 0x65A1, 0x16B9, 0x65A4, 0x65A4, 0x0FBB,
+ 0x65A5, 0x65A5, 0x1BE5, 0x65A7, 0x65A7, 0x1406, 0x65AB, 0x65AB, 0x1970,
+ 0x65AC, 0x65AC, 0x1BB0, 0x65AF, 0x65AF, 0x1493, 0x65B0, 0x65B0, 0x166E,
+ 0x65B7, 0x65B7, 0x1067, 0x65B9, 0x65B9, 0x1356, 0x65BC, 0x65BC, 0x1710,
+ 0x65BD, 0x65BD, 0x1647, 0x65C1, 0x65C1, 0x1357, 0x65C5, 0x65C5, 0x115F,
+ 0x65CB, 0x65CB, 0x1532, 0x65CC, 0x65CC, 0x1A40, 0x65CF, 0x65CF, 0x1AAC,
+ 0x65D2, 0x65D2, 0x11E2, 0x65D7, 0x65D7, 0x0FF1, 0x65E0, 0x65E0, 0x12D3,
+ 0x65E3, 0x65E3, 0x0FF2, 0x65E5, 0x65E5, 0x1940, 0x65E6, 0x65E6, 0x1068,
+ 0x65E8, 0x65E8, 0x1B28, 0x65E9, 0x65E9, 0x1A87, 0x65EC, 0x65EC, 0x160C,
+ 0x65ED, 0x65ED, 0x1857, 0x65F1, 0x65F1, 0x1DD6, 0x65F4, 0x65F4, 0x1841,
+ 0x65FA, 0x65FA, 0x17EF, 0x65FB, 0x65FC, 0x130B, 0x65FD, 0x65FD, 0x10E2,
+ 0x65FF, 0x65FF, 0x17B1, 0x6606, 0x6606, 0x0EC1, 0x6607, 0x6607, 0x1638,
+ 0x6609, 0x6609, 0x1358, 0x660A, 0x660A, 0x1E82, 0x660C, 0x660C, 0x1BBD,
+ 0x660E, 0x660E, 0x128F, 0x660F, 0x660F, 0x1EA5, 0x6610, 0x6610, 0x1429,
+ 0x6611, 0x6611, 0x0FC9, 0x6613, 0x6613, 0x173E, 0x6614, 0x6614, 0x151F,
+ 0x6615, 0x6615, 0x1F53, 0x661E, 0x661E, 0x13B6, 0x661F, 0x661F, 0x1568,
+ 0x6620, 0x6620, 0x1775, 0x6625, 0x6625, 0x1C84, 0x6627, 0x6627, 0x1268,
+ 0x6628, 0x6628, 0x1971, 0x662D, 0x662D, 0x1586, 0x662F, 0x662F, 0x1648,
+ 0x6630, 0x6630, 0x1DC5, 0x6631, 0x6631, 0x1858, 0x6634, 0x6634, 0x12C5,
+ 0x6636, 0x6636, 0x1BBE, 0x663A, 0x663A, 0x13B7, 0x663B, 0x663B, 0x16CC,
+ 0x6641, 0x6641, 0x1A88, 0x6642, 0x6642, 0x1649, 0x6643, 0x6644, 0x1EE7,
+ 0x6649, 0x6649, 0x1B49, 0x664B, 0x664B, 0x1B4A, 0x664F, 0x664F, 0x16B2,
+ 0x6659, 0x6659, 0x1AFC, 0x665B, 0x665B, 0x1E3A, 0x665D, 0x665D, 0x1AD9,
+ 0x665E, 0x665E, 0x1F6E, 0x665F, 0x665F, 0x1569, 0x6664, 0x6664, 0x17B2,
+ 0x6665, 0x6665, 0x1ED2, 0x6666, 0x6666, 0x1EFF, 0x6667, 0x6667, 0x1E83,
+ 0x6668, 0x6668, 0x166F, 0x6669, 0x6669, 0x1245, 0x666B, 0x666B, 0x1CE8,
+ 0x666E, 0x666E, 0x13C6, 0x666F, 0x666F, 0x0E5C, 0x6673, 0x6673, 0x1520,
+ 0x6674, 0x6674, 0x1C1E, 0x6676, 0x6676, 0x1A41, 0x6677, 0x6677, 0x0F96,
+ 0x6678, 0x6678, 0x1A42, 0x667A, 0x667A, 0x1B29, 0x6684, 0x6684, 0x1F37,
+ 0x6687, 0x6687, 0x0D77, 0x6688, 0x6688, 0x1F34, 0x6689, 0x6689, 0x1F40,
+ 0x668E, 0x668E, 0x1776, 0x6690, 0x6690, 0x1895, 0x6691, 0x6691, 0x1507,
+ 0x6696, 0x6696, 0x102C, 0x6697, 0x6697, 0x16C1, 0x6698, 0x6698, 0x16FE,
+ 0x669D, 0x669D, 0x1290, 0x66A0, 0x66A0, 0x0E9E, 0x66A2, 0x66A2, 0x1BBF,
+ 0x66AB, 0x66AB, 0x1980, 0x66AE, 0x66AE, 0x12A4, 0x66B2, 0x66B2, 0x1992,
+ 0x66B3, 0x66B3, 0x1E73, 0x66B4, 0x66B4, 0x1D94, 0x66B9, 0x66B9, 0x1558,
+ 0x66BB, 0x66BB, 0x0E5D, 0x66BE, 0x66BE, 0x10E3, 0x66C4, 0x66C4, 0x176F,
+ 0x66C6, 0x66C6, 0x116B, 0x66C7, 0x66C7, 0x107D, 0x66C9, 0x66C9, 0x1F16,
+ 0x66D6, 0x66D6, 0x16D5, 0x66D9, 0x66D9, 0x1508, 0x66DC, 0x66DC, 0x1808,
+ 0x66DD, 0x66DD, 0x1D95, 0x66E0, 0x66E0, 0x0F04, 0x66E6, 0x66E6, 0x1F6F,
+ 0x66F0, 0x66F0, 0x17ED, 0x66F2, 0x66F2, 0x0EB9, 0x66F3, 0x66F3, 0x1791,
+ 0x66F4, 0x66F4, 0x0E5E, 0x66F7, 0x66F7, 0x0DAE, 0x66F8, 0x66F8, 0x1509,
+ 0x66F9, 0x66F9, 0x1A8A, 0x66FA, 0x66FA, 0x1A89, 0x66FC, 0x66FC, 0x1246,
+ 0x66FE, 0x66FE, 0x1B15, 0x66FF, 0x66FF, 0x1C26, 0x6700, 0x6700, 0x1C60,
+ 0x6703, 0x6703, 0x1F00, 0x6708, 0x6708, 0x1889, 0x6709, 0x6709, 0x18B6,
+ 0x670B, 0x670B, 0x1438, 0x670D, 0x670D, 0x13D8, 0x6714, 0x6714, 0x14B6,
+ 0x6715, 0x6715, 0x1B77, 0x6717, 0x6717, 0x113D, 0x671B, 0x671B, 0x125C,
+ 0x671D, 0x671D, 0x1A8B, 0x671E, 0x671F, 0x0FF3, 0x6726, 0x6726, 0x12BE,
+ 0x6727, 0x6727, 0x11BA, 0x6728, 0x6728, 0x12B4, 0x672A, 0x672A, 0x12F9,
+ 0x672B, 0x672B, 0x1253, 0x672C, 0x672C, 0x13E3, 0x672D, 0x672D, 0x1BA8,
+ 0x672E, 0x672E, 0x1C88, 0x6731, 0x6731, 0x1ADA, 0x6734, 0x6734, 0x131B,
+ 0x6736, 0x6736, 0x1CDC, 0x673A, 0x673A, 0x0F90, 0x673D, 0x673D, 0x1F27,
+ 0x6746, 0x6746, 0x0D9D, 0x6749, 0x6749, 0x14C9, 0x674E, 0x674E, 0x120C,
+ 0x674F, 0x674F, 0x1E1B, 0x6750, 0x6750, 0x19AF, 0x6751, 0x6751, 0x1C51,
+ 0x6753, 0x6753, 0x1D9C, 0x6756, 0x6756, 0x1993, 0x675C, 0x675C, 0x10FE,
+ 0x675E, 0x675E, 0x0FF5, 0x675F, 0x675F, 0x15A3, 0x676D, 0x676D, 0x1DFD,
+ 0x676F, 0x676F, 0x136F, 0x6770, 0x6770, 0x0E1F, 0x6771, 0x6771, 0x10F1,
+ 0x6773, 0x6773, 0x12C6, 0x6775, 0x6775, 0x19C6, 0x6777, 0x6777, 0x1D38,
+ 0x677B, 0x677B, 0x1057, 0x677E, 0x677E, 0x15B3, 0x677F, 0x677F, 0x1D44,
+ 0x6787, 0x6787, 0x144A, 0x6789, 0x6789, 0x17F0, 0x678B, 0x678B, 0x1359,
+ 0x678F, 0x678F, 0x1032, 0x6790, 0x6790, 0x1521, 0x6793, 0x6793, 0x10FF,
+ 0x6795, 0x6795, 0x1CC9, 0x6797, 0x6797, 0x1227, 0x679A, 0x679A, 0x1269,
+ 0x679C, 0x679C, 0x0EDD, 0x679D, 0x679D, 0x1B2A, 0x67AF, 0x67AF, 0x0E9F,
+ 0x67B0, 0x67B0, 0x1D6B, 0x67B3, 0x67B3, 0x1B2B, 0x67B6, 0x67B7, 0x0D78,
+ 0x67B8, 0x67B8, 0x0F49, 0x67BE, 0x67BE, 0x164A, 0x67C4, 0x67C4, 0x13B8,
+ 0x67CF, 0x67CF, 0x137F, 0x67D0, 0x67D0, 0x12A5, 0x67D1, 0x67D1, 0x0DBE,
+ 0x67D2, 0x67D2, 0x1CC5, 0x67D3, 0x67D3, 0x1766, 0x67D4, 0x67D4, 0x18B7,
+ 0x67DA, 0x67DA, 0x18B8, 0x67DD, 0x67DD, 0x1CE9, 0x67E9, 0x67E9, 0x0F4A,
+ 0x67EC, 0x67EC, 0x0D9E, 0x67EF, 0x67EF, 0x0D7A, 0x67F0, 0x67F0, 0x103D,
+ 0x67F1, 0x67F1, 0x1ADB, 0x67F3, 0x67F3, 0x11E3, 0x67F4, 0x67F4, 0x164B,
+ 0x67F5, 0x67F5, 0x1BD7, 0x67F6, 0x67F6, 0x1494, 0x67FB, 0x67FB, 0x1495,
+ 0x67FE, 0x67FE, 0x1A43, 0x6812, 0x6812, 0x160D, 0x6813, 0x6813, 0x1A02,
+ 0x6816, 0x6816, 0x150A, 0x6817, 0x6817, 0x11FA, 0x6821, 0x6821, 0x0F25,
+ 0x6822, 0x6822, 0x1380, 0x682A, 0x682A, 0x1ADC, 0x682F, 0x682F, 0x1859,
+ 0x6838, 0x6838, 0x1E18, 0x6839, 0x6839, 0x0FBC, 0x683C, 0x683C, 0x0E2F,
+ 0x683D, 0x683D, 0x19B0, 0x6840, 0x6840, 0x0E20, 0x6841, 0x6841, 0x1DFE,
+ 0x6842, 0x6842, 0x0E81, 0x6843, 0x6843, 0x10BD, 0x6848, 0x6848, 0x16B3,
+ 0x684E, 0x684E, 0x1B6C, 0x6850, 0x6850, 0x10F2, 0x6851, 0x6851, 0x14E2,
+ 0x6853, 0x6853, 0x1ED3, 0x6854, 0x6854, 0x1022, 0x686D, 0x686D, 0x1B4B,
+ 0x6876, 0x6876, 0x1D1E, 0x687F, 0x687F, 0x0D9F, 0x6881, 0x6881, 0x114F,
+ 0x6885, 0x6885, 0x126A, 0x688F, 0x688F, 0x0EBA, 0x6893, 0x6893, 0x19B1,
+ 0x6894, 0x6894, 0x1CAE, 0x6897, 0x6897, 0x0E5F, 0x689D, 0x689D, 0x1A8C,
+ 0x689F, 0x689F, 0x1F17, 0x68A1, 0x68A1, 0x17DE, 0x68A2, 0x68A2, 0x1C34,
+ 0x68A7, 0x68A7, 0x17B3, 0x68A8, 0x68A8, 0x120D, 0x68AD, 0x68AD, 0x1496,
+ 0x68AF, 0x68AF, 0x1A6F, 0x68B0, 0x68B0, 0x0E82, 0x68B1, 0x68B1, 0x0EC2,
+ 0x68B3, 0x68B3, 0x1587, 0x68B5, 0x68B5, 0x1393, 0x68B6, 0x68B6, 0x12FA,
+ 0x68C4, 0x68C4, 0x0FF7, 0x68C5, 0x68C5, 0x13B9, 0x68C9, 0x68C9, 0x1282,
+ 0x68CB, 0x68CB, 0x0FF6, 0x68CD, 0x68CD, 0x0EC3, 0x68D2, 0x68D2, 0x13EB,
+ 0x68D5, 0x68D5, 0x1ABA, 0x68D7, 0x68D7, 0x1A8D, 0x68D8, 0x68D8, 0x0FB4,
+ 0x68DA, 0x68DA, 0x1439, 0x68DF, 0x68DF, 0x10F3, 0x68E0, 0x68E0, 0x1095,
+ 0x68E7, 0x68E7, 0x197B, 0x68E8, 0x68E8, 0x0E83, 0x68EE, 0x68EE, 0x14CA,
+ 0x68F2, 0x68F2, 0x150B, 0x68F9, 0x68F9, 0x10BE, 0x68FA, 0x68FA, 0x0EEF,
+ 0x6900, 0x6900, 0x17DF, 0x6905, 0x6905, 0x1901, 0x690D, 0x690D, 0x165D,
+ 0x690E, 0x690E, 0x1C64, 0x6912, 0x6912, 0x1C35, 0x6927, 0x6927, 0x1291,
+ 0x6930, 0x6930, 0x16EC, 0x693D, 0x693D, 0x174C, 0x693F, 0x693F, 0x1C85,
+ 0x694A, 0x694A, 0x16FF, 0x6953, 0x6953, 0x1DA8, 0x6954, 0x6954, 0x154C,
+ 0x6955, 0x6955, 0x1CDD, 0x6957, 0x6957, 0x0E17, 0x6959, 0x6959, 0x12D4,
+ 0x695A, 0x695A, 0x1C36, 0x695E, 0x695E, 0x1200, 0x6960, 0x6960, 0x1033,
+ 0x6961, 0x6962, 0x18B9, 0x6963, 0x6963, 0x12FB, 0x6968, 0x6968, 0x1A44,
+ 0x696B, 0x696B, 0x1B10, 0x696D, 0x696D, 0x172C, 0x696E, 0x696E, 0x19C7,
+ 0x696F, 0x696F, 0x160E, 0x6975, 0x6975, 0x0FB5, 0x6977, 0x6977, 0x1E0D,
+ 0x6978, 0x6978, 0x1C65, 0x6979, 0x6979, 0x1777, 0x6995, 0x6995, 0x1827,
+ 0x699B, 0x699B, 0x1B4C, 0x699C, 0x699C, 0x135A, 0x69A5, 0x69A5, 0x1EE9,
+ 0x69A7, 0x69A7, 0x144B, 0x69AE, 0x69AE, 0x1778, 0x69B4, 0x69B4, 0x11E4,
+ 0x69BB, 0x69BB, 0x1D02, 0x69C1, 0x69C1, 0x0EA0, 0x69C3, 0x69C3, 0x1331,
+ 0x69CB, 0x69CB, 0x0F4B, 0x69CC, 0x69CC, 0x1D24, 0x69CD, 0x69CD, 0x1BC0,
+ 0x69D0, 0x69D0, 0x0F16, 0x69E8, 0x69E8, 0x0EE8, 0x69EA, 0x69EA, 0x0DF1,
+ 0x69FB, 0x69FB, 0x0F9E, 0x69FD, 0x69FD, 0x1A8E, 0x69FF, 0x69FF, 0x0FBD,
+ 0x6A02, 0x6A02, 0x16A8, 0x6A0A, 0x6A0A, 0x1385, 0x6A11, 0x6A11, 0x1150,
+ 0x6A13, 0x6A13, 0x11D7, 0x6A17, 0x6A17, 0x19C8, 0x6A19, 0x6A19, 0x1D9D,
+ 0x6A1E, 0x6A1E, 0x1C66, 0x6A1F, 0x6A1F, 0x1994, 0x6A21, 0x6A21, 0x12A6,
+ 0x6A23, 0x6A23, 0x1700, 0x6A35, 0x6A35, 0x1C37, 0x6A38, 0x6A38, 0x131C,
+ 0x6A39, 0x6A39, 0x15D1, 0x6A3A, 0x6A3A, 0x1EBA, 0x6A3D, 0x6A3D, 0x1AFD,
+ 0x6A44, 0x6A44, 0x0DBF, 0x6A48, 0x6A48, 0x1809, 0x6A4B, 0x6A4B, 0x0F26,
+ 0x6A52, 0x6A52, 0x185F, 0x6A53, 0x6A53, 0x160F, 0x6A58, 0x6A58, 0x0FAF,
+ 0x6A59, 0x6A59, 0x110E, 0x6A5F, 0x6A5F, 0x0FF8, 0x6A61, 0x6A61, 0x14E3,
+ 0x6A6B, 0x6A6B, 0x1F0F, 0x6A80, 0x6A80, 0x1069, 0x6A84, 0x6A84, 0x0E30,
+ 0x6A89, 0x6A89, 0x1A45, 0x6A8D, 0x6A8D, 0x171B, 0x6A8E, 0x6A8E, 0x0FCA,
+ 0x6A97, 0x6A97, 0x13A0, 0x6A9C, 0x6A9C, 0x1F01, 0x6AA2, 0x6AA2, 0x0E24,
+ 0x6AA3, 0x6AA3, 0x1995, 0x6AB3, 0x6AB3, 0x146B, 0x6ABB, 0x6ABB, 0x1DE8,
+ 0x6AC2, 0x6AC2, 0x10BF, 0x6AC3, 0x6AC3, 0x0F91, 0x6AD3, 0x6AD3, 0x11A2,
+ 0x6ADA, 0x6ADA, 0x1160, 0x6ADB, 0x6ADB, 0x1B0F, 0x6AF6, 0x6AF6, 0x1E2C,
+ 0x6AFB, 0x6AFB, 0x16E2, 0x6B04, 0x6B04, 0x1127, 0x6B0A, 0x6B0A, 0x0F88,
+ 0x6B0C, 0x6B0C, 0x1996, 0x6B12, 0x6B12, 0x1128, 0x6B16, 0x6B16, 0x1132,
+ 0x6B20, 0x6B20, 0x1F5B, 0x6B21, 0x6B21, 0x1B88, 0x6B23, 0x6B23, 0x1F54,
+ 0x6B32, 0x6B32, 0x1819, 0x6B3A, 0x6B3A, 0x0FF9, 0x6B3D, 0x6B3D, 0x1F5C,
+ 0x6B3E, 0x6B3E, 0x0EF0, 0x6B46, 0x6B46, 0x1F5D, 0x6B47, 0x6B47, 0x1E2F,
+ 0x6B4C, 0x6B4C, 0x0D7B, 0x6B4E, 0x6B4E, 0x1CF5, 0x6B50, 0x6B50, 0x0F4C,
+ 0x6B5F, 0x6B5F, 0x1731, 0x6B61, 0x6B61, 0x1ED1, 0x6B62, 0x6B62, 0x1B2C,
+ 0x6B63, 0x6B63, 0x1A46, 0x6B64, 0x6B64, 0x1B89, 0x6B65, 0x6B65, 0x13C7,
+ 0x6B66, 0x6B66, 0x12D5, 0x6B6A, 0x6B6A, 0x17F5, 0x6B72, 0x6B72, 0x1576,
+ 0x6B77, 0x6B77, 0x116C, 0x6B78, 0x6B78, 0x0F97, 0x6B7B, 0x6B7B, 0x1497,
+ 0x6B7F, 0x6B7F, 0x12BB, 0x6B83, 0x6B83, 0x16CD, 0x6B84, 0x6B84, 0x1B4D,
+ 0x6B86, 0x6B86, 0x1D0C, 0x6B89, 0x6B89, 0x1610, 0x6B8A, 0x6B8A, 0x15D2,
+ 0x6B96, 0x6B96, 0x165E, 0x6B98, 0x6B98, 0x197C, 0x6B9E, 0x6B9E, 0x1860,
+ 0x6BAE, 0x6BAE, 0x1185, 0x6BAF, 0x6BAF, 0x146C, 0x6BB2, 0x6BB2, 0x1559,
+ 0x6BB5, 0x6BB5, 0x106A, 0x6BB7, 0x6BB7, 0x18E8, 0x6BBA, 0x6BBA, 0x14C5,
+ 0x6BBC, 0x6BBC, 0x0D8E, 0x6BBF, 0x6BBF, 0x1A03, 0x6BC1, 0x6BC1, 0x1F3C,
+ 0x6BC5, 0x6BC5, 0x1902, 0x6BC6, 0x6BC6, 0x0F4D, 0x6BCB, 0x6BCB, 0x12D6,
+ 0x6BCD, 0x6BCD, 0x12A7, 0x6BCF, 0x6BCF, 0x126B, 0x6BD2, 0x6BD2, 0x10D5,
+ 0x6BD3, 0x6BD3, 0x18D4, 0x6BD4, 0x6BD4, 0x144C, 0x6BD6, 0x6BD8, 0x144D,
+ 0x6BDB, 0x6BDB, 0x12A8, 0x6BEB, 0x6BEB, 0x1E84, 0x6BEC, 0x6BEC, 0x0F4E,
+ 0x6C08, 0x6C08, 0x1A04, 0x6C0F, 0x6C0F, 0x168E, 0x6C11, 0x6C11, 0x130D,
+ 0x6C13, 0x6C13, 0x1278, 0x6C23, 0x6C23, 0x0FFA, 0x6C34, 0x6C34, 0x15D3,
+ 0x6C37, 0x6C37, 0x1476, 0x6C38, 0x6C38, 0x1779, 0x6C3E, 0x6C3E, 0x1394,
+ 0x6C40, 0x6C40, 0x1A47, 0x6C41, 0x6C41, 0x1B11, 0x6C42, 0x6C42, 0x0F4F,
+ 0x6C4E, 0x6C4E, 0x1395, 0x6C50, 0x6C50, 0x1522, 0x6C55, 0x6C55, 0x14BB,
+ 0x6C57, 0x6C57, 0x1DD7, 0x6C5A, 0x6C5A, 0x17B4, 0x6C5D, 0x6C5D, 0x1732,
+ 0x6C5E, 0x6C5E, 0x1EAF, 0x6C5F, 0x6C5F, 0x0DD9, 0x6C60, 0x6C60, 0x1B2D,
+ 0x6C68, 0x6C68, 0x0EC8, 0x6C6A, 0x6C6A, 0x17F1, 0x6C6D, 0x6C6D, 0x1792,
+ 0x6C70, 0x6C70, 0x1D0D, 0x6C72, 0x6C72, 0x0FD7, 0x6C76, 0x6C76, 0x12E9,
+ 0x6C7A, 0x6C7A, 0x0E41, 0x6C7D, 0x6C7D, 0x0FFB, 0x6C7E, 0x6C7E, 0x142A,
+ 0x6C81, 0x6C81, 0x1685, 0x6C82, 0x6C82, 0x0FFC, 0x6C83, 0x6C83, 0x17BF,
+ 0x6C85, 0x6C85, 0x187B, 0x6C86, 0x6C86, 0x1DFF, 0x6C87, 0x6C87, 0x174D,
+ 0x6C88, 0x6C88, 0x1CCA, 0x6C8C, 0x6C8C, 0x10E4, 0x6C90, 0x6C90, 0x12B5,
+ 0x6C92, 0x6C92, 0x12BC, 0x6C93, 0x6C93, 0x108A, 0x6C94, 0x6C94, 0x1283,
+ 0x6C95, 0x6C95, 0x12F1, 0x6C96, 0x6C96, 0x1C8C, 0x6C99, 0x6C99, 0x1498,
+ 0x6C9A, 0x6C9A, 0x1B2E, 0x6C9B, 0x6C9B, 0x1D52, 0x6CAB, 0x6CAB, 0x1254,
+ 0x6CAE, 0x6CAE, 0x19C9, 0x6CB3, 0x6CB3, 0x1DC6, 0x6CB8, 0x6CB8, 0x1450,
+ 0x6CB9, 0x6CB9, 0x18BB, 0x6CBB, 0x6CBB, 0x1CAF, 0x6CBC, 0x6CBC, 0x1588,
+ 0x6CBD, 0x6CBD, 0x0EA1, 0x6CBE, 0x6CBE, 0x1C0B, 0x6CBF, 0x6CBF, 0x174E,
+ 0x6CC1, 0x6CC1, 0x1EEA, 0x6CC2, 0x6CC2, 0x1E60, 0x6CC4, 0x6CC4, 0x154D,
+ 0x6CC9, 0x6CC9, 0x1BF2, 0x6CCA, 0x6CCA, 0x131D, 0x6CCC, 0x6CCC, 0x1DB7,
+ 0x6CD3, 0x6CD3, 0x1EB0, 0x6CD5, 0x6CD5, 0x139A, 0x6CD7, 0x6CD7, 0x1499,
+ 0x6CDB, 0x6CDB, 0x1396, 0x6CE1, 0x6CE1, 0x1D84, 0x6CE2, 0x6CE2, 0x1D39,
+ 0x6CE3, 0x6CE3, 0x18F4, 0x6CE5, 0x6CE5, 0x105B, 0x6CE8, 0x6CE8, 0x1ADD,
+ 0x6CEB, 0x6CEB, 0x1E3B, 0x6CEE, 0x6CEE, 0x1332, 0x6CEF, 0x6CEF, 0x130E,
+ 0x6CF0, 0x6CF0, 0x1D0E, 0x6CF3, 0x6CF3, 0x177A, 0x6D0B, 0x6D0B, 0x1701,
+ 0x6D0C, 0x6D0C, 0x1180, 0x6D11, 0x6D11, 0x13C8, 0x6D17, 0x6D17, 0x1577,
+ 0x6D19, 0x6D19, 0x15D4, 0x6D1B, 0x6D1B, 0x111E, 0x6D1E, 0x6D1E, 0x10F4,
+ 0x6D25, 0x6D25, 0x1B4E, 0x6D27, 0x6D27, 0x18BC, 0x6D29, 0x6D29, 0x154E,
+ 0x6D2A, 0x6D2A, 0x1EB1, 0x6D32, 0x6D32, 0x1ADE, 0x6D35, 0x6D35, 0x1611,
+ 0x6D36, 0x6D36, 0x1F50, 0x6D38, 0x6D38, 0x0F05, 0x6D39, 0x6D39, 0x187C,
+ 0x6D3B, 0x6D3B, 0x1EDB, 0x6D3D, 0x6D3D, 0x1F60, 0x6D3E, 0x6D3E, 0x1D3A,
+ 0x6D41, 0x6D41, 0x11E5, 0x6D59, 0x6D59, 0x1A1F, 0x6D5A, 0x6D5A, 0x1AFE,
+ 0x6D5C, 0x6D5C, 0x146D, 0x6D63, 0x6D63, 0x17E0, 0x6D66, 0x6D66, 0x1D85,
+ 0x6D69, 0x6D69, 0x1E85, 0x6D6A, 0x6D6A, 0x113E, 0x6D6C, 0x6D6C, 0x120E,
+ 0x6D6E, 0x6D6E, 0x1407, 0x6D74, 0x6D74, 0x181A, 0x6D77, 0x6D77, 0x1E0E,
+ 0x6D78, 0x6D78, 0x1CCB, 0x6D79, 0x6D79, 0x1E54, 0x6D7F, 0x6D7F, 0x1D53,
+ 0x6D85, 0x6D85, 0x1762, 0x6D87, 0x6D87, 0x0E60, 0x6D88, 0x6D88, 0x1589,
+ 0x6D89, 0x6D89, 0x1560, 0x6D8C, 0x6D8C, 0x1828, 0x6D8D, 0x6D8D, 0x1F18,
+ 0x6D8E, 0x6D8E, 0x174F, 0x6D91, 0x6D91, 0x15A4, 0x6D93, 0x6D93, 0x1750,
+ 0x6D95, 0x6D95, 0x1C27, 0x6DAF, 0x6DAF, 0x16D6, 0x6DB2, 0x6DB2, 0x16DE,
+ 0x6DB5, 0x6DB5, 0x1DE9, 0x6DC0, 0x6DC0, 0x1A48, 0x6DC3, 0x6DC3, 0x0F89,
+ 0x6DC4, 0x6DC4, 0x1CB0, 0x6DC5, 0x6DC5, 0x1523, 0x6DC6, 0x6DC6, 0x1F19,
+ 0x6DC7, 0x6DC7, 0x0FFD, 0x6DCB, 0x6DCB, 0x1228, 0x6DCF, 0x6DCF, 0x1E86,
+ 0x6DD1, 0x6DD1, 0x1601, 0x6DD8, 0x6DD8, 0x10C0, 0x6DD9, 0x6DD9, 0x1ABB,
+ 0x6DDA, 0x6DDA, 0x11D8, 0x6DDE, 0x6DDE, 0x15B4, 0x6DE1, 0x6DE1, 0x107E,
+ 0x6DE8, 0x6DE8, 0x1A49, 0x6DEA, 0x6DEA, 0x11F5, 0x6DEB, 0x6DEB, 0x18EE,
+ 0x6DEE, 0x6DEE, 0x1F02, 0x6DF1, 0x6DF1, 0x1686, 0x6DF3, 0x6DF3, 0x1612,
+ 0x6DF5, 0x6DF5, 0x1751, 0x6DF7, 0x6DF7, 0x1EA6, 0x6DF8, 0x6DF8, 0x1C1F,
+ 0x6DF9, 0x6DF9, 0x172A, 0x6DFA, 0x6DFA, 0x1BF3, 0x6DFB, 0x6DFB, 0x1C0C,
+ 0x6E17, 0x6E17, 0x14CB, 0x6E19, 0x6E19, 0x1ED4, 0x6E1A, 0x6E1A, 0x19CA,
+ 0x6E1B, 0x6E1B, 0x0DC0, 0x6E1F, 0x6E1F, 0x1A4A, 0x6E20, 0x6E20, 0x0E09,
+ 0x6E21, 0x6E21, 0x10C1, 0x6E23, 0x6E23, 0x149A, 0x6E24, 0x6E24, 0x1345,
+ 0x6E25, 0x6E25, 0x16A9, 0x6E26, 0x6E26, 0x17D3, 0x6E2B, 0x6E2B, 0x154F,
+ 0x6E2C, 0x6E2C, 0x1CA6, 0x6E2D, 0x6E2D, 0x1896, 0x6E2F, 0x6E2F, 0x1E00,
+ 0x6E32, 0x6E32, 0x1533, 0x6E34, 0x6E34, 0x0DAF, 0x6E36, 0x6E36, 0x177B,
+ 0x6E38, 0x6E38, 0x18BD, 0x6E3A, 0x6E3A, 0x12C7, 0x6E3C, 0x6E3C, 0x12FC,
+ 0x6E3D, 0x6E3D, 0x19B2, 0x6E3E, 0x6E3E, 0x1EA7, 0x6E43, 0x6E43, 0x1370,
+ 0x6E44, 0x6E44, 0x12FD, 0x6E4A, 0x6E4A, 0x1ADF, 0x6E4D, 0x6E4D, 0x106B,
+ 0x6E56, 0x6E56, 0x1E87, 0x6E58, 0x6E58, 0x14E4, 0x6E5B, 0x6E5B, 0x107F,
+ 0x6E5C, 0x6E5C, 0x165F, 0x6E5E, 0x6E5E, 0x1A4B, 0x6E5F, 0x6E5F, 0x1EEB,
+ 0x6E67, 0x6E67, 0x1829, 0x6E6B, 0x6E6B, 0x1C67, 0x6E6E, 0x6E6E, 0x1935,
+ 0x6E6F, 0x6E6F, 0x1D05, 0x6E72, 0x6E72, 0x187D, 0x6E73, 0x6E73, 0x1034,
+ 0x6E7A, 0x6E7A, 0x13C9, 0x6E90, 0x6E90, 0x187E, 0x6E96, 0x6E96, 0x1AFF,
+ 0x6E9C, 0x6E9C, 0x11E6, 0x6E9D, 0x6E9D, 0x0F50, 0x6E9F, 0x6E9F, 0x1292,
+ 0x6EA2, 0x6EA2, 0x1941, 0x6EA5, 0x6EA5, 0x1408, 0x6EAA, 0x6EAA, 0x0E84,
+ 0x6EAB, 0x6EAB, 0x17C3, 0x6EAF, 0x6EAF, 0x158A, 0x6EB1, 0x6EB1, 0x1B4F,
+ 0x6EB6, 0x6EB6, 0x182A, 0x6EBA, 0x6EBA, 0x105D, 0x6EC2, 0x6EC2, 0x135B,
+ 0x6EC4, 0x6EC4, 0x1BC1, 0x6EC5, 0x6EC5, 0x128A, 0x6EC9, 0x6EC9, 0x1EEC,
+ 0x6ECB, 0x6ECB, 0x195D, 0x6ECC, 0x6ECC, 0x1BE6, 0x6ECE, 0x6ECE, 0x1E61,
+ 0x6ED1, 0x6ED1, 0x1EDC, 0x6ED3, 0x6ED3, 0x19B3, 0x6ED4, 0x6ED4, 0x10C2,
+ 0x6EEF, 0x6EEF, 0x1C28, 0x6EF4, 0x6EF4, 0x19E1, 0x6EF8, 0x6EF8, 0x1E88,
+ 0x6EFE, 0x6EFE, 0x0EC4, 0x6EFF, 0x6EFF, 0x1247, 0x6F01, 0x6F01, 0x1711,
+ 0x6F02, 0x6F02, 0x1D9E, 0x6F06, 0x6F06, 0x1CC6, 0x6F0F, 0x6F0F, 0x11D9,
+ 0x6F11, 0x6F11, 0x0DF2, 0x6F14, 0x6F14, 0x1752, 0x6F15, 0x6F15, 0x1A8F,
+ 0x6F20, 0x6F20, 0x123A, 0x6F22, 0x6F22, 0x1DD8, 0x6F23, 0x6F23, 0x1174,
+ 0x6F2B, 0x6F2B, 0x1248, 0x6F2C, 0x6F2C, 0x1B2F, 0x6F31, 0x6F31, 0x15D5,
+ 0x6F32, 0x6F32, 0x1BC2, 0x6F38, 0x6F38, 0x1A27, 0x6F3F, 0x6F3F, 0x1997,
+ 0x6F41, 0x6F41, 0x177C, 0x6F51, 0x6F51, 0x1346, 0x6F54, 0x6F54, 0x0E42,
+ 0x6F57, 0x6F57, 0x1B79, 0x6F58, 0x6F58, 0x1333, 0x6F5A, 0x6F5A, 0x1602,
+ 0x6F5B, 0x6F5B, 0x1981, 0x6F5E, 0x6F5E, 0x11A3, 0x6F5F, 0x6F5F, 0x1524,
+ 0x6F62, 0x6F62, 0x1EED, 0x6F64, 0x6F64, 0x18DA, 0x6F6D, 0x6F6D, 0x1080,
+ 0x6F6E, 0x6F6E, 0x1A90, 0x6F70, 0x6F70, 0x0F92, 0x6F7A, 0x6F7A, 0x197D,
+ 0x6F7C, 0x6F7C, 0x10F5, 0x6F7D, 0x6F7D, 0x13CA, 0x6F7E, 0x6F7E, 0x121F,
+ 0x6F81, 0x6F81, 0x14D0, 0x6F84, 0x6F84, 0x1B80, 0x6F88, 0x6F88, 0x1C04,
+ 0x6F8D, 0x6F8D, 0x1AE0, 0x6F8E, 0x6F8E, 0x1D5A, 0x6F90, 0x6F90, 0x1861,
+ 0x6F94, 0x6F94, 0x1E89, 0x6F97, 0x6F97, 0x0DA0, 0x6FA3, 0x6FA3, 0x1DD9,
+ 0x6FA4, 0x6FA4, 0x1D16, 0x6FA7, 0x6FA7, 0x119B, 0x6FAE, 0x6FAE, 0x1F03,
+ 0x6FAF, 0x6FAF, 0x1B97, 0x6FB1, 0x6FB1, 0x1A05, 0x6FB3, 0x6FB3, 0x17B5,
+ 0x6FB9, 0x6FB9, 0x1081, 0x6FBE, 0x6FBE, 0x1075, 0x6FC0, 0x6FC0, 0x0E31,
+ 0x6FC1, 0x6FC1, 0x1CEA, 0x6FC2, 0x6FC2, 0x1186, 0x6FC3, 0x6FC3, 0x104F,
+ 0x6FCA, 0x6FCA, 0x1793, 0x6FD5, 0x6FD5, 0x162D, 0x6FDA, 0x6FDA, 0x177D,
+ 0x6FDF, 0x6FDF, 0x1A70, 0x6FE0, 0x6FE0, 0x1E8A, 0x6FE1, 0x6FE1, 0x18BE,
+ 0x6FE4, 0x6FE4, 0x10C3, 0x6FE9, 0x6FE9, 0x1E8B, 0x6FEB, 0x6FEB, 0x1133,
+ 0x6FEC, 0x6FEC, 0x1B00, 0x6FEF, 0x6FEF, 0x1CEB, 0x6FF1, 0x6FF1, 0x146E,
+ 0x6FFE, 0x6FFE, 0x1161, 0x7001, 0x7001, 0x1702, 0x7005, 0x7005, 0x1E62,
+ 0x7006, 0x7006, 0x10D6, 0x7009, 0x7009, 0x149B, 0x700B, 0x700B, 0x1687,
+ 0x700F, 0x700F, 0x11E7, 0x7011, 0x7011, 0x1D96, 0x7015, 0x7015, 0x146F,
+ 0x7018, 0x7018, 0x11A4, 0x701A, 0x701A, 0x1DDA, 0x701B, 0x701B, 0x177E,
+ 0x701C, 0x701C, 0x18E2, 0x701D, 0x701D, 0x116D, 0x701E, 0x701E, 0x1A4C,
+ 0x701F, 0x701F, 0x158B, 0x7023, 0x7023, 0x1E0F, 0x7027, 0x7027, 0x11BB,
+ 0x7028, 0x7028, 0x11C0, 0x702F, 0x702F, 0x177F, 0x7037, 0x7037, 0x1925,
+ 0x703E, 0x703E, 0x1129, 0x704C, 0x704C, 0x0EF1, 0x7050, 0x7050, 0x1E63,
+ 0x7051, 0x7051, 0x15BA, 0x7058, 0x7058, 0x1CF6, 0x705D, 0x705D, 0x1E8C,
+ 0x7063, 0x7063, 0x1249, 0x706B, 0x706B, 0x1EBB, 0x7070, 0x7070, 0x1F04,
+ 0x7078, 0x7078, 0x0F51, 0x707C, 0x707C, 0x1972, 0x707D, 0x707D, 0x19B4,
+ 0x7085, 0x7085, 0x0E61, 0x708A, 0x708A, 0x1C99, 0x708E, 0x708E, 0x1767,
+ 0x7092, 0x7092, 0x1C38, 0x7098, 0x7098, 0x1F55, 0x7099, 0x7099, 0x195E,
+ 0x709A, 0x709A, 0x0F06, 0x70A1, 0x70A1, 0x1A4D, 0x70A4, 0x70A4, 0x158C,
+ 0x70AB, 0x70AB, 0x1E3C, 0x70AC, 0x70AC, 0x0E0A, 0x70AD, 0x70AD, 0x1CF7,
+ 0x70AF, 0x70AF, 0x1E64, 0x70B3, 0x70B3, 0x13BA, 0x70B7, 0x70B7, 0x1AE1,
+ 0x70B8, 0x70B8, 0x1973, 0x70B9, 0x70B9, 0x1A28, 0x70C8, 0x70C8, 0x1181,
+ 0x70CB, 0x70CB, 0x1F47, 0x70CF, 0x70CF, 0x17B6, 0x70D8, 0x70D8, 0x1EB2,
+ 0x70D9, 0x70D9, 0x111F, 0x70DD, 0x70DD, 0x1B17, 0x70DF, 0x70DF, 0x1753,
+ 0x70F1, 0x70F1, 0x0E62, 0x70F9, 0x70F9, 0x1D5B, 0x70FD, 0x70FD, 0x13EC,
+ 0x7104, 0x7104, 0x1F2F, 0x7109, 0x7109, 0x1720, 0x710C, 0x710C, 0x1B01,
+ 0x7119, 0x7119, 0x1371, 0x711A, 0x711A, 0x142B, 0x711E, 0x711E, 0x10E5,
+ 0x7121, 0x7121, 0x12D7, 0x7126, 0x7126, 0x1C39, 0x7130, 0x7130, 0x1768,
+ 0x7136, 0x7136, 0x1754, 0x7147, 0x7147, 0x1F41, 0x7149, 0x7149, 0x1175,
+ 0x714A, 0x714A, 0x1F38, 0x714C, 0x714C, 0x1EEE, 0x714E, 0x714E, 0x1A06,
+ 0x7150, 0x7150, 0x1780, 0x7156, 0x7156, 0x102D, 0x7159, 0x7159, 0x1755,
+ 0x715C, 0x715C, 0x185A, 0x715E, 0x715E, 0x14C6, 0x7164, 0x7164, 0x126C,
+ 0x7165, 0x7165, 0x1ED5, 0x7166, 0x7166, 0x1F28, 0x7167, 0x7167, 0x1A91,
+ 0x7169, 0x7169, 0x1386, 0x716C, 0x716C, 0x1703, 0x716E, 0x716E, 0x195F,
+ 0x717D, 0x717D, 0x1534, 0x7184, 0x7184, 0x1660, 0x7189, 0x7189, 0x1862,
+ 0x718A, 0x718A, 0x186D, 0x718F, 0x718F, 0x1F30, 0x7192, 0x7192, 0x1E65,
+ 0x7194, 0x7194, 0x182B, 0x7199, 0x7199, 0x1F70, 0x719F, 0x719F, 0x1603,
+ 0x71A2, 0x71A2, 0x13ED, 0x71AC, 0x71AC, 0x17B7, 0x71B1, 0x71B1, 0x1763,
+ 0x71B9, 0x71BA, 0x1F71, 0x71BE, 0x71BE, 0x1CB1, 0x71C1, 0x71C1, 0x1770,
+ 0x71C3, 0x71C3, 0x1756, 0x71C8, 0x71C8, 0x110F, 0x71C9, 0x71C9, 0x10E6,
+ 0x71CE, 0x71CE, 0x11CC, 0x71D0, 0x71D0, 0x1220, 0x71D2, 0x71D2, 0x158D,
+ 0x71D4, 0x71D4, 0x1387, 0x71D5, 0x71D5, 0x1757, 0x71DF, 0x71DF, 0x1781,
+ 0x71E5, 0x71E5, 0x1A92, 0x71E6, 0x71E6, 0x1B98, 0x71E7, 0x71E7, 0x15D6,
+ 0x71ED, 0x71ED, 0x1C4B, 0x71EE, 0x71EE, 0x1561, 0x71FB, 0x71FB, 0x1F31,
+ 0x71FC, 0x71FC, 0x1670, 0x71FE, 0x71FE, 0x10C4, 0x71FF, 0x71FF, 0x180A,
+ 0x7200, 0x7200, 0x1E33, 0x7206, 0x7206, 0x1D97, 0x7210, 0x7210, 0x11A5,
+ 0x721B, 0x721B, 0x112A, 0x722A, 0x722A, 0x1A93, 0x722C, 0x722C, 0x1D3B,
+ 0x722D, 0x722D, 0x19BB, 0x7230, 0x7230, 0x187F, 0x7232, 0x7232, 0x1897,
+ 0x7235, 0x7235, 0x1974, 0x7236, 0x7236, 0x1409, 0x723A, 0x723A, 0x16ED,
+ 0x723B, 0x723B, 0x1F1A, 0x723D, 0x723D, 0x14E5, 0x723E, 0x723E, 0x1916,
+ 0x7240, 0x7240, 0x14E6, 0x7246, 0x7246, 0x1998, 0x7247, 0x7247, 0x1D61,
+ 0x7248, 0x7248, 0x1D45, 0x724C, 0x724C, 0x1D54, 0x7252, 0x7252, 0x1C17,
+ 0x7258, 0x7258, 0x10D7, 0x7259, 0x7259, 0x1696, 0x725B, 0x725B, 0x1842,
+ 0x725D, 0x725D, 0x1470, 0x725F, 0x725F, 0x12A9, 0x7261, 0x7261, 0x12AA,
+ 0x7262, 0x7262, 0x11C1, 0x7267, 0x7267, 0x12B6, 0x7269, 0x7269, 0x12F2,
+ 0x7272, 0x7272, 0x14F9, 0x7279, 0x7279, 0x1D30, 0x727D, 0x727D, 0x0E36,
+ 0x7280, 0x7280, 0x150C, 0x7281, 0x7281, 0x120F, 0x72A2, 0x72A2, 0x10D8,
+ 0x72A7, 0x72A7, 0x1F73, 0x72AC, 0x72AC, 0x0E37, 0x72AF, 0x72AF, 0x1397,
+ 0x72C0, 0x72C0, 0x14E7, 0x72C2, 0x72C2, 0x0F07, 0x72C4, 0x72C4, 0x19E2,
+ 0x72CE, 0x72CE, 0x16C7, 0x72D0, 0x72D0, 0x1E8D, 0x72D7, 0x72D7, 0x0F52,
+ 0x72D9, 0x72D9, 0x19CB, 0x72E1, 0x72E1, 0x0F27, 0x72E9, 0x72E9, 0x15D7,
+ 0x72F8, 0x72F8, 0x1210, 0x72F9, 0x72F9, 0x1E55, 0x72FC, 0x72FC, 0x113F,
+ 0x72FD, 0x72FD, 0x1D55, 0x730A, 0x730A, 0x1794, 0x7316, 0x7316, 0x1BC3,
+ 0x731B, 0x731B, 0x1279, 0x731C, 0x731C, 0x164C, 0x731D, 0x731D, 0x1AB4,
+ 0x7325, 0x7325, 0x17FA, 0x7329, 0x7329, 0x156A, 0x732A, 0x732A, 0x19CC,
+ 0x732B, 0x732B, 0x12C8, 0x7336, 0x7337, 0x18BF, 0x733E, 0x733E, 0x1EDD,
+ 0x733F, 0x733F, 0x1880, 0x7344, 0x7344, 0x17C0, 0x7345, 0x7345, 0x149C,
+ 0x7350, 0x7350, 0x1999, 0x7352, 0x7352, 0x17B8, 0x7357, 0x7357, 0x0F8C,
+ 0x7368, 0x7368, 0x10D9, 0x736A, 0x736A, 0x1F05, 0x7370, 0x7370, 0x1782,
+ 0x7372, 0x7372, 0x1F0D, 0x7375, 0x7375, 0x1188, 0x7378, 0x7378, 0x15D8,
+ 0x737A, 0x737A, 0x1076, 0x737B, 0x737B, 0x1E2D, 0x7384, 0x7384, 0x1E3D,
+ 0x7386, 0x7386, 0x1960, 0x7387, 0x7387, 0x15B0, 0x7389, 0x7389, 0x17C1,
+ 0x738B, 0x738B, 0x17F2, 0x738E, 0x738E, 0x1A4E, 0x7394, 0x7394, 0x1BF4,
+ 0x7396, 0x7396, 0x0F53, 0x7397, 0x7397, 0x1843, 0x7398, 0x7398, 0x0FFE,
+ 0x739F, 0x739F, 0x130F, 0x73A7, 0x73A7, 0x18DB, 0x73A9, 0x73A9, 0x17E1,
+ 0x73AD, 0x73AD, 0x1471, 0x73B2, 0x73B2, 0x118F, 0x73B3, 0x73B3, 0x10A4,
+ 0x73B9, 0x73B9, 0x1E3E, 0x73C0, 0x73C0, 0x131E, 0x73C2, 0x73C2, 0x0D7C,
+ 0x73C9, 0x73C9, 0x1310, 0x73CA, 0x73CA, 0x14BC, 0x73CC, 0x73CC, 0x1DB8,
+ 0x73CD, 0x73CD, 0x1B50, 0x73CF, 0x73CF, 0x0D8F, 0x73D6, 0x73D6, 0x0F08,
+ 0x73D9, 0x73D9, 0x0ED5, 0x73DD, 0x73DD, 0x1F29, 0x73DE, 0x73DE, 0x1120,
+ 0x73E0, 0x73E0, 0x1AE2, 0x73E3, 0x73E3, 0x1613, 0x73E4, 0x73E4, 0x13CB,
+ 0x73E5, 0x73E5, 0x1917, 0x73E6, 0x73E6, 0x1E21, 0x73E9, 0x73E9, 0x1E66,
+ 0x73EA, 0x73EA, 0x0F9F, 0x73ED, 0x73ED, 0x1334, 0x73F7, 0x73F7, 0x12D8,
+ 0x73F9, 0x73F9, 0x156B, 0x73FD, 0x73FD, 0x1A4F, 0x73FE, 0x73FE, 0x1E3F,
+ 0x7401, 0x7401, 0x1535, 0x7403, 0x7403, 0x0F54, 0x7405, 0x7405, 0x1140,
+ 0x7406, 0x7406, 0x1211, 0x7407, 0x7407, 0x15D9, 0x7409, 0x7409, 0x11E8,
+ 0x7413, 0x7413, 0x17E2, 0x741B, 0x741B, 0x1CCC, 0x7420, 0x7420, 0x1A07,
+ 0x7421, 0x7421, 0x1604, 0x7422, 0x7422, 0x1CEC, 0x7425, 0x7425, 0x1E8E,
+ 0x7426, 0x7426, 0x0FFF, 0x7428, 0x7428, 0x0EC5, 0x742A, 0x742A, 0x1000,
+ 0x742B, 0x742B, 0x13EE, 0x742C, 0x742C, 0x17E3, 0x742E, 0x742E, 0x1ABC,
+ 0x742F, 0x742F, 0x0EF2, 0x7430, 0x7430, 0x1769, 0x7433, 0x7433, 0x1229,
+ 0x7434, 0x7434, 0x0FCB, 0x7435, 0x7435, 0x1451, 0x7436, 0x7436, 0x1D3C,
+ 0x7438, 0x7438, 0x1CED, 0x743A, 0x743A, 0x139B, 0x743F, 0x743F, 0x1EA8,
+ 0x7440, 0x7440, 0x1844, 0x7441, 0x7441, 0x12AB, 0x7443, 0x7443, 0x1C86,
+ 0x7444, 0x7444, 0x1536, 0x744B, 0x744B, 0x1898, 0x7455, 0x7455, 0x1DC7,
+ 0x7457, 0x7457, 0x1881, 0x7459, 0x7459, 0x104D, 0x745A, 0x745A, 0x1E8F,
+ 0x745B, 0x745B, 0x1783, 0x745C, 0x745C, 0x18C1, 0x745E, 0x745E, 0x150D,
+ 0x745F, 0x745F, 0x162A, 0x7460, 0x7460, 0x11E9, 0x7462, 0x7462, 0x182C,
+ 0x7464, 0x7464, 0x180B, 0x7465, 0x7465, 0x17C4, 0x7468, 0x7468, 0x1B51,
+ 0x7469, 0x7469, 0x1E67, 0x746A, 0x746A, 0x1231, 0x746F, 0x746F, 0x1141,
+ 0x747E, 0x747E, 0x0FBE, 0x7482, 0x7482, 0x1001, 0x7483, 0x7483, 0x1212,
+ 0x7487, 0x7487, 0x1537, 0x7489, 0x7489, 0x1176, 0x748B, 0x748B, 0x199A,
+ 0x7498, 0x7498, 0x1221, 0x749C, 0x749C, 0x1EEF, 0x749E, 0x749E, 0x131F,
+ 0x749F, 0x749F, 0x0E63, 0x74A1, 0x74A1, 0x1B52, 0x74A3, 0x74A3, 0x1002,
+ 0x74A5, 0x74A5, 0x0E64, 0x74A7, 0x74A7, 0x13A1, 0x74A8, 0x74A8, 0x1B99,
+ 0x74AA, 0x74AA, 0x1A94, 0x74B0, 0x74B0, 0x1ED6, 0x74B2, 0x74B2, 0x15DA,
+ 0x74B5, 0x74B5, 0x1733, 0x74B9, 0x74B9, 0x1605, 0x74BD, 0x74BD, 0x14F3,
+ 0x74BF, 0x74BF, 0x1538, 0x74C6, 0x74C6, 0x1B6D, 0x74CA, 0x74CA, 0x0E65,
+ 0x74CF, 0x74CF, 0x11BC, 0x74D4, 0x74D4, 0x1784, 0x74D8, 0x74D8, 0x0EF3,
+ 0x74DA, 0x74DA, 0x1B9A, 0x74DC, 0x74DC, 0x0EDE, 0x74E0, 0x74E0, 0x1E90,
+ 0x74E2, 0x74E2, 0x1D9F, 0x74E3, 0x74E3, 0x1D46, 0x74E6, 0x74E6, 0x17D4,
+ 0x74EE, 0x74EE, 0x17CC, 0x74F7, 0x74F7, 0x1961, 0x7501, 0x7501, 0x13BB,
+ 0x7504, 0x7504, 0x0E38, 0x7511, 0x7511, 0x1B18, 0x7515, 0x7515, 0x17CD,
+ 0x7518, 0x7518, 0x0DC1, 0x751A, 0x751A, 0x1688, 0x751B, 0x751B, 0x1C0D,
+ 0x751F, 0x751F, 0x14FA, 0x7523, 0x7523, 0x14BD, 0x7525, 0x7525, 0x14FB,
+ 0x7526, 0x7526, 0x158E, 0x7528, 0x7528, 0x182D, 0x752B, 0x752B, 0x13CC,
+ 0x752C, 0x752C, 0x182E, 0x7530, 0x7530, 0x1A08, 0x7531, 0x7531, 0x18C2,
+ 0x7532, 0x7532, 0x0DCC, 0x7533, 0x7533, 0x1671, 0x7537, 0x7537, 0x1035,
+ 0x7538, 0x7538, 0x1A09, 0x753A, 0x753A, 0x1A50, 0x7547, 0x7547, 0x0FAB,
+ 0x754C, 0x754C, 0x0E85, 0x754F, 0x754F, 0x17FB, 0x7551, 0x7551, 0x1A0A,
+ 0x7553, 0x7553, 0x108B, 0x7554, 0x7554, 0x1335, 0x7559, 0x7559, 0x11EA,
+ 0x755B, 0x755B, 0x1B53, 0x755C, 0x755C, 0x1C79, 0x755D, 0x755D, 0x12D9,
+ 0x7562, 0x7562, 0x1DB9, 0x7565, 0x7565, 0x114A, 0x7566, 0x7566, 0x1F48,
+ 0x756A, 0x756A, 0x1388, 0x756F, 0x756F, 0x1B02, 0x7570, 0x7570, 0x1918,
+ 0x7575, 0x7575, 0x1EBC, 0x7576, 0x7576, 0x1096, 0x7578, 0x7578, 0x1003,
+ 0x757A, 0x757A, 0x0DDA, 0x757F, 0x757F, 0x1004, 0x7586, 0x7586, 0x0DDB,
+ 0x7587, 0x7587, 0x1AE3, 0x758A, 0x758A, 0x1C18, 0x758B, 0x758B, 0x1DBA,
+ 0x758E, 0x758E, 0x1590, 0x758F, 0x758F, 0x158F, 0x7591, 0x7591, 0x1903,
+ 0x759D, 0x759D, 0x14BE, 0x75A5, 0x75A5, 0x0DF3, 0x75AB, 0x75AB, 0x173F,
+ 0x75B1, 0x75B1, 0x1D86, 0x75B2, 0x75B2, 0x1DAF, 0x75B3, 0x75B3, 0x0DC2,
+ 0x75B5, 0x75B5, 0x1962, 0x75B8, 0x75B8, 0x1077, 0x75B9, 0x75B9, 0x1B54,
+ 0x75BC, 0x75BC, 0x10F6, 0x75BD, 0x75BD, 0x19CD, 0x75BE, 0x75BE, 0x1B6E,
+ 0x75C2, 0x75C2, 0x0D7D, 0x75C5, 0x75C5, 0x13BC, 0x75C7, 0x75C7, 0x1B19,
+ 0x75CD, 0x75CD, 0x1919, 0x75D2, 0x75D2, 0x1704, 0x75D4, 0x75D4, 0x1CB2,
+ 0x75D5, 0x75D5, 0x1F56, 0x75D8, 0x75D8, 0x1100, 0x75D9, 0x75D9, 0x0E66,
+ 0x75DB, 0x75DB, 0x1D1F, 0x75E2, 0x75E2, 0x1213, 0x75F0, 0x75F0, 0x1082,
+ 0x75F2, 0x75F2, 0x1232, 0x75F4, 0x75F4, 0x1CB3, 0x75FA, 0x75FA, 0x1452,
+ 0x75FC, 0x75FC, 0x0EA2, 0x7600, 0x7600, 0x1712, 0x760D, 0x760D, 0x1705,
+ 0x7619, 0x7619, 0x1591, 0x761F, 0x761F, 0x17C5, 0x7620, 0x7620, 0x1BE7,
+ 0x7621, 0x7621, 0x1BC4, 0x7622, 0x7622, 0x1336, 0x7624, 0x7624, 0x11EB,
+ 0x7626, 0x7626, 0x15DB, 0x763B, 0x763B, 0x11DA, 0x7642, 0x7642, 0x11CD,
+ 0x764C, 0x764C, 0x16C2, 0x764E, 0x764E, 0x0DA1, 0x7652, 0x7652, 0x18C3,
+ 0x7656, 0x7656, 0x13A2, 0x7661, 0x7661, 0x1CB4, 0x7664, 0x7664, 0x1A20,
+ 0x7669, 0x7669, 0x1118, 0x766C, 0x766C, 0x1539, 0x7670, 0x7670, 0x17CE,
+ 0x7672, 0x7672, 0x1A0B, 0x7678, 0x7678, 0x0E86, 0x767B, 0x767B, 0x1110,
+ 0x767C, 0x767C, 0x1347, 0x767D, 0x767E, 0x1381, 0x7684, 0x7684, 0x19E3,
+ 0x7686, 0x7686, 0x0DF4, 0x7687, 0x7687, 0x1EF0, 0x768E, 0x768E, 0x0F28,
+ 0x7690, 0x7690, 0x0EA3, 0x7693, 0x7693, 0x1E91, 0x76AE, 0x76AE, 0x1DB0,
+ 0x76BA, 0x76BA, 0x1C68, 0x76BF, 0x76BF, 0x1293, 0x76C2, 0x76C2, 0x1845,
+ 0x76C3, 0x76C3, 0x1372, 0x76C6, 0x76C6, 0x142C, 0x76C8, 0x76C8, 0x1785,
+ 0x76CA, 0x76CA, 0x1926, 0x76D2, 0x76D2, 0x1DF1, 0x76D6, 0x76D6, 0x0DF5,
+ 0x76DB, 0x76DB, 0x156C, 0x76DC, 0x76DC, 0x10C5, 0x76DE, 0x76DE, 0x197E,
+ 0x76DF, 0x76DF, 0x127B, 0x76E1, 0x76E1, 0x1B55, 0x76E3, 0x76E3, 0x0DC3,
+ 0x76E4, 0x76E4, 0x1337, 0x76E7, 0x76E7, 0x11A6, 0x76EE, 0x76EE, 0x12B7,
+ 0x76F2, 0x76F2, 0x127A, 0x76F4, 0x76F4, 0x1B3F, 0x76F8, 0x76F8, 0x14E8,
+ 0x76FC, 0x76FC, 0x1338, 0x76FE, 0x76FE, 0x1614, 0x7701, 0x7701, 0x156D,
+ 0x7704, 0x7704, 0x1284, 0x7708, 0x7708, 0x1CFD, 0x7709, 0x7709, 0x12FE,
+ 0x770B, 0x770B, 0x0DA2, 0x771E, 0x771E, 0x1B56, 0x7720, 0x7720, 0x1285,
+ 0x7729, 0x7729, 0x1E40, 0x7737, 0x7737, 0x0F8A, 0x7738, 0x7738, 0x12AC,
+ 0x773A, 0x773A, 0x1A95, 0x773C, 0x773C, 0x16B4, 0x7740, 0x7740, 0x1B91,
+ 0x774D, 0x774D, 0x1E41, 0x775B, 0x775B, 0x1A51, 0x7761, 0x7761, 0x15DC,
+ 0x7763, 0x7763, 0x10DA, 0x7766, 0x7766, 0x12B8, 0x776B, 0x776B, 0x1C19,
+ 0x7779, 0x7779, 0x10C6, 0x777E, 0x777E, 0x0EA4, 0x777F, 0x777F, 0x1795,
+ 0x778B, 0x778B, 0x1B57, 0x7791, 0x7791, 0x1294, 0x779E, 0x779E, 0x124A,
+ 0x77A5, 0x77A5, 0x13AE, 0x77AC, 0x77AC, 0x1615, 0x77AD, 0x77AD, 0x11CE,
+ 0x77B0, 0x77B0, 0x0DC4, 0x77B3, 0x77B3, 0x10F7, 0x77BB, 0x77BB, 0x1C0E,
+ 0x77BC, 0x77BC, 0x0E25, 0x77BF, 0x77BF, 0x0F55, 0x77D7, 0x77D7, 0x1C4C,
+ 0x77DB, 0x77DB, 0x12AD, 0x77DC, 0x77DC, 0x0FDC, 0x77E2, 0x77E2, 0x164D,
+ 0x77E3, 0x77E3, 0x1904, 0x77E5, 0x77E5, 0x1B30, 0x77E9, 0x77E9, 0x0F56,
+ 0x77ED, 0x77ED, 0x106C, 0x77EE, 0x77EE, 0x17F6, 0x77EF, 0x77EF, 0x0F29,
+ 0x77F3, 0x77F3, 0x1525, 0x7802, 0x7802, 0x149D, 0x7812, 0x7812, 0x1453,
+ 0x7825, 0x7825, 0x1B31, 0x7826, 0x7826, 0x1BD0, 0x7827, 0x7827, 0x1CCD,
+ 0x782C, 0x782C, 0x122C, 0x7832, 0x7832, 0x1D87, 0x7834, 0x7834, 0x1D3D,
+ 0x7845, 0x7845, 0x0FA0, 0x784F, 0x784F, 0x1758, 0x785D, 0x785D, 0x1C3A,
+ 0x786B, 0x786B, 0x11EC, 0x786C, 0x786C, 0x0E67, 0x786F, 0x786F, 0x1759,
+ 0x787C, 0x787C, 0x143A, 0x7881, 0x7881, 0x1005, 0x7887, 0x7887, 0x1A52,
+ 0x788C, 0x788C, 0x11B0, 0x788D, 0x788D, 0x16D7, 0x788E, 0x788E, 0x15BB,
+ 0x7891, 0x7891, 0x1454, 0x7897, 0x7897, 0x17E4, 0x78A3, 0x78A3, 0x0DB0,
+ 0x78A7, 0x78A7, 0x13A3, 0x78A9, 0x78A9, 0x1526, 0x78BA, 0x78BB, 0x1EC7,
+ 0x78BC, 0x78BC, 0x1233, 0x78C1, 0x78C1, 0x1963, 0x78C5, 0x78C5, 0x135C,
+ 0x78CA, 0x78CA, 0x11C2, 0x78CB, 0x78CB, 0x1B8A, 0x78CE, 0x78CE, 0x0E87,
+ 0x78D0, 0x78D0, 0x1339, 0x78E8, 0x78E8, 0x1234, 0x78EC, 0x78EC, 0x0E68,
+ 0x78EF, 0x78EF, 0x1006, 0x78F5, 0x78F5, 0x0DA3, 0x78FB, 0x78FB, 0x133A,
+ 0x7901, 0x7901, 0x1C3B, 0x790E, 0x790E, 0x1C3C, 0x7916, 0x7916, 0x1734,
+ 0x792A, 0x792A, 0x1162, 0x792B, 0x792B, 0x116E, 0x792C, 0x792C, 0x133B,
+ 0x793A, 0x793A, 0x164E, 0x793E, 0x793E, 0x149E, 0x7940, 0x7940, 0x149F,
+ 0x7941, 0x7941, 0x1007, 0x7947, 0x7948, 0x1008, 0x7949, 0x7949, 0x1B32,
+ 0x7950, 0x7950, 0x1846, 0x7956, 0x7956, 0x1A96, 0x7957, 0x7957, 0x1B33,
+ 0x795A, 0x795A, 0x1A97, 0x795B, 0x795B, 0x0E0B, 0x795C, 0x795C, 0x1E92,
+ 0x795D, 0x795D, 0x1C7A, 0x795E, 0x795E, 0x1672, 0x7960, 0x7960, 0x14A0,
+ 0x7965, 0x7965, 0x14E9, 0x7968, 0x7968, 0x1DA0, 0x796D, 0x796D, 0x1A71,
+ 0x797A, 0x797A, 0x100A, 0x797F, 0x797F, 0x11B1, 0x7981, 0x7981, 0x0FCC,
+ 0x798D, 0x798D, 0x1EBD, 0x798E, 0x798E, 0x1A53, 0x798F, 0x798F, 0x13D9,
+ 0x7991, 0x7991, 0x1847, 0x79A6, 0x79A6, 0x1713, 0x79A7, 0x79A7, 0x1F74,
+ 0x79AA, 0x79AA, 0x153A, 0x79AE, 0x79AE, 0x119C, 0x79B1, 0x79B1, 0x10C7,
+ 0x79B3, 0x79B3, 0x1706, 0x79B9, 0x79B9, 0x1848, 0x79BD, 0x79BD, 0x0FCD,
+ 0x79BE, 0x79BE, 0x1EBE, 0x79BF, 0x79BF, 0x10DB, 0x79C0, 0x79C0, 0x15DD,
+ 0x79C1, 0x79C1, 0x14A1, 0x79C9, 0x79C9, 0x13BD, 0x79CA, 0x79CA, 0x1042,
+ 0x79CB, 0x79CB, 0x1C69, 0x79D1, 0x79D1, 0x0EDF, 0x79D2, 0x79D2, 0x1C3D,
+ 0x79D5, 0x79D5, 0x1455, 0x79D8, 0x79D8, 0x1456, 0x79DF, 0x79DF, 0x1A98,
+ 0x79E4, 0x79E4, 0x1CD1, 0x79E6, 0x79E6, 0x1B58, 0x79E7, 0x79E7, 0x16CE,
+ 0x79E9, 0x79E9, 0x1B6F, 0x79FB, 0x79FB, 0x191A, 0x7A00, 0x7A00, 0x1F75,
+ 0x7A05, 0x7A05, 0x1578, 0x7A08, 0x7A08, 0x0DA4, 0x7A0B, 0x7A0B, 0x1A54,
+ 0x7A0D, 0x7A0D, 0x1C3E, 0x7A14, 0x7A14, 0x194A, 0x7A17, 0x7A17, 0x1D56,
+ 0x7A19, 0x7A19, 0x1B40, 0x7A1A, 0x7A1A, 0x1CB5, 0x7A1C, 0x7A1C, 0x1201,
+ 0x7A1F, 0x7A1F, 0x1DA7, 0x7A20, 0x7A20, 0x1A99, 0x7A2E, 0x7A2E, 0x1ABD,
+ 0x7A31, 0x7A31, 0x1CD2, 0x7A36, 0x7A36, 0x185B, 0x7A37, 0x7A37, 0x1B41,
+ 0x7A3B, 0x7A3B, 0x10C8, 0x7A3C, 0x7A3C, 0x0D7E, 0x7A3D, 0x7A3D, 0x0E88,
+ 0x7A3F, 0x7A3F, 0x0EA5, 0x7A40, 0x7A40, 0x0EBB, 0x7A46, 0x7A46, 0x12B9,
+ 0x7A49, 0x7A49, 0x1CB6, 0x7A4D, 0x7A4D, 0x19E4, 0x7A4E, 0x7A4E, 0x1786,
+ 0x7A57, 0x7A57, 0x15DE, 0x7A61, 0x7A61, 0x14F6, 0x7A62, 0x7A62, 0x1796,
+ 0x7A69, 0x7A69, 0x17C6, 0x7A6B, 0x7A6B, 0x1EC9, 0x7A70, 0x7A70, 0x1707,
+ 0x7A74, 0x7A74, 0x1E4B, 0x7A76, 0x7A76, 0x0F57, 0x7A79, 0x7A79, 0x0F7D,
+ 0x7A7A, 0x7A7A, 0x0ED6, 0x7A7D, 0x7A7D, 0x1A55, 0x7A7F, 0x7A7F, 0x1BF5,
+ 0x7A81, 0x7A81, 0x10EA, 0x7A84, 0x7A84, 0x1B92, 0x7A88, 0x7A88, 0x180C,
+ 0x7A92, 0x7A92, 0x1B70, 0x7A93, 0x7A93, 0x1BC5, 0x7A95, 0x7A95, 0x1A9A,
+ 0x7A98, 0x7A98, 0x0F72, 0x7A9F, 0x7A9F, 0x0F7A, 0x7AA9, 0x7AAA, 0x17D5,
+ 0x7AAE, 0x7AAE, 0x0F7E, 0x7AAF, 0x7AAF, 0x180D, 0x7ABA, 0x7ABA, 0x0FA1,
+ 0x7AC4, 0x7AC4, 0x1B9B, 0x7AC5, 0x7AC5, 0x0FA2, 0x7AC7, 0x7AC7, 0x1101,
+ 0x7ACA, 0x7ACA, 0x1A21, 0x7ACB, 0x7ACB, 0x122D, 0x7AD7, 0x7AD7, 0x12C9,
+ 0x7AD9, 0x7AD9, 0x1BB1, 0x7ADD, 0x7ADD, 0x13BE, 0x7ADF, 0x7ADF, 0x0E69,
+ 0x7AE0, 0x7AE0, 0x199B, 0x7AE3, 0x7AE3, 0x1B03, 0x7AE5, 0x7AE5, 0x10F8,
+ 0x7AEA, 0x7AEA, 0x15DF, 0x7AED, 0x7AED, 0x0DB1, 0x7AEF, 0x7AEF, 0x106D,
+ 0x7AF6, 0x7AF6, 0x0E6A, 0x7AF9, 0x7AF9, 0x1AF4, 0x7AFA, 0x7AFA, 0x1C7B,
+ 0x7AFF, 0x7AFF, 0x0DA5, 0x7B0F, 0x7B0F, 0x1EAC, 0x7B11, 0x7B11, 0x1592,
+ 0x7B19, 0x7B19, 0x14FC, 0x7B1B, 0x7B1B, 0x19E5, 0x7B1E, 0x7B1E, 0x1D0F,
+ 0x7B20, 0x7B20, 0x122E, 0x7B26, 0x7B26, 0x140A, 0x7B2C, 0x7B2C, 0x1A72,
+ 0x7B2D, 0x7B2D, 0x1190, 0x7B39, 0x7B39, 0x1579, 0x7B46, 0x7B46, 0x1DBB,
+ 0x7B49, 0x7B49, 0x1111, 0x7B4B, 0x7B4B, 0x0FBF, 0x7B4C, 0x7B4C, 0x1A0C,
+ 0x7B4D, 0x7B4D, 0x1616, 0x7B4F, 0x7B4F, 0x138E, 0x7B50, 0x7B50, 0x0F09,
+ 0x7B51, 0x7B51, 0x1C7C, 0x7B52, 0x7B52, 0x1D20, 0x7B54, 0x7B54, 0x108C,
+ 0x7B56, 0x7B56, 0x1BD8, 0x7B60, 0x7B60, 0x0FAC, 0x7B6C, 0x7B6C, 0x156E,
+ 0x7B6E, 0x7B6E, 0x150E, 0x7B75, 0x7B75, 0x175A, 0x7B7D, 0x7B7D, 0x17B9,
+ 0x7B87, 0x7B87, 0x0DF6, 0x7B8B, 0x7B8B, 0x1A0D, 0x7B8F, 0x7B8F, 0x19BC,
+ 0x7B94, 0x7B94, 0x1320, 0x7B95, 0x7B95, 0x100B, 0x7B97, 0x7B97, 0x14BF,
+ 0x7B9A, 0x7B9A, 0x1B8B, 0x7B9D, 0x7B9D, 0x0E48, 0x7BA1, 0x7BA1, 0x0EF4,
+ 0x7BAD, 0x7BAD, 0x1A0E, 0x7BB1, 0x7BB1, 0x14EA, 0x7BB4, 0x7BB4, 0x1982,
+ 0x7BB8, 0x7BB8, 0x19CE, 0x7BC0, 0x7BC0, 0x1A22, 0x7BC1, 0x7BC1, 0x1EF1,
+ 0x7BC4, 0x7BC4, 0x1398, 0x7BC6, 0x7BC6, 0x1A0F, 0x7BC7, 0x7BC7, 0x1D62,
+ 0x7BC9, 0x7BC9, 0x1C7D, 0x7BD2, 0x7BD2, 0x1661, 0x7BE0, 0x7BE0, 0x1593,
+ 0x7BE4, 0x7BE4, 0x10DC, 0x7BE9, 0x7BE9, 0x14A2, 0x7C07, 0x7C07, 0x1AAD,
+ 0x7C12, 0x7C12, 0x1B9C, 0x7C1E, 0x7C1E, 0x106E, 0x7C21, 0x7C21, 0x0DA6,
+ 0x7C27, 0x7C27, 0x1EF2, 0x7C2A, 0x7C2A, 0x1983, 0x7C2B, 0x7C2B, 0x1594,
+ 0x7C3D, 0x7C3D, 0x1C0F, 0x7C3E, 0x7C3E, 0x1187, 0x7C3F, 0x7C3F, 0x140B,
+ 0x7C43, 0x7C43, 0x1134, 0x7C4C, 0x7C4C, 0x1AE4, 0x7C4D, 0x7C4D, 0x19E6,
+ 0x7C60, 0x7C60, 0x11BD, 0x7C64, 0x7C64, 0x1C10, 0x7C6C, 0x7C6C, 0x1214,
+ 0x7C73, 0x7C73, 0x12FF, 0x7C83, 0x7C83, 0x1457, 0x7C89, 0x7C89, 0x142D,
+ 0x7C92, 0x7C92, 0x122F, 0x7C95, 0x7C95, 0x1321, 0x7C97, 0x7C97, 0x1A9B,
+ 0x7C98, 0x7C98, 0x1A29, 0x7C9F, 0x7C9F, 0x15A5, 0x7CA5, 0x7CA5, 0x1AF5,
+ 0x7CA7, 0x7CA7, 0x199C, 0x7CAE, 0x7CAE, 0x1151, 0x7CB1, 0x7CB1, 0x1152,
+ 0x7CB2, 0x7CB2, 0x1B9E, 0x7CB3, 0x7CB3, 0x0DFE, 0x7CB9, 0x7CB9, 0x15E0,
+ 0x7CBE, 0x7CBE, 0x1A56, 0x7CCA, 0x7CCA, 0x1E93, 0x7CD6, 0x7CD6, 0x1097,
+ 0x7CDE, 0x7CDE, 0x142E, 0x7CDF, 0x7CDF, 0x1A9C, 0x7CE0, 0x7CE0, 0x0DDC,
+ 0x7CE7, 0x7CE7, 0x1153, 0x7CFB, 0x7CFB, 0x0E89, 0x7CFE, 0x7CFE, 0x0FA3,
+ 0x7D00, 0x7D00, 0x100C, 0x7D02, 0x7D02, 0x1AE5, 0x7D04, 0x7D04, 0x16F1,
+ 0x7D05, 0x7D05, 0x1EB3, 0x7D06, 0x7D06, 0x1849, 0x7D07, 0x7D07, 0x1F59,
+ 0x7D08, 0x7D08, 0x1ED7, 0x7D0A, 0x7D0B, 0x12EA, 0x7D0D, 0x7D0D, 0x1036,
+ 0x7D10, 0x7D10, 0x1058, 0x7D14, 0x7D14, 0x1617, 0x7D17, 0x7D17, 0x14A3,
+ 0x7D18, 0x7D18, 0x0F19, 0x7D19, 0x7D19, 0x1B34, 0x7D1A, 0x7D1A, 0x0FD8,
+ 0x7D1B, 0x7D1B, 0x142F, 0x7D20, 0x7D20, 0x1595, 0x7D21, 0x7D21, 0x135D,
+ 0x7D22, 0x7D22, 0x14F7, 0x7D2B, 0x7D2B, 0x1964, 0x7D2C, 0x7D2C, 0x1AE6,
+ 0x7D2E, 0x7D2E, 0x1BA9, 0x7D2F, 0x7D2F, 0x11DB, 0x7D30, 0x7D30, 0x157A,
+ 0x7D33, 0x7D33, 0x1673, 0x7D35, 0x7D35, 0x19CF, 0x7D39, 0x7D39, 0x1596,
+ 0x7D3A, 0x7D3A, 0x0DC5, 0x7D42, 0x7D42, 0x1ABE, 0x7D43, 0x7D43, 0x1E42,
+ 0x7D44, 0x7D44, 0x1A9D, 0x7D45, 0x7D45, 0x0E6B, 0x7D46, 0x7D46, 0x133C,
+ 0x7D50, 0x7D50, 0x0E43, 0x7D5E, 0x7D5E, 0x0F2A, 0x7D61, 0x7D61, 0x1121,
+ 0x7D62, 0x7D62, 0x1E43, 0x7D66, 0x7D66, 0x0FD9, 0x7D68, 0x7D68, 0x18E3,
+ 0x7D6A, 0x7D6A, 0x1936, 0x7D6E, 0x7D6E, 0x150F, 0x7D71, 0x7D71, 0x1D21,
+ 0x7D72, 0x7D72, 0x14A4, 0x7D73, 0x7D73, 0x0DDD, 0x7D76, 0x7D76, 0x1A23,
+ 0x7D79, 0x7D79, 0x0E39, 0x7D7F, 0x7D7F, 0x0F58, 0x7D8E, 0x7D8E, 0x1A57,
+ 0x7D8F, 0x7D8F, 0x15E1, 0x7D93, 0x7D93, 0x0E6C, 0x7D9C, 0x7D9C, 0x1ABF,
+ 0x7DA0, 0x7DA0, 0x11B2, 0x7DA2, 0x7DA2, 0x1AE7, 0x7DAC, 0x7DAC, 0x15E2,
+ 0x7DAD, 0x7DAD, 0x18C4, 0x7DB1, 0x7DB1, 0x0DDE, 0x7DB2, 0x7DB2, 0x125D,
+ 0x7DB4, 0x7DB4, 0x1C05, 0x7DB5, 0x7DB5, 0x1BD1, 0x7DB8, 0x7DB8, 0x11F6,
+ 0x7DBA, 0x7DBA, 0x100D, 0x7DBB, 0x7DBB, 0x1CF8, 0x7DBD, 0x7DBD, 0x1975,
+ 0x7DBE, 0x7DBE, 0x1202, 0x7DBF, 0x7DBF, 0x1286, 0x7DC7, 0x7DC7, 0x1CB7,
+ 0x7DCA, 0x7DCA, 0x101E, 0x7DCB, 0x7DCB, 0x1458, 0x7DD6, 0x7DD6, 0x1510,
+ 0x7DD8, 0x7DD8, 0x1DEA, 0x7DDA, 0x7DDA, 0x153B, 0x7DDD, 0x7DDD, 0x1B7A,
+ 0x7DDE, 0x7DDE, 0x106F, 0x7DE0, 0x7DE0, 0x1C29, 0x7DE1, 0x7DE1, 0x1311,
+ 0x7DE3, 0x7DE3, 0x175B, 0x7DE8, 0x7DE8, 0x1D63, 0x7DE9, 0x7DE9, 0x17E5,
+ 0x7DEC, 0x7DEC, 0x1287, 0x7DEF, 0x7DEF, 0x1899, 0x7DF4, 0x7DF4, 0x1177,
+ 0x7DFB, 0x7DFB, 0x1CB8, 0x7E09, 0x7E09, 0x1B59, 0x7E0A, 0x7E0A, 0x16DF,
+ 0x7E15, 0x7E15, 0x17C7, 0x7E1B, 0x7E1B, 0x1322, 0x7E1D, 0x7E1D, 0x1B5A,
+ 0x7E1E, 0x7E1E, 0x1E94, 0x7E1F, 0x7E1F, 0x181B, 0x7E21, 0x7E21, 0x19B5,
+ 0x7E23, 0x7E23, 0x1E44, 0x7E2B, 0x7E2B, 0x13EF, 0x7E2E, 0x7E2E, 0x1C7E,
+ 0x7E2F, 0x7E2F, 0x175C, 0x7E31, 0x7E31, 0x1AC0, 0x7E37, 0x7E37, 0x11DC,
+ 0x7E3D, 0x7E3D, 0x1C59, 0x7E3E, 0x7E3E, 0x19E7, 0x7E41, 0x7E41, 0x1389,
+ 0x7E43, 0x7E43, 0x143B, 0x7E46, 0x7E46, 0x12DA, 0x7E47, 0x7E47, 0x180E,
+ 0x7E52, 0x7E52, 0x1B1A, 0x7E54, 0x7E54, 0x1B42, 0x7E55, 0x7E55, 0x153C,
+ 0x7E5E, 0x7E5E, 0x180F, 0x7E61, 0x7E61, 0x15E3, 0x7E69, 0x7E69, 0x1639,
+ 0x7E6A, 0x7E6A, 0x1F06, 0x7E6B, 0x7E6B, 0x0E8A, 0x7E6D, 0x7E6D, 0x0E3A,
+ 0x7E70, 0x7E70, 0x1A9E, 0x7E79, 0x7E79, 0x1740, 0x7E7C, 0x7E7C, 0x0E8B,
+ 0x7E82, 0x7E82, 0x1B9D, 0x7E8C, 0x7E8C, 0x15A6, 0x7E8F, 0x7E8F, 0x1A10,
+ 0x7E93, 0x7E93, 0x1787, 0x7E96, 0x7E96, 0x155A, 0x7E98, 0x7E98, 0x1B9F,
+ 0x7E9B, 0x7E9B, 0x10DD, 0x7E9C, 0x7E9C, 0x1135, 0x7F36, 0x7F36, 0x140C,
+ 0x7F38, 0x7F38, 0x1E01, 0x7F3A, 0x7F3A, 0x0E44, 0x7F4C, 0x7F4C, 0x16E3,
+ 0x7F50, 0x7F50, 0x0EF5, 0x7F54, 0x7F54, 0x125E, 0x7F55, 0x7F55, 0x1DDB,
+ 0x7F6A, 0x7F6A, 0x1ACB, 0x7F6B, 0x7F6B, 0x0F0E, 0x7F6E, 0x7F6E, 0x1CB9,
+ 0x7F70, 0x7F70, 0x138F, 0x7F72, 0x7F72, 0x1511, 0x7F75, 0x7F75, 0x126D,
+ 0x7F77, 0x7F77, 0x1D3E, 0x7F79, 0x7F79, 0x1215, 0x7F85, 0x7F85, 0x1119,
+ 0x7F88, 0x7F88, 0x100E, 0x7F8A, 0x7F8A, 0x1708, 0x7F8C, 0x7F8C, 0x0DDF,
+ 0x7F8E, 0x7F8E, 0x1300, 0x7F94, 0x7F94, 0x0EA6, 0x7F9A, 0x7F9A, 0x1191,
+ 0x7F9E, 0x7F9E, 0x15E4, 0x7FA4, 0x7FA4, 0x0F73, 0x7FA8, 0x7FA8, 0x153D,
+ 0x7FA9, 0x7FA9, 0x1905, 0x7FB2, 0x7FB2, 0x1F76, 0x7FB8, 0x7FB8, 0x1216,
+ 0x7FB9, 0x7FB9, 0x0DFF, 0x7FBD, 0x7FBD, 0x184A, 0x7FC1, 0x7FC1, 0x17CF,
+ 0x7FC5, 0x7FC5, 0x164F, 0x7FCA, 0x7FCA, 0x1927, 0x7FCC, 0x7FCC, 0x1928,
+ 0x7FCE, 0x7FCE, 0x1192, 0x7FD2, 0x7FD2, 0x162F, 0x7FD4, 0x7FD4, 0x14EB,
+ 0x7FD5, 0x7FD5, 0x1F61, 0x7FDF, 0x7FDF, 0x19E8, 0x7FE0, 0x7FE0, 0x1C9A,
+ 0x7FE1, 0x7FE1, 0x1459, 0x7FE9, 0x7FE9, 0x1D64, 0x7FEB, 0x7FEB, 0x17E6,
+ 0x7FF0, 0x7FF0, 0x1DDC, 0x7FF9, 0x7FF9, 0x0F2B, 0x7FFC, 0x7FFC, 0x1929,
+ 0x8000, 0x8000, 0x1810, 0x8001, 0x8001, 0x11A7, 0x8003, 0x8003, 0x0EA7,
+ 0x8005, 0x8005, 0x1965, 0x8006, 0x8006, 0x100F, 0x8009, 0x8009, 0x0F59,
+ 0x800C, 0x800C, 0x191B, 0x8010, 0x8010, 0x103E, 0x8015, 0x8015, 0x0E6D,
+ 0x8017, 0x8017, 0x12AE, 0x8018, 0x8018, 0x1863, 0x802D, 0x802D, 0x1010,
+ 0x8033, 0x8033, 0x191C, 0x8036, 0x8036, 0x16EE, 0x803D, 0x803D, 0x1CFE,
+ 0x803F, 0x803F, 0x0E6E, 0x8043, 0x8043, 0x1083, 0x8046, 0x8046, 0x1193,
+ 0x804A, 0x804A, 0x11CF, 0x8056, 0x8056, 0x156F, 0x8058, 0x8058, 0x1477,
+ 0x805A, 0x805A, 0x1C9B, 0x805E, 0x805E, 0x12EC, 0x806F, 0x806F, 0x1178,
+ 0x8070, 0x8070, 0x1C5A, 0x8072, 0x8072, 0x1570, 0x8073, 0x8073, 0x182F,
+ 0x8077, 0x8077, 0x1B43, 0x807D, 0x807D, 0x1C20, 0x807E, 0x807E, 0x11BE,
+ 0x807F, 0x807F, 0x18E0, 0x8084, 0x8084, 0x191D, 0x8085, 0x8085, 0x1606,
+ 0x8086, 0x8086, 0x14A5, 0x8087, 0x8087, 0x1A9F, 0x8089, 0x8089, 0x18D5,
+ 0x808B, 0x808B, 0x11FD, 0x808C, 0x808C, 0x1011, 0x8096, 0x8096, 0x1C3F,
+ 0x809B, 0x809B, 0x1E02, 0x809D, 0x809D, 0x0DA7, 0x80A1, 0x80A1, 0x0EA8,
+ 0x80A2, 0x80A2, 0x1B35, 0x80A5, 0x80A5, 0x145A, 0x80A9, 0x80A9, 0x0E3B,
+ 0x80AA, 0x80AA, 0x135E, 0x80AF, 0x80AF, 0x0FDD, 0x80B1, 0x80B1, 0x0F1A,
+ 0x80B2, 0x80B2, 0x18D6, 0x80B4, 0x80B4, 0x1F1B, 0x80BA, 0x80BA, 0x1D74,
+ 0x80C3, 0x80C3, 0x189A, 0x80C4, 0x80C4, 0x1AD1, 0x80CC, 0x80CC, 0x1373,
+ 0x80CE, 0x80CE, 0x1D10, 0x80DA, 0x80DA, 0x1374, 0x80DB, 0x80DB, 0x0DCD,
+ 0x80DE, 0x80DE, 0x1D88, 0x80E1, 0x80E1, 0x1E95, 0x80E4, 0x80E4, 0x18DC,
+ 0x80E5, 0x80E5, 0x1512, 0x80F1, 0x80F1, 0x0F0A, 0x80F4, 0x80F4, 0x10F9,
+ 0x80F8, 0x80F8, 0x1F51, 0x80FD, 0x80FD, 0x1059, 0x8102, 0x8102, 0x1B36,
+ 0x8105, 0x8105, 0x1E56, 0x8106, 0x8106, 0x1C9C, 0x8107, 0x8107, 0x1E57,
+ 0x8108, 0x8108, 0x1272, 0x810A, 0x810A, 0x1BE8, 0x8118, 0x8118, 0x17E7,
+ 0x811A, 0x811A, 0x0D90, 0x811B, 0x811B, 0x0E6F, 0x8123, 0x8123, 0x1618,
+ 0x8129, 0x8129, 0x15E5, 0x812B, 0x812B, 0x1CFB, 0x812F, 0x812F, 0x1D89,
+ 0x8139, 0x8139, 0x1BC6, 0x813E, 0x813E, 0x145B, 0x814B, 0x814B, 0x16E0,
+ 0x814E, 0x814E, 0x1674, 0x8150, 0x8151, 0x140D, 0x8154, 0x8154, 0x0DE0,
+ 0x8155, 0x8155, 0x17E8, 0x8165, 0x8165, 0x1571, 0x8166, 0x8166, 0x1053,
+ 0x816B, 0x816B, 0x1AC1, 0x8170, 0x8170, 0x1811, 0x8171, 0x8171, 0x0E18,
+ 0x8178, 0x8178, 0x199D, 0x8179, 0x8179, 0x13DA, 0x817A, 0x817A, 0x153E,
+ 0x817F, 0x817F, 0x1D25, 0x8180, 0x8180, 0x135F, 0x8188, 0x8188, 0x0E32,
+ 0x818A, 0x818A, 0x1323, 0x818F, 0x818F, 0x0EA9, 0x819A, 0x819A, 0x140F,
+ 0x819C, 0x819C, 0x123B, 0x819D, 0x819D, 0x162B, 0x81A0, 0x81A0, 0x0F2C,
+ 0x81A3, 0x81A3, 0x1B71, 0x81A8, 0x81A8, 0x1D5C, 0x81B3, 0x81B3, 0x153F,
+ 0x81B5, 0x81B5, 0x1C91, 0x81BA, 0x81BA, 0x18F8, 0x81BD, 0x81BD, 0x1084,
+ 0x81BE, 0x81BE, 0x1F07, 0x81BF, 0x81BF, 0x1050, 0x81C0, 0x81C0, 0x1107,
+ 0x81C2, 0x81C2, 0x145C, 0x81C6, 0x81C6, 0x171C, 0x81CD, 0x81CD, 0x1A73,
+ 0x81D8, 0x81D8, 0x113A, 0x81DF, 0x81DF, 0x199E, 0x81E3, 0x81E3, 0x1675,
+ 0x81E5, 0x81E5, 0x17D7, 0x81E7, 0x81E7, 0x199F, 0x81E8, 0x81E8, 0x122A,
+ 0x81EA, 0x81EA, 0x1966, 0x81ED, 0x81ED, 0x1C9D, 0x81F3, 0x81F3, 0x1B37,
+ 0x81F4, 0x81F4, 0x1CBA, 0x81FA, 0x81FA, 0x10A5, 0x81FB, 0x81FB, 0x1B5B,
+ 0x81FC, 0x81FC, 0x0F5A, 0x81FE, 0x81FE, 0x18C5, 0x8205, 0x8205, 0x0F5B,
+ 0x8207, 0x8207, 0x1735, 0x8208, 0x8208, 0x1F62, 0x820A, 0x820A, 0x0F5C,
+ 0x820C, 0x820C, 0x1550, 0x820D, 0x820D, 0x14A6, 0x8212, 0x8212, 0x1513,
+ 0x821B, 0x821B, 0x1BF6, 0x821C, 0x821C, 0x1619, 0x821E, 0x821E, 0x12DB,
+ 0x821F, 0x821F, 0x1AE8, 0x8221, 0x8221, 0x0DE1, 0x822A, 0x822A, 0x1E03,
+ 0x822B, 0x822B, 0x1360, 0x822C, 0x822C, 0x133D, 0x8235, 0x8235, 0x1CDE,
+ 0x8236, 0x8236, 0x1324, 0x8237, 0x8237, 0x1E45, 0x8239, 0x8239, 0x1540,
+ 0x8240, 0x8240, 0x1410, 0x8245, 0x8245, 0x1736, 0x8247, 0x8247, 0x1A58,
+ 0x8259, 0x8259, 0x1BC7, 0x8264, 0x8264, 0x1906, 0x8266, 0x8266, 0x1DEB,
+ 0x826E, 0x826E, 0x0DA8, 0x826F, 0x826F, 0x1154, 0x8271, 0x8271, 0x0DA9,
+ 0x8272, 0x8272, 0x14F8, 0x8276, 0x8276, 0x176A, 0x8278, 0x8278, 0x1C40,
+ 0x827E, 0x827E, 0x16D8, 0x828B, 0x828B, 0x184B, 0x828D, 0x828D, 0x1976,
+ 0x828E, 0x828E, 0x0F7F, 0x8292, 0x8292, 0x125F, 0x8299, 0x8299, 0x1411,
+ 0x829A, 0x829A, 0x1108, 0x829D, 0x829D, 0x1B38, 0x829F, 0x829F, 0x14CC,
+ 0x82A5, 0x82A5, 0x0DF7, 0x82A6, 0x82A6, 0x1E96, 0x82A9, 0x82A9, 0x0FCE,
+ 0x82AC, 0x82AC, 0x1430, 0x82AD, 0x82AD, 0x1D3F, 0x82AE, 0x82AE, 0x1797,
+ 0x82AF, 0x82AF, 0x1689, 0x82B1, 0x82B1, 0x1EBF, 0x82B3, 0x82B3, 0x1361,
+ 0x82B7, 0x82B7, 0x1B39, 0x82B8, 0x82B8, 0x1864, 0x82B9, 0x82B9, 0x0FC0,
+ 0x82BB, 0x82BB, 0x1C6A, 0x82BC, 0x82BC, 0x12AF, 0x82BD, 0x82BD, 0x1697,
+ 0x82BF, 0x82BF, 0x1952, 0x82D1, 0x82D1, 0x1882, 0x82D2, 0x82D2, 0x176B,
+ 0x82D4, 0x82D4, 0x1D11, 0x82D5, 0x82D5, 0x1C41, 0x82D7, 0x82D7, 0x12CA,
+ 0x82DB, 0x82DB, 0x0D7F, 0x82DE, 0x82DE, 0x1D8A, 0x82DF, 0x82DF, 0x0F5D,
+ 0x82E1, 0x82E1, 0x191E, 0x82E5, 0x82E5, 0x16F2, 0x82E6, 0x82E6, 0x0EAA,
+ 0x82E7, 0x82E7, 0x19D0, 0x82F1, 0x82F1, 0x1788, 0x82FD, 0x82FD, 0x0EAB,
+ 0x82FE, 0x82FE, 0x1DBC, 0x8301, 0x8301, 0x1B09, 0x8302, 0x8302, 0x12DC,
+ 0x8303, 0x8303, 0x1399, 0x8304, 0x8304, 0x0D80, 0x8305, 0x8305, 0x12B0,
+ 0x8309, 0x8309, 0x1255, 0x8317, 0x8317, 0x1295, 0x8328, 0x8328, 0x1967,
+ 0x832B, 0x832B, 0x1260, 0x832F, 0x832F, 0x13DB, 0x8331, 0x8331, 0x15E6,
+ 0x8334, 0x8334, 0x1F08, 0x8335, 0x8335, 0x1937, 0x8336, 0x8336, 0x105F,
+ 0x8338, 0x8338, 0x1830, 0x8339, 0x8339, 0x1737, 0x8340, 0x8340, 0x161A,
+ 0x8347, 0x8347, 0x1E1C, 0x8349, 0x8349, 0x1C42, 0x834A, 0x834A, 0x1E68,
+ 0x834F, 0x834F, 0x194B, 0x8351, 0x8351, 0x191F, 0x8352, 0x8352, 0x1EF3,
+ 0x8373, 0x8373, 0x1102, 0x8377, 0x8377, 0x1DC8, 0x837B, 0x837B, 0x19E9,
+ 0x8389, 0x8389, 0x1217, 0x838A, 0x838A, 0x19A0, 0x838E, 0x838E, 0x14A7,
+ 0x8396, 0x8396, 0x0E70, 0x8398, 0x8398, 0x1676, 0x839E, 0x839E, 0x17E9,
+ 0x83A2, 0x83A2, 0x1E58, 0x83A9, 0x83A9, 0x1412, 0x83AA, 0x83AA, 0x1698,
+ 0x83AB, 0x83AB, 0x123C, 0x83BD, 0x83BD, 0x1261, 0x83C1, 0x83C1, 0x1C21,
+ 0x83C5, 0x83C5, 0x0EF6, 0x83C9, 0x83C9, 0x11B3, 0x83CA, 0x83CA, 0x0F6D,
+ 0x83CC, 0x83CC, 0x0FAD, 0x83D3, 0x83D3, 0x0EE0, 0x83D6, 0x83D6, 0x1BC8,
+ 0x83DC, 0x83DC, 0x1BD2, 0x83E9, 0x83E9, 0x13CD, 0x83EB, 0x83EB, 0x0FC1,
+ 0x83EF, 0x83EF, 0x1EC0, 0x83F0, 0x83F0, 0x0EAC, 0x83F1, 0x83F1, 0x1203,
+ 0x83F2, 0x83F2, 0x145D, 0x83F4, 0x83F4, 0x16C3, 0x83F9, 0x83F9, 0x19D1,
+ 0x83FD, 0x83FD, 0x1607, 0x8403, 0x8403, 0x1C92, 0x8404, 0x8404, 0x10C9,
+ 0x840A, 0x840A, 0x1147, 0x840C, 0x840C, 0x127C, 0x840D, 0x840D, 0x1D6C,
+ 0x840E, 0x840E, 0x189B, 0x8429, 0x8429, 0x1C6B, 0x842C, 0x842C, 0x124B,
+ 0x8431, 0x8431, 0x1F39, 0x8438, 0x8438, 0x18C6, 0x843D, 0x843D, 0x1122,
+ 0x8449, 0x8449, 0x1771, 0x8457, 0x8457, 0x19D2, 0x845B, 0x845B, 0x0DB2,
+ 0x8461, 0x8461, 0x1D8B, 0x8463, 0x8463, 0x10FA, 0x8466, 0x8466, 0x189C,
+ 0x846B, 0x846B, 0x1E97, 0x846C, 0x846C, 0x19A1, 0x846F, 0x846F, 0x16F3,
+ 0x8475, 0x8475, 0x0FA4, 0x847A, 0x847A, 0x1B12, 0x8490, 0x8490, 0x15E7,
+ 0x8494, 0x8494, 0x1650, 0x8499, 0x8499, 0x12BF, 0x849C, 0x849C, 0x14C0,
+ 0x84A1, 0x84A1, 0x1362, 0x84B2, 0x84B2, 0x1D8C, 0x84B8, 0x84B8, 0x1B1B,
+ 0x84BB, 0x84BB, 0x16F4, 0x84BC, 0x84BC, 0x1BC9, 0x84BF, 0x84BF, 0x1E98,
+ 0x84C0, 0x84C0, 0x15AD, 0x84C2, 0x84C2, 0x1296, 0x84C4, 0x84C4, 0x1C7F,
+ 0x84C6, 0x84C6, 0x1527, 0x84C9, 0x84C9, 0x1831, 0x84CB, 0x84CB, 0x0DF8,
+ 0x84CD, 0x84CD, 0x1651, 0x84D1, 0x84D1, 0x14A8, 0x84DA, 0x84DA, 0x15E8,
+ 0x84EC, 0x84EC, 0x13F0, 0x84EE, 0x84EE, 0x1179, 0x84F4, 0x84F4, 0x161B,
+ 0x84FC, 0x84FC, 0x11D0, 0x8511, 0x8511, 0x128B, 0x8513, 0x8513, 0x124C,
+ 0x8514, 0x8514, 0x13DC, 0x8517, 0x8517, 0x1968, 0x8518, 0x8518, 0x14CD,
+ 0x851A, 0x851A, 0x186A, 0x851E, 0x851E, 0x11DD, 0x8521, 0x8521, 0x1BD3,
+ 0x8523, 0x8523, 0x19A2, 0x8525, 0x8525, 0x1C5B, 0x852C, 0x852C, 0x1597,
+ 0x852D, 0x852D, 0x18EF, 0x852F, 0x852F, 0x1B5C, 0x853D, 0x853D, 0x1D75,
+ 0x853F, 0x853F, 0x189D, 0x8541, 0x8541, 0x1085, 0x8543, 0x8543, 0x138A,
+ 0x8549, 0x8549, 0x1C43, 0x854E, 0x854E, 0x0F2D, 0x8553, 0x8553, 0x1865,
+ 0x8559, 0x8559, 0x1E74, 0x8563, 0x8563, 0x161C, 0x8568, 0x8568, 0x0F8D,
+ 0x8569, 0x8569, 0x1D06, 0x856A, 0x856A, 0x12DD, 0x856D, 0x856D, 0x1598,
+ 0x8584, 0x8584, 0x1325, 0x8587, 0x8587, 0x1301, 0x858F, 0x858F, 0x1907,
+ 0x8591, 0x8591, 0x0DE2, 0x8594, 0x8594, 0x19A3, 0x859B, 0x859B, 0x1551,
+ 0x85A6, 0x85A6, 0x1BF7, 0x85A8, 0x85A8, 0x1F35, 0x85A9, 0x85A9, 0x14C7,
+ 0x85AA, 0x85AA, 0x1677, 0x85AF, 0x85AF, 0x1514, 0x85B0, 0x85B0, 0x1F32,
+ 0x85BA, 0x85BA, 0x1A74, 0x85C1, 0x85C1, 0x0EAD, 0x85C9, 0x85C9, 0x1969,
+ 0x85CD, 0x85CD, 0x1136, 0x85CE, 0x85CE, 0x1678, 0x85CF, 0x85CF, 0x19A4,
+ 0x85D5, 0x85D5, 0x184C, 0x85DC, 0x85DC, 0x1163, 0x85DD, 0x85DD, 0x1798,
+ 0x85E4, 0x85E4, 0x1112, 0x85E5, 0x85E5, 0x16F5, 0x85E9, 0x85E9, 0x138B,
+ 0x85EA, 0x85EA, 0x15E9, 0x85F7, 0x85F7, 0x19D3, 0x85FA, 0x85FA, 0x1222,
+ 0x85FB, 0x85FB, 0x1AA0, 0x85FF, 0x85FF, 0x0EE9, 0x8602, 0x8602, 0x1799,
+ 0x8606, 0x8606, 0x11A8, 0x8607, 0x8607, 0x1599, 0x860A, 0x860A, 0x17C8,
+ 0x8616, 0x8616, 0x1724, 0x8617, 0x8617, 0x13A4, 0x861A, 0x861A, 0x1541,
+ 0x862D, 0x862D, 0x112B, 0x863F, 0x863F, 0x111A, 0x864E, 0x864E, 0x1E99,
+ 0x8650, 0x8650, 0x1DD0, 0x8654, 0x8654, 0x0E19, 0x8655, 0x8655, 0x1BDD,
+ 0x865B, 0x865B, 0x1E29, 0x865C, 0x865C, 0x11A9, 0x865E, 0x865E, 0x184D,
+ 0x865F, 0x865F, 0x1E9A, 0x8667, 0x8667, 0x1F49, 0x8679, 0x8679, 0x1EB4,
+ 0x868A, 0x868A, 0x12ED, 0x868C, 0x868C, 0x1363, 0x8693, 0x8693, 0x1938,
+ 0x86A3, 0x86A3, 0x0ED7, 0x86A4, 0x86A4, 0x1AA1, 0x86A9, 0x86A9, 0x1CBB,
+ 0x86C7, 0x86C7, 0x14A9, 0x86CB, 0x86CB, 0x1070, 0x86D4, 0x86D4, 0x1F09,
+ 0x86D9, 0x86D9, 0x17D8, 0x86DB, 0x86DB, 0x1AE9, 0x86DF, 0x86DF, 0x0F2E,
+ 0x86E4, 0x86E4, 0x1DF2, 0x86ED, 0x86ED, 0x1B72, 0x86FE, 0x86FE, 0x1699,
+ 0x8700, 0x8700, 0x1C4D, 0x8702, 0x8702, 0x13F1, 0x8703, 0x8703, 0x1679,
+ 0x8708, 0x8708, 0x17BA, 0x8718, 0x8718, 0x1B3A, 0x871A, 0x871A, 0x145E,
+ 0x871C, 0x871C, 0x1314, 0x874E, 0x874E, 0x0DB4, 0x8755, 0x8755, 0x1662,
+ 0x8757, 0x8757, 0x1EF4, 0x875F, 0x875F, 0x189E, 0x8766, 0x8766, 0x1DC9,
+ 0x8768, 0x8768, 0x162C, 0x8774, 0x8774, 0x1E9B, 0x8776, 0x8776, 0x1A2F,
+ 0x8778, 0x8778, 0x17D9, 0x8782, 0x8782, 0x1142, 0x878D, 0x878D, 0x18E4,
+ 0x879F, 0x879F, 0x1297, 0x87A2, 0x87A2, 0x1E69, 0x87B3, 0x87B3, 0x1098,
+ 0x87BA, 0x87BA, 0x111B, 0x87C4, 0x87C4, 0x1CD0, 0x87E0, 0x87E0, 0x133E,
+ 0x87EC, 0x87EC, 0x1542, 0x87EF, 0x87EF, 0x1812, 0x87F2, 0x87F2, 0x1C8D,
+ 0x87F9, 0x87F9, 0x1E10, 0x87FB, 0x87FB, 0x1908, 0x87FE, 0x87FE, 0x155B,
+ 0x8805, 0x8805, 0x163A, 0x881F, 0x881F, 0x113B, 0x8822, 0x8822, 0x1B04,
+ 0x8823, 0x8823, 0x1164, 0x8831, 0x8831, 0x0EAE, 0x8836, 0x8836, 0x1984,
+ 0x883B, 0x883B, 0x124D, 0x8840, 0x8840, 0x1E4C, 0x8846, 0x8846, 0x1B0C,
+ 0x884C, 0x884C, 0x1E1D, 0x884D, 0x884D, 0x175D, 0x8852, 0x8852, 0x1E46,
+ 0x8853, 0x8853, 0x1624, 0x8857, 0x8857, 0x0D81, 0x8859, 0x8859, 0x169A,
+ 0x885B, 0x885B, 0x189F, 0x885D, 0x885D, 0x1C8E, 0x8861, 0x8861, 0x1E6A,
+ 0x8862, 0x8862, 0x0F5E, 0x8863, 0x8863, 0x1909, 0x8868, 0x8868, 0x1DA1,
+ 0x886B, 0x886B, 0x14CE, 0x8870, 0x8870, 0x15BD, 0x8872, 0x8872, 0x1037,
+ 0x8877, 0x8877, 0x1C8F, 0x887E, 0x887F, 0x0FCF, 0x8881, 0x8881, 0x1883,
+ 0x8882, 0x8882, 0x129B, 0x8888, 0x8888, 0x0D82, 0x888B, 0x888B, 0x10A6,
+ 0x888D, 0x888D, 0x1D8D, 0x8892, 0x8892, 0x1071, 0x8896, 0x8896, 0x15EA,
+ 0x8897, 0x8897, 0x1B5D, 0x889E, 0x889E, 0x0EC6, 0x88AB, 0x88AB, 0x1DB1,
+ 0x88B4, 0x88B4, 0x0EAF, 0x88C1, 0x88C1, 0x19B6, 0x88C2, 0x88C2, 0x1182,
+ 0x88CF, 0x88CF, 0x1218, 0x88D4, 0x88D4, 0x179A, 0x88D5, 0x88D5, 0x18C7,
+ 0x88D9, 0x88D9, 0x0F74, 0x88DC, 0x88DC, 0x13CE, 0x88DD, 0x88DD, 0x19A5,
+ 0x88DF, 0x88DF, 0x14AA, 0x88E1, 0x88E1, 0x1219, 0x88E8, 0x88E8, 0x145F,
+ 0x88F3, 0x88F3, 0x14EC, 0x88F4, 0x88F5, 0x1375, 0x88F8, 0x88F8, 0x111C,
+ 0x88FD, 0x88FD, 0x1A75, 0x8907, 0x8907, 0x13DD, 0x8910, 0x8910, 0x0DB3,
+ 0x8912, 0x8912, 0x1D8E, 0x8913, 0x8913, 0x13CF, 0x8918, 0x8918, 0x18A0,
+ 0x8919, 0x8919, 0x1377, 0x8925, 0x8925, 0x181C, 0x892A, 0x892A, 0x1D26,
+ 0x8936, 0x8936, 0x1630, 0x8938, 0x8938, 0x11DE, 0x893B, 0x893B, 0x1552,
+ 0x8941, 0x8941, 0x0DE3, 0x8944, 0x8944, 0x1709, 0x895F, 0x895F, 0x0FD1,
+ 0x8964, 0x8964, 0x1137, 0x896A, 0x896A, 0x1256, 0x8972, 0x8972, 0x1631,
+ 0x897F, 0x897F, 0x1515, 0x8981, 0x8981, 0x1813, 0x8983, 0x8983, 0x1086,
+ 0x8986, 0x8986, 0x13DE, 0x8987, 0x8987, 0x1D57, 0x898B, 0x898B, 0x0E3C,
+ 0x898F, 0x898F, 0x0FA5, 0x8993, 0x8993, 0x127E, 0x8996, 0x8996, 0x1652,
+ 0x89A1, 0x89A1, 0x0E33, 0x89A9, 0x89A9, 0x10CA, 0x89AA, 0x89AA, 0x1CC3,
+ 0x89B2, 0x89B2, 0x0FC2, 0x89BA, 0x89BA, 0x0D91, 0x89BD, 0x89BD, 0x1138,
+ 0x89C0, 0x89C0, 0x0EF7, 0x89D2, 0x89D2, 0x0D92, 0x89E3, 0x89E3, 0x1E11,
+ 0x89F4, 0x89F4, 0x14ED, 0x89F8, 0x89F8, 0x1C4E, 0x8A00, 0x8A00, 0x1721,
+ 0x8A02, 0x8A02, 0x1A59, 0x8A03, 0x8A03, 0x1413, 0x8A08, 0x8A08, 0x0E8C,
+ 0x8A0A, 0x8A0A, 0x167A, 0x8A0C, 0x8A0C, 0x1EB5, 0x8A0E, 0x8A0E, 0x1D1C,
+ 0x8A13, 0x8A13, 0x1F33, 0x8A16, 0x8A16, 0x1F5A, 0x8A17, 0x8A17, 0x1CEE,
+ 0x8A18, 0x8A18, 0x1012, 0x8A1B, 0x8A1B, 0x17DA, 0x8A1D, 0x8A1D, 0x169B,
+ 0x8A1F, 0x8A1F, 0x15B5, 0x8A23, 0x8A23, 0x0E45, 0x8A25, 0x8A25, 0x1056,
+ 0x8A2A, 0x8A2A, 0x1364, 0x8A2D, 0x8A2D, 0x1553, 0x8A31, 0x8A31, 0x1E2A,
+ 0x8A34, 0x8A34, 0x159A, 0x8A36, 0x8A36, 0x0D83, 0x8A3A, 0x8A3A, 0x1B5E,
+ 0x8A3B, 0x8A3B, 0x1AEA, 0x8A50, 0x8A50, 0x14AB, 0x8A54, 0x8A54, 0x1AA2,
+ 0x8A55, 0x8A55, 0x1D6D, 0x8A5B, 0x8A5B, 0x19D4, 0x8A5E, 0x8A5E, 0x14AC,
+ 0x8A60, 0x8A60, 0x1789, 0x8A62, 0x8A62, 0x161D, 0x8A63, 0x8A63, 0x179B,
+ 0x8A66, 0x8A66, 0x1653, 0x8A69, 0x8A69, 0x1654, 0x8A6D, 0x8A6D, 0x0F93,
+ 0x8A6E, 0x8A6E, 0x1A11, 0x8A70, 0x8A70, 0x1F77, 0x8A71, 0x8A71, 0x1EC1,
+ 0x8A72, 0x8A72, 0x1E12, 0x8A73, 0x8A73, 0x14EE, 0x8A75, 0x8A75, 0x1543,
+ 0x8A79, 0x8A79, 0x1C11, 0x8A85, 0x8A85, 0x1AEB, 0x8A87, 0x8A87, 0x0EE1,
+ 0x8A8C, 0x8A8C, 0x1B3B, 0x8A8D, 0x8A8D, 0x1939, 0x8A93, 0x8A93, 0x1516,
+ 0x8A95, 0x8A95, 0x1CF9, 0x8A98, 0x8A98, 0x18C8, 0x8A9E, 0x8A9E, 0x1714,
+ 0x8AA0, 0x8AA0, 0x1572, 0x8AA1, 0x8AA1, 0x0E8D, 0x8AA3, 0x8AA3, 0x12DE,
+ 0x8AA4, 0x8AA4, 0x17BB, 0x8AA5, 0x8AA5, 0x0EB0, 0x8AA6, 0x8AA6, 0x15B6,
+ 0x8AA8, 0x8AA8, 0x1F0A, 0x8AAA, 0x8AAA, 0x1554, 0x8AB0, 0x8AB0, 0x15EB,
+ 0x8AB2, 0x8AB2, 0x0EE2, 0x8AB9, 0x8AB9, 0x1460, 0x8ABC, 0x8ABC, 0x190A,
+ 0x8ABE, 0x8ABE, 0x18E9, 0x8ABF, 0x8ABF, 0x1AA3, 0x8AC2, 0x8AC2, 0x1C12,
+ 0x8AC4, 0x8AC4, 0x161E, 0x8AC7, 0x8AC7, 0x1087, 0x8ACB, 0x8ACB, 0x1C22,
+ 0x8ACD, 0x8ACD, 0x19BD, 0x8ACF, 0x8ACF, 0x1C6C, 0x8AD2, 0x8AD2, 0x1155,
+ 0x8AD6, 0x8AD6, 0x11B7, 0x8ADB, 0x8ADB, 0x18C9, 0x8ADC, 0x8ADC, 0x1C1A,
+ 0x8AE1, 0x8AE1, 0x1655, 0x8AE6, 0x8AE6, 0x1C2A, 0x8AE7, 0x8AE7, 0x1E13,
+ 0x8AEA, 0x8AEA, 0x1A5A, 0x8AEB, 0x8AEB, 0x0DAA, 0x8AED, 0x8AED, 0x18CA,
+ 0x8AEE, 0x8AEE, 0x196A, 0x8AF1, 0x8AF1, 0x1F42, 0x8AF6, 0x8AF6, 0x168A,
+ 0x8AF7, 0x8AF7, 0x1DA9, 0x8AF8, 0x8AF8, 0x1A76, 0x8AFA, 0x8AFA, 0x1722,
+ 0x8AFE, 0x8AFE, 0x102B, 0x8B00, 0x8B00, 0x12B1, 0x8B01, 0x8B01, 0x16BA,
+ 0x8B02, 0x8B02, 0x18A1, 0x8B04, 0x8B04, 0x1113, 0x8B0E, 0x8B0E, 0x1302,
+ 0x8B10, 0x8B10, 0x1315, 0x8B14, 0x8B14, 0x1DD1, 0x8B16, 0x8B16, 0x15A7,
+ 0x8B17, 0x8B17, 0x1365, 0x8B19, 0x8B19, 0x0E49, 0x8B1A, 0x8B1A, 0x192A,
+ 0x8B1B, 0x8B1B, 0x0DE4, 0x8B1D, 0x8B1D, 0x14AD, 0x8B20, 0x8B20, 0x1814,
+ 0x8B28, 0x8B28, 0x12B2, 0x8B2B, 0x8B2B, 0x19EA, 0x8B2C, 0x8B2C, 0x11ED,
+ 0x8B33, 0x8B33, 0x0F5F, 0x8B39, 0x8B39, 0x0FC3, 0x8B41, 0x8B41, 0x1EC2,
+ 0x8B49, 0x8B49, 0x1B1C, 0x8B4E, 0x8B4E, 0x1F4B, 0x8B4F, 0x8B4F, 0x1013,
+ 0x8B58, 0x8B58, 0x1663, 0x8B5A, 0x8B5A, 0x1088, 0x8B5C, 0x8B5C, 0x13D0,
+ 0x8B66, 0x8B66, 0x0E71, 0x8B6C, 0x8B6C, 0x1461, 0x8B6F, 0x8B6F, 0x1741,
+ 0x8B70, 0x8B70, 0x190B, 0x8B74, 0x8B74, 0x0E3D, 0x8B77, 0x8B77, 0x1E9C,
+ 0x8B7D, 0x8B7D, 0x179C, 0x8B80, 0x8B80, 0x10DE, 0x8B8A, 0x8B8A, 0x13A9,
+ 0x8B90, 0x8B90, 0x15EC, 0x8B92, 0x8B92, 0x1BB2, 0x8B93, 0x8B93, 0x170A,
+ 0x8B96, 0x8B96, 0x1BB3, 0x8B9A, 0x8B9A, 0x1BA0, 0x8C37, 0x8C37, 0x0EBC,
+ 0x8C3F, 0x8C3F, 0x0E8E, 0x8C41, 0x8C41, 0x1EDE, 0x8C46, 0x8C46, 0x1103,
+ 0x8C48, 0x8C48, 0x1014, 0x8C4A, 0x8C4A, 0x1DAA, 0x8C4C, 0x8C4C, 0x17EA,
+ 0x8C55, 0x8C55, 0x1656, 0x8C5A, 0x8C5A, 0x10E7, 0x8C61, 0x8C61, 0x14EF,
+ 0x8C6A, 0x8C6A, 0x1E9D, 0x8C6B, 0x8C6B, 0x179D, 0x8C79, 0x8C79, 0x1DA2,
+ 0x8C7A, 0x8C7A, 0x1657, 0x8C82, 0x8C82, 0x1C44, 0x8C8A, 0x8C8A, 0x1273,
+ 0x8C8C, 0x8C8C, 0x12B3, 0x8C9D, 0x8C9D, 0x1D58, 0x8C9E, 0x8C9E, 0x1A5B,
+ 0x8CA0, 0x8CA0, 0x1414, 0x8CA1, 0x8CA1, 0x19B7, 0x8CA2, 0x8CA2, 0x0ED8,
+ 0x8CA7, 0x8CA7, 0x1472, 0x8CA8, 0x8CA8, 0x1EC3, 0x8CA9, 0x8CA9, 0x1D47,
+ 0x8CAA, 0x8CAA, 0x1CFF, 0x8CAB, 0x8CAB, 0x0EF8, 0x8CAC, 0x8CAC, 0x1BD9,
+ 0x8CAF, 0x8CAF, 0x19D5, 0x8CB0, 0x8CB0, 0x157B, 0x8CB3, 0x8CB3, 0x1921,
+ 0x8CB4, 0x8CB4, 0x0F98, 0x8CB6, 0x8CB6, 0x1D68, 0x8CB7, 0x8CB7, 0x126E,
+ 0x8CB8, 0x8CB8, 0x10A7, 0x8CBB, 0x8CBB, 0x1462, 0x8CBC, 0x8CBC, 0x1C1B,
+ 0x8CBD, 0x8CBD, 0x1920, 0x8CBF, 0x8CBF, 0x12DF, 0x8CC0, 0x8CC0, 0x1DCA,
+ 0x8CC1, 0x8CC1, 0x1431, 0x8CC2, 0x8CC2, 0x11C3, 0x8CC3, 0x8CC3, 0x194C,
+ 0x8CC4, 0x8CC4, 0x1F0B, 0x8CC7, 0x8CC7, 0x196B, 0x8CC8, 0x8CC8, 0x0D84,
+ 0x8CCA, 0x8CCA, 0x19EB, 0x8CD1, 0x8CD1, 0x1B5F, 0x8CD3, 0x8CD3, 0x1473,
+ 0x8CDA, 0x8CDA, 0x11C4, 0x8CDC, 0x8CDC, 0x14AE, 0x8CDE, 0x8CDE, 0x14F0,
+ 0x8CE0, 0x8CE0, 0x1378, 0x8CE2, 0x8CE2, 0x1E47, 0x8CE3, 0x8CE3, 0x126F,
+ 0x8CE4, 0x8CE4, 0x1BF8, 0x8CE6, 0x8CE6, 0x1415, 0x8CEA, 0x8CEA, 0x1B73,
+ 0x8CED, 0x8CED, 0x10CB, 0x8CF4, 0x8CF4, 0x11C5, 0x8CFB, 0x8CFB, 0x1416,
+ 0x8CFC, 0x8CFC, 0x0F60, 0x8CFD, 0x8CFD, 0x14F4, 0x8D04, 0x8D04, 0x1B3C,
+ 0x8D05, 0x8D05, 0x1C93, 0x8D07, 0x8D07, 0x18DD, 0x8D08, 0x8D08, 0x1B1D,
+ 0x8D0A, 0x8D0A, 0x1BA1, 0x8D0D, 0x8D0D, 0x155C, 0x8D13, 0x8D13, 0x19A6,
+ 0x8D16, 0x8D16, 0x15A8, 0x8D64, 0x8D64, 0x19EC, 0x8D66, 0x8D66, 0x14AF,
+ 0x8D6B, 0x8D6B, 0x1E34, 0x8D70, 0x8D70, 0x1AEC, 0x8D73, 0x8D73, 0x0FA6,
+ 0x8D74, 0x8D74, 0x1417, 0x8D77, 0x8D77, 0x1015, 0x8D85, 0x8D85, 0x1C45,
+ 0x8D8A, 0x8D8A, 0x188A, 0x8D99, 0x8D99, 0x1AA4, 0x8DA3, 0x8DA3, 0x1C9E,
+ 0x8DA8, 0x8DA8, 0x1C6D, 0x8DB3, 0x8DB3, 0x1AAE, 0x8DBA, 0x8DBA, 0x1418,
+ 0x8DBE, 0x8DBE, 0x1B3D, 0x8DC6, 0x8DC6, 0x1D12, 0x8DCB, 0x8DCB, 0x1348,
+ 0x8DCC, 0x8DCC, 0x1B74, 0x8DCF, 0x8DCF, 0x0D85, 0x8DDB, 0x8DDB, 0x1D40,
+ 0x8DDD, 0x8DDD, 0x0E0C, 0x8DE1, 0x8DE1, 0x19ED, 0x8DE3, 0x8DE3, 0x1544,
+ 0x8DE8, 0x8DE8, 0x0EE3, 0x8DEF, 0x8DEF, 0x11AA, 0x8DF3, 0x8DF3, 0x10CC,
+ 0x8E0A, 0x8E0A, 0x1832, 0x8E0F, 0x8E0F, 0x108D, 0x8E10, 0x8E10, 0x1BF9,
+ 0x8E1E, 0x8E1E, 0x0E0D, 0x8E2A, 0x8E2A, 0x1AC2, 0x8E30, 0x8E30, 0x18CB,
+ 0x8E35, 0x8E35, 0x1AC3, 0x8E42, 0x8E42, 0x18CC, 0x8E44, 0x8E44, 0x1A77,
+ 0x8E47, 0x8E47, 0x0E1A, 0x8E48, 0x8E48, 0x10CD, 0x8E49, 0x8E49, 0x1B8C,
+ 0x8E4A, 0x8E4A, 0x1E75, 0x8E59, 0x8E59, 0x1C80, 0x8E5F, 0x8E5F, 0x19EE,
+ 0x8E60, 0x8E60, 0x1BE9, 0x8E74, 0x8E74, 0x1C81, 0x8E76, 0x8E76, 0x0F8E,
+ 0x8E81, 0x8E81, 0x1AA5, 0x8E87, 0x8E87, 0x19D6, 0x8E8A, 0x8E8A, 0x1AED,
+ 0x8E8D, 0x8E8D, 0x16F6, 0x8EAA, 0x8EAA, 0x1223, 0x8EAB, 0x8EAB, 0x167B,
+ 0x8EAC, 0x8EAC, 0x0F80, 0x8EC0, 0x8EC0, 0x0F61, 0x8ECA, 0x8ECA, 0x1B8D,
+ 0x8ECB, 0x8ECB, 0x16BB, 0x8ECC, 0x8ECC, 0x0F94, 0x8ECD, 0x8ECD, 0x0F75,
+ 0x8ED2, 0x8ED2, 0x1E2E, 0x8EDF, 0x8EDF, 0x175E, 0x8EEB, 0x8EEB, 0x1B60,
+ 0x8EF8, 0x8EF8, 0x1C82, 0x8EFB, 0x8EFB, 0x0D86, 0x8EFE, 0x8EFE, 0x1664,
+ 0x8F03, 0x8F03, 0x0F2F, 0x8F05, 0x8F05, 0x11AB, 0x8F09, 0x8F09, 0x19B8,
+ 0x8F12, 0x8F12, 0x1C1C, 0x8F13, 0x8F13, 0x124E, 0x8F14, 0x8F14, 0x13D1,
+ 0x8F15, 0x8F15, 0x0E72, 0x8F1B, 0x8F1B, 0x1156, 0x8F1C, 0x8F1C, 0x1CBC,
+ 0x8F1D, 0x8F1D, 0x1F43, 0x8F1E, 0x8F1E, 0x1262, 0x8F1F, 0x8F1F, 0x1C06,
+ 0x8F26, 0x8F26, 0x117A, 0x8F27, 0x8F27, 0x13BF, 0x8F29, 0x8F29, 0x1379,
+ 0x8F2A, 0x8F2A, 0x11F7, 0x8F2F, 0x8F2F, 0x1B7B, 0x8F33, 0x8F33, 0x1AEE,
+ 0x8F38, 0x8F38, 0x15ED, 0x8F39, 0x8F39, 0x13DF, 0x8F3B, 0x8F3B, 0x13E0,
+ 0x8F3E, 0x8F3E, 0x1A12, 0x8F3F, 0x8F3F, 0x1738, 0x8F44, 0x8F44, 0x1DE2,
+ 0x8F45, 0x8F45, 0x1884, 0x8F49, 0x8F49, 0x1A13, 0x8F4D, 0x8F4D, 0x1C07,
+ 0x8F4E, 0x8F4E, 0x0F30, 0x8F5D, 0x8F5D, 0x1739, 0x8F5F, 0x8F5F, 0x0F1B,
+ 0x8F62, 0x8F62, 0x116F, 0x8F9B, 0x8F9B, 0x167C, 0x8F9C, 0x8F9C, 0x0EB1,
+ 0x8FA3, 0x8FA3, 0x112E, 0x8FA6, 0x8FA6, 0x1D48, 0x8FA8, 0x8FA8, 0x13AA,
+ 0x8FAD, 0x8FAD, 0x14B0, 0x8FAF, 0x8FAF, 0x13AB, 0x8FB0, 0x8FB0, 0x1B61,
+ 0x8FB1, 0x8FB1, 0x181D, 0x8FB2, 0x8FB2, 0x1051, 0x8FC2, 0x8FC2, 0x184E,
+ 0x8FC5, 0x8FC5, 0x167D, 0x8FCE, 0x8FCE, 0x178A, 0x8FD1, 0x8FD1, 0x0FC4,
+ 0x8FD4, 0x8FD4, 0x133F, 0x8FE6, 0x8FE6, 0x0D87, 0x8FEA, 0x8FEA, 0x19EF,
+ 0x8FEB, 0x8FEB, 0x1326, 0x8FED, 0x8FED, 0x1B75, 0x8FF0, 0x8FF0, 0x1625,
+ 0x8FF2, 0x8FF2, 0x0E2A, 0x8FF7, 0x8FF7, 0x1303, 0x8FF9, 0x8FF9, 0x19F0,
+ 0x8FFD, 0x8FFD, 0x1C6E, 0x9000, 0x9000, 0x1D27, 0x9001, 0x9001, 0x15B7,
+ 0x9002, 0x9002, 0x0EFE, 0x9003, 0x9003, 0x10CE, 0x9005, 0x9005, 0x1F2A,
+ 0x9006, 0x9006, 0x1742, 0x9008, 0x9008, 0x1E6B, 0x900B, 0x900B, 0x1D8F,
+ 0x900D, 0x900D, 0x159B, 0x900F, 0x900F, 0x1D2D, 0x9010, 0x9010, 0x1C83,
+ 0x9011, 0x9011, 0x0F62, 0x9014, 0x9014, 0x10CF, 0x9015, 0x9015, 0x0E73,
+ 0x9017, 0x9017, 0x1104, 0x9019, 0x9019, 0x19D7, 0x901A, 0x901A, 0x1D22,
+ 0x901D, 0x901D, 0x1517, 0x901E, 0x901E, 0x1194, 0x901F, 0x901F, 0x15A9,
+ 0x9020, 0x9020, 0x1AA6, 0x9021, 0x9021, 0x1B05, 0x9022, 0x9022, 0x13F2,
+ 0x9023, 0x9023, 0x117B, 0x902E, 0x902E, 0x1C2B, 0x9031, 0x9031, 0x1AEF,
+ 0x9032, 0x9032, 0x1B62, 0x9035, 0x9035, 0x0FA7, 0x9038, 0x9038, 0x1942,
+ 0x903C, 0x903C, 0x1DBF, 0x903E, 0x903E, 0x18CE, 0x9041, 0x9041, 0x1109,
+ 0x9042, 0x9042, 0x15EE, 0x9047, 0x9047, 0x184F, 0x904A, 0x904A, 0x18CD,
+ 0x904B, 0x904B, 0x1866, 0x904D, 0x904D, 0x1D65, 0x904E, 0x904E, 0x0EE4,
+ 0x9050, 0x9050, 0x1DCB, 0x9051, 0x9051, 0x1EF5, 0x9053, 0x9053, 0x10D0,
+ 0x9054, 0x9054, 0x1078, 0x9055, 0x9055, 0x18A2, 0x9059, 0x9059, 0x1815,
+ 0x905C, 0x905C, 0x15AE, 0x905D, 0x905D, 0x108E, 0x905E, 0x905E, 0x1C2C,
+ 0x9060, 0x9060, 0x1885, 0x9061, 0x9061, 0x159C, 0x9063, 0x9063, 0x0E3E,
+ 0x9069, 0x9069, 0x19F1, 0x906D, 0x906D, 0x1AA7, 0x906E, 0x906E, 0x1B8E,
+ 0x906F, 0x906F, 0x110A, 0x9072, 0x9072, 0x1B3E, 0x9075, 0x9075, 0x1B06,
+ 0x9077, 0x9077, 0x1BFA, 0x9078, 0x9078, 0x1545, 0x907A, 0x907A, 0x18CF,
+ 0x907C, 0x907C, 0x11D1, 0x907D, 0x907D, 0x0E0E, 0x907F, 0x907F, 0x1DB2,
+ 0x9080, 0x9080, 0x1816, 0x9081, 0x9081, 0x1270, 0x9082, 0x9082, 0x1E14,
+ 0x9083, 0x9083, 0x15EF, 0x9084, 0x9084, 0x1ED8, 0x9087, 0x9087, 0x1922,
+ 0x9088, 0x9088, 0x123D, 0x908A, 0x908A, 0x13AC, 0x908F, 0x908F, 0x111D,
+ 0x9091, 0x9091, 0x18F5, 0x9095, 0x9095, 0x17D0, 0x9099, 0x9099, 0x1263,
+ 0x90A2, 0x90A2, 0x1E6C, 0x90A3, 0x90A3, 0x102A, 0x90A6, 0x90A6, 0x1366,
+ 0x90A8, 0x90A8, 0x1C52, 0x90AA, 0x90AA, 0x14B1, 0x90AF, 0x90AF, 0x0DC6,
+ 0x90B0, 0x90B0, 0x1D13, 0x90B1, 0x90B1, 0x0F63, 0x90B5, 0x90B5, 0x159D,
+ 0x90B8, 0x90B8, 0x19D8, 0x90C1, 0x90C1, 0x185C, 0x90CA, 0x90CA, 0x0F31,
+ 0x90DE, 0x90DE, 0x1143, 0x90E1, 0x90E1, 0x0F76, 0x90E8, 0x90E8, 0x1419,
+ 0x90ED, 0x90ED, 0x0EEA, 0x90F5, 0x90F5, 0x1850, 0x90FD, 0x90FD, 0x10D1,
+ 0x9102, 0x9102, 0x16AA, 0x9112, 0x9112, 0x1C6F, 0x9115, 0x9115, 0x1E22,
+ 0x9119, 0x9119, 0x1463, 0x9127, 0x9127, 0x1114, 0x912D, 0x912D, 0x1A5C,
+ 0x9132, 0x9132, 0x1072, 0x9149, 0x9149, 0x18D0, 0x914A, 0x914A, 0x1A5D,
+ 0x914B, 0x914B, 0x1C70, 0x914C, 0x914C, 0x1977, 0x914D, 0x914D, 0x137A,
+ 0x914E, 0x914E, 0x1AF0, 0x9152, 0x9152, 0x1AF1, 0x9162, 0x9162, 0x1C46,
+ 0x9169, 0x9169, 0x1298, 0x916A, 0x916A, 0x1123, 0x916C, 0x916C, 0x15F0,
+ 0x9175, 0x9175, 0x1F1C, 0x9177, 0x9177, 0x1EA3, 0x9178, 0x9178, 0x14C1,
+ 0x9187, 0x9187, 0x161F, 0x9189, 0x9189, 0x1C9F, 0x918B, 0x918B, 0x1C47,
+ 0x918D, 0x918D, 0x1A78, 0x9192, 0x9192, 0x1573, 0x919C, 0x919C, 0x1C71,
+ 0x91AB, 0x91AB, 0x190C, 0x91AC, 0x91AC, 0x19A7, 0x91AE, 0x91AE, 0x1C48,
+ 0x91AF, 0x91AF, 0x1E76, 0x91B1, 0x91B1, 0x1349, 0x91B4, 0x91B4, 0x119D,
+ 0x91B5, 0x91B5, 0x0E00, 0x91C0, 0x91C0, 0x170B, 0x91C7, 0x91C7, 0x1BD4,
+ 0x91C9, 0x91C9, 0x18D1, 0x91CB, 0x91CB, 0x1528, 0x91CC, 0x91CC, 0x121A,
+ 0x91CD, 0x91CD, 0x1B0D, 0x91CE, 0x91CE, 0x16EF, 0x91CF, 0x91CF, 0x1157,
+ 0x91D0, 0x91D0, 0x121B, 0x91D1, 0x91D1, 0x1023, 0x91D7, 0x91D7, 0x15BE,
+ 0x91D8, 0x91D8, 0x1A5E, 0x91DC, 0x91DC, 0x141A, 0x91DD, 0x91DD, 0x1CCE,
+ 0x91E3, 0x91E3, 0x1AA8, 0x91E7, 0x91E7, 0x1BFB, 0x91EA, 0x91EA, 0x1851,
+ 0x91F5, 0x91F5, 0x1BD5, 0x920D, 0x920D, 0x110B, 0x9210, 0x9210, 0x0E26,
+ 0x9211, 0x9211, 0x1D49, 0x9212, 0x9212, 0x14D1, 0x9217, 0x9217, 0x18DE,
+ 0x921E, 0x921E, 0x0FAE, 0x9234, 0x9234, 0x1195, 0x923A, 0x923A, 0x17C2,
+ 0x923F, 0x923F, 0x1A14, 0x9240, 0x9240, 0x0DCE, 0x9245, 0x9245, 0x0E0F,
+ 0x9249, 0x9249, 0x1E48, 0x9257, 0x9257, 0x0E4A, 0x925B, 0x925B, 0x175F,
+ 0x925E, 0x925E, 0x188B, 0x9262, 0x9262, 0x134A, 0x9264, 0x9264, 0x0F64,
+ 0x9265, 0x9265, 0x1626, 0x9266, 0x9266, 0x1A5F, 0x9280, 0x9280, 0x18EA,
+ 0x9283, 0x9283, 0x1C5C, 0x9285, 0x9285, 0x10FB, 0x9291, 0x9291, 0x1546,
+ 0x9293, 0x9293, 0x1A15, 0x9296, 0x9296, 0x15F1, 0x9298, 0x9298, 0x1299,
+ 0x929C, 0x929C, 0x1DEC, 0x92B3, 0x92B3, 0x179E, 0x92B6, 0x92B6, 0x0F65,
+ 0x92B7, 0x92B7, 0x159E, 0x92B9, 0x92B9, 0x15F2, 0x92CC, 0x92CC, 0x1A60,
+ 0x92CF, 0x92CF, 0x1E59, 0x92D2, 0x92D2, 0x13F3, 0x92E4, 0x92E4, 0x1518,
+ 0x92EA, 0x92EA, 0x1D90, 0x92F8, 0x92F8, 0x0E10, 0x92FC, 0x92FC, 0x0DE5,
+ 0x9304, 0x9304, 0x11B4, 0x9310, 0x9310, 0x1C72, 0x9318, 0x9318, 0x1C73,
+ 0x931A, 0x931A, 0x19BE, 0x931E, 0x931E, 0x1620, 0x931F, 0x931F, 0x1089,
+ 0x9320, 0x9320, 0x1A61, 0x9321, 0x9321, 0x1016, 0x9322, 0x9322, 0x1A16,
+ 0x9324, 0x9324, 0x1017, 0x9326, 0x9326, 0x0FD2, 0x9328, 0x9328, 0x12CB,
+ 0x932B, 0x932B, 0x1529, 0x932E, 0x932E, 0x0EB2, 0x932F, 0x932F, 0x1B93,
+ 0x9348, 0x9348, 0x178B, 0x934A, 0x934A, 0x117C, 0x934B, 0x934B, 0x0EE5,
+ 0x934D, 0x934D, 0x10D2, 0x9354, 0x9354, 0x16AB, 0x935B, 0x935B, 0x1073,
+ 0x936E, 0x936E, 0x18D2, 0x9375, 0x9375, 0x0E1B, 0x937C, 0x937C, 0x1CCF,
+ 0x937E, 0x937E, 0x1AC4, 0x938C, 0x938C, 0x0E4B, 0x9394, 0x9394, 0x1833,
+ 0x9396, 0x9396, 0x15BC, 0x939A, 0x939A, 0x1C74, 0x93A3, 0x93A3, 0x1E6D,
+ 0x93A7, 0x93A7, 0x0DF9, 0x93AC, 0x93AC, 0x1E9E, 0x93AD, 0x93AD, 0x1B63,
+ 0x93B0, 0x93B0, 0x1943, 0x93C3, 0x93C3, 0x1AAF, 0x93D1, 0x93D1, 0x19F2,
+ 0x93DE, 0x93DE, 0x1834, 0x93E1, 0x93E1, 0x0E74, 0x93E4, 0x93E4, 0x11DF,
+ 0x93F6, 0x93F6, 0x1B7C, 0x9404, 0x9404, 0x1F10, 0x9418, 0x9418, 0x1AC5,
+ 0x9425, 0x9425, 0x1547, 0x942B, 0x942B, 0x1A17, 0x9435, 0x9435, 0x1C08,
+ 0x9438, 0x9438, 0x1CEF, 0x9444, 0x9444, 0x1AF2, 0x9451, 0x9452, 0x0DC7,
+ 0x945B, 0x945B, 0x0F0B, 0x947D, 0x947D, 0x1BA2, 0x947F, 0x947F, 0x1B94,
+ 0x9577, 0x9577, 0x19A8, 0x9580, 0x9580, 0x12EE, 0x9583, 0x9583, 0x155D,
+ 0x9589, 0x9589, 0x1D76, 0x958B, 0x958B, 0x0DFA, 0x958F, 0x958F, 0x18DF,
+ 0x9591, 0x9592, 0x1DDD, 0x9593, 0x9593, 0x0DAB, 0x9594, 0x9594, 0x1312,
+ 0x9598, 0x9598, 0x0DCF, 0x95A3, 0x95A3, 0x0D93, 0x95A4, 0x95A4, 0x1DF3,
+ 0x95A5, 0x95A5, 0x1390, 0x95A8, 0x95A8, 0x0FA8, 0x95AD, 0x95AD, 0x1165,
+ 0x95B1, 0x95B1, 0x1764, 0x95BB, 0x95BB, 0x176C, 0x95BC, 0x95BC, 0x16BC,
+ 0x95C7, 0x95C7, 0x16C4, 0x95CA, 0x95CA, 0x1EDF, 0x95D4, 0x95D4, 0x1DF4,
+ 0x95D5, 0x95D5, 0x0F8F, 0x95D6, 0x95D6, 0x1D31, 0x95DC, 0x95DC, 0x0EF9,
+ 0x95E1, 0x95E1, 0x1BFC, 0x95E2, 0x95E2, 0x13A5, 0x961C, 0x961C, 0x141B,
+ 0x9621, 0x9621, 0x1BFD, 0x962A, 0x962A, 0x1D4A, 0x962E, 0x962E, 0x17EB,
+ 0x9632, 0x9632, 0x1367, 0x963B, 0x963B, 0x1AA9, 0x963F, 0x963F, 0x169C,
+ 0x9640, 0x9640, 0x1CDF, 0x9642, 0x9642, 0x1DB3, 0x9644, 0x9644, 0x141C,
+ 0x964B, 0x964B, 0x11E0, 0x964C, 0x964C, 0x1274, 0x964D, 0x964D, 0x0DE6,
+ 0x9650, 0x9650, 0x1DDF, 0x965B, 0x965B, 0x1D77, 0x965C, 0x965C, 0x1DF5,
+ 0x965D, 0x965D, 0x155E, 0x965E, 0x965E, 0x163B, 0x965F, 0x965F, 0x1BEA,
+ 0x9662, 0x9662, 0x1886, 0x9663, 0x9663, 0x1B64, 0x9664, 0x9664, 0x1A79,
+ 0x966A, 0x966A, 0x137B, 0x9670, 0x9670, 0x18F0, 0x9673, 0x9673, 0x1B65,
+ 0x9675, 0x9675, 0x1204, 0x9676, 0x9676, 0x10D3, 0x9677, 0x9677, 0x1DED,
+ 0x9678, 0x9678, 0x11F1, 0x967D, 0x967D, 0x170C, 0x9685, 0x9685, 0x1852,
+ 0x9686, 0x9686, 0x11FB, 0x968A, 0x968A, 0x10A8, 0x968B, 0x968B, 0x15F3,
+ 0x968D, 0x968D, 0x1EF6, 0x968E, 0x968E, 0x0E8F, 0x9694, 0x9694, 0x0E34,
+ 0x9695, 0x9695, 0x1867, 0x9698, 0x9698, 0x16D9, 0x9699, 0x9699, 0x0FB6,
+ 0x969B, 0x969B, 0x1A7A, 0x969C, 0x969C, 0x19A9, 0x96A3, 0x96A3, 0x1224,
+ 0x96A7, 0x96A8, 0x15F4, 0x96AA, 0x96AA, 0x1E30, 0x96B1, 0x96B1, 0x18EB,
+ 0x96B7, 0x96B7, 0x119E, 0x96BB, 0x96BB, 0x1BEB, 0x96C0, 0x96C0, 0x1978,
+ 0x96C1, 0x96C1, 0x16B5, 0x96C4, 0x96C4, 0x186E, 0x96C5, 0x96C5, 0x169D,
+ 0x96C6, 0x96C6, 0x1B7D, 0x96C7, 0x96C7, 0x0EB3, 0x96C9, 0x96C9, 0x1CBD,
+ 0x96CB, 0x96CB, 0x1B07, 0x96CC, 0x96CC, 0x196C, 0x96CD, 0x96CD, 0x17D1,
+ 0x96CE, 0x96CE, 0x19D9, 0x96D5, 0x96D5, 0x1AAA, 0x96D6, 0x96D6, 0x15F6,
+ 0x96D9, 0x96D9, 0x168D, 0x96DB, 0x96DB, 0x1C75, 0x96DC, 0x96DC, 0x1985,
+ 0x96E2, 0x96E2, 0x121C, 0x96E3, 0x96E3, 0x102E, 0x96E8, 0x96E9, 0x1853,
+ 0x96EA, 0x96EA, 0x1555, 0x96EF, 0x96EF, 0x12EF, 0x96F0, 0x96F0, 0x1432,
+ 0x96F2, 0x96F2, 0x1868, 0x96F6, 0x96F6, 0x1196, 0x96F7, 0x96F7, 0x11C6,
+ 0x96F9, 0x96F9, 0x1327, 0x96FB, 0x96FB, 0x1A18, 0x9700, 0x9700, 0x15F7,
+ 0x9706, 0x9706, 0x1A62, 0x9707, 0x9707, 0x1B66, 0x9711, 0x9711, 0x1A2A,
+ 0x9713, 0x9713, 0x179F, 0x9716, 0x9716, 0x122B, 0x9719, 0x9719, 0x178C,
+ 0x971C, 0x971C, 0x14F1, 0x971E, 0x971E, 0x1DCC, 0x9727, 0x9727, 0x12E0,
+ 0x9730, 0x9730, 0x14C2, 0x9732, 0x9732, 0x11AC, 0x9739, 0x9739, 0x13A6,
+ 0x973D, 0x973D, 0x1A7B, 0x9742, 0x9742, 0x1170, 0x9744, 0x9744, 0x16DA,
+ 0x9748, 0x9748, 0x1197, 0x9751, 0x9751, 0x1C23, 0x9756, 0x9756, 0x1A63,
+ 0x975C, 0x975C, 0x1A64, 0x975E, 0x975E, 0x1464, 0x9761, 0x9761, 0x1304,
+ 0x9762, 0x9762, 0x1288, 0x9769, 0x9769, 0x1E35, 0x976D, 0x976D, 0x193A,
+ 0x9774, 0x9774, 0x1EC4, 0x9777, 0x9777, 0x193B, 0x977A, 0x977A, 0x1257,
+ 0x978B, 0x978B, 0x1E77, 0x978D, 0x978D, 0x16B6, 0x978F, 0x978F, 0x0ED9,
+ 0x97A0, 0x97A0, 0x0F6E, 0x97A8, 0x97A8, 0x0DB5, 0x97AB, 0x97AB, 0x0F6F,
+ 0x97AD, 0x97AD, 0x1D66, 0x97C6, 0x97C6, 0x1BFE, 0x97CB, 0x97CB, 0x18A3,
+ 0x97D3, 0x97D3, 0x1DE0, 0x97DC, 0x97DC, 0x10D4, 0x97F3, 0x97F3, 0x18F1,
+ 0x97F6, 0x97F6, 0x159F, 0x97FB, 0x97FB, 0x1869, 0x97FF, 0x97FF, 0x1E23,
+ 0x9800, 0x9800, 0x1E9F, 0x9801, 0x9801, 0x1E4D, 0x9802, 0x9802, 0x1A65,
+ 0x9803, 0x9803, 0x0E75, 0x9805, 0x9805, 0x1E04, 0x9806, 0x9806, 0x1621,
+ 0x9808, 0x9808, 0x15F8, 0x980A, 0x980A, 0x185D, 0x980C, 0x980C, 0x15B8,
+ 0x9810, 0x9810, 0x17A0, 0x9811, 0x9811, 0x17EC, 0x9812, 0x9812, 0x1340,
+ 0x9813, 0x9813, 0x10E8, 0x9817, 0x9817, 0x1D41, 0x9818, 0x9818, 0x1198,
+ 0x982D, 0x982D, 0x1105, 0x9830, 0x9830, 0x1E5A, 0x9838, 0x9838, 0x0E76,
+ 0x9839, 0x9839, 0x1D28, 0x983B, 0x983B, 0x1474, 0x9846, 0x9846, 0x0EE6,
+ 0x984C, 0x984C, 0x1A7C, 0x984D, 0x984D, 0x16E1, 0x984E, 0x984E, 0x16AC,
+ 0x9854, 0x9854, 0x16B7, 0x9858, 0x9858, 0x1887, 0x985A, 0x985A, 0x1A19,
+ 0x985E, 0x985E, 0x11EE, 0x9865, 0x9865, 0x1EA0, 0x9867, 0x9867, 0x0EB4,
+ 0x986B, 0x986B, 0x1A1A, 0x986F, 0x986F, 0x1E49, 0x98A8, 0x98A8, 0x1DAB,
+ 0x98AF, 0x98AF, 0x14D2, 0x98B1, 0x98B1, 0x1D14, 0x98C4, 0x98C4, 0x1DA4,
+ 0x98C7, 0x98C7, 0x1DA3, 0x98DB, 0x98DB, 0x1465, 0x98DC, 0x98DC, 0x138C,
+ 0x98DF, 0x98DF, 0x1665, 0x98E1, 0x98E1, 0x15AF, 0x98E2, 0x98E2, 0x1018,
+ 0x98ED, 0x98ED, 0x1CC2, 0x98EE, 0x98EE, 0x18F2, 0x98EF, 0x98EF, 0x1341,
+ 0x98F4, 0x98F4, 0x1923, 0x98FC, 0x98FC, 0x14B2, 0x98FD, 0x98FD, 0x1D91,
+ 0x98FE, 0x98FE, 0x1666, 0x9903, 0x9903, 0x0F32, 0x9909, 0x9909, 0x1E24,
+ 0x990A, 0x990A, 0x170D, 0x990C, 0x990C, 0x1924, 0x9910, 0x9910, 0x1BA3,
+ 0x9913, 0x9913, 0x169E, 0x9918, 0x9918, 0x173A, 0x991E, 0x991E, 0x1A1B,
+ 0x9920, 0x9920, 0x13C0, 0x9928, 0x9928, 0x0EFA, 0x9945, 0x9945, 0x124F,
+ 0x9949, 0x9949, 0x0FC5, 0x994B, 0x994B, 0x0F95, 0x994C, 0x994C, 0x1BA4,
+ 0x994D, 0x994D, 0x1548, 0x9951, 0x9951, 0x1019, 0x9952, 0x9952, 0x1817,
+ 0x9954, 0x9954, 0x17D2, 0x9957, 0x9957, 0x1E25, 0x9996, 0x9996, 0x15F9,
+ 0x9999, 0x9999, 0x1E26, 0x999D, 0x999D, 0x1DBD, 0x99A5, 0x99A5, 0x13E1,
+ 0x99A8, 0x99A8, 0x1E6E, 0x99AC, 0x99AC, 0x1235, 0x99AD, 0x99AD, 0x1715,
+ 0x99AE, 0x99AE, 0x1DAC, 0x99B1, 0x99B1, 0x1CE0, 0x99B3, 0x99B3, 0x1CBE,
+ 0x99B4, 0x99B4, 0x1622, 0x99B9, 0x99B9, 0x1944, 0x99C1, 0x99C1, 0x1328,
+ 0x99D0, 0x99D0, 0x1AF3, 0x99D1, 0x99D1, 0x104E, 0x99D2, 0x99D2, 0x0F66,
+ 0x99D5, 0x99D5, 0x0D88, 0x99D9, 0x99D9, 0x141D, 0x99DD, 0x99DD, 0x1CE1,
+ 0x99DF, 0x99DF, 0x14B3, 0x99ED, 0x99ED, 0x1E15, 0x99F1, 0x99F1, 0x1124,
+ 0x99FF, 0x99FF, 0x1B08, 0x9A01, 0x9A01, 0x1478, 0x9A08, 0x9A08, 0x13C1,
+ 0x9A0E, 0x9A0F, 0x101A, 0x9A19, 0x9A19, 0x1D67, 0x9A2B, 0x9A2B, 0x0E1C,
+ 0x9A30, 0x9A30, 0x1115, 0x9A36, 0x9A36, 0x1C76, 0x9A37, 0x9A37, 0x15A0,
+ 0x9A40, 0x9A40, 0x1275, 0x9A43, 0x9A43, 0x1DA5, 0x9A45, 0x9A45, 0x0F67,
+ 0x9A4D, 0x9A4D, 0x1F1D, 0x9A55, 0x9A55, 0x0F33, 0x9A57, 0x9A57, 0x1E31,
+ 0x9A5A, 0x9A5A, 0x0E77, 0x9A5B, 0x9A5B, 0x1743, 0x9A5F, 0x9A5F, 0x1CA0,
+ 0x9A62, 0x9A62, 0x1166, 0x9A65, 0x9A65, 0x101C, 0x9A69, 0x9A69, 0x1ED9,
+ 0x9A6A, 0x9A6A, 0x1167, 0x9AA8, 0x9AA8, 0x0EC9, 0x9AB8, 0x9AB8, 0x1E16,
+ 0x9AD3, 0x9AD3, 0x15FA, 0x9AD4, 0x9AD4, 0x1C2D, 0x9AD8, 0x9AD8, 0x0EB5,
+ 0x9AE5, 0x9AE5, 0x176D, 0x9AEE, 0x9AEE, 0x134B, 0x9B1A, 0x9B1A, 0x15FB,
+ 0x9B27, 0x9B27, 0x11D2, 0x9B2A, 0x9B2A, 0x1D2E, 0x9B31, 0x9B31, 0x186B,
+ 0x9B3C, 0x9B3C, 0x0F99, 0x9B41, 0x9B41, 0x0F17, 0x9B42, 0x9B42, 0x1EA9,
+ 0x9B43, 0x9B43, 0x134C, 0x9B44, 0x9B44, 0x1383, 0x9B45, 0x9B45, 0x1271,
+ 0x9B4F, 0x9B4F, 0x18A4, 0x9B54, 0x9B54, 0x1236, 0x9B5A, 0x9B5A, 0x1716,
+ 0x9B6F, 0x9B6F, 0x11AD, 0x9B8E, 0x9B8E, 0x1A2B, 0x9B91, 0x9B91, 0x1D92,
+ 0x9B9F, 0x9B9F, 0x16B8, 0x9BAB, 0x9BAB, 0x0F34, 0x9BAE, 0x9BAE, 0x1549,
+ 0x9BC9, 0x9BC9, 0x121D, 0x9BD6, 0x9BD6, 0x1C24, 0x9BE4, 0x9BE4, 0x0EC7,
+ 0x9BE8, 0x9BE8, 0x0E78, 0x9C0D, 0x9C0D, 0x1C77, 0x9C10, 0x9C10, 0x16AD,
+ 0x9C12, 0x9C12, 0x13E2, 0x9C15, 0x9C15, 0x1DCD, 0x9C25, 0x9C25, 0x1EDA,
+ 0x9C32, 0x9C32, 0x17BC, 0x9C3B, 0x9C3B, 0x1250, 0x9C47, 0x9C47, 0x0DE7,
+ 0x9C49, 0x9C49, 0x13AF, 0x9C57, 0x9C57, 0x1225, 0x9CE5, 0x9CE5, 0x1AAB,
+ 0x9CE7, 0x9CE7, 0x141E, 0x9CE9, 0x9CE9, 0x0F68, 0x9CF3, 0x9CF3, 0x13F4,
+ 0x9CF4, 0x9CF4, 0x129A, 0x9CF6, 0x9CF6, 0x1760, 0x9D09, 0x9D09, 0x169F,
+ 0x9D1B, 0x9D1B, 0x1888, 0x9D26, 0x9D26, 0x16CF, 0x9D28, 0x9D28, 0x16C8,
+ 0x9D3B, 0x9D3B, 0x1EB6, 0x9D51, 0x9D51, 0x0E3F, 0x9D5D, 0x9D5D, 0x16A0,
+ 0x9D60, 0x9D60, 0x0EBD, 0x9D61, 0x9D61, 0x12E1, 0x9D6C, 0x9D6C, 0x143C,
+ 0x9D72, 0x9D72, 0x1979, 0x9DA9, 0x9DA9, 0x12BA, 0x9DAF, 0x9DAF, 0x16E4,
+ 0x9DB4, 0x9DB4, 0x1DD2, 0x9DC4, 0x9DC4, 0x0E90, 0x9DD7, 0x9DD7, 0x0F69,
+ 0x9DF2, 0x9DF2, 0x1CA1, 0x9DF8, 0x9DF8, 0x1F4C, 0x9DF9, 0x9DF9, 0x18F9,
+ 0x9DFA, 0x9DFA, 0x11AE, 0x9E1A, 0x9E1A, 0x16E5, 0x9E1E, 0x9E1E, 0x112C,
+ 0x9E75, 0x9E75, 0x11AF, 0x9E79, 0x9E79, 0x1DEE, 0x9E7D, 0x9E7D, 0x176E,
+ 0x9E7F, 0x9E7F, 0x11B5, 0x9E92, 0x9E92, 0x101D, 0x9E93, 0x9E93, 0x11B6,
+ 0x9E97, 0x9E97, 0x1168, 0x9E9D, 0x9E9D, 0x14B4, 0x9E9F, 0x9E9F, 0x1226,
+ 0x9EA5, 0x9EA5, 0x1276, 0x9EB4, 0x9EB4, 0x0F70, 0x9EB5, 0x9EB5, 0x1289,
+ 0x9EBB, 0x9EBB, 0x1237, 0x9EBE, 0x9EBE, 0x1F44, 0x9EC3, 0x9EC3, 0x1EF7,
+ 0x9ECD, 0x9ECD, 0x1519, 0x9ECE, 0x9ECE, 0x1169, 0x9ED1, 0x9ED1, 0x1F52,
+ 0x9ED4, 0x9ED4, 0x0E27, 0x9ED8, 0x9ED8, 0x12E3, 0x9EDB, 0x9EDB, 0x10A9,
+ 0x9EDC, 0x9EDC, 0x1C89, 0x9EDE, 0x9EDE, 0x1A2C, 0x9EE8, 0x9EE8, 0x1099,
+ 0x9EF4, 0x9EF4, 0x1305, 0x9F07, 0x9F07, 0x17BD, 0x9F08, 0x9F08, 0x13B0,
+ 0x9F0E, 0x9F0E, 0x1A66, 0x9F13, 0x9F13, 0x0EB6, 0x9F20, 0x9F20, 0x151A,
+ 0x9F3B, 0x9F3B, 0x1466, 0x9F4A, 0x9F4A, 0x1A7D, 0x9F4B, 0x9F4B, 0x19B9,
+ 0x9F4E, 0x9F4E, 0x19BA, 0x9F52, 0x9F52, 0x1CBF, 0x9F5F, 0x9F5F, 0x19DA,
+ 0x9F61, 0x9F61, 0x1199, 0x9F67, 0x9F67, 0x1556, 0x9F6A, 0x9F6A, 0x1B95,
+ 0x9F6C, 0x9F6C, 0x1717, 0x9F77, 0x9F77, 0x16AE, 0x9F8D, 0x9F8D, 0x11D3,
+ 0x9F90, 0x9F90, 0x1368, 0x9F95, 0x9F95, 0x0DC9, 0x9F9C, 0x9F9C, 0x0F6A,
+ 0xAC00, 0xAC01, 0x043E, 0xAC02, 0xAC03, 0x2475, 0xAC04, 0xAC04, 0x0440,
+ 0xAC05, 0xAC06, 0x2477, 0xAC07, 0xAC0A, 0x0441, 0xAC0B, 0xAC0F, 0x2479,
+ 0xAC10, 0xAC17, 0x0445, 0xAC18, 0xAC18, 0x247E, 0xAC19, 0xAC1D, 0x044D,
+ 0xAC1E, 0xAC1F, 0x247F, 0xAC20, 0xAC20, 0x0452, 0xAC21, 0xAC23, 0x2481,
+ 0xAC24, 0xAC24, 0x0453, 0xAC25, 0xAC2B, 0x2484, 0xAC2C, 0xAC2D, 0x0454,
+ 0xAC2E, 0xAC2E, 0x248B, 0xAC2F, 0xAC31, 0x0456, 0xAC32, 0xAC37, 0x248C,
+ 0xAC38, 0xAC39, 0x0459, 0xAC3A, 0xAC3B, 0x2492, 0xAC3C, 0xAC3C, 0x045B,
+ 0xAC3D, 0xAC3F, 0x2494, 0xAC40, 0xAC40, 0x045C, 0xAC41, 0xAC4A, 0x2497,
+ 0xAC4B, 0xAC4B, 0x045D, 0xAC4C, 0xAC4C, 0x24A1, 0xAC4D, 0xAC4D, 0x045E,
+ 0xAC4E, 0xAC53, 0x24A2, 0xAC54, 0xAC54, 0x045F, 0xAC55, 0xAC57, 0x24A8,
+ 0xAC58, 0xAC58, 0x0460, 0xAC59, 0xAC5B, 0x24AB, 0xAC5C, 0xAC5C, 0x0461,
+ 0xAC5D, 0xAC6F, 0x24AE, 0xAC70, 0xAC71, 0x0462, 0xAC72, 0xAC73, 0x24C1,
+ 0xAC74, 0xAC74, 0x0464, 0xAC75, 0xAC76, 0x24C3, 0xAC77, 0xAC78, 0x0465,
+ 0xAC79, 0xAC79, 0x24C5, 0xAC7A, 0xAC7A, 0x0467, 0xAC7B, 0xAC7F, 0x24C6,
+ 0xAC80, 0xAC81, 0x0468, 0xAC82, 0xAC82, 0x24CB, 0xAC83, 0xAC86, 0x046A,
+ 0xAC87, 0xAC88, 0x24CC, 0xAC89, 0xAC8C, 0x046E, 0xAC8D, 0xAC8F, 0x24CE,
+ 0xAC90, 0xAC90, 0x0472, 0xAC91, 0xAC93, 0x24D1, 0xAC94, 0xAC94, 0x0473,
+ 0xAC95, 0xAC9B, 0x24D4, 0xAC9C, 0xAC9D, 0x0474, 0xAC9E, 0xAC9E, 0x24DB,
+ 0xAC9F, 0xACA1, 0x0476, 0xACA2, 0xACA7, 0x24DC, 0xACA8, 0xACAA, 0x0479,
+ 0xACAB, 0xACAB, 0x24E2, 0xACAC, 0xACAC, 0x047C, 0xACAD, 0xACAE, 0x24E3,
+ 0xACAF, 0xACB0, 0x047D, 0xACB1, 0xACB7, 0x24E5, 0xACB8, 0xACB9, 0x047F,
+ 0xACBA, 0xACBA, 0x24EC, 0xACBB, 0xACBD, 0x0481, 0xACBE, 0xACC0, 0x24ED,
+ 0xACC1, 0xACC1, 0x0484, 0xACC2, 0xACC3, 0x24F0, 0xACC4, 0xACC4, 0x0485,
+ 0xACC5, 0xACC7, 0x24F2, 0xACC8, 0xACC8, 0x0486, 0xACC9, 0xACCB, 0x24F5,
+ 0xACCC, 0xACCC, 0x0487, 0xACCD, 0xACD4, 0x24F8, 0xACD5, 0xACD5, 0x0488,
+ 0xACD6, 0xACD6, 0x2500, 0xACD7, 0xACD7, 0x0489, 0xACD8, 0xACDF, 0x2501,
+ 0xACE0, 0xACE1, 0x048A, 0xACE2, 0xACE3, 0x2509, 0xACE4, 0xACE4, 0x048C,
+ 0xACE5, 0xACE6, 0x250B, 0xACE7, 0xACE8, 0x048D, 0xACE9, 0xACE9, 0x250D,
+ 0xACEA, 0xACEA, 0x048F, 0xACEB, 0xACEB, 0x250E, 0xACEC, 0xACEC, 0x0490,
+ 0xACED, 0xACEE, 0x250F, 0xACEF, 0xACF1, 0x0491, 0xACF2, 0xACF2, 0x2511,
+ 0xACF3, 0xACF3, 0x0494, 0xACF4, 0xACF4, 0x2512, 0xACF5, 0xACF6, 0x0495,
+ 0xACF7, 0xACFB, 0x2513, 0xACFC, 0xACFD, 0x0497, 0xACFE, 0xACFF, 0x2518,
+ 0xAD00, 0xAD00, 0x0499, 0xAD01, 0xAD03, 0x251A, 0xAD04, 0xAD04, 0x049A,
+ 0xAD05, 0xAD05, 0x251D, 0xAD06, 0xAD06, 0x049B, 0xAD07, 0xAD0B, 0x251E,
+ 0xAD0C, 0xAD0D, 0x049C, 0xAD0E, 0xAD0E, 0x2523, 0xAD0F, 0xAD0F, 0x049E,
+ 0xAD10, 0xAD10, 0x2524, 0xAD11, 0xAD11, 0x049F, 0xAD12, 0xAD17, 0x2525,
+ 0xAD18, 0xAD18, 0x04A0, 0xAD19, 0xAD1B, 0x252B, 0xAD1C, 0xAD1C, 0x04A1,
+ 0xAD1D, 0xAD1F, 0x252E, 0xAD20, 0xAD20, 0x04A2, 0xAD21, 0xAD28, 0x2531,
+ 0xAD29, 0xAD29, 0x04A3, 0xAD2A, 0xAD2B, 0x2539, 0xAD2C, 0xAD2D, 0x04A4,
+ 0xAD2E, 0xAD33, 0x253B, 0xAD34, 0xAD35, 0x04A6, 0xAD36, 0xAD37, 0x2541,
+ 0xAD38, 0xAD38, 0x04A8, 0xAD39, 0xAD3B, 0x2543, 0xAD3C, 0xAD3C, 0x04A9,
+ 0xAD3D, 0xAD43, 0x2546, 0xAD44, 0xAD45, 0x04AA, 0xAD46, 0xAD46, 0x254D,
+ 0xAD47, 0xAD47, 0x04AC, 0xAD48, 0xAD48, 0x254E, 0xAD49, 0xAD49, 0x04AD,
+ 0xAD4A, 0xAD4F, 0x254F, 0xAD50, 0xAD50, 0x04AE, 0xAD51, 0xAD53, 0x2555,
+ 0xAD54, 0xAD54, 0x04AF, 0xAD55, 0xAD57, 0x2558, 0xAD58, 0xAD58, 0x04B0,
+ 0xAD59, 0xAD60, 0x255B, 0xAD61, 0xAD61, 0x04B1, 0xAD62, 0xAD62, 0x2563,
+ 0xAD63, 0xAD63, 0x04B2, 0xAD64, 0xAD6B, 0x2564, 0xAD6C, 0xAD6D, 0x04B3,
+ 0xAD6E, 0xAD6F, 0x256C, 0xAD70, 0xAD70, 0x04B5, 0xAD71, 0xAD72, 0x256E,
+ 0xAD73, 0xAD76, 0x04B6, 0xAD77, 0xAD7A, 0x2570, 0xAD7B, 0xAD7D, 0x04BA,
+ 0xAD7E, 0xAD7E, 0x2574, 0xAD7F, 0xAD7F, 0x04BD, 0xAD80, 0xAD80, 0x2575,
+ 0xAD81, 0xAD82, 0x04BE, 0xAD83, 0xAD87, 0x2576, 0xAD88, 0xAD89, 0x04C0,
+ 0xAD8A, 0xAD8B, 0x257B, 0xAD8C, 0xAD8C, 0x04C2, 0xAD8D, 0xAD8F, 0x257D,
+ 0xAD90, 0xAD90, 0x04C3, 0xAD91, 0xAD9B, 0x2580, 0xAD9C, 0xAD9D, 0x04C4,
+ 0xAD9E, 0xADA3, 0x258B, 0xADA4, 0xADA4, 0x04C6, 0xADA5, 0xADB6, 0x2591,
+ 0xADB7, 0xADB7, 0x04C7, 0xADB8, 0xADBF, 0x25A3, 0xADC0, 0xADC1, 0x04C8,
+ 0xADC2, 0xADC3, 0x25AB, 0xADC4, 0xADC4, 0x04CA, 0xADC5, 0xADC7, 0x25AD,
+ 0xADC8, 0xADC8, 0x04CB, 0xADC9, 0xADCF, 0x25B0, 0xADD0, 0xADD1, 0x04CC,
+ 0xADD2, 0xADD2, 0x25B7, 0xADD3, 0xADD3, 0x04CE, 0xADD4, 0xADDB, 0x25B8,
+ 0xADDC, 0xADDC, 0x04CF, 0xADDD, 0xADDF, 0x25C0, 0xADE0, 0xADE0, 0x04D0,
+ 0xADE1, 0xADE3, 0x25C3, 0xADE4, 0xADE4, 0x04D1, 0xADE5, 0xADF7, 0x25C6,
+ 0xADF8, 0xADF9, 0x04D2, 0xADFA, 0xADFB, 0x25D9, 0xADFC, 0xADFC, 0x04D4,
+ 0xADFD, 0xADFE, 0x25DB, 0xADFF, 0xADFF, 0x04D5, 0xAE00, 0xAE01, 0x04D6,
+ 0xAE02, 0xAE07, 0x25DD, 0xAE08, 0xAE09, 0x04D8, 0xAE0A, 0xAE0A, 0x25E3,
+ 0xAE0B, 0xAE0B, 0x04DA, 0xAE0C, 0xAE0C, 0x25E4, 0xAE0D, 0xAE0D, 0x04DB,
+ 0xAE0E, 0xAE13, 0x25E5, 0xAE14, 0xAE14, 0x04DC, 0xAE15, 0xAE2F, 0x25EB,
+ 0xAE30, 0xAE31, 0x04DD, 0xAE32, 0xAE33, 0x2606, 0xAE34, 0xAE34, 0x04DF,
+ 0xAE35, 0xAE36, 0x2608, 0xAE37, 0xAE38, 0x04E0, 0xAE39, 0xAE39, 0x260A,
+ 0xAE3A, 0xAE3A, 0x04E2, 0xAE3B, 0xAE3F, 0x260B, 0xAE40, 0xAE41, 0x04E3,
+ 0xAE42, 0xAE42, 0x2610, 0xAE43, 0xAE43, 0x04E5, 0xAE44, 0xAE44, 0x2611,
+ 0xAE45, 0xAE46, 0x04E6, 0xAE47, 0xAE49, 0x2612, 0xAE4A, 0xAE4A, 0x04E8,
+ 0xAE4B, 0xAE4B, 0x2615, 0xAE4C, 0xAE4E, 0x04E9, 0xAE4F, 0xAE4F, 0x2616,
+ 0xAE50, 0xAE50, 0x04EC, 0xAE51, 0xAE53, 0x2617, 0xAE54, 0xAE54, 0x04ED,
+ 0xAE55, 0xAE55, 0x261A, 0xAE56, 0xAE56, 0x04EE, 0xAE57, 0xAE5B, 0x261B,
+ 0xAE5C, 0xAE5D, 0x04EF, 0xAE5E, 0xAE5E, 0x2620, 0xAE5F, 0xAE61, 0x04F1,
+ 0xAE62, 0xAE64, 0x2621, 0xAE65, 0xAE65, 0x04F4, 0xAE66, 0xAE67, 0x2624,
+ 0xAE68, 0xAE69, 0x04F5, 0xAE6A, 0xAE6B, 0x2626, 0xAE6C, 0xAE6C, 0x04F7,
+ 0xAE6D, 0xAE6F, 0x2628, 0xAE70, 0xAE70, 0x04F8, 0xAE71, 0xAE77, 0x262B,
+ 0xAE78, 0xAE79, 0x04F9, 0xAE7A, 0xAE7A, 0x2632, 0xAE7B, 0xAE7D, 0x04FB,
+ 0xAE7E, 0xAE83, 0x2633, 0xAE84, 0xAE85, 0x04FE, 0xAE86, 0xAE8B, 0x2639,
+ 0xAE8C, 0xAE8C, 0x0500, 0xAE8D, 0xAEBB, 0x263F, 0xAEBC, 0xAEBE, 0x0501,
+ 0xAEBF, 0xAEBF, 0x266E, 0xAEC0, 0xAEC0, 0x0504, 0xAEC1, 0xAEC3, 0x266F,
+ 0xAEC4, 0xAEC4, 0x0505, 0xAEC5, 0xAECB, 0x2672, 0xAECC, 0xAECD, 0x0506,
+ 0xAECE, 0xAECE, 0x2679, 0xAECF, 0xAED1, 0x0508, 0xAED2, 0xAED7, 0x267A,
+ 0xAED8, 0xAED9, 0x050B, 0xAEDA, 0xAEDB, 0x2680, 0xAEDC, 0xAEDC, 0x050D,
+ 0xAEDD, 0xAEE7, 0x2682, 0xAEE8, 0xAEE8, 0x050E, 0xAEE9, 0xAEEA, 0x268D,
+ 0xAEEB, 0xAEEB, 0x050F, 0xAEEC, 0xAEEC, 0x268F, 0xAEED, 0xAEED, 0x0510,
+ 0xAEEE, 0xAEF3, 0x2690, 0xAEF4, 0xAEF4, 0x0511, 0xAEF5, 0xAEF7, 0x2696,
+ 0xAEF8, 0xAEF8, 0x0512, 0xAEF9, 0xAEFB, 0x2699, 0xAEFC, 0xAEFC, 0x0513,
+ 0xAEFD, 0xAEFF, 0x269C, 0xAF00, 0xAF06, 0x269F, 0xAF07, 0xAF08, 0x0514,
+ 0xAF09, 0xAF0C, 0x26A6, 0xAF0D, 0xAF0D, 0x0516, 0xAF0E, 0xAF0F, 0x26AA,
+ 0xAF10, 0xAF10, 0x0517, 0xAF11, 0xAF2B, 0x26AC, 0xAF2C, 0xAF2D, 0x0518,
+ 0xAF2E, 0xAF2F, 0x26C7, 0xAF30, 0xAF30, 0x051A, 0xAF31, 0xAF31, 0x26C9,
+ 0xAF32, 0xAF32, 0x051B, 0xAF33, 0xAF33, 0x26CA, 0xAF34, 0xAF34, 0x051C,
+ 0xAF35, 0xAF3B, 0x26CB, 0xAF3C, 0xAF3D, 0x051D, 0xAF3E, 0xAF3E, 0x26D2,
+ 0xAF3F, 0xAF3F, 0x051F, 0xAF40, 0xAF40, 0x26D3, 0xAF41, 0xAF43, 0x0520,
+ 0xAF44, 0xAF47, 0x26D4, 0xAF48, 0xAF49, 0x0523, 0xAF4A, 0xAF4F, 0x26D8,
+ 0xAF50, 0xAF50, 0x0525, 0xAF51, 0xAF5B, 0x26DE, 0xAF5C, 0xAF5D, 0x0526,
+ 0xAF5E, 0xAF63, 0x26E9, 0xAF64, 0xAF65, 0x0528, 0xAF66, 0xAF78, 0x26EF,
+ 0xAF79, 0xAF79, 0x052A, 0xAF7A, 0xAF7F, 0x2702, 0xAF80, 0xAF80, 0x052B,
+ 0xAF81, 0xAF83, 0x2708, 0xAF84, 0xAF84, 0x052C, 0xAF85, 0xAF87, 0x270B,
+ 0xAF88, 0xAF88, 0x052D, 0xAF89, 0xAF8F, 0x270E, 0xAF90, 0xAF91, 0x052E,
+ 0xAF92, 0xAF94, 0x2715, 0xAF95, 0xAF95, 0x0530, 0xAF96, 0xAF9B, 0x2718,
+ 0xAF9C, 0xAF9C, 0x0531, 0xAF9D, 0xAFB7, 0x271E, 0xAFB8, 0xAFB9, 0x0532,
+ 0xAFBA, 0xAFBB, 0x2739, 0xAFBC, 0xAFBC, 0x0534, 0xAFBD, 0xAFBF, 0x273B,
+ 0xAFC0, 0xAFC0, 0x0535, 0xAFC1, 0xAFC6, 0x273E, 0xAFC7, 0xAFC9, 0x0536,
+ 0xAFCA, 0xAFCA, 0x2744, 0xAFCB, 0xAFCB, 0x0539, 0xAFCC, 0xAFCC, 0x2745,
+ 0xAFCD, 0xAFCE, 0x053A, 0xAFCF, 0xAFD3, 0x2746, 0xAFD4, 0xAFD4, 0x053C,
+ 0xAFD5, 0xAFDB, 0x274B, 0xAFDC, 0xAFDC, 0x053D, 0xAFDD, 0xAFE7, 0x2752,
+ 0xAFE8, 0xAFE9, 0x053E, 0xAFEA, 0xAFEF, 0x275D, 0xAFF0, 0xAFF1, 0x0540,
+ 0xAFF2, 0xAFF3, 0x2763, 0xAFF4, 0xAFF4, 0x0542, 0xAFF5, 0xAFF7, 0x2765,
+ 0xAFF8, 0xAFF8, 0x0543, 0xAFF9, 0xAFFF, 0x2768, 0xB000, 0xB001, 0x0544,
+ 0xB002, 0xB003, 0x276F, 0xB004, 0xB004, 0x0546, 0xB005, 0xB00B, 0x2771,
+ 0xB00C, 0xB00C, 0x0547, 0xB00D, 0xB00F, 0x2778, 0xB010, 0xB010, 0x0548,
+ 0xB011, 0xB013, 0x277B, 0xB014, 0xB014, 0x0549, 0xB015, 0xB01B, 0x277E,
+ 0xB01C, 0xB01D, 0x054A, 0xB01E, 0xB027, 0x2785, 0xB028, 0xB028, 0x054C,
+ 0xB029, 0xB043, 0x278F, 0xB044, 0xB045, 0x054D, 0xB046, 0xB047, 0x27AA,
+ 0xB048, 0xB048, 0x054F, 0xB049, 0xB049, 0x27AC, 0xB04A, 0xB04A, 0x0550,
+ 0xB04B, 0xB04B, 0x27AD, 0xB04C, 0xB04C, 0x0551, 0xB04D, 0xB04D, 0x27AE,
+ 0xB04E, 0xB04E, 0x0552, 0xB04F, 0xB052, 0x27AF, 0xB053, 0xB055, 0x0553,
+ 0xB056, 0xB056, 0x27B3, 0xB057, 0xB057, 0x0556, 0xB058, 0xB058, 0x27B4,
+ 0xB059, 0xB059, 0x0557, 0xB05A, 0xB05C, 0x27B5, 0xB05D, 0xB05D, 0x0558,
+ 0xB05E, 0xB07B, 0x27B8, 0xB07C, 0xB07D, 0x0559, 0xB07E, 0xB07F, 0x27D6,
+ 0xB080, 0xB080, 0x055B, 0xB081, 0xB083, 0x27D8, 0xB084, 0xB084, 0x055C,
+ 0xB085, 0xB08B, 0x27DB, 0xB08C, 0xB08D, 0x055D, 0xB08E, 0xB08E, 0x27E2,
+ 0xB08F, 0xB08F, 0x055F, 0xB090, 0xB090, 0x27E3, 0xB091, 0xB091, 0x0560,
+ 0xB092, 0xB097, 0x27E4, 0xB098, 0xB09A, 0x0561, 0xB09B, 0xB09B, 0x27EA,
+ 0xB09C, 0xB09C, 0x0564, 0xB09D, 0xB09E, 0x27EB, 0xB09F, 0xB0A2, 0x0565,
+ 0xB0A3, 0xB0A7, 0x27ED, 0xB0A8, 0xB0A9, 0x0569, 0xB0AA, 0xB0AA, 0x27F2,
+ 0xB0AB, 0xB0AF, 0x056B, 0xB0B0, 0xB0B0, 0x27F3, 0xB0B1, 0xB0B1, 0x0570,
+ 0xB0B2, 0xB0B2, 0x27F4, 0xB0B3, 0xB0B5, 0x0571, 0xB0B6, 0xB0B7, 0x27F5,
+ 0xB0B8, 0xB0B8, 0x0574, 0xB0B9, 0xB0BB, 0x27F7, 0xB0BC, 0xB0BC, 0x0575,
+ 0xB0BD, 0xB0C3, 0x27FA, 0xB0C4, 0xB0C5, 0x0576, 0xB0C6, 0xB0C6, 0x2801,
+ 0xB0C7, 0xB0C9, 0x0578, 0xB0CA, 0xB0CF, 0x2802, 0xB0D0, 0xB0D1, 0x057B,
+ 0xB0D2, 0xB0D3, 0x2808, 0xB0D4, 0xB0D4, 0x057D, 0xB0D5, 0xB0D7, 0x280A,
+ 0xB0D8, 0xB0D8, 0x057E, 0xB0D9, 0xB0DF, 0x280D, 0xB0E0, 0xB0E0, 0x057F,
+ 0xB0E1, 0xB0E4, 0x2814, 0xB0E5, 0xB0E5, 0x0580, 0xB0E6, 0xB0FF, 0x2818,
+ 0xB100, 0xB107, 0x2832, 0xB108, 0xB109, 0x0581, 0xB10A, 0xB10A, 0x283A,
+ 0xB10B, 0xB10C, 0x0583, 0xB10D, 0xB10F, 0x283B, 0xB110, 0xB110, 0x0585,
+ 0xB111, 0xB111, 0x283E, 0xB112, 0xB113, 0x0586, 0xB114, 0xB117, 0x283F,
+ 0xB118, 0xB119, 0x0588, 0xB11A, 0xB11A, 0x2843, 0xB11B, 0xB11D, 0x058A,
+ 0xB11E, 0xB122, 0x2844, 0xB123, 0xB125, 0x058D, 0xB126, 0xB127, 0x2849,
+ 0xB128, 0xB128, 0x0590, 0xB129, 0xB12B, 0x284B, 0xB12C, 0xB12C, 0x0591,
+ 0xB12D, 0xB133, 0x284E, 0xB134, 0xB135, 0x0592, 0xB136, 0xB136, 0x2855,
+ 0xB137, 0xB139, 0x0594, 0xB13A, 0xB13F, 0x2856, 0xB140, 0xB141, 0x0597,
+ 0xB142, 0xB143, 0x285C, 0xB144, 0xB144, 0x0599, 0xB145, 0xB147, 0x285E,
+ 0xB148, 0xB148, 0x059A, 0xB149, 0xB14F, 0x2861, 0xB150, 0xB151, 0x059B,
+ 0xB152, 0xB153, 0x2868, 0xB154, 0xB155, 0x059D, 0xB156, 0xB157, 0x286A,
+ 0xB158, 0xB158, 0x059F, 0xB159, 0xB15B, 0x286C, 0xB15C, 0xB15C, 0x05A0,
+ 0xB15D, 0xB15F, 0x286F, 0xB160, 0xB160, 0x05A1, 0xB161, 0xB177, 0x2872,
+ 0xB178, 0xB179, 0x05A2, 0xB17A, 0xB17B, 0x2889, 0xB17C, 0xB17C, 0x05A4,
+ 0xB17D, 0xB17F, 0x288B, 0xB180, 0xB180, 0x05A5, 0xB181, 0xB181, 0x288E,
+ 0xB182, 0xB182, 0x05A6, 0xB183, 0xB187, 0x288F, 0xB188, 0xB189, 0x05A7,
+ 0xB18A, 0xB18A, 0x2894, 0xB18B, 0xB18B, 0x05A9, 0xB18C, 0xB18C, 0x2895,
+ 0xB18D, 0xB18D, 0x05AA, 0xB18E, 0xB191, 0x2896, 0xB192, 0xB194, 0x05AB,
+ 0xB195, 0xB197, 0x289A, 0xB198, 0xB198, 0x05AE, 0xB199, 0xB19B, 0x289D,
+ 0xB19C, 0xB19C, 0x05AF, 0xB19D, 0xB1A7, 0x28A0, 0xB1A8, 0xB1A8, 0x05B0,
+ 0xB1A9, 0xB1CB, 0x28AB, 0xB1CC, 0xB1CC, 0x05B1, 0xB1CD, 0xB1CF, 0x28CE,
+ 0xB1D0, 0xB1D0, 0x05B2, 0xB1D1, 0xB1D3, 0x28D1, 0xB1D4, 0xB1D4, 0x05B3,
+ 0xB1D5, 0xB1DB, 0x28D4, 0xB1DC, 0xB1DD, 0x05B4, 0xB1DE, 0xB1DE, 0x28DB,
+ 0xB1DF, 0xB1DF, 0x05B6, 0xB1E0, 0xB1E7, 0x28DC, 0xB1E8, 0xB1E9, 0x05B7,
+ 0xB1EA, 0xB1EB, 0x28E4, 0xB1EC, 0xB1EC, 0x05B9, 0xB1ED, 0xB1EF, 0x28E6,
+ 0xB1F0, 0xB1F0, 0x05BA, 0xB1F1, 0xB1F8, 0x28E9, 0xB1F9, 0xB1F9, 0x05BB,
+ 0xB1FA, 0xB1FA, 0x28F1, 0xB1FB, 0xB1FB, 0x05BC, 0xB1FC, 0xB1FC, 0x28F2,
+ 0xB1FD, 0xB1FD, 0x05BD, 0xB1FE, 0xB1FF, 0x28F3, 0xB200, 0xB203, 0x28F5,
+ 0xB204, 0xB205, 0x05BE, 0xB206, 0xB207, 0x28F9, 0xB208, 0xB208, 0x05C0,
+ 0xB209, 0xB20A, 0x28FB, 0xB20B, 0xB20C, 0x05C1, 0xB20D, 0xB213, 0x28FD,
+ 0xB214, 0xB215, 0x05C3, 0xB216, 0xB216, 0x2904, 0xB217, 0xB217, 0x05C5,
+ 0xB218, 0xB218, 0x2905, 0xB219, 0xB219, 0x05C6, 0xB21A, 0xB21F, 0x2906,
+ 0xB220, 0xB220, 0x05C7, 0xB221, 0xB233, 0x290C, 0xB234, 0xB234, 0x05C8,
+ 0xB235, 0xB23B, 0x291F, 0xB23C, 0xB23C, 0x05C9, 0xB23D, 0xB257, 0x2926,
+ 0xB258, 0xB258, 0x05CA, 0xB259, 0xB25B, 0x2941, 0xB25C, 0xB25C, 0x05CB,
+ 0xB25D, 0xB25F, 0x2944, 0xB260, 0xB260, 0x05CC, 0xB261, 0xB267, 0x2947,
+ 0xB268, 0xB269, 0x05CD, 0xB26A, 0xB273, 0x294E, 0xB274, 0xB275, 0x05CF,
+ 0xB276, 0xB27B, 0x2958, 0xB27C, 0xB27C, 0x05D1, 0xB27D, 0xB283, 0x295E,
+ 0xB284, 0xB285, 0x05D2, 0xB286, 0xB288, 0x2965, 0xB289, 0xB289, 0x05D4,
+ 0xB28A, 0xB28F, 0x2968, 0xB290, 0xB291, 0x05D5, 0xB292, 0xB293, 0x296E,
+ 0xB294, 0xB294, 0x05D7, 0xB295, 0xB297, 0x2970, 0xB298, 0xB29A, 0x05D8,
+ 0xB29B, 0xB29F, 0x2973, 0xB2A0, 0xB2A1, 0x05DB, 0xB2A2, 0xB2A2, 0x2978,
+ 0xB2A3, 0xB2A3, 0x05DD, 0xB2A4, 0xB2A4, 0x2979, 0xB2A5, 0xB2A6, 0x05DE,
+ 0xB2A7, 0xB2A9, 0x297A, 0xB2AA, 0xB2AA, 0x05E0, 0xB2AB, 0xB2AB, 0x297D,
+ 0xB2AC, 0xB2AC, 0x05E1, 0xB2AD, 0xB2AF, 0x297E, 0xB2B0, 0xB2B0, 0x05E2,
+ 0xB2B1, 0xB2B3, 0x2981, 0xB2B4, 0xB2B4, 0x05E3, 0xB2B5, 0xB2C7, 0x2984,
+ 0xB2C8, 0xB2C9, 0x05E4, 0xB2CA, 0xB2CB, 0x2997, 0xB2CC, 0xB2CC, 0x05E6,
+ 0xB2CD, 0xB2CF, 0x2999, 0xB2D0, 0xB2D0, 0x05E7, 0xB2D1, 0xB2D1, 0x299C,
+ 0xB2D2, 0xB2D2, 0x05E8, 0xB2D3, 0xB2D7, 0x299D, 0xB2D8, 0xB2D9, 0x05E9,
+ 0xB2DA, 0xB2DA, 0x29A2, 0xB2DB, 0xB2DB, 0x05EB, 0xB2DC, 0xB2DC, 0x29A3,
+ 0xB2DD, 0xB2DD, 0x05EC, 0xB2DE, 0xB2E1, 0x29A4, 0xB2E2, 0xB2E2, 0x05ED,
+ 0xB2E3, 0xB2E3, 0x29A8, 0xB2E4, 0xB2E6, 0x05EE, 0xB2E7, 0xB2E7, 0x29A9,
+ 0xB2E8, 0xB2E8, 0x05F1, 0xB2E9, 0xB2EA, 0x29AA, 0xB2EB, 0xB2EF, 0x05F2,
+ 0xB2F0, 0xB2F2, 0x29AC, 0xB2F3, 0xB2F5, 0x05F7, 0xB2F6, 0xB2F6, 0x29AF,
+ 0xB2F7, 0xB2FB, 0x05FA, 0xB2FC, 0xB2FE, 0x29B0, 0xB2FF, 0xB2FF, 0x05FF,
+ 0xB300, 0xB301, 0x0600, 0xB302, 0xB303, 0x29B3, 0xB304, 0xB304, 0x0602,
+ 0xB305, 0xB307, 0x29B5, 0xB308, 0xB308, 0x0603, 0xB309, 0xB30F, 0x29B8,
+ 0xB310, 0xB311, 0x0604, 0xB312, 0xB312, 0x29BF, 0xB313, 0xB315, 0x0606,
+ 0xB316, 0xB31B, 0x29C0, 0xB31C, 0xB31C, 0x0609, 0xB31D, 0xB353, 0x29C6,
+ 0xB354, 0xB356, 0x060A, 0xB357, 0xB357, 0x29FD, 0xB358, 0xB358, 0x060D,
+ 0xB359, 0xB35A, 0x29FE, 0xB35B, 0xB35C, 0x060E, 0xB35D, 0xB35D, 0x2A00,
+ 0xB35E, 0xB35F, 0x0610, 0xB360, 0xB363, 0x2A01, 0xB364, 0xB365, 0x0612,
+ 0xB366, 0xB366, 0x2A05, 0xB367, 0xB367, 0x0614, 0xB368, 0xB368, 0x2A06,
+ 0xB369, 0xB369, 0x0615, 0xB36A, 0xB36A, 0x2A07, 0xB36B, 0xB36B, 0x0616,
+ 0xB36C, 0xB36D, 0x2A08, 0xB36E, 0xB36E, 0x0617, 0xB36F, 0xB36F, 0x2A0A,
+ 0xB370, 0xB371, 0x0618, 0xB372, 0xB373, 0x2A0B, 0xB374, 0xB374, 0x061A,
+ 0xB375, 0xB377, 0x2A0D, 0xB378, 0xB378, 0x061B, 0xB379, 0xB37F, 0x2A10,
+ 0xB380, 0xB381, 0x061C, 0xB382, 0xB382, 0x2A17, 0xB383, 0xB385, 0x061E,
+ 0xB386, 0xB38B, 0x2A18, 0xB38C, 0xB38C, 0x0621, 0xB38D, 0xB38F, 0x2A1E,
+ 0xB390, 0xB390, 0x0622, 0xB391, 0xB393, 0x2A21, 0xB394, 0xB394, 0x0623,
+ 0xB395, 0xB39F, 0x2A24, 0xB3A0, 0xB3A1, 0x0624, 0xB3A2, 0xB3A7, 0x2A2F,
+ 0xB3A8, 0xB3A8, 0x0626, 0xB3A9, 0xB3AB, 0x2A35, 0xB3AC, 0xB3AC, 0x0627,
+ 0xB3AD, 0xB3C3, 0x2A38, 0xB3C4, 0xB3C5, 0x0628, 0xB3C6, 0xB3C7, 0x2A4F,
+ 0xB3C8, 0xB3C8, 0x062A, 0xB3C9, 0xB3CA, 0x2A51, 0xB3CB, 0xB3CC, 0x062B,
+ 0xB3CD, 0xB3CD, 0x2A53, 0xB3CE, 0xB3CE, 0x062D, 0xB3CF, 0xB3CF, 0x2A54,
+ 0xB3D0, 0xB3D0, 0x062E, 0xB3D1, 0xB3D3, 0x2A55, 0xB3D4, 0xB3D5, 0x062F,
+ 0xB3D6, 0xB3D6, 0x2A58, 0xB3D7, 0xB3D7, 0x0631, 0xB3D8, 0xB3D8, 0x2A59,
+ 0xB3D9, 0xB3D9, 0x0632, 0xB3DA, 0xB3DA, 0x2A5A, 0xB3DB, 0xB3DB, 0x0633,
+ 0xB3DC, 0xB3DC, 0x2A5B, 0xB3DD, 0xB3DD, 0x0634, 0xB3DE, 0xB3DF, 0x2A5C,
+ 0xB3E0, 0xB3E0, 0x0635, 0xB3E1, 0xB3E3, 0x2A5E, 0xB3E4, 0xB3E4, 0x0636,
+ 0xB3E5, 0xB3E7, 0x2A61, 0xB3E8, 0xB3E8, 0x0637, 0xB3E9, 0xB3FB, 0x2A64,
+ 0xB3FC, 0xB3FC, 0x0638, 0xB3FD, 0xB3FF, 0x2A77, 0xB400, 0xB40F, 0x2A7A,
+ 0xB410, 0xB410, 0x0639, 0xB411, 0xB417, 0x2A8A, 0xB418, 0xB418, 0x063A,
+ 0xB419, 0xB41B, 0x2A91, 0xB41C, 0xB41C, 0x063B, 0xB41D, 0xB41F, 0x2A94,
+ 0xB420, 0xB420, 0x063C, 0xB421, 0xB427, 0x2A97, 0xB428, 0xB429, 0x063D,
+ 0xB42A, 0xB42A, 0x2A9E, 0xB42B, 0xB42B, 0x063F, 0xB42C, 0xB433, 0x2A9F,
+ 0xB434, 0xB434, 0x0640, 0xB435, 0xB44F, 0x2AA7, 0xB450, 0xB451, 0x0641,
+ 0xB452, 0xB453, 0x2AC2, 0xB454, 0xB454, 0x0643, 0xB455, 0xB457, 0x2AC4,
+ 0xB458, 0xB458, 0x0644, 0xB459, 0xB45F, 0x2AC7, 0xB460, 0xB461, 0x0645,
+ 0xB462, 0xB462, 0x2ACE, 0xB463, 0xB463, 0x0647, 0xB464, 0xB464, 0x2ACF,
+ 0xB465, 0xB465, 0x0648, 0xB466, 0xB46B, 0x2AD0, 0xB46C, 0xB46C, 0x0649,
+ 0xB46D, 0xB47F, 0x2AD6, 0xB480, 0xB480, 0x064A, 0xB481, 0xB487, 0x2AE9,
+ 0xB488, 0xB488, 0x064B, 0xB489, 0xB49C, 0x2AF0, 0xB49D, 0xB49D, 0x064C,
+ 0xB49E, 0xB4A3, 0x2B04, 0xB4A4, 0xB4A4, 0x064D, 0xB4A5, 0xB4A7, 0x2B0A,
+ 0xB4A8, 0xB4A8, 0x064E, 0xB4A9, 0xB4AB, 0x2B0D, 0xB4AC, 0xB4AC, 0x064F,
+ 0xB4AD, 0xB4B4, 0x2B10, 0xB4B5, 0xB4B5, 0x0650, 0xB4B6, 0xB4B6, 0x2B18,
+ 0xB4B7, 0xB4B7, 0x0651, 0xB4B8, 0xB4B8, 0x2B19, 0xB4B9, 0xB4B9, 0x0652,
+ 0xB4BA, 0xB4BF, 0x2B1A, 0xB4C0, 0xB4C0, 0x0653, 0xB4C1, 0xB4C3, 0x2B20,
+ 0xB4C4, 0xB4C4, 0x0654, 0xB4C5, 0xB4C7, 0x2B23, 0xB4C8, 0xB4C8, 0x0655,
+ 0xB4C9, 0xB4CF, 0x2B26, 0xB4D0, 0xB4D0, 0x0656, 0xB4D1, 0xB4D4, 0x2B2D,
+ 0xB4D5, 0xB4D5, 0x0657, 0xB4D6, 0xB4DB, 0x2B31, 0xB4DC, 0xB4DD, 0x0658,
+ 0xB4DE, 0xB4DF, 0x2B37, 0xB4E0, 0xB4E0, 0x065A, 0xB4E1, 0xB4E2, 0x2B39,
+ 0xB4E3, 0xB4E4, 0x065B, 0xB4E5, 0xB4E5, 0x2B3B, 0xB4E6, 0xB4E6, 0x065D,
+ 0xB4E7, 0xB4EB, 0x2B3C, 0xB4EC, 0xB4ED, 0x065E, 0xB4EE, 0xB4EE, 0x2B41,
+ 0xB4EF, 0xB4EF, 0x0660, 0xB4F0, 0xB4F0, 0x2B42, 0xB4F1, 0xB4F1, 0x0661,
+ 0xB4F2, 0xB4F7, 0x2B43, 0xB4F8, 0xB4F8, 0x0662, 0xB4F9, 0xB4FF, 0x2B49,
+ 0xB500, 0xB513, 0x2B50, 0xB514, 0xB515, 0x0663, 0xB516, 0xB517, 0x2B64,
+ 0xB518, 0xB518, 0x0665, 0xB519, 0xB51A, 0x2B66, 0xB51B, 0xB51C, 0x0666,
+ 0xB51D, 0xB523, 0x2B68, 0xB524, 0xB525, 0x0668, 0xB526, 0xB526, 0x2B6F,
+ 0xB527, 0xB52A, 0x066A, 0xB52B, 0xB52F, 0x2B70, 0xB530, 0xB531, 0x066E,
+ 0xB532, 0xB533, 0x2B75, 0xB534, 0xB534, 0x0670, 0xB535, 0xB537, 0x2B77,
+ 0xB538, 0xB538, 0x0671, 0xB539, 0xB53F, 0x2B7A, 0xB540, 0xB541, 0x0672,
+ 0xB542, 0xB542, 0x2B81, 0xB543, 0xB545, 0x0674, 0xB546, 0xB54A, 0x2B82,
+ 0xB54B, 0xB54D, 0x0677, 0xB54E, 0xB54F, 0x2B87, 0xB550, 0xB550, 0x067A,
+ 0xB551, 0xB553, 0x2B89, 0xB554, 0xB554, 0x067B, 0xB555, 0xB55B, 0x2B8C,
+ 0xB55C, 0xB55D, 0x067C, 0xB55E, 0xB55E, 0x2B93, 0xB55F, 0xB561, 0x067E,
+ 0xB562, 0xB59F, 0x2B94, 0xB5A0, 0xB5A1, 0x0681, 0xB5A2, 0xB5A3, 0x2BD2,
+ 0xB5A4, 0xB5A4, 0x0683, 0xB5A5, 0xB5A7, 0x2BD4, 0xB5A8, 0xB5A8, 0x0684,
+ 0xB5A9, 0xB5A9, 0x2BD7, 0xB5AA, 0xB5AB, 0x0685, 0xB5AC, 0xB5AF, 0x2BD8,
+ 0xB5B0, 0xB5B1, 0x0687, 0xB5B2, 0xB5B2, 0x2BDC, 0xB5B3, 0xB5B5, 0x0689,
+ 0xB5B6, 0xB5BA, 0x2BDD, 0xB5BB, 0xB5BD, 0x068C, 0xB5BE, 0xB5BF, 0x2BE2,
+ 0xB5C0, 0xB5C0, 0x068F, 0xB5C1, 0xB5C3, 0x2BE4, 0xB5C4, 0xB5C4, 0x0690,
+ 0xB5C5, 0xB5CB, 0x2BE7, 0xB5CC, 0xB5CD, 0x0691, 0xB5CE, 0xB5CE, 0x2BEE,
+ 0xB5CF, 0xB5D1, 0x0693, 0xB5D2, 0xB5D7, 0x2BEF, 0xB5D8, 0xB5D8, 0x0696,
+ 0xB5D9, 0xB5EB, 0x2BF5, 0xB5EC, 0xB5EC, 0x0697, 0xB5ED, 0xB5FF, 0x2C08,
+ 0xB600, 0xB60F, 0x2C1B, 0xB610, 0xB611, 0x0698, 0xB612, 0xB613, 0x2C2B,
+ 0xB614, 0xB614, 0x069A, 0xB615, 0xB617, 0x2C2D, 0xB618, 0xB618, 0x069B,
+ 0xB619, 0xB624, 0x2C30, 0xB625, 0xB625, 0x069C, 0xB626, 0xB62B, 0x2C3C,
+ 0xB62C, 0xB62C, 0x069D, 0xB62D, 0xB633, 0x2C42, 0xB634, 0xB634, 0x069E,
+ 0xB635, 0xB647, 0x2C49, 0xB648, 0xB648, 0x069F, 0xB649, 0xB663, 0x2C5C,
+ 0xB664, 0xB664, 0x06A0, 0xB665, 0xB667, 0x2C77, 0xB668, 0xB668, 0x06A1,
+ 0xB669, 0xB69B, 0x2C7A, 0xB69C, 0xB69D, 0x06A2, 0xB69E, 0xB69F, 0x2CAD,
+ 0xB6A0, 0xB6A0, 0x06A4, 0xB6A1, 0xB6A3, 0x2CAF, 0xB6A4, 0xB6A4, 0x06A5,
+ 0xB6A5, 0xB6AA, 0x2CB2, 0xB6AB, 0xB6AC, 0x06A6, 0xB6AD, 0xB6B0, 0x2CB8,
+ 0xB6B1, 0xB6B1, 0x06A8, 0xB6B2, 0xB6D3, 0x2CBC, 0xB6D4, 0xB6D4, 0x06A9,
+ 0xB6D5, 0xB6EF, 0x2CDE, 0xB6F0, 0xB6F0, 0x06AA, 0xB6F1, 0xB6F3, 0x2CF9,
+ 0xB6F4, 0xB6F4, 0x06AB, 0xB6F5, 0xB6F7, 0x2CFC, 0xB6F8, 0xB6F8, 0x06AC,
+ 0xB6F9, 0xB6FF, 0x2CFF, 0xB700, 0xB701, 0x06AD, 0xB702, 0xB704, 0x2D06,
+ 0xB705, 0xB705, 0x06AF, 0xB706, 0xB727, 0x2D09, 0xB728, 0xB729, 0x06B0,
+ 0xB72A, 0xB72B, 0x2D2B, 0xB72C, 0xB72C, 0x06B2, 0xB72D, 0xB72E, 0x2D2D,
+ 0xB72F, 0xB730, 0x06B3, 0xB731, 0xB737, 0x2D2F, 0xB738, 0xB739, 0x06B5,
+ 0xB73A, 0xB73A, 0x2D36, 0xB73B, 0xB73B, 0x06B7, 0xB73C, 0xB743, 0x2D37,
+ 0xB744, 0xB744, 0x06B8, 0xB745, 0xB747, 0x2D3F, 0xB748, 0xB748, 0x06B9,
+ 0xB749, 0xB74B, 0x2D42, 0xB74C, 0xB74C, 0x06BA, 0xB74D, 0xB753, 0x2D45,
+ 0xB754, 0xB755, 0x06BB, 0xB756, 0xB75F, 0x2D4C, 0xB760, 0xB760, 0x06BD,
+ 0xB761, 0xB763, 0x2D56, 0xB764, 0xB764, 0x06BE, 0xB765, 0xB767, 0x2D59,
+ 0xB768, 0xB768, 0x06BF, 0xB769, 0xB76F, 0x2D5C, 0xB770, 0xB771, 0x06C0,
+ 0xB772, 0xB772, 0x2D63, 0xB773, 0xB773, 0x06C2, 0xB774, 0xB774, 0x2D64,
+ 0xB775, 0xB775, 0x06C3, 0xB776, 0xB77B, 0x2D65, 0xB77C, 0xB77D, 0x06C4,
+ 0xB77E, 0xB77F, 0x2D6B, 0xB780, 0xB780, 0x06C6, 0xB781, 0xB783, 0x2D6D,
+ 0xB784, 0xB784, 0x06C7, 0xB785, 0xB78B, 0x2D70, 0xB78C, 0xB78D, 0x06C8,
+ 0xB78E, 0xB78E, 0x2D77, 0xB78F, 0xB792, 0x06CA, 0xB793, 0xB795, 0x2D78,
+ 0xB796, 0xB799, 0x06CE, 0xB79A, 0xB79B, 0x2D7B, 0xB79C, 0xB79C, 0x06D2,
+ 0xB79D, 0xB79F, 0x2D7D, 0xB7A0, 0xB7A0, 0x06D3, 0xB7A1, 0xB7A7, 0x2D80,
+ 0xB7A8, 0xB7A9, 0x06D4, 0xB7AA, 0xB7AA, 0x2D87, 0xB7AB, 0xB7AD, 0x06D6,
+ 0xB7AE, 0xB7B3, 0x2D88, 0xB7B4, 0xB7B5, 0x06D9, 0xB7B6, 0xB7B7, 0x2D8E,
+ 0xB7B8, 0xB7B8, 0x06DB, 0xB7B9, 0xB7C6, 0x2D90, 0xB7C7, 0xB7C7, 0x06DC,
+ 0xB7C8, 0xB7C8, 0x2D9E, 0xB7C9, 0xB7C9, 0x06DD, 0xB7CA, 0xB7EB, 0x2D9F,
+ 0xB7EC, 0xB7ED, 0x06DE, 0xB7EE, 0xB7EF, 0x2DC1, 0xB7F0, 0xB7F0, 0x06E0,
+ 0xB7F1, 0xB7F3, 0x2DC3, 0xB7F4, 0xB7F4, 0x06E1, 0xB7F5, 0xB7FB, 0x2DC6,
+ 0xB7FC, 0xB7FD, 0x06E2, 0xB7FE, 0xB7FE, 0x2DCD, 0xB7FF, 0xB7FF, 0x06E4,
+ 0xB800, 0xB801, 0x06E5, 0xB802, 0xB806, 0x2DCE, 0xB807, 0xB809, 0x06E7,
+ 0xB80A, 0xB80B, 0x2DD3, 0xB80C, 0xB80C, 0x06EA, 0xB80D, 0xB80F, 0x2DD5,
+ 0xB810, 0xB810, 0x06EB, 0xB811, 0xB817, 0x2DD8, 0xB818, 0xB819, 0x06EC,
+ 0xB81A, 0xB81A, 0x2DDF, 0xB81B, 0xB81B, 0x06EE, 0xB81C, 0xB81C, 0x2DE0,
+ 0xB81D, 0xB81D, 0x06EF, 0xB81E, 0xB823, 0x2DE1, 0xB824, 0xB825, 0x06F0,
+ 0xB826, 0xB827, 0x2DE7, 0xB828, 0xB828, 0x06F2, 0xB829, 0xB82B, 0x2DE9,
+ 0xB82C, 0xB82C, 0x06F3, 0xB82D, 0xB833, 0x2DEC, 0xB834, 0xB835, 0x06F4,
+ 0xB836, 0xB836, 0x2DF3, 0xB837, 0xB839, 0x06F6, 0xB83A, 0xB83F, 0x2DF4,
+ 0xB840, 0xB840, 0x06F9, 0xB841, 0xB843, 0x2DFA, 0xB844, 0xB844, 0x06FA,
+ 0xB845, 0xB850, 0x2DFD, 0xB851, 0xB851, 0x06FB, 0xB852, 0xB852, 0x2E09,
+ 0xB853, 0xB853, 0x06FC, 0xB854, 0xB85B, 0x2E0A, 0xB85C, 0xB85D, 0x06FD,
+ 0xB85E, 0xB85F, 0x2E12, 0xB860, 0xB860, 0x06FF, 0xB861, 0xB863, 0x2E14,
+ 0xB864, 0xB864, 0x0700, 0xB865, 0xB86B, 0x2E17, 0xB86C, 0xB86D, 0x0701,
+ 0xB86E, 0xB86E, 0x2E1E, 0xB86F, 0xB86F, 0x0703, 0xB870, 0xB870, 0x2E1F,
+ 0xB871, 0xB871, 0x0704, 0xB872, 0xB877, 0x2E20, 0xB878, 0xB878, 0x0705,
+ 0xB879, 0xB87B, 0x2E26, 0xB87C, 0xB87C, 0x0706, 0xB87D, 0xB88C, 0x2E29,
+ 0xB88D, 0xB88D, 0x0707, 0xB88E, 0xB8A7, 0x2E39, 0xB8A8, 0xB8A8, 0x0708,
+ 0xB8A9, 0xB8AF, 0x2E53, 0xB8B0, 0xB8B0, 0x0709, 0xB8B1, 0xB8B3, 0x2E5A,
+ 0xB8B4, 0xB8B4, 0x070A, 0xB8B5, 0xB8B7, 0x2E5D, 0xB8B8, 0xB8B8, 0x070B,
+ 0xB8B9, 0xB8BF, 0x2E60, 0xB8C0, 0xB8C1, 0x070C, 0xB8C2, 0xB8C2, 0x2E67,
+ 0xB8C3, 0xB8C3, 0x070E, 0xB8C4, 0xB8C4, 0x2E68, 0xB8C5, 0xB8C5, 0x070F,
+ 0xB8C6, 0xB8CB, 0x2E69, 0xB8CC, 0xB8CC, 0x0710, 0xB8CD, 0xB8CF, 0x2E6F,
+ 0xB8D0, 0xB8D0, 0x0711, 0xB8D1, 0xB8D3, 0x2E72, 0xB8D4, 0xB8D4, 0x0712,
+ 0xB8D5, 0xB8DC, 0x2E75, 0xB8DD, 0xB8DD, 0x0713, 0xB8DE, 0xB8DE, 0x2E7D,
+ 0xB8DF, 0xB8DF, 0x0714, 0xB8E0, 0xB8E0, 0x2E7E, 0xB8E1, 0xB8E1, 0x0715,
+ 0xB8E2, 0xB8E7, 0x2E7F, 0xB8E8, 0xB8E9, 0x0716, 0xB8EA, 0xB8EB, 0x2E85,
+ 0xB8EC, 0xB8EC, 0x0718, 0xB8ED, 0xB8EF, 0x2E87, 0xB8F0, 0xB8F0, 0x0719,
+ 0xB8F1, 0xB8F7, 0x2E8A, 0xB8F8, 0xB8F9, 0x071A, 0xB8FA, 0xB8FA, 0x2E91,
+ 0xB8FB, 0xB8FB, 0x071C, 0xB8FC, 0xB8FC, 0x2E92, 0xB8FD, 0xB8FD, 0x071D,
+ 0xB8FE, 0xB8FF, 0x2E93, 0xB900, 0xB903, 0x2E95, 0xB904, 0xB904, 0x071E,
+ 0xB905, 0xB917, 0x2E99, 0xB918, 0xB918, 0x071F, 0xB919, 0xB91F, 0x2EAC,
+ 0xB920, 0xB920, 0x0720, 0xB921, 0xB93B, 0x2EB3, 0xB93C, 0xB93D, 0x0721,
+ 0xB93E, 0xB93F, 0x2ECE, 0xB940, 0xB940, 0x0723, 0xB941, 0xB943, 0x2ED0,
+ 0xB944, 0xB944, 0x0724, 0xB945, 0xB94B, 0x2ED3, 0xB94C, 0xB94C, 0x0725,
+ 0xB94D, 0xB94E, 0x2EDA, 0xB94F, 0xB94F, 0x0726, 0xB950, 0xB950, 0x2EDC,
+ 0xB951, 0xB951, 0x0727, 0xB952, 0xB957, 0x2EDD, 0xB958, 0xB959, 0x0728,
+ 0xB95A, 0xB95B, 0x2EE3, 0xB95C, 0xB95C, 0x072A, 0xB95D, 0xB95F, 0x2EE5,
+ 0xB960, 0xB960, 0x072B, 0xB961, 0xB967, 0x2EE8, 0xB968, 0xB969, 0x072C,
+ 0xB96A, 0xB96A, 0x2EEF, 0xB96B, 0xB96B, 0x072E, 0xB96C, 0xB96C, 0x2EF0,
+ 0xB96D, 0xB96D, 0x072F, 0xB96E, 0xB973, 0x2EF1, 0xB974, 0xB975, 0x0730,
+ 0xB976, 0xB977, 0x2EF7, 0xB978, 0xB978, 0x0732, 0xB979, 0xB97B, 0x2EF9,
+ 0xB97C, 0xB97C, 0x0733, 0xB97D, 0xB983, 0x2EFC, 0xB984, 0xB985, 0x0734,
+ 0xB986, 0xB986, 0x2F03, 0xB987, 0xB987, 0x0736, 0xB988, 0xB988, 0x2F04,
+ 0xB989, 0xB98A, 0x0737, 0xB98B, 0xB98C, 0x2F05, 0xB98D, 0xB98E, 0x0739,
+ 0xB98F, 0xB9AB, 0x2F07, 0xB9AC, 0xB9AD, 0x073B, 0xB9AE, 0xB9AF, 0x2F24,
+ 0xB9B0, 0xB9B0, 0x073D, 0xB9B1, 0xB9B3, 0x2F26, 0xB9B4, 0xB9B4, 0x073E,
+ 0xB9B5, 0xB9BB, 0x2F29, 0xB9BC, 0xB9BD, 0x073F, 0xB9BE, 0xB9BE, 0x2F30,
+ 0xB9BF, 0xB9BF, 0x0741, 0xB9C0, 0xB9C0, 0x2F31, 0xB9C1, 0xB9C1, 0x0742,
+ 0xB9C2, 0xB9C7, 0x2F32, 0xB9C8, 0xB9C9, 0x0743, 0xB9CA, 0xB9CB, 0x2F38,
+ 0xB9CC, 0xB9CC, 0x0745, 0xB9CD, 0xB9CD, 0x2F3A, 0xB9CE, 0xB9D2, 0x0746,
+ 0xB9D3, 0xB9D7, 0x2F3B, 0xB9D8, 0xB9D9, 0x074B, 0xB9DA, 0xB9DA, 0x2F40,
+ 0xB9DB, 0xB9DB, 0x074D, 0xB9DC, 0xB9DC, 0x2F41, 0xB9DD, 0xB9DE, 0x074E,
+ 0xB9DF, 0xB9E0, 0x2F42, 0xB9E1, 0xB9E1, 0x0750, 0xB9E2, 0xB9E2, 0x2F44,
+ 0xB9E3, 0xB9E5, 0x0751, 0xB9E6, 0xB9E7, 0x2F45, 0xB9E8, 0xB9E8, 0x0754,
+ 0xB9E9, 0xB9EB, 0x2F47, 0xB9EC, 0xB9EC, 0x0755, 0xB9ED, 0xB9F3, 0x2F4A,
+ 0xB9F4, 0xB9F5, 0x0756, 0xB9F6, 0xB9F6, 0x2F51, 0xB9F7, 0xB9FA, 0x0758,
+ 0xB9FB, 0xB9FF, 0x2F52, 0xBA00, 0xBA01, 0x075C, 0xBA02, 0xBA07, 0x2F57,
+ 0xBA08, 0xBA08, 0x075E, 0xBA09, 0xBA14, 0x2F5D, 0xBA15, 0xBA15, 0x075F,
+ 0xBA16, 0xBA37, 0x2F69, 0xBA38, 0xBA39, 0x0760, 0xBA3A, 0xBA3B, 0x2F8B,
+ 0xBA3C, 0xBA3C, 0x0762, 0xBA3D, 0xBA3F, 0x2F8D, 0xBA40, 0xBA40, 0x0763,
+ 0xBA41, 0xBA41, 0x2F90, 0xBA42, 0xBA42, 0x0764, 0xBA43, 0xBA47, 0x2F91,
+ 0xBA48, 0xBA49, 0x0765, 0xBA4A, 0xBA4A, 0x2F96, 0xBA4B, 0xBA4B, 0x0767,
+ 0xBA4C, 0xBA4C, 0x2F97, 0xBA4D, 0xBA4E, 0x0768, 0xBA4F, 0xBA52, 0x2F98,
+ 0xBA53, 0xBA55, 0x076A, 0xBA56, 0xBA57, 0x2F9C, 0xBA58, 0xBA58, 0x076D,
+ 0xBA59, 0xBA5B, 0x2F9E, 0xBA5C, 0xBA5C, 0x076E, 0xBA5D, 0xBA63, 0x2FA1,
+ 0xBA64, 0xBA65, 0x076F, 0xBA66, 0xBA66, 0x2FA8, 0xBA67, 0xBA69, 0x0771,
+ 0xBA6A, 0xBA6F, 0x2FA9, 0xBA70, 0xBA71, 0x0774, 0xBA72, 0xBA73, 0x2FAF,
+ 0xBA74, 0xBA74, 0x0776, 0xBA75, 0xBA77, 0x2FB1, 0xBA78, 0xBA78, 0x0777,
+ 0xBA79, 0xBA82, 0x2FB4, 0xBA83, 0xBA85, 0x0778, 0xBA86, 0xBA86, 0x2FBE,
+ 0xBA87, 0xBA87, 0x077B, 0xBA88, 0xBA8B, 0x2FBF, 0xBA8C, 0xBA8C, 0x077C,
+ 0xBA8D, 0xBAA7, 0x2FC3, 0xBAA8, 0xBAA9, 0x077D, 0xBAAA, 0xBAAA, 0x2FDE,
+ 0xBAAB, 0xBAAC, 0x077F, 0xBAAD, 0xBAAF, 0x2FDF, 0xBAB0, 0xBAB0, 0x0781,
+ 0xBAB1, 0xBAB1, 0x2FE2, 0xBAB2, 0xBAB2, 0x0782, 0xBAB3, 0xBAB7, 0x2FE3,
+ 0xBAB8, 0xBAB9, 0x0783, 0xBABA, 0xBABA, 0x2FE8, 0xBABB, 0xBABB, 0x0785,
+ 0xBABC, 0xBABC, 0x2FE9, 0xBABD, 0xBABD, 0x0786, 0xBABE, 0xBAC3, 0x2FEA,
+ 0xBAC4, 0xBAC4, 0x0787, 0xBAC5, 0xBAC7, 0x2FF0, 0xBAC8, 0xBAC8, 0x0788,
+ 0xBAC9, 0xBAD7, 0x2FF3, 0xBAD8, 0xBAD9, 0x0789, 0xBADA, 0xBAFB, 0x3002,
+ 0xBAFC, 0xBAFC, 0x078B, 0xBAFD, 0xBAFF, 0x3024, 0xBB00, 0xBB00, 0x078C,
+ 0xBB01, 0xBB03, 0x3027, 0xBB04, 0xBB04, 0x078D, 0xBB05, 0xBB0C, 0x302A,
+ 0xBB0D, 0xBB0D, 0x078E, 0xBB0E, 0xBB0E, 0x3032, 0xBB0F, 0xBB0F, 0x078F,
+ 0xBB10, 0xBB10, 0x3033, 0xBB11, 0xBB11, 0x0790, 0xBB12, 0xBB17, 0x3034,
+ 0xBB18, 0xBB18, 0x0791, 0xBB19, 0xBB1B, 0x303A, 0xBB1C, 0xBB1C, 0x0792,
+ 0xBB1D, 0xBB1F, 0x303D, 0xBB20, 0xBB20, 0x0793, 0xBB21, 0xBB28, 0x3040,
+ 0xBB29, 0xBB29, 0x0794, 0xBB2A, 0xBB2A, 0x3048, 0xBB2B, 0xBB2B, 0x0795,
+ 0xBB2C, 0xBB33, 0x3049, 0xBB34, 0xBB36, 0x0796, 0xBB37, 0xBB37, 0x3051,
+ 0xBB38, 0xBB38, 0x0799, 0xBB39, 0xBB3A, 0x3052, 0xBB3B, 0xBB3E, 0x079A,
+ 0xBB3F, 0xBB43, 0x3054, 0xBB44, 0xBB45, 0x079E, 0xBB46, 0xBB46, 0x3059,
+ 0xBB47, 0xBB47, 0x07A0, 0xBB48, 0xBB48, 0x305A, 0xBB49, 0xBB49, 0x07A1,
+ 0xBB4A, 0xBB4C, 0x305B, 0xBB4D, 0xBB4D, 0x07A2, 0xBB4E, 0xBB4E, 0x305E,
+ 0xBB4F, 0xBB50, 0x07A3, 0xBB51, 0xBB53, 0x305F, 0xBB54, 0xBB54, 0x07A5,
+ 0xBB55, 0xBB57, 0x3062, 0xBB58, 0xBB58, 0x07A6, 0xBB59, 0xBB60, 0x3065,
+ 0xBB61, 0xBB61, 0x07A7, 0xBB62, 0xBB62, 0x306D, 0xBB63, 0xBB63, 0x07A8,
+ 0xBB64, 0xBB6B, 0x306E, 0xBB6C, 0xBB6C, 0x07A9, 0xBB6D, 0xBB87, 0x3076,
+ 0xBB88, 0xBB88, 0x07AA, 0xBB89, 0xBB8B, 0x3091, 0xBB8C, 0xBB8C, 0x07AB,
+ 0xBB8D, 0xBB8F, 0x3094, 0xBB90, 0xBB90, 0x07AC, 0xBB91, 0xBBA3, 0x3097,
+ 0xBBA4, 0xBBA4, 0x07AD, 0xBBA5, 0xBBA7, 0x30AA, 0xBBA8, 0xBBA8, 0x07AE,
+ 0xBBA9, 0xBBAB, 0x30AD, 0xBBAC, 0xBBAC, 0x07AF, 0xBBAD, 0xBBB3, 0x30B0,
+ 0xBBB4, 0xBBB4, 0x07B0, 0xBBB5, 0xBBB6, 0x30B7, 0xBBB7, 0xBBB7, 0x07B1,
+ 0xBBB8, 0xBBBF, 0x30B9, 0xBBC0, 0xBBC0, 0x07B2, 0xBBC1, 0xBBC3, 0x30C1,
+ 0xBBC4, 0xBBC4, 0x07B3, 0xBBC5, 0xBBC7, 0x30C4, 0xBBC8, 0xBBC8, 0x07B4,
+ 0xBBC9, 0xBBCF, 0x30C7, 0xBBD0, 0xBBD0, 0x07B5, 0xBBD1, 0xBBD2, 0x30CE,
+ 0xBBD3, 0xBBD3, 0x07B6, 0xBBD4, 0xBBF7, 0x30D0, 0xBBF8, 0xBBF9, 0x07B7,
+ 0xBBFA, 0xBBFB, 0x30F4, 0xBBFC, 0xBBFC, 0x07B9, 0xBBFD, 0xBBFE, 0x30F6,
+ 0xBBFF, 0xBBFF, 0x07BA, 0xBC00, 0xBC00, 0x07BB, 0xBC01, 0xBC01, 0x30F8,
+ 0xBC02, 0xBC02, 0x07BC, 0xBC03, 0xBC07, 0x30F9, 0xBC08, 0xBC09, 0x07BD,
+ 0xBC0A, 0xBC0A, 0x30FE, 0xBC0B, 0xBC0D, 0x07BF, 0xBC0E, 0xBC0E, 0x30FF,
+ 0xBC0F, 0xBC0F, 0x07C2, 0xBC10, 0xBC10, 0x3100, 0xBC11, 0xBC11, 0x07C3,
+ 0xBC12, 0xBC13, 0x3101, 0xBC14, 0xBC18, 0x07C4, 0xBC19, 0xBC1A, 0x3103,
+ 0xBC1B, 0xBC1F, 0x07C9, 0xBC20, 0xBC23, 0x3105, 0xBC24, 0xBC25, 0x07CE,
+ 0xBC26, 0xBC26, 0x3109, 0xBC27, 0xBC27, 0x07D0, 0xBC28, 0xBC28, 0x310A,
+ 0xBC29, 0xBC29, 0x07D1, 0xBC2A, 0xBC2C, 0x310B, 0xBC2D, 0xBC2D, 0x07D2,
+ 0xBC2E, 0xBC2F, 0x310E, 0xBC30, 0xBC31, 0x07D3, 0xBC32, 0xBC33, 0x3110,
+ 0xBC34, 0xBC34, 0x07D5, 0xBC35, 0xBC37, 0x3112, 0xBC38, 0xBC38, 0x07D6,
+ 0xBC39, 0xBC3F, 0x3115, 0xBC40, 0xBC41, 0x07D7, 0xBC42, 0xBC42, 0x311C,
+ 0xBC43, 0xBC45, 0x07D9, 0xBC46, 0xBC48, 0x311D, 0xBC49, 0xBC49, 0x07DC,
+ 0xBC4A, 0xBC4B, 0x3120, 0xBC4C, 0xBC4D, 0x07DD, 0xBC4E, 0xBC4F, 0x3122,
+ 0xBC50, 0xBC50, 0x07DF, 0xBC51, 0xBC5C, 0x3124, 0xBC5D, 0xBC5D, 0x07E0,
+ 0xBC5E, 0xBC83, 0x3130, 0xBC84, 0xBC85, 0x07E1, 0xBC86, 0xBC87, 0x3156,
+ 0xBC88, 0xBC88, 0x07E3, 0xBC89, 0xBC8A, 0x3158, 0xBC8B, 0xBC8C, 0x07E4,
+ 0xBC8D, 0xBC8D, 0x315A, 0xBC8E, 0xBC8E, 0x07E6, 0xBC8F, 0xBC93, 0x315B,
+ 0xBC94, 0xBC95, 0x07E7, 0xBC96, 0xBC96, 0x3160, 0xBC97, 0xBC97, 0x07E9,
+ 0xBC98, 0xBC98, 0x3161, 0xBC99, 0xBC9A, 0x07EA, 0xBC9B, 0xBC9F, 0x3162,
+ 0xBCA0, 0xBCA1, 0x07EC, 0xBCA2, 0xBCA3, 0x3167, 0xBCA4, 0xBCA4, 0x07EE,
+ 0xBCA5, 0xBCA6, 0x3169, 0xBCA7, 0xBCA8, 0x07EF, 0xBCA9, 0xBCAF, 0x316B,
+ 0xBCB0, 0xBCB1, 0x07F1, 0xBCB2, 0xBCB2, 0x3172, 0xBCB3, 0xBCB5, 0x07F3,
+ 0xBCB6, 0xBCBB, 0x3173, 0xBCBC, 0xBCBD, 0x07F6, 0xBCBE, 0xBCBF, 0x3179,
+ 0xBCC0, 0xBCC0, 0x07F8, 0xBCC1, 0xBCC3, 0x317B, 0xBCC4, 0xBCC4, 0x07F9,
+ 0xBCC5, 0xBCCC, 0x317E, 0xBCCD, 0xBCCD, 0x07FA, 0xBCCE, 0xBCCE, 0x3186,
+ 0xBCCF, 0xBCD1, 0x07FB, 0xBCD2, 0xBCD4, 0x3187, 0xBCD5, 0xBCD5, 0x07FE,
+ 0xBCD6, 0xBCD7, 0x318A, 0xBCD8, 0xBCD8, 0x07FF, 0xBCD9, 0xBCDB, 0x318C,
+ 0xBCDC, 0xBCDC, 0x0800, 0xBCDD, 0xBCF3, 0x318F, 0xBCF4, 0xBCF6, 0x0801,
+ 0xBCF7, 0xBCF7, 0x31A6, 0xBCF8, 0xBCF8, 0x0804, 0xBCF9, 0xBCFB, 0x31A7,
+ 0xBCFC, 0xBCFC, 0x0805, 0xBCFD, 0xBCFF, 0x31AA, 0xBD00, 0xBD03, 0x31AD,
+ 0xBD04, 0xBD05, 0x0806, 0xBD06, 0xBD06, 0x31B1, 0xBD07, 0xBD07, 0x0808,
+ 0xBD08, 0xBD08, 0x31B2, 0xBD09, 0xBD09, 0x0809, 0xBD0A, 0xBD0F, 0x31B3,
+ 0xBD10, 0xBD10, 0x080A, 0xBD11, 0xBD13, 0x31B9, 0xBD14, 0xBD14, 0x080B,
+ 0xBD15, 0xBD23, 0x31BC, 0xBD24, 0xBD24, 0x080C, 0xBD25, 0xBD2B, 0x31CB,
+ 0xBD2C, 0xBD2C, 0x080D, 0xBD2D, 0xBD3F, 0x31D2, 0xBD40, 0xBD40, 0x080E,
+ 0xBD41, 0xBD47, 0x31E5, 0xBD48, 0xBD49, 0x080F, 0xBD4A, 0xBD4B, 0x31EC,
+ 0xBD4C, 0xBD4C, 0x0811, 0xBD4D, 0xBD4F, 0x31EE, 0xBD50, 0xBD50, 0x0812,
+ 0xBD51, 0xBD57, 0x31F1, 0xBD58, 0xBD59, 0x0813, 0xBD5A, 0xBD63, 0x31F8,
+ 0xBD64, 0xBD64, 0x0815, 0xBD65, 0xBD67, 0x3202, 0xBD68, 0xBD68, 0x0816,
+ 0xBD69, 0xBD7F, 0x3205, 0xBD80, 0xBD81, 0x0817, 0xBD82, 0xBD83, 0x321C,
+ 0xBD84, 0xBD84, 0x0819, 0xBD85, 0xBD86, 0x321E, 0xBD87, 0xBD8A, 0x081A,
+ 0xBD8B, 0xBD8F, 0x3220, 0xBD90, 0xBD91, 0x081E, 0xBD92, 0xBD92, 0x3225,
+ 0xBD93, 0xBD93, 0x0820, 0xBD94, 0xBD94, 0x3226, 0xBD95, 0xBD95, 0x0821,
+ 0xBD96, 0xBD98, 0x3227, 0xBD99, 0xBD9A, 0x0822, 0xBD9B, 0xBD9B, 0x322A,
+ 0xBD9C, 0xBD9C, 0x0824, 0xBD9D, 0xBDA3, 0x322B, 0xBDA4, 0xBDA4, 0x0825,
+ 0xBDA5, 0xBDAF, 0x3232, 0xBDB0, 0xBDB0, 0x0826, 0xBDB1, 0xBDB7, 0x323D,
+ 0xBDB8, 0xBDB8, 0x0827, 0xBDB9, 0xBDD3, 0x3244, 0xBDD4, 0xBDD5, 0x0828,
+ 0xBDD6, 0xBDD7, 0x325F, 0xBDD8, 0xBDD8, 0x082A, 0xBDD9, 0xBDDB, 0x3261,
+ 0xBDDC, 0xBDDC, 0x082B, 0xBDDD, 0xBDE8, 0x3264, 0xBDE9, 0xBDE9, 0x082C,
+ 0xBDEA, 0xBDEF, 0x3270, 0xBDF0, 0xBDF0, 0x082D, 0xBDF1, 0xBDF3, 0x3276,
+ 0xBDF4, 0xBDF4, 0x082E, 0xBDF5, 0xBDF7, 0x3279, 0xBDF8, 0xBDF8, 0x082F,
+ 0xBDF9, 0xBDFF, 0x327C, 0xBE00, 0xBE00, 0x0830, 0xBE01, 0xBE02, 0x3283,
+ 0xBE03, 0xBE03, 0x0831, 0xBE04, 0xBE04, 0x3285, 0xBE05, 0xBE05, 0x0832,
+ 0xBE06, 0xBE0B, 0x3286, 0xBE0C, 0xBE0D, 0x0833, 0xBE0E, 0xBE0F, 0x328C,
+ 0xBE10, 0xBE10, 0x0835, 0xBE11, 0xBE13, 0x328E, 0xBE14, 0xBE14, 0x0836,
+ 0xBE15, 0xBE1B, 0x3291, 0xBE1C, 0xBE1D, 0x0837, 0xBE1E, 0xBE1E, 0x3298,
+ 0xBE1F, 0xBE1F, 0x0839, 0xBE20, 0xBE43, 0x3299, 0xBE44, 0xBE45, 0x083A,
+ 0xBE46, 0xBE47, 0x32BD, 0xBE48, 0xBE48, 0x083C, 0xBE49, 0xBE4B, 0x32BF,
+ 0xBE4C, 0xBE4C, 0x083D, 0xBE4D, 0xBE4D, 0x32C2, 0xBE4E, 0xBE4E, 0x083E,
+ 0xBE4F, 0xBE53, 0x32C3, 0xBE54, 0xBE55, 0x083F, 0xBE56, 0xBE56, 0x32C8,
+ 0xBE57, 0xBE57, 0x0841, 0xBE58, 0xBE58, 0x32C9, 0xBE59, 0xBE5B, 0x0842,
+ 0xBE5C, 0xBE5F, 0x32CA, 0xBE60, 0xBE61, 0x0845, 0xBE62, 0xBE63, 0x32CE,
+ 0xBE64, 0xBE64, 0x0847, 0xBE65, 0xBE67, 0x32D0, 0xBE68, 0xBE68, 0x0848,
+ 0xBE69, 0xBE69, 0x32D3, 0xBE6A, 0xBE6A, 0x0849, 0xBE6B, 0xBE6F, 0x32D4,
+ 0xBE70, 0xBE71, 0x084A, 0xBE72, 0xBE72, 0x32D9, 0xBE73, 0xBE75, 0x084C,
+ 0xBE76, 0xBE7A, 0x32DA, 0xBE7B, 0xBE7D, 0x084F, 0xBE7E, 0xBE7F, 0x32DF,
+ 0xBE80, 0xBE80, 0x0852, 0xBE81, 0xBE83, 0x32E1, 0xBE84, 0xBE84, 0x0853,
+ 0xBE85, 0xBE8B, 0x32E4, 0xBE8C, 0xBE8D, 0x0854, 0xBE8E, 0xBE8E, 0x32EB,
+ 0xBE8F, 0xBE91, 0x0856, 0xBE92, 0xBE97, 0x32EC, 0xBE98, 0xBE99, 0x0859,
+ 0xBE9A, 0xBEA7, 0x32F2, 0xBEA8, 0xBEA8, 0x085B, 0xBEA9, 0xBECF, 0x3300,
+ 0xBED0, 0xBED1, 0x085C, 0xBED2, 0xBED3, 0x3327, 0xBED4, 0xBED4, 0x085E,
+ 0xBED5, 0xBED6, 0x3329, 0xBED7, 0xBED8, 0x085F, 0xBED9, 0xBEDF, 0x332B,
+ 0xBEE0, 0xBEE0, 0x0861, 0xBEE1, 0xBEE2, 0x3332, 0xBEE3, 0xBEE5, 0x0862,
+ 0xBEE6, 0xBEEB, 0x3334, 0xBEEC, 0xBEEC, 0x0865, 0xBEED, 0xBEFF, 0x333A,
+ 0xBF00, 0xBF00, 0x334D, 0xBF01, 0xBF01, 0x0866, 0xBF02, 0xBF07, 0x334E,
+ 0xBF08, 0xBF09, 0x0867, 0xBF0A, 0xBF17, 0x3354, 0xBF18, 0xBF19, 0x0869,
+ 0xBF1A, 0xBF1A, 0x3362, 0xBF1B, 0xBF1D, 0x086B, 0xBF1E, 0xBF3F, 0x3363,
+ 0xBF40, 0xBF41, 0x086E, 0xBF42, 0xBF43, 0x3385, 0xBF44, 0xBF44, 0x0870,
+ 0xBF45, 0xBF47, 0x3387, 0xBF48, 0xBF48, 0x0871, 0xBF49, 0xBF4F, 0x338A,
+ 0xBF50, 0xBF51, 0x0872, 0xBF52, 0xBF54, 0x3391, 0xBF55, 0xBF55, 0x0874,
+ 0xBF56, 0xBF93, 0x3394, 0xBF94, 0xBF94, 0x0875, 0xBF95, 0xBFAF, 0x33D2,
+ 0xBFB0, 0xBFB0, 0x0876, 0xBFB1, 0xBFC4, 0x33ED, 0xBFC5, 0xBFC5, 0x0877,
+ 0xBFC6, 0xBFCB, 0x3401, 0xBFCC, 0xBFCD, 0x0878, 0xBFCE, 0xBFCF, 0x3407,
+ 0xBFD0, 0xBFD0, 0x087A, 0xBFD1, 0xBFD3, 0x3409, 0xBFD4, 0xBFD4, 0x087B,
+ 0xBFD5, 0xBFDB, 0x340C, 0xBFDC, 0xBFDC, 0x087C, 0xBFDD, 0xBFDE, 0x3413,
+ 0xBFDF, 0xBFDF, 0x087D, 0xBFE0, 0xBFE0, 0x3415, 0xBFE1, 0xBFE1, 0x087E,
+ 0xBFE2, 0xBFFF, 0x3416, 0xC000, 0xC03B, 0x3434, 0xC03C, 0xC03C, 0x087F,
+ 0xC03D, 0xC050, 0x3470, 0xC051, 0xC051, 0x0880, 0xC052, 0xC057, 0x3484,
+ 0xC058, 0xC058, 0x0881, 0xC059, 0xC05B, 0x348A, 0xC05C, 0xC05C, 0x0882,
+ 0xC05D, 0xC05F, 0x348D, 0xC060, 0xC060, 0x0883, 0xC061, 0xC067, 0x3490,
+ 0xC068, 0xC069, 0x0884, 0xC06A, 0xC08F, 0x3497, 0xC090, 0xC091, 0x0886,
+ 0xC092, 0xC093, 0x34BD, 0xC094, 0xC094, 0x0888, 0xC095, 0xC097, 0x34BF,
+ 0xC098, 0xC098, 0x0889, 0xC099, 0xC09F, 0x34C2, 0xC0A0, 0xC0A1, 0x088A,
+ 0xC0A2, 0xC0A2, 0x34C9, 0xC0A3, 0xC0A3, 0x088C, 0xC0A4, 0xC0A4, 0x34CA,
+ 0xC0A5, 0xC0A5, 0x088D, 0xC0A6, 0xC0AB, 0x34CB, 0xC0AC, 0xC0AD, 0x088E,
+ 0xC0AE, 0xC0AE, 0x34D1, 0xC0AF, 0xC0B0, 0x0890, 0xC0B1, 0xC0B2, 0x34D2,
+ 0xC0B3, 0xC0B6, 0x0892, 0xC0B7, 0xC0BB, 0x34D4, 0xC0BC, 0xC0BD, 0x0896,
+ 0xC0BE, 0xC0BE, 0x34D9, 0xC0BF, 0xC0C1, 0x0898, 0xC0C2, 0xC0C4, 0x34DA,
+ 0xC0C5, 0xC0C5, 0x089B, 0xC0C6, 0xC0C7, 0x34DD, 0xC0C8, 0xC0C9, 0x089C,
+ 0xC0CA, 0xC0CB, 0x34DF, 0xC0CC, 0xC0CC, 0x089E, 0xC0CD, 0xC0CF, 0x34E1,
+ 0xC0D0, 0xC0D0, 0x089F, 0xC0D1, 0xC0D7, 0x34E4, 0xC0D8, 0xC0D9, 0x08A0,
+ 0xC0DA, 0xC0DA, 0x34EB, 0xC0DB, 0xC0DD, 0x08A2, 0xC0DE, 0xC0E3, 0x34EC,
+ 0xC0E4, 0xC0E5, 0x08A5, 0xC0E6, 0xC0E7, 0x34F2, 0xC0E8, 0xC0E8, 0x08A7,
+ 0xC0E9, 0xC0EB, 0x34F4, 0xC0EC, 0xC0EC, 0x08A8, 0xC0ED, 0xC0F3, 0x34F7,
+ 0xC0F4, 0xC0F5, 0x08A9, 0xC0F6, 0xC0F6, 0x34FE, 0xC0F7, 0xC0F7, 0x08AB,
+ 0xC0F8, 0xC0F8, 0x34FF, 0xC0F9, 0xC0F9, 0x08AC, 0xC0FA, 0xC0FF, 0x3500,
+ 0xC100, 0xC100, 0x08AD, 0xC101, 0xC103, 0x3506, 0xC104, 0xC104, 0x08AE,
+ 0xC105, 0xC107, 0x3509, 0xC108, 0xC108, 0x08AF, 0xC109, 0xC10F, 0x350C,
+ 0xC110, 0xC110, 0x08B0, 0xC111, 0xC114, 0x3513, 0xC115, 0xC115, 0x08B1,
+ 0xC116, 0xC11B, 0x3517, 0xC11C, 0xC120, 0x08B2, 0xC121, 0xC122, 0x351D,
+ 0xC123, 0xC124, 0x08B7, 0xC125, 0xC125, 0x351F, 0xC126, 0xC127, 0x08B9,
+ 0xC128, 0xC12B, 0x3520, 0xC12C, 0xC12D, 0x08BB, 0xC12E, 0xC12E, 0x3524,
+ 0xC12F, 0xC131, 0x08BD, 0xC132, 0xC135, 0x3525, 0xC136, 0xC136, 0x08C0,
+ 0xC137, 0xC137, 0x3529, 0xC138, 0xC139, 0x08C1, 0xC13A, 0xC13B, 0x352A,
+ 0xC13C, 0xC13C, 0x08C3, 0xC13D, 0xC13F, 0x352C, 0xC140, 0xC140, 0x08C4,
+ 0xC141, 0xC147, 0x352F, 0xC148, 0xC149, 0x08C5, 0xC14A, 0xC14A, 0x3536,
+ 0xC14B, 0xC14D, 0x08C7, 0xC14E, 0xC153, 0x3537, 0xC154, 0xC155, 0x08CA,
+ 0xC156, 0xC157, 0x353D, 0xC158, 0xC158, 0x08CC, 0xC159, 0xC15B, 0x353F,
+ 0xC15C, 0xC15C, 0x08CD, 0xC15D, 0xC163, 0x3542, 0xC164, 0xC165, 0x08CE,
+ 0xC166, 0xC166, 0x3549, 0xC167, 0xC169, 0x08D0, 0xC16A, 0xC16F, 0x354A,
+ 0xC170, 0xC170, 0x08D3, 0xC171, 0xC173, 0x3550, 0xC174, 0xC174, 0x08D4,
+ 0xC175, 0xC177, 0x3553, 0xC178, 0xC178, 0x08D5, 0xC179, 0xC184, 0x3556,
+ 0xC185, 0xC185, 0x08D6, 0xC186, 0xC18B, 0x3562, 0xC18C, 0xC18E, 0x08D7,
+ 0xC18F, 0xC18F, 0x3568, 0xC190, 0xC190, 0x08DA, 0xC191, 0xC193, 0x3569,
+ 0xC194, 0xC194, 0x08DB, 0xC195, 0xC195, 0x356C, 0xC196, 0xC196, 0x08DC,
+ 0xC197, 0xC19B, 0x356D, 0xC19C, 0xC19D, 0x08DD, 0xC19E, 0xC19E, 0x3572,
+ 0xC19F, 0xC19F, 0x08DF, 0xC1A0, 0xC1A0, 0x3573, 0xC1A1, 0xC1A1, 0x08E0,
+ 0xC1A2, 0xC1A4, 0x3574, 0xC1A5, 0xC1A5, 0x08E1, 0xC1A6, 0xC1A7, 0x3577,
+ 0xC1A8, 0xC1A9, 0x08E2, 0xC1AA, 0xC1AB, 0x3579, 0xC1AC, 0xC1AC, 0x08E4,
+ 0xC1AD, 0xC1AF, 0x357B, 0xC1B0, 0xC1B0, 0x08E5, 0xC1B1, 0xC1BC, 0x357E,
+ 0xC1BD, 0xC1BD, 0x08E6, 0xC1BE, 0xC1C3, 0x358A, 0xC1C4, 0xC1C4, 0x08E7,
+ 0xC1C5, 0xC1C7, 0x3590, 0xC1C8, 0xC1C8, 0x08E8, 0xC1C9, 0xC1CB, 0x3593,
+ 0xC1CC, 0xC1CC, 0x08E9, 0xC1CD, 0xC1D3, 0x3596, 0xC1D4, 0xC1D4, 0x08EA,
+ 0xC1D5, 0xC1D6, 0x359D, 0xC1D7, 0xC1D8, 0x08EB, 0xC1D9, 0xC1DF, 0x359F,
+ 0xC1E0, 0xC1E0, 0x08ED, 0xC1E1, 0xC1E3, 0x35A6, 0xC1E4, 0xC1E4, 0x08EE,
+ 0xC1E5, 0xC1E7, 0x35A9, 0xC1E8, 0xC1E8, 0x08EF, 0xC1E9, 0xC1EF, 0x35AC,
+ 0xC1F0, 0xC1F1, 0x08F0, 0xC1F2, 0xC1F2, 0x35B3, 0xC1F3, 0xC1F3, 0x08F2,
+ 0xC1F4, 0xC1FB, 0x35B4, 0xC1FC, 0xC1FD, 0x08F3, 0xC1FE, 0xC1FF, 0x35BC,
+ 0xC200, 0xC200, 0x08F5, 0xC201, 0xC203, 0x35BE, 0xC204, 0xC204, 0x08F6,
+ 0xC205, 0xC20B, 0x35C1, 0xC20C, 0xC20D, 0x08F7, 0xC20E, 0xC20E, 0x35C8,
+ 0xC20F, 0xC20F, 0x08F9, 0xC210, 0xC210, 0x35C9, 0xC211, 0xC211, 0x08FA,
+ 0xC212, 0xC217, 0x35CA, 0xC218, 0xC219, 0x08FB, 0xC21A, 0xC21B, 0x35D0,
+ 0xC21C, 0xC21C, 0x08FD, 0xC21D, 0xC21E, 0x35D2, 0xC21F, 0xC220, 0x08FE,
+ 0xC221, 0xC227, 0x35D4, 0xC228, 0xC229, 0x0900, 0xC22A, 0xC22A, 0x35DB,
+ 0xC22B, 0xC22B, 0x0902, 0xC22C, 0xC22C, 0x35DC, 0xC22D, 0xC22D, 0x0903,
+ 0xC22E, 0xC22E, 0x35DD, 0xC22F, 0xC22F, 0x0904, 0xC230, 0xC230, 0x35DE,
+ 0xC231, 0xC232, 0x0905, 0xC233, 0xC233, 0x35DF, 0xC234, 0xC234, 0x0907,
+ 0xC235, 0xC247, 0x35E0, 0xC248, 0xC248, 0x0908, 0xC249, 0xC24F, 0x35F3,
+ 0xC250, 0xC251, 0x0909, 0xC252, 0xC253, 0x35FA, 0xC254, 0xC254, 0x090B,
+ 0xC255, 0xC257, 0x35FC, 0xC258, 0xC258, 0x090C, 0xC259, 0xC25F, 0x35FF,
+ 0xC260, 0xC260, 0x090D, 0xC261, 0xC264, 0x3606, 0xC265, 0xC265, 0x090E,
+ 0xC266, 0xC26B, 0x360A, 0xC26C, 0xC26D, 0x090F, 0xC26E, 0xC26F, 0x3610,
+ 0xC270, 0xC270, 0x0911, 0xC271, 0xC273, 0x3612, 0xC274, 0xC274, 0x0912,
+ 0xC275, 0xC27B, 0x3615, 0xC27C, 0xC27D, 0x0913, 0xC27E, 0xC27E, 0x361C,
+ 0xC27F, 0xC27F, 0x0915, 0xC280, 0xC280, 0x361D, 0xC281, 0xC281, 0x0916,
+ 0xC282, 0xC287, 0x361E, 0xC288, 0xC289, 0x0917, 0xC28A, 0xC28F, 0x3624,
+ 0xC290, 0xC290, 0x0919, 0xC291, 0xC297, 0x362A, 0xC298, 0xC298, 0x091A,
+ 0xC299, 0xC29A, 0x3631, 0xC29B, 0xC29B, 0x091B, 0xC29C, 0xC29C, 0x3633,
+ 0xC29D, 0xC29D, 0x091C, 0xC29E, 0xC2A3, 0x3634, 0xC2A4, 0xC2A5, 0x091D,
+ 0xC2A6, 0xC2A7, 0x363A, 0xC2A8, 0xC2A8, 0x091F, 0xC2A9, 0xC2AB, 0x363C,
+ 0xC2AC, 0xC2AD, 0x0920, 0xC2AE, 0xC2B3, 0x363F, 0xC2B4, 0xC2B5, 0x0922,
+ 0xC2B6, 0xC2B6, 0x3645, 0xC2B7, 0xC2B7, 0x0924, 0xC2B8, 0xC2B8, 0x3646,
+ 0xC2B9, 0xC2B9, 0x0925, 0xC2BA, 0xC2DB, 0x3647, 0xC2DC, 0xC2DD, 0x0926,
+ 0xC2DE, 0xC2DF, 0x3669, 0xC2E0, 0xC2E0, 0x0928, 0xC2E1, 0xC2E2, 0x366B,
+ 0xC2E3, 0xC2E4, 0x0929, 0xC2E5, 0xC2EA, 0x366D, 0xC2EB, 0xC2ED, 0x092B,
+ 0xC2EE, 0xC2EE, 0x3673, 0xC2EF, 0xC2EF, 0x092E, 0xC2F0, 0xC2F0, 0x3674,
+ 0xC2F1, 0xC2F1, 0x092F, 0xC2F2, 0xC2F5, 0x3675, 0xC2F6, 0xC2F6, 0x0930,
+ 0xC2F7, 0xC2F7, 0x3679, 0xC2F8, 0xC2F9, 0x0931, 0xC2FA, 0xC2FA, 0x367A,
+ 0xC2FB, 0xC2FC, 0x0933, 0xC2FD, 0xC2FF, 0x367B, 0xC300, 0xC300, 0x0935,
+ 0xC301, 0xC307, 0x367E, 0xC308, 0xC309, 0x0936, 0xC30A, 0xC30B, 0x3685,
+ 0xC30C, 0xC30D, 0x0938, 0xC30E, 0xC312, 0x3687, 0xC313, 0xC315, 0x093A,
+ 0xC316, 0xC317, 0x368C, 0xC318, 0xC318, 0x093D, 0xC319, 0xC31B, 0x368E,
+ 0xC31C, 0xC31C, 0x093E, 0xC31D, 0xC323, 0x3691, 0xC324, 0xC325, 0x093F,
+ 0xC326, 0xC327, 0x3698, 0xC328, 0xC329, 0x0941, 0xC32A, 0xC344, 0x369A,
+ 0xC345, 0xC345, 0x0943, 0xC346, 0xC367, 0x36B5, 0xC368, 0xC369, 0x0944,
+ 0xC36A, 0xC36B, 0x36D7, 0xC36C, 0xC36C, 0x0946, 0xC36D, 0xC36F, 0x36D9,
+ 0xC370, 0xC370, 0x0947, 0xC371, 0xC371, 0x36DC, 0xC372, 0xC372, 0x0948,
+ 0xC373, 0xC377, 0x36DD, 0xC378, 0xC379, 0x0949, 0xC37A, 0xC37B, 0x36E2,
+ 0xC37C, 0xC37D, 0x094B, 0xC37E, 0xC383, 0x36E4, 0xC384, 0xC384, 0x094D,
+ 0xC385, 0xC387, 0x36EA, 0xC388, 0xC388, 0x094E, 0xC389, 0xC38B, 0x36ED,
+ 0xC38C, 0xC38C, 0x094F, 0xC38D, 0xC3BF, 0x36F0, 0xC3C0, 0xC3C0, 0x0950,
+ 0xC3C1, 0xC3D7, 0x3723, 0xC3D8, 0xC3D9, 0x0951, 0xC3DA, 0xC3DB, 0x373A,
+ 0xC3DC, 0xC3DC, 0x0953, 0xC3DD, 0xC3DE, 0x373C, 0xC3DF, 0xC3E0, 0x0954,
+ 0xC3E1, 0xC3E1, 0x373E, 0xC3E2, 0xC3E2, 0x0956, 0xC3E3, 0xC3E7, 0x373F,
+ 0xC3E8, 0xC3E9, 0x0957, 0xC3EA, 0xC3EC, 0x3744, 0xC3ED, 0xC3ED, 0x0959,
+ 0xC3EE, 0xC3F3, 0x3747, 0xC3F4, 0xC3F5, 0x095A, 0xC3F6, 0xC3F7, 0x374D,
+ 0xC3F8, 0xC3F8, 0x095C, 0xC3F9, 0xC3FF, 0x374F, 0xC400, 0xC407, 0x3756,
+ 0xC408, 0xC408, 0x095D, 0xC409, 0xC40F, 0x375E, 0xC410, 0xC410, 0x095E,
+ 0xC411, 0xC423, 0x3765, 0xC424, 0xC424, 0x095F, 0xC425, 0xC42B, 0x3778,
+ 0xC42C, 0xC42C, 0x0960, 0xC42D, 0xC42F, 0x377F, 0xC430, 0xC430, 0x0961,
+ 0xC431, 0xC433, 0x3782, 0xC434, 0xC434, 0x0962, 0xC435, 0xC43B, 0x3785,
+ 0xC43C, 0xC43D, 0x0963, 0xC43E, 0xC447, 0x378C, 0xC448, 0xC448, 0x0965,
+ 0xC449, 0xC463, 0x3796, 0xC464, 0xC465, 0x0966, 0xC466, 0xC467, 0x37B1,
+ 0xC468, 0xC468, 0x0968, 0xC469, 0xC46B, 0x37B3, 0xC46C, 0xC46C, 0x0969,
+ 0xC46D, 0xC473, 0x37B6, 0xC474, 0xC475, 0x096A, 0xC476, 0xC478, 0x37BD,
+ 0xC479, 0xC479, 0x096C, 0xC47A, 0xC47F, 0x37C0, 0xC480, 0xC480, 0x096D,
+ 0xC481, 0xC493, 0x37C6, 0xC494, 0xC494, 0x096E, 0xC495, 0xC49B, 0x37D9,
+ 0xC49C, 0xC49C, 0x096F, 0xC49D, 0xC4B7, 0x37E0, 0xC4B8, 0xC4B8, 0x0970,
+ 0xC4B9, 0xC4BB, 0x37FB, 0xC4BC, 0xC4BC, 0x0971, 0xC4BD, 0xC4E8, 0x37FE,
+ 0xC4E9, 0xC4E9, 0x0972, 0xC4EA, 0xC4EF, 0x382A, 0xC4F0, 0xC4F1, 0x0973,
+ 0xC4F2, 0xC4F3, 0x3830, 0xC4F4, 0xC4F4, 0x0975, 0xC4F5, 0xC4F7, 0x3832,
+ 0xC4F8, 0xC4F8, 0x0976, 0xC4F9, 0xC4F9, 0x3835, 0xC4FA, 0xC4FA, 0x0977,
+ 0xC4FB, 0xC4FE, 0x3836, 0xC4FF, 0xC4FF, 0x0978, 0xC500, 0xC501, 0x0979,
+ 0xC502, 0xC50B, 0x383A, 0xC50C, 0xC50C, 0x097B, 0xC50D, 0xC50F, 0x3844,
+ 0xC510, 0xC510, 0x097C, 0xC511, 0xC513, 0x3847, 0xC514, 0xC514, 0x097D,
+ 0xC515, 0xC51B, 0x384A, 0xC51C, 0xC51C, 0x097E, 0xC51D, 0xC527, 0x3851,
+ 0xC528, 0xC529, 0x097F, 0xC52A, 0xC52B, 0x385C, 0xC52C, 0xC52C, 0x0981,
+ 0xC52D, 0xC52F, 0x385E, 0xC530, 0xC530, 0x0982, 0xC531, 0xC537, 0x3861,
+ 0xC538, 0xC539, 0x0983, 0xC53A, 0xC53A, 0x3868, 0xC53B, 0xC53B, 0x0985,
+ 0xC53C, 0xC53C, 0x3869, 0xC53D, 0xC53D, 0x0986, 0xC53E, 0xC543, 0x386A,
+ 0xC544, 0xC545, 0x0987, 0xC546, 0xC547, 0x3870, 0xC548, 0xC54A, 0x0989,
+ 0xC54B, 0xC54B, 0x3872, 0xC54C, 0xC54E, 0x098C, 0xC54F, 0xC552, 0x3873,
+ 0xC553, 0xC555, 0x098F, 0xC556, 0xC556, 0x3877, 0xC557, 0xC559, 0x0992,
+ 0xC55A, 0xC55C, 0x3878, 0xC55D, 0xC55E, 0x0995, 0xC55F, 0xC55F, 0x387B,
+ 0xC560, 0xC561, 0x0997, 0xC562, 0xC563, 0x387C, 0xC564, 0xC564, 0x0999,
+ 0xC565, 0xC567, 0x387E, 0xC568, 0xC568, 0x099A, 0xC569, 0xC56F, 0x3881,
+ 0xC570, 0xC571, 0x099B, 0xC572, 0xC572, 0x3888, 0xC573, 0xC575, 0x099D,
+ 0xC576, 0xC57B, 0x3889, 0xC57C, 0xC57D, 0x09A0, 0xC57E, 0xC57F, 0x388F,
+ 0xC580, 0xC580, 0x09A2, 0xC581, 0xC583, 0x3891, 0xC584, 0xC584, 0x09A3,
+ 0xC585, 0xC586, 0x3894, 0xC587, 0xC587, 0x09A4, 0xC588, 0xC58B, 0x3896,
+ 0xC58C, 0xC58D, 0x09A5, 0xC58E, 0xC58E, 0x389A, 0xC58F, 0xC58F, 0x09A7,
+ 0xC590, 0xC590, 0x389B, 0xC591, 0xC591, 0x09A8, 0xC592, 0xC594, 0x389C,
+ 0xC595, 0xC595, 0x09A9, 0xC596, 0xC596, 0x389F, 0xC597, 0xC598, 0x09AA,
+ 0xC599, 0xC59B, 0x38A0, 0xC59C, 0xC59C, 0x09AC, 0xC59D, 0xC59F, 0x38A3,
+ 0xC5A0, 0xC5A0, 0x09AD, 0xC5A1, 0xC5A8, 0x38A6, 0xC5A9, 0xC5A9, 0x09AE,
+ 0xC5AA, 0xC5B3, 0x38AE, 0xC5B4, 0xC5B5, 0x09AF, 0xC5B6, 0xC5B7, 0x38B8,
+ 0xC5B8, 0xC5B9, 0x09B1, 0xC5BA, 0xC5BA, 0x38BA, 0xC5BB, 0xC5BE, 0x09B3,
+ 0xC5BF, 0xC5C3, 0x38BB, 0xC5C4, 0xC5CA, 0x09B7, 0xC5CB, 0xC5CB, 0x38C0,
+ 0xC5CC, 0xC5CC, 0x09BE, 0xC5CD, 0xC5CD, 0x38C1, 0xC5CE, 0xC5CE, 0x09BF,
+ 0xC5CF, 0xC5CF, 0x38C2, 0xC5D0, 0xC5D1, 0x09C0, 0xC5D2, 0xC5D3, 0x38C3,
+ 0xC5D4, 0xC5D4, 0x09C2, 0xC5D5, 0xC5D7, 0x38C5, 0xC5D8, 0xC5D8, 0x09C3,
+ 0xC5D9, 0xC5DF, 0x38C8, 0xC5E0, 0xC5E1, 0x09C4, 0xC5E2, 0xC5E2, 0x38CF,
+ 0xC5E3, 0xC5E3, 0x09C6, 0xC5E4, 0xC5E4, 0x38D0, 0xC5E5, 0xC5E5, 0x09C7,
+ 0xC5E6, 0xC5EB, 0x38D1, 0xC5EC, 0xC5EE, 0x09C8, 0xC5EF, 0xC5EF, 0x38D7,
+ 0xC5F0, 0xC5F0, 0x09CB, 0xC5F1, 0xC5F3, 0x38D8, 0xC5F4, 0xC5F4, 0x09CC,
+ 0xC5F5, 0xC5F5, 0x38DB, 0xC5F6, 0xC5F7, 0x09CD, 0xC5F8, 0xC5FB, 0x38DC,
+ 0xC5FC, 0xC5FF, 0x09CF, 0xC600, 0xC601, 0x09D3, 0xC602, 0xC604, 0x38E0,
+ 0xC605, 0xC608, 0x09D5, 0xC609, 0xC60B, 0x38E3, 0xC60C, 0xC60C, 0x09D9,
+ 0xC60D, 0xC60F, 0x38E6, 0xC610, 0xC610, 0x09DA, 0xC611, 0xC617, 0x38E9,
+ 0xC618, 0xC619, 0x09DB, 0xC61A, 0xC61A, 0x38F0, 0xC61B, 0xC61C, 0x09DD,
+ 0xC61D, 0xC623, 0x38F1, 0xC624, 0xC625, 0x09DF, 0xC626, 0xC627, 0x38F8,
+ 0xC628, 0xC628, 0x09E1, 0xC629, 0xC62B, 0x38FA, 0xC62C, 0xC62E, 0x09E2,
+ 0xC62F, 0xC62F, 0x38FD, 0xC630, 0xC630, 0x09E5, 0xC631, 0xC632, 0x38FE,
+ 0xC633, 0xC635, 0x09E6, 0xC636, 0xC636, 0x3900, 0xC637, 0xC637, 0x09E9,
+ 0xC638, 0xC638, 0x3901, 0xC639, 0xC639, 0x09EA, 0xC63A, 0xC63A, 0x3902,
+ 0xC63B, 0xC63B, 0x09EB, 0xC63C, 0xC63F, 0x3903, 0xC640, 0xC641, 0x09EC,
+ 0xC642, 0xC643, 0x3907, 0xC644, 0xC644, 0x09EE, 0xC645, 0xC647, 0x3909,
+ 0xC648, 0xC648, 0x09EF, 0xC649, 0xC64F, 0x390C, 0xC650, 0xC651, 0x09F0,
+ 0xC652, 0xC652, 0x3913, 0xC653, 0xC655, 0x09F2, 0xC656, 0xC65B, 0x3914,
+ 0xC65C, 0xC65D, 0x09F5, 0xC65E, 0xC65F, 0x391A, 0xC660, 0xC660, 0x09F7,
+ 0xC661, 0xC66B, 0x391C, 0xC66C, 0xC66C, 0x09F8, 0xC66D, 0xC66E, 0x3927,
+ 0xC66F, 0xC66F, 0x09F9, 0xC670, 0xC670, 0x3929, 0xC671, 0xC671, 0x09FA,
+ 0xC672, 0xC677, 0x392A, 0xC678, 0xC679, 0x09FB, 0xC67A, 0xC67B, 0x3930,
+ 0xC67C, 0xC67C, 0x09FD, 0xC67D, 0xC67F, 0x3932, 0xC680, 0xC680, 0x09FE,
+ 0xC681, 0xC687, 0x3935, 0xC688, 0xC689, 0x09FF, 0xC68A, 0xC68A, 0x393C,
+ 0xC68B, 0xC68B, 0x0A01, 0xC68C, 0xC68C, 0x393D, 0xC68D, 0xC68D, 0x0A02,
+ 0xC68E, 0xC693, 0x393E, 0xC694, 0xC695, 0x0A03, 0xC696, 0xC697, 0x3944,
+ 0xC698, 0xC698, 0x0A05, 0xC699, 0xC69B, 0x3946, 0xC69C, 0xC69C, 0x0A06,
+ 0xC69D, 0xC6A3, 0x3949, 0xC6A4, 0xC6A5, 0x0A07, 0xC6A6, 0xC6A6, 0x3950,
+ 0xC6A7, 0xC6A7, 0x0A09, 0xC6A8, 0xC6A8, 0x3951, 0xC6A9, 0xC6A9, 0x0A0A,
+ 0xC6AA, 0xC6AF, 0x3952, 0xC6B0, 0xC6B1, 0x0A0B, 0xC6B2, 0xC6B3, 0x3958,
+ 0xC6B4, 0xC6B4, 0x0A0D, 0xC6B5, 0xC6B7, 0x395A, 0xC6B8, 0xC6BA, 0x0A0E,
+ 0xC6BB, 0xC6BF, 0x395D, 0xC6C0, 0xC6C1, 0x0A11, 0xC6C2, 0xC6C2, 0x3962,
+ 0xC6C3, 0xC6C3, 0x0A13, 0xC6C4, 0xC6C4, 0x3963, 0xC6C5, 0xC6C5, 0x0A14,
+ 0xC6C6, 0xC6CB, 0x3964, 0xC6CC, 0xC6CD, 0x0A15, 0xC6CE, 0xC6CF, 0x396A,
+ 0xC6D0, 0xC6D0, 0x0A17, 0xC6D1, 0xC6D3, 0x396C, 0xC6D4, 0xC6D4, 0x0A18,
+ 0xC6D5, 0xC6DB, 0x396F, 0xC6DC, 0xC6DD, 0x0A19, 0xC6DE, 0xC6DF, 0x3976,
+ 0xC6E0, 0xC6E1, 0x0A1B, 0xC6E2, 0xC6E7, 0x3978, 0xC6E8, 0xC6E9, 0x0A1D,
+ 0xC6EA, 0xC6EB, 0x397E, 0xC6EC, 0xC6EC, 0x0A1F, 0xC6ED, 0xC6EF, 0x3980,
+ 0xC6F0, 0xC6F0, 0x0A20, 0xC6F1, 0xC6F7, 0x3983, 0xC6F8, 0xC6F9, 0x0A21,
+ 0xC6FA, 0xC6FC, 0x398A, 0xC6FD, 0xC6FD, 0x0A23, 0xC6FE, 0xC6FF, 0x398D,
+ 0xC700, 0xC703, 0x398F, 0xC704, 0xC705, 0x0A24, 0xC706, 0xC707, 0x3993,
+ 0xC708, 0xC708, 0x0A26, 0xC709, 0xC70B, 0x3995, 0xC70C, 0xC70C, 0x0A27,
+ 0xC70D, 0xC713, 0x3998, 0xC714, 0xC715, 0x0A28, 0xC716, 0xC716, 0x399F,
+ 0xC717, 0xC717, 0x0A2A, 0xC718, 0xC718, 0x39A0, 0xC719, 0xC719, 0x0A2B,
+ 0xC71A, 0xC71F, 0x39A1, 0xC720, 0xC721, 0x0A2C, 0xC722, 0xC723, 0x39A7,
+ 0xC724, 0xC724, 0x0A2E, 0xC725, 0xC727, 0x39A9, 0xC728, 0xC728, 0x0A2F,
+ 0xC729, 0xC72F, 0x39AC, 0xC730, 0xC731, 0x0A30, 0xC732, 0xC732, 0x39B3,
+ 0xC733, 0xC733, 0x0A32, 0xC734, 0xC734, 0x39B4, 0xC735, 0xC735, 0x0A33,
+ 0xC736, 0xC736, 0x39B5, 0xC737, 0xC737, 0x0A34, 0xC738, 0xC73B, 0x39B6,
+ 0xC73C, 0xC73D, 0x0A35, 0xC73E, 0xC73F, 0x39BA, 0xC740, 0xC740, 0x0A37,
+ 0xC741, 0xC743, 0x39BC, 0xC744, 0xC744, 0x0A38, 0xC745, 0xC749, 0x39BF,
+ 0xC74A, 0xC74A, 0x0A39, 0xC74B, 0xC74B, 0x39C4, 0xC74C, 0xC74D, 0x0A3A,
+ 0xC74E, 0xC74E, 0x39C5, 0xC74F, 0xC74F, 0x0A3C, 0xC750, 0xC750, 0x39C6,
+ 0xC751, 0xC758, 0x0A3D, 0xC759, 0xC75B, 0x39C7, 0xC75C, 0xC75C, 0x0A45,
+ 0xC75D, 0xC75F, 0x39CA, 0xC760, 0xC760, 0x0A46, 0xC761, 0xC767, 0x39CD,
+ 0xC768, 0xC768, 0x0A47, 0xC769, 0xC76A, 0x39D4, 0xC76B, 0xC76B, 0x0A48,
+ 0xC76C, 0xC773, 0x39D6, 0xC774, 0xC775, 0x0A49, 0xC776, 0xC777, 0x39DE,
+ 0xC778, 0xC778, 0x0A4B, 0xC779, 0xC77B, 0x39E0, 0xC77C, 0xC77E, 0x0A4C,
+ 0xC77F, 0xC782, 0x39E3, 0xC783, 0xC785, 0x0A4F, 0xC786, 0xC786, 0x39E7,
+ 0xC787, 0xC78A, 0x0A52, 0xC78B, 0xC78D, 0x39E8, 0xC78E, 0xC78E, 0x0A56,
+ 0xC78F, 0xC78F, 0x39EB, 0xC790, 0xC791, 0x0A57, 0xC792, 0xC793, 0x39EC,
+ 0xC794, 0xC794, 0x0A59, 0xC795, 0xC795, 0x39EE, 0xC796, 0xC798, 0x0A5A,
+ 0xC799, 0xC799, 0x39EF, 0xC79A, 0xC79A, 0x0A5D, 0xC79B, 0xC79F, 0x39F0,
+ 0xC7A0, 0xC7A1, 0x0A5E, 0xC7A2, 0xC7A2, 0x39F5, 0xC7A3, 0xC7A6, 0x0A60,
+ 0xC7A7, 0xC7AB, 0x39F6, 0xC7AC, 0xC7AD, 0x0A64, 0xC7AE, 0xC7AF, 0x39FB,
+ 0xC7B0, 0xC7B0, 0x0A66, 0xC7B1, 0xC7B3, 0x39FD, 0xC7B4, 0xC7B4, 0x0A67,
+ 0xC7B5, 0xC7BB, 0x3A00, 0xC7BC, 0xC7BD, 0x0A68, 0xC7BE, 0xC7BE, 0x3A07,
+ 0xC7BF, 0xC7C1, 0x0A6A, 0xC7C2, 0xC7C7, 0x3A08, 0xC7C8, 0xC7C9, 0x0A6D,
+ 0xC7CA, 0xC7CB, 0x3A0E, 0xC7CC, 0xC7CC, 0x0A6F, 0xC7CD, 0xC7CD, 0x3A10,
+ 0xC7CE, 0xC7CE, 0x0A70, 0xC7CF, 0xC7CF, 0x3A11, 0xC7D0, 0xC7D0, 0x0A71,
+ 0xC7D1, 0xC7D7, 0x3A12, 0xC7D8, 0xC7D8, 0x0A72, 0xC7D9, 0xC7DC, 0x3A19,
+ 0xC7DD, 0xC7DD, 0x0A73, 0xC7DE, 0xC7E3, 0x3A1D, 0xC7E4, 0xC7E4, 0x0A74,
+ 0xC7E5, 0xC7E7, 0x3A23, 0xC7E8, 0xC7E8, 0x0A75, 0xC7E9, 0xC7EB, 0x3A26,
+ 0xC7EC, 0xC7EC, 0x0A76, 0xC7ED, 0xC7FF, 0x3A29, 0xC800, 0xC801, 0x0A77,
+ 0xC802, 0xC803, 0x3A3C, 0xC804, 0xC804, 0x0A79, 0xC805, 0xC807, 0x3A3E,
+ 0xC808, 0xC808, 0x0A7A, 0xC809, 0xC809, 0x3A41, 0xC80A, 0xC80A, 0x0A7B,
+ 0xC80B, 0xC80F, 0x3A42, 0xC810, 0xC811, 0x0A7C, 0xC812, 0xC812, 0x3A47,
+ 0xC813, 0xC813, 0x0A7E, 0xC814, 0xC814, 0x3A48, 0xC815, 0xC816, 0x0A7F,
+ 0xC817, 0xC81B, 0x3A49, 0xC81C, 0xC81D, 0x0A81, 0xC81E, 0xC81F, 0x3A4E,
+ 0xC820, 0xC820, 0x0A83, 0xC821, 0xC823, 0x3A50, 0xC824, 0xC824, 0x0A84,
+ 0xC825, 0xC82B, 0x3A53, 0xC82C, 0xC82D, 0x0A85, 0xC82E, 0xC82E, 0x3A5A,
+ 0xC82F, 0xC82F, 0x0A87, 0xC830, 0xC830, 0x3A5B, 0xC831, 0xC831, 0x0A88,
+ 0xC832, 0xC837, 0x3A5C, 0xC838, 0xC838, 0x0A89, 0xC839, 0xC83B, 0x3A62,
+ 0xC83C, 0xC83C, 0x0A8A, 0xC83D, 0xC83F, 0x3A65, 0xC840, 0xC840, 0x0A8B,
+ 0xC841, 0xC847, 0x3A68, 0xC848, 0xC849, 0x0A8C, 0xC84A, 0xC84B, 0x3A6F,
+ 0xC84C, 0xC84D, 0x0A8E, 0xC84E, 0xC853, 0x3A71, 0xC854, 0xC854, 0x0A90,
+ 0xC855, 0xC86F, 0x3A77, 0xC870, 0xC871, 0x0A91, 0xC872, 0xC873, 0x3A92,
+ 0xC874, 0xC874, 0x0A93, 0xC875, 0xC877, 0x3A94, 0xC878, 0xC878, 0x0A94,
+ 0xC879, 0xC879, 0x3A97, 0xC87A, 0xC87A, 0x0A95, 0xC87B, 0xC87F, 0x3A98,
+ 0xC880, 0xC881, 0x0A96, 0xC882, 0xC882, 0x3A9D, 0xC883, 0xC883, 0x0A98,
+ 0xC884, 0xC884, 0x3A9E, 0xC885, 0xC887, 0x0A99, 0xC888, 0xC88A, 0x3A9F,
+ 0xC88B, 0xC88D, 0x0A9C, 0xC88E, 0xC893, 0x3AA2, 0xC894, 0xC894, 0x0A9F,
+ 0xC895, 0xC89C, 0x3AA8, 0xC89D, 0xC89D, 0x0AA0, 0xC89E, 0xC89E, 0x3AB0,
+ 0xC89F, 0xC89F, 0x0AA1, 0xC8A0, 0xC8A0, 0x3AB1, 0xC8A1, 0xC8A1, 0x0AA2,
+ 0xC8A2, 0xC8A7, 0x3AB2, 0xC8A8, 0xC8A8, 0x0AA3, 0xC8A9, 0xC8BB, 0x3AB8,
+ 0xC8BC, 0xC8BD, 0x0AA4, 0xC8BE, 0xC8C3, 0x3ACB, 0xC8C4, 0xC8C4, 0x0AA6,
+ 0xC8C5, 0xC8C7, 0x3AD1, 0xC8C8, 0xC8C8, 0x0AA7, 0xC8C9, 0xC8CB, 0x3AD4,
+ 0xC8CC, 0xC8CC, 0x0AA8, 0xC8CD, 0xC8D3, 0x3AD7, 0xC8D4, 0xC8D5, 0x0AA9,
+ 0xC8D6, 0xC8D6, 0x3ADE, 0xC8D7, 0xC8D7, 0x0AAB, 0xC8D8, 0xC8D8, 0x3ADF,
+ 0xC8D9, 0xC8D9, 0x0AAC, 0xC8DA, 0xC8DF, 0x3AE0, 0xC8E0, 0xC8E1, 0x0AAD,
+ 0xC8E2, 0xC8E3, 0x3AE6, 0xC8E4, 0xC8E4, 0x0AAF, 0xC8E5, 0xC8F4, 0x3AE8,
+ 0xC8F5, 0xC8F5, 0x0AB0, 0xC8F6, 0xC8FB, 0x3AF8, 0xC8FC, 0xC8FD, 0x0AB1,
+ 0xC8FE, 0xC8FF, 0x3AFE, 0xC900, 0xC900, 0x0AB3, 0xC901, 0xC903, 0x3B00,
+ 0xC904, 0xC906, 0x0AB4, 0xC907, 0xC90B, 0x3B03, 0xC90C, 0xC90D, 0x0AB7,
+ 0xC90E, 0xC90E, 0x3B08, 0xC90F, 0xC90F, 0x0AB9, 0xC910, 0xC910, 0x3B09,
+ 0xC911, 0xC911, 0x0ABA, 0xC912, 0xC917, 0x3B0A, 0xC918, 0xC918, 0x0ABB,
+ 0xC919, 0xC92B, 0x3B10, 0xC92C, 0xC92C, 0x0ABC, 0xC92D, 0xC933, 0x3B23,
+ 0xC934, 0xC934, 0x0ABD, 0xC935, 0xC94F, 0x3B2A, 0xC950, 0xC951, 0x0ABE,
+ 0xC952, 0xC953, 0x3B45, 0xC954, 0xC954, 0x0AC0, 0xC955, 0xC957, 0x3B47,
+ 0xC958, 0xC958, 0x0AC1, 0xC959, 0xC95F, 0x3B4A, 0xC960, 0xC961, 0x0AC2,
+ 0xC962, 0xC962, 0x3B51, 0xC963, 0xC963, 0x0AC4, 0xC964, 0xC96B, 0x3B52,
+ 0xC96C, 0xC96C, 0x0AC5, 0xC96D, 0xC96F, 0x3B5A, 0xC970, 0xC970, 0x0AC6,
+ 0xC971, 0xC973, 0x3B5D, 0xC974, 0xC974, 0x0AC7, 0xC975, 0xC97B, 0x3B60,
+ 0xC97C, 0xC97C, 0x0AC8, 0xC97D, 0xC987, 0x3B67, 0xC988, 0xC989, 0x0AC9,
+ 0xC98A, 0xC98B, 0x3B72, 0xC98C, 0xC98C, 0x0ACB, 0xC98D, 0xC98F, 0x3B74,
+ 0xC990, 0xC990, 0x0ACC, 0xC991, 0xC997, 0x3B77, 0xC998, 0xC999, 0x0ACD,
+ 0xC99A, 0xC99A, 0x3B7E, 0xC99B, 0xC99B, 0x0ACF, 0xC99C, 0xC99C, 0x3B7F,
+ 0xC99D, 0xC99D, 0x0AD0, 0xC99E, 0xC9BF, 0x3B80, 0xC9C0, 0xC9C1, 0x0AD1,
+ 0xC9C2, 0xC9C3, 0x3BA2, 0xC9C4, 0xC9C4, 0x0AD3, 0xC9C5, 0xC9C6, 0x3BA4,
+ 0xC9C7, 0xC9C8, 0x0AD4, 0xC9C9, 0xC9C9, 0x3BA6, 0xC9CA, 0xC9CA, 0x0AD6,
+ 0xC9CB, 0xC9CF, 0x3BA7, 0xC9D0, 0xC9D1, 0x0AD7, 0xC9D2, 0xC9D2, 0x3BAC,
+ 0xC9D3, 0xC9D3, 0x0AD9, 0xC9D4, 0xC9D4, 0x3BAD, 0xC9D5, 0xC9D6, 0x0ADA,
+ 0xC9D7, 0xC9D8, 0x3BAE, 0xC9D9, 0xC9DA, 0x0ADC, 0xC9DB, 0xC9DB, 0x3BB0,
+ 0xC9DC, 0xC9DD, 0x0ADE, 0xC9DE, 0xC9DF, 0x3BB1, 0xC9E0, 0xC9E0, 0x0AE0,
+ 0xC9E1, 0xC9E1, 0x3BB3, 0xC9E2, 0xC9E2, 0x0AE1, 0xC9E3, 0xC9E3, 0x3BB4,
+ 0xC9E4, 0xC9E4, 0x0AE2, 0xC9E5, 0xC9E6, 0x3BB5, 0xC9E7, 0xC9E7, 0x0AE3,
+ 0xC9E8, 0xC9EB, 0x3BB7, 0xC9EC, 0xC9ED, 0x0AE4, 0xC9EE, 0xC9EE, 0x3BBB,
+ 0xC9EF, 0xC9F1, 0x0AE6, 0xC9F2, 0xC9F7, 0x3BBC, 0xC9F8, 0xC9F9, 0x0AE9,
+ 0xC9FA, 0xC9FB, 0x3BC2, 0xC9FC, 0xC9FC, 0x0AEB, 0xC9FD, 0xC9FF, 0x3BC4,
+ 0xCA00, 0xCA00, 0x0AEC, 0xCA01, 0xCA07, 0x3BC7, 0xCA08, 0xCA09, 0x0AED,
+ 0xCA0A, 0xCA0A, 0x3BCE, 0xCA0B, 0xCA0D, 0x0AEF, 0xCA0E, 0xCA13, 0x3BCF,
+ 0xCA14, 0xCA14, 0x0AF2, 0xCA15, 0xCA17, 0x3BD5, 0xCA18, 0xCA18, 0x0AF3,
+ 0xCA19, 0xCA28, 0x3BD8, 0xCA29, 0xCA29, 0x0AF4, 0xCA2A, 0xCA4B, 0x3BE8,
+ 0xCA4C, 0xCA4D, 0x0AF5, 0xCA4E, 0xCA4F, 0x3C0A, 0xCA50, 0xCA50, 0x0AF7,
+ 0xCA51, 0xCA53, 0x3C0C, 0xCA54, 0xCA54, 0x0AF8, 0xCA55, 0xCA5B, 0x3C0F,
+ 0xCA5C, 0xCA5D, 0x0AF9, 0xCA5E, 0xCA5E, 0x3C16, 0xCA5F, 0xCA61, 0x0AFB,
+ 0xCA62, 0xCA67, 0x3C17, 0xCA68, 0xCA68, 0x0AFE, 0xCA69, 0xCA7C, 0x3C1D,
+ 0xCA7D, 0xCA7D, 0x0AFF, 0xCA7E, 0xCA83, 0x3C31, 0xCA84, 0xCA84, 0x0B00,
+ 0xCA85, 0xCA97, 0x3C37, 0xCA98, 0xCA98, 0x0B01, 0xCA99, 0xCABB, 0x3C4A,
+ 0xCABC, 0xCABD, 0x0B02, 0xCABE, 0xCABF, 0x3C6D, 0xCAC0, 0xCAC0, 0x0B04,
+ 0xCAC1, 0xCAC3, 0x3C6F, 0xCAC4, 0xCAC4, 0x0B05, 0xCAC5, 0xCACB, 0x3C72,
+ 0xCACC, 0xCACD, 0x0B06, 0xCACE, 0xCACE, 0x3C79, 0xCACF, 0xCACF, 0x0B08,
+ 0xCAD0, 0xCAD0, 0x3C7A, 0xCAD1, 0xCAD1, 0x0B09, 0xCAD2, 0xCAD2, 0x3C7B,
+ 0xCAD3, 0xCAD3, 0x0B0A, 0xCAD4, 0xCAD7, 0x3C7C, 0xCAD8, 0xCAD9, 0x0B0B,
+ 0xCADA, 0xCADF, 0x3C80, 0xCAE0, 0xCAE0, 0x0B0D, 0xCAE1, 0xCAEB, 0x3C86,
+ 0xCAEC, 0xCAEC, 0x0B0E, 0xCAED, 0xCAF3, 0x3C91, 0xCAF4, 0xCAF4, 0x0B0F,
+ 0xCAF5, 0xCAFF, 0x3C98, 0xCB00, 0xCB07, 0x3CA3, 0xCB08, 0xCB08, 0x0B10,
+ 0xCB09, 0xCB0F, 0x3CAB, 0xCB10, 0xCB10, 0x0B11, 0xCB11, 0xCB13, 0x3CB2,
+ 0xCB14, 0xCB14, 0x0B12, 0xCB15, 0xCB17, 0x3CB5, 0xCB18, 0xCB18, 0x0B13,
+ 0xCB19, 0xCB1F, 0x3CB8, 0xCB20, 0xCB21, 0x0B14, 0xCB22, 0xCB40, 0x3CBF,
+ 0xCB41, 0xCB41, 0x0B16, 0xCB42, 0xCB47, 0x3CDE, 0xCB48, 0xCB49, 0x0B17,
+ 0xCB4A, 0xCB4B, 0x3CE4, 0xCB4C, 0xCB4C, 0x0B19, 0xCB4D, 0xCB4F, 0x3CE6,
+ 0xCB50, 0xCB50, 0x0B1A, 0xCB51, 0xCB57, 0x3CE9, 0xCB58, 0xCB59, 0x0B1B,
+ 0xCB5A, 0xCB5C, 0x3CF0, 0xCB5D, 0xCB5D, 0x0B1D, 0xCB5E, 0xCB63, 0x3CF3,
+ 0xCB64, 0xCB64, 0x0B1E, 0xCB65, 0xCB77, 0x3CF9, 0xCB78, 0xCB79, 0x0B1F,
+ 0xCB7A, 0xCB9B, 0x3D0C, 0xCB9C, 0xCB9C, 0x0B21, 0xCB9D, 0xCBB7, 0x3D2E,
+ 0xCBB8, 0xCBB8, 0x0B22, 0xCBB9, 0xCBD3, 0x3D49, 0xCBD4, 0xCBD4, 0x0B23,
+ 0xCBD5, 0xCBE3, 0x3D64, 0xCBE4, 0xCBE4, 0x0B24, 0xCBE5, 0xCBE6, 0x3D73,
+ 0xCBE7, 0xCBE7, 0x0B25, 0xCBE8, 0xCBE8, 0x3D75, 0xCBE9, 0xCBE9, 0x0B26,
+ 0xCBEA, 0xCBFF, 0x3D76, 0xCC00, 0xCC0B, 0x3D8C, 0xCC0C, 0xCC0D, 0x0B27,
+ 0xCC0E, 0xCC0F, 0x3D98, 0xCC10, 0xCC10, 0x0B29, 0xCC11, 0xCC13, 0x3D9A,
+ 0xCC14, 0xCC14, 0x0B2A, 0xCC15, 0xCC1B, 0x3D9D, 0xCC1C, 0xCC1D, 0x0B2B,
+ 0xCC1E, 0xCC20, 0x3DA4, 0xCC21, 0xCC22, 0x0B2D, 0xCC23, 0xCC26, 0x3DA7,
+ 0xCC27, 0xCC29, 0x0B2F, 0xCC2A, 0xCC2B, 0x3DAB, 0xCC2C, 0xCC2C, 0x0B32,
+ 0xCC2D, 0xCC2D, 0x3DAD, 0xCC2E, 0xCC2E, 0x0B33, 0xCC2F, 0xCC2F, 0x3DAE,
+ 0xCC30, 0xCC30, 0x0B34, 0xCC31, 0xCC37, 0x3DAF, 0xCC38, 0xCC39, 0x0B35,
+ 0xCC3A, 0xCC3A, 0x3DB6, 0xCC3B, 0xCC3E, 0x0B37, 0xCC3F, 0xCC43, 0x3DB7,
+ 0xCC44, 0xCC45, 0x0B3B, 0xCC46, 0xCC47, 0x3DBC, 0xCC48, 0xCC48, 0x0B3D,
+ 0xCC49, 0xCC4B, 0x3DBE, 0xCC4C, 0xCC4C, 0x0B3E, 0xCC4D, 0xCC53, 0x3DC1,
+ 0xCC54, 0xCC55, 0x0B3F, 0xCC56, 0xCC56, 0x3DC8, 0xCC57, 0xCC59, 0x0B41,
+ 0xCC5A, 0xCC5F, 0x3DC9, 0xCC60, 0xCC60, 0x0B44, 0xCC61, 0xCC63, 0x3DCF,
+ 0xCC64, 0xCC64, 0x0B45, 0xCC65, 0xCC65, 0x3DD2, 0xCC66, 0xCC66, 0x0B46,
+ 0xCC67, 0xCC67, 0x3DD3, 0xCC68, 0xCC68, 0x0B47, 0xCC69, 0xCC6F, 0x3DD4,
+ 0xCC70, 0xCC70, 0x0B48, 0xCC71, 0xCC74, 0x3DDB, 0xCC75, 0xCC75, 0x0B49,
+ 0xCC76, 0xCC97, 0x3DDF, 0xCC98, 0xCC99, 0x0B4A, 0xCC9A, 0xCC9B, 0x3E01,
+ 0xCC9C, 0xCC9C, 0x0B4C, 0xCC9D, 0xCC9F, 0x3E03, 0xCCA0, 0xCCA0, 0x0B4D,
+ 0xCCA1, 0xCCA7, 0x3E06, 0xCCA8, 0xCCA9, 0x0B4E, 0xCCAA, 0xCCAA, 0x3E0D,
+ 0xCCAB, 0xCCAD, 0x0B50, 0xCCAE, 0xCCB3, 0x3E0E, 0xCCB4, 0xCCB5, 0x0B53,
+ 0xCCB6, 0xCCB7, 0x3E14, 0xCCB8, 0xCCB8, 0x0B55, 0xCCB9, 0xCCBB, 0x3E16,
+ 0xCCBC, 0xCCBC, 0x0B56, 0xCCBD, 0xCCC3, 0x3E19, 0xCCC4, 0xCCC5, 0x0B57,
+ 0xCCC6, 0xCCC6, 0x3E20, 0xCCC7, 0xCCC7, 0x0B59, 0xCCC8, 0xCCC8, 0x3E21,
+ 0xCCC9, 0xCCC9, 0x0B5A, 0xCCCA, 0xCCCF, 0x3E22, 0xCCD0, 0xCCD0, 0x0B5B,
+ 0xCCD1, 0xCCD3, 0x3E28, 0xCCD4, 0xCCD4, 0x0B5C, 0xCCD5, 0xCCE3, 0x3E2B,
+ 0xCCE4, 0xCCE4, 0x0B5D, 0xCCE5, 0xCCEB, 0x3E3A, 0xCCEC, 0xCCEC, 0x0B5E,
+ 0xCCED, 0xCCEF, 0x3E41, 0xCCF0, 0xCCF0, 0x0B5F, 0xCCF1, 0xCCFF, 0x3E44,
+ 0xCD00, 0xCD00, 0x3E53, 0xCD01, 0xCD01, 0x0B60, 0xCD02, 0xCD07, 0x3E54,
+ 0xCD08, 0xCD09, 0x0B61, 0xCD0A, 0xCD0B, 0x3E5A, 0xCD0C, 0xCD0C, 0x0B63,
+ 0xCD0D, 0xCD0F, 0x3E5C, 0xCD10, 0xCD10, 0x0B64, 0xCD11, 0xCD17, 0x3E5F,
+ 0xCD18, 0xCD19, 0x0B65, 0xCD1A, 0xCD1A, 0x3E66, 0xCD1B, 0xCD1B, 0x0B67,
+ 0xCD1C, 0xCD1C, 0x3E67, 0xCD1D, 0xCD1D, 0x0B68, 0xCD1E, 0xCD23, 0x3E68,
+ 0xCD24, 0xCD24, 0x0B69, 0xCD25, 0xCD27, 0x3E6E, 0xCD28, 0xCD28, 0x0B6A,
+ 0xCD29, 0xCD2B, 0x3E71, 0xCD2C, 0xCD2C, 0x0B6B, 0xCD2D, 0xCD38, 0x3E74,
+ 0xCD39, 0xCD39, 0x0B6C, 0xCD3A, 0xCD5B, 0x3E80, 0xCD5C, 0xCD5C, 0x0B6D,
+ 0xCD5D, 0xCD5F, 0x3EA2, 0xCD60, 0xCD60, 0x0B6E, 0xCD61, 0xCD63, 0x3EA5,
+ 0xCD64, 0xCD64, 0x0B6F, 0xCD65, 0xCD6B, 0x3EA8, 0xCD6C, 0xCD6D, 0x0B70,
+ 0xCD6E, 0xCD6E, 0x3EAF, 0xCD6F, 0xCD6F, 0x0B72, 0xCD70, 0xCD70, 0x3EB0,
+ 0xCD71, 0xCD71, 0x0B73, 0xCD72, 0xCD77, 0x3EB1, 0xCD78, 0xCD78, 0x0B74,
+ 0xCD79, 0xCD87, 0x3EB7, 0xCD88, 0xCD88, 0x0B75, 0xCD89, 0xCD93, 0x3EC6,
+ 0xCD94, 0xCD95, 0x0B76, 0xCD96, 0xCD97, 0x3ED1, 0xCD98, 0xCD98, 0x0B78,
+ 0xCD99, 0xCD9B, 0x3ED3, 0xCD9C, 0xCD9C, 0x0B79, 0xCD9D, 0xCDA3, 0x3ED6,
+ 0xCDA4, 0xCDA5, 0x0B7A, 0xCDA6, 0xCDA6, 0x3EDD, 0xCDA7, 0xCDA7, 0x0B7C,
+ 0xCDA8, 0xCDA8, 0x3EDE, 0xCDA9, 0xCDA9, 0x0B7D, 0xCDAA, 0xCDAF, 0x3EDF,
+ 0xCDB0, 0xCDB0, 0x0B7E, 0xCDB1, 0xCDC3, 0x3EE5, 0xCDC4, 0xCDC4, 0x0B7F,
+ 0xCDC5, 0xCDCB, 0x3EF8, 0xCDCC, 0xCDCC, 0x0B80, 0xCDCD, 0xCDCF, 0x3EFF,
+ 0xCDD0, 0xCDD0, 0x0B81, 0xCDD1, 0xCDE7, 0x3F02, 0xCDE8, 0xCDE8, 0x0B82,
+ 0xCDE9, 0xCDEB, 0x3F19, 0xCDEC, 0xCDEC, 0x0B83, 0xCDED, 0xCDEF, 0x3F1C,
+ 0xCDF0, 0xCDF0, 0x0B84, 0xCDF1, 0xCDF7, 0x3F1F, 0xCDF8, 0xCDF9, 0x0B85,
+ 0xCDFA, 0xCDFA, 0x3F26, 0xCDFB, 0xCDFB, 0x0B87, 0xCDFC, 0xCDFC, 0x3F27,
+ 0xCDFD, 0xCDFD, 0x0B88, 0xCDFE, 0xCDFF, 0x3F28, 0xCE00, 0xCE03, 0x3F2A,
+ 0xCE04, 0xCE04, 0x0B89, 0xCE05, 0xCE07, 0x3F2E, 0xCE08, 0xCE08, 0x0B8A,
+ 0xCE09, 0xCE0B, 0x3F31, 0xCE0C, 0xCE0C, 0x0B8B, 0xCE0D, 0xCE13, 0x3F34,
+ 0xCE14, 0xCE14, 0x0B8C, 0xCE15, 0xCE18, 0x3F3B, 0xCE19, 0xCE19, 0x0B8D,
+ 0xCE1A, 0xCE1F, 0x3F3F, 0xCE20, 0xCE21, 0x0B8E, 0xCE22, 0xCE23, 0x3F45,
+ 0xCE24, 0xCE24, 0x0B90, 0xCE25, 0xCE27, 0x3F47, 0xCE28, 0xCE28, 0x0B91,
+ 0xCE29, 0xCE2F, 0x3F4A, 0xCE30, 0xCE31, 0x0B92, 0xCE32, 0xCE32, 0x3F51,
+ 0xCE33, 0xCE33, 0x0B94, 0xCE34, 0xCE34, 0x3F52, 0xCE35, 0xCE35, 0x0B95,
+ 0xCE36, 0xCE57, 0x3F53, 0xCE58, 0xCE59, 0x0B96, 0xCE5A, 0xCE5B, 0x3F75,
+ 0xCE5C, 0xCE5C, 0x0B98, 0xCE5D, 0xCE5E, 0x3F77, 0xCE5F, 0xCE61, 0x0B99,
+ 0xCE62, 0xCE67, 0x3F79, 0xCE68, 0xCE69, 0x0B9C, 0xCE6A, 0xCE6A, 0x3F7F,
+ 0xCE6B, 0xCE6B, 0x0B9E, 0xCE6C, 0xCE6C, 0x3F80, 0xCE6D, 0xCE6D, 0x0B9F,
+ 0xCE6E, 0xCE73, 0x3F81, 0xCE74, 0xCE75, 0x0BA0, 0xCE76, 0xCE77, 0x3F87,
+ 0xCE78, 0xCE78, 0x0BA2, 0xCE79, 0xCE7B, 0x3F89, 0xCE7C, 0xCE7C, 0x0BA3,
+ 0xCE7D, 0xCE83, 0x3F8C, 0xCE84, 0xCE85, 0x0BA4, 0xCE86, 0xCE86, 0x3F93,
+ 0xCE87, 0xCE87, 0x0BA6, 0xCE88, 0xCE88, 0x3F94, 0xCE89, 0xCE89, 0x0BA7,
+ 0xCE8A, 0xCE8F, 0x3F95, 0xCE90, 0xCE91, 0x0BA8, 0xCE92, 0xCE93, 0x3F9B,
+ 0xCE94, 0xCE94, 0x0BAA, 0xCE95, 0xCE97, 0x3F9D, 0xCE98, 0xCE98, 0x0BAB,
+ 0xCE99, 0xCE9F, 0x3FA0, 0xCEA0, 0xCEA1, 0x0BAC, 0xCEA2, 0xCEA2, 0x3FA7,
+ 0xCEA3, 0xCEA5, 0x0BAE, 0xCEA6, 0xCEAB, 0x3FA8, 0xCEAC, 0xCEAD, 0x0BB1,
+ 0xCEAE, 0xCEC0, 0x3FAE, 0xCEC1, 0xCEC1, 0x0BB3, 0xCEC2, 0xCEE3, 0x3FC1,
+ 0xCEE4, 0xCEE5, 0x0BB4, 0xCEE6, 0xCEE7, 0x3FE3, 0xCEE8, 0xCEE8, 0x0BB6,
+ 0xCEE9, 0xCEEA, 0x3FE5, 0xCEEB, 0xCEEC, 0x0BB7, 0xCEED, 0xCEF3, 0x3FE7,
+ 0xCEF4, 0xCEF5, 0x0BB9, 0xCEF6, 0xCEF6, 0x3FEE, 0xCEF7, 0xCEF9, 0x0BBB,
+ 0xCEFA, 0xCEFF, 0x3FEF, 0xCF00, 0xCF01, 0x0BBE, 0xCF02, 0xCF03, 0x3FF5,
+ 0xCF04, 0xCF04, 0x0BC0, 0xCF05, 0xCF07, 0x3FF7, 0xCF08, 0xCF08, 0x0BC1,
+ 0xCF09, 0xCF0F, 0x3FFA, 0xCF10, 0xCF11, 0x0BC2, 0xCF12, 0xCF12, 0x4001,
+ 0xCF13, 0xCF13, 0x0BC4, 0xCF14, 0xCF14, 0x4002, 0xCF15, 0xCF15, 0x0BC5,
+ 0xCF16, 0xCF1B, 0x4003, 0xCF1C, 0xCF1C, 0x0BC6, 0xCF1D, 0xCF1F, 0x4009,
+ 0xCF20, 0xCF20, 0x0BC7, 0xCF21, 0xCF23, 0x400C, 0xCF24, 0xCF24, 0x0BC8,
+ 0xCF25, 0xCF2B, 0x400F, 0xCF2C, 0xCF2D, 0x0BC9, 0xCF2E, 0xCF2E, 0x4016,
+ 0xCF2F, 0xCF31, 0x0BCB, 0xCF32, 0xCF37, 0x4017, 0xCF38, 0xCF38, 0x0BCE,
+ 0xCF39, 0xCF53, 0x401D, 0xCF54, 0xCF55, 0x0BCF, 0xCF56, 0xCF57, 0x4038,
+ 0xCF58, 0xCF58, 0x0BD1, 0xCF59, 0xCF5B, 0x403A, 0xCF5C, 0xCF5C, 0x0BD2,
+ 0xCF5D, 0xCF63, 0x403D, 0xCF64, 0xCF65, 0x0BD3, 0xCF66, 0xCF66, 0x4044,
+ 0xCF67, 0xCF67, 0x0BD5, 0xCF68, 0xCF68, 0x4045, 0xCF69, 0xCF69, 0x0BD6,
+ 0xCF6A, 0xCF6F, 0x4046, 0xCF70, 0xCF71, 0x0BD7, 0xCF72, 0xCF73, 0x404C,
+ 0xCF74, 0xCF74, 0x0BD9, 0xCF75, 0xCF77, 0x404E, 0xCF78, 0xCF78, 0x0BDA,
+ 0xCF79, 0xCF7F, 0x4051, 0xCF80, 0xCF80, 0x0BDB, 0xCF81, 0xCF84, 0x4058,
+ 0xCF85, 0xCF85, 0x0BDC, 0xCF86, 0xCF8B, 0x405C, 0xCF8C, 0xCF8C, 0x0BDD,
+ 0xCF8D, 0xCFA0, 0x4062, 0xCFA1, 0xCFA1, 0x0BDE, 0xCFA2, 0xCFA7, 0x4076,
+ 0xCFA8, 0xCFA8, 0x0BDF, 0xCFA9, 0xCFAF, 0x407C, 0xCFB0, 0xCFB0, 0x0BE0,
+ 0xCFB1, 0xCFC3, 0x4083, 0xCFC4, 0xCFC4, 0x0BE1, 0xCFC5, 0xCFDF, 0x4096,
+ 0xCFE0, 0xCFE1, 0x0BE2, 0xCFE2, 0xCFE3, 0x40B1, 0xCFE4, 0xCFE4, 0x0BE4,
+ 0xCFE5, 0xCFE7, 0x40B3, 0xCFE8, 0xCFE8, 0x0BE5, 0xCFE9, 0xCFEF, 0x40B6,
+ 0xCFF0, 0xCFF1, 0x0BE6, 0xCFF2, 0xCFF2, 0x40BD, 0xCFF3, 0xCFF3, 0x0BE8,
+ 0xCFF4, 0xCFF4, 0x40BE, 0xCFF5, 0xCFF5, 0x0BE9, 0xCFF6, 0xCFFB, 0x40BF,
+ 0xCFFC, 0xCFFC, 0x0BEA, 0xCFFD, 0xCFFF, 0x40C5, 0xD000, 0xD000, 0x0BEB,
+ 0xD001, 0xD003, 0x40C8, 0xD004, 0xD004, 0x0BEC, 0xD005, 0xD010, 0x40CB,
+ 0xD011, 0xD011, 0x0BED, 0xD012, 0xD017, 0x40D7, 0xD018, 0xD018, 0x0BEE,
+ 0xD019, 0xD02C, 0x40DD, 0xD02D, 0xD02D, 0x0BEF, 0xD02E, 0xD033, 0x40F1,
+ 0xD034, 0xD035, 0x0BF0, 0xD036, 0xD037, 0x40F7, 0xD038, 0xD038, 0x0BF2,
+ 0xD039, 0xD03B, 0x40F9, 0xD03C, 0xD03C, 0x0BF3, 0xD03D, 0xD043, 0x40FC,
+ 0xD044, 0xD045, 0x0BF4, 0xD046, 0xD046, 0x4103, 0xD047, 0xD047, 0x0BF6,
+ 0xD048, 0xD048, 0x4104, 0xD049, 0xD049, 0x0BF7, 0xD04A, 0xD04F, 0x4105,
+ 0xD050, 0xD050, 0x0BF8, 0xD051, 0xD053, 0x410B, 0xD054, 0xD054, 0x0BF9,
+ 0xD055, 0xD057, 0x410E, 0xD058, 0xD058, 0x0BFA, 0xD059, 0xD05F, 0x4111,
+ 0xD060, 0xD060, 0x0BFB, 0xD061, 0xD06B, 0x4118, 0xD06C, 0xD06D, 0x0BFC,
+ 0xD06E, 0xD06F, 0x4123, 0xD070, 0xD070, 0x0BFE, 0xD071, 0xD073, 0x4125,
+ 0xD074, 0xD074, 0x0BFF, 0xD075, 0xD07B, 0x4128, 0xD07C, 0xD07D, 0x0C00,
+ 0xD07E, 0xD080, 0x412F, 0xD081, 0xD081, 0x0C02, 0xD082, 0xD0A3, 0x4132,
+ 0xD0A4, 0xD0A5, 0x0C03, 0xD0A6, 0xD0A7, 0x4154, 0xD0A8, 0xD0A8, 0x0C05,
+ 0xD0A9, 0xD0AB, 0x4156, 0xD0AC, 0xD0AC, 0x0C06, 0xD0AD, 0xD0B3, 0x4159,
+ 0xD0B4, 0xD0B5, 0x0C07, 0xD0B6, 0xD0B6, 0x4160, 0xD0B7, 0xD0B7, 0x0C09,
+ 0xD0B8, 0xD0B8, 0x4161, 0xD0B9, 0xD0B9, 0x0C0A, 0xD0BA, 0xD0BF, 0x4162,
+ 0xD0C0, 0xD0C1, 0x0C0B, 0xD0C2, 0xD0C3, 0x4168, 0xD0C4, 0xD0C4, 0x0C0D,
+ 0xD0C5, 0xD0C7, 0x416A, 0xD0C8, 0xD0C9, 0x0C0E, 0xD0CA, 0xD0CF, 0x416D,
+ 0xD0D0, 0xD0D1, 0x0C10, 0xD0D2, 0xD0D2, 0x4173, 0xD0D3, 0xD0D5, 0x0C12,
+ 0xD0D6, 0xD0DB, 0x4174, 0xD0DC, 0xD0DD, 0x0C15, 0xD0DE, 0xD0DF, 0x417A,
+ 0xD0E0, 0xD0E0, 0x0C17, 0xD0E1, 0xD0E3, 0x417C, 0xD0E4, 0xD0E4, 0x0C18,
+ 0xD0E5, 0xD0EB, 0x417F, 0xD0EC, 0xD0ED, 0x0C19, 0xD0EE, 0xD0EE, 0x4186,
+ 0xD0EF, 0xD0F1, 0x0C1B, 0xD0F2, 0xD0F7, 0x4187, 0xD0F8, 0xD0F8, 0x0C1E,
+ 0xD0F9, 0xD0FF, 0x418D, 0xD100, 0xD10C, 0x4194, 0xD10D, 0xD10D, 0x0C1F,
+ 0xD10E, 0xD12F, 0x41A1, 0xD130, 0xD131, 0x0C20, 0xD132, 0xD133, 0x41C3,
+ 0xD134, 0xD134, 0x0C22, 0xD135, 0xD137, 0x41C5, 0xD138, 0xD138, 0x0C23,
+ 0xD139, 0xD139, 0x41C8, 0xD13A, 0xD13A, 0x0C24, 0xD13B, 0xD13F, 0x41C9,
+ 0xD140, 0xD141, 0x0C25, 0xD142, 0xD142, 0x41CE, 0xD143, 0xD145, 0x0C27,
+ 0xD146, 0xD14B, 0x41CF, 0xD14C, 0xD14D, 0x0C2A, 0xD14E, 0xD14F, 0x41D5,
+ 0xD150, 0xD150, 0x0C2C, 0xD151, 0xD153, 0x41D7, 0xD154, 0xD154, 0x0C2D,
+ 0xD155, 0xD15B, 0x41DA, 0xD15C, 0xD15D, 0x0C2E, 0xD15E, 0xD15E, 0x41E1,
+ 0xD15F, 0xD15F, 0x0C30, 0xD160, 0xD160, 0x41E2, 0xD161, 0xD161, 0x0C31,
+ 0xD162, 0xD167, 0x41E3, 0xD168, 0xD168, 0x0C32, 0xD169, 0xD16B, 0x41E9,
+ 0xD16C, 0xD16C, 0x0C33, 0xD16D, 0xD17B, 0x41EC, 0xD17C, 0xD17C, 0x0C34,
+ 0xD17D, 0xD183, 0x41FB, 0xD184, 0xD184, 0x0C35, 0xD185, 0xD187, 0x4202,
+ 0xD188, 0xD188, 0x0C36, 0xD189, 0xD19F, 0x4205, 0xD1A0, 0xD1A1, 0x0C37,
+ 0xD1A2, 0xD1A3, 0x421C, 0xD1A4, 0xD1A4, 0x0C39, 0xD1A5, 0xD1A7, 0x421E,
+ 0xD1A8, 0xD1A8, 0x0C3A, 0xD1A9, 0xD1AF, 0x4221, 0xD1B0, 0xD1B1, 0x0C3B,
+ 0xD1B2, 0xD1B2, 0x4228, 0xD1B3, 0xD1B3, 0x0C3D, 0xD1B4, 0xD1B4, 0x4229,
+ 0xD1B5, 0xD1B5, 0x0C3E, 0xD1B6, 0xD1B9, 0x422A, 0xD1BA, 0xD1BA, 0x0C3F,
+ 0xD1BB, 0xD1BB, 0x422E, 0xD1BC, 0xD1BC, 0x0C40, 0xD1BD, 0xD1BF, 0x422F,
+ 0xD1C0, 0xD1C0, 0x0C41, 0xD1C1, 0xD1D7, 0x4232, 0xD1D8, 0xD1D8, 0x0C42,
+ 0xD1D9, 0xD1F3, 0x4249, 0xD1F4, 0xD1F4, 0x0C43, 0xD1F5, 0xD1F7, 0x4264,
+ 0xD1F8, 0xD1F8, 0x0C44, 0xD1F9, 0xD1FF, 0x4267, 0xD200, 0xD206, 0x426E,
+ 0xD207, 0xD207, 0x0C45, 0xD208, 0xD208, 0x4275, 0xD209, 0xD209, 0x0C46,
+ 0xD20A, 0xD20F, 0x4276, 0xD210, 0xD210, 0x0C47, 0xD211, 0xD22B, 0x427C,
+ 0xD22C, 0xD22D, 0x0C48, 0xD22E, 0xD22F, 0x4297, 0xD230, 0xD230, 0x0C4A,
+ 0xD231, 0xD233, 0x4299, 0xD234, 0xD234, 0x0C4B, 0xD235, 0xD23B, 0x429C,
+ 0xD23C, 0xD23D, 0x0C4C, 0xD23E, 0xD23E, 0x42A3, 0xD23F, 0xD23F, 0x0C4E,
+ 0xD240, 0xD240, 0x42A4, 0xD241, 0xD241, 0x0C4F, 0xD242, 0xD247, 0x42A5,
+ 0xD248, 0xD248, 0x0C50, 0xD249, 0xD25B, 0x42AB, 0xD25C, 0xD25C, 0x0C51,
+ 0xD25D, 0xD263, 0x42BE, 0xD264, 0xD264, 0x0C52, 0xD265, 0xD27F, 0x42C5,
+ 0xD280, 0xD281, 0x0C53, 0xD282, 0xD283, 0x42E0, 0xD284, 0xD284, 0x0C55,
+ 0xD285, 0xD287, 0x42E2, 0xD288, 0xD288, 0x0C56, 0xD289, 0xD28F, 0x42E5,
+ 0xD290, 0xD291, 0x0C57, 0xD292, 0xD294, 0x42EC, 0xD295, 0xD295, 0x0C59,
+ 0xD296, 0xD29B, 0x42EF, 0xD29C, 0xD29C, 0x0C5A, 0xD29D, 0xD29F, 0x42F5,
+ 0xD2A0, 0xD2A0, 0x0C5B, 0xD2A1, 0xD2A3, 0x42F8, 0xD2A4, 0xD2A4, 0x0C5C,
+ 0xD2A5, 0xD2AB, 0x42FB, 0xD2AC, 0xD2AC, 0x0C5D, 0xD2AD, 0xD2B0, 0x4302,
+ 0xD2B1, 0xD2B1, 0x0C5E, 0xD2B2, 0xD2B7, 0x4306, 0xD2B8, 0xD2B9, 0x0C5F,
+ 0xD2BA, 0xD2BB, 0x430C, 0xD2BC, 0xD2BC, 0x0C61, 0xD2BD, 0xD2BE, 0x430E,
+ 0xD2BF, 0xD2C0, 0x0C62, 0xD2C1, 0xD2C1, 0x4310, 0xD2C2, 0xD2C2, 0x0C64,
+ 0xD2C3, 0xD2C7, 0x4311, 0xD2C8, 0xD2C9, 0x0C65, 0xD2CA, 0xD2CA, 0x4316,
+ 0xD2CB, 0xD2CB, 0x0C67, 0xD2CC, 0xD2D3, 0x4317, 0xD2D4, 0xD2D4, 0x0C68,
+ 0xD2D5, 0xD2D7, 0x431F, 0xD2D8, 0xD2D8, 0x0C69, 0xD2D9, 0xD2DB, 0x4322,
+ 0xD2DC, 0xD2DC, 0x0C6A, 0xD2DD, 0xD2E3, 0x4325, 0xD2E4, 0xD2E5, 0x0C6B,
+ 0xD2E6, 0xD2EF, 0x432C, 0xD2F0, 0xD2F1, 0x0C6D, 0xD2F2, 0xD2F3, 0x4336,
+ 0xD2F4, 0xD2F4, 0x0C6F, 0xD2F5, 0xD2F7, 0x4338, 0xD2F8, 0xD2F8, 0x0C70,
+ 0xD2F9, 0xD2FF, 0x433B, 0xD300, 0xD301, 0x0C71, 0xD302, 0xD302, 0x4342,
+ 0xD303, 0xD303, 0x0C73, 0xD304, 0xD304, 0x4343, 0xD305, 0xD305, 0x0C74,
+ 0xD306, 0xD30B, 0x4344, 0xD30C, 0xD30E, 0x0C75, 0xD30F, 0xD30F, 0x434A,
+ 0xD310, 0xD310, 0x0C78, 0xD311, 0xD313, 0x434B, 0xD314, 0xD314, 0x0C79,
+ 0xD315, 0xD315, 0x434E, 0xD316, 0xD316, 0x0C7A, 0xD317, 0xD31B, 0x434F,
+ 0xD31C, 0xD31D, 0x0C7B, 0xD31E, 0xD31E, 0x4354, 0xD31F, 0xD321, 0x0C7D,
+ 0xD322, 0xD324, 0x4355, 0xD325, 0xD325, 0x0C80, 0xD326, 0xD327, 0x4358,
+ 0xD328, 0xD329, 0x0C81, 0xD32A, 0xD32B, 0x435A, 0xD32C, 0xD32C, 0x0C83,
+ 0xD32D, 0xD32F, 0x435C, 0xD330, 0xD330, 0x0C84, 0xD331, 0xD337, 0x435F,
+ 0xD338, 0xD339, 0x0C85, 0xD33A, 0xD33A, 0x4366, 0xD33B, 0xD33D, 0x0C87,
+ 0xD33E, 0xD343, 0x4367, 0xD344, 0xD345, 0x0C8A, 0xD346, 0xD37B, 0x436D,
+ 0xD37C, 0xD37D, 0x0C8C, 0xD37E, 0xD37F, 0x43A3, 0xD380, 0xD380, 0x0C8E,
+ 0xD381, 0xD383, 0x43A5, 0xD384, 0xD384, 0x0C8F, 0xD385, 0xD38B, 0x43A8,
+ 0xD38C, 0xD38D, 0x0C90, 0xD38E, 0xD38E, 0x43AF, 0xD38F, 0xD391, 0x0C92,
+ 0xD392, 0xD397, 0x43B0, 0xD398, 0xD399, 0x0C95, 0xD39A, 0xD39B, 0x43B6,
+ 0xD39C, 0xD39C, 0x0C97, 0xD39D, 0xD39F, 0x43B8, 0xD3A0, 0xD3A0, 0x0C98,
+ 0xD3A1, 0xD3A7, 0x43BB, 0xD3A8, 0xD3A9, 0x0C99, 0xD3AA, 0xD3AA, 0x43C2,
+ 0xD3AB, 0xD3AB, 0x0C9B, 0xD3AC, 0xD3AC, 0x43C3, 0xD3AD, 0xD3AD, 0x0C9C,
+ 0xD3AE, 0xD3B3, 0x43C4, 0xD3B4, 0xD3B4, 0x0C9D, 0xD3B5, 0xD3B7, 0x43CA,
+ 0xD3B8, 0xD3B8, 0x0C9E, 0xD3B9, 0xD3BB, 0x43CD, 0xD3BC, 0xD3BC, 0x0C9F,
+ 0xD3BD, 0xD3C3, 0x43D0, 0xD3C4, 0xD3C5, 0x0CA0, 0xD3C6, 0xD3C7, 0x43D7,
+ 0xD3C8, 0xD3C9, 0x0CA2, 0xD3CA, 0xD3CF, 0x43D9, 0xD3D0, 0xD3D0, 0x0CA4,
+ 0xD3D1, 0xD3D7, 0x43DF, 0xD3D8, 0xD3D8, 0x0CA5, 0xD3D9, 0xD3E0, 0x43E6,
+ 0xD3E1, 0xD3E1, 0x0CA6, 0xD3E2, 0xD3E2, 0x43EE, 0xD3E3, 0xD3E3, 0x0CA7,
+ 0xD3E4, 0xD3EB, 0x43EF, 0xD3EC, 0xD3ED, 0x0CA8, 0xD3EE, 0xD3EF, 0x43F7,
+ 0xD3F0, 0xD3F0, 0x0CAA, 0xD3F1, 0xD3F3, 0x43F9, 0xD3F4, 0xD3F4, 0x0CAB,
+ 0xD3F5, 0xD3FB, 0x43FC, 0xD3FC, 0xD3FD, 0x0CAC, 0xD3FE, 0xD3FE, 0x4403,
+ 0xD3FF, 0xD3FF, 0x0CAE, 0xD400, 0xD400, 0x4404, 0xD401, 0xD401, 0x0CAF,
+ 0xD402, 0xD407, 0x4405, 0xD408, 0xD408, 0x0CB0, 0xD409, 0xD41C, 0x440B,
+ 0xD41D, 0xD41D, 0x0CB1, 0xD41E, 0xD43F, 0x441F, 0xD440, 0xD440, 0x0CB2,
+ 0xD441, 0xD443, 0x4441, 0xD444, 0xD444, 0x0CB3, 0xD445, 0xD45B, 0x4444,
+ 0xD45C, 0xD45C, 0x0CB4, 0xD45D, 0xD45F, 0x445B, 0xD460, 0xD460, 0x0CB5,
+ 0xD461, 0xD463, 0x445E, 0xD464, 0xD464, 0x0CB6, 0xD465, 0xD46C, 0x4461,
+ 0xD46D, 0xD46D, 0x0CB7, 0xD46E, 0xD46E, 0x4469, 0xD46F, 0xD46F, 0x0CB8,
+ 0xD470, 0xD477, 0x446A, 0xD478, 0xD479, 0x0CB9, 0xD47A, 0xD47B, 0x4472,
+ 0xD47C, 0xD47C, 0x0CBB, 0xD47D, 0xD47E, 0x4474, 0xD47F, 0xD480, 0x0CBC,
+ 0xD481, 0xD481, 0x4476, 0xD482, 0xD482, 0x0CBE, 0xD483, 0xD487, 0x4477,
+ 0xD488, 0xD489, 0x0CBF, 0xD48A, 0xD48A, 0x447C, 0xD48B, 0xD48B, 0x0CC1,
+ 0xD48C, 0xD48C, 0x447D, 0xD48D, 0xD48D, 0x0CC2, 0xD48E, 0xD493, 0x447E,
+ 0xD494, 0xD494, 0x0CC3, 0xD495, 0xD4A8, 0x4484, 0xD4A9, 0xD4A9, 0x0CC4,
+ 0xD4AA, 0xD4CB, 0x4498, 0xD4CC, 0xD4CC, 0x0CC5, 0xD4CD, 0xD4CF, 0x44BA,
+ 0xD4D0, 0xD4D0, 0x0CC6, 0xD4D1, 0xD4D3, 0x44BD, 0xD4D4, 0xD4D4, 0x0CC7,
+ 0xD4D5, 0xD4DB, 0x44C0, 0xD4DC, 0xD4DC, 0x0CC8, 0xD4DD, 0xD4DE, 0x44C7,
+ 0xD4DF, 0xD4DF, 0x0CC9, 0xD4E0, 0xD4E7, 0x44C9, 0xD4E8, 0xD4E8, 0x0CCA,
+ 0xD4E9, 0xD4EB, 0x44D1, 0xD4EC, 0xD4EC, 0x0CCB, 0xD4ED, 0xD4EF, 0x44D4,
+ 0xD4F0, 0xD4F0, 0x0CCC, 0xD4F1, 0xD4F7, 0x44D7, 0xD4F8, 0xD4F8, 0x0CCD,
+ 0xD4F9, 0xD4FA, 0x44DE, 0xD4FB, 0xD4FB, 0x0CCE, 0xD4FC, 0xD4FC, 0x44E0,
+ 0xD4FD, 0xD4FD, 0x0CCF, 0xD4FE, 0xD4FF, 0x44E1, 0xD500, 0xD503, 0x44E3,
+ 0xD504, 0xD504, 0x0CD0, 0xD505, 0xD507, 0x44E7, 0xD508, 0xD508, 0x0CD1,
+ 0xD509, 0xD50B, 0x44EA, 0xD50C, 0xD50C, 0x0CD2, 0xD50D, 0xD513, 0x44ED,
+ 0xD514, 0xD515, 0x0CD3, 0xD516, 0xD516, 0x44F4, 0xD517, 0xD517, 0x0CD5,
+ 0xD518, 0xD53B, 0x44F5, 0xD53C, 0xD53D, 0x0CD6, 0xD53E, 0xD53F, 0x4519,
+ 0xD540, 0xD540, 0x0CD8, 0xD541, 0xD543, 0x451B, 0xD544, 0xD544, 0x0CD9,
+ 0xD545, 0xD54B, 0x451E, 0xD54C, 0xD54D, 0x0CDA, 0xD54E, 0xD54E, 0x4525,
+ 0xD54F, 0xD54F, 0x0CDC, 0xD550, 0xD550, 0x4526, 0xD551, 0xD551, 0x0CDD,
+ 0xD552, 0xD557, 0x4527, 0xD558, 0xD559, 0x0CDE, 0xD55A, 0xD55B, 0x452D,
+ 0xD55C, 0xD55C, 0x0CE0, 0xD55D, 0xD55F, 0x452F, 0xD560, 0xD560, 0x0CE1,
+ 0xD561, 0xD564, 0x4532, 0xD565, 0xD565, 0x0CE2, 0xD566, 0xD567, 0x4536,
+ 0xD568, 0xD569, 0x0CE3, 0xD56A, 0xD56A, 0x4538, 0xD56B, 0xD56B, 0x0CE5,
+ 0xD56C, 0xD56C, 0x4539, 0xD56D, 0xD56D, 0x0CE6, 0xD56E, 0xD573, 0x453A,
+ 0xD574, 0xD575, 0x0CE7, 0xD576, 0xD577, 0x4540, 0xD578, 0xD578, 0x0CE9,
+ 0xD579, 0xD57B, 0x4542, 0xD57C, 0xD57C, 0x0CEA, 0xD57D, 0xD583, 0x4545,
+ 0xD584, 0xD585, 0x0CEB, 0xD586, 0xD586, 0x454C, 0xD587, 0xD589, 0x0CED,
+ 0xD58A, 0xD58F, 0x454D, 0xD590, 0xD590, 0x0CF0, 0xD591, 0xD5A4, 0x4553,
+ 0xD5A5, 0xD5A5, 0x0CF1, 0xD5A6, 0xD5C7, 0x4567, 0xD5C8, 0xD5C9, 0x0CF2,
+ 0xD5CA, 0xD5CB, 0x4589, 0xD5CC, 0xD5CC, 0x0CF4, 0xD5CD, 0xD5CF, 0x458B,
+ 0xD5D0, 0xD5D0, 0x0CF5, 0xD5D1, 0xD5D1, 0x458E, 0xD5D2, 0xD5D2, 0x0CF6,
+ 0xD5D3, 0xD5D7, 0x458F, 0xD5D8, 0xD5D9, 0x0CF7, 0xD5DA, 0xD5DA, 0x4594,
+ 0xD5DB, 0xD5DB, 0x0CF9, 0xD5DC, 0xD5DC, 0x4595, 0xD5DD, 0xD5DD, 0x0CFA,
+ 0xD5DE, 0xD5E3, 0x4596, 0xD5E4, 0xD5E5, 0x0CFB, 0xD5E6, 0xD5E7, 0x459C,
+ 0xD5E8, 0xD5E8, 0x0CFD, 0xD5E9, 0xD5EB, 0x459E, 0xD5EC, 0xD5EC, 0x0CFE,
+ 0xD5ED, 0xD5F3, 0x45A1, 0xD5F4, 0xD5F5, 0x0CFF, 0xD5F6, 0xD5F6, 0x45A8,
+ 0xD5F7, 0xD5F7, 0x0D01, 0xD5F8, 0xD5F8, 0x45A9, 0xD5F9, 0xD5F9, 0x0D02,
+ 0xD5FA, 0xD5FF, 0x45AA, 0xD600, 0xD601, 0x0D03, 0xD602, 0xD603, 0x45B0,
+ 0xD604, 0xD604, 0x0D05, 0xD605, 0xD607, 0x45B2, 0xD608, 0xD608, 0x0D06,
+ 0xD609, 0xD60F, 0x45B5, 0xD610, 0xD611, 0x0D07, 0xD612, 0xD612, 0x45BC,
+ 0xD613, 0xD615, 0x0D09, 0xD616, 0xD61B, 0x45BD, 0xD61C, 0xD61C, 0x0D0C,
+ 0xD61D, 0xD61F, 0x45C3, 0xD620, 0xD620, 0x0D0D, 0xD621, 0xD623, 0x45C6,
+ 0xD624, 0xD624, 0x0D0E, 0xD625, 0xD62C, 0x45C9, 0xD62D, 0xD62D, 0x0D0F,
+ 0xD62E, 0xD637, 0x45D1, 0xD638, 0xD639, 0x0D10, 0xD63A, 0xD63B, 0x45DB,
+ 0xD63C, 0xD63C, 0x0D12, 0xD63D, 0xD63F, 0x45DD, 0xD640, 0xD640, 0x0D13,
+ 0xD641, 0xD644, 0x45E0, 0xD645, 0xD645, 0x0D14, 0xD646, 0xD647, 0x45E4,
+ 0xD648, 0xD649, 0x0D15, 0xD64A, 0xD64A, 0x45E6, 0xD64B, 0xD64B, 0x0D17,
+ 0xD64C, 0xD64C, 0x45E7, 0xD64D, 0xD64D, 0x0D18, 0xD64E, 0xD650, 0x45E8,
+ 0xD651, 0xD651, 0x0D19, 0xD652, 0xD653, 0x45EB, 0xD654, 0xD655, 0x0D1A,
+ 0xD656, 0xD657, 0x45ED, 0xD658, 0xD658, 0x0D1C, 0xD659, 0xD65B, 0x45EF,
+ 0xD65C, 0xD65C, 0x0D1D, 0xD65D, 0xD666, 0x45F2, 0xD667, 0xD667, 0x0D1E,
+ 0xD668, 0xD668, 0x45FC, 0xD669, 0xD669, 0x0D1F, 0xD66A, 0xD66F, 0x45FD,
+ 0xD670, 0xD671, 0x0D20, 0xD672, 0xD673, 0x4603, 0xD674, 0xD674, 0x0D22,
+ 0xD675, 0xD682, 0x4605, 0xD683, 0xD683, 0x0D23, 0xD684, 0xD684, 0x4613,
+ 0xD685, 0xD685, 0x0D24, 0xD686, 0xD68B, 0x4614, 0xD68C, 0xD68D, 0x0D25,
+ 0xD68E, 0xD68F, 0x461A, 0xD690, 0xD690, 0x0D27, 0xD691, 0xD693, 0x461C,
+ 0xD694, 0xD694, 0x0D28, 0xD695, 0xD69C, 0x461F, 0xD69D, 0xD69D, 0x0D29,
+ 0xD69E, 0xD69E, 0x4627, 0xD69F, 0xD69F, 0x0D2A, 0xD6A0, 0xD6A0, 0x4628,
+ 0xD6A1, 0xD6A1, 0x0D2B, 0xD6A2, 0xD6A7, 0x4629, 0xD6A8, 0xD6A8, 0x0D2C,
+ 0xD6A9, 0xD6AB, 0x462F, 0xD6AC, 0xD6AC, 0x0D2D, 0xD6AD, 0xD6AF, 0x4632,
+ 0xD6B0, 0xD6B0, 0x0D2E, 0xD6B1, 0xD6B8, 0x4635, 0xD6B9, 0xD6B9, 0x0D2F,
+ 0xD6BA, 0xD6BA, 0x463D, 0xD6BB, 0xD6BB, 0x0D30, 0xD6BC, 0xD6C3, 0x463E,
+ 0xD6C4, 0xD6C5, 0x0D31, 0xD6C6, 0xD6C7, 0x4646, 0xD6C8, 0xD6C8, 0x0D33,
+ 0xD6C9, 0xD6CB, 0x4648, 0xD6CC, 0xD6CC, 0x0D34, 0xD6CD, 0xD6D0, 0x464B,
+ 0xD6D1, 0xD6D1, 0x0D35, 0xD6D2, 0xD6D3, 0x464F, 0xD6D4, 0xD6D4, 0x0D36,
+ 0xD6D5, 0xD6D6, 0x4651, 0xD6D7, 0xD6D7, 0x0D37, 0xD6D8, 0xD6D8, 0x4653,
+ 0xD6D9, 0xD6D9, 0x0D38, 0xD6DA, 0xD6DF, 0x4654, 0xD6E0, 0xD6E0, 0x0D39,
+ 0xD6E1, 0xD6E3, 0x465A, 0xD6E4, 0xD6E4, 0x0D3A, 0xD6E5, 0xD6E7, 0x465D,
+ 0xD6E8, 0xD6E8, 0x0D3B, 0xD6E9, 0xD6EF, 0x4660, 0xD6F0, 0xD6F0, 0x0D3C,
+ 0xD6F1, 0xD6F4, 0x4667, 0xD6F5, 0xD6F5, 0x0D3D, 0xD6F6, 0xD6FB, 0x466B,
+ 0xD6FC, 0xD6FD, 0x0D3E, 0xD6FE, 0xD6FF, 0x4671, 0xD700, 0xD700, 0x0D40,
+ 0xD701, 0xD703, 0x4673, 0xD704, 0xD704, 0x0D41, 0xD705, 0xD710, 0x4676,
+ 0xD711, 0xD711, 0x0D42, 0xD712, 0xD717, 0x4682, 0xD718, 0xD719, 0x0D43,
+ 0xD71A, 0xD71B, 0x4688, 0xD71C, 0xD71C, 0x0D45, 0xD71D, 0xD71F, 0x468A,
+ 0xD720, 0xD720, 0x0D46, 0xD721, 0xD727, 0x468D, 0xD728, 0xD729, 0x0D47,
+ 0xD72A, 0xD72A, 0x4694, 0xD72B, 0xD72B, 0x0D49, 0xD72C, 0xD72C, 0x4695,
+ 0xD72D, 0xD72D, 0x0D4A, 0xD72E, 0xD733, 0x4696, 0xD734, 0xD735, 0x0D4B,
+ 0xD736, 0xD737, 0x469C, 0xD738, 0xD738, 0x0D4D, 0xD739, 0xD73B, 0x469E,
+ 0xD73C, 0xD73C, 0x0D4E, 0xD73D, 0xD743, 0x46A1, 0xD744, 0xD744, 0x0D4F,
+ 0xD745, 0xD746, 0x46A8, 0xD747, 0xD747, 0x0D50, 0xD748, 0xD748, 0x46AA,
+ 0xD749, 0xD749, 0x0D51, 0xD74A, 0xD74F, 0x46AB, 0xD750, 0xD751, 0x0D52,
+ 0xD752, 0xD753, 0x46B1, 0xD754, 0xD754, 0x0D54, 0xD755, 0xD755, 0x46B3,
+ 0xD756, 0xD759, 0x0D55, 0xD75A, 0xD75F, 0x46B4, 0xD760, 0xD761, 0x0D59,
+ 0xD762, 0xD762, 0x46BA, 0xD763, 0xD763, 0x0D5B, 0xD764, 0xD764, 0x46BB,
+ 0xD765, 0xD765, 0x0D5C, 0xD766, 0xD768, 0x46BC, 0xD769, 0xD769, 0x0D5D,
+ 0xD76A, 0xD76B, 0x46BF, 0xD76C, 0xD76C, 0x0D5E, 0xD76D, 0xD76F, 0x46C1,
+ 0xD770, 0xD770, 0x0D5F, 0xD771, 0xD773, 0x46C4, 0xD774, 0xD774, 0x0D60,
+ 0xD775, 0xD77B, 0x46C7, 0xD77C, 0xD77D, 0x0D61, 0xD77E, 0xD780, 0x46CE,
+ 0xD781, 0xD781, 0x0D63, 0xD782, 0xD787, 0x46D1, 0xD788, 0xD789, 0x0D64,
+ 0xD78A, 0xD78B, 0x46D7, 0xD78C, 0xD78C, 0x0D66, 0xD78D, 0xD78F, 0x46D9,
+ 0xD790, 0xD790, 0x0D67, 0xD791, 0xD797, 0x46DC, 0xD798, 0xD799, 0x0D68,
+ 0xD79A, 0xD79A, 0x46E3, 0xD79B, 0xD79B, 0x0D6A, 0xD79C, 0xD79C, 0x46E4,
+ 0xD79D, 0xD79D, 0x0D6B, 0xD79E, 0xD7A3, 0x46E5, 0xF900, 0xF900, 0x1014,
+ 0xF901, 0xF901, 0x0E5E, 0xF902, 0xF902, 0x1B8D, 0xF903, 0xF903, 0x0D84,
+ 0xF904, 0xF904, 0x1EDC, 0xF905, 0xF905, 0x0EDA, 0xF906, 0xF906, 0x0F3E,
+ 0xF907, 0xF907, 0x0F6A, 0xF908, 0xF908, 0x0F6A, 0xF909, 0xF909, 0x0E7C,
+ 0xF90A, 0xF90A, 0x1023, 0xF90B, 0xF90B, 0x1116, 0xF90C, 0xF90C, 0x103C,
+ 0xF90D, 0xF913, 0x1117, 0xF914, 0xF914, 0x16A8, 0xF915, 0xF917, 0x111E,
+ 0xF918, 0xF91D, 0x1122, 0xF91E, 0xF920, 0x112A, 0xF921, 0xF921, 0x112F,
+ 0xF922, 0xF922, 0x1133, 0xF923, 0xF924, 0x1136, 0xF925, 0xF92B, 0x1139,
+ 0xF92C, 0xF92D, 0x1143, 0xF92E, 0xF92E, 0x1148, 0xF92F, 0xF92F, 0x119F,
+ 0xF930, 0xF931, 0x11A1, 0xF932, 0xF937, 0x11A5, 0xF938, 0xF93A, 0x11AC,
+ 0xF93B, 0xF940, 0x11B0, 0xF941, 0xF943, 0x11B7, 0xF944, 0xF945, 0x11BD,
+ 0xF946, 0xF948, 0x11C1, 0xF949, 0xF949, 0x11C6, 0xF94A, 0xF94A, 0x11D4,
+ 0xF94B, 0xF94E, 0x11D6, 0xF94F, 0xF950, 0x11DB, 0xF951, 0xF951, 0x11E0,
+ 0xF952, 0xF955, 0x11FC, 0xF956, 0xF959, 0x1201, 0xF95A, 0xF95A, 0x10DE,
+ 0xF95B, 0xF95B, 0x1028, 0xF95C, 0xF95C, 0x16A8, 0xF95D, 0xF95D, 0x102B,
+ 0xF95E, 0xF95E, 0x1060, 0xF95F, 0xF95F, 0x1047, 0xF960, 0xF960, 0x104C,
+ 0xF961, 0xF961, 0x15B0, 0xF962, 0xF962, 0x1918, 0xF963, 0xF963, 0x141F,
+ 0xF964, 0xF964, 0x133A, 0xF965, 0xF965, 0x1D5E, 0xF966, 0xF966, 0x13D7,
+ 0xF967, 0xF967, 0x13F5, 0xF968, 0xF968, 0x1DB7, 0xF969, 0xF969, 0x15D0,
+ 0xF96A, 0xF96A, 0x14F7, 0xF96B, 0xF96B, 0x1BAB, 0xF96C, 0xF96C, 0x14F2,
+ 0xF96D, 0xF96D, 0x156D, 0xF96E, 0xF96E, 0x1771, 0xF96F, 0xF96F, 0x1554,
+ 0xF970, 0xF970, 0x14C5, 0xF971, 0xF971, 0x1B61, 0xF972, 0xF972, 0x1CCA,
+ 0xF973, 0xF973, 0x162E, 0xF974, 0xF974, 0x16F2, 0xF975, 0xF977, 0x1149,
+ 0xF978, 0xF97A, 0x114D, 0xF97B, 0xF97D, 0x1153, 0xF97E, 0xF97E, 0x1157,
+ 0xF97F, 0xF980, 0x115A, 0xF981, 0xF981, 0x103F, 0xF982, 0xF982, 0x115C,
+ 0xF983, 0xF983, 0x115F, 0xF984, 0xF985, 0x1161, 0xF986, 0xF986, 0x1165,
+ 0xF987, 0xF98C, 0x1167, 0xF98D, 0xF98D, 0x116F, 0xF98E, 0xF98E, 0x1040,
+ 0xF98F, 0xF990, 0x1171, 0xF991, 0xF991, 0x1041, 0xF992, 0xF994, 0x1174,
+ 0xF995, 0xF995, 0x1042, 0xF996, 0xF997, 0x1177, 0xF998, 0xF998, 0x117A,
+ 0xF999, 0xF999, 0x1179, 0xF99A, 0xF99B, 0x117B, 0xF99C, 0xF99D, 0x117E,
+ 0xF99E, 0xF99E, 0x192F, 0xF99F, 0xF9A0, 0x1181, 0xF9A1, 0xF9A1, 0x1554,
+ 0xF9A2, 0xF9A2, 0x1183, 0xF9A3, 0xF9A3, 0x1043, 0xF9A4, 0xF9A4, 0x1046,
+ 0xF9A5, 0xF9A5, 0x1185, 0xF9A6, 0xF9A8, 0x1187, 0xF9A9, 0xF9A9, 0x118B,
+ 0xF9AA, 0xF9AA, 0x1047, 0xF9AB, 0xF9AD, 0x118D, 0xF9AE, 0xF9AE, 0x1E67,
+ 0xF9AF, 0xF9AF, 0x1191, 0xF9B0, 0xF9B0, 0x1193, 0xF9B1, 0xF9B4, 0x1195,
+ 0xF9B5, 0xF9B5, 0x119A, 0xF9B6, 0xF9B8, 0x119C, 0xF9B9, 0xF9B9, 0x16A5,
+ 0xF9BA, 0xF9BC, 0x11C7, 0xF9BD, 0xF9BD, 0x1054, 0xF9BE, 0xF9BE, 0x11CB,
+ 0xF9BF, 0xF9BF, 0x16A8, 0xF9C0, 0xF9C1, 0x11CC, 0xF9C2, 0xF9C3, 0x11D0,
+ 0xF9C4, 0xF9C4, 0x11D3, 0xF9C5, 0xF9C5, 0x1F34, 0xF9C6, 0xF9C6, 0x17EB,
+ 0xF9C7, 0xF9C7, 0x11E1, 0xF9C8, 0xF9C8, 0x1057, 0xF9C9, 0xF9C9, 0x11E3,
+ 0xF9CA, 0xF9CB, 0x11E5, 0xF9CC, 0xF9CC, 0x11E8, 0xF9CD, 0xF9CD, 0x11EA,
+ 0xF9CE, 0xF9CE, 0x11EC, 0xF9CF, 0xF9CF, 0x1058, 0xF9D0, 0xF9D3, 0x11EE,
+ 0xF9D4, 0xF9D6, 0x11F3, 0xF9D7, 0xF9DA, 0x11F7, 0xF9DB, 0xF9DB, 0x15B0,
+ 0xF9DC, 0xF9DC, 0x11FB, 0xF9DD, 0xF9DD, 0x1206, 0xF9DE, 0xF9DE, 0x1208,
+ 0xF9DF, 0xF9DF, 0x120A, 0xF9E0, 0xF9E0, 0x173E, 0xF9E1, 0xF9E2, 0x120C,
+ 0xF9E3, 0xF9E3, 0x105B, 0xF9E4, 0xF9E4, 0x1211, 0xF9E5, 0xF9E5, 0x1213,
+ 0xF9E6, 0xF9E6, 0x1215, 0xF9E7, 0xF9E9, 0x1218, 0xF9EA, 0xF9EA, 0x121C,
+ 0xF9EB, 0xF9EC, 0x105C, 0xF9ED, 0xF9ED, 0x121E, 0xF9EE, 0xF9F0, 0x1220,
+ 0xF9F1, 0xF9F5, 0x1224, 0xF9F6, 0xF9F6, 0x122A, 0xF9F7, 0xF9F9, 0x122D,
+ 0xF9FA, 0xF9FA, 0x14E7, 0xF9FB, 0xF9FB, 0x195E, 0xF9FC, 0xF9FC, 0x1663,
+ 0xF9FD, 0xF9FD, 0x168B, 0xF9FE, 0xF9FE, 0x105F, 0xF9FF, 0xF9FF, 0x1954,
+ 0xFA00, 0xFA00, 0x1A1C, 0xFA01, 0xFA01, 0x10B7, 0xFA02, 0xFA02, 0x1BE3,
+ 0xFA03, 0xFA03, 0x1097, 0xFA04, 0xFA04, 0x10AA, 0xFA05, 0xFA05, 0x10F4,
+ 0xFA06, 0xFA06, 0x1D94, 0xFA07, 0xFA07, 0x13E0, 0xFA08, 0xFA08, 0x1E1D,
+ 0xFA09, 0xFA09, 0x0DE6, 0xFA0A, 0xFA0A, 0x0E3C, 0xFA0B, 0xFA0B, 0x0EE7,
+ 0xFF01, 0xFF3B, 0x0108, 0xFF3C, 0xFF3C, 0x0070, 0xFF3D, 0xFF5D, 0x0144,
+ 0xFF5E, 0xFF5E, 0x0071, 0xFFE0, 0xFFE1, 0x008F, 0xFFE2, 0xFFE2, 0x00C2,
+ 0xFFE3, 0xFFE3, 0x0165, 0xFFE5, 0xFFE5, 0x0091, 0xFFE6, 0xFFE6, 0x0143,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp
new file mode 100644
index 0000000000..014697bcf8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UCS2_V_1[18 * 3] = {
+ 0x2013, 0x2014, 0x1F7B, 0x2016, 0x2016, 0x1F7D, 0x2025, 0x2025, 0x1F7A,
+ 0x3001, 0x3002, 0x1F78, 0x3008, 0x3011, 0x1F81, 0x3013, 0x3013, 0x1F8B,
+ 0x3014, 0x3015, 0x1F7F, 0xFF01, 0xFF01, 0x1F8C, 0xFF08, 0xFF09, 0x1F8D,
+ 0xFF0C, 0xFF0C, 0x1F8F, 0xFF0E, 0xFF0E, 0x1F90, 0xFF1A, 0xFF1F, 0x1F91,
+ 0xFF3B, 0xFF3B, 0x1F97, 0xFF3D, 0xFF3D, 0x1F98, 0xFF3F, 0xFF3F, 0x1F99,
+ 0xFF5B, 0xFF5D, 0x1F9A, 0xFF5E, 0xFF5E, 0x1F7E, 0xFFE3, 0xFFE3, 0x1F9D,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
new file mode 100644
index 0000000000..1154f553eb
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp
@@ -0,0 +1,48 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+extern const unsigned short g_FXCMAP_UniKS_UTF16_H_0[158 * 2] = {
+ 0x00A9, 0x0062, 0x2010, 0x0061, 0x20A9, 0x0060, 0x2F00, 0x193C,
+ 0x2F04, 0x18EC, 0x2F06, 0x190D, 0x2F08, 0x192B, 0x2F0A, 0x194D,
+ 0x2F0B, 0x1D4B, 0x2F11, 0x10AE, 0x2F12, 0x116A, 0x2F14, 0x143F,
+ 0x2F17, 0x168C, 0x2F18, 0x13D5, 0x2F1C, 0x1839, 0x2F1D, 0x0F3D,
+ 0x2F1F, 0x1D1B, 0x2F20, 0x1487, 0x2F23, 0x151B, 0x2F24, 0x109D,
+ 0x2F25, 0x103F, 0x2F26, 0x1958, 0x2F28, 0x1C4F, 0x2F29, 0x1580,
+ 0x2F2B, 0x1641, 0x2F2D, 0x14B9, 0x2F2F, 0x0ECF, 0x2F30, 0x0FED,
+ 0x2F31, 0x0E14, 0x2F32, 0x0D99, 0x2F38, 0x0F7C, 0x2F3C, 0x1684,
+ 0x2F3D, 0x0EDC, 0x2F3E, 0x1E80, 0x2F3F, 0x15CC, 0x2F40, 0x1B27,
+ 0x2F42, 0x12E8, 0x2F43, 0x10FD, 0x2F44, 0x0FBB, 0x2F45, 0x1356,
+ 0x2F46, 0x12D3, 0x2F47, 0x1940, 0x2F48, 0x17ED, 0x2F49, 0x1889,
+ 0x2F4A, 0x12B4, 0x2F4B, 0x1F5B, 0x2F4C, 0x1B2C, 0x2F4F, 0x12D6,
+ 0x2F50, 0x144C, 0x2F51, 0x12A8, 0x2F52, 0x168E, 0x2F54, 0x15D3,
+ 0x2F55, 0x1EBB, 0x2F56, 0x1A93, 0x2F57, 0x1409, 0x2F58, 0x1F1A,
+ 0x2F5A, 0x1D61, 0x2F5B, 0x1696, 0x2F5C, 0x1842, 0x2F5D, 0x0E37,
+ 0x2F5E, 0x1E3D, 0x2F5F, 0x17C1, 0x2F60, 0x0EDE, 0x2F61, 0x17D4,
+ 0x2F62, 0x0DC1, 0x2F63, 0x14FA, 0x2F64, 0x182D, 0x2F65, 0x1A08,
+ 0x2F66, 0x1DBA, 0x2F69, 0x1381, 0x2F6A, 0x1DB0, 0x2F6B, 0x1293,
+ 0x2F6C, 0x12B7, 0x2F6D, 0x12AD, 0x2F6E, 0x164D, 0x2F6F, 0x1525,
+ 0x2F70, 0x164E, 0x2F72, 0x1EBE, 0x2F73, 0x1E4B, 0x2F74, 0x122D,
+ 0x2F75, 0x1AF4, 0x2F76, 0x12FF, 0x2F78, 0x140C, 0x2F7A, 0x1708,
+ 0x2F7B, 0x184A, 0x2F7C, 0x11A7, 0x2F7D, 0x191B, 0x2F7F, 0x191C,
+ 0x2F80, 0x18E0, 0x2F81, 0x18D5, 0x2F82, 0x1675, 0x2F83, 0x1966,
+ 0x2F84, 0x1B37, 0x2F85, 0x0F5A, 0x2F86, 0x1550, 0x2F87, 0x1BF6,
+ 0x2F88, 0x1AE8, 0x2F89, 0x0DA8, 0x2F8A, 0x14F8, 0x2F8B, 0x1C40,
+ 0x2F8E, 0x1E4C, 0x2F8F, 0x1E1D, 0x2F90, 0x1909, 0x2F92, 0x0E3C,
+ 0x2F93, 0x0D92, 0x2F94, 0x1721, 0x2F95, 0x0EBC, 0x2F96, 0x1103,
+ 0x2F97, 0x1656, 0x2F99, 0x1D58, 0x2F9A, 0x19EC, 0x2F9B, 0x1AEC,
+ 0x2F9C, 0x1AAE, 0x2F9D, 0x167B, 0x2F9E, 0x1B8D, 0x2F9F, 0x167C,
+ 0x2FA0, 0x1B61, 0x2FA2, 0x18F5, 0x2FA3, 0x18D0, 0x2FA5, 0x121A,
+ 0x2FA6, 0x1023, 0x2FA7, 0x19A8, 0x2FA8, 0x12EE, 0x2FA9, 0x141B,
+ 0x2FAC, 0x1853, 0x2FAD, 0x1C23, 0x2FAE, 0x1464, 0x2FAF, 0x1288,
+ 0x2FB0, 0x1E35, 0x2FB1, 0x18A3, 0x2FB3, 0x18F1, 0x2FB4, 0x1E4D,
+ 0x2FB5, 0x1DAB, 0x2FB6, 0x1465, 0x2FB7, 0x1665, 0x2FB8, 0x15F9,
+ 0x2FB9, 0x1E26, 0x2FBA, 0x1235, 0x2FBB, 0x0EC9, 0x2FBC, 0x0EB5,
+ 0x2FC1, 0x0F99, 0x2FC2, 0x1716, 0x2FC3, 0x1AAB, 0x2FC4, 0x11AF,
+ 0x2FC5, 0x11B5, 0x2FC6, 0x1276, 0x2FC7, 0x1237, 0x2FC8, 0x1EF7,
+ 0x2FC9, 0x1519, 0x2FCA, 0x1F52, 0x2FCD, 0x1A66, 0x2FCE, 0x0EB6,
+ 0x2FCF, 0x151A, 0x2FD0, 0x1466, 0x2FD1, 0x1A7D, 0x2FD2, 0x1CBF,
+ 0x2FD3, 0x11D3, 0x2FD4, 0x0F6A,
+};
diff --git a/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp b/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp
new file mode 100644
index 0000000000..c80b74339b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../../include/fpdfapi/fpdf_module.h"
+#include "../../fpdf_font/font_int.h"
+#include "../cmap_int.h"
+extern const FX_WORD g_FXCMAP_KSC_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_KSC_EUC_V_0[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_H_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_V_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_HW_H_1[];
+extern const FX_WORD g_FXCMAP_KSCms_UHC_HW_V_1[];
+extern const FX_WORD g_FXCMAP_KSCpc_EUC_H_0[];
+extern const FX_WORD g_FXCMAP_UniKS_UCS2_H_1[];
+extern const FX_WORD g_FXCMAP_UniKS_UCS2_V_1[];
+extern const FX_WORD g_FXCMAP_UniKS_UTF16_H_0[];
+extern const FX_WORD g_FXCMAP_Korea1CID2Unicode_2[];
+const FXCMAP_CMap g_FXCMAP_Korea1_cmaps[] = {
+ { "KSC-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_H_0, 467, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "KSC-EUC-V", FXCMAP_CMap::Range, g_FXCMAP_KSC_EUC_V_0, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "KSCms-UHC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_H_1, 675, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "KSCms-UHC-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "KSCms-UHC-HW-H", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_H_1, 675, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "KSCms-UHC-HW-V", FXCMAP_CMap::Range, g_FXCMAP_KSCms_UHC_HW_V_1, 16, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "KSCpc-EUC-H", FXCMAP_CMap::Range, g_FXCMAP_KSCpc_EUC_H_0, 509, FXCMAP_CMap::None, NULL, 0, -6 },
+ { "UniKS-UCS2-H", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_H_1, 8394, FXCMAP_CMap::None, NULL, 0, 0 },
+ { "UniKS-UCS2-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+ { "UniKS-UTF16-H", FXCMAP_CMap::Single, g_FXCMAP_UniKS_UTF16_H_0, 158, FXCMAP_CMap::None, NULL, 0, -2 },
+ { "UniKS-UTF16-V", FXCMAP_CMap::Range, g_FXCMAP_UniKS_UCS2_V_1, 18, FXCMAP_CMap::None, NULL, 0, -1 },
+};
+void CPDF_ModuleMgr::LoadEmbeddedKorea1CMaps()
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_pMapList = g_FXCMAP_Korea1_cmaps;
+ pFontGlobals->m_EmbeddedCharsets[CIDSET_KOREA1].m_Count = sizeof g_FXCMAP_Korea1_cmaps / sizeof (FXCMAP_CMap);
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_pMap = g_FXCMAP_Korea1CID2Unicode_2;
+ pFontGlobals->m_EmbeddedToUnicodes[CIDSET_KOREA1].m_Count = 18352;
+}
diff --git a/core/src/fpdfapi/fpdf_cmaps/cmap_int.h b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
new file mode 100644
index 0000000000..2ce1522dd0
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/cmap_int.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFAPI_CMAP_INT_H_
+#define _FPDFAPI_CMAP_INT_H_
+struct FXCMAP_CMap {
+ typedef enum { None, Single, Range, Reverse } MapType;
+ const char* m_Name;
+ MapType m_WordMapType;
+ const FX_WORD* m_pWordMap;
+ int m_WordCount;
+ MapType m_DWordMapType;
+ const FX_WORD* m_pDWordMap;
+ int m_DWordCount;
+ int m_UseOffset;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
new file mode 100644
index 0000000000..9ab324b666
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
@@ -0,0 +1,183 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_font/font_int.h"
+#include "cmap_int.h"
+void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap)
+{
+ pMap = NULL;
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FXCMAP_CMap* pCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;
+ int nCMaps = pFontGlobals->m_EmbeddedCharsets[charset].m_Count;
+ for (int i = 0; i < nCMaps; i ++) {
+ if (FXSYS_strcmp(name, pCMaps[i].m_Name)) {
+ continue;
+ }
+ pMap = &pCMaps[i];
+ break;
+ }
+}
+extern "C" {
+ static int compareWord(const void* p1, const void* p2)
+ {
+ return (*(FX_WORD*)p1) - (*(FX_WORD*)p2);
+ }
+};
+extern "C" {
+ static int compareWordRange(const void* key, const void* element)
+ {
+ if (*(FX_WORD*)key < * (FX_WORD*)element) {
+ return -1;
+ }
+ if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) {
+ return 1;
+ }
+ return 0;
+ }
+};
+extern "C" {
+ static int compareDWordRange(const void* p1, const void* p2)
+ {
+ FX_DWORD key = *(FX_DWORD*)p1;
+ FX_WORD hiword = (FX_WORD)(key >> 16);
+ FX_WORD* element = (FX_WORD*)p2;
+ if (hiword < element[0]) {
+ return -1;
+ }
+ if (hiword > element[0]) {
+ return 1;
+ }
+ FX_WORD loword = (FX_WORD)key;
+ if (loword < element[1]) {
+ return -1;
+ }
+ if (loword > element[2]) {
+ return 1;
+ }
+ return 0;
+ }
+};
+extern "C" {
+ static int compareDWordSingle(const void* p1, const void* p2)
+ {
+ FX_DWORD key = *(FX_DWORD*)p1;
+ FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1];
+ if (key < value) {
+ return -1;
+ }
+ if (key > value) {
+ return 1;
+ }
+ return 0;
+ }
+};
+FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode)
+{
+ if (charcode >> 16) {
+ while (1) {
+ if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 8, compareDWordRange);
+ if (found) {
+ return found[3] + (FX_WORD)charcode - found[1];
+ }
+ } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, pMap->m_DWordCount, 6, compareDWordSingle);
+ if (found) {
+ return found[2];
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+ }
+ FX_WORD code = (FX_WORD)charcode;
+ while (1) {
+ if (pMap->m_pWordMap == NULL) {
+ return 0;
+ }
+ if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord);
+ if (found) {
+ return found[1];
+ }
+ } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
+ FX_WORD* found = (FX_WORD*)FXSYS_bsearch(&code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange);
+ if (found) {
+ return found[2] + code - found[0];
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+}
+FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid)
+{
+ while (1) {
+ if (pMap->m_WordMapType == FXCMAP_CMap::Single) {
+ const FX_WORD *pCur = pMap->m_pWordMap;
+ const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2;
+ while (pCur < pEnd) {
+ if (pCur[1] == cid) {
+ return pCur[0];
+ }
+ pCur += 2;
+ }
+ } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) {
+ const FX_WORD *pCur = pMap->m_pWordMap;
+ const FX_WORD *pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3;
+ while (pCur < pEnd) {
+ if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) {
+ return pCur[0] + cid - pCur[2];
+ }
+ pCur += 3;
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ while (1) {
+ if (pMap->m_DWordMapType == FXCMAP_CMap::Range) {
+ const FX_WORD *pCur = pMap->m_pDWordMap;
+ const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4;
+ while (pCur < pEnd) {
+ if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) {
+ return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3];
+ }
+ pCur += 4;
+ }
+ } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) {
+ const FX_WORD *pCur = pMap->m_pDWordMap;
+ const FX_WORD *pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3;
+ while (pCur < pEnd) {
+ if (pCur[2] == cid) {
+ return ((FX_DWORD)pCur[0] << 16) | pCur[1];
+ }
+ pCur += 3;
+ }
+ }
+ if (pMap->m_UseOffset == 0) {
+ return 0;
+ }
+ pMap = pMap + pMap->m_UseOffset;
+ }
+ return 0;
+}
+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count)
+{
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
+}
diff --git a/core/src/fpdfapi/fpdf_edit/editint.h b/core/src/fpdfapi/fpdf_edit/editint.h
new file mode 100644
index 0000000000..bceba1a745
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/editint.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_EDITINT_
+#define _FPDF_EDITINT_
+class CPDF_ObjectStream : public CFX_Object
+{
+public:
+ CPDF_ObjectStream();
+
+ FX_BOOL Start();
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj);
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize);
+
+ FX_FILESIZE End(CPDF_Creator* pCreator);
+
+ CFX_DWordArray m_ObjNumArray;
+
+ CFX_ByteTextBuf m_Buffer;
+ FX_DWORD m_dwObjNum;
+ FX_INT32 m_index;
+protected:
+
+ CFX_DWordArray m_OffsetArray;
+};
+class CPDF_XRefStream : public CFX_Object
+{
+public:
+
+ CPDF_XRefStream();
+
+ FX_BOOL Start();
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator);
+
+ FX_INT32 CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator);
+
+ FX_BOOL End(CPDF_Creator *pCreator, FX_BOOL bEOF = FALSE);
+ FX_BOOL AddObjectNumberToIndexArray(FX_DWORD objnum);
+ FX_BOOL EndXRefStream(CPDF_Creator* pCreator);
+
+
+ CFX_DWordArray m_IndexArray;
+
+ FX_FILESIZE m_PrevOffset;
+ FX_DWORD m_dwTempObjNum;
+
+protected:
+ FX_INT32 EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF = TRUE);
+ FX_BOOL GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF);
+ FX_INT32 m_iSeg;
+ CPDF_ObjectStream m_ObjStream;
+ CFX_ByteTextBuf m_Buffer;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
new file mode 100644
index 0000000000..798c77261b
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
@@ -0,0 +1,164 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../fpdf_page/pageint.h"
+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& ar, CFX_AffineMatrix& matrix)
+{
+ ar << matrix.a << " " << matrix.b << " " << matrix.c << " " << matrix.d << " " << matrix.e << " " << matrix.f;
+ return ar;
+}
+CPDF_PageContentGenerate::CPDF_PageContentGenerate(CPDF_Page* pPage) : m_pPage(pPage)
+{
+ m_pDocument = NULL;
+ if (m_pPage) {
+ m_pDocument = m_pPage->m_pDocument;
+ }
+}
+CPDF_PageContentGenerate::~CPDF_PageContentGenerate()
+{
+ for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
+ if (pPageObj) {
+ pPageObj->Release();
+ }
+ }
+}
+FX_BOOL CPDF_PageContentGenerate::InsertPageObject(CPDF_PageObject* pPageObject)
+{
+ if (!pPageObject) {
+ return FALSE;
+ }
+ return m_pageObjects.Add(pPageObject);
+}
+void CPDF_PageContentGenerate::GenerateContent()
+{
+ CFX_ByteTextBuf buf;
+ CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;
+ for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_pageObjects[i];
+ if (!pPageObj || pPageObj->m_Type != PDFPAGE_IMAGE) {
+ continue;
+ }
+ ProcessImage(buf, (CPDF_ImageObject*)pPageObj);
+ }
+ CPDF_Object* pContent = pPageDict->GetElementValue("Contents");
+ if (pContent != NULL) {
+ pPageDict->RemoveAt("Contents");
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
+ m_pDocument->AddIndirectObject(pStream);
+ pPageDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
+}
+CFX_ByteString CPDF_PageContentGenerate::RealizeResource(CPDF_Object* pResourceObj, const FX_CHAR* szType)
+{
+ if (m_pPage->m_pResources == NULL) {
+ m_pPage->m_pResources = FX_NEW CPDF_Dictionary;
+ int objnum = m_pDocument->AddIndirectObject(m_pPage->m_pResources);
+ m_pPage->m_pFormDict->SetAtReference("Resources", m_pDocument, objnum);
+ }
+ CPDF_Dictionary* pResList = m_pPage->m_pResources->GetDict(szType);
+ if (pResList == NULL) {
+ pResList = FX_NEW CPDF_Dictionary;
+ m_pPage->m_pResources->SetAt(szType, pResList);
+ }
+ m_pDocument->AddIndirectObject(pResourceObj);
+ CFX_ByteString name;
+ int idnum = 1;
+ while (1) {
+ name.Format("FX%c%d", szType[0], idnum);
+ if (!pResList->KeyExist(name)) {
+ break;
+ }
+ idnum ++;
+ }
+ pResList->AddReference(name, m_pDocument, pResourceObj->GetObjNum());
+ return name;
+}
+void CPDF_PageContentGenerate::ProcessImage(CFX_ByteTextBuf& buf, CPDF_ImageObject* pImageObj)
+{
+ if ((pImageObj->m_Matrix.a == 0 && pImageObj->m_Matrix.b == 0) ||
+ (pImageObj->m_Matrix.c == 0 && pImageObj->m_Matrix.d == 0)) {
+ return;
+ }
+ buf << "q " << pImageObj->m_Matrix << " cm ";
+ if (!pImageObj->m_pImage->IsInline()) {
+ CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
+ FX_DWORD dwSavedObjNum = pStream->GetObjNum();
+ CFX_ByteString name = RealizeResource(pStream, "XObject");
+ if (dwSavedObjNum == 0) {
+ pImageObj->m_pImage->Release();
+ pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pStream);
+ }
+ buf << "/" << PDF_NameEncode(name) << " Do Q\n";
+ }
+}
+void CPDF_PageContentGenerate::ProcessForm(CFX_ByteTextBuf& buf, FX_LPCBYTE data, FX_DWORD size, CFX_Matrix& matrix)
+{
+ if (!data || !size) {
+ return;
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();
+ pFormDict->SetAtName(FX_BSTR("Type"), FX_BSTR("XObject"));
+ pFormDict->SetAtName(FX_BSTR("Subtype"), FX_BSTR("Form"));
+ CFX_FloatRect bbox = m_pPage->GetPageBBox();
+ matrix.TransformRect(bbox);
+ pFormDict->SetAtRect(FX_BSTR("BBox"), bbox);
+ pStream->InitStream((FX_LPBYTE)data, size, pFormDict);
+ buf << "q " << matrix << " cm ";
+ CFX_ByteString name = RealizeResource(pStream, "XObject");
+ buf << "/" << PDF_NameEncode(name) << " Do Q\n";
+}
+void CPDF_PageContentGenerate::TransformContent(CFX_Matrix& matrix)
+{
+ CPDF_Object* pContent = m_pPage->m_pFormDict->GetElementValue("Contents");
+ if (!pContent) {
+ return;
+ }
+ CFX_ByteTextBuf buf;
+ int type = pContent->GetType();
+ if (type == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContent;
+ int iCount = pArray->GetCount();
+ CPDF_StreamAcc** pContentArray = (CPDF_StreamAcc**)FX_Alloc(CPDF_StreamAcc*, iCount);
+ int size = 0;
+ int i = 0;
+ for (i = 0; i < iCount; ++i) {
+ pContent = pArray->GetElement(i);
+ if (!pContent || pContent->GetType() != PDFOBJ_STREAM) {
+ continue;
+ }
+ CPDF_StreamAcc* pStream = FX_NEW CPDF_StreamAcc();
+ pStream->LoadAllData((CPDF_Stream*)pContent);
+ pContentArray[i] = pStream;
+ size += pContentArray[i]->GetSize() + 1;
+ }
+ int pos = 0;
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, size);
+ for (i = 0; i < iCount; ++i) {
+ FXSYS_memcpy32(pBuf + pos, pContentArray[i]->GetData(), pContentArray[i]->GetSize());
+ pos += pContentArray[i]->GetSize() + 1;
+ pBuf[pos - 1] = ' ';
+ delete pContentArray[i];
+ }
+ ProcessForm(buf, pBuf, size, matrix);
+ FX_Free(pBuf);
+ FX_Free(pContentArray);
+ } else if (type == PDFOBJ_STREAM) {
+ CPDF_StreamAcc contentStream;
+ contentStream.LoadAllData((CPDF_Stream*)pContent);
+ ProcessForm(buf, contentStream.GetData(), contentStream.GetSize(), matrix);
+ }
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ pStream->SetData(buf.GetBuffer(), buf.GetLength(), FALSE, FALSE);
+ m_pDocument->AddIndirectObject(pStream);
+ m_pPage->m_pFormDict->SetAtReference("Contents", m_pDocument, pStream->GetObjNum());
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
new file mode 100644
index 0000000000..4ec3aa6e5e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -0,0 +1,2131 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "editint.h"
+#define PDF_OBJECTSTREAM_MAXLENGTH (256 * 1024)
+#define PDF_XREFSTREAM_MAXSIZE 10000
+extern void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_data, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+extern void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+extern FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict);
+FX_INT32 PDF_CreatorAppendObject(const CPDF_Object* pObj, CFX_FileBufferArchive *pFile, FX_FILESIZE& offset)
+{
+ FX_INT32 len = 0;
+ if (pObj == NULL) {
+ if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ offset += 5;
+ return 1;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ if (pFile->AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ offset += 5;
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(pObj->GetString())) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ if ((len = pFile->AppendString(PDF_EncodeString(str, bHex))) < 0) {
+ return -1;
+ }
+ offset += len;
+ break;
+ }
+ case PDFOBJ_NAME: {
+ if (pFile->AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ CFX_ByteString str = pObj->GetString();
+ if ((len = pFile->AppendString(PDF_NameEncode(str))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ if ((len = pFile->AppendDWord(p->GetRefObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ if (pFile->AppendString(FX_BSTRC("[")) < 0) {
+ return -1;
+ }
+ offset += 1;
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pElement->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ offset += len + 5;
+ } else {
+ if (PDF_CreatorAppendObject(pElement, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("]")) < 0) {
+ return -1;
+ }
+ offset += 1;
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ if (pFile->AppendString(FX_BSTRC("<<")) < 0) {
+ return -1;
+ }
+ offset += 2;
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (pFile->AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ if (pValue->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ offset += len + 5;
+ } else {
+ if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ offset += 2;
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* p = (CPDF_Stream*)pObj;
+ if (PDF_CreatorAppendObject(p->GetDict(), pFile, offset) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC("stream\r\n")) < 0) {
+ return -1;
+ }
+ offset += 8;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(p, TRUE);
+ if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) {
+ return -1;
+ }
+ offset += acc.GetSize();
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ offset += len;
+ break;
+ }
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+ return 1;
+}
+FX_INT32 PDF_CreatorWriteTrailer(CPDF_Document* pDocument, CFX_FileBufferArchive* pFile, CPDF_Array* pIDArray, FX_BOOL bCompress)
+{
+ FX_FILESIZE offset = 0;
+ FX_INT32 len = 0;
+ FXSYS_assert(pDocument && pFile);
+ CPDF_Parser *pParser = (CPDF_Parser*)pDocument->GetParser();
+ if (pParser) {
+ CPDF_Dictionary* p = pParser->GetTrailer();
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
+ key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
+ key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("Type") || key == FX_BSTRC("ID")) {
+ continue;
+ }
+ if (bCompress && key == FX_BSTRC("DecodeParms")) {
+ continue;
+ }
+ if (pFile->AppendString((FX_BSTRC("/"))) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ offset += len + 1;
+ if (pValue->GetObjNum()) {
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ } else {
+ if (PDF_CreatorAppendObject(pValue, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pIDArray) {
+ if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ offset += 3;
+ if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ return offset;
+ }
+ if (pFile->AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pDocument->GetRoot()->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ offset += len + 14;
+ if (pDocument->GetInfo()) {
+ if (pFile->AppendString(FX_BSTRC("/Info ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(pDocument->GetInfo()->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ offset += len + 12;
+ }
+ if (pIDArray) {
+ if (pFile->AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ offset += 3;
+ if (PDF_CreatorAppendObject(pIDArray, pFile, offset) < 0) {
+ return -1;
+ }
+ }
+ return offset;
+}
+FX_INT32 PDF_CreatorWriteEncrypt(const CPDF_Dictionary* pEncryptDict, FX_DWORD dwObjNum, CFX_FileBufferArchive *pFile)
+{
+ if (!pEncryptDict) {
+ return 0;
+ }
+ FXSYS_assert(pFile);
+ FX_FILESIZE offset = 0;
+ FX_INT32 len = 0;
+ if (pFile->AppendString(FX_BSTRC("/Encrypt")) < 0) {
+ return -1;
+ }
+ offset += 8;
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord(dwObjNum)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ return offset;
+}
+FX_BOOL PDF_GenerateFileID(FX_DWORD dwSeed1, FX_DWORD dwSeed2, FX_LPDWORD pBuffer)
+{
+ if (!pBuffer) {
+ return FALSE;
+ }
+ FX_LPVOID pContext = FX_Random_MT_Start(dwSeed1);
+ FX_INT32 i = 0;
+ for (i = 0; i < 2; i++) {
+ *pBuffer++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+ pContext = FX_Random_MT_Start(dwSeed2);
+ for (i = 0; i < 2; i++) {
+ *pBuffer++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+ return TRUE;
+}
+class CPDF_FlateEncoder
+{
+public:
+ CPDF_FlateEncoder();
+ ~CPDF_FlateEncoder();
+ FX_BOOL Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode);
+ FX_BOOL Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream = FALSE);
+ void CloneDict();
+ FX_LPBYTE m_pData;
+ FX_DWORD m_dwSize;
+ CPDF_Dictionary* m_pDict;
+ FX_BOOL m_bCloned;
+ FX_BOOL m_bNewData;
+ CPDF_StreamAcc m_Acc;
+};
+CPDF_FlateEncoder::CPDF_FlateEncoder()
+{
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_pDict = NULL;
+ m_bCloned = FALSE;
+ m_bNewData = FALSE;
+}
+void CPDF_FlateEncoder::CloneDict()
+{
+ if (!m_bCloned) {
+ m_pDict = (CPDF_Dictionary*)m_pDict->Clone();
+ m_bCloned = TRUE;
+ }
+}
+FX_BOOL CPDF_FlateEncoder::Initialize(CPDF_Stream* pStream, FX_BOOL bFlateEncode)
+{
+ m_Acc.LoadAllData(pStream, TRUE);
+ if (pStream->GetDict()->KeyExist("Filter") || !bFlateEncode) {
+ if (pStream->GetDict()->KeyExist("Filter") && !bFlateEncode) {
+ CPDF_StreamAcc destAcc;
+ destAcc.LoadAllData(pStream);
+ m_dwSize = destAcc.GetSize();
+ m_pData = (FX_LPBYTE)destAcc.DetachData();
+ m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict->RemoveAt(FX_BSTRC("Filter"));
+ m_bNewData = TRUE;
+ m_bCloned = TRUE;
+ } else {
+ m_pData = (FX_LPBYTE)m_Acc.GetData();
+ m_dwSize = m_Acc.GetSize();
+ m_pDict = pStream->GetDict();
+ }
+ return TRUE;
+ }
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_bNewData = TRUE;
+ m_bCloned = TRUE;
+ ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), m_pData, m_dwSize);
+ m_pDict = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_pDict->SetAtInteger("Length", m_dwSize);
+ m_pDict->SetAtName("Filter", "FlateDecode");
+ m_pDict->RemoveAt("DecodeParms");
+ return TRUE;
+}
+FX_BOOL CPDF_FlateEncoder::Initialize(FX_LPCBYTE pBuffer, FX_DWORD size, FX_BOOL bFlateEncode, FX_BOOL bXRefStream)
+{
+ if (!bFlateEncode) {
+ m_pData = (FX_LPBYTE)pBuffer;
+ m_dwSize = size;
+ return TRUE;
+ }
+ m_bNewData = TRUE;
+ if (bXRefStream) {
+ ::FlateEncode(pBuffer, size, 12, 1, 8, 7, m_pData, m_dwSize);
+ } else {
+ ::FlateEncode(pBuffer, size, m_pData, m_dwSize);
+ }
+ return TRUE;
+}
+CPDF_FlateEncoder::~CPDF_FlateEncoder()
+{
+ if (m_bCloned && m_pDict) {
+ m_pDict->Release();
+ }
+ if (m_bNewData && m_pData) {
+ FX_Free(m_pData);
+ }
+}
+class CPDF_Encryptor
+{
+public:
+ CPDF_Encryptor();
+ ~CPDF_Encryptor();
+ FX_BOOL Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size);
+ FX_LPBYTE m_pData;
+ FX_DWORD m_dwSize;
+ FX_BOOL m_bNewBuf;
+};
+CPDF_Encryptor::CPDF_Encryptor()
+{
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_bNewBuf = FALSE;
+}
+FX_BOOL CPDF_Encryptor::Initialize(CPDF_CryptoHandler* pHandler, int objnum, FX_LPBYTE src_data, FX_DWORD src_size)
+{
+ if (src_size == 0) {
+ return TRUE;
+ }
+ if (pHandler == NULL) {
+ m_pData = (FX_LPBYTE)src_data;
+ m_dwSize = src_size;
+ m_bNewBuf = FALSE;
+ return TRUE;
+ }
+ m_dwSize = pHandler->EncryptGetSize(objnum, 0, src_data, src_size);
+ m_pData = FX_Alloc(FX_BYTE, m_dwSize);
+ if(!m_pData) {
+ return FALSE;
+ }
+ pHandler->EncryptContent(objnum, 0, src_data, src_size, m_pData, m_dwSize);
+ m_bNewBuf = TRUE;
+ return TRUE;
+}
+CPDF_Encryptor::~CPDF_Encryptor()
+{
+ if (m_bNewBuf) {
+ FX_Free(m_pData);
+ }
+}
+CPDF_ObjectStream::CPDF_ObjectStream()
+ : m_dwObjNum(0)
+ , m_index(0)
+{
+}
+FX_BOOL CPDF_ObjectStream::Start()
+{
+ m_ObjNumArray.RemoveAll();
+ m_OffsetArray.RemoveAll();
+ m_Buffer.Clear();
+ m_dwObjNum = 0;
+ m_index = 0;
+ return TRUE;
+}
+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj)
+{
+ m_ObjNumArray.Add(dwObjNum);
+ m_OffsetArray.Add(m_Buffer.GetLength());
+ m_Buffer << pObj;
+ return 1;
+}
+FX_INT32 CPDF_ObjectStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
+{
+ m_ObjNumArray.Add(dwObjNum);
+ m_OffsetArray.Add(m_Buffer.GetLength());
+ m_Buffer.AppendBlock(pBuffer, dwSize);
+ return 1;
+}
+FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator)
+{
+ FXSYS_assert(pCreator);
+ if (m_ObjNumArray.GetSize() == 0) {
+ return 0;
+ }
+ CFX_FileBufferArchive *pFile = &pCreator->m_File;
+ CPDF_CryptoHandler *pHandler = pCreator->m_pCryptoHandler;
+ FX_FILESIZE ObjOffset = pCreator->m_Offset;
+ if (!m_dwObjNum) {
+ m_dwObjNum = ++pCreator->m_dwLastObjNum;
+ }
+ CFX_ByteTextBuf tempBuffer;
+ FX_INT32 iCount = m_ObjNumArray.GetSize();
+ for (FX_INT32 i = 0; i < iCount; i++) {
+ tempBuffer << m_ObjNumArray.ElementAt(i) << FX_BSTRC(" ") << m_OffsetArray.ElementAt(i) << FX_BSTRC(" ");
+ }
+ FX_FILESIZE &offset = pCreator->m_Offset;
+ FX_INT32 len = pFile->AppendDWord(m_dwObjNum);
+ if (len < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /ObjStm /N "))) < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendDWord((FX_DWORD)iCount)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pFile->AppendString(FX_BSTRC("/First ")) < 0) {
+ return -1;
+ }
+ if ((len = pFile->AppendDWord((FX_DWORD)tempBuffer.GetLength())) < 0) {
+ return -1;
+ }
+ if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
+ return -1;
+ }
+ offset += len + 15;
+ if (!pCreator->m_bCompress && !pHandler) {
+ if ((len = pFile->AppendDWord((FX_DWORD)(tempBuffer.GetLength() + m_Buffer.GetLength()))) < 0) {
+ return -1;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(tempBuffer.GetBuffer(), tempBuffer.GetLength()) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(m_Buffer.GetBuffer(), m_Buffer.GetLength()) < 0) {
+ return -1;
+ }
+ offset += len + tempBuffer.GetLength() + m_Buffer.GetLength();
+ } else {
+ tempBuffer << m_Buffer;
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize(tempBuffer.GetBuffer(), tempBuffer.GetLength(), pCreator->m_bCompress);
+ CPDF_Encryptor encryptor;
+ encryptor.Initialize(pHandler, m_dwObjNum, encoder.m_pData, encoder.m_dwSize);
+ if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pCreator->m_bCompress) {
+ if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
+ return -1;
+ }
+ offset += 20;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return -1;
+ }
+ if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ offset += len + encryptor.m_dwSize;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
+ return -1;
+ }
+ offset += len;
+ return ObjOffset;
+}
+CPDF_XRefStream::CPDF_XRefStream()
+ : m_PrevOffset(0)
+ , m_iSeg(0)
+ , m_dwTempObjNum(0)
+{
+}
+FX_BOOL CPDF_XRefStream::Start()
+{
+ m_IndexArray.RemoveAll();
+ m_Buffer.Clear();
+ m_iSeg = 0;
+ return TRUE;
+}
+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, const CPDF_Object *pObj, CPDF_Creator *pCreator)
+{
+ if (!pCreator) {
+ return 0;
+ }
+ m_ObjStream.CompressIndirectObject(dwObjNum, pObj);
+ if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
+ m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
+ return 1;
+ }
+ return EndObjectStream(pCreator);
+}
+FX_INT32 CPDF_XRefStream::CompressIndirectObject(FX_DWORD dwObjNum, FX_LPCBYTE pBuffer, FX_DWORD dwSize, CPDF_Creator *pCreator)
+{
+ if (!pCreator) {
+ return 0;
+ }
+ m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
+ if (m_ObjStream.m_ObjNumArray.GetSize() < pCreator->m_ObjectStreamSize &&
+ m_ObjStream.m_Buffer.GetLength() < PDF_OBJECTSTREAM_MAXLENGTH) {
+ return 1;
+ }
+ return EndObjectStream(pCreator);
+}
+static void _AppendIndex0(CFX_ByteTextBuf& buffer, FX_BOOL bFirstObject = TRUE)
+{
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ if (bFirstObject) {
+ buffer.AppendByte(0xFF);
+ buffer.AppendByte(0xFF);
+ } else {
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+ }
+}
+static void _AppendIndex1(CFX_ByteTextBuf& buffer, FX_FILESIZE offset)
+{
+ buffer.AppendByte(1);
+ buffer.AppendByte(FX_GETBYTEOFFSET24(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET16(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(offset));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(offset));
+ buffer.AppendByte(0);
+ buffer.AppendByte(0);
+}
+static void _AppendIndex2(CFX_ByteTextBuf& buffer, FX_DWORD objnum, FX_INT32 index)
+{
+ buffer.AppendByte(2);
+ buffer.AppendByte(FX_GETBYTEOFFSET24(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET16(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(objnum));
+ buffer.AppendByte(FX_GETBYTEOFFSET8(index));
+ buffer.AppendByte(FX_GETBYTEOFFSET0(index));
+}
+FX_INT32 CPDF_XRefStream::EndObjectStream(CPDF_Creator *pCreator, FX_BOOL bEOF)
+{
+ FX_FILESIZE objOffset = 0;
+ if (bEOF) {
+ objOffset = m_ObjStream.End(pCreator);
+ if (objOffset < 0) {
+ return -1;
+ }
+ }
+ FX_DWORD &dwObjStmNum = m_ObjStream.m_dwObjNum;
+ if (!dwObjStmNum) {
+ dwObjStmNum = ++pCreator->m_dwLastObjNum;
+ }
+ FX_INT32 iSize = m_ObjStream.m_ObjNumArray.GetSize();
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+ if (m_dwTempObjNum == 0) {
+ _AppendIndex0(m_Buffer);
+ m_dwTempObjNum++;
+ }
+ FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + m_IndexArray.GetAt((iSeg - 1) * 2 + 1);
+ int index = 0;
+ for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
+ if (offset) {
+ if (index >= iSize || m_dwTempObjNum != m_ObjStream.m_ObjNumArray[index]) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex2(m_Buffer, dwObjStmNum, index++);
+ }
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ if (iSize > 0 && bEOF) {
+ pCreator->m_ObjectOffset.Add(dwObjStmNum, 1);
+ pCreator->m_ObjectSize.Add(dwObjStmNum, 1);
+ pCreator->m_ObjectOffset[dwObjStmNum] = objOffset;
+ }
+ m_iSeg = iSeg;
+ if (bEOF) {
+ m_ObjStream.Start();
+ }
+ return 1;
+ }
+ FX_INT32 &j = m_ObjStream.m_index;
+ for (int i = m_iSeg; i < iSeg; i++) {
+ FX_DWORD start = m_IndexArray.ElementAt(i * 2);
+ FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
+ for (FX_DWORD m = start; m < end; m++) {
+ if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) {
+ _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]);
+ } else {
+ _AppendIndex2(m_Buffer, dwObjStmNum, j++);
+ }
+ }
+ }
+ if (iSize > 0 && bEOF) {
+ _AppendIndex1(m_Buffer, objOffset);
+ m_IndexArray.Add(dwObjStmNum);
+ m_IndexArray.Add(1);
+ iSeg += 1;
+ }
+ m_iSeg = iSeg;
+ if (bEOF) {
+ m_ObjStream.Start();
+ }
+ return 1;
+}
+FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, FX_BOOL bEOF)
+{
+ FX_FILESIZE offset_tmp = pCreator->m_Offset;
+ FX_DWORD objnum = ++pCreator->m_dwLastObjNum;
+ CFX_FileBufferArchive *pFile = &pCreator->m_File;
+ FX_BOOL bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
+ if (bIncremental) {
+ AddObjectNumberToIndexArray(objnum);
+ } else {
+ for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum);
+ if (offset) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ }
+ _AppendIndex1(m_Buffer, offset_tmp);
+ FX_FILESIZE &offset = pCreator->m_Offset;
+ FX_INT32 len = pFile->AppendDWord(objnum);
+ if (len < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if ((len = pFile->AppendString(FX_BSTRC(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index["))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if (!bIncremental) {
+ if ((len = pFile->AppendDWord(0)) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(" "))) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ } else {
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ for (FX_INT32 i = 0; i < iSeg; i++) {
+ if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) {
+ return FALSE;
+ }
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) {
+ return FALSE;
+ }
+ if (pFile->AppendString(FX_BSTRC(" ")) < 0) {
+ return FALSE;
+ }
+ offset += len + 1;
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("]/Size ")) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendDWord(objnum + 1)) < 0) {
+ return FALSE;
+ }
+ offset += len + 7;
+ if (m_PrevOffset > 0) {
+ if (pFile->AppendString(FX_BSTRC("/Prev ")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(m_PrevOffset, offset_buf, 10);
+ FX_INT32 len = (FX_INT32)FXSYS_strlen(offset_buf);
+ if (pFile->AppendBlock(offset_buf, len) < 0) {
+ return -1;
+ }
+ offset += len + 6;
+ }
+ FX_BOOL bPredictor = TRUE;
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize(m_Buffer.GetBuffer(), m_Buffer.GetLength(), pCreator->m_bCompress, bPredictor);
+ if (pCreator->m_bCompress) {
+ if (pFile->AppendString(FX_BSTRC("/Filter /FlateDecode")) < 0) {
+ return FALSE;
+ }
+ offset += 20;
+ if (bPredictor) {
+ if ((len = pFile->AppendString(FX_BSTRC("/DecodeParms<</Columns 7/Predictor 12>>"))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ }
+ }
+ if (pFile->AppendString(FX_BSTRC("/Length ")) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0) {
+ return FALSE;
+ }
+ offset += len + 8;
+ if (bEOF) {
+ if ((len = PDF_CreatorWriteTrailer(pCreator->m_pDocument, pFile, pCreator->m_pIDArray, pCreator->m_bCompress)) < 0) {
+ return -1;
+ }
+ offset += len;
+ if (pCreator->m_pEncryptDict) {
+ FX_DWORD dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();
+ if (dwEncryptObjNum == 0) {
+ dwEncryptObjNum = pCreator->m_dwEnryptObjNum;
+ }
+ if ((len = PDF_CreatorWriteEncrypt(pCreator->m_pEncryptDict, dwEncryptObjNum, pFile)) < 0) {
+ return -1;
+ }
+ offset += len;
+ }
+ }
+ if ((len = pFile->AppendString(FX_BSTRC(">>stream\r\n"))) < 0) {
+ return FALSE;
+ }
+ offset += len;
+ if (pFile->AppendBlock(encoder.m_pData, encoder.m_dwSize) < 0) {
+ return FALSE;
+ }
+ if ((len = pFile->AppendString(FX_BSTRC("\r\nendstream\r\nendobj\r\n"))) < 0) {
+ return FALSE;
+ }
+ offset += encoder.m_dwSize + len;
+ m_PrevOffset = offset_tmp;
+ return TRUE;
+}
+FX_BOOL CPDF_XRefStream::End(CPDF_Creator *pCreator, FX_BOOL bEOF )
+{
+ if (EndObjectStream(pCreator, bEOF) < 0) {
+ return FALSE;
+ }
+ return GenerateXRefStream(pCreator, bEOF);
+}
+FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator)
+{
+ if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+ _AppendIndex0(m_Buffer);
+ for (FX_DWORD i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {
+ FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(i);
+ if (offset) {
+ _AppendIndex1(m_Buffer, *offset);
+ } else {
+ _AppendIndex0(m_Buffer, FALSE);
+ }
+ }
+ } else {
+ FX_INT32 iSeg = m_IndexArray.GetSize() / 2;
+ for (int i = 0; i < iSeg; i++) {
+ FX_DWORD start = m_IndexArray.ElementAt(i * 2);
+ FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start;
+ for (FX_DWORD j = start; j < end; j++) {
+ _AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]);
+ }
+ }
+ }
+ return GenerateXRefStream(pCreator, FALSE);
+}
+FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum)
+{
+ FX_INT32 iSize = m_IndexArray.GetSize();
+ if (iSize == 0) {
+ m_IndexArray.Add(objnum);
+ m_IndexArray.Add(1);
+ } else {
+ FXSYS_assert(iSize > 1);
+ FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2);
+ FX_INT32 iCount = m_IndexArray.ElementAt(iSize - 1);
+ if (objnum == startobjnum + iCount) {
+ m_IndexArray[iSize - 1] = iCount + 1;
+ } else {
+ m_IndexArray.Add(objnum);
+ m_IndexArray.Add(1);
+ }
+ }
+ return TRUE;
+}
+CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+ m_pParser = (CPDF_Parser*)pDoc->m_pParser;
+ m_bCompress = TRUE;
+ if (m_pParser) {
+ m_pEncryptDict = m_pParser->GetEncryptDict();
+ m_pCryptoHandler = m_pParser->GetCryptoHandler();
+ } else {
+ m_pEncryptDict = NULL;
+ m_pCryptoHandler = NULL;
+ }
+ m_bSecurityChanged = FALSE;
+ m_bStandardSecurity = FALSE;
+ m_pMetadata = NULL;
+ m_bEncryptCloned = FALSE;
+ m_bEncryptMetadata = FALSE;
+ m_Offset = 0;
+ m_iStage = -1;
+ m_dwFlags = 0;
+ m_Pos = NULL;
+ m_XrefStart = 0;
+ m_pXRefStream = NULL;
+ m_ObjectStreamSize = 200;
+ m_dwLastObjNum = m_pDocument->GetLastObjNum();
+ m_pIDArray = NULL;
+ m_FileVersion = 0;
+ m_dwEnryptObjNum = 0;
+ m_bNewCrypto = FALSE;
+}
+CPDF_Creator::~CPDF_Creator()
+{
+ ResetStandardSecurity();
+ if (m_bEncryptCloned && m_pEncryptDict) {
+ m_pEncryptDict->Release();
+ m_pEncryptDict = NULL;
+ }
+ Clear();
+}
+static FX_BOOL _IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag)
+{
+ if (!(flag & FPDFCREATE_INCREMENTAL)) {
+ return FALSE;
+ }
+ FX_INT32 iSize = pXRef->m_IndexArray.GetSize() / 2;
+ FX_INT32 iCount = 0;
+ for (FX_INT32 i = 0; i < iSize; i++) {
+ iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1);
+ }
+ return (iCount >= PDF_XREFSTREAM_MAXSIZE);
+}
+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ FX_DWORD objnum = pObj->GetObjNum();
+ if (m_pParser && m_pParser->m_ObjVersion.GetSize() > (FX_INT32)objnum && m_pParser->m_ObjVersion[objnum] > 0) {
+ return 1;
+ }
+ if (pObj->GetType() == PDFOBJ_NUMBER) {
+ return 1;
+ }
+ CPDF_Dictionary *pDict = pObj->GetDict();
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ if (pDict && pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("XRef")) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pDict) {
+ if (pDict == m_pDocument->m_pRootDict || pDict == m_pEncryptDict) {
+ return 1;
+ }
+ if (IsSignatureDict(pDict)) {
+ return 1;
+ }
+ if (pDict->GetString(FX_BSTRC("Type")) == FX_BSTRC("Page")) {
+ return 1;
+ }
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0) {
+ return -1;
+ }
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObjectToStream(FX_DWORD objnum, FX_LPCBYTE pBuffer, FX_DWORD dwSize)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ FX_INT32 iRet = m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);
+ if (iRet < 1) {
+ return iRet;
+ }
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::AppendObjectNumberToXRef(FX_DWORD objnum)
+{
+ if (!m_pXRefStream) {
+ return 1;
+ }
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ if (!_IsXRefNeedEnd(m_pXRefStream, m_dwFlags)) {
+ return 0;
+ }
+ if (!m_pXRefStream->End(this)) {
+ return -1;
+ }
+ if (!m_pXRefStream->Start()) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteStream(const CPDF_Object* pStream, FX_DWORD objnum, CPDF_CryptoHandler* pCrypto)
+{
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize((CPDF_Stream*)pStream, pStream == m_pMetadata ? FALSE : m_bCompress);
+ CPDF_Encryptor encryptor;
+ if(!encryptor.Initialize(pCrypto, objnum, encoder.m_pData, encoder.m_dwSize)) {
+ return -1;
+ }
+ if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
+ encoder.CloneDict();
+ encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
+ }
+ if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
+ return -1;
+ }
+ int len = m_File.AppendString(FX_BSTRC("stream\r\n"));
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ m_Offset += encryptor.m_dwSize;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObj(FX_DWORD objnum, const CPDF_Object* pObj)
+{
+ FX_INT32 len = m_File.AppendDWord(objnum);
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if ((len = m_File.AppendString(FX_BSTRC(" 0 obj\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_CryptoHandler *pHandler = NULL;
+ pHandler = (pObj == m_pMetadata && !m_bEncryptMetadata) ? NULL : m_pCryptoHandler;
+ if (WriteStream(pObj, objnum, pHandler) < 0) {
+ return -1;
+ }
+ } else {
+ if (WriteDirectObj(objnum, pObj) < 0) {
+ return -1;
+ }
+ }
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendobj\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (AppendObjectNumberToXRef(objnum) < 0) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteIndirectObj(const CPDF_Object* pObj)
+{
+ FX_INT32 iRet = WriteIndirectObjectToStream(pObj);
+ if (iRet < 1) {
+ return iRet;
+ }
+ return WriteIndirectObj(pObj->GetObjNum(), pObj);
+}
+FX_INT32 CPDF_Creator::WriteDirectObj(FX_DWORD objnum, const CPDF_Object* pObj, FX_BOOL bEncrypt)
+{
+ FX_INT32 len = 0;
+ if (pObj == NULL) {
+ if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ m_Offset += 5;
+ return 1;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ if (m_File.AppendString(FX_BSTRC(" null")) < 0) {
+ return -1;
+ }
+ m_Offset += 5;
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(pObj->GetString())) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ if (m_pCryptoHandler == NULL || !bEncrypt) {
+ CFX_ByteString content = PDF_EncodeString(str, bHex);
+ if ((len = m_File.AppendString(content)) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ CPDF_Encryptor encryptor;
+ encryptor.Initialize(m_pCryptoHandler, objnum, (FX_LPBYTE)(FX_LPCSTR)str, str.GetLength());
+ CFX_ByteString content = PDF_EncodeString(CFX_ByteString((FX_LPCSTR)encryptor.m_pData, encryptor.m_dwSize), bHex);
+ if ((len = m_File.AppendString(content)) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_FlateEncoder encoder;
+ encoder.Initialize((CPDF_Stream*)pObj, m_bCompress);
+ CPDF_Encryptor encryptor;
+ CPDF_CryptoHandler* pHandler = m_pCryptoHandler;
+ encryptor.Initialize(pHandler, objnum, encoder.m_pData, encoder.m_dwSize);
+ if ((FX_DWORD)encoder.m_pDict->GetInteger(FX_BSTRC("Length")) != encryptor.m_dwSize) {
+ encoder.CloneDict();
+ encoder.m_pDict->SetAtInteger(FX_BSTRC("Length"), encryptor.m_dwSize);
+ }
+ if (WriteDirectObj(objnum, encoder.m_pDict) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(FX_BSTRC("stream\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if (m_File.AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0) {
+ return -1;
+ }
+ m_Offset += encryptor.m_dwSize;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\nendstream"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ break;
+ }
+ case PDFOBJ_NAME: {
+ if (m_File.AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ CFX_ByteString str = pObj->GetString();
+ if ((len = m_File.AppendString(PDF_NameEncode(str))) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ if ((len = m_File.AppendDWord(p->GetRefObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 5;
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ if (m_File.AppendString(FX_BSTRC("[")) < 0) {
+ return -1;
+ }
+ m_Offset += 1;
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendDWord(pElement->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 5;
+ } else {
+ if (WriteDirectObj(objnum, pElement) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]")) < 0) {
+ return -1;
+ }
+ m_Offset += 1;
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ if (m_pCryptoHandler == NULL || pObj == m_pEncryptDict) {
+ return PDF_CreatorAppendObject(pObj, &m_File, m_Offset);
+ }
+ if (m_File.AppendString(FX_BSTRC("<<")) < 0) {
+ return -1;
+ }
+ m_Offset += 2;
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ FX_BOOL bSignDict = IsSignatureDict(p);
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ FX_BOOL bSignValue = FALSE;
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (m_File.AppendString(FX_BSTRC("/")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendString(PDF_NameEncode(key))) < 0) {
+ return -1;
+ }
+ m_Offset += len + 1;
+ if (bSignDict && key == FX_BSTRC("Contents")) {
+ bSignValue = TRUE;
+ }
+ if (pValue->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if ((len = m_File.AppendDWord(pValue->GetObjNum())) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 6;
+ } else {
+ if (WriteDirectObj(objnum, pValue, !bSignValue) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ m_Offset += 2;
+ break;
+ }
+ }
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteOldIndirectObject(FX_DWORD objnum)
+{
+ if(m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
+ return 0;
+ }
+ m_ObjectOffset[objnum] = m_Offset;
+ FX_LPVOID valuetemp = NULL;
+ FX_BOOL bExistInMap = m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, valuetemp);
+ FX_BOOL bObjStm = (m_pParser->m_V5Type[objnum] == 2) && m_pEncryptDict && !m_pXRefStream;
+ if(m_pParser->m_bVersionUpdated || m_bSecurityChanged || bExistInMap || bObjStm) {
+ CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum);
+ if (pObj == NULL) {
+ m_ObjectOffset[objnum] = 0;
+ m_ObjectSize[objnum] = 0;
+ return 0;
+ }
+ if (WriteIndirectObj(pObj)) {
+ return -1;
+ }
+ if (!bExistInMap) {
+ m_pDocument->ReleaseIndirectObject(objnum);
+ }
+ } else {
+ FX_BYTE* pBuffer;
+ FX_DWORD size;
+ m_pParser->GetIndirectBinary(objnum, pBuffer, size);
+ if (pBuffer == NULL) {
+ return 0;
+ }
+ if (m_pParser->m_V5Type[objnum] == 2) {
+ if (m_pXRefStream) {
+ if (WriteIndirectObjectToStream(objnum, pBuffer, size) < 0) {
+ FX_Free(pBuffer);
+ return -1;
+ }
+ } else {
+ FX_INT32 len = m_File.AppendDWord(objnum);
+ if (len < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 obj ")) < 0) {
+ return -1;
+ }
+ m_Offset += len + 7;
+ if (m_File.AppendBlock(pBuffer, size) < 0) {
+ return -1;
+ }
+ m_Offset += size;
+ if (m_File.AppendString(FX_BSTRC("\r\nendobj\r\n")) < 0) {
+ return -1;
+ }
+ m_Offset += 10;
+ }
+ } else {
+ if (m_File.AppendBlock(pBuffer, size) < 0) {
+ return -1;
+ }
+ m_Offset += size;
+ if(AppendObjectNumberToXRef(objnum) < 0) {
+ return -1;
+ }
+ }
+ FX_Free(pBuffer);
+ }
+ return 1;
+}
+FX_INT32 CPDF_Creator::WriteOldObjs(IFX_Pause *pPause)
+{
+ FX_DWORD nOldSize = m_pParser->m_CrossRef.GetSize();
+ FX_DWORD objnum = (FX_DWORD)(FX_UINTPTR)m_Pos;
+ for(; objnum < nOldSize; objnum ++) {
+ FX_INT32 iRet = WriteOldIndirectObject(objnum);
+ if (!iRet) {
+ continue;
+ }
+ if (iRet < 0) {
+ return iRet;
+ }
+ m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)(objnum + 1);
+ return 1;
+ }
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteNewObjs(FX_BOOL bIncremental, IFX_Pause *pPause)
+{
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ FX_INT32 index = (FX_INT32)(FX_UINTPTR)m_Pos;
+ while (index < iCount) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(index);
+ CPDF_Object *pObj = NULL;
+ m_pDocument->m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj);
+ if (NULL == pObj) {
+ ++index;
+ continue;
+ }
+ m_ObjectOffset[objnum] = m_Offset;
+ if (WriteIndirectObj(pObj)) {
+ return -1;
+ }
+ m_ObjectSize[objnum] = (FX_DWORD)(m_Offset - m_ObjectOffset[objnum]);
+ index++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_POSITION)(FX_UINTPTR)index;
+ return 1;
+ }
+ }
+ return 0;
+}
+void CPDF_Creator::InitOldObjNumOffsets()
+{
+ if (!m_pParser) {
+ return;
+ }
+ FX_DWORD j = 0;
+ FX_DWORD dwStart = 0;
+ FX_DWORD dwEnd = m_pParser->GetLastObjNum();
+ while (dwStart <= dwEnd) {
+ while (dwStart <= dwEnd && (m_pParser->m_V5Type[dwStart] == 0 || m_pParser->m_V5Type[dwStart] == 255)) {
+ dwStart++;
+ }
+ if (dwStart > dwEnd) {
+ break;
+ }
+ j = dwStart;
+ while (j <= dwEnd && m_pParser->m_V5Type[j] != 0 && m_pParser->m_V5Type[j] != 255) {
+ j++;
+ }
+ m_ObjectOffset.Add(dwStart, j - dwStart);
+ m_ObjectSize.Add(dwStart, j - dwStart);
+ dwStart = j;
+ }
+}
+void CPDF_Creator::InitNewObjNumOffsets()
+{
+ FX_BOOL bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
+ FX_BOOL bNoOriginal = (m_dwFlags & FPDFCREATE_NO_ORIGINAL) != 0;
+ FX_DWORD nOldSize = m_pParser ? m_pParser->m_CrossRef.GetSize() : 0;
+ FX_POSITION pos = m_pDocument->m_IndirectObjs.GetStartPosition();
+ while (pos) {
+ size_t key = 0;
+ CPDF_Object* pObj;
+ m_pDocument->m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)key, (FX_LPVOID&)pObj);
+ FX_DWORD objnum = (FX_DWORD)key;
+ if (pObj->GetObjNum() == -1) {
+ continue;
+ }
+ if (bIncremental) {
+ if (!pObj->IsModified()) {
+ continue;
+ }
+ } else {
+ if (objnum < nOldSize && m_pParser->m_V5Type[objnum] != 0) {
+ continue;
+ }
+ }
+ AppendNewObjNum(objnum);
+ }
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ if (iCount == 0) {
+ return;
+ }
+ FX_INT32 i = 0;
+ FX_DWORD dwStartObjNum = 0;
+ FX_BOOL bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0;
+ while (i < iCount) {
+ dwStartObjNum = m_NewObjNumArray.ElementAt(i);
+ if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) {
+ break;
+ }
+ i++;
+ }
+ if (i >= iCount) {
+ return;
+ }
+ FX_DWORD dwLastObjNum = dwStartObjNum;
+ i++;
+ FX_BOOL bNewStart = FALSE;
+ for (; i < iCount; i++) {
+ FX_DWORD dwCurObjNum = m_NewObjNumArray.ElementAt(i);
+ FX_BOOL bExist = (dwCurObjNum < nOldSize && m_ObjectOffset.GetPtrAt(dwCurObjNum) != NULL);
+ if (bExist || dwCurObjNum - dwLastObjNum > 1) {
+ if (!bNewStart) {
+ m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ }
+ dwStartObjNum = dwCurObjNum;
+ }
+ if (bNewStart) {
+ dwStartObjNum = dwCurObjNum;
+ }
+ bNewStart = bExist;
+ dwLastObjNum = dwCurObjNum;
+ }
+ m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+ m_ObjectSize.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1);
+}
+void CPDF_Creator::AppendNewObjNum(FX_DWORD objbum)
+{
+ FX_INT32 iStart = 0, iFind = 0;
+ FX_INT32 iEnd = m_NewObjNumArray.GetUpperBound();
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FX_DWORD dwMid = m_NewObjNumArray.ElementAt(iMid);
+ if (objbum < dwMid) {
+ iEnd = iMid - 1;
+ } else {
+ if (iMid == iEnd) {
+ iFind = iMid + 1;
+ break;
+ }
+ FX_DWORD dwNext = m_NewObjNumArray.ElementAt(iMid + 1);
+ if (objbum < dwNext) {
+ iFind = iMid + 1;
+ break;
+ }
+ iStart = iMid + 1;
+ }
+ }
+ m_NewObjNumArray.InsertAt(iFind, objbum);
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage1(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage > -1 || m_iStage < 20);
+ if (m_iStage == 0) {
+ if (m_pParser == NULL) {
+ m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
+ }
+ if (m_bSecurityChanged && (m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0) {
+ m_dwFlags &= ~FPDFCREATE_INCREMENTAL;
+ }
+ m_pMetadata = m_pDocument->GetRoot()->GetElementValue(FX_BSTRC("Metadata"));
+ if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
+ m_pXRefStream = FX_NEW CPDF_XRefStream;
+ m_pXRefStream->Start();
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {
+ FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
+ m_pXRefStream->m_PrevOffset = prev;
+ }
+ }
+ m_iStage = 10;
+ }
+ if (m_iStage == 10) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {
+ if (m_File.AppendString(FX_BSTRC("%PDF-1.")) < 0) {
+ return -1;
+ }
+ m_Offset += 7;
+ FX_INT32 version = 7;
+ if (m_FileVersion) {
+ version = m_FileVersion;
+ } else if (m_pParser) {
+ version = m_pParser->GetFileVersion();
+ }
+ FX_INT32 len = m_File.AppendDWord(version % 10);
+ if (len < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ if ((len = m_File.AppendString(FX_BSTRC("\r\n%\xA1\xB3\xC5\xD7\r\n"))) < 0) {
+ return -1;
+ }
+ m_Offset += len;
+ InitOldObjNumOffsets();
+ m_iStage = 20;
+ } else {
+ IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
+ m_Offset = pSrcFile->GetSize();
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)m_Offset;
+ m_iStage = 15;
+ }
+ }
+ if (m_iStage == 15) {
+ if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_Pos) {
+ IFX_FileRead* pSrcFile = m_pParser->GetFileAccess();
+ FX_BYTE buffer[4096];
+ FX_DWORD src_size = (FX_DWORD)(FX_UINTPTR)m_Pos;
+ while (src_size) {
+ FX_DWORD block_size = src_size > 4096 ? 4096 : src_size;
+ if (!pSrcFile->ReadBlock(buffer, m_Offset - src_size, block_size)) {
+ return -1;
+ }
+ if (m_File.AppendBlock(buffer, block_size) < 0) {
+ return -1;
+ }
+ src_size -= block_size;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)src_size;
+ return 1;
+ }
+ }
+ }
+ if ((m_dwFlags & FPDFCREATE_NO_ORIGINAL) == 0 && m_pParser->GetLastXRefOffset() == 0) {
+ InitOldObjNumOffsets();
+ FX_DWORD dwEnd = m_pParser->GetLastObjNum();
+ FX_BOOL bObjStm = (m_dwFlags & FPDFCREATE_OBJECTSTREAM) != 0;
+ for (FX_DWORD objnum = 0; objnum <= dwEnd; objnum++) {
+ if (m_pParser->m_V5Type[objnum] == 0 || m_pParser->m_V5Type[objnum] == 255) {
+ continue;
+ }
+ m_ObjectOffset[objnum] = m_pParser->m_CrossRef[objnum];
+ if (bObjStm) {
+ m_pXRefStream->AddObjectNumberToIndexArray(objnum);
+ }
+ }
+ if (bObjStm) {
+ m_pXRefStream->EndXRefStream(this);
+ m_pXRefStream->Start();
+ }
+ }
+ m_iStage = 20;
+ }
+ InitNewObjNumOffsets();
+ return m_iStage;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage2(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 20 || m_iStage < 30);
+ if (m_iStage == 20) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 21;
+ } else {
+ m_iStage = 25;
+ }
+ }
+ if (m_iStage == 21) {
+ FX_INT32 iRet = WriteOldObjs(pPause);
+ if (iRet) {
+ return iRet;
+ }
+ m_iStage = 25;
+ }
+ if (m_iStage == 25) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 26;
+ }
+ if (m_iStage == 26) {
+ FX_INT32 iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0, pPause);
+ if (iRet) {
+ return iRet;
+ }
+ m_iStage = 27;
+ }
+ if (m_iStage == 27) {
+ if (NULL != m_pEncryptDict && 0 == m_pEncryptDict->GetObjNum()) {
+ m_dwLastObjNum += 1;
+ FX_FILESIZE saveOffset = m_Offset;
+ if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) {
+ return -1;
+ }
+ m_ObjectOffset.Add(m_dwLastObjNum, 1);
+ m_ObjectOffset[m_dwLastObjNum] = saveOffset;
+ m_ObjectSize.Add(m_dwLastObjNum, 1);
+ m_ObjectSize[m_dwLastObjNum] = m_Offset - saveOffset;
+ m_dwEnryptObjNum = m_dwLastObjNum;
+ if (m_dwFlags & FPDFCREATE_INCREMENTAL) {
+ m_NewObjNumArray.Add(m_dwLastObjNum);
+ }
+ }
+ m_iStage = 80;
+ }
+ return m_iStage;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage3(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 80 || m_iStage < 90);
+ FX_DWORD dwLastObjNum = m_dwLastObjNum;
+ if (m_iStage == 80) {
+ m_XrefStart = m_Offset;
+ if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
+ m_pXRefStream->End(this, TRUE);
+ m_XrefStart = m_pXRefStream->m_PrevOffset;
+ m_iStage = 90;
+ } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || !m_pParser->IsXRefStream()) {
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 || m_pParser->GetLastXRefOffset() == 0) {
+ CFX_ByteString str;
+ str = m_ObjectOffset.GetPtrAt(1) ? FX_BSTRC("xref\r\n") : FX_BSTRC("xref\r\n0 1\r\n0000000000 65536 f\r\n");
+ if (m_File.AppendString(str) < 0) {
+ return -1;
+ }
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)1;
+ m_iStage = 81;
+ } else {
+ if (m_File.AppendString(FX_BSTRC("xref\r\n")) < 0) {
+ return -1;
+ }
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)0;
+ m_iStage = 82;
+ }
+ } else {
+ m_iStage = 90;
+ }
+ }
+ if (m_iStage == 81) {
+ CFX_ByteString str;
+ FX_DWORD i = (FX_DWORD)(FX_UINTPTR)m_Pos, j;
+ while (i <= dwLastObjNum) {
+ while (i <= dwLastObjNum && !m_ObjectOffset.GetPtrAt(i)) {
+ i++;
+ }
+ if (i > dwLastObjNum) {
+ break;
+ }
+ j = i;
+ while (j <= dwLastObjNum && m_ObjectOffset.GetPtrAt(j)) {
+ j++;
+ }
+ if (i == 1) {
+ str.Format("0 %d\r\n0000000000 65536 f\r\n", j);
+ } else {
+ str.Format("%d %d\r\n", i, j - i);
+ }
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ while (i < j) {
+ str.Format("%010d 00000 n\r\n", m_ObjectOffset[i ++]);
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ }
+ if (i > dwLastObjNum) {
+ break;
+ }
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
+ return 1;
+ }
+ }
+ m_iStage = 90;
+ }
+ if (m_iStage == 82) {
+ CFX_ByteString str;
+ FX_INT32 iCount = m_NewObjNumArray.GetSize();
+ FX_INT32 i = (FX_INT32)(FX_UINTPTR)m_Pos;
+ while (i < iCount) {
+ FX_INT32 j = i;
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ while (j < iCount) {
+ if (++j == iCount) {
+ break;
+ }
+ FX_DWORD dwCurrent = m_NewObjNumArray.ElementAt(j);
+ if (dwCurrent - objnum > 1) {
+ break;
+ }
+ objnum = dwCurrent;
+ }
+ objnum = m_NewObjNumArray.ElementAt(i);
+ if (objnum == 1) {
+ str.Format("0 %d\r\n0000000000 65536 f\r\n", j - i + 1);
+ } else {
+ str.Format("%d %d\r\n", objnum, j - i);
+ }
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ while (i < j) {
+ objnum = m_NewObjNumArray.ElementAt(i++);
+ str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]);
+ if (m_File.AppendBlock((FX_LPCSTR)str, str.GetLength()) < 0) {
+ return -1;
+ }
+ }
+ if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) {
+ m_Pos = (FX_LPVOID)(FX_UINTPTR)i;
+ return 1;
+ }
+ }
+ m_iStage = 90;
+ }
+ return m_iStage;
+}
+static FX_INT32 _OutPutIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset)
+{
+ FXSYS_assert(pFile);
+ if (sizeof(offset) > 4) {
+ if (FX_GETBYTEOFFSET32(offset)) {
+ if (pFile->AppendByte(FX_GETBYTEOFFSET56(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET48(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET40(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET32(offset)) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET24(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET16(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET8(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(FX_GETBYTEOFFSET0(offset)) < 0) {
+ return -1;
+ }
+ if (pFile->AppendByte(0) < 0) {
+ return -1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_Creator::WriteDoc_Stage4(IFX_Pause *pPause)
+{
+ FXSYS_assert(m_iStage >= 90);
+ if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {
+ FX_BOOL bXRefStream = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();
+ if (!bXRefStream) {
+ if (m_File.AppendString(FX_BSTRC("trailer\r\n<<")) < 0) {
+ return -1;
+ }
+ } else {
+ if (m_File.AppendDWord(m_pDocument->m_LastObjNum + 1) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 obj <<")) < 0) {
+ return -1;
+ }
+ }
+ if (m_pParser) {
+ CPDF_Dictionary* p = m_pParser->m_pTrailer;
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ if (key == FX_BSTRC("Encrypt") || key == FX_BSTRC("Size") || key == FX_BSTRC("Filter") ||
+ key == FX_BSTRC("Index") || key == FX_BSTRC("Length") || key == FX_BSTRC("Prev") ||
+ key == FX_BSTRC("W") || key == FX_BSTRC("XRefStm") || key == FX_BSTRC("ID")) {
+ continue;
+ }
+ if (m_File.AppendString((FX_BSTRC("/"))) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(PDF_NameEncode(key)) < 0) {
+ return -1;
+ }
+ if (pValue->GetObjNum()) {
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(pValue->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ } else {
+ FX_FILESIZE offset = 0;
+ if (PDF_CreatorAppendObject(pValue, &m_File, offset) < 0) {
+ return -1;
+ }
+ }
+ }
+ } else {
+ if (m_File.AppendString(FX_BSTRC("\r\n/Root ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_pDocument->m_pRootDict->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ if (m_pDocument->m_pInfoDict) {
+ if (m_File.AppendString(FX_BSTRC("/Info ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_pDocument->m_pInfoDict->GetObjNum()) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R\r\n")) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_pEncryptDict) {
+ if (m_File.AppendString(FX_BSTRC("/Encrypt")) < 0) {
+ return -1;
+ }
+ FX_DWORD dwObjNum = m_pEncryptDict->GetObjNum();
+ if (dwObjNum == 0) {
+ dwObjNum = m_pDocument->GetLastObjNum() + 1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(dwObjNum) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 0 R ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("/Size ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0) {
+ return -1;
+ }
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {
+ FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
+ if (prev) {
+ if (m_File.AppendString(FX_BSTRC("/Prev ")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(prev, offset_buf, 10);
+ if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_pIDArray) {
+ if (m_File.AppendString((FX_BSTRC("/ID"))) < 0) {
+ return -1;
+ }
+ FX_FILESIZE offset = 0;
+ if (PDF_CreatorAppendObject(m_pIDArray, &m_File, offset) < 0) {
+ return -1;
+ }
+ }
+ if (!bXRefStream) {
+ if (m_File.AppendString(FX_BSTRC(">>")) < 0) {
+ return -1;
+ }
+ } else {
+ if (m_File.AppendString(FX_BSTRC("/W[0 4 1]/Index[")) < 0) {
+ return -1;
+ }
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
+ FX_DWORD i = 0;
+ for (i = 0; i < m_dwLastObjNum; i++) {
+ if (!m_ObjectOffset.GetPtrAt(i)) {
+ continue;
+ }
+ if (m_File.AppendDWord(i) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(m_dwLastObjNum * 5) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
+ return -1;
+ }
+ for (i = 0; i < m_dwLastObjNum; i++) {
+ FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i);
+ if (!offset) {
+ continue;
+ }
+ _OutPutIndex(&m_File, *offset);
+ }
+ } else {
+ int count = m_NewObjNumArray.GetSize();
+ FX_INT32 i = 0;
+ for (i = 0; i < count; i++) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ if (m_File.AppendDWord(objnum) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(" 1 ")) < 0) {
+ return -1;
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("]/Length ")) < 0) {
+ return -1;
+ }
+ if (m_File.AppendDWord(count * 5) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC(">>stream\r\n")) < 0) {
+ return -1;
+ }
+ for (i = 0; i < count; i++) {
+ FX_DWORD objnum = m_NewObjNumArray.ElementAt(i);
+ FX_FILESIZE offset = m_ObjectOffset[objnum];
+ _OutPutIndex(&m_File, offset);
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\nendstream")) < 0) {
+ return -1;
+ }
+ }
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\nstartxref\r\n")) < 0) {
+ return -1;
+ }
+ FX_CHAR offset_buf[20];
+ FXSYS_memset32(offset_buf, 0, sizeof(offset_buf));
+ FXSYS_i64toa(m_XrefStart, offset_buf, 10);
+ if (m_File.AppendBlock(offset_buf, FXSYS_strlen(offset_buf)) < 0) {
+ return -1;
+ }
+ if (m_File.AppendString(FX_BSTRC("\r\n%%EOF\r\n")) < 0) {
+ return -1;
+ }
+ m_File.Flush();
+ return m_iStage = 100;
+}
+void CPDF_Creator::Clear()
+{
+ if (m_pXRefStream) {
+ delete m_pXRefStream;
+ m_pXRefStream = NULL;
+ }
+ m_File.Clear();
+ m_NewObjNumArray.RemoveAll();
+ if (m_pIDArray) {
+ m_pIDArray->Release();
+ m_pIDArray = NULL;
+ }
+}
+FX_BOOL CPDF_Creator::Create(FX_LPCSTR filename, FX_DWORD flags)
+{
+ if (!m_File.AttachFile(filename)) {
+ return FALSE;
+ }
+ FX_BOOL bRet = Create(flags);
+ if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
+ Clear();
+ }
+ return bRet;
+}
+FX_BOOL CPDF_Creator::Create(FX_LPCWSTR filename, FX_DWORD flags)
+{
+ if (!m_File.AttachFile(filename)) {
+ return FALSE;
+ }
+ FX_BOOL bRet = Create(flags);
+ if (!bRet || !(flags & FPDFCREATE_PROGRESSIVE)) {
+ Clear();
+ }
+ return bRet;
+}
+FX_BOOL CPDF_Creator::Create(IFX_StreamWrite* pFile, FX_DWORD flags)
+{
+ if (!pFile) {
+ return FALSE;
+ }
+ if (!m_File.AttachFile(pFile, FALSE)) {
+ return FALSE;
+ }
+ return Create(flags);
+}
+FX_BOOL CPDF_Creator::Create(FX_DWORD flags)
+{
+ m_dwFlags = flags;
+ m_iStage = 0;
+ m_Offset = 0;
+ m_dwLastObjNum = m_pDocument->GetLastObjNum();
+ m_ObjectOffset.Clear();
+ m_ObjectSize.Clear();
+ m_NewObjNumArray.RemoveAll();
+ InitID();
+ if (flags & FPDFCREATE_PROGRESSIVE) {
+ return TRUE;
+ }
+ return Continue(NULL) > -1;
+}
+void CPDF_Creator::InitID(FX_BOOL bDefault )
+{
+ CPDF_Array* pOldIDArray = m_pParser ? m_pParser->GetIDArray() : NULL;
+ FX_BOOL bNewId = !m_pIDArray;
+ if (!m_pIDArray) {
+ FX_LPDWORD pBuffer = NULL;
+ m_pIDArray = CPDF_Array::Create();
+ CPDF_Object* pID1 = pOldIDArray->GetElement(0);
+ if (pID1) {
+ m_pIDArray->Add(pID1->Clone());
+ } else {
+ pBuffer = FX_Alloc(FX_DWORD, 4);
+ PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
+ CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
+ m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+ }
+ if (pBuffer) {
+ FX_Free(pBuffer);
+ }
+ }
+ if (!bDefault) {
+ return;
+ }
+ if (pOldIDArray) {
+ CPDF_Object* pID2 = pOldIDArray->GetElement(1);
+ if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
+ m_pIDArray->Add(pID2->Clone());
+ return;
+ }
+ FX_LPDWORD pBuffer = FX_Alloc(FX_DWORD, 4);
+ PDF_GenerateFileID((FX_DWORD)(FX_UINTPTR)this, m_dwLastObjNum, pBuffer);
+ CFX_ByteStringC bsBuffer((FX_LPCBYTE)pBuffer, 4 * sizeof(FX_DWORD));
+ m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+ FX_Free(pBuffer);
+ return;
+ }
+ m_pIDArray->Add(m_pIDArray->GetElement(0)->Clone());
+ if (m_pEncryptDict && !pOldIDArray && m_pParser && bNewId) {
+ if (m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {
+ CPDF_StandardSecurityHandler handler;
+ CFX_ByteString user_pass = m_pParser->GetPassword();
+ FX_DWORD flag = PDF_ENCRYPT_CONTENT;
+ handler.OnCreate(m_pEncryptDict, m_pIDArray, (FX_LPCBYTE)user_pass, user_pass.GetLength(), flag);
+ if (m_pCryptoHandler && m_bNewCrypto) {
+ delete m_pCryptoHandler;
+ }
+ m_pCryptoHandler = FX_NEW CPDF_StandardCryptoHandler;
+ m_pCryptoHandler->Init(m_pEncryptDict, &handler);
+ m_bNewCrypto = TRUE;
+ m_bSecurityChanged = TRUE;
+ }
+ }
+}
+FX_INT32 CPDF_Creator::Continue(IFX_Pause *pPause)
+{
+ if (m_iStage < 0) {
+ return m_iStage;
+ }
+ FX_INT32 iRet;
+ while (m_iStage < 100) {
+ if (m_iStage < 20) {
+ iRet = WriteDoc_Stage1(pPause);
+ } else if (m_iStage < 30) {
+ iRet = WriteDoc_Stage2(pPause);
+ } else if (m_iStage < 90) {
+ iRet = WriteDoc_Stage3(pPause);
+ } else {
+ iRet = WriteDoc_Stage4(pPause);
+ }
+ if (iRet < m_iStage) {
+ break;
+ }
+ }
+ if (iRet < 1 || m_iStage == 100) {
+ m_iStage = -1;
+ Clear();
+ return iRet > 99 ? 0 : (iRet < 1 ? -1 : iRet);
+ }
+ return m_iStage;
+}
+FX_BOOL CPDF_Creator::SetFileVersion(FX_INT32 fileVersion )
+{
+ if (fileVersion < 10 || fileVersion > 17) {
+ return FALSE;
+ }
+ m_FileVersion = fileVersion;
+ return TRUE;
+}
+void CPDF_Creator::ResetStandardSecurity()
+{
+ if ((m_bStandardSecurity || m_bNewCrypto) && m_pCryptoHandler) {
+ delete m_pCryptoHandler;
+ m_pCryptoHandler = NULL;
+ }
+ m_bNewCrypto = FALSE;
+ if (!m_bStandardSecurity) {
+ return;
+ }
+ if (m_pEncryptDict) {
+ m_pEncryptDict->Release();
+ m_pEncryptDict = NULL;
+ }
+ m_bStandardSecurity = FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
new file mode 100644
index 0000000000..9157b96420
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp
@@ -0,0 +1,1205 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_page/pageint.h"
+#include <limits.h>
+CPDF_Document::CPDF_Document() : CPDF_IndirectObjects(NULL)
+{
+ m_pRootDict = NULL;
+ m_pInfoDict = NULL;
+ m_bLinearized = FALSE;
+ m_dwFirstPageNo = 0;
+ m_dwFirstPageObjNum = 0;
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+}
+void CPDF_Document::CreateNewDoc()
+{
+ ASSERT(m_pRootDict == NULL && m_pInfoDict == NULL);
+ m_pRootDict = FX_NEW CPDF_Dictionary;
+ m_pRootDict->SetAtName("Type", "Catalog");
+ int objnum = AddIndirectObject(m_pRootDict);
+ CPDF_Dictionary* pPages = FX_NEW CPDF_Dictionary;
+ pPages->SetAtName("Type", "Pages");
+ pPages->SetAtNumber("Count", 0);
+ pPages->SetAt("Kids", FX_NEW CPDF_Array);
+ objnum = AddIndirectObject(pPages);
+ m_pRootDict->SetAtReference("Pages", this, objnum);
+ m_pInfoDict = FX_NEW CPDF_Dictionary;
+ AddIndirectObject(m_pInfoDict);
+}
+static const FX_WCHAR g_FX_CP874Unicodes[128] = {
+ 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
+ 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
+ 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
+ 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
+ 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
+ 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
+ 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
+ 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F,
+ 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
+ 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
+ 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
+ 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1250Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
+ 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
+ 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
+};
+static const FX_WCHAR g_FX_CP1251Unicodes[128] = {
+ 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
+ 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
+ 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
+ 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
+ 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
+ 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+};
+static const FX_WCHAR g_FX_CP1253Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1254Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
+};
+static const FX_WCHAR g_FX_CP1255Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
+ 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
+ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
+ 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
+ 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000,
+};
+static const FX_WCHAR g_FX_CP1256Unicodes[128] = {
+ 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+ 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+ 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+ 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
+ 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+ 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+ 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
+ 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2,
+};
+static const FX_WCHAR g_FX_CP1257Unicodes[128] = {
+ 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021,
+ 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8,
+ 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000,
+ 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7,
+ 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
+ 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
+ 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
+ 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
+ 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
+ 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
+ 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
+ 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
+ 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9,
+};
+typedef struct {
+ FX_BYTE m_Charset;
+ const FX_WCHAR* m_pUnicodes;
+} FX_CharsetUnicodes;
+const FX_CharsetUnicodes g_FX_CharsetUnicodes[] = {
+ { FXFONT_THAI_CHARSET, g_FX_CP874Unicodes },
+ { FXFONT_EASTEUROPE_CHARSET, g_FX_CP1250Unicodes },
+ { FXFONT_RUSSIAN_CHARSET, g_FX_CP1251Unicodes },
+ { FXFONT_GREEK_CHARSET, g_FX_CP1253Unicodes },
+ { FXFONT_TURKISH_CHARSET, g_FX_CP1254Unicodes },
+ { FXFONT_HEBREW_CHARSET, g_FX_CP1255Unicodes },
+ { FXFONT_ARABIC_CHARSET, g_FX_CP1256Unicodes },
+ { FXFONT_BALTIC_CHARSET, g_FX_CP1257Unicodes },
+};
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_WIN64_)
+static void _InsertWidthArray(HDC hDC, int start, int end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ GetCharWidth(hDC, start, end, widths);
+ int i;
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ LOGFONTA lfa;
+ FXSYS_memcpy32(&lfa, pLogFont, (char*)lfa.lfFaceName - (char*)&lfa);
+ CFX_ByteString face = CFX_ByteString::FromUnicode(pLogFont->lfFaceName);
+ if (face.GetLength() >= LF_FACESIZE) {
+ return NULL;
+ }
+ FXSYS_strcpy(lfa.lfFaceName, (FX_LPCSTR)face);
+ return AddWindowsFont(&lfa, bVert, bTranslateName);
+}
+extern CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name);
+CFX_ByteString _FPDF_GetPSNameFromTT(HDC hDC)
+{
+ CFX_ByteString result;
+ DWORD size = ::GetFontData(hDC, 'eman', 0, NULL, 0);
+ if (size != GDI_ERROR) {
+ LPBYTE buffer = FX_Alloc(BYTE, size);
+ ::GetFontData(hDC, 'eman', 0, buffer, size);
+ result = _FPDF_GetNameFromTT(buffer, 6);
+ FX_Free(buffer);
+ }
+ return result;
+}
+CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ pLogFont->lfHeight = -1000;
+ pLogFont->lfWidth = 0;
+ HGDIOBJ hFont = CreateFontIndirectA(pLogFont);
+ HDC hDC = CreateCompatibleDC(NULL);
+ hFont = SelectObject(hDC, hFont);
+ int tm_size = GetOutlineTextMetrics(hDC, 0, NULL);
+ if (tm_size == 0) {
+ hFont = SelectObject(hDC, hFont);
+ DeleteObject(hFont);
+ DeleteDC(hDC);
+ return NULL;
+ }
+ LPBYTE tm_buf = FX_Alloc(BYTE, tm_size);
+ OUTLINETEXTMETRIC* ptm = (OUTLINETEXTMETRIC*)tm_buf;
+ GetOutlineTextMetrics(hDC, tm_size, ptm);
+ int flags = 0, italicangle, ascend, descend, capheight, bbox[4];
+ if (pLogFont->lfItalic) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if ((pLogFont->lfPitchAndFamily & 3) == FIXED_PITCH) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_ROMAN) {
+ flags |= PDFFONT_SERIF;
+ }
+ if ((pLogFont->lfPitchAndFamily & 0xf8) == FF_SCRIPT) {
+ flags |= PDFFONT_SCRIPT;
+ }
+ FX_BOOL bCJK = pLogFont->lfCharSet == CHINESEBIG5_CHARSET || pLogFont->lfCharSet == GB2312_CHARSET ||
+ pLogFont->lfCharSet == HANGEUL_CHARSET || pLogFont->lfCharSet == SHIFTJIS_CHARSET;
+ CFX_ByteString basefont;
+ if (bTranslateName && bCJK) {
+ basefont = _FPDF_GetPSNameFromTT(hDC);
+ }
+ if (basefont.IsEmpty()) {
+ basefont = pLogFont->lfFaceName;
+ }
+ italicangle = ptm->otmItalicAngle / 10;
+ ascend = ptm->otmrcFontBox.top;
+ descend = ptm->otmrcFontBox.bottom;
+ capheight = ptm->otmsCapEmHeight;
+ bbox[0] = ptm->otmrcFontBox.left;
+ bbox[1] = ptm->otmrcFontBox.bottom;
+ bbox[2] = ptm->otmrcFontBox.right;
+ bbox[3] = ptm->otmrcFontBox.top;
+ FX_Free(tm_buf);
+ basefont.Replace(" ", "");
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pBaseDict->SetAtName("Type", "Font");
+ CPDF_Dictionary* pFontDict = pBaseDict;
+ if (!bCJK) {
+ if (pLogFont->lfCharSet == ANSI_CHARSET || pLogFont->lfCharSet == DEFAULT_CHARSET ||
+ pLogFont->lfCharSet == SYMBOL_CHARSET) {
+ if (pLogFont->lfCharSet == SYMBOL_CHARSET) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
+ if (g_FX_CharsetUnicodes[i].m_Charset == pLogFont->lfCharSet) {
+ break;
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
+ pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ }
+ pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncoding);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
+ }
+ }
+ if (pLogFont->lfWeight > FW_MEDIUM && pLogFont->lfItalic) {
+ basefont += ",BoldItalic";
+ } else if (pLogFont->lfWeight > FW_MEDIUM) {
+ basefont += ",Bold";
+ } else if (pLogFont->lfItalic) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ int char_widths[224];
+ GetCharWidth(hDC, 32, 255, char_widths);
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ for (int i = 0; i < 224; i ++) {
+ pWidths->AddInteger(char_widths[i]);
+ }
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ switch (pLogFont->lfCharSet) {
+ case CHINESEBIG5_CHARSET:
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
+ break;
+ case GB2312_CHARSET:
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray(hDC, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray(hDC, 0x21, 0x7e, pWidthArray);
+ break;
+ case HANGEUL_CHARSET:
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(hDC, 0x20, 0x7e, pWidthArray);
+ break;
+ case SHIFTJIS_CHARSET:
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray(hDC, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray(hDC, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray(hDC, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray(hDC, 0x7e, 0x7e, pWidthArray);
+ break;
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ for (int i = 0; i < 4; i ++) {
+ pBBox->AddInteger(bbox[i]);
+ }
+ pFontDesc->SetAt("FontBBox", pBBox);
+ pFontDesc->SetAtInteger("ItalicAngle", italicangle);
+ pFontDesc->SetAtInteger("Ascent", ascend);
+ pFontDesc->SetAtInteger("Descent", descend);
+ pFontDesc->SetAtInteger("CapHeight", capheight);
+ pFontDesc->SetAtInteger("StemV", pLogFont->lfWeight / 5);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ hFont = SelectObject(hDC, hFont);
+ DeleteObject(hFont);
+ DeleteDC(hDC);
+ return LoadFont(pBaseDict);
+}
+#endif
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_)
+FX_UINT32 FX_GetLangHashCode( FX_LPCSTR pStr)
+{
+ FXSYS_assert( pStr != NULL);
+ FX_INT32 iLength = FXSYS_strlen(pStr);
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_UINT32 uHashCode = 0;
+ while ( pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + tolower(*pStr++);
+ }
+ return uHashCode;
+}
+struct FX_LANG2CS {
+ FX_DWORD uLang;
+ int uCharset;
+}*FX_LPLANG2CS;
+static const FX_LANG2CS gs_FXLang2CharsetTable[] = {
+ {3109, 0},
+ {3121, 178},
+ {3129, 162},
+ {3139, 204},
+ {3141, 204},
+ {3166, 0},
+ {3184, 238},
+ {3197, 0},
+ {3201, 0},
+ {3239, 161},
+ {3241, 0},
+ {3246, 0},
+ {3247, 186},
+ {3248, 0},
+ {3259, 178},
+ {3267, 0},
+ {3273, 0},
+ {3276, 0},
+ {3301, 0},
+ {3310, 1},
+ {3325, 177},
+ {3329, 1},
+ {3338, 238},
+ {3341, 238},
+ {3345, 1},
+ {3355, 0},
+ {3370, 0},
+ {3371, 0},
+ {3383, 128},
+ {3424, 204},
+ {3427, 1},
+ {3428, 129},
+ {3436, 178},
+ {3464, 186},
+ {3466, 186},
+ {3486, 204},
+ {3487, 0},
+ {3493, 1},
+ {3494, 0},
+ {3508, 0},
+ {3518, 0},
+ {3520, 0},
+ {3569, 1},
+ {3580, 238},
+ {3588, 0},
+ {3645, 238},
+ {3651, 204},
+ {3672, 238},
+ {3673, 238},
+ {3678, 238},
+ {3679, 238},
+ {3683, 0},
+ {3684, 0},
+ {3693, 1},
+ {3697, 1},
+ {3700, 222},
+ {3710, 162},
+ {3734, 204},
+ {3741, 178},
+ {3749, 162},
+ {3763, 163},
+ {3886, 134},
+ {105943, 0},
+ {106375, 1},
+ {3923451837, 134},
+ {3923451838, 136},
+};
+static FX_WORD FX_GetCsFromLangCode(FX_UINT32 uCode)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(gs_FXLang2CharsetTable) / sizeof(FX_LANG2CS) - 1;
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ const FX_LANG2CS &charset = gs_FXLang2CharsetTable[iMid];
+ if (uCode == charset.uLang) {
+ return charset.uCharset;
+ } else if (uCode < charset.uLang) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ };
+ return 0;
+}
+static FX_WORD FX_GetCharsetFromLang(FX_LPCSTR pLang, FX_INT32 iLength)
+{
+ FXSYS_assert(pLang);
+ if (iLength < 0) {
+ iLength = FXSYS_strlen(pLang);
+ }
+ FX_UINT32 uHash = FX_GetLangHashCode(pLang);
+ return FX_GetCsFromLangCode(uHash);
+}
+static void _CFString2CFXByteString(CFStringRef src, CFX_ByteString &dest)
+{
+ SInt32 len = CFStringGetLength(src);
+ CFRange range = CFRangeMake(0, len);
+ CFIndex used = 0;
+ UInt8* pBuffer = (UInt8*)malloc(sizeof(UInt8) * (len + 1));
+ FXSYS_memset32(pBuffer, 0, sizeof(UInt8) * (len + 1));
+ CFStringGetBytes(src, range, kCFStringEncodingASCII, 0, false, pBuffer, len, &used);
+ dest = (FX_LPSTR)pBuffer;
+ free(pBuffer);
+}
+FX_BOOL IsHasCharSet(CFArrayRef languages, const CFX_DWordArray &charSets)
+{
+ int iCount = charSets.GetSize();
+ for (int i = 0; i < CFArrayGetCount(languages); ++i) {
+ CFStringRef language = (CFStringRef)CFArrayGetValueAtIndex(languages, i);
+ FX_DWORD CharSet = FX_GetCharsetFromLang(CFStringGetCStringPtr(language, kCFStringEncodingMacRoman), -1);
+ for (int j = 0; j < iCount; ++j) {
+ if (CharSet == charSets[j]) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+void FX_GetCharWidth(CTFontRef font, UniChar start, UniChar end, int* width)
+{
+ CGFloat size = CTFontGetSize(font);
+ for (; start <= end; ++start) {
+ CGGlyph pGlyph = NULL;
+ CFIndex count = 1;
+ CTFontGetGlyphsForCharacters(font, &start, &pGlyph, count);
+ CGSize advances;
+ CTFontGetAdvancesForGlyphs(font, kCTFontDefaultOrientation, &pGlyph, &advances, 1);
+ *width = (int)(advances.width / size * 1000) ;
+ width++;
+ }
+}
+static void _InsertWidthArray(CTFontRef font, int start, int end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ FX_GetCharWidth(font, start, end, widths);
+ int i;
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddMacFont(CTFontRef pFont, FX_BOOL bVert, FX_BOOL bTranslateName)
+{
+ CTFontRef font = (CTFontRef)pFont;
+ CTFontDescriptorRef descriptor = CTFontCopyFontDescriptor(font);
+ if (descriptor == NULL) {
+ return NULL;
+ }
+ CFX_ByteString basefont;
+ FX_BOOL bCJK = FALSE;
+ int flags = 0, italicangle = 0, ascend = 0, descend = 0, capheight = 0, bbox[4];
+ FXSYS_memset32(bbox, 0, sizeof(int) * 4);
+ CFArrayRef languages = (CFArrayRef)CTFontDescriptorCopyAttribute(descriptor, kCTFontLanguagesAttribute);
+ if (languages == NULL) {
+ CFRelease(descriptor);
+ return NULL;
+ }
+ CFX_DWordArray charSets;
+ charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
+ charSets.Add(FXFONT_GB2312_CHARSET);
+ charSets.Add(FXFONT_HANGEUL_CHARSET);
+ charSets.Add(FXFONT_SHIFTJIS_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ bCJK = TRUE;
+ }
+ CFRelease(descriptor);
+ CFDictionaryRef traits = (CFDictionaryRef)CTFontCopyTraits(font);
+ if (traits == NULL) {
+ CFRelease(languages);
+ return NULL;
+ }
+ CFNumberRef sybolicTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontSymbolicTrait);
+ CTFontSymbolicTraits trait = 0;
+ CFNumberGetValue(sybolicTrait, kCFNumberSInt32Type, &trait);
+ if (trait & kCTFontItalicTrait) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if (trait & kCTFontMonoSpaceTrait) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ if (trait & kCTFontModernSerifsClass) {
+ flags |= PDFFONT_SERIF;
+ }
+ if (trait & kCTFontScriptsClass) {
+ flags |= PDFFONT_SCRIPT;
+ }
+ CFNumberRef weightTrait = (CFNumberRef)CFDictionaryGetValue(traits, kCTFontWeightTrait);
+ Float32 weight = 0;
+ CFNumberGetValue(weightTrait, kCFNumberFloat32Type, &weight);
+ italicangle = CTFontGetSlantAngle(font);
+ ascend = CTFontGetAscent(font);
+ descend = CTFontGetDescent(font);
+ capheight = CTFontGetCapHeight(font);
+ CGRect box = CTFontGetBoundingBox(font);
+ bbox[0] = box.origin.x;
+ bbox[1] = box.origin.y;
+ bbox[2] = box.origin.x + box.size.width;
+ bbox[3] = box.origin.y + box.size.height;
+ if (bTranslateName && bCJK) {
+ CFStringRef postName = CTFontCopyPostScriptName(font);
+ _CFString2CFXByteString(postName, basefont);
+ CFRelease(postName);
+ }
+ if (basefont.IsEmpty()) {
+ CFStringRef fullName = CTFontCopyFullName(font);
+ _CFString2CFXByteString(fullName, basefont);
+ CFRelease(fullName);
+ }
+ basefont.Replace(" ", "");
+ CPDF_Dictionary* pFontDict = NULL;
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pFontDict = pBaseDict;
+ if (!bCJK) {
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_ANSI_CHARSET);
+ charSets.Add(FXFONT_DEFAULT_CHARSET);
+ charSets.Add(FXFONT_SYMBOL_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_SYMBOL_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++) {
+ charSets.RemoveAll();
+ charSets.Add(g_FX_CharsetUnicodes[i].m_Charset);
+ if (IsHasCharSet(languages, charSets)) {
+ break;
+ }
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncoding = FX_NEW CPDF_Dictionary;
+ pEncoding->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ }
+ pEncoding->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncoding);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncoding);
+ }
+ }
+ if (weight > 0.0 && trait & kCTFontItalicTrait) {
+ basefont += ",BoldItalic";
+ } else if (weight > 0.0) {
+ basefont += ",Bold";
+ } else if (trait & kCTFontItalicTrait) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ int char_widths[224];
+ FX_GetCharWidth(font, 32, 255, char_widths);
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ for (int i = 0; i < 224; i ++) {
+ pWidths->AddInteger(char_widths[i]);
+ }
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ CPDF_Array* pArray = NULL;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ FX_BOOL bFound = FALSE;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_CHINESEBIG5_CHARSET);
+ if (IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_GB2312_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray(font, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray(font, 0x21, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_HANGEUL_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray(font, 0x20, 0x7e, pWidthArray);
+ bFound = TRUE;
+ }
+ charSets.RemoveAll();
+ charSets.Add(FXFONT_SHIFTJIS_CHARSET);
+ if (!bFound && IsHasCharSet(languages, charSets)) {
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray(font, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray(font, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray(font, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray(font, 0x7e, 0x7e, pWidthArray);
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ for (int i = 0; i < 4; i ++) {
+ pBBox->AddInteger(bbox[i]);
+ }
+ pFontDesc->SetAt("FontBBox", pBBox);
+ pFontDesc->SetAtInteger("ItalicAngle", italicangle);
+ pFontDesc->SetAtInteger("Ascent", ascend);
+ pFontDesc->SetAtInteger("Descent", descend);
+ pFontDesc->SetAtInteger("CapHeight", capheight);
+ CGFloat fStemV = 0;
+ int16_t min_width = SHRT_MAX;
+ static const UniChar stem_chars[] = {'i', 'I', '!', '1'};
+ const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
+ CGGlyph glyphs[count];
+ CGRect boundingRects[count];
+ if (CTFontGetGlyphsForCharacters(font, stem_chars, glyphs, count)) {
+ CTFontGetBoundingRectsForGlyphs(font, kCTFontHorizontalOrientation,
+ glyphs, boundingRects, count);
+ for (size_t i = 0; i < count; i++) {
+ int16_t width = boundingRects[i].size.width;
+ if (width > 0 && width < min_width) {
+ min_width = width;
+ fStemV = min_width;
+ }
+ }
+ }
+ pFontDesc->SetAtInteger("StemV", fStemV);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ CFRelease(traits);
+ CFRelease(languages);
+ return LoadFont(pBaseDict);
+}
+#endif
+static void _InsertWidthArray1(CFX_Font* pFont, IFX_FontEncoding* pEncoding, FX_WCHAR start, FX_WCHAR end, CPDF_Array* pWidthArray)
+{
+ int size = end - start + 1;
+ int* widths = FX_Alloc(int, size);
+ int i;
+ for (i = 0; i < size; i ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(start + i);
+ widths[i] = pFont->GetGlyphWidth(glyph_index);
+ }
+ for (i = 1; i < size; i ++)
+ if (widths[i] != *widths) {
+ break;
+ }
+ if (i == size) {
+ int first = pWidthArray->GetInteger(pWidthArray->GetCount() - 1);
+ pWidthArray->AddInteger(first + size - 1);
+ pWidthArray->AddInteger(*widths);
+ } else {
+ CPDF_Array* pWidthArray1 = FX_NEW CPDF_Array;
+ pWidthArray->Add(pWidthArray1);
+ for (i = 0; i < size; i ++) {
+ pWidthArray1->AddInteger(widths[i]);
+ }
+ }
+ FX_Free(widths);
+}
+CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert)
+{
+ if (pFont == NULL) {
+ return NULL;
+ }
+ FX_BOOL bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || charset == FXFONT_GB2312_CHARSET ||
+ charset == FXFONT_HANGEUL_CHARSET || charset == FXFONT_SHIFTJIS_CHARSET;
+ CFX_ByteString basefont = pFont->GetFamilyName();
+ basefont.Replace(" ", "");
+ int flags = 0;
+ if (pFont->IsBold()) {
+ flags |= PDFFONT_FORCEBOLD;
+ }
+ if (pFont->IsItalic()) {
+ flags |= PDFFONT_ITALIC;
+ }
+ if (pFont->IsFixedWidth()) {
+ flags |= PDFFONT_FIXEDPITCH;
+ }
+ CPDF_Dictionary* pBaseDict = FX_NEW CPDF_Dictionary;
+ pBaseDict->SetAtName("Type", "Font");
+ IFX_FontEncoding* pEncoding = FXGE_CreateUnicodeEncoding(pFont);
+ CPDF_Dictionary* pFontDict = pBaseDict;
+ if (!bCJK) {
+ CPDF_Array* pWidths = FX_NEW CPDF_Array;
+ int charcode;
+ for (charcode = 32; charcode < 128; charcode ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(charcode);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET ||
+ charset == FXFONT_SYMBOL_CHARSET) {
+ if (charset == FXFONT_SYMBOL_CHARSET) {
+ flags |= PDFFONT_SYMBOLIC;
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ }
+ pBaseDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ for (charcode = 128; charcode <= 255; charcode ++) {
+ int glyph_index = pEncoding->GlyphFromCharCode(charcode);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ int i;
+ for (i = 0; i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes); i ++)
+ if (g_FX_CharsetUnicodes[i].m_Charset == charset) {
+ break;
+ }
+ if (i < sizeof g_FX_CharsetUnicodes / sizeof(FX_CharsetUnicodes)) {
+ CPDF_Dictionary* pEncodingDict = FX_NEW CPDF_Dictionary;
+ pEncodingDict->SetAtName(FX_BSTRC("BaseEncoding"), "WinAnsiEncoding");
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(128);
+ const FX_WCHAR* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes;
+ for (int j = 0; j < 128; j ++) {
+ CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]);
+ if (name.IsEmpty()) {
+ pArray->AddName(FX_BSTRC(".notdef"));
+ } else {
+ pArray->AddName(name);
+ }
+ int glyph_index = pEncoding->GlyphFromCharCode(pUnicodes[j]);
+ int char_width = pFont->GetGlyphWidth(glyph_index);
+ pWidths->AddInteger(char_width);
+ }
+ pEncodingDict->SetAt(FX_BSTRC("Differences"), pArray);
+ AddIndirectObject(pEncodingDict);
+ pBaseDict->SetAtReference(FX_BSTRC("Encoding"), this, pEncodingDict);
+ }
+ }
+ if (pFont->IsBold() && pFont->IsItalic()) {
+ basefont += ",BoldItalic";
+ } else if (pFont->IsBold()) {
+ basefont += ",Bold";
+ } else if (pFont->IsItalic()) {
+ basefont += ",Italic";
+ }
+ pBaseDict->SetAtName("Subtype", "TrueType");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtNumber("FirstChar", 32);
+ pBaseDict->SetAtNumber("LastChar", 255);
+ pBaseDict->SetAt("Widths", pWidths);
+ } else {
+ flags |= PDFFONT_NONSYMBOLIC;
+ pFontDict = FX_NEW CPDF_Dictionary;
+ CFX_ByteString cmap;
+ CFX_ByteString ordering;
+ int supplement;
+ CPDF_Array* pWidthArray = FX_NEW CPDF_Array;
+ switch (charset) {
+ case FXFONT_CHINESEBIG5_CHARSET:
+ cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H";
+ ordering = "CNS1";
+ supplement = 4;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
+ break;
+ case FXFONT_GB2312_CHARSET:
+ cmap = bVert ? "GBK-EUC-V" : "GBK-EUC-H";
+ ordering = "GB1", supplement = 2;
+ pWidthArray->AddInteger(7716);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x20, pWidthArray);
+ pWidthArray->AddInteger(814);
+ _InsertWidthArray1(pFont, pEncoding, 0x21, 0x7e, pWidthArray);
+ break;
+ case FXFONT_HANGEUL_CHARSET:
+ cmap = bVert ? "KSCms-UHC-V" : "KSCms-UHC-H";
+ ordering = "Korea1";
+ supplement = 2;
+ pWidthArray->AddInteger(1);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7e, pWidthArray);
+ break;
+ case FXFONT_SHIFTJIS_CHARSET:
+ cmap = bVert ? "90ms-RKSJ-V" : "90ms-RKSJ-H";
+ ordering = "Japan1";
+ supplement = 5;
+ pWidthArray->AddInteger(231);
+ _InsertWidthArray1(pFont, pEncoding, 0x20, 0x7d, pWidthArray);
+ pWidthArray->AddInteger(326);
+ _InsertWidthArray1(pFont, pEncoding, 0xa0, 0xa0, pWidthArray);
+ pWidthArray->AddInteger(327);
+ _InsertWidthArray1(pFont, pEncoding, 0xa1, 0xdf, pWidthArray);
+ pWidthArray->AddInteger(631);
+ _InsertWidthArray1(pFont, pEncoding, 0x7e, 0x7e, pWidthArray);
+ break;
+ }
+ pBaseDict->SetAtName("Subtype", "Type0");
+ pBaseDict->SetAtName("BaseFont", basefont);
+ pBaseDict->SetAtName("Encoding", cmap);
+ pFontDict->SetAt("W", pWidthArray);
+ pFontDict->SetAtName("Type", "Font");
+ pFontDict->SetAtName("Subtype", "CIDFontType2");
+ pFontDict->SetAtName("BaseFont", basefont);
+ CPDF_Dictionary* pCIDSysInfo = FX_NEW CPDF_Dictionary;
+ pCIDSysInfo->SetAtString("Registry", "Adobe");
+ pCIDSysInfo->SetAtString("Ordering", ordering);
+ pCIDSysInfo->SetAtInteger("Supplement", supplement);
+ pFontDict->SetAt("CIDSystemInfo", pCIDSysInfo);
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pBaseDict->SetAt("DescendantFonts", pArray);
+ AddIndirectObject(pFontDict);
+ pArray->AddReference(this, pFontDict);
+ }
+ AddIndirectObject(pBaseDict);
+ CPDF_Dictionary* pFontDesc = FX_NEW CPDF_Dictionary;
+ pFontDesc->SetAtName("Type", "FontDescriptor");
+ pFontDesc->SetAtName("FontName", basefont);
+ pFontDesc->SetAtInteger("Flags", flags);
+ pFontDesc->SetAtInteger("ItalicAngle", pFont->m_pSubstFont ? pFont->m_pSubstFont->m_ItalicAngle : 0);
+ pFontDesc->SetAtInteger("Ascent", pFont->GetAscent());
+ pFontDesc->SetAtInteger("Descent", pFont->GetDescent());
+ FX_RECT bbox;
+ pFont->GetBBox(bbox);
+ CPDF_Array* pBBox = FX_NEW CPDF_Array;
+ pBBox->AddInteger(bbox.left);
+ pBBox->AddInteger(bbox.bottom);
+ pBBox->AddInteger(bbox.right);
+ pBBox->AddInteger(bbox.top);
+ pFontDesc->SetAt("FontBBox", pBBox);
+ FX_INT32 nStemV = 0;
+ if (pFont->m_pSubstFont) {
+ nStemV = pFont->m_pSubstFont->m_Weight / 5;
+ } else {
+ static const FX_CHAR stem_chars[] = {'i', 'I', '!', '1'};
+ const size_t count = sizeof(stem_chars) / sizeof(stem_chars[0]);
+ FX_DWORD glyph = pEncoding->GlyphFromCharCode(stem_chars[0]);
+ nStemV = pFont->GetGlyphWidth(glyph);
+ for (size_t i = 1; i < count; i++) {
+ glyph = pEncoding->GlyphFromCharCode(stem_chars[i]);
+ int width = pFont->GetGlyphWidth(glyph);
+ if (width > 0 && width < nStemV) {
+ nStemV = width;
+ }
+ }
+ }
+ if (pEncoding) {
+ delete pEncoding;
+ }
+ pFontDesc->SetAtInteger("StemV", nStemV);
+ AddIndirectObject(pFontDesc);
+ pFontDict->SetAtReference("FontDescriptor", this, pFontDesc);
+ return LoadFont(pBaseDict);
+}
+static CPDF_Stream* GetFormStream(CPDF_Document* pDoc, CPDF_Object* pResObj)
+{
+ if (pResObj->GetType() != PDFOBJ_REFERENCE) {
+ return NULL;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)pResObj;
+ FX_BOOL bForm;
+ if (pDoc->IsFormStream(pRef->GetRefObjNum(), bForm) && !bForm) {
+ return NULL;
+ }
+ pResObj = pRef->GetDirect();
+ if (pResObj->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ CPDF_Stream* pXObject = (CPDF_Stream*)pResObj;
+ if (pXObject->GetDict()->GetString(FX_BSTRC("Subtype")) != FX_BSTRC("Form")) {
+ return NULL;
+ }
+ return pXObject;
+}
+static int InsertDeletePDFPage(CPDF_Document* pDoc, CPDF_Dictionary* pPages,
+ int nPagesToGo, CPDF_Dictionary* pPage, FX_BOOL bInsert, CFX_PtrArray& stackList)
+{
+ CPDF_Array* pKidList = pPages->GetArray("Kids");
+ if (!pKidList) {
+ return -1;
+ }
+ int nKids = pKidList->GetCount();
+ for (int i = 0; i < nKids; i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid->GetString("Type") == FX_BSTRC("Page")) {
+ if (nPagesToGo == 0) {
+ if (bInsert) {
+ pKidList->InsertAt(i, CPDF_Reference::Create(pDoc, pPage->GetObjNum()));
+ pPage->SetAtReference("Parent", pDoc, pPages->GetObjNum());
+ } else {
+ pKidList->RemoveAt(i);
+ }
+ pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
+ return 1;
+ }
+ nPagesToGo --;
+ } else {
+ int nPages = pKid->GetInteger("Count");
+ if (nPagesToGo < nPages) {
+ int stackCount = stackList.GetSize();
+ for (int j = 0; j < stackCount; ++j) {
+ if (pKid == stackList[j]) {
+ return -1;
+ }
+ }
+ stackList.Add(pKid);
+ if (InsertDeletePDFPage(pDoc, pKid, nPagesToGo, pPage, bInsert, stackList) < 0) {
+ return -1;
+ }
+ stackList.RemoveAt(stackCount);
+ pPages->SetAtInteger("Count", pPages->GetInteger("Count") + (bInsert ? 1 : -1));
+ return 1;
+ }
+ nPagesToGo -= nPages;
+ }
+ }
+ return 0;
+}
+static int InsertNewPage(CPDF_Document* pDoc, int iPage, CPDF_Dictionary* pPageDict, CFX_DWordArray &pageList)
+{
+ CPDF_Dictionary* pRoot = pDoc->GetRoot();
+ if (!pRoot) {
+ return -1;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (!pPages) {
+ return -1;
+ }
+ int nPages = pDoc->GetPageCount();
+ if (iPage < 0 || iPage > nPages) {
+ return -1;
+ }
+ if (iPage == nPages) {
+ CPDF_Array* pPagesList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (!pPagesList) {
+ pPagesList = FX_NEW CPDF_Array;
+ pPages->SetAt(FX_BSTRC("Kids"), pPagesList);
+ }
+ pPagesList->Add(pPageDict, pDoc);
+ pPages->SetAtInteger(FX_BSTRC("Count"), nPages + 1);
+ pPageDict->SetAtReference(FX_BSTRC("Parent"), pDoc, pPages->GetObjNum());
+ } else {
+ CFX_PtrArray stack;
+ stack.Add(pPages);
+ if (InsertDeletePDFPage(pDoc, pPages, iPage, pPageDict, TRUE, stack) < 0) {
+ return -1;
+ }
+ }
+ pageList.InsertAt(iPage, pPageDict->GetObjNum());
+ return iPage;
+}
+CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage)
+{
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName("Type", "Page");
+ FX_DWORD dwObjNum = AddIndirectObject(pDict);
+ if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) {
+ ReleaseIndirectObject(dwObjNum);
+ return NULL;
+ }
+ return pDict;
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name);
+CPDF_Font* CPDF_Document::AddStandardFont(FX_LPCSTR font, CPDF_FontEncoding* pEncoding)
+{
+ CFX_ByteString name(font, -1);
+ if (_PDF_GetStandardFontName(name) < 0) {
+ return NULL;
+ }
+ return GetPageData()->GetStandardFont(name, pEncoding);
+}
+void CPDF_Document::DeletePage(int iPage)
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict("Pages");
+ if (pPages == NULL) {
+ return;
+ }
+ int nPages = pPages->GetInteger("Count");
+ if (iPage < 0 || iPage >= nPages) {
+ return;
+ }
+ CFX_PtrArray stack;
+ stack.Add(pPages);
+ if (InsertDeletePDFPage(this, pPages, iPage, NULL, FALSE, stack) < 0) {
+ return;
+ }
+ m_PageList.RemoveAt(iPage);
+}
+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name);
+void FPDFAPI_FlatPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
+{
+ if (pPageDict->KeyExist(name)) {
+ return;
+ }
+ CPDF_Object* pObj = FPDFAPI_GetPageAttr(pPageDict, name);
+ if (pObj) {
+ pPageDict->SetAt(name, pObj->Clone());
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
new file mode 100644
index 0000000000..cb50601226
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -0,0 +1,374 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../fpdf_page/pageint.h"
+#include "../fpdf_render/render_int.h"
+CPDF_Dictionary* CPDF_Image::InitJPEG(FX_LPBYTE pData, FX_DWORD size)
+{
+ FX_INT32 width, height, color_trans, num_comps, bits;
+ if (!CPDF_ModuleMgr::Get()->GetJpegModule()->
+ LoadInfo(pData, size, width, height, num_comps, bits, color_trans)) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName("Type", "XObject");
+ pDict->SetAtName("Subtype", "Image");
+ pDict->SetAtInteger("Width", width);
+ pDict->SetAtInteger("Height", height);
+ FX_LPCSTR csname = NULL;
+ if (num_comps == 1) {
+ csname = "DeviceGray";
+ } else if (num_comps == 3) {
+ csname = "DeviceRGB";
+ } else if (num_comps == 4) {
+ csname = "DeviceCMYK";
+ CPDF_Array* pDecode = CPDF_Array::Create();
+ for (int n = 0; n < 4; n ++) {
+ pDecode->AddInteger(1);
+ pDecode->AddInteger(0);
+ }
+ pDict->SetAt(FX_BSTRC("Decode"), pDecode);
+ }
+ pDict->SetAtName("ColorSpace", csname);
+ pDict->SetAtInteger("BitsPerComponent", bits);
+ pDict->SetAtName("Filter", "DCTDecode");
+ if (!color_trans) {
+ CPDF_Dictionary* pParms = FX_NEW CPDF_Dictionary;
+ pDict->SetAt("DecodeParms", pParms);
+ pParms->SetAtInteger("ColorTransform", 0);
+ }
+ m_bIsMask = FALSE;
+ m_Width = width;
+ m_Height = height;
+ if (m_pStream == NULL) {
+ m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ }
+ return pDict;
+}
+void CPDF_Image::SetJpegImage(FX_LPBYTE pData, FX_DWORD size)
+{
+ CPDF_Dictionary *pDict = InitJPEG(pData, size);
+ if (!pDict) {
+ return;
+ }
+ m_pStream->InitStream(pData, size, pDict);
+}
+void CPDF_Image::SetJpegImage(IFX_FileRead *pFile)
+{
+ FX_DWORD size = (FX_DWORD)pFile->GetSize();
+ if (!size) {
+ return;
+ }
+ FX_DWORD dwEstimateSize = size;
+ if (dwEstimateSize > 8192) {
+ dwEstimateSize = 8192;
+ }
+ FX_LPBYTE pData = FX_Alloc(FX_BYTE, dwEstimateSize);
+ if (!pData) {
+ return;
+ }
+ pFile->ReadBlock(pData, 0, dwEstimateSize);
+ CPDF_Dictionary *pDict = InitJPEG(pData, dwEstimateSize);
+ FX_Free(pData);
+ if (!pDict && size > dwEstimateSize) {
+ pData = FX_Alloc(FX_BYTE, size);
+ if (!pData) {
+ return;
+ }
+ pFile->ReadBlock(pData, 0, size);
+ pDict = InitJPEG(pData, size);
+ FX_Free(pData);
+ }
+ if (!pDict) {
+ return;
+ }
+ m_pStream->InitStream(pFile, pDict);
+}
+void _DCTEncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap* pBitmap, int quality, FX_LPBYTE &buf, FX_STRSIZE &size)
+{
+}
+void _JBIG2EncodeBitmap(CPDF_Dictionary *pBitmapDict, const CFX_DIBitmap *pBitmap, CPDF_Document *pDoc, FX_LPBYTE &buf, FX_STRSIZE &size, FX_BOOL bLossLess)
+{
+}
+void CPDF_Image::SetImage(const CFX_DIBitmap* pBitmap, FX_INT32 iCompress, IFX_FileWrite *pFileWrite, IFX_FileRead *pFileRead, const CFX_DIBitmap* pMask, const CPDF_ImageSetParam* pParam)
+{
+ FX_INT32 BitmapWidth = pBitmap->GetWidth();
+ FX_INT32 BitmapHeight = pBitmap->GetHeight();
+ if (BitmapWidth < 1 || BitmapHeight < 1) {
+ return;
+ }
+ FX_LPBYTE src_buf = pBitmap->GetBuffer();
+ FX_INT32 src_pitch = pBitmap->GetPitch();
+ FX_INT32 bpp = pBitmap->GetBPP();
+ FX_BOOL bUseMatte = pParam && pParam->pMatteColor && (pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ pDict->SetAtInteger(FX_BSTRC("Width"), BitmapWidth);
+ pDict->SetAtInteger(FX_BSTRC("Height"), BitmapHeight);
+ FX_LPBYTE dest_buf = NULL;
+ FX_STRSIZE dest_pitch = 0, dest_size = 0, opType = -1;
+ if (bpp == 1) {
+ FX_INT32 reset_a = 0, reset_r = 0, reset_g = 0, reset_b = 0;
+ FX_INT32 set_a = 0, set_r = 0, set_g = 0, set_b = 0;
+ if (!pBitmap->IsAlphaMask()) {
+ ArgbDecode(pBitmap->GetPaletteArgb(0), reset_a, reset_r, reset_g, reset_b);
+ ArgbDecode(pBitmap->GetPaletteArgb(1), set_a, set_r, set_g, set_b);
+ }
+ if (set_a == 0 || reset_a == 0) {
+ pDict->SetAt(FX_BSTRC("ImageMask"), FX_NEW CPDF_Boolean(TRUE));
+ if (reset_a == 0) {
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddInteger(1);
+ pArray->AddInteger(0);
+ pDict->SetAt(FX_BSTRC("Decode"), pArray);
+ }
+ } else {
+ CPDF_Array* pCS = FX_NEW CPDF_Array;
+ pCS->AddName(FX_BSTRC("Indexed"));
+ pCS->AddName(FX_BSTRC("DeviceRGB"));
+ pCS->AddInteger(1);
+ CFX_ByteString ct;
+ FX_LPSTR pBuf = ct.GetBuffer(6);
+ pBuf[0] = (FX_CHAR)reset_r;
+ pBuf[1] = (FX_CHAR)reset_g;
+ pBuf[2] = (FX_CHAR)reset_b;
+ pBuf[3] = (FX_CHAR)set_r;
+ pBuf[4] = (FX_CHAR)set_g;
+ pBuf[5] = (FX_CHAR)set_b;
+ ct.ReleaseBuffer(6);
+ pCS->Add(CPDF_String::Create(ct, TRUE));
+ pDict->SetAt(FX_BSTRC("ColorSpace"), pCS);
+ }
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 1);
+ dest_pitch = (BitmapWidth + 7) / 8;
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ opType = 1;
+ } else {
+ opType = 0;
+ }
+ } else if (bpp == 8) {
+ FX_INT32 iPalette = pBitmap->GetPaletteSize();
+ if (iPalette > 0) {
+ CPDF_Array* pCS = FX_NEW CPDF_Array;
+ m_pDocument->AddIndirectObject(pCS);
+ pCS->AddName(FX_BSTRC("Indexed"));
+ pCS->AddName(FX_BSTRC("DeviceRGB"));
+ pCS->AddInteger(iPalette - 1);
+ FX_LPBYTE pColorTable = FX_Alloc(FX_BYTE, iPalette * 3);
+ FX_LPBYTE ptr = pColorTable;
+ for (FX_INT32 i = 0; i < iPalette; i ++) {
+ FX_DWORD argb = pBitmap->GetPaletteArgb(i);
+ ptr[0] = (FX_BYTE)(argb >> 16);
+ ptr[1] = (FX_BYTE)(argb >> 8);
+ ptr[2] = (FX_BYTE)argb;
+ ptr += 3;
+ }
+ CPDF_Stream *pCTS = CPDF_Stream::Create(pColorTable, iPalette * 3, CPDF_Dictionary::Create());
+ m_pDocument->AddIndirectObject(pCTS);
+ pCS->AddReference(m_pDocument, pCTS);
+ pDict->SetAtReference(FX_BSTRC("ColorSpace"), m_pDocument, pCS);
+ } else {
+ pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
+ }
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ dest_pitch = BitmapWidth;
+ opType = 1;
+ } else {
+ opType = 0;
+ }
+ } else {
+ pDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceRGB"));
+ pDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if ((iCompress & 0x03) == PDF_IMAGE_NO_COMPRESS) {
+ dest_pitch = BitmapWidth * 3;
+ opType = 2;
+ } else {
+ opType = 0;
+ }
+ }
+ const CFX_DIBitmap* pMaskBitmap = NULL;
+ if (pBitmap->HasAlpha()) {
+ pMaskBitmap = pBitmap->GetAlphaMask();
+ }
+ if (!pMaskBitmap && pMask) {
+ FXDIB_Format maskFormat = pMask->GetFormat();
+ if (maskFormat == FXDIB_1bppMask || maskFormat == FXDIB_8bppMask) {
+ pMaskBitmap = pMask;
+ }
+ }
+ if (pMaskBitmap) {
+ FX_INT32 maskWidth = pMaskBitmap->GetWidth();
+ FX_INT32 maskHeight = pMaskBitmap->GetHeight();
+ FX_LPBYTE mask_buf = NULL;
+ FX_STRSIZE mask_size;
+ FX_BOOL bDeleteMask = TRUE;
+ CPDF_Dictionary* pMaskDict = FX_NEW CPDF_Dictionary;
+ pMaskDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("XObject"));
+ pMaskDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ pMaskDict->SetAtInteger(FX_BSTRC("Width"), maskWidth);
+ pMaskDict->SetAtInteger(FX_BSTRC("Height"), maskHeight);
+ pMaskDict->SetAtName(FX_BSTRC("ColorSpace"), FX_BSTRC("DeviceGray"));
+ pMaskDict->SetAtInteger(FX_BSTRC("BitsPerComponent"), 8);
+ if (pMaskBitmap->GetBPP() == 8 && (iCompress & PDF_IMAGE_MASK_LOSSY_COMPRESS) != 0) {
+ _DCTEncodeBitmap(pMaskDict, pMaskBitmap, pParam ? pParam->nQuality : 75, mask_buf, mask_size);
+ } else if (pMaskBitmap->GetFormat() == FXDIB_1bppMask) {
+ _JBIG2EncodeBitmap(pMaskDict, pMaskBitmap, m_pDocument, mask_buf, mask_size, TRUE);
+ } else {
+ mask_size = maskHeight * maskWidth;
+ mask_buf = FX_Alloc(FX_BYTE, mask_size);
+ for (FX_INT32 a = 0; a < maskHeight; a ++) {
+ FXSYS_memcpy32(mask_buf + a * maskWidth, pMaskBitmap->GetScanline(a), maskWidth);
+ }
+ }
+ if (pMaskDict) {
+ pMaskDict->SetAtInteger(FX_BSTRC("Length"), mask_size);
+ CPDF_Stream* pMaskStream = NULL;
+ if (bUseMatte) {
+ int a, r, g, b;
+ ArgbDecode(*(pParam->pMatteColor), a, r, g, b);
+ CPDF_Array* pMatte = FX_NEW CPDF_Array;
+ pMatte->AddInteger(r);
+ pMatte->AddInteger(g);
+ pMatte->AddInteger(b);
+ pMaskDict->SetAt(FX_BSTRC("Matte"), pMatte);
+ }
+ pMaskStream = FX_NEW CPDF_Stream(mask_buf, mask_size, pMaskDict);
+ m_pDocument->AddIndirectObject(pMaskStream);
+ bDeleteMask = FALSE;
+ pDict->SetAtReference(FX_BSTRC("SMask"), m_pDocument, pMaskStream);
+ }
+ if (pBitmap->HasAlpha()) {
+ delete pMaskBitmap;
+ }
+ }
+ FX_BOOL bStream = pFileWrite != NULL && pFileRead != NULL;
+ if (opType == 0) {
+ if (iCompress & PDF_IMAGE_LOSSLESS_COMPRESS) {
+ if (pBitmap->GetBPP() == 1) {
+ _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, TRUE);
+ }
+ } else {
+ if (pBitmap->GetBPP() == 1) {
+ _JBIG2EncodeBitmap(pDict, pBitmap, m_pDocument, dest_buf, dest_size, FALSE);
+ } else if (pBitmap->GetBPP() >= 8 && pBitmap->GetPalette() != NULL) {
+ CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
+ pNewBitmap->Copy(pBitmap);
+ pNewBitmap->ConvertFormat(FXDIB_Rgb);
+ SetImage(pNewBitmap, iCompress, pFileWrite, pFileRead);
+ if (pDict) {
+ pDict->Release();
+ pDict = NULL;
+ }
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ dest_size = 0;
+ delete pNewBitmap;
+ return;
+ } else {
+ if (bUseMatte) {
+ CFX_DIBitmap *pNewBitmap = FX_NEW CFX_DIBitmap();
+ pNewBitmap->Create(BitmapWidth, BitmapHeight, FXDIB_Argb);
+ FX_LPBYTE dst_buf = pNewBitmap->GetBuffer();
+ FX_INT32 src_offset = 0;
+ for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
+ src_offset = row * src_pitch;
+ for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
+ FX_FLOAT alpha = src_buf[src_offset + 3] / 255.0f;
+ dst_buf[src_offset] = (FX_BYTE)(src_buf[src_offset] * alpha);
+ dst_buf[src_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
+ dst_buf[src_offset + 2] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
+ dst_buf[src_offset + 3] = (FX_BYTE)(src_buf[src_offset + 3]);
+ src_offset += 4;
+ }
+ }
+ _DCTEncodeBitmap(pDict, pNewBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
+ delete pNewBitmap;
+ } else {
+ _DCTEncodeBitmap(pDict, pBitmap, pParam ? pParam->nQuality : 75, dest_buf, dest_size);
+ }
+ }
+ }
+ if (bStream) {
+ pFileWrite->WriteBlock(dest_buf, dest_size);
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ } else if (opType == 1) {
+ if (!bStream) {
+ dest_size = dest_pitch * BitmapHeight;
+ dest_buf = FX_Alloc(FX_BYTE, dest_size);
+ }
+ FX_LPBYTE pDest = dest_buf;
+ for (FX_INT32 i = 0; i < BitmapHeight; i ++) {
+ if (!bStream) {
+ FXSYS_memcpy32(pDest, src_buf, dest_pitch);
+ pDest += dest_pitch;
+ } else {
+ pFileWrite->WriteBlock(src_buf, dest_pitch);
+ }
+ src_buf += src_pitch;
+ }
+ } else if (opType == 2) {
+ if (!bStream) {
+ dest_size = dest_pitch * BitmapHeight;
+ dest_buf = FX_Alloc(FX_BYTE, dest_size);
+ } else {
+ dest_buf = FX_Alloc(FX_BYTE, dest_pitch);
+ }
+ FX_LPBYTE pDest = dest_buf;
+ FX_INT32 src_offset = 0;
+ FX_INT32 dest_offset = 0;
+ for (FX_INT32 row = 0; row < BitmapHeight; row ++) {
+ src_offset = row * src_pitch;
+ for (FX_INT32 column = 0; column < BitmapWidth; column ++) {
+ FX_FLOAT alpha = bUseMatte ? src_buf[src_offset + 3] / 255.0f : 1;
+ pDest[dest_offset] = (FX_BYTE)(src_buf[src_offset + 2] * alpha);
+ pDest[dest_offset + 1] = (FX_BYTE)(src_buf[src_offset + 1] * alpha);
+ pDest[dest_offset + 2] = (FX_BYTE)(src_buf[src_offset] * alpha);
+ dest_offset += 3;
+ src_offset += bpp == 24 ? 3 : 4;
+ }
+ if (bStream) {
+ pFileWrite->WriteBlock(pDest, dest_pitch);
+ pDest = dest_buf;
+ } else {
+ pDest += dest_pitch;
+ }
+ dest_offset = 0;
+ }
+ if (bStream) {
+ FX_Free(dest_buf);
+ dest_buf = NULL;
+ }
+ }
+ if (m_pStream == NULL) {
+ m_pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ }
+ if (!bStream) {
+ m_pStream->InitStream(dest_buf, dest_size, pDict);
+ } else {
+ pFileWrite->Flush();
+ m_pStream->InitStream(pFileRead, pDict);
+ }
+ m_bIsMask = pBitmap->IsAlphaMask();
+ m_Width = BitmapWidth;
+ m_Height = BitmapHeight;
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+}
+void CPDF_Image::ResetCache(CPDF_Page* pPage, const CFX_DIBitmap* pBitmap)
+{
+ pPage->GetRenderCache()->ResetBitmap(m_pStream, pBitmap);
+}
diff --git a/core/src/fpdfapi/fpdf_font/common.h b/core/src/fpdfapi/fpdf_font/common.h
new file mode 100644
index 0000000000..1c11b281a4
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/common.h
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef COMMON_H
+#define COMMON_H
+typedef signed char TT_int8_t;
+typedef unsigned char TT_uint8_t;
+typedef signed short TT_int16_t;
+typedef unsigned short TT_uint16_t;
+typedef FX_INT32 TT_int32_t;
+typedef FX_DWORD TT_uint32_t;
+typedef FX_INT64 TT_int64_t;
+typedef FX_UINT64 TT_uint64_t;
+#endif
diff --git a/core/src/fpdfapi/fpdf_font/font_int.h b/core/src/fpdfapi/fpdf_font/font_int.h
new file mode 100644
index 0000000000..779f58ee5d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/font_int.h
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+typedef void* FXFT_Library;
+class CPDF_CMapManager : public CFX_Object
+{
+public:
+ CPDF_CMapManager();
+ ~CPDF_CMapManager();
+ FX_LPVOID GetPackage(FX_BOOL bPrompt);
+ CPDF_CMap* GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
+ CPDF_CID2UnicodeMap* GetCID2UnicodeMap(int charset, FX_BOOL bPrompt);
+ void ReloadAll();
+private:
+ CPDF_CMap* LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPrompt);
+ CPDF_CID2UnicodeMap* LoadCID2UnicodeMap(int charset, FX_BOOL bPrompt);
+ void DropAll(FX_BOOL bReload);
+#ifndef _FPDFAPI_MINI_
+ FX_BOOL m_bPrompted;
+ FX_LPVOID m_pPackage;
+#endif
+ CFX_MapByteStringToPtr m_CMaps;
+ CPDF_CID2UnicodeMap* m_CID2UnicodeMaps[6];
+};
+class CPDF_FontGlobals : public CFX_Object
+{
+public:
+ CPDF_FontGlobals();
+ ~CPDF_FontGlobals();
+ void ClearAll();
+ void Clear(void* key);
+ CPDF_Font* Find(void* key, int index);
+ void Set(void* key, int index, CPDF_Font* pFont);
+ CFX_MapPtrToPtr m_pStockMap;
+ CPDF_CMapManager m_CMapManager;
+ struct {
+ const struct FXCMAP_CMap* m_pMapList;
+ int m_Count;
+ } m_EmbeddedCharsets[5];
+ struct {
+ const FX_WORD* m_pMap;
+ int m_Count;
+ } m_EmbeddedToUnicodes[5];
+ FX_LPBYTE m_pContrastRamps;
+};
+struct _CMap_CodeRange {
+ int m_CharSize;
+ FX_BYTE m_Lower[4];
+ FX_BYTE m_Upper[4];
+};
+class CPDF_CMapParser : public CFX_Object
+{
+public:
+ CPDF_CMapParser();
+ ~CPDF_CMapParser() {}
+ FX_BOOL Initialize(CPDF_CMap*);
+ void ParseWord(FX_BSTR str);
+ CFX_BinaryBuf m_AddMaps;
+private:
+ CPDF_CMap* m_pCMap;
+ int m_Status;
+ int m_CodeSeq;
+ FX_DWORD m_CodePoints[4];
+ CFX_ArrayTemplate<_CMap_CodeRange> m_CodeRanges;
+ CFX_ByteString m_Registry, m_Ordering, m_Supplement;
+ CFX_ByteString m_LastWord;
+};
+#define CIDCODING_UNKNOWN 0
+#define CIDCODING_GB 1
+#define CIDCODING_BIG5 2
+#define CIDCODING_JIS 3
+#define CIDCODING_KOREA 4
+#define CIDCODING_UCS2 5
+#define CIDCODING_CID 6
+#define CIDCODING_UTF16 7
+class CPDF_CMap : public CFX_Object
+{
+public:
+ CPDF_CMap();
+ FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr, const FX_CHAR* name, FX_BOOL bPromptCJK);
+ FX_BOOL LoadEmbedded(FX_LPCBYTE pData, FX_DWORD dwSize);
+ void Release();
+ FX_BOOL IsLoaded() const
+ {
+ return m_bLoaded;
+ }
+ int GetCharset()
+ {
+ return m_Charset;
+ }
+ FX_BOOL IsVertWriting() const
+ {
+ return m_bVertical;
+ }
+ FX_WORD CIDFromCharCode(FX_DWORD charcode) const;
+ FX_DWORD CharCodeFromCID(FX_WORD CID) const;
+ int GetCharSize(FX_DWORD charcode) const;
+ FX_DWORD GetNextChar(const FX_CHAR* pString, int& offset) const;
+ int CountChar(const FX_CHAR* pString, int size) const;
+ int AppendChar(FX_LPSTR str, FX_DWORD charcode) const;
+ typedef enum {OneByte, TwoBytes, MixedTwoBytes, MixedFourBytes} CodingScheme;
+protected:
+ ~CPDF_CMap();
+ friend class CPDF_CMapParser;
+ friend class CPDF_CMapManager;
+ friend class CPDF_CIDFont;
+protected:
+ CFX_ByteString m_PredefinedCMap;
+ FX_BOOL m_bVertical;
+ int m_Charset, m_Coding;
+ CodingScheme m_CodingScheme;
+ int m_nCodeRanges;
+ FX_BYTE* m_pLeadingBytes;
+ FX_WORD* m_pMapping;
+ FX_LPBYTE m_pAddMapping;
+ FX_BOOL m_bLoaded;
+ const FXCMAP_CMap* m_pEmbedMap;
+ CPDF_CMap* m_pUseMap;
+};
+class CPDF_PredefinedCMap
+{
+public:
+ FX_LPCSTR m_pName;
+ int m_Charset;
+ int m_Coding;
+ CPDF_CMap::CodingScheme m_CodingScheme;
+ FX_DWORD m_LeadingSegCount;
+ FX_BYTE m_LeadingSegs[4];
+};
+typedef struct _FileHeader {
+ FX_BYTE btTag[4];
+ FX_BYTE btVersion;
+ FX_BYTE btFormat;
+ FX_BYTE btReserved1[2];
+ FX_DWORD dwStartIndex;
+ FX_DWORD dwEndIndex;
+ FX_DWORD dwDataSize;
+ FX_DWORD dwDataOffset;
+ FX_DWORD dwRecordSize;
+} FXMP_FILEHEADER;
+class CPDF_FXMP : public CFX_Object
+{
+public:
+ CPDF_FXMP()
+ {
+ m_pHeader = NULL;
+ m_pTable = NULL;
+ }
+ ~CPDF_FXMP()
+ {
+ if (m_pHeader) {
+ FX_Free(m_pHeader);
+ }
+ }
+ FX_BOOL IsLoaded()
+ {
+ return m_pTable != NULL;
+ }
+ FX_BOOL LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid);
+ FX_LPBYTE GetRecord(FX_DWORD index);
+private:
+ FXMP_FILEHEADER* m_pHeader;
+ FX_LPBYTE m_pTable;
+};
+class CPDF_CID2UnicodeMap : public CFX_Object
+{
+public:
+ CPDF_CID2UnicodeMap();
+ ~CPDF_CID2UnicodeMap();
+ FX_BOOL Initialize();
+ FX_BOOL IsLoaded();
+ void Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK);
+ FX_WCHAR UnicodeFromCID(FX_WORD CID);
+protected:
+ int m_Charset;
+ const FX_WORD* m_pEmbeddedMap;
+ FX_DWORD m_EmbeddedCount;
+#ifndef _FPDFAPI_MINI_
+ CPDF_FXMP* m_pExternalMap;
+#endif
+};
+class CPDF_ToUnicodeMap : public CFX_Object
+{
+public:
+ void Load(CPDF_Stream* pStream);
+ CFX_WideString Lookup(FX_DWORD charcode);
+ FX_DWORD ReverseLookup(FX_WCHAR unicode);
+protected:
+ CFX_CMapDWordToDWord m_Map;
+ CPDF_CID2UnicodeMap* m_pBaseMap;
+ CFX_WideTextBuf m_MultiCharBuf;
+};
+class CPDF_FontCharMap : public CFX_CharMap, public CFX_Object
+{
+public:
+ CPDF_FontCharMap(CPDF_Font* pFont);
+ CPDF_Font* m_pFont;
+};
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
new file mode 100644
index 0000000000..886199b120
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -0,0 +1,1763 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "font_int.h"
+#include "../fpdf_page/pageint.h"
+#include "../../../include/fxge/fx_freetype.h"
+FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id)
+{
+ for (int i = 0; i < FXFT_Get_Face_CharmapCount(face); i ++) {
+ if (FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(face)[i]) == platform_id &&
+ FXFT_Get_Charmap_EncodingID(FXFT_Get_Face_Charmaps(face)[i]) == encoding_id) {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+extern const FX_WORD* PDF_UnicodesForPredefinedCharSet(int);
+CPDF_FontGlobals::CPDF_FontGlobals()
+{
+ FXSYS_memset32(m_EmbeddedCharsets, 0, sizeof m_EmbeddedCharsets);
+ FXSYS_memset32(m_EmbeddedToUnicodes, 0, sizeof m_EmbeddedToUnicodes);
+ m_pContrastRamps = NULL;
+}
+CPDF_FontGlobals::~CPDF_FontGlobals()
+{
+ ClearAll();
+ if (m_pContrastRamps) {
+ FX_Free(m_pContrastRamps);
+ }
+}
+class CFX_StockFontArray : public CFX_Object
+{
+public:
+ CFX_StockFontArray()
+ {
+ FXSYS_memset32(m_pStockFonts, 0, sizeof(CPDF_Font*) * 14);
+ }
+ CPDF_Font* m_pStockFonts[14];
+};
+CPDF_Font* CPDF_FontGlobals::Find(void* key, int index)
+{
+ void* value = NULL;
+ if (!m_pStockMap.Lookup(key, value)) {
+ return NULL;
+ }
+ if (!value) {
+ return NULL;
+ }
+ return ((CFX_StockFontArray*)value)->m_pStockFonts[index];
+}
+void CPDF_FontGlobals::Set(void* key, int index, CPDF_Font* pFont)
+{
+ void* value = NULL;
+ if (m_pStockMap.Lookup(key, value)) {
+ ((CFX_StockFontArray*)value)->m_pStockFonts[index] = pFont;
+ return;
+ }
+ CFX_StockFontArray* pFonts = FX_NEW CFX_StockFontArray();
+ if (pFonts) {
+ pFonts->m_pStockFonts[index] = pFont;
+ }
+ m_pStockMap.SetAt(key, pFonts);
+}
+void CPDF_FontGlobals::Clear(void* key)
+{
+ void* value = NULL;
+ if (!m_pStockMap.Lookup(key, value)) {
+ return;
+ }
+ if (value) {
+ CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
+ for (int i = 0; i < 14; i ++) {
+ if (pStockFonts->m_pStockFonts[i]) {
+ pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
+ delete pStockFonts->m_pStockFonts[i];
+ }
+ }
+ delete pStockFonts;
+ }
+ m_pStockMap.RemoveKey(key);
+}
+void CPDF_FontGlobals::ClearAll()
+{
+ FX_POSITION pos = m_pStockMap.GetStartPosition();
+ while (pos) {
+ void *key = NULL;
+ void* value = NULL;
+ m_pStockMap.GetNextAssoc(pos, key, value);
+ if (value) {
+ CFX_StockFontArray* pStockFonts = (CFX_StockFontArray*)value;
+ for (int i = 0; i < 14; i ++) {
+ if (pStockFonts->m_pStockFonts[i]) {
+ pStockFonts->m_pStockFonts[i]->GetFontDict()->Release();
+ delete pStockFonts->m_pStockFonts[i];
+ }
+ }
+ delete pStockFonts;
+ }
+ m_pStockMap.RemoveKey(key);
+ }
+}
+CPDF_Font::CPDF_Font()
+{
+ m_FontType = 0;
+ m_FontBBox.left = m_FontBBox.right = m_FontBBox.top = m_FontBBox.bottom = 0;
+ m_StemV = m_Ascent = m_Descent = m_ItalicAngle = 0;
+ m_pFontFile = NULL;
+ m_Flags = 0;
+ m_pToUnicodeMap = NULL;
+ m_bToUnicodeLoaded = FALSE;
+ m_pCharMap = NULL;
+}
+FX_BOOL CPDF_Font::Initialize()
+{
+ m_pCharMap = FX_NEW CPDF_FontCharMap(this);
+ return TRUE;
+}
+CPDF_Font::~CPDF_Font()
+{
+ if (m_pCharMap) {
+ FX_Free(m_pCharMap);
+ m_pCharMap = NULL;
+ }
+ if (m_pToUnicodeMap) {
+ delete m_pToUnicodeMap;
+ m_pToUnicodeMap = NULL;
+ }
+ if (m_pFontFile) {
+ m_pDocument->GetPageData()->ReleaseFontFileStreamAcc((CPDF_Stream*)m_pFontFile->GetStream());
+ }
+}
+FX_BOOL CPDF_Font::IsVertWriting() const
+{
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ } else {
+ bVertWriting = m_Font.IsVertical();
+ }
+ return bVertWriting;
+}
+CFX_ByteString CPDF_Font::GetFontTypeName() const
+{
+ switch (m_FontType) {
+ case PDFFONT_TYPE1:
+ return FX_BSTRC("Type1");
+ case PDFFONT_TRUETYPE:
+ return FX_BSTRC("TrueType");
+ case PDFFONT_TYPE3:
+ return FX_BSTRC("Type3");
+ case PDFFONT_CIDFONT:
+ return FX_BSTRC("Type0");
+ }
+ return CFX_ByteString();
+}
+void CPDF_Font::AppendChar(CFX_ByteString& str, FX_DWORD charcode) const
+{
+ char buf[4];
+ int len = AppendChar(buf, charcode);
+ if (len == 1) {
+ str += buf[0];
+ } else {
+ str += CFX_ByteString(buf, len);
+ }
+}
+CFX_WideString CPDF_Font::UnicodeFromCharCode(FX_DWORD charcode) const
+{
+ if (!m_bToUnicodeLoaded) {
+ ((CPDF_Font*)this)->LoadUnicodeMap();
+ }
+ if (m_pToUnicodeMap) {
+ CFX_WideString wsRet = m_pToUnicodeMap->Lookup(charcode);
+ if (!wsRet.IsEmpty()) {
+ return wsRet;
+ }
+ }
+ FX_WCHAR unicode = _UnicodeFromCharCode(charcode);
+ if (unicode == 0) {
+ return CFX_WideString();
+ }
+ return unicode;
+}
+FX_DWORD CPDF_Font::CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ if (!m_bToUnicodeLoaded) {
+ ((CPDF_Font*)this)->LoadUnicodeMap();
+ }
+ if (m_pToUnicodeMap) {
+ FX_DWORD charcode = m_pToUnicodeMap->ReverseLookup(unicode);
+ if (charcode) {
+ return charcode;
+ }
+ }
+ return _CharCodeFromUnicode(unicode);
+}
+CFX_WideString CPDF_Font::DecodeString(const CFX_ByteString& str) const
+{
+ CFX_WideString result;
+ int src_len = str.GetLength();
+ result.Reserve(src_len);
+ FX_LPCSTR src_buf = str;
+ int src_pos = 0;
+ while (src_pos < src_len) {
+ FX_DWORD charcode = GetNextChar(src_buf, src_pos);
+ CFX_WideString unicode = UnicodeFromCharCode(charcode);
+ if (!unicode.IsEmpty()) {
+ result += unicode;
+ } else {
+ result += (FX_WCHAR)charcode;
+ }
+ }
+ return result;
+}
+CFX_ByteString CPDF_Font::EncodeString(const CFX_WideString& str) const
+{
+ CFX_ByteString result;
+ int src_len = str.GetLength();
+ FX_LPSTR dest_buf = result.GetBuffer(src_len * 2);
+ FX_LPCWSTR src_buf = str;
+ int dest_pos = 0;
+ for (int src_pos = 0; src_pos < src_len; src_pos ++) {
+ FX_DWORD charcode = CharCodeFromUnicode(src_buf[src_pos]);
+ dest_pos += AppendChar(dest_buf + dest_pos, charcode);
+ }
+ result.ReleaseBuffer(dest_pos);
+ return result;
+}
+void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc)
+{
+ m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"), PDFFONT_NONSYMBOLIC);
+ int ItalicAngle = 0;
+ FX_BOOL bExistItalicAngle = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("ItalicAngle"))) {
+ ItalicAngle = pFontDesc->GetInteger(FX_BSTRC("ItalicAngle"));
+ bExistItalicAngle = TRUE;
+ }
+ if (ItalicAngle < 0) {
+ m_Flags |= PDFFONT_ITALIC;
+ m_ItalicAngle = ItalicAngle;
+ }
+ FX_BOOL bExistStemV = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("StemV"))) {
+ m_StemV = pFontDesc->GetInteger(FX_BSTRC("StemV"));
+ bExistStemV = TRUE;
+ }
+ FX_BOOL bExistAscent = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("Ascent"))) {
+ m_Ascent = pFontDesc->GetInteger(FX_BSTRC("Ascent"));
+ bExistAscent = TRUE;
+ }
+ FX_BOOL bExistDescent = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("Descent"))) {
+ m_Descent = pFontDesc->GetInteger(FX_BSTRC("Descent"));
+ bExistDescent = TRUE;
+ }
+ FX_BOOL bExistCapHeight = FALSE;
+ if (pFontDesc->KeyExist(FX_BSTRC("CapHeight"))) {
+ bExistCapHeight = TRUE;
+ }
+ if (bExistItalicAngle && bExistAscent && bExistCapHeight && bExistDescent && bExistStemV) {
+ m_Flags |= PDFFONT_USEEXTERNATTR;
+ }
+ if (m_Descent > 10) {
+ m_Descent = -m_Descent;
+ }
+ CPDF_Array* pBBox = pFontDesc->GetArray(FX_BSTRC("FontBBox"));
+ if (pBBox) {
+ m_FontBBox.left = pBBox->GetInteger(0);
+ m_FontBBox.bottom = pBBox->GetInteger(1);
+ m_FontBBox.right = pBBox->GetInteger(2);
+ m_FontBBox.top = pBBox->GetInteger(3);
+ }
+ CPDF_Stream* pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile"));
+ if (pFontFile == NULL) {
+ pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile2"));
+ }
+ if (pFontFile == NULL) {
+ pFontFile = pFontDesc->GetStream(FX_BSTRC("FontFile3"));
+ }
+ if (pFontFile) {
+ m_pFontFile = m_pDocument->LoadFontFile(pFontFile);
+ if (m_pFontFile == NULL) {
+ return;
+ }
+ FX_LPCBYTE pFontData = m_pFontFile->GetData();
+ FX_DWORD dwFontSize = m_pFontFile->GetSize();
+ m_Font.LoadEmbedded(pFontData, dwFontSize);
+ if (m_Font.m_Face == NULL) {
+ m_pFontFile = NULL;
+ }
+ }
+}
+short TT2PDF(int m, FXFT_Face face)
+{
+ int upm = FXFT_Get_Face_UnitsPerEM(face);
+ if (upm == 0) {
+ return (short)m;
+ }
+ return (m * 1000 + upm / 2) / upm;
+}
+void CPDF_Font::CheckFontMetrics()
+{
+ if (m_FontBBox.top == 0 && m_FontBBox.bottom == 0 && m_FontBBox.left == 0 && m_FontBBox.right == 0) {
+ if (m_Font.m_Face) {
+ m_FontBBox.left = TT2PDF(FXFT_Get_Face_xMin(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.bottom = TT2PDF(FXFT_Get_Face_yMin(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.right = TT2PDF(FXFT_Get_Face_xMax(m_Font.m_Face), m_Font.m_Face);
+ m_FontBBox.top = TT2PDF(FXFT_Get_Face_yMax(m_Font.m_Face), m_Font.m_Face);
+ m_Ascent = TT2PDF(FXFT_Get_Face_Ascender(m_Font.m_Face), m_Font.m_Face);
+ m_Descent = TT2PDF(FXFT_Get_Face_Descender(m_Font.m_Face), m_Font.m_Face);
+ } else {
+ FX_BOOL bFirst = TRUE;
+ for (int i = 0; i < 256; i ++) {
+ FX_RECT rect;
+ GetCharBBox(i, rect);
+ if (rect.left == rect.right) {
+ continue;
+ }
+ if (bFirst) {
+ m_FontBBox = rect;
+ bFirst = FALSE;
+ } else {
+ if (m_FontBBox.top < rect.top) {
+ m_FontBBox.top = rect.top;
+ }
+ if (m_FontBBox.right < rect.right) {
+ m_FontBBox.right = rect.right;
+ }
+ if (m_FontBBox.left > rect.left) {
+ m_FontBBox.left = rect.left;
+ }
+ if (m_FontBBox.bottom > rect.bottom) {
+ m_FontBBox.bottom = rect.bottom;
+ }
+ }
+ }
+ }
+ }
+ if (m_Ascent == 0 && m_Descent == 0) {
+ FX_RECT rect;
+ GetCharBBox('A', rect);
+ if (rect.bottom == rect.top) {
+ m_Ascent = m_FontBBox.top;
+ } else {
+ m_Ascent = rect.top;
+ }
+ GetCharBBox('g', rect);
+ if (rect.bottom == rect.top) {
+ m_Descent = m_FontBBox.bottom;
+ } else {
+ m_Descent = rect.bottom;
+ }
+ }
+}
+void CPDF_Font::LoadUnicodeMap()
+{
+ m_bToUnicodeLoaded = TRUE;
+ CPDF_Stream* pStream = m_pFontDict->GetStream(FX_BSTRC("ToUnicode"));
+ if (pStream == NULL) {
+ return;
+ }
+ m_pToUnicodeMap = FX_NEW CPDF_ToUnicodeMap;
+ m_pToUnicodeMap->Load(pStream);
+}
+int CPDF_Font::GetStringWidth(FX_LPCSTR pString, int size)
+{
+ int offset = 0;
+ int width = 0;
+ while (offset < size) {
+ FX_DWORD charcode = GetNextChar(pString, offset);
+ width += GetCharWidthF(charcode);
+ }
+ return width;
+}
+int CPDF_Font::GetCharTypeWidth(FX_DWORD charcode)
+{
+ if (m_Font.m_Face == NULL) {
+ return 0;
+ }
+ int glyph_index = GlyphFromCharCode(charcode);
+ if (glyph_index == 0xffff) {
+ return 0;
+ }
+ return m_Font.GetGlyphWidth(glyph_index);
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name);
+CPDF_Font* CPDF_Font::GetStockFont(CPDF_Document* pDoc, FX_BSTR name)
+{
+ CFX_ByteString fontname(name);
+ int font_id = _PDF_GetStandardFontName(fontname);
+ if (font_id < 0) {
+ return NULL;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ CPDF_Font* pFont = pFontGlobals->Find(pDoc, font_id);
+ if (pFont) {
+ return pFont;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
+ pDict->SetAtName(FX_BSTRC("BaseFont"), fontname);
+ pDict->SetAtName(FX_BSTRC("Encoding"), FX_BSTRC("WinAnsiEncoding"));
+ pFont = CPDF_Font::CreateFontF(NULL, pDict);
+ pFontGlobals->Set(pDoc, font_id, pFont);
+ return pFont;
+}
+const FX_BYTE ChineseFontNames[][5] = {
+ {0xCB, 0xCE, 0xCC, 0xE5, 0x00},
+ {0xBF, 0xAC, 0xCC, 0xE5, 0x00},
+ {0xBA, 0xDA, 0xCC, 0xE5, 0x00},
+ {0xB7, 0xC2, 0xCB, 0xCE, 0x00},
+ {0xD0, 0xC2, 0xCB, 0xCE, 0x00}
+};
+CPDF_Font* CPDF_Font::CreateFontF(CPDF_Document* pDoc, CPDF_Dictionary* pFontDict)
+{
+ CFX_ByteString type = pFontDict->GetString(FX_BSTRC("Subtype"));
+ CPDF_Font* pFont;
+ if (type == FX_BSTRC("TrueType")) {
+ {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ || _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ CFX_ByteString basefont = pFontDict->GetString(FX_BSTRC("BaseFont"));
+ CFX_ByteString tag = basefont.Left(4);
+ int i;
+ int count = sizeof(ChineseFontNames) / sizeof(ChineseFontNames[0]);
+ for (i = 0; i < count; ++i) {
+ if (tag == CFX_ByteString((FX_LPCSTR)ChineseFontNames[i])) {
+ break;
+ }
+ }
+ if (i < count) {
+ CPDF_Dictionary* pFontDesc = pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc == NULL || !pFontDesc->KeyExist(FX_BSTRC("FontFile2"))) {
+ pFont = FX_NEW CPDF_CIDFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_CIDFONT;
+ pFont->m_pFontDict = pFontDict;
+ pFont->m_pDocument = pDoc;
+ if (!pFont->Load()) {
+ delete pFont;
+ return NULL;
+ }
+ return pFont;
+ }
+ }
+#endif
+ }
+ pFont = FX_NEW CPDF_TrueTypeFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TRUETYPE;
+ } else if (type == FX_BSTRC("Type3")) {
+ pFont = FX_NEW CPDF_Type3Font;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TYPE3;
+ } else if (type == FX_BSTRC("Type0")) {
+ pFont = FX_NEW CPDF_CIDFont;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_CIDFONT;
+ } else {
+ pFont = FX_NEW CPDF_Type1Font;
+ pFont->Initialize();
+ pFont->m_FontType = PDFFONT_TYPE1;
+ }
+ pFont->m_pFontDict = pFontDict;
+ pFont->m_pDocument = pDoc;
+ if (!pFont->Load()) {
+ delete pFont;
+ return NULL;
+ }
+ return pFont;
+}
+FX_BOOL CPDF_Font::Load()
+{
+ if (m_pFontDict == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString type = m_pFontDict->GetString(FX_BSTRC("Subtype"));
+ m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
+ if (type == FX_BSTRC("MMType1")) {
+ type = FX_BSTRC("Type1");
+ }
+ return _Load();
+}
+static CFX_WideString _FontMap_GetWideString(CFX_CharMap* pMap, const CFX_ByteString& bytestr)
+{
+ return ((CPDF_FontCharMap*)pMap)->m_pFont->DecodeString(bytestr);
+}
+static CFX_ByteString _FontMap_GetByteString(CFX_CharMap* pMap, const CFX_WideString& widestr)
+{
+ return ((CPDF_FontCharMap*)pMap)->m_pFont->EncodeString(widestr);
+}
+CPDF_FontCharMap::CPDF_FontCharMap(CPDF_Font* pFont)
+{
+ m_GetByteString = _FontMap_GetByteString;
+ m_GetWideString = _FontMap_GetWideString;
+ m_pFont = pFont;
+}
+CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode)
+{
+ FX_DWORD value;
+ if (m_Map.Lookup(charcode, value)) {
+ FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff);
+ if (unicode != 0xffff) {
+ return unicode;
+ }
+ FX_LPCWSTR buf = m_MultiCharBuf.GetBuffer();
+ FX_DWORD buf_len = m_MultiCharBuf.GetLength();
+ if (buf == NULL || buf_len == 0) {
+ return CFX_WideString();
+ }
+ FX_DWORD index = value >> 16;
+ if (index >= buf_len) {
+ return CFX_WideString();
+ }
+ FX_DWORD len = buf[index];
+ if (index + len < index || index + len >= buf_len) {
+ return CFX_WideString();
+ }
+ return CFX_WideString(buf + index + 1, len);
+ }
+ if (m_pBaseMap) {
+ return m_pBaseMap->UnicodeFromCID((FX_WORD)charcode);
+ }
+ return CFX_WideString();
+}
+FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode)
+{
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ FX_DWORD key, value;
+ m_Map.GetNextAssoc(pos, key, value);
+ if ((FX_WCHAR)value == unicode) {
+ return key;
+ }
+ }
+ return 0;
+}
+static FX_DWORD _StringToCode(FX_BSTR str)
+{
+ FX_LPCSTR buf = str.GetCStr();
+ int len = str.GetLength();
+ if (len == 0) {
+ return 0;
+ }
+ int result = 0;
+ if (buf[0] == '<') {
+ for (int i = 1; i < len; i ++) {
+ int digit;
+ if (buf[i] >= '0' && buf[i] <= '9') {
+ digit = buf[i] - '0';
+ } else if (buf[i] >= 'a' && buf[i] <= 'f') {
+ digit = buf[i] - 'a' + 10;
+ } else if (buf[i] >= 'A' && buf[i] <= 'F') {
+ digit = buf[i] - 'A' + 10;
+ } else {
+ break;
+ }
+ result = result * 16 + digit;
+ }
+ return result;
+ } else {
+ for (int i = 0; i < len; i ++) {
+ if (buf[i] < '0' || buf[i] > '9') {
+ break;
+ }
+ result = result * 10 + buf[i] - '0';
+ }
+ }
+ return result;
+}
+static CFX_WideString _StringDataAdd(CFX_WideString str)
+{
+ CFX_WideString ret;
+ int len = str.GetLength();
+ FX_WCHAR value = 1;
+ for (int i = len - 1; i >= 0 ; --i) {
+ FX_WCHAR ch = str[i] + value;
+ if (ch < str[i]) {
+ ret.Insert(0, 0);
+ } else {
+ ret.Insert(0, ch);
+ value = 0;
+ }
+ }
+ if (value) {
+ ret.Insert(0, value);
+ }
+ return ret;
+}
+static CFX_WideString _StringToWideString(FX_BSTR str)
+{
+ FX_LPCSTR buf = str.GetCStr();
+ int len = str.GetLength();
+ if (len == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString result;
+ if (buf[0] == '<') {
+ int byte_pos = 0;
+ FX_WCHAR ch = 0;
+ for (int i = 1; i < len; i ++) {
+ int digit;
+ if (buf[i] >= '0' && buf[i] <= '9') {
+ digit = buf[i] - '0';
+ } else if (buf[i] >= 'a' && buf[i] <= 'f') {
+ digit = buf[i] - 'a' + 10;
+ } else if (buf[i] >= 'A' && buf[i] <= 'F') {
+ digit = buf[i] - 'A' + 10;
+ } else {
+ break;
+ }
+ ch = ch * 16 + digit;
+ byte_pos ++;
+ if (byte_pos == 4) {
+ result += ch;
+ byte_pos = 0;
+ ch = 0;
+ }
+ }
+ return result;
+ }
+ if (buf[0] == '(') {
+ }
+ return result;
+}
+void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream)
+{
+ int CIDSet = 0;
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pStream, FALSE);
+ CPDF_SimpleParser parser(stream.GetData(), stream.GetSize());
+ m_Map.EstimateSize(stream.GetSize() / 8, 1024);
+ while (1) {
+ CFX_ByteStringC word = parser.GetWord();
+ if (word.IsEmpty()) {
+ break;
+ }
+ if (word == FX_BSTRC("beginbfchar")) {
+ while (1) {
+ word = parser.GetWord();
+ if (word.IsEmpty() || word == FX_BSTRC("endbfchar")) {
+ break;
+ }
+ FX_DWORD srccode = _StringToCode(word);
+ word = parser.GetWord();
+ CFX_WideString destcode = _StringToWideString(word);
+ int len = destcode.GetLength();
+ if (len == 0) {
+ continue;
+ }
+ if (len == 1) {
+ m_Map.SetAt(srccode, destcode.GetAt(0));
+ } else {
+ m_Map.SetAt(srccode, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(destcode.GetLength());
+ m_MultiCharBuf << destcode;
+ }
+ }
+ } else if (word == FX_BSTRC("beginbfrange")) {
+ while (1) {
+ CFX_ByteString low, high;
+ low = parser.GetWord();
+ if (low.IsEmpty() || low == FX_BSTRC("endbfrange")) {
+ break;
+ }
+ high = parser.GetWord();
+ FX_DWORD lowcode = _StringToCode(low);
+ FX_DWORD highcode = (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);
+ if (highcode == (FX_DWORD) - 1) {
+ break;
+ }
+ CFX_ByteString start = parser.GetWord();
+ if (start == FX_BSTRC("[")) {
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ CFX_ByteString dest = parser.GetWord();
+ CFX_WideString destcode = _StringToWideString(dest);
+ int len = destcode.GetLength();
+ if (len == 0) {
+ continue;
+ }
+ if (len == 1) {
+ m_Map.SetAt(code, destcode.GetAt(0));
+ } else {
+ m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(destcode.GetLength());
+ m_MultiCharBuf << destcode;
+ }
+ }
+ parser.GetWord();
+ } else {
+ CFX_WideString destcode = _StringToWideString(start);
+ int len = destcode.GetLength();
+ FX_DWORD value = 0;
+ if (len == 1) {
+ value = _StringToCode(start);
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ m_Map.SetAt(code, value++);
+ }
+ } else {
+ for (FX_DWORD code = lowcode; code <= highcode; code ++) {
+ CFX_WideString retcode;
+ if (code == lowcode) {
+ retcode = destcode;
+ } else {
+ retcode = _StringDataAdd(destcode);
+ }
+ m_Map.SetAt(code, m_MultiCharBuf.GetLength() * 0x10000 + 0xffff);
+ m_MultiCharBuf.AppendChar(retcode.GetLength());
+ m_MultiCharBuf << retcode;
+ destcode = retcode;
+ }
+ }
+ }
+ }
+ } else if (word == FX_BSTRC("/Adobe-Korea1-UCS2")) {
+ CIDSet = CIDSET_KOREA1;
+ } else if (word == FX_BSTRC("/Adobe-Japan1-UCS2")) {
+ CIDSet = CIDSET_JAPAN1;
+ } else if (word == FX_BSTRC("/Adobe-CNS1-UCS2")) {
+ CIDSet = CIDSET_CNS1;
+ } else if (word == FX_BSTRC("/Adobe-GB1-UCS2")) {
+ CIDSet = CIDSET_GB1;
+ }
+ }
+ if (CIDSet) {
+ m_pBaseMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(CIDSet, FALSE);
+ } else {
+ m_pBaseMap = NULL;
+ }
+}
+static FX_BOOL GetPredefinedEncoding(int& basemap, const CFX_ByteString& value)
+{
+ if (value == FX_BSTRC("WinAnsiEncoding")) {
+ basemap = PDFFONT_ENCODING_WINANSI;
+ } else if (value == FX_BSTRC("MacRomanEncoding")) {
+ basemap = PDFFONT_ENCODING_MACROMAN;
+ } else if (value == FX_BSTRC("MacExpertEncoding")) {
+ basemap = PDFFONT_ENCODING_MACEXPERT;
+ } else if (value == FX_BSTRC("PDFDocEncoding")) {
+ basemap = PDFFONT_ENCODING_PDFDOC;
+ } else {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CPDF_Font::LoadPDFEncoding(CPDF_Object* pEncoding, int& iBaseEncoding, CFX_ByteString*& pCharNames,
+ FX_BOOL bEmbedded, FX_BOOL bTrueType)
+{
+ if (pEncoding == NULL) {
+ if (m_BaseFont == FX_BSTRC("Symbol")) {
+ iBaseEncoding = bTrueType ? PDFFONT_ENCODING_MS_SYMBOL : PDFFONT_ENCODING_ADOBE_SYMBOL;
+ } else if (!bEmbedded && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
+ iBaseEncoding = PDFFONT_ENCODING_WINANSI;
+ }
+ return;
+ }
+ if (pEncoding->GetType() == PDFOBJ_NAME) {
+ if (iBaseEncoding == PDFFONT_ENCODING_ADOBE_SYMBOL || iBaseEncoding == PDFFONT_ENCODING_ZAPFDINGBATS) {
+ return;
+ }
+ if ((m_Flags & PDFFONT_SYMBOLIC) && m_BaseFont == FX_BSTRC("Symbol")) {
+ if (!bTrueType) {
+ iBaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
+ }
+ return;
+ }
+ CFX_ByteString bsEncoding = pEncoding->GetString();
+ if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0) {
+ bsEncoding = FX_BSTRC("WinAnsiEncoding");
+ }
+ GetPredefinedEncoding(iBaseEncoding, bsEncoding);
+ return;
+ }
+ if (pEncoding->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pEncoding;
+ if (iBaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL && iBaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS) {
+ CFX_ByteString bsEncoding = pDict->GetString(FX_BSTRC("BaseEncoding"));
+ if (bsEncoding.Compare(FX_BSTRC("MacExpertEncoding")) == 0 && bTrueType) {
+ bsEncoding = FX_BSTRC("WinAnsiEncoding");
+ }
+ GetPredefinedEncoding(iBaseEncoding, bsEncoding);
+ }
+ if ((!bEmbedded || bTrueType) && iBaseEncoding == PDFFONT_ENCODING_BUILTIN) {
+ iBaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ CPDF_Array* pDiffs = pDict->GetArray(FX_BSTRC("Differences"));
+ if (pDiffs == NULL) {
+ return;
+ }
+ FX_NEW_VECTOR(pCharNames, CFX_ByteString, 256);
+ FX_DWORD cur_code = 0;
+ for (FX_DWORD i = 0; i < pDiffs->GetCount(); i ++) {
+ CPDF_Object* pElement = pDiffs->GetElementValue(i);
+ if (pElement == NULL) {
+ continue;
+ }
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ if (cur_code < 256) {
+ pCharNames[cur_code] = ((CPDF_Name*)pElement)->GetString();
+ }
+ cur_code ++;
+ } else {
+ cur_code = pElement->GetInteger();
+ }
+ }
+}
+FX_BOOL CPDF_Font::IsStandardFont() const
+{
+ if (m_FontType != PDFFONT_TYPE1) {
+ return FALSE;
+ }
+ if (m_pFontFile != NULL) {
+ return FALSE;
+ }
+ if (((CPDF_Type1Font*)this)->GetBase14Font() < 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+extern FX_LPCSTR PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode);
+CPDF_SimpleFont::CPDF_SimpleFont()
+{
+ FXSYS_memset8(m_CharBBox, 0xff, sizeof m_CharBBox);
+ FXSYS_memset8(m_CharWidth, 0xff, sizeof m_CharWidth);
+ FXSYS_memset8(m_GlyphIndex, 0xff, sizeof m_GlyphIndex);
+ FXSYS_memset8(m_ExtGID, 0xff, sizeof m_ExtGID);
+ m_pCharNames = NULL;
+ m_BaseEncoding = PDFFONT_ENCODING_BUILTIN;
+}
+CPDF_SimpleFont::~CPDF_SimpleFont()
+{
+ if (m_pCharNames) {
+ FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
+ }
+}
+int CPDF_SimpleFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ if (charcode > 0xff) {
+ return -1;
+ }
+ int index = m_GlyphIndex[(FX_BYTE)charcode];
+ if (index == 0xffff) {
+ return -1;
+ }
+ return index;
+}
+void CPDF_SimpleFont::LoadCharMetrics(int charcode)
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+ if (charcode < 0 || charcode > 0xff) {
+ return;
+ }
+ int glyph_index = m_GlyphIndex[charcode];
+ if (glyph_index == 0xffff) {
+ if (m_pFontFile == NULL && charcode != 32) {
+ LoadCharMetrics(32);
+ m_CharBBox[charcode] = m_CharBBox[32];
+ if (m_bUseFontWidth) {
+ m_CharWidth[charcode] = m_CharWidth[32];
+ }
+ }
+ return;
+ }
+ int err = FXFT_Load_Glyph(m_Font.m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ return;
+ }
+ m_CharBBox[charcode].Left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(m_Font.m_Face) + FXFT_Get_Glyph_Width(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face), m_Font.m_Face);
+ m_CharBBox[charcode].Bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(m_Font.m_Face) - FXFT_Get_Glyph_Height(m_Font.m_Face), m_Font.m_Face);
+ if (m_bUseFontWidth) {
+ int TT_Width = TT2PDF(FXFT_Get_Glyph_HoriAdvance(m_Font.m_Face), m_Font.m_Face);
+ if (m_CharWidth[charcode] == 0xffff) {
+ m_CharWidth[charcode] = TT_Width;
+ } else if (TT_Width && !IsEmbedded()) {
+ m_CharBBox[charcode].Right = m_CharBBox[charcode].Right * m_CharWidth[charcode] / TT_Width;
+ m_CharBBox[charcode].Left = m_CharBBox[charcode].Left * m_CharWidth[charcode] / TT_Width;
+ }
+ }
+}
+int CPDF_SimpleFont::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharWidth[charcode] == 0xffff) {
+ LoadCharMetrics(charcode);
+ if (m_CharWidth[charcode] == 0xffff) {
+ m_CharWidth[charcode] = 0;
+ }
+ }
+ return (FX_INT16)m_CharWidth[charcode];
+}
+void CPDF_SimpleFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharBBox[charcode].Left == (FX_SHORT)0xffff) {
+ LoadCharMetrics(charcode);
+ }
+ rect.left = m_CharBBox[charcode].Left;
+ rect.right = m_CharBBox[charcode].Right;
+ rect.bottom = m_CharBBox[charcode].Bottom;
+ rect.top = m_CharBBox[charcode].Top;
+}
+FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode)
+{
+ ASSERT(charcode >= 0 && charcode < 256);
+ if (charcode < 0 || charcode >= 256) {
+ return NULL;
+ }
+ FX_LPCSTR name = NULL;
+ if (pCharNames) {
+ name = pCharNames[charcode];
+ }
+ if ((name == NULL || name[0] == 0) && iBaseEncoding) {
+ name = PDF_CharNameFromPredefinedCharSet(iBaseEncoding, charcode);
+ }
+ if (name == NULL || name[0] == 0) {
+ return NULL;
+ }
+ return name;
+}
+FX_BOOL CPDF_SimpleFont::LoadCommon()
+{
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
+ int width_start = 0, width_end = -1;
+ m_bUseFontWidth = TRUE;
+ if (pWidthArray) {
+ m_bUseFontWidth = FALSE;
+ if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("MissingWidth"))) {
+ int MissingWidth = pFontDesc->GetInteger(FX_BSTRC("MissingWidth"));
+ for (int i = 0; i < 256; i ++) {
+ m_CharWidth[i] = MissingWidth;
+ }
+ }
+ width_start = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"), 0);
+ width_end = m_pFontDict->GetInteger(FX_BSTRC("LastChar"), 0);
+ if (width_start >= 0 && width_start <= 255) {
+ if (width_end <= 0 || width_end >= width_start + (int)pWidthArray->GetCount()) {
+ width_end = width_start + pWidthArray->GetCount() - 1;
+ }
+ if (width_end > 255) {
+ width_end = 255;
+ }
+ for (int i = width_start; i <= width_end; i ++) {
+ m_CharWidth[i] = pWidthArray->GetInteger(i - width_start);
+ }
+ }
+ }
+ if (m_pFontFile == NULL) {
+ LoadSubstFont();
+ } else {
+ if (m_BaseFont.GetLength() > 8 && m_BaseFont[7] == '+') {
+ m_BaseFont = m_BaseFont.Mid(8);
+ }
+ }
+ if (!(m_Flags & PDFFONT_SYMBOLIC)) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, m_pFontFile != NULL, m_Font.IsTTFont());
+ LoadGlyphMap();
+ if (m_pCharNames) {
+ FX_DELETE_VECTOR(m_pCharNames, CFX_ByteString, 256);
+ m_pCharNames = NULL;
+ }
+ if (m_Font.m_Face == NULL) {
+ return TRUE;
+ }
+ if (m_Flags & PDFFONT_ALLCAP) {
+ unsigned char lowercases[] = {'a', 'z', 0xe0, 0xf6, 0xf8, 0xfd};
+ for (int range = 0; range < sizeof lowercases / 2; range ++) {
+ for (int i = lowercases[range * 2]; i <= lowercases[range * 2 + 1]; i ++) {
+ if (m_GlyphIndex[i] != 0xffff && m_pFontFile != NULL) {
+ continue;
+ }
+ m_GlyphIndex[i] = m_GlyphIndex[i - 32];
+ if (m_CharWidth[i - 32]) {
+ m_CharWidth[i] = m_CharWidth[i - 32];
+ m_CharBBox[i] = m_CharBBox[i - 32];
+ }
+ }
+ }
+ }
+ CheckFontMetrics();
+ return TRUE;
+}
+void CPDF_SimpleFont::LoadSubstFont()
+{
+ if (!m_bUseFontWidth && !(m_Flags & PDFFONT_FIXEDPITCH)) {
+ int width = 0, i;
+ for (i = 0; i < 256; i ++) {
+ if (m_CharWidth[i] == 0 || m_CharWidth[i] == 0xffff) {
+ continue;
+ }
+ if (width == 0) {
+ width = m_CharWidth[i];
+ } else if (width != m_CharWidth[i]) {
+ break;
+ }
+ }
+ if (i == 256 && width) {
+ m_Flags |= PDFFONT_FIXEDPITCH;
+ }
+ }
+ int weight = m_StemV < 140 ? m_StemV * 5 : (m_StemV * 4 + 140);
+ m_Font.LoadSubst(m_BaseFont, m_FontType == PDFFONT_TRUETYPE, m_Flags, weight, m_ItalicAngle, 0);
+ if (m_Font.m_pSubstFont->m_SubstFlags & FXFONT_SUBST_NONSYMBOL) {
+ }
+}
+FX_BOOL CPDF_SimpleFont::IsUnicodeCompatible() const
+{
+ return m_BaseEncoding != PDFFONT_ENCODING_BUILTIN && m_BaseEncoding != PDFFONT_ENCODING_ADOBE_SYMBOL &&
+ m_BaseEncoding != PDFFONT_ENCODING_ZAPFDINGBATS;
+}
+CPDF_Type1Font::CPDF_Type1Font()
+{
+ m_Base14Font = -1;
+}
+FX_BOOL CPDF_Type1Font::_Load()
+{
+ m_Base14Font = _PDF_GetStandardFontName(m_BaseFont);
+ if (m_Base14Font >= 0) {
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc && pFontDesc->KeyExist(FX_BSTRC("Flags"))) {
+ m_Flags = pFontDesc->GetInteger(FX_BSTRC("Flags"));
+ } else {
+ m_Flags = m_Base14Font >= 12 ? PDFFONT_SYMBOLIC : PDFFONT_NONSYMBOLIC;
+ }
+ if (m_Base14Font < 4)
+ for (int i = 0; i < 256; i ++) {
+ m_CharWidth[i] = 600;
+ }
+ if (m_Base14Font == 12) {
+ m_BaseEncoding = PDFFONT_ENCODING_ADOBE_SYMBOL;
+ } else if (m_Base14Font == 13) {
+ m_BaseEncoding = PDFFONT_ENCODING_ZAPFDINGBATS;
+ } else if (m_Flags & PDFFONT_NONSYMBOLIC) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ }
+ return LoadCommon();
+}
+static FX_BOOL FT_UseType1Charmap(FXFT_Face face)
+{
+ if (FXFT_Get_Face_CharmapCount(face) == 0) {
+ return FALSE;
+ }
+ if (FXFT_Get_Face_CharmapCount(face) == 1 &&
+ FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
+ return FALSE;
+ }
+ if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[0]) == FXFT_ENCODING_UNICODE) {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[1]);
+ } else {
+ FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]);
+ }
+ return TRUE;
+}
+extern FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "../../fxge/apple/apple_int.h"
+#endif
+int CPDF_Type1Font::GlyphFromCharCodeExt(FX_DWORD charcode)
+{
+ if (charcode > 0xff) {
+ return -1;
+ }
+ int index = m_ExtGID[(FX_BYTE)charcode];
+ if (index == 0xffff) {
+ return -1;
+ }
+ return index;
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+struct _GlyphNameMap {
+ FX_LPCSTR m_pStrAdobe;
+ FX_LPCSTR m_pStrUnicode;
+};
+static const _GlyphNameMap g_GlyphNameSubsts[] = {
+ {"ff", "uniFB00"},
+ {"fi", "uniFB01"},
+ {"fl", "uniFB02"},
+ {"ffi", "uniFB03"},
+ {"ffl", "uniFB04"}
+};
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_GlyphNameMap*)element)->m_pStrAdobe);
+ }
+}
+static FX_LPCSTR _GlyphNameRemap(FX_LPCSTR pStrAdobe)
+{
+ _GlyphNameMap* found = (_GlyphNameMap*)FXSYS_bsearch(pStrAdobe, g_GlyphNameSubsts,
+ sizeof g_GlyphNameSubsts / sizeof(_GlyphNameMap), sizeof(_GlyphNameMap),
+ compareString);
+ if (found) {
+ return found->m_pStrUnicode;
+ }
+ return NULL;
+}
+#endif
+void CPDF_Type1Font::LoadGlyphMap()
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_BOOL bCoreText = TRUE;
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!m_Font.m_pPlatformFont) {
+ if (m_Font.GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ bCoreText = FALSE;
+ }
+ m_Font.m_pPlatformFont = quartz2d.CreateFont(m_Font.m_pFontData, m_Font.m_dwSize);
+ if (NULL == m_Font.m_pPlatformFont) {
+ bCoreText = FALSE;
+ }
+ }
+#endif
+ if (!IsEmbedded() && (m_Base14Font < 12) && m_Font.IsTTFont()) {
+ if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ break;
+ }
+ }
+ }
+ if (bGotOne) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ }
+ FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+ if (m_BaseEncoding == 0) {
+ m_BaseEncoding = PDFFONT_ENCODING_STANDARD;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ if (m_GlyphIndex[charcode] == 0 && FXSYS_strcmp(name, ".notdef") == 0) {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 0x20);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+#endif
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ FT_UseType1Charmap(m_Font.m_Face);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (bCoreText) {
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ FX_WCHAR unicode = 0;
+ if (m_GlyphIndex[charcode]) {
+ unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
+ }
+ FX_CHAR name_glyph[256];
+ FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ if (unicode == 0 && name_glyph[0] != 0) {
+ unicode = PDF_UnicodeFromAdobeName(name_glyph);
+ }
+ m_Encoding.m_Unicodes[charcode] = unicode;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ }
+ }
+ return;
+ }
+ FX_BOOL bUnicode = FALSE;
+ if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+ bUnicode = TRUE;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ FX_LPCSTR pStrUnicode = _GlyphNameRemap(name);
+ if (pStrUnicode && 0 == FXFT_Get_Name_Index(m_Font.m_Face, (char*)name)) {
+ name = pStrUnicode;
+ }
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ if (m_GlyphIndex[charcode] == 0) {
+ if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ } else {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = bUnicode ? FXFT_Get_Char_Index(m_Font.m_Face, 0x20) : 0xffff;
+ FX_CHAR name_glyph[256];
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ CFStringRef name_ct = CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, name_glyph, kCFStringEncodingASCII, kCFAllocatorNull);
+ m_ExtGID[charcode] = CGFontGetGlyphWithGlyphName((CGFontRef)m_Font.m_pPlatformFont, name_ct);
+ if (name_ct) {
+ CFRelease(name_ct);
+ }
+ }
+ }
+ }
+ return;
+ }
+#endif
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ if (m_GlyphIndex[charcode]) {
+ FX_WCHAR unicode = FT_UnicodeFromCharCode(PDFFONT_ENCODING_STANDARD, charcode);
+ if (unicode == 0) {
+ FX_CHAR name_glyph[256];
+ FXSYS_memset32(name_glyph, 0, sizeof(name_glyph));
+ FXFT_Get_Glyph_Name(m_Font.m_Face, m_GlyphIndex[charcode], name_glyph, 256);
+ name_glyph[255] = 0;
+ if (name_glyph[0] != 0) {
+ unicode = PDF_UnicodeFromAdobeName(name_glyph);
+ }
+ }
+ m_Encoding.m_Unicodes[charcode] = unicode;
+ }
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+ return;
+ }
+ FX_BOOL bUnicode = FALSE;
+ if (0 == FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE)) {
+ bUnicode = TRUE;
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ if (m_GlyphIndex[charcode] == 0) {
+ if (FXSYS_strcmp(name, ".notdef") != 0 && FXSYS_strcmp(name, "space") != 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, bUnicode ? m_Encoding.m_Unicodes[charcode] : charcode);
+ } else {
+ m_Encoding.m_Unicodes[charcode] = 0x20;
+ m_GlyphIndex[charcode] = 0xffff;
+ }
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bCoreText) {
+ FXSYS_memcpy32(m_ExtGID, m_GlyphIndex, 256);
+ }
+#endif
+}
+CPDF_FontEncoding::CPDF_FontEncoding()
+{
+ FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
+}
+int CPDF_FontEncoding::CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ for (int i = 0; i < 256; i ++)
+ if (m_Unicodes[i] == unicode) {
+ return i;
+ }
+ return -1;
+}
+CPDF_FontEncoding::CPDF_FontEncoding(int PredefinedEncoding)
+{
+ const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(PredefinedEncoding);
+ if (!pSrc) {
+ FXSYS_memset32(m_Unicodes, 0, sizeof(m_Unicodes));
+ } else
+ for (int i = 0; i < 256; i++) {
+ m_Unicodes[i] = pSrc[i];
+ }
+}
+FX_BOOL CPDF_FontEncoding::IsIdentical(CPDF_FontEncoding* pAnother) const
+{
+ return FXSYS_memcmp32(m_Unicodes, pAnother->m_Unicodes, sizeof(m_Unicodes)) == 0;
+}
+CPDF_Object* CPDF_FontEncoding::Realize()
+{
+ int predefined = 0;
+ for (int cs = PDFFONT_ENCODING_WINANSI; cs < PDFFONT_ENCODING_ZAPFDINGBATS; cs ++) {
+ const FX_WORD* pSrc = PDF_UnicodesForPredefinedCharSet(cs);
+ FX_BOOL match = TRUE;
+ for (int i = 0; i < 256; ++i) {
+ if (m_Unicodes[i] != pSrc[i]) {
+ match = FALSE;
+ break;
+ }
+ }
+ if (match) {
+ predefined = cs;
+ break;
+ }
+ }
+ if (predefined) {
+ if (predefined == PDFFONT_ENCODING_WINANSI) {
+ return CPDF_Name::Create("WinAnsiEncoding");
+ }
+ if (predefined == PDFFONT_ENCODING_MACROMAN) {
+ return CPDF_Name::Create("MacRomanEncoding");
+ }
+ if (predefined == PDFFONT_ENCODING_MACEXPERT) {
+ return CPDF_Name::Create("MacExpertEncoding");
+ }
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ pDict->SetAtName(FX_BSTRC("BaseEncoding"), FX_BSTRC("WinAnsiEncoding"));
+ const FX_WORD* pStandard = PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);
+ CPDF_Array* pDiff = CPDF_Array::Create();
+ for (int i = 0; i < 256; i ++) {
+ if (pStandard[i] == m_Unicodes[i]) {
+ continue;
+ }
+ pDiff->Add(CPDF_Number::Create(i));
+ pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
+ }
+ pDict->SetAt(FX_BSTRC("Differences"), pDiff);
+ return pDict;
+}
+CPDF_TrueTypeFont::CPDF_TrueTypeFont()
+{
+}
+FX_BOOL CPDF_TrueTypeFont::_Load()
+{
+ return LoadCommon();
+}
+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
+void CPDF_TrueTypeFont::LoadGlyphMap()
+{
+ if (m_Font.m_Face == NULL) {
+ return;
+ }
+ int baseEncoding = m_BaseEncoding;
+ if (m_pFontFile && m_Font.m_Face->num_charmaps > 0
+ && (baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
+ && (m_Flags & PDFFONT_SYMBOLIC)) {
+ FX_BOOL bSupportWin = FALSE;
+ FX_BOOL bSupportMac = FALSE;
+ for (int i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) {
+ int platform_id = FXFT_Get_Charmap_PlatformID(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+ if (platform_id == 0 || platform_id == 3) {
+ bSupportWin = TRUE;
+ } else if (platform_id == 0 || platform_id == 1) {
+ bSupportMac = TRUE;
+ }
+ }
+ if (baseEncoding == PDFFONT_ENCODING_WINANSI && !bSupportWin) {
+ baseEncoding = bSupportMac ? PDFFONT_ENCODING_MACROMAN : PDFFONT_ENCODING_BUILTIN;
+ } else if (baseEncoding == PDFFONT_ENCODING_MACROMAN && !bSupportMac) {
+ baseEncoding = bSupportWin ? PDFFONT_ENCODING_WINANSI : PDFFONT_ENCODING_BUILTIN;
+ }
+ }
+ if (((baseEncoding == PDFFONT_ENCODING_MACROMAN || baseEncoding == PDFFONT_ENCODING_WINANSI)
+ && m_pCharNames == NULL) || (m_Flags & PDFFONT_NONSYMBOLIC)) {
+ if (!FXFT_Has_Glyph_Names(m_Font.m_Face) && (!m_Font.m_Face->num_charmaps || !m_Font.m_Face->charmaps)) {
+ int nStartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
+ int charcode = 0;
+ for (; charcode < nStartChar; charcode ++) {
+ m_GlyphIndex[charcode] = 0;
+ }
+ FX_WORD nGlyph = charcode - nStartChar + 3;
+ for (; charcode < 256; charcode ++, nGlyph ++) {
+ m_GlyphIndex[charcode] = nGlyph;
+ }
+ return;
+ }
+ FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+ FX_BOOL bMacRoman = FALSE, bMSSymbol = FALSE;
+ if (!bMSUnicode) {
+ if (m_Flags & PDFFONT_NONSYMBOLIC) {
+ bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ bMSSymbol = !bMacRoman && FT_UseTTCharmap(m_Font.m_Face, 3, 0);
+ } else {
+ bMSSymbol = FT_UseTTCharmap(m_Font.m_Face, 3, 0);
+ bMacRoman = !bMSSymbol && FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ }
+ }
+ FX_BOOL bToUnicode = m_pFontDict->KeyExist(FX_BSTRC("ToUnicode"));
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ m_GlyphIndex[charcode] = m_pFontFile ? FXFT_Get_Char_Index(m_Font.m_Face, charcode) : -1;
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ if (bMSSymbol) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ if (m_GlyphIndex[charcode]) {
+ break;
+ }
+ }
+ } else if (m_Encoding.m_Unicodes[charcode]) {
+ if (bMSUnicode) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+ } else if (bMacRoman) {
+ FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, m_Encoding.m_Unicodes[charcode]);
+ if (!maccode) {
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char *)name);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+ }
+ }
+ }
+ if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && name != NULL) {
+ if (name[0] == '.' && FXSYS_strcmp(name, ".notdef") == 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, 32);
+ } else {
+ m_GlyphIndex[charcode] = FXFT_Get_Name_Index(m_Font.m_Face, (char*)name);
+ if (m_GlyphIndex[charcode] == 0) {
+ if (bToUnicode) {
+ CFX_WideString wsUnicode = UnicodeFromCharCode(charcode);
+ if (!wsUnicode.IsEmpty()) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, wsUnicode[0]);
+ m_Encoding.m_Unicodes[charcode] = wsUnicode[0];
+ }
+ }
+ if (m_GlyphIndex[charcode] == 0) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ }
+ }
+ }
+ }
+ }
+ return;
+ }
+ if (FT_UseTTCharmap(m_Font.m_Face, 3, 0)) {
+ const FX_BYTE prefix[4] = {0x00, 0xf0, 0xf1, 0xf2};
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ for (int j = 0; j < 4; j ++) {
+ FX_WORD unicode = prefix[j] * 256 + charcode;
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ break;
+ }
+ }
+ }
+ if (bGotOne) {
+ if (baseEncoding != PDFFONT_ENCODING_BUILTIN) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ FX_LPCSTR name = GetAdobeCharName(baseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ continue;
+ }
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ }
+ } else if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
+ }
+ }
+ return;
+ }
+ }
+ if (FT_UseTTCharmap(m_Font.m_Face, 1, 0)) {
+ FX_BOOL bGotOne = FALSE;
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, charcode);
+ m_Encoding.m_Unicodes[charcode] = FT_UnicodeFromCharCode(FXFT_ENCODING_APPLE_ROMAN, charcode);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ }
+ }
+ if (m_pFontFile || bGotOne) {
+ return;
+ }
+ }
+ if (FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE) == 0) {
+ FX_BOOL bGotOne = FALSE;
+ const FX_WORD* pUnicodes = PDF_UnicodesForPredefinedCharSet(baseEncoding);
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ if (m_pFontFile == NULL) {
+ FX_LPCSTR name = GetAdobeCharName(0, m_pCharNames, charcode);
+ if (name != NULL) {
+ m_Encoding.m_Unicodes[charcode] = PDF_UnicodeFromAdobeName(name);
+ } else if (pUnicodes) {
+ m_Encoding.m_Unicodes[charcode] = pUnicodes[charcode];
+ }
+ } else {
+ m_Encoding.m_Unicodes[charcode] = charcode;
+ }
+ m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.m_Face, m_Encoding.m_Unicodes[charcode]);
+ if (m_GlyphIndex[charcode]) {
+ bGotOne = TRUE;
+ }
+ }
+ if (bGotOne) {
+ return;
+ }
+ }
+ for (int charcode = 0; charcode < 256; charcode ++) {
+ m_GlyphIndex[charcode] = charcode;
+ }
+}
+CPDF_Type3Font::CPDF_Type3Font()
+{
+ m_pPageResources = NULL;
+ FXSYS_memset32(m_CharWidthL, 0, sizeof m_CharWidthL);
+}
+CPDF_Type3Font::~CPDF_Type3Font()
+{
+ FX_POSITION pos = m_CacheMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_CacheMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_Type3Char*)value;
+ }
+ m_CacheMap.RemoveAll();
+ pos = m_DeletedMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_DeletedMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_Type3Char*)key;
+ }
+}
+FX_BOOL CPDF_Type3Font::_Load()
+{
+ m_pFontResources = m_pFontDict->GetDict(FX_BSTRC("Resources"));
+ CPDF_Array* pMatrix = m_pFontDict->GetArray(FX_BSTRC("FontMatrix"));
+ FX_FLOAT xscale = 1.0f, yscale = 1.0f;
+ if (pMatrix) {
+ m_FontMatrix = pMatrix->GetMatrix();
+ xscale = m_FontMatrix.a;
+ yscale = m_FontMatrix.d;
+ }
+ CPDF_Array* pBBox = m_pFontDict->GetArray(FX_BSTRC("FontBBox"));
+ if (pBBox) {
+ m_FontBBox.left = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(0), xscale) * 1000);
+ m_FontBBox.bottom = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(1), yscale) * 1000);
+ m_FontBBox.right = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(2), xscale) * 1000);
+ m_FontBBox.top = (FX_INT32)(FXSYS_Mul(pBBox->GetNumber(3), yscale) * 1000);
+ }
+ int StartChar = m_pFontDict->GetInteger(FX_BSTRC("FirstChar"));
+ CPDF_Array* pWidthArray = m_pFontDict->GetArray(FX_BSTRC("Widths"));
+ if (pWidthArray && (StartChar >= 0 && StartChar < 256)) {
+ FX_DWORD count = pWidthArray->GetCount();
+ if (count > 256) {
+ count = 256;
+ }
+ if (StartChar + count > 256) {
+ count = 256 - StartChar;
+ }
+ for (FX_DWORD i = 0; i < count; i ++) {
+ m_CharWidthL[StartChar + i] = FXSYS_round(FXSYS_Mul(pWidthArray->GetNumber(i), xscale) * 1000);
+ }
+ }
+ m_pCharProcs = m_pFontDict->GetDict(FX_BSTRC("CharProcs"));
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ if (pEncoding) {
+ LoadPDFEncoding(pEncoding, m_BaseEncoding, m_pCharNames, FALSE, FALSE);
+ if (m_pCharNames) {
+ for (int i = 0; i < 256; i ++) {
+ m_Encoding.m_Unicodes[i] = PDF_UnicodeFromAdobeName(m_pCharNames[i]);
+ if (m_Encoding.m_Unicodes[i] == 0) {
+ m_Encoding.m_Unicodes[i] = i;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+void CPDF_Type3Font::CheckType3FontMetrics()
+{
+ CheckFontMetrics();
+}
+CPDF_Type3Char* CPDF_Type3Font::LoadChar(FX_DWORD charcode, int level)
+{
+ if (level >= _FPDF_MAX_TYPE3_FORM_LEVEL_) {
+ return NULL;
+ }
+ CPDF_Type3Char* pChar = NULL;
+ if (m_CacheMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (FX_LPVOID&)pChar)) {
+ if (pChar->m_bPageRequired && m_pPageResources) {
+ delete pChar;
+ m_CacheMap.RemoveKey((FX_LPVOID)(FX_UINTPTR)charcode);
+ return LoadChar(charcode, level + 1);
+ }
+ return pChar;
+ }
+ FX_LPCSTR name = GetAdobeCharName(m_BaseEncoding, m_pCharNames, charcode);
+ if (name == NULL) {
+ return NULL;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)m_pCharProcs->GetElementValue(name);
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ pChar = FX_NEW CPDF_Type3Char;
+ pChar->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pFontResources ? m_pFontResources : m_pPageResources, pStream, NULL);
+ pChar->m_pForm->ParseContent(NULL, NULL, pChar, NULL, level + 1);
+ FX_FLOAT scale = m_FontMatrix.GetXUnit();
+ pChar->m_Width = (FX_INT32)(pChar->m_Width * scale + 0.5f);
+ FX_RECT &rcBBox = pChar->m_BBox;
+ CFX_FloatRect char_rect((FX_FLOAT)rcBBox.left / 1000.0f, (FX_FLOAT)rcBBox.bottom / 1000.0f,
+ (FX_FLOAT)rcBBox.right / 1000.0f, (FX_FLOAT)rcBBox.top / 1000.0f);
+ if (rcBBox.right <= rcBBox.left || rcBBox.bottom >= rcBBox.top) {
+ char_rect = pChar->m_pForm->CalcBoundingBox();
+ }
+ char_rect.Transform(&m_FontMatrix);
+ rcBBox.left = FXSYS_round(char_rect.left * 1000);
+ rcBBox.right = FXSYS_round(char_rect.right * 1000);
+ rcBBox.top = FXSYS_round(char_rect.top * 1000);
+ rcBBox.bottom = FXSYS_round(char_rect.bottom * 1000);
+ m_CacheMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pChar);
+ if (pChar->m_pForm->CountObjects() == 0) {
+ delete pChar->m_pForm;
+ pChar->m_pForm = NULL;
+ }
+ return pChar;
+}
+int CPDF_Type3Font::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (charcode > 0xff) {
+ charcode = 0;
+ }
+ if (m_CharWidthL[charcode]) {
+ return m_CharWidthL[charcode];
+ }
+ CPDF_Type3Char* pChar = LoadChar(charcode, level);
+ if (pChar == NULL) {
+ return 0;
+ }
+ return pChar->m_Width;
+}
+void CPDF_Type3Font::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ CPDF_Type3Char* pChar = LoadChar(charcode, level);
+ if (pChar == NULL) {
+ rect.left = rect.right = rect.top = rect.bottom = 0;
+ return;
+ }
+ rect = pChar->m_BBox;
+}
+CPDF_Type3Char::CPDF_Type3Char()
+{
+ m_pForm = NULL;
+ m_pBitmap = NULL;
+ m_bPageRequired = FALSE;
+ m_bColored = FALSE;
+}
+CPDF_Type3Char::~CPDF_Type3Char()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
new file mode 100644
index 0000000000..bd09cfc75d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp
@@ -0,0 +1,625 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fxge/fx_freetype.h"
+extern FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR*);
+const struct _UnicodeAlt {
+ FX_WORD m_Unicode;
+ const FX_CHAR* m_Alter;
+}
+UnicodeAlts[] = {
+ {0x00a0, " "}, {0x00a1, "!"}, {0x00a2, "c"}, {0x00a3, "P"}, {0x00a4, "o"},
+ {0x00a5, "Y"}, {0x00a6, "|"}, {0x00a7, "S"}, {0x00a9, "(C)"}, {0x00aa, "a"},
+ {0x00ab, "<<"}, {0x00ac, "-|"}, {0x00ae, "(R)"}, {0x00af, "-"},
+ {0x00b0, "o"}, {0x00b1, "+/-"}, {0x00b2, "^2"}, { 0x00b3, "^3"},
+ {0x00b4, "'"}, {0x00b5, "u"}, {0x00b6, "P"}, {0x00b7, "."},
+ {0x00b9, "^1"}, {0x00ba, "o"}, {0x00bb, ">>"}, {0x00bc, "1/4"},
+ {0x00bd, "1/2"}, {0x00be, "3/4"}, {0x00bf, "?"}, {0x00c0, "A"},
+ {0x00c1, "A"}, {0x00c2, "A"}, {0x00c3, "A"}, {0x00c4, "A"},
+ {0x00c5, "A"}, {0x00c6, "AE"}, {0x00c7, "C"}, {0x00c8, "E"},
+ {0x00c9, "E"}, {0x00ca, "E"}, {0x00cb, "E"}, {0x00cc, "I"},
+ {0x00cd, "I"}, {0x00ce, "I"}, {0x00cf, "I"},
+ {0x00d1, "N"}, {0x00d2, "O"}, {0x00d3, "O"}, {0x00d4, "O"},
+ {0x00d5, "O"}, {0x00d6, "O"}, {0x00d7, "x"}, {0x00d8, "O"},
+ {0x00d9, "U"}, {0x00da, "U"}, {0x00db, "U"}, {0x00dc, "U"},
+ {0x00dd, "Y"}, {0x00df, "S"}, {0x00e0, "a"},
+ {0x00e1, "a"}, {0x00e2, "a"}, {0x00e3, "a"}, {0x00e4, "a"},
+ {0x00e5, "a"}, {0x00e6, "ae"}, {0x00e7, "c"}, {0x00e8, "e"},
+ {0x00e9, "e"}, {0x00ea, "e"}, {0x00eb, "e"}, {0x00ec, "i"},
+ {0x00ed, "i"}, {0x00ee, "i"}, {0x00ef, "i"},
+ {0x00f1, "n"}, {0x00f2, "o"}, {0x00f3, "o"}, {0x00f4, "o"},
+ {0x00f5, "o"}, {0x00f6, "o"}, {0x00f7, "/"}, {0x00f8, "o"},
+ {0x00f9, "u"}, {0x00fa, "u"}, {0x00fb, "u"}, {0x00fc, "u"},
+ {0x00fd, "y"}, {0x00ff, "y"},
+ {0x02b0, "h"}, {0x02b2, "j"}, {0x02b3, "r"}, {0x02b7, "w"},
+ {0x02b8, "y"}, {0x02b9, "'"}, {0x02ba, "\""}, {0x02bb, "'"},
+ {0x02bc, "'"}, {0x02bd, "'"}, {0x02be, "'"}, {0x02bf, "'"},
+ {0x02c2, "<"}, {0x02c3, ">"}, {0x02c4, "^"}, {0x02c5, "v"},
+ {0x02c6, "^"}, {0x02c7, "v"}, {0x02c8, "'"}, {0x02c9, "-"},
+ {0x02ca, "'"}, {0x02cb, "'"}, {0x02cc, "."}, {0x02cd, "_"},
+ {0x2010, "-"}, {0x2012, "-"}, {0x2013, "-"}, {0x2014, "--"},
+ {0x2015, "--"}, {0x2016, "|"}, {0x2017, "_"},
+ {0x2018, "'"}, {0x2019, "'"}, {0x201a, ","}, {0x201b, "'"},
+ {0x201c, "\""}, {0x201d, "\""}, {0x201e, ","}, {0x201f, "'"},
+ {0x2020, "+"}, {0x2021, "+"}, {0x2022, "*"}, {0x2023, ">"},
+ {0x2024, "."}, {0x2025, ".."}, {0x2027, "."}, {0x2032, "'"},
+ {0x2033, "\""}, {0x2035, "'"}, {0x2036, "\""}, {0x2038, "^"},
+ {0x2039, "<"}, {0x203a, ">"}, {0x203b, "*"}, {0x203c, "!!"},
+ {0x203d, "?!"}, {0x203e, "-"}, {0x2044, "/"}, {0x2047, "??"},
+ {0x2048, "?!"}, {0x2049, "!?"}, {0x204e, "*"}, {0x2052, "%"},
+ {0x2122, "(TM)"},
+ {0x2212, "-"}, {0x2215, "/"}, {0x2216, "\\"}, {0x2217, "*"},
+ {0x2218, "*"}, {0x2219, "*"}, {0x2223, "|"}, {0x22c5, "."},
+ {0x266f, "#"},
+ {0XF6D9, "(C)"}, {0XF6DA, "(C)"}, {0XF6DB, "(TM)"},
+ {0XF8E8, "(C)"}, {0xf8e9, "(C)"}, {0XF8EA, "(TM)"},
+
+ {0xfb01, "fi"}, {0xfb02, "fl"}
+};
+const FX_CHAR* FCS_GetAltStr(FX_WCHAR unicode)
+{
+ int begin = 0;
+ int end = sizeof UnicodeAlts / sizeof(struct _UnicodeAlt) - 1;
+ while (begin <= end) {
+ int middle = (begin + end) / 2;
+ FX_WORD middlecode = UnicodeAlts[middle].m_Unicode;
+ if (middlecode > unicode) {
+ end = middle - 1;
+ } else if (middlecode < unicode) {
+ begin = middle + 1;
+ } else {
+ return UnicodeAlts[middle].m_Alter;
+ }
+ }
+ return NULL;
+}
+const FX_WORD StandardEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x2018, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x2044, 0x00a5, 0x0192, 0x00a7, 0x00a4, 0x0027,
+ 0x201c, 0x00ab, 0x2039, 0x203a, 0xfb01, 0xfb02, 0x0000, 0x2013, 0x2020, 0x2021,
+ 0x00b7, 0x0000, 0x00b6, 0x2022, 0x201a, 0x201e, 0x201d, 0x00bb, 0x2026, 0x2030,
+ 0x0000, 0x00bf, 0x0000, 0x0060, 0x00b4, 0x02c6, 0x02dc, 0x00af, 0x02d8, 0x02d9,
+ 0x00a8, 0x0000, 0x02da, 0x00b8, 0x0000, 0x02dd, 0x02db, 0x02c7, 0x2014, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c6, 0x0000, 0x00aa, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0141, 0x00d8, 0x0152, 0x00ba, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0131, 0x0000, 0x0000, 0x0142, 0x00f8,
+ 0x0153, 0x00df, 0x0000, 0x0000, 0x0000, 0x0000
+};
+const FX_WORD MacRomanEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x00c4, 0x00c5,
+ 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, 0x00e0, 0x00e2, 0x00e4, 0x00e3,
+ 0x00e5, 0x00e7, 0x00e9, 0x00e8, 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef,
+ 0x00f1, 0x00f3, 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc,
+ 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, 0x00ae, 0x00a9,
+ 0x2122, 0x00b4, 0x00a8, 0x0000, 0x00c6, 0x00d8, 0x0000, 0x00b1, 0x0000, 0x0000,
+ 0x00a5, 0x00b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00aa, 0x00ba, 0x0000,
+ 0x00e6, 0x00f8, 0x00bf, 0x00a3, 0x00ac, 0x0000, 0x0192, 0x0000, 0x0000, 0x00ab,
+ 0x00bb, 0x2026, 0x0020, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, 0x2013, 0x2014,
+ 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0000, 0x00ff, 0x0178, 0x2044, 0x00a4,
+ 0x2039, 0x203a, 0xfb01, 0xfb02, 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2,
+ 0x00ca, 0x00c1, 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4,
+ 0x0000, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, 0x00af, 0x02d8,
+ 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7
+};
+const FX_WORD AdobeWinAnsiEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2022,
+ 0x20ac, 0x2022, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2022, 0x017d, 0x2022,
+ 0x2022, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2022, 0x017e, 0x0178,
+ 0x0020, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+extern const FX_WORD PDFDocEncoding[256];
+const FX_WORD MacExpertEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0020, 0xf721, 0xf6f8, 0xf7a2, 0xf724, 0xf6e4, 0xf726, 0xf7b4,
+ 0x207d, 0x207e, 0x2025, 0x2024, 0x002c, 0x002d, 0x002e, 0x2044, 0xf730, 0xf731,
+ 0xf732, 0xf733, 0xf734, 0xf735, 0xf736, 0xf737, 0xf738, 0xf739, 0x003a, 0x003b,
+ 0x0000, 0xf6de, 0x0000, 0xf73f, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7f0, 0x0000,
+ 0x0000, 0x00bc, 0x00bd, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e, 0x2153, 0x2154,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfb00, 0xfb01, 0xfb02, 0xfb03,
+ 0xfb04, 0x208d, 0x0000, 0x208e, 0xf6f6, 0xf6e5, 0xf760, 0xf761, 0xf762, 0xf763,
+ 0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, 0xf76c, 0xf76d,
+ 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, 0xf774, 0xf775, 0xf776, 0xf777,
+ 0xf778, 0xf779, 0xf77a, 0x20a1, 0xf6dc, 0xf6dd, 0xf6fe, 0x0000, 0x0000, 0xf6e9,
+ 0xf6e0, 0x0000, 0x0000, 0x0000, 0x0000, 0xf7e1, 0xf7e0, 0xf7e2, 0xf7e4, 0xf7e3,
+ 0xf7e5, 0xf7e7, 0xf7e9, 0xf7e8, 0xf7ea, 0xf7eb, 0xf7ed, 0xf7ec, 0xf7ee, 0xf7ef,
+ 0xf7f1, 0xf7f3, 0xf7f2, 0xf7f4, 0xf7f6, 0xf7f5, 0xf7fa, 0xf7f9, 0xf7fb, 0xf7fc,
+ 0x0000, 0x2078, 0x2084, 0x2083, 0x2086, 0x2088, 0x2087, 0xf6fd, 0x0000, 0xf6df,
+ 0x2082, 0x0000, 0xf7a8, 0x0000, 0xf6f5, 0xf6fd, 0x2085, 0x0000, 0xf6e1, 0xf6e7,
+ 0xf7fd, 0x0000, 0xf6e3, 0x0000, 0x0000, 0xf7fe, 0x0000, 0x2089, 0x2080, 0xf6ff,
+ 0xf7e6, 0xf7f8, 0xf7bf, 0x2081, 0xf6e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xf7b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xf6fa, 0x2012, 0xf6e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xf7a1, 0x0000, 0xf7ff, 0x0000, 0x00b9, 0x00b2,
+ 0x00b3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2079, 0x2070, 0x0000, 0xf6ec, 0xf6f1,
+ 0x0000, 0x0000, 0x0000, 0xf6ed, 0xf6f2, 0xf6eb, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0xf6ee, 0xf6fb, 0xf6f4, 0xf7af, 0xf6ea, 0x207f, 0xf6ef, 0xf6e2, 0xf6e8,
+ 0xf6f7, 0xf6fc, 0x0000, 0x0000, 0x0000, 0x0000
+};
+const FX_WORD AdobeSymbolEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220B,
+ 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393,
+ 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F,
+ 0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9,
+ 0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F,
+ 0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3,
+ 0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF,
+ 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9,
+ 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663,
+ 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193,
+ 0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022,
+ 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0xF8E6, 0xF8E7, 0x21B5,
+ 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229,
+ 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209,
+ 0x2220, 0x2207, 0xF6DA, 0xF6D9, 0xF6DB, 0x220F, 0x221A, 0x22C5,
+ 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3,
+ 0x25CA, 0x2329, 0xF8E8, 0xF8E9, 0xF8EA, 0x2211, 0xF8EB, 0xF8EC,
+ 0xF8ED, 0xF8EE, 0xF8EF, 0xF8F0, 0xF8F1, 0xF8F2, 0xF8F3, 0xF8F4,
+ 0x0000, 0x232A, 0x222B, 0x2320, 0xF8F5, 0x2321, 0xF8F6, 0xF8F7,
+ 0xF8F8, 0xF8F9, 0xF8FA, 0xF8FB, 0xF8FC, 0xF8FD, 0xF8FE, 0x0000,
+};
+const FX_WORD ZapfEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0020, 0x2701, 0x2702, 0x2703, 0x2704, 0x260E, 0x2706, 0x2707,
+ 0x2708, 0x2709, 0x261B, 0x261E, 0x270C, 0x270D, 0x270E, 0x270F,
+ 0x2710, 0x2711, 0x2712, 0x2713, 0x2714, 0x2715, 0x2716, 0x2717,
+ 0x2718, 0x2719, 0x271A, 0x271B, 0x271C, 0x271D, 0x271E, 0x271F,
+ 0x2720, 0x2721, 0x2722, 0x2723, 0x2724, 0x2725, 0x2726, 0x2727,
+ 0x2605, 0x2729, 0x272A, 0x272B, 0x272C, 0x272D, 0x272E, 0x272F,
+ 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735, 0x2736, 0x2737,
+ 0x2738, 0x2739, 0x273A, 0x273B, 0x273C, 0x273D, 0x273E, 0x273F,
+ 0x2740, 0x2741, 0x2742, 0x2743, 0x2744, 0x2745, 0x2746, 0x2747,
+ 0x2748, 0x2749, 0x274A, 0x274B, 0x25CF, 0x274D, 0x25A0, 0x274F,
+ 0x2750, 0x2751, 0x2752, 0x25B2, 0x25BC, 0x25C6, 0x2756, 0x25D7,
+ 0x2758, 0x2759, 0x275A, 0x275B, 0x275C, 0x275D, 0x275E, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765, 0x2766, 0x2767,
+ 0x2663, 0x2666, 0x2665, 0x2660, 0x2460, 0x2461, 0x2462, 0x2463,
+ 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x2776, 0x2777,
+ 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F,
+ 0x2780, 0x2781, 0x2782, 0x2783, 0x2784, 0x2785, 0x2786, 0x2787,
+ 0x2788, 0x2789, 0x278A, 0x278B, 0x278C, 0x278D, 0x278E, 0x278F,
+ 0x2790, 0x2791, 0x2792, 0x2793, 0x2794, 0x2192, 0x2194, 0x2195,
+ 0x2798, 0x2799, 0x279A, 0x279B, 0x279C, 0x279D, 0x279E, 0x279F,
+ 0x27A0, 0x27A1, 0x27A2, 0x27A3, 0x27A4, 0x27A5, 0x27A6, 0x27A7,
+ 0x27A8, 0x27A9, 0x27AA, 0x27AB, 0x27AC, 0x27AD, 0x27AE, 0x27AF,
+ 0x0000, 0x27B1, 0x27B2, 0x27B3, 0x27B4, 0x27B5, 0x27B6, 0x27B7,
+ 0x27B8, 0x27B9, 0x27BA, 0x27BB, 0x27BC, 0x27BD, 0x27BE, 0x0000,
+};
+const FX_LPCSTR StandardEncodingNames[224] = {
+ "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", NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section",
+ "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl",
+ NULL, "endash", "dagger", "daggerdbl", "periodcentered", NULL, "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright", "ellipsis", "perthousand", NULL, "questiondown",
+ NULL, "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent",
+ "dieresis", NULL, "ring", "cedilla", NULL, "hungarumlaut", "ogonek", "caron",
+ "emdash", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "AE", NULL, "ordfeminine", NULL, NULL, NULL, NULL,
+ "Lslash", "Oslash", "OE", "ordmasculine", NULL, NULL, NULL, NULL,
+ NULL, "ae", NULL, NULL, NULL, "dotlessi", NULL, NULL,
+ "lslash", "oslash", "oe", "germandbls", NULL, NULL, NULL, NULL,
+};
+const FX_LPCSTR AdobeWinAnsiEncodingNames[224] = {
+ "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",
+ "space", "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",
+};
+const FX_LPCSTR MacRomanEncodingNames[224] = {
+ "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", NULL,
+ "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", "space", "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",
+};
+const FX_LPCSTR MacExpertEncodingNames[224] = {
+ "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", NULL, "threequartersemdash", NULL, "questionsmall",
+ NULL, NULL, NULL, NULL, "Ethsmall", NULL, NULL, "onequarter",
+ "onehalf", "threequarters", "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird", "twothirds",
+ NULL, NULL, NULL, NULL, NULL, NULL, "ff", "fi",
+ "fl", "ffi", "ffl", "parenleftinferior", NULL, "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", NULL,
+ NULL, "asuperior", "centsuperior", NULL, NULL, NULL, NULL, "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",
+ NULL, "eightsuperior", "fourinferior", "threeinferior", "sixinferior", "eightinferior", "seveninferior", "Scaronsmall",
+ NULL, "centinferior", "twoinferior", NULL, "Dieresissmall", NULL, "Caronsmall", "Scaronsmall",
+ "fiveinferior", NULL, "commainferior", "periodinferior", "Yacutesmall", NULL, "dollarinferior", NULL,
+ NULL, "Thornsmall", NULL, "nineinferior", "zeroinferior", "Zcaronsmall", "AEsmall", "Oslashsmall",
+ "questiondownsmall", "oneinferior", "asuperior", NULL, NULL, NULL, NULL, NULL,
+ NULL, "Cedillasmall", NULL, NULL, NULL, NULL, NULL, "OEsmall",
+ "figuredash", "hyphensuperior", NULL, NULL, NULL, NULL, "exclamdownsmall", NULL,
+ "Ydieresissmall", NULL, "onesuperior", "twosuperior", "threesuperior", "foursuperior", "fivesuperior", "sixsuperior",
+ "sevensuperior", "ninesuperior", "zerosuperior", NULL, "esuperior", "rsuperior", NULL, NULL,
+ NULL, "isuperior", "ssuperior", "dsuperior", NULL, NULL, NULL, NULL,
+ NULL, "lsuperior", "Ogoneksmall", "Brevesmall", "Macronsmall", "bsuperior", "nsuperior", "msuperior",
+ "commasuperior", "periodsuperior", "Dotaccentsmall", "Ringsmall", NULL, NULL, NULL, NULL,
+};
+const FX_LPCSTR PDFDocEncodingNames[232] = {
+ "breve", "caron", "circumflex", "dotaccent", "hungarumlaut", "ogonek", "ring", "tilde",
+ "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", NULL,
+ "bullet3", "dagger", "daggerdbl", "ellipsis", "emdash", "endash", "florin", "fraction",
+ "guilsinglleft", "guilsinglright", "minus", "perthousand", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft",
+ "quoteright", "quotesinglbase", "trademark", "fi", "fl", "Lslash", "OE", "Scaron",
+ "Ydieresis", "Zcaron2", "dotlessi", "lslash", "oe", "scaron", "zcaron2", NULL,
+ "Euro", "exclamdown", "cent", "sterling", "currency", "yen", "brokenbar", "section",
+ "dieresis", "copyright", "ordfeminine", "guillemotleft4", "logicalnot", NULL, "registered", "macron",
+ "degree", "plusminus", "twosuperior", "threesuperior", "acute", "mu", "paragraph", "periodcentered",
+ "cedilla", "onesuperior", "ordmasculine", "guillemotright4", "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",
+};
+const FX_LPCSTR AdobeSymbolEncodingNames[224] = {
+ "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", NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ "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",
+ NULL, "angleright", "integral", "integraltp", "integralex", "integralbt", "parenrighttp", "parenrightex",
+ "parenrightbt", "bracketrighttp", "bracketrightex", "bracketrightbt", "bracerighttp", "bracerightmid", "bracerightbt", NULL,
+};
+const FX_LPCSTR ZapfEncodingNames[224] = {
+ "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", NULL,
+ "a89", "a90", "a93", "a94", "a91", "a92", "a205", "a85",
+ "a206", "a86", "a87", "a88", "a95", "a96", NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, "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",
+ NULL, "a201", "a183", "a184", "a197", "a185", "a194", "a198",
+ "a186", "a195", "a187", "a188", "a189", "a190", "a191", NULL
+};
+const FX_CHAR* PDF_CharNameFromPredefinedCharSet(int encoding, FX_BYTE charcode)
+{
+ if (encoding == PDFFONT_ENCODING_PDFDOC) {
+ if (charcode < 24) {
+ return NULL;
+ }
+ charcode -= 24;
+ } else {
+ if (charcode < 32) {
+ return NULL;
+ }
+ charcode -= 32;
+ }
+ switch (encoding) {
+ case PDFFONT_ENCODING_WINANSI:
+ return AdobeWinAnsiEncodingNames[charcode];
+ case PDFFONT_ENCODING_MACROMAN:
+ return MacRomanEncodingNames[charcode];
+ case PDFFONT_ENCODING_MACEXPERT:
+ return MacExpertEncodingNames[charcode];
+ case PDFFONT_ENCODING_STANDARD:
+ return StandardEncodingNames[charcode];
+ case PDFFONT_ENCODING_ADOBE_SYMBOL:
+ return AdobeSymbolEncodingNames[charcode];
+ case PDFFONT_ENCODING_ZAPFDINGBATS:
+ return ZapfEncodingNames[charcode];
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncodingNames[charcode];
+ }
+ return NULL;
+}
+FX_WCHAR FT_UnicodeFromCharCode(int encoding, FX_DWORD charcode)
+{
+ switch (encoding) {
+ case FXFT_ENCODING_UNICODE:
+ return (FX_WORD)charcode;
+ case FXFT_ENCODING_ADOBE_STANDARD:
+ return StandardEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_ADOBE_EXPERT:
+ return MacExpertEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_ADOBE_LATIN_1:
+ return AdobeWinAnsiEncoding[(FX_BYTE)charcode];
+ case FXFT_ENCODING_APPLE_ROMAN:
+ return MacRomanEncoding[(FX_BYTE)charcode];
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncoding[(FX_BYTE)charcode];
+ }
+ return 0;
+}
+static FX_DWORD PDF_FindCode(const FX_WORD* pCodes, FX_WORD unicode)
+{
+ for (FX_DWORD i = 0; i < 256; i ++)
+ if (pCodes[i] == unicode) {
+ return i;
+ }
+ return 0;
+}
+const FX_WORD MSSymbolEncoding[256] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 32, 33, 8704, 35, 8707, 37, 38, 8715,
+ 40, 41, 8727, 43, 44, 8722, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 8773, 913, 914, 935, 916, 917,
+ 934, 915, 919, 921, 977, 922, 923, 924, 925, 927,
+ 928, 920, 929, 931, 932, 933, 962, 937, 926, 936,
+ 918, 91, 8756, 93, 8869, 95, 8254, 945, 946, 967,
+ 948, 949, 966, 947, 951, 953, 981, 954, 955, 956,
+ 957, 959, 960, 952, 961, 963, 964, 965, 982, 969,
+ 958, 968, 950, 123, 124, 125, 8764, 0, 0, 0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 978, 8242, 8804, 8725, 8734, 402, 9827, 9830, 9828,
+ 9824, 8596, 8592, 8593, 8594, 8595, 176, 177, 8243, 8805,
+ 215, 8733, 8706, 8729, 247, 8800, 8801, 8776, 8943, 0,
+ 0, 8629, 0, 8465, 8476, 8472, 8855, 8853, 8709, 8745,
+ 8746, 8835, 8839, 8836, 8834, 8838, 8712, 8713, 8736, 8711,
+ 174, 169, 8482, 8719, 8730, 8901, 172, 8743, 8744, 8660,
+ 8656, 8657, 8658, 8659, 9674, 9001, 0, 0, 0, 8721,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x0000, 9002, 8747, 8992, 0, 8993, 0, 0, 0, 0,
+ 0, 0, 0x0000, 0x0000, 0x0000, 0x0000
+};
+FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode)
+{
+ switch (encoding) {
+ case FXFT_ENCODING_UNICODE:
+ return unicode;
+ case FXFT_ENCODING_ADOBE_STANDARD:
+ return PDF_FindCode(StandardEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_EXPERT:
+ return PDF_FindCode(MacExpertEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_LATIN_1:
+ return PDF_FindCode(AdobeWinAnsiEncoding, unicode);
+ case FXFT_ENCODING_APPLE_ROMAN:
+ return PDF_FindCode(MacRomanEncoding, unicode);
+ case FXFT_ENCODING_ADOBE_CUSTOM:
+ return PDF_FindCode(PDFDocEncoding, unicode);
+ case FXFT_ENCODING_MS_SYMBOL:
+ return PDF_FindCode(MSSymbolEncoding, unicode);
+ }
+ return 0;
+}
+const FX_WORD* PDF_UnicodesForPredefinedCharSet(int encoding)
+{
+ switch (encoding) {
+ case PDFFONT_ENCODING_WINANSI:
+ return AdobeWinAnsiEncoding;
+ case PDFFONT_ENCODING_MACROMAN:
+ return MacRomanEncoding;
+ case PDFFONT_ENCODING_MACEXPERT:
+ return MacExpertEncoding;
+ case PDFFONT_ENCODING_STANDARD:
+ return StandardEncoding;
+ case PDFFONT_ENCODING_ADOBE_SYMBOL:
+ return AdobeSymbolEncoding;
+ case PDFFONT_ENCODING_ZAPFDINGBATS:
+ return ZapfEncoding;
+ case PDFFONT_ENCODING_PDFDOC:
+ return PDFDocEncoding;
+ case PDFFONT_ENCODING_MS_SYMBOL:
+ return MSSymbolEncoding;
+ }
+ return NULL;
+}
+FX_DWORD PDF_PredefinedCharCodeFromUnicode(int encoding, FX_WCHAR unicode)
+{
+ return PDF_FindCode(PDF_UnicodesForPredefinedCharSet(encoding), unicode);
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int FXFT_unicode_from_adobe_name(const char* name);
+#ifdef __cplusplus
+}
+#endif
+FX_WCHAR PDF_UnicodeFromAdobeName(const FX_CHAR* name)
+{
+ return (FX_WCHAR)(FXFT_unicode_from_adobe_name(name) & 0x7FFFFFFF);
+}
+CFX_ByteString PDF_AdobeNameFromUnicode(FX_WCHAR unicode)
+{
+ char glyph_name[64];
+ FXFT_adobe_name_from_unicode(glyph_name, unicode);
+ return CFX_ByteString(glyph_name, -1);
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
new file mode 100644
index 0000000000..891d82fa1a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -0,0 +1,1716 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "font_int.h"
+#include "../fpdf_cmaps/cmap_int.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+extern FX_DWORD FT_CharCodeFromUnicode(int encoding, FX_WCHAR unicode);
+extern FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name);
+extern FX_BOOL FXFC_LoadFile(FX_LPVOID pPackage, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size);
+extern void FXFC_ClosePackage(FX_LPVOID pPackage);
+extern short TT2PDF(int m, FXFT_Face face);
+extern FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id);
+extern FX_LPCSTR GetAdobeCharName(int iBaseEncoding, const CFX_ByteString* pCharNames, int charcode);
+CPDF_CMapManager::CPDF_CMapManager()
+{
+#ifndef _FPDFAPI_MINI_
+ m_bPrompted = FALSE;
+ m_pPackage = NULL;
+#endif
+ FXSYS_memset32(m_CID2UnicodeMaps, 0, sizeof m_CID2UnicodeMaps);
+}
+CPDF_CMapManager::~CPDF_CMapManager()
+{
+ DropAll(FALSE);
+#ifndef _FPDFAPI_MINI_
+ if (m_pPackage) {
+ FXFC_ClosePackage(m_pPackage);
+ }
+#endif
+}
+#ifndef _FPDFAPI_MINI_
+FX_LPVOID CPDF_CMapManager::GetPackage(FX_BOOL bPrompt)
+{
+#ifndef FOXIT_CHROME_BUILD
+ if (m_pPackage == NULL) {
+ CFX_ByteString filename = CPDF_ModuleMgr::Get()->GetModuleFilePath(ADDIN_NAME_CJK, "FPDFCJK.BIN");
+ m_pPackage = FXFC_LoadPackage(filename);
+ if (bPrompt && m_pPackage == NULL && !m_bPrompted) {
+ m_bPrompted = TRUE;
+ if (!CPDF_ModuleMgr::Get()->DownloadModule(ADDIN_NAME_CJK)) {
+ return NULL;
+ }
+ m_pPackage = FXFC_LoadPackage(filename);
+ }
+ }
+#endif
+ return m_pPackage;
+}
+#endif
+CPDF_CMap* CPDF_CMapManager::GetPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
+{
+ CPDF_CMap* pCMap;
+ if (m_CMaps.Lookup(name, (FX_LPVOID&)pCMap)) {
+ return pCMap;
+ }
+ pCMap = LoadPredefinedCMap(name, bPromptCJK);
+ if (name.IsEmpty()) {
+ return pCMap;
+ }
+ m_CMaps.SetAt(name, pCMap);
+ return pCMap;
+}
+CPDF_CMap* CPDF_CMapManager::LoadPredefinedCMap(const CFX_ByteString& name, FX_BOOL bPromptCJK)
+{
+ CPDF_CMap* pCMap = FX_NEW CPDF_CMap;
+ FX_LPCSTR pname = name;
+ if (*pname == '/') {
+ pname ++;
+ }
+ pCMap->LoadPredefined(this, pname, bPromptCJK);
+ return pCMap;
+}
+const FX_LPCSTR g_CharsetNames[] = {NULL, "GB1", "CNS1", "Japan1", "Korea1", "UCS", NULL};
+const int g_CharsetCPs[] = {0, 936, 950, 932, 949, 1200, 0};
+int _CharsetFromOrdering(const CFX_ByteString& Ordering)
+{
+ int charset = 1;
+ while (g_CharsetNames[charset] && Ordering != CFX_ByteStringC(g_CharsetNames[charset])) {
+ charset ++;
+ }
+ if (g_CharsetNames[charset] == NULL) {
+ return CIDSET_UNKNOWN;
+ }
+ return charset;
+}
+void CPDF_CMapManager::ReloadAll()
+{
+ DropAll(TRUE);
+}
+void CPDF_CMapManager::DropAll(FX_BOOL bReload)
+{
+ FX_POSITION pos = m_CMaps.GetStartPosition();
+ while (pos) {
+ CFX_ByteString name;
+ CPDF_CMap* pCMap;
+ m_CMaps.GetNextAssoc(pos, name, (FX_LPVOID&)pCMap);
+ if (pCMap == NULL) {
+ continue;
+ }
+ if (bReload) {
+ pCMap->LoadPredefined(this, name, FALSE);
+ } else {
+ delete pCMap;
+ }
+ }
+ for (int i = 0; i < sizeof m_CID2UnicodeMaps / sizeof(CPDF_CID2UnicodeMap*); i ++) {
+ CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i];
+ if (pMap == NULL) {
+ continue;
+ }
+ if (bReload) {
+ pMap->Load(this, i, FALSE);
+ } else {
+ delete pMap;
+ }
+ }
+}
+CPDF_CID2UnicodeMap* CPDF_CMapManager::GetCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
+{
+ if (m_CID2UnicodeMaps[charset] == NULL) {
+ m_CID2UnicodeMaps[charset] = LoadCID2UnicodeMap(charset, bPromptCJK);
+ }
+ return m_CID2UnicodeMaps[charset];
+}
+CPDF_CID2UnicodeMap* CPDF_CMapManager::LoadCID2UnicodeMap(int charset, FX_BOOL bPromptCJK)
+{
+ CPDF_CID2UnicodeMap* pMap = FX_NEW CPDF_CID2UnicodeMap();
+ if (!pMap->Initialize()) {
+ delete pMap;
+ return NULL;
+ }
+ pMap->Load(this, charset, bPromptCJK);
+ return pMap;
+}
+CPDF_CMapParser::CPDF_CMapParser()
+{
+ m_pCMap = NULL;
+ m_Status = 0;
+ m_CodeSeq = 0;
+}
+FX_BOOL CPDF_CMapParser::Initialize(CPDF_CMap* pCMap)
+{
+ m_pCMap = pCMap;
+ m_Status = 0;
+ m_CodeSeq = 0;
+ m_AddMaps.EstimateSize(0, 10240);
+ return TRUE;
+}
+static FX_DWORD CMap_GetCode(FX_BSTR word)
+{
+ int num = 0;
+ if (word.GetAt(0) == '<') {
+ for (int i = 1; i < word.GetLength(); i ++) {
+ FX_BYTE digit = word.GetAt(i);
+ if (digit >= '0' && digit <= '9') {
+ digit = digit - '0';
+ } else if (digit >= 'a' && digit <= 'f') {
+ digit = digit - 'a' + 10;
+ } else if (digit >= 'A' && digit <= 'F') {
+ digit = digit - 'A' + 10;
+ } else {
+ return num;
+ }
+ num = num * 16 + digit;
+ }
+ } else {
+ for (int i = 0; i < word.GetLength(); i ++) {
+ if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {
+ return num;
+ }
+ num = num * 10 + word.GetAt(i) - '0';
+ }
+ }
+ return num;
+}
+static FX_BOOL _CMap_GetCodeRange(_CMap_CodeRange& range, FX_BSTR first, FX_BSTR second)
+{
+ if (first.GetLength() == 0 || first.GetAt(0) != '<') {
+ return FALSE;
+ }
+ int num = 0;
+ int i;
+ for (i = 1; i < first.GetLength(); i ++)
+ if (first.GetAt(i) == '>') {
+ break;
+ }
+ range.m_CharSize = (i - 1) / 2;
+ if (range.m_CharSize > 4) {
+ return FALSE;
+ }
+ for (i = 0; i < range.m_CharSize; i ++) {
+ FX_BYTE digit1 = first.GetAt(i * 2 + 1);
+ FX_BYTE digit2 = first.GetAt(i * 2 + 2);
+ FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
+ byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
+ range.m_Lower[i] = byte;
+ }
+ FX_DWORD size = second.GetLength();
+ for (i = 0; i < range.m_CharSize; i ++) {
+ FX_BYTE digit1 = ((FX_DWORD)i * 2 + 1 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 1) : 0;
+ FX_BYTE digit2 = ((FX_DWORD)i * 2 + 2 < size) ? second.GetAt((FX_STRSIZE)i * 2 + 2) : 0;
+ FX_BYTE byte = (digit1 >= '0' && digit1 <= '9') ? (digit1 - '0') : ((digit1 & 0xdf) - 'A' + 10);
+ byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9') ? (digit2 - '0') : ((digit2 & 0xdf) - 'A' + 10));
+ range.m_Upper[i] = byte;
+ }
+ return TRUE;
+}
+static CFX_ByteString CMap_GetString(FX_BSTR word)
+{
+ return word.Mid(1, word.GetLength() - 2);
+}
+void CPDF_CMapParser::ParseWord(FX_BSTR word)
+{
+ if (word.IsEmpty()) {
+ return;
+ }
+ if (word == FX_BSTRC("begincidchar")) {
+ m_Status = 1;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("begincidrange")) {
+ m_Status = 2;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("endcidrange") || word == FX_BSTRC("endcidchar")) {
+ m_Status = 0;
+ } else if (word == FX_BSTRC("/WMode")) {
+ m_Status = 6;
+ } else if (word == FX_BSTRC("/Registry")) {
+ m_Status = 3;
+ } else if (word == FX_BSTRC("/Ordering")) {
+ m_Status = 4;
+ } else if (word == FX_BSTRC("/Supplement")) {
+ m_Status = 5;
+ } else if (word == FX_BSTRC("begincodespacerange")) {
+ m_Status = 7;
+ m_CodeSeq = 0;
+ } else if (word == FX_BSTRC("usecmap")) {
+ } else if (m_Status == 1 || m_Status == 2) {
+ m_CodePoints[m_CodeSeq] = CMap_GetCode(word);
+ m_CodeSeq ++;
+ FX_DWORD StartCode, EndCode;
+ FX_WORD StartCID;
+ if (m_Status == 1) {
+ if (m_CodeSeq < 2) {
+ return;
+ }
+ EndCode = StartCode = m_CodePoints[0];
+ StartCID = (FX_WORD)m_CodePoints[1];
+ } else {
+ if (m_CodeSeq < 3) {
+ return;
+ }
+ StartCode = m_CodePoints[0];
+ EndCode = m_CodePoints[1];
+ StartCID = (FX_WORD)m_CodePoints[2];
+ }
+ if (EndCode < 0x10000) {
+ for (FX_DWORD code = StartCode; code <= EndCode; code ++) {
+ m_pCMap->m_pMapping[code] = (FX_WORD)(StartCID + code - StartCode);
+ }
+ } else {
+ FX_DWORD buf[2];
+ buf[0] = StartCode;
+ buf[1] = ((EndCode - StartCode) << 16) + StartCID;
+ m_AddMaps.AppendBlock(buf, sizeof buf);
+ }
+ m_CodeSeq = 0;
+ } else if (m_Status == 3) {
+ CMap_GetString(word);
+ m_Status = 0;
+ } else if (m_Status == 4) {
+ m_pCMap->m_Charset = _CharsetFromOrdering(CMap_GetString(word));
+ m_Status = 0;
+ } else if (m_Status == 5) {
+ CMap_GetCode(word);
+ m_Status = 0;
+ } else if (m_Status == 6) {
+ m_pCMap->m_bVertical = CMap_GetCode(word);
+ m_Status = 0;
+ } else if (m_Status == 7) {
+ if (word == FX_BSTRC("endcodespacerange")) {
+ int nSegs = m_CodeRanges.GetSize();
+ if (nSegs > 1) {
+ m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes;
+ m_pCMap->m_nCodeRanges = nSegs;
+ m_pCMap->m_pLeadingBytes = FX_Alloc(FX_BYTE, nSegs * sizeof(_CMap_CodeRange));
+ FXSYS_memcpy32(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), nSegs * sizeof(_CMap_CodeRange));
+ } else if (nSegs == 1) {
+ m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) ? CPDF_CMap::TwoBytes : CPDF_CMap::OneByte;
+ }
+ m_Status = 0;
+ } else {
+ if (word.GetLength() == 0 || word.GetAt(0) != '<') {
+ return;
+ }
+ if (m_CodeSeq % 2) {
+ _CMap_CodeRange range;
+ if (_CMap_GetCodeRange(range, m_LastWord, word)) {
+ m_CodeRanges.Add(range);
+ }
+ }
+ m_CodeSeq ++;
+ }
+ }
+ m_LastWord = word;
+}
+CPDF_CMap::CPDF_CMap()
+{
+ m_Charset = CIDSET_UNKNOWN;
+ m_Coding = CIDCODING_UNKNOWN;
+ m_CodingScheme = TwoBytes;
+ m_bVertical = 0;
+ m_bLoaded = FALSE;
+ m_pMapping = NULL;
+ m_pLeadingBytes = NULL;
+ m_pAddMapping = NULL;
+ m_pEmbedMap = NULL;
+ m_pUseMap = NULL;
+ m_nCodeRanges = 0;
+}
+CPDF_CMap::~CPDF_CMap()
+{
+ if (m_pMapping) {
+ FX_Free(m_pMapping);
+ }
+ if (m_pAddMapping) {
+ FX_Free(m_pAddMapping);
+ }
+ if (m_pLeadingBytes) {
+ FX_Free(m_pLeadingBytes);
+ }
+ if (m_pUseMap) {
+ delete m_pUseMap;
+ }
+}
+void CPDF_CMap::Release()
+{
+ if (m_PredefinedCMap.IsEmpty()) {
+ delete this;
+ }
+}
+const CPDF_PredefinedCMap g_PredefinedCMaps[] = {
+ { "GB-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "GBpc-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
+ { "GBK-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBKp-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBK2K-EUC", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "GBK2K", CIDSET_GB1, CIDCODING_GB, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "UniGB-UCS2", CIDSET_GB1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniGB-UTF16", CIDSET_GB1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "B5pc", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfc} },
+ { "HKscs-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0x88, 0xfe} },
+ { "ETen-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "ETenms-B5", CIDSET_CNS1, CIDCODING_BIG5, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "UniCNS-UCS2", CIDSET_CNS1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniCNS-UTF16", CIDSET_CNS1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "83pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90ms-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90msp-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "90pv-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "Add-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "EUC", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x8e, 0x8e, 0xa1, 0xfe} },
+ { "H", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
+ { "V", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::TwoBytes, 1, {0x21, 0x7e} },
+ { "Ext-RKSJ", CIDSET_JAPAN1, CIDCODING_JIS, CPDF_CMap::MixedTwoBytes, 2, {0x81, 0x9f, 0xe0, 0xfc} },
+ { "UniJIS-UCS2", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniJIS-UCS2-HW", CIDSET_JAPAN1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniJIS-UTF16", CIDSET_JAPAN1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { "KSC-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfe} },
+ { "KSCms-UHC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "KSCms-UHC-HW", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0x81, 0xfe} },
+ { "KSCpc-EUC", CIDSET_KOREA1, CIDCODING_KOREA, CPDF_CMap::MixedTwoBytes, 1, {0xa1, 0xfd} },
+ { "UniKS-UCS2", CIDSET_KOREA1, CIDCODING_UCS2, CPDF_CMap::TwoBytes },
+ { "UniKS-UTF16", CIDSET_KOREA1, CIDCODING_UTF16, CPDF_CMap::TwoBytes },
+ { NULL, 0, 0 }
+};
+extern void FPDFAPI_FindEmbeddedCMap(const char* name, int charset, int coding, const FXCMAP_CMap*& pMap);
+extern FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode);
+FX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr, FX_LPCSTR pName, FX_BOOL bPromptCJK)
+{
+ m_PredefinedCMap = pName;
+ if (m_PredefinedCMap == FX_BSTRC("Identity-H") || m_PredefinedCMap == FX_BSTRC("Identity-V")) {
+ m_Coding = CIDCODING_CID;
+ m_bVertical = pName[9] == 'V';
+ m_bLoaded = TRUE;
+ return TRUE;
+ }
+ CFX_ByteString cmapid = m_PredefinedCMap;
+ m_bVertical = cmapid.Right(1) == FX_BSTRC("V");
+ if (cmapid.GetLength() > 2) {
+ cmapid = cmapid.Left(cmapid.GetLength() - 2);
+ }
+ int index = 0;
+ while (1) {
+ if (g_PredefinedCMaps[index].m_pName == NULL) {
+ return FALSE;
+ }
+ if (cmapid == CFX_ByteStringC(g_PredefinedCMaps[index].m_pName)) {
+ break;
+ }
+ index ++;
+ }
+ const CPDF_PredefinedCMap& map = g_PredefinedCMaps[index];
+ m_Charset = map.m_Charset;
+ m_Coding = map.m_Coding;
+ m_CodingScheme = map.m_CodingScheme;
+ if (m_CodingScheme == MixedTwoBytes) {
+ m_pLeadingBytes = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pLeadingBytes, 0, 256);
+ for (FX_DWORD i = 0; i < map.m_LeadingSegCount; i ++) {
+ for (int b = map.m_LeadingSegs[i * 2]; b <= map.m_LeadingSegs[i * 2 + 1]; b ++) {
+ m_pLeadingBytes[b] = 1;
+ }
+ }
+ }
+ FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);
+ if (m_pEmbedMap) {
+ m_bLoaded = TRUE;
+ return TRUE;
+ }
+#ifndef _FPDFAPI_MINI_
+ FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
+ FX_LPBYTE pBuffer;
+ FX_DWORD size;
+ if (pPackage == NULL || !FXFC_LoadFile(pPackage, m_PredefinedCMap, pBuffer, size)) {
+ return FALSE;
+ }
+ m_pMapping = FX_Alloc(FX_WORD, 65536);
+ FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
+ FX_DWORD dwRecodeEndPos = 0;
+ if (pBuffer[5] == 0) {
+ FX_DWORD dwStartIndex = *(FX_DWORD*)(pBuffer + 8);
+ FX_DWORD dwRecordCount = *(FX_DWORD*)(pBuffer + 16);
+ FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
+ if (dwRecordCount * 2 + dwStartIndex * 2 < 65536) {
+ FXSYS_memcpy32(m_pMapping + dwStartIndex * 2, pBuffer + dwDataOffset, dwRecordCount * 2);
+ }
+ dwRecodeEndPos = dwDataOffset + dwRecordCount * 2;
+ } else if (pBuffer[5] == 2) {
+ FX_DWORD nSegments = *(FX_DWORD*)(pBuffer + 16);
+ FX_DWORD dwDataOffset = *(FX_DWORD*)(pBuffer + 20);
+ dwRecodeEndPos = dwDataOffset + 6 * nSegments;
+ for (FX_DWORD i = 0; i < nSegments; i ++) {
+ FX_LPBYTE pRecord = pBuffer + dwDataOffset + i * 6;
+ FX_WORD IndexStart = *(FX_WORD*)pRecord;
+ FX_WORD IndexCount = *(FX_WORD*)(pRecord + 2);
+ FX_WORD CodeStart = *(FX_WORD*)(pRecord + 4);
+ if (IndexStart + IndexCount < 65536)
+ for (FX_DWORD j = 0; j < IndexCount; j ++) {
+ m_pMapping[IndexStart + j ] = (FX_WORD)(CodeStart + j);
+ }
+ }
+ }
+ if (dwRecodeEndPos < size) {
+ FX_DWORD dwMapLen = *(FX_DWORD*)(pBuffer + dwRecodeEndPos);
+ if (dwMapLen) {
+ m_pUseMap = FX_NEW CPDF_CMap;
+ CFX_ByteString bsName(pBuffer + dwRecodeEndPos + 4 , dwMapLen);
+ if (m_pUseMap) {
+ m_pUseMap->LoadPredefined(pMgr, bsName, bPromptCJK);
+ }
+ }
+ }
+ FX_Free(pBuffer);
+ m_bLoaded = TRUE;
+#endif
+ return TRUE;
+}
+extern "C" {
+ static int compare_dword(const void* data1, const void* data2)
+ {
+ return (*(FX_DWORD*)data1) - (*(FX_DWORD*)data2);
+ }
+};
+FX_BOOL CPDF_CMap::LoadEmbedded(FX_LPCBYTE pData, FX_DWORD size)
+{
+ m_pMapping = FX_Alloc(FX_WORD, 65536);
+ FXSYS_memset32(m_pMapping, 0, 65536 * sizeof(FX_WORD));
+ CPDF_CMapParser parser;
+ parser.Initialize(this);
+ CPDF_SimpleParser syntax(pData, size);
+ while (1) {
+ CFX_ByteStringC word = syntax.GetWord();
+ if (word.IsEmpty()) {
+ break;
+ }
+ parser.ParseWord(word);
+ }
+ if (m_CodingScheme == MixedFourBytes && parser.m_AddMaps.GetSize()) {
+ m_pAddMapping = FX_Alloc(FX_BYTE, parser.m_AddMaps.GetSize() + 4);
+ *(FX_DWORD*)m_pAddMapping = parser.m_AddMaps.GetSize() / 8;
+ FXSYS_memcpy32(m_pAddMapping + 4, parser.m_AddMaps.GetBuffer(), parser.m_AddMaps.GetSize());
+ FXSYS_qsort(m_pAddMapping + 4, parser.m_AddMaps.GetSize() / 8, 8, compare_dword);
+ }
+ return TRUE;
+}
+extern "C" {
+ static int compareCID(const void* key, const void* element)
+ {
+ if ((*(FX_DWORD*)key) < (*(FX_DWORD*)element)) {
+ return -1;
+ }
+ if ((*(FX_DWORD*)key) > (*(FX_DWORD*)element) + ((FX_DWORD*)element)[1] / 65536) {
+ return 1;
+ }
+ return 0;
+ }
+};
+FX_WORD CPDF_CMap::CIDFromCharCode(FX_DWORD charcode) const
+{
+ if (m_Coding == CIDCODING_CID) {
+ return (FX_WORD)charcode;
+ }
+ if (m_pEmbedMap) {
+ return FPDFAPI_CIDFromCharCode(m_pEmbedMap, charcode);
+ }
+ if (m_pMapping == NULL) {
+ return (FX_WORD)charcode;
+ }
+ if (charcode >> 16) {
+ if (m_pAddMapping) {
+ void* found = FXSYS_bsearch(&charcode, m_pAddMapping + 4, *(FX_DWORD*)m_pAddMapping, 8, compareCID);
+ if (found == NULL) {
+ if (m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return 0;
+ }
+ return (FX_WORD)(((FX_DWORD*)found)[1] % 65536 + charcode - * (FX_DWORD*)found);
+ }
+ if (m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return 0;
+ }
+ FX_DWORD CID = m_pMapping[charcode];
+ if (!CID && m_pUseMap) {
+ return m_pUseMap->CIDFromCharCode(charcode);
+ }
+ return (FX_WORD)CID;
+}
+static int _CheckCodeRange(FX_LPBYTE codes, int size, _CMap_CodeRange* pRanges, int nRanges)
+{
+ int iSeg = nRanges - 1;
+ while (iSeg >= 0) {
+ if (pRanges[iSeg].m_CharSize < size) {
+ iSeg --;
+ continue;
+ }
+ int iChar = 0;
+ while (iChar < size) {
+ if (codes[iChar] < pRanges[iSeg].m_Lower[iChar] ||
+ codes[iChar] > pRanges[iSeg].m_Upper[iChar]) {
+ break;
+ }
+ iChar ++;
+ }
+ if (iChar == pRanges[iSeg].m_CharSize) {
+ return 2;
+ }
+ if (iChar) {
+ if (size == pRanges[iSeg].m_CharSize) {
+ return 2;
+ }
+ return 1;
+ }
+ iSeg --;
+ }
+ return 0;
+}
+FX_DWORD CPDF_CMap::GetNextChar(FX_LPCSTR pString, int& offset) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return ((FX_LPBYTE)pString)[offset++];
+ case TwoBytes:
+ offset += 2;
+ return ((FX_LPBYTE)pString)[offset - 2] * 256 + ((FX_LPBYTE)pString)[offset - 1];
+ case MixedTwoBytes: {
+ FX_BYTE byte1 = ((FX_LPBYTE)pString)[offset++];
+ if (!m_pLeadingBytes[byte1]) {
+ return byte1;
+ }
+ FX_BYTE byte2 = ((FX_LPBYTE)pString)[offset++];
+ return byte1 * 256 + byte2;
+ }
+ case MixedFourBytes: {
+ FX_BYTE codes[4];
+ int char_size = 1;
+ codes[0] = ((FX_LPBYTE)pString)[offset++];
+ _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
+ while (1) {
+ int ret = _CheckCodeRange(codes, char_size, pRanges, m_nCodeRanges);
+ if (ret == 0) {
+ return 0;
+ }
+ if (ret == 2) {
+ FX_DWORD charcode = 0;
+ for (int i = 0; i < char_size; i ++) {
+ charcode = (charcode << 8) + codes[i];
+ }
+ return charcode;
+ }
+ if (char_size == 4) {
+ return 0;
+ }
+ codes[char_size ++] = ((FX_LPBYTE)pString)[offset++];
+ }
+ break;
+ }
+ }
+ return 0;
+}
+int CPDF_CMap::GetCharSize(FX_DWORD charcode) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return 1;
+ case TwoBytes:
+ return 2;
+ case MixedTwoBytes:
+ case MixedFourBytes:
+ if (charcode < 0x100) {
+ return 1;
+ }
+ if (charcode < 0x10000) {
+ return 2;
+ }
+ if (charcode < 0x1000000) {
+ return 3;
+ }
+ return 4;
+ }
+ return 1;
+}
+int CPDF_CMap::CountChar(FX_LPCSTR pString, int size) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ return size;
+ case TwoBytes:
+ return (size + 1) / 2;
+ case MixedTwoBytes: {
+ int count = 0;
+ for (int i = 0; i < size; i ++) {
+ count ++;
+ if (m_pLeadingBytes[((FX_LPBYTE)pString)[i]]) {
+ i ++;
+ }
+ }
+ return count;
+ }
+ case MixedFourBytes: {
+ int count = 0, offset = 0;
+ while (offset < size) {
+ GetNextChar(pString, offset);
+ count ++;
+ }
+ return count;
+ }
+ }
+ return size;
+}
+int _GetCharSize(FX_DWORD charcode, _CMap_CodeRange* pRanges, int iRangesSize)
+{
+ if (!iRangesSize) {
+ return 1;
+ }
+ FX_BYTE codes[4];
+ codes[0] = codes[1] = 0x00;
+ codes[2] = (FX_BYTE)(charcode >> 8 & 0xFF);
+ codes[3] = (FX_BYTE)charcode;
+ int offset = 0, size = 4;
+ for (int i = 0; i < 4; ++i) {
+ int iSeg = iRangesSize - 1;
+ while (iSeg >= 0) {
+ if (pRanges[iSeg].m_CharSize < size) {
+ iSeg --;
+ continue;
+ }
+ int iChar = 0;
+ while (iChar < size) {
+ if (codes[offset + iChar] < pRanges[iSeg].m_Lower[iChar] ||
+ codes[offset + iChar] > pRanges[iSeg].m_Upper[iChar]) {
+ break;
+ }
+ iChar ++;
+ }
+ if (iChar == pRanges[iSeg].m_CharSize) {
+ return size;
+ }
+ iSeg --;
+ }
+ size --;
+ offset ++;
+ }
+ return 1;
+}
+int CPDF_CMap::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
+{
+ switch (m_CodingScheme) {
+ case OneByte:
+ str[0] = (FX_BYTE)charcode;
+ return 1;
+ case TwoBytes:
+ str[0] = (FX_BYTE)(charcode / 256);
+ str[1] = (FX_BYTE)(charcode % 256);
+ return 2;
+ case MixedTwoBytes:
+ case MixedFourBytes:
+ if (charcode < 0x100) {
+ _CMap_CodeRange* pRanges = (_CMap_CodeRange*)m_pLeadingBytes;
+ int iSize = _GetCharSize(charcode, pRanges, m_nCodeRanges);
+ if (iSize == 0) {
+ iSize = 1;
+ }
+ if (iSize > 1) {
+ FXSYS_memset32(str, 0, sizeof(FX_BYTE) * iSize);
+ }
+ str[iSize - 1] = (FX_BYTE)charcode;
+ return iSize;
+ } else if (charcode < 0x10000) {
+ str[0] = (FX_BYTE)(charcode >> 8);
+ str[1] = (FX_BYTE)charcode;
+ return 2;
+ } else if (charcode < 0x1000000) {
+ str[0] = (FX_BYTE)(charcode >> 16);
+ str[1] = (FX_BYTE)(charcode >> 8);
+ str[2] = (FX_BYTE)charcode;
+ return 3;
+ } else {
+ str[0] = (FX_BYTE)(charcode >> 24);
+ str[1] = (FX_BYTE)(charcode >> 16);
+ str[2] = (FX_BYTE)(charcode >> 8);
+ str[3] = (FX_BYTE)charcode;
+ return 4;
+ }
+ }
+ return 0;
+}
+CPDF_CID2UnicodeMap::CPDF_CID2UnicodeMap()
+{
+ m_EmbeddedCount = 0;
+#ifndef _FPDFAPI_MINI_
+ m_pExternalMap = NULL;
+#endif
+}
+CPDF_CID2UnicodeMap::~CPDF_CID2UnicodeMap()
+{
+#ifndef _FPDFAPI_MINI_
+ if (m_pExternalMap) {
+ delete m_pExternalMap;
+ }
+#endif
+}
+FX_BOOL CPDF_CID2UnicodeMap::Initialize()
+{
+#ifndef _FPDFAPI_MINI_
+ m_pExternalMap = FX_NEW CPDF_FXMP;
+#endif
+ return TRUE;
+}
+FX_BOOL CPDF_CID2UnicodeMap::IsLoaded()
+{
+#ifdef _FPDFAPI_MINI_
+ return m_EmbeddedCount != 0;
+#else
+ return m_EmbeddedCount != 0 || (m_pExternalMap != NULL && m_pExternalMap->IsLoaded());
+#endif
+}
+FX_WCHAR CPDF_CID2UnicodeMap::UnicodeFromCID(FX_WORD CID)
+{
+ if (m_Charset == CIDSET_UNICODE) {
+ return CID;
+ }
+ if (CID < m_EmbeddedCount) {
+ return m_pEmbeddedMap[CID];
+ }
+#ifdef _FPDFAPI_MINI_
+ return 0;
+#else
+ FX_LPCBYTE record = m_pExternalMap->GetRecord(CID);
+ if (record == NULL) {
+ return 0;
+ }
+ return *(FX_WORD*)record;
+#endif
+}
+void FPDFAPI_LoadCID2UnicodeMap(int charset, const FX_WORD*& pMap, FX_DWORD& count);
+void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, int charset, FX_BOOL bPromptCJK)
+{
+ m_Charset = charset;
+ FPDFAPI_LoadCID2UnicodeMap(charset, m_pEmbeddedMap, m_EmbeddedCount);
+ if (m_EmbeddedCount) {
+ return;
+ }
+#ifndef _FPDFAPI_MINI_
+ FX_LPVOID pPackage = pMgr->GetPackage(bPromptCJK);
+ if (pPackage == NULL) {
+ return;
+ }
+ m_pExternalMap->LoadFile(pPackage, FX_BSTRC("CIDInfo_") + g_CharsetNames[charset]);
+#endif
+}
+#include "ttgsubtable.h"
+CPDF_CIDFont::CPDF_CIDFont()
+{
+ m_pCMap = NULL;
+ m_pAllocatedCMap = NULL;
+ m_pCID2UnicodeMap = NULL;
+ m_pAnsiWidths = NULL;
+ m_pCIDToGIDMap = NULL;
+ m_bCIDIsGID = FALSE;
+ m_bAdobeCourierStd = FALSE;
+ m_pTTGSUBTable = NULL;
+ FXSYS_memset8(m_CharBBox, 0xff, 256 * sizeof(FX_SMALL_RECT));
+}
+CPDF_CIDFont::~CPDF_CIDFont()
+{
+ if (m_pAnsiWidths) {
+ FX_Free(m_pAnsiWidths);
+ }
+ if (m_pAllocatedCMap) {
+ delete m_pAllocatedCMap;
+ }
+ if (m_pCIDToGIDMap) {
+ delete m_pCIDToGIDMap;
+ }
+ if (m_pTTGSUBTable) {
+ delete m_pTTGSUBTable;
+ }
+}
+FX_WORD CPDF_CIDFont::CIDFromCharCode(FX_DWORD charcode) const
+{
+ if (m_pCMap == NULL) {
+ return (FX_WORD)charcode;
+ }
+ return m_pCMap->CIDFromCharCode(charcode);
+}
+FX_BOOL CPDF_CIDFont::IsVertWriting() const
+{
+ return m_pCMap ? m_pCMap->IsVertWriting() : FALSE;
+}
+extern FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid);
+static FX_DWORD _EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, int charset, FX_WCHAR unicode)
+{
+ if (charset <= 0 || charset > 4) {
+ return 0;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ if (pCodes == NULL) {
+ return 0;
+ }
+ int nCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count;
+ for (int i = 0; i < nCodes; i++) {
+ if (pCodes[i] == unicode) {
+ FX_DWORD CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i);
+ if (CharCode == 0) {
+ continue;
+ }
+ return CharCode;
+ }
+ }
+ return 0;
+}
+static FX_WCHAR _EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, int charset, FX_DWORD charcode)
+{
+ if (charset <= 0 || charset > 4) {
+ return 0;
+ }
+ FX_WORD cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode);
+ if (cid == 0) {
+ return 0;
+ }
+ CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals();
+ const FX_WORD* pCodes = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap;
+ if (pCodes == NULL) {
+ return 0;
+ }
+ if (cid < pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count) {
+ return pCodes[cid];
+ }
+ return 0;
+}
+FX_WCHAR CPDF_CIDFont::_UnicodeFromCharCode(FX_DWORD charcode) const
+{
+ switch (m_pCMap->m_Coding) {
+ case CIDCODING_UCS2:
+ case CIDCODING_UTF16:
+ return (FX_WCHAR)charcode;
+ case CIDCODING_CID:
+ if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return 0;
+ }
+ return m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)charcode);
+ }
+ if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_WCHAR unicode;
+ int charsize = 1;
+ if (charcode > 255) {
+ charcode = (charcode % 256) * 256 + (charcode / 256);
+ charsize = 2;
+ }
+ int ret = FXSYS_MultiByteToWideChar(g_CharsetCPs[m_pCMap->m_Coding], 0, (FX_LPCSTR)&charcode, charsize, &unicode, 1);
+ if (ret != 1) {
+ return 0;
+ }
+ return unicode;
+#endif
+ if (m_pCMap->m_pEmbedMap) {
+ return _EmbeddedUnicodeFromCharcode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, charcode);
+ } else {
+ return 0;
+ }
+ }
+ return m_pCID2UnicodeMap->UnicodeFromCID(CIDFromCharCode(charcode));
+}
+FX_DWORD CPDF_CIDFont::_CharCodeFromUnicode(FX_WCHAR unicode) const
+{
+ switch (m_pCMap->m_Coding) {
+ case CIDCODING_UNKNOWN:
+ return 0;
+ case CIDCODING_UCS2:
+ case CIDCODING_UTF16:
+ return unicode;
+ case CIDCODING_CID: {
+ if (m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return 0;
+ }
+ FX_DWORD CID = 0;
+ while (CID < 65536) {
+ FX_WCHAR this_unicode = m_pCID2UnicodeMap->UnicodeFromCID((FX_WORD)CID);
+ if (this_unicode == unicode) {
+ return CID;
+ }
+ CID ++;
+ }
+ break;
+ }
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE buffer[32];
+ int ret = FXSYS_WideCharToMultiByte(g_CharsetCPs[m_pCMap->m_Coding], 0, &unicode, 1, (char*)buffer, 4, NULL, NULL);
+ if (ret == 1) {
+ return buffer[0];
+ } else if (ret == 2) {
+ return buffer[0] * 256 + buffer[1];
+ }
+ return 0;
+#endif
+ if (unicode < 0x80) {
+ return (FX_DWORD)unicode;
+ } else {
+ if (m_pCMap->m_pEmbedMap) {
+ return _EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, unicode);
+ } else {
+ return 0;
+ }
+ }
+}
+static void FT_UseCIDCharmap(FXFT_Face face, int coding)
+{
+ int encoding;
+ switch (coding) {
+ case CIDCODING_GB:
+ encoding = FXFT_ENCODING_GB2312;
+ break;
+ case CIDCODING_BIG5:
+ encoding = FXFT_ENCODING_BIG5;
+ break;
+ case CIDCODING_JIS:
+ encoding = FXFT_ENCODING_SJIS;
+ break;
+ case CIDCODING_KOREA:
+ encoding = FXFT_ENCODING_JOHAB;
+ break;
+ default:
+ encoding = FXFT_ENCODING_UNICODE;
+ }
+ int err = FXFT_Select_Charmap(face, encoding);
+ if (err) {
+ err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE);
+ }
+ if (err && FXFT_Get_Face_Charmaps(face)) {
+ FXFT_Set_Charmap(face, *FXFT_Get_Face_Charmaps(face));
+ }
+}
+FX_BOOL CPDF_CIDFont::_Load()
+{
+ if (m_pFontDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("TrueType")) {
+ return LoadGB2312();
+ }
+ CPDF_Array* pFonts = m_pFontDict->GetArray(FX_BSTRC("DescendantFonts"));
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ if (pFonts->GetCount() != 1) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pCIDFontDict = pFonts->GetDict(0);
+ if (pCIDFontDict == NULL) {
+ return FALSE;
+ }
+ m_BaseFont = pCIDFontDict->GetString(FX_BSTRC("BaseFont"));
+ if ((m_BaseFont.Compare("CourierStd") == 0 || m_BaseFont.Compare("CourierStd-Bold") == 0
+ || m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || m_BaseFont.Compare("CourierStd-Oblique") == 0)
+ && !IsEmbedded()) {
+ m_bAdobeCourierStd = TRUE;
+ }
+ CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ CPDF_Object* pEncoding = m_pFontDict->GetElementValue(FX_BSTRC("Encoding"));
+ if (pEncoding == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString subtype = pCIDFontDict->GetString(FX_BSTRC("Subtype"));
+ m_bType1 = FALSE;
+ if (subtype == FX_BSTRC("CIDFontType0")) {
+ m_bType1 = TRUE;
+ }
+ if (pEncoding->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString cmap = pEncoding->GetString();
+ m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(cmap,
+ m_pFontFile && m_bType1);
+ } else if (pEncoding->GetType() == PDFOBJ_STREAM) {
+ m_pAllocatedCMap = m_pCMap = FX_NEW CPDF_CMap;
+ CPDF_Stream* pStream = (CPDF_Stream*)pEncoding;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize());
+ } else {
+ return FALSE;
+ }
+ if (m_pCMap == NULL) {
+ return FALSE;
+ }
+ m_Charset = m_pCMap->m_Charset;
+ if (m_Charset == CIDSET_UNKNOWN) {
+ CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDict(FX_BSTRC("CIDSystemInfo"));
+ if (pCIDInfo) {
+ m_Charset = _CharsetFromOrdering(pCIDInfo->GetString(FX_BSTRC("Ordering")));
+ }
+ }
+ if (m_Charset != CIDSET_UNKNOWN)
+ m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset,
+ m_pFontFile == NULL && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist(FX_BSTRC("W"))));
+ if (m_Font.GetFace()) {
+ if (m_bType1) {
+ FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE);
+ } else {
+ FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding);
+ }
+ }
+ m_DefaultWidth = pCIDFontDict->GetInteger(FX_BSTRC("DW"), 1000);
+ CPDF_Array* pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W"));
+ if (pWidthArray) {
+ LoadMetricsArray(pWidthArray, m_WidthList, 1);
+ }
+ if (!IsEmbedded()) {
+ LoadSubstFont();
+ }
+ if (1) {
+ if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) {
+ CPDF_Object* pmap = pCIDFontDict->GetElementValue(FX_BSTRC("CIDToGIDMap"));
+ if (pmap) {
+ if (pmap->GetType() == PDFOBJ_STREAM) {
+ m_pCIDToGIDMap = FX_NEW CPDF_StreamAcc;
+ m_pCIDToGIDMap->LoadAllData((CPDF_Stream*)pmap, FALSE);
+ } else if (pmap->GetString() == FX_BSTRC("Identity")) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (m_pFontFile) {
+ m_bCIDIsGID = TRUE;
+ }
+#else
+ m_bCIDIsGID = TRUE;
+#endif
+ }
+ }
+ }
+ }
+ CheckFontMetrics();
+ if (IsVertWriting()) {
+ pWidthArray = pCIDFontDict->GetArray(FX_BSTRC("W2"));
+ if (pWidthArray) {
+ LoadMetricsArray(pWidthArray, m_VertMetrics, 3);
+ }
+ CPDF_Array* pDefaultArray = pCIDFontDict->GetArray(FX_BSTRC("DW2"));
+ if (pDefaultArray) {
+ m_DefaultVY = pDefaultArray->GetInteger(0);
+ m_DefaultW1 = pDefaultArray->GetInteger(1);
+ } else {
+ m_DefaultVY = 880;
+ m_DefaultW1 = -1000;
+ }
+ }
+ return TRUE;
+}
+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)
+{
+ if (ch < 128) {
+ return ch * 1.0f / 127;
+ }
+ return (-255 + ch) * 1.0f / 127;
+}
+void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level)
+{
+ if (charcode < 256 && m_CharBBox[charcode].Right != -1) {
+ rect.bottom = m_CharBBox[charcode].Bottom;
+ rect.left = m_CharBBox[charcode].Left;
+ rect.right = m_CharBBox[charcode].Right;
+ rect.top = m_CharBBox[charcode].Top;
+ return;
+ }
+ FX_BOOL bVert = FALSE;
+ int glyph_index = GlyphFromCharCode(charcode, &bVert);
+ if (m_Font.m_Face == NULL) {
+ rect = FX_RECT(0, 0, 0, 0);
+ } else {
+ rect.left = rect.bottom = rect.right = rect.top = 0;
+ FXFT_Face face = m_Font.m_Face;
+ if (FXFT_Is_Face_Tricky(face)) {
+ int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (!err) {
+ FXFT_BBox cbox;
+ FXFT_Glyph glyph;
+ err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph);
+ if (!err) {
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem;
+ int pixel_size_y = ((FXFT_Face)face)->size->metrics.y_ppem;
+ if (pixel_size_x == 0 || pixel_size_y == 0) {
+ rect.left = cbox.xMin;
+ rect.right = cbox.xMax;
+ rect.top = cbox.yMax;
+ rect.bottom = cbox.yMin;
+ } else {
+ rect.left = cbox.xMin * 1000 / pixel_size_x;
+ rect.right = cbox.xMax * 1000 / pixel_size_x;
+ rect.top = cbox.yMax * 1000 / pixel_size_y;
+ rect.bottom = cbox.yMin * 1000 / pixel_size_y;
+ }
+ if (rect.top > FXFT_Get_Face_Ascender(face)) {
+ rect.top = FXFT_Get_Face_Ascender(face);
+ }
+ if (rect.bottom < FXFT_Get_Face_Descender(face)) {
+ rect.bottom = FXFT_Get_Face_Descender(face);
+ }
+ FXFT_Done_Glyph(glyph);
+ }
+ }
+ } else {
+ int err = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_SCALE);
+ if (err == 0) {
+ rect.left = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face), face);
+ rect.right = TT2PDF(FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), face);
+ rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face);
+ rect.top += rect.top / 64;
+ rect.bottom = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), face);
+ }
+ }
+ }
+ if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) {
+ FX_WORD CID = CIDFromCharCode(charcode);
+ FX_LPCBYTE pTransform = GetCIDTransform(CID);
+ if (pTransform && !bVert) {
+ CFX_AffineMatrix matrix(_CIDTransformToFloat(pTransform[0]), _CIDTransformToFloat(pTransform[1]),
+ _CIDTransformToFloat(pTransform[2]), _CIDTransformToFloat(pTransform[3]),
+ _CIDTransformToFloat(pTransform[4]) * 1000 , _CIDTransformToFloat(pTransform[5]) * 1000);
+ CFX_FloatRect rect_f(rect);
+ rect_f.Transform(&matrix);
+ rect = rect_f.GetOutterRect();
+ }
+ }
+ if (charcode < 256) {
+ m_CharBBox[charcode].Bottom = (short)rect.bottom;
+ m_CharBBox[charcode].Left = (short)rect.left;
+ m_CharBBox[charcode].Right = (short)rect.right;
+ m_CharBBox[charcode].Top = (short)rect.top;
+ }
+}
+int CPDF_CIDFont::GetCharWidthF(FX_DWORD charcode, int level)
+{
+ if (m_pAnsiWidths && charcode < 0x80) {
+ return m_pAnsiWidths[charcode];
+ }
+ FX_WORD cid = CIDFromCharCode(charcode);
+ int size = m_WidthList.GetSize();
+ FX_DWORD* list = m_WidthList.GetData();
+ for (int i = 0; i < size; i += 3) {
+ if (cid >= list[i] && cid <= list[i + 1]) {
+ return (int)list[i + 2];
+ }
+ }
+ return m_DefaultWidth;
+}
+short CPDF_CIDFont::GetVertWidth(FX_WORD CID) const
+{
+ FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
+ if (vertsize == 0) {
+ return m_DefaultW1;
+ }
+ const FX_DWORD* pTable = m_VertMetrics.GetData();
+ for (FX_DWORD i = 0; i < vertsize; i ++)
+ if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
+ return (short)(int)pTable[i * 5 + 2];
+ }
+ return m_DefaultW1;
+}
+void CPDF_CIDFont::GetVertOrigin(FX_WORD CID, short& vx, short &vy) const
+{
+ FX_DWORD vertsize = m_VertMetrics.GetSize() / 5;
+ if (vertsize) {
+ const FX_DWORD* pTable = m_VertMetrics.GetData();
+ for (FX_DWORD i = 0; i < vertsize; i ++)
+ if (pTable[i * 5] <= CID && pTable[i * 5 + 1] >= CID) {
+ vx = (short)(int)pTable[i * 5 + 3];
+ vy = (short)(int)pTable[i * 5 + 4];
+ return;
+ }
+ }
+ FX_DWORD dwWidth = m_DefaultWidth;
+ int size = m_WidthList.GetSize();
+ const FX_DWORD* list = m_WidthList.GetData();
+ for (int i = 0; i < size; i += 3) {
+ if (CID >= list[i] && CID <= list[i + 1]) {
+ dwWidth = (FX_WORD)list[i + 2];
+ break;
+ }
+ }
+ vx = (short)dwWidth / 2;
+ vy = (short)m_DefaultVY;
+}
+int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode );
+ if (unicode == 0x2502) {
+ return index;
+ }
+ if (index && IsVertWriting()) {
+ if (m_pTTGSUBTable) {
+ TT_uint32_t vindex = 0;
+ m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
+ if (vindex) {
+ index = vindex;
+ if (pVertGlyph) {
+ *pVertGlyph = TRUE;
+ }
+ }
+ return index;
+ }
+ if (NULL == m_Font.m_pGsubData) {
+ unsigned long length = 0;
+ int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+ if (!error) {
+ m_Font.m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
+ }
+ }
+ int error = FXFT_Load_Sfnt_Table( m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, m_Font.m_pGsubData, NULL);
+ if (!error && m_Font.m_pGsubData) {
+ m_pTTGSUBTable = FX_NEW CFX_CTTGSUBTable;
+ m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData);
+ TT_uint32_t vindex = 0;
+ m_pTTGSUBTable->GetVerticalGlyph(index, &vindex);
+ if (vindex) {
+ index = vindex;
+ if (pVertGlyph) {
+ *pVertGlyph = TRUE;
+ }
+ }
+ }
+ return index;
+ }
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ return index;
+}
+int CPDF_CIDFont::GlyphFromCharCode(FX_DWORD charcode, FX_BOOL *pVertGlyph)
+{
+ if (pVertGlyph) {
+ *pVertGlyph = FALSE;
+ }
+ if (m_pFontFile == NULL && m_pCIDToGIDMap == NULL) {
+ FX_WORD cid = CIDFromCharCode(charcode);
+ FX_WCHAR unicode = 0;
+ if (m_bCIDIsGID) {
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ return cid;
+#else
+ if (m_Flags & PDFFONT_SYMBOLIC) {
+ return cid;
+ }
+ CFX_WideString uni_str = UnicodeFromCharCode(charcode);
+ if (uni_str.IsEmpty()) {
+ return cid;
+ }
+ unicode = uni_str.GetAt(0);
+#endif
+ } else {
+ if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) {
+ unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid);
+ }
+ if (unicode == 0) {
+ unicode = _UnicodeFromCharCode(charcode);
+ }
+ if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) {
+ unicode = UnicodeFromCharCode(charcode).GetAt(0);
+ }
+ }
+ if (unicode == 0) {
+ if (!m_bAdobeCourierStd) {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ charcode += 31;
+ int index = 0, iBaseEncoding;
+ FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1);
+ FX_BOOL bMacRoman = FALSE;
+ if (!bMSUnicode) {
+ bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0);
+ }
+ iBaseEncoding = PDFFONT_ENCODING_STANDARD;
+ if (bMSUnicode) {
+ iBaseEncoding = PDFFONT_ENCODING_WINANSI;
+ } else if (bMacRoman) {
+ iBaseEncoding = PDFFONT_ENCODING_MACROMAN;
+ }
+ FX_LPCSTR name = GetAdobeCharName(iBaseEncoding, NULL, charcode);
+ if (name == NULL) {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ FX_WORD unicode = PDF_UnicodeFromAdobeName(name);
+ if (unicode) {
+ if (bMSUnicode) {
+ index = FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ } else if (bMacRoman) {
+ FX_DWORD maccode = FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode);
+ index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char *)name) : FXFT_Get_Char_Index(m_Font.m_Face, maccode);
+ } else {
+ return FXFT_Get_Char_Index(m_Font.m_Face, unicode);
+ }
+ } else {
+ return charcode == 0 ? -1 : (int)charcode;
+ }
+ if (index == 0 || index == 0xffff) {
+ return charcode == 0 ? -1 : (int)charcode;
+ } else {
+ return index;
+ }
+ }
+ if (m_Charset == CIDSET_JAPAN1) {
+ if (unicode == '\\') {
+ unicode = '/';
+ }
+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ else if (unicode == 0xa5) {
+ unicode = 0x5c;
+ }
+#endif
+ }
+ if (m_Font.m_Face == NULL) {
+ return unicode;
+ }
+ int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE);
+ if (err != 0) {
+ int i;
+ for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i ++) {
+ FX_DWORD ret = FT_CharCodeFromUnicode(FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), (FX_WCHAR)charcode);
+ if (ret == 0) {
+ continue;
+ }
+ FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]);
+ unicode = (FX_WCHAR)ret;
+ break;
+ }
+ if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) {
+ FXFT_Set_Charmap(m_Font.m_Face, FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]);
+ unicode = (FX_WCHAR)charcode;
+ }
+ }
+ if (FXFT_Get_Face_Charmap(m_Font.m_Face)) {
+ int index = GetGlyphIndex(unicode, pVertGlyph);
+ if (index == 0) {
+ return -1;
+ }
+ return index;
+ }
+ return unicode ;
+ }
+ if (m_Font.m_Face == NULL) {
+ return -1;
+ }
+ FX_WORD cid = CIDFromCharCode(charcode);
+ if (m_bType1) {
+ if (NULL == m_pCIDToGIDMap) {
+ return cid;
+ }
+ } else {
+ if (m_pCIDToGIDMap == NULL) {
+ if (m_pFontFile && m_pCMap->m_pMapping == NULL) {
+ return cid;
+ }
+ if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) {
+ return cid;
+ }
+ if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == FXFT_ENCODING_UNICODE) {
+ CFX_WideString unicode_str = UnicodeFromCharCode(charcode);
+ if (unicode_str.IsEmpty()) {
+ return -1;
+ }
+ charcode = unicode_str.GetAt(0);
+ }
+ return GetGlyphIndex(charcode, pVertGlyph);
+ }
+ }
+ FX_DWORD byte_pos = cid * 2;
+ if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) {
+ return -1;
+ }
+ FX_LPCBYTE pdata = m_pCIDToGIDMap->GetData() + byte_pos;
+ return pdata[0] * 256 + pdata[1];
+}
+FX_DWORD CPDF_CIDFont::GetNextChar(FX_LPCSTR pString, int& offset) const
+{
+ return m_pCMap->GetNextChar(pString, offset);
+}
+int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const
+{
+ return m_pCMap->GetCharSize(charcode);
+}
+int CPDF_CIDFont::CountChar(FX_LPCSTR pString, int size) const
+{
+ return m_pCMap->CountChar(pString, size);
+}
+int CPDF_CIDFont::AppendChar(FX_LPSTR str, FX_DWORD charcode) const
+{
+ return m_pCMap->AppendChar(str, charcode);
+}
+FX_BOOL CPDF_CIDFont::IsUnicodeCompatible() const
+{
+ if (!m_pCMap->IsLoaded() || m_pCID2UnicodeMap == NULL || !m_pCID2UnicodeMap->IsLoaded()) {
+ return m_pCMap->m_Coding != CIDCODING_UNKNOWN;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CIDFont::IsFontStyleFromCharCode(FX_DWORD charcode) const
+{
+ return TRUE;
+}
+void CPDF_CIDFont::LoadSubstFont()
+{
+ m_Font.LoadSubst(m_BaseFont, !m_bType1, m_Flags, m_StemV * 5, m_ItalicAngle, g_CharsetCPs[m_Charset], IsVertWriting());
+}
+void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, CFX_DWordArray& result, int nElements)
+{
+ int width_status = 0;
+ int iCurElement = 0;
+ int first_code = 0, last_code;
+ FX_DWORD count = pArray->GetCount();
+ for (FX_DWORD i = 0; i < count; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj == NULL) {
+ continue;
+ }
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ if (width_status != 1) {
+ return;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ FX_DWORD count = pArray->GetCount();
+ for (FX_DWORD j = 0; j < count; j += nElements) {
+ result.Add(first_code);
+ result.Add(first_code);
+ for (int k = 0; k < nElements; k ++) {
+ result.Add(pArray->GetInteger(j + k));
+ }
+ first_code ++;
+ }
+ width_status = 0;
+ } else {
+ if (width_status == 0) {
+ first_code = pObj->GetInteger();
+ width_status = 1;
+ } else if (width_status == 1) {
+ last_code = pObj->GetInteger();
+ width_status = 2;
+ iCurElement = 0;
+ } else {
+ if (!iCurElement) {
+ result.Add(first_code);
+ result.Add(last_code);
+ }
+ result.Add(pObj->GetInteger());
+ iCurElement ++;
+ if (iCurElement == nElements) {
+ width_status = 0;
+ }
+ }
+ }
+ }
+}
+FX_BOOL CPDF_CIDFont::LoadGB2312()
+{
+ m_BaseFont = m_pFontDict->GetString(FX_BSTRC("BaseFont"));
+ CPDF_Dictionary* pFontDesc = m_pFontDict->GetDict(FX_BSTRC("FontDescriptor"));
+ if (pFontDesc) {
+ LoadFontDescriptor(pFontDesc);
+ }
+ m_Charset = CIDSET_GB1;
+ m_bType1 = FALSE;
+ m_pCMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetPredefinedCMap(
+ FX_BSTRC("GBK-EUC-H"), FALSE);
+ m_pCID2UnicodeMap = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals()->m_CMapManager.GetCID2UnicodeMap(m_Charset, FALSE);
+ if (!IsEmbedded()) {
+ LoadSubstFont();
+ }
+ CheckFontMetrics();
+ m_DefaultWidth = 1000;
+ m_pAnsiWidths = FX_Alloc(FX_WORD, 128);
+ FXSYS_memset32(m_pAnsiWidths, 0, 128 * sizeof(FX_WORD));
+ for (int i = 32; i < 127; i ++) {
+ m_pAnsiWidths[i] = 500;
+ }
+ return TRUE;
+}
+const struct _CIDTransform {
+ FX_WORD CID;
+ FX_BYTE a, b, c, d, e, f;
+}
+Japan1_VertCIDs[] = {
+ {97, 129, 0, 0, 127, 55, 0},
+ {7887, 127, 0, 0, 127, 76, 89},
+ {7888, 127, 0, 0, 127, 79, 94},
+ {7889, 0, 129, 127, 0, 17, 127},
+ {7890, 0, 129, 127, 0, 17, 127},
+ {7891, 0, 129, 127, 0, 17, 127},
+ {7892, 0, 129, 127, 0, 17, 127},
+ {7893, 0, 129, 127, 0, 17, 127},
+ {7894, 0, 129, 127, 0, 17, 127},
+ {7895, 0, 129, 127, 0, 17, 127},
+ {7896, 0, 129, 127, 0, 17, 127},
+ {7897, 0, 129, 127, 0, 17, 127},
+ {7898, 0, 129, 127, 0, 17, 127},
+ {7899, 0, 129, 127, 0, 17, 104},
+ {7900, 0, 129, 127, 0, 17, 127},
+ {7901, 0, 129, 127, 0, 17, 104},
+ {7902, 0, 129, 127, 0, 17, 127},
+ {7903, 0, 129, 127, 0, 17, 127},
+ {7904, 0, 129, 127, 0, 17, 127},
+ {7905, 0, 129, 127, 0, 17, 114},
+ {7906, 0, 129, 127, 0, 17, 127},
+ {7907, 0, 129, 127, 0, 17, 127},
+ {7908, 0, 129, 127, 0, 17, 127},
+ {7909, 0, 129, 127, 0, 17, 127},
+ {7910, 0, 129, 127, 0, 17, 127},
+ {7911, 0, 129, 127, 0, 17, 127},
+ {7912, 0, 129, 127, 0, 17, 127},
+ {7913, 0, 129, 127, 0, 17, 127},
+ {7914, 0, 129, 127, 0, 17, 127},
+ {7915, 0, 129, 127, 0, 17, 114},
+ {7916, 0, 129, 127, 0, 17, 127},
+ {7917, 0, 129, 127, 0, 17, 127},
+ {7918, 127, 0, 0, 127, 18, 25},
+ {7919, 127, 0, 0, 127, 18, 25},
+ {7920, 127, 0, 0, 127, 18, 25},
+ {7921, 127, 0, 0, 127, 18, 25},
+ {7922, 127, 0, 0, 127, 18, 25},
+ {7923, 127, 0, 0, 127, 18, 25},
+ {7924, 127, 0, 0, 127, 18, 25},
+ {7925, 127, 0, 0, 127, 18, 25},
+ {7926, 127, 0, 0, 127, 18, 25},
+ {7927, 127, 0, 0, 127, 18, 25},
+ {7928, 127, 0, 0, 127, 18, 25},
+ {7929, 127, 0, 0, 127, 18, 25},
+ {7930, 127, 0, 0, 127, 18, 25},
+ {7931, 127, 0, 0, 127, 18, 25},
+ {7932, 127, 0, 0, 127, 18, 25},
+ {7933, 127, 0, 0, 127, 18, 25},
+ {7934, 127, 0, 0, 127, 18, 25},
+ {7935, 127, 0, 0, 127, 18, 25},
+ {7936, 127, 0, 0, 127, 18, 25},
+ {7937, 127, 0, 0, 127, 18, 25},
+ {7938, 127, 0, 0, 127, 18, 25},
+ {7939, 127, 0, 0, 127, 18, 25},
+ {8720, 0, 129, 127, 0, 19, 102},
+ {8721, 0, 129, 127, 0, 13, 127},
+ {8722, 0, 129, 127, 0, 19, 108},
+ {8723, 0, 129, 127, 0, 19, 102},
+ {8724, 0, 129, 127, 0, 19, 102},
+ {8725, 0, 129, 127, 0, 19, 102},
+ {8726, 0, 129, 127, 0, 19, 102},
+ {8727, 0, 129, 127, 0, 19, 102},
+ {8728, 0, 129, 127, 0, 19, 114},
+ {8729, 0, 129, 127, 0, 19, 114},
+ {8730, 0, 129, 127, 0, 38, 108},
+ {8731, 0, 129, 127, 0, 13, 108},
+ {8732, 0, 129, 127, 0, 19, 108},
+ {8733, 0, 129, 127, 0, 19, 108},
+ {8734, 0, 129, 127, 0, 19, 108},
+ {8735, 0, 129, 127, 0, 19, 108},
+ {8736, 0, 129, 127, 0, 19, 102},
+ {8737, 0, 129, 127, 0, 19, 102},
+ {8738, 0, 129, 127, 0, 19, 102},
+ {8739, 0, 129, 127, 0, 19, 102},
+ {8740, 0, 129, 127, 0, 19, 102},
+ {8741, 0, 129, 127, 0, 19, 102},
+ {8742, 0, 129, 127, 0, 19, 102},
+ {8743, 0, 129, 127, 0, 19, 102},
+ {8744, 0, 129, 127, 0, 19, 102},
+ {8745, 0, 129, 127, 0, 19, 102},
+ {8746, 0, 129, 127, 0, 19, 114},
+ {8747, 0, 129, 127, 0, 19, 114},
+ {8748, 0, 129, 127, 0, 19, 102},
+ {8749, 0, 129, 127, 0, 19, 102},
+ {8750, 0, 129, 127, 0, 19, 102},
+ {8751, 0, 129, 127, 0, 19, 102},
+ {8752, 0, 129, 127, 0, 19, 102},
+ {8753, 0, 129, 127, 0, 19, 102},
+ {8754, 0, 129, 127, 0, 19, 102},
+ {8755, 0, 129, 127, 0, 19, 102},
+ {8756, 0, 129, 127, 0, 19, 102},
+ {8757, 0, 129, 127, 0, 19, 102},
+ {8758, 0, 129, 127, 0, 19, 102},
+ {8759, 0, 129, 127, 0, 19, 102},
+ {8760, 0, 129, 127, 0, 19, 102},
+ {8761, 0, 129, 127, 0, 19, 102},
+ {8762, 0, 129, 127, 0, 19, 102},
+ {8763, 0, 129, 127, 0, 19, 102},
+ {8764, 0, 129, 127, 0, 19, 102},
+ {8765, 0, 129, 127, 0, 19, 102},
+ {8766, 0, 129, 127, 0, 19, 102},
+ {8767, 0, 129, 127, 0, 19, 102},
+ {8768, 0, 129, 127, 0, 19, 102},
+ {8769, 0, 129, 127, 0, 19, 102},
+ {8770, 0, 129, 127, 0, 19, 102},
+ {8771, 0, 129, 127, 0, 19, 102},
+ {8772, 0, 129, 127, 0, 19, 102},
+ {8773, 0, 129, 127, 0, 19, 102},
+ {8774, 0, 129, 127, 0, 19, 102},
+ {8775, 0, 129, 127, 0, 19, 102},
+ {8776, 0, 129, 127, 0, 19, 102},
+ {8777, 0, 129, 127, 0, 19, 102},
+ {8778, 0, 129, 127, 0, 19, 102},
+ {8779, 0, 129, 127, 0, 19, 114},
+ {8780, 0, 129, 127, 0, 19, 108},
+ {8781, 0, 129, 127, 0, 19, 114},
+ {8782, 0, 129, 127, 0, 13, 114},
+ {8783, 0, 129, 127, 0, 19, 108},
+ {8784, 0, 129, 127, 0, 13, 114},
+ {8785, 0, 129, 127, 0, 19, 108},
+ {8786, 0, 129, 127, 0, 19, 108},
+ {8787, 0, 129, 127, 0, 19, 108},
+ {8788, 0, 129, 127, 0, 19, 108},
+ {8789, 0, 129, 127, 0, 19, 108},
+ {8790, 0, 129, 127, 0, 19, 108},
+ {8791, 0, 129, 127, 0, 19, 108},
+ {8792, 0, 129, 127, 0, 19, 108},
+ {8793, 0, 129, 127, 0, 19, 108},
+ {8794, 0, 129, 127, 0, 19, 108},
+ {8795, 0, 129, 127, 0, 19, 108},
+ {8796, 0, 129, 127, 0, 19, 108},
+ {8797, 0, 129, 127, 0, 19, 108},
+ {8798, 0, 129, 127, 0, 19, 108},
+ {8799, 0, 129, 127, 0, 19, 108},
+ {8800, 0, 129, 127, 0, 19, 108},
+ {8801, 0, 129, 127, 0, 19, 108},
+ {8802, 0, 129, 127, 0, 19, 108},
+ {8803, 0, 129, 127, 0, 19, 108},
+ {8804, 0, 129, 127, 0, 19, 108},
+ {8805, 0, 129, 127, 0, 19, 108},
+ {8806, 0, 129, 127, 0, 19, 108},
+ {8807, 0, 129, 127, 0, 19, 108},
+ {8808, 0, 129, 127, 0, 19, 108},
+ {8809, 0, 129, 127, 0, 19, 108},
+ {8810, 0, 129, 127, 0, 19, 108},
+ {8811, 0, 129, 127, 0, 19, 114},
+ {8812, 0, 129, 127, 0, 19, 102},
+ {8813, 0, 129, 127, 0, 19, 114},
+ {8814, 0, 129, 127, 0, 76, 102},
+ {8815, 0, 129, 127, 0, 13, 121},
+ {8816, 0, 129, 127, 0, 19, 114},
+ {8817, 0, 129, 127, 0, 19, 127},
+ {8818, 0, 129, 127, 0, 19, 114},
+ {8819, 0, 129, 127, 0, 218, 108},
+};
+FX_LPCBYTE CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const
+{
+ if (m_Charset != CIDSET_JAPAN1 || m_pFontFile != NULL) {
+ return NULL;
+ }
+ int begin = 0;
+ int end = sizeof Japan1_VertCIDs / sizeof(struct _CIDTransform) - 1;
+ while (begin <= end) {
+ int middle = (begin + end) / 2;
+ FX_WORD middlecode = Japan1_VertCIDs[middle].CID;
+ if (middlecode > CID) {
+ end = middle - 1;
+ } else if (middlecode < CID) {
+ begin = middle + 1;
+ } else {
+ return &Japan1_VertCIDs[middle].a;
+ }
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
new file mode 100644
index 0000000000..7810fe80a9
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp
@@ -0,0 +1,97 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_resource.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "font_int.h"
+#ifndef _FPDFAPI_MINI_
+typedef struct {
+ FXSYS_FILE* m_pFile;
+ int m_nFiles;
+ int m_IndexSize;
+ int m_IndexOffset;
+} FXFC_PACKAGE;
+FX_LPVOID FXFC_LoadPackage(FX_LPCSTR name)
+{
+ FXSYS_FILE* file = FXSYS_fopen(name, (FX_LPCSTR)"rb");
+ if (file == NULL) {
+ return NULL;
+ }
+ FX_BYTE buf[256];
+ size_t read = FXSYS_fread(buf, 1, 20, file);
+ if (*(FX_DWORD*)buf != 0x43465846) {
+ FXSYS_fclose(file);
+ return NULL;
+ }
+ FXFC_PACKAGE* pPackage = FX_Alloc(FXFC_PACKAGE, 1);
+ pPackage->m_pFile = file;
+ pPackage->m_nFiles = *(int*)(buf + 8);
+ pPackage->m_IndexSize = *(int*)(buf + 12);
+ pPackage->m_IndexOffset = *(int*)(buf + 16);
+ return pPackage;
+}
+void FXFC_ClosePackage(FX_LPVOID p)
+{
+ FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
+ FXSYS_fclose(pPackage->m_pFile);
+ FX_Free(pPackage);
+}
+FX_BOOL FXFC_LoadFile(FX_LPVOID p, FX_LPCSTR name, FX_LPBYTE& pBuffer, FX_DWORD& size)
+{
+ FXFC_PACKAGE* pPackage = (FXFC_PACKAGE*)p;
+ FXSYS_fseek(pPackage->m_pFile, pPackage->m_IndexOffset, FXSYS_SEEK_SET);
+ FX_BYTE buf[128];
+ size_t read = 0;
+ for (int i = 0; i < pPackage->m_nFiles; i ++) {
+ read = FXSYS_fread(buf, pPackage->m_IndexSize, 1, pPackage->m_pFile);
+ if (FXSYS_stricmp((FX_LPCSTR)buf, name) == 0) {
+ FX_DWORD offset = *(FX_DWORD*)&buf[64];
+ size = *(FX_DWORD*)&buf[68];
+ pBuffer = FX_Alloc(FX_BYTE, size);
+ FXSYS_fseek(pPackage->m_pFile, offset, FXSYS_SEEK_SET);
+ read = FXSYS_fread(pBuffer, size, 1, pPackage->m_pFile);
+ if (buf[72]) {
+ FX_DWORD orig_size;
+ FX_LPBYTE comp_buf = pBuffer;
+ CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(FALSE, comp_buf, size, FALSE,
+ 0, 0, 0, 0, 0, pBuffer, orig_size);
+ FX_Free(comp_buf);
+ size = orig_size;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FXMP::LoadFile(FX_LPVOID pPackage, FX_LPCSTR fileid)
+{
+ if (m_pHeader) {
+ FX_Free(m_pHeader);
+ m_pHeader = NULL;
+ }
+ m_pTable = NULL;
+ FX_DWORD size;
+ if (!FXFC_LoadFile(pPackage, fileid, (FX_LPBYTE&)m_pHeader, size)) {
+ return FALSE;
+ }
+ if (FXSYS_memcmp32(m_pHeader, "FXMP", 4)) {
+ return FALSE;
+ }
+ m_pTable = (FX_LPBYTE)m_pHeader + m_pHeader->dwDataOffset;
+ return TRUE;
+}
+FX_LPBYTE CPDF_FXMP::GetRecord(FX_DWORD index)
+{
+ if (m_pTable == NULL) {
+ return NULL;
+ }
+ if ((int)index < (int)m_pHeader->dwStartIndex || index > m_pHeader->dwEndIndex) {
+ return NULL;
+ }
+ return m_pTable + (index - m_pHeader->dwStartIndex) * m_pHeader->dwRecordSize;
+}
+#endif
diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
new file mode 100644
index 0000000000..b7a7864c2d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.cpp
@@ -0,0 +1,452 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "ttgsubtable.h"
+CFX_GlyphMap::CFX_GlyphMap()
+{
+}
+CFX_GlyphMap::~CFX_GlyphMap()
+{
+}
+extern "C" {
+ static int _CompareInt(const void* p1, const void* p2)
+ {
+ return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
+ }
+};
+struct _IntPair {
+ FX_INT32 key;
+ FX_INT32 value;
+};
+void CFX_GlyphMap::SetAt(int key, int value)
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_IntPair);
+ _IntPair* buf = (_IntPair*)m_Buffer.GetBuffer();
+ _IntPair pair = {key, value};
+ if (count == 0 || key > buf[count - 1].key) {
+ m_Buffer.AppendBlock(&pair, sizeof(_IntPair));
+ return;
+ }
+ int low = 0, high = count - 1;
+ while (low <= high) {
+ int mid = (low + high) / 2;
+ if (buf[mid].key < key) {
+ low = mid + 1;
+ } else if (buf[mid].key > key) {
+ high = mid - 1;
+ } else {
+ buf[mid].value = value;
+ return;
+ }
+ }
+ m_Buffer.InsertBlock(low * sizeof(_IntPair), &pair, sizeof(_IntPair));
+}
+FX_BOOL CFX_GlyphMap::Lookup(int key, int &value)
+{
+ FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_IntPair),
+ sizeof(_IntPair), _CompareInt);
+ if (pResult == NULL) {
+ return FALSE;
+ }
+ value = ((FX_DWORD*)pResult)[1];
+ return TRUE;
+}
+bool CFX_CTTGSUBTable::LoadGSUBTable(FT_Bytes gsub)
+{
+ header.Version = gsub[0] << 24 | gsub[1] << 16 | gsub[2] << 8 | gsub[3];
+ if(header.Version != 0x00010000) {
+ return false;
+ }
+ header.ScriptList = gsub[4] << 8 | gsub[5];
+ header.FeatureList = gsub[6] << 8 | gsub[7];
+ header.LookupList = gsub[8] << 8 | gsub[9];
+ return Parse(
+ &gsub[header.ScriptList],
+ &gsub[header.FeatureList],
+ &gsub[header.LookupList]);
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum)
+{
+ TT_uint32_t tag[] = {
+ (TT_uint8_t)'v' << 24 |
+ (TT_uint8_t)'r' << 16 |
+ (TT_uint8_t)'t' << 8 |
+ (TT_uint8_t)'2',
+ (TT_uint8_t)'v' << 24 |
+ (TT_uint8_t)'e' << 16 |
+ (TT_uint8_t)'r' << 8 |
+ (TT_uint8_t)'t',
+ };
+ if (!m_bFeautureMapLoad) {
+ for (int i = 0; i < ScriptList.ScriptCount; i++) {
+ for (int j = 0; j < (ScriptList.ScriptRecord + i)->Script.LangSysCount; ++j) {
+ for (int k = 0; k < ((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureCount; ++k) {
+ FX_DWORD index = *(((ScriptList.ScriptRecord + i)->Script.LangSysRecord + j)->LangSys.FeatureIndex + k);
+ if (FeatureList.FeatureRecord[index].FeatureTag == tag[0] || FeatureList.FeatureRecord[index].FeatureTag == tag[1]) {
+ FX_DWORD value;
+ if (!m_featureMap.Lookup(index, value)) {
+ m_featureMap.SetAt(index, index);
+ }
+ }
+ }
+ }
+ }
+ if (!m_featureMap.GetStartPosition()) {
+ for (int i = 0; i < FeatureList.FeatureCount; i ++) {
+ if (FeatureList.FeatureRecord[i].FeatureTag == tag[0] || FeatureList.FeatureRecord[i].FeatureTag == tag[1]) {
+ FX_DWORD value;
+ if (!m_featureMap.Lookup(i, value)) {
+ m_featureMap.SetAt(i, i);
+ }
+ }
+ }
+ }
+ m_bFeautureMapLoad = TRUE;
+ }
+ FX_POSITION pos = m_featureMap.GetStartPosition();
+ while (pos) {
+ FX_DWORD index, value;
+ m_featureMap.GetNextAssoc(pos, index, value);
+ if(GetVerticalGlyphSub(glyphnum, vglyphnum, &FeatureList.FeatureRecord[value].Feature)) {
+ return true;
+ }
+ }
+ return false;
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyphSub(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TFeature *Feature)
+{
+ for(int i = 0; i < Feature->LookupCount; i++) {
+ int index = Feature->LookupListIndex[i];
+ if(index < 0 || LookupList.LookupCount < index) {
+ continue;
+ }
+ if(LookupList.Lookup[index].LookupType == 1) {
+ if(GetVerticalGlyphSub2(
+ glyphnum,
+ vglyphnum,
+ &LookupList.Lookup[index])) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+bool CFX_CTTGSUBTable::GetVerticalGlyphSub2(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TLookup *Lookup)
+{
+ for(int i = 0; i < Lookup->SubTableCount; i++) {
+ switch(Lookup->SubTable[i]->SubstFormat) {
+ case 1: {
+ TSingleSubstFormat1 *tbl1 = (TSingleSubstFormat1*)Lookup->SubTable[i];
+ if(GetCoverageIndex(tbl1->Coverage, glyphnum) >= 0) {
+ *vglyphnum = glyphnum + tbl1->DeltaGlyphID;
+ return true;
+ }
+ break;
+ }
+ case 2: {
+ TSingleSubstFormat2 *tbl2 = (TSingleSubstFormat2*)Lookup->SubTable[i];
+ int index = -1;
+ index = GetCoverageIndex(tbl2->Coverage, glyphnum);
+ if(0 <= index && index < tbl2->GlyphCount) {
+ *vglyphnum = tbl2->Substitute[index];
+ return true;
+ }
+ break;
+ }
+ }
+ }
+ return false;
+}
+int CFX_CTTGSUBTable::GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g)
+{
+ int i = 0;
+ if(Coverage == NULL) {
+ return -1;
+ }
+ switch(Coverage->CoverageFormat) {
+ case 1: {
+ TCoverageFormat1 *c1 = (TCoverageFormat1*)Coverage;
+ for(i = 0; i < c1->GlyphCount; i++) {
+ if((TT_uint32_t)c1->GlyphArray[i] == g) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ case 2: {
+ TCoverageFormat2 *c2 = (TCoverageFormat2*)Coverage;
+ for(i = 0; i < c2->RangeCount; i++) {
+ TT_uint32_t s = c2->RangeRecord[i].Start;
+ TT_uint32_t e = c2->RangeRecord[i].End;
+ TT_uint32_t si = c2->RangeRecord[i].StartCoverageIndex;
+ if (s <= g && g <= e) {
+ return si + g - s;
+ }
+ }
+ return -1;
+ }
+ }
+ return -1;
+}
+bool CFX_CTTGSUBTable::Parse(
+ FT_Bytes scriptlist,
+ FT_Bytes featurelist,
+ FT_Bytes lookuplist)
+{
+ ParseScriptList(scriptlist, &ScriptList);
+ ParseFeatureList(featurelist, &FeatureList);
+ ParseLookupList(lookuplist, &LookupList);
+ return true;
+}
+void CFX_CTTGSUBTable::ParseScriptList(FT_Bytes raw, struct TScriptList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->ScriptCount = GetUInt16(sp);
+ if(rec->ScriptCount <= 0) {
+ return;
+ }
+ rec->ScriptRecord = new struct TScriptRecord[rec->ScriptCount];
+ for(i = 0; i < rec->ScriptCount; i++) {
+ rec->ScriptRecord[i].ScriptTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseScript(
+ &raw[offset],
+ &rec->ScriptRecord[i].Script);
+ }
+}
+void CFX_CTTGSUBTable::ParseScript(FT_Bytes raw, struct TScript *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->DefaultLangSys = GetUInt16(sp);
+ rec->LangSysCount = GetUInt16(sp);
+ if(rec->LangSysCount <= 0) {
+ return;
+ }
+ rec->LangSysRecord = new struct TLangSysRecord[rec->LangSysCount];
+ for(i = 0; i < rec->LangSysCount; i++) {
+ rec->LangSysRecord[i].LangSysTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseLangSys(
+ &raw[offset],
+ &rec->LangSysRecord[i].LangSys);
+ }
+}
+void CFX_CTTGSUBTable::ParseLangSys(FT_Bytes raw, struct TLangSys *rec)
+{
+ FT_Bytes sp = raw;
+ rec->LookupOrder = GetUInt16(sp);
+ rec->ReqFeatureIndex = GetUInt16(sp);
+ rec->FeatureCount = GetUInt16(sp);
+ if(rec->FeatureCount <= 0) {
+ return;
+ }
+ rec->FeatureIndex = new TT_uint16_t[rec->FeatureCount];
+ FXSYS_memset32(rec->FeatureIndex, 0, sizeof(TT_uint16_t) * rec->FeatureCount);
+ for (int i = 0; i < rec->FeatureCount; ++i) {
+ rec->FeatureIndex[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseFeatureList(FT_Bytes raw, TFeatureList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->FeatureCount = GetUInt16(sp);
+ if(rec->FeatureCount <= 0) {
+ return;
+ }
+ rec->FeatureRecord = new struct TFeatureRecord[rec->FeatureCount];
+ for(i = 0; i < rec->FeatureCount; i++) {
+ rec->FeatureRecord[i].FeatureTag = GetUInt32(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseFeature(
+ &raw[offset],
+ &rec->FeatureRecord[i].Feature);
+ }
+}
+void CFX_CTTGSUBTable::ParseFeature(FT_Bytes raw, TFeature *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->FeatureParams = GetUInt16(sp);
+ rec->LookupCount = GetUInt16(sp);
+ if(rec->LookupCount <= 0) {
+ return;
+ }
+ rec->LookupListIndex = new TT_uint16_t[rec->LookupCount];
+ for(i = 0; i < rec->LookupCount; i++) {
+ rec->LookupListIndex[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseLookupList(FT_Bytes raw, TLookupList *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->LookupCount = GetUInt16(sp);
+ if(rec->LookupCount <= 0) {
+ return;
+ }
+ rec->Lookup = new struct TLookup[rec->LookupCount];
+ for(i = 0; i < rec->LookupCount; i++) {
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseLookup(
+ &raw[offset],
+ &rec->Lookup[i]);
+ }
+}
+void CFX_CTTGSUBTable::ParseLookup(FT_Bytes raw, TLookup *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ rec->LookupType = GetUInt16(sp);
+ rec->LookupFlag = GetUInt16(sp);
+ rec->SubTableCount = GetUInt16(sp);
+ if(rec->SubTableCount <= 0) {
+ return;
+ }
+ rec->SubTable = new struct TSubTableBase*[rec->SubTableCount];
+ for(i = 0; i < rec->SubTableCount; i++) {
+ rec->SubTable[i] = NULL;
+ }
+ if(rec->LookupType != 1) {
+ return;
+ }
+ for(i = 0; i < rec->SubTableCount; i++) {
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseSingleSubst(
+ &raw[offset],
+ &rec->SubTable[i]);
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec)
+{
+ FT_Bytes sp = raw;
+ TT_uint16_t Format = GetUInt16(sp);
+ switch(Format) {
+ case 1:
+ *rec = new TCoverageFormat1();
+ ParseCoverageFormat1(raw, (TCoverageFormat1*)*rec);
+ break;
+ case 2:
+ *rec = new TCoverageFormat2();
+ ParseCoverageFormat2(raw, (TCoverageFormat2*)*rec);
+ break;
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ rec->GlyphCount = GetUInt16(sp);
+ if(rec->GlyphCount <= 0) {
+ return;
+ }
+ rec->GlyphArray = new TT_uint16_t[rec->GlyphCount];
+ for(i = 0; i < rec->GlyphCount; i++) {
+ rec->GlyphArray[i] = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ rec->RangeCount = GetUInt16(sp);
+ if(rec->RangeCount <= 0) {
+ return;
+ }
+ rec->RangeRecord = new TRangeRecord[rec->RangeCount];
+ for(i = 0; i < rec->RangeCount; i++) {
+ rec->RangeRecord[i].Start = GetUInt16(sp);
+ rec->RangeRecord[i].End = GetUInt16(sp);
+ rec->RangeRecord[i].StartCoverageIndex = GetUInt16(sp);
+ }
+}
+void CFX_CTTGSUBTable::ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec)
+{
+ FT_Bytes sp = raw;
+ TT_uint16_t Format = GetUInt16(sp);
+ switch(Format) {
+ case 1:
+ *rec = new TSingleSubstFormat1();
+ ParseSingleSubstFormat1(raw, (TSingleSubstFormat1*)*rec);
+ break;
+ case 2:
+ *rec = new TSingleSubstFormat2();
+ ParseSingleSubstFormat2(raw, (TSingleSubstFormat2*)*rec);
+ break;
+ }
+}
+void CFX_CTTGSUBTable::ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec)
+{
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseCoverage(
+ &raw[offset],
+ &rec->Coverage);
+ rec->DeltaGlyphID = GetInt16(sp);
+}
+void CFX_CTTGSUBTable::ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec)
+{
+ int i;
+ FT_Bytes sp = raw;
+ GetUInt16(sp);
+ TT_uint16_t offset = GetUInt16(sp);
+ ParseCoverage(
+ &raw[offset],
+ &rec->Coverage);
+ rec->GlyphCount = GetUInt16(sp);
+ if(rec->GlyphCount <= 0) {
+ return;
+ }
+ rec->Substitute = new TT_uint16_t[rec->GlyphCount];
+ for(i = 0; i < rec->GlyphCount; i++) {
+ rec->Substitute[i] = GetUInt16(sp);
+ }
+}
+FX_BOOL CFX_GSUBTable::GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum)
+{
+ return m_GsubImp.GetVerticalGlyph(glyphnum, vglyphnum);
+}
+IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont)
+{
+ if (!pFont) {
+ return NULL;
+ }
+ if (NULL == pFont->m_pGsubData) {
+ unsigned long length = 0;
+ int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length);
+ if (!error) {
+ pFont->m_pGsubData = (unsigned char*)FX_Alloc(FX_BYTE, length);
+ }
+ if (!pFont->m_pGsubData) {
+ return NULL;
+ }
+ }
+ int error = FXFT_Load_Sfnt_Table(pFont->m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, pFont->m_pGsubData, NULL);
+ if (!error && pFont->m_pGsubData) {
+ CFX_GSUBTable* pGsubTable = FX_NEW CFX_GSUBTable;
+ if (!pGsubTable) {
+ return NULL;
+ }
+ if (pGsubTable->m_GsubImp.LoadGSUBTable((FT_Bytes)pFont->m_pGsubData)) {
+ return pGsubTable;
+ }
+ delete pGsubTable;
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfapi/fpdf_font/ttgsubtable.h b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
new file mode 100644
index 0000000000..a1f0e8867a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/ttgsubtable.h
@@ -0,0 +1,419 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef TTGSUBTable_H
+#define TTGSUBTable_H
+#include "../../fx_freetype.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "common.h"
+class CFX_GlyphMap
+{
+public:
+ CFX_GlyphMap();
+ ~CFX_GlyphMap();
+ void SetAt(int key, int value);
+ FX_BOOL Lookup(int key, int &value);
+protected:
+ CFX_BinaryBuf m_Buffer;
+};
+class CFX_CTTGSUBTable : public CFX_Object
+{
+public:
+ CFX_CTTGSUBTable(void): loaded(false), m_bFeautureMapLoad(FALSE) {};
+ CFX_CTTGSUBTable(FT_Bytes gsub): loaded(false), m_bFeautureMapLoad(FALSE)
+ {
+ LoadGSUBTable(gsub);
+ }
+ virtual ~CFX_CTTGSUBTable() {}
+ bool IsOk(void) const
+ {
+ return loaded;
+ }
+ bool LoadGSUBTable(FT_Bytes gsub);
+ bool GetVerticalGlyph(TT_uint32_t glyphnum, TT_uint32_t *vglyphnum);
+private:
+ struct tt_gsub_header {
+ TT_uint32_t Version;
+ TT_uint16_t ScriptList;
+ TT_uint16_t FeatureList;
+ TT_uint16_t LookupList;
+ };
+ struct TLangSys {
+ TT_uint16_t LookupOrder;
+ TT_uint16_t ReqFeatureIndex;
+ TT_uint16_t FeatureCount;
+ TT_uint16_t *FeatureIndex;
+ TLangSys(): LookupOrder(0), ReqFeatureIndex(0), FeatureCount(0), FeatureIndex(NULL) {}
+ ~TLangSys()
+ {
+ if(FeatureIndex) {
+ delete[] FeatureIndex;
+ }
+ }
+ private:
+ TLangSys(const TLangSys&);
+ TLangSys& operator=(const TLangSys&);
+ };
+ struct TLangSysRecord {
+ TT_uint32_t LangSysTag;
+ struct TLangSys LangSys;
+ TLangSysRecord(): LangSysTag(0) {}
+ private:
+ TLangSysRecord(const TLangSysRecord&);
+ TLangSysRecord& operator=(const TLangSysRecord&);
+ };
+ struct TScript {
+ TT_uint16_t DefaultLangSys;
+ TT_uint16_t LangSysCount;
+ struct TLangSysRecord *LangSysRecord;
+ TScript(): DefaultLangSys(0), LangSysCount(0), LangSysRecord(NULL) {}
+ ~TScript()
+ {
+ if(LangSysRecord) {
+ delete[] LangSysRecord;
+ }
+ }
+ private:
+ TScript(const TScript&);
+ TScript& operator=(const TScript&);
+ };
+ struct TScriptRecord {
+ TT_uint32_t ScriptTag;
+ struct TScript Script;
+ TScriptRecord(): ScriptTag(0) {}
+ private:
+ TScriptRecord(const TScriptRecord&);
+ TScriptRecord& operator=(const TScriptRecord&);
+ };
+ struct TScriptList {
+ TT_uint16_t ScriptCount;
+ struct TScriptRecord *ScriptRecord;
+ TScriptList(): ScriptCount(0), ScriptRecord(NULL) {}
+ ~TScriptList()
+ {
+ if(ScriptRecord) {
+ delete[] ScriptRecord;
+ }
+ }
+ private:
+ TScriptList(const TScriptList&);
+ TScriptList& operator=(const TScriptList&);
+ };
+ struct TFeature {
+ TT_uint16_t FeatureParams;
+ int LookupCount;
+ TT_uint16_t *LookupListIndex;
+ TFeature(): FeatureParams(0), LookupCount(0), LookupListIndex(NULL) {}
+ ~TFeature()
+ {
+ if(LookupListIndex) {
+ delete[] LookupListIndex;
+ }
+ }
+ private:
+ TFeature(const TFeature&);
+ TFeature& operator=(const TFeature&);
+ };
+ struct TFeatureRecord {
+ TT_uint32_t FeatureTag;
+ struct TFeature Feature;
+ TFeatureRecord(): FeatureTag(0) {}
+ private:
+ TFeatureRecord(const TFeatureRecord&);
+ TFeatureRecord& operator=(const TFeatureRecord&);
+ };
+ struct TFeatureList {
+ int FeatureCount;
+ struct TFeatureRecord *FeatureRecord;
+ TFeatureList(): FeatureCount(0), FeatureRecord(NULL) {}
+ ~TFeatureList()
+ {
+ if(FeatureRecord) {
+ delete[] FeatureRecord;
+ }
+ }
+ private:
+ TFeatureList(const TFeatureList&);
+ TFeatureList& operator=(const TFeatureList&);
+ };
+ enum TLookupFlag {
+ LOOKUPFLAG_RightToLeft = 0x0001,
+ LOOKUPFLAG_IgnoreBaseGlyphs = 0x0002,
+ LOOKUPFLAG_IgnoreLigatures = 0x0004,
+ LOOKUPFLAG_IgnoreMarks = 0x0008,
+ LOOKUPFLAG_Reserved = 0x00F0,
+ LOOKUPFLAG_MarkAttachmentType = 0xFF00,
+ };
+ struct TCoverageFormatBase {
+ TT_uint16_t CoverageFormat;
+ CFX_GlyphMap m_glyphMap;
+ TCoverageFormatBase(): CoverageFormat(0) {}
+ virtual ~TCoverageFormatBase() {}
+ private:
+ TCoverageFormatBase(const TCoverageFormatBase&);
+ TCoverageFormatBase& operator=(const TCoverageFormatBase&);
+ };
+ struct TCoverageFormat1: public TCoverageFormatBase {
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *GlyphArray;
+ TCoverageFormat1(): GlyphCount(0), GlyphArray(NULL)
+ {
+ CoverageFormat = 1;
+ }
+ ~TCoverageFormat1()
+ {
+ if(GlyphArray) {
+ delete[] GlyphArray;
+ }
+ }
+ private:
+ TCoverageFormat1(const TCoverageFormat1&);
+ TCoverageFormat1& operator=(const TCoverageFormat1&);
+ };
+ struct TRangeRecord {
+ TT_uint16_t Start;
+ TT_uint16_t End;
+ TT_uint16_t StartCoverageIndex;
+ TRangeRecord(): Start(0), End(0), StartCoverageIndex(0) {}
+ friend bool operator > (const TRangeRecord &r1, const TRangeRecord &r2)
+ {
+ return r1.Start > r2.Start;
+ }
+ private:
+ TRangeRecord(const TRangeRecord&);
+ };
+ struct TCoverageFormat2: public TCoverageFormatBase {
+ TT_uint16_t RangeCount;
+ struct TRangeRecord *RangeRecord;
+ TCoverageFormat2(): RangeCount(0), RangeRecord(NULL)
+ {
+ CoverageFormat = 2;
+ }
+ ~TCoverageFormat2()
+ {
+ if(RangeRecord) {
+ delete[] RangeRecord;
+ }
+ }
+ private:
+ TCoverageFormat2(const TCoverageFormat2&);
+ TCoverageFormat2& operator=(const TCoverageFormat2&);
+ };
+ struct TClassDefFormatBase {
+ TT_uint16_t ClassFormat;
+ TClassDefFormatBase(): ClassFormat(0) {}
+ virtual ~TClassDefFormatBase() {}
+ private:
+ TClassDefFormatBase(const TClassDefFormatBase&);
+ TClassDefFormatBase& operator=(const TClassDefFormatBase&);
+ };
+ struct TClassDefFormat1: public TClassDefFormatBase {
+ TT_uint16_t StartGlyph;
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *ClassValueArray;
+ TClassDefFormat1(): StartGlyph(0), GlyphCount(0), ClassValueArray(NULL)
+ {
+ ClassFormat = 1;
+ }
+ ~TClassDefFormat1()
+ {
+ if(ClassValueArray) {
+ delete[] ClassValueArray;
+ }
+ }
+ private:
+ TClassDefFormat1(const TClassDefFormat1&);
+ TClassDefFormat1& operator=(const TClassDefFormat1&);
+ };
+ struct TClassRangeRecord {
+ TT_uint16_t Start;
+ TT_uint16_t End;
+ TT_uint16_t Class;
+ TClassRangeRecord(): Start(0), End(0), Class(0) {}
+ private:
+ TClassRangeRecord(const TClassRangeRecord&);
+ TClassRangeRecord& operator=(const TClassRangeRecord&);
+ };
+ struct TClassDefFormat2: public TClassDefFormatBase {
+ TT_uint16_t ClassRangeCount;
+ struct TClassRangeRecord *ClassRangeRecord;
+ TClassDefFormat2(): ClassRangeCount(0), ClassRangeRecord(NULL)
+ {
+ ClassFormat = 2;
+ }
+ ~TClassDefFormat2()
+ {
+ if(ClassRangeRecord) {
+ delete[] ClassRangeRecord;
+ }
+ }
+ private:
+ TClassDefFormat2(const TClassDefFormat2&);
+ TClassDefFormat2& operator=(const TClassDefFormat2&);
+ };
+ struct TDevice {
+ TT_uint16_t StartSize;
+ TT_uint16_t EndSize;
+ TT_uint16_t DeltaFormat;
+ TDevice(): StartSize(0), EndSize(0), DeltaFormat(0) {}
+ private:
+ TDevice(const TDevice&);
+ TDevice& operator=(const TDevice&);
+ };
+ struct TSubTableBase {
+ TT_uint16_t SubstFormat;
+ TSubTableBase(): SubstFormat(0) {}
+ virtual ~TSubTableBase() {}
+ private:
+ TSubTableBase(const TSubTableBase&);
+ TSubTableBase& operator=(const TSubTableBase&);
+ };
+ struct TSingleSubstFormat1: public TSubTableBase {
+ TCoverageFormatBase *Coverage;
+ TT_int16_t DeltaGlyphID;
+ TSingleSubstFormat1(): DeltaGlyphID(0), Coverage(NULL)
+ {
+ SubstFormat = 1;
+ }
+ ~TSingleSubstFormat1()
+ {
+ if(Coverage) {
+ delete Coverage;
+ }
+ }
+ private:
+ TSingleSubstFormat1(const TSingleSubstFormat1&);
+ TSingleSubstFormat1& operator=(const TSingleSubstFormat1&);
+ };
+ struct TSingleSubstFormat2: public TSubTableBase {
+ TCoverageFormatBase *Coverage;
+ TT_uint16_t GlyphCount;
+ TT_uint16_t *Substitute;
+ TSingleSubstFormat2(): Coverage(NULL), GlyphCount(0), Substitute(NULL)
+ {
+ SubstFormat = 2;
+ }
+ ~TSingleSubstFormat2()
+ {
+ if(Coverage) {
+ delete Coverage;
+ }
+ if(Substitute) {
+ delete[] Substitute;
+ }
+ }
+ private:
+ TSingleSubstFormat2(const TSingleSubstFormat2&);
+ TSingleSubstFormat2& operator=(const TSingleSubstFormat2&);
+ };
+ struct TLookup {
+ TT_uint16_t LookupType;
+ TT_uint16_t LookupFlag;
+ TT_uint16_t SubTableCount;
+ struct TSubTableBase **SubTable;
+ TLookup(): LookupType(0), LookupFlag(0), SubTableCount(0), SubTable(NULL) {}
+ ~TLookup()
+ {
+ if(SubTableCount > 0 && SubTable != NULL) {
+ for(int i = 0; i < SubTableCount; i++) {
+ delete SubTable[i];
+ }
+ delete[] SubTable;
+ }
+ }
+ private:
+ TLookup(const TLookup&);
+ TLookup& operator=(const TLookup&);
+ };
+ struct TLookupList {
+ int LookupCount;
+ struct TLookup *Lookup;
+ TLookupList(): LookupCount(0), Lookup(NULL) {}
+ ~TLookupList()
+ {
+ if(Lookup) {
+ delete[] Lookup;
+ }
+ }
+ private:
+ TLookupList(const TLookupList&);
+ TLookupList& operator=(const TLookupList&);
+ };
+ bool Parse(
+ FT_Bytes scriptlist,
+ FT_Bytes featurelist,
+ FT_Bytes lookuplist);
+ void ParseScriptList(FT_Bytes raw, TScriptList *rec);
+ void ParseScript(FT_Bytes raw, TScript *rec);
+ void ParseLangSys(FT_Bytes raw, TLangSys *rec);
+ void ParseFeatureList(FT_Bytes raw, TFeatureList *rec);
+ void ParseFeature(FT_Bytes raw, TFeature *rec);
+ void ParseLookupList(FT_Bytes raw, TLookupList *rec);
+ void ParseLookup(FT_Bytes raw, TLookup *rec);
+ void ParseCoverage(FT_Bytes raw, TCoverageFormatBase **rec);
+ void ParseCoverageFormat1(FT_Bytes raw, TCoverageFormat1 *rec);
+ void ParseCoverageFormat2(FT_Bytes raw, TCoverageFormat2 *rec);
+ void ParseSingleSubst(FT_Bytes raw, TSubTableBase **rec);
+ void ParseSingleSubstFormat1(FT_Bytes raw, TSingleSubstFormat1 *rec);
+ void ParseSingleSubstFormat2(FT_Bytes raw, TSingleSubstFormat2 *rec);
+ bool GetVerticalGlyphSub(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TFeature *Feature);
+ bool GetVerticalGlyphSub2(
+ TT_uint32_t glyphnum,
+ TT_uint32_t *vglyphnum,
+ struct TLookup *Lookup);
+ int GetCoverageIndex(struct TCoverageFormatBase *Coverage, TT_uint32_t g);
+ TT_uint8_t GetUInt8(FT_Bytes& p) const
+ {
+ TT_uint8_t ret = p[0];
+ p += 1;
+ return ret;
+ }
+ TT_int16_t GetInt16(FT_Bytes& p) const
+ {
+ TT_uint16_t ret = p[0] << 8 | p[1];
+ p += 2;
+ return *(TT_int16_t*)&ret;
+ }
+ TT_uint16_t GetUInt16(FT_Bytes& p) const
+ {
+ TT_uint16_t ret = p[0] << 8 | p[1];
+ p += 2;
+ return ret;
+ }
+ TT_int32_t GetInt32(FT_Bytes& p) const
+ {
+ TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
+ p += 4;
+ return *(TT_int32_t*)&ret;
+ }
+ TT_uint32_t GetUInt32(FT_Bytes& p) const
+ {
+ TT_uint32_t ret = p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
+ p += 4;
+ return ret;
+ }
+ CFX_CMapDWordToDWord m_featureMap;
+ FX_BOOL m_bFeautureMapLoad;
+ bool loaded;
+ struct tt_gsub_header header;
+ struct TScriptList ScriptList;
+ struct TFeatureList FeatureList;
+ struct TLookupList LookupList;
+};
+class CFX_GSUBTable : public IFX_GSUBTable, public CFX_Object
+{
+public:
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum);
+ CFX_CTTGSUBTable m_GsubImp;
+};
+#endif
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
new file mode 100644
index 0000000000..232e5619a7
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page.cpp
@@ -0,0 +1,1047 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+void CPDF_PageObject::Release()
+{
+ delete this;
+}
+CPDF_PageObject* CPDF_PageObject::Create(int type)
+{
+ switch (type) {
+ case PDFPAGE_TEXT:
+ return FX_NEW CPDF_TextObject;
+ case PDFPAGE_IMAGE:
+ return FX_NEW CPDF_ImageObject;
+ case PDFPAGE_PATH:
+ return FX_NEW CPDF_PathObject;
+ case PDFPAGE_SHADING:
+ return FX_NEW CPDF_ShadingObject;
+ case PDFPAGE_FORM:
+ return FX_NEW CPDF_FormObject;
+ }
+ return NULL;
+}
+CPDF_PageObject* CPDF_PageObject::Clone() const
+{
+ CPDF_PageObject* pObj = Create(m_Type);
+ pObj->Copy(this);
+ return pObj;
+}
+void CPDF_PageObject::Copy(const CPDF_PageObject* pSrc)
+{
+ if (m_Type != pSrc->m_Type) {
+ return;
+ }
+ CopyData(pSrc);
+ CopyStates(*pSrc);
+ m_Left = pSrc->m_Left;
+ m_Right = pSrc->m_Right;
+ m_Top = pSrc->m_Top;
+ m_Bottom = pSrc->m_Bottom;
+}
+void CPDF_PageObject::AppendClipPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
+{
+ m_ClipPath.AppendPath(path, type, bAutoMerge);
+}
+void CPDF_PageObject::CopyClipPath(CPDF_PageObject* pObj)
+{
+ m_ClipPath = pObj->m_ClipPath;
+}
+void CPDF_PageObject::RemoveClipPath()
+{
+ m_ClipPath.SetNull();
+}
+void CPDF_PageObject::RecalcBBox()
+{
+ switch (m_Type) {
+ case PDFPAGE_TEXT:
+ ((CPDF_TextObject*)this)->RecalcPositionData();
+ break;
+ case PDFPAGE_PATH:
+ ((CPDF_PathObject*)this)->CalcBoundingBox();
+ break;
+ case PDFPAGE_SHADING:
+ ((CPDF_ShadingObject*)this)->CalcBoundingBox();
+ break;
+ }
+}
+void CPDF_PageObject::TransformClipPath(CFX_AffineMatrix& matrix)
+{
+ if (m_ClipPath.IsNull()) {
+ return;
+ }
+ m_ClipPath.GetModify();
+ m_ClipPath.Transform(matrix);
+}
+void CPDF_PageObject::TransformGeneralState(CFX_AffineMatrix& matrix)
+{
+ if(m_GeneralState.IsNull()) {
+ return;
+ }
+ CPDF_GeneralStateData* pGS = m_GeneralState.GetModify();
+ pGS->m_Matrix.Concat(matrix);
+}
+FX_RECT CPDF_PageObject::GetBBox(const CFX_AffineMatrix* pMatrix) const
+{
+ CFX_FloatRect rect(m_Left, m_Bottom, m_Right, m_Top);
+ if (pMatrix) {
+ pMatrix->TransformRect(rect);
+ }
+ return rect.GetOutterRect();
+}
+CPDF_TextObject::CPDF_TextObject()
+{
+ m_Type = PDFPAGE_TEXT;
+ m_pCharCodes = NULL;
+ m_pCharPos = NULL;
+ m_nChars = 0;
+ m_PosX = m_PosY = 0;
+}
+CPDF_TextObject::~CPDF_TextObject()
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+}
+void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const
+{
+ pInfo->m_CharCode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[index];
+ pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0;
+ pInfo->m_OriginY = 0;
+ if (pInfo->m_CharCode == -1) {
+ return;
+ }
+ CPDF_Font* pFont = m_TextState.GetFont();
+ if (pFont->GetFontType() != PDFFONT_CIDFONT) {
+ return;
+ }
+ if (!((CPDF_CIDFont*)pFont)->IsVertWriting()) {
+ return;
+ }
+ FX_WORD CID = ((CPDF_CIDFont*)pFont)->CIDFromCharCode(pInfo->m_CharCode);
+ pInfo->m_OriginY = pInfo->m_OriginX;
+ pInfo->m_OriginX = 0;
+ short vx, vy;
+ ((CPDF_CIDFont*)pFont)->GetVertOrigin(CID, vx, vy);
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ pInfo->m_OriginX -= fontsize * vx / 1000;
+ pInfo->m_OriginY -= fontsize * vy / 1000;
+}
+int CPDF_TextObject::CountChars() const
+{
+ if (m_nChars == 1) {
+ return 1;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++)
+ if (m_pCharCodes[i] != (FX_DWORD) - 1) {
+ count ++;
+ }
+ return count;
+}
+void CPDF_TextObject::GetCharInfo(int index, FX_DWORD& charcode, FX_FLOAT& kerning) const
+{
+ if (m_nChars == 1) {
+ charcode = (FX_DWORD)(FX_UINTPTR)m_pCharCodes;
+ kerning = 0;
+ return;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ if (m_pCharCodes[i] != (FX_DWORD) - 1) {
+ if (count == index) {
+ charcode = m_pCharCodes[i];
+ if (i == m_nChars - 1 || m_pCharCodes[i + 1] != (FX_DWORD) - 1) {
+ kerning = 0;
+ } else {
+ kerning = m_pCharPos[i];
+ }
+ return;
+ }
+ count ++;
+ }
+ }
+}
+void CPDF_TextObject::GetCharInfo(int index, CPDF_TextObjectItem* pInfo) const
+{
+ if (m_nChars == 1) {
+ GetItemInfo(0, pInfo);
+ return;
+ }
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ if (count == index) {
+ GetItemInfo(i, pInfo);
+ break;
+ }
+ count ++;
+ }
+}
+void CPDF_TextObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_TextObject* pSrcObj = (const CPDF_TextObject*)pSrc;
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ m_nChars = pSrcObj->m_nChars;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int i;
+ for (i = 0; i < m_nChars; i ++) {
+ m_pCharCodes[i] = pSrcObj->m_pCharCodes[i];
+ }
+ for (i = 0; i < m_nChars - 1; i ++) {
+ m_pCharPos[i] = pSrcObj->m_pCharPos[i];
+ }
+ } else {
+ m_pCharCodes = pSrcObj->m_pCharCodes;
+ }
+ m_PosX = pSrcObj->m_PosX;
+ m_PosY = pSrcObj->m_PosY;
+}
+void CPDF_TextObject::GetTextMatrix(CFX_AffineMatrix* pMatrix) const
+{
+ FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
+ pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], m_PosX, m_PosY);
+}
+void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nsegs)
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ CPDF_Font* pFont = m_TextState.GetFont();
+ m_nChars = 0;
+ for (int i = 0; i < nsegs; i ++) {
+ m_nChars += pFont->CountChar(pStrs[i], pStrs[i].GetLength());
+ }
+ m_nChars += nsegs - 1;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int index = 0;
+ for (int i = 0; i < nsegs; i ++) {
+ FX_LPCSTR segment = pStrs[i];
+ int offset = 0, len = pStrs[i].GetLength();
+ while (offset < len) {
+ m_pCharCodes[index++] = pFont->GetNextChar(segment, offset);
+ }
+ if (i != nsegs - 1) {
+ m_pCharPos[index - 1] = pKerning[i];
+ m_pCharCodes[index ++] = (FX_DWORD) - 1;
+ }
+ }
+ } else {
+ int offset = 0;
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pFont->GetNextChar(pStrs[0], offset);
+ }
+}
+void CPDF_TextObject::SetText(const CFX_ByteString& str)
+{
+ SetSegments(&str, NULL, 1);
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetEmpty()
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ }
+ if (m_nChars > 1 && m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+ m_nChars = 0;
+ m_pCharCodes = NULL;
+ m_pCharPos = NULL;
+ m_Left = m_Right = m_PosX;
+ m_Top = m_Bottom = m_PosY;
+}
+void CPDF_TextObject::SetText(CFX_ByteString* pStrs, FX_FLOAT* pKerning, int nSegs)
+{
+ SetSegments(pStrs, pKerning, nSegs);
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetText(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pKernings)
+{
+ if (m_nChars > 1 && m_pCharCodes) {
+ FX_Free(m_pCharCodes);
+ m_pCharCodes = NULL;
+ }
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ m_pCharPos = NULL;
+ }
+ int nKernings = 0;
+ int i;
+ for (i = 0; i < nChars - 1; i ++)
+ if (pKernings[i] != 0) {
+ nKernings ++;
+ }
+ m_nChars = nChars + nKernings;
+ if (m_nChars > 1) {
+ m_pCharCodes = FX_Alloc(FX_DWORD, m_nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1);
+ int index = 0;
+ for (int i = 0; i < nChars; i ++) {
+ m_pCharCodes[index++] = pCharCodes[i];
+ if (pKernings[i] != 0 && i != nChars - 1) {
+ m_pCharCodes[index] = (FX_DWORD) - 1;
+ m_pCharPos[index - 1] = pKernings[i];
+ index ++;
+ }
+ }
+ } else {
+ int offset = 0;
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR)pCharCodes[0];
+ }
+ RecalcPositionData();
+}
+FX_FLOAT CPDF_TextObject::GetCharWidth(FX_DWORD charcode) const
+{
+ FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ if (!bVertWriting) {
+ return pFont->GetCharWidthF(charcode, 0) * fontsize;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ return pCIDFont->GetVertWidth(CID) * fontsize;
+ }
+}
+FX_FLOAT CPDF_TextObject::GetSpaceCharWidth() const
+{
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_DWORD charCode = m_TextState.GetFont()->CharCodeFromUnicode(32);
+ if (charCode != (FX_DWORD) - 1) {
+ return GetCharWidth(charCode);
+ }
+ FX_FLOAT fontSize = m_TextState.GetFontSize() / 4000.0f;
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_RECT fontRect;
+ pFont->GetFontBBox(fontRect);
+ fontSize *= bVertWriting ? (FX_FLOAT)fontRect.Height() : (FX_FLOAT)fontRect.Width();
+ return fontSize;
+}
+void CPDF_TextObject::GetCharRect(int index, CFX_FloatRect& rect) const
+{
+ FX_FLOAT curpos = 0;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000;
+ int count = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ if( count != index) {
+ count++;
+ continue;
+ }
+ FX_FLOAT curpos = i > 0 ? m_pCharPos[i - 1] : 0;
+ FX_RECT char_rect;
+ pFont->GetCharBBox(charcode, char_rect, 0);
+ if (!bVertWriting) {
+ rect.left = curpos + char_rect.left * fontsize;
+ rect.right = curpos + char_rect.right * fontsize;
+ rect.top = char_rect.top * fontsize;
+ rect.bottom = char_rect.bottom * fontsize;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ char_rect.left -= vx;
+ char_rect.right -= vx;
+ char_rect.top -= vy;
+ char_rect.bottom -= vy;
+ rect.left = char_rect.left * fontsize;
+ rect.right = char_rect.right * fontsize;
+ rect.top = curpos + char_rect.top * fontsize;
+ rect.bottom = curpos + char_rect.bottom * fontsize;
+ }
+ return;
+ }
+}
+void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, FX_FLOAT* pTextAdvanceY, FX_FLOAT horz_scale, int level)
+{
+ FX_FLOAT curpos = 0;
+ FX_FLOAT min_x = 10000 * 1.0f, max_x = -10000 * 1.0f, min_y = 10000 * 1.0f, max_y = -10000 * 1.0f;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ curpos -= FXSYS_Mul(m_pCharPos[i - 1], fontsize) / 1000;
+ continue;
+ }
+ if (i) {
+ m_pCharPos[i - 1] = curpos;
+ }
+ FX_RECT char_rect;
+ pFont->GetCharBBox(charcode, char_rect, level);
+ FX_FLOAT charwidth;
+ if (!bVertWriting) {
+ if (min_y > char_rect.top) {
+ min_y = (FX_FLOAT)char_rect.top;
+ }
+ if (max_y < char_rect.top) {
+ max_y = (FX_FLOAT)char_rect.top;
+ }
+ if (min_y > char_rect.bottom) {
+ min_y = (FX_FLOAT)char_rect.bottom;
+ }
+ if (max_y < char_rect.bottom) {
+ max_y = (FX_FLOAT)char_rect.bottom;
+ }
+ FX_FLOAT char_left = curpos + char_rect.left * fontsize / 1000;
+ FX_FLOAT char_right = curpos + char_rect.right * fontsize / 1000;
+ if (min_x > char_left) {
+ min_x = char_left;
+ }
+ if (max_x < char_left) {
+ max_x = char_left;
+ }
+ if (min_x > char_right) {
+ min_x = char_right;
+ }
+ if (max_x < char_right) {
+ max_x = char_right;
+ }
+ charwidth = pFont->GetCharWidthF(charcode, level) * fontsize / 1000;
+ } else {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ char_rect.left -= vx;
+ char_rect.right -= vx;
+ char_rect.top -= vy;
+ char_rect.bottom -= vy;
+ if (min_x > char_rect.left) {
+ min_x = (FX_FLOAT)char_rect.left;
+ }
+ if (max_x < char_rect.left) {
+ max_x = (FX_FLOAT)char_rect.left;
+ }
+ if (min_x > char_rect.right) {
+ min_x = (FX_FLOAT)char_rect.right;
+ }
+ if (max_x < char_rect.right) {
+ max_x = (FX_FLOAT)char_rect.right;
+ }
+ FX_FLOAT char_top = curpos + char_rect.top * fontsize / 1000;
+ FX_FLOAT char_bottom = curpos + char_rect.bottom * fontsize / 1000;
+ if (min_y > char_top) {
+ min_y = char_top;
+ }
+ if (max_y < char_top) {
+ max_y = char_top;
+ }
+ if (min_y > char_bottom) {
+ min_y = char_bottom;
+ }
+ if (max_y < char_bottom) {
+ max_y = char_bottom;
+ }
+ charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
+ }
+ curpos += charwidth;
+ if (charcode == ' ' && (pCIDFont == NULL || pCIDFont->GetCharSize(32) == 1)) {
+ curpos += m_TextState.GetObject()->m_WordSpace;
+ }
+ curpos += m_TextState.GetObject()->m_CharSpace;
+ }
+ if (bVertWriting) {
+ if (pTextAdvanceX) {
+ *pTextAdvanceX = 0;
+ }
+ if (pTextAdvanceY) {
+ *pTextAdvanceY = curpos;
+ }
+ min_x = min_x * fontsize / 1000;
+ max_x = max_x * fontsize / 1000;
+ } else {
+ if (pTextAdvanceX) {
+ *pTextAdvanceX = FXSYS_Mul(curpos, horz_scale);
+ }
+ if (pTextAdvanceY) {
+ *pTextAdvanceY = 0;
+ }
+ min_y = min_y * fontsize / 1000;
+ max_y = max_y * fontsize / 1000;
+ }
+ CFX_AffineMatrix matrix;
+ GetTextMatrix(&matrix);
+ m_Left = min_x;
+ m_Right = max_x;
+ m_Bottom = min_y;
+ m_Top = max_y;
+ matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+ int textmode = m_TextState.GetObject()->m_TextMode;
+ if (textmode == 1 || textmode == 2 || textmode == 5 || textmode == 6) {
+ FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2;
+ m_Left -= half_width;
+ m_Right += half_width;
+ m_Top += half_width;
+ m_Bottom -= half_width;
+ }
+}
+void CPDF_TextObject::CalcCharPos(FX_FLOAT* pPosArray) const
+{
+ FX_FLOAT curpos = 0;
+ int count = 0;
+ CPDF_Font* pFont = m_TextState.GetFont();
+ FX_BOOL bVertWriting = FALSE;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ if (pCIDFont) {
+ bVertWriting = pCIDFont->IsVertWriting();
+ }
+ FX_FLOAT fontsize = m_TextState.GetFontSize();
+ int index = 0;
+ for (int i = 0; i < m_nChars; i ++) {
+ FX_DWORD charcode = m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)m_pCharCodes : m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ pPosArray[index++] = i ? m_pCharPos[i - 1] : 0;
+ FX_FLOAT charwidth;
+ if (bVertWriting) {
+ FX_WORD CID = pCIDFont->CIDFromCharCode(charcode);
+ charwidth = pCIDFont->GetVertWidth(CID) * fontsize / 1000;
+ } else {
+ charwidth = pFont->GetCharWidthF(charcode) * fontsize / 1000;
+ }
+ pPosArray[index] = pPosArray[index - 1] + charwidth;
+ index++;
+ }
+}
+void CPDF_TextObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_TextState.GetModify();
+ CFX_AffineMatrix text_matrix;
+ GetTextMatrix(&text_matrix);
+ text_matrix.Concat(matrix);
+ FX_FLOAT* pTextMatrix = m_TextState.GetMatrix();
+ pTextMatrix[0] = text_matrix.GetA();
+ pTextMatrix[1] = text_matrix.GetC();
+ pTextMatrix[2] = text_matrix.GetB();
+ pTextMatrix[3] = text_matrix.GetD();
+ m_PosX = text_matrix.GetE();
+ m_PosY = text_matrix.GetF();
+ CalcPositionData(NULL, NULL, 0);
+}
+void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y)
+{
+ FX_FLOAT dx = x - m_PosX;
+ FX_FLOAT dy = y - m_PosY;
+ m_PosX = x;
+ m_PosY = y;
+ m_Left += dx;
+ m_Right += dx;
+ m_Top += dy;
+ m_Bottom += dy;
+}
+void CPDF_TextObject::SetData(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, FX_FLOAT x, FX_FLOAT y)
+{
+ ASSERT(m_nChars == 0);
+ m_nChars = nChars;
+ m_PosX = x;
+ m_PosY = y;
+ if (nChars == 0) {
+ return;
+ }
+ if (nChars == 1) {
+ m_pCharCodes = (FX_DWORD*)(FX_UINTPTR) * pCharCodes;
+ } else {
+ m_pCharCodes = FX_Alloc(FX_DWORD, nChars);
+ FXSYS_memcpy32(m_pCharCodes, pCharCodes, sizeof(FX_DWORD)*nChars);
+ m_pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
+ FXSYS_memcpy32(m_pCharPos, pCharPos, sizeof(FX_FLOAT) * (nChars - 1));
+ }
+ RecalcPositionData();
+}
+void CPDF_TextObject::SetTextState(CPDF_TextState TextState)
+{
+ m_TextState = TextState;
+ CalcPositionData(NULL, NULL, 0);
+}
+CPDF_ShadingObject::CPDF_ShadingObject()
+{
+ m_pShading = NULL;
+ m_Type = PDFPAGE_SHADING;
+}
+CPDF_ShadingObject::~CPDF_ShadingObject()
+{
+ CPDF_ShadingPattern* pShading = m_pShading;
+ if (pShading && pShading->m_pDocument) {
+ pShading->m_pDocument->GetPageData()->ReleasePattern(pShading->m_pShadingObj);
+ }
+}
+void CPDF_ShadingObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ CPDF_ShadingObject* pSrcObj = (CPDF_ShadingObject*)pSrc;
+ m_pShading = pSrcObj->m_pShading;
+ if (m_pShading && m_pShading->m_pDocument) {
+ CPDF_DocPageData* pDocPageData = m_pShading->m_pDocument->GetPageData();
+ m_pShading = (CPDF_ShadingPattern*)pDocPageData->GetPattern(m_pShading->m_pShadingObj, m_pShading->m_bShadingObj, &m_pShading->m_ParentMatrix);
+ }
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_ShadingObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ if (!m_ClipPath.IsNull()) {
+ m_ClipPath.GetModify();
+ m_ClipPath.Transform(matrix);
+ }
+ m_Matrix.Concat(matrix);
+ if (!m_ClipPath.IsNull()) {
+ CalcBoundingBox();
+ } else {
+ matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+ }
+}
+void CPDF_ShadingObject::CalcBoundingBox()
+{
+ if (m_ClipPath.IsNull()) {
+ return;
+ }
+ CFX_FloatRect rect = m_ClipPath.GetClipBox();
+ m_Left = rect.left;
+ m_Bottom = rect.bottom;
+ m_Right = rect.right;
+ m_Top = rect.top;
+}
+CPDF_FormObject::~CPDF_FormObject()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+}
+void CPDF_FormObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_FormMatrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_FormObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_FormObject* pSrcObj = (const CPDF_FormObject*)pSrc;
+ if (m_pForm) {
+ delete m_pForm;
+ }
+ m_pForm = pSrcObj->m_pForm->Clone();
+ m_FormMatrix = pSrcObj->m_FormMatrix;
+}
+void CPDF_FormObject::CalcBoundingBox()
+{
+ CFX_FloatRect form_rect = m_pForm->CalcBoundingBox();
+ form_rect.Transform(&m_FormMatrix);
+ m_Left = form_rect.left;
+ m_Bottom = form_rect.bottom;
+ m_Right = form_rect.right;
+ m_Top = form_rect.top;
+}
+CPDF_PageObjects::CPDF_PageObjects(FX_BOOL bReleaseMembers) : m_ObjectList(128)
+{
+ m_bBackgroundAlphaNeeded = FALSE;
+ m_bReleaseMembers = bReleaseMembers;
+ m_ParseState = PDF_CONTENT_NOT_PARSED;
+ m_pParser = NULL;
+ m_pFormStream = NULL;
+ m_pResources = NULL;
+}
+CPDF_PageObjects::~CPDF_PageObjects()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (!m_bReleaseMembers) {
+ return;
+ }
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (!pPageObj) {
+ continue;
+ }
+ pPageObj->Release();
+ }
+}
+void CPDF_PageObjects::ContinueParse(IFX_Pause* pPause)
+{
+ if (m_pParser == NULL) {
+ return;
+ }
+ m_pParser->Continue(pPause);
+ if (m_pParser->GetStatus() == CPDF_ContentParser::Done) {
+ m_ParseState = PDF_CONTENT_PARSED;
+ delete m_pParser;
+ m_pParser = NULL;
+ }
+}
+int CPDF_PageObjects::EstimateParseProgress() const
+{
+ if (m_pParser == NULL) {
+ return m_ParseState == PDF_CONTENT_PARSED ? 100 : 0;
+ }
+ return m_pParser->EstimateProgress();
+}
+FX_POSITION CPDF_PageObjects::InsertObject(FX_POSITION posInsertAfter, CPDF_PageObject* pNewObject)
+{
+ if (posInsertAfter == NULL) {
+ return m_ObjectList.AddHead(pNewObject);
+ } else {
+ return m_ObjectList.InsertAfter(posInsertAfter, pNewObject);
+ }
+}
+int CPDF_PageObjects::GetObjectIndex(CPDF_PageObject* pObj) const
+{
+ int index = 0;
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pThisObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (pThisObj == pObj) {
+ return index;
+ }
+ index ++;
+ }
+ return -1;
+}
+CPDF_PageObject* CPDF_PageObjects::GetObjectByIndex(int index) const
+{
+ FX_POSITION pos = m_ObjectList.FindIndex(index);
+ if (pos == NULL) {
+ return NULL;
+ }
+ return (CPDF_PageObject*)m_ObjectList.GetAt(pos);
+}
+void CPDF_PageObjects::Transform(const CFX_AffineMatrix& matrix)
+{
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ pObj->Transform(matrix);
+ }
+}
+CFX_FloatRect CPDF_PageObjects::CalcBoundingBox() const
+{
+ if (m_ObjectList.GetCount() == 0) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ FX_FLOAT left, right, top, bottom;
+ left = bottom = 1000000 * 1.0f;
+ right = top = -1000000 * 1.0f;
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (left > pObj->m_Left) {
+ left = pObj->m_Left;
+ }
+ if (right < pObj->m_Right) {
+ right = pObj->m_Right;
+ }
+ if (top < pObj->m_Top) {
+ top = pObj->m_Top;
+ }
+ if (bottom > pObj->m_Bottom) {
+ bottom = pObj->m_Bottom;
+ }
+ }
+ return CFX_FloatRect(left, bottom, right, top);
+}
+void CPDF_PageObjects::LoadTransInfo()
+{
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pGroup = m_pFormDict->GetDict(FX_BSTRC("Group"));
+ if (pGroup == NULL) {
+ return;
+ }
+ if (pGroup->GetString(FX_BSTRC("S")) != FX_BSTRC("Transparency")) {
+ return;
+ }
+ m_Transparency |= PDFTRANS_GROUP;
+ if (pGroup->GetInteger(FX_BSTRC("I"))) {
+ m_Transparency |= PDFTRANS_ISOLATED;
+ }
+ if (pGroup->GetInteger(FX_BSTRC("K"))) {
+ m_Transparency |= PDFTRANS_KNOCKOUT;
+ }
+}
+void CPDF_PageObjects::ClearCacheObjects()
+{
+ m_ParseState = PDF_CONTENT_NOT_PARSED;
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ m_pParser = NULL;
+ if (m_bReleaseMembers) {
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ if (!pPageObj) {
+ continue;
+ }
+ pPageObj->Release();
+ }
+ }
+ m_ObjectList.RemoveAll();
+}
+CPDF_Page::CPDF_Page()
+{
+ m_pPageRender = NULL;
+}
+void CPDF_Page::Load(CPDF_Document* pDocument, CPDF_Dictionary* pPageDict, FX_BOOL bPageCache)
+{
+ m_pDocument = (CPDF_Document*)pDocument;
+ m_pFormDict = pPageDict;
+ if (bPageCache) {
+ m_pPageRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreatePageCache(this);
+ }
+ if (pPageDict == NULL) {
+ m_PageWidth = m_PageHeight = 100 * 1.0f;
+ m_pPageResources = m_pResources = NULL;
+ return;
+ }
+ m_pResources = GetPageAttr(FX_BSTRC("Resources"))->GetDict();
+ m_pPageResources = m_pResources;
+ CPDF_Object* pRotate = GetPageAttr(FX_BSTRC("Rotate"));
+ int rotate = 0;
+ if (pRotate) {
+ rotate = pRotate->GetInteger() / 90 % 4;
+ }
+ if (rotate < 0) {
+ rotate += 4;
+ }
+ CPDF_Array* pMediaBox, *pCropBox;
+ pMediaBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("MediaBox"));
+ CFX_FloatRect mediabox;
+ if (pMediaBox) {
+ mediabox = pMediaBox->GetRect();
+ mediabox.Normalize();
+ }
+ if (mediabox.IsEmpty()) {
+ mediabox = CFX_FloatRect(0, 0, 612, 792);
+ }
+ pCropBox = (CPDF_Array*)GetPageAttr(FX_BSTRC("CropBox"));
+ if (pCropBox) {
+ m_BBox = pCropBox->GetRect();
+ m_BBox.Normalize();
+ }
+ if (m_BBox.IsEmpty()) {
+ m_BBox = mediabox;
+ } else {
+ m_BBox.Intersect(mediabox);
+ }
+ if (rotate % 2) {
+ m_PageHeight = m_BBox.right - m_BBox.left;
+ m_PageWidth = m_BBox.top - m_BBox.bottom;
+ } else {
+ m_PageWidth = m_BBox.right - m_BBox.left;
+ m_PageHeight = m_BBox.top - m_BBox.bottom;
+ }
+ switch (rotate) {
+ case 0:
+ m_PageMatrix.Set(1.0f, 0, 0, 1.0f, -m_BBox.left, -m_BBox.bottom);
+ break;
+ case 1:
+ m_PageMatrix.Set(0, -1.0f, 1.0f, 0, -m_BBox.bottom, m_BBox.right);
+ break;
+ case 2:
+ m_PageMatrix.Set(-1.0f, 0, 0, -1.0f, m_BBox.right, m_BBox.top);
+ break;
+ case 3:
+ m_PageMatrix.Set(0, 1.0f, -1.0f, 0, m_BBox.top, -m_BBox.left);
+ break;
+ }
+ m_Transparency = PDFTRANS_ISOLATED;
+ LoadTransInfo();
+}
+void CPDF_Page::StartParse(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
+{
+ if (bReParse) {
+ ClearCacheObjects();
+ }
+ if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
+ return;
+ }
+ m_pParser = FX_NEW CPDF_ContentParser;
+ m_pParser->Start(this, pOptions);
+ m_ParseState = PDF_CONTENT_PARSING;
+}
+void CPDF_Page::ParseContent(CPDF_ParseOptions* pOptions, FX_BOOL bReParse)
+{
+ StartParse(pOptions, bReParse);
+ ContinueParse(NULL);
+}
+CPDF_Page::~CPDF_Page()
+{
+ if (m_pPageRender) {
+ CPDF_RenderModuleDef* pModule = CPDF_ModuleMgr::Get()->GetRenderModule();
+ pModule->DestroyPageCache(m_pPageRender);
+ }
+}
+CPDF_Object* FPDFAPI_GetPageAttr(CPDF_Dictionary* pPageDict, FX_BSTR name)
+{
+ int level = 0;
+ while (1) {
+ CPDF_Object* pObj = pPageDict->GetElementValue(name);
+ if (pObj) {
+ return pObj;
+ }
+ CPDF_Dictionary* pParent = pPageDict->GetDict(FX_BSTRC("Parent"));
+ if (!pParent || pParent == pPageDict) {
+ return NULL;
+ }
+ pPageDict = pParent;
+ level ++;
+ if (level == 1000) {
+ return NULL;
+ }
+ }
+}
+CPDF_Object* CPDF_Page::GetPageAttr(FX_BSTR name) const
+{
+ return FPDFAPI_GetPageAttr(m_pFormDict, name);
+}
+CPDF_Form::CPDF_Form(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Stream* pFormStream, CPDF_Dictionary* pParentResources)
+{
+ m_pDocument = pDoc;
+ m_pFormStream = pFormStream;
+ m_pFormDict = pFormStream->GetDict();
+ m_pResources = m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pPageResources = pPageResources;
+ if (m_pResources == NULL) {
+ m_pResources = pParentResources;
+ }
+ if (m_pResources == NULL) {
+ m_pResources = pPageResources;
+ }
+ m_Transparency = 0;
+ LoadTransInfo();
+}
+CPDF_Form::~CPDF_Form()
+{
+}
+void CPDF_Form::StartParse(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ if (m_ParseState == PDF_CONTENT_PARSED || m_ParseState == PDF_CONTENT_PARSING) {
+ return;
+ }
+ m_pParser = FX_NEW CPDF_ContentParser;
+ m_pParser->Start(this, pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
+ m_ParseState = PDF_CONTENT_PARSING;
+}
+void CPDF_Form::ParseContent(CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ StartParse(pGraphicStates, pParentMatrix, pType3Char, pOptions, level);
+ ContinueParse(NULL);
+}
+CPDF_Form* CPDF_Form::Clone() const
+{
+ CPDF_Form* pClone = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, m_pFormStream, m_pResources);
+ FX_POSITION pos = m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_ObjectList.GetNext(pos);
+ pClone->m_ObjectList.AddTail(pObj->Clone());
+ }
+ return pClone;
+}
+void CPDF_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos,
+ int xSize, int ySize, int iRotate) const
+{
+ if (m_PageWidth == 0 || m_PageHeight == 0) {
+ return;
+ }
+ CFX_AffineMatrix display_matrix;
+ int x0, y0, x1, y1, x2, y2;
+ iRotate %= 4;
+ switch (iRotate) {
+ case 0:
+ x0 = xPos;
+ y0 = yPos + ySize;
+ x1 = xPos;
+ y1 = yPos;
+ x2 = xPos + xSize;
+ y2 = yPos + ySize;
+ break;
+ case 1:
+ x0 = xPos;
+ y0 = yPos;
+ x1 = xPos + xSize;
+ y1 = yPos;
+ x2 = xPos;
+ y2 = yPos + ySize;
+ break;
+ case 2:
+ x0 = xPos + xSize;
+ y0 = yPos;
+ x1 = xPos + xSize;
+ y1 = yPos + ySize;
+ x2 = xPos;
+ y2 = yPos;
+ break;
+ case 3:
+ x0 = xPos + xSize;
+ y0 = yPos + ySize;
+ x1 = xPos;
+ y1 = yPos + ySize;
+ x2 = xPos + xSize;
+ y2 = yPos;
+ break;
+ }
+ display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),
+ FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),
+ (FX_FLOAT)x0, (FX_FLOAT)y0);
+ matrix = m_PageMatrix;
+ matrix.Concat(display_matrix);
+}
+CPDF_ParseOptions::CPDF_ParseOptions()
+{
+ m_bTextOnly = FALSE;
+ m_bMarkedContent = TRUE;
+ m_bSeparateForm = TRUE;
+ m_bDecodeInlineImage = FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
new file mode 100644
index 0000000000..44b4fc0b1d
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp
@@ -0,0 +1,1401 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "pageint.h"
+#include <limits.h>
+void sRGB_to_AdobeCMYK(FX_FLOAT R, FX_FLOAT G, FX_FLOAT B, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k)
+{
+ c = 1.0f - R;
+ m = 1.0f - G;
+ y = 1.0f - B;
+ k = c;
+ if (m < k) {
+ k = m;
+ }
+ if (y < k) {
+ k = y;
+ }
+}
+CPDF_DeviceCS::CPDF_DeviceCS(int family)
+{
+ m_Family = family;
+ if (m_Family == PDFCS_DEVICERGB) {
+ m_nComponents = 3;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ m_nComponents = 1;
+ } else {
+ m_nComponents = 4;
+ }
+}
+FX_BOOL CPDF_DeviceCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ R = pBuf[0];
+ if (R < 0) {
+ R = 0;
+ } else if (R > 1) {
+ R = 1;
+ }
+ G = pBuf[1];
+ if (G < 0) {
+ G = 0;
+ } else if (G > 1) {
+ G = 1;
+ }
+ B = pBuf[2];
+ if (B < 0) {
+ B = 0;
+ } else if (B > 1) {
+ B = 1;
+ }
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ R = *pBuf;
+ if (R < 0) {
+ R = 0;
+ } else if (R > 1) {
+ R = 1;
+ }
+ G = B = R;
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ if (!m_dwStdConversion) {
+ AdobeCMYK_to_sRGB(pBuf[0], pBuf[1], pBuf[2], pBuf[3], R, G, B);
+ } else {
+ FX_FLOAT k = pBuf[3];
+ R = 1.0f - FX_MIN(1.0f, pBuf[0] + k);
+ G = 1.0f - FX_MIN(1.0f, pBuf[1] + k);
+ B = 1.0f - FX_MIN(1.0f, pBuf[2] + k);
+ }
+ } else {
+ ASSERT(m_Family == PDFCS_PATTERN);
+ R = G = B = 0;
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (m_Family != PDFCS_DEVICECMYK) {
+ return FALSE;
+ }
+ c = pBuf[0];
+ m = pBuf[1];
+ y = pBuf[2];
+ k = pBuf[3];
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ pBuf[0] = R;
+ pBuf[1] = G;
+ pBuf[2] = B;
+ return TRUE;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ if (R == G && R == B) {
+ *pBuf = R;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ sRGB_to_AdobeCMYK(R, G, B, pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DeviceCS::v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ AdobeCMYK_to_sRGB(c, m, y, k, pBuf[0], pBuf[1], pBuf[2]);
+ return TRUE;
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ return FALSE;
+ } else if (m_Family == PDFCS_DEVICECMYK) {
+ pBuf[0] = c;
+ pBuf[1] = m;
+ pBuf[2] = y;
+ pBuf[3] = k;
+ return TRUE;
+ }
+ return FALSE;
+}
+static void ReverseRGB(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels)
+{
+ if (pDestBuf == pSrcBuf)
+ for (int i = 0; i < pixels; i ++) {
+ FX_BYTE temp = pDestBuf[2];
+ pDestBuf[2] = pDestBuf[0];
+ pDestBuf[0] = temp;
+ pDestBuf += 3;
+ }
+ else
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[2];
+ *pDestBuf ++ = pSrcBuf[1];
+ *pDestBuf ++ = pSrcBuf[0];
+ pSrcBuf += 3;
+ }
+}
+void CPDF_DeviceCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (bTransMask && m_Family == PDFCS_DEVICECMYK) {
+ for (int i = 0; i < pixels; i ++) {
+ int k = 255 - pSrcBuf[3];
+ pDestBuf[0] = ((255 - pSrcBuf[0]) * k) / 255;
+ pDestBuf[1] = ((255 - pSrcBuf[1]) * k) / 255;
+ pDestBuf[2] = ((255 - pSrcBuf[2]) * k) / 255;
+ pDestBuf += 3;
+ pSrcBuf += 4;
+ }
+ return;
+ }
+ if (m_Family == PDFCS_DEVICERGB) {
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+ } else if (m_Family == PDFCS_DEVICEGRAY) {
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ }
+ } else {
+ for (int i = 0; i < pixels; i ++) {
+ if (!m_dwStdConversion) {
+ AdobeCMYK_to_sRGB1(pSrcBuf[0], pSrcBuf[1], pSrcBuf[2], pSrcBuf[3], pDestBuf[2], pDestBuf[1], pDestBuf[0]);
+ } else {
+ FX_BYTE k = pSrcBuf[3];
+ pDestBuf[2] = 255 - FX_MIN(255, pSrcBuf[0] + k);
+ pDestBuf[1] = 255 - FX_MIN(255, pSrcBuf[1] + k);
+ pDestBuf[0] = 255 - FX_MIN(255, pSrcBuf[2] + k);
+ }
+ pSrcBuf += 4;
+ pDestBuf += 3;
+ }
+ }
+}
+const FX_BYTE g_sRGBSamples1[] = {
+ 0, 3, 6, 10, 13, 15, 18, 20, 22, 23, 25, 27, 28, 30, 31, 32,
+ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61,
+ 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70,
+ 71, 71, 72, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 78, 79,
+ 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86,
+ 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93,
+ 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 98, 99,
+ 99, 99, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104,
+ 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110,
+ 110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115,
+ 115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 118, 119, 119, 119, 120,
+};
+const FX_BYTE g_sRGBSamples2[] = {
+ 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
+ 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
+ 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
+ 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
+ 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
+ 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
+ 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
+ 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
+ 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
+ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
+ 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
+};
+static void XYZ_to_sRGB(FX_FLOAT X, FX_FLOAT Y, FX_FLOAT Z, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
+{
+ FX_FLOAT R1 = 3.2410f * X - 1.5374f * Y - 0.4986f * Z;
+ FX_FLOAT G1 = -0.9692f * X + 1.8760f * Y + 0.0416f * Z;
+ FX_FLOAT B1 = 0.0556f * X - 0.2040f * Y + 1.0570f * Z;
+ if (R1 > 1) {
+ R1 = 1;
+ }
+ if (R1 < 0) {
+ R1 = 0;
+ }
+ if (G1 > 1) {
+ G1 = 1;
+ }
+ if (G1 < 0) {
+ G1 = 0;
+ }
+ if (B1 > 1) {
+ B1 = 1;
+ }
+ if (B1 < 0) {
+ B1 = 0;
+ }
+ int scale = (int)(R1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ R = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ R = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+ scale = (int)(G1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ G = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ G = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+ scale = (int)(B1 * 1023);
+ if (scale < 0) {
+ scale = 0;
+ }
+ if (scale < 192) {
+ B = (g_sRGBSamples1[scale] / 255.0f);
+ } else {
+ B = (g_sRGBSamples2[scale / 4 - 48] / 255.0f);
+ }
+}
+class CPDF_CalGray : public CPDF_ColorSpace
+{
+public:
+ CPDF_CalGray();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Gamma;
+};
+CPDF_CalGray::CPDF_CalGray()
+{
+ m_Family = PDFCS_CALGRAY;
+ m_nComponents = 1;
+}
+FX_BOOL CPDF_CalGray::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ m_Gamma = pDict->GetNumber(FX_BSTRC("Gamma"));
+ if (m_Gamma == 0) {
+ m_Gamma = 1.0f;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CalGray::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ R = G = B = *pBuf;
+ return TRUE;
+}
+FX_BOOL CPDF_CalGray::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ if (R == G && R == B) {
+ *pBuf = R;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+void CPDF_CalGray::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ for (int i = 0; i < pixels; i ++) {
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ *pDestBuf ++ = pSrcBuf[i];
+ }
+}
+class CPDF_CalRGB : public CPDF_ColorSpace
+{
+public:
+ CPDF_CalRGB();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Gamma[3];
+ FX_FLOAT m_Matrix[9];
+ FX_BOOL m_bGamma, m_bMatrix;
+};
+CPDF_CalRGB::CPDF_CalRGB()
+{
+ m_Family = PDFCS_CALRGB;
+ m_nComponents = 3;
+}
+FX_BOOL CPDF_CalRGB::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Gamma"));
+ if (pParam) {
+ m_bGamma = TRUE;
+ for (i = 0; i < 3; i ++) {
+ m_Gamma[i] = pParam->GetNumber(i);
+ }
+ } else {
+ m_bGamma = FALSE;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Matrix"));
+ if (pParam) {
+ m_bMatrix = TRUE;
+ for (i = 0; i < 9; i ++) {
+ m_Matrix[i] = pParam->GetNumber(i);
+ }
+ } else {
+ m_bMatrix = FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_CalRGB::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ FX_FLOAT A_ = pBuf[0];
+ FX_FLOAT B_ = pBuf[1];
+ FX_FLOAT C_ = pBuf[2];
+ if (m_bGamma) {
+ A_ = (FX_FLOAT)FXSYS_pow(A_, m_Gamma[0]);
+ B_ = (FX_FLOAT)FXSYS_pow(B_, m_Gamma[1]);
+ C_ = (FX_FLOAT)FXSYS_pow(C_, m_Gamma[2]);
+ }
+ FX_FLOAT X, Y, Z;
+ if (m_bMatrix) {
+ X = m_Matrix[0] * A_ + m_Matrix[3] * B_ + m_Matrix[6] * C_;
+ Y = m_Matrix[1] * A_ + m_Matrix[4] * B_ + m_Matrix[7] * C_;
+ Z = m_Matrix[2] * A_ + m_Matrix[5] * B_ + m_Matrix[8] * C_;
+ } else {
+ X = A_;
+ Y = B_;
+ Z = C_;
+ }
+ XYZ_to_sRGB(X, Y, Z, R, G, B);
+ return TRUE;
+}
+FX_BOOL CPDF_CalRGB::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ pBuf[0] = R;
+ pBuf[1] = G;
+ pBuf[2] = B;
+ return TRUE;
+}
+void CPDF_CalRGB::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (bTransMask) {
+ FX_FLOAT Cal[3];
+ FX_FLOAT R, G, B;
+ for(int i = 0; i < pixels; i ++) {
+ Cal[0] = ((FX_FLOAT)pSrcBuf[2]) / 255;
+ Cal[1] = ((FX_FLOAT)pSrcBuf[1]) / 255;
+ Cal[2] = ((FX_FLOAT)pSrcBuf[0]) / 255;
+ GetRGB(Cal, R, G, B);
+ pDestBuf[0] = FXSYS_round(B * 255);
+ pDestBuf[1] = FXSYS_round(G * 255);
+ pDestBuf[2] = FXSYS_round(R * 255);
+ pSrcBuf += 3;
+ pDestBuf += 3;
+ }
+ }
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+}
+class CPDF_LabCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_LabCS()
+ {
+ m_Family = PDFCS_LAB;
+ m_nComponents = 3;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const;
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_FLOAT m_WhitePoint[3];
+ FX_FLOAT m_BlackPoint[3];
+ FX_FLOAT m_Ranges[4];
+};
+FX_BOOL CPDF_LabCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Dictionary* pDict = pArray->GetDict(1);
+ CPDF_Array* pParam = pDict->GetArray(FX_BSTRC("WhitePoint"));
+ int i;
+ for (i = 0; i < 3; i ++) {
+ m_WhitePoint[i] = pParam->GetNumber(i);
+ }
+ pParam = pDict->GetArray(FX_BSTRC("BlackPoint"));
+ for (i = 0; i < 3; i ++) {
+ m_BlackPoint[i] = pParam ? pParam->GetNumber(i) : 0;
+ }
+ pParam = pDict->GetArray(FX_BSTRC("Range"));
+ const FX_FLOAT def_ranges[4] = { -100 * 1.0f, 100 * 1.0f, -100 * 1.0f, 100 * 1.0f};
+ for (i = 0; i < 4; i ++) {
+ m_Ranges[i] = pParam ? pParam->GetNumber(i) : def_ranges[i];
+ }
+ return TRUE;
+}
+void CPDF_LabCS::GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+{
+ value = 0;
+ if (iComponent == 0) {
+ min = 0;
+ max = 100 * 1.0f;
+ } else {
+ min = m_Ranges[iComponent * 2 - 2];
+ max = m_Ranges[iComponent * 2 - 1];
+ if (value < min) {
+ value = min;
+ } else if (value > max) {
+ value = max;
+ }
+ }
+}
+FX_BOOL CPDF_LabCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ FX_FLOAT Lstar = pBuf[0];
+ FX_FLOAT astar = pBuf[1];
+ FX_FLOAT bstar = pBuf[2];
+ FX_FLOAT M = (Lstar + 16.0f) / 116.0f;
+ FX_FLOAT L = M + astar / 500.0f;
+ FX_FLOAT N = M - bstar / 200.0f;
+ FX_FLOAT X, Y, Z;
+ if (L < 0.2069f) {
+ X = 0.957f * 0.12842f * (L - 0.1379f);
+ } else {
+ X = 0.957f * L * L * L;
+ }
+ if (M < 0.2069f) {
+ Y = 0.12842f * (M - 0.1379f);
+ } else {
+ Y = M * M * M;
+ }
+ if (N < 0.2069f) {
+ Z = 1.0889f * 0.12842f * (N - 0.1379f);
+ } else {
+ Z = 1.0889f * N * N * N;
+ }
+ XYZ_to_sRGB(X, Y, Z, R, G, B);
+ return TRUE;
+}
+FX_BOOL CPDF_LabCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ return FALSE;
+}
+void CPDF_LabCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ for (int i = 0; i < pixels; i ++) {
+ FX_FLOAT lab[3];
+ FX_FLOAT R, G, B;
+ lab[0] = (pSrcBuf[0] * 100 / 255.0f);
+ lab[1] = (FX_FLOAT)(pSrcBuf[1] - 128);
+ lab[2] = (FX_FLOAT)(pSrcBuf[2] - 128);
+ GetRGB(lab, R, G, B);
+ pDestBuf[0] = (FX_INT32)(B * 255);
+ pDestBuf[1] = (FX_INT32)(G * 255);
+ pDestBuf[2] = (FX_INT32)(R * 255);
+ pDestBuf += 3;
+ pSrcBuf += 3;
+ }
+}
+CPDF_IccProfile::CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents)
+{
+ m_bsRGB = nComponents == 3 && dwSize == 3144 && FXSYS_memcmp32(pData + 0x190, "sRGB IEC61966-2.1", 17) == 0;
+ m_pTransform = NULL;
+ if (!m_bsRGB && CPDF_ModuleMgr::Get()->GetIccModule()) {
+ m_pTransform = CPDF_ModuleMgr::Get()->GetIccModule()->CreateTransform_sRGB(pData, dwSize, nComponents);
+ }
+}
+CPDF_IccProfile::~CPDF_IccProfile()
+{
+ if (m_pTransform) {
+ CPDF_ModuleMgr::Get()->GetIccModule()->DestroyTransform(m_pTransform);
+ }
+}
+class CPDF_ICCBasedCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_ICCBasedCS();
+ virtual ~CPDF_ICCBasedCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ void GetDefaultValue(int i, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ min = m_pRanges[i * 2];
+ max = m_pRanges[i * 2 + 1];
+ }
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+ FX_FLOAT* m_pRanges;
+ CPDF_IccProfile* m_pProfile;
+ CPDF_ColorSpace* m_pAlterCS;
+ FX_LPBYTE m_pCache;
+ FX_BOOL m_bOwn;
+};
+CPDF_ICCBasedCS::CPDF_ICCBasedCS()
+{
+ m_pAlterCS = NULL;
+ m_pProfile = NULL;
+ m_Family = PDFCS_ICCBASED;
+ m_pCache = NULL;
+ m_pRanges = NULL;
+ m_bOwn = FALSE;
+}
+CPDF_ICCBasedCS::~CPDF_ICCBasedCS()
+{
+ if (m_pCache) {
+ FX_Free(m_pCache);
+ }
+ if (m_pRanges) {
+ FX_Free(m_pRanges);
+ }
+ if (m_pAlterCS && m_bOwn) {
+ m_pAlterCS->ReleaseCS();
+ }
+ if (m_pProfile && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseIccProfile(NULL, m_pProfile);
+ }
+}
+FX_BOOL CPDF_ICCBasedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Stream* pStream = pArray->GetStream(1);
+ if (pStream == NULL) {
+ return FALSE;
+ }
+ m_nComponents = pStream->GetDict()->GetInteger(FX_BSTRC("N"));
+ if (m_nComponents < 0 || m_nComponents > (1 << 16)) {
+ return FALSE;
+ }
+ CPDF_Array* pRanges = pStream->GetDict()->GetArray(FX_BSTRC("Range"));
+ m_pRanges = FX_Alloc(FX_FLOAT, m_nComponents * 2);
+ for (int i = 0; i < m_nComponents * 2; i ++) {
+ if (pRanges) {
+ m_pRanges[i] = pRanges->GetNumber(i);
+ } else if (i % 2) {
+ m_pRanges[i] = 1.0f;
+ } else {
+ m_pRanges[i] = 0;
+ }
+ }
+ m_pProfile = pDoc->LoadIccProfile(pStream, m_nComponents);
+ if (!m_pProfile) {
+ return FALSE;
+ }
+ if (m_pProfile->m_pTransform == NULL) {
+ CPDF_Object* pAlterCSObj = pStream->GetDict()->GetElementValue(FX_BSTRC("Alternate"));
+ if (pAlterCSObj) {
+ CPDF_ColorSpace* alter_cs = CPDF_ColorSpace::Load(pDoc, pAlterCSObj);
+ if (alter_cs) {
+ if (alter_cs->CountComponents() > m_nComponents) {
+ alter_cs->ReleaseCS();
+ } else {
+ m_pAlterCS = alter_cs;
+ m_bOwn = TRUE;
+ }
+ }
+ }
+ if (!m_pAlterCS) {
+ if (m_nComponents == 3) {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICERGB);
+ } else if (m_nComponents == 4) {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICECMYK);
+ } else {
+ m_pAlterCS = GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pProfile && m_pProfile->m_bsRGB) {
+ R = pBuf[0];
+ G = pBuf[1];
+ B = pBuf[2];
+ return TRUE;
+ }
+ ICodec_IccModule *pIccModule = CPDF_ModuleMgr::Get()->GetIccModule();
+ if (m_pProfile->m_pTransform == NULL || pIccModule == NULL) {
+ if (m_pAlterCS) {
+ m_pAlterCS->GetRGB(pBuf, R, G, B);
+ } else {
+ R = G = B = 0.0f;
+ }
+ return TRUE;
+ }
+ FX_FLOAT rgb[3];
+ pIccModule->Translate(m_pProfile->m_pTransform, pBuf, rgb);
+ R = rgb[0];
+ G = rgb[1];
+ B = rgb[2];
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (m_nComponents != 4) {
+ return FALSE;
+ }
+ c = pBuf[0];
+ m = pBuf[1];
+ y = pBuf[2];
+ k = pBuf[3];
+ return TRUE;
+}
+FX_BOOL CPDF_ICCBasedCS::SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const
+{
+ return FALSE;
+}
+void CPDF_ICCBasedCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAlterCS) {
+ m_pAlterCS->EnableStdConversion(bEnabled);
+ }
+}
+void CPDF_ICCBasedCS::TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ if (m_pProfile->m_bsRGB) {
+ ReverseRGB(pDestBuf, pSrcBuf, pixels);
+ } else if (m_pProfile->m_pTransform) {
+ int nMaxColors = 1;
+ for (int i = 0; i < m_nComponents; i ++) {
+ nMaxColors *= 52;
+ }
+ if (m_nComponents > 3 || image_width * image_height < nMaxColors * 3 / 2) {
+ CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, pDestBuf, pSrcBuf, pixels);
+ } else {
+ if (m_pCache == NULL) {
+ ((CPDF_ICCBasedCS*)this)->m_pCache = FX_Alloc(FX_BYTE, nMaxColors * 3);
+ FX_LPBYTE temp_src = FX_Alloc(FX_BYTE, nMaxColors * m_nComponents);
+ FX_LPBYTE pSrc = temp_src;
+ for (int i = 0; i < nMaxColors; i ++) {
+ FX_DWORD color = i;
+ FX_DWORD order = nMaxColors / 52;
+ for (int c = 0; c < m_nComponents; c ++) {
+ *pSrc++ = (FX_BYTE)(color / order * 5);
+ color %= order;
+ order /= 52;
+ }
+ }
+ CPDF_ModuleMgr::Get()->GetIccModule()->TranslateScanline(m_pProfile->m_pTransform, m_pCache, temp_src, nMaxColors);
+ FX_Free(temp_src);
+ }
+ for (int i = 0; i < pixels; i ++) {
+ int index = 0;
+ for (int c = 0; c < m_nComponents; c ++) {
+ index = index * 52 + (*pSrcBuf) / 5;
+ pSrcBuf ++;
+ }
+ index *= 3;
+ *pDestBuf++ = m_pCache[index];
+ *pDestBuf++ = m_pCache[index + 1];
+ *pDestBuf++ = m_pCache[index + 2];
+ }
+ }
+ } else if (m_pAlterCS) {
+ m_pAlterCS->TranslateImageLine(pDestBuf, pSrcBuf, pixels, image_width, image_height);
+ }
+}
+class CPDF_IndexedCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_IndexedCS();
+ virtual ~CPDF_IndexedCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ void GetDefaultValue(int iComponent, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ min = 0;
+ max = (FX_FLOAT)m_MaxIndex;
+ }
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual CPDF_ColorSpace* GetBaseCS() const
+ {
+ return m_pBaseCS;
+ }
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pBaseCS;
+ int m_nBaseComponents;
+ int m_MaxIndex;
+ CFX_ByteString m_Table;
+ FX_FLOAT* m_pCompMinMax;
+};
+CPDF_IndexedCS::CPDF_IndexedCS()
+{
+ m_pBaseCS = NULL;
+ m_Family = PDFCS_INDEXED;
+ m_nComponents = 1;
+ m_pCompMinMax = NULL;
+}
+CPDF_IndexedCS::~CPDF_IndexedCS()
+{
+ if (m_pCompMinMax) {
+ FX_Free(m_pCompMinMax);
+ }
+ CPDF_ColorSpace* pCS = m_pBaseCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+}
+FX_BOOL CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ if (pArray->GetCount() < 4) {
+ return FALSE;
+ }
+ CPDF_Object* pBaseObj = pArray->GetElementValue(1);
+ if (pBaseObj == m_pArray) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+ m_pBaseCS = pDocPageData->GetColorSpace(pBaseObj, NULL);
+ if (m_pBaseCS == NULL) {
+ return FALSE;
+ }
+ m_nBaseComponents = m_pBaseCS->CountComponents();
+ m_pCompMinMax = FX_Alloc(FX_FLOAT, m_nBaseComponents * 2);
+ FX_FLOAT defvalue;
+ for (int i = 0; i < m_nBaseComponents; i ++) {
+ m_pBaseCS->GetDefaultValue(i, defvalue, m_pCompMinMax[i * 2], m_pCompMinMax[i * 2 + 1]);
+ m_pCompMinMax[i * 2 + 1] -= m_pCompMinMax[i * 2];
+ }
+ m_MaxIndex = pArray->GetInteger(2);
+ CPDF_Object* pTableObj = pArray->GetElementValue(3);
+ if (pTableObj == NULL) {
+ return FALSE;
+ }
+ FX_LPCBYTE pTable = NULL;
+ FX_DWORD size = 0;
+ CPDF_StreamAcc* pStreamAcc = NULL;
+ if (pTableObj->GetType() == PDFOBJ_STRING) {
+ m_Table = ((CPDF_String*)pTableObj)->GetString();
+ } else if (pTableObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_StreamAcc acc;
+ acc.LoadAllData((CPDF_Stream*)pTableObj, FALSE);
+ m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize());
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_IndexedCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ int index = (FX_INT32)(*pBuf);
+ if (index < 0 || index > m_MaxIndex) {
+ return FALSE;
+ }
+ if (m_nBaseComponents) {
+ if (index == INT_MAX || (index + 1) > INT_MAX / m_nBaseComponents ||
+ (index + 1)*m_nBaseComponents > (int)m_Table.GetLength()) {
+ R = G = B = 0;
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> Comps(m_nBaseComponents);
+ FX_FLOAT* comps = Comps;
+ FX_LPCBYTE pTable = m_Table;
+ for (int i = 0; i < m_nBaseComponents; i ++) {
+ comps[i] = m_pCompMinMax[i * 2] + m_pCompMinMax[i * 2 + 1] * pTable[index * m_nBaseComponents + i] / 255;
+ }
+ m_pBaseCS->GetRGB(comps, R, G, B);
+ return TRUE;
+}
+void CPDF_IndexedCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pBaseCS) {
+ m_pBaseCS->EnableStdConversion(bEnabled);
+ }
+}
+#define MAX_PATTERN_COLORCOMPS 16
+typedef struct _PatternValue {
+ CPDF_Pattern* m_pPattern;
+ int m_nComps;
+ FX_FLOAT m_Comps[MAX_PATTERN_COLORCOMPS];
+} PatternValue;
+CPDF_PatternCS::CPDF_PatternCS()
+{
+ m_Family = PDFCS_PATTERN;
+ m_pBaseCS = NULL;
+ m_nComponents = 1;
+}
+CPDF_PatternCS::~CPDF_PatternCS()
+{
+ CPDF_ColorSpace* pCS = m_pBaseCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+}
+FX_BOOL CPDF_PatternCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Object* pBaseCS = pArray->GetElementValue(1);
+ if (pBaseCS == m_pArray) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = pDoc->GetPageData();
+ m_pBaseCS = pDocPageData->GetColorSpace(pBaseCS, NULL);
+ if (m_pBaseCS) {
+ m_nComponents = m_pBaseCS->CountComponents() + 1;
+ if (m_pBaseCS->CountComponents() > MAX_PATTERN_COLORCOMPS) {
+ return FALSE;
+ }
+ } else {
+ m_nComponents = 1;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_PatternCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pBaseCS) {
+ PatternValue* pvalue = (PatternValue*)pBuf;
+ m_pBaseCS->GetRGB(pvalue->m_Comps, R, G, B);
+ return TRUE;
+ }
+ R = G = B = 0.75f;
+ return FALSE;
+}
+class CPDF_SeparationCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_SeparationCS();
+ virtual ~CPDF_SeparationCS();
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ value = 1.0f;
+ min = 0;
+ max = 1.0f;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pAltCS;
+ CPDF_Function* m_pFunc;
+ enum {None, All, Colorant} m_Type;
+};
+CPDF_SeparationCS::CPDF_SeparationCS()
+{
+ m_Family = PDFCS_SEPARATION;
+ m_pAltCS = NULL;
+ m_pFunc = NULL;
+ m_nComponents = 1;
+}
+CPDF_SeparationCS::~CPDF_SeparationCS()
+{
+ if (m_pAltCS) {
+ m_pAltCS->ReleaseCS();
+ }
+ if (m_pFunc) {
+ delete m_pFunc;
+ }
+}
+FX_BOOL CPDF_SeparationCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CFX_ByteString name = pArray->GetString(1);
+ if (name == FX_BSTRC("None")) {
+ m_Type = None;
+ } else {
+ m_Type = Colorant;
+ CPDF_Object* pAltCS = pArray->GetElementValue(2);
+ if (pAltCS == m_pArray) {
+ return FALSE;
+ }
+ m_pAltCS = Load(pDoc, pAltCS);
+ CPDF_Object* pFuncObj = pArray->GetElementValue(3);
+ if (pFuncObj && pFuncObj->GetType() != PDFOBJ_NAME) {
+ m_pFunc = CPDF_Function::Load(pFuncObj);
+ }
+ if (m_pFunc && m_pAltCS && m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
+ delete m_pFunc;
+ m_pFunc = NULL;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_SeparationCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_Type == None) {
+ return FALSE;
+ }
+ if (m_pFunc == NULL) {
+ if (m_pAltCS == NULL) {
+ return FALSE;
+ }
+ int nComps = m_pAltCS->CountComponents();
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(nComps);
+ for (int i = 0; i < nComps; i ++) {
+ results[i] = *pBuf;
+ }
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
+ int nresults;
+ m_pFunc->Call(pBuf, 1, results, nresults);
+ if (nresults == 0) {
+ return FALSE;
+ }
+ if (m_pAltCS) {
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+ } else {
+ R = G = B = 0;
+ return FALSE;
+ }
+}
+void CPDF_SeparationCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAltCS) {
+ m_pAltCS->EnableStdConversion(bEnabled);
+ }
+}
+class CPDF_DeviceNCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_DeviceNCS();
+ virtual ~CPDF_DeviceNCS();
+ virtual void GetDefaultValue(int iComponent, FX_FLOAT& value, FX_FLOAT& min, FX_FLOAT& max) const
+ {
+ value = 1.0f;
+ min = 0;
+ max = 1.0f;
+ }
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual void EnableStdConversion(FX_BOOL bEnabled);
+ CPDF_ColorSpace* m_pAltCS;
+ CPDF_Function* m_pFunc;
+};
+CPDF_DeviceNCS::CPDF_DeviceNCS()
+{
+ m_Family = PDFCS_DEVICEN;
+ m_pAltCS = NULL;
+ m_pFunc = NULL;
+}
+CPDF_DeviceNCS::~CPDF_DeviceNCS()
+{
+ if (m_pFunc) {
+ delete m_pFunc;
+ }
+ if (m_pAltCS) {
+ m_pAltCS->ReleaseCS();
+ }
+}
+FX_BOOL CPDF_DeviceNCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray)
+{
+ CPDF_Object* pObj = pArray->GetElementValue(1);
+ if (!pObj) {
+ return FALSE;
+ }
+ if (pObj->GetType() != PDFOBJ_ARRAY) {
+ return FALSE;
+ }
+ m_nComponents = ((CPDF_Array*)pObj)->GetCount();
+ CPDF_Object* pAltCS = pArray->GetElementValue(2);
+ if (!pAltCS || pAltCS == m_pArray) {
+ return FALSE;
+ }
+ m_pAltCS = Load(pDoc, pAltCS);
+ m_pFunc = CPDF_Function::Load(pArray->GetElementValue(3));
+ if (m_pAltCS == NULL || m_pFunc == NULL) {
+ return FALSE;
+ }
+ if (m_pFunc->CountOutputs() < m_pAltCS->CountComponents()) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DeviceNCS::GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const
+{
+ if (m_pFunc == NULL) {
+ return FALSE;
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(m_pFunc->CountOutputs());
+ int nresults;
+ m_pFunc->Call(pBuf, m_nComponents, results, nresults);
+ if (nresults == 0) {
+ return FALSE;
+ }
+ m_pAltCS->GetRGB(results, R, G, B);
+ return TRUE;
+}
+void CPDF_DeviceNCS::EnableStdConversion(FX_BOOL bEnabled)
+{
+ CPDF_ColorSpace::EnableStdConversion(bEnabled);
+ if (m_pAltCS) {
+ m_pAltCS->EnableStdConversion(bEnabled);
+ }
+}
+CPDF_ColorSpace* CPDF_ColorSpace::GetStockCS(int family)
+{
+ return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);;
+}
+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name)
+{
+ if (name == FX_BSTRC("DeviceRGB") || name == FX_BSTRC("RGB")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ }
+ if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("G")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ if (name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("CMYK")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ }
+ if (name == FX_BSTRC("Pattern")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ }
+ return NULL;
+}
+CPDF_ColorSpace* CPDF_ColorSpace::Load(CPDF_Document* pDoc, CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ return NULL;
+ }
+ if (pObj->GetType() == PDFOBJ_NAME) {
+ return _CSFromName(pObj->GetString());
+ }
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ CPDF_Dictionary *pDict = ((CPDF_Stream *)pObj)->GetDict();
+ if (!pDict) {
+ return NULL;
+ }
+ CPDF_ColorSpace *pRet = NULL;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString bsKey;
+ CPDF_Object *pValue = pDict->GetNextElement(pos, bsKey);
+ if (pValue->GetType() == PDFOBJ_NAME) {
+ pRet = _CSFromName(pValue->GetString());
+ }
+ if (pRet) {
+ return pRet;
+ }
+ }
+ return NULL;
+ }
+ if (pObj->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ if (pArray->GetCount() == 0) {
+ return NULL;
+ }
+ CFX_ByteString familyname = pArray->GetElementValue(0)->GetString();
+ if (pArray->GetCount() == 1) {
+ return _CSFromName(familyname);
+ }
+ CPDF_ColorSpace* pCS = NULL;
+ FX_DWORD id = familyname.GetID();
+ if (id == FXBSTR_ID('C', 'a', 'l', 'G')) {
+ pCS = FX_NEW CPDF_CalGray();
+ } else if (id == FXBSTR_ID('C', 'a', 'l', 'R')) {
+ pCS = FX_NEW CPDF_CalRGB();
+ } else if (id == FXBSTR_ID('L', 'a', 'b', 0)) {
+ pCS = FX_NEW CPDF_LabCS();
+ } else if (id == FXBSTR_ID('I', 'C', 'C', 'B')) {
+ pCS = FX_NEW CPDF_ICCBasedCS();
+ } else if (id == FXBSTR_ID('I', 'n', 'd', 'e') || id == FXBSTR_ID('I', 0, 0, 0)) {
+ pCS = FX_NEW CPDF_IndexedCS();
+ } else if (id == FXBSTR_ID('S', 'e', 'p', 'a')) {
+ pCS = FX_NEW CPDF_SeparationCS();
+ } else if (id == FXBSTR_ID('D', 'e', 'v', 'i')) {
+ pCS = FX_NEW CPDF_DeviceNCS();
+ } else if (id == FXBSTR_ID('P', 'a', 't', 't')) {
+ pCS = FX_NEW CPDF_PatternCS();
+ } else {
+ return NULL;
+ }
+ pCS->m_pDocument = pDoc;
+ pCS->m_pArray = pArray;
+ if (!pCS->v_Load(pDoc, pArray)) {
+ pCS->ReleaseCS();
+ return NULL;
+ }
+ return pCS;
+}
+CPDF_ColorSpace::CPDF_ColorSpace()
+{
+ m_Family = 0;
+ m_pArray = NULL;
+ m_dwStdConversion = 0;
+ m_pDocument = NULL;
+}
+void CPDF_ColorSpace::ReleaseCS()
+{
+ if (this == GetStockCS(PDFCS_DEVICERGB)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_DEVICEGRAY)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_DEVICECMYK)) {
+ return;
+ }
+ if (this == GetStockCS(PDFCS_PATTERN)) {
+ return;
+ }
+ delete this;
+}
+int CPDF_ColorSpace::GetBufSize() const
+{
+ if (m_Family == PDFCS_PATTERN) {
+ return sizeof(PatternValue);
+ }
+ return m_nComponents * sizeof(FX_FLOAT);
+}
+FX_FLOAT* CPDF_ColorSpace::CreateBuf()
+{
+ int size = GetBufSize();
+ FX_BYTE* pBuf = FX_Alloc(FX_BYTE, size);
+ FXSYS_memset32(pBuf, 0, size);
+ return (FX_FLOAT*)pBuf;
+}
+FX_BOOL CPDF_ColorSpace::sRGB() const
+{
+ if (m_Family == PDFCS_DEVICERGB) {
+ return TRUE;
+ }
+ if (m_Family != PDFCS_ICCBASED) {
+ return FALSE;
+ }
+ CPDF_ICCBasedCS* pCS = (CPDF_ICCBasedCS*)this;
+ return pCS->m_pProfile->m_bsRGB;
+}
+FX_BOOL CPDF_ColorSpace::GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const
+{
+ if (v_GetCMYK(pBuf, c, m, y, k)) {
+ return TRUE;
+ }
+ FX_FLOAT R, G, B;
+ if (!GetRGB(pBuf, R, G, B)) {
+ return FALSE;
+ }
+ sRGB_to_AdobeCMYK(R, G, B, c, m, y, k);
+ return TRUE;
+}
+FX_BOOL CPDF_ColorSpace::SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const
+{
+ if (v_SetCMYK(pBuf, c, m, y, k)) {
+ return TRUE;
+ }
+ FX_FLOAT R, G, B;
+ AdobeCMYK_to_sRGB(c, m, y, k, R, G, B);
+ return SetRGB(pBuf, R, G, B);
+}
+void CPDF_ColorSpace::GetDefaultColor(FX_FLOAT* buf) const
+{
+ if (buf == NULL || m_Family == PDFCS_PATTERN) {
+ return;
+ }
+ FX_FLOAT min, max;
+ for (int i = 0; i < m_nComponents; i ++) {
+ GetDefaultValue(i, buf[i], min, max);
+ }
+}
+int CPDF_ColorSpace::GetMaxIndex() const
+{
+ if (m_Family != PDFCS_INDEXED) {
+ return 0;
+ }
+ CPDF_IndexedCS* pCS = (CPDF_IndexedCS*)this;
+ return pCS->m_MaxIndex;
+}
+void CPDF_ColorSpace::TranslateImageLine(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int image_width, int image_height, FX_BOOL bTransMask) const
+{
+ CFX_FixedBufGrow<FX_FLOAT, 16> srcbuf(m_nComponents);
+ FX_FLOAT* src = srcbuf;
+ FX_FLOAT R, G, B;
+ for (int i = 0; i < pixels; i ++) {
+ for (int j = 0; j < m_nComponents; j ++)
+ if (m_Family == PDFCS_INDEXED) {
+ src[j] = (FX_FLOAT)(*src_buf ++);
+ } else {
+ src[j] = (FX_FLOAT)(*src_buf ++) / 255;
+ }
+ GetRGB(src, R, G, B);
+ *dest_buf ++ = (FX_INT32)(B * 255);
+ *dest_buf ++ = (FX_INT32)(G * 255);
+ *dest_buf ++ = (FX_INT32)(R * 255);
+ }
+}
+void CPDF_ColorSpace::EnableStdConversion(FX_BOOL bEnabled)
+{
+ if (bEnabled) {
+ m_dwStdConversion ++;
+ } else if (m_dwStdConversion) {
+ m_dwStdConversion --;
+ }
+}
+CPDF_Color::CPDF_Color(int family)
+{
+ m_pCS = CPDF_ColorSpace::GetStockCS(family);
+ int nComps = 3;
+ if (family == PDFCS_DEVICEGRAY) {
+ nComps = 1;
+ } else if (family == PDFCS_DEVICECMYK) {
+ nComps = 4;
+ }
+ m_pBuffer = FX_Alloc(FX_FLOAT, nComps);
+ for (int i = 0; i < nComps; i ++) {
+ m_pBuffer[i] = 0;
+ }
+}
+CPDF_Color::~CPDF_Color()
+{
+ ReleaseBuffer();
+ ReleaseColorSpace();
+}
+void CPDF_Color::ReleaseBuffer()
+{
+ if (!m_pBuffer) {
+ return;
+ }
+ if (m_pCS->GetFamily() == PDFCS_PATTERN) {
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ CPDF_Pattern* pPattern = pvalue->m_pPattern;
+ if (pPattern && pPattern->m_pDocument) {
+ pPattern->m_pDocument->GetPageData()->ReleasePattern(pPattern->m_pPatternObj);
+ }
+ }
+ FX_Free(m_pBuffer);
+ m_pBuffer = NULL;
+}
+void CPDF_Color::ReleaseColorSpace()
+{
+ if (m_pCS && m_pCS->m_pDocument && m_pCS->GetArray()) {
+ m_pCS->m_pDocument->GetPageData()->ReleaseColorSpace(m_pCS->GetArray());
+ m_pCS = NULL;
+ }
+}
+void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS)
+{
+ if (m_pCS == pCS) {
+ if (m_pBuffer == NULL) {
+ m_pBuffer = pCS->CreateBuf();
+ }
+ ReleaseColorSpace();
+ m_pCS = pCS;
+ return;
+ }
+ ReleaseBuffer();
+ ReleaseColorSpace();
+ m_pCS = pCS;
+ if (m_pCS) {
+ m_pBuffer = pCS->CreateBuf();
+ pCS->GetDefaultColor(m_pBuffer);
+ }
+}
+void CPDF_Color::SetValue(FX_FLOAT* comps)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ if (m_pCS->GetFamily() != PDFCS_PATTERN) {
+ FXSYS_memcpy32(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(FX_FLOAT));
+ }
+}
+void CPDF_Color::SetValue(CPDF_Pattern* pPattern, FX_FLOAT* comps, int ncomps)
+{
+ if (ncomps > MAX_PATTERN_COLORCOMPS) {
+ return;
+ }
+ if (m_pCS == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ if (m_pBuffer) {
+ FX_Free(m_pBuffer);
+ }
+ m_pCS = CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ m_pBuffer = m_pCS->CreateBuf();
+ }
+ CPDF_DocPageData* pDocPageData = NULL;
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
+ pDocPageData = pvalue->m_pPattern->m_pDocument->GetPageData();
+ pDocPageData->ReleasePattern(pvalue->m_pPattern->m_pPatternObj);
+ }
+ pvalue->m_nComps = ncomps;
+ pvalue->m_pPattern = pPattern;
+ if (ncomps) {
+ FXSYS_memcpy32(pvalue->m_Comps, comps, ncomps * sizeof(FX_FLOAT));
+ }
+}
+void CPDF_Color::Copy(const CPDF_Color* pSrc)
+{
+ ReleaseBuffer();
+ ReleaseColorSpace();
+ m_pCS = pSrc->m_pCS;
+ if (m_pCS && m_pCS->m_pDocument) {
+ CPDF_Array* pArray = m_pCS->GetArray();
+ if (pArray) {
+ m_pCS = m_pCS->m_pDocument->GetPageData()->GetCopiedColorSpace(pArray);
+ }
+ }
+ if (m_pCS == NULL) {
+ return;
+ }
+ m_pBuffer = m_pCS->CreateBuf();
+ FXSYS_memcpy32(m_pBuffer, pSrc->m_pBuffer, m_pCS->GetBufSize());
+ if (m_pCS->GetFamily() == PDFCS_PATTERN) {
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ if (pvalue->m_pPattern && pvalue->m_pPattern->m_pDocument) {
+ pvalue->m_pPattern = pvalue->m_pPattern->m_pDocument->GetPageData()->GetPattern(pvalue->m_pPattern->m_pPatternObj, FALSE, &pvalue->m_pPattern->m_ParentMatrix);
+ }
+ }
+}
+FX_BOOL CPDF_Color::GetRGB(int& R, int& G, int& B) const
+{
+ if (m_pCS == NULL || m_pBuffer == NULL) {
+ return FALSE;
+ }
+ FX_FLOAT r, g, b;
+ if (!m_pCS->GetRGB(m_pBuffer, r, g, b)) {
+ return FALSE;
+ }
+ R = (FX_INT32)(r * 255 + 0.5f);
+ G = (FX_INT32)(g * 255 + 0.5f);
+ B = (FX_INT32)(b * 255 + 0.5f);
+ return TRUE;
+}
+CPDF_Pattern* CPDF_Color::GetPattern() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ return pvalue->m_pPattern;
+}
+CPDF_ColorSpace* CPDF_Color::GetPatternCS() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ return m_pCS->GetBaseCS();
+}
+FX_FLOAT* CPDF_Color::GetPatternColor() const
+{
+ if (m_pBuffer == NULL || m_pCS->GetFamily() != PDFCS_PATTERN) {
+ return NULL;
+ }
+ PatternValue* pvalue = (PatternValue*)m_pBuffer;
+ return pvalue->m_nComps ? pvalue->m_Comps : NULL;
+}
+FX_BOOL CPDF_Color::IsEqual(const CPDF_Color& other) const
+{
+ if (m_pCS != other.m_pCS || m_pCS == NULL) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(m_pBuffer, other.m_pBuffer, m_pCS->GetBufSize()) == 0;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
new file mode 100644
index 0000000000..d4e5bef400
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp
@@ -0,0 +1,647 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fdrm/fx_crypt.h"
+#include "../fpdf_font/font_int.h"
+#include "pageint.h"
+class CPDF_PageModule : public CPDF_PageModuleDef
+{
+public:
+ CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB),
+ m_StockCMYKCS(PDFCS_DEVICECMYK) {}
+ virtual ~CPDF_PageModule() {}
+ virtual FX_BOOL Installed()
+ {
+ return TRUE;
+ }
+ virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc)
+ {
+ return FX_NEW CPDF_DocPageData(pDoc);
+ }
+ virtual void ReleaseDoc(CPDF_Document* pDoc);
+ virtual void ClearDoc(CPDF_Document* pDoc);
+ virtual CPDF_FontGlobals* GetFontGlobals()
+ {
+ return &m_FontGlobals;
+ }
+ virtual void ClearStockFont(CPDF_Document* pDoc)
+ {
+ m_FontGlobals.Clear(pDoc);
+ }
+ virtual CPDF_ColorSpace* GetStockCS(int family);
+ virtual void NotifyCJKAvailable();
+ CPDF_FontGlobals m_FontGlobals;
+ CPDF_DeviceCS m_StockGrayCS;
+ CPDF_DeviceCS m_StockRGBCS;
+ CPDF_DeviceCS m_StockCMYKCS;
+ CPDF_PatternCS m_StockPatternCS;
+};
+CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family)
+{
+ if (family == PDFCS_DEVICEGRAY) {
+ return &m_StockGrayCS;
+ }
+ if (family == PDFCS_DEVICERGB) {
+ return &m_StockRGBCS;
+ }
+ if (family == PDFCS_DEVICECMYK) {
+ return &m_StockCMYKCS;
+ }
+ if (family == PDFCS_PATTERN) {
+ return &m_StockPatternCS;
+ }
+ return NULL;
+}
+void CPDF_ModuleMgr::InitPageModule()
+{
+ if (m_pPageModule) {
+ delete m_pPageModule;
+ }
+ CPDF_PageModule* pPageModule = FX_NEW CPDF_PageModule;
+ m_pPageModule = pPageModule;
+}
+void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc)
+{
+ delete pDoc->GetPageData();
+}
+void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc)
+{
+ pDoc->GetPageData()->Clear(FALSE);
+}
+void CPDF_PageModule::NotifyCJKAvailable()
+{
+ m_FontGlobals.m_CMapManager.ReloadAll();
+}
+CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFont(pFontDict, FALSE);
+}
+CPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFont(pFontDict, TRUE);
+}
+CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream)
+{
+ if (pStream == NULL) {
+ return NULL;
+ }
+ return GetValidatePageData()->GetFontFileStreamAcc(pStream);
+}
+CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name);
+CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
+{
+ return GetValidatePageData()->GetColorSpace(pCSObj, pResources);
+}
+CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
+{
+ return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix);
+}
+CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream, int nComponents)
+{
+ return GetValidatePageData()->GetIccProfile(pStream, nComponents);
+}
+CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj)
+{
+ if (!pObj) {
+ return NULL;
+ }
+ FXSYS_assert(pObj->GetObjNum());
+ return GetValidatePageData()->GetImage(pObj);
+}
+void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj)
+{
+ if (!pCSObj) {
+ return;
+ }
+ GetPageData()->ReleaseColorSpace(pCSObj);
+}
+CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc)
+ : m_pPDFDoc(pPDFDoc)
+ , m_FontMap()
+ , m_ColorSpaceMap()
+ , m_PatternMap()
+ , m_ImageMap()
+ , m_IccProfileMap()
+ , m_FontFileMap()
+{
+ m_FontMap.InitHashTable(64);
+ m_ColorSpaceMap.InitHashTable(32);
+ m_PatternMap.InitHashTable(16);
+ m_ImageMap.InitHashTable(64);
+ m_IccProfileMap.InitHashTable(16);
+ m_FontFileMap.InitHashTable(32);
+}
+CPDF_DocPageData::~CPDF_DocPageData()
+{
+ Clear(FALSE);
+ Clear(TRUE);
+ FX_POSITION pos = NULL;
+}
+void CPDF_DocPageData::Clear(FX_BOOL bRelease)
+{
+ FX_POSITION pos;
+ FX_DWORD nCount;
+ {
+ pos = m_PatternMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* ptObj;
+ CPDF_CountedObject<CPDF_Pattern*>* ptData;
+ m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
+ nCount = ptData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete ptData->m_Obj;
+ ptData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_FontMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* fontDict;
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+ nCount = fontData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete fontData->m_Obj;
+ fontData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_ImageMap.GetStartPosition();
+ while (pos) {
+ FX_DWORD objNum;
+ CPDF_CountedObject<CPDF_Image*>* imageData;
+ m_ImageMap.GetNextAssoc(pos, objNum, imageData);
+ nCount = imageData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete imageData->m_Obj;
+ delete imageData;
+ m_ImageMap.RemoveKey(objNum);
+ }
+ }
+ }
+ {
+ pos = m_ColorSpaceMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* csKey;
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
+ nCount = csData->m_nCount;
+ if (bRelease || nCount < 2) {
+ csData->m_Obj->ReleaseCS();
+ csData->m_Obj = NULL;
+ }
+ }
+ }
+ {
+ pos = m_IccProfileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ipKey;
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData;
+ m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData);
+ nCount = ipData->m_nCount;
+ if (bRelease || nCount < 2) {
+ FX_POSITION pos2 = m_HashProfileMap.GetStartPosition();
+ while (pos2) {
+ CFX_ByteString bsKey;
+ CPDF_Stream* pFindStream = NULL;
+ m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
+ if (ipKey == pFindStream) {
+ m_HashProfileMap.RemoveKey(bsKey);
+ break;
+ }
+ }
+ delete ipData->m_Obj;
+ delete ipData;
+ m_IccProfileMap.RemoveKey(ipKey);
+ }
+ }
+ }
+ {
+ pos = m_FontFileMap.GetStartPosition();
+ while (pos) {
+ CPDF_Stream* ftKey;
+ CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
+ m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
+ nCount = ftData->m_nCount;
+ if (bRelease || nCount < 2) {
+ delete ftData->m_Obj;
+ delete ftData;
+ m_FontFileMap.RemoveKey(ftKey);
+ }
+ }
+ }
+}
+CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly)
+{
+ if (!pFontDict) {
+ return NULL;
+ }
+ if (findOnly) {
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ if (m_FontMap.Lookup(pFontDict, fontData)) {
+ if (!fontData->m_Obj) {
+ return NULL;
+ }
+ fontData->m_nCount ++;
+ return fontData->m_Obj;
+ }
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_Font*>* fontData = NULL;
+ if (m_FontMap.Lookup(pFontDict, fontData)) {
+ if (fontData->m_Obj) {
+ fontData->m_nCount ++;
+ return fontData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!fontData) {
+ fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
+ bNew = TRUE;
+ if (!fontData) {
+ return NULL;
+ }
+ }
+ CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict);
+ if (!pFont) {
+ if (bNew) {
+ delete fontData;
+ }
+ return NULL;
+ }
+ fontData->m_nCount = 2;
+ fontData->m_Obj = pFont;
+ m_FontMap.SetAt(pFontDict, fontData);
+ return pFont;
+}
+CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding)
+{
+ if (fontName.IsEmpty()) {
+ return NULL;
+ }
+ FX_POSITION pos = m_FontMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* fontDict;
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ m_FontMap.GetNextAssoc(pos, fontDict, fontData);
+ CPDF_Font* pFont = fontData->m_Obj;
+ if (!pFont) {
+ continue;
+ }
+ if (pFont->GetBaseFont() != fontName) {
+ continue;
+ }
+ if (pFont->IsEmbedded()) {
+ continue;
+ }
+ if (pFont->GetFontType() != PDFFONT_TYPE1) {
+ continue;
+ }
+ if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) {
+ continue;
+ }
+ CPDF_Type1Font* pT1Font = pFont->GetType1Font();
+ if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) {
+ continue;
+ }
+ fontData->m_nCount ++;
+ return pFont;
+ }
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font"));
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1"));
+ pDict->SetAtName(FX_BSTRC("BaseFont"), fontName);
+ if (pEncoding) {
+ pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize());
+ }
+ m_pPDFDoc->AddIndirectObject(pDict);
+ CPDF_CountedObject<CPDF_Font*>* fontData = FX_NEW CPDF_CountedObject<CPDF_Font*>;
+ if (!fontData) {
+ return NULL;
+ }
+ CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict);
+ if (!pFont) {
+ delete fontData;
+ return NULL;
+ }
+ fontData->m_nCount = 2;
+ fontData->m_Obj = pFont;
+ m_FontMap.SetAt(pDict, fontData);
+ return pFont;
+}
+void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict)
+{
+ if (!pFontDict) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_Font*>* fontData;
+ if (!m_FontMap.Lookup(pFontDict, fontData)) {
+ return;
+ }
+ if (fontData->m_Obj && --fontData->m_nCount == 0) {
+ delete fontData->m_Obj;
+ fontData->m_Obj = NULL;
+ }
+}
+CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources)
+{
+ if (!pCSObj) {
+ return NULL;
+ }
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetConstString();
+ CPDF_ColorSpace* pCS = _CSFromName(name);
+ if (!pCS && pResources) {
+ CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"));
+ if (pList) {
+ pCSObj = pList->GetElementValue(name);
+ return GetColorSpace(pCSObj, NULL);
+ }
+ }
+ if (pCS == NULL || pResources == NULL) {
+ return pCS;
+ }
+ CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace"));
+ if (pColorSpaces == NULL) {
+ return pCS;
+ }
+ CPDF_Object* pDefaultCS = NULL;
+ switch (pCS->GetFamily()) {
+ case PDFCS_DEVICERGB:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"));
+ break;
+ case PDFCS_DEVICEGRAY:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray"));
+ break;
+ case PDFCS_DEVICECMYK:
+ pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK"));
+ break;
+ }
+ if (pDefaultCS == NULL) {
+ return pCS;
+ }
+ return GetColorSpace(pDefaultCS, NULL);
+ }
+ if (pCSObj->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pCSObj;
+ if (pArray->GetCount() == 0) {
+ return NULL;
+ }
+ if (pArray->GetCount() == 1) {
+ return GetColorSpace(pArray->GetElementValue(0), pResources);
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL;
+ if (m_ColorSpaceMap.Lookup(pCSObj, csData)) {
+ if (csData->m_Obj) {
+ csData->m_nCount++;
+ return csData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!csData) {
+ csData = FX_NEW CPDF_CountedObject<CPDF_ColorSpace*>;
+ if (!csData) {
+ return NULL;
+ }
+ bNew = TRUE;
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray);
+ if (!pCS) {
+ if (bNew) {
+ delete csData;
+ }
+ return NULL;
+ }
+ csData->m_nCount = 2;
+ csData->m_Obj = pCS;
+ m_ColorSpaceMap.SetAt(pCSObj, csData);
+ return pCS;
+}
+CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj)
+{
+ if (!pCSObj) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) {
+ return NULL;
+ }
+ if (!csData->m_Obj) {
+ return NULL;
+ }
+ csData->m_nCount ++;
+ return csData->m_Obj;
+}
+void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace)
+{
+ if (!pColorSpace) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_ColorSpace*>* csData;
+ if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) {
+ return;
+ }
+ if (csData->m_Obj && --csData->m_nCount == 0) {
+ csData->m_Obj->ReleaseCS();
+ csData->m_Obj = NULL;
+ }
+}
+CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix)
+{
+ if (!pPatternObj) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL;
+ if (m_PatternMap.Lookup(pPatternObj, ptData)) {
+ if (ptData->m_Obj) {
+ ptData->m_nCount++;
+ return ptData->m_Obj;
+ }
+ }
+ FX_BOOL bNew = FALSE;
+ if (!ptData) {
+ ptData = FX_NEW CPDF_CountedObject<CPDF_Pattern*>;
+ bNew = TRUE;
+ if (!ptData) {
+ return NULL;
+ }
+ }
+ CPDF_Pattern* pPattern = NULL;
+ if (bShading) {
+ pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix);
+ } else {
+ CPDF_Dictionary* pDict = pPatternObj->GetDict();
+ if (pDict) {
+ int type = pDict->GetInteger(FX_BSTRC("PatternType"));
+ if (type == 1) {
+ pPattern = FX_NEW CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix);
+ } else if (type == 2) {
+ pPattern = FX_NEW CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix);
+ }
+ }
+ }
+ if (!pPattern) {
+ if (bNew) {
+ delete ptData;
+ }
+ return NULL;
+ }
+ ptData->m_nCount = 2;
+ ptData->m_Obj = pPattern;
+ m_PatternMap.SetAt(pPatternObj, ptData);
+ return pPattern;
+}
+void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj)
+{
+ if (!pPatternObj) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_Pattern*>* ptData;
+ if (!m_PatternMap.Lookup(pPatternObj, ptData)) {
+ return;
+ }
+ if (ptData->m_Obj && --ptData->m_nCount == 0) {
+ delete ptData->m_Obj;
+ ptData->m_Obj = NULL;
+ }
+}
+CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream)
+{
+ if (!pImageStream) {
+ return NULL;
+ }
+ FX_DWORD dwImageObjNum = pImageStream->GetObjNum();
+ CPDF_CountedObject<CPDF_Image*>* imageData;
+ if (m_ImageMap.Lookup(dwImageObjNum, imageData)) {
+ imageData->m_nCount ++;
+ return imageData->m_Obj;
+ }
+ imageData = FX_NEW CPDF_CountedObject<CPDF_Image*>;
+ if (!imageData) {
+ return NULL;
+ }
+ CPDF_Image* pImage = FX_NEW CPDF_Image(m_pPDFDoc);
+ if (!pImage) {
+ delete imageData;
+ return NULL;
+ }
+ pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE);
+ imageData->m_nCount = 2;
+ imageData->m_Obj = pImage;
+ m_ImageMap.SetAt(dwImageObjNum, imageData);
+ return pImage;
+}
+void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream)
+{
+ if (!pImageStream) {
+ return;
+ }
+ PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL);
+}
+CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents)
+{
+ if (!pIccProfileStream) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
+ if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) {
+ ipData->m_nCount++;
+ return ipData->m_Obj;
+ }
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pIccProfileStream, FALSE);
+ FX_BYTE digest[20];
+ CPDF_Stream* pCopiedStream = NULL;
+ CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest);
+ if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) {
+ m_IccProfileMap.Lookup(pCopiedStream, ipData);
+ ipData->m_nCount++;
+ return ipData->m_Obj;
+ }
+ CPDF_IccProfile* pProfile = FX_NEW CPDF_IccProfile(stream.GetData(), stream.GetSize(), nComponents);
+ if (!pProfile) {
+ return NULL;
+ }
+ ipData = FX_NEW CPDF_CountedObject<CPDF_IccProfile*>;
+ if (!ipData) {
+ delete pProfile;
+ return NULL;
+ }
+ ipData->m_nCount = 2;
+ ipData->m_Obj = pProfile;
+ m_IccProfileMap.SetAt(pIccProfileStream, ipData);
+ m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream);
+ return pProfile;
+}
+void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile)
+{
+ if (!pIccProfileStream && !pIccProfile) {
+ return;
+ }
+ CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL;
+ if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) {
+ FX_POSITION pos = m_HashProfileMap.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Stream* pFindStream = NULL;
+ m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream);
+ if (pIccProfileStream == pFindStream) {
+ m_HashProfileMap.RemoveKey(key);
+ break;
+ }
+ }
+ }
+ PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile);
+}
+CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream)
+{
+ if (!pFontStream) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
+ if (m_FontFileMap.Lookup(pFontStream, ftData)) {
+ ftData->m_nCount ++;
+ return ftData->m_Obj;
+ }
+ ftData = FX_NEW CPDF_CountedObject<CPDF_StreamAcc*>;
+ if (!ftData) {
+ return NULL;
+ }
+ CPDF_StreamAcc* pFontFile = FX_NEW CPDF_StreamAcc;
+ if (!pFontFile) {
+ delete ftData;
+ return NULL;
+ }
+ CPDF_Dictionary* pFontDict = pFontStream->GetDict();
+ FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + pFontDict->GetInteger(FX_BSTRC("Length3"));
+ if (org_size < 0) {
+ org_size = 0;
+ }
+ pFontFile->LoadAllData(pFontStream, FALSE, org_size);
+ ftData->m_nCount = 2;
+ ftData->m_Obj = pFontFile;
+ m_FontFileMap.SetAt(pFontStream, ftData);
+ return pFontFile;
+}
+void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce)
+{
+ if (!pFontStream) {
+ return;
+ }
+ PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce);
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
new file mode 100644
index 0000000000..335460f320
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp
@@ -0,0 +1,886 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+#include <limits.h>
+class CPDF_PSEngine;
+typedef enum {PSOP_ADD, PSOP_SUB, PSOP_MUL, PSOP_DIV, PSOP_IDIV, PSOP_MOD,
+ PSOP_NEG, PSOP_ABS, PSOP_CEILING, PSOP_FLOOR, PSOP_ROUND, PSOP_TRUNCATE,
+ PSOP_SQRT, PSOP_SIN, PSOP_COS, PSOP_ATAN, PSOP_EXP, PSOP_LN, PSOP_LOG,
+ PSOP_CVI, PSOP_CVR, PSOP_EQ, PSOP_NE, PSOP_GT, PSOP_GE, PSOP_LT, PSOP_LE,
+ PSOP_AND, PSOP_OR, PSOP_XOR, PSOP_NOT, PSOP_BITSHIFT, PSOP_TRUE, PSOP_FALSE,
+ PSOP_IF, PSOP_IFELSE, PSOP_POP, PSOP_EXCH, PSOP_DUP, PSOP_COPY,
+ PSOP_INDEX, PSOP_ROLL, PSOP_PROC, PSOP_CONST
+ } PDF_PSOP;
+class CPDF_PSProc : public CFX_Object
+{
+public:
+ ~CPDF_PSProc();
+ FX_BOOL Parse(CPDF_SimpleParser& parser);
+ FX_BOOL Execute(CPDF_PSEngine* pEngine);
+ CFX_PtrArray m_Operators;
+};
+#define PSENGINE_STACKSIZE 100
+class CPDF_PSEngine : public CFX_Object
+{
+public:
+ CPDF_PSEngine();
+ ~CPDF_PSEngine();
+ FX_BOOL Parse(const FX_CHAR* string, int size);
+ FX_BOOL Execute()
+ {
+ return m_MainProc.Execute(this);
+ }
+ FX_BOOL DoOperator(PDF_PSOP op);
+ void Reset()
+ {
+ m_StackCount = 0;
+ }
+ void Push(FX_FLOAT value);
+ void Push(int value)
+ {
+ Push((FX_FLOAT)value);
+ }
+ FX_FLOAT Pop();
+ int GetStackSize()
+ {
+ return m_StackCount;
+ }
+private:
+ FX_FLOAT m_Stack[PSENGINE_STACKSIZE];
+ int m_StackCount;
+ CPDF_PSProc m_MainProc;
+};
+CPDF_PSProc::~CPDF_PSProc()
+{
+ int size = m_Operators.GetSize();
+ for (int i = 0; i < size; i ++) {
+ if (m_Operators[i] == (FX_LPVOID)PSOP_PROC) {
+ delete (CPDF_PSProc*)m_Operators[i + 1];
+ i ++;
+ } else if (m_Operators[i] == (FX_LPVOID)PSOP_CONST) {
+ FX_Free((FX_FLOAT*)m_Operators[i + 1]);
+ i ++;
+ }
+ }
+}
+#pragma optimize( "", off )
+FX_BOOL CPDF_PSProc::Execute(CPDF_PSEngine* pEngine)
+{
+ int size = m_Operators.GetSize();
+ for (int i = 0; i < size; i ++) {
+ PDF_PSOP op = (PDF_PSOP)(FX_UINTPTR)m_Operators[i];
+ if (op == PSOP_PROC) {
+ i ++;
+ } else if (op == PSOP_CONST) {
+ pEngine->Push(*(FX_FLOAT*)m_Operators[i + 1]);
+ i ++;
+ } else if (op == PSOP_IF) {
+ if (i < 2 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC) {
+ return FALSE;
+ }
+ if ((int)pEngine->Pop()) {
+ ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
+ }
+ } else if (op == PSOP_IFELSE) {
+ if (i < 4 || m_Operators[i - 2] != (FX_LPVOID)PSOP_PROC ||
+ m_Operators[i - 4] != (FX_LPVOID)PSOP_PROC) {
+ return FALSE;
+ }
+ if ((int)pEngine->Pop()) {
+ ((CPDF_PSProc*)m_Operators[i - 3])->Execute(pEngine);
+ } else {
+ ((CPDF_PSProc*)m_Operators[i - 1])->Execute(pEngine);
+ }
+ } else {
+ pEngine->DoOperator(op);
+ }
+ }
+ return TRUE;
+}
+#pragma optimize( "", on )
+CPDF_PSEngine::CPDF_PSEngine()
+{
+ m_StackCount = 0;
+}
+CPDF_PSEngine::~CPDF_PSEngine()
+{
+}
+void CPDF_PSEngine::Push(FX_FLOAT v)
+{
+ if (m_StackCount == 100) {
+ return;
+ }
+ m_Stack[m_StackCount++] = v;
+}
+FX_FLOAT CPDF_PSEngine::Pop()
+{
+ if (m_StackCount == 0) {
+ return 0;
+ }
+ return m_Stack[--m_StackCount];
+}
+const struct _PDF_PSOpName {
+ const FX_CHAR* name;
+ PDF_PSOP op;
+} _PDF_PSOpNames[] = {
+ {"add", PSOP_ADD}, {"sub", PSOP_SUB}, {"mul", PSOP_MUL}, {"div", PSOP_DIV},
+ {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD}, {"neg", PSOP_NEG}, {"abs", PSOP_ABS},
+ {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR}, {"round", PSOP_ROUND},
+ {"truncate", PSOP_TRUNCATE}, {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN},
+ {"cos", PSOP_COS}, {"atan", PSOP_ATAN}, {"exp", PSOP_EXP}, {"ln", PSOP_LN},
+ {"log", PSOP_LOG}, {"cvi", PSOP_CVI}, {"cvr", PSOP_CVR}, {"eq", PSOP_EQ},
+ {"ne", PSOP_NE}, {"gt", PSOP_GT}, {"ge", PSOP_GE}, {"lt", PSOP_LT},
+ {"le", PSOP_LE}, {"and", PSOP_AND}, {"or", PSOP_OR}, {"xor", PSOP_XOR},
+ {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT}, {"true", PSOP_TRUE},
+ {"false", PSOP_FALSE}, {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE},
+ {"pop", PSOP_POP}, {"exch", PSOP_EXCH}, {"dup", PSOP_DUP},
+ {"copy", PSOP_COPY}, {"index", PSOP_INDEX}, {"roll", PSOP_ROLL},
+ {NULL, PSOP_PROC}
+};
+FX_BOOL CPDF_PSEngine::Parse(const FX_CHAR* string, int size)
+{
+ CPDF_SimpleParser parser((FX_LPBYTE)string, size);
+ CFX_ByteStringC word = parser.GetWord();
+ if (word != FX_BSTRC("{")) {
+ return FALSE;
+ }
+ return m_MainProc.Parse(parser);
+}
+FX_BOOL CPDF_PSProc::Parse(CPDF_SimpleParser& parser)
+{
+ while (1) {
+ CFX_ByteStringC word = parser.GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == FX_BSTRC("}")) {
+ return TRUE;
+ }
+ if (word == FX_BSTRC("{")) {
+ CPDF_PSProc* pProc = FX_NEW CPDF_PSProc;
+ m_Operators.Add((FX_LPVOID)PSOP_PROC);
+ m_Operators.Add(pProc);
+ if (!pProc->Parse(parser)) {
+ return FALSE;
+ }
+ } else {
+ int i = 0;
+ while (_PDF_PSOpNames[i].name) {
+ if (word == CFX_ByteStringC(_PDF_PSOpNames[i].name)) {
+ m_Operators.Add((FX_LPVOID)_PDF_PSOpNames[i].op);
+ break;
+ }
+ i ++;
+ }
+ if (_PDF_PSOpNames[i].name == NULL) {
+ FX_FLOAT* pd = FX_Alloc(FX_FLOAT, 1);
+ *pd = FX_atof(word);
+ m_Operators.Add((FX_LPVOID)PSOP_CONST);
+ m_Operators.Add(pd);
+ }
+ }
+ }
+}
+#define PI 3.1415926535897932384626433832795f
+FX_BOOL CPDF_PSEngine::DoOperator(PDF_PSOP op)
+{
+ int i1, i2;
+ FX_FLOAT d1, d2;
+ switch (op) {
+ case PSOP_ADD:
+ d1 = Pop();
+ d2 = Pop();
+ Push(d1 + d2);
+ break;
+ case PSOP_SUB:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d1 - d2);
+ break;
+ case PSOP_MUL:
+ d1 = Pop();
+ d2 = Pop();
+ Push(d1 * d2);
+ break;
+ case PSOP_DIV:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d1 / d2);
+ break;
+ case PSOP_IDIV:
+ i2 = (int)Pop();
+ i1 = (int)Pop();
+ Push(i1 / i2);
+ break;
+ case PSOP_MOD:
+ i2 = (int)Pop();
+ i1 = (int)Pop();
+ Push(i1 % i2);
+ break;
+ case PSOP_NEG:
+ d1 = Pop();
+ Push(-d1);
+ break;
+ case PSOP_ABS:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_fabs(d1));
+ break;
+ case PSOP_CEILING:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_ceil(d1));
+ break;
+ case PSOP_FLOOR:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_floor(d1));
+ break;
+ case PSOP_ROUND:
+ d1 = Pop();
+ Push(FXSYS_round(d1));
+ break;
+ case PSOP_TRUNCATE:
+ i1 = (int)Pop();
+ Push(i1);
+ break;
+ case PSOP_SQRT:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_sqrt(d1));
+ break;
+ case PSOP_SIN:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_sin(d1 * PI / 180.0f));
+ break;
+ case PSOP_COS:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_cos(d1 * PI / 180.0f));
+ break;
+ case PSOP_ATAN:
+ d2 = Pop();
+ d1 = Pop();
+ d1 = (FX_FLOAT)(FXSYS_atan2(d1, d2) * 180.0 / PI);
+ if (d1 < 0) {
+ d1 += 360;
+ }
+ Push(d1);
+ break;
+ case PSOP_EXP:
+ d2 = Pop();
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_pow(d1, d2));
+ break;
+ case PSOP_LN:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_log(d1));
+ break;
+ case PSOP_LOG:
+ d1 = Pop();
+ Push((FX_FLOAT)FXSYS_log10(d1));
+ break;
+ case PSOP_CVI:
+ i1 = (int)Pop();
+ Push(i1);
+ break;
+ case PSOP_CVR:
+ break;
+ case PSOP_EQ:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 == d2));
+ break;
+ case PSOP_NE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 != d2));
+ break;
+ case PSOP_GT:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 > d2));
+ break;
+ case PSOP_GE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 >= d2));
+ break;
+ case PSOP_LT:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 < d2));
+ break;
+ case PSOP_LE:
+ d2 = Pop();
+ d1 = Pop();
+ Push((int)(d1 <= d2));
+ break;
+ case PSOP_AND:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 & i2);
+ break;
+ case PSOP_OR:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 | i2);
+ break;
+ case PSOP_XOR:
+ i1 = (int)Pop();
+ i2 = (int)Pop();
+ Push(i1 ^ i2);
+ break;
+ case PSOP_NOT:
+ i1 = (int)Pop();
+ Push((int)!i1);
+ break;
+ case PSOP_BITSHIFT: {
+ int shift = (int)Pop();
+ int i = (int)Pop();
+ if (shift > 0) {
+ Push(i << shift);
+ } else {
+ Push(i >> -shift);
+ }
+ break;
+ }
+ case PSOP_TRUE:
+ Push(1);
+ break;
+ case PSOP_FALSE:
+ Push(0);
+ break;
+ case PSOP_POP:
+ Pop();
+ break;
+ case PSOP_EXCH:
+ d2 = Pop();
+ d1 = Pop();
+ Push(d2);
+ Push(d1);
+ break;
+ case PSOP_DUP:
+ d1 = Pop();
+ Push(d1);
+ Push(d1);
+ break;
+ case PSOP_COPY: {
+ int n = (int)Pop();
+ if (n < 0 || n > PSENGINE_STACKSIZE || m_StackCount + n > PSENGINE_STACKSIZE || n > m_StackCount) {
+ break;
+ }
+ for (int i = 0; i < n; i ++) {
+ m_Stack[m_StackCount + i] = m_Stack[m_StackCount + i - n];
+ }
+ m_StackCount += n;
+ break;
+ }
+ case PSOP_INDEX: {
+ int n = (int)Pop();
+ if (n < 0 || n >= m_StackCount) {
+ break;
+ }
+ Push(m_Stack[m_StackCount - n - 1]);
+ break;
+ }
+ case PSOP_ROLL: {
+ int j = (int)Pop();
+ int n = (int)Pop();
+ if (m_StackCount == 0) {
+ break;
+ }
+ if (n < 0 || n > m_StackCount) {
+ break;
+ }
+ if (j < 0)
+ for (int i = 0; i < -j; i ++) {
+ FX_FLOAT first = m_Stack[m_StackCount - n];
+ for (int ii = 0; ii < n - 1; ii ++) {
+ m_Stack[m_StackCount - n + ii] = m_Stack[m_StackCount - n + ii + 1];
+ }
+ m_Stack[m_StackCount - 1] = first;
+ }
+ else
+ for (int i = 0; i < j; i ++) {
+ FX_FLOAT last = m_Stack[m_StackCount - 1];
+ int ii;
+ for (ii = 0; ii < n - 1; ii ++) {
+ m_Stack[m_StackCount - ii - 1] = m_Stack[m_StackCount - ii - 2];
+ }
+ m_Stack[m_StackCount - ii - 1] = last;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+static FX_FLOAT PDF_Interpolate(FX_FLOAT x, FX_FLOAT xmin, FX_FLOAT xmax, FX_FLOAT ymin, FX_FLOAT ymax)
+{
+ return ((x - xmin) * (ymax - ymin) / (xmax - xmin)) + ymin;
+}
+static FX_DWORD _GetBits32(FX_LPCBYTE pData, int bitpos, int nbits)
+{
+ int result = 0;
+ for (int i = 0; i < nbits; i ++)
+ if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) {
+ result |= 1 << (nbits - i - 1);
+ }
+ return result;
+}
+typedef struct {
+ FX_FLOAT encode_max, encode_min;
+ int sizes;
+} SampleEncodeInfo;
+typedef struct {
+ FX_FLOAT decode_max, decode_min;
+} SampleDecodeInfo;
+class CPDF_SampledFunc : public CPDF_Function
+{
+public:
+ CPDF_SampledFunc();
+ virtual ~CPDF_SampledFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ SampleEncodeInfo* m_pEncodeInfo;
+ SampleDecodeInfo* m_pDecodeInfo;
+ FX_DWORD m_nBitsPerSample, m_SampleMax;
+ CPDF_StreamAcc* m_pSampleStream;
+};
+CPDF_SampledFunc::CPDF_SampledFunc()
+{
+ m_pSampleStream = NULL;
+ m_pEncodeInfo = NULL;
+ m_pDecodeInfo = NULL;
+}
+CPDF_SampledFunc::~CPDF_SampledFunc()
+{
+ if (m_pSampleStream) {
+ delete m_pSampleStream;
+ }
+ if (m_pEncodeInfo) {
+ FX_Free(m_pEncodeInfo);
+ }
+ if (m_pDecodeInfo) {
+ FX_Free(m_pDecodeInfo);
+ }
+}
+FX_BOOL CPDF_SampledFunc::v_Init(CPDF_Object* pObj)
+{
+ if (pObj->GetType() != PDFOBJ_STREAM) {
+ return FALSE;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ CPDF_Array* pSize = pDict->GetArray(FX_BSTRC("Size"));
+ CPDF_Array* pEncode = pDict->GetArray(FX_BSTRC("Encode"));
+ CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
+ m_nBitsPerSample = pDict->GetInteger(FX_BSTRC("BitsPerSample"));
+ m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample);
+ m_pSampleStream = FX_NEW CPDF_StreamAcc;
+ m_pSampleStream->LoadAllData(pStream, FALSE);
+ m_pEncodeInfo = FX_Alloc(SampleEncodeInfo, m_nInputs);
+ int i;
+ FX_DWORD nTotalSamples = 1;
+ for (i = 0; i < m_nInputs; i ++) {
+ m_pEncodeInfo[i].sizes = pSize->GetInteger(i);
+ if (!pSize && i == 0) {
+ m_pEncodeInfo[i].sizes = pDict->GetInteger(FX_BSTRC("Size"));
+ }
+ if (nTotalSamples > 0 && (FX_UINT32)(m_pEncodeInfo[i].sizes) > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_pEncodeInfo[i].sizes;
+ if (pEncode) {
+ m_pEncodeInfo[i].encode_min = pEncode->GetFloat(i * 2);
+ m_pEncodeInfo[i].encode_max = pEncode->GetFloat(i * 2 + 1);
+ } else {
+ m_pEncodeInfo[i].encode_min = 0;
+ if (m_pEncodeInfo[i].sizes == 1) {
+ m_pEncodeInfo[i].encode_max = 1;
+ } else {
+ m_pEncodeInfo[i].encode_max = (FX_FLOAT)m_pEncodeInfo[i].sizes - 1;
+ }
+ }
+ }
+ if (nTotalSamples > 0 && m_nBitsPerSample > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_nBitsPerSample;
+ if (nTotalSamples > 0 && ((FX_UINT32)m_nOutputs) > UINT_MAX / nTotalSamples) {
+ return FALSE;
+ }
+ nTotalSamples *= m_nOutputs;
+ if (nTotalSamples == 0 || m_pSampleStream->GetSize() * 8 < nTotalSamples) {
+ return FALSE;
+ }
+ m_pDecodeInfo = FX_Alloc(SampleDecodeInfo, m_nOutputs);
+ for (i = 0; i < m_nOutputs; i ++) {
+ if (pDecode) {
+ m_pDecodeInfo[i].decode_min = pDecode->GetFloat(2 * i);
+ m_pDecodeInfo[i].decode_max = pDecode->GetFloat(2 * i + 1);
+ } else {
+ m_pDecodeInfo[i].decode_min = m_pRanges[i * 2];
+ m_pDecodeInfo[i].decode_max = m_pRanges[i * 2 + 1];
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_SampledFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ int pos = 0;
+ CFX_FixedBufGrow<FX_FLOAT, 16> encoded_input_buf(m_nInputs);
+ FX_FLOAT* encoded_input = encoded_input_buf;
+ CFX_FixedBufGrow<int, 32> int_buf(m_nInputs * 2);
+ int* index = int_buf;
+ int* blocksize = index + m_nInputs;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (i == 0) {
+ blocksize[i] = 1;
+ } else {
+ blocksize[i] = blocksize[i - 1] * m_pEncodeInfo[i - 1].sizes;
+ }
+ encoded_input[i] = PDF_Interpolate(inputs[i], m_pDomains[i * 2], m_pDomains[i * 2 + 1],
+ m_pEncodeInfo[i].encode_min, m_pEncodeInfo[i].encode_max);
+ index[i] = (int)encoded_input[i];
+ if (index[i] < 0) {
+ index[i] = 0;
+ } else if (index[i] > m_pEncodeInfo[i].sizes - 1) {
+ index[i] = m_pEncodeInfo[i].sizes - 1;
+ }
+ pos += index[i] * blocksize[i];
+ }
+ int bitpos = pos * m_nBitsPerSample * m_nOutputs;
+ FX_LPCBYTE pSampleData = m_pSampleStream->GetData();
+ if (pSampleData == NULL) {
+ return FALSE;
+ }
+ for (int j = 0; j < m_nOutputs; j ++) {
+ FX_DWORD sample = _GetBits32(pSampleData, bitpos + j * m_nBitsPerSample, m_nBitsPerSample);
+ FX_FLOAT encoded = (FX_FLOAT)sample;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (index[i] == m_pEncodeInfo[i].sizes - 1) {
+ if (index[i] == 0) {
+ encoded = encoded_input[i] * (FX_FLOAT)sample;
+ }
+ } else {
+ int bitpos1 = bitpos + m_nBitsPerSample * m_nOutputs * blocksize[i];
+ FX_DWORD sample1 = _GetBits32(pSampleData, bitpos1 + j * m_nBitsPerSample, m_nBitsPerSample);
+ encoded += (encoded_input[i] - index[i]) * ((FX_FLOAT)sample1 - (FX_FLOAT)sample);
+ }
+ }
+ results[j] = PDF_Interpolate(encoded, 0, (FX_FLOAT)m_SampleMax,
+ m_pDecodeInfo[j].decode_min, m_pDecodeInfo[j].decode_max);
+ }
+ return TRUE;
+}
+class CPDF_PSFunc : public CPDF_Function
+{
+public:
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ CPDF_PSEngine m_PS;
+};
+FX_BOOL CPDF_PSFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ return m_PS.Parse((const FX_CHAR*)acc.GetData(), acc.GetSize());
+}
+FX_BOOL CPDF_PSFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ CPDF_PSEngine& PS = (CPDF_PSEngine&)m_PS;
+ PS.Reset();
+ int i;
+ for (i = 0; i < m_nInputs; i ++) {
+ PS.Push(inputs[i]);
+ }
+ PS.Execute();
+ if (PS.GetStackSize() < m_nOutputs) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nOutputs; i ++) {
+ results[m_nOutputs - i - 1] = PS.Pop();
+ }
+ return TRUE;
+}
+class CPDF_ExpIntFunc : public CPDF_Function
+{
+public:
+ CPDF_ExpIntFunc();
+ virtual ~CPDF_ExpIntFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ FX_FLOAT m_Exponent;
+ FX_FLOAT* m_pBeginValues;
+ FX_FLOAT* m_pEndValues;
+ int m_nOrigOutputs;
+};
+CPDF_ExpIntFunc::CPDF_ExpIntFunc()
+{
+ m_pBeginValues = NULL;
+ m_pEndValues = NULL;
+}
+CPDF_ExpIntFunc::~CPDF_ExpIntFunc()
+{
+ if (m_pBeginValues) {
+ FX_Free(m_pBeginValues);
+ }
+ if (m_pEndValues) {
+ FX_Free(m_pEndValues);
+ }
+}
+FX_BOOL CPDF_ExpIntFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict = pObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray0 = pDict->GetArray(FX_BSTRC("C0"));
+ if (m_nOutputs == 0) {
+ m_nOutputs = 1;
+ if (pArray0) {
+ m_nOutputs = pArray0->GetCount();
+ }
+ }
+ CPDF_Array* pArray1 = pDict->GetArray(FX_BSTRC("C1"));
+ m_pBeginValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ m_pEndValues = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ for (int i = 0; i < m_nOutputs; i ++) {
+ m_pBeginValues[i] = pArray0 ? pArray0->GetFloat(i) : 0.0f;
+ m_pEndValues[i] = pArray1 ? pArray1->GetFloat(i) : 1.0f;
+ }
+ m_Exponent = pDict->GetFloat(FX_BSTRC("N"));
+ m_nOrigOutputs = m_nOutputs;
+ if (m_nOutputs && m_nInputs > INT_MAX / m_nOutputs) {
+ return FALSE;
+ }
+ m_nOutputs *= m_nInputs;
+ return TRUE;
+}
+FX_BOOL CPDF_ExpIntFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const
+{
+ for (int i = 0; i < m_nInputs; i ++)
+ for (int j = 0; j < m_nOrigOutputs; j ++) {
+ results[i * m_nOrigOutputs + j] = m_pBeginValues[j] + (FX_FLOAT)FXSYS_pow(inputs[i], m_Exponent) *
+ (m_pEndValues[j] - m_pBeginValues[j]);
+ }
+ return TRUE;
+}
+class CPDF_StitchFunc : public CPDF_Function
+{
+public:
+ CPDF_StitchFunc();
+ virtual ~CPDF_StitchFunc();
+ virtual FX_BOOL v_Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const;
+ int m_nSubs;
+ CPDF_Function** m_pSubFunctions;
+ FX_FLOAT* m_pBounds;
+ FX_FLOAT* m_pEncode;
+};
+CPDF_StitchFunc::CPDF_StitchFunc()
+{
+ m_nSubs = 0;
+ m_pSubFunctions = NULL;
+ m_pBounds = NULL;
+ m_pEncode = NULL;
+}
+CPDF_StitchFunc::~CPDF_StitchFunc()
+{
+ for (int i = 0; i < m_nSubs; i ++)
+ if (m_pSubFunctions[i]) {
+ delete m_pSubFunctions[i];
+ }
+ if (m_pSubFunctions) {
+ FX_Free(m_pSubFunctions);
+ }
+ if (m_pBounds) {
+ FX_Free(m_pBounds);
+ }
+ if (m_pEncode) {
+ FX_Free(m_pEncode);
+ }
+}
+FX_BOOL CPDF_StitchFunc::v_Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict = pObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Functions"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ m_nSubs = pArray->GetCount();
+ if (m_nSubs == 0) {
+ return FALSE;
+ }
+ m_pSubFunctions = FX_Alloc(CPDF_Function*, m_nSubs);
+ FXSYS_memset32(m_pSubFunctions, 0, sizeof(CPDF_Function*)*m_nSubs);
+ m_nOutputs = 0;
+ int i;
+ for (i = 0; i < m_nSubs; i ++) {
+ CPDF_Object* pSub = pArray->GetElementValue(i);
+ if (pSub == pObj) {
+ return FALSE;
+ }
+ m_pSubFunctions[i] = CPDF_Function::Load(pSub);
+ if (m_pSubFunctions[i] == NULL) {
+ return FALSE;
+ }
+ if (m_pSubFunctions[i]->CountOutputs() > m_nOutputs) {
+ m_nOutputs = m_pSubFunctions[i]->CountOutputs();
+ }
+ }
+ m_pBounds = FX_Alloc(FX_FLOAT, m_nSubs + 1);
+ m_pBounds[0] = m_pDomains[0];
+ pArray = pDict->GetArray(FX_BSTRC("Bounds"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nSubs - 1; i ++) {
+ m_pBounds[i + 1] = pArray->GetFloat(i);
+ }
+ m_pBounds[m_nSubs] = m_pDomains[1];
+ m_pEncode = FX_Alloc(FX_FLOAT, m_nSubs * 2);
+ pArray = pDict->GetArray(FX_BSTRC("Encode"));
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ for (i = 0; i < m_nSubs * 2; i ++) {
+ m_pEncode[i] = pArray->GetFloat(i);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StitchFunc::v_Call(FX_FLOAT* inputs, FX_FLOAT* outputs) const
+{
+ FX_FLOAT input = inputs[0];
+ int i;
+ for (i = 0; i < m_nSubs - 1; i ++)
+ if (input < m_pBounds[i + 1]) {
+ break;
+ }
+ if (m_pSubFunctions[i] == NULL) {
+ return FALSE;
+ }
+ input = PDF_Interpolate(input, m_pBounds[i], m_pBounds[i + 1], m_pEncode[i * 2], m_pEncode[i * 2 + 1]);
+ int nresults;
+ m_pSubFunctions[i]->Call(&input, m_nInputs, outputs, nresults);
+ return TRUE;
+}
+CPDF_Function* CPDF_Function::Load(CPDF_Object* pFuncObj)
+{
+ if (pFuncObj == NULL) {
+ return NULL;
+ }
+ CPDF_Function* pFunc = NULL;
+ int type;
+ if (pFuncObj->GetType() == PDFOBJ_STREAM) {
+ type = ((CPDF_Stream*)pFuncObj)->GetDict()->GetInteger(FX_BSTRC("FunctionType"));
+ } else if (pFuncObj->GetType() == PDFOBJ_DICTIONARY) {
+ type = ((CPDF_Dictionary*)pFuncObj)->GetInteger(FX_BSTRC("FunctionType"));
+ } else {
+ return NULL;
+ }
+ if (type == 0) {
+ pFunc = FX_NEW CPDF_SampledFunc;
+ } else if (type == 2) {
+ pFunc = FX_NEW CPDF_ExpIntFunc;
+ } else if (type == 3) {
+ pFunc = FX_NEW CPDF_StitchFunc;
+ } else if (type == 4) {
+ pFunc = FX_NEW CPDF_PSFunc;
+ } else {
+ return NULL;
+ }
+ if (!pFunc->Init(pFuncObj)) {
+ delete pFunc;
+ return NULL;
+ }
+ return pFunc;
+}
+CPDF_Function::CPDF_Function()
+{
+ m_pDomains = NULL;
+ m_pRanges = NULL;
+}
+CPDF_Function::~CPDF_Function()
+{
+ if (m_pDomains) {
+ FX_Free(m_pDomains);
+ m_pDomains = NULL;
+ }
+ if (m_pRanges) {
+ FX_Free(m_pRanges);
+ m_pRanges = NULL;
+ }
+}
+FX_BOOL CPDF_Function::Init(CPDF_Object* pObj)
+{
+ CPDF_Dictionary* pDict;
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ pDict = ((CPDF_Stream*)pObj)->GetDict();
+ } else {
+ pDict = (CPDF_Dictionary*)pObj;
+ }
+ CPDF_Array* pDomains = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pDomains == NULL) {
+ return FALSE;
+ }
+ m_nInputs = pDomains->GetCount() / 2;
+ if (m_nInputs == 0) {
+ return FALSE;
+ }
+ m_pDomains = FX_Alloc(FX_FLOAT, m_nInputs * 2);
+ for (int i = 0; i < m_nInputs * 2; i ++) {
+ m_pDomains[i] = pDomains->GetFloat(i);
+ }
+ CPDF_Array* pRanges = pDict->GetArray(FX_BSTRC("Range"));
+ m_nOutputs = 0;
+ if (pRanges) {
+ m_nOutputs = pRanges->GetCount() / 2;
+ m_pRanges = FX_Alloc(FX_FLOAT, m_nOutputs * 2);
+ for (int i = 0; i < m_nOutputs * 2; i ++) {
+ m_pRanges[i] = pRanges->GetFloat(i);
+ }
+ }
+ FX_DWORD old_outputs = m_nOutputs;
+ FX_BOOL ret = v_Init(pObj);
+ if (m_pRanges && m_nOutputs > (int)old_outputs) {
+ m_pRanges = FX_Realloc(FX_FLOAT, m_pRanges, m_nOutputs * 2);
+ if (m_pRanges) {
+ FXSYS_memset32(m_pRanges + (old_outputs * 2), 0, sizeof(FX_FLOAT) * (m_nOutputs - old_outputs) * 2);
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_Function::Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const
+{
+ if (m_nInputs != ninputs) {
+ return FALSE;
+ }
+ nresults = m_nOutputs;
+ for (int i = 0; i < m_nInputs; i ++) {
+ if (inputs[i] < m_pDomains[i * 2]) {
+ inputs[i] = m_pDomains[i * 2];
+ } else if (inputs[i] > m_pDomains[i * 2 + 1]) {
+ inputs[i] = m_pDomains[i * 2] + 1;
+ }
+ }
+ v_Call(inputs, results);
+ if (m_pRanges) {
+ for (int i = 0; i < m_nOutputs; i ++) {
+ if (results[i] < m_pRanges[i * 2]) {
+ results[i] = m_pRanges[i * 2];
+ } else if (results[i] > m_pRanges[i * 2 + 1]) {
+ results[i] = m_pRanges[i * 2 + 1];
+ }
+ }
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
new file mode 100644
index 0000000000..e9115e6342
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp
@@ -0,0 +1,707 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "pageint.h"
+#include "../fpdf_render/render_int.h"
+void CPDF_GraphicStates::DefaultStates()
+{
+ m_ColorState.New()->Default();
+}
+void CPDF_GraphicStates::CopyStates(const CPDF_GraphicStates& src)
+{
+ m_ClipPath = src.m_ClipPath;
+ m_GraphState = src.m_GraphState;
+ m_ColorState = src.m_ColorState;
+ m_TextState = src.m_TextState;
+ m_GeneralState = src.m_GeneralState;
+}
+CPDF_ClipPathData::CPDF_ClipPathData()
+{
+ m_PathCount = 0;
+ m_pPathList = NULL;
+ m_pTypeList = NULL;
+ m_TextCount = 0;
+ m_pTextList = NULL;
+}
+CPDF_ClipPathData::~CPDF_ClipPathData()
+{
+ int i;
+ if (m_pPathList) {
+ FX_DELETE_VECTOR(m_pPathList, CPDF_Path, m_PathCount);
+ }
+ if (m_pTypeList) {
+ FX_Free(m_pTypeList);
+ }
+ for (i = m_TextCount - 1; i > -1; i --)
+ if (m_pTextList[i]) {
+ delete m_pTextList[i];
+ }
+ if (m_pTextList) {
+ FX_Free(m_pTextList);
+ }
+}
+CPDF_ClipPathData::CPDF_ClipPathData(const CPDF_ClipPathData& src)
+{
+ m_pPathList = NULL;
+ m_pPathList = NULL;
+ m_pTextList = NULL;
+ m_PathCount = src.m_PathCount;
+ if (m_PathCount) {
+ int alloc_size = m_PathCount;
+ if (alloc_size % 8) {
+ alloc_size += 8 - (alloc_size % 8);
+ }
+ FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
+ for (int i = 0; i < m_PathCount; i ++) {
+ m_pPathList[i] = src.m_pPathList[i];
+ }
+ m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
+ FXSYS_memcpy32(m_pTypeList, src.m_pTypeList, m_PathCount);
+ } else {
+ m_pPathList = NULL;
+ m_pTypeList = NULL;
+ }
+ m_TextCount = src.m_TextCount;
+ if (m_TextCount) {
+ m_pTextList = FX_Alloc(CPDF_TextObject*, m_TextCount);
+ FXSYS_memset32(m_pTextList, 0, sizeof(CPDF_TextObject*) * m_TextCount);
+ for (int i = 0; i < m_TextCount; i ++) {
+ if (src.m_pTextList[i]) {
+ m_pTextList[i] = FX_NEW CPDF_TextObject;
+ m_pTextList[i]->Copy(src.m_pTextList[i]);
+ } else {
+ m_pTextList[i] = NULL;
+ }
+ }
+ } else {
+ m_pTextList = NULL;
+ }
+}
+void CPDF_ClipPathData::SetCount(int path_count, int text_count)
+{
+ ASSERT(m_TextCount == 0 && m_PathCount == 0);
+ if (path_count) {
+ m_PathCount = path_count;
+ int alloc_size = (path_count + 7) / 8 * 8;
+ FX_NEW_VECTOR(m_pPathList, CPDF_Path, alloc_size);
+ m_pTypeList = FX_Alloc(FX_BYTE, alloc_size);
+ }
+ if (text_count) {
+ m_TextCount = text_count;
+ m_pTextList = FX_Alloc(CPDF_TextObject*, text_count);
+ FXSYS_memset32(m_pTextList, 0, sizeof(void*) * text_count);
+ }
+}
+CPDF_Rect CPDF_ClipPath::GetClipBox() const
+{
+ CPDF_Rect rect;
+ FX_BOOL bStarted = FALSE;
+ int count = GetPathCount();
+ if (count) {
+ rect = GetPath(0).GetBoundingBox();
+ for (int i = 1; i < count; i ++) {
+ CPDF_Rect path_rect = GetPath(i).GetBoundingBox();
+ rect.Intersect(path_rect);
+ }
+ bStarted = TRUE;
+ }
+ count = GetTextCount();
+ if (count) {
+ CPDF_Rect layer_rect;
+ FX_BOOL bLayerStarted = FALSE;
+ for (int i = 0; i < count; i ++) {
+ CPDF_TextObject* pTextObj = GetText(i);
+ if (pTextObj == NULL) {
+ if (!bStarted) {
+ rect = layer_rect;
+ bStarted = TRUE;
+ } else {
+ rect.Intersect(layer_rect);
+ }
+ bLayerStarted = FALSE;
+ } else {
+ if (!bLayerStarted) {
+ layer_rect = pTextObj->GetBBox(NULL);
+ bLayerStarted = TRUE;
+ } else {
+ layer_rect.Union(pTextObj->GetBBox(NULL));
+ }
+ }
+ }
+ }
+ return rect;
+}
+void CPDF_ClipPath::AppendPath(CPDF_Path path, int type, FX_BOOL bAutoMerge)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (pData->m_PathCount && bAutoMerge) {
+ CPDF_Path old_path = pData->m_pPathList[pData->m_PathCount - 1];
+ if (old_path.IsRect()) {
+ CPDF_Rect old_rect(old_path.GetPointX(0), old_path.GetPointY(0),
+ old_path.GetPointX(2), old_path.GetPointY(2));
+ CPDF_Rect new_rect = path.GetBoundingBox();
+ if (old_rect.Contains(new_rect)) {
+ pData->m_PathCount --;
+ pData->m_pPathList[pData->m_PathCount].SetNull();
+ }
+ }
+ }
+ if (pData->m_PathCount % 8 == 0) {
+ CPDF_Path* pNewPath;
+ FX_NEW_VECTOR(pNewPath, CPDF_Path, pData->m_PathCount + 8);
+ for (int i = 0; i < pData->m_PathCount; i ++) {
+ pNewPath[i] = pData->m_pPathList[i];
+ }
+ if (pData->m_pPathList) {
+ FX_DELETE_VECTOR(pData->m_pPathList, CPDF_Path, pData->m_PathCount);
+ }
+ FX_BYTE* pNewType = FX_Alloc(FX_BYTE, pData->m_PathCount + 8);
+ FXSYS_memcpy32(pNewType, pData->m_pTypeList, pData->m_PathCount);
+ if (pData->m_pTypeList) {
+ FX_Free(pData->m_pTypeList);
+ }
+ pData->m_pPathList = pNewPath;
+ pData->m_pTypeList = pNewType;
+ }
+ pData->m_pPathList[pData->m_PathCount] = path;
+ pData->m_pTypeList[pData->m_PathCount] = (FX_BYTE)type;
+ pData->m_PathCount ++;
+}
+void CPDF_ClipPath::DeletePath(int index)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (index >= pData->m_PathCount) {
+ return;
+ }
+ pData->m_pPathList[index].SetNull();
+ for (int i = index; i < pData->m_PathCount - 1; i ++) {
+ pData->m_pPathList[i] = pData->m_pPathList[i + 1];
+ }
+ pData->m_pPathList[pData->m_PathCount - 1].SetNull();
+ FXSYS_memmove32(pData->m_pTypeList + index, pData->m_pTypeList + index + 1, pData->m_PathCount - index - 1);
+ pData->m_PathCount --;
+}
+#define FPDF_CLIPPATH_MAX_TEXTS 1024
+void CPDF_ClipPath::AppendTexts(CPDF_TextObject** pTexts, int count)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ if (pData->m_TextCount + count > FPDF_CLIPPATH_MAX_TEXTS) {
+ for (int i = 0; i < count; i ++) {
+ pTexts[i]->Release();
+ }
+ return;
+ }
+ CPDF_TextObject** pNewList = FX_Alloc(CPDF_TextObject*, pData->m_TextCount + count + 1);
+ if (pData->m_pTextList) {
+ FXSYS_memcpy32(pNewList, pData->m_pTextList, pData->m_TextCount * sizeof(CPDF_TextObject*));
+ FX_Free(pData->m_pTextList);
+ }
+ pData->m_pTextList = pNewList;
+ for (int i = 0; i < count; i ++) {
+ pData->m_pTextList[pData->m_TextCount + i] = pTexts[i];
+ }
+ pData->m_pTextList[pData->m_TextCount + count] = NULL;
+ pData->m_TextCount += count + 1;
+}
+void CPDF_ClipPath::Transform(const CPDF_Matrix& matrix)
+{
+ CPDF_ClipPathData* pData = GetModify();
+ int i;
+ for (i = 0; i < pData->m_PathCount; i ++) {
+ pData->m_pPathList[i].Transform(&matrix);
+ }
+ for (i = 0; i < pData->m_TextCount; i ++)
+ if (pData->m_pTextList[i]) {
+ pData->m_pTextList[i]->Transform(matrix);
+ }
+}
+CPDF_ColorStateData::CPDF_ColorStateData(const CPDF_ColorStateData& src)
+{
+ m_FillColor.Copy(&src.m_FillColor);
+ m_FillRGB = src.m_FillRGB;
+ m_StrokeColor.Copy(&src.m_StrokeColor);
+ m_StrokeRGB = src.m_StrokeRGB;
+}
+void CPDF_ColorStateData::Default()
+{
+ m_FillRGB = m_StrokeRGB = 0;
+ m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+ m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+}
+void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ SetColor(pData->m_FillColor, pData->m_FillRGB, pCS, pValue, nValues);
+}
+void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ SetColor(pData->m_StrokeColor, pData->m_StrokeRGB, pCS, pValue, nValues);
+}
+void CPDF_ColorState::SetColor(CPDF_Color& color, FX_DWORD& rgb, CPDF_ColorSpace* pCS, FX_FLOAT* pValue, int nValues)
+{
+ if (pCS) {
+ color.SetColorSpace(pCS);
+ } else if (color.IsNull()) {
+ color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+ }
+ if (color.m_pCS->CountComponents() > nValues) {
+ return;
+ }
+ color.SetValue(pValue);
+ int R, G, B;
+ rgb = color.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ pData->m_FillColor.SetValue(pPattern, pValue, nValues);
+ int R, G, B;
+ FX_BOOL ret = pData->m_FillColor.GetRGB(R, G, B);
+ if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
+ pData->m_FillRGB = 0x00BFBFBF;
+ return;
+ }
+ pData->m_FillRGB = ret ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern, FX_FLOAT* pValue, int nValues)
+{
+ CPDF_ColorStateData* pData = GetModify();
+ pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);
+ int R, G, B;
+ FX_BOOL ret = pData->m_StrokeColor.GetRGB(R, G, B);
+ if (pPattern->m_PatternType == 1 && ((CPDF_TilingPattern*)pPattern)->m_bColored && !ret) {
+ pData->m_StrokeRGB = 0x00BFBFBF;
+ return;
+ }
+ pData->m_StrokeRGB = pData->m_StrokeColor.GetRGB(R, G, B) ? FXSYS_RGB(R, G, B) : (FX_DWORD) - 1;
+}
+CPDF_TextStateData::CPDF_TextStateData()
+{
+ m_pFont = NULL;
+ m_FontSize = 1.0f;
+ m_WordSpace = 0;
+ m_CharSpace = 0;
+ m_TextMode = 0;
+ m_Matrix[0] = m_Matrix[3] = 1.0f;
+ m_Matrix[1] = m_Matrix[2] = 0;
+ m_CTM[0] = m_CTM[3] = 1.0f;
+ m_CTM[1] = m_CTM[2] = 0;
+}
+CPDF_TextStateData::CPDF_TextStateData(const CPDF_TextStateData& src)
+{
+ FXSYS_memcpy32(this, &src, sizeof(CPDF_TextStateData));
+ if (m_pFont && m_pFont->m_pDocument) {
+ m_pFont = m_pFont->m_pDocument->GetPageData()->GetFont(m_pFont->GetFontDict(), FALSE);
+ }
+}
+CPDF_TextStateData::~CPDF_TextStateData()
+{
+ CPDF_Font* pFont = m_pFont;
+ if (pFont && pFont->m_pDocument) {
+ pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
+ }
+}
+void CPDF_TextState::SetFont(CPDF_Font* pFont)
+{
+ CPDF_Font*& pStateFont = GetModify()->m_pFont;
+ CPDF_DocPageData* pDocPageData = NULL;
+ if (pStateFont && pStateFont->m_pDocument) {
+ pDocPageData = pStateFont->m_pDocument->GetPageData();
+ pDocPageData->ReleaseFont(pStateFont->GetFontDict());
+ }
+ pStateFont = pFont;
+}
+FX_FLOAT CPDF_TextState::GetFontSizeV() const
+{
+ FX_FLOAT* pMatrix = GetMatrix();
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[1], pMatrix[3]);
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
+ return (FX_FLOAT)FXSYS_fabs(size);
+}
+FX_FLOAT CPDF_TextState::GetFontSizeH() const
+{
+ FX_FLOAT* pMatrix = GetMatrix();
+ FX_FLOAT unit = FXSYS_sqrt2(pMatrix[0], pMatrix[2]);
+ FX_FLOAT size = FXSYS_Mul(unit, GetFontSize());
+ return (FX_FLOAT)FXSYS_fabs(size);
+}
+FX_FLOAT CPDF_TextState::GetBaselineAngle() const
+{
+ FX_FLOAT* m_Matrix = GetMatrix();
+ return FXSYS_atan2(m_Matrix[2], m_Matrix[0]);
+}
+FX_FLOAT CPDF_TextState::GetShearAngle() const
+{
+ FX_FLOAT* m_Matrix = GetMatrix();
+ FX_FLOAT shear_angle = FXSYS_atan2(m_Matrix[1], m_Matrix[3]);
+ return GetBaselineAngle() + shear_angle;
+}
+CPDF_GeneralStateData::CPDF_GeneralStateData()
+{
+ FXSYS_memset32(this, 0, sizeof(CPDF_GeneralStateData));
+ FXSYS_strcpy((FX_LPSTR)m_BlendMode, (FX_LPCSTR)"Normal");
+ m_StrokeAlpha = 1.0f;
+ m_FillAlpha = 1.0f;
+ m_Flatness = 1.0f;
+ m_Matrix.SetIdentity();
+}
+CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src)
+{
+ FXSYS_memcpy32(this, &src, sizeof(CPDF_GeneralStateData));
+ if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {
+ CPDF_DocRenderData* pDocCache = src.m_pTransferFunc->m_pPDFDoc->GetRenderData();
+ if (!pDocCache) {
+ return;
+ }
+ m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);
+ }
+}
+CPDF_GeneralStateData::~CPDF_GeneralStateData()
+{
+ if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {
+ CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();
+ if (!pDocCache) {
+ return;
+ }
+ pDocCache->ReleaseTransferFunc(m_pTR);
+ }
+}
+static int GetBlendType(FX_BSTR mode)
+{
+ switch (mode.GetID()) {
+ case FXBSTR_ID('N', 'o', 'r', 'm'):
+ case FXBSTR_ID('C', 'o', 'm', 'p'):
+ return FXDIB_BLEND_NORMAL;
+ case FXBSTR_ID('M', 'u', 'l', 't'):
+ return FXDIB_BLEND_MULTIPLY;
+ case FXBSTR_ID('S', 'c', 'r', 'e'):
+ return FXDIB_BLEND_SCREEN;
+ case FXBSTR_ID('O', 'v', 'e', 'r'):
+ return FXDIB_BLEND_OVERLAY;
+ case FXBSTR_ID('D', 'a', 'r', 'k'):
+ return FXDIB_BLEND_DARKEN;
+ case FXBSTR_ID('L', 'i', 'g', 'h'):
+ return FXDIB_BLEND_LIGHTEN;
+ case FXBSTR_ID('C', 'o', 'l', 'o'):
+ if (mode.GetLength() == 10) {
+ return FXDIB_BLEND_COLORDODGE;
+ }
+ if (mode.GetLength() == 9) {
+ return FXDIB_BLEND_COLORBURN;
+ }
+ return FXDIB_BLEND_COLOR;
+ case FXBSTR_ID('H', 'a', 'r', 'd'):
+ return FXDIB_BLEND_HARDLIGHT;
+ case FXBSTR_ID('S', 'o', 'f', 't'):
+ return FXDIB_BLEND_SOFTLIGHT;
+ case FXBSTR_ID('D', 'i', 'f', 'f'):
+ return FXDIB_BLEND_DIFFERENCE;
+ case FXBSTR_ID('E', 'x', 'c', 'l'):
+ return FXDIB_BLEND_EXCLUSION;
+ case FXBSTR_ID('H', 'u', 'e', 0):
+ return FXDIB_BLEND_HUE;
+ case FXBSTR_ID('S', 'a', 't', 'u'):
+ return FXDIB_BLEND_SATURATION;
+ case FXBSTR_ID('L', 'u', 'm', 'i'):
+ return FXDIB_BLEND_LUMINOSITY;
+ }
+ return FXDIB_BLEND_NORMAL;
+}
+void CPDF_GeneralStateData::SetBlendMode(FX_BSTR blend_mode)
+{
+ if (blend_mode.GetLength() > 15) {
+ return;
+ }
+ FXSYS_memcpy32(m_BlendMode, (FX_LPCBYTE)blend_mode, blend_mode.GetLength());
+ m_BlendMode[blend_mode.GetLength()] = 0;
+ m_BlendType = ::GetBlendType(blend_mode);
+}
+int RI_StringToId(const CFX_ByteString& ri)
+{
+ FX_DWORD id = ri.GetID();
+ if (id == FXBSTR_ID('A', 'b', 's', 'o')) {
+ return 1;
+ }
+ if (id == FXBSTR_ID('S', 'a', 't', 'u')) {
+ return 2;
+ }
+ if (id == FXBSTR_ID('P', 'e', 'r', 'c')) {
+ return 3;
+ }
+ return 0;
+}
+void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri)
+{
+ GetModify()->m_RenderIntent = RI_StringToId(ri);
+}
+CPDF_AllStates::CPDF_AllStates()
+{
+ m_TextX = m_TextY = m_TextLineX = m_TextLineY = 0;
+ m_TextLeading = 0;
+ m_TextRise = 0;
+ m_TextHorzScale = 1.0f;
+}
+CPDF_AllStates::~CPDF_AllStates()
+{
+}
+void CPDF_AllStates::Copy(const CPDF_AllStates& src)
+{
+ CopyStates(src);
+ m_TextMatrix.Copy(src.m_TextMatrix);
+ m_ParentMatrix.Copy(src.m_ParentMatrix);
+ m_CTM.Copy(src.m_CTM);
+ m_TextX = src.m_TextX;
+ m_TextY = src.m_TextY;
+ m_TextLineX = src.m_TextLineX;
+ m_TextLineY = src.m_TextLineY;
+ m_TextLeading = src.m_TextLeading;
+ m_TextRise = src.m_TextRise;
+ m_TextHorzScale = src.m_TextHorzScale;
+}
+void CPDF_AllStates::SetLineDash(CPDF_Array* pArray, FX_FLOAT phase, FX_FLOAT scale)
+{
+ CFX_GraphStateData* pData = m_GraphState.GetModify();
+ pData->m_DashPhase = FXSYS_Mul(phase, scale);
+ pData->SetDashCount(pArray->GetCount());
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ pData->m_DashArray[i] = FXSYS_Mul(pArray->GetNumber(i), scale);
+ }
+}
+void CPDF_AllStates::ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser)
+{
+ CPDF_GeneralStateData* pGeneralState = m_GeneralState.GetModify();
+ FX_POSITION pos = pGS->GetStartPos();
+ while (pos) {
+ CFX_ByteString key_str;
+ CPDF_Object* pObject = pGS->GetNextElement(pos, key_str)->GetDirect();
+ if (pObject == NULL) {
+ continue;
+ }
+ FX_DWORD key = key_str.GetID();
+ switch (key) {
+ case FXBSTR_ID('L', 'W', 0, 0):
+ m_GraphState.GetModify()->m_LineWidth = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('L', 'C', 0, 0):
+ m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)pObject->GetInteger();
+ break;
+ case FXBSTR_ID('L', 'J', 0, 0):
+ m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)pObject->GetInteger();
+ break;
+ case FXBSTR_ID('M', 'L', 0, 0):
+ m_GraphState.GetModify()->m_MiterLimit = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('D', 0, 0, 0): {
+ if (pObject->GetType() != PDFOBJ_ARRAY) {
+ break;
+ }
+ CPDF_Array* pDash = (CPDF_Array*)pObject;
+ CPDF_Array* pArray = pDash->GetArray(0);
+ if (pArray == NULL) {
+ break;
+ }
+ SetLineDash(pArray, pDash->GetNumber(1), 1.0f);
+ break;
+ }
+ case FXBSTR_ID('R', 'I', 0, 0):
+ m_GeneralState.SetRenderIntent(pObject->GetString());
+ break;
+ case FXBSTR_ID('F', 'o', 'n', 't'): {
+ if (pObject->GetType() != PDFOBJ_ARRAY) {
+ break;
+ }
+ CPDF_Array* pFont = (CPDF_Array*)pObject;
+ m_TextState.GetModify()->m_FontSize = pFont->GetNumber(1);
+ m_TextState.SetFont(pParser->FindFont(pFont->GetString(0)));
+ break;
+ }
+ case FXBSTR_ID('T', 'R', 0, 0):
+ if (pGS->KeyExist(FX_BSTRC("TR2"))) {
+ continue;
+ }
+ case FXBSTR_ID('T', 'R', '2', 0):
+ if (pObject && pObject->GetType() != PDFOBJ_NAME) {
+ pGeneralState->m_pTR = pObject;
+ } else {
+ pGeneralState->m_pTR = NULL;
+ }
+ break;
+ case FXBSTR_ID('B', 'M', 0, 0): {
+ CFX_ByteString mode;
+ if (pObject->GetType() == PDFOBJ_ARRAY) {
+ mode = ((CPDF_Array*)pObject)->GetString(0);
+ } else {
+ mode = pObject->GetString();
+ }
+ pGeneralState->SetBlendMode(mode);
+ if (pGeneralState->m_BlendType > FXDIB_BLEND_MULTIPLY) {
+ pParser->m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
+ }
+ break;
+ }
+ case FXBSTR_ID('S', 'M', 'a', 's'):
+ if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY) {
+ pGeneralState->m_pSoftMask = pObject;
+ FXSYS_memcpy32(pGeneralState->m_SMaskMatrix, &pParser->m_pCurStates->m_CTM, sizeof(CPDF_Matrix));
+ } else {
+ pGeneralState->m_pSoftMask = NULL;
+ }
+ break;
+ case FXBSTR_ID('C', 'A', 0, 0):
+ pGeneralState->m_StrokeAlpha = PDF_ClipFloat(pObject->GetNumber());
+ break;
+ case FXBSTR_ID('c', 'a', 0, 0):
+ pGeneralState->m_FillAlpha = PDF_ClipFloat(pObject->GetNumber());
+ break;
+ case FXBSTR_ID('O', 'P', 0, 0):
+ pGeneralState->m_StrokeOP = pObject->GetInteger();
+ if (!pGS->KeyExist(FX_BSTRC("op"))) {
+ pGeneralState->m_FillOP = pObject->GetInteger();
+ }
+ break;
+ case FXBSTR_ID('o', 'p', 0, 0):
+ pGeneralState->m_FillOP = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('O', 'P', 'M', 0):
+ pGeneralState->m_OPMode = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('B', 'G', 0, 0):
+ if (pGS->KeyExist(FX_BSTRC("BG2"))) {
+ continue;
+ }
+ case FXBSTR_ID('B', 'G', '2', 0):
+ pGeneralState->m_pBG = pObject;
+ break;
+ case FXBSTR_ID('U', 'C', 'R', 0):
+ if (pGS->KeyExist(FX_BSTRC("UCR2"))) {
+ continue;
+ }
+ case FXBSTR_ID('U', 'C', 'R', '2'):
+ pGeneralState->m_pUCR = pObject;
+ break;
+ case FXBSTR_ID('H', 'T', 0, 0):
+ pGeneralState->m_pHT = pObject;
+ break;
+ case FXBSTR_ID('F', 'L', 0, 0):
+ pGeneralState->m_Flatness = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('S', 'M', 0, 0):
+ pGeneralState->m_Smoothness = pObject->GetNumber();
+ break;
+ case FXBSTR_ID('S', 'A', 0, 0):
+ pGeneralState->m_StrokeAdjust = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('A', 'I', 'S', 0):
+ pGeneralState->m_AlphaSource = pObject->GetInteger();
+ break;
+ case FXBSTR_ID('T', 'K', 0, 0):
+ pGeneralState->m_TextKnockout = pObject->GetInteger();
+ break;
+ }
+ }
+ pGeneralState->m_Matrix = m_CTM;
+}
+CPDF_ContentMarkItem::CPDF_ContentMarkItem()
+{
+ m_ParamType = None;
+}
+CPDF_ContentMarkItem::CPDF_ContentMarkItem(const CPDF_ContentMarkItem& src)
+{
+ m_MarkName = src.m_MarkName;
+ m_ParamType = src.m_ParamType;
+ if (m_ParamType == DirectDict) {
+ m_pParam = ((CPDF_Dictionary*)src.m_pParam)->Clone();
+ } else {
+ m_pParam = src.m_pParam;
+ }
+}
+CPDF_ContentMarkItem::~CPDF_ContentMarkItem()
+{
+ if (m_ParamType == DirectDict) {
+ ((CPDF_Dictionary*)m_pParam)->Release();
+ }
+}
+FX_BOOL CPDF_ContentMarkItem::HasMCID() const
+{
+ if (m_pParam && (m_ParamType == DirectDict || m_ParamType == PropertiesDict)) {
+ return ((CPDF_Dictionary *)m_pParam)->KeyExist(FX_BSTRC("MCID"));
+ }
+ return FALSE;
+}
+CPDF_ContentMarkData::CPDF_ContentMarkData(const CPDF_ContentMarkData& src)
+{
+ for (int i = 0; i < src.m_Marks.GetSize(); i ++) {
+ m_Marks.Add(src.m_Marks[i]);
+ }
+}
+int CPDF_ContentMarkData::GetMCID() const
+{
+ CPDF_ContentMarkItem::ParamType type = CPDF_ContentMarkItem::None;
+ for (int i = 0; i < m_Marks.GetSize(); i ++) {
+ type = m_Marks[i].GetParamType();
+ if (type == CPDF_ContentMarkItem::PropertiesDict || type == CPDF_ContentMarkItem::DirectDict) {
+ CPDF_Dictionary *pDict = (CPDF_Dictionary *)m_Marks[i].GetParam();
+ if (pDict->KeyExist(FX_BSTRC("MCID"))) {
+ return pDict->GetInteger(FX_BSTRC("MCID"));
+ }
+ }
+ }
+ return -1;
+}
+void CPDF_ContentMarkData::AddMark(const CFX_ByteString& name, CPDF_Dictionary* pDict, FX_BOOL bDirect)
+{
+ CPDF_ContentMarkItem& item = m_Marks.Add();
+ item.SetName(name);
+ if (pDict == NULL) {
+ return;
+ }
+ item.SetParam(bDirect ? CPDF_ContentMarkItem::DirectDict : CPDF_ContentMarkItem::PropertiesDict,
+ bDirect ? pDict->Clone() : pDict);
+}
+void CPDF_ContentMarkData::DeleteLastMark()
+{
+ int size = m_Marks.GetSize();
+ if (size == 0) {
+ return;
+ }
+ m_Marks.RemoveAt(size - 1);
+}
+FX_BOOL CPDF_ContentMark::HasMark(FX_BSTR mark) const
+{
+ if (m_pObject == NULL) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_pObject->CountItems(); i ++) {
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
+ if (item.GetName() == mark) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ContentMark::LookupMark(FX_BSTR mark, CPDF_Dictionary*& pDict) const
+{
+ if (m_pObject == NULL) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_pObject->CountItems(); i ++) {
+ CPDF_ContentMarkItem& item = m_pObject->GetItem(i);
+ if (item.GetName() == mark) {
+ pDict = NULL;
+ if (item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict ||
+ item.GetParamType() == CPDF_ContentMarkItem::DirectDict) {
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
new file mode 100644
index 0000000000..ec351058ac
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp
@@ -0,0 +1,116 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "pageint.h"
+CPDF_ImageObject::CPDF_ImageObject()
+{
+ m_pImage = NULL;
+ m_Type = PDFPAGE_IMAGE;
+}
+CPDF_ImageObject::~CPDF_ImageObject()
+{
+ if (!m_pImage) {
+ return;
+ }
+ if (m_pImage->IsInline() || (m_pImage->GetStream() && m_pImage->GetStream()->GetObjNum() == 0)) {
+ delete m_pImage;
+ } else {
+ m_pImage->GetDocument()->GetPageData()->ReleaseImage(m_pImage->GetStream());
+ }
+}
+void CPDF_ImageObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_ImageObject* pSrcObj = (const CPDF_ImageObject*)pSrc;
+ if (m_pImage) {
+ m_pImage->Release();
+ }
+ m_pImage = pSrcObj->m_pImage->Clone();
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_ImageObject::Transform(const CFX_AffineMatrix& matrix)
+{
+ m_Matrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_ImageObject::CalcBoundingBox()
+{
+ m_Left = m_Bottom = 0;
+ m_Right = m_Top = 1.0f;
+ m_Matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom);
+}
+void CPDF_Image::Release()
+{
+ if (m_bInline || (m_pStream && m_pStream->GetObjNum() == 0)) {
+ delete this;
+ }
+}
+CPDF_Image* CPDF_Image::Clone()
+{
+ if (m_pStream->GetObjNum()) {
+ return m_pDocument->GetPageData()->GetImage(m_pStream);
+ }
+ CPDF_Image* pImage = FX_NEW CPDF_Image(m_pDocument);
+ pImage->LoadImageF((CPDF_Stream*)((CPDF_Object*)m_pStream)->Clone(), m_bInline);
+ if (m_bInline) {
+ CPDF_Dictionary *pInlineDict = (CPDF_Dictionary*)m_pInlineDict->Clone(TRUE);
+ pImage->SetInlineDict(pInlineDict);
+ }
+ return pImage;
+}
+CPDF_Image::CPDF_Image(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+ m_pStream = NULL;
+ m_pOC = NULL;
+ m_bInline = FALSE;
+ m_pInlineDict = NULL;
+ m_pDIBSource = NULL;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+}
+CPDF_Image::~CPDF_Image()
+{
+ if (m_bInline) {
+ if (m_pStream) {
+#ifndef FOXIT_CHROME_BUILD
+ CPDF_Dictionary* pDict = m_pStream->GetDict();
+ if (pDict) {
+ CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj && m_pDocument) {
+ m_pDocument->RemoveColorSpaceFromPageData(pCSObj);
+ }
+ }
+#endif
+ m_pStream->Release();
+ }
+ if (m_pInlineDict) {
+ m_pInlineDict->Release();
+ }
+ }
+}
+FX_BOOL CPDF_Image::LoadImageF(CPDF_Stream* pStream, FX_BOOL bInline)
+{
+ m_pStream = pStream;
+ if (m_bInline && m_pInlineDict) {
+ m_pInlineDict->Release();
+ m_pInlineDict = NULL;
+ }
+ m_bInline = bInline;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ if (m_bInline) {
+ m_pInlineDict = (CPDF_Dictionary*)pDict->Clone();
+ }
+ m_pOC = pDict->GetDict(FX_BSTRC("OC"));
+ m_bIsMask = !pDict->KeyExist(FX_BSTRC("ColorSpace")) || pDict->GetInteger(FX_BSTRC("ImageMask"));
+#ifndef _FPDFAPI_MINI_
+ m_bInterpolate = pDict->GetInteger(FX_BSTRC("Interpolate"));
+#endif
+ m_Height = pDict->GetInteger(FX_BSTRC("Height"));
+ m_Width = pDict->GetInteger(FX_BSTRC("Width"));
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
new file mode 100644
index 0000000000..40f6d04212
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -0,0 +1,1681 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_serial.h"
+#include "pageint.h"
+#define REQUIRE_PARAMS(count) if (m_ParamCount != count) { m_bAbort = TRUE; return; }
+CPDF_StreamContentParser::CPDF_StreamContentParser()
+{
+ m_DefFontSize = 0;
+ m_pCurStates = NULL;
+ m_pLastTextObject = NULL;
+ m_pPathPoints = NULL;
+ m_PathClipType = 0;
+ m_PathPointCount = m_PathAllocSize = 0;
+ m_PathCurrentX = m_PathCurrentY = 0.0f;
+ m_bResourceMissing = FALSE;
+ m_bColored = FALSE;
+ FXSYS_memset32(m_Type3Data, 0, sizeof(FX_FLOAT) * 6);
+ m_ParamCount = 0;
+ m_ParamStartPos = 0;
+ m_bAbort = FALSE;
+ m_pLastImageDict = NULL;
+ m_pLastCloneImageDict = NULL;
+ m_pLastImage = NULL;
+ m_bReleaseLastDict = TRUE;
+ m_pParentResources = NULL;
+#ifdef _FPDFAPI_MINI_
+ m_pObjectState = NULL;
+ m_pObjectStack = NULL;
+ m_pWordBuf = NULL;
+ m_pDictName = NULL;
+ m_pStreamBuf = NULL;
+ m_WordState = 0;
+ m_ObjectSize = 0;
+#endif
+}
+FX_BOOL CPDF_StreamContentParser::Initialize()
+{
+#ifdef _FPDFAPI_MINI_
+ m_pObjectState = FX_Alloc(FX_BOOL, _FPDF_MAX_OBJECT_STACK_SIZE_);
+ FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
+ m_pObjectStack = FX_Alloc(CPDF_Object*, _FPDF_MAX_OBJECT_STACK_SIZE_);
+ FXSYS_memset32(m_pObjectStack, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(CPDF_Object*));
+ m_pWordBuf = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pWordBuf, 0, 256 * sizeof(FX_BYTE));
+ m_pDictName = FX_Alloc(FX_BYTE, 256);
+ FXSYS_memset32(m_pDictName, 0, 256 * sizeof(FX_BYTE));
+ m_pStreamBuf = FX_Alloc(FX_BYTE, STREAM_PARSE_BUFSIZE);
+ FXSYS_memset32(m_pStreamBuf, 0, STREAM_PARSE_BUFSIZE * sizeof(FX_BYTE));
+ m_StringBuf.EstimateSize(1024);
+ m_ObjectSize = 0;
+ m_ImageSrcBuf.EstimateSize(STREAM_PARSE_BUFSIZE);
+#endif
+ return TRUE;
+}
+CPDF_StreamContentParser::~CPDF_StreamContentParser()
+{
+ ClearAllParams();
+ int i = 0;
+ for (i = 0; i < m_StateStack.GetSize(); i ++) {
+ delete (CPDF_AllStates*)m_StateStack[i];
+ }
+ if (m_pPathPoints) {
+ FX_Free(m_pPathPoints);
+ }
+ if (m_pCurStates) {
+ delete m_pCurStates;
+ }
+ if (m_pLastImageDict) {
+ m_pLastImageDict->Release();
+ }
+ if (m_pLastCloneImageDict) {
+ m_pLastCloneImageDict->Release();
+ }
+#ifdef _FPDFAPI_MINI_
+ for (i = 0; i < (int)m_ObjectSize; ++i) {
+ if (!m_pObjectState[i]) {
+ m_pObjectStack[i]->Release();
+ }
+ }
+ FX_Free(m_pObjectStack);
+ FX_Free(m_pObjectState);
+ FX_Free(m_pStreamBuf);
+ FX_Free(m_pWordBuf);
+ FX_Free(m_pDictName);
+#endif
+}
+void CPDF_StreamContentParser::PrepareParse(CPDF_Document* pDocument,
+ CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources, CFX_AffineMatrix* pmtContentToUser, CPDF_PageObjects* pObjList,
+ CPDF_Dictionary* pResources, CPDF_Rect* pBBox, CPDF_ParseOptions* pOptions,
+ CPDF_AllStates* pStates, int level)
+{
+ for (int i = 0; i < 6; i ++) {
+ m_Type3Data[i] = 0;
+ }
+ m_pDocument = pDocument;
+ m_pPageResources = pPageResources;
+ m_pParentResources = pParentResources;
+ if (pmtContentToUser) {
+ m_mtContentToUser = *pmtContentToUser;
+ }
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_pObjectList = pObjList;
+ m_pResources = pResources;
+ if (pResources == NULL) {
+ m_pResources = m_pParentResources;
+ }
+ if (m_pResources == NULL) {
+ m_pResources = pPageResources;
+ }
+ if (pBBox) {
+ m_BBox = *pBBox;
+ }
+ m_Level = level;
+ m_pCurStates = FX_NEW CPDF_AllStates;
+ if (pStates) {
+ m_pCurStates->Copy(*pStates);
+ } else {
+ m_pCurStates->m_GeneralState.New();
+ m_pCurStates->m_GraphState.New();
+ m_pCurStates->m_TextState.New();
+ m_pCurStates->m_ColorState.New();
+ }
+#ifdef _FPDFAPI_MINI_
+ FXSYS_memset32(m_pObjectState, 0, _FPDF_MAX_OBJECT_STACK_SIZE_ * sizeof(FX_BOOL));
+#endif
+}
+int CPDF_StreamContentParser::GetNextParamPos()
+{
+ if (m_ParamCount == PARAM_BUF_SIZE) {
+ m_ParamStartPos ++;
+ if (m_ParamStartPos == PARAM_BUF_SIZE) {
+ m_ParamStartPos = 0;
+ }
+ if (m_ParamBuf1[m_ParamStartPos].m_Type == 0) {
+ m_ParamBuf1[m_ParamStartPos].m_pObject->Release();
+ }
+ return m_ParamStartPos;
+ }
+ int index = m_ParamStartPos + m_ParamCount;
+ if (index >= PARAM_BUF_SIZE) {
+ index -= PARAM_BUF_SIZE;
+ }
+ m_ParamCount ++;
+ return index;
+}
+void CPDF_StreamContentParser::AddNameParam(FX_LPCSTR name, int len)
+{
+ int index = GetNextParamPos();
+ if (len > 32) {
+ m_ParamBuf1[index].m_Type = 0;
+ m_ParamBuf1[index].m_pObject = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));
+ } else {
+ m_ParamBuf1[index].m_Type = PDFOBJ_NAME;
+ if (FXSYS_memchr(name, '#', len) == NULL) {
+ FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, name, len);
+ m_ParamBuf1[index].m_Name.m_Len = len;
+ } else {
+ CFX_ByteString str = PDF_NameDecode(CFX_ByteStringC(name, len));
+ FXSYS_memcpy32(m_ParamBuf1[index].m_Name.m_Buffer, (FX_LPCSTR)str, str.GetLength());
+ m_ParamBuf1[index].m_Name.m_Len = str.GetLength();
+ }
+ }
+}
+void CPDF_StreamContentParser::AddNumberParam(FX_LPCSTR str, int len)
+{
+ int index = GetNextParamPos();
+ m_ParamBuf1[index].m_Type = PDFOBJ_NUMBER;
+ FX_atonum(CFX_ByteStringC(str, len), m_ParamBuf1[index].m_Number.m_bInteger,
+ &m_ParamBuf1[index].m_Number.m_Integer);
+}
+void CPDF_StreamContentParser::AddObjectParam(CPDF_Object* pObj)
+{
+ int index = GetNextParamPos();
+ m_ParamBuf1[index].m_Type = 0;
+ m_ParamBuf1[index].m_pObject = pObj;
+}
+void CPDF_StreamContentParser::ClearAllParams()
+{
+ FX_DWORD index = m_ParamStartPos;
+ for (FX_DWORD i = 0; i < m_ParamCount; i ++) {
+ if (m_ParamBuf1[index].m_Type == 0) {
+ m_ParamBuf1[index].m_pObject->Release();
+ }
+ index ++;
+ if (index == PARAM_BUF_SIZE) {
+ index = 0;
+ }
+ }
+ m_ParamStartPos = 0;
+ m_ParamCount = 0;
+}
+CPDF_Object* CPDF_StreamContentParser::GetObject(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return NULL;
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NUMBER) {
+ CPDF_Number* pNumber = CPDF_Number::Create(param.m_Number.m_bInteger, &param.m_Number.m_Integer);
+ param.m_Type = 0;
+ param.m_pObject = pNumber;
+ return pNumber;
+ }
+ if (param.m_Type == PDFOBJ_NAME) {
+ CPDF_Name* pName = CPDF_Name::Create(CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
+ param.m_Type = 0;
+ param.m_pObject = pName;
+ return pName;
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject;
+ }
+ ASSERT(FALSE);
+ return NULL;
+}
+CFX_ByteString CPDF_StreamContentParser::GetString(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return CFX_ByteString();
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NAME) {
+ return CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len);
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject->GetString();
+ }
+ return CFX_ByteString();
+}
+FX_FLOAT CPDF_StreamContentParser::GetNumber(FX_DWORD index)
+{
+ if (index >= m_ParamCount) {
+ return 0;
+ }
+ int real_index = m_ParamStartPos + m_ParamCount - index - 1;
+ if (real_index >= PARAM_BUF_SIZE) {
+ real_index -= PARAM_BUF_SIZE;
+ }
+ _ContentParam& param = m_ParamBuf1[real_index];
+ if (param.m_Type == PDFOBJ_NUMBER) {
+ return param.m_Number.m_bInteger ? (FX_FLOAT)param.m_Number.m_Integer : param.m_Number.m_Float;
+ }
+ if (param.m_Type == 0) {
+ return param.m_pObject->GetNumber();
+ }
+ return 0;
+}
+FX_FLOAT CPDF_StreamContentParser::GetNumber16(FX_DWORD index)
+{
+ return GetNumber(index);
+}
+void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph)
+{
+ pObj->m_GeneralState = m_pCurStates->m_GeneralState;
+ pObj->m_ClipPath = m_pCurStates->m_ClipPath;
+ pObj->m_ContentMark = m_CurContentMark;
+ if (bColor) {
+ pObj->m_ColorState = m_pCurStates->m_ColorState;
+ }
+ if (bGraph) {
+ pObj->m_GraphState = m_pCurStates->m_GraphState;
+ }
+ if (bText) {
+ pObj->m_TextState = m_pCurStates->m_TextState;
+ }
+}
+const struct _OpCode {
+ FX_DWORD m_OpId;
+ void (CPDF_StreamContentParser::*m_OpHandler)();
+} g_OpCodes[] = {
+ {FXBSTR_ID('"', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText_Space},
+ {FXBSTR_ID('\'', 0, 0, 0), &CPDF_StreamContentParser::Handle_NextLineShowText},
+ {FXBSTR_ID('B', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillStrokePath},
+ {FXBSTR_ID('B', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillStrokePath},
+ {FXBSTR_ID('B', 'D', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary},
+ {FXBSTR_ID('B', 'I', 0, 0), &CPDF_StreamContentParser::Handle_BeginImage},
+ {FXBSTR_ID('B', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_BeginMarkedContent},
+ {FXBSTR_ID('B', 'T', 0, 0), &CPDF_StreamContentParser::Handle_BeginText},
+ {FXBSTR_ID('B', 'X', 0, 0), &CPDF_StreamContentParser::Handle_BeginSectionUndefined},
+ {FXBSTR_ID('C', 'S', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Stroke},
+ {FXBSTR_ID('D', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace_Dictionary},
+ {FXBSTR_ID('D', 'o', 0, 0), &CPDF_StreamContentParser::Handle_ExecuteXObject},
+ {FXBSTR_ID('E', 'I', 0, 0), &CPDF_StreamContentParser::Handle_EndImage},
+ {FXBSTR_ID('E', 'M', 'C', 0), &CPDF_StreamContentParser::Handle_EndMarkedContent},
+ {FXBSTR_ID('E', 'T', 0, 0), &CPDF_StreamContentParser::Handle_EndText},
+ {FXBSTR_ID('E', 'X', 0, 0), &CPDF_StreamContentParser::Handle_EndSectionUndefined},
+ {FXBSTR_ID('F', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPathOld},
+ {FXBSTR_ID('G', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Stroke},
+ {FXBSTR_ID('I', 'D', 0, 0), &CPDF_StreamContentParser::Handle_BeginImageData},
+ {FXBSTR_ID('J', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineCap},
+ {FXBSTR_ID('K', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke},
+ {FXBSTR_ID('M', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetMiterLimit},
+ {FXBSTR_ID('M', 'P', 0, 0), &CPDF_StreamContentParser::Handle_MarkPlace},
+ {FXBSTR_ID('Q', 0, 0, 0), &CPDF_StreamContentParser::Handle_RestoreGraphState},
+ {FXBSTR_ID('R', 'G', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Stroke},
+ {FXBSTR_ID('S', 0, 0, 0), &CPDF_StreamContentParser::Handle_StrokePath},
+ {FXBSTR_ID('S', 'C', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Stroke},
+ {FXBSTR_ID('S', 'C', 'N', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Stroke},
+ {FXBSTR_ID('T', '*', 0, 0), &CPDF_StreamContentParser::Handle_MoveToNextLine},
+ {FXBSTR_ID('T', 'D', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading},
+ {FXBSTR_ID('T', 'J', 0, 0), &CPDF_StreamContentParser::Handle_ShowText_Positioning},
+ {FXBSTR_ID('T', 'L', 0, 0), &CPDF_StreamContentParser::Handle_SetTextLeading},
+ {FXBSTR_ID('T', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetCharSpace},
+ {FXBSTR_ID('T', 'd', 0, 0), &CPDF_StreamContentParser::Handle_MoveTextPoint},
+ {FXBSTR_ID('T', 'f', 0, 0), &CPDF_StreamContentParser::Handle_SetFont},
+ {FXBSTR_ID('T', 'j', 0, 0), &CPDF_StreamContentParser::Handle_ShowText},
+ {FXBSTR_ID('T', 'm', 0, 0), &CPDF_StreamContentParser::Handle_SetTextMatrix},
+ {FXBSTR_ID('T', 'r', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRenderMode},
+ {FXBSTR_ID('T', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetTextRise},
+ {FXBSTR_ID('T', 'w', 0, 0), &CPDF_StreamContentParser::Handle_SetWordSpace},
+ {FXBSTR_ID('T', 'z', 0, 0), &CPDF_StreamContentParser::Handle_SetHorzScale},
+ {FXBSTR_ID('W', 0, 0, 0), &CPDF_StreamContentParser::Handle_Clip},
+ {FXBSTR_ID('W', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOClip},
+ {FXBSTR_ID('b', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseFillStrokePath},
+ {FXBSTR_ID('b', '*', 0, 0), &CPDF_StreamContentParser::Handle_CloseEOFillStrokePath},
+ {FXBSTR_ID('c', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_123},
+ {FXBSTR_ID('c', 'm', 0, 0), &CPDF_StreamContentParser::Handle_ConcatMatrix},
+ {FXBSTR_ID('c', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetColorSpace_Fill},
+ {FXBSTR_ID('d', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetDash},
+ {FXBSTR_ID('d', '0', 0, 0), &CPDF_StreamContentParser::Handle_SetCharWidth},
+ {FXBSTR_ID('d', '1', 0, 0), &CPDF_StreamContentParser::Handle_SetCachedDevice},
+ {FXBSTR_ID('f', 0, 0, 0), &CPDF_StreamContentParser::Handle_FillPath},
+ {FXBSTR_ID('f', '*', 0, 0), &CPDF_StreamContentParser::Handle_EOFillPath},
+ {FXBSTR_ID('g', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetGray_Fill},
+ {FXBSTR_ID('g', 's', 0, 0), &CPDF_StreamContentParser::Handle_SetExtendGraphState},
+ {FXBSTR_ID('h', 0, 0, 0), &CPDF_StreamContentParser::Handle_ClosePath},
+ {FXBSTR_ID('i', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetFlat},
+ {FXBSTR_ID('j', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineJoin},
+ {FXBSTR_ID('k', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetCMYKColor_Fill},
+ {FXBSTR_ID('l', 0, 0, 0), &CPDF_StreamContentParser::Handle_LineTo},
+ {FXBSTR_ID('m', 0, 0, 0), &CPDF_StreamContentParser::Handle_MoveTo},
+ {FXBSTR_ID('n', 0, 0, 0), &CPDF_StreamContentParser::Handle_EndPath},
+ {FXBSTR_ID('q', 0, 0, 0), &CPDF_StreamContentParser::Handle_SaveGraphState},
+ {FXBSTR_ID('r', 'e', 0, 0), &CPDF_StreamContentParser::Handle_Rectangle},
+ {FXBSTR_ID('r', 'g', 0, 0), &CPDF_StreamContentParser::Handle_SetRGBColor_Fill},
+ {FXBSTR_ID('r', 'i', 0, 0), &CPDF_StreamContentParser::Handle_SetRenderIntent},
+ {FXBSTR_ID('s', 0, 0, 0), &CPDF_StreamContentParser::Handle_CloseStrokePath},
+ {FXBSTR_ID('s', 'c', 0, 0), &CPDF_StreamContentParser::Handle_SetColor_Fill},
+ {FXBSTR_ID('s', 'c', 'n', 0), &CPDF_StreamContentParser::Handle_SetColorPS_Fill},
+ {FXBSTR_ID('s', 'h', 0, 0), &CPDF_StreamContentParser::Handle_ShadeFill},
+ {FXBSTR_ID('v', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_23},
+ {FXBSTR_ID('w', 0, 0, 0), &CPDF_StreamContentParser::Handle_SetLineWidth},
+ {FXBSTR_ID('y', 0, 0, 0), &CPDF_StreamContentParser::Handle_CurveTo_13},
+};
+FX_BOOL CPDF_StreamContentParser::OnOperator(FX_LPCSTR op)
+{
+ int i = 0;
+ FX_DWORD opid = 0;
+ while (i < 4 && op[i]) {
+ opid = (opid << 8) + op[i];
+ i ++;
+ }
+ while (i < 4) {
+ opid <<= 8;
+ i ++;
+ };
+ int low = 0, high = sizeof g_OpCodes / sizeof(struct _OpCode) - 1;
+ while (low <= high) {
+ int middle = (low + high) / 2;
+ int compare = opid - g_OpCodes[middle].m_OpId;
+ if (compare == 0) {
+ (this->*g_OpCodes[middle].m_OpHandler)();
+ return TRUE;
+ } else if (compare < 0) {
+ high = middle - 1;
+ } else {
+ low = middle + 1;
+ }
+ }
+ return m_CompatCount != 0;
+}
+void CPDF_StreamContentParser::Handle_CloseFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ Handle_ClosePath();
+ AddPathObject(FXFILL_WINDING, TRUE);
+}
+void CPDF_StreamContentParser::Handle_FillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, TRUE);
+}
+void CPDF_StreamContentParser::Handle_CloseEOFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
+ AddPathObject(FXFILL_ALTERNATE, TRUE);
+}
+void CPDF_StreamContentParser::Handle_EOFillStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_ALTERNATE, TRUE);
+}
+void CPDF_StreamContentParser::Handle_BeginMarkedContent_Dictionary()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ CFX_ByteString tag = GetString(1);
+ CPDF_Object* pProperty = GetObject(0);
+ if (pProperty == NULL) {
+ return;
+ }
+ FX_BOOL bDirect = TRUE;
+ if (pProperty->GetType() == PDFOBJ_NAME) {
+ pProperty = FindResourceObj(FX_BSTRC("Properties"), pProperty->GetString());
+ if (pProperty == NULL) {
+ return;
+ }
+ bDirect = FALSE;
+ }
+ if (pProperty->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ m_CurContentMark.GetModify()->AddMark(tag, (CPDF_Dictionary*)pProperty, bDirect);
+}
+void CPDF_StreamContentParser::Handle_BeginMarkedContent()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ CFX_ByteString tag = GetString(0);
+ m_CurContentMark.GetModify()->AddMark(tag, NULL, FALSE);
+}
+struct _FX_BSTR {
+ FX_LPCSTR m_Ptr;
+ int m_Size;
+};
+#define _FX_BSTRC(str) {str, sizeof(str)-1}
+const _FX_BSTR _PDF_InlineKeyAbbr[] = {
+ _FX_BSTRC("BitsPerComponent"), _FX_BSTRC("BPC"),
+ _FX_BSTRC("ColorSpace"), _FX_BSTRC("CS"),
+ _FX_BSTRC("Decode"), _FX_BSTRC("D"),
+ _FX_BSTRC("DecodeParms"), _FX_BSTRC("DP"),
+ _FX_BSTRC("Filter"), _FX_BSTRC("F"),
+ _FX_BSTRC("Height"), _FX_BSTRC("H"),
+ _FX_BSTRC("ImageMask"), _FX_BSTRC("IM"),
+ _FX_BSTRC("Interpolate"), _FX_BSTRC("I"),
+ _FX_BSTRC("Width"), _FX_BSTRC("W"),
+};
+const _FX_BSTR _PDF_InlineValueAbbr[] = {
+ _FX_BSTRC("DeviceGray"), _FX_BSTRC("G"),
+ _FX_BSTRC("DeviceRGB"), _FX_BSTRC("RGB"),
+ _FX_BSTRC("DeviceCMYK"), _FX_BSTRC("CMYK"),
+ _FX_BSTRC("Indexed"), _FX_BSTRC("I"),
+ _FX_BSTRC("ASCIIHexDecode"), _FX_BSTRC("AHx"),
+ _FX_BSTRC("ASCII85Decode"), _FX_BSTRC("A85"),
+ _FX_BSTRC("LZWDecode"), _FX_BSTRC("LZW"),
+ _FX_BSTRC("FlateDecode"), _FX_BSTRC("Fl"),
+ _FX_BSTRC("RunLengthDecode"), _FX_BSTRC("RL"),
+ _FX_BSTRC("CCITTFaxDecode"), _FX_BSTRC("CCF"),
+ _FX_BSTRC("DCTDecode"), _FX_BSTRC("DCT"),
+};
+static CFX_ByteStringC _PDF_FindFullName(const _FX_BSTR* table, int count, FX_BSTR abbr)
+{
+ int i = 0;
+ while (i < count) {
+ if (abbr.GetLength() == table[i + 1].m_Size && FXSYS_memcmp32(abbr.GetPtr(), table[i + 1].m_Ptr, abbr.GetLength()) == 0) {
+ return CFX_ByteStringC(table[i].m_Ptr, table[i].m_Size);
+ }
+ i += 2;
+ }
+ return CFX_ByteStringC();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj)
+{
+ switch (pObj->GetType()) {
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value = pDict->GetNextElement(pos, key);
+ CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineKeyAbbr,
+ sizeof _PDF_InlineKeyAbbr / sizeof(_FX_BSTR), key);
+ if (!fullname.IsEmpty()) {
+ pDict->ReplaceKey(key, fullname);
+ key = fullname;
+ }
+ if (value->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = value->GetString();
+ fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!fullname.IsEmpty()) {
+ pDict->SetAtName(key, fullname);
+ }
+ } else {
+ _PDF_ReplaceAbbr(value);
+ }
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElement(i);
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pElement->GetString();
+ CFX_ByteStringC fullname = _PDF_FindFullName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!fullname.IsEmpty()) {
+ pArray->SetAt(i, CPDF_Name::Create(fullname));
+ }
+ } else {
+ _PDF_ReplaceAbbr(pElement);
+ }
+ }
+ break;
+ }
+ }
+}
+static CFX_ByteStringC _PDF_FindAbbrName(const _FX_BSTR* table, int count, FX_BSTR fullName)
+{
+ int i = 0;
+ while (i < count) {
+ if (fullName.GetLength() == table[i].m_Size && FXSYS_memcmp32(fullName.GetPtr(), table[i].m_Ptr, fullName.GetLength()) == 0) {
+ return CFX_ByteStringC(table[i + 1].m_Ptr, table[i + 1].m_Size);
+ }
+ i += 2;
+ }
+ return CFX_ByteStringC();
+}
+void _PDF_ReplaceFull(CPDF_Object* pObj)
+{
+ switch (pObj->GetType()) {
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value = pDict->GetNextElement(pos, key);
+ CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineKeyAbbr,
+ sizeof(_PDF_InlineKeyAbbr) / sizeof(_FX_BSTR), key);
+ if (!abbrName.IsEmpty()) {
+ pDict->ReplaceKey(key, abbrName);
+ key = abbrName;
+ }
+ if (value->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = value->GetString();
+ abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
+ sizeof(_PDF_InlineValueAbbr) / sizeof(_FX_BSTR), name);
+ if (!abbrName.IsEmpty()) {
+ pDict->SetAtName(key, abbrName);
+ }
+ } else {
+ _PDF_ReplaceFull(value);
+ }
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElement(i);
+ if (pElement->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pElement->GetString();
+ CFX_ByteStringC abbrName = _PDF_FindAbbrName(_PDF_InlineValueAbbr,
+ sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
+ if (!abbrName.IsEmpty()) {
+ pArray->SetAt(i, CPDF_Name::Create(abbrName));
+ }
+ } else {
+ _PDF_ReplaceFull(pElement);
+ }
+ }
+ break;
+ }
+ }
+}
+void CPDF_StreamContentParser::Handle_BeginText()
+{
+ m_pCurStates->m_TextMatrix.Set(1.0f, 0, 0, 1.0f, 0, 0);
+ OnChangeTextMatrix();
+ m_pCurStates->m_TextX = 0;
+ m_pCurStates->m_TextY = 0;
+ m_pCurStates->m_TextLineX = 0;
+ m_pCurStates->m_TextLineY = 0;
+}
+void CPDF_StreamContentParser::Handle_BeginSectionUndefined()
+{
+ m_CompatCount ++;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_123()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(5), GetNumber(4), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_ConcatMatrix()
+{
+ FX_FLOAT a2 = GetNumber16(5), b2 = GetNumber16(4), c2 = GetNumber16(3), d2 = GetNumber16(2);
+ FX_FLOAT e2 = GetNumber(1), f2 = GetNumber(0);
+ FX_FLOAT old_width_scale = m_pCurStates->m_CTM.GetXUnit();
+ CFX_AffineMatrix new_matrix(a2, b2, c2, d2, e2, f2);
+ new_matrix.Concat(m_pCurStates->m_CTM);
+ m_pCurStates->m_CTM = new_matrix;
+ FX_FLOAT new_width_scale = m_pCurStates->m_CTM.GetXUnit();
+ OnChangeTextMatrix();
+}
+void CPDF_StreamContentParser::Handle_SetColorSpace_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CFX_ByteString csname = GetString(0);
+ CPDF_ColorSpace* pCS = FindColorSpace(csname);
+ if (pCS == NULL) {
+ return;
+ }
+ m_pCurStates->m_ColorState.GetModify()->m_FillColor.SetColorSpace(pCS);
+}
+void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CFX_ByteString csname = GetString(0);
+ CPDF_ColorSpace* pCS = FindColorSpace(csname);
+ if (pCS == NULL) {
+ return;
+ }
+ m_pCurStates->m_ColorState.GetModify()->m_StrokeColor.SetColorSpace(pCS);
+}
+void CPDF_StreamContentParser::Handle_SetDash()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Array* pArray = GetObject(1)->GetArray();
+ if (pArray == NULL) {
+ return;
+ }
+ m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f);
+}
+void CPDF_StreamContentParser::Handle_SetCharWidth()
+{
+ m_Type3Data[0] = GetNumber(1);
+ m_Type3Data[1] = GetNumber(0);
+ m_bColored = TRUE;
+}
+void CPDF_StreamContentParser::Handle_SetCachedDevice()
+{
+ for (int i = 0; i < 6; i ++) {
+ m_Type3Data[i] = GetNumber(5 - i);
+ }
+ m_bColored = FALSE;
+}
+void CPDF_StreamContentParser::Handle_ExecuteXObject()
+{
+ CFX_ByteString name = GetString(0);
+ if (name == m_LastImageName && m_pLastImage && m_pLastImage->GetStream() && m_pLastImage->GetStream()->GetObjNum()) {
+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
+ AddDuplicateImage();
+#else
+ AddImage(NULL, m_pLastImage, FALSE);
+#endif
+ return;
+ }
+ if (m_Options.m_bTextOnly) {
+ CPDF_Object* pRes = NULL;
+ if (m_pResources == NULL) {
+ return;
+ }
+ if (m_pResources == m_pPageResources) {
+ CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ return;
+ }
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ } else {
+ CPDF_Dictionary* pList = m_pResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ if (m_pPageResources == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pList = m_pPageResources->GetDict(FX_BSTRC("XObject"));
+ if (pList == NULL) {
+ return;
+ }
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ } else {
+ pRes = pList->GetElement(name);
+ if (pRes == NULL || pRes->GetType() != PDFOBJ_REFERENCE) {
+ return;
+ }
+ }
+ }
+ FX_BOOL bForm;
+ if (m_pDocument->IsFormStream(((CPDF_Reference*)pRes)->GetRefObjNum(), bForm) && !bForm) {
+ return;
+ }
+ }
+ CPDF_Stream* pXObject = (CPDF_Stream*)FindResourceObj(FX_BSTRC("XObject"), name);
+ if (pXObject == NULL || pXObject->GetType() != PDFOBJ_STREAM) {
+ m_bResourceMissing = TRUE;
+ return;
+ }
+ CFX_ByteStringC type = pXObject->GetDict()->GetConstString(FX_BSTRC("Subtype"));
+ if (type == FX_BSTRC("Image")) {
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_ImageObject* pObj = AddImage(pXObject, NULL, FALSE);
+ m_LastImageName = name;
+ m_pLastImage = pObj->m_pImage;
+ } else if (type == FX_BSTRC("Form")) {
+ AddForm(pXObject);
+ } else {
+ return;
+ }
+}
+void CPDF_StreamContentParser::AddForm(CPDF_Stream* pStream)
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (!m_Options.m_bSeparateForm) {
+ CPDF_Dictionary* pResources = pStream->GetDict()->GetDict(FX_BSTRC("Resources"));
+ CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix(FX_BSTRC("Matrix"));
+ form_matrix.Concat(m_pCurStates->m_CTM);
+ CPDF_Array* pBBox = pStream->GetDict()->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pStream->GetDict()->GetRect(FX_BSTRC("BBox"));
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ form_bbox.Transform(&form_matrix);
+ }
+ CPDF_StreamContentParser parser;
+ parser.Initialize();
+ parser.PrepareParse(m_pDocument, m_pPageResources, m_pResources, &m_mtContentToUser,
+ m_pObjectList, pResources, &form_bbox, &m_Options, m_pCurStates, m_Level + 1);
+ parser.m_pCurStates->m_CTM = form_matrix;
+ if (ClipPath.NotNull()) {
+ parser.m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ CPDF_StreamAcc stream;
+ stream.LoadAllData(pStream, FALSE);
+ if (stream.GetSize() == 0) {
+ return;
+ }
+#ifdef _FPDFAPI_MINI_
+ parser.InputData(stream.GetData(), stream.GetSize());
+ parser.Finish();
+#else
+ parser.Parse(stream.GetData(), stream.GetSize(), 0);
+#endif
+ return;
+ }
+#endif
+ CPDF_FormObject* pFormObj = FX_NEW CPDF_FormObject;
+ pFormObj->m_pForm = FX_NEW CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources);
+ pFormObj->m_FormMatrix = m_pCurStates->m_CTM;
+ pFormObj->m_FormMatrix.Concat(m_mtContentToUser);
+ CPDF_AllStates status;
+ status.m_GeneralState = m_pCurStates->m_GeneralState;
+ status.m_GraphState = m_pCurStates->m_GraphState;
+ status.m_ColorState = m_pCurStates->m_ColorState;
+ status.m_TextState = m_pCurStates->m_TextState;
+ pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1);
+ if (!m_pObjectList->m_bBackgroundAlphaNeeded && pFormObj->m_pForm->m_bBackgroundAlphaNeeded) {
+ m_pObjectList->m_bBackgroundAlphaNeeded = TRUE;
+ }
+ pFormObj->CalcBoundingBox();
+ SetGraphicStates(pFormObj, TRUE, TRUE, TRUE);
+ m_pObjectList->m_ObjectList.AddTail(pFormObj);
+}
+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
+void CPDF_StreamContentParser::AddDuplicateImage()
+{
+ FX_POSITION tailpos = m_pObjectList->m_ObjectList.GetTailPosition();
+ CPDF_PageObject* pLastObj = (CPDF_PageObject*)m_pObjectList->m_ObjectList.GetAt(tailpos);
+ if (pLastObj == NULL || (pLastObj->m_Type != PDFPAGE_INLINES && pLastObj->m_Type != PDFPAGE_IMAGE)) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ if (pLastObj->m_GeneralState != m_pCurStates->m_GeneralState ||
+ pLastObj->m_ClipPath != m_pCurStates->m_ClipPath ||
+ pLastObj->m_ColorState != m_pCurStates->m_ColorState) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ if (pLastObj->m_Type == PDFPAGE_INLINES) {
+ CPDF_InlineImages* pInlines = (CPDF_InlineImages*)pLastObj;
+ if (pInlines->m_pStream != m_pLastImage->GetStream()) {
+ AddImage(NULL, m_pLastImage, FALSE);
+ return;
+ }
+ pInlines->AddMatrix(ImageMatrix);
+ } else {
+ CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pLastObj;
+ CPDF_InlineImages* pInlines = FX_NEW CPDF_InlineImages;
+ pInlines->m_pStream = m_pLastImage->GetStream();
+ SetGraphicStates(pInlines, !pInlines->m_pStream->GetDict()->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
+ pInlines->AddMatrix(pImageObj->m_Matrix);
+ pInlines->AddMatrix(ImageMatrix);
+ m_pObjectList->m_ObjectList.RemoveAt(tailpos);
+ m_pObjectList->m_ObjectList.AddTail(pInlines);
+ pLastObj->Release();
+ }
+}
+#endif
+CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline)
+{
+ if (pStream == NULL && pImage == NULL) {
+ return NULL;
+ }
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ if (pImage) {
+ pImageObj->m_pImage = m_pDocument->GetPageData()->GetImage(pImage->GetStream());
+ } else if (pStream->GetObjNum()) {
+ pImageObj->m_pImage = m_pDocument->LoadImageF(pStream);
+ } else {
+ pImageObj->m_pImage = FX_NEW CPDF_Image(m_pDocument);
+ pImageObj->m_pImage->LoadImageF(pStream, bInline);
+ }
+ SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE);
+ pImageObj->m_Matrix = ImageMatrix;
+ pImageObj->CalcBoundingBox();
+ m_pObjectList->m_ObjectList.AddTail(pImageObj);
+ return pImageObj;
+}
+void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary()
+{
+}
+void CPDF_StreamContentParser::Handle_EndImage()
+{
+}
+void CPDF_StreamContentParser::Handle_EndMarkedContent()
+{
+ if (!m_Options.m_bMarkedContent) {
+ return;
+ }
+ if (m_CurContentMark.IsNull()) {
+ return;
+ }
+ int count = m_CurContentMark.GetObject()->CountItems();
+ if (count == 1) {
+ m_CurContentMark.SetNull();
+ return;
+ }
+ m_CurContentMark.GetModify()->DeleteLastMark();
+}
+void CPDF_StreamContentParser::Handle_EndText()
+{
+ int count = m_ClipTextList.GetSize();
+ if (count == 0) {
+ return;
+ }
+ if (m_pCurStates->m_TextState.GetObject()->m_TextMode < 4) {
+ for (int i = 0; i < count; i ++) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)m_ClipTextList.GetAt(i);
+ if (pText) {
+ delete pText;
+ }
+ }
+ } else {
+ m_pCurStates->m_ClipPath.AppendTexts((CPDF_TextObject**)m_ClipTextList.GetData(), count);
+ }
+ m_ClipTextList.RemoveAll();
+}
+void CPDF_StreamContentParser::Handle_EndSectionUndefined()
+{
+ if (m_CompatCount) {
+ m_CompatCount --;
+ }
+}
+void CPDF_StreamContentParser::Handle_FillPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, FALSE);
+}
+void CPDF_StreamContentParser::Handle_FillPathOld()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_WINDING, FALSE);
+}
+void CPDF_StreamContentParser::Handle_EOFillPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(FXFILL_ALTERNATE, FALSE);
+}
+void CPDF_StreamContentParser::Handle_SetGray_Fill()
+{
+ FX_FLOAT value = GetNumber(0);
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
+}
+void CPDF_StreamContentParser::Handle_SetGray_Stroke()
+{
+ FX_FLOAT value = GetNumber(0);
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
+}
+void CPDF_StreamContentParser::Handle_SetExtendGraphState()
+{
+ CFX_ByteString name = GetString(0);
+ CPDF_Dictionary* pGS = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("ExtGState"), name);
+ if (pGS == NULL || pGS->GetType() != PDFOBJ_DICTIONARY) {
+ m_bResourceMissing = TRUE;
+ return;
+ }
+ m_pCurStates->ProcessExtGS(pGS, this);
+}
+void CPDF_StreamContentParser::Handle_ClosePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ if (m_PathPointCount == 0) {
+ return;
+ }
+ if (m_PathStartX != m_PathCurrentX || m_PathStartY != m_PathCurrentY) {
+ AddPathPoint(m_PathStartX, m_PathStartY, FXPT_LINETO | FXPT_CLOSEFIGURE);
+ } else if (m_pPathPoints[m_PathPointCount - 1].m_Flag != FXPT_MOVETO) {
+ m_pPathPoints[m_PathPointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+}
+void CPDF_StreamContentParser::Handle_SetFlat()
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ m_pCurStates->m_GeneralState.GetModify()->m_Flatness = GetNumber(0);
+#endif
+}
+void CPDF_StreamContentParser::Handle_BeginImageData()
+{
+}
+void CPDF_StreamContentParser::Handle_SetLineJoin()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_LineJoin = (CFX_GraphStateData::LineJoin)GetInteger(0);
+}
+void CPDF_StreamContentParser::Handle_SetLineCap()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_LineCap = (CFX_GraphStateData::LineCap)GetInteger(0);
+}
+void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill()
+{
+ REQUIRE_PARAMS(4);
+ FX_FLOAT values[4];
+ for (int i = 0; i < 4; i ++) {
+ values[i] = GetNumber(3 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
+}
+void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke()
+{
+ REQUIRE_PARAMS(4);
+ FX_FLOAT values[4];
+ for (int i = 0; i < 4; i ++) {
+ values[i] = GetNumber(3 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
+}
+void CPDF_StreamContentParser::Handle_LineTo()
+{
+ REQUIRE_PARAMS(2);
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO);
+}
+void CPDF_StreamContentParser::Handle_MoveTo()
+{
+ REQUIRE_PARAMS(2);
+ if (m_Options.m_bTextOnly) {
+#ifndef _FPDFAPI_MINI_
+ m_pSyntax->SkipPathObject();
+#endif
+ return;
+ }
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_MOVETO);
+#ifndef _FPDFAPI_MINI_
+ ParsePathObject();
+#endif
+}
+void CPDF_StreamContentParser::Handle_SetMiterLimit()
+{
+ m_pCurStates->m_GraphState.GetModify()->m_MiterLimit = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_MarkPlace()
+{
+}
+void CPDF_StreamContentParser::Handle_EndPath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(0, FALSE);
+}
+void CPDF_StreamContentParser::Handle_SaveGraphState()
+{
+ CPDF_AllStates* pStates = FX_NEW CPDF_AllStates;
+ pStates->Copy(*m_pCurStates);
+ m_StateStack.Add(pStates);
+}
+void CPDF_StreamContentParser::Handle_RestoreGraphState()
+{
+ int size = m_StateStack.GetSize();
+ if (size == 0) {
+ return;
+ }
+ CPDF_AllStates* pStates = (CPDF_AllStates*)m_StateStack.GetAt(size - 1);
+ m_pCurStates->Copy(*pStates);
+ delete pStates;
+ m_StateStack.RemoveAt(size - 1);
+}
+void CPDF_StreamContentParser::Handle_Rectangle()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT x = GetNumber(3), y = GetNumber(2);
+ FX_FLOAT w = GetNumber(1), h = GetNumber(0);
+ AddPathRect(x, y, w, h);
+}
+void CPDF_StreamContentParser::AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h)
+{
+ AddPathPoint(x, y, FXPT_MOVETO);
+ AddPathPoint(x + w, y, FXPT_LINETO);
+ AddPathPoint(x + w, y + h, FXPT_LINETO);
+ AddPathPoint(x, y + h, FXPT_LINETO);
+ AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE);
+}
+void CPDF_StreamContentParser::Handle_SetRGBColor_Fill()
+{
+ REQUIRE_PARAMS(3);
+ FX_FLOAT values[3];
+ for (int i = 0; i < 3; i ++) {
+ values[i] = GetNumber(2 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
+}
+void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke()
+{
+ REQUIRE_PARAMS(3);
+ FX_FLOAT values[3];
+ for (int i = 0; i < 3; i ++) {
+ values[i] = GetNumber(2 - i);
+ }
+ CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
+}
+void CPDF_StreamContentParser::Handle_SetRenderIntent()
+{
+}
+void CPDF_StreamContentParser::Handle_CloseStrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ Handle_ClosePath();
+ AddPathObject(0, TRUE);
+}
+void CPDF_StreamContentParser::Handle_StrokePath()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathObject(0, TRUE);
+}
+void CPDF_StreamContentParser::Handle_SetColor_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT values[4];
+ int nargs = m_ParamCount;
+ if (nargs > 4) {
+ nargs = 4;
+ }
+ for (int i = 0; i < nargs; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ m_pCurStates->m_ColorState.SetFillColor(NULL, values, nargs);
+}
+void CPDF_StreamContentParser::Handle_SetColor_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ FX_FLOAT values[4];
+ int nargs = m_ParamCount;
+ if (nargs > 4) {
+ nargs = 4;
+ }
+ for (int i = 0; i < nargs; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nargs);
+}
+void CPDF_StreamContentParser::Handle_SetColorPS_Fill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Object* pLastParam = GetObject(0);
+ if (pLastParam == NULL) {
+ return;
+ }
+ int nargs = m_ParamCount;
+ int nvalues = nargs;
+ if (pLastParam->GetType() == PDFOBJ_NAME) {
+ nvalues --;
+ }
+ FX_FLOAT* values = NULL;
+ if (nvalues) {
+ values = FX_Alloc(FX_FLOAT, nvalues);
+ for (int i = 0; i < nvalues; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ }
+ if (nvalues != nargs) {
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
+ if (pPattern) {
+ m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues);
+ }
+ } else {
+ m_pCurStates->m_ColorState.SetFillColor(NULL, values, nvalues);
+ }
+ if (values) {
+ FX_Free(values);
+ }
+}
+void CPDF_StreamContentParser::Handle_SetColorPS_Stroke()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Object* pLastParam = GetObject(0);
+ if (pLastParam == NULL) {
+ return;
+ }
+ int nargs = m_ParamCount;
+ int nvalues = nargs;
+ if (pLastParam->GetType() == PDFOBJ_NAME) {
+ nvalues --;
+ }
+ FX_FLOAT* values = NULL;
+ if (nvalues) {
+ values = FX_Alloc(FX_FLOAT, nvalues);
+ for (int i = 0; i < nvalues; i ++) {
+ values[i] = GetNumber(nargs - i - 1);
+ }
+ }
+ if (nvalues != nargs) {
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), FALSE);
+ if (pPattern) {
+ m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues);
+ }
+ } else {
+ m_pCurStates->m_ColorState.SetStrokeColor(NULL, values, nvalues);
+ }
+ if (values) {
+ FX_Free(values);
+ }
+}
+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
+ CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS);
+void CPDF_StreamContentParser::Handle_ShadeFill()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ CPDF_Pattern* pPattern = FindPattern(GetString(0), TRUE);
+ if (pPattern == NULL) {
+ return;
+ }
+ if (pPattern->m_PatternType != PATTERN_SHADING) {
+ return;
+ }
+ CPDF_ShadingPattern* pShading = (CPDF_ShadingPattern*)pPattern;
+ if (!pShading->m_bShadingObj) {
+ return;
+ }
+ if (!pShading->Load()) {
+ return;
+ }
+ CPDF_ShadingObject* pObj = FX_NEW CPDF_ShadingObject;
+ pObj->m_pShading = pShading;
+ SetGraphicStates(pObj, FALSE, FALSE, FALSE);
+ pObj->m_Matrix = m_pCurStates->m_CTM;
+ pObj->m_Matrix.Concat(m_mtContentToUser);
+ CFX_FloatRect bbox;
+ if (!pObj->m_ClipPath.IsNull()) {
+ bbox = pObj->m_ClipPath.GetClipBox();
+ } else {
+ bbox = m_BBox;
+ }
+ if (pShading->m_ShadingType >= 4) {
+ bbox.Intersect(_GetShadingBBox((CPDF_Stream*)pShading->m_pShadingObj, pShading->m_ShadingType, &pObj->m_Matrix,
+ pShading->m_pFunctions, pShading->m_nFuncs, pShading->m_pCS));
+ }
+ pObj->m_Left = bbox.left;
+ pObj->m_Right = bbox.right;
+ pObj->m_Top = bbox.top;
+ pObj->m_Bottom = bbox.bottom;
+ m_pObjectList->m_ObjectList.AddTail(pObj);
+}
+void CPDF_StreamContentParser::Handle_SetCharSpace()
+{
+ m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_MoveTextPoint()
+{
+ m_pCurStates->m_TextLineX += GetNumber(1);
+ m_pCurStates->m_TextLineY += GetNumber(0);
+ m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
+ m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
+}
+void CPDF_StreamContentParser::Handle_MoveTextPoint_SetLeading()
+{
+ Handle_MoveTextPoint();
+ m_pCurStates->m_TextLeading = -GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetFont()
+{
+ FX_FLOAT fs = GetNumber(0);
+ if (fs == 0) {
+ fs = m_DefFontSize;
+ }
+ m_pCurStates->m_TextState.GetModify()->m_FontSize = fs;
+ CPDF_Font* pFont = FindFont(GetString(1));
+ if (pFont) {
+ m_pCurStates->m_TextState.SetFont(pFont);
+ }
+}
+CPDF_Object* CPDF_StreamContentParser::FindResourceObj(FX_BSTR type, const CFX_ByteString& name)
+{
+ if (m_pResources == NULL) {
+ return NULL;
+ }
+ if (m_pResources == m_pPageResources) {
+ CPDF_Dictionary* pList = m_pResources->GetDict(type);
+ if (pList == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+ }
+ CPDF_Dictionary* pList = m_pResources->GetDict(type);
+ if (pList == NULL) {
+ if (m_pPageResources == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pList = m_pPageResources->GetDict(type);
+ if (pList == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+ }
+ CPDF_Object* pRes = pList->GetElementValue(name);
+ return pRes;
+}
+CPDF_Font* CPDF_StreamContentParser::FindFont(const CFX_ByteString& name)
+{
+ CPDF_Dictionary* pFontDict = (CPDF_Dictionary*)FindResourceObj(FX_BSTRC("Font"), name);
+ if (pFontDict == NULL || pFontDict->GetType() != PDFOBJ_DICTIONARY) {
+ m_bResourceMissing = TRUE;
+ return CPDF_Font::GetStockFont(m_pDocument, FX_BSTRC("Helvetica"));
+ }
+ CPDF_Font* pFont = m_pDocument->LoadFont(pFontDict);
+ if (pFont && pFont->GetType3Font()) {
+ pFont->GetType3Font()->SetPageResources(m_pResources);
+ pFont->GetType3Font()->CheckType3FontMetrics();
+ }
+ return pFont;
+}
+CPDF_ColorSpace* CPDF_StreamContentParser::FindColorSpace(const CFX_ByteString& name)
+{
+ if (name == FX_BSTRC("Pattern")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_PATTERN);
+ }
+ if (name == FX_BSTRC("DeviceGray") || name == FX_BSTRC("DeviceCMYK") || name == FX_BSTRC("DeviceRGB")) {
+ CFX_ByteString defname = "Default";
+ defname += name.Mid(7);
+ CPDF_Object* pDefObj = FindResourceObj(FX_BSTRC("ColorSpace"), defname);
+ if (pDefObj == NULL) {
+ if (name == FX_BSTRC("DeviceGray")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
+ }
+ if (name == FX_BSTRC("DeviceRGB")) {
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
+ }
+ return CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ }
+ return m_pDocument->LoadColorSpace(pDefObj);
+ }
+ CPDF_Object* pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj == NULL) {
+ m_bResourceMissing = TRUE;
+ return NULL;
+ }
+ return m_pDocument->LoadColorSpace(pCSObj);
+}
+CPDF_Pattern* CPDF_StreamContentParser::FindPattern(const CFX_ByteString& name, FX_BOOL bShading)
+{
+ CPDF_Object* pPattern = FindResourceObj(bShading ? FX_BSTRC("Shading") : FX_BSTRC("Pattern"), name);
+ if (pPattern == NULL || (pPattern->GetType() != PDFOBJ_DICTIONARY &&
+ pPattern->GetType() != PDFOBJ_STREAM)) {
+ m_bResourceMissing = TRUE;
+ return NULL;
+ }
+ return m_pDocument->LoadPattern(pPattern, bShading, &m_pCurStates->m_ParentMatrix);
+}
+void CPDF_StreamContentParser::ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y)
+{
+ m_pCurStates->m_TextMatrix.Transform(x, y, x, y);
+ ConvertUserSpace(x, y);
+}
+void CPDF_StreamContentParser::ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y)
+{
+ m_pCurStates->m_CTM.Transform(x, y, x, y);
+ m_mtContentToUser.Transform(x, y, x, y);
+}
+void CPDF_StreamContentParser::AddTextObject(CFX_ByteString* pStrs, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int nsegs)
+{
+ CPDF_Font* pFont = m_pCurStates->m_TextState.GetFont();
+ if (pFont == NULL) {
+ return;
+ }
+ if (fInitKerning != 0) {
+ if (!pFont->IsVertWriting()) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ } else {
+ m_pCurStates->m_TextY -= FXSYS_Mul(fInitKerning, m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ }
+ }
+ if (nsegs == 0) {
+ return;
+ }
+ int textmode;
+ if (pFont->GetFontType() == PDFFONT_TYPE3) {
+ textmode = 0;
+ } else {
+ textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode;
+ }
+ CPDF_TextObject* pText = FX_NEW CPDF_TextObject;
+ m_pLastTextObject = pText;
+ SetGraphicStates(pText, TRUE, TRUE, TRUE);
+ if (textmode && textmode != 3 && textmode != 4 && textmode != 7) {
+ FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM;
+ pCTM[0] = m_pCurStates->m_CTM.a;
+ pCTM[1] = m_pCurStates->m_CTM.c;
+ pCTM[2] = m_pCurStates->m_CTM.b;
+ pCTM[3] = m_pCurStates->m_CTM.d;
+ }
+ pText->SetSegments(pStrs, pKerning, nsegs);
+ pText->m_PosX = m_pCurStates->m_TextX;
+ pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise;
+ ConvertTextSpace(pText->m_PosX, pText->m_PosY);
+ FX_FLOAT x_advance, y_advance;
+ pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, m_Level);
+ m_pCurStates->m_TextX += x_advance;
+ m_pCurStates->m_TextY += y_advance;
+ if (textmode > 3) {
+ CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
+ pCopy->Copy(pText);
+ m_ClipTextList.Add(pCopy);
+ }
+ m_pObjectList->m_ObjectList.AddTail(pText);
+ if (pKerning && pKerning[nsegs - 1] != 0) {
+ if (!pFont->IsVertWriting()) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ } else {
+ m_pCurStates->m_TextY -= FXSYS_Mul(pKerning[nsegs - 1], m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ }
+ }
+}
+void CPDF_StreamContentParser::Handle_ShowText()
+{
+ CFX_ByteString str = GetString(0);
+ if (str.IsEmpty()) {
+ return;
+ }
+ AddTextObject(&str, 0, NULL, 1);
+}
+void CPDF_StreamContentParser::Handle_ShowText_Positioning()
+{
+ CPDF_Array* pArray = GetObject(0)->GetArray();
+ if (pArray == NULL) {
+ return;
+ }
+ int n = pArray->GetCount(), nsegs = 0, i;
+ for (i = 0; i < n; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj->GetType() == PDFOBJ_STRING) {
+ nsegs ++;
+ }
+ }
+ if (nsegs == 0) {
+ for (i = 0; i < n; i ++) {
+ m_pCurStates->m_TextX -= FXSYS_Mul(pArray->GetNumber(i), m_pCurStates->m_TextState.GetFontSize()) / 1000;
+ };
+ return;
+ }
+ CFX_ByteString* pStrs;
+ FX_NEW_VECTOR(pStrs, CFX_ByteString, nsegs);
+ FX_FLOAT* pKerning = FX_Alloc(FX_FLOAT, nsegs);
+ int iSegment = 0;
+ FX_FLOAT fInitKerning = 0;
+ for (i = 0; i < n; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj->GetType() == PDFOBJ_STRING) {
+ CFX_ByteString str = pObj->GetString();
+ if (str.IsEmpty()) {
+ continue;
+ }
+ pStrs[iSegment] = str;
+ pKerning[iSegment ++] = 0;
+ } else {
+ if (iSegment == 0) {
+ fInitKerning += pObj->GetNumber();
+ } else {
+ pKerning[iSegment - 1] += pObj->GetNumber();
+ }
+ }
+ }
+ AddTextObject(pStrs, fInitKerning, pKerning, iSegment);
+ FX_DELETE_VECTOR(pStrs, CFX_ByteString, nsegs);
+ FX_Free(pKerning);
+}
+void CPDF_StreamContentParser::Handle_SetTextLeading()
+{
+ m_pCurStates->m_TextLeading = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetTextMatrix()
+{
+ m_pCurStates->m_TextMatrix.Set(GetNumber16(5), GetNumber16(4), GetNumber16(3),
+ GetNumber16(2), GetNumber(1), GetNumber(0));
+ OnChangeTextMatrix();
+ m_pCurStates->m_TextX = 0;
+ m_pCurStates->m_TextY = 0;
+ m_pCurStates->m_TextLineX = 0;
+ m_pCurStates->m_TextLineY = 0;
+}
+void CPDF_StreamContentParser::OnChangeTextMatrix()
+{
+ CFX_AffineMatrix text_matrix(m_pCurStates->m_TextHorzScale, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
+ text_matrix.Concat(m_pCurStates->m_TextMatrix);
+ text_matrix.Concat(m_pCurStates->m_CTM);
+ text_matrix.Concat(m_mtContentToUser);
+ FX_FLOAT* pTextMatrix = m_pCurStates->m_TextState.GetModify()->m_Matrix;
+ pTextMatrix[0] = text_matrix.a;
+ pTextMatrix[1] = text_matrix.c;
+ pTextMatrix[2] = text_matrix.b;
+ pTextMatrix[3] = text_matrix.d;
+}
+void CPDF_StreamContentParser::Handle_SetTextRenderMode()
+{
+ int mode = GetInteger(0);
+ if (mode < 0 || mode > 7) {
+ return;
+ }
+ m_pCurStates->m_TextState.GetModify()->m_TextMode = mode;
+}
+void CPDF_StreamContentParser::Handle_SetTextRise()
+{
+ m_pCurStates->m_TextRise = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetWordSpace()
+{
+ m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(0);
+}
+void CPDF_StreamContentParser::Handle_SetHorzScale()
+{
+ if (m_ParamCount != 1) {
+ return;
+ }
+ m_pCurStates->m_TextHorzScale = GetNumber(0) / 100;
+ OnChangeTextMatrix();
+}
+void CPDF_StreamContentParser::Handle_MoveToNextLine()
+{
+ m_pCurStates->m_TextLineY -= m_pCurStates->m_TextLeading;
+ m_pCurStates->m_TextX = m_pCurStates->m_TextLineX;
+ m_pCurStates->m_TextY = m_pCurStates->m_TextLineY;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_23()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_SetLineWidth()
+{
+ FX_FLOAT width = GetNumber(0);
+ m_pCurStates->m_GraphState.GetModify()->m_LineWidth = width;
+}
+void CPDF_StreamContentParser::Handle_Clip()
+{
+ m_PathClipType = FXFILL_WINDING;
+}
+void CPDF_StreamContentParser::Handle_EOClip()
+{
+ m_PathClipType = FXFILL_ALTERNATE;
+}
+void CPDF_StreamContentParser::Handle_CurveTo_13()
+{
+ if (m_Options.m_bTextOnly) {
+ return;
+ }
+ AddPathPoint(GetNumber(3), GetNumber(2), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+ AddPathPoint(GetNumber(1), GetNumber(0), FXPT_BEZIERTO);
+}
+void CPDF_StreamContentParser::Handle_NextLineShowText()
+{
+ Handle_MoveToNextLine();
+ Handle_ShowText();
+}
+void CPDF_StreamContentParser::Handle_NextLineShowText_Space()
+{
+ m_pCurStates->m_TextState.GetModify()->m_WordSpace = GetNumber(2);
+ m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(1);
+ Handle_NextLineShowText();
+}
+void CPDF_StreamContentParser::Handle_Invalid()
+{
+}
+void CPDF_StreamContentParser::AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag)
+{
+ m_PathCurrentX = x;
+ m_PathCurrentY = y;
+ if (flag == FXPT_MOVETO) {
+ m_PathStartX = x;
+ m_PathStartY = y;
+ if (m_PathPointCount && m_pPathPoints[m_PathPointCount - 1].m_Flag == FXPT_MOVETO) {
+ m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
+ m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
+ return;
+ }
+ } else if (m_PathPointCount == 0) {
+ return;
+ }
+ m_PathPointCount ++;
+ if (m_PathPointCount > m_PathAllocSize) {
+ int newsize = m_PathPointCount + 256;
+ FX_PATHPOINT* pNewPoints = FX_Alloc(FX_PATHPOINT, newsize);
+ if (m_PathAllocSize) {
+ FXSYS_memcpy32(pNewPoints, m_pPathPoints, m_PathAllocSize * sizeof(FX_PATHPOINT));
+ FX_Free(m_pPathPoints);
+ }
+ m_pPathPoints = pNewPoints;
+ m_PathAllocSize = newsize;
+ }
+ m_pPathPoints[m_PathPointCount - 1].m_Flag = flag;
+ m_pPathPoints[m_PathPointCount - 1].m_PointX = x;
+ m_pPathPoints[m_PathPointCount - 1].m_PointY = y;
+}
+void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke)
+{
+ int PathPointCount = m_PathPointCount, PathClipType = m_PathClipType;
+ m_PathPointCount = 0;
+ m_PathClipType = 0;
+ if (PathPointCount <= 1) {
+ if (PathPointCount && PathClipType) {
+ CPDF_Path path;
+ path.New()->AppendRect(0, 0, 0, 0);
+ m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
+ }
+ return;
+ }
+ if (PathPointCount && m_pPathPoints[PathPointCount - 1].m_Flag == FXPT_MOVETO) {
+ PathPointCount --;
+ }
+ CPDF_Path Path;
+ CFX_PathData* pPathData = Path.New();
+ pPathData->SetPointCount(PathPointCount);
+ FXSYS_memcpy32(pPathData->GetPoints(), m_pPathPoints, sizeof(FX_PATHPOINT) * PathPointCount);
+ CFX_AffineMatrix matrix = m_pCurStates->m_CTM;
+ matrix.Concat(m_mtContentToUser);
+ if (bStroke || FillType) {
+ CPDF_PathObject* pPathObj = FX_NEW CPDF_PathObject;
+ pPathObj->m_bStroke = bStroke;
+ pPathObj->m_FillType = FillType;
+ pPathObj->m_Path = Path;
+ pPathObj->m_Matrix = matrix;
+ SetGraphicStates(pPathObj, TRUE, FALSE, TRUE);
+ pPathObj->CalcBoundingBox();
+ m_pObjectList->m_ObjectList.AddTail(pPathObj);
+ }
+ if (PathClipType) {
+ if (!matrix.IsIdentity()) {
+ Path.Transform(&matrix);
+ matrix.SetIdentity();
+ }
+ m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE);
+ }
+}
+CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf)
+{
+ CFX_ByteTextBuf buf;
+ FX_BOOL bFirst = TRUE;
+ int code = 0;
+ FX_LPCBYTE str = src_buf.GetBuffer();
+ FX_DWORD size = src_buf.GetSize();
+ for (FX_DWORD i = 0; i < size; i ++) {
+ FX_BYTE ch = str[i];
+ if (ch >= '0' && ch <= '9') {
+ if (bFirst) {
+ code = (ch - '0') * 16;
+ } else {
+ code += ch - '0';
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'A' && ch <= 'F') {
+ if (bFirst) {
+ code = (ch - 'A' + 10) * 16;
+ } else {
+ code += ch - 'A' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'a' && ch <= 'f') {
+ if (bFirst) {
+ code = (ch - 'a' + 10) * 16;
+ } else {
+ code += ch - 'a' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ }
+ }
+ if (!bFirst) {
+ buf.AppendChar((char)code);
+ }
+ return buf.GetByteString();
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
new file mode 100644
index 0000000000..2eeb1feff5
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp
@@ -0,0 +1,822 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+#if defined(_FPDFAPI_MINI_)
+extern const FX_LPCSTR _PDF_CharType;
+void CPDF_StreamContentParser::InputData(FX_LPCBYTE src_buf, FX_DWORD src_size)
+{
+ if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
+ return;
+ }
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ int ch = src_buf[i];
+ int type = _PDF_CharType[ch];
+start:
+ switch (m_WordState) {
+ case 0:
+ if (type == 'W') {
+ } else if (type == 'N') {
+ m_WordState = 5;
+ m_pWordBuf[0] = ch;
+ m_WordSize = 1;
+ } else if (type == 'R') {
+ m_WordState = 4;
+ m_pWordBuf[0] = ch;
+ m_WordSize = 1;
+ } else switch (ch) {
+ case '/':
+ m_WordState = 2;
+ m_WordSize = 0;
+ break;
+ case '[':
+ StartArray();
+ break;
+ case ']':
+ EndArray();
+ break;
+ case '(':
+ m_WordState = 7;
+ m_StringLevel = 1;
+ m_StringState = 0;
+ m_StringBuf.Clear();
+ break;
+ case '<':
+ m_WordState = 3;
+ break;
+ case '>':
+ m_WordState = 8;
+ break;
+ case '%':
+ m_WordState = 1;
+ break;
+ }
+ break;
+ case 1:
+ if (ch == '\n' || ch == '\r') {
+ m_WordState = 0;
+ }
+ break;
+ case 2:
+ if (type != 'R' && type != 'N') {
+ EndName();
+ m_WordState = 0;
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 3:
+ if (ch == '<') {
+ StartDict();
+ m_WordState = 0;
+ } else {
+ m_StringBuf.Clear();
+ m_WordState = 6;
+ goto start;
+ }
+ break;
+ case 4:
+ if (type != 'R' && type != 'N') {
+ m_WordState = 0;
+ EndKeyword();
+ if (m_bAbort) {
+ return;
+ }
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 5:
+ if (type != 'N') {
+ EndNumber();
+ m_WordState = 0;
+ goto start;
+ }
+ if (m_WordSize < 256) {
+ m_pWordBuf[m_WordSize++] = ch;
+ }
+ break;
+ case 6:
+ if (ch == '>') {
+ EndHexString();
+ m_WordState = 0;
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ break;
+ case 7:
+ switch (m_StringState) {
+ case 0:
+ if (ch == ')') {
+ m_StringLevel --;
+ if (m_StringLevel == 0) {
+ EndString();
+ m_WordState = 0;
+ break;
+ }
+ m_StringBuf.AppendByte(')');
+ } else if (ch == '(') {
+ m_StringLevel ++;
+ m_StringBuf.AppendByte('(');
+ } else if (ch == '\\') {
+ m_StringState = 1;
+ } else {
+ m_StringBuf.AppendByte((char)ch);
+ }
+ break;
+ case 1:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = ch - '0';
+ m_StringState = 2;
+ break;
+ }
+ if (ch == 'n') {
+ m_StringBuf.AppendByte('\n');
+ } else if (ch == 'r') {
+ m_StringBuf.AppendByte('\r');
+ } else if (ch == 't') {
+ m_StringBuf.AppendByte('\t');
+ } else if (ch == 'b') {
+ m_StringBuf.AppendByte('\b');
+ } else if (ch == 'f') {
+ m_StringBuf.AppendByte('\f');
+ } else if (ch == '\\') {
+ m_StringBuf.AppendByte('\\');
+ } else if (ch == '(') {
+ m_StringBuf.AppendByte('(');
+ } else if (ch == ')') {
+ m_StringBuf.AppendByte(')');
+ } else if (ch == '\r') {
+ m_StringState = 4;
+ break;
+ } else if (ch == '\n') {
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ m_StringState = 0;
+ break;
+ case 2:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = m_EscCode * 8 + ch - '0';
+ m_StringState = 3;
+ } else {
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ if (ch >= '0' && ch <= '7') {
+ m_EscCode = m_EscCode * 8 + ch - '0';
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ } else {
+ m_StringBuf.AppendByte(m_EscCode);
+ m_StringState = 0;
+ goto start;
+ }
+ break;
+ case 4:
+ m_StringState = 0;
+ if (ch != '\n') {
+ goto start;
+ }
+ break;
+ }
+ break;
+ case 8:
+ m_WordState = 0;
+ if (ch == '>') {
+ EndDict();
+ } else {
+ goto start;
+ }
+ break;
+ case 9:
+ switch (m_InlineImageState) {
+ case 0:
+ if (type == 'W' || type == 'D') {
+ m_InlineImageState = 1;
+ m_InlineWhiteChar = ch;
+ } else {
+ m_StringBuf.AppendByte(ch);
+ }
+ break;
+ case 1:
+ m_StringBuf.AppendByte(m_InlineWhiteChar);
+ if (ch == 'I') {
+ m_InlineImageState = 2;
+ } else {
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 2:
+ if (ch == 'D') {
+ m_InlineImageState = 3;
+ } else {
+ m_StringBuf.AppendByte('I');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ EndImageDict();
+ break;
+ }
+ break;
+ case 10:
+ switch (m_InlineImageState) {
+ case 0:
+ if (type == 'W') {
+ m_InlineImageState = 1;
+ m_InlineWhiteChar = ch;
+ } else {
+ m_ImageSrcBuf.AppendByte(ch);
+ }
+ break;
+ case 1:
+ if (ch == 'E') {
+ m_InlineImageState = 2;
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 2:
+ if (ch == 'I') {
+ m_InlineImageState = 3;
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_ImageSrcBuf.AppendByte('E');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ case 3:
+ if (type == 'W') {
+ EndInlineImage();
+ } else {
+ m_ImageSrcBuf.AppendByte(m_InlineWhiteChar);
+ m_ImageSrcBuf.AppendByte('E');
+ m_ImageSrcBuf.AppendByte('I');
+ m_InlineImageState = 0;
+ goto start;
+ }
+ break;
+ }
+ break;
+ case 11:
+ if (m_InlineImageState < m_ImageSrcBuf.GetSize()) {
+ m_ImageSrcBuf.GetBuffer()[m_InlineImageState ++] = ch;
+ } else {
+ if (ch == 'I') {
+ EndInlineImage();
+ }
+ }
+ break;
+ }
+ }
+}
+void CPDF_StreamContentParser::Finish()
+{
+ switch (m_WordState) {
+ case 0:
+ break;
+ case 1:
+ break;
+ case 2:
+ EndName();
+ break;
+ case 3:
+ break;
+ case 4:
+ EndKeyword();
+ break;
+ case 5:
+ EndNumber();
+ break;
+ case 6:
+ EndHexString();
+ break;
+ case 7:
+ EndString();
+ break;
+ case 8:
+ break;
+ case 9:
+ break;
+ case 10:
+ EndInlineImage();
+ break;
+ }
+ m_WordState = 0;
+}
+void CPDF_StreamContentParser::AddContainer(CPDF_Object* pObject)
+{
+ if (m_ObjectSize) {
+ m_pObjectState[m_ObjectSize] = SetToCurObj(pObject);
+ }
+ FXSYS_assert(m_ObjectSize < _FPDF_MAX_OBJECT_STACK_SIZE_);
+ m_pObjectStack[m_ObjectSize++] = pObject;
+}
+FX_BOOL CPDF_StreamContentParser::SetToCurObj(CPDF_Object* pObject)
+{
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pObject);
+ return TRUE;
+ }
+ FX_BOOL bInArrayOrDict = TRUE;
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pCurObj)->Add(pObject, m_pDocument);
+ } else {
+ if (!m_bDictName && m_pDictName[0]) {
+ ((CPDF_Dictionary*)pCurObj)->SetAt((FX_LPCSTR)m_pDictName, pObject, m_pDocument);
+ } else {
+ bInArrayOrDict = FALSE;
+ }
+ m_bDictName = TRUE;
+ }
+ return bInArrayOrDict;
+}
+void CPDF_StreamContentParser::StartArray()
+{
+ if (m_ObjectSize)
+ if (m_pObjectStack[0]->GetType() != PDFOBJ_DICTIONARY && m_pObjectStack[m_ObjectSize - 1]->GetType() == PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ AddContainer(pArray);
+}
+void CPDF_StreamContentParser::EndArray()
+{
+ if (m_ObjectSize == 0) {
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ m_ObjectSize --;
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pCurObj);
+ } else {
+ if (!m_pObjectState[m_ObjectSize]) {
+ pCurObj->Release();
+ }
+ }
+ m_pObjectState[m_ObjectSize] = FALSE;
+}
+void CPDF_StreamContentParser::StartDict()
+{
+ CPDF_Dictionary* pDict = FX_NEW CPDF_Dictionary;
+ AddContainer(pDict);
+ m_bDictName = TRUE;
+}
+void CPDF_StreamContentParser::EndDict()
+{
+ if (m_ObjectSize == 0) {
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ m_ObjectSize --;
+ if (m_ObjectSize == 0) {
+ AddObjectParam(pCurObj);
+ } else {
+ if (!m_pObjectState[m_ObjectSize]) {
+ pCurObj->Release();
+ }
+ }
+ m_pObjectState[m_ObjectSize] = FALSE;
+}
+void CPDF_StreamContentParser::EndName()
+{
+ if (m_ObjectSize == 0) {
+ AddNameParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
+ return;
+ }
+ CPDF_Object* pCurObj = m_pObjectStack[m_ObjectSize - 1];
+ if (pCurObj->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pCurObj)->AddName(CFX_ByteString(m_pWordBuf, m_WordSize));
+ } else {
+ if (m_bDictName) {
+ FXSYS_memcpy32(m_pDictName, m_pWordBuf, m_WordSize);
+ m_pDictName[m_WordSize] = 0;
+ } else {
+ if (m_pDictName[0] != 0) {
+ ((CPDF_Dictionary*)pCurObj)->SetAtName((FX_LPCSTR)m_pDictName, CFX_ByteString(m_pWordBuf, m_WordSize));
+ }
+ }
+ m_bDictName = !m_bDictName;
+ }
+}
+void CPDF_StreamContentParser::EndNumber()
+{
+ if (m_ObjectSize == 0) {
+ AddNumberParam((FX_LPCSTR)m_pWordBuf, m_WordSize);
+ return;
+ }
+ CPDF_Number *pObj = FX_NEW CPDF_Number(CFX_ByteStringC(m_pWordBuf, m_WordSize));
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+extern CFX_ByteString _FPDF_ByteStringFromHex(CFX_BinaryBuf& src_buf);
+void CPDF_StreamContentParser::EndHexString()
+{
+ CPDF_String *pObj = FX_NEW CPDF_String(_FPDF_ByteStringFromHex(m_StringBuf), TRUE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+void CPDF_StreamContentParser::EndString()
+{
+ CPDF_String *pObj = FX_NEW CPDF_String(m_StringBuf.GetByteString());
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+}
+void CPDF_StreamContentParser::Handle_BeginImage(void)
+{
+ m_WordState = 9;
+ m_InlineImageState = 0;
+ m_StringBuf.Clear();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj);
+void CPDF_StreamContentParser::EndImageDict()
+{
+ if (m_StringBuf.GetSize() != m_LastImageDict.GetSize() ||
+ FXSYS_memcmp32(m_StringBuf.GetBuffer(), m_LastImageDict.GetBuffer(), m_StringBuf.GetSize())) {
+ m_WordState = 0;
+ StartDict();
+ InputData(m_StringBuf.GetBuffer(), m_StringBuf.GetSize());
+ Finish();
+ m_bSameLastDict = FALSE;
+ if (m_pLastImageDict && m_bReleaseLastDict) {
+ m_pLastImageDict->Release();
+ m_pLastImageDict = NULL;
+ }
+ if (!m_ObjectSize) {
+ m_InlineImageState = 0;
+ return;
+ }
+ m_pLastImageDict = (CPDF_Dictionary*)m_pObjectStack[--m_ObjectSize];
+ m_bReleaseLastDict = !m_pObjectState[m_ObjectSize];
+ m_pObjectState[m_ObjectSize] = FALSE;
+ _PDF_ReplaceAbbr(m_pLastImageDict);
+ m_LastImageDict.TakeOver(m_StringBuf);
+ if (m_pLastImageDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ CPDF_Object* pCSObj = m_pLastImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetString();
+ if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
+ pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj) {
+ if (!pCSObj->GetObjNum()) {
+ pCSObj = pCSObj->Clone();
+ }
+ m_pLastImageDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
+ }
+ }
+ }
+ }
+ } else {
+ m_bSameLastDict = TRUE;
+ }
+ m_ImageSrcBuf.Clear();
+ if (m_pLastCloneImageDict) {
+ m_pLastCloneImageDict->Release();
+ }
+ m_pLastCloneImageDict = (CPDF_Dictionary*)m_pLastImageDict->Clone();
+ if (m_pLastCloneImageDict->KeyExist(FX_BSTRC("Filter"))) {
+ m_WordState = 10;
+ m_InlineImageState = 0;
+ } else {
+ int width = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Width"));
+ int height = m_pLastCloneImageDict->GetInteger(FX_BSTRC("Height"));
+ int OrigSize = 0;
+ CPDF_Object* pCSObj = m_pLastCloneImageDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj != NULL) {
+ int bpc = m_pLastCloneImageDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ int nComponents = 1;
+ CPDF_ColorSpace* pCS = m_pDocument->LoadColorSpace(pCSObj);
+ if (pCS == NULL) {
+ nComponents = 3;
+ } else {
+ nComponents = pCS->CountComponents();
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ int pitch = (width * bpc * nComponents + 7) / 8;
+ OrigSize = pitch * height;
+ } else {
+ OrigSize = ((width + 7) / 8) * height;
+ }
+ m_ImageSrcBuf.AppendBlock(NULL, OrigSize);
+ m_WordState = 11;
+ m_InlineImageState = 0;
+ }
+}
+void CPDF_StreamContentParser::EndInlineImage()
+{
+ CFX_AffineMatrix ImageMatrix;
+ ImageMatrix.Copy(m_pCurStates->m_CTM);
+ ImageMatrix.Concat(m_mtContentToUser);
+ m_LastImageData.CopyData(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize());
+ CPDF_Stream* pStream = CPDF_Stream::Create(m_ImageSrcBuf.GetBuffer(), m_ImageSrcBuf.GetSize(),
+ m_pLastCloneImageDict);
+ m_ImageSrcBuf.DetachBuffer();
+ m_pLastCloneImageDict = NULL;
+ CPDF_InlineImages* pImages = FX_NEW CPDF_InlineImages;
+ pImages->m_pStream = pStream;
+ SetGraphicStates(pImages, !m_pLastCloneImageDict->KeyExist(FX_BSTRC("ColorSpace")), FALSE, FALSE);
+ pImages->AddMatrix(ImageMatrix);
+ m_pObjectList->m_ObjectList.AddTail(pImages);
+ m_WordState = 0;
+}
+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
+void CPDF_StreamContentParser::EndKeyword()
+{
+ CPDF_Object *pObj = NULL;
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_pWordBuf == FXDWORD_TRUE) {
+ pObj = CPDF_Boolean::Create(TRUE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ } else if (*(FX_DWORD*)m_pWordBuf == FXDWORD_NULL) {
+ pObj = CPDF_Null::Create();
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_pWordBuf == FXDWORD_FALS && m_pWordBuf[4] == 'e') {
+ pObj = CPDF_Boolean::Create(FALSE);
+ if (!SetToCurObj(pObj)) {
+ pObj->Release();
+ }
+ return;
+ }
+ }
+ m_pWordBuf[m_WordSize] = 0;
+ OnOperator((char*)m_pWordBuf);
+ ClearAllParams();
+}
+#define PAGEPARSE_STAGE_PARSE 2
+#define PAGEPARSE_STAGE_CHECKCLIP 3
+CPDF_ContentParser::CPDF_ContentParser()
+{
+ m_pParser = NULL;
+ m_Status = Ready;
+ m_pStreamFilter = NULL;
+ m_pType3Char = NULL;
+}
+CPDF_ContentParser::~CPDF_ContentParser()
+{
+ Clear();
+}
+void CPDF_ContentParser::Clear()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (m_pStreamFilter) {
+ delete m_pStreamFilter;
+ }
+ m_pParser = NULL;
+ m_Status = Ready;
+}
+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
+{
+ if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
+ m_Status = Done;
+ return;
+ }
+ m_pObjects = pPage;
+ m_bForm = FALSE;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent == NULL) {
+ m_Status = Done;
+ return;
+ }
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_nStreams = 1;
+ } else if (pContent->GetType() == PDFOBJ_ARRAY) {
+ m_nStreams = ((CPDF_Array*)pContent)->GetCount();
+ } else {
+ m_Status = Done;
+ return;
+ }
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pPage->m_pDocument, pPage->m_pResources, NULL, NULL, pPage,
+ pPage->m_pResources, &pPage->m_BBox, &m_Options, NULL, 0);
+ m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
+}
+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ m_pType3Char = pType3Char;
+ m_pObjects = pForm;
+ m_bForm = TRUE;
+ CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ if (pGraphicStates) {
+ form_matrix.Concat(pGraphicStates->m_CTM);
+ }
+ CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pBBox->GetRect();
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ if (pParentMatrix) {
+ ClipPath.Transform(pParentMatrix);
+ }
+ form_bbox.Transform(&form_matrix);
+ }
+ CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
+ pResources, &form_bbox, pOptions, pGraphicStates, level);
+ m_pParser->m_pCurStates->m_CTM = form_matrix;
+ if (ClipPath.NotNull()) {
+ m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ if (pForm->m_Transparency & PDFTRANS_GROUP) {
+ CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
+ pData->m_BlendType = FXDIB_BLEND_NORMAL;
+ pData->m_StrokeAlpha = 1.0f;
+ pData->m_FillAlpha = 1.0f;
+ pData->m_pSoftMask = NULL;
+ }
+ m_pStreamFilter = pForm->m_pFormStream->GetStreamFilter();
+ m_nStreams = 1;
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+}
+void CPDF_ContentParser::Continue(IFX_Pause* pPause)
+{
+ while (m_Status == ToBeContinued) {
+ if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
+ if (m_pStreamFilter == NULL) {
+ if (m_CurrentOffset == m_nStreams) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ if (m_pType3Char) {
+ m_pType3Char->m_bColored = m_pParser->m_bColored;
+ m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
+ m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
+ m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
+ m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
+ m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
+ m_pType3Char->m_bPageRequired = m_pParser->m_bResourceMissing;
+ }
+ delete m_pParser;
+ m_pParser = NULL;
+ continue;
+ }
+ CPDF_Object* pContent = m_pObjects->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_pStreamFilter = ((CPDF_Stream*)pContent)->GetStreamFilter();
+ } else {
+ CPDF_Stream* pStream = ((CPDF_Array*)pContent)->GetStream(m_CurrentOffset);
+ if (pStream == NULL) {
+ m_CurrentOffset ++;
+ continue;
+ }
+ m_pStreamFilter = pStream->GetStreamFilter();
+ }
+ }
+ FX_DWORD len = m_pStreamFilter->ReadBlock(m_pParser->m_pStreamBuf, STREAM_PARSE_BUFSIZE);
+ m_pParser->InputData(m_pParser->m_pStreamBuf, len);
+ if (m_pParser->m_bAbort) {
+ delete m_pStreamFilter;
+ m_pStreamFilter = NULL;
+ m_Status = Done;
+ delete m_pParser;
+ m_pParser = NULL;
+ return;
+ }
+ if (len < STREAM_PARSE_BUFSIZE) {
+ m_pParser->Finish();
+ m_CurrentOffset ++;
+ delete m_pStreamFilter;
+ m_pStreamFilter = NULL;
+ }
+ if (pPause && pPause->NeedToPauseNow()) {
+ return;
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
+ if (pObj == NULL) {
+ continue;
+ }
+ if (pObj->m_ClipPath.IsNull()) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetPathCount() != 1) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetTextCount()) {
+ continue;
+ }
+ CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
+ if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
+ continue;
+ }
+ CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
+ ClipPath.GetPointX(2), ClipPath.GetPointY(2));
+ CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if (old_rect.Contains(obj_rect)) {
+ pObj->m_ClipPath.SetNull();
+ }
+ }
+ if (m_pObjects->m_ObjectList.GetCount() == 1) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetAt(m_pObjects->m_ObjectList.GetHeadPosition());
+ if (pObj && pObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+ }
+ }
+ m_Status = Done;
+ return;
+ }
+ }
+}
+int CPDF_ContentParser::EstimateProgress()
+{
+ if (m_Status == Ready) {
+ return 0;
+ }
+ if (m_Status == Done) {
+ return 100;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ return 90;
+ }
+ if (m_pStreamFilter == NULL) {
+ return 90 * m_CurrentOffset / m_nStreams;
+ }
+ int total_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_nStreams;
+ int parsed_raw_size = m_pStreamFilter->GetStream()->GetRawSize() * m_CurrentOffset +
+ m_pStreamFilter->GetSrcPos();
+ return 90 * parsed_raw_size / total_raw_size;
+}
+CPDF_InlineImages::CPDF_InlineImages()
+{
+ m_Type = PDFPAGE_INLINES;
+ m_pStream = NULL;
+ m_pBitmap = NULL;
+}
+CPDF_InlineImages::~CPDF_InlineImages()
+{
+ if (m_pStream) {
+ m_pStream->Release();
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+void CPDF_InlineImages::AddMatrix(CFX_AffineMatrix& matrix)
+{
+ m_Matrices.Add(matrix);
+ CFX_FloatRect rect = matrix.GetUnitRect();
+ if (m_Matrices.GetSize() > 1) {
+ CFX_FloatRect rect1(m_Left, m_Bottom, m_Right, m_Top);
+ rect.Union(rect1);
+ }
+ m_Left = rect.left;
+ m_Right = rect.right;
+ m_Top = rect.top;
+ m_Bottom = rect.bottom;
+}
+#endif
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
new file mode 100644
index 0000000000..2f0a18d62e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -0,0 +1,1146 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "pageint.h"
+#include <limits.h>
+extern const FX_LPCSTR _PDF_OpCharType =
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIVIIIIVIIVIIIIIVVIIIIIIIIIIIIII"
+ "IIVVVVVVIVVVVVVIVVVVVIIVVIIIIIII"
+ "IIVVVVVVVVVVVVVVIVVVIIVVIVVIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"
+ "IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII";
+FX_BOOL _PDF_HasInvalidOpChar(FX_LPCSTR op)
+{
+ if(!op) {
+ return FALSE;
+ }
+ FX_BYTE ch;
+ while((ch = *op++)) {
+ if(_PDF_OpCharType[ch] == 'I') {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_DWORD CPDF_StreamContentParser::Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost)
+{
+ if (m_Level > _FPDF_MAX_FORM_LEVEL_) {
+ return dwSize;
+ }
+ FX_DWORD InitObjCount = m_pObjectList->CountObjects();
+ CPDF_StreamParser syntax(pData, dwSize);
+ m_pSyntax = &syntax;
+ m_CompatCount = 0;
+ while (1) {
+ FX_DWORD cost = m_pObjectList->CountObjects() - InitObjCount;
+ if (max_cost && cost >= max_cost) {
+ break;
+ }
+ switch (syntax.ParseNextElement()) {
+ case CPDF_StreamParser::EndOfData:
+ return m_pSyntax->GetPos();
+ case CPDF_StreamParser::Keyword:
+ if(!OnOperator((char*)syntax.GetWordBuf()) && _PDF_HasInvalidOpChar((char*)syntax.GetWordBuf())) {
+ m_bAbort = TRUE;
+ }
+ if (m_bAbort) {
+ return m_pSyntax->GetPos();
+ }
+ ClearAllParams();
+ break;
+ case CPDF_StreamParser::Number:
+ AddNumberParam((char*)syntax.GetWordBuf(), syntax.GetWordSize());
+ break;
+ case CPDF_StreamParser::Name:
+ AddNameParam((FX_LPCSTR)syntax.GetWordBuf() + 1, syntax.GetWordSize() - 1);
+ break;
+ default:
+ AddObjectParam(syntax.GetObject());
+ }
+ }
+ return m_pSyntax->GetPos();
+}
+void _PDF_ReplaceAbbr(CPDF_Object* pObj);
+void CPDF_StreamContentParser::Handle_BeginImage()
+{
+ FX_FILESIZE savePos = m_pSyntax->GetPos();
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ if (type == CPDF_StreamParser::Keyword) {
+ CFX_ByteString bsKeyword(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize());
+ if (bsKeyword != FX_BSTRC("ID")) {
+ m_pSyntax->SetPos(savePos);
+ pDict->Release();
+ return;
+ }
+ }
+ if (type != CPDF_StreamParser::Name) {
+ break;
+ }
+ CFX_ByteString key((FX_LPCSTR)m_pSyntax->GetWordBuf() + 1, m_pSyntax->GetWordSize() - 1);
+ CPDF_Object* pObj = m_pSyntax->ReadNextObject();
+ if (!key.IsEmpty()) {
+ pDict->SetAt(key, pObj, m_pDocument);
+ } else {
+ pObj->Release();
+ }
+ }
+ _PDF_ReplaceAbbr(pDict);
+ CPDF_Object* pCSObj = NULL;
+ if (pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString name = pCSObj->GetString();
+ if (name != FX_BSTRC("DeviceRGB") && name != FX_BSTRC("DeviceGray") && name != FX_BSTRC("DeviceCMYK")) {
+ pCSObj = FindResourceObj(FX_BSTRC("ColorSpace"), name);
+ if (pCSObj && !pCSObj->GetObjNum()) {
+ pCSObj = pCSObj->Clone();
+ pDict->SetAt(FX_BSTRC("ColorSpace"), pCSObj, m_pDocument);
+ }
+ }
+ }
+ }
+ CPDF_Stream* pStream = m_pSyntax->ReadInlineStream(m_pDocument, pDict, pCSObj, m_Options.m_bDecodeInlineImage);
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ if (type == CPDF_StreamParser::EndOfData) {
+ break;
+ }
+ if (type != CPDF_StreamParser::Keyword) {
+ continue;
+ }
+ if (m_pSyntax->GetWordSize() == 2 && m_pSyntax->GetWordBuf()[0] == 'E' &&
+ m_pSyntax->GetWordBuf()[1] == 'I') {
+ break;
+ }
+ }
+ if (m_Options.m_bTextOnly) {
+ if (pStream) {
+ pStream->Release();
+ } else {
+ pDict->Release();
+ }
+ return;
+ }
+ pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Image"));
+ CPDF_ImageObject *pImgObj = AddImage(pStream, NULL, TRUE);
+ if (!pImgObj) {
+ if (pStream) {
+ pStream->Release();
+ } else {
+ pDict->Release();
+ }
+ }
+}
+void CPDF_StreamContentParser::ParsePathObject()
+{
+ FX_FLOAT params[6] = {0};
+ int nParams = 0;
+ int last_pos = m_pSyntax->GetPos();
+ while (1) {
+ CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
+ FX_BOOL bProcessed = TRUE;
+ switch (type) {
+ case CPDF_StreamParser::EndOfData:
+ return;
+ case CPDF_StreamParser::Keyword: {
+ int len = m_pSyntax->GetWordSize();
+ if (len == 1) {
+ switch (m_pSyntax->GetWordBuf()[0]) {
+ case 'm':
+ AddPathPoint(params[0], params[1], FXPT_MOVETO);
+ nParams = 0;
+ break;
+ case 'l':
+ AddPathPoint(params[0], params[1], FXPT_LINETO);
+ nParams = 0;
+ break;
+ case 'c':
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ AddPathPoint(params[4], params[5], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'v':
+ AddPathPoint(m_PathCurrentX, m_PathCurrentY, FXPT_BEZIERTO);
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'y':
+ AddPathPoint(params[0], params[1], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ AddPathPoint(params[2], params[3], FXPT_BEZIERTO);
+ nParams = 0;
+ break;
+ case 'h':
+ Handle_ClosePath();
+ nParams = 0;
+ break;
+ default:
+ bProcessed = FALSE;
+ break;
+ }
+ } else if (len == 2) {
+ if (m_pSyntax->GetWordBuf()[0] == 'r' && m_pSyntax->GetWordBuf()[1] == 'e') {
+ AddPathRect(params[0], params[1], params[2], params[3]);
+ nParams = 0;
+ } else {
+ bProcessed = FALSE;
+ }
+ } else {
+ bProcessed = FALSE;
+ }
+ if (bProcessed) {
+ last_pos = m_pSyntax->GetPos();
+ }
+ break;
+ }
+ case CPDF_StreamParser::Number: {
+ if (nParams == 6) {
+ break;
+ }
+ FX_BOOL bInteger;
+ int value;
+ FX_atonum(CFX_ByteStringC(m_pSyntax->GetWordBuf(), m_pSyntax->GetWordSize()), bInteger, &value);
+ params[nParams++] = bInteger ? (FX_FLOAT)value : *(FX_FLOAT*)&value;
+ break;
+ }
+ default:
+ bProcessed = FALSE;
+ }
+ if (!bProcessed) {
+ m_pSyntax->SetPos(last_pos);
+ return;
+ }
+ }
+}
+CPDF_StreamParser::CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize)
+{
+ m_pBuf = pData;
+ m_Size = dwSize;
+ m_Pos = 0;
+ m_pLastObj = NULL;
+}
+CPDF_StreamParser::~CPDF_StreamParser()
+{
+ if (m_pLastObj) {
+ m_pLastObj->Release();
+ }
+}
+FX_DWORD _DecodeAllScanlines(ICodec_ScanlineDecoder* pDecoder, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (pDecoder == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ int ncomps = pDecoder->CountComps();
+ int bpc = pDecoder->GetBPC();
+ int width = pDecoder->GetWidth();
+ int height = pDecoder->GetHeight();
+ int pitch = (width * ncomps * bpc + 7) / 8;
+ if (height == 0 || pitch > (1 << 30) / height) {
+ delete pDecoder;
+ return -1;
+ }
+ dest_size = pitch * height;
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE pLine = pDecoder->GetScanline(row);
+ if (pLine == NULL) {
+ break;
+ }
+ FXSYS_memcpy32(dest_buf + row * pitch, pLine, pitch);
+ }
+ FX_DWORD srcoff = pDecoder->GetSrcOffset();
+ delete pDecoder;
+ return srcoff;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams);
+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+FX_DWORD PDF_DecodeInlineStream(const FX_BYTE* src_buf, FX_DWORD limit,
+ int width, int height, CFX_ByteString& decoder,
+ CPDF_Dictionary* pParam, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (decoder == FX_BSTRC("CCITTFaxDecode") || decoder == FX_BSTRC("CCF")) {
+ ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam);
+ return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
+ return _A85Decode(src_buf, limit, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
+ return _HexDecode(src_buf, limit, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
+ return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
+ return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("DCTDecode") || decoder == FX_BSTRC("DCT")) {
+ ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
+ src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
+ return _DecodeAllScanlines(pDecoder, dest_buf, dest_size);
+ } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
+ return RunLengthDecode(src_buf, limit, dest_buf, dest_size);
+ }
+ dest_size = 0;
+ dest_buf = 0;
+ return (FX_DWORD) - 1;
+}
+extern const FX_LPCSTR _PDF_CharType;
+CPDF_Stream* CPDF_StreamParser::ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode)
+{
+ if (m_Pos == m_Size) {
+ return NULL;
+ }
+ if (_PDF_CharType[m_pBuf[m_Pos]] == 'W') {
+ m_Pos ++;
+ }
+ CFX_ByteString Decoder;
+ CPDF_Dictionary* pParam = NULL;
+ CPDF_Object* pFilter = pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilter == NULL) {
+ } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ Decoder = ((CPDF_Array*)pFilter)->GetString(0);
+ CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
+ if (pParams) {
+ pParam = pParams->GetDict(0);
+ }
+ } else {
+ Decoder = pFilter->GetString();
+ pParam = pDict->GetDict(FX_BSTRC("DecodeParms"));
+ }
+ FX_DWORD width = pDict->GetInteger(FX_BSTRC("Width"));
+ FX_DWORD height = pDict->GetInteger(FX_BSTRC("Height"));
+ FX_DWORD OrigSize = 0;
+ if (pCSObj != NULL) {
+ FX_DWORD bpc = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ FX_DWORD nComponents = 1;
+ CPDF_ColorSpace* pCS = pDoc->LoadColorSpace(pCSObj);
+ if (pCS == NULL) {
+ nComponents = 3;
+ } else {
+ nComponents = pCS->CountComponents();
+ pDoc->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ FX_DWORD pitch = width;
+ if (bpc && pitch > INT_MAX / bpc) {
+ return NULL;
+ }
+ pitch *= bpc;
+ if (nComponents && pitch > INT_MAX / nComponents) {
+ return NULL;
+ }
+ pitch *= nComponents;
+ if (pitch > INT_MAX - 7) {
+ return NULL;
+ }
+ pitch += 7;
+ pitch /= 8;
+ OrigSize = pitch;
+ } else {
+ if (width > INT_MAX - 7) {
+ return NULL;
+ }
+ OrigSize = ((width + 7) / 8);
+ }
+ if (height && OrigSize > INT_MAX / height) {
+ return NULL;
+ }
+ OrigSize *= height;
+ FX_LPBYTE pData = NULL;
+ FX_DWORD dwStreamSize;
+ if (Decoder.IsEmpty()) {
+ if (OrigSize > m_Size - m_Pos) {
+ OrigSize = m_Size - m_Pos;
+ }
+ pData = FX_Alloc(FX_BYTE, OrigSize);
+ FXSYS_memcpy32(pData, m_pBuf + m_Pos, OrigSize);
+ dwStreamSize = OrigSize;
+ m_Pos += OrigSize;
+ } else {
+ FX_DWORD dwDestSize = OrigSize;
+ dwStreamSize = PDF_DecodeInlineStream(m_pBuf + m_Pos, m_Size - m_Pos, width, height, Decoder, pParam,
+ pData, dwDestSize);
+ if ((int)dwStreamSize < 0) {
+ return NULL;
+ }
+ if (bDecode) {
+ m_Pos += dwStreamSize;
+ dwStreamSize = dwDestSize;
+ if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ ((CPDF_Array*)pFilter)->RemoveAt(0);
+ CPDF_Array* pParams = pDict->GetArray(FX_BSTRC("DecodeParms"));
+ if (pParams) {
+ pParams->RemoveAt(0);
+ }
+ } else {
+ pDict->RemoveAt(FX_BSTRC("Filter"));
+ pDict->RemoveAt(FX_BSTRC("DecodeParms"));
+ }
+ } else {
+ if (pData) {
+ FX_Free(pData);
+ }
+ FX_DWORD dwSavePos = m_Pos;
+ m_Pos += dwStreamSize;
+ while (1) {
+ FX_DWORD dwPrevPos = m_Pos;
+ CPDF_StreamParser::SyntaxType type = ParseNextElement();
+ if (type == CPDF_StreamParser::EndOfData) {
+ break;
+ }
+ if (type != CPDF_StreamParser::Keyword) {
+ dwStreamSize += m_Pos - dwPrevPos;
+ continue;
+ }
+ if (GetWordSize() == 2 && GetWordBuf()[0] == 'E' &&
+ GetWordBuf()[1] == 'I') {
+ m_Pos = dwPrevPos;
+ break;
+ }
+ dwStreamSize += m_Pos - dwPrevPos;
+ }
+ m_Pos = dwSavePos;
+ pData = FX_Alloc(FX_BYTE, dwStreamSize);
+ FXSYS_memcpy32(pData, m_pBuf + m_Pos, dwStreamSize);
+ m_Pos += dwStreamSize;
+ }
+ }
+ pDict->SetAtInteger(FX_BSTRC("Length"), (int)dwStreamSize);
+ return CPDF_Stream::Create(pData, dwStreamSize, pDict);
+}
+#define MAX_WORD_BUFFER 256
+#define MAX_STRING_LENGTH 32767
+#define FXDWORD_TRUE FXDWORD_FROM_LSBFIRST(0x65757274)
+#define FXDWORD_NULL FXDWORD_FROM_LSBFIRST(0x6c6c756e)
+#define FXDWORD_FALS FXDWORD_FROM_LSBFIRST(0x736c6166)
+CPDF_StreamParser::SyntaxType CPDF_StreamParser::ParseNextElement()
+{
+ if (m_pLastObj) {
+ m_pLastObj->Release();
+ m_pLastObj = NULL;
+ }
+ m_WordSize = 0;
+ FX_BOOL bIsNumber = TRUE;
+ if (m_Pos >= m_Size) {
+ return EndOfData;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Size <= m_Pos) {
+ return EndOfData;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return EndOfData;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D' && ch != '/') {
+ m_Pos --;
+ m_pLastObj = ReadNextObject();
+ return Others;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (type != 'N') {
+ bIsNumber = FALSE;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+ m_WordBuffer[m_WordSize] = 0;
+ if (bIsNumber) {
+ return Number;
+ }
+ if (m_WordBuffer[0] == '/') {
+ return Name;
+ }
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
+ m_pLastObj = CPDF_Boolean::Create(TRUE);
+ return Others;
+ }
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
+ m_pLastObj = CPDF_Null::Create();
+ return Others;
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
+ m_pLastObj = CPDF_Boolean::Create(FALSE);
+ return Others;
+ }
+ }
+ return Keyword;
+}
+void CPDF_StreamParser::SkipPathObject()
+{
+ FX_DWORD command_startpos = m_Pos;
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (type != 'N') {
+ m_Pos = command_startpos;
+ return;
+ }
+ while (1) {
+ while (type != 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ while (type == 'W') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'N') {
+ continue;
+ }
+ FX_DWORD op_startpos = m_Pos - 1;
+ while (type != 'W' && type != 'D') {
+ if (m_Pos >= m_Size) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (m_Pos - op_startpos == 2) {
+ int op = m_pBuf[op_startpos];
+ if (op == 'm' || op == 'l' || op == 'c' || op == 'v' || op == 'y') {
+ command_startpos = m_Pos;
+ break;
+ }
+ } else if (m_Pos - op_startpos == 3) {
+ if (m_pBuf[op_startpos] == 'r' && m_pBuf[op_startpos + 1] == 'e') {
+ command_startpos = m_Pos;
+ break;
+ }
+ }
+ m_Pos = command_startpos;
+ return;
+ }
+ }
+}
+CPDF_Object* CPDF_StreamParser::ReadNextObject(FX_BOOL bAllowNestedArray, FX_BOOL bInArray)
+{
+ FX_BOOL bIsNumber;
+ GetNextWord(bIsNumber);
+ if (m_WordSize == 0) {
+ return NULL;
+ }
+ if (bIsNumber) {
+ m_WordBuffer[m_WordSize] = 0;
+ return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));
+ }
+ int first_char = m_WordBuffer[0];
+ if (first_char == '/') {
+ return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
+ }
+ if (first_char == '(') {
+ return CPDF_String::Create(ReadString());
+ }
+ if (first_char == '<') {
+ if (m_WordSize == 1) {
+ return CPDF_String::Create(ReadHexString(), TRUE);
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ while (1) {
+ GetNextWord(bIsNumber);
+ if (m_WordSize == 0) {
+ pDict->Release();
+ return NULL;
+ }
+ if (m_WordSize == 2 && m_WordBuffer[0] == '>') {
+ break;
+ }
+ if (m_WordBuffer[0] != '/') {
+ pDict->Release();
+ return NULL;
+ }
+ CFX_ByteString key = PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
+ CPDF_Object* pObj = ReadNextObject(TRUE);
+ if (pObj == NULL) {
+ if (pDict) {
+ pDict->Release();
+ }
+ return NULL;
+ }
+ if (!key.IsEmpty()) {
+ pDict->SetAt(key, pObj);
+ } else {
+ pObj->Release();
+ }
+ }
+ return pDict;
+ }
+ if (first_char == '[') {
+ if (!bAllowNestedArray && bInArray) {
+ return NULL;
+ }
+ CPDF_Array* pArray = CPDF_Array::Create();
+ while (1) {
+ CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);
+ if (pObj == NULL) {
+ if (m_WordSize == 0 || m_WordBuffer[0] == ']') {
+ return pArray;
+ }
+ if (m_WordBuffer[0] == '[') {
+ continue;
+ }
+ } else {
+ pArray->Add(pObj);
+ }
+ }
+ }
+ if (m_WordSize == 4) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
+ return CPDF_Boolean::Create(TRUE);
+ }
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
+ return CPDF_Null::Create();
+ }
+ } else if (m_WordSize == 5) {
+ if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
+ return CPDF_Boolean::Create(FALSE);
+ }
+ }
+ return NULL;
+}
+void CPDF_StreamParser::GetNextWord(FX_BOOL& bIsNumber)
+{
+ m_WordSize = 0;
+ bIsNumber = TRUE;
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ int ch = m_pBuf[m_Pos++];
+ int type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D') {
+ bIsNumber = FALSE;
+ m_WordBuffer[m_WordSize++] = ch;
+ if (ch == '/') {
+ while (1) {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type != 'R' && type != 'N') {
+ m_Pos --;
+ return;
+ }
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ }
+ } else if (ch == '<') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '<') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ } else if (ch == '>') {
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ if (ch == '>') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ }
+ return;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (type != 'N') {
+ bIsNumber = FALSE;
+ }
+ if (m_Size <= m_Pos) {
+ return;
+ }
+ ch = m_pBuf[m_Pos++];
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+}
+CFX_ByteString CPDF_StreamParser::ReadString()
+{
+ if (m_Size <= m_Pos) {
+ return CFX_ByteString();
+ }
+ int ch = m_pBuf[m_Pos++];
+ CFX_ByteTextBuf buf;
+ int parlevel = 0;
+ int status = 0, iEscCode = 0;
+ while (1) {
+ switch (status) {
+ case 0:
+ if (ch == ')') {
+ if (parlevel == 0) {
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+ }
+ parlevel --;
+ buf.AppendChar(')');
+ } else if (ch == '(') {
+ parlevel ++;
+ buf.AppendChar('(');
+ } else if (ch == '\\') {
+ status = 1;
+ } else {
+ buf.AppendChar((char)ch);
+ }
+ break;
+ case 1:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = ch - '0';
+ status = 2;
+ break;
+ }
+ if (ch == 'n') {
+ buf.AppendChar('\n');
+ } else if (ch == 'r') {
+ buf.AppendChar('\r');
+ } else if (ch == 't') {
+ buf.AppendChar('\t');
+ } else if (ch == 'b') {
+ buf.AppendChar('\b');
+ } else if (ch == 'f') {
+ buf.AppendChar('\f');
+ } else if (ch == '\r') {
+ status = 4;
+ break;
+ } else if (ch == '\n') {
+ } else {
+ buf.AppendChar(ch);
+ }
+ status = 0;
+ break;
+ case 2:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ status = 3;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 3:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ buf.AppendChar(iEscCode);
+ status = 0;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 4:
+ status = 0;
+ if (ch != '\n') {
+ continue;
+ }
+ break;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ }
+ if (m_Size > m_Pos) {
+ ch = m_pBuf[m_Pos++];
+ }
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+}
+CFX_ByteString CPDF_StreamParser::ReadHexString()
+{
+ if (m_Size <= m_Pos) {
+ return CFX_ByteString();
+ }
+ int ch = m_pBuf[m_Pos++];
+ CFX_ByteTextBuf buf;
+ FX_BOOL bFirst = TRUE;
+ int code = 0;
+ while (1) {
+ if (ch == '>') {
+ break;
+ }
+ if (ch >= '0' && ch <= '9') {
+ if (bFirst) {
+ code = (ch - '0') * 16;
+ } else {
+ code += ch - '0';
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'A' && ch <= 'F') {
+ if (bFirst) {
+ code = (ch - 'A' + 10) * 16;
+ } else {
+ code += ch - 'A' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'a' && ch <= 'f') {
+ if (bFirst) {
+ code = (ch - 'a' + 10) * 16;
+ } else {
+ code += ch - 'a' + 10;
+ buf.AppendChar((char)code);
+ }
+ bFirst = !bFirst;
+ }
+ if (m_Size <= m_Pos) {
+ break;
+ }
+ ch = m_pBuf[m_Pos++];
+ }
+ if (!bFirst) {
+ buf.AppendChar((char)code);
+ }
+ if (buf.GetLength() > MAX_STRING_LENGTH) {
+ return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
+ }
+ return buf.GetByteString();
+}
+#define PAGEPARSE_STAGE_GETCONTENT 1
+#define PAGEPARSE_STAGE_PARSE 2
+#define PAGEPARSE_STAGE_CHECKCLIP 3
+CPDF_ContentParser::CPDF_ContentParser()
+{
+ m_pParser = NULL;
+ m_pStreamArray = NULL;
+ m_pSingleStream = NULL;
+ m_pData = NULL;
+ m_Status = Ready;
+ m_pType3Char = NULL;
+}
+CPDF_ContentParser::~CPDF_ContentParser()
+{
+ Clear();
+}
+void CPDF_ContentParser::Clear()
+{
+ if (m_pParser) {
+ delete m_pParser;
+ }
+ if (m_pSingleStream) {
+ delete m_pSingleStream;
+ }
+ if (m_pStreamArray) {
+ for (FX_DWORD i = 0; i < m_nStreams; i ++)
+ if (m_pStreamArray[i]) {
+ delete m_pStreamArray[i];
+ }
+ FX_Free(m_pStreamArray);
+ }
+ if (m_pData && m_pSingleStream == NULL) {
+ FX_Free((void*)m_pData);
+ }
+ m_pParser = NULL;
+ m_pStreamArray = NULL;
+ m_pSingleStream = NULL;
+ m_pData = NULL;
+ m_Status = Ready;
+}
+void CPDF_ContentParser::Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions)
+{
+ if (m_Status != Ready || pPage == NULL || pPage->m_pDocument == NULL || pPage->m_pFormDict == NULL) {
+ m_Status = Done;
+ return;
+ }
+ m_pObjects = pPage;
+ m_bForm = FALSE;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_GETCONTENT;
+ m_CurrentOffset = 0;
+ CPDF_Object* pContent = pPage->m_pFormDict->GetElementValue(FX_BSTRC("Contents"));
+ if (pContent == NULL) {
+ m_Status = Done;
+ return;
+ }
+ if (pContent->GetType() == PDFOBJ_STREAM) {
+ m_nStreams = 0;
+ m_pSingleStream = FX_NEW CPDF_StreamAcc;
+ m_pSingleStream->LoadAllData((CPDF_Stream*)pContent, FALSE);
+ } else if (pContent->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContent;
+ m_nStreams = pArray->GetCount();
+ if (m_nStreams == 0) {
+ m_Status = Done;
+ return;
+ }
+ m_pStreamArray = FX_Alloc(CPDF_StreamAcc*, m_nStreams);
+ FXSYS_memset32(m_pStreamArray, 0, sizeof(CPDF_StreamAcc*) * m_nStreams);
+ } else {
+ m_Status = Done;
+ return;
+ }
+}
+void CPDF_ContentParser::Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates,
+ CFX_AffineMatrix* pParentMatrix, CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level)
+{
+ m_pType3Char = pType3Char;
+ m_pObjects = pForm;
+ m_bForm = TRUE;
+ CFX_AffineMatrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ if (pGraphicStates) {
+ form_matrix.Concat(pGraphicStates->m_CTM);
+ }
+ CPDF_Array* pBBox = pForm->m_pFormDict->GetArray(FX_BSTRC("BBox"));
+ CFX_FloatRect form_bbox;
+ CPDF_Path ClipPath;
+ if (pBBox) {
+ form_bbox = pBBox->GetRect();
+ ClipPath.New();
+ ClipPath.AppendRect(form_bbox.left, form_bbox.bottom, form_bbox.right, form_bbox.top);
+ ClipPath.Transform(&form_matrix);
+ if (pParentMatrix) {
+ ClipPath.Transform(pParentMatrix);
+ }
+ form_bbox.Transform(&form_matrix);
+ if (pParentMatrix) {
+ form_bbox.Transform(pParentMatrix);
+ }
+ }
+ CPDF_Dictionary* pResources = pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(pForm->m_pDocument, pForm->m_pPageResources, pForm->m_pResources, pParentMatrix, pForm,
+ pResources, &form_bbox, pOptions, pGraphicStates, level);
+ m_pParser->m_pCurStates->m_CTM = form_matrix;
+ m_pParser->m_pCurStates->m_ParentMatrix = form_matrix;
+ if (ClipPath.NotNull()) {
+ m_pParser->m_pCurStates->m_ClipPath.AppendPath(ClipPath, FXFILL_WINDING, TRUE);
+ }
+ if (pForm->m_Transparency & PDFTRANS_GROUP) {
+ CPDF_GeneralStateData* pData = m_pParser->m_pCurStates->m_GeneralState.GetModify();
+ pData->m_BlendType = FXDIB_BLEND_NORMAL;
+ pData->m_StrokeAlpha = 1.0f;
+ pData->m_FillAlpha = 1.0f;
+ pData->m_pSoftMask = NULL;
+ }
+ m_nStreams = 0;
+ m_pSingleStream = FX_NEW CPDF_StreamAcc;
+ if (pForm->m_pDocument) {
+ m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
+ } else {
+ m_pSingleStream->LoadAllData(pForm->m_pFormStream, FALSE);
+ }
+ m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
+ m_Size = m_pSingleStream->GetSize();
+ m_Status = ToBeContinued;
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+}
+void CPDF_ContentParser::Continue(IFX_Pause* pPause)
+{
+ int steps = 0;
+ while (m_Status == ToBeContinued) {
+ if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
+ if (m_CurrentOffset == m_nStreams) {
+ if (m_pStreamArray) {
+ m_Size = 0;
+ FX_DWORD i;
+ for (i = 0; i < m_nStreams; i ++) {
+ FX_DWORD size = m_pStreamArray[i]->GetSize();
+ if (m_Size + size + 1 <= m_Size) {
+ m_Status = Done;
+ return;
+ }
+ m_Size += size + 1;
+ }
+ m_pData = FX_Alloc(FX_BYTE, m_Size);
+ if (!m_pData) {
+ m_Status = Done;
+ return;
+ }
+ FX_DWORD pos = 0;
+ for (i = 0; i < m_nStreams; i ++) {
+ FXSYS_memcpy32(m_pData + pos, m_pStreamArray[i]->GetData(), m_pStreamArray[i]->GetSize());
+ pos += m_pStreamArray[i]->GetSize() + 1;
+ m_pData[pos - 1] = ' ';
+ delete m_pStreamArray[i];
+ }
+ FX_Free(m_pStreamArray);
+ m_pStreamArray = NULL;
+ } else {
+ m_pData = (FX_LPBYTE)m_pSingleStream->GetData();
+ m_Size = m_pSingleStream->GetSize();
+ }
+ m_InternalStage = PAGEPARSE_STAGE_PARSE;
+ m_CurrentOffset = 0;
+ } else {
+ CPDF_Array* pContent = m_pObjects->m_pFormDict->GetArray(FX_BSTRC("Contents"));
+ m_pStreamArray[m_CurrentOffset] = FX_NEW CPDF_StreamAcc;
+ CPDF_Stream* pStreamObj = (CPDF_Stream*)pContent->GetElementValue(m_CurrentOffset);
+ m_pStreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, FALSE);
+ m_CurrentOffset ++;
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_PARSE) {
+ if (m_pParser == NULL) {
+ m_pParser = FX_NEW CPDF_StreamContentParser;
+ m_pParser->Initialize();
+ m_pParser->PrepareParse(m_pObjects->m_pDocument, m_pObjects->m_pPageResources, NULL, NULL, m_pObjects,
+ m_pObjects->m_pResources, &m_pObjects->m_BBox, &m_Options, NULL, 0);
+ m_pParser->m_pCurStates->m_ColorState.GetModify()->Default();
+ }
+ if (m_CurrentOffset >= m_Size) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ } else {
+ m_CurrentOffset += m_pParser->Parse(m_pData + m_CurrentOffset, m_Size - m_CurrentOffset, PARSE_STEP_LIMIT);
+ if (m_pParser->m_bAbort) {
+ m_InternalStage = PAGEPARSE_STAGE_CHECKCLIP;
+ continue;
+ }
+ }
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ if (m_pType3Char) {
+ m_pType3Char->m_bColored = m_pParser->m_bColored;
+ m_pType3Char->m_Width = FXSYS_round(m_pParser->m_Type3Data[0] * 1000);
+ m_pType3Char->m_BBox.left = FXSYS_round(m_pParser->m_Type3Data[2] * 1000);
+ m_pType3Char->m_BBox.bottom = FXSYS_round(m_pParser->m_Type3Data[3] * 1000);
+ m_pType3Char->m_BBox.right = FXSYS_round(m_pParser->m_Type3Data[4] * 1000);
+ m_pType3Char->m_BBox.top = FXSYS_round(m_pParser->m_Type3Data[5] * 1000);
+ }
+ FX_POSITION pos = m_pObjects->m_ObjectList.GetHeadPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = (CPDF_PageObject*)m_pObjects->m_ObjectList.GetNext(pos);
+ if (pObj->m_ClipPath.IsNull()) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetPathCount() != 1) {
+ continue;
+ }
+ if (pObj->m_ClipPath.GetTextCount()) {
+ continue;
+ }
+ CPDF_Path ClipPath = pObj->m_ClipPath.GetPath(0);
+ if (!ClipPath.IsRect() || pObj->m_Type == PDFPAGE_SHADING) {
+ continue;
+ }
+ CFX_FloatRect old_rect(ClipPath.GetPointX(0), ClipPath.GetPointY(0),
+ ClipPath.GetPointX(2), ClipPath.GetPointY(2));
+ CFX_FloatRect obj_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if (old_rect.Contains(obj_rect)) {
+ pObj->m_ClipPath.SetNull();
+ }
+ }
+ m_Status = Done;
+ return;
+ }
+ steps ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ break;
+ }
+ }
+}
+int CPDF_ContentParser::EstimateProgress()
+{
+ if (m_Status == Ready) {
+ return 0;
+ }
+ if (m_Status == Done) {
+ return 100;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_GETCONTENT) {
+ return 10;
+ }
+ if (m_InternalStage == PAGEPARSE_STAGE_CHECKCLIP) {
+ return 90;
+ }
+ return 10 + 80 * m_CurrentOffset / m_Size;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
new file mode 100644
index 0000000000..836c940f5e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp
@@ -0,0 +1,52 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "pageint.h"
+void CPDF_PathObject::CopyData(const CPDF_PageObject* pSrc)
+{
+ const CPDF_PathObject* pSrcObj = (const CPDF_PathObject*)pSrc;
+ m_Path = pSrcObj->m_Path;
+ m_FillType = pSrcObj->m_FillType;
+ m_bStroke = pSrcObj->m_bStroke;
+ m_Matrix = pSrcObj->m_Matrix;
+}
+void CPDF_PathObject::Transform(const CPDF_Matrix& matrix)
+{
+ m_Matrix.Concat(matrix);
+ CalcBoundingBox();
+}
+void CPDF_PathObject::SetGraphState(CPDF_GraphState GraphState)
+{
+ m_GraphState = GraphState;
+ CalcBoundingBox();
+}
+void CPDF_PathObject::CalcBoundingBox()
+{
+ if (m_Path.IsNull()) {
+ return;
+ }
+ CFX_FloatRect rect;
+ FX_FLOAT width = m_GraphState.GetObject()->m_LineWidth;
+ if (m_bStroke && width != 0) {
+ rect = m_Path.GetBoundingBox(width, m_GraphState.GetObject()->m_MiterLimit);
+ } else {
+ rect = m_Path.GetBoundingBox();
+ }
+ rect.Transform(&m_Matrix);
+ if (width == 0 && m_bStroke) {
+ rect.left += -0.5f;
+ rect.right += 0.5f;
+ rect.bottom += -0.5f;
+ rect.top += 0.5f;
+ }
+ m_Left = rect.left;
+ m_Right = rect.right;
+ m_Top = rect.top;
+ m_Bottom = rect.bottom;
+}
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
new file mode 100644
index 0000000000..aee0367acb
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "pageint.h"
+CPDF_TilingPattern::CPDF_TilingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, const CFX_AffineMatrix* parentMatrix) :
+ CPDF_Pattern(parentMatrix)
+{
+ m_PatternType = PATTERN_TILING;
+ m_pPatternObj = pPatternObj;
+ m_pDocument = pDoc;
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ ASSERT(pDict != NULL);
+ m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
+ if (parentMatrix) {
+ m_Pattern2Form.Concat(*parentMatrix);
+ }
+ m_pForm = NULL;
+}
+CPDF_TilingPattern::~CPDF_TilingPattern()
+{
+ if (m_pForm) {
+ delete m_pForm;
+ }
+}
+FX_BOOL CPDF_TilingPattern::Load()
+{
+ if (m_pForm != NULL) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ m_bColored = pDict->GetInteger(FX_BSTRC("PaintType")) == 1;
+ m_XStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("XStep")));
+ m_YStep = (FX_FLOAT)FXSYS_fabs(pDict->GetNumber(FX_BSTRC("YStep")));
+ if (m_pPatternObj->GetType() != PDFOBJ_STREAM) {
+ return FALSE;
+ }
+ CPDF_Stream* pStream = (CPDF_Stream*)m_pPatternObj;
+ m_pForm = FX_NEW CPDF_Form(m_pDocument, NULL, pStream);
+ m_pForm->ParseContent(NULL, &m_ParentMatrix, NULL, NULL);
+ m_BBox = pDict->GetRect(FX_BSTRC("BBox"));
+ return TRUE;
+}
+CPDF_ShadingPattern::CPDF_ShadingPattern(CPDF_Document* pDoc, CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* parentMatrix) : CPDF_Pattern(parentMatrix)
+{
+ m_PatternType = PATTERN_SHADING;
+ m_pPatternObj = bShading ? NULL : pPatternObj;
+ m_pDocument = pDoc;
+ m_bShadingObj = bShading;
+ if (!bShading) {
+ CPDF_Dictionary* pDict = m_pPatternObj->GetDict();
+ ASSERT(pDict != NULL);
+ m_Pattern2Form = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ m_pShadingObj = pDict->GetElementValue(FX_BSTRC("Shading"));
+ if (parentMatrix) {
+ m_Pattern2Form.Concat(*parentMatrix);
+ }
+ } else {
+ m_pShadingObj = pPatternObj;
+ }
+ m_ShadingType = 0;
+ m_pCS = NULL;
+ m_nFuncs = 0;
+ for (int i = 0; i < 4; i ++) {
+ m_pFunctions[i] = NULL;
+ }
+}
+CPDF_ShadingPattern::~CPDF_ShadingPattern()
+{
+ Clear();
+}
+void CPDF_ShadingPattern::Clear()
+{
+ for (int i = 0; i < m_nFuncs; i ++) {
+ if (m_pFunctions[i]) {
+ delete m_pFunctions[i];
+ }
+ m_pFunctions[i] = NULL;
+ }
+ CPDF_ColorSpace* pCS = m_pCS;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+ m_ShadingType = 0;
+ m_pCS = NULL;
+ m_nFuncs = 0;
+}
+FX_BOOL CPDF_ShadingPattern::Load()
+{
+ if (m_ShadingType != 0) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pShadingDict = m_pShadingObj->GetDict();
+ if (pShadingDict == NULL) {
+ return FALSE;
+ }
+ if (m_nFuncs) {
+ for (int i = 0; i < m_nFuncs; i ++)
+ if (m_pFunctions[i]) {
+ delete m_pFunctions[i];
+ }
+ m_nFuncs = 0;
+ }
+ CPDF_Object* pFunc = pShadingDict->GetElementValue(FX_BSTRC("Function"));
+ if (pFunc) {
+ if (pFunc->GetType() == PDFOBJ_ARRAY) {
+ m_nFuncs = ((CPDF_Array*)pFunc)->GetCount();
+ if (m_nFuncs > 4) {
+ m_nFuncs = 4;
+ }
+ for (int i = 0; i < m_nFuncs; i ++) {
+ m_pFunctions[i] = CPDF_Function::Load(((CPDF_Array*)pFunc)->GetElementValue(i));
+ }
+ } else {
+ m_pFunctions[0] = CPDF_Function::Load(pFunc);
+ m_nFuncs = 1;
+ }
+ }
+ CPDF_Object* pCSObj = pShadingDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
+ m_pCS = pDocPageData->GetColorSpace(pCSObj, NULL);
+ m_ShadingType = pShadingDict->GetInteger(FX_BSTRC("ShadingType"));
+ return TRUE;
+}
+FX_BOOL CPDF_ShadingPattern::Reload()
+{
+ Clear();
+ return Load();
+}
+FX_BOOL CPDF_MeshStream::Load(CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
+{
+ m_Stream.LoadAllData(pShadingStream);
+ m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize());
+ m_pFuncs = pFuncs;
+ m_nFuncs = nFuncs;
+ m_pCS = pCS;
+ CPDF_Dictionary* pDict = pShadingStream->GetDict();
+ m_nCoordBits = pDict->GetInteger(FX_BSTRC("BitsPerCoordinate"));
+ m_nCompBits = pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ m_nFlagBits = pDict->GetInteger(FX_BSTRC("BitsPerFlag"));
+ if (!m_nCoordBits || !m_nCompBits) {
+ return FALSE;
+ }
+ int nComps = pCS->CountComponents();
+ if (nComps > 8) {
+ return FALSE;
+ }
+ m_nComps = nFuncs ? 1 : nComps;
+ if (((int)m_nComps < 0) || m_nComps > 8) {
+ return FALSE;
+ }
+ m_CoordMax = m_nCoordBits == 32 ? -1 : (1 << m_nCoordBits) - 1;
+ m_CompMax = (1 << m_nCompBits) - 1;
+ CPDF_Array* pDecode = pDict->GetArray(FX_BSTRC("Decode"));
+ if (pDecode == NULL || pDecode->GetCount() != 4 + m_nComps * 2) {
+ return FALSE;
+ }
+ m_xmin = pDecode->GetNumber(0);
+ m_xmax = pDecode->GetNumber(1);
+ m_ymin = pDecode->GetNumber(2);
+ m_ymax = pDecode->GetNumber(3);
+ for (FX_DWORD i = 0; i < m_nComps; i ++) {
+ m_ColorMin[i] = pDecode->GetNumber(i * 2 + 4);
+ m_ColorMax[i] = pDecode->GetNumber(i * 2 + 5);
+ }
+ return TRUE;
+}
+FX_DWORD CPDF_MeshStream::GetFlag()
+{
+ return m_BitStream.GetBits(m_nFlagBits) & 0x03;
+}
+void CPDF_MeshStream::GetCoords(FX_FLOAT& x, FX_FLOAT& y)
+{
+ if (m_nCoordBits == 32) {
+ x = m_xmin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / (double)m_CoordMax);
+ y = m_ymin + (FX_FLOAT)(m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / (double)m_CoordMax);
+ } else {
+ x = m_xmin + m_BitStream.GetBits(m_nCoordBits) * (m_xmax - m_xmin) / m_CoordMax;
+ y = m_ymin + m_BitStream.GetBits(m_nCoordBits) * (m_ymax - m_ymin) / m_CoordMax;
+ }
+}
+void CPDF_MeshStream::GetColor(FX_FLOAT& r, FX_FLOAT& g, FX_FLOAT& b)
+{
+ FX_DWORD i;
+ FX_FLOAT color_value[8];
+ for (i = 0; i < m_nComps; i ++) {
+ color_value[i] = m_ColorMin[i] + m_BitStream.GetBits(m_nCompBits) * (m_ColorMax[i] - m_ColorMin[i]) / m_CompMax;
+ }
+ if (m_nFuncs) {
+ static const int kMaxResults = 8;
+ FX_FLOAT result[kMaxResults];
+ int nResults;
+ FXSYS_memset32(result, 0, sizeof(result));
+ for (FX_DWORD i = 0; i < m_nFuncs; i ++) {
+ if (m_pFuncs[i] && m_pFuncs[i]->CountOutputs() <= kMaxResults) {
+ m_pFuncs[i]->Call(color_value, 1, result, nResults);
+ }
+ }
+ m_pCS->GetRGB(result, r, g, b);
+ } else {
+ m_pCS->GetRGB(color_value, r, g, b);
+ }
+}
+FX_DWORD CPDF_MeshStream::GetVertex(CPDF_MeshVertex& vertex, CFX_AffineMatrix* pObject2Bitmap)
+{
+ FX_DWORD flag = GetFlag();
+ GetCoords(vertex.x, vertex.y);
+ pObject2Bitmap->Transform(vertex.x, vertex.y);
+ GetColor(vertex.r, vertex.g, vertex.b);
+ m_BitStream.ByteAlign();
+ return flag;
+}
+FX_BOOL CPDF_MeshStream::GetVertexRow(CPDF_MeshVertex* vertex, int count, CFX_AffineMatrix* pObject2Bitmap)
+{
+ for (int i = 0; i < count; i ++) {
+ if (m_BitStream.IsEOF()) {
+ return FALSE;
+ }
+ GetCoords(vertex[i].x, vertex[i].y);
+ pObject2Bitmap->Transform(vertex[i].x, vertex[i].y);
+ GetColor(vertex[i].r, vertex[i].g, vertex[i].b);
+ m_BitStream.ByteAlign();
+ }
+ return TRUE;
+}
+CFX_FloatRect _GetShadingBBox(CPDF_Stream* pStream, int type, const CFX_AffineMatrix* pMatrix,
+ CPDF_Function** pFuncs, int nFuncs, CPDF_ColorSpace* pCS)
+{
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM || pFuncs == NULL || pCS == NULL) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pStream, pFuncs, nFuncs, pCS)) {
+ return CFX_FloatRect(0, 0, 0, 0);
+ }
+ CFX_FloatRect rect;
+ FX_BOOL bStarted = FALSE;
+ FX_BOOL bGouraud = type == 4 || type == 5;
+ int full_point_count = type == 7 ? 16 : (type == 6 ? 12 : 1);
+ int full_color_count = (type == 6 || type == 7) ? 4 : 1;
+ while (!stream.m_BitStream.IsEOF()) {
+ FX_DWORD flag;
+ if (type != 5) {
+ flag = stream.GetFlag();
+ }
+ int point_count = full_point_count, color_count = full_color_count;
+ if (!bGouraud && flag) {
+ point_count -= 4;
+ color_count -= 2;
+ }
+ for (int i = 0; i < point_count; i ++) {
+ FX_FLOAT x, y;
+ stream.GetCoords(x, y);
+ if (bStarted) {
+ rect.UpdateRect(x, y);
+ } else {
+ rect.InitRect(x, y);
+ bStarted = TRUE;
+ }
+ }
+ stream.m_BitStream.SkipBits(stream.m_nComps * stream.m_nCompBits * color_count);
+ if (bGouraud) {
+ stream.m_BitStream.ByteAlign();
+ }
+ }
+ rect.Transform(pMatrix);
+ return rect;
+}
diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h
new file mode 100644
index 0000000000..b1a83ec236
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_page/pageint.h
@@ -0,0 +1,505 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#define PARSE_STEP_LIMIT 100
+#define STREAM_PARSE_BUFSIZE 20480
+class CPDF_QuickFontCache;
+#ifndef _FPDFAPI_MINI_
+class CPDF_StreamParser : public CFX_Object
+{
+public:
+
+ CPDF_StreamParser(const FX_BYTE* pData, FX_DWORD dwSize);
+ ~CPDF_StreamParser();
+
+ CPDF_Stream* ReadInlineStream(CPDF_Document* pDoc, CPDF_Dictionary* pDict, CPDF_Object* pCSObj, FX_BOOL bDecode);
+ typedef enum { EndOfData, Number, Keyword, Name, Others } SyntaxType;
+
+ SyntaxType ParseNextElement();
+ FX_LPBYTE GetWordBuf()
+ {
+ return m_WordBuffer;
+ }
+ FX_DWORD GetWordSize()
+ {
+ return m_WordSize;
+ }
+ CPDF_Object* GetObject()
+ {
+ CPDF_Object* pObj = m_pLastObj;
+ m_pLastObj = NULL;
+ return pObj;
+ }
+ FX_DWORD GetPos()
+ {
+ return m_Pos;
+ }
+ void SetPos(FX_DWORD pos)
+ {
+ m_Pos = pos;
+ }
+
+ CPDF_Object* ReadNextObject(FX_BOOL bAllowNestedArray = FALSE, FX_BOOL bInArray = FALSE);
+ void SkipPathObject();
+protected:
+ void GetNextWord(FX_BOOL& bIsNumber);
+ CFX_ByteString ReadString();
+ CFX_ByteString ReadHexString();
+ const FX_BYTE* m_pBuf;
+ FX_DWORD m_Size;
+ FX_DWORD m_Pos;
+ FX_BYTE m_WordBuffer[256];
+ FX_DWORD m_WordSize;
+ CPDF_Object* m_pLastObj;
+};
+#endif
+typedef enum {
+ PDFOP_CloseFillStrokePath = 0, PDFOP_FillStrokePath,
+ PDFOP_CloseEOFillStrokePath, PDFOP_EOFillStrokePath,
+ PDFOP_BeginMarkedContent_Dictionary, PDFOP_BeginImage,
+ PDFOP_BeginMarkedContent, PDFOP_BeginText,
+ PDFOP_BeginSectionUndefined, PDFOP_CurveTo_123,
+ PDFOP_ConcatMatrix, PDFOP_SetColorSpace_Fill,
+ PDFOP_SetColorSpace_Stroke, PDFOP_SetDash,
+ PDFOP_SetCharWidth, PDFOP_SetCachedDevice,
+ PDFOP_ExecuteXObject, PDFOP_MarkPlace_Dictionary,
+ PDFOP_EndImage, PDFOP_EndMarkedContent,
+ PDFOP_EndText, PDFOP_EndSectionUndefined,
+ PDFOP_FillPath, PDFOP_FillPathOld,
+ PDFOP_EOFillPath, PDFOP_SetGray_Fill,
+ PDFOP_SetGray_Stroke, PDFOP_SetExtendGraphState,
+ PDFOP_ClosePath, PDFOP_SetFlat,
+ PDFOP_BeginImageData, PDFOP_SetLineJoin,
+ PDFOP_SetLineCap, PDFOP_SetCMYKColor_Fill,
+ PDFOP_SetCMYKColor_Stroke, PDFOP_LineTo,
+ PDFOP_MoveTo, PDFOP_SetMiterLimit,
+ PDFOP_MarkPlace, PDFOP_EndPath,
+ PDFOP_SaveGraphState, PDFOP_RestoreGraphState,
+ PDFOP_Rectangle, PDFOP_SetRGBColor_Fill,
+ PDFOP_SetRGBColor_Stroke, PDFOP_SetRenderIntent,
+ PDFOP_CloseStrokePath, PDFOP_StrokePath,
+ PDFOP_SetColor_Fill, PDFOP_SetColor_Stroke,
+ PDFOP_SetColorPS_Fill, PDFOP_SetColorPS_Stroke,
+ PDFOP_ShadeFill, PDFOP_SetCharSpace,
+ PDFOP_MoveTextPoint, PDFOP_MoveTextPoint_SetLeading,
+ PDFOP_SetFont, PDFOP_ShowText,
+ PDFOP_ShowText_Positioning, PDFOP_SetTextLeading,
+ PDFOP_SetTextMatrix, PDFOP_SetTextRenderMode,
+ PDFOP_SetTextRise, PDFOP_SetWordSpace,
+ PDFOP_SetHorzScale, PDFOP_MoveToNextLine,
+ PDFOP_CurveTo_23, PDFOP_SetLineWidth,
+ PDFOP_Clip, PDFOP_EOClip,
+ PDFOP_CurveTo_13, PDFOP_NextLineShowText,
+ PDFOP_NextLineShowText_Space, PDFOP_Invalid
+} PDFOP;
+#define PARAM_BUF_SIZE 16
+typedef struct {
+ int m_Type;
+ union {
+ struct {
+ FX_BOOL m_bInteger;
+ union {
+ int m_Integer;
+ FX_FLOAT m_Float;
+ };
+ } m_Number;
+ CPDF_Object* m_pObject;
+ struct {
+ int m_Len;
+ char m_Buffer[32];
+ } m_Name;
+ };
+} _ContentParam;
+#if defined(_FPDFAPI_MINI_)
+#define _FPDF_MAX_FORM_LEVEL_ 17
+#else
+#define _FPDF_MAX_FORM_LEVEL_ 30
+#endif
+#define _FPDF_MAX_TYPE3_FORM_LEVEL_ 4
+#define _FPDF_MAX_OBJECT_STACK_SIZE_ 512
+class CPDF_StreamContentParser : public CFX_Object
+{
+public:
+ CPDF_StreamContentParser();
+ ~CPDF_StreamContentParser();
+ FX_BOOL Initialize();
+ void PrepareParse(CPDF_Document* pDoc, CPDF_Dictionary* pPageResources, CPDF_Dictionary* pParentResources,
+ CFX_AffineMatrix* pmtContentToUser,
+ CPDF_PageObjects* pObjList, CPDF_Dictionary* pResources,
+ CFX_FloatRect* pBBox, CPDF_ParseOptions* pOptions,
+ CPDF_AllStates* pAllStates, int level);
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pPageResources;
+ CPDF_Dictionary* m_pParentResources;
+ CPDF_PageObjects* m_pObjectList;
+ CPDF_Dictionary* m_pResources;
+ int m_Level;
+ CFX_AffineMatrix m_mtContentToUser;
+ CFX_FloatRect m_BBox;
+ CPDF_ParseOptions m_Options;
+ _ContentParam m_ParamBuf1[PARAM_BUF_SIZE];
+ FX_DWORD m_ParamStartPos;
+ FX_DWORD m_ParamCount;
+ void AddNumberParam(FX_LPCSTR str, int len);
+ void AddObjectParam(CPDF_Object* pObj);
+ void AddNameParam(FX_LPCSTR name, int size);
+ int GetNextParamPos();
+ void ClearAllParams();
+ CPDF_Object* GetObject(FX_DWORD index);
+ CFX_ByteString GetString(FX_DWORD index);
+ FX_FLOAT GetNumber(FX_DWORD index);
+ FX_FLOAT GetNumber16(FX_DWORD index);
+ int GetInteger(FX_DWORD index)
+ {
+ return (FX_INT32)(GetNumber(index));
+ }
+ FX_BOOL OnOperator(FX_LPCSTR op);
+ void BigCaseCaller(int index);
+ FX_BOOL m_bAbort;
+#ifndef _FPDFAPI_MINI_
+ CPDF_StreamParser* m_pSyntax;
+ FX_DWORD GetParsePos()
+ {
+ return m_pSyntax->GetPos();
+ }
+#else
+ int m_WordState;
+ void InputData(FX_LPCBYTE src_buf, FX_DWORD src_size);
+ void Finish();
+ void StartArray();
+ void EndArray();
+ void StartDict();
+ void EndDict();
+ void EndName();
+ void EndNumber();
+ void EndKeyword();
+ void EndHexString();
+ void EndString();
+ void EndImageDict();
+ void EndInlineImage();
+ FX_LPBYTE m_pWordBuf;
+ FX_DWORD m_WordSize;
+ CFX_BinaryBuf m_StringBuf;
+ int m_StringLevel, m_StringState, m_EscCode;
+ void AddContainer(CPDF_Object* pObject);
+ FX_BOOL SetToCurObj(CPDF_Object* pObject);
+ FX_LPBYTE m_pDictName;
+ FX_BOOL m_bDictName;
+ CPDF_Object** m_pObjectStack;
+ FX_BOOL* m_pObjectState;
+ FX_DWORD m_ObjectSize;
+ int m_InlineImageState;
+ FX_BYTE m_InlineWhiteChar;
+ CFX_BinaryBuf m_ImageSrcBuf;
+ FX_LPBYTE m_pStreamBuf;
+#endif
+ CPDF_AllStates* m_pCurStates;
+ CPDF_ContentMark m_CurContentMark;
+ CFX_PtrArray m_ClipTextList;
+ CPDF_TextObject* m_pLastTextObject;
+ FX_FLOAT m_DefFontSize;
+ void AddTextObject(CFX_ByteString* pText, FX_FLOAT fInitKerning, FX_FLOAT* pKerning, int count);
+
+ void ConvertUserSpace(FX_FLOAT& x, FX_FLOAT& y);
+ void ConvertTextSpace(FX_FLOAT& x, FX_FLOAT& y);
+ void OnChangeTextMatrix();
+#ifndef _FPDFAPI_MINI_
+ FX_DWORD Parse(FX_LPCBYTE pData, FX_DWORD dwSize, FX_DWORD max_cost);
+ void ParsePathObject();
+#endif
+ int m_CompatCount;
+ FX_PATHPOINT* m_pPathPoints;
+ int m_PathPointCount;
+ int m_PathAllocSize;
+ FX_FLOAT m_PathStartX, m_PathStartY;
+ FX_FLOAT m_PathCurrentX, m_PathCurrentY;
+ int m_PathClipType;
+ void AddPathPoint(FX_FLOAT x, FX_FLOAT y, int flag);
+ void AddPathRect(FX_FLOAT x, FX_FLOAT y, FX_FLOAT w, FX_FLOAT h);
+ void AddPathObject(int FillType, FX_BOOL bStroke);
+ CPDF_ImageObject* AddImage(CPDF_Stream* pStream, CPDF_Image* pImage, FX_BOOL bInline);
+ void AddDuplicateImage();
+ void AddForm(CPDF_Stream*);
+ CFX_ByteString m_LastImageName;
+ CPDF_Image* m_pLastImage;
+ CFX_BinaryBuf m_LastImageDict, m_LastImageData;
+ CPDF_Dictionary* m_pLastImageDict;
+ CPDF_Dictionary* m_pLastCloneImageDict;
+ FX_BOOL m_bReleaseLastDict;
+ FX_BOOL m_bSameLastDict;
+ void SetGraphicStates(CPDF_PageObject* pObj, FX_BOOL bColor, FX_BOOL bText, FX_BOOL bGraph);
+ FX_BOOL m_bColored;
+ FX_FLOAT m_Type3Data[6];
+ FX_BOOL m_bResourceMissing;
+ CFX_PtrArray m_StateStack;
+ void SaveStates(CPDF_AllStates*);
+ void RestoreStates(CPDF_AllStates*);
+ CPDF_Font* FindFont(const CFX_ByteString& name);
+ CPDF_ColorSpace* FindColorSpace(const CFX_ByteString& name);
+ CPDF_Pattern* FindPattern(const CFX_ByteString& name, FX_BOOL bShading);
+ CPDF_Object* FindResourceObj(FX_BSTR type, const CFX_ByteString& name);
+ void Handle_CloseFillStrokePath();
+ void Handle_FillStrokePath();
+ void Handle_CloseEOFillStrokePath();
+ void Handle_EOFillStrokePath();
+ void Handle_BeginMarkedContent_Dictionary();
+ void Handle_BeginImage();
+ void Handle_BeginMarkedContent();
+ void Handle_BeginText();
+ void Handle_BeginSectionUndefined();
+ void Handle_CurveTo_123();
+ void Handle_ConcatMatrix();
+ void Handle_SetColorSpace_Fill();
+ void Handle_SetColorSpace_Stroke();
+ void Handle_SetDash();
+ void Handle_SetCharWidth();
+ void Handle_SetCachedDevice();
+ void Handle_ExecuteXObject();
+ void Handle_MarkPlace_Dictionary();
+ void Handle_EndImage();
+ void Handle_EndMarkedContent();
+ void Handle_EndText();
+ void Handle_EndSectionUndefined();
+ void Handle_FillPath();
+ void Handle_FillPathOld();
+ void Handle_EOFillPath();
+ void Handle_SetGray_Fill();
+ void Handle_SetGray_Stroke();
+ void Handle_SetExtendGraphState();
+ void Handle_ClosePath();
+ void Handle_SetFlat();
+ void Handle_BeginImageData();
+ void Handle_SetLineJoin();
+ void Handle_SetLineCap();
+ void Handle_SetCMYKColor_Fill();
+ void Handle_SetCMYKColor_Stroke();
+ void Handle_LineTo();
+ void Handle_MoveTo();
+ void Handle_SetMiterLimit();
+ void Handle_MarkPlace();
+ void Handle_EndPath();
+ void Handle_SaveGraphState();
+ void Handle_RestoreGraphState();
+ void Handle_Rectangle();
+ void Handle_SetRGBColor_Fill();
+ void Handle_SetRGBColor_Stroke();
+ void Handle_SetRenderIntent();
+ void Handle_CloseStrokePath();
+ void Handle_StrokePath();
+ void Handle_SetColor_Fill();
+ void Handle_SetColor_Stroke();
+ void Handle_SetColorPS_Fill();
+ void Handle_SetColorPS_Stroke();
+ void Handle_ShadeFill();
+ void Handle_SetCharSpace();
+ void Handle_MoveTextPoint();
+ void Handle_MoveTextPoint_SetLeading();
+ void Handle_SetFont();
+ void Handle_ShowText();
+ void Handle_ShowText_Positioning();
+ void Handle_SetTextLeading();
+ void Handle_SetTextMatrix();
+ void Handle_SetTextRenderMode();
+ void Handle_SetTextRise();
+ void Handle_SetWordSpace();
+ void Handle_SetHorzScale();
+ void Handle_MoveToNextLine();
+ void Handle_CurveTo_23();
+ void Handle_SetLineWidth();
+ void Handle_Clip();
+ void Handle_EOClip();
+ void Handle_CurveTo_13();
+ void Handle_NextLineShowText();
+ void Handle_NextLineShowText_Space();
+ void Handle_Invalid();
+};
+class CPDF_ContentParser : public CFX_Object
+{
+public:
+ CPDF_ContentParser();
+ ~CPDF_ContentParser();
+ typedef enum { Ready, ToBeContinued, Done } ParseStatus;
+ ParseStatus GetStatus()
+ {
+ return m_Status;
+ }
+ void Start(CPDF_Page* pPage, CPDF_ParseOptions* pOptions);
+ void Start(CPDF_Form* pForm, CPDF_AllStates* pGraphicStates, CFX_AffineMatrix* pParentMatrix,
+ CPDF_Type3Char* pType3Char, CPDF_ParseOptions* pOptions, int level);
+ void Continue(IFX_Pause* pPause);
+ int EstimateProgress();
+protected:
+ void Clear();
+ ParseStatus m_Status;
+ CPDF_PageObjects* m_pObjects;
+ FX_BOOL m_bForm;
+ CPDF_ParseOptions m_Options;
+ CPDF_Type3Char* m_pType3Char;
+ int m_InternalStage;
+ CPDF_StreamAcc* m_pSingleStream;
+ CPDF_StreamAcc** m_pStreamArray;
+ FX_DWORD m_nStreams;
+ FX_LPBYTE m_pData;
+ FX_DWORD m_Size;
+ class CPDF_StreamContentParser* m_pParser;
+ FX_DWORD m_CurrentOffset;
+ CPDF_StreamFilter* m_pStreamFilter;
+};
+class CPDF_AllStates : public CPDF_GraphicStates
+{
+public:
+ CPDF_AllStates();
+ ~CPDF_AllStates();
+ void Copy(const CPDF_AllStates& src);
+ void ProcessExtGS(CPDF_Dictionary* pGS, CPDF_StreamContentParser* pParser);
+ void SetLineDash(CPDF_Array*, FX_FLOAT, FX_FLOAT scale);
+ CFX_AffineMatrix m_TextMatrix, m_CTM, m_ParentMatrix;
+ FX_FLOAT m_TextX, m_TextY, m_TextLineX, m_TextLineY;
+ FX_FLOAT m_TextLeading, m_TextRise, m_TextHorzScale;
+};
+template <class ObjClass> class CPDF_CountedObject : public CFX_Object
+{
+public:
+ ObjClass m_Obj;
+ FX_DWORD m_nCount;
+};
+typedef CFX_MapPtrTemplate<CPDF_Dictionary*, CPDF_CountedObject<CPDF_Font*>*> CPDF_FontMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_ColorSpace*>*> CPDF_ColorSpaceMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_Pattern*>*> CPDF_PatternMap;
+typedef CFX_MapPtrTemplate<FX_DWORD, CPDF_CountedObject<CPDF_Image*>*> CPDF_ImageMap;
+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_IccProfile*>*> CPDF_IccProfileMap;
+typedef CFX_MapPtrTemplate<CPDF_Stream*, CPDF_CountedObject<CPDF_StreamAcc*>*> CPDF_FontFileMap;
+template <class KeyType, class ValueType>
+KeyType PDF_DocPageData_FindValue(const CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, ValueType findValue, CPDF_CountedObject<ValueType>*& findData)
+{
+ FX_POSITION pos = map.GetStartPosition();
+ while (pos) {
+ KeyType findKey;
+ map.GetNextAssoc(pos, findKey, findData);
+ if (findData->m_Obj == findValue) {
+ return findKey;
+ }
+ }
+ findData = NULL;
+ return (KeyType)(FX_UINTPTR)NULL;
+}
+template <class KeyType, class ValueType>
+FX_BOOL PDF_DocPageData_Release(CFX_MapPtrTemplate<KeyType, CPDF_CountedObject<ValueType>*> &map, KeyType findKey, ValueType findValue, FX_BOOL bForce = FALSE)
+{
+ if (!findKey && !findValue) {
+ return FALSE;
+ }
+ CPDF_CountedObject<ValueType>* findData = NULL;
+ if (!findKey) {
+ findKey = PDF_DocPageData_FindValue<KeyType, ValueType>(map, findValue, findData);
+ } else if (!map.Lookup(findKey, findData)) {
+ return FALSE;
+ }
+ if (findData && ((-- findData->m_nCount) == 0 || bForce)) {
+ delete findData->m_Obj;
+ delete findData;
+ map.RemoveKey(findKey);
+ return TRUE;
+ }
+ return FALSE;
+}
+class CPDF_DocPageData : public CFX_Object
+{
+public:
+ CPDF_DocPageData(CPDF_Document *pPDFDoc);
+ ~CPDF_DocPageData();
+ void Clear(FX_BOOL bRelease = FALSE);
+ CPDF_Font* GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly);
+ CPDF_Font* GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding);
+ void ReleaseFont(CPDF_Dictionary* pFontDict);
+ CPDF_ColorSpace* GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources);
+ CPDF_ColorSpace* GetCopiedColorSpace(CPDF_Object* pCSObj);
+ void ReleaseColorSpace(CPDF_Object* pColorSpace);
+ CPDF_Pattern* GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix);
+ void ReleasePattern(CPDF_Object* pPatternObj);
+ CPDF_Image* GetImage(CPDF_Object* pImageStream);
+ void ReleaseImage(CPDF_Object* pImageStream);
+ CPDF_IccProfile* GetIccProfile(CPDF_Stream* pIccProfileStream, FX_INT32 nComponents);
+ void ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile);
+ CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream);
+ void ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce = FALSE);
+ CPDF_Document* m_pPDFDoc;
+ CPDF_FontMap m_FontMap;
+ CPDF_ColorSpaceMap m_ColorSpaceMap;
+ CPDF_PatternMap m_PatternMap;
+ CPDF_ImageMap m_ImageMap;
+ CPDF_IccProfileMap m_IccProfileMap;
+ CFX_MapByteStringToPtr m_HashProfileMap;
+ CPDF_FontFileMap m_FontFileMap;
+};
+class CPDF_Function : public CFX_Object
+{
+public:
+ static CPDF_Function* Load(CPDF_Object* pFuncObj);
+ virtual ~CPDF_Function();
+ FX_BOOL Call(FX_FLOAT* inputs, int ninputs, FX_FLOAT* results, int& nresults) const;
+ int CountInputs()
+ {
+ return m_nInputs;
+ }
+ int CountOutputs()
+ {
+ return m_nOutputs;
+ }
+protected:
+ CPDF_Function();
+ int m_nInputs, m_nOutputs;
+ FX_FLOAT* m_pDomains;
+ FX_FLOAT* m_pRanges;
+ FX_BOOL Init(CPDF_Object* pObj);
+ virtual FX_BOOL v_Init(CPDF_Object* pObj) = 0;
+ virtual FX_BOOL v_Call(FX_FLOAT* inputs, FX_FLOAT* results) const = 0;
+};
+class CPDF_IccProfile : public CFX_Object
+{
+public:
+ CPDF_IccProfile(FX_LPCBYTE pData, FX_DWORD dwSize, int nComponents);
+ ~CPDF_IccProfile();
+ FX_BOOL m_bsRGB;
+ FX_LPVOID m_pTransform;
+};
+class CPDF_DeviceCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_DeviceCS(int family);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ FX_BOOL SetRGB(FX_FLOAT* pBuf, FX_FLOAT R, FX_FLOAT G, FX_FLOAT B) const;
+ FX_BOOL v_GetCMYK(FX_FLOAT* pBuf, FX_FLOAT& c, FX_FLOAT& m, FX_FLOAT& y, FX_FLOAT& k) const;
+ FX_BOOL v_SetCMYK(FX_FLOAT* pBuf, FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k) const;
+ virtual void TranslateImageLine(FX_LPBYTE pDestBuf, FX_LPCBYTE pSrcBuf, int pixels, int image_width, int image_height, FX_BOOL bTransMask = FALSE) const;
+};
+class CPDF_PatternCS : public CPDF_ColorSpace
+{
+public:
+ CPDF_PatternCS();
+ ~CPDF_PatternCS();
+ virtual FX_BOOL v_Load(CPDF_Document* pDoc, CPDF_Array* pArray);
+ virtual FX_BOOL GetRGB(FX_FLOAT* pBuf, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B) const;
+ virtual CPDF_ColorSpace* GetBaseCS() const
+ {
+ return m_pBaseCS;
+ }
+ CPDF_ColorSpace* m_pBaseCS;
+};
+#define MAX_PAGE_OBJECTS_UNIFY_NAMING 4096
+class CPDF_ResourceNaming : public CFX_Object
+{
+public:
+ struct _NamingState : public CFX_Object {
+ CFX_ByteString m_Prefix;
+ int m_nIndex;
+ };
+ ~CPDF_ResourceNaming();
+ CFX_ByteString GetName(const CPDF_Dictionary* pResList, FX_LPCSTR szType);
+protected:
+ CFX_MapByteStringToPtr m_NamingCache;
+};
diff --git a/core/src/fpdfapi/fpdf_parser/filters_int.h b/core/src/fpdfapi/fpdf_parser/filters_int.h
new file mode 100644
index 0000000000..fa7d7db76e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/filters_int.h
@@ -0,0 +1,119 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+class CPDF_DecryptFilter : public CFX_DataFilter
+{
+public:
+ CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum);
+ virtual ~CPDF_DecryptFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
+ CPDF_CryptoHandler* m_pCryptoHandler;
+ FX_LPVOID m_pContext;
+ FX_DWORD m_ObjNum, m_GenNum;
+};
+class CPDF_FlateFilter : public CFX_DataFilter
+{
+public:
+ CPDF_FlateFilter();
+ virtual ~CPDF_FlateFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ void* m_pContext;
+ FX_BYTE m_DestBuffer[FPDF_FILTER_BUFFER_SIZE];
+};
+class CPDF_LzwFilter : public CFX_DataFilter
+{
+public:
+ CPDF_LzwFilter(FX_BOOL bEarlyChange);
+ virtual ~CPDF_LzwFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ FX_BOOL m_bEarlyChange;
+ FX_DWORD m_CodeArray[5021];
+ FX_DWORD m_nCodes;
+ FX_DWORD m_CodeLen;
+ FX_DWORD m_OldCode;
+ FX_BYTE m_LastChar;
+ FX_DWORD m_nLeftBits, m_LeftBits;
+ FX_BYTE m_DecodeStack[4000];
+ FX_DWORD m_StackLen;
+ void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
+ void DecodeString(FX_DWORD code);
+};
+class CPDF_PredictorFilter : public CFX_DataFilter
+{
+public:
+ CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols);
+ virtual ~CPDF_PredictorFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ FX_BOOL m_bTiff;
+ FX_DWORD m_Pitch, m_Bpp;
+ FX_LPBYTE m_pRefLine, m_pCurLine;
+ FX_DWORD m_iLine, m_LineInSize;
+};
+class CPDF_AsciiHexFilter : public CFX_DataFilter
+{
+public:
+ CPDF_AsciiHexFilter();
+ virtual ~CPDF_AsciiHexFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ int m_FirstDigit;
+};
+class CPDF_Ascii85Filter : public CFX_DataFilter
+{
+public:
+ CPDF_Ascii85Filter();
+ virtual ~CPDF_Ascii85Filter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ int m_CharCount;
+ FX_DWORD m_CurDWord;
+};
+class CPDF_RunLenFilter : public CFX_DataFilter
+{
+public:
+ CPDF_RunLenFilter();
+ virtual ~CPDF_RunLenFilter() {}
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ int m_State;
+ FX_DWORD m_Count;
+};
+class CPDF_JpegFilter : public CFX_DataFilter
+{
+public:
+ CPDF_JpegFilter();
+ virtual ~CPDF_JpegFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) {}
+ void* m_pContext;
+ CFX_BinaryBuf m_InputBuf;
+ FX_LPBYTE m_pScanline;
+ int m_Pitch, m_Height, m_Width, m_nComps, m_iLine;
+ FX_BOOL m_bGotHeader;
+};
+class CPDF_FaxFilter : public CFX_DataFilter
+{
+public:
+ CPDF_FaxFilter();
+ virtual ~CPDF_FaxFilter();
+ FX_BOOL Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns);
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf);
+ int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
+ int m_nRows, m_nColumns, m_Pitch, m_iRow;
+ FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
+ CFX_BinaryBuf m_InputBuf;
+ int m_InputBitPos;
+ void ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
+ CFX_BinaryBuf& dest_buf);
+ FX_BOOL ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos);
+};
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
new file mode 100644
index 0000000000..74e81d40fd
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -0,0 +1,533 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include <limits.h>
+#define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
+FX_DWORD _A85Decode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ dest_size = 0;
+ dest_buf = NULL;
+ if (src_size == 0) {
+ return 0;
+ }
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD zcount = 0;
+ FX_DWORD pos = 0;
+ while (pos < src_size) {
+ FX_BYTE ch = src_buf[pos];
+ if (ch < '!' && ch != '\n' && ch != '\r' && ch != ' ' && ch != '\t') {
+ break;
+ }
+ if (ch == 'z') {
+ zcount ++;
+ } else if (ch > 'u') {
+ break;
+ }
+ pos ++;
+ }
+ if (pos == 0) {
+ return 0;
+ }
+ if (zcount > UINT_MAX / 4) {
+ return (FX_DWORD) - 1;
+ }
+ if (zcount * 4 > UINT_MAX - (pos - zcount)) {
+ return (FX_DWORD) - 1;
+ }
+ dest_buf = FX_Alloc(FX_BYTE, zcount * 4 + (pos - zcount));
+ if (dest_buf == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ int state = 0, res = 0;
+ pos = dest_size = 0;
+ while (pos < src_size) {
+ FX_BYTE ch = src_buf[pos++];
+ if (ch == '\n' || ch == '\r' || ch == ' ' || ch == '\t') {
+ continue;
+ }
+ if (ch == 'z') {
+ FXSYS_memset32(dest_buf + dest_size, 0, 4);
+ state = 0;
+ res = 0;
+ dest_size += 4;
+ } else {
+ if (ch < '!' || ch > 'u') {
+ break;
+ }
+ res = res * 85 + ch - 33;
+ state ++;
+ if (state == 5) {
+ for (int i = 0; i < 4; i ++) {
+ dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
+ }
+ state = 0;
+ res = 0;
+ }
+ }
+ }
+ if (state) {
+ int i;
+ for (i = state; i < 5; i ++) {
+ res = res * 85 + 84;
+ }
+ for (i = 0; i < state - 1; i ++) {
+ dest_buf[dest_size++] = (FX_BYTE)(res >> (3 - i) * 8);
+ }
+ }
+ if (pos < src_size && src_buf[pos] == '>') {
+ pos ++;
+ }
+ return pos;
+}
+FX_DWORD _HexDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD i;
+ for (i = 0; i < src_size; i ++)
+ if (src_buf[i] == '>') {
+ break;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, i / 2 + 1);
+ dest_size = 0;
+ FX_BOOL bFirstDigit = TRUE;
+ for (i = 0; i < src_size; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch == ' ' || ch == '\n' || ch == '\t' || ch == '\r') {
+ continue;
+ }
+ int digit;
+ if (ch <= '9' && ch >= '0') {
+ digit = ch - '0';
+ } else if (ch <= 'f' && ch >= 'a') {
+ digit = ch - 'a' + 10;
+ } else if (ch <= 'F' && ch >= 'A') {
+ digit = ch - 'A' + 10;
+ } else if (ch == '>') {
+ i ++;
+ break;
+ } else {
+ continue;
+ }
+ if (bFirstDigit) {
+ dest_buf[dest_size] = digit * 16;
+ } else {
+ dest_buf[dest_size ++] += digit;
+ }
+ bFirstDigit = !bFirstDigit;
+ }
+ if (!bFirstDigit) {
+ dest_size ++;
+ }
+ return i;
+}
+FX_DWORD RunLengthDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ FX_DWORD orig_size = dest_size;
+ FX_DWORD i = 0;
+ FX_DWORD old;
+ dest_size = 0;
+ while (i < src_size) {
+ if (src_buf[i] < 128) {
+ old = dest_size;
+ dest_size += src_buf[i] + 1;
+ if (dest_size < old) {
+ return (FX_DWORD) - 1;
+ }
+ i += src_buf[i] + 2;
+ } else if (src_buf[i] > 128) {
+ old = dest_size;
+ dest_size += 257 - src_buf[i];
+ if (dest_size < old) {
+ return (FX_DWORD) - 1;
+ }
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ if (dest_size >= _STREAM_MAX_SIZE_) {
+ return -1;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ if (!dest_buf) {
+ return -1;
+ }
+ i = 0;
+ int dest_count = 0;
+ while (i < src_size) {
+ if (src_buf[i] < 128) {
+ FX_DWORD copy_len = src_buf[i] + 1;
+ FX_DWORD buf_left = src_size - i - 1;
+ if (buf_left < copy_len) {
+ FX_DWORD delta = copy_len - buf_left;
+ copy_len = buf_left;
+ FXSYS_memset8(dest_buf + dest_count + copy_len, '\0', delta);
+ }
+ FXSYS_memcpy32(dest_buf + dest_count, src_buf + i + 1, copy_len);
+ dest_count += src_buf[i] + 1;
+ i += src_buf[i] + 2;
+ } else if (src_buf[i] > 128) {
+ int fill = 0;
+ if (i < src_size - 1) {
+ fill = src_buf[i + 1];
+ }
+ FXSYS_memset8(dest_buf + dest_count, fill, 257 - src_buf[i]);
+ dest_count += 257 - src_buf[i];
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ FX_DWORD ret = i + 1;
+ if (ret > src_size) {
+ ret = src_size;
+ }
+ return ret;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams)
+{
+ int K = 0;
+ FX_BOOL EndOfLine = FALSE;
+ FX_BOOL ByteAlign = FALSE;
+ FX_BOOL BlackIs1 = FALSE;
+ FX_BOOL Columns = 1728;
+ FX_BOOL Rows = 0;
+ if (pParams) {
+ K = pParams->GetInteger(FX_BSTRC("K"));
+ EndOfLine = pParams->GetInteger(FX_BSTRC("EndOfLine"));
+ ByteAlign = pParams->GetInteger(FX_BSTRC("EncodedByteAlign"));
+ BlackIs1 = pParams->GetInteger(FX_BSTRC("BlackIs1"));
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1728);
+ Rows = pParams->GetInteger(FX_BSTRC("Rows"));
+ if (Rows > USHRT_MAX) {
+ Rows = 0;
+ }
+ if (Columns <= 0 || Rows < 0 || Columns > USHRT_MAX || Rows > USHRT_MAX) {
+ return NULL;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFaxModule()->CreateDecoder(src_buf, src_size, width, height,
+ K, EndOfLine, ByteAlign, BlackIs1, Columns, Rows);
+}
+static FX_BOOL CheckFlateDecodeParams(int Colors, int BitsPerComponent, int Columns)
+{
+ if (Columns < 0) {
+ return FALSE;
+ }
+ int check = Columns;
+ if (Colors < 0 || (check > 0 && Colors > INT_MAX / check)) {
+ return FALSE;
+ }
+ check *= Colors;
+ if (BitsPerComponent < 0 ||
+ (check > 0 && BitsPerComponent > INT_MAX / check)) {
+ return FALSE;
+ }
+ check *= BitsPerComponent;
+ if (check > INT_MAX - 7) {
+ return FALSE;
+ }
+ return TRUE;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams)
+{
+ int predictor = 0;
+ FX_BOOL bEarlyChange = TRUE;
+ int Colors = 0, BitsPerComponent = 0, Columns = 0;
+ if (pParams) {
+ predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+ bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+ Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
+ BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
+ if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
+ return NULL;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFlateModule()->CreateDecoder(src_buf, src_size, width, height,
+ nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
+}
+FX_DWORD FPDFAPI_FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, CPDF_Dictionary* pParams,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ int predictor = 0;
+ FX_BOOL bEarlyChange = TRUE;
+ int Colors = 0, BitsPerComponent = 0, Columns = 0;
+ if (pParams) {
+ predictor = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("Predictor"));
+ bEarlyChange = ((CPDF_Dictionary*)pParams)->GetInteger(FX_BSTRC("EarlyChange"), 1);
+ Colors = pParams->GetInteger(FX_BSTRC("Colors"), 1);
+ BitsPerComponent = pParams->GetInteger(FX_BSTRC("BitsPerComponent"), 8);
+ Columns = pParams->GetInteger(FX_BSTRC("Columns"), 1);
+ if (!CheckFlateDecodeParams(Colors, BitsPerComponent, Columns)) {
+ return (FX_DWORD) - 1;
+ }
+ }
+ return CPDF_ModuleMgr::Get()->GetFlateModule()->FlateOrLZWDecode(bLZW, src_buf, src_size,
+ bEarlyChange, predictor, Colors, BitsPerComponent, Columns, estimated_size,
+ dest_buf, dest_size);
+}
+FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
+ CPDF_Dictionary*& pImageParms, FX_DWORD last_estimated_size, FX_BOOL bImageAcc)
+
+{
+ CPDF_Object* pDecoder = pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pDecoder == NULL || (pDecoder->GetType() != PDFOBJ_ARRAY && pDecoder->GetType() != PDFOBJ_NAME)) {
+ return FALSE;
+ }
+ CPDF_Object* pParams = pDict->GetElementValue(FX_BSTRC("DecodeParms"));
+ CFX_ByteStringArray DecoderList;
+ CFX_PtrArray ParamList;
+ if (pDecoder->GetType() == PDFOBJ_ARRAY) {
+ if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
+ pParams = NULL;
+ }
+ CPDF_Array* pDecoders = (CPDF_Array*)pDecoder;
+ for (FX_DWORD i = 0; i < pDecoders->GetCount(); i ++) {
+ CFX_ByteStringC str = pDecoders->GetConstString(i);
+ DecoderList.Add(str);
+ if (pParams) {
+ ParamList.Add(((CPDF_Array*)pParams)->GetDict(i));
+ } else {
+ ParamList.Add(NULL);
+ }
+ }
+ } else {
+ DecoderList.Add(pDecoder->GetConstString());
+ ParamList.Add(pParams->GetDict());
+ }
+ FX_LPBYTE last_buf = (FX_LPBYTE)src_buf;
+ FX_DWORD last_size = src_size;
+ for (int i = 0; i < DecoderList.GetSize(); i ++) {
+ int estimated_size = i == DecoderList.GetSize() - 1 ? last_estimated_size : 0;
+ CFX_ByteString decoder = DecoderList[i];
+ CPDF_Dictionary* pParam = (CPDF_Dictionary*)ParamList[i];
+ FX_LPBYTE new_buf = NULL;
+ FX_DWORD new_size = (FX_DWORD) - 1;
+ int offset = -1;
+ if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) {
+ if (bImageAcc && i == DecoderList.GetSize() - 1) {
+ ImageEncoding = FX_BSTRC("FlateDecode");
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ pImageParms = pParam;
+ return TRUE;
+ } else {
+ offset = FPDFAPI_FlateOrLZWDecode(FALSE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
+ }
+ } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) {
+ offset = FPDFAPI_FlateOrLZWDecode(TRUE, last_buf, last_size, pParam, estimated_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) {
+ offset = _A85Decode(last_buf, last_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) {
+ offset = _HexDecode(last_buf, last_size, new_buf, new_size);
+ } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) {
+ if (bImageAcc && i == DecoderList.GetSize() - 1) {
+ ImageEncoding = FX_BSTRC("RunLengthDecode");
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ pImageParms = pParam;
+ return TRUE;
+ }
+ offset = RunLengthDecode(last_buf, last_size, new_buf, new_size);
+ } else {
+ if (decoder == FX_BSTRC("DCT")) {
+ decoder = "DCTDecode";
+ } else if (decoder == FX_BSTRC("CCF")) {
+ decoder = "CCITTFaxDecode";
+ } else if (decoder == FX_BSTRC("Crypt")) {
+ continue;
+ }
+ ImageEncoding = decoder;
+ pImageParms = pParam;
+ dest_buf = (FX_LPBYTE)last_buf;
+ dest_size = last_size;
+ return TRUE;
+ }
+ if (last_buf != src_buf) {
+ FX_Free(last_buf);
+ }
+ if (offset == -1) {
+ return FALSE;
+ }
+ last_buf = new_buf;
+ last_size = new_size;
+ }
+ ImageEncoding = "";
+ pImageParms = NULL;
+ dest_buf = last_buf;
+ dest_size = last_size;
+ return TRUE;
+}
+extern const FX_WORD PDFDocEncoding[256] = {
+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009,
+ 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, 0x0012, 0x0013,
+ 0x0014, 0x0015, 0x0016, 0x0017, 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db,
+ 0x02da, 0x02dc, 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003a, 0x003b,
+ 0x003c, 0x003d, 0x003e, 0x003f, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,
+ 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
+ 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060, 0x0061, 0x0062, 0x0063,
+ 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d,
+ 0x006e, 0x006f, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, 0x2022, 0x2020,
+ 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030,
+ 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141,
+ 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,
+ 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9,
+ 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, 0x00b0, 0x00b1, 0x00b2, 0x00b3,
+ 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd,
+ 0x00be, 0x00bf, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x00d0, 0x00d1,
+ 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db,
+ 0x00dc, 0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5,
+ 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9,
+ 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+CFX_WideString PDF_DecodeText(FX_LPCBYTE src_data, FX_DWORD src_len, CFX_CharMap* pCharMap)
+{
+ CFX_WideString result;
+ if (src_len >= 2 && ((src_data[0] == 0xfe && src_data[1] == 0xff) || (src_data[0] == 0xff && src_data[1] == 0xfe))) {
+ FX_BOOL bBE = src_data[0] == 0xfe;
+ int max_chars = (src_len - 2) / 2;
+ if (!max_chars) {
+ return result;
+ }
+ if (src_data[0] == 0xff) {
+ bBE = !src_data[2];
+ }
+ FX_LPWSTR dest_buf = result.GetBuffer(max_chars);
+ FX_LPCBYTE uni_str = src_data + 2;
+ int dest_pos = 0;
+ for (int i = 0; i < max_chars * 2; i += 2) {
+ FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
+ if (unicode == 0x1b) {
+ i += 2;
+ while (i < max_chars * 2) {
+ FX_WORD unicode = bBE ? (uni_str[i] << 8 | uni_str[i + 1]) : (uni_str[i + 1] << 8 | uni_str[i]);
+ i += 2;
+ if (unicode == 0x1b) {
+ break;
+ }
+ }
+ } else {
+ dest_buf[dest_pos++] = unicode;
+ }
+ }
+ result.ReleaseBuffer(dest_pos);
+ } else if (pCharMap == NULL) {
+ FX_LPWSTR dest_buf = result.GetBuffer(src_len);
+ for (FX_DWORD i = 0; i < src_len; i ++) {
+ dest_buf[i] = PDFDocEncoding[src_data[i]];
+ }
+ result.ReleaseBuffer(src_len);
+ } else {
+ return (*pCharMap->m_GetWideString)(pCharMap, CFX_ByteString((FX_LPCSTR)src_data, src_len));
+ }
+ return result;
+}
+CFX_WideString PDF_DecodeText(const CFX_ByteString& bstr, CFX_CharMap* pCharMap)
+{
+ return PDF_DecodeText((FX_LPCBYTE)(FX_LPCSTR)bstr, bstr.GetLength(), pCharMap);
+}
+CFX_ByteString PDF_EncodeText(FX_LPCWSTR pString, int len, CFX_CharMap* pCharMap)
+{
+ if (len == -1) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pString);
+ }
+ CFX_ByteString result;
+ if (pCharMap == NULL) {
+ FX_LPSTR dest_buf1 = result.GetBuffer(len);
+ int i;
+ for (i = 0; i < len; i ++) {
+ int code;
+ for (code = 0; code < 256; code ++)
+ if (PDFDocEncoding[code] == pString[i]) {
+ break;
+ }
+ if (code == 256) {
+ break;
+ }
+ dest_buf1[i] = code;
+ }
+ result.ReleaseBuffer(i);
+ if (i == len) {
+ return result;
+ }
+ }
+ FX_LPBYTE dest_buf2 = (FX_LPBYTE)result.GetBuffer(len * 2 + 2);
+ dest_buf2[0] = 0xfe;
+ dest_buf2[1] = 0xff;
+ dest_buf2 += 2;
+ for (int i = 0; i < len; i ++) {
+ *dest_buf2++ = pString[i] >> 8;
+ *dest_buf2++ = (FX_BYTE)pString[i];
+ }
+ result.ReleaseBuffer(len * 2 + 2);
+ return result;
+}
+CFX_ByteString PDF_EncodeString(const CFX_ByteString& src, FX_BOOL bHex)
+{
+ CFX_ByteTextBuf result;
+ int srclen = src.GetLength();
+ if (bHex) {
+ result.AppendChar('<');
+ for (int i = 0; i < srclen; i ++) {
+ result.AppendChar("0123456789ABCDEF"[src[i] / 16]);
+ result.AppendChar("0123456789ABCDEF"[src[i] % 16]);
+ }
+ result.AppendChar('>');
+ return result.GetByteString();
+ }
+ result.AppendChar('(');
+ for (int i = 0; i < srclen; i ++) {
+ FX_BYTE ch = src[i];
+ if (ch == ')' || ch == '\\' || ch == '(') {
+ result.AppendChar('\\');
+ } else if (ch == 0x0a) {
+ result << FX_BSTRC("\\n");
+ continue;
+ } else if (ch == 0x0d) {
+ result << FX_BSTRC("\\r");
+ continue;
+ }
+ result.AppendChar(ch);
+ }
+ result.AppendChar(')');
+ return result.GetByteString();
+}
+void FlateEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size);
+ }
+}
+void FlateEncode(FX_LPCBYTE src_buf, FX_DWORD src_size, int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ pEncoders->GetFlateModule()->Encode(src_buf, src_size, predictor, Colors, BitsPerComponent, Columns, dest_buf, dest_size);
+ }
+}
+FX_DWORD FlateDecode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CPDF_ModuleMgr::Get()->GetCodecModule();
+ if (pEncoders) {
+ return pEncoders->GetFlateModule()->FlateOrLZWDecode(FALSE, src_buf, src_size, FALSE, 0, 0, 0, 0, 0, dest_buf, dest_size);
+ }
+ return 0;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
new file mode 100644
index 0000000000..068a60679a
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp
@@ -0,0 +1,398 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+extern FX_LPVOID PDFPreviewInitCache(CPDF_Document* pDoc);
+extern void PDFPreviewClearCache(FX_LPVOID pCache);
+CPDF_Document::CPDF_Document(IPDF_DocParser* pParser) : CPDF_IndirectObjects(pParser)
+{
+ ASSERT(pParser != NULL);
+ m_pRootDict = NULL;
+ m_pInfoDict = NULL;
+ m_bLinearized = FALSE;
+ m_dwFirstPageNo = 0;
+ m_dwFirstPageObjNum = 0;
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+}
+CPDF_DocPageData* CPDF_Document::GetValidatePageData()
+{
+ if (m_pDocPage) {
+ return m_pDocPage;
+ }
+ m_pDocPage = CPDF_ModuleMgr::Get()->GetPageModule()->CreateDocData(this);
+ return m_pDocPage;
+}
+CPDF_DocRenderData* CPDF_Document::GetValidateRenderData()
+{
+ if (m_pDocRender) {
+ return m_pDocRender;
+ }
+ m_pDocRender = CPDF_ModuleMgr::Get()->GetRenderModule()->CreateDocData(this);
+ return m_pDocRender;
+}
+void CPDF_Document::LoadDoc()
+{
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ CPDF_Object* pRootObj = GetIndirectObject(m_pParser->GetRootObjNum());
+ if (pRootObj == NULL) {
+ return;
+ }
+ m_pRootDict = pRootObj->GetDict();
+ if (m_pRootDict == NULL) {
+ return;
+ }
+ CPDF_Object* pInfoObj = GetIndirectObject(m_pParser->GetInfoObjNum());
+ if (pInfoObj) {
+ m_pInfoDict = pInfoObj->GetDict();
+ }
+ CPDF_Array* pIDArray = m_pParser->GetIDArray();
+ if (pIDArray) {
+ m_ID1 = pIDArray->GetString(0);
+ m_ID2 = pIDArray->GetString(1);
+ }
+ m_PageList.SetSize(_GetPageCount());
+}
+void CPDF_Document::LoadAsynDoc(CPDF_Dictionary *pLinearized)
+{
+ m_bLinearized = TRUE;
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ m_pRootDict = GetIndirectObject(m_pParser->GetRootObjNum())->GetDict();
+ if (m_pRootDict == NULL) {
+ return;
+ }
+ m_pInfoDict = GetIndirectObject(m_pParser->GetInfoObjNum())->GetDict();
+ CPDF_Array* pIDArray = m_pParser->GetIDArray();
+ if (pIDArray) {
+ m_ID1 = pIDArray->GetString(0);
+ m_ID2 = pIDArray->GetString(1);
+ }
+ FX_DWORD dwPageCount = 0;
+ CPDF_Object *pCount = pLinearized->GetElement(FX_BSTRC("N"));
+ if (pCount && pCount->GetType() == PDFOBJ_NUMBER) {
+ dwPageCount = pCount->GetInteger();
+ }
+ m_PageList.SetSize(dwPageCount);
+ CPDF_Object *pNo = pLinearized->GetElement(FX_BSTRC("P"));
+ if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageNo = pNo->GetInteger();
+ }
+ CPDF_Object *pObjNum = pLinearized->GetElement(FX_BSTRC("O"));
+ if (pObjNum && pObjNum->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageObjNum = pObjNum->GetInteger();
+ }
+}
+void CPDF_Document::LoadPages()
+{
+ m_PageList.SetSize(_GetPageCount());
+}
+extern void FPDF_TTFaceMapper_ReleaseDoc(CPDF_Document*);
+CPDF_Document::~CPDF_Document()
+{
+ if (m_pDocRender) {
+ CPDF_ModuleMgr::Get()->GetRenderModule()->DestroyDocData(m_pDocRender);
+ }
+ if (m_pDocPage) {
+ CPDF_ModuleMgr::Get()->GetPageModule()->ReleaseDoc(this);
+ CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);
+ }
+}
+#define FX_MAX_PAGE_LEVEL 1024
+CPDF_Dictionary* CPDF_Document::_FindPDFPage(CPDF_Dictionary* pPages, int iPage, int nPagesToGo, int level)
+{
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ if (nPagesToGo == 0) {
+ return pPages;
+ }
+ return NULL;
+ }
+ if (level >= FX_MAX_PAGE_LEVEL) {
+ return NULL;
+ }
+ int nKids = pKidList->GetCount();
+ for (int i = 0; i < nKids; i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ nPagesToGo --;
+ continue;
+ }
+ if (pKid == pPages) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ if (nPagesToGo == 0) {
+ return pKid;
+ }
+ m_PageList.SetAt(iPage - nPagesToGo, pKid->GetObjNum());
+ nPagesToGo --;
+ } else {
+ int nPages = pKid->GetInteger(FX_BSTRC("Count"));
+ if (nPagesToGo < nPages) {
+ return _FindPDFPage(pKid, iPage, nPagesToGo, level + 1);
+ }
+ nPagesToGo -= nPages;
+ }
+ }
+ return NULL;
+}
+CPDF_Dictionary* CPDF_Document::GetPage(int iPage)
+{
+ if (iPage < 0 || iPage >= m_PageList.GetSize()) {
+ return NULL;
+ }
+ if (m_bLinearized && (iPage == (int)m_dwFirstPageNo)) {
+ CPDF_Object* pObj = GetIndirectObject(m_dwFirstPageObjNum);
+ if (pObj && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)pObj;
+ }
+ }
+ int objnum = m_PageList.GetAt(iPage);
+ if (objnum) {
+ CPDF_Object* pObj = GetIndirectObject(objnum);
+ ASSERT(pObj->GetType() == PDFOBJ_DICTIONARY);
+ return (CPDF_Dictionary*)pObj;
+ }
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pPage = _FindPDFPage(pPages, iPage, iPage, 0);
+ if (pPage == NULL) {
+ return NULL;
+ }
+ m_PageList.SetAt(iPage, pPage->GetObjNum());
+ return pPage;
+}
+int CPDF_Document::_FindPageIndex(CPDF_Dictionary* pNode, FX_DWORD& skip_count, FX_DWORD objnum, int& index, int level)
+{
+ if (pNode->KeyExist(FX_BSTRC("Kids"))) {
+ CPDF_Array* pKidList = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return -1;
+ }
+ if (level >= FX_MAX_PAGE_LEVEL) {
+ return -1;
+ }
+ FX_DWORD count = pNode->GetInteger(FX_BSTRC("Count"));
+ if (count <= skip_count) {
+ skip_count -= count;
+ index += count;
+ return -1;
+ }
+ if (count && count == pKidList->GetCount()) {
+ for (FX_DWORD i = 0; i < count; i ++) {
+ CPDF_Reference* pKid = (CPDF_Reference*)pKidList->GetElement(i);
+ if (pKid && pKid->GetType() == PDFOBJ_REFERENCE) {
+ if (pKid->GetRefObjNum() == objnum) {
+ m_PageList.SetAt(index + i, objnum);
+ return index + i;
+ }
+ }
+ }
+ }
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (pKid == pNode) {
+ continue;
+ }
+ int found_index = _FindPageIndex(pKid, skip_count, objnum, index, level + 1);
+ if (found_index >= 0) {
+ return found_index;
+ }
+ }
+ } else {
+ if (objnum == pNode->GetObjNum()) {
+ return index;
+ }
+ if (skip_count) {
+ skip_count--;
+ }
+ index ++;
+ }
+ return -1;
+}
+int CPDF_Document::GetPageIndex(FX_DWORD objnum)
+{
+ FX_DWORD nPages = m_PageList.GetSize();
+ FX_DWORD skip_count = 0;
+ FX_BOOL bSkipped = FALSE;
+ for (FX_DWORD i = 0; i < nPages; i ++) {
+ FX_DWORD objnum1 = m_PageList.GetAt(i);
+ if (objnum1 == objnum) {
+ return i;
+ }
+ if (!bSkipped && objnum1 == 0) {
+ skip_count = i;
+ bSkipped = TRUE;
+ }
+ }
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return -1;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return -1;
+ }
+ int index = 0;
+ return _FindPageIndex(pPages, skip_count, objnum, index);
+}
+int CPDF_Document::GetPageCount() const
+{
+ return m_PageList.GetSize();
+}
+static int _CountPages(CPDF_Dictionary* pPages, int level)
+{
+ if (level > 128) {
+ return 0;
+ }
+ int count = pPages->GetInteger(FX_BSTRC("Count"));
+ if (count > 0 && count < FPDF_PAGE_MAX_NUM) {
+ return count;
+ }
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return 0;
+ }
+ count = 0;
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ count ++;
+ } else {
+ count += _CountPages(pKid, level + 1);
+ }
+ }
+ pPages->SetAtInteger(FX_BSTRC("Count"), count);
+ return count;
+}
+int CPDF_Document::_GetPageCount() const
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return 0;
+ }
+ if (!pPages->KeyExist(FX_BSTRC("Kids"))) {
+ return 1;
+ }
+ return _CountPages(pPages, 0);
+}
+static FX_BOOL _EnumPages(CPDF_Dictionary* pPages, IPDF_EnumPageHandler* pHandler)
+{
+ CPDF_Array* pKidList = pPages->GetArray(FX_BSTRC("Kids"));
+ if (pKidList == NULL) {
+ return pHandler->EnumPage(pPages);
+ }
+ for (FX_DWORD i = 0; i < pKidList->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKidList->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (!pKid->KeyExist(FX_BSTRC("Kids"))) {
+ if (!pHandler->EnumPage(pKid)) {
+ return FALSE;
+ }
+ } else {
+ return _EnumPages(pKid, pHandler);
+ }
+ }
+ return TRUE;
+}
+void CPDF_Document::EnumPages(IPDF_EnumPageHandler* pHandler)
+{
+ CPDF_Dictionary* pRoot = GetRoot();
+ if (pRoot == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pPages = pRoot->GetDict(FX_BSTRC("Pages"));
+ if (pPages == NULL) {
+ return;
+ }
+ _EnumPages(pPages, pHandler);
+}
+FX_BOOL CPDF_Document::IsContentUsedElsewhere(FX_DWORD objnum, CPDF_Dictionary* pThisPageDict)
+{
+ for (int i = 0; i < m_PageList.GetSize(); i ++) {
+ CPDF_Dictionary* pPageDict = GetPage(i);
+ if (pPageDict == pThisPageDict) {
+ continue;
+ }
+ CPDF_Object* pContents = pPageDict->GetElement(FX_BSTRC("Contents"));
+ if (pContents == NULL) {
+ continue;
+ }
+ if (pContents->GetDirectType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pContents->GetDirect();
+ for (FX_DWORD j = 0; j < pArray->GetCount(); j ++) {
+ CPDF_Reference* pRef = (CPDF_Reference*)pArray->GetElement(j);
+ if (pRef->GetRefObjNum() == objnum) {
+ return TRUE;
+ }
+ }
+ } else if (pContents->GetObjNum() == objnum) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_DWORD CPDF_Document::GetUserPermissions(FX_BOOL bCheckRevision) const
+{
+ if (m_pParser == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ return m_pParser->GetPermissions(bCheckRevision);
+}
+FX_BOOL CPDF_Document::IsOwner() const
+{
+ if (m_pParser == NULL) {
+ return TRUE;
+ }
+ return m_pParser->IsOwner();
+}
+FX_BOOL CPDF_Document::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) const
+{
+ {
+ CPDF_Object* pObj;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pObj)) {
+ bForm = pObj->GetType() == PDFOBJ_STREAM &&
+ ((CPDF_Stream*)pObj)->GetDict()->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Form");
+ return TRUE;
+ }
+ }
+ if (m_pParser == NULL) {
+ bForm = FALSE;
+ return TRUE;
+ }
+ return m_pParser->IsFormStream(objnum, bForm);
+}
+void CPDF_Document::ClearPageData()
+{
+ if (m_pDocPage) {
+ CPDF_ModuleMgr::Get()->GetPageModule()->ClearDoc(this);
+ }
+}
+void CPDF_Document::ClearRenderData()
+{
+ if (m_pDocRender) {
+ CPDF_ModuleMgr::Get()->GetRenderModule()->ClearDocData(m_pDocRender);
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
new file mode 100644
index 0000000000..d1f1a24488
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp
@@ -0,0 +1,957 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <time.h>
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fdrm/fx_crypt.h"
+const FX_BYTE defpasscode[32] = {
+ 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
+};
+void CalcEncryptKey(CPDF_Dictionary* pEncrypt, FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_LPBYTE key, int keylen, FX_BOOL bIgnoreMeta, CPDF_Array* pIdArray)
+{
+ int revision = pEncrypt->GetInteger(FX_BSTRC("R"));
+ FX_BYTE passcode[32];
+ for (FX_DWORD i = 0; i < 32; i ++) {
+ passcode[i] = i < pass_size ? password[i] : defpasscode[i - pass_size];
+ }
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, passcode, 32);
+ CFX_ByteString okey = pEncrypt->GetString(FX_BSTRC("O"));
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)okey, okey.GetLength());
+ FX_DWORD perm = pEncrypt->GetInteger(FX_BSTRC("P"));
+ CRYPT_MD5Update(md5, (FX_LPBYTE)&perm, 4);
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ if (!bIgnoreMeta && revision >= 3 && !pEncrypt->GetInteger(FX_BSTRC("EncryptMetadata"), 1)) {
+ FX_DWORD tag = (FX_DWORD) - 1;
+ CRYPT_MD5Update(md5, (FX_LPBYTE)&tag, 4);
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Finish(md5, digest);
+ FX_DWORD copy_len = keylen;
+ if (copy_len > sizeof(digest)) {
+ copy_len = sizeof(digest);
+ }
+ if (revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, copy_len, digest);
+ }
+ }
+ FXSYS_memset32(key, 0, keylen);
+ FXSYS_memcpy32(key, digest, copy_len);
+}
+CPDF_CryptoHandler* CPDF_StandardSecurityHandler::CreateCryptoHandler()
+{
+ return FX_NEW CPDF_StandardCryptoHandler;
+}
+typedef struct _PDF_CRYPTOITEM : public CFX_Object {
+ FX_INT32 m_Cipher;
+ FX_INT32 m_KeyLen;
+ FX_BOOL m_bChecked;
+ CPDF_StandardCryptoHandler* m_pCryptoHandler;
+} PDF_CRYPTOITEM;
+CPDF_StandardSecurityHandler::CPDF_StandardSecurityHandler()
+{
+ m_Version = 0;
+ m_Revision = 0;
+ m_pParser = NULL;
+ m_pEncryptDict = NULL;
+ m_bOwner = FALSE;
+ m_Permissions = 0;
+ m_Cipher = FXCIPHER_NONE;
+ m_KeyLen = 0;
+}
+CPDF_StandardSecurityHandler::~CPDF_StandardSecurityHandler()
+{
+}
+FX_BOOL CPDF_StandardSecurityHandler::OnInit(CPDF_Parser* pParser, CPDF_Dictionary* pEncryptDict)
+{
+ m_pParser = pParser;
+ if (!LoadDict(pEncryptDict)) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ return TRUE;
+ }
+ return CheckSecurity(m_KeyLen);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckSecurity(FX_INT32 key_len)
+{
+ CFX_ByteString password = m_pParser->GetPassword();
+ if (CheckPassword(password, password.GetLength(), TRUE, m_EncryptKey, key_len)) {
+ if (password.IsEmpty()) {
+ if (!CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len)) {
+ return FALSE;
+ }
+ }
+ m_bOwner = TRUE;
+ return TRUE;
+ }
+ return CheckPassword(password, password.GetLength(), FALSE, m_EncryptKey, key_len);
+}
+FX_DWORD CPDF_StandardSecurityHandler::GetPermissions()
+{
+ return m_Permissions;
+}
+static FX_BOOL _LoadCryptInfo(CPDF_Dictionary* pEncryptDict, FX_BSTR name, int& cipher, int& keylen)
+{
+ int Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ int Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ cipher = FXCIPHER_RC4;
+ keylen = 0;
+ if (Version >= 4) {
+ CPDF_Dictionary* pCryptFilters = pEncryptDict->GetDict(FX_BSTRC("CF"));
+ if (pCryptFilters == NULL) {
+ return FALSE;
+ }
+ if (name == FX_BSTRC("Identity")) {
+ cipher = FXCIPHER_NONE;
+ } else {
+ CPDF_Dictionary* pDefFilter = pCryptFilters->GetDict(name);
+ if (pDefFilter == NULL) {
+ return FALSE;
+ }
+ int nKeyBits = 0;
+ if (Version == 4) {
+ nKeyBits = pDefFilter->GetInteger(FX_BSTRC("Length"), 0);
+ if (nKeyBits == 0) {
+ nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 128);
+ }
+ } else {
+ nKeyBits = pEncryptDict->GetInteger(FX_BSTRC("Length"), 256);
+ }
+ if (nKeyBits < 40) {
+ nKeyBits *= 8;
+ }
+ keylen = nKeyBits / 8;
+ CFX_ByteString cipher_name = pDefFilter->GetString(FX_BSTRC("CFM"));
+ if (cipher_name == FX_BSTRC("AESV2") || cipher_name == FX_BSTRC("AESV3")) {
+ cipher = FXCIPHER_AES;
+ }
+ }
+ } else {
+ keylen = Version > 1 ? pEncryptDict->GetInteger(FX_BSTRC("Length"), 40) / 8 : 5;
+ }
+ if (keylen > 32 || keylen < 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict)
+{
+ m_pEncryptDict = pEncryptDict;
+ m_bOwner = FALSE;
+ m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
+ if (m_Version < 4) {
+ return _LoadCryptInfo(pEncryptDict, CFX_ByteString(), m_Cipher, m_KeyLen);
+ }
+ CFX_ByteString stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
+ CFX_ByteString strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
+ if (stmf_name != strf_name) {
+ return FALSE;
+ }
+ if (!_LoadCryptInfo(pEncryptDict, strf_name, m_Cipher, m_KeyLen)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::LoadDict(CPDF_Dictionary* pEncryptDict, FX_DWORD type, int& cipher, int& key_len)
+{
+ m_pEncryptDict = pEncryptDict;
+ m_bOwner = FALSE;
+ m_Version = pEncryptDict->GetInteger(FX_BSTRC("V"));
+ m_Revision = pEncryptDict->GetInteger(FX_BSTRC("R"));
+ m_Permissions = pEncryptDict->GetInteger(FX_BSTRC("P"), -1);
+ CFX_ByteString strf_name, stmf_name;
+ if (m_Version >= 4) {
+ stmf_name = pEncryptDict->GetString(FX_BSTRC("StmF"));
+ strf_name = pEncryptDict->GetString(FX_BSTRC("StrF"));
+ if (stmf_name != strf_name) {
+ return FALSE;
+ }
+ }
+ if (!_LoadCryptInfo(pEncryptDict, strf_name, cipher, key_len)) {
+ return FALSE;
+ }
+ m_Cipher = cipher;
+ m_KeyLen = key_len;
+ return TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_StandardSecurityHandler::GetCryptInfo(int& cipher, FX_LPCBYTE& buffer, int& keylen)
+{
+ cipher = m_Cipher;
+ buffer = m_EncryptKey;
+ keylen = m_KeyLen;
+ return TRUE;
+}
+#define FX_GET_32WORD(n,b,i) \
+ { \
+ (n) = (FX_DWORD)(( (FX_UINT64) (b)[(i)] << 24 ) \
+ | ( (FX_UINT64) (b)[(i) + 1] << 16 ) \
+ | ( (FX_UINT64) (b)[(i) + 2] << 8 ) \
+ | ( (FX_UINT64) (b)[(i) + 3] )); \
+ }
+int BigOrder64BitsMod3(FX_LPBYTE data)
+{
+ FX_UINT64 ret = 0;
+ for (int i = 0; i < 4; ++i) {
+ FX_DWORD value;
+ FX_GET_32WORD(value, data, 4 * i);
+ ret <<= 32;
+ ret |= value;
+ ret %= 3;
+ }
+ return (int)ret;
+}
+void Revision6_Hash(FX_LPCBYTE password, FX_DWORD size, FX_LPCBYTE salt, FX_LPCBYTE vector, FX_LPBYTE hash)
+{
+ int iBlockSize = 32;
+ FX_BYTE sha[128];
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, salt, 8);
+ if (vector) {
+ CRYPT_SHA256Update(sha, vector, 48);
+ }
+ FX_BYTE digest[32];
+ CRYPT_SHA256Finish(sha, digest);
+ CFX_ByteTextBuf buf;
+ FX_LPBYTE input = digest;
+ FX_LPBYTE key = input;
+ FX_LPBYTE iv = input + 16;
+ FX_LPBYTE E = buf.GetBuffer();
+ int iBufLen = buf.GetLength();
+ CFX_ByteTextBuf interDigest;
+ int i = 0;
+ FX_LPBYTE aes = FX_Alloc(FX_BYTE, 2048);
+ while (i < 64 || i < E[iBufLen - 1] + 32) {
+ int iRoundSize = size + iBlockSize;
+ if (vector) {
+ iRoundSize += 48;
+ }
+ iBufLen = iRoundSize * 64;
+ buf.EstimateSize(iBufLen);
+ E = buf.GetBuffer();
+ CFX_ByteTextBuf content;
+ for (int j = 0; j < 64; ++j) {
+ content.AppendBlock(password, size);
+ content.AppendBlock(input, iBlockSize);
+ if (vector) {
+ content.AppendBlock(vector, 48);
+ }
+ }
+ CRYPT_AESSetKey(aes, 16, key, 16, TRUE);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, E, content.GetBuffer(), iBufLen);
+ int iHash = 0;
+ switch (BigOrder64BitsMod3(E)) {
+ case 0:
+ iHash = 0;
+ iBlockSize = 32;
+ break;
+ case 1:
+ iHash = 1;
+ iBlockSize = 48;
+ break;
+ default:
+ iHash = 2;
+ iBlockSize = 64;
+ break;
+ }
+ interDigest.EstimateSize(iBlockSize);
+ input = interDigest.GetBuffer();
+ if (iHash == 0) {
+ CRYPT_SHA256Generate(E, iBufLen, input);
+ } else if (iHash == 1) {
+ CRYPT_SHA384Generate(E, iBufLen, input);
+ } else if (iHash == 2) {
+ CRYPT_SHA512Generate(E, iBufLen, input);
+ }
+ key = input;
+ iv = input + 16;
+ ++i;
+ }
+ FX_Free(aes);
+ if (hash) {
+ FXSYS_memcpy32(hash, input, 32);
+ }
+}
+FX_BOOL CPDF_StandardSecurityHandler::AES256_CheckPassword(FX_LPCBYTE password, FX_DWORD size,
+ FX_BOOL bOwner, FX_LPBYTE key)
+{
+ CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
+ if (okey.GetLength() < 48) {
+ return FALSE;
+ }
+ CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
+ if (ukey.GetLength() < 48) {
+ return FALSE;
+ }
+ FX_LPCBYTE pkey = bOwner ? (FX_LPCBYTE)okey : (FX_LPCBYTE)ukey;
+ FX_BYTE sha[128];
+ FX_BYTE digest[32];
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 32, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, pkey + 32, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, 48);
+ }
+ CRYPT_SHA256Finish(sha, digest);
+ }
+ if (FXSYS_memcmp32(digest, pkey, 32) != 0) {
+ return FALSE;
+ }
+ if (key == NULL) {
+ return TRUE;
+ }
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, (FX_LPCBYTE)pkey + 40, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, pkey + 40, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, 48);
+ }
+ CRYPT_SHA256Finish(sha, digest);
+ }
+ CFX_ByteString ekey = m_pEncryptDict->GetString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"));
+ if (ekey.GetLength() < 32) {
+ return FALSE;
+ }
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);
+ FX_BYTE iv[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESDecrypt(aes, key, ekey, 32);
+ CRYPT_AESSetKey(aes, 16, key, 32, FALSE);
+ CRYPT_AESSetIV(aes, iv);
+ CFX_ByteString perms = m_pEncryptDict->GetString(FX_BSTRC("Perms"));
+ if (perms.IsEmpty()) {
+ return FALSE;
+ }
+ FX_BYTE perms_buf[16];
+ FXSYS_memset32(perms_buf, 0, sizeof(perms_buf));
+ FX_DWORD copy_len = sizeof(perms_buf);
+ if (copy_len > (FX_DWORD)perms.GetLength()) {
+ copy_len = perms.GetLength();
+ }
+ FXSYS_memcpy32(perms_buf, (FX_LPCBYTE)perms, copy_len);
+ FX_BYTE buf[16];
+ CRYPT_AESDecrypt(aes, buf, perms_buf, 16);
+ FX_Free(aes);
+ if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {
+ return FALSE;
+ }
+ if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {
+ return FALSE;
+ }
+ if ((buf[8] == 'T' && !IsMetadataEncrypted()) || (buf[8] == 'F' && IsMetadataEncrypted())) {
+ return FALSE;
+ }
+ return TRUE;
+}
+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD pass_size, FX_BOOL bOwner, FX_LPBYTE key)
+{
+ return CheckPassword(password, pass_size, bOwner, key, m_KeyLen);
+}
+int CPDF_StandardSecurityHandler::CheckPassword(FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPBYTE key, FX_INT32 key_len)
+{
+ if (m_Revision >= 5) {
+ return AES256_CheckPassword(password, size, bOwner, key);
+ }
+ FX_BYTE keybuf[32];
+ if (key == NULL) {
+ key = keybuf;
+ }
+ if (bOwner) {
+ return CheckOwnerPassword(password, size, key, key_len);
+ }
+ return CheckUserPassword(password, size, FALSE, key, key_len) || CheckUserPassword(password, size, TRUE, key, key_len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckUserPassword(FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_BOOL bIgnoreEncryptMeta, FX_LPBYTE key, FX_INT32 key_len)
+{
+ CalcEncryptKey(m_pEncryptDict, password, pass_size, key, key_len, bIgnoreEncryptMeta,
+ m_pParser->GetIDArray());
+ CFX_ByteString ukey = m_pEncryptDict->GetString(FX_BSTRC("U"));
+ if (ukey.GetLength() < 16) {
+ return FALSE;
+ }
+ FX_BYTE ukeybuf[32];
+ if (m_Revision == 2) {
+ FXSYS_memcpy32(ukeybuf, defpasscode, 32);
+ CRYPT_ArcFourCryptBlock(ukeybuf, 32, key, key_len);
+ } else {
+ FX_BYTE test[32], tmpkey[32];
+ FX_DWORD copy_len = sizeof(test);
+ if (copy_len > (FX_DWORD)ukey.GetLength()) {
+ copy_len = ukey.GetLength();
+ }
+ FXSYS_memset32(test, 0, sizeof(test));
+ FXSYS_memcpy32(test, (FX_LPCSTR)ukey, copy_len);
+ for (int i = 19; i >= 0; i --) {
+ for (int j = 0; j < key_len; j ++) {
+ tmpkey[j] = key[j] ^ i;
+ }
+ CRYPT_ArcFourCryptBlock(test, 32, tmpkey, key_len);
+ }
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, defpasscode, 32);
+ CPDF_Array* pIdArray = m_pParser->GetIDArray();
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ CRYPT_MD5Finish(md5, ukeybuf);
+ return FXSYS_memcmp32(test, ukeybuf, 16) == 0;
+ }
+ if (FXSYS_memcmp32((FX_LPVOID)(FX_LPCSTR)ukey, ukeybuf, 16) == 0) {
+ return TRUE;
+ }
+ return FALSE;
+}
+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size)
+{
+ return GetUserPassword(owner_pass, pass_size, m_KeyLen);
+}
+CFX_ByteString CPDF_StandardSecurityHandler::GetUserPassword(FX_LPCBYTE owner_pass, FX_DWORD pass_size, FX_INT32 key_len)
+{
+ CFX_ByteString okey = m_pEncryptDict->GetString(FX_BSTRC("O"));
+ FX_BYTE passcode[32];
+ FX_DWORD i;
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < pass_size ? owner_pass[i] : defpasscode[i - pass_size];
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Generate(passcode, 32, digest);
+ if (m_Revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, 16, digest);
+ }
+ }
+ FX_BYTE enckey[32];
+ FXSYS_memset32(enckey, 0, sizeof(enckey));
+ FX_DWORD copy_len = key_len;
+ if (copy_len > sizeof(digest)) {
+ copy_len = sizeof(digest);
+ }
+ FXSYS_memcpy32(enckey, digest, copy_len);
+ int okeylen = okey.GetLength();
+ if (okeylen > 32) {
+ okeylen = 32;
+ }
+ FX_BYTE okeybuf[64];
+ FXSYS_memcpy32(okeybuf, (FX_LPCSTR)okey, okeylen);
+ if (m_Revision == 2) {
+ CRYPT_ArcFourCryptBlock(okeybuf, okeylen, enckey, key_len);
+ } else {
+ for (int i = 19; i >= 0; i --) {
+ FX_BYTE tempkey[32];
+ for (int j = 0; j < m_KeyLen; j ++) {
+ tempkey[j] = enckey[j] ^ i;
+ }
+ CRYPT_ArcFourCryptBlock(okeybuf, okeylen, tempkey, key_len);
+ }
+ }
+ int len = 32;
+ while (len && defpasscode[len - 1] == okeybuf[len - 1]) {
+ len --;
+ }
+ return CFX_ByteString(okeybuf, len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::CheckOwnerPassword(FX_LPCBYTE password, FX_DWORD pass_size,
+ FX_LPBYTE key, FX_INT32 key_len)
+{
+ CFX_ByteString user_pass = GetUserPassword(password, pass_size, key_len);
+ if (CheckUserPassword(user_pass, user_pass.GetLength(), FALSE, key, key_len)) {
+ return TRUE;
+ }
+ return CheckUserPassword(user_pass, user_pass.GetLength(), TRUE, key, key_len);
+}
+FX_BOOL CPDF_StandardSecurityHandler::IsMetadataEncrypted()
+{
+ return m_pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE);
+}
+CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler()
+{
+ return FX_NEW CPDF_StandardSecurityHandler;
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_BOOL bDefault, FX_DWORD type)
+{
+ int cipher = 0, key_len = 0;
+ if (!LoadDict(pEncryptDict, type, cipher, key_len)) {
+ return;
+ }
+ if (bDefault && (owner_pass == NULL || owner_size == 0)) {
+ owner_pass = user_pass;
+ owner_size = user_size;
+ }
+ if (m_Revision >= 5) {
+ int t = (int)time(NULL);
+ FX_BYTE sha[128];
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, (FX_BYTE*)&t, sizeof t);
+ CRYPT_SHA256Update(sha, m_EncryptKey, 32);
+ CRYPT_SHA256Update(sha, (FX_BYTE*)"there", 5);
+ CRYPT_SHA256Finish(sha, m_EncryptKey);
+ AES256_SetPassword(pEncryptDict, user_pass, user_size, FALSE, m_EncryptKey);
+ if (bDefault) {
+ AES256_SetPassword(pEncryptDict, owner_pass, owner_size, TRUE, m_EncryptKey);
+ AES256_SetPerms(pEncryptDict, m_Permissions, pEncryptDict->GetBoolean(FX_BSTRC("EncryptMetadata"), TRUE), m_EncryptKey);
+ }
+ return;
+ }
+ if (bDefault) {
+ FX_BYTE passcode[32];
+ FX_DWORD i;
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < owner_size ? owner_pass[i] : defpasscode[i - owner_size];
+ }
+ FX_BYTE digest[16];
+ CRYPT_MD5Generate(passcode, 32, digest);
+ if (m_Revision >= 3) {
+ for (int i = 0; i < 50; i ++) {
+ CRYPT_MD5Generate(digest, 16, digest);
+ }
+ }
+ FX_BYTE enckey[32];
+ FXSYS_memcpy32(enckey, digest, key_len);
+ for (i = 0; i < 32; i ++) {
+ passcode[i] = i < user_size ? user_pass[i] : defpasscode[i - user_size];
+ }
+ CRYPT_ArcFourCryptBlock(passcode, 32, enckey, key_len);
+ FX_BYTE tempkey[32];
+ if (m_Revision >= 3) {
+ for (i = 1; i <= 19; i ++) {
+ for (int j = 0; j < key_len; j ++) {
+ tempkey[j] = enckey[j] ^ (FX_BYTE)i;
+ }
+ CRYPT_ArcFourCryptBlock(passcode, 32, tempkey, key_len);
+ }
+ }
+ pEncryptDict->SetAtString(FX_BSTRC("O"), CFX_ByteString(passcode, 32));
+ }
+ CalcEncryptKey(m_pEncryptDict, (FX_LPBYTE)user_pass, user_size, m_EncryptKey, key_len, FALSE, pIdArray);
+ if (m_Revision < 3) {
+ FX_BYTE tempbuf[32];
+ FXSYS_memcpy32(tempbuf, defpasscode, 32);
+ CRYPT_ArcFourCryptBlock(tempbuf, 32, m_EncryptKey, key_len);
+ pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(tempbuf, 32));
+ } else {
+ FX_BYTE md5[100];
+ CRYPT_MD5Start(md5);
+ CRYPT_MD5Update(md5, defpasscode, 32);
+ if (pIdArray) {
+ CFX_ByteString id = pIdArray->GetString(0);
+ CRYPT_MD5Update(md5, (FX_LPBYTE)(FX_LPCSTR)id, id.GetLength());
+ }
+ FX_BYTE digest[32];
+ CRYPT_MD5Finish(md5, digest);
+ CRYPT_ArcFourCryptBlock(digest, 16, m_EncryptKey, key_len);
+ FX_BYTE tempkey[32];
+ for (int i = 1; i <= 19; i ++) {
+ for (int j = 0; j < key_len; j ++) {
+ tempkey[j] = m_EncryptKey[j] ^ (FX_BYTE)i;
+ }
+ CRYPT_ArcFourCryptBlock(digest, 16, tempkey, key_len);
+ }
+ CRYPT_MD5Generate(digest, 16, digest + 16);
+ pEncryptDict->SetAtString(FX_BSTRC("U"), CFX_ByteString(digest, 32));
+ }
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray,
+ FX_LPCBYTE user_pass, FX_DWORD user_size,
+ FX_LPCBYTE owner_pass, FX_DWORD owner_size, FX_DWORD type)
+{
+ OnCreate(pEncryptDict, pIdArray, user_pass, user_size, owner_pass, owner_size, TRUE, type);
+}
+void CPDF_StandardSecurityHandler::OnCreate(CPDF_Dictionary* pEncryptDict, CPDF_Array* pIdArray, FX_LPCBYTE user_pass, FX_DWORD user_size, FX_DWORD type)
+{
+ OnCreate(pEncryptDict, pIdArray, user_pass, user_size, NULL, 0, FALSE, type);
+}
+void CPDF_StandardSecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict, FX_LPCBYTE password, FX_DWORD size, FX_BOOL bOwner, FX_LPCBYTE key)
+{
+ FX_BYTE sha[128];
+ CRYPT_SHA1Start(sha);
+ CRYPT_SHA1Update(sha, key, 32);
+ CRYPT_SHA1Update(sha, (FX_BYTE*)"hello", 5);
+ FX_BYTE digest[20];
+ CRYPT_SHA1Finish(sha, digest);
+ CFX_ByteString ukey = pEncryptDict->GetString(FX_BSTRC("U"));
+ FX_BYTE digest1[48];
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, digest, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, digest, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
+ }
+ CRYPT_SHA256Finish(sha, digest1);
+ }
+ FXSYS_memcpy32(digest1 + 32, digest, 16);
+ pEncryptDict->SetAtString(bOwner ? FX_BSTRC("O") : FX_BSTRC("U"), CFX_ByteString(digest1, 48));
+ if (m_Revision >= 6) {
+ Revision6_Hash(password, size, digest + 8, (bOwner ? (FX_LPCBYTE)ukey : NULL), digest1);
+ } else {
+ CRYPT_SHA256Start(sha);
+ CRYPT_SHA256Update(sha, password, size);
+ CRYPT_SHA256Update(sha, digest + 8, 8);
+ if (bOwner) {
+ CRYPT_SHA256Update(sha, ukey, ukey.GetLength());
+ }
+ CRYPT_SHA256Finish(sha, digest1);
+ }
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, digest1, 32, TRUE);
+ FX_BYTE iv[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, digest1, key, 32);
+ FX_Free(aes);
+ pEncryptDict->SetAtString(bOwner ? FX_BSTRC("OE") : FX_BSTRC("UE"), CFX_ByteString(digest1, 32));
+}
+void CPDF_StandardSecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict, FX_DWORD permissions,
+ FX_BOOL bEncryptMetadata, FX_LPCBYTE key)
+{
+ FX_BYTE buf[16];
+ buf[0] = (FX_BYTE)permissions;
+ buf[1] = (FX_BYTE)(permissions >> 8);
+ buf[2] = (FX_BYTE)(permissions >> 16);
+ buf[3] = (FX_BYTE)(permissions >> 24);
+ buf[4] = 0xff;
+ buf[5] = 0xff;
+ buf[6] = 0xff;
+ buf[7] = 0xff;
+ buf[8] = bEncryptMetadata ? 'T' : 'F';
+ buf[9] = 'a';
+ buf[10] = 'd';
+ buf[11] = 'b';
+ FX_BYTE* aes = FX_Alloc(FX_BYTE, 2048);
+ CRYPT_AESSetKey(aes, 16, key, 32, TRUE);
+ FX_BYTE iv[16], buf1[16];
+ FXSYS_memset32(iv, 0, 16);
+ CRYPT_AESSetIV(aes, iv);
+ CRYPT_AESEncrypt(aes, buf1, buf, 16);
+ FX_Free(aes);
+ pEncryptDict->SetAtString(FX_BSTRC("Perms"), CFX_ByteString(buf1, 16));
+}
+void CPDF_StandardCryptoHandler::CryptBlock(FX_BOOL bEncrypt, FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size)
+{
+ if (m_Cipher == FXCIPHER_NONE) {
+ FXSYS_memcpy32(dest_buf, src_buf, src_size);
+ return;
+ }
+ FX_BYTE realkey[16];
+ int realkeylen = 16;
+ if (m_Cipher != FXCIPHER_AES || m_KeyLen != 32) {
+ FX_BYTE key1[32];
+ FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
+ key1[m_KeyLen + 0] = (FX_BYTE)objnum;
+ key1[m_KeyLen + 1] = (FX_BYTE)(objnum >> 8);
+ key1[m_KeyLen + 2] = (FX_BYTE)(objnum >> 16);
+ key1[m_KeyLen + 3] = (FX_BYTE)gennum;
+ key1[m_KeyLen + 4] = (FX_BYTE)(gennum >> 8);
+ FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
+ FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
+ if (m_Cipher == FXCIPHER_AES) {
+ FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
+ }
+ CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
+ realkeylen = m_KeyLen + 5;
+ if (realkeylen > 16) {
+ realkeylen = 16;
+ }
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ CRYPT_AESSetKey(m_pAESContext, 16, m_KeyLen == 32 ? m_EncryptKey : realkey, m_KeyLen, bEncrypt);
+ if (bEncrypt) {
+ FX_BYTE iv[16];
+ for (int i = 0; i < 16; i ++) {
+ iv[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(m_pAESContext, iv);
+ FXSYS_memcpy32(dest_buf, iv, 16);
+ int nblocks = src_size / 16;
+ CRYPT_AESEncrypt(m_pAESContext, dest_buf + 16, src_buf, nblocks * 16);
+ FX_BYTE padding[16];
+ FXSYS_memcpy32(padding, src_buf + nblocks * 16, src_size % 16);
+ FXSYS_memset8(padding + src_size % 16, 16 - src_size % 16, 16 - src_size % 16);
+ CRYPT_AESEncrypt(m_pAESContext, dest_buf + nblocks * 16 + 16, padding, 16);
+ dest_size = 32 + nblocks * 16;
+ } else {
+ CRYPT_AESSetIV(m_pAESContext, src_buf);
+ CRYPT_AESDecrypt(m_pAESContext, dest_buf, src_buf + 16, src_size - 16);
+ dest_size = src_size - 16;
+ dest_size -= dest_buf[dest_size - 1];
+ }
+ } else {
+ ASSERT(dest_size == src_size);
+ if (dest_buf != src_buf) {
+ FXSYS_memcpy32(dest_buf, src_buf, src_size);
+ }
+ CRYPT_ArcFourCryptBlock(dest_buf, dest_size, realkey, realkeylen);
+ }
+}
+typedef struct _AESCryptContext {
+ FX_BYTE m_Context[2048];
+ FX_BOOL m_bIV;
+ FX_BYTE m_Block[16];
+ FX_DWORD m_BlockOffset;
+} AESCryptContext;
+FX_LPVOID CPDF_StandardCryptoHandler::CryptStart(FX_DWORD objnum, FX_DWORD gennum, FX_BOOL bEncrypt)
+{
+ if (m_Cipher == FXCIPHER_NONE) {
+ return this;
+ }
+ if (m_Cipher == FXCIPHER_AES && m_KeyLen == 32) {
+ AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
+ pContext->m_bIV = TRUE;
+ pContext->m_BlockOffset = 0;
+ CRYPT_AESSetKey(pContext->m_Context, 16, m_EncryptKey, 32, bEncrypt);
+ if (bEncrypt) {
+ for (int i = 0; i < 16; i ++) {
+ pContext->m_Block[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ }
+ return pContext;
+ }
+ FX_BYTE key1[48];
+ FXSYS_memcpy32(key1, m_EncryptKey, m_KeyLen);
+ FXSYS_memcpy32(key1 + m_KeyLen, &objnum, 3);
+ FXSYS_memcpy32(key1 + m_KeyLen + 3, &gennum, 2);
+ if (m_Cipher == FXCIPHER_AES) {
+ FXSYS_memcpy32(key1 + m_KeyLen + 5, "sAlT", 4);
+ }
+ FX_BYTE realkey[16];
+ CRYPT_MD5Generate(key1, m_Cipher == FXCIPHER_AES ? m_KeyLen + 9 : m_KeyLen + 5, realkey);
+ int realkeylen = m_KeyLen + 5;
+ if (realkeylen > 16) {
+ realkeylen = 16;
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ AESCryptContext* pContext = FX_Alloc(AESCryptContext, 1);
+ pContext->m_bIV = TRUE;
+ pContext->m_BlockOffset = 0;
+ CRYPT_AESSetKey(pContext->m_Context, 16, realkey, 16, bEncrypt);
+ if (bEncrypt) {
+ for (int i = 0; i < 16; i ++) {
+ pContext->m_Block[i] = (FX_BYTE)rand();
+ }
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ }
+ return pContext;
+ }
+ void* pContext = FX_Alloc(FX_BYTE, 1040);
+ CRYPT_ArcFourSetup(pContext, realkey, realkeylen);
+ return pContext;
+}
+FX_BOOL CPDF_StandardCryptoHandler::CryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
+{
+ if (!context) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ dest_buf.AppendBlock(src_buf, src_size);
+ return TRUE;
+ }
+ if (m_Cipher == FXCIPHER_RC4) {
+ int old_size = dest_buf.GetSize();
+ dest_buf.AppendBlock(src_buf, src_size);
+ CRYPT_ArcFourCrypt(context, dest_buf.GetBuffer() + old_size, src_size);
+ return TRUE;
+ }
+ AESCryptContext* pContext = (AESCryptContext*)context;
+ if (pContext->m_bIV && bEncrypt) {
+ dest_buf.AppendBlock(pContext->m_Block, 16);
+ pContext->m_bIV = FALSE;
+ }
+ FX_DWORD src_off = 0;
+ FX_DWORD src_left = src_size;
+ while (1) {
+ FX_DWORD copy_size = 16 - pContext->m_BlockOffset;
+ if (copy_size > src_left) {
+ copy_size = src_left;
+ }
+ FXSYS_memcpy32(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size);
+ src_off += copy_size;
+ src_left -= copy_size;
+ pContext->m_BlockOffset += copy_size;
+ if (pContext->m_BlockOffset == 16) {
+ if (!bEncrypt && pContext->m_bIV) {
+ CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block);
+ pContext->m_bIV = FALSE;
+ pContext->m_BlockOffset = 0;
+ } else if (src_off < src_size) {
+ FX_BYTE block_buf[16];
+ if (bEncrypt) {
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ } else {
+ CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ }
+ dest_buf.AppendBlock(block_buf, 16);
+ pContext->m_BlockOffset = 0;
+ }
+ }
+ if (!src_left) {
+ break;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::CryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf, FX_BOOL bEncrypt)
+{
+ if (!context) {
+ return FALSE;
+ }
+ if (m_Cipher == FXCIPHER_NONE) {
+ return TRUE;
+ }
+ if (m_Cipher == FXCIPHER_RC4) {
+ FX_Free(context);
+ return TRUE;
+ }
+ AESCryptContext* pContext = (AESCryptContext*)context;
+ if (bEncrypt) {
+ FX_BYTE block_buf[16];
+ if (pContext->m_BlockOffset == 16) {
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ dest_buf.AppendBlock(block_buf, 16);
+ pContext->m_BlockOffset = 0;
+ }
+ FXSYS_memset8(pContext->m_Block + pContext->m_BlockOffset, (FX_BYTE)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset);
+ CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ dest_buf.AppendBlock(block_buf, 16);
+ } else if (pContext->m_BlockOffset == 16) {
+ FX_BYTE block_buf[16];
+ CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16);
+ if (block_buf[15] <= 16) {
+ dest_buf.AppendBlock(block_buf, 16 - block_buf[15]);
+ }
+ }
+ FX_Free(pContext);
+ return TRUE;
+}
+FX_LPVOID CPDF_StandardCryptoHandler::DecryptStart(FX_DWORD objnum, FX_DWORD gennum)
+{
+ return CryptStart(objnum, gennum, FALSE);
+}
+FX_DWORD CPDF_StandardCryptoHandler::DecryptGetSize(FX_DWORD src_size)
+{
+ return m_Cipher == FXCIPHER_AES ? src_size - 16 : src_size;
+}
+FX_BOOL CPDF_StandardCryptoHandler::Init(CPDF_Dictionary* pEncryptDict, CPDF_SecurityHandler* pSecurityHandler)
+{
+ FX_LPCBYTE key;
+ if (!pSecurityHandler->GetCryptInfo(m_Cipher, key, m_KeyLen)) {
+ return FALSE;
+ }
+ if (m_KeyLen > 32 || m_KeyLen < 0) {
+ return FALSE;
+ }
+ if (m_Cipher != FXCIPHER_NONE) {
+ FXSYS_memcpy32(m_EncryptKey, key, m_KeyLen);
+ }
+ if (m_Cipher == FXCIPHER_AES) {
+ m_pAESContext = FX_Alloc(FX_BYTE, 2048);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::Init(int cipher, FX_LPCBYTE key, int keylen)
+{
+ if (cipher == FXCIPHER_AES) {
+ switch(keylen) {
+ case 16:
+ case 24:
+ case 32:
+ break;
+ default:
+ return FALSE;
+ }
+ } else if (cipher == FXCIPHER_AES2) {
+ if (keylen != 32) {
+ return FALSE;
+ }
+ } else if (cipher == FXCIPHER_RC4) {
+ if (keylen < 5 || keylen > 16) {
+ return FALSE;
+ }
+ } else {
+ if (keylen > 32) {
+ keylen = 32;
+ }
+ }
+ m_Cipher = cipher;
+ m_KeyLen = keylen;
+ FXSYS_memcpy32(m_EncryptKey, key, keylen);
+ if (m_Cipher == FXCIPHER_AES) {
+ m_pAESContext = FX_Alloc(FX_BYTE, 2048);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_StandardCryptoHandler::DecryptStream(FX_LPVOID context, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ CFX_BinaryBuf& dest_buf)
+{
+ return CryptStream(context, src_buf, src_size, dest_buf, FALSE);
+}
+FX_BOOL CPDF_StandardCryptoHandler::DecryptFinish(FX_LPVOID context, CFX_BinaryBuf& dest_buf)
+{
+ return CryptFinish(context, dest_buf, FALSE);
+}
+FX_DWORD CPDF_StandardCryptoHandler::EncryptGetSize(FX_DWORD objnum, FX_DWORD version, FX_LPCBYTE src_buf, FX_DWORD src_size)
+{
+ if (m_Cipher == FXCIPHER_AES) {
+ return src_size + 32;
+ }
+ return src_size;
+}
+FX_BOOL CPDF_StandardCryptoHandler::EncryptContent(FX_DWORD objnum, FX_DWORD gennum, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE dest_buf, FX_DWORD& dest_size)
+{
+ CryptBlock(TRUE, objnum, gennum, src_buf, src_size, dest_buf, dest_size);
+ return TRUE;
+}
+void CPDF_CryptoHandler::Decrypt(FX_DWORD objnum, FX_DWORD gennum, CFX_ByteString& str)
+{
+ CFX_BinaryBuf dest_buf;
+ FX_LPVOID context = DecryptStart(objnum, gennum);
+ DecryptStream(context, (FX_LPCBYTE)str, str.GetLength(), dest_buf);
+ DecryptFinish(context, dest_buf);
+ str = dest_buf;
+}
+CPDF_StandardCryptoHandler::CPDF_StandardCryptoHandler()
+{
+ m_pAESContext = NULL;
+ m_Cipher = FXCIPHER_NONE;
+ m_KeyLen = 0;
+}
+CPDF_StandardCryptoHandler::~CPDF_StandardCryptoHandler()
+{
+ if (m_pAESContext) {
+ FX_Free(m_pAESContext);
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
new file mode 100644
index 0000000000..22f9aa713f
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp
@@ -0,0 +1,224 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_serial.h"
+CFDF_Document::CFDF_Document() : CPDF_IndirectObjects(NULL)
+{
+ m_pRootDict = NULL;
+ m_pFile = NULL;
+ m_bOwnFile = FALSE;
+}
+CFDF_Document::~CFDF_Document()
+{
+ if (m_bOwnFile && m_pFile) {
+ m_pFile->Release();
+ }
+}
+CFDF_Document* CFDF_Document::CreateNewDoc()
+{
+ CFDF_Document* pDoc = FX_NEW CFDF_Document;
+ pDoc->m_pRootDict = FX_NEW CPDF_Dictionary;
+ pDoc->AddIndirectObject(pDoc->m_pRootDict);
+ CPDF_Dictionary* pFDFDict = FX_NEW CPDF_Dictionary;
+ pDoc->m_pRootDict->SetAt(FX_BSTRC("FDF"), pFDFDict);
+ return pDoc;
+}
+CFDF_Document* CFDF_Document::ParseFile(FX_LPCSTR file_path)
+{
+ return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
+}
+CFDF_Document* CFDF_Document::ParseFile(FX_LPCWSTR file_path)
+{
+ return CFDF_Document::ParseFile(FX_CreateFileRead(file_path), TRUE);
+}
+CFDF_Document* CFDF_Document::ParseFile(IFX_FileRead *pFile, FX_BOOL bOwnFile)
+{
+ if (!pFile) {
+ return NULL;
+ }
+ CFDF_Document* pDoc = FX_NEW CFDF_Document;
+ pDoc->ParseStream(pFile, bOwnFile);
+ if (pDoc->m_pRootDict == NULL) {
+ delete pDoc;
+ return NULL;
+ }
+ return pDoc;
+}
+CFDF_Document* CFDF_Document::ParseMemory(FX_LPCBYTE pData, FX_DWORD size)
+{
+ return CFDF_Document::ParseFile(FX_CreateMemoryStream((FX_LPBYTE)pData, size), TRUE);
+}
+void CFDF_Document::ParseStream(IFX_FileRead *pFile, FX_BOOL bOwnFile)
+{
+ m_pFile = pFile;
+ m_bOwnFile = bOwnFile;
+ CPDF_SyntaxParser parser;
+ parser.InitParser(m_pFile, 0);
+ while (1) {
+ FX_BOOL bNumber;
+ CFX_ByteString word = parser.GetNextWord(bNumber);
+ if (bNumber) {
+ FX_DWORD objnum = FXSYS_atoi(word);
+ word = parser.GetNextWord(bNumber);
+ if (!bNumber) {
+ break;
+ }
+ word = parser.GetNextWord(bNumber);
+ if (word != FX_BSTRC("obj")) {
+ break;
+ }
+ CPDF_Object* pObj = parser.GetObject(this, objnum, 0, FALSE);
+ if (pObj == NULL) {
+ break;
+ }
+ InsertIndirectObject(objnum, pObj);
+ word = parser.GetNextWord(bNumber);
+ if (word != FX_BSTRC("endobj")) {
+ break;
+ }
+ } else {
+ if (word != FX_BSTRC("trailer")) {
+ break;
+ }
+ CPDF_Dictionary* pMainDict = (CPDF_Dictionary*)parser.GetObject(this, 0, 0, 0);
+ if (pMainDict == NULL || pMainDict->GetType() != PDFOBJ_DICTIONARY) {
+ break;
+ }
+ m_pRootDict = pMainDict->GetDict(FX_BSTRC("Root"));
+ pMainDict->Release();
+ break;
+ }
+ }
+}
+FX_BOOL CFDF_Document::WriteBuf(CFX_ByteTextBuf& buf) const
+{
+ if (m_pRootDict == NULL) {
+ return FALSE;
+ }
+ buf << FX_BSTRC("%FDF-1.2\r\n");
+ FX_POSITION pos = m_IndirectObjs.GetStartPosition();
+ while(pos) {
+ size_t objnum;
+ CPDF_Object* pObj;
+ m_IndirectObjs.GetNextAssoc(pos, (FX_LPVOID&)objnum, (FX_LPVOID&)pObj);
+ buf << (FX_DWORD)objnum << FX_BSTRC(" 0 obj\r\n") << pObj << FX_BSTRC("\r\nendobj\r\n\r\n");
+ }
+ buf << FX_BSTRC("trailer\r\n<</Root ") << m_pRootDict->GetObjNum() << FX_BSTRC(" 0 R>>\r\n%%EOF\r\n");
+ return TRUE;
+}
+CFX_WideString CFDF_Document::GetWin32Path() const
+{
+ CPDF_Object* pFileSpec = m_pRootDict->GetDict(FX_BSTRC("FDF"))->GetElementValue(FX_BSTRC("F"));
+ if (pFileSpec == NULL) {
+ return CFX_WideString();
+ }
+ if (pFileSpec->GetType() == PDFOBJ_STRING) {
+ return FPDF_FileSpec_GetWin32Path(m_pRootDict->GetDict(FX_BSTRC("FDF")));
+ }
+ return FPDF_FileSpec_GetWin32Path(pFileSpec);
+}
+FX_BOOL CFDF_Document::WriteFile(FX_LPCSTR file_path) const
+{
+ IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
+ if (!pFile) {
+ return FALSE;
+ }
+ FX_BOOL bRet = WriteFile(pFile);
+ pFile->Release();
+ return bRet;
+}
+FX_BOOL CFDF_Document::WriteFile(FX_LPCWSTR file_path) const
+{
+ IFX_FileWrite *pFile = FX_CreateFileWrite(file_path);
+ if (!pFile) {
+ return FALSE;
+ }
+ FX_BOOL bRet = WriteFile(pFile);
+ pFile->Release();
+ return bRet;
+}
+FX_BOOL CFDF_Document::WriteFile(IFX_FileWrite *pFile) const
+{
+ CFX_ByteTextBuf buf;
+ WriteBuf(buf);
+ FX_BOOL bRet = pFile->WriteBlock(buf.GetBuffer(), buf.GetSize());
+ if (bRet) {
+ pFile->Flush();
+ }
+ return bRet;
+}
+static CFX_WideString ChangeSlash(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '\\') {
+ result += '/';
+ } else if (*str == '/') {
+ result += '\\';
+ } else {
+ result += *str;
+ }
+ str ++;
+ }
+ return result;
+}
+void FPDF_FileSpec_SetWin32Path(CPDF_Object* pFileSpec, const CFX_WideString& filepath)
+{
+ CFX_WideString result;
+ if (filepath.GetLength() > 1 && filepath[1] == ':') {
+ result = L"/";
+ result += filepath[0];
+ if (filepath[2] != '\\') {
+ result += '/';
+ }
+ result += ChangeSlash((FX_LPCWSTR)filepath + 2);
+ } else if (filepath.GetLength() > 1 && filepath[0] == '\\' && filepath[1] == '\\') {
+ result = ChangeSlash((FX_LPCWSTR)filepath + 1);
+ } else {
+ result = ChangeSlash(filepath);
+ }
+ if (pFileSpec->GetType() == PDFOBJ_STRING) {
+ pFileSpec->SetString(CFX_ByteString::FromUnicode(result));
+ } else if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
+ ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(result));
+ ((CPDF_Dictionary*)pFileSpec)->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(result));
+ ((CPDF_Dictionary*)pFileSpec)->RemoveAt(FX_BSTRC("FS"));
+ }
+}
+CFX_WideString FPDF_FileSpec_GetWin32Path(const CPDF_Object* pFileSpec)
+{
+ CFX_WideString wsFileName;
+ if (pFileSpec->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFileSpec;
+ wsFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
+ if (wsFileName.IsEmpty()) {
+ wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
+ }
+ if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
+ return wsFileName;
+ }
+ if (wsFileName.IsEmpty() && pDict->KeyExist(FX_BSTRC("DOS"))) {
+ wsFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
+ }
+ } else {
+ wsFileName = CFX_WideString::FromLocal(pFileSpec->GetString());
+ }
+ if (wsFileName[0] != '/') {
+ return ChangeSlash(wsFileName);
+ }
+ if (wsFileName[2] == '/') {
+ CFX_WideString result;
+ result += wsFileName[1];
+ result += ':';
+ result += ChangeSlash(((FX_LPCWSTR)wsFileName) + 2);
+ return result;
+ } else {
+ CFX_WideString result;
+ result += '\\';
+ result += ChangeSlash(wsFileName);
+ return result;
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
new file mode 100644
index 0000000000..76a79f69cb
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp
@@ -0,0 +1,909 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../fx_zlib.h"
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "filters_int.h"
+CFX_DataFilter::CFX_DataFilter()
+{
+ m_bEOF = FALSE;
+ m_pDestFilter = NULL;
+ m_SrcPos = 0;
+}
+CFX_DataFilter::~CFX_DataFilter()
+{
+ if (m_pDestFilter) {
+ delete m_pDestFilter;
+ }
+}
+void CFX_DataFilter::SetDestFilter(CFX_DataFilter* pFilter)
+{
+ if (m_pDestFilter) {
+ m_pDestFilter->SetDestFilter(pFilter);
+ } else {
+ m_pDestFilter = pFilter;
+ }
+}
+void CFX_DataFilter::FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_bEOF) {
+ return;
+ }
+ m_SrcPos += src_size;
+ if (m_pDestFilter) {
+ CFX_BinaryBuf temp_buf;
+ temp_buf.EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
+ v_FilterIn(src_buf, src_size, temp_buf);
+ m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
+ } else {
+ v_FilterIn(src_buf, src_size, dest_buf);
+ }
+}
+void CFX_DataFilter::FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ if (m_pDestFilter) {
+ CFX_BinaryBuf temp_buf;
+ v_FilterFinish(temp_buf);
+ if (temp_buf.GetSize()) {
+ m_pDestFilter->FilterIn(temp_buf.GetBuffer(), temp_buf.GetSize(), dest_buf);
+ }
+ m_pDestFilter->FilterFinish(dest_buf);
+ } else {
+ v_FilterFinish(dest_buf);
+ }
+ m_bEOF = TRUE;
+}
+void CFX_DataFilter::ReportEOF(FX_DWORD left_input)
+{
+ if (m_bEOF) {
+ return;
+ }
+ m_bEOF = TRUE;
+ m_SrcPos -= left_input;
+}
+CFX_DataFilter* FPDF_CreateFilter(FX_BSTR name, const CPDF_Dictionary* pParam, int width, int height)
+{
+ FX_DWORD id = name.GetID();
+ switch (id) {
+ case FXBSTR_ID('F', 'l', 'a', 't'):
+ case FXBSTR_ID('F', 'l', 0, 0):
+ case FXBSTR_ID('L', 'Z', 'W', 'D'):
+ case FXBSTR_ID('L', 'Z', 'W', 0): {
+ CFX_DataFilter* pFilter;
+ if (id == FXBSTR_ID('L', 'Z', 'W', 'D') || id == FXBSTR_ID('L', 'Z', 'W', 0)) {
+ pFilter = FX_NEW CPDF_LzwFilter(pParam->GetInteger("EarlyChange", 1));
+ } else {
+ pFilter = FX_NEW CPDF_FlateFilter;
+ }
+ if (pParam->GetInteger("Predictor", 1) > 1) {
+ CFX_DataFilter* pPredictor = FX_NEW CPDF_PredictorFilter(pParam->GetInteger(FX_BSTRC("Predictor"), 1),
+ pParam->GetInteger(FX_BSTRC("Colors"), 1), pParam->GetInteger(FX_BSTRC("BitsPerComponent"), 8),
+ pParam->GetInteger(FX_BSTRC("Columns"), 1));
+ pFilter->SetDestFilter(pPredictor);
+ }
+ return pFilter;
+ }
+ case FXBSTR_ID('A', 'S', 'C', 'I'):
+ if (name == "ASCIIHexDecode") {
+ return FX_NEW CPDF_AsciiHexFilter;
+ }
+ return FX_NEW CPDF_Ascii85Filter;
+ case FXBSTR_ID('A', 'H', 'x', 0):
+ return FX_NEW CPDF_AsciiHexFilter;
+ case FXBSTR_ID('A', '8', '5', 0):
+ return FX_NEW CPDF_Ascii85Filter;
+ case FXBSTR_ID('R', 'u', 'n', 'L'):
+ return FX_NEW CPDF_RunLenFilter;
+ case FXBSTR_ID('C', 'C', 'I', 'T'): {
+ int Encoding = 0;
+ int bEndOfLine = FALSE;
+ int bByteAlign = FALSE;
+ int bBlack = FALSE;
+ int nRows = 0;
+ int nColumns = 1728;
+ if (pParam) {
+ Encoding = pParam->GetInteger(FX_BSTRC("K"));
+ bEndOfLine = pParam->GetInteger(FX_BSTRC("EndOfLine"));
+ bByteAlign = pParam->GetInteger(FX_BSTRC("EncodedByteAlign"));
+ bBlack = pParam->GetInteger(FX_BSTRC("BlackIs1"));
+ nColumns = pParam->GetInteger(FX_BSTRC("Columns"), 1728);
+ nRows = pParam->GetInteger(FX_BSTRC("Rows"));
+ }
+ if (nColumns == 0) {
+ nColumns = width;
+ }
+ if (nRows == 0) {
+ nRows = height;
+ }
+ CPDF_FaxFilter* pFilter = FX_NEW CPDF_FaxFilter();
+ pFilter->Initialize(Encoding, bEndOfLine, bByteAlign, bBlack, nRows, nColumns);
+ return pFilter;
+ }
+ case FXBSTR_ID('D', 'C', 'T', 'D'):
+ return FX_NEW CPDF_JpegFilter;
+ default:
+ return NULL;
+ }
+}
+CFX_DataFilter* _FPDF_CreateFilterFromDict(CPDF_Dictionary* pDict)
+{
+ CPDF_Object* pDecoder = pDict->GetElementValue("Filter");
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ CFX_DataFilter* pFirstFilter = NULL;
+ int width = pDict->GetInteger(FX_BSTRC("Width")), height = pDict->GetInteger(FX_BSTRC("Height"));
+ CPDF_Object* pParams = pDict->GetElementValue("DecodeParms");
+ if (pDecoder->GetType() == PDFOBJ_ARRAY) {
+ if (pParams && pParams->GetType() != PDFOBJ_ARRAY) {
+ pParams = NULL;
+ }
+ for (FX_DWORD i = 0; i < ((CPDF_Array*)pDecoder)->GetCount(); i ++) {
+ CFX_ByteString name = ((CPDF_Array*)pDecoder)->GetString(i);
+ CPDF_Dictionary* pParam = NULL;
+ if (pParams) {
+ pParam = ((CPDF_Array*)pParams)->GetDict(i);
+ }
+ CFX_DataFilter* pDestFilter = FPDF_CreateFilter(name, pParam, width, height);
+ if (pDestFilter) {
+ if (pFirstFilter == NULL) {
+ pFirstFilter = pDestFilter;
+ } else {
+ pFirstFilter->SetDestFilter(pDestFilter);
+ }
+ }
+ }
+ } else {
+ if (pParams && pParams->GetType() != PDFOBJ_DICTIONARY) {
+ pParams = NULL;
+ }
+ pFirstFilter = FPDF_CreateFilter(pDecoder->GetString(), (CPDF_Dictionary*)pParams, width, height);
+ }
+ return pFirstFilter;
+}
+CPDF_StreamFilter* CPDF_Stream::GetStreamFilter(FX_BOOL bRaw) const
+{
+ CFX_DataFilter* pFirstFilter = NULL;
+ if (m_pCryptoHandler) {
+ pFirstFilter = FX_NEW CPDF_DecryptFilter(m_pCryptoHandler, m_ObjNum, m_GenNum);
+ }
+ if (!bRaw) {
+ CFX_DataFilter* pFilter = _FPDF_CreateFilterFromDict(m_pDict);
+ if (pFilter) {
+ if (pFirstFilter == NULL) {
+ pFirstFilter = pFilter;
+ } else {
+ pFirstFilter->SetDestFilter(pFilter);
+ }
+ }
+ }
+ CPDF_StreamFilter* pStreamFilter = FX_NEW CPDF_StreamFilter;
+ pStreamFilter->m_pStream = this;
+ pStreamFilter->m_pFilter = pFirstFilter;
+ pStreamFilter->m_pBuffer = NULL;
+ pStreamFilter->m_SrcOffset = 0;
+ return pStreamFilter;
+}
+CPDF_StreamFilter::~CPDF_StreamFilter()
+{
+ if (m_pFilter) {
+ delete m_pFilter;
+ }
+ if (m_pBuffer) {
+ delete m_pBuffer;
+ }
+}
+#define FPDF_FILTER_BUFFER_IN_SIZE FPDF_FILTER_BUFFER_SIZE
+FX_DWORD CPDF_StreamFilter::ReadBlock(FX_LPBYTE buffer, FX_DWORD buf_size)
+{
+ if (m_pFilter == NULL) {
+ FX_DWORD read_size = m_pStream->GetRawSize() - m_SrcOffset;
+ if (read_size == 0) {
+ return 0;
+ }
+ if (read_size > buf_size) {
+ read_size = buf_size;
+ }
+ m_pStream->ReadRawData(m_SrcOffset, buffer, read_size);
+ m_SrcOffset += read_size;
+ return read_size;
+ }
+ FX_DWORD read_size = 0;
+ if (m_pBuffer) {
+ read_size = ReadLeftOver(buffer, buf_size);
+ if (read_size == buf_size) {
+ return read_size;
+ }
+ buffer += read_size;
+ buf_size -= read_size;
+ }
+ ASSERT(m_pBuffer == NULL);
+ if (m_pFilter->IsEOF()) {
+ return read_size;
+ }
+ m_pBuffer = FX_NEW CFX_BinaryBuf;
+ m_pBuffer->EstimateSize(FPDF_FILTER_BUFFER_SIZE, FPDF_FILTER_BUFFER_SIZE);
+ m_BufOffset = 0;
+ while (1) {
+ int src_size = m_pStream->GetRawSize() - m_SrcOffset;
+ if (src_size == 0) {
+ m_pFilter->FilterFinish(*m_pBuffer);
+ break;
+ }
+ if (src_size > FPDF_FILTER_BUFFER_IN_SIZE) {
+ src_size = FPDF_FILTER_BUFFER_IN_SIZE;
+ }
+ if (!m_pStream->ReadRawData(m_SrcOffset, m_SrcBuffer, src_size)) {
+ return 0;
+ }
+ m_SrcOffset += src_size;
+ m_pFilter->FilterIn(m_SrcBuffer, src_size, *m_pBuffer);
+ if (m_pBuffer->GetSize() >= (int)buf_size) {
+ break;
+ }
+ }
+ return read_size + ReadLeftOver(buffer, buf_size);
+}
+FX_DWORD CPDF_StreamFilter::ReadLeftOver(FX_LPBYTE buffer, FX_DWORD buf_size)
+{
+ FX_DWORD read_size = m_pBuffer->GetSize() - m_BufOffset;
+ if (read_size > buf_size) {
+ read_size = buf_size;
+ }
+ FXSYS_memcpy32(buffer, m_pBuffer->GetBuffer() + m_BufOffset, read_size);
+ m_BufOffset += read_size;
+ if (m_BufOffset == (FX_DWORD)m_pBuffer->GetSize()) {
+ delete m_pBuffer;
+ m_pBuffer = NULL;
+ }
+ return read_size;
+}
+CPDF_DecryptFilter::CPDF_DecryptFilter(CPDF_CryptoHandler* pCryptoHandler, FX_DWORD objnum, FX_DWORD gennum)
+{
+ m_pCryptoHandler = pCryptoHandler;
+ m_pContext = NULL;
+ m_ObjNum = objnum;
+ m_GenNum = gennum;
+}
+CPDF_DecryptFilter::~CPDF_DecryptFilter()
+{
+ CFX_BinaryBuf buf;
+ if (m_pContext) {
+ m_pCryptoHandler->DecryptFinish(m_pContext, buf);
+ }
+}
+void CPDF_DecryptFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = m_pCryptoHandler->DecryptStart(m_ObjNum, m_GenNum);
+ }
+ m_pCryptoHandler->DecryptStream(m_pContext, src_buf, src_size, dest_buf);
+}
+void CPDF_DecryptFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ m_bEOF = TRUE;
+ if (m_pContext == NULL) {
+ return;
+ }
+ m_pCryptoHandler->DecryptFinish(m_pContext, dest_buf);
+ m_pContext = NULL;
+}
+extern "C" {
+ static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
+ {
+ return FX_Alloc(FX_BYTE, items * size);
+ }
+ static void my_free_func (void* opaque, void* address)
+ {
+ FX_Free(address);
+ }
+ void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
+ void (*free_func)(void*, void*));
+ void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size);
+ int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size);
+ int FPDFAPI_FlateGetAvailIn(void* context);
+ int FPDFAPI_FlateGetAvailOut(void* context);
+ void FPDFAPI_FlateEnd(void* context);
+}
+CPDF_FlateFilter::CPDF_FlateFilter()
+{
+ m_pContext = NULL;
+}
+CPDF_FlateFilter::~CPDF_FlateFilter()
+{
+ if (m_pContext) {
+ FPDFAPI_FlateEnd(m_pContext);
+ }
+}
+void CPDF_FlateFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ }
+ FPDFAPI_FlateInput(m_pContext, src_buf, src_size);
+ while (1) {
+ int ret = FPDFAPI_FlateOutput(m_pContext, m_DestBuffer, FPDF_FILTER_BUFFER_SIZE);
+ int out_size = FPDF_FILTER_BUFFER_SIZE - FPDFAPI_FlateGetAvailOut(m_pContext);
+ dest_buf.AppendBlock(m_DestBuffer, out_size);
+ if (ret == Z_BUF_ERROR) {
+ break;
+ }
+ if (ret != Z_OK) {
+ ReportEOF(FPDFAPI_FlateGetAvailIn(m_pContext));
+ break;
+ }
+ }
+}
+CPDF_LzwFilter::CPDF_LzwFilter(FX_BOOL bEarlyChange)
+{
+ m_bEarlyChange = bEarlyChange ? 1 : 0;
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ m_nLeftBits = 0;
+ m_LeftBits = 0;
+ m_OldCode = (FX_DWORD) - 1;
+}
+void CPDF_LzwFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ if (m_nLeftBits + 8 < m_CodeLen) {
+ m_nLeftBits += 8;
+ m_LeftBits = (m_LeftBits << 8) | src_buf[i];
+ continue;
+ }
+ FX_DWORD new_bits = m_CodeLen - m_nLeftBits;
+ FX_DWORD code = (m_LeftBits << new_bits) | (src_buf[i] >> (8 - new_bits));
+ m_nLeftBits = 8 - new_bits;
+ m_LeftBits = src_buf[i] % (1 << m_nLeftBits);
+ if (code < 256) {
+ dest_buf.AppendByte((FX_BYTE)code);
+ m_LastChar = (FX_BYTE)code;
+ if (m_OldCode != -1) {
+ AddCode(m_OldCode, m_LastChar);
+ }
+ m_OldCode = code;
+ } else if (code == 256) {
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ m_OldCode = (FX_DWORD) - 1;
+ } else if (code == 257) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ if (m_OldCode == -1) {
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ m_StackLen = 0;
+ if (code >= m_nCodes + 258) {
+ if (m_StackLen < sizeof(m_DecodeStack)) {
+ m_DecodeStack[m_StackLen++] = m_LastChar;
+ }
+ DecodeString(m_OldCode);
+ } else {
+ DecodeString(code);
+ }
+ dest_buf.AppendBlock(NULL, m_StackLen);
+ FX_LPBYTE pOutput = dest_buf.GetBuffer() + dest_buf.GetSize() - m_StackLen;
+ for (FX_DWORD cc = 0; cc < m_StackLen; cc ++) {
+ pOutput[cc] = m_DecodeStack[m_StackLen - cc - 1];
+ }
+ m_LastChar = m_DecodeStack[m_StackLen - 1];
+ if (m_OldCode < 256) {
+ AddCode(m_OldCode, m_LastChar);
+ } else if (m_OldCode - 258 >= m_nCodes) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ AddCode(m_OldCode, m_LastChar);
+ }
+ m_OldCode = code;
+ }
+ }
+}
+void CPDF_LzwFilter::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
+{
+ if (m_nCodes + m_bEarlyChange == 4094) {
+ return;
+ }
+ m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
+ if (m_nCodes + m_bEarlyChange == 512 - 258) {
+ m_CodeLen = 10;
+ } else if (m_nCodes + m_bEarlyChange == 1024 - 258) {
+ m_CodeLen = 11;
+ } else if (m_nCodes + m_bEarlyChange == 2048 - 258) {
+ m_CodeLen = 12;
+ }
+}
+void CPDF_LzwFilter::DecodeString(FX_DWORD code)
+{
+ while (1) {
+ int index = code - 258;
+ if (index < 0 || index >= (int)m_nCodes) {
+ break;
+ }
+ FX_DWORD data = m_CodeArray[index];
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
+ code = data >> 16;
+ }
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
+}
+CPDF_PredictorFilter::CPDF_PredictorFilter(int predictor, int colors, int bpc, int cols)
+{
+ m_bTiff = predictor < 10;
+ m_pRefLine = NULL;
+ m_pCurLine = NULL;
+ m_iLine = 0;
+ m_LineInSize = 0;
+ m_Bpp = (colors * bpc + 7) / 8;
+ m_Pitch = (colors * bpc * cols + 7) / 8;
+ if (!m_bTiff) {
+ m_Pitch ++;
+ }
+}
+CPDF_PredictorFilter::~CPDF_PredictorFilter()
+{
+ if (m_pCurLine) {
+ FX_Free(m_pCurLine);
+ }
+ if (m_pRefLine) {
+ FX_Free(m_pRefLine);
+ }
+}
+static FX_BYTE PaethPredictor(int a, int b, int c)
+{
+ int p = a + b - c;
+ int pa = FXSYS_abs(p - a);
+ int pb = FXSYS_abs(p - b);
+ int pc = FXSYS_abs(p - c);
+ if (pa <= pb && pa <= pc) {
+ return (FX_BYTE)a;
+ }
+ if (pb <= pc) {
+ return (FX_BYTE)b;
+ }
+ return (FX_BYTE)c;
+}
+static void PNG_PredictorLine(FX_LPBYTE cur_buf, FX_LPBYTE ref_buf, int pitch, int Bpp)
+{
+ FX_BYTE tag = cur_buf[0];
+ if (tag == 0) {
+ return;
+ }
+ cur_buf ++;
+ if (ref_buf) {
+ ref_buf ++;
+ }
+ for (int byte = 0; byte < pitch; byte ++) {
+ FX_BYTE raw_byte = cur_buf[byte];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ cur_buf[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ cur_buf[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ cur_buf[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= Bpp) {
+ left = cur_buf[byte - Bpp];
+ }
+ FX_BYTE up = 0;
+ if (ref_buf) {
+ up = ref_buf[byte];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= Bpp && ref_buf) {
+ upper_left = ref_buf[byte - Bpp];
+ }
+ cur_buf[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ }
+ }
+}
+void CPDF_PredictorFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pCurLine == NULL) {
+ m_pCurLine = FX_Alloc(FX_BYTE, m_Pitch);
+ if (!m_bTiff) {
+ m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ }
+ while (1) {
+ FX_DWORD read_size = m_Pitch - m_LineInSize;
+ if (read_size > src_size) {
+ read_size = src_size;
+ }
+ FXSYS_memcpy32(m_pCurLine + m_LineInSize, src_buf, read_size);
+ m_LineInSize += read_size;
+ if (m_LineInSize < m_Pitch) {
+ break;
+ }
+ src_buf += read_size;
+ src_size -= read_size;
+ if (m_bTiff) {
+ for (FX_DWORD byte = m_Bpp; byte < m_Pitch; byte ++) {
+ m_pCurLine[byte] += m_pCurLine[byte - m_Bpp];
+ }
+ dest_buf.AppendBlock(m_pCurLine, m_Pitch);
+ } else {
+ PNG_PredictorLine(m_pCurLine, m_iLine ? m_pRefLine : NULL, m_Pitch - 1, m_Bpp);
+ dest_buf.AppendBlock(m_pCurLine + 1, m_Pitch - 1);
+ m_iLine ++;
+ FX_LPBYTE temp = m_pCurLine;
+ m_pCurLine = m_pRefLine;
+ m_pRefLine = temp;
+ }
+ m_LineInSize = 0;
+ }
+}
+CPDF_Ascii85Filter::CPDF_Ascii85Filter()
+{
+ m_State = 0;
+ m_CharCount = 0;
+}
+extern const FX_LPCSTR _PDF_CharType;
+void CPDF_Ascii85Filter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ if (_PDF_CharType[byte] == 'W') {
+ continue;
+ }
+ switch (m_State) {
+ case 0:
+ if (byte >= '!' && byte <= 'u') {
+ int digit = byte - '!';
+ m_CurDWord = digit;
+ m_CharCount = 1;
+ m_State = 1;
+ } else if (byte == 'z') {
+ int zero = 0;
+ dest_buf.AppendBlock(&zero, 4);
+ } else if (byte == '~') {
+ m_State = 2;
+ }
+ break;
+ case 1: {
+ if (byte >= '!' && byte <= 'u') {
+ int digit = byte - '!';
+ m_CurDWord = m_CurDWord * 85 + digit;
+ m_CharCount ++;
+ if (m_CharCount == 5) {
+ for (int i = 0; i < 4; i ++) {
+ dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+ }
+ m_State = 0;
+ }
+ } else if (byte == '~') {
+ if (m_CharCount > 1) {
+ int i;
+ for (i = m_CharCount; i < 5; i ++) {
+ m_CurDWord = m_CurDWord * 85 + 84;
+ }
+ for (i = 0; i < m_CharCount - 1; i ++) {
+ dest_buf.AppendByte((FX_BYTE)(m_CurDWord >> (3 - i) * 8));
+ }
+ }
+ m_State = 2;
+ }
+ break;
+ }
+ case 2:
+ if (byte == '>') {
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ break;
+ }
+ }
+}
+CPDF_AsciiHexFilter::CPDF_AsciiHexFilter()
+{
+ m_State = 0;
+}
+void CPDF_AsciiHexFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ if (_PDF_CharType[byte] == 'W') {
+ continue;
+ }
+ int digit;
+ if (byte >= '0' && byte <= '9') {
+ digit = byte - '0';
+ } else if (byte >= 'a' && byte <= 'f') {
+ digit = byte - 'a' + 10;
+ } else if (byte >= 'A' && byte <= 'F') {
+ digit = byte - 'A' + 10;
+ } else {
+ if (m_State) {
+ dest_buf.AppendByte(m_FirstDigit * 16);
+ }
+ ReportEOF(src_size - i - 1);
+ return;
+ }
+ if (m_State == 0) {
+ m_FirstDigit = digit;
+ m_State ++;
+ } else {
+ dest_buf.AppendByte(m_FirstDigit * 16 + digit);
+ m_State --;
+ }
+ }
+}
+CPDF_RunLenFilter::CPDF_RunLenFilter()
+{
+ m_State = 0;
+ m_Count = 0;
+}
+void CPDF_RunLenFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ for (FX_DWORD i = 0; i < src_size; i ++) {
+ FX_BYTE byte = src_buf[i];
+ switch (m_State) {
+ case 0:
+ if (byte < 128) {
+ m_State = 1;
+ m_Count = byte + 1;
+ } else if (byte == 128) {
+ ReportEOF(src_size - i - 1);
+ return;
+ } else {
+ m_State = 2;
+ m_Count = 257 - byte;
+ }
+ break;
+ case 1:
+ dest_buf.AppendByte(byte);
+ m_Count --;
+ if (m_Count == 0) {
+ m_State = 0;
+ }
+ break;
+ case 2: {
+ dest_buf.AppendBlock(NULL, m_Count);
+ FXSYS_memset8(dest_buf.GetBuffer() + dest_buf.GetSize() - m_Count, byte, m_Count);
+ m_State = 0;
+ break;
+ }
+ }
+ }
+}
+CPDF_JpegFilter::CPDF_JpegFilter()
+{
+ m_pContext = NULL;
+ m_bGotHeader = FALSE;
+ m_pScanline = NULL;
+ m_iLine = 0;
+}
+CPDF_JpegFilter::~CPDF_JpegFilter()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pContext) {
+ CPDF_ModuleMgr::Get()->GetJpegModule()->Finish(m_pContext);
+ }
+}
+void CPDF_JpegFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ if (m_pContext == NULL) {
+ m_pContext = CPDF_ModuleMgr::Get()->GetJpegModule()->Start();
+ }
+ FX_LPCBYTE jpeg_src_buf;
+ FX_DWORD jpeg_src_size;
+ CFX_BinaryBuf temp_buf;
+ if (m_InputBuf.GetSize()) {
+ temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
+ temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
+ m_InputBuf.Clear();
+ temp_buf.AppendBlock(src_buf, src_size);
+ jpeg_src_buf = temp_buf.GetBuffer();
+ jpeg_src_size = temp_buf.GetSize();
+ } else {
+ jpeg_src_buf = src_buf;
+ jpeg_src_size = src_size;
+ }
+ CPDF_ModuleMgr::Get()->GetJpegModule()->Input(m_pContext, jpeg_src_buf, jpeg_src_size);
+ if (!m_bGotHeader) {
+ int ret = CPDF_ModuleMgr::Get()->GetJpegModule()->ReadHeader(m_pContext, &m_Width, &m_Height, &m_nComps);
+ int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
+ if (ret == 1) {
+ ReportEOF(left_size);
+ return;
+ }
+ if (ret == 2) {
+ m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
+ return;
+ }
+ CPDF_ModuleMgr::Get()->GetJpegModule()->StartScanline(m_pContext, 1);
+ m_bGotHeader = TRUE;
+ m_Pitch = m_Width * m_nComps;
+ }
+ if (m_pScanline == NULL) {
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch + 4);
+ }
+ while (1) {
+ if (!CPDF_ModuleMgr::Get()->GetJpegModule()->ReadScanline(m_pContext, m_pScanline)) {
+ int left_size = CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext);
+ m_InputBuf.AppendBlock(jpeg_src_buf + jpeg_src_size - left_size, left_size);
+ break;
+ }
+ dest_buf.AppendBlock(m_pScanline, m_Pitch);
+ m_iLine ++;
+ if (m_iLine == m_Height) {
+ ReportEOF(CPDF_ModuleMgr::Get()->GetJpegModule()->GetAvailInput(m_pContext));
+ return;
+ }
+ }
+}
+CPDF_FaxFilter::CPDF_FaxFilter()
+{
+ m_Encoding = 0;
+ m_bEndOfLine = FALSE;
+ m_bByteAlign = FALSE;
+ m_bBlack = FALSE;
+ m_nRows = 0;
+ m_nColumns = 0;
+ m_Pitch = 0;
+ m_pScanlineBuf = NULL;
+ m_pRefBuf = NULL;
+ m_iRow = 0;
+ m_InputBitPos = 0;
+}
+CPDF_FaxFilter::~CPDF_FaxFilter()
+{
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_pRefBuf) {
+ FX_Free(m_pRefBuf);
+ }
+}
+FX_BOOL CPDF_FaxFilter::Initialize(int Encoding, int bEndOfLine, int bByteAlign, int bBlack, int nRows, int nColumns)
+{
+ m_Encoding = Encoding;
+ m_bEndOfLine = bEndOfLine;
+ m_bByteAlign = bByteAlign;
+ m_bBlack = bBlack;
+ m_nRows = nRows;
+ m_nColumns = nColumns;
+ m_Pitch = (m_nColumns + 7) / 8;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
+ m_iRow = 0;
+ m_InputBitPos = 0;
+ return TRUE;
+}
+void CPDF_FaxFilter::v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf)
+{
+ FX_LPCBYTE fax_src_buf;
+ FX_DWORD fax_src_size;
+ CFX_BinaryBuf temp_buf;
+ int bitpos;
+ if (m_InputBuf.GetSize()) {
+ temp_buf.EstimateSize(m_InputBuf.GetSize() + src_size);
+ temp_buf.AppendBlock(m_InputBuf.GetBuffer(), m_InputBuf.GetSize());
+ m_InputBuf.Clear();
+ temp_buf.AppendBlock(src_buf, src_size);
+ fax_src_buf = temp_buf.GetBuffer();
+ fax_src_size = temp_buf.GetSize();
+ bitpos = m_InputBitPos;
+ } else {
+ fax_src_buf = src_buf;
+ fax_src_size = src_size;
+ bitpos = 0;
+ }
+ ProcessData(fax_src_buf, fax_src_size, bitpos, FALSE, dest_buf);
+ int left_bits = fax_src_size * 8 - bitpos;
+ m_InputBuf.AppendBlock(fax_src_buf + bitpos / 8, (left_bits + 7) / 8);
+ m_InputBitPos = bitpos % 8;
+}
+void CPDF_FaxFilter::v_FilterFinish(CFX_BinaryBuf& dest_buf)
+{
+ ProcessData(m_InputBuf.GetBuffer(), m_InputBuf.GetSize(), m_InputBitPos, TRUE, dest_buf);
+}
+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos);
+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns);
+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns);
+void CPDF_FaxFilter::ProcessData(FX_LPCBYTE src_buf, FX_DWORD src_size, int& bitpos, FX_BOOL bFinish,
+ CFX_BinaryBuf& dest_buf)
+{
+ int bitsize = src_size * 8;
+ while (1) {
+ if ((bitsize < bitpos + 256) && !bFinish) {
+ return;
+ }
+ int start_bitpos = bitpos;
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ if (!ReadLine(src_buf, bitsize, bitpos)) {
+ bitpos = start_bitpos;
+ return;
+ }
+ if (m_Encoding) {
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ }
+ if (m_bBlack) {
+ for (int i = 0; i < m_Pitch; i ++) {
+ m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
+ }
+ }
+ dest_buf.AppendBlock(m_pScanlineBuf, m_Pitch);
+ m_iRow ++;
+ if (m_iRow == m_nRows) {
+ ReportEOF(src_size - (bitpos + 7) / 8);
+ return;
+ }
+ }
+}
+FX_BOOL CPDF_FaxFilter::ReadLine(FX_LPCBYTE src_buf, int bitsize, int& bitpos)
+{
+ if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
+ return FALSE;
+ }
+ FX_BOOL ret;
+ if (m_Encoding < 0) {
+ ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
+ } else if (m_Encoding == 0) {
+ ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
+ } else {
+ if (bitpos == bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bNext1D = src_buf[bitpos / 8] & (1 << (7 - bitpos % 8));
+ bitpos ++;
+ if (bNext1D) {
+ ret = _FaxGet1DLine(src_buf, bitsize, bitpos, m_pScanlineBuf, m_nColumns);
+ } else {
+ ret = _FaxG4GetRow(src_buf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_nColumns);
+ }
+ }
+ if (!ret) {
+ return FALSE;
+ }
+ if (m_bEndOfLine)
+ if (!_FaxSkipEOL(src_buf, bitsize, bitpos)) {
+ return FALSE;
+ }
+ if (m_bByteAlign) {
+ bitpos = (bitpos + 7) / 8 * 8;
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
new file mode 100644
index 0000000000..53cf892d7e
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -0,0 +1,1344 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+void CPDF_Object::Release()
+{
+ if (this == NULL) {
+ return;
+ }
+ if (m_ObjNum) {
+ return;
+ }
+ Destroy();
+}
+void CPDF_Object::Destroy()
+{
+ switch (m_Type) {
+ case PDFOBJ_STRING:
+ delete (CPDF_String*)this;
+ break;
+ case PDFOBJ_NAME:
+ delete (CPDF_Name*)this;
+ break;
+ case PDFOBJ_ARRAY:
+ delete (CPDF_Array*)this;
+ break;
+ case PDFOBJ_DICTIONARY:
+ delete (CPDF_Dictionary*)this;
+ break;
+ case PDFOBJ_STREAM:
+ delete (CPDF_Stream*)this;
+ break;
+ default:
+ delete this;
+ }
+}
+CFX_ByteString CPDF_Object::GetString() const
+{
+ if (this == NULL) {
+ return CFX_ByteString();
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return ((CPDF_Boolean*)this)->m_bValue ? "true" : "false";
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetString();
+ case PDFOBJ_STRING:
+ return ((CPDF_String*)this)->m_String;
+ case PDFOBJ_NAME:
+ return ((CPDF_Name*)this)->m_Name;
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return CFX_ByteString();
+ }
+ return pObj->GetString();
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Object::GetConstString() const
+{
+ if (this == NULL) {
+ return CFX_ByteStringC();
+ }
+ switch (m_Type) {
+ case PDFOBJ_STRING:
+ return CFX_ByteStringC((FX_LPCBYTE)((CPDF_String*)this)->m_String, ((CPDF_String*)this)->m_String.GetLength());
+ case PDFOBJ_NAME:
+ return CFX_ByteStringC((FX_LPCBYTE)((CPDF_Name*)this)->m_Name, ((CPDF_Name*)this)->m_Name.GetLength());
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return CFX_ByteStringC();
+ }
+ return pObj->GetConstString();
+ }
+ }
+ return CFX_ByteStringC();
+}
+FX_FLOAT CPDF_Object::GetNumber() const
+{
+ if (this == NULL) {
+ return 0;
+ }
+ switch (m_Type) {
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetNumber();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetNumber();
+ }
+ }
+ return 0;
+}
+FX_FLOAT CPDF_Object::GetNumber16() const
+{
+ return GetNumber();
+}
+int CPDF_Object::GetInteger() const
+{
+ if (this == NULL) {
+ return 0;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return ((CPDF_Boolean*)this)->m_bValue;
+ case PDFOBJ_NUMBER:
+ return ((CPDF_Number*)this)->GetInteger();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ PARSE_CONTEXT context;
+ FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
+ if (pRef->m_pObjList == NULL) {
+ return 0;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum, &context);
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+ }
+ }
+ return 0;
+}
+CPDF_Dictionary* CPDF_Object::GetDict() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ switch (m_Type) {
+ case PDFOBJ_DICTIONARY:
+ return (CPDF_Dictionary*)this;
+ case PDFOBJ_STREAM:
+ return ((CPDF_Stream*)this)->GetDict();
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ if (pRef->m_pObjList == NULL) {
+ break;
+ }
+ CPDF_Object* pObj = pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+ }
+ }
+ return NULL;
+}
+CPDF_Array* CPDF_Object::GetArray() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_Type == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)this;
+ }
+ return NULL;
+}
+void CPDF_Object::SetString(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL);
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ ((CPDF_Boolean*)this)->m_bValue = str == FX_BSTRC("true") ? 1 : 0;
+ return;
+ case PDFOBJ_NUMBER:
+ ((CPDF_Number*)this)->SetString(str);
+ return;
+ case PDFOBJ_STRING:
+ ((CPDF_String*)this)->m_String = str;
+ return;
+ case PDFOBJ_NAME:
+ ((CPDF_Name*)this)->m_Name = str;
+ return;
+ }
+ ASSERT(FALSE);
+}
+int CPDF_Object::GetDirectType() const
+{
+ if (m_Type != PDFOBJ_REFERENCE) {
+ return m_Type;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ return pRef->m_pObjList->GetIndirectType(pRef->m_RefObjNum);
+}
+FX_BOOL CPDF_Object::IsIdentical(CPDF_Object* pOther) const
+{
+ if (this == pOther) {
+ return TRUE;
+ }
+ if (this == NULL || pOther == NULL) {
+ return FALSE;
+ }
+ if (pOther->m_Type != m_Type) {
+ if (m_Type == PDFOBJ_REFERENCE) {
+ return GetDirect()->IsIdentical(pOther);
+ } else if (pOther->m_Type == PDFOBJ_REFERENCE) {
+ return IsIdentical(pOther->GetDirect());
+ }
+ return FALSE;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return (((CPDF_Boolean*)this)->Identical((CPDF_Boolean*)pOther));
+ case PDFOBJ_NUMBER:
+ return (((CPDF_Number*)this)->Identical((CPDF_Number*)pOther));
+ case PDFOBJ_STRING:
+ return (((CPDF_String*)this)->Identical((CPDF_String*)pOther));
+ case PDFOBJ_NAME:
+ return (((CPDF_Name*)this)->Identical((CPDF_Name*)pOther));
+ case PDFOBJ_ARRAY:
+ return (((CPDF_Array*)this)->Identical((CPDF_Array*)pOther));
+ case PDFOBJ_DICTIONARY:
+ return (((CPDF_Dictionary*)this)->Identical((CPDF_Dictionary*)pOther));
+ case PDFOBJ_NULL:
+ return TRUE;
+ case PDFOBJ_STREAM:
+ return (((CPDF_Stream*)this)->Identical((CPDF_Stream*)pOther));
+ case PDFOBJ_REFERENCE:
+ return (((CPDF_Reference*)this)->Identical((CPDF_Reference*)pOther));
+ }
+ return FALSE;
+}
+CPDF_Object* CPDF_Object::GetDirect() const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_Type != PDFOBJ_REFERENCE) {
+ return (CPDF_Object*)this;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)(FX_LPVOID)this;
+ if (pRef->m_pObjList == NULL) {
+ return NULL;
+ }
+ return pRef->m_pObjList->GetIndirectObject(pRef->m_RefObjNum);
+}
+CPDF_Object* CPDF_Object::Clone(FX_BOOL bDirect) const
+{
+ CFX_MapPtrToPtr visited;
+ return CloneInternal(bDirect, &visited);
+}
+CPDF_Object* CPDF_Object::CloneInternal(FX_BOOL bDirect, CFX_MapPtrToPtr* visited) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ switch (m_Type) {
+ case PDFOBJ_BOOLEAN:
+ return FX_NEW CPDF_Boolean(((CPDF_Boolean*)this)->m_bValue);
+ case PDFOBJ_NUMBER:
+ return FX_NEW CPDF_Number(((CPDF_Number*)this)->m_bInteger, &((CPDF_Number*)this)->m_Integer);
+ case PDFOBJ_STRING:
+ return FX_NEW CPDF_String(((CPDF_String*)this)->m_String, ((CPDF_String*)this)->IsHex());
+ case PDFOBJ_NAME:
+ return FX_NEW CPDF_Name(((CPDF_Name*)this)->m_Name);
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* pCopy = FX_NEW CPDF_Array();
+ CPDF_Array* pThis = (CPDF_Array*)this;
+ int n = pThis->GetCount();
+ for (int i = 0; i < n; i ++) {
+ CPDF_Object* value = (CPDF_Object*)pThis->m_Objects.GetAt(i);
+ pCopy->m_Objects.Add(value->CloneInternal(bDirect, visited));
+ }
+ return pCopy;
+ }
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* pCopy = FX_NEW CPDF_Dictionary();
+ CPDF_Dictionary* pThis = (CPDF_Dictionary*)this;
+ FX_POSITION pos = pThis->m_Map.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* value;
+ pThis->m_Map.GetNextAssoc(pos, key, (void*&)value);
+ pCopy->m_Map.SetAt(key, value->CloneInternal(bDirect, visited));
+ }
+ return pCopy;
+ }
+ case PDFOBJ_NULL: {
+ return FX_NEW CPDF_Null;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* pThis = (CPDF_Stream*)this;
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pThis, TRUE);
+ FX_DWORD streamSize = acc.GetSize();
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, (CPDF_Dictionary*)((CPDF_Object*)pThis->GetDict())->CloneInternal(bDirect, visited));
+ return pObj;
+ }
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* pRef = (CPDF_Reference*)this;
+ FX_DWORD obj_num = pRef->m_RefObjNum;
+ if (bDirect && !visited->GetValueAt((void*)(FX_UINTPTR)obj_num)) {
+ visited->SetAt((void*)(FX_UINTPTR)obj_num, (void*)1);
+ CPDF_Object* ret = pRef->GetDirect()->CloneInternal(TRUE, visited);
+ return ret;
+ } else {
+ return FX_NEW CPDF_Reference(pRef->m_pObjList, obj_num);
+ }
+ }
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_Object::CloneRef(CPDF_IndirectObjects* pDoc) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (m_ObjNum) {
+ return FX_NEW CPDF_Reference(pDoc, m_ObjNum);
+ }
+ return Clone();
+}
+CFX_WideString CPDF_Object::GetUnicodeText(CFX_CharMap* pCharMap) const
+{
+ if (this == NULL) {
+ return CFX_WideString();
+ }
+ if (m_Type == PDFOBJ_STRING) {
+ return PDF_DecodeText(((CPDF_String*)this)->m_String, pCharMap);
+ } else if (m_Type == PDFOBJ_STREAM) {
+ CPDF_StreamAcc stream;
+ stream.LoadAllData((CPDF_Stream*)this, FALSE);
+ CFX_WideString result = PDF_DecodeText(stream.GetData(), stream.GetSize(), pCharMap);
+ return result;
+ } else if (m_Type == PDFOBJ_NAME) {
+ return PDF_DecodeText(((CPDF_Name*)this)->m_Name, pCharMap);
+ }
+ return CFX_WideString();
+}
+void CPDF_Object::SetUnicodeText(FX_LPCWSTR pUnicodes, int len)
+{
+ if (this == NULL) {
+ return;
+ }
+ if (m_Type == PDFOBJ_STRING) {
+ ((CPDF_String*)this)->m_String = PDF_EncodeText(pUnicodes, len);
+ } else if (m_Type == PDFOBJ_STREAM) {
+ CFX_ByteString result = PDF_EncodeText(pUnicodes, len);
+ ((CPDF_Stream*)this)->SetData((FX_LPBYTE)(FX_LPCSTR)result, result.GetLength(), FALSE, FALSE);
+ }
+}
+CPDF_Number::CPDF_Number(int value)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = TRUE;
+ m_Integer = value;
+}
+CPDF_Number::CPDF_Number(FX_FLOAT value)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = FALSE;
+ m_Float = value;
+}
+CPDF_Number::CPDF_Number(FX_BOOL bInteger, void* pData)
+{
+ m_Type = PDFOBJ_NUMBER;
+ m_bInteger = bInteger;
+ m_Integer = *(int*)pData;
+}
+extern void FX_atonum(FX_BSTR, FX_BOOL&, void*);
+CPDF_Number::CPDF_Number(FX_BSTR str)
+{
+ m_Type = PDFOBJ_NUMBER;
+ FX_atonum(str, m_bInteger, &m_Integer);
+}
+void CPDF_Number::SetString(FX_BSTR str)
+{
+ FX_atonum(str, m_bInteger, &m_Integer);
+}
+FX_BOOL CPDF_Number::Identical(CPDF_Number* pOther) const
+{
+ return m_bInteger == pOther->m_bInteger && m_Integer == pOther->m_Integer;
+}
+CFX_ByteString CPDF_Number::GetString() const
+{
+ return m_bInteger ? CFX_ByteString::FormatInteger(m_Integer, FXFORMAT_SIGNED) : CFX_ByteString::FormatFloat(m_Float);
+}
+void CPDF_Number::SetNumber(FX_FLOAT value)
+{
+ m_bInteger = FALSE;
+ m_Float = value;
+}
+CPDF_String::CPDF_String(const CFX_WideString& str)
+{
+ m_Type = PDFOBJ_STRING;
+ m_String = PDF_EncodeText(str, str.GetLength());
+ m_bHex = FALSE;
+}
+CPDF_Array::~CPDF_Array()
+{
+ int size = m_Objects.GetSize();
+ CPDF_Object** pList = (CPDF_Object**)m_Objects.GetData();
+ for (int i = 0; i < size; i ++) {
+ pList[i]->Release();
+ }
+}
+CFX_FloatRect CPDF_Array::GetRect()
+{
+ CFX_FloatRect rect;
+ if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 4) {
+ return rect;
+ }
+ rect.left = GetNumber(0);
+ rect.bottom = GetNumber(1);
+ rect.right = GetNumber(2);
+ rect.top = GetNumber(3);
+ return rect;
+}
+CFX_AffineMatrix CPDF_Array::GetMatrix()
+{
+ CFX_AffineMatrix matrix;
+ if (this == NULL || m_Type != PDFOBJ_ARRAY || m_Objects.GetSize() != 6) {
+ return matrix;
+ }
+ matrix.Set(GetNumber(0), GetNumber(1), GetNumber(2), GetNumber(3), GetNumber(4), GetNumber(5));
+ return matrix;
+}
+CPDF_Object* CPDF_Array::GetElement(FX_DWORD i) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return NULL;
+ }
+ return (CPDF_Object*)m_Objects.GetAt(i);
+}
+CPDF_Object* CPDF_Array::GetElementValue(FX_DWORD i) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return NULL;
+ }
+ return ((CPDF_Object*)m_Objects.GetAt(i))->GetDirect();
+}
+CFX_ByteString CPDF_Array::GetString(FX_DWORD i) const
+{
+ if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetString();
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Array::GetConstString(FX_DWORD i) const
+{
+ if (this && i < (FX_DWORD)m_Objects.GetSize()) {
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetConstString();
+ }
+ return CFX_ByteStringC();
+}
+int CPDF_Array::GetInteger(FX_DWORD i) const
+{
+ if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ return 0;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetInteger();
+}
+FX_FLOAT CPDF_Array::GetNumber(FX_DWORD i) const
+{
+ if (this == NULL || i >= (FX_DWORD)m_Objects.GetSize()) {
+ return 0;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ return p->GetNumber();
+}
+CPDF_Dictionary* CPDF_Array::GetDict(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL) {
+ return NULL;
+ } else if (p->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)p;
+ } else if (p->GetType() == PDFOBJ_STREAM) {
+ return ((CPDF_Stream*)p)->GetDict();
+ }
+ return NULL;
+}
+CPDF_Stream* CPDF_Array::GetStream(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ return (CPDF_Stream*)p;
+}
+CPDF_Array* CPDF_Array::GetArray(FX_DWORD i) const
+{
+ CPDF_Object* p = GetElementValue(i);
+ if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ return (CPDF_Array*)p;
+}
+void CPDF_Array::RemoveAt(FX_DWORD i)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return;
+ }
+ CPDF_Object* p = (CPDF_Object*)m_Objects.GetAt(i);
+ p->Release();
+ m_Objects.RemoveAt(i);
+}
+void CPDF_Array::SetAt(FX_DWORD i, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ ASSERT(i < (FX_DWORD)m_Objects.GetSize());
+ if (i >= (FX_DWORD)m_Objects.GetSize()) {
+ return;
+ }
+ CPDF_Object* pOld = (CPDF_Object*)m_Objects.GetAt(i);
+ pOld->Release();
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.SetAt(i, pObj);
+}
+void CPDF_Array::InsertAt(FX_DWORD index, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(pObj != NULL);
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.InsertAt(index, pObj);
+}
+void CPDF_Array::Add(CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(pObj != NULL);
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Objects.Add(pObj);
+}
+void CPDF_Array::AddName(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Name(str));
+}
+void CPDF_Array::AddString(const CFX_ByteString& str)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_String(str));
+}
+void CPDF_Array::AddInteger(int i)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Number(i));
+}
+void CPDF_Array::AddNumber(FX_FLOAT f)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ CPDF_Number* pNumber = FX_NEW CPDF_Number;
+ pNumber->SetNumber(f);
+ Add(pNumber);
+}
+void CPDF_Array::AddReference(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_ARRAY);
+ Add(FX_NEW CPDF_Reference(pDoc, objnum));
+}
+FX_BOOL CPDF_Array::Identical(CPDF_Array* pOther) const
+{
+ if (m_Objects.GetSize() != pOther->m_Objects.GetSize()) {
+ return FALSE;
+ }
+ for (int i = 0; i < m_Objects.GetSize(); i ++)
+ if (!((CPDF_Object*)m_Objects[i])->IsIdentical((CPDF_Object*)pOther->m_Objects[i])) {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDF_Dictionary::~CPDF_Dictionary()
+{
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ FX_LPVOID value = m_Map.GetNextValue(pos);
+ ((CPDF_Object*)value)->Release();
+ }
+}
+FX_POSITION CPDF_Dictionary::GetStartPos() const
+{
+ return m_Map.GetStartPosition();
+}
+CPDF_Object* CPDF_Dictionary::GetNextElement(FX_POSITION& pos, CFX_ByteString& key) const
+{
+ if (pos == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p;
+ m_Map.GetNextAssoc(pos, key, (FX_LPVOID&)p);
+ return p;
+}
+CPDF_Object* CPDF_Dictionary::GetElement(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ return p;
+}
+CPDF_Object* CPDF_Dictionary::GetElementValue(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return NULL;
+ }
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ return p->GetDirect();
+}
+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetString();
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetConstString();
+ }
+ }
+ return CFX_ByteStringC();
+}
+CFX_WideString CPDF_Dictionary::GetUnicodeText(FX_BSTR key, CFX_CharMap* pCharMap) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ if(p->GetType() == PDFOBJ_REFERENCE) {
+ p = ((CPDF_Reference*)p)->GetDirect();
+ return p->GetUnicodeText(pCharMap);
+ } else {
+ return p->GetUnicodeText(pCharMap);
+ }
+ }
+ }
+ return CFX_WideString();
+}
+CFX_ByteString CPDF_Dictionary::GetString(FX_BSTR key, FX_BSTR def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetString();
+ }
+ }
+ return CFX_ByteString(def);
+}
+CFX_ByteStringC CPDF_Dictionary::GetConstString(FX_BSTR key, FX_BSTR def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetConstString();
+ }
+ }
+ return CFX_ByteStringC(def);
+}
+int CPDF_Dictionary::GetInteger(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
+ }
+ }
+ return 0;
+}
+int CPDF_Dictionary::GetInteger(FX_BSTR key, int def) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetInteger();
+ }
+ }
+ return def;
+}
+FX_FLOAT CPDF_Dictionary::GetNumber(FX_BSTR key) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p) {
+ return p->GetNumber();
+ }
+ }
+ return 0;
+}
+FX_BOOL CPDF_Dictionary::GetBoolean(FX_BSTR key, FX_BOOL bDefault) const
+{
+ if (this) {
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p && p->GetType() == PDFOBJ_BOOLEAN) {
+ return p->GetInteger();
+ }
+ }
+ return bDefault;
+}
+CPDF_Dictionary* CPDF_Dictionary::GetDict(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL) {
+ return NULL;
+ } else if (p->GetType() == PDFOBJ_DICTIONARY) {
+ return (CPDF_Dictionary*)p;
+ } else if (p->GetType() == PDFOBJ_STREAM) {
+ return ((CPDF_Stream*)p)->GetDict();
+ }
+ return NULL;
+}
+CPDF_Array* CPDF_Dictionary::GetArray(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL || p->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ return (CPDF_Array*)p;
+}
+CPDF_Stream* CPDF_Dictionary::GetStream(FX_BSTR key) const
+{
+ CPDF_Object* p = GetElementValue(key);
+ if (p == NULL || p->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ return (CPDF_Stream*)p;
+}
+CFX_FloatRect CPDF_Dictionary::GetRect(FX_BSTR key) const
+{
+ CFX_FloatRect rect;
+ CPDF_Array* pArray = GetArray(key);
+ if (pArray) {
+ rect = pArray->GetRect();
+ }
+ return rect;
+}
+CFX_AffineMatrix CPDF_Dictionary::GetMatrix(FX_BSTR key) const
+{
+ CFX_AffineMatrix matrix;
+ CPDF_Array* pArray = GetArray(key);
+ if (pArray) {
+ matrix = pArray->GetMatrix();
+ }
+ return matrix;
+}
+FX_BOOL CPDF_Dictionary::KeyExist(FX_BSTR key) const
+{
+ if (this == NULL) {
+ return FALSE;
+ }
+ FX_LPVOID value;
+ return m_Map.Lookup(key, value);
+}
+void CPDF_Dictionary::SetAt(FX_BSTR key, CPDF_Object* pObj, CPDF_IndirectObjects* pObjs)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p == pObj) {
+ return;
+ }
+ if (p) {
+ p->Release();
+ }
+ if (pObj) {
+ if (pObj->GetObjNum()) {
+ ASSERT(pObjs != NULL);
+ pObj = CPDF_Reference::Create(pObjs, pObj->GetObjNum());
+ }
+ m_Map.SetAt(key, pObj);
+ } else {
+ m_Map.RemoveKey(key);
+ }
+}
+void CPDF_Dictionary::AddValue(FX_BSTR key, CPDF_Object* pObj)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ m_Map.AddValue(key, pObj);
+}
+void CPDF_Dictionary::RemoveAt(FX_BSTR key)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(key, (void*&)p);
+ if (p == NULL) {
+ return;
+ }
+ p->Release();
+ m_Map.RemoveKey(key);
+}
+void CPDF_Dictionary::ReplaceKey(FX_BSTR oldkey, FX_BSTR newkey)
+{
+ ASSERT(this != NULL && m_Type == PDFOBJ_DICTIONARY);
+ CPDF_Object* p = NULL;
+ m_Map.Lookup(oldkey, (void*&)p);
+ if (p == NULL) {
+ return;
+ }
+ m_Map.RemoveKey(oldkey);
+ m_Map.SetAt(newkey, p);
+}
+FX_BOOL CPDF_Dictionary::Identical(CPDF_Dictionary* pOther) const
+{
+ if (this == NULL) {
+ if (pOther == NULL) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pOther == NULL) {
+ return FALSE;
+ }
+ if (m_Map.GetCount() != pOther->m_Map.GetCount()) {
+ return FALSE;
+ }
+ FX_POSITION pos = m_Map.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ FX_LPVOID value;
+ m_Map.GetNextAssoc(pos, key, value);
+ if (!((CPDF_Object*)value)->IsIdentical(pOther->GetElement(key))) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CPDF_Dictionary::SetAtInteger(FX_BSTR key, int i)
+{
+ SetAt(key, FX_NEW CPDF_Number(i));
+}
+void CPDF_Dictionary::SetAtName(FX_BSTR key, const CFX_ByteString& name)
+{
+ SetAt(key, FX_NEW CPDF_Name(name));
+}
+void CPDF_Dictionary::SetAtString(FX_BSTR key, const CFX_ByteString& str)
+{
+ SetAt(key, FX_NEW CPDF_String(str));
+}
+void CPDF_Dictionary::SetAtReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ SetAt(key, FX_NEW CPDF_Reference(pDoc, objnum));
+}
+void CPDF_Dictionary::AddReference(FX_BSTR key, CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ AddValue(key, FX_NEW CPDF_Reference(pDoc, objnum));
+}
+void CPDF_Dictionary::SetAtNumber(FX_BSTR key, FX_FLOAT f)
+{
+ CPDF_Number* pNumber = FX_NEW CPDF_Number;
+ pNumber->SetNumber(f);
+ SetAt(key, pNumber);
+}
+void CPDF_Dictionary::SetAtBoolean(FX_BSTR key, FX_BOOL bValue)
+{
+ SetAt(key, FX_NEW CPDF_Boolean(bValue));
+}
+void CPDF_Dictionary::SetAtRect(FX_BSTR key, const CFX_FloatRect& rect)
+{
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddNumber(rect.left);
+ pArray->AddNumber(rect.bottom);
+ pArray->AddNumber(rect.right);
+ pArray->AddNumber(rect.top);
+ SetAt(key, pArray);
+}
+void CPDF_Dictionary::SetAtMatrix(FX_BSTR key, const CFX_AffineMatrix& matrix)
+{
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddNumber16(matrix.a);
+ pArray->AddNumber16(matrix.b);
+ pArray->AddNumber16(matrix.c);
+ pArray->AddNumber16(matrix.d);
+ pArray->AddNumber(matrix.e);
+ pArray->AddNumber(matrix.f);
+ SetAt(key, pArray);
+}
+CPDF_Stream::CPDF_Stream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
+{
+ m_Type = PDFOBJ_STREAM;
+ m_pDict = pDict;
+ m_dwSize = size;
+ m_GenNum = (FX_DWORD) - 1;
+ m_pDataBuf = pData;
+ m_pCryptoHandler = NULL;
+}
+CPDF_Stream::~CPDF_Stream()
+{
+ if (m_GenNum == (FX_DWORD) - 1 && m_pDataBuf != NULL) {
+ FX_Free(m_pDataBuf);
+ }
+ if (m_pDict) {
+ m_pDict->Release();
+ }
+}
+void CPDF_Stream::InitStream(CPDF_Dictionary* pDict)
+{
+ if (pDict) {
+ if (m_pDict) {
+ m_pDict->Release();
+ }
+ m_pDict = pDict;
+ }
+ if (m_GenNum == (FX_DWORD) - 1) {
+ if (m_pDataBuf) {
+ FX_Free(m_pDataBuf);
+ }
+ }
+ m_GenNum = 0;
+ m_pFile = NULL;
+ m_pCryptoHandler = NULL;
+ m_FileOffset = 0;
+}
+void CPDF_Stream::InitStream(FX_LPBYTE pData, FX_DWORD size, CPDF_Dictionary* pDict)
+{
+ InitStream(pDict);
+ m_GenNum = (FX_DWORD) - 1;
+ m_pDataBuf = FX_Alloc(FX_BYTE, size);
+ if (pData) {
+ FXSYS_memcpy32(m_pDataBuf, pData, size);
+ }
+ m_dwSize = size;
+ if (m_pDict) {
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
+ }
+}
+void CPDF_Stream::SetData(FX_LPCBYTE pData, FX_DWORD size, FX_BOOL bCompressed, FX_BOOL bKeepBuf)
+{
+ if (m_GenNum == (FX_DWORD) - 1) {
+ if (m_pDataBuf) {
+ FX_Free(m_pDataBuf);
+ }
+ } else {
+ m_GenNum = (FX_DWORD) - 1;
+ m_pCryptoHandler = NULL;
+ }
+ if (bKeepBuf) {
+ m_pDataBuf = (FX_LPBYTE)pData;
+ } else {
+ m_pDataBuf = FX_Alloc(FX_BYTE, size);
+ if (pData) {
+ FXSYS_memcpy32(m_pDataBuf, pData, size);
+ }
+ }
+ m_dwSize = size;
+ if (m_pDict == NULL) {
+ m_pDict = FX_NEW CPDF_Dictionary;
+ }
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), size);
+ if (!bCompressed) {
+ m_pDict->RemoveAt(FX_BSTRC("Filter"));
+ m_pDict->RemoveAt(FX_BSTRC("DecodeParms"));
+ }
+}
+FX_BOOL CPDF_Stream::ReadRawData(FX_FILESIZE offset, FX_LPBYTE buf, FX_DWORD size) const
+{
+ if ((m_GenNum != (FX_DWORD) - 1) && m_pFile) {
+ return m_pFile->ReadBlock(buf, m_FileOffset + offset, size);
+ }
+ if (m_pDataBuf) {
+ FXSYS_memcpy32(buf, m_pDataBuf + offset, size);
+ }
+ return TRUE;
+}
+void CPDF_Stream::InitStream(IFX_FileRead *pFile, CPDF_Dictionary* pDict)
+{
+ InitStream(pDict);
+ m_pFile = pFile;
+ m_dwSize = (FX_DWORD)pFile->GetSize();
+ if (m_pDict) {
+ m_pDict->SetAtInteger(FX_BSTRC("Length"), m_dwSize);
+ }
+}
+FX_BOOL CPDF_Stream::Identical(CPDF_Stream* pOther) const
+{
+ if (!m_pDict->Identical(pOther->m_pDict)) {
+ return FALSE;
+ }
+ if (m_dwSize != pOther->m_dwSize) {
+ return FALSE;
+ }
+ if (m_GenNum != (FX_DWORD) - 1 && pOther->m_GenNum != (FX_DWORD) - 1) {
+ if (m_pFile == pOther->m_pFile && m_pFile == NULL) {
+ return TRUE;
+ }
+ if (!m_pFile || !pOther->m_pFile) {
+ return FALSE;
+ }
+ FX_BYTE srcBuf[1024];
+ FX_BYTE destBuf[1024];
+ FX_DWORD size = m_dwSize;
+ FX_DWORD srcOffset = m_FileOffset;
+ FX_DWORD destOffset = pOther->m_FileOffset;
+ if (m_pFile == pOther->m_pFile && srcOffset == destOffset) {
+ return TRUE;
+ }
+ while (size > 0) {
+ FX_DWORD actualSize = size > 1024 ? 1024 : size;
+ m_pFile->ReadBlock(srcBuf, srcOffset, actualSize);
+ pOther->m_pFile->ReadBlock(destBuf, destOffset, actualSize);
+ if (FXSYS_memcmp32(srcBuf, destBuf, actualSize) != 0) {
+ return FALSE;
+ }
+ size -= actualSize;
+ srcOffset += actualSize;
+ destOffset += actualSize;
+ }
+ return TRUE;
+ }
+ if (m_GenNum != (FX_DWORD) - 1 || pOther->m_GenNum != (FX_DWORD) - 1) {
+ IFX_FileRead* pFile = NULL;
+ FX_LPBYTE pBuf = NULL;
+ FX_DWORD offset = 0;
+ if (m_GenNum != (FX_DWORD) - 1) {
+ pFile = m_pFile;
+ pBuf = pOther->m_pDataBuf;
+ offset = m_FileOffset;
+ }
+ if (pOther->m_GenNum != (FX_DWORD) - 1) {
+ pFile = pOther->m_pFile;
+ pBuf = m_pDataBuf;
+ offset = pOther->m_FileOffset;
+ }
+ if (NULL == pBuf) {
+ return FALSE;
+ }
+ FX_BYTE srcBuf[1024];
+ FX_DWORD size = m_dwSize;
+ while (size > 0) {
+ FX_DWORD actualSize = size > 1024 ? 1024 : size;
+ m_pFile->ReadBlock(srcBuf, offset, actualSize);
+ if (FXSYS_memcmp32(srcBuf, pBuf, actualSize) != 0) {
+ return FALSE;
+ }
+ pBuf += actualSize;
+ size -= actualSize;
+ offset += actualSize;
+ }
+ return TRUE;
+ }
+ return FXSYS_memcmp32(m_pDataBuf, pOther->m_pDataBuf, m_dwSize) == 0;
+}
+CPDF_Stream* CPDF_Stream::Clone(FX_BOOL bDirect, FPDF_LPFCloneStreamCallback lpfCallback, FX_LPVOID pUserData) const
+{
+ CPDF_Dictionary *pCloneDict = (CPDF_Dictionary*)m_pDict->Clone(bDirect);
+ IFX_FileStream *pFS = NULL;
+ if (lpfCallback) {
+ pFS = lpfCallback((CPDF_Stream*)this, pUserData);
+ }
+ if (!pFS) {
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(this, TRUE);
+ FX_DWORD streamSize = acc.GetSize();
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(acc.DetachData(), streamSize, pCloneDict);
+ return pObj;
+ }
+ CPDF_Stream* pObj = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ CPDF_StreamFilter *pSF = GetStreamFilter(TRUE);
+ if (pSF) {
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, 4096);
+ FX_DWORD dwRead;
+ do {
+ dwRead = pSF->ReadBlock(pBuf, 4096);
+ if (dwRead) {
+ pFS->WriteBlock(pBuf, dwRead);
+ }
+ } while (dwRead == 4096);
+ pFS->Flush();
+ FX_Free(pBuf);
+ delete pSF;
+ }
+ pObj->InitStream((IFX_FileRead*)pFS, pCloneDict);
+ return pObj;
+}
+extern FX_BOOL PDF_DataDecode(FX_LPCBYTE src_buf, FX_DWORD src_size, const CPDF_Dictionary* pDict,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, CFX_ByteString& ImageEncoding,
+ CPDF_Dictionary*& pImageParms, FX_DWORD estimated_size, FX_BOOL bImageAcc);
+CPDF_StreamAcc::CPDF_StreamAcc()
+{
+ m_bNewBuf = FALSE;
+ m_pData = NULL;
+ m_dwSize = 0;
+ m_pImageParam = NULL;
+ m_pStream = NULL;
+ m_pSrcData = NULL;
+}
+void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, FX_BOOL bRawAccess, FX_DWORD estimated_size,
+ FX_BOOL bImageAcc)
+{
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ m_pStream = pStream;
+ if (pStream->IsMemoryBased() &&
+ (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess)) {
+ m_dwSize = pStream->m_dwSize;
+ m_pData = (FX_LPBYTE)pStream->m_pDataBuf;
+ return;
+ }
+ FX_LPBYTE pSrcData;
+ FX_DWORD dwSrcSize = pStream->m_dwSize;
+ if (dwSrcSize == 0) {
+ return;
+ }
+ if (!pStream->IsMemoryBased()) {
+ pSrcData = m_pSrcData = FX_Alloc(FX_BYTE, dwSrcSize);
+ if (!pSrcData || !pStream->ReadRawData(0, pSrcData, dwSrcSize)) {
+ return;
+ }
+ } else {
+ pSrcData = pStream->m_pDataBuf;
+ }
+ FX_LPBYTE pDecryptedData;
+ FX_DWORD dwDecryptedSize;
+ if (pStream->m_pCryptoHandler) {
+ CFX_BinaryBuf dest_buf;
+ dest_buf.EstimateSize(pStream->m_pCryptoHandler->DecryptGetSize(dwSrcSize));
+ FX_LPVOID context = pStream->m_pCryptoHandler->DecryptStart(pStream->GetObjNum(), pStream->m_GenNum);
+ pStream->m_pCryptoHandler->DecryptStream(context, pSrcData, dwSrcSize, dest_buf);
+ pStream->m_pCryptoHandler->DecryptFinish(context, dest_buf);
+ pDecryptedData = dest_buf.GetBuffer();
+ dwDecryptedSize = dest_buf.GetSize();
+ dest_buf.DetachBuffer();
+ } else {
+ pDecryptedData = pSrcData;
+ dwDecryptedSize = dwSrcSize;
+ }
+ if (!pStream->GetDict()->KeyExist(FX_BSTRC("Filter")) || bRawAccess) {
+ m_pData = pDecryptedData;
+ m_dwSize = dwDecryptedSize;
+ } else {
+ FX_BOOL bRet = PDF_DataDecode(pDecryptedData, dwDecryptedSize, m_pStream->GetDict(),
+ m_pData, m_dwSize, m_ImageDecoder, m_pImageParam, estimated_size, bImageAcc);
+ if (!bRet) {
+ m_pData = pDecryptedData;
+ m_dwSize = dwDecryptedSize;
+ }
+ }
+ if (pSrcData != pStream->m_pDataBuf && pSrcData != m_pData) {
+ FX_Free(pSrcData);
+ }
+ if (pDecryptedData != pSrcData && pDecryptedData != m_pData) {
+ FX_Free(pDecryptedData);
+ }
+ m_pSrcData = NULL;
+ m_bNewBuf = m_pData != pStream->m_pDataBuf;
+}
+CPDF_StreamAcc::~CPDF_StreamAcc()
+{
+ if (m_bNewBuf && m_pData) {
+ FX_Free(m_pData);
+ }
+ if (m_pSrcData) {
+ FX_Free(m_pSrcData);
+ }
+}
+FX_LPCBYTE CPDF_StreamAcc::GetData() const
+{
+ if (m_bNewBuf) {
+ return m_pData;
+ }
+ if (!m_pStream) {
+ return NULL;
+ }
+ return m_pStream->m_pDataBuf;
+}
+FX_DWORD CPDF_StreamAcc::GetSize() const
+{
+ if (m_bNewBuf) {
+ return m_dwSize;
+ }
+ if (!m_pStream) {
+ return 0;
+ }
+ return m_pStream->m_dwSize;
+}
+FX_LPBYTE CPDF_StreamAcc::DetachData()
+{
+ if (m_bNewBuf) {
+ FX_LPBYTE p = m_pData;
+ m_pData = NULL;
+ m_dwSize = 0;
+ return p;
+ }
+ FX_LPBYTE p = FX_Alloc(FX_BYTE, m_dwSize);
+ if (p == NULL) {
+ return NULL;
+ }
+ FXSYS_memcpy32(p, m_pData, m_dwSize);
+ return p;
+}
+void CPDF_Reference::SetRef(CPDF_IndirectObjects* pDoc, FX_DWORD objnum)
+{
+ m_pObjList = pDoc;
+ m_RefObjNum = objnum;
+}
+CPDF_IndirectObjects::CPDF_IndirectObjects(IPDF_DocParser* pParser)
+{
+ m_pParser = pParser;
+ m_IndirectObjs.InitHashTable(1013);
+ if (pParser) {
+ m_LastObjNum = m_pParser->GetLastObjNum();
+ } else {
+ m_LastObjNum = 0;
+ }
+}
+CPDF_IndirectObjects::~CPDF_IndirectObjects()
+{
+ FX_POSITION pos = m_IndirectObjs.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_IndirectObjs.GetNextAssoc(pos, key, value);
+ ((CPDF_Object*)value)->Destroy();
+ }
+}
+CPDF_Object* CPDF_IndirectObjects::GetIndirectObject(FX_DWORD objnum, struct PARSE_CONTEXT* pContext)
+{
+ if (objnum == 0) {
+ return NULL;
+ }
+ FX_LPVOID value;
+ {
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ if (((CPDF_Object*)value)->GetObjNum() == -1) {
+ return NULL;
+ }
+ return (CPDF_Object*)value;
+ }
+ }
+ CPDF_Object* pObj = NULL;
+ if (m_pParser) {
+ pObj = m_pParser->ParseIndirectObject(this, objnum, pContext);
+ }
+ if (pObj == NULL) {
+ return NULL;
+ }
+ pObj->m_ObjNum = objnum;
+ if (m_LastObjNum < objnum) {
+ m_LastObjNum = objnum;
+ }
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ if (value) {
+ ((CPDF_Object *)value)->Destroy();
+ }
+ }
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
+ return pObj;
+}
+int CPDF_IndirectObjects::GetIndirectType(FX_DWORD objnum)
+{
+ FX_LPVOID value;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ return ((CPDF_Object*)value)->GetType();
+ }
+ if (m_pParser) {
+ PARSE_CONTEXT context;
+ FXSYS_memset32(&context, 0, sizeof(PARSE_CONTEXT));
+ context.m_Flags = PDFPARSE_TYPEONLY;
+ return (int)(FX_UINTPTR)m_pParser->ParseIndirectObject(this, objnum, &context);
+ }
+ return 0;
+}
+FX_DWORD CPDF_IndirectObjects::AddIndirectObject(CPDF_Object* pObj)
+{
+ if (pObj->m_ObjNum) {
+ return pObj->m_ObjNum;
+ }
+ m_LastObjNum ++;
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)m_LastObjNum, pObj);
+ pObj->m_ObjNum = m_LastObjNum;
+ return m_LastObjNum;
+}
+void CPDF_IndirectObjects::ReleaseIndirectObject(FX_DWORD objnum)
+{
+ FX_LPVOID value;
+ if (!m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ return;
+ }
+ if (((CPDF_Object*)value)->GetObjNum() == -1) {
+ return;
+ }
+ ((CPDF_Object*)value)->Destroy();
+ m_IndirectObjs.RemoveKey((FX_LPVOID)(FX_UINTPTR)objnum);
+}
+void CPDF_IndirectObjects::InsertIndirectObject(FX_DWORD objnum, CPDF_Object* pObj)
+{
+ if (objnum == 0 || pObj == NULL) {
+ return;
+ }
+ FX_LPVOID value;
+ if (m_IndirectObjs.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, value)) {
+ ((CPDF_Object*)value)->Destroy();
+ }
+ pObj->m_ObjNum = objnum;
+ m_IndirectObjs.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pObj);
+ if (m_LastObjNum < objnum) {
+ m_LastObjNum = objnum;
+ }
+}
+FX_DWORD CPDF_IndirectObjects::GetLastObjNum() const
+{
+ return m_LastObjNum;
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
new file mode 100644
index 0000000000..b3e587a2a0
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -0,0 +1,4378 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_page.h"
+#include "../fpdf_page/pageint.h"
+#include <limits.h>
+#define _PARSER_OBJECT_LEVLE_ 64
+extern const FX_LPCSTR _PDF_CharType;
+FX_BOOL IsSignatureDict(const CPDF_Dictionary* pDict)
+{
+ CPDF_Object* pType = pDict->GetElementValue(FX_BSTRC("Type"));
+ if (!pType) {
+ pType = pDict->GetElementValue(FX_BSTRC("FT"));
+ if (!pType) {
+ return FALSE;
+ }
+ }
+ if (pType->GetString() == FX_BSTRC("Sig")) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_INT32 _CompareDWord(const void* p1, const void* p2)
+{
+ return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
+}
+static int _CompareFileSize(const void* p1, const void* p2)
+{
+ FX_FILESIZE ret = (*(FX_FILESIZE*)p1) - (*(FX_FILESIZE*)p2);
+ if (ret > 0) {
+ return 1;
+ }
+ if (ret < 0) {
+ return -1;
+ }
+ return 0;
+}
+CPDF_Parser::CPDF_Parser()
+{
+ m_pDocument = NULL;
+ m_pTrailer = NULL;
+ m_pEncryptDict = NULL;
+ m_pSecurityHandler = NULL;
+ m_pLinearized = NULL;
+ m_dwFirstPageNo = 0;
+ m_dwXrefStartObjNum = 0;
+ m_bOwnFileRead = TRUE;
+ m_bForceUseSecurityHandler = FALSE;
+}
+CPDF_Parser::~CPDF_Parser()
+{
+ CloseParser(FALSE);
+}
+FX_DWORD CPDF_Parser::GetLastObjNum()
+{
+ FX_DWORD dwSize = m_CrossRef.GetSize();
+ return dwSize ? dwSize - 1 : 0;
+}
+void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict)
+{
+ m_pEncryptDict = pDict;
+}
+void CPDF_Parser::CloseParser(FX_BOOL bReParse)
+{
+ m_bVersionUpdated = FALSE;
+ if (m_pDocument && !bReParse) {
+ delete m_pDocument;
+ m_pDocument = NULL;
+ }
+ if (m_pTrailer) {
+ m_pTrailer->Release();
+ m_pTrailer = NULL;
+ }
+ ReleaseEncryptHandler();
+ SetEncryptDictionary(NULL);
+ if (m_bOwnFileRead && m_Syntax.m_pFileAccess != NULL) {
+ m_Syntax.m_pFileAccess->Release();
+ m_Syntax.m_pFileAccess = NULL;
+ }
+ FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID objnum;
+ CPDF_StreamAcc* pStream;
+ m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);
+ delete pStream;
+ }
+ m_ObjectStreamMap.RemoveAll();
+ m_SortedOffset.RemoveAll();
+ m_CrossRef.RemoveAll();
+ m_V5Type.RemoveAll();
+ m_ObjVersion.RemoveAll();
+ FX_INT32 iLen = m_Trailers.GetSize();
+ for (FX_INT32 i = 0; i < iLen; ++i) {
+ m_Trailers.GetAt(i)->Release();
+ }
+ m_Trailers.RemoveAll();
+ if (m_pLinearized) {
+ m_pLinearized->Release();
+ m_pLinearized = NULL;
+ }
+}
+static FX_INT32 GetHeaderOffset(IFX_FileRead* pFile)
+{
+ FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025);
+ FX_BYTE buf[4];
+ FX_INT32 offset = 0;
+ while (1) {
+ if (!pFile->ReadBlock(buf, offset, 4)) {
+ return -1;
+ }
+ if (*(FX_DWORD*)buf == tag) {
+ return offset;
+ }
+ offset ++;
+ if (offset > 1024) {
+ return -1;
+ }
+ }
+ return -1;
+}
+FX_DWORD CPDF_Parser::StartParse(FX_LPCSTR filename, FX_BOOL bReParse)
+{
+ IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);
+ if (!pFileAccess) {
+ return PDFPARSE_ERROR_FILE;
+ }
+ return StartParse(pFileAccess, bReParse);
+}
+FX_DWORD CPDF_Parser::StartParse(FX_LPCWSTR filename, FX_BOOL bReParse)
+{
+ IFX_FileRead* pFileAccess = FX_CreateFileRead(filename);
+ if (!pFileAccess) {
+ return PDFPARSE_ERROR_FILE;
+ }
+ return StartParse(pFileAccess, bReParse);
+}
+CPDF_SecurityHandler* FPDF_CreateStandardSecurityHandler();
+CPDF_SecurityHandler* FPDF_CreatePubKeyHandler(void*);
+FX_DWORD CPDF_Parser::StartParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)
+{
+ CloseParser(bReParse);
+ m_bXRefStream = FALSE;
+ m_LastXRefOffset = 0;
+ m_bOwnFileRead = bOwnFileRead;
+ FX_INT32 offset = GetHeaderOffset(pFileAccess);
+ if (offset == -1) {
+ if (bOwnFileRead && pFileAccess) {
+ pFileAccess->Release();
+ }
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ m_Syntax.InitParser(pFileAccess, offset);
+ FX_BYTE ch;
+ m_Syntax.GetCharAt(5, ch);
+ m_FileVersion = (ch - '0') * 10;
+ m_Syntax.GetCharAt(7, ch);
+ m_FileVersion += ch - '0';
+ m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);
+ if (!bReParse) {
+ m_pDocument = FX_NEW CPDF_Document(this);
+ }
+ FX_BOOL bXRefRebuilt = FALSE;
+ if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {
+ FX_FILESIZE startxref_offset = m_Syntax.SavePos();
+ FX_LPVOID pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(startxref_offset);
+ }
+ m_Syntax.GetKeyword();
+ FX_BOOL bNumber;
+ CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);
+ if (!bNumber) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
+ if (!LoadAllCrossRefV4(m_LastXRefOffset) && !LoadAllCrossRefV5(m_LastXRefOffset)) {
+ if (!RebuildCrossRef()) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ bXRefRebuilt = TRUE;
+ m_LastXRefOffset = 0;
+ }
+ } else {
+ if (!RebuildCrossRef()) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ bXRefRebuilt = TRUE;
+ }
+ FX_DWORD dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ m_pDocument->LoadDoc();
+ if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
+ if (bXRefRebuilt) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ ReleaseEncryptHandler();
+ if (!RebuildCrossRef()) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ m_pDocument->LoadDoc();
+ if (m_pDocument->GetRoot() == NULL) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ }
+ FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ FX_DWORD RootObjNum = GetRootObjNum();
+ if (RootObjNum == 0) {
+ ReleaseEncryptHandler();
+ RebuildCrossRef();
+ RootObjNum = GetRootObjNum();
+ if (RootObjNum == 0) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ }
+ if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {
+ CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));
+ if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {
+ m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();
+ }
+ }
+ return PDFPARSE_ERROR_SUCCESS;
+}
+FX_DWORD CPDF_Parser::SetEncryptHandler()
+{
+ ReleaseEncryptHandler();
+ SetEncryptDictionary(NULL);
+ if (m_pTrailer == NULL) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ CPDF_Object* pEncryptObj = m_pTrailer->GetElement(FX_BSTRC("Encrypt"));
+ if (pEncryptObj) {
+ if (pEncryptObj->GetType() == PDFOBJ_DICTIONARY) {
+ SetEncryptDictionary((CPDF_Dictionary*)pEncryptObj);
+ } else if (pEncryptObj->GetType() == PDFOBJ_REFERENCE) {
+ pEncryptObj = m_pDocument->GetIndirectObject(((CPDF_Reference*)pEncryptObj)->GetRefObjNum());
+ if (pEncryptObj) {
+ SetEncryptDictionary(pEncryptObj->GetDict());
+ }
+ }
+ }
+ if (m_bForceUseSecurityHandler) {
+ FX_DWORD err = PDFPARSE_ERROR_HANDLER;
+ if (m_pSecurityHandler == NULL) {
+ return PDFPARSE_ERROR_HANDLER;
+ }
+ if (!m_pSecurityHandler->OnInit(this, m_pEncryptDict)) {
+ return err;
+ }
+ CPDF_CryptoHandler* pCryptoHandler = m_pSecurityHandler->CreateCryptoHandler();
+ if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {
+ delete pCryptoHandler;
+ pCryptoHandler = NULL;
+ return PDFPARSE_ERROR_HANDLER;
+ }
+ m_Syntax.SetEncrypt(pCryptoHandler);
+ } else if (m_pEncryptDict) {
+ CFX_ByteString filter = m_pEncryptDict->GetString(FX_BSTRC("Filter"));
+ CPDF_SecurityHandler* pSecurityHandler = NULL;
+ FX_DWORD err = PDFPARSE_ERROR_HANDLER;
+ if (filter == FX_BSTRC("Standard")) {
+ pSecurityHandler = FPDF_CreateStandardSecurityHandler();
+ err = PDFPARSE_ERROR_PASSWORD;
+ }
+ if (pSecurityHandler == NULL) {
+ return PDFPARSE_ERROR_HANDLER;
+ }
+ if (!pSecurityHandler->OnInit(this, m_pEncryptDict)) {
+ delete pSecurityHandler;
+ pSecurityHandler = NULL;
+ return err;
+ }
+ m_pSecurityHandler = pSecurityHandler;
+ CPDF_CryptoHandler* pCryptoHandler = pSecurityHandler->CreateCryptoHandler();
+ if (!pCryptoHandler->Init(m_pEncryptDict, m_pSecurityHandler)) {
+ delete pCryptoHandler;
+ pCryptoHandler = NULL;
+ return PDFPARSE_ERROR_HANDLER;
+ }
+ m_Syntax.SetEncrypt(pCryptoHandler);
+ }
+ return PDFPARSE_ERROR_SUCCESS;
+}
+void CPDF_Parser::ReleaseEncryptHandler()
+{
+ if (m_Syntax.m_pCryptoHandler) {
+ delete m_Syntax.m_pCryptoHandler;
+ m_Syntax.m_pCryptoHandler = NULL;
+ }
+ if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {
+ delete m_pSecurityHandler;
+ m_pSecurityHandler = NULL;
+ }
+}
+FX_FILESIZE CPDF_Parser::GetObjectOffset(FX_DWORD objnum)
+{
+ if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
+ return 0;
+ }
+ if (m_V5Type[objnum] == 1) {
+ return m_CrossRef[objnum];
+ }
+ if (m_V5Type[objnum] == 2) {
+ return m_CrossRef[(FX_INT32)m_CrossRef[objnum]];
+ }
+ return 0;
+}
+static FX_INT32 GetDirectInteger(CPDF_Dictionary* pDict, FX_BSTR key)
+{
+ CPDF_Object* pObj = pDict->GetElement(key);
+ if (pObj == NULL) {
+ return 0;
+ }
+ if (pObj->GetType() == PDFOBJ_NUMBER) {
+ return ((CPDF_Number*)pObj)->GetInteger();
+ }
+ return 0;
+}
+static FX_BOOL CheckDirectType(CPDF_Dictionary* pDict, FX_BSTR key, FX_INT32 iType)
+{
+ CPDF_Object* pObj = pDict->GetElement(key);
+ if (!pObj) {
+ return TRUE;
+ }
+ return pObj->GetType() == iType;
+}
+FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos)
+{
+ if (!LoadCrossRefV4(xrefpos, 0, TRUE, FALSE)) {
+ return FALSE;
+ }
+ m_pTrailer = LoadTrailerV4();
+ if (m_pTrailer == NULL) {
+ return FALSE;
+ }
+ FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
+ if (xrefsize <= 0 || xrefsize > (1 << 20)) {
+ return FALSE;
+ }
+ m_CrossRef.SetSize(xrefsize);
+ m_V5Type.SetSize(xrefsize);
+ CFX_FileSizeArray CrossRefList, XRefStreamList;
+ CrossRefList.Add(xrefpos);
+ XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));
+ if (!CheckDirectType(m_pTrailer, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {
+ return FALSE;
+ }
+ FX_FILESIZE newxrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));
+ if (newxrefpos == xrefpos) {
+ return FALSE;
+ }
+ xrefpos = newxrefpos;
+ while (xrefpos) {
+ CrossRefList.InsertAt(0, xrefpos);
+ LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);
+ CPDF_Dictionary* pDict = LoadTrailerV4();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ if (!CheckDirectType(pDict, FX_BSTRC("Prev"), PDFOBJ_NUMBER)) {
+ pDict->Release();
+ return FALSE;
+ }
+ newxrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));
+ if (newxrefpos == xrefpos) {
+ pDict->Release();
+ return FALSE;
+ }
+ xrefpos = newxrefpos;
+ XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));
+ m_Trailers.Add(pDict);
+ }
+ for (FX_INT32 i = 0; i < CrossRefList.GetSize(); i ++)
+ if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, FX_DWORD dwObjCount)
+{
+ if (!LoadLinearizedCrossRefV4(xrefpos, dwObjCount)) {
+ return FALSE;
+ }
+ m_pTrailer = LoadTrailerV4();
+ if (m_pTrailer == NULL) {
+ return FALSE;
+ }
+ FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
+ if (xrefsize == 0) {
+ return FALSE;
+ }
+ CFX_FileSizeArray CrossRefList, XRefStreamList;
+ CrossRefList.Add(xrefpos);
+ XRefStreamList.Add(GetDirectInteger(m_pTrailer, FX_BSTRC("XRefStm")));
+ xrefpos = GetDirectInteger(m_pTrailer, FX_BSTRC("Prev"));
+ while (xrefpos) {
+ CrossRefList.InsertAt(0, xrefpos);
+ LoadCrossRefV4(xrefpos, 0, TRUE, FALSE);
+ CPDF_Dictionary* pDict = LoadTrailerV4();
+ if (pDict == NULL) {
+ return FALSE;
+ }
+ xrefpos = GetDirectInteger(pDict, FX_BSTRC("Prev"));
+ XRefStreamList.InsertAt(0, pDict->GetInteger(FX_BSTRC("XRefStm")));
+ m_Trailers.Add(pDict);
+ }
+ for (FX_INT32 i = 1; i < CrossRefList.GetSize(); i ++)
+ if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE, i == 0)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, FX_DWORD dwObjCount)
+{
+ FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset;
+ m_Syntax.RestorePos(dwStartPos);
+ FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(pos);
+ }
+ FX_DWORD start_objnum = 0;
+ FX_DWORD count = dwObjCount;
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ FX_INT32 recordsize = 20;
+ char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
+ pBuf[1024 * recordsize] = '\0';
+ FX_INT32 nBlocks = count / 1024 + 1;
+ for (FX_INT32 block = 0; block < nBlocks; block ++) {
+ FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;
+ FX_DWORD dwReadSize = block_size * recordsize;
+ if ((FX_FILESIZE)(dwStartPos + dwReadSize) > m_Syntax.m_FileLen) {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ if (!m_Syntax.ReadBlock((FX_LPBYTE)pBuf, dwReadSize)) {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ for (FX_INT32 i = 0; i < block_size; i ++) {
+ FX_DWORD objnum = start_objnum + block * 1024 + i;
+ char* pEntry = pBuf + i * recordsize;
+ if (pEntry[17] == 'f') {
+ m_CrossRef.SetAtGrow(objnum, 0);
+ m_V5Type.SetAtGrow(objnum, 0);
+ } else {
+ FX_INT32 offset = FXSYS_atoi(pEntry);
+ if (offset == 0) {
+ for (FX_INT32 c = 0; c < 10; c ++) {
+ if (pEntry[c] < '0' || pEntry[c] > '9') {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ }
+ }
+ m_CrossRef.SetAtGrow(objnum, offset);
+ FX_INT32 version = FXSYS_atoi(pEntry + 11);
+ if (version >= 1) {
+ m_bVersionUpdated = TRUE;
+ }
+ m_ObjVersion.SetAtGrow(objnum, version);
+ if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {
+ FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(m_CrossRef[objnum]);
+ }
+ }
+ m_V5Type.SetAtGrow(objnum, 1);
+ }
+ }
+ }
+ FX_Free(pBuf);
+ m_Syntax.RestorePos(SavedPos + count * recordsize);
+ return TRUE;
+}
+FX_BOOL CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, FX_FILESIZE streampos, FX_BOOL bSkip, FX_BOOL bFirst)
+{
+ m_Syntax.RestorePos(pos);
+ if (m_Syntax.GetKeyword() != FX_BSTRC("xref")) {
+ return FALSE;
+ }
+ FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(pos);
+ }
+ if (streampos) {
+ FX_LPVOID pResult = FXSYS_bsearch(&streampos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(streampos);
+ }
+ }
+ while (1) {
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ break;
+ }
+ FX_DWORD start_objnum = FXSYS_atoi(word);
+ if (start_objnum >= (1 << 20)) {
+ return FALSE;
+ }
+ FX_DWORD count = m_Syntax.GetDirectNum();
+ m_Syntax.ToNextWord();
+ SavedPos = m_Syntax.SavePos();
+ FX_BOOL bFirstItem = FALSE;
+ FX_INT32 recordsize = 20;
+ if (bFirst) {
+ bFirstItem = TRUE;
+ }
+ m_dwXrefStartObjNum = start_objnum;
+ if (!bSkip) {
+ char* pBuf = FX_Alloc(char, 1024 * recordsize + 1);
+ pBuf[1024 * recordsize] = '\0';
+ FX_INT32 nBlocks = count / 1024 + 1;
+ FX_BOOL bFirstBlock = TRUE;
+ for (FX_INT32 block = 0; block < nBlocks; block ++) {
+ FX_INT32 block_size = block == nBlocks - 1 ? count % 1024 : 1024;
+ m_Syntax.ReadBlock((FX_LPBYTE)pBuf, block_size * recordsize);
+ for (FX_INT32 i = 0; i < block_size; i ++) {
+ FX_DWORD objnum = start_objnum + block * 1024 + i;
+ char* pEntry = pBuf + i * recordsize;
+ if (pEntry[17] == 'f') {
+ if (bFirstItem) {
+ objnum = 0;
+ bFirstItem = FALSE;
+ }
+ if (bFirstBlock) {
+ FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
+ FX_INT32 version = FXSYS_atoi(pEntry + 11);
+ if (offset == 0 && version == 65535 && start_objnum != 0) {
+ start_objnum--;
+ objnum = 0;
+ }
+ }
+ m_CrossRef.SetAtGrow(objnum, 0);
+ m_V5Type.SetAtGrow(objnum, 0);
+ } else {
+ FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
+ if (offset == 0) {
+ for (FX_INT32 c = 0; c < 10; c ++) {
+ if (pEntry[c] < '0' || pEntry[c] > '9') {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ }
+ }
+ m_CrossRef.SetAtGrow(objnum, offset);
+ FX_INT32 version = FXSYS_atoi(pEntry + 11);
+ if (version >= 1) {
+ m_bVersionUpdated = TRUE;
+ }
+ m_ObjVersion.SetAtGrow(objnum, version);
+ if (m_CrossRef[objnum] < m_Syntax.m_FileLen) {
+ FX_LPVOID pResult = FXSYS_bsearch(&m_CrossRef[objnum], m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(m_CrossRef[objnum]);
+ }
+ }
+ m_V5Type.SetAtGrow(objnum, 1);
+ }
+ if (bFirstBlock) {
+ bFirstBlock = FALSE;
+ }
+ }
+ }
+ FX_Free(pBuf);
+ }
+ m_Syntax.RestorePos(SavedPos + count * recordsize);
+ }
+ if (streampos)
+ if (!LoadCrossRefV5(streampos, streampos, FALSE)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos)
+{
+ if (!LoadCrossRefV5(xrefpos, xrefpos, TRUE)) {
+ return FALSE;
+ }
+ while (xrefpos)
+ if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
+ return FALSE;
+ }
+ m_ObjectStreamMap.InitHashTable(101, FALSE);
+ m_bXRefStream = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_Parser::RebuildCrossRef()
+{
+ m_CrossRef.RemoveAll();
+ m_V5Type.RemoveAll();
+ m_SortedOffset.RemoveAll();
+ m_ObjVersion.RemoveAll();
+ if (m_pTrailer) {
+ m_pTrailer->Release();
+ m_pTrailer = NULL;
+ }
+ FX_INT32 status = 0;
+ FX_INT32 inside_index = 0;
+ FX_DWORD objnum, gennum;
+ FX_INT32 depth = 0;
+ FX_LPBYTE buffer = FX_Alloc(FX_BYTE, 4096);
+ FX_FILESIZE pos = m_Syntax.m_HeaderOffset;
+ FX_FILESIZE start_pos, start_pos1;
+ FX_FILESIZE last_obj = -1, last_xref = -1, last_trailer = -1;
+ FX_BOOL bInUpdate = FALSE;
+ while (pos < m_Syntax.m_FileLen) {
+ FX_BOOL bOverFlow = FALSE;
+ FX_DWORD size = (FX_DWORD)(m_Syntax.m_FileLen - pos);
+ if (size > 4096) {
+ size = 4096;
+ }
+ if (!m_Syntax.m_pFileAccess->ReadBlock(buffer, pos, size)) {
+ break;
+ }
+ for (FX_DWORD i = 0; i < size; i ++) {
+ FX_BYTE byte = buffer[i];
+ FX_LPBYTE pData = buffer + i;
+ switch (status) {
+ case 0:
+ if (_PDF_CharType[byte] == 'W') {
+ status = 1;
+ }
+ if (byte <= '9' && byte >= '0') {
+ --i;
+ status = 1;
+ }
+ if (byte == '%') {
+ inside_index = 0;
+ status = 9;
+ }
+ if (byte == '(') {
+ status = 10;
+ depth = 1;
+ }
+ if (byte == '<') {
+ inside_index = 1;
+ status = 11;
+ }
+ if (byte == '\\') {
+ status = 13;
+ }
+ if (byte == 't') {
+ status = 7;
+ inside_index = 1;
+ }
+ break;
+ case 1:
+ if (_PDF_CharType[byte] == 'W') {
+ break;
+ } else if (byte <= '9' && byte >= '0') {
+ start_pos = pos + i;
+ status = 2;
+ objnum = byte - '0';
+ } else if (byte == 't') {
+ status = 7;
+ inside_index = 1;
+ } else if (byte == 'x') {
+ status = 8;
+ inside_index = 1;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 2:
+ if (byte <= '9' && byte >= '0') {
+ objnum = objnum * 10 + byte - '0';
+ break;
+ } else if (_PDF_CharType[byte] == 'W') {
+ status = 3;
+ } else {
+ --i;
+ status = 14;
+ inside_index = 0;
+ }
+ break;
+ case 3:
+ if (byte <= '9' && byte >= '0') {
+ start_pos1 = pos + i;
+ status = 4;
+ gennum = byte - '0';
+ } else if (_PDF_CharType[byte] == 'W') {
+ break;
+ } else if (byte == 't') {
+ status = 7;
+ inside_index = 1;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 4:
+ if (byte <= '9' && byte >= '0') {
+ gennum = gennum * 10 + byte - '0';
+ break;
+ } else if (_PDF_CharType[byte] == 'W') {
+ status = 5;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 5:
+ if (byte == 'o') {
+ status = 6;
+ inside_index = 1;
+ } else if (_PDF_CharType[byte] == 'W') {
+ break;
+ } else if (byte <= '9' && byte >= '0') {
+ objnum = gennum;
+ gennum = byte - '0';
+ start_pos = start_pos1;
+ start_pos1 = pos + i;
+ status = 4;
+ } else if (byte == 't') {
+ status = 7;
+ inside_index = 1;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 6:
+ switch (inside_index) {
+ case 1:
+ if (byte != 'b') {
+ --i;
+ status = 0;
+ } else {
+ inside_index ++;
+ }
+ break;
+ case 2:
+ if (byte != 'j') {
+ --i;
+ status = 0;
+ } else {
+ inside_index ++;
+ }
+ break;
+ case 3:
+ if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {
+ if (objnum > 0x1000000) {
+ status = 0;
+ break;
+ }
+ FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset;
+ last_obj = start_pos;
+ FX_LPVOID pResult = FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(obj_pos);
+ }
+ FX_FILESIZE obj_end = 0;
+ CPDF_Object *pObject = ParseIndirectObjectAtByStrict(m_pDocument, obj_pos, objnum, NULL, &obj_end);
+ if (pObject) {
+ int iType = pObject->GetType();
+ if (iType == PDFOBJ_STREAM) {
+ CPDF_Stream* pStream = (CPDF_Stream*)pObject;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ if (pDict) {
+ if (pDict->KeyExist(FX_BSTRC("Type"))) {
+ CFX_ByteString bsValue = pDict->GetString(FX_BSTRC("Type"));
+ if (bsValue == FX_BSTRC("XRef") && pDict->KeyExist(FX_BSTRC("Size"))) {
+ CPDF_Object* pRoot = pDict->GetElement(FX_BSTRC("Root"));
+ if (pRoot && pRoot->GetDict() && pRoot->GetDict()->GetElement(FX_BSTRC("Pages"))) {
+ if (m_pTrailer) {
+ m_pTrailer->Release();
+ }
+ m_pTrailer = (CPDF_Dictionary*)pDict->Clone();
+ }
+ }
+ }
+ }
+ }
+ }
+ FX_FILESIZE offset = 0;
+ m_Syntax.RestorePos(obj_pos);
+ offset = m_Syntax.FindTag(FX_BSTRC("obj"), 0);
+ if (offset == -1) {
+ offset = 0;
+ } else {
+ offset += 3;
+ }
+ FX_FILESIZE nLen = obj_end - obj_pos - offset;
+ if ((FX_DWORD)nLen > size - i) {
+ pos = obj_end + m_Syntax.m_HeaderOffset;
+ bOverFlow = TRUE;
+ } else {
+ i += (FX_DWORD)nLen;
+ }
+ if (m_CrossRef.GetSize() > (FX_INT32)objnum && m_CrossRef[objnum]) {
+ if (pObject) {
+ FX_DWORD oldgen = m_ObjVersion.GetAt(objnum);
+ m_CrossRef[objnum] = obj_pos;
+ m_ObjVersion.SetAt(objnum, (FX_SHORT)gennum);
+ if (oldgen != gennum) {
+ m_bVersionUpdated = TRUE;
+ }
+ }
+ } else {
+ m_CrossRef.SetAtGrow(objnum, obj_pos);
+ m_V5Type.SetAtGrow(objnum, 1);
+ m_ObjVersion.SetAtGrow(objnum, (FX_SHORT)gennum);
+ }
+ if (pObject) {
+ pObject->Release();
+ }
+ }
+ --i;
+ status = 0;
+ break;
+ }
+ break;
+ case 7:
+ if (inside_index == 7) {
+ if (_PDF_CharType[byte] == 'W' || _PDF_CharType[byte] == 'D') {
+ last_trailer = pos + i - 7;
+ m_Syntax.RestorePos(pos + i - m_Syntax.m_HeaderOffset);
+ CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);
+ if (pObj) {
+ if (pObj->GetType() != PDFOBJ_DICTIONARY && pObj->GetType() != PDFOBJ_STREAM) {
+ pObj->Release();
+ } else {
+ CPDF_Dictionary* pTrailer = NULL;
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ pTrailer = ((CPDF_Stream*)pObj)->GetDict();
+ } else {
+ pTrailer = (CPDF_Dictionary*)pObj;
+ }
+ if (pTrailer) {
+ if (m_pTrailer) {
+ CPDF_Object* pRoot = pTrailer->GetElement(FX_BSTRC("Root"));
+ if (pRoot == NULL || (pRoot->GetType() == PDFOBJ_REFERENCE &&
+ (FX_DWORD)m_CrossRef.GetSize() > ((CPDF_Reference*)pRoot)->GetRefObjNum() &&
+ m_CrossRef.GetAt(((CPDF_Reference*)pRoot)->GetRefObjNum()) != 0)) {
+ FX_POSITION pos = pTrailer->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pObj = pTrailer->GetNextElement(pos, key);
+ m_pTrailer->SetAt(key, pObj->Clone(), m_pDocument);
+ }
+ pObj->Release();
+ } else {
+ pObj->Release();
+ }
+ } else {
+ if (pObj->GetType() == PDFOBJ_STREAM) {
+ m_pTrailer = (CPDF_Dictionary*)pTrailer->Clone();
+ pObj->Release();
+ } else {
+ m_pTrailer = pTrailer;
+ }
+ FX_FILESIZE dwSavePos = m_Syntax.SavePos();
+ CFX_ByteString strWord = m_Syntax.GetKeyword();
+ if (!strWord.Compare(FX_BSTRC("startxref"))) {
+ FX_BOOL bNumber = FALSE;
+ CFX_ByteString bsOffset = m_Syntax.GetNextWord(bNumber);
+ if (bNumber) {
+ m_LastXRefOffset = FXSYS_atoi(bsOffset);
+ }
+ }
+ m_Syntax.RestorePos(dwSavePos);
+ }
+ } else {
+ pObj->Release();
+ }
+ bInUpdate = TRUE;
+ }
+ }
+ }
+ --i;
+ status = 0;
+ } else if (byte == "trailer"[inside_index]) {
+ inside_index ++;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 8:
+ if (inside_index == 4) {
+ last_xref = pos + i - 4;
+ status = 1;
+ } else if (byte == "xref"[inside_index]) {
+ inside_index ++;
+ } else {
+ --i;
+ status = 0;
+ }
+ break;
+ case 9:
+ if (byte == '\r' || byte == '\n') {
+ status = 0;
+ }
+ break;
+ case 10:
+ if (byte == ')') {
+ if (depth > 0) {
+ depth--;
+ }
+ } else if (byte == '(') {
+ depth++;
+ }
+ if (!depth) {
+ status = 0;
+ }
+ break;
+ case 11:
+ if (byte == '<' && inside_index == 1) {
+ status = 12;
+ } else if (byte == '>') {
+ status = 0;
+ }
+ inside_index = 0;
+ break;
+ case 12:
+ --i;
+ status = 0;
+ break;
+ case 13:
+ if (_PDF_CharType[byte] == 'D' || _PDF_CharType[byte] == 'W') {
+ --i;
+ status = 0;
+ }
+ break;
+ case 14:
+ if (_PDF_CharType[byte] == 'W') {
+ status = 0;
+ } else if (byte == '%' || byte == '(' || byte == '<' || byte == '\\') {
+ status = 0;
+ --i;
+ } else if (inside_index == 6) {
+ status = 0;
+ --i;
+ } else if (byte == "endobj"[inside_index]) {
+ inside_index++;
+ }
+ break;
+ }
+ if (bOverFlow) {
+ size = 0;
+ break;
+ }
+ }
+ pos += size;
+ }
+ if (last_xref != -1 && last_xref > last_obj) {
+ last_trailer = last_xref;
+ } else if (last_trailer == -1 || last_xref < last_obj) {
+ last_trailer = m_Syntax.m_FileLen;
+ }
+ FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset;
+ FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(offset);
+ }
+ FX_Free(buffer);
+ return TRUE;
+}
+static FX_DWORD _GetVarInt(FX_LPCBYTE p, FX_INT32 n)
+{
+ FX_DWORD result = 0;
+ for (FX_INT32 i = 0; i < n; i ++) {
+ result = result * 256 + p[i];
+ }
+ return result;
+}
+FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE pos, FX_FILESIZE& prev, FX_BOOL bMainXRef)
+{
+ CPDF_Stream* pStream = (CPDF_Stream*)ParseIndirectObjectAt(m_pDocument, pos, 0, NULL);
+ if (!pStream) {
+ return FALSE;
+ }
+ if (m_pDocument) {
+ m_pDocument->InsertIndirectObject(pStream->m_ObjNum, pStream);
+ }
+ if (pStream->GetType() != PDFOBJ_STREAM) {
+ return FALSE;
+ }
+ prev = pStream->GetDict()->GetInteger(FX_BSTRC("Prev"));
+ FX_INT32 size = pStream->GetDict()->GetInteger(FX_BSTRC("Size"));
+ if (size < 0) {
+ pStream->Release();
+ return FALSE;
+ }
+ if (bMainXRef) {
+ m_pTrailer = (CPDF_Dictionary*)pStream->GetDict()->Clone();
+ m_CrossRef.SetSize(size);
+ if (m_V5Type.SetSize(size)) {
+ FXSYS_memset32(m_V5Type.GetData(), 0, size);
+ }
+ } else {
+ m_Trailers.Add((CPDF_Dictionary*)pStream->GetDict()->Clone());
+ }
+ CFX_DWordArray IndexArray, WidthArray;
+ FX_DWORD nSegs = 0;
+ CPDF_Array* pArray = pStream->GetDict()->GetArray(FX_BSTRC("Index"));
+ if (pArray == NULL) {
+ IndexArray.Add(0);
+ IndexArray.Add(size);
+ nSegs = 1;
+ } else {
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ IndexArray.Add(pArray->GetInteger(i));
+ }
+ nSegs = pArray->GetCount() / 2;
+ }
+ pArray = pStream->GetDict()->GetArray(FX_BSTRC("W"));
+ if (pArray == NULL) {
+ pStream->Release();
+ return FALSE;
+ }
+ FX_DWORD totalwidth = 0;
+ FX_DWORD i;
+ for (i = 0; i < pArray->GetCount(); i ++) {
+ WidthArray.Add(pArray->GetInteger(i));
+ if (totalwidth + WidthArray[i] < totalwidth) {
+ pStream->Release();
+ return FALSE;
+ }
+ totalwidth += WidthArray[i];
+ }
+ if (totalwidth == 0 || WidthArray.GetSize() < 3) {
+ pStream->Release();
+ return FALSE;
+ }
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream);
+ FX_LPCBYTE pData = acc.GetData();
+ FX_DWORD dwTotalSize = acc.GetSize();
+ FX_DWORD segindex = 0;
+ for (i = 0; i < nSegs; i ++) {
+ FX_INT32 startnum = IndexArray[i * 2];
+ if (startnum < 0) {
+ continue;
+ }
+ m_dwXrefStartObjNum = startnum;
+ FX_DWORD count = IndexArray[i * 2 + 1];
+ if (segindex + count < segindex || segindex + count == 0 ||
+ (FX_DWORD)totalwidth >= UINT_MAX / (segindex + count) || (segindex + count) * (FX_DWORD)totalwidth > dwTotalSize) {
+ continue;
+ }
+ FX_LPCBYTE segstart = pData + segindex * (FX_DWORD)totalwidth;
+ if ((FX_DWORD)startnum + count < (FX_DWORD)startnum ||
+ (FX_DWORD)startnum + count > (FX_DWORD)m_V5Type.GetSize()) {
+ continue;
+ }
+ for (FX_DWORD j = 0; j < count; j ++) {
+ FX_INT32 type = 1;
+ FX_LPCBYTE entrystart = segstart + j * totalwidth;
+ if (WidthArray[0]) {
+ type = _GetVarInt(entrystart, WidthArray[0]);
+ }
+ if (m_V5Type[startnum + j] == 255) {
+ FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
+ m_CrossRef[startnum + j] = offset;
+ FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(offset);
+ }
+ continue;
+ }
+ if (m_V5Type[startnum + j]) {
+ continue;
+ }
+ m_V5Type[startnum + j] = type;
+ if (type == 0) {
+ m_CrossRef[startnum + j] = 0;
+ } else {
+ FX_FILESIZE offset = _GetVarInt(entrystart + WidthArray[0], WidthArray[1]);
+ m_CrossRef[startnum + j] = offset;
+ if (type == 1) {
+ FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_SortedOffset.Add(offset);
+ }
+ } else {
+ if (offset < 0 || offset >= m_V5Type.GetSize()) {
+ pStream->Release();
+ return FALSE;
+ }
+ m_V5Type[offset] = 255;
+ }
+ }
+ }
+ segindex += count;
+ }
+ pStream->Release();
+ return TRUE;
+}
+CPDF_Array* CPDF_Parser::GetIDArray()
+{
+ CPDF_Object* pID = m_pTrailer->GetElement(FX_BSTRC("ID"));
+ if (pID == NULL) {
+ return NULL;
+ }
+ if (pID->GetType() == PDFOBJ_REFERENCE) {
+ pID = ParseIndirectObject(NULL, ((CPDF_Reference*)pID)->GetRefObjNum());
+ m_pTrailer->SetAt(FX_BSTRC("ID"), pID);
+ }
+ if (pID == NULL || pID->GetType() != PDFOBJ_ARRAY) {
+ return NULL;
+ }
+ return (CPDF_Array*)pID;
+}
+FX_DWORD CPDF_Parser::GetRootObjNum()
+{
+ CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Root"));
+ if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
+ return 0;
+ }
+ return pRef->GetRefObjNum();
+}
+FX_DWORD CPDF_Parser::GetInfoObjNum()
+{
+ CPDF_Reference* pRef = (CPDF_Reference*)m_pTrailer->GetElement(FX_BSTRC("Info"));
+ if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
+ return 0;
+ }
+ return pRef->GetRefObjNum();
+}
+FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm)
+{
+ bForm = FALSE;
+ if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
+ return TRUE;
+ }
+ if (m_V5Type[objnum] == 0) {
+ return TRUE;
+ }
+ if (m_V5Type[objnum] == 2) {
+ return TRUE;
+ }
+ FX_FILESIZE pos = m_CrossRef[objnum];
+ FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ return TRUE;
+ }
+ if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {
+ return FALSE;
+ }
+ FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos;
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ m_Syntax.RestorePos(pos);
+ bForm = m_Syntax.SearchMultiWord(FX_BSTRC("/Form\0stream"), TRUE, size) == 0;
+ m_Syntax.RestorePos(SavedPos);
+ return TRUE;
+}
+CPDF_Object* CPDF_Parser::ParseIndirectObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, PARSE_CONTEXT* pContext)
+{
+ if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
+ return NULL;
+ }
+ if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
+ FX_FILESIZE pos = m_CrossRef[objnum];
+ if (pos <= 0) {
+ return NULL;
+ }
+ return ParseIndirectObjectAt(pObjList, pos, objnum, pContext);
+ }
+ if (m_V5Type[objnum] == 2) {
+ CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);
+ if (pObjStream == NULL) {
+ return NULL;
+ }
+ FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));
+ FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
+ CPDF_SyntaxParser syntax;
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pObjStream->GetData(), (size_t)pObjStream->GetSize(), FALSE));
+ syntax.InitParser((IFX_FileStream*)file, 0);
+ CPDF_Object* pRet = NULL;
+ while (n) {
+ FX_DWORD thisnum = syntax.GetDirectNum();
+ FX_DWORD thisoff = syntax.GetDirectNum();
+ if (thisnum == objnum) {
+ syntax.RestorePos(offset + thisoff);
+ pRet = syntax.GetObject(pObjList, 0, 0, 0, pContext);
+ break;
+ }
+ n --;
+ }
+ return pRet;
+ }
+ return NULL;
+}
+CPDF_StreamAcc* CPDF_Parser::GetObjectStream(FX_DWORD objnum)
+{
+ CPDF_StreamAcc* pStreamAcc = NULL;
+ if (m_ObjectStreamMap.Lookup((void*)(FX_UINTPTR)objnum, (void*&)pStreamAcc)) {
+ return pStreamAcc;
+ }
+ const CPDF_Stream* pStream = (CPDF_Stream*)m_pDocument->GetIndirectObject(objnum);
+ if (pStream == NULL || pStream->GetType() != PDFOBJ_STREAM) {
+ return NULL;
+ }
+ pStreamAcc = FX_NEW CPDF_StreamAcc;
+ pStreamAcc->LoadAllData(pStream);
+ m_ObjectStreamMap.SetAt((void*)(FX_UINTPTR)objnum, pStreamAcc);
+ return pStreamAcc;
+}
+FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum)
+{
+ if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
+ return 0;
+ }
+ if (m_V5Type[objnum] == 2) {
+ objnum = (FX_DWORD)m_CrossRef[objnum];
+ }
+ if (m_V5Type[objnum] == 1 || m_V5Type[objnum] == 255) {
+ FX_FILESIZE offset = m_CrossRef[objnum];
+ if (offset == 0) {
+ return 0;
+ }
+ FX_LPVOID pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ return 0;
+ }
+ if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) {
+ return 0;
+ }
+ return ((FX_FILESIZE*)pResult)[1] - offset;
+ }
+ return 0;
+}
+void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, FX_LPBYTE& pBuffer, FX_DWORD& size)
+{
+ pBuffer = NULL;
+ size = 0;
+ if (objnum >= (FX_DWORD)m_CrossRef.GetSize()) {
+ return;
+ }
+ if (m_V5Type[objnum] == 2) {
+ CPDF_StreamAcc* pObjStream = GetObjectStream((FX_DWORD)m_CrossRef[objnum]);
+ if (pObjStream == NULL) {
+ return;
+ }
+ FX_INT32 n = pObjStream->GetDict()->GetInteger(FX_BSTRC("N"));
+ FX_INT32 offset = pObjStream->GetDict()->GetInteger(FX_BSTRC("First"));
+ CPDF_SyntaxParser syntax;
+ FX_LPCBYTE pData = pObjStream->GetData();
+ FX_DWORD totalsize = pObjStream->GetSize();
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream((FX_LPBYTE)pData, (size_t)totalsize, FALSE));
+ syntax.InitParser((IFX_FileStream*)file, 0);
+ while (n) {
+ FX_DWORD thisnum = syntax.GetDirectNum();
+ FX_DWORD thisoff = syntax.GetDirectNum();
+ if (thisnum == objnum) {
+ if (n == 1) {
+ size = totalsize - (thisoff + offset);
+ } else {
+ FX_DWORD nextnum = syntax.GetDirectNum();
+ FX_DWORD nextoff = syntax.GetDirectNum();
+ size = nextoff - thisoff;
+ }
+ pBuffer = FX_Alloc(FX_BYTE, size);
+ FXSYS_memcpy32(pBuffer, pData + thisoff + offset, size);
+ return;
+ }
+ n --;
+ }
+ return;
+ }
+ if (m_V5Type[objnum] == 1) {
+ FX_FILESIZE pos = m_CrossRef[objnum];
+ if (pos == 0) {
+ return;
+ }
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ m_Syntax.RestorePos(pos);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return;
+ }
+ FX_DWORD real_objnum = FXSYS_atoi(word);
+ if (real_objnum && real_objnum != objnum) {
+ m_Syntax.RestorePos(SavedPos);
+ return;
+ }
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return;
+ }
+ if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
+ m_Syntax.RestorePos(SavedPos);
+ return;
+ }
+ FX_LPVOID pResult = FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ m_Syntax.RestorePos(SavedPos);
+ return;
+ }
+ FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1];
+ FX_BOOL bNextOffValid = FALSE;
+ if (nextoff != pos) {
+ m_Syntax.RestorePos(nextoff);
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (word == FX_BSTRC("xref")) {
+ bNextOffValid = TRUE;
+ } else if (bIsNumber) {
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (bIsNumber && m_Syntax.GetKeyword() == FX_BSTRC("obj")) {
+ bNextOffValid = TRUE;
+ }
+ }
+ }
+ if (!bNextOffValid) {
+ m_Syntax.RestorePos(pos);
+ while (1) {
+ if (m_Syntax.GetKeyword() == FX_BSTRC("endobj")) {
+ break;
+ }
+ if (m_Syntax.SavePos() == m_Syntax.m_FileLen) {
+ break;
+ }
+ }
+ nextoff = m_Syntax.SavePos();
+ }
+ size = (FX_DWORD)(nextoff - pos);
+ pBuffer = FX_Alloc(FX_BYTE, size);
+ m_Syntax.RestorePos(pos);
+ m_Syntax.ReadBlock(pBuffer, size);
+ m_Syntax.RestorePos(SavedPos);
+ }
+}
+CPDF_Object* CPDF_Parser::ParseIndirectObjectAt(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
+ PARSE_CONTEXT* pContext)
+{
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ m_Syntax.RestorePos(pos);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ FX_FILESIZE objOffset = m_Syntax.SavePos();
+ objOffset -= word.GetLength();
+ FX_DWORD real_objnum = FXSYS_atoi(word);
+ if (objnum && real_objnum != objnum) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ FX_DWORD gennum = FXSYS_atoi(word);
+ if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ CPDF_Object* pObj = m_Syntax.GetObject(pObjList, objnum, gennum, 0, pContext);
+ FX_FILESIZE endOffset = m_Syntax.SavePos();
+ CFX_ByteString bsWord = m_Syntax.GetKeyword();
+ if (bsWord == FX_BSTRC("endobj")) {
+ endOffset = m_Syntax.SavePos();
+ }
+ FX_DWORD objSize = endOffset - objOffset;
+ m_Syntax.RestorePos(SavedPos);
+ if (pObj && !objnum) {
+ pObj->m_ObjNum = real_objnum;
+ }
+ return pObj;
+}
+CPDF_Object* CPDF_Parser::ParseIndirectObjectAtByStrict(CPDF_IndirectObjects* pObjList, FX_FILESIZE pos, FX_DWORD objnum,
+ struct PARSE_CONTEXT* pContext, FX_FILESIZE *pResultPos)
+{
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ m_Syntax.RestorePos(pos);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ FX_DWORD real_objnum = FXSYS_atoi(word);
+ if (objnum && real_objnum != objnum) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ FX_DWORD gennum = FXSYS_atoi(word);
+ if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
+ m_Syntax.RestorePos(SavedPos);
+ return NULL;
+ }
+ CPDF_Object* pObj = m_Syntax.GetObjectByStrict(pObjList, objnum, gennum, 0, pContext);
+ if (pResultPos) {
+ *pResultPos = m_Syntax.m_Pos;
+ }
+ m_Syntax.RestorePos(SavedPos);
+ return pObj;
+}
+CPDF_Dictionary* CPDF_Parser::LoadTrailerV4()
+{
+ if (m_Syntax.GetKeyword() != FX_BSTRC("trailer")) {
+ return NULL;
+ }
+ CPDF_Object* pObj = m_Syntax.GetObject(m_pDocument, 0, 0, 0);
+ if (pObj == NULL || pObj->GetType() != PDFOBJ_DICTIONARY) {
+ if (pObj) {
+ pObj->Release();
+ }
+ return NULL;
+ }
+ return (CPDF_Dictionary*)pObj;
+}
+FX_DWORD CPDF_Parser::GetPermissions(FX_BOOL bCheckRevision)
+{
+ if (m_pSecurityHandler == NULL) {
+ return (FX_DWORD) - 1;
+ }
+ FX_DWORD dwPermission = m_pSecurityHandler->GetPermissions();
+ if (m_pEncryptDict && m_pEncryptDict->GetString(FX_BSTRC("Filter")) == FX_BSTRC("Standard")) {
+ dwPermission &= 0xFFFFFFFC;
+ dwPermission |= 0xFFFFF0C0;
+ if(bCheckRevision && m_pEncryptDict->GetInteger(FX_BSTRC("R")) == 2) {
+ dwPermission &= 0xFFFFF0FF;
+ }
+ }
+ return dwPermission;
+}
+FX_BOOL CPDF_Parser::IsOwner()
+{
+ return m_pSecurityHandler == NULL ? TRUE : m_pSecurityHandler->IsOwner();
+}
+void CPDF_Parser::SetSecurityHandler(CPDF_SecurityHandler* pSecurityHandler, FX_BOOL bForced)
+{
+ ASSERT(m_pSecurityHandler == NULL);
+ if (m_pSecurityHandler && !m_bForceUseSecurityHandler) {
+ delete m_pSecurityHandler;
+ m_pSecurityHandler = NULL;
+ }
+ m_bForceUseSecurityHandler = bForced;
+ m_pSecurityHandler = pSecurityHandler;
+ if (m_bForceUseSecurityHandler) {
+ return;
+ }
+ m_Syntax.m_pCryptoHandler = pSecurityHandler->CreateCryptoHandler();
+ m_Syntax.m_pCryptoHandler->Init(NULL, pSecurityHandler);
+}
+FX_BOOL CPDF_Parser::IsLinearizedFile(IFX_FileRead* pFileAccess, FX_DWORD offset)
+{
+ m_Syntax.InitParser(pFileAccess, offset);
+ m_Syntax.RestorePos(m_Syntax.m_HeaderOffset + 9);
+ FX_FILESIZE SavedPos = m_Syntax.SavePos();
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ return FALSE;
+ }
+ FX_DWORD objnum = FXSYS_atoi(word);
+ word = m_Syntax.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ return FALSE;
+ }
+ FX_DWORD gennum = FXSYS_atoi(word);
+ if (m_Syntax.GetKeyword() != FX_BSTRC("obj")) {
+ m_Syntax.RestorePos(SavedPos);
+ return FALSE;
+ }
+ m_pLinearized = m_Syntax.GetObject(NULL, objnum, gennum, 0);
+ if (!m_pLinearized) {
+ return FALSE;
+ }
+ if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
+ m_Syntax.GetNextWord(bIsNumber);
+ CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
+ if (!pLen) {
+ m_pLinearized->Release();
+ return FALSE;
+ }
+ if (pLen->GetInteger() != (int)pFileAccess->GetSize()) {
+ return FALSE;
+ }
+ CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
+ if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageNo = pNo->GetInteger();
+ }
+ CPDF_Object *pTable = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
+ if (pTable && pTable->GetType() == PDFOBJ_NUMBER) {
+ m_LastXRefOffset = pTable->GetInteger();
+ }
+ return TRUE;
+ }
+ m_pLinearized->Release();
+ m_pLinearized = NULL;
+ return FALSE;
+}
+FX_DWORD CPDF_Parser::StartAsynParse(IFX_FileRead* pFileAccess, FX_BOOL bReParse, FX_BOOL bOwnFileRead)
+{
+ CloseParser(bReParse);
+ m_bXRefStream = FALSE;
+ m_LastXRefOffset = 0;
+ m_bOwnFileRead = bOwnFileRead;
+ FX_INT32 offset = GetHeaderOffset(pFileAccess);
+ if (offset == -1) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ if (!IsLinearizedFile(pFileAccess, offset)) {
+ m_Syntax.m_pFileAccess = NULL;
+ return StartParse(pFileAccess, bReParse, bOwnFileRead);
+ }
+ if (!bReParse) {
+ m_pDocument = FX_NEW CPDF_Document(this);
+ }
+ FX_FILESIZE dwFirstXRefOffset = m_Syntax.SavePos();
+ FX_BOOL bXRefRebuilt = FALSE;
+ FX_BOOL bLoadV4 = FALSE;
+ if (!(bLoadV4 = LoadCrossRefV4(dwFirstXRefOffset, 0, FALSE, FALSE)) && !LoadCrossRefV5(dwFirstXRefOffset, dwFirstXRefOffset, TRUE)) {
+ if (!RebuildCrossRef()) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ bXRefRebuilt = TRUE;
+ m_LastXRefOffset = 0;
+ }
+ if (bLoadV4) {
+ m_pTrailer = LoadTrailerV4();
+ if (m_pTrailer == NULL) {
+ return FALSE;
+ }
+ FX_INT32 xrefsize = GetDirectInteger(m_pTrailer, FX_BSTRC("Size"));
+ if (xrefsize == 0) {
+ return FALSE;
+ }
+ m_CrossRef.SetSize(xrefsize);
+ m_V5Type.SetSize(xrefsize);
+ }
+ FX_DWORD dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());
+ if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
+ if (bXRefRebuilt) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ ReleaseEncryptHandler();
+ if (!RebuildCrossRef()) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ m_pDocument->LoadAsynDoc(m_pLinearized->GetDict());
+ if (m_pDocument->GetRoot() == NULL) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ }
+ FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ FX_DWORD RootObjNum = GetRootObjNum();
+ if (RootObjNum == 0) {
+ ReleaseEncryptHandler();
+ RebuildCrossRef();
+ RootObjNum = GetRootObjNum();
+ if (RootObjNum == 0) {
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ dwRet = SetEncryptHandler();
+ if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+ return dwRet;
+ }
+ }
+ if (m_pSecurityHandler && m_pSecurityHandler->IsMetadataEncrypted()) {
+ CPDF_Reference* pMetadata = (CPDF_Reference*)m_pDocument->GetRoot()->GetElement(FX_BSTRC("Metadata"));
+ if (pMetadata && pMetadata->GetType() == PDFOBJ_REFERENCE) {
+ m_Syntax.m_MetadataObjnum = pMetadata->GetRefObjNum();
+ }
+ }
+ return PDFPARSE_ERROR_SUCCESS;
+}
+FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV5(FX_FILESIZE xrefpos)
+{
+ if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
+ return FALSE;
+ }
+ while (xrefpos)
+ if (!LoadCrossRefV5(xrefpos, xrefpos, FALSE)) {
+ return FALSE;
+ }
+ m_ObjectStreamMap.InitHashTable(101, FALSE);
+ m_bXRefStream = TRUE;
+ return TRUE;
+}
+FX_DWORD CPDF_Parser::LoadLinearizedMainXRefTable()
+{
+ FX_DWORD dwSaveMetadataObjnum = m_Syntax.m_MetadataObjnum;
+ m_Syntax.m_MetadataObjnum = 0;
+ if (m_pTrailer) {
+ m_pTrailer->Release();
+ m_pTrailer = NULL;
+ }
+ m_Syntax.RestorePos(m_LastXRefOffset - m_Syntax.m_HeaderOffset);
+ FX_FILESIZE dwSavedPos = m_Syntax.SavePos();
+ FX_BYTE ch = 0;
+ FX_DWORD dwCount = 0;
+ m_Syntax.GetNextChar(ch);
+ FX_INT32 type = _PDF_CharType[ch];
+ while (type == 'W') {
+ ++dwCount;
+ if (m_Syntax.m_FileLen >= (FX_FILESIZE)(m_Syntax.SavePos() + m_Syntax.m_HeaderOffset)) {
+ break;
+ }
+ m_Syntax.GetNextChar(ch);
+ type = _PDF_CharType[ch];
+ }
+ m_LastXRefOffset += dwCount;
+ FX_POSITION pos = m_ObjectStreamMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID objnum;
+ CPDF_StreamAcc* pStream;
+ m_ObjectStreamMap.GetNextAssoc(pos, objnum, (void*&)pStream);
+ delete pStream;
+ }
+ m_ObjectStreamMap.RemoveAll();
+ if (!LoadLinearizedAllCrossRefV4(m_LastXRefOffset, m_dwXrefStartObjNum) && !LoadLinearizedAllCrossRefV5(m_LastXRefOffset)) {
+ m_LastXRefOffset = 0;
+ m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
+ return PDFPARSE_ERROR_FORMAT;
+ }
+ FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), sizeof(FX_DWORD), _CompareDWord);
+ m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum;
+ return PDFPARSE_ERROR_SUCCESS;
+}
+CPDF_SyntaxParser::CPDF_SyntaxParser()
+{
+ m_pFileAccess = NULL;
+ m_pCryptoHandler = NULL;
+ m_pFileBuf = NULL;
+ m_BufSize = CPDF_ModuleMgr::Get()->m_FileBufSize;
+ m_pFileBuf = NULL;
+ m_MetadataObjnum = 0;
+ m_dwWordPos = 0;
+#if defined(_FPDFAPI_MINI_)
+ m_bFileStream = TRUE;
+#else
+ m_bFileStream = FALSE;
+#endif
+}
+CPDF_SyntaxParser::~CPDF_SyntaxParser()
+{
+ if (m_pFileBuf) {
+ FX_Free(m_pFileBuf);
+ }
+}
+FX_BOOL CPDF_SyntaxParser::GetCharAt(FX_FILESIZE pos, FX_BYTE& ch)
+{
+ FX_FILESIZE save_pos = m_Pos;
+ m_Pos = pos;
+ FX_BOOL ret = GetNextChar(ch);
+ m_Pos = save_pos;
+ return ret;
+}
+FX_BOOL CPDF_SyntaxParser::GetNextChar(FX_BYTE& ch)
+{
+ FX_FILESIZE pos = m_Pos + m_HeaderOffset;
+ if (pos >= m_FileLen) {
+ return FALSE;
+ }
+ if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
+ FX_FILESIZE read_pos = pos;
+ FX_DWORD read_size = m_BufSize;
+ if ((FX_FILESIZE)read_size > m_FileLen) {
+ read_size = (FX_DWORD)m_FileLen;
+ }
+ if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
+ if (m_FileLen < (FX_FILESIZE)read_size) {
+ read_pos = 0;
+ read_size = (FX_DWORD)m_FileLen;
+ } else {
+ read_pos = m_FileLen - read_size;
+ }
+ }
+ if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {
+ return FALSE;
+ }
+ m_BufOffset = read_pos;
+ }
+ ch = m_pFileBuf[pos - m_BufOffset];
+ m_Pos ++;
+ return TRUE;
+}
+FX_BOOL CPDF_SyntaxParser::GetCharAtBackward(FX_FILESIZE pos, FX_BYTE& ch)
+{
+ pos += m_HeaderOffset;
+ if (pos >= m_FileLen) {
+ return FALSE;
+ }
+ if (m_BufOffset >= pos || (FX_FILESIZE)(m_BufOffset + m_BufSize) <= pos) {
+ FX_FILESIZE read_pos;
+ if (pos < (FX_FILESIZE)m_BufSize) {
+ read_pos = 0;
+ } else {
+ read_pos = pos - m_BufSize + 1;
+ }
+ FX_DWORD read_size = m_BufSize;
+ if ((FX_FILESIZE)(read_pos + read_size) > m_FileLen) {
+ if (m_FileLen < (FX_FILESIZE)read_size) {
+ read_pos = 0;
+ read_size = (FX_DWORD)m_FileLen;
+ } else {
+ read_pos = m_FileLen - read_size;
+ }
+ }
+ if (!m_pFileAccess->ReadBlock(m_pFileBuf, read_pos, read_size)) {
+ return FALSE;
+ }
+ m_BufOffset = read_pos;
+ }
+ ch = m_pFileBuf[pos - m_BufOffset];
+ return TRUE;
+}
+FX_BOOL CPDF_SyntaxParser::ReadBlock(FX_LPBYTE pBuf, FX_DWORD size)
+{
+ if (!m_pFileAccess->ReadBlock(pBuf, m_Pos + m_HeaderOffset, size)) {
+ return FALSE;
+ }
+ m_Pos += size;
+ return TRUE;
+}
+#define MAX_WORD_BUFFER 256
+void CPDF_SyntaxParser::GetNextWord()
+{
+ m_WordSize = 0;
+ m_bIsNumber = TRUE;
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ FX_BYTE type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D') {
+ m_bIsNumber = FALSE;
+ m_WordBuffer[m_WordSize++] = ch;
+ if (ch == '/') {
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ type = _PDF_CharType[ch];
+ if (type != 'R' && type != 'N') {
+ m_Pos --;
+ return;
+ }
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ }
+ } else if (ch == '<') {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ if (ch == '<') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ } else if (ch == '>') {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ if (ch == '>') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ }
+ return;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (type != 'N') {
+ m_bIsNumber = FALSE;
+ }
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+}
+CFX_ByteString CPDF_SyntaxParser::ReadString()
+{
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return CFX_ByteString();
+ }
+ CFX_ByteTextBuf buf;
+ FX_INT32 parlevel = 0;
+ FX_INT32 status = 0, iEscCode = 0;
+ while (1) {
+ switch (status) {
+ case 0:
+ if (ch == ')') {
+ if (parlevel == 0) {
+ return buf.GetByteString();
+ }
+ parlevel --;
+ buf.AppendChar(')');
+ } else if (ch == '(') {
+ parlevel ++;
+ buf.AppendChar('(');
+ } else if (ch == '\\') {
+ status = 1;
+ } else {
+ buf.AppendChar(ch);
+ }
+ break;
+ case 1:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = ch - '0';
+ status = 2;
+ break;
+ }
+ if (ch == 'n') {
+ buf.AppendChar('\n');
+ } else if (ch == 'r') {
+ buf.AppendChar('\r');
+ } else if (ch == 't') {
+ buf.AppendChar('\t');
+ } else if (ch == 'b') {
+ buf.AppendChar('\b');
+ } else if (ch == 'f') {
+ buf.AppendChar('\f');
+ } else if (ch == '\r') {
+ status = 4;
+ break;
+ } else if (ch == '\n') {
+ } else {
+ buf.AppendChar(ch);
+ }
+ status = 0;
+ break;
+ case 2:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ status = 3;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 3:
+ if (ch >= '0' && ch <= '7') {
+ iEscCode = iEscCode * 8 + ch - '0';
+ buf.AppendChar(iEscCode);
+ status = 0;
+ } else {
+ buf.AppendChar(iEscCode);
+ status = 0;
+ continue;
+ }
+ break;
+ case 4:
+ status = 0;
+ if (ch != '\n') {
+ continue;
+ }
+ break;
+ }
+ if (!GetNextChar(ch)) {
+ break;
+ }
+ }
+ GetNextChar(ch);
+ return buf.GetByteString();
+}
+CFX_ByteString CPDF_SyntaxParser::ReadHexString()
+{
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return CFX_ByteString();
+ }
+ CFX_BinaryBuf buf;
+ FX_BOOL bFirst = TRUE;
+ FX_BYTE code = 0;
+ while (1) {
+ if (ch == '>') {
+ break;
+ }
+ if (ch >= '0' && ch <= '9') {
+ if (bFirst) {
+ code = (ch - '0') * 16;
+ } else {
+ code += ch - '0';
+ buf.AppendByte((FX_BYTE)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'A' && ch <= 'F') {
+ if (bFirst) {
+ code = (ch - 'A' + 10) * 16;
+ } else {
+ code += ch - 'A' + 10;
+ buf.AppendByte((FX_BYTE)code);
+ }
+ bFirst = !bFirst;
+ } else if (ch >= 'a' && ch <= 'f') {
+ if (bFirst) {
+ code = (ch - 'a' + 10) * 16;
+ } else {
+ code += ch - 'a' + 10;
+ buf.AppendByte((FX_BYTE)code);
+ }
+ bFirst = !bFirst;
+ }
+ if (!GetNextChar(ch)) {
+ break;
+ }
+ }
+ if (!bFirst) {
+ buf.AppendByte((FX_BYTE)code);
+ }
+ return buf.GetByteString();
+}
+void CPDF_SyntaxParser::ToNextLine()
+{
+ FX_BYTE ch;
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ if (ch == '\n') {
+ return;
+ }
+ if (ch == '\r') {
+ GetNextChar(ch);
+ if (ch == '\n') {
+ return;
+ } else {
+ m_Pos --;
+ return;
+ }
+ }
+ }
+}
+void CPDF_SyntaxParser::ToNextWord()
+{
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ FX_BYTE type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ m_dwWordPos = m_Pos;
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ m_Pos --;
+}
+CFX_ByteString CPDF_SyntaxParser::GetNextWord(FX_BOOL& bIsNumber)
+{
+ GetNextWord();
+ bIsNumber = m_bIsNumber;
+ return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
+}
+CFX_ByteString CPDF_SyntaxParser::GetKeyword()
+{
+ GetNextWord();
+ return CFX_ByteString((FX_LPCSTR)m_WordBuffer, m_WordSize);
+}
+CPDF_Object* CPDF_SyntaxParser::GetObject(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum, FX_INT32 level, PARSE_CONTEXT* pContext, FX_BOOL bDecrypt)
+{
+ if (level > _PARSER_OBJECT_LEVLE_) {
+ return NULL;
+ }
+ FX_FILESIZE SavedPos = m_Pos;
+ FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = GetNextWord(bIsNumber);
+ CPDF_Object* pRet = NULL;
+ if (word.GetLength() == 0) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_INVALID;
+ }
+ return NULL;
+ }
+ FX_FILESIZE wordOffset = m_Pos - word.GetLength();
+ if (bIsNumber) {
+ FX_FILESIZE SavedPos = m_Pos;
+ CFX_ByteString nextword = GetNextWord(bIsNumber);
+ if (bIsNumber) {
+ CFX_ByteString nextword2 = GetNextWord(bIsNumber);
+ if (nextword2 == FX_BSTRC("R")) {
+ FX_DWORD objnum = FXSYS_atoi(word);
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_REFERENCE;
+ }
+ pRet = CPDF_Reference::Create(pObjList, objnum);
+ return pRet;
+ } else {
+ m_Pos = SavedPos;
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NUMBER;
+ }
+ pRet = CPDF_Number::Create(word);
+ return pRet;
+ }
+ } else {
+ m_Pos = SavedPos;
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NUMBER;
+ }
+ pRet = CPDF_Number::Create(word);
+ return pRet;
+ }
+ }
+ if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_BOOLEAN;
+ }
+ pRet = CPDF_Boolean::Create(word == FX_BSTRC("true"));
+ return pRet;
+ }
+ if (word == FX_BSTRC("null")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NULL;
+ }
+ pRet = CPDF_Null::Create();
+ return pRet;
+ }
+ if (word == FX_BSTRC("(")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_STRING;
+ }
+ FX_FILESIZE SavedPos = m_Pos - 1;
+ CFX_ByteString str = ReadString();
+ if (m_pCryptoHandler && bDecrypt) {
+ m_pCryptoHandler->Decrypt(objnum, gennum, str);
+ }
+ pRet = CPDF_String::Create(str, FALSE);
+ return pRet;
+ }
+ if (word == FX_BSTRC("<")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_STRING;
+ }
+ FX_FILESIZE SavedPos = m_Pos - 1;
+ CFX_ByteString str = ReadHexString();
+ if (m_pCryptoHandler && bDecrypt) {
+ m_pCryptoHandler->Decrypt(objnum, gennum, str);
+ }
+ pRet = CPDF_String::Create(str, TRUE);
+ return pRet;
+ }
+ if (word == FX_BSTRC("[")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_ARRAY;
+ }
+ CPDF_Array* pArray = CPDF_Array::Create();
+ FX_FILESIZE firstPos = m_Pos - 1;
+ while (1) {
+ FX_FILESIZE SavedPos = m_Pos;
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
+ if (pObj == NULL) {
+ return pArray;
+ }
+ pArray->Add(pObj);
+ }
+ }
+ if (word[0] == '/') {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NAME;
+ }
+ pRet = CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
+ return pRet;
+ }
+ if (word == FX_BSTRC("<<")) {
+ FX_FILESIZE saveDictOffset = m_Pos - 2;
+ FX_DWORD dwDictSize = 0;
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_DICTIONARY;
+ }
+ if (pContext) {
+ pContext->m_DictStart = SavedPos;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ FX_INT32 nKeys = 0;
+ FX_FILESIZE dwSignValuePos = 0;
+ while (1) {
+ FX_BOOL bIsNumber;
+ CFX_ByteString key = GetNextWord(bIsNumber);
+ if (key.IsEmpty()) {
+ pDict->Release();
+ return NULL;
+ }
+ FX_FILESIZE SavedPos = m_Pos - key.GetLength();
+ if (key == FX_BSTRC(">>")) {
+ dwDictSize = m_Pos - saveDictOffset;
+ break;
+ }
+ if (key == FX_BSTRC("endobj")) {
+ dwDictSize = m_Pos - 6 - saveDictOffset;
+ m_Pos = SavedPos;
+ break;
+ }
+ if (key[0] != '/') {
+ continue;
+ }
+ nKeys ++;
+ key = PDF_NameDecode(key);
+ if (key == FX_BSTRC("/Contents")) {
+ dwSignValuePos = m_Pos;
+ }
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
+ if (pObj == NULL) {
+ continue;
+ }
+ if (key.GetLength() == 1) {
+ pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
+ } else {
+ if (nKeys < 32) {
+ pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
+ } else {
+ pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
+ }
+ }
+ }
+ if (IsSignatureDict(pDict)) {
+ FX_FILESIZE dwSavePos = m_Pos;
+ m_Pos = dwSignValuePos;
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1, NULL, FALSE);
+ pDict->SetAt(FX_BSTRC("Contents"), pObj);
+ m_Pos = dwSavePos;
+ }
+ if (pContext) {
+ pContext->m_DictEnd = m_Pos;
+ if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
+ return pDict;
+ }
+ }
+ FX_FILESIZE SavedPos = m_Pos;
+ FX_BOOL bIsNumber;
+ CFX_ByteString nextword = GetNextWord(bIsNumber);
+ if (nextword == FX_BSTRC("stream")) {
+ CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);
+ if (pStream) {
+ return pStream;
+ }
+ pDict->Release();
+ return NULL;
+ } else {
+ m_Pos = SavedPos;
+ return pDict;
+ }
+ }
+ if (word == FX_BSTRC(">>")) {
+ m_Pos = SavedPos;
+ return NULL;
+ }
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_INVALID;
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_SyntaxParser::GetObjectByStrict(CPDF_IndirectObjects* pObjList, FX_DWORD objnum, FX_DWORD gennum,
+ FX_INT32 level, struct PARSE_CONTEXT* pContext)
+{
+ if (level > _PARSER_OBJECT_LEVLE_) {
+ return NULL;
+ }
+ FX_FILESIZE SavedPos = m_Pos;
+ FX_BOOL bTypeOnly = pContext && (pContext->m_Flags & PDFPARSE_TYPEONLY);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = GetNextWord(bIsNumber);
+ if (word.GetLength() == 0) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_INVALID;
+ }
+ return NULL;
+ }
+ if (bIsNumber) {
+ FX_FILESIZE SavedPos = m_Pos;
+ CFX_ByteString nextword = GetNextWord(bIsNumber);
+ if (bIsNumber) {
+ CFX_ByteString nextword2 = GetNextWord(bIsNumber);
+ if (nextword2 == FX_BSTRC("R")) {
+ FX_DWORD objnum = FXSYS_atoi(word);
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_REFERENCE;
+ }
+ return CPDF_Reference::Create(pObjList, objnum);
+ } else {
+ m_Pos = SavedPos;
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NUMBER;
+ }
+ return CPDF_Number::Create(word);
+ }
+ } else {
+ m_Pos = SavedPos;
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NUMBER;
+ }
+ return CPDF_Number::Create(word);
+ }
+ }
+ if (word == FX_BSTRC("true") || word == FX_BSTRC("false")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_BOOLEAN;
+ }
+ return CPDF_Boolean::Create(word == FX_BSTRC("true"));
+ }
+ if (word == FX_BSTRC("null")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NULL;
+ }
+ return CPDF_Null::Create();
+ }
+ if (word == FX_BSTRC("(")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_STRING;
+ }
+ CFX_ByteString str = ReadString();
+ if (m_pCryptoHandler) {
+ m_pCryptoHandler->Decrypt(objnum, gennum, str);
+ }
+ return CPDF_String::Create(str, FALSE);
+ }
+ if (word == FX_BSTRC("<")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_STRING;
+ }
+ CFX_ByteString str = ReadHexString();
+ if (m_pCryptoHandler) {
+ m_pCryptoHandler->Decrypt(objnum, gennum, str);
+ }
+ return CPDF_String::Create(str, TRUE);
+ }
+ if (word == FX_BSTRC("[")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_ARRAY;
+ }
+ CPDF_Array* pArray = CPDF_Array::Create();
+ while (1) {
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
+ if (pObj == NULL) {
+ if (m_WordBuffer[0] == ']') {
+ return pArray;
+ }
+ pArray->Release();
+ return NULL;
+ }
+ pArray->Add(pObj);
+ }
+ }
+ if (word[0] == '/') {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_NAME;
+ }
+ return CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
+ }
+ if (word == FX_BSTRC("<<")) {
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_DICTIONARY;
+ }
+ if (pContext) {
+ pContext->m_DictStart = SavedPos;
+ }
+ CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+ while (1) {
+ FX_BOOL bIsNumber;
+ FX_FILESIZE SavedPos = m_Pos;
+ CFX_ByteString key = GetNextWord(bIsNumber);
+ if (key.IsEmpty()) {
+ pDict->Release();
+ return NULL;
+ }
+ if (key == FX_BSTRC(">>")) {
+ break;
+ }
+ if (key == FX_BSTRC("endobj")) {
+ m_Pos = SavedPos;
+ break;
+ }
+ if (key[0] != '/') {
+ continue;
+ }
+ key = PDF_NameDecode(key);
+ CPDF_Object* pObj = GetObject(pObjList, objnum, gennum, level + 1);
+ if (pObj == NULL) {
+ pDict->Release();
+ FX_BYTE ch;
+ while (1) {
+ if (!GetNextChar(ch)) {
+ break;
+ }
+ if (ch == 0x0A || ch == 0x0D) {
+ break;
+ }
+ }
+ return NULL;
+ }
+ if (key.GetLength() == 1) {
+ pDict->SetAt(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
+ } else {
+ pDict->AddValue(CFX_ByteStringC(((FX_LPCSTR)key) + 1, key.GetLength() - 1), pObj);
+ }
+ }
+ if (pContext) {
+ pContext->m_DictEnd = m_Pos;
+ if (pContext->m_Flags & PDFPARSE_NOSTREAM) {
+ return pDict;
+ }
+ }
+ FX_FILESIZE SavedPos = m_Pos;
+ FX_BOOL bIsNumber;
+ CFX_ByteString nextword = GetNextWord(bIsNumber);
+ if (nextword == FX_BSTRC("stream")) {
+ CPDF_Stream* pStream = ReadStream(pDict, pContext, objnum, gennum);
+ if (pStream) {
+ return pStream;
+ }
+ pDict->Release();
+ return NULL;
+ } else {
+ m_Pos = SavedPos;
+ return pDict;
+ }
+ }
+ if (word == FX_BSTRC(">>")) {
+ m_Pos = SavedPos;
+ return NULL;
+ }
+ if (bTypeOnly) {
+ return (CPDF_Object*)PDFOBJ_INVALID;
+ }
+ return NULL;
+}
+CPDF_Stream* CPDF_SyntaxParser::ReadStream(CPDF_Dictionary* pDict, PARSE_CONTEXT* pContext,
+ FX_DWORD objnum, FX_DWORD gennum)
+{
+ CPDF_Object* pLenObj = pDict->GetElement(FX_BSTRC("Length"));
+ FX_DWORD len = 0;
+ if (pLenObj && (pLenObj->GetType() != PDFOBJ_REFERENCE ||
+ (((CPDF_Reference*)pLenObj)->GetObjList() != NULL) &&
+ ((CPDF_Reference*)pLenObj)->GetRefObjNum() != objnum)) {
+ FX_FILESIZE pos = m_Pos;
+ if (pLenObj) {
+ len = pLenObj->GetInteger();
+ }
+ m_Pos = pos;
+ if (len > 0x40000000) {
+ return NULL;
+ }
+ }
+ ToNextLine();
+ FX_FILESIZE StreamStartPos = m_Pos;
+ if (pContext) {
+ pContext->m_DataStart = m_Pos;
+ }
+ m_Pos += len;
+ CPDF_CryptoHandler* pCryptoHandler = objnum == (FX_DWORD)m_MetadataObjnum ? NULL : m_pCryptoHandler;
+ if (pCryptoHandler == NULL) {
+ FX_FILESIZE SavedPos = m_Pos;
+ GetNextWord();
+ if (m_WordSize < 9 || FXSYS_memcmp32(m_WordBuffer, "endstream", 9)) {
+ m_Pos = StreamStartPos;
+ FX_FILESIZE offset = FindTag(FX_BSTRC("endstream"), 0);
+ if (offset >= 0) {
+ FX_FILESIZE curPos = m_Pos;
+ m_Pos = StreamStartPos;
+ FX_FILESIZE endobjOffset = FindTag(FX_BSTRC("endobj"), 0);
+ if (endobjOffset < offset && endobjOffset >= 0) {
+ offset = endobjOffset;
+ } else {
+ m_Pos = curPos;
+ }
+ FX_BYTE byte1, byte2;
+ GetCharAt(StreamStartPos + offset - 1, byte1);
+ GetCharAt(StreamStartPos + offset - 2, byte2);
+ if (byte1 == 0x0a && byte2 == 0x0d) {
+ len -= 2;
+ } else if (byte1 == 0x0a || byte1 == 0x0d) {
+ len --;
+ }
+ len = (FX_DWORD)offset;
+ pDict->SetAtInteger(FX_BSTRC("Length"), len);
+ } else {
+ m_Pos = StreamStartPos;
+ if (FindTag(FX_BSTRC("endobj"), 0) < 0) {
+ return NULL;
+ }
+ }
+ }
+ }
+ m_Pos = StreamStartPos;
+ CPDF_Stream* pStream;
+#if defined(_FPDFAPI_MINI_) && !defined(_FXCORE_FEATURE_ALL_)
+ pStream = FX_NEW CPDF_Stream(m_pFileAccess, pCryptoHandler, m_HeaderOffset + m_Pos, len, pDict, gennum);
+ m_Pos += len;
+#else
+ FX_LPBYTE pData = FX_Alloc(FX_BYTE, len);
+ if (!pData) {
+ return NULL;
+ }
+ ReadBlock(pData, len);
+ if (pCryptoHandler) {
+ CFX_BinaryBuf dest_buf;
+ dest_buf.EstimateSize(pCryptoHandler->DecryptGetSize(len));
+ FX_LPVOID context = pCryptoHandler->DecryptStart(objnum, gennum);
+ pCryptoHandler->DecryptStream(context, pData, len, dest_buf);
+ pCryptoHandler->DecryptFinish(context, dest_buf);
+ FX_Free(pData);
+ pData = dest_buf.GetBuffer();
+ len = dest_buf.GetSize();
+ dest_buf.DetachBuffer();
+ }
+ pStream = FX_NEW CPDF_Stream(pData, len, pDict);
+#endif
+ if (pContext) {
+ pContext->m_DataEnd = pContext->m_DataStart + len;
+ }
+ StreamStartPos = m_Pos;
+ GetNextWord();
+ if (m_WordSize == 6 && 0 == FXSYS_memcmp32(m_WordBuffer, "endobj", 6)) {
+ m_Pos = StreamStartPos;
+ }
+ return pStream;
+}
+void CPDF_SyntaxParser::InitParser(IFX_FileRead* pFileAccess, FX_DWORD HeaderOffset)
+{
+ if (m_pFileBuf) {
+ FX_Free(m_pFileBuf);
+ m_pFileBuf = NULL;
+ }
+ m_pFileBuf = FX_Alloc(FX_BYTE, m_BufSize);
+ m_HeaderOffset = HeaderOffset;
+ m_FileLen = pFileAccess->GetSize();
+ m_Pos = 0;
+ m_pFileAccess = pFileAccess;
+ m_BufOffset = 0;
+ pFileAccess->ReadBlock(m_pFileBuf, 0, (size_t)((FX_FILESIZE)m_BufSize > m_FileLen ? m_FileLen : m_BufSize));
+}
+FX_INT32 CPDF_SyntaxParser::GetDirectNum()
+{
+ GetNextWord();
+ if (!m_bIsNumber) {
+ return 0;
+ }
+ m_WordBuffer[m_WordSize] = 0;
+ return FXSYS_atoi((FX_LPCSTR)m_WordBuffer);
+}
+FX_BOOL CPDF_SyntaxParser::IsWholeWord(FX_FILESIZE startpos, FX_FILESIZE limit, FX_LPCBYTE tag, FX_DWORD taglen)
+{
+ FX_BYTE type = _PDF_CharType[tag[0]];
+ FX_BOOL bCheckLeft = type != 'D' && type != 'W';
+ type = _PDF_CharType[tag[taglen - 1]];
+ FX_BOOL bCheckRight = type != 'D' || type != 'W';
+ FX_BYTE ch;
+ if (bCheckRight && startpos + (FX_INT32)taglen <= limit && GetCharAt(startpos + (FX_INT32)taglen, ch)) {
+ FX_BYTE type = _PDF_CharType[ch];
+ if (type == 'N' || type == 'R') {
+ return FALSE;
+ }
+ }
+ if (bCheckLeft && startpos > 0 && GetCharAt(startpos - 1, ch)) {
+ FX_BYTE type = _PDF_CharType[ch];
+ if (type == 'N' || type == 'R') {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_SyntaxParser::SearchWord(FX_BSTR tag, FX_BOOL bWholeWord, FX_BOOL bForward, FX_FILESIZE limit)
+{
+ FX_INT32 taglen = tag.GetLength();
+ if (taglen == 0) {
+ return FALSE;
+ }
+ FX_FILESIZE pos = m_Pos;
+ FX_INT32 offset = 0;
+ if (!bForward) {
+ offset = taglen - 1;
+ }
+ FX_LPCBYTE tag_data = tag;
+ FX_BYTE byte;
+ while (1) {
+ if (bForward) {
+ if (limit) {
+ if (pos >= m_Pos + limit) {
+ return FALSE;
+ }
+ }
+ if (!GetCharAt(pos, byte)) {
+ return FALSE;
+ }
+ } else {
+ if (limit) {
+ if (pos <= m_Pos - limit) {
+ return FALSE;
+ }
+ }
+ if (!GetCharAtBackward(pos, byte)) {
+ return FALSE;
+ }
+ }
+ if (byte == tag_data[offset]) {
+ if (bForward) {
+ offset ++;
+ if (offset < taglen) {
+ pos ++;
+ continue;
+ }
+ } else {
+ offset --;
+ if (offset >= 0) {
+ pos --;
+ continue;
+ }
+ }
+ FX_FILESIZE startpos = bForward ? pos - taglen + 1 : pos;
+ if (!bWholeWord || IsWholeWord(startpos, limit, tag, taglen)) {
+ m_Pos = startpos;
+ return TRUE;
+ }
+ }
+ if (bForward) {
+ offset = byte == tag_data[0] ? 1 : 0;
+ pos ++;
+ } else {
+ offset = byte == tag_data[taglen - 1] ? taglen - 2 : taglen - 1;
+ pos --;
+ }
+ if (pos < 0) {
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+struct _SearchTagRecord {
+ FX_LPCBYTE m_pTag;
+ FX_DWORD m_Len;
+ FX_DWORD m_Offset;
+};
+FX_INT32 CPDF_SyntaxParser::SearchMultiWord(FX_BSTR tags, FX_BOOL bWholeWord, FX_FILESIZE limit)
+{
+ FX_INT32 ntags = 1, i;
+ for (i = 0; i < tags.GetLength(); i ++)
+ if (tags[i] == 0) {
+ ntags ++;
+ }
+ _SearchTagRecord* pPatterns = FX_Alloc(_SearchTagRecord, ntags);
+ FX_DWORD start = 0, itag = 0, max_len = 0;
+ for (i = 0; i <= tags.GetLength(); i ++) {
+ if (tags[i] == 0) {
+ FX_DWORD len = i - start;
+ if (len > max_len) {
+ max_len = len;
+ }
+ pPatterns[itag].m_pTag = tags.GetPtr() + start;
+ pPatterns[itag].m_Len = len;
+ pPatterns[itag].m_Offset = 0;
+ start = i + 1;
+ itag ++;
+ }
+ }
+ FX_FILESIZE pos = m_Pos;
+ FX_BYTE byte;
+ GetCharAt(pos++, byte);
+ FX_INT32 found = -1;
+ while (1) {
+ for (i = 0; i < ntags; i ++) {
+ if (pPatterns[i].m_pTag[pPatterns[i].m_Offset] == byte) {
+ pPatterns[i].m_Offset ++;
+ if (pPatterns[i].m_Offset == pPatterns[i].m_Len) {
+ if (!bWholeWord || IsWholeWord(pos - pPatterns[i].m_Len, limit, pPatterns[i].m_pTag, pPatterns[i].m_Len)) {
+ found = i;
+ goto end;
+ } else {
+ if (pPatterns[i].m_pTag[0] == byte) {
+ pPatterns[i].m_Offset = 1;
+ } else {
+ pPatterns[i].m_Offset = 0;
+ }
+ }
+ }
+ } else {
+ if (pPatterns[i].m_pTag[0] == byte) {
+ pPatterns[i].m_Offset = 1;
+ } else {
+ pPatterns[i].m_Offset = 0;
+ }
+ }
+ }
+ if (limit && pos >= m_Pos + limit) {
+ goto end;
+ }
+ if (!GetCharAt(pos, byte)) {
+ goto end;
+ }
+ pos ++;
+ }
+end:
+ FX_Free(pPatterns);
+ return found;
+}
+FX_FILESIZE CPDF_SyntaxParser::FindTag(FX_BSTR tag, FX_FILESIZE limit)
+{
+ FX_INT32 taglen = tag.GetLength();
+ FX_INT32 match = 0;
+ limit += m_Pos;
+ FX_FILESIZE startpos = m_Pos;
+ while (1) {
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return -1;
+ }
+ if (ch == tag[match]) {
+ match ++;
+ if (match == taglen) {
+ return m_Pos - startpos - taglen;
+ }
+ } else {
+ match = ch == tag[0] ? 1 : 0;
+ }
+ if (limit && m_Pos == limit) {
+ return -1;
+ }
+ }
+ return -1;
+}
+void CPDF_SyntaxParser::GetBinary(FX_BYTE* buffer, FX_DWORD size)
+{
+ FX_DWORD offset = 0;
+ FX_BYTE ch;
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return;
+ }
+ buffer[offset++] = ch;
+ if (offset == size) {
+ break;
+ }
+ }
+}
+CPDF_DataAvail::CPDF_DataAvail(IFX_FileAvail* pFileAvail, IFX_FileRead* pFileRead)
+{
+ m_pFileAvail = pFileAvail;
+ m_pFileRead = pFileRead;
+ m_Pos = 0;
+ m_dwFileLen = 0;
+ if (m_pFileRead) {
+ m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
+ }
+ m_dwCurrentOffset = 0;
+ m_WordSize = 0;
+ m_dwXRefOffset = 0;
+ m_bufferOffset = 0;
+ m_dwFirstPageNo = 0;
+ m_bufferSize = 0;
+ m_PagesObjNum = 0;
+ m_dwCurrentXRefSteam = 0;
+ m_dwAcroFormObjNum = 0;
+ m_dwInfoObjNum = 0;
+ m_pDocument = 0;
+ m_dwEncryptObjNum = 0;
+ m_dwPrevXRefOffset = 0;
+ m_dwLastXRefOffset = 0;
+ m_bDocAvail = FALSE;
+ m_bMainXRefLoad = FALSE;
+ m_bDocAvail = FALSE;
+ m_bLinearized = FALSE;
+ m_bPagesLoad = FALSE;
+ m_bPagesTreeLoad = FALSE;
+ m_bMainXRefLoadedOK = FALSE;
+ m_bAnnotsLoad = FALSE;
+ m_bHaveAcroForm = FALSE;
+ m_bAcroFormLoad = FALSE;
+ m_bPageLoadedOK = FALSE;
+ m_bNeedDownLoadResource = FALSE;
+ m_bLinearizedFormParamLoad = FALSE;
+ m_pLinearized = NULL;
+ m_pRoot = NULL;
+ m_pTrailer = NULL;
+ m_pCurrentParser = NULL;
+ m_pAcroForm = NULL;
+ m_pPageDict = NULL;
+ m_pPageResource = NULL;
+ m_pageMapCheckState = NULL;
+ m_docStatus = PDF_DATAAVAIL_HEADER;
+ m_parser.m_bOwnFileRead = FALSE;
+ m_bTotalLoadPageTree = FALSE;
+ m_bCurPageDictLoadOK = FALSE;
+ m_bLinearedDataOK = FALSE;
+ m_pagesLoadState = NULL;
+}
+CPDF_DataAvail::~CPDF_DataAvail()
+{
+ if (m_pLinearized) {
+ m_pLinearized->Release();
+ }
+ if (m_pRoot) {
+ m_pRoot->Release();
+ }
+ if (m_pTrailer) {
+ m_pTrailer->Release();
+ }
+ if (m_pageMapCheckState) {
+ delete m_pageMapCheckState;
+ }
+ if (m_pagesLoadState) {
+ delete m_pagesLoadState;
+ }
+ FX_INT32 i = 0;
+ FX_INT32 iSize = m_arrayAcroforms.GetSize();
+ for (i = 0; i < iSize; ++i) {
+ ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();
+ }
+}
+void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+}
+FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset)
+{
+ CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
+ if (pParser == NULL) {
+ return 0;
+ }
+ if (objnum >= (FX_DWORD)pParser->m_CrossRef.GetSize()) {
+ return 0;
+ }
+ if (pParser->m_V5Type[objnum] == 2) {
+ objnum = (FX_DWORD)pParser->m_CrossRef[objnum];
+ }
+ if (pParser->m_V5Type[objnum] == 1 || pParser->m_V5Type[objnum] == 255) {
+ offset = pParser->m_CrossRef[objnum];
+ if (offset == 0) {
+ return 0;
+ }
+ FX_LPVOID pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), pParser->m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ if (pResult == NULL) {
+ return 0;
+ }
+ if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == pParser->m_SortedOffset.GetSize() - 1) {
+ return 0;
+ }
+ return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset);
+ }
+ return 0;
+}
+FX_BOOL CPDF_DataAvail::IsObjectsAvail(CFX_PtrArray& obj_array, FX_BOOL bParsePage, IFX_DownloadHints* pHints, CFX_PtrArray &ret_array)
+{
+ if (!obj_array.GetSize()) {
+ return TRUE;
+ }
+ FX_DWORD count = 0;
+ CFX_PtrArray new_obj_array;
+ FX_INT32 i = 0;
+ for (i = 0; i < obj_array.GetSize(); i++) {
+ CPDF_Object *pObj = (CPDF_Object *)obj_array[i];
+ if (!pObj) {
+ continue;
+ }
+ FX_INT32 type = pObj->GetType();
+ switch (type) {
+ case PDFOBJ_ARRAY: {
+ CPDF_Array *pArray = pObj->GetArray();
+ for (FX_DWORD k = 0; k < pArray->GetCount(); k++) {
+ new_obj_array.Add(pArray->GetElement(k));
+ }
+ }
+ break;
+ case PDFOBJ_STREAM:
+ pObj = pObj->GetDict();
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary *pDict = pObj->GetDict();
+ if (pDict->GetString("Type") == "Page" && !bParsePage) {
+ continue;
+ }
+ FX_POSITION pos = pDict->GetStartPos();
+ while (pos) {
+ CPDF_Object *value;
+ CFX_ByteString key;
+ value = pDict->GetNextElement(pos, key);
+ if (key != "Parent") {
+ new_obj_array.Add(value);
+ }
+ }
+ }
+ break;
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference *pRef = (CPDF_Reference*)pObj;
+ FX_DWORD dwNum = pRef->GetRefObjNum();
+ FX_FILESIZE offset;
+ FX_DWORD size = GetObjectSize(pRef->GetRefObjNum(), offset);
+ if (!size) {
+ break;
+ }
+ size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
+ if (!m_pFileAvail->IsDataAvail(offset, size)) {
+ pHints->AddSegment(offset, size);
+ ret_array.Add(pObj);
+ count++;
+ } else if (!m_objnum_array.Find(dwNum)) {
+ m_objnum_array.AddObjNum(dwNum);
+ CPDF_Object *pReferred = m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL);
+ if (pReferred) {
+ new_obj_array.Add(pReferred);
+ }
+ }
+ }
+ break;
+ }
+ }
+ if (count > 0) {
+ FX_INT32 iSize = new_obj_array.GetSize();
+ for (i = 0; i < iSize; ++i) {
+ CPDF_Object *pObj = (CPDF_Object *)new_obj_array[i];
+ FX_INT32 type = pObj->GetType();
+ if (type == PDFOBJ_REFERENCE) {
+ CPDF_Reference *pRef = (CPDF_Reference *)pObj;
+ FX_DWORD dwNum = pRef->GetRefObjNum();
+ if (!m_objnum_array.Find(dwNum)) {
+ ret_array.Add(pObj);
+ }
+ } else {
+ ret_array.Add(pObj);
+ }
+ }
+ return FALSE;
+ }
+ obj_array.RemoveAll();
+ obj_array.Append(new_obj_array);
+ return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);
+}
+FX_BOOL CPDF_DataAvail::IsDocAvail(IFX_DownloadHints* pHints)
+{
+ if (!m_dwFileLen && m_pFileRead) {
+ m_dwFileLen = (FX_DWORD)m_pFileRead->GetSize();
+ if (!m_dwFileLen) {
+ return TRUE;
+ }
+ }
+ while (!m_bDocAvail) {
+ if (!CheckDocStatus(pHints)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints)
+{
+ if (!m_objs_array.GetSize()) {
+ m_objs_array.RemoveAll();
+ m_objnum_array.RemoveAll();
+ CFX_PtrArray obj_array;
+ obj_array.Append(m_arrayAcroforms);
+ FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
+ if (bRet) {
+ m_objs_array.RemoveAll();
+ }
+ return bRet;
+ } else {
+ CFX_PtrArray new_objs_array;
+ FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
+ if (bRet) {
+ FX_INT32 iSize = m_arrayAcroforms.GetSize();
+ for (FX_INT32 i = 0; i < iSize; ++i) {
+ ((CPDF_Object *)m_arrayAcroforms.GetAt(i))->Release();
+ }
+ m_arrayAcroforms.RemoveAll();
+ } else {
+ m_objs_array.RemoveAll();
+ m_objs_array.Append(new_objs_array);
+ }
+ return bRet;
+ }
+}
+FX_BOOL CPDF_DataAvail::CheckAcroForm(IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ m_pAcroForm = GetObject(m_dwAcroFormObjNum, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ return TRUE;
+ }
+ if (!m_pAcroForm) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ m_arrayAcroforms.Add(m_pAcroForm);
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckDocStatus(IFX_DownloadHints *pHints)
+{
+ switch (m_docStatus) {
+ case PDF_DATAAVAIL_HEADER:
+ return CheckHeader(pHints);
+ case PDF_DATAAVAIL_FIRSTPAGE:
+ case PDF_DATAAVAIL_FIRSTPAGE_PREPARE:
+ return CheckFirstPage(pHints);
+ case PDF_DATAAVAIL_END:
+ return CheckEnd(pHints);
+ case PDF_DATAAVAIL_CROSSREF:
+ return CheckCrossRef(pHints);
+ case PDF_DATAAVAIL_CROSSREF_ITEM:
+ return CheckCrossRefItem(pHints);
+ case PDF_DATAAVAIL_CROSSREF_STREAM:
+ return CheckAllCrossRefStream(pHints);
+ case PDF_DATAAVAIL_TRAILER:
+ return CheckTrailer(pHints);
+ case PDF_DATAAVAIL_TRAILER_APPEND:
+ return CheckTrailerAppend(pHints);
+ case PDF_DATAAVAIL_LOADALLCRSOSSREF:
+ return LoadAllXref(pHints);
+ case PDF_DATAAVAIL_LOADALLFILE:
+ return LoadAllFile(pHints);
+ case PDF_DATAAVAIL_ROOT:
+ return CheckRoot(pHints);
+ case PDF_DATAAVAIL_INFO:
+ return CheckInfo(pHints);
+ case PDF_DATAAVAIL_ACROFORM:
+ return CheckAcroForm(pHints);
+ case PDF_DATAAVAIL_PAGETREE:
+ if (m_bTotalLoadPageTree) {
+ return CheckPages(pHints);
+ } else {
+ return LoadDocPages(pHints);
+ }
+ case PDF_DATAAVAIL_PAGE:
+ if (m_bTotalLoadPageTree) {
+ return CheckPage(pHints);
+ } else {
+ m_docStatus = PDF_DATAAVAIL_PAGE_LATERLOAD;
+ return TRUE;
+ }
+ case PDF_DATAAVAIL_ERROR:
+ return LoadAllFile(pHints);
+ case PDF_DATAAVAIL_PAGE_LATERLOAD:
+ m_docStatus = PDF_DATAAVAIL_PAGE;
+ default:
+ m_bDocAvail = TRUE;
+ return TRUE;
+ }
+}
+FX_BOOL CPDF_DataAvail::CheckPageStatus(IFX_DownloadHints* pHints)
+{
+ switch (m_docStatus) {
+ case PDF_DATAAVAIL_PAGETREE:
+ return CheckPages(pHints);
+ case PDF_DATAAVAIL_PAGE:
+ return CheckPage(pHints);
+ case PDF_DATAAVAIL_ERROR:
+ return LoadAllFile(pHints);
+ default:
+ m_bPagesTreeLoad = TRUE;
+ m_bPagesLoad = TRUE;
+ return TRUE;
+ }
+}
+FX_BOOL CPDF_DataAvail::LoadAllFile(IFX_DownloadHints* pHints)
+{
+ if (m_pFileAvail->IsDataAvail(0, (FX_DWORD)m_dwFileLen)) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ pHints->AddSegment(0, (FX_DWORD)m_dwFileLen);
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints)
+{
+ m_parser.m_Syntax.InitParser(m_pFileRead, (FX_DWORD)m_dwHeaderOffset);
+ m_parser.m_bOwnFileRead = FALSE;
+ if (!m_parser.LoadAllCrossRefV4(m_dwLastXRefOffset) && !m_parser.LoadAllCrossRefV5(m_dwLastXRefOffset)) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return FALSE;
+ }
+ FXSYS_qsort(m_parser.m_SortedOffset.GetData(), m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), _CompareFileSize);
+ m_dwRootObjNum = m_parser.GetRootObjNum();
+ m_dwInfoObjNum = m_parser.GetInfoObjNum();
+ m_pCurrentParser = &m_parser;
+ m_docStatus = PDF_DATAAVAIL_ROOT;
+ return TRUE;
+}
+CPDF_Object* CPDF_DataAvail::GetObject(FX_DWORD objnum, IFX_DownloadHints* pHints, FX_BOOL *pExistInFile)
+{
+ CPDF_Object *pRet = NULL;
+ if (pExistInFile) {
+ *pExistInFile = TRUE;
+ }
+ if (m_pDocument == NULL) {
+ FX_FILESIZE offset = m_parser.GetObjectOffset(objnum);
+ if (offset < 0) {
+ *pExistInFile = FALSE;
+ return NULL;
+ }
+ FX_DWORD size = (FX_DWORD)m_parser.GetObjectSize(objnum);
+ size = (FX_DWORD)(((FX_FILESIZE)(offset + size + 512)) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
+ if (!m_pFileAvail->IsDataAvail(offset, size)) {
+ pHints->AddSegment(offset, size);
+ return NULL;
+ }
+ pRet = m_parser.ParseIndirectObject(NULL, objnum);
+ if (!pRet && pExistInFile) {
+ *pExistInFile = FALSE;
+ }
+ return pRet;
+ }
+ FX_FILESIZE offset;
+ FX_DWORD size = GetObjectSize(objnum, offset);
+ size = (FX_DWORD)((FX_FILESIZE)(offset + size + 512) > m_dwFileLen ? m_dwFileLen - offset : size + 512);
+ if (!m_pFileAvail->IsDataAvail(offset, size)) {
+ pHints->AddSegment(offset, size);
+ return NULL;
+ }
+ CPDF_Parser *pParser = (CPDF_Parser *)(m_pDocument->GetParser());
+ pRet = pParser->ParseIndirectObject(NULL, objnum, NULL);
+ if (!pRet && pExistInFile) {
+ *pExistInFile = FALSE;
+ }
+ return pRet;
+}
+FX_BOOL CPDF_DataAvail::CheckInfo(IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pInfo = GetObject(m_dwInfoObjNum, pHints, &bExist);
+ if (!bExist) {
+ if (m_bHaveAcroForm) {
+ m_docStatus = PDF_DATAAVAIL_ACROFORM;
+ } else {
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ }
+ return TRUE;
+ }
+ if (!pInfo) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ if (m_Pos == m_dwFileLen) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ }
+ return FALSE;
+ }
+ if (pInfo) {
+ pInfo->Release();
+ }
+ if (m_bHaveAcroForm) {
+ m_docStatus = PDF_DATAAVAIL_ACROFORM;
+ } else {
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckRoot(IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ m_pRoot = GetObject(m_dwRootObjNum, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ if (!m_pRoot) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ CPDF_Reference* pRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("Pages"));
+ if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ m_PagesObjNum = pRef->GetRefObjNum();
+ CPDF_Reference* pAcroFormRef = (CPDF_Reference*)m_pRoot->GetDict()->GetElement(FX_BSTRC("AcroForm"));
+ if (pAcroFormRef && pAcroFormRef->GetType() == PDFOBJ_REFERENCE) {
+ m_bHaveAcroForm = TRUE;
+ m_dwAcroFormObjNum = pAcroFormRef->GetRefObjNum();
+ }
+ if (m_dwInfoObjNum) {
+ m_docStatus = PDF_DATAAVAIL_INFO;
+ } else {
+ if (m_bHaveAcroForm) {
+ m_docStatus = PDF_DATAAVAIL_ACROFORM;
+ } else {
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::PreparePageItem()
+{
+ CPDF_Dictionary *pRoot = m_pDocument->GetRoot();
+ CPDF_Reference* pRef = (CPDF_Reference*)pRoot->GetElement(FX_BSTRC("Pages"));
+ if (pRef == NULL || pRef->GetType() != PDFOBJ_REFERENCE) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ m_PagesObjNum = pRef->GetRefObjNum();
+ m_pCurrentParser = (CPDF_Parser *)m_pDocument->GetParser();
+ m_docStatus = PDF_DATAAVAIL_PAGETREE;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::IsFirstCheck(int iPage)
+{
+ if (NULL == m_pageMapCheckState) {
+ m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();
+ }
+ FX_DWORD dwValue = 0;
+ if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {
+ m_pageMapCheckState->SetAt(iPage, 1);
+ return TRUE;
+ }
+ if (dwValue != 0) {
+ return FALSE;
+ }
+ m_pageMapCheckState->SetAt(iPage, 1);
+ return TRUE;
+}
+void CPDF_DataAvail::ResetFirstCheck(int iPage)
+{
+ if (NULL == m_pageMapCheckState) {
+ m_pageMapCheckState = FX_NEW CFX_CMapDWordToDWord();
+ }
+ FX_DWORD dwValue = 1;
+ if (!m_pageMapCheckState->Lookup(iPage, dwValue)) {
+ return;
+ }
+ m_pageMapCheckState->SetAt(iPage, 0);
+}
+FX_BOOL CPDF_DataAvail::CheckPage(IFX_DownloadHints* pHints)
+{
+ FX_DWORD i = 0;
+ FX_DWORD iLen = m_PageObjList.GetSize();
+ CFX_DWordArray UnavailObjList;
+ for (; i < iLen; ++i) {
+ FX_DWORD dwPageObjNum = m_PageObjList.GetAt(i);
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pObj = GetObject(dwPageObjNum, pHints, &bExist);
+ if (!pObj) {
+ if (bExist) {
+ UnavailObjList.Add(dwPageObjNum);
+ }
+ continue;
+ }
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array *pArray = pObj->GetArray();
+ if (pArray) {
+ FX_INT32 iSize = pArray->GetCount();
+ CPDF_Object *pItem = NULL;
+ for (FX_INT32 j = 0; j < iSize; ++j) {
+ pItem = pArray->GetElement(j);
+ if (pItem && pItem->GetType() == PDFOBJ_REFERENCE) {
+ UnavailObjList.Add(((CPDF_Reference *)pItem)->GetRefObjNum());
+ }
+ }
+ }
+ }
+ if (pObj->GetType() != PDFOBJ_DICTIONARY) {
+ pObj->Release();
+ continue;
+ }
+ CFX_ByteString type = pObj->GetDict()->GetString(FX_BSTRC("Type"));
+ if (type == FX_BSTRC("Pages")) {
+ m_PagesArray.Add(pObj);
+ continue;
+ }
+ pObj->Release();
+ }
+ m_PageObjList.RemoveAll();
+ if (UnavailObjList.GetSize()) {
+ m_PageObjList.Append(UnavailObjList);
+ return FALSE;
+ }
+ i = 0;
+ iLen = m_PagesArray.GetSize();
+ for (; i < iLen; ++i) {
+ CPDF_Object *pPages = (CPDF_Object *)m_PagesArray.GetAt(i);
+ if (!pPages) {
+ continue;
+ }
+ if (!GetPageKids(m_pCurrentParser, pPages)) {
+ pPages->Release();
+ while (i++ < iLen) {
+ pPages = (CPDF_Object *)m_PagesArray.GetAt(i);
+ pPages->Release();
+ }
+ m_PagesArray.RemoveAll();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ pPages->Release();
+ }
+ m_PagesArray.RemoveAll();
+ if (!m_PageObjList.GetSize()) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::GetPageKids(CPDF_Parser *pParser, CPDF_Object *pPages)
+{
+ if (!pParser) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ CPDF_Object *pKids = pPages->GetDict()->GetElement(FX_BSTRC("Kids"));
+ if (!pKids) {
+ return TRUE;
+ }
+ switch (pKids->GetType()) {
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference *pKid = (CPDF_Reference *)pKids;
+ m_PageObjList.Add(pKid->GetRefObjNum());
+ }
+ break;
+ case PDFOBJ_ARRAY: {
+ CPDF_Array *pKidsArray = (CPDF_Array *)pKids;
+ for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {
+ CPDF_Reference *pKid = (CPDF_Reference *)pKidsArray->GetElement(i);
+ m_PageObjList.Add(pKid->GetRefObjNum());
+ }
+ }
+ break;
+ default:
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckPages(IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ if (!pPages) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ FX_BOOL bNeedLoad = FALSE;
+ if (!GetPageKids(m_pCurrentParser, pPages)) {
+ pPages->Release();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ pPages->Release();
+ m_docStatus = PDF_DATAAVAIL_PAGE;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckHeader(IFX_DownloadHints* pHints)
+{
+ FX_DWORD req_size = 1024;
+ if ((FX_FILESIZE)req_size > m_dwFileLen) {
+ req_size = (FX_DWORD)m_dwFileLen;
+ }
+ if (m_pFileAvail->IsDataAvail(0, req_size)) {
+ FX_BYTE buffer[1024];
+ m_pFileRead->ReadBlock(buffer, 0, req_size);
+ if (IsLinearizedFile(buffer, req_size)) {
+ m_docStatus = PDF_DATAAVAIL_FIRSTPAGE;
+ } else {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ return FALSE;
+ }
+ m_docStatus = PDF_DATAAVAIL_END;
+ }
+ return TRUE;
+ }
+ pHints->AddSegment(0, req_size);
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckFirstPage(IFX_DownloadHints *pHints)
+{
+ FX_DWORD dwFirstPageEndOffset = 0;
+ CPDF_Object *pEndOffSet = m_pLinearized->GetDict()->GetElement(FX_BSTRC("E"));
+ if (!pEndOffSet) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ CPDF_Object *pXRefOffset = m_pLinearized->GetDict()->GetElement(FX_BSTRC("T"));
+ if (!pXRefOffset) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ CPDF_Object *pFileLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
+ if (!pFileLen) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ FX_BOOL bNeedDownLoad = FALSE;
+ if (pEndOffSet->GetType() == PDFOBJ_NUMBER) {
+ FX_DWORD dwEnd = pEndOffSet->GetInteger();
+ dwEnd += 512;
+ if ((FX_FILESIZE)dwEnd > m_dwFileLen) {
+ dwEnd = (FX_DWORD)m_dwFileLen;
+ }
+ FX_INT32 iStartPos = (FX_INT32)(m_dwFileLen > 1024 ? 1024 : m_dwFileLen);
+ FX_INT32 iSize = dwEnd > 1024 ? dwEnd - 1024 : 0;
+ if (!m_pFileAvail->IsDataAvail(iStartPos, iSize)) {
+ pHints->AddSegment(iStartPos, iSize);
+ bNeedDownLoad = TRUE;
+ }
+ }
+ m_dwLastXRefOffset = 0;
+ FX_FILESIZE dwFileLen = 0;
+ if (pXRefOffset->GetType() == PDFOBJ_NUMBER) {
+ m_dwLastXRefOffset = pXRefOffset->GetInteger();
+ }
+ if (pFileLen->GetType() == PDFOBJ_NUMBER) {
+ dwFileLen = pFileLen->GetInteger();
+ }
+ if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(dwFileLen - m_dwLastXRefOffset))) {
+ if (m_docStatus == PDF_DATAAVAIL_FIRSTPAGE) {
+ FX_DWORD dwSize = (FX_DWORD)(dwFileLen - m_dwLastXRefOffset);
+ FX_FILESIZE offset = m_dwLastXRefOffset;
+ if (dwSize < 512 && dwFileLen > 512) {
+ dwSize = 512;
+ offset = dwFileLen - 512;
+ }
+ pHints->AddSegment(offset, dwSize);
+ }
+ } else {
+ m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;
+ }
+ if (!bNeedDownLoad && m_docStatus == PDF_DATAAVAIL_FIRSTPAGE_PREPARE) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ m_docStatus = PDF_DATAAVAIL_FIRSTPAGE_PREPARE;
+ return FALSE;
+}
+CPDF_Object * CPDF_DataAvail::ParseIndirectObjectAt(FX_FILESIZE pos, FX_DWORD objnum)
+{
+ FX_FILESIZE SavedPos = m_syntaxParser.SavePos();
+ m_syntaxParser.RestorePos(pos);
+ FX_BOOL bIsNumber;
+ CFX_ByteString word = m_syntaxParser.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ return NULL;
+ }
+ FX_DWORD real_objnum = FXSYS_atoi(word);
+ if (objnum && real_objnum != objnum) {
+ return NULL;
+ }
+ word = m_syntaxParser.GetNextWord(bIsNumber);
+ if (!bIsNumber) {
+ return NULL;
+ }
+ FX_DWORD gennum = FXSYS_atoi(word);
+ if (m_syntaxParser.GetKeyword() != FX_BSTRC("obj")) {
+ m_syntaxParser.RestorePos(SavedPos);
+ return NULL;
+ }
+ CPDF_Object* pObj = m_syntaxParser.GetObject(NULL, objnum, gennum, 0);
+ m_syntaxParser.RestorePos(SavedPos);
+ return pObj;
+}
+FX_INT32 CPDF_DataAvail::IsLinearizedPDF()
+{
+ FX_DWORD req_size = 1024;
+ if (!m_pFileAvail->IsDataAvail(0, req_size)) {
+ return PDF_UNKNOW_LINEARIZED;
+ }
+ if (!m_pFileRead) {
+ return PDF_NOT_LINEARIZED;
+ }
+ FX_FILESIZE dwSize = m_pFileRead->GetSize();
+ if (dwSize < (FX_FILESIZE)req_size) {
+ return PDF_UNKNOW_LINEARIZED;
+ }
+ FX_BYTE buffer[1024];
+ m_pFileRead->ReadBlock(buffer, 0, req_size);
+ if (IsLinearizedFile(buffer, req_size)) {
+ return PDF_IS_LINEARIZED;
+ }
+ return PDF_NOT_LINEARIZED;
+}
+FX_BOOL CPDF_DataAvail::IsLinearizedFile(FX_LPBYTE pData, FX_DWORD dwLen)
+{
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pData, (size_t)dwLen, FALSE));
+ FX_INT32 offset = GetHeaderOffset((IFX_FileStream*)file);
+ if (offset == -1) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ m_dwHeaderOffset = offset;
+ m_syntaxParser.InitParser((IFX_FileStream*)file, offset);
+ m_syntaxParser.RestorePos(m_syntaxParser.m_HeaderOffset + 9);
+ FX_BOOL bNumber = FALSE;
+ FX_FILESIZE dwSavePos = m_syntaxParser.SavePos();
+ CFX_ByteString wordObjNum = m_syntaxParser.GetNextWord(bNumber);
+ if (!bNumber) {
+ return FALSE;
+ }
+ FX_DWORD objnum = FXSYS_atoi(wordObjNum);
+ if (m_pLinearized) {
+ m_pLinearized->Release();
+ m_pLinearized = NULL;
+ }
+ m_pLinearized = ParseIndirectObjectAt(m_syntaxParser.m_HeaderOffset + 9, objnum);
+ if (!m_pLinearized) {
+ return FALSE;
+ }
+ if (m_pLinearized->GetDict()->GetElement(FX_BSTRC("Linearized"))) {
+ CPDF_Object *pLen = m_pLinearized->GetDict()->GetElement(FX_BSTRC("L"));
+ if (!pLen) {
+ return FALSE;
+ }
+ if ((FX_FILESIZE)pLen->GetInteger() != m_pFileRead->GetSize()) {
+ return FALSE;
+ }
+ m_bLinearized = TRUE;
+ CPDF_Object *pNo = m_pLinearized->GetDict()->GetElement(FX_BSTRC("P"));
+ if (pNo && pNo->GetType() == PDFOBJ_NUMBER) {
+ m_dwFirstPageNo = pNo->GetInteger();
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckEnd(IFX_DownloadHints* pHints)
+{
+ FX_DWORD req_pos = (FX_DWORD)(m_dwFileLen > 1024 ? m_dwFileLen - 1024 : 0);
+ FX_DWORD dwSize = (FX_DWORD)(m_dwFileLen - req_pos);
+ if (m_pFileAvail->IsDataAvail(req_pos, dwSize)) {
+ FX_BYTE buffer[1024];
+ m_pFileRead->ReadBlock(buffer, req_pos, dwSize);
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(buffer, (size_t)dwSize, FALSE));
+ m_syntaxParser.InitParser((IFX_FileStream*)file, 0);
+ m_syntaxParser.RestorePos(dwSize - 1);
+ if (m_syntaxParser.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, dwSize)) {
+ FX_BOOL bNumber;
+ m_syntaxParser.GetNextWord(bNumber);
+ CFX_ByteString xrefpos_str = m_syntaxParser.GetNextWord(bNumber);
+ if (!bNumber) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ m_dwXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
+ if (!m_dwXRefOffset || m_dwXRefOffset > m_dwFileLen) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ m_dwLastXRefOffset = m_dwXRefOffset;
+ SetStartOffset(m_dwXRefOffset);
+ m_docStatus = PDF_DATAAVAIL_CROSSREF;
+ return TRUE;
+ } else {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ }
+ pHints->AddSegment(req_pos, dwSize);
+ return FALSE;
+}
+FX_DWORD CPDF_DataAvail::CheckCrossRefStream(IFX_DownloadHints* pHints, FX_FILESIZE &xref_offset)
+{
+ xref_offset = 0;
+ FX_DWORD req_size = (FX_DWORD)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
+ if (m_pFileAvail->IsDataAvail(m_Pos, req_size)) {
+ FX_INT32 iSize = (FX_INT32)(m_Pos + req_size - m_dwCurrentXRefSteam);
+ CFX_BinaryBuf buf(iSize);
+ FX_LPBYTE pBuf = buf.GetBuffer();
+ m_pFileRead->ReadBlock(pBuf, m_dwCurrentXRefSteam, iSize);
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
+ m_parser.m_Syntax.InitParser((IFX_FileStream*)file, 0);
+ FX_BOOL bNumber = FALSE;
+ FX_FILESIZE dwSavePos = m_parser.m_Syntax.SavePos();
+ CFX_ByteString objnum = m_parser.m_Syntax.GetNextWord(bNumber);
+ if (!bNumber) {
+ return -1;
+ }
+ FX_DWORD objNum = FXSYS_atoi(objnum);
+ CPDF_Object *pObj = m_parser.ParseIndirectObjectAt(NULL, 0, objNum, NULL);
+ if (!pObj) {
+ m_Pos += m_parser.m_Syntax.SavePos();
+ return 0;
+ }
+ CPDF_Object *pName = pObj->GetDict()->GetElement(FX_BSTRC("Type"));
+ if (pName && pName->GetType() == PDFOBJ_NAME) {
+ if (pName->GetString() == FX_BSTRC("XRef")) {
+ m_Pos += m_parser.m_Syntax.SavePos();
+ xref_offset = pObj->GetDict()->GetInteger(FX_BSTRC("Prev"));
+ pObj->Release();
+ return 1;
+ } else {
+ pObj->Release();
+ return -1;
+ }
+ }
+ pObj->Release();
+ return -1;
+ }
+ pHints->AddSegment(m_Pos, req_size);
+ return 0;
+}
+inline void CPDF_DataAvail::SetStartOffset(FX_FILESIZE dwOffset)
+{
+ m_Pos = dwOffset;
+}
+#define MAX_WORD_BUFFER 256
+FX_BOOL CPDF_DataAvail::GetNextToken(CFX_ByteString &token)
+{
+ m_WordSize = 0;
+ FX_BYTE ch;
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ FX_BYTE type = _PDF_CharType[ch];
+ while (1) {
+ while (type == 'W') {
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ type = _PDF_CharType[ch];
+ }
+ if (type == 'D') {
+ m_WordBuffer[m_WordSize++] = ch;
+ if (ch == '/') {
+ while (1) {
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ type = _PDF_CharType[ch];
+ if (type != 'R' && type != 'N') {
+ m_Pos --;
+ CFX_ByteString ret(m_WordBuffer, m_WordSize);
+ token = ret;
+ return TRUE;
+ }
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ }
+ } else if (ch == '<') {
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ if (ch == '<') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ } else if (ch == '>') {
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ if (ch == '>') {
+ m_WordBuffer[m_WordSize++] = ch;
+ } else {
+ m_Pos --;
+ }
+ }
+ CFX_ByteString ret(m_WordBuffer, m_WordSize);
+ token = ret;
+ return TRUE;
+ }
+ while (1) {
+ if (m_WordSize < MAX_WORD_BUFFER) {
+ m_WordBuffer[m_WordSize++] = ch;
+ }
+ if (!GetNextChar(ch)) {
+ return FALSE;
+ }
+ type = _PDF_CharType[ch];
+ if (type == 'D' || type == 'W') {
+ m_Pos --;
+ break;
+ }
+ }
+ CFX_ByteString ret(m_WordBuffer, m_WordSize);
+ token = ret;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::GetNextChar(FX_BYTE &ch)
+{
+ FX_FILESIZE pos = m_Pos;
+ if (pos >= m_dwFileLen) {
+ return FALSE;
+ }
+ if (m_bufferOffset >= pos || (FX_FILESIZE)(m_bufferOffset + m_bufferSize) <= pos) {
+ FX_FILESIZE read_pos = pos;
+ FX_DWORD read_size = 512;
+ if ((FX_FILESIZE)read_size > m_dwFileLen) {
+ read_size = (FX_DWORD)m_dwFileLen;
+ }
+ if ((FX_FILESIZE)(read_pos + read_size) > m_dwFileLen) {
+ read_pos = m_dwFileLen - read_size;
+ }
+ if (!m_pFileRead->ReadBlock(m_bufferData, read_pos, read_size)) {
+ return FALSE;
+ }
+ m_bufferOffset = read_pos;
+ m_bufferSize = read_size;
+ }
+ ch = m_bufferData[pos - m_bufferOffset];
+ m_Pos ++;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckCrossRefItem(IFX_DownloadHints *pHints)
+{
+ FX_INT32 iSize = 0;
+ CFX_ByteString token;
+ while (1) {
+ if (!GetNextToken(token)) {
+ iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
+ pHints->AddSegment(m_Pos, iSize);
+ return FALSE;
+ }
+ if (token == "trailer") {
+ m_dwTrailerOffset = m_Pos;
+ m_docStatus = PDF_DATAAVAIL_TRAILER;
+ return TRUE;
+ }
+ }
+}
+FX_BOOL CPDF_DataAvail::CheckAllCrossRefStream(IFX_DownloadHints *pHints)
+{
+ FX_FILESIZE xref_offset = 0;
+ FX_DWORD dwRet = CheckCrossRefStream(pHints, xref_offset);
+ if (dwRet == 1) {
+ if (!xref_offset) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;
+ } else {
+ m_dwCurrentXRefSteam = xref_offset;
+ m_Pos = xref_offset;
+ }
+ return TRUE;
+ } else if (dwRet == -1) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints)
+{
+ FX_FILESIZE dwSavePos = m_Pos;
+ FX_INT32 iSize = 0;
+ CFX_ByteString token;
+ if (!GetNextToken(token)) {
+ iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
+ pHints->AddSegment(m_Pos, iSize);
+ return FALSE;
+ }
+ if (token == "xref") {
+ m_CrossOffset.InsertAt(0, m_dwXRefOffset);
+ while (1) {
+ if (!GetNextToken(token)) {
+ iSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
+ pHints->AddSegment(m_Pos, iSize);
+ m_docStatus = PDF_DATAAVAIL_CROSSREF_ITEM;
+ return FALSE;
+ }
+ if (token == "trailer") {
+ m_dwTrailerOffset = m_Pos;
+ m_docStatus = PDF_DATAAVAIL_TRAILER;
+ return TRUE;
+ }
+ }
+ } else {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckTrailerAppend(IFX_DownloadHints* pHints)
+{
+ if (m_Pos < m_dwFileLen) {
+ FX_FILESIZE dwAppendPos = m_Pos + m_syntaxParser.SavePos();
+ FX_INT32 iSize = (FX_INT32)(dwAppendPos + 512 > m_dwFileLen ? m_dwFileLen - dwAppendPos : 512);
+ if (!m_pFileAvail->IsDataAvail(dwAppendPos, iSize)) {
+ pHints->AddSegment(dwAppendPos, iSize);
+ return FALSE;
+ }
+ }
+ if (m_dwPrevXRefOffset) {
+ SetStartOffset(m_dwPrevXRefOffset);
+ m_docStatus = PDF_DATAAVAIL_CROSSREF;
+ } else {
+ m_docStatus = PDF_DATAAVAIL_LOADALLCRSOSSREF;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckTrailer(IFX_DownloadHints* pHints)
+{
+ FX_INT32 iTrailerSize = (FX_INT32)(m_Pos + 512 > m_dwFileLen ? m_dwFileLen - m_Pos : 512);
+ if (m_pFileAvail->IsDataAvail(m_Pos, iTrailerSize)) {
+ FX_INT32 iSize = (FX_INT32)(m_Pos + iTrailerSize - m_dwTrailerOffset);
+ CFX_BinaryBuf buf(iSize);
+ FX_LPBYTE pBuf = buf.GetBuffer();
+ if (!pBuf) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ if (!m_pFileRead->ReadBlock(pBuf, m_dwTrailerOffset, iSize)) {
+ return FALSE;
+ }
+ CFX_SmartPointer<IFX_FileStream> file(FX_CreateMemoryStream(pBuf, (size_t)iSize, FALSE));
+ m_syntaxParser.InitParser((IFX_FileStream*)file, 0);
+ CPDF_Object *pTrailer = m_syntaxParser.GetObject(NULL, 0, 0, 0);
+ if (!pTrailer) {
+ m_Pos += m_syntaxParser.SavePos();
+ pHints->AddSegment(m_Pos, iTrailerSize);
+ return FALSE;
+ }
+ CPDF_Dictionary *pTrailerDict = pTrailer->GetDict();
+ if (pTrailerDict) {
+ CPDF_Object *pEncrypt = pTrailerDict->GetElement("Encrypt");
+ if (pEncrypt && pEncrypt->GetType() == PDFOBJ_REFERENCE) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ pTrailer->Release();
+ return TRUE;
+ }
+ }
+ FX_DWORD xrefpos = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("Prev"));
+ if (xrefpos) {
+ m_dwPrevXRefOffset = GetDirectInteger(pTrailer->GetDict(), FX_BSTRC("XRefStm"));
+ pTrailer->Release();
+ if (m_dwPrevXRefOffset) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ } else {
+ m_dwPrevXRefOffset = xrefpos;
+ if (m_dwPrevXRefOffset >= m_dwFileLen) {
+ m_docStatus = PDF_DATAAVAIL_LOADALLFILE;
+ } else {
+ SetStartOffset(m_dwPrevXRefOffset);
+ m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;
+ }
+ }
+ return TRUE;
+ } else {
+ m_dwPrevXRefOffset = 0;
+ m_docStatus = PDF_DATAAVAIL_TRAILER_APPEND;
+ pTrailer->Release();
+ }
+ return TRUE;
+ }
+ pHints->AddSegment(m_Pos, iTrailerSize);
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
+{
+ while (TRUE) {
+ switch (m_docStatus) {
+ case PDF_DATAAVAIL_PAGETREE:
+ if (!LoadDocPages(pHints)) {
+ return FALSE;
+ }
+ break;
+ case PDF_DATAAVAIL_PAGE:
+ if (!LoadDocPage(iPage, pHints)) {
+ return FALSE;
+ }
+ break;
+ case PDF_DATAAVAIL_ERROR:
+ return LoadAllFile(pHints);
+ default:
+ m_bPagesTreeLoad = TRUE;
+ m_bPagesLoad = TRUE;
+ m_bCurPageDictLoadOK = TRUE;
+ m_docStatus = PDF_DATAAVAIL_PAGE;
+ return TRUE;
+ }
+ }
+}
+FX_BOOL CPDF_DataAvail::CheckArrayPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pPages = GetObject(dwPageNo, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ if (!pPages) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ return FALSE;
+ }
+ if (pPages->GetType() != PDFOBJ_ARRAY) {
+ pPages->Release();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ pPageNode->m_type = PDF_PAGENODE_PAGES;
+ CPDF_Array* pArray = (CPDF_Array*)pPages;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); ++i) {
+ CPDF_Object *pKid = (CPDF_Object *)pArray->GetElement(i);
+ if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {
+ continue;
+ }
+ CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
+ pPageNode->m_childNode.Add(pNode);
+ pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();
+ }
+ pPages->Release();
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckUnkownPageNode(FX_DWORD dwPageNo, CPDF_PageNode *pPageNode, IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pPage = GetObject(dwPageNo, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ if (!pPage) {
+ if (m_docStatus == PDF_DATAAVAIL_ERROR) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ return FALSE;
+ }
+ if (pPage->GetType() == PDFOBJ_ARRAY) {
+ pPageNode->m_dwPageNo = dwPageNo;
+ pPageNode->m_type = PDF_PAGENODE_ARRAY;
+ pPage->Release();
+ return TRUE;
+ }
+ if (pPage->GetType() != PDFOBJ_DICTIONARY) {
+ pPage->Release();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ pPageNode->m_dwPageNo = dwPageNo;
+ CFX_ByteString type = pPage->GetDict()->GetString(FX_BSTRC("Type"));
+ if (type == FX_BSTRC("Pages")) {
+ pPageNode->m_type = PDF_PAGENODE_PAGES;
+ CPDF_Object *pKids = pPage->GetDict()->GetElement(FX_BSTRC("Kids"));
+ if (!pKids) {
+ m_docStatus = PDF_DATAAVAIL_PAGE;
+ return TRUE;
+ }
+ switch (pKids->GetType()) {
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference *pKid = (CPDF_Reference *)pKids;
+ CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
+ pPageNode->m_childNode.Add(pNode);
+ pNode->m_dwPageNo = pKid->GetRefObjNum();
+ }
+ break;
+ case PDFOBJ_ARRAY: {
+ CPDF_Array *pKidsArray = (CPDF_Array *)pKids;
+ for (FX_DWORD i = 0; i < pKidsArray->GetCount(); ++i) {
+ CPDF_Object *pKid = (CPDF_Object *)pKidsArray->GetElement(i);
+ if (!pKid || pKid->GetType() != PDFOBJ_REFERENCE) {
+ continue;
+ }
+ CPDF_PageNode *pNode = FX_NEW CPDF_PageNode();
+ pPageNode->m_childNode.Add(pNode);
+ pNode->m_dwPageNo = ((CPDF_Reference*)pKid)->GetRefObjNum();
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ } else if (type == FX_BSTRC("Page")) {
+ pPageNode->m_type = PDF_PAGENODE_PAGE;
+ } else {
+ pPage->Release();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ pPage->Release();
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckPageNode(CPDF_PageNode &pageNodes, FX_INT32 iPage, FX_INT32 &iCount, IFX_DownloadHints* pHints)
+{
+ FX_INT32 iSize = pageNodes.m_childNode.GetSize();
+ if (!iSize) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ for (FX_INT32 i = 0; i < iSize; ++i) {
+ CPDF_PageNode *pNode = (CPDF_PageNode*)pageNodes.m_childNode.GetAt(i);
+ if (!pNode) {
+ continue;
+ }
+ switch (pNode->m_type) {
+ case PDF_PAGENODE_UNKOWN:
+ if (!CheckUnkownPageNode(pNode->m_dwPageNo, pNode, pHints)) {
+ return FALSE;
+ }
+ --i;
+ break;
+ case PDF_PAGENODE_PAGE:
+ iCount++;
+ if (iPage == iCount && m_pDocument) {
+ m_pDocument->m_PageList.SetAt(iPage, pNode->m_dwPageNo);
+ }
+ break;
+ case PDF_PAGENODE_PAGES:
+ if (!CheckPageNode(*pNode, iPage, iCount, pHints)) {
+ return FALSE;
+ }
+ break;
+ case PDF_PAGENODE_ARRAY:
+ if (!CheckArrayPageNode(pNode->m_dwPageNo, pNode, pHints)) {
+ return FALSE;
+ }
+ --i;
+ break;
+ }
+ if (iPage == iCount) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::LoadDocPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
+{
+ if (m_pDocument->GetPageCount() <= iPage || m_pDocument->m_PageList.GetAt(iPage)) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ if (m_pageNodes.m_type == PDF_PAGENODE_PAGE) {
+ if (iPage == 0) {
+ m_docStatus = PDF_DATAAVAIL_DONE;
+ return TRUE;
+ }
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return TRUE;
+ }
+ FX_INT32 iCount = -1;
+ return CheckPageNode(m_pageNodes, iPage, iCount, pHints);
+}
+FX_BOOL CPDF_DataAvail::CheckPageCount(IFX_DownloadHints* pHints)
+{
+ FX_BOOL bExist = FALSE;
+ CPDF_Object *pPages = GetObject(m_PagesObjNum, pHints, &bExist);
+ if (!bExist) {
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ if (!pPages) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pPagesDict = pPages->GetDict();
+ if (!pPagesDict) {
+ pPages->Release();
+ m_docStatus = PDF_DATAAVAIL_ERROR;
+ return FALSE;
+ }
+ if (!pPagesDict->KeyExist(FX_BSTRC("Kids"))) {
+ pPages->Release();
+ return TRUE;
+ }
+ int count = pPagesDict->GetInteger(FX_BSTRC("Count"));
+ if (count > 0) {
+ pPages->Release();
+ return TRUE;
+ }
+ pPages->Release();
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::LoadDocPages(IFX_DownloadHints* pHints)
+{
+ if (!CheckUnkownPageNode(m_PagesObjNum, &m_pageNodes, pHints)) {
+ return FALSE;
+ }
+ if (CheckPageCount(pHints)) {
+ m_docStatus = PDF_DATAAVAIL_PAGE;
+ return TRUE;
+ } else {
+ m_bTotalLoadPageTree = TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::LoadPages(IFX_DownloadHints* pHints)
+{
+ while (!m_bPagesTreeLoad) {
+ if (!CheckPageStatus(pHints)) {
+ return FALSE;
+ }
+ }
+ if (m_bPagesLoad) {
+ return TRUE;
+ }
+ m_pDocument->LoadPages();
+ return FALSE;
+}
+FX_BOOL CPDF_DataAvail::CheckLinearizedData(IFX_DownloadHints* pHints)
+{
+ if (m_bLinearedDataOK) {
+ return TRUE;
+ }
+ if (!m_pFileAvail->IsDataAvail(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset))) {
+ pHints->AddSegment(m_dwLastXRefOffset, (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset));
+ return FALSE;
+ }
+ FX_DWORD dwRet = 0;
+ if (!m_bMainXRefLoad) {
+ dwRet = ((CPDF_Parser *)m_pDocument->GetParser())->LoadLinearizedMainXRefTable();
+ if (dwRet == PDFPARSE_ERROR_SUCCESS) {
+ if (!PreparePageItem()) {
+ return FALSE;
+ }
+ m_bMainXRefLoadedOK = TRUE;
+ }
+ m_bMainXRefLoad = TRUE;
+ }
+ m_bLinearedDataOK = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckPageAnnots(FX_INT32 iPage, IFX_DownloadHints* pHints)
+{
+ if (!m_objs_array.GetSize()) {
+ m_objs_array.RemoveAll();
+ m_objnum_array.RemoveAll();
+ CPDF_Dictionary *pPageDict = m_pDocument->GetPage(iPage);
+ if (!pPageDict) {
+ return TRUE;
+ }
+ CPDF_Object *pAnnots = pPageDict->GetElement(FX_BSTRC("Annots"));
+ if (!pAnnots) {
+ return TRUE;
+ }
+ CFX_PtrArray obj_array;
+ obj_array.Add(pAnnots);
+ FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
+ if (bRet) {
+ m_objs_array.RemoveAll();
+ }
+ return bRet;
+ } else {
+ CFX_PtrArray new_objs_array;
+ FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
+ m_objs_array.RemoveAll();
+ if (!bRet) {
+ m_objs_array.Append(new_objs_array);
+ }
+ return bRet;
+ }
+}
+FX_BOOL CPDF_DataAvail::CheckLinearizedFirstPage(FX_INT32 iPage, IFX_DownloadHints* pHints)
+{
+ if (!m_bAnnotsLoad) {
+ if (!CheckPageAnnots(iPage, pHints)) {
+ return FALSE;
+ }
+ m_bAnnotsLoad = TRUE;
+ }
+ if (m_bAnnotsLoad)
+ if (!CheckLinearizedData(pHints)) {
+ return FALSE;
+ }
+ m_bPageLoadedOK = FALSE;
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::HaveResourceAncestor(CPDF_Dictionary *pDict)
+{
+ CPDF_Object *pParent = pDict->GetElement("Parent");
+ if (!pParent) {
+ return FALSE;
+ }
+ CPDF_Dictionary *pParentDict = pParent->GetDict();
+ if (!pParentDict) {
+ return FALSE;
+ }
+ CPDF_Object *pRet = pParentDict->GetElement("Resource");
+ if (pRet) {
+ m_pPageResource = pRet;
+ return TRUE;
+ } else {
+ return HaveResourceAncestor(pParentDict);
+ }
+}
+FX_BOOL CPDF_DataAvail::IsPageAvail(FX_INT32 iPage, IFX_DownloadHints* pHints)
+{
+ if (!m_pDocument) {
+ return FALSE;
+ }
+ if (IsFirstCheck(iPage)) {
+ m_bCurPageDictLoadOK = FALSE;
+ m_bPageLoadedOK = FALSE;
+ m_bAnnotsLoad = FALSE;
+ m_bNeedDownLoadResource = FALSE;
+ m_objs_array.RemoveAll();
+ m_objnum_array.RemoveAll();
+ }
+ if (m_pagesLoadState == NULL) {
+ m_pagesLoadState = FX_NEW CFX_CMapDWordToDWord();
+ }
+ FX_DWORD dwPageLoad = 0;
+ if (m_pagesLoadState->Lookup(iPage, dwPageLoad) && dwPageLoad != 0) {
+ return TRUE;
+ }
+ if (m_bLinearized) {
+ if ((FX_DWORD)iPage == m_dwFirstPageNo) {
+ m_pagesLoadState->SetAt(iPage, TRUE);
+ return TRUE;
+ }
+ if (!CheckLinearizedData(pHints)) {
+ return FALSE;
+ }
+ if (m_bMainXRefLoadedOK) {
+ if (m_bTotalLoadPageTree) {
+ if (!LoadPages(pHints)) {
+ return FALSE;
+ }
+ } else {
+ if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {
+ return FALSE;
+ }
+ }
+ } else {
+ if (!LoadAllFile(pHints)) {
+ return FALSE;
+ }
+ ((CPDF_Parser *)m_pDocument->GetParser())->RebuildCrossRef();
+ ResetFirstCheck(iPage);
+ return TRUE;
+ }
+ } else {
+ if (!m_bTotalLoadPageTree) {
+ if (!m_bCurPageDictLoadOK && !CheckPage(iPage, pHints)) {
+ return FALSE;
+ }
+ }
+ }
+ if (m_bHaveAcroForm && !m_bAcroFormLoad) {
+ if (!CheckAcroFormSubObject(pHints)) {
+ return FALSE;
+ }
+ m_bAcroFormLoad = TRUE;
+ }
+ if (!m_bPageLoadedOK) {
+ if (!m_objs_array.GetSize()) {
+ m_objs_array.RemoveAll();
+ m_objnum_array.RemoveAll();
+ m_pPageDict = m_pDocument->GetPage(iPage);
+ if (!m_pPageDict) {
+ ResetFirstCheck(iPage);
+ return TRUE;
+ }
+ CFX_PtrArray obj_array;
+ obj_array.Add(m_pPageDict);
+ FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
+ if (bRet) {
+ m_objs_array.RemoveAll();
+ m_bPageLoadedOK = TRUE;
+ } else {
+ return bRet;
+ }
+ } else {
+ CFX_PtrArray new_objs_array;
+ FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
+ m_objs_array.RemoveAll();
+ if (bRet) {
+ m_bPageLoadedOK = TRUE;
+ } else {
+ m_objs_array.Append(new_objs_array);
+ return bRet;
+ }
+ }
+ }
+ if (m_bPageLoadedOK) {
+ if (!m_bAnnotsLoad) {
+ if (!CheckPageAnnots(iPage, pHints)) {
+ return FALSE;
+ }
+ m_bAnnotsLoad = TRUE;
+ }
+ }
+ if (m_pPageDict && !m_bNeedDownLoadResource) {
+ CPDF_Object *pRes = m_pPageDict->GetElement("Resource");
+ if (!pRes) {
+ m_bNeedDownLoadResource = HaveResourceAncestor(m_pPageDict);
+ }
+ m_bNeedDownLoadResource = FALSE;
+ }
+ if (m_bNeedDownLoadResource) {
+ FX_BOOL bRet = CheckResources(pHints);
+ if (!bRet) {
+ return FALSE;
+ }
+ m_bNeedDownLoadResource = FALSE;
+ }
+ m_bPageLoadedOK = FALSE;
+ m_bAnnotsLoad = FALSE;
+ m_bCurPageDictLoadOK = FALSE;
+ ResetFirstCheck(iPage);
+ m_pagesLoadState->SetAt(iPage, TRUE);
+ return TRUE;
+}
+FX_BOOL CPDF_DataAvail::CheckResources(IFX_DownloadHints* pHints)
+{
+ if (!m_objs_array.GetSize()) {
+ m_objs_array.RemoveAll();
+ CFX_PtrArray obj_array;
+ obj_array.Add(m_pPageResource);
+ FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
+ if (bRet) {
+ m_objs_array.RemoveAll();
+ }
+ return bRet;
+ } else {
+ CFX_PtrArray new_objs_array;
+ FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
+ m_objs_array.RemoveAll();
+ if (!bRet) {
+ m_objs_array.Append(new_objs_array);
+ }
+ return bRet;
+ }
+}
+void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE *pPos, FX_DWORD *pSize)
+{
+ if (pPos) {
+ *pPos = m_dwLastXRefOffset;
+ }
+ if (pSize) {
+ *pSize = (FX_DWORD)(m_dwFileLen - m_dwLastXRefOffset);
+ }
+}
+FX_INT32 CPDF_DataAvail::IsFormAvail(IFX_DownloadHints *pHints)
+{
+ if (!m_pDocument) {
+ return PDFFORM_AVAIL;
+ }
+ if (!m_bLinearizedFormParamLoad) {
+ CPDF_Dictionary *pRoot = m_pDocument->GetRoot();
+ if (!pRoot) {
+ return PDFFORM_AVAIL;
+ }
+ CPDF_Object *pAcroForm = pRoot->GetElement(FX_BSTRC("AcroForm"));
+ if (!pAcroForm) {
+ return PDFFORM_NOTEXIST;
+ }
+ if (!m_bMainXRefLoad && !CheckLinearizedData(pHints)) {
+ return PDFFORM_NOTAVAIL;
+ }
+ if (!m_objs_array.GetSize()) {
+ m_objs_array.Add(pAcroForm->GetDict());
+ }
+ m_bLinearizedFormParamLoad = TRUE;
+ }
+ CFX_PtrArray new_objs_array;
+ FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
+ m_objs_array.RemoveAll();
+ if (!bRet) {
+ m_objs_array.Append(new_objs_array);
+ return PDFFORM_NOTAVAIL;
+ }
+ return PDFFORM_AVAIL;
+}
+void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum)
+{
+ FX_INT32 iNext = 0;
+ if (BinarySearch(dwObjNum, iNext)) {
+ return;
+ }
+ m_number_array.InsertAt(iNext, dwObjNum);
+}
+FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum)
+{
+ FX_INT32 iNext = 0;
+ return BinarySearch(dwObjNum, iNext);
+}
+FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, FX_INT32 &iNext)
+{
+ FX_INT32 iLen = m_number_array.GetSize();
+ FX_INT32 iLow = 0;
+ FX_INT32 iHigh = iLen - 1;
+ FX_INT32 iMid = 0;
+ while (iLow <= iHigh) {
+ iMid = (iLow + iHigh) / 2;
+ FX_DWORD tt = m_number_array.GetAt(iMid);
+ if (m_number_array.GetAt(iMid) == value) {
+ iNext = iMid;
+ return TRUE;
+ } else if (m_number_array.GetAt(iMid) > value) {
+ iHigh = iMid - 1;
+ } else if (m_number_array.GetAt(iMid) < value) {
+ iLow = iMid + 1;
+ }
+ }
+ iNext = iLow;
+ return FALSE;
+}
+CPDF_PageNode::~CPDF_PageNode()
+{
+ FX_INT32 iSize = m_childNode.GetSize();
+ for (FX_INT32 i = 0; i < iSize; ++i) {
+ CPDF_PageNode *pNode = (CPDF_PageNode*)m_childNode[i];
+ if (pNode) {
+ delete pNode;
+ }
+ }
+ m_childNode.RemoveAll();
+}
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
new file mode 100644
index 0000000000..cc3d29c9ed
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
@@ -0,0 +1,453 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_parser.h"
+extern const FX_LPCSTR _PDF_CharType =
+ "WRRRRRRRRWWRWWRRRRRRRRRRRRRRRRRR"
+ "WRRRRDRRDDRNRNNDNNNNNNNNNNRRDRDR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRDRDRR"
+ "WRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"
+ "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRW";
+#ifndef MAX_PATH
+#define MAX_PATH 4096
+#endif
+CPDF_SimpleParser::CPDF_SimpleParser(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pData = pData;
+ m_dwSize = dwSize;
+ m_dwCurPos = 0;
+}
+CPDF_SimpleParser::CPDF_SimpleParser(FX_BSTR str)
+{
+ m_pData = str;
+ m_dwSize = str.GetLength();
+ m_dwCurPos = 0;
+}
+void CPDF_SimpleParser::ParseWord(FX_LPCBYTE& pStart, FX_DWORD& dwSize, int& type)
+{
+ pStart = NULL;
+ dwSize = 0;
+ type = PDFWORD_EOF;
+ FX_BYTE ch;
+ char chartype;
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ while (chartype == 'W') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ }
+ if (ch != '%') {
+ break;
+ }
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '\r' || ch == '\n') {
+ break;
+ }
+ }
+ chartype = _PDF_CharType[ch];
+ }
+ FX_DWORD start_pos = m_dwCurPos - 1;
+ pStart = m_pData + start_pos;
+ if (chartype == 'D') {
+ if (ch == '/') {
+ while (1) {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ if (chartype != 'R' && chartype != 'N') {
+ m_dwCurPos --;
+ dwSize = m_dwCurPos - start_pos;
+ type = PDFWORD_NAME;
+ return;
+ }
+ }
+ } else {
+ type = PDFWORD_DELIMITER;
+ dwSize = 1;
+ if (ch == '<') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '<') {
+ dwSize = 2;
+ } else {
+ m_dwCurPos --;
+ }
+ } else if (ch == '>') {
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ if (ch == '>') {
+ dwSize = 2;
+ } else {
+ m_dwCurPos --;
+ }
+ }
+ }
+ return;
+ }
+ type = PDFWORD_NUMBER;
+ dwSize = 1;
+ while (1) {
+ if (chartype != 'N') {
+ type = PDFWORD_TEXT;
+ }
+ if (m_dwSize <= m_dwCurPos) {
+ return;
+ }
+ ch = m_pData[m_dwCurPos++];
+ chartype = _PDF_CharType[ch];
+ if (chartype == 'D' || chartype == 'W') {
+ m_dwCurPos --;
+ break;
+ }
+ dwSize ++;
+ }
+}
+CFX_ByteStringC CPDF_SimpleParser::GetWord()
+{
+ FX_LPCBYTE pStart;
+ FX_DWORD dwSize;
+ int type;
+ ParseWord(pStart, dwSize, type);
+ if (dwSize == 1 && pStart[0] == '<') {
+ while (m_dwCurPos < m_dwSize && m_pData[m_dwCurPos] != '>') {
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos ++;
+ }
+ return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
+ } else if (dwSize == 1 && pStart[0] == '(') {
+ int level = 1;
+ while (m_dwCurPos < m_dwSize) {
+ if (m_pData[m_dwCurPos] == ')') {
+ level --;
+ if (level == 0) {
+ break;
+ }
+ }
+ if (m_pData[m_dwCurPos] == '\\') {
+ if (m_dwSize <= m_dwCurPos) {
+ break;
+ }
+ m_dwCurPos ++;
+ } else if (m_pData[m_dwCurPos] == '(') {
+ level ++;
+ }
+ if (m_dwSize <= m_dwCurPos) {
+ break;
+ }
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos ++;
+ }
+ return CFX_ByteStringC(pStart, (FX_STRSIZE)(m_dwCurPos - (pStart - m_pData)));
+ }
+ return CFX_ByteStringC(pStart, dwSize);
+}
+FX_BOOL CPDF_SimpleParser::SearchToken(FX_BSTR token)
+{
+ int token_len = token.GetLength();
+ while (m_dwCurPos < m_dwSize - token_len) {
+ if (FXSYS_memcmp32(m_pData + m_dwCurPos, token, token_len) == 0) {
+ break;
+ }
+ m_dwCurPos ++;
+ }
+ if (m_dwCurPos == m_dwSize - token_len) {
+ return FALSE;
+ }
+ m_dwCurPos += token_len;
+ return TRUE;
+}
+FX_BOOL CPDF_SimpleParser::SkipWord(FX_BSTR token)
+{
+ while (1) {
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == token) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_SimpleParser::FindTagPair(FX_BSTR start_token, FX_BSTR end_token,
+ FX_DWORD& start_pos, FX_DWORD& end_pos)
+{
+ if (!start_token.IsEmpty()) {
+ if (!SkipWord(start_token)) {
+ return FALSE;
+ }
+ start_pos = m_dwCurPos;
+ }
+ while (1) {
+ end_pos = m_dwCurPos;
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ return FALSE;
+ }
+ if (word == end_token) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_SimpleParser::FindTagParam(FX_BSTR token, int nParams)
+{
+ nParams ++;
+ FX_DWORD* pBuf = FX_Alloc(FX_DWORD, nParams);
+ int buf_index = 0;
+ int buf_count = 0;
+ while (1) {
+ pBuf[buf_index++] = m_dwCurPos;
+ if (buf_index == nParams) {
+ buf_index = 0;
+ }
+ buf_count ++;
+ if (buf_count > nParams) {
+ buf_count = nParams;
+ }
+ CFX_ByteStringC word = GetWord();
+ if (word.IsEmpty()) {
+ FX_Free(pBuf);
+ return FALSE;
+ }
+ if (word == token) {
+ if (buf_count < nParams) {
+ continue;
+ }
+ m_dwCurPos = pBuf[buf_index];
+ FX_Free(pBuf);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static int _hex2dec(char ch)
+{
+ if (ch >= '0' && ch <= '9') {
+ return ch - '0';
+ }
+ if (ch >= 'a' && ch <= 'f') {
+ return ch - 'a' + 10;
+ }
+ if (ch >= 'A' && ch <= 'F') {
+ return ch - 'A' + 10;
+ }
+ return 0;
+}
+CFX_ByteString PDF_NameDecode(FX_BSTR bstr)
+{
+ int size = bstr.GetLength();
+ FX_LPCSTR pSrc = bstr.GetCStr();
+ if (FXSYS_memchr(pSrc, '#', size) == NULL) {
+ return bstr;
+ }
+ CFX_ByteString result;
+ FX_LPSTR pDestStart = result.GetBuffer(size);
+ FX_LPSTR pDest = pDestStart;
+ for (int i = 0; i < size; i ++) {
+ if (pSrc[i] == '#' && i < size - 2) {
+ *pDest ++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
+ i += 2;
+ } else {
+ *pDest ++ = pSrc[i];
+ }
+ }
+ result.ReleaseBuffer((FX_STRSIZE)(pDest - pDestStart));
+ return result;
+}
+CFX_ByteString PDF_NameDecode(const CFX_ByteString& orig)
+{
+ if (FXSYS_memchr((FX_LPCSTR)orig, '#', orig.GetLength()) == NULL) {
+ return orig;
+ }
+ return PDF_NameDecode(CFX_ByteStringC(orig));
+}
+CFX_ByteString PDF_NameEncode(const CFX_ByteString& orig)
+{
+ FX_LPBYTE src_buf = (FX_LPBYTE)(FX_LPCSTR)orig;
+ int src_len = orig.GetLength();
+ int dest_len = 0;
+ int i;
+ for (i = 0; i < src_len; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
+ _PDF_CharType[ch] == 'D') {
+ dest_len += 3;
+ } else {
+ dest_len ++;
+ }
+ }
+ if (dest_len == src_len) {
+ return orig;
+ }
+ CFX_ByteString res;
+ FX_LPSTR dest_buf = res.GetBuffer(dest_len);
+ dest_len = 0;
+ for (i = 0; i < src_len; i ++) {
+ FX_BYTE ch = src_buf[i];
+ if (ch >= 0x80 || _PDF_CharType[ch] == 'W' || ch == '#' ||
+ _PDF_CharType[ch] == 'D') {
+ dest_buf[dest_len++] = '#';
+ dest_buf[dest_len++] = "0123456789ABCDEF"[ch / 16];
+ dest_buf[dest_len++] = "0123456789ABCDEF"[ch % 16];
+ } else {
+ dest_buf[dest_len++] = ch;
+ }
+ }
+ dest_buf[dest_len] = 0;
+ res.ReleaseBuffer();
+ return res;
+}
+CFX_ByteTextBuf& operator << (CFX_ByteTextBuf& buf, const CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ buf << FX_BSTRC(" null");
+ return buf;
+ }
+ switch (pObj->GetType()) {
+ case PDFOBJ_NULL:
+ buf << FX_BSTRC(" null");
+ break;
+ case PDFOBJ_BOOLEAN:
+ case PDFOBJ_NUMBER:
+ buf << " " << pObj->GetString();
+ break;
+ case PDFOBJ_STRING: {
+ CFX_ByteString str = pObj->GetString();
+ FX_BOOL bHex = ((CPDF_String*)pObj)->IsHex();
+ buf << PDF_EncodeString(str, bHex);
+ break;
+ }
+ case PDFOBJ_NAME: {
+ CFX_ByteString str = pObj->GetString();
+ buf << FX_BSTRC("/") << PDF_NameEncode(str);
+ break;
+ }
+ case PDFOBJ_REFERENCE: {
+ CPDF_Reference* p = (CPDF_Reference*)pObj;
+ buf << " " << p->GetRefObjNum() << FX_BSTRC(" 0 R ");
+ break;
+ }
+ case PDFOBJ_ARRAY: {
+ CPDF_Array* p = (CPDF_Array*)pObj;
+ buf << FX_BSTRC("[");
+ for (FX_DWORD i = 0; i < p->GetCount(); i ++) {
+ CPDF_Object* pElement = p->GetElement(i);
+ if (pElement->GetObjNum()) {
+ buf << " " << pElement->GetObjNum() << FX_BSTRC(" 0 R");
+ } else {
+ buf << pElement;
+ }
+ }
+ buf << FX_BSTRC("]");
+ break;
+ }
+ case PDFOBJ_DICTIONARY: {
+ CPDF_Dictionary* p = (CPDF_Dictionary*)pObj;
+ buf << FX_BSTRC("<<");
+ FX_POSITION pos = p->GetStartPos();
+ while (pos) {
+ CFX_ByteString key;
+ CPDF_Object* pValue = p->GetNextElement(pos, key);
+ buf << FX_BSTRC("/") << PDF_NameEncode(key);
+ if (pValue->GetObjNum()) {
+ buf << " " << pValue->GetObjNum() << FX_BSTRC(" 0 R ");
+ } else {
+ buf << pValue;
+ }
+ }
+ buf << FX_BSTRC(">>");
+ break;
+ }
+ case PDFOBJ_STREAM: {
+ CPDF_Stream* p = (CPDF_Stream*)pObj;
+ buf << p->GetDict() << FX_BSTRC("stream\r\n");
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(p, TRUE);
+ buf.AppendBlock(acc.GetData(), acc.GetSize());
+ buf << FX_BSTRC("\r\nendstream");
+ break;
+ }
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+ return buf;
+}
+FX_FLOAT PDF_ClipFloat(FX_FLOAT f)
+{
+ if (f < 0) {
+ return 0;
+ }
+ if (f > 1.0f) {
+ return 1.0f;
+ }
+ return f;
+}
+static CPDF_Object* SearchNumberNode(CPDF_Dictionary* pNode, int num)
+{
+ CPDF_Array* pLimits = pNode->GetArray("Limits");
+ if (pLimits && (num < pLimits->GetInteger(0) || num > pLimits->GetInteger(1))) {
+ return NULL;
+ }
+ CPDF_Array* pNumbers = pNode->GetArray("Nums");
+ if (pNumbers) {
+ FX_DWORD dwCount = pNumbers->GetCount() / 2;
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ int index = pNumbers->GetInteger(i * 2);
+ if (num == index) {
+ return pNumbers->GetElementValue(i * 2 + 1);
+ }
+ if (index > num) {
+ break;
+ }
+ }
+ return NULL;
+ }
+ CPDF_Array* pKids = pNode->GetArray("Kids");
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNumberNode(pKid, num);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_NumberTree::LookupValue(int num)
+{
+ return SearchNumberNode(m_pRoot, num);
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
new file mode 100644
index 0000000000..0be25e3a79
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -0,0 +1,1488 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../fpdf_page/pageint.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "render_int.h"
+CPDF_DocRenderData::CPDF_DocRenderData(CPDF_Document* pPDFDoc)
+ : m_pPDFDoc(pPDFDoc)
+ , m_pFontCache(NULL)
+{
+}
+CPDF_DocRenderData::~CPDF_DocRenderData()
+{
+ Clear(TRUE);
+}
+void CPDF_DocRenderData::Clear(FX_BOOL bRelease)
+{
+ FX_POSITION pos;
+ {
+ pos = m_Type3FaceMap.GetStartPosition();
+ while (pos) {
+ CPDF_Font* pFont;
+ CPDF_CountedObject<CPDF_Type3Cache*>* cache;
+ m_Type3FaceMap.GetNextAssoc(pos, pFont, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_Type3FaceMap.RemoveKey(pFont);
+ }
+ }
+ }
+#ifndef _FPDFAPI_MINI_
+ {
+ pos = m_TransferFuncMap.GetStartPosition();
+ while (pos) {
+ CPDF_Object* key;
+ CPDF_CountedObject<CPDF_TransferFunc*>* value;
+ m_TransferFuncMap.GetNextAssoc(pos, key, value);
+ if (bRelease || value->m_nCount < 2) {
+ delete value->m_Obj;
+ delete value;
+ m_TransferFuncMap.RemoveKey(key);
+ }
+ }
+ }
+#endif
+ if (m_pFontCache) {
+ if (bRelease) {
+ delete m_pFontCache;
+ m_pFontCache = NULL;
+ } else {
+ m_pFontCache->FreeCache(FALSE);
+ }
+ }
+}
+FX_BOOL CPDF_DocRenderData::Initialize()
+{
+ m_pFontCache = FX_NEW CFX_FontCache;
+ return TRUE;
+}
+CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont)
+{
+ CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
+ if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
+ CPDF_Type3Cache* pType3 = FX_NEW CPDF_Type3Cache(pFont);
+ pCache = FX_NEW CPDF_CountedObject<CPDF_Type3Cache*>;
+ pCache->m_Obj = pType3;
+ pCache->m_nCount = 1;
+ m_Type3FaceMap.SetAt(pFont, pCache);
+ }
+ pCache->m_nCount++;
+ return pCache->m_Obj;
+}
+void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont)
+{
+ CPDF_CountedObject<CPDF_Type3Cache*>* pCache;
+ if (!m_Type3FaceMap.Lookup(pFont, pCache)) {
+ return;
+ }
+ pCache->m_nCount--;
+}
+class CPDF_RenderModule : public CPDF_RenderModuleDef
+{
+public:
+ virtual ~CPDF_RenderModule() {}
+ virtual FX_BOOL Installed()
+ {
+ return TRUE;
+ }
+ virtual CPDF_DocRenderData* CreateDocData(CPDF_Document* pDoc);
+ virtual void DestroyDocData(CPDF_DocRenderData* p);
+ virtual void ClearDocData(CPDF_DocRenderData* p);
+ virtual CPDF_DocRenderData* GetRenderData()
+ {
+ return &m_RenderData;
+ }
+ virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage)
+ {
+ return FX_NEW CPDF_PageRenderCache(pPage);
+ }
+ virtual void DestroyPageCache(CPDF_PageRenderCache* pCache);
+ virtual CPDF_RenderConfig* GetConfig()
+ {
+ return &m_RenderConfig;
+ }
+private:
+ CPDF_DocRenderData m_RenderData;
+ CPDF_RenderConfig m_RenderConfig;
+};
+CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc)
+{
+ CPDF_DocRenderData* pData = FX_NEW CPDF_DocRenderData(pDoc);
+ pData->Initialize();
+ return pData;
+}
+void CPDF_RenderModule::DestroyDocData(CPDF_DocRenderData* pDocData)
+{
+ delete pDocData;
+}
+void CPDF_RenderModule::ClearDocData(CPDF_DocRenderData* p)
+{
+ if (p) {
+ p->Clear(FALSE);
+ }
+}
+void CPDF_RenderModule::DestroyPageCache(CPDF_PageRenderCache* pCache)
+{
+ delete pCache;
+}
+void CPDF_ModuleMgr::InitRenderModule()
+{
+ if (m_pRenderModule) {
+ delete m_pRenderModule;
+ }
+ m_pRenderModule = FX_NEW CPDF_RenderModule;
+}
+CPDF_RenderOptions::CPDF_RenderOptions()
+ : m_ColorMode(RENDER_COLOR_NORMAL)
+ , m_Flags(RENDER_CLEARTYPE)
+ , m_Interpolation(0)
+ , m_AddFlags(0)
+ , m_pOCContext(NULL)
+ , m_dwLimitCacheSize(1024 * 1024 * 100)
+ , m_HalftoneLimit(-1)
+{
+#if defined(_FPDFAPI_MINI_)
+ m_Flags |= RENDER_LIMITEDIMAGECACHE;
+#endif
+}
+FX_ARGB CPDF_RenderOptions::TranslateColor(FX_ARGB argb) const
+{
+ if (m_ColorMode == RENDER_COLOR_NORMAL) {
+ return argb;
+ }
+ if (m_ColorMode == RENDER_COLOR_ALPHA) {
+ return argb;
+ }
+ int a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ int gray = FXRGB2GRAY(r, g, b);
+ if (m_ColorMode == RENDER_COLOR_TWOCOLOR) {
+ int color = (r - gray) * (r - gray) + (g - gray) * (g - gray) + (b - gray) * (b - gray);
+ if (gray < 35 && color < 20) {
+ return ArgbEncode(a, m_ForeColor);
+ }
+ if (gray > 221 && color < 20) {
+ return ArgbEncode(a, m_BackColor);
+ }
+ return argb;
+ }
+ int fr = FXSYS_GetRValue(m_ForeColor);
+ int fg = FXSYS_GetGValue(m_ForeColor);
+ int fb = FXSYS_GetBValue(m_ForeColor);
+ int br = FXSYS_GetRValue(m_BackColor);
+ int bg = FXSYS_GetGValue(m_BackColor);
+ int bb = FXSYS_GetBValue(m_BackColor);
+ r = (br - fr) * gray / 255 + fr;
+ g = (bg - fg) * gray / 255 + fg;
+ b = (bb - fb) * gray / 255 + fb;
+ return ArgbEncode(a, r, g, b);
+}
+CPDF_RenderStatus::CPDF_RenderStatus()
+{
+ m_pContext = NULL;
+ m_bStopped = FALSE;
+ m_Level = 0;
+ m_pDevice = NULL;
+ m_pCurObj = NULL;
+ m_pStopObj = NULL;
+ m_HalftoneLimit = 0;
+ m_pObjectRenderer = NULL;
+ m_bPrint = FALSE;
+ m_Transparency = 0;
+ m_DitherBits = 0;
+ m_bDropObjects = FALSE;
+ m_bStdCS = FALSE;
+ m_GroupFamily = 0;
+ m_bLoadMask = FALSE;
+ m_pType3Char = NULL;
+ m_T3FillColor = 0;
+ m_pFormResource = NULL;
+ m_pPageResource = NULL;
+ m_curBlend = FXDIB_BLEND_NORMAL;
+}
+CPDF_RenderStatus::~CPDF_RenderStatus()
+{
+ if (m_pObjectRenderer) {
+ delete m_pObjectRenderer;
+ }
+}
+FX_BOOL CPDF_RenderStatus::Initialize(int level, CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
+ const CFX_AffineMatrix* pDeviceMatrix, const CPDF_PageObject* pStopObj,
+ const CPDF_RenderStatus* pParentState, const CPDF_GraphicStates* pInitialStates,
+ const CPDF_RenderOptions* pOptions, int transparency, FX_BOOL bDropObjects,
+ CPDF_Dictionary* pFormResource, FX_BOOL bStdCS, CPDF_Type3Char* pType3Char,
+ FX_ARGB fill_color, FX_DWORD GroupFamily,
+ FX_BOOL bLoadMask)
+{
+ m_Level = level;
+ m_pContext = pContext;
+ m_pDevice = pDevice;
+ m_DitherBits = pDevice->GetDeviceCaps(FXDC_DITHER_BITS);
+ m_bPrint = m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
+ if (pDeviceMatrix) {
+ m_DeviceMatrix = *pDeviceMatrix;
+ }
+ m_pStopObj = pStopObj;
+ if (pOptions) {
+ m_Options = *pOptions;
+ }
+ m_bDropObjects = bDropObjects;
+ m_bStdCS = bStdCS;
+ m_T3FillColor = fill_color;
+ m_pType3Char = pType3Char;
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ m_pFormResource = pFormResource;
+ m_pPageResource = m_pContext->m_pPageResources;
+ if (pInitialStates && !m_pType3Char) {
+ m_InitialStates.CopyStates(*pInitialStates);
+ if (pParentState) {
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ CPDF_ColorStateData* pParentData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pParentState->m_InitialStates.m_ColorState;
+ if (!pColorData || pColorData->m_FillColor.IsNull()) {
+ CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+ pData->m_FillRGB = pParentData->m_FillRGB;
+ pData->m_FillColor.Copy(&pParentData->m_FillColor);
+ }
+ if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
+ CPDF_ColorStateData* pData = m_InitialStates.m_ColorState.GetModify();
+ pData->m_StrokeRGB = pParentData->m_FillRGB;
+ pData->m_StrokeColor.Copy(&pParentData->m_StrokeColor);
+ }
+ }
+ } else {
+ m_InitialStates.DefaultStates();
+ }
+#if defined(_FPDFAPI_MINI_)||defined(_FXCORE_LIMITED_CPU_)
+ m_HalftoneLimit = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_HalftoneLimit;
+ if (pOptions && pOptions->m_HalftoneLimit >= 0) {
+ m_HalftoneLimit = pOptions->m_HalftoneLimit;
+ }
+#endif
+ m_pObjectRenderer = NULL;
+ m_Transparency = transparency;
+ return TRUE;
+}
+void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device)
+{
+ if (m_Level > 32) {
+ return;
+ }
+ CFX_FloatRect clip_rect = m_pDevice->GetClipBox();
+ CFX_AffineMatrix device2object;
+ device2object.SetReverse(*pObj2Device);
+ device2object.TransformRect(clip_rect);
+ int index = 0;
+ FX_POSITION pos = pObjs->GetFirstObjectPosition();
+ while(pos) {
+ index ++;
+ CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos);
+ if (pCurObj == m_pStopObj) {
+ m_bStopped = TRUE;
+ return;
+ }
+ if (!pCurObj) {
+ continue;
+ }
+ if(pCurObj == NULL || pCurObj->m_Left > clip_rect.right || pCurObj->m_Right < clip_rect.left ||
+ pCurObj->m_Bottom > clip_rect.top || pCurObj->m_Top < clip_rect.bottom) {
+ continue;
+ }
+ RenderSingleObject(pCurObj, pObj2Device);
+ if (m_bStopped) {
+ return;
+ }
+ }
+}
+void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ if (m_Level > 32) {
+ return;
+ }
+ m_pCurObj = pObj;
+ if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
+ if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
+ return;
+ }
+ ProcessClipPath(pObj->m_ClipPath, pObj2Device);
+ if (ProcessTransparency(pObj, pObj2Device)) {
+ return;
+ }
+ ProcessObjectNoClip(pObj, pObj2Device);
+}
+FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause)
+{
+ if (m_pObjectRenderer) {
+ if (m_pObjectRenderer->Continue(pPause)) {
+ return TRUE;
+ }
+ if (!m_pObjectRenderer->m_Result) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pObj, pObj2Device);
+ }
+#endif
+ delete m_pObjectRenderer;
+ m_pObjectRenderer = NULL;
+ return FALSE;
+ }
+ m_pCurObj = pObj;
+ if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull())
+ if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) {
+ return FALSE;
+ }
+ ProcessClipPath(pObj->m_ClipPath, pObj2Device);
+ if (ProcessTransparency(pObj, pObj2Device)) {
+ return FALSE;
+ }
+ if (pObj->m_Type == PDFPAGE_IMAGE) {
+ m_pObjectRenderer = IPDF_ObjectRenderer::Create(pObj->m_Type);
+ if (!m_pObjectRenderer->Start(this, pObj, pObj2Device, FALSE)) {
+ if (!m_pObjectRenderer->m_Result) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pObj, pObj2Device);
+ }
+#endif
+ delete m_pObjectRenderer;
+ m_pObjectRenderer = NULL;
+ return FALSE;
+ }
+ return ContinueSingleObject(pObj, pObj2Device, pPause);
+ }
+ ProcessObjectNoClip(pObj, pObj2Device);
+ return FALSE;
+}
+IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type)
+{
+ IPDF_ObjectRenderer* pRenderer = NULL;
+ if (type == PDFPAGE_IMAGE) {
+ pRenderer = FX_NEW CPDF_ImageRenderer;
+ }
+ return pRenderer;
+}
+FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const
+{
+ rect = pObj->GetBBox(pObj2Device);
+ FX_RECT rtClip = m_pDevice->GetClipBox();
+ if (!bLogical) {
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT a = FXSYS_fabs(dCTM.a);
+ FX_FLOAT d = FXSYS_fabs(dCTM.d);
+ if (a != 1.0f || d != 1.0f) {
+ rect.right = rect.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Width() * a);
+ rect.bottom = rect.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rect.Height() * d);
+ rtClip.right = rtClip.left + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a);
+ rtClip.bottom = rtClip.top + (FX_INT32)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d);
+ }
+ }
+ rect.Intersect(rtClip);
+ return rect.IsEmpty();
+}
+void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();
+ if (pBitmap == NULL) {
+ return;
+ }
+ FX_RECT rect;
+ if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
+ return;
+ }
+ if (m_DitherBits == 2) {
+ static FX_ARGB pal[4] = {0, 85, 170, 255};
+ pBitmap->DitherFS(pal, 4, &rect);
+ } else if (m_DitherBits == 3) {
+ static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255};
+ pBitmap->DitherFS(pal, 8, &rect);
+ } else if (m_DitherBits == 4) {
+ static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255};
+ pBitmap->DitherFS(pal, 16, &rect);
+ }
+}
+void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_BOOL bRet = FALSE;
+ switch (pObj->m_Type) {
+ case PDFPAGE_TEXT:
+ bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL);
+ break;
+ case PDFPAGE_PATH:
+ bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_IMAGE:
+ bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_SHADING:
+ bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_FORM:
+ bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
+ break;
+#if defined(_FPDFAPI_MINI_)
+ case PDFPAGE_INLINES:
+ bRet = ProcessInlines((CPDF_InlineImages*)pObj, pObj2Device);
+ break;
+#endif
+ }
+ if (!bRet) {
+ DrawObjWithBackground(pObj, pObj2Device);
+ }
+}
+FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_BOOL bRet = FALSE;
+ switch (pObj->m_Type) {
+ case PDFPAGE_PATH:
+ bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device);
+ break;
+ case PDFPAGE_IMAGE:
+ bRet = ProcessImage((CPDF_ImageObject *)pObj, pObj2Device);
+ break;
+ case PDFPAGE_FORM:
+ bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device);
+ break;
+ }
+ return bRet;
+}
+void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix &matrix) const
+{
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ matrix.a *= FXSYS_fabs(dCTM.a);
+ matrix.d *= FXSYS_fabs(dCTM.d);
+}
+void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device)
+{
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ FX_RECT rect;
+ if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
+ return;
+ }
+ int res = 300;
+ if (pObj->m_Type == PDFPAGE_IMAGE && m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
+ res = 0;
+ }
+ CPDF_ScaledRenderBuffer buffer;
+ if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {
+ return;
+ }
+ CFX_AffineMatrix matrix = *pObj2Device;
+ matrix.Concat(*buffer.GetMatrix());
+ GetScaledMatrix(matrix);
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pObj->m_Type == PDFPAGE_FORM) {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;
+ if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
+ pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ }
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, pFormResource);
+ status.RenderSingleObject(pObj, &matrix);
+ buffer.OutputToDevice();
+#endif
+}
+FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC"));
+ if (pOC && m_Options.m_pOCContext && !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;
+ matrix.Concat(*pObj2Device);
+ CPDF_Dictionary* pResources = NULL;
+ if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
+ pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, m_pStopObj,
+ this, pFormObj, &m_Options, m_Transparency, m_bDropObjects, pResources, TRUE);
+ status.m_curBlend = m_curBlend;
+ m_pDevice->SaveState();
+ status.RenderObjectList(pFormObj->m_pForm, &matrix);
+ m_bStopped = status.m_bStopped;
+ m_pDevice->RestoreState();
+ return TRUE;
+}
+FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix)
+{
+ if (matrix.a == 0 || matrix.d == 0) {
+ return matrix.b != 0 && matrix.c != 0;
+ }
+ if (matrix.b == 0 || matrix.c == 0) {
+ return matrix.a != 0 && matrix.d != 0;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device)
+{
+ int FillType = pPathObj->m_FillType;
+ FX_BOOL bStroke = pPathObj->m_bStroke;
+ ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);
+ if (FillType == 0 && !bStroke) {
+ return TRUE;
+ }
+ FX_DWORD fill_argb = 0;
+ if (FillType) {
+ fill_argb = GetFillArgb(pPathObj);
+ }
+ FX_DWORD stroke_argb = 0;
+ if (bStroke) {
+ stroke_argb = GetStrokeArgb(pPathObj);
+ }
+ CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
+ path_matrix.Concat(*pObj2Device);
+ if (!IsAvailableMatrix(path_matrix)) {
+ return TRUE;
+ }
+ if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) {
+ FillType |= FXFILL_RECT_AA;
+ }
+ if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) {
+ FillType |= FXFILL_FULLCOVER;
+ }
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ FillType |= FXFILL_NOPATHSMOOTH;
+ }
+ if (bStroke) {
+ FillType |= FX_FILL_STROKE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)pPathObj)->m_GeneralState;
+ if (pGeneralData && pGeneralData->m_StrokeAdjust) {
+ FillType |= FX_STROKE_ADJUST;
+ }
+#endif
+ if (m_pType3Char) {
+ FillType |= FX_FILL_TEXT_MODE;
+ }
+ CFX_GraphStateData graphState(*pPathObj->m_GraphState);
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ graphState.m_LineWidth = 0;
+ }
+ return m_pDevice->DrawPath(pPathObj->m_Path, &path_matrix, &graphState, fill_argb, stroke_argb, FillType, 0, NULL, m_curBlend);
+}
+CPDF_TransferFunc* CPDF_RenderStatus::GetTransferFunc(CPDF_Object* pObj) const
+{
+ ASSERT(pObj != NULL);
+ CPDF_DocRenderData* pDocCache = m_pContext->m_pDocument->GetRenderData();
+ if (!pDocCache) {
+ return NULL;
+ }
+ return pDocCache->GetTransferFunc(pObj);
+}
+FX_ARGB CPDF_RenderStatus::GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3) const
+{
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
+ if (m_pType3Char && !bType3 && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_FillColor.IsNull())))) {
+ return m_T3FillColor;
+ } else if (!pColorData || pColorData->m_FillColor.IsNull()) {
+ pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ }
+ FX_COLORREF rgb = pColorData->m_FillRGB;
+ if (rgb == (FX_DWORD) - 1) {
+ return 0;
+ }
+ const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
+ int alpha;
+ if (pGeneralData) {
+ alpha = (FX_INT32)(pGeneralData->m_FillAlpha * 255);
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralData->m_pTR) {
+ if (!pGeneralData->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
+ }
+ if (pGeneralData->m_pTransferFunc) {
+ rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
+ }
+ }
+#endif
+ } else {
+ alpha = 255;
+ }
+ return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
+}
+FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const
+{
+ CPDF_ColorStateData* pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)pObj->m_ColorState;
+ if (m_pType3Char && (!m_pType3Char->m_bColored || (m_pType3Char->m_bColored && (!pColorData || pColorData->m_StrokeColor.IsNull())))) {
+ return m_T3FillColor;
+ } else if (!pColorData || pColorData->m_StrokeColor.IsNull()) {
+ pColorData = (CPDF_ColorStateData*)(const CPDF_ColorStateData*)m_InitialStates.m_ColorState;
+ }
+ FX_COLORREF rgb = pColorData->m_StrokeRGB;
+ if (rgb == (FX_DWORD) - 1) {
+ return 0;
+ }
+ const CPDF_GeneralStateData* pGeneralData = pObj->m_GeneralState;
+ int alpha;
+ if (pGeneralData) {
+ alpha = (FX_INT32)(pGeneralData->m_StrokeAlpha * 255);
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralData->m_pTR) {
+ if (!pGeneralData->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralData)->m_pTransferFunc = GetTransferFunc(pGeneralData->m_pTR);
+ }
+ if (pGeneralData->m_pTransferFunc) {
+ rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb);
+ }
+ }
+#endif
+ } else {
+ alpha = 255;
+ }
+ return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
+}
+void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
+{
+ if (ClipPath.IsNull()) {
+ if (m_LastClipPath.IsNull()) {
+ return;
+ }
+ m_pDevice->RestoreState(TRUE);
+ m_LastClipPath.SetNull();
+ return;
+ }
+ if (m_LastClipPath == ClipPath) {
+ return;
+ }
+ m_LastClipPath = ClipPath;
+ m_pDevice->RestoreState(TRUE);
+ int nClipPath = ClipPath.GetPathCount();
+ int i;
+ for (i = 0; i < nClipPath; i++) {
+ const CFX_PathData* pPathData = ClipPath.GetPath(i);
+ if (pPathData == NULL) {
+ continue;
+ }
+ if (pPathData->GetPointCount() == 0) {
+ CFX_PathData EmptyPath;
+ EmptyPath.AppendRect(-1, -1, 0, 0);
+ int fill_mode = FXFILL_WINDING;
+ m_pDevice->SetClip_PathFill(&EmptyPath, NULL, fill_mode);
+ } else {
+ int ClipType = ClipPath.GetClipType(i);
+ m_pDevice->SetClip_PathFill(pPathData, pObj2Device, ClipType);
+ }
+ }
+ int textcount = ClipPath.GetTextCount();
+ if (textcount == 0) {
+ return;
+ }
+ if (m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
+ return;
+ }
+ CFX_PathData* pTextClippingPath = NULL;
+ for (i = 0; i < textcount; i ++) {
+ CPDF_TextObject* pText = ClipPath.GetText(i);
+ if (pText == NULL) {
+ if (pTextClippingPath) {
+ int fill_mode = FXFILL_WINDING;
+ if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ m_pDevice->SetClip_PathFill(pTextClippingPath, NULL, fill_mode);
+ delete pTextClippingPath;
+ pTextClippingPath = NULL;
+ }
+ } else {
+ if (pTextClippingPath == NULL) {
+ pTextClippingPath = FX_NEW CFX_PathData;
+ }
+ ProcessText(pText, pObj2Device, pTextClippingPath);
+ }
+ }
+ if (pTextClippingPath) {
+ delete pTextClippingPath;
+ }
+}
+void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device)
+{
+ if (ClipPath.IsNull()) {
+ return;
+ }
+ int fill_mode = 0;
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ int nClipPath = ClipPath.GetPathCount();
+ int i;
+ for (i = 0; i < nClipPath; i++) {
+ const CFX_PathData* pPathData = ClipPath.GetPath(i);
+ if (pPathData == NULL) {
+ continue;
+ }
+ CFX_GraphStateData stroke_state;
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ stroke_state.m_LineWidth = 0;
+ }
+ m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, fill_mode);
+ }
+}
+FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
+ path_matrix.Concat(*pObj2Device);
+ if (bStroke) {
+ CFX_GraphStateData graphState(*pPathObj->m_GraphState);
+ if (m_Options.m_Flags & RENDER_THINLINE) {
+ graphState.m_LineWidth = 0;
+ }
+ return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, &graphState);
+ }
+ int fill_mode = pPathObj->m_FillType;
+ if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) {
+ fill_mode |= FXFILL_NOPATHSMOOTH;
+ }
+ return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);
+}
+FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device)
+{
+ const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
+ int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
+ if (blend_type == FXDIB_BLEND_UNSUPPORTED) {
+ return TRUE;
+ }
+ CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ if (pSMaskDict) {
+ if (pPageObj->m_Type == PDFPAGE_IMAGE &&
+ ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDict()->KeyExist(FX_BSTRC("SMask"))) {
+ pSMaskDict = NULL;
+ }
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ FX_FLOAT group_alpha = 1.0f;
+ int Transparency = m_Transparency;
+ FX_BOOL bGroupTransparent = FALSE;
+ if (pPageObj->m_Type == PDFPAGE_FORM) {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ const CPDF_GeneralStateData *pStateData = pFormObj->m_GeneralState.GetObject();
+ if (pStateData) {
+ group_alpha = pStateData->m_FillAlpha;
+ }
+ Transparency = pFormObj->m_pForm->m_Transparency;
+ bGroupTransparent = Transparency & PDFTRANS_ISOLATED ? TRUE : FALSE;
+ if (pFormObj->m_pForm->m_pFormDict) {
+ pFormResource = pFormObj->m_pForm->m_pFormDict->GetDict("Resources");
+ }
+ }
+ FX_BOOL bTextClip = FALSE;
+ if (pPageObj->m_ClipPath.NotNull() && pPageObj->m_ClipPath.GetTextCount() &&
+ m_pDevice->GetDeviceClass() == FXDC_DISPLAY && !(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP)) {
+ bTextClip = TRUE;
+ }
+ if ((m_Options.m_Flags & RENDER_OVERPRINT) && pPageObj->m_Type == PDFPAGE_IMAGE && pGeneralState && pGeneralState->m_FillOP && pGeneralState->m_StrokeOP) {
+ CPDF_Document* pDocument = NULL;
+ CPDF_Page* pPage = NULL;
+ if (m_pContext->m_pPageCache) {
+ pPage = m_pContext->m_pPageCache->GetPage();
+ pDocument = pPage->m_pDocument;
+ } else {
+ pDocument = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetDocument();
+ }
+ CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
+ CPDF_Object* pCSObj = ((CPDF_ImageObject*)pPageObj)->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
+ CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
+ if (pColorSpace) {
+ int format = pColorSpace->GetFamily();
+ if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
+ blend_type = FXDIB_BLEND_DARKEN;
+ }
+ pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+ if (pSMaskDict == NULL && group_alpha == 1.0f && blend_type == FXDIB_BLEND_NORMAL && !bTextClip && !bGroupTransparent) {
+ return FALSE;
+ }
+ FX_BOOL isolated = Transparency & PDFTRANS_ISOLATED;
+ if (m_bPrint) {
+ FX_BOOL bRet = FALSE;
+ int rendCaps = m_pDevice->GetRenderCaps();
+ if (!((Transparency & PDFTRANS_ISOLATED) || pSMaskDict || bTextClip) && (rendCaps & FXRC_BLEND_MODE)) {
+ int oldBlend = m_curBlend;
+ m_curBlend = blend_type;
+ bRet = DrawObjWithBlend(pPageObj, pObj2Device);
+ m_curBlend = oldBlend;
+ }
+ if (!bRet) {
+ DrawObjWithBackground(pPageObj, pObj2Device);
+ }
+ return TRUE;
+ }
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ rect.Intersect(m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ CFX_Matrix deviceCTM = m_pDevice->GetCTM();
+ FX_FLOAT scaleX = FXSYS_abs(deviceCTM.a);
+ FX_FLOAT scaleY = FXSYS_abs(deviceCTM.d);
+ int width = FXSYS_round((FX_FLOAT)rect.Width() * scaleX);
+ int height = FXSYS_round((FX_FLOAT)rect.Height() * scaleY);
+ CFX_FxgeDevice bitmap_device;
+ CFX_DIBitmap* oriDevice = NULL;
+ if (!isolated && (m_pDevice->GetRenderCaps() & FXRC_GET_BITS)) {
+ oriDevice = FX_NEW CFX_DIBitmap;
+ if (!m_pDevice->CreateCompatibleBitmap(oriDevice, width, height)) {
+ return TRUE;
+ }
+ m_pDevice->GetDIBits(oriDevice, rect.left, rect.top);
+ }
+ if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
+ bitmap->Clear(0);
+ CFX_AffineMatrix new_matrix = *pObj2Device;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ new_matrix.Scale(scaleX, scaleY);
+ CFX_DIBitmap* pTextMask = NULL;
+ if (bTextClip) {
+ pTextMask = FX_NEW CFX_DIBitmap;
+ if (!pTextMask->Create(width, height, FXDIB_8bppMask)) {
+ delete pTextMask;
+ return TRUE;
+ }
+ pTextMask->Clear(0);
+ CFX_FxgeDevice text_device;
+ text_device.Attach(pTextMask);
+ for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i ++) {
+ CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i);
+ if (textobj == NULL) {
+ break;
+ }
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ CPDF_TextRenderer::DrawTextPath(&text_device, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos,
+ textobj->m_TextState.GetFont(), textobj->m_TextState.GetFontSize(),
+ &text_matrix, &new_matrix, textobj->m_GraphState, (FX_ARGB) - 1, 0, NULL);
+ }
+ }
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL,
+ m_pStopObj, NULL, NULL, &m_Options, 0, m_bDropObjects, pFormResource, TRUE);
+ bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);
+ m_bStopped = bitmap_render.m_bStopped;
+ if (pSMaskDict) {
+ CFX_AffineMatrix smask_matrix;
+ FXSYS_memcpy32(&smask_matrix, pGeneralState->m_SMaskMatrix, sizeof smask_matrix);
+ smask_matrix.Concat(*pObj2Device);
+ CFX_DIBSource* pSMaskSource = LoadSMask(pSMaskDict, &rect, &smask_matrix);
+ if (pSMaskSource) {
+ bitmap->MultiplyAlpha(pSMaskSource);
+ delete pSMaskSource;
+ }
+ }
+ if (pTextMask) {
+ bitmap->MultiplyAlpha(pTextMask);
+ delete pTextMask;
+ pTextMask = NULL;
+ }
+ if (Transparency & PDFTRANS_GROUP && group_alpha != 1.0f) {
+ bitmap->MultiplyAlpha((FX_INT32)(group_alpha * 255));
+ }
+ Transparency = m_Transparency;
+ if (pPageObj->m_Type == PDFPAGE_FORM) {
+ Transparency |= PDFTRANS_GROUP;
+ }
+ CompositeDIBitmap(bitmap, rect.left, rect.top, 0, 255, blend_type, Transparency);
+ if (oriDevice) {
+ delete oriDevice;
+ }
+ return TRUE;
+}
+CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
+ FX_BOOL bBackAlphaRequired)
+{
+ FX_RECT bbox = rect;
+ bbox.Intersect(m_pDevice->GetClipBox());
+ left = bbox.left;
+ top = bbox.top;
+ CFX_Matrix deviceCTM = m_pDevice->GetCTM();
+ FX_FLOAT scaleX = FXSYS_abs(deviceCTM.a);
+ FX_FLOAT scaleY = FXSYS_abs(deviceCTM.d);
+ int width = FXSYS_round(bbox.Width() * scaleX);
+ int height = FXSYS_round(bbox.Height() * scaleY);
+ CFX_DIBitmap* pBackdrop = FX_NEW CFX_DIBitmap;
+ if (bBackAlphaRequired && !m_bDropObjects) {
+ pBackdrop->Create(width, height, FXDIB_Argb);
+ } else {
+ m_pDevice->CreateCompatibleBitmap(pBackdrop, width, height);
+ }
+ if (pBackdrop->GetBuffer() == NULL) {
+ delete pBackdrop;
+ return NULL;
+ }
+ FX_BOOL bNeedDraw;
+ if (pBackdrop->HasAlpha()) {
+ bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT);
+ } else {
+ bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS);
+ }
+ if (!bNeedDraw) {
+ m_pDevice->GetDIBits(pBackdrop, left, top);
+ return pBackdrop;
+ }
+ CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;
+ FinalMatrix.TranslateI(-left, -top);
+ FinalMatrix.Scale(scaleX, scaleY);
+ pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
+ CFX_FxgeDevice device;
+ device.Attach(pBackdrop);
+ m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix);
+ return pBackdrop;
+}
+void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, const CPDF_PageObject* pObj,
+ const CPDF_RenderOptions* pOptions, CFX_AffineMatrix* pFinalMatrix)
+{
+ CFX_FxgeDevice device;
+ device.Attach(pBuffer);
+ if (m_pBackgroundDraw) {
+ m_pBackgroundDraw->OnDrawBackground(&device, pFinalMatrix);
+ } else {
+ FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());
+ device.FillRect(&rect, 0xffffffff);
+ }
+ Render(&device, pObj, pOptions, pFinalMatrix);
+}
+CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates(const CPDF_GraphicStates* pSrcStates, FX_BOOL bStroke)
+{
+ if (!pSrcStates) {
+ return NULL;
+ }
+ CPDF_GraphicStates* pStates = FX_NEW CPDF_GraphicStates;
+ if (!pStates) {
+ return NULL;
+ }
+ pStates->CopyStates(*pSrcStates);
+ CPDF_Color* pObjColor = bStroke ? pSrcStates->m_ColorState.GetStrokeColor() :
+ pSrcStates->m_ColorState.GetFillColor();
+ if (!pObjColor->IsNull()) {
+ CPDF_ColorStateData* pColorData = pStates->m_ColorState.GetModify();
+ pColorData->m_FillRGB = bStroke ? pSrcStates->m_ColorState.GetObject()->m_StrokeRGB :
+ pSrcStates->m_ColorState.GetObject()->m_FillRGB;
+ pColorData->m_StrokeRGB = pColorData->m_FillRGB;
+ }
+ return pStates;
+}
+CPDF_RenderContext::CPDF_RenderContext()
+{
+}
+void CPDF_RenderContext::Create(CPDF_Document* pDoc, CPDF_PageRenderCache* pPageCache,
+ CPDF_Dictionary* pPageResources, FX_BOOL bFirstLayer)
+{
+ m_pBackgroundDraw = NULL;
+ m_pDocument = pDoc;
+ m_pPageResources = pPageResources;
+ m_pPageCache = pPageCache;
+ m_bFirstLayer = bFirstLayer;
+}
+void CPDF_RenderContext::Create(CPDF_Page* pPage, FX_BOOL bFirstLayer)
+{
+ m_pBackgroundDraw = NULL;
+ m_pDocument = pPage->m_pDocument;
+ m_pPageResources = pPage->m_pPageResources;
+ m_pPageCache = pPage->GetRenderCache();
+ m_bFirstLayer = bFirstLayer;
+}
+CPDF_RenderContext::~CPDF_RenderContext()
+{
+}
+void CPDF_RenderContext::Clear()
+{
+ m_pDocument = NULL;
+ m_pPageResources = NULL;
+ m_pPageCache = NULL;
+ m_pBackgroundDraw = NULL;
+ m_bFirstLayer = TRUE;
+ m_ContentList.RemoveAll();
+}
+void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObject2Device)
+{
+ _PDF_RenderItem* pItem = m_ContentList.AddSpace();
+ pItem->m_pObjectList = pObjs;
+ if (pObject2Device) {
+ pItem->m_Matrix = *pObject2Device;
+ } else {
+ pItem->m_Matrix.SetIdentity();
+ }
+}
+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_RenderOptions* pOptions,
+ const CFX_AffineMatrix* pLastMatrix)
+{
+ Render(pDevice, NULL, pOptions, pLastMatrix);
+}
+void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj,
+ const CPDF_RenderOptions* pOptions, const CFX_AffineMatrix* pLastMatrix)
+{
+ int count = m_ContentList.GetSize();
+ for (int j = 0; j < count; j ++) {
+ pDevice->SaveState();
+ _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);
+ if (pLastMatrix) {
+ CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;
+ FinalMatrix.Concat(*pLastMatrix);
+ CPDF_RenderStatus status;
+ status.Initialize(0, this, pDevice, pLastMatrix, pStopObj, NULL, NULL, pOptions,
+ pItem->m_pObjectList->m_Transparency, FALSE, NULL);
+ status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix);
+#if !defined(_FPDFAPI_MINI_)
+ if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (status.m_bStopped) {
+ pDevice->RestoreState();
+ break;
+ }
+ } else {
+ CPDF_RenderStatus status;
+ status.Initialize(0, this, pDevice, NULL, pStopObj, NULL, NULL, pOptions,
+ pItem->m_pObjectList->m_Transparency, FALSE, NULL);
+ status.RenderObjectList(pItem->m_pObjectList, &pItem->m_Matrix);
+#if !defined(_FPDFAPI_MINI_)
+ if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (status.m_bStopped) {
+ pDevice->RestoreState();
+ break;
+ }
+ }
+ pDevice->RestoreState();
+ }
+}
+void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObjects* pObjs,
+ const CFX_AffineMatrix* pObject2Device, const CPDF_RenderOptions* pOptions)
+{
+ AppendObjectList(pObjs, pObject2Device);
+ Render(pDevice, pOptions);
+}
+CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()
+{
+ m_pRenderer = NULL;
+ m_pContext = NULL;
+ m_pDevice = NULL;
+ m_Status = Ready;
+}
+CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
+{
+ Clear();
+}
+void CPDF_ProgressiveRenderer::Clear()
+{
+ if (m_pRenderer) {
+ delete m_pRenderer;
+ m_pDevice->RestoreState();
+ m_pRenderer = NULL;
+ }
+ m_Status = Ready;
+}
+void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
+ const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)
+{
+ if (m_Status != Ready) {
+ m_Status = Failed;
+ return;
+ }
+ m_pContext = pContext;
+ m_pDevice = pDevice;
+ m_pOptions = pOptions;
+ m_bDropObjects = bDropObjects;
+ if (pContext == NULL || pDevice == NULL) {
+ m_Status = Failed;
+ return;
+ }
+ m_Status = ToBeContinued;
+ m_ObjectPos = NULL;
+ m_LayerIndex = 0;
+ m_ObjectIndex = 0;
+ m_PrevLastPos = NULL;
+ Continue(pPause);
+}
+#ifdef _FPDFAPI_MINI_
+#define RENDER_STEP_LIMIT 20
+#else
+#define RENDER_STEP_LIMIT 100
+#endif
+void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status != ToBeContinued) {
+ return;
+ }
+ FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
+ for (; m_LayerIndex < nLayers; m_LayerIndex ++) {
+ _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(m_LayerIndex);
+ FX_POSITION LastPos = pItem->m_pObjectList->GetLastObjectPosition();
+ if (m_ObjectPos == NULL) {
+ if (LastPos == m_PrevLastPos) {
+ if (!pItem->m_pObjectList->IsParsed()) {
+ pItem->m_pObjectList->ContinueParse(pPause);
+ if (!pItem->m_pObjectList->IsParsed()) {
+ return;
+ }
+ LastPos = pItem->m_pObjectList->GetLastObjectPosition();
+ }
+ }
+ if (LastPos == m_PrevLastPos) {
+ if (m_pRenderer) {
+ delete m_pRenderer;
+ m_pRenderer = NULL;
+ m_pDevice->RestoreState();
+ m_ObjectPos = NULL;
+ m_PrevLastPos = NULL;
+ }
+ continue;
+ }
+ if (m_PrevLastPos) {
+ m_ObjectPos = m_PrevLastPos;
+ pItem->m_pObjectList->GetNextObject(m_ObjectPos);
+ } else {
+ m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
+ }
+ m_PrevLastPos = LastPos;
+ }
+ if (m_pRenderer == NULL) {
+ m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
+ m_ObjectIndex = 0;
+ m_pRenderer = FX_NEW CPDF_RenderStatus();
+ m_pRenderer->Initialize(0, m_pContext, m_pDevice, NULL, NULL, NULL, NULL,
+ m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);
+ m_pDevice->SaveState();
+ m_ClipRect = m_pDevice->GetClipBox();
+ CFX_AffineMatrix device2object;
+ device2object.SetReverse(pItem->m_Matrix);
+ device2object.TransformRect(m_ClipRect);
+ }
+ int objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
+ while (m_ObjectPos) {
+ CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos);
+ if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && pCurObj->m_Right >= m_ClipRect.left &&
+ pCurObj->m_Bottom <= m_ClipRect.top && pCurObj->m_Top >= m_ClipRect.bottom) {
+ if (m_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
+ return;
+ }
+#if !defined(_FPDFAPI_MINI_)
+ if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
+ }
+#endif
+ if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
+ objs_to_go = 0;
+ } else {
+ objs_to_go --;
+ }
+ }
+ m_ObjectIndex ++;
+ pItem->m_pObjectList->GetNextObject(m_ObjectPos);
+ if (objs_to_go == 0) {
+ if (pPause && pPause->NeedToPauseNow()) {
+ return;
+ }
+ objs_to_go = CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit;
+ }
+ }
+ if (!pItem->m_pObjectList->IsParsed()) {
+ return;
+ }
+ delete m_pRenderer;
+ m_pRenderer = NULL;
+ m_pDevice->RestoreState();
+ m_ObjectPos = NULL;
+ m_PrevLastPos = NULL;
+ if (pPause && pPause->NeedToPauseNow()) {
+ m_LayerIndex++;
+ return;
+ }
+ }
+ m_Status = Done;
+}
+int CPDF_ProgressiveRenderer::EstimateProgress()
+{
+ if (!m_pContext) {
+ return 0;
+ }
+ FX_DWORD nLayers = m_pContext->m_ContentList.GetSize();
+ int nTotal = 0, nRendered = 0;
+ for (FX_DWORD layer = 0; layer < nLayers; layer ++) {
+ _PDF_RenderItem* pItem = m_pContext->m_ContentList.GetDataPtr(layer);
+ int nObjs = pItem->m_pObjectList->CountObjects();
+ if (layer == m_LayerIndex) {
+ nRendered += m_ObjectIndex;
+ } else if (layer < m_LayerIndex) {
+ nRendered += nObjs;
+ }
+ nTotal += nObjs;
+ }
+ if (nTotal == 0) {
+ return 0;
+ }
+ return 100 * nRendered / nTotal;
+}
+CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj)
+{
+ if (pObj == NULL) {
+ return NULL;
+ }
+ CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
+ if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
+ CPDF_TransferFunc* pTransfer = NULL;
+ CPDF_Function* pFuncs[3] = {NULL, NULL, NULL};
+ FX_BOOL bUniTransfer = TRUE;
+ int i;
+ FX_BOOL bIdentity = TRUE;
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ bUniTransfer = FALSE;
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ if (pArray->GetCount() < 3) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < 3; i ++) {
+ pFuncs[2 - i] = CPDF_Function::Load(pArray->GetElementValue(i));
+ if (pFuncs[2 - i] == NULL) {
+ return NULL;
+ }
+ }
+ } else {
+ pFuncs[0] = CPDF_Function::Load(pObj);
+ if (pFuncs[0] == NULL) {
+ return NULL;
+ }
+ }
+ pTransfer = FX_NEW CPDF_TransferFunc;
+ pTransfer->m_pPDFDoc = m_pPDFDoc;
+ pTransferCounter = FX_NEW CPDF_CountedObject<CPDF_TransferFunc*>;
+ pTransferCounter->m_nCount = 1;
+ pTransferCounter->m_Obj = pTransfer;
+ m_TransferFuncMap.SetAt(pObj, pTransferCounter);
+ static const int kMaxOutputs = 16;
+ FX_FLOAT output[kMaxOutputs];
+ FXSYS_memset32(output, 0, sizeof(output));
+ FX_FLOAT input;
+ int noutput;
+ for (int v = 0; v < 256; v ++) {
+ input = (FX_FLOAT)v / 255.0f;
+ if (bUniTransfer) {
+ if (pFuncs[0] && pFuncs[0]->CountOutputs() <= kMaxOutputs) {
+ pFuncs[0]->Call(&input, 1, output, noutput);
+ }
+ int o = FXSYS_round(output[0] * 255);
+ if (o != v) {
+ bIdentity = FALSE;
+ }
+ for (i = 0; i < 3; i ++) {
+ pTransfer->m_Samples[i * 256 + v] = o;
+ }
+ } else
+ for (i = 0; i < 3; i ++) {
+ if (pFuncs[i] && pFuncs[i]->CountOutputs() <= kMaxOutputs) {
+ pFuncs[i]->Call(&input, 1, output, noutput);
+ int o = FXSYS_round(output[0] * 255);
+ if (o != v) {
+ bIdentity = FALSE;
+ }
+ pTransfer->m_Samples[i * 256 + v] = o;
+ } else {
+ pTransfer->m_Samples[i * 256 + v] = v;
+ }
+ }
+ }
+ for (i = 0; i < 3; i ++)
+ if (pFuncs[i]) {
+ delete pFuncs[i];
+ }
+ pTransfer->m_bIdentity = bIdentity;
+ }
+ pTransferCounter->m_nCount++;
+ return pTransferCounter->m_Obj;
+}
+void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj)
+{
+ CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter;
+ if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) {
+ return;
+ }
+ pTransferCounter->m_nCount--;
+}
+CPDF_RenderConfig::CPDF_RenderConfig()
+{
+ m_HalftoneLimit = 0;
+#ifdef _FPDFAPI_MINI_
+ m_RenderStepLimit = 20;
+#else
+ m_RenderStepLimit = 100;
+#endif
+}
+CPDF_RenderConfig::~CPDF_RenderConfig()
+{
+}
+CPDF_DeviceBuffer::CPDF_DeviceBuffer()
+{
+ m_pBitmap = NULL;
+ m_pDevice = NULL;
+ m_pContext = NULL;
+ m_pObject = NULL;
+}
+CPDF_DeviceBuffer::~CPDF_DeviceBuffer()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+FX_BOOL CPDF_DeviceBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, int max_dpi)
+{
+ m_pDevice = pDevice;
+ m_pContext = pContext;
+ m_Rect = *pRect;
+ m_pObject = pObj;
+ m_Matrix.TranslateI(-pRect->left, -pRect->top);
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_
+ int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
+ int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
+ if (horz_size && vert_size && max_dpi) {
+ int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
+ int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
+ if (dpih > max_dpi) {
+ m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
+ }
+ if (dpiv > max_dpi) {
+ m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
+ }
+ }
+#ifdef _FPDFAPI_MINI_
+ m_Matrix.Scale(0.5f, 0.5f);
+#endif
+#endif
+ CFX_Matrix ctm = m_pDevice->GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ m_Matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
+ CFX_FloatRect rect(*pRect);
+ m_Matrix.TransformRect(rect);
+ FX_RECT bitmap_rect = rect.GetOutterRect();
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ m_pBitmap->Create(bitmap_rect.Width(), bitmap_rect.Height(), FXDIB_Argb);
+ return TRUE;
+}
+void CPDF_DeviceBuffer::OutputToDevice()
+{
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
+ if (m_Matrix.a == 1.0f && m_Matrix.d == 1.0f) {
+ m_pDevice->SetDIBits(m_pBitmap, m_Rect.left, m_Rect.top);
+ } else {
+ m_pDevice->StretchDIBits(m_pBitmap, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+ }
+ } else {
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ CFX_DIBitmap buffer;
+ m_pDevice->CreateCompatibleBitmap(&buffer, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+ m_pContext->GetBackground(&buffer, m_pObject, NULL, &m_Matrix);
+ buffer.CompositeBitmap(0, 0, buffer.GetWidth(), buffer.GetHeight(), m_pBitmap, 0, 0);
+ m_pDevice->StretchDIBits(&buffer, m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+#endif
+ }
+}
+CPDF_ScaledRenderBuffer::CPDF_ScaledRenderBuffer()
+{
+ m_pBitmapDevice = NULL;
+}
+CPDF_ScaledRenderBuffer::~CPDF_ScaledRenderBuffer()
+{
+ if (m_pBitmapDevice) {
+ delete m_pBitmapDevice;
+ }
+}
+#ifndef _FPDFAPI_MINI_
+#define _FPDFAPI_IMAGESIZE_LIMIT_ (30 * 1024 * 1024)
+#else
+#define _FPDFAPI_IMAGESIZE_LIMIT_ (10 * 1024 * 1024)
+#endif
+FX_BOOL CPDF_ScaledRenderBuffer::Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions, int max_dpi)
+{
+ FXSYS_assert(pRect != NULL);
+ m_pDevice = pDevice;
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_GET_BITS) {
+ return TRUE;
+ }
+ m_pContext = pContext;
+ m_Rect = *pRect;
+ m_pObject = pObj;
+ m_Matrix.TranslateI(-pRect->left, -pRect->top);
+ int horz_size = pDevice->GetDeviceCaps(FXDC_HORZ_SIZE);
+ int vert_size = pDevice->GetDeviceCaps(FXDC_VERT_SIZE);
+ if (horz_size && vert_size && max_dpi) {
+ int dpih = pDevice->GetDeviceCaps(FXDC_PIXEL_WIDTH) * 254 / (horz_size * 10);
+ int dpiv = pDevice->GetDeviceCaps(FXDC_PIXEL_HEIGHT) * 254 / (vert_size * 10);
+ if (dpih > max_dpi) {
+ m_Matrix.Scale((FX_FLOAT)(max_dpi) / dpih, 1.0f);
+ }
+ if (dpiv > max_dpi) {
+ m_Matrix.Scale(1.0f, (FX_FLOAT)(max_dpi) / (FX_FLOAT)dpiv);
+ }
+ }
+ m_pBitmapDevice = FX_NEW CFX_FxgeDevice;
+ FXDIB_Format dibFormat = FXDIB_Rgb;
+ FX_INT32 bpp = 24;
+ if (m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_ALPHA_OUTPUT) {
+ dibFormat = FXDIB_Argb;
+ bpp = 32;
+ }
+ CFX_FloatRect rect;
+ FX_INT32 iWidth, iHeight, iPitch;
+ while (1) {
+ rect = *pRect;
+ m_Matrix.TransformRect(rect);
+ FX_RECT bitmap_rect = rect.GetOutterRect();
+ iWidth = bitmap_rect.Width();
+ iHeight = bitmap_rect.Height();
+ iPitch = (iWidth * bpp + 31) / 32 * 4;
+ if (iWidth * iHeight < 1) {
+ return FALSE;
+ }
+ if (iPitch * iHeight <= _FPDFAPI_IMAGESIZE_LIMIT_ &&
+ m_pBitmapDevice->Create(iWidth, iHeight, dibFormat)) {
+ break;
+ }
+ m_Matrix.Scale(0.5f, 0.5f);
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ m_pContext->GetBackground(m_pBitmapDevice->GetBitmap(), m_pObject, pOptions, &m_Matrix);
+#endif
+ return TRUE;
+}
+void CPDF_ScaledRenderBuffer::OutputToDevice()
+{
+ if (m_pBitmapDevice) {
+ m_pDevice->StretchDIBits(m_pBitmapDevice->GetBitmap(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height());
+ }
+}
+FX_BOOL IPDF_OCContext::CheckObjectVisible(const CPDF_PageObject* pObj)
+{
+ const CPDF_ContentMarkData* pData = pObj->m_ContentMark;
+ int nItems = pData->CountItems();
+ for (int i = 0; i < nItems; i ++) {
+ CPDF_ContentMarkItem& item = pData->GetItem(i);
+ if (item.GetName() == FX_BSTRC("OC") && item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) {
+ CPDF_Dictionary* pOCG = (CPDF_Dictionary*)item.GetParam();
+ if (!CheckOCGVisible(pOCG)) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
new file mode 100644
index 0000000000..c5be3391b8
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp
@@ -0,0 +1,389 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+struct CACHEINFO {
+ FX_DWORD time;
+ CPDF_Stream* pStream;
+};
+extern "C" {
+ static int compare(const void* data1, const void* data2)
+ {
+ return ((CACHEINFO*)data1)->time - ((CACHEINFO*)data2)->time;
+ }
+};
+void CPDF_Page::ClearRenderCache()
+{
+ if (m_pPageRender) {
+ m_pPageRender->ClearAll();
+ }
+}
+void CPDF_PageRenderCache::ClearAll()
+{
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ delete (CPDF_ImageCache*)value;
+ }
+ m_ImageCaches.RemoveAll();
+ m_nCacheSize = 0;
+ m_nTimeCount = 0;
+}
+void CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize)
+{
+ if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) {
+ return;
+ }
+ int nCount = m_ImageCaches.GetCount();
+ CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount);
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ int i = 0;
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount();
+ pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream();
+ }
+ FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare);
+ FX_DWORD nTimeCount = m_nTimeCount;
+ if (nTimeCount + 1 < nTimeCount) {
+ for (i = 0; i < nCount; i ++) {
+ ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i;
+ }
+ m_nTimeCount = nCount;
+ }
+ i = 0;
+ while(nCount > 15) {
+ ClearImageCache(pCACHEINFO[i++].pStream);
+ nCount--;
+ }
+ while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) {
+ ClearImageCache(pCACHEINFO[i++].pStream);
+ }
+ FX_Free(pCACHEINFO);
+}
+void CPDF_PageRenderCache::ClearImageCache(CPDF_Stream* pStream)
+{
+ FX_LPVOID value = m_ImageCaches.GetValueAt(pStream);
+ if (value == NULL) {
+ m_ImageCaches.RemoveKey(pStream);
+ return;
+ }
+ m_nCacheSize -= ((CPDF_ImageCache*)value)->EstimateSize();
+ delete (CPDF_ImageCache*)value;
+ m_ImageCaches.RemoveKey(pStream);
+}
+FX_DWORD CPDF_PageRenderCache::EstimateSize()
+{
+ FX_DWORD dwSize = 0;
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ dwSize += ((CPDF_ImageCache*)value)->EstimateSize();
+ }
+ m_nCacheSize = dwSize;
+ return dwSize;
+}
+FX_DWORD CPDF_PageRenderCache::GetCachedSize(CPDF_Stream* pStream) const
+{
+ if (pStream == NULL) {
+ return m_nCacheSize;
+ }
+ CPDF_ImageCache* pImageCache;
+ if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
+ return 0;
+ }
+ return pImageCache->EstimateSize();
+}
+void CPDF_PageRenderCache::GetCachedBitmap(CPDF_Stream* pStream, CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ CPDF_ImageCache* pImageCache;
+ FX_BOOL bFind = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache);
+ if (!bFind) {
+ pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ }
+ m_nTimeCount ++;
+ FX_BOOL bCached = pImageCache->GetCachedBitmap(pBitmap, pMask, MatteColor, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
+ if (!bFind) {
+ m_ImageCaches.SetAt(pStream, pImageCache);
+ }
+ if (!bCached) {
+ m_nCacheSize += pImageCache->EstimateSize();
+ }
+}
+FX_BOOL CPDF_PageRenderCache::StartGetCachedBitmap(CPDF_Stream* pStream, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ m_bCurFindCache = m_ImageCaches.Lookup(pStream, (FX_LPVOID&)m_pCurImageCache);
+ if (!m_bCurFindCache) {
+ m_pCurImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ }
+ int ret = m_pCurImageCache->StartGetCachedBitmap(pRenderStatus->m_pFormResource, m_pPage->m_pPageResources, bStdCS, GroupFamily, bLoadMask, pRenderStatus, downsampleWidth, downsampleHeight);
+ if (ret == 2) {
+ return TRUE;
+ }
+ m_nTimeCount ++;
+ if (!m_bCurFindCache) {
+ m_ImageCaches.SetAt(pStream, m_pCurImageCache);
+ }
+ if (!ret) {
+ m_nCacheSize += m_pCurImageCache->EstimateSize();
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_PageRenderCache::Continue(IFX_Pause* pPause)
+{
+ int ret = m_pCurImageCache->Continue(pPause);
+ if (ret == 2) {
+ return TRUE;
+ }
+ m_nTimeCount ++;
+ if (!m_bCurFindCache) {
+ m_ImageCaches.SetAt(m_pCurImageCache->GetStream(), m_pCurImageCache);
+ }
+ if (!ret) {
+ m_nCacheSize += m_pCurImageCache->EstimateSize();
+ }
+ return FALSE;
+}
+void CPDF_PageRenderCache::ResetBitmap(CPDF_Stream* pStream, const CFX_DIBitmap* pBitmap)
+{
+ CPDF_ImageCache* pImageCache;
+ if (!m_ImageCaches.Lookup(pStream, (FX_LPVOID&)pImageCache)) {
+ if (pBitmap == NULL) {
+ return;
+ }
+ pImageCache = FX_NEW CPDF_ImageCache(m_pPage->m_pDocument, pStream);
+ m_ImageCaches.SetAt(pStream, pImageCache);
+ }
+ int oldsize = pImageCache->EstimateSize();
+ pImageCache->Reset(pBitmap);
+ m_nCacheSize = pImageCache->EstimateSize() - oldsize;
+}
+CPDF_ImageCache::CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream)
+ : m_pDocument(pDoc)
+ , m_pStream(pStream)
+ , m_pCachedBitmap(NULL)
+ , m_pCachedMask(NULL)
+ , m_dwCacheSize(0)
+ , m_dwTimeCount(0)
+ , m_pCurBitmap(NULL)
+ , m_pCurMask(NULL)
+ , m_MatteColor(0)
+ , m_pRenderStatus(NULL)
+{
+}
+CPDF_ImageCache::~CPDF_ImageCache()
+{
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ }
+ if (m_pCachedMask) {
+ delete m_pCachedMask;
+ m_pCachedMask = NULL;
+ }
+}
+void CPDF_ImageCache::Reset(const CFX_DIBitmap* pBitmap)
+{
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ }
+ m_pCachedBitmap = NULL;
+ if (pBitmap) {
+ m_pCachedBitmap = pBitmap->Clone();
+ }
+ CalcSize();
+}
+void CPDF_PageRenderCache::ClearImageData()
+{
+ FX_POSITION pos = m_ImageCaches.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ImageCaches.GetNextAssoc(pos, key, value);
+ ((CPDF_ImageCache*)value)->ClearImageData();
+ }
+}
+void CPDF_ImageCache::ClearImageData()
+{
+ if (m_pCachedBitmap && m_pCachedBitmap->GetBuffer() == NULL) {
+ ((CPDF_DIBSource*)m_pCachedBitmap)->ClearImageData();
+ }
+}
+static FX_DWORD FPDF_ImageCache_EstimateImageSize(const CFX_DIBSource* pDIB)
+{
+ return pDIB && pDIB->GetBuffer() ? (FX_DWORD)pDIB->GetHeight() * pDIB->GetPitch() + (FX_DWORD)pDIB->GetPaletteSize() * 4 : 0;
+}
+FX_BOOL CPDF_ImageCache::GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ if (m_pCachedBitmap) {
+ pBitmap = m_pCachedBitmap;
+ pMask = m_pCachedMask;
+ MatteColor = m_MatteColor;
+ return TRUE;
+ }
+ if (!pRenderStatus) {
+ return FALSE;
+ }
+ CPDF_RenderContext*pContext = pRenderStatus->GetContext();
+ CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
+ m_dwTimeCount = pPageRenderCache->GetTimeCount();
+ CPDF_DIBSource* pSrc = FX_NEW CPDF_DIBSource;
+ CPDF_DIBSource* pMaskSrc = NULL;
+ if (!pSrc->Load(m_pDocument, m_pStream, &pMaskSrc, &MatteColor, pRenderStatus->m_pFormResource, pPageResources, bStdCS, GroupFamily, bLoadMask)) {
+ delete pSrc;
+ pBitmap = NULL;
+ return FALSE;
+ }
+ m_MatteColor = MatteColor;
+#if !defined(_FPDFAPI_MINI_)
+ if (pSrc->GetPitch() * pSrc->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
+ m_pCachedBitmap = pSrc->Clone();
+ delete pSrc;
+ } else {
+ m_pCachedBitmap = pSrc;
+ }
+ if (pMaskSrc) {
+ m_pCachedMask = pMaskSrc->Clone();
+ delete pMaskSrc;
+ }
+#else
+ if (pSrc->GetFormat() == FXDIB_8bppRgb && pSrc->GetPalette() &&
+ pSrc->GetHeight() * pSrc->GetWidth() * 3 < 1024) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb32);
+#else
+ m_pCachedBitmap = pSrc->CloneConvert(FXDIB_Rgb);
+#endif
+ delete pSrc;
+ } else if (pSrc->GetPitch() * pSrc->GetHeight() < 102400) {
+ m_pCachedBitmap = pSrc->Clone();
+ delete pSrc;
+ } else {
+ m_pCachedBitmap = pSrc;
+ }
+ m_pCachedMask = pMaskSrc;
+#endif
+ pBitmap = m_pCachedBitmap;
+ pMask = m_pCachedMask;
+ CalcSize();
+ return FALSE;
+}
+CFX_DIBSource* CPDF_ImageCache::DetachBitmap()
+{
+ CFX_DIBSource* pDIBSource = m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return pDIBSource;
+}
+CFX_DIBSource* CPDF_ImageCache::DetachMask()
+{
+ CFX_DIBSource* pDIBSource = m_pCurMask;
+ m_pCurMask = NULL;
+ return pDIBSource;
+}
+int CPDF_ImageCache::StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS,
+ FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus,
+ FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+{
+ if (m_pCachedBitmap) {
+ m_pCurBitmap = m_pCachedBitmap;
+ m_pCurMask = m_pCachedMask;
+ return 1;
+ }
+ if (!pRenderStatus) {
+ return 0;
+ }
+ m_pRenderStatus = pRenderStatus;
+ m_pCurBitmap = FX_NEW CPDF_DIBSource;
+ int ret = ((CPDF_DIBSource*)m_pCurBitmap)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResources, pPageResources, bStdCS, GroupFamily, bLoadMask);
+ if (ret == 2) {
+ return ret;
+ }
+ if (!ret) {
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return 0;
+ }
+ ContinueGetCachedBitmap();
+ return 0;
+}
+int CPDF_ImageCache::ContinueGetCachedBitmap()
+{
+ m_MatteColor = ((CPDF_DIBSource*)m_pCurBitmap)->m_MatteColor;
+ m_pCurMask = ((CPDF_DIBSource*)m_pCurBitmap)->DetachMask();
+ CPDF_RenderContext*pContext = m_pRenderStatus->GetContext();
+ CPDF_PageRenderCache* pPageRenderCache = pContext->m_pPageCache;
+ m_dwTimeCount = pPageRenderCache->GetTimeCount();
+#if !defined(_FPDFAPI_MINI_)
+ if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < FPDF_HUGE_IMAGE_SIZE) {
+ m_pCachedBitmap = m_pCurBitmap->Clone();
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else {
+ m_pCachedBitmap = m_pCurBitmap;
+ }
+ if (m_pCurMask) {
+ m_pCachedMask = m_pCurMask->Clone();
+ delete m_pCurMask;
+ m_pCurMask = NULL;
+ }
+#else
+ if (m_pCurBitmap->GetFormat() == FXDIB_8bppRgb && m_pCurBitmap->GetPalette() &&
+ m_pCurBitmap->GetHeight() * m_pCurBitmap->GetWidth() * 3 < 1024) {
+ m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb32);
+ m_pCachedBitmap = m_pCurBitmap->CloneConvert(FXDIB_Rgb);
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < 102400) {
+ m_pCachedBitmap = m_pCurBitmap->Clone();
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ } else {
+ m_pCachedBitmap = m_pCurBitmap;
+ }
+ m_pCachedMask = m_pCurMask;
+#endif
+ m_pCurBitmap = m_pCachedBitmap;
+ m_pCurMask = m_pCachedMask;
+ CalcSize();
+ return 0;
+}
+int CPDF_ImageCache::Continue(IFX_Pause* pPause)
+{
+ int ret = ((CPDF_DIBSource*)m_pCurBitmap)->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return ret;
+ }
+ if (!ret) {
+ delete m_pCurBitmap;
+ m_pCurBitmap = NULL;
+ return 0;
+ }
+ ContinueGetCachedBitmap();
+ return 0;
+}
+void CPDF_ImageCache::CalcSize()
+{
+ m_dwCacheSize = FPDF_ImageCache_EstimateImageSize(m_pCachedBitmap) + FPDF_ImageCache_EstimateImageSize(m_pCachedMask);
+}
+void CPDF_Document::ClearRenderFont()
+{
+ if (m_pDocRender) {
+ CFX_FontCache* pCache = m_pDocRender->GetFontCache();
+ if (pCache) {
+ pCache->FreeCache(FALSE);
+ }
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
new file mode 100644
index 0000000000..c2a7393739
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp
@@ -0,0 +1,1165 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_ImageRenderer render;
+ if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) {
+ render.Continue(NULL);
+ }
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pImageObj, pObj2Device);
+ }
+#endif
+ return render.m_Result;
+}
+#if defined(_FPDFAPI_MINI_)
+FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device)
+{
+ int bitmap_alpha = 255;
+ if (!pInlines->m_GeneralState.IsNull()) {
+ bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillAlpha * 255);
+ }
+ if (pInlines->m_pStream) {
+ CPDF_DIBSource dibsrc;
+ if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
+ return TRUE;
+ }
+ pInlines->m_pBitmap = dibsrc.Clone();
+ pInlines->m_pStream->Release();
+ pInlines->m_pStream = NULL;
+ }
+ if (pInlines->m_pBitmap == NULL) {
+ return TRUE;
+ }
+ FX_ARGB fill_argb = 0;
+ if (pInlines->m_pBitmap->IsAlphaMask()) {
+ fill_argb = GetFillArgb(pInlines);
+ }
+ int flags = 0;
+ if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
+ flags |= RENDER_FORCE_DOWNSAMPLE;
+ } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
+ flags = 0;
+ }
+ for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) {
+ CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i);
+ image_matrix.Concat(*pObj2Device);
+ CPDF_ImageRenderer renderer;
+ if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &image_matrix, flags, FALSE, m_curBlend)) {
+ renderer.Continue(NULL);
+ }
+ }
+ return TRUE;
+}
+#endif
+void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
+ int bitmap_alpha, int blend_mode, int Transparency)
+{
+ if (pDIBitmap == NULL) {
+ return;
+ }
+ FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED;
+ FX_BOOL bGroup = Transparency & PDFTRANS_GROUP;
+ if (blend_mode == FXDIB_BLEND_NORMAL) {
+ if (!pDIBitmap->IsAlphaMask()) {
+ if (bitmap_alpha < 255) {
+ pDIBitmap->MultiplyAlpha(bitmap_alpha);
+ }
+ if (m_pDevice->SetDIBits(pDIBitmap, left, top)) {
+ return;
+ }
+ } else {
+ FX_DWORD fill_argb = m_Options.TranslateColor(mask_argb);
+ if (bitmap_alpha < 255) {
+ ((FX_BYTE*)&fill_argb)[3] = ((FX_BYTE*)&fill_argb)[3] * bitmap_alpha / 255;
+ }
+ if (m_pDevice->SetBitMask(pDIBitmap, left, top, fill_argb)) {
+ return;
+ }
+ }
+ }
+ FX_BOOL bBackAlphaRequired = blend_mode && bIsolated && !m_bDropObjects;
+ FX_BOOL bGetBackGround = ((m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT)) ||
+ (!(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT) && (m_pDevice->GetRenderCaps()
+ & FXRC_GET_BITS) && !bBackAlphaRequired);
+ if (bGetBackGround) {
+ if (bIsolated || !bGroup) {
+ if (pDIBitmap->IsAlphaMask()) {
+ return;
+ }
+ m_pDevice->SetDIBits(pDIBitmap, left, top, blend_mode);
+ } else {
+ FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
+ rect.Intersect(m_pDevice->GetClipBox());
+ CFX_DIBitmap* pClone = NULL;
+ FX_BOOL bClone = FALSE;
+ if (m_pDevice->GetBackDrop() && m_pDevice->GetBitmap()) {
+ bClone = TRUE;
+ pClone = m_pDevice->GetBackDrop()->Clone(&rect);
+ CFX_DIBitmap *pForeBitmap = m_pDevice->GetBitmap();
+ pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pForeBitmap, rect.left, rect.top);
+ left = left >= 0 ? 0 : left;
+ top = top >= 0 ? 0 : top;
+ if (!pDIBitmap->IsAlphaMask())
+ pClone->CompositeBitmap(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
+ left, top, blend_mode);
+ else
+ pClone->CompositeMask(0, 0, pClone->GetWidth(), pClone->GetHeight(), pDIBitmap,
+ mask_argb, left, top, blend_mode);
+ } else {
+ pClone = pDIBitmap;
+ }
+ if (m_pDevice->GetBackDrop()) {
+ m_pDevice->SetDIBits(pClone, rect.left, rect.top);
+ } else {
+ if (pDIBitmap->IsAlphaMask()) {
+ return;
+ }
+ m_pDevice->SetDIBits(pDIBitmap, rect.left, rect.top, blend_mode);
+ }
+ if (bClone) {
+ delete pClone;
+ }
+ }
+ return;
+ }
+ int back_left, back_top;
+ FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), top + pDIBitmap->GetHeight());
+ CFX_DIBitmap* pBackdrop = GetBackdrop(m_pCurObj, rect, back_left, back_top, blend_mode > FXDIB_BLEND_NORMAL && bIsolated);
+ if (!pBackdrop) {
+ return;
+ }
+ if (!pDIBitmap->IsAlphaMask())
+ pBackdrop->CompositeBitmap(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
+ 0, 0, blend_mode);
+ else
+ pBackdrop->CompositeMask(left - back_left, top - back_top, pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), pDIBitmap,
+ mask_argb, 0, 0, blend_mode);
+ CFX_DIBitmap* pBackdrop1 = FX_NEW CFX_DIBitmap;
+ pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), FXDIB_Rgb32);
+ pBackdrop1->Clear((FX_DWORD) - 1);
+ pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), pBackdrop->GetHeight(), pBackdrop, 0, 0);
+ delete pBackdrop;
+ pBackdrop = pBackdrop1;
+ m_pDevice->SetDIBits(pBackdrop, back_left, back_top);
+ delete pBackdrop;
+}
+FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb)
+{
+ return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], m_Samples[256 + FXSYS_GetGValue(rgb)],
+ m_Samples[512 + FXSYS_GetBValue(rgb)]);
+}
+CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
+{
+ CPDF_DIBTransferFunc* pDest = FX_NEW CPDF_DIBTransferFunc(this);
+ pDest->LoadSrc(pSrc, bAutoDropSrc);
+ return pDest;
+}
+FXDIB_Format CPDF_DIBTransferFunc::GetDestFormat()
+{
+ if (m_pSrc->IsAlphaMask()) {
+ return FXDIB_8bppMask;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb32;
+#else
+ return (m_pSrc->HasAlpha()) ? FXDIB_Argb : FXDIB_Rgb;
+#endif
+}
+CPDF_DIBTransferFunc::CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc)
+{
+ m_RampR = pTransferFunc->m_Samples;
+ m_RampG = &pTransferFunc->m_Samples[256];
+ m_RampB = &pTransferFunc->m_Samples[512];
+}
+void CPDF_DIBTransferFunc::TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const
+{
+ int i;
+ FX_BOOL bSkip = FALSE;
+ switch (m_pSrc->GetFormat()) {
+ case FXDIB_1bppRgb: {
+ int r0 = m_RampR[0], g0 = m_RampG[0], b0 = m_RampB[0];
+ int r1 = m_RampR[255], g1 = m_RampG[255], b1 = m_RampB[255];
+ for (i = 0; i < m_Width; i ++) {
+ if (src_buf[i / 8] & (1 << (7 - i % 8))) {
+ *dest_buf++ = b1;
+ *dest_buf++ = g1;
+ *dest_buf++ = r1;
+ } else {
+ *dest_buf++ = b0;
+ *dest_buf++ = g0;
+ *dest_buf++ = r0;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ }
+ case FXDIB_1bppMask: {
+ int m0 = m_RampR[0], m1 = m_RampR[255];
+ for (i = 0; i < m_Width; i ++) {
+ if (src_buf[i / 8] & (1 << (7 - i % 8))) {
+ *dest_buf++ = m1;
+ } else {
+ *dest_buf++ = m0;
+ }
+ }
+ break;
+ }
+ case FXDIB_8bppRgb: {
+ FX_ARGB* pPal = m_pSrc->GetPalette();
+ for (i = 0; i < m_Width; i ++) {
+ if (pPal) {
+ FX_ARGB src_argb = pPal[*src_buf];
+ *dest_buf++ = m_RampB[FXARGB_R(src_argb)];
+ *dest_buf++ = m_RampG[FXARGB_G(src_argb)];
+ *dest_buf++ = m_RampR[FXARGB_B(src_argb)];
+ } else {
+ FX_DWORD src_byte = *src_buf;
+ *dest_buf++ = m_RampB[src_byte];
+ *dest_buf++ = m_RampG[src_byte];
+ *dest_buf++ = m_RampR[src_byte];
+ }
+ src_buf ++;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ }
+ case FXDIB_8bppMask:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ break;
+ case FXDIB_Rgb:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ dest_buf++;
+#endif
+ }
+ break;
+ case FXDIB_Rgb32:
+ bSkip = TRUE;
+ case FXDIB_Argb:
+ for (i = 0; i < m_Width; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ if (!bSkip) {
+ *dest_buf++ = *src_buf;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ else {
+ dest_buf++;
+ }
+#endif
+ src_buf ++;
+ }
+ break;
+ default:
+ break;
+ }
+}
+void CPDF_DIBTransferFunc::TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const
+{
+ if (Bpp == 8) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ } else if (Bpp == 24) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ }
+ } else {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!m_pSrc->HasAlpha()) {
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ dest_buf++;
+ src_buf++;
+ }
+ } else
+#endif
+ for (int i = 0; i < pixels; i ++) {
+ *dest_buf++ = m_RampB[*(src_buf++)];
+ *dest_buf++ = m_RampG[*(src_buf++)];
+ *dest_buf++ = m_RampR[*(src_buf++)];
+ *dest_buf++ = *(src_buf++);
+ }
+ }
+}
+static FX_BOOL _IsSupported(CPDF_ColorSpace* pCS)
+{
+ if (pCS->GetFamily() == PDFCS_DEVICERGB || pCS->GetFamily() == PDFCS_DEVICEGRAY ||
+ pCS->GetFamily() == PDFCS_DEVICECMYK || pCS->GetFamily() == PDFCS_CALGRAY ||
+ pCS->GetFamily() == PDFCS_CALRGB) {
+ return TRUE;
+ }
+ if (pCS->GetFamily() == PDFCS_INDEXED && _IsSupported(pCS->GetBaseCS())) {
+ return TRUE;
+ }
+ return FALSE;
+}
+CPDF_ImageRenderer::CPDF_ImageRenderer()
+{
+ m_pRenderStatus = NULL;
+ m_pImageObject = NULL;
+ m_Result = TRUE;
+ m_Status = 0;
+ m_pQuickStretcher = NULL;
+ m_pTransformer = NULL;
+ m_DeviceHandle = NULL;
+ m_LoadHandle = NULL;
+ m_pClone = NULL;
+ m_bStdCS = FALSE;
+ m_bPatternColor = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+ m_pPattern = NULL;
+ m_pObj2Device = NULL;
+}
+CPDF_ImageRenderer::~CPDF_ImageRenderer()
+{
+ if (m_pQuickStretcher) {
+ delete m_pQuickStretcher;
+ }
+ if (m_pTransformer) {
+ delete m_pTransformer;
+ }
+ if (m_DeviceHandle) {
+ m_pRenderStatus->m_pDevice->CancelDIBits(m_DeviceHandle);
+ }
+ if (m_LoadHandle) {
+ delete (CPDF_ProgressiveImageLoaderHandle*)m_LoadHandle;
+ }
+ if (m_pClone) {
+ delete m_pClone;
+ }
+}
+FX_BOOL CPDF_ImageRenderer::StartLoadDIBSource()
+{
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ if (m_ImageMatrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ if (m_ImageMatrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ if (m_Loader.StartLoadImage(m_pImageObject, m_pRenderStatus->m_pContext->m_pPageCache, m_LoadHandle, m_bStdCS,
+ m_pRenderStatus->m_GroupFamily, m_pRenderStatus->m_bLoadMask, m_pRenderStatus, dest_width, dest_height)) {
+ if (m_LoadHandle != NULL) {
+ m_Status = 4;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource()
+{
+ if (m_Loader.m_pBitmap == NULL) {
+ return FALSE;
+ }
+ m_BitmapAlpha = 255;
+ const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState;
+ if (pGeneralState) {
+ m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255);
+ }
+ m_pDIBSource = m_Loader.m_pBitmap;
+ if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader.m_pMask == NULL) {
+ return StartBitmapAlpha();
+ }
+#ifndef _FPDFAPI_MINI_
+ if (pGeneralState && pGeneralState->m_pTR) {
+ if (!pGeneralState->m_pTransferFunc) {
+ ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR);
+ }
+ if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m_bIdentity) {
+ m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached);
+ if (m_Loader.m_bCached && m_Loader.m_pMask) {
+ m_Loader.m_pMask = m_Loader.m_pMask->Clone();
+ }
+ m_Loader.m_bCached = FALSE;
+ }
+ }
+#endif
+ m_FillArgb = 0;
+ m_bPatternColor = FALSE;
+ m_pPattern = NULL;
+ if (m_pDIBSource->IsAlphaMask()) {
+ CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor();
+ if (pColor && pColor->IsPattern()) {
+ m_pPattern = pColor->GetPattern();
+ if (m_pPattern != NULL) {
+ m_bPatternColor = TRUE;
+ }
+ }
+ m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject);
+ } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ m_pClone = m_pDIBSource->Clone();
+ m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pRenderStatus->m_Options.m_ForeColor);
+ m_pDIBSource = m_pClone;
+ }
+ m_Flags = 0;
+#if !defined(_FPDFAPI_MINI_)
+ if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) {
+ m_Flags |= RENDER_FORCE_HALFTONE;
+ }
+#else
+ if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) {
+ if (m_pRenderStatus->m_HalftoneLimit) {
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ FX_RECT image_clip = image_rect;
+ image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (image_rect.Width() && image_rect.Height()) {
+ if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.Width()) *
+ (image_clip.Height() * m_pDIBSource->GetHeight() / image_rect.Height()) >
+ m_pRenderStatus->m_HalftoneLimit) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+ } else {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+#endif
+#ifndef _FPDFAPI_MINI_
+ if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) {
+ CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilters) {
+ if (pFilters->GetType() == PDFOBJ_NAME) {
+ CFX_ByteStringC bsDecodeType = pFilters->GetConstString();
+ if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
+ m_Flags |= FXRENDER_IMAGE_LOSSY;
+ }
+ } else if (pFilters->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFilters;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CFX_ByteStringC bsDecodeType = pArray->GetConstString(i);
+ if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_BSTRC("JPXDecode")) {
+ m_Flags |= FXRENDER_IMAGE_LOSSY;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) {
+ m_Flags |= FXDIB_NOSMOOTH;
+ } else if (m_pImageObject->m_pImage->IsInterpol()) {
+ m_Flags |= FXDIB_INTERPOL;
+ }
+#endif
+ if (m_Loader.m_pMask) {
+ return DrawMaskedImage();
+ }
+ if (m_bPatternColor) {
+ return DrawPatternImage(m_pObj2Device);
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP &&
+ pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) {
+ CPDF_Document* pDocument = NULL;
+ CPDF_Page* pPage = NULL;
+ if (m_pRenderStatus->m_pContext->m_pPageCache) {
+ pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage();
+ pDocument = pPage->m_pDocument;
+ } else {
+ pDocument = m_pImageObject->m_pImage->GetDocument();
+ }
+ CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL;
+ CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->GetElementValue(FX_BSTRC("ColorSpace"));
+ CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageResources);
+ if (pColorSpace) {
+ int format = pColorSpace->GetFamily();
+ if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || format == PDFCS_DEVICEN) {
+ m_BlendType = FXDIB_BLEND_DARKEN;
+ }
+ pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+#endif
+ return StartDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType)
+{
+ m_pRenderStatus = pStatus;
+ m_bStdCS = bStdCS;
+ m_pImageObject = (CPDF_ImageObject*)pObj;
+ m_BlendType = blendType;
+ m_pObj2Device = pObj2Device;
+#ifndef _FPDFAPI_MINI_
+ CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC();
+ if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
+ return FALSE;
+ }
+#endif
+ m_ImageMatrix = m_pImageObject->m_Matrix;
+ m_ImageMatrix.Concat(*pObj2Device);
+ if (StartLoadDIBSource()) {
+ return TRUE;
+ }
+ return StartRenderDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
+ int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType)
+{
+ m_pRenderStatus = pStatus;
+ m_pDIBSource = pDIBSource;
+ m_FillArgb = bitmap_argb;
+ m_BitmapAlpha = bitmap_alpha;
+ m_ImageMatrix = *pImage2Device;
+ m_Flags = flags;
+ m_bStdCS = bStdCS;
+ m_BlendType = blendType;
+ return StartDIBSource();
+}
+FX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device)
+{
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
+ rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return FALSE;
+ }
+ CFX_AffineMatrix new_matrix = m_ImageMatrix;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ int width = rect.Width();
+ int height = rect.Height();
+ CFX_FxgeDevice bitmap_device1;
+ if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) {
+ return TRUE;
+ }
+ bitmap_device1.GetBitmap()->Clear(0xffffff);
+ {
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
+ NULL, NULL, &m_pRenderStatus->m_Options, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CFX_Matrix patternDevice = *pObj2Device;
+ patternDevice.Translate((FX_FLOAT) - rect.left, (FX_FLOAT) - rect.top);
+ if(m_pPattern->m_PatternType == PATTERN_TILING) {
+ bitmap_render.DrawTilingPattern((CPDF_TilingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
+ } else {
+ bitmap_render.DrawShadingPattern((CPDF_ShadingPattern*)m_pPattern, m_pImageObject, &patternDevice, FALSE);
+ }
+ }
+ {
+ CFX_FxgeDevice bitmap_device2;
+ if (!bitmap_device2.Create(rect.Width(), rect.Height(), FXDIB_8bppRgb)) {
+ return TRUE;
+ }
+ bitmap_device2.GetBitmap()->Clear(0);
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_pDIBSource, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ if (m_Loader.m_MatteColor != 0xffffffff) {
+ int matte_r = FXARGB_R(m_Loader.m_MatteColor);
+ int matte_g = FXARGB_G(m_Loader.m_MatteColor);
+ int matte_b = FXARGB_B(m_Loader.m_MatteColor);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
+ FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
+ for (int col = 0; col < width; col ++) {
+ int alpha = *mask_scan ++;
+ if (alpha) {
+ int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ dest_scan ++;
+ } else {
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
+ bitmap_device1.GetBitmap()->MultiplyAlpha(255);
+ }
+ m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::DrawMaskedImage()
+{
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect();
+ rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox());
+ if (rect.IsEmpty()) {
+ return FALSE;
+ }
+ CFX_AffineMatrix new_matrix = m_ImageMatrix;
+ new_matrix.TranslateI(-rect.left, -rect.top);
+ int width = rect.Width();
+ int height = rect.Height();
+ CFX_FxgeDevice bitmap_device1;
+ if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) {
+ return TRUE;
+ }
+ bitmap_device1.GetBitmap()->Clear(0xffffff);
+ {
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device1, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_pDIBSource, 0, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ }
+ {
+ CFX_FxgeDevice bitmap_device2;
+ if (!bitmap_device2.Create(width, height, FXDIB_8bppRgb)) {
+ return TRUE;
+ }
+ bitmap_device2.GetBitmap()->Clear(0);
+ CPDF_RenderStatus bitmap_render;
+ bitmap_render.Initialize(m_pRenderStatus->m_Level + 1, m_pRenderStatus->m_pContext, &bitmap_device2, NULL, NULL,
+ NULL, NULL, NULL, 0, m_pRenderStatus->m_bDropObjects, NULL, TRUE);
+ CPDF_ImageRenderer image_render;
+ if (image_render.Start(&bitmap_render, m_Loader.m_pMask, 0xffffffff, 255, &new_matrix, m_Flags, TRUE)) {
+ image_render.Continue(NULL);
+ }
+ if (m_Loader.m_MatteColor != 0xffffffff) {
+ int matte_r = FXARGB_R(m_Loader.m_MatteColor);
+ int matte_g = FXARGB_G(m_Loader.m_MatteColor);
+ int matte_b = FXARGB_B(m_Loader.m_MatteColor);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)bitmap_device1.GetBitmap()->GetScanline(row);
+ FX_LPCBYTE mask_scan = bitmap_device2.GetBitmap()->GetScanline(row);
+ for (int col = 0; col < width; col ++) {
+ int alpha = *mask_scan ++;
+ if (alpha) {
+ int orig = (*dest_scan - matte_b) * 255 / alpha + matte_b;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_g) * 255 / alpha + matte_g;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ orig = (*dest_scan - matte_r) * 255 / alpha + matte_r;
+ if (orig < 0) {
+ orig = 0;
+ } else if (orig > 255) {
+ orig = 255;
+ }
+ *dest_scan++ = orig;
+ dest_scan ++;
+ } else {
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ bitmap_device2.GetBitmap()->ConvertFormat(FXDIB_8bppMask);
+ bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap());
+ if (m_BitmapAlpha < 255) {
+ bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha);
+ }
+ }
+ m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left, rect.top, m_BlendType);
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartDIBSource()
+{
+#if !defined(_FPDFAPI_MINI_)
+ if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) {
+ int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * m_pDIBSource->GetHeight();
+ if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTONE)) {
+ m_Flags |= RENDER_FORCE_DOWNSAMPLE;
+ }
+ }
+#endif
+ if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_FillArgb,
+ &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) {
+ if (m_DeviceHandle != NULL) {
+ m_Status = 3;
+ return TRUE;
+ }
+ return FALSE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) ||
+ (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) {
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return FALSE;
+ }
+ FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
+ clip_box.Intersect(image_rect);
+ m_Status = 2;
+ m_pTransformer = FX_NEW CFX_ImageTransformer;
+ m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box);
+ return TRUE;
+ }
+ if (m_ImageMatrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ if (m_ImageMatrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ int dest_left, dest_top;
+ dest_left = dest_width > 0 ? image_rect.left : image_rect.right;
+ dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom;
+ if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) {
+ if (m_pRenderStatus->m_pDevice->StretchDIBits(m_pDIBSource, dest_left, dest_top,
+ dest_width, dest_height, m_Flags, NULL, m_BlendType)) {
+ return FALSE;
+ }
+ }
+ if (m_pDIBSource->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+ }
+ if (m_pRenderStatus->m_pDevice->StretchBitMask(m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) {
+ return FALSE;
+ }
+ }
+ if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
+ m_Result = FALSE;
+ return TRUE;
+ }
+ FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
+ FX_RECT dest_rect = clip_box;
+ dest_rect.Intersect(image_rect);
+ FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
+ dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
+ CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip);
+ if (pStretched) {
+ m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb,
+ m_BitmapAlpha, m_BlendType, FALSE);
+ delete pStretched;
+ pStretched = NULL;
+ }
+#endif
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha()
+{
+#ifndef _FPDFAPI_MINI_
+ if (m_pDIBSource->IsOpaqueImage()) {
+ CFX_PathData path;
+ path.AppendRect(0, 0, 1, 1);
+ path.Transform(&m_ImageMatrix);
+ FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);
+ m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, FXFILL_WINDING);
+ } else {
+ const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSource : m_pDIBSource->GetAlphaMask();
+ if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {
+ int left, top;
+ CFX_DIBitmap* pTransformed = pAlphaMask->TransformTo(&m_ImageMatrix, left, top);
+ if (pTransformed == NULL) {
+ return TRUE;
+ }
+ m_pRenderStatus->m_pDevice->SetBitMask(pTransformed, left, top, ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
+ delete pTransformed;
+ } else {
+ CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ int dest_width = m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();
+ int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();
+ int left = dest_width > 0 ? image_rect.left : image_rect.right;
+ int top = dest_height > 0 ? image_rect.top : image_rect.bottom;
+ m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, dest_width, dest_height,
+ ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
+ }
+ if (m_pDIBSource != pAlphaMask) {
+ delete pAlphaMask;
+ }
+ }
+#endif
+ return FALSE;
+}
+FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+#ifndef _FPDFAPI_MINI_
+ if (m_pQuickStretcher->Continue(pPause)) {
+ return TRUE;
+ }
+ if (m_pQuickStretcher->m_pBitmap->IsAlphaMask())
+ m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
+ m_pQuickStretcher->m_ResultTop, m_FillArgb);
+ else
+ m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap, m_pQuickStretcher->m_ResultLeft,
+ m_pQuickStretcher->m_ResultTop, m_BlendType);
+ return FALSE;
+#endif
+ } else if (m_Status == 2) {
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ if (m_pTransformer->Continue(pPause)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha);
+ }
+ m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap,
+ m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_FillArgb);
+ } else {
+ if (m_BitmapAlpha != 255) {
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ }
+ m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap,
+ m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, m_BlendType);
+ }
+ delete pBitmap;
+ return FALSE;
+#endif
+ } else if (m_Status == 3) {
+ return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause);
+ } else if (m_Status == 4) {
+ if (m_Loader.Continue(m_LoadHandle, pPause)) {
+ return TRUE;
+ }
+ if (StartRenderDIBSource()) {
+ return Continue(pPause);
+ }
+ return FALSE;
+ }
+ return FALSE;
+}
+CPDF_QuickStretcher::CPDF_QuickStretcher()
+{
+ m_pBitmap = NULL;
+ m_pDecoder = NULL;
+ m_pCS = NULL;
+}
+CPDF_QuickStretcher::~CPDF_QuickStretcher()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ if (m_pCS) {
+ m_pCS->ReleaseCS();
+ }
+ if (m_pDecoder) {
+ delete m_pDecoder;
+ }
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams);
+FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox)
+{
+ if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) {
+ return FALSE;
+ }
+ CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ m_DestWidth = image_rect.Width();
+ m_DestHeight = image_rect.Height();
+ m_bFlipX = pImage2Device->a < 0;
+ m_bFlipY = pImage2Device->d > 0;
+ FX_RECT result_rect = *pClipBox;
+ result_rect.Intersect(image_rect);
+ if (result_rect.IsEmpty()) {
+ return FALSE;
+ }
+ m_ResultWidth = result_rect.Width();
+ m_ResultHeight = result_rect.Height();
+ m_ResultLeft = result_rect.left;
+ m_ResultTop = result_rect.top;
+ m_ClipLeft = result_rect.left - image_rect.left;
+ m_ClipTop = result_rect.top - image_rect.top;
+ CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict();
+ if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) {
+ return FALSE;
+ }
+ if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) {
+ return FALSE;
+ }
+ m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width"));
+ m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height"));
+ m_pCS = NULL;
+ m_Bpp = 3;
+ CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj);
+ if (m_pCS == NULL) {
+ return FALSE;
+ }
+ if (!_IsSupported(m_pCS)) {
+ return FALSE;
+ }
+ m_Bpp = m_pCS->CountComponents();
+ if (m_pCS->sRGB()) {
+ m_pCS->ReleaseCS();
+ m_pCS = NULL;
+ }
+ CPDF_Stream* pStream = pImageObj->m_pImage->GetStream();
+ m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE);
+ m_pDecoder = NULL;
+ if (!m_StreamAcc.GetImageDecoder().IsEmpty()) {
+ if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) {
+ const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam();
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(
+ m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp,
+ pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1);
+ } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) {
+ m_pDecoder = FPDFAPI_CreateFlateDecoder(
+ m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8,
+ m_StreamAcc.GetImageParam());
+ } else {
+ return FALSE;
+ }
+ m_pDecoder->DownScale(m_DestWidth, m_DestHeight);
+ }
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32);
+#else
+ m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb);
+#endif
+ m_LineIndex = 0;
+ return TRUE;
+}
+FX_BOOL CPDF_QuickStretcher::Continue(IFX_Pause* pPause)
+{
+ FX_LPBYTE result_buf = m_pBitmap->GetBuffer();
+ int src_width = m_pDecoder ? m_pDecoder->GetWidth() : m_SrcWidth;
+ int src_height = m_pDecoder ? m_pDecoder->GetHeight() : m_SrcHeight;
+ int src_pitch = src_width * m_Bpp;
+ while (m_LineIndex < m_ResultHeight) {
+ int dest_y, src_y;
+ if (m_bFlipY) {
+ dest_y = m_ResultHeight - m_LineIndex - 1;
+ src_y = (m_DestHeight - (dest_y + m_ClipTop) - 1) * src_height / m_DestHeight;
+ } else {
+ dest_y = m_LineIndex;
+ src_y = (dest_y + m_ClipTop) * src_height / m_DestHeight;
+ }
+ FX_LPCBYTE src_scan;
+ if (m_pDecoder) {
+ src_scan = m_pDecoder->GetScanline(src_y);
+ if (src_scan == NULL) {
+ break;
+ }
+ } else {
+ src_scan = m_StreamAcc.GetData();
+ if (src_scan == NULL) {
+ break;
+ }
+ src_scan += src_y * src_pitch;
+ }
+ FX_LPBYTE result_scan = result_buf + dest_y * m_pBitmap->GetPitch();
+ for (int x = 0; x < m_ResultWidth; x ++) {
+ int dest_x = m_ClipLeft + x;
+ int src_x = (m_bFlipX ? (m_DestWidth - dest_x - 1) : dest_x) * src_width / m_DestWidth;
+ FX_LPCBYTE src_pixel = src_scan + src_x * m_Bpp;
+ if (m_pCS == NULL) {
+ *result_scan = src_pixel[2];
+ result_scan ++;
+ *result_scan = src_pixel[1];
+ result_scan ++;
+ *result_scan = src_pixel[0];
+ result_scan ++;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result_scan ++;
+#endif
+ } else {
+ m_pCS->TranslateImageLine(result_scan, src_pixel, 1, 0, 0);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result_scan += 4;
+#else
+ result_scan += 3;
+#endif
+ }
+ }
+ m_LineIndex ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,
+ FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix)
+{
+ if (pSMaskDict == NULL) {
+ return NULL;
+ }
+ CFX_DIBitmap* pMask = NULL;
+ int width = pClipRect->right - pClipRect->left;
+ int height = pClipRect->bottom - pClipRect->top;
+ FX_BOOL bLuminosity = FALSE;
+ bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha");
+ CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G"));
+ if (pGroup == NULL) {
+ return NULL;
+ }
+ CPDF_Function* pFunc = NULL;
+ CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
+ if (pFuncObj && (pFuncObj->GetType() == PDFOBJ_DICTIONARY || pFuncObj->GetType() == PDFOBJ_STREAM)) {
+ pFunc = CPDF_Function::Load(pFuncObj);
+ }
+ CFX_AffineMatrix matrix = *pMatrix;
+ matrix.TranslateI(-pClipRect->left, -pClipRect->top);
+ CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);
+ form.ParseContent(NULL, NULL, NULL, NULL);
+ CFX_FxgeDevice bitmap_device;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {
+ return NULL;
+ }
+#else
+ if (!bitmap_device.Create(width, height, bLuminosity ? FXDIB_Rgb : FXDIB_8bppMask)) {
+ return NULL;
+ }
+#endif
+ CFX_DIBitmap& bitmap = *bitmap_device.GetBitmap();
+ CPDF_Object* pCSObj = NULL;
+ CPDF_ColorSpace* pCS = NULL;
+ if (bLuminosity) {
+ CPDF_Array* pBC = pSMaskDict->GetArray(FX_BSTRC("BC"));
+ FX_ARGB back_color = 0xff000000;
+ if (pBC) {
+ pCSObj = pGroup->GetDict()->GetDict(FX_BSTRC("Group"))->GetElementValue(FX_BSTRC("CS"));
+ pCS = m_pContext->m_pDocument->LoadColorSpace(pCSObj);
+ if (pCS) {
+ FX_FLOAT R, G, B;
+ FX_DWORD num_floats = 8;
+ if (pCS->CountComponents() > (FX_INT32)num_floats) {
+ num_floats = (FX_DWORD)pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 8> float_array(num_floats);
+ FX_FLOAT* pFloats = float_array;
+ FXSYS_memset32(pFloats, 0, num_floats * sizeof(FX_FLOAT));
+ int count = pBC->GetCount() > 8 ? 8 : pBC->GetCount();
+ for (int i = 0; i < count; i ++) {
+ pFloats[i] = pBC->GetNumber(i);
+ }
+ pCS->GetRGB(pFloats, R, G, B);
+ back_color = 0xff000000 | ((FX_INT32)(R * 255) << 16) | ((FX_INT32)(G * 255) << 8) | (FX_INT32)(B * 255);
+ m_pContext->m_pDocument->GetPageData()->ReleaseColorSpace(pCSObj);
+ }
+ }
+ bitmap.Clear(back_color);
+ } else {
+ bitmap.Clear(0);
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ if (form.m_pFormDict) {
+ pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ CPDF_RenderOptions options;
+ options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,
+ &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, pCS ? pCS->GetFamily() : 0, bLuminosity);
+ status.RenderObjectList(&form, &matrix);
+ pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask->Create(width, height, FXDIB_8bppMask)) {
+ delete pMask;
+ return NULL;
+ }
+ FX_LPBYTE dest_buf = pMask->GetBuffer();
+ int dest_pitch = pMask->GetPitch();
+ FX_LPBYTE src_buf = bitmap.GetBuffer();
+ int src_pitch = bitmap.GetPitch();
+ FX_LPBYTE pTransfer = FX_Alloc(FX_BYTE, 256);
+ if (pFunc) {
+ CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());
+ for (int i = 0; i < 256; i ++) {
+ FX_FLOAT input = (FX_FLOAT)i / 255.0f;
+ int nresult;
+ pFunc->Call(&input, 1, results, nresult);
+ pTransfer[i] = FXSYS_round(results[0] * 255);
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pTransfer[i] = i;
+ }
+ }
+ if (bLuminosity) {
+ int Bpp = bitmap.GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_pos = dest_buf + row * dest_pitch;
+ FX_LPBYTE src_pos = src_buf + row * src_pitch;
+ for (int col = 0; col < width; col ++) {
+ *dest_pos ++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
+ src_pos += Bpp;
+ }
+ }
+ } else if (pFunc) {
+ int size = dest_pitch * height;
+ for (int i = 0; i < size; i ++) {
+ dest_buf[i] = pTransfer[src_buf[i]];
+ }
+ } else {
+ FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height);
+ }
+ if (pFunc) {
+ delete pFunc;
+ }
+ FX_Free(pTransfer);
+ return pMask;
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
new file mode 100644
index 0000000000..fcb5271cc3
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp
@@ -0,0 +1,1524 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fpdfapi/fpdf_module.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+#include <limits.h>
+static unsigned int _GetBits8(FX_LPCBYTE pData, int bitpos, int nbits)
+{
+ unsigned int byte = pData[bitpos / 8];
+ if (nbits == 8) {
+ return byte;
+ } else if (nbits == 4) {
+ return (bitpos % 8) ? (byte & 0x0f) : (byte >> 4);
+ } else if (nbits == 2) {
+ return (byte >> (6 - bitpos % 8)) & 0x03;
+ } else if (nbits == 1) {
+ return (byte >> (7 - bitpos % 8)) & 0x01;
+ } else if (nbits == 16) {
+ return byte * 256 + pData[bitpos / 8 + 1];
+ }
+ return 0;
+}
+CFX_DIBSource* CPDF_Image::LoadDIBSource(CFX_DIBSource** ppMask, FX_DWORD* pMatteColor, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask) const
+{
+ CPDF_DIBSource* pSource = FX_NEW CPDF_DIBSource;
+ if (pSource->Load(m_pDocument, m_pStream, (CPDF_DIBSource**)ppMask, pMatteColor, NULL, NULL, bStdCS, GroupFamily, bLoadMask)) {
+ return pSource;
+ }
+ delete pSource;
+ return NULL;
+}
+CFX_DIBSource* CPDF_Image::DetachBitmap()
+{
+ CFX_DIBSource* pBitmap = m_pDIBSource;
+ m_pDIBSource = NULL;
+ return pBitmap;
+}
+CFX_DIBSource* CPDF_Image::DetachMask()
+{
+ CFX_DIBSource* pBitmap = m_pMask;
+ m_pMask = NULL;
+ return pBitmap;
+}
+FX_BOOL CPDF_Image::StartLoadDIBSource(CPDF_Dictionary* pFormResource, CPDF_Dictionary* pPageResource, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ m_pDIBSource = FX_NEW CPDF_DIBSource;
+ int ret = ((CPDF_DIBSource*)m_pDIBSource)->StartLoadDIBSource(m_pDocument, m_pStream, TRUE, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);
+ if (ret == 2) {
+ return TRUE;
+ }
+ if (!ret) {
+ delete m_pDIBSource;
+ m_pDIBSource = NULL;
+ return FALSE;
+ }
+ m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
+ m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
+ return FALSE;
+}
+FX_BOOL CPDF_Image::Continue(IFX_Pause* pPause)
+{
+ int ret = ((CPDF_DIBSource*)m_pDIBSource)->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return TRUE;
+ }
+ if (!ret) {
+ delete m_pDIBSource;
+ m_pDIBSource = NULL;
+ return FALSE;
+ }
+ m_pMask = ((CPDF_DIBSource*)m_pDIBSource)->DetachMask();
+ m_MatteColor = ((CPDF_DIBSource*)m_pDIBSource)->m_MatteColor;
+ return FALSE;
+}
+CPDF_DIBSource::CPDF_DIBSource()
+{
+ m_pDocument = NULL;
+ m_pStreamAcc = NULL;
+ m_pDict = NULL;
+ m_bpp = 0;
+ m_Width = m_Height = 0;
+ m_pColorSpace = NULL;
+ m_bDefaultDecode = TRUE;
+ m_bImageMask = FALSE;
+ m_pPalette = NULL;
+ m_pCompData = NULL;
+ m_bColorKey = FALSE;
+ m_pMaskedLine = m_pLineBuf = NULL;
+ m_pCachedBitmap = NULL;
+ m_pDecoder = NULL;
+ m_nComponents = 0;
+ m_bpc = 0;
+ m_bLoadMask = FALSE;
+ m_Family = 0;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+ m_pJbig2Context = NULL;
+ m_pGlobalStream = NULL;
+ m_bStdCS = FALSE;
+ m_pMaskStream = NULL;
+ m_Status = 0;
+ m_bHasMask = FALSE;
+}
+CPDF_DIBSource::~CPDF_DIBSource()
+{
+ if (m_pStreamAcc) {
+ delete m_pStreamAcc;
+ }
+ if (m_pMaskedLine) {
+ FX_Free(m_pMaskedLine);
+ }
+ if (m_pLineBuf) {
+ FX_Free(m_pLineBuf);
+ }
+ if (m_pCachedBitmap) {
+ delete m_pCachedBitmap;
+ }
+ if (m_pDecoder) {
+ delete m_pDecoder;
+ }
+ if (m_pCompData) {
+ FX_Free(m_pCompData);
+ }
+ CPDF_ColorSpace* pCS = m_pColorSpace;
+ if (pCS && m_pDocument) {
+ m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray());
+ }
+ if (m_pJbig2Context) {
+ ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ }
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+}
+CFX_DIBitmap* CPDF_DIBSource::GetBitmap() const
+{
+ if (m_pCachedBitmap) {
+ return m_pCachedBitmap;
+ }
+ return Clone();
+}
+void CPDF_DIBSource::ReleaseBitmap(CFX_DIBitmap* pBitmap) const
+{
+ if (pBitmap && pBitmap != m_pCachedBitmap) {
+ delete pBitmap;
+ }
+}
+FX_BOOL CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream, CPDF_DIBSource** ppMask,
+ FX_DWORD* pMatteColor, CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ if (pStream == NULL) {
+ return FALSE;
+ }
+ m_pDocument = pDoc;
+ m_pDict = pStream->GetDict();
+ m_pStream = pStream;
+ m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
+ m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
+ if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
+ return FALSE;
+ }
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
+ return FALSE;
+ }
+ FX_DWORD src_pitch = m_bpc;
+ if (m_bpc != 0 && m_nComponents != 0) {
+ if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ src_pitch *= m_nComponents;
+ if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ src_pitch *= m_Width;
+ if (src_pitch + 7 < src_pitch) {
+ return FALSE;
+ }
+ src_pitch += 7;
+ src_pitch /= 8;
+ if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
+ return FALSE;
+ }
+ }
+ m_pStreamAcc = FX_NEW CPDF_StreamAcc;
+ m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
+ if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
+ return FALSE;
+ }
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_bpc = 1;
+ }
+ if (!CreateDecoder()) {
+ return FALSE;
+ }
+ if (m_bImageMask) {
+ m_bpp = 1;
+ m_bpc = 1;
+ m_nComponents = 1;
+ m_AlphaFlag = 1;
+ } else if (m_bpc * m_nComponents == 1) {
+ m_bpp = 1;
+ } else if (m_bpc * m_nComponents <= 8) {
+ m_bpp = 8;
+ } else {
+ m_bpp = 24;
+ }
+ if (!m_bpc || !m_nComponents) {
+ return FALSE;
+ }
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pColorSpace && bStdCS) {
+ m_pColorSpace->EnableStdConversion(TRUE);
+ }
+ LoadPalette();
+ if (m_bColorKey) {
+ m_bpp = 32;
+ m_AlphaFlag = 2;
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return FALSE;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ if (ppMask) {
+ *ppMask = LoadMask(*pMatteColor);
+ }
+ if (m_pColorSpace && bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return TRUE;
+}
+int CPDF_DIBSource::ContinueToLoadMask()
+{
+ if (m_bImageMask) {
+ m_bpp = 1;
+ m_bpc = 1;
+ m_nComponents = 1;
+ m_AlphaFlag = 1;
+ } else if (m_bpc * m_nComponents == 1) {
+ m_bpp = 1;
+ } else if (m_bpc * m_nComponents <= 8) {
+ m_bpp = 8;
+ } else {
+ m_bpp = 24;
+ }
+ if (!m_bpc || !m_nComponents) {
+ return 0;
+ }
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return 0;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return 0;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(TRUE);
+ }
+ LoadPalette();
+ if (m_bColorKey) {
+ m_bpp = 32;
+ m_AlphaFlag = 2;
+ m_Pitch = m_Width;
+ if ((FX_DWORD)m_bpp > (unsigned)INT_MAX / m_Pitch) {
+ return 0;
+ }
+ m_Pitch *= m_bpp;
+ if (m_Pitch + 31 < m_Pitch) {
+ return 0;
+ }
+ m_Pitch += 31;
+ m_Pitch = m_Pitch / 32 * 4;
+ m_pMaskedLine = FX_Alloc(FX_BYTE, m_Pitch);
+ }
+ return 1;
+}
+int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask)
+{
+ if (pStream == NULL) {
+ return 0;
+ }
+ m_pDocument = pDoc;
+ m_pDict = pStream->GetDict();
+ m_pStream = pStream;
+ m_bStdCS = bStdCS;
+ m_bHasMask = bHasMask;
+ m_Width = m_pDict->GetInteger(FX_BSTRC("Width"));
+ m_Height = m_pDict->GetInteger(FX_BSTRC("Height"));
+ if (m_Width <= 0 || m_Height <= 0 || m_Width > 0x01ffff || m_Height > 0x01ffff) {
+ return 0;
+ }
+ m_GroupFamily = GroupFamily;
+ m_bLoadMask = bLoadMask;
+ if (!LoadColorInfo(m_pStream->GetObjNum() != 0 ? NULL : pFormResources, pPageResources)) {
+ return 0;
+ }
+ FX_DWORD src_pitch = m_bpc;
+ if (m_bpc != 0 && m_nComponents != 0) {
+ if (src_pitch > 0 && m_nComponents > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ src_pitch *= m_nComponents;
+ if (src_pitch > 0 && (FX_DWORD)m_Width > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ src_pitch *= m_Width;
+ if (src_pitch + 7 < src_pitch) {
+ return 0;
+ }
+ src_pitch += 7;
+ src_pitch /= 8;
+ if (src_pitch > 0 && (FX_DWORD)m_Height > (unsigned)INT_MAX / src_pitch) {
+ return 0;
+ }
+ }
+ m_pStreamAcc = FX_NEW CPDF_StreamAcc;
+ m_pStreamAcc->LoadAllData(pStream, FALSE, m_Height * src_pitch, TRUE);
+ if (m_pStreamAcc->GetSize() == 0 || m_pStreamAcc->GetData() == NULL) {
+ return 0;
+ }
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (!decoder.IsEmpty() && decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_bpc = 1;
+ }
+ int ret = CreateDecoder();
+ if (ret != 1) {
+ if (!ret) {
+ return ret;
+ }
+ if (!ContinueToLoadMask()) {
+ return 0;
+ }
+ if (m_bHasMask) {
+ StratLoadMask();
+ }
+ return ret;
+ }
+ if (!ContinueToLoadMask()) {
+ return 0;
+ }
+ if (m_bHasMask) {
+ ret = StratLoadMask();
+ }
+ if (ret == 2) {
+ return ret;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret;
+}
+int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause)
+{
+ FXCODEC_STATUS ret;
+ if (m_Status == 1) {
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (decoder == FX_BSTRC("JPXDecode")) {
+ return 0;
+ }
+ ICodec_Jbig2Module* pJbig2Moudle = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ if (m_pJbig2Context == NULL) {
+ m_pJbig2Context = pJbig2Moudle->CreateJbig2Context();
+ if (m_pStreamAcc->GetImageParam()) {
+ CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
+ if (pGlobals) {
+ m_pGlobalStream = FX_NEW CPDF_StreamAcc;
+ m_pGlobalStream->LoadAllData(pGlobals, FALSE);
+ }
+ }
+ ret = pJbig2Moudle->StartDecode(m_pJbig2Context, m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
+ m_pGlobalStream ? m_pGlobalStream->GetData() : NULL, m_pGlobalStream ? m_pGlobalStream->GetSize() : 0, m_pCachedBitmap->GetBuffer(),
+ m_pCachedBitmap->GetPitch(), pPause);
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ return 0;
+ }
+ if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return 2;
+ }
+ int ret1 = 1;
+ if (m_bHasMask) {
+ ret1 = ContinueLoadMaskDIB(pPause);
+ m_Status = 2;
+ }
+ if (ret1 == 2) {
+ return ret1;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret1;
+ }
+ FXCODEC_STATUS ret = pJbig2Moudle->ContinueDecode(m_pJbig2Context, pPause);
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ if (m_pGlobalStream) {
+ delete m_pGlobalStream;
+ }
+ m_pGlobalStream = NULL;
+ pJbig2Moudle->DestroyJbig2Context(m_pJbig2Context);
+ m_pJbig2Context = NULL;
+ return 0;
+ }
+ if (ret == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return 2;
+ }
+ int ret1 = 1;
+ if (m_bHasMask) {
+ ret1 = ContinueLoadMaskDIB(pPause);
+ m_Status = 2;
+ }
+ if (ret1 == 2) {
+ return ret1;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ return ret1;
+ } else if (m_Status == 2) {
+ return ContinueLoadMaskDIB(pPause);
+ }
+ return 0;
+}
+FX_BOOL CPDF_DIBSource::LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources)
+{
+ if (m_pDict->GetInteger("ImageMask")) {
+ m_bImageMask = TRUE;
+ }
+ if (m_bImageMask || !m_pDict->KeyExist(FX_BSTRC("ColorSpace"))) {
+ if (!m_bImageMask) {
+ CPDF_Object* pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
+ if (pFilter) {
+ CFX_ByteString filter;
+ if (pFilter->GetType() == PDFOBJ_NAME) {
+ filter = pFilter->GetString();
+ if (filter == FX_BSTRC("JPXDecode")) {
+ return TRUE;
+ }
+ } else if (pFilter->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFilter;
+ if (pArray->GetString(pArray->GetCount() - 1) == FX_BSTRC("JPXDecode")) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ m_bImageMask = TRUE;
+ m_bpc = m_nComponents = 1;
+ CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
+ m_bDefaultDecode = pDecode == NULL || pDecode->GetInteger(0) == 0;
+ return TRUE;
+ }
+ CPDF_Object* pCSObj = m_pDict->GetElementValue(FX_BSTRC("ColorSpace"));
+ if (pCSObj == NULL) {
+ return FALSE;
+ }
+ CPDF_DocPageData* pDocPageData = m_pDocument->GetPageData();
+ if (pFormResources) {
+ m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pFormResources);
+ }
+ if (m_pColorSpace == NULL) {
+ m_pColorSpace = pDocPageData->GetColorSpace(pCSObj, pPageResources);
+ }
+ if (m_pColorSpace == NULL) {
+ return FALSE;
+ }
+ m_bpc = m_pDict->GetInteger(FX_BSTRC("BitsPerComponent"));
+ m_Family = m_pColorSpace->GetFamily();
+ m_nComponents = m_pColorSpace->CountComponents();
+ if (m_Family == PDFCS_ICCBASED && pCSObj->GetType() == PDFOBJ_NAME) {
+ CFX_ByteString cs = pCSObj->GetString();
+ if (cs == FX_BSTRC("DeviceGray")) {
+ m_nComponents = 1;
+ } else if (cs == FX_BSTRC("DeviceRGB")) {
+ m_nComponents = 3;
+ } else if (cs == FX_BSTRC("DeviceCMYK")) {
+ m_nComponents = 4;
+ }
+ }
+ m_pCompData = FX_Alloc(DIB_COMP_DATA, m_nComponents);
+ if (m_bpc == 0) {
+ return TRUE;
+ }
+ int max_data = (1 << m_bpc) - 1;
+ CPDF_Array* pDecode = m_pDict->GetArray(FX_BSTRC("Decode"));
+ if (pDecode) {
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ m_pCompData[i].m_DecodeMin = pDecode->GetNumber(i * 2);
+ FX_FLOAT max = pDecode->GetNumber(i * 2 + 1);
+ m_pCompData[i].m_DecodeStep = (max - m_pCompData[i].m_DecodeMin) / max_data;
+ FX_FLOAT def_value, def_min, def_max;
+ m_pColorSpace->GetDefaultValue(i, def_value, def_min, def_max);
+ if (m_Family == PDFCS_INDEXED) {
+ def_max = (FX_FLOAT)max_data;
+ }
+ if (def_min != m_pCompData[i].m_DecodeMin || def_max != max) {
+ m_bDefaultDecode = FALSE;
+ }
+ }
+ } else {
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ FX_FLOAT def_value;
+ m_pColorSpace->GetDefaultValue(i, def_value, m_pCompData[i].m_DecodeMin, m_pCompData[i].m_DecodeStep);
+ if (m_Family == PDFCS_INDEXED) {
+ m_pCompData[i].m_DecodeStep = (FX_FLOAT)max_data;
+ }
+ m_pCompData[i].m_DecodeStep = (m_pCompData[i].m_DecodeStep - m_pCompData[i].m_DecodeMin) / max_data;
+ }
+ }
+ if (!m_pDict->KeyExist(FX_BSTRC("SMask"))) {
+ CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (pMask == NULL) {
+ return TRUE;
+ }
+ if (pMask->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pMask;
+ if (pArray->GetCount() >= m_nComponents * 2)
+ for (FX_DWORD i = 0; i < m_nComponents * 2; i ++) {
+ if (i % 2) {
+ m_pCompData[i / 2].m_ColorKeyMax = pArray->GetInteger(i);
+ } else {
+ m_pCompData[i / 2].m_ColorKeyMin = pArray->GetInteger(i);
+ }
+ }
+ m_bColorKey = TRUE;
+ }
+ }
+ return TRUE;
+}
+ICodec_ScanlineDecoder* FPDFAPI_CreateFaxDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ const CPDF_Dictionary* pParams);
+ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, const CPDF_Dictionary* pParams);
+int CPDF_DIBSource::CreateDecoder()
+{
+ const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder();
+ if (decoder.IsEmpty()) {
+ return 1;
+ }
+ FX_LPCBYTE src_data = m_pStreamAcc->GetData();
+ FX_DWORD src_size = m_pStreamAcc->GetSize();
+ const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam();
+ if (decoder == FX_BSTRC("CCITTFaxDecode")) {
+ m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams);
+ } else if (decoder == FX_BSTRC("DCTDecode")) {
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
+ m_nComponents, pParams ? pParams->GetInteger(FX_BSTR("ColorTransform"), 1) : 1);
+ if (NULL == m_pDecoder) {
+ FX_BOOL bTransform = FALSE;
+ int comps, bpc;
+ ICodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule();
+ if (pJpegModule->LoadInfo(src_data, src_size, m_Width, m_Height, comps, bpc, bTransform)) {
+ m_nComponents = comps;
+ m_bpc = bpc;
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder(src_data, src_size, m_Width, m_Height,
+ m_nComponents, bTransform);
+ }
+ }
+ } else if (decoder == FX_BSTRC("FlateDecode")) {
+ m_pDecoder = FPDFAPI_CreateFlateDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams);
+ } else if (decoder == FX_BSTRC("JPXDecode")) {
+ LoadJpxBitmap();
+ return m_pCachedBitmap != NULL ? 1 : 0;
+ } else if (decoder == FX_BSTRC("JBIG2Decode")) {
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return 0;
+ }
+ m_Status = 1;
+ return 2;
+ } else if (decoder == FX_BSTRC("RunLengthDecode")) {
+ m_pDecoder = CPDF_ModuleMgr::Get()->GetCodecModule()->GetBasicModule()->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc);
+ }
+ if (m_pDecoder) {
+ int requested_pitch = (m_Width * m_nComponents * m_bpc + 7) / 8;
+ int provided_pitch = (m_pDecoder->GetWidth() * m_pDecoder->CountComps() * m_pDecoder->GetBPC() + 7) / 8;
+ if (provided_pitch < requested_pitch) {
+ return 0;
+ }
+ return 1;
+ }
+ return 0;
+}
+void CPDF_DIBSource::LoadJpxBitmap()
+{
+ ICodec_JpxModule* pJpxModule = CPDF_ModuleMgr::Get()->GetJpxModule();
+ if (pJpxModule == NULL) {
+ return;
+ }
+ FX_LPVOID ctx = pJpxModule->CreateDecoder(m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(), m_pColorSpace != NULL);
+ if (ctx == NULL) {
+ return;
+ }
+ FX_DWORD width = 0, height = 0, codestream_nComps = 0, image_nComps = 0;
+ pJpxModule->GetImageInfo(ctx, width, height, codestream_nComps, image_nComps);
+ if ((int)width < m_Width || (int)height < m_Height) {
+ pJpxModule->DestroyDecoder(ctx);
+ return;
+ }
+ int output_nComps;
+ FX_BOOL bTranslateColor, bSwapRGB = FALSE;
+ if (m_pColorSpace) {
+ if (codestream_nComps != (FX_DWORD)m_pColorSpace->CountComponents()) {
+ return;
+ }
+ output_nComps = codestream_nComps;
+ bTranslateColor = FALSE;
+ if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB)) {
+ bSwapRGB = TRUE;
+ m_pColorSpace = NULL;
+ }
+ } else {
+ bTranslateColor = TRUE;
+ if (image_nComps) {
+ output_nComps = image_nComps;
+ } else {
+ output_nComps = codestream_nComps;
+ }
+ if (output_nComps == 3) {
+ bSwapRGB = TRUE;
+ } else if (output_nComps == 4) {
+ m_pColorSpace = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
+ bTranslateColor = FALSE;
+ }
+ m_nComponents = output_nComps;
+ }
+ FXDIB_Format format;
+ if (output_nComps == 1) {
+ format = FXDIB_8bppRgb;
+ } else if (output_nComps <= 3) {
+ format = FXDIB_Rgb;
+ } else if (output_nComps == 4) {
+ format = FXDIB_Rgb32;
+ } else {
+ width = (width * output_nComps + 2) / 3;
+ format = FXDIB_Rgb;
+ }
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(width, height, format)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return;
+ }
+ m_pCachedBitmap->Clear(0xFFFFFFFF);
+ FX_LPBYTE output_offsets = FX_Alloc(FX_BYTE, output_nComps);
+ for (int i = 0; i < output_nComps; i ++) {
+ output_offsets[i] = i;
+ }
+ if (bSwapRGB) {
+ output_offsets[0] = 2;
+ output_offsets[2] = 0;
+ }
+ if (!pJpxModule->Decode(ctx, m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), bTranslateColor, output_offsets)) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ return;
+ }
+ FX_Free(output_offsets);
+ pJpxModule->DestroyDecoder(ctx);
+ if (m_pColorSpace && m_pColorSpace->GetFamily() == PDFCS_INDEXED && m_bpc < 8) {
+ int scale = 8 - m_bpc;
+ for (FX_DWORD row = 0; row < height; row ++) {
+ FX_LPBYTE scanline = (FX_LPBYTE)m_pCachedBitmap->GetScanline(row);
+ for (FX_DWORD col = 0; col < width; col ++) {
+ *scanline = (*scanline) >> scale;
+ scanline++;
+ }
+ }
+ }
+ m_bpc = 8;
+}
+void CPDF_DIBSource::LoadJbig2Bitmap()
+{
+ ICodec_Jbig2Module* pJbig2Module = CPDF_ModuleMgr::Get()->GetJbig2Module();
+ if (pJbig2Module == NULL) {
+ return;
+ }
+ CPDF_StreamAcc* pGlobalStream = NULL;
+ if (m_pStreamAcc->GetImageParam()) {
+ CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStream(FX_BSTRC("JBIG2Globals"));
+ if (pGlobals) {
+ pGlobalStream = FX_NEW CPDF_StreamAcc;
+ pGlobalStream->LoadAllData(pGlobals, FALSE);
+ }
+ }
+ m_pCachedBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pCachedBitmap->Create(m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) {
+ return;
+ }
+ int ret = pJbig2Module->Decode(m_Width, m_Height, m_pStreamAcc->GetData(), m_pStreamAcc->GetSize(),
+ pGlobalStream ? pGlobalStream->GetData() : NULL, pGlobalStream ? pGlobalStream->GetSize() : 0,
+ m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch());
+ if (ret < 0) {
+ delete m_pCachedBitmap;
+ m_pCachedBitmap = NULL;
+ }
+ if (pGlobalStream) {
+ delete pGlobalStream;
+ }
+ m_bpc = 1;
+ m_nComponents = 1;
+}
+CPDF_DIBSource* CPDF_DIBSource::LoadMask(FX_DWORD& MatteColor)
+{
+ MatteColor = 0xffffffff;
+ CPDF_Stream* pSoftMask = m_pDict->GetStream(FX_BSTRC("SMask"));
+ if (pSoftMask) {
+ CPDF_Array* pMatte = pSoftMask->GetDict()->GetArray(FX_BSTRC("Matte"));
+ if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
+ FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ pColor[i] = pMatte->GetFloat(i);
+ }
+ FX_FLOAT R, G, B;
+ m_pColorSpace->GetRGB(pColor, R, G, B);
+ FX_Free(pColor);
+ MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ }
+ return LoadMaskDIB(pSoftMask);
+ }
+ CPDF_Object* pMask = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (pMask == NULL) {
+ return NULL;
+ }
+ if (pMask->GetType() == PDFOBJ_STREAM) {
+ return LoadMaskDIB((CPDF_Stream*)pMask);
+ }
+ return NULL;
+}
+int CPDF_DIBSource::StratLoadMask()
+{
+ m_MatteColor = 0xffffffff;
+ m_pMaskStream = m_pDict->GetStream(FX_BSTRC("SMask"));
+ if (m_pMaskStream) {
+ CPDF_Array* pMatte = m_pMaskStream->GetDict()->GetArray(FX_BSTRC("Matte"));
+ if (pMatte != NULL && m_pColorSpace && (FX_DWORD)m_pColorSpace->CountComponents() <= m_nComponents) {
+ FX_FLOAT R, G, B;
+ FX_FLOAT* pColor = FX_Alloc(FX_FLOAT, m_nComponents);
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ pColor[i] = pMatte->GetFloat(i);
+ }
+ m_pColorSpace->GetRGB(pColor, R, G, B);
+ FX_Free(pColor);
+ m_MatteColor = FXARGB_MAKE(0, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ }
+ return StartLoadMaskDIB();
+ }
+ m_pMaskStream = m_pDict->GetElementValue(FX_BSTRC("Mask"));
+ if (m_pMaskStream == NULL) {
+ return 1;
+ }
+ if (m_pMaskStream->GetType() == PDFOBJ_STREAM) {
+ return StartLoadMaskDIB();
+ }
+ return 1;
+}
+int CPDF_DIBSource::ContinueLoadMaskDIB(IFX_Pause* pPause)
+{
+ if (m_pMask == NULL) {
+ return 1;
+ }
+ int ret = m_pMask->ContinueLoadDIBSource(pPause);
+ if (ret == 2) {
+ return ret;
+ }
+ if (m_pColorSpace && m_bStdCS) {
+ m_pColorSpace->EnableStdConversion(FALSE);
+ }
+ if (!ret) {
+ delete m_pMask;
+ m_pMask = NULL;
+ return ret;
+ }
+ return 1;
+}
+CPDF_DIBSource* CPDF_DIBSource::DetachMask()
+{
+ CPDF_DIBSource* pDIBSource = m_pMask;
+ m_pMask = NULL;
+ return pDIBSource;
+}
+CPDF_DIBSource* CPDF_DIBSource::LoadMaskDIB(CPDF_Stream* pMask)
+{
+ CPDF_DIBSource* pMaskSource = FX_NEW CPDF_DIBSource;
+ if (!pMaskSource->Load(m_pDocument, pMask, NULL, NULL, NULL, NULL, TRUE)) {
+ delete pMaskSource;
+ return NULL;
+ }
+ return pMaskSource;
+}
+int CPDF_DIBSource::StartLoadMaskDIB()
+{
+ m_pMask = FX_NEW CPDF_DIBSource;
+ int ret = m_pMask->StartLoadDIBSource(m_pDocument, (CPDF_Stream*)m_pMaskStream, FALSE, NULL, NULL, TRUE);
+ if (ret == 2) {
+ if (m_Status == 0) {
+ m_Status = 2;
+ }
+ return 2;
+ }
+ if (!ret) {
+ delete m_pMask;
+ m_pMask = NULL;
+ return 1;
+ }
+ return 1;
+}
+void CPDF_DIBSource::LoadPalette()
+{
+ if (m_bpc * m_nComponents > 8) {
+ return;
+ }
+ if (m_pColorSpace == NULL) {
+ return;
+ }
+ if (m_bpc * m_nComponents == 1) {
+ if (m_bDefaultDecode && (m_Family == PDFCS_DEVICEGRAY || m_Family == PDFCS_DEVICERGB)) {
+ return;
+ }
+ if (m_pColorSpace->CountComponents() > 3) {
+ return;
+ }
+ FX_FLOAT color_values[3];
+ color_values[0] = m_pCompData[0].m_DecodeMin;
+ color_values[1] = color_values[2] = color_values[0];
+ FX_FLOAT R, G, B;
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ FX_ARGB argb0 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ color_values[0] += m_pCompData[0].m_DecodeStep;
+ color_values[1] += m_pCompData[0].m_DecodeStep;
+ color_values[2] += m_pCompData[0].m_DecodeStep;
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ FX_ARGB argb1 = ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255));
+ if (argb0 != 0xFF000000 || argb1 != 0xFFFFFFFF) {
+ SetPaletteArgb(0, argb0);
+ SetPaletteArgb(1, argb1);
+ }
+ return;
+ }
+ if (m_pColorSpace == CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY) && m_bpc == 8 && m_bDefaultDecode) {
+ } else {
+ int palette_count = 1 << (m_bpc * m_nComponents);
+ CFX_FixedBufGrow<FX_FLOAT, 16> color_values(m_nComponents);
+ FX_FLOAT* color_value = color_values;
+ for (int i = 0; i < palette_count; i ++) {
+ int color_data = i;
+ for (FX_DWORD j = 0; j < m_nComponents; j ++) {
+ int encoded_component = color_data % (1 << m_bpc);
+ color_data /= 1 << m_bpc;
+ color_value[j] = m_pCompData[j].m_DecodeMin + m_pCompData[j].m_DecodeStep * encoded_component;
+ }
+ FX_FLOAT R = 0, G = 0, B = 0;
+ if (m_nComponents == 1 && m_Family == PDFCS_ICCBASED && m_pColorSpace->CountComponents() > 1) {
+ int nComponents = m_pColorSpace->CountComponents();
+ FX_FLOAT* temp_buf = FX_Alloc(FX_FLOAT, nComponents);
+ for (int i = 0; i < nComponents; i++) {
+ temp_buf[i] = *color_value;
+ }
+ m_pColorSpace->GetRGB(temp_buf, R, G, B);
+ FX_Free(temp_buf);
+ } else {
+ m_pColorSpace->GetRGB(color_value, R, G, B);
+ }
+ SetPaletteArgb(i, ArgbEncode(255, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ }
+}
+
+FX_DWORD CPDF_DIBSource::GetValidBpp() const
+{
+ FX_DWORD bpc = m_bpc;
+ CPDF_Object * pFilter = m_pDict->GetElementValue(FX_BSTRC("Filter"));
+ if(pFilter)
+ {
+ if(pFilter->GetType() == PDFOBJ_NAME)
+ {
+ CFX_ByteString filter = pFilter->GetString();
+ if(filter == FX_BSTRC("CCITTFaxDecode") || filter == FX_BSTRC("JBIG2Decode") )
+ bpc = 1;
+ if(filter == FX_BSTRC("RunLengthDecode") || filter == FX_BSTRC("DCTDecode") )
+ bpc = 8;
+ }
+ else if (pFilter->GetType() == PDFOBJ_ARRAY)
+ {
+ CPDF_Array *pArray = (CPDF_Array *) pFilter;
+ if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("CCITTFacDecode") ||
+ pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("JBIG2Decode") )
+ bpc = 1;
+
+ if( pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("RunLengthDecode") ||
+ pArray->GetString(pArray->GetCount() -1) == FX_BSTRC("DCTDecode") )
+ bpc = 8;
+ }
+ }
+
+ return bpc;
+}
+
+#define NORMALCOLOR_MAX(color, max) (color) > (max) ? (max) : (color) < 0 ? 0 : (color);
+void CPDF_DIBSource::TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const
+{
+ int max_data = (1 << m_bpc) - 1;
+ if (m_bDefaultDecode) {
+ if (m_Family == PDFCS_DEVICERGB || m_Family == PDFCS_CALRGB) {
+ if (m_bpc == 16) {
+ FX_LPBYTE dest_pos = dest_scan;
+ FX_LPCBYTE src_pos = src_scan;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan++ = src_pos[4];
+ *dest_scan++ = src_pos[2];
+ *dest_scan++ = *src_pos;
+ src_pos += 6;
+ }
+ } else if (m_bpc == 8) {
+ FX_LPBYTE dest_pos = dest_scan;
+ FX_LPCBYTE src_pos = src_scan;
+ for (int column = 0; column < m_Width; column ++) {
+ *dest_scan++ = src_pos[2];
+ *dest_scan++ = src_pos[1];
+ *dest_scan++ = *src_pos;
+ src_pos += 3;
+ }
+ } else {
+ int src_bit_pos = 0;
+ int dest_byte_pos = 0;
+
+ FX_DWORD bpc = GetValidBpp();
+
+ for (int column = 0; column < m_Width; column ++) {
+ int R = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ int G = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ int B = _GetBits8(src_scan, src_bit_pos, bpc);
+ src_bit_pos += bpc;
+ R = NORMALCOLOR_MAX(R, max_data);
+ G = NORMALCOLOR_MAX(G, max_data);
+ B = NORMALCOLOR_MAX(B, max_data);
+ dest_scan[dest_byte_pos] = B * 255 / max_data;
+ dest_scan[dest_byte_pos + 1] = G * 255 / max_data;
+ dest_scan[dest_byte_pos + 2] = R * 255 / max_data;
+ dest_byte_pos += 3;
+ }
+ }
+ return;
+ } else if (m_bpc == 8) {
+ if (m_nComponents == m_pColorSpace->CountComponents())
+ m_pColorSpace->TranslateImageLine(dest_scan, src_scan, m_Width, m_Width, m_Height,
+ m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ return;
+ }
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> color_values1(m_nComponents);
+ FX_FLOAT* color_values = color_values1;
+ FX_FLOAT R, G, B;
+ if (m_bpc == 8) {
+ int src_byte_pos = 0;
+ int dest_byte_pos = 0;
+ for (int column = 0; column < m_Width; column ++) {
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = src_scan[src_byte_pos ++];
+ color_values[color] = m_pCompData[color].m_DecodeMin +
+ m_pCompData[color].m_DecodeStep * data;
+ }
+ if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
+ FX_FLOAT k = 1.0f - color_values[3];
+ R = (1.0f - color_values[0]) * k;
+ G = (1.0f - color_values[1]) * k;
+ B = (1.0f - color_values[2]) * k;
+ } else {
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ }
+ R = NORMALCOLOR_MAX(R, 1);
+ G = NORMALCOLOR_MAX(G, 1);
+ B = NORMALCOLOR_MAX(B, 1);
+ dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
+ dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
+ dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
+ dest_byte_pos += 3;
+ }
+ } else {
+ int src_bit_pos = 0;
+ int dest_byte_pos = 0;
+
+ FX_DWORD bpc = GetValidBpp();
+
+ for (int column = 0; column < m_Width; column ++) {
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(src_scan, src_bit_pos, bpc);
+ color_values[color] = m_pCompData[color].m_DecodeMin +
+ m_pCompData[color].m_DecodeStep * data;
+ src_bit_pos += bpc;
+ }
+ if (m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK) {
+ FX_FLOAT k = 1.0f - color_values[3];
+ R = (1.0f - color_values[0]) * k;
+ G = (1.0f - color_values[1]) * k;
+ B = (1.0f - color_values[2]) * k;
+ } else {
+ m_pColorSpace->GetRGB(color_values, R, G, B);
+ }
+ R = NORMALCOLOR_MAX(R, 1);
+ G = NORMALCOLOR_MAX(G, 1);
+ B = NORMALCOLOR_MAX(B, 1);
+ dest_scan[dest_byte_pos] = (FX_INT32)(B * 255);
+ dest_scan[dest_byte_pos + 1] = (FX_INT32)(G * 255);
+ dest_scan[dest_byte_pos + 2] = (FX_INT32)(R * 255);
+ dest_byte_pos += 3;
+ }
+ }
+}
+FX_LPBYTE CPDF_DIBSource::GetBuffer() const
+{
+ if (m_pCachedBitmap) {
+ return m_pCachedBitmap->GetBuffer();
+ }
+ return NULL;
+}
+FX_LPCBYTE CPDF_DIBSource::GetScanline(int line) const
+{
+ FX_DWORD src_pitch = (m_Width * m_bpc * m_nComponents + 7) / 8;
+ FX_LPCBYTE pSrcLine = NULL;
+ if (m_pCachedBitmap) {
+ if (line >= m_pCachedBitmap->GetHeight()) {
+ line = m_pCachedBitmap->GetHeight() - 1;
+ }
+ pSrcLine = m_pCachedBitmap->GetScanline(line);
+ } else if (m_pDecoder) {
+ pSrcLine = m_pDecoder->GetScanline(line);
+ } else {
+ if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
+ pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
+ }
+ }
+ if (pSrcLine == NULL) {
+ FX_LPBYTE pLineBuf = m_pMaskedLine ? m_pMaskedLine : m_pLineBuf;
+ FXSYS_memset8(pLineBuf, 0xff, m_Pitch);
+ return pLineBuf;
+ }
+ if (m_bpc * m_nComponents == 1) {
+ if (m_bImageMask && m_bDefaultDecode) {
+ for (FX_DWORD i = 0; i < src_pitch; i ++) {
+ m_pLineBuf[i] = ~pSrcLine[i];
+ }
+ } else if (m_bColorKey) {
+ FX_DWORD reset_argb, set_argb;
+ reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
+ set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
+ if (m_pCompData[0].m_ColorKeyMin == 0) {
+ reset_argb = 0;
+ }
+ if (m_pCompData[0].m_ColorKeyMax == 1) {
+ set_argb = 0;
+ }
+ set_argb = FXARGB_TODIB(set_argb);
+ reset_argb = FXARGB_TODIB(reset_argb);
+ FX_DWORD* dest_scan = (FX_DWORD*)m_pMaskedLine;
+ for (int col = 0; col < m_Width; col ++) {
+ if (pSrcLine[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = set_argb;
+ } else {
+ *dest_scan = reset_argb;
+ }
+ dest_scan ++;
+ }
+ return m_pMaskedLine;
+ } else {
+ FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
+ }
+ return m_pLineBuf;
+ }
+ if (m_bpc * m_nComponents <= 8) {
+ if (m_bpc == 8) {
+ FXSYS_memcpy32(m_pLineBuf, pSrcLine, src_pitch);
+ } else {
+ int src_bit_pos = 0;
+ for (int col = 0; col < m_Width; col ++) {
+ int color_index = 0;
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
+ color_index |= data << (color * m_bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pLineBuf[col] = color_index;
+ }
+ }
+ if (m_bColorKey) {
+ FX_LPBYTE pDestPixel = m_pMaskedLine;
+ FX_LPCBYTE pSrcPixel = m_pLineBuf;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE index = *pSrcPixel++;
+ if (m_pPalette) {
+ *pDestPixel++ = FXARGB_B(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_G(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_R(m_pPalette[index]);
+ } else {
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ }
+ *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
+ pDestPixel ++ ;
+ }
+ return m_pMaskedLine;
+ }
+ return m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ if (m_nComponents == 3 && m_bpc == 8) {
+ FX_LPBYTE alpha_channel = m_pMaskedLine + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_LPCBYTE pPixel = pSrcLine + col * 3;
+ alpha_channel[col * 4] = (pPixel[0] < m_pCompData[0].m_ColorKeyMin ||
+ pPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+ pPixel[1] < m_pCompData[1].m_ColorKeyMin || pPixel[1] > m_pCompData[1].m_ColorKeyMax ||
+ pPixel[2] < m_pCompData[2].m_ColorKeyMin || pPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
+ }
+ } else {
+ FXSYS_memset8(m_pMaskedLine, 0xff, m_Pitch);
+ }
+ }
+ if (m_pColorSpace) {
+ TranslateScanline24bpp(m_pLineBuf, pSrcLine);
+ pSrcLine = m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ FX_LPCBYTE pSrcPixel = pSrcLine;
+ FX_LPBYTE pDestPixel = m_pMaskedLine;
+ for (int col = 0; col < m_Width; col ++) {
+ *pDestPixel++ = *pSrcPixel++;
+ *pDestPixel++ = *pSrcPixel++;
+ *pDestPixel++ = *pSrcPixel++;
+ pDestPixel ++;
+ }
+ return m_pMaskedLine;
+ }
+ return pSrcLine;
+}
+FX_BOOL CPDF_DIBSource::SkipToScanline(int line, IFX_Pause* pPause) const
+{
+ if (m_pDecoder) {
+ return m_pDecoder->SkipToScanline(line, pPause);
+ }
+ return FALSE;
+}
+void CPDF_DIBSource::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ FX_DWORD src_width = m_Width;
+ FX_DWORD src_pitch = (src_width * m_bpc * m_nComponents + 7) / 8;
+ FX_LPCBYTE pSrcLine = NULL;
+ if (m_pCachedBitmap) {
+ pSrcLine = m_pCachedBitmap->GetScanline(line);
+ } else if (m_pDecoder) {
+ pSrcLine = m_pDecoder->GetScanline(line);
+ } else {
+ if (m_pStreamAcc->GetSize() >= (line + 1) * src_pitch) {
+ pSrcLine = m_pStreamAcc->GetData() + line * src_pitch;
+ }
+ }
+ int orig_Bpp = m_bpc * m_nComponents / 8;
+ int dest_Bpp = dest_bpp / 8;
+ if (pSrcLine == NULL) {
+ FXSYS_memset32(dest_scan, 0xff, dest_Bpp * clip_width);
+ return;
+ }
+ CFX_FixedBufGrow<FX_BYTE, 128> temp(orig_Bpp);
+ if (m_bpc * m_nComponents == 1) {
+ FX_DWORD set_argb = (FX_DWORD) - 1, reset_argb = 0;
+ if (m_bImageMask) {
+ if (m_bDefaultDecode) {
+ set_argb = 0;
+ reset_argb = (FX_DWORD) - 1;
+ }
+ } else if (m_bColorKey) {
+ reset_argb = m_pPalette ? m_pPalette[0] : 0xff000000;
+ set_argb = m_pPalette ? m_pPalette[1] : 0xffffffff;
+ if (m_pCompData[0].m_ColorKeyMin == 0) {
+ reset_argb = 0;
+ }
+ if (m_pCompData[0].m_ColorKeyMax == 1) {
+ set_argb = 0;
+ }
+ set_argb = FXARGB_TODIB(set_argb);
+ reset_argb = FXARGB_TODIB(reset_argb);
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+ ((FX_DWORD*)dest_scan)[i] = set_argb;
+ } else {
+ ((FX_DWORD*)dest_scan)[i] = reset_argb;
+ }
+ }
+ return;
+ } else {
+ if (dest_Bpp == 1) {
+ } else if (m_pPalette) {
+ reset_argb = m_pPalette[0];
+ set_argb = m_pPalette[1];
+ }
+ }
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ int dest_pos = i * dest_Bpp;
+ if (pSrcLine[src_x / 8] & (1 << (7 - src_x % 8))) {
+ if (dest_Bpp == 1) {
+ dest_scan[dest_pos] = (FX_BYTE)set_argb;
+ } else if (dest_Bpp == 3) {
+ dest_scan[dest_pos] = FXARGB_B(set_argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(set_argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(set_argb);
+ } else {
+ *(FX_DWORD*)(dest_scan + dest_pos) = set_argb;
+ }
+ } else {
+ if (dest_Bpp == 1) {
+ dest_scan[dest_pos] = (FX_BYTE)reset_argb;
+ } else if (dest_Bpp == 3) {
+ dest_scan[dest_pos] = FXARGB_B(reset_argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(reset_argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(reset_argb);
+ } else {
+ *(FX_DWORD*)(dest_scan + dest_pos) = reset_argb;
+ }
+ }
+ }
+ return;
+ } else if (m_bpc * m_nComponents <= 8) {
+ if (m_bpc < 8) {
+ int src_bit_pos = 0;
+ for (FX_DWORD col = 0; col < src_width; col ++) {
+ int color_index = 0;
+ for (FX_DWORD color = 0; color < m_nComponents; color ++) {
+ int data = _GetBits8(pSrcLine, src_bit_pos, m_bpc);
+ color_index |= data << (color * m_bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pLineBuf[col] = color_index;
+ }
+ pSrcLine = m_pLineBuf;
+ }
+ if (m_bColorKey) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ FX_LPBYTE pDestPixel = dest_scan + i * 4;
+ FX_BYTE index = pSrcLine[src_x];
+ if (m_pPalette) {
+ *pDestPixel++ = FXARGB_B(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_G(m_pPalette[index]);
+ *pDestPixel++ = FXARGB_R(m_pPalette[index]);
+ } else {
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ *pDestPixel++ = index;
+ }
+ *pDestPixel = (index < m_pCompData[0].m_ColorKeyMin || index > m_pCompData[0].m_ColorKeyMax) ? 0xff : 0;
+ }
+ return;
+ }
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD src_x = (clip_left + i) * src_width / dest_width;
+ if (bFlipX) {
+ src_x = src_width - src_x - 1;
+ }
+ src_x %= src_width;
+ FX_BYTE index = pSrcLine[src_x];
+ if (dest_Bpp == 1) {
+ dest_scan[i] = index;
+ } else {
+ int dest_pos = i * dest_Bpp;
+ FX_ARGB argb = m_pPalette[index];
+ dest_scan[dest_pos] = FXARGB_B(argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(argb);
+ }
+ }
+ return;
+ } else {
+ int last_src_x = -1;
+ FX_ARGB last_argb;
+ FX_FLOAT orig_Not8Bpp = (FX_FLOAT)m_bpc * (FX_FLOAT)m_nComponents / 8.0f;
+ FX_FLOAT unit_To8Bpc = 255.0f / ((1 << m_bpc) - 1);
+ for (int i = 0; i < clip_width; i ++) {
+ int dest_x = clip_left + i;
+ FX_DWORD src_x = (bFlipX ? (dest_width - dest_x - 1) : dest_x) * (FX_INT64)src_width / dest_width;
+ src_x %= src_width;
+ FX_LPCBYTE pSrcPixel = NULL;
+ if (m_bpc % 8 == 0) {
+ pSrcPixel = pSrcLine + src_x * orig_Bpp;
+ } else {
+ pSrcPixel = pSrcLine + (int)(src_x * orig_Not8Bpp);
+ }
+ FX_LPBYTE pDestPixel = dest_scan + i * dest_Bpp;
+ FX_ARGB argb;
+ if (src_x == last_src_x) {
+ argb = last_argb;
+ } else {
+ if (m_pColorSpace) {
+ FX_BYTE color[4];
+ if (!m_bDefaultDecode) {
+ for (int i = 0; i < orig_Bpp; i ++) {
+ int color_value = (int)((m_pCompData[i].m_DecodeMin + m_pCompData[i].m_DecodeStep * (FX_FLOAT)pSrcPixel[i]) * 255.0f + 0.5f);
+ temp[i] = color_value > 255 ? 255 : (color_value < 0 ? 0 : color_value);
+ }
+ m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ } else {
+ if (m_bpc < 8) {
+ int src_bit_pos = 0;
+ if (src_x % 2) {
+ src_bit_pos = 4;
+ }
+ int value = (1 << m_bpc) - 1;
+ for (FX_DWORD i = 0; i < m_nComponents; i ++) {
+ temp[i] = (FX_BYTE)(_GetBits8(pSrcPixel, src_bit_pos, m_bpc) * unit_To8Bpc);
+ src_bit_pos += m_bpc;
+ }
+ m_pColorSpace->TranslateImageLine(color, temp, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ } else {
+ m_pColorSpace->TranslateImageLine(color, pSrcPixel, 1, 0, 0, m_bLoadMask && m_GroupFamily == PDFCS_DEVICECMYK && m_Family == PDFCS_DEVICECMYK);
+ }
+ }
+ argb = FXARGB_MAKE(0xff, color[2], color[1], color[0]);
+ } else {
+ argb = FXARGB_MAKE(0xff, pSrcPixel[2], pSrcPixel[1], pSrcPixel[0]);
+ }
+ if (m_bColorKey) {
+ int alpha = 0xff;
+ if (m_nComponents == 3 && m_bpc == 8) {
+ alpha = (pSrcPixel[0] < m_pCompData[0].m_ColorKeyMin ||
+ pSrcPixel[0] > m_pCompData[0].m_ColorKeyMax ||
+ pSrcPixel[1] < m_pCompData[1].m_ColorKeyMin ||
+ pSrcPixel[1] > m_pCompData[1].m_ColorKeyMax ||
+ pSrcPixel[2] < m_pCompData[2].m_ColorKeyMin ||
+ pSrcPixel[2] > m_pCompData[2].m_ColorKeyMax) ? 0xff : 0;
+ }
+ argb &= 0xffffff;
+ argb |= alpha << 24;
+ }
+ last_src_x = src_x;
+ last_argb = argb;
+ }
+ if (dest_Bpp == 4) {
+ *(FX_DWORD*)pDestPixel = FXARGB_TODIB(argb);
+ } else {
+ *pDestPixel++ = FXARGB_B(argb);
+ *pDestPixel++ = FXARGB_G(argb);
+ *pDestPixel = FXARGB_R(argb);
+ }
+ }
+ }
+}
+void CPDF_DIBSource::SetDownSampleSize(int dest_width, int dest_height) const
+{
+ if (m_pDecoder) {
+ m_pDecoder->DownScale(dest_width, dest_height);
+ ((CPDF_DIBSource*)this)->m_Width = m_pDecoder->GetWidth();
+ ((CPDF_DIBSource*)this)->m_Height = m_pDecoder->GetHeight();
+ }
+}
+void CPDF_DIBSource::ClearImageData()
+{
+ if (m_pDecoder) {
+ m_pDecoder->ClearImageData();
+ }
+}
+CPDF_ProgressiveImageLoaderHandle::CPDF_ProgressiveImageLoaderHandle()
+{
+ m_pImageLoader = NULL;
+ m_pCache = NULL;
+ m_pImage = NULL;
+}
+CPDF_ProgressiveImageLoaderHandle::~CPDF_ProgressiveImageLoaderHandle()
+{
+ m_pImageLoader = NULL;
+ m_pCache = NULL;
+ m_pImage = NULL;
+}
+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
+{
+ m_pImageLoader = pImageLoader;
+ m_pCache = pCache;
+ m_pImage = (CPDF_ImageObject*)pImage;
+ m_nDownsampleWidth = nDownsampleWidth;
+ m_nDownsampleHeight = nDownsampleHeight;
+ FX_BOOL ret;
+ if (pCache) {
+ ret = pCache->StartGetCachedBitmap(pImage->m_pImage->GetStream(), bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = TRUE;
+ m_pImageLoader->m_pBitmap = pCache->m_pCurImageCache->DetachBitmap();
+ m_pImageLoader->m_pMask = pCache->m_pCurImageCache->DetachMask();
+ m_pImageLoader->m_MatteColor = pCache->m_pCurImageCache->m_MatteColor;
+ }
+ } else {
+ ret = pImage->m_pImage->StartLoadDIBSource(pRenderStatus->m_pFormResource, pRenderStatus->m_pPageResource, bStdCS, GroupFamily, bLoadMask);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = FALSE;
+ m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_ProgressiveImageLoaderHandle::Continue(IFX_Pause* pPause)
+{
+ FX_BOOL ret;
+ if (m_pCache) {
+ ret = m_pCache->Continue(pPause);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = TRUE;
+ m_pImageLoader->m_pBitmap = m_pCache->m_pCurImageCache->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pCache->m_pCurImageCache->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pCache->m_pCurImageCache->m_MatteColor;
+ }
+ } else {
+ ret = m_pImage->m_pImage->Continue(pPause);
+ if (ret == FALSE) {
+ m_pImageLoader->m_bCached = FALSE;
+ m_pImageLoader->m_pBitmap = m_pImage->m_pImage->DetachBitmap();
+ m_pImageLoader->m_pMask = m_pImage->m_pImage->DetachMask();
+ m_pImageLoader->m_MatteColor = m_pImage->m_pImage->m_MatteColor;
+ }
+ }
+ return ret;
+}
+FX_BOOL CPDF_ImageLoader::Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus)
+{
+ if (pImage == NULL) {
+ return FALSE;
+ }
+ if (pCache) {
+ pCache->GetCachedBitmap(pImage->m_pImage->GetStream(), m_pBitmap, m_pMask, m_MatteColor, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ m_bCached = TRUE;
+ } else {
+ m_pBitmap = pImage->m_pImage->LoadDIBSource(&m_pMask, &m_MatteColor, bStdCS, GroupFamily, bLoadMask);
+ m_bCached = FALSE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_ImageLoader::StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS, FX_DWORD GroupFamily, FX_BOOL bLoadMask, CPDF_RenderStatus* pRenderStatus, FX_INT32 nDownsampleWidth, FX_INT32 nDownsampleHeight)
+{
+ m_nDownsampleWidth = nDownsampleWidth;
+ m_nDownsampleHeight = nDownsampleHeight;
+ CPDF_ProgressiveImageLoaderHandle* pLoaderHandle = NULL;
+ pLoaderHandle = FX_NEW CPDF_ProgressiveImageLoaderHandle;
+ FX_BOOL ret = pLoaderHandle->Start(this, pImage, pCache, bStdCS, GroupFamily, bLoadMask, pRenderStatus, m_nDownsampleWidth, m_nDownsampleHeight);
+ LoadHandle = pLoaderHandle;
+ return ret;
+}
+FX_BOOL CPDF_ImageLoader::Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause)
+{
+ return ((CPDF_ProgressiveImageLoaderHandle*)LoadHandle)->Continue(pPause);
+}
+CPDF_ImageLoader::~CPDF_ImageLoader()
+{
+ if (!m_bCached) {
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ }
+ if (m_pMask) {
+ delete m_pMask;
+ }
+ }
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
new file mode 100644
index 0000000000..8cc30a72a1
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp
@@ -0,0 +1,1093 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+#define SHADING_STEPS 256
+static void _DrawAxialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
+ if (pCoords == NULL) {
+ return;
+ }
+ FX_FLOAT start_x = pCoords->GetNumber(0);
+ FX_FLOAT start_y = pCoords->GetNumber(1);
+ FX_FLOAT end_x = pCoords->GetNumber(2);
+ FX_FLOAT end_y = pCoords->GetNumber(3);
+ FX_FLOAT t_min = 0, t_max = 1.0f;
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pArray) {
+ t_min = pArray->GetNumber(0);
+ t_max = pArray->GetNumber(1);
+ }
+ FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
+ pArray = pDict->GetArray(FX_BSTRC("Extend"));
+ if (pArray) {
+ bStartExtend = pArray->GetInteger(0);
+ bEndExtend = pArray->GetInteger(1);
+ }
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ FX_FLOAT x_span = end_x - start_x;
+ FX_FLOAT y_span = end_y - start_y;
+ FX_FLOAT axis_len_square = FXSYS_Mul(x_span, x_span) + FXSYS_Mul(y_span, y_span);
+ CFX_AffineMatrix matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ FX_DWORD rgb_array[SHADING_STEPS];
+ for (int i = 0; i < SHADING_STEPS; i ++) {
+ FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
+ int offset = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults = 0;
+ if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ FX_FLOAT scale = FXSYS_Div(FXSYS_Mul(x - start_x, x_span) + FXSYS_Mul(y - start_y, y_span), axis_len_square);
+ int index = (FX_INT32)(scale * (SHADING_STEPS - 1));
+ if (index < 0) {
+ if (!bStartExtend) {
+ continue;
+ }
+ index = 0;
+ } else if (index >= SHADING_STEPS) {
+ if (!bEndExtend) {
+ continue;
+ }
+ index = SHADING_STEPS - 1;
+ }
+ dib_buf[column] = rgb_array[index];
+ }
+ }
+}
+static void _DrawRadialShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pCoords = pDict->GetArray(FX_BSTRC("Coords"));
+ if (pCoords == NULL) {
+ return;
+ }
+ FX_FLOAT start_x = pCoords->GetNumber(0);
+ FX_FLOAT start_y = pCoords->GetNumber(1);
+ FX_FLOAT start_r = pCoords->GetNumber(2);
+ FX_FLOAT end_x = pCoords->GetNumber(3);
+ FX_FLOAT end_y = pCoords->GetNumber(4);
+ FX_FLOAT end_r = pCoords->GetNumber(5);
+ CFX_AffineMatrix matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ FX_FLOAT t_min = 0, t_max = 1.0f;
+ CPDF_Array* pArray = pDict->GetArray(FX_BSTRC("Domain"));
+ if (pArray) {
+ t_min = pArray->GetNumber(0);
+ t_max = pArray->GetNumber(1);
+ }
+ FX_BOOL bStartExtend = FALSE, bEndExtend = FALSE;
+ pArray = pDict->GetArray(FX_BSTRC("Extend"));
+ if (pArray) {
+ bStartExtend = pArray->GetInteger(0);
+ bEndExtend = pArray->GetInteger(1);
+ }
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ FX_DWORD rgb_array[SHADING_STEPS];
+ for (int i = 0; i < SHADING_STEPS; i ++) {
+ FX_FLOAT input = (t_max - t_min) * i / SHADING_STEPS + t_min;
+ int offset = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults;
+ if (pFuncs[j]->Call(&input, 1, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ rgb_array[i] = FXARGB_TODIB(FXARGB_MAKE(alpha, FXSYS_round(R * 255), FXSYS_round(G * 255), FXSYS_round(B * 255)));
+ }
+ FX_FLOAT a = FXSYS_Mul(start_x - end_x, start_x - end_x) +
+ FXSYS_Mul(start_y - end_y, start_y - end_y) - FXSYS_Mul(start_r - end_r, start_r - end_r);
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ FX_BOOL bDecreasing = FALSE;
+ if (start_r > end_r) {
+ int length = (int)FXSYS_sqrt((FXSYS_Mul(start_x - end_x, start_x - end_x) + FXSYS_Mul(start_y - end_y, start_y - end_y)));
+ if (length < start_r - end_r) {
+ bDecreasing = TRUE;
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ FX_FLOAT b = -2 * (FXSYS_Mul(x - start_x, end_x - start_x) + FXSYS_Mul(y - start_y, end_y - start_y) +
+ FXSYS_Mul(start_r, end_r - start_r));
+ FX_FLOAT c = FXSYS_Mul(x - start_x, x - start_x) + FXSYS_Mul(y - start_y, y - start_y) -
+ FXSYS_Mul(start_r, start_r);
+ FX_FLOAT s;
+ if (a == 0) {
+ s = FXSYS_Div(-c, b);
+ } else {
+ FX_FLOAT b2_4ac = FXSYS_Mul(b, b) - 4 * FXSYS_Mul(a, c);
+ if (b2_4ac < 0) {
+ continue;
+ }
+ FX_FLOAT root = FXSYS_sqrt(b2_4ac);
+ FX_FLOAT s1, s2;
+ if (a > 0) {
+ s1 = FXSYS_Div(-b - root, 2 * a);
+ s2 = FXSYS_Div(-b + root, 2 * a);
+ } else {
+ s2 = FXSYS_Div(-b - root, 2 * a);
+ s1 = FXSYS_Div(-b + root, 2 * a);
+ }
+ if (bDecreasing) {
+ if (s1 >= 0 || bStartExtend) {
+ s = s1;
+ } else {
+ s = s2;
+ }
+ } else {
+ if (s2 <= 1.0f || bEndExtend) {
+ s = s2;
+ } else {
+ s = s1;
+ }
+ }
+ if ((start_r + s * (end_r - start_r)) < 0) {
+ continue;
+ }
+ }
+ int index = (FX_INT32)(s * (SHADING_STEPS - 1));
+ if (index < 0) {
+ if (!bStartExtend) {
+ continue;
+ }
+ index = 0;
+ }
+ if (index >= SHADING_STEPS) {
+ if (!bEndExtend) {
+ continue;
+ }
+ index = SHADING_STEPS - 1;
+ }
+ dib_buf[column] = rgb_array[index];
+ }
+ }
+}
+static void _DrawFuncShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Dictionary* pDict, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ CPDF_Array* pDomain = pDict->GetArray(FX_BSTRC("Domain"));
+ FX_FLOAT xmin = 0, ymin = 0, xmax = 1.0f, ymax = 1.0f;
+ if (pDomain) {
+ xmin = pDomain->GetNumber(0);
+ xmax = pDomain->GetNumber(1);
+ ymin = pDomain->GetNumber(2);
+ ymax = pDomain->GetNumber(3);
+ }
+ CFX_AffineMatrix mtDomain2Target = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ CFX_AffineMatrix matrix, reverse_matrix;
+ matrix.SetReverse(*pObject2Bitmap);
+ reverse_matrix.SetReverse(mtDomain2Target);
+ matrix.Concat(reverse_matrix);
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ int pitch = pBitmap->GetPitch();
+ int Bpp = pBitmap->GetBPP() / 8;
+ int total_results = 0;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ total_results += pFuncs[j]->CountOutputs();
+ }
+ }
+ if (pCS->CountComponents() > total_results) {
+ total_results = pCS->CountComponents();
+ }
+ CFX_FixedBufGrow<FX_FLOAT, 16> result_array(total_results);
+ FX_FLOAT* pResults = result_array;
+ FXSYS_memset32(pResults, 0, total_results * sizeof(FX_FLOAT));
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dib_buf = (FX_DWORD*)(pBitmap->GetBuffer() + row * pitch);
+ for (int column = 0; column < width; column ++) {
+ FX_FLOAT x = (FX_FLOAT)column, y = (FX_FLOAT)row;
+ matrix.Transform(x, y);
+ if (x < xmin || x > xmax || y < ymin || y > ymax) {
+ continue;
+ }
+ FX_FLOAT input[2];
+ int offset = 0;
+ input[0] = x;
+ input[1] = y;
+ for (int j = 0; j < nFuncs; j ++) {
+ if (pFuncs[j]) {
+ int nresults;
+ if (pFuncs[j]->Call(input, 2, pResults + offset, nresults)) {
+ offset += nresults;
+ }
+ }
+ }
+ FX_FLOAT R, G, B;
+ pCS->GetRGB(pResults, R, G, B);
+ dib_buf[column] = FXARGB_TODIB(FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
+ }
+ }
+}
+FX_BOOL _GetScanlineIntersect(int y, FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_FLOAT& x)
+{
+ if (y1 == y2) {
+ return FALSE;
+ }
+ if (y1 < y2) {
+ if (y < y1 || y > y2) {
+ return FALSE;
+ }
+ } else {
+ if (y < y2 || y > y1) {
+ return FALSE;
+ }
+ }
+ x = x1 + FXSYS_MulDiv(x2 - x1, y - y1, y2 - y1);
+ return TRUE;
+}
+static void _DrawGouraud(CFX_DIBitmap* pBitmap, int alpha, CPDF_MeshVertex triangle[3])
+{
+ FX_FLOAT min_y = triangle[0].y, max_y = triangle[0].y;
+ for (int i = 1; i < 3; i ++) {
+ if (min_y > triangle[i].y) {
+ min_y = triangle[i].y;
+ }
+ if (max_y < triangle[i].y) {
+ max_y = triangle[i].y;
+ }
+ }
+ if (min_y == max_y) {
+ return;
+ }
+ int min_yi = (int)FXSYS_floor(min_y), max_yi = (int)FXSYS_ceil(max_y);
+ if (min_yi < 0) {
+ min_yi = 0;
+ }
+ if (max_yi >= pBitmap->GetHeight()) {
+ max_yi = pBitmap->GetHeight() - 1;
+ }
+ for (int y = min_yi; y <= max_yi; y ++) {
+ int nIntersects = 0;
+ FX_FLOAT inter_x[3], r[3], g[3], b[3];
+ for (int i = 0; i < 3; i ++) {
+ CPDF_MeshVertex& vertex1 = triangle[i];
+ CPDF_MeshVertex& vertex2 = triangle[(i + 1) % 3];
+ FX_BOOL bIntersect = _GetScanlineIntersect(y, vertex1.x, vertex1.y,
+ vertex2.x, vertex2.y, inter_x[nIntersects]);
+ if (!bIntersect) {
+ continue;
+ }
+ r[nIntersects] = vertex1.r + FXSYS_MulDiv(vertex2.r - vertex1.r, y - vertex1.y, vertex2.y - vertex1.y);
+ g[nIntersects] = vertex1.g + FXSYS_MulDiv(vertex2.g - vertex1.g, y - vertex1.y, vertex2.y - vertex1.y);
+ b[nIntersects] = vertex1.b + FXSYS_MulDiv(vertex2.b - vertex1.b, y - vertex1.y, vertex2.y - vertex1.y);
+ nIntersects ++;
+ }
+ if (nIntersects != 2) {
+ continue;
+ }
+ int min_x, max_x, start_index, end_index;
+ if (inter_x[0] < inter_x[1]) {
+ min_x = (int)FXSYS_floor(inter_x[0]);
+ max_x = (int)FXSYS_ceil(inter_x[1]);
+ start_index = 0;
+ end_index = 1;
+ } else {
+ min_x = (int)FXSYS_floor(inter_x[1]);
+ max_x = (int)FXSYS_ceil(inter_x[0]);
+ start_index = 1;
+ end_index = 0;
+ }
+ int start_x = min_x, end_x = max_x;
+ if (start_x < 0) {
+ start_x = 0;
+ }
+ if (end_x > pBitmap->GetWidth()) {
+ end_x = pBitmap->GetWidth();
+ }
+ FX_LPBYTE dib_buf = pBitmap->GetBuffer() + y * pBitmap->GetPitch() + start_x * 4;
+ FX_FLOAT r_unit = (r[end_index] - r[start_index]) / (max_x - min_x);
+ FX_FLOAT g_unit = (g[end_index] - g[start_index]) / (max_x - min_x);
+ FX_FLOAT b_unit = (b[end_index] - b[start_index]) / (max_x - min_x);
+ FX_FLOAT R = r[start_index] + (start_x - min_x) * r_unit;
+ FX_FLOAT G = g[start_index] + (start_x - min_x) * g_unit;
+ FX_FLOAT B = b[start_index] + (start_x - min_x) * b_unit;
+ for (int x = start_x; x < end_x; x ++) {
+ R += r_unit;
+ G += g_unit;
+ B += b_unit;
+ FXARGB_SETDIB(dib_buf, FXARGB_MAKE(alpha, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255)));
+ dib_buf += 4;
+ }
+ }
+}
+static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_MeshVertex triangle[3];
+ while (!stream.m_BitStream.IsEOF()) {
+ CPDF_MeshVertex vertex;
+ FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap);
+ if (flag == 0) {
+ triangle[0] = vertex;
+ for (int j = 1; j < 3; j ++) {
+ stream.GetVertex(triangle[j], pObject2Bitmap);
+ }
+ } else {
+ if (flag == 1) {
+ triangle[0] = triangle[1];
+ }
+ triangle[1] = triangle[2];
+ triangle[2] = vertex;
+ }
+ _DrawGouraud(pBitmap, alpha, triangle);
+ }
+}
+static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow");
+ if (row_verts < 2) {
+ return;
+ }
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_MeshVertex* vertex = FX_Alloc(CPDF_MeshVertex, row_verts * 2);
+ if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) {
+ FX_Free(vertex);
+ return;
+ }
+ int last_index = 0;
+ while (1) {
+ CPDF_MeshVertex* last_row = vertex + last_index * row_verts;
+ CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts;
+ if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) {
+ FX_Free(vertex);
+ return;
+ }
+ CPDF_MeshVertex triangle[3];
+ for (int i = 1; i < row_verts; i ++) {
+ triangle[0] = last_row[i];
+ triangle[1] = this_row[i - 1];
+ triangle[2] = last_row[i - 1];
+ _DrawGouraud(pBitmap, alpha, triangle);
+ triangle[2] = this_row[i];
+ _DrawGouraud(pBitmap, alpha, triangle);
+ }
+ last_index = 1 - last_index;
+ }
+ FX_Free(vertex);
+}
+struct Coon_BezierCoeff {
+ float a, b, c, d;
+ void FromPoints(float p0, float p1, float p2, float p3)
+ {
+ a = -p0 + 3 * p1 - 3 * p2 + p3;
+ b = 3 * p0 - 6 * p1 + 3 * p2;
+ c = -3 * p0 + 3 * p1;
+ d = p0;
+ }
+ Coon_BezierCoeff first_half()
+ {
+ Coon_BezierCoeff result;
+ result.a = a / 8;
+ result.b = b / 4;
+ result.c = c / 2;
+ result.d = d;
+ return result;
+ }
+ Coon_BezierCoeff second_half()
+ {
+ Coon_BezierCoeff result;
+ result.a = a / 8;
+ result.b = 3 * a / 8 + b / 4;
+ result.c = 3 * a / 8 + b / 2 + c / 2;
+ result.d = a / 8 + b / 4 + c / 2 + d;
+ return result;
+ }
+ void GetPoints(float p[4])
+ {
+ p[0] = d;
+ p[1] = c / 3 + p[0];
+ p[2] = b / 3 - p[0] + 2 * p[1];
+ p[3] = a + p[0] - 3 * p[1] + 3 * p[2];
+ }
+ void GetPointsReverse(float p[4])
+ {
+ p[3] = d;
+ p[2] = c / 3 + p[3];
+ p[1] = b / 3 - p[3] + 2 * p[2];
+ p[0] = a + p[3] - 3 * p[2] + 3 * p[1];
+ }
+ void BezierInterpol(Coon_BezierCoeff& C1, Coon_BezierCoeff& C2, Coon_BezierCoeff& D1, Coon_BezierCoeff& D2)
+ {
+ a = (D1.a + D2.a) / 2;
+ b = (D1.b + D2.b) / 2;
+ c = (D1.c + D2.c) / 2 - (C1.a / 8 + C1.b / 4 + C1.c / 2) + (C2.a / 8 + C2.b / 4) + (-C1.d + D2.d) / 2 - (C2.a + C2.b) / 2;
+ d = C1.a / 8 + C1.b / 4 + C1.c / 2 + C1.d;
+ }
+ float Distance()
+ {
+ float dis = a + b + c;
+ return dis < 0 ? -dis : dis;
+ }
+};
+struct Coon_Bezier {
+ Coon_BezierCoeff x, y;
+ void FromPoints(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3)
+ {
+ x.FromPoints(x0, x1, x2, x3);
+ y.FromPoints(y0, y1, y2, y3);
+ }
+ Coon_Bezier first_half()
+ {
+ Coon_Bezier result;
+ result.x = x.first_half();
+ result.y = y.first_half();
+ return result;
+ }
+ Coon_Bezier second_half()
+ {
+ Coon_Bezier result;
+ result.x = x.second_half();
+ result.y = y.second_half();
+ return result;
+ }
+ void BezierInterpol(Coon_Bezier& C1, Coon_Bezier& C2, Coon_Bezier& D1, Coon_Bezier& D2)
+ {
+ x.BezierInterpol(C1.x, C2.x, D1.x, D2.x);
+ y.BezierInterpol(C1.y, C2.y, D1.y, D2.y);
+ }
+ void GetPoints(FX_PATHPOINT* pPoints)
+ {
+ float p[4];
+ int i;
+ x.GetPoints(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointX = p[i];
+ }
+ y.GetPoints(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointY = p[i];
+ }
+ }
+ void GetPointsReverse(FX_PATHPOINT* pPoints)
+ {
+ float p[4];
+ int i;
+ x.GetPointsReverse(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointX = p[i];
+ }
+ y.GetPointsReverse(p);
+ for (i = 0; i < 4; i ++) {
+ pPoints[i].m_PointY = p[i];
+ }
+ }
+ float Distance()
+ {
+ return x.Distance() + y.Distance();
+ }
+};
+static int _BiInterpol(int c0, int c1, int c2, int c3, int x, int y, int x_scale, int y_scale)
+{
+ int x1 = c0 + (c3 - c0) * x / x_scale;
+ int x2 = c1 + (c2 - c1) * x / x_scale;
+ return x1 + (x2 - x1) * y / y_scale;
+}
+struct Coon_Color {
+ Coon_Color()
+ {
+ FXSYS_memset32(comp, 0, sizeof(int) * 3);
+ }
+ int comp[3];
+ void BiInterpol(Coon_Color colors[4], int x, int y, int x_scale, int y_scale)
+ {
+ for (int i = 0; i < 3; i ++)
+ comp[i] = _BiInterpol(colors[0].comp[i], colors[1].comp[i], colors[2].comp[i], colors[3].comp[i],
+ x, y, x_scale, y_scale);
+ }
+ int Distance(Coon_Color& o)
+ {
+ int max, diff;
+ max = FXSYS_abs(comp[0] - o.comp[0]);
+ diff = FXSYS_abs(comp[1] - o.comp[1]);
+ if (max < diff) {
+ max = diff;
+ }
+ diff = FXSYS_abs(comp[2] - o.comp[2]);
+ if (max < diff) {
+ max = diff;
+ }
+ return max;
+ }
+};
+struct CPDF_PatchDrawer {
+ Coon_Color patch_colors[4];
+ int max_delta;
+ CFX_PathData path;
+ CFX_RenderDevice* pDevice;
+ int fill_mode;
+ int alpha;
+ void Draw(int x_scale, int y_scale, int left, int bottom, Coon_Bezier C1, Coon_Bezier C2, Coon_Bezier D1, Coon_Bezier D2)
+ {
+ FX_BOOL bSmall = C1.Distance() < 2 && C2.Distance() < 2 && D1.Distance() < 2 && D2.Distance() < 2;
+ Coon_Color div_colors[4];
+ int d_bottom, d_left, d_top, d_right;
+ div_colors[0].BiInterpol(patch_colors, left, bottom, x_scale, y_scale);
+ if (!bSmall) {
+ div_colors[1].BiInterpol(patch_colors, left, bottom + 1, x_scale, y_scale);
+ div_colors[2].BiInterpol(patch_colors, left + 1, bottom + 1, x_scale, y_scale);
+ div_colors[3].BiInterpol(patch_colors, left + 1, bottom, x_scale, y_scale);
+ d_bottom = div_colors[3].Distance(div_colors[0]);
+ d_left = div_colors[1].Distance(div_colors[0]);
+ d_top = div_colors[1].Distance(div_colors[2]);
+ d_right = div_colors[2].Distance(div_colors[3]);
+ }
+#define COONCOLOR_THRESHOLD 4
+ if (bSmall || (d_bottom < COONCOLOR_THRESHOLD && d_left < COONCOLOR_THRESHOLD &&
+ d_top < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD)) {
+ FX_PATHPOINT* pPoints = path.GetPoints();
+ C1.GetPoints(pPoints);
+ D2.GetPoints(pPoints + 3);
+ C2.GetPointsReverse(pPoints + 6);
+ D1.GetPointsReverse(pPoints + 9);
+ int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;
+ if (fill_mode & RENDER_NOPATHSMOOTH) {
+ fillFlags |= FXFILL_NOPATHSMOOTH;
+ }
+ pDevice->DrawPath(&path, NULL, NULL, FXARGB_MAKE(alpha, div_colors[0].comp[0], div_colors[0].comp[1], div_colors[0].comp[2]), 0, fillFlags);
+ } else {
+ if (d_bottom < COONCOLOR_THRESHOLD && d_top < COONCOLOR_THRESHOLD) {
+ Coon_Bezier m1;
+ m1.BezierInterpol(D1, D2, C1, C2);
+ y_scale *= 2;
+ bottom *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1, m1, D1.first_half(), D2.first_half());
+ Draw(x_scale, y_scale, left, bottom + 1, m1, C2, D1.second_half(), D2.second_half());
+ } else if (d_left < COONCOLOR_THRESHOLD && d_right < COONCOLOR_THRESHOLD) {
+ Coon_Bezier m2;
+ m2.BezierInterpol(C1, C2, D1, D2);
+ x_scale *= 2;
+ left *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1.first_half(), C2.first_half(), D1, m2);
+ Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), C2.second_half(), m2, D2);
+ } else {
+ Coon_Bezier m1, m2;
+ m1.BezierInterpol(D1, D2, C1, C2);
+ m2.BezierInterpol(C1, C2, D1, D2);
+ Coon_Bezier m1f = m1.first_half();
+ Coon_Bezier m1s = m1.second_half();
+ Coon_Bezier m2f = m2.first_half();
+ Coon_Bezier m2s = m2.second_half();
+ x_scale *= 2;
+ y_scale *= 2;
+ left *= 2;
+ bottom *= 2;
+ Draw(x_scale, y_scale, left, bottom, C1.first_half(), m1f, D1.first_half(), m2f);
+ Draw(x_scale, y_scale, left, bottom + 1, m1f, C2.first_half(), D1.second_half(), m2s);
+ Draw(x_scale, y_scale, left + 1, bottom, C1.second_half(), m1s, m2f, D2.first_half());
+ Draw(x_scale, y_scale, left + 1, bottom + 1, m1s, C2.second_half(), m2s, D2.second_half());
+ }
+ }
+ }
+};
+static void _DrawCoonPatchMeshes(FX_BOOL bTensor, CFX_DIBitmap* pBitmap, CFX_AffineMatrix* pObject2Bitmap,
+ CPDF_Stream* pShadingStream, CPDF_Function** pFuncs, int nFuncs,
+ CPDF_ColorSpace* pCS, int fill_mode, int alpha)
+{
+ ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
+ if (pShadingStream->GetType() != PDFOBJ_STREAM) {
+ return;
+ }
+ CFX_FxgeDevice device;
+ device.Attach(pBitmap);
+ CPDF_MeshStream stream;
+ if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) {
+ return;
+ }
+ CPDF_PatchDrawer patch;
+ patch.alpha = alpha;
+ patch.pDevice = &device;
+ patch.fill_mode = fill_mode;
+ patch.path.SetPointCount(13);
+ FX_PATHPOINT* pPoints = patch.path.GetPoints();
+ pPoints[0].m_Flag = FXPT_MOVETO;
+ for (int i = 1; i < 13; i ++) {
+ pPoints[i].m_Flag = FXPT_BEZIERTO;
+ }
+ CFX_FloatPoint coords[16];
+ int point_count = bTensor ? 16 : 12;
+ while (!stream.m_BitStream.IsEOF()) {
+ FX_DWORD flag = stream.GetFlag();
+ int iStartPoint = 0, iStartColor = 0, i;
+ if (flag) {
+ iStartPoint = 4;
+ iStartColor = 2;
+ CFX_FloatPoint tempCoords[4];
+ for (int i = 0; i < 4; i ++) {
+ tempCoords[i] = coords[(flag * 3 + i) % 12];
+ }
+ FXSYS_memcpy32(coords, tempCoords, sizeof(CFX_FloatPoint) * 4);
+ Coon_Color tempColors[2];
+ tempColors[0] = patch.patch_colors[flag];
+ tempColors[1] = patch.patch_colors[(flag + 1) % 4];
+ FXSYS_memcpy32(patch.patch_colors, tempColors, sizeof(Coon_Color) * 2);
+ }
+ for (i = iStartPoint; i < point_count; i ++) {
+ stream.GetCoords(coords[i].x, coords[i].y);
+ pObject2Bitmap->Transform(coords[i].x, coords[i].y);
+ }
+ for (i = iStartColor; i < 4; i ++) {
+ FX_FLOAT r, g, b;
+ stream.GetColor(r, g, b);
+ patch.patch_colors[i].comp[0] = (FX_INT32)(r * 255);
+ patch.patch_colors[i].comp[1] = (FX_INT32)(g * 255);
+ patch.patch_colors[i].comp[2] = (FX_INT32)(b * 255);
+ }
+ CFX_FloatRect bbox = CFX_FloatRect::GetBBox(coords, point_count);
+ if (bbox.right <= 0 || bbox.left >= (FX_FLOAT)pBitmap->GetWidth() || bbox.top <= 0 ||
+ bbox.bottom >= (FX_FLOAT)pBitmap->GetHeight()) {
+ continue;
+ }
+ Coon_Bezier C1, C2, D1, D2;
+ C1.FromPoints(coords[0].x, coords[0].y, coords[11].x, coords[11].y, coords[10].x, coords[10].y,
+ coords[9].x, coords[9].y);
+ C2.FromPoints(coords[3].x, coords[3].y, coords[4].x, coords[4].y, coords[5].x, coords[5].y,
+ coords[6].x, coords[6].y);
+ D1.FromPoints(coords[0].x, coords[0].y, coords[1].x, coords[1].y, coords[2].x, coords[2].y,
+ coords[3].x, coords[3].y);
+ D2.FromPoints(coords[9].x, coords[9].y, coords[8].x, coords[8].y, coords[7].x, coords[7].y,
+ coords[6].x, coords[6].y);
+ patch.Draw(1, 1, 0, 0, C1, C2, D1, D2);
+ }
+}
+void CPDF_RenderStatus::DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix,
+ FX_RECT& clip_rect, int alpha, FX_BOOL bAlphaMode)
+{
+ int width = clip_rect.Width();
+ int height = clip_rect.Height();
+ CPDF_Function** pFuncs = pPattern->m_pFunctions;
+ int nFuncs = pPattern->m_nFuncs;
+ CPDF_Dictionary* pDict = pPattern->m_pShadingObj->GetDict();
+ CPDF_ColorSpace* pColorSpace = pPattern->m_pCS;
+ if (pColorSpace == NULL) {
+ return;
+ }
+ FX_ARGB background = 0;
+ if (!pPattern->m_bShadingObj && pPattern->m_pShadingObj->GetDict()->KeyExist(FX_BSTRC("Background"))) {
+ CPDF_Array* pBackColor = pPattern->m_pShadingObj->GetDict()->GetArray(FX_BSTRC("Background"));
+ if (pBackColor && pBackColor->GetCount() >= (FX_DWORD)pColorSpace->CountComponents()) {
+ CFX_FixedBufGrow<FX_FLOAT, 16> comps(pColorSpace->CountComponents());
+ for (int i = 0; i < pColorSpace->CountComponents(); i ++) {
+ comps[i] = pBackColor->GetNumber(i);
+ }
+ FX_FLOAT R, G, B;
+ pColorSpace->GetRGB(comps, R, G, B);
+ background = ArgbEncode(255, (FX_INT32)(R * 255), (FX_INT32)(G * 255), (FX_INT32)(B * 255));
+ }
+ }
+ if (pDict->KeyExist(FX_BSTRC("BBox"))) {
+ CFX_FloatRect rect = pDict->GetRect(FX_BSTRC("BBox"));
+ rect.Transform(pMatrix);
+ clip_rect.Intersect(rect.GetOutterRect());
+ }
+ CPDF_DeviceBuffer buffer;
+ buffer.Initialize(m_pContext, m_pDevice, &clip_rect, m_pCurObj, 150);
+ CFX_AffineMatrix FinalMatrix = *pMatrix;
+ FinalMatrix.Concat(*buffer.GetMatrix());
+ CFX_DIBitmap* pBitmap = buffer.GetBitmap();
+ if (pBitmap->GetBuffer() == NULL) {
+ return;
+ }
+ pBitmap->Clear(background);
+ int fill_mode = m_Options.m_Flags;
+ switch (pPattern->m_ShadingType) {
+ case 1:
+ _DrawFuncShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 2:
+ _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 3:
+ _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, pColorSpace, alpha);
+ break;
+ case 4: {
+ _DrawFreeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, alpha);
+ }
+ break;
+ case 5: {
+ _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, alpha);
+ }
+ break;
+ case 6:
+ case 7: {
+ _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, (CPDF_Stream*)pPattern->m_pShadingObj,
+ pFuncs, nFuncs, pColorSpace, fill_mode, alpha);
+ }
+ break;
+ }
+ if (bAlphaMode) {
+ pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha);
+ }
+ if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
+ }
+ buffer.OutputToDevice();
+}
+void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ if (!pattern->Load()) {
+ return;
+ }
+ m_pDevice->SaveState();
+ if (pPageObj->m_Type == PDFPAGE_PATH) {
+ if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ m_pDevice->SetClip_Rect(&rect);
+ } else {
+ return;
+ }
+ FX_RECT rect;
+ if (GetObjectClippedRect(pPageObj, pObj2Device, FALSE, rect)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ CFX_AffineMatrix matrix = pattern->m_Pattern2Form;
+ matrix.Concat(*pObj2Device);
+ GetScaledMatrix(matrix);
+ int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke);
+ DrawShading(pattern, &matrix, rect, alpha, m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
+ m_pDevice->RestoreState();
+}
+FX_BOOL CPDF_RenderStatus::ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device)
+{
+ FX_RECT rect = pShadingObj->GetBBox(pObj2Device);
+ FX_RECT clip_box = m_pDevice->GetClipBox();
+ rect.Intersect(clip_box);
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix = pShadingObj->m_Matrix;
+ matrix.Concat(*pObj2Device);
+ DrawShading(pShadingObj->m_pShading, &matrix, rect, pShadingObj->m_GeneralState.GetAlpha(FALSE),
+ m_Options.m_ColorMode == RENDER_COLOR_ALPHA);
+#ifdef _FPDFAPI_MINI_
+ if (m_DitherBits) {
+ DitherObjectArea(pShadingObj, pObj2Device);
+ }
+#endif
+ return TRUE;
+}
+static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CPDF_PageRenderCache* pCache,
+ CPDF_TilingPattern* pPattern, const CFX_AffineMatrix* pObject2Device,
+ int width, int height, int flags)
+{
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap->Create(width, height, pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) {
+ delete pBitmap;
+ return NULL;
+ }
+ CFX_FxgeDevice bitmap_device;
+ bitmap_device.Attach(pBitmap);
+ pBitmap->Clear(0);
+ CFX_FloatRect cell_bbox = pPattern->m_BBox;
+ pPattern->m_Pattern2Form.TransformRect(cell_bbox);
+ pObject2Device->TransformRect(cell_bbox);
+ CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height);
+ CFX_AffineMatrix mtAdjust;
+ mtAdjust.MatchRect(bitmap_rect, cell_bbox);
+ CFX_AffineMatrix mtPattern2Bitmap = *pObject2Device;
+ mtPattern2Bitmap.Concat(mtAdjust);
+ CPDF_RenderOptions options;
+ if (!pPattern->m_bColored) {
+ options.m_ColorMode = RENDER_COLOR_ALPHA;
+ }
+ flags |= RENDER_FORCE_HALFTONE;
+ options.m_Flags = flags;
+ CPDF_RenderContext context;
+ context.Create(pDoc, pCache, NULL);
+ context.DrawObjectList(&bitmap_device, pPattern->m_pForm, &mtPattern2Bitmap, &options);
+ return pBitmap;
+}
+void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke)
+{
+ if (!pPattern->Load()) {
+ return;
+ }
+ m_pDevice->SaveState();
+ if (pPageObj->m_Type == PDFPAGE_PATH) {
+ if (!SelectClipPath((CPDF_PathObject*)pPageObj, pObj2Device, bStroke)) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ } else if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ FX_RECT rect = pPageObj->GetBBox(pObj2Device);
+ m_pDevice->SetClip_Rect(&rect);
+ } else {
+ return;
+ }
+ FX_RECT clip_box = m_pDevice->GetClipBox();
+ if (clip_box.IsEmpty()) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT sa = FXSYS_fabs(dCTM.a);
+ FX_FLOAT sd = FXSYS_fabs(dCTM.d);
+ clip_box.right = clip_box.left + (FX_INT32)FXSYS_ceil(clip_box.Width() * sa);
+ clip_box.bottom = clip_box.top + (FX_INT32)FXSYS_ceil(clip_box.Height() * sd);
+ CFX_AffineMatrix mtPattern2Device = pPattern->m_Pattern2Form;
+ mtPattern2Device.Concat(*pObj2Device);
+ GetScaledMatrix(mtPattern2Device);
+ FX_BOOL bAligned = FALSE;
+ if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 &&
+ pPattern->m_BBox.right == pPattern->m_XStep && pPattern->m_BBox.top == pPattern->m_YStep &&
+ (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) {
+ bAligned = TRUE;
+ }
+ CFX_FloatRect cell_bbox = pPattern->m_BBox;
+ mtPattern2Device.TransformRect(cell_bbox);
+ int width = (int)FXSYS_ceil(cell_bbox.Width());
+ int height = (int)FXSYS_ceil(cell_bbox.Height());
+ if (width == 0) {
+ width = 1;
+ }
+ if (height == 0) {
+ height = 1;
+ }
+ int min_col, max_col, min_row, max_row;
+ CFX_AffineMatrix mtDevice2Pattern;
+ mtDevice2Pattern.SetReverse(mtPattern2Device);
+ CFX_FloatRect clip_box_p(clip_box);
+ clip_box_p.Transform(&mtDevice2Pattern);
+ min_col = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.left - pPattern->m_BBox.right, pPattern->m_XStep));
+ max_col = (int)FXSYS_floor(FXSYS_Div(clip_box_p.right - pPattern->m_BBox.left, pPattern->m_XStep));
+ min_row = (int)FXSYS_ceil(FXSYS_Div(clip_box_p.bottom - pPattern->m_BBox.top, pPattern->m_YStep));
+ max_row = (int)FXSYS_floor(FXSYS_Div(clip_box_p.top - pPattern->m_BBox.bottom, pPattern->m_YStep));
+ if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) {
+ CPDF_GraphicStates* pStates = NULL;
+ if (!pPattern->m_bColored) {
+ pStates = CloneObjStates(pPageObj, bStroke);
+ }
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pPattern->m_pForm->m_pFormDict) {
+ pFormResource = pPattern->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ for (int col = min_col; col <= max_col; col ++)
+ for (int row = min_row; row <= max_row; row ++) {
+ FX_FLOAT orig_x, orig_y;
+ orig_x = col * pPattern->m_XStep;
+ orig_y = row * pPattern->m_YStep;
+ mtPattern2Device.Transform(orig_x, orig_y);
+ CFX_AffineMatrix matrix = *pObj2Device;
+ matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f);
+ m_pDevice->SaveState();
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &m_Options,
+ pPattern->m_pForm->m_Transparency, m_bDropObjects, pFormResource);
+ status.RenderObjectList(pPattern->m_pForm, &matrix);
+ m_pDevice->RestoreState();
+ }
+ m_pDevice->RestoreState();
+ if (pStates) {
+ delete pStates;
+ }
+ return;
+ }
+ if (bAligned) {
+ int orig_x = FXSYS_round(mtPattern2Device.e);
+ int orig_y = FXSYS_round(mtPattern2Device.f);
+ min_col = (clip_box.left - orig_x) / width;
+ if (clip_box.left < orig_x) {
+ min_col --;
+ }
+ max_col = (clip_box.right - orig_x) / width;
+ if (clip_box.right <= orig_x) {
+ max_col --;
+ }
+ min_row = (clip_box.top - orig_y) / height;
+ if (clip_box.top < orig_y) {
+ min_row --;
+ }
+ max_row = (clip_box.bottom - orig_y) / height;
+ if (clip_box.bottom <= orig_y) {
+ max_row --;
+ }
+ }
+ FX_FLOAT left_offset = cell_bbox.left - mtPattern2Device.e;
+ FX_FLOAT top_offset = cell_bbox.bottom - mtPattern2Device.f;
+ CFX_DIBitmap* pPatternBitmap = NULL;
+ if (width * height < 16) {
+ CFX_DIBitmap* pEnlargedBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, 8, 8, m_Options.m_Flags);
+ pPatternBitmap = pEnlargedBitmap->StretchTo(width, height);
+ delete pEnlargedBitmap;
+ } else {
+ pPatternBitmap = DrawPatternBitmap(m_pContext->m_pDocument, m_pContext->m_pPageCache, pPattern, pObj2Device, width, height, m_Options.m_Flags);
+ }
+ if (pPatternBitmap == NULL) {
+ m_pDevice->RestoreState();
+ return;
+ }
+ if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) {
+ pPatternBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor);
+ }
+ FX_ARGB fill_argb = GetFillArgb(pPageObj);
+ int clip_width = clip_box.right - clip_box.left;
+ int clip_height = clip_box.bottom - clip_box.top;
+ CFX_DIBitmap screen;
+ if (!screen.Create(clip_width, clip_height, FXDIB_Argb)) {
+ return;
+ }
+ screen.Clear(0);
+ FX_DWORD* src_buf = (FX_DWORD*)pPatternBitmap->GetBuffer();
+ for (int col = min_col; col <= max_col; col ++) {
+ for (int row = min_row; row <= max_row; row ++) {
+ int start_x, start_y;
+ if (bAligned) {
+ start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left;
+ start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top;
+ } else {
+ FX_FLOAT orig_x = col * pPattern->m_XStep;
+ FX_FLOAT orig_y = row * pPattern->m_YStep;
+ mtPattern2Device.Transform(orig_x, orig_y);
+ start_x = FXSYS_round(orig_x + left_offset) - clip_box.left;
+ start_y = FXSYS_round(orig_y + top_offset) - clip_box.top;
+ }
+ if (width == 1 && height == 1) {
+ if (start_x < 0 || start_x >= clip_box.Width() || start_y < 0 || start_y >= clip_box.Height()) {
+ continue;
+ }
+ FX_DWORD* dest_buf = (FX_DWORD*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4);
+ if (pPattern->m_bColored) {
+ *dest_buf = *src_buf;
+ } else {
+ *dest_buf = (*(FX_LPBYTE)src_buf << 24) | (fill_argb & 0xffffff);
+ }
+ } else {
+ if (pPattern->m_bColored) {
+ screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0);
+ } else {
+ screen.CompositeMask(start_x, start_y, width, height, pPatternBitmap, fill_argb, 0, 0);
+ }
+ }
+ }
+ }
+ CompositeDIBitmap(&screen, clip_box.left, clip_box.top, 0, 255, FXDIB_BLEND_NORMAL, FALSE);
+ m_pDevice->RestoreState();
+ delete pPatternBitmap;
+}
+void CPDF_RenderStatus::DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke)
+{
+ CPDF_Pattern* pattern = pColor->GetPattern();
+ if (pattern == NULL) {
+ return;
+ }
+ if(pattern->m_PatternType == PATTERN_TILING) {
+ DrawTilingPattern((CPDF_TilingPattern*)pattern, pPathObj, pObj2Device, bStroke);
+ } else {
+ DrawShadingPattern((CPDF_ShadingPattern*)pattern, pPathObj, pObj2Device, bStroke);
+ }
+}
+void CPDF_RenderStatus::ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke)
+{
+ FX_BOOL bPattern = FALSE;
+ if(filltype) {
+ CPDF_Color& FillColor = *pPathObj->m_ColorState.GetFillColor();
+ if(FillColor.m_pCS && FillColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
+ DrawPathWithPattern(pPathObj, pObj2Device, &FillColor, FALSE);
+ filltype = 0;
+ bPattern = TRUE;
+ }
+ }
+ if(bStroke) {
+ CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor();
+ if(StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) {
+ DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE);
+ bStroke = FALSE;
+ bPattern = TRUE;
+ }
+ }
+#ifdef _FPDFAPI_MINI_
+ if (bPattern && m_DitherBits) {
+ DitherObjectArea(pPathObj, pObj2Device);
+ }
+#endif
+}
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
new file mode 100644
index 0000000000..91ff982935
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -0,0 +1,760 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fpdfapi/fpdf_render.h"
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#include "../fpdf_page/pageint.h"
+#include "render_int.h"
+extern FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix);
+CPDF_Type3Cache::~CPDF_Type3Cache()
+{
+ FX_POSITION pos = m_SizeMap.GetStartPosition();
+ CFX_ByteString Key;
+ CPDF_Type3Glyphs* pSizeCache = NULL;
+ while(pos) {
+ pSizeCache = (CPDF_Type3Glyphs*)m_SizeMap.GetNextValue(pos);
+ delete pSizeCache;
+ }
+ m_SizeMap.RemoveAll();
+}
+CFX_GlyphBitmap* CPDF_Type3Cache::LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ _CPDF_UniqueKeyGen keygen;
+ keygen.Generate(4, FXSYS_round(pMatrix->a * 10000), FXSYS_round(pMatrix->b * 10000),
+ FXSYS_round(pMatrix->c * 10000), FXSYS_round(pMatrix->d * 10000));
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+ CPDF_Type3Glyphs* pSizeCache = NULL;
+ if(!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ pSizeCache = FX_NEW CPDF_Type3Glyphs;
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ }
+ CFX_GlyphBitmap* pGlyphBitmap;
+ if(pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)charcode, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph(pSizeCache, charcode, pMatrix, retinaScaleX, retinaScaleY);
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)charcode, pGlyphBitmap);
+ return pGlyphBitmap;
+}
+CPDF_Type3Glyphs::~CPDF_Type3Glyphs()
+{
+ FX_POSITION pos = m_GlyphMap.GetStartPosition();
+ FX_LPVOID Key;
+ CFX_GlyphBitmap* pGlyphBitmap;
+ while(pos) {
+ m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
+ delete pGlyphBitmap;
+ }
+}
+static int _AdjustBlue(FX_FLOAT pos, int& count, int blues[])
+{
+ FX_FLOAT min_distance = 1000000.0f * 1.0f;
+ int closest_pos = -1;
+ for (int i = 0; i < count; i ++) {
+ FX_FLOAT distance = (FX_FLOAT)FXSYS_fabs(pos - (FX_FLOAT)blues[i]);
+ if (distance < 1.0f * 80.0f / 100.0f && distance < min_distance) {
+ min_distance = distance;
+ closest_pos = i;
+ }
+ }
+ if (closest_pos >= 0) {
+ return blues[closest_pos];
+ }
+ int new_pos = FXSYS_round(pos);
+ if (count == TYPE3_MAX_BLUES) {
+ return new_pos;
+ }
+ blues[count++] = new_pos;
+ return new_pos;
+}
+void CPDF_Type3Glyphs::AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line)
+{
+ top_line = _AdjustBlue(top, m_TopBlueCount, m_TopBlue);
+ bottom_line = _AdjustBlue(bottom, m_BottomBlueCount, m_BottomBlue);
+}
+static FX_BOOL _IsScanLine1bpp(FX_LPBYTE pBuf, int width)
+{
+ int size = width / 8;
+ for (int i = 0; i < size; i ++)
+ if (pBuf[i]) {
+ return TRUE;
+ }
+ if (width % 8)
+ if (pBuf[width / 8] & (0xff << (8 - width % 8))) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL _IsScanLine8bpp(FX_LPBYTE pBuf, int width)
+{
+ for (int i = 0; i < width; i ++)
+ if (pBuf[i] > 0x40) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst)
+{
+ int height = pBitmap->GetHeight(), pitch = pBitmap->GetPitch(), width = pBitmap->GetWidth();
+ int bpp = pBitmap->GetBPP();
+ if (bpp > 8) {
+ width *= bpp / 8;
+ }
+ FX_LPBYTE pBuf = pBitmap->GetBuffer();
+ int line = bFirst ? 0 : height - 1;
+ int line_step = bFirst ? 1 : -1;
+ int line_end = bFirst ? height : -1;
+ while (line != line_end) {
+ if (bpp == 1) {
+ if (_IsScanLine1bpp(pBuf + line * pitch, width)) {
+ return line;
+ }
+ } else {
+ if (_IsScanLine8bpp(pBuf + line * pitch, width)) {
+ return line;
+ }
+ }
+ line += line_step;
+ }
+ return -1;
+}
+CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ CPDF_Type3Char* pChar = m_pFont->LoadChar(charcode);
+ if (pChar == NULL || pChar->m_pBitmap == NULL) {
+ return NULL;
+ }
+ CFX_DIBitmap* pBitmap = pChar->m_pBitmap;
+ CFX_AffineMatrix image_matrix, text_matrix;
+ image_matrix = pChar->m_ImageMatrix;
+ text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0);
+ image_matrix.Concat(text_matrix);
+ CFX_DIBitmap* pResBitmap = NULL;
+ int left, top;
+ if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && FXSYS_fabs(image_matrix.c) < FXSYS_fabs(image_matrix.d) / 100) {
+ int top_line, bottom_line;
+ top_line = _DetectFirstLastScan(pBitmap, TRUE);
+ bottom_line = _DetectFirstLastScan(pBitmap, FALSE);
+ if (top_line == 0 && bottom_line == pBitmap->GetHeight() - 1) {
+ FX_FLOAT top_y = image_matrix.d + image_matrix.f;
+ FX_FLOAT bottom_y = image_matrix.f;
+ FX_BOOL bFlipped = top_y > bottom_y;
+ if (bFlipped) {
+ FX_FLOAT temp = top_y;
+ top_y = bottom_y;
+ bottom_y = temp;
+ }
+ pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line);
+ pResBitmap = pBitmap->StretchTo((int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * retinaScaleY));
+ top = top_line;
+ if (image_matrix.a < 0) {
+ image_matrix.Scale(retinaScaleX, retinaScaleY);
+ left = FXSYS_round(image_matrix.e + image_matrix.a);
+ } else {
+ left = FXSYS_round(image_matrix.e);
+ }
+ } else {
+ }
+ }
+ if (pResBitmap == NULL) {
+ image_matrix.Scale(retinaScaleX, retinaScaleY);
+ pResBitmap = pBitmap->TransformTo(&image_matrix, left, top);
+ }
+ if (pResBitmap == NULL) {
+ return NULL;
+ }
+ CFX_GlyphBitmap* pGlyph = FX_NEW CFX_GlyphBitmap;
+ pGlyph->m_Left = left;
+ pGlyph->m_Top = -top;
+ pGlyph->m_Bitmap.TakeOver(pResBitmap);
+ delete pResBitmap;
+ return pGlyph;
+}
+void _CPDF_UniqueKeyGen::Generate(int count, ...)
+{
+ va_list argList;
+ va_start(argList, count);
+ for (int i = 0; i < count; i ++) {
+ int p = va_arg(argList, int);
+ ((FX_DWORD*)m_Key)[i] = p;
+ }
+ va_end(argList);
+ m_KeyLen = count * sizeof(FX_DWORD);
+}
+FX_BOOL CPDF_RenderStatus::ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath)
+{
+ if(textobj->m_nChars == 0) {
+ return TRUE;
+ }
+ int text_render_mode = textobj->m_TextState.GetObject()->m_TextMode;
+ if (text_render_mode == 3) {
+ return TRUE;
+ }
+ CPDF_Font* pFont = textobj->m_TextState.GetFont();
+ if (pFont->GetFontType() == PDFFONT_TYPE3) {
+ return ProcessType3Text(textobj, pObj2Device);
+ }
+ FX_BOOL bFill = FALSE, bStroke = FALSE, bClip = FALSE;
+ if (pClippingPath) {
+ bClip = TRUE;
+ } else {
+ switch (text_render_mode) {
+ case 0:
+ case 4:
+ bFill = TRUE;
+ break;
+ case 1:
+ case 5:
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ bFill = TRUE;
+ } else {
+ bStroke = TRUE;
+ }
+ break;
+ case 2:
+ case 6:
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ bFill = TRUE;
+ } else {
+ bFill = bStroke = TRUE;
+ }
+ break;
+ case 3:
+ case 7:
+ return TRUE;
+ default:
+ bFill = TRUE;
+ }
+ }
+ FX_ARGB stroke_argb = 0, fill_argb = 0;
+ FX_BOOL bPattern = FALSE;
+ if (bStroke) {
+ if (textobj->m_ColorState.GetStrokeColor()->IsPattern()) {
+ bPattern = TRUE;
+ } else {
+ stroke_argb = GetStrokeArgb(textobj);
+ }
+ }
+ if (bFill) {
+ if (textobj->m_ColorState.GetFillColor()->IsPattern()) {
+ bPattern = TRUE;
+ } else {
+ fill_argb = GetFillArgb(textobj);
+ }
+ }
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ if(IsAvailableMatrix(text_matrix) == FALSE) {
+ return TRUE;
+ }
+ FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
+ if (bPattern) {
+ DrawTextPathWithPattern(textobj, pObj2Device, pFont, font_size, &text_matrix, bFill, bStroke);
+ return TRUE;
+ }
+#if defined(_FPDFAPI_MINI_)
+ if (bFill) {
+ bStroke = FALSE;
+ }
+ if (bStroke) {
+ if (font_size * text_matrix.GetXUnit() * pObj2Device->GetXUnit() < 6) {
+ bStroke = FALSE;
+ }
+ }
+#endif
+ if (bClip || bStroke) {
+ const CFX_AffineMatrix* pDeviceMatrix = pObj2Device;
+ CFX_AffineMatrix device_matrix;
+ if (bStroke) {
+ const FX_FLOAT* pCTM = textobj->m_TextState.GetObject()->m_CTM;
+ if (pCTM[0] != 1.0f || pCTM[3] != 1.0f) {
+ CFX_AffineMatrix ctm(pCTM[0], pCTM[1], pCTM[2], pCTM[3], 0, 0);
+ text_matrix.ConcatInverse(ctm);
+ device_matrix.Copy(ctm);
+ device_matrix.Concat(*pObj2Device);
+ pDeviceMatrix = &device_matrix;
+ }
+ }
+ int flag = 0;
+ if (bStroke && bFill) {
+ flag |= FX_FILL_STROKE;
+ flag |= FX_STROKE_TEXT_MODE;
+ }
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+ const CPDF_GeneralStateData* pGeneralData = ((CPDF_PageObject*)textobj)->m_GeneralState;
+ if (pGeneralData && pGeneralData->m_StrokeAdjust) {
+ flag |= FX_STROKE_ADJUST;
+ }
+#endif
+ if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) {
+ flag |= FXFILL_NOPATHSMOOTH;
+ }
+ return CPDF_TextRenderer::DrawTextPath(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
+ &text_matrix, pDeviceMatrix, textobj->m_GraphState, fill_argb, stroke_argb, pClippingPath, flag);
+ }
+ text_matrix.Concat(*pObj2Device);
+ return CPDF_TextRenderer::DrawNormalText(m_pDevice, textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size,
+ &text_matrix, fill_argb, &m_Options);
+}
+CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont)
+{
+ if (pFont->m_pDocument == NULL) {
+ return NULL;
+ }
+ pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict(), FALSE);
+ return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont);
+}
+static void ReleaseCachedType3(CPDF_Type3Font* pFont)
+{
+ if (pFont->m_pDocument == NULL) {
+ return;
+ }
+ pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont);
+ pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict());
+}
+FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext)
+{
+ if (m_pBitmap != NULL || m_pForm == NULL) {
+ return TRUE;
+ }
+ if (m_pForm->CountObjects() == 1 && !m_bColored) {
+ CPDF_PageObject *pPageObj = m_pForm->GetObjectAt(m_pForm->GetFirstObjectPosition());
+ if (pPageObj->m_Type == PDFPAGE_IMAGE) {
+ CPDF_ImageObject* pImage = (CPDF_ImageObject*)pPageObj;
+ m_ImageMatrix = pImage->m_Matrix;
+ const CFX_DIBSource* pSource = pImage->m_pImage->LoadDIBSource();
+ if (pSource) {
+ m_pBitmap = pSource->Clone();
+ delete pSource;
+ }
+ delete m_pForm;
+ m_pForm = NULL;
+ return TRUE;
+ }
+ if (pPageObj->m_Type == PDFPAGE_INLINES) {
+ CPDF_InlineImages *pInlines = (CPDF_InlineImages *)pPageObj;
+ if (pInlines->m_pStream) {
+ m_ImageMatrix = pInlines->m_Matrices[0];
+ CPDF_DIBSource dibsrc;
+ if (!dibsrc.Load(pContext->m_pDocument, pInlines->m_pStream, NULL, NULL, NULL, NULL)) {
+ return FALSE;
+ }
+ m_pBitmap = dibsrc.Clone();
+ delete m_pForm;
+ m_pForm = NULL;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+class CPDF_RefType3Cache
+{
+public:
+ CPDF_RefType3Cache(CPDF_Type3Font* pType3Font)
+ {
+ m_dwCount = 0;
+ m_pType3Font = pType3Font;
+ }
+ ~CPDF_RefType3Cache()
+ {
+ while(m_dwCount--) {
+ ReleaseCachedType3(m_pType3Font);
+ }
+ }
+ FX_DWORD m_dwCount;
+ CPDF_Type3Font* m_pType3Font;
+};
+FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device)
+{
+ CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->GetType3Font();
+ for (int j = 0; j < m_Type3FontCache.GetSize(); j++)
+ if ((CPDF_Type3Font*)m_Type3FontCache.GetAt(j) == pType3Font) {
+ return TRUE;
+ }
+ CFX_Matrix dCTM = m_pDevice->GetCTM();
+ FX_FLOAT sa = FXSYS_fabs(dCTM.a);
+ FX_FLOAT sd = FXSYS_fabs(dCTM.d);
+ CFX_AffineMatrix text_matrix;
+ textobj->GetTextMatrix(&text_matrix);
+ CFX_AffineMatrix char_matrix = pType3Font->GetFontMatrix();
+ FX_FLOAT font_size = textobj->m_TextState.GetFontSize();
+ char_matrix.Scale(font_size, font_size);
+ FX_ARGB fill_argb = GetFillArgb(textobj, TRUE);
+ int fill_alpha = FXARGB_A(fill_argb);
+ int device_class = m_pDevice->GetDeviceClass();
+ FXTEXT_GLYPHPOS* pGlyphAndPos = NULL;
+ if (device_class == FXDC_DISPLAY) {
+ pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, textobj->m_nChars);
+ FXSYS_memset32(pGlyphAndPos, 0, sizeof(FXTEXT_GLYPHPOS) * textobj->m_nChars);
+ } else if (fill_alpha < 255) {
+ return FALSE;
+ }
+ CPDF_RefType3Cache refTypeCache(pType3Font);
+ FX_DWORD *pChars = textobj->m_pCharCodes;
+ if (textobj->m_nChars == 1) {
+ pChars = (FX_DWORD*)(&textobj->m_pCharCodes);
+ }
+ for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
+ FX_DWORD charcode = pChars[iChar];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ CPDF_Type3Char* pType3Char = pType3Font->LoadChar(charcode);
+ if (pType3Char == NULL) {
+ continue;
+ }
+ CFX_AffineMatrix matrix = char_matrix;
+ matrix.e += iChar ? textobj->m_pCharPos[iChar - 1] : 0;
+ matrix.Concat(text_matrix);
+ matrix.Concat(*pObj2Device);
+ if (!pType3Char->LoadBitmap(m_pContext)) {
+ if (pGlyphAndPos) {
+ for (int i = 0; i < iChar; i ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[i];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ m_pDevice->SetBitMask(&glyph.m_pGlyph->m_Bitmap,
+ glyph.m_OriginX + glyph.m_pGlyph->m_Left,
+ glyph.m_OriginY - glyph.m_pGlyph->m_Top, fill_argb);
+ }
+ FX_Free(pGlyphAndPos);
+ pGlyphAndPos = NULL;
+ }
+ CPDF_GraphicStates* pStates = CloneObjStates(textobj, FALSE);
+ CPDF_RenderOptions Options = m_Options;
+ Options.m_Flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;
+ Options.m_Flags &= ~RENDER_FORCE_DOWNSAMPLE;
+ CPDF_Dictionary* pFormResource = NULL;
+ if (pType3Char->m_pForm && pType3Char->m_pForm->m_pFormDict) {
+ pFormResource = pType3Char->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources"));
+ }
+ if (fill_alpha == 255) {
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, m_pDevice, NULL, NULL, this, pStates, &Options,
+ pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
+ status.m_Type3FontCache.Append(m_Type3FontCache);
+ status.m_Type3FontCache.Add(pType3Font);
+ m_pDevice->SaveState();
+ status.RenderObjectList(pType3Char->m_pForm, &matrix);
+ m_pDevice->RestoreState();
+ } else {
+ CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox();
+ rect_f.Transform(&matrix);
+ FX_RECT rect = rect_f.GetOutterRect();
+ CFX_FxgeDevice bitmap_device;
+ if (!bitmap_device.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_Argb)) {
+ return TRUE;
+ }
+ bitmap_device.GetBitmap()->Clear(0);
+ CPDF_RenderStatus status;
+ status.Initialize(m_Level + 1, m_pContext, &bitmap_device, NULL, NULL, this, pStates, &Options,
+ pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, FALSE, pType3Char, fill_argb);
+ status.m_Type3FontCache.Append(m_Type3FontCache);
+ status.m_Type3FontCache.Add(pType3Font);
+ matrix.TranslateI(-rect.left, -rect.top);
+ matrix.Scale(sa, sd);
+ status.RenderObjectList(pType3Char->m_pForm, &matrix);
+ m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top);
+ }
+ delete pStates;
+ } else if (pType3Char->m_pBitmap) {
+ if (device_class == FXDC_DISPLAY) {
+ CPDF_Type3Cache* pCache = GetCachedType3(pType3Font);
+ refTypeCache.m_dwCount++;
+ CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd);
+ if (pBitmap == NULL) {
+ continue;
+ }
+ int origin_x = FXSYS_round(matrix.e);
+ int origin_y = FXSYS_round(matrix.f);
+ if (pGlyphAndPos) {
+ pGlyphAndPos[iChar].m_pGlyph = pBitmap;
+ pGlyphAndPos[iChar].m_OriginX = origin_x;
+ pGlyphAndPos[iChar].m_OriginY = origin_y;
+ } else {
+ m_pDevice->SetBitMask(&pBitmap->m_Bitmap, origin_x + pBitmap->m_Left, origin_y - pBitmap->m_Top, fill_argb);
+ }
+ } else {
+ CFX_AffineMatrix image_matrix = pType3Char->m_ImageMatrix;
+ image_matrix.Concat(matrix);
+ CPDF_ImageRenderer renderer;
+ if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, &image_matrix, 0, FALSE)) {
+ renderer.Continue(NULL);
+ }
+ if (!renderer.m_Result) {
+ return FALSE;
+ }
+ }
+ }
+ }
+ if (pGlyphAndPos) {
+ FX_RECT rect = FXGE_GetGlyphsBBox(pGlyphAndPos, textobj->m_nChars, 0, sa, sd);
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create((int)(rect.Width() * sa), (int)(rect.Height() * sd), FXDIB_8bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+ }
+ bitmap.Clear(0);
+ for (int iChar = 0; iChar < textobj->m_nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ bitmap.TransferBitmap((int)((glyph.m_OriginX + glyph.m_pGlyph->m_Left - rect.left) * sa),
+ (int)((glyph.m_OriginY - glyph.m_pGlyph->m_Top - rect.top) * sd),
+ glyph.m_pGlyph->m_Bitmap.GetWidth(), glyph.m_pGlyph->m_Bitmap.GetHeight(),
+ &glyph.m_pGlyph->m_Bitmap, 0, 0);
+ }
+ m_pDevice->SetBitMask(&bitmap, rect.left, rect.top, fill_argb);
+ FX_Free(pGlyphAndPos);
+ }
+ return TRUE;
+}
+class CPDF_CharPosList
+{
+public:
+ CPDF_CharPosList();
+ ~CPDF_CharPosList();
+ void Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont, FX_FLOAT font_size);
+ FXTEXT_CHARPOS* m_pCharPos;
+ FX_DWORD m_nChars;
+};
+FX_FLOAT _CIDTransformToFloat(FX_BYTE ch);
+CPDF_CharPosList::CPDF_CharPosList()
+{
+ m_pCharPos = NULL;
+}
+CPDF_CharPosList::~CPDF_CharPosList()
+{
+ if (m_pCharPos) {
+ FX_Free(m_pCharPos);
+ }
+}
+void CPDF_CharPosList::Load(int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos, CPDF_Font* pFont,
+ FX_FLOAT FontSize)
+{
+ m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, nChars);
+ FXSYS_memset32(m_pCharPos, 0, sizeof(FXTEXT_CHARPOS) * nChars);
+ m_nChars = 0;
+ CPDF_CIDFont* pCIDFont = pFont->GetCIDFont();
+ FX_BOOL bVertWriting = pCIDFont && pCIDFont->IsVertWriting();
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ FX_DWORD CharCode = nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pCharCodes : pCharCodes[iChar];
+ if (CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_BOOL bVert = FALSE;
+ FXTEXT_CHARPOS& charpos = m_pCharPos[m_nChars++];
+ if (pCIDFont) {
+ charpos.m_bFontStyle = pCIDFont->IsFontStyleFromCharCode(CharCode);
+ }
+ charpos.m_GlyphIndex = pFont->GlyphFromCharCode(CharCode, &bVert);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ charpos.m_ExtGID = pFont->GlyphFromCharCodeExt(CharCode);
+#endif
+ if (!pFont->IsEmbedded() && pFont->GetFontType() != PDFFONT_CIDFONT) {
+ charpos.m_FontCharWidth = pFont->GetCharWidthF(CharCode);
+ } else {
+ charpos.m_FontCharWidth = 0;
+ }
+ charpos.m_OriginX = iChar ? pCharPos[iChar - 1] : 0;
+ charpos.m_OriginY = 0;
+ charpos.m_bGlyphAdjust = FALSE;
+ if (pCIDFont == NULL) {
+ continue;
+ }
+ FX_WORD CID = pCIDFont->CIDFromCharCode(CharCode);
+ if (bVertWriting) {
+ charpos.m_OriginY = charpos.m_OriginX;
+ charpos.m_OriginX = 0;
+ short vx, vy;
+ pCIDFont->GetVertOrigin(CID, vx, vy);
+ charpos.m_OriginX -= FontSize * vx / 1000;
+ charpos.m_OriginY -= FontSize * vy / 1000;
+ }
+ FX_LPCBYTE pTransform = pCIDFont->GetCIDTransform(CID);
+ if (pTransform && !bVert) {
+ charpos.m_AdjustMatrix[0] = _CIDTransformToFloat(pTransform[0]);
+ charpos.m_AdjustMatrix[2] = _CIDTransformToFloat(pTransform[2]);
+ charpos.m_AdjustMatrix[1] = _CIDTransformToFloat(pTransform[1]);
+ charpos.m_AdjustMatrix[3] = _CIDTransformToFloat(pTransform[3]);
+ charpos.m_OriginX += _CIDTransformToFloat(pTransform[4]) * FontSize;
+ charpos.m_OriginY += _CIDTransformToFloat(pTransform[5]) * FontSize;
+ charpos.m_bGlyphAdjust = TRUE;
+ }
+ }
+}
+FX_BOOL CPDF_TextRenderer::DrawTextPath(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pText2User, const CFX_AffineMatrix* pUser2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_ARGB fill_argb, FX_ARGB stroke_argb, CFX_PathData* pClippingPath, int nFlag)
+{
+ CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
+ return pDevice->DrawTextPath(CharPosList.m_nChars, CharPosList.m_pCharPos,
+ &pFont->m_Font, pCache, font_size, pText2User, pUser2Device,
+ pGraphState, fill_argb, stroke_argb, pClippingPath, nFlag);
+}
+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, int left, int top, CPDF_Font* pFont, int height,
+ const CFX_ByteString& str, FX_ARGB argb)
+{
+ FX_RECT font_bbox;
+ pFont->GetFontBBox(font_bbox);
+ FX_FLOAT font_size = (FX_FLOAT)height * 1000.0f / (FX_FLOAT)(font_bbox.top - font_bbox.bottom);
+ FX_FLOAT origin_x = (FX_FLOAT)left;
+ FX_FLOAT origin_y = (FX_FLOAT)top + font_size * (FX_FLOAT)font_bbox.top / 1000.0f;
+ CFX_AffineMatrix matrix(1.0f, 0, 0, -1.0f, 0, 0);
+ DrawTextString(pDevice, origin_x, origin_y, pFont, font_size, &matrix, str, argb);
+}
+void CPDF_TextRenderer::DrawTextString(CFX_RenderDevice* pDevice, FX_FLOAT origin_x, FX_FLOAT origin_y, CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pMatrix, const CFX_ByteString& str, FX_ARGB fill_argb,
+ FX_ARGB stroke_argb, const CFX_GraphStateData* pGraphState, const CPDF_RenderOptions* pOptions)
+{
+ int nChars = pFont->CountChar(str, str.GetLength());
+ if (nChars == 0) {
+ return;
+ }
+ FX_DWORD charcode;
+ int offset = 0;
+ FX_DWORD* pCharCodes;
+ FX_FLOAT* pCharPos;
+ if (nChars == 1) {
+ charcode = pFont->GetNextChar(str, offset);
+ pCharCodes = (FX_DWORD*)(FX_UINTPTR)charcode;
+ pCharPos = NULL;
+ } else {
+ pCharCodes = FX_Alloc(FX_DWORD, nChars);
+ pCharPos = FX_Alloc(FX_FLOAT, nChars - 1);
+ FX_FLOAT cur_pos = 0;
+ for (int i = 0; i < nChars; i ++) {
+ pCharCodes[i] = pFont->GetNextChar(str, offset);
+ if (i) {
+ pCharPos[i - 1] = cur_pos;
+ }
+ cur_pos += pFont->GetCharWidthF(pCharCodes[i]) * font_size / 1000;
+ }
+ }
+ CFX_AffineMatrix matrix;
+ if (pMatrix) {
+ matrix = *pMatrix;
+ }
+ matrix.e = origin_x;
+ matrix.f = origin_y;
+ if (pFont->GetFontType() == PDFFONT_TYPE3)
+ ;
+ else if (stroke_argb == 0) {
+ DrawNormalText(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, fill_argb, pOptions);
+ } else
+ DrawTextPath(pDevice, nChars, pCharCodes, pCharPos, pFont, font_size, &matrix, NULL, pGraphState,
+ fill_argb, stroke_argb, NULL);
+ if (nChars > 1) {
+ FX_Free(pCharCodes);
+ FX_Free(pCharPos);
+ }
+}
+FX_BOOL CPDF_TextRenderer::DrawNormalText(CFX_RenderDevice* pDevice, int nChars, FX_DWORD* pCharCodes, FX_FLOAT* pCharPos,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pText2Device,
+ FX_ARGB fill_argb, const CPDF_RenderOptions* pOptions)
+{
+ CFX_FontCache* pCache = pFont->m_pDocument ? pFont->m_pDocument->GetRenderData()->GetFontCache() : NULL;
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(nChars, pCharCodes, pCharPos, pFont, font_size);
+ int FXGE_flags = 0;
+ if (pOptions) {
+ FX_DWORD dwFlags = pOptions->m_Flags;
+ if (dwFlags & RENDER_CLEARTYPE) {
+ FXGE_flags |= FXTEXT_CLEARTYPE;
+ if (dwFlags & RENDER_BGR_STRIPE) {
+ FXGE_flags |= FXTEXT_BGR_STRIPE;
+ }
+ }
+ if (dwFlags & RENDER_NOTEXTSMOOTH) {
+ FXGE_flags |= FXTEXT_NOSMOOTH;
+ }
+ if (dwFlags & RENDER_PRINTGRAPHICTEXT) {
+ FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;
+ }
+ if (dwFlags & RENDER_NO_NATIVETEXT) {
+ FXGE_flags |= FXTEXT_NO_NATIVETEXT;
+ }
+ if (dwFlags & RENDER_PRINTIMAGETEXT) {
+ FXGE_flags |= FXTEXT_PRINTIMAGETEXT;
+ }
+ } else {
+ FXGE_flags = FXTEXT_CLEARTYPE;
+ }
+ if (pFont->GetFontType() & PDFFONT_CIDFONT) {
+ FXGE_flags |= FXFONT_CIDFONT;
+ }
+ return pDevice->DrawNormalText(CharPosList.m_nChars, CharPosList.m_pCharPos, &pFont->m_Font, pCache, font_size, pText2Device, fill_argb, FXGE_flags);
+}
+void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke)
+{
+ if (!bStroke) {
+ CPDF_PathObject path;
+ CPDF_TextObject* pCopy = FX_NEW CPDF_TextObject;
+ pCopy->Copy(textobj);
+ path.m_bStroke = FALSE;
+ path.m_FillType = FXFILL_WINDING;
+ path.m_ClipPath.AppendTexts(&pCopy, 1);
+ path.m_ColorState = textobj->m_ColorState;
+ path.m_Path.New()->AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right, textobj->m_Top);
+ path.m_Left = textobj->m_Left;
+ path.m_Bottom = textobj->m_Bottom;
+ path.m_Right = textobj->m_Right;
+ path.m_Top = textobj->m_Top;
+ RenderSingleObject(&path, pObj2Device);
+ return;
+ }
+ CFX_FontCache* pCache;
+ if (pFont->m_pDocument) {
+ pCache = pFont->m_pDocument->GetRenderData()->GetFontCache();
+ } else {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(&pFont->m_Font);
+ FX_FONTCACHE_DEFINE(pCache, &pFont->m_Font);
+ CPDF_CharPosList CharPosList;
+ CharPosList.Load(textobj->m_nChars, textobj->m_pCharCodes, textobj->m_pCharPos, pFont, font_size);
+ for (FX_DWORD i = 0; i < CharPosList.m_nChars; i ++) {
+ FXTEXT_CHARPOS& charpos = CharPosList.m_pCharPos[i];
+ const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(&pFont->m_Font, charpos.m_GlyphIndex,
+ charpos.m_FontCharWidth);
+ if (pPath == NULL) {
+ continue;
+ }
+ CPDF_PathObject path;
+ path.m_GraphState = textobj->m_GraphState;
+ path.m_ColorState = textobj->m_ColorState;
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
+ path.m_Path.New()->Append(pPath, &matrix);
+ path.m_Matrix = *pTextMatrix;
+ path.m_bStroke = bStroke;
+ path.m_FillType = bFill ? FXFILL_WINDING : 0;
+ path.CalcBoundingBox();
+ ProcessPath(&path, pObj2Device);
+ }
+}
+CFX_PathData* CPDF_Font::LoadGlyphPath(FX_DWORD charcode, int dest_width)
+{
+ int glyph_index = GlyphFromCharCode(charcode);
+ if (m_Font.m_Face == NULL) {
+ return NULL;
+ }
+ return m_Font.LoadGlyphPath(glyph_index, dest_width);
+}
diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h
new file mode 100644
index 0000000000..3acde0ec43
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_render/render_int.h
@@ -0,0 +1,462 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PAGEOBJ_H_
+#include "../../../include/fpdfapi/fpdf_pageobj.h"
+#endif
+class CPDF_QuickStretcher;
+#define TYPE3_MAX_BLUES 16
+class CPDF_Type3Glyphs : public CFX_Object
+{
+public:
+ CPDF_Type3Glyphs()
+ {
+ m_GlyphMap.InitHashTable(253);
+ m_TopBlueCount = m_BottomBlueCount = 0;
+ }
+ ~CPDF_Type3Glyphs();
+ CFX_MapPtrToPtr m_GlyphMap;
+ void AdjustBlue(FX_FLOAT top, FX_FLOAT bottom, int& top_line, int& bottom_line);
+
+ int m_TopBlue[TYPE3_MAX_BLUES], m_BottomBlue[TYPE3_MAX_BLUES];
+ int m_TopBlueCount, m_BottomBlueCount;
+};
+class CFX_GlyphBitmap;
+class CPDF_Type3Cache : public CFX_Object
+{
+public:
+ CPDF_Type3Cache(CPDF_Type3Font* pFont)
+ {
+ m_pFont = pFont;
+ }
+ ~CPDF_Type3Cache();
+ CFX_GlyphBitmap* LoadGlyph(FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+protected:
+ CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, FX_DWORD charcode, const CFX_AffineMatrix* pMatrix, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+ CPDF_Type3Font* m_pFont;
+ CFX_MapByteStringToPtr m_SizeMap;
+};
+class CPDF_TransferFunc : public CFX_Object
+{
+public:
+ CPDF_Document* m_pPDFDoc;
+ FX_BYTE m_Samples[256 * 3];
+ FX_BOOL m_bIdentity;
+
+ CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc);
+ FX_COLORREF TranslateColor(FX_COLORREF src);
+};
+typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap;
+typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap;
+class CPDF_DocRenderData : public CFX_Object
+{
+public:
+ CPDF_DocRenderData(CPDF_Document* pPDFDoc = NULL);
+ ~CPDF_DocRenderData();
+ FX_BOOL Initialize();
+ CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
+ CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObj);
+ CFX_FontCache* GetFontCache()
+ {
+ return m_pFontCache;
+ }
+ void Clear(FX_BOOL bRelease = FALSE);
+ void ReleaseCachedType3(CPDF_Type3Font* pFont);
+ void ReleaseTransferFunc(CPDF_Object* pObj);
+private:
+ CPDF_Document* m_pPDFDoc;
+ CFX_FontCache* m_pFontCache;
+ CPDF_Type3CacheMap m_Type3FaceMap;
+ CPDF_TransferFuncMap m_TransferFuncMap;
+};
+struct _PDF_RenderItem {
+public:
+ CPDF_PageObjects* m_pObjectList;
+ CFX_AffineMatrix m_Matrix;
+};
+typedef CFX_ArrayTemplate<_PDF_RenderItem> CPDF_RenderLayer;
+class IPDF_ObjectRenderer : public CFX_Object
+{
+public:
+ static IPDF_ObjectRenderer* Create(int type);
+ virtual ~IPDF_ObjectRenderer() {}
+ virtual FX_BOOL Start(CPDF_RenderStatus* pRenderStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL) = 0;
+ virtual FX_BOOL Continue(IFX_Pause* pPause) = 0;
+ FX_BOOL m_Result;
+};
+class CPDF_RenderStatus : public CFX_Object
+{
+public:
+ CPDF_RenderStatus();
+ ~CPDF_RenderStatus();
+ FX_BOOL Initialize(int level, class CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pDeviceMatrix,
+ const CPDF_PageObject* pStopObj, const CPDF_RenderStatus* pParentStatus,
+ const CPDF_GraphicStates* pInitialStates, const CPDF_RenderOptions* pOptions,
+ int transparency, FX_BOOL bDropObjects, CPDF_Dictionary* pFormResource = NULL,
+ FX_BOOL bStdCS = FALSE, CPDF_Type3Char* pType3Char = NULL, FX_ARGB fill_color = 0,
+ FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ void RenderObjectList(const CPDF_PageObjects* pObjs, const CFX_AffineMatrix* pObj2Device);
+ void RenderSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ContinueSingleObject(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, IFX_Pause* pPause);
+ CPDF_RenderOptions m_Options;
+ CPDF_Dictionary* m_pFormResource;
+ CPDF_Dictionary* m_pPageResource;
+ CFX_PtrArray m_Type3FontCache;
+ CPDF_RenderContext* GetContext()
+ {
+ return m_pContext;
+ }
+protected:
+ friend class CPDF_ImageRenderer;
+ friend class CPDF_RenderContext;
+ void ProcessClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
+ void DrawClipPath(CPDF_ClipPath ClipPath, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessTransparency(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
+ void ProcessObjectNoClip(const CPDF_PageObject* PageObj, const CFX_AffineMatrix* pObj2Device);
+ void DrawObjWithBackground(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL DrawObjWithBlend(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device);
+ void ProcessPathPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, int& filltype, FX_BOOL& bStroke);
+ void DrawPathWithPattern(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke);
+ void DrawTilingPattern(CPDF_TilingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ void DrawShadingPattern(CPDF_ShadingPattern* pPattern, CPDF_PageObject* pPageObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ FX_BOOL SelectClipPath(CPDF_PathObject* pPathObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStroke);
+ FX_BOOL ProcessImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL OutputBitmapAlpha(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
+ FX_BOOL OutputImage(CPDF_ImageObject* pImageObj, const CFX_AffineMatrix* pImage2Device);
+ FX_BOOL OutputDIBSource(const CFX_DIBSource* pOutputBitmap, FX_ARGB fill_argb, int bitmap_alpha,
+ const CFX_AffineMatrix* pImage2Device, CPDF_ImageCache* pImageCache, FX_DWORD flags);
+ void CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int top, FX_ARGB mask_argb,
+ int bitmap_alpha, int blend_mode, int bIsolated);
+ FX_BOOL ProcessInlines(CPDF_InlineImages* pInlines, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessShading(CPDF_ShadingObject* pShadingObj, const CFX_AffineMatrix* pObj2Device);
+ void DrawShading(CPDF_ShadingPattern* pPattern, CFX_AffineMatrix* pMatrix, FX_RECT& clip_rect,
+ int alpha, FX_BOOL bAlphaMode);
+ FX_BOOL ProcessType3Text(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL ProcessText(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device, CFX_PathData* pClippingPath);
+ void DrawTextPathWithPattern(const CPDF_TextObject* textobj, const CFX_AffineMatrix* pObj2Device,
+ CPDF_Font* pFont, FX_FLOAT font_size,
+ const CFX_AffineMatrix* pTextMatrix, FX_BOOL bFill, FX_BOOL bStroke);
+ FX_BOOL ProcessForm(CPDF_FormObject* pFormObj, const CFX_AffineMatrix* pObj2Device);
+ CFX_DIBitmap* GetBackdrop(const CPDF_PageObject* pObj, const FX_RECT& rect, int& left, int& top,
+ FX_BOOL bBackAlphaRequired);
+ CFX_DIBitmap* LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_AffineMatrix* pMatrix);
+ void Init(CPDF_RenderContext* pParent);
+ static class CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont);
+ static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, FX_BOOL bStroke);
+ CPDF_TransferFunc* GetTransferFunc(CPDF_Object* pObject) const;
+ FX_ARGB GetFillArgb(const CPDF_PageObject* pObj, FX_BOOL bType3 = FALSE) const;
+ FX_ARGB GetStrokeArgb(const CPDF_PageObject* pObj) const;
+ CPDF_RenderContext* m_pContext;
+ FX_BOOL m_bStopped;
+ void DitherObjectArea(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device);
+ FX_BOOL GetObjectClippedRect(const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bLogical, FX_RECT &rect) const;
+ void GetScaledMatrix(CFX_Matrix &matrix) const;
+protected:
+ int m_Level;
+ CFX_RenderDevice* m_pDevice;
+ CFX_AffineMatrix m_DeviceMatrix;
+ CPDF_ClipPath m_LastClipPath;
+ const CPDF_PageObject* m_pCurObj;
+ const CPDF_PageObject* m_pStopObj;
+ CPDF_GraphicStates m_InitialStates;
+ int m_HalftoneLimit;
+ IPDF_ObjectRenderer* m_pObjectRenderer;
+ FX_BOOL m_bPrint;
+ int m_Transparency;
+ int m_DitherBits;
+ FX_BOOL m_bDropObjects;
+ FX_BOOL m_bStdCS;
+ FX_DWORD m_GroupFamily;
+ FX_BOOL m_bLoadMask;
+ CPDF_Type3Char * m_pType3Char;
+ FX_ARGB m_T3FillColor;
+ int m_curBlend;
+};
+class CPDF_ImageLoader : public CFX_Object
+{
+public:
+ CPDF_ImageLoader()
+ {
+ m_pBitmap = NULL;
+ m_pMask = NULL;
+ m_MatteColor = 0;
+ m_bCached = FALSE;
+ m_nDownsampleWidth = 0;
+ m_nDownsampleHeight = 0;
+ }
+
+ FX_BOOL Load(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL);
+
+ FX_BOOL StartLoadImage(const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_LPVOID& LoadHandle, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
+ FX_BOOL Continue(FX_LPVOID LoadHandle, IFX_Pause* pPause);
+ ~CPDF_ImageLoader();
+ CFX_DIBSource* m_pBitmap;
+ CFX_DIBSource* m_pMask;
+ FX_DWORD m_MatteColor;
+ FX_BOOL m_bCached;
+protected:
+ FX_INT32 m_nDownsampleWidth;
+ FX_INT32 m_nDownsampleHeight;
+};
+class CPDF_ProgressiveImageLoaderHandle : public CFX_Object
+{
+public:
+ CPDF_ProgressiveImageLoaderHandle();
+ ~CPDF_ProgressiveImageLoaderHandle();
+
+ FX_BOOL Start(CPDF_ImageLoader* pImageLoader, const CPDF_ImageObject* pImage, CPDF_PageRenderCache* pCache, FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 nDownsampleWidth = 0, FX_INT32 nDownsampleHeight = 0);
+ FX_BOOL Continue(IFX_Pause* pPause);
+protected:
+ CPDF_ImageLoader* m_pImageLoader;
+ CPDF_PageRenderCache* m_pCache;
+ CPDF_ImageObject* m_pImage;
+ FX_INT32 m_nDownsampleWidth;
+ FX_INT32 m_nDownsampleHeight;
+};
+class CFX_ImageTransformer;
+class CPDF_ImageRenderer : public IPDF_ObjectRenderer
+{
+public:
+ CPDF_ImageRenderer();
+ ~CPDF_ImageRenderer();
+ FX_BOOL Start(CPDF_RenderStatus* pStatus, const CPDF_PageObject* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
+ FX_BOOL Start(CPDF_RenderStatus* pStatus, const CFX_DIBSource* pDIBSource, FX_ARGB bitmap_argb,
+ int bitmap_alpha, const CFX_AffineMatrix* pImage2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType = FXDIB_BLEND_NORMAL);
+ FX_BOOL Continue(IFX_Pause* pPause);
+protected:
+ CPDF_RenderStatus* m_pRenderStatus;
+ CPDF_ImageObject* m_pImageObject;
+ int m_Status;
+ const CFX_AffineMatrix* m_pObj2Device;
+ CFX_AffineMatrix m_ImageMatrix;
+ CPDF_ImageLoader m_Loader;
+ const CFX_DIBSource* m_pDIBSource;
+ CFX_DIBitmap* m_pClone;
+ int m_BitmapAlpha;
+ FX_BOOL m_bPatternColor;
+ CPDF_Pattern* m_pPattern;
+ FX_ARGB m_FillArgb;
+ FX_DWORD m_Flags;
+ CPDF_QuickStretcher* m_pQuickStretcher;
+ CFX_ImageTransformer* m_pTransformer;
+ CPDF_ImageRenderer* m_pRenderer2;
+ FX_LPVOID m_DeviceHandle;
+ FX_LPVOID m_LoadHandle;
+ FX_BOOL m_bStdCS;
+ int m_BlendType;
+ FX_BOOL StartBitmapAlpha();
+ FX_BOOL StartDIBSource();
+ FX_BOOL StartRenderDIBSource();
+ FX_BOOL StartLoadDIBSource();
+ FX_BOOL DrawMaskedImage();
+ FX_BOOL DrawPatternImage(const CFX_Matrix* pObj2Device);
+};
+class CPDF_ScaledRenderBuffer : public CFX_Object
+{
+public:
+ CPDF_ScaledRenderBuffer();
+ ~CPDF_ScaledRenderBuffer();
+ FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, const CPDF_RenderOptions *pOptions = NULL, int max_dpi = 0);
+ CFX_RenderDevice* GetDevice()
+ {
+ return m_pBitmapDevice ? m_pBitmapDevice : m_pDevice;
+ }
+ CFX_AffineMatrix* GetMatrix()
+ {
+ return &m_Matrix;
+ }
+ void OutputToDevice();
+private:
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ FX_RECT m_Rect;
+ const CPDF_PageObject* m_pObject;
+ CFX_FxgeDevice* m_pBitmapDevice;
+ CFX_AffineMatrix m_Matrix;
+};
+class ICodec_ScanlineDecoder;
+class CPDF_QuickStretcher : public CFX_Object
+{
+public:
+ CPDF_QuickStretcher();
+ ~CPDF_QuickStretcher();
+ FX_BOOL Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox);
+ FX_BOOL Continue(IFX_Pause* pPause);
+ CFX_DIBitmap* m_pBitmap;
+ int m_ResultLeft, m_ResultTop, m_ClipLeft, m_ClipTop;
+ int m_DestWidth, m_DestHeight, m_ResultWidth, m_ResultHeight;
+ int m_Bpp, m_SrcWidth, m_SrcHeight;
+ FX_BOOL m_bFlipX, m_bFlipY;
+ CPDF_ColorSpace* m_pCS;
+ ICodec_ScanlineDecoder* m_pDecoder;
+ CPDF_StreamAcc m_StreamAcc;
+ int m_LineIndex;
+};
+class CPDF_DeviceBuffer : public CFX_Object
+{
+public:
+ CPDF_DeviceBuffer();
+ ~CPDF_DeviceBuffer();
+ FX_BOOL Initialize(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice, FX_RECT* pRect,
+ const CPDF_PageObject* pObj, int max_dpi = 0);
+ void OutputToDevice();
+ CFX_DIBitmap* GetBitmap() const
+ {
+ return m_pBitmap;
+ }
+ const CFX_AffineMatrix* GetMatrix() const
+ {
+ return &m_Matrix;
+ }
+private:
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ FX_RECT m_Rect;
+ const CPDF_PageObject* m_pObject;
+ CFX_DIBitmap* m_pBitmap;
+ CFX_AffineMatrix m_Matrix;
+};
+class CPDF_ImageCache : public CFX_Object
+{
+public:
+ CPDF_ImageCache(CPDF_Document* pDoc, CPDF_Stream* pStream);
+ ~CPDF_ImageCache();
+ void ClearImageData();
+ void Reset(const CFX_DIBitmap* pBitmap);
+ FX_BOOL GetCachedBitmap(CFX_DIBSource*& pBitmap, CFX_DIBSource*& pMask, FX_DWORD& MatteColor, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE,
+ CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+ FX_DWORD EstimateSize() const
+ {
+ return m_dwCacheSize;
+ }
+ FX_DWORD GetTimeCount() const
+ {
+ return m_dwTimeCount;
+ }
+ CPDF_Stream* GetStream() const
+ {
+ return m_pStream;
+ }
+ void SetTimeCount(FX_DWORD dwTimeCount)
+ {
+ m_dwTimeCount = dwTimeCount;
+ }
+ int m_dwTimeCount;
+public:
+ int StartGetCachedBitmap(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0,
+ FX_BOOL bLoadMask = FALSE, CPDF_RenderStatus* pRenderStatus = NULL, FX_INT32 downsampleWidth = 0, FX_INT32 downsampleHeight = 0);
+ int Continue(IFX_Pause* pPause);
+ int ContinueGetCachedBitmap();
+ CFX_DIBSource* DetachBitmap();
+ CFX_DIBSource* DetachMask();
+ CFX_DIBSource* m_pCurBitmap;
+ CFX_DIBSource* m_pCurMask;
+ FX_DWORD m_MatteColor;
+ CPDF_RenderStatus* m_pRenderStatus;
+protected:
+ CPDF_Document* m_pDocument;
+ CPDF_Stream* m_pStream;
+ CFX_DIBSource* m_pCachedBitmap;
+ CFX_DIBSource* m_pCachedMask;
+ FX_DWORD m_dwCacheSize;
+ void CalcSize();
+};
+typedef struct {
+ FX_FLOAT m_DecodeMin;
+ FX_FLOAT m_DecodeStep;
+ int m_ColorKeyMin;
+ int m_ColorKeyMax;
+} DIB_COMP_DATA;
+class CPDF_DIBSource : public CFX_DIBSource
+{
+public:
+ CPDF_DIBSource();
+ virtual ~CPDF_DIBSource();
+ FX_BOOL Load(CPDF_Document* pDoc, const CPDF_Stream* pStream,
+ CPDF_DIBSource** ppMask, FX_DWORD* pMatteColor,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ virtual FX_BOOL SkipToScanline(int line, IFX_Pause* pPause) const;
+ virtual FX_LPBYTE GetBuffer() const;
+ virtual FX_LPCBYTE GetScanline(int line) const;
+ virtual void DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const;
+ virtual void SetDownSampleSize(int dest_width, int dest_height) const;
+ CFX_DIBitmap* GetBitmap() const;
+ void ReleaseBitmap(CFX_DIBitmap*) const;
+ void ClearImageData();
+public:
+ int StartLoadDIBSource(CPDF_Document* pDoc, const CPDF_Stream* pStream, FX_BOOL bHasMask,
+ CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources,
+ FX_BOOL bStdCS = FALSE, FX_DWORD GroupFamily = 0, FX_BOOL bLoadMask = FALSE);
+ int ContinueLoadDIBSource(IFX_Pause* pPause);
+ int StratLoadMask();
+ int StartLoadMaskDIB();
+ int ContinueLoadMaskDIB(IFX_Pause* pPause);
+ int ContinueToLoadMask();
+ CPDF_DIBSource* DetachMask();
+ CPDF_DIBSource* m_pMask;
+ FX_DWORD m_MatteColor;
+ FX_LPVOID m_pJbig2Context;
+ CPDF_StreamAcc* m_pGlobalStream;
+ FX_BOOL m_bStdCS;
+ int m_Status;
+ CPDF_Object* m_pMaskStream;
+ FX_BOOL m_bHasMask;
+protected:
+ FX_BOOL LoadColorInfo(CPDF_Dictionary* pFormResources, CPDF_Dictionary* pPageResources);
+ CPDF_DIBSource* LoadMask(FX_DWORD& MatteColor);
+ CPDF_DIBSource* LoadMaskDIB(CPDF_Stream* pMask);
+ void LoadJpxBitmap();
+ void LoadJbig2Bitmap();
+ void LoadPalette();
+ FX_BOOL CreateDecoder();
+ void TranslateScanline24bpp(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan) const;
+ FX_DWORD GetValidBpp() const;
+
+ CPDF_Document* m_pDocument;
+ const CPDF_Stream* m_pStream;
+ CPDF_StreamAcc* m_pStreamAcc;
+ const CPDF_Dictionary* m_pDict;
+ CPDF_ColorSpace* m_pColorSpace;
+ FX_DWORD m_Family, m_bpc, m_nComponents, m_GroupFamily;
+ FX_BOOL m_bLoadMask;
+ FX_BOOL m_bDefaultDecode, m_bImageMask, m_bColorKey;
+ DIB_COMP_DATA* m_pCompData;
+ FX_LPBYTE m_pLineBuf;
+ FX_LPBYTE m_pMaskedLine;
+ CFX_DIBitmap* m_pCachedBitmap;
+ ICodec_ScanlineDecoder* m_pDecoder;
+};
+#ifdef _FPDFAPI_MINI_
+#define FPDF_HUGE_IMAGE_SIZE 3000000
+#else
+#define FPDF_HUGE_IMAGE_SIZE 60000000
+#endif
+class CPDF_DIBTransferFunc : public CFX_FilteredDIB
+{
+public:
+ CPDF_DIBTransferFunc(const CPDF_TransferFunc* pTransferFunc);
+ virtual FXDIB_Format GetDestFormat();
+ virtual FX_ARGB* GetDestPalette()
+ {
+ return NULL;
+ }
+ virtual void TranslateScanline(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf) const;
+ virtual void TranslateDownSamples(FX_LPBYTE dest_buf, FX_LPCBYTE src_buf, int pixels, int Bpp) const;
+ FX_LPCBYTE m_RampR;
+ FX_LPCBYTE m_RampG;
+ FX_LPCBYTE m_RampB;
+};
+struct _CPDF_UniqueKeyGen {
+ void Generate(int count, ...);
+ FX_CHAR m_Key[128];
+ int m_KeyLen;
+};
diff --git a/core/src/fpdfdoc/doc_action.cpp b/core/src/fpdfdoc/doc_action.cpp
new file mode 100644
index 0000000000..f13bd27cbe
--- /dev/null
+++ b/core/src/fpdfdoc/doc_action.cpp
@@ -0,0 +1,362 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_Dest CPDF_Action::GetDest(CPDF_Document* pDoc) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString type = m_pDict->GetString("S");
+ if (type != "GoTo" && type != "GoToR") {
+ return NULL;
+ }
+ CPDF_Object* pDest = m_pDict->GetElementValue("D");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDoc, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+const FX_CHAR* g_sATypes[] = {"Unknown", "GoTo", "GoToR", "GoToE", "Launch", "Thread", "URI", "Sound", "Movie",
+ "Hide", "Named", "SubmitForm", "ResetForm", "ImportData", "JavaScript", "SetOCGState",
+ "Rendition", "Trans", "GoTo3DView", ""
+ };
+CPDF_Action::ActionType CPDF_Action::GetType() const
+{
+ ActionType eType = Unknown;
+ if (m_pDict != NULL) {
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (!csType.IsEmpty()) {
+ int i = 0;
+ while (g_sATypes[i][0] != '\0') {
+ if (csType == g_sATypes[i]) {
+ return (ActionType)i;
+ }
+ i ++;
+ }
+ }
+ }
+ return eType;
+}
+CFX_WideString CPDF_Action::GetFilePath() const
+{
+ CFX_ByteString type = m_pDict->GetString("S");
+ if (type != "GoToR" && type != "Launch" &&
+ type != "SubmitForm" && type != "ImportData") {
+ return CFX_WideString();
+ }
+ CPDF_Object* pFile = m_pDict->GetElementValue("F");
+ CFX_WideString path;
+ if (pFile == NULL) {
+ if (type == "Launch") {
+ CPDF_Dictionary* pWinDict = m_pDict->GetDict(FX_BSTRC("Win"));
+ if (pWinDict) {
+ return CFX_WideString::FromLocal(pWinDict->GetString(FX_BSTRC("F")));
+ }
+ }
+ return path;
+ }
+ CPDF_FileSpec filespec(pFile);
+ filespec.GetFileName(path);
+ return path;
+}
+CFX_ByteString CPDF_Action::GetURI(CPDF_Document* pDoc) const
+{
+ CFX_ByteString csURI;
+ if (m_pDict == NULL) {
+ return csURI;
+ }
+ if (m_pDict->GetString("S") != "URI") {
+ return csURI;
+ }
+ csURI = m_pDict->GetString("URI");
+ CPDF_Dictionary* pRoot = pDoc->GetRoot();
+ CPDF_Dictionary* pURI = pRoot->GetDict("URI");
+ if (pURI != NULL) {
+ if (csURI.Find(FX_BSTRC(":"), 0) < 1) {
+ csURI = pURI->GetString("Base") + csURI;
+ }
+ }
+ return csURI;
+}
+FX_DWORD CPDF_ActionFields::GetFieldsCount() const
+{
+ if (m_pAction == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return 0;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return 0;
+ }
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY) {
+ return 1;
+ } else if (iType == PDFOBJ_STRING) {
+ return 1;
+ } else if (iType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pFields)->GetCount();
+ }
+ return 0;
+}
+void CPDF_ActionFields::GetAllFields(CFX_PtrArray& fieldObjects) const
+{
+ fieldObjects.RemoveAll();
+ if (m_pAction == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return;
+ }
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
+ fieldObjects.Add(pFields);
+ } else if (iType == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pFields;
+ FX_DWORD iCount = pArray->GetCount();
+ for (FX_DWORD i = 0; i < iCount; i ++) {
+ CPDF_Object* pObj = pArray->GetElementValue(i);
+ if (pObj != NULL) {
+ fieldObjects.Add(pObj);
+ }
+ }
+ }
+}
+CPDF_Object* CPDF_ActionFields::GetField(FX_DWORD iIndex) const
+{
+ if (m_pAction == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)(*m_pAction);
+ if (pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csType = pDict->GetString("S");
+ CPDF_Object* pFields = NULL;
+ if (csType == "Hide") {
+ pFields = pDict->GetElementValue("T");
+ } else {
+ pFields = pDict->GetArray("Fields");
+ }
+ if (pFields == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pFindObj = NULL;
+ int iType = pFields->GetType();
+ if (iType == PDFOBJ_DICTIONARY || iType == PDFOBJ_STRING) {
+ if (iIndex == 0) {
+ pFindObj = pFields;
+ }
+ } else if (iType == PDFOBJ_ARRAY) {
+ pFindObj = ((CPDF_Array*)pFields)->GetElementValue(iIndex);
+ }
+ return pFindObj;
+}
+CPDF_LWinParam CPDF_Action::GetWinParam() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ if (m_pDict->GetString("S") != "Launch") {
+ return NULL;
+ }
+ return m_pDict->GetDict("Win");
+}
+CFX_WideString CPDF_Action::GetJavaScript() const
+{
+ CFX_WideString csJS;
+ if (m_pDict == NULL) {
+ return csJS;
+ }
+ CPDF_Object* pJS = m_pDict->GetElementValue("JS");
+ if (pJS != NULL) {
+ return pJS->GetUnicodeText();
+ }
+ return csJS;
+}
+CPDF_Dictionary* CPDF_Action::GetAnnot() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (csType == FX_BSTRC("Rendition")) {
+ return m_pDict->GetDict("AN");
+ } else if (csType == FX_BSTRC("Movie")) {
+ return m_pDict->GetDict("Annotation");
+ }
+ return NULL;
+}
+FX_INT32 CPDF_Action::GetOperationType() const
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ CFX_ByteString csType = m_pDict->GetString("S");
+ if (csType == FX_BSTRC("Rendition")) {
+ return m_pDict->GetInteger("OP");
+ } else if (csType == FX_BSTRC("Movie")) {
+ CFX_ByteString csOP = m_pDict->GetString("Operation");
+ if (csOP == FX_BSTRC("Play")) {
+ return 0;
+ } else if (csOP == FX_BSTRC("Stop")) {
+ return 1;
+ } else if (csOP == FX_BSTRC("Pause")) {
+ return 2;
+ } else if (csOP == FX_BSTRC("Resume")) {
+ return 3;
+ }
+ }
+ return 0;
+}
+FX_DWORD CPDF_Action::GetSubActionsCount() const
+{
+ if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
+ return 0;
+ }
+ CPDF_Object* pNext = m_pDict->GetElementValue("Next");
+ if (!pNext) {
+ return 0;
+ }
+ int iObjType = pNext->GetType();
+ if (iObjType == PDFOBJ_DICTIONARY) {
+ return 1;
+ }
+ if (iObjType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pNext)->GetCount();
+ }
+ return 0;
+}
+CPDF_Action CPDF_Action::GetSubAction(FX_DWORD iIndex) const
+{
+ if (m_pDict == NULL || !m_pDict->KeyExist("Next")) {
+ return NULL;
+ }
+ CPDF_Object* pNext = m_pDict->GetElementValue("Next");
+ int iObjType = pNext->GetType();
+ if (iObjType == PDFOBJ_DICTIONARY) {
+ if (iIndex == 0) {
+ return (CPDF_Dictionary*)pNext;
+ }
+ }
+ if (iObjType == PDFOBJ_ARRAY) {
+ return ((CPDF_Array*)pNext)->GetDict(iIndex);
+ }
+ return NULL;
+}
+const FX_CHAR* g_sAATypes[] = {"E", "X", "D", "U", "Fo", "Bl", "PO", "PC", "PV", "PI",
+ "O", "C",
+ "K", "F", "V", "C",
+ "WC", "WS", "DS", "WP", "DP",
+ ""
+ };
+FX_BOOL CPDF_AAction::ActionExist(AActionType eType) const
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->KeyExist(g_sAATypes[(int)eType]);
+}
+CPDF_Action CPDF_AAction::GetAction(AActionType eType) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetDict(g_sAATypes[(int)eType]);
+}
+FX_POSITION CPDF_AAction::GetStartPos() const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetStartPos();
+}
+CPDF_Action CPDF_AAction::GetNextAction(FX_POSITION& pos, AActionType& eType) const
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ CFX_ByteString csKey;
+ CPDF_Object* pObj = m_pDict->GetNextElement(pos, csKey);
+ if (pObj != NULL) {
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
+ int i = 0;
+ while (g_sAATypes[i][0] != '\0') {
+ if (csKey == g_sAATypes[i]) {
+ break;
+ }
+ i ++;
+ }
+ eType = (AActionType)i;
+ return (CPDF_Dictionary*)pDirect;
+ }
+ }
+ return NULL;
+}
+CPDF_DocJSActions::CPDF_DocJSActions(CPDF_Document* pDoc)
+{
+ m_pDocument = pDoc;
+}
+int CPDF_DocJSActions::CountJSActions() const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ return name_tree.GetCount();
+}
+CPDF_Action CPDF_DocJSActions::GetJSAction(int index, CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ CPDF_Object *pAction = name_tree.LookupValue(index, csName);
+ if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ return NULL;
+ }
+ return pAction->GetDict();
+}
+CPDF_Action CPDF_DocJSActions::GetJSAction(const CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ CPDF_Object *pAction = name_tree.LookupValue(csName);
+ if (pAction == NULL || pAction->GetType() != PDFOBJ_DICTIONARY) {
+ return NULL;
+ }
+ return pAction->GetDict();
+}
+int CPDF_DocJSActions::FindJSAction(const CFX_ByteString& csName) const
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_NameTree name_tree(m_pDocument, FX_BSTRC("JavaScript"));
+ return name_tree.GetIndex(csName);
+}
diff --git a/core/src/fpdfdoc/doc_annot.cpp b/core/src/fpdfdoc/doc_annot.cpp
new file mode 100644
index 0000000000..da30485073
--- /dev/null
+++ b/core/src/fpdfdoc/doc_annot.cpp
@@ -0,0 +1,519 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+CPDF_AnnotList::CPDF_AnnotList(CPDF_Page* pPage)
+{
+ ASSERT(pPage != NULL);
+ m_pPageDict = pPage->m_pFormDict;
+ if (m_pPageDict == NULL) {
+ return;
+ }
+ m_pDocument = pPage->m_pDocument;
+ CPDF_Array* pAnnots = m_pPageDict->GetArray("Annots");
+ if (pAnnots == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+ CPDF_Dictionary* pAcroForm = pRoot->GetDict("AcroForm");
+ FX_BOOL bRegenerateAP = pAcroForm && pAcroForm->GetBoolean("NeedAppearances");
+ for (FX_DWORD i = 0; i < pAnnots->GetCount(); i ++) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
+ if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ FX_DWORD dwObjNum = pDict->GetObjNum();
+ if (dwObjNum == 0) {
+ dwObjNum = m_pDocument->AddIndirectObject(pDict);
+ CPDF_Reference* pAction = CPDF_Reference::Create(m_pDocument, dwObjNum);
+ if (pAction == NULL) {
+ break;
+ }
+ pAnnots->InsertAt(i, pAction);
+ pAnnots->RemoveAt(i + 1);
+ pDict = pAnnots->GetDict(i);
+ }
+ CPDF_Annot* pAnnot = FX_NEW CPDF_Annot(pDict);
+ if (pAnnot == NULL) {
+ break;
+ }
+ pAnnot->m_pList = this;
+ m_AnnotList.Add(pAnnot);
+ if (bRegenerateAP && pDict->GetConstString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget"))
+ if (CPDF_InterForm::UpdatingAPEnabled()) {
+ FPDF_GenerateAP(m_pDocument, pDict);
+ }
+ }
+}
+CPDF_AnnotList::~CPDF_AnnotList()
+{
+ int i = 0;
+ for (i = 0; i < m_AnnotList.GetSize(); i ++) {
+ delete (CPDF_Annot*)m_AnnotList[i];
+ }
+ for (i = 0; i < m_Borders.GetSize(); ++i) {
+ delete (CPDF_PageObjects*)m_Borders[i];
+ }
+}
+void CPDF_AnnotList::DisplayPass(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CPDF_RenderContext* pContext, FX_BOOL bPrinting, CFX_AffineMatrix* pMatrix,
+ FX_BOOL bWidgetPass, CPDF_RenderOptions* pOptions, FX_RECT* clip_rect)
+{
+ for (int i = 0; i < m_AnnotList.GetSize(); i ++) {
+ CPDF_Annot* pAnnot = (CPDF_Annot*)m_AnnotList[i];
+ FX_BOOL bWidget = pAnnot->GetSubType() == "Widget";
+ if ((bWidgetPass && !bWidget) || (!bWidgetPass && bWidget)) {
+ continue;
+ }
+ FX_DWORD annot_flags = pAnnot->GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ continue;
+ }
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ continue;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ continue;
+ }
+ if (pOptions != NULL) {
+ IPDF_OCContext* pOCContext = pOptions->m_pOCContext;
+ CPDF_Dictionary* pAnnotDict = pAnnot->m_pAnnotDict;
+ if (pOCContext != NULL && pAnnotDict != NULL &&
+ !pOCContext->CheckOCGVisible(pAnnotDict->GetDict(FX_BSTRC("OC")))) {
+ continue;
+ }
+ }
+ CPDF_Rect annot_rect_f;
+ pAnnot->GetRect(annot_rect_f);
+ CFX_Matrix matrix;
+ matrix = *pMatrix;
+ if (clip_rect) {
+ annot_rect_f.Transform(&matrix);
+ FX_RECT annot_rect = annot_rect_f.GetOutterRect();
+ annot_rect.Intersect(*clip_rect);
+ if (annot_rect.IsEmpty()) {
+ continue;
+ }
+ }
+ if (pContext) {
+ pAnnot->DrawInContext(pPage, pContext, &matrix, CPDF_Annot::Normal);
+ } else if (!pAnnot->DrawAppearance(pPage, pDevice, &matrix, CPDF_Annot::Normal, pOptions)) {
+ pAnnot->DrawBorder(pDevice, &matrix, pOptions);
+ }
+ }
+}
+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice,
+ CFX_AffineMatrix* pUser2Device,
+ FX_BOOL bShowWidget, CPDF_RenderOptions* pOptions)
+{
+ FX_RECT clip_rect;
+ if (pDevice) {
+ clip_rect = pDevice->GetClipBox();
+ }
+ FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ DisplayAnnots(pPage, pDevice, NULL, bPrinting, pUser2Device, bShowWidget ? 3 : 1, pOptions, &clip_rect);
+}
+void CPDF_AnnotList::DisplayAnnots(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, CPDF_RenderContext* pContext,
+ FX_BOOL bPrinting, CFX_AffineMatrix* pUser2Device, FX_DWORD dwAnnotFlags,
+ CPDF_RenderOptions* pOptions, FX_RECT* pClipRect)
+{
+ if (dwAnnotFlags & 0x01) {
+ DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, FALSE, pOptions, pClipRect);
+ }
+ if (dwAnnotFlags & 0x02) {
+ DisplayPass(pPage, pDevice, pContext, bPrinting, pUser2Device, TRUE, pOptions, pClipRect);
+ }
+}
+int CPDF_AnnotList::GetIndex(CPDF_Annot* pAnnot)
+{
+ for (int i = 0; i < m_AnnotList.GetSize(); i ++)
+ if (m_AnnotList[i] == (FX_LPVOID)pAnnot) {
+ return i;
+ }
+ return -1;
+}
+CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict)
+{
+ m_pList = NULL;
+ m_pAnnotDict = pDict;
+}
+CPDF_Annot::~CPDF_Annot()
+{
+ ClearCachedAP();
+}
+CPDF_Reference* CPDF_Annot::NewAnnotRef()
+{
+ if (m_pAnnotDict->GetObjNum() == 0) {
+ m_pList->m_pDocument->AddIndirectObject(m_pAnnotDict);
+ }
+ return CPDF_Reference::Create(m_pList->m_pDocument, m_pAnnotDict->GetObjNum());
+}
+void CPDF_Annot::ClearCachedAP()
+{
+ FX_POSITION pos = m_APMap.GetStartPosition();
+ while (pos) {
+ void* pForm;
+ void* pObjects;
+ m_APMap.GetNextAssoc(pos, pForm, pObjects);
+ delete (CPDF_PageObjects*)pObjects;
+ }
+ m_APMap.RemoveAll();
+}
+CFX_ByteString CPDF_Annot::GetSubType() const
+{
+ return m_pAnnotDict->GetConstString(FX_BSTRC("Subtype"));
+}
+void CPDF_Annot::GetRect(CPDF_Rect& rect) const
+{
+ if (m_pAnnotDict == NULL) {
+ return;
+ }
+ rect = m_pAnnotDict->GetRect("Rect");
+ rect.Normalize();
+}
+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode)
+{
+ CPDF_Dictionary* pAP = pAnnotDict->GetDict("AP");
+ if (pAP == NULL) {
+ return NULL;
+ }
+ const FX_CHAR* ap_entry = "N";
+ if (mode == CPDF_Annot::Down) {
+ ap_entry = "D";
+ } else if (mode == CPDF_Annot::Rollover) {
+ ap_entry = "R";
+ }
+ if (!pAP->KeyExist(ap_entry)) {
+ ap_entry = "N";
+ }
+ CPDF_Object* psub = pAP->GetElementValue(ap_entry);
+ if (psub == NULL) {
+ return NULL;
+ }
+ CPDF_Stream* pStream = NULL;
+ if (psub->GetType() == PDFOBJ_STREAM) {
+ pStream = (CPDF_Stream*)psub;
+ } else if (psub->GetType() == PDFOBJ_DICTIONARY) {
+ CFX_ByteString as = pAnnotDict->GetString("AS");
+ if (as.IsEmpty()) {
+ CFX_ByteString value = pAnnotDict->GetString(FX_BSTRC("V"));
+ if (value.IsEmpty()) {
+ value = pAnnotDict->GetDict(FX_BSTRC("Parent"))->GetString(FX_BSTRC("V"));
+ }
+ if (value.IsEmpty() || !((CPDF_Dictionary*)psub)->KeyExist(value)) {
+ as = FX_BSTRC("Off");
+ } else {
+ as = value;
+ }
+ }
+ pStream = ((CPDF_Dictionary*)psub)->GetStream(as);
+ }
+ return pStream;
+}
+CPDF_Form* CPDF_Annot::GetAPForm(const CPDF_Page* pPage, AppearanceMode mode)
+{
+ CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pAnnotDict, mode);
+ if (pStream == NULL) {
+ return NULL;
+ }
+ CPDF_Form* pForm;
+ if (m_APMap.Lookup(pStream, (void*&)pForm)) {
+ return pForm;
+ }
+ pForm = FX_NEW CPDF_Form(m_pList->m_pDocument, pPage->m_pResources, pStream);
+ if (pForm == NULL) {
+ return NULL;
+ }
+ pForm->ParseContent(NULL, NULL, NULL, NULL);
+ m_APMap.SetAt(pStream, pForm);
+ return pForm;
+}
+static CPDF_Form* FPDFDOC_Annot_GetMatrix(const CPDF_Page* pPage, CPDF_Annot* pAnnot, CPDF_Annot::AppearanceMode mode, const CFX_AffineMatrix* pUser2Device, CFX_Matrix &matrix)
+{
+ CPDF_Form* pForm = pAnnot->GetAPForm(pPage, mode);
+ if (!pForm) {
+ return NULL;
+ }
+ CFX_FloatRect form_bbox = pForm->m_pFormDict->GetRect(FX_BSTRC("BBox"));
+ CFX_Matrix form_matrix = pForm->m_pFormDict->GetMatrix(FX_BSTRC("Matrix"));
+ form_matrix.TransformRect(form_bbox);
+ CPDF_Rect arect;
+ pAnnot->GetRect(arect);
+ matrix.MatchRect(arect, form_bbox);
+ matrix.Concat(*pUser2Device);
+ return pForm;
+}
+FX_BOOL CPDF_Annot::DrawAppearance(const CPDF_Page* pPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device,
+ AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ CFX_Matrix matrix;
+ CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
+ if (!pForm) {
+ return FALSE;
+ }
+ CPDF_RenderContext context;
+ context.Create((CPDF_Page*)pPage);
+ context.DrawObjectList(pDevice, pForm, &matrix, pOptions);
+ return TRUE;
+}
+FX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, const CPDF_RenderContext* pContext, const CFX_AffineMatrix* pUser2Device, AppearanceMode mode)
+{
+ CFX_Matrix matrix;
+ CPDF_Form* pForm = FPDFDOC_Annot_GetMatrix(pPage, this, mode, pUser2Device, matrix);
+ if (!pForm) {
+ return FALSE;
+ }
+ ((CPDF_RenderContext*)pContext)->AppendObjectList(pForm, &matrix);
+ return TRUE;
+}
+CPDF_PageObject* CPDF_Annot::GetBorder(FX_BOOL bPrint, const CPDF_RenderOptions* pOptions)
+{
+ if (GetSubType() == "Popup") {
+ return NULL;
+ }
+ FX_DWORD annot_flags = GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ return NULL;
+ }
+ FX_BOOL bPrinting = bPrint || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ return NULL;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ return NULL;
+ }
+ CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
+ char style_char;
+ FX_FLOAT width;
+ CPDF_Array* pDashArray = NULL;
+ if (pBS == NULL) {
+ CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
+ style_char = 'S';
+ if (pBorderArray) {
+ width = pBorderArray->GetNumber(2);
+ if (pBorderArray->GetCount() == 4) {
+ pDashArray = pBorderArray->GetArray(3);
+ if (pDashArray == NULL) {
+ return NULL;
+ }
+ style_char = 'D';
+ }
+ } else {
+ width = 1;
+ }
+ } else {
+ CFX_ByteString style = pBS->GetString("S");
+ pDashArray = pBS->GetArray("D");
+ style_char = style[1];
+ width = pBS->GetNumber("W");
+ }
+ if (width <= 0) {
+ return NULL;
+ }
+ CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
+ FX_DWORD argb = 0xff000000;
+ if (pColor != NULL) {
+ int R = (FX_INT32)(pColor->GetNumber(0) * 255);
+ int G = (FX_INT32)(pColor->GetNumber(1) * 255);
+ int B = (FX_INT32)(pColor->GetNumber(2) * 255);
+ argb = ArgbEncode(0xff, R, G, B);
+ }
+ CPDF_PathObject *pPathObject = FX_NEW CPDF_PathObject();
+ if (!pPathObject) {
+ return NULL;
+ }
+ CPDF_GraphStateData *pGraphState = pPathObject->m_GraphState.GetModify();
+ if (!pGraphState) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_LineWidth = width;
+ CPDF_ColorStateData *pColorData = pPathObject->m_ColorState.GetModify();
+ if (!pColorData) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pColorData->m_StrokeRGB = argb;
+ pPathObject->m_bStroke = TRUE;
+ pPathObject->m_FillType = 0;
+ if (style_char == 'D') {
+ if (pDashArray) {
+ FX_DWORD dash_count = pDashArray->GetCount();
+ if (dash_count % 2) {
+ dash_count ++;
+ }
+ pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
+ if (pGraphState->m_DashArray == NULL) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_DashCount = dash_count;
+ FX_DWORD i;
+ for (i = 0; i < pDashArray->GetCount(); i ++) {
+ pGraphState->m_DashArray[i] = pDashArray->GetNumber(i);
+ }
+ if (i < dash_count) {
+ pGraphState->m_DashArray[i] = pGraphState->m_DashArray[i - 1];
+ }
+ } else {
+ pGraphState->m_DashArray = FX_Alloc(FX_FLOAT, 2);
+ if (pGraphState->m_DashArray == NULL) {
+ pPathObject->Release();
+ return NULL;
+ }
+ pGraphState->m_DashCount = 2;
+ pGraphState->m_DashArray[0] = pGraphState->m_DashArray[1] = 3 * 1.0f;
+ }
+ }
+ CFX_FloatRect rect;
+ GetRect(rect);
+ width /= 2;
+ CPDF_PathData *pPathData = pPathObject->m_Path.GetModify();
+ if (pPathData) {
+ pPathData->AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
+ }
+ pPathObject->CalcBoundingBox();
+ return pPathObject;
+}
+void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pUser2Device, const CPDF_RenderOptions* pOptions)
+{
+ if (GetSubType() == "Popup") {
+ return;
+ }
+ FX_DWORD annot_flags = GetFlags();
+ if (annot_flags & ANNOTFLAG_HIDDEN) {
+ return;
+ }
+ FX_BOOL bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER || (pOptions && (pOptions->m_Flags & RENDER_PRINTPREVIEW));
+ if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
+ return;
+ }
+ if (!bPrinting && (annot_flags & ANNOTFLAG_NOVIEW)) {
+ return;
+ }
+ CPDF_Dictionary* pBS = m_pAnnotDict->GetDict("BS");
+ char style_char;
+ FX_FLOAT width;
+ CPDF_Array* pDashArray = NULL;
+ if (pBS == NULL) {
+ CPDF_Array* pBorderArray = m_pAnnotDict->GetArray("Border");
+ style_char = 'S';
+ if (pBorderArray) {
+ width = pBorderArray->GetNumber(2);
+ if (pBorderArray->GetCount() == 4) {
+ pDashArray = pBorderArray->GetArray(3);
+ if (pDashArray == NULL) {
+ return;
+ }
+ int nLen = pDashArray->GetCount();
+ int i = 0;
+ for (; i < nLen; ++i) {
+ CPDF_Object*pObj = pDashArray->GetElementValue(i);
+ if (pObj && pObj->GetInteger()) {
+ break;
+ }
+ }
+ if (i == nLen) {
+ return;
+ }
+ style_char = 'D';
+ }
+ } else {
+ width = 1;
+ }
+ } else {
+ CFX_ByteString style = pBS->GetString("S");
+ pDashArray = pBS->GetArray("D");
+ style_char = style[1];
+ width = pBS->GetNumber("W");
+ }
+ if (width <= 0) {
+ return;
+ }
+ CPDF_Array* pColor = m_pAnnotDict->GetArray("C");
+ FX_DWORD argb = 0xff000000;
+ if (pColor != NULL) {
+ int R = (FX_INT32)(pColor->GetNumber(0) * 255);
+ int G = (FX_INT32)(pColor->GetNumber(1) * 255);
+ int B = (FX_INT32)(pColor->GetNumber(2) * 255);
+ argb = ArgbEncode(0xff, R, G, B);
+ }
+ CPDF_GraphStateData graph_state;
+ graph_state.m_LineWidth = width;
+ if (style_char == 'D') {
+ if (pDashArray) {
+ FX_DWORD dash_count = pDashArray->GetCount();
+ if (dash_count % 2) {
+ dash_count ++;
+ }
+ graph_state.m_DashArray = FX_Alloc(FX_FLOAT, dash_count);
+ if (graph_state.m_DashArray == NULL) {
+ return ;
+ }
+ graph_state.m_DashCount = dash_count;
+ FX_DWORD i;
+ for (i = 0; i < pDashArray->GetCount(); i ++) {
+ graph_state.m_DashArray[i] = pDashArray->GetNumber(i);
+ }
+ if (i < dash_count) {
+ graph_state.m_DashArray[i] = graph_state.m_DashArray[i - 1];
+ }
+ } else {
+ graph_state.m_DashArray = FX_Alloc(FX_FLOAT, 2);
+ if (graph_state.m_DashArray == NULL) {
+ return ;
+ }
+ graph_state.m_DashCount = 2;
+ graph_state.m_DashArray[0] = graph_state.m_DashArray[1] = 3 * 1.0f;
+ }
+ }
+ CFX_FloatRect rect;
+ GetRect(rect);
+ CPDF_PathData path;
+ width /= 2;
+ path.AppendRect(rect.left + width, rect.bottom + width, rect.right - width, rect.top - width);
+ int fill_type = 0;
+ if (pOptions && (pOptions->m_Flags & RENDER_NOPATHSMOOTH)) {
+ fill_type |= FXFILL_NOPATHSMOOTH;
+ }
+ pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);
+}
+int CPDF_Annot::CountIRTNotes()
+{
+ int count = 0;
+ for (int i = 0; i < m_pList->Count(); i ++) {
+ CPDF_Annot* pAnnot = m_pList->GetAt(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
+ if (pIRT != m_pAnnotDict) {
+ continue;
+ }
+ count ++;
+ }
+ return count;
+}
+CPDF_Annot* CPDF_Annot::GetIRTNote(int index)
+{
+ int count = 0;
+ for (int i = 0; i < m_pList->Count(); i ++) {
+ CPDF_Annot* pAnnot = m_pList->GetAt(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pIRT = pAnnot->m_pAnnotDict->GetDict("IRT");
+ if (pIRT != m_pAnnotDict) {
+ continue;
+ }
+ if (count == index) {
+ return pAnnot;
+ }
+ count ++;
+ }
+ return NULL;
+}
diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp
new file mode 100644
index 0000000000..0afe718fcd
--- /dev/null
+++ b/core/src/fpdfdoc/doc_ap.cpp
@@ -0,0 +1,808 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+#include "../../include/fpdfdoc/fpdf_ap.h"
+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ if (pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) {
+ return FALSE;
+ }
+ CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString();
+ FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
+ if (field_type == "Tx") {
+ return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
+ } else if (field_type == "Ch") {
+ if (flags & (1 << 17)) {
+ return CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict);
+ } else {
+ return CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
+ }
+ } else if (field_type == "Btn") {
+ if (!(flags & (1 << 16))) {
+ if (!pAnnotDict->KeyExist("AS")) {
+ if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) {
+ if (pParentDict->KeyExist("AS")) {
+ pAnnotDict->SetAtString("AS", pParentDict->GetString("AS"));
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+class CPVT_FontMap : public IPVT_FontMap
+{
+public:
+ CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
+ const CFX_ByteString & sDefFontAlias);
+ virtual ~CPVT_FontMap();
+ CPDF_Font* GetPDFFont(FX_INT32 nFontIndex);
+ CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex);
+ static void GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
+ CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias);
+private:
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pResDict;
+ CPDF_Font* m_pDefFont;
+ CFX_ByteString m_sDefFontAlias;
+ CPDF_Font* m_pSysFont;
+ CFX_ByteString m_sSysFontAlias;
+};
+CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont,
+ const CFX_ByteString & sDefFontAlias) :
+ m_pDocument(pDoc),
+ m_pResDict(pResDict),
+ m_pDefFont(pDefFont),
+ m_sDefFontAlias(sDefFontAlias),
+ m_pSysFont(NULL),
+ m_sSysFontAlias()
+{
+}
+CPVT_FontMap::~CPVT_FontMap()
+{
+}
+extern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict,
+ CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias)
+{
+ if (pDoc && pResDict) {
+ CFX_ByteString sFontAlias;
+ CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm");
+ if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) {
+ if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) {
+ if (!pFontList->KeyExist(sSysFontAlias)) {
+ pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict());
+ }
+ }
+ pSysFont = pPDFFont;
+ }
+ }
+}
+CPDF_Font* CPVT_FontMap::GetPDFFont(FX_INT32 nFontIndex)
+{
+ switch (nFontIndex) {
+ case 0:
+ return m_pDefFont;
+ case 1:
+ if (!m_pSysFont) {
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
+ }
+ return m_pSysFont;
+ }
+ return NULL;
+}
+CFX_ByteString CPVT_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
+{
+ switch (nFontIndex) {
+ case 0:
+ return m_sDefFontAlias;
+ case 1:
+ if (!m_pSysFont) {
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias);
+ }
+ return m_sSysFontAlias;
+ }
+ return "";
+}
+CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap)
+{
+ ASSERT (m_pFontMap != NULL);
+}
+CPVT_Provider::~CPVT_Provider()
+{
+}
+FX_INT32 CPVT_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word);
+ if (charcode != -1) {
+ return pPDFFont->GetCharWidthF(charcode);
+ }
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ return pPDFFont->GetTypeAscent();
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
+ return pPDFFont->GetTypeDescent();
+ }
+ return 0;
+}
+FX_INT32 CPVT_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) {
+ if (pDefFont->CharCodeFromUnicode(word) != -1) {
+ return 0;
+ }
+ }
+ if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1))
+ if (pSysFont->CharCodeFromUnicode(word) != -1) {
+ return 1;
+ }
+ return -1;
+}
+FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word)
+{
+ if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_INT32 CPVT_Provider::GetDefaultFontIndex()
+{
+ return 0;
+}
+static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
+{
+ CFX_ByteString sWord;
+ if (SubWord > 0) {
+ sWord.Format("%c", SubWord);
+ } else {
+ if (pFontMap) {
+ if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) {
+ if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) {
+ sWord.Format("%c", Word);
+ } else {
+ FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
+ if (dwCharCode != -1) {
+ pPDFFont->AppendChar(sWord, dwCharCode);
+ }
+ }
+ }
+ }
+ }
+ return sWord;
+}
+static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)
+{
+ if (strWords.GetLength() > 0) {
+ return PDF_EncodeString(strWords) + " Tj\n";
+ }
+ return "";
+}
+static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ CFX_ByteTextBuf sRet;
+ if (pFontMap) {
+ CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
+ if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) {
+ sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
+ }
+ }
+ return sRet.GetByteString();
+}
+static CPVT_Color ParseColor(const CFX_ByteString & str)
+{
+ CPDF_SimpleParser syntax(str);
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("g", 1)) {
+ return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord()));
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("rg", 3)) {
+ FX_FLOAT f1 = FX_atof(syntax.GetWord());
+ FX_FLOAT f2 = FX_atof(syntax.GetWord());
+ FX_FLOAT f3 = FX_atof(syntax.GetWord());
+ return CPVT_Color(CT_RGB, f1, f2, f3);
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam("k", 4)) {
+ FX_FLOAT f1 = FX_atof(syntax.GetWord());
+ FX_FLOAT f2 = FX_atof(syntax.GetWord());
+ FX_FLOAT f3 = FX_atof(syntax.GetWord());
+ FX_FLOAT f4 = FX_atof(syntax.GetWord());
+ return CPVT_Color(CT_CMYK, f1, f2, f3, f4);
+ }
+ return CPVT_Color(CT_TRANSPARENT);
+}
+static CPVT_Color ParseColor(const CPDF_Array & array)
+{
+ CPVT_Color rt;
+ switch (array.GetCount()) {
+ case 1:
+ rt = CPVT_Color(CT_GRAY, array.GetFloat(0));
+ break;
+ case 3:
+ rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2));
+ break;
+ case 4:
+ rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3));
+ break;
+ }
+ return rt;
+}
+static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const FX_INT32 & nWidgetType)
+{
+ CPDF_Dictionary* pFormDict = NULL;
+ if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) {
+ pFormDict = pRootDict->GetDict("AcroForm");
+ }
+ if (!pFormDict) {
+ return FALSE;
+ }
+ CFX_ByteString DA = FPDF_GetFieldAttr(pAnnotDict, "DA")->GetString();
+ if (DA.IsEmpty()) {
+ DA = pFormDict->GetString("DA");
+ }
+ if (DA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(DA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString sFontName = syntax.GetWord();
+ sFontName = PDF_NameDecode(sFontName);
+ if (sFontName.IsEmpty()) {
+ return FALSE;
+ }
+ FX_FLOAT fFontSize = FX_atof(syntax.GetWord());
+ CPVT_Color crText = ParseColor(DA);
+ FX_BOOL bUseFormRes = FALSE;
+ CPDF_Dictionary * pFontDict = NULL;
+ CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR"));
+ if (pDRDict == NULL) {
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
+ bUseFormRes = TRUE;
+ }
+ CPDF_Dictionary * pDRFontDict = NULL;
+ if ((pDRFontDict = pDRDict->GetDict("Font"))) {
+ pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
+ if (!pFontDict && !bUseFormRes) {
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR"));
+ pDRFontDict = pDRDict->GetDict("Font");
+ if (pDRFontDict) {
+ pFontDict = pDRFontDict->GetDict(sFontName.Mid(1));
+ }
+ }
+ }
+ if (!pDRFontDict) {
+ return FALSE;
+ }
+ if (!pFontDict) {
+ pFontDict = CPDF_Dictionary::Create();
+ if (pFontDict == NULL) {
+ return FALSE;
+ }
+ pFontDict->SetAtName(FX_BSTRC("Type"), "Font");
+ pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1");
+ pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica");
+ pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding");
+ pDoc->AddIndirectObject(pFontDict);
+ pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict);
+ }
+ CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
+ if (!pDefFont) {
+ return FALSE;
+ }
+ CFX_CharMap* pCharMap = pDefFont->GetCharMap();
+ CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect");
+ FX_INT32 nRotate = 0;
+ if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
+ nRotate = pMKDict->GetInteger("R");
+ }
+ CPDF_Rect rcBBox;
+ CPDF_Matrix matrix;
+ switch (nRotate % 360) {
+ case 0:
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ break;
+ case 90:
+ matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
+ break;
+ case 180:
+ matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom);
+ break;
+ case 270:
+ matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom);
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left);
+ break;
+ }
+ FX_INT32 nBorderStyle = PBS_SOLID;
+ FX_FLOAT fBorderWidth = 1;
+ CPVT_Dash dsBorder(3, 0, 0);
+ CPVT_Color crLeftTop, crRightBottom;
+ if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) {
+ if (pBSDict->KeyExist("W")) {
+ fBorderWidth = pBSDict->GetNumber("W");
+ }
+ if (CPDF_Array * pArray = pBSDict->GetArray("D")) {
+ dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2));
+ }
+ switch (pBSDict->GetString("S").GetAt(0)) {
+ case 'S':
+ nBorderStyle = PBS_SOLID;
+ break;
+ case 'D':
+ nBorderStyle = PBS_DASH;
+ break;
+ case 'B':
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPVT_Color(CT_GRAY, 1);
+ crRightBottom = CPVT_Color(CT_GRAY, 0.5);
+ break;
+ case 'I':
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPVT_Color(CT_GRAY, 0.5);
+ crRightBottom = CPVT_Color(CT_GRAY, 0.75);
+ break;
+ case 'U':
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ }
+ }
+ CPVT_Color crBorder, crBG;
+ if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) {
+ if (CPDF_Array * pArray = pMKDict->GetArray("BC")) {
+ crBorder = ParseColor(*pArray);
+ }
+ if (CPDF_Array * pArray = pMKDict->GetArray("BG")) {
+ crBG = ParseColor(*pArray);
+ }
+ }
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE);
+ if (sBG.GetLength() > 0) {
+ sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " "
+ << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n";
+ }
+ CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth,
+ crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder);
+ if (sBorderStream.GetLength() > 0) {
+ sAppStream << "q\n" << sBorderStream << "Q\n";
+ }
+ CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
+ rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
+ rcBody.Normalize();
+ CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");
+ if (pAPDict == NULL) {
+ pAPDict = CPDF_Dictionary::Create();
+ if (pAPDict == NULL) {
+ return FALSE;
+ }
+ pAnnotDict->SetAt("AP", pAPDict);
+ }
+ CPDF_Stream* pNormalStream = pAPDict->GetStream("N");
+ if (pNormalStream == NULL) {
+ pNormalStream = CPDF_Stream::Create(NULL, 0, NULL);
+ if (pNormalStream == NULL) {
+ return FALSE;
+ }
+ FX_INT32 objnum = pDoc->AddIndirectObject(pNormalStream);
+ pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum);
+ }
+ CPDF_Dictionary * pStreamDict = pNormalStream->GetDict();
+ if (pStreamDict) {
+ pStreamDict->SetAtMatrix("Matrix", matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (pStreamResList) {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList) {
+ pStreamResFontList = CPDF_Dictionary::Create();
+ if (pStreamResFontList == NULL) {
+ return FALSE;
+ }
+ pStreamResList->SetAt("Font", pStreamResFontList);
+ }
+ if (!pStreamResFontList->KeyExist(sFontName)) {
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
+ }
+ } else {
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
+ pStreamResList = pStreamDict->GetDict("Resources");
+ }
+ }
+ switch (nWidgetType) {
+ case 0: {
+ CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
+ FX_INT32 nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger();
+ FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger();
+ FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger();
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ vt.SetPlateRect(rcBody);
+ vt.SetAlignment(nAlign);
+ if (IsFloatZero(fFontSize)) {
+ vt.SetAutoFontSize(TRUE);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ FX_BOOL bMultiLine = (dwFlags >> 12) & 1;
+ if (bMultiLine) {
+ vt.SetMultiLine(TRUE);
+ vt.SetAutoReturn(TRUE);
+ }
+ FX_WORD subWord = 0;
+ if ((dwFlags >> 13) & 1) {
+ subWord = '*';
+ vt.SetPasswordChar(subWord);
+ }
+ FX_BOOL bCharArray = (dwFlags >> 24) & 1;
+ if (bCharArray) {
+ vt.SetCharArray(dwMaxLen);
+ } else {
+ vt.SetLimitChar(dwMaxLen);
+ }
+ vt.Initialize();
+ vt.SetText(swValue);
+ vt.RearrangeAll();
+ CPDF_Rect rcContent = vt.GetContentRect();
+ CPDF_Point ptOffset(0.0f, 0.0f);
+ if (!bMultiLine) {
+ ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f);
+ }
+ CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord);
+ if (sBody.GetLength() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ if (rcContent.Width() > rcBody.Width() ||
+ rcContent.Height() > rcBody.Height()) {
+ sAppStream << rcBody.left << " " << rcBody.bottom << " "
+ << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
+ }
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n";
+ }
+ }
+ break;
+ case 1: {
+ CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText();
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ CPDF_Rect rcButton = rcBody;
+ rcButton.left = rcButton.right - 13;
+ rcButton.Normalize();
+ CPDF_Rect rcEdit = rcBody;
+ rcEdit.right = rcButton.left;
+ rcEdit.Normalize();
+ vt.SetPlateRect(rcEdit);
+ if (IsFloatZero(fFontSize)) {
+ vt.SetAutoFontSize(TRUE);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ vt.Initialize();
+ vt.SetText(swValue);
+ vt.RearrangeAll();
+ CPDF_Rect rcContent = vt.GetContentRect();
+ CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f);
+ CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0);
+ if (sEdit.GetLength() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ sAppStream << rcEdit.left << " " << rcEdit.bottom << " "
+ << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n";
+ }
+ CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE);
+ if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) {
+ sAppStream << "q\n" << sButton;
+ sAppStream << rcButton.left << " " << rcButton.bottom << " "
+ << rcButton.Width() << " " << rcButton.Height() << " re f\n";
+ sAppStream << "Q\n";
+ CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0));
+ if (sButtonBorder.GetLength() > 0) {
+ sAppStream << "q\n" << sButtonBorder << "Q\n";
+ }
+ CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2);
+ if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) {
+ sAppStream << "q\n" << " 0 g\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
+ sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
+ sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
+ sAppStream << sButton << "Q\n";
+ }
+ }
+ }
+ break;
+ case 2: {
+ CPVT_FontMap map(pDoc, pStreamDict->GetDict("Resources"), pDefFont, sFontName.Right(sFontName.GetLength() - 1));
+ CPVT_Provider prd(&map);
+ CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray();
+ CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray();
+ FX_INT32 nTop = FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger();
+ CFX_ByteTextBuf sBody;
+ if (pOpts) {
+ FX_FLOAT fy = rcBody.top;
+ for (FX_INT32 i = nTop, sz = pOpts->GetCount(); i < sz; i++) {
+ if (IsFloatSmaller(fy, rcBody.bottom)) {
+ break;
+ }
+ if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) {
+ CFX_WideString swItem;
+ if (pOpt->GetType() == PDFOBJ_STRING) {
+ swItem = pOpt->GetUnicodeText();
+ } else if (pOpt->GetType() == PDFOBJ_ARRAY) {
+ swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText();
+ }
+ FX_BOOL bSelected = FALSE;
+ if (pSels) {
+ for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) {
+ if (i == pSels->GetInteger(s)) {
+ bSelected = TRUE;
+ break;
+ }
+ }
+ }
+ CPDF_VariableText vt;
+ vt.SetProvider(&prd);
+ vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f));
+ if (IsFloatZero(fFontSize)) {
+ vt.SetFontSize(12.0f);
+ } else {
+ vt.SetFontSize(fFontSize);
+ }
+ vt.Initialize();
+ vt.SetText(swItem);
+ vt.RearrangeAll();
+ FX_FLOAT fItemHeight = vt.GetContentRect().Height();
+ if (bSelected) {
+ CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy);
+ sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE)
+ << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
+ } else {
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n";
+ }
+ fy -= fItemHeight;
+ }
+ }
+ }
+ if (sBody.GetSize() > 0) {
+ sAppStream << "/Tx BMC\n" << "q\n";
+ sAppStream << rcBody.left << " " << rcBody.bottom << " "
+ << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n";
+ sAppStream << sBody.GetByteString() << "Q\nEMC\n";
+ }
+ }
+ break;
+ }
+ if (pNormalStream) {
+ pNormalStream->SetData((FX_BYTE*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE);
+ pStreamDict = pNormalStream->GetDict();
+ if (pStreamDict) {
+ pStreamDict->SetAtMatrix("Matrix", matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (pStreamResList) {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList) {
+ pStreamResFontList = CPDF_Dictionary::Create();
+ if (pStreamResFontList == NULL) {
+ return FALSE;
+ }
+ pStreamResList->SetAt("Font", pStreamResFontList);
+ }
+ if (!pStreamResFontList->KeyExist(sFontName)) {
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict);
+ }
+ } else {
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone());
+ pStreamResList = pStreamDict->GetDict("Resources");
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 0);
+}
+FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 1);
+}
+FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict)
+{
+ return GenerateWidgetAP(pDoc, pAnnotDict, 2);
+}
+CFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible)
+{
+ CFX_ByteTextBuf sEditStream, sLineStream, sWords;
+ CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f);
+ FX_INT32 nCurFontIndex = -1;
+ if (pIterator) {
+ if (pVisible) {
+ pIterator->SetAt(pVisible->BeginPos);
+ } else {
+ pIterator->SetAt(0);
+ }
+ CPVT_WordPlace oldplace;
+ while (pIterator->NextWord()) {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pVisible && place.WordCmp(pVisible->EndPos) > 0) {
+ break;
+ }
+ if (bContinuous) {
+ if (place.LineCmp(oldplace) != 0) {
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sEditStream << sLineStream;
+ sLineStream.Clear();
+ sWords.Clear();
+ }
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ } else {
+ CPVT_Line line;
+ pIterator->GetLine(line);
+ ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);
+ }
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+ sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+ ptOld = ptNew;
+ }
+ }
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ if (word.nFontIndex != nCurFontIndex) {
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sWords.Clear();
+ }
+ sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+ sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord);
+ }
+ oldplace = place;
+ } else {
+ CPVT_Word word;
+ if (pIterator->GetWord(word)) {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) {
+ sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+ ptOld = ptNew;
+ }
+ if (word.nFontIndex != nCurFontIndex) {
+ sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+ sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord));
+ }
+ }
+ }
+ if (sWords.GetSize() > 0) {
+ sLineStream << GetWordRenderString(sWords.GetByteString());
+ sEditStream << sLineStream;
+ sWords.Clear();
+ }
+ }
+ return sEditStream.GetByteString();
+}
+CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom,
+ FX_INT32 nStyle, const CPVT_Dash & dash)
+{
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sColor;
+ FX_FLOAT fLeft = rect.left;
+ FX_FLOAT fRight = rect.right;
+ FX_FLOAT fTop = rect.top;
+ FX_FLOAT fBottom = rect.bottom;
+ if (fWidth > 0.0f) {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+ switch (nStyle) {
+ default:
+ case PBS_SOLID:
+ sColor = GenerateColorAP(color, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
+ << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
+ sAppStream << "f*\n";
+ }
+ break;
+ case PBS_DASH:
+ sColor = GenerateColorAP(color, FALSE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ case PBS_BEVELED:
+ case PBS_INSET:
+ sColor = GenerateColorAP(crLeftTop, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
+ sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
+ }
+ sColor = GenerateColorAP(crRightBottom, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n";
+ sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
+ }
+ sColor = GenerateColorAP(color, TRUE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
+ << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
+ }
+ break;
+ case PBS_UNDERLINED:
+ sColor = GenerateColorAP(color, FALSE);
+ if (sColor.GetLength() > 0) {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w\n";
+ sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ }
+ }
+ return sAppStream.GetByteString();
+}
+CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke)
+{
+ CFX_ByteTextBuf sColorStream;
+ switch (color.nColorType) {
+ case CT_RGB:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
+ << (bFillOrStroke ? "rg" : "RG") << "\n";
+ break;
+ case CT_GRAY:
+ sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
+ break;
+ case CT_CMYK:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
+ << (bFillOrStroke ? "k" : "K") << "\n";
+ break;
+ }
+ return sColorStream.GetByteString();
+}
diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp
new file mode 100644
index 0000000000..4ec8fb74fd
--- /dev/null
+++ b/core/src/fpdfdoc/doc_basic.cpp
@@ -0,0 +1,567 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+const int nMaxRecursion = 32;
+int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc)
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
+ if (pPage == NULL) {
+ return 0;
+ }
+ if (pPage->GetType() == PDFOBJ_NUMBER) {
+ return pPage->GetInteger();
+ }
+ if (pPage->GetType() != PDFOBJ_DICTIONARY) {
+ return 0;
+ }
+ return pDoc->GetPageIndex(pPage->GetObjNum());
+}
+FX_DWORD CPDF_Dest::GetPageObjNum()
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CPDF_Object* pPage = ((CPDF_Array*)m_pObj)->GetElementValue(0);
+ if (pPage == NULL) {
+ return 0;
+ }
+ if (pPage->GetType() == PDFOBJ_NUMBER) {
+ return pPage->GetInteger();
+ }
+ if (pPage->GetType() == PDFOBJ_DICTIONARY) {
+ return pPage->GetObjNum();
+ }
+ return 0;
+}
+const FX_CHAR* g_sZoomModes[] = {"XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV", ""};
+int CPDF_Dest::GetZoomMode()
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ CFX_ByteString mode = ((CPDF_Array*)m_pObj)->GetElementValue(1)->GetString();
+ int i = 0;
+ while (g_sZoomModes[i][0] != '\0') {
+ if (mode == g_sZoomModes[i]) {
+ return i + 1;
+ }
+ i ++;
+ }
+ return 0;
+}
+FX_FLOAT CPDF_Dest::GetParam(int index)
+{
+ if (m_pObj == NULL || m_pObj->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)m_pObj)->GetNumber(2 + index);
+}
+CFX_ByteString CPDF_Dest::GetRemoteName()
+{
+ if (m_pObj == NULL) {
+ return CFX_ByteString();
+ }
+ return m_pObj->GetString();
+}
+CPDF_NameTree::CPDF_NameTree(CPDF_Document* pDoc, FX_BSTR category)
+{
+ m_pRoot = pDoc->GetRoot()->GetDict(FX_BSTRC("Names"))->GetDict(category);
+}
+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName,
+ int& nIndex, CPDF_Array** ppFind, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_Array* pLimits = pNode->GetArray(FX_BSTRC("Limits"));
+ if (pLimits != NULL) {
+ CFX_ByteString csLeft = pLimits->GetString(0);
+ CFX_ByteString csRight = pLimits->GetString(1);
+ if (csLeft.Compare(csRight) > 0) {
+ CFX_ByteString csTmp = csRight;
+ csRight = csLeft;
+ csLeft = csTmp;
+ }
+ if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) {
+ return NULL;
+ }
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ FX_DWORD dwCount = pNames->GetCount() / 2;
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ CFX_ByteString csValue = pNames->GetString(i * 2);
+ FX_INT32 iCompare = csValue.Compare(csName);
+ if (iCompare <= 0) {
+ if (ppFind != NULL) {
+ *ppFind = pNames;
+ }
+ if (iCompare < 0) {
+ continue;
+ }
+ } else {
+ break;
+ }
+ nIndex += i;
+ return pNames->GetElementValue(i * 2 + 1);
+ }
+ nIndex += dwCount;
+ return NULL;
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex,
+ CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ int nCount = pNames->GetCount() / 2;
+ if (nIndex >= nCurIndex + nCount) {
+ nCurIndex += nCount;
+ return NULL;
+ } else {
+ if (ppFind != NULL) {
+ *ppFind = pNames;
+ }
+ csName = pNames->GetString((nIndex - nCurIndex) * 2);
+ return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1);
+ }
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1);
+ if (pFound) {
+ return pFound;
+ }
+ }
+ return NULL;
+}
+static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0)
+{
+ if (nLevel > nMaxRecursion) {
+ return 0;
+ }
+ CPDF_Array* pNames = pNode->GetArray(FX_BSTRC("Names"));
+ if (pNames) {
+ return pNames->GetCount() / 2;
+ }
+ CPDF_Array* pKids = pNode->GetArray(FX_BSTRC("Kids"));
+ if (pKids == NULL) {
+ return 0;
+ }
+ int nCount = 0;
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ nCount += CountNames(pKid, nLevel + 1);
+ }
+ return nCount;
+}
+int CPDF_NameTree::GetCount() const
+{
+ if (m_pRoot == NULL) {
+ return 0;
+ }
+ return ::CountNames(m_pRoot);
+}
+int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return -1;
+ }
+ int nIndex = 0;
+ if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) {
+ return -1;
+ }
+ return nIndex;
+}
+CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return NULL;
+ }
+ int nCurIndex = 0;
+ return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL);
+}
+CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const
+{
+ if (m_pRoot == NULL) {
+ return NULL;
+ }
+ int nIndex = 0;
+ return SearchNameNode(m_pRoot, csName, nIndex, NULL);
+}
+CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, FX_BSTR sName)
+{
+ CPDF_Object* pValue = LookupValue(sName);
+ if (pValue == NULL) {
+ CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict(FX_BSTRC("Dests"));
+ if (pDests == NULL) {
+ return NULL;
+ }
+ pValue = pDests->GetElementValue(sName);
+ }
+ if (pValue == NULL) {
+ return NULL;
+ }
+ if (pValue->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pValue;
+ }
+ if (pValue->GetType() == PDFOBJ_DICTIONARY) {
+ return ((CPDF_Dictionary*)pValue)->GetArray(FX_BSTRC("D"));
+ }
+ return NULL;
+}
+static CFX_WideString ChangeSlashToPlatform(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '/') {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ result += ':';
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ result += '\\';
+#else
+ result += *str;
+#endif
+ } else {
+ result += *str;
+ }
+ str++;
+ }
+ return result;
+}
+static CFX_WideString FILESPEC_DecodeFileName(FX_WSTR filepath)
+{
+ if (filepath.GetLength() <= 1) {
+ return CFX_WideString();
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (filepath.Left(sizeof("/Mac") - 1) == CFX_WideStringC(L"/Mac")) {
+ return ChangeSlashToPlatform(filepath.GetPtr() + 1);
+ }
+ return ChangeSlashToPlatform(filepath.GetPtr());
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (filepath.GetAt(0) != '/') {
+ return ChangeSlashToPlatform(filepath.GetPtr());
+ }
+ if (filepath.GetAt(1) == '/') {
+ return ChangeSlashToPlatform(filepath.GetPtr() + 1);
+ }
+ if (filepath.GetAt(2) == '/') {
+ CFX_WideString result;
+ result += filepath.GetAt(1);
+ result += ':';
+ result += ChangeSlashToPlatform(filepath.GetPtr() + 2);
+ return result;
+ }
+ CFX_WideString result;
+ result += '\\';
+ result += ChangeSlashToPlatform(filepath.GetPtr());
+ return result;
+#else
+ return filepath;
+#endif
+}
+FX_BOOL CPDF_FileSpec::GetFileName(CFX_WideString &csFileName) const
+{
+ if (m_pObj == NULL) {
+ return FALSE;
+ }
+ if (m_pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)m_pObj;
+ csFileName = pDict->GetUnicodeText(FX_BSTRC("UF"));
+ if (csFileName.IsEmpty()) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("F")));
+ }
+ if (pDict->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL")) {
+ return TRUE;
+ }
+ if (csFileName.IsEmpty()) {
+ if (pDict->KeyExist(FX_BSTRC("DOS"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("DOS")));
+ } else if (pDict->KeyExist(FX_BSTRC("Mac"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Mac")));
+ } else if (pDict->KeyExist(FX_BSTRC("Unix"))) {
+ csFileName = CFX_WideString::FromLocal(pDict->GetString(FX_BSTRC("Unix")));
+ } else {
+ return FALSE;
+ }
+ }
+ } else {
+ csFileName = CFX_WideString::FromLocal(m_pObj->GetString());
+ }
+ csFileName = FILESPEC_DecodeFileName(csFileName);
+ return TRUE;
+}
+CPDF_FileSpec::CPDF_FileSpec()
+{
+ m_pObj = CPDF_Dictionary::Create();
+ if (m_pObj != NULL) {
+ ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Filespec"));
+ }
+}
+FX_BOOL CPDF_FileSpec::IsURL() const
+{
+ if (m_pObj == NULL) {
+ return FALSE;
+ }
+ if (m_pObj->GetType() != PDFOBJ_DICTIONARY) {
+ return FALSE;
+ }
+ return ((CPDF_Dictionary*)m_pObj)->GetString(FX_BSTRC("FS")) == FX_BSTRC("URL");
+}
+static CFX_WideString ChangeSlashToPDF(FX_LPCWSTR str)
+{
+ CFX_WideString result;
+ while (*str) {
+ if (*str == '\\' || *str == ':') {
+ result += '/';
+ } else {
+ result += *str;
+ }
+ str++;
+ }
+ return result;
+}
+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath)
+{
+ if (filepath.GetLength() <= 1) {
+ return CFX_WideString();
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (filepath.GetAt(1) == ':') {
+ CFX_WideString result;
+ result = '/';
+ result += filepath.GetAt(0);
+ if (filepath.GetAt(2) != '\\') {
+ result += '/';
+ }
+ result += ChangeSlashToPDF(filepath.GetPtr() + 2);
+ return result;
+ }
+ if (filepath.GetAt(0) == '\\' && filepath.GetAt(1) == '\\') {
+ return ChangeSlashToPDF(filepath.GetPtr() + 1);
+ }
+ if (filepath.GetAt(0) == '\\') {
+ CFX_WideString result;
+ result = '/';
+ result += ChangeSlashToPDF(filepath.GetPtr());
+ return result;
+ }
+ return ChangeSlashToPDF(filepath.GetPtr());
+#elif _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (filepath.Left(sizeof("Mac") - 1) == FX_WSTRC(L"Mac")) {
+ CFX_WideString result;
+ result = '/';
+ result += ChangeSlashToPDF(filepath.GetPtr());
+ return result;
+ }
+ return ChangeSlashToPDF(filepath.GetPtr());
+#else
+ return filepath;
+#endif
+}
+CPDF_Stream* CPDF_FileSpec::GetFileStream() const
+{
+ if (m_pObj == NULL) {
+ return NULL;
+ }
+ FX_INT32 iType = m_pObj->GetType();
+ if (iType == PDFOBJ_STREAM) {
+ return (CPDF_Stream*)m_pObj;
+ } else if (iType == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary *pEF = ((CPDF_Dictionary*)m_pObj)->GetDict(FX_BSTRC("EF"));
+ if (pEF == NULL) {
+ return NULL;
+ }
+ return pEF->GetStream(FX_BSTRC("F"));
+ }
+ return NULL;
+}
+static void FPDFDOC_FILESPEC_SetFileName(CPDF_Object *pObj, FX_WSTR wsFileName, FX_BOOL bURL)
+{
+ ASSERT(pObj != NULL);
+ CFX_WideString wsStr;
+ if (bURL) {
+ wsStr = wsFileName;
+ } else {
+ wsStr = FILESPEC_EncodeFileName(wsFileName);
+ }
+ FX_INT32 iType = pObj->GetType();
+ if (iType == PDFOBJ_STRING) {
+ pObj->SetString(CFX_ByteString::FromUnicode(wsStr));
+ } else if (iType == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+ pDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsStr));
+ pDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsStr));
+ }
+}
+void CPDF_FileSpec::SetFileName(FX_WSTR wsFileName, FX_BOOL bURL)
+{
+ ASSERT(m_pObj != NULL);
+ if (m_pObj->GetType() == PDFOBJ_DICTIONARY && bURL) {
+ ((CPDF_Dictionary*)m_pObj)->SetAtName(FX_BSTRC("FS"), "URL");
+ }
+ FPDFDOC_FILESPEC_SetFileName(m_pObj, wsFileName, bURL);
+}
+static CFX_WideString _MakeRoman(int num)
+{
+ const int arabic[] = {
+ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
+ };
+ const CFX_WideString roman[] = {
+ L"m", L"cm", L"d", L"cd", L"c", L"xc", L"l", L"xl", L"x", L"ix", L"v", L"iv", L"i"
+ };
+ const int nMaxNum = 1000000;
+ num %= nMaxNum;
+ int i = 0;
+ CFX_WideString wsRomanNumber;
+ while (num > 0) {
+ while (num >= arabic[i]) {
+ num = num - arabic[i];
+ wsRomanNumber += roman[i];
+ }
+ i = i + 1;
+ }
+ return wsRomanNumber;
+}
+static CFX_WideString _MakeLetters(int num)
+{
+ if (num == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString wsLetters;
+ const int nMaxCount = 1000;
+ const int nLetterCount = 26;
+ num -= 1;
+ int count = num / nLetterCount + 1;
+ count %= nMaxCount;
+ FX_WCHAR ch = L'a' + num % nLetterCount;
+ for (int i = 0; i < count; i++) {
+ wsLetters += ch;
+ }
+ return wsLetters;
+}
+static CFX_WideString _GetLabelNumPortion(int num, const CFX_ByteString& bsStyle)
+{
+ CFX_WideString wsNumPortion;
+ if (bsStyle.IsEmpty()) {
+ return wsNumPortion;
+ }
+ if (bsStyle == "D") {
+ wsNumPortion.Format((FX_LPCWSTR)L"%d", num);
+ } else if (bsStyle == "R") {
+ wsNumPortion = _MakeRoman(num);
+ wsNumPortion.MakeUpper();
+ } else if (bsStyle == "r") {
+ wsNumPortion = _MakeRoman(num);
+ } else if (bsStyle == "A") {
+ wsNumPortion = _MakeLetters(num);
+ wsNumPortion.MakeUpper();
+ } else if (bsStyle == "a") {
+ wsNumPortion = _MakeLetters(num);
+ }
+ return wsNumPortion;
+}
+CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const
+{
+ CFX_WideString wsLabel;
+ if (m_pDocument == NULL) {
+ return wsLabel;
+ }
+ CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
+ if (pPDFRoot == NULL) {
+ return wsLabel;
+ }
+ CPDF_Dictionary* pLabels = pPDFRoot->GetDict(FX_BSTRC("PageLabels"));
+ CPDF_NumberTree numberTree(pLabels);
+ CPDF_Object* pValue = NULL;
+ int n = nPage;
+ while (n >= 0) {
+ pValue = numberTree.LookupValue(n);
+ if (pValue != NULL) {
+ break;
+ }
+ n--;
+ }
+ if (pValue != NULL) {
+ pValue = pValue->GetDirect();
+ if (pValue->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pLabel = (CPDF_Dictionary*)pValue;
+ if (pLabel->KeyExist(FX_BSTRC("P"))) {
+ wsLabel += pLabel->GetUnicodeText(FX_BSTRC("P"));
+ }
+ CFX_ByteString bsNumberingStyle = pLabel->GetString(FX_BSTRC("S"), NULL);
+ int nLabelNum = nPage - n + pLabel->GetInteger(FX_BSTRC("St"), 1);
+ CFX_WideString wsNumPortion = _GetLabelNumPortion(nLabelNum, bsNumberingStyle);
+ wsLabel += wsNumPortion;
+ return wsLabel;
+ }
+ }
+ wsLabel.Format((FX_LPCWSTR)L"%d", nPage + 1);
+ return wsLabel;
+}
+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_BSTR bsLabel) const
+{
+ if (m_pDocument == NULL) {
+ return -1;
+ }
+ CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot();
+ if (pPDFRoot == NULL) {
+ return -1;
+ }
+ int nPages = m_pDocument->GetPageCount();
+ CFX_ByteString bsLbl;
+ CFX_ByteString bsOrig = bsLabel;
+ for (int i = 0; i < nPages; i++) {
+ bsLbl = PDF_EncodeText(GetLabel(i));
+ if (!bsLbl.Compare(bsOrig)) {
+ return i;
+ }
+ }
+ bsLbl = bsOrig;
+ int nPage = FXSYS_atoi(bsLbl);
+ if (nPage > 0 && nPage <= nPages) {
+ return nPage;
+ }
+ return -1;
+}
+FX_INT32 CPDF_PageLabel::GetPageByLabel(FX_WSTR wsLabel) const
+{
+ CFX_ByteString bsLabel = PDF_EncodeText((CFX_WideString)wsLabel);
+ return GetPageByLabel(bsLabel);
+}
diff --git a/core/src/fpdfdoc/doc_bookmark.cpp b/core/src/fpdfdoc/doc_bookmark.cpp
new file mode 100644
index 0000000000..6cc954bd69
--- /dev/null
+++ b/core/src/fpdfdoc/doc_bookmark.cpp
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_Bookmark CPDF_BookmarkTree::GetFirstChild(CPDF_Bookmark Parent)
+{
+ if (Parent.m_pDict == NULL) {
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot()->GetDict("Outlines");
+ if (pRoot == NULL) {
+ return NULL;
+ }
+ return pRoot->GetDict("First");
+ }
+ return Parent.m_pDict->GetDict("First");
+}
+CPDF_Bookmark CPDF_BookmarkTree::GetNextSibling(CPDF_Bookmark This)
+{
+ if (This.m_pDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary *pNext = This.m_pDict->GetDict("Next");
+ return pNext == This.m_pDict ? NULL : pNext;
+}
+FX_DWORD CPDF_Bookmark::GetColorRef()
+{
+ if (!m_pDict) {
+ return 0;
+ }
+ CPDF_Array* pColor = m_pDict->GetArray("C");
+ if (pColor == NULL) {
+ return FXSYS_RGB(0, 0, 0);
+ }
+ int r = FXSYS_round(pColor->GetNumber(0) * 255);
+ int g = FXSYS_round(pColor->GetNumber(1) * 255);
+ int b = FXSYS_round(pColor->GetNumber(2) * 255);
+ return FXSYS_RGB(r, g, b);
+}
+FX_DWORD CPDF_Bookmark::GetFontStyle()
+{
+ if (!m_pDict) {
+ return 0;
+ }
+ return m_pDict->GetInteger("F");
+}
+CFX_WideString CPDF_Bookmark::GetTitle()
+{
+ if (!m_pDict) {
+ return CFX_WideString();
+ }
+ CPDF_String* pString = (CPDF_String*)m_pDict->GetElementValue("Title");
+ if (pString == NULL || pString->GetType() != PDFOBJ_STRING) {
+ return CFX_WideString();
+ }
+ CFX_WideString title = pString->GetUnicodeText();
+ FX_LPWSTR buf = title.LockBuffer();
+ int len = title.GetLength(), i;
+ for (i = 0; i < len; i ++)
+ if (buf[i] < 0x20) {
+ buf[i] = 0x20;
+ }
+ title.ReleaseBuffer(len);
+ return title;
+}
+CPDF_Dest CPDF_Bookmark::GetDest(CPDF_Document* pDocument)
+{
+ if (!m_pDict) {
+ return NULL;
+ }
+ CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDocument, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDocument, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+CPDF_Action CPDF_Bookmark::GetAction()
+{
+ if (!m_pDict) {
+ return NULL;
+ }
+ return m_pDict->GetDict("A");
+}
diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
new file mode 100644
index 0000000000..1139233987
--- /dev/null
+++ b/core/src/fpdfdoc/doc_form.cpp
@@ -0,0 +1,1664 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fxcrt/fx_xml.h"
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
+void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
+FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
+void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+const int nMaxRecursion = 32;
+class _CFieldNameExtractor : public CFX_Object
+{
+public:
+ _CFieldNameExtractor(const CFX_WideString& full_name)
+ {
+ m_pStart = full_name;
+ m_pEnd = m_pStart + full_name.GetLength();
+ m_pCur = m_pStart;
+ }
+ void GetNext(FX_LPCWSTR &pSubName, FX_STRSIZE& size)
+ {
+ pSubName = m_pCur;
+ while (m_pCur < m_pEnd && m_pCur[0] != L'.') {
+ m_pCur++;
+ }
+ size = (FX_STRSIZE)(m_pCur - pSubName);
+ if (m_pCur < m_pEnd && m_pCur[0] == L'.') {
+ m_pCur++;
+ }
+ }
+protected:
+ FX_LPCWSTR m_pStart;
+ FX_LPCWSTR m_pEnd;
+ FX_LPCWSTR m_pCur;
+};
+class CFieldTree : public CFX_Object
+{
+public:
+ struct _Node : public CFX_Object {
+ _Node *parent;
+ CFX_PtrArray children;
+ CFX_WideString short_name;
+ CPDF_FormField *field_ptr;
+ int CountFields(int nLevel = 0)
+ {
+ if (nLevel > nMaxRecursion) {
+ return 0;
+ }
+ if (field_ptr) {
+ return 1;
+ }
+ int count = 0;
+ for (int i = 0; i < children.GetSize(); i ++) {
+ count += ((_Node *)children.GetAt(i))->CountFields(nLevel + 1);
+ }
+ return count;
+ }
+ CPDF_FormField* GetField(int* fields_to_go)
+ {
+ if (field_ptr) {
+ if (*fields_to_go == 0) {
+ return field_ptr;
+ }
+ --*fields_to_go;
+ return NULL;
+ }
+ for (int i = 0; i < children.GetSize(); i++) {
+ _Node *pNode = (_Node *)children.GetAt(i);
+ CPDF_FormField* pField = pNode->GetField(fields_to_go);
+ if (pField) {
+ return pField;
+ }
+ }
+ return NULL;
+ }
+ CPDF_FormField* GetField(int index)
+ {
+ int fields_to_go = index;
+ return GetField(&fields_to_go);
+ }
+ };
+ CFieldTree();
+ ~CFieldTree();
+ void SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr);
+ CPDF_FormField *GetField(const CFX_WideString &full_name);
+ CPDF_FormField *RemoveField(const CFX_WideString &full_name);
+ void RemoveAll();
+ _Node *FindNode(const CFX_WideString &full_name);
+ _Node * AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr);
+ void RemoveNode(_Node *pNode, int nLevel = 0);
+ _Node *_Lookup(_Node *pParent, const CFX_WideString &short_name);
+ _Node m_Root;
+};
+CFieldTree::CFieldTree()
+{
+ m_Root.parent = NULL;
+ m_Root.field_ptr = NULL;
+}
+CFieldTree::~CFieldTree()
+{
+ RemoveAll();
+}
+CFieldTree::_Node *CFieldTree::AddChild(_Node *pParent, const CFX_WideString &short_name, CPDF_FormField *field_ptr)
+{
+ if (pParent == NULL) {
+ return NULL;
+ }
+ _Node *pNode = FX_NEW _Node;
+ if (pNode == NULL) {
+ return NULL;
+ }
+ pNode->parent = pParent;
+ pNode->short_name = short_name;
+ pNode->field_ptr = field_ptr;
+ pParent->children.Add(pNode);
+ return pNode;
+}
+void CFieldTree::RemoveNode(_Node *pNode, int nLevel)
+{
+ if (pNode == NULL) {
+ return ;
+ }
+ if (nLevel > nMaxRecursion) {
+ delete pNode;
+ return ;
+ }
+ CFX_PtrArray& ptr_array = pNode->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pChild = (_Node *)ptr_array[i];
+ RemoveNode(pChild, nLevel + 1);
+ }
+ delete pNode;
+}
+CFieldTree::_Node *CFieldTree::_Lookup(_Node *pParent, const CFX_WideString &short_name)
+{
+ if (pParent == NULL) {
+ return NULL;
+ }
+ CFX_PtrArray& ptr_array = pParent->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pNode = (_Node *)ptr_array[i];
+ if (pNode->short_name.GetLength() == short_name.GetLength() &&
+ FXSYS_memcmp32((FX_LPCWSTR)pNode->short_name, (FX_LPCWSTR)short_name, short_name.GetLength()*sizeof(FX_WCHAR)) == 0) {
+ return pNode;
+ }
+ }
+ return NULL;
+}
+void CFieldTree::RemoveAll()
+{
+ CFX_PtrArray& ptr_array = m_Root.children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ _Node *pNode = (_Node *)ptr_array[i];
+ RemoveNode(pNode);
+ }
+}
+void CFieldTree::SetField(const CFX_WideString &full_name, CPDF_FormField *field_ptr)
+{
+ if (full_name == L"") {
+ return;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ if (pNode == NULL) {
+ pNode = AddChild(pLast, name, NULL);
+ }
+ name_extractor.GetNext(pName, nLength);
+ }
+ if (pNode != &m_Root) {
+ pNode->field_ptr = field_ptr;
+ }
+}
+CPDF_FormField *CFieldTree::GetField(const CFX_WideString &full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ return pNode ? pNode->field_ptr : NULL;
+}
+CPDF_FormField *CFieldTree::RemoveField(const CFX_WideString & full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ if (pNode && pNode != &m_Root) {
+ CFX_PtrArray& ptr_array = pLast->children;
+ for (int i = 0; i < ptr_array.GetSize(); i ++) {
+ if (pNode == (_Node *)ptr_array[i]) {
+ ptr_array.RemoveAt(i);
+ break;
+ }
+ }
+ CPDF_FormField *pField = pNode->field_ptr;
+ RemoveNode(pNode);
+ return pField;
+ }
+ return NULL;
+}
+CFieldTree::_Node *CFieldTree::FindNode(const CFX_WideString& full_name)
+{
+ if (full_name == L"") {
+ return NULL;
+ }
+ _CFieldNameExtractor name_extractor(full_name);
+ FX_LPCWSTR pName;
+ FX_STRSIZE nLength;
+ name_extractor.GetNext(pName, nLength);
+ _Node *pNode = &m_Root, *pLast = NULL;
+ while (nLength > 0 && pNode) {
+ pLast = pNode;
+ CFX_WideString name = CFX_WideString(pName, nLength);
+ pNode = _Lookup(pLast, name);
+ name_extractor.GetNext(pName, nLength);
+ }
+ return pNode;
+}
+CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP) : CFX_PrivateData()
+{
+ m_pDocument = pDocument;
+ m_bGenerateAP = bGenerateAP;
+ m_pFormNotify = NULL;
+ m_bUpdated = FALSE;
+ m_pFieldTree = FX_NEW CFieldTree;
+ CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
+ m_pFormDict = pRoot->GetDict("AcroForm");
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return;
+ }
+ int count = pFields->GetCount();
+ for (int i = 0; i < count; i ++) {
+ LoadField(pFields->GetDict(i));
+ }
+}
+CPDF_InterForm::~CPDF_InterForm()
+{
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_ControlMap.GetNextAssoc(pos, key, value);
+ delete (CPDF_FormControl*)value;
+ }
+ if (m_pFieldTree != NULL) {
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
+ delete pField;
+ }
+ delete m_pFieldTree;
+ }
+}
+FX_BOOL CPDF_InterForm::m_bUpdateAP = TRUE;
+FX_BOOL CPDF_InterForm::UpdatingAPEnabled()
+{
+ return m_bUpdateAP;
+}
+void CPDF_InterForm::EnableUpdateAP(FX_BOOL bUpdateAP)
+{
+ m_bUpdateAP = bUpdateAP;
+}
+CFX_ByteString CPDF_InterForm::GenerateNewResourceName(const CPDF_Dictionary* pResDict, FX_LPCSTR csType, int iMinLen, FX_LPCSTR csPrefix)
+{
+ CFX_ByteString csStr = csPrefix;
+ CFX_ByteString csBType = csType;
+ if (csStr.IsEmpty()) {
+ if (csBType == "ExtGState") {
+ csStr = "GS";
+ } else if (csBType == "ColorSpace") {
+ csStr = "CS";
+ } else if (csBType == "Font") {
+ csStr = "ZiTi";
+ } else {
+ csStr = "Res";
+ }
+ }
+ CFX_ByteString csTmp = csStr;
+ int iCount = csStr.GetLength();
+ int m = 0;
+ if (iMinLen > 0) {
+ csTmp = "";
+ while (m < iMinLen && m < iCount) {
+ csTmp += csStr[m ++];
+ }
+ while (m < iMinLen) {
+ csTmp += '0' + m % 10;
+ m ++;
+ }
+ } else {
+ m = iCount;
+ }
+ if (pResDict == NULL) {
+ return csTmp;
+ }
+ CPDF_Dictionary* pDict = pResDict->GetDict(csType);
+ if (pDict == NULL) {
+ return csTmp;
+ }
+ int num = 0;
+ CFX_ByteString bsNum;
+ while (TRUE) {
+ if (!pDict->KeyExist(csTmp + bsNum)) {
+ return csTmp + bsNum;
+ }
+ if (m < iCount) {
+ csTmp += csStr[m ++];
+ } else {
+ bsNum.Format("%d", num++);
+ }
+ m ++;
+ }
+ return csTmp;
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+typedef struct _PDF_FONTDATA {
+ FX_BOOL bFind;
+ LOGFONTA lf;
+} PDF_FONTDATA, FAR* LPDF_FONTDATA;
+static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe,
+ NEWTEXTMETRICEX *lpntme,
+ DWORD FontType,
+ LPARAM lParam
+ )
+{
+ if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL) {
+ return 1;
+ } else {
+ LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam;
+ memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA));
+ pData->bFind = TRUE;
+ return 0;
+ }
+}
+static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf)
+{
+ PDF_FONTDATA fd;
+ memset(&fd, 0, sizeof(PDF_FONTDATA));
+ HDC hDC = ::GetDC(NULL);
+ EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd, 0);
+ ::ReleaseDC(NULL, hDC);
+ if (fd.bFind) {
+ memcpy(&lf, &fd.lf, sizeof(LOGFONTA));
+ }
+ return fd.bFind;
+}
+static FX_BOOL RetrieveSpecificFont(FX_BYTE charSet, FX_BYTE pitchAndFamily, LPCSTR pcsFontName, LOGFONTA& lf)
+{
+ memset(&lf, 0, sizeof(LOGFONTA));
+ lf.lfCharSet = charSet;
+ lf.lfPitchAndFamily = pitchAndFamily;
+ if (pcsFontName != NULL) {
+ strcpy(lf.lfFaceName, pcsFontName);
+ }
+ return RetrieveSpecificFont(lf);
+}
+static FX_BOOL RetrieveStockFont(int iFontObject, FX_BYTE charSet, LOGFONTA& lf)
+{
+ HFONT hFont = (HFONT)::GetStockObject(iFontObject);
+ if (hFont != NULL) {
+ memset(&lf, 0, sizeof(LOGFONTA));
+ int iRet = ::GetObject(hFont, sizeof(LOGFONTA), &lf);
+ if (iRet > 0 && (lf.lfCharSet == charSet || charSet == 255)) {
+ return RetrieveSpecificFont(lf);
+ }
+ }
+ return FALSE;
+}
+#endif
+CPDF_Font* CPDF_InterForm::AddSystemDefaultFont(const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ FX_BOOL bRet;
+ bRet = RetrieveStockFont(DEFAULT_GUI_FONT, 255, lf);
+ if (!bRet) {
+ bRet = RetrieveStockFont(SYSTEM_FONT, 255, lf);
+ }
+ if (bRet) {
+ pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+#endif
+ return pFont;
+}
+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_ByteString csFontName, FX_BYTE iCharSet)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (iCharSet == 1) {
+ iCharSet = GetNativeCharSet();
+ }
+ HFONT hFont = ::CreateFontA(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, (FX_LPCSTR)csFontName);
+ if (hFont != NULL) {
+ LOGFONTA lf;
+ memset(&lf, 0, sizeof(LOGFONTA));
+ ::GetObjectA(hFont, sizeof(LOGFONTA), &lf);
+ ::DeleteObject(hFont);
+ if (strlen(lf.lfFaceName) > 0) {
+ return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return NULL;
+}
+CPDF_Font* CPDF_InterForm::AddSystemFont(const CPDF_Document* pDocument, CFX_WideString csFontName, FX_BYTE iCharSet)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (iCharSet == 1) {
+ iCharSet = GetNativeCharSet();
+ }
+ HFONT hFont = ::CreateFontW(0, 0, 0, 0, 0, 0, 0, 0, iCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, csFontName);
+ if (hFont != NULL) {
+ LOGFONTA lf;
+ memset(&lf, 0, sizeof(LOGFONTA));
+ ::GetObject(hFont, sizeof(LOGFONTA), &lf);
+ ::DeleteObject(hFont);
+ if (strlen(lf.lfFaceName) > 0) {
+ return ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return NULL;
+}
+CPDF_Font* CPDF_InterForm::AddStandardFont(const CPDF_Document* pDocument, CFX_ByteString csFontName)
+{
+ if (pDocument == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+ if (csFontName == "ZapfDingbats") {
+ pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, NULL);
+ } else {
+ CPDF_FontEncoding encoding(PDFFONT_ENCODING_WINANSI);
+ pFont = ((CPDF_Document*)pDocument)->AddStandardFont(csFontName, &encoding);
+ }
+ return pFont;
+}
+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_BYTE charSet, FX_LPVOID pLogFont)
+{
+ CFX_ByteString csFontName;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ FX_BOOL bRet;
+ if (charSet == ANSI_CHARSET) {
+ csFontName = "Helvetica";
+ return csFontName;
+ }
+ bRet = FALSE;
+ if (charSet == SHIFTJIS_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MS Mincho", lf);
+ } else if (charSet == GB2312_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "SimSun", lf);
+ } else if (charSet == CHINESEBIG5_CHARSET) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "MingLiU", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Arial Unicode MS", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, "Microsoft Sans Serif", lf);
+ }
+ if (!bRet) {
+ bRet = RetrieveSpecificFont(charSet, DEFAULT_PITCH | FF_DONTCARE, NULL, lf);
+ }
+ if (bRet) {
+ if (pLogFont != NULL) {
+ memcpy(pLogFont, &lf, sizeof(LOGFONTA));
+ }
+ csFontName = lf.lfFaceName;
+ return csFontName;
+ }
+#endif
+ return csFontName;
+}
+CFX_ByteString CPDF_InterForm::GetNativeFont(FX_LPVOID pLogFont)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE charSet = GetNativeCharSet();
+ return GetNativeFont(charSet, pLogFont);
+#else
+ return CFX_ByteString();
+#endif
+}
+FX_BYTE CPDF_InterForm::GetNativeCharSet()
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_BYTE charSet = ANSI_CHARSET;
+ UINT iCodePage = ::GetACP();
+ switch (iCodePage) {
+ case 932:
+ charSet = SHIFTJIS_CHARSET;
+ break;
+ case 936:
+ charSet = GB2312_CHARSET;
+ break;
+ case 950:
+ charSet = CHINESEBIG5_CHARSET;
+ break;
+ case 1252:
+ charSet = ANSI_CHARSET;
+ break;
+ case 874:
+ charSet = THAI_CHARSET;
+ break;
+ case 949:
+ charSet = HANGUL_CHARSET;
+ break;
+ case 1200:
+ charSet = ANSI_CHARSET;
+ break;
+ case 1250:
+ charSet = EASTEUROPE_CHARSET;
+ break;
+ case 1251:
+ charSet = RUSSIAN_CHARSET;
+ break;
+ case 1253:
+ charSet = GREEK_CHARSET;
+ break;
+ case 1254:
+ charSet = TURKISH_CHARSET;
+ break;
+ case 1255:
+ charSet = HEBREW_CHARSET;
+ break;
+ case 1256:
+ charSet = ARABIC_CHARSET;
+ break;
+ case 1257:
+ charSet = BALTIC_CHARSET;
+ break;
+ case 1258:
+ charSet = VIETNAMESE_CHARSET;
+ break;
+ case 1361:
+ charSet = JOHAB_CHARSET;
+ break;
+ }
+ return charSet;
+#else
+ return 0;
+#endif
+}
+CPDF_Font* CPDF_InterForm::AddNativeFont(FX_BYTE charSet, const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ LOGFONTA lf;
+ CFX_ByteString csFontName = GetNativeFont(charSet, &lf);
+ if (!csFontName.IsEmpty()) {
+ if (csFontName == "Helvetica") {
+ pFont = AddStandardFont(pDocument, csFontName);
+ } else {
+ pFont = ((CPDF_Document*)pDocument)->AddWindowsFont(&lf, FALSE, TRUE);
+ }
+ }
+#endif
+ return pFont;
+}
+CPDF_Font* CPDF_InterForm::AddNativeFont(const CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return NULL;
+ }
+ CPDF_Font* pFont = NULL;
+ FX_BYTE charSet = GetNativeCharSet();
+ pFont = AddNativeFont(charSet, pDocument);
+ return pFont;
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType, const CPDF_FormField* pExcludedField, const CPDF_FormControl* pExcludedControl)
+{
+ if (csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ int iPos = 0;
+ int iLength = csNewFieldName.GetLength();
+ CFX_WideString csSub;
+ while (TRUE) {
+ while (iPos < iLength && (csNewFieldName[iPos] == L'.' || csNewFieldName[iPos] == L' ')) {
+ iPos ++;
+ }
+ if (iPos < iLength && !csSub.IsEmpty()) {
+ csSub += L'.';
+ }
+ while (iPos < iLength && csNewFieldName[iPos] != L'.') {
+ csSub += csNewFieldName[iPos ++];
+ }
+ for (int i = csSub.GetLength() - 1; i > -1; i --) {
+ if (csSub[i] == L' ' || csSub[i] == L'.') {
+ csSub.SetAt(i, L'\0');
+ } else {
+ break;
+ }
+ }
+ FX_DWORD dwCount = m_pFieldTree->m_Root.CountFields();
+ for (FX_DWORD m = 0; m < dwCount; m ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(m);
+ if (pField == NULL) {
+ continue;
+ }
+ if (pField == pExcludedField) {
+ if (pExcludedControl != NULL) {
+ if (pField->CountControls() < 2) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ }
+ CFX_WideString csFullName = pField->GetFullName();
+ int iRet = CompareFieldName(csSub, csFullName);
+ if (iRet == 1) {
+ if (pField->GetFieldType() != iType) {
+ return FALSE;
+ }
+ } else if (iRet == 2 && csSub == csNewFieldName) {
+ if (csFullName[iPos] == L'.') {
+ return FALSE;
+ }
+ } else if (iRet == 3 && csSub == csNewFieldName) {
+ if (csNewFieldName[csFullName.GetLength()] == L'.') {
+ return FALSE;
+ }
+ }
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ }
+ if (csSub.IsEmpty()) {
+ return FALSE;
+ }
+ csNewFieldName = csSub;
+ return TRUE;
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(CFX_WideString& csNewFieldName, int iType)
+{
+ return ValidateFieldName(csNewFieldName, iType, NULL, NULL);
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormField* pField, CFX_WideString& csNewFieldName)
+{
+ if (pField == NULL || csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ return ValidateFieldName(csNewFieldName, ((CPDF_FormField*)pField)->GetFieldType(), pField, NULL);
+}
+FX_BOOL CPDF_InterForm::ValidateFieldName(const CPDF_FormControl* pControl, CFX_WideString& csNewFieldName)
+{
+ if (pControl == NULL || csNewFieldName.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField();
+ return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pControl);
+}
+int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_ByteString& name2)
+{
+ FX_LPCSTR ptr1 = name1, ptr2 = name2;
+ if (name1.GetLength() != name2.GetLength()) {
+ int i = 0;
+ while (ptr1[i] == ptr2[i]) {
+ i ++;
+ }
+ if (i == name1.GetLength()) {
+ return 2;
+ }
+ if (i == name2.GetLength()) {
+ return 3;
+ }
+ return 0;
+ } else {
+ return name1 == name2 ? 1 : 0;
+ }
+}
+int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_WideString& name2)
+{
+ FX_LPCWSTR ptr1 = name1, ptr2 = name2;
+ if (name1.GetLength() != name2.GetLength()) {
+ int i = 0;
+ while (ptr1[i] == ptr2[i]) {
+ i ++;
+ }
+ if (i == name1.GetLength()) {
+ return 2;
+ }
+ if (i == name2.GetLength()) {
+ return 3;
+ }
+ return 0;
+ } else {
+ return name1 == name2 ? 1 : 0;
+ }
+}
+FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName)
+{
+ if (csFieldName.IsEmpty()) {
+ return (FX_DWORD)m_pFieldTree->m_Root.CountFields();
+ }
+ CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
+ if (pNode == NULL) {
+ return 0;
+ }
+ return pNode->CountFields();
+}
+CPDF_FormField* CPDF_InterForm::GetField(FX_DWORD index, const CFX_WideString &csFieldName)
+{
+ if (csFieldName == L"") {
+ return m_pFieldTree->m_Root.GetField(index);
+ }
+ CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName);
+ if (pNode == NULL) {
+ return NULL;
+ }
+ return pNode->GetField(index);
+}
+void CPDF_InterForm::GetAllFieldNames(CFX_WideStringArray& allFieldNames)
+{
+ allFieldNames.RemoveAll();
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField *pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField) {
+ CFX_WideString full_name = GetFullName(pField->GetFieldDict());
+ allFieldNames.Add(full_name);
+ }
+ }
+}
+FX_BOOL CPDF_InterForm::IsValidFormField(const void* pField)
+{
+ if (pField == NULL) {
+ return FALSE;
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField *pFormField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == pFormField) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+CPDF_FormField* CPDF_InterForm::GetFieldByDict(CPDF_Dictionary* pFieldDict) const
+{
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CFX_WideString csWName = GetFullName(pFieldDict);
+ return m_pFieldTree->GetField(csWName);
+}
+FX_DWORD CPDF_InterForm::CountControls(CFX_WideString csFieldName)
+{
+ if (csFieldName.IsEmpty()) {
+ return (FX_DWORD)m_ControlMap.GetCount();
+ }
+ CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
+ if (pField == NULL) {
+ return 0;
+ }
+ return pField->m_ControlList.GetSize();
+}
+CPDF_FormControl* CPDF_InterForm::GetControl(FX_DWORD index, CFX_WideString csFieldName)
+{
+ CPDF_FormField *pField = m_pFieldTree->GetField(csFieldName);
+ if (pField == NULL) {
+ return NULL;
+ }
+ if (index < (FX_DWORD)pField->m_ControlList.GetSize()) {
+ return (CPDF_FormControl *)pField->m_ControlList.GetAt(index);
+ }
+ return NULL;
+}
+FX_BOOL CPDF_InterForm::IsValidFormControl(const void* pControl)
+{
+ if (pControl == NULL) {
+ return FALSE;
+ }
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* pWidgetDict = NULL;
+ void* pFormControl = NULL;
+ m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, pFormControl);
+ if (pControl == pFormControl) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+int CPDF_InterForm::CountPageControls(CPDF_Page* pPage) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return 0;
+ }
+ int count = 0;
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ count ++;
+ }
+ return count;
+}
+CPDF_FormControl* CPDF_InterForm::GetPageControl(CPDF_Page* pPage, int index) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return NULL;
+ }
+ int count = 0;
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ if (index == count) {
+ return pControl;
+ }
+ count ++;
+ }
+ return NULL;
+}
+CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y) const
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return NULL;
+ }
+ for (FX_DWORD i = pAnnotList->GetCount(); i > 0; i --) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i - 1);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl;
+ if (!m_ControlMap.Lookup(pAnnot, (FX_LPVOID&)pControl)) {
+ continue;
+ }
+ CFX_FloatRect rect = pControl->GetRect();
+ if (rect.Contains(pdf_x, pdf_y)) {
+ return pControl;
+ }
+ }
+ return NULL;
+}
+CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict) const
+{
+ CPDF_FormControl* pControl = NULL;
+ m_ControlMap.Lookup(pWidgetDict, (FX_LPVOID&)pControl);
+ return pControl;
+}
+FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName) const
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
+ if (pArray == NULL) {
+ return 0;
+ }
+ if (csFieldName.IsEmpty()) {
+ return pArray->GetCount();
+ } else {
+ int iLength = csFieldName.GetLength();
+ int iPos = 0;
+ CPDF_Dictionary* pDict = NULL;
+ while (pArray != NULL) {
+ CFX_WideString csSub;
+ if (iPos < iLength && csFieldName[iPos] == L'.') {
+ iPos ++;
+ }
+ while (iPos < iLength && csFieldName[iPos] != L'.') {
+ csSub += csFieldName[iPos ++];
+ }
+ int iCount = pArray->GetCount();
+ FX_BOOL bFind = FALSE;
+ for (int i = 0; i < iCount; i ++) {
+ pDict = pArray->GetDict(i);
+ if (pDict == NULL) {
+ continue;
+ }
+ CFX_WideString csT = pDict->GetUnicodeText("T");
+ if (csT == csSub) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if (!bFind) {
+ return 0;
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ pArray = pDict->GetArray("Kids");
+ }
+ if (pDict == NULL) {
+ return 0;
+ } else {
+ pArray = pDict->GetArray("Kids");
+ if (pArray == NULL) {
+ return 1;
+ } else {
+ return pArray->GetCount();
+ }
+ }
+ }
+}
+CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_WideString& csFieldName) const
+{
+ if (m_pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("Fields");
+ if (pArray == NULL) {
+ return 0;
+ }
+ if (csFieldName.IsEmpty()) {
+ return pArray->GetDict(index);
+ } else {
+ int iLength = csFieldName.GetLength();
+ int iPos = 0;
+ CPDF_Dictionary* pDict = NULL;
+ while (pArray != NULL) {
+ CFX_WideString csSub;
+ if (iPos < iLength && csFieldName[iPos] == L'.') {
+ iPos ++;
+ }
+ while (iPos < iLength && csFieldName[iPos] != L'.') {
+ csSub += csFieldName[iPos ++];
+ }
+ int iCount = pArray->GetCount();
+ FX_BOOL bFind = FALSE;
+ for (int i = 0; i < iCount; i ++) {
+ pDict = pArray->GetDict(i);
+ if (pDict == NULL) {
+ continue;
+ }
+ CFX_WideString csT = pDict->GetUnicodeText("T");
+ if (csT == csSub) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if (!bFind) {
+ return NULL;
+ }
+ if (iPos >= iLength) {
+ break;
+ }
+ pArray = pDict->GetArray("Kids");
+ }
+ if (pDict == NULL) {
+ return NULL;
+ } else {
+ pArray = pDict->GetArray("Kids");
+ if (pArray == NULL) {
+ return pDict;
+ } else {
+ return pArray->GetDict(index);
+ }
+ }
+ }
+}
+FX_BOOL CPDF_InterForm::NeedConstructAP()
+{
+ if (m_pFormDict == NULL) {
+ return FALSE;
+ }
+ return m_pFormDict->GetBoolean("NeedAppearances");
+}
+void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP)
+{
+ if (m_pFormDict == NULL) {
+ InitInterFormDict(m_pFormDict, m_pDocument);
+ }
+ m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
+ m_bGenerateAP = bNeedAP;
+}
+int CPDF_InterForm::CountFieldsInCalculationOrder()
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return 0;
+ }
+ return pArray->GetCount();
+}
+CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index)
+{
+ if (m_pFormDict == NULL || index < 0) {
+ return NULL;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pElement = pArray->GetElementValue(index);
+ if (pElement != NULL && pElement->GetType() == PDFOBJ_DICTIONARY) {
+ return GetFieldByDict((CPDF_Dictionary*)pElement);
+ }
+ return NULL;
+}
+int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField)
+{
+ if (m_pFormDict == NULL || pField == NULL) {
+ return -1;
+ }
+ CPDF_Array* pArray = m_pFormDict->GetArray("CO");
+ if (pArray == NULL) {
+ return -1;
+ }
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ if (pElement == pField->m_pDict) {
+ return i;
+ }
+ }
+ return -1;
+}
+FX_DWORD CPDF_InterForm::CountFormFonts()
+{
+ return CountInterFormFonts(m_pFormDict);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag)
+{
+ return GetInterFormFont(m_pFormDict, m_pDocument, csFontName, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ return GetNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::GetNativeFormFont(CFX_ByteString& csNameTag)
+{
+ return GetNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+FX_BOOL CPDF_InterForm::FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ return FindInterFormFont(m_pFormDict, pFont, csNameTag);
+}
+FX_BOOL CPDF_InterForm::FindFormFont(CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
+{
+ return FindInterFormFont(m_pFormDict, m_pDocument, csFontName, pFont, csNameTag);
+}
+void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
+ m_bUpdated = TRUE;
+}
+CPDF_Font* CPDF_InterForm::AddNativeFormFont(FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ m_bUpdated = TRUE;
+ return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
+}
+CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag)
+{
+ m_bUpdated = TRUE;
+ return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
+}
+void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont)
+{
+ m_bUpdated = TRUE;
+ RemoveInterFormFont(m_pFormDict, pFont);
+}
+void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag)
+{
+ m_bUpdated = TRUE;
+ RemoveInterFormFont(m_pFormDict, csNameTag);
+}
+CPDF_DefaultAppearance CPDF_InterForm::GetDefaultAppearance()
+{
+ CFX_ByteString csDA;
+ if (m_pFormDict == NULL) {
+ return csDA;
+ }
+ csDA = m_pFormDict->GetString("DA");
+ return csDA;
+}
+CPDF_Font* CPDF_InterForm::GetDefaultFormFont()
+{
+ return GetDefaultInterFormFont(m_pFormDict, m_pDocument);
+}
+int CPDF_InterForm::GetFormAlignment()
+{
+ if (m_pFormDict == NULL) {
+ return 0;
+ }
+ return m_pFormDict->GetInteger("Q", 0);
+}
+FX_BOOL CPDF_InterForm::ResetForm(const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bNotify)
+{
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormReset(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FX_BOOL bFind = FALSE;
+ int iCount = fields.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ if (pField == (CPDF_FormField*)fields[i]) {
+ bFind = TRUE;
+ break;
+ }
+ }
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ pField->ResetField(bNotify);
+ }
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormReset(this);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_InterForm::ResetForm(FX_BOOL bNotify)
+{
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormReset(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ pField->ResetField(bNotify);
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormReset(this);
+ }
+ return TRUE;
+}
+void CPDF_InterForm::ReloadForm()
+{
+ FX_POSITION pos = m_ControlMap.GetStartPosition();
+ while (pos) {
+ CPDF_Dictionary* pWidgetDict;
+ CPDF_FormControl* pControl;
+ m_ControlMap.GetNextAssoc(pos, (FX_LPVOID&)pWidgetDict, (FX_LPVOID&)pControl);
+ delete pControl;
+ }
+ m_ControlMap.RemoveAll();
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int k = 0; k < nCount; k ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(k);
+ delete pField;
+ }
+ m_pFieldTree->RemoveAll();
+ if (m_pFormDict == NULL) {
+ return;
+ }
+ CPDF_Array* pFields = m_pFormDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return;
+ }
+ int iCount = pFields->GetCount();
+ for (int i = 0; i < iCount; i ++) {
+ LoadField(pFields->GetDict(i));
+ }
+}
+void CPDF_InterForm::LoadField(CPDF_Dictionary* pFieldDict, int nLevel)
+{
+ if (nLevel > nMaxRecursion) {
+ return;
+ }
+ if (pFieldDict == NULL) {
+ return;
+ }
+ FX_DWORD dwParentObjNum = pFieldDict->GetObjNum();
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (!pKids) {
+ AddTerminalField(pFieldDict);
+ return;
+ }
+ CPDF_Dictionary* pFirstKid = pKids->GetDict(0);
+ if (pFirstKid == NULL) {
+ return;
+ }
+ if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary * pChildDict = pKids->GetDict(i);
+ if (pChildDict) {
+ if (pChildDict->GetObjNum() != dwParentObjNum) {
+ LoadField(pChildDict, nLevel + 1);
+ }
+ }
+ }
+ } else {
+ AddTerminalField(pFieldDict);
+ }
+}
+FX_BOOL CPDF_InterForm::HasXFAForm() const
+{
+ return m_pFormDict && m_pFormDict->GetArray(FX_BSTRC("XFA")) != NULL;
+}
+void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage)
+{
+ ASSERT(pPage != NULL);
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ if (pPageDict == NULL) {
+ return;
+ }
+ CPDF_Array* pAnnots = pPageDict->GetArray(FX_BSTRC("Annots"));
+ if (pAnnots == NULL) {
+ return;
+ }
+ int iAnnotCount = pAnnots->GetCount();
+ for (int i = 0; i < iAnnotCount; i++) {
+ CPDF_Dictionary* pAnnot = pAnnots->GetDict(i);
+ if (pAnnot != NULL && pAnnot->GetString(FX_BSTRC("Subtype")) == "Widget") {
+ LoadField(pAnnot);
+ }
+ }
+}
+CPDF_FormField* CPDF_InterForm::AddTerminalField(const CPDF_Dictionary* pFieldDict)
+{
+ if (!pFieldDict->KeyExist(FX_BSTRC("T"))) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pFieldDict;
+ CFX_WideString csWName = GetFullName(pDict);
+ if (csWName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_FormField* pField = NULL;
+ pField = m_pFieldTree->GetField(csWName);
+ if (pField == NULL) {
+ CPDF_Dictionary *pParent = (CPDF_Dictionary*)pFieldDict;
+ if (!pFieldDict->KeyExist(FX_BSTR("T")) &&
+ pFieldDict->GetString(FX_BSTRC("Subtype")) == FX_BSTRC("Widget")) {
+ pParent = pFieldDict->GetDict(FX_BSTRC("Parent"));
+ if (!pParent) {
+ pParent = (CPDF_Dictionary*)pFieldDict;
+ }
+ }
+ if (pParent && pParent != pFieldDict && !pParent->KeyExist(FX_BSTRC("FT"))) {
+ if (pFieldDict->KeyExist(FX_BSTRC("FT"))) {
+ CPDF_Object *pFTValue = pFieldDict->GetElementValue(FX_BSTRC("FT"));
+ if (pFTValue) {
+ pParent->SetAt(FX_BSTRC("FT"), pFTValue->Clone());
+ }
+ }
+ if (pFieldDict->KeyExist(FX_BSTRC("Ff"))) {
+ CPDF_Object *pFfValue = pFieldDict->GetElementValue(FX_BSTRC("Ff"));
+ if (pFfValue) {
+ pParent->SetAt(FX_BSTRC("Ff"), pFfValue->Clone());
+ }
+ }
+ }
+ pField = FX_NEW CPDF_FormField(this, pParent);
+ CPDF_Object* pTObj = pDict->GetElement("T");
+ if (pTObj && pTObj->GetType() == PDFOBJ_REFERENCE) {
+ CPDF_Object* pClone = pTObj->Clone(TRUE);
+ if (pClone) {
+ pDict->SetAt("T", pClone);
+ } else {
+ pDict->SetAtName("T", "");
+ }
+ }
+ m_pFieldTree->SetField(csWName, pField);
+ }
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (pKids == NULL) {
+ if (pFieldDict->GetString("Subtype") == "Widget") {
+ AddControl(pField, pFieldDict);
+ }
+ } else {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (pKid->GetString("Subtype") != "Widget") {
+ continue;
+ }
+ AddControl(pField, pKid);
+ }
+ }
+ return pField;
+}
+CPDF_FormControl* CPDF_InterForm::AddControl(const CPDF_FormField* pField, const CPDF_Dictionary* pWidgetDict)
+{
+ void *rValue = NULL;
+ if (m_ControlMap.Lookup((CPDF_Dictionary*)pWidgetDict, rValue)) {
+ return (CPDF_FormControl*)rValue;
+ }
+ CPDF_FormControl* pControl = FX_NEW CPDF_FormControl((CPDF_FormField*)pField, (CPDF_Dictionary*)pWidgetDict);
+ if (pControl == NULL) {
+ return NULL;
+ }
+ m_ControlMap.SetAt((CPDF_Dictionary*)pWidgetDict, pControl);
+ ((CPDF_FormField*)pField)->m_ControlList.Add(pControl);
+ return pControl;
+}
+CPDF_FormField* CPDF_InterForm::CheckRequiredFields(const CFX_PtrArray *fields, FX_BOOL bIncludeOrExclude) const
+{
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FX_INT32 iType = pField->GetType();
+ if (iType == CPDF_FormField::PushButton || iType == CPDF_FormField::CheckBox || iType == CPDF_FormField::ListBox) {
+ continue;
+ }
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ if (dwFlags & 0x04) {
+ continue;
+ }
+ FX_BOOL bFind = TRUE;
+ if (fields != NULL) {
+ bFind = fields->Find(pField, 0) >= 0;
+ }
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ CPDF_Dictionary *pFieldDict = pField->m_pDict;
+ if ((dwFlags & 0x02) != 0 && pFieldDict->GetString("V").IsEmpty()) {
+ return pField;
+ }
+ }
+ }
+ return NULL;
+}
+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, FX_BOOL bSimpleFileSpec) const
+{
+ CFX_PtrArray fields;
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ fields.Add(pField);
+ }
+ return ExportToFDF(pdf_path, fields, TRUE, bSimpleFileSpec);
+}
+CFX_WideString FILESPEC_EncodeFileName(FX_WSTR filepath);
+CFDF_Document* CPDF_InterForm::ExportToFDF(FX_WSTR pdf_path, CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude, FX_BOOL bSimpleFileSpec) const
+{
+ CFDF_Document* pDoc = CFDF_Document::CreateNewDoc();
+ if (pDoc == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pMainDict = pDoc->GetRoot()->GetDict("FDF");
+ if (!pdf_path.IsEmpty()) {
+ if (bSimpleFileSpec) {
+ CFX_WideString wsFilePath = FILESPEC_EncodeFileName(pdf_path);
+ pMainDict->SetAtString(FX_BSTRC("F"), CFX_ByteString::FromUnicode(wsFilePath));
+ pMainDict->SetAtString(FX_BSTRC("UF"), PDF_EncodeText(wsFilePath));
+ } else {
+ CPDF_FileSpec filespec;
+ filespec.SetFileName(pdf_path);
+ pMainDict->SetAt("F", (CPDF_Object*)filespec);
+ }
+ }
+ CPDF_Array* pFields = CPDF_Array::Create();
+ if (pFields == NULL) {
+ return NULL;
+ }
+ pMainDict->SetAt("Fields", pFields);
+ int nCount = m_pFieldTree->m_Root.CountFields();
+ for (int i = 0; i < nCount; i ++) {
+ CPDF_FormField* pField = m_pFieldTree->m_Root.GetField(i);
+ if (pField == NULL || pField->GetType() == CPDF_FormField::PushButton) {
+ continue;
+ }
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ if (dwFlags & 0x04) {
+ continue;
+ }
+ FX_BOOL bFind = fields.Find(pField, 0) >= 0;
+ if ((bIncludeOrExclude && bFind) || (!bIncludeOrExclude && !bFind)) {
+ if ((dwFlags & 0x02) != 0 && pField->m_pDict->GetString("V").IsEmpty()) {
+ continue;
+ }
+ CFX_WideString fullname = GetFullName(pField->GetFieldDict());
+ CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CPDF_String* pString = CPDF_String::Create(fullname);
+ if (pString == NULL) {
+ pFieldDict->Release();
+ return NULL;
+ }
+ pFieldDict->SetAt("T", pString);
+ if (pField->GetType() == CPDF_FormField::CheckBox || pField->GetType() == CPDF_FormField::RadioButton) {
+ CFX_WideString csExport = pField->GetCheckValue(FALSE);
+ CFX_ByteString csBExport = PDF_EncodeText(csExport);
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->m_pDict, "Opt");
+ if (pOpt == NULL) {
+ pFieldDict->SetAtName("V", csBExport);
+ } else {
+ pFieldDict->SetAtString("V", csBExport);
+ }
+ } else {
+ CPDF_Object* pV = FPDF_GetFieldAttr(pField->m_pDict, "V");
+ if (pV != NULL) {
+ pFieldDict->SetAt("V", pV->Clone(TRUE));
+ }
+ }
+ pFields->Add(pFieldDict);
+ }
+ }
+ return pDoc;
+}
+const struct _SupportFieldEncoding {
+ FX_LPCSTR m_name;
+ FX_INT32 m_codePage;
+} g_fieldEncoding[] = {
+ "BigFive", 950,
+ "GBK", 936,
+ "Shift-JIS", 932,
+ "UHC", 949,
+};
+static void FPDFDOC_FDF_GetFieldValue(CPDF_Dictionary *pFieldDict, CFX_WideString &csValue, CFX_ByteString &bsEncoding)
+{
+ ASSERT(pFieldDict != NULL);
+ CFX_ByteString csBValue = pFieldDict->GetString("V");
+ FX_INT32 iCount = sizeof(g_fieldEncoding) / sizeof(g_fieldEncoding[0]);
+ FX_INT32 i = 0;
+ for (; i < iCount; ++i)
+ if (bsEncoding == g_fieldEncoding[i].m_name) {
+ break;
+ }
+ if (i < iCount) {
+ CFX_CharMap *pCharMap = CFX_CharMap::GetDefaultMapper(g_fieldEncoding[i].m_codePage);
+ FXSYS_assert(pCharMap != NULL);
+ csValue.ConvertFrom(csBValue, pCharMap);
+ return;
+ }
+ CFX_ByteString csTemp = csBValue.Left(2);
+ if (csTemp == "\xFF\xFE" || csTemp == "\xFE\xFF") {
+ csValue = PDF_DecodeText(csBValue);
+ } else {
+ csValue = CFX_WideString::FromLocal(csBValue);
+ }
+}
+void CPDF_InterForm::FDF_ImportField(CPDF_Dictionary* pFieldDict, const CFX_WideString& parent_name, FX_BOOL bNotify, int nLevel)
+{
+ CFX_WideString name;
+ if (!parent_name.IsEmpty()) {
+ name = parent_name + L".";
+ }
+ name += pFieldDict->GetUnicodeText("T");
+ CPDF_Array* pKids = pFieldDict->GetArray("Kids");
+ if (pKids) {
+ for (FX_DWORD i = 0; i < pKids->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pKids->GetDict(i);
+ if (pKid == NULL) {
+ continue;
+ }
+ if (nLevel <= nMaxRecursion) {
+ FDF_ImportField(pKid, name, bNotify, nLevel + 1);
+ }
+ }
+ return;
+ }
+ if (!pFieldDict->KeyExist("V")) {
+ return;
+ }
+ CPDF_FormField* pField = m_pFieldTree->GetField(name);
+ if (pField == NULL) {
+ return;
+ }
+ CFX_WideString csWValue;
+ FPDFDOC_FDF_GetFieldValue(pFieldDict, csWValue, m_bsEncoding);
+ int iType = pField->GetFieldType();
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = 0;
+ if (iType == FIELDTYPE_LISTBOX) {
+ iRet = m_pFormNotify->BeforeSelectionChange(pField, csWValue);
+ } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
+ iRet = m_pFormNotify->BeforeValueChange(pField, csWValue);
+ }
+ if (iRet < 0) {
+ return;
+ }
+ }
+ CFX_ByteArray statusArray;
+ if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
+ SaveCheckedFieldStatus(pField, statusArray);
+ }
+ pField->SetValue(csWValue);
+ CPDF_FormField::Type eType = pField->GetType();
+ if ((eType == CPDF_FormField::ListBox || eType == CPDF_FormField::ComboBox) && pFieldDict->KeyExist("Opt")) {
+ pField->m_pDict->SetAt("Opt", pFieldDict->GetElementValue("Opt")->Clone(TRUE));
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ if (iType == FIELDTYPE_CHECKBOX || iType == FIELDTYPE_RADIOBUTTON) {
+ m_pFormNotify->AfterCheckedStatusChange(pField, statusArray);
+ } else if (iType == FIELDTYPE_LISTBOX) {
+ m_pFormNotify->AfterSelectionChange(pField);
+ } else if (iType == FIELDTYPE_COMBOBOX || iType == FIELDTYPE_TEXTFIELD) {
+ m_pFormNotify->AfterValueChange(pField);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ pField->UpdateAP(NULL);
+ }
+}
+FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF, FX_BOOL bNotify)
+{
+ if (pFDF == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
+ if (pMainDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pFields = pMainDict->GetArray("Fields");
+ if (pFields == NULL) {
+ return FALSE;
+ }
+ m_bsEncoding = pMainDict->GetString(FX_BSTRC("Encoding"));
+ if (bNotify && m_pFormNotify != NULL) {
+ int iRet = m_pFormNotify->BeforeFormImportData(this);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ for (FX_DWORD i = 0; i < pFields->GetCount(); i ++) {
+ CPDF_Dictionary* pField = pFields->GetDict(i);
+ if (pField == NULL) {
+ continue;
+ }
+ FDF_ImportField(pField, L"", bNotify);
+ }
+ if (bNotify && m_pFormNotify != NULL) {
+ m_pFormNotify->AfterFormImportData(this);
+ }
+ return TRUE;
+}
+void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify)
+{
+ m_pFormNotify = (CPDF_FormNotify*)pNotify;
+}
+int CPDF_InterForm::GetPageWithWidget(int iCurPage, FX_BOOL bNext)
+{
+ if (iCurPage < 0) {
+ return -1;
+ }
+ int iPageCount = m_pDocument->GetPageCount();
+ if (iCurPage >= iPageCount) {
+ return -1;
+ }
+ int iNewPage = iCurPage;
+ do {
+ iNewPage += bNext ? 1 : -1;
+ if (iNewPage >= iPageCount) {
+ iNewPage = 0;
+ }
+ if (iNewPage < 0) {
+ iNewPage = iPageCount - 1;
+ }
+ if (iNewPage == iCurPage) {
+ break;
+ }
+ CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iNewPage);
+ if (pPageDict == NULL) {
+ continue;
+ }
+ CPDF_Array* pAnnots = pPageDict->GetArray("Annots");
+ if (pAnnots == NULL) {
+ continue;
+ }
+ FX_DWORD dwCount = pAnnots->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i ++) {
+ CPDF_Object* pAnnotDict = pAnnots->GetElementValue(i);
+ if (pAnnotDict == NULL) {
+ continue;
+ }
+ CPDF_FormControl* pControl = NULL;
+ if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) {
+ return iNewPage;
+ }
+ }
+ } while (TRUE);
+ return -1;
+}
diff --git a/core/src/fpdfdoc/doc_formcontrol.cpp b/core/src/fpdfdoc/doc_formcontrol.cpp
new file mode 100644
index 0000000000..f92b87e5f6
--- /dev/null
+++ b/core/src/fpdfdoc/doc_formcontrol.cpp
@@ -0,0 +1,461 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict)
+{
+ m_pField = pField;
+ m_pWidgetDict = pWidgetDict;
+ m_pForm = m_pField->m_pForm;
+}
+CFX_FloatRect CPDF_FormControl::GetRect()
+{
+ return m_pWidgetDict->GetRect("Rect");
+}
+CFX_ByteString CPDF_FormControl::GetOnStateName()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn;
+ CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
+ if (pAP == NULL) {
+ return csOn;
+ }
+ CPDF_Dictionary* pN = pAP->GetDict("N");
+ if (pN == NULL) {
+ return csOn;
+ }
+ FX_POSITION pos = pN->GetStartPos();
+ while (pos) {
+ pN->GetNextElement(pos, csOn);
+ if (csOn != "Off") {
+ return csOn;
+ }
+ }
+ return CFX_ByteString();
+}
+void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn)
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csValue = csOn;
+ if (csValue.IsEmpty()) {
+ csValue = "Yes";
+ }
+ if (csValue == "Off") {
+ csValue = "Yes";
+ }
+ CFX_ByteString csAS = m_pWidgetDict->GetString("AS", "Off");
+ if (csAS != "Off") {
+ m_pWidgetDict->SetAtName("AS", csValue);
+ }
+ CPDF_Dictionary* pAP = m_pWidgetDict->GetDict("AP");
+ if (pAP == NULL) {
+ return;
+ }
+ FX_POSITION pos1 = pAP->GetStartPos();
+ while (pos1) {
+ CFX_ByteString csKey1;
+ CPDF_Object* pObj1 = pAP->GetNextElement(pos1, csKey1);
+ if (pObj1 == NULL) {
+ continue;
+ }
+ CPDF_Object* pObjDirect1 = pObj1->GetDirect();
+ if (pObjDirect1->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)pObjDirect1;
+ FX_POSITION pos2 = pSubDict->GetStartPos();
+ while (pos2) {
+ CFX_ByteString csKey2;
+ CPDF_Object* pObj2 = pSubDict->GetNextElement(pos2, csKey2);
+ if (pObj2 == NULL) {
+ continue;
+ }
+ if (csKey2 != "Off") {
+ pSubDict->ReplaceKey(csKey2, csValue);
+ break;
+ }
+ }
+ }
+}
+CFX_ByteString CPDF_FormControl::GetCheckedAPState()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
+ if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
+ int iIndex = m_pField->GetControlIndex(this);
+ csOn.Format("%d", iIndex);
+ }
+ }
+ if (csOn.IsEmpty()) {
+ csOn = "Yes";
+ }
+ return csOn;
+}
+CFX_WideString CPDF_FormControl::GetExportValue()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ if (GetType() == CPDF_FormField::RadioButton || GetType() == CPDF_FormField::CheckBox) {
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pField->m_pDict, "Opt");
+ if (pOpt != NULL && pOpt->GetType() == PDFOBJ_ARRAY) {
+ int iIndex = m_pField->GetControlIndex(this);
+ csOn = ((CPDF_Array*)pOpt)->GetString(iIndex);
+ }
+ }
+ if (csOn.IsEmpty()) {
+ csOn = "Yes";
+ }
+ CFX_WideString csWOn = PDF_DecodeText(csOn);
+ return csWOn;
+}
+FX_BOOL CPDF_FormControl::IsChecked()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ CFX_ByteString csAS = m_pWidgetDict->GetString("AS");
+ return csAS == csOn;
+}
+FX_BOOL CPDF_FormControl::IsDefaultChecked()
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV");
+ if (pDV == NULL) {
+ return FALSE;
+ }
+ CFX_ByteString csDV = pDV->GetString();
+ CFX_ByteString csOn = GetOnStateName();
+ return (csDV == csOn);
+}
+void CPDF_FormControl::CheckControl(FX_BOOL bChecked)
+{
+ ASSERT(GetType() == CPDF_FormField::CheckBox || GetType() == CPDF_FormField::RadioButton);
+ CFX_ByteString csOn = GetOnStateName();
+ CFX_ByteString csOldAS = m_pWidgetDict->GetString("AS", "Off");
+ CFX_ByteString csAS = "Off";
+ if (bChecked) {
+ csAS = csOn;
+ }
+ if (csOldAS == csAS) {
+ return;
+ }
+ m_pWidgetDict->SetAtName("AS", csAS);
+ m_pForm->m_bUpdated = TRUE;
+}
+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict, CPDF_Annot::AppearanceMode mode);
+void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, CFX_AffineMatrix* pMatrix, CPDF_Page* pPage,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ if (m_pWidgetDict->GetInteger("F") & ANNOTFLAG_HIDDEN) {
+ return;
+ }
+ CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);
+ if (pStream == NULL) {
+ return;
+ }
+ CFX_FloatRect form_bbox = pStream->GetDict()->GetRect("BBox");
+ CFX_AffineMatrix form_matrix = pStream->GetDict()->GetMatrix("Matrix");
+ form_matrix.TransformRect(form_bbox);
+ CFX_FloatRect arect = m_pWidgetDict->GetRect("Rect");
+ CFX_AffineMatrix matrix;
+ matrix.MatchRect(arect, form_bbox);
+ matrix.Concat(*pMatrix);
+ CPDF_Form form(m_pField->m_pForm->m_pDocument, m_pField->m_pForm->m_pFormDict->GetDict("DR"), pStream);
+ form.ParseContent(NULL, NULL, NULL, NULL);
+ CPDF_RenderContext context;
+ context.Create(pPage);
+ context.DrawObjectList(pDevice, &form, &matrix, pOptions);
+}
+const FX_CHAR* g_sHighlightingMode[] = {"N", "I", "O", "P", "T", ""};
+CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode()
+{
+ if (m_pWidgetDict == NULL) {
+ return Invert;
+ }
+ CFX_ByteString csH = m_pWidgetDict->GetString("H", "I");
+ int i = 0;
+ while (g_sHighlightingMode[i][0] != '\0') {
+ if (csH.Equal(g_sHighlightingMode[i])) {
+ return (HighlightingMode)i;
+ }
+ i ++;
+ }
+ return Invert;
+}
+CPDF_ApSettings CPDF_FormControl::GetMK(FX_BOOL bCreate)
+{
+ if (!m_pWidgetDict) {
+ return NULL;
+ }
+ CPDF_ApSettings mk = m_pWidgetDict->GetDict(FX_BSTRC("MK"));
+ if (!mk && bCreate) {
+ mk = CPDF_Dictionary::Create();
+ if (mk == NULL) {
+ return NULL;
+ }
+ m_pWidgetDict->SetAt(FX_BSTRC("MK"), mk);
+ }
+ return mk;
+}
+FX_BOOL CPDF_FormControl::HasMKEntry(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.HasMKEntry(csEntry);
+}
+int CPDF_FormControl::GetRotation()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetRotation();
+}
+FX_ARGB CPDF_FormControl::GetColor(int& iColorType, CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetColor(iColorType, csEntry);
+}
+FX_FLOAT CPDF_FormControl::GetOriginalColor(int index, CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetOriginalColor(index, csEntry);
+}
+void CPDF_FormControl::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ mk.GetOriginalColor(iColorType, fc, csEntry);
+}
+CFX_WideString CPDF_FormControl::GetCaption(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetCaption(csEntry);
+}
+CPDF_Stream* CPDF_FormControl::GetIcon(CFX_ByteString csEntry)
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetIcon(csEntry);
+}
+CPDF_IconFit CPDF_FormControl::GetIconFit()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetIconFit();
+}
+int CPDF_FormControl::GetTextPosition()
+{
+ CPDF_ApSettings mk = GetMK(FALSE);
+ return mk.GetTextPosition();
+}
+CPDF_Action CPDF_FormControl::GetAction()
+{
+ if (m_pWidgetDict == NULL) {
+ return NULL;
+ }
+ if (m_pWidgetDict->KeyExist("A")) {
+ return m_pWidgetDict->GetDict("A");
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A");
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+ }
+}
+CPDF_AAction CPDF_FormControl::GetAdditionalAction()
+{
+ if (m_pWidgetDict == NULL) {
+ return NULL;
+ }
+ if (m_pWidgetDict->KeyExist("AA")) {
+ return m_pWidgetDict->GetDict("AA");
+ } else {
+ return m_pField->GetAdditionalAction();
+ }
+}
+CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance()
+{
+ if (m_pWidgetDict == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_pWidgetDict->KeyExist("DA")) {
+ return m_pWidgetDict->GetString("DA");
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA");
+ if (pObj == NULL) {
+ return m_pField->m_pForm->GetDefaultAppearance();
+ }
+ return pObj->GetString();
+ }
+}
+CPDF_Font* CPDF_FormControl::GetDefaultControlFont()
+{
+ CPDF_DefaultAppearance cDA = GetDefaultAppearance();
+ CFX_ByteString csFontNameTag;
+ FX_FLOAT fFontSize;
+ cDA.GetFont(csFontNameTag, fFontSize);
+ if (csFontNameTag.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR");
+ if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (pFonts != NULL) {
+ CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
+ CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ }
+ }
+ CPDF_Font *pFont = m_pField->m_pForm->GetFormFont(csFontNameTag);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ CPDF_Dictionary *pPageDict = m_pWidgetDict->GetDict("P");
+ pObj = FPDF_GetFieldAttr(pPageDict, "Resources");
+ if (pObj != NULL && pObj->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_Dictionary* pFonts = ((CPDF_Dictionary*)pObj)->GetDict("Font");
+ if (pFonts != NULL) {
+ CPDF_Dictionary *pElement = pFonts->GetDict(csFontNameTag);
+ CPDF_Font *pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement);
+ if (pFont != NULL) {
+ return pFont;
+ }
+ }
+ }
+ return NULL;
+}
+int CPDF_FormControl::GetControlAlignment()
+{
+ if (m_pWidgetDict == NULL) {
+ return 0;
+ }
+ if (m_pWidgetDict->KeyExist("Q")) {
+ return m_pWidgetDict->GetInteger("Q", 0);
+ } else {
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q");
+ if (pObj == NULL) {
+ return m_pField->m_pForm->GetFormAlignment();
+ }
+ return pObj->GetInteger();
+ }
+}
+FX_BOOL CPDF_ApSettings::HasMKEntry(FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->KeyExist(csEntry);
+}
+int CPDF_ApSettings::GetRotation()
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ return m_pDict->GetInteger(FX_BSTRC("R"));
+}
+FX_ARGB CPDF_ApSettings::GetColor(int& iColorType, FX_BSTR csEntry)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ FX_ARGB color = 0;
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry == NULL) {
+ return color;
+ }
+ FX_DWORD dwCount = pEntry->GetCount();
+ if (dwCount == 1) {
+ iColorType = COLORTYPE_GRAY;
+ FX_FLOAT g = pEntry->GetNumber(0) * 255;
+ color = ArgbEncode(255, (int)g, (int)g, (int)g);
+ } else if (dwCount == 3) {
+ iColorType = COLORTYPE_RGB;
+ FX_FLOAT r = pEntry->GetNumber(0) * 255;
+ FX_FLOAT g = pEntry->GetNumber(1) * 255;
+ FX_FLOAT b = pEntry->GetNumber(2) * 255;
+ color = ArgbEncode(255, (int)r, (int)g, (int)b);
+ } else if (dwCount == 4) {
+ iColorType = COLORTYPE_CMYK;
+ FX_FLOAT c = pEntry->GetNumber(0);
+ FX_FLOAT m = pEntry->GetNumber(1);
+ FX_FLOAT y = pEntry->GetNumber(2);
+ FX_FLOAT k = pEntry->GetNumber(3);
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+ color = ArgbEncode(255, (int)(r * 255), (int)(g * 255), (int)(b * 255));
+ }
+ return color;
+}
+FX_FLOAT CPDF_ApSettings::GetOriginalColor(int index, FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return 0;
+ }
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry != NULL) {
+ return pEntry->GetNumber(index);
+ }
+ return 0;
+}
+void CPDF_ApSettings::GetOriginalColor(int& iColorType, FX_FLOAT fc[4], FX_BSTR csEntry)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ for (int i = 0; i < 4; i ++) {
+ fc[i] = 0;
+ }
+ if (m_pDict == NULL) {
+ return;
+ }
+ CPDF_Array* pEntry = m_pDict->GetArray(csEntry);
+ if (pEntry == NULL) {
+ return;
+ }
+ FX_DWORD dwCount = pEntry->GetCount();
+ if (dwCount == 1) {
+ iColorType = COLORTYPE_GRAY;
+ fc[0] = pEntry->GetNumber(0);
+ } else if (dwCount == 3) {
+ iColorType = COLORTYPE_RGB;
+ fc[0] = pEntry->GetNumber(0);
+ fc[1] = pEntry->GetNumber(1);
+ fc[2] = pEntry->GetNumber(2);
+ } else if (dwCount == 4) {
+ iColorType = COLORTYPE_CMYK;
+ fc[0] = pEntry->GetNumber(0);
+ fc[1] = pEntry->GetNumber(1);
+ fc[2] = pEntry->GetNumber(2);
+ fc[3] = pEntry->GetNumber(3);
+ }
+}
+CFX_WideString CPDF_ApSettings::GetCaption(FX_BSTR csEntry)
+{
+ CFX_WideString csCaption;
+ if (m_pDict == NULL) {
+ return csCaption;
+ }
+ return m_pDict->GetUnicodeText(csEntry);
+}
+CPDF_Stream* CPDF_ApSettings::GetIcon(FX_BSTR csEntry)
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetStream(csEntry);
+}
+CPDF_IconFit CPDF_ApSettings::GetIconFit()
+{
+ if (m_pDict == NULL) {
+ return NULL;
+ }
+ return m_pDict->GetDict(FX_BSTRC("IF"));
+}
+int CPDF_ApSettings::GetTextPosition()
+{
+ if (m_pDict == NULL) {
+ return TEXTPOS_CAPTION;
+ }
+ return m_pDict->GetInteger(FX_BSTRC("TP"), TEXTPOS_CAPTION);
+}
diff --git a/core/src/fpdfdoc/doc_formfield.cpp b/core/src/fpdfdoc/doc_formfield.cpp
new file mode 100644
index 0000000000..d84a6b14be
--- /dev/null
+++ b/core/src/fpdfdoc/doc_formfield.cpp
@@ -0,0 +1,1095 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)
+{
+ FX_BOOL bUnison = FALSE;
+ if (pField->GetType() == CPDF_FormField::CheckBox) {
+ bUnison = TRUE;
+ } else {
+ FX_DWORD dwFlags = pField->GetFieldFlags();
+ bUnison = ((dwFlags & 0x2000000) != 0);
+ }
+ return bUnison;
+}
+CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
+{
+ m_pDict = pDict;
+ m_Type = Unknown;
+ m_pForm = pForm;
+ m_pFont = NULL;
+ m_FontSize = 0;
+ SyncFieldFlags();
+}
+CPDF_FormField::~CPDF_FormField()
+{
+}
+void CPDF_FormField::SyncFieldFlags()
+{
+ CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")->GetString();
+ FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger();
+ m_Flags = 0;
+ if (flags & 1) {
+ m_Flags |= FORMFIELD_READONLY;
+ }
+ if (flags & 2) {
+ m_Flags |= FORMFIELD_REQUIRED;
+ }
+ if (flags & 4) {
+ m_Flags |= FORMFIELD_NOEXPORT;
+ }
+ if (type_name == "Btn") {
+ if (flags & 0x8000) {
+ m_Type = RadioButton;
+ if (flags & 0x4000) {
+ m_Flags |= FORMRADIO_NOTOGGLEOFF;
+ }
+ if (flags & 0x2000000) {
+ m_Flags |= FORMRADIO_UNISON;
+ }
+ } else if (flags & 0x10000) {
+ m_Type = PushButton;
+ } else {
+ m_Type = CheckBox;
+ }
+ } else if (type_name == "Tx") {
+ if (flags & 0x100000) {
+ m_Type = File;
+ } else if (flags & 0x2000000) {
+ m_Type = RichText;
+ } else {
+ m_Type = Text;
+ if (flags & 0x1000) {
+ m_Flags |= FORMTEXT_MULTILINE;
+ }
+ if (flags & 0x2000) {
+ m_Flags |= FORMTEXT_PASSWORD;
+ }
+ if (flags & 0x800000) {
+ m_Flags |= FORMTEXT_NOSCROLL;
+ }
+ if (flags & 0x100000) {
+ m_Flags |= FORMTEXT_COMB;
+ }
+ }
+ LoadDA();
+ } else if (type_name == "Ch") {
+ if (flags & 0x20000) {
+ m_Type = ComboBox;
+ if (flags & 0x40000) {
+ m_Flags |= FORMCOMBO_EDIT;
+ }
+ } else {
+ m_Type = ListBox;
+ if (flags & 0x200000) {
+ m_Flags |= FORMLIST_MULTISELECT;
+ }
+ }
+ LoadDA();
+ } else if (type_name == "Sig") {
+ m_Type = Sign;
+ }
+}
+CFX_WideString CPDF_FormField::GetFullName()
+{
+ return ::GetFullName(m_pDict);
+}
+FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)
+{
+ switch (m_Type) {
+ case CPDF_FormField::CheckBox:
+ case CPDF_FormField::RadioButton: {
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ int iCount = CountControls();
+ if (iCount) {
+ if (PDF_FormField_IsUnison(this)) {
+ for(int i = 0; i < iCount; i++) {
+ CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
+ }
+ } else {
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ FX_BOOL bChecked = pControl->IsDefaultChecked();
+ CheckControl(i, bChecked, FALSE);
+ }
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ }
+ break;
+ case CPDF_FormField::ComboBox: {
+ CFX_WideString csValue;
+ ClearSelection();
+ int iIndex = GetDefaultSelectedItem();
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ SetItemSelection(iIndex, TRUE);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ break;
+ case CPDF_FormField::ListBox: {
+ CFX_WideString csValue;
+ ClearSelection();
+ int iIndex = GetDefaultSelectedItem();
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ SetItemSelection(iIndex, TRUE);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ }
+ break;
+ case CPDF_FormField::Text:
+ case CPDF_FormField::RichText:
+ case CPDF_FormField::File:
+ default: {
+ CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
+ CFX_WideString csDValue;
+ if (pDV != NULL) {
+ csDValue = pDV->GetUnicodeText();
+ }
+ CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
+ CFX_WideString csValue;
+ if (pV != NULL) {
+ csValue = pV->GetUnicodeText();
+ }
+ CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
+ if (!pRV && (csDValue == csValue)) {
+ return FALSE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (pDV == NULL) {
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("RV");
+ } else {
+ CPDF_Object* pClone = pDV->Clone();
+ if (pClone == NULL) {
+ return FALSE;
+ }
+ m_pDict->SetAt("V", pClone);
+ if(pRV) {
+ CPDF_Object* pCloneR = pDV->Clone();
+ m_pDict->SetAt("RV", pCloneR);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ }
+ break;
+ }
+ return TRUE;
+}
+int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)
+{
+ if (pControl == NULL) {
+ return -1;
+ }
+ int iCount = m_ControlList.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);
+ if (pFind == pControl) {
+ return i;
+ }
+ }
+ return -1;
+}
+int CPDF_FormField::GetFieldType()
+{
+ switch (m_Type) {
+ case PushButton:
+ return FIELDTYPE_PUSHBUTTON;
+ case CheckBox:
+ return FIELDTYPE_CHECKBOX;
+ case RadioButton:
+ return FIELDTYPE_RADIOBUTTON;
+ case ComboBox:
+ return FIELDTYPE_COMBOBOX;
+ case ListBox:
+ return FIELDTYPE_LISTBOX;
+ case Text:
+ case RichText:
+ case File:
+ return FIELDTYPE_TEXTFIELD;
+ case Sign:
+ return FIELDTYPE_SIGNATURE;
+ default:
+ break;
+ }
+ return FIELDTYPE_UNKNOWN;
+}
+CPDF_AAction CPDF_FormField::GetAdditionalAction()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
+ if (pObj == NULL) {
+ return NULL;
+ }
+ return pObj->GetDict();
+}
+CFX_WideString CPDF_FormField::GetAlternateName()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetMappingName()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+FX_DWORD CPDF_FormField::GetFieldFlags()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+CFX_ByteString CPDF_FormField::GetDefaultStyle()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
+ if (pObj == NULL) {
+ return "";
+ }
+ return pObj->GetString();
+}
+CFX_WideString CPDF_FormField::GetRichTextString()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
+ if (pObj == NULL) {
+ return L"";
+ }
+ return pObj->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)
+{
+ if (GetType() == CheckBox || GetType() == RadioButton) {
+ return GetCheckValue(bDefault);
+ }
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
+ if (pValue == NULL) {
+ if (!bDefault) {
+ if (m_Type == RichText) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ }
+ if (pValue == NULL && m_Type != Text) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "DV");
+ }
+ }
+ if (pValue == NULL) {
+ return CFX_WideString();
+ }
+ }
+ switch (pValue->GetType()) {
+ case PDFOBJ_STRING:
+ case PDFOBJ_STREAM:
+ return pValue->GetUnicodeText();
+ case PDFOBJ_ARRAY:
+ pValue = ((CPDF_Array*)pValue)->GetElementValue(0);
+ return pValue->GetUnicodeText();
+ break;
+ }
+ return CFX_WideString();
+}
+CFX_WideString CPDF_FormField::GetValue()
+{
+ return GetValue(FALSE);
+}
+CFX_WideString CPDF_FormField::GetDefaultValue()
+{
+ return GetValue(TRUE);
+}
+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
+{
+ switch (m_Type) {
+ case CheckBox:
+ case RadioButton: {
+ SetCheckValue(value, bDefault, bNotify);
+ return TRUE;
+ }
+ case File:
+ case RichText:
+ case Text:
+ case ComboBox: {
+ CFX_WideString csValue = value;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ int iIndex = FindOptionValue(csValue);
+ if (iIndex < 0) {
+ CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
+ m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
+ if (m_Type == RichText && !bDefault) {
+ m_pDict->SetAtString("RV", bsEncodeText);
+ }
+ m_pDict->RemoveAt("I");
+ } else {
+ m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
+ if (bDefault) {
+ } else {
+ ClearSelection();
+ SetItemSelection(iIndex, TRUE);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ }
+ break;
+ case ListBox: {
+ int iIndex = FindOptionValue(value);
+ if (iIndex < 0) {
+ return FALSE;
+ }
+ if (bDefault && iIndex == GetDefaultSelectedItem()) {
+ return FALSE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ CFX_WideString csValue = value;
+ int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (bDefault) {
+ } else {
+ ClearSelection();
+ SetItemSelection(iIndex, TRUE);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)
+{
+ return SetValue(value, FALSE, bNotify);
+}
+int CPDF_FormField::GetMaxLen()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen");
+ if (pObj == NULL) {
+ int iCount = m_ControlList.GetSize();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);
+ if (pControl == NULL) {
+ continue;
+ }
+ CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
+ if (pWidgetDict->KeyExist("MaxLen")) {
+ return pWidgetDict->GetInteger("MaxLen");
+ }
+ }
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+int CPDF_FormField::CountSelectedItems()
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return 0;
+ }
+ }
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetString().IsEmpty()) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pValue->GetType() == PDFOBJ_NUMBER) {
+ if (pValue->GetString().IsEmpty()) {
+ return 0;
+ }
+ return 1;
+ }
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)pValue)->GetCount();
+}
+int CPDF_FormField::GetSelectedIndex(int index)
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return -1;
+ }
+ }
+ CFX_WideString sel_value;
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (index != 0) {
+ return -1;
+ }
+ sel_value = pValue->GetUnicodeText();
+ } else if (pValue->GetType() == PDFOBJ_NUMBER) {
+ return pValue->GetInteger();
+ } else {
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return -1;
+ }
+ if (index < 0) {
+ return -1;
+ }
+ sel_value = ((CPDF_Array*)pValue)->GetElementValue(index)->GetUnicodeText();
+ }
+ if (index < CountSelectedOptions()) {
+ int iOptIndex = GetSelectedOptionIndex(index);
+ CFX_WideString csOpt = GetOptionValue(iOptIndex);
+ if (csOpt == sel_value) {
+ return iOptIndex;
+ }
+ }
+ int nOpts = CountOptions();
+ for (int i = 0; i < nOpts; i ++) {
+ if (sel_value == GetOptionValue(i)) {
+ return i;
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)
+{
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue;
+ int iIndex = GetSelectedIndex(0);
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("I");
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::IsItemSelected(int index)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ if (IsOptionSelected(index)) {
+ return TRUE;
+ }
+ CFX_WideString opt_value = GetOptionValue(index);
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue == NULL) {
+ pValue = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pValue == NULL) {
+ return FALSE;
+ }
+ }
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetUnicodeText() == opt_value) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pValue->GetType() == PDFOBJ_NUMBER) {
+ if (pValue->GetString().IsEmpty()) {
+ return FALSE;
+ }
+ if (pValue->GetInteger() == index) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (pValue->GetType() != PDFOBJ_ARRAY) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pValue;
+ int iPos = -1;
+ for (int j = 0; j < CountSelectedOptions(); j ++) {
+ if (GetSelectedOptionIndex(j) == index) {
+ iPos = j;
+ break;
+ }
+ }
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
+ if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)i == iPos) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FormField::SetItemSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ CFX_WideString opt_value = GetOptionValue(index);
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ if (!bSelected) {
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pValue != NULL) {
+ if (m_Type == ListBox) {
+ SelectOption(index, FALSE);
+ if (pValue->GetType() == PDFOBJ_STRING) {
+ if (pValue->GetUnicodeText() == opt_value) {
+ m_pDict->RemoveAt("V");
+ }
+ } else if (pValue->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (i != index) {
+ if (IsItemSelected(i)) {
+ opt_value = GetOptionValue(i);
+ pArray->AddString(PDF_EncodeText(opt_value));
+ }
+ }
+ }
+ if (pArray->GetCount() < 1) {
+ pArray->Release();
+ } else {
+ m_pDict->SetAt("V", pArray);
+ }
+ }
+ } else if (m_Type == ComboBox) {
+ m_pDict->RemoveAt("V");
+ m_pDict->RemoveAt("I");
+ }
+ }
+ } else {
+ if (m_Type == ListBox) {
+ SelectOption(index, TRUE);
+ if (!(m_Flags & FORMLIST_MULTISELECT)) {
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
+ } else {
+ CPDF_Array* pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ FX_BOOL bSelected;
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (i != index) {
+ bSelected = IsItemSelected(i);
+ } else {
+ bSelected = TRUE;
+ }
+ if (bSelected) {
+ opt_value = GetOptionValue(i);
+ pArray->AddString(PDF_EncodeText(opt_value));
+ }
+ }
+ m_pDict->SetAt("V", pArray);
+ }
+ } else if (m_Type == ComboBox) {
+ m_pDict->SetAtString("V", PDF_EncodeText(opt_value, opt_value.GetLength()));
+ CPDF_Array* pI = CPDF_Array::Create();
+ if (pI == NULL) {
+ return FALSE;
+ }
+ pI->AddInteger(index);
+ m_pDict->SetAt("I", pI);
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ if (CPDF_InterForm::m_bUpdateAP) {
+ UpdateAP(NULL);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ if (index < 0 || index >= CountOptions()) {
+ return FALSE;
+ }
+ int iDVIndex = GetDefaultSelectedItem();
+ if (iDVIndex < 0) {
+ return FALSE;
+ }
+ return (iDVIndex == index);
+}
+int CPDF_FormField::GetDefaultSelectedItem()
+{
+ ASSERT(GetType() == ComboBox || GetType() == ListBox);
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
+ if (pValue == NULL) {
+ return -1;
+ }
+ CFX_WideString csDV = pValue->GetUnicodeText();
+ if (csDV.IsEmpty()) {
+ return -1;
+ }
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ if (csDV == GetOptionValue(i)) {
+ return i;
+ }
+ }
+ return -1;
+}
+void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)
+{
+ if (m_Type == PushButton) {
+ return;
+ }
+ if (m_Type == RadioButton || m_Type == CheckBox) {
+ return;
+ }
+ if (!m_pForm->m_bGenerateAP) {
+ return;
+ }
+ for (int i = 0; i < CountControls(); i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
+ }
+}
+int CPDF_FormField::CountOptions()
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
+ return 0;
+ }
+ return ((CPDF_Array*)pValue)->GetCount();
+}
+CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)
+{
+ CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
+ return CFX_WideString();
+ }
+ CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);
+ if (pOption == NULL) {
+ return CFX_WideString();
+ }
+ if (pOption->GetType() == PDFOBJ_ARRAY) {
+ pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);
+ }
+ if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {
+ return CFX_WideString();
+ }
+ return ((CPDF_String*)pOption)->GetUnicodeText();
+}
+CFX_WideString CPDF_FormField::GetOptionLabel(int index)
+{
+ return GetOptionText(index, 1);
+}
+CFX_WideString CPDF_FormField::GetOptionValue(int index)
+{
+ return GetOptionText(index, 0);
+}
+int CPDF_FormField::FindOption(CFX_WideString csOptLabel)
+{
+ int iCount = CountOptions();
+ for (int i = 0; i < iCount; i ++) {
+ CFX_WideString csValue = GetOptionValue(i);
+ if (csValue == csOptLabel) {
+ return i;
+ }
+ }
+ return -1;
+}
+int CPDF_FormField::FindOptionValue(FX_LPCWSTR csOptValue, int iStartIndex)
+{
+ if (iStartIndex < 0) {
+ iStartIndex = 0;
+ }
+ int iCount = CountOptions();
+ for (; iStartIndex < iCount; iStartIndex ++) {
+ CFX_WideString csValue = GetOptionValue(iStartIndex);
+ if (csValue == csOptValue) {
+ return iStartIndex;
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CPDF_FormControl* pControl = GetControl(iControlIndex);
+ if (pControl == NULL) {
+ return FALSE;
+ }
+ if (!bChecked && pControl->IsChecked() == bChecked) {
+ return FALSE;
+ }
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ CFX_WideString csWExport = pControl->GetExportValue();
+ CFX_ByteString csBExport = PDF_EncodeText(csWExport);
+ int iCount = CountControls();
+ FX_BOOL bUnison = PDF_FormField_IsUnison(this);
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pCtrl = GetControl(i);
+ if (bUnison) {
+ CFX_WideString csEValue = pCtrl->GetExportValue();
+ if (csEValue == csWExport) {
+ if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {
+ pCtrl->CheckControl(bChecked);
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ } else {
+ if (i == iControlIndex) {
+ pCtrl->CheckControl(bChecked);
+ } else if (bChecked) {
+ pCtrl->CheckControl(FALSE);
+ }
+ }
+ }
+ CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
+ if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {
+ if (bChecked) {
+ m_pDict->SetAtName("V", csBExport);
+ } else {
+ CFX_ByteString csV;
+ CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
+ if (pV != NULL) {
+ csV = pV->GetString();
+ }
+ if (csV == csBExport) {
+ m_pDict->SetAtName("V", "Off");
+ }
+ }
+ } else if (bChecked) {
+ CFX_ByteString csIndex;
+ csIndex.Format("%d", iControlIndex);
+ m_pDict->SetAtName("V", csIndex);
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CFX_WideString csExport = L"Off";
+ FX_BOOL bChecked;
+ int iCount = CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ if (bDefault) {
+ bChecked = pControl->IsDefaultChecked();
+ } else {
+ bChecked = pControl->IsChecked();
+ }
+ if (bChecked) {
+ csExport = pControl->GetExportValue();
+ break;
+ }
+ }
+ return csExport;
+}
+FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value, FX_BOOL bDefault, FX_BOOL bNotify)
+{
+ ASSERT(GetType() == CheckBox || GetType() == RadioButton);
+ CFX_ByteArray statusArray;
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ SaveCheckedFieldStatus(this, statusArray);
+ }
+ int iCount = CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = GetControl(i);
+ CFX_WideString csExport = pControl->GetExportValue();
+ if (csExport == value) {
+ if (bDefault) {
+ } else {
+ CheckControl(GetControlIndex(pControl), TRUE);
+ }
+ break;
+ } else {
+ if (bDefault) {
+ } else {
+ CheckControl(GetControlIndex(pControl), FALSE);
+ }
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+int CPDF_FormField::GetTopVisibleIndex()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
+ if (pObj == NULL) {
+ return 0;
+ }
+ return pObj->GetInteger();
+}
+int CPDF_FormField::CountSelectedOptions()
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return 0;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return 0;
+ }
+ return (int)pArray->GetCount();
+}
+int CPDF_FormField::GetSelectedOptionIndex(int index)
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return -1;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return -1;
+ }
+ int iCount = (int)pArray->GetCount();
+ if (iCount > 0 && index < iCount) {
+ return pArray->GetInteger(index);
+ }
+ return -1;
+}
+FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)
+{
+ CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
+ if (pObj == NULL) {
+ return FALSE;
+ }
+ CPDF_Array* pArray = pObj->GetArray();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ int iCount = (int)pArray->GetCount();
+ for (int i = 0; i < iCount; i ++) {
+ if (pArray->GetInteger(i) == iOptIndex) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ CPDF_Array* pArray = m_pDict->GetArray("I");
+ if (pArray == NULL) {
+ if (!bSelected) {
+ return TRUE;
+ }
+ pArray = CPDF_Array::Create();
+ if (pArray == NULL) {
+ return FALSE;
+ }
+ m_pDict->SetAt("I", pArray);
+ }
+ FX_BOOL bReturn = FALSE;
+ for (int i = 0; i < (int)pArray->GetCount(); i ++) {
+ int iFind = pArray->GetInteger(i);
+ if (iFind == iOptIndex) {
+ if (bSelected) {
+ return TRUE;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue = GetOptionLabel(iOptIndex);
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ pArray->RemoveAt(i);
+ bReturn = TRUE;
+ break;
+ } else if (iFind > iOptIndex) {
+ if (!bSelected) {
+ continue;
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue = GetOptionLabel(iOptIndex);
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);
+ if (pNum == NULL) {
+ return FALSE;
+ }
+ pArray->InsertAt(i, pNum);
+ bReturn = TRUE;
+ break;
+ }
+ }
+ if (!bReturn) {
+ if (bSelected) {
+ pArray->AddInteger(iOptIndex);
+ }
+ if (pArray->GetCount() == 0) {
+ m_pDict->RemoveAt("I");
+ }
+ }
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)
+{
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ int iRet = 0;
+ CFX_WideString csValue;
+ int iIndex = GetSelectedIndex(0);
+ if (iIndex >= 0) {
+ csValue = GetOptionLabel(iIndex);
+ }
+ if (GetType() == ListBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
+ }
+ if (GetType() == ComboBox) {
+ iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
+ }
+ if (iRet < 0) {
+ return FALSE;
+ }
+ }
+ m_pDict->RemoveAt("I");
+ if (bNotify && m_pForm->m_pFormNotify != NULL) {
+ if (GetType() == ListBox) {
+ m_pForm->m_pFormNotify->AfterSelectionChange(this);
+ }
+ if (GetType() == ComboBox) {
+ m_pForm->m_pFormNotify->AfterValueChange(this);
+ }
+ }
+ m_pForm->m_bUpdated = TRUE;
+ return TRUE;
+}
+void CPDF_FormField::LoadDA()
+{
+ CFX_ByteString DA = FPDF_GetFieldAttr(m_pDict, "DA")->GetString();
+ if (DA.IsEmpty()) {
+ DA = m_pForm->m_pFormDict->GetString("DA");
+ }
+ if (DA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(DA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString font_name = syntax.GetWord();
+ CPDF_Dictionary* pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(font_name);
+ if (pFontDict == NULL) {
+ return;
+ }
+ m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
+ m_FontSize = FX_atof(syntax.GetWord());
+}
diff --git a/core/src/fpdfdoc/doc_link.cpp b/core/src/fpdfdoc/doc_link.cpp
new file mode 100644
index 0000000000..4c8fda7a34
--- /dev/null
+++ b/core/src/fpdfdoc/doc_link.cpp
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_LinkList::~CPDF_LinkList()
+{
+ FX_POSITION pos = m_PageMap.GetStartPosition();
+ while (pos) {
+ FX_LPVOID key, value;
+ m_PageMap.GetNextAssoc(pos, key, value);
+ delete (CFX_PtrArray*)value;
+ }
+}
+CFX_PtrArray* CPDF_LinkList::GetPageLinks(CPDF_Page* pPage)
+{
+ FX_DWORD objnum = pPage->m_pFormDict->GetObjNum();
+ if (objnum == 0) {
+ return NULL;
+ }
+ CFX_PtrArray* pPageLinkList = NULL;
+ if (!m_PageMap.Lookup((FX_LPVOID)(FX_UINTPTR)objnum, (FX_LPVOID&)pPageLinkList)) {
+ pPageLinkList = FX_NEW CFX_PtrArray;
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ m_PageMap.SetAt((FX_LPVOID)(FX_UINTPTR)objnum, pPageLinkList);
+ LoadPageLinks(pPage, pPageLinkList);
+ }
+ return pPageLinkList;
+}
+int CPDF_LinkList::CountLinks(CPDF_Page* pPage)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return 0;
+ }
+ return pPageLinkList->GetSize();
+}
+CPDF_Link CPDF_LinkList::GetLink(CPDF_Page* pPage, int index)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ return (CPDF_Dictionary*)pPageLinkList->GetAt(index);
+}
+CPDF_Link CPDF_LinkList::GetLinkAtPoint(CPDF_Page* pPage, FX_FLOAT pdf_x, FX_FLOAT pdf_y)
+{
+ CFX_PtrArray* pPageLinkList = GetPageLinks(pPage);
+ if (pPageLinkList == NULL) {
+ return NULL;
+ }
+ int size = pPageLinkList->GetSize();
+ for (int i = 0; i < size; i ++) {
+ CPDF_Link Link = (CPDF_Dictionary*)pPageLinkList->GetAt(i);
+ CPDF_Rect rect = Link.GetRect();
+ if (rect.Contains(pdf_x, pdf_y)) {
+ return Link;
+ }
+ }
+ return NULL;
+}
+void CPDF_LinkList::LoadPageLinks(CPDF_Page* pPage, CFX_PtrArray* pList)
+{
+ CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArray("Annots");
+ if (pAnnotList == NULL) {
+ return;
+ }
+ for (FX_DWORD i = 0; i < pAnnotList->GetCount(); i ++) {
+ CPDF_Dictionary* pAnnot = pAnnotList->GetDict(i);
+ if (pAnnot == NULL) {
+ continue;
+ }
+ if (pAnnot->GetString("Subtype") != "Link") {
+ continue;
+ }
+ pList->Add(pAnnot);
+ }
+}
+CPDF_Rect CPDF_Link::GetRect()
+{
+ return m_pDict->GetRect("Rect");
+}
+CPDF_Dest CPDF_Link::GetDest(CPDF_Document* pDoc)
+{
+ CPDF_Object* pDest = m_pDict->GetElementValue("Dest");
+ if (pDest == NULL) {
+ return NULL;
+ }
+ if (pDest->GetType() == PDFOBJ_STRING || pDest->GetType() == PDFOBJ_NAME) {
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ CFX_ByteStringC name = pDest->GetString();
+ return name_tree.LookupNamedDest(pDoc, name);
+ } else if (pDest->GetType() == PDFOBJ_ARRAY) {
+ return (CPDF_Array*)pDest;
+ }
+ return NULL;
+}
+CPDF_Action CPDF_Link::GetAction()
+{
+ return m_pDict->GetDict("A");
+}
diff --git a/core/src/fpdfdoc/doc_metadata.cpp b/core/src/fpdfdoc/doc_metadata.cpp
new file mode 100644
index 0000000000..e3ac9e3779
--- /dev/null
+++ b/core/src/fpdfdoc/doc_metadata.cpp
@@ -0,0 +1,152 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fxcrt/fx_xml.h"
+typedef struct _PDFDOC_METADATA {
+ CPDF_Document *m_pDoc;
+ CXML_Element *m_pXmlElmnt;
+ CXML_Element *m_pElmntRdf;
+ CFX_CMapByteStringToPtr *m_pStringMap;
+} PDFDOC_METADATA, * PDFDOC_LPMETADATA;
+typedef PDFDOC_METADATA const * PDFDOC_LPCMETADATA;
+const FX_LPCSTR gs_FPDFDOC_Metadata_Titles[] = {
+ "Title", "title",
+ "Subject", "description",
+ "Author", "creator",
+ "Keywords", "Keywords",
+ "Producer", "Producer",
+ "Creator", "CreatorTool",
+ "CreationDate", "CreateDate",
+ "ModDate", "ModifyDate",
+ "MetadataDate", "MetadataDate"
+};
+CPDF_Metadata::CPDF_Metadata()
+{
+ m_pData = FX_Alloc(PDFDOC_METADATA, 1);
+ FXSYS_memset32(m_pData, 0, sizeof(PDFDOC_METADATA));
+ CFX_CMapByteStringToPtr *&pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
+ pStringMap = FX_NEW(CFX_CMapByteStringToPtr);
+ if (pStringMap != NULL) {
+ CFX_ByteString bstr;
+ for (int i = 0; i < 18; i += 2) {
+ bstr = gs_FPDFDOC_Metadata_Titles[i];
+ pStringMap->AddValue(bstr, (void*)gs_FPDFDOC_Metadata_Titles[i + 1]);
+ }
+ }
+}
+CPDF_Metadata::~CPDF_Metadata()
+{
+ FXSYS_assert(m_pData != NULL);
+ CXML_Element *&p = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+ if (p) {
+ delete p;
+ }
+ CFX_CMapByteStringToPtr *pStringMap = ((PDFDOC_LPMETADATA)m_pData)->m_pStringMap;
+ if (pStringMap) {
+ pStringMap->RemoveAll();
+ FX_Free(pStringMap);
+ }
+ FX_Free(m_pData);
+}
+void CPDF_Metadata::LoadDoc(CPDF_Document *pDoc)
+{
+ FXSYS_assert(pDoc != NULL);
+ ((PDFDOC_LPMETADATA)m_pData)->m_pDoc = pDoc;
+ CPDF_Dictionary *pRoot = pDoc->GetRoot();
+ CPDF_Stream *pStream = pRoot->GetStream(FX_BSTRC("Metadata"));
+ if (!pStream) {
+ return;
+ }
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pStream, FALSE);
+ int size = acc.GetSize();
+ FX_LPCBYTE pBuf = acc.GetData();
+ CXML_Element *&pXmlElmnt = ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+ pXmlElmnt = CXML_Element::Parse(pBuf, size);
+ if (!pXmlElmnt) {
+ return;
+ }
+ CXML_Element *&pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+ if (pXmlElmnt->GetTagName() == FX_BSTRC("RDF")) {
+ pElmntRdf = pXmlElmnt;
+ } else {
+ pElmntRdf = pXmlElmnt->GetElement(NULL, FX_BSTRC("RDF"));
+ }
+}
+FX_INT32 CPDF_Metadata::GetString(FX_BSTR bsItem, CFX_WideString &wsStr)
+{
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt) {
+ return -1;
+ }
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap) {
+ return -1;
+ }
+ void *szTag;
+ if (!((PDFDOC_LPMETADATA)m_pData)->m_pStringMap->Lookup(bsItem, szTag)) {
+ return -1;
+ }
+ CFX_ByteString bsTag = (FX_LPCSTR)szTag;
+ wsStr = L"";
+ CXML_Element *pElmntRdf = ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+ if (!pElmntRdf) {
+ return -1;
+ }
+ int nChild = pElmntRdf->CountChildren();
+ for (int i = 0; i < nChild; i++) {
+ CXML_Element *pTag = pElmntRdf->GetElement(NULL, FX_BSTRC("Description"), i);
+ if (!pTag) {
+ continue;
+ }
+ if (bsItem == FX_BSTRC("Title") || bsItem == FX_BSTRC("Subject")) {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Alt"));
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ } else if (bsItem == FX_BSTRC("Author")) {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("Seq"));
+ if (!pElmnt) {
+ continue;
+ }
+ pElmnt = pElmnt->GetElement(NULL, FX_BSTRC("li"));
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ } else {
+ CXML_Element *pElmnt = pTag->GetElement(NULL, bsTag);
+ if (!pElmnt) {
+ continue;
+ }
+ wsStr = pElmnt->GetContent(0);
+ return wsStr.GetLength();
+ }
+ }
+ return -1;
+}
+CXML_Element* CPDF_Metadata::GetRoot() const
+{
+ return ((PDFDOC_LPMETADATA)m_pData)->m_pXmlElmnt;
+}
+CXML_Element* CPDF_Metadata::GetRDF() const
+{
+ return ((PDFDOC_LPMETADATA)m_pData)->m_pElmntRdf;
+}
diff --git a/core/src/fpdfdoc/doc_ocg.cpp b/core/src/fpdfdoc/doc_ocg.cpp
new file mode 100644
index 0000000000..39b8e37521
--- /dev/null
+++ b/core/src/fpdfdoc/doc_ocg.cpp
@@ -0,0 +1,300 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+static FX_INT32 FPDFDOC_OCG_FindGroup(const CPDF_Object *pObject, const CPDF_Dictionary *pGroupDict)
+{
+ if (pObject == NULL || pGroupDict == NULL) {
+ return -1;
+ }
+ FX_INT32 iType = pObject->GetType();
+ if (iType == PDFOBJ_ARRAY) {
+ FX_DWORD dwCount = ((CPDF_Array*)pObject)->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i++) {
+ if (((CPDF_Array*)pObject)->GetDict(i) == pGroupDict) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ if (pObject->GetDict() == pGroupDict) {
+ return 0;
+ }
+ return -1;
+}
+static FX_BOOL FPDFDOC_OCG_HasIntent(const CPDF_Dictionary *pDict, FX_BSTR csElement, FX_BSTR csDef = FX_BSTRC(""))
+{
+ FXSYS_assert(pDict != NULL);
+ CPDF_Object *pIntent = pDict->GetElementValue(FX_BSTRC("Intent"));
+ if (pIntent == NULL) {
+ return csElement == csDef;
+ }
+ CFX_ByteString bsIntent;
+ if (pIntent->GetType() == PDFOBJ_ARRAY) {
+ FX_DWORD dwCount = ((CPDF_Array*)pIntent)->GetCount();
+ for (FX_DWORD i = 0; i < dwCount; i++) {
+ bsIntent = ((CPDF_Array*)pIntent)->GetString(i);
+ if (bsIntent == FX_BSTRC("All") || bsIntent == csElement) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ bsIntent = pIntent->GetString();
+ return bsIntent == FX_BSTRC("All") || bsIntent == csElement;
+}
+static CPDF_Dictionary* FPDFDOC_OCG_GetConfig(CPDF_Document *pDoc, const CPDF_Dictionary *pOCGDict, FX_BSTR bsState)
+{
+ FXSYS_assert(pDoc && pOCGDict);
+ CPDF_Dictionary *pOCProperties = pDoc->GetRoot()->GetDict(FX_BSTRC("OCProperties"));
+ if (!pOCProperties) {
+ return NULL;
+ }
+ CPDF_Array *pOCGs = pOCProperties->GetArray(FX_BSTRC("OCGs"));
+ if (!pOCGs) {
+ return NULL;
+ }
+ if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
+ return NULL;
+ }
+ CPDF_Dictionary *pConfig = pOCProperties->GetDict(FX_BSTRC("D"));
+ CPDF_Array *pConfigs = pOCProperties->GetArray(FX_BSTRC("Configs"));
+ if (pConfigs) {
+ CPDF_Dictionary *pFind;
+ FX_INT32 iCount = pConfigs->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ pFind = pConfigs->GetDict(i);
+ if (!pFind) {
+ continue;
+ }
+ if (!FPDFDOC_OCG_HasIntent(pFind, FX_BSTRC("View"), FX_BSTRC("View"))) {
+ continue;
+ }
+ pConfig = pFind;
+ break;
+ }
+ }
+ return pConfig;
+}
+static CFX_ByteString FPDFDOC_OCG_GetUsageTypeString(CPDF_OCContext::UsageType eType)
+{
+ CFX_ByteString csState = FX_BSTRC("View");
+ if (eType == CPDF_OCContext::Design) {
+ csState = FX_BSTRC("Design");
+ } else if (eType == CPDF_OCContext::Print) {
+ csState = FX_BSTRC("Print");
+ } else if (eType == CPDF_OCContext::Export) {
+ csState = FX_BSTRC("Export");
+ }
+ return csState;
+}
+CPDF_OCContext::CPDF_OCContext(CPDF_Document *pDoc, UsageType eUsageType)
+{
+ FXSYS_assert(pDoc != NULL);
+ m_pDocument = pDoc;
+ m_eUsageType = eUsageType;
+}
+CPDF_OCContext::~CPDF_OCContext()
+{
+ m_OCGStates.RemoveAll();
+}
+FX_BOOL CPDF_OCContext::LoadOCGStateFromConfig(FX_BSTR csConfig, const CPDF_Dictionary *pOCGDict, FX_BOOL &bValidConfig) const
+{
+ CPDF_Dictionary *pConfig = FPDFDOC_OCG_GetConfig(m_pDocument, pOCGDict, csConfig);
+ if (!pConfig) {
+ return TRUE;
+ }
+ bValidConfig = TRUE;
+ FX_BOOL bState = pConfig->GetString(FX_BSTRC("BaseState"), FX_BSTRC("ON")) != FX_BSTRC("OFF");
+ CPDF_Array *pArray = pConfig->GetArray(FX_BSTRC("ON"));
+ if (pArray) {
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
+ bState = TRUE;
+ }
+ }
+ pArray = pConfig->GetArray(FX_BSTRC("OFF"));
+ if (pArray) {
+ if (FPDFDOC_OCG_FindGroup(pArray, pOCGDict) >= 0) {
+ bState = FALSE;
+ }
+ }
+ pArray = pConfig->GetArray(FX_BSTRC("AS"));
+ if (pArray) {
+ CFX_ByteString csFind = csConfig + FX_BSTRC("State");
+ FX_INT32 iCount = pArray->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ CPDF_Dictionary *pUsage = pArray->GetDict(i);
+ if (!pUsage) {
+ continue;
+ }
+ if (pUsage->GetString(FX_BSTRC("Event"), FX_BSTRC("View")) != csConfig) {
+ continue;
+ }
+ CPDF_Array *pOCGs = pUsage->GetArray(FX_BSTRC("OCGs"));
+ if (!pOCGs) {
+ continue;
+ }
+ if (FPDFDOC_OCG_FindGroup(pOCGs, pOCGDict) < 0) {
+ continue;
+ }
+ CPDF_Dictionary *pState = pUsage->GetDict(csConfig);
+ if (!pState) {
+ continue;
+ }
+ bState = pState->GetString(csFind) != FX_BSTRC("OFF");
+ }
+ }
+ return bState;
+}
+FX_BOOL CPDF_OCContext::LoadOCGState(const CPDF_Dictionary *pOCGDict) const
+{
+ if (!FPDFDOC_OCG_HasIntent(pOCGDict, FX_BSTRC("View"), FX_BSTRC("View"))) {
+ return TRUE;
+ }
+ CFX_ByteString csState = FPDFDOC_OCG_GetUsageTypeString(m_eUsageType);
+ CPDF_Dictionary *pUsage = pOCGDict->GetDict(FX_BSTRC("Usage"));
+ if (pUsage) {
+ CPDF_Dictionary *pState = pUsage->GetDict(csState);
+ if (pState) {
+ CFX_ByteString csFind = csState + FX_BSTRC("State");
+ if (pState->KeyExist(csFind)) {
+ return pState->GetString(csFind) != FX_BSTRC("OFF");
+ }
+ }
+ if (csState != FX_BSTRC("View")) {
+ pState = pUsage->GetDict(FX_BSTRC("View"));
+ if (pState && pState->KeyExist(FX_BSTRC("ViewState"))) {
+ return pState->GetString(FX_BSTRC("ViewState")) != FX_BSTRC("OFF");
+ }
+ }
+ }
+ FX_BOOL bDefValid = FALSE;
+ return LoadOCGStateFromConfig(csState, pOCGDict, bDefValid);
+}
+FX_BOOL CPDF_OCContext::GetOCGVisible(const CPDF_Dictionary *pOCGDict)
+{
+ if (!pOCGDict) {
+ return FALSE;
+ }
+ FX_LPVOID bState = NULL;
+ if (m_OCGStates.Lookup(pOCGDict, bState)) {
+ return (FX_UINTPTR)bState != 0;
+ }
+ bState = (FX_LPVOID)(FX_UINTPTR)LoadOCGState(pOCGDict);
+ m_OCGStates.SetAt(pOCGDict, bState);
+ return (FX_UINTPTR)bState != 0;
+}
+FX_BOOL CPDF_OCContext::GetOCGVE(CPDF_Array *pExpression, FX_BOOL bFromConfig, int nLevel)
+{
+ if (nLevel > 32) {
+ return FALSE;
+ }
+ if (pExpression == NULL) {
+ return FALSE;
+ }
+ FX_INT32 iCount = pExpression->GetCount();
+ CPDF_Object *pOCGObj;
+ CFX_ByteString csOperator = pExpression->GetString(0);
+ if (csOperator == FX_BSTRC("Not")) {
+ pOCGObj = pExpression->GetElementValue(1);
+ if (pOCGObj == NULL) {
+ return FALSE;
+ }
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ return !(bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj));
+ } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
+ return !GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
+ } else {
+ return FALSE;
+ }
+ }
+ if (csOperator == FX_BSTRC("Or") || csOperator == FX_BSTRC("And")) {
+ FX_BOOL bValue = FALSE;
+ for (FX_INT32 i = 1; i < iCount; i ++) {
+ pOCGObj = pExpression->GetElementValue(1);
+ if (pOCGObj == NULL) {
+ continue;
+ }
+ FX_BOOL bItem = FALSE;
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ bItem = bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ } else if (pOCGObj->GetType() == PDFOBJ_ARRAY) {
+ bItem = GetOCGVE((CPDF_Array*)pOCGObj, bFromConfig, nLevel + 1);
+ }
+ if (i == 1) {
+ bValue = bItem;
+ } else {
+ if (csOperator == FX_BSTRC("Or")) {
+ bValue = bValue || bItem;
+ } else {
+ bValue = bValue && bItem;
+ }
+ }
+ }
+ return bValue;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary *pOCMDDict, FX_BOOL bFromConfig)
+{
+ FXSYS_assert(pOCMDDict != NULL);
+ CPDF_Array *pVE = pOCMDDict->GetArray(FX_BSTRC("VE"));
+ if (pVE != NULL) {
+ return GetOCGVE(pVE, bFromConfig);
+ }
+ CFX_ByteString csP = pOCMDDict->GetString(FX_BSTRC("P"), FX_BSTRC("AnyOn"));
+ CPDF_Object *pOCGObj = pOCMDDict->GetElementValue(FX_BSTRC("OCGs"));
+ if (pOCGObj == NULL) {
+ return TRUE;
+ }
+ if (pOCGObj->GetType() == PDFOBJ_DICTIONARY) {
+ return bFromConfig ? LoadOCGState((CPDF_Dictionary*)pOCGObj) : GetOCGVisible((CPDF_Dictionary*)pOCGObj);
+ }
+ if (pOCGObj->GetType() != PDFOBJ_ARRAY) {
+ return TRUE;
+ }
+ FX_BOOL bState = FALSE;
+ if (csP == FX_BSTRC("AllOn") || csP == FX_BSTRC("AllOff")) {
+ bState = TRUE;
+ }
+ FX_INT32 iCount = ((CPDF_Array*)pOCGObj)->GetCount();
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ FX_BOOL bItem = TRUE;
+ CPDF_Dictionary* pItemDict = ((CPDF_Array*)pOCGObj)->GetDict(i);
+ if (pItemDict) {
+ bItem = bFromConfig ? LoadOCGState(pItemDict) : GetOCGVisible(pItemDict);
+ }
+ if (csP == FX_BSTRC("AnyOn") && bItem) {
+ return TRUE;
+ }
+ if (csP == FX_BSTRC("AnyOff") && !bItem) {
+ return TRUE;
+ }
+ if (csP == FX_BSTRC("AllOn") && !bItem) {
+ return FALSE;
+ }
+ if (csP == FX_BSTRC("AllOff") && bItem) {
+ return FALSE;
+ }
+ }
+ return bState;
+}
+FX_BOOL CPDF_OCContext::CheckOCGVisible(const CPDF_Dictionary *pOCGDict)
+{
+ if (pOCGDict == NULL) {
+ return TRUE;
+ }
+ CFX_ByteString csType = pOCGDict->GetString(FX_BSTRC("Type"), FX_BSTRC("OCG"));
+ if (csType == FX_BSTRC("OCG")) {
+ return GetOCGVisible(pOCGDict);
+ } else {
+ return LoadOCMDState(pOCGDict, FALSE);
+ }
+}
+void CPDF_OCContext::ResetOCContext()
+{
+ m_OCGStates.RemoveAll();
+}
diff --git a/core/src/fpdfdoc/doc_tagged.cpp b/core/src/fpdfdoc/doc_tagged.cpp
new file mode 100644
index 0000000000..95ae8d581e
--- /dev/null
+++ b/core/src/fpdfdoc/doc_tagged.cpp
@@ -0,0 +1,448 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_parser.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfdoc/fpdf_tagged.h"
+#include "tagged_int.h"
+const int nMaxRecursion = 32;
+static FX_BOOL IsTagged(const CPDF_Document* pDoc)
+{
+ CPDF_Dictionary* pCatalog = pDoc->GetRoot();
+ CPDF_Dictionary* pMarkInfo = pCatalog->GetDict(FX_BSTRC("MarkInfo"));
+ return pMarkInfo != NULL && pMarkInfo->GetInteger(FX_BSTRC("Marked"));
+}
+CPDF_StructTree* CPDF_StructTree::LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict)
+{
+ if (!IsTagged(pDoc)) {
+ return NULL;
+ }
+ CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
+ if (pTree == NULL) {
+ return NULL;
+ }
+ pTree->LoadPageTree(pPageDict);
+ return pTree;
+}
+CPDF_StructTree* CPDF_StructTree::LoadDoc(const CPDF_Document* pDoc)
+{
+ if (!IsTagged(pDoc)) {
+ return NULL;
+ }
+ CPDF_StructTreeImpl* pTree = FX_NEW CPDF_StructTreeImpl(pDoc);
+ if (pTree == NULL) {
+ return NULL;
+ }
+ pTree->LoadDocTree();
+ return pTree;
+}
+CPDF_StructTreeImpl::CPDF_StructTreeImpl(const CPDF_Document* pDoc)
+{
+ CPDF_Dictionary* pCatalog = pDoc->GetRoot();
+ m_pTreeRoot = pCatalog->GetDict(FX_BSTRC("StructTreeRoot"));
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ m_pRoleMap = m_pTreeRoot->GetDict(FX_BSTRC("RoleMap"));
+}
+CPDF_StructTreeImpl::~CPDF_StructTreeImpl()
+{
+ for (int i = 0; i < m_Kids.GetSize(); i ++)
+ if (m_Kids[i]) {
+ m_Kids[i]->Release();
+ }
+}
+void CPDF_StructTreeImpl::LoadDocTree()
+{
+ m_pPage = NULL;
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, (CPDF_Dictionary*)pKids);
+ if (pStructElementImpl == NULL) {
+ return;
+ }
+ m_Kids.Add(pStructElementImpl);
+ return;
+ }
+ if (pKids->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pKids;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Dictionary* pKid = pArray->GetDict(i);
+ CPDF_StructElementImpl* pStructElementImpl = FX_NEW CPDF_StructElementImpl(this, NULL, pKid);
+ if (pStructElementImpl == NULL) {
+ return;
+ }
+ m_Kids.Add(pStructElementImpl);
+ }
+}
+void CPDF_StructTreeImpl::LoadPageTree(const CPDF_Dictionary* pPageDict)
+{
+ m_pPage = pPageDict;
+ if (m_pTreeRoot == NULL) {
+ return;
+ }
+ CPDF_Object* pKids = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ FX_DWORD dwKids = 0;
+ if (pKids->GetType() == PDFOBJ_DICTIONARY) {
+ dwKids = 1;
+ } else if (pKids->GetType() == PDFOBJ_ARRAY) {
+ dwKids = ((CPDF_Array*)pKids)->GetCount();
+ } else {
+ return;
+ }
+ FX_DWORD i;
+ m_Kids.SetSize(dwKids);
+ for (i = 0; i < dwKids; i ++) {
+ m_Kids[i] = NULL;
+ }
+ CFX_MapPtrToPtr element_map;
+ CPDF_Dictionary* pParentTree = m_pTreeRoot->GetDict(FX_BSTRC("ParentTree"));
+ if (pParentTree == NULL) {
+ return;
+ }
+ CPDF_NumberTree parent_tree(pParentTree);
+ int parents_id = pPageDict->GetInteger(FX_BSTRC("StructParents"), -1);
+ if (parents_id >= 0) {
+ CPDF_Object* pParents = parent_tree.LookupValue(parents_id);
+ if (pParents == NULL || pParents->GetType() != PDFOBJ_ARRAY) {
+ return;
+ }
+ CPDF_Array* pParentArray = (CPDF_Array*)pParents;
+ for (i = 0; i < pParentArray->GetCount(); i ++) {
+ CPDF_Dictionary* pParent = pParentArray->GetDict(i);
+ if (pParent == NULL) {
+ continue;
+ }
+ AddPageNode(pParent, element_map);
+ }
+ }
+}
+CPDF_StructElementImpl* CPDF_StructTreeImpl::AddPageNode(CPDF_Dictionary* pDict, CFX_MapPtrToPtr& map, int nLevel)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ CPDF_StructElementImpl* pElement = NULL;
+ if (map.Lookup(pDict, (FX_LPVOID&)pElement)) {
+ return pElement;
+ }
+ pElement = FX_NEW CPDF_StructElementImpl(this, NULL, pDict);
+ if (pElement == NULL) {
+ return NULL;
+ }
+ map.SetAt(pDict, pElement);
+ CPDF_Dictionary* pParent = pDict->GetDict(FX_BSTRC("P"));
+ if (pParent == NULL || pParent->GetString(FX_BSTRC("Type")) == FX_BSTRC("StructTreeRoot")) {
+ if (!AddTopLevelNode(pDict, pElement)) {
+ pElement->Release();
+ map.RemoveKey(pDict);
+ }
+ } else {
+ CPDF_StructElementImpl* pParentElement = AddPageNode(pParent, map, nLevel + 1);
+ FX_BOOL bSave = FALSE;
+ for (int i = 0; i < pParentElement->m_Kids.GetSize(); i ++) {
+ if (pParentElement->m_Kids[i].m_Type != CPDF_StructKid::Element) {
+ continue;
+ }
+ if (pParentElement->m_Kids[i].m_Element.m_pDict != pDict) {
+ continue;
+ }
+ pParentElement->m_Kids[i].m_Element.m_pElement = pElement->Retain();
+ bSave = TRUE;
+ }
+ if (!bSave) {
+ pElement->Release();
+ map.RemoveKey(pDict);
+ }
+ }
+ return pElement;
+}
+FX_BOOL CPDF_StructTreeImpl::AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement)
+{
+ CPDF_Object *pObj = m_pTreeRoot->GetElementValue(FX_BSTRC("K"));
+ if (!pObj) {
+ return FALSE;
+ }
+ if (pObj->GetType() == PDFOBJ_DICTIONARY) {
+ if (pObj->GetObjNum() == pDict->GetObjNum()) {
+ if (m_Kids[0]) {
+ m_Kids[0]->Release();
+ }
+ m_Kids[0] = pElement->Retain();
+ } else {
+ return FALSE;
+ }
+ }
+ if (pObj->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pTopKids = (CPDF_Array*)pObj;
+ FX_DWORD i;
+ FX_BOOL bSave = FALSE;
+ for (i = 0; i < pTopKids->GetCount(); i ++) {
+ CPDF_Reference* pKidRef = (CPDF_Reference*)pTopKids->GetElement(i);
+ if (pKidRef->GetType() != PDFOBJ_REFERENCE || pKidRef->GetRefObjNum() != pDict->GetObjNum()) {
+ continue;
+ }
+ if (m_Kids[i]) {
+ m_Kids[i]->Release();
+ }
+ m_Kids[i] = pElement->Retain();
+ bSave = TRUE;
+ }
+ if (!bSave) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+CPDF_StructElementImpl::CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict)
+ : m_RefCount(0)
+{
+ m_pTree = pTree;
+ m_pDict = pDict;
+ m_Type = pDict->GetString(FX_BSTRC("S"));
+ CFX_ByteString mapped = pTree->m_pRoleMap->GetString(m_Type);
+ if (!mapped.IsEmpty()) {
+ m_Type = mapped;
+ }
+ m_pParent = pParent;
+ LoadKids(pDict);
+}
+CPDF_StructElementImpl::~CPDF_StructElementImpl()
+{
+ for (int i = 0; i < m_Kids.GetSize(); i ++) {
+ if (m_Kids[i].m_Type == CPDF_StructKid::Element && m_Kids[i].m_Element.m_pElement) {
+ ((CPDF_StructElementImpl*)m_Kids[i].m_Element.m_pElement)->Release();
+ }
+ }
+}
+CPDF_StructElementImpl* CPDF_StructElementImpl::Retain()
+{
+ m_RefCount++;
+ return this;
+}
+void CPDF_StructElementImpl::Release()
+{
+ if(--m_RefCount < 1) {
+ delete this;
+ }
+}
+void CPDF_StructElementImpl::LoadKids(CPDF_Dictionary* pDict)
+{
+ CPDF_Object* pObj = pDict->GetElement(FX_BSTRC("Pg"));
+ FX_DWORD PageObjNum = 0;
+ if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
+ PageObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
+ }
+ CPDF_Object* pKids = pDict->GetElementValue(FX_BSTRC("K"));
+ if (pKids == NULL) {
+ return;
+ }
+ if (pKids->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pKids;
+ m_Kids.SetSize(pArray->GetCount());
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pKid = pArray->GetElementValue(i);
+ LoadKid(PageObjNum, pKid, &m_Kids[i]);
+ }
+ } else {
+ m_Kids.SetSize(1);
+ LoadKid(PageObjNum, pKids, &m_Kids[0]);
+ }
+}
+void CPDF_StructElementImpl::LoadKid(FX_DWORD PageObjNum, CPDF_Object* pKidObj, CPDF_StructKid* pKid)
+{
+ pKid->m_Type = CPDF_StructKid::Invalid;
+ if (pKidObj == NULL) {
+ return;
+ }
+ if (pKidObj->GetType() == PDFOBJ_NUMBER) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::PageContent;
+ pKid->m_PageContent.m_ContentId = pKidObj->GetInteger();
+ pKid->m_PageContent.m_PageObjNum = PageObjNum;
+ return;
+ }
+ if (pKidObj->GetType() != PDFOBJ_DICTIONARY) {
+ return;
+ }
+ CPDF_Dictionary* pKidDict = (CPDF_Dictionary*)pKidObj;
+ CPDF_Object* pPageObj = pKidDict->GetElement(FX_BSTRC("Pg"));
+ if (pPageObj && pPageObj->GetType() == PDFOBJ_REFERENCE) {
+ PageObjNum = ((CPDF_Reference*)pPageObj)->GetRefObjNum();
+ }
+ CFX_ByteString type = pKidDict->GetString(FX_BSTRC("Type"));
+ if (type == FX_BSTRC("MCR")) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::StreamContent;
+ CPDF_Object* pStreamObj = pKidDict->GetElement(FX_BSTRC("Stm"));
+ if (pStreamObj && pStreamObj->GetType() == PDFOBJ_REFERENCE) {
+ pKid->m_StreamContent.m_RefObjNum = ((CPDF_Reference*)pStreamObj)->GetRefObjNum();
+ } else {
+ pKid->m_StreamContent.m_RefObjNum = 0;
+ }
+ pKid->m_StreamContent.m_PageObjNum = PageObjNum;
+ pKid->m_StreamContent.m_ContentId = pKidDict->GetInteger(FX_BSTRC("MCID"));
+ } else if (type == FX_BSTRC("OBJR")) {
+ if (m_pTree->m_pPage && m_pTree->m_pPage->GetObjNum() != PageObjNum) {
+ return;
+ }
+ pKid->m_Type = CPDF_StructKid::Object;
+ CPDF_Object* pObj = pKidDict->GetElement(FX_BSTRC("Obj"));
+ if (pObj && pObj->GetType() == PDFOBJ_REFERENCE) {
+ pKid->m_Object.m_RefObjNum = ((CPDF_Reference*)pObj)->GetRefObjNum();
+ } else {
+ pKid->m_Object.m_RefObjNum = 0;
+ }
+ pKid->m_Object.m_PageObjNum = PageObjNum;
+ } else {
+ pKid->m_Type = CPDF_StructKid::Element;
+ pKid->m_Element.m_pDict = pKidDict;
+ if (m_pTree->m_pPage == NULL) {
+ pKid->m_Element.m_pElement = FX_NEW CPDF_StructElementImpl(m_pTree, this, pKidDict);
+ } else {
+ pKid->m_Element.m_pElement = NULL;
+ }
+ }
+}
+static CPDF_Dictionary* FindAttrDict(CPDF_Object* pAttrs, FX_BSTR owner, FX_FLOAT nLevel = 0.0F)
+{
+ if (nLevel > nMaxRecursion) {
+ return NULL;
+ }
+ if (pAttrs == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDict = NULL;
+ if (pAttrs->GetType() == PDFOBJ_DICTIONARY) {
+ pDict = (CPDF_Dictionary*)pAttrs;
+ } else if (pAttrs->GetType() == PDFOBJ_STREAM) {
+ pDict = ((CPDF_Stream*)pAttrs)->GetDict();
+ } else if (pAttrs->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pAttrs;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ pDict = FindAttrDict(pElement, owner, nLevel + 1);
+ if (pDict) {
+ return pDict;
+ }
+ }
+ }
+ if (pDict && pDict->GetString(FX_BSTRC("O")) == owner) {
+ return pDict;
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, FX_FLOAT fLevel)
+{
+ if (fLevel > nMaxRecursion) {
+ return NULL;
+ }
+ if (bInheritable) {
+ CPDF_Object* pAttr = GetAttr(owner, name, FALSE);
+ if (pAttr) {
+ return pAttr;
+ }
+ if (m_pParent == NULL) {
+ return NULL;
+ }
+ return m_pParent->GetAttr(owner, name, TRUE, fLevel + 1);
+ }
+ CPDF_Object* pA = m_pDict->GetElementValue(FX_BSTRC("A"));
+ if (pA) {
+ CPDF_Dictionary* pAttrDict = FindAttrDict(pA, owner);
+ if (pAttrDict) {
+ CPDF_Object* pAttr = pAttrDict->GetElementValue(name);
+ if (pAttr) {
+ return pAttr;
+ }
+ }
+ }
+ CPDF_Object* pC = m_pDict->GetElementValue(FX_BSTRC("C"));
+ if (pC == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pClassMap = m_pTree->m_pTreeRoot->GetDict(FX_BSTRC("ClassMap"));
+ if (pClassMap == NULL) {
+ return NULL;
+ }
+ if (pC->GetType() == PDFOBJ_ARRAY) {
+ CPDF_Array* pArray = (CPDF_Array*)pC;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) {
+ CFX_ByteString class_name = pArray->GetString(i);
+ CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
+ if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
+ return pClassDict->GetElementValue(name);
+ }
+ }
+ return NULL;
+ }
+ CFX_ByteString class_name = pC->GetString();
+ CPDF_Dictionary* pClassDict = pClassMap->GetDict(class_name);
+ if (pClassDict && pClassDict->GetString(FX_BSTRC("O")) == owner) {
+ return pClassDict->GetElementValue(name);
+ }
+ return NULL;
+}
+CPDF_Object* CPDF_StructElementImpl::GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable);
+ if (pAttr == NULL || subindex == -1 || pAttr->GetType() != PDFOBJ_ARRAY) {
+ return pAttr;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pAttr;
+ if (subindex >= (int)pArray->GetCount()) {
+ return pAttr;
+ }
+ return pArray->GetElementValue(subindex);
+}
+CFX_ByteString CPDF_StructElementImpl::GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NAME) {
+ return default_value;
+ }
+ return pAttr->GetString();
+}
+FX_ARGB CPDF_StructElementImpl::GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_ARRAY) {
+ return default_value;
+ }
+ CPDF_Array* pArray = (CPDF_Array*)pAttr;
+ return 0xff000000 | ((int)(pArray->GetNumber(0) * 255) << 16) | ((int)(pArray->GetNumber(1) * 255) << 8) | (int)(pArray->GetNumber(2) * 255);
+}
+FX_FLOAT CPDF_StructElementImpl::GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
+ return default_value;
+ }
+ return pAttr->GetNumber();
+}
+int CPDF_StructElementImpl::GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable, int subindex)
+{
+ CPDF_Object* pAttr = GetAttr(owner, name, bInheritable, subindex);
+ if (pAttr == NULL || pAttr->GetType() != PDFOBJ_NUMBER) {
+ return default_value;
+ }
+ return pAttr->GetInteger();
+}
diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp
new file mode 100644
index 0000000000..dd81594998
--- /dev/null
+++ b/core/src/fpdfdoc/doc_utils.cpp
@@ -0,0 +1,749 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+static const int FPDFDOC_UTILS_MAXRECURSION = 32;
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict);
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument);
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag);
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag);
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag);
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont);
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag);
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument);
+void SetDefaultInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont);
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray);
+FX_BOOL NeedPDFEncodeForFieldFullName(const CFX_WideString& csFieldName);
+FX_BOOL NeedPDFEncodeForFieldTree(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+void EncodeFieldName(const CFX_WideString& csName, CFX_ByteString& csT);
+void UpdateEncodeFieldName(CPDF_Dictionary* pFieldDict, int nLevel = 0);
+CFX_WideString GetFullName(CPDF_Dictionary* pFieldDict)
+{
+ CFX_WideString full_name;
+ CPDF_Dictionary* pLevel = pFieldDict;
+ while (pLevel) {
+ CFX_WideString short_name = pLevel->GetUnicodeText("T");
+ if (short_name != L"") {
+ if (full_name == L"") {
+ full_name = short_name;
+ } else {
+ full_name = short_name + L"." + full_name;
+ }
+ }
+ pLevel = pLevel->GetDict("Parent");
+ }
+ return full_name;
+}
+FX_BOOL CPDF_DefaultAppearance::HasFont()
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ return syntax.FindTagParam("Tf", 2);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetFontString()
+{
+ CFX_ByteString csFont;
+ if (m_csDA.IsEmpty()) {
+ return csFont;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tf", 2)) {
+ csFont += (CFX_ByteString)syntax.GetWord();
+ csFont += " ";
+ csFont += (CFX_ByteString)syntax.GetWord();
+ csFont += " ";
+ csFont += (CFX_ByteString)syntax.GetWord();
+ }
+ return csFont;
+}
+void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize)
+{
+ csFontNameTag = "";
+ fFontSize = 0;
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tf", 2)) {
+ csFontNameTag = (CFX_ByteString)syntax.GetWord();
+ csFontNameTag.Delete(0, 1);
+ fFontSize = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+ csFontNameTag = PDF_NameDecode(csFontNameTag);
+}
+FX_BOOL CPDF_DefaultAppearance::HasColor(FX_BOOL bStrokingOperation)
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ return TRUE;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ return TRUE;
+ }
+ syntax.SetPos(0);
+ return syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetColorString(FX_BOOL bStrokingOperation)
+{
+ CFX_ByteString csColor;
+ if (m_csDA.IsEmpty()) {
+ return csColor;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ return csColor;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ return csColor;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ csColor += " ";
+ csColor += (CFX_ByteString)syntax.GetWord();
+ }
+ return csColor;
+}
+void CPDF_DefaultAppearance::GetColor(int& iColorType, FX_FLOAT fc[4], FX_BOOL bStrokingOperation)
+{
+ iColorType = COLORTYPE_TRANSPARENT;
+ for (int c = 0; c < 4; c ++) {
+ fc[c] = 0;
+ }
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ iColorType = COLORTYPE_GRAY;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ iColorType = COLORTYPE_RGB;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ iColorType = COLORTYPE_CMYK;
+ fc[0] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[1] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[2] = FX_atof((CFX_ByteString)syntax.GetWord());
+ fc[3] = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+}
+void CPDF_DefaultAppearance::GetColor(FX_ARGB& color, int& iColorType, FX_BOOL bStrokingOperation)
+{
+ color = 0;
+ iColorType = COLORTYPE_TRANSPARENT;
+ if (m_csDA.IsEmpty()) {
+ return;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam(bStrokingOperation ? "G" : "g", 1)) {
+ iColorType = COLORTYPE_GRAY;
+ FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ color = ArgbEncode(255, (int)g, (int)g, (int)g);
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "RG" : "rg", 3)) {
+ iColorType = COLORTYPE_RGB;
+ FX_FLOAT r = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ FX_FLOAT g = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ FX_FLOAT b = FX_atof((CFX_ByteString)syntax.GetWord()) * 255 + 0.5f;
+ color = ArgbEncode(255, (int)r, (int)g, (int)b);
+ return;
+ }
+ syntax.SetPos(0);
+ if (syntax.FindTagParam(bStrokingOperation ? "K" : "k", 4)) {
+ iColorType = COLORTYPE_CMYK;
+ FX_FLOAT c = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT m = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT y = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT k = FX_atof((CFX_ByteString)syntax.GetWord());
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+ color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f), (int)(b * 255 + 0.5f));
+ }
+}
+FX_BOOL CPDF_DefaultAppearance::HasTextMatrix()
+{
+ if (m_csDA.IsEmpty()) {
+ return FALSE;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ return syntax.FindTagParam("Tm", 6);
+}
+CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString()
+{
+ CFX_ByteString csTM;
+ if (m_csDA.IsEmpty()) {
+ return csTM;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tm", 6)) {
+ for (int i = 0; i < 6; i ++) {
+ csTM += (CFX_ByteString)syntax.GetWord();
+ csTM += " ";
+ }
+ csTM += (CFX_ByteString)syntax.GetWord();
+ }
+ return csTM;
+}
+CFX_AffineMatrix CPDF_DefaultAppearance::GetTextMatrix()
+{
+ CFX_AffineMatrix tm;
+ if (m_csDA.IsEmpty()) {
+ return tm;
+ }
+ CPDF_SimpleParser syntax(m_csDA);
+ if (syntax.FindTagParam("Tm", 6)) {
+ FX_FLOAT f[6];
+ for (int i = 0; i < 6; i ++) {
+ f[i] = FX_atof((CFX_ByteString)syntax.GetWord());
+ }
+ tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
+ }
+ return tm;
+}
+void InitInterFormDict(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument)
+{
+ if (pDocument == NULL) {
+ return;
+ }
+ if (pFormDict == NULL) {
+ pFormDict = CPDF_Dictionary::Create();
+ if (pFormDict == NULL) {
+ return;
+ }
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
+ CPDF_Dictionary* pRoot = pDocument->GetRoot();
+ pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
+ }
+ CFX_ByteString csDA;
+ if (!pFormDict->KeyExist("DR")) {
+ CPDF_Font* pFont = NULL;
+ CFX_ByteString csBaseName, csDefault;
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ pFont = CPDF_InterForm::AddStandardFont(pDocument, "Helvetica");
+ if (pFont != NULL) {
+ AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
+ csDefault = csBaseName;
+ }
+ if (charSet != 0) {
+ CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet, NULL);
+ if (pFont == NULL || csFontName != "Helvetica") {
+ pFont = CPDF_InterForm::AddNativeFont(pDocument);
+ if (pFont != NULL) {
+ csBaseName = "";
+ AddInterFormFont(pFormDict, pDocument, pFont, csBaseName);
+ csDefault = csBaseName;
+ }
+ }
+ }
+ if (pFont != NULL) {
+ csDA = "/" + PDF_NameEncode(csDefault) + " 0 Tf";
+ }
+ }
+ if (!csDA.IsEmpty()) {
+ csDA += " ";
+ }
+ csDA += "0 g";
+ if (!pFormDict->KeyExist("DA")) {
+ pFormDict->SetAtString("DA", csDA);
+ }
+}
+FX_DWORD CountInterFormFonts(CPDF_Dictionary* pFormDict)
+{
+ if (pFormDict == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return 0;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return 0;
+ }
+ FX_DWORD dwCount = 0;
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect != NULL && pDirect->GetType() == PDFOBJ_DICTIONARY) {
+ if (((CPDF_Dictionary*)pDirect)->GetString("Type") == "Font") {
+ dwCount ++;
+ }
+ }
+ }
+ return dwCount;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_DWORD index, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_DWORD dwCount = 0;
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ if (dwCount == index) {
+ csNameTag = csKey;
+ return pDocument->LoadFont(pElement);
+ }
+ dwCount ++;
+ }
+ return NULL;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csNameTag)
+{
+ CFX_ByteString csAlias = PDF_NameDecode(csNameTag);
+ if (pFormDict == NULL || csAlias.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pElement = pFonts->GetDict(csAlias);
+ if (pElement == NULL) {
+ return NULL;
+ }
+ if (pElement->GetString("Type") == "Font") {
+ return pDocument->LoadFont(pElement);
+ }
+ return NULL;
+}
+CPDF_Font* GetInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL || csFontName.IsEmpty()) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ CPDF_Font* pFind = pDocument->LoadFont(pElement);
+ if (pFind == NULL) {
+ continue;
+ }
+ CFX_ByteString csBaseFont;
+ csBaseFont = pFind->GetBaseFont();
+ csBaseFont.Remove(' ');
+ if (csBaseFont == csFontName) {
+ csNameTag = csKey;
+ return pFind;
+ }
+ }
+ return NULL;
+}
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return NULL;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return NULL;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ CPDF_Font* pFind = pDocument->LoadFont(pElement);
+ if (pFind == NULL) {
+ continue;
+ }
+ CFX_SubstFont* pSubst = (CFX_SubstFont*)pFind->GetSubstFont();
+ if (pSubst == NULL) {
+ continue;
+ }
+ if (pSubst->m_Charset == (int)charSet) {
+ csNameTag = csKey;
+ return pFind;
+ }
+ }
+ return NULL;
+}
+CPDF_Font* GetNativeInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
+{
+ csNameTag = "";
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ CFX_SubstFont* pSubst;
+ CPDF_Font* pFont = GetDefaultInterFormFont(pFormDict, pDocument);
+ if (pFont != NULL) {
+ pSubst = (CFX_SubstFont*)pFont->GetSubstFont();
+ if (pSubst != NULL && pSubst->m_Charset == (int)charSet) {
+ FindInterFormFont(pFormDict, pFont, csNameTag);
+ return pFont;
+ }
+ }
+ return GetNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
+}
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL || pFont == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ if (pFont->GetFontDict() == pElement) {
+ csNameTag = csKey;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL FindInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument, CFX_ByteString csFontName, CPDF_Font*& pFont, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return FALSE;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return FALSE;
+ }
+ if (csFontName.GetLength() > 0) {
+ csFontName.Remove(' ');
+ }
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos) {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey, csTmp;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) {
+ continue;
+ }
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) {
+ continue;
+ }
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") {
+ continue;
+ }
+ pFont = pDocument->LoadFont(pElement);
+ if (pFont == NULL) {
+ continue;
+ }
+ CFX_ByteString csBaseFont;
+ csBaseFont = pFont->GetBaseFont();
+ csBaseFont.Remove(' ');
+ if (csBaseFont == csFontName) {
+ csNameTag = csKey;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+void AddInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, const CPDF_Font* pFont, CFX_ByteString& csNameTag)
+{
+ if (pFont == NULL) {
+ return;
+ }
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CFX_ByteString csTag;
+ if (FindInterFormFont(pFormDict, pFont, csTag)) {
+ csNameTag = csTag;
+ return;
+ }
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ pDR = CPDF_Dictionary::Create();
+ if (pDR == NULL) {
+ return;
+ }
+ pFormDict->SetAt("DR", pDR);
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ pFonts = CPDF_Dictionary::Create();
+ pDR->SetAt("Font", pFonts);
+ }
+ if (csNameTag.IsEmpty()) {
+ csNameTag = pFont->GetBaseFont();
+ }
+ csNameTag.Remove(' ');
+ csNameTag = CPDF_InterForm::GenerateNewResourceName(pDR, "Font", 4, csNameTag);
+ pFonts->SetAtReference(csNameTag, pDocument, pFont->GetFontDict());
+}
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, FX_BYTE charSet, CFX_ByteString& csNameTag)
+{
+ if (pFormDict == NULL) {
+ InitInterFormDict(pFormDict, pDocument);
+ }
+ CFX_ByteString csTemp;
+ CPDF_Font* pFont = GetNativeInterFormFont(pFormDict, pDocument, charSet, csTemp);
+ if (pFont != NULL) {
+ csNameTag = csTemp;
+ return pFont;
+ }
+ CFX_ByteString csFontName = CPDF_InterForm::GetNativeFont(charSet);
+ if (!csFontName.IsEmpty()) {
+ if (FindInterFormFont(pFormDict, pDocument, csFontName, pFont, csNameTag)) {
+ return pFont;
+ }
+ }
+ pFont = CPDF_InterForm::AddNativeFont(charSet, pDocument);
+ if (pFont != NULL) {
+ AddInterFormFont(pFormDict, pDocument, pFont, csNameTag);
+ }
+ return pFont;
+}
+CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag)
+{
+ FX_BYTE charSet = CPDF_InterForm::GetNativeCharSet();
+ return AddNativeInterFormFont(pFormDict, pDocument, charSet, csNameTag);
+}
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, const CPDF_Font* pFont)
+{
+ if (pFormDict == NULL || pFont == NULL) {
+ return;
+ }
+ CFX_ByteString csTag;
+ if (!FindInterFormFont(pFormDict, pFont, csTag)) {
+ return;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ pFonts->RemoveAt(csTag);
+}
+void RemoveInterFormFont(CPDF_Dictionary* pFormDict, CFX_ByteString csNameTag)
+{
+ if (pFormDict == NULL || csNameTag.IsEmpty()) {
+ return;
+ }
+ CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
+ if (pDR == NULL) {
+ return;
+ }
+ CPDF_Dictionary* pFonts = pDR->GetDict("Font");
+ if (pFonts == NULL) {
+ return;
+ }
+ pFonts->RemoveAt(csNameTag);
+}
+CPDF_Font* GetDefaultInterFormFont(CPDF_Dictionary* pFormDict, CPDF_Document* pDocument)
+{
+ if (pFormDict == NULL) {
+ return NULL;
+ }
+ CPDF_DefaultAppearance cDA = pFormDict->GetString("DA");
+ CFX_ByteString csFontNameTag;
+ FX_FLOAT fFontSize;
+ cDA.GetFont(csFontNameTag, fFontSize);
+ return GetInterFormFont(pFormDict, pDocument, csFontNameTag);
+}
+CPDF_IconFit::ScaleMethod CPDF_IconFit::GetScaleMethod()
+{
+ if (m_pDict == NULL) {
+ return Always;
+ }
+ CFX_ByteString csSW = m_pDict->GetString("SW", "A");
+ if (csSW == "B") {
+ return Bigger;
+ } else if (csSW == "S") {
+ return Smaller;
+ } else if (csSW == "N") {
+ return Never;
+ }
+ return Always;
+}
+FX_BOOL CPDF_IconFit::IsProportionalScale()
+{
+ if (m_pDict == NULL) {
+ return TRUE;
+ }
+ return m_pDict->GetString("S", "P") != "A";
+}
+void CPDF_IconFit::GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom)
+{
+ fLeft = fBottom = 0.5;
+ if (m_pDict == NULL) {
+ return;
+ }
+ CPDF_Array* pA = m_pDict->GetArray("A");
+ if (pA != NULL) {
+ FX_DWORD dwCount = pA->GetCount();
+ if (dwCount > 0) {
+ fLeft = pA->GetNumber(0);
+ }
+ if (dwCount > 1) {
+ fBottom = pA->GetNumber(1);
+ }
+ }
+}
+FX_BOOL CPDF_IconFit::GetFittingBounds()
+{
+ if (m_pDict == NULL) {
+ return FALSE;
+ }
+ return m_pDict->GetBoolean("FB");
+}
+void SaveCheckedFieldStatus(CPDF_FormField* pField, CFX_ByteArray& statusArray)
+{
+ int iCount = pField->CountControls();
+ for (int i = 0; i < iCount; i ++) {
+ CPDF_FormControl* pControl = pField->GetControl(i);
+ if (pControl == NULL) {
+ continue;
+ }
+ statusArray.Add(pControl->IsChecked() ? 1 : 0);
+ }
+}
+CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name, int nLevel)
+{
+ if (nLevel > FPDFDOC_UTILS_MAXRECURSION) {
+ return NULL;
+ }
+ if (pFieldDict == NULL) {
+ return NULL;
+ }
+ CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
+ if (pAttr) {
+ return pAttr;
+ }
+ CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
+ if (pParent == NULL) {
+ return NULL;
+ }
+ return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
+}
diff --git a/core/src/fpdfdoc/doc_viewerPreferences.cpp b/core/src/fpdfdoc/doc_viewerPreferences.cpp
new file mode 100644
index 0000000000..80af0b50fd
--- /dev/null
+++ b/core/src/fpdfdoc/doc_viewerPreferences.cpp
@@ -0,0 +1,31 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+CPDF_ViewerPreferences::CPDF_ViewerPreferences(CPDF_Document *pDoc): m_pDoc(pDoc)
+{
+}
+CPDF_ViewerPreferences::~CPDF_ViewerPreferences()
+{
+}
+FX_BOOL CPDF_ViewerPreferences::IsDirectionR2L() const
+{
+ CPDF_Dictionary *pDict = m_pDoc->GetRoot();
+ pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
+ if (!pDict) {
+ return FALSE;
+ }
+ return FX_BSTRC("R2L") == pDict->GetString(FX_BSTRC("Direction"));
+}
+FX_BOOL CPDF_ViewerPreferences::PrintScaling() const
+{
+ CPDF_Dictionary *pDict = m_pDoc->GetRoot();
+ pDict = pDict->GetDict(FX_BSTRC("ViewerPreferences"));
+ if (!pDict) {
+ return TRUE;
+ }
+ return FX_BSTRC("None") != pDict->GetString(FX_BSTRC("PrintScaling"));
+}
diff --git a/core/src/fpdfdoc/doc_vt.cpp b/core/src/fpdfdoc/doc_vt.cpp
new file mode 100644
index 0000000000..251173da22
--- /dev/null
+++ b/core/src/fpdfdoc/doc_vt.cpp
@@ -0,0 +1,1864 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+const FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144};
+#define PVT_RETURN_LENGTH 1
+#define PVT_DEFAULT_FONTSIZE 18.0f
+#define PVTWORD_SCRIPT_NORMAL 0
+#define PVTWORD_SCRIPT_SUPER 1
+#define PVTWORD_SCRIPT_SUB 2
+#define PVT_FONTSCALE 0.001f
+#define PVT_PERCENT 0.01f
+#define PVT_HALF 0.5f
+CLine::CLine()
+{
+}
+CLine::~CLine()
+{
+}
+CPVT_WordPlace CLine::GetBeginWordPlace() const
+{
+ return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
+}
+CPVT_WordPlace CLine::GetEndWordPlace() const
+{
+ return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, m_LineInfo.nEndWordIndex);
+}
+CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nEndWordIndex);
+ }
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex - 1);
+}
+CPVT_WordPlace CLine::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nWordIndex < m_LineInfo.nBeginWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, m_LineInfo.nBeginWordIndex);
+ }
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, place.nWordIndex + 1);
+}
+CSection::CSection(CPDF_VariableText * pVT) : m_pVT(pVT)
+{
+}
+CSection::~CSection()
+{
+ ResetAll();
+}
+void CSection::ResetAll()
+{
+ ResetWordArray();
+ ResetLineArray();
+}
+void CSection::ResetLineArray()
+{
+ m_LineArray.RemoveAll();
+}
+void CSection::ResetWordArray()
+{
+ for (FX_INT32 i = 0, sz = m_WordArray.GetSize(); i < sz; i++) {
+ delete m_WordArray.GetAt(i);
+ }
+ m_WordArray.RemoveAll();
+}
+void CSection::ResetLinePlace()
+{
+ for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {
+ if (CLine * pLine = m_LineArray.GetAt(i)) {
+ pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);
+ }
+ }
+}
+CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) {
+ FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.GetSize()), 0);
+ if (nWordIndex == m_WordArray.GetSize()) {
+ m_WordArray.Add(pWord);
+ } else {
+ m_WordArray.InsertAt(nWordIndex, pWord);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo)
+{
+ return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
+}
+CPVT_FloatRect CSection::Rearrange()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_pVT->m_nCharArray > 0) {
+ return CTypeset(this).CharArray();
+ } else {
+ return CTypeset(this).Typeset();
+ }
+}
+CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize)
+{
+ return CTypeset(this).GetEditSize(fFontSize);
+}
+CPVT_WordPlace CSection::GetBeginWordPlace() const
+{
+ if (CLine * pLine = m_LineArray.GetAt(0)) {
+ return pLine->GetBeginWordPlace();
+ } else {
+ return SecPlace;
+ }
+}
+CPVT_WordPlace CSection::GetEndWordPlace() const
+{
+ if (CLine * pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
+ return pLine->GetEndWordPlace();
+ } else {
+ return this->SecPlace;
+ }
+}
+CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nLineIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nLineIndex >= m_LineArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
+ if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) {
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
+ } else if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+ if (CLine * pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) {
+ return pPrevLine->GetEndWordPlace();
+ }
+ } else {
+ return pLine->GetPrevWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nLineIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nLineIndex >= m_LineArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CLine * pLine = m_LineArray.GetAt(place.nLineIndex)) {
+ if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
+ if (CLine * pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
+ return pNextLine->GetBeginWordPlace();
+ }
+ } else {
+ return pLine->GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+void CSection::UpdateWordPlace(CPVT_WordPlace & place) const
+{
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_LineArray.GetSize() - 1;
+ FX_INT32 nMid = (nLeft + nRight) / 2;
+ while (nLeft <= nRight) {
+ if (CLine * pLine = m_LineArray.GetAt(nMid)) {
+ if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ } else {
+ place.nLineIndex = nMid;
+ return;
+ }
+ } else {
+ break;
+ }
+ }
+}
+CPVT_WordPlace CSection::SearchWordPlace(const CPDF_Point & point) const
+{
+ ASSERT(m_pVT != NULL);
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_BOOL bUp = TRUE;
+ FX_BOOL bDown = TRUE;
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_LineArray.GetSize() - 1;
+ FX_INT32 nMid = m_LineArray.GetSize() / 2;
+ FX_FLOAT fTop = 0;
+ FX_FLOAT fBottom = 0;
+ while (nLeft <= nRight) {
+ if (CLine * pLine = m_LineArray.GetAt(nMid)) {
+ fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - m_pVT->GetLineLeading(m_SecInfo);
+ fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
+ if (IsFloatBigger(point.y, fTop)) {
+ bUp = FALSE;
+ }
+ if (IsFloatSmaller(point.y, fBottom)) {
+ bDown = FALSE;
+ }
+ if (IsFloatSmaller(point.y, fTop)) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else if (IsFloatBigger(point.y, fBottom)) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ place = SearchWordPlace(point.x,
+ CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace())
+ );
+ place.nLineIndex = nMid;
+ return place;
+ }
+ }
+ }
+ if (bUp) {
+ place = GetBeginWordPlace();
+ }
+ if (bDown) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const
+{
+ if (CLine * pLine = m_LineArray.GetAt(lineplace.nLineIndex)) {
+ return SearchWordPlace(fx - m_SecInfo.rcSection.left,
+ CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), pLine->GetEndWordPlace()));
+ }
+ return GetBeginWordPlace();
+}
+CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const
+{
+ CPVT_WordPlace wordplace = range.BeginPos;
+ wordplace.nWordIndex = -1;
+ if (!m_pVT) {
+ return wordplace;
+ }
+ FX_INT32 nLeft = range.BeginPos.nWordIndex;
+ FX_INT32 nRight = range.EndPos.nWordIndex + 1;
+ FX_INT32 nMid = (nLeft + nRight) / 2;
+ while (nLeft < nRight) {
+ if (nMid == nLeft) {
+ break;
+ }
+ if (nMid == nRight) {
+ nMid--;
+ break;
+ }
+ if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
+ if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
+ nLeft = nMid;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ nRight = nMid;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ }
+ } else {
+ break;
+ }
+ }
+ if (CPVT_WordInfo * pWord = m_WordArray.GetAt(nMid)) {
+ if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * PVT_HALF) {
+ wordplace.nWordIndex = nMid;
+ }
+ }
+ return wordplace;
+}
+void CSection::ClearLeftWords(FX_INT32 nWordIndex)
+{
+ for (FX_INT32 i = nWordIndex; i >= 0; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearRightWords(FX_INT32 nWordIndex)
+{
+ for (FX_INT32 i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ for (FX_INT32 i = nEndIndex; i > nBeginIndex; i--) {
+ delete m_WordArray.GetAt(i);
+ m_WordArray.RemoveAt(i);
+ }
+}
+void CSection::ClearWords(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
+ CPVT_WordPlace SecEndPos = GetEndWordPlace();
+ if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {
+ if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
+ ClearMidWords(PlaceRange.BeginPos.nWordIndex, PlaceRange.EndPos.nWordIndex);
+ } else {
+ ClearRightWords(PlaceRange.BeginPos.nWordIndex);
+ }
+ } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
+ ClearLeftWords(PlaceRange.EndPos.nWordIndex);
+ } else {
+ ResetWordArray();
+ }
+}
+void CSection::ClearWord(const CPVT_WordPlace & place)
+{
+ delete m_WordArray.GetAt(place.nWordIndex);
+ m_WordArray.RemoveAt(place.nWordIndex);
+}
+CTypeset::CTypeset(CSection * pSection) : m_pSection(pSection), m_pVT(pSection->m_pVT), m_rcRet(0.0f, 0.0f, 0.0f, 0.0f)
+{
+}
+CTypeset::~CTypeset()
+{
+}
+CPVT_FloatRect CTypeset::CharArray()
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ FX_FLOAT fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
+ FX_FLOAT fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
+ m_rcRet.Default();
+ FX_FLOAT x = 0.0f, y = 0.0f;
+ FX_FLOAT fNextWidth;
+ FX_INT32 nStart = 0;
+ FX_FLOAT fNodeWidth = m_pVT->GetPlateWidth() / (m_pVT->m_nCharArray <= 0 ? 1 : m_pVT->m_nCharArray);
+ if (CLine * pLine = m_pSection->m_LineArray.GetAt(0)) {
+ x = 0.0f;
+ y += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
+ y += fLineAscent;
+ nStart = 0;
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ case 0:
+ pLine->m_LineInfo.fLineX = fNodeWidth * PVT_HALF;
+ break;
+ case 1:
+ nStart = (m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize()) / 2;
+ pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
+ break;
+ case 2:
+ nStart = m_pVT->m_nCharArray - m_pSection->m_WordArray.GetSize();
+ pLine->m_LineInfo.fLineX = fNodeWidth * nStart - fNodeWidth * PVT_HALF;
+ break;
+ }
+ for (FX_INT32 w = 0, sz = m_pSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (w >= m_pVT->m_nCharArray) {
+ break;
+ }
+ fNextWidth = 0;
+ if (CPVT_WordInfo * pNextWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w + 1)) {
+ pNextWord->fWordTail = 0;
+ fNextWidth = m_pVT->GetWordWidth(*pNextWord);
+ }
+ if (CPVT_WordInfo * pWord = (CPVT_WordInfo *)m_pSection->m_WordArray.GetAt(w)) {
+ pWord->fWordTail = 0;
+ FX_FLOAT fWordWidth = m_pVT->GetWordWidth(*pWord);
+ FX_FLOAT fWordAscent = m_pVT->GetWordAscent(*pWord);
+ FX_FLOAT fWordDescent = m_pVT->GetWordDescent(*pWord);
+ x = (FX_FLOAT)(fNodeWidth * (w + nStart + 0.5) - fWordWidth * PVT_HALF);
+ pWord->fWordX = x;
+ pWord->fWordY = y;
+ if (w == 0) {
+ pLine->m_LineInfo.fLineX = x;
+ }
+ if (w != m_pSection->m_WordArray.GetSize() - 1)
+ pWord->fWordTail = (fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF > 0 ?
+ fNodeWidth - (fWordWidth + fNextWidth) * PVT_HALF : 0);
+ else {
+ pWord->fWordTail = 0;
+ }
+ x += fWordWidth;
+ fLineAscent = FPDF_MAX(fLineAscent, fWordAscent);
+ fLineDescent = FPDF_MIN(fLineDescent, fWordDescent);
+ }
+ }
+ pLine->m_LineInfo.nBeginWordIndex = 0;
+ pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;
+ pLine->m_LineInfo.fLineY = y;
+ pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX;
+ pLine->m_LineInfo.fLineAscent = fLineAscent;
+ pLine->m_LineInfo.fLineDescent = fLineDescent;
+ y += (-fLineDescent);
+ }
+ return m_rcRet = CPVT_FloatRect(0, 0, x, y);
+}
+CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize)
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ SplitLines(FALSE, fFontSize);
+ return CPVT_Size(m_rcRet.Width(), m_rcRet.Height());
+}
+CPVT_FloatRect CTypeset::Typeset()
+{
+ ASSERT(m_pSection != NULL);
+ ASSERT(m_pVT != NULL);
+ m_pSection->m_LineArray.Empty();
+ SplitLines(TRUE, 0.0f);
+ m_pSection->m_LineArray.Clear();
+ OutputLines();
+ return m_rcRet;
+}
+static int special_chars[128] = {
+ 0x0000, 0x000C, 0x0008, 0x000C, 0x0008, 0x0000, 0x0020, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0008, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 0x0028,
+ 0x000C, 0x0008, 0x0000, 0x0000, 0x0028, 0x0028, 0x0028, 0x0028,
+ 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+ 0x0002, 0x0002, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0008,
+ 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
+ 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0001, 0x0001, 0x000C, 0x0000, 0x0008, 0x0000, 0x0000,
+};
+static FX_BOOL IsLatin(FX_WORD word)
+{
+ if (word <= 0x007F) {
+ if (special_chars[word] & 0x0001) {
+ return TRUE;
+ }
+ }
+ if ((word >= 0x00C0 && word <= 0x00FF) ||
+ (word >= 0x0100 && word <= 0x024F) ||
+ (word >= 0x1E00 && word <= 0x1EFF) ||
+ (word >= 0x2C60 && word <= 0x2C7F) ||
+ (word >= 0xA720 && word <= 0xA7FF) ||
+ (word >= 0xFF21 && word <= 0xFF3A) ||
+ (word >= 0xFF41 && word <= 0xFF5A)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsDigit(FX_DWORD word)
+{
+ return (word >= 0x0030 && word <= 0x0039) ? TRUE : FALSE;
+}
+static FX_BOOL IsCJK(FX_DWORD word)
+{
+ if ((word >= 0x1100 && word <= 0x11FF) ||
+ (word >= 0x2E80 && word <= 0x2FFF) ||
+ (word >= 0x3040 && word <= 0x9FBF) ||
+ (word >= 0xAC00 && word <= 0xD7AF) ||
+ (word >= 0xF900 && word <= 0xFAFF) ||
+ (word >= 0xFE30 && word <= 0xFE4F) ||
+ (word >= 0x20000 && word <= 0x2A6DF) ||
+ (word >= 0x2F800 && word <= 0x2FA1F)) {
+ return TRUE;
+ }
+ if (word >= 0x3000 && word <= 0x303F) {
+ if (word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||
+ word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||
+ word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||
+ word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035) {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ if (word >= 0xFF66 && word <= 0xFF9D) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsPunctuation(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 3) & 1) {
+ return TRUE;
+ }
+ } else if (word >= 0x0080 && word <= 0x00FF) {
+ if (word == 0x0082 || word == 0x0084 || word == 0x0085 || word == 0x0091 ||
+ word == 0x0092 || word == 0x0093 || word <= 0x0094 || word == 0x0096 ||
+ word == 0x00B4 || word == 0x00B8) {
+ return TRUE;
+ }
+ } else if (word >= 0x2000 && word <= 0x206F) {
+ if (word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||
+ word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||
+ word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||
+ word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||
+ word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||
+ word == 0x203E || word == 0x2044) {
+ return TRUE;
+ }
+ } else if (word >= 0x3000 && word <= 0x303F) {
+ if (word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||
+ word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||
+ word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||
+ word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||
+ word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||
+ word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F) {
+ return TRUE;
+ }
+ } else if (word >= 0xFE50 && word <= 0xFE6F) {
+ if ((word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63) {
+ return TRUE;
+ }
+ } else if (word >= 0xFF00 && word <= 0xFFEF) {
+ if (word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||
+ word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||
+ word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||
+ word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||
+ word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||
+ word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static FX_BOOL IsConnectiveSymbol(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 5) & 1) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+static FX_BOOL IsOpenStylePunctuation(FX_DWORD word)
+{
+ if (word <= 0x007F) {
+ if ((special_chars[word] >> 2) & 1) {
+ return TRUE;
+ }
+ } else if (word == 0x300A || word == 0x300C || word == 0x300E || word == 0x3010 ||
+ word == 0x3014 || word == 0x3016 || word == 0x3018 || word == 0x301A ||
+ word == 0xFF08 || word == 0xFF3B || word == 0xFF5B || word == 0xFF62) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsCurrencySymbol(FX_WORD word)
+{
+ if (word == 0x0024 || word == 0x0080 || word == 0x00A2 || word == 0x00A3 ||
+ word == 0x00A4 || word == 0x00A5 || (word >= 0x20A0 && word <= 0x20CF) ||
+ word == 0xFE69 || word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||
+ word == 0xFFE5 || word == 0xFFE6) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsPrefixSymbol(FX_WORD word)
+{
+ if (IsCurrencySymbol(word)) {
+ return TRUE;
+ }
+ if (word == 0x2116) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL IsSpace(FX_WORD word)
+{
+ return (word == 0x0020 || word == 0x3000) ? TRUE : FALSE;
+}
+static FX_BOOL NeedDivision(FX_WORD prevWord, FX_WORD curWord)
+{
+ if ((IsLatin(prevWord) || IsDigit(prevWord)) && (IsLatin(curWord) || IsDigit(curWord))) {
+ return FALSE;
+ } else if (IsSpace(curWord) || IsPunctuation(curWord)) {
+ return FALSE;
+ } else if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {
+ return FALSE;
+ } else if (IsSpace(prevWord) || IsPunctuation(prevWord)) {
+ return TRUE;
+ } else if (IsPrefixSymbol(prevWord)) {
+ return FALSE;
+ } else if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {
+ return TRUE;
+ } else if (IsCJK(prevWord)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CTypeset::SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize)
+{
+ ASSERT(m_pVT != NULL);
+ ASSERT(m_pSection != NULL);
+ FX_INT32 nLineHead = 0;
+ FX_INT32 nLineTail = 0;
+ FX_FLOAT fMaxX = 0.0f, fMaxY = 0.0f;
+ FX_FLOAT fLineWidth = 0.0f, fBackupLineWidth = 0.0f;
+ FX_FLOAT fLineAscent = 0.0f, fBackupLineAscent = 0.0f;
+ FX_FLOAT fLineDescent = 0.0f, fBackupLineDescent = 0.0f;
+ FX_INT32 nWordStartPos = 0;
+ FX_BOOL bFullWord = FALSE;
+ FX_INT32 nLineFullWordIndex = 0;
+ FX_INT32 nCharIndex = 0;
+ CPVT_LineInfo line;
+ FX_FLOAT fWordWidth = 0;
+ FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(m_pSection->m_SecInfo), 0.0f);
+ FX_INT32 nTotalWords = m_pSection->m_WordArray.GetSize();
+ FX_BOOL bOpened = FALSE;
+ if (nTotalWords > 0) {
+ FX_INT32 i = 0;
+ while (i < nTotalWords) {
+ CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(i);
+ CPVT_WordInfo* pOldWord = pWord;
+ if (i > 0) {
+ pOldWord = m_pSection->m_WordArray.GetAt(i - 1);
+ }
+ if (pWord) {
+ if (bTypeset) {
+ fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, TRUE));
+ fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, TRUE));
+ fWordWidth = m_pVT->GetWordWidth(*pWord);
+ } else {
+ fLineAscent = FPDF_MAX(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));
+ fLineDescent = FPDF_MIN(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));
+ fWordWidth = m_pVT->GetWordWidth(pWord->nFontIndex,
+ pWord->Word,
+ m_pVT->m_wSubWord,
+ m_pVT->m_fCharSpace,
+ m_pVT->m_nHorzScale,
+ fFontSize,
+ pWord->fWordTail,
+ 0);
+ }
+ if (!bOpened) {
+ if (IsOpenStylePunctuation(pWord->Word)) {
+ bOpened = TRUE;
+ bFullWord = TRUE;
+ } else if (pOldWord != NULL) {
+ if (NeedDivision(pOldWord->Word, pWord->Word)) {
+ bFullWord = TRUE;
+ }
+ }
+ } else {
+ if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {
+ bOpened = FALSE;
+ }
+ }
+ if (bFullWord) {
+ bFullWord = FALSE;
+ if (nCharIndex > 0) {
+ nLineFullWordIndex ++;
+ }
+ nWordStartPos = i;
+ fBackupLineWidth = fLineWidth;
+ fBackupLineAscent = fLineAscent;
+ fBackupLineDescent = fLineDescent;
+ }
+ nCharIndex++;
+ }
+ if (m_pVT->m_bLimitWidth && fTypesetWidth > 0 &&
+ fLineWidth + fWordWidth > fTypesetWidth) {
+ if (nLineFullWordIndex > 0) {
+ i = nWordStartPos;
+ fLineWidth = fBackupLineWidth;
+ fLineAscent = fBackupLineAscent;
+ fLineDescent = fBackupLineDescent;
+ }
+ if (nCharIndex == 1) {
+ fLineWidth = fWordWidth;
+ i++;
+ }
+ nLineTail = i - 1;
+ if (bTypeset) {
+ line.nBeginWordIndex = nLineHead;
+ line.nEndWordIndex = nLineTail;
+ line.nTotalWord = nLineTail - nLineHead + 1;
+ line.fLineWidth = fLineWidth;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
+ fMaxY += (-fLineDescent);
+ fMaxX = FPDF_MAX(fLineWidth, fMaxX);
+ nLineHead = i;
+ fLineWidth = 0.0f;
+ fLineAscent = 0.0f;
+ fLineDescent = 0.0f;
+ nCharIndex = 0;
+ nLineFullWordIndex = 0;
+ bFullWord = FALSE;
+ } else {
+ fLineWidth += fWordWidth;
+ i++;
+ }
+ }
+ if (nLineHead <= nTotalWords - 1) {
+ nLineTail = nTotalWords - 1;
+ if (bTypeset) {
+ line.nBeginWordIndex = nLineHead;
+ line.nEndWordIndex = nLineTail;
+ line.nTotalWord = nLineTail - nLineHead + 1;
+ line.fLineWidth = fLineWidth;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (fLineAscent + m_pVT->GetLineLeading(m_pSection->m_SecInfo));
+ fMaxY += (-fLineDescent);
+ fMaxX = FPDF_MAX(fLineWidth, fMaxX);
+ }
+ } else {
+ if (bTypeset) {
+ fLineAscent = m_pVT->GetLineAscent(m_pSection->m_SecInfo);
+ fLineDescent = m_pVT->GetLineDescent(m_pSection->m_SecInfo);
+ } else {
+ fLineAscent = m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);
+ fLineDescent = m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);
+ }
+ if (bTypeset) {
+ line.nBeginWordIndex = -1;
+ line.nEndWordIndex = -1;
+ line.nTotalWord = 0;
+ line.fLineWidth = 0;
+ line.fLineAscent = fLineAscent;
+ line.fLineDescent = fLineDescent;
+ m_pSection->AddLine(line);
+ }
+ fMaxY += (m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent + (-fLineDescent));
+ }
+ m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
+}
+void CTypeset::OutputLines()
+{
+ ASSERT(m_pVT != NULL);
+ ASSERT(m_pSection != NULL);
+ FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
+ FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
+ FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
+ FX_FLOAT fTypesetWidth = FPDF_MAX(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ default:
+ case 0:
+ fMinX = 0.0f;
+ break;
+ case 1:
+ fMinX = (fTypesetWidth - m_rcRet.Width()) * PVT_HALF;
+ break;
+ case 2:
+ fMinX = fTypesetWidth - m_rcRet.Width();
+ break;
+ }
+ fMaxX = fMinX + m_rcRet.Width();
+ fMinY = 0.0f;
+ fMaxY = m_rcRet.Height();
+ FX_INT32 nTotalLines = m_pSection->m_LineArray.GetSize();
+ if (nTotalLines > 0) {
+ m_pSection->m_SecInfo.nTotalLine = nTotalLines;
+ for (FX_INT32 l = 0; l < nTotalLines; l++) {
+ if (CLine * pLine = m_pSection->m_LineArray.GetAt(l)) {
+ switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
+ default:
+ case 0:
+ fPosX = 0;
+ break;
+ case 1:
+ fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * PVT_HALF;
+ break;
+ case 2:
+ fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
+ break;
+ }
+ fPosX += fLineIndent;
+ fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
+ fPosY += pLine->m_LineInfo.fLineAscent;
+ pLine->m_LineInfo.fLineX = fPosX - fMinX;
+ pLine->m_LineInfo.fLineY = fPosY - fMinY;
+ for (FX_INT32 w = pLine->m_LineInfo.nBeginWordIndex; w <= pLine->m_LineInfo.nEndWordIndex; w++) {
+ if (CPVT_WordInfo * pWord = m_pSection->m_WordArray.GetAt(w)) {
+ pWord->fWordX = fPosX - fMinX;
+ if (pWord->pWordProps) {
+ switch (pWord->pWordProps->nScriptType) {
+ default:
+ case PVTWORD_SCRIPT_NORMAL:
+ pWord->fWordY = fPosY - fMinY;
+ break;
+ case PVTWORD_SCRIPT_SUPER:
+ pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
+ break;
+ case PVTWORD_SCRIPT_SUB:
+ pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
+ break;
+ }
+ } else {
+ pWord->fWordY = fPosY - fMinY;
+ }
+ fPosX += m_pVT->GetWordWidth(*pWord);
+ }
+ }
+ fPosY += (-pLine->m_LineInfo.fLineDescent);
+ }
+ }
+ }
+ m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
+}
+CPDF_VariableText::CPDF_VariableText() :
+ m_pVTProvider(NULL),
+ m_pVTIterator(NULL),
+ m_bInitial(FALSE),
+ m_bRichText(FALSE),
+ m_bMultiLine(FALSE),
+ m_bLimitWidth(FALSE),
+ m_bAutoFontSize(FALSE),
+ m_nLimitChar(0),
+ m_nCharArray(0),
+ m_nAlignment(0),
+ m_fCharSpace(0.0f),
+ m_fWordSpace(0.0f),
+ m_fFontSize(0.0f),
+ m_nHorzScale(100),
+ m_wSubWord(0),
+ m_fLineLeading(0.0f)
+{
+}
+CPDF_VariableText::~CPDF_VariableText()
+{
+ if (m_pVTIterator) {
+ delete m_pVTIterator;
+ m_pVTIterator = NULL;
+ }
+ ResetAll();
+}
+void CPDF_VariableText::Initialize()
+{
+ if (!m_bInitial) {
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0);
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PVT_DEFAULT_FONTSIZE, 0, 0, 0);
+ }
+ CPVT_WordPlace place;
+ place.nSecIndex = 0;
+ AddSection(place, secinfo);
+ CPVT_LineInfo lineinfo;
+ lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize());
+ lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSize());
+ AddLine(place, lineinfo);
+ if (CSection * pSection = m_SectionArray.GetAt(0)) {
+ pSection->ResetLinePlace();
+ }
+ m_bInitial = TRUE;
+ }
+}
+void CPDF_VariableText::ResetAll()
+{
+ m_bInitial = FALSE;
+ ResetSectionArray();
+}
+CPVT_WordPlace CPDF_VariableText::InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset,
+ const CPVT_WordProps * pWordProps)
+{
+ FX_INT32 nTotlaWords = this->GetTotalWords();
+ if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
+ return place;
+ }
+ if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
+ return place;
+ }
+ CPVT_WordPlace newplace = place;
+ newplace.nWordIndex ++;
+ if (m_bRichText) {
+ CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordProps) : FX_NEW CPVT_WordProps();
+ if (pNewProps) {
+ pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFontIndex);
+ return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps));
+ }
+ } else {
+ FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWordFontIndex(word, charset, GetDefaultFontIndex());
+ return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL));
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps,
+ const CPVT_WordProps * pWordProps)
+{
+ FX_INT32 nTotlaWords = this->GetTotalWords();
+ if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) {
+ return place;
+ }
+ if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) {
+ return place;
+ }
+ if (!m_bMultiLine) {
+ return place;
+ }
+ CPVT_WordPlace wordplace = place;
+ UpdateWordPlace(wordplace);
+ CPVT_WordPlace newplace = place;
+ if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) {
+ CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1);
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ if (pSecProps) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
+ }
+ if (pWordProps) {
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
+ }
+ }
+ AddSection(NewPlace, secinfo);
+ newplace = NewPlace;
+ if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) {
+ for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) {
+ NewPlace.nWordIndex++;
+ pNewSection->AddWord(NewPlace, *pWord);
+ }
+ }
+ }
+ ClearSectionRightWords(wordplace);
+ }
+ return newplace;
+}
+CPVT_WordPlace CPDF_VariableText::InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pProps)
+{
+ CFX_WideString swText = text;
+ CPVT_WordPlace wp = place;
+ for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
+ CPVT_WordPlace oldwp = wp;
+ FX_WORD word = swText.GetAt(i);
+ switch (word) {
+ case 0x0D:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0A) {
+ i += 1;
+ }
+ wp = InsertSection(wp, pSecProps, pProps);
+ }
+ break;
+ case 0x0A:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0D) {
+ i += 1;
+ }
+ wp = InsertSection(wp, pSecProps, pProps);
+ }
+ break;
+ case 0x09:
+ word = 0x20;
+ default:
+ wp = InsertWord(wp, word, charset, pProps);
+ break;
+ }
+ if (wp == oldwp) {
+ break;
+ }
+ }
+ return wp;
+}
+CPVT_WordPlace CPDF_VariableText::DeleteWords(const CPVT_WordRange & PlaceRange)
+{
+ FX_BOOL bLastSecPos = FALSE;
+ if (CSection * pSection = m_SectionArray.GetAt(PlaceRange.EndPos.nSecIndex)) {
+ bLastSecPos = (PlaceRange.EndPos == pSection->GetEndWordPlace());
+ }
+ ClearWords(PlaceRange);
+ if (PlaceRange.BeginPos.nSecIndex != PlaceRange.EndPos.nSecIndex) {
+ ClearEmptySections(PlaceRange);
+ if (!bLastSecPos) {
+ LinkLatterSection(PlaceRange.BeginPos);
+ }
+ }
+ return PlaceRange.BeginPos;
+}
+CPVT_WordPlace CPDF_VariableText::DeleteWord(const CPVT_WordPlace & place)
+{
+ return ClearRightWord(AjustLineHeader(place, TRUE));
+}
+CPVT_WordPlace CPDF_VariableText::BackSpaceWord(const CPVT_WordPlace & place)
+{
+ return ClearLeftWord(AjustLineHeader(place, TRUE));
+}
+void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_SecProps * pSecProps,
+ const CPVT_WordProps * pWordProps)
+{
+ DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+ CFX_WideString swText = text;
+ CPVT_WordPlace wp(0, 0, -1);
+ CPVT_SectionInfo secinfo;
+ if (m_bRichText) {
+ if (pSecProps) {
+ secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps);
+ }
+ if (pWordProps) {
+ secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps);
+ }
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(0)) {
+ pSection->m_SecInfo = secinfo;
+ }
+ FX_INT32 nCharCount = 0;
+ for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) {
+ if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) {
+ break;
+ }
+ if (m_nCharArray > 0 && nCharCount >= m_nCharArray) {
+ break;
+ }
+ FX_WORD word = swText.GetAt(i);
+ switch (word) {
+ case 0x0D:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0A) {
+ i += 1;
+ }
+ wp.nSecIndex ++;
+ wp.nLineIndex = 0;
+ wp.nWordIndex = -1;
+ AddSection(wp, secinfo);
+ }
+ break;
+ case 0x0A:
+ if (m_bMultiLine) {
+ if (swText.GetAt(i + 1) == 0x0D) {
+ i += 1;
+ }
+ wp.nSecIndex ++;
+ wp.nLineIndex = 0;
+ wp.nWordIndex = -1;
+ AddSection(wp, secinfo);
+ }
+ break;
+ case 0x09:
+ word = 0x20;
+ default:
+ wp = InsertWord(wp, word, charset, pWordProps);
+ break;
+ }
+ nCharCount++;
+ }
+}
+void CPDF_VariableText::UpdateWordPlace(CPVT_WordPlace & place) const
+{
+ if (place.nSecIndex < 0) {
+ place = GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ place = GetEndWordPlace();
+ }
+ place = AjustLineHeader(place, TRUE);
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ pSection->UpdateWordPlace(place);
+ }
+}
+FX_INT32 CPDF_VariableText::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
+{
+ CPVT_WordPlace newplace = place;
+ UpdateWordPlace(newplace);
+ FX_INT32 nIndex = 0;
+ FX_INT32 i = 0;
+ FX_INT32 sz = 0;
+ for (i = 0, sz = m_SectionArray.GetSize(); i < sz && i < newplace.nSecIndex; i++) {
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nIndex += pSection->m_WordArray.GetSize();
+ if (i != m_SectionArray.GetSize() - 1) {
+ nIndex += PVT_RETURN_LENGTH;
+ }
+ }
+ }
+ if (i >= 0 && i < m_SectionArray.GetSize()) {
+ nIndex += newplace.nWordIndex + PVT_RETURN_LENGTH;
+ }
+ return nIndex;
+}
+CPVT_WordPlace CPDF_VariableText::WordIndexToWordPlace(FX_INT32 index) const
+{
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_INT32 nOldIndex = 0 , nIndex = 0;
+ FX_BOOL bFind = FALSE;
+ for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++) {
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nIndex += pSection->m_WordArray.GetSize();
+ if (nIndex == index) {
+ place = pSection->GetEndWordPlace();
+ bFind = TRUE;
+ break;
+ } else if (nIndex > index) {
+ place.nSecIndex = i;
+ place.nWordIndex = index - nOldIndex - 1;
+ pSection->UpdateWordPlace(place);
+ bFind = TRUE;
+ break;
+ }
+ if (i != m_SectionArray.GetSize() - 1) {
+ nIndex += PVT_RETURN_LENGTH;
+ }
+ nOldIndex = nIndex;
+ }
+ }
+ if (!bFind) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetBeginWordPlace() const
+{
+ return m_bInitial ? CPVT_WordPlace(0, 0, -1) : CPVT_WordPlace();
+}
+CPVT_WordPlace CPDF_VariableText::GetEndWordPlace() const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(m_SectionArray.GetSize() - 1)) {
+ return pSection->GetEndWordPlace();
+ }
+ return CPVT_WordPlace();
+}
+CPVT_WordPlace CPDF_VariableText::GetPrevWordPlace(const CPVT_WordPlace & place) const
+{
+ if( place.nSecIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (place.WordCmp(pSection->GetBeginWordPlace()) <= 0) {
+ if (CSection * pPrevSection = m_SectionArray.GetAt(place.nSecIndex - 1)) {
+ return pPrevSection->GetEndWordPlace();
+ } else {
+ return GetBeginWordPlace();
+ }
+ } else {
+ return pSection->GetPrevWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetNextWordPlace(const CPVT_WordPlace & place) const
+{
+ if (place.nSecIndex < 0) {
+ return GetBeginWordPlace();
+ }
+ if (place.nSecIndex >= m_SectionArray.GetSize()) {
+ return GetEndWordPlace();
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (place.WordCmp(pSection->GetEndWordPlace()) >= 0) {
+ if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
+ return pNextSection->GetBeginWordPlace();
+ } else {
+ return GetEndWordPlace();
+ }
+ } else {
+ return pSection->GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::SearchWordPlace(const CPDF_Point & point) const
+{
+ CPDF_Point pt = OutToIn(point);
+ CPVT_WordPlace place = GetBeginWordPlace();
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = m_SectionArray.GetSize() - 1;
+ FX_INT32 nMid = m_SectionArray.GetSize() / 2;
+ FX_BOOL bUp = TRUE;
+ FX_BOOL bDown = TRUE;
+ while (nLeft <= nRight) {
+ if (CSection * pSection = m_SectionArray.GetAt(nMid)) {
+ if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.top)) {
+ bUp = FALSE;
+ }
+ if (IsFloatBigger(pSection->m_SecInfo.rcSection.bottom, pt.y)) {
+ bDown = FALSE;
+ }
+ if (IsFloatSmaller(pt.y, pSection->m_SecInfo.rcSection.top)) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else if (IsFloatBigger(pt.y, pSection->m_SecInfo.rcSection.bottom)) {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ place = pSection->SearchWordPlace(
+ CPDF_Point(pt.x - pSection->m_SecInfo.rcSection.left, pt.y - pSection->m_SecInfo.rcSection.top)
+ );
+ place.nSecIndex = nMid;
+ return place;
+ }
+ } else {
+ break;
+ }
+ }
+ if (bUp) {
+ place = GetBeginWordPlace();
+ }
+ if (bDown) {
+ place = GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace temp = place;
+ CPDF_Point pt = OutToIn(point);
+ if (temp.nLineIndex-- > 0) {
+ return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ } else {
+ if (temp.nSecIndex-- > 0) {
+ if (CSection * pLastSection = m_SectionArray.GetAt(temp.nSecIndex)) {
+ temp.nLineIndex = pLastSection->m_LineArray.GetSize() - 1;
+ return pLastSection->SearchWordPlace(pt.x - pLastSection->m_SecInfo.rcSection.left, temp);
+ }
+ }
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace temp = place;
+ CPDF_Point pt = OutToIn(point);
+ if (temp.nLineIndex++ < pSection->m_LineArray.GetSize() - 1) {
+ return pSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ } else {
+ if (temp.nSecIndex++ < m_SectionArray.GetSize() - 1) {
+ if (CSection * pNextSection = m_SectionArray.GetAt(temp.nSecIndex)) {
+ temp.nLineIndex = 0;
+ return pNextSection->SearchWordPlace(pt.x - pSection->m_SecInfo.rcSection.left, temp);
+ }
+ }
+ }
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetLineBeginPlace(const CPVT_WordPlace & place) const
+{
+ return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
+}
+CPVT_WordPlace CPDF_VariableText::GetLineEndPlace(const CPVT_WordPlace & place) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex))
+ if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
+ return pLine->GetEndWordPlace();
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::GetSectionBeginPlace(const CPVT_WordPlace & place) const
+{
+ return CPVT_WordPlace(place.nSecIndex, 0, -1);
+}
+CPVT_WordPlace CPDF_VariableText::GetSectionEndPlace(const CPVT_WordPlace & place) const
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ return pSection->GetEndWordPlace();
+ }
+ return place;
+}
+FX_INT32 CPDF_VariableText::GetTotalWords() const
+{
+ FX_INT32 nTotal = 0;
+ for (FX_INT32 i = 0, sz = m_SectionArray.GetSize(); i < sz; i++)
+ if (CSection * pSection = m_SectionArray.GetAt(i)) {
+ nTotal += (pSection->m_WordArray.GetSize() + PVT_RETURN_LENGTH);
+ }
+ return nTotal - PVT_RETURN_LENGTH;
+}
+void CPDF_VariableText::ResetSectionArray()
+{
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ delete m_SectionArray.GetAt(s);
+ }
+ m_SectionArray.RemoveAll();
+}
+CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo)
+{
+ if (IsValid() && !m_bMultiLine) {
+ return place;
+ }
+ FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSize()), 0);
+ CSection * pSection = FX_NEW CSection(this);
+ if (!pSection) {
+ return place;
+ }
+ pSection->m_SecInfo = secinfo;
+ pSection->SecPlace.nSecIndex = nSecIndex;
+ if (nSecIndex == m_SectionArray.GetSize()) {
+ m_SectionArray.Add(pSection);
+ } else {
+ m_SectionArray.InsertAt(nSecIndex, pSection);
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo)
+{
+ if (m_SectionArray.IsEmpty()) {
+ return place;
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ return pSection->AddLine(lineinfo);
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (m_SectionArray.GetSize() <= 0) {
+ return place;
+ }
+ CPVT_WordPlace newplace = place;
+ newplace.nSecIndex = FPDF_MAX(FPDF_MIN(newplace.nSecIndex, m_SectionArray.GetSize() - 1), 0);
+ if (CSection * pSection = m_SectionArray.GetAt(newplace.nSecIndex)) {
+ return pSection->AddWord(newplace, wordinfo);
+ }
+ return place;
+}
+FX_BOOL CPDF_VariableText::GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
+ wordinfo = *pWord;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(place.nWordIndex)) {
+ *pWord = wordinfo;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(place.nLineIndex)) {
+ lineinfo = pLine->m_LineInfo;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText::GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ secinfo = pSection->m_SecInfo;
+ return TRUE;
+ }
+ return FALSE;
+}
+CPDF_Rect CPDF_VariableText::GetContentRect() const
+{
+ return InToOut(CPDF_EditContainer::GetContentRect());
+}
+FX_FLOAT CPDF_VariableText::GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return m_bRichText && WordInfo.pWordProps ? (WordInfo.pWordProps->nScriptType == PVTWORD_SCRIPT_NORMAL || bFactFontSize ? WordInfo.pWordProps->fFontSize : WordInfo.pWordProps->fFontSize * PVT_HALF) : GetFontSize();
+}
+FX_INT32 CPDF_VariableText::GetWordFontIndex(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nFontIndex : WordInfo.nFontIndex;
+}
+FX_FLOAT CPDF_VariableText::GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
+ FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle)
+{
+ return (GetCharWidth(nFontIndex, Word, SubWord, nWordStyle) * fFontSize * PVT_FONTSCALE + fCharSpace) * nHorzScale * PVT_PERCENT + fWordTail;
+}
+FX_FLOAT CPDF_VariableText::GetWordWidth(const CPVT_WordInfo & WordInfo)
+{
+ return GetWordWidth(GetWordFontIndex(WordInfo), WordInfo.Word, GetSubWord(), GetCharSpace(WordInfo), GetHorzScale(WordInfo),
+ GetWordFontSize(WordInfo), WordInfo.fWordTail,
+ WordInfo.pWordProps ? WordInfo.pWordProps->nWordStyle : 0);
+}
+FX_FLOAT CPDF_VariableText::GetLineAscent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pWordProps ? GetFontAscent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
+ GetFontAscent(GetDefaultFontIndex(), GetFontSize());
+}
+FX_FLOAT CPDF_VariableText::GetLineDescent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pWordProps ? GetFontDescent(SecInfo.pWordProps->nFontIndex, SecInfo.pWordProps->fFontSize) :
+ GetFontDescent(GetDefaultFontIndex(), GetFontSize());
+}
+FX_FLOAT CPDF_VariableText::GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ return (FX_FLOAT)GetTypeAscent(nFontIndex) * fFontSize * PVT_FONTSCALE;
+}
+FX_FLOAT CPDF_VariableText::GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ return (FX_FLOAT)GetTypeDescent(nFontIndex) * fFontSize * PVT_FONTSCALE;
+}
+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
+{
+ return GetFontAscent(GetWordFontIndex(WordInfo), fFontSize);
+}
+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize)
+{
+ return GetFontDescent(GetWordFontIndex(WordInfo), fFontSize);
+}
+FX_FLOAT CPDF_VariableText::GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return GetFontAscent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
+}
+FX_FLOAT CPDF_VariableText::GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize)
+{
+ return GetFontDescent(GetWordFontIndex(WordInfo), GetWordFontSize(WordInfo, bFactFontSize));
+}
+FX_FLOAT CPDF_VariableText::GetLineLeading(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineLeading : m_fLineLeading;
+}
+FX_FLOAT CPDF_VariableText::GetLineIndent(const CPVT_SectionInfo & SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->fLineIndent : 0.0f;
+}
+FX_INT32 CPDF_VariableText::GetAlignment(const CPVT_SectionInfo& SecInfo)
+{
+ return m_bRichText && SecInfo.pSecProps ? SecInfo.pSecProps->nAlignment : this->m_nAlignment;
+}
+FX_FLOAT CPDF_VariableText::GetCharSpace(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->fCharSpace : m_fCharSpace;
+}
+FX_INT32 CPDF_VariableText::GetHorzScale(const CPVT_WordInfo & WordInfo)
+{
+ return m_bRichText && WordInfo.pWordProps ? WordInfo.pWordProps->nHorzScale : m_nHorzScale;
+}
+void CPDF_VariableText::ClearSectionRightWords(const CPVT_WordPlace & place)
+{
+ CPVT_WordPlace wordplace = AjustLineHeader(place, TRUE);
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ for (FX_INT32 w = pSection->m_WordArray.GetSize() - 1; w > wordplace.nWordIndex; w--) {
+ delete pSection->m_WordArray.GetAt(w);
+ pSection->m_WordArray.RemoveAt(w);
+ }
+ }
+}
+CPVT_WordPlace CPDF_VariableText::AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const
+{
+ if (place.nWordIndex < 0 && place.nLineIndex > 0) {
+ if (bPrevOrNext) {
+ return GetPrevWordPlace(place);
+ } else {
+ return GetNextWordPlace(place);
+ }
+ }
+ return place;
+}
+FX_BOOL CPDF_VariableText::ClearEmptySection(const CPVT_WordPlace & place)
+{
+ if (place.nSecIndex == 0 && m_SectionArray.GetSize() == 1) {
+ return FALSE;
+ }
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ if (pSection->m_WordArray.GetSize() == 0) {
+ delete pSection;
+ m_SectionArray.RemoveAt(place.nSecIndex);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+void CPDF_VariableText::ClearEmptySections(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace wordplace;
+ for (FX_INT32 s = PlaceRange.EndPos.nSecIndex; s > PlaceRange.BeginPos.nSecIndex; s--) {
+ wordplace.nSecIndex = s;
+ ClearEmptySection(wordplace);
+ }
+}
+void CPDF_VariableText::LinkLatterSection(const CPVT_WordPlace & place)
+{
+ CPVT_WordPlace oldplace = AjustLineHeader(place, TRUE);
+ if (CSection * pNextSection = m_SectionArray.GetAt(place.nSecIndex + 1)) {
+ if (CSection * pSection = m_SectionArray.GetAt(oldplace.nSecIndex)) {
+ for (FX_INT32 w = 0, sz = pNextSection->m_WordArray.GetSize(); w < sz; w++) {
+ if (CPVT_WordInfo * pWord = pNextSection->m_WordArray.GetAt(w)) {
+ oldplace.nWordIndex ++;
+ pSection->AddWord(oldplace, *pWord);
+ }
+ }
+ }
+ delete pNextSection;
+ m_SectionArray.RemoveAt(place.nSecIndex + 1);
+ }
+}
+void CPDF_VariableText::ClearWords(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordRange NewRange;
+ NewRange.BeginPos = AjustLineHeader(PlaceRange.BeginPos, TRUE);
+ NewRange.EndPos = AjustLineHeader(PlaceRange.EndPos, TRUE);
+ for (FX_INT32 s = NewRange.EndPos.nSecIndex; s >= NewRange.BeginPos.nSecIndex; s--) {
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ pSection->ClearWords(NewRange);
+ }
+ }
+}
+CPVT_WordPlace CPDF_VariableText::ClearLeftWord(const CPVT_WordPlace & place)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace leftplace = this->GetPrevWordPlace(place);
+ if (leftplace != place) {
+ if (leftplace.nSecIndex != place.nSecIndex) {
+ if (pSection->m_WordArray.GetSize() == 0) {
+ this->ClearEmptySection(place);
+ } else {
+ this->LinkLatterSection(leftplace);
+ }
+ } else {
+ pSection->ClearWord(place);
+ }
+ }
+ return leftplace;
+ }
+ return place;
+}
+CPVT_WordPlace CPDF_VariableText::ClearRightWord(const CPVT_WordPlace & place)
+{
+ if (CSection * pSection = m_SectionArray.GetAt(place.nSecIndex)) {
+ CPVT_WordPlace rightplace = AjustLineHeader(this->GetNextWordPlace(place), FALSE);
+ if (rightplace != place) {
+ if(rightplace.nSecIndex != place.nSecIndex) {
+ LinkLatterSection(place);
+ } else {
+ pSection->ClearWord(rightplace);
+ }
+ }
+ }
+ return place;
+}
+void CPDF_VariableText::RearrangeAll()
+{
+ Rearrange(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+}
+void CPDF_VariableText::RearrangePart(const CPVT_WordRange & PlaceRange)
+{
+ Rearrange(PlaceRange);
+}
+CPVT_FloatRect CPDF_VariableText::Rearrange(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_FloatRect rcRet;
+ if (IsValid()) {
+ if (m_bAutoFontSize) {
+ SetFontSize(GetAutoFontSize());
+ rcRet = RearrangeSections(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace()));
+ } else {
+ rcRet = RearrangeSections(PlaceRange);
+ }
+ }
+ SetContentRect(rcRet);
+ return rcRet;
+}
+FX_FLOAT CPDF_VariableText::GetAutoFontSize()
+{
+ FX_INT32 nTotal = sizeof(gFontSizeSteps) / sizeof(FX_BYTE);
+ if (IsMultiLine()) {
+ nTotal /= 4;
+ }
+ if (nTotal <= 0) {
+ return 0;
+ }
+ if (GetPlateWidth() <= 0) {
+ return 0;
+ }
+ FX_INT32 nLeft = 0;
+ FX_INT32 nRight = nTotal - 1;
+ FX_INT32 nMid = nTotal / 2;
+ while (nLeft <= nRight) {
+ if (IsBigger(gFontSizeSteps[nMid])) {
+ nRight = nMid - 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ } else {
+ nLeft = nMid + 1;
+ nMid = (nLeft + nRight) / 2;
+ continue;
+ }
+ }
+ return (FX_FLOAT)gFontSizeSteps[nMid];
+}
+FX_BOOL CPDF_VariableText::IsBigger(FX_FLOAT fFontSize)
+{
+ FX_BOOL bBigger = FALSE;
+ CPVT_Size szTotal;
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ CPVT_Size size = pSection->GetSectionSize(fFontSize);
+ szTotal.x = FPDF_MAX(size.x, szTotal.x);
+ szTotal.y += size.y;
+ if (IsFloatBigger(szTotal.x, GetPlateWidth())
+ || IsFloatBigger(szTotal.y, GetPlateHeight())
+ ) {
+ bBigger = TRUE;
+ break;
+ }
+ }
+ }
+ return bBigger;
+}
+CPVT_FloatRect CPDF_VariableText::RearrangeSections(const CPVT_WordRange & PlaceRange)
+{
+ CPVT_WordPlace place;
+ FX_FLOAT fPosY = 0;
+ FX_FLOAT fOldHeight;
+ FX_INT32 nSSecIndex = PlaceRange.BeginPos.nSecIndex;
+ FX_INT32 nESecIndex = PlaceRange.EndPos.nSecIndex;
+ CPVT_FloatRect rcRet;
+ for (FX_INT32 s = 0, sz = m_SectionArray.GetSize(); s < sz; s++) {
+ place.nSecIndex = s;
+ if (CSection * pSection = m_SectionArray.GetAt(s)) {
+ pSection->SecPlace = place;
+ CPVT_FloatRect rcSec = pSection->m_SecInfo.rcSection;
+ if (s >= nSSecIndex) {
+ if (s <= nESecIndex) {
+ rcSec = pSection->Rearrange();
+ rcSec.top += fPosY;
+ rcSec.bottom += fPosY;
+ } else {
+ fOldHeight = pSection->m_SecInfo.rcSection.bottom - pSection->m_SecInfo.rcSection.top;
+ rcSec.top = fPosY;
+ rcSec.bottom = fPosY + fOldHeight;
+ }
+ pSection->m_SecInfo.rcSection = rcSec;
+ pSection->ResetLinePlace();
+ }
+ if (s == 0) {
+ rcRet = rcSec;
+ } else {
+ rcRet.left = FPDF_MIN(rcSec.left, rcRet.left);
+ rcRet.top = FPDF_MIN(rcSec.top, rcRet.top);
+ rcRet.right = FPDF_MAX(rcSec.right, rcRet.right);
+ rcRet.bottom = FPDF_MAX(rcSec.bottom, rcRet.bottom);
+ }
+ fPosY += rcSec.Height();
+ }
+ }
+ return rcRet;
+}
+FX_INT32 CPDF_VariableText::GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle)
+{
+ if (m_pVTProvider) {
+ if (SubWord > 0) {
+ return m_pVTProvider->GetCharWidth(nFontIndex, SubWord, nWordStyle);
+ } else {
+ return m_pVTProvider->GetCharWidth(nFontIndex, Word, nWordStyle);
+ }
+ }
+ return 0;
+}
+FX_INT32 CPDF_VariableText::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetTypeAscent(nFontIndex) : 0;
+}
+FX_INT32 CPDF_VariableText::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetTypeDescent(nFontIndex) : 0;
+}
+FX_INT32 CPDF_VariableText::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ return m_pVTProvider ? m_pVTProvider->GetWordFontIndex(word, charset, nFontIndex) : -1;
+}
+FX_INT32 CPDF_VariableText::GetDefaultFontIndex()
+{
+ return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1;
+}
+FX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word)
+{
+ return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE;
+}
+IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator()
+{
+ if (!m_pVTIterator) {
+ return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this);
+ }
+ return m_pVTIterator;
+}
+IPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText_Provider * pProvider)
+{
+ IPDF_VariableText_Provider* pOld = m_pVTProvider;
+ m_pVTProvider = pProvider;
+ return pOld;
+}
+CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT):
+ m_pVT(pVT),
+ m_CurPos(-1, -1, -1)
+{
+}
+CPDF_VariableText_Iterator::~CPDF_VariableText_Iterator()
+{
+}
+void CPDF_VariableText_Iterator::SetAt(FX_INT32 nWordIndex)
+{
+ ASSERT(m_pVT != NULL);
+ m_CurPos = m_pVT->WordIndexToWordPlace(nWordIndex);
+}
+void CPDF_VariableText_Iterator::SetAt(const CPVT_WordPlace & place)
+{
+ ASSERT(m_pVT != NULL);
+ m_CurPos = place;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextWord()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos == m_pVT->GetEndWordPlace()) {
+ return FALSE;
+ }
+ m_CurPos = m_pVT->GetNextWordPlace(m_CurPos);
+ return TRUE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevWord()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos == m_pVT->GetBeginWordPlace()) {
+ return FALSE;
+ }
+ m_CurPos = m_pVT->GetPrevWordPlace(m_CurPos);
+ return TRUE;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextLine()
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (m_CurPos.nLineIndex < pSection->m_LineArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex + 1, -1);
+ return TRUE;
+ } else {
+ if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevLine()
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (m_CurPos.nLineIndex > 0) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex - 1, -1);
+ return TRUE;
+ } else {
+ if (m_CurPos.nSecIndex > 0) {
+ if (CSection * pLastSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex - 1)) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, pLastSection->m_LineArray.GetSize() - 1, -1);
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::NextSection()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos.nSecIndex < m_pVT->m_SectionArray.GetSize() - 1) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex + 1, 0, -1);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::PrevSection()
+{
+ ASSERT(m_pVT != NULL);
+ if (m_CurPos.nSecIndex > 0) {
+ m_CurPos = CPVT_WordPlace(m_CurPos.nSecIndex - 1, 0, -1);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetWord(CPVT_Word & word) const
+{
+ ASSERT(m_pVT != NULL);
+ word.WordPlace = m_CurPos;
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
+ word.Word = pWord->Word;
+ word.nCharset = pWord->nCharset;
+ word.fWidth = m_pVT->GetWordWidth(*pWord);
+ word.ptWord = m_pVT->InToOut(
+ CPDF_Point(pWord->fWordX + pSection->m_SecInfo.rcSection.left,
+ pWord->fWordY + pSection->m_SecInfo.rcSection.top) );
+ word.fAscent = m_pVT->GetWordAscent(*pWord);
+ word.fDescent = m_pVT->GetWordDescent(*pWord);
+ if (pWord->pWordProps) {
+ word.WordProps = *pWord->pWordProps;
+ }
+ word.nFontIndex = m_pVT->GetWordFontIndex(*pWord);
+ word.fFontSize = m_pVT->GetWordFontSize(*pWord);
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::SetWord(const CPVT_Word & word)
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(m_CurPos.nWordIndex)) {
+ if (pWord->pWordProps) {
+ *pWord->pWordProps = word.WordProps;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetLine(CPVT_Line & line) const
+{
+ ASSERT(m_pVT != NULL);
+ line.lineplace = CPVT_WordPlace(m_CurPos.nSecIndex, m_CurPos.nLineIndex, -1);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (CLine * pLine = pSection->m_LineArray.GetAt(m_CurPos.nLineIndex)) {
+ line.ptLine = m_pVT->InToOut(
+ CPDF_Point(pLine->m_LineInfo.fLineX + pSection->m_SecInfo.rcSection.left,
+ pLine->m_LineInfo.fLineY + pSection->m_SecInfo.rcSection.top) );
+ line.fLineWidth = pLine->m_LineInfo.fLineWidth;
+ line.fLineAscent = pLine->m_LineInfo.fLineAscent;
+ line.fLineDescent = pLine->m_LineInfo.fLineDescent;
+ line.lineEnd = pLine->GetEndWordPlace();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::GetSection(CPVT_Section & section) const
+{
+ ASSERT(m_pVT != NULL);
+ section.secplace = CPVT_WordPlace(m_CurPos.nSecIndex, 0, -1);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ section.rcSection = m_pVT->InToOut(pSection->m_SecInfo.rcSection);
+ if (pSection->m_SecInfo.pSecProps) {
+ section.SecProps = *pSection->m_SecInfo.pSecProps;
+ }
+ if (pSection->m_SecInfo.pWordProps) {
+ section.WordProps = *pSection->m_SecInfo.pWordProps;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_VariableText_Iterator::SetSection(const CPVT_Section & section)
+{
+ ASSERT(m_pVT != NULL);
+ if (CSection * pSection = m_pVT->m_SectionArray.GetAt(m_CurPos.nSecIndex)) {
+ if (pSection->m_SecInfo.pSecProps) {
+ *pSection->m_SecInfo.pSecProps = section.SecProps;
+ }
+ if (pSection->m_SecInfo.pWordProps) {
+ *pSection->m_SecInfo.pWordProps = section.WordProps;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
diff --git a/core/src/fpdfdoc/doc_vtmodule.cpp b/core/src/fpdfdoc/doc_vtmodule.cpp
new file mode 100644
index 0000000000..8bc4e7b771
--- /dev/null
+++ b/core/src/fpdfdoc/doc_vtmodule.cpp
@@ -0,0 +1,17 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfdoc/fpdf_doc.h"
+#include "../../include/fpdfdoc/fpdf_vt.h"
+#include "pdf_vt.h"
+IPDF_VariableText* IPDF_VariableText::NewVariableText()
+{
+ return FX_NEW CPDF_VariableText();
+}
+void IPDF_VariableText::DelVariableText(IPDF_VariableText* pVT)
+{
+ delete (CPDF_VariableText*)pVT;
+}
diff --git a/core/src/fpdfdoc/pdf_vt.h b/core/src/fpdfdoc/pdf_vt.h
new file mode 100644
index 0000000000..fc1af0415f
--- /dev/null
+++ b/core/src/fpdfdoc/pdf_vt.h
@@ -0,0 +1,642 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#define _PDF_VT_H_
+class CPVT_Size;
+class CPVT_FloatRect;
+struct CPVT_SectionInfo;
+struct CPVT_LineInfo;
+struct CPVT_WordInfo;
+class CLine;
+class CLines;
+class CSection;
+class CTypeset;
+class CPDF_EditContainer;
+class CPDF_VariableText;
+class CPDF_VariableText_Iterator;
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+template<class T> T FPDF_MIN (const T & i, const T & j)
+{
+ return ((i < j) ? i : j);
+}
+template<class T> T FPDF_MAX (const T & i, const T & j)
+{
+ return ((i > j) ? i : j);
+}
+class CPVT_Size
+{
+public:
+ CPVT_Size() : x(0.0f), y(0.0f)
+ {
+ }
+ CPVT_Size(FX_FLOAT x, FX_FLOAT y)
+ {
+ this->x = x;
+ this->y = y;
+ }
+ FX_FLOAT x, y;
+};
+class CPVT_FloatRect : public CFX_FloatRect
+{
+public:
+ CPVT_FloatRect()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+ CPVT_FloatRect(FX_FLOAT left, FX_FLOAT top,
+ FX_FLOAT right, FX_FLOAT bottom)
+ {
+ this->left = left;
+ this->top = top;
+ this->right = right;
+ this->bottom = bottom;
+ }
+ CPVT_FloatRect(const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+ }
+ void Default()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+ FX_FLOAT Height() const
+ {
+ if(this->top > this->bottom) {
+ return this->top - this->bottom;
+ } else {
+ return this->bottom - this->top;
+ }
+ }
+};
+struct CPVT_SectionInfo {
+ CPVT_SectionInfo() : rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
+ {
+ }
+ virtual ~CPVT_SectionInfo()
+ {
+ if (pSecProps) {
+ delete pSecProps;
+ }
+ if (pWordProps) {
+ delete pWordProps;
+ }
+ }
+ CPVT_SectionInfo(const CPVT_SectionInfo & other): rcSection(), nTotalLine(0), pSecProps(NULL), pWordProps(NULL)
+ {
+ operator = (other);
+ }
+ void operator = (const CPVT_SectionInfo & other)
+ {
+ if (this == &other) {
+ return;
+ }
+ this->rcSection = other.rcSection;
+ this->nTotalLine = other.nTotalLine;
+ if (other.pSecProps) {
+ if (pSecProps) {
+ *pSecProps = *other.pSecProps;
+ } else {
+ pSecProps = FX_NEW CPVT_SecProps(*other.pSecProps);
+ }
+ }
+ if (other.pWordProps) {
+ if (pWordProps) {
+ *pWordProps = *other.pWordProps;
+ } else {
+ pWordProps = FX_NEW CPVT_WordProps(*other.pWordProps);
+ }
+ }
+ }
+ CPVT_FloatRect rcSection;
+ FX_INT32 nTotalLine;
+ CPVT_SecProps* pSecProps;
+ CPVT_WordProps* pWordProps;
+};
+struct CPVT_LineInfo {
+ CPVT_LineInfo() : nTotalWord(0), nBeginWordIndex(-1), nEndWordIndex(-1),
+ fLineX(0.0f), fLineY(0.0f), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f)
+ {
+ }
+ FX_INT32 nTotalWord;
+ FX_INT32 nBeginWordIndex;
+ FX_INT32 nEndWordIndex;
+ FX_FLOAT fLineX;
+ FX_FLOAT fLineY;
+ FX_FLOAT fLineWidth;
+ FX_FLOAT fLineAscent;
+ FX_FLOAT fLineDescent;
+};
+struct CPVT_WordInfo : public CFX_Object {
+ CPVT_WordInfo() : Word(0), nCharset(0),
+ fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
+ {
+ }
+ CPVT_WordInfo(FX_WORD word, FX_INT32 charset, FX_INT32 fontIndex, CPVT_WordProps * pProps):
+ Word(word), nCharset(charset), fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f),
+ nFontIndex(fontIndex), pWordProps(pProps)
+ {
+ }
+ virtual ~CPVT_WordInfo()
+ {
+ if (pWordProps) {
+ delete pWordProps;
+ }
+ }
+ CPVT_WordInfo(const CPVT_WordInfo & word): Word(0), nCharset(0),
+ fWordX(0.0f), fWordY(0.0f), fWordTail(0.0f), nFontIndex(-1), pWordProps(NULL)
+ {
+ operator = (word);
+ }
+ void operator = (const CPVT_WordInfo & word)
+ {
+ if (this == &word) {
+ return;
+ }
+ this->Word = word.Word;
+ this->nCharset = word.nCharset;
+ this->nFontIndex = word.nFontIndex;
+ if (word.pWordProps) {
+ if (pWordProps) {
+ *pWordProps = *word.pWordProps;
+ } else {
+ pWordProps = FX_NEW CPVT_WordProps(*word.pWordProps);
+ }
+ }
+ }
+ FX_WORD Word;
+ FX_INT32 nCharset;
+ FX_FLOAT fWordX;
+ FX_FLOAT fWordY;
+ FX_FLOAT fWordTail;
+ FX_INT32 nFontIndex;
+ CPVT_WordProps* pWordProps;
+};
+struct CPVT_FloatRange {
+ CPVT_FloatRange() : fMin(0.0f), fMax(0.0f)
+ {
+ }
+ CPVT_FloatRange(FX_FLOAT min, FX_FLOAT max) : fMin(min), fMax(max)
+ {
+ }
+ FX_FLOAT Range() const
+ {
+ return fMax - fMin;
+ }
+ FX_FLOAT fMin, fMax;
+};
+template<class TYPE> class CPVT_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ FX_BOOL IsEmpty()
+ {
+ return CFX_ArrayTemplate<TYPE>::GetSize() <= 0;
+ }
+ TYPE GetAt(int nIndex) const
+ {
+ if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+ return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
+ }
+ return NULL;
+ }
+ void RemoveAt(int nIndex)
+ {
+ if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) {
+ CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
+ }
+ }
+};
+class CLine : public CFX_Object
+{
+public:
+ CLine();
+ virtual ~CLine();
+ CPVT_WordPlace GetBeginWordPlace() const;
+ CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace LinePlace;
+ CPVT_LineInfo m_LineInfo;
+};
+class CLines
+{
+public:
+ CLines() : m_nTotal(0) {}
+ virtual ~CLines()
+ {
+ RemoveAll();
+ }
+ FX_INT32 GetSize() const
+ {
+ return m_Lines.GetSize();
+ }
+ CLine * GetAt(FX_INT32 nIndex) const
+ {
+ return m_Lines.GetAt(nIndex);
+ }
+ void Empty()
+ {
+ m_nTotal = 0;
+ }
+ void RemoveAll()
+ {
+ for (FX_INT32 i = 0, sz = GetSize(); i < sz; i++) {
+ delete GetAt(i);
+ }
+ m_Lines.RemoveAll();
+ m_nTotal = 0;
+ }
+ FX_INT32 Add(const CPVT_LineInfo & lineinfo)
+ {
+ if (m_nTotal >= GetSize()) {
+ if (CLine * pLine = FX_NEW CLine) {
+ pLine->m_LineInfo = lineinfo;
+ m_Lines.Add(pLine);
+ return m_nTotal++;
+ }
+ return m_nTotal;
+ } else {
+ if (CLine * pLine = GetAt(m_nTotal)) {
+ pLine->m_LineInfo = lineinfo;
+ }
+ return m_nTotal++;
+ }
+ }
+ void Clear()
+ {
+ for (FX_INT32 i = GetSize() - 1; i >= m_nTotal; i--) {
+ delete GetAt(i);
+ m_Lines.RemoveAt(i);
+ }
+ }
+private:
+ CPVT_ArrayTemplate<CLine*> m_Lines;
+ FX_INT32 m_nTotal;
+};
+class CSection : public CFX_Object
+{
+ friend class CTypeset;
+public:
+ CSection(CPDF_VariableText * pVT);
+ virtual ~CSection();
+ void ResetAll();
+ void ResetLineArray();
+ void ResetWordArray();
+ void ResetLinePlace();
+ CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ CPVT_WordPlace AddLine(const CPVT_LineInfo & lineinfo);
+ void ClearWords(const CPVT_WordRange & PlaceRange);
+ void ClearWord(const CPVT_WordPlace & place);
+ CPVT_FloatRect Rearrange();
+ CPVT_Size GetSectionSize(FX_FLOAT fFontSize);
+ CPVT_WordPlace GetBeginWordPlace() const;
+ CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ void UpdateWordPlace(CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
+ CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordPlace & lineplace) const;
+ CPVT_WordPlace SearchWordPlace(FX_FLOAT fx, const CPVT_WordRange & range) const;
+public:
+ CPVT_WordPlace SecPlace;
+ CPVT_SectionInfo m_SecInfo;
+ CLines m_LineArray;
+ CPVT_ArrayTemplate<CPVT_WordInfo*> m_WordArray;
+private:
+ void ClearLeftWords(FX_INT32 nWordIndex);
+ void ClearRightWords(FX_INT32 nWordIndex);
+ void ClearMidWords(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+
+ CPDF_VariableText *m_pVT;
+};
+class CTypeset
+{
+public:
+ CTypeset(CSection * pSection);
+ virtual ~CTypeset();
+ CPVT_Size GetEditSize(FX_FLOAT fFontSize);
+ CPVT_FloatRect Typeset();
+ CPVT_FloatRect CharArray();
+private:
+ void SplitLines(FX_BOOL bTypeset, FX_FLOAT fFontSize);
+ void OutputLines();
+
+ CPVT_FloatRect m_rcRet;
+ CPDF_VariableText * m_pVT;
+ CSection * m_pSection;
+};
+class CPDF_EditContainer
+{
+public:
+ CPDF_EditContainer(): m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {};
+ virtual ~CPDF_EditContainer() {};
+ virtual void SetPlateRect(const CPDF_Rect & rect)
+ {
+ m_rcPlate = rect;
+ };
+ virtual const CPDF_Rect & GetPlateRect() const
+ {
+ return m_rcPlate;
+ };
+ virtual void SetContentRect(const CPVT_FloatRect & rect)
+ {
+ m_rcContent = rect;
+ };
+ virtual CPDF_Rect GetContentRect() const
+ {
+ return m_rcContent;
+ };
+ FX_FLOAT GetPlateWidth() const
+ {
+ return m_rcPlate.right - m_rcPlate.left;
+ };
+ FX_FLOAT GetPlateHeight() const
+ {
+ return m_rcPlate.top - m_rcPlate.bottom;
+ };
+ CPVT_Size GetPlateSize() const
+ {
+ return CPVT_Size(GetPlateWidth(), GetPlateHeight());
+ };
+ CPDF_Point GetBTPoint() const
+ {
+ return CPDF_Point(m_rcPlate.left, m_rcPlate.top);
+ };
+ CPDF_Point GetETPoint() const
+ {
+ return CPDF_Point(m_rcPlate.right, m_rcPlate.bottom);
+ };
+ inline CPDF_Point InToOut(const CPDF_Point & point) const
+ {
+ return CPDF_Point(point.x + GetBTPoint().x, GetBTPoint().y - point.y);
+ };
+ inline CPDF_Point OutToIn(const CPDF_Point & point) const
+ {
+ return CPDF_Point(point.x - GetBTPoint().x, GetBTPoint().y - point.y);
+ };
+ inline CPDF_Rect InToOut(const CPVT_FloatRect & rect) const
+ {
+ CPDF_Point ptLeftTop = InToOut(CPDF_Point(rect.left, rect.top));
+ CPDF_Point ptRightBottom = InToOut(CPDF_Point(rect.right, rect.bottom));
+ return CPDF_Rect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, ptLeftTop.y);
+ };
+ inline CPVT_FloatRect OutToIn(const CPDF_Rect & rect) const
+ {
+ CPDF_Point ptLeftTop = OutToIn(CPDF_Point(rect.left, rect.top));
+ CPDF_Point ptRightBottom = OutToIn(CPDF_Point(rect.right, rect.bottom));
+ return CPVT_FloatRect(ptLeftTop.x, ptLeftTop.y, ptRightBottom.x, ptRightBottom.y);
+ };
+
+private:
+ CPDF_Rect m_rcPlate;
+ CPVT_FloatRect m_rcContent;
+};
+class CPDF_VariableText : public IPDF_VariableText, public CFX_Object, private CPDF_EditContainer
+{
+ friend class CTypeset;
+ friend class CSection;
+ friend class CPDF_VariableText_Iterator;
+public:
+ CPDF_VariableText();
+ virtual ~CPDF_VariableText();
+ IPDF_VariableText_Provider* SetProvider(IPDF_VariableText_Provider * pProvider);
+ IPDF_VariableText_Iterator* GetIterator();
+ void SetPlateRect(const CPDF_Rect & rect)
+ {
+ CPDF_EditContainer::SetPlateRect(rect);
+ }
+ void SetAlignment(FX_INT32 nFormat = 0)
+ {
+ m_nAlignment = nFormat;
+ }
+ void SetPasswordChar(FX_WORD wSubWord = '*')
+ {
+ m_wSubWord = wSubWord;
+ }
+ void SetLimitChar(FX_INT32 nLimitChar = 0)
+ {
+ m_nLimitChar = nLimitChar;
+ }
+ void SetCharSpace(FX_FLOAT fCharSpace = 0.0f)
+ {
+ m_fCharSpace = fCharSpace;
+ }
+ void SetHorzScale(FX_INT32 nHorzScale = 100)
+ {
+ m_nHorzScale = nHorzScale;
+ }
+ void SetMultiLine(FX_BOOL bMultiLine = TRUE)
+ {
+ m_bMultiLine = bMultiLine;
+ }
+ void SetAutoReturn(FX_BOOL bAuto = TRUE)
+ {
+ m_bLimitWidth = bAuto;
+ }
+ void SetFontSize(FX_FLOAT fFontSize)
+ {
+ m_fFontSize = fFontSize;
+ }
+ void SetCharArray(FX_INT32 nCharArray = 0)
+ {
+ m_nCharArray = nCharArray;
+ }
+ void SetAutoFontSize(FX_BOOL bAuto = TRUE)
+ {
+ m_bAutoFontSize = bAuto;
+ }
+ void SetRichText(FX_BOOL bRichText)
+ {
+ m_bRichText = bRichText;
+ }
+ void SetLineLeading(FX_FLOAT fLineLeading)
+ {
+ m_fLineLeading = fLineLeading;
+ }
+ void Initialize();
+ FX_BOOL IsValid() const
+ {
+ return m_bInitial;
+ }
+ FX_BOOL IsRichText() const
+ {
+ return m_bRichText;
+ }
+ void RearrangeAll();
+ void RearrangePart(const CPVT_WordRange & PlaceRange);
+ void ResetAll();
+ void SetText(FX_LPCWSTR text, FX_INT32 charset = 1, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertWord(const CPVT_WordPlace & place, FX_WORD word, FX_INT32 charset = 1,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertSection(const CPVT_WordPlace & place, const CPVT_SecProps * pSecProps = NULL,
+ const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace InsertText(const CPVT_WordPlace & place, FX_LPCWSTR text, FX_INT32 charset = 1,
+ const CPVT_SecProps * pSecProps = NULL, const CPVT_WordProps * pWordProps = NULL);
+ CPVT_WordPlace DeleteWords(const CPVT_WordRange & PlaceRange);
+ CPVT_WordPlace DeleteWord(const CPVT_WordPlace & place);
+ CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace & place);
+ const CPDF_Rect & GetPlateRect() const
+ {
+ return CPDF_EditContainer::GetPlateRect();
+ }
+ CPDF_Rect GetContentRect() const;
+ FX_INT32 GetTotalWords() const;
+ FX_FLOAT GetFontSize() const
+ {
+ return m_fFontSize;
+ }
+ FX_INT32 GetAlignment() const
+ {
+ return m_nAlignment;
+ }
+ FX_INT32 GetCharArray() const
+ {
+ return m_nCharArray;
+ }
+ FX_INT32 GetLimitChar() const
+ {
+ return m_nLimitChar;
+ }
+ FX_BOOL IsMultiLine() const
+ {
+ return m_bMultiLine;
+ }
+ FX_INT32 GetHorzScale() const
+ {
+ return m_nHorzScale;
+ }
+ FX_FLOAT GetCharSpace() const
+ {
+ return m_fCharSpace;
+ }
+
+ inline CPVT_WordPlace GetBeginWordPlace() const;
+ inline CPVT_WordPlace GetEndWordPlace() const;
+ CPVT_WordPlace GetPrevWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetNextWordPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point & point) const;
+ CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
+ CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace & place, const CPDF_Point & point) const;
+ CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const;
+ void UpdateWordPlace(CPVT_WordPlace & place) const;
+ FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
+ FX_WORD GetPasswordChar() const
+ {
+ return GetSubWord();
+ }
+ FX_WORD GetSubWord() const
+ {
+ return m_wSubWord;
+ }
+private:
+ FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord, FX_INT32 nWordStyle);
+ FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
+ FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
+ FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
+ FX_INT32 GetDefaultFontIndex();
+ FX_BOOL IsLatinWord(FX_WORD word);
+private:
+
+ CPVT_WordPlace AddSection(const CPVT_WordPlace & place, const CPVT_SectionInfo & secinfo);
+ CPVT_WordPlace AddLine(const CPVT_WordPlace & place, const CPVT_LineInfo & lineinfo);
+ CPVT_WordPlace AddWord(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ FX_BOOL GetWordInfo(const CPVT_WordPlace & place, CPVT_WordInfo & wordinfo);
+ FX_BOOL SetWordInfo(const CPVT_WordPlace & place, const CPVT_WordInfo & wordinfo);
+ FX_BOOL GetLineInfo(const CPVT_WordPlace & place, CPVT_LineInfo & lineinfo);
+ FX_BOOL GetSectionInfo(const CPVT_WordPlace & place, CPVT_SectionInfo & secinfo);
+ FX_FLOAT GetWordFontSize(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetWordWidth(FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord,
+ FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ FX_FLOAT fFontSize, FX_FLOAT fWordTail, FX_INT32 nWordStyle);
+ FX_FLOAT GetWordWidth(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
+ FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_FLOAT fFontSize);
+ FX_FLOAT GetWordAscent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetWordDescent(const CPVT_WordInfo & WordInfo, FX_BOOL bFactFontSize = FALSE);
+ FX_FLOAT GetLineAscent(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetLineDescent(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetFontAscent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
+ FX_FLOAT GetFontDescent(FX_INT32 nFontIndex, FX_FLOAT fFontSize);
+ FX_INT32 GetWordFontIndex(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetCharSpace(const CPVT_WordInfo & WordInfo);
+ FX_INT32 GetHorzScale(const CPVT_WordInfo & WordInfo);
+ FX_FLOAT GetLineLeading(const CPVT_SectionInfo & SecInfo);
+ FX_FLOAT GetLineIndent(const CPVT_SectionInfo & SecInfo);
+ FX_INT32 GetAlignment(const CPVT_SectionInfo& SecInfo);
+
+ void ClearSectionRightWords(const CPVT_WordPlace & place);
+ CPVT_WordPlace AjustLineHeader(const CPVT_WordPlace & place, FX_BOOL bPrevOrNext) const;
+ FX_BOOL ClearEmptySection(const CPVT_WordPlace & place);
+ void ClearEmptySections(const CPVT_WordRange & PlaceRange);
+ void LinkLatterSection(const CPVT_WordPlace & place);
+ void ClearWords(const CPVT_WordRange & PlaceRange);
+ CPVT_WordPlace ClearLeftWord(const CPVT_WordPlace & place);
+ CPVT_WordPlace ClearRightWord(const CPVT_WordPlace & place);
+private:
+ CPVT_FloatRect Rearrange(const CPVT_WordRange & PlaceRange);
+ FX_FLOAT GetAutoFontSize();
+ FX_BOOL IsBigger(FX_FLOAT fFontSize);
+ CPVT_FloatRect RearrangeSections(const CPVT_WordRange & PlaceRange);
+private:
+ void ResetSectionArray();
+private:
+ CPVT_ArrayTemplate<CSection*> m_SectionArray;
+ FX_INT32 m_nLimitChar;
+ FX_INT32 m_nCharArray;
+ FX_BOOL m_bMultiLine;
+ FX_BOOL m_bLimitWidth;
+ FX_BOOL m_bAutoFontSize;
+ FX_INT32 m_nAlignment;
+ FX_FLOAT m_fLineLeading;
+ FX_FLOAT m_fCharSpace;
+ FX_INT32 m_nHorzScale;
+ FX_WORD m_wSubWord;
+ FX_FLOAT m_fWordSpace;
+ FX_FLOAT m_fFontSize;
+
+private:
+ FX_BOOL m_bInitial;
+ FX_BOOL m_bRichText;
+ FX_FLOAT m_fCaretOriginX;
+ FX_INT32 m_nCurFontIndex;
+ IPDF_VariableText_Provider * m_pVTProvider;
+ CPDF_VariableText_Iterator * m_pVTIterator;
+};
+class CPDF_VariableText_Iterator : public IPDF_VariableText_Iterator, public CFX_Object
+{
+public:
+ CPDF_VariableText_Iterator(CPDF_VariableText * pVT);
+ virtual ~CPDF_VariableText_Iterator();
+ FX_BOOL NextWord();
+ FX_BOOL PrevWord();
+ FX_BOOL NextLine();
+ FX_BOOL PrevLine();
+ FX_BOOL NextSection();
+ FX_BOOL PrevSection();
+ FX_BOOL SetWord(const CPVT_Word & word);
+ FX_BOOL GetWord(CPVT_Word & word) const;
+ FX_BOOL GetLine(CPVT_Line & line) const;
+ FX_BOOL GetSection(CPVT_Section & section) const;
+ FX_BOOL SetSection(const CPVT_Section & section);
+ void SetAt(FX_INT32 nWordIndex);
+ void SetAt(const CPVT_WordPlace & place);
+ const CPVT_WordPlace & GetAt() const
+ {
+ return m_CurPos;
+ };
+private:
+ CPVT_WordPlace m_CurPos;
+ CPDF_VariableText * m_pVT;
+};
diff --git a/core/src/fpdfdoc/tagged_int.h b/core/src/fpdfdoc/tagged_int.h
new file mode 100644
index 0000000000..a343a801f3
--- /dev/null
+++ b/core/src/fpdfdoc/tagged_int.h
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_TAGGED_INT_H_
+#define _FPDF_TAGGED_INT_H_
+class CPDF_StructTreeImpl;
+class CPDF_StructElementImpl;
+class CPDF_StructTreeImpl : public CPDF_StructTree
+{
+public:
+ CPDF_StructTreeImpl(const CPDF_Document* pDoc);
+ ~CPDF_StructTreeImpl();
+ int CountTopElements() const
+ {
+ return m_Kids.GetSize();
+ }
+ CPDF_StructElement* GetTopElement(int i) const
+ {
+ return (CPDF_StructElement*)m_Kids.GetAt(i);
+ }
+ void LoadDocTree();
+ void LoadPageTree(const CPDF_Dictionary* pPageDict);
+ CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);
+ FX_BOOL AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);
+protected:
+ const CPDF_Dictionary* m_pTreeRoot;
+ const CPDF_Dictionary* m_pRoleMap;
+ const CPDF_Dictionary* m_pPage;
+ CFX_ArrayTemplate<CPDF_StructElementImpl*> m_Kids;
+ friend class CPDF_StructElementImpl;
+};
+class CPDF_StructElementImpl : public CPDF_StructElement
+{
+public:
+ CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);
+ ~CPDF_StructElementImpl();
+ CPDF_StructTree* GetTree() const
+ {
+ return m_pTree;
+ }
+ const CFX_ByteString& GetType() const
+ {
+ return m_Type;
+ }
+ CPDF_StructElement* GetParent() const
+ {
+ return m_pParent;
+ }
+ CPDF_Dictionary * GetDict() const
+ {
+ return m_pDict;
+ }
+ int CountKids() const
+ {
+ return m_Kids.GetSize();
+ }
+ const CPDF_StructKid& GetKid(int index) const
+ {
+ return m_Kids.GetData()[index];
+ }
+ CFX_PtrArray* GetObjectArray()
+ {
+ return &m_ObjectArray;
+ }
+
+ CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);
+
+ CFX_ByteString GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ FX_ARGB GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ FX_FLOAT GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ int GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
+ CFX_PtrArray m_ObjectArray;
+ void LoadKids(CPDF_Dictionary* pDict);
+ void LoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
+ CPDF_Object* GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);
+ CPDF_StructElementImpl* Retain();
+ void Release();
+protected:
+ CPDF_StructTreeImpl* m_pTree;
+ CFX_ByteString m_Type;
+ CPDF_StructElementImpl* m_pParent;
+ CPDF_Dictionary* m_pDict;
+ CFX_ArrayTemplate<CPDF_StructKid> m_Kids;
+
+ int m_RefCount;
+ friend class CPDF_StructTreeImpl;
+};
+#endif
diff --git a/core/src/fpdftext/fpdf_text.cpp b/core/src/fpdftext/fpdf_text.cpp
new file mode 100644
index 0000000000..2576b757b6
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text.cpp
@@ -0,0 +1,791 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "txtproc.h"
+#include "text_int.h"
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);
+CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)
+{
+ if (destcp == 0) {
+ if (unicode < 0x80) {
+ return CFX_ByteString((char)unicode);
+ }
+ FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+ if (altstr) {
+ return CFX_ByteString(altstr, -1);
+ }
+ return CFX_ByteString(defchar, -1);
+ }
+ FX_BOOL bDef = FALSE;
+ char buf[10];
+ int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);
+ if (ret && !bDef) {
+ return CFX_ByteString(buf, ret);
+ }
+ FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+ if (altstr) {
+ return CFX_ByteString(altstr, -1);
+ }
+ return CFX_ByteString(defchar, -1);
+}
+CTextPage::CTextPage()
+{
+}
+CTextPage::~CTextPage()
+{
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ delete pBaseLine;
+ }
+ for (i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ delete pTextColumn;
+ }
+}
+void CTextPage::ProcessObject(CPDF_PageObject* pObject)
+{
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ return;
+ }
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObject;
+ CPDF_Font* pFont = pText->m_TextState.GetFont();
+ int count = pText->CountItems();
+ FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);
+ if (pPosArray) {
+ pText->CalcCharPos(pPosArray);
+ }
+ FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();
+ FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT spacew = 0;
+ if (space_charcode != -1) {
+ spacew = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000;
+ }
+ if (spacew == 0) {
+ spacew = fontsize_h / 4;
+ }
+ if (pText->m_TextState.GetBaselineAngle() != 0) {
+ int cc = 0;
+ CFX_AffineMatrix matrix;
+ pText->GetTextMatrix(&matrix);
+ for (int i = 0; i < pText->m_nChars; i ++) {
+ FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_RECT char_box;
+ pFont->GetCharBBox(charcode, char_box);
+ FX_FLOAT char_left = pPosArray ? pPosArray[cc * 2] : char_box.left * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_right = pPosArray ? pPosArray[cc * 2 + 1] : char_box.right * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_top = char_box.top * pText->m_TextState.GetFontSize() / 1000;
+ FX_FLOAT char_bottom = char_box.bottom * pText->m_TextState.GetFontSize() / 1000;
+ cc ++;
+ FX_FLOAT char_origx, char_origy;
+ matrix.Transform(char_left, 0, char_origx, char_origy);
+ matrix.TransformRect(char_left, char_right, char_top, char_bottom);
+ CFX_ByteString str;
+ pFont->AppendChar(str, charcode);
+ InsertTextBox(NULL, char_origy, char_left, char_right, char_top,
+ char_bottom, spacew, fontsize_v, str, pFont);
+ }
+ if (pPosArray) {
+ FX_Free(pPosArray);
+ }
+ return;
+ }
+ FX_FLOAT ratio_h = fontsize_h / pText->m_TextState.GetFontSize();
+ for (int ii = 0; ii < count * 2; ii ++) {
+ pPosArray[ii] *= ratio_h;
+ }
+ FX_FLOAT baseline = pText->m_PosY;
+ CTextBaseLine* pBaseLine = NULL;
+ FX_FLOAT topy = pText->m_Top;
+ FX_FLOAT bottomy = pText->m_Bottom;
+ FX_FLOAT leftx = pText->m_Left;
+ int cc = 0;
+ CFX_ByteString segment;
+ int space_count = 0;
+ FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;
+ for (int i = 0; i < pText->m_nChars; i ++) {
+ FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+ if (charcode == (FX_DWORD) - 1) {
+ continue;
+ }
+ FX_FLOAT char_left = pPosArray[cc * 2];
+ FX_FLOAT char_right = pPosArray[cc * 2 + 1];
+ cc ++;
+ if (char_left < last_left || (char_left - last_right) > spacew / 2) {
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ segment_left = char_left;
+ segment = "";
+ }
+ CFX_WideString wCh = pText->GetFont()->UnicodeFromCharCode(charcode);
+ FX_DWORD ch = wCh.GetLength() > 0 ? wCh.GetAt(0) : charcode;
+ if (space_count > 1) {
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ segment = "";
+ } else if (space_count == 1) {
+ pFont->AppendChar(segment, ' ');
+ }
+ if (segment.GetLength() == 0) {
+ segment_left = char_left;
+ }
+ segment_right = char_right;
+ pFont->AppendChar(segment, charcode);
+ space_count = 0;
+ last_left = char_left;
+ last_right = char_right;
+ }
+ if (segment.GetLength())
+ pBaseLine = InsertTextBox(pBaseLine, baseline, leftx + segment_left, leftx + segment_right,
+ topy, bottomy, spacew, fontsize_v, segment, pFont);
+ FX_Free(pPosArray);
+}
+static void ConvertPDFString(CFX_ByteString& result, CFX_ByteString& src, CPDF_Font* pFont);
+CTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
+ FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
+ CFX_ByteString& str, CPDF_Font* pFont)
+{
+ if (str.GetLength() == 0) {
+ return NULL;
+ }
+ if (pBaseLine == NULL) {
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pExistLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ if (pExistLine->m_BaseLine == basey) {
+ pBaseLine = pExistLine;
+ break;
+ }
+ if (pExistLine->m_BaseLine < basey) {
+ break;
+ }
+ }
+ if (pBaseLine == NULL) {
+ pBaseLine = FX_NEW CTextBaseLine;
+ if (NULL == pBaseLine) {
+ return NULL;
+ }
+ pBaseLine->m_BaseLine = basey;
+ m_BaseLines.InsertAt(i, pBaseLine);
+ }
+ }
+ CFX_WideString text;
+ FX_LPCSTR pStr = str;
+ int len = str.GetLength(), offset = 0;
+ while (offset < len) {
+ FX_DWORD ch = pFont->GetNextChar(pStr, offset);
+ CFX_WideString unicode_str = pFont->UnicodeFromCharCode(ch);
+ text += unicode_str;
+ }
+ pBaseLine->InsertTextBox(leftx, rightx, topy, bottomy, spacew, fontsize_v, text);
+ return pBaseLine;
+}
+void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)
+{
+ FX_FLOAT lastheight = -1;
+ FX_FLOAT lastbaseline = -1;
+ FX_FLOAT MinLeftX = 1000000;
+ FX_FLOAT MaxRightX = 0;
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ FX_FLOAT leftx, rightx;
+ if (pBaseLine->GetWidth(leftx, rightx)) {
+ if (leftx < MinLeftX) {
+ MinLeftX = leftx;
+ }
+ if (rightx > MaxRightX) {
+ MaxRightX = rightx;
+ }
+ }
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ pBaseLine->MergeBoxes();
+ }
+ for (i = 1; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ CTextBaseLine* pPrevLine = (CTextBaseLine*)m_BaseLines.GetAt(i - 1);
+ if (pBaseLine->CanMerge(pPrevLine)) {
+ pPrevLine->Merge(pBaseLine);
+ delete pBaseLine;
+ m_BaseLines.RemoveAt(i);
+ i --;
+ }
+ }
+ if (m_bAutoWidth) {
+ int* widths = FX_Alloc(int, m_BaseLines.GetSize());
+ if (widths) {
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ widths[i] = 0;
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ int TotalChars = 0;
+ FX_FLOAT TotalWidth = 0;
+ int minchars;
+ pBaseLine->CountChars(TotalChars, TotalWidth, minchars);
+ if (TotalChars) {
+ FX_FLOAT charwidth = TotalWidth / TotalChars;
+ widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);
+ }
+ if (widths[i] > 1000) {
+ widths[i] = 1000;
+ }
+ if (widths[i] < minchars) {
+ widths[i] = minchars;
+ }
+ }
+ int AvgWidth = 0, widthcount = 0;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++)
+ if (widths[i]) {
+ AvgWidth += widths[i];
+ widthcount ++;
+ }
+ AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);
+ int MaxWidth = 0;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++)
+ if (MaxWidth < widths[i]) {
+ MaxWidth = widths[i];
+ }
+ if (MaxWidth > AvgWidth * 6 / 5) {
+ MaxWidth = AvgWidth * 6 / 5;
+ }
+ FX_Free(widths);
+ if (iMinWidth < MaxWidth) {
+ iMinWidth = MaxWidth;
+ }
+ }
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ pBaseLine->MergeBoxes();
+ }
+ if (m_bKeepColumn) {
+ FindColumns();
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ if (lastheight >= 0) {
+ FX_FLOAT dy = lastbaseline - pBaseLine->m_BaseLine;
+ if (dy >= (pBaseLine->m_MaxFontSizeV) * 1.5 || dy >= lastheight * 1.5) {
+ lines.Add(L"");
+ }
+ }
+ lastheight = pBaseLine->m_MaxFontSizeV;
+ lastbaseline = pBaseLine->m_BaseLine;
+ CFX_WideString str;
+ pBaseLine->WriteOutput(str, MinLeftX, MaxRightX - MinLeftX, iMinWidth);
+ lines.Add(str);
+ }
+}
+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)
+{
+ wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount < 1 ) {
+ sDest += wChar;
+ return;
+ }
+ pDst = new FX_WCHAR[nCount];
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ sDest += pDst[nIndex];
+ }
+ delete[] pDst;
+}
+void NormalizeString(CFX_WideString& str)
+{
+ if (str.GetLength() <= 0) {
+ return;
+ }
+ CFX_WideString sBuffer;
+ IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
+ if (NULL == BidiChar) {
+ return;
+ }
+ CFX_WordArray order;
+ FX_BOOL bR2L = FALSE;
+ FX_INT32 start = 0, count = 0, i = 0;
+ int nR2L = 0, nL2R = 0;
+ for (i = 0; i < str.GetLength(); i++) {
+ if(BidiChar->AppendChar(str.GetAt(i))) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if (ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ }
+ if(BidiChar->EndChar()) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if(ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ if(nR2L > 0 && nR2L >= nL2R) {
+ bR2L = TRUE;
+ }
+ if(bR2L) {
+ int count = order.GetSize();
+ for(int j = count - 1; j > 0; j -= 3) {
+ int ret = order.GetAt(j);
+ int start = order.GetAt(j - 2);
+ int count1 = order.GetAt(j - 1);
+ if(ret == 2 || ret == 0) {
+ for(int i = start + count1 - 1; i >= start; i--) {
+ NormalizeCompositeChar(str[i], sBuffer);
+ }
+ } else {
+ i = j;
+ FX_BOOL bSymbol = FALSE;
+ while(i > 0 && order.GetAt(i) != 2) {
+ bSymbol = !order.GetAt(i);
+ i -= 3;
+ }
+ int end = start + count1 ;
+ int n = 0;
+ if(bSymbol) {
+ n = i + 6;
+ } else {
+ n = i + 3;
+ }
+ if(n >= j) {
+ for(int m = start; m < end; m++) {
+ sBuffer += str[m];
+ }
+ } else {
+ i = j;
+ j = n;
+ for(; n <= i; n += 3) {
+ int ret = order.GetAt(n);
+ int start = order.GetAt(n - 2);
+ int count1 = order.GetAt(n - 1);
+ int end = start + count1 ;
+ for(int m = start; m < end; m++) {
+ sBuffer += str[m];
+ }
+ }
+ }
+ }
+ }
+ } else {
+ int count = order.GetSize();
+ FX_BOOL bL2R = FALSE;
+ for(int j = 0; j < count; j += 3) {
+ int ret = order.GetAt(j + 2);
+ int start = order.GetAt(j);
+ int count1 = order.GetAt(j + 1);
+ if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
+ int i = j + 3;
+ while(bR2L && i < count) {
+ if(order.GetAt(i + 2) == 1) {
+ break;
+ } else {
+ i += 3;
+ }
+ }
+ if(i == 3) {
+ j = -3;
+ bL2R = TRUE;
+ continue;
+ }
+ int end = str.GetLength() - 1;
+ if(i < count) {
+ end = order.GetAt(i) - 1;
+ }
+ j = i - 3;
+ for(int n = end; n >= start; n--) {
+ NormalizeCompositeChar(str[i], sBuffer);
+ }
+ } else {
+ int end = start + count1 ;
+ for(int i = start; i < end; i++) {
+ sBuffer += str[i];
+ }
+ }
+ }
+ }
+ str.Empty();
+ str += sBuffer;
+ BidiChar->Release();
+}
+static FX_BOOL IsNumber(CFX_WideString& str)
+{
+ for (int i = 0; i < str.GetLength(); i ++) {
+ FX_WCHAR ch = str[i];
+ if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CTextPage::FindColumns()
+{
+ int i;
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
+ CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
+ CTextColumn* pColumn = FindColumn(pTextBox->m_Right);
+ if (pColumn == NULL) {
+ pColumn = FX_NEW CTextColumn;
+ if (pColumn) {
+ pColumn->m_Count = 1;
+ pColumn->m_AvgPos = pTextBox->m_Right;
+ pColumn->m_TextPos = -1;
+ m_TextColumns.Add(pColumn);
+ }
+ } else {
+ pColumn->m_AvgPos = (pColumn->m_Count * pColumn->m_AvgPos + pTextBox->m_Right) /
+ (pColumn->m_Count + 1);
+ pColumn->m_Count ++;
+ }
+ }
+ }
+ int mincount = m_BaseLines.GetSize() / 4;
+ for (i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pTextColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ if (pTextColumn->m_Count >= mincount) {
+ continue;
+ }
+ delete pTextColumn;
+ m_TextColumns.RemoveAt(i);
+ i --;
+ }
+ for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+ CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+ for (int j = 0; j < pBaseLine->m_TextList.GetSize(); j ++) {
+ CTextBox* pTextBox = (CTextBox*)pBaseLine->m_TextList.GetAt(j);
+ if (IsNumber(pTextBox->m_Text)) {
+ pTextBox->m_pColumn = FindColumn(pTextBox->m_Right);
+ }
+ }
+ }
+}
+CTextColumn* CTextPage::FindColumn(FX_FLOAT xpos)
+{
+ for (int i = 0; i < m_TextColumns.GetSize(); i ++) {
+ CTextColumn* pColumn = (CTextColumn*)m_TextColumns.GetAt(i);
+ if (pColumn->m_AvgPos < xpos + 1 && pColumn->m_AvgPos > xpos - 1) {
+ return pColumn;
+ }
+ }
+ return NULL;
+}
+void CTextPage::BreakSpace(CPDF_TextObject* pTextObj)
+{
+}
+CTextBaseLine::CTextBaseLine()
+{
+ m_Top = -100000;
+ m_Bottom = 100000;
+ m_MaxFontSizeV = 0;
+}
+CTextBaseLine::~CTextBaseLine()
+{
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ delete pText;
+ }
+}
+void CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
+ FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& text)
+{
+ if (m_Top < topy) {
+ m_Top = topy;
+ }
+ if (m_Bottom > bottomy) {
+ m_Bottom = bottomy;
+ }
+ if (m_MaxFontSizeV < fontsize_v) {
+ m_MaxFontSizeV = fontsize_v;
+ }
+ int i;
+ for (i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Left > leftx) {
+ break;
+ }
+ }
+ CTextBox* pText = FX_NEW CTextBox;
+ if (NULL == pText) {
+ return;
+ }
+ pText->m_Text = text;
+ pText->m_Left = leftx;
+ pText->m_Right = rightx;
+ pText->m_Top = topy;
+ pText->m_Bottom = bottomy;
+ pText->m_SpaceWidth = spacew;
+ pText->m_FontSizeV = fontsize_v;
+ pText->m_pColumn = NULL;
+ m_TextList.InsertAt(i, pText);
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+ FX_FLOAT& interlow, FX_FLOAT& interhigh);
+FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)
+{
+ FX_FLOAT inter_top, inter_bottom;
+ if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,
+ inter_bottom, inter_top)) {
+ return FALSE;
+ }
+ FX_FLOAT inter_h = inter_top - inter_bottom;
+ if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {
+ return FALSE;
+ }
+ FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ FX_FLOAT width = pText->m_Right - pText->m_Left;
+ for (int j = 0; j < pOther->m_TextList.GetSize(); j ++) {
+ CTextBox* pOtherText = (CTextBox*)pOther->m_TextList.GetAt(j);
+ FX_FLOAT inter_left, inter_right;
+ if (!GetIntersection(pText->m_Left, pText->m_Right,
+ pOtherText->m_Left, pOtherText->m_Right, inter_left, inter_right)) {
+ continue;
+ }
+ FX_FLOAT inter_w = inter_right - inter_left;
+ if (inter_w < pText->m_SpaceWidth / 2 && inter_w < pOtherText->m_SpaceWidth / 2) {
+ continue;
+ }
+ if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||
+ dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+void CTextBaseLine::Merge(CTextBaseLine* pOther)
+{
+ for (int i = 0; i < pOther->m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)pOther->m_TextList.GetAt(i);
+ InsertTextBox(pText->m_Left, pText->m_Right, pText->m_Top, pText->m_Bottom,
+ pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);
+ }
+}
+FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
+{
+ int i;
+ for (i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Text != L" ") {
+ break;
+ }
+ }
+ if (i == m_TextList.GetSize()) {
+ return FALSE;
+ }
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ leftx = pText->m_Left;
+ for (i = m_TextList.GetSize() - 1; i >= 0; i --) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Text != L" ") {
+ break;
+ }
+ }
+ pText = (CTextBox*)m_TextList.GetAt(i);
+ rightx = pText->m_Right;
+ return TRUE;
+}
+void CTextBaseLine::MergeBoxes()
+{
+ int i = 0;
+ while (1) {
+ if (i >= m_TextList.GetSize() - 1) {
+ break;
+ }
+ CTextBox* pThisText = (CTextBox*)m_TextList.GetAt(i);
+ CTextBox* pNextText = (CTextBox*)m_TextList.GetAt(i + 1);
+ FX_FLOAT dx = pNextText->m_Left - pThisText->m_Right;
+ FX_FLOAT spacew = (pThisText->m_SpaceWidth == 0.0) ?
+ pNextText->m_SpaceWidth : pThisText->m_SpaceWidth;
+ if (spacew > 0.0 && dx < spacew * 2) {
+ pThisText->m_Right = pNextText->m_Right;
+ if (dx > spacew * 1.5) {
+ pThisText->m_Text += L" ";
+ } else if (dx > spacew / 3) {
+ pThisText->m_Text += L' ';
+ }
+ pThisText->m_Text += pNextText->m_Text;
+ pThisText->m_SpaceWidth = pNextText->m_SpaceWidth == 0.0 ?
+ spacew : pNextText->m_SpaceWidth;
+ m_TextList.RemoveAt(i + 1);
+ delete pNextText;
+ } else {
+ i ++;
+ }
+ }
+}
+void CTextBaseLine::WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT pagewidth,
+ int iTextWidth)
+{
+ int lastpos = -1;
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ int xpos;
+ if (pText->m_pColumn) {
+ xpos = (int)((pText->m_pColumn->m_AvgPos - leftx) * iTextWidth / pagewidth + 0.5);
+ xpos -= pText->m_Text.GetLength();
+ } else {
+ xpos = (int)((pText->m_Left - leftx) * iTextWidth / pagewidth + 0.5);
+ }
+ if (xpos <= lastpos) {
+ xpos = lastpos + 1;
+ }
+ for (int j = lastpos + 1; j < xpos; j ++) {
+ str += ' ';
+ }
+ CFX_WideString sSrc(pText->m_Text);
+ NormalizeString(sSrc);
+ str += sSrc;
+ str += ' ';
+ lastpos = xpos + pText->m_Text.GetLength();
+ }
+}
+void CTextBaseLine::CountChars(int& count, FX_FLOAT& width, int& minchars)
+{
+ minchars = 0;
+ for (int i = 0; i < m_TextList.GetSize(); i ++) {
+ CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
+ if (pText->m_Right - pText->m_Left < 0.002) {
+ continue;
+ }
+ count += pText->m_Text.GetLength();
+ width += pText->m_Right - pText->m_Left;
+ minchars += pText->m_Text.GetLength() + 1;
+ }
+}
+#define PI 3.1415926535897932384626433832795
+static void CheckRotate(CPDF_Page& page, CFX_FloatRect& page_bbox)
+{
+ int total_count = 0, rotated_count[3] = {0, 0, 0};
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObj = page.GetNextObject(pos);
+ if (pObj->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ total_count ++;
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+ FX_FLOAT angle = pText->m_TextState.GetBaselineAngle();
+ if (angle == 0.0) {
+ continue;
+ }
+ int degree = (int)(angle * 180 / PI + 0.5);
+ if (degree % 90) {
+ continue;
+ }
+ if (degree < 0) {
+ degree += 360;
+ }
+ int index = degree / 90 % 3 - 1;
+ if (index < 0) {
+ continue;
+ }
+ rotated_count[index] ++;
+ }
+ if (total_count == 0) {
+ return;
+ }
+ CFX_AffineMatrix matrix;
+ if (rotated_count[0] > total_count * 2 / 3) {
+ matrix.Set(0, -1, 1, 0, 0, page.GetPageHeight());
+ } else if (rotated_count[1] > total_count * 2 / 3) {
+ matrix.Set(-1, 0, 0, -1, page.GetPageWidth(), page.GetPageHeight());
+ } else if (rotated_count[2] > total_count * 2 / 3) {
+ matrix.Set(0, 1, -1, 0, page.GetPageWidth(), 0);
+ } else {
+ return;
+ }
+ page.Transform(matrix);
+ page_bbox.Transform(&matrix);
+}
+void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags)
+{
+ lines.RemoveAll();
+ if (pPage == NULL) {
+ return;
+ }
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ CFX_FloatRect page_bbox = page.GetPageBBox();
+ if (flags & PDF2TXT_AUTO_ROTATE) {
+ CheckRotate(page, page_bbox);
+ }
+ CTextPage texts;
+ texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;
+ texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;
+ texts.m_bBreakSpace = TRUE;
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = page.GetNextObject(pos);
+ if (!(flags & PDF2TXT_INCLUDE_INVISIBLE)) {
+ CFX_FloatRect rect(pObject->m_Left, pObject->m_Bottom, pObject->m_Right, pObject->m_Top);
+ if (!page_bbox.Contains(rect)) {
+ continue;
+ }
+ }
+ texts.ProcessObject(pObject);
+ }
+ texts.WriteOutput(lines, iMinWidth);
+}
+void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dictionary* pPage,
+ int iMinWidth, FX_DWORD flags)
+{
+ lines.RemoveAll();
+ CFX_WideStringArray wlines;
+ PDF_GetPageText_Unicode(wlines, pDoc, pPage, iMinWidth, flags);
+ for (int i = 0; i < wlines.GetSize(); i ++) {
+ CFX_WideString wstr = wlines[i];
+ CFX_ByteString str;
+ for (int c = 0; c < wstr.GetLength(); c ++) {
+ str += CharFromUnicodeAlt(wstr[c], FXSYS_GetACP(), "?");
+ }
+ lines.Add(str);
+ }
+}
+#endif
+extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
+ CFX_PtrArray* pObjArray);
+void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)
+{
+ buffer.EstimateSize(0, 10240);
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);
+}
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
new file mode 100644
index 0000000000..36b0442ffc
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -0,0 +1,2804 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_resource.h"
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+#include "../../include/fpdfapi/fpdf_module.h"
+#include <ctype.h>
+#include "text_int.h"
+FX_BOOL _IsIgnoreSpaceCharacter(FX_WCHAR curChar)
+{
+ if(curChar < 255 ) {
+ return FALSE;
+ }
+ if ( (curChar >= 0x0600 && curChar <= 0x06FF)
+ || (curChar >= 0xFE70 && curChar <= 0xFEFF)
+ || (curChar >= 0xFB50 && curChar <= 0xFDFF)
+ || (curChar >= 0x0400 && curChar <= 0x04FF)
+ || (curChar >= 0x0500 && curChar <= 0x052F)
+ || (curChar >= 0xA640 && curChar <= 0xA69F)
+ || (curChar >= 0x2DE0 && curChar <= 0x2DFF)
+ || curChar == 8467
+ || (curChar >= 0x2000 && curChar <= 0x206F)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDFText_ParseOptions::CPDFText_ParseOptions()
+ : m_bGetCharCodeOnly(FALSE), m_bNormalizeObjs(TRUE), m_bOutputHyphen(FALSE)
+{
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
+{
+ CPDF_TextPage* pTextPageEx = FX_NEW CPDF_TextPage(pPage, ParserOptions);
+ return pTextPageEx;
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_Page* pPage, int flags)
+{
+ CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pPage, flags);
+ return pTextPage;
+}
+IPDF_TextPage* IPDF_TextPage::CreateTextPage(const CPDF_PageObjects* pObjs, int flags)
+{
+ CPDF_TextPage* pTextPage = FX_NEW CPDF_TextPage(pObjs, flags);
+ return pTextPage;
+}
+IPDF_TextPageFind* IPDF_TextPageFind::CreatePageFind(const IPDF_TextPage* pTextPage)
+{
+ if (!pTextPage) {
+ return NULL;
+ }
+ return FX_NEW CPDF_TextPageFind(pTextPage);
+}
+IPDF_LinkExtract* IPDF_LinkExtract::CreateLinkExtract()
+{
+ return FX_NEW CPDF_LinkExtract();
+}
+#define TEXT_BLANK_CHAR L' '
+#define TEXT_LINEFEED_CHAR L'\n'
+#define TEXT_RETURN_CHAR L'\r'
+#define TEXT_EMPTY L""
+#define TEXT_BLANK L" "
+#define TEXT_RETURN_LINEFEED L"\r\n"
+#define TEXT_LINEFEED L"\n"
+#define TEXT_CHARRATIO_GAPDELTA 0.070
+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, int flags)
+ : m_pPreTextObj(NULL),
+ m_IsParsered(FALSE),
+ m_charList(512),
+ m_TempCharList(50),
+ m_TextlineDir(-1),
+ m_CurlineRect(0, 0, 0, 0)
+{
+ m_pPage = pPage;
+ m_parserflag = flags;
+ m_TextBuf.EstimateSize(0, 10240);
+ pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
+}
+CPDF_TextPage::CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions)
+ : m_pPreTextObj(NULL)
+ , m_IsParsered(FALSE)
+ , m_charList(512)
+ , m_TempCharList(50)
+ , m_TextlineDir(-1)
+ , m_CurlineRect(0, 0, 0, 0)
+ , m_ParseOptions(ParserOptions)
+{
+ m_pPage = pPage;
+ m_parserflag = 0;
+ m_TextBuf.EstimateSize(0, 10240);
+ pPage->GetDisplayMatrix(m_DisplayMatrix, 0, 0, (int) pPage->GetPageWidth(), (int)pPage->GetPageHeight(), 0);
+}
+CPDF_TextPage::CPDF_TextPage(const CPDF_PageObjects* pPage, int flags)
+ : m_pPreTextObj(NULL),
+ m_IsParsered(FALSE),
+ m_charList(512),
+ m_TempCharList(50),
+ m_TextlineDir(-1),
+ m_CurlineRect(0, 0, 0, 0)
+{
+ m_pPage = pPage;
+ m_parserflag = flags;
+ m_TextBuf.EstimateSize(0, 10240);
+ CFX_FloatRect pageRect = pPage->CalcBoundingBox();
+ m_DisplayMatrix = CFX_AffineMatrix(1, 0, 0, -1, pageRect.right, pageRect.top);
+}
+void CPDF_TextPage::NormalizeObjects(FX_BOOL bNormalize)
+{
+ m_ParseOptions.m_bNormalizeObjs = bNormalize;
+}
+FX_BOOL CPDF_TextPage::IsControlChar(PAGECHAR_INFO* pCharInfo)
+{
+ if(!pCharInfo) {
+ return FALSE;
+ }
+ switch(pCharInfo->m_Unicode) {
+ case 0x2:
+ case 0x3:
+ case 0x93:
+ case 0x94:
+ case 0x96:
+ case 0x97:
+ case 0x98:
+ case 0xfffe:
+ if(pCharInfo->m_Flag == FPDFTEXT_CHAR_HYPHEN) {
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+ default:
+ return FALSE;
+ }
+}
+FX_BOOL CPDF_TextPage::ParseTextPage()
+{
+ if (!m_pPage) {
+ m_IsParsered = FALSE;
+ return FALSE;
+ }
+ m_IsParsered = FALSE;
+ m_TextBuf.Clear();
+ m_charList.RemoveAll();
+ m_pPreTextObj = NULL;
+ ProcessObject();
+ m_IsParsered = TRUE;
+ if(!m_ParseOptions.m_bGetCharCodeOnly) {
+ m_CharIndex.RemoveAll();
+ int nCount = m_charList.GetSize();
+ if(nCount) {
+ m_CharIndex.Add(0);
+ }
+ for(int i = 0; i < nCount; i++) {
+ int indexSize = m_CharIndex.GetSize();
+ FX_BOOL bNormal = FALSE;
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(i);
+ if(charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ bNormal = TRUE;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ else if(charinfo.m_Unicode == 0 || IsControlChar(&charinfo))
+#else
+ else if(charinfo.m_Unicode == 0)
+#endif
+ bNormal = FALSE;
+ else {
+ bNormal = TRUE;
+ }
+ if(bNormal) {
+ if(indexSize % 2) {
+ m_CharIndex.Add(1);
+ } else {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
+ }
+ } else {
+ if(indexSize % 2) {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, i + 1);
+ } else {
+ m_CharIndex.Add(i + 1);
+ }
+ }
+ }
+ int indexSize = m_CharIndex.GetSize();
+ if(indexSize % 2) {
+ m_CharIndex.RemoveAt(indexSize - 1);
+ }
+ }
+ return TRUE;
+}
+int CPDF_TextPage::CountChars() const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return m_TextBuf.GetSize();
+ }
+ return m_charList.GetSize();
+}
+int CPDF_TextPage::CharIndexFromTextIndex(int TextIndex) const
+{
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(count > TextIndex) {
+ return TextIndex - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
+ }
+ }
+ return -1;
+}
+int CPDF_TextPage::TextIndexFromCharIndex(int CharIndex) const
+{
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i) > CharIndex) {
+ if(CharIndex - m_CharIndex.GetAt(i) < 0) {
+ return -1;
+ }
+ return CharIndex - m_CharIndex.GetAt(i) + count - m_CharIndex.GetAt(i + 1);
+ }
+ }
+ return -1;
+}
+void CPDF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if(start < 0 || nCount == 0) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ PAGECHAR_INFO info_curchar;
+ CPDF_TextObject* pCurObj = NULL;
+ CFX_FloatRect rect;
+ int curPos = start;
+ FX_BOOL flagNewRect = TRUE;
+ if (nCount + start > m_charList.GetSize() || nCount == -1) {
+ nCount = m_charList.GetSize() - start;
+ }
+ while (nCount--) {
+ info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(curPos++);
+ if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ continue;
+ }
+ if(info_curchar.m_CharBox.Width() < 0.01 || info_curchar.m_CharBox.Height() < 0.01) {
+ continue;
+ }
+ if(!pCurObj) {
+ pCurObj = info_curchar.m_pTextObj;
+ }
+ if (pCurObj != info_curchar.m_pTextObj) {
+ rectArray.Add(rect);
+ pCurObj = info_curchar.m_pTextObj;
+ flagNewRect = TRUE;
+ }
+ if (flagNewRect) {
+ FX_FLOAT orgX = info_curchar.m_OriginX, orgY = info_curchar.m_OriginY;
+ CFX_AffineMatrix matrix, matrix_reverse;
+ info_curchar.m_pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(info_curchar.m_Matrix);
+ matrix_reverse.SetReverse(matrix);
+ matrix_reverse.Transform(orgX, orgY);
+ rect.left = info_curchar.m_CharBox.left;
+ rect.right = info_curchar.m_CharBox.right;
+ if (pCurObj->GetFont()->GetTypeDescent()) {
+ rect.bottom = orgY + pCurObj->GetFont()->GetTypeDescent() * pCurObj->GetFontSize() / 1000;
+ FX_FLOAT xPosTemp = orgX;
+ matrix.Transform(xPosTemp, rect.bottom);
+ } else {
+ rect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ if (pCurObj->GetFont()->GetTypeAscent()) {
+ rect.top = orgY + pCurObj->GetFont()->GetTypeAscent() * pCurObj->GetFontSize() / 1000;
+ FX_FLOAT xPosTemp = orgX + GetCharWidth(info_curchar.m_CharCode, pCurObj->GetFont()) * pCurObj->GetFontSize() / 1000;
+ matrix.Transform(xPosTemp, rect.top);
+ } else {
+ rect.top = info_curchar.m_CharBox.top;
+ }
+ flagNewRect = FALSE;
+ rect = info_curchar.m_CharBox;
+ rect.Normalize();
+ } else {
+ info_curchar.m_CharBox.Normalize();
+ if (rect.left > info_curchar.m_CharBox.left) {
+ rect.left = info_curchar.m_CharBox.left;
+ }
+ if (rect.right < info_curchar.m_CharBox.right) {
+ rect.right = info_curchar.m_CharBox.right;
+ }
+ if ( rect.top < info_curchar.m_CharBox.top) {
+ rect.top = info_curchar.m_CharBox.top;
+ }
+ if (rect.bottom > info_curchar.m_CharBox.bottom) {
+ rect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ }
+ }
+ rectArray.Add(rect);
+ return;
+}
+int CPDF_TextPage::GetIndexAtPos(CPDF_Point point , FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ if (!m_IsParsered) {
+ return -3;
+ }
+ FX_FLOAT distance = 0;
+ int pos = 0;
+ int NearPos = -1;
+ double xdif = 5000, ydif = 5000;
+ while(pos < m_charList.GetSize()) {
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)(m_charList.GetAt(pos));
+ CFX_FloatRect charrect = charinfo.m_CharBox;
+ if (charrect.Contains(point.x, point.y)) {
+ break;
+ }
+ if (xTorelance > 0 || yTorelance > 0) {
+ CFX_FloatRect charRectExt;
+ charrect.Normalize();
+ charRectExt.left = charrect.left - xTorelance / 2;
+ charRectExt.right = charrect.right + xTorelance / 2;
+ charRectExt.top = charrect.top + yTorelance / 2;
+ charRectExt.bottom = charrect.bottom - yTorelance / 2;
+ if (charRectExt.Contains(point.x, point.y)) {
+ double curXdif, curYdif;
+ curXdif = FXSYS_fabs(point.x - charrect.left) < FXSYS_fabs(point.x - charrect.right) ? FXSYS_fabs(point.x - charrect.left) : FXSYS_fabs(point.x - charrect.right);
+ curYdif = FXSYS_fabs(point.y - charrect.bottom) < FXSYS_fabs(point.y - charrect.top ) ? FXSYS_fabs(point.y - charrect.bottom) : FXSYS_fabs(point.y - charrect.top);
+ if (curYdif + curXdif < xdif + ydif) {
+ ydif = curYdif;
+ xdif = curXdif;
+ NearPos = pos;
+ }
+ }
+ }
+ ++pos;
+ }
+ if (pos >= m_charList.GetSize()) {
+ pos = NearPos;
+ }
+ return pos;
+}
+CFX_WideString CPDF_TextPage::GetTextByRect(CFX_FloatRect rect) const
+{
+ CFX_WideString strText;
+ if(m_ParseOptions.m_bGetCharCodeOnly || !m_IsParsered) {
+ return strText;
+ }
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ FX_FLOAT posy = 0;
+ FX_BOOL IsContainPreChar = FALSE;
+ FX_BOOL ISAddLineFeed = FALSE;
+ while (pos < nCount) {
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
+ if (IsRectIntersect(rect, charinfo.m_CharBox)) {
+ if (FXSYS_fabs(posy - charinfo.m_OriginY) > 0 && !IsContainPreChar && ISAddLineFeed) {
+ posy = charinfo.m_OriginY;
+ if (strText.GetLength() > 0) {
+ strText += L"\r\n";
+ }
+ }
+ IsContainPreChar = TRUE;
+ ISAddLineFeed = FALSE;
+ if (charinfo.m_Unicode) {
+ strText += charinfo.m_Unicode;
+ }
+ } else if (charinfo.m_Unicode == 32) {
+ if (IsContainPreChar && charinfo.m_Unicode) {
+ strText += charinfo.m_Unicode;
+ IsContainPreChar = FALSE;
+ ISAddLineFeed = FALSE;
+ }
+ } else {
+ IsContainPreChar = FALSE;
+ ISAddLineFeed = TRUE;
+ }
+ }
+ return strText;
+}
+void CPDF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ CFX_FloatRect curRect;
+ FX_BOOL flagNewRect = TRUE;
+ CPDF_TextObject* pCurObj = NULL;
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ while (pos < nCount) {
+ PAGECHAR_INFO info_curchar = *(PAGECHAR_INFO*)m_charList.GetAt(pos++);
+ if (info_curchar.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ continue;
+ }
+ if(pos == 494) {
+ int a = 0;
+ }
+ if (IsRectIntersect(rect, info_curchar.m_CharBox)) {
+ if(!pCurObj) {
+ pCurObj = info_curchar.m_pTextObj;
+ }
+ if (pCurObj != info_curchar.m_pTextObj) {
+ resRectArray.Add(curRect);
+ pCurObj = info_curchar.m_pTextObj;
+ flagNewRect = TRUE;
+ }
+ if (flagNewRect) {
+ curRect = info_curchar.m_CharBox;
+ flagNewRect = FALSE;
+ curRect.Normalize();
+ } else {
+ info_curchar.m_CharBox.Normalize();
+ if (curRect.left > info_curchar.m_CharBox.left) {
+ curRect.left = info_curchar.m_CharBox.left;
+ }
+ if (curRect.right < info_curchar.m_CharBox.right) {
+ curRect.right = info_curchar.m_CharBox.right;
+ }
+ if ( curRect.top < info_curchar.m_CharBox.top) {
+ curRect.top = info_curchar.m_CharBox.top;
+ }
+ if (curRect.bottom > info_curchar.m_CharBox.bottom) {
+ curRect.bottom = info_curchar.m_CharBox.bottom;
+ }
+ }
+ }
+ }
+ resRectArray.Add(curRect);
+ return;
+}
+int CPDF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ CPDF_Point point(x, y);
+ return GetIndexAtPos(point, xTorelance, yTorelance);
+}
+int CPDF_TextPage::GetOrderByDirection(int order, int direction) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -3;
+ }
+ if (!m_IsParsered) {
+ return -3;
+ }
+ if (direction == FPDFTEXT_RIGHT || direction == FPDFTEXT_LEFT) {
+ order += direction;
+ while(order >= 0 && order < m_charList.GetSize()) {
+ PAGECHAR_INFO cinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
+ if (cinfo.m_Flag != FPDFTEXT_CHAR_GENERATED) {
+ break;
+ } else {
+ if (cinfo.m_Unicode == TEXT_LINEFEED_CHAR || cinfo.m_Unicode == TEXT_RETURN_CHAR) {
+ order += direction;
+ } else {
+ break;
+ }
+ }
+ }
+ if (order >= m_charList.GetSize()) {
+ order = -2;
+ }
+ return order;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(order);
+ CPDF_Point curPos(charinfo.m_OriginX, charinfo.m_OriginY);
+ FX_FLOAT difPosY = 0.0, minXdif = 1000;
+ int minIndex = -2;
+ int index = order;
+ FX_FLOAT height = charinfo.m_CharBox.Height();
+ if (direction == FPDFTEXT_UP) {
+ minIndex = -1;
+ while (1) {
+ if (--index < 0) {
+ return -1;
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
+ difPosY = charinfo.m_OriginY;
+ minIndex = index;
+ break;
+ }
+ }
+ FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
+ minXdif = PreXdif;
+ if (PreXdif == 0) {
+ return index;
+ }
+ FX_FLOAT curXdif = 0;
+ while (--index >= 0) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ curXdif = charinfo.m_OriginX - curPos.x;
+ if (curXdif == 0) {
+ return index;
+ }
+ int signflag = 0;
+ if (curXdif > 0) {
+ signflag = 1;
+ } else {
+ signflag = -1;
+ }
+ if (signflag * PreXdif < 0) {
+ if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
+ return index + 1;
+ } else {
+ return index;
+ }
+ }
+ if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
+ minIndex = index;
+ minXdif = curXdif;
+ }
+ PreXdif = curXdif;
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ }
+ return minIndex;
+ } else if(FPDFTEXT_DOWN) {
+ minIndex = -2;
+ while (1) {
+ if (++index > m_charList.GetSize() - 1) {
+ return minIndex;
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (FXSYS_fabs(charinfo.m_OriginY - curPos.y) > FX_MAX(height, charinfo.m_CharBox.Height()) / 2) {
+ difPosY = charinfo.m_OriginY;
+ minIndex = index;
+ break;
+ }
+ }
+ FX_FLOAT PreXdif = charinfo.m_OriginX - curPos.x;
+ minXdif = PreXdif;
+ if (PreXdif == 0) {
+ return index;
+ }
+ FX_FLOAT curXdif = 0;
+ while (++index < m_charList.GetSize()) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (difPosY != charinfo.m_OriginY) {
+ break;
+ }
+ curXdif = charinfo.m_OriginX - curPos.x;
+ if (curXdif == 0) {
+ return index;
+ }
+ int signflag = 0;
+ if (curXdif > 0) {
+ signflag = 1;
+ } else {
+ signflag = -1;
+ }
+ if (signflag * PreXdif < 0) {
+ if (FXSYS_fabs(PreXdif) < FXSYS_fabs(curXdif)) {
+ return index - 1;
+ } else {
+ return index;
+ }
+ }
+ if (FXSYS_fabs(curXdif) < FXSYS_fabs(minXdif)) {
+ minXdif = curXdif;
+ minIndex = index;
+ }
+ PreXdif = curXdif;
+ }
+ return minIndex;
+ }
+}
+void CPDF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return;
+ }
+ if (!m_IsParsered) {
+ return;
+ }
+ if (index < 0 || index >= m_charList.GetSize()) {
+ return;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ info.m_Charcode = charinfo.m_CharCode;
+ info.m_OriginX = charinfo.m_OriginX;
+ info.m_OriginY = charinfo.m_OriginY;
+ info.m_Unicode = charinfo.m_Unicode;
+ info.m_Flag = charinfo.m_Flag;
+ info.m_CharBox = charinfo.m_CharBox;
+ info.m_pTextObj = charinfo.m_pTextObj;
+ if (charinfo.m_pTextObj && charinfo.m_pTextObj->GetFont()) {
+ info.m_FontSize = charinfo.m_pTextObj->GetFontSize();
+ }
+ info.m_Matrix.Copy(charinfo.m_Matrix);
+ return;
+}
+void CPDF_TextPage::CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const
+{
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
+ PAGECHAR_INFO charinfo2 = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
+ if (FPDFTEXT_CHAR_PIECE != charinfo.m_Flag && FPDFTEXT_CHAR_PIECE != charinfo2.m_Flag) {
+ return;
+ }
+ if (FPDFTEXT_CHAR_PIECE == charinfo.m_Flag) {
+ PAGECHAR_INFO charinfo1 = charinfo;
+ int startIndex = start;
+ while(FPDFTEXT_CHAR_PIECE == charinfo1.m_Flag && charinfo1.m_Index == charinfo.m_Index) {
+ startIndex--;
+ if (startIndex < 0) {
+ break;
+ }
+ charinfo1 = *(PAGECHAR_INFO*)m_charList.GetAt(startIndex);
+ }
+ startIndex++;
+ start = startIndex;
+ }
+ if (FPDFTEXT_CHAR_PIECE == charinfo2.m_Flag) {
+ PAGECHAR_INFO charinfo3 = charinfo2;
+ int endIndex = start + nCount - 1;
+ while(FPDFTEXT_CHAR_PIECE == charinfo3.m_Flag && charinfo3.m_Index == charinfo2.m_Index) {
+ endIndex++;
+ if (endIndex >= m_charList.GetSize()) {
+ break;
+ }
+ charinfo3 = *(PAGECHAR_INFO*)m_charList.GetAt(endIndex);
+ }
+ endIndex--;
+ nCount = endIndex - start + 1;
+ }
+}
+CFX_WideString CPDF_TextPage::GetPageText(int start , int nCount) const
+{
+ if (!m_IsParsered || nCount == 0) {
+ return L"";
+ }
+ if (start < 0) {
+ start = 0;
+ }
+ if (nCount == -1) {
+ nCount = m_charList.GetSize() - start;
+ return m_TextBuf.GetWideString().Mid(start, m_TextBuf.GetWideString().GetLength());
+ }
+ if(nCount <= 0 || m_charList.GetSize() <= 0) {
+ return L"";
+ }
+ if(nCount + start > m_charList.GetSize() - 1) {
+ nCount = m_charList.GetSize() - start;
+ }
+ if (nCount <= 0) {
+ return L"";
+ }
+ CheckMarkedContentObject(start, nCount);
+ int startindex = 0;
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start);
+ int startOffset = 0;
+ while(charinfo.m_Index == -1) {
+ startOffset++;
+ if (startOffset > nCount || start + startOffset >= m_charList.GetSize()) {
+ return L"";
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + startOffset);
+ }
+ startindex = charinfo.m_Index;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - 1);
+ int nCountOffset = 0;
+ while (charinfo.m_Index == -1) {
+ nCountOffset++;
+ if (nCountOffset >= nCount) {
+ return L"";
+ }
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(start + nCount - nCountOffset - 1);
+ }
+ nCount = start + nCount - nCountOffset - startindex;
+ if(nCount <= 0) {
+ return L"";
+ }
+ return m_TextBuf.GetWideString().Mid(startindex, nCount);
+}
+int CPDF_TextPage::CountRects(int start, int nCount)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ if (!m_IsParsered) {
+ return -1;
+ }
+ if (start < 0) {
+ return -1;
+ }
+ if (nCount == -1 || nCount + start > m_charList.GetSize() ) {
+ nCount = m_charList.GetSize() - start;
+ }
+ m_SelRects.RemoveAll();
+ GetRectArray(start, nCount, m_SelRects);
+ return m_SelRects.GetSize();
+}
+void CPDF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return ;
+ }
+ if (!m_IsParsered || rectIndex < 0 || rectIndex >= m_SelRects.GetSize()) {
+ return;
+ }
+ left = m_SelRects.GetAt(rectIndex).left;
+ top = m_SelRects.GetAt(rectIndex).top;
+ right = m_SelRects.GetAt(rectIndex).right;
+ bottom = m_SelRects.GetAt(rectIndex).bottom;
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(int start, int end, int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ if(end == start) {
+ return FALSE;
+ }
+ FX_FLOAT dx, dy;
+ FPDF_CHAR_INFO info1, info2;
+ GetCharInfo(start, info1);
+ GetCharInfo(end, info2);
+ while(info2.m_CharBox.Width() == 0 || info2.m_CharBox.Height() == 0) {
+ end--;
+ if(end <= start) {
+ return FALSE;
+ }
+ GetCharInfo(end, info2);
+ }
+ dx = (info2.m_OriginX - info1.m_OriginX);
+ dy = (info2.m_OriginY - info1.m_OriginY);
+ if(dx == 0) {
+ if(dy > 0) {
+ Rotate = 90;
+ } else if (dy < 0) {
+ Rotate = 270;
+ } else {
+ Rotate = 0;
+ }
+ } else {
+ float a = FXSYS_atan2(dy, dx);
+ Rotate = (int)(a * 180 / FX_PI + 0.5);
+ }
+ if(Rotate < 0) {
+ Rotate = -Rotate;
+ } else if(Rotate > 0) {
+ Rotate = 360 - Rotate;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(CFX_FloatRect rect , int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ int start, end, count, n = CountBoundedSegments(rect.left, rect.top, rect.right, rect.bottom, TRUE);
+ if(n < 1) {
+ return FALSE;
+ }
+ if(n > 1) {
+ GetBoundedSegment(n - 1, start, count);
+ end = start + count - 1;
+ GetBoundedSegment(0, start, count);
+ } else {
+ GetBoundedSegment(0, start, count);
+ end = start + count - 1;
+ }
+ return GetBaselineRotate(start, end, Rotate);
+}
+FX_BOOL CPDF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return FALSE;
+ }
+ if (!m_IsParsered || rectIndex < 0 || rectIndex > m_SelRects.GetSize()) {
+ return FALSE;
+ }
+ CFX_FloatRect rect = m_SelRects.GetAt(rectIndex);
+ return GetBaselineRotate(rect , Rotate);
+}
+int CPDF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains )
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ m_Segment.RemoveAll();
+ if (!m_IsParsered) {
+ return -1;
+ }
+ CFX_FloatRect rect(left, bottom, right, top);
+ rect.Normalize();
+ int nCount = m_charList.GetSize();
+ int pos = 0;
+ FPDF_SEGMENT segment;
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ FX_BOOL segmentStatus = 0;
+ FX_BOOL IsContainPreChar = FALSE;
+ while (pos < nCount) {
+ if(pos == 493) {
+ int a = 0;
+ }
+ PAGECHAR_INFO charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(pos);
+ if(bContains && rect.Contains(charinfo.m_CharBox)) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = TRUE;
+ } else if (!bContains && (IsRectIntersect(rect, charinfo.m_CharBox) || rect.Contains(charinfo.m_OriginX, charinfo.m_OriginY))) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = TRUE;
+ } else if (charinfo.m_Unicode == 32) {
+ if (IsContainPreChar == TRUE) {
+ if (segmentStatus == 0 || segmentStatus == 2) {
+ segment.m_Start = pos;
+ segment.m_nCount = 1;
+ segmentStatus = 1;
+ } else if (segmentStatus == 1) {
+ segment.m_nCount++;
+ }
+ IsContainPreChar = FALSE;
+ } else {
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ }
+ } else {
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ IsContainPreChar = FALSE;
+ }
+ pos++;
+ }
+ if (segmentStatus == 1) {
+ segmentStatus = 2;
+ m_Segment.Add(segment);
+ segment.m_Start = 0;
+ segment.m_nCount = 0;
+ }
+ return m_Segment.GetSize();
+}
+void CPDF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return ;
+ }
+ if (index < 0 || index >= m_Segment.GetSize()) {
+ return;
+ }
+ start = m_Segment.GetAt(index).m_Start;
+ count = m_Segment.GetAt(index).m_nCount;
+}
+int CPDF_TextPage::GetWordBreak(int index, int direction) const
+{
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ return -1;
+ }
+ if (!m_IsParsered) {
+ return -1;
+ }
+ if (direction != FPDFTEXT_LEFT && direction != FPDFTEXT_RIGHT) {
+ return -1;
+ }
+ if (index < 0 || index >= m_charList.GetSize()) {
+ return -1;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(index);
+ if (charinfo.m_Index == -1 || charinfo.m_Flag == FPDFTEXT_CHAR_GENERATED) {
+ return index;
+ }
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return index;
+ }
+ int breakPos = index;
+ if (direction == FPDFTEXT_LEFT) {
+ while (--breakPos > 0) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return breakPos;
+ }
+ }
+ return breakPos;
+ } else if (direction == FPDFTEXT_RIGHT) {
+ while (++breakPos < m_charList.GetSize()) {
+ charinfo = *(PAGECHAR_INFO*)m_charList.GetAt(breakPos);
+ if (!IsLetter(charinfo.m_Unicode)) {
+ return breakPos;
+ }
+ }
+ return breakPos;
+ }
+ return breakPos;
+}
+FX_INT32 CPDF_TextPage::FindTextlineFlowDirection()
+{
+ if (!m_pPage) {
+ return -1;
+ }
+ const FX_INT32 nPageWidth = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageWidth();
+ const FX_INT32 nPageHeight = (FX_INT32)((CPDF_Page*)m_pPage)->GetPageHeight();
+ CFX_ByteArray nHorizontalMask;
+ if (!nHorizontalMask.SetSize(nPageWidth)) {
+ return -1;
+ }
+ FX_BYTE* pDataH = nHorizontalMask.GetData();
+ CFX_ByteArray nVerticalMask;
+ if (!nVerticalMask.SetSize(nPageHeight)) {
+ return -1;
+ }
+ FX_BYTE* pDataV = nVerticalMask.GetData();
+ FX_INT32 index = 0;
+ FX_FLOAT fLineHeight = 0.0f;
+ CPDF_PageObject* pPageObj = NULL;
+ FX_POSITION pos = NULL;
+ pos = m_pPage->GetFirstObjectPosition();
+ if(!pos) {
+ return -1;
+ }
+ while(pos) {
+ pPageObj = m_pPage->GetNextObject(pos);
+ if(NULL == pPageObj) {
+ continue;
+ }
+ if(PDFPAGE_TEXT != pPageObj->m_Type) {
+ continue;
+ }
+ FX_INT32 minH = (FX_INT32)pPageObj->m_Left < 0 ? 0 : (FX_INT32)pPageObj->m_Left;
+ FX_INT32 maxH = (FX_INT32)pPageObj->m_Right > nPageWidth ? nPageWidth : (FX_INT32)pPageObj->m_Right;
+ FX_INT32 minV = (FX_INT32)pPageObj->m_Bottom < 0 ? 0 : (FX_INT32)pPageObj->m_Bottom;
+ FX_INT32 maxV = (FX_INT32)pPageObj->m_Top > nPageHeight ? nPageHeight : (FX_INT32)pPageObj->m_Top;
+ if (minH >= maxH || minV >= maxV){
+ continue;
+ }
+
+ FXSYS_memset8(pDataH + minH, 1, maxH - minH);
+ FXSYS_memset8(pDataV + minV, 1, maxV - minV);
+
+ if (fLineHeight <= 0.0f) {
+ fLineHeight = pPageObj->m_Top - pPageObj->m_Bottom;
+ }
+
+ pPageObj = NULL;
+ }
+ FX_INT32 nStartH = 0;
+ FX_INT32 nEndH = 0;
+ FX_FLOAT nSumH = 0.0f;
+ for (index = 0; index < nPageWidth; index++)
+ if(1 == nHorizontalMask[index]) {
+ break;
+ }
+ nStartH = index;
+ for (index = nPageWidth; index > 0; index--)
+ if(1 == nHorizontalMask[index - 1]) {
+ break;
+ }
+ nEndH = index;
+ for (index = nStartH; index < nEndH; index++) {
+ nSumH += nHorizontalMask[index];
+ }
+ nSumH /= nEndH - nStartH;
+ FX_INT32 nStartV = 0;
+ FX_INT32 nEndV = 0;
+ FX_FLOAT nSumV = 0.0f;
+ for (index = 0; index < nPageHeight; index++)
+ if(1 == nVerticalMask[index]) {
+ break;
+ }
+ nStartV = index;
+ for (index = nPageHeight; index > 0; index--)
+ if(1 == nVerticalMask[index - 1]) {
+ break;
+ }
+ nEndV = index;
+ for (index = nStartV; index < nEndV; index++) {
+ nSumV += nVerticalMask[index];
+ }
+ nSumV /= nEndV - nStartV;
+ if ((nEndV - nStartV) < (FX_INT32)(2 * fLineHeight)) {
+ return 0;
+ }
+ if ((nEndH - nStartH) < (FX_INT32)(2 * fLineHeight)) {
+ return 1;
+ }
+ if (nSumH > 0.8f) {
+ return 0;
+ }
+ if (nSumH - nSumV > 0.0f) {
+ return 0;
+ }
+ if (nSumV - nSumH > 0.0f) {
+ return 1;
+ }
+ return -1;
+}
+void CPDF_TextPage::ProcessObject()
+{
+ CPDF_PageObject* pPageObj = NULL;
+ if (!m_pPage) {
+ return;
+ }
+ FX_POSITION pos;
+ pos = m_pPage->GetFirstObjectPosition();
+ if (!pos) {
+ return;
+ }
+ m_TextlineDir = FindTextlineFlowDirection();
+ int nCount = 0;
+ while (pos) {
+ pPageObj = m_pPage->GetNextObject(pos);
+ if(pPageObj) {
+ if(pPageObj->m_Type == PDFPAGE_TEXT) {
+ if (nCount == 3) {
+ nCount = nCount;
+ }
+ CFX_AffineMatrix matrix;
+ ProcessTextObject((CPDF_TextObject*)pPageObj, matrix, pos);
+ nCount++;
+ } else if (pPageObj->m_Type == PDFPAGE_FORM) {
+ CFX_AffineMatrix formMatrix(1, 0, 0, 1, 0, 0);
+ ProcessFormObject((CPDF_FormObject*)pPageObj, formMatrix);
+ }
+ }
+ pPageObj = NULL;
+ }
+ int count = m_LineObj.GetSize();
+ for(int i = 0; i < count; i++) {
+ ProcessTextObject(m_LineObj.GetAt(i));
+ }
+ m_LineObj.RemoveAll();
+ CloseTempLine();
+}
+void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix)
+{
+ CPDF_PageObject* pPageObj = NULL;
+ FX_POSITION pos;
+ if (!pFormObj) {
+ return;
+ }
+ pos = pFormObj->m_pForm->GetFirstObjectPosition();
+ if (!pos) {
+ return;
+ }
+ CFX_AffineMatrix curFormMatrix;
+ curFormMatrix.Copy(pFormObj->m_FormMatrix);
+ curFormMatrix.Concat(formMatrix);
+ while (pos) {
+ pPageObj = pFormObj->m_pForm->GetNextObject(pos);
+ if(pPageObj) {
+ if(pPageObj->m_Type == PDFPAGE_TEXT) {
+ ProcessTextObject((CPDF_TextObject*)pPageObj, curFormMatrix, pos);
+ } else if (pPageObj->m_Type == PDFPAGE_FORM) {
+ ProcessFormObject((CPDF_FormObject*)pPageObj, curFormMatrix);
+ }
+ }
+ pPageObj = NULL;
+ }
+}
+int CPDF_TextPage::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
+{
+ if(charCode == -1) {
+ return 0;
+ }
+ int w = pFont->GetCharWidthF(charCode);
+ if(w == 0) {
+ CFX_ByteString str;
+ pFont->AppendChar(str, charCode);
+ w = pFont->GetStringWidth(str, 1);
+ if(w == 0) {
+ FX_RECT BBox;
+ pFont->GetCharBBox(charCode, BBox);
+ w = BBox.right - BBox.left;
+ }
+ }
+ return w;
+}
+void CPDF_TextPage::OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str)
+{
+ FX_INT32 start, count;
+ FX_INT32 ret = pBidi->GetBidiInfo(start, count);
+ if(ret == 2) {
+ for(int i = start + count - 1; i >= start; i--) {
+ m_TextBuf.AppendChar(str.GetAt(i));
+ m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
+ }
+ } else {
+ int end = start + count ;
+ for(int i = start; i < end; i++) {
+ m_TextBuf.AppendChar(str.GetAt(i));
+ m_charList.Add(*(PAGECHAR_INFO*)m_TempCharList.GetAt(i));
+ }
+ }
+}
+void CPDF_TextPage::AddCharInfoByLRDirection(CFX_WideString& str, int i)
+{
+ PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
+ FX_WCHAR wChar = str.GetAt(i);
+#ifdef FOXIT_CHROME_BUILD
+ if(!IsControlChar(&Info)) {
+#else
+ if(wChar != 0xfffe) {
+#endif
+ Info.m_Index = m_TextBuf.GetLength();
+ if (wChar >= 0xFB00 && wChar <= 0xFB06) {
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount >= 1) {
+ pDst = FX_Alloc(FX_WCHAR, nCount);
+ if (!pDst) {
+ return;
+ }
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ PAGECHAR_INFO Info2 = Info;
+ Info2.m_Unicode = pDst[nIndex];
+ Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+ m_TextBuf.AppendChar(Info2.m_Unicode);
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info2);
+ }
+ }
+ FX_Free(pDst);
+ return;
+ }
+ }
+ m_TextBuf.AppendChar(wChar);
+ } else {
+ Info.m_Index = -1;
+ }
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info);
+ }
+}
+void CPDF_TextPage::AddCharInfoByRLDirection(CFX_WideString& str, int i)
+{
+ PAGECHAR_INFO Info = *(PAGECHAR_INFO*)m_TempCharList.GetAt(i);
+#ifdef FOXIT_CHROME_BUILD
+ if(!IsControlChar(&Info)) {
+#else
+ if(str.GetAt(i) != 0xfffe) {
+#endif
+ Info.m_Index = m_TextBuf.GetLength();
+ FX_WCHAR wChar = FX_GetMirrorChar(str.GetAt(i), TRUE, FALSE);
+ FX_LPWSTR pDst = NULL;
+ FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
+ if (nCount >= 1) {
+ pDst = FX_Alloc(FX_WCHAR, nCount);
+ if (!pDst) {
+ return;
+ }
+ FX_Unicode_GetNormalization(wChar, pDst);
+ for (int nIndex = 0; nIndex < nCount; nIndex++) {
+ PAGECHAR_INFO Info2 = Info;
+ Info2.m_Unicode = pDst[nIndex];
+ Info2.m_Flag = FPDFTEXT_CHAR_PIECE;
+ m_TextBuf.AppendChar(Info2.m_Unicode);
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info2);
+ }
+ }
+ FX_Free(pDst);
+ return;
+ } else {
+ Info.m_Unicode = wChar;
+ }
+ m_TextBuf.AppendChar(Info.m_Unicode);
+ } else {
+ Info.m_Index = -1;
+ }
+ if( !m_ParseOptions.m_bGetCharCodeOnly) {
+ m_charList.Add(Info);
+ }
+}
+void CPDF_TextPage::CloseTempLine()
+{
+ int count1 = m_TempCharList.GetSize();
+ if (count1 <= 0) {
+ return;
+ }
+ IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ CFX_WordArray order;
+ FX_BOOL bR2L = FALSE;
+ FX_INT32 start = 0, count = 0, i = 0;
+ int nR2L = 0, nL2R = 0;
+ FX_BOOL bPrevSpace = FALSE;
+ for (i = 0; i < str.GetLength(); i++) {
+ if(str.GetAt(i) == 32) {
+ if(bPrevSpace) {
+ m_TempTextBuf.Delete(i, 1);
+ m_TempCharList.Delete(i);
+ str.Delete(i);
+ count1 --;
+ i--;
+ continue;
+ }
+ bPrevSpace = TRUE;
+ } else {
+ bPrevSpace = FALSE;
+ }
+ if(BidiChar && BidiChar->AppendChar(str.GetAt(i))) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if (ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ }
+ if(BidiChar && BidiChar->EndChar()) {
+ FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+ order.Add(start);
+ order.Add(count);
+ order.Add(ret);
+ if(!bR2L) {
+ if(ret == 2) {
+ nR2L++;
+ } else if(ret == 1) {
+ nL2R++;
+ }
+ }
+ }
+ if(nR2L > 0 && nR2L >= nL2R) {
+ bR2L = TRUE;
+ }
+ if(this->m_parserflag == FPDFTEXT_RLTB || bR2L) {
+ int count = order.GetSize();
+ for(int j = count - 1; j > 0; j -= 3) {
+ int ret = order.GetAt(j);
+ int start = order.GetAt(j - 2);
+ int count1 = order.GetAt(j - 1);
+ if(ret == 2 || ret == 0) {
+ for(int i = start + count1 - 1; i >= start; i--) {
+ AddCharInfoByRLDirection(str, i);
+ }
+ } else {
+ i = j;
+ FX_BOOL bSymbol = FALSE;
+ while(i > 0 && order.GetAt(i) != 2) {
+ bSymbol = !order.GetAt(i);
+ i -= 3;
+ }
+ int end = start + count1 ;
+ int n = 0;
+ if(bSymbol) {
+ n = i + 6;
+ } else {
+ n = i + 3;
+ }
+ if(n >= j) {
+ for(int m = start; m < end; m++) {
+ AddCharInfoByLRDirection(str, m);
+ }
+ } else {
+ i = j;
+ j = n;
+ for(; n <= i; n += 3) {
+ int ret = order.GetAt(n);
+ int start = order.GetAt(n - 2);
+ int count1 = order.GetAt(n - 1);
+ int end = start + count1 ;
+ for(int m = start; m < end; m++) {
+ AddCharInfoByLRDirection(str, m);
+ }
+ }
+ }
+ }
+ }
+ } else {
+ int count = order.GetSize();
+ FX_BOOL bL2R = FALSE;
+ for(int j = 0; j < count; j += 3) {
+ int ret = order.GetAt(j + 2);
+ int start = order.GetAt(j);
+ int count1 = order.GetAt(j + 1);
+ if(ret == 2 || (j == 0 && ret == 0 && !bL2R)) {
+ int i = j + 3;
+ while(bR2L && i < count) {
+ if(order.GetAt(i + 2) == 1) {
+ break;
+ } else {
+ i += 3;
+ }
+ }
+ if(i == 3) {
+ j = -3;
+ bL2R = TRUE;
+ continue;
+ }
+ int end = m_TempCharList.GetSize() - 1;
+ if(i < count) {
+ end = order.GetAt(i) - 1;
+ }
+ j = i - 3;
+ for(int n = end; n >= start; n--) {
+ AddCharInfoByRLDirection(str, n);
+ }
+ } else {
+ int end = start + count1 ;
+ for(int i = start; i < end; i++) {
+ AddCharInfoByLRDirection(str, i);
+ }
+ }
+ }
+ }
+ int ntext = m_TextBuf.GetSize();
+ ntext = m_charList.GetSize();
+ order.RemoveAll();
+ m_TempCharList.RemoveAll();
+ m_TempTextBuf.Delete(0, m_TempTextBuf.GetLength());
+ BidiChar->Release();
+}
+void CPDF_TextPage::ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos)
+{
+ CFX_FloatRect re(pTextObj->m_Left, pTextObj->m_Bottom, pTextObj->m_Right, pTextObj->m_Top);
+ if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
+ return;
+ }
+ int count = m_LineObj.GetSize();
+ PDFTEXT_Obj Obj;
+ Obj.m_pTextObj = pTextObj;
+ Obj.m_formMatrix = formMatrix;
+ if(count == 0) {
+ m_LineObj.Add(Obj);
+ return;
+ }
+ if (IsSameAsPreTextObject(pTextObj, ObjPos)) {
+ return;
+ }
+ PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(count - 1);
+ CPDF_TextObjectItem item;
+ int nItem = prev_Obj.m_pTextObj->CountItems();
+ prev_Obj.m_pTextObj->GetItemInfo(nItem - 1, &item);
+ FX_FLOAT prev_width = GetCharWidth(item.m_CharCode, prev_Obj.m_pTextObj->GetFont()) * prev_Obj.m_pTextObj->GetFontSize() / 1000;
+ CFX_AffineMatrix prev_matrix;
+ prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
+ prev_width = FXSYS_fabs(prev_width);
+ prev_matrix.Concat(prev_Obj.m_formMatrix);
+ prev_width = prev_matrix.TransformDistance(prev_width);
+ pTextObj->GetItemInfo(0, &item);
+ FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pTextObj->GetFont()) * pTextObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ CFX_AffineMatrix this_matrix;
+ pTextObj->GetTextMatrix(&this_matrix);
+ this_width = FXSYS_fabs(this_width);
+ this_matrix.Concat(formMatrix);
+ this_width = this_matrix.TransformDistance(this_width);
+ FX_FLOAT threshold = prev_width > this_width ? prev_width / 4 : this_width / 4;
+ FX_FLOAT prev_x = prev_Obj.m_pTextObj->GetPosX(), prev_y = prev_Obj.m_pTextObj->GetPosY();
+ prev_Obj.m_formMatrix.Transform(prev_x, prev_y);
+ m_DisplayMatrix.Transform(prev_x, prev_y);
+ FX_FLOAT this_x = pTextObj->GetPosX(), this_y = pTextObj->GetPosY();
+ formMatrix.Transform(this_x, this_y);
+ m_DisplayMatrix.Transform(this_x, this_y);
+ if (FXSYS_fabs(this_y - prev_y) > threshold * 2) {
+ for(int i = 0; i < count; i++) {
+ ProcessTextObject(m_LineObj.GetAt(i));
+ }
+ m_LineObj.RemoveAll();
+ m_LineObj.Add(Obj);
+ return;
+ }
+ int i = 0;
+ if(m_ParseOptions.m_bNormalizeObjs) {
+ for(i = count - 1; i >= 0; i--) {
+ PDFTEXT_Obj prev_Obj = m_LineObj.GetAt(i);
+ CFX_AffineMatrix prev_matrix;
+ prev_Obj.m_pTextObj->GetTextMatrix(&prev_matrix);
+ FX_FLOAT Prev_x = prev_Obj.m_pTextObj->GetPosX(), Prev_y = prev_Obj.m_pTextObj->GetPosY();
+ prev_Obj.m_formMatrix.Transform(Prev_x, Prev_y);
+ m_DisplayMatrix.Transform(Prev_x, Prev_y);
+ if(this_x >= Prev_x) {
+ if(i == count - 1) {
+ m_LineObj.Add(Obj);
+ } else {
+ m_LineObj.InsertAt(i + 1, Obj);
+ }
+ break;
+ }
+ }
+ if(i < 0) {
+ m_LineObj.InsertAt(0, Obj);
+ }
+ } else {
+ m_LineObj.Add(Obj);
+ }
+}
+FX_INT32 CPDF_TextPage::PreMarkedContent(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
+ if(!pMarkData) {
+ return FPDFTEXT_MC_PASS;
+ }
+ int nContentMark = pMarkData->CountItems();
+ if (nContentMark < 1) {
+ return FPDFTEXT_MC_PASS;
+ }
+ CFX_WideString actText;
+ FX_BOOL bExist = FALSE;
+ CPDF_Dictionary* pDict = NULL;
+ int n = 0;
+ for (n = 0; n < nContentMark; n++) {
+ CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
+ CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+ if (temp) {
+ bExist = TRUE;
+ actText = temp->GetUnicodeText();
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_PASS;
+ }
+ if (m_pPreTextObj) {
+ if (CPDF_ContentMarkData* pPreMarkData = (CPDF_ContentMarkData*)m_pPreTextObj->m_ContentMark.GetObject()) {
+ if (pPreMarkData->CountItems() == n) {
+ CPDF_ContentMarkItem& item = pPreMarkData->GetItem(n - 1);
+ if (pDict == item.GetParam()) {
+ return FPDFTEXT_MC_DONE;
+ }
+ }
+ }
+ }
+ CPDF_Font* pFont = pTextObj->GetFont();
+ FX_STRSIZE nItems = actText.GetLength();
+ if (nItems < 1) {
+ return FPDFTEXT_MC_PASS;
+ }
+ bExist = FALSE;
+ for (FX_STRSIZE i = 0; i < nItems; i++) {
+ FX_WCHAR wChar = actText.GetAt(i);
+ if (-1 == pFont->CharCodeFromUnicode(wChar)) {
+ continue;
+ } else {
+ bExist = TRUE;
+ break;
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_PASS;
+ }
+ bExist = FALSE;
+ for (FX_STRSIZE j = 0; j < nItems; j++) {
+ FX_WCHAR wChar = actText.GetAt(j);
+ if ((wChar > 0x80 && wChar < 0xFFFD) || (wChar <= 0x80 && isprint(wChar))) {
+ bExist = TRUE;
+ break;
+ }
+ }
+ if (!bExist) {
+ return FPDFTEXT_MC_DONE;
+ }
+ return FPDFTEXT_MC_DELAY;
+}
+void CPDF_TextPage::ProcessMarkedContent(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ CPDF_ContentMarkData* pMarkData = (CPDF_ContentMarkData*)pTextObj->m_ContentMark.GetObject();
+ if(!pMarkData) {
+ return;
+ }
+ int nContentMark = pMarkData->CountItems();
+ if (nContentMark < 1) {
+ return;
+ }
+ CFX_WideString actText;
+ CPDF_Dictionary* pDict = NULL;
+ int n = 0;
+ for (n = 0; n < nContentMark; n++) {
+ CPDF_ContentMarkItem& item = pMarkData->GetItem(n);
+ CFX_ByteString tagStr = (CFX_ByteString)item.GetName();
+ pDict = (CPDF_Dictionary*)item.GetParam();
+ CPDF_String* temp = (CPDF_String*)pDict->GetElement(FX_BSTRC("ActualText"));
+ if (temp) {
+ actText = temp->GetUnicodeText();
+ }
+ }
+ FX_STRSIZE nItems = actText.GetLength();
+ if (nItems < 1) {
+ return;
+ }
+ CPDF_Font* pFont = pTextObj->GetFont();
+ CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
+ CFX_AffineMatrix matrix;
+ pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ FX_FLOAT fPosX = pTextObj->GetPosX();
+ FX_FLOAT fPosY = pTextObj->GetPosY();
+ int nCharInfoIndex = m_TextBuf.GetLength();
+ CFX_FloatRect charBox;
+ charBox.top = pTextObj->m_Top;
+ charBox.left = pTextObj->m_Left;
+ charBox.right = pTextObj->m_Right;
+ charBox.bottom = pTextObj->m_Bottom;
+ for (FX_STRSIZE k = 0; k < nItems; k++) {
+ FX_WCHAR wChar = actText.GetAt(k);
+ if (wChar <= 0x80 && !isprint(wChar)) {
+ wChar = 0x20;
+ }
+ if (wChar >= 0xFFFD) {
+ continue;
+ }
+ PAGECHAR_INFO charinfo;
+ charinfo.m_OriginX = fPosX;
+ charinfo.m_OriginY = fPosY;
+ charinfo.m_Index = nCharInfoIndex;
+ charinfo.m_Unicode = wChar;
+ charinfo.m_CharCode = pFont->CharCodeFromUnicode(wChar);
+ charinfo.m_Flag = FPDFTEXT_CHAR_PIECE;
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_CharBox.top = charBox.top;
+ charinfo.m_CharBox.left = charBox.left;
+ charinfo.m_CharBox.right = charBox.right;
+ charinfo.m_CharBox.bottom = charBox.bottom;
+ charinfo.m_Matrix.Copy(matrix);
+ m_TempTextBuf.AppendChar(wChar);
+ m_TempCharList.Add(charinfo);
+ }
+}
+void CPDF_TextPage::FindPreviousTextObject(void)
+{
+ if (m_TempCharList.GetSize() < 1 && m_charList.GetSize() < 1) {
+ return;
+ }
+ PAGECHAR_INFO preChar;
+ if (m_TempCharList.GetSize() >= 1) {
+ preChar = *(PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
+ } else {
+ preChar = *(PAGECHAR_INFO*)m_charList.GetAt(m_charList.GetSize() - 1);
+ }
+ if (preChar.m_pTextObj) {
+ m_pPreTextObj = preChar.m_pTextObj;
+ }
+}
+void CPDF_TextPage::ProcessTextObject(PDFTEXT_Obj Obj)
+{
+ CPDF_TextObject* pTextObj = Obj.m_pTextObj;
+ if(FXSYS_fabs(pTextObj->m_Right - pTextObj->m_Left) < 0.01f ) {
+ return;
+ }
+ CFX_AffineMatrix formMatrix = Obj.m_formMatrix;
+ CPDF_Font* pFont = pTextObj->GetFont();
+ CFX_AffineMatrix matrix;
+ pTextObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ FX_INT32 bPreMKC = PreMarkedContent(Obj);
+ if (FPDFTEXT_MC_DONE == bPreMKC) {
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ return;
+ }
+ int result = 0;
+ if (m_pPreTextObj) {
+ result = ProcessInsertObject(pTextObj, formMatrix);
+ if (2 == result) {
+ m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
+ } else {
+ m_CurlineRect.Union(CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top));
+ }
+ PAGECHAR_INFO generateChar;
+ if (result == 1) {
+ if (GenerateCharInfo(TEXT_BLANK_CHAR, generateChar)) {
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
+ m_TempCharList.Add(generateChar);
+ }
+ } else if(result == 2) {
+ CloseTempLine();
+ if(m_TextBuf.GetSize()) {
+ if(m_ParseOptions.m_bGetCharCodeOnly) {
+ m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
+ m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
+ } else {
+ if(GenerateCharInfo(TEXT_RETURN_CHAR, generateChar)) {
+ m_TextBuf.AppendChar(TEXT_RETURN_CHAR);
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_charList.Add(generateChar);
+ }
+ if(GenerateCharInfo(TEXT_LINEFEED_CHAR, generateChar)) {
+ m_TextBuf.AppendChar(TEXT_LINEFEED_CHAR);
+ if (!formMatrix.IsIdentity()) {
+ generateChar.m_Matrix.Copy(formMatrix);
+ }
+ m_charList.Add(generateChar);
+ }
+ }
+ }
+ } else if (result == 3 && !m_ParseOptions.m_bOutputHyphen) {
+ FX_INT32 nChars = pTextObj->CountChars();
+ if (nChars == 1) {
+ CPDF_TextObjectItem item;
+ pTextObj->GetCharInfo(0, &item);
+ CFX_WideString wstrItem = pTextObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ }
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if (0x2D == curChar || 0xAD == curChar) {
+ return;
+ }
+ }
+ while (m_TempTextBuf.GetSize() > 0 && m_TempTextBuf.GetWideString().GetAt(m_TempTextBuf.GetLength() - 1) == 0x20) {
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+ m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
+ }
+ PAGECHAR_INFO* cha = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - 1);
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+#ifdef FOXIT_CHROME_BUILD
+ cha->m_Unicode = 0x2;
+ cha->m_Flag = FPDFTEXT_CHAR_HYPHEN;
+ m_TempTextBuf.AppendChar(0xfffe);
+#else
+ cha->m_Unicode = 0;
+ m_TempTextBuf.AppendChar(0xfffe);
+#endif
+ }
+ } else {
+ m_CurlineRect = CFX_FloatRect(Obj.m_pTextObj->m_Left, Obj.m_pTextObj->m_Bottom, Obj.m_pTextObj->m_Right, Obj.m_pTextObj->m_Top);
+ }
+ if (FPDFTEXT_MC_DELAY == bPreMKC) {
+ ProcessMarkedContent(Obj);
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ return;
+ }
+ m_pPreTextObj = pTextObj;
+ m_perMatrix.Copy(formMatrix);
+ int nItems = pTextObj->CountItems();
+ FX_FLOAT spacing = 0;
+ FX_FLOAT baseSpace = 0.0;
+ FX_BOOL bAllChar = TRUE;
+ if (pTextObj->m_TextState.GetObject()->m_CharSpace && nItems >= 3) {
+ spacing = matrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);
+ baseSpace = spacing;
+ for (int i = 0; i < nItems; i++) {
+ CPDF_TextObjectItem item;
+ pTextObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ FX_FLOAT kerning = -fontsize_h * item.m_OriginX / 1000;
+ if(kerning + spacing < baseSpace) {
+ baseSpace = kerning + spacing;
+ }
+ bAllChar = FALSE;
+ }
+ }
+ spacing = 0;
+ if(baseSpace < 0.0 || (nItems == 3 && !bAllChar)) {
+ baseSpace = 0.0;
+ }
+ }
+ for (int i = 0; i < nItems; i++) {
+ CPDF_TextObjectItem item;
+ PAGECHAR_INFO charinfo;
+ charinfo.m_OriginX = 0;
+ charinfo.m_OriginY = 0;
+ pTextObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ if(str.IsEmpty()) {
+ str = m_TextBuf.GetWideString();
+ }
+ if (str.IsEmpty() || str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
+ continue;
+ }
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ spacing = -fontsize_h * item.m_OriginX / 1000;
+ continue;
+ }
+ FX_FLOAT charSpace = pTextObj->m_TextState.GetObject()->m_CharSpace;
+ if (charSpace > 0.001) {
+ spacing += matrix.TransformDistance(charSpace);
+ } else if(charSpace < -0.001) {
+ spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
+ }
+ spacing -= baseSpace;
+ if (spacing && i > 0) {
+ int last_width = 0;
+ FX_FLOAT fontsize_h = pTextObj->m_TextState.GetFontSizeH();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT threshold = 0;
+ if (space_charcode != -1) {
+ threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
+ }
+ if (threshold > fontsize_h / 3) {
+ threshold = 0;
+ } else {
+ threshold /= 2;
+ }
+ if (threshold == 0) {
+ threshold = fontsize_h;
+ int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
+ threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
+ int nDivide = 6;
+ if (threshold < 300) {
+ nDivide = 2;
+ } else if (threshold < 500) {
+ nDivide = 4;
+ } else if (threshold < 700) {
+ nDivide = 5;
+ }
+ threshold = threshold / nDivide;
+ threshold = fontsize_h * threshold / 1000;
+ }
+ if (threshold && (spacing && spacing >= threshold) ) {
+ charinfo.m_Unicode = TEXT_BLANK_CHAR;
+ charinfo.m_Flag = FPDFTEXT_CHAR_GENERATED;
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_Index = m_TextBuf.GetLength();
+ m_TempTextBuf.AppendChar(TEXT_BLANK_CHAR);
+ charinfo.m_CharCode = -1;
+ charinfo.m_Matrix.Copy(formMatrix);
+ matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ charinfo.m_CharBox = CFX_FloatRect(charinfo.m_OriginX, charinfo.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ m_TempCharList.Add(charinfo);
+ }
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ }
+ spacing = 0;
+ CFX_WideString wstrItem = pFont->UnicodeFromCharCode(item.m_CharCode);
+ FX_BOOL bNoUnicode = FALSE;
+ FX_WCHAR wChar = wstrItem.GetAt(0);
+ if ((wstrItem.IsEmpty() || wChar == 0) && item.m_CharCode) {
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ } else {
+ wstrItem.SetAt(0, (FX_WCHAR)item.m_CharCode);
+ }
+ bNoUnicode = TRUE;
+ }
+ charinfo.m_Index = -1;
+ charinfo.m_CharCode = item.m_CharCode;
+ if(bNoUnicode) {
+ charinfo.m_Flag = FPDFTEXT_CHAR_UNUNICODE;
+ } else {
+ charinfo.m_Flag = FPDFTEXT_CHAR_NORMAL;
+ }
+ charinfo.m_pTextObj = pTextObj;
+ charinfo.m_OriginX = 0, charinfo.m_OriginY = 0;
+ matrix.Transform(item.m_OriginX, item.m_OriginY, charinfo.m_OriginX, charinfo.m_OriginY);
+ FX_RECT rect(0, 0, 0, 0);
+ rect.Intersect(0, 0, 0, 0);
+ charinfo.m_pTextObj->GetFont()->GetCharBBox(charinfo.m_CharCode, rect);
+ charinfo.m_CharBox.top = rect.top * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
+ charinfo.m_CharBox.left = rect.left * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
+ charinfo.m_CharBox.right = rect.right * pTextObj->GetFontSize() / 1000 + item.m_OriginX;
+ charinfo.m_CharBox.bottom = rect.bottom * pTextObj->GetFontSize() / 1000 + item.m_OriginY;
+ if (fabsf(charinfo.m_CharBox.top - charinfo.m_CharBox.bottom) < 0.01f) {
+ charinfo.m_CharBox.top = charinfo.m_CharBox.bottom + pTextObj->GetFontSize();
+ }
+ if (fabsf(charinfo.m_CharBox.right - charinfo.m_CharBox.left) < 0.01f) {
+ charinfo.m_CharBox.right = charinfo.m_CharBox.left + pTextObj->GetCharWidth(charinfo.m_CharCode);
+ }
+ matrix.TransformRect(charinfo.m_CharBox);
+ charinfo.m_Matrix.Copy(matrix);
+ if (wstrItem.IsEmpty()) {
+ charinfo.m_Unicode = 0;
+ m_TempCharList.Add(charinfo);
+ m_TempTextBuf.AppendChar(0xfffe);
+ continue;
+ } else {
+ int nTotal = wstrItem.GetLength();
+ int n = 0;
+ FX_BOOL bDel = FALSE;
+ while (n < m_TempCharList.GetSize() && n < 7) {
+ n++;
+ PAGECHAR_INFO* charinfo1 = (PAGECHAR_INFO*)m_TempCharList.GetAt(m_TempCharList.GetSize() - n);
+ if(charinfo1->m_CharCode == charinfo.m_CharCode &&
+ charinfo1->m_pTextObj->GetFont() == charinfo.m_pTextObj->GetFont() &&
+ FXSYS_fabs(charinfo1->m_OriginX - charinfo.m_OriginX) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() &&
+ FXSYS_fabs(charinfo1->m_OriginY - charinfo.m_OriginY) < TEXT_CHARRATIO_GAPDELTA * pTextObj->GetFontSize() ) {
+ bDel = TRUE;
+ break;
+ }
+ }
+ if(!bDel) {
+ for (int nIndex = 0; nIndex < nTotal; nIndex++) {
+ charinfo.m_Unicode = wstrItem.GetAt(nIndex);
+ if (charinfo.m_Unicode) {
+ charinfo.m_Index = m_TextBuf.GetLength();
+ m_TempTextBuf.AppendChar(charinfo.m_Unicode);
+ } else {
+ m_TempTextBuf.AppendChar(0xfffe);
+ }
+ m_TempCharList.Add(charinfo);
+ }
+ } else if(i == 0) {
+ CFX_WideString str = m_TempTextBuf.GetWideString();
+ if (!str.IsEmpty() && str.GetAt(str.GetLength() - 1) == TEXT_BLANK_CHAR) {
+ m_TempTextBuf.Delete(m_TempTextBuf.GetLength() - 1, 1);
+ m_TempCharList.Delete(m_TempCharList.GetSize() - 1);
+ }
+ }
+ }
+ }
+}
+FX_INT32 CPDF_TextPage::GetTextObjectWritingMode(const CPDF_TextObject* pTextObj)
+{
+ FX_INT32 nChars = pTextObj->CountChars();
+ if (nChars == 1) {
+ return m_TextlineDir;
+ }
+ CPDF_TextObjectItem first, last;
+ pTextObj->GetCharInfo(0, &first);
+ pTextObj->GetCharInfo(nChars - 1, &last);
+ CFX_Matrix textMatrix;
+ pTextObj->GetTextMatrix(&textMatrix);
+ textMatrix.TransformPoint(first.m_OriginX, first.m_OriginY);
+ textMatrix.TransformPoint(last.m_OriginX, last.m_OriginY);
+ FX_FLOAT dX = FXSYS_fabs(last.m_OriginX - first.m_OriginX);
+ FX_FLOAT dY = FXSYS_fabs(last.m_OriginY - first.m_OriginY);
+ if (dX <= 0.0001f && dY <= 0.0001f) {
+ return -1;
+ }
+ CFX_VectorF v;
+ v.Set(dX, dY);
+ v.Normalize();
+ if (v.y <= 0.0872f) {
+ if (v.x <= 0.0872f) {
+ return m_TextlineDir;
+ }
+ return 0;
+ } else if (v.x <= 0.0872f) {
+ return 1;
+ }
+ return m_TextlineDir;
+}
+FX_BOOL CPDF_TextPage::IsHyphen(FX_WCHAR curChar)
+{
+ CFX_WideString strCurText = m_TempTextBuf.GetWideString();
+ if(strCurText.GetLength() == 0) {
+ strCurText = m_TextBuf.GetWideString();
+ }
+ FX_STRSIZE nCount = strCurText.GetLength();
+ int nIndex = nCount - 1;
+ FX_WCHAR wcTmp = strCurText.GetAt(nIndex);
+ while(wcTmp == 0x20 && nIndex <= nCount - 1 && nIndex >= 0) {
+ wcTmp = strCurText.GetAt(--nIndex);
+ }
+ if (0x2D == wcTmp || 0xAD == wcTmp) {
+ if (--nIndex > 0) {
+ FX_WCHAR preChar = strCurText.GetAt((nIndex));
+ if (((preChar >= L'A' && preChar <= L'Z') || (preChar >= L'a' && preChar <= L'z'))
+ && ((curChar >= L'A' && curChar <= L'Z') || (curChar >= L'a' && curChar <= L'z'))) {
+ return TRUE;
+ }
+ }
+ int size = m_TempCharList.GetSize();
+ PAGECHAR_INFO preChar;
+ if (size) {
+ preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
+ } else {
+ size = m_charList.GetSize();
+ if(size == 0) {
+ return FALSE;
+ }
+ preChar = (PAGECHAR_INFO)m_charList[size - 1];
+ }
+ if (FPDFTEXT_CHAR_PIECE == preChar.m_Flag)
+ if (0xAD == preChar.m_Unicode || 0x2D == preChar.m_Unicode) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+int CPDF_TextPage::ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
+{
+ FindPreviousTextObject();
+ FX_BOOL bNewline = FALSE;
+ int WritingMode = GetTextObjectWritingMode(pObj);
+ if(WritingMode == -1) {
+ WritingMode = GetTextObjectWritingMode(m_pPreTextObj);
+ }
+ CFX_FloatRect this_rect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ CFX_FloatRect prev_rect(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
+ CPDF_TextObjectItem PrevItem, item;
+ int nItem = m_pPreTextObj->CountItems();
+ m_pPreTextObj->GetItemInfo(nItem - 1, &PrevItem);
+ pObj->GetItemInfo(0, &item);
+ CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstrItem.IsEmpty()) {
+ wstrItem += (FX_WCHAR)item.m_CharCode;
+ }
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if(WritingMode == 0) {
+ if(this_rect.Height() > 4.5 && prev_rect.Height() > 4.5) {
+ FX_FLOAT top = this_rect.top < prev_rect.top ? this_rect.top : prev_rect.top;
+ FX_FLOAT bottom = this_rect.bottom > prev_rect.bottom ? this_rect.bottom : prev_rect.bottom;
+ if(bottom >= top) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ }
+ } else if (WritingMode == 1) {
+ if(this_rect.Width() > pObj->GetFontSize() * 0.1f && prev_rect.Width() > m_pPreTextObj->GetFontSize() * 0.1f) {
+ FX_FLOAT left = this_rect.left > m_CurlineRect.left ? this_rect.left : m_CurlineRect.left;
+ FX_FLOAT right = this_rect.right < m_CurlineRect.right ? this_rect.right : m_CurlineRect.right;
+ if(right <= left) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ }
+ }
+ FX_FLOAT last_pos = PrevItem.m_OriginX;
+ int nLastWidth = GetCharWidth(PrevItem.m_CharCode, m_pPreTextObj->GetFont());
+ FX_FLOAT last_width = nLastWidth * m_pPreTextObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
+ FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ m_pPreTextObj->GetTextMatrix(&prev_matrix);
+ prev_matrix.Concat(m_perMatrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX();
+ FX_FLOAT y = pObj->GetPosY();
+ formMatrix.Transform(x, y);
+ prev_reverse.Transform(x, y);
+ if(last_width < this_width) {
+ threshold = prev_reverse.TransformDistance(threshold);
+ }
+ CFX_FloatRect rect1(m_pPreTextObj->m_Left, pObj->m_Bottom, m_pPreTextObj->m_Right, pObj->m_Top);
+ CFX_FloatRect rect2(m_pPreTextObj->m_Left, m_pPreTextObj->m_Bottom, m_pPreTextObj->m_Right, m_pPreTextObj->m_Top);
+ CFX_FloatRect rect3 = rect1;
+ rect1.Intersect(rect2);
+ if (WritingMode == 0) {
+ if ((rect1.IsEmpty() && rect2.Height() > 5 && rect3.Height() > 5)
+ || ((y > threshold * 2 || y < threshold * -3) && (FXSYS_fabs(y) < 1 ? FXSYS_fabs(x) < FXSYS_fabs(y) : TRUE))) {
+ bNewline = TRUE;
+ if(nItem > 1 ) {
+ CPDF_TextObjectItem tempItem;
+ m_pPreTextObj->GetItemInfo(0, &tempItem);
+ CFX_AffineMatrix m;
+ m_pPreTextObj->GetTextMatrix(&m);
+ if(PrevItem.m_OriginX > tempItem.m_OriginX &&
+ m_DisplayMatrix.a > 0.9 && m_DisplayMatrix.b < 0.1 &&
+ m_DisplayMatrix.c < 0.1 && m_DisplayMatrix.d < -0.9
+ && m.b < 0.1 && m.c < 0.1 ) {
+ CFX_FloatRect re(0, m_pPreTextObj->m_Bottom, 1000, m_pPreTextObj->m_Top);
+ if(re.Contains(pObj->GetPosX(), pObj->GetPosY())) {
+ bNewline = FALSE;
+ } else {
+ CFX_FloatRect re(0, pObj->m_Bottom, 1000, pObj->m_Top);
+ if(re.Contains(m_pPreTextObj->GetPosX(), m_pPreTextObj->GetPosY())) {
+ bNewline = FALSE;
+ }
+ }
+ }
+ }
+ }
+ }
+ if(bNewline) {
+ if(IsHyphen(curChar)) {
+ return 3;
+ }
+ return 2;
+ }
+ FX_INT32 nChars = pObj->CountChars();
+ if (nChars == 1 && ( 0x2D == curChar || 0xAD == curChar))
+ if (IsHyphen(curChar)) {
+ return 3;
+ }
+ CFX_WideString PrevStr = m_pPreTextObj->GetFont()->UnicodeFromCharCode(PrevItem.m_CharCode);
+ FX_WCHAR preChar = PrevStr.GetAt(PrevStr.GetLength() - 1);
+ CFX_AffineMatrix matrix;
+ pObj->GetTextMatrix(&matrix);
+ matrix.Concat(formMatrix);
+ threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
+ threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : (threshold > 800 ? threshold / 6 : threshold / 5)) : (threshold / 2);
+ if(nLastWidth >= nThisWidth) {
+ threshold *= FXSYS_fabs(m_pPreTextObj->GetFontSize());
+ } else {
+ threshold *= FXSYS_fabs(pObj->GetFontSize());
+ threshold = matrix.TransformDistance(threshold);
+ threshold = prev_reverse.TransformDistance(threshold);
+ }
+ threshold /= 1000;
+ if((threshold < 1.4881 && threshold > 1.4879)
+ || (threshold < 1.39001 && threshold > 1.38999)) {
+ threshold *= 1.5;
+ }
+ if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
+ if (curChar != L' ' && preChar != L' ') {
+ if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if(x < 0 && (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
+ return 1;
+ }
+ }
+ return 0;
+}
+FX_BOOL CPDF_TextPage::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
+{
+ if (!pTextObj1 || !pTextObj2) {
+ return FALSE;
+ }
+ CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+ CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+ if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty() && !m_ParseOptions.m_bGetCharCodeOnly) {
+ FX_FLOAT dbXdif = FXSYS_fabs(rcPreObj.left - rcCurObj.left);
+ int nCount = m_charList.GetSize();
+ if (nCount >= 2) {
+ PAGECHAR_INFO perCharTemp = (PAGECHAR_INFO)m_charList[nCount - 2];
+ FX_FLOAT dbSpace = perCharTemp.m_CharBox.Width();
+ if (dbXdif > dbSpace) {
+ return FALSE;
+ }
+ }
+ }
+ if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+ rcPreObj.Intersect(rcCurObj);
+ if (rcPreObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+ return FALSE;
+ }
+ if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+ return FALSE;
+ }
+ }
+ int nPreCount = pTextObj2->CountItems();
+ int nCurCount = pTextObj1->CountItems();
+ if (nPreCount != nCurCount) {
+ return FALSE;
+ }
+ CPDF_TextObjectItem itemPer, itemCur;
+ for (int i = 0; i < nPreCount; i++) {
+ pTextObj2->GetItemInfo(i, &itemPer);
+ pTextObj1->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return FALSE;
+ }
+ }
+ if(FXSYS_fabs(pTextObj1->GetPosX() - pTextObj2->GetPosX()) > GetCharWidth(itemPer.m_CharCode, pTextObj2->GetFont())*pTextObj2->GetFontSize() / 1000 * 0.9 ||
+ FXSYS_fabs(pTextObj1->GetPosY() - pTextObj2->GetPosY()) >
+ FX_MAX(FX_MAX(rcPreObj.Height() , rcPreObj.Width()), pTextObj2->GetFontSize()) / 8) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos)
+{
+ if (!pTextObj) {
+ return FALSE;
+ }
+ int i = 0;
+ if (!ObjPos) {
+ ObjPos = m_pPage->GetLastObjectPosition();
+ }
+ CPDF_PageObject* pObj = m_pPage->GetPrevObject(ObjPos);
+ while (i < 5 && ObjPos) {
+ pObj = m_pPage->GetPrevObject(ObjPos);
+ if(pObj == pTextObj) {
+ continue;
+ }
+ if(pObj->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ if(IsSameTextObject((CPDF_TextObject*)pObj, pTextObj)) {
+ return TRUE;
+ }
+ i++;
+ }
+ return FALSE;
+}
+FX_BOOL CPDF_TextPage::GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info)
+{
+ int size = m_TempCharList.GetSize();
+ PAGECHAR_INFO preChar;
+ if (size) {
+ preChar = (PAGECHAR_INFO)m_TempCharList[size - 1];
+ } else {
+ size = m_charList.GetSize();
+ if(size == 0) {
+ return FALSE;
+ }
+ preChar = (PAGECHAR_INFO)m_charList[size - 1];
+ }
+ info.m_Index = m_TextBuf.GetLength();
+ info.m_Unicode = unicode;
+ info.m_pTextObj = NULL;
+ info.m_CharCode = -1;
+ info.m_Flag = FPDFTEXT_CHAR_GENERATED;
+ int preWidth = 0;
+ if (preChar.m_pTextObj && preChar.m_CharCode != (FX_DWORD) - 1) {
+ preWidth = GetCharWidth(preChar.m_CharCode, preChar.m_pTextObj->GetFont());
+ }
+ FX_FLOAT fs = 0;
+ if(preChar.m_pTextObj) {
+ fs = preChar.m_pTextObj->GetFontSize();
+ } else {
+ fs = preChar.m_CharBox.Height();
+ }
+ if(!fs) {
+ fs = 1;
+ }
+ info.m_OriginX = preChar.m_OriginX + preWidth * (fs) / 1000;
+ info.m_OriginY = preChar.m_OriginY;
+ info.m_CharBox = CFX_FloatRect(info.m_OriginX, info.m_OriginY, info.m_OriginX, info.m_OriginY);
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2)
+{
+ rect1.Intersect(rect2);
+ if(rect1.IsEmpty()) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPage::IsLetter(FX_WCHAR unicode)
+{
+ if (unicode < L'A') {
+ return FALSE;
+ }
+ if (unicode > L'Z' && unicode < L'a') {
+ return FALSE;
+ }
+ if (unicode > L'z') {
+ return FALSE;
+ }
+ return TRUE;
+}
+CPDF_TextPageFind::CPDF_TextPageFind(const IPDF_TextPage* pTextPage)
+ : m_IsFind(FALSE),
+ m_pTextPage(NULL)
+{
+ if (!pTextPage) {
+ return;
+ }
+ CPDF_ModuleMgr* pPDFModule = CPDF_ModuleMgr::Get();
+ m_pTextPage = pTextPage;
+ m_strText = m_pTextPage->GetPageText();
+ int nCount = pTextPage->CountChars();
+ if(nCount) {
+ m_CharIndex.Add(0);
+ }
+ for(int i = 0; i < nCount; i++) {
+ FPDF_CHAR_INFO info;
+ pTextPage->GetCharInfo(i, info);
+ int indexSize = m_CharIndex.GetSize();
+ if(info.m_Flag == CHAR_NORMAL || info.m_Flag == CHAR_GENERATED) {
+ if(indexSize % 2) {
+ m_CharIndex.Add(1);
+ } else {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, m_CharIndex.GetAt(indexSize - 1) + 1);
+ }
+ } else {
+ if(indexSize % 2) {
+ if(indexSize <= 0) {
+ continue;
+ }
+ m_CharIndex.SetAt(indexSize - 1, i + 1);
+ } else {
+ m_CharIndex.Add(i + 1);
+ }
+ }
+ }
+ int indexSize = m_CharIndex.GetSize();
+ if(indexSize % 2) {
+ m_CharIndex.RemoveAt(indexSize - 1);
+ }
+ m_resStart = 0;
+ m_resEnd = -1;
+}
+int CPDF_TextPageFind::GetCharIndex(int index) const
+{
+ return m_pTextPage->CharIndexFromTextIndex(index);
+ int indexSize = m_CharIndex.GetSize();
+ int count = 0;
+ for(int i = 0; i < indexSize; i += 2) {
+ count += m_CharIndex.GetAt(i + 1);
+ if(count > index) {
+ return index - count + m_CharIndex.GetAt(i + 1) + m_CharIndex.GetAt(i);
+ }
+ }
+ return -1;
+}
+FX_BOOL CPDF_TextPageFind::FindFirst(CFX_WideString findwhat, int flags, int startPos)
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) {
+ m_strText = m_pTextPage->GetPageText();
+ }
+ m_findWhat = findwhat;
+ m_flags = flags;
+ m_bMatchCase = flags & FPDFTEXT_MATCHCASE;
+ if (m_strText.IsEmpty()) {
+ m_IsFind = FALSE;
+ return TRUE;
+ }
+ FX_STRSIZE len = findwhat.GetLength();
+ if (!m_bMatchCase) {
+ findwhat.MakeLower();
+ m_strText.MakeLower();
+ }
+ m_bMatchWholeWord = flags & FPDFTEXT_MATCHWHOLEWORD;
+ m_findNextStart = startPos;
+ if (startPos == -1) {
+ m_findPreStart = m_strText.GetLength() - 1;
+ } else {
+ m_findPreStart = startPos;
+ }
+ m_csFindWhatArray.RemoveAll();
+ int i = 0;
+ while(i < len) {
+ if(findwhat.GetAt(i) != ' ') {
+ break;
+ }
+ i++;
+ }
+ if(i < len) {
+ ExtractFindWhat(findwhat);
+ } else {
+ m_csFindWhatArray.Add(findwhat);
+ }
+ if(m_csFindWhatArray.GetSize() <= 0) {
+ return FALSE;
+ }
+ m_IsFind = TRUE;
+ m_resStart = 0;
+ m_resEnd = -1;
+ return TRUE;
+}
+FX_BOOL CPDF_TextPageFind::FindNext()
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ m_resArray.RemoveAll();
+ if(m_findNextStart == -1) {
+ return FALSE;
+ }
+ if(m_strText.IsEmpty()) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int strLen = m_strText.GetLength();
+ if (m_findNextStart > strLen - 1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int nCount = m_csFindWhatArray.GetSize();
+ int nResultPos = 0;
+ int nStartPos = 0;
+ nStartPos = m_findNextStart;
+ FX_BOOL bSpaceStart = FALSE;
+ for(int iWord = 0; iWord < nCount; iWord++) {
+ CFX_WideString csWord = m_csFindWhatArray[iWord];
+ if(csWord.IsEmpty()) {
+ if(iWord == nCount - 1) {
+ FX_WCHAR strInsert = m_strText.GetAt(nStartPos);
+ if(strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_BLANK_CHAR || strInsert == TEXT_RETURN_CHAR || strInsert == 160) {
+ nResultPos = nStartPos + 1;
+ break;
+ }
+ iWord = -1;
+ } else if(iWord == 0) {
+ bSpaceStart = TRUE;
+ }
+ continue;
+ }
+ int endIndex;
+ nResultPos = m_strText.Find(csWord, nStartPos);
+ if (nResultPos == -1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ endIndex = nResultPos + csWord.GetLength() - 1;
+ if(iWord == 0) {
+ m_resStart = nResultPos;
+ }
+ FX_BOOL bMatch = TRUE;
+ if(iWord != 0 && !bSpaceStart) {
+ int PreResEndPos = nStartPos;
+ int curChar = csWord.GetAt(0);
+ CFX_WideString lastWord = m_csFindWhatArray[iWord - 1];
+ int lastChar = lastWord.GetAt(lastWord.GetLength() - 1);
+ if(nStartPos == nResultPos && !(_IsIgnoreSpaceCharacter(lastChar) || _IsIgnoreSpaceCharacter(curChar))) {
+ bMatch = FALSE;
+ }
+ for(int d = PreResEndPos; d < nResultPos; d++) {
+ FX_WCHAR strInsert = m_strText.GetAt(d);
+ if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
+ bMatch = FALSE;
+ break;
+ }
+ }
+ } else if(bSpaceStart) {
+ if(nResultPos > 0) {
+ FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1);
+ if(strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_BLANK_CHAR && strInsert != TEXT_RETURN_CHAR && strInsert != 160) {
+ bMatch = FALSE;
+ m_resStart = nResultPos;
+ } else {
+ m_resStart = nResultPos - 1;
+ }
+ }
+ }
+ if(m_bMatchWholeWord && bMatch) {
+ bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex);
+ }
+ nStartPos = endIndex + 1;
+ if(!bMatch) {
+ iWord = -1;
+ if(bSpaceStart) {
+ nStartPos = m_resStart + m_csFindWhatArray[1].GetLength();
+ } else {
+ nStartPos = m_resStart + m_csFindWhatArray[0].GetLength();
+ }
+ }
+ }
+ m_resEnd = nResultPos + m_csFindWhatArray[m_csFindWhatArray.GetSize() - 1].GetLength() - 1;
+ m_IsFind = TRUE;
+ int resStart = GetCharIndex(m_resStart);
+ int resEnd = GetCharIndex(m_resEnd);
+ m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1, m_resArray);
+ if(m_flags & FPDFTEXT_CONSECUTIVE) {
+ m_findNextStart = m_resStart + 1;
+ m_findPreStart = m_resEnd - 1;
+ } else {
+ m_findNextStart = m_resEnd + 1;
+ m_findPreStart = m_resStart - 1;
+ }
+ return m_IsFind;
+}
+FX_BOOL CPDF_TextPageFind::FindPrev()
+{
+ if (!m_pTextPage) {
+ return FALSE;
+ }
+ m_resArray.RemoveAll();
+ if(m_strText.IsEmpty() || m_findPreStart < 0) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ CPDF_TextPageFind findEngine(m_pTextPage);
+ FX_BOOL ret = findEngine.FindFirst(m_findWhat, m_flags);
+ if(!ret) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ int order = -1, MatchedCount = 0;
+ while(ret) {
+ ret = findEngine.FindNext();
+ if(ret) {
+ int order1 = findEngine.GetCurOrder() ;
+ int MatchedCount1 = findEngine.GetMatchedCount();
+ if(((order1 + MatchedCount1) - 1) > m_findPreStart) {
+ break;
+ }
+ order = order1;
+ MatchedCount = MatchedCount1;
+ }
+ }
+ if(order == -1) {
+ m_IsFind = FALSE;
+ return m_IsFind;
+ }
+ m_resStart = m_pTextPage->TextIndexFromCharIndex(order);
+ m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1);
+ m_IsFind = TRUE;
+ m_pTextPage->GetRectArray(order, MatchedCount, m_resArray);
+ if(m_flags & FPDFTEXT_CONSECUTIVE) {
+ m_findNextStart = m_resStart + 1;
+ m_findPreStart = m_resEnd - 1;
+ } else {
+ m_findNextStart = m_resEnd + 1;
+ m_findPreStart = m_resStart - 1;
+ }
+ return m_IsFind;
+}
+void CPDF_TextPageFind::ExtractFindWhat(CFX_WideString findwhat)
+{
+ if(findwhat.IsEmpty()) {
+ return ;
+ }
+ int index = 0;
+ while(1) {
+ CFX_WideString csWord = TEXT_EMPTY;
+ int ret = ExtractSubString(csWord, findwhat, index, TEXT_BLANK_CHAR);
+ if(csWord.IsEmpty()) {
+ if(ret) {
+ m_csFindWhatArray.Add(CFX_WideString(L""));
+ index++;
+ continue;
+ } else {
+ break;
+ }
+ }
+ int pos = 0;
+ FX_BOOL bLastIgnore = FALSE;
+ while(pos < csWord.GetLength()) {
+ CFX_WideString curStr = csWord.Mid(pos, 1);
+ FX_WCHAR curChar = csWord.GetAt(pos);
+ if (_IsIgnoreSpaceCharacter(curChar)) {
+ if (pos > 0 && curChar == 0x2019) {
+ pos++;
+ continue;
+ }
+ if (pos > 0 ) {
+ CFX_WideString preStr = csWord.Mid(0, pos);
+ m_csFindWhatArray.Add(preStr);
+ }
+ m_csFindWhatArray.Add(curStr);
+ if (pos == csWord.GetLength() - 1) {
+ csWord.Empty();
+ break;
+ }
+ csWord = csWord.Right(csWord.GetLength() - pos - 1);
+ pos = 0;
+ bLastIgnore = TRUE;
+ continue;
+ } else {
+ bLastIgnore = FALSE;
+ }
+ pos++;
+ }
+ if (!csWord.IsEmpty()) {
+ m_csFindWhatArray.Add(csWord);
+ }
+ index++;
+ }
+ return;
+}
+FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos)
+{
+ int char_left = 0;
+ int char_right = 0;
+ int char_count = endPos - startPos + 1;
+ if(char_count < 1) {
+ return FALSE;
+ }
+ if (char_count == 1 && csPageText.GetAt(startPos) > 255) {
+ return TRUE;
+ }
+ if(startPos - 1 >= 0 ) {
+ char_left = csPageText.GetAt(startPos - 1);
+ }
+ if(startPos + char_count < csPageText.GetLength()) {
+ char_right = csPageText.GetAt(startPos + char_count);
+ }
+ if(char_left == 0x61) {
+ int a = 0;
+ }
+ if ((char_left > 'A' && char_left < 'a') || (char_left > 'a' && char_left < 'z') || (char_left > 0xfb00 && char_left < 0xfb06) || (char_left >= '0' && char_left <= '9') ||
+ (char_right > 'A' && char_right < 'a') || (char_right > 'a' && char_right < 'z') || (char_right > 0xfb00 && char_right < 0xfb06) || (char_right >= '0' && char_right <= '9')) {
+ return FALSE;
+ }
+ if(!(('A' > char_left || char_left > 'Z') && ('a' > char_left || char_left > 'z')
+ && ('A' > char_right || char_right > 'Z') && ('a' > char_right || char_right > 'z'))) {
+ return FALSE;
+ }
+ if (char_count > 0) {
+ if (csPageText.GetAt(startPos) >= L'0' && csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && char_left <= L'9') {
+ return FALSE;
+ }
+ if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && char_right >= L'0' && char_right <= L'9') {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
+ int iSubString, FX_WCHAR chSep)
+{
+ if (lpszFullString == NULL) {
+ return FALSE;
+ }
+ while (iSubString--) {
+ lpszFullString = FXSYS_wcschr(lpszFullString, chSep);
+ if (lpszFullString == NULL) {
+ rString.Empty();
+ return FALSE;
+ }
+ lpszFullString++;
+ while(*lpszFullString == chSep) {
+ lpszFullString++;
+ }
+ }
+ FX_LPCWSTR lpchEnd = FXSYS_wcschr(lpszFullString, chSep);
+ int nLen = (lpchEnd == NULL) ?
+ (int)FXSYS_wcslen(lpszFullString) : (int)(lpchEnd - lpszFullString);
+ ASSERT(nLen >= 0);
+ FXSYS_memcpy32(rString.GetBuffer(nLen), lpszFullString, nLen * sizeof(FX_WCHAR));
+ rString.ReleaseBuffer();
+ return TRUE;
+}
+CFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString str)
+{
+ CFX_WideString str2;
+ str2.Empty();
+ int nlen = str.GetLength();
+ for(int i = nlen - 1; i >= 0; i--) {
+ str2 += str.GetAt(i);
+ }
+ return str2;
+}
+void CPDF_TextPageFind::GetRectArray(CFX_RectArray& rects) const
+{
+ rects.Copy(m_resArray);
+}
+int CPDF_TextPageFind::GetCurOrder() const
+{
+ return GetCharIndex(m_resStart);
+}
+int CPDF_TextPageFind::GetMatchedCount()const
+{
+ int resStart = GetCharIndex(m_resStart);
+ int resEnd = GetCharIndex(m_resEnd);
+ return resEnd - resStart + 1;
+}
+CPDF_LinkExtract::CPDF_LinkExtract()
+ : m_pTextPage(NULL),
+ m_IsParserd(FALSE)
+{
+}
+CPDF_LinkExtract::~CPDF_LinkExtract()
+{
+ DeleteLinkList();
+}
+FX_BOOL CPDF_LinkExtract::ExtractLinks(const IPDF_TextPage* pTextPage)
+{
+ if (!pTextPage || !pTextPage->IsParsered()) {
+ return FALSE;
+ }
+ m_pTextPage = (const CPDF_TextPage*)pTextPage;
+ m_strPageText = m_pTextPage->GetPageText(0, -1);
+ DeleteLinkList();
+ if (m_strPageText.IsEmpty()) {
+ return FALSE;
+ }
+ parserLink();
+ m_IsParserd = TRUE;
+ return TRUE;
+}
+void CPDF_LinkExtract::DeleteLinkList()
+{
+ while (m_LinkList.GetSize()) {
+ CPDF_LinkExt* linkinfo = NULL;
+ linkinfo = m_LinkList.GetAt(0);
+ m_LinkList.RemoveAt(0);
+ delete linkinfo;
+ }
+ m_LinkList.RemoveAll();
+}
+int CPDF_LinkExtract::CountLinks() const
+{
+ if (!m_IsParserd) {
+ return -1;
+ }
+ return m_LinkList.GetSize();
+}
+void CPDF_LinkExtract::parserLink()
+{
+ int start = 0, pos = 0;
+ int TotalChar = m_pTextPage->CountChars();
+ while (pos < TotalChar) {
+ FPDF_CHAR_INFO pageChar;
+ m_pTextPage->GetCharInfo(pos, pageChar);
+ if (pageChar.m_Flag == CHAR_GENERATED || pageChar.m_Unicode == 0x20 || pos == TotalChar - 1) {
+ int nCount = pos - start;
+ if(pos == TotalChar - 1) {
+ nCount++;
+ }
+ CFX_WideString strBeCheck;
+ strBeCheck = m_pTextPage->GetPageText(start, nCount);
+ if (strBeCheck.GetLength() > 5) {
+ while(strBeCheck.GetLength() > 0) {
+ FX_WCHAR ch = strBeCheck.GetAt(strBeCheck.GetLength() - 1);
+ if (ch == L')' || ch == L',' || ch == L'>' || ch == L'.') {
+ strBeCheck = strBeCheck.Mid(0, strBeCheck.GetLength() - 1);
+ nCount--;
+ } else {
+ break;
+ }
+ }
+ if (nCount > 5 && (CheckWebLink(strBeCheck) || CheckMailLink(strBeCheck))) {
+ if (!AppendToLinkList(start, nCount, strBeCheck)) {
+ break;
+ }
+ }
+ }
+ start = ++pos;
+ } else {
+ pos++;
+ }
+ }
+}
+FX_BOOL CPDF_LinkExtract::CheckWebLink(CFX_WideString& strBeCheck)
+{
+ CFX_WideString str = strBeCheck;
+ str.MakeLower();
+ if (str.Find(L"http://www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://www."));
+ return TRUE;
+ } else if (str.Find(L"http://") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"http://"));
+ return TRUE;
+ } else if (str.Find(L"https://www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://www."));
+ return TRUE;
+ } else if (str.Find(L"https://") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"https://"));
+ return TRUE;
+ } else if (str.Find(L"www.") != -1) {
+ strBeCheck = strBeCheck.Right(str.GetLength() - str.Find(L"www."));
+ strBeCheck = L"http://" + strBeCheck;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+FX_BOOL CPDF_LinkExtract::CheckMailLink(CFX_WideString& str)
+{
+ str.MakeLower();
+ int aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ if (str.GetAt(aPos - 1) == L'.' || str.GetAt(aPos - 1) == L'_') {
+ return FALSE;
+ }
+ int i;
+ for (i = aPos - 1; i >= 0; i--) {
+ FX_WCHAR ch = str.GetAt(i);
+ if (ch == L'_' || ch == L'.' || (ch >= L'a' && ch <= L'z') || (ch >= L'0' && ch <= L'9')) {
+ continue;
+ } else {
+ if (i == aPos - 1) {
+ return FALSE;
+ }
+ str = str.Right(str.GetLength() - i - 1);
+ break;
+ }
+ }
+ aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ CFX_WideString strtemp = L"";
+ for (i = 0; i < aPos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if (wch >= L'a' && wch <= L'z') {
+ break;
+ } else {
+ strtemp = str.Right(str.GetLength() - i + 1);
+ }
+ }
+ if (strtemp != L"") {
+ str = strtemp;
+ }
+ aPos = str.Find(L'@');
+ if (aPos < 1) {
+ return FALSE;
+ }
+ str.TrimRight(L'.');
+ strtemp = str;
+ int ePos = str.Find(L'.');
+ if (ePos == -1) {
+ return FALSE;
+ }
+ while (ePos != -1) {
+ strtemp = strtemp.Right(strtemp.GetLength() - ePos - 1);
+ ePos = strtemp.Find('.');
+ }
+ ePos = strtemp.GetLength();
+ for (i = 0; i < ePos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if ((wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
+ continue;
+ } else {
+ str = str.Left(str.GetLength() - ePos + i + 1);
+ ePos = ePos - i - 1;
+ break;
+ }
+ }
+ int nLen = str.GetLength();
+ for (i = aPos + 1; i < nLen - ePos; i++) {
+ FX_WCHAR wch = str.GetAt(i);
+ if (wch == L'-' || wch == L'.' || (wch >= L'a' && wch <= L'z') || (wch >= L'0' && wch <= L'9')) {
+ continue;
+ } else {
+ return FALSE;
+ }
+ }
+ if (str.Find(L"mailto:") == -1) {
+ str = L"mailto:" + str;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_LinkExtract::AppendToLinkList(int start, int count, CFX_WideString strUrl)
+{
+ CPDF_LinkExt* linkInfo = NULL;
+ linkInfo = FX_NEW CPDF_LinkExt;
+ if (!linkInfo) {
+ return FALSE;
+ }
+ linkInfo->m_strUrl = strUrl;
+ linkInfo->m_Start = start;
+ linkInfo->m_Count = count;
+ m_LinkList.Add(linkInfo);
+ return TRUE;
+}
+CFX_WideString CPDF_LinkExtract::GetURL(int index) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return L"";
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return L"";
+ }
+ return link->m_strUrl;
+}
+void CPDF_LinkExtract::GetBoundedSegment(int index, int& start, int& count) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return ;
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return ;
+ }
+ start = link->m_Start;
+ count = link->m_Count;
+}
+void CPDF_LinkExtract::GetRects(int index, CFX_RectArray& rects) const
+{
+ if (!m_IsParserd || index < 0 || index >= m_LinkList.GetSize()) {
+ return;
+ }
+ CPDF_LinkExt* link = NULL;
+ link = m_LinkList.GetAt(index);
+ if (!link) {
+ return ;
+ }
+ m_pTextPage->GetRectArray(link->m_Start, link->m_Count, rects);
+}
diff --git a/core/src/fpdftext/fpdf_text_search.cpp b/core/src/fpdftext/fpdf_text_search.cpp
new file mode 100644
index 0000000000..b029f69048
--- /dev/null
+++ b/core/src/fpdftext/fpdf_text_search.cpp
@@ -0,0 +1,325 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdftext/fpdf_text.h"
+#include "../../include/fpdfapi/fpdf_page.h"
+class CPDF_TextStream : public CFX_Object
+{
+public:
+ CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray);
+ ~CPDF_TextStream() {}
+ FX_BOOL ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine);
+ CFX_WideTextBuf& m_Buffer;
+ FX_BOOL m_bUseLF;
+ CFX_PtrArray* m_pObjArray;
+ const CPDF_TextObject* m_pLastObj;
+};
+CPDF_TextStream::CPDF_TextStream(CFX_WideTextBuf& buffer, FX_BOOL bUseLF, CFX_PtrArray* pObjArray) : m_Buffer(buffer)
+{
+ m_pLastObj = NULL;
+ m_bUseLF = bUseLF;
+ m_pObjArray = pObjArray;
+}
+FX_BOOL FPDFText_IsSameTextObject(const CPDF_TextObject* pTextObj1, const CPDF_TextObject* pTextObj2)
+{
+ if (!pTextObj1 || !pTextObj2) {
+ return FALSE;
+ }
+ CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+ CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+ if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {
+ return TRUE;
+ }
+ if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+ rcPreObj.Intersect(rcCurObj);
+ if (rcPreObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+ return FALSE;
+ }
+ if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+ return FALSE;
+ }
+ }
+ int nPreCount = pTextObj2->CountItems();
+ int nCurCount = pTextObj1->CountItems();
+ if (nPreCount != nCurCount) {
+ return FALSE;
+ }
+ for (int i = 0; i < nPreCount; i++) {
+ CPDF_TextObjectItem itemPer, itemCur;
+ pTextObj2->GetItemInfo(i, &itemPer);
+ pTextObj1->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont)
+{
+ if(charCode == -1) {
+ return 0;
+ }
+ int w = pFont->GetCharWidthF(charCode);
+ if(w == 0) {
+ CFX_ByteString str;
+ pFont->AppendChar(str, charCode);
+ w = pFont->GetStringWidth(str, 1);
+ if(w == 0) {
+ FX_RECT BBox;
+ pFont->GetCharBBox(charCode, BBox);
+ w = BBox.right - BBox.left;
+ }
+ }
+ return w;
+}
+int FPDFText_ProcessInterObj(const CPDF_TextObject* pPrevObj, const CPDF_TextObject* pObj)
+{
+ if(FPDFText_IsSameTextObject(pPrevObj, pObj)) {
+ return -1;
+ }
+ CPDF_TextObjectItem item;
+ int nItem = pPrevObj->CountItems();
+ pPrevObj->GetItemInfo(nItem - 1, &item);
+ FX_WCHAR preChar = 0, curChar = 0;
+ CFX_WideString wstr = pPrevObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstr.GetLength()) {
+ preChar = wstr.GetAt(0);
+ }
+ FX_FLOAT last_pos = item.m_OriginX;
+ int nLastWidth = GetCharWidth(item.m_CharCode, pPrevObj->GetFont());
+ FX_FLOAT last_width = nLastWidth * pPrevObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ pObj->GetItemInfo(0, &item);
+ wstr = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wstr.GetLength()) {
+ curChar = wstr.GetAt(0);
+ }
+ int nThisWidth = GetCharWidth(item.m_CharCode, pObj->GetFont());
+ FX_FLOAT this_width = nThisWidth * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ pPrevObj->GetTextMatrix(&prev_matrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+ prev_reverse.Transform(x, y);
+ if (FXSYS_fabs(y) > threshold * 2) {
+ return 2;
+ }
+ threshold = (FX_FLOAT)(nLastWidth > nThisWidth ? nLastWidth : nThisWidth);
+ threshold = threshold > 400 ? (threshold < 700 ? threshold / 4 : threshold / 5) : (threshold / 2);
+ threshold *= nLastWidth > nThisWidth ? FXSYS_fabs(pPrevObj->GetFontSize()) : FXSYS_fabs(pObj->GetFontSize());
+ threshold /= 1000;
+ if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ' && preChar != L' ')
+ if(curChar != L' ' && preChar != L' ') {
+ if((x - last_pos - last_width) > threshold || (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if(x < 0 && (last_pos - x - last_width) > threshold) {
+ return 1;
+ }
+ if((x - last_pos - last_width) > this_width || (x - last_pos - this_width) > last_width ) {
+ return 1;
+ }
+ }
+ if(last_pos + last_width > x + this_width && curChar == L' ') {
+ return 3;
+ }
+ return 0;
+}
+FX_BOOL CPDF_TextStream::ProcessObject(const CPDF_TextObject* pObj, FX_BOOL bFirstLine)
+{
+ if(pObj->m_Bottom > 380 && pObj->m_Left < 45 && pObj->m_Top < 402) {
+ int i = 0;
+ }
+ CPDF_Font* pFont = pObj->GetFont();
+ CFX_AffineMatrix matrix;
+ pObj->GetTextMatrix(&matrix);
+ FX_FLOAT fs = pObj->GetFontSize();
+ int item_index = 0;
+ if (m_pLastObj) {
+ int result = FPDFText_ProcessInterObj(m_pLastObj, pObj);
+ if (result == 2) {
+ int len = m_Buffer.GetLength();
+ if (len && m_bUseLF && m_Buffer.GetBuffer()[len - 1] == L'-') {
+ m_Buffer.Delete(len - 1, 1);
+ if (m_pObjArray) {
+ m_pObjArray->RemoveAt((len - 1) * 2, 2);
+ }
+ } else {
+ if (bFirstLine) {
+ return TRUE;
+ }
+ if (m_bUseLF) {
+ m_Buffer.AppendChar(L'\r');
+ m_Buffer.AppendChar(L'\n');
+ if (m_pObjArray) {
+ for (int i = 0; i < 4; i ++) {
+ m_pObjArray->Add(NULL);
+ }
+ }
+ } else {
+ m_Buffer.AppendChar(' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ }
+ }
+ } else if (result == 1) {
+ m_Buffer.AppendChar(L' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ } else if (result == -1) {
+ m_pLastObj = pObj;
+ return FALSE;
+ } else if (result == 3) {
+ item_index = 1;
+ }
+ }
+ m_pLastObj = pObj;
+ int nItems = pObj->CountItems();
+ FX_FLOAT Ignorekerning = 0;
+ for(int i = 1; i < nItems - 1; i += 2) {
+ CPDF_TextObjectItem item;
+ pObj->GetItemInfo(i, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ if(i == 1) {
+ Ignorekerning = item.m_OriginX;
+ } else if(Ignorekerning > item.m_OriginX) {
+ Ignorekerning = item.m_OriginX;
+ }
+ } else {
+ Ignorekerning = 0;
+ break;
+ }
+ }
+ FX_FLOAT spacing = 0;
+ for (; item_index < nItems; item_index ++) {
+ CPDF_TextObjectItem item;
+ pObj->GetItemInfo(item_index, &item);
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ CFX_WideString wstr = m_Buffer.GetWideString();
+ if (wstr.IsEmpty() || wstr.GetAt(wstr.GetLength() - 1) == L' ') {
+ continue;
+ }
+ FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
+ spacing = -fontsize_h * (item.m_OriginX - Ignorekerning) / 1000;
+ continue;
+ }
+ FX_FLOAT charSpace = pObj->m_TextState.GetObject()->m_CharSpace;
+ if(nItems > 3 && !spacing) {
+ charSpace = 0;
+ }
+ if((spacing || charSpace) && item_index > 0) {
+ int last_width = 0;
+ FX_FLOAT fontsize_h = pObj->m_TextState.GetFontSizeH();
+ FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
+ FX_FLOAT threshold = 0;
+ if (space_charcode != -1) {
+ threshold = fontsize_h * pFont->GetCharWidthF(space_charcode) / 1000 ;
+ }
+ if(threshold > fontsize_h / 3) {
+ threshold = 0;
+ } else {
+ threshold /= 2;
+ }
+ if (threshold == 0) {
+ threshold = fontsize_h;
+ int this_width = FXSYS_abs(GetCharWidth(item.m_CharCode, pFont));
+ threshold = this_width > last_width ? (FX_FLOAT)this_width : (FX_FLOAT)last_width;
+ int nDivide = 6;
+ if (threshold < 300) {
+ nDivide = 2;
+ } else if (threshold < 500) {
+ nDivide = 4;
+ } else if (threshold < 700) {
+ nDivide = 5;
+ }
+ threshold = threshold / nDivide;
+ threshold = fontsize_h * threshold / 1000;
+ }
+ if(charSpace > 0.001) {
+ spacing += matrix.TransformDistance(charSpace);
+ } else if(charSpace < -0.001) {
+ spacing -= matrix.TransformDistance(FXSYS_fabs(charSpace));
+ }
+ if (threshold && (spacing && spacing >= threshold) ) {
+ m_Buffer.AppendChar(L' ');
+ if (m_pObjArray) {
+ m_pObjArray->Add(NULL);
+ m_pObjArray->Add(NULL);
+ }
+ }
+ if (item.m_CharCode == (FX_DWORD) - 1) {
+ continue;
+ }
+ spacing = 0;
+ }
+ CFX_WideString unicode_str = pFont->UnicodeFromCharCode(item.m_CharCode);
+ if (unicode_str.IsEmpty()) {
+ m_Buffer.AppendChar((FX_WCHAR)item.m_CharCode);
+ if (m_pObjArray) {
+ m_pObjArray->Add((void*)pObj);
+ m_pObjArray->Add((void*)(FX_INTPTR)item_index);
+ }
+ } else {
+ m_Buffer << unicode_str;
+ if (m_pObjArray) {
+ for (int i = 0; i < unicode_str.GetLength(); i ++) {
+ m_pObjArray->Add((void*)pObj);
+ m_pObjArray->Add((void*)(FX_INTPTR)item_index);
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
+ CFX_PtrArray* pObjArray)
+{
+ CPDF_TextStream textstream(buffer, bUseLF, pObjArray);
+ FX_POSITION pos = pPage->GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = pPage->GetNextObject(pos);
+ if (pObject == NULL) {
+ continue;
+ }
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ textstream.ProcessObject((CPDF_TextObject*)pObject, FALSE);
+ }
+}
+CFX_WideString PDF_GetFirstTextLine_Unicode(CPDF_Document* pDoc, CPDF_Dictionary* pPage)
+{
+ CFX_WideTextBuf buffer;
+ buffer.EstimateSize(0, 1024);
+ CPDF_Page page;
+ page.Load(pDoc, pPage);
+ CPDF_ParseOptions options;
+ options.m_bTextOnly = TRUE;
+ options.m_bSeparateForm = FALSE;
+ page.ParseContent(&options);
+ CPDF_TextStream textstream(buffer, FALSE, NULL);
+ FX_POSITION pos = page.GetFirstObjectPosition();
+ while (pos) {
+ CPDF_PageObject* pObject = page.GetNextObject(pos);
+ if (pObject->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ if (textstream.ProcessObject((CPDF_TextObject*)pObject, TRUE)) {
+ break;
+ }
+ }
+ return buffer.GetWideString();
+}
diff --git a/core/src/fpdftext/text_int.h b/core/src/fpdftext/text_int.h
new file mode 100644
index 0000000000..a0af51eb60
--- /dev/null
+++ b/core/src/fpdftext/text_int.h
@@ -0,0 +1,215 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PDF_TEXT_INT_H_
+#define _PDF_TEXT_INT_H_
+class CPDF_TextParseOptions : public CFX_Object
+{
+public:
+ CPDF_TextParseOptions();
+ FX_BOOL m_bCheckObjectOrder;
+ FX_BOOL m_bCheckDirection;
+ int m_nCheckSameObject;
+};
+class CPDF_TextPage;
+class CPDF_LinkExtract;
+class CPDF_TextPageFind;
+class CPDF_DocProgressiveSearch;
+#define FPDFTEXT_CHAR_ERROR -1
+#define FPDFTEXT_CHAR_NORMAL 0
+#define FPDFTEXT_CHAR_GENERATED 1
+#define FPDFTEXT_CHAR_UNUNICODE 2
+#define FPDFTEXT_CHAR_HYPHEN 3
+#define FPDFTEXT_CHAR_PIECE 4
+#define FPDFTEXT_MC_PASS 0
+#define FPDFTEXT_MC_DONE 1
+#define FPDFTEXT_MC_DELAY 2
+typedef struct _PAGECHAR_INFO: public CFX_Object {
+ int m_CharCode;
+ FX_WCHAR m_Unicode;
+ FX_FLOAT m_OriginX;
+ FX_FLOAT m_OriginY;
+ FX_INT32 m_Flag;
+ CFX_FloatRect m_CharBox;
+ CPDF_TextObject* m_pTextObj;
+ CFX_AffineMatrix m_Matrix;
+ int m_Index;
+} PAGECHAR_INFO;
+typedef CFX_SegmentedArray<PAGECHAR_INFO> PAGECHAR_InfoArray;
+typedef struct {
+ int m_Start;
+ int m_nCount;
+} FPDF_SEGMENT;
+typedef CFX_ArrayTemplate<FPDF_SEGMENT> SEGMENT_Array;
+typedef struct {
+ CPDF_TextObject* m_pTextObj;
+ CFX_AffineMatrix m_formMatrix;
+} PDFTEXT_Obj;
+typedef CFX_ArrayTemplate<PDFTEXT_Obj> LINEOBJ;
+class CPDF_TextPage: public IPDF_TextPage
+{
+public:
+ CPDF_TextPage(const CPDF_Page* pPage, int flags = 0);
+ CPDF_TextPage(const CPDF_PageObjects* pPage, int flags = 0);
+ CPDF_TextPage(const CPDF_Page* pPage, CPDFText_ParseOptions ParserOptions);
+ virtual FX_BOOL ParseTextPage();
+ virtual void NormalizeObjects(FX_BOOL bNormalize);
+ virtual FX_BOOL IsParsered() const
+ {
+ return m_IsParsered;
+ }
+ virtual ~CPDF_TextPage() {};
+public:
+ virtual int CharIndexFromTextIndex(int TextIndex)const ;
+ virtual int TextIndexFromCharIndex(int CharIndex)const;
+ virtual int CountChars() const;
+ virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const;
+ virtual void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;
+ virtual int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+ virtual int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance,
+ FX_FLOAT yTorelance) const;
+ virtual CFX_WideString GetTextByRect(CFX_FloatRect rect) const;
+ virtual void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;
+ virtual int GetOrderByDirection(int order, int direction) const;
+ virtual CFX_WideString GetPageText(int start = 0, int nCount = -1) const;
+
+ virtual int CountRects(int start, int nCount);
+ virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top
+ , FX_FLOAT& right, FX_FLOAT &bottom) const;
+ virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate);
+ virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate);
+ virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top,
+ FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);
+ virtual void GetBoundedSegment(int index, int& start, int& count) const;
+ virtual int GetWordBreak(int index, int direction) const;
+public:
+ const PAGECHAR_InfoArray* GetCharList() const
+ {
+ return &m_charList;
+ }
+ static FX_BOOL IsRectIntersect(CFX_FloatRect rect1, CFX_FloatRect rect2);
+ static FX_BOOL IsLetter(FX_WCHAR unicode);
+private:
+ FX_BOOL IsHyphen(FX_WCHAR curChar);
+ FX_BOOL IsControlChar(PAGECHAR_INFO* pCharInfo);
+ FX_BOOL GetBaselineRotate(int start, int end, int& Rotate);
+ void ProcessObject();
+ void ProcessFormObject(CPDF_FormObject* pFormObj, CFX_AffineMatrix formMatrix);
+ void ProcessTextObject(PDFTEXT_Obj pObj);
+ void ProcessTextObject(CPDF_TextObject* pTextObj, CFX_AffineMatrix formMatrix, FX_POSITION ObjPos);
+ int ProcessInsertObject(const CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);
+ FX_BOOL GenerateCharInfo(FX_WCHAR unicode, PAGECHAR_INFO& info);
+ FX_BOOL IsSameAsPreTextObject(CPDF_TextObject* pTextObj, FX_POSITION ObjPos);
+ FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
+ int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
+ void CloseTempLine();
+ void OnPiece(IFX_BidiChar* pBidi, CFX_WideString& str);
+ FX_INT32 PreMarkedContent(PDFTEXT_Obj pObj);
+ void ProcessMarkedContent(PDFTEXT_Obj pObj);
+ void CheckMarkedContentObject(FX_INT32& start, FX_INT32& nCount) const;
+ void FindPreviousTextObject(void);
+ void AddCharInfoByLRDirection(CFX_WideString& str, int i);
+ void AddCharInfoByRLDirection(CFX_WideString& str, int i);
+ FX_INT32 GetTextObjectWritingMode(const CPDF_TextObject* pTextObj);
+ FX_INT32 FindTextlineFlowDirection();
+protected:
+ CPDFText_ParseOptions m_ParseOptions;
+ CFX_WordArray m_CharIndex;
+ const CPDF_PageObjects* m_pPage;
+ PAGECHAR_InfoArray m_charList;
+ CFX_WideTextBuf m_TextBuf;
+ PAGECHAR_InfoArray m_TempCharList;
+ CFX_WideTextBuf m_TempTextBuf;
+ int m_parserflag;
+ CPDF_TextObject* m_pPreTextObj;
+ CFX_AffineMatrix m_perMatrix;
+ FX_BOOL m_IsParsered;
+ CFX_AffineMatrix m_DisplayMatrix;
+
+ SEGMENT_Array m_Segment;
+ CFX_RectArray m_SelRects;
+ LINEOBJ m_LineObj;
+ FX_BOOL m_TextlineDir;
+ CFX_FloatRect m_CurlineRect;
+};
+class CPDF_TextPageFind: public IPDF_TextPageFind
+{
+public:
+ CPDF_TextPageFind(const IPDF_TextPage* pTextPage);
+ virtual ~CPDF_TextPageFind() {};
+public:
+ virtual FX_BOOL FindFirst(CFX_WideString findwhat, int flags, int startPos = 0);
+ virtual FX_BOOL FindNext();
+ virtual FX_BOOL FindPrev();
+
+ virtual void GetRectArray(CFX_RectArray& rects) const;
+ virtual int GetCurOrder() const;
+ virtual int GetMatchedCount()const;
+protected:
+ void ExtractFindWhat(CFX_WideString findwhat);
+ FX_BOOL IsMatchWholeWord(CFX_WideString csPageText, int startPos, int endPos);
+ FX_BOOL ExtractSubString(CFX_WideString& rString, FX_LPCWSTR lpszFullString,
+ int iSubString, FX_WCHAR chSep);
+ CFX_WideString MakeReverse(const CFX_WideString str);
+ int ReverseFind(CFX_WideString csPageText, CFX_WideString csWord, int nStartPos, int& WordLength);
+ int GetCharIndex(int index) const;
+private:
+ CFX_WordArray m_CharIndex;
+ const IPDF_TextPage* m_pTextPage;
+ CFX_WideString m_strText;
+ CFX_WideString m_findWhat;
+ int m_flags;
+ CFX_WideStringArray m_csFindWhatArray;
+ int m_findNextStart;
+ int m_findPreStart;
+ FX_BOOL m_bMatchCase;
+ FX_BOOL m_bMatchWholeWord;
+ int m_resStart;
+ int m_resEnd;
+ CFX_RectArray m_resArray;
+ FX_BOOL m_IsFind;
+};
+class CPDF_LinkExt: public CFX_Object
+{
+public:
+ CPDF_LinkExt() {};
+ int m_Start;
+ int m_Count;
+ CFX_WideString m_strUrl;
+ virtual ~CPDF_LinkExt() {};
+};
+typedef CFX_ArrayTemplate<CPDF_LinkExt*> LINK_InfoArray;
+class CPDF_LinkExtract: public IPDF_LinkExtract
+{
+public:
+ CPDF_LinkExtract();
+ virtual ~CPDF_LinkExtract();
+ virtual FX_BOOL ExtractLinks(const IPDF_TextPage* pTextPage);
+ virtual FX_BOOL IsExtract() const
+ {
+ return m_IsParserd;
+ }
+public:
+ virtual int CountLinks() const;
+ virtual CFX_WideString GetURL(int index) const;
+ virtual void GetBoundedSegment(int index, int& start, int& count) const;
+ virtual void GetRects(int index, CFX_RectArray& rects)const;
+protected:
+ void parserLink();
+ void DeleteLinkList();
+ FX_BOOL CheckWebLink(CFX_WideString& strBeCheck);
+ FX_BOOL CheckMailLink(CFX_WideString& str);
+ FX_BOOL AppendToLinkList(int start, int count, CFX_WideString strUrl);
+private:
+ LINK_InfoArray m_LinkList;
+ const CPDF_TextPage* m_pTextPage;
+ CFX_WideString m_strPageText;
+ FX_BOOL m_IsParserd;
+};
+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst);
+void NormalizeString(CFX_WideString& str);
+void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest);
+#endif
diff --git a/core/src/fpdftext/txtproc.h b/core/src/fpdftext/txtproc.h
new file mode 100644
index 0000000000..3ec850d9db
--- /dev/null
+++ b/core/src/fpdftext/txtproc.h
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PDF_TXTPROC_H_
+#define _PDF_TXTPROC_H_
+class CTextColumn : public CFX_Object
+{
+public:
+ FX_FLOAT m_AvgPos;
+ int m_Count;
+ int m_TextPos;
+};
+class CTextBox : public CFX_Object
+{
+public:
+ CFX_WideString m_Text;
+ FX_FLOAT m_Left;
+ FX_FLOAT m_Right;
+ FX_FLOAT m_SpaceWidth;
+ FX_FLOAT m_Top;
+ FX_FLOAT m_Bottom;
+ FX_FLOAT m_FontSizeV;
+ CTextColumn* m_pColumn;
+};
+class CTextBaseLine : public CFX_Object
+{
+public:
+ CTextBaseLine();
+ ~CTextBaseLine();
+ void InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy,
+ FX_FLOAT spacew, FX_FLOAT fontsize_v, const CFX_WideString& str);
+ FX_BOOL GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx);
+ FX_BOOL CanMerge(CTextBaseLine* pOther);
+ void Merge(CTextBaseLine* pOther);
+ void MergeBoxes();
+ void CountChars(int& count, FX_FLOAT& width, int& minchars);
+ void WriteOutput(CFX_WideString& str, FX_FLOAT leftx, FX_FLOAT width, int iWidth);
+ FX_FLOAT m_BaseLine;
+ FX_FLOAT m_Top;
+ FX_FLOAT m_Bottom;
+ FX_FLOAT m_MaxFontSizeV;
+ CFX_PtrArray m_TextList;
+};
+class CPDF_PageObject;
+class CPDF_TextObject;
+class CTextPage : public CFX_Object
+{
+public:
+ CTextPage();
+ ~CTextPage();
+ void ProcessObject(CPDF_PageObject* pObj);
+ CTextBaseLine* InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey, FX_FLOAT leftx,
+ FX_FLOAT rightx, FX_FLOAT topy, FX_FLOAT bottomy, FX_FLOAT spacew, FX_FLOAT fontsize_v,
+ CFX_ByteString& str, CPDF_Font* pFont);
+ void WriteOutput(CFX_WideStringArray& lines, int iMinWidth);
+ FX_BOOL m_bAutoWidth;
+ FX_BOOL m_bKeepColumn;
+ FX_BOOL m_bBreakSpace;
+ FX_BOOL m_bOCR;
+private:
+ CFX_PtrArray m_BaseLines;
+ CFX_PtrArray m_TextColumns;
+ void FindColumns();
+ CTextColumn* FindColumn(FX_FLOAT xpos);
+ void BreakSpace(CPDF_TextObject* pTextObj);
+};
+#endif
diff --git a/core/src/fpdftext/unicodenormalization.cpp b/core/src/fpdftext/unicodenormalization.cpp
new file mode 100644
index 0000000000..b92787b952
--- /dev/null
+++ b/core/src/fpdftext/unicodenormalization.cpp
@@ -0,0 +1,75 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fpdftext/fpdf_text.h"
+extern const FX_WCHAR g_UnicodeData_Normalization[65536];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164];
+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488];
+FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = {
+ NULL,
+ g_UnicodeData_Normalization_Map1,
+ g_UnicodeData_Normalization_Map2,
+ g_UnicodeData_Normalization_Map3,
+ g_UnicodeData_Normalization_Map4
+};
+FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst)
+{
+ wch = wch & 0xFFFF;
+ FX_WCHAR wFind = g_UnicodeData_Normalization[wch];
+ if (!wFind) {
+ if (pDst) {
+ *pDst = wch;
+ }
+ return 1;
+ }
+ if(wFind >= 0x8000) {
+ wch = wFind - 0x8000;
+ wFind = 1;
+ } else {
+ wch = wFind & 0x0FFF;
+ wFind >>= 12;
+ }
+ FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind];
+ if (pMap == g_UnicodeData_Normalization_Map4) {
+ pMap = g_UnicodeData_Normalization_Map4 + wch;
+ wFind = (FX_WCHAR)(*pMap ++);
+ } else {
+ pMap += wch;
+ }
+ if (pDst) {
+ FX_WCHAR n = wFind;
+ while (n --) {
+ *pDst ++ = *pMap ++;
+ }
+ }
+ return (FX_STRSIZE)wFind;
+}
+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst)
+{
+ FX_STRSIZE nCount = 0;
+ for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) {
+ FX_WCHAR wch = wsSrc.GetAt(len);
+ if(pDst) {
+ nCount += FX_Unicode_GetNormalization(wch, pDst + nCount);
+ } else {
+ nCount += FX_Unicode_GetNormalization(wch, pDst);
+ }
+ }
+ return nCount;
+}
+FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst)
+{
+ FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL);
+ if (!nLen) {
+ return 0;
+ }
+ FX_LPWSTR pBuf = wsDst.GetBuffer(nLen);
+ FX_WideString_GetNormalization(wsSrc, pBuf);
+ wsDst.ReleaseBuffer(nLen);
+ return nLen;
+}
diff --git a/core/src/fpdftext/unicodenormalizationdata.cpp b/core/src/fpdftext/unicodenormalizationdata.cpp
new file mode 100644
index 0000000000..750382b010
--- /dev/null
+++ b/core/src/fpdftext/unicodenormalizationdata.cpp
@@ -0,0 +1,4661 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_system.h"
+extern const FX_WCHAR g_UnicodeData_Normalization[65536] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8001, 0x0000, 0x2000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2002, 0x8002, 0x0000, 0x2004, 0x0000, 0x0000, 0x8003,
+ 0x8004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8005, 0x0000, 0x8006, 0x0000, 0x0000, 0x0000, 0x8007, 0x8008,
+ 0x0000, 0x0000, 0x8009, 0x800A, 0x800B, 0x800C, 0x0000, 0x0000, 0x800D, 0x800E, 0x800F, 0x0000, 0x3000, 0x3003, 0x3006, 0x0000,
+ 0x8010, 0x8011, 0x8012, 0x8013, 0x8014, 0x8015, 0x0000, 0x8016, 0x8017, 0x8018, 0x8019, 0x801A, 0x801B, 0x801C, 0x801D, 0x801E,
+ 0x801F, 0x8020, 0x8021, 0x8022, 0x8023, 0x8024, 0x8025, 0x0000, 0x8026, 0x8027, 0x8028, 0x8029, 0x802A, 0x802B, 0x0000, 0x0000,
+ 0x802C, 0x802D, 0x802E, 0x802F, 0x8030, 0x8031, 0x0000, 0x8032, 0x8033, 0x8034, 0x8035, 0x8036, 0x8037, 0x8038, 0x8039, 0x803A,
+ 0x0000, 0x803B, 0x803C, 0x803D, 0x803E, 0x803F, 0x8040, 0x0000, 0x8041, 0x8042, 0x8043, 0x8044, 0x8045, 0x8046, 0x0000, 0x8047,
+ 0x8048, 0x8049, 0x804A, 0x804B, 0x804C, 0x804D, 0x804E, 0x804F, 0x8050, 0x8051, 0x8052, 0x8053, 0x8054, 0x8055, 0x8056, 0x8057,
+ 0x8058, 0x8059, 0x805A, 0x805B, 0x805C, 0x805D, 0x805E, 0x805F, 0x8060, 0x8061, 0x8062, 0x8063, 0x8064, 0x8065, 0x8066, 0x8067,
+ 0x8068, 0x8069, 0x806A, 0x806B, 0x806C, 0x806D, 0x806E, 0x806F, 0x8070, 0x8071, 0x8072, 0x8073, 0x8074, 0x8075, 0x8076, 0x8077,
+ 0x8078, 0x0000, 0x2006, 0x2008, 0x8079, 0x807A, 0x807B, 0x807C, 0x807D, 0x807E, 0x807F, 0x8080, 0x8081, 0x8082, 0x8083, 0x8084,
+ 0x8085, 0x8086, 0x8087, 0x8088, 0x8089, 0x808A, 0x808B, 0x808C, 0x808D, 0x808E, 0x0000, 0x0000, 0x808F, 0x8090, 0x8091, 0x8092,
+ 0x8093, 0x8094, 0x200A, 0x200C, 0x8095, 0x8096, 0x8097, 0x8098, 0x8099, 0x809A, 0x809B, 0x809C, 0x809D, 0x809E, 0x809F, 0x80A0,
+ 0x80A1, 0x80A2, 0x80A3, 0x80A4, 0x80A5, 0x80A6, 0x80A7, 0x80A8, 0x80A9, 0x80AA, 0x80AB, 0x80AC, 0x80AD, 0x80AE, 0x80AF, 0x80B0,
+ 0x80B1, 0x80B2, 0x80B3, 0x80B4, 0x80B5, 0x80B6, 0x80B7, 0x80B8, 0x80B9, 0x80BA, 0x80BB, 0x80BC, 0x80BD, 0x80BE, 0x80BF, 0x80C0,
+ 0x80C1, 0x80C2, 0x80C3, 0x80C4, 0x0000, 0x0000, 0x0000, 0x80C5, 0x80C6, 0x80C7, 0x80C8, 0x80C9, 0x80CA, 0x0000, 0x80CB, 0x0000,
+ 0x80CC, 0x80CD, 0x80CE, 0x80CF, 0x0000, 0x0000, 0x0000, 0x80D0, 0x80D1, 0x80D2, 0x80D3, 0x0000, 0x80D4, 0x80D5, 0x80D6, 0x80D7,
+ 0x80D8, 0x80D9, 0x0000, 0x0000, 0x80DA, 0x80DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x80DC, 0x80DD, 0x80DE, 0x80DF, 0x80E0, 0x80E1,
+ 0x80E2, 0x0000, 0x80E3, 0x80E4, 0x80E5, 0x80E6, 0x80E7, 0x0000, 0x80E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x200E, 0x2010, 0x2012, 0x2014, 0x2016, 0x2018, 0x201A, 0x201C, 0x201E, 0x80E9, 0x80EA, 0x80EB,
+ 0x80EC, 0x80ED, 0x80EE, 0x80EF, 0x80F0, 0x80F1, 0x80F2, 0x80F3, 0x80F4, 0x80F5, 0x80F6, 0x80F7, 0x80F8, 0x80F9, 0x80FA, 0x80FB,
+ 0x80FC, 0x80FD, 0x80FE, 0x80FF, 0x8100, 0x8101, 0x8102, 0x8103, 0x8104, 0x8105, 0x8106, 0x8107, 0x8108, 0x8109, 0x810A, 0x810B,
+ 0x810C, 0x2020, 0x2022, 0x2024, 0x810D, 0x810E, 0x0000, 0x0000, 0x810F, 0x8110, 0x8111, 0x8112, 0x8113, 0x8114, 0x8115, 0x8116,
+ 0x8117, 0x8118, 0x8119, 0x811A, 0x811B, 0x811C, 0x811D, 0x811E, 0x811F, 0x8120, 0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126,
+ 0x8127, 0x8128, 0x8129, 0x812A, 0x812B, 0x812C, 0x812D, 0x812E, 0x812F, 0x8130, 0x8131, 0x8132, 0x0000, 0x0000, 0x8133, 0x8134,
+ 0x8135, 0x8136, 0x0000, 0x0000, 0x8137, 0x8138, 0x8139, 0x813A, 0x813B, 0x813C, 0x813D, 0x813E, 0x813F, 0x8140, 0x8141, 0x8142,
+ 0x8143, 0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814A, 0x2026, 0x2028, 0x814B, 0x814C, 0x814D, 0x814E, 0x814F, 0x8150,
+ 0x8151, 0x0000, 0x0000, 0x8152, 0x8153, 0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815A, 0x815B, 0x815C, 0x815D, 0x815E,
+ 0x815F, 0x0000, 0x8160, 0x8161, 0x8162, 0x8163, 0x8164, 0x8165, 0x8166, 0x0000, 0x8167, 0x8168, 0x8169, 0x816A, 0x816B, 0x816C,
+ 0x816D, 0x816E, 0x816F, 0x0000, 0x0000, 0x8170, 0x8171, 0x0000, 0x8172, 0x0000, 0x8173, 0x8174, 0x8175, 0x8176, 0x0000, 0x8177,
+ 0x8178, 0x8179, 0x817A, 0x817B, 0x817C, 0x817D, 0x202A, 0x0000, 0x0000, 0x817E, 0x817F, 0x8180, 0x8181, 0x8182, 0x8183, 0x8184,
+ 0x8185, 0x8186, 0x8187, 0x0000, 0x8188, 0x8189, 0x818A, 0x818B, 0x818C, 0x818D, 0x0000, 0x818E, 0x818F, 0x8190, 0x8191, 0x8192,
+ 0x8193, 0x8194, 0x0000, 0x8195, 0x0000, 0x0000, 0x0000, 0x8196, 0x0000, 0x8197, 0x8198, 0x8199, 0x819A, 0x819B, 0x819C, 0x819D,
+ 0x819E, 0x0000, 0x0000, 0x202C, 0x202E, 0x2030, 0x2032, 0x2034, 0x2036, 0x2038, 0x203A, 0x203C, 0x0000, 0x0000, 0x819F, 0x81A0,
+ 0x81A1, 0x81A2, 0x81A3, 0x81A4, 0x81A5, 0x81A6, 0x81A7, 0x81A8, 0x81A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81AA, 0x81AB, 0x81AC, 0x81AD, 0x81AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81AF, 0x81B0, 0x0000, 0x81B1, 0x81B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x81B3, 0x81B4, 0x81B5, 0x81B6, 0x81B7, 0x81B8, 0x81B9, 0x81BA, 0x81BB, 0x81BC, 0x81BD, 0x81BE, 0x81BF,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x81C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81C1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x81C2, 0x81C3, 0x81C4, 0x81C5, 0x81C6, 0x81C7, 0x81C8, 0x0000, 0x81C9, 0x0000, 0x81CA, 0x81CB,
+ 0x81CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81CD, 0x81CE, 0x81CF, 0x81D0, 0x81D1, 0x81D2,
+ 0x81D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81D4, 0x81D5, 0x81D6, 0x81D7, 0x81D8, 0x0000,
+ 0x81D9, 0x81DA, 0x81DB, 0x81DC, 0x81DD, 0x81DE, 0x81DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81E0, 0x81E1, 0x81E2, 0x0000, 0x81E3, 0x81E4, 0x0000, 0x0000, 0x0000, 0x81E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81E6, 0x81E7, 0x0000, 0x81E8, 0x0000, 0x0000, 0x0000, 0x81E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EA, 0x81EB, 0x81EC, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x81EF, 0x81F0, 0x0000, 0x81F1, 0x0000, 0x0000, 0x0000, 0x81F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F3, 0x81F4, 0x81F5, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81F6, 0x81F7, 0x0000, 0x0000, 0x81F8, 0x81F9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FA, 0x81FB, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FC, 0x81FD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x81FE, 0x81FF, 0x0000, 0x0000, 0x8200, 0x8201,
+ 0x8202, 0x8203, 0x8204, 0x8205, 0x8206, 0x8207, 0x8208, 0x8209, 0x820A, 0x820B, 0x820C, 0x820D, 0x820E, 0x820F, 0x8210, 0x8211,
+ 0x8212, 0x8213, 0x8214, 0x8215, 0x203E, 0x2040, 0x8216, 0x8217, 0x0000, 0x0000, 0x8218, 0x8219, 0x821A, 0x821B, 0x0000, 0x0000,
+ 0x821C, 0x821D, 0x821E, 0x821F, 0x2042, 0x2044, 0x8220, 0x8221, 0x8222, 0x8223, 0x0000, 0x0000, 0x8224, 0x8225, 0x8226, 0x8227,
+ 0x0000, 0x8228, 0x8229, 0x822A, 0x822B, 0x822C, 0x822D, 0x822E, 0x822F, 0x8230, 0x8231, 0x0000, 0x0000, 0x8232, 0x8233, 0x0000,
+ 0x8234, 0x8235, 0x8236, 0x8237, 0x2046, 0x2048, 0x8238, 0x8239, 0x0000, 0x0000, 0x823A, 0x823B, 0x823C, 0x823D, 0x823E, 0x823F,
+ 0x0000, 0x0000, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x0000, 0x0000, 0x8246, 0x8247, 0x8248, 0x8249, 0x824A, 0x824B,
+ 0x824C, 0x824D, 0x824E, 0x824F, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256, 0x8257, 0x8258, 0x8259, 0x825A, 0x825B,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x825C, 0x825D, 0x825E, 0x825F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x204C, 0x204E, 0x2050, 0x2052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2054, 0x0000, 0x2056, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x205A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x205C, 0x0000, 0x0000, 0x205E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2060, 0x2062, 0x2064, 0x2066, 0x2068, 0x206A, 0x206C, 0x206E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2070, 0x2072, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2074, 0x2076, 0x0000, 0x2078,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x207A, 0x0000, 0x0000, 0x207C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x207E, 0x2080, 0x2082, 0x0000, 0x0000, 0x2084, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2086, 0x0000, 0x0000, 0x2088, 0x208A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x208C, 0x208E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2090, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2092, 0x2094, 0x2096, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2098, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x209A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x209C, 0x209E, 0x0000, 0x20A0, 0x20A2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20A4, 0x20A6, 0x20A8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20AA, 0x0000, 0x20AC, 0x20AE, 0x20B0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20B6, 0x20B8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8260, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20BC, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x20BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20C6, 0x0000, 0x20C8, 0x20CA, 0x20CC, 0x20CE, 0x20D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x20D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x20D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20D6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x20D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8261, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20E2, 0x0000, 0x20E4, 0x0000, 0x20E6, 0x0000, 0x20E8, 0x0000, 0x20EA, 0x0000,
+ 0x0000, 0x0000, 0x20EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x20EE, 0x0000, 0x20F0, 0x0000, 0x0000,
+ 0x20F2, 0x20F4, 0x0000, 0x20F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8262, 0x8263, 0x8264, 0x8265,
+ 0x8266, 0x8267, 0x8268, 0x8269, 0x826A, 0x826B, 0x826C, 0x826D, 0x826E, 0x826F, 0x8270, 0x0000, 0x8271, 0x8272, 0x8273, 0x8274,
+ 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827A, 0x827B, 0x827C, 0x827D, 0x827E, 0x827F, 0x8280, 0x8281, 0x8282, 0x0000, 0x8283,
+ 0x8284, 0x8285, 0x8286, 0x8287, 0x8288, 0x8289, 0x828A, 0x828B, 0x828C, 0x828D, 0x828E, 0x828F, 0x8290, 0x8291, 0x8292, 0x8293,
+ 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, 0x829A, 0x829B, 0x829C, 0x829D, 0x829E, 0x0000, 0x829F, 0x82A0, 0x82A1, 0x82A2,
+ 0x82A3, 0x82A4, 0x82A5, 0x82A6, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AB, 0x0000, 0x20F8, 0x82AC, 0x0000, 0x82AD, 0x82AE, 0x82AF,
+ 0x82B0, 0x82B1, 0x82B2, 0x82B3, 0x82B4, 0x82B5, 0x82B6, 0x82B7, 0x82B8, 0x82B9, 0x82BA, 0x82BB, 0x82BC, 0x82BD, 0x82BE, 0x82BF,
+ 0x82C0, 0x82C1, 0x82C2, 0x82C3, 0x82C4, 0x82C5, 0x82C6, 0x0000, 0x82C7, 0x0000, 0x0000, 0x82C8, 0x82C9, 0x82CA, 0x82CB, 0x82CC,
+ 0x82CD, 0x82CE, 0x82CF, 0x82D0, 0x82D1, 0x82D2, 0x82D3, 0x82D4, 0x82D5, 0x82D6, 0x82D7, 0x82D8, 0x82D9, 0x82DA, 0x82DB, 0x82DC,
+ 0x82DD, 0x82DE, 0x82DF, 0x82E0, 0x82E1, 0x82E2, 0x82E3, 0x82E4, 0x82E5, 0x82E6, 0x82E7, 0x82E8, 0x82E9, 0x82EA, 0x82EB, 0x82EC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x82ED, 0x82EE, 0x82EF, 0x82F0, 0x82F1, 0x82F2, 0x82F3, 0x82F4, 0x82F5, 0x82F6, 0x82F7, 0x82F8, 0x82F9, 0x82FA, 0x82FB, 0x82FC,
+ 0x82FD, 0x82FE, 0x82FF, 0x8300, 0x8301, 0x8302, 0x8303, 0x8304, 0x8305, 0x8306, 0x8307, 0x8308, 0x8309, 0x830A, 0x830B, 0x830C,
+ 0x830D, 0x830E, 0x830F, 0x8310, 0x8311, 0x8312, 0x8313, 0x8314, 0x8315, 0x8316, 0x8317, 0x8318, 0x8319, 0x831A, 0x831B, 0x831C,
+ 0x831D, 0x831E, 0x831F, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326, 0x8327, 0x8328, 0x8329, 0x832A, 0x832B, 0x832C,
+ 0x832D, 0x832E, 0x832F, 0x8330, 0x8331, 0x8332, 0x8333, 0x8334, 0x8335, 0x8336, 0x8337, 0x8338, 0x8339, 0x833A, 0x833B, 0x833C,
+ 0x833D, 0x833E, 0x833F, 0x8340, 0x8341, 0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834A, 0x834B, 0x834C,
+ 0x834D, 0x834E, 0x834F, 0x8350, 0x8351, 0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359, 0x835A, 0x835B, 0x835C,
+ 0x835D, 0x835E, 0x835F, 0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369, 0x836A, 0x836B, 0x836C,
+ 0x836D, 0x836E, 0x836F, 0x8370, 0x8371, 0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379, 0x837A, 0x837B, 0x837C,
+ 0x837D, 0x837E, 0x837F, 0x8380, 0x8381, 0x8382, 0x8383, 0x8384, 0x8385, 0x8386, 0x8387, 0x8388, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8389, 0x838A, 0x838B, 0x838C, 0x838D, 0x838E, 0x838F, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, 0x8395, 0x8396, 0x8397, 0x8398,
+ 0x8399, 0x839A, 0x839B, 0x839C, 0x839D, 0x839E, 0x839F, 0x83A0, 0x83A1, 0x83A2, 0x83A3, 0x83A4, 0x83A5, 0x83A6, 0x83A7, 0x83A8,
+ 0x83A9, 0x83AA, 0x83AB, 0x83AC, 0x83AD, 0x83AE, 0x83AF, 0x83B0, 0x83B1, 0x83B2, 0x83B3, 0x83B4, 0x83B5, 0x83B6, 0x83B7, 0x83B8,
+ 0x83B9, 0x83BA, 0x83BB, 0x83BC, 0x83BD, 0x83BE, 0x83BF, 0x83C0, 0x83C1, 0x83C2, 0x83C3, 0x83C4, 0x83C5, 0x83C6, 0x83C7, 0x83C8,
+ 0x83C9, 0x83CA, 0x83CB, 0x83CC, 0x83CD, 0x83CE, 0x83CF, 0x83D0, 0x83D1, 0x83D2, 0x83D3, 0x83D4, 0x83D5, 0x83D6, 0x83D7, 0x83D8,
+ 0x83D9, 0x83DA, 0x83DB, 0x83DC, 0x83DD, 0x83DE, 0x83DF, 0x83E0, 0x83E1, 0x83E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x83E3, 0x83E4, 0x83E5, 0x83E6, 0x83E7, 0x83E8, 0x83E9, 0x83EA, 0x83EB, 0x83EC, 0x83ED, 0x83EE, 0x83EF, 0x83F0, 0x83F1, 0x83F2,
+ 0x83F3, 0x83F4, 0x83F5, 0x83F6, 0x83F7, 0x83F8, 0x0000, 0x0000, 0x83F9, 0x83FA, 0x83FB, 0x83FC, 0x83FD, 0x83FE, 0x0000, 0x0000,
+ 0x83FF, 0x8400, 0x8401, 0x8402, 0x8403, 0x8404, 0x8405, 0x8406, 0x8407, 0x8408, 0x8409, 0x840A, 0x840B, 0x840C, 0x840D, 0x840E,
+ 0x840F, 0x8410, 0x8411, 0x8412, 0x8413, 0x8414, 0x8415, 0x8416, 0x8417, 0x8418, 0x8419, 0x841A, 0x841B, 0x841C, 0x841D, 0x841E,
+ 0x841F, 0x8420, 0x8421, 0x8422, 0x8423, 0x8424, 0x0000, 0x0000, 0x8425, 0x8426, 0x8427, 0x8428, 0x8429, 0x842A, 0x0000, 0x0000,
+ 0x842B, 0x842C, 0x842D, 0x842E, 0x842F, 0x8430, 0x8431, 0x8432, 0x0000, 0x8433, 0x0000, 0x8434, 0x0000, 0x8435, 0x0000, 0x8436,
+ 0x8437, 0x8438, 0x8439, 0x843A, 0x843B, 0x843C, 0x843D, 0x843E, 0x843F, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444, 0x8445, 0x8446,
+ 0x8447, 0x8448, 0x8449, 0x844A, 0x844B, 0x844C, 0x844D, 0x844E, 0x844F, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454, 0x0000, 0x0000,
+ 0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845A, 0x845B, 0x845C, 0x845D, 0x845E, 0x845F, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,
+ 0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846A, 0x846B, 0x846C, 0x846D, 0x846E, 0x846F, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,
+ 0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847A, 0x847B, 0x847C, 0x847D, 0x847E, 0x847F, 0x8480, 0x8481, 0x8482, 0x8483, 0x8484,
+ 0x8485, 0x8486, 0x8487, 0x8488, 0x8489, 0x0000, 0x848A, 0x848B, 0x848C, 0x848D, 0x848E, 0x848F, 0x8490, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8491, 0x8492, 0x8493, 0x0000, 0x8494, 0x8495, 0x8496, 0x8497, 0x8498, 0x8499, 0x849A, 0x0000, 0x0000, 0x0000,
+ 0x849B, 0x849C, 0x849D, 0x849E, 0x0000, 0x0000, 0x849F, 0x84A0, 0x84A1, 0x84A2, 0x84A3, 0x84A4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x84A5, 0x84A6, 0x84A7, 0x84A8, 0x84A9, 0x84AA, 0x84AB, 0x84AC, 0x84AD, 0x84AE, 0x84AF, 0x84B0, 0x84B1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x84B2, 0x84B3, 0x84B4, 0x0000, 0x84B5, 0x84B6, 0x84B7, 0x84B8, 0x84B9, 0x84BA, 0x84BB, 0x84BC, 0x84BD, 0x0000,
+ 0x84BE, 0x84BF, 0x84C0, 0x84C1, 0x84C2, 0x84C3, 0x84C4, 0x84C5, 0x84C6, 0x84C7, 0x84C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x84C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x84CB, 0x20FA, 0x3009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CC,
+ 0x0000, 0x0000, 0x0000, 0x20FC, 0x300C, 0x0000, 0x20FE, 0x300F, 0x0000, 0x0000, 0x0000, 0x0000, 0x2100, 0x0000, 0x2102, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x2106, 0x2108, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x84CD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x84CE, 0x84CF, 0x0000, 0x0000, 0x84D0, 0x84D1, 0x84D2, 0x84D3, 0x84D4, 0x84D5, 0x84D6, 0x84D7, 0x84D8, 0x84D9, 0x84DA, 0x84DB,
+ 0x84DC, 0x84DD, 0x84DE, 0x84DF, 0x84E0, 0x84E1, 0x84E2, 0x84E3, 0x84E4, 0x84E5, 0x84E6, 0x84E7, 0x84E8, 0x84E9, 0x84EA, 0x0000,
+ 0x84EB, 0x84EC, 0x84ED, 0x84EE, 0x84EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x210A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3012, 0x3015, 0x84F0, 0x210C, 0x0000, 0x3018, 0x301B, 0x84F1, 0x0000, 0x210E, 0x84F2, 0x84F3, 0x84F4, 0x84F5, 0x84F6, 0x84F7,
+ 0x84F8, 0x84F9, 0x84FA, 0x84FB, 0x0000, 0x84FC, 0x2110, 0x0000, 0x0000, 0x84FD, 0x84FE, 0x84FF, 0x8500, 0x8501, 0x8502, 0x8503,
+ 0x2112, 0x301E, 0x2114, 0x8504, 0x8505, 0x0000, 0x8506, 0x8507, 0x8508, 0x0000, 0x8509, 0x850A, 0x850B, 0x850C, 0x850D, 0x850E,
+ 0x850F, 0x8510, 0x0000, 0x8511, 0x8512, 0x8513, 0x8514, 0x8515, 0x8516, 0x8517, 0x0000, 0x3021, 0x8518, 0x8519, 0x851A, 0x851B,
+ 0x851C, 0x0000, 0x0000, 0x0000, 0x0000, 0x851D, 0x851E, 0x851F, 0x8520, 0x8521, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3024, 0x3027, 0x4005, 0x302A, 0x302D, 0x3030, 0x3033, 0x3036, 0x3039, 0x303C, 0x303F, 0x3042, 0x3045, 0x3048, 0x304B, 0x2116,
+ 0x8522, 0x2118, 0x304E, 0x211A, 0x8523, 0x211C, 0x3051, 0x400A, 0x211E, 0x8524, 0x2120, 0x3054, 0x8525, 0x8526, 0x8527, 0x8528,
+ 0x8529, 0x2122, 0x3057, 0x2124, 0x852A, 0x2126, 0x305A, 0x400F, 0x2128, 0x852B, 0x212A, 0x305D, 0x852C, 0x852D, 0x852E, 0x852F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x212C, 0x212E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2130, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2132, 0x2134, 0x2136,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8530, 0x0000, 0x0000, 0x0000, 0x0000, 0x8531, 0x0000, 0x0000, 0x8532, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2138, 0x0000, 0x213A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x213C, 0x3063, 0x0000, 0x213E,
+ 0x3066, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x2140, 0x0000, 0x0000, 0x2142, 0x0000, 0x0000, 0x2144, 0x0000, 0x2146, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2148, 0x0000, 0x214A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x214C, 0x214E, 0x2150,
+ 0x2152, 0x2154, 0x0000, 0x0000, 0x2156, 0x2158, 0x0000, 0x0000, 0x215A, 0x215C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x215E, 0x2160, 0x0000, 0x0000, 0x2162, 0x2164, 0x0000, 0x0000, 0x2166, 0x2168, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x216A, 0x216C, 0x216E, 0x2170,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2172, 0x2174, 0x2176, 0x2178, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x217A, 0x217C, 0x217E, 0x2180, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8533, 0x8534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3069, 0x306C, 0x306F, 0x3072, 0x3075, 0x3078, 0x307B, 0x307E, 0x2182, 0x2184, 0x2186, 0x2188, 0x218A, 0x218C, 0x218E, 0x2190,
+ 0x3081, 0x3084, 0x3087, 0x308A, 0x308D, 0x3090, 0x3093, 0x3096, 0x3099, 0x2192, 0x309C, 0x309F, 0x2194, 0x2196, 0x2198, 0x219A,
+ 0x219C, 0x30A2, 0x8535, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8536, 0x8537, 0x8538, 0x8539, 0x853A, 0x853B, 0x853C, 0x853D, 0x853E, 0x219E, 0x21A0, 0x21A2, 0x21A4, 0x21A6, 0x21A8, 0x21AA,
+ 0x21AC, 0x21AE, 0x21B0, 0x21B2, 0x30A5, 0x30A8, 0x30AB, 0x30AE, 0x30B1, 0x30B4, 0x30B7, 0x30BA, 0x30BD, 0x4014, 0x4019, 0x401E,
+ 0x4023, 0x4028, 0x402D, 0x4032, 0x4037, 0x403C, 0x4041, 0x4046, 0x21B4, 0x21B6, 0x21B8, 0x21BA, 0x21BC, 0x21BE, 0x21C0, 0x21C2,
+ 0x21C4, 0x30C0, 0x30C3, 0x30C6, 0x30C9, 0x30CC, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30E1, 0x30E4, 0x30E7, 0x30EA,
+ 0x30ED, 0x30F0, 0x30F3, 0x30F6, 0x30F9, 0x30FC, 0x30FF, 0x3102, 0x3105, 0x3108, 0x310B, 0x310E, 0x3111, 0x3114, 0x3117, 0x311A,
+ 0x311D, 0x3120, 0x3123, 0x3126, 0x3129, 0x312C, 0x853F, 0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547, 0x8548,
+ 0x8549, 0x854A, 0x854B, 0x854C, 0x854D, 0x854E, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558,
+ 0x8559, 0x855A, 0x855B, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567, 0x8568,
+ 0x8569, 0x856A, 0x856B, 0x856C, 0x856D, 0x856E, 0x856F, 0x8570, 0x8571, 0x8572, 0x8573, 0x21C6, 0x21C8, 0x21CA, 0x21CC, 0x21CE,
+ 0x21D0, 0x21D2, 0x21D4, 0x21D6, 0x21D8, 0x8574, 0x8575, 0x8576, 0x8577, 0x8578, 0x8579, 0x857A, 0x857B, 0x857C, 0x21DA, 0x857D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x857E, 0x857F, 0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0x8585, 0x8586, 0x21DC,
+ 0x8587, 0x8588, 0x8589, 0x858A, 0x858B, 0x858C, 0x858D, 0x858E, 0x858F, 0x21DE, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,
+ 0x8596, 0x8597, 0x8598, 0x21E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x404B, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x312F, 0x21E2, 0x3132, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8599, 0x859A, 0x859B, 0x859C, 0x859D, 0x859E, 0x859F, 0x85A0, 0x85A1, 0x85A2, 0x85A3, 0x85A4, 0x85A5, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85A6, 0x85A7, 0x85A8, 0x85A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AA, 0x85AB, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AC,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85AD,
+ 0x85AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85AF, 0x0000, 0x0000, 0x85B0, 0x0000, 0x85B1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x85B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x85B4, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x85B5, 0x85B6, 0x0000, 0x0000, 0x0000, 0x85B7, 0x85B8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x85B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x85BA, 0x85BB, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C0, 0x85C1, 0x85C2, 0x85C3, 0x85C4, 0x85C5, 0x85C6, 0x85C7, 0x85C8, 0x85C9,
+ 0x85CA, 0x85CB, 0x85CC, 0x85CD, 0x85CE, 0x85CF, 0x85D0, 0x85D1, 0x85D2, 0x85D3, 0x85D4, 0x85D5, 0x85D6, 0x85D7, 0x85D8, 0x85D9,
+ 0x85DA, 0x85DB, 0x85DC, 0x85DD, 0x85DE, 0x85DF, 0x85E0, 0x85E1, 0x85E2, 0x85E3, 0x85E4, 0x85E5, 0x85E6, 0x85E7, 0x85E8, 0x85E9,
+ 0x85EA, 0x85EB, 0x85EC, 0x85ED, 0x85EE, 0x85EF, 0x85F0, 0x85F1, 0x85F2, 0x85F3, 0x85F4, 0x85F5, 0x85F6, 0x85F7, 0x85F8, 0x85F9,
+ 0x85FA, 0x85FB, 0x85FC, 0x85FD, 0x85FE, 0x85FF, 0x8600, 0x8601, 0x8602, 0x8603, 0x8604, 0x8605, 0x8606, 0x8607, 0x8608, 0x8609,
+ 0x860A, 0x860B, 0x860C, 0x860D, 0x860E, 0x860F, 0x8610, 0x8611, 0x8612, 0x8613, 0x8614, 0x8615, 0x8616, 0x8617, 0x8618, 0x8619,
+ 0x861A, 0x861B, 0x861C, 0x861D, 0x861E, 0x861F, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625, 0x8626, 0x8627, 0x8628, 0x8629,
+ 0x862A, 0x862B, 0x862C, 0x862D, 0x862E, 0x862F, 0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637, 0x8638, 0x8639,
+ 0x863A, 0x863B, 0x863C, 0x863D, 0x863E, 0x863F, 0x8640, 0x8641, 0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,
+ 0x864A, 0x864B, 0x864C, 0x864D, 0x864E, 0x864F, 0x8650, 0x8651, 0x8652, 0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659,
+ 0x865A, 0x865B, 0x865C, 0x865D, 0x865E, 0x865F, 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669,
+ 0x866A, 0x866B, 0x866C, 0x866D, 0x866E, 0x866F, 0x8670, 0x8671, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679,
+ 0x867A, 0x867B, 0x867C, 0x867D, 0x867E, 0x867F, 0x8680, 0x8681, 0x8682, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688, 0x8689,
+ 0x868A, 0x868B, 0x868C, 0x868D, 0x868E, 0x868F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8690, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8691, 0x0000, 0x8692, 0x8693, 0x8694, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x21E6, 0x0000, 0x21E8, 0x0000,
+ 0x21EA, 0x0000, 0x21EC, 0x0000, 0x21EE, 0x0000, 0x21F0, 0x0000, 0x21F2, 0x0000, 0x21F4, 0x0000, 0x21F6, 0x0000, 0x21F8, 0x0000,
+ 0x21FA, 0x0000, 0x21FC, 0x0000, 0x0000, 0x21FE, 0x0000, 0x2200, 0x0000, 0x2202, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2204, 0x2206, 0x0000, 0x2208, 0x220A, 0x0000, 0x220C, 0x220E, 0x0000, 0x2210, 0x2212, 0x0000, 0x2214, 0x2216, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221A, 0x221C, 0x0000, 0x221E, 0x2220,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2222, 0x0000, 0x2224, 0x0000,
+ 0x2226, 0x0000, 0x2228, 0x0000, 0x222A, 0x0000, 0x222C, 0x0000, 0x222E, 0x0000, 0x2230, 0x0000, 0x2232, 0x0000, 0x2234, 0x0000,
+ 0x2236, 0x0000, 0x2238, 0x0000, 0x0000, 0x223A, 0x0000, 0x223C, 0x0000, 0x223E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x2240, 0x2242, 0x0000, 0x2244, 0x2246, 0x0000, 0x2248, 0x224A, 0x0000, 0x224C, 0x224E, 0x0000, 0x2250, 0x2252, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x2254, 0x0000, 0x0000, 0x2256, 0x2258, 0x225A, 0x225C, 0x0000, 0x0000, 0x0000, 0x225E, 0x2260,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8695, 0x8696, 0x8697, 0x8698, 0x8699, 0x869A, 0x869B, 0x869C, 0x869D, 0x869E, 0x869F, 0x86A0, 0x86A1, 0x86A2, 0x86A3,
+ 0x86A4, 0x86A5, 0x86A6, 0x86A7, 0x86A8, 0x86A9, 0x86AA, 0x86AB, 0x86AC, 0x86AD, 0x86AE, 0x86AF, 0x86B0, 0x86B1, 0x86B2, 0x86B3,
+ 0x86B4, 0x86B5, 0x86B6, 0x86B7, 0x86B8, 0x86B9, 0x86BA, 0x86BB, 0x86BC, 0x86BD, 0x86BE, 0x86BF, 0x86C0, 0x86C1, 0x86C2, 0x86C3,
+ 0x86C4, 0x86C5, 0x86C6, 0x86C7, 0x86C8, 0x86C9, 0x86CA, 0x86CB, 0x86CC, 0x86CD, 0x86CE, 0x86CF, 0x86D0, 0x86D1, 0x86D2, 0x86D3,
+ 0x86D4, 0x86D5, 0x86D6, 0x86D7, 0x86D8, 0x86D9, 0x86DA, 0x86DB, 0x86DC, 0x86DD, 0x86DE, 0x86DF, 0x86E0, 0x86E1, 0x86E2, 0x86E3,
+ 0x86E4, 0x86E5, 0x86E6, 0x86E7, 0x86E8, 0x86E9, 0x86EA, 0x86EB, 0x86EC, 0x86ED, 0x86EE, 0x86EF, 0x86F0, 0x86F1, 0x86F2, 0x0000,
+ 0x0000, 0x0000, 0x86F3, 0x86F4, 0x86F5, 0x86F6, 0x86F7, 0x86F8, 0x86F9, 0x86FA, 0x86FB, 0x86FC, 0x86FD, 0x86FE, 0x86FF, 0x8700,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3135, 0x3138, 0x313B, 0x313E, 0x3141, 0x3144, 0x3147, 0x314A, 0x314D, 0x3150, 0x3153, 0x3156, 0x3159, 0x315C, 0x4050, 0x4055,
+ 0x405A, 0x405F, 0x4064, 0x4069, 0x406E, 0x4073, 0x4078, 0x407D, 0x4082, 0x4087, 0x408C, 0x4091, 0x4096, 0x409B, 0x40A3, 0x0000,
+ 0x315F, 0x3162, 0x3165, 0x3168, 0x316B, 0x316E, 0x3171, 0x3174, 0x3177, 0x317A, 0x317D, 0x3180, 0x3183, 0x3186, 0x3189, 0x318C,
+ 0x318F, 0x3192, 0x3195, 0x3198, 0x319B, 0x319E, 0x31A1, 0x31A4, 0x31A7, 0x31AA, 0x31AD, 0x31B0, 0x31B3, 0x31B6, 0x31B9, 0x31BC,
+ 0x31BF, 0x31C2, 0x31C5, 0x31C8, 0x8701, 0x8702, 0x8703, 0x8704, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x31CB, 0x2262, 0x2264, 0x2266, 0x2268, 0x226A, 0x226C, 0x226E, 0x2270, 0x2272, 0x2274, 0x2276, 0x2278, 0x227A, 0x227C, 0x227E,
+ 0x8705, 0x8706, 0x8707, 0x8708, 0x8709, 0x870A, 0x870B, 0x870C, 0x870D, 0x870E, 0x870F, 0x8710, 0x8711, 0x8712, 0x2280, 0x2282,
+ 0x2284, 0x2286, 0x2288, 0x228A, 0x228C, 0x228E, 0x2290, 0x2292, 0x2294, 0x2296, 0x2298, 0x229A, 0x40AA, 0x40B0, 0x229C, 0x0000,
+ 0x8713, 0x8714, 0x8715, 0x8716, 0x8717, 0x8718, 0x8719, 0x871A, 0x871B, 0x871C, 0x871D, 0x871E, 0x871F, 0x8720, 0x8721, 0x8722,
+ 0x8723, 0x8724, 0x8725, 0x8726, 0x8727, 0x8728, 0x8729, 0x872A, 0x872B, 0x872C, 0x872D, 0x872E, 0x872F, 0x8730, 0x8731, 0x8732,
+ 0x8733, 0x8734, 0x8735, 0x8736, 0x8737, 0x8738, 0x8739, 0x873A, 0x873B, 0x873C, 0x873D, 0x873E, 0x873F, 0x8740, 0x8741, 0x8742,
+ 0x8743, 0x229E, 0x22A0, 0x22A2, 0x22A4, 0x22A6, 0x22A8, 0x22AA, 0x22AC, 0x22AE, 0x22B0, 0x22B2, 0x22B4, 0x22B6, 0x22B8, 0x22BA,
+ 0x22BC, 0x22BE, 0x22C0, 0x22C2, 0x22C4, 0x22C6, 0x22C8, 0x22CA, 0x22CC, 0x31CE, 0x31D1, 0x31D4, 0x22CE, 0x31D7, 0x22D0, 0x31DA,
+ 0x8744, 0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874A, 0x874B, 0x874C, 0x874D, 0x874E, 0x874F, 0x8750, 0x8751, 0x8752, 0x8753,
+ 0x8754, 0x8755, 0x8756, 0x8757, 0x8758, 0x8759, 0x875A, 0x875B, 0x875C, 0x875D, 0x875E, 0x875F, 0x8760, 0x8761, 0x8762, 0x8763,
+ 0x8764, 0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876A, 0x876B, 0x876C, 0x876D, 0x876E, 0x876F, 0x8770, 0x8771, 0x8772, 0x0000,
+ 0x40B5, 0x40BA, 0x40BF, 0x31DD, 0x40C4, 0x31E0, 0x31E3, 0x40C9, 0x40CF, 0x31E6, 0x31E9, 0x31EC, 0x40D4, 0x40D9, 0x31EF, 0x31F2,
+ 0x22D2, 0x31F5, 0x40DE, 0x40E3, 0x22D4, 0x40E8, 0x40EE, 0x40F5, 0x31F8, 0x40FB, 0x4101, 0x4107, 0x31FB, 0x31FE, 0x3201, 0x410C,
+ 0x4111, 0x4117, 0x3204, 0x3207, 0x320A, 0x22D6, 0x22D8, 0x22DA, 0x22DC, 0x320D, 0x3210, 0x411C, 0x3213, 0x4122, 0x4127, 0x3216,
+ 0x22DE, 0x22E0, 0x412D, 0x4133, 0x4138, 0x3219, 0x413E, 0x22E2, 0x321C, 0x321F, 0x3222, 0x3225, 0x3228, 0x4144, 0x322B, 0x22E4,
+ 0x322E, 0x3231, 0x3234, 0x4149, 0x3237, 0x323A, 0x323D, 0x414E, 0x4154, 0x22E6, 0x4159, 0x22E8, 0x415F, 0x4164, 0x3240, 0x3243,
+ 0x3246, 0x4169, 0x22EA, 0x3249, 0x416E, 0x22EC, 0x4173, 0x324C, 0x22EE, 0x22F0, 0x22F2, 0x22F4, 0x22F6, 0x22F8, 0x22FA, 0x22FC,
+ 0x22FE, 0x2300, 0x324F, 0x3252, 0x3255, 0x3258, 0x325B, 0x325E, 0x3261, 0x3264, 0x3267, 0x326A, 0x326D, 0x3270, 0x3273, 0x3276,
+ 0x3279, 0x327C, 0x2302, 0x2304, 0x327F, 0x2306, 0x2308, 0x230A, 0x3282, 0x3285, 0x230C, 0x230E, 0x2310, 0x2312, 0x2314, 0x4179,
+ 0x2316, 0x2318, 0x231A, 0x231C, 0x231E, 0x2320, 0x2322, 0x2324, 0x3288, 0x417E, 0x2326, 0x2328, 0x232A, 0x232C, 0x232E, 0x2330,
+ 0x2332, 0x328B, 0x328E, 0x3291, 0x3294, 0x2334, 0x2336, 0x2338, 0x233A, 0x233C, 0x233E, 0x2340, 0x2342, 0x2344, 0x2346, 0x3297,
+ 0x329A, 0x2348, 0x329D, 0x32A0, 0x32A3, 0x234A, 0x32A6, 0x32A9, 0x4183, 0x234C, 0x32AC, 0x32AF, 0x32B2, 0x32B5, 0x4188, 0x418E,
+ 0x234E, 0x2350, 0x2352, 0x2354, 0x2356, 0x2358, 0x235A, 0x235C, 0x235E, 0x2360, 0x2362, 0x2364, 0x2366, 0x2368, 0x236A, 0x236C,
+ 0x236E, 0x2370, 0x4195, 0x2372, 0x2374, 0x2376, 0x419A, 0x32B8, 0x2378, 0x237A, 0x237C, 0x237E, 0x2380, 0x2382, 0x2384, 0x2386,
+ 0x2388, 0x238A, 0x32BB, 0x238C, 0x238E, 0x32BE, 0x32C1, 0x2390, 0x419F, 0x32C4, 0x2392, 0x2394, 0x2396, 0x2398, 0x32C7, 0x32CA,
+ 0x239A, 0x239C, 0x239E, 0x23A0, 0x23A2, 0x23A4, 0x23A6, 0x23A8, 0x23AA, 0x32CD, 0x32D0, 0x32D3, 0x32D6, 0x32D9, 0x32DC, 0x32DF,
+ 0x32E2, 0x32E5, 0x32E8, 0x32EB, 0x32EE, 0x32F1, 0x32F4, 0x32F7, 0x32FA, 0x32FD, 0x3300, 0x3303, 0x3306, 0x3309, 0x330C, 0x330F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8773,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8774, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8775, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8776, 0x0000,
+ 0x0000, 0x0000, 0x8777, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8778, 0x0000, 0x0000, 0x0000, 0x0000, 0x8779, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877A, 0x877B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x877C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x877E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x877F, 0x8780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8781, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8782, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8783, 0x0000, 0x0000, 0x8784, 0x0000, 0x8785, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8786, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8787, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8788, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8789, 0x878A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x878B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x878C, 0x0000, 0x0000, 0x0000, 0x0000, 0x878D, 0x0000, 0x878E, 0x878F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8790, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8791, 0x0000, 0x8792,
+ 0x0000, 0x0000, 0x0000, 0x8793, 0x8794, 0x8795, 0x0000, 0x8796, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8797, 0x0000,
+ 0x0000, 0x0000, 0x8798, 0x0000, 0x0000, 0x8799, 0x0000, 0x0000, 0x0000, 0x879A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x879B, 0x0000, 0x0000, 0x0000, 0x879C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x879D, 0x0000, 0x0000, 0x879E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x879F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87A1, 0x0000, 0x87A2, 0x0000, 0x87A3, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87A5, 0x0000, 0x0000, 0x0000, 0x87A6, 0x87A7, 0x0000, 0x0000, 0x87A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87A9,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x87AC, 0x0000, 0x0000, 0x87AD, 0x87AE, 0x87AF, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B4, 0x0000, 0x87B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87B7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87B8, 0x87B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BB, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87BC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x87BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87BF, 0x0000, 0x0000, 0x87C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C2, 0x0000, 0x87C3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87C4, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87C5, 0x87C6, 0x0000, 0x87C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87C8, 0x0000, 0x0000, 0x0000, 0x87C9, 0x0000, 0x87CA, 0x87CB, 0x0000, 0x87CC, 0x87CD, 0x0000, 0x0000,
+ 0x0000, 0x87CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87CF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87D0, 0x0000, 0x87D1, 0x0000, 0x87D2, 0x0000, 0x0000, 0x0000, 0x87D3, 0x87D4, 0x0000,
+ 0x0000, 0x0000, 0x87D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87D6, 0x0000, 0x87D7, 0x0000, 0x87D8, 0x0000, 0x0000, 0x87D9, 0x0000, 0x0000, 0x87DA, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87DB, 0x0000, 0x87DC,
+ 0x0000, 0x87DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x87DE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E0, 0x0000, 0x87E1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87E3, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E4, 0x0000, 0x87E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87E6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x87E9, 0x0000, 0x0000, 0x87EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x87EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x87EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x87EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F1, 0x87F2,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F4, 0x0000, 0x87F5, 0x0000, 0x87F6, 0x0000,
+ 0x0000, 0x0000, 0x87F7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87F8, 0x87F9, 0x0000, 0x0000, 0x87FA, 0x0000, 0x0000, 0x0000, 0x87FB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x87FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8800, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8801, 0x0000, 0x8802, 0x8803, 0x0000, 0x0000, 0x0000, 0x0000, 0x8804, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8805, 0x0000, 0x0000, 0x0000, 0x0000, 0x8806, 0x8807,
+ 0x8808, 0x0000, 0x0000, 0x0000, 0x0000, 0x8809, 0x0000, 0x0000, 0x880A, 0x0000, 0x0000, 0x0000, 0x0000, 0x880B, 0x0000, 0x0000,
+ 0x0000, 0x880C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x880D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x880E, 0x0000, 0x0000,
+ 0x880F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8810, 0x8811, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8812,
+ 0x0000, 0x0000, 0x8813, 0x0000, 0x8814, 0x0000, 0x0000, 0x0000, 0x8815, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8816, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8817, 0x0000, 0x0000, 0x0000, 0x0000, 0x8818, 0x0000, 0x0000, 0x0000,
+ 0x8819, 0x0000, 0x0000, 0x0000, 0x0000, 0x881A, 0x0000, 0x0000, 0x0000, 0x881B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x881C, 0x0000, 0x881D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x881E, 0x881F, 0x8820, 0x0000, 0x8821, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8822, 0x8823, 0x8824, 0x0000, 0x0000, 0x8825, 0x0000, 0x0000, 0x8826, 0x8827, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8828, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8829, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x882A, 0x0000, 0x0000, 0x0000, 0x882B, 0x0000, 0x882C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x882D, 0x882E, 0x0000, 0x0000, 0x882F, 0x0000, 0x8830, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8831, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8832, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8833, 0x0000, 0x0000, 0x0000, 0x0000, 0x8834, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8835, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8836,
+ 0x0000, 0x8837, 0x0000, 0x0000, 0x8838, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8839, 0x883A, 0x0000, 0x0000, 0x0000, 0x883B,
+ 0x0000, 0x0000, 0x883C, 0x0000, 0x0000, 0x0000, 0x0000, 0x883D, 0x0000, 0x0000, 0x883E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x883F, 0x0000, 0x8840, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8841, 0x0000, 0x0000, 0x0000, 0x8842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8843, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8844, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8845, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8846, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8847, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8849, 0x0000, 0x0000, 0x0000, 0x0000, 0x884A, 0x884B, 0x884C, 0x0000, 0x0000, 0x0000, 0x884D, 0x884E,
+ 0x0000, 0x0000, 0x884F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8851,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8852, 0x0000, 0x8853, 0x8854, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8855, 0x0000, 0x8856, 0x0000, 0x0000, 0x8857, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8858, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8859, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885A, 0x0000, 0x885B, 0x885C, 0x0000, 0x0000, 0x0000, 0x885D, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885E, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x885F, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8860, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8862, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8863, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8864, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8865, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8866, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8867,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8868, 0x8869, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886C, 0x0000, 0x0000, 0x0000, 0x886D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x886E, 0x0000, 0x0000, 0x886F, 0x8870, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8871, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8872, 0x0000, 0x0000, 0x8873, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8874, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8875, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8876, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8877, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8878, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8879, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x887B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x887C, 0x0000, 0x0000, 0x0000, 0x887D, 0x887E, 0x0000, 0x887F, 0x0000, 0x8880, 0x8881, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8882, 0x8883, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8884, 0x8885, 0x0000, 0x0000, 0x8886, 0x0000, 0x8887, 0x8888, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8889, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x888C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x888D, 0x0000, 0x888E, 0x0000, 0x0000, 0x888F, 0x8890, 0x0000, 0x0000, 0x0000, 0x8891, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8892, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8893, 0x0000, 0x8894, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8895, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8896, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8897, 0x0000, 0x8898, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8899, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x889A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x889B, 0x0000, 0x0000, 0x889C, 0x0000, 0x0000, 0x889D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x889E, 0x0000, 0x0000, 0x889F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88A0, 0x0000, 0x88A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88A4, 0x0000, 0x0000, 0x0000, 0x88A5, 0x0000, 0x88A6, 0x0000, 0x88A7, 0x88A8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88A9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88AA, 0x0000, 0x88AB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88AE, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88AF, 0x0000, 0x0000, 0x88B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88B1, 0x0000, 0x0000, 0x88B2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B3, 0x88B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B5,
+ 0x0000, 0x0000, 0x0000, 0x88B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B7, 0x88B8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88B9, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BA, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BB, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88BC, 0x88BD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88BF, 0x0000, 0x0000, 0x88C0, 0x0000, 0x88C1,
+ 0x88C2, 0x88C3, 0x88C4, 0x88C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88C6, 0x0000, 0x0000, 0x88C7, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88C8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88CA, 0x0000, 0x88CB, 0x0000, 0x88CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88CD, 0x0000, 0x0000, 0x0000, 0x88CE, 0x0000, 0x88CF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D3, 0x0000,
+ 0x88D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D6, 0x0000, 0x0000, 0x0000, 0x88D7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88D9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88DB, 0x88DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88DD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x88DE, 0x88DF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E0, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E1, 0x88E2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88E4, 0x0000, 0x0000, 0x88E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E7, 0x0000, 0x88E8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88E9, 0x0000, 0x88EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x88EB,
+ 0x0000, 0x0000, 0x0000, 0x88EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88ED, 0x88EE, 0x0000, 0x0000, 0x88EF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x88F0, 0x0000, 0x0000, 0x88F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x88F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x88F4, 0x88F5, 0x88F6, 0x0000, 0x0000, 0x0000, 0x88F7, 0x0000, 0x0000, 0x0000, 0x88F8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x88F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FA, 0x0000, 0x0000, 0x88FB, 0x0000,
+ 0x0000, 0x0000, 0x88FC, 0x0000, 0x0000, 0x0000, 0x88FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x88FE, 0x0000, 0x88FF, 0x0000, 0x0000, 0x8900, 0x8901, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8902,
+ 0x0000, 0x0000, 0x0000, 0x8903, 0x0000, 0x0000, 0x0000, 0x0000, 0x8904, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8905, 0x0000, 0x0000, 0x0000, 0x8906, 0x8907, 0x8908, 0x0000, 0x8909, 0x0000, 0x890A, 0x0000, 0x890B, 0x0000,
+ 0x890C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x890E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x890F, 0x0000, 0x8910, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8911, 0x0000, 0x8912, 0x0000, 0x0000, 0x0000, 0x8913, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8914, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8915, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8916, 0x0000, 0x0000, 0x8917, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8918, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8919, 0x891A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891B, 0x0000, 0x891C, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x891D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x891E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x891F, 0x8920, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8921, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8922, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8923, 0x8924, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8925, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8926, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8927, 0x0000, 0x0000, 0x8928,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8929,
+ 0x0000, 0x0000, 0x0000, 0x892A, 0x0000, 0x0000, 0x892B, 0x0000, 0x0000, 0x0000, 0x0000, 0x892C, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x892D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x892E, 0x0000, 0x0000, 0x892F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8930,
+ 0x0000, 0x0000, 0x0000, 0x8931, 0x0000, 0x8932, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8933, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8934, 0x8935, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8936, 0x0000, 0x0000, 0x8937, 0x8938,
+ 0x0000, 0x8939, 0x0000, 0x0000, 0x893A, 0x0000, 0x0000, 0x893B, 0x0000, 0x0000, 0x893C, 0x893D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x893E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x893F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8940, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8941, 0x0000, 0x0000, 0x8942,
+ 0x8943, 0x8944, 0x8945, 0x0000, 0x8946, 0x0000, 0x0000, 0x8947, 0x0000, 0x0000, 0x8948, 0x8949, 0x894A, 0x0000, 0x894B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x894C, 0x0000, 0x894D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x894E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x894F, 0x0000, 0x8950, 0x0000, 0x0000, 0x8951, 0x0000, 0x8952, 0x8953, 0x8954, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8955, 0x8956, 0x8957, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8958, 0x0000, 0x8959, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x895A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895B, 0x895C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x895D, 0x0000, 0x0000, 0x895E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x895F, 0x8960, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8961, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8962, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8963, 0x0000, 0x0000, 0x0000, 0x0000, 0x8964, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8966, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8967, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8968, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8969, 0x896A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x896C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x896D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x896E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x896F, 0x0000, 0x8970, 0x8971, 0x0000, 0x8972, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8973, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8974, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8975, 0x0000, 0x0000, 0x0000, 0x8976, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8977, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8978, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8979, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x897A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x897C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x897D, 0x0000, 0x0000, 0x0000, 0x897E, 0x0000, 0x0000, 0x0000, 0x0000, 0x897F, 0x0000, 0x8980,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8981, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8982, 0x8983, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8984,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8985, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8986, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8987,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8988, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8989, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898A, 0x0000, 0x0000, 0x0000, 0x0000, 0x898B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898D, 0x0000, 0x0000, 0x0000, 0x898E, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x898F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8990, 0x0000, 0x8991, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8992, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8993, 0x0000, 0x0000, 0x8994, 0x8995, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8996, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8997, 0x8998, 0x0000, 0x0000, 0x8999, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x899A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899B, 0x0000, 0x0000, 0x0000, 0x0000, 0x899C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x899D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x899E, 0x899F, 0x89A0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A1, 0x0000, 0x0000, 0x89A2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A3,
+ 0x0000, 0x0000, 0x89A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x89A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89A7, 0x0000, 0x89A8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89A9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AA, 0x0000, 0x0000, 0x89AB,
+ 0x0000, 0x0000, 0x89AC, 0x89AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89AE, 0x89AF,
+ 0x0000, 0x0000, 0x0000, 0x89B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B1, 0x0000, 0x0000, 0x89B2, 0x0000, 0x0000, 0x89B3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89B5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89B6, 0x89B7, 0x0000, 0x89B8, 0x89B9, 0x89BA,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89BB, 0x0000, 0x89BC, 0x89BD, 0x0000, 0x89BE, 0x89BF, 0x89C0, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C2, 0x0000, 0x89C3, 0x89C4, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C6, 0x0000, 0x0000, 0x0000, 0x0000, 0x89C7,
+ 0x0000, 0x0000, 0x89C8, 0x0000, 0x0000, 0x0000, 0x89C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x89CB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CC,
+ 0x0000, 0x89CD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89CE, 0x0000, 0x0000, 0x0000, 0x0000, 0x89CF, 0x89D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D3, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x89D4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D5, 0x0000, 0x0000, 0x89D6, 0x89D7,
+ 0x0000, 0x0000, 0x89D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89D9, 0x0000, 0x89DA, 0x0000, 0x0000, 0x0000,
+ 0x89DB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89DE, 0x0000, 0x0000, 0x0000, 0x89DF, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E1, 0x89E2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x89E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x89E8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89ED, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F0, 0x0000, 0x0000, 0x89F1, 0x0000, 0x89F2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F3, 0x89F4, 0x0000, 0x0000, 0x0000, 0x89F5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89F6, 0x0000, 0x89F7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x89F8, 0x0000, 0x0000, 0x0000, 0x89F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FD, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x89FF, 0x8A00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A01, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A03, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A04, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A06, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A07, 0x8A08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A09, 0x0000, 0x8A0A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0B, 0x0000, 0x0000, 0x8A0C,
+ 0x0000, 0x0000, 0x8A0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A0E, 0x0000, 0x0000, 0x8A0F, 0x0000, 0x0000, 0x8A10, 0x8A11,
+ 0x0000, 0x8A12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A15, 0x8A16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A17, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A19, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1A,
+ 0x0000, 0x8A1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A1C, 0x0000, 0x0000, 0x8A1D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A20,
+ 0x8A21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A22,
+ 0x8A23, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A24, 0x8A25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A27, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A28, 0x0000, 0x0000, 0x0000, 0x8A29, 0x0000, 0x8A2A, 0x0000, 0x0000, 0x8A2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A2D, 0x0000, 0x8A2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A2F, 0x0000, 0x0000, 0x8A30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A31,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A33, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A34, 0x8A35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A36, 0x0000, 0x8A37, 0x0000, 0x8A38, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A39, 0x8A3A, 0x0000, 0x0000, 0x8A3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3D, 0x0000, 0x0000, 0x8A3E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A3F, 0x0000, 0x8A40,
+ 0x8A41, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A42, 0x8A43, 0x8A44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A46, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A47, 0x8A48, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A4C, 0x8A4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A4F, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A51,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A54, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A56, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A57, 0x0000, 0x0000, 0x8A58, 0x0000, 0x0000, 0x0000, 0x8A59, 0x0000, 0x0000, 0x8A5A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A5B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A5E, 0x0000,
+ 0x0000, 0x8A5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A60, 0x8A61, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A63, 0x0000, 0x0000, 0x8A64, 0x0000, 0x0000, 0x8A65,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A67, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8A68, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A69, 0x0000, 0x8A6A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6B, 0x0000, 0x0000,
+ 0x8A6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A6E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A70, 0x0000, 0x0000, 0x0000, 0x8A71, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A74, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A76, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A77, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A78, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7A, 0x0000, 0x0000, 0x0000, 0x8A7B, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A7E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A7F, 0x0000, 0x0000, 0x8A80, 0x8A81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A82, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A83, 0x0000, 0x8A84, 0x8A85, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A86, 0x0000, 0x8A87, 0x0000, 0x0000, 0x8A88, 0x0000, 0x8A89, 0x8A8A, 0x0000, 0x8A8B, 0x8A8C, 0x8A8D, 0x0000, 0x0000, 0x0000,
+ 0x8A8E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A8F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A90, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A91,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A92, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8A93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8A94, 0x8A95, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A96, 0x8A97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A98,
+ 0x0000, 0x0000, 0x8A99, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8A9B, 0x0000, 0x8A9C, 0x0000, 0x0000, 0x8A9D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8A9E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8A9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA1, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA3,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AA8, 0x8AA9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAA, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAC, 0x8AAD, 0x0000, 0x0000, 0x0000,
+ 0x8AAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AAF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB0, 0x0000, 0x0000, 0x8AB1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8AB3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AB5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB6, 0x0000, 0x8AB7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AB9, 0x0000,
+ 0x0000, 0x8ABA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8ABC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ABD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8ABE, 0x0000, 0x0000, 0x0000, 0x8ABF, 0x8AC0, 0x0000, 0x8AC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AC3,
+ 0x0000, 0x0000, 0x8AC4, 0x0000, 0x8AC5, 0x0000, 0x0000, 0x8AC6, 0x0000, 0x8AC7, 0x0000, 0x0000, 0x8AC8, 0x8AC9, 0x8ACA, 0x0000,
+ 0x8ACB, 0x8ACC, 0x8ACD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ACF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8AD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD1, 0x0000, 0x8AD2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AD4, 0x0000, 0x8AD5, 0x0000,
+ 0x0000, 0x8AD6, 0x0000, 0x8AD7, 0x8AD8, 0x0000, 0x0000, 0x8AD9, 0x0000, 0x0000, 0x8ADA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADC, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADD,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ADE, 0x0000, 0x8ADF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE1, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE2, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE7,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AE8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8AE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEB, 0x0000, 0x0000, 0x0000, 0x8AEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AED,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AEE, 0x0000, 0x0000, 0x0000, 0x8AEF, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF0, 0x0000, 0x8AF1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8AF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8AF4, 0x0000, 0x0000, 0x0000, 0x8AF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AF9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8AFB, 0x0000, 0x0000, 0x0000, 0x8AFC, 0x8AFD, 0x8AFE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8AFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B00,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B01, 0x8B02, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B03, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B04, 0x0000, 0x0000, 0x0000, 0x8B05, 0x0000, 0x0000, 0x0000, 0x8B06, 0x0000,
+ 0x0000, 0x8B07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B08,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B09, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0A, 0x0000, 0x0000, 0x8B0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0D, 0x0000,
+ 0x0000, 0x8B0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B0F, 0x8B10, 0x8B11, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B12, 0x8B13, 0x8B14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B16, 0x8B17, 0x0000, 0x0000, 0x0000, 0x8B18, 0x8B19,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1A, 0x8B1B, 0x0000, 0x0000, 0x0000, 0x8B1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B1D, 0x8B1E, 0x0000, 0x8B1F, 0x0000, 0x0000, 0x8B20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B22, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B23, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B25, 0x0000, 0x0000, 0x0000, 0x8B26,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B27, 0x0000, 0x0000, 0x0000, 0x8B28, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B29, 0x0000, 0x8B2A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B2D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8B2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B30, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B31, 0x0000,
+ 0x0000, 0x8B32, 0x0000, 0x8B33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B34, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B35, 0x0000, 0x8B36, 0x0000, 0x0000, 0x0000, 0x8B37, 0x8B38, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8B39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B3B, 0x0000, 0x8B3C, 0x8B3D, 0x0000, 0x0000, 0x8B3E,
+ 0x8B3F, 0x0000, 0x0000, 0x0000, 0x8B40, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B41, 0x0000, 0x0000, 0x8B42, 0x0000, 0x8B43, 0x0000,
+ 0x0000, 0x0000, 0x8B44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B45, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B47, 0x8B48, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8B4A, 0x8B4B, 0x0000, 0x8B4C, 0x0000, 0x8B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B4E, 0x0000,
+ 0x8B4F, 0x0000, 0x8B50, 0x0000, 0x8B51, 0x8B52, 0x8B53, 0x8B54, 0x8B55, 0x8B56, 0x0000, 0x8B57, 0x0000, 0x8B58, 0x0000, 0x0000,
+ 0x8B59, 0x0000, 0x0000, 0x8B5A, 0x8B5B, 0x8B5C, 0x0000, 0x8B5D, 0x0000, 0x8B5E, 0x8B5F, 0x8B60, 0x8B61, 0x8B62, 0x0000, 0x0000,
+ 0x0000, 0x8B63, 0x0000, 0x0000, 0x0000, 0x8B64, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B65, 0x0000,
+ 0x8B66, 0x8B67, 0x8B68, 0x8B69, 0x0000, 0x8B6A, 0x0000, 0x0000, 0x0000, 0x8B6B, 0x8B6C, 0x0000, 0x8B6D, 0x0000, 0x0000, 0x8B6E,
+ 0x8B6F, 0x0000, 0x8B70, 0x8B71, 0x8B72, 0x0000, 0x8B73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B74, 0x0000,
+ 0x8B75, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B77, 0x0000, 0x8B78, 0x8B79, 0x0000,
+ 0x0000, 0x8B7A, 0x8B7B, 0x0000, 0x0000, 0x0000, 0x8B7C, 0x0000, 0x8B7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8B7E, 0x8B7F, 0x8B80, 0x8B81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8B83, 0x0000, 0x8B84, 0x0000, 0x0000, 0x8B85, 0x0000, 0x8B86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B87,
+ 0x0000, 0x0000, 0x0000, 0x8B88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B89, 0x0000, 0x8B8A, 0x0000,
+ 0x8B8B, 0x0000, 0x8B8C, 0x8B8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8B8E, 0x8B8F, 0x0000, 0x0000,
+ 0x8B90, 0x8B91, 0x8B92, 0x0000, 0x8B93, 0x0000, 0x0000, 0x0000, 0x8B94, 0x8B95, 0x8B96, 0x8B97, 0x0000, 0x8B98, 0x8B99, 0x8B9A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8B9B, 0x0000, 0x0000, 0x8B9C, 0x0000, 0x0000, 0x8B9D, 0x8B9E, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8B9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BA0, 0x8BA1, 0x8BA2, 0x8BA3, 0x0000, 0x0000, 0x8BA4, 0x8BA5, 0x0000,
+ 0x8BA6, 0x8BA7, 0x0000, 0x8BA8, 0x0000, 0x0000, 0x8BA9, 0x0000, 0x8BAA, 0x8BAB, 0x0000, 0x0000, 0x8BAC, 0x0000, 0x0000, 0x8BAD,
+ 0x0000, 0x8BAE, 0x8BAF, 0x0000, 0x8BB0, 0x0000, 0x8BB1, 0x0000, 0x0000, 0x8BB2, 0x0000, 0x8BB3, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BB4, 0x8BB5, 0x8BB6, 0x8BB7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BB8, 0x8BB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BBA, 0x0000, 0x0000, 0x0000, 0x8BBB, 0x0000, 0x8BBC, 0x8BBD, 0x8BBE,
+ 0x0000, 0x0000, 0x0000, 0x8BBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BC0, 0x0000, 0x0000, 0x8BC1, 0x0000,
+ 0x0000, 0x8BC2, 0x8BC3, 0x0000, 0x0000, 0x8BC4, 0x8BC5, 0x8BC6, 0x0000, 0x8BC7, 0x0000, 0x0000, 0x0000, 0x8BC8, 0x8BC9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8BCA, 0x0000, 0x8BCB, 0x8BCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8BCD, 0x0000, 0x8BCE, 0x8BCF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD0, 0x0000, 0x0000, 0x0000, 0x8BD1, 0x0000,
+ 0x0000, 0x8BD2, 0x8BD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BD4, 0x8BD5, 0x8BD6, 0x0000, 0x8BD7, 0x0000, 0x8BD8,
+ 0x8BD9, 0x0000, 0x0000, 0x8BDA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDB, 0x0000, 0x0000, 0x8BDC, 0x8BDD, 0x8BDE, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BDF, 0x0000, 0x8BE0, 0x0000, 0x8BE1, 0x0000, 0x0000, 0x8BE2,
+ 0x0000, 0x0000, 0x0000, 0x8BE3, 0x0000, 0x0000, 0x8BE4, 0x0000, 0x8BE5, 0x0000, 0x0000, 0x0000, 0x8BE6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE7, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BE8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BE9, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEA, 0x0000, 0x8BEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BEC, 0x8BED, 0x0000, 0x8BEE, 0x0000, 0x0000, 0x8BEF, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF0, 0x0000, 0x0000, 0x8BF1, 0x8BF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8BF4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8BF5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF7, 0x0000, 0x0000, 0x0000, 0x8BF8, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BF9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFB, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8BFC,
+ 0x8BFD, 0x0000, 0x8BFE, 0x8BFF, 0x0000, 0x8C00, 0x8C01, 0x8C02, 0x0000, 0x8C03, 0x0000, 0x0000, 0x0000, 0x8C04, 0x8C05, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C06, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C07, 0x0000, 0x0000, 0x8C08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C09, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0C, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C10, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C12, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C14, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C16, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C18, 0x8C19, 0x8C1A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1B, 0x0000, 0x0000, 0x0000, 0x8C1C, 0x0000, 0x8C1D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C1E, 0x0000, 0x8C1F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C20,
+ 0x8C21, 0x0000, 0x8C22, 0x0000, 0x0000, 0x8C23, 0x0000, 0x0000, 0x8C24, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C26, 0x8C27, 0x8C28, 0x8C29, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2B, 0x0000, 0x8C2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2D, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C2F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C31, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C32, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C35, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C36, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C37, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C38, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C39, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3A,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3C, 0x0000, 0x0000, 0x8C3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3E, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C3F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C40, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C41, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C43, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C44, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C45, 0x0000, 0x0000, 0x0000, 0x8C46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C47, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C48, 0x0000, 0x0000, 0x0000,
+ 0x8C49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4B, 0x8C4C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C4F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C50, 0x0000, 0x8C51, 0x8C52, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C53, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C56, 0x0000,
+ 0x0000, 0x0000, 0x8C57, 0x0000, 0x0000, 0x8C58, 0x0000, 0x0000, 0x8C59, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8C5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5B, 0x0000, 0x0000, 0x8C5C, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C5E, 0x0000, 0x8C5F, 0x0000, 0x8C60, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C61, 0x0000, 0x0000, 0x8C62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C63,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C64, 0x0000, 0x0000, 0x8C65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C67, 0x0000, 0x0000, 0x0000, 0x8C68, 0x8C69, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C6D, 0x0000, 0x0000, 0x8C6E, 0x8C6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8C70, 0x0000, 0x0000, 0x0000, 0x8C71, 0x0000, 0x8C72, 0x8C73, 0x0000, 0x0000, 0x8C74, 0x8C75, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C76, 0x0000, 0x0000, 0x8C77, 0x0000, 0x0000, 0x0000, 0x8C78, 0x0000,
+ 0x0000, 0x0000, 0x8C79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7A, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C7E, 0x8C7F, 0x0000, 0x0000, 0x8C80,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C81, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C82,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C83, 0x8C84, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C86, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C87,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C88, 0x0000, 0x8C89, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8C, 0x0000,
+ 0x0000, 0x0000, 0x8C8D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C8E, 0x0000, 0x0000, 0x0000, 0x8C8F,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8C90, 0x0000, 0x0000, 0x0000, 0x8C91, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C92, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8C93, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C94, 0x0000, 0x0000, 0x8C95,
+ 0x0000, 0x0000, 0x8C96, 0x0000, 0x0000, 0x0000, 0x8C97, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C98, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8C99, 0x0000, 0x0000, 0x0000, 0x8C9A, 0x8C9B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C9C, 0x0000, 0x0000,
+ 0x8C9D, 0x8C9E, 0x0000, 0x0000, 0x8C9F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA0,
+ 0x0000, 0x0000, 0x0000, 0x8CA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CA3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA4, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA5, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8CA7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CA8, 0x0000, 0x8CA9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAA, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAC, 0x8CAD, 0x0000, 0x0000,
+ 0x0000, 0x8CAE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CAF, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB1, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8CB3, 0x8CB4, 0x0000, 0x8CB5, 0x0000, 0x0000, 0x8CB6, 0x0000, 0x0000, 0x8CB7, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CB9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBA, 0x0000, 0x0000,
+ 0x8CBB, 0x0000, 0x0000, 0x0000, 0x8CBC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CBE,
+ 0x0000, 0x0000, 0x8CBF, 0x0000, 0x8CC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CC1, 0x0000, 0x0000, 0x0000, 0x8CC2,
+ 0x0000, 0x0000, 0x0000, 0x8CC3, 0x0000, 0x0000, 0x8CC4, 0x0000, 0x8CC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CC6, 0x0000, 0x0000, 0x0000, 0x8CC7, 0x8CC8, 0x0000, 0x0000, 0x0000, 0x8CC9, 0x0000, 0x8CCA, 0x0000, 0x0000, 0x8CCB,
+ 0x0000, 0x0000, 0x8CCC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CCD, 0x0000, 0x0000, 0x8CCE, 0x0000, 0x0000, 0x8CCF, 0x0000, 0x8CD0,
+ 0x8CD1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD2, 0x0000, 0x8CD3, 0x0000, 0x8CD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8CD5, 0x8CD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CD7, 0x0000, 0x8CD8, 0x0000, 0x8CD9, 0x0000, 0x8CDA, 0x0000,
+ 0x8CDB, 0x0000, 0x0000, 0x8CDC, 0x0000, 0x8CDD, 0x8CDE, 0x8CDF, 0x8CE0, 0x0000, 0x0000, 0x8CE1, 0x0000, 0x8CE2, 0x0000, 0x8CE3,
+ 0x0000, 0x0000, 0x0000, 0x8CE4, 0x0000, 0x8CE5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CE6, 0x0000, 0x0000, 0x8CE7, 0x0000, 0x0000,
+ 0x0000, 0x8CE8, 0x0000, 0x0000, 0x8CE9, 0x0000, 0x8CEA, 0x0000, 0x0000, 0x0000, 0x8CEB, 0x0000, 0x8CEC, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8CED, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8CEF, 0x0000,
+ 0x8CF0, 0x0000, 0x8CF1, 0x0000, 0x8CF2, 0x8CF3, 0x0000, 0x0000, 0x8CF4, 0x0000, 0x0000, 0x8CF5, 0x0000, 0x0000, 0x8CF6, 0x0000,
+ 0x8CF7, 0x8CF8, 0x8CF9, 0x8CFA, 0x0000, 0x0000, 0x8CFB, 0x0000, 0x0000, 0x8CFC, 0x0000, 0x8CFD, 0x8CFE, 0x8CFF, 0x8D00, 0x0000,
+ 0x8D01, 0x8D02, 0x8D03, 0x8D04, 0x0000, 0x8D05, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D06, 0x0000, 0x0000, 0x8D07,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8D08, 0x8D09, 0x8D0A, 0x8D0B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D0C, 0x8D0D, 0x0000, 0x0000,
+ 0x0000, 0x8D0E, 0x8D0F, 0x0000, 0x0000, 0x8D10, 0x0000, 0x0000, 0x8D11, 0x0000, 0x8D12, 0x0000, 0x0000, 0x0000, 0x8D13, 0x0000,
+ 0x8D14, 0x8D15, 0x0000, 0x8D16, 0x8D17, 0x8D18, 0x8D19, 0x0000, 0x8D1A, 0x0000, 0x8D1B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8D1C, 0x0000, 0x8D1D, 0x0000, 0x0000, 0x0000, 0x8D1E, 0x0000, 0x0000, 0x8D1F, 0x0000, 0x0000, 0x8D20, 0x0000, 0x0000, 0x8D21,
+ 0x0000, 0x0000, 0x8D22, 0x0000, 0x8D23, 0x0000, 0x0000, 0x8D24, 0x0000, 0x8D25, 0x0000, 0x8D26, 0x0000, 0x8D27, 0x0000, 0x8D28,
+ 0x0000, 0x8D29, 0x8D2A, 0x0000, 0x0000, 0x0000, 0x8D2B, 0x8D2C, 0x0000, 0x0000, 0x0000, 0x8D2D, 0x8D2E, 0x8D2F, 0x8D30, 0x0000,
+ 0x0000, 0x8D31, 0x8D32, 0x0000, 0x8D33, 0x0000, 0x8D34, 0x8D35, 0x0000, 0x0000, 0x0000, 0x8D36, 0x0000, 0x8D37, 0x8D38, 0x0000,
+ 0x0000, 0x8D39, 0x0000, 0x8D3A, 0x0000, 0x0000, 0x8D3B, 0x8D3C, 0x8D3D, 0x0000, 0x8D3E, 0x0000, 0x8D3F, 0x0000, 0x8D40, 0x0000,
+ 0x8D41, 0x8D42, 0x8D43, 0x0000, 0x8D44, 0x8D45, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D46, 0x0000, 0x0000, 0x0000, 0x8D47, 0x0000,
+ 0x8D48, 0x0000, 0x0000, 0x0000, 0x8D49, 0x0000, 0x8D4A, 0x8D4B, 0x0000, 0x8D4C, 0x0000, 0x8D4D, 0x0000, 0x8D4E, 0x0000, 0x0000,
+ 0x8D4F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D50, 0x0000, 0x0000, 0x8D51, 0x8D52, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8D53, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D54, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D55, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D56, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D57, 0x8D58,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D59, 0x0000, 0x8D5A, 0x8D5B, 0x8D5C, 0x0000, 0x8D5D, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D5E, 0x0000, 0x0000, 0x0000, 0x8D5F,
+ 0x8D60, 0x0000, 0x0000, 0x0000, 0x8D61, 0x0000, 0x0000, 0x8D62, 0x8D63, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D64, 0x8D65, 0x0000,
+ 0x8D66, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D67, 0x8D68, 0x0000, 0x0000, 0x8D69, 0x0000,
+ 0x0000, 0x0000, 0x8D6A, 0x8D6B, 0x0000, 0x8D6C, 0x8D6D, 0x0000, 0x0000, 0x0000, 0x8D6E, 0x0000, 0x8D6F, 0x0000, 0x8D70, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D72, 0x0000,
+ 0x8D73, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D74, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8D76, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D77, 0x8D78, 0x0000,
+ 0x8D79, 0x8D7A, 0x8D7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x8D7C, 0x8D7D, 0x8D7E, 0x8D7F, 0x8D80, 0x8D81, 0x0000, 0x0000, 0x8D82,
+ 0x8D83, 0x0000, 0x8D84, 0x8D85, 0x8D86, 0x0000, 0x8D87, 0x8D88, 0x8D89, 0x0000, 0x8D8A, 0x8D8B, 0x8D8C, 0x8D8D, 0x0000, 0x8D8E,
+ 0x8D8F, 0x8D90, 0x8D91, 0x8D92, 0x8D93, 0x8D94, 0x0000, 0x8D95, 0x8D96, 0x0000, 0x8D97, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8D98, 0x8D99, 0x8D9A, 0x0000, 0x8D9B, 0x0000, 0x0000, 0x0000, 0x8D9C, 0x8D9D, 0x0000, 0x8D9E, 0x0000, 0x8D9F, 0x0000,
+ 0x8DA0, 0x8DA1, 0x8DA2, 0x8DA3, 0x8DA4, 0x0000, 0x8DA5, 0x8DA6, 0x0000, 0x0000, 0x8DA7, 0x0000, 0x8DA8, 0x8DA9, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAA, 0x8DAB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DAC, 0x8DAD, 0x8DAE, 0x8DAF, 0x8DB0, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DB1, 0x8DB2, 0x0000, 0x8DB3, 0x8DB4, 0x0000, 0x8DB5, 0x0000, 0x0000, 0x8DB6, 0x0000, 0x8DB7,
+ 0x8DB8, 0x0000, 0x0000, 0x8DB9, 0x8DBA, 0x0000, 0x8DBB, 0x8DBC, 0x0000, 0x0000, 0x0000, 0x8DBD, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DBF, 0x0000, 0x0000, 0x0000, 0x8DC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DC2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8DC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DC4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DC8, 0x0000, 0x0000, 0x8DC9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DCC, 0x8DCD, 0x8DCE, 0x0000, 0x8DCF, 0x0000, 0x0000,
+ 0x0000, 0x8DD0, 0x8DD1, 0x8DD2, 0x0000, 0x8DD3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DD4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8DD5, 0x0000, 0x0000, 0x0000, 0x8DD6, 0x8DD7, 0x0000, 0x0000, 0x0000, 0x8DD8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8DD9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DDA, 0x8DDB, 0x8DDC, 0x8DDD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DDE, 0x0000, 0x8DDF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE0, 0x0000, 0x0000, 0x0000, 0x8DE1,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE2, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DE3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DE4, 0x8DE5, 0x8DE6, 0x8DE7, 0x8DE8, 0x0000, 0x8DE9, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8DEA, 0x0000, 0x8DEB, 0x0000, 0x8DEC, 0x8DED, 0x8DEE, 0x8DEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8DF0, 0x0000, 0x8DF1, 0x8DF2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF3, 0x8DF4, 0x8DF5, 0x8DF6, 0x8DF7,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DF8, 0x8DF9, 0x0000, 0x0000, 0x8DFA, 0x8DFB, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFC,
+ 0x0000, 0x0000, 0x0000, 0x8DFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8DFE, 0x0000, 0x0000, 0x8DFF, 0x0000, 0x0000, 0x8E00, 0x8E01,
+ 0x8E02, 0x0000, 0x8E03, 0x0000, 0x8E04, 0x8E05, 0x8E06, 0x0000, 0x0000, 0x8E07, 0x0000, 0x0000, 0x0000, 0x8E08, 0x8E09, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0B,
+ 0x0000, 0x8E0C, 0x8E0D, 0x0000, 0x8E0E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E0F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E10, 0x8E11, 0x8E12,
+ 0x0000, 0x0000, 0x8E13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E14, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E15, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E16, 0x8E17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E18, 0x8E19, 0x0000, 0x0000, 0x8E1A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E1B, 0x8E1C, 0x0000, 0x0000, 0x0000, 0x8E1D, 0x0000, 0x0000, 0x8E1E, 0x0000, 0x8E1F, 0x0000,
+ 0x8E20, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E21, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8E22, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E23, 0x8E24, 0x0000, 0x8E25, 0x0000, 0x8E26, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E27, 0x0000, 0x0000, 0x8E28, 0x0000, 0x0000, 0x8E29, 0x0000, 0x0000, 0x8E2A, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2B,
+ 0x8E2C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2D,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E2F, 0x0000, 0x0000, 0x8E30, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8E31, 0x0000, 0x8E32, 0x0000, 0x8E33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E34, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E35, 0x0000, 0x0000,
+ 0x8E36, 0x0000, 0x8E37, 0x0000, 0x8E38, 0x0000, 0x8E39, 0x0000, 0x0000, 0x0000, 0x8E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3B, 0x8E3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E3D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E3E, 0x0000, 0x8E3F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E40, 0x8E41, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E42, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8E43, 0x8E44, 0x0000, 0x8E45, 0x0000, 0x8E46, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E47, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E48, 0x8E49, 0x0000, 0x8E4A, 0x8E4B, 0x8E4C, 0x0000, 0x0000, 0x0000, 0x8E4D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E4E, 0x8E4F, 0x0000, 0x0000, 0x8E50, 0x0000, 0x8E51, 0x0000, 0x0000, 0x8E52, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E53, 0x0000, 0x8E54, 0x0000, 0x8E55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8E56, 0x8E57, 0x0000, 0x8E58, 0x8E59, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E5A, 0x0000, 0x0000, 0x0000, 0x8E5B, 0x0000, 0x0000,
+ 0x8E5C, 0x8E5D, 0x0000, 0x0000, 0x8E5E, 0x8E5F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E60, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E61, 0x0000, 0x0000, 0x8E62, 0x8E63, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E64, 0x0000,
+ 0x8E65, 0x0000, 0x0000, 0x8E66, 0x8E67, 0x0000, 0x0000, 0x8E68, 0x8E69, 0x8E6A, 0x8E6B, 0x0000, 0x0000, 0x8E6C, 0x8E6D, 0x8E6E,
+ 0x8E6F, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E70, 0x0000, 0x0000, 0x8E71, 0x8E72, 0x0000, 0x8E73, 0x0000, 0x8E74, 0x0000, 0x0000,
+ 0x0000, 0x8E75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E76, 0x0000, 0x0000, 0x8E77, 0x8E78, 0x0000, 0x0000, 0x8E79, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7A, 0x0000, 0x8E7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7C, 0x8E7D, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E7E, 0x0000, 0x8E7F, 0x0000, 0x8E80, 0x8E81, 0x0000, 0x0000, 0x0000, 0x8E82,
+ 0x8E83, 0x0000, 0x0000, 0x8E84, 0x0000, 0x8E85, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E86, 0x0000, 0x0000,
+ 0x0000, 0x8E87, 0x0000, 0x8E88, 0x0000, 0x0000, 0x8E89, 0x0000, 0x8E8A, 0x0000, 0x8E8B, 0x8E8C, 0x8E8D, 0x0000, 0x0000, 0x0000,
+ 0x8E8E, 0x0000, 0x0000, 0x8E8F, 0x0000, 0x8E90, 0x8E91, 0x0000, 0x8E92, 0x0000, 0x8E93, 0x8E94, 0x8E95, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8E96, 0x0000, 0x0000, 0x0000, 0x8E97, 0x0000, 0x8E98, 0x0000, 0x8E99, 0x8E9A, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8E9B, 0x0000, 0x8E9C, 0x0000, 0x8E9D, 0x0000, 0x8E9E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8E9F, 0x0000, 0x0000, 0x8EA0,
+ 0x0000, 0x0000, 0x8EA1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA2, 0x0000, 0x8EA3,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8EA4, 0x8EA5, 0x8EA6, 0x0000, 0x8EA7, 0x8EA8, 0x8EA9, 0x0000, 0x0000, 0x0000, 0x8EAA, 0x8EAB,
+ 0x8EAC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EAD, 0x0000, 0x0000, 0x0000, 0x8EAE, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EAF, 0x0000, 0x0000, 0x8EB0, 0x0000, 0x8EB1, 0x0000, 0x8EB2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EB3,
+ 0x8EB4, 0x0000, 0x8EB5, 0x0000, 0x0000, 0x8EB6, 0x0000, 0x0000, 0x8EB7, 0x8EB8, 0x8EB9, 0x8EBA, 0x0000, 0x0000, 0x0000, 0x8EBB,
+ 0x8EBC, 0x8EBD, 0x8EBE, 0x0000, 0x0000, 0x0000, 0x8EBF, 0x0000, 0x8EC0, 0x8EC1, 0x0000, 0x8EC2, 0x0000, 0x0000, 0x8EC3, 0x8EC4,
+ 0x0000, 0x0000, 0x0000, 0x8EC5, 0x0000, 0x0000, 0x8EC6, 0x0000, 0x8EC7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EC8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EC9, 0x8ECA, 0x0000, 0x0000, 0x8ECB, 0x8ECC, 0x0000, 0x8ECD, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8ECE, 0x0000, 0x0000, 0x0000, 0x8ECF, 0x0000, 0x8ED0, 0x8ED1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8ED2, 0x0000, 0x0000, 0x0000, 0x8ED3, 0x8ED4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED5, 0x0000, 0x0000, 0x0000,
+ 0x8ED6, 0x0000, 0x0000, 0x0000, 0x0000, 0x8ED7, 0x8ED8, 0x0000, 0x0000, 0x0000, 0x8ED9, 0x0000, 0x0000, 0x0000, 0x8EDA, 0x0000,
+ 0x0000, 0x0000, 0x8EDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8EDD, 0x0000, 0x8EDE, 0x0000, 0x8EDF, 0x0000, 0x0000, 0x8EE0, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8EE1, 0x8EE2, 0x8EE3, 0x0000, 0x0000, 0x8EE4, 0x8EE5, 0x0000, 0x8EE6, 0x8EE7, 0x0000, 0x8EE8, 0x0000, 0x8EE9, 0x0000,
+ 0x8EEA, 0x0000, 0x0000, 0x8EEB, 0x0000, 0x8EEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8EED, 0x0000, 0x0000, 0x0000, 0x8EEE, 0x8EEF, 0x0000, 0x0000, 0x0000, 0x8EF0, 0x8EF1, 0x0000, 0x0000,
+ 0x8EF2, 0x8EF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EF4, 0x8EF5, 0x0000, 0x0000, 0x0000, 0x8EF6, 0x8EF7, 0x8EF8, 0x8EF9,
+ 0x0000, 0x8EFA, 0x8EFB, 0x0000, 0x8EFC, 0x0000, 0x0000, 0x0000, 0x8EFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8EFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x8EFF, 0x0000, 0x0000, 0x0000, 0x8F00, 0x0000, 0x0000, 0x0000, 0x8F01, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F02, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F03, 0x0000, 0x0000, 0x8F04, 0x8F05, 0x0000, 0x0000, 0x0000, 0x8F06, 0x8F07, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F08, 0x8F09, 0x0000, 0x0000, 0x8F0A, 0x0000, 0x0000, 0x8F0B, 0x0000,
+ 0x0000, 0x0000, 0x8F0C, 0x8F0D, 0x0000, 0x8F0E, 0x8F0F, 0x0000, 0x8F10, 0x0000, 0x8F11, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F12,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8F13, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F14, 0x0000, 0x8F15, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F16, 0x0000, 0x0000, 0x0000, 0x8F17, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F18, 0x0000,
+ 0x8F19, 0x0000, 0x0000, 0x8F1A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1B, 0x0000, 0x0000,
+ 0x8F1C, 0x8F1D, 0x8F1E, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F1F, 0x0000, 0x8F20, 0x0000, 0x0000, 0x8F21, 0x8F22, 0x8F23, 0x8F24,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F25, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F26, 0x0000, 0x8F27, 0x8F28, 0x0000, 0x0000, 0x8F29, 0x0000, 0x8F2A, 0x8F2B, 0x0000, 0x8F2C, 0x8F2D, 0x0000, 0x8F2E, 0x8F2F,
+ 0x0000, 0x0000, 0x8F30, 0x8F31, 0x8F32, 0x0000, 0x0000, 0x0000, 0x8F33, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F34, 0x0000, 0x8F35, 0x0000, 0x8F36, 0x0000, 0x0000, 0x8F37, 0x8F38, 0x0000, 0x8F39, 0x8F3A, 0x8F3B, 0x0000, 0x0000,
+ 0x0000, 0x8F3C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F3D, 0x0000, 0x0000, 0x8F3E, 0x0000, 0x8F3F, 0x8F40, 0x8F41, 0x8F42, 0x8F43,
+ 0x0000, 0x0000, 0x0000, 0x8F44, 0x0000, 0x0000, 0x8F45, 0x8F46, 0x8F47, 0x0000, 0x8F48, 0x8F49, 0x8F4A, 0x0000, 0x0000, 0x0000,
+ 0x8F4B, 0x0000, 0x8F4C, 0x8F4D, 0x8F4E, 0x8F4F, 0x8F50, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F51, 0x0000, 0x8F52, 0x0000,
+ 0x8F53, 0x8F54, 0x8F55, 0x0000, 0x8F56, 0x8F57, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F58, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F59, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F5A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F5B, 0x0000, 0x0000, 0x8F5C, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5D, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F5F, 0x8F60, 0x0000, 0x0000, 0x0000, 0x8F61, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F62, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F63, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F64, 0x0000, 0x8F65, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F66, 0x0000, 0x0000, 0x8F67, 0x0000, 0x0000, 0x0000, 0x8F68, 0x0000, 0x0000, 0x8F69, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6A, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F6B, 0x0000, 0x0000, 0x8F6C, 0x0000, 0x8F6D, 0x8F6E, 0x0000, 0x8F6F, 0x0000,
+ 0x0000, 0x0000, 0x8F70, 0x8F71, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F72, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F73, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F74, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F75, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F76, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8F77, 0x0000, 0x8F78, 0x0000, 0x8F79, 0x0000, 0x8F7A, 0x8F7B, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7C, 0x0000, 0x8F7D, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F7E, 0x0000, 0x8F7F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x8F80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F81,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F82, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8F83, 0x0000, 0x8F84, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F85, 0x0000, 0x8F86, 0x8F87, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x8F88, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F89, 0x0000, 0x0000, 0x8F8A, 0x0000, 0x8F8B, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8F8C, 0x0000, 0x0000, 0x0000, 0x8F8D,
+ 0x0000, 0x8F8E, 0x8F8F, 0x8F90, 0x0000, 0x8F91, 0x8F92, 0x8F93, 0x8F94, 0x0000, 0x8F95, 0x0000, 0x8F96, 0x0000, 0x8F97, 0x8F98,
+ 0x8F99, 0x8F9A, 0x8F9B, 0x8F9C, 0x0000, 0x0000, 0x0000, 0x8F9D, 0x8F9E, 0x0000, 0x0000, 0x0000, 0x8F9F, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8FA0, 0x0000, 0x0000, 0x8FA1, 0x0000, 0x8FA2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA3, 0x0000, 0x0000,
+ 0x8FA4, 0x0000, 0x8FA5, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FA6, 0x8FA7, 0x8FA8, 0x0000, 0x8FA9, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FAB, 0x8FAC, 0x8FAD, 0x8FAE,
+ 0x0000, 0x0000, 0x8FAF, 0x8FB0, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FB1, 0x8FB2, 0x0000, 0x8FB3, 0x0000, 0x0000, 0x8FB4, 0x0000,
+ 0x0000, 0x0000, 0x8FB5, 0x0000, 0x0000, 0x8FB6, 0x0000, 0x8FB7, 0x0000, 0x0000, 0x0000, 0x8FB8, 0x8FB9, 0x0000, 0x0000, 0x8FBA,
+ 0x8FBB, 0x8FBC, 0x0000, 0x8FBD, 0x8FBE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FBF, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC0, 0x8FC1, 0x8FC2,
+ 0x0000, 0x8FC3, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FC4, 0x0000, 0x8FC5, 0x0000, 0x8FC6, 0x8FC7, 0x8FC8, 0x0000, 0x0000, 0x0000,
+ 0x8FC9, 0x0000, 0x0000, 0x0000, 0x8FCA, 0x0000, 0x8FCB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FCC, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8FCD, 0x8FCE, 0x0000, 0x8FCF, 0x0000, 0x0000, 0x0000, 0x8FD0, 0x8FD1, 0x8FD2, 0x0000, 0x8FD3, 0x0000, 0x8FD4,
+ 0x0000, 0x0000, 0x8FD5, 0x0000, 0x8FD6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FD7, 0x8FD8, 0x8FD9, 0x8FDA,
+ 0x0000, 0x0000, 0x0000, 0x8FDB, 0x8FDC, 0x8FDD, 0x0000, 0x0000, 0x0000, 0x8FDE, 0x8FDF, 0x0000, 0x8FE0, 0x0000, 0x8FE1, 0x0000,
+ 0x0000, 0x8FE2, 0x8FE3, 0x8FE4, 0x0000, 0x0000, 0x8FE5, 0x0000, 0x8FE6, 0x0000, 0x8FE7, 0x8FE8, 0x8FE9, 0x0000, 0x8FEA, 0x0000,
+ 0x0000, 0x8FEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FEC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x8FED, 0x0000, 0x8FEE, 0x0000, 0x8FEF, 0x8FF0, 0x0000, 0x0000, 0x0000, 0x8FF1, 0x0000, 0x8FF2, 0x0000, 0x8FF3, 0x8FF4,
+ 0x0000, 0x8FF5, 0x0000, 0x8FF6, 0x0000, 0x8FF7, 0x0000, 0x0000, 0x8FF8, 0x8FF9, 0x0000, 0x8FFA, 0x8FFB, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x8FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFD, 0x0000, 0x0000, 0x0000, 0x0000, 0x8FFE, 0x0000, 0x8FFF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9000, 0x9001, 0x9002, 0x0000,
+ 0x0000, 0x9003, 0x0000, 0x9004, 0x9005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x9006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9007, 0x9008, 0x9009, 0x0000, 0x900A, 0x900B, 0x0000, 0x0000, 0x900C, 0x900D, 0x0000, 0x900E, 0x0000, 0x900F, 0x0000, 0x9010,
+ 0x0000, 0x0000, 0x9011, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9012, 0x0000, 0x0000,
+ 0x9013, 0x9014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9015, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9016,
+ 0x0000, 0x9017, 0x9018, 0x0000, 0x0000, 0x9019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901A, 0x901B, 0x901C,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x901D, 0x0000, 0x0000, 0x901E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x901F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9020, 0x0000, 0x9021, 0x9022, 0x0000,
+ 0x9023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9024, 0x9025, 0x9026, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9027, 0x0000,
+ 0x9028, 0x9029, 0x902A, 0x902B, 0x902C, 0x902D, 0x0000, 0x0000, 0x0000, 0x0000, 0x902E, 0x0000, 0x902F, 0x9030, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9031, 0x0000, 0x9032, 0x0000, 0x0000, 0x9033, 0x9034, 0x0000, 0x0000, 0x0000, 0x9035,
+ 0x0000, 0x0000, 0x9036, 0x0000, 0x9037, 0x9038, 0x9039, 0x0000, 0x0000, 0x0000, 0x903A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903B,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x903C,
+ 0x0000, 0x0000, 0x903D, 0x0000, 0x903E, 0x903F, 0x9040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9041, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9043, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9044, 0x0000, 0x0000, 0x9045, 0x0000, 0x9046, 0x0000, 0x9047, 0x0000, 0x0000, 0x0000, 0x0000, 0x9048, 0x0000,
+ 0x0000, 0x9049, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904B, 0x0000, 0x904C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x904E,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x904F, 0x0000, 0x0000, 0x9050, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x9051, 0x0000, 0x9052, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9053, 0x9054, 0x0000,
+ 0x9055, 0x9056, 0x9057, 0x9058, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9059, 0x0000, 0x0000, 0x0000, 0x905A, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x905B, 0x0000, 0x0000, 0x0000, 0x905C, 0x905D, 0x0000, 0x905E, 0x905F, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9060, 0x9061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9062, 0x0000, 0x9063, 0x9064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x9065, 0x9066, 0x9067, 0x9068, 0x0000, 0x0000, 0x0000, 0x9069, 0x0000, 0x906A, 0x0000, 0x0000,
+ 0x0000, 0x906B, 0x906C, 0x0000, 0x906D, 0x0000, 0x0000, 0x906E, 0x906F, 0x0000, 0x9070, 0x9071, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9072, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9073, 0x0000, 0x9074,
+ 0x0000, 0x0000, 0x9075, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9076, 0x9077, 0x0000, 0x0000, 0x0000, 0x9078, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9079, 0x907A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x907B, 0x0000, 0x0000, 0x907C,
+ 0x0000, 0x0000, 0x0000, 0x907D, 0x0000, 0x907E, 0x0000, 0x0000, 0x907F, 0x9080, 0x0000, 0x0000, 0x0000, 0x9081, 0x9082, 0x0000,
+ 0x0000, 0x9083, 0x9084, 0x0000, 0x0000, 0x0000, 0x0000, 0x9085, 0x0000, 0x9086, 0x9087, 0x9088, 0x0000, 0x0000, 0x9089, 0x0000,
+ 0x0000, 0x0000, 0x908A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x908B, 0x908C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x908D, 0x0000, 0x908E, 0x0000, 0x908F, 0x9090, 0x9091, 0x0000, 0x0000, 0x0000, 0x0000, 0x9092, 0x0000, 0x9093,
+ 0x9094, 0x0000, 0x0000, 0x9095, 0x0000, 0x0000, 0x0000, 0x9096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9097, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9098, 0x9099, 0x0000, 0x909A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x909B, 0x0000, 0x909C, 0x0000, 0x909D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x909E, 0x909F, 0x90A0, 0x0000, 0x90A1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A2, 0x90A3, 0x0000, 0x90A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x90A5, 0x0000, 0x0000, 0x90A6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90A7, 0x0000, 0x90A8, 0x90A9, 0x90AA,
+ 0x0000, 0x0000, 0x0000, 0x90AB, 0x0000, 0x0000, 0x90AC, 0x0000, 0x90AD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90AE,
+ 0x90AF, 0x0000, 0x0000, 0x0000, 0x90B0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B1, 0x0000, 0x0000, 0x0000, 0x90B2,
+ 0x0000, 0x0000, 0x90B3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x90B4, 0x90B5, 0x90B6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90B7, 0x90B8, 0x0000, 0x0000,
+ 0x90B9, 0x90BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BB, 0x0000, 0x90BC, 0x0000, 0x0000, 0x90BD,
+ 0x0000, 0x0000, 0x90BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x90BF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90C0, 0x0000, 0x90C1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90C2, 0x0000, 0x0000, 0x90C3, 0x0000, 0x90C4, 0x0000, 0x90C5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x90C6, 0x0000, 0x0000, 0x90C7, 0x90C8, 0x0000, 0x0000, 0x0000, 0x90C9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CA,
+ 0x0000, 0x0000, 0x90CB, 0x0000, 0x90CC, 0x0000, 0x0000, 0x0000, 0x0000, 0x90CD, 0x90CE, 0x90CF, 0x90D0, 0x0000, 0x0000, 0x90D1,
+ 0x0000, 0x90D2, 0x90D3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90D4, 0x0000, 0x0000, 0x90D5, 0x90D6, 0x0000, 0x90D7, 0x90D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90D9, 0x90DA, 0x0000, 0x0000, 0x0000, 0x0000, 0x90DB, 0x0000, 0x0000, 0x0000, 0x90DC,
+ 0x0000, 0x0000, 0x90DD, 0x0000, 0x90DE, 0x0000, 0x0000, 0x0000, 0x90DF, 0x90E0, 0x90E1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E3, 0x0000, 0x0000, 0x90E4, 0x0000, 0x90E5, 0x90E6, 0x0000, 0x90E7, 0x90E8, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90E9, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EA, 0x0000, 0x90EB, 0x90EC, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90ED, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90EE, 0x0000, 0x0000, 0x0000, 0x90EF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90F0, 0x90F1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F2, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x90F3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F4, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F5, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90F6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90F7, 0x0000, 0x90F8, 0x90F9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FA, 0x0000, 0x90FB,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x90FD, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x90FE, 0x90FF, 0x0000, 0x0000, 0x9100, 0x9101,
+ 0x0000, 0x0000, 0x9102, 0x0000, 0x9103, 0x9104, 0x0000, 0x0000, 0x0000, 0x9105, 0x0000, 0x0000, 0x9106, 0x0000, 0x0000, 0x9107,
+ 0x9108, 0x9109, 0x0000, 0x0000, 0x0000, 0x0000, 0x910A, 0x0000, 0x0000, 0x0000, 0x910B, 0x0000, 0x910C, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x910D, 0x0000, 0x0000, 0x0000, 0x0000, 0x910E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x910F, 0x9110, 0x0000,
+ 0x9111, 0x0000, 0x0000, 0x0000, 0x9112, 0x9113, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9114, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9115, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9116, 0x9117, 0x9118, 0x9119, 0x911A, 0x911B, 0x911C, 0x911D, 0x911E, 0x911F, 0x9120, 0x9121, 0x9122, 0x9123, 0x9124, 0x9125,
+ 0x9126, 0x9127, 0x9128, 0x9129, 0x912A, 0x912B, 0x912C, 0x912D, 0x912E, 0x912F, 0x9130, 0x9131, 0x9132, 0x9133, 0x9134, 0x9135,
+ 0x9136, 0x9137, 0x9138, 0x9139, 0x913A, 0x913B, 0x913C, 0x913D, 0x913E, 0x913F, 0x9140, 0x9141, 0x9142, 0x9143, 0x9144, 0x9145,
+ 0x9146, 0x9147, 0x9148, 0x9149, 0x914A, 0x914B, 0x914C, 0x914D, 0x914E, 0x914F, 0x9150, 0x9151, 0x9152, 0x9153, 0x9154, 0x9155,
+ 0x9156, 0x9157, 0x9158, 0x9159, 0x915A, 0x915B, 0x915C, 0x915D, 0x915E, 0x915F, 0x9160, 0x9161, 0x9162, 0x9163, 0x9164, 0x9165,
+ 0x9166, 0x9167, 0x9168, 0x9169, 0x916A, 0x916B, 0x916C, 0x916D, 0x916E, 0x916F, 0x9170, 0x9171, 0x9172, 0x9173, 0x9174, 0x9175,
+ 0x9176, 0x9177, 0x9178, 0x9179, 0x917A, 0x917B, 0x917C, 0x917D, 0x917E, 0x917F, 0x9180, 0x9181, 0x9182, 0x9183, 0x9184, 0x9185,
+ 0x9186, 0x9187, 0x9188, 0x9189, 0x918A, 0x918B, 0x918C, 0x918D, 0x918E, 0x918F, 0x9190, 0x9191, 0x9192, 0x9193, 0x9194, 0x9195,
+ 0x9196, 0x9197, 0x9198, 0x9199, 0x919A, 0x919B, 0x919C, 0x919D, 0x919E, 0x919F, 0x91A0, 0x91A1, 0x91A2, 0x91A3, 0x91A4, 0x91A5,
+ 0x91A6, 0x91A7, 0x91A8, 0x91A9, 0x91AA, 0x91AB, 0x91AC, 0x91AD, 0x91AE, 0x91AF, 0x91B0, 0x91B1, 0x91B2, 0x91B3, 0x91B4, 0x91B5,
+ 0x91B6, 0x91B7, 0x91B8, 0x91B9, 0x91BA, 0x91BB, 0x91BC, 0x91BD, 0x91BE, 0x91BF, 0x91C0, 0x91C1, 0x91C2, 0x91C3, 0x91C4, 0x91C5,
+ 0x91C6, 0x91C7, 0x91C8, 0x91C9, 0x91CA, 0x91CB, 0x91CC, 0x91CD, 0x91CE, 0x91CF, 0x91D0, 0x91D1, 0x91D2, 0x91D3, 0x91D4, 0x91D5,
+ 0x91D6, 0x91D7, 0x91D8, 0x91D9, 0x91DA, 0x91DB, 0x91DC, 0x91DD, 0x91DE, 0x91DF, 0x91E0, 0x91E1, 0x91E2, 0x91E3, 0x91E4, 0x91E5,
+ 0x91E6, 0x91E7, 0x91E8, 0x91E9, 0x91EA, 0x91EB, 0x91EC, 0x91ED, 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F2, 0x91F3, 0x91F4, 0x91F5,
+ 0x91F6, 0x91F7, 0x91F8, 0x91F9, 0x91FA, 0x91FB, 0x91FC, 0x91FD, 0x91FE, 0x91FF, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,
+ 0x9206, 0x9207, 0x9208, 0x9209, 0x920A, 0x920B, 0x920C, 0x920D, 0x920E, 0x920F, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,
+ 0x9216, 0x9217, 0x9218, 0x9219, 0x921A, 0x921B, 0x921C, 0x921D, 0x921E, 0x921F, 0x9220, 0x9221, 0x9222, 0x9223, 0x0000, 0x0000,
+ 0x9224, 0x0000, 0x9225, 0x0000, 0x0000, 0x9226, 0x9227, 0x9228, 0x9229, 0x922A, 0x922B, 0x922C, 0x922D, 0x922E, 0x922F, 0x0000,
+ 0x9230, 0x0000, 0x9231, 0x0000, 0x0000, 0x9232, 0x9233, 0x0000, 0x0000, 0x0000, 0x9234, 0x9235, 0x9236, 0x9237, 0x0000, 0x0000,
+ 0x9238, 0x9239, 0x923A, 0x923B, 0x923C, 0x923D, 0x923E, 0x923F, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245, 0x9246, 0x9247,
+ 0x9248, 0x9249, 0x924A, 0x924B, 0x924C, 0x924D, 0x924E, 0x924F, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256, 0x9257,
+ 0x9258, 0x9259, 0x925A, 0x925B, 0x925C, 0x925D, 0x925E, 0x925F, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266, 0x9267,
+ 0x9268, 0x9269, 0x926A, 0x926B, 0x926C, 0x926D, 0x926E, 0x926F, 0x9270, 0x9271, 0x9272, 0x9273, 0x0000, 0x9274, 0x0000, 0x0000,
+ 0x9275, 0x9276, 0x9277, 0x9278, 0x9279, 0x927A, 0x927B, 0x927C, 0x927D, 0x927E, 0x927F, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284,
+ 0x9285, 0x9286, 0x9287, 0x9288, 0x9289, 0x928A, 0x928B, 0x928C, 0x928D, 0x928E, 0x928F, 0x9290, 0x9291, 0x9292, 0x9293, 0x9294,
+ 0x9295, 0x9296, 0x9297, 0x9298, 0x9299, 0x929A, 0x929B, 0x929C, 0x929D, 0x929E, 0x929F, 0x92A0, 0x92A1, 0x92A2, 0x92A3, 0x92A4,
+ 0x92A5, 0x92A6, 0x92A7, 0x92A8, 0x92A9, 0x92AA, 0x92AB, 0x92AC, 0x92AD, 0x92AE, 0x92AF, 0x92B0, 0x92B1, 0x92B2, 0x92B3, 0x92B4,
+ 0x92B5, 0x92B6, 0x92B7, 0x92B8, 0x92B9, 0x92BA, 0x92BB, 0x92BC, 0x92BD, 0x92BE, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C4,
+ 0x92C5, 0x92C6, 0x92C7, 0x92C8, 0x92C9, 0x92CA, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92CF, 0x92D0, 0x92D1, 0x92D2, 0x92D3, 0x0000,
+ 0x0000, 0x0000, 0x92D4, 0x92D5, 0x92D6, 0x0000, 0x0000, 0x0000, 0x92D7, 0x92D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x23AC, 0x23AE, 0x23B0, 0x3312, 0x3315, 0x23B2, 0x23B4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x23B6, 0x23B8, 0x23BA, 0x23BC, 0x23BE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x23C0, 0x0000, 0x23C2,
+ 0x92D9, 0x92DA, 0x92DB, 0x92DC, 0x92DD, 0x92DE, 0x92DF, 0x92E0, 0x92E1, 0x92E2, 0x23C4, 0x23C6, 0x23C8, 0x23CA, 0x23CC, 0x23CE,
+ 0x23D0, 0x23D2, 0x23D4, 0x23D6, 0x23D8, 0x23DA, 0x23DC, 0x0000, 0x23DE, 0x23E0, 0x23E2, 0x23E4, 0x23E6, 0x0000, 0x23E8, 0x0000,
+ 0x23EA, 0x23EC, 0x0000, 0x23EE, 0x23F0, 0x0000, 0x23F2, 0x23F4, 0x23F6, 0x23F8, 0x23FA, 0x23FC, 0x23FE, 0x2400, 0x2402, 0x2404,
+ 0x92E3, 0x92E4, 0x92E5, 0x92E6, 0x92E7, 0x92E8, 0x92E9, 0x92EA, 0x92EB, 0x92EC, 0x92ED, 0x92EE, 0x92EF, 0x92F0, 0x92F1, 0x92F2,
+ 0x92F3, 0x92F4, 0x92F5, 0x92F6, 0x92F7, 0x92F8, 0x92F9, 0x92FA, 0x92FB, 0x92FC, 0x92FD, 0x92FE, 0x92FF, 0x9300, 0x9301, 0x9302,
+ 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309, 0x930A, 0x930B, 0x930C, 0x930D, 0x930E, 0x930F, 0x9310, 0x9311, 0x9312,
+ 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319, 0x931A, 0x931B, 0x931C, 0x931D, 0x931E, 0x931F, 0x9320, 0x9321, 0x9322,
+ 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329, 0x932A, 0x932B, 0x932C, 0x932D, 0x932E, 0x932F, 0x9330, 0x9331, 0x9332,
+ 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339, 0x933A, 0x933B, 0x933C, 0x933D, 0x933E, 0x933F, 0x9340, 0x9341, 0x9342,
+ 0x9343, 0x9344, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934A, 0x934B, 0x934C, 0x934D, 0x934E, 0x934F, 0x9350, 0x9351,
+ 0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935A, 0x935B, 0x2406, 0x2408, 0x240A, 0x240C, 0x240E, 0x2410,
+ 0x2412, 0x2414, 0x2416, 0x2418, 0x241A, 0x241C, 0x241E, 0x2420, 0x2422, 0x2424, 0x2426, 0x2428, 0x935C, 0x935D, 0x935E, 0x935F,
+ 0x242A, 0x242C, 0x242E, 0x2430, 0x2432, 0x2434, 0x2436, 0x2438, 0x243A, 0x243C, 0x243E, 0x2440, 0x2442, 0x2444, 0x2446, 0x2448,
+ 0x244A, 0x244C, 0x244E, 0x2450, 0x2452, 0x2454, 0x2456, 0x2458, 0x245A, 0x245C, 0x245E, 0x2460, 0x2462, 0x2464, 0x2466, 0x2468,
+ 0x246A, 0x246C, 0x246E, 0x2470, 0x2472, 0x2474, 0x2476, 0x2478, 0x247A, 0x247C, 0x247E, 0x2480, 0x2482, 0x2484, 0x2486, 0x2488,
+ 0x248A, 0x248C, 0x248E, 0x2490, 0x2492, 0x2494, 0x2496, 0x2498, 0x249A, 0x249C, 0x249E, 0x24A0, 0x24A2, 0x24A4, 0x24A6, 0x24A8,
+ 0x24AA, 0x24AC, 0x24AE, 0x24B0, 0x24B2, 0x24B4, 0x24B6, 0x24B8, 0x24BA, 0x24BC, 0x24BE, 0x24C0, 0x24C2, 0x24C4, 0x24C6, 0x24C8,
+ 0x24CA, 0x24CC, 0x24CE, 0x24D0, 0x24D2, 0x24D4, 0x24D6, 0x24D8, 0x24DA, 0x24DC, 0x24DE, 0x24E0, 0x24E2, 0x24E4, 0x24E6, 0x24E8,
+ 0x24EA, 0x24EC, 0x24EE, 0x24F0, 0x24F2, 0x24F4, 0x24F6, 0x24F8, 0x24FA, 0x24FC, 0x24FE, 0x2500, 0x2502, 0x2504, 0x2506, 0x2508,
+ 0x250A, 0x250C, 0x250E, 0x2510, 0x2512, 0x2514, 0x2516, 0x2518, 0x251A, 0x251C, 0x251E, 0x2520, 0x2522, 0x2524, 0x2526, 0x2528,
+ 0x252A, 0x252C, 0x252E, 0x2530, 0x2532, 0x2534, 0x2536, 0x2538, 0x253A, 0x253C, 0x253E, 0x2540, 0x2542, 0x2544, 0x2546, 0x2548,
+ 0x254A, 0x254C, 0x254E, 0x2550, 0x2552, 0x2554, 0x2556, 0x2558, 0x255A, 0x255C, 0x255E, 0x2560, 0x2562, 0x2564, 0x2566, 0x2568,
+ 0x256A, 0x256C, 0x256E, 0x2570, 0x2572, 0x2574, 0x2576, 0x2578, 0x257A, 0x257C, 0x257E, 0x2580, 0x2582, 0x2584, 0x2586, 0x2588,
+ 0x258A, 0x258C, 0x258E, 0x2590, 0x2592, 0x2594, 0x2596, 0x2598, 0x259A, 0x259C, 0x259E, 0x25A0, 0x25A2, 0x25A4, 0x25A6, 0x25A8,
+ 0x25AA, 0x25AC, 0x25AE, 0x25B0, 0x25B2, 0x25B4, 0x25B6, 0x25B8, 0x25BA, 0x25BC, 0x25BE, 0x25C0, 0x25C2, 0x25C4, 0x25C6, 0x25C8,
+ 0x25CA, 0x25CC, 0x25CE, 0x25D0, 0x25D2, 0x25D4, 0x25D6, 0x25D8, 0x25DA, 0x25DC, 0x25DE, 0x25E0, 0x25E2, 0x25E4, 0x25E6, 0x25E8,
+ 0x25EA, 0x25EC, 0x25EE, 0x25F0, 0x25F2, 0x25F4, 0x25F6, 0x25F8, 0x25FA, 0x25FC, 0x25FE, 0x2600, 0x2602, 0x2604, 0x2606, 0x2608,
+ 0x260A, 0x260C, 0x3318, 0x331B, 0x331E, 0x260E, 0x2610, 0x2612, 0x2614, 0x2616, 0x2618, 0x261A, 0x261C, 0x261E, 0x2620, 0x2622,
+ 0x2624, 0x2626, 0x2628, 0x262A, 0x262C, 0x262E, 0x2630, 0x2632, 0x2634, 0x2636, 0x2638, 0x263A, 0x263C, 0x263E, 0x2640, 0x2642,
+ 0x2644, 0x2646, 0x2648, 0x264A, 0x264C, 0x264E, 0x2650, 0x2652, 0x2654, 0x2656, 0x2658, 0x265A, 0x265C, 0x265E, 0x2660, 0x2662,
+ 0x2664, 0x2666, 0x2668, 0x266A, 0x266C, 0x266E, 0x2670, 0x2672, 0x2674, 0x2676, 0x2678, 0x267A, 0x267C, 0x267E, 0x2680, 0x2682,
+ 0x2684, 0x2686, 0x2688, 0x268A, 0x268C, 0x268E, 0x2690, 0x2692, 0x2694, 0x2696, 0x2698, 0x269A, 0x269C, 0x269E, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3321, 0x3324, 0x3327, 0x332A, 0x332D, 0x3330, 0x3333, 0x3336, 0x3339, 0x333C, 0x333F, 0x3342, 0x3345, 0x3348, 0x334B, 0x334E,
+ 0x3351, 0x3354, 0x3357, 0x335A, 0x335D, 0x3360, 0x3363, 0x3366, 0x3369, 0x336C, 0x336F, 0x3372, 0x3375, 0x3378, 0x337B, 0x337E,
+ 0x3381, 0x3384, 0x3387, 0x338A, 0x338D, 0x3390, 0x3393, 0x3396, 0x3399, 0x339C, 0x339F, 0x33A2, 0x33A5, 0x33A8, 0x33AB, 0x33AE,
+ 0x33B1, 0x33B4, 0x33B7, 0x33BA, 0x33BD, 0x33C0, 0x33C3, 0x33C6, 0x33C9, 0x33CC, 0x33CF, 0x33D2, 0x33D5, 0x33D8, 0x33DB, 0x33DE,
+ 0x0000, 0x0000, 0x33E1, 0x33E4, 0x33E7, 0x33EA, 0x33ED, 0x33F0, 0x33F3, 0x33F6, 0x33F9, 0x33FC, 0x33FF, 0x3402, 0x3405, 0x3408,
+ 0x340B, 0x340E, 0x3411, 0x3414, 0x3417, 0x341A, 0x341D, 0x3420, 0x3423, 0x3426, 0x3429, 0x342C, 0x342F, 0x3432, 0x3435, 0x3438,
+ 0x343B, 0x343E, 0x3441, 0x3444, 0x3447, 0x344A, 0x344D, 0x3450, 0x3453, 0x3456, 0x3459, 0x345C, 0x345F, 0x3462, 0x3465, 0x3468,
+ 0x346B, 0x346E, 0x3471, 0x3474, 0x3477, 0x347A, 0x347D, 0x3480, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x3483, 0x3486, 0x41A4, 0x41A9, 0x41AE, 0x41B3, 0x41B8, 0x41BD, 0x41C2, 0x3489, 0x41C7, 0x41DA, 0x41E3, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9360, 0x9361, 0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x936A, 0x936B, 0x936C, 0x936D, 0x936E, 0x936F, 0x9370, 0x9371, 0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,
+ 0x937A, 0x937B, 0x937C, 0x937D, 0x937E, 0x0000, 0x0000, 0x937F, 0x9380, 0x9381, 0x9382, 0x9383, 0x9384, 0x9385, 0x9386, 0x9387,
+ 0x9388, 0x9389, 0x938A, 0x0000, 0x938B, 0x938C, 0x938D, 0x938E, 0x938F, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394, 0x9395, 0x9396,
+ 0x9397, 0x9398, 0x9399, 0x939A, 0x939B, 0x939C, 0x939D, 0x0000, 0x939E, 0x939F, 0x93A0, 0x93A1, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x93A2, 0x26A0, 0x93A3, 0x0000, 0x93A4, 0x0000, 0x93A5, 0x26A2, 0x93A6, 0x26A4, 0x93A7, 0x26A6, 0x93A8, 0x26A8, 0x93A9, 0x26AA,
+ 0x93AA, 0x93AB, 0x93AC, 0x93AD, 0x93AE, 0x93AF, 0x93B0, 0x93B1, 0x93B2, 0x93B3, 0x93B4, 0x93B5, 0x93B6, 0x93B7, 0x93B8, 0x93B9,
+ 0x93BA, 0x93BB, 0x93BC, 0x93BD, 0x93BE, 0x93BF, 0x93C0, 0x93C1, 0x93C2, 0x93C3, 0x93C4, 0x93C5, 0x93C6, 0x93C7, 0x93C8, 0x93C9,
+ 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93CE, 0x93CF, 0x93D0, 0x93D1, 0x93D2, 0x93D3, 0x93D4, 0x93D5, 0x93D6, 0x93D7, 0x93D8, 0x93D9,
+ 0x93DA, 0x93DB, 0x93DC, 0x93DD, 0x93DE, 0x93DF, 0x93E0, 0x93E1, 0x93E2, 0x93E3, 0x93E4, 0x93E5, 0x93E6, 0x93E7, 0x93E8, 0x93E9,
+ 0x93EA, 0x93EB, 0x93EC, 0x93ED, 0x93EE, 0x93EF, 0x93F0, 0x93F1, 0x93F2, 0x93F3, 0x93F4, 0x93F5, 0x93F6, 0x93F7, 0x93F8, 0x93F9,
+ 0x93FA, 0x93FB, 0x93FC, 0x93FD, 0x93FE, 0x93FF, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406, 0x9407, 0x9408, 0x9409,
+ 0x940A, 0x940B, 0x940C, 0x940D, 0x940E, 0x940F, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416, 0x9417, 0x9418, 0x9419,
+ 0x941A, 0x941B, 0x941C, 0x941D, 0x941E, 0x26AC, 0x26AE, 0x26B0, 0x26B2, 0x26B4, 0x26B6, 0x26B8, 0x26BA, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x941F, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426, 0x9427, 0x9428, 0x9429, 0x942A, 0x942B, 0x942C, 0x942D,
+ 0x942E, 0x942F, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436, 0x9437, 0x9438, 0x9439, 0x943A, 0x943B, 0x943C, 0x943D,
+ 0x943E, 0x943F, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447, 0x9448, 0x9449, 0x944A, 0x944B, 0x944C, 0x944D,
+ 0x944E, 0x944F, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945A, 0x945B, 0x945C, 0x945D,
+ 0x945E, 0x945F, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946A, 0x946B, 0x946C, 0x946D,
+ 0x946E, 0x946F, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947A, 0x947B, 0x947C, 0x947D,
+ 0x947E, 0x947F, 0x9480, 0x9481, 0x9482, 0x9483, 0x9484, 0x9485, 0x9486, 0x9487, 0x9488, 0x9489, 0x948A, 0x948B, 0x948C, 0x948D,
+ 0x948E, 0x948F, 0x9490, 0x9491, 0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0x9497, 0x9498, 0x9499, 0x949A, 0x949B, 0x949C, 0x949D,
+ 0x949E, 0x949F, 0x94A0, 0x94A1, 0x94A2, 0x94A3, 0x94A4, 0x94A5, 0x94A6, 0x94A7, 0x94A8, 0x94A9, 0x94AA, 0x94AB, 0x94AC, 0x94AD,
+ 0x94AE, 0x94AF, 0x94B0, 0x94B1, 0x94B2, 0x94B3, 0x94B4, 0x94B5, 0x94B6, 0x94B7, 0x94B8, 0x94B9, 0x94BA, 0x94BB, 0x94BC, 0x94BD,
+ 0x94BE, 0x94BF, 0x94C0, 0x94C1, 0x94C2, 0x94C3, 0x94C4, 0x94C5, 0x94C6, 0x94C7, 0x94C8, 0x94C9, 0x94CA, 0x94CB, 0x94CC, 0x94CD,
+ 0x94CE, 0x94CF, 0x94D0, 0x94D1, 0x94D2, 0x94D3, 0x94D4, 0x94D5, 0x94D6, 0x94D7, 0x94D8, 0x94D9, 0x94DA, 0x94DB, 0x94DC, 0x0000,
+ 0x0000, 0x0000, 0x94DD, 0x94DE, 0x94DF, 0x94E0, 0x94E1, 0x94E2, 0x0000, 0x0000, 0x94E3, 0x94E4, 0x94E5, 0x94E6, 0x94E7, 0x94E8,
+ 0x0000, 0x0000, 0x94E9, 0x94EA, 0x94EB, 0x94EC, 0x94ED, 0x94EE, 0x0000, 0x0000, 0x94EF, 0x94F0, 0x94F1, 0x0000, 0x0000, 0x0000,
+ 0x94F2, 0x94F3, 0x94F4, 0x94F5, 0x94F6, 0x94F7, 0x94F8, 0x0000, 0x94F9, 0x94FA, 0x94FB, 0x94FC, 0x94FD, 0x94FE, 0x94FF, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376] = {
+ 0x0066, 0x0053, 0x0053, 0x0059, 0x0020, 0x0308, 0x0061, 0x0052, 0x0304, 0x0032, 0x0033, 0x0301, 0x03BC, 0x0327, 0x0031, 0x006F,
+ 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0041, 0x0043, 0x0045, 0x0045, 0x0045, 0x0045, 0x0049, 0x0049, 0x0049, 0x0049, 0x0044,
+ 0x004E, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x004F, 0x0055, 0x0055, 0x0055, 0x0055, 0x0059, 0x0061, 0x0061, 0x0061, 0x0061,
+ 0x0061, 0x0061, 0x0063, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0069, 0x0069, 0x0069, 0x006E, 0x006F, 0x006F, 0x006F, 0x006F,
+ 0x006F, 0x006F, 0x0075, 0x0075, 0x0075, 0x0075, 0x0079, 0x0079, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0043, 0x0063,
+ 0x0043, 0x0063, 0x0043, 0x0063, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065,
+ 0x0045, 0x0065, 0x0045, 0x0065, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0047, 0x0067, 0x0048, 0x0068, 0x0048, 0x0068,
+ 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x0069, 0x0049, 0x004A, 0x006A, 0x004B, 0x006B, 0x004B, 0x004C, 0x006C,
+ 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x006E, 0x004F,
+ 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053,
+ 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0057, 0x0077, 0x0059, 0x0079, 0x0059, 0x005A, 0x007A, 0x005A, 0x007A, 0x005A, 0x007A,
+ 0x0073, 0x0062, 0x0042, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0044, 0x0044, 0x0064, 0x0045, 0x0045, 0x0046, 0x0066, 0x0047,
+ 0x0049, 0x004B, 0x006B, 0x006C, 0x004D, 0x004E, 0x006E, 0x004F, 0x004F, 0x006F, 0x0050, 0x0070, 0x0283, 0x0074, 0x0054, 0x0074,
+ 0x0054, 0x0055, 0x0075, 0x0056, 0x0059, 0x0079, 0x005A, 0x007A, 0x01B7, 0x0041, 0x0061, 0x0049, 0x0069, 0x004F, 0x006F, 0x0055,
+ 0x0075, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x00DC, 0x00FC, 0x0065, 0x0041, 0x0061, 0x0041, 0x0061, 0x00C6, 0x00E6,
+ 0x0047, 0x0067, 0x0047, 0x0067, 0x004B, 0x006B, 0x004F, 0x006F, 0x01EA, 0x01EB, 0x01B7, 0x0292, 0x006A, 0x0047, 0x0067, 0x004E,
+ 0x006E, 0x0041, 0x0061, 0x00C6, 0x00E6, 0x00D8, 0x00F8, 0x0041, 0x0061, 0x0041, 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0049,
+ 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x0052, 0x0072, 0x0052, 0x0072, 0x0055, 0x0075, 0x0055, 0x0075, 0x0053,
+ 0x0073, 0x0054, 0x0074, 0x0048, 0x0068, 0x004E, 0x0064, 0x005A, 0x007A, 0x0041, 0x0061, 0x0045, 0x0065, 0x00D6, 0x00F6, 0x00D5,
+ 0x00F5, 0x004F, 0x006F, 0x022E, 0x022F, 0x0059, 0x0079, 0x006C, 0x006E, 0x0074, 0x006A, 0x0041, 0x0043, 0x0063, 0x004C, 0x0054,
+ 0x0053, 0x005A, 0x0042, 0x0055, 0x0056, 0x0045, 0x0065, 0x004A, 0x006A, 0x0051, 0x0071, 0x0052, 0x0072, 0x0059, 0x0079, 0x0061,
+ 0x0251, 0x0062, 0x006F, 0x0063, 0x0064, 0x0064, 0x0065, 0x0259, 0x0065, 0x0065, 0x0065, 0x0065, 0x006A, 0x0067, 0x0067, 0x0047,
+ 0x0068, 0x0068, 0x0069, 0x0049, 0x006C, 0x006C, 0x006C, 0x006D, 0x006D, 0x006D, 0x006E, 0x006E, 0x006E, 0x006F, 0x0072, 0x0072,
+ 0x0072, 0x0072, 0x0072, 0x0072, 0x0072, 0x0052, 0x0052, 0x0073, 0x006A, 0x0283, 0x0283, 0x0074, 0x0074, 0x0055, 0x0076, 0x0076,
+ 0x0077, 0x0079, 0x0059, 0x007A, 0x007A, 0x0292, 0x0043, 0x0042, 0x0065, 0x0047, 0x0048, 0x006A, 0x006B, 0x004C, 0x0071, 0x0068,
+ 0x0068, 0x0068, 0x0068, 0x006A, 0x0072, 0x0279, 0x027B, 0x0281, 0x0077, 0x0079, 0x0263, 0x006C, 0x0073, 0x0078, 0x0295, 0x0300,
+ 0x0301, 0x0313, 0x0308, 0x0061, 0x0065, 0x0069, 0x006F, 0x0075, 0x0063, 0x0064, 0x0068, 0x006D, 0x0072, 0x0074, 0x0076, 0x0078,
+ 0x02B9, 0x003B, 0x0020, 0x00A8, 0x0391, 0x00B7, 0x0395, 0x0397, 0x0399, 0x039F, 0x03A5, 0x03A9, 0x03CA, 0x0399, 0x03A5, 0x03B1,
+ 0x03B5, 0x03B7, 0x03B9, 0x03CB, 0x03B9, 0x03C5, 0x03BF, 0x03C5, 0x03C9, 0x03B2, 0x03B8, 0x03A5, 0x03D2, 0x03D2, 0x03C6, 0x03C0,
+ 0x03BA, 0x03C1, 0x03C2, 0x0398, 0x03B5, 0x03A3, 0x0415, 0x0415, 0x0413, 0x0406, 0x041A, 0x0418, 0x0423, 0x0418, 0x0438, 0x0435,
+ 0x0435, 0x0433, 0x0456, 0x043A, 0x0438, 0x0443, 0x0466, 0x0467, 0x046A, 0x046B, 0x0474, 0x0475, 0x0460, 0x0461, 0x0419, 0x0439,
+ 0x0420, 0x0440, 0x0413, 0x0433, 0x0413, 0x0433, 0x0413, 0x0433, 0x0416, 0x0436, 0x0417, 0x0437, 0x041A, 0x043A, 0x041A, 0x043A,
+ 0x041A, 0x043A, 0x041A, 0x043A, 0x041D, 0x043D, 0x041F, 0x043F, 0x0421, 0x0441, 0x0422, 0x0442, 0x04AE, 0x04AF, 0x0425, 0x0445,
+ 0x0427, 0x0447, 0x0427, 0x0447, 0x0416, 0x0436, 0x04BC, 0x04BD, 0x0416, 0x0436, 0x041A, 0x043A, 0x041B, 0x043B, 0x041D, 0x043D,
+ 0x041D, 0x043D, 0x041C, 0x043C, 0x0410, 0x0430, 0x0410, 0x0430, 0x0415, 0x0435, 0x04D8, 0x04D9, 0x0416, 0x0436, 0x0417, 0x0437,
+ 0x0418, 0x0438, 0x0418, 0x0438, 0x041E, 0x043E, 0x04E8, 0x04E9, 0x042D, 0x044D, 0x0423, 0x0443, 0x0423, 0x0443, 0x0423, 0x0443,
+ 0x0427, 0x0447, 0x0413, 0x0433, 0x042B, 0x044B, 0x0413, 0x0433, 0x0425, 0x0445, 0x0425, 0x0445, 0x0417, 0x0437, 0x041B, 0x043B,
+ 0x0F0B, 0x10DC, 0x0041, 0x00C6, 0x0042, 0x0042, 0x0044, 0x0045, 0x018E, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D,
+ 0x004E, 0x004F, 0x0222, 0x0050, 0x0052, 0x0054, 0x0055, 0x0057, 0x0061, 0x0250, 0x0251, 0x1D02, 0x0062, 0x0064, 0x0065, 0x0259,
+ 0x025B, 0x025C, 0x0067, 0x006B, 0x006D, 0x014B, 0x006F, 0x0254, 0x1D16, 0x1D17, 0x0070, 0x0074, 0x0075, 0x1D1D, 0x026F, 0x0076,
+ 0x1D25, 0x03B2, 0x03B3, 0x03B4, 0x03C6, 0x03C7, 0x0069, 0x0072, 0x0075, 0x0076, 0x03B2, 0x03B3, 0x03C1, 0x03C6, 0x03C7, 0x0062,
+ 0x0064, 0x0066, 0x006D, 0x006E, 0x0070, 0x0072, 0x0072, 0x0073, 0x0074, 0x007A, 0x0067, 0x043D, 0x004C, 0x0070, 0x0055, 0x028A,
+ 0x0062, 0x0064, 0x0066, 0x0067, 0x006B, 0x006C, 0x006D, 0x006E, 0x0070, 0x0072, 0x0073, 0x0283, 0x0076, 0x0078, 0x007A, 0x0061,
+ 0x0251, 0x0064, 0x0065, 0x0065, 0x0065, 0x0065, 0x0069, 0x0283, 0x0252, 0x0063, 0x0255, 0x00F0, 0x025C, 0x0066, 0x025F, 0x0261,
+ 0x0265, 0x0268, 0x0269, 0x026A, 0x1D7B, 0x029D, 0x026D, 0x1D85, 0x029F, 0x0271, 0x0270, 0x0272, 0x0273, 0x0274, 0x0275, 0x0278,
+ 0x0282, 0x0283, 0x01AB, 0x0289, 0x028A, 0x1D1C, 0x028B, 0x028C, 0x007A, 0x0290, 0x0291, 0x0292, 0x03B8, 0x0041, 0x0061, 0x0042,
+ 0x0062, 0x0042, 0x0062, 0x0042, 0x0062, 0x0043, 0x0063, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044, 0x0064, 0x0044,
+ 0x0064, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0228, 0x0229, 0x0046, 0x0066, 0x0047, 0x0067, 0x0048,
+ 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0048, 0x0068, 0x0049, 0x0069, 0x00CF, 0x00EF, 0x004B, 0x006B, 0x004B,
+ 0x006B, 0x004B, 0x006B, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004C, 0x006C, 0x004D, 0x006D, 0x004D, 0x006D, 0x004D,
+ 0x006D, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x004E, 0x006E, 0x00D5, 0x00F5, 0x00D5, 0x00F5, 0x014C, 0x014D, 0x014C,
+ 0x014D, 0x0050, 0x0070, 0x0050, 0x0070, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0052, 0x0072, 0x0053, 0x0073, 0x0053,
+ 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0053, 0x0073, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0054, 0x0074, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0168, 0x0169, 0x016A, 0x016B, 0x0056, 0x0076, 0x0056, 0x0076, 0x0057, 0x0077, 0x0057,
+ 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0057, 0x0077, 0x0058, 0x0078, 0x0058, 0x0078, 0x0059, 0x0079, 0x005A, 0x007A, 0x005A,
+ 0x007A, 0x005A, 0x007A, 0x0068, 0x0074, 0x0077, 0x0079, 0x0061, 0x017F, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
+ 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041, 0x0061, 0x0041,
+ 0x0061, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045, 0x0065, 0x0045,
+ 0x0065, 0x0049, 0x0069, 0x0049, 0x0069, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F,
+ 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x004F, 0x006F, 0x0055, 0x0075, 0x0055,
+ 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0055, 0x0075, 0x0059, 0x0079, 0x0059, 0x0079, 0x0059,
+ 0x0079, 0x0059, 0x0079, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x0391, 0x0391, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x03B5, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x0395, 0x03B7,
+ 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03B9,
+ 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x0399, 0x03BF,
+ 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x03BF, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x039F, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C5,
+ 0x03C5, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5, 0x03A5, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9,
+ 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B5, 0x03B5, 0x03B7, 0x03B7, 0x03B9, 0x03B9, 0x03BF,
+ 0x03BF, 0x03C5, 0x03C5, 0x03C9, 0x03C9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x0391, 0x0391, 0x0391, 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0397, 0x0397, 0x0397,
+ 0x0397, 0x0397, 0x0397, 0x0397, 0x0397, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03A9, 0x03A9, 0x03A9,
+ 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03A9, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x03B1, 0x0391, 0x0391, 0x0391, 0x0391,
+ 0x0391, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x03B7, 0x0395, 0x0395, 0x0397, 0x0397, 0x0397, 0x03B9, 0x03B9, 0x03B9, 0x03B9, 0x03B9,
+ 0x03B9, 0x0399, 0x0399, 0x0399, 0x0399, 0x03C5, 0x03C5, 0x03C5, 0x03C5, 0x03C1, 0x03C1, 0x03C5, 0x03C5, 0x03A5, 0x03A5, 0x03A5,
+ 0x03A5, 0x03A1, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x03C9, 0x039F, 0x039F, 0x03A9, 0x03A9, 0x03A9, 0x00B4, 0x0314, 0x0020, 0x0020,
+ 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x2010, 0x0333, 0x002E, 0x0020, 0x0020, 0x0030, 0x0069,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x006E, 0x0030, 0x0031, 0x0032, 0x0033,
+ 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x002B, 0x2212, 0x003D, 0x0028, 0x0029, 0x0061, 0x0065, 0x006F, 0x0078, 0x0259,
+ 0x0043, 0x0190, 0x0067, 0x0048, 0x0048, 0x0048, 0x0068, 0x0068, 0x0049, 0x0049, 0x004C, 0x006C, 0x004E, 0x0050, 0x0051, 0x0052,
+ 0x0052, 0x0052, 0x0052, 0x0052, 0x0056, 0x005A, 0x03A9, 0x01B1, 0x005A, 0x004B, 0x00C5, 0x0042, 0x0043, 0x0065, 0x0065, 0x0045,
+ 0x0046, 0x004D, 0x006F, 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x0069, 0x03C0, 0x03B3, 0x0393, 0x03A0, 0x2211, 0x0044, 0x0064, 0x0065,
+ 0x0069, 0x006A, 0x0049, 0x0056, 0x0058, 0x004C, 0x0043, 0x0044, 0x004D, 0x0069, 0x0076, 0x0078, 0x006C, 0x0063, 0x0064, 0x006D,
+ 0x2203, 0x2208, 0x220B, 0x3008, 0x3009, 0x0062, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0030, 0x0031, 0x0032,
+ 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039,
+ 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x004C, 0x006C, 0x004C, 0x0050, 0x0052, 0x0061, 0x0074,
+ 0x0048, 0x0068, 0x004B, 0x006B, 0x005A, 0x007A, 0x0076, 0x0057, 0x0058, 0x0076, 0x006A, 0x0056, 0x2D61, 0x6BCD, 0x6C11, 0x864E,
+ 0x897F, 0x89D2, 0x957F, 0x9752, 0x98DF, 0x9AA8, 0x9B3C, 0x9EA6, 0x9EC4, 0x9F9F, 0x4E00, 0x4E28, 0x4E36, 0x4E3F, 0x4E59, 0x4E85,
+ 0x4E8C, 0x4EA0, 0x4EBA, 0x513F, 0x5165, 0x516B, 0x5182, 0x5196, 0x51AB, 0x51E0, 0x51F5, 0x5200, 0x529B, 0x52F9, 0x5315, 0x531A,
+ 0x5338, 0x5341, 0x535C, 0x5369, 0x5382, 0x53B6, 0x53C8, 0x53E3, 0x56D7, 0x571F, 0x58EB, 0x5902, 0x590A, 0x5915, 0x5927, 0x5973,
+ 0x5B50, 0x5B80, 0x5BF8, 0x5C0F, 0x5C22, 0x5C38, 0x5C6E, 0x5C71, 0x5DDB, 0x5DE5, 0x5DF1, 0x5DFE, 0x5E72, 0x5E7A, 0x5E7F, 0x5EF4,
+ 0x5EFE, 0x5F0B, 0x5F13, 0x5F50, 0x5F61, 0x5F73, 0x5FC3, 0x6208, 0x6236, 0x624B, 0x652F, 0x6534, 0x6587, 0x6597, 0x65A4, 0x65B9,
+ 0x65E0, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79, 0x6BB3, 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C14, 0x6C34, 0x706B,
+ 0x722A, 0x7236, 0x723B, 0x723F, 0x7247, 0x7259, 0x725B, 0x72AC, 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7530,
+ 0x758B, 0x7592, 0x7676, 0x767D, 0x76AE, 0x76BF, 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79B8, 0x79BE, 0x7A74, 0x7ACB, 0x7AF9,
+ 0x7C73, 0x7CF8, 0x7F36, 0x7F51, 0x7F8A, 0x7FBD, 0x8001, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089, 0x81E3, 0x81EA, 0x81F3, 0x81FC,
+ 0x820C, 0x821B, 0x821F, 0x826E, 0x8272, 0x8278, 0x864D, 0x866B, 0x8840, 0x884C, 0x8863, 0x897E, 0x898B, 0x89D2, 0x8A00, 0x8C37,
+ 0x8C46, 0x8C55, 0x8C78, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B, 0x8FB0, 0x8FB5, 0x9091, 0x9149, 0x91C6, 0x91CC,
+ 0x91D1, 0x9577, 0x9580, 0x961C, 0x96B6, 0x96B9, 0x96E8, 0x9751, 0x975E, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,
+ 0x98DB, 0x98DF, 0x9996, 0x9999, 0x99AC, 0x9AA8, 0x9AD8, 0x9ADF, 0x9B25, 0x9B2F, 0x9B32, 0x9B3C, 0x9B5A, 0x9CE5, 0x9E75, 0x9E7F,
+ 0x9EA5, 0x9EBB, 0x9EC3, 0x9ECD, 0x9ED1, 0x9EF9, 0x9EFD, 0x9F0E, 0x9F13, 0x9F20, 0x9F3B, 0x9F4A, 0x9F52, 0x9F8D, 0x9F9C, 0x9FA0,
+ 0x0020, 0x3012, 0x5341, 0x5344, 0x5345, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1,
+ 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F,
+ 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D,
+ 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3,
+ 0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E,
+ 0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192,
+ 0x1194, 0x119E, 0x11A1, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E0A, 0x4E2D, 0x4E0B, 0x7532, 0x4E59, 0x4E19, 0x4E01, 0x5929, 0x5730,
+ 0x4EBA, 0x554F, 0x5E7C, 0x6587, 0x7B8F, 0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F,
+ 0x1110, 0x1111, 0x1112, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x5341, 0x6708, 0x706B, 0x6C34,
+ 0x6728, 0x91D1, 0x571F, 0x65E5, 0x682A, 0x6709, 0x793E, 0x540D, 0x7279, 0x8CA1, 0x795D, 0x52B4, 0x79D8, 0x7537, 0x5973, 0x9069,
+ 0x512A, 0x5370, 0x6CE8, 0x9805, 0x4F11, 0x5199, 0x6B63, 0x4E0A, 0x4E2D, 0x4E0B, 0x5DE6, 0x53F3, 0x533B, 0x5B97, 0x5B66, 0x76E3,
+ 0x4F01, 0x8CC7, 0x5354, 0x591C, 0x30A2, 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7,
+ 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1, 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5,
+ 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0, 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x4E22, 0x5E76, 0x5E7A, 0x5E72, 0x4E71, 0x4E98, 0x4E9A, 0x4F2B, 0x5E03, 0x5360, 0x6765, 0x4FA3, 0x4FE3,
+ 0x7CFB, 0x4FA0, 0x4F25, 0x4FE9, 0x4ED3, 0x4E2A, 0x4EEC, 0x4F26, 0x4F1F, 0x4FA7, 0x4FA6, 0x4F2A, 0x6770, 0x4F27, 0x4F1E, 0x5907,
+ 0x5BB6, 0x4F63, 0x506C, 0x4F20, 0x4F1B, 0x503A, 0x4F24, 0x503E, 0x507B, 0x4EC5, 0x4F65, 0x4FA8, 0x4EC6, 0x4FA5, 0x507E, 0x96C7,
+ 0x4EF7, 0x4EEA, 0x4FAC, 0x4EBF, 0x4FED, 0x50A7, 0x4FE6, 0x4FAA, 0x5C3D, 0x507F, 0x4F18, 0x50A8, 0x4FEA, 0x50A9, 0x50A5, 0x4FE8,
+ 0x51F6, 0x5151, 0x513F, 0x5156, 0x5185, 0x4E24, 0x518C, 0x80C4, 0x5199, 0x5E42, 0x51BB, 0x51DB, 0x51EF, 0x522B, 0x5220, 0x522D,
+ 0x5219, 0x5239, 0x521A, 0x5265, 0x5250, 0x5240, 0x521B, 0x522C, 0x5212, 0x5267, 0x5218, 0x523D, 0x523F, 0x5251, 0x5242, 0x52B2,
+ 0x52A8, 0x52D6, 0x52A1, 0x80DC, 0x52B3, 0x52BF, 0x52A2, 0x52CB, 0x52B1, 0x529D, 0x5300, 0x5326, 0x6C47, 0x532E, 0x533A, 0x534F,
+ 0x6064, 0x5374, 0x538D, 0x538C, 0x5389, 0x53A3, 0x53C2, 0x4E1B, 0x54A4, 0x5434, 0x5450, 0x5415, 0x5458, 0x55B1, 0x5457, 0x5FF5,
+ 0x95EE, 0x54D1, 0x542F, 0x5524, 0x4E27, 0x4E54, 0x5355, 0x54DF, 0x545B, 0x556C, 0x551D, 0x5417, 0x545C, 0x5522, 0x54D4, 0x53F9,
+ 0x55BD, 0x5455, 0x5567, 0x5C1D, 0x551B, 0x54D7, 0x5520, 0x5578, 0x53FD, 0x54D3, 0x5452, 0x5574, 0x6076, 0x5618, 0x549D, 0x54D2,
+ 0x54DD, 0x54D5, 0x55F3, 0x54D9, 0x55B7, 0x5428, 0x549B, 0x5413, 0x54DC, 0x5C1D, 0x565C, 0x556E, 0x5456, 0x5499, 0x4EB8, 0x55BE,
+ 0x4E25, 0x5624, 0x556D, 0x55EB, 0x56A3, 0x5181, 0x5453, 0x5570, 0x5631, 0x56F1, 0x56F5, 0x56FD, 0x56F4, 0x56ED, 0x5706, 0x56FE,
+ 0x56E2, 0x57AD, 0x6267, 0x575A, 0x57A9, 0x57DA, 0x5C27, 0x62A5, 0x573A, 0x5757, 0x8314, 0x57B2, 0x57D8, 0x6D82, 0x51A2, 0x575E,
+ 0x57D9, 0x5C18, 0x5811, 0x57AB, 0x5760, 0x5815, 0x575F, 0x57A6, 0x575B, 0x538B, 0x5792, 0x5739, 0x5786, 0x574F, 0x5785, 0x575C,
+ 0x575D, 0x58EE, 0x58F6, 0x58F8, 0x5BFF, 0x591F, 0x68A6, 0x4F19, 0x5939, 0x5942, 0x5965, 0x5941, 0x593A, 0x594B, 0x59F9, 0x5986,
+ 0x59D7, 0x5978, 0x5A31, 0x5A04, 0x5987, 0x5A05, 0x5A32, 0x59AB, 0x5AAA, 0x5988, 0x59AA, 0x59A9, 0x5A34, 0x5A73, 0x5A06, 0x5A75,
+ 0x5A07, 0x5AF1, 0x5AD2, 0x5B37, 0x5AD4, 0x5A74, 0x5A76, 0x5A08, 0x5B59, 0x5B66, 0x5B6A, 0x5BAB, 0x5BDD, 0x5B9E, 0x5B81, 0x5BA1,
+ 0x5199, 0x5BBD, 0x5BA0, 0x5B9D, 0x5C06, 0x4E13, 0x5BFB, 0x5BF9, 0x5BFC, 0x5C34, 0x5C4A, 0x5C38, 0x5C49, 0x5C61, 0x5C42, 0x5C5F,
+ 0x5C66, 0x5C5E, 0x5188, 0x5C98, 0x5C9B, 0x5CE1, 0x5D03, 0x5C97, 0x4ED1, 0x5CE5, 0x5C9A, 0x5D5D, 0x5D2D, 0x5C96, 0x5D5A, 0x5D02,
+ 0x5CE4, 0x5CE3, 0x5CC4, 0x5D04, 0x5C99, 0x5D58, 0x5CAD, 0x5C7F, 0x5CB3, 0x5CBF, 0x5CE6, 0x5DC5, 0x5DEF, 0x5E05, 0x5E08, 0x5E10,
+ 0x5E26, 0x5E27, 0x5E0F, 0x5E3C, 0x5E3B, 0x5E1C, 0x5E01, 0x5E2E, 0x5E31, 0x5E72, 0x51E0, 0x5E93, 0x5395, 0x53A2, 0x53A6, 0x53A8,
+ 0x53AE, 0x5E99, 0x5382, 0x5E91, 0x5E9F, 0x5E7F, 0x5EEA, 0x5E90, 0x5385, 0x5F11, 0x5F2A, 0x5F20, 0x5F3A, 0x5F39, 0x5F25, 0x5F2F,
+ 0x5F66, 0x540E, 0x5F84, 0x4ECE, 0x5F95, 0x590D, 0x5F81, 0x5F7B, 0x6052, 0x803B, 0x60A6, 0x6005, 0x95F7, 0x6076, 0x607C, 0x607D,
+ 0x607B, 0x7231, 0x60EC, 0x60AB, 0x6006, 0x607A, 0x5FFE, 0x6001, 0x6120, 0x60E8, 0x60ED, 0x6078, 0x60EF, 0x6004, 0x6002, 0x8651,
+ 0x60AD, 0x5E86, 0x5FE7, 0x60EB, 0x601C, 0x51ED, 0x6126, 0x616D, 0x60EE, 0x6124, 0x60AF, 0x6003, 0x5BAA, 0x5FC6, 0x6073, 0x5E94,
+ 0x603F, 0x61D4, 0x603C, 0x61D1, 0x6079, 0x60E9, 0x61D2, 0x6000, 0x60AC, 0x5FCF, 0x60E7, 0x6151, 0x604B, 0x6206, 0x620B, 0x6217,
+ 0x622C, 0x6218, 0x620F, 0x6237, 0x629B, 0x631F, 0x820D, 0x626A, 0x5377, 0x626B, 0x62A1, 0x6323, 0x6302, 0x91C7, 0x62E3, 0x626C,
+ 0x6362, 0x6325, 0x635F, 0x6447, 0x6363, 0x62A2, 0x63B4, 0x63BC, 0x6402, 0x631A, 0x62A0, 0x629F, 0x63BA, 0x635E, 0x6491, 0x6320,
+ 0x6322, 0x63B8, 0x62E8, 0x629A, 0x6251, 0x63FF, 0x631E, 0x631D, 0x6361, 0x62E5, 0x63B3, 0x62E9, 0x51FB, 0x6321, 0x62C5, 0x636E,
+ 0x6324, 0x62DF, 0x6448, 0x62E7, 0x6401, 0x63B7, 0x6269, 0x64B7, 0x6446, 0x64DE, 0x64B8, 0x6270, 0x6445, 0x64B5, 0x62E2, 0x62E6,
+ 0x6484, 0x6400, 0x64BA, 0x643A, 0x6444, 0x6512, 0x631B, 0x644A, 0x6405, 0x63FD, 0x668B, 0x8D25, 0x53D9, 0x654C, 0x6570, 0x655B,
+ 0x6BD9, 0x6593, 0x65A9, 0x65AD, 0x4E8E, 0x5347, 0x65F6, 0x664B, 0x663C, 0x6655, 0x6656, 0x65F8, 0x7545, 0x6682, 0x6635, 0x6654,
+ 0x5386, 0x6619, 0x6653, 0x66A7, 0x65F7, 0x663D, 0x6652, 0x4E66, 0x4F1A, 0x80E7, 0x4E1C, 0x6805, 0x6746, 0x6800, 0x67A7, 0x6761,
+ 0x67AD, 0x5F03, 0x67A8, 0x67A3, 0x680B, 0x6808, 0x6816, 0x6860, 0x6768, 0x67AB, 0x6862, 0x4E1A, 0x6781, 0x6769, 0x8363, 0x6864,
+ 0x6784, 0x67AA, 0x6760, 0x68BF, 0x6920, 0x6901, 0x6868, 0x6869, 0x4E50, 0x679E, 0x697C, 0x6807, 0x67A2, 0x6837, 0x6734, 0x6811,
+ 0x6866, 0x6861, 0x6865, 0x673A, 0x692D, 0x6A2A, 0x6AA9, 0x69DC, 0x67FD, 0x6863, 0x6867, 0x69DA, 0x68C0, 0x6A2F, 0x68BC, 0x53F0,
+ 0x69DF, 0x67E0, 0x69DB, 0x82D8, 0x67DC, 0x6A79, 0x6988, 0x6809, 0x691F, 0x6A7C, 0x680E, 0x6A71, 0x69E0, 0x680C, 0x67A5, 0x6A65,
+ 0x6987, 0x680A, 0x6989, 0x68C2, 0x6A31, 0x680F, 0x6743, 0x6924, 0x683E, 0x6984, 0x94A6, 0x6B27, 0x6B24, 0x6B22, 0x5C81, 0x5386,
+ 0x5F52, 0x6B81, 0x6B8B, 0x6B92, 0x6B87, 0x6B9A, 0x6B93, 0x6BA1, 0x6B7C, 0x6740, 0x58F3, 0x6BC1, 0x6BB4, 0x6BF5, 0x6BE1, 0x6C07,
+ 0x6C14, 0x6C22, 0x6C29, 0x6C32, 0x51FC, 0x51B3, 0x51B1, 0x6CA1, 0x51B5, 0x6CC4, 0x6C79, 0x6D43, 0x6CFE, 0x51C9, 0x51C4, 0x6CEA,
+ 0x6E0C, 0x51C0, 0x6CA6, 0x6E0A, 0x6D9E, 0x6D45, 0x6DA3, 0x51CF, 0x6CA8, 0x6DA1, 0x6D4B, 0x6D51, 0x51D1, 0x6D48, 0x6D8C, 0x6D07,
+ 0x6C64, 0x6CA9, 0x51C6, 0x6C9F, 0x6E29, 0x6DA2, 0x6E7F, 0x6CA7, 0x706D, 0x6DA4, 0x8365, 0x6CAA, 0x6EDE, 0x6E17, 0x6D52, 0x6D50,
+ 0x6EDA, 0x6EE1, 0x6E14, 0x6E87, 0x6CA4, 0x6C49, 0x6D9F, 0x6E0D, 0x6DA8, 0x6E10, 0x6D46, 0x988D, 0x6CFC, 0x6D01, 0x6F5C, 0x6DA6,
+ 0x6D54, 0x6E83, 0x6DA0, 0x6DA9, 0x6D47, 0x6D9D, 0x6C84, 0x6DA7, 0x6E11, 0x6CFD, 0x6EEA, 0x6CF6, 0x6D4D, 0x6D4A, 0x6D53, 0x6E7F,
+ 0x6CDE, 0x6D4E, 0x6D9B, 0x6EE5, 0x6F4D, 0x6EE8, 0x6E85, 0x6CFA, 0x6EE4, 0x6EE2, 0x6E0E, 0x6CFB, 0x6D4F, 0x6FD2, 0x6CF8, 0x6CA5,
+ 0x6F47, 0x6F46, 0x6F74, 0x6CF7, 0x6FD1, 0x6F4B, 0x6F9C, 0x6CA3, 0x6EE0, 0x6D12, 0x6EE9, 0x704F, 0x6E7E, 0x6EE6, 0x6EDF, 0x707E,
+ 0x4E3A, 0x4E4C, 0x70C3, 0x65E0, 0x70BC, 0x709C, 0x70DF, 0x8315, 0x7115, 0x70E6, 0x7080, 0x8367, 0x709D, 0x70ED, 0x70BD, 0x70E8,
+ 0x706F, 0x7096, 0x70E7, 0x70EB, 0x7116, 0x8425, 0x707F, 0x70DB, 0x70E9, 0x70EC, 0x7118, 0x70C1, 0x7089, 0x70C2, 0x4E89, 0x4E3A,
+ 0x7237, 0x5C14, 0x5899, 0x724D, 0x7275, 0x8366, 0x7266, 0x728A, 0x727A, 0x72B6, 0x72ED, 0x72C8, 0x72F0, 0x72B9, 0x72F2, 0x72B8,
+ 0x72F1, 0x72EE, 0x5956, 0x72EC, 0x72EF, 0x7303, 0x72DE, 0x83B7, 0x730E, 0x72B7, 0x517D, 0x736D, 0x732E, 0x7315, 0x7321, 0x73B0,
+ 0x73D0, 0x73F2, 0x73AE, 0x739A, 0x7410, 0x7476, 0x83B9, 0x739B, 0x7405, 0x73B1, 0x740F, 0x740E, 0x7391, 0x7477, 0x73F0, 0x73AF,
+ 0x7399, 0x73BA, 0x743C, 0x73D1, 0x748E, 0x74D2, 0x74EF, 0x74EE, 0x4EA7, 0x4EA7, 0x4EA9, 0x6BD5, 0x753B, 0x7572, 0x5F02, 0x5F53,
+ 0x7574, 0x53E0, 0x75C9, 0x9178, 0x75F9, 0x75D6, 0x75AF, 0x75A1, 0x75EA, 0x7617, 0x75AE, 0x759F, 0x75AD, 0x7618, 0x7597, 0x75E8,
+ 0x75EB, 0x7605, 0x75A0, 0x762A, 0x75D2, 0x7596, 0x75AC, 0x765E, 0x7663, 0x763F, 0x763E, 0x75C8, 0x762B, 0x766B, 0x53D1, 0x7691,
+ 0x75B1, 0x76B2, 0x76B1, 0x676F, 0x76D7, 0x76CF, 0x5C3D, 0x76D1, 0x76D8, 0x5362, 0x8361, 0x7726, 0x4F17, 0x56F0, 0x7741, 0x7750,
+ 0x772F, 0x7792, 0x4E86, 0x7786, 0x7751, 0x772C, 0x77A9, 0x77EB, 0x7845, 0x70AE, 0x7841, 0x7856, 0x7817, 0x781A, 0x7855, 0x7800,
+ 0x786E, 0x7801, 0x7859, 0x7816, 0x789C, 0x789B, 0x77F6, 0x7857, 0x785A, 0x7840, 0x788D, 0x77FF, 0x783A, 0x783E, 0x77FE, 0x783B,
+ 0x7984, 0x7978, 0x796F, 0x794E, 0x5FA1, 0x7985, 0x793C, 0x7977, 0x79C3, 0x7C7C, 0x7A0E, 0x79C6, 0x68F1, 0x79CD, 0x79F0, 0x7A23,
+ 0x79EF, 0x9896, 0x79FE, 0x7A51, 0x79FD, 0x7A33, 0x7A9D, 0x6D3C, 0x7A77, 0x7A91, 0x7A8E, 0x7AAD, 0x7AA5, 0x7A9C, 0x7A8D, 0x7AA6,
+ 0x7A83, 0x7ADE, 0x7B14, 0x7B0B, 0x7B15, 0x7B3A, 0x7B5D, 0x8282, 0x8303, 0x7B51, 0x7BA7, 0x7B7C, 0x7B03, 0x7B5B, 0x7B5A, 0x7BA6,
+ 0x7BD3, 0x7BAA, 0x7B80, 0x7BD1, 0x7BAB, 0x6A90, 0x7B5C, 0x7B7E, 0x5E18, 0x7BEE, 0x7B79, 0x7B93, 0x7BEF, 0x7BA8, 0x7C41, 0x7B3C,
+ 0x7B7E, 0x7B3E, 0x7BF1, 0x7BA9, 0x5401, 0x5986, 0x7CA4, 0x7CC1, 0x7CAA, 0x7CAE, 0x7CF5, 0x7C9D, 0x7C74, 0x7C9C, 0x7EA0, 0x7EAA,
+ 0x7EA3, 0x7EA6, 0x7EA2, 0x7EA1, 0x7EA5, 0x7EA8, 0x7EAB, 0x7EB9, 0x7EB3, 0x7EBD, 0x7EBE, 0x7EAF, 0x7EB0, 0x7EB1, 0x7EB8, 0x7EA7,
+ 0x7EB7, 0x7EAD, 0x7EB4, 0x7EBA, 0x624E, 0x624E, 0x7EC6, 0x7EC2, 0x7EC1, 0x7EC5, 0x7EBB, 0x7ECD, 0x7EC0, 0x7ECB, 0x7ED0, 0x7ECC,
+ 0x7EC8, 0x5F26, 0x7EC4, 0x7ECA, 0x7ED7, 0x7ED3, 0x7EDD, 0x7EE6, 0x7ED4, 0x7EDE, 0x7EDC, 0x7EDA, 0x7ED9, 0x7ED2, 0x7ED6, 0x7EDF,
+ 0x4E1D, 0x7EDB, 0x7EE2, 0x7ED1, 0x7EE1, 0x7EE0, 0x7EE8, 0x7EE5, 0x7ECF, 0x7EFC, 0x7F0D, 0x7EFF, 0x7EF8, 0x7EFB, 0x7EF6, 0x7EF4,
+ 0x7EFE, 0x7EB2, 0x7F51, 0x7F00, 0x7EB6, 0x7EFA, 0x7EEE, 0x7EFD, 0x7EF0, 0x7EEB, 0x7EF5, 0x7EF2, 0x7F01, 0x7D27, 0x7EEF, 0x7EEA,
+ 0x7F03, 0x7F04, 0x7F02, 0x7EBF, 0x7F09, 0x7F0E, 0x7F14, 0x7F17, 0x7F18, 0x7F0C, 0x7F16, 0x7F13, 0x7F05, 0x7EAC, 0x7F11, 0x7F08,
+ 0x7EC3, 0x7F0F, 0x7F07, 0x81F4, 0x8426, 0x7F19, 0x7F22, 0x7F12, 0x7EC9, 0x7F23, 0x7F1E, 0x7F1A, 0x7F1C, 0x7F1F, 0x7F1B, 0x53BF,
+ 0x7F1D, 0x7F29, 0x7EB5, 0x7F27, 0x7F26, 0x7D77, 0x7F15, 0x7F25, 0x603B, 0x7EE9, 0x7EF7, 0x7F2B, 0x7F2A, 0x7F2F, 0x7EC7, 0x7F2E,
+ 0x7F2D, 0x7ED5, 0x7EE3, 0x7F0B, 0x7EF3, 0x7ED8, 0x7CFB, 0x8327, 0x7F33, 0x7F32, 0x7F34, 0x7ECE, 0x7EE7, 0x7F24, 0x7F31, 0x7F2C,
+ 0x7EA9, 0x7EED, 0x7F20, 0x7F28, 0x7EA4, 0x7F35, 0x7F06, 0x94B5, 0x7F42, 0x7F5A, 0x9A82, 0x7F62, 0x7F57, 0x7F74, 0x7F81, 0x8288,
+ 0x7F9F, 0x7FA1, 0x4E49, 0x81BB, 0x4E60, 0x7FC6, 0x7FDA, 0x7FD8, 0x7FD9, 0x8027, 0x5723, 0x95FB, 0x8054, 0x806A, 0x58F0, 0x8038,
+ 0x8069, 0x8042, 0x804C, 0x804D, 0x542C, 0x804B, 0x8083, 0x80C1, 0x8109, 0x80EB, 0x8131, 0x80C0, 0x80BE, 0x80E8, 0x8136, 0x8111,
+ 0x80BF, 0x811A, 0x80A0, 0x817D, 0x8158, 0x80A4, 0x80F6, 0x817B, 0x80C6, 0x810D, 0x8113, 0x8138, 0x8110, 0x8191, 0x814A, 0x80EA,
+ 0x810F, 0x8114, 0x81DC, 0x5367, 0x4E34, 0x53F0, 0x4E0E, 0x5174, 0x4E3E, 0x65E7, 0x8231, 0x8223, 0x8230, 0x823B, 0x8270, 0x8273,
+ 0x82C4, 0x520D, 0x82CE, 0x5179, 0x8346, 0x8C46, 0x5E84, 0x830E, 0x835A, 0x82CB, 0x534E, 0x70DF, 0x82CC, 0x83B1, 0x4E07, 0x83B4,
+ 0x53F6, 0x836D, 0x7740, 0x82C7, 0x8364, 0x641C, 0x83B3, 0x8385, 0x82CD, 0x836A, 0x76D6, 0x83B2, 0x82C1, 0x83BC, 0x835C, 0x848C,
+ 0x848B, 0x8471, 0x8311, 0x836B, 0x8368, 0x8487, 0x835E, 0x836C, 0x83B8, 0x835B, 0x8489, 0x829C, 0x8427, 0x84E3, 0x835F, 0x84DF,
+ 0x8297, 0x59DC, 0x8537, 0x83B6, 0x8350, 0x8428, 0x8360, 0x501F, 0x84DD, 0x8369, 0x827A, 0x836F, 0x85AE, 0x82C8, 0x853C, 0x853A,
+ 0x841A, 0x8572, 0x82A6, 0x82CF, 0x8574, 0x82F9, 0x8616, 0x85D3, 0x8539, 0x830F, 0x5170, 0x84E0, 0x841D, 0x5904, 0x865A, 0x864F,
+ 0x53F7, 0x4E8F, 0x866C, 0x86F1, 0x8715, 0x86AC, 0x8680, 0x732C, 0x867E, 0x8671, 0x8717, 0x86F3, 0x8682, 0x8424, 0x877C, 0x8780,
+ 0x86F0, 0x8748, 0x87A8, 0x866E, 0x8749, 0x86F2, 0x866B, 0x86CF, 0x8681, 0x8683, 0x8747, 0x867F, 0x874E, 0x86F4, 0x877E, 0x869D,
+ 0x8721, 0x86CE, 0x87CF, 0x86CA, 0x8695, 0x86EE, 0x4F17, 0x672F, 0x536B, 0x51B2, 0x886E, 0x8885, 0x8865, 0x88C5, 0x91CC, 0x5236,
+ 0x590D, 0x88C8, 0x8886, 0x88E4, 0x88E2, 0x7F21, 0x891B, 0x4EB5, 0x88E5, 0x8884, 0x88E3, 0x88C6, 0x8934, 0x889C, 0x886C, 0x88AD,
+ 0x8955, 0x89C1, 0x89C4, 0x89C5, 0x89C6, 0x89C7, 0x89CB, 0x89CD, 0x89CE, 0x4EB2, 0x89CA, 0x89CF, 0x89D0, 0x89D1, 0x89C9, 0x89C8,
+ 0x89CC, 0x89C2, 0x89DE, 0x89EF, 0x89E6, 0x8BA2, 0x8BA3, 0x8BA1, 0x8BAF, 0x8BA7, 0x8BA8, 0x8BA6, 0x8BAD, 0x8BAA, 0x8BAB, 0x8BAC,
+ 0x8BB0, 0x8BB9, 0x8BB6, 0x8BBC, 0x8BC0, 0x8BB7, 0x8BBF, 0x8BBE, 0x8BB8, 0x8BC9, 0x8BC3, 0x8BCA, 0x8BC1, 0x8BC2, 0x8BCB, 0x8BB5,
+ 0x8BC8, 0x8BD2, 0x8BCF, 0x8BC4, 0x8BCE, 0x8BC5, 0x8BCD, 0x548F, 0x8BE9, 0x8BE2, 0x8BE3, 0x8BD5, 0x8BD7, 0x8BE7, 0x8BDF, 0x8BE1,
+ 0x8BE0, 0x8BD8, 0x8BDD, 0x8BE5, 0x8BE6, 0x8BDC, 0x8BD9, 0x8BD6, 0x8BD4, 0x8BDB, 0x8BD3, 0x5938, 0x5FD7, 0x8BA4, 0x8BF3, 0x8BF6,
+ 0x8BDE, 0x8BF1, 0x8BEE, 0x8BED, 0x8BDA, 0x8BEB, 0x8BEC, 0x8BEF, 0x8BF0, 0x8BF5, 0x8BF2, 0x8BF4, 0x8C01, 0x8BFE, 0x8C07, 0x8BFD,
+ 0x8C0A, 0x8C03, 0x8C04, 0x8C06, 0x8C08, 0x8BFF, 0x8BF7, 0x8BE4, 0x8BF9, 0x8BFC, 0x8C05, 0x8BBA, 0x8C02, 0x8C00, 0x8C0D, 0x8C1E,
+ 0x8C1D, 0x8C25, 0x8BE8, 0x8C14, 0x8C1B, 0x8C10, 0x8C0F, 0x8C15, 0x8C18, 0x8BB3, 0x8C19, 0x8C0C, 0x8BBD, 0x8BF8, 0x8C1A, 0x8C16,
+ 0x8BFA, 0x8C0B, 0x8C12, 0x8C13, 0x8A8A, 0x8BCC, 0x8C0E, 0x8C1C, 0x8C27, 0x8C11, 0x8C21, 0x8C24, 0x8C26, 0x8BB2, 0x8C22, 0x8C23,
+ 0x8C1F, 0x8C2A, 0x8C2C, 0x8BB4, 0x8C28, 0x8C29, 0x8BC1, 0x8C32, 0x8BA5, 0x8C2E, 0x8BC6, 0x8C2F, 0x8C2D, 0x8C31, 0x8C35, 0x8BD1,
+ 0x8BAE, 0x8C34, 0x62A4, 0x8BEA, 0x8A89, 0x8C2B, 0x8BFB, 0x53D8, 0x8A5F, 0x96E0, 0x8C17, 0x8BA9, 0x8C30, 0x8C36, 0x8D5E, 0x8C20,
+ 0x8C33, 0x5C82, 0x7AD6, 0x4E30, 0x732A, 0x8C6E, 0x732B, 0x8D1D, 0x8D1E, 0x8D1F, 0x8D22, 0x8D21, 0x8D2B, 0x8D27, 0x8D29, 0x8D2A,
+ 0x8D2F, 0x8D23, 0x8D2E, 0x8D33, 0x8D40, 0x8D30, 0x8D35, 0x8D2C, 0x4E70, 0x8D37, 0x8D36, 0x8D39, 0x8D34, 0x8D3B, 0x8D38, 0x8D3A,
+ 0x8D32, 0x8D42, 0x8D41, 0x8D3F, 0x8D45, 0x8D44, 0x8D3E, 0x8D3C, 0x8D48, 0x8D4A, 0x5BBE, 0x8D47, 0x8D52, 0x8D49, 0x8D50, 0x8D4F,
+ 0x8D54, 0x8D53, 0x8D24, 0x5356, 0x8D31, 0x8D4B, 0x8D55, 0x8D28, 0x8D26, 0x8D4C, 0x8D56, 0x8D57, 0x8D5A, 0x8D59, 0x8D2D, 0x8D5B,
+ 0x8D5C, 0x8D3D, 0x8D58, 0x8D5F, 0x8D60, 0x8D5E, 0x8D61, 0x8D62, 0x8D46, 0x8D43, 0x8D51, 0x8D4E, 0x8D5D, 0x8D63, 0x8D6A, 0x8D76,
+ 0x8D75, 0x8D8B, 0x8DB1, 0x8FF9, 0x8DF5, 0x8E0A, 0x8DC4, 0x8DF8, 0x8DD6, 0x8E52, 0x8DF7, 0x8DF6, 0x8DB8, 0x8E0C, 0x8DFB, 0x8DC3,
+ 0x8E2F, 0x8DDE, 0x8E2C, 0x8E70, 0x8DF9, 0x8E51, 0x8E7F, 0x8E9C, 0x8E8F, 0x8EAF, 0x8F66, 0x8F67, 0x8F68, 0x519B, 0x8F69, 0x8F6B,
+ 0x8F6D, 0x8F6F, 0x8F78, 0x8F71, 0x8F74, 0x8F75, 0x8F7A, 0x8F72, 0x8F76, 0x8F7C, 0x8F83, 0x8F82, 0x8F81, 0x8F80, 0x8F7D, 0x8F7E,
+ 0x8F84, 0x8F85, 0x8F7B, 0x8F86, 0x8F8E, 0x8F89, 0x8F8B, 0x8F8D, 0x8F8A, 0x8F87, 0x8F88, 0x8F6E, 0x8F91, 0x8F8F, 0x8F93, 0x8F90,
+ 0x8F97, 0x8206, 0x8F92, 0x6BC2, 0x8F96, 0x8F95, 0x8F98, 0x8F6C, 0x8F99, 0x8F7F, 0x8F9A, 0x8F70, 0x8F94, 0x8F79, 0x8F73, 0x529E,
+ 0x8F9E, 0x8FAB, 0x8FA9, 0x519C, 0x8FD9, 0x8FDE, 0x5468, 0x8FDB, 0x6E38, 0x8FD0, 0x8FC7, 0x8FBE, 0x8FDD, 0x9065, 0x900A, 0x9012,
+ 0x8FDC, 0x9002, 0x8FDF, 0x8FC1, 0x9009, 0x9057, 0x8FBD, 0x8FC8, 0x8FD8, 0x8FE9, 0x8FB9, 0x903B, 0x9026, 0x90CF, 0x90AE, 0x90D3,
+ 0x4E61, 0x90B9, 0x90AC, 0x90E7, 0x9093, 0x90D1, 0x90BB, 0x90F8, 0x90BA, 0x90D0, 0x909D, 0x9142, 0x90E6, 0x814C, 0x4E11, 0x915D,
+ 0x533B, 0x9171, 0x9166, 0x917F, 0x8845, 0x917E, 0x917D, 0x91CA, 0x9487, 0x948C, 0x948A, 0x9489, 0x948B, 0x9488, 0x9493, 0x9490,
+ 0x948F, 0x9492, 0x948E, 0x9497, 0x948D, 0x9495, 0x94AF, 0x94AB, 0x9498, 0x94AD, 0x94A0, 0x949D, 0x94A4, 0x94A3, 0x949E, 0x94AE,
+ 0x94A7, 0x9499, 0x949B, 0x94AA, 0x94CC, 0x94C8, 0x94B6, 0x94C3, 0x94B4, 0x94B9, 0x94CD, 0x94B0, 0x94B8, 0x94C0, 0x94BF, 0x94BE,
+ 0x949C, 0x94CA, 0x94C9, 0x94C7, 0x94CB, 0x94C2, 0x94B3, 0x94C6, 0x94C5, 0x94BA, 0x94A9, 0x94B2, 0x94BC, 0x94BD, 0x94CF, 0x94F0,
+ 0x94D2, 0x94EC, 0x94EA, 0x94F6, 0x94F3, 0x94DC, 0x94DA, 0x94E3, 0x94E8, 0x94E2, 0x94ED, 0x94EB, 0x94E6, 0x8854, 0x94D1, 0x94F7,
+ 0x94F1, 0x94DF, 0x94F5, 0x94D5, 0x94EF, 0x94D0, 0x9510, 0x9500, 0x9508, 0x9511, 0x9509, 0x94DD, 0x9512, 0x950C, 0x94A1, 0x94E4,
+ 0x94D7, 0x950B, 0x950A, 0x9513, 0x9504, 0x9503, 0x9514, 0x9507, 0x94D3, 0x94FA, 0x94D6, 0x9506, 0x9502, 0x952F, 0x94A2, 0x951E,
+ 0x5F55, 0x9516, 0x9529, 0x94D4, 0x9525, 0x9515, 0x951F, 0x9524, 0x9531, 0x94EE, 0x951B, 0x952C, 0x952D, 0x951C, 0x94B1, 0x9526,
+ 0x951A, 0x9520, 0x9521, 0x9522, 0x9519, 0x9530, 0x8868, 0x94FC, 0x9528, 0x9494, 0x9534, 0x94FE, 0x9505, 0x9540, 0x9537, 0x94E1,
+ 0x9496, 0x953B, 0x953D, 0x9538, 0x9532, 0x9539, 0x953E, 0x952E, 0x9536, 0x9517, 0x953A, 0x9541, 0x9551, 0x9555, 0x9501, 0x9549,
+ 0x9548, 0x9543, 0x94A8, 0x84E5, 0x954F, 0x94E0, 0x94E9, 0x953C, 0x9550, 0x9547, 0x9552, 0x954D, 0x9553, 0x955E, 0x955F, 0x94FE,
+ 0x9546, 0x9559, 0x9560, 0x955D, 0x94FF, 0x9535, 0x9557, 0x9558, 0x955B, 0x94F2, 0x955C, 0x9556, 0x9542, 0x933E, 0x955A, 0x94E7,
+ 0x956A, 0x9508, 0x94D9, 0x9563, 0x9566, 0x9561, 0x949F, 0x956B, 0x950F, 0x9544, 0x954C, 0x9570, 0x956F, 0x956D, 0x94C1, 0x956E,
+ 0x94CE, 0x94DB, 0x9571, 0x94F8, 0x956C, 0x9554, 0x9274, 0x9527, 0x9574, 0x94C4, 0x9573, 0x9567, 0x94A5, 0x9575, 0x9576, 0x954A,
+ 0x9569, 0x9523, 0x94BB, 0x92AE, 0x51FF, 0x957F, 0x95E8, 0x95E9, 0x95EA, 0x95EB, 0x95EC, 0x95ED, 0x5F00, 0x95F6, 0x95F3, 0x95F0,
+ 0x95F2, 0x95F4, 0x95F5, 0x95F8, 0x9602, 0x9601, 0x9600, 0x95FA, 0x95FD, 0x9603, 0x9606, 0x95FE, 0x9605, 0x960A, 0x9609, 0x960E,
+ 0x960F, 0x960D, 0x9608, 0x960C, 0x9612, 0x677F, 0x6697, 0x95F1, 0x9614, 0x9615, 0x9611, 0x9617, 0x9618, 0x95FF, 0x9616, 0x9619,
+ 0x95EF, 0x5173, 0x961A, 0x9613, 0x9610, 0x8F9F, 0x961B, 0x95FC, 0x9649, 0x9655, 0x9635, 0x9634, 0x9648, 0x9646, 0x9633, 0x9667,
+ 0x961F, 0x9636, 0x9668, 0x9645, 0x968F, 0x9669, 0x9690, 0x9647, 0x96B6, 0x53EA, 0x96BD, 0x867D, 0x53CC, 0x96CF, 0x6742, 0x9E21,
+ 0x79BB, 0x96BE, 0x4E91, 0x7535, 0x9721, 0x96FE, 0x9701, 0x96F3, 0x972D, 0x53C7, 0x7075, 0x53C6, 0x9753, 0x9759, 0x817C, 0x9765,
+ 0x9F17, 0x5DE9, 0x979F, 0x7F30, 0x9791, 0x97AF, 0x97E6, 0x97E7, 0x97E9, 0x97EA, 0x97EC, 0x97EB, 0x97F5, 0x54CD, 0x9875, 0x9876,
+ 0x9877, 0x9879, 0x987A, 0x9878, 0x987B, 0x987C, 0x9882, 0x9880, 0x9883, 0x9884, 0x987D, 0x9881, 0x987F, 0x9887, 0x9886, 0x988C,
+ 0x9889, 0x9890, 0x988F, 0x5934, 0x988A, 0x988B, 0x9894, 0x9888, 0x9893, 0x9891, 0x9897, 0x9898, 0x989D, 0x989A, 0x989C, 0x9899,
+ 0x989B, 0x613F, 0x98A1, 0x98A0, 0x7C7B, 0x989F, 0x98A2, 0x987E, 0x98A4, 0x98A5, 0x663E, 0x98A6, 0x9885, 0x989E, 0x98A7, 0x98CE,
+ 0x98D0, 0x98D1, 0x98D2, 0x53F0, 0x98D3, 0x98D4, 0x98CF, 0x98D6, 0x98D5, 0x98D7, 0x98D8, 0x98D9, 0x98DE, 0x9965, 0x9964, 0x9966,
+ 0x9968, 0x996A, 0x996B, 0x996C, 0x996D, 0x996E, 0x9974, 0x9972, 0x9971, 0x9970, 0x9973, 0x997A, 0x9978, 0x997C, 0x9977, 0x517B,
+ 0x9975, 0x9979, 0x997D, 0x9981, 0x997F, 0x997E, 0x4F59, 0x80B4, 0x9984, 0x9983, 0x996F, 0x9985, 0x9986, 0x7CC7, 0x9967, 0x5582,
+ 0x9989, 0x998E, 0x9969, 0x998F, 0x998A, 0x998C, 0x998D, 0x9992, 0x9990, 0x9991, 0x9988, 0x9994, 0x9976, 0x98E8, 0x990D, 0x998B,
+ 0x9A6C, 0x9A6D, 0x51AF, 0x9A6E, 0x9A70, 0x9A6F, 0x9A73, 0x9A7B, 0x9A7D, 0x9A79, 0x9A75, 0x9A7E, 0x9A80, 0x9A78, 0x9A76, 0x9A7C,
+ 0x9A77, 0x9A88, 0x9A87, 0x9A83, 0x9A86, 0x9A8E, 0x9A8F, 0x9A8B, 0x9A8D, 0x9A93, 0x9A92, 0x9A91, 0x9A90, 0x9A9B, 0x9A97, 0x9A99,
+ 0x9A9E, 0x9A98, 0x9A9D, 0x817E, 0x9A7A, 0x9A9A, 0x9A9F, 0x9AA1, 0x84E6, 0x9A9C, 0x9A96, 0x9AA0, 0x9AA2, 0x9A71, 0x9A85, 0x9A95,
+ 0x9A81, 0x9A84, 0x9A8C, 0x60CA, 0x9A7F, 0x9AA4, 0x9A74, 0x9AA7, 0x9AA5, 0x9AA6, 0x9A8A, 0x80AE, 0x9AC5, 0x810F, 0x4F53, 0x9ACC,
+ 0x9ACB, 0x53D1, 0x677E, 0x80E1, 0x9B13, 0x6597, 0x95F9, 0x960B, 0x9604, 0x90C1, 0x9B49, 0x9B47, 0x9C7C, 0x9C80, 0x9C81, 0x9C82,
+ 0x9C7F, 0x9C85, 0x9C86, 0x9C8F, 0x9C87, 0x9C90, 0x9C8D, 0x9C8B, 0x9C8A, 0x9C92, 0x9C95, 0x9C96, 0x9C94, 0x9C9B, 0x9C91, 0x9C9C,
+ 0x9CA7, 0x9CA0, 0x9CA9, 0x9CA4, 0x9CA8, 0x9CBB, 0x9CAF, 0x9CAD, 0x9C9E, 0x9CB7, 0x9CB4, 0x9CB1, 0x9CB5, 0x9CB2, 0x9CB3, 0x9CB8,
+ 0x9CAE, 0x9CB0, 0x9CB6, 0x9CAB, 0x9CCA, 0x9C97, 0x9CBD, 0x9CC7, 0x9CC5, 0x9CC6, 0x9CC3, 0x9CD2, 0x9CD1, 0x9CA5, 0x9CCF, 0x9CCE,
+ 0x9CD0, 0x9CCD, 0x9CC1, 0x9CA2, 0x9CCC, 0x9CA6, 0x9CA3, 0x9CB9, 0x9CD7, 0x9CD4, 0x9CC9, 0x9CD5, 0x9CD6, 0x9CDF, 0x9CDD, 0x9CDC,
+ 0x9CDE, 0x9C9F, 0x9CBC, 0x9C8E, 0x9C99, 0x9CE3, 0x9CE2, 0x9C9A, 0x9CC4, 0x9C88, 0x9CA1, 0x9E1F, 0x51EB, 0x9E20, 0x9E24, 0x51E4,
+ 0x9E23, 0x9E22, 0x9E29, 0x9E28, 0x9E26, 0x9E30, 0x9E35, 0x9E33, 0x9E32, 0x9E2E, 0x9E31, 0x9E2A, 0x9E2F, 0x9E2D, 0x9E38, 0x9E39,
+ 0x9E3B, 0x9E3F, 0x9E3D, 0x9E3A, 0x9E43, 0x9E46, 0x9E41, 0x9E48, 0x9E45, 0x9E44, 0x9E49, 0x9E4C, 0x9E4F, 0x9E4E, 0x9E4A, 0x9E53,
+ 0x9E2B, 0x9E51, 0x9E4B, 0x9E59, 0x9E55, 0x9E57, 0x9E56, 0x9E4D, 0x9E5B, 0x9E5C, 0x83BA, 0x9E5F, 0x9E64, 0x9E60, 0x9E61, 0x9E58,
+ 0x9E63, 0x9E5A, 0x9E62, 0x9E5E, 0x9E67, 0x9E65, 0x9E25, 0x9E37, 0x9E68, 0x9E36, 0x9E6A, 0x9E54, 0x9E69, 0x9E6B, 0x9E47, 0x9E6C,
+ 0x9E70, 0x9E6D, 0x9E6F, 0x9E2C, 0x9E74, 0x9E66, 0x9E73, 0x9E42, 0x9E3E, 0x5364, 0x9E7E, 0x7877, 0x76D0, 0x4E3D, 0x9EA6, 0x9EB8,
+ 0x9EB9, 0x9762, 0x4E48, 0x9EC4, 0x9EC9, 0x70B9, 0x515A, 0x9709, 0x9EE1, 0x9EE9, 0x9EFE, 0x9F0B, 0x9F0D, 0x9F39, 0x9F50, 0x658B,
+ 0x8D4D, 0x9F51, 0x9F7F, 0x9F80, 0x9F81, 0x9F85, 0x9F87, 0x9F83, 0x9F86, 0x9F84, 0x9F88, 0x9F8A, 0x9F89, 0x9F8B, 0x9F8C, 0x9F99,
+ 0x5390, 0x5E9E, 0x9F9A, 0x9F9B, 0x9F9F, 0xA76F, 0x8C48, 0x66F4, 0x8ECA, 0x8CC8, 0x6ED1, 0x4E32, 0x53E5, 0x9F9C, 0x9F9C, 0x5951,
+ 0x91D1, 0x5587, 0x5948, 0x61F6, 0x7669, 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0x6A02, 0x6D1B, 0x70D9, 0x73DE, 0x843D, 0x916A,
+ 0x99F1, 0x4E82, 0x5375, 0x6B04, 0x721B, 0x862D, 0x9E1E, 0x5D50, 0x6FEB, 0x85CD, 0x8964, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+ 0x6D6A, 0x72FC, 0x90CE, 0x4F86, 0x51B7, 0x52DE, 0x64C4, 0x6AD3, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C, 0x8DEF, 0x9732, 0x9B6F,
+ 0x9DFA, 0x788C, 0x797F, 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x8AD6, 0x58DF, 0x5F04, 0x7C60, 0x807E, 0x7262, 0x78CA, 0x8CC2, 0x96F7,
+ 0x58D8, 0x5C62, 0x6A13, 0x6DDA, 0x6F0F, 0x7D2F, 0x7E37, 0x964B, 0x52D2, 0x808B, 0x51DC, 0x51CC, 0x7A1C, 0x7DBE, 0x83F1, 0x9675,
+ 0x8B80, 0x62CF, 0x6A02, 0x8AFE, 0x4E39, 0x5BE7, 0x6012, 0x7387, 0x7570, 0x5317, 0x78FB, 0x4FBF, 0x5FA9, 0x4E0D, 0x6CCC, 0x6578,
+ 0x7D22, 0x53C3, 0x585E, 0x7701, 0x8449, 0x8AAA, 0x6BBA, 0x8FB0, 0x6C88, 0x62FE, 0x82E5, 0x63A0, 0x7565, 0x4EAE, 0x5169, 0x51C9,
+ 0x6881, 0x7CE7, 0x826F, 0x8AD2, 0x91CF, 0x52F5, 0x5442, 0x5973, 0x5EEC, 0x65C5, 0x6FFE, 0x792A, 0x95AD, 0x9A6A, 0x9E97, 0x9ECE,
+ 0x529B, 0x66C6, 0x6B77, 0x8F62, 0x5E74, 0x6190, 0x6200, 0x649A, 0x6F23, 0x7149, 0x7489, 0x79CA, 0x7DF4, 0x806F, 0x8F26, 0x84EE,
+ 0x9023, 0x934A, 0x5217, 0x52A3, 0x54BD, 0x70C8, 0x88C2, 0x8AAA, 0x5EC9, 0x5FF5, 0x637B, 0x6BAE, 0x7C3E, 0x7375, 0x4EE4, 0x56F9,
+ 0x5BE7, 0x5DBA, 0x601C, 0x73B2, 0x7469, 0x7F9A, 0x8046, 0x9234, 0x96F6, 0x9748, 0x9818, 0x4F8B, 0x79AE, 0x91B4, 0x96B8, 0x60E1,
+ 0x4E86, 0x50DA, 0x5BEE, 0x5C3F, 0x6599, 0x6A02, 0x71CE, 0x7642, 0x84FC, 0x907C, 0x9F8D, 0x6688, 0x962E, 0x5289, 0x677B, 0x67F3,
+ 0x6D41, 0x6E9C, 0x7409, 0x7559, 0x786B, 0x7D10, 0x985E, 0x516D, 0x622E, 0x9678, 0x502B, 0x5D19, 0x6DEA, 0x8F2A, 0x5F8B, 0x6144,
+ 0x6817, 0x7387, 0x9686, 0x5229, 0x540F, 0x5C65, 0x6613, 0x674E, 0x68A8, 0x6CE5, 0x7406, 0x75E2, 0x7F79, 0x88CF, 0x88E1, 0x91CC,
+ 0x96E2, 0x533F, 0x6EBA, 0x541D, 0x71D0, 0x7498, 0x85FA, 0x96A3, 0x9C57, 0x9E9F, 0x6797, 0x6DCB, 0x81E8, 0x7ACB, 0x7B20, 0x7C92,
+ 0x72C0, 0x7099, 0x8B58, 0x4EC0, 0x8336, 0x523A, 0x5207, 0x5EA6, 0x62D3, 0x7CD6, 0x5B85, 0x6D1E, 0x66B4, 0x8F3B, 0x884C, 0x964D,
+ 0x898B, 0x5ED3, 0x5140, 0x55C0, 0x585A, 0x6674, 0x51DE, 0x732A, 0x76CA, 0x793C, 0x795E, 0x7965, 0x798F, 0x9756, 0x7CBE, 0x7FBD,
+ 0x8612, 0x8AF8, 0x9038, 0x90FD, 0x98EF, 0x98FC, 0x9928, 0x9DB4, 0x4FAE, 0x50E7, 0x514D, 0x52C9, 0x52E4, 0x5351, 0x559D, 0x5606,
+ 0x5668, 0x5840, 0x58A8, 0x5C64, 0x5C6E, 0x6094, 0x6168, 0x618E, 0x61F2, 0x654F, 0x65E2, 0x6691, 0x6885, 0x6D77, 0x6E1A, 0x6F22,
+ 0x716E, 0x722B, 0x7422, 0x7891, 0x793E, 0x7949, 0x7948, 0x7950, 0x7956, 0x795D, 0x798D, 0x798E, 0x7A40, 0x7A81, 0x7BC0, 0x7DF4,
+ 0x7E09, 0x7E41, 0x7F72, 0x8005, 0x81ED, 0x8279, 0x8279, 0x8457, 0x8910, 0x8996, 0x8B01, 0x8B39, 0x8CD3, 0x8D08, 0x8FB6, 0x9038,
+ 0x96E3, 0x97FF, 0x983B, 0x6075, 0x8218, 0x4E26, 0x51B5, 0x5168, 0x4F80, 0x5145, 0x5180, 0x52C7, 0x52FA, 0x559D, 0x5555, 0x5599,
+ 0x55E2, 0x585A, 0x58B3, 0x5944, 0x5954, 0x5A62, 0x5B28, 0x5ED2, 0x5ED9, 0x5F69, 0x5FAD, 0x60D8, 0x614E, 0x6108, 0x618E, 0x6160,
+ 0x61F2, 0x6234, 0x63C4, 0x641C, 0x6452, 0x6556, 0x6674, 0x6717, 0x671B, 0x6756, 0x6B79, 0x6BBA, 0x6D41, 0x6EDB, 0x6ECB, 0x6F22,
+ 0x701E, 0x716E, 0x77A7, 0x7235, 0x72AF, 0x732A, 0x7471, 0x7506, 0x753B, 0x761D, 0x761F, 0x76CA, 0x76DB, 0x76F4, 0x774A, 0x7740,
+ 0x78CC, 0x7AB1, 0x7BC0, 0x7C7B, 0x7D5B, 0x7DF4, 0x7F3E, 0x8005, 0x8352, 0x83EF, 0x8779, 0x8941, 0x8986, 0x8996, 0x8ABF, 0x8AF8,
+ 0x8ACB, 0x8B01, 0x8AFE, 0x8AED, 0x8B39, 0x8B8A, 0x8D08, 0x8F38, 0x9072, 0x9199, 0x9276, 0x967C, 0x96E3, 0x9756, 0x97DB, 0x97FF,
+ 0x980B, 0x983B, 0x9B12, 0x9F9C, 0x3B9D, 0x4018, 0x4039, 0x9F43, 0x9F8E, 0x05E2, 0x05D0, 0x05D3, 0x05D4, 0x05DB, 0x05DC, 0x05DD,
+ 0x05E8, 0x05EA, 0x002B, 0x0671, 0x0671, 0x067B, 0x067B, 0x067B, 0x067B, 0x067E, 0x067E, 0x067E, 0x067E, 0x0680, 0x0680, 0x0680,
+ 0x0680, 0x067A, 0x067A, 0x067A, 0x067A, 0x067F, 0x067F, 0x067F, 0x067F, 0x0679, 0x0679, 0x0679, 0x0679, 0x06A4, 0x06A4, 0x06A4,
+ 0x06A4, 0x06A6, 0x06A6, 0x06A6, 0x06A6, 0x0684, 0x0684, 0x0684, 0x0684, 0x0683, 0x0683, 0x0683, 0x0683, 0x0686, 0x0686, 0x0686,
+ 0x0686, 0x0687, 0x0687, 0x0687, 0x0687, 0x068D, 0x068D, 0x068C, 0x068C, 0x068E, 0x068E, 0x0688, 0x0688, 0x0698, 0x0698, 0x0691,
+ 0x0691, 0x06A9, 0x06A9, 0x06A9, 0x06A9, 0x06AF, 0x06AF, 0x06AF, 0x06AF, 0x06B3, 0x06B3, 0x06B3, 0x06B3, 0x06B1, 0x06B1, 0x06B1,
+ 0x06B1, 0x06BA, 0x06BA, 0x06BB, 0x06BB, 0x06BB, 0x06BB, 0x06C0, 0x06C0, 0x06C1, 0x06C1, 0x06C1, 0x06C1, 0x06BE, 0x06BE, 0x06BE,
+ 0x06BE, 0x06D2, 0x06D2, 0x06D3, 0x06D3, 0x06AD, 0x06AD, 0x06AD, 0x06AD, 0x06C7, 0x06C7, 0x06C6, 0x06C6, 0x06C8, 0x06C8, 0x0677,
+ 0x06CB, 0x06CB, 0x06C5, 0x06C5, 0x06C9, 0x06C9, 0x06D0, 0x06D0, 0x06D0, 0x06D0, 0x0649, 0x0649, 0x06CC, 0x06CC, 0x06CC, 0x06CC,
+ 0x002C, 0x3001, 0x3002, 0x003A, 0x003B, 0x0021, 0x003F, 0x3016, 0x3017, 0x2026, 0x2025, 0x2014, 0x2013, 0x005F, 0x005F, 0x0028,
+ 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x3010, 0x3011, 0x300A, 0x300B, 0x3008, 0x3009, 0x300C, 0x300D, 0x300E, 0x300F, 0x005B,
+ 0x005D, 0x203E, 0x203E, 0x203E, 0x203E, 0x005F, 0x005F, 0x005F, 0x002C, 0x3001, 0x002E, 0x003B, 0x003A, 0x003F, 0x0021, 0x2014,
+ 0x0028, 0x0029, 0x007B, 0x007D, 0x3014, 0x3015, 0x0023, 0x0026, 0x002A, 0x002B, 0x002D, 0x003C, 0x003E, 0x003D, 0x005C, 0x0024,
+ 0x0025, 0x0040, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x0651, 0x0652, 0x0621, 0x0622, 0x0622, 0x0623, 0x0623, 0x0624,
+ 0x0624, 0x0625, 0x0625, 0x0626, 0x0626, 0x0626, 0x0626, 0x0627, 0x0627, 0x0628, 0x0628, 0x0628, 0x0628, 0x0629, 0x0629, 0x062A,
+ 0x062A, 0x062A, 0x062A, 0x062B, 0x062B, 0x062B, 0x062B, 0x062C, 0x062C, 0x062C, 0x062C, 0x062D, 0x062D, 0x062D, 0x062D, 0x062E,
+ 0x062E, 0x062E, 0x062E, 0x062F, 0x062F, 0x0630, 0x0630, 0x0631, 0x0631, 0x0632, 0x0632, 0x0633, 0x0633, 0x0633, 0x0633, 0x0634,
+ 0x0634, 0x0634, 0x0634, 0x0635, 0x0635, 0x0635, 0x0635, 0x0636, 0x0636, 0x0636, 0x0636, 0x0637, 0x0637, 0x0637, 0x0637, 0x0638,
+ 0x0638, 0x0638, 0x0638, 0x0639, 0x0639, 0x0639, 0x0639, 0x063A, 0x063A, 0x063A, 0x063A, 0x0641, 0x0641, 0x0641, 0x0641, 0x0642,
+ 0x0642, 0x0642, 0x0642, 0x0643, 0x0643, 0x0643, 0x0643, 0x0644, 0x0644, 0x0644, 0x0644, 0x0645, 0x0645, 0x0645, 0x0645, 0x0646,
+ 0x0646, 0x0646, 0x0646, 0x0647, 0x0647, 0x0647, 0x0647, 0x0648, 0x0648, 0x0649, 0x0649, 0x064A, 0x064A, 0x064A, 0x064A, 0x0021,
+ 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031,
+ 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0040, 0x0041,
+ 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050, 0x0051,
+ 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061,
+ 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071,
+ 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x2985, 0x2986, 0x3002,
+ 0x300C, 0x300D, 0x3001, 0x30FB, 0x30F2, 0x30A1, 0x30A3, 0x30A5, 0x30A7, 0x30A9, 0x30E3, 0x30E5, 0x30E7, 0x30C3, 0x30FC, 0x30A2,
+ 0x30A4, 0x30A6, 0x30A8, 0x30AA, 0x30AB, 0x30AD, 0x30AF, 0x30B1, 0x30B3, 0x30B5, 0x30B7, 0x30B9, 0x30BB, 0x30BD, 0x30BF, 0x30C1,
+ 0x30C4, 0x30C6, 0x30C8, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF, 0x30D2, 0x30D5, 0x30D8, 0x30DB, 0x30DE, 0x30DF, 0x30E0,
+ 0x30E1, 0x30E2, 0x30E4, 0x30E6, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EF, 0x30F3, 0x3099, 0x309A, 0x3164, 0x3131,
+ 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F, 0x3140, 0x3141,
+ 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F, 0x3150, 0x3151,
+ 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F, 0x3160, 0x3161,
+ 0x3162, 0x3163, 0x00A2, 0x00A3, 0x00AC, 0x00AF, 0x00A6, 0x00A5, 0x20A9, 0x2502, 0x2190, 0x2191, 0x2192, 0x2193, 0x25A0, 0x25CB
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1724] = {
+ 0x004F, 0x0045, 0x0054, 0x004D, 0x006F, 0x0065, 0x0049, 0x004A, 0x0069, 0x006A, 0x004F, 0x0045, 0x006F, 0x0065, 0x0044, 0x017D,
+ 0x0044, 0x017E, 0x0064, 0x017E, 0x004C, 0x004A, 0x004C, 0x006A, 0x006C, 0x006A, 0x004E, 0x004A, 0x004E, 0x006A, 0x006E, 0x006A,
+ 0x0044, 0x005A, 0x0044, 0x007A, 0x0064, 0x007A, 0x0064, 0x0062, 0x0071, 0x0070, 0x004F, 0x0045, 0x0064, 0x007A, 0x0064, 0x0292,
+ 0x0064, 0x007A, 0x0074, 0x0073, 0x0074, 0x0283, 0x0074, 0x0063, 0x0066, 0x014B, 0x006C, 0x0073, 0x006C, 0x007A, 0x041D, 0x0413,
+ 0x043D, 0x0433, 0x0422, 0x0426, 0x0442, 0x0446, 0x0410, 0x0415, 0x0430, 0x0435, 0x0565, 0x0582, 0x0627, 0x0674, 0x0648, 0x0674,
+ 0x06C7, 0x0674, 0x064A, 0x0674, 0x06D5, 0x0654, 0x06C1, 0x0654, 0x06D2, 0x0654, 0x0928, 0x093C, 0x0930, 0x093C, 0x0933, 0x093C,
+ 0x0915, 0x093C, 0x0916, 0x093C, 0x0917, 0x093C, 0x091C, 0x093C, 0x0921, 0x093C, 0x0922, 0x093C, 0x092B, 0x093C, 0x092F, 0x093C,
+ 0x09C7, 0x09BE, 0x09C7, 0x09D7, 0x09A1, 0x09BC, 0x09A2, 0x09BC, 0x09AF, 0x09BC, 0x0A32, 0x0A3C, 0x0A38, 0x0A3C, 0x0A16, 0x0A3C,
+ 0x0A17, 0x0A3C, 0x0A1C, 0x0A3C, 0x0A2B, 0x0A3C, 0x0B47, 0x0B56, 0x0B47, 0x0B3E, 0x0B47, 0x0B57, 0x0B21, 0x0B3C, 0x0B22, 0x0B3C,
+ 0x0B92, 0x0BD7, 0x0BC6, 0x0BBE, 0x0BC7, 0x0BBE, 0x0BC6, 0x0BD7, 0x0C46, 0x0C56, 0x0CBF, 0x0CD5, 0x0CC6, 0x0CD5, 0x0CC6, 0x0CD6,
+ 0x0CC6, 0x0CC2, 0x0CCA, 0x0CD5, 0x0D46, 0x0D3E, 0x0D47, 0x0D3E, 0x0D46, 0x0D57, 0x0DD9, 0x0DCA, 0x0DD9, 0x0DCF, 0x0DDC, 0x0DCA,
+ 0x0DD9, 0x0DDF, 0x0E4D, 0x0E32, 0x0ECD, 0x0EB2, 0x0EAB, 0x0E99, 0x0EAB, 0x0EA1, 0x0F42, 0x0FB7, 0x0F4C, 0x0FB7, 0x0F51, 0x0FB7,
+ 0x0F56, 0x0FB7, 0x0F5B, 0x0FB7, 0x0F40, 0x0FB5, 0x0F71, 0x0F72, 0x0F71, 0x0F74, 0x0FB2, 0x0F80, 0x0FB2, 0x0F81, 0x0FB3, 0x0F80,
+ 0x0FB3, 0x0F81, 0x0F71, 0x0F80, 0x0F92, 0x0FB7, 0x0F9C, 0x0FB7, 0x0FA1, 0x0FB7, 0x0FA6, 0x0FB7, 0x0FAB, 0x0FB7, 0x0F90, 0x0FB5,
+ 0x1025, 0x102E, 0x1B05, 0x1B35, 0x1B07, 0x1B35, 0x1B09, 0x1B35, 0x1B0B, 0x1B35, 0x1B0D, 0x1B35, 0x1B11, 0x1B35, 0x1B3A, 0x1B35,
+ 0x1B3C, 0x1B35, 0x1B3E, 0x1B35, 0x1B3F, 0x1B35, 0x1B42, 0x1B35, 0x0074, 0x0068, 0x002E, 0x002E, 0x2032, 0x2032, 0x2035, 0x2035,
+ 0x0021, 0x0021, 0x0020, 0x0305, 0x003F, 0x003F, 0x003F, 0x0021, 0x0021, 0x003F, 0x0052, 0x0073, 0x00B0, 0x0043, 0x00B0, 0x0046,
+ 0x004E, 0x006F, 0x0053, 0x004D, 0x0054, 0x004D, 0x0031, 0x002F, 0x0049, 0x0049, 0x0049, 0x0056, 0x0056, 0x0049, 0x0049, 0x0058,
+ 0x0058, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0076, 0x0069, 0x0069, 0x0078, 0x0078, 0x0069, 0x2190, 0x0338, 0x2192, 0x0338,
+ 0x2194, 0x0338, 0x21D0, 0x0338, 0x21D4, 0x0338, 0x21D2, 0x0338, 0x2223, 0x0338, 0x2225, 0x0338, 0x222B, 0x222B, 0x222E, 0x222E,
+ 0x223C, 0x0338, 0x2243, 0x0338, 0x2245, 0x0338, 0x2248, 0x0338, 0x003D, 0x002F, 0x2261, 0x002F, 0x224D, 0x002F, 0x003C, 0x002F,
+ 0x003E, 0x002F, 0x2264, 0x002F, 0x2265, 0x002F, 0x2272, 0x002F, 0x2273, 0x002F, 0x2276, 0x002F, 0x2277, 0x002F, 0x227A, 0x002F,
+ 0x227B, 0x002F, 0x2282, 0x002F, 0x2283, 0x002F, 0x2286, 0x002F, 0x2287, 0x002F, 0x22A2, 0x002F, 0x22A8, 0x002F, 0x22A9, 0x002F,
+ 0x22AB, 0x002F, 0x227C, 0x002F, 0x227D, 0x002F, 0x2291, 0x002F, 0x2292, 0x002F, 0x22B2, 0x002F, 0x22B3, 0x002F, 0x22B4, 0x002F,
+ 0x22B5, 0x002F, 0x0042, 0x0053, 0x0048, 0x0054, 0x004C, 0x0046, 0x0056, 0x0054, 0x0046, 0x0046, 0x0043, 0x0052, 0x0053, 0x0053,
+ 0x0053, 0x0049, 0x0045, 0x004D, 0x0046, 0x0053, 0x0047, 0x0053, 0x0052, 0x0053, 0x0055, 0x0053, 0x0053, 0x0050, 0x0031, 0x0030,
+ 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035, 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038,
+ 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x002E, 0x0032, 0x002E, 0x0033, 0x002E, 0x0034, 0x002E, 0x0035, 0x002E, 0x0036, 0x002E,
+ 0x0037, 0x002E, 0x0038, 0x002E, 0x0039, 0x002E, 0x0031, 0x0031, 0x0031, 0x0032, 0x0031, 0x0033, 0x0031, 0x0034, 0x0031, 0x0035,
+ 0x0031, 0x0036, 0x0031, 0x0037, 0x0031, 0x0038, 0x0031, 0x0039, 0x0032, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030, 0x0031, 0x0030,
+ 0x0031, 0x0030, 0x003D, 0x003D, 0x2ADD, 0x002F, 0x304B, 0x3099, 0x304D, 0x3099, 0x304F, 0x3099, 0x3051, 0x3099, 0x3053, 0x3099,
+ 0x3055, 0x3099, 0x3057, 0x3099, 0x3059, 0x3099, 0x305B, 0x3099, 0x305D, 0x3099, 0x305F, 0x3099, 0x3061, 0x3099, 0x3064, 0x3099,
+ 0x3066, 0x3099, 0x3068, 0x3099, 0x306F, 0x3099, 0x306F, 0x309A, 0x3072, 0x3099, 0x3072, 0x309A, 0x3075, 0x3099, 0x3075, 0x309A,
+ 0x3078, 0x3099, 0x3078, 0x309A, 0x307B, 0x3099, 0x307B, 0x309A, 0x3046, 0x3099, 0x0020, 0x3099, 0x0020, 0x309A, 0x309D, 0x3099,
+ 0x3088, 0x308A, 0x30AB, 0x3099, 0x30AD, 0x3099, 0x30AF, 0x3099, 0x30B1, 0x3099, 0x30B3, 0x3099, 0x30B5, 0x3099, 0x30B7, 0x3099,
+ 0x30B9, 0x3099, 0x30BB, 0x3099, 0x30BD, 0x3099, 0x30BF, 0x3099, 0x30C1, 0x3099, 0x30C4, 0x3099, 0x30C6, 0x3099, 0x30C8, 0x3099,
+ 0x30CF, 0x3099, 0x30CF, 0x309A, 0x30D2, 0x3099, 0x30D2, 0x309A, 0x30D5, 0x3099, 0x30D5, 0x309A, 0x30D8, 0x3099, 0x30D8, 0x309A,
+ 0x30DB, 0x3099, 0x30DB, 0x309A, 0x30A6, 0x3099, 0x30EF, 0x3099, 0x30F0, 0x3099, 0x30F1, 0x3099, 0x30F2, 0x3099, 0x30FD, 0x3099,
+ 0x30B3, 0x30C8, 0x0032, 0x0031, 0x0032, 0x0032, 0x0032, 0x0033, 0x0032, 0x0034, 0x0032, 0x0035, 0x0032, 0x0036, 0x0032, 0x0037,
+ 0x0032, 0x0038, 0x0032, 0x0039, 0x0033, 0x0030, 0x0033, 0x0031, 0x0033, 0x0032, 0x0033, 0x0033, 0x0033, 0x0034, 0x0033, 0x0035,
+ 0x1100, 0x1161, 0x1102, 0x1161, 0x1103, 0x1161, 0x1105, 0x1161, 0x1106, 0x1161, 0x1107, 0x1161, 0x1109, 0x1161, 0x110B, 0x1161,
+ 0x110C, 0x1161, 0x110E, 0x1161, 0x110F, 0x1161, 0x1110, 0x1161, 0x1111, 0x1161, 0x1112, 0x1161, 0x110B, 0x116E, 0x0033, 0x0036,
+ 0x0033, 0x0037, 0x0033, 0x0038, 0x0033, 0x0039, 0x0034, 0x0030, 0x0034, 0x0031, 0x0034, 0x0032, 0x0034, 0x0033, 0x0034, 0x0034,
+ 0x0034, 0x0035, 0x0034, 0x0036, 0x0034, 0x0037, 0x0034, 0x0038, 0x0034, 0x0039, 0x0035, 0x0030, 0x0031, 0x6708, 0x0032, 0x6708,
+ 0x0033, 0x6708, 0x0034, 0x6708, 0x0035, 0x6708, 0x0036, 0x6708, 0x0037, 0x6708, 0x0038, 0x6708, 0x0039, 0x6708, 0x0048, 0x0067,
+ 0x0065, 0x0056, 0x30AE, 0x30AC, 0x30AD, 0x30ED, 0x30C7, 0x30B7, 0x30C9, 0x30EB, 0x30C8, 0x30F3, 0x30CA, 0x30CE, 0x30D4, 0x30B3,
+ 0x30D3, 0x30EB, 0x30DA, 0x30BD, 0x30DB, 0x30F3, 0x30DF, 0x30EA, 0x30E1, 0x30AC, 0x30EA, 0x30E9, 0x30EC, 0x30E0, 0x0030, 0x70B9,
+ 0x0031, 0x70B9, 0x0032, 0x70B9, 0x0033, 0x70B9, 0x0034, 0x70B9, 0x0035, 0x70B9, 0x0036, 0x70B9, 0x0037, 0x70B9, 0x0038, 0x70B9,
+ 0x0039, 0x70B9, 0x0064, 0x0061, 0x0041, 0x0055, 0x006F, 0x0056, 0x0070, 0x0063, 0x0064, 0x006D, 0x0049, 0x0055, 0x5E73, 0x6210,
+ 0x662D, 0x548C, 0x5927, 0x6B63, 0x660E, 0x6CBB, 0x0070, 0x0041, 0x006E, 0x0041, 0x03BC, 0x0041, 0x006D, 0x0041, 0x006B, 0x0041,
+ 0x004B, 0x0042, 0x004D, 0x0042, 0x0047, 0x0042, 0x0070, 0x0046, 0x006E, 0x0046, 0x03BC, 0x0046, 0x03BC, 0x0067, 0x006D, 0x0067,
+ 0x006B, 0x0067, 0x0048, 0x007A, 0x03BC, 0x2113, 0x006D, 0x2113, 0x0064, 0x2113, 0x006B, 0x2113, 0x0066, 0x006D, 0x006E, 0x006D,
+ 0x03BC, 0x006D, 0x006D, 0x006D, 0x0063, 0x006D, 0x006B, 0x006D, 0x006D, 0x00B2, 0x006D, 0x00B3, 0x0050, 0x0061, 0x0070, 0x0073,
+ 0x006E, 0x0073, 0x03BC, 0x0073, 0x006D, 0x0073, 0x0070, 0x0056, 0x006E, 0x0056, 0x03BC, 0x0056, 0x006D, 0x0056, 0x006B, 0x0056,
+ 0x004D, 0x0056, 0x0070, 0x0057, 0x006E, 0x0057, 0x03BC, 0x0057, 0x006D, 0x0057, 0x006B, 0x0057, 0x004D, 0x0057, 0x006B, 0x03A9,
+ 0x004D, 0x03A9, 0x0042, 0x0071, 0x0063, 0x0063, 0x0063, 0x0064, 0x0064, 0x0042, 0x0047, 0x0079, 0x0068, 0x0061, 0x0048, 0x0050,
+ 0x0069, 0x006E, 0x004B, 0x004B, 0x004B, 0x004D, 0x006B, 0x0074, 0x006C, 0x006D, 0x006C, 0x006E, 0x006C, 0x0078, 0x006D, 0x0062,
+ 0x0050, 0x0048, 0x0050, 0x0052, 0x0073, 0x0072, 0x0053, 0x0076, 0x0057, 0x0062, 0x0031, 0x65E5, 0x0032, 0x65E5, 0x0033, 0x65E5,
+ 0x0034, 0x65E5, 0x0035, 0x65E5, 0x0036, 0x65E5, 0x0037, 0x65E5, 0x0038, 0x65E5, 0x0039, 0x65E5, 0x0066, 0x0066, 0x0066, 0x0069,
+ 0x0066, 0x006C, 0x017F, 0x0074, 0x0073, 0x0074, 0x0574, 0x0576, 0x0574, 0x0565, 0x0574, 0x056B, 0x057E, 0x0576, 0x0574, 0x056D,
+ 0x05D9, 0x05B4, 0x05F2, 0x05B7, 0x05E9, 0x05C1, 0x05E9, 0x05C2, 0xFB49, 0x05C1, 0xFB49, 0x05C2, 0x05D0, 0x05B7, 0x05D0, 0x05B8,
+ 0x05D0, 0x05BC, 0x05D1, 0x05BC, 0x05D2, 0x05BC, 0x05D3, 0x05BC, 0x05D4, 0x05BC, 0x05D5, 0x05BC, 0x05D6, 0x05BC, 0x05D8, 0x05BC,
+ 0x05D9, 0x05BC, 0x05DA, 0x05BC, 0x05DB, 0x05BC, 0x05DC, 0x05BC, 0x05DE, 0x05BC, 0x05E0, 0x05BC, 0x05E1, 0x05BC, 0x05E3, 0x05BC,
+ 0x05E4, 0x05BC, 0x05E6, 0x05BC, 0x05E7, 0x05BC, 0x05E8, 0x05BC, 0x05E9, 0x05BC, 0x05EA, 0x05BC, 0x05D5, 0x05B9, 0x05D1, 0x05BF,
+ 0x05DB, 0x05BF, 0x05E4, 0x05BF, 0x05D0, 0x05DC, 0x0626, 0x0627, 0x0626, 0x0627, 0x0626, 0x06D5, 0x0626, 0x06D5, 0x0626, 0x0648,
+ 0x0626, 0x0648, 0x0626, 0x06C7, 0x0626, 0x06C7, 0x0626, 0x06C6, 0x0626, 0x06C6, 0x0626, 0x06C8, 0x0626, 0x06C8, 0x0626, 0x06D0,
+ 0x0626, 0x06D0, 0x0626, 0x06D0, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x0649, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x0645,
+ 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0649, 0x0628, 0x064A,
+ 0x062A, 0x062C, 0x062A, 0x062D, 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x062C, 0x062B, 0x0645,
+ 0x062B, 0x0649, 0x062B, 0x064A, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645, 0x062E, 0x062C, 0x062E, 0x062D,
+ 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x0645, 0x0636, 0x062C,
+ 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0637, 0x0645, 0x0638, 0x0645, 0x0639, 0x062C, 0x0639, 0x0645,
+ 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0641, 0x0649, 0x0641, 0x064A,
+ 0x0642, 0x062D, 0x0642, 0x0645, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E,
+ 0x0643, 0x0644, 0x0643, 0x0645, 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x062C, 0x0644, 0x062D, 0x0644, 0x062E, 0x0644, 0x0645,
+ 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0645, 0x0649, 0x0645, 0x064A,
+ 0x0646, 0x062C, 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0649, 0x0646, 0x064A, 0x0647, 0x062C, 0x0647, 0x0645,
+ 0x0647, 0x0649, 0x0647, 0x064A, 0x064A, 0x062C, 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0649, 0x064A, 0x064A,
+ 0x0630, 0x0670, 0x0631, 0x0670, 0x0649, 0x0670, 0x064C, 0x0651, 0x064D, 0x0651, 0x064E, 0x0651, 0x064F, 0x0651, 0x0650, 0x0651,
+ 0x0651, 0x0670, 0x0626, 0x0631, 0x0626, 0x0632, 0x0626, 0x0645, 0x0626, 0x0646, 0x0626, 0x0649, 0x0626, 0x064A, 0x0628, 0x0631,
+ 0x0628, 0x0632, 0x0628, 0x0645, 0x0628, 0x0646, 0x0628, 0x0649, 0x0628, 0x064A, 0x062A, 0x0631, 0x062A, 0x0632, 0x062A, 0x0645,
+ 0x062A, 0x0646, 0x062A, 0x0649, 0x062A, 0x064A, 0x062B, 0x0631, 0x062B, 0x0632, 0x062B, 0x0645, 0x062B, 0x0646, 0x062B, 0x0649,
+ 0x062B, 0x064A, 0x0641, 0x0649, 0x0641, 0x064A, 0x0642, 0x0649, 0x0642, 0x064A, 0x0643, 0x0627, 0x0643, 0x0644, 0x0643, 0x0645,
+ 0x0643, 0x0649, 0x0643, 0x064A, 0x0644, 0x0645, 0x0644, 0x0649, 0x0644, 0x064A, 0x0645, 0x0627, 0x0645, 0x0645, 0x0646, 0x0631,
+ 0x0646, 0x0632, 0x0646, 0x0645, 0x0646, 0x0646, 0x0646, 0x0649, 0x0646, 0x064A, 0x0649, 0x0670, 0x064A, 0x0631, 0x064A, 0x0632,
+ 0x064A, 0x0645, 0x064A, 0x0646, 0x064A, 0x0649, 0x064A, 0x064A, 0x0626, 0x062C, 0x0626, 0x062D, 0x0626, 0x062E, 0x0626, 0x0645,
+ 0x0626, 0x0647, 0x0628, 0x062C, 0x0628, 0x062D, 0x0628, 0x062E, 0x0628, 0x0645, 0x0628, 0x0647, 0x062A, 0x062C, 0x062A, 0x062D,
+ 0x062A, 0x062E, 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062C, 0x062D, 0x062C, 0x0645, 0x062D, 0x062C, 0x062D, 0x0645,
+ 0x062E, 0x062C, 0x062E, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D, 0x0633, 0x062E, 0x0633, 0x0645, 0x0635, 0x062D, 0x0635, 0x062E,
+ 0x0635, 0x0645, 0x0636, 0x062C, 0x0636, 0x062D, 0x0636, 0x062E, 0x0636, 0x0645, 0x0637, 0x062D, 0x0638, 0x0645, 0x0639, 0x062C,
+ 0x0639, 0x0645, 0x063A, 0x062C, 0x063A, 0x0645, 0x0641, 0x062C, 0x0641, 0x062D, 0x0641, 0x062E, 0x0641, 0x0645, 0x0642, 0x062D,
+ 0x0642, 0x0645, 0x0643, 0x062C, 0x0643, 0x062D, 0x0643, 0x062E, 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x062C, 0x0644, 0x062D,
+ 0x0644, 0x062E, 0x0644, 0x0645, 0x0644, 0x0647, 0x0645, 0x062C, 0x0645, 0x062D, 0x0645, 0x062E, 0x0645, 0x0645, 0x0646, 0x062C,
+ 0x0646, 0x062D, 0x0646, 0x062E, 0x0646, 0x0645, 0x0646, 0x0647, 0x0647, 0x062C, 0x0647, 0x0645, 0x0647, 0x0670, 0x064A, 0x062C,
+ 0x064A, 0x062D, 0x064A, 0x062E, 0x064A, 0x0645, 0x064A, 0x0647, 0x0626, 0x0645, 0x0626, 0x0647, 0x0628, 0x0645, 0x0628, 0x0647,
+ 0x062A, 0x0645, 0x062A, 0x0647, 0x062B, 0x0645, 0x062B, 0x0647, 0x0633, 0x0645, 0x0633, 0x0647, 0x0634, 0x0645, 0x0634, 0x0647,
+ 0x0643, 0x0644, 0x0643, 0x0645, 0x0644, 0x0645, 0x0646, 0x0645, 0x0646, 0x0647, 0x064A, 0x0645, 0x064A, 0x0647, 0x0637, 0x0649,
+ 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649, 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649,
+ 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649, 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649,
+ 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631,
+ 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0637, 0x0649, 0x0637, 0x064A, 0x0639, 0x0649, 0x0639, 0x064A, 0x063A, 0x0649,
+ 0x063A, 0x064A, 0x0633, 0x0649, 0x0633, 0x064A, 0x0634, 0x0649, 0x0634, 0x064A, 0x062D, 0x0649, 0x062D, 0x064A, 0x062C, 0x0649,
+ 0x062C, 0x064A, 0x062E, 0x0649, 0x062E, 0x064A, 0x0635, 0x0649, 0x0635, 0x064A, 0x0636, 0x0649, 0x0636, 0x064A, 0x0634, 0x062C,
+ 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0634, 0x0631, 0x0633, 0x0631, 0x0635, 0x0631, 0x0636, 0x0631, 0x0634, 0x062C,
+ 0x0634, 0x062D, 0x0634, 0x062E, 0x0634, 0x0645, 0x0633, 0x0647, 0x0634, 0x0647, 0x0637, 0x0645, 0x0633, 0x062C, 0x0633, 0x062D,
+ 0x0633, 0x062E, 0x0634, 0x062C, 0x0634, 0x062D, 0x0634, 0x062E, 0x0637, 0x0645, 0x0638, 0x0645, 0x0627, 0x064B, 0x0627, 0x064B,
+ 0x0640, 0x064B, 0x0640, 0x064E, 0x0640, 0x064F, 0x0640, 0x0650, 0x0640, 0x0651, 0x0640, 0x0652, 0x0644, 0x0622, 0x0644, 0x0622,
+ 0x0644, 0x0623, 0x0644, 0x0623, 0x0644, 0x0625, 0x0644, 0x0625, 0x0644, 0x0627, 0x0644, 0x0627
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164] = {
+ 0x0031, 0x002F, 0x0034, 0x0031, 0x002F, 0x0032, 0x0033, 0x002F, 0x0034, 0x002E, 0x002E, 0x002E, 0x2032, 0x2032, 0x2032, 0x2035,
+ 0x2035, 0x2035, 0x0061, 0x002F, 0x0063, 0x0061, 0x002F, 0x0073, 0x0063, 0x002F, 0x006F, 0x0063, 0x002F, 0x0075, 0x0054, 0x0045,
+ 0x004C, 0x0046, 0x0041, 0x0058, 0x0031, 0x002F, 0x0037, 0x0031, 0x002F, 0x0039, 0x0031, 0x002F, 0x0033, 0x0032, 0x002F, 0x0033,
+ 0x0031, 0x002F, 0x0035, 0x0032, 0x002F, 0x0035, 0x0033, 0x002F, 0x0035, 0x0034, 0x002F, 0x0035, 0x0031, 0x002F, 0x0036, 0x0035,
+ 0x002F, 0x0036, 0x0031, 0x002F, 0x0038, 0x0033, 0x002F, 0x0038, 0x0035, 0x002F, 0x0038, 0x0037, 0x002F, 0x0038, 0x0049, 0x0049,
+ 0x0049, 0x0056, 0x0049, 0x0049, 0x0058, 0x0049, 0x0049, 0x0069, 0x0069, 0x0069, 0x0076, 0x0069, 0x0069, 0x0078, 0x0069, 0x0069,
+ 0x0030, 0x2044, 0x0033, 0x222B, 0x222B, 0x222B, 0x222E, 0x222E, 0x222E, 0x004E, 0x0055, 0x004C, 0x0053, 0x004F, 0x0048, 0x0053,
+ 0x0054, 0x0058, 0x0045, 0x0054, 0x0058, 0x0045, 0x004F, 0x0054, 0x0045, 0x004E, 0x0051, 0x0041, 0x0043, 0x004B, 0x0042, 0x0045,
+ 0x004C, 0x0044, 0x004C, 0x0045, 0x0044, 0x0043, 0x0031, 0x0044, 0x0043, 0x0032, 0x0044, 0x0043, 0x0033, 0x0044, 0x0043, 0x0034,
+ 0x004E, 0x0041, 0x004B, 0x0053, 0x0059, 0x004E, 0x0045, 0x0054, 0x0042, 0x0043, 0x0041, 0x004E, 0x0053, 0x0055, 0x0042, 0x0045,
+ 0x0053, 0x0043, 0x0044, 0x0045, 0x004C, 0x0028, 0x0031, 0x0029, 0x0028, 0x0032, 0x0029, 0x0028, 0x0033, 0x0029, 0x0028, 0x0034,
+ 0x0029, 0x0028, 0x0035, 0x0029, 0x0028, 0x0036, 0x0029, 0x0028, 0x0037, 0x0029, 0x0028, 0x0038, 0x0029, 0x0028, 0x0039, 0x0029,
+ 0x0031, 0x0030, 0x002E, 0x0031, 0x0031, 0x002E, 0x0031, 0x0032, 0x002E, 0x0031, 0x0033, 0x002E, 0x0031, 0x0034, 0x002E, 0x0031,
+ 0x0035, 0x002E, 0x0031, 0x0036, 0x002E, 0x0031, 0x0037, 0x002E, 0x0031, 0x0038, 0x002E, 0x0031, 0x0039, 0x002E, 0x0032, 0x0030,
+ 0x002E, 0x0028, 0x0061, 0x0029, 0x0028, 0x0062, 0x0029, 0x0028, 0x0063, 0x0029, 0x0028, 0x0064, 0x0029, 0x0028, 0x0065, 0x0029,
+ 0x0028, 0x0066, 0x0029, 0x0028, 0x0067, 0x0029, 0x0028, 0x0068, 0x0029, 0x0028, 0x0069, 0x0029, 0x0028, 0x006A, 0x0029, 0x0028,
+ 0x006B, 0x0029, 0x0028, 0x006C, 0x0029, 0x0028, 0x006D, 0x0029, 0x0028, 0x006E, 0x0029, 0x0028, 0x006F, 0x0029, 0x0028, 0x0070,
+ 0x0029, 0x0028, 0x0071, 0x0029, 0x0028, 0x0072, 0x0029, 0x0028, 0x0073, 0x0029, 0x0028, 0x0074, 0x0029, 0x0028, 0x0075, 0x0029,
+ 0x0028, 0x0076, 0x0029, 0x0028, 0x0077, 0x0029, 0x0028, 0x0078, 0x0029, 0x0028, 0x0079, 0x0029, 0x0028, 0x007A, 0x0029, 0x003A,
+ 0x003A, 0x003D, 0x003D, 0x003D, 0x003D, 0x0028, 0x1100, 0x0029, 0x0028, 0x1102, 0x0029, 0x0028, 0x1103, 0x0029, 0x0028, 0x1105,
+ 0x0029, 0x0028, 0x1106, 0x0029, 0x0028, 0x1107, 0x0029, 0x0028, 0x1109, 0x0029, 0x0028, 0x110B, 0x0029, 0x0028, 0x110C, 0x0029,
+ 0x0028, 0x110E, 0x0029, 0x0028, 0x110F, 0x0029, 0x0028, 0x1110, 0x0029, 0x0028, 0x1111, 0x0029, 0x0028, 0x1112, 0x0029, 0x0028,
+ 0x4E00, 0x0029, 0x0028, 0x4E8C, 0x0029, 0x0028, 0x4E09, 0x0029, 0x0028, 0x56DB, 0x0029, 0x0028, 0x4E94, 0x0029, 0x0028, 0x516D,
+ 0x0029, 0x0028, 0x4E03, 0x0029, 0x0028, 0x516B, 0x0029, 0x0028, 0x4E5D, 0x0029, 0x0028, 0x5341, 0x0029, 0x0028, 0x6708, 0x0029,
+ 0x0028, 0x706B, 0x0029, 0x0028, 0x6C34, 0x0029, 0x0028, 0x6728, 0x0029, 0x0028, 0x91D1, 0x0029, 0x0028, 0x571F, 0x0029, 0x0028,
+ 0x65E5, 0x0029, 0x0028, 0x682A, 0x0029, 0x0028, 0x6709, 0x0029, 0x0028, 0x793E, 0x0029, 0x0028, 0x540D, 0x0029, 0x0028, 0x7279,
+ 0x0029, 0x0028, 0x8CA1, 0x0029, 0x0028, 0x795D, 0x0029, 0x0028, 0x52B4, 0x0029, 0x0028, 0x4EE3, 0x0029, 0x0028, 0x547C, 0x0029,
+ 0x0028, 0x5B66, 0x0029, 0x0028, 0x76E3, 0x0029, 0x0028, 0x4F01, 0x0029, 0x0028, 0x8CC7, 0x0029, 0x0028, 0x5354, 0x0029, 0x0028,
+ 0x796D, 0x0029, 0x0028, 0x4F11, 0x0029, 0x0028, 0x81EA, 0x0029, 0x0028, 0x81F3, 0x0029, 0x0050, 0x0054, 0x0045, 0x0031, 0x0030,
+ 0x6708, 0x0031, 0x0031, 0x6708, 0x0031, 0x0032, 0x6708, 0x0065, 0x0072, 0x0067, 0x004C, 0x0054, 0x0044, 0x30A2, 0x30FC, 0x30EB,
+ 0x30A4, 0x30F3, 0x30C1, 0x30A6, 0x30A9, 0x30F3, 0x30AA, 0x30F3, 0x30B9, 0x30AA, 0x30FC, 0x30E0, 0x30AB, 0x30A4, 0x30EA, 0x30AC,
+ 0x30ED, 0x30F3, 0x30AC, 0x30F3, 0x30DE, 0x30AE, 0x30CB, 0x30FC, 0x30B0, 0x30E9, 0x30E0, 0x30B1, 0x30FC, 0x30B9, 0x30B3, 0x30EB,
+ 0x30CA, 0x30B3, 0x30FC, 0x30DD, 0x30BB, 0x30F3, 0x30C1, 0x30BB, 0x30F3, 0x30C8, 0x30C0, 0x30FC, 0x30B9, 0x30CE, 0x30C3, 0x30C8,
+ 0x30CF, 0x30A4, 0x30C4, 0x30D1, 0x30FC, 0x30C4, 0x30D4, 0x30AF, 0x30EB, 0x30D5, 0x30E9, 0x30F3, 0x30DA, 0x30CB, 0x30D2, 0x30D8,
+ 0x30EB, 0x30C4, 0x30DA, 0x30F3, 0x30B9, 0x30DA, 0x30FC, 0x30B8, 0x30D9, 0x30FC, 0x30BF, 0x30DC, 0x30EB, 0x30C8, 0x30DD, 0x30F3,
+ 0x30C9, 0x30DB, 0x30FC, 0x30EB, 0x30DB, 0x30FC, 0x30F3, 0x30DE, 0x30A4, 0x30EB, 0x30DE, 0x30C3, 0x30CF, 0x30DE, 0x30EB, 0x30AF,
+ 0x30E4, 0x30FC, 0x30C9, 0x30E4, 0x30FC, 0x30EB, 0x30E6, 0x30A2, 0x30F3, 0x30EB, 0x30D4, 0x30FC, 0x30EF, 0x30C3, 0x30C8, 0x0031,
+ 0x0030, 0x70B9, 0x0031, 0x0031, 0x70B9, 0x0031, 0x0032, 0x70B9, 0x0031, 0x0033, 0x70B9, 0x0031, 0x0034, 0x70B9, 0x0031, 0x0035,
+ 0x70B9, 0x0031, 0x0036, 0x70B9, 0x0031, 0x0037, 0x70B9, 0x0031, 0x0038, 0x70B9, 0x0031, 0x0039, 0x70B9, 0x0032, 0x0030, 0x70B9,
+ 0x0032, 0x0031, 0x70B9, 0x0032, 0x0032, 0x70B9, 0x0032, 0x0033, 0x70B9, 0x0032, 0x0034, 0x70B9, 0x0068, 0x0050, 0x0061, 0x0062,
+ 0x0061, 0x0072, 0x0064, 0x006D, 0x00B2, 0x0064, 0x006D, 0x00B3, 0x0063, 0x0061, 0x006C, 0x006B, 0x0048, 0x007A, 0x004D, 0x0048,
+ 0x007A, 0x0047, 0x0048, 0x007A, 0x0054, 0x0048, 0x007A, 0x006D, 0x006D, 0x00B2, 0x0063, 0x006D, 0x00B2, 0x006B, 0x006D, 0x00B2,
+ 0x006D, 0x006D, 0x00B3, 0x0063, 0x006D, 0x00B3, 0x006B, 0x006D, 0x00B3, 0x006D, 0x2215, 0x0073, 0x006B, 0x0050, 0x0061, 0x004D,
+ 0x0050, 0x0061, 0x0047, 0x0050, 0x0061, 0x0072, 0x0061, 0x0064, 0x0043, 0x006F, 0x002E, 0x006C, 0x006F, 0x0067, 0x006D, 0x0069,
+ 0x006C, 0x006D, 0x006F, 0x006C, 0x0050, 0x0050, 0x004D, 0x0056, 0x2215, 0x006D, 0x0041, 0x2215, 0x006D, 0x0031, 0x0030, 0x65E5,
+ 0x0031, 0x0031, 0x65E5, 0x0031, 0x0032, 0x65E5, 0x0031, 0x0033, 0x65E5, 0x0031, 0x0034, 0x65E5, 0x0031, 0x0035, 0x65E5, 0x0031,
+ 0x0036, 0x65E5, 0x0031, 0x0037, 0x65E5, 0x0031, 0x0038, 0x65E5, 0x0031, 0x0039, 0x65E5, 0x0032, 0x0030, 0x65E5, 0x0032, 0x0031,
+ 0x65E5, 0x0032, 0x0032, 0x65E5, 0x0032, 0x0033, 0x65E5, 0x0032, 0x0034, 0x65E5, 0x0032, 0x0035, 0x65E5, 0x0032, 0x0036, 0x65E5,
+ 0x0032, 0x0037, 0x65E5, 0x0032, 0x0038, 0x65E5, 0x0032, 0x0039, 0x65E5, 0x0033, 0x0030, 0x65E5, 0x0033, 0x0031, 0x65E5, 0x0067,
+ 0x0061, 0x006C, 0x0066, 0x0066, 0x0069, 0x0066, 0x0066, 0x006C, 0x0640, 0x064E, 0x0651, 0x0640, 0x064F, 0x0651, 0x0640, 0x0650,
+ 0x0651, 0x062A, 0x062C, 0x0645, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x062C, 0x062A, 0x062D, 0x0645, 0x062A, 0x062E, 0x0645,
+ 0x062A, 0x0645, 0x062C, 0x062A, 0x0645, 0x062D, 0x062A, 0x0645, 0x062E, 0x062C, 0x0645, 0x062D, 0x062C, 0x0645, 0x062D, 0x062D,
+ 0x0645, 0x064A, 0x062D, 0x0645, 0x0649, 0x0633, 0x062D, 0x062C, 0x0633, 0x062C, 0x062D, 0x0633, 0x062C, 0x0649, 0x0633, 0x0645,
+ 0x062D, 0x0633, 0x0645, 0x062D, 0x0633, 0x0645, 0x062C, 0x0633, 0x0645, 0x0645, 0x0633, 0x0645, 0x0645, 0x0635, 0x062D, 0x062D,
+ 0x0635, 0x062D, 0x062D, 0x0635, 0x0645, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062D, 0x0645, 0x0634, 0x062C, 0x064A, 0x0634,
+ 0x0645, 0x062E, 0x0634, 0x0645, 0x062E, 0x0634, 0x0645, 0x0645, 0x0634, 0x0645, 0x0645, 0x0636, 0x062D, 0x0649, 0x0636, 0x062E,
+ 0x0645, 0x0636, 0x062E, 0x0645, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x062D, 0x0637, 0x0645, 0x0645, 0x0637, 0x0645, 0x064A,
+ 0x0639, 0x062C, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0645, 0x0639, 0x0645, 0x0649, 0x063A, 0x0645, 0x0645, 0x063A,
+ 0x0645, 0x064A, 0x063A, 0x0645, 0x0649, 0x0641, 0x062E, 0x0645, 0x0641, 0x062E, 0x0645, 0x0642, 0x0645, 0x062D, 0x0642, 0x0645,
+ 0x0645, 0x0644, 0x062D, 0x0645, 0x0644, 0x062D, 0x064A, 0x0644, 0x062D, 0x0649, 0x0644, 0x062C, 0x062C, 0x0644, 0x062C, 0x062C,
+ 0x0644, 0x062E, 0x0645, 0x0644, 0x062E, 0x0645, 0x0644, 0x0645, 0x062D, 0x0644, 0x0645, 0x062D, 0x0645, 0x062D, 0x062C, 0x0645,
+ 0x062D, 0x0645, 0x0645, 0x062D, 0x064A, 0x0645, 0x062C, 0x062D, 0x0645, 0x062C, 0x0645, 0x0645, 0x062E, 0x062C, 0x0645, 0x062E,
+ 0x0645, 0x0645, 0x062C, 0x062E, 0x0647, 0x0645, 0x062C, 0x0647, 0x0645, 0x0645, 0x0646, 0x062D, 0x0645, 0x0646, 0x062D, 0x0649,
+ 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0645, 0x0646, 0x062C, 0x0649, 0x0646, 0x0645, 0x064A, 0x0646, 0x0645, 0x0649, 0x064A,
+ 0x0645, 0x0645, 0x064A, 0x0645, 0x0645, 0x0628, 0x062E, 0x064A, 0x062A, 0x062C, 0x064A, 0x062A, 0x062C, 0x0649, 0x062A, 0x062E,
+ 0x064A, 0x062A, 0x062E, 0x0649, 0x062A, 0x0645, 0x064A, 0x062A, 0x0645, 0x0649, 0x062C, 0x0645, 0x064A, 0x062C, 0x062D, 0x0649,
+ 0x062C, 0x0645, 0x0649, 0x0633, 0x062E, 0x0649, 0x0635, 0x062D, 0x064A, 0x0634, 0x062D, 0x064A, 0x0636, 0x062D, 0x064A, 0x0644,
+ 0x062C, 0x064A, 0x0644, 0x0645, 0x064A, 0x064A, 0x062D, 0x064A, 0x064A, 0x062C, 0x064A, 0x064A, 0x0645, 0x064A, 0x0645, 0x0645,
+ 0x064A, 0x0642, 0x0645, 0x064A, 0x0646, 0x062D, 0x064A, 0x0642, 0x0645, 0x062D, 0x0644, 0x062D, 0x0645, 0x0639, 0x0645, 0x064A,
+ 0x0643, 0x0645, 0x064A, 0x0646, 0x062C, 0x062D, 0x0645, 0x062E, 0x064A, 0x0644, 0x062C, 0x0645, 0x0643, 0x0645, 0x0645, 0x0644,
+ 0x062C, 0x0645, 0x0646, 0x062C, 0x062D, 0x062C, 0x062D, 0x064A, 0x062D, 0x062C, 0x064A, 0x0645, 0x062C, 0x064A, 0x0641, 0x0645,
+ 0x064A, 0x0628, 0x062D, 0x064A, 0x0643, 0x0645, 0x0645, 0x0639, 0x062C, 0x0645, 0x0635, 0x0645, 0x0645, 0x0633, 0x062E, 0x064A,
+ 0x0646, 0x062C, 0x064A, 0x0635, 0x0644, 0x06D2, 0x0642, 0x0644, 0x06D2, 0x0635, 0x0644, 0x0649
+};
+extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488] = {
+ 0x0004, 0x2032, 0x2032, 0x2032, 0x2032, 0x0004, 0x0031, 0x002F, 0x0031, 0x0030, 0x0004, 0x0056, 0x0049, 0x0049, 0x0049, 0x0004,
+ 0x0076, 0x0069, 0x0069, 0x0069, 0x0004, 0x0028, 0x0031, 0x0030, 0x0029, 0x0004, 0x0028, 0x0031, 0x0031, 0x0029, 0x0004, 0x0028,
+ 0x0031, 0x0032, 0x0029, 0x0004, 0x0028, 0x0031, 0x0033, 0x0029, 0x0004, 0x0028, 0x0031, 0x0034, 0x0029, 0x0004, 0x0028, 0x0031,
+ 0x0035, 0x0029, 0x0004, 0x0028, 0x0031, 0x0036, 0x0029, 0x0004, 0x0028, 0x0031, 0x0037, 0x0029, 0x0004, 0x0028, 0x0031, 0x0038,
+ 0x0029, 0x0004, 0x0028, 0x0031, 0x0039, 0x0029, 0x0004, 0x0028, 0x0032, 0x0030, 0x0029, 0x0004, 0x222B, 0x222B, 0x222B, 0x222B,
+ 0x0004, 0x0028, 0x1100, 0x1161, 0x0029, 0x0004, 0x0028, 0x1102, 0x1161, 0x0029, 0x0004, 0x0028, 0x1103, 0x1161, 0x0029, 0x0004,
+ 0x0028, 0x1105, 0x1161, 0x0029, 0x0004, 0x0028, 0x1106, 0x1161, 0x0029, 0x0004, 0x0028, 0x1107, 0x1161, 0x0029, 0x0004, 0x0028,
+ 0x1109, 0x1161, 0x0029, 0x0004, 0x0028, 0x110B, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x1161, 0x0029, 0x0004, 0x0028, 0x110E,
+ 0x1161, 0x0029, 0x0004, 0x0028, 0x110F, 0x1161, 0x0029, 0x0004, 0x0028, 0x1110, 0x1161, 0x0029, 0x0004, 0x0028, 0x1111, 0x1161,
+ 0x0029, 0x0004, 0x0028, 0x1112, 0x1161, 0x0029, 0x0004, 0x0028, 0x110C, 0x116E, 0x0029, 0x0007, 0x0028, 0x110B, 0x1169, 0x110C,
+ 0x1165, 0x11AB, 0x0029, 0x0006, 0x0028, 0x110B, 0x1169, 0x1112, 0x116E, 0x0029, 0x0005, 0x110E, 0x1161, 0x11B7, 0x1100, 0x1169,
+ 0x0004, 0x110C, 0x116E, 0x110B, 0x1174, 0x0004, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0x0004, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0x0004,
+ 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0x0004, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0x0005, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0x0004,
+ 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0x0004, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0x0004, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0x0004, 0x30AD,
+ 0x30E5, 0x30EA, 0x30FC, 0x0004, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0x0005, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0x0006, 0x30AD,
+ 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0005, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0x0005, 0x30B0, 0x30E9, 0x30E0, 0x30C8,
+ 0x30F3, 0x0005, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0x0004, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0x0004, 0x30B5, 0x30A4, 0x30AF,
+ 0x30EB, 0x0005, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0x0004, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0x0005, 0x30D1, 0x30FC, 0x30BB,
+ 0x30F3, 0x30C8, 0x0004, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0x0005, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0x0005, 0x30D5, 0x30A1,
+ 0x30E9, 0x30C3, 0x30C9, 0x0004, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0x0005, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0x0005, 0x30D8,
+ 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0x0004, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0x0004, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0x0005, 0x30DE,
+ 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0x0004, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0x0005, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0x0004,
+ 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0x0004, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0x0004, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0x0004, 0x30EB,
+ 0x30FC, 0x30D6, 0x30EB, 0x0005, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0x0004, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0x0004, 0x006B,
+ 0x0063, 0x0061, 0x006C, 0x0004, 0x006D, 0x2215, 0x0073, 0x00B2, 0x0005, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x0006, 0x0072,
+ 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0x0004, 0x0061, 0x002E, 0x006D, 0x002E, 0x0004, 0x0043, 0x2215, 0x006B, 0x0067, 0x0004,
+ 0x0070, 0x002E, 0x006D, 0x002E, 0x0004, 0x0627, 0x0644, 0x0644, 0x0647, 0x0004, 0x0627, 0x0643, 0x0628, 0x0631, 0x0004, 0x0645,
+ 0x062D, 0x0645, 0x062F, 0x0004, 0x0635, 0x0644, 0x0639, 0x0645, 0x0004, 0x0631, 0x0633, 0x0648, 0x0644, 0x0004, 0x0639, 0x0644,
+ 0x064A, 0x0647, 0x0004, 0x0648, 0x0633, 0x0644, 0x0645, 0x0012, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647,
+ 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0x0008, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644,
+ 0x0627, 0x0644, 0x0647, 0x0004, 0x0631, 0x06CC, 0x0627, 0x0644
+};
diff --git a/core/src/fx_freetype.h b/core/src/fx_freetype.h
new file mode 100644
index 0000000000..7c50f68ca3
--- /dev/null
+++ b/core/src/fx_freetype.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_FREETYPE_H_
+#define _FX_SRC_FREETYPE_H_
+#include "./fxge/fx_freetype/fxft2.5.01/include/ft2build.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h"
+#include "./fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h"
+#endif
diff --git a/core/src/fx_jpeglib.h b/core/src/fx_jpeglib.h
new file mode 100644
index 0000000000..1ce2172328
--- /dev/null
+++ b/core/src/fx_jpeglib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_JPEGLIB_H_
+#define _FX_SRC_JPEGLIB_H_
+#include "./fxcodec/libjpeg/jpeglib.h"
+#endif
diff --git a/core/src/fx_zlib.h b/core/src/fx_zlib.h
new file mode 100644
index 0000000000..3c6c5a8e78
--- /dev/null
+++ b/core/src/fx_zlib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SRC_ZLIB_H_
+#define _FX_SRC_ZLIB_H_
+#include "./fxcodec/fx_zlib/zlib_v128/zlib.h"
+#endif
diff --git a/core/src/fxcodec/codec/codec_int.h b/core/src/fxcodec/codec/codec_int.h
new file mode 100644
index 0000000000..571af61470
--- /dev/null
+++ b/core/src/fxcodec/codec/codec_int.h
@@ -0,0 +1,270 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include <limits.h>
+class CCodec_BasicModule : public ICodec_BasicModule
+{
+public:
+ virtual FX_BOOL RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size);
+ virtual FX_BOOL A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size);
+ virtual ICodec_ScanlineDecoder* CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc);
+};
+struct CCodec_ImageDataCache {
+ int m_Width, m_Height;
+ int m_nCachedLines;
+ FX_BYTE m_Data;
+};
+class CCodec_ScanlineDecoder : public ICodec_ScanlineDecoder
+{
+public:
+
+ CCodec_ScanlineDecoder();
+
+ virtual ~CCodec_ScanlineDecoder();
+
+ virtual FX_DWORD GetSrcOffset()
+ {
+ return -1;
+ }
+
+ virtual void DownScale(int dest_width, int dest_height);
+
+ FX_LPBYTE GetScanline(int line);
+
+ FX_BOOL SkipToScanline(int line, IFX_Pause* pPause);
+
+ int GetWidth()
+ {
+ return m_OutputWidth;
+ }
+
+ int GetHeight()
+ {
+ return m_OutputHeight;
+ }
+
+ int CountComps()
+ {
+ return m_nComps;
+ }
+
+ int GetBPC()
+ {
+ return m_bpc;
+ }
+
+ FX_BOOL IsColorTransformed()
+ {
+ return m_bColorTransformed;
+ }
+
+ void ClearImageData()
+ {
+ if (m_pDataCache) {
+ FX_Free(m_pDataCache);
+ }
+ m_pDataCache = NULL;
+ }
+protected:
+
+ int m_OrigWidth;
+
+ int m_OrigHeight;
+
+ int m_DownScale;
+
+ int m_OutputWidth;
+
+ int m_OutputHeight;
+
+ int m_nComps;
+
+ int m_bpc;
+
+ int m_Pitch;
+
+ FX_BOOL m_bColorTransformed;
+
+ FX_LPBYTE ReadNextLine();
+
+ virtual FX_BOOL v_Rewind() = 0;
+
+ virtual FX_LPBYTE v_GetNextLine() = 0;
+
+ virtual void v_DownScale(int dest_width, int dest_height) = 0;
+
+ int m_NextLine;
+
+ FX_LPBYTE m_pLastScanline;
+
+ CCodec_ImageDataCache* m_pDataCache;
+};
+class CCodec_FaxModule : public ICodec_FaxModule
+{
+public:
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
+ FX_BOOL Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+};
+class CCodec_FlateModule : public ICodec_FlateModule
+{
+public:
+ virtual ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns);
+ virtual FX_DWORD FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ virtual FX_BOOL Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ virtual FX_BOOL Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+};
+class CCodec_JpegModule : public ICodec_JpegModule
+{
+public:
+ CCodec_JpegModule() : m_pExtProvider(NULL) {}
+ void SetPovider(IFX_JpegProvider* pJP)
+ {
+ m_pExtProvider = pJP;
+ }
+ ICodec_ScanlineDecoder* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
+ int width, int height, int nComps, FX_BOOL ColorTransform);
+ FX_BOOL LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length);
+ FX_BOOL Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length);
+ virtual void* Start();
+ virtual void Finish(void* pContext);
+ virtual void Input(void* pContext, FX_LPCBYTE src_buf, FX_DWORD src_size);
+ virtual int ReadHeader(void* pContext, int* width, int* height, int* nComps);
+ virtual FX_BOOL StartScanline(void* pContext, int down_scale);
+ virtual FX_BOOL ReadScanline(void* pContext, FX_LPBYTE dest_buf);
+ virtual FX_DWORD GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr);
+protected:
+ IFX_JpegProvider* m_pExtProvider;
+};
+class CCodec_IccModule : public ICodec_IccModule
+{
+public:
+ virtual IccCS GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize);
+ virtual IccCS GetProfileCS(IFX_FileRead* pFile);
+ virtual FX_LPVOID CreateTransform(ICodec_IccModule::IccParam* pInputParam,
+ ICodec_IccModule::IccParam* pOutputParam,
+ ICodec_IccModule::IccParam* pProofParam = NULL,
+ FX_DWORD dwIntent = Icc_INTENT_PERCEPTUAL,
+ FX_DWORD dwFlag = Icc_FLAGS_DEFAULT,
+ FX_DWORD dwPrfIntent = Icc_INTENT_ABSOLUTE_COLORIMETRIC,
+ FX_DWORD dwPrfFlag = Icc_FLAGS_SOFTPROOFING
+ );
+ virtual FX_LPVOID CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT);
+ virtual FX_LPVOID CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent = 0,
+ FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT,
+ FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT
+ );
+ virtual void DestroyTransform(FX_LPVOID pTransform);
+ virtual void Translate(FX_LPVOID pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues);
+ virtual void TranslateScanline(FX_LPVOID pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels);
+ virtual ~CCodec_IccModule();
+protected:
+ CFX_MapByteStringToPtr m_MapTranform;
+ CFX_MapByteStringToPtr m_MapProfile;
+ typedef enum {
+ Icc_CLASS_INPUT = 0,
+ Icc_CLASS_OUTPUT,
+ Icc_CLASS_PROOF,
+ Icc_CLASS_MAX
+ } Icc_CLASS;
+ FX_LPVOID CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey);
+};
+class CCodec_JpxModule : public ICodec_JpxModule
+{
+public:
+ CCodec_JpxModule();
+ void* CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_BOOL useColorSpace = FALSE);
+ void GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
+ FX_BOOL Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
+ void DestroyDecoder(void* ctx);
+};
+#include "../jbig2/JBig2_Context.h"
+class CPDF_Jbig2Interface : public CFX_Object, public CJBig2_Module
+{
+public:
+ virtual void *JBig2_Malloc(FX_DWORD dwSize)
+ {
+ return FX_Alloc(FX_BYTE, dwSize);
+ }
+ virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize)
+ {
+ if (dwSize && num >= UINT_MAX / dwSize) {
+ return NULL;
+ }
+ return FX_Alloc(FX_BYTE, num * dwSize);
+ }
+ virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2)
+ {
+ if (dwSize2 && dwSize >= UINT_MAX / dwSize2) {
+ return NULL;
+ }
+ FX_DWORD size = dwSize2 * dwSize;
+ if (size && num >= UINT_MAX / size) {
+ return NULL;
+ }
+ return FX_Alloc(FX_BYTE, num * size);
+ }
+ virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize)
+ {
+ return FX_Realloc(FX_BYTE, pMem, dwSize);
+ }
+ virtual void JBig2_Free(FX_LPVOID pMem)
+ {
+ FX_Free(pMem);
+ }
+};
+class CCodec_Jbig2Context : public CFX_Object
+{
+public:
+ CCodec_Jbig2Context();
+ ~CCodec_Jbig2Context() {};
+ IFX_FileRead* m_file_ptr;
+ FX_DWORD m_width;
+ FX_DWORD m_height;
+ FX_LPBYTE m_src_buf;
+ FX_DWORD m_src_size;
+ FX_LPCBYTE m_global_data;
+ FX_DWORD m_global_size;
+ FX_LPBYTE m_dest_buf;
+ FX_DWORD m_dest_pitch;
+ FX_BOOL m_bFileReader;
+ IFX_Pause* m_pPause;
+ CJBig2_Context* m_pContext;
+ CJBig2_Image* m_dest_image;
+};
+class CCodec_Jbig2Module : public ICodec_Jbig2Module
+{
+public:
+ CCodec_Jbig2Module() {};
+ ~CCodec_Jbig2Module();
+ FX_BOOL Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch);
+ FX_BOOL Decode(IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf);
+ void* CreateJbig2Context();
+ FXCODEC_STATUS StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause);
+
+ FXCODEC_STATUS StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause);
+ FXCODEC_STATUS ContinueDecode(void* pJbig2Context, IFX_Pause* pPause);
+ void DestroyJbig2Context(void* pJbig2Context);
+ CPDF_Jbig2Interface m_Module;
+private:
+};
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
new file mode 100644
index 0000000000..2f586ca94b
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -0,0 +1,447 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+CCodec_ModuleMgr::CCodec_ModuleMgr()
+{
+ m_pBasicModule = FX_NEW CCodec_BasicModule;
+ m_pFaxModule = FX_NEW CCodec_FaxModule;
+ m_pJpegModule = FX_NEW CCodec_JpegModule;
+ m_pJpxModule = FX_NEW CCodec_JpxModule;
+ m_pJbig2Module = FX_NEW CCodec_Jbig2Module;
+ m_pIccModule = FX_NEW CCodec_IccModule;
+ m_pFlateModule = FX_NEW CCodec_FlateModule;
+}
+CCodec_ModuleMgr::~CCodec_ModuleMgr()
+{
+ delete m_pBasicModule;
+ delete m_pFaxModule;
+ delete m_pJpegModule;
+ delete m_pFlateModule;
+ delete m_pJpxModule;
+ delete m_pJbig2Module;
+ delete m_pIccModule;
+}
+void CCodec_ModuleMgr::InitJbig2Decoder()
+{
+}
+void CCodec_ModuleMgr::InitJpxDecoder()
+{
+}
+void CCodec_ModuleMgr::InitIccDecoder()
+{
+}
+CCodec_ScanlineDecoder::CCodec_ScanlineDecoder()
+{
+ m_NextLine = -1;
+ m_pDataCache = NULL;
+ m_pLastScanline = NULL;
+}
+CCodec_ScanlineDecoder::~CCodec_ScanlineDecoder()
+{
+ if (m_pDataCache) {
+ FX_Free(m_pDataCache);
+ }
+}
+FX_LPBYTE CCodec_ScanlineDecoder::GetScanline(int line)
+{
+ if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
+ return &m_pDataCache->m_Data + line * m_Pitch;
+ }
+ if (m_NextLine == line + 1) {
+ return m_pLastScanline;
+ }
+ if (m_NextLine < 0 || m_NextLine > line) {
+ if (!v_Rewind()) {
+ return NULL;
+ }
+ m_NextLine = 0;
+ }
+ while (m_NextLine < line) {
+ ReadNextLine();
+ m_NextLine ++;
+ }
+ m_pLastScanline = ReadNextLine();
+ m_NextLine ++;
+ return m_pLastScanline;
+}
+FX_BOOL CCodec_ScanlineDecoder::SkipToScanline(int line, IFX_Pause* pPause)
+{
+ if (m_pDataCache && line < m_pDataCache->m_nCachedLines) {
+ return FALSE;
+ }
+ if (m_NextLine == line || m_NextLine == line + 1) {
+ return FALSE;
+ }
+ if (m_NextLine < 0 || m_NextLine > line) {
+ v_Rewind();
+ m_NextLine = 0;
+ }
+ m_pLastScanline = NULL;
+ while (m_NextLine < line) {
+ m_pLastScanline = ReadNextLine();
+ m_NextLine ++;
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_LPBYTE CCodec_ScanlineDecoder::ReadNextLine()
+{
+ FX_LPBYTE pLine = v_GetNextLine();
+ if (pLine == NULL) {
+ return NULL;
+ }
+ if (m_pDataCache && m_NextLine == m_pDataCache->m_nCachedLines) {
+ FXSYS_memcpy32(&m_pDataCache->m_Data + m_NextLine * m_Pitch, pLine, m_Pitch);
+ m_pDataCache->m_nCachedLines ++;
+ }
+ return pLine;
+}
+void CCodec_ScanlineDecoder::DownScale(int dest_width, int dest_height)
+{
+ if (dest_width < 0) {
+ dest_width = -dest_width;
+ }
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ }
+ v_DownScale(dest_width, dest_height);
+ if (m_pDataCache) {
+ if (m_pDataCache->m_Height == m_OutputHeight && m_pDataCache->m_Width == m_OutputWidth) {
+ return;
+ }
+ FX_Free(m_pDataCache);
+ m_pDataCache = NULL;
+ }
+ m_pDataCache = (CCodec_ImageDataCache*)FXMEM_DefaultAlloc(
+ sizeof(CCodec_ImageDataCache) + m_Pitch * m_OutputHeight, FXMEM_NONLEAVE);
+ if (m_pDataCache == NULL) {
+ return;
+ }
+ m_pDataCache->m_Height = m_OutputHeight;
+ m_pDataCache->m_Width = m_OutputWidth;
+ m_pDataCache->m_nCachedLines = 0;
+}
+FX_BOOL CCodec_BasicModule::RunLengthEncode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size)
+{
+ return FALSE;
+}
+extern "C" double FXstrtod(const char* nptr, char** endptr)
+{
+ double ret = 0.0;
+ const char* ptr = nptr;
+ const char* exp_ptr = NULL;
+ int e_number = 0,
+ e_signal = 0,
+ e_point = 0,
+ is_negative = 0;
+ int exp_ret = 0, exp_sig = 1,
+ fra_ret = 0, fra_count = 0, fra_base = 1;
+ if(nptr == NULL) {
+ return 0.0;
+ }
+ for (;; ptr++) {
+ if(!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) {
+ continue;
+ }
+ if(*ptr >= '0' && *ptr <= '9') {
+ if(!e_number) {
+ e_number = 1;
+ }
+ if(!e_point) {
+ ret *= 10;
+ ret += (*ptr - '0');
+ } else {
+ fra_count++;
+ fra_ret *= 10;
+ fra_ret += (*ptr - '0');
+ }
+ continue;
+ }
+ if(!e_point && *ptr == '.') {
+ e_point = 1;
+ continue;
+ }
+ if(!e_number && !e_point && !e_signal) {
+ switch(*ptr) {
+ case '-':
+ is_negative = 1;
+ case '+':
+ e_signal = 1;
+ continue;
+ }
+ }
+ if(e_number && (*ptr == 'e' || *ptr == 'E')) {
+#define EXPONENT_DETECT(ptr) \
+ for(;;ptr++){ \
+ if(*ptr < '0' || *ptr > '9'){ \
+ if(endptr) *endptr = (char*)ptr; \
+ break; \
+ }else{ \
+ exp_ret *= 10; \
+ exp_ret += (*ptr - '0'); \
+ continue; \
+ } \
+ }
+ exp_ptr = ptr++;
+ if(*ptr == '+' || *ptr == '-') {
+ exp_sig = (*ptr++ == '+') ? 1 : -1;
+ if(*ptr < '0' || *ptr > '9') {
+ if(endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+ EXPONENT_DETECT(ptr);
+ } else if(*ptr >= '0' && *ptr <= '9') {
+ EXPONENT_DETECT(ptr);
+ } else {
+ if(endptr) {
+ *endptr = (char*)exp_ptr;
+ }
+ break;
+ }
+#undef EXPONENT_DETECT
+ break;
+ }
+ if(ptr != nptr && !e_number) {
+ if(endptr) {
+ *endptr = (char*)nptr;
+ }
+ break;
+ }
+ if(endptr) {
+ *endptr = (char*)ptr;
+ }
+ break;
+ }
+ while(fra_count--) {
+ fra_base *= 10;
+ }
+ ret += (double)fra_ret / (double)fra_base;
+ if(exp_sig == 1) {
+ while(exp_ret--) {
+ ret *= 10.0;
+ }
+ } else {
+ while(exp_ret--) {
+ ret /= 10.0;
+ }
+ }
+ return is_negative ? -ret : ret;
+}
+FX_BOOL CCodec_BasicModule::A85Encode(const FX_BYTE* src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf,
+ FX_DWORD& dest_size)
+{
+ return FALSE;
+}
+CCodec_ModuleMgr* CCodec_ModuleMgr::Create()
+{
+ return FX_NEW CCodec_ModuleMgr;
+}
+void CCodec_ModuleMgr::Destroy()
+{
+ delete this;
+}
+class CCodec_RLScanlineDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_RLScanlineDecoder();
+ virtual ~CCodec_RLScanlineDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc);
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset()
+ {
+ return m_SrcOffset;
+ }
+protected:
+ FX_BOOL CheckDestSize();
+ void GetNextOperator();
+ void UpdateOperator(FX_BYTE used_bytes);
+
+ FX_LPBYTE m_pScanline;
+ FX_LPCBYTE m_pSrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_DWORD m_dwLineBytes;
+ FX_DWORD m_SrcOffset;
+ FX_BOOL m_bEOD;
+ FX_BYTE m_Operator;
+};
+CCodec_RLScanlineDecoder::CCodec_RLScanlineDecoder()
+ : m_pScanline(NULL)
+ , m_pSrcBuf(NULL)
+ , m_SrcSize(0)
+ , m_dwLineBytes(0)
+ , m_SrcOffset(0)
+ , m_bEOD(FALSE)
+ , m_Operator(0)
+{
+}
+CCodec_RLScanlineDecoder::~CCodec_RLScanlineDecoder()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+}
+FX_BOOL CCodec_RLScanlineDecoder::CheckDestSize()
+{
+ FX_DWORD i = 0;
+ FX_DWORD old_size = 0;
+ FX_DWORD dest_size = 0;
+ while (i < m_SrcSize) {
+ if (m_pSrcBuf[i] < 128) {
+ old_size = dest_size;
+ dest_size += m_pSrcBuf[i] + 1;
+ if (dest_size < old_size) {
+ return FALSE;
+ }
+ i += m_pSrcBuf[i] + 2;
+ } else if (m_pSrcBuf[i] > 128) {
+ old_size = dest_size;
+ dest_size += 257 - m_pSrcBuf[i];
+ if (dest_size < old_size) {
+ return FALSE;
+ }
+ i += 2;
+ } else {
+ break;
+ }
+ }
+ if (((FX_DWORD)m_OrigWidth * m_nComps * m_bpc * m_OrigHeight + 7) / 8 > dest_size) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_RLScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc)
+{
+ m_pSrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ m_nComps = nComps;
+ m_bpc = bpc;
+ m_bColorTransformed = FALSE;
+ m_DownScale = 1;
+ m_Pitch = (width * nComps * bpc + 31) / 32 * 4;
+ m_dwLineBytes = (width * nComps * bpc + 7) / 8;
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ return CheckDestSize();
+}
+FX_BOOL CCodec_RLScanlineDecoder::v_Rewind()
+{
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ m_SrcOffset = 0;
+ m_bEOD = FALSE;
+ m_Operator = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_RLScanlineDecoder::v_GetNextLine()
+{
+ if (m_SrcOffset == 0) {
+ GetNextOperator();
+ } else {
+ if (m_bEOD) {
+ return NULL;
+ }
+ }
+ FXSYS_memset32(m_pScanline, 0, m_Pitch);
+ FX_DWORD col_pos = 0;
+ FX_BOOL eol = FALSE;
+ while (m_SrcOffset < m_SrcSize && !eol) {
+ if (m_Operator < 128) {
+ FX_DWORD copy_len = m_Operator + 1;
+ if (col_pos + copy_len >= m_dwLineBytes) {
+ copy_len = m_dwLineBytes - col_pos;
+ eol = TRUE;
+ }
+ if (copy_len >= m_SrcSize - m_SrcOffset) {
+ copy_len = m_SrcSize - m_SrcOffset;
+ m_bEOD = TRUE;
+ }
+ FXSYS_memcpy32(m_pScanline + col_pos, m_pSrcBuf + m_SrcOffset, copy_len);
+ col_pos += copy_len;
+ UpdateOperator((FX_BYTE)copy_len);
+ } else if (m_Operator > 128) {
+ int fill = 0;
+ if (m_SrcOffset - 1 < m_SrcSize - 1) {
+ fill = m_pSrcBuf[m_SrcOffset];
+ }
+ FX_DWORD duplicate_len = 257 - m_Operator;
+ if (col_pos + duplicate_len >= m_dwLineBytes) {
+ duplicate_len = m_dwLineBytes - col_pos;
+ eol = TRUE;
+ }
+ FXSYS_memset8(m_pScanline + col_pos, fill, duplicate_len);
+ col_pos += duplicate_len;
+ UpdateOperator((FX_BYTE)duplicate_len);
+ } else {
+ m_bEOD = TRUE;
+ break;
+ }
+ }
+ return m_pScanline;
+}
+void CCodec_RLScanlineDecoder::GetNextOperator()
+{
+ if (m_SrcOffset >= m_SrcSize) {
+ m_Operator = 128;
+ return;
+ }
+ m_Operator = m_pSrcBuf[m_SrcOffset];
+ m_SrcOffset ++;
+}
+void CCodec_RLScanlineDecoder::UpdateOperator(FX_BYTE used_bytes)
+{
+ if (used_bytes == 0) {
+ return;
+ }
+ if (m_Operator < 128) {
+ FXSYS_assert((FX_DWORD)m_Operator + 1 >= used_bytes);
+ if (used_bytes == m_Operator + 1) {
+ m_SrcOffset += used_bytes;
+ GetNextOperator();
+ return;
+ }
+ m_Operator -= used_bytes;
+ m_SrcOffset += used_bytes;
+ if (m_SrcOffset >= m_SrcSize) {
+ m_Operator = 128;
+ }
+ return;
+ }
+ FX_BYTE count = 257 - m_Operator;
+ FXSYS_assert((FX_DWORD)count >= used_bytes);
+ if (used_bytes == count) {
+ m_SrcOffset ++;
+ GetNextOperator();
+ return;
+ }
+ count -= used_bytes;
+ m_Operator = 257 - count;
+}
+ICodec_ScanlineDecoder* CCodec_BasicModule::CreateRunLengthDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc)
+{
+ CCodec_RLScanlineDecoder* pRLScanlineDecoder = FX_NEW CCodec_RLScanlineDecoder;
+ if (pRLScanlineDecoder == NULL) {
+ return NULL;
+ }
+ if (!pRLScanlineDecoder->Create(src_buf, src_size, width, height, nComps, bpc)) {
+ delete pRLScanlineDecoder;
+ return NULL;
+ }
+ return pRLScanlineDecoder;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_fax.cpp b/core/src/fxcodec/codec/fx_codec_fax.cpp
new file mode 100644
index 0000000000..21c7deb076
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_fax.cpp
@@ -0,0 +1,968 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+extern const FX_BYTE OneLeadPos[256];
+extern const FX_BYTE ZeroLeadPos[256];
+int _FindBit(const FX_BYTE* data_buf, int max_pos, int start_pos, int bit)
+{
+ if (start_pos >= max_pos) {
+ return max_pos;
+ }
+ FX_LPCBYTE leading_pos = bit ? OneLeadPos : ZeroLeadPos;
+ if (start_pos % 8) {
+ FX_BYTE data = data_buf[start_pos / 8];
+ if (bit) {
+ data &= 0xff >> (start_pos % 8);
+ } else {
+ data |= 0xff << (8 - start_pos % 8);
+ }
+ if (leading_pos[data] < 8) {
+ return start_pos / 8 * 8 + leading_pos[data];
+ }
+ start_pos += 7;
+ }
+ FX_BYTE skip = bit ? 0x00 : 0xff;
+ int byte_pos = start_pos / 8;
+ int max_byte = (max_pos + 7) / 8;
+ while (byte_pos < max_byte) {
+ if (data_buf[byte_pos] != skip) {
+ break;
+ }
+ byte_pos ++;
+ }
+ if (byte_pos == max_byte) {
+ return max_pos;
+ }
+ int pos = leading_pos[data_buf[byte_pos]] + byte_pos * 8;
+ if (pos > max_pos) {
+ pos = max_pos;
+ }
+ return pos;
+}
+void _FaxG4FindB1B2(const FX_BYTE* ref_buf, int columns, int a0, FX_BOOL a0color, int& b1, int& b2)
+{
+ if (a0color) {
+ a0color = 1;
+ }
+ FX_BYTE first_bit = (a0 < 0) ? 1 : ((ref_buf[a0 / 8] & (1 << (7 - a0 % 8))) != 0);
+ b1 = _FindBit(ref_buf, columns, a0 + 1, !first_bit);
+ if (b1 >= columns) {
+ b1 = b2 = columns;
+ return;
+ }
+ if (first_bit == !a0color) {
+ b1 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
+ first_bit = !first_bit;
+ }
+ if (b1 >= columns) {
+ b1 = b2 = columns;
+ return;
+ }
+ b2 = _FindBit(ref_buf, columns, b1 + 1, first_bit);
+}
+void _FaxFillBits(FX_LPBYTE dest_buf, int columns, int startpos, int endpos)
+{
+ if (startpos < 0) {
+ startpos = 0;
+ }
+ if (endpos < 0) {
+ endpos = 0;
+ }
+ if (endpos >= columns) {
+ endpos = columns;
+ }
+ if (startpos >= endpos) {
+ return;
+ }
+ int first_byte = startpos / 8;
+ int last_byte = (endpos - 1) / 8;
+ if (first_byte == last_byte) {
+ for (int i = startpos % 8; i <= (endpos - 1) % 8; i ++) {
+ dest_buf[first_byte] -= 1 << (7 - i);
+ }
+ return;
+ }
+ int i;
+ for (i = startpos % 8; i < 8; i ++) {
+ dest_buf[first_byte] -= 1 << (7 - i);
+ }
+ for (i = 0; i <= (endpos - 1) % 8; i ++) {
+ dest_buf[last_byte] -= 1 << (7 - i);
+ }
+ if (last_byte > first_byte + 1) {
+ FXSYS_memset32(dest_buf + first_byte + 1, 0, last_byte - first_byte - 1);
+ }
+}
+#define NEXTBIT src_buf[bitpos/8] & (1 << (7-bitpos%8)); bitpos ++;
+#define ADDBIT(code, bit) code = code << 1; if (bit) code ++;
+#define GETBIT(bitpos) src_buf[bitpos/8] & (1 << (7-bitpos%8))
+static const FX_BYTE FaxBlackRunIns[] = {
+ 0,
+ 2,
+ 0x02, 3, 0,
+ 0x03, 2, 0,
+ 2,
+ 0x02, 1, 0,
+ 0x03, 4, 0,
+ 2,
+ 0x02, 6, 0,
+ 0x03, 5, 0,
+ 1,
+ 0x03, 7, 0,
+ 2,
+ 0x04, 9, 0,
+ 0x05, 8, 0,
+ 3,
+ 0x04, 10, 0,
+ 0x05, 11, 0,
+ 0x07, 12, 0,
+ 2,
+ 0x04, 13, 0,
+ 0x07, 14, 0,
+ 1,
+ 0x18, 15, 0,
+ 5,
+ 0x08, 18, 0,
+ 0x0f, 64, 0,
+ 0x17, 16, 0,
+ 0x18, 17, 0,
+ 0x37, 0, 0,
+ 10,
+ 0x08, 0x00, 0x07,
+ 0x0c, 0x40, 0x07,
+ 0x0d, 0x80, 0x07,
+ 0x17, 24, 0,
+ 0x18, 25, 0,
+ 0x28, 23, 0,
+ 0x37, 22, 0,
+ 0x67, 19, 0,
+ 0x68, 20, 0,
+ 0x6c, 21, 0,
+ 54,
+ 0x12, 1984 % 256, 1984 / 256,
+ 0x13, 2048 % 256, 2048 / 256,
+ 0x14, 2112 % 256, 2112 / 256,
+ 0x15, 2176 % 256, 2176 / 256,
+ 0x16, 2240 % 256, 2240 / 256,
+ 0x17, 2304 % 256, 2304 / 256,
+ 0x1c, 2368 % 256, 2368 / 256,
+ 0x1d, 2432 % 256, 2432 / 256,
+ 0x1e, 2496 % 256, 2496 / 256,
+ 0x1f, 2560 % 256, 2560 / 256,
+ 0x24, 52, 0,
+ 0x27, 55, 0,
+ 0x28, 56, 0,
+ 0x2b, 59, 0,
+ 0x2c, 60, 0,
+ 0x33, 320 % 256, 320 / 256,
+ 0x34, 384 % 256, 384 / 256,
+ 0x35, 448 % 256, 448 / 256,
+ 0x37, 53, 0,
+ 0x38, 54, 0,
+ 0x52, 50, 0,
+ 0x53, 51, 0,
+ 0x54, 44, 0,
+ 0x55, 45, 0,
+ 0x56, 46, 0,
+ 0x57, 47, 0,
+ 0x58, 57, 0,
+ 0x59, 58, 0,
+ 0x5a, 61, 0,
+ 0x5b, 256 % 256, 256 / 256,
+ 0x64, 48, 0,
+ 0x65, 49, 0,
+ 0x66, 62, 0,
+ 0x67, 63, 0,
+ 0x68, 30, 0,
+ 0x69, 31, 0,
+ 0x6a, 32, 0,
+ 0x6b, 33, 0,
+ 0x6c, 40, 0,
+ 0x6d, 41, 0,
+ 0xc8, 128, 0,
+ 0xc9, 192, 0,
+ 0xca, 26, 0,
+ 0xcb, 27, 0,
+ 0xcc, 28, 0,
+ 0xcd, 29, 0,
+ 0xd2, 34, 0,
+ 0xd3, 35, 0,
+ 0xd4, 36, 0,
+ 0xd5, 37, 0,
+ 0xd6, 38, 0,
+ 0xd7, 39, 0,
+ 0xda, 42, 0,
+ 0xdb, 43, 0,
+ 20,
+ 0x4a, 640 % 256, 640 / 256,
+ 0x4b, 704 % 256, 704 / 256,
+ 0x4c, 768 % 256, 768 / 256,
+ 0x4d, 832 % 256, 832 / 256,
+ 0x52, 1280 % 256, 1280 / 256,
+ 0x53, 1344 % 256, 1344 / 256,
+ 0x54, 1408 % 256, 1408 / 256,
+ 0x55, 1472 % 256, 1472 / 256,
+ 0x5a, 1536 % 256, 1536 / 256,
+ 0x5b, 1600 % 256, 1600 / 256,
+ 0x64, 1664 % 256, 1664 / 256,
+ 0x65, 1728 % 256, 1728 / 256,
+ 0x6c, 512 % 256, 512 / 256,
+ 0x6d, 576 % 256, 576 / 256,
+ 0x72, 896 % 256, 896 / 256,
+ 0x73, 960 % 256, 960 / 256,
+ 0x74, 1024 % 256, 1024 / 256,
+ 0x75, 1088 % 256, 1088 / 256,
+ 0x76, 1152 % 256, 1152 / 256,
+ 0x77, 1216 % 256, 1216 / 256,
+ 0xff
+};
+static const FX_BYTE FaxWhiteRunIns[] = {
+ 0,
+ 0,
+ 0,
+ 6,
+ 0x07, 2, 0,
+ 0x08, 3, 0,
+ 0x0B, 4, 0,
+ 0x0C, 5, 0,
+ 0x0E, 6, 0,
+ 0x0F, 7, 0,
+ 6,
+ 0x07, 10, 0,
+ 0x08, 11, 0,
+ 0x12, 128, 0,
+ 0x13, 8, 0,
+ 0x14, 9, 0,
+ 0x1b, 64, 0,
+ 9,
+ 0x03, 13, 0,
+ 0x07, 1, 0,
+ 0x08, 12, 0,
+ 0x17, 192, 0,
+ 0x18, 1664 % 256, 1664 / 256,
+ 0x2a, 16, 0,
+ 0x2B, 17, 0,
+ 0x34, 14, 0,
+ 0x35, 15, 0,
+ 12,
+ 0x03, 22, 0,
+ 0x04, 23, 0,
+ 0x08, 20, 0,
+ 0x0c, 19, 0,
+ 0x13, 26, 0,
+ 0x17, 21, 0,
+ 0x18, 28, 0,
+ 0x24, 27, 0,
+ 0x27, 18, 0,
+ 0x28, 24, 0,
+ 0x2B, 25, 0,
+ 0x37, 256 % 256, 256 / 256,
+ 42,
+ 0x02, 29, 0,
+ 0x03, 30, 0,
+ 0x04, 45, 0,
+ 0x05, 46, 0,
+ 0x0a, 47, 0,
+ 0x0b, 48, 0,
+ 0x12, 33, 0,
+ 0x13, 34, 0,
+ 0x14, 35, 0,
+ 0x15, 36, 0,
+ 0x16, 37, 0,
+ 0x17, 38, 0,
+ 0x1a, 31, 0,
+ 0x1b, 32, 0,
+ 0x24, 53, 0,
+ 0x25, 54, 0,
+ 0x28, 39, 0,
+ 0x29, 40, 0,
+ 0x2a, 41, 0,
+ 0x2b, 42, 0,
+ 0x2c, 43, 0,
+ 0x2d, 44, 0,
+ 0x32, 61, 0,
+ 0x33, 62, 0,
+ 0x34, 63, 0,
+ 0x35, 0, 0,
+ 0x36, 320 % 256, 320 / 256,
+ 0x37, 384 % 256, 384 / 256,
+ 0x4a, 59, 0,
+ 0x4b, 60, 0,
+ 0x52, 49, 0,
+ 0x53, 50, 0,
+ 0x54, 51, 0,
+ 0x55, 52, 0,
+ 0x58, 55, 0,
+ 0x59, 56, 0,
+ 0x5a, 57, 0,
+ 0x5b, 58, 0,
+ 0x64, 448 % 256, 448 / 256,
+ 0x65, 512 % 256, 512 / 256,
+ 0x67, 640 % 256, 640 / 256,
+ 0x68, 576 % 256, 576 / 256,
+ 16,
+ 0x98, 1472 % 256, 1472 / 256,
+ 0x99, 1536 % 256, 1536 / 256,
+ 0x9a, 1600 % 256, 1600 / 256,
+ 0x9b, 1728 % 256, 1728 / 256,
+ 0xcc, 704 % 256, 704 / 256,
+ 0xcd, 768 % 256, 768 / 256,
+ 0xd2, 832 % 256, 832 / 256,
+ 0xd3, 896 % 256, 896 / 256,
+ 0xd4, 960 % 256, 960 / 256,
+ 0xd5, 1024 % 256, 1024 / 256,
+ 0xd6, 1088 % 256, 1088 / 256,
+ 0xd7, 1152 % 256, 1152 / 256,
+ 0xd8, 1216 % 256, 1216 / 256,
+ 0xd9, 1280 % 256, 1280 / 256,
+ 0xda, 1344 % 256, 1344 / 256,
+ 0xdb, 1408 % 256, 1408 / 256,
+ 0,
+ 3,
+ 0x08, 1792 % 256, 1792 / 256,
+ 0x0c, 1856 % 256, 1856 / 256,
+ 0x0d, 1920 % 256, 1920 / 256,
+ 10,
+ 0x12, 1984 % 256, 1984 / 256,
+ 0x13, 2048 % 256, 2048 / 256,
+ 0x14, 2112 % 256, 2112 / 256,
+ 0x15, 2176 % 256, 2176 / 256,
+ 0x16, 2240 % 256, 2240 / 256,
+ 0x17, 2304 % 256, 2304 / 256,
+ 0x1c, 2368 % 256, 2368 / 256,
+ 0x1d, 2432 % 256, 2432 / 256,
+ 0x1e, 2496 % 256, 2496 / 256,
+ 0x1f, 2560 % 256, 2560 / 256,
+ 0xff,
+};
+int _FaxGetRun(FX_LPCBYTE ins_array, const FX_BYTE* src_buf, int& bitpos, int bitsize)
+{
+ FX_DWORD code = 0;
+ int ins_off = 0;
+ while (1) {
+ FX_BYTE ins = ins_array[ins_off++];
+ if (ins == 0xff) {
+ return -1;
+ }
+ if (bitpos >= bitsize) {
+ return -1;
+ }
+ code <<= 1;
+ if (src_buf[bitpos / 8] & (1 << (7 - bitpos % 8))) {
+ code ++;
+ }
+ bitpos ++;
+ int next_off = ins_off + ins * 3;
+ for (; ins_off < next_off; ins_off += 3) {
+ if (ins_array[ins_off] == code) {
+ return ins_array[ins_off + 1] + ins_array[ins_off + 2] * 256;
+ }
+ }
+ }
+}
+FX_BOOL _FaxG4GetRow(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, const FX_BYTE* ref_buf, int columns)
+{
+ int a0 = -1, a0color = 1;
+ while (1) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ int a1, a2, b1, b2;
+ _FaxG4FindB1B2(ref_buf, columns, a0, a0color, b1, b2);
+ FX_BOOL bit = NEXTBIT;
+ int v_delta = 0;
+ if (bit) {
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit1 = NEXTBIT;
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit2 = NEXTBIT;
+ if (bit1 && bit2) {
+ v_delta = 1;
+ } else if (bit1) {
+ v_delta = -1;
+ } else if (bit2) {
+ int run_len1 = 0;
+ while (1) {
+ int run = _FaxGetRun(a0color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
+ run_len1 += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ if (a0 < 0) {
+ run_len1 ++;
+ }
+ a1 = a0 + run_len1;
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, a1);
+ }
+ int run_len2 = 0;
+ while (1) {
+ int run = _FaxGetRun(a0color ? FaxBlackRunIns : FaxWhiteRunIns, src_buf, bitpos, bitsize);
+ run_len2 += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ a2 = a1 + run_len2;
+ if (a0color) {
+ _FaxFillBits(dest_buf, columns, a1, a2);
+ }
+ a0 = a2;
+ if (a0 < columns) {
+ continue;
+ }
+ return TRUE;
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, b2);
+ }
+ if (b2 >= columns) {
+ return TRUE;
+ }
+ a0 = b2;
+ continue;
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit1 = NEXTBIT;
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ FX_BOOL bit2 = NEXTBIT;
+ if (bit1 && bit2) {
+ v_delta = 2;
+ } else if (bit1) {
+ v_delta = -2;
+ } else if (bit2) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ v_delta = 3;
+ } else {
+ v_delta = -3;
+ }
+ } else {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ bit = NEXTBIT;
+ if (bit) {
+ bitpos += 3;
+ continue;
+ } else {
+ bitpos += 5;
+ return TRUE;
+ }
+ }
+ }
+ }
+ }
+ a1 = b1 + v_delta;
+ if (!a0color) {
+ _FaxFillBits(dest_buf, columns, a0, a1);
+ }
+ if (a1 >= columns) {
+ return TRUE;
+ }
+ a0 = a1;
+ a0color = !a0color;
+ }
+}
+FX_BOOL _FaxSkipEOL(const FX_BYTE* src_buf, int bitsize, int& bitpos)
+{
+ int startbit = bitpos;
+ while (bitpos < bitsize) {
+ int bit = NEXTBIT;
+ if (bit) {
+ if (bitpos - startbit <= 11) {
+ bitpos = startbit;
+ }
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL _FaxGet1DLine(const FX_BYTE* src_buf, int bitsize, int& bitpos, FX_LPBYTE dest_buf, int columns)
+{
+ int color = TRUE;
+ int startpos = 0;
+ while (1) {
+ if (bitpos >= bitsize) {
+ return FALSE;
+ }
+ int run_len = 0;
+ while (1) {
+ int run = _FaxGetRun(color ? FaxWhiteRunIns : FaxBlackRunIns, src_buf, bitpos, bitsize);
+ if (run < 0) {
+ while (bitpos < bitsize) {
+ int bit = NEXTBIT;
+ if (bit) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ run_len += run;
+ if (run < 64) {
+ break;
+ }
+ }
+ if (!color) {
+ _FaxFillBits(dest_buf, columns, startpos, startpos + run_len);
+ }
+ startpos += run_len;
+ if (startpos >= columns) {
+ break;
+ }
+ color = !color;
+ }
+ return TRUE;
+}
+class CCodec_FaxDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_FaxDecoder();
+ virtual ~CCodec_FaxDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows);
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ int m_Encoding, m_bEndOfLine, m_bByteAlign, m_bBlack;
+ int bitpos;
+ FX_LPCBYTE m_pSrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanlineBuf, m_pRefBuf;
+};
+CCodec_FaxDecoder::CCodec_FaxDecoder()
+{
+ m_pScanlineBuf = NULL;
+ m_pRefBuf = NULL;
+}
+CCodec_FaxDecoder::~CCodec_FaxDecoder()
+{
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_pRefBuf) {
+ FX_Free(m_pRefBuf);
+ }
+}
+FX_BOOL CCodec_FaxDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
+{
+ m_Encoding = K;
+ m_bEndOfLine = EndOfLine;
+ m_bByteAlign = EncodedByteAlign;
+ m_bBlack = BlackIs1;
+ m_OrigWidth = Columns;
+ m_OrigHeight = Rows;
+ if (m_OrigWidth == 0) {
+ m_OrigWidth = width;
+ }
+ if (m_OrigHeight == 0) {
+ m_OrigHeight = height;
+ }
+ m_Pitch = (m_OrigWidth + 31) / 32 * 4;
+ m_OutputWidth = m_OrigWidth;
+ m_OutputHeight = m_OrigHeight;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanlineBuf == NULL) {
+ return FALSE;
+ }
+ m_pRefBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pRefBuf == NULL) {
+ return FALSE;
+ }
+ m_pSrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_nComps = 1;
+ m_bpc = 1;
+ m_bColorTransformed = FALSE;
+ return TRUE;
+}
+FX_BOOL CCodec_FaxDecoder::v_Rewind()
+{
+ FXSYS_memset8(m_pRefBuf, 0xff, m_Pitch);
+ bitpos = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_FaxDecoder::v_GetNextLine()
+{
+ int bitsize = m_SrcSize * 8;
+ _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
+ if (bitpos >= bitsize) {
+ return NULL;
+ }
+ FXSYS_memset8(m_pScanlineBuf, 0xff, m_Pitch);
+ if (m_Encoding < 0) {
+ _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ } else if (m_Encoding == 0) {
+ _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
+ } else {
+ FX_BOOL bNext1D = m_pSrcBuf[bitpos / 8] & (1 << (7 - bitpos % 8));
+ bitpos ++;
+ if (bNext1D) {
+ _FaxGet1DLine(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_OrigWidth);
+ } else {
+ _FaxG4GetRow(m_pSrcBuf, bitsize, bitpos, m_pScanlineBuf, m_pRefBuf, m_OrigWidth);
+ }
+ FXSYS_memcpy32(m_pRefBuf, m_pScanlineBuf, m_Pitch);
+ }
+ if (m_bEndOfLine) {
+ _FaxSkipEOL(m_pSrcBuf, bitsize, bitpos);
+ }
+ if (m_bByteAlign && bitpos < bitsize) {
+ int bitpos0 = bitpos;
+ int bitpos1 = (bitpos + 7) / 8 * 8;
+ while (m_bByteAlign && bitpos0 < bitpos1) {
+ int bit = m_pSrcBuf[bitpos0 / 8] & (1 << (7 - bitpos0 % 8));
+ if (bit != 0) {
+ m_bByteAlign = FALSE;
+ } else {
+ bitpos0 ++;
+ }
+ }
+ if (m_bByteAlign) {
+ bitpos = bitpos1;
+ }
+ }
+ if (m_bBlack) {
+ for (int i = 0; i < m_Pitch; i ++) {
+ m_pScanlineBuf[i] = ~m_pScanlineBuf[i];
+ }
+ }
+ return m_pScanlineBuf;
+}
+FX_DWORD CCodec_FaxDecoder::GetSrcOffset()
+{
+ FX_DWORD ret = (bitpos + 7) / 8;
+ if (ret > m_SrcSize) {
+ ret = m_SrcSize;
+ }
+ return ret;
+}
+extern "C" {
+ void _FaxG4Decode(void*, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch)
+ {
+ if (pitch == 0) {
+ pitch = (width + 7) / 8;
+ }
+ FX_LPBYTE ref_buf = FX_Alloc(FX_BYTE, pitch);
+ if (ref_buf == NULL) {
+ return;
+ }
+ FXSYS_memset8(ref_buf, 0xff, pitch);
+ int bitpos = *pbitpos;
+ for (int iRow = 0; iRow < height; iRow ++) {
+ FX_LPBYTE line_buf = dest_buf + iRow * pitch;
+ FXSYS_memset8(line_buf, 0xff, pitch);
+ _FaxG4GetRow(src_buf, src_size << 3, bitpos, line_buf, ref_buf, width);
+ FXSYS_memcpy32(ref_buf, line_buf, pitch);
+ }
+ FX_Free(ref_buf);
+ *pbitpos = bitpos;
+ }
+};
+static const FX_BYTE BlackRunTerminator[128] = {
+ 0x37, 10, 0x02, 3, 0x03, 2, 0x02, 2, 0x03, 3, 0x03, 4, 0x02, 4, 0x03, 5,
+ 0x05, 6, 0x04, 6, 0x04, 7, 0x05, 7, 0x07, 7, 0x04, 8, 0x07, 8, 0x18, 9,
+ 0x17, 10, 0x18, 10, 0x08, 10, 0x67, 11, 0x68, 11, 0x6c, 11, 0x37, 11, 0x28, 11,
+ 0x17, 11, 0x18, 11, 0xca, 12, 0xcb, 12, 0xcc, 12, 0xcd, 12, 0x68, 12, 0x69, 12,
+ 0x6a, 12, 0x6b, 12, 0xd2, 12, 0xd3, 12, 0xd4, 12, 0xd5, 12, 0xd6, 12, 0xd7, 12,
+ 0x6c, 12, 0x6d, 12, 0xda, 12, 0xdb, 12, 0x54, 12, 0x55, 12, 0x56, 12, 0x57, 12,
+ 0x64, 12, 0x65, 12, 0x52, 12, 0x53, 12, 0x24, 12, 0x37, 12, 0x38, 12, 0x27, 12,
+ 0x28, 12, 0x58, 12, 0x59, 12, 0x2b, 12, 0x2c, 12, 0x5a, 12, 0x66, 12, 0x67, 12,
+};
+static const FX_BYTE BlackRunMarkup[80] = {
+ 0x0f, 10, 0xc8, 12, 0xc9, 12, 0x5b, 12, 0x33, 12, 0x34, 12, 0x35, 12, 0x6c, 13,
+ 0x6d, 13, 0x4a, 13, 0x4b, 13, 0x4c, 13, 0x4d, 13, 0x72, 13, 0x73, 13, 0x74, 13,
+ 0x75, 13, 0x76, 13, 0x77, 13, 0x52, 13, 0x53, 13, 0x54, 13, 0x55, 13, 0x5a, 13,
+ 0x5b, 13, 0x64, 13, 0x65, 13, 0x08, 11, 0x0c, 11, 0x0d, 11, 0x12, 12, 0x13, 12,
+ 0x14, 12, 0x15, 12, 0x16, 12, 0x17, 12, 0x1c, 12, 0x1d, 12, 0x1e, 12, 0x1f, 12,
+};
+static const FX_BYTE WhiteRunTerminator[128] = {
+ 0x35, 8,
+ 0x07, 6,
+ 0x07, 4,
+ 0x08, 4,
+ 0x0B, 4,
+ 0x0C, 4,
+ 0x0E, 4,
+ 0x0F, 4,
+ 0x13, 5,
+ 0x14, 5,
+ 0x07, 5,
+ 0x08, 5,
+ 0x08, 6,
+ 0x03, 6,
+ 0x34, 6,
+ 0x35, 6,
+ 0x2a, 6,
+ 0x2B, 6,
+ 0x27, 7,
+ 0x0c, 7,
+ 0x08, 7,
+ 0x17, 7,
+ 0x03, 7,
+ 0x04, 7,
+ 0x28, 7,
+ 0x2B, 7,
+ 0x13, 7,
+ 0x24, 7,
+ 0x18, 7,
+ 0x02, 8,
+ 0x03, 8,
+ 0x1a, 8,
+ 0x1b, 8,
+ 0x12, 8,
+ 0x13, 8,
+ 0x14, 8,
+ 0x15, 8,
+ 0x16, 8,
+ 0x17, 8,
+ 0x28, 8,
+ 0x29, 8,
+ 0x2a, 8,
+ 0x2b, 8,
+ 0x2c, 8,
+ 0x2d, 8,
+ 0x04, 8,
+ 0x05, 8,
+ 0x0a, 8,
+ 0x0b, 8,
+ 0x52, 8,
+ 0x53, 8,
+ 0x54, 8,
+ 0x55, 8,
+ 0x24, 8,
+ 0x25, 8,
+ 0x58, 8,
+ 0x59, 8,
+ 0x5a, 8,
+ 0x5b, 8,
+ 0x4a, 8,
+ 0x4b, 8,
+ 0x32, 8,
+ 0x33, 8,
+ 0x34, 8,
+};
+static const FX_BYTE WhiteRunMarkup[80] = {
+ 0x1b, 5,
+ 0x12, 5,
+ 0x17, 6,
+ 0x37, 7,
+ 0x36, 8,
+ 0x37, 8,
+ 0x64, 8,
+ 0x65, 8,
+ 0x68, 8,
+ 0x67, 8,
+ 0xcc, 9,
+ 0xcd, 9,
+ 0xd2, 9,
+ 0xd3, 9,
+ 0xd4, 9,
+ 0xd5, 9,
+ 0xd6, 9,
+ 0xd7, 9,
+ 0xd8, 9,
+ 0xd9, 9,
+ 0xda, 9,
+ 0xdb, 9,
+ 0x98, 9,
+ 0x99, 9,
+ 0x9a, 9,
+ 0x18, 6,
+ 0x9b, 9,
+ 0x08, 11,
+ 0x0c, 11,
+ 0x0d, 11,
+ 0x12, 12,
+ 0x13, 12,
+ 0x14, 12,
+ 0x15, 12,
+ 0x16, 12,
+ 0x17, 12,
+ 0x1c, 12,
+ 0x1d, 12,
+ 0x1e, 12,
+ 0x1f, 12,
+};
+static void _AddBitStream(FX_LPBYTE dest_buf, int& dest_bitpos, int data, int bitlen)
+{
+ for (int i = bitlen - 1; i >= 0; i --) {
+ if (data & (1 << i)) {
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ }
+ dest_bitpos ++;
+ }
+}
+static void _FaxEncodeRun(FX_LPBYTE dest_buf, int& dest_bitpos, int run, FX_BOOL bWhite)
+{
+ while (run >= 2560) {
+ _AddBitStream(dest_buf, dest_bitpos, 0x1f, 12);
+ run -= 2560;
+ }
+ if (run >= 64) {
+ int markup = run - run % 64;
+ FX_LPCBYTE p = bWhite ? WhiteRunMarkup : BlackRunMarkup;
+ p += (markup / 64 - 1) * 2;
+ _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
+ }
+ run %= 64;
+ FX_LPCBYTE p = bWhite ? WhiteRunTerminator : BlackRunTerminator;
+ p += run * 2;
+ _AddBitStream(dest_buf, dest_bitpos, *p, p[1]);
+}
+static void _FaxEncode2DLine(FX_LPBYTE dest_buf, int& dest_bitpos, FX_LPCBYTE src_buf, FX_LPCBYTE ref_buf, int cols)
+{
+ int a0 = -1, a0color = 1;
+ while (1) {
+ int a1 = _FindBit(src_buf, cols, a0 + 1, 1 - a0color);
+ int b1, b2;
+ _FaxG4FindB1B2(ref_buf, cols, a0, a0color, b1, b2);
+ if (b2 < a1) {
+ dest_bitpos += 3;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ a0 = b2;
+ } else if (a1 - b1 <= 3 && b1 - a1 <= 3) {
+ int delta = a1 - b1;
+ switch (delta) {
+ case 0:
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ dest_bitpos += delta == 1 ? 1 : delta + 2;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ break;
+ case -1:
+ case -2:
+ case -3:
+ dest_bitpos += delta == -1 ? 1 : -delta + 2;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ break;
+ }
+ dest_bitpos ++;
+ a0 = a1;
+ a0color = 1 - a0color;
+ } else {
+ int a2 = _FindBit(src_buf, cols, a1 + 1, a0color);
+ dest_bitpos ++;
+ dest_bitpos ++;
+ dest_buf[dest_bitpos / 8] |= 1 << (7 - dest_bitpos % 8);
+ dest_bitpos ++;
+ if (a0 < 0) {
+ a0 = 0;
+ }
+ _FaxEncodeRun(dest_buf, dest_bitpos, a1 - a0, a0color);
+ _FaxEncodeRun(dest_buf, dest_bitpos, a2 - a1, 1 - a0color);
+ a0 = a2;
+ }
+ if (a0 >= cols) {
+ return;
+ }
+ }
+}
+class CCodec_FaxEncoder : public CFX_Object
+{
+public:
+ CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch);
+ ~CCodec_FaxEncoder();
+ void Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size);
+ void Encode2DLine(FX_LPCBYTE scan_line);
+ CFX_BinaryBuf m_DestBuf;
+ FX_LPBYTE m_pRefLine, m_pLineBuf;
+ int m_Cols, m_Rows, m_Pitch;
+ FX_LPCBYTE m_pSrcBuf;
+};
+CCodec_FaxEncoder::CCodec_FaxEncoder(FX_LPCBYTE src_buf, int width, int height, int pitch)
+{
+ m_pSrcBuf = src_buf;
+ m_Cols = width;
+ m_Rows = height;
+ m_Pitch = pitch;
+ m_pRefLine = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pRefLine == NULL) {
+ return;
+ }
+ FXSYS_memset8(m_pRefLine, 0xff, m_Pitch);
+ m_pLineBuf = FX_Alloc(FX_BYTE, m_Pitch * 8);
+ if (m_pLineBuf == NULL) {
+ return;
+ }
+ m_DestBuf.EstimateSize(0, 10240);
+}
+CCodec_FaxEncoder::~CCodec_FaxEncoder()
+{
+ if (m_pRefLine) {
+ FX_Free(m_pRefLine);
+ }
+ if (m_pLineBuf) {
+ FX_Free(m_pLineBuf);
+ }
+}
+void CCodec_FaxEncoder::Encode(FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ int dest_bitpos = 0;
+ FX_BYTE last_byte = 0;
+ for (int i = 0; i < m_Rows; i ++) {
+ FX_LPCBYTE scan_line = m_pSrcBuf + i * m_Pitch;
+ FXSYS_memset32(m_pLineBuf, 0, m_Pitch * 8);
+ m_pLineBuf[0] = last_byte;
+ _FaxEncode2DLine(m_pLineBuf, dest_bitpos, scan_line, m_pRefLine, m_Cols);
+ m_DestBuf.AppendBlock(m_pLineBuf, dest_bitpos / 8);
+ last_byte = m_pLineBuf[dest_bitpos / 8];
+ dest_bitpos %= 8;
+ FXSYS_memcpy32(m_pRefLine, scan_line, m_Pitch);
+ }
+ if (dest_bitpos) {
+ m_DestBuf.AppendByte(last_byte);
+ }
+ dest_buf = m_DestBuf.GetBuffer();
+ dest_size = m_DestBuf.GetSize();
+ m_DestBuf.DetachBuffer();
+}
+FX_BOOL CCodec_FaxModule::Encode(FX_LPCBYTE src_buf, int width, int height, int pitch, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_FaxEncoder encoder(src_buf, width, height, pitch);
+ encoder.Encode(dest_buf, dest_size);
+ return TRUE;
+}
+ICodec_ScanlineDecoder* CCodec_FaxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int K, FX_BOOL EndOfLine, FX_BOOL EncodedByteAlign, FX_BOOL BlackIs1, int Columns, int Rows)
+{
+ CCodec_FaxDecoder* pDecoder = FX_NEW CCodec_FaxDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->Create(src_buf, src_size, width, height, K, EndOfLine, EncodedByteAlign, BlackIs1, Columns, Rows);
+ return pDecoder;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_flate.cpp b/core/src/fxcodec/codec/fx_codec_flate.cpp
new file mode 100644
index 0000000000..b6f94e021c
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_flate.cpp
@@ -0,0 +1,945 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../fx_zlib.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+extern "C"
+{
+ static void* my_alloc_func (void* opaque, unsigned int items, unsigned int size)
+ {
+ return FX_Alloc(FX_BYTE, items * size);
+ }
+ static void my_free_func (void* opaque, void* address)
+ {
+ FX_Free(address);
+ }
+ void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
+ void (*free_func)(void*, void*))
+ {
+ z_stream* p = (z_stream*)alloc_func(0, 1, sizeof(z_stream));
+ if (p == NULL) {
+ return NULL;
+ }
+ FXSYS_memset32(p, 0, sizeof(z_stream));
+ p->zalloc = alloc_func;
+ p->zfree = free_func;
+ inflateInit(p);
+ return p;
+ }
+ void FPDFAPI_FlateInput(void* context, const unsigned char* src_buf, unsigned int src_size)
+ {
+ ((z_stream*)context)->next_in = (unsigned char*)src_buf;
+ ((z_stream*)context)->avail_in = src_size;
+ }
+ int FPDFAPI_FlateGetTotalOut(void* context)
+ {
+ return ((z_stream*)context)->total_out;
+ }
+ int FPDFAPI_FlateOutput(void* context, unsigned char* dest_buf, unsigned int dest_size)
+ {
+ ((z_stream*)context)->next_out = dest_buf;
+ ((z_stream*)context)->avail_out = dest_size;
+ unsigned int pre_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
+ int ret = inflate((z_stream*)context, Z_SYNC_FLUSH);
+ unsigned int post_pos = (unsigned int)FPDFAPI_FlateGetTotalOut(context);
+ unsigned int written = post_pos - pre_pos;
+ if (written < dest_size) {
+ FXSYS_memset8(dest_buf + written, '\0', dest_size - written);
+ }
+ return ret;
+ }
+ int FPDFAPI_FlateGetTotalIn(void* context)
+ {
+ return ((z_stream*)context)->total_in;
+ }
+ int FPDFAPI_FlateGetAvailOut(void* context)
+ {
+ return ((z_stream*)context)->avail_out;
+ }
+ int FPDFAPI_FlateGetAvailIn(void* context)
+ {
+ return ((z_stream*)context)->avail_in;
+ }
+ void FPDFAPI_FlateEnd(void* context)
+ {
+ inflateEnd((z_stream*)context);
+ ((z_stream*)context)->zfree(0, context);
+ }
+ void FPDFAPI_FlateCompress(unsigned char* dest_buf, unsigned long* dest_size, const unsigned char* src_buf, unsigned long src_size)
+ {
+ compress(dest_buf, dest_size, src_buf, src_size);
+ }
+}
+class CLZWDecoder : public CFX_Object
+{
+public:
+ FX_BOOL Decode(FX_LPBYTE output, FX_DWORD& outlen, const FX_BYTE* input, FX_DWORD& size, FX_BOOL bEarlyChange);
+private:
+ FX_DWORD m_InPos;
+ FX_DWORD m_OutPos;
+ FX_LPBYTE m_pOutput;
+ const FX_BYTE* m_pInput;
+ FX_BOOL m_Early;
+ void AddCode(FX_DWORD prefix_code, FX_BYTE append_char);
+ FX_DWORD m_CodeArray[5021];
+ FX_DWORD m_nCodes;
+ FX_BYTE m_DecodeStack[4000];
+ FX_DWORD m_StackLen;
+ void DecodeString(FX_DWORD code);
+ int m_CodeLen;
+};
+void CLZWDecoder::AddCode(FX_DWORD prefix_code, FX_BYTE append_char)
+{
+ if (m_nCodes + m_Early == 4094) {
+ return;
+ }
+ m_CodeArray[m_nCodes ++] = (prefix_code << 16) | append_char;
+ if (m_nCodes + m_Early == 512 - 258) {
+ m_CodeLen = 10;
+ } else if (m_nCodes + m_Early == 1024 - 258) {
+ m_CodeLen = 11;
+ } else if (m_nCodes + m_Early == 2048 - 258) {
+ m_CodeLen = 12;
+ }
+}
+void CLZWDecoder::DecodeString(FX_DWORD code)
+{
+ while (1) {
+ int index = code - 258;
+ if (index < 0 || index >= (int)m_nCodes) {
+ break;
+ }
+ FX_DWORD data = m_CodeArray[index];
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)data;
+ code = data >> 16;
+ }
+ if (m_StackLen >= sizeof(m_DecodeStack)) {
+ return;
+ }
+ m_DecodeStack[m_StackLen++] = (FX_BYTE)code;
+}
+int CLZWDecoder::Decode(FX_LPBYTE dest_buf, FX_DWORD& dest_size, const FX_BYTE* src_buf, FX_DWORD& src_size, FX_BOOL bEarlyChange)
+{
+ m_CodeLen = 9;
+ m_InPos = 0;
+ m_OutPos = 0;
+ m_pInput = src_buf;
+ m_pOutput = dest_buf;
+ m_Early = bEarlyChange ? 1 : 0;
+ m_nCodes = 0;
+ FX_DWORD old_code = (FX_DWORD) - 1;
+ FX_BYTE last_char;
+ while (1) {
+ if (m_InPos + m_CodeLen > src_size * 8) {
+ break;
+ }
+ int byte_pos = m_InPos / 8;
+ int bit_pos = m_InPos % 8, bit_left = m_CodeLen;
+ FX_DWORD code = 0;
+ if (bit_pos) {
+ bit_left -= 8 - bit_pos;
+ code = (m_pInput[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
+ }
+ if (bit_left < 8) {
+ code |= m_pInput[byte_pos] >> (8 - bit_left);
+ } else {
+ bit_left -= 8;
+ code |= m_pInput[byte_pos++] << bit_left;
+ if (bit_left) {
+ code |= m_pInput[byte_pos] >> (8 - bit_left);
+ }
+ }
+ m_InPos += m_CodeLen;
+ if (code < 256) {
+ if (m_OutPos == dest_size) {
+ return -5;
+ }
+ if (m_pOutput) {
+ m_pOutput[m_OutPos] = (FX_BYTE)code;
+ }
+ m_OutPos ++;
+ last_char = (FX_BYTE)code;
+ if (old_code != (FX_DWORD) - 1) {
+ AddCode(old_code, last_char);
+ }
+ old_code = code;
+ } else if (code == 256) {
+ m_CodeLen = 9;
+ m_nCodes = 0;
+ old_code = (FX_DWORD) - 1;
+ } else if (code == 257) {
+ break;
+ } else {
+ if (old_code == (FX_DWORD) - 1) {
+ return 2;
+ }
+ m_StackLen = 0;
+ if (code >= m_nCodes + 258) {
+ if (m_StackLen < sizeof(m_DecodeStack)) {
+ m_DecodeStack[m_StackLen++] = last_char;
+ }
+ DecodeString(old_code);
+ } else {
+ DecodeString(code);
+ }
+ if (m_OutPos + m_StackLen > dest_size) {
+ return -5;
+ }
+ if (m_pOutput) {
+ for (FX_DWORD i = 0; i < m_StackLen; i ++) {
+ m_pOutput[m_OutPos + i] = m_DecodeStack[m_StackLen - i - 1];
+ }
+ }
+ m_OutPos += m_StackLen;
+ last_char = m_DecodeStack[m_StackLen - 1];
+ if (old_code < 256) {
+ AddCode(old_code, last_char);
+ } else if (old_code - 258 >= m_nCodes) {
+ dest_size = m_OutPos;
+ src_size = (m_InPos + 7) / 8;
+ return 0;
+ } else {
+ AddCode(old_code, last_char);
+ }
+ old_code = code;
+ }
+ }
+ dest_size = m_OutPos;
+ src_size = (m_InPos + 7) / 8;
+ return 0;
+}
+static FX_BYTE PaethPredictor(int a, int b, int c)
+{
+ int p = a + b - c;
+ int pa = FXSYS_abs(p - a);
+ int pb = FXSYS_abs(p - b);
+ int pc = FXSYS_abs(p - c);
+ if (pa <= pb && pa <= pc) {
+ return (FX_BYTE)a;
+ }
+ if (pb <= pc) {
+ return (FX_BYTE)b;
+ }
+ return (FX_BYTE)c;
+}
+static void PNG_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, (row_size + 1) * row_count);
+ if (dest_buf == NULL) {
+ return;
+ }
+ int byte_cnt = 0;
+ FX_LPBYTE pSrcData = data_buf;
+ FX_LPBYTE pDestData = dest_buf;
+ for (int row = 0; row < row_count; row++) {
+ if (predictor == 10) {
+ pDestData[0] = 0;
+ int move_size = row_size;
+ if (move_size * (row + 1) > (int)data_size) {
+ move_size = data_size - (move_size * row);
+ }
+ FXSYS_memmove32(pDestData + 1, pSrcData, move_size);
+ pDestData += (move_size + 1);
+ pSrcData += move_size;
+ byte_cnt += move_size;
+ continue;
+ }
+ for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte++) {
+ switch (predictor) {
+ case 11: {
+ pDestData[0] = 1;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - left;
+ }
+ break;
+ case 12: {
+ pDestData[0] = 2;
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - up;
+ }
+ break;
+ case 13: {
+ pDestData[0] = 3;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - (left + up) / 2;
+ }
+ break;
+ case 14: {
+ pDestData[0] = 4;
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pSrcData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pSrcData[byte - row_size];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && row) {
+ upper_left = pSrcData[byte - row_size - BytesPerPixel];
+ }
+ pDestData[byte + 1] = pSrcData[byte] - PaethPredictor(left, up, upper_left);
+ }
+ break;
+ default: {
+ pDestData[byte + 1] = pSrcData[byte];
+ }
+ break;
+ }
+ byte_cnt++;
+ }
+ pDestData += (row_size + 1);
+ pSrcData += row_size;
+ }
+ FX_Free(data_buf);
+ data_buf = dest_buf;
+ data_size = (row_size + 1) * row_count - (last_row_size > 0 ? (row_size - last_row_size) : 0);
+}
+static void PNG_PredictLine(FX_LPBYTE pDestData, FX_LPCBYTE pSrcData, FX_LPCBYTE pLastLine,
+ int bpc, int nColors, int nPixels)
+{
+ int row_size = (nPixels * bpc * nColors + 7) / 8;
+ int BytesPerPixel = (bpc * nColors + 7) / 8;
+ FX_BYTE tag = pSrcData[0];
+ if (tag == 0) {
+ FXSYS_memmove32(pDestData, pSrcData + 1, row_size);
+ return;
+ }
+ for (int byte = 0; byte < row_size; byte ++) {
+ FX_BYTE raw_byte = pSrcData[byte + 1];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ pDestData[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ pDestData[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (pLastLine) {
+ up = pLastLine[byte];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && pLastLine) {
+ upper_left = pLastLine[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ default:
+ pDestData[byte] = raw_byte;
+ break;
+ }
+ }
+}
+static void PNG_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int BytesPerPixel = (Colors * BitsPerComponent + 7) / 8;
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size) / (row_size + 1);
+ int last_row_size = data_size % (row_size + 1);
+ FX_LPBYTE dest_buf = FX_Alloc( FX_BYTE, row_size * row_count);
+ if (dest_buf == NULL) {
+ return;
+ }
+ int byte_cnt = 0;
+ FX_LPBYTE pSrcData = data_buf;
+ FX_LPBYTE pDestData = dest_buf;
+ for (int row = 0; row < row_count; row ++) {
+ FX_BYTE tag = pSrcData[0];
+ if (tag == 0) {
+ int move_size = row_size;
+ if ((row + 1) * (move_size + 1) > (int)data_size) {
+ move_size = last_row_size - 1;
+ }
+ FXSYS_memmove32(pDestData, pSrcData + 1, move_size);
+ pSrcData += move_size + 1;
+ pDestData += move_size;
+ byte_cnt += move_size + 1;
+ continue;
+ }
+ for (int byte = 0; byte < row_size && byte_cnt < (int)data_size; byte ++) {
+ FX_BYTE raw_byte = pSrcData[byte + 1];
+ switch (tag) {
+ case 1: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + left;
+ break;
+ }
+ case 2: {
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ pDestData[byte] = raw_byte + up;
+ break;
+ }
+ case 3: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ pDestData[byte] = raw_byte + (up + left) / 2;
+ break;
+ }
+ case 4: {
+ FX_BYTE left = 0;
+ if (byte >= BytesPerPixel) {
+ left = pDestData[byte - BytesPerPixel];
+ }
+ FX_BYTE up = 0;
+ if (row) {
+ up = pDestData[byte - row_size];
+ }
+ FX_BYTE upper_left = 0;
+ if (byte >= BytesPerPixel && row) {
+ upper_left = pDestData[byte - row_size - BytesPerPixel];
+ }
+ pDestData[byte] = raw_byte + PaethPredictor(left, up, upper_left);
+ break;
+ }
+ default:
+ pDestData[byte] = raw_byte;
+ break;
+ }
+ byte_cnt++;
+ }
+ pSrcData += row_size + 1;
+ pDestData += row_size;
+ byte_cnt++;
+ }
+ FX_Free(data_buf);
+ data_buf = dest_buf;
+ data_size = row_size * row_count - (last_row_size > 0 ? (row_size + 1 - last_row_size) : 0);
+}
+static void TIFF_PredictorEncodeLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
+{
+ int BytesPerPixel = BitsPerComponent * Colors / 8;
+ if (BitsPerComponent < 8) {
+ FX_BYTE mask = 0x01;
+ if (BitsPerComponent == 2) {
+ mask = 0x03;
+ } else if (BitsPerComponent == 4) {
+ mask = 0x0F;
+ }
+ int row_bits = Colors * BitsPerComponent * Columns;
+ for (int i = row_bits - BitsPerComponent; i >= BitsPerComponent; i -= BitsPerComponent) {
+ int col = i % 8;
+ int index = i / 8;
+ int col_pre = (col == 0) ? (8 - BitsPerComponent) : (col - BitsPerComponent);
+ int index_pre = (col == 0) ? (index - 1) : index;
+ FX_BYTE cur = (dest_buf[index] >> (8 - col - BitsPerComponent)) & mask;
+ FX_BYTE left = (dest_buf[index_pre] >> (8 - col_pre - BitsPerComponent)) & mask;
+ cur -= left;
+ cur &= mask;
+ cur <<= (8 - col - BitsPerComponent);
+ dest_buf[index] &= ~(mask << ((8 - col - BitsPerComponent)));
+ dest_buf[index] |= cur;
+ }
+ } else if (BitsPerComponent == 8) {
+ for (int i = row_size - 1; i >= BytesPerPixel; i--) {
+ dest_buf[i] -= dest_buf[i - BytesPerPixel];
+ }
+ } else {
+ for (int i = row_size - BytesPerPixel; i >= BytesPerPixel; i -= BytesPerPixel) {
+ FX_WORD pixel = (dest_buf[i] << 8) | dest_buf[i + 1];
+ pixel -= (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
+ dest_buf[i] = pixel >> 8;
+ dest_buf[i + 1] = (FX_BYTE)pixel;
+ }
+ }
+}
+static void TIFF_PredictorEncode(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ for (int row = 0; row < row_count; row++) {
+ FX_LPBYTE scan_line = data_buf + row * row_size;
+ if ((row + 1) * row_size > (int)data_size) {
+ row_size = last_row_size;
+ }
+ TIFF_PredictorEncodeLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
+ }
+}
+static void TIFF_PredictLine(FX_LPBYTE dest_buf, int row_size, int BitsPerComponent, int Colors, int Columns)
+{
+ if (BitsPerComponent == 1) {
+ int row_bits = BitsPerComponent * Colors * Columns;
+ for(int i = 1; i < row_bits; i ++) {
+ int col = i % 8;
+ int index = i / 8;
+ int index_pre = (col == 0) ? (index - 1) : index;
+ int col_pre = (col == 0) ? 8 : col;
+ if( ((dest_buf[index] >> (7 - col)) & 1) ^ ((dest_buf[index_pre] >> (8 - col_pre)) & 1) ) {
+ dest_buf[index] |= 1 << (7 - col);
+ } else {
+ dest_buf[index] &= ~(1 << (7 - col));
+ }
+ }
+ return;
+ }
+ int BytesPerPixel = BitsPerComponent * Colors / 8;
+ if (BitsPerComponent == 16) {
+ for (int i = BytesPerPixel; i < row_size; i += 2) {
+ FX_WORD pixel = (dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
+ pixel += (dest_buf[i] << 8) | dest_buf[i + 1];
+ dest_buf[i] = pixel >> 8;
+ dest_buf[i + 1] = (FX_BYTE)pixel;
+ }
+ } else {
+ for (int i = BytesPerPixel; i < row_size; i ++) {
+ dest_buf[i] += dest_buf[i - BytesPerPixel];
+ }
+ }
+}
+static void TIFF_Predictor(FX_LPBYTE& data_buf, FX_DWORD& data_size,
+ int Colors, int BitsPerComponent, int Columns)
+{
+ int row_size = (Colors * BitsPerComponent * Columns + 7) / 8;
+ int row_count = (data_size + row_size - 1) / row_size;
+ int last_row_size = data_size % row_size;
+ for (int row = 0; row < row_count; row ++) {
+ FX_LPBYTE scan_line = data_buf + row * row_size;
+ if ((row + 1) * row_size > (int)data_size) {
+ row_size = last_row_size;
+ }
+ TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
+ }
+}
+class CCodec_FlateScanlineDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_FlateScanlineDecoder();
+ ~CCodec_FlateScanlineDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps, int bpc,
+ int predictor, int Colors, int BitsPerComponent, int Columns);
+ virtual void Destroy()
+ {
+ delete this;
+ }
+ virtual void v_DownScale(int dest_width, int dest_height) {}
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ void* m_pFlate;
+ FX_LPCBYTE m_SrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanline;
+ FX_LPBYTE m_pLastLine;
+ FX_LPBYTE m_pPredictBuffer;
+ FX_LPBYTE m_pPredictRaw;
+ int m_Predictor;
+ int m_Colors, m_BitsPerComponent, m_Columns, m_PredictPitch, m_LeftOver;
+};
+CCodec_FlateScanlineDecoder::CCodec_FlateScanlineDecoder()
+{
+ m_pFlate = NULL;
+ m_pScanline = NULL;
+ m_pLastLine = NULL;
+ m_pPredictBuffer = NULL;
+ m_pPredictRaw = NULL;
+ m_LeftOver = 0;
+}
+CCodec_FlateScanlineDecoder::~CCodec_FlateScanlineDecoder()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pLastLine) {
+ FX_Free(m_pLastLine);
+ }
+ if (m_pPredictBuffer) {
+ FX_Free(m_pPredictBuffer);
+ }
+ if (m_pPredictRaw) {
+ FX_Free(m_pPredictRaw);
+ }
+ if (m_pFlate) {
+ FPDFAPI_FlateEnd(m_pFlate);
+ }
+}
+FX_BOOL CCodec_FlateScanlineDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ m_SrcBuf = src_buf;
+ m_SrcSize = src_size;
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ m_nComps = nComps;
+ m_bpc = bpc;
+ m_bColorTransformed = FALSE;
+ m_Pitch = (width * nComps * bpc + 7) / 8;
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ m_Predictor = 0;
+ if (predictor) {
+ if (predictor >= 10) {
+ m_Predictor = 2;
+ } else if (predictor == 2) {
+ m_Predictor = 1;
+ }
+ if (m_Predictor) {
+ if (BitsPerComponent * Colors * Columns == 0) {
+ BitsPerComponent = m_bpc;
+ Colors = m_nComps;
+ Columns = m_OrigWidth;
+ }
+ m_Colors = Colors;
+ m_BitsPerComponent = BitsPerComponent;
+ m_Columns = Columns;
+ m_PredictPitch = (m_BitsPerComponent * m_Colors * m_Columns + 7) / 8;
+ m_pLastLine = FX_Alloc(FX_BYTE, m_PredictPitch);
+ if (m_pLastLine == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pLastLine, 0, m_PredictPitch);
+ m_pPredictRaw = FX_Alloc(FX_BYTE, m_PredictPitch + 1);
+ if (m_pPredictRaw == NULL) {
+ return FALSE;
+ }
+ m_pPredictBuffer = FX_Alloc(FX_BYTE, m_PredictPitch);
+ if (m_pPredictBuffer == NULL) {
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_FlateScanlineDecoder::v_Rewind()
+{
+ if (m_pFlate) {
+ FPDFAPI_FlateEnd(m_pFlate);
+ }
+ m_pFlate = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ if (m_pFlate == NULL) {
+ return FALSE;
+ }
+ FPDFAPI_FlateInput(m_pFlate, m_SrcBuf, m_SrcSize);
+ m_LeftOver = 0;
+ return TRUE;
+}
+FX_LPBYTE CCodec_FlateScanlineDecoder::v_GetNextLine()
+{
+ if (m_Predictor) {
+ if (m_Pitch == m_PredictPitch) {
+ if (m_Predictor == 2) {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+ PNG_PredictLine(m_pScanline, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
+ FXSYS_memcpy32(m_pLastLine, m_pScanline, m_PredictPitch);
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+ TIFF_PredictLine(m_pScanline, m_PredictPitch, m_bpc, m_nComps, m_OutputWidth);
+ }
+ } else {
+ int bytes_to_go = m_Pitch;
+ int read_leftover = m_LeftOver > bytes_to_go ? bytes_to_go : m_LeftOver;
+ if (read_leftover) {
+ FXSYS_memcpy32(m_pScanline, m_pPredictBuffer + m_PredictPitch - m_LeftOver, read_leftover);
+ m_LeftOver -= read_leftover;
+ bytes_to_go -= read_leftover;
+ }
+ while (bytes_to_go) {
+ if (m_Predictor == 2) {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictRaw, m_PredictPitch + 1);
+ PNG_PredictLine(m_pPredictBuffer, m_pPredictRaw, m_pLastLine, m_BitsPerComponent, m_Colors, m_Columns);
+ FXSYS_memcpy32(m_pLastLine, m_pPredictBuffer, m_PredictPitch);
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pPredictBuffer, m_PredictPitch);
+ TIFF_PredictLine(m_pPredictBuffer, m_PredictPitch, m_BitsPerComponent, m_Colors, m_Columns);
+ }
+ int read_bytes = m_PredictPitch > bytes_to_go ? bytes_to_go : m_PredictPitch;
+ FXSYS_memcpy32(m_pScanline + m_Pitch - bytes_to_go, m_pPredictBuffer, read_bytes);
+ m_LeftOver += m_PredictPitch - read_bytes;
+ bytes_to_go -= read_bytes;
+ }
+ }
+ } else {
+ FPDFAPI_FlateOutput(m_pFlate, m_pScanline, m_Pitch);
+ }
+ return m_pScanline;
+}
+FX_DWORD CCodec_FlateScanlineDecoder::GetSrcOffset()
+{
+ return FPDFAPI_FlateGetTotalIn(m_pFlate);
+}
+static void FlateUncompress(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_DWORD orig_size,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size, FX_DWORD& offset)
+{
+ FX_DWORD guess_size = orig_size ? orig_size : src_size * 2;
+ FX_DWORD alloc_step = orig_size ? 10240 : (src_size < 10240 ? 10240 : src_size);
+ static const FX_DWORD kMaxInitialAllocSize = 10000000;
+ if (guess_size > kMaxInitialAllocSize) {
+ guess_size = kMaxInitialAllocSize;
+ alloc_step = kMaxInitialAllocSize;
+ }
+ FX_LPBYTE guess_buf = FX_Alloc(FX_BYTE, guess_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf[guess_size] = '\0';
+ FX_BOOL useOldImpl = src_size < 10240;
+ void* context = FPDFAPI_FlateInit(my_alloc_func, my_free_func);
+ if (context == NULL) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return ;
+ }
+ FPDFAPI_FlateInput(context, src_buf, src_size);
+ CFX_ArrayTemplate<FX_LPBYTE> result_tmp_bufs;
+ FX_LPBYTE buf = guess_buf;
+ FX_DWORD buf_size = guess_size;
+ FX_DWORD last_buf_size = buf_size;
+ while (1) {
+ FX_INT32 ret = FPDFAPI_FlateOutput(context, buf, buf_size);
+ FX_INT32 avail_buf_size = FPDFAPI_FlateGetAvailOut(context);
+ if (!useOldImpl) {
+ if (ret != Z_OK) {
+ last_buf_size = buf_size - avail_buf_size;
+ result_tmp_bufs.Add(buf);
+ break;
+ }
+ if (avail_buf_size == 0) {
+ result_tmp_bufs.Add(buf);
+ buf = NULL;
+ buf = FX_Alloc(FX_BYTE, buf_size + 1);
+ if (!buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ buf[buf_size] = '\0';
+ } else {
+ last_buf_size = buf_size - avail_buf_size;
+ result_tmp_bufs.Add(buf);
+ buf = NULL;
+ break;
+ }
+ } else {
+ if (ret != Z_OK) {
+ break;
+ }
+ if (avail_buf_size == 0) {
+ FX_DWORD old_size = guess_size;
+ guess_size += alloc_step;
+ if (guess_size < old_size || guess_size + 1 < guess_size) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf = FX_Realloc(FX_BYTE, guess_buf, guess_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_buf[guess_size] = '\0';
+ buf = guess_buf + old_size;
+ buf_size = guess_size - old_size;
+ } else {
+ break;
+ }
+ }
+ }
+ dest_size = FPDFAPI_FlateGetTotalOut(context);
+ offset = FPDFAPI_FlateGetTotalIn(context);
+ if (!useOldImpl) {
+ if (result_tmp_bufs.GetSize() == 1) {
+ dest_buf = result_tmp_bufs[0];
+ } else {
+ FX_LPBYTE result_buf = FX_Alloc(FX_BYTE, dest_size);
+ if (!result_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ FX_DWORD result_pos = 0;
+ for (FX_INT32 i = 0; i < result_tmp_bufs.GetSize(); i++) {
+ FX_LPBYTE tmp_buf = result_tmp_bufs[i];
+ FX_DWORD tmp_buf_size = buf_size;
+ if (i == result_tmp_bufs.GetSize() - 1) {
+ tmp_buf_size = last_buf_size;
+ }
+ FXSYS_memcpy32(result_buf + result_pos, tmp_buf, tmp_buf_size);
+ result_pos += tmp_buf_size;
+ FX_Free(tmp_buf);
+ tmp_buf = NULL;
+ result_tmp_bufs[i] = NULL;
+ }
+ dest_buf = result_buf;
+ }
+ } else {
+ if (guess_size / 2 > dest_size) {
+ guess_buf = FX_Realloc(FX_BYTE, guess_buf, dest_size + 1);
+ if (!guess_buf) {
+ dest_buf = NULL;
+ dest_size = 0;
+ return;
+ }
+ guess_size = dest_size;
+ guess_buf[guess_size] = '\0';
+ }
+ dest_buf = guess_buf;
+ }
+ FPDFAPI_FlateEnd(context);
+ context = NULL;
+}
+ICodec_ScanlineDecoder* CCodec_FlateModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, int bpc, int predictor, int Colors, int BitsPerComponent, int Columns)
+{
+ CCodec_FlateScanlineDecoder* pDecoder = FX_NEW CCodec_FlateScanlineDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->Create(src_buf, src_size, width, height, nComps, bpc, predictor, Colors, BitsPerComponent, Columns);
+ return pDecoder;
+}
+FX_DWORD CCodec_FlateModule::FlateOrLZWDecode(FX_BOOL bLZW, const FX_BYTE* src_buf, FX_DWORD src_size, FX_BOOL bEarlyChange,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_DWORD estimated_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CLZWDecoder* pDecoder = NULL;
+ dest_buf = NULL;
+ FX_DWORD offset = 0;
+ int predictor_type = 0;
+ if (predictor) {
+ if (predictor >= 10) {
+ predictor_type = 2;
+ } else if (predictor == 2) {
+ predictor_type = 1;
+ }
+ }
+ if (bLZW) {
+ pDecoder = FX_NEW CLZWDecoder;
+ if (pDecoder == NULL) {
+ return -1;
+ }
+ dest_size = (FX_DWORD) - 1;
+ offset = src_size;
+ int err = pDecoder->Decode(NULL, dest_size, src_buf, offset, bEarlyChange);
+ delete pDecoder;
+ if (err || dest_size == 0 || dest_size + 1 < dest_size) {
+ return (FX_DWORD) - 1;
+ }
+ pDecoder = FX_NEW CLZWDecoder;
+ if (pDecoder == NULL) {
+ return -1;
+ }
+ dest_buf = FX_Alloc( FX_BYTE, dest_size + 1);
+ if (dest_buf == NULL) {
+ return -1;
+ }
+ dest_buf[dest_size] = '\0';
+ pDecoder->Decode(dest_buf, dest_size, src_buf, offset, bEarlyChange);
+ delete pDecoder;
+ } else {
+ FlateUncompress(src_buf, src_size, estimated_size, dest_buf, dest_size, offset);
+ }
+ if (predictor_type == 0) {
+ return offset;
+ }
+ if (predictor_type == 2) {
+ PNG_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
+ } else if (predictor_type == 1) {
+ TIFF_Predictor(dest_buf, dest_size, Colors, BitsPerComponent, Columns);
+ }
+ return offset;
+}
+FX_BOOL CCodec_FlateModule::Encode(const FX_BYTE* src_buf, FX_DWORD src_size,
+ int predictor, int Colors, int BitsPerComponent, int Columns,
+ FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ if (predictor != 2 && predictor < 10) {
+ return Encode(src_buf, src_size, dest_buf, dest_size);
+ }
+ FX_BOOL ret = FALSE;
+ FX_LPBYTE pSrcBuf = NULL;
+ pSrcBuf = FX_Alloc(FX_BYTE, src_size);
+ if (pSrcBuf == NULL) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(pSrcBuf, src_buf, src_size);
+ if (predictor == 2) {
+ TIFF_PredictorEncode(pSrcBuf, src_size, Colors, BitsPerComponent, Columns);
+ } else if (predictor >= 10) {
+ PNG_PredictorEncode(pSrcBuf, src_size, predictor, Colors, BitsPerComponent, Columns);
+ }
+ ret = Encode(pSrcBuf, src_size, dest_buf, dest_size);
+ FX_Free(pSrcBuf);
+ return ret;
+}
+FX_BOOL CCodec_FlateModule::Encode(FX_LPCBYTE src_buf, FX_DWORD src_size, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ dest_size = src_size + src_size / 1000 + 12;
+ dest_buf = FX_Alloc( FX_BYTE, dest_size);
+ if (dest_buf == NULL) {
+ return FALSE;
+ }
+ unsigned long temp_size = dest_size;
+ FPDFAPI_FlateCompress(dest_buf, &temp_size, src_buf, src_size);
+ dest_size = (FX_DWORD)temp_size;
+ return TRUE;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_icc.cpp b/core/src/fxcodec/codec/fx_codec_icc.cpp
new file mode 100644
index 0000000000..65617642fe
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_icc.cpp
@@ -0,0 +1,1360 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+#include "../lcms2/include/fx_lcms2.h"
+FX_BOOL MD5ComputeID( FX_LPCVOID buf, FX_DWORD dwSize, FX_BYTE ID[16] )
+{
+ return cmsMD5computeIDExt(buf, dwSize, ID);
+}
+struct CLcmsCmm : public CFX_Object {
+ cmsHTRANSFORM m_hTransform;
+ int m_nSrcComponents;
+ int m_nDstComponents;
+ FX_BOOL m_bLab;
+};
+extern "C" {
+ int ourHandler(int ErrorCode, const char *ErrorText)
+ {
+ return TRUE;
+ }
+};
+FX_BOOL CheckComponents(cmsColorSpaceSignature cs, int nComponents, FX_BOOL bDst)
+{
+ if (nComponents <= 0 || nComponents > 15) {
+ return FALSE;
+ }
+ switch(cs) {
+ case cmsSigLabData:
+ if (nComponents < 3) {
+ return FALSE;
+ }
+ break;
+ case cmsSigGrayData:
+ if (bDst && nComponents != 1) {
+ return FALSE;
+ } else if (!bDst && nComponents > 2) {
+ return FALSE;
+ }
+ break;
+ case cmsSigRgbData:
+ if (bDst && nComponents != 3) {
+ return FALSE;
+ }
+ break;
+ case cmsSigCmykData:
+ if (bDst && nComponents != 4) {
+ return FALSE;
+ }
+ break;
+ default:
+ if (nComponents != 3) {
+ return FALSE;
+ }
+ break;
+ }
+ return TRUE;
+}
+void* IccLib_CreateTransform(const unsigned char* pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ const unsigned char* pDstProfileData, unsigned int dwDstProfileSize, int nDstComponents,
+ int intent, FX_DWORD dwSrcFormat = Icc_FORMAT_DEFAULT, FX_DWORD dwDstFormat = Icc_FORMAT_DEFAULT)
+{
+ cmsHPROFILE srcProfile = NULL;
+ cmsHPROFILE dstProfile = NULL;
+ cmsHTRANSFORM hTransform = NULL;
+ CLcmsCmm* pCmm = NULL;
+ srcProfile = cmsOpenProfileFromMem((void*)pSrcProfileData, dwSrcProfileSize);
+ if (srcProfile == NULL) {
+ return NULL;
+ }
+ if(pDstProfileData == NULL && dwDstProfileSize == 0 && nDstComponents == 3) {
+ dstProfile = cmsCreate_sRGBProfile();
+ } else {
+ dstProfile = cmsOpenProfileFromMem((void*)pDstProfileData, dwDstProfileSize);
+ }
+ if (dstProfile == NULL) {
+ cmsCloseProfile(srcProfile);
+ return NULL;
+ }
+ int srcFormat;
+ FX_BOOL bLab = FALSE;
+ cmsColorSpaceSignature srcCS = cmsGetColorSpace(srcProfile);
+ if (!CheckComponents(srcCS, nSrcComponents, FALSE)) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ if (srcCS == cmsSigLabData) {
+ srcFormat = COLORSPACE_SH(PT_Lab) | CHANNELS_SH(nSrcComponents) | BYTES_SH(0);
+ bLab = TRUE;
+ } else {
+ srcFormat = COLORSPACE_SH(PT_ANY) | CHANNELS_SH(nSrcComponents) | BYTES_SH(1);
+ if (srcCS == cmsSigRgbData && T_DOSWAP(dwSrcFormat)) {
+ srcFormat |= DOSWAP_SH(1);
+ }
+ }
+ cmsColorSpaceSignature dstCS = cmsGetColorSpace(dstProfile);
+ if (!CheckComponents(dstCS, nDstComponents, TRUE)) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ switch(dstCS) {
+ case cmsSigGrayData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_GRAY_8, intent, 0);
+ break;
+ case cmsSigRgbData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile, TYPE_BGR_8, intent, 0);
+ break;
+ case cmsSigCmykData:
+ hTransform = cmsCreateTransform(srcProfile, srcFormat, dstProfile,
+ T_DOSWAP(dwDstFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8,
+ intent, 0);
+ break;
+ default:
+ break;
+ }
+ if (hTransform == NULL) {
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return NULL;
+ }
+ pCmm = FX_NEW CLcmsCmm;
+ if (pCmm == NULL) {
+ return NULL;
+ }
+ pCmm->m_nSrcComponents = nSrcComponents;
+ pCmm->m_nDstComponents = nDstComponents;
+ pCmm->m_hTransform = hTransform;
+ pCmm->m_bLab = bLab;
+ cmsCloseProfile(srcProfile);
+ cmsCloseProfile(dstProfile);
+ return pCmm;
+}
+void* IccLib_CreateTransform_sRGB(const unsigned char* pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
+{
+ return IccLib_CreateTransform(pProfileData, dwProfileSize, nComponents, NULL, 0, 3, intent, dwSrcFormat);
+}
+void IccLib_DestroyTransform(void* pTransform)
+{
+ if (pTransform == NULL) {
+ return;
+ }
+ cmsDeleteTransform(((CLcmsCmm*)pTransform)->m_hTransform);
+ delete (CLcmsCmm*)pTransform;
+}
+void IccLib_Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
+{
+ if (pTransform == NULL) {
+ return;
+ }
+ CLcmsCmm* p = (CLcmsCmm*)pTransform;
+ FX_BYTE output[4];
+ if (p->m_bLab) {
+ CFX_FixedBufGrow<double, 16> inputs(p->m_nSrcComponents);
+ double* input = inputs;
+ for (int i = 0; i < p->m_nSrcComponents; i ++) {
+ input[i] = pSrcValues[i];
+ }
+ cmsDoTransform(p->m_hTransform, input, output, 1);
+ } else {
+ CFX_FixedBufGrow<FX_BYTE, 16> inputs(p->m_nSrcComponents);
+ FX_BYTE* input = inputs;
+ for (int i = 0; i < p->m_nSrcComponents; i ++) {
+ if (pSrcValues[i] > 1.0f) {
+ input[i] = 255;
+ } else if (pSrcValues[i] < 0) {
+ input[i] = 0;
+ } else {
+ input[i] = (int)(pSrcValues[i] * 255.0f);
+ }
+ }
+ cmsDoTransform(p->m_hTransform, input, output, 1);
+ }
+ switch(p->m_nDstComponents) {
+ case 1:
+ pDestValues[0] = output[0] / 255.0f;
+ break;
+ case 3:
+ pDestValues[0] = output[2] / 255.0f;
+ pDestValues[1] = output[1] / 255.0f;
+ pDestValues[2] = output[0] / 255.0f;
+ break;
+ case 4:
+ pDestValues[0] = output[0] / 255.0f;
+ pDestValues[1] = output[1] / 255.0f;
+ pDestValues[2] = output[2] / 255.0f;
+ pDestValues[3] = output[3] / 255.0f;
+ break;
+ }
+}
+void IccLib_TranslateImage(void* pTransform, unsigned char* pDest, const unsigned char* pSrc, int pixels)
+{
+ cmsDoTransform(((CLcmsCmm*)pTransform)->m_hTransform, (void*)pSrc, pDest, pixels);
+}
+FX_LPVOID CreateProfile_Gray(double gamma)
+{
+ cmsCIExyY* D50 = (cmsCIExyY*)cmsD50_xyY();
+ if (!cmsWhitePointFromTemp(D50, 6504)) {
+ return NULL;
+ }
+ cmsToneCurve* curve = cmsBuildGamma(NULL, gamma);
+ if (curve == NULL) {
+ return NULL;
+ }
+ FX_LPVOID profile = cmsCreateGrayProfile(D50, curve);
+ cmsFreeToneCurve(curve);
+ return profile;
+}
+ICodec_IccModule::IccCS GetProfileCSFromHandle(FX_LPVOID pProfile)
+{
+ if (pProfile == NULL) {
+ return ICodec_IccModule::IccCS_Unknown;
+ }
+ switch (cmsGetColorSpace(pProfile)) {
+ case cmsSigXYZData:
+ return ICodec_IccModule::IccCS_XYZ;
+ case cmsSigLabData:
+ return ICodec_IccModule::IccCS_Lab;
+ case cmsSigLuvData:
+ return ICodec_IccModule::IccCS_Luv;
+ case cmsSigYCbCrData:
+ return ICodec_IccModule::IccCS_YCbCr;
+ case cmsSigYxyData:
+ return ICodec_IccModule::IccCS_Yxy;
+ case cmsSigRgbData:
+ return ICodec_IccModule::IccCS_Rgb;
+ case cmsSigGrayData:
+ return ICodec_IccModule::IccCS_Gray;
+ case cmsSigHsvData:
+ return ICodec_IccModule::IccCS_Hsv;
+ case cmsSigHlsData:
+ return ICodec_IccModule::IccCS_Hls;
+ case cmsSigCmykData:
+ return ICodec_IccModule::IccCS_Cmyk;
+ case cmsSigCmyData:
+ return ICodec_IccModule::IccCS_Cmy;
+ default:
+ return ICodec_IccModule::IccCS_Unknown;
+ }
+}
+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(FX_LPCBYTE pProfileData, unsigned int dwProfileSize)
+{
+ ICodec_IccModule::IccCS cs;
+ cmsHPROFILE hProfile = cmsOpenProfileFromMem((void*)pProfileData, dwProfileSize);
+ if (hProfile == NULL) {
+ return IccCS_Unknown;
+ }
+ cs = GetProfileCSFromHandle(hProfile);
+ if (hProfile) {
+ cmsCloseProfile(hProfile);
+ }
+ return cs;
+}
+ICodec_IccModule::IccCS CCodec_IccModule::GetProfileCS(IFX_FileRead* pFile)
+{
+ if (pFile == NULL) {
+ return IccCS_Unknown;
+ }
+ ICodec_IccModule::IccCS cs;
+ FX_DWORD dwSize = (FX_DWORD)pFile->GetSize();
+ FX_LPBYTE pBuf = FX_Alloc(FX_BYTE, dwSize);
+ if (pBuf == NULL) {
+ return IccCS_Unknown;
+ }
+ pFile->ReadBlock(pBuf, 0, dwSize);
+ cs = GetProfileCS(pBuf, dwSize);
+ FX_Free(pBuf);
+ return cs;
+}
+FX_DWORD TransferProfileType(FX_LPVOID pProfile, FX_DWORD dwFormat)
+{
+ cmsColorSpaceSignature cs = cmsGetColorSpace(pProfile);
+ switch (cs) {
+ case cmsSigXYZData:
+ return TYPE_XYZ_16;
+ case cmsSigLabData:
+ return TYPE_Lab_DBL;
+ case cmsSigLuvData:
+ return TYPE_YUV_8;
+ case cmsSigYCbCrData:
+ return TYPE_YCbCr_8;
+ case cmsSigYxyData:
+ return TYPE_Yxy_16;
+ case cmsSigRgbData:
+ return T_DOSWAP(dwFormat) ? TYPE_RGB_8 : TYPE_BGR_8;
+ case cmsSigGrayData:
+ return TYPE_GRAY_8;
+ case cmsSigHsvData:
+ return TYPE_HSV_8;
+ case cmsSigHlsData:
+ return TYPE_HLS_8;
+ case cmsSigCmykData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC_8 : TYPE_CMYK_8;
+ case cmsSigCmyData:
+ return TYPE_CMY_8;
+ case cmsSigMCH5Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC5_8 : TYPE_CMYK5_8;
+ case cmsSigMCH6Data:
+ return TYPE_CMYK6_8;
+ case cmsSigMCH7Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC7_8 : TYPE_CMYK7_8;
+ case cmsSigMCH8Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC8_8 : TYPE_CMYK8_8;
+ case cmsSigMCH9Data:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC9_8 : TYPE_CMYK9_8;
+ case cmsSigMCHAData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC10_8 : TYPE_CMYK10_8;
+ case cmsSigMCHBData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC11_8 : TYPE_CMYK11_8;
+ case cmsSigMCHCData:
+ return T_DOSWAP(dwFormat) ? TYPE_KYMC12_8 : TYPE_CMYK12_8;
+ default:
+ return 0;
+ }
+}
+class CFX_IccProfileCache : public CFX_Object
+{
+public:
+ CFX_IccProfileCache();
+ ~CFX_IccProfileCache();
+ FX_LPVOID m_pProfile;
+ FX_DWORD m_dwRate;
+protected:
+ void Purge();
+};
+CFX_IccProfileCache::CFX_IccProfileCache()
+{
+ m_pProfile = NULL;
+ m_dwRate = 1;
+}
+CFX_IccProfileCache::~CFX_IccProfileCache()
+{
+ if (m_pProfile) {
+ cmsCloseProfile(m_pProfile);
+ }
+}
+void CFX_IccProfileCache::Purge()
+{
+}
+class CFX_IccTransformCache : public CFX_Object
+{
+public:
+ CFX_IccTransformCache(CLcmsCmm* pCmm = NULL);
+ ~CFX_IccTransformCache();
+ FX_LPVOID m_pIccTransform;
+ FX_DWORD m_dwRate;
+ CLcmsCmm* m_pCmm;
+protected:
+ void Purge();
+};
+CFX_IccTransformCache::CFX_IccTransformCache(CLcmsCmm* pCmm)
+{
+ m_pIccTransform = NULL;
+ m_dwRate = 1;
+ m_pCmm = pCmm;
+}
+CFX_IccTransformCache::~CFX_IccTransformCache()
+{
+ if (m_pIccTransform) {
+ cmsDeleteTransform(m_pIccTransform);
+ }
+ if (m_pCmm) {
+ FX_Free(m_pCmm);
+ }
+}
+void CFX_IccTransformCache::Purge()
+{
+}
+class CFX_ByteStringKey : public CFX_BinaryBuf
+{
+public:
+ CFX_ByteStringKey() : CFX_BinaryBuf() {}
+ CFX_ByteStringKey& operator << (FX_DWORD i);
+};
+CFX_ByteStringKey& CFX_ByteStringKey::operator << (FX_DWORD i)
+{
+ AppendBlock(&i, sizeof(FX_DWORD));
+ return *this;
+}
+FX_LPVOID CCodec_IccModule::CreateProfile(ICodec_IccModule::IccParam* pIccParam, Icc_CLASS ic, CFX_BinaryBuf* pTransformKey)
+{
+ CFX_IccProfileCache* pCache = NULL;
+ CFX_ByteStringKey key;
+ CFX_ByteString text;
+ key << pIccParam->ColorSpace << (pIccParam->dwProfileType | ic << 8);
+ FX_BYTE ID[16];
+ switch (pIccParam->dwProfileType) {
+ case Icc_PARAMTYPE_NONE:
+ return NULL;
+ case Icc_PARAMTYPE_BUFFER:
+ MD5ComputeID(pIccParam->pProfileData, pIccParam->dwProfileSize, ID);
+ break;
+ case Icc_PARAMTYPE_PARAM:
+ FXSYS_memset32(ID, 0, 16);
+ switch (pIccParam->ColorSpace) {
+ case IccCS_Gray:
+ text.Format("%lf", pIccParam->Gamma);
+ break;
+ default:
+ ;
+ }
+ MD5ComputeID(text.GetBuffer(0), text.GetLength(), ID);
+ break;
+ default:
+ ;
+ }
+ key.AppendBlock(ID, 16);
+ CFX_ByteString ProfileKey(key.GetBuffer(), key.GetSize());
+ ASSERT(pTransformKey);
+ pTransformKey->AppendBlock(ProfileKey.GetBuffer(0), ProfileKey.GetLength());
+ if (!m_MapProfile.Lookup(ProfileKey, (FX_LPVOID&)pCache)) {
+ pCache = FX_NEW CFX_IccProfileCache;
+ if (pCache == NULL) {
+ return NULL;
+ }
+ switch (pIccParam->dwProfileType) {
+ case Icc_PARAMTYPE_BUFFER:
+ pCache->m_pProfile = cmsOpenProfileFromMem(pIccParam->pProfileData, pIccParam->dwProfileSize);
+ break;
+ case Icc_PARAMTYPE_PARAM:
+ switch (pIccParam->ColorSpace) {
+ case IccCS_Rgb:
+ pCache->m_pProfile = cmsCreate_sRGBProfile();
+ break;
+ case IccCS_Gray:
+ pCache->m_pProfile = CreateProfile_Gray(pIccParam->Gamma);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ m_MapProfile.SetAt(ProfileKey, pCache);
+ } else {
+ pCache->m_dwRate++;
+ }
+ return pCache->m_pProfile;
+}
+FX_LPVOID CCodec_IccModule::CreateTransform(ICodec_IccModule::IccParam* pInputParam,
+ ICodec_IccModule::IccParam* pOutputParam,
+ ICodec_IccModule::IccParam* pProofParam,
+ FX_DWORD dwIntent, FX_DWORD dwFlag, FX_DWORD dwPrfIntent, FX_DWORD dwPrfFlag)
+{
+ CLcmsCmm* pCmm = NULL;
+ ASSERT(pInputParam && pOutputParam);
+ CFX_ByteStringKey key;
+ FX_LPVOID pInputProfile = CreateProfile(pInputParam, Icc_CLASS_INPUT, &key);
+ if (pInputProfile == NULL) {
+ return NULL;
+ }
+ FX_LPVOID pOutputProfile = CreateProfile(pOutputParam, Icc_CLASS_OUTPUT, &key);
+ if (pOutputProfile == NULL) {
+ return NULL;
+ }
+ FX_DWORD dwInputProfileType = TransferProfileType(pInputProfile, pInputParam->dwFormat);
+ FX_DWORD dwOutputProfileType = TransferProfileType(pOutputProfile, pOutputParam->dwFormat);
+ if (dwInputProfileType == 0 || dwOutputProfileType == 0) {
+ return NULL;
+ }
+ FX_LPVOID pProofProfile = NULL;
+ if (pProofParam) {
+ pProofProfile = CreateProfile(pProofParam, Icc_CLASS_PROOF, &key);
+ }
+ key << dwInputProfileType << dwOutputProfileType << dwIntent << dwFlag << (pProofProfile != NULL) << dwPrfIntent << dwPrfFlag;
+ CFX_ByteStringC TransformKey(key.GetBuffer(), key.GetSize());
+ CFX_IccTransformCache* pTransformCache;
+ if (!m_MapTranform.Lookup(TransformKey, (FX_LPVOID&)pTransformCache)) {
+ pCmm = FX_Alloc(CLcmsCmm, 1);
+ if (pCmm == NULL) {
+ return NULL;
+ }
+ pCmm->m_nSrcComponents = T_CHANNELS(dwInputProfileType);
+ pCmm->m_nDstComponents = T_CHANNELS(dwOutputProfileType);
+ pCmm->m_bLab = T_COLORSPACE(pInputParam->dwFormat) == PT_Lab;
+ pTransformCache = FX_NEW CFX_IccTransformCache(pCmm);
+ if (pTransformCache == NULL) {
+ FX_Free(pCmm);
+ return NULL;
+ }
+ if (pProofProfile) {
+ pTransformCache->m_pIccTransform = cmsCreateProofingTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
+ pProofProfile, dwIntent, dwPrfIntent, dwPrfFlag);
+ } else {
+ pTransformCache->m_pIccTransform = cmsCreateTransform(pInputProfile, dwInputProfileType, pOutputProfile, dwOutputProfileType,
+ dwIntent, dwFlag);
+ }
+ pCmm->m_hTransform = pTransformCache->m_pIccTransform;
+ m_MapTranform.SetAt(TransformKey, pTransformCache);
+ } else {
+ pTransformCache->m_dwRate++;
+ }
+ return pTransformCache->m_pCmm;
+}
+CCodec_IccModule::~CCodec_IccModule()
+{
+ FX_POSITION pos = m_MapProfile.GetStartPosition();
+ CFX_ByteString key;
+ CFX_IccProfileCache* pProfileCache;
+ while (pos) {
+ m_MapProfile.GetNextAssoc(pos, key, (FX_LPVOID&)pProfileCache);
+ if (pProfileCache) {
+ delete pProfileCache;
+ }
+ }
+ pos = m_MapTranform.GetStartPosition();
+ CFX_IccTransformCache* pTransformCache;
+ while (pos) {
+ m_MapTranform.GetNextAssoc(pos, key, (FX_LPVOID&)pTransformCache);
+ if (pTransformCache) {
+ delete pTransformCache;
+ }
+ }
+}
+void* CCodec_IccModule::CreateTransform_sRGB(FX_LPCBYTE pProfileData, unsigned int dwProfileSize, int nComponents, int intent, FX_DWORD dwSrcFormat)
+{
+ return IccLib_CreateTransform_sRGB(pProfileData, dwProfileSize, nComponents, intent, dwSrcFormat);
+}
+void* CCodec_IccModule::CreateTransform_CMYK(FX_LPCBYTE pSrcProfileData, unsigned int dwSrcProfileSize, int nSrcComponents,
+ FX_LPCBYTE pDstProfileData, unsigned int dwDstProfileSize, int intent,
+ FX_DWORD dwSrcFormat , FX_DWORD dwDstFormat)
+{
+ return IccLib_CreateTransform(pSrcProfileData, dwSrcProfileSize, nSrcComponents,
+ pDstProfileData, dwDstProfileSize, 4, intent, dwSrcFormat, dwDstFormat);
+}
+void CCodec_IccModule::DestroyTransform(void* pTransform)
+{
+ IccLib_DestroyTransform(pTransform);
+}
+void CCodec_IccModule::Translate(void* pTransform, FX_FLOAT* pSrcValues, FX_FLOAT* pDestValues)
+{
+ IccLib_Translate(pTransform, pSrcValues, pDestValues);
+}
+void CCodec_IccModule::TranslateScanline(void* pTransform, FX_LPBYTE pDest, FX_LPCBYTE pSrc, int pixels)
+{
+ IccLib_TranslateImage(pTransform, pDest, pSrc, pixels);
+}
+const FX_BYTE g_CMYKSamples[81 * 81 * 3] = {
+ 255, 255, 255, 225, 226, 228, 199, 200, 202, 173, 174, 178, 147, 149, 152, 123, 125, 128, 99, 99, 102, 69, 70, 71, 34, 30, 31,
+ 255, 253, 229, 226, 224, 203, 200, 199, 182, 173, 173, 158, 149, 148, 135, 125, 124, 113, 99, 99, 90, 70, 69, 63, 33, 29, 24,
+ 255, 251, 204, 228, 223, 182, 201, 198, 163, 174, 172, 142, 150, 147, 122, 125, 123, 101, 99, 98, 80, 70, 68, 54, 32, 28, 16,
+ 255, 249, 179, 230, 222, 160, 203, 197, 144, 174, 170, 124, 150, 145, 105, 125, 122, 88, 99, 97, 69, 70, 68, 46, 31, 28, 6,
+ 255, 247, 154, 229, 220, 138, 203, 195, 122, 176, 169, 107, 150, 145, 91, 125, 121, 74, 100, 96, 57, 70, 67, 35, 29, 26, 0,
+ 255, 246, 128, 231, 217, 114, 205, 194, 101, 176, 167, 88, 150, 144, 75, 125, 120, 60, 100, 96, 44, 70, 66, 24, 28, 26, 0,
+ 255, 244, 96, 231, 217, 87, 203, 192, 78, 175, 167, 66, 150, 143, 56, 125, 119, 43, 100, 95, 29, 69, 66, 7, 26, 26, 0,
+ 255, 243, 51, 232, 215, 51, 204, 191, 43, 176, 165, 38, 150, 142, 28, 125, 118, 17, 99, 94, 0, 68, 65, 0, 24, 25, 0,
+ 255, 241, 0, 231, 215, 0, 203, 190, 0, 176, 164, 0, 150, 141, 0, 126, 117, 0, 99, 93, 0, 68, 65, 0, 24, 25, 0,
+ 252, 228, 238, 222, 201, 211, 197, 180, 190, 171, 156, 166, 147, 133, 143, 123, 111, 119, 99, 88, 94, 71, 61, 66, 34, 22, 26,
+ 254, 226, 213, 224, 201, 191, 199, 179, 171, 172, 155, 148, 147, 133, 128, 123, 110, 106, 98, 87, 83, 70, 59, 57, 33, 21, 18,
+ 254, 224, 191, 224, 199, 172, 200, 177, 153, 173, 154, 133, 147, 132, 115, 123, 109, 94, 98, 86, 74, 70, 59, 49, 32, 21, 9,
+ 255, 222, 168, 227, 198, 150, 200, 175, 135, 173, 153, 118, 148, 130, 99, 123, 109, 82, 98, 86, 64, 69, 58, 40, 31, 19, 0,
+ 255, 221, 145, 227, 196, 129, 201, 174, 115, 173, 151, 99, 148, 129, 85, 124, 108, 69, 98, 85, 52, 69, 58, 30, 30, 19, 0,
+ 255, 219, 121, 227, 195, 109, 201, 174, 97, 174, 150, 83, 148, 129, 70, 124, 107, 55, 98, 84, 40, 69, 58, 19, 28, 18, 0,
+ 255, 218, 92, 229, 194, 82, 202, 173, 75, 174, 150, 63, 149, 128, 51, 124, 106, 39, 98, 84, 24, 68, 57, 3, 26, 18, 0,
+ 255, 217, 54, 228, 193, 52, 201, 172, 46, 174, 148, 36, 148, 127, 27, 123, 105, 14, 98, 83, 0, 68, 56, 0, 25, 18, 0,
+ 255, 216, 0, 229, 192, 2, 202, 171, 4, 173, 148, 0, 148, 126, 0, 124, 105, 0, 98, 83, 0, 68, 56, 0, 24, 17, 0,
+ 249, 204, 223, 219, 181, 199, 195, 160, 178, 170, 140, 156, 146, 119, 134, 123, 99, 112, 98, 77, 88, 70, 52, 61, 34, 11, 20,
+ 250, 201, 200, 221, 180, 178, 197, 159, 161, 171, 139, 139, 147, 119, 120, 123, 98, 99, 98, 77, 78, 69, 51, 52, 34, 11, 10,
+ 252, 201, 180, 223, 179, 162, 197, 159, 144, 170, 138, 125, 146, 117, 107, 122, 97, 89, 98, 76, 69, 69, 50, 44, 32, 11, 2,
+ 252, 199, 158, 222, 177, 143, 199, 158, 127, 171, 137, 110, 147, 117, 93, 122, 96, 76, 97, 75, 58, 69, 50, 36, 32, 10, 0,
+ 253, 198, 137, 223, 177, 123, 198, 156, 110, 171, 136, 95, 146, 116, 80, 122, 96, 65, 97, 75, 47, 69, 50, 25, 30, 10, 0,
+ 254, 197, 115, 225, 175, 104, 198, 156, 92, 172, 135, 79, 147, 115, 66, 123, 95, 52, 98, 74, 37, 69, 49, 15, 29, 10, 0,
+ 254, 196, 89, 224, 175, 80, 199, 154, 70, 172, 134, 59, 146, 114, 48, 122, 95, 36, 97, 74, 21, 68, 49, 0, 27, 9, 0,
+ 255, 195, 57, 225, 173, 52, 198, 154, 44, 172, 133, 36, 147, 113, 26, 123, 94, 14, 98, 74, 0, 68, 49, 0, 26, 10, 0,
+ 254, 194, 15, 225, 172, 12, 198, 153, 7, 172, 132, 3, 146, 113, 0, 123, 93, 0, 98, 73, 0, 68, 49, 0, 26, 9, 0,
+ 246, 178, 209, 218, 159, 186, 194, 140, 166, 168, 122, 145, 144, 104, 125, 121, 85, 103, 97, 65, 81, 69, 41, 55, 34, 0, 12,
+ 248, 176, 186, 219, 157, 166, 195, 139, 149, 168, 121, 130, 144, 103, 111, 121, 85, 91, 97, 65, 71, 69, 41, 46, 34, 0, 4,
+ 249, 175, 168, 220, 156, 150, 196, 139, 135, 169, 121, 116, 144, 103, 100, 122, 84, 83, 98, 65, 63, 70, 41, 39, 33, 0, 0,
+ 249, 175, 148, 220, 155, 133, 196, 138, 119, 169, 120, 103, 145, 101, 87, 121, 83, 71, 97, 65, 54, 69, 41, 31, 32, 0, 0,
+ 249, 173, 128, 222, 154, 115, 195, 137, 102, 170, 119, 88, 145, 101, 74, 122, 83, 59, 97, 64, 43, 68, 40, 20, 30, 0, 0,
+ 250, 172, 108, 221, 154, 98, 195, 136, 86, 170, 118, 73, 145, 100, 61, 122, 82, 48, 97, 63, 32, 69, 40, 11, 28, 0, 0,
+ 250, 171, 85, 221, 153, 76, 196, 136, 67, 170, 117, 56, 145, 99, 44, 121, 82, 33, 97, 63, 17, 68, 40, 0, 28, 0, 0,
+ 251, 171, 58, 222, 152, 50, 197, 135, 43, 169, 117, 34, 146, 99, 25, 121, 81, 10, 96, 63, 0, 68, 40, 0, 27, 0, 0,
+ 250, 170, 26, 222, 151, 19, 196, 134, 13, 169, 116, 4, 145, 99, 0, 122, 81, 0, 97, 63, 0, 67, 40, 0, 26, 0, 0,
+ 244, 153, 194, 215, 136, 173, 192, 121, 155, 167, 104, 135, 143, 89, 115, 121, 72, 96, 97, 54, 75, 70, 31, 49, 34, 0, 6,
+ 245, 153, 173, 216, 136, 155, 192, 120, 138, 167, 104, 121, 144, 88, 103, 121, 71, 85, 97, 54, 66, 69, 31, 42, 34, 0, 0,
+ 246, 152, 157, 217, 135, 140, 193, 120, 126, 167, 103, 109, 143, 88, 92, 121, 72, 76, 97, 54, 58, 69, 31, 35, 33, 0, 0,
+ 245, 150, 139, 218, 134, 125, 193, 119, 111, 167, 103, 96, 144, 87, 80, 121, 71, 66, 96, 53, 49, 68, 31, 26, 32, 0, 0,
+ 246, 151, 122, 218, 133, 108, 194, 118, 96, 168, 102, 81, 144, 86, 69, 120, 71, 55, 95, 53, 39, 68, 30, 17, 31, 0, 0,
+ 248, 150, 103, 218, 133, 91, 193, 118, 81, 168, 102, 69, 143, 86, 56, 120, 70, 43, 96, 53, 28, 68, 31, 6, 29, 0, 0,
+ 247, 149, 81, 218, 132, 72, 194, 117, 62, 168, 101, 52, 144, 86, 42, 121, 70, 29, 96, 52, 13, 68, 30, 0, 28, 0, 0,
+ 247, 148, 55, 219, 131, 50, 194, 117, 43, 167, 101, 32, 144, 85, 22, 120, 69, 8, 96, 52, 0, 67, 30, 0, 27, 0, 0,
+ 247, 147, 29, 218, 131, 24, 194, 116, 20, 168, 100, 11, 144, 85, 0, 120, 69, 0, 96, 52, 0, 67, 30, 0, 26, 0, 0,
+ 242, 130, 179, 214, 114, 160, 190, 101, 143, 166, 87, 125, 143, 72, 107, 120, 58, 88, 96, 42, 68, 69, 17, 44, 35, 0, 0,
+ 243, 129, 161, 215, 114, 143, 191, 101, 128, 166, 87, 113, 143, 73, 96, 120, 58, 79, 96, 41, 60, 69, 18, 37, 33, 0, 0,
+ 243, 129, 146, 216, 114, 130, 192, 101, 117, 166, 87, 101, 143, 72, 86, 121, 58, 69, 96, 42, 52, 69, 18, 29, 31, 0, 0,
+ 243, 128, 130, 216, 114, 115, 191, 101, 102, 165, 86, 88, 142, 72, 75, 120, 58, 60, 95, 42, 43, 68, 19, 21, 30, 0, 0,
+ 244, 127, 112, 217, 113, 101, 192, 99, 89, 166, 85, 75, 142, 72, 63, 119, 57, 50, 96, 41, 35, 68, 19, 13, 30, 0, 0,
+ 244, 127, 96, 216, 112, 86, 191, 99, 75, 166, 86, 64, 143, 72, 52, 120, 57, 40, 95, 41, 24, 67, 20, 1, 29, 0, 0,
+ 245, 126, 77, 216, 113, 68, 191, 100, 59, 166, 85, 49, 142, 71, 38, 119, 57, 26, 95, 41, 10, 67, 20, 0, 28, 0, 0,
+ 244, 126, 55, 216, 112, 48, 191, 99, 40, 166, 85, 31, 143, 71, 20, 119, 57, 6, 95, 42, 0, 67, 20, 0, 28, 0, 0,
+ 245, 126, 33, 217, 112, 26, 192, 99, 22, 166, 84, 11, 142, 70, 0, 119, 57, 0, 95, 41, 0, 66, 20, 0, 27, 0, 0,
+ 241, 102, 167, 213, 90, 149, 189, 79, 133, 165, 66, 115, 141, 54, 98, 119, 41, 81, 96, 25, 63, 69, 0, 38, 30, 0, 0,
+ 241, 102, 149, 213, 90, 133, 189, 79, 119, 165, 66, 103, 142, 55, 88, 119, 41, 71, 96, 25, 53, 69, 0, 31, 28, 0, 0,
+ 241, 102, 135, 214, 90, 121, 190, 79, 108, 165, 66, 92, 141, 55, 78, 119, 42, 63, 96, 26, 46, 69, 0, 24, 28, 0, 0,
+ 241, 101, 120, 214, 90, 107, 189, 79, 95, 165, 67, 83, 141, 54, 68, 118, 41, 54, 95, 27, 39, 68, 0, 16, 27, 0, 0,
+ 241, 102, 106, 213, 90, 93, 189, 78, 82, 164, 67, 70, 141, 55, 58, 118, 42, 45, 94, 27, 29, 67, 2, 6, 27, 0, 0,
+ 242, 101, 90, 214, 89, 79, 190, 79, 69, 166, 67, 59, 141, 55, 47, 118, 41, 35, 95, 27, 19, 67, 3, 0, 26, 0, 0,
+ 242, 102, 72, 213, 89, 63, 191, 79, 56, 164, 67, 45, 141, 55, 34, 118, 42, 22, 94, 28, 6, 67, 3, 0, 26, 0, 0,
+ 242, 100, 51, 214, 89, 45, 190, 78, 38, 164, 67, 30, 141, 55, 18, 118, 42, 3, 95, 28, 0, 66, 4, 0, 26, 0, 0,
+ 243, 100, 33, 214, 90, 27, 190, 78, 22, 165, 67, 13, 141, 55, 0, 118, 43, 0, 94, 29, 0, 66, 5, 0, 26, 0, 0,
+ 237, 69, 153, 211, 58, 135, 187, 51, 121, 163, 41, 105, 141, 28, 90, 118, 15, 73, 96, 0, 56, 68, 0, 33, 25, 0, 0,
+ 239, 67, 137, 212, 60, 123, 189, 50, 110, 163, 41, 94, 141, 29, 79, 118, 17, 65, 95, 0, 48, 69, 0, 26, 25, 0, 0,
+ 240, 69, 124, 211, 60, 111, 188, 50, 98, 163, 42, 85, 141, 31, 72, 118, 18, 57, 94, 0, 41, 68, 0, 19, 25, 0, 0,
+ 240, 70, 112, 212, 61, 99, 188, 52, 87, 163, 41, 74, 140, 31, 62, 118, 20, 48, 94, 2, 32, 68, 0, 11, 24, 0, 0,
+ 239, 70, 98, 212, 62, 86, 188, 53, 77, 164, 42, 64, 140, 32, 52, 118, 20, 40, 94, 3, 24, 67, 0, 3, 23, 0, 0,
+ 239, 71, 85, 212, 61, 74, 187, 53, 65, 163, 44, 54, 140, 34, 43, 118, 22, 30, 95, 3, 14, 67, 0, 0, 23, 0, 0,
+ 239, 70, 67, 212, 62, 59, 188, 53, 51, 163, 45, 42, 141, 34, 31, 117, 22, 17, 94, 5, 2, 66, 0, 0, 23, 0, 0,
+ 239, 71, 50, 213, 62, 43, 188, 54, 37, 164, 45, 28, 139, 34, 16, 117, 22, 2, 94, 7, 0, 65, 0, 0, 23, 0, 0,
+ 240, 71, 34, 212, 63, 29, 189, 54, 24, 163, 46, 15, 139, 36, 2, 117, 25, 0, 94, 8, 0, 66, 0, 0, 23, 0, 0,
+ 237, 0, 140, 209, 0, 124, 186, 0, 112, 162, 0, 97, 141, 0, 82, 118, 0, 67, 95, 0, 49, 68, 0, 27, 20, 0, 0,
+ 237, 0, 126, 210, 0, 113, 187, 0, 99, 163, 0, 86, 139, 0, 72, 118, 0, 58, 95, 0, 42, 67, 0, 20, 20, 0, 0,
+ 237, 1, 114, 209, 1, 102, 187, 0, 90, 163, 0, 78, 139, 0, 64, 118, 0, 50, 95, 0, 35, 67, 0, 13, 20, 0, 0,
+ 236, 16, 102, 209, 7, 91, 186, 0, 80, 162, 0, 68, 139, 0, 56, 117, 0, 43, 94, 0, 27, 67, 0, 6, 20, 0, 0,
+ 238, 15, 89, 209, 13, 79, 186, 6, 69, 162, 0, 58, 139, 0, 47, 117, 0, 34, 93, 0, 20, 66, 0, 2, 20, 0, 0,
+ 237, 20, 78, 210, 12, 68, 187, 4, 59, 163, 0, 49, 139, 0, 38, 116, 0, 26, 94, 0, 11, 66, 0, 0, 20, 0, 0,
+ 237, 25, 64, 210, 18, 56, 186, 11, 48, 162, 4, 39, 138, 0, 27, 117, 0, 14, 93, 0, 0, 66, 0, 0, 20, 0, 0,
+ 238, 25, 48, 210, 22, 43, 186, 15, 35, 162, 8, 26, 140, 0, 14, 117, 0, 0, 93, 0, 0, 65, 0, 0, 20, 0, 0,
+ 238, 28, 35, 210, 21, 30, 187, 15, 24, 162, 8, 16, 139, 1, 2, 117, 0, 0, 93, 0, 0, 65, 0, 0, 22, 0, 0,
+ 219, 242, 252, 195, 214, 225, 172, 191, 201, 148, 165, 175, 127, 142, 150, 106, 119, 126, 84, 95, 101, 58, 66, 72, 24, 27, 32,
+ 222, 239, 226, 196, 213, 202, 173, 189, 180, 150, 165, 158, 129, 141, 135, 107, 118, 113, 85, 94, 90, 58, 66, 63, 21, 26, 24,
+ 223, 237, 203, 198, 211, 182, 175, 188, 163, 152, 164, 141, 129, 140, 121, 107, 117, 101, 85, 93, 80, 58, 64, 54, 21, 26, 18,
+ 226, 236, 179, 201, 210, 160, 177, 187, 143, 153, 162, 125, 130, 139, 106, 108, 116, 89, 85, 92, 69, 58, 64, 45, 20, 25, 8,
+ 227, 234, 153, 201, 208, 139, 178, 185, 124, 154, 161, 107, 131, 138, 91, 108, 115, 75, 85, 91, 58, 58, 63, 35, 17, 25, 0,
+ 229, 233, 130, 203, 207, 116, 178, 184, 104, 154, 160, 90, 131, 137, 76, 109, 114, 62, 85, 90, 46, 58, 63, 25, 16, 24, 0,
+ 230, 231, 100, 202, 205, 90, 179, 183, 80, 154, 159, 69, 131, 136, 57, 109, 113, 46, 86, 90, 32, 58, 63, 10, 14, 24, 0,
+ 230, 230, 65, 204, 204, 58, 180, 182, 52, 155, 157, 44, 132, 135, 35, 110, 113, 24, 86, 89, 9, 57, 62, 0, 11, 24, 0,
+ 232, 230, 19, 204, 204, 19, 180, 181, 17, 155, 157, 10, 131, 134, 2, 109, 112, 0, 85, 89, 0, 57, 62, 0, 10, 23, 0,
+ 218, 216, 236, 194, 192, 211, 172, 171, 188, 149, 149, 164, 128, 127, 141, 106, 106, 119, 84, 84, 94, 59, 57, 66, 25, 18, 26,
+ 221, 214, 211, 196, 191, 190, 174, 170, 170, 150, 148, 148, 128, 126, 127, 107, 105, 106, 85, 83, 84, 59, 56, 58, 23, 17, 18,
+ 222, 213, 190, 197, 189, 170, 175, 169, 153, 151, 147, 133, 129, 126, 113, 108, 105, 94, 85, 82, 74, 59, 56, 49, 22, 17, 11,
+ 224, 211, 168, 199, 188, 151, 175, 168, 135, 152, 146, 117, 129, 124, 99, 107, 103, 82, 84, 82, 64, 59, 55, 41, 21, 17, 1,
+ 224, 210, 145, 199, 187, 130, 176, 166, 117, 152, 145, 101, 129, 123, 86, 107, 103, 70, 85, 81, 53, 58, 55, 31, 19, 17, 0,
+ 227, 208, 123, 200, 186, 110, 177, 165, 98, 153, 143, 84, 130, 122, 70, 108, 102, 57, 85, 80, 41, 58, 54, 20, 18, 16, 0,
+ 227, 208, 97, 202, 185, 86, 177, 164, 77, 153, 142, 65, 130, 122, 54, 108, 101, 42, 85, 80, 27, 58, 54, 7, 16, 16, 0,
+ 228, 206, 66, 202, 184, 58, 178, 163, 50, 154, 141, 42, 131, 121, 33, 109, 101, 21, 86, 79, 5, 58, 54, 0, 13, 16, 0,
+ 228, 206, 29, 202, 183, 25, 178, 163, 20, 154, 141, 15, 131, 121, 5, 108, 100, 0, 85, 79, 0, 58, 53, 0, 13, 16, 0,
+ 217, 193, 221, 193, 172, 198, 172, 153, 178, 149, 133, 154, 128, 114, 132, 107, 94, 111, 85, 74, 89, 59, 49, 61, 25, 8, 22,
+ 219, 191, 198, 195, 171, 178, 173, 153, 159, 149, 132, 139, 128, 113, 119, 107, 94, 100, 85, 73, 79, 59, 48, 52, 25, 7, 14,
+ 221, 191, 180, 196, 170, 160, 174, 152, 144, 150, 132, 125, 129, 113, 107, 107, 93, 89, 85, 73, 69, 59, 48, 45, 23, 7, 4,
+ 222, 189, 159, 197, 169, 142, 174, 151, 127, 151, 131, 110, 129, 112, 94, 108, 93, 78, 85, 72, 60, 58, 47, 37, 22, 7, 0,
+ 223, 188, 138, 197, 168, 123, 175, 150, 109, 151, 130, 95, 130, 111, 81, 108, 92, 65, 85, 72, 49, 59, 47, 27, 21, 7, 0,
+ 224, 187, 118, 198, 167, 105, 176, 149, 93, 152, 129, 79, 130, 110, 68, 108, 91, 54, 85, 71, 38, 59, 47, 17, 18, 7, 0,
+ 224, 187, 93, 199, 166, 83, 176, 148, 73, 152, 128, 62, 129, 109, 51, 108, 90, 39, 85, 71, 25, 58, 46, 3, 16, 8, 0,
+ 226, 186, 64, 200, 165, 57, 177, 147, 50, 153, 127, 40, 130, 108, 31, 108, 90, 19, 85, 70, 3, 58, 46, 0, 16, 8, 0,
+ 227, 185, 35, 200, 165, 30, 176, 146, 25, 152, 127, 18, 130, 108, 7, 108, 89, 0, 85, 70, 0, 57, 46, 0, 14, 8, 0,
+ 216, 169, 205, 192, 150, 184, 171, 134, 164, 149, 116, 144, 128, 99, 124, 107, 81, 103, 85, 63, 81, 60, 39, 55, 26, 0, 15,
+ 217, 168, 186, 193, 150, 165, 172, 134, 149, 150, 116, 130, 128, 99, 111, 107, 81, 92, 85, 62, 72, 59, 39, 47, 25, 0, 6,
+ 219, 168, 168, 194, 149, 150, 173, 133, 135, 150, 116, 117, 128, 98, 99, 107, 80, 82, 86, 62, 63, 59, 38, 39, 24, 0, 0,
+ 219, 166, 148, 195, 149, 133, 173, 133, 119, 150, 115, 103, 128, 98, 88, 107, 80, 72, 85, 61, 54, 59, 38, 32, 23, 0, 0,
+ 220, 166, 129, 196, 148, 116, 174, 132, 103, 151, 114, 89, 129, 97, 75, 107, 79, 60, 85, 61, 44, 59, 38, 22, 21, 0, 0,
+ 222, 164, 110, 197, 147, 99, 175, 131, 87, 151, 113, 75, 129, 96, 63, 107, 79, 49, 85, 61, 33, 58, 38, 12, 19, 0, 0,
+ 222, 164, 88, 197, 146, 79, 174, 130, 69, 151, 113, 58, 129, 95, 47, 107, 78, 35, 85, 60, 20, 58, 38, 0, 18, 0, 0,
+ 223, 164, 63, 198, 145, 55, 175, 129, 48, 151, 112, 39, 129, 95, 29, 107, 78, 16, 85, 60, 1, 58, 38, 0, 17, 0, 0,
+ 223, 163, 36, 198, 145, 32, 174, 129, 26, 151, 111, 17, 129, 95, 7, 107, 78, 0, 84, 60, 0, 57, 37, 0, 15, 0, 0,
+ 215, 147, 192, 191, 130, 172, 170, 116, 153, 148, 100, 133, 127, 85, 115, 107, 69, 96, 85, 51, 75, 60, 28, 50, 25, 0, 8,
+ 217, 146, 173, 192, 130, 154, 171, 115, 138, 149, 100, 121, 128, 84, 103, 107, 68, 85, 85, 51, 66, 60, 28, 42, 25, 0, 0,
+ 217, 145, 157, 193, 129, 140, 173, 115, 125, 149, 100, 109, 128, 84, 92, 107, 68, 76, 85, 51, 58, 59, 28, 35, 23, 0, 0,
+ 218, 145, 140, 193, 129, 125, 172, 114, 110, 149, 99, 96, 128, 83, 81, 107, 67, 65, 84, 51, 49, 59, 29, 27, 22, 0, 0,
+ 219, 144, 121, 194, 128, 108, 172, 113, 96, 149, 98, 83, 128, 83, 69, 107, 68, 55, 85, 50, 40, 59, 28, 18, 20, 0, 0,
+ 220, 143, 104, 195, 128, 93, 173, 114, 82, 150, 98, 69, 127, 82, 58, 107, 67, 45, 85, 50, 30, 59, 28, 7, 19, 0, 0,
+ 220, 143, 84, 195, 127, 74, 173, 113, 65, 149, 97, 55, 128, 82, 44, 106, 67, 32, 84, 50, 16, 58, 28, 0, 18, 0, 0,
+ 221, 142, 62, 196, 126, 53, 173, 112, 46, 150, 97, 37, 128, 82, 26, 107, 66, 14, 84, 50, 0, 58, 28, 0, 16, 0, 0,
+ 222, 142, 38, 196, 126, 34, 174, 112, 27, 150, 96, 17, 128, 82, 6, 106, 66, 0, 84, 50, 0, 57, 29, 0, 16, 0, 0,
+ 214, 123, 179, 191, 110, 159, 169, 98, 143, 147, 84, 124, 126, 70, 106, 107, 55, 88, 85, 39, 69, 60, 15, 45, 23, 0, 2,
+ 216, 123, 161, 192, 110, 144, 170, 98, 129, 148, 84, 112, 127, 70, 95, 107, 55, 79, 85, 39, 61, 60, 15, 37, 20, 0, 0,
+ 217, 122, 145, 192, 110, 130, 170, 97, 116, 149, 84, 101, 127, 70, 85, 106, 55, 70, 85, 39, 53, 59, 16, 30, 19, 0, 0,
+ 217, 123, 131, 192, 109, 116, 171, 96, 103, 149, 83, 89, 127, 70, 75, 106, 55, 60, 85, 40, 45, 59, 16, 23, 17, 0, 0,
+ 217, 122, 114, 193, 109, 101, 172, 96, 91, 149, 82, 77, 128, 69, 64, 106, 55, 50, 84, 39, 35, 59, 17, 14, 17, 0, 0,
+ 218, 122, 98, 194, 108, 87, 171, 96, 77, 149, 82, 65, 127, 69, 52, 106, 55, 40, 84, 40, 25, 59, 18, 3, 15, 0, 0,
+ 219, 122, 80, 193, 108, 70, 172, 95, 61, 149, 82, 51, 127, 69, 40, 106, 55, 28, 84, 39, 12, 58, 17, 0, 13, 0, 0,
+ 219, 121, 59, 194, 108, 52, 172, 96, 44, 149, 82, 35, 127, 68, 24, 106, 55, 11, 84, 40, 0, 57, 18, 0, 13, 0, 0,
+ 219, 121, 40, 193, 108, 33, 172, 95, 26, 149, 81, 19, 128, 68, 6, 106, 54, 0, 84, 39, 0, 57, 18, 0, 13, 0, 0,
+ 213, 99, 165, 189, 87, 148, 169, 76, 132, 147, 64, 115, 126, 52, 98, 106, 39, 81, 85, 23, 63, 60, 0, 39, 16, 0, 0,
+ 214, 98, 149, 191, 87, 133, 170, 76, 119, 148, 65, 103, 127, 53, 88, 106, 39, 72, 85, 24, 55, 60, 0, 32, 15, 0, 0,
+ 215, 99, 136, 191, 87, 121, 170, 77, 108, 148, 65, 93, 126, 53, 79, 106, 40, 64, 85, 24, 47, 59, 0, 25, 14, 0, 0,
+ 215, 99, 121, 192, 87, 108, 170, 77, 96, 148, 65, 82, 126, 53, 69, 106, 40, 55, 85, 25, 39, 59, 0, 18, 13, 0, 0,
+ 216, 99, 106, 191, 87, 95, 170, 76, 83, 148, 65, 71, 126, 53, 58, 106, 41, 45, 85, 26, 30, 59, 0, 8, 11, 0, 0,
+ 216, 98, 91, 192, 88, 82, 170, 77, 71, 148, 65, 60, 127, 53, 48, 105, 41, 36, 83, 26, 21, 58, 1, 2, 11, 0, 0,
+ 217, 99, 75, 192, 87, 66, 170, 76, 57, 148, 65, 47, 126, 53, 36, 105, 41, 24, 83, 26, 8, 57, 2, 0, 9, 0, 0,
+ 217, 98, 57, 192, 87, 49, 171, 77, 41, 147, 65, 32, 126, 53, 21, 105, 41, 8, 84, 27, 0, 57, 3, 0, 9, 0, 0,
+ 217, 98, 40, 193, 87, 34, 171, 76, 27, 148, 65, 19, 126, 53, 6, 105, 41, 0, 83, 27, 0, 57, 4, 0, 9, 0, 0,
+ 211, 67, 152, 189, 58, 136, 168, 50, 122, 147, 39, 105, 127, 28, 89, 106, 14, 74, 85, 0, 56, 59, 0, 33, 9, 0, 0,
+ 213, 68, 138, 190, 59, 123, 169, 51, 109, 148, 40, 95, 126, 30, 80, 106, 16, 65, 85, 0, 48, 59, 0, 27, 9, 0, 0,
+ 214, 69, 125, 190, 59, 111, 168, 51, 99, 148, 41, 86, 126, 31, 72, 106, 18, 58, 85, 0, 41, 59, 0, 20, 7, 0, 0,
+ 215, 70, 112, 190, 61, 100, 169, 52, 88, 147, 42, 76, 126, 32, 63, 106, 19, 49, 84, 1, 34, 58, 0, 13, 7, 0, 0,
+ 214, 70, 99, 190, 62, 88, 169, 53, 77, 147, 43, 65, 125, 32, 53, 106, 20, 40, 84, 3, 26, 58, 0, 4, 7, 0, 0,
+ 214, 71, 86, 190, 61, 75, 169, 53, 65, 146, 43, 54, 126, 33, 44, 105, 21, 31, 83, 4, 17, 57, 0, 0, 7, 0, 0,
+ 215, 71, 71, 191, 62, 62, 169, 53, 53, 147, 44, 44, 126, 34, 33, 105, 22, 20, 83, 5, 4, 57, 0, 0, 7, 0, 0,
+ 215, 71, 54, 191, 62, 47, 169, 54, 39, 147, 44, 30, 126, 35, 20, 105, 23, 6, 83, 6, 0, 56, 0, 0, 5, 0, 0,
+ 215, 71, 41, 191, 63, 34, 170, 54, 27, 147, 45, 17, 126, 35, 6, 105, 23, 0, 83, 8, 0, 56, 0, 0, 5, 0, 0,
+ 210, 13, 140, 189, 1, 125, 167, 0, 110, 146, 0, 96, 126, 0, 81, 106, 0, 67, 85, 0, 51, 59, 0, 28, 4, 0, 0,
+ 212, 18, 126, 190, 7, 113, 168, 0, 100, 146, 0, 86, 126, 0, 73, 106, 0, 59, 84, 0, 43, 59, 0, 22, 4, 0, 0,
+ 212, 21, 115, 190, 13, 103, 168, 3, 91, 146, 0, 78, 125, 0, 65, 105, 0, 52, 84, 0, 36, 58, 0, 16, 4, 0, 0,
+ 213, 24, 103, 189, 19, 91, 168, 9, 82, 146, 0, 69, 125, 0, 57, 105, 0, 44, 84, 0, 29, 58, 0, 7, 4, 0, 0,
+ 213, 27, 92, 188, 21, 81, 168, 14, 71, 146, 1, 59, 125, 0, 48, 105, 0, 36, 84, 0, 21, 58, 0, 4, 4, 0, 0,
+ 213, 30, 80, 189, 22, 69, 168, 17, 61, 146, 5, 50, 125, 0, 39, 104, 0, 27, 83, 0, 12, 57, 0, 0, 4, 0, 0,
+ 214, 30, 67, 189, 25, 57, 168, 20, 50, 146, 9, 40, 125, 0, 29, 104, 0, 17, 83, 0, 2, 56, 0, 0, 4, 0, 0,
+ 214, 32, 53, 189, 27, 44, 169, 20, 38, 146, 13, 28, 124, 2, 17, 104, 0, 4, 83, 0, 0, 56, 0, 0, 4, 0, 0,
+ 214, 33, 41, 190, 27, 33, 168, 23, 27, 146, 13, 18, 125, 3, 5, 105, 0, 0, 83, 0, 0, 56, 0, 0, 4, 0, 0,
+ 185, 229, 250, 164, 204, 223, 146, 182, 199, 127, 158, 174, 108, 136, 149, 89, 113, 125, 70, 90, 100, 46, 62, 71, 10, 25, 33,
+ 189, 227, 225, 168, 202, 201, 148, 181, 179, 129, 157, 156, 109, 135, 134, 90, 113, 113, 70, 89, 90, 46, 62, 62, 8, 24, 25,
+ 192, 226, 202, 170, 202, 182, 151, 179, 162, 130, 156, 141, 110, 133, 121, 91, 112, 101, 71, 89, 80, 46, 61, 54, 7, 24, 19,
+ 194, 224, 179, 173, 200, 160, 153, 178, 144, 132, 155, 125, 112, 133, 107, 92, 111, 89, 71, 88, 69, 46, 61, 45, 6, 23, 10,
+ 196, 223, 155, 174, 198, 139, 154, 176, 124, 132, 153, 107, 113, 131, 91, 92, 110, 75, 72, 87, 58, 47, 60, 37, 4, 23, 0,
+ 198, 221, 131, 175, 197, 117, 155, 175, 105, 133, 152, 91, 113, 130, 76, 92, 109, 63, 72, 86, 47, 46, 60, 26, 3, 23, 0,
+ 200, 220, 104, 176, 196, 94, 156, 175, 84, 134, 151, 72, 113, 129, 59, 93, 108, 47, 72, 85, 33, 46, 59, 13, 0, 23, 0,
+ 201, 219, 73, 179, 195, 65, 157, 173, 57, 135, 150, 48, 114, 129, 39, 94, 108, 28, 72, 85, 15, 47, 59, 0, 0, 22, 0,
+ 203, 219, 42, 178, 195, 37, 157, 173, 32, 135, 150, 26, 114, 128, 16, 94, 107, 6, 73, 85, 0, 46, 58, 0, 0, 22, 0,
+ 186, 205, 233, 165, 183, 209, 148, 163, 187, 128, 142, 163, 109, 121, 140, 91, 101, 118, 71, 80, 94, 48, 54, 66, 12, 15, 27,
+ 189, 204, 211, 169, 182, 189, 151, 163, 169, 131, 141, 147, 111, 121, 126, 92, 101, 105, 72, 79, 84, 48, 54, 58, 11, 15, 19,
+ 192, 202, 190, 171, 181, 170, 152, 161, 152, 131, 141, 133, 112, 120, 113, 93, 100, 94, 72, 79, 74, 48, 53, 50, 10, 15, 11,
+ 195, 201, 169, 172, 179, 151, 153, 160, 135, 132, 139, 117, 113, 119, 100, 93, 99, 82, 72, 78, 64, 48, 53, 41, 9, 14, 3,
+ 195, 200, 146, 174, 179, 131, 154, 159, 117, 133, 138, 101, 113, 118, 86, 93, 98, 70, 73, 77, 53, 48, 52, 32, 8, 15, 0,
+ 198, 199, 125, 175, 177, 111, 155, 158, 100, 133, 137, 85, 113, 117, 71, 93, 97, 57, 72, 77, 42, 47, 52, 22, 5, 14, 0,
+ 199, 198, 101, 176, 177, 89, 155, 157, 79, 134, 136, 68, 113, 116, 56, 94, 97, 44, 73, 76, 30, 47, 52, 10, 2, 15, 0,
+ 200, 197, 72, 178, 176, 63, 157, 156, 56, 135, 136, 46, 114, 116, 37, 94, 96, 26, 73, 76, 11, 47, 51, 0, 0, 14, 0,
+ 201, 197, 45, 177, 175, 38, 156, 155, 31, 135, 135, 25, 114, 115, 17, 94, 96, 5, 73, 75, 0, 46, 51, 0, 0, 14, 0,
+ 187, 183, 218, 167, 165, 197, 149, 147, 176, 129, 127, 153, 111, 109, 132, 92, 90, 111, 73, 70, 89, 49, 46, 62, 15, 4, 22,
+ 190, 183, 197, 170, 164, 177, 151, 146, 159, 130, 127, 139, 112, 109, 119, 93, 90, 99, 72, 70, 78, 49, 45, 53, 14, 4, 15,
+ 192, 182, 179, 171, 163, 161, 153, 145, 144, 132, 126, 125, 113, 108, 107, 93, 89, 88, 73, 70, 69, 49, 45, 45, 13, 5, 6,
+ 195, 181, 159, 172, 162, 142, 152, 145, 127, 132, 125, 111, 113, 107, 94, 93, 88, 77, 73, 69, 59, 48, 45, 37, 11, 5, 0,
+ 195, 180, 139, 173, 161, 124, 153, 143, 110, 133, 125, 96, 113, 106, 81, 94, 88, 66, 73, 68, 49, 49, 44, 28, 9, 6, 0,
+ 196, 179, 118, 174, 160, 106, 154, 142, 94, 133, 124, 81, 113, 105, 68, 94, 87, 54, 73, 68, 39, 48, 44, 18, 5, 5, 0,
+ 197, 178, 96, 176, 159, 86, 155, 141, 75, 134, 123, 64, 114, 105, 53, 94, 87, 40, 73, 68, 26, 48, 44, 5, 2, 6, 0,
+ 199, 178, 70, 176, 158, 62, 156, 141, 54, 134, 122, 44, 114, 104, 35, 94, 86, 23, 73, 67, 8, 47, 44, 0, 2, 6, 0,
+ 199, 177, 45, 178, 158, 40, 156, 140, 32, 135, 122, 26, 114, 104, 16, 94, 86, 4, 73, 67, 0, 47, 44, 0, 0, 7, 0,
+ 188, 161, 204, 168, 144, 183, 149, 129, 164, 130, 112, 144, 112, 95, 123, 93, 78, 103, 74, 60, 81, 50, 36, 56, 16, 0, 16,
+ 190, 160, 185, 170, 144, 165, 151, 128, 148, 132, 111, 130, 112, 95, 110, 93, 78, 92, 74, 59, 72, 50, 36, 48, 16, 0, 8,
+ 192, 160, 167, 171, 143, 150, 153, 128, 134, 132, 111, 117, 112, 94, 100, 94, 77, 82, 74, 59, 63, 50, 36, 40, 14, 0, 0,
+ 193, 159, 149, 172, 143, 134, 153, 127, 119, 133, 110, 103, 113, 94, 87, 93, 77, 72, 73, 59, 54, 50, 36, 32, 12, 0, 0,
+ 195, 159, 131, 173, 142, 117, 153, 127, 104, 132, 110, 90, 113, 93, 76, 93, 76, 61, 74, 59, 45, 49, 36, 23, 9, 0, 0,
+ 196, 158, 113, 174, 141, 101, 155, 126, 89, 133, 109, 76, 113, 93, 64, 94, 76, 51, 74, 58, 35, 49, 36, 14, 6, 0, 0,
+ 197, 157, 92, 174, 141, 80, 154, 125, 71, 134, 108, 60, 114, 92, 50, 94, 75, 37, 73, 58, 22, 48, 36, 1, 5, 0, 0,
+ 197, 157, 68, 175, 140, 59, 155, 124, 51, 134, 108, 41, 113, 91, 32, 94, 75, 21, 73, 57, 5, 48, 35, 0, 5, 0, 0,
+ 198, 156, 46, 176, 140, 40, 155, 124, 32, 134, 107, 24, 114, 91, 14, 94, 75, 2, 73, 57, 0, 48, 36, 0, 3, 0, 0,
+ 189, 140, 191, 168, 126, 172, 150, 112, 154, 131, 97, 134, 112, 82, 115, 94, 66, 96, 74, 49, 75, 51, 25, 50, 12, 0, 10,
+ 191, 139, 173, 170, 125, 154, 152, 111, 138, 132, 96, 121, 113, 81, 103, 94, 66, 85, 74, 48, 66, 50, 26, 42, 12, 0, 1,
+ 192, 139, 157, 171, 125, 140, 152, 111, 125, 132, 96, 109, 113, 81, 92, 94, 65, 76, 74, 48, 58, 50, 26, 35, 9, 0, 0,
+ 193, 139, 140, 172, 124, 125, 153, 110, 112, 133, 95, 96, 113, 80, 82, 94, 65, 66, 74, 49, 50, 50, 26, 28, 7, 0, 0,
+ 194, 138, 123, 172, 123, 109, 153, 110, 97, 133, 95, 84, 113, 80, 70, 94, 65, 56, 74, 48, 40, 50, 26, 20, 6, 0, 0,
+ 194, 138, 105, 173, 123, 94, 153, 109, 83, 133, 94, 70, 112, 79, 59, 94, 64, 46, 74, 48, 31, 50, 26, 9, 4, 0, 0,
+ 196, 138, 87, 174, 122, 77, 153, 109, 67, 133, 93, 56, 113, 79, 46, 94, 64, 34, 73, 48, 18, 49, 27, 0, 4, 0, 0,
+ 196, 137, 65, 174, 122, 57, 154, 108, 49, 133, 93, 39, 113, 79, 29, 94, 64, 18, 74, 48, 3, 49, 27, 0, 2, 0, 0,
+ 197, 137, 47, 175, 122, 40, 155, 108, 32, 133, 93, 23, 114, 79, 14, 94, 64, 1, 73, 48, 0, 48, 27, 0, 2, 0, 0,
+ 189, 119, 177, 168, 106, 159, 150, 94, 142, 131, 81, 124, 113, 67, 107, 94, 53, 89, 74, 37, 69, 51, 11, 45, 6, 0, 3,
+ 191, 119, 161, 170, 106, 144, 152, 94, 129, 132, 81, 112, 113, 67, 96, 94, 53, 79, 74, 37, 61, 51, 13, 38, 6, 0, 0,
+ 192, 119, 146, 170, 106, 131, 152, 94, 117, 132, 80, 101, 112, 67, 85, 94, 53, 70, 74, 37, 53, 50, 14, 31, 4, 0, 0,
+ 192, 119, 131, 171, 106, 117, 153, 94, 105, 132, 80, 89, 113, 67, 75, 94, 54, 61, 74, 38, 45, 51, 14, 23, 3, 0, 0,
+ 193, 118, 114, 171, 106, 102, 153, 93, 90, 132, 80, 78, 113, 67, 65, 94, 53, 52, 74, 37, 36, 50, 15, 16, 1, 0, 0,
+ 194, 118, 99, 172, 105, 89, 153, 93, 78, 132, 80, 66, 113, 67, 54, 94, 53, 42, 74, 38, 27, 50, 16, 5, 1, 0, 0,
+ 194, 118, 82, 173, 105, 72, 153, 93, 63, 132, 79, 53, 113, 67, 42, 94, 53, 30, 74, 38, 15, 49, 16, 0, 0, 0, 0,
+ 195, 117, 63, 173, 105, 55, 154, 93, 47, 133, 79, 37, 113, 66, 27, 94, 53, 15, 73, 38, 0, 48, 16, 0, 0, 0, 0,
+ 195, 117, 46, 173, 104, 39, 154, 92, 32, 133, 79, 22, 113, 66, 13, 94, 53, 0, 73, 38, 0, 48, 17, 0, 0, 0, 0,
+ 189, 96, 166, 168, 85, 147, 150, 74, 132, 131, 62, 115, 113, 51, 99, 94, 38, 82, 74, 21, 63, 51, 0, 40, 1, 0, 0,
+ 190, 96, 150, 170, 85, 133, 152, 75, 119, 132, 63, 104, 113, 51, 88, 94, 38, 72, 75, 22, 55, 51, 0, 33, 1, 0, 0,
+ 192, 96, 137, 170, 85, 121, 152, 74, 108, 132, 64, 94, 113, 52, 79, 94, 39, 64, 74, 23, 48, 50, 0, 26, 0, 0, 0,
+ 192, 96, 122, 171, 86, 109, 152, 75, 96, 132, 63, 83, 113, 52, 69, 94, 39, 56, 74, 24, 41, 50, 0, 19, 0, 0, 0,
+ 193, 96, 107, 171, 85, 96, 152, 75, 84, 132, 64, 72, 113, 52, 60, 94, 39, 47, 74, 24, 32, 50, 1, 10, 0, 0, 0,
+ 193, 96, 93, 172, 85, 82, 152, 75, 72, 133, 63, 61, 113, 51, 49, 94, 39, 37, 73, 25, 23, 49, 2, 2, 0, 0, 0,
+ 194, 96, 78, 172, 85, 68, 152, 75, 59, 132, 63, 49, 113, 52, 39, 94, 40, 26, 73, 25, 11, 48, 3, 0, 0, 0, 0,
+ 194, 96, 60, 173, 85, 52, 153, 75, 44, 132, 64, 35, 112, 52, 25, 94, 40, 12, 73, 26, 0, 48, 4, 0, 0, 0, 0,
+ 195, 96, 46, 173, 85, 38, 154, 74, 31, 133, 63, 22, 113, 52, 11, 93, 40, 0, 73, 26, 0, 47, 5, 0, 0, 0, 0,
+ 188, 67, 153, 168, 58, 137, 151, 49, 122, 131, 39, 106, 113, 28, 90, 94, 13, 75, 75, 0, 57, 51, 0, 35, 0, 0, 0,
+ 190, 68, 138, 170, 59, 123, 152, 50, 110, 132, 41, 96, 113, 29, 80, 94, 16, 66, 75, 0, 49, 50, 0, 27, 0, 0, 0,
+ 191, 69, 126, 170, 59, 112, 151, 52, 100, 132, 42, 86, 113, 30, 73, 95, 17, 58, 75, 0, 42, 50, 0, 21, 0, 0, 0,
+ 192, 70, 113, 170, 61, 100, 151, 52, 89, 132, 42, 77, 113, 31, 64, 94, 19, 50, 74, 1, 35, 50, 0, 14, 0, 0, 0,
+ 192, 70, 100, 170, 62, 89, 151, 53, 77, 131, 43, 66, 112, 32, 54, 94, 20, 42, 74, 2, 27, 49, 0, 5, 0, 0, 0,
+ 192, 71, 87, 171, 61, 77, 152, 53, 67, 131, 44, 57, 112, 33, 45, 94, 21, 33, 74, 4, 19, 49, 0, 1, 0, 0, 0,
+ 193, 71, 74, 171, 62, 64, 152, 53, 55, 132, 44, 45, 113, 34, 34, 94, 22, 23, 73, 5, 7, 48, 0, 0, 0, 0, 0,
+ 193, 70, 58, 172, 62, 50, 152, 54, 42, 132, 44, 32, 112, 35, 22, 93, 23, 10, 73, 6, 0, 47, 0, 0, 0, 0, 0,
+ 193, 70, 45, 172, 62, 38, 153, 54, 31, 132, 44, 21, 112, 35, 9, 94, 23, 0, 73, 7, 0, 47, 0, 0, 0, 0, 0,
+ 189, 26, 141, 169, 15, 126, 150, 2, 112, 131, 0, 97, 113, 0, 82, 94, 0, 67, 75, 0, 51, 50, 0, 29, 0, 0, 0,
+ 190, 28, 128, 170, 18, 114, 151, 8, 101, 132, 0, 88, 113, 0, 74, 94, 0, 60, 75, 0, 44, 50, 0, 23, 0, 0, 0,
+ 191, 30, 117, 170, 23, 104, 152, 11, 92, 132, 1, 79, 113, 0, 67, 95, 0, 53, 75, 0, 37, 50, 0, 17, 0, 0, 0,
+ 191, 33, 105, 170, 26, 93, 151, 18, 83, 132, 6, 70, 112, 0, 58, 94, 0, 45, 75, 0, 30, 49, 0, 8, 0, 0, 0,
+ 191, 34, 93, 170, 27, 82, 151, 20, 72, 131, 8, 61, 112, 0, 49, 94, 0, 38, 74, 0, 23, 49, 0, 4, 0, 0, 0,
+ 191, 36, 82, 170, 29, 71, 151, 22, 63, 131, 11, 52, 112, 0, 41, 93, 0, 29, 74, 0, 14, 48, 0, 1, 0, 0, 0,
+ 191, 38, 69, 170, 31, 60, 151, 24, 51, 131, 14, 41, 112, 1, 31, 93, 0, 19, 73, 0, 3, 48, 0, 0, 0, 0, 0,
+ 192, 37, 56, 171, 31, 47, 152, 25, 40, 131, 17, 30, 112, 4, 19, 93, 0, 7, 73, 0, 0, 47, 0, 0, 0, 0, 0,
+ 192, 38, 45, 171, 33, 36, 152, 26, 30, 131, 18, 21, 111, 7, 9, 93, 0, 0, 73, 0, 0, 47, 0, 0, 0, 0, 0,
+ 149, 218, 248, 133, 194, 222, 119, 173, 198, 102, 151, 173, 86, 130, 148, 70, 108, 125, 53, 85, 100, 32, 59, 71, 0, 22, 33,
+ 154, 216, 223, 137, 193, 200, 122, 172, 178, 106, 150, 156, 89, 128, 133, 73, 107, 112, 54, 85, 89, 31, 59, 63, 0, 22, 26,
+ 159, 215, 202, 141, 192, 181, 126, 171, 161, 108, 149, 141, 90, 128, 121, 74, 107, 100, 55, 85, 80, 32, 58, 55, 0, 22, 19,
+ 161, 213, 179, 144, 190, 160, 126, 170, 143, 109, 148, 125, 92, 127, 107, 74, 106, 89, 56, 84, 69, 32, 58, 46, 0, 21, 11,
+ 163, 211, 156, 144, 189, 139, 129, 168, 125, 110, 147, 108, 93, 126, 92, 75, 105, 76, 57, 83, 58, 33, 58, 37, 0, 21, 1,
+ 167, 211, 133, 147, 188, 120, 130, 167, 105, 110, 145, 92, 93, 125, 78, 76, 104, 64, 58, 83, 48, 33, 57, 27, 0, 21, 0,
+ 169, 210, 108, 149, 187, 96, 131, 166, 86, 112, 144, 74, 94, 124, 62, 77, 103, 49, 58, 82, 35, 33, 57, 15, 0, 21, 0,
+ 170, 209, 80, 151, 186, 71, 133, 165, 62, 114, 143, 52, 95, 123, 42, 77, 103, 32, 58, 81, 18, 33, 56, 0, 0, 21, 0,
+ 173, 208, 55, 152, 186, 49, 134, 165, 41, 114, 143, 34, 95, 122, 25, 77, 102, 14, 58, 81, 0, 33, 56, 0, 0, 21, 0,
+ 154, 195, 232, 137, 174, 207, 122, 156, 185, 105, 136, 163, 89, 116, 140, 73, 97, 117, 56, 76, 94, 35, 51, 66, 0, 13, 28,
+ 158, 194, 209, 141, 174, 187, 125, 155, 167, 109, 135, 146, 91, 116, 125, 75, 96, 105, 57, 75, 83, 35, 50, 57, 0, 12, 21,
+ 161, 193, 189, 144, 173, 169, 128, 154, 151, 110, 134, 132, 93, 115, 113, 77, 95, 94, 58, 75, 74, 35, 50, 50, 0, 12, 13,
+ 164, 192, 168, 145, 171, 151, 129, 153, 134, 111, 133, 117, 94, 114, 100, 76, 95, 82, 58, 75, 64, 36, 50, 42, 0, 12, 5,
+ 165, 191, 147, 147, 170, 131, 130, 152, 117, 113, 132, 102, 95, 113, 86, 77, 94, 71, 58, 74, 54, 35, 50, 33, 0, 13, 0,
+ 167, 189, 126, 148, 169, 113, 132, 151, 100, 113, 131, 86, 96, 112, 73, 77, 93, 59, 59, 73, 43, 35, 49, 23, 0, 12, 0,
+ 170, 189, 104, 150, 168, 91, 133, 150, 81, 114, 130, 69, 96, 111, 57, 78, 92, 46, 59, 73, 31, 35, 49, 11, 0, 13, 0,
+ 171, 188, 78, 152, 168, 68, 134, 149, 60, 115, 130, 50, 96, 111, 41, 78, 92, 29, 60, 73, 15, 35, 49, 0, 0, 12, 0,
+ 173, 187, 55, 153, 167, 47, 134, 149, 39, 115, 129, 33, 97, 110, 24, 79, 92, 13, 60, 72, 0, 35, 48, 0, 0, 12, 0,
+ 157, 175, 217, 139, 157, 196, 125, 141, 175, 109, 122, 153, 92, 104, 132, 76, 86, 110, 59, 67, 88, 37, 43, 61, 1, 1, 23,
+ 161, 174, 196, 144, 156, 176, 127, 140, 158, 110, 121, 137, 94, 104, 118, 77, 85, 98, 59, 67, 78, 37, 43, 53, 0, 2, 16,
+ 163, 174, 178, 146, 156, 160, 130, 139, 143, 112, 121, 124, 95, 103, 106, 78, 85, 88, 60, 66, 69, 37, 42, 46, 0, 2, 7,
+ 166, 173, 159, 147, 154, 142, 130, 138, 127, 113, 120, 111, 96, 103, 95, 78, 84, 77, 60, 66, 59, 37, 43, 37, 0, 2, 0,
+ 166, 172, 139, 148, 154, 125, 131, 137, 112, 113, 120, 96, 96, 102, 81, 78, 84, 66, 60, 65, 50, 37, 42, 29, 0, 3, 0,
+ 167, 171, 120, 149, 153, 107, 133, 137, 95, 114, 118, 81, 97, 101, 69, 79, 84, 56, 60, 65, 40, 37, 42, 19, 0, 3, 0,
+ 170, 170, 99, 151, 152, 87, 134, 136, 77, 115, 118, 66, 97, 101, 55, 79, 83, 42, 61, 65, 28, 37, 42, 7, 0, 3, 0,
+ 172, 170, 75, 152, 151, 65, 134, 135, 57, 115, 117, 48, 97, 100, 38, 79, 83, 27, 61, 64, 12, 36, 42, 0, 0, 3, 0,
+ 172, 169, 55, 154, 151, 46, 135, 134, 40, 116, 116, 32, 97, 99, 21, 80, 82, 10, 61, 64, 0, 36, 41, 0, 0, 3, 0,
+ 160, 154, 203, 143, 139, 182, 127, 124, 164, 111, 107, 143, 95, 91, 122, 78, 75, 103, 60, 57, 81, 39, 33, 56, 1, 0, 18,
+ 163, 154, 184, 146, 138, 165, 130, 123, 148, 113, 107, 129, 96, 90, 110, 79, 74, 92, 61, 56, 72, 39, 34, 48, 2, 0, 9,
+ 165, 154, 167, 147, 137, 149, 131, 122, 134, 114, 106, 117, 96, 90, 100, 79, 74, 82, 61, 56, 64, 39, 33, 40, 2, 0, 1,
+ 166, 153, 150, 149, 137, 133, 132, 122, 119, 114, 106, 104, 97, 90, 88, 79, 74, 72, 61, 56, 55, 39, 34, 33, 0, 0, 0,
+ 168, 152, 132, 149, 136, 117, 132, 121, 104, 114, 105, 90, 97, 89, 76, 79, 73, 62, 61, 56, 46, 38, 34, 25, 0, 0, 0,
+ 169, 151, 114, 150, 135, 101, 133, 121, 90, 114, 104, 77, 97, 89, 65, 80, 73, 51, 61, 56, 36, 38, 34, 16, 0, 0, 0,
+ 170, 150, 94, 151, 135, 83, 134, 120, 73, 115, 104, 62, 98, 88, 51, 80, 72, 39, 61, 56, 24, 38, 34, 3, 0, 0, 0,
+ 172, 150, 72, 153, 134, 63, 135, 119, 55, 115, 103, 45, 98, 88, 36, 80, 72, 24, 61, 55, 9, 38, 34, 0, 0, 0, 0,
+ 172, 150, 54, 153, 134, 47, 135, 119, 38, 116, 103, 30, 98, 87, 21, 80, 72, 8, 62, 55, 0, 37, 34, 0, 0, 0, 0,
+ 162, 134, 190, 145, 120, 171, 129, 108, 153, 113, 93, 134, 97, 78, 115, 80, 63, 96, 62, 46, 75, 41, 23, 51, 0, 0, 11,
+ 165, 134, 173, 147, 120, 154, 131, 107, 138, 114, 92, 120, 97, 78, 103, 80, 63, 85, 62, 46, 66, 40, 23, 43, 0, 0, 2,
+ 166, 134, 157, 148, 120, 140, 132, 106, 125, 114, 92, 109, 97, 77, 93, 81, 63, 77, 62, 46, 58, 40, 24, 36, 0, 0, 0,
+ 168, 133, 140, 149, 119, 125, 132, 106, 112, 115, 92, 97, 98, 77, 82, 81, 62, 67, 62, 46, 50, 40, 24, 29, 0, 0, 0,
+ 168, 133, 123, 150, 119, 110, 133, 106, 97, 115, 91, 84, 98, 77, 70, 81, 62, 57, 62, 46, 41, 40, 24, 20, 0, 0, 0,
+ 169, 132, 107, 150, 118, 94, 133, 105, 84, 115, 91, 72, 98, 76, 60, 80, 62, 47, 62, 46, 32, 39, 25, 11, 0, 0, 0,
+ 171, 132, 89, 152, 118, 79, 135, 105, 69, 115, 90, 58, 98, 76, 47, 80, 62, 36, 62, 46, 21, 39, 25, 0, 0, 0, 0,
+ 171, 132, 69, 153, 117, 60, 135, 104, 52, 116, 90, 42, 98, 76, 33, 81, 61, 21, 62, 46, 6, 38, 25, 0, 0, 0, 0,
+ 172, 132, 54, 153, 118, 45, 135, 104, 38, 116, 90, 28, 98, 76, 18, 81, 61, 6, 62, 46, 0, 38, 25, 0, 0, 0, 0,
+ 164, 115, 177, 146, 103, 159, 130, 91, 143, 114, 78, 125, 97, 65, 107, 81, 51, 89, 63, 34, 69, 41, 9, 46, 0, 0, 4,
+ 166, 115, 161, 148, 103, 144, 132, 91, 129, 115, 78, 112, 98, 65, 96, 81, 51, 79, 63, 35, 61, 41, 11, 38, 0, 0, 0,
+ 167, 115, 146, 150, 102, 131, 132, 91, 117, 115, 78, 101, 98, 65, 86, 81, 51, 71, 63, 35, 54, 41, 12, 32, 0, 0, 0,
+ 168, 114, 132, 150, 103, 118, 133, 91, 105, 116, 78, 91, 98, 64, 76, 82, 51, 61, 63, 36, 46, 41, 13, 24, 0, 0, 0,
+ 169, 114, 116, 150, 102, 103, 134, 90, 91, 116, 78, 79, 98, 65, 66, 81, 51, 53, 63, 36, 37, 40, 14, 17, 0, 0, 0,
+ 169, 114, 101, 151, 101, 89, 134, 90, 79, 116, 77, 67, 98, 64, 56, 81, 51, 44, 63, 36, 29, 40, 15, 7, 0, 0, 0,
+ 170, 114, 85, 152, 101, 75, 135, 90, 65, 116, 77, 54, 98, 64, 44, 81, 51, 32, 63, 36, 17, 39, 15, 0, 0, 0, 0,
+ 172, 113, 66, 152, 101, 58, 135, 89, 49, 116, 77, 40, 99, 64, 30, 81, 51, 18, 62, 36, 3, 38, 16, 0, 0, 0, 0,
+ 171, 113, 51, 153, 101, 44, 136, 89, 36, 116, 77, 28, 99, 64, 18, 81, 51, 5, 62, 36, 0, 38, 16, 0, 0, 0, 0,
+ 165, 94, 166, 147, 82, 147, 132, 72, 132, 115, 61, 115, 98, 49, 99, 82, 36, 82, 64, 19, 64, 42, 0, 41, 0, 0, 0,
+ 167, 93, 150, 150, 83, 134, 133, 73, 120, 116, 62, 104, 99, 49, 88, 82, 36, 72, 64, 20, 55, 41, 0, 33, 0, 0, 0,
+ 169, 93, 137, 150, 83, 122, 134, 73, 109, 116, 61, 94, 99, 50, 80, 82, 37, 65, 64, 21, 49, 41, 0, 27, 0, 0, 0,
+ 169, 94, 123, 150, 83, 110, 133, 73, 97, 116, 61, 83, 99, 50, 70, 82, 38, 57, 63, 23, 42, 41, 0, 20, 0, 0, 0,
+ 169, 94, 109, 150, 84, 97, 134, 73, 85, 116, 62, 73, 99, 51, 61, 81, 38, 48, 63, 23, 33, 41, 1, 11, 0, 0, 0,
+ 170, 94, 96, 150, 83, 84, 134, 73, 74, 116, 61, 62, 99, 50, 51, 82, 38, 39, 64, 23, 24, 40, 3, 4, 0, 0, 0,
+ 171, 93, 79, 152, 82, 70, 135, 73, 61, 116, 62, 51, 98, 51, 40, 81, 38, 28, 63, 24, 14, 39, 4, 0, 0, 0, 0,
+ 171, 94, 64, 152, 83, 55, 135, 73, 47, 116, 62, 37, 98, 50, 27, 81, 38, 15, 63, 24, 1, 39, 4, 0, 0, 0, 0,
+ 172, 93, 51, 153, 82, 42, 135, 73, 35, 117, 62, 26, 99, 51, 16, 81, 39, 3, 63, 25, 0, 38, 5, 0, 0, 0, 0,
+ 166, 68, 153, 148, 59, 137, 133, 49, 121, 115, 39, 106, 99, 28, 91, 82, 13, 75, 65, 0, 58, 42, 0, 36, 0, 0, 0,
+ 168, 68, 139, 150, 59, 124, 134, 50, 110, 116, 40, 96, 99, 30, 81, 82, 16, 66, 64, 0, 50, 41, 0, 29, 0, 0, 0,
+ 169, 69, 126, 150, 59, 113, 134, 51, 101, 117, 42, 87, 100, 30, 73, 82, 17, 59, 65, 0, 43, 41, 0, 23, 0, 0, 0,
+ 169, 70, 115, 150, 61, 102, 134, 52, 89, 116, 42, 77, 99, 32, 65, 82, 19, 52, 64, 0, 36, 41, 0, 15, 0, 0, 0,
+ 169, 70, 101, 150, 61, 90, 134, 52, 79, 116, 43, 68, 99, 32, 55, 82, 21, 43, 64, 2, 28, 41, 0, 6, 0, 0, 0,
+ 170, 70, 89, 151, 62, 79, 134, 53, 69, 116, 44, 58, 99, 33, 46, 81, 21, 34, 64, 3, 20, 41, 0, 2, 0, 0, 0,
+ 170, 71, 76, 152, 62, 66, 134, 53, 57, 116, 43, 46, 99, 33, 36, 82, 22, 24, 64, 5, 10, 40, 0, 0, 0, 0, 0,
+ 171, 70, 61, 152, 62, 52, 135, 53, 44, 116, 44, 35, 99, 34, 24, 82, 22, 12, 63, 6, 0, 39, 0, 0, 0, 0, 0,
+ 171, 71, 49, 153, 62, 41, 135, 54, 33, 117, 45, 25, 98, 34, 13, 81, 23, 0, 63, 7, 0, 39, 0, 0, 0, 0, 0,
+ 167, 33, 142, 149, 24, 127, 134, 10, 113, 116, 0, 97, 100, 0, 83, 83, 0, 68, 65, 0, 52, 40, 0, 30, 0, 0, 0,
+ 169, 33, 129, 150, 26, 115, 134, 17, 102, 116, 3, 89, 100, 0, 75, 83, 0, 60, 65, 0, 45, 40, 0, 24, 0, 0, 0,
+ 169, 36, 118, 151, 27, 104, 134, 19, 93, 116, 7, 80, 100, 0, 67, 83, 0, 54, 65, 0, 38, 41, 0, 17, 0, 0, 0,
+ 169, 39, 107, 150, 30, 94, 134, 22, 84, 116, 11, 71, 99, 0, 59, 83, 0, 46, 64, 0, 31, 40, 0, 9, 0, 0, 0,
+ 169, 39, 95, 151, 31, 83, 134, 24, 73, 116, 15, 62, 100, 1, 51, 83, 0, 38, 64, 0, 24, 40, 0, 5, 0, 0, 0,
+ 169, 41, 83, 151, 33, 73, 134, 26, 64, 117, 17, 54, 99, 4, 42, 82, 0, 30, 64, 0, 16, 40, 0, 1, 0, 0, 0,
+ 170, 42, 71, 152, 34, 62, 134, 28, 53, 117, 19, 44, 99, 6, 33, 82, 0, 21, 63, 0, 4, 39, 0, 0, 0, 0, 0,
+ 171, 42, 59, 152, 35, 50, 134, 29, 42, 117, 21, 32, 99, 9, 22, 82, 0, 9, 63, 0, 0, 38, 0, 0, 0, 0, 0,
+ 172, 42, 48, 152, 36, 40, 135, 29, 32, 117, 21, 23, 99, 10, 12, 82, 0, 0, 63, 0, 0, 38, 0, 0, 0, 0, 0,
+ 107, 207, 246, 96, 185, 220, 86, 165, 196, 73, 144, 171, 60, 123, 147, 46, 103, 125, 32, 82, 100, 9, 56, 71, 0, 20, 33,
+ 115, 206, 221, 104, 184, 198, 92, 164, 178, 78, 143, 154, 64, 123, 133, 51, 102, 111, 34, 81, 89, 10, 56, 63, 0, 20, 27,
+ 122, 204, 200, 108, 183, 180, 95, 163, 161, 82, 142, 140, 68, 122, 120, 54, 102, 101, 36, 81, 79, 11, 56, 55, 0, 20, 20,
+ 125, 203, 179, 111, 181, 160, 97, 162, 143, 85, 141, 124, 70, 121, 107, 55, 101, 89, 38, 80, 69, 14, 55, 46, 0, 19, 10,
+ 128, 202, 156, 113, 180, 140, 102, 161, 125, 87, 140, 108, 71, 120, 92, 56, 100, 76, 39, 79, 59, 14, 55, 38, 0, 20, 3,
+ 132, 200, 135, 117, 179, 121, 103, 159, 106, 88, 139, 93, 73, 119, 79, 57, 100, 65, 41, 79, 49, 15, 54, 28, 0, 19, 0,
+ 134, 200, 111, 119, 178, 98, 105, 158, 87, 89, 138, 76, 74, 118, 64, 58, 99, 51, 41, 78, 37, 16, 54, 17, 0, 19, 0,
+ 137, 199, 85, 122, 177, 75, 108, 158, 66, 91, 137, 56, 75, 118, 46, 59, 98, 35, 42, 78, 22, 16, 54, 3, 0, 19, 0,
+ 140, 198, 62, 125, 177, 55, 109, 158, 47, 92, 137, 40, 76, 117, 32, 59, 98, 21, 42, 78, 6, 16, 54, 0, 0, 18, 0,
+ 118, 186, 231, 106, 167, 206, 93, 149, 184, 81, 130, 161, 67, 111, 139, 54, 92, 117, 39, 72, 93, 17, 48, 66, 0, 10, 29,
+ 123, 185, 207, 110, 166, 186, 98, 148, 167, 85, 129, 145, 71, 111, 125, 56, 92, 104, 40, 72, 83, 18, 48, 57, 0, 10, 22,
+ 128, 184, 188, 113, 165, 168, 102, 147, 151, 88, 128, 131, 73, 110, 113, 58, 91, 94, 42, 71, 74, 19, 48, 50, 0, 9, 15,
+ 131, 183, 168, 116, 164, 151, 104, 146, 134, 89, 127, 117, 73, 109, 100, 58, 90, 83, 42, 71, 65, 20, 48, 42, 0, 9, 5,
+ 134, 182, 148, 120, 163, 131, 105, 145, 118, 90, 126, 102, 75, 108, 86, 59, 90, 72, 43, 71, 55, 19, 47, 34, 0, 9, 0,
+ 136, 181, 128, 122, 162, 115, 107, 144, 102, 92, 125, 87, 76, 107, 74, 61, 89, 60, 44, 70, 45, 20, 47, 24, 0, 8, 0,
+ 139, 180, 106, 124, 161, 95, 109, 144, 83, 93, 124, 71, 77, 107, 60, 61, 89, 47, 44, 70, 33, 20, 47, 13, 0, 8, 0,
+ 142, 179, 82, 125, 160, 72, 111, 143, 63, 94, 124, 54, 77, 106, 44, 61, 88, 32, 44, 69, 18, 20, 46, 0, 0, 8, 0,
+ 143, 179, 62, 127, 160, 54, 111, 142, 47, 94, 124, 39, 78, 106, 29, 62, 88, 18, 45, 69, 3, 20, 46, 0, 0, 8, 0,
+ 124, 167, 216, 112, 150, 194, 99, 134, 174, 87, 117, 153, 73, 100, 131, 58, 82, 110, 43, 64, 88, 23, 40, 61, 0, 0, 24,
+ 129, 166, 195, 116, 150, 175, 103, 134, 158, 89, 116, 137, 75, 99, 118, 60, 82, 98, 44, 63, 78, 23, 40, 53, 0, 0, 17,
+ 132, 166, 177, 119, 149, 160, 106, 133, 143, 90, 115, 124, 76, 99, 107, 61, 81, 88, 45, 63, 69, 24, 40, 46, 0, 0, 9,
+ 136, 166, 159, 121, 148, 143, 107, 132, 126, 92, 115, 111, 77, 98, 94, 62, 81, 78, 46, 63, 60, 23, 40, 38, 0, 0, 0,
+ 138, 164, 140, 122, 147, 125, 108, 131, 111, 93, 114, 97, 79, 98, 82, 63, 80, 67, 46, 62, 50, 24, 40, 29, 0, 0, 0,
+ 139, 163, 122, 124, 146, 109, 110, 131, 96, 94, 114, 83, 79, 97, 70, 63, 81, 57, 46, 62, 41, 24, 40, 21, 0, 0, 0,
+ 141, 163, 101, 126, 145, 90, 111, 130, 79, 95, 113, 68, 79, 96, 56, 63, 80, 44, 47, 62, 30, 23, 40, 10, 0, 0, 0,
+ 144, 162, 79, 127, 145, 70, 112, 129, 60, 95, 112, 51, 79, 96, 41, 64, 79, 30, 47, 61, 15, 23, 40, 0, 0, 0, 0,
+ 145, 162, 60, 129, 145, 52, 113, 129, 46, 96, 112, 37, 79, 95, 27, 64, 79, 16, 47, 61, 1, 23, 39, 0, 0, 0, 0,
+ 131, 147, 202, 117, 133, 181, 105, 119, 162, 91, 103, 142, 77, 87, 122, 62, 71, 102, 47, 54, 81, 26, 31, 56, 0, 0, 18,
+ 135, 147, 183, 120, 132, 164, 107, 118, 147, 93, 102, 128, 78, 87, 110, 63, 71, 92, 47, 54, 72, 26, 31, 48, 0, 0, 10,
+ 138, 147, 166, 123, 131, 149, 108, 118, 133, 94, 102, 116, 79, 86, 100, 64, 71, 82, 48, 54, 64, 27, 31, 41, 0, 0, 2,
+ 139, 146, 149, 124, 131, 134, 111, 117, 119, 94, 101, 103, 79, 86, 88, 64, 70, 72, 48, 53, 55, 27, 31, 33, 0, 0, 0,
+ 141, 146, 132, 125, 131, 117, 111, 117, 104, 95, 101, 91, 80, 86, 77, 65, 70, 62, 48, 53, 46, 26, 31, 25, 0, 0, 0,
+ 143, 145, 115, 126, 130, 101, 112, 116, 90, 96, 100, 78, 80, 85, 65, 65, 70, 52, 49, 53, 37, 27, 32, 17, 0, 0, 0,
+ 144, 144, 96, 128, 129, 85, 112, 115, 75, 97, 100, 64, 81, 85, 52, 65, 69, 40, 49, 53, 26, 26, 31, 5, 0, 0, 0,
+ 146, 144, 76, 129, 129, 67, 114, 115, 58, 97, 99, 48, 82, 84, 38, 66, 69, 27, 49, 53, 12, 26, 32, 0, 0, 0, 0,
+ 146, 144, 59, 130, 128, 51, 114, 114, 43, 98, 99, 35, 82, 84, 25, 66, 69, 13, 49, 53, 0, 26, 32, 0, 0, 0, 0,
+ 135, 129, 189, 122, 115, 170, 107, 103, 152, 94, 89, 133, 79, 74, 114, 64, 60, 95, 49, 43, 75, 29, 20, 51, 0, 0, 12,
+ 138, 129, 171, 124, 115, 153, 110, 103, 138, 95, 89, 120, 81, 74, 103, 66, 60, 86, 50, 44, 67, 28, 21, 43, 0, 0, 3,
+ 140, 129, 156, 125, 115, 140, 111, 103, 125, 96, 89, 109, 81, 74, 93, 67, 60, 76, 50, 44, 59, 29, 22, 36, 0, 0, 0,
+ 142, 128, 140, 127, 115, 125, 112, 102, 112, 97, 88, 97, 82, 74, 83, 67, 60, 67, 50, 44, 51, 29, 22, 29, 0, 0, 0,
+ 142, 128, 124, 127, 114, 111, 113, 102, 98, 98, 88, 85, 82, 74, 71, 66, 60, 58, 50, 44, 42, 29, 22, 21, 0, 0, 0,
+ 144, 127, 108, 128, 114, 96, 113, 101, 85, 98, 87, 73, 82, 74, 61, 67, 60, 48, 50, 44, 33, 28, 23, 12, 0, 0, 0,
+ 145, 127, 91, 129, 114, 81, 115, 101, 71, 98, 87, 60, 82, 73, 48, 67, 59, 37, 50, 44, 22, 29, 23, 1, 0, 0, 0,
+ 147, 127, 73, 130, 113, 63, 115, 101, 55, 98, 87, 45, 83, 73, 35, 67, 59, 24, 50, 44, 10, 28, 24, 0, 0, 0, 0,
+ 147, 127, 58, 131, 113, 49, 115, 100, 42, 99, 86, 33, 83, 73, 23, 67, 59, 10, 50, 44, 0, 27, 24, 0, 0, 0, 0,
+ 138, 110, 177, 124, 99, 159, 110, 88, 142, 96, 75, 125, 82, 62, 107, 66, 48, 89, 51, 33, 70, 30, 8, 46, 0, 0, 5,
+ 142, 111, 160, 127, 99, 144, 113, 88, 130, 98, 75, 112, 82, 62, 96, 68, 49, 80, 51, 33, 61, 30, 10, 39, 0, 0, 0,
+ 143, 111, 146, 128, 99, 131, 114, 88, 118, 98, 75, 101, 83, 62, 86, 68, 49, 71, 52, 33, 54, 30, 11, 32, 0, 0, 0,
+ 144, 111, 132, 128, 99, 118, 113, 88, 106, 99, 75, 91, 83, 62, 77, 68, 49, 62, 52, 34, 46, 30, 12, 25, 0, 0, 0,
+ 144, 111, 117, 129, 98, 104, 114, 87, 92, 99, 75, 80, 83, 62, 67, 68, 49, 53, 51, 34, 38, 30, 13, 18, 0, 0, 0,
+ 145, 111, 103, 130, 98, 91, 114, 87, 80, 99, 75, 68, 83, 63, 57, 68, 50, 45, 51, 34, 30, 30, 14, 8, 0, 0, 0,
+ 146, 110, 87, 131, 98, 76, 115, 87, 67, 99, 75, 56, 83, 62, 45, 68, 49, 33, 52, 35, 19, 30, 15, 2, 0, 0, 0,
+ 148, 110, 70, 131, 98, 60, 116, 86, 52, 99, 74, 43, 84, 62, 33, 69, 49, 21, 52, 35, 6, 29, 15, 0, 0, 0, 0,
+ 148, 110, 56, 132, 97, 48, 117, 87, 40, 100, 75, 31, 84, 62, 22, 68, 49, 9, 51, 35, 0, 28, 15, 0, 0, 0, 0,
+ 142, 91, 166, 126, 80, 148, 113, 71, 132, 98, 59, 115, 83, 47, 99, 69, 34, 82, 53, 17, 64, 32, 0, 41, 0, 0, 0,
+ 143, 91, 150, 128, 81, 135, 114, 71, 120, 99, 60, 104, 85, 48, 89, 69, 35, 73, 53, 19, 56, 32, 0, 34, 0, 0, 0,
+ 145, 91, 137, 129, 81, 122, 115, 71, 109, 100, 60, 94, 85, 48, 81, 69, 35, 65, 53, 19, 49, 32, 0, 28, 0, 0, 0,
+ 146, 92, 124, 130, 81, 110, 115, 71, 98, 100, 60, 84, 85, 49, 71, 69, 36, 57, 53, 21, 42, 32, 0, 21, 0, 0, 0,
+ 147, 91, 110, 130, 81, 97, 115, 71, 86, 100, 60, 74, 84, 49, 62, 69, 36, 48, 53, 22, 34, 32, 0, 13, 0, 0, 0,
+ 147, 92, 97, 130, 81, 85, 116, 72, 76, 100, 60, 63, 85, 49, 52, 69, 37, 40, 53, 22, 26, 31, 1, 5, 0, 0, 0,
+ 148, 92, 82, 131, 81, 71, 116, 71, 62, 100, 60, 53, 84, 49, 42, 69, 37, 30, 52, 23, 16, 31, 2, 0, 0, 0, 0,
+ 148, 91, 67, 132, 81, 57, 117, 71, 49, 100, 60, 39, 84, 49, 30, 69, 37, 18, 52, 23, 2, 30, 2, 0, 0, 0, 0,
+ 149, 91, 54, 132, 81, 46, 118, 71, 39, 101, 60, 29, 85, 49, 19, 69, 37, 6, 52, 23, 0, 29, 3, 0, 0, 0, 0,
+ 143, 68, 153, 128, 59, 137, 115, 49, 122, 99, 39, 107, 85, 28, 91, 70, 13, 75, 54, 0, 58, 32, 0, 36, 0, 0, 0,
+ 146, 68, 140, 131, 59, 125, 116, 51, 111, 100, 40, 97, 85, 29, 82, 70, 15, 67, 54, 0, 50, 32, 0, 29, 0, 0, 0,
+ 147, 68, 127, 131, 59, 114, 117, 51, 102, 101, 41, 88, 86, 30, 74, 70, 17, 60, 54, 0, 44, 32, 0, 23, 0, 0, 0,
+ 147, 70, 115, 131, 60, 103, 116, 52, 91, 100, 42, 78, 85, 32, 65, 70, 19, 53, 54, 1, 38, 32, 0, 17, 0, 0, 0,
+ 147, 70, 103, 131, 61, 91, 117, 53, 81, 101, 43, 69, 86, 32, 57, 70, 20, 44, 54, 2, 30, 32, 0, 7, 0, 0, 0,
+ 148, 70, 91, 132, 61, 80, 117, 52, 70, 101, 43, 59, 85, 33, 48, 70, 21, 36, 53, 4, 22, 32, 0, 3, 0, 0, 0,
+ 148, 70, 78, 132, 62, 68, 117, 53, 58, 101, 43, 48, 85, 34, 38, 70, 22, 26, 53, 6, 12, 31, 0, 0, 0, 0, 0,
+ 149, 71, 64, 132, 62, 54, 118, 54, 46, 101, 44, 37, 85, 34, 27, 69, 23, 15, 53, 7, 1, 30, 0, 0, 0, 0, 0,
+ 150, 70, 53, 134, 61, 44, 118, 54, 36, 101, 44, 28, 85, 35, 17, 69, 23, 4, 52, 8, 0, 30, 0, 0, 0, 0, 0,
+ 145, 38, 143, 130, 29, 128, 117, 18, 114, 101, 3, 98, 87, 0, 84, 72, 0, 69, 54, 0, 53, 30, 0, 31, 0, 0, 0,
+ 147, 38, 130, 132, 30, 116, 117, 22, 103, 101, 8, 89, 87, 0, 76, 72, 0, 62, 54, 0, 46, 30, 0, 24, 0, 0, 0,
+ 148, 40, 119, 132, 31, 105, 117, 23, 94, 101, 13, 81, 87, 0, 68, 71, 0, 55, 54, 0, 39, 30, 0, 18, 0, 0, 0,
+ 148, 42, 108, 132, 34, 96, 117, 25, 85, 102, 15, 73, 86, 2, 60, 71, 0, 47, 54, 0, 33, 30, 0, 11, 0, 0, 0,
+ 148, 43, 96, 133, 35, 85, 117, 28, 75, 102, 18, 64, 87, 5, 52, 71, 0, 40, 54, 0, 25, 30, 0, 5, 0, 0, 0,
+ 149, 44, 85, 132, 36, 75, 118, 29, 66, 101, 20, 55, 86, 8, 44, 70, 0, 32, 53, 0, 18, 29, 0, 2, 0, 0, 0,
+ 149, 45, 74, 133, 37, 64, 118, 31, 55, 102, 21, 45, 85, 10, 34, 70, 0, 22, 53, 0, 6, 28, 0, 0, 0, 0, 0,
+ 150, 46, 61, 133, 39, 52, 118, 31, 44, 102, 23, 34, 85, 12, 24, 70, 0, 12, 52, 0, 0, 28, 0, 0, 0, 0, 0,
+ 150, 46, 51, 133, 40, 42, 119, 32, 35, 102, 24, 25, 85, 13, 14, 70, 0, 1, 52, 0, 0, 27, 0, 0, 0, 0, 0,
+ 53, 198, 244, 49, 177, 218, 41, 158, 195, 32, 138, 171, 22, 118, 147, 11, 98, 124, 0, 78, 100, 0, 54, 71, 0, 18, 34,
+ 69, 196, 220, 64, 175, 196, 54, 157, 176, 45, 137, 154, 32, 117, 133, 19, 98, 111, 0, 78, 89, 0, 53, 63, 0, 17, 27,
+ 80, 195, 198, 69, 175, 179, 60, 156, 159, 50, 136, 139, 38, 116, 120, 25, 98, 101, 4, 77, 80, 0, 53, 55, 0, 17, 21,
+ 84, 193, 177, 75, 173, 159, 64, 155, 142, 55, 135, 124, 41, 116, 107, 27, 97, 89, 9, 76, 70, 0, 53, 47, 0, 17, 11,
+ 89, 193, 157, 79, 172, 140, 70, 154, 125, 57, 134, 109, 44, 115, 92, 32, 96, 76, 13, 76, 59, 0, 52, 39, 0, 16, 4,
+ 94, 191, 135, 85, 171, 121, 72, 152, 108, 60, 133, 94, 47, 114, 80, 32, 95, 65, 15, 76, 49, 0, 52, 29, 0, 16, 0,
+ 98, 190, 113, 87, 170, 100, 76, 152, 89, 62, 132, 77, 49, 113, 65, 35, 95, 52, 18, 75, 37, 0, 52, 18, 0, 15, 0,
+ 103, 190, 89, 90, 169, 80, 78, 151, 70, 64, 132, 60, 51, 113, 49, 37, 94, 38, 20, 75, 25, 0, 52, 5, 0, 15, 0,
+ 106, 189, 69, 93, 169, 61, 80, 151, 53, 66, 131, 45, 52, 113, 36, 37, 94, 25, 19, 74, 11, 0, 51, 0, 0, 15, 0,
+ 76, 178, 229, 68, 159, 205, 61, 142, 183, 50, 124, 160, 40, 106, 138, 28, 88, 116, 12, 69, 93, 0, 45, 66, 0, 5, 29,
+ 86, 177, 207, 78, 158, 184, 67, 142, 166, 56, 123, 145, 45, 106, 125, 31, 88, 105, 16, 69, 83, 0, 45, 58, 0, 6, 22,
+ 93, 176, 187, 81, 158, 168, 71, 141, 150, 61, 123, 131, 47, 105, 113, 35, 87, 94, 20, 68, 74, 0, 45, 51, 0, 5, 16,
+ 98, 175, 168, 84, 157, 150, 75, 140, 134, 63, 122, 117, 50, 104, 100, 37, 87, 83, 21, 68, 65, 0, 45, 42, 0, 4, 7,
+ 100, 174, 149, 89, 155, 132, 76, 139, 117, 65, 121, 102, 53, 104, 87, 39, 86, 72, 23, 67, 55, 0, 45, 34, 0, 3, 0,
+ 103, 173, 130, 92, 155, 115, 80, 138, 102, 68, 120, 88, 53, 103, 75, 40, 86, 61, 24, 67, 45, 0, 45, 25, 0, 3, 0,
+ 107, 172, 108, 95, 154, 96, 82, 137, 85, 70, 119, 73, 55, 102, 61, 42, 85, 49, 25, 67, 34, 0, 45, 14, 0, 3, 0,
+ 110, 172, 86, 97, 153, 76, 85, 137, 67, 70, 119, 57, 56, 102, 46, 42, 84, 35, 26, 66, 21, 0, 44, 1, 0, 3, 0,
+ 112, 171, 67, 98, 153, 59, 86, 137, 52, 71, 119, 44, 58, 102, 34, 44, 85, 22, 27, 66, 7, 0, 44, 0, 0, 3, 0,
+ 90, 160, 215, 81, 144, 193, 70, 129, 173, 61, 112, 151, 49, 95, 131, 37, 79, 109, 22, 61, 87, 0, 38, 61, 0, 0, 25,
+ 96, 160, 194, 86, 143, 174, 75, 128, 157, 65, 112, 137, 53, 95, 117, 40, 78, 98, 25, 60, 78, 0, 38, 53, 0, 0, 17,
+ 100, 159, 177, 89, 143, 159, 79, 128, 143, 67, 111, 124, 55, 95, 107, 42, 78, 89, 27, 60, 70, 2, 38, 46, 0, 0, 9,
+ 104, 158, 159, 92, 142, 143, 81, 127, 127, 69, 110, 110, 56, 94, 94, 43, 78, 78, 28, 60, 60, 2, 38, 38, 0, 0, 1,
+ 107, 157, 140, 94, 141, 125, 82, 126, 112, 71, 110, 97, 59, 94, 82, 45, 77, 67, 29, 59, 51, 4, 37, 30, 0, 0, 0,
+ 110, 156, 122, 97, 140, 109, 85, 125, 97, 72, 109, 83, 58, 93, 71, 45, 77, 57, 29, 60, 42, 5, 38, 22, 0, 0, 0,
+ 111, 156, 103, 99, 139, 91, 87, 125, 81, 73, 108, 69, 60, 92, 58, 46, 77, 45, 30, 59, 31, 5, 38, 12, 0, 0, 0,
+ 115, 156, 82, 101, 140, 73, 88, 124, 63, 74, 108, 53, 60, 92, 44, 46, 76, 32, 31, 59, 18, 6, 37, 0, 0, 0, 0,
+ 116, 155, 65, 102, 139, 58, 89, 124, 49, 75, 108, 41, 61, 92, 32, 48, 76, 21, 31, 59, 6, 5, 37, 0, 0, 0, 0,
+ 100, 141, 201, 88, 127, 181, 79, 114, 162, 69, 99, 142, 57, 83, 122, 44, 68, 102, 30, 51, 81, 7, 28, 56, 0, 0, 19,
+ 105, 141, 182, 94, 127, 163, 83, 114, 146, 71, 98, 128, 59, 83, 110, 46, 68, 91, 31, 51, 72, 10, 28, 48, 0, 0, 11,
+ 108, 141, 166, 96, 127, 149, 85, 113, 133, 73, 98, 116, 60, 83, 99, 46, 68, 82, 32, 51, 64, 11, 29, 41, 0, 0, 2,
+ 111, 141, 149, 98, 126, 134, 88, 112, 119, 74, 97, 103, 61, 83, 88, 48, 67, 72, 33, 51, 56, 11, 29, 34, 0, 0, 0,
+ 112, 140, 132, 100, 125, 118, 89, 112, 105, 75, 97, 91, 62, 82, 77, 49, 68, 62, 33, 51, 47, 12, 29, 26, 0, 0, 0,
+ 115, 140, 116, 102, 125, 103, 90, 111, 91, 76, 96, 78, 62, 82, 65, 49, 67, 52, 34, 51, 38, 13, 29, 18, 0, 0, 0,
+ 117, 139, 97, 103, 124, 87, 91, 111, 77, 78, 96, 65, 63, 81, 54, 49, 67, 41, 34, 51, 27, 12, 29, 7, 0, 0, 0,
+ 119, 138, 78, 105, 124, 69, 92, 110, 60, 78, 95, 50, 65, 81, 40, 50, 67, 29, 34, 51, 15, 13, 30, 0, 0, 0, 0,
+ 120, 138, 64, 106, 124, 54, 93, 110, 47, 78, 95, 38, 65, 81, 29, 50, 66, 17, 34, 50, 2, 13, 29, 0, 0, 0, 0,
+ 107, 124, 189, 96, 111, 169, 85, 99, 152, 73, 85, 132, 61, 71, 114, 48, 57, 95, 34, 41, 75, 14, 18, 51, 0, 0, 13,
+ 111, 124, 171, 100, 111, 153, 88, 99, 137, 75, 85, 120, 63, 72, 103, 50, 58, 85, 36, 41, 66, 15, 19, 43, 0, 0, 4,
+ 113, 124, 156, 101, 111, 139, 90, 99, 125, 77, 85, 109, 64, 71, 93, 51, 57, 77, 36, 42, 59, 17, 20, 37, 0, 0, 0,
+ 115, 124, 140, 103, 111, 125, 90, 99, 112, 78, 85, 97, 64, 71, 82, 52, 57, 67, 36, 42, 50, 16, 20, 30, 0, 0, 0,
+ 117, 123, 125, 104, 110, 111, 92, 98, 99, 79, 85, 86, 65, 71, 72, 51, 58, 59, 37, 42, 43, 17, 21, 22, 0, 0, 0,
+ 118, 123, 110, 105, 110, 97, 93, 98, 86, 78, 84, 74, 66, 71, 62, 52, 57, 49, 37, 42, 34, 17, 22, 14, 0, 0, 0,
+ 120, 123, 93, 106, 109, 82, 94, 97, 72, 80, 84, 61, 66, 71, 50, 52, 57, 38, 37, 42, 24, 17, 22, 2, 0, 0, 0,
+ 121, 122, 75, 108, 109, 66, 95, 97, 58, 80, 84, 48, 66, 71, 37, 52, 57, 26, 37, 42, 12, 16, 22, 0, 0, 0, 0,
+ 122, 123, 62, 108, 109, 52, 95, 97, 45, 81, 84, 36, 67, 70, 26, 52, 57, 14, 37, 42, 0, 15, 22, 0, 0, 0, 0,
+ 113, 107, 177, 102, 96, 159, 89, 85, 141, 78, 72, 124, 65, 60, 107, 52, 46, 89, 37, 30, 70, 18, 5, 46, 0, 0, 6,
+ 116, 107, 160, 104, 96, 144, 92, 85, 129, 80, 72, 112, 67, 60, 96, 53, 47, 80, 38, 31, 62, 19, 7, 39, 0, 0, 0,
+ 118, 107, 147, 105, 96, 131, 93, 85, 118, 80, 72, 101, 67, 60, 87, 54, 47, 71, 39, 31, 54, 19, 8, 32, 0, 0, 0,
+ 119, 107, 132, 106, 96, 118, 94, 85, 106, 81, 73, 91, 67, 60, 77, 54, 47, 63, 39, 32, 47, 20, 9, 25, 0, 0, 0,
+ 119, 107, 118, 106, 95, 105, 94, 85, 93, 81, 72, 80, 68, 60, 68, 54, 47, 54, 39, 32, 39, 20, 11, 18, 0, 0, 0,
+ 121, 107, 104, 107, 96, 92, 95, 84, 80, 81, 72, 69, 68, 61, 58, 54, 48, 46, 39, 33, 31, 20, 12, 9, 0, 0, 0,
+ 123, 107, 88, 108, 95, 77, 96, 84, 68, 82, 72, 57, 68, 60, 46, 54, 47, 35, 39, 33, 20, 19, 13, 2, 0, 0, 0,
+ 123, 106, 72, 110, 95, 63, 96, 84, 54, 82, 72, 45, 69, 60, 35, 55, 48, 23, 39, 33, 9, 18, 14, 0, 0, 0, 0,
+ 125, 106, 60, 110, 94, 50, 98, 84, 42, 83, 72, 34, 69, 60, 25, 55, 48, 12, 39, 33, 0, 17, 13, 0, 0, 0, 0,
+ 118, 89, 165, 105, 79, 148, 93, 69, 132, 81, 57, 115, 68, 45, 99, 55, 32, 82, 41, 15, 64, 21, 0, 41, 0, 0, 0,
+ 120, 89, 150, 107, 79, 135, 96, 69, 121, 82, 58, 105, 70, 46, 89, 56, 34, 73, 41, 17, 56, 21, 0, 34, 0, 0, 0,
+ 121, 89, 137, 108, 79, 123, 96, 69, 109, 82, 58, 95, 70, 47, 81, 56, 34, 66, 41, 18, 49, 21, 0, 28, 0, 0, 0,
+ 122, 90, 124, 109, 79, 110, 96, 69, 99, 83, 58, 85, 70, 47, 72, 56, 35, 58, 41, 19, 42, 21, 0, 22, 0, 0, 0,
+ 123, 90, 111, 110, 79, 98, 97, 69, 87, 83, 59, 75, 70, 47, 63, 56, 35, 50, 41, 20, 35, 21, 0, 14, 0, 0, 0,
+ 123, 90, 98, 110, 79, 87, 97, 70, 76, 84, 58, 64, 70, 48, 53, 56, 36, 41, 40, 21, 26, 21, 0, 5, 0, 0, 0,
+ 125, 89, 84, 111, 79, 73, 97, 69, 64, 84, 59, 54, 70, 48, 43, 56, 36, 31, 40, 22, 17, 20, 1, 1, 0, 0, 0,
+ 125, 89, 69, 112, 79, 60, 98, 70, 51, 84, 59, 42, 70, 48, 32, 56, 36, 20, 41, 22, 5, 19, 2, 0, 0, 0, 0,
+ 126, 89, 57, 112, 79, 49, 99, 70, 41, 84, 59, 32, 70, 48, 22, 56, 36, 10, 40, 22, 0, 18, 2, 0, 0, 0, 0,
+ 121, 67, 154, 108, 58, 138, 97, 50, 124, 84, 39, 107, 71, 28, 92, 58, 12, 76, 43, 0, 59, 20, 0, 37, 0, 0, 0,
+ 124, 68, 140, 111, 59, 126, 98, 50, 112, 84, 40, 98, 71, 29, 83, 58, 15, 67, 42, 0, 51, 20, 0, 30, 0, 0, 0,
+ 124, 68, 129, 111, 59, 114, 99, 51, 102, 86, 41, 88, 71, 30, 75, 58, 17, 60, 42, 0, 45, 20, 0, 24, 0, 0, 0,
+ 125, 70, 116, 111, 60, 103, 99, 51, 92, 85, 41, 79, 71, 31, 66, 58, 19, 53, 42, 3, 38, 20, 0, 17, 0, 0, 0,
+ 125, 70, 104, 111, 61, 93, 99, 52, 81, 85, 43, 69, 72, 32, 58, 58, 20, 45, 42, 4, 31, 20, 0, 8, 0, 0, 0,
+ 126, 70, 92, 111, 61, 81, 99, 52, 71, 85, 42, 60, 71, 33, 49, 57, 21, 37, 42, 6, 23, 20, 0, 3, 0, 0, 0,
+ 126, 70, 79, 112, 61, 70, 99, 53, 60, 85, 43, 50, 71, 33, 39, 57, 22, 28, 41, 7, 13, 19, 0, 0, 0, 0, 0,
+ 127, 71, 66, 113, 62, 56, 100, 53, 48, 86, 44, 39, 71, 34, 29, 57, 23, 18, 41, 8, 2, 18, 0, 0, 0, 0, 0,
+ 128, 70, 55, 114, 62, 46, 100, 54, 39, 86, 44, 30, 71, 34, 20, 57, 23, 7, 41, 9, 0, 18, 0, 0, 0, 0, 0,
+ 124, 41, 145, 111, 32, 128, 99, 23, 114, 86, 10, 100, 73, 0, 85, 60, 0, 71, 43, 0, 54, 17, 0, 32, 0, 0, 0,
+ 126, 42, 131, 113, 33, 117, 100, 25, 104, 86, 14, 90, 73, 0, 77, 60, 0, 63, 44, 0, 47, 18, 0, 25, 0, 0, 0,
+ 127, 43, 120, 113, 34, 106, 101, 26, 95, 86, 17, 82, 73, 2, 69, 59, 0, 56, 43, 0, 41, 18, 0, 19, 0, 0, 0,
+ 127, 45, 109, 113, 37, 97, 101, 28, 85, 86, 19, 74, 73, 5, 61, 59, 0, 48, 43, 0, 34, 19, 0, 11, 0, 0, 0,
+ 127, 46, 98, 114, 38, 86, 100, 30, 76, 87, 21, 65, 73, 9, 54, 59, 0, 41, 43, 0, 26, 18, 0, 5, 0, 0, 0,
+ 127, 47, 87, 113, 39, 76, 101, 31, 67, 86, 22, 56, 72, 11, 45, 59, 0, 33, 43, 0, 19, 18, 0, 2, 0, 0, 0,
+ 128, 48, 75, 114, 39, 65, 101, 33, 56, 86, 23, 46, 72, 12, 36, 58, 0, 24, 42, 0, 9, 17, 0, 0, 0, 0, 0,
+ 129, 48, 63, 114, 41, 54, 102, 33, 46, 87, 24, 36, 72, 14, 26, 58, 1, 14, 42, 0, 2, 16, 0, 0, 0, 0, 0,
+ 128, 48, 53, 114, 41, 44, 102, 34, 37, 87, 25, 27, 72, 15, 17, 58, 1, 3, 41, 0, 0, 15, 0, 0, 0, 0, 0,
+ 0, 189, 242, 0, 169, 217, 0, 151, 194, 0, 132, 170, 0, 113, 147, 0, 94, 123, 0, 74, 99, 0, 51, 71, 0, 15, 34,
+ 1, 187, 219, 1, 167, 195, 0, 150, 175, 0, 131, 153, 0, 113, 132, 0, 94, 111, 0, 74, 89, 0, 50, 63, 0, 13, 28,
+ 1, 186, 198, 1, 167, 178, 0, 149, 158, 0, 130, 139, 0, 111, 119, 0, 93, 100, 0, 74, 80, 0, 50, 55, 0, 13, 22,
+ 1, 185, 176, 1, 165, 159, 1, 148, 142, 0, 129, 123, 0, 111, 106, 0, 93, 89, 0, 73, 70, 0, 50, 47, 0, 13, 13,
+ 1, 184, 157, 1, 164, 141, 1, 147, 125, 0, 128, 110, 0, 110, 93, 0, 92, 77, 0, 73, 60, 0, 50, 39, 0, 12, 5,
+ 25, 182, 137, 25, 163, 122, 17, 146, 109, 0, 128, 96, 0, 110, 81, 0, 92, 66, 0, 73, 51, 0, 50, 30, 0, 10, 0,
+ 42, 181, 114, 35, 163, 102, 30, 145, 91, 14, 127, 80, 0, 109, 67, 0, 91, 53, 0, 72, 39, 0, 50, 19, 0, 10, 0,
+ 52, 181, 92, 43, 162, 83, 32, 145, 73, 19, 126, 63, 0, 108, 52, 0, 90, 40, 0, 72, 27, 0, 50, 7, 0, 10, 0,
+ 57, 181, 74, 48, 162, 66, 37, 144, 57, 24, 126, 49, 7, 108, 40, 0, 90, 29, 0, 72, 15, 0, 49, 0, 0, 10, 0,
+ 1, 170, 227, 1, 152, 203, 0, 136, 182, 0, 119, 159, 0, 101, 137, 0, 84, 115, 0, 65, 92, 0, 43, 66, 0, 1, 29,
+ 1, 169, 206, 1, 151, 184, 1, 136, 165, 0, 118, 144, 0, 102, 125, 0, 84, 105, 0, 65, 83, 0, 43, 58, 0, 0, 22,
+ 29, 168, 186, 21, 151, 167, 14, 135, 150, 4, 118, 131, 0, 101, 112, 0, 83, 94, 0, 65, 75, 0, 43, 51, 0, 0, 16,
+ 41, 167, 167, 33, 150, 150, 31, 134, 134, 19, 117, 117, 4, 100, 100, 0, 83, 83, 0, 65, 65, 0, 42, 43, 0, 0, 8,
+ 48, 167, 149, 41, 149, 133, 33, 133, 118, 25, 116, 103, 13, 99, 88, 0, 83, 73, 0, 65, 56, 0, 42, 35, 0, 0, 0,
+ 58, 165, 130, 49, 148, 115, 42, 132, 103, 31, 115, 89, 18, 99, 75, 0, 82, 61, 0, 64, 46, 0, 42, 26, 0, 0, 0,
+ 62, 164, 110, 55, 147, 97, 45, 132, 87, 35, 115, 75, 22, 98, 63, 5, 82, 50, 0, 64, 36, 0, 42, 16, 0, 0, 0,
+ 69, 164, 89, 60, 147, 78, 50, 131, 70, 37, 114, 59, 26, 98, 49, 10, 81, 37, 0, 64, 24, 0, 42, 4, 0, 0, 0,
+ 71, 164, 71, 63, 147, 63, 53, 131, 55, 40, 114, 47, 28, 98, 38, 13, 81, 26, 0, 64, 12, 0, 42, 0, 0, 0, 0,
+ 28, 153, 214, 24, 138, 193, 23, 123, 171, 16, 107, 150, 0, 91, 130, 0, 75, 109, 0, 58, 87, 0, 35, 61, 0, 0, 25,
+ 48, 153, 194, 41, 138, 174, 34, 123, 156, 27, 107, 136, 16, 91, 117, 1, 75, 98, 0, 57, 78, 0, 35, 53, 0, 0, 17,
+ 55, 153, 177, 47, 137, 158, 42, 122, 142, 33, 107, 124, 22, 91, 106, 6, 75, 88, 0, 57, 70, 0, 35, 46, 0, 0, 9,
+ 61, 152, 158, 53, 136, 143, 45, 122, 127, 36, 106, 111, 24, 90, 94, 10, 74, 78, 0, 57, 61, 0, 35, 39, 0, 0, 2,
+ 67, 151, 141, 59, 135, 126, 49, 121, 112, 39, 105, 98, 29, 90, 83, 14, 74, 68, 0, 57, 52, 0, 35, 31, 0, 0, 0,
+ 71, 150, 123, 62, 135, 110, 54, 120, 98, 42, 105, 84, 31, 89, 71, 16, 74, 58, 0, 57, 43, 0, 35, 22, 0, 0, 0,
+ 74, 150, 105, 64, 134, 92, 55, 120, 83, 45, 104, 71, 34, 89, 59, 20, 73, 47, 0, 57, 32, 0, 35, 13, 0, 0, 0,
+ 78, 149, 84, 69, 134, 75, 59, 120, 66, 47, 103, 56, 34, 88, 46, 22, 73, 34, 1, 57, 20, 0, 35, 1, 0, 0, 0,
+ 80, 149, 69, 70, 133, 61, 60, 119, 53, 49, 103, 44, 36, 88, 35, 23, 73, 24, 2, 56, 10, 0, 35, 0, 0, 0, 0,
+ 58, 136, 200, 50, 122, 180, 45, 109, 162, 38, 94, 141, 27, 80, 121, 15, 65, 102, 0, 48, 81, 0, 26, 56, 0, 0, 19,
+ 66, 136, 182, 59, 122, 163, 52, 109, 146, 42, 94, 128, 32, 80, 109, 20, 65, 91, 2, 48, 72, 0, 26, 49, 0, 0, 11,
+ 70, 136, 165, 62, 122, 149, 55, 108, 133, 46, 94, 116, 35, 80, 99, 21, 65, 82, 4, 49, 64, 0, 26, 41, 0, 0, 3,
+ 76, 135, 149, 66, 121, 133, 58, 108, 119, 48, 94, 103, 36, 79, 88, 23, 65, 73, 7, 49, 56, 0, 27, 34, 0, 0, 0,
+ 78, 135, 133, 69, 120, 118, 60, 107, 106, 50, 93, 92, 39, 79, 77, 26, 65, 63, 8, 49, 47, 0, 27, 26, 0, 0, 0,
+ 82, 134, 117, 71, 120, 104, 62, 107, 92, 51, 93, 79, 39, 78, 66, 27, 64, 53, 10, 48, 39, 0, 27, 18, 0, 0, 0,
+ 84, 134, 99, 73, 119, 87, 64, 106, 77, 53, 92, 66, 42, 78, 55, 28, 64, 42, 11, 48, 29, 0, 28, 9, 0, 0, 0,
+ 87, 133, 81, 76, 119, 72, 66, 106, 62, 55, 92, 52, 43, 78, 42, 29, 64, 31, 12, 48, 17, 0, 28, 0, 0, 0, 0,
+ 88, 134, 67, 77, 119, 58, 68, 106, 51, 56, 92, 42, 44, 78, 32, 30, 64, 20, 12, 48, 6, 0, 28, 0, 0, 0, 0,
+ 73, 120, 189, 64, 107, 168, 57, 96, 151, 47, 82, 133, 38, 69, 114, 26, 55, 95, 11, 39, 75, 0, 16, 51, 0, 0, 14,
+ 78, 120, 171, 69, 107, 153, 62, 95, 137, 51, 82, 119, 40, 69, 102, 29, 55, 85, 15, 39, 66, 0, 17, 44, 0, 0, 4,
+ 81, 120, 156, 71, 107, 140, 64, 95, 125, 53, 82, 109, 42, 69, 93, 31, 55, 77, 16, 39, 59, 0, 18, 37, 0, 0, 0,
+ 85, 120, 141, 74, 107, 126, 65, 95, 112, 54, 82, 97, 43, 69, 82, 32, 55, 67, 17, 39, 51, 0, 19, 30, 0, 0, 0,
+ 86, 119, 126, 76, 106, 112, 66, 95, 100, 56, 81, 85, 45, 69, 72, 33, 55, 59, 18, 40, 43, 0, 19, 22, 0, 0, 0,
+ 89, 119, 110, 78, 106, 98, 69, 94, 87, 56, 81, 75, 46, 68, 62, 33, 55, 49, 18, 40, 35, 0, 20, 15, 0, 0, 0,
+ 89, 119, 95, 80, 106, 83, 70, 94, 73, 58, 81, 63, 46, 68, 51, 34, 55, 39, 19, 40, 25, 0, 20, 4, 0, 0, 0,
+ 92, 118, 78, 82, 106, 68, 70, 93, 59, 59, 81, 49, 47, 68, 39, 34, 55, 28, 19, 40, 14, 0, 20, 0, 0, 0, 0,
+ 93, 118, 65, 82, 105, 55, 72, 93, 48, 60, 81, 39, 47, 68, 29, 34, 55, 18, 20, 40, 2, 0, 20, 0, 0, 0, 0,
+ 83, 104, 177, 74, 93, 159, 65, 82, 142, 56, 70, 124, 45, 57, 106, 33, 44, 89, 20, 28, 70, 1, 4, 46, 0, 0, 8,
+ 86, 104, 161, 78, 93, 145, 68, 82, 128, 58, 70, 112, 48, 58, 96, 35, 45, 80, 21, 29, 62, 1, 6, 40, 0, 0, 0,
+ 89, 104, 147, 79, 93, 131, 69, 82, 118, 59, 70, 102, 47, 58, 87, 36, 45, 72, 23, 29, 55, 3, 7, 33, 0, 0, 0,
+ 90, 104, 132, 80, 93, 119, 71, 82, 106, 60, 70, 91, 48, 58, 77, 37, 45, 62, 23, 30, 47, 4, 7, 26, 0, 0, 0,
+ 92, 104, 118, 82, 93, 105, 72, 82, 93, 61, 69, 80, 50, 58, 68, 37, 45, 55, 23, 30, 39, 4, 8, 18, 0, 0, 0,
+ 94, 104, 105, 82, 92, 93, 72, 82, 82, 61, 70, 70, 50, 58, 58, 38, 46, 46, 23, 31, 31, 6, 10, 11, 0, 0, 0,
+ 95, 104, 90, 84, 92, 79, 74, 82, 70, 62, 70, 58, 50, 58, 48, 37, 46, 36, 23, 31, 22, 4, 11, 3, 0, 0, 0,
+ 96, 103, 74, 85, 92, 65, 75, 81, 56, 63, 70, 47, 50, 58, 37, 38, 46, 25, 24, 31, 11, 3, 11, 0, 0, 0, 0,
+ 97, 103, 62, 86, 92, 53, 76, 81, 45, 63, 69, 36, 51, 58, 27, 38, 46, 15, 23, 31, 0, 3, 11, 0, 0, 0, 0,
+ 90, 87, 165, 81, 77, 148, 72, 67, 132, 62, 55, 116, 50, 44, 99, 39, 31, 82, 25, 14, 64, 1, 0, 42, 0, 0, 1,
+ 93, 87, 150, 83, 77, 135, 74, 67, 121, 63, 56, 105, 52, 45, 90, 40, 32, 74, 25, 16, 57, 3, 0, 35, 0, 0, 0,
+ 95, 87, 138, 85, 77, 123, 75, 67, 109, 63, 57, 95, 53, 45, 81, 41, 33, 66, 26, 17, 50, 4, 0, 28, 0, 0, 0,
+ 95, 88, 124, 85, 77, 111, 75, 67, 99, 63, 57, 86, 53, 45, 72, 41, 33, 58, 26, 18, 43, 5, 1, 22, 0, 0, 0,
+ 97, 88, 112, 87, 77, 100, 76, 68, 88, 64, 57, 76, 53, 46, 63, 41, 34, 50, 26, 19, 35, 5, 2, 14, 0, 0, 0,
+ 99, 87, 99, 87, 78, 88, 76, 68, 77, 65, 57, 65, 53, 46, 54, 41, 35, 42, 27, 20, 27, 6, 2, 5, 0, 0, 0,
+ 100, 87, 85, 88, 77, 75, 77, 68, 65, 65, 57, 54, 53, 46, 44, 41, 35, 32, 27, 21, 19, 5, 3, 2, 0, 0, 0,
+ 100, 88, 71, 89, 77, 61, 78, 68, 53, 66, 57, 44, 53, 47, 33, 41, 35, 22, 27, 21, 7, 5, 3, 0, 0, 0, 0,
+ 101, 87, 60, 90, 77, 52, 79, 68, 44, 66, 58, 34, 53, 47, 25, 41, 35, 13, 26, 22, 0, 5, 3, 0, 0, 0, 0,
+ 97, 67, 155, 86, 58, 138, 77, 50, 125, 66, 39, 108, 55, 28, 92, 43, 12, 76, 29, 0, 59, 2, 0, 37, 0, 0, 0,
+ 99, 67, 141, 88, 59, 127, 78, 50, 113, 68, 40, 98, 56, 29, 83, 44, 15, 68, 29, 0, 52, 3, 0, 30, 0, 0, 0,
+ 100, 68, 129, 89, 59, 115, 80, 51, 103, 68, 41, 89, 56, 30, 75, 44, 16, 61, 30, 0, 45, 4, 0, 24, 0, 0, 0,
+ 100, 69, 118, 90, 60, 104, 80, 51, 92, 67, 41, 79, 56, 31, 66, 44, 18, 53, 29, 2, 38, 4, 0, 18, 0, 0, 0,
+ 101, 69, 104, 90, 61, 93, 79, 51, 82, 67, 42, 70, 56, 32, 59, 44, 20, 46, 29, 4, 31, 6, 0, 9, 0, 0, 0,
+ 102, 69, 93, 90, 61, 83, 80, 52, 72, 68, 42, 61, 56, 33, 50, 43, 20, 38, 29, 5, 23, 7, 0, 4, 0, 0, 0,
+ 102, 70, 80, 91, 61, 71, 80, 52, 61, 68, 43, 51, 56, 32, 40, 44, 21, 29, 30, 6, 14, 7, 0, 0, 0, 0, 0,
+ 103, 70, 68, 92, 61, 58, 81, 53, 50, 69, 43, 41, 56, 34, 31, 43, 22, 19, 29, 7, 3, 7, 0, 0, 0, 0, 0,
+ 104, 70, 57, 92, 61, 48, 82, 53, 40, 69, 43, 32, 56, 34, 22, 43, 23, 10, 29, 8, 0, 6, 0, 0, 0, 0, 0,
+ 101, 45, 145, 91, 35, 129, 80, 26, 116, 69, 15, 101, 59, 0, 86, 46, 0, 71, 31, 0, 55, 0, 0, 33, 0, 0, 0,
+ 104, 44, 132, 92, 36, 118, 82, 28, 105, 71, 17, 91, 58, 3, 77, 46, 0, 63, 31, 0, 48, 2, 0, 26, 0, 0, 0,
+ 104, 46, 121, 93, 37, 107, 82, 30, 96, 70, 20, 83, 58, 6, 70, 46, 0, 57, 32, 0, 41, 4, 0, 20, 0, 0, 0,
+ 104, 48, 110, 93, 40, 98, 82, 31, 87, 70, 22, 74, 59, 9, 62, 45, 0, 49, 31, 0, 35, 6, 0, 13, 0, 0, 0,
+ 104, 48, 99, 92, 41, 88, 82, 32, 77, 70, 23, 65, 58, 11, 54, 46, 0, 42, 32, 0, 27, 7, 0, 5, 0, 0, 0,
+ 105, 50, 88, 93, 41, 77, 82, 34, 68, 71, 24, 57, 58, 13, 46, 45, 1, 35, 31, 0, 21, 7, 0, 2, 0, 0, 0,
+ 105, 50, 76, 94, 41, 66, 83, 34, 57, 71, 25, 47, 58, 15, 37, 45, 2, 25, 32, 0, 11, 7, 0, 0, 0, 0, 0,
+ 106, 50, 64, 94, 42, 55, 83, 35, 47, 71, 26, 38, 58, 16, 27, 45, 4, 17, 31, 0, 4, 7, 0, 0, 0, 0, 0,
+ 106, 51, 54, 95, 42, 45, 83, 35, 38, 71, 27, 30, 58, 16, 19, 45, 5, 7, 30, 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 181, 240, 0, 162, 216, 0, 144, 193, 0, 126, 168, 0, 109, 146, 0, 91, 123, 0, 71, 98, 0, 48, 71, 0, 9, 34,
+ 0, 179, 218, 0, 161, 195, 0, 144, 174, 0, 126, 153, 0, 108, 132, 0, 90, 110, 0, 71, 88, 0, 48, 63, 0, 8, 29,
+ 0, 178, 197, 0, 159, 177, 0, 143, 159, 0, 125, 139, 0, 107, 119, 0, 90, 99, 0, 71, 79, 0, 48, 55, 0, 8, 22,
+ 0, 177, 177, 0, 158, 158, 0, 142, 141, 0, 124, 123, 0, 107, 106, 0, 89, 88, 0, 71, 70, 0, 48, 47, 0, 8, 14,
+ 0, 176, 157, 0, 158, 141, 0, 141, 126, 0, 123, 109, 0, 106, 93, 0, 89, 78, 0, 70, 60, 0, 47, 39, 0, 7, 5,
+ 0, 175, 138, 0, 157, 123, 0, 141, 110, 0, 123, 96, 0, 105, 81, 0, 88, 67, 0, 70, 51, 0, 48, 30, 0, 6, 0,
+ 0, 173, 115, 0, 155, 104, 0, 140, 92, 0, 122, 80, 0, 105, 67, 0, 88, 55, 0, 69, 40, 0, 47, 20, 0, 6, 0,
+ 0, 173, 94, 0, 155, 85, 0, 139, 75, 0, 121, 64, 0, 104, 53, 0, 88, 42, 0, 70, 28, 0, 47, 9, 0, 6, 0,
+ 0, 173, 76, 0, 155, 70, 0, 138, 61, 0, 122, 53, 0, 104, 44, 0, 87, 32, 0, 69, 18, 0, 47, 0, 0, 6, 0,
+ 0, 164, 226, 0, 147, 203, 0, 131, 181, 0, 114, 158, 0, 97, 136, 0, 80, 115, 0, 63, 92, 0, 40, 65, 0, 0, 30,
+ 0, 162, 205, 0, 145, 184, 0, 130, 164, 0, 114, 143, 0, 97, 124, 0, 81, 104, 0, 63, 83, 0, 40, 58, 0, 0, 23,
+ 0, 162, 187, 0, 145, 167, 0, 130, 150, 0, 113, 131, 0, 96, 112, 0, 80, 93, 0, 62, 74, 0, 40, 50, 0, 0, 16,
+ 0, 160, 167, 0, 144, 150, 0, 129, 134, 0, 112, 116, 0, 96, 100, 0, 80, 82, 0, 62, 65, 0, 40, 43, 0, 0, 7,
+ 0, 160, 148, 0, 143, 133, 0, 128, 118, 0, 111, 103, 0, 96, 88, 0, 80, 73, 0, 62, 56, 0, 40, 35, 0, 0, 0,
+ 0, 158, 130, 0, 142, 117, 0, 127, 104, 0, 111, 89, 0, 95, 76, 0, 79, 62, 0, 62, 46, 0, 40, 26, 0, 0, 0,
+ 0, 158, 111, 0, 141, 99, 0, 127, 88, 0, 111, 76, 0, 95, 63, 0, 79, 51, 0, 62, 37, 0, 40, 18, 0, 0, 0,
+ 0, 158, 91, 0, 141, 81, 0, 126, 72, 0, 110, 62, 0, 94, 50, 0, 79, 39, 0, 62, 25, 0, 40, 5, 0, 0, 0,
+ 0, 157, 74, 0, 141, 66, 0, 126, 59, 0, 110, 49, 0, 94, 40, 0, 78, 29, 0, 61, 15, 0, 40, 0, 0, 0, 0,
+ 0, 148, 214, 0, 133, 192, 0, 119, 171, 0, 103, 150, 0, 87, 129, 0, 72, 108, 0, 55, 86, 0, 32, 61, 0, 0, 25,
+ 0, 147, 193, 0, 132, 173, 0, 118, 155, 0, 103, 136, 0, 87, 116, 0, 72, 98, 0, 55, 78, 0, 32, 53, 0, 0, 17,
+ 0, 147, 176, 0, 132, 158, 0, 118, 142, 0, 102, 124, 0, 87, 106, 0, 72, 88, 0, 55, 69, 0, 33, 46, 0, 0, 9,
+ 0, 146, 159, 0, 131, 142, 0, 117, 127, 0, 102, 111, 0, 87, 95, 0, 71, 79, 0, 55, 61, 0, 33, 39, 0, 0, 2,
+ 0, 145, 140, 0, 130, 126, 0, 117, 112, 0, 101, 98, 0, 86, 83, 0, 71, 68, 0, 55, 52, 0, 33, 31, 0, 0, 0,
+ 0, 144, 124, 0, 130, 111, 0, 116, 99, 0, 101, 84, 0, 86, 72, 0, 71, 59, 0, 55, 43, 0, 33, 23, 0, 0, 0,
+ 0, 144, 106, 0, 129, 94, 0, 115, 83, 0, 101, 72, 0, 85, 60, 0, 71, 48, 0, 55, 34, 0, 33, 14, 0, 0, 0,
+ 3, 143, 86, 0, 129, 77, 0, 115, 68, 0, 100, 58, 0, 85, 48, 0, 70, 36, 0, 54, 22, 0, 33, 3, 0, 0, 0,
+ 18, 143, 72, 13, 128, 63, 0, 115, 57, 0, 100, 47, 0, 85, 37, 0, 70, 26, 0, 54, 13, 0, 33, 0, 0, 0, 0,
+ 0, 132, 200, 0, 118, 179, 0, 105, 161, 0, 91, 140, 0, 76, 121, 0, 62, 101, 0, 46, 81, 0, 24, 56, 0, 0, 19,
+ 0, 131, 182, 0, 118, 163, 0, 105, 146, 0, 91, 128, 0, 77, 110, 0, 62, 91, 0, 46, 72, 0, 25, 48, 0, 0, 11,
+ 0, 131, 165, 0, 117, 149, 0, 104, 133, 0, 91, 116, 0, 77, 99, 0, 62, 82, 0, 46, 64, 0, 25, 41, 0, 0, 4,
+ 0, 131, 149, 0, 116, 134, 0, 104, 119, 0, 91, 104, 0, 77, 89, 0, 62, 73, 0, 46, 56, 0, 25, 34, 0, 0, 0,
+ 10, 130, 133, 2, 116, 119, 0, 104, 106, 0, 90, 91, 0, 76, 78, 0, 62, 64, 0, 46, 48, 0, 26, 27, 0, 0, 0,
+ 23, 130, 118, 20, 116, 104, 13, 103, 93, 3, 89, 79, 0, 76, 67, 0, 62, 54, 0, 46, 39, 0, 26, 19, 0, 0, 0,
+ 33, 129, 101, 27, 115, 89, 19, 103, 79, 9, 89, 67, 0, 75, 56, 0, 61, 43, 0, 46, 29, 0, 26, 10, 0, 0, 0,
+ 41, 128, 83, 35, 115, 73, 27, 102, 64, 15, 89, 55, 0, 76, 45, 0, 62, 33, 0, 46, 18, 0, 26, 0, 0, 0, 0,
+ 43, 129, 69, 38, 115, 61, 30, 102, 54, 17, 89, 45, 2, 75, 34, 0, 61, 23, 0, 46, 9, 0, 26, 0, 0, 0, 0,
+ 1, 116, 188, 1, 104, 168, 0, 92, 151, 0, 79, 132, 0, 66, 113, 0, 52, 94, 0, 36, 75, 0, 14, 52, 0, 0, 14,
+ 17, 116, 171, 16, 104, 153, 14, 92, 137, 8, 79, 119, 0, 67, 102, 0, 53, 85, 0, 37, 67, 0, 16, 44, 0, 0, 4,
+ 31, 116, 155, 27, 104, 140, 21, 92, 125, 13, 79, 109, 3, 66, 93, 0, 53, 77, 0, 37, 59, 0, 16, 38, 0, 0, 0,
+ 37, 115, 141, 30, 103, 126, 26, 92, 112, 16, 79, 98, 5, 66, 83, 0, 53, 67, 0, 38, 51, 0, 17, 31, 0, 0, 0,
+ 41, 115, 126, 37, 103, 112, 31, 92, 100, 22, 79, 86, 10, 66, 72, 0, 53, 59, 0, 38, 44, 0, 17, 23, 0, 0, 0,
+ 48, 115, 111, 41, 102, 99, 34, 91, 88, 24, 78, 76, 14, 66, 63, 0, 53, 50, 0, 38, 36, 0, 18, 15, 0, 0, 0,
+ 51, 115, 95, 46, 102, 85, 37, 91, 74, 26, 78, 63, 16, 66, 52, 0, 53, 40, 0, 38, 26, 0, 18, 5, 0, 0, 0,
+ 55, 114, 80, 47, 102, 69, 40, 90, 60, 30, 78, 51, 19, 66, 41, 3, 53, 29, 0, 38, 15, 0, 17, 0, 0, 0, 0,
+ 56, 114, 66, 50, 102, 58, 40, 91, 50, 32, 78, 41, 18, 66, 32, 4, 53, 21, 0, 38, 5, 0, 17, 0, 0, 0, 0,
+ 39, 102, 178, 37, 90, 159, 30, 79, 142, 21, 68, 124, 14, 55, 106, 0, 42, 89, 0, 26, 70, 0, 4, 46, 0, 0, 8,
+ 48, 102, 161, 42, 90, 145, 35, 79, 128, 26, 68, 112, 19, 55, 96, 3, 43, 79, 0, 27, 62, 0, 6, 40, 0, 0, 0,
+ 50, 102, 147, 44, 90, 132, 37, 79, 118, 30, 68, 102, 20, 56, 87, 7, 43, 72, 0, 28, 55, 0, 6, 34, 0, 0, 0,
+ 53, 101, 133, 47, 90, 118, 41, 79, 106, 32, 68, 91, 21, 56, 78, 9, 43, 63, 0, 28, 47, 0, 6, 26, 0, 0, 0,
+ 57, 101, 119, 50, 89, 106, 42, 79, 94, 34, 67, 81, 24, 56, 68, 9, 44, 55, 0, 29, 40, 0, 6, 19, 0, 0, 0,
+ 60, 100, 105, 50, 90, 94, 45, 80, 83, 36, 68, 71, 24, 56, 59, 11, 44, 46, 0, 29, 32, 0, 7, 12, 0, 0, 0,
+ 63, 101, 91, 55, 90, 80, 46, 79, 70, 37, 68, 59, 26, 56, 49, 12, 44, 37, 1, 29, 23, 0, 7, 3, 0, 0, 0,
+ 64, 101, 75, 56, 89, 67, 48, 79, 57, 37, 68, 48, 27, 56, 37, 15, 44, 26, 0, 29, 12, 0, 7, 0, 0, 0, 0,
+ 66, 101, 64, 58, 89, 55, 49, 79, 47, 39, 68, 38, 27, 56, 29, 14, 44, 18, 1, 30, 2, 0, 7, 0, 0, 0, 0,
+ 57, 86, 165, 51, 75, 148, 45, 65, 133, 38, 54, 116, 28, 43, 100, 16, 29, 83, 0, 13, 64, 0, 0, 42, 0, 0, 3,
+ 60, 86, 151, 55, 75, 135, 47, 66, 121, 39, 55, 105, 30, 44, 90, 18, 31, 74, 3, 16, 57, 0, 1, 35, 0, 0, 0,
+ 62, 86, 139, 56, 75, 123, 49, 66, 110, 40, 55, 95, 30, 44, 81, 19, 31, 66, 4, 17, 51, 0, 1, 29, 0, 0, 0,
+ 65, 86, 125, 56, 76, 112, 49, 66, 99, 39, 55, 86, 31, 44, 72, 19, 32, 59, 5, 18, 44, 0, 1, 23, 0, 0, 0,
+ 67, 86, 113, 58, 75, 100, 51, 66, 88, 41, 56, 77, 31, 45, 64, 20, 32, 51, 6, 18, 35, 0, 1, 14, 0, 0, 0,
+ 69, 86, 99, 61, 76, 88, 52, 66, 78, 43, 56, 66, 32, 45, 55, 20, 33, 42, 7, 19, 27, 0, 1, 6, 0, 0, 0,
+ 69, 86, 86, 61, 76, 75, 53, 67, 66, 43, 56, 55, 33, 45, 45, 21, 34, 34, 8, 20, 20, 0, 2, 2, 0, 0, 0,
+ 71, 86, 72, 63, 75, 62, 54, 66, 55, 45, 56, 45, 33, 45, 35, 22, 34, 23, 7, 20, 8, 0, 2, 0, 0, 0, 0,
+ 71, 86, 62, 64, 75, 53, 55, 66, 46, 45, 56, 36, 33, 46, 27, 22, 34, 15, 8, 20, 0, 0, 2, 0, 0, 0, 0,
+ 69, 67, 156, 61, 58, 140, 53, 50, 125, 45, 39, 108, 35, 28, 93, 25, 12, 77, 12, 0, 59, 0, 0, 37, 0, 0, 0,
+ 71, 68, 142, 63, 59, 126, 56, 50, 114, 47, 40, 98, 37, 28, 84, 26, 15, 68, 12, 0, 53, 0, 0, 30, 0, 0, 0,
+ 72, 68, 130, 63, 59, 116, 56, 50, 104, 47, 40, 90, 38, 30, 75, 27, 16, 61, 13, 0, 46, 0, 0, 24, 0, 0, 0,
+ 73, 69, 118, 65, 59, 105, 57, 51, 92, 47, 41, 80, 37, 30, 67, 26, 18, 53, 14, 1, 39, 0, 0, 18, 0, 0, 0,
+ 74, 69, 106, 65, 60, 93, 57, 51, 82, 48, 41, 70, 38, 31, 59, 26, 19, 46, 13, 2, 32, 0, 0, 10, 0, 0, 0,
+ 76, 69, 95, 66, 61, 84, 58, 52, 73, 48, 42, 61, 37, 32, 50, 26, 20, 38, 14, 4, 24, 0, 0, 4, 0, 0, 0,
+ 76, 69, 81, 68, 60, 72, 58, 52, 62, 48, 42, 51, 38, 32, 41, 27, 21, 30, 14, 4, 16, 0, 0, 1, 0, 0, 0,
+ 76, 69, 68, 68, 61, 60, 60, 52, 51, 49, 43, 41, 38, 33, 32, 27, 21, 20, 14, 5, 5, 0, 0, 0, 0, 0, 0,
+ 78, 70, 59, 69, 61, 50, 60, 52, 42, 49, 43, 34, 39, 33, 24, 27, 22, 13, 14, 7, 1, 0, 0, 0, 0, 0, 0,
+ 75, 46, 146, 68, 38, 131, 60, 30, 117, 50, 19, 102, 41, 4, 87, 29, 0, 72, 13, 0, 55, 0, 0, 33, 0, 0, 0,
+ 78, 47, 132, 70, 39, 119, 61, 30, 105, 53, 20, 92, 42, 5, 78, 30, 0, 64, 13, 0, 49, 0, 0, 27, 0, 0, 0,
+ 79, 48, 122, 70, 40, 108, 62, 32, 96, 52, 22, 84, 42, 9, 71, 30, 0, 58, 14, 0, 42, 0, 0, 20, 0, 0, 0,
+ 79, 50, 111, 70, 42, 99, 62, 33, 88, 52, 23, 74, 41, 11, 63, 29, 0, 50, 14, 0, 36, 0, 0, 14, 0, 0, 0,
+ 80, 50, 99, 70, 42, 89, 61, 34, 78, 52, 25, 67, 41, 14, 55, 30, 0, 42, 15, 0, 28, 0, 0, 6, 0, 0, 0,
+ 81, 51, 89, 71, 43, 78, 62, 35, 69, 52, 25, 58, 42, 15, 47, 30, 3, 36, 15, 0, 22, 0, 0, 3, 0, 0, 0,
+ 81, 51, 77, 71, 44, 68, 63, 36, 59, 53, 26, 49, 41, 16, 38, 31, 4, 27, 16, 0, 12, 0, 0, 0, 0, 0, 0,
+ 81, 52, 65, 72, 43, 56, 63, 36, 48, 53, 27, 39, 41, 17, 29, 30, 4, 18, 14, 0, 3, 0, 0, 0, 0, 0, 0,
+ 81, 52, 55, 73, 44, 47, 64, 36, 39, 53, 28, 32, 42, 18, 21, 31, 6, 9, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 174, 239, 0, 156, 214, 0, 139, 192, 0, 121, 168, 0, 105, 145, 0, 87, 123, 0, 68, 98, 0, 46, 70, 0, 3, 35,
+ 0, 172, 217, 0, 155, 194, 0, 139, 173, 0, 121, 152, 0, 104, 130, 0, 87, 110, 0, 69, 88, 0, 46, 63, 0, 4, 28,
+ 0, 171, 197, 0, 153, 175, 0, 138, 158, 0, 121, 139, 0, 103, 118, 0, 86, 100, 0, 68, 79, 0, 46, 55, 0, 4, 22,
+ 0, 170, 177, 0, 152, 158, 0, 136, 141, 0, 119, 124, 0, 103, 106, 0, 86, 88, 0, 68, 70, 0, 45, 47, 0, 3, 14,
+ 0, 169, 157, 0, 152, 141, 0, 136, 126, 0, 119, 109, 0, 102, 94, 0, 86, 78, 0, 68, 60, 0, 46, 39, 0, 3, 5,
+ 0, 167, 138, 0, 150, 124, 0, 135, 111, 0, 118, 97, 0, 102, 82, 0, 85, 68, 0, 68, 52, 0, 46, 31, 0, 3, 0,
+ 0, 167, 118, 0, 150, 104, 0, 135, 94, 0, 118, 81, 0, 101, 69, 0, 84, 56, 0, 67, 41, 0, 45, 21, 0, 3, 0,
+ 0, 166, 97, 0, 149, 87, 0, 134, 77, 0, 117, 67, 0, 101, 56, 0, 85, 44, 0, 67, 30, 0, 45, 10, 0, 3, 0,
+ 0, 165, 79, 0, 149, 73, 0, 133, 64, 0, 117, 56, 0, 101, 46, 0, 85, 34, 0, 68, 21, 0, 46, 1, 0, 3, 0,
+ 0, 158, 225, 0, 141, 201, 0, 126, 180, 0, 109, 158, 0, 94, 136, 0, 78, 114, 0, 60, 91, 0, 38, 66, 0, 0, 30,
+ 0, 156, 203, 0, 140, 183, 0, 125, 164, 0, 109, 143, 0, 94, 124, 0, 78, 104, 0, 61, 83, 0, 38, 57, 0, 0, 23,
+ 0, 156, 186, 0, 140, 166, 0, 125, 150, 0, 109, 130, 0, 93, 111, 0, 77, 93, 0, 60, 74, 0, 38, 50, 0, 0, 17,
+ 0, 155, 167, 0, 138, 149, 0, 124, 134, 0, 109, 117, 0, 93, 100, 0, 76, 83, 0, 60, 65, 0, 38, 43, 0, 0, 9,
+ 0, 153, 147, 0, 138, 134, 0, 124, 120, 0, 107, 103, 0, 92, 88, 0, 77, 73, 0, 60, 56, 0, 38, 35, 0, 0, 0,
+ 0, 153, 131, 0, 137, 118, 0, 122, 105, 0, 107, 90, 0, 91, 76, 0, 76, 63, 0, 60, 47, 0, 39, 28, 0, 0, 0,
+ 0, 153, 111, 0, 136, 100, 0, 123, 90, 0, 107, 77, 0, 92, 65, 0, 76, 52, 0, 60, 37, 0, 38, 18, 0, 0, 0,
+ 0, 152, 93, 0, 136, 82, 0, 122, 74, 0, 106, 63, 0, 91, 52, 0, 76, 40, 0, 59, 26, 0, 38, 6, 0, 0, 0,
+ 0, 151, 78, 0, 136, 69, 0, 121, 61, 0, 106, 52, 0, 91, 43, 0, 76, 32, 0, 59, 17, 0, 38, 0, 0, 0, 0,
+ 0, 143, 213, 0, 128, 191, 0, 115, 171, 0, 100, 149, 0, 84, 128, 0, 69, 108, 0, 52, 86, 0, 30, 61, 0, 0, 25,
+ 0, 142, 193, 0, 127, 173, 0, 114, 154, 0, 99, 134, 0, 84, 116, 0, 69, 98, 0, 52, 77, 0, 31, 53, 0, 0, 18,
+ 0, 141, 176, 0, 127, 158, 0, 114, 141, 0, 98, 122, 0, 84, 105, 0, 69, 88, 0, 53, 69, 0, 31, 46, 0, 0, 9,
+ 0, 141, 159, 0, 126, 142, 0, 113, 127, 0, 98, 110, 0, 83, 95, 0, 69, 78, 0, 53, 60, 0, 32, 39, 0, 0, 2,
+ 0, 140, 140, 0, 126, 126, 0, 112, 112, 0, 98, 98, 0, 83, 83, 0, 68, 69, 0, 52, 52, 0, 31, 31, 0, 0, 0,
+ 0, 140, 124, 0, 125, 112, 0, 112, 100, 0, 97, 86, 0, 83, 72, 0, 68, 59, 0, 52, 44, 0, 31, 23, 0, 0, 0,
+ 0, 139, 106, 0, 125, 96, 0, 111, 85, 0, 97, 72, 0, 83, 62, 0, 68, 49, 0, 52, 35, 0, 31, 15, 0, 0, 0,
+ 0, 138, 88, 0, 124, 79, 0, 111, 70, 0, 96, 59, 0, 82, 48, 0, 68, 38, 0, 52, 24, 0, 31, 4, 0, 0, 0,
+ 0, 139, 76, 0, 124, 66, 0, 111, 58, 0, 96, 50, 0, 82, 40, 0, 68, 29, 0, 52, 15, 0, 31, 0, 0, 0, 0,
+ 0, 129, 200, 0, 114, 179, 0, 102, 160, 0, 87, 139, 0, 74, 120, 0, 60, 101, 0, 44, 81, 0, 22, 56, 0, 0, 19,
+ 0, 127, 181, 0, 114, 163, 0, 102, 146, 0, 88, 127, 0, 74, 109, 0, 60, 91, 0, 44, 72, 0, 23, 48, 0, 0, 11,
+ 0, 127, 166, 0, 113, 148, 0, 101, 133, 0, 87, 115, 0, 74, 99, 0, 60, 82, 0, 44, 64, 0, 23, 42, 0, 0, 4,
+ 0, 127, 150, 0, 113, 134, 0, 101, 119, 0, 87, 104, 0, 74, 89, 0, 60, 73, 0, 44, 56, 0, 23, 35, 0, 0, 0,
+ 0, 125, 134, 0, 112, 118, 0, 100, 106, 0, 87, 92, 0, 73, 78, 0, 60, 64, 0, 44, 48, 0, 23, 27, 0, 0, 0,
+ 0, 125, 118, 0, 112, 105, 0, 100, 94, 0, 86, 80, 0, 73, 68, 0, 60, 54, 0, 44, 39, 0, 23, 20, 0, 0, 0,
+ 0, 125, 101, 0, 111, 90, 0, 99, 80, 0, 86, 69, 0, 73, 58, 0, 59, 45, 0, 44, 30, 0, 23, 11, 0, 0, 0,
+ 0, 124, 85, 0, 111, 75, 0, 99, 66, 0, 86, 56, 0, 73, 45, 0, 59, 34, 0, 44, 20, 0, 23, 1, 0, 0, 0,
+ 0, 125, 72, 0, 111, 62, 0, 99, 56, 0, 86, 46, 0, 73, 36, 0, 60, 26, 0, 44, 12, 0, 23, 0, 0, 0, 0,
+ 0, 114, 188, 0, 101, 167, 0, 89, 150, 0, 77, 131, 0, 64, 113, 0, 50, 95, 0, 34, 75, 0, 12, 52, 0, 0, 14,
+ 0, 113, 170, 0, 101, 153, 0, 89, 137, 0, 77, 120, 0, 64, 102, 0, 50, 85, 0, 35, 67, 0, 12, 44, 0, 0, 4,
+ 0, 113, 156, 0, 100, 139, 0, 89, 125, 0, 77, 109, 0, 64, 92, 0, 51, 77, 0, 35, 60, 0, 12, 38, 0, 0, 0,
+ 0, 112, 141, 0, 100, 126, 0, 89, 113, 0, 77, 98, 0, 64, 83, 0, 51, 68, 0, 35, 51, 0, 12, 30, 0, 0, 0,
+ 0, 112, 127, 0, 100, 112, 0, 89, 100, 0, 76, 87, 0, 64, 74, 0, 51, 59, 0, 35, 44, 0, 13, 24, 0, 0, 0,
+ 0, 112, 111, 0, 100, 100, 0, 88, 88, 0, 76, 76, 0, 64, 64, 0, 51, 52, 0, 36, 37, 0, 13, 17, 0, 0, 0,
+ 0, 111, 96, 0, 99, 85, 0, 88, 76, 0, 76, 64, 0, 64, 53, 0, 51, 41, 0, 36, 27, 0, 13, 6, 0, 0, 0,
+ 0, 111, 81, 0, 99, 71, 0, 88, 62, 0, 76, 52, 0, 64, 43, 0, 51, 31, 0, 36, 17, 0, 13, 0, 0, 0, 0,
+ 0, 111, 69, 0, 99, 60, 0, 88, 52, 0, 75, 43, 0, 63, 34, 0, 51, 21, 0, 36, 7, 0, 13, 0, 0, 0, 0,
+ 0, 99, 177, 0, 88, 158, 0, 77, 141, 0, 66, 123, 0, 53, 106, 0, 40, 89, 0, 25, 71, 0, 5, 47, 0, 0, 8,
+ 0, 99, 160, 0, 88, 144, 0, 77, 129, 0, 66, 112, 0, 54, 97, 0, 41, 80, 0, 26, 62, 0, 5, 40, 0, 0, 0,
+ 0, 99, 147, 0, 87, 132, 0, 78, 117, 0, 66, 102, 0, 54, 87, 0, 42, 72, 0, 26, 55, 0, 5, 34, 0, 0, 0,
+ 0, 99, 134, 0, 88, 119, 0, 77, 107, 0, 66, 92, 0, 54, 78, 0, 42, 64, 0, 27, 48, 0, 5, 27, 0, 0, 0,
+ 0, 99, 120, 0, 87, 107, 0, 78, 94, 0, 66, 81, 0, 54, 68, 0, 42, 55, 0, 27, 40, 0, 6, 20, 0, 0, 0,
+ 0, 98, 105, 0, 87, 94, 0, 77, 84, 0, 65, 71, 0, 55, 59, 0, 42, 47, 0, 28, 33, 0, 6, 12, 0, 0, 0,
+ 0, 98, 93, 0, 87, 81, 0, 77, 72, 0, 66, 61, 0, 54, 49, 0, 42, 37, 0, 28, 24, 0, 6, 4, 0, 0, 0,
+ 0, 98, 77, 0, 87, 68, 0, 77, 59, 0, 65, 49, 0, 54, 39, 0, 42, 27, 0, 29, 14, 0, 6, 0, 0, 0, 0,
+ 1, 98, 65, 7, 87, 56, 0, 77, 49, 0, 66, 41, 0, 54, 30, 0, 42, 19, 0, 29, 3, 0, 6, 0, 0, 0, 0,
+ 0, 84, 166, 0, 74, 149, 0, 64, 134, 0, 53, 117, 0, 41, 100, 0, 28, 83, 0, 11, 64, 0, 0, 42, 0, 0, 3,
+ 0, 84, 151, 0, 74, 135, 0, 64, 121, 0, 53, 105, 0, 42, 90, 0, 30, 75, 0, 14, 58, 0, 0, 36, 0, 0, 0,
+ 0, 84, 138, 0, 74, 124, 1, 64, 110, 0, 54, 95, 0, 43, 81, 0, 30, 67, 0, 15, 51, 0, 1, 29, 0, 0, 0,
+ 14, 84, 126, 12, 74, 112, 2, 65, 99, 0, 54, 85, 0, 44, 73, 0, 31, 59, 0, 16, 44, 0, 1, 23, 0, 0, 0,
+ 16, 84, 113, 13, 74, 100, 6, 65, 89, 0, 54, 77, 0, 44, 65, 0, 31, 51, 0, 17, 36, 0, 1, 16, 0, 0, 0,
+ 24, 84, 100, 18, 74, 88, 13, 65, 78, 2, 55, 68, 0, 44, 55, 0, 32, 43, 0, 18, 28, 0, 1, 6, 0, 0, 0,
+ 26, 84, 87, 24, 74, 76, 17, 65, 67, 7, 54, 57, 0, 44, 46, 0, 32, 35, 0, 19, 21, 0, 2, 3, 0, 0, 0,
+ 30, 84, 74, 28, 74, 64, 20, 65, 55, 12, 55, 46, 0, 44, 35, 0, 32, 24, 0, 18, 9, 0, 1, 0, 0, 0, 0,
+ 32, 84, 63, 28, 74, 54, 21, 65, 47, 13, 54, 38, 0, 44, 28, 0, 32, 16, 0, 18, 1, 0, 1, 0, 0, 0, 0,
+ 30, 67, 155, 20, 58, 139, 20, 49, 126, 12, 39, 110, 0, 27, 94, 0, 13, 77, 0, 0, 60, 0, 0, 37, 0, 0, 0,
+ 35, 67, 142, 30, 58, 126, 23, 50, 114, 16, 40, 99, 7, 29, 85, 0, 15, 69, 0, 0, 52, 0, 0, 30, 0, 0, 0,
+ 35, 68, 131, 30, 59, 116, 27, 50, 104, 18, 40, 90, 9, 29, 76, 0, 17, 62, 0, 2, 46, 0, 0, 24, 0, 0, 0,
+ 37, 69, 119, 33, 59, 106, 27, 51, 94, 21, 41, 80, 9, 30, 67, 0, 18, 54, 0, 3, 39, 0, 0, 18, 0, 0, 0,
+ 40, 69, 107, 36, 59, 94, 28, 51, 84, 18, 41, 72, 10, 31, 60, 0, 19, 47, 0, 4, 32, 0, 0, 10, 0, 0, 0,
+ 42, 69, 95, 36, 59, 84, 29, 51, 74, 19, 41, 63, 10, 31, 52, 0, 20, 39, 0, 4, 25, 0, 0, 4, 0, 0, 0,
+ 43, 69, 83, 38, 60, 73, 32, 51, 62, 23, 42, 53, 11, 31, 42, 0, 20, 31, 0, 5, 17, 0, 0, 1, 0, 0, 0,
+ 45, 69, 70, 39, 60, 60, 33, 51, 52, 24, 42, 43, 13, 32, 33, 0, 21, 21, 0, 5, 6, 0, 0, 0, 0, 0, 0,
+ 47, 69, 59, 41, 60, 51, 34, 51, 43, 24, 42, 35, 12, 33, 26, 1, 22, 14, 0, 5, 1, 0, 0, 0, 0, 0, 0,
+ 46, 48, 146, 42, 40, 131, 36, 32, 118, 27, 22, 103, 17, 6, 88, 5, 0, 73, 0, 0, 55, 0, 0, 33, 0, 0, 0,
+ 48, 48, 133, 44, 40, 119, 37, 32, 107, 28, 22, 93, 20, 8, 79, 7, 0, 65, 0, 0, 49, 0, 0, 27, 0, 0, 0,
+ 48, 50, 123, 44, 41, 109, 37, 33, 97, 30, 23, 83, 21, 11, 71, 8, 0, 58, 0, 0, 42, 0, 0, 21, 0, 0, 0,
+ 49, 51, 111, 45, 42, 99, 38, 34, 87, 29, 25, 75, 20, 13, 63, 8, 0, 51, 0, 0, 36, 0, 0, 14, 0, 0, 0,
+ 52, 52, 100, 44, 43, 89, 38, 35, 79, 29, 26, 68, 19, 15, 56, 10, 1, 43, 0, 0, 28, 0, 0, 6, 0, 0, 0,
+ 52, 52, 90, 47, 44, 79, 39, 36, 70, 30, 27, 59, 20, 16, 47, 9, 2, 36, 0, 0, 22, 0, 0, 2, 0, 0, 0,
+ 52, 53, 78, 46, 44, 68, 39, 37, 60, 32, 27, 49, 22, 17, 39, 10, 3, 28, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+ 53, 53, 66, 47, 44, 57, 40, 36, 48, 32, 27, 39, 22, 18, 30, 9, 4, 18, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 54, 53, 57, 48, 45, 49, 41, 37, 41, 33, 28, 32, 22, 19, 23, 11, 6, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+void AdobeCMYK_to_sRGB1(FX_BYTE c, FX_BYTE m, FX_BYTE y, FX_BYTE k, FX_BYTE& R, FX_BYTE& G, FX_BYTE& B)
+{
+ int fix_c = c << 8;
+ int fix_m = m << 8;
+ int fix_y = y << 8;
+ int fix_k = k << 8;
+ int c_index = (fix_c + 4096) >> 13;
+ int m_index = (fix_m + 4096) >> 13;
+ int y_index = (fix_y + 4096) >> 13;
+ int k_index = (fix_k + 4096) >> 13;
+ int pos = (c_index * 9 * 9 * 9 + m_index * 9 * 9 + y_index * 9 + k_index) * 3;
+ int fix_r = g_CMYKSamples[pos] << 8;
+ int fix_g = g_CMYKSamples[pos + 1] << 8;
+ int fix_b = g_CMYKSamples[pos + 2] << 8;
+ int c1_index = fix_c >> 13;
+ if (c1_index == c_index) {
+ c1_index = c1_index == 8 ? c1_index - 1 : c1_index + 1;
+ }
+ int m1_index = fix_m >> 13;
+ if (m1_index == m_index) {
+ m1_index = m1_index == 8 ? m1_index - 1 : m1_index + 1;
+ }
+ int y1_index = fix_y >> 13;
+ if (y1_index == y_index) {
+ y1_index = y1_index == 8 ? y1_index - 1 : y1_index + 1;
+ }
+ int k1_index = fix_k >> 13;
+ if (k1_index == k_index) {
+ k1_index = k1_index == 8 ? k1_index - 1 : k1_index + 1;
+ }
+ int c1_pos = pos + (c1_index - c_index) * 9 * 9 * 9 * 3;
+ int m1_pos = pos + (m1_index - m_index) * 9 * 9 * 3;
+ int y1_pos = pos + (y1_index - y_index) * 9 * 3;
+ int k1_pos = pos + (k1_index - k_index) * 3;
+ int c_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[c1_pos];
+ int c_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[c1_pos + 1];
+ int c_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[c1_pos + 2];
+ int m_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[m1_pos];
+ int m_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[m1_pos + 1];
+ int m_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[m1_pos + 2];
+ int y_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[y1_pos];
+ int y_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[y1_pos + 1];
+ int y_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[y1_pos + 2];
+ int k_r_delta = g_CMYKSamples[pos] - g_CMYKSamples[k1_pos];
+ int k_g_delta = g_CMYKSamples[pos + 1] - g_CMYKSamples[k1_pos + 1];
+ int k_b_delta = g_CMYKSamples[pos + 2] - g_CMYKSamples[k1_pos + 2];
+ int c_rate = (fix_c - (c_index << 13)) * (c_index - c1_index);
+ fix_r += c_r_delta * c_rate / 32;
+ fix_g += c_g_delta * c_rate / 32;
+ fix_b += c_b_delta * c_rate / 32;
+ int m_rate = (fix_m - (m_index << 13)) * (m_index - m1_index);
+ fix_r += m_r_delta * m_rate / 32;
+ fix_g += m_g_delta * m_rate / 32;
+ fix_b += m_b_delta * m_rate / 32;
+ int y_rate = (fix_y - (y_index << 13)) * (y_index - y1_index);
+ fix_r += y_r_delta * y_rate / 32;
+ fix_g += y_g_delta * y_rate / 32;
+ fix_b += y_b_delta * y_rate / 32;
+ int k_rate = (fix_k - (k_index << 13)) * (k_index - k1_index);
+ fix_r += k_r_delta * k_rate / 32;
+ fix_g += k_g_delta * k_rate / 32;
+ fix_b += k_b_delta * k_rate / 32;
+ if (fix_r < 0) {
+ fix_r = 0;
+ }
+ if (fix_g < 0) {
+ fix_g = 0;
+ }
+ if (fix_b < 0) {
+ fix_b = 0;
+ }
+ R = fix_r >> 8;
+ G = fix_g >> 8;
+ B = fix_b >> 8;
+}
+void AdobeCMYK_to_sRGB(FX_FLOAT c, FX_FLOAT m, FX_FLOAT y, FX_FLOAT k, FX_FLOAT& R, FX_FLOAT& G, FX_FLOAT& B)
+{
+ FX_BYTE c1 = FXSYS_round(c * 255);
+ FX_BYTE m1 = FXSYS_round(m * 255);
+ FX_BYTE y1 = FXSYS_round(y * 255);
+ FX_BYTE k1 = FXSYS_round(k * 255);
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(c1, m1, y1, k1, r, g, b);
+ R = 1.0f * r / 255;
+ G = 1.0f * g / 255;
+ B = 1.0f * b / 255;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jbig.cpp b/core/src/fxcodec/codec/fx_codec_jbig.cpp
new file mode 100644
index 0000000000..a644e99c5d
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jbig.cpp
@@ -0,0 +1,212 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+CCodec_Jbig2Context::CCodec_Jbig2Context()
+{
+ FXSYS_memset32(this, 0, sizeof(CCodec_Jbig2Context));
+}
+CCodec_Jbig2Module::~CCodec_Jbig2Module()
+{
+}
+void* CCodec_Jbig2Module::CreateJbig2Context()
+{
+ return FX_NEW CCodec_Jbig2Context();
+}
+void CCodec_Jbig2Module::DestroyJbig2Context(void* pJbig2Content)
+{
+ if(pJbig2Content) {
+ CJBig2_Context::DestroyContext(((CCodec_Jbig2Context*)pJbig2Content)->m_pContext);
+ delete (CCodec_Jbig2Context*)pJbig2Content;
+ }
+ pJbig2Content = NULL;
+}
+FX_BOOL CCodec_Jbig2Module::Decode(FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch)
+{
+ FXSYS_memset32(dest_buf, 0, height * dest_pitch);
+ CJBig2_Context* pContext = CJBig2_Context::CreateContext(&m_Module,
+ (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM);
+ if (pContext == NULL) {
+ return FALSE;
+ }
+ int ret = pContext->getFirstPage(dest_buf, width, height, dest_pitch, NULL);
+ CJBig2_Context::DestroyContext(pContext);
+ if (ret != JBIG2_SUCCESS) {
+ return FALSE;
+ }
+ int dword_size = height * dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return TRUE;
+}
+FX_BOOL CCodec_Jbig2Module::Decode(IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf)
+{
+ CJBig2_Context* pContext = NULL;
+ CJBig2_Image* dest_image = NULL;
+ FX_DWORD src_size = (FX_DWORD)file_ptr->GetSize();
+ FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
+ if (src_buf == NULL) {
+ return FALSE;
+ }
+ int ret = 0;
+ if(!file_ptr->ReadBlock(src_buf, 0, src_size)) {
+ goto failed;
+ }
+ pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, src_buf, src_size, JBIG2_FILE_STREAM);
+ if(pContext == NULL) {
+ goto failed;
+ }
+ ret = pContext->getFirstPage(&dest_image, NULL);
+ CJBig2_Context::DestroyContext(pContext);
+ if (ret != JBIG2_SUCCESS) {
+ goto failed;
+ }
+ width = (FX_DWORD)dest_image->m_nWidth;
+ height = (FX_DWORD)dest_image->m_nHeight;
+ pitch = (FX_DWORD)dest_image->m_nStride;
+ dest_buf = dest_image->m_pData;
+ dest_image->m_bNeedFree = FALSE;
+ delete dest_image;
+ FX_Free(src_buf);
+ return TRUE;
+failed:
+ if(src_buf) {
+ FX_Free(src_buf);
+ }
+ return FALSE;
+}
+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, FX_DWORD width, FX_DWORD height, FX_LPCBYTE src_buf, FX_DWORD src_size,
+ FX_LPCBYTE global_data, FX_DWORD global_size, FX_LPBYTE dest_buf, FX_DWORD dest_pitch, IFX_Pause* pPause)
+{
+ if(!pJbig2Context) {
+ return FXCODEC_STATUS_ERR_PARAMS;
+ }
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ m_pJbig2Context->m_width = width;
+ m_pJbig2Context->m_height = height;
+ m_pJbig2Context->m_src_buf = (unsigned char *)src_buf;
+ m_pJbig2Context->m_src_size = src_size;
+ m_pJbig2Context->m_global_data = global_data;
+ m_pJbig2Context->m_global_size = global_size;
+ m_pJbig2Context->m_dest_buf = dest_buf;
+ m_pJbig2Context->m_dest_pitch = dest_pitch;
+ m_pJbig2Context->m_pPause = pPause;
+ m_pJbig2Context->m_bFileReader = FALSE;
+ FXSYS_memset32(dest_buf, 0, height * dest_pitch);
+ m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module,
+ (FX_LPBYTE)global_data, global_size, (FX_LPBYTE)src_buf, src_size, JBIG2_EMBED_STREAM, pPause);
+ if(!m_pJbig2Context->m_pContext) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int ret = m_pJbig2Context->m_pContext->getFirstPage(dest_buf, width, height, dest_pitch, pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int dword_size = height * dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ return m_pJbig2Context->m_pContext->GetProcessiveStatus();
+}
+FXCODEC_STATUS CCodec_Jbig2Module::StartDecode(void* pJbig2Context, IFX_FileRead* file_ptr,
+ FX_DWORD& width, FX_DWORD& height, FX_DWORD& pitch, FX_LPBYTE& dest_buf, IFX_Pause* pPause)
+{
+ if(!pJbig2Context) {
+ return FXCODEC_STATUS_ERR_PARAMS;
+ }
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ m_pJbig2Context->m_bFileReader = TRUE;
+ m_pJbig2Context->m_dest_image = NULL;
+ m_pJbig2Context->m_src_size = (FX_DWORD)file_ptr->GetSize();
+ m_pJbig2Context->m_src_buf = FX_Alloc(FX_BYTE, m_pJbig2Context->m_src_size);
+ if (m_pJbig2Context->m_src_buf == NULL) {
+ return FXCODEC_STATUS_ERR_MEMORY;
+ }
+ int ret = 0;
+ if(!file_ptr->ReadBlock((void*)m_pJbig2Context->m_src_buf, 0, m_pJbig2Context->m_src_size)) {
+ goto failed;
+ }
+ m_pJbig2Context->m_pContext = CJBig2_Context::CreateContext(&m_Module, NULL, 0, m_pJbig2Context->m_src_buf, m_pJbig2Context->m_src_size, JBIG2_FILE_STREAM, pPause);
+ if(m_pJbig2Context->m_pContext == NULL) {
+ goto failed;
+ }
+ ret = m_pJbig2Context->m_pContext->getFirstPage(&m_pJbig2Context->m_dest_image, pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
+ height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
+ pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
+ dest_buf = m_pJbig2Context->m_dest_image->m_pData;
+ m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ goto failed;
+ }
+ width = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nWidth;
+ height = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nHeight;
+ pitch = (FX_DWORD)m_pJbig2Context->m_dest_image->m_nStride;
+ dest_buf = m_pJbig2Context->m_dest_image->m_pData;
+ m_pJbig2Context->m_dest_image->m_bNeedFree = FALSE;
+ delete m_pJbig2Context->m_dest_image;
+ FX_Free(m_pJbig2Context->m_src_buf);
+ return FXCODEC_STATUS_DECODE_FINISH;
+failed:
+ if(m_pJbig2Context->m_src_buf) {
+ FX_Free(m_pJbig2Context->m_src_buf);
+ }
+ m_pJbig2Context->m_src_buf = NULL;
+ return FXCODEC_STATUS_ERROR;
+}
+FXCODEC_STATUS CCodec_Jbig2Module::ContinueDecode(void* pJbig2Context, IFX_Pause* pPause)
+{
+ CCodec_Jbig2Context* m_pJbig2Context = (CCodec_Jbig2Context*)pJbig2Context;
+ int ret = m_pJbig2Context->m_pContext->Continue(pPause);
+ if(m_pJbig2Context->m_pContext->GetProcessiveStatus() == FXCODEC_STATUS_DECODE_FINISH) {
+ if(m_pJbig2Context->m_bFileReader) {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ if(m_pJbig2Context->m_src_buf) {
+ FX_Free(m_pJbig2Context->m_src_buf);
+ }
+ m_pJbig2Context->m_src_buf = NULL;
+ return FXCODEC_STATUS_ERROR;
+ }
+ delete m_pJbig2Context->m_dest_image;
+ FX_Free(m_pJbig2Context->m_src_buf);
+ return FXCODEC_STATUS_DECODE_FINISH;
+ } else {
+ CJBig2_Context::DestroyContext(m_pJbig2Context->m_pContext);
+ m_pJbig2Context->m_pContext = NULL;
+ if (ret != JBIG2_SUCCESS) {
+ return FXCODEC_STATUS_ERROR;
+ }
+ int dword_size = m_pJbig2Context->m_height * m_pJbig2Context->m_dest_pitch / 4;
+ FX_DWORD* dword_buf = (FX_DWORD*)m_pJbig2Context->m_dest_buf;
+ for (int i = 0; i < dword_size; i ++) {
+ dword_buf[i] = ~dword_buf[i];
+ }
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ }
+ return m_pJbig2Context->m_pContext->GetProcessiveStatus();
+}
+
+
+
diff --git a/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp b/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp
new file mode 100644
index 0000000000..4a982e66a8
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jbig_enc.cpp
@@ -0,0 +1,11 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+ICodec_Jbig2Encoder* CCodec_ModuleMgr::CreateJbig2Encoder()
+{
+ return NULL;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jpeg.cpp b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
new file mode 100644
index 0000000000..fc91a6c162
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jpeg.cpp
@@ -0,0 +1,735 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "../../../include/fxge/fx_dib.h"
+#include "codec_int.h"
+extern "C" {
+ static void _JpegScanSOI(const FX_BYTE*& src_buf, FX_DWORD& src_size)
+ {
+ if (src_size == 0) {
+ return;
+ }
+ FX_DWORD offset = 0;
+ while (offset < src_size - 1) {
+ if (src_buf[offset] == 0xff && src_buf[offset + 1] == 0xd8) {
+ src_buf += offset;
+ src_size -= offset;
+ return;
+ }
+ offset ++;
+ }
+ }
+};
+extern "C" {
+#undef FAR
+#include "../../fx_jpeglib.h"
+}
+extern "C" {
+ static void _src_do_nothing(struct jpeg_decompress_struct* cinfo) {}
+};
+extern "C" {
+ static void _error_fatal(j_common_ptr cinfo)
+ {
+ longjmp(*(jmp_buf*)cinfo->client_data, -1);
+ }
+};
+extern "C" {
+ static void _src_skip_data(struct jpeg_decompress_struct* cinfo, long num)
+ {
+ if (num > (long)cinfo->src->bytes_in_buffer) {
+ _error_fatal((j_common_ptr)cinfo);
+ }
+ cinfo->src->next_input_byte += num;
+ cinfo->src->bytes_in_buffer -= num;
+ }
+};
+extern "C" {
+ static boolean _src_fill_buffer(j_decompress_ptr cinfo)
+ {
+ return 0;
+ }
+};
+extern "C" {
+ static boolean _src_resync(j_decompress_ptr cinfo, int desired)
+ {
+ return 0;
+ }
+};
+extern "C" {
+ static void _error_do_nothing(j_common_ptr cinfo) {}
+};
+extern "C" {
+ static void _error_do_nothing1(j_common_ptr cinfo, int) {}
+};
+extern "C" {
+ static void _error_do_nothing2(j_common_ptr cinfo, char*) {}
+};
+#define JPEG_MARKER_EXIF (JPEG_APP0 + 1)
+#define JPEG_MARKER_ICC (JPEG_APP0 + 2)
+#define JPEG_MARKER_AUTHORTIME (JPEG_APP0 + 3)
+#define JPEG_MARKER_MAXSIZE 0xFFFF
+#define JPEG_OVERHEAD_LEN 14
+static FX_BOOL _JpegIsIccMarker(jpeg_saved_marker_ptr marker)
+{
+ if (marker->marker == JPEG_MARKER_ICC &&
+ marker->data_length >= JPEG_OVERHEAD_LEN &&
+ (FXSYS_memcmp32(marker->data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12) == 0)) {
+ return TRUE;
+ }
+ return FALSE;
+}
+static FX_BOOL _JpegLoadIccProfile(j_decompress_ptr cinfo, FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ if(icc_buf_ptr == NULL || icc_length == NULL) {
+ return FALSE;
+ }
+ *icc_buf_ptr = NULL;
+ *icc_length = 0;
+ FX_LPBYTE icc_data_ptr = NULL;
+ FX_DWORD icc_data_len = 0;
+ FX_BYTE count_icc_marker = 0;
+ FX_BYTE num_icc_marker = 0;
+ jpeg_saved_marker_ptr marker_list[256] = {NULL};
+ for (jpeg_saved_marker_ptr cur_marker = cinfo->marker_list;
+ cur_marker != NULL;
+ cur_marker = cur_marker->next) {
+ if(_JpegIsIccMarker(cur_marker)) {
+ if(count_icc_marker == 0) {
+ num_icc_marker = cur_marker->data[13];
+ } else if(num_icc_marker != cur_marker->data[13]) {
+ return FALSE;
+ }
+ int sn = cur_marker->data[12] - 1;
+ if(sn < 0 || sn >= num_icc_marker) {
+ return FALSE;
+ }
+ if(marker_list[sn] == NULL) {
+ marker_list[sn] = cur_marker;
+ } else {
+ return FALSE;
+ }
+ count_icc_marker ++;
+ icc_data_len += (cur_marker->data_length - JPEG_OVERHEAD_LEN);
+ }
+ }
+ if(count_icc_marker != num_icc_marker) {
+ return FALSE;
+ }
+ if(num_icc_marker == 0) {
+ return TRUE;
+ }
+ icc_data_ptr = FX_Alloc(FX_BYTE, icc_data_len);
+ if(icc_buf_ptr == NULL) {
+ return FALSE;
+ }
+ *icc_buf_ptr = icc_data_ptr;
+ *icc_length = icc_data_len;
+ for (int idx = 0; idx < num_icc_marker; idx++) {
+ icc_data_len = marker_list[idx]->data_length - JPEG_OVERHEAD_LEN;
+ FXSYS_memcpy32(icc_data_ptr, marker_list[idx]->data + JPEG_OVERHEAD_LEN, icc_data_len);
+ icc_data_ptr += icc_data_len;
+ }
+ return TRUE;
+}
+static FX_BOOL _JpegEmbedIccProfile(j_compress_ptr cinfo, FX_LPCBYTE icc_buf_ptr, FX_DWORD icc_length)
+{
+ if(icc_buf_ptr == NULL || icc_length == 0) {
+ return FALSE;
+ }
+ FX_DWORD icc_segment_size = (JPEG_MARKER_MAXSIZE - 2 - JPEG_OVERHEAD_LEN);
+ FX_DWORD icc_segment_num = (icc_length / icc_segment_size) + 1;
+ if (icc_segment_num > 255) {
+ return FALSE;
+ }
+ FX_DWORD icc_data_length = JPEG_OVERHEAD_LEN + (icc_segment_num > 1 ? icc_segment_size : icc_length);
+ FX_LPBYTE icc_data = FX_Alloc(FX_BYTE, icc_data_length);
+ if (icc_data == NULL) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(icc_data, "\x49\x43\x43\x5f\x50\x52\x4f\x46\x49\x4c\x45\x00", 12);
+ icc_data[13] = (FX_BYTE)icc_segment_num;
+ for (FX_BYTE i = 0; i < (icc_segment_num - 1); i++) {
+ icc_data[12] = i + 1;
+ FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + i * icc_segment_size, icc_segment_size);
+ jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, icc_data_length);
+ }
+ icc_data[12] = (FX_BYTE)icc_segment_num;
+ FX_DWORD icc_size = (icc_segment_num - 1) * icc_segment_size;
+ FXSYS_memcpy32(icc_data + JPEG_OVERHEAD_LEN, icc_buf_ptr + icc_size, icc_length - icc_size);
+ jpeg_write_marker(cinfo, JPEG_MARKER_ICC, icc_data, JPEG_OVERHEAD_LEN + icc_length - icc_size);
+ FX_Free(icc_data);
+ return TRUE;
+}
+extern "C" {
+ static void _dest_do_nothing(j_compress_ptr cinfo) {}
+};
+extern "C" {
+ static boolean _dest_empty(j_compress_ptr cinfo)
+ {
+ return FALSE;
+ }
+};
+#define JPEG_BLOCK_SIZE 1048576
+static void _JpegEncode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jerr.error_exit = _error_do_nothing;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ cinfo.err = &jerr;
+ jpeg_create_compress(&cinfo);
+ int Bpp = pSource->GetBPP() / 8;
+ int nComponents = Bpp >= 3 ? (pSource->IsCmykImage() ? 4 : 3) : 1;
+ int pitch = pSource->GetPitch();
+ int width = pSource->GetWidth();
+ int height = pSource->GetHeight();
+ FX_DWORD dest_buf_length = width * height * nComponents + 1024 + (icc_length ? (icc_length + 255 * 18) : 0);
+ dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
+ while (dest_buf == NULL) {
+ dest_buf_length >>= 1;
+ dest_buf = FX_Alloc(FX_BYTE, dest_buf_length);
+ }
+ FXSYS_memset32(dest_buf, 0, dest_buf_length);
+ struct jpeg_destination_mgr dest;
+ dest.init_destination = _dest_do_nothing;
+ dest.term_destination = _dest_do_nothing;
+ dest.empty_output_buffer = _dest_empty;
+ dest.next_output_byte = dest_buf;
+ dest.free_in_buffer = dest_buf_length;
+ cinfo.dest = &dest;
+ cinfo.image_width = width;
+ cinfo.image_height = height;
+ cinfo.input_components = nComponents;
+ if (nComponents == 1) {
+ cinfo.in_color_space = JCS_GRAYSCALE;
+ } else if (nComponents == 3) {
+ cinfo.in_color_space = JCS_RGB;
+ } else {
+ cinfo.in_color_space = JCS_CMYK;
+ }
+ FX_LPBYTE line_buf = NULL;
+ if (nComponents > 1) {
+ line_buf = FX_Alloc(FX_BYTE, width * nComponents);
+ if (line_buf == NULL) {
+ return;
+ }
+ }
+ jpeg_set_defaults(&cinfo);
+ if(quality != 75) {
+ jpeg_set_quality(&cinfo, quality, TRUE);
+ }
+ jpeg_start_compress(&cinfo, TRUE);
+ _JpegEmbedIccProfile(&cinfo, icc_buf, icc_length);
+ JSAMPROW row_pointer[1];
+ JDIMENSION row;
+ while (cinfo.next_scanline < cinfo.image_height) {
+ FX_LPCBYTE src_scan = pSource->GetScanline(cinfo.next_scanline);
+ if (nComponents > 1) {
+ FX_LPBYTE dest_scan = line_buf;
+ if (nComponents == 3) {
+ for (int i = 0; i < width; i ++) {
+ dest_scan[0] = src_scan[2];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[0];
+ dest_scan += 3;
+ src_scan += Bpp;
+ }
+ } else {
+ for (int i = 0; i < pitch; i ++) {
+ *dest_scan++ = ~*src_scan++;
+ }
+ }
+ row_pointer[0] = line_buf;
+ } else {
+ row_pointer[0] = (FX_LPBYTE)src_scan;
+ }
+ row = cinfo.next_scanline;
+ jpeg_write_scanlines(&cinfo, row_pointer, 1);
+ if (cinfo.next_scanline == row) {
+ dest_buf = FX_Realloc(FX_BYTE, dest_buf, dest_buf_length + JPEG_BLOCK_SIZE);
+ if (dest_buf == NULL) {
+ FX_Free(line_buf);
+ return;
+ }
+ dest.next_output_byte = dest_buf + dest_buf_length - dest.free_in_buffer;
+ dest_buf_length += JPEG_BLOCK_SIZE;
+ dest.free_in_buffer += JPEG_BLOCK_SIZE;
+ }
+ }
+ jpeg_finish_compress(&cinfo);
+ jpeg_destroy_compress(&cinfo);
+ if (line_buf) {
+ FX_Free(line_buf);
+ }
+ dest_size = dest_buf_length - (FX_STRSIZE)dest.free_in_buffer;
+}
+static FX_BOOL _JpegLoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ _JpegScanSOI(src_buf, src_size);
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ jerr.error_exit = _error_fatal;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ cinfo.err = &jerr;
+ jmp_buf mark;
+ cinfo.client_data = &mark;
+ if (setjmp(mark) == -1) {
+ return FALSE;
+ }
+ jpeg_create_decompress(&cinfo);
+ struct jpeg_source_mgr src;
+ src.init_source = _src_do_nothing;
+ src.term_source = _src_do_nothing;
+ src.skip_input_data = _src_skip_data;
+ src.fill_input_buffer = _src_fill_buffer;
+ src.resync_to_restart = _src_resync;
+ src.bytes_in_buffer = src_size;
+ src.next_input_byte = src_buf;
+ cinfo.src = &src;
+ if (setjmp(mark) == -1) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ if(icc_buf_ptr && icc_length) {
+ jpeg_save_markers(&cinfo, JPEG_MARKER_ICC, JPEG_MARKER_MAXSIZE);
+ }
+ int ret = jpeg_read_header(&cinfo, TRUE);
+ if (ret != JPEG_HEADER_OK) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ width = cinfo.image_width;
+ height = cinfo.image_height;
+ num_components = cinfo.num_components;
+ color_transform = cinfo.jpeg_color_space == JCS_YCbCr || cinfo.jpeg_color_space == JCS_YCCK;
+ bits_per_components = cinfo.data_precision;
+ if(icc_buf_ptr != NULL) {
+ *icc_buf_ptr = NULL;
+ }
+ if(icc_length != NULL) {
+ *icc_length = 0;
+ }
+ jpeg_destroy_decompress(&cinfo);
+ return TRUE;
+}
+class CCodec_JpegDecoder : public CCodec_ScanlineDecoder
+{
+public:
+ CCodec_JpegDecoder();
+ ~CCodec_JpegDecoder();
+ FX_BOOL Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height, int nComps,
+ FX_BOOL ColorTransform, IFX_JpegProvider* pJP);
+ virtual void Destroy()
+ {
+ delete this;
+ }
+ virtual void v_DownScale(int dest_width, int dest_height);
+ virtual FX_BOOL v_Rewind();
+ virtual FX_LPBYTE v_GetNextLine();
+ virtual FX_DWORD GetSrcOffset();
+ jmp_buf m_JmpBuf;
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ struct jpeg_source_mgr src;
+ FX_LPCBYTE m_SrcBuf;
+ FX_DWORD m_SrcSize;
+ FX_LPBYTE m_pScanlineBuf;
+ FX_BOOL InitDecode();
+ FX_BOOL m_bInited, m_bStarted, m_bJpegTransform;
+protected:
+ IFX_JpegProvider* m_pExtProvider;
+ void* m_pExtContext;
+ FX_DWORD m_nDefaultScaleDenom;
+};
+CCodec_JpegDecoder::CCodec_JpegDecoder()
+{
+ m_pScanlineBuf = NULL;
+ m_DownScale = 1;
+ m_bStarted = FALSE;
+ m_bInited = FALSE;
+ m_pExtProvider = NULL;
+ m_pExtContext = NULL;
+ FXSYS_memset32(&cinfo, 0, sizeof(cinfo));
+ FXSYS_memset32(&jerr, 0, sizeof(jerr));
+ FXSYS_memset32(&src, 0, sizeof(src));
+ m_nDefaultScaleDenom = 1;
+}
+CCodec_JpegDecoder::~CCodec_JpegDecoder()
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->DestroyDecoder(m_pExtContext);
+ return;
+ }
+ if (m_pScanlineBuf) {
+ FX_Free(m_pScanlineBuf);
+ }
+ if (m_bInited) {
+ jpeg_destroy_decompress(&cinfo);
+ }
+}
+FX_BOOL CCodec_JpegDecoder::InitDecode()
+{
+ cinfo.err = &jerr;
+ cinfo.client_data = &m_JmpBuf;
+ if (setjmp(m_JmpBuf) == -1) {
+ return FALSE;
+ }
+ jpeg_create_decompress(&cinfo);
+ m_bInited = TRUE;
+ cinfo.src = &src;
+ src.bytes_in_buffer = m_SrcSize;
+ src.next_input_byte = m_SrcBuf;
+ if (setjmp(m_JmpBuf) == -1) {
+ jpeg_destroy_decompress(&cinfo);
+ m_bInited = FALSE;
+ return FALSE;
+ }
+ cinfo.image_width = m_OrigWidth;
+ cinfo.image_height = m_OrigHeight;
+ int ret = jpeg_read_header(&cinfo, TRUE);
+ if (ret != JPEG_HEADER_OK) {
+ return FALSE;
+ }
+ if (cinfo.saw_Adobe_marker) {
+ m_bJpegTransform = TRUE;
+ }
+ if (cinfo.num_components == 3 && !m_bJpegTransform) {
+ cinfo.out_color_space = cinfo.jpeg_color_space;
+ }
+ m_OrigWidth = cinfo.image_width;
+ m_OrigHeight = cinfo.image_height;
+ m_OutputWidth = m_OrigWidth;
+ m_OutputHeight = m_OutputHeight;
+ m_nDefaultScaleDenom = cinfo.scale_denom;
+ return TRUE;
+}
+FX_BOOL CCodec_JpegDecoder::Create(FX_LPCBYTE src_buf, FX_DWORD src_size, int width, int height,
+ int nComps, FX_BOOL ColorTransform, IFX_JpegProvider* pJP)
+{
+ if (pJP) {
+ m_pExtProvider = pJP;
+ m_pExtContext = m_pExtProvider->CreateDecoder(src_buf, src_size, width, height, nComps, ColorTransform);
+ return m_pExtContext != NULL;
+ }
+ _JpegScanSOI(src_buf, src_size);
+ m_SrcBuf = src_buf;
+ m_SrcSize = src_size;
+ jerr.error_exit = _error_fatal;
+ jerr.emit_message = _error_do_nothing1;
+ jerr.output_message = _error_do_nothing;
+ jerr.format_message = _error_do_nothing2;
+ jerr.reset_error_mgr = _error_do_nothing;
+ src.init_source = _src_do_nothing;
+ src.term_source = _src_do_nothing;
+ src.skip_input_data = _src_skip_data;
+ src.fill_input_buffer = _src_fill_buffer;
+ src.resync_to_restart = _src_resync;
+ m_bJpegTransform = ColorTransform;
+ if(src_size > 1 && FXSYS_memcmp32(src_buf + src_size - 2, "\xFF\xD9", 2) != 0) {
+ ((FX_LPBYTE)src_buf)[src_size - 2] = 0xFF;
+ ((FX_LPBYTE)src_buf)[src_size - 1] = 0xD9;
+ }
+ m_OutputWidth = m_OrigWidth = width;
+ m_OutputHeight = m_OrigHeight = height;
+ if (!InitDecode()) {
+ return FALSE;
+ }
+ if (cinfo.num_components < nComps) {
+ return FALSE;
+ }
+ if ((int)cinfo.image_width < width) {
+ return FALSE;
+ }
+ m_Pitch = (cinfo.image_width * cinfo.num_components + 3) / 4 * 4;
+ m_pScanlineBuf = FX_Alloc(FX_BYTE, m_Pitch);
+ if (m_pScanlineBuf == NULL) {
+ return FALSE;
+ }
+ m_nComps = cinfo.num_components;
+ m_bpc = 8;
+ m_bColorTransformed = FALSE;
+ m_bStarted = FALSE;
+ return TRUE;
+}
+extern "C" {
+ FX_INT32 FX_GetDownsampleRatio(FX_INT32 originWidth, FX_INT32 originHeight, FX_INT32 downsampleWidth, FX_INT32 downsampleHeight)
+ {
+ int iratio_w = originWidth / downsampleWidth;
+ int iratio_h = originHeight / downsampleHeight;
+ int ratio = (iratio_w > iratio_h) ? iratio_h : iratio_w;
+ if (ratio >= 8) {
+ return 8;
+ } else if (ratio >= 4) {
+ return 4;
+ } else if (ratio >= 2) {
+ return 2;
+ }
+ return 1;
+ }
+}
+void CCodec_JpegDecoder::v_DownScale(int dest_width, int dest_height)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->DownScale(m_pExtContext, dest_width, dest_height);
+ return;
+ }
+ int old_scale = m_DownScale;
+ m_DownScale = FX_GetDownsampleRatio(m_OrigWidth, m_OrigHeight, dest_width, dest_height);
+ m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
+ m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
+ m_Pitch = (m_OutputWidth * m_nComps + 3) / 4 * 4;
+ if (old_scale != m_DownScale) {
+ m_NextLine = -1;
+ }
+}
+FX_BOOL CCodec_JpegDecoder::v_Rewind()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Rewind(m_pExtContext);
+ }
+ if (m_bStarted) {
+ jpeg_destroy_decompress(&cinfo);
+ if (!InitDecode()) {
+ return FALSE;
+ }
+ }
+ if (setjmp(m_JmpBuf) == -1) {
+ return FALSE;
+ }
+ cinfo.scale_denom = m_nDefaultScaleDenom * m_DownScale;
+ m_OutputWidth = (m_OrigWidth + m_DownScale - 1) / m_DownScale;
+ m_OutputHeight = (m_OrigHeight + m_DownScale - 1) / m_DownScale;
+ if (!jpeg_start_decompress(&cinfo)) {
+ jpeg_destroy_decompress(&cinfo);
+ return FALSE;
+ }
+ if ((int)cinfo.output_width > m_OrigWidth) {
+ FXSYS_assert(FALSE);
+ return FALSE;
+ }
+ m_bStarted = TRUE;
+ return TRUE;
+}
+FX_LPBYTE CCodec_JpegDecoder::v_GetNextLine()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetNextLine(m_pExtContext);
+ }
+ int nlines = jpeg_read_scanlines(&cinfo, &m_pScanlineBuf, 1);
+ if (nlines < 1) {
+ return NULL;
+ }
+ return m_pScanlineBuf;
+}
+FX_DWORD CCodec_JpegDecoder::GetSrcOffset()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetSrcOffset(m_pExtContext);
+ }
+ return (FX_DWORD)(m_SrcSize - src.bytes_in_buffer);
+}
+ICodec_ScanlineDecoder* CCodec_JpegModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size,
+ int width, int height, int nComps, FX_BOOL ColorTransform)
+{
+ if (src_buf == NULL || src_size == 0) {
+ return NULL;
+ }
+ CCodec_JpegDecoder* pDecoder = FX_NEW CCodec_JpegDecoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ if (!pDecoder->Create(src_buf, src_size, width, height, nComps, ColorTransform, m_pExtProvider)) {
+ delete pDecoder;
+ return NULL;
+ }
+ return pDecoder;
+}
+FX_BOOL CCodec_JpegModule::LoadInfo(FX_LPCBYTE src_buf, FX_DWORD src_size, int& width, int& height,
+ int& num_components, int& bits_per_components, FX_BOOL& color_transform,
+ FX_LPBYTE* icc_buf_ptr, FX_DWORD* icc_length)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->LoadInfo(src_buf, src_size, width, height,
+ num_components, bits_per_components, color_transform,
+ icc_buf_ptr, icc_length);
+ }
+ return _JpegLoadInfo(src_buf, src_size, width, height, num_components, bits_per_components, color_transform, icc_buf_ptr, icc_length);
+}
+FX_BOOL CCodec_JpegModule::Encode(const CFX_DIBSource* pSource, FX_LPBYTE& dest_buf, FX_STRSIZE& dest_size, int quality, FX_LPCBYTE icc_buf, FX_DWORD icc_length)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Encode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
+ }
+ if(pSource->GetBPP() < 8 || pSource->GetPalette() != NULL) {
+ ASSERT(pSource->GetBPP() >= 8 && pSource->GetPalette() == NULL);
+ return FALSE;
+ }
+ _JpegEncode(pSource, dest_buf, dest_size, quality, icc_buf, icc_length);
+ return TRUE;
+}
+struct FXJPEG_Context {
+ jmp_buf m_JumpMark;
+ jpeg_decompress_struct m_Info;
+ jpeg_error_mgr m_ErrMgr;
+ jpeg_source_mgr m_SrcMgr;
+ unsigned int m_SkipSize;
+ void* (*m_AllocFunc)(unsigned int);
+ void (*m_FreeFunc)(void*);
+};
+extern "C" {
+ static void _error_fatal1(j_common_ptr cinfo)
+ {
+ longjmp(((FXJPEG_Context*)cinfo->client_data)->m_JumpMark, -1);
+ }
+};
+extern "C" {
+ static void _src_skip_data1(struct jpeg_decompress_struct* cinfo, long num)
+ {
+ if (cinfo->src->bytes_in_buffer < (size_t)num) {
+ ((FXJPEG_Context*)cinfo->client_data)->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);
+ cinfo->src->bytes_in_buffer = 0;
+ } else {
+ cinfo->src->next_input_byte += num;
+ cinfo->src->bytes_in_buffer -= num;
+ }
+ }
+};
+static void* jpeg_alloc_func(unsigned int size)
+{
+ return FX_Alloc(char, size);
+}
+static void jpeg_free_func(void* p)
+{
+ FX_Free(p);
+}
+void* CCodec_JpegModule::Start()
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->Start();
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)FX_Alloc(FX_BYTE, sizeof(FXJPEG_Context));
+ if (p == NULL) {
+ return NULL;
+ }
+ p->m_AllocFunc = jpeg_alloc_func;
+ p->m_FreeFunc = jpeg_free_func;
+ p->m_ErrMgr.error_exit = _error_fatal1;
+ p->m_ErrMgr.emit_message = _error_do_nothing1;
+ p->m_ErrMgr.output_message = _error_do_nothing;
+ p->m_ErrMgr.format_message = _error_do_nothing2;
+ p->m_ErrMgr.reset_error_mgr = _error_do_nothing;
+ p->m_SrcMgr.init_source = _src_do_nothing;
+ p->m_SrcMgr.term_source = _src_do_nothing;
+ p->m_SrcMgr.skip_input_data = _src_skip_data1;
+ p->m_SrcMgr.fill_input_buffer = _src_fill_buffer;
+ p->m_SrcMgr.resync_to_restart = _src_resync;
+ p->m_Info.client_data = p;
+ p->m_Info.err = &p->m_ErrMgr;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return 0;
+ }
+ jpeg_create_decompress(&p->m_Info);
+ p->m_Info.src = &p->m_SrcMgr;
+ p->m_SkipSize = 0;
+ return p;
+}
+void CCodec_JpegModule::Finish(void* pContext)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->Finish(pContext);
+ return;
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ jpeg_destroy_decompress(&p->m_Info);
+ p->m_FreeFunc(p);
+}
+void CCodec_JpegModule::Input(void* pContext, const unsigned char* src_buf, FX_DWORD src_size)
+{
+ if (m_pExtProvider) {
+ m_pExtProvider->Input(pContext, src_buf, src_size);
+ return;
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (p->m_SkipSize) {
+ if (p->m_SkipSize > src_size) {
+ p->m_SrcMgr.bytes_in_buffer = 0;
+ p->m_SkipSize -= src_size;
+ return;
+ }
+ src_size -= p->m_SkipSize;
+ src_buf += p->m_SkipSize;
+ p->m_SkipSize = 0;
+ }
+ p->m_SrcMgr.next_input_byte = src_buf;
+ p->m_SrcMgr.bytes_in_buffer = src_size;
+}
+int CCodec_JpegModule::ReadHeader(void* pContext, int* width, int* height, int* nComps)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->ReadHeader(pContext, width, height, nComps);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return 1;
+ }
+ int ret = jpeg_read_header(&p->m_Info, true);
+ if (ret == JPEG_SUSPENDED) {
+ return 2;
+ }
+ if (ret != JPEG_HEADER_OK) {
+ return 1;
+ }
+ *width = p->m_Info.image_width;
+ *height = p->m_Info.image_height;
+ *nComps = p->m_Info.num_components;
+ return 0;
+}
+FX_BOOL CCodec_JpegModule::StartScanline(void* pContext, int down_scale)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->StartScanline(pContext, down_scale);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return FALSE;
+ }
+ p->m_Info.scale_denom = down_scale;
+ return jpeg_start_decompress(&p->m_Info);
+}
+FX_BOOL CCodec_JpegModule::ReadScanline(void* pContext, unsigned char* dest_buf)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->ReadScanline(pContext, dest_buf);
+ }
+ FXJPEG_Context* p = (FXJPEG_Context*)pContext;
+ if (setjmp(p->m_JumpMark) == -1) {
+ return FALSE;
+ }
+ int nlines = jpeg_read_scanlines(&p->m_Info, &dest_buf, 1);
+ return nlines == 1;
+}
+FX_DWORD CCodec_JpegModule::GetAvailInput(void* pContext, FX_LPBYTE* avail_buf_ptr)
+{
+ if (m_pExtProvider) {
+ return m_pExtProvider->GetAvailInput(pContext, avail_buf_ptr);
+ }
+ if(avail_buf_ptr != NULL) {
+ *avail_buf_ptr = NULL;
+ if(((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer > 0) {
+ *avail_buf_ptr = (FX_LPBYTE)((FXJPEG_Context*)pContext)->m_SrcMgr.next_input_byte;
+ }
+ }
+ return (FX_DWORD)((FXJPEG_Context*)pContext)->m_SrcMgr.bytes_in_buffer;
+}
diff --git a/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
new file mode 100644
index 0000000000..423819f69f
--- /dev/null
+++ b/core/src/fxcodec/codec/fx_codec_jpx_opj.cpp
@@ -0,0 +1,799 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcodec/fx_codec.h"
+#include "codec_int.h"
+#include "../fx_libopenjpeg/libopenjpeg20/openjpeg.h"
+#include "../lcms2/include/fx_lcms2.h"
+static void fx_error_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+static void fx_warning_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+static void fx_info_callback(const char *msg, void *client_data)
+{
+ (void)client_data;
+}
+typedef struct {
+ const unsigned char* src_data;
+ int src_size;
+ int offset;
+} decodeData;
+static OPJ_SIZE_T opj_read_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_SIZE_T readlength = p_nb_bytes;
+ OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
+ if(bufferLength <= 0) {
+ return 0;
+ }
+ if(bufferLength <= p_nb_bytes) {
+ readlength = bufferLength;
+ }
+ memcpy(p_buffer, &(srcData->src_data[srcData->offset]), readlength);
+ srcData->offset += (int)readlength;
+ return readlength;
+}
+static OPJ_SIZE_T opj_write_from_memory (void * p_buffer, OPJ_SIZE_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_SIZE_T writeLength = p_nb_bytes;
+ OPJ_SIZE_T bufferLength = (OPJ_SIZE_T)(srcData->src_size - srcData->offset);
+ if(bufferLength <= p_nb_bytes) {
+ writeLength = bufferLength;
+ }
+ memcpy((void*&)(srcData->src_data[srcData->offset]), p_buffer, writeLength);
+ srcData->offset += (int)writeLength;
+ return writeLength;
+}
+static OPJ_OFF_T opj_skip_from_memory (OPJ_OFF_T p_nb_bytes, decodeData* srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ OPJ_OFF_T postion = srcData->offset + p_nb_bytes;
+ if(postion < 0 ) {
+ postion = 0;
+ } else if (postion > srcData->src_size) {
+ }
+ srcData->offset = (int)postion;
+ return p_nb_bytes;
+}
+static OPJ_BOOL opj_seek_from_memory (OPJ_OFF_T p_nb_bytes, decodeData * srcData)
+{
+ if(srcData == NULL || srcData->src_size == 0 || srcData->src_data == NULL || srcData->offset >= srcData->src_size) {
+ return -1;
+ }
+ srcData->offset = (int)p_nb_bytes;
+ if(srcData->offset < 0) {
+ srcData->offset = 0;
+ } else if(srcData->offset > srcData->src_size) {
+ srcData->offset = srcData->src_size;
+ }
+ return OPJ_TRUE;
+}
+opj_stream_t* fx_opj_stream_create_memory_stream (decodeData* data, OPJ_SIZE_T p_size, OPJ_BOOL p_is_read_stream)
+{
+ opj_stream_t* l_stream = 00;
+ if (!data || ! data->src_data || data->src_size <= 0 ) {
+ return NULL;
+ }
+ l_stream = opj_stream_create(p_size, p_is_read_stream);
+ if (! l_stream) {
+ return NULL;
+ }
+ opj_stream_set_user_data_v3(l_stream, data, NULL);
+ opj_stream_set_user_data_length(l_stream, data->src_size);
+ opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_memory);
+ opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_memory);
+ opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_memory);
+ opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_memory);
+ return l_stream;
+}
+static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
+ int *out_r, int *out_g, int *out_b)
+{
+ int r, g, b;
+ cb -= offset;
+ cr -= offset;
+ r = y + (int)(1.402 * (float)cr);
+ if(r < 0) {
+ r = 0;
+ } else if(r > upb) {
+ r = upb;
+ } *out_r = r;
+ g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
+ if(g < 0) {
+ g = 0;
+ } else if(g > upb) {
+ g = upb;
+ } *out_g = g;
+ b = y + (int)(1.772 * (float)cb);
+ if(b < 0) {
+ b = 0;
+ } else if(b > upb) {
+ b = upb;
+ } *out_b = b;
+}
+static void sycc444_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b;
+ const int *y, *cb, *cr;
+ int maxw, maxh, max, i, offset, upb;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < max; ++i) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++cb;
+ ++cr;
+ ++r;
+ ++g;
+ ++b;
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+}
+static void sycc422_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b;
+ const int *y, *cb, *cr;
+ int maxw, maxh, max, offset, upb;
+ int i, j;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < maxh; ++i) {
+ for(j = 0; j < maxw; j += 2) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ ++cb;
+ ++cr;
+ }
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+ img->comps[1].w = maxw;
+ img->comps[1].h = maxh;
+ img->comps[2].w = maxw;
+ img->comps[2].h = maxh;
+ img->comps[1].w = (OPJ_UINT32)maxw;
+ img->comps[1].h = (OPJ_UINT32)maxh;
+ img->comps[2].w = (OPJ_UINT32)maxw;
+ img->comps[2].h = (OPJ_UINT32)maxh;
+ img->comps[1].dx = img->comps[0].dx;
+ img->comps[2].dx = img->comps[0].dx;
+ img->comps[1].dy = img->comps[0].dy;
+ img->comps[2].dy = img->comps[0].dy;
+}
+static void sycc420_to_rgb(opj_image_t *img)
+{
+ int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
+ const int *y, *cb, *cr, *ny;
+ int maxw, maxh, max, offset, upb;
+ int i, j;
+ i = (int)img->comps[0].prec;
+ offset = 1 << (i - 1);
+ upb = (1 << i) - 1;
+ maxw = (int)img->comps[0].w;
+ maxh = (int)img->comps[0].h;
+ max = maxw * maxh;
+ y = img->comps[0].data;
+ cb = img->comps[1].data;
+ cr = img->comps[2].data;
+ d0 = r = FX_Alloc(int, (size_t)max);
+ d1 = g = FX_Alloc(int, (size_t)max);
+ d2 = b = FX_Alloc(int, (size_t)max);
+ for(i = 0; i < maxh; i += 2) {
+ ny = y + maxw;
+ nr = r + maxw;
+ ng = g + maxw;
+ nb = b + maxw;
+ for(j = 0; j < maxw; j += 2) {
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
+ ++y;
+ ++r;
+ ++g;
+ ++b;
+ sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+ ++ny;
+ ++nr;
+ ++ng;
+ ++nb;
+ sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
+ ++ny;
+ ++nr;
+ ++ng;
+ ++nb;
+ ++cb;
+ ++cr;
+ }
+ y += maxw;
+ r += maxw;
+ g += maxw;
+ b += maxw;
+ }
+ FX_Free(img->comps[0].data);
+ img->comps[0].data = d0;
+ FX_Free(img->comps[1].data);
+ img->comps[1].data = d1;
+ FX_Free(img->comps[2].data);
+ img->comps[2].data = d2;
+ img->comps[1].w = maxw;
+ img->comps[1].h = maxh;
+ img->comps[2].w = maxw;
+ img->comps[2].h = maxh;
+ img->comps[1].w = (OPJ_UINT32)maxw;
+ img->comps[1].h = (OPJ_UINT32)maxh;
+ img->comps[2].w = (OPJ_UINT32)maxw;
+ img->comps[2].h = (OPJ_UINT32)maxh;
+ img->comps[1].dx = img->comps[0].dx;
+ img->comps[2].dx = img->comps[0].dx;
+ img->comps[1].dy = img->comps[0].dy;
+ img->comps[2].dy = img->comps[0].dy;
+}
+void color_sycc_to_rgb(opj_image_t *img)
+{
+ if(img->numcomps < 3) {
+ img->color_space = OPJ_CLRSPC_GRAY;
+ return;
+ }
+ if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 2)
+ && (img->comps[2].dx == 2)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 2)
+ && (img->comps[2].dy == 2)) {
+ sycc420_to_rgb(img);
+ } else if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 2)
+ && (img->comps[2].dx == 2)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 1)
+ && (img->comps[2].dy == 1)) {
+ sycc422_to_rgb(img);
+ } else if((img->comps[0].dx == 1)
+ && (img->comps[1].dx == 1)
+ && (img->comps[2].dx == 1)
+ && (img->comps[0].dy == 1)
+ && (img->comps[1].dy == 1)
+ && (img->comps[2].dy == 1)) {
+ sycc444_to_rgb(img);
+ } else {
+ return;
+ }
+ img->color_space = OPJ_CLRSPC_SRGB;
+}
+void color_apply_icc_profile(opj_image_t *image)
+{
+ cmsHPROFILE in_prof, out_prof;
+ cmsHTRANSFORM transform;
+ cmsColorSpaceSignature in_space, out_space;
+ cmsUInt32Number intent, in_type, out_type, nr_samples;
+ int *r, *g, *b;
+ int prec, i, max, max_w, max_h;
+ OPJ_COLOR_SPACE oldspace;
+ in_prof =
+ cmsOpenProfileFromMem(image->icc_profile_buf, image->icc_profile_len);
+ if(in_prof == NULL) {
+ return;
+ }
+ in_space = cmsGetPCS(in_prof);
+ out_space = cmsGetColorSpace(in_prof);
+ intent = cmsGetHeaderRenderingIntent(in_prof);
+ max_w = (int)image->comps[0].w;
+ max_h = (int)image->comps[0].h;
+ prec = (int)image->comps[0].prec;
+ oldspace = image->color_space;
+ if(out_space == cmsSigRgbData) {
+ if( prec <= 8 ) {
+ in_type = TYPE_RGB_8;
+ out_type = TYPE_RGB_8;
+ } else {
+ in_type = TYPE_RGB_16;
+ out_type = TYPE_RGB_16;
+ }
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else if(out_space == cmsSigGrayData) {
+ if( prec <= 8 ) {
+ in_type = TYPE_GRAY_8;
+ out_type = TYPE_RGB_8;
+ } else {
+ in_type = TYPE_GRAY_16;
+ out_type = TYPE_RGB_16;
+ }
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else if(out_space == cmsSigYCbCrData) {
+ in_type = TYPE_YCbCr_16;
+ out_type = TYPE_RGB_16;
+ out_prof = cmsCreate_sRGBProfile();
+ image->color_space = OPJ_CLRSPC_SRGB;
+ } else {
+ return;
+ }
+ transform = cmsCreateTransform(in_prof, in_type,
+ out_prof, out_type, intent, 0);
+ cmsCloseProfile(in_prof);
+ cmsCloseProfile(out_prof);
+ if(transform == NULL) {
+ image->color_space = oldspace;
+ return;
+ }
+ if(image->numcomps > 2) {
+ if( prec <= 8 ) {
+ unsigned char *inbuf, *outbuf, *in, *out;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned char);
+ in = inbuf = FX_Alloc(unsigned char, nr_samples);
+ out = outbuf = FX_Alloc(unsigned char, nr_samples);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned char) * r++;
+ *in++ = (unsigned char) * g++;
+ *in++ = (unsigned char) * b++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ } else {
+ unsigned short *inbuf, *outbuf, *in, *out;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * (cmsUInt32Number)sizeof(unsigned short);
+ in = inbuf = FX_Alloc(unsigned short, nr_samples);
+ out = outbuf = FX_Alloc(unsigned short, nr_samples);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned short) * r++;
+ *in++ = (unsigned short) * g++;
+ *in++ = (unsigned short) * b++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ }
+ } else {
+ unsigned char *in, *inbuf, *out, *outbuf;
+ max = max_w * max_h;
+ nr_samples = (cmsUInt32Number)max * 3 * sizeof(unsigned char);
+ in = inbuf = FX_Alloc(unsigned char, nr_samples);
+ out = outbuf = FX_Alloc(unsigned char, nr_samples);
+ image->comps = (opj_image_comp_t*)
+ realloc(image->comps, (image->numcomps + 2) * sizeof(opj_image_comp_t));
+ if(image->numcomps == 2) {
+ image->comps[3] = image->comps[1];
+ }
+ image->comps[1] = image->comps[0];
+ image->comps[2] = image->comps[0];
+ image->comps[1].data = FX_Alloc(int, (size_t)max);
+ FXSYS_memset8(image->comps[1].data, 0, sizeof(int) * (size_t)max);
+ image->comps[2].data = FX_Alloc(int, (size_t)max);
+ FXSYS_memset8(image->comps[2].data, 0, sizeof(int) * (size_t)max);
+ image->numcomps += 2;
+ r = image->comps[0].data;
+ for(i = 0; i < max; ++i) {
+ *in++ = (unsigned char) * r++;
+ }
+ cmsDoTransform(transform, inbuf, outbuf, (cmsUInt32Number)max);
+ r = image->comps[0].data;
+ g = image->comps[1].data;
+ b = image->comps[2].data;
+ for(i = 0; i < max; ++i) {
+ *r++ = (int) * out++;
+ *g++ = (int) * out++;
+ *b++ = (int) * out++;
+ }
+ FX_Free(inbuf);
+ FX_Free(outbuf);
+ }
+ cmsDeleteTransform(transform);
+}
+void color_apply_conversion(opj_image_t *image)
+{
+ int *row;
+ int enumcs, numcomps;
+ numcomps = image->numcomps;
+ if(numcomps < 3) {
+ return;
+ }
+ row = (int*)image->icc_profile_buf;
+ enumcs = row[0];
+ if(enumcs == 14) {
+ int *L, *a, *b, *red, *green, *blue, *src0, *src1, *src2;
+ double rl, ol, ra, oa, rb, ob, prec0, prec1, prec2;
+ double minL, maxL, mina, maxa, minb, maxb;
+ unsigned int default_type, il;
+ unsigned int i, max, illu;
+ cmsHPROFILE in, out;
+ cmsHTRANSFORM transform;
+ cmsUInt16Number RGB[3];
+ cmsCIELab Lab;
+ illu = 0;
+ il = 0;
+ in = cmsCreateLab4Profile(NULL);
+ out = cmsCreate_sRGBProfile();
+ transform =
+ cmsCreateTransform(in, TYPE_Lab_DBL, out, TYPE_RGB_16,
+ INTENT_PERCEPTUAL, 0);
+ cmsCloseProfile(in);
+ cmsCloseProfile(out);
+ if(transform == NULL) {
+ return;
+ }
+ prec0 = (double)image->comps[0].prec;
+ prec1 = (double)image->comps[1].prec;
+ prec2 = (double)image->comps[2].prec;
+ default_type = row[1];
+ if(default_type == 0x44454600) {
+ rl = 100;
+ ra = 170;
+ rb = 200;
+ ol = 0;
+ oa = pow(2, prec1 - 1);
+ ob = pow(2, prec2 - 2) + pow(2, prec2 - 3);
+ } else {
+ rl = row[2];
+ ra = row[4];
+ rb = row[6];
+ ol = row[3];
+ oa = row[5];
+ ob = row[7];
+ }
+ L = src0 = image->comps[0].data;
+ a = src1 = image->comps[1].data;
+ b = src2 = image->comps[2].data;
+ max = image->comps[0].w * image->comps[0].h;
+ red = FX_Alloc(int, max);
+ image->comps[0].data = red;
+ green = FX_Alloc(int, max);
+ image->comps[1].data = green;
+ blue = FX_Alloc(int, max);
+ image->comps[2].data = blue;
+ minL = -(rl * ol) / (pow(2, prec0) - 1);
+ maxL = minL + rl;
+ mina = -(ra * oa) / (pow(2, prec1) - 1);
+ maxa = mina + ra;
+ minb = -(rb * ob) / (pow(2, prec2) - 1);
+ maxb = minb + rb;
+ for(i = 0; i < max; ++i) {
+ Lab.L = minL + (double)(*L) * (maxL - minL) / (pow(2, prec0) - 1);
+ ++L;
+ Lab.a = mina + (double)(*a) * (maxa - mina) / (pow(2, prec1) - 1);
+ ++a;
+ Lab.b = minb + (double)(*b) * (maxb - minb) / (pow(2, prec2) - 1);
+ ++b;
+ cmsDoTransform(transform, &Lab, RGB, 1);
+ *red++ = RGB[0];
+ *green++ = RGB[1];
+ *blue++ = RGB[2];
+ }
+ cmsDeleteTransform(transform);
+ FX_Free(src0);
+ FX_Free(src1);
+ FX_Free(src2);
+ image->color_space = OPJ_CLRSPC_SRGB;
+ image->comps[0].prec = 16;
+ image->comps[1].prec = 16;
+ image->comps[2].prec = 16;
+ return;
+ }
+}
+class CJPX_Decoder : public CFX_Object
+{
+public:
+ CJPX_Decoder();
+ ~CJPX_Decoder();
+ FX_BOOL Init(const unsigned char* src_data, int src_size);
+ void GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps);
+ FX_BOOL Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets);
+ FX_LPCBYTE m_SrcData;
+ int m_SrcSize;
+ opj_image_t *image;
+ opj_codec_t* l_codec;
+ opj_stream_t *l_stream;
+ FX_BOOL m_useColorSpace;
+};
+CJPX_Decoder::CJPX_Decoder(): image(NULL), l_codec(NULL), l_stream(NULL), m_useColorSpace(FALSE)
+{
+}
+CJPX_Decoder::~CJPX_Decoder()
+{
+ if(l_codec) {
+ opj_destroy_codec(l_codec);
+ }
+ if(l_stream) {
+ opj_stream_destroy(l_stream);
+ }
+ if(image) {
+ opj_image_destroy(image);
+ }
+}
+FX_BOOL CJPX_Decoder::Init(const unsigned char* src_data, int src_size)
+{
+ opj_dparameters_t parameters;
+ try {
+ image = NULL;
+ m_SrcData = src_data;
+ m_SrcSize = src_size;
+ decodeData srcData;
+ srcData.offset = 0;
+ srcData.src_size = src_size;
+ srcData.src_data = src_data;
+ l_stream = fx_opj_stream_create_memory_stream(&srcData, OPJ_J2K_STREAM_CHUNK_SIZE, 1);
+ if (l_stream == NULL) {
+ return FALSE;
+ }
+ opj_set_default_decoder_parameters(&parameters);
+ parameters.decod_format = 0;
+ parameters.cod_format = 3;
+ if(FXSYS_memcmp32(m_SrcData, "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a", 12) == 0) {
+ l_codec = opj_create_decompress(OPJ_CODEC_JP2);
+ parameters.decod_format = 1;
+ } else {
+ l_codec = opj_create_decompress(OPJ_CODEC_J2K);
+ }
+ if(!l_codec) {
+ return FALSE;
+ }
+ opj_set_info_handler(l_codec, fx_info_callback, 00);
+ opj_set_warning_handler(l_codec, fx_warning_callback, 00);
+ opj_set_error_handler(l_codec, fx_error_callback, 00);
+ if ( !opj_setup_decoder(l_codec, &parameters) ) {
+ return FALSE;
+ }
+ if(! opj_read_header(l_stream, l_codec, &image)) {
+ image = NULL;
+ return FALSE;
+ }
+ if(this->m_useColorSpace) {
+ image->useColorSpace = 1;
+ } else {
+ image->useColorSpace = 0;
+ }
+ if (!parameters.nb_tile_to_decode) {
+ if (!opj_set_decode_area(l_codec, image, parameters.DA_x0,
+ parameters.DA_y0, parameters.DA_x1, parameters.DA_y1)) {
+ opj_image_destroy(image);
+ image = NULL;
+ return FALSE;
+ }
+ if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec, l_stream))) {
+ opj_image_destroy(image);
+ image = NULL;
+ return FALSE;
+ }
+ } else {
+ if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {
+ return FALSE;
+ }
+ }
+ opj_stream_destroy(l_stream);
+ l_stream = NULL;
+ if( image->color_space != OPJ_CLRSPC_SYCC
+ && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy
+ && image->comps[1].dx != 1 ) {
+ image->color_space = OPJ_CLRSPC_SYCC;
+ } else if (image->numcomps <= 2) {
+ image->color_space = OPJ_CLRSPC_GRAY;
+ }
+ if(image->color_space == OPJ_CLRSPC_SYCC) {
+ color_sycc_to_rgb(image);
+ }
+ if(image->icc_profile_buf && !image->useColorSpace) {
+ FX_Free(image->icc_profile_buf);
+ image->icc_profile_buf = NULL;
+ image->icc_profile_len = 0;
+ }
+ if(!image) {
+ return FALSE;
+ }
+ } catch (...) {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CJPX_Decoder::GetInfo(FX_DWORD& width, FX_DWORD& height, FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
+{
+ width = (FX_DWORD)image->x1;
+ height = (FX_DWORD)image->y1;
+ output_nComps = codestream_nComps = (FX_DWORD)image->numcomps;
+}
+FX_BOOL CJPX_Decoder::Decode(FX_LPBYTE dest_buf, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
+{
+ FX_BYTE** channel_bufs;
+ int* adjust_comps;
+ int i, wid, hei, row, col, channel, src;
+ FX_BOOL flag;
+ FX_LPBYTE pChannel, pScanline, pPixel;
+ try {
+ if(image->comps[0].w != image->x1 || image->comps[0].h != image->y1) {
+ return FALSE;
+ }
+ if(pitch < (int)(image->comps[0].w * 8 * image->numcomps + 31) >> 5 << 2) {
+ return FALSE;
+ }
+ FXSYS_memset8(dest_buf, 0xff, image->y1 * pitch);
+ channel_bufs = FX_Alloc(FX_BYTE*, image->numcomps);
+ if (channel_bufs == NULL) {
+ return FALSE;
+ }
+ adjust_comps = FX_Alloc(int, image->numcomps);
+ if (adjust_comps == NULL) {
+ FX_Free(channel_bufs);
+ return FALSE;
+ }
+ flag = TRUE;
+ for (i = 0; i < (int)image->numcomps; i ++) {
+ channel_bufs[i] = dest_buf + offsets[i];
+ adjust_comps[i] = image->comps[i].prec - 8;
+ if(i > 0) {
+ if(image->comps[i].dx != image->comps[i - 1].dx
+ || image->comps[i].dy != image->comps[i - 1].dy
+ || image->comps[i].prec != image->comps[i - 1].prec) {
+ flag = FALSE;
+ goto failed;
+ }
+ }
+ }
+ wid = image->comps[0].w;
+ hei = image->comps[0].h;
+ for (channel = 0; channel < (int)image->numcomps; channel++) {
+ pChannel = channel_bufs[channel];
+ if(adjust_comps[channel] < 0) {
+ for(row = 0; row < hei; row++) {
+ pScanline = pChannel + row * pitch;
+ for (col = 0; col < wid; col++) {
+ pPixel = pScanline + col * image->numcomps;
+ src = image->comps[channel].data[row * wid + col];
+ src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
+ if (adjust_comps[channel] > 0) {
+ *pPixel = 0;
+ } else {
+ *pPixel = (FX_BYTE)(src << -adjust_comps[channel]);
+ }
+ }
+ }
+ } else {
+ for(row = 0; row < hei; row++) {
+ pScanline = pChannel + row * pitch;
+ for (col = 0; col < wid; col++) {
+ pPixel = pScanline + col * image->numcomps;
+ if (!image->comps[channel].data) continue;
+ src = image->comps[channel].data[row * wid + col];
+ src += image->comps[channel].sgnd ? 1 << (image->comps[channel].prec - 1) : 0;
+ if (adjust_comps[channel] - 1 < 0) {
+ *pPixel = (FX_BYTE)((src >> adjust_comps[channel]));
+ } else {
+ int tmpPixel = (src >> adjust_comps[channel]) + ((src >> (adjust_comps[channel] - 1)) % 2);
+ if (tmpPixel > 255) {
+ tmpPixel = 255;
+ } else if (tmpPixel < 0) {
+ tmpPixel = 0;
+ }
+ *pPixel = (FX_BYTE)tmpPixel;
+ }
+ }
+ }
+ }
+ }
+ } catch (...) {
+ if (channel_bufs) {
+ FX_Free(channel_bufs);
+ }
+ FX_Free(adjust_comps);
+ return FALSE;
+ }
+ FX_Free(channel_bufs);
+ FX_Free(adjust_comps);
+ return TRUE;
+failed:
+ FX_Free(channel_bufs);
+ FX_Free(adjust_comps);
+ return FALSE;
+}
+void initialize_transition_table();
+void initialize_significance_luts();
+void initialize_sign_lut();
+CCodec_JpxModule::CCodec_JpxModule()
+{
+}
+void* CCodec_JpxModule::CreateDecoder(FX_LPCBYTE src_buf, FX_DWORD src_size , FX_BOOL useColorSpace)
+{
+ CJPX_Decoder* pDecoder = FX_NEW CJPX_Decoder;
+ if (pDecoder == NULL) {
+ return NULL;
+ }
+ pDecoder->m_useColorSpace = useColorSpace;
+ if (!pDecoder->Init(src_buf, src_size)) {
+ delete pDecoder;
+ return NULL;
+ }
+ return pDecoder;
+}
+void CCodec_JpxModule::GetImageInfo(FX_LPVOID ctx, FX_DWORD& width, FX_DWORD& height,
+ FX_DWORD& codestream_nComps, FX_DWORD& output_nComps)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ pDecoder->GetInfo(width, height, codestream_nComps, output_nComps);
+}
+FX_BOOL CCodec_JpxModule::Decode(void* ctx, FX_LPBYTE dest_data, int pitch, FX_BOOL bTranslateColor, FX_LPBYTE offsets)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ return pDecoder->Decode(dest_data, pitch, bTranslateColor, offsets);
+}
+void CCodec_JpxModule::DestroyDecoder(void* ctx)
+{
+ CJPX_Decoder* pDecoder = (CJPX_Decoder*)ctx;
+ delete pDecoder;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h b/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h
new file mode 100644
index 0000000000..da480f22a0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h
@@ -0,0 +1,13 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_OPENJPEG_H_
+#define _FX_OPENJPEG_H_
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/openjpeg.h"
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt
new file mode 100644
index 0000000000..5c87f29771
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/CMakeLists.txt
@@ -0,0 +1,98 @@
+include_regular_expression("^.*$")
+
+#
+install( FILES ${CMAKE_CURRENT_BINARY_DIR}/opj_config.h
+ DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers)
+
+include_directories(
+ ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h and opj_config_private.h
+)
+# Defines the source code for the library
+set(OPENJPEG_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/bio.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cio.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/dwt.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/event.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/image.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/invert.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/j2k.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/jp2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mct.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mqc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/openjpeg.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/opj_clock.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/pi.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/raw.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/t1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/t2.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/tcd.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/tgt.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/function_list.c
+)
+if(BUILD_JPIP)
+ add_definitions(-DUSE_JPIP)
+ set(OPENJPEG_SRCS
+ ${OPENJPEG_SRCS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/cidx_manager.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/phix_manager.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/ppix_manager.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/thix_manager.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/tpix_manager.c
+ )
+endif()
+
+# Build the library
+if(WIN32)
+ if(BUILD_SHARED_LIBS)
+ add_definitions(-DOPJ_EXPORTS)
+ else()
+ add_definitions(-DOPJ_STATIC)
+ endif()
+endif()
+add_library(${OPENJPEG_LIBRARY_NAME} ${OPENJPEG_SRCS})
+if(UNIX)
+ target_link_libraries(${OPENJPEG_LIBRARY_NAME} m)
+endif()
+set_target_properties(${OPENJPEG_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
+
+# Install library
+install(TARGETS ${OPENJPEG_LIBRARY_NAME}
+ EXPORT OpenJPEGTargets
+ RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
+ LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
+ ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
+)
+
+# Install includes files
+install(FILES openjpeg.h opj_stdint.h
+ DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR} COMPONENT Headers
+)
+
+# install man page of the library
+install(
+ FILES ${OPENJPEG_SOURCE_DIR}/doc/man/man3/libopenjp2.3
+ DESTINATION ${OPENJPEG_INSTALL_MAN_DIR}/man3)
+
+# internal utilities to generate t1_luts.h (part of the jp2 lib)
+# no need to install:
+add_executable(t1_generate_luts t1_generate_luts.c)
+if(UNIX)
+ target_link_libraries(t1_generate_luts m)
+endif()
+
+# Experimental option; let's how cppcheck performs
+# Implementation details:
+# I could not figure out how to easily upload a file to CDash. Instead simply
+# pretend cppcheck is part of the Build step. Technically cppcheck can even
+# output gcc formatted error/warning report
+# Another implementation detail: I could not redirect error to the error
+# catching mechanism something is busted in cmake 2.8.5, I had to use the
+# warning regex to catch them.
+if(OPENJPEG_CPPCHECK)
+ find_package(CPPCHECK REQUIRED)
+ foreach(f ${OPENJPEG_SRCS})
+ # cppcheck complains about too many configuration, pretend to be WIN32:
+ add_custom_command(TARGET ${OPENJPEG_LIBRARY_NAME}
+ COMMAND ${CPPCHECK_EXECUTABLE} -DWIN32 ${f})
+ endforeach()
+endif()
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c
new file mode 100644
index 0000000000..5d49580178
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.c
@@ -0,0 +1,194 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Write a bit
+@param bio BIO handle
+@param b Bit to write (0 or 1)
+*/
+static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b);
+/**
+Read a bit
+@param bio BIO handle
+@return Returns the read bit
+*/
+static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio);
+/**
+Write a byte
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio);
+/**
+Read a byte
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio);
+
+/*@}*/
+
+/*@}*/
+
+/*
+==========================================================
+ local functions
+==========================================================
+*/
+
+OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) {
+ bio->buf = (bio->buf << 8) & 0xffff;
+ bio->ct = bio->buf == 0xff00 ? 7 : 8;
+ if (bio->bp >= bio->end) {
+ return OPJ_FALSE;
+ }
+ *bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) {
+ bio->buf = (bio->buf << 8) & 0xffff;
+ bio->ct = bio->buf == 0xff00 ? 7 : 8;
+ if (bio->bp >= bio->end) {
+ return OPJ_FALSE;
+ }
+ bio->buf |= *bio->bp++;
+ return OPJ_TRUE;
+}
+
+void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) {
+ if (bio->ct == 0) {
+ opj_bio_byteout(bio); /* MSD: why not check the return value of this function ? */
+ }
+ bio->ct--;
+ bio->buf |= b << bio->ct;
+}
+
+OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) {
+ if (bio->ct == 0) {
+ opj_bio_bytein(bio); /* MSD: why not check the return value of this function ? */
+ }
+ bio->ct--;
+ return (bio->buf >> bio->ct) & 1;
+}
+
+/*
+==========================================================
+ Bit Input/Output interface
+==========================================================
+*/
+
+opj_bio_t* opj_bio_create(void) {
+ opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
+ return bio;
+}
+
+void opj_bio_destroy(opj_bio_t *bio) {
+ if(bio) {
+ opj_free(bio);
+ }
+}
+
+ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) {
+ return (bio->bp - bio->start);
+}
+
+void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
+ bio->start = bp;
+ bio->end = bp + len;
+ bio->bp = bp;
+ bio->buf = 0;
+ bio->ct = 8;
+}
+
+void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
+ bio->start = bp;
+ bio->end = bp + len;
+ bio->bp = bp;
+ bio->buf = 0;
+ bio->ct = 0;
+}
+
+void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) {
+ OPJ_UINT32 i;
+ for (i = n - 1; i < n; i--) {
+ opj_bio_putbit(bio, (v >> i) & 1);
+ }
+}
+
+OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) {
+ OPJ_UINT32 i;
+ OPJ_UINT32 v;
+ v = 0;
+ for (i = n - 1; i < n; i--) {
+ v += opj_bio_getbit(bio) << i;
+ }
+ return v;
+}
+
+OPJ_BOOL opj_bio_flush(opj_bio_t *bio) {
+ bio->ct = 0;
+ if (! opj_bio_byteout(bio)) {
+ return OPJ_FALSE;
+ }
+ if (bio->ct == 7) {
+ bio->ct = 0;
+ if (! opj_bio_byteout(bio)) {
+ return OPJ_FALSE;
+ }
+ }
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) {
+ bio->ct = 0;
+ if ((bio->buf & 0xff) == 0xff) {
+ if (! opj_bio_bytein(bio)) {
+ return OPJ_FALSE;
+ }
+ bio->ct = 0;
+ }
+ return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h
new file mode 100644
index 0000000000..fba2428476
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/bio.h
@@ -0,0 +1,134 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __BIO_H
+#define __BIO_H
+
+#include <stddef.h> /* ptrdiff_t */
+
+/**
+@file bio.h
+@brief Implementation of an individual bit input-output (BIO)
+
+The functions in BIO.C have for goal to realize an individual bit input - output.
+*/
+
+/** @defgroup BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/**
+Individual bit input-output stream (BIO)
+*/
+typedef struct opj_bio {
+ /** pointer to the start of the buffer */
+ OPJ_BYTE *start;
+ /** pointer to the end of the buffer */
+ OPJ_BYTE *end;
+ /** pointer to the present position in the buffer */
+ OPJ_BYTE *bp;
+ /** temporary place where each byte is read or written */
+ OPJ_UINT32 buf;
+ /** coder : number of bits free to write. decoder : number of bits read */
+ OPJ_UINT32 ct;
+} opj_bio_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new BIO handle
+@return Returns a new BIO handle if successful, returns NULL otherwise
+*/
+opj_bio_t* opj_bio_create(void);
+/**
+Destroy a previously created BIO handle
+@param bio BIO handle to destroy
+*/
+void opj_bio_destroy(opj_bio_t *bio);
+/**
+Number of bytes written.
+@param bio BIO handle
+@return Returns the number of bytes written
+*/
+ptrdiff_t opj_bio_numbytes(opj_bio_t *bio);
+/**
+Init encoder
+@param bio BIO handle
+@param bp Output buffer
+@param len Output buffer length
+*/
+void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Init decoder
+@param bio BIO handle
+@param bp Input buffer
+@param len Input buffer length
+*/
+void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Write bits
+@param bio BIO handle
+@param v Value of bits
+@param n Number of bits to write
+*/
+void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n);
+/**
+Read bits
+@param bio BIO handle
+@param n Number of bits to read
+@return Returns the corresponding read number
+*/
+OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n);
+/**
+Flush bits
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+OPJ_BOOL opj_bio_flush(opj_bio_t *bio);
+/**
+Passes the ending bits (coming from flushing)
+@param bio BIO handle
+@return Returns OPJ_TRUE if successful, returns OPJ_FALSE otherwise
+*/
+OPJ_BOOL opj_bio_inalign(opj_bio_t *bio);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __BIO_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c
new file mode 100644
index 0000000000..6cba658a98
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.c
@@ -0,0 +1,658 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+
+void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes;
+
+ assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+ memcpy(p_buffer,l_data_ptr,p_nb_bytes);
+}
+
+void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;
+ OPJ_UINT32 i;
+
+ assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+ for (i=0;i<p_nb_bytes;++i) {
+ *(p_buffer++) = *(l_data_ptr--);
+ }
+}
+
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+
+ assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+ *p_value = 0;
+ memcpy(l_data_ptr+4-p_nb_bytes,p_buffer,p_nb_bytes);
+}
+
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes-1;
+ OPJ_UINT32 i;
+
+ assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+
+ *p_value = 0;
+ for (i=0;i<p_nb_bytes;++i) {
+ *(l_data_ptr--) = *(p_buffer++);
+ }
+}
+
+void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+ memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT64));
+}
+
+void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT64) - 1;
+ OPJ_UINT32 i;
+ for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
+ *(p_buffer++) = *(l_data_ptr--);
+ }
+}
+
+void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+ memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT64));
+}
+
+void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64)-1;
+ OPJ_UINT32 i;
+ for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
+ *(l_data_ptr--) = *(p_buffer++);
+ }
+}
+
+void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+ memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT32));
+}
+
+void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
+{
+ const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT32) - 1;
+ OPJ_UINT32 i;
+ for (i=0;i<sizeof(OPJ_FLOAT32);++i) {
+ *(p_buffer++) = *(l_data_ptr--);
+ }
+}
+
+void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+ memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT32));
+}
+
+void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
+{
+ OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32)-1;
+ OPJ_UINT32 i;
+ for (i=0;i<sizeof(OPJ_FLOAT32);++i) {
+ *(l_data_ptr--) = *(p_buffer++);
+ }
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,OPJ_BOOL l_is_input)
+{
+ opj_stream_private_t * l_stream = 00;
+ l_stream = (opj_stream_private_t*) opj_malloc(sizeof(opj_stream_private_t));
+ if (! l_stream) {
+ return 00;
+ }
+
+ memset(l_stream,0,sizeof(opj_stream_private_t));
+ l_stream->m_buffer_size = p_buffer_size;
+ l_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);
+ if (! l_stream->m_stored_data) {
+ opj_free(l_stream);
+ return 00;
+ }
+
+ l_stream->m_current_data = l_stream->m_stored_data;
+
+ if (l_is_input) {
+ l_stream->m_status |= opj_stream_e_input;
+ l_stream->m_opj_skip = opj_stream_read_skip;
+ l_stream->m_opj_seek = opj_stream_read_seek;
+ }
+ else {
+ l_stream->m_status |= opj_stream_e_output;
+ l_stream->m_opj_skip = opj_stream_write_skip;
+ l_stream->m_opj_seek = opj_stream_write_seek;
+ }
+
+ l_stream->m_read_fn = opj_stream_default_read;
+ l_stream->m_write_fn = opj_stream_default_write;
+ l_stream->m_skip_fn = opj_stream_default_skip;
+ l_stream->m_seek_fn = opj_stream_default_seek;
+
+ return (opj_stream_t *) l_stream;
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL l_is_input)
+{
+ return opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,l_is_input);
+}
+
+void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if (l_stream) {
+ if (l_stream->m_free_user_data_fn) {
+ l_stream->m_free_user_data_fn(l_stream->m_user_data);
+ }
+ opj_free(l_stream->m_stored_data);
+ l_stream->m_stored_data = 00;
+ opj_free(l_stream);
+ }
+}
+
+void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream)
+{
+ opj_stream_destroy(p_stream);
+}
+
+void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if ((!l_stream) || (! (l_stream->m_status & opj_stream_e_input))) {
+ return;
+ }
+
+ l_stream->m_read_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if (!l_stream) {
+ return;
+ }
+ l_stream->m_seek_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if ((!l_stream )|| (! (l_stream->m_status & opj_stream_e_output))) {
+ return;
+ }
+
+ l_stream->m_write_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if (! l_stream) {
+ return;
+ }
+
+ l_stream->m_skip_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream, void * p_data)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+ if (!l_stream)
+ return;
+ l_stream->m_user_data = p_data;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data_v3(opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+ if (!l_stream)
+ return;
+ l_stream->m_user_data = p_data;
+ l_stream->m_free_user_data_fn = p_function;
+}
+
+void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length)
+{
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+ if (!l_stream)
+ return;
+ l_stream->m_user_data_length = data_length;
+}
+
+OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ OPJ_SIZE_T l_read_nb_bytes = 0;
+ if (p_stream->m_bytes_in_buffer >= p_size) {
+ memcpy(p_buffer,p_stream->m_current_data,p_size);
+ p_stream->m_current_data += p_size;
+ p_stream->m_bytes_in_buffer -= p_size;
+ l_read_nb_bytes += p_size;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+ return l_read_nb_bytes;
+ }
+
+ /* we are now in the case when the remaining data if not sufficient */
+ if (p_stream->m_status & opj_stream_e_end) {
+ l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+ memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+ p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+ }
+
+ /* the flag is not set, we copy data and then do an actual read on the stream */
+ if (p_stream->m_bytes_in_buffer) {
+ l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+ memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_buffer += p_stream->m_bytes_in_buffer;
+ p_size -= p_stream->m_bytes_in_buffer;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ }
+ else {
+ /* case where we are already at the end of the buffer
+ so reset the m_current_data to point to the start of the
+ stored buffer to get ready to read from disk*/
+ p_stream->m_current_data = p_stream->m_stored_data;
+ }
+
+ while(1){
+ /* we should read less than a chunk -> read a chunk */
+ if (p_size < p_stream->m_buffer_size) {
+ /* we should do an actual read on the media */
+ p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,p_stream->m_buffer_size,p_stream->m_user_data);
+
+ if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
+ /* end of stream */
+ opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+ p_stream->m_bytes_in_buffer = 0;
+ p_stream->m_status |= opj_stream_e_end;
+ /* end of stream */
+ return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+ }
+ else if (p_stream->m_bytes_in_buffer < p_size) {
+ /* not enough data */
+ l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+ memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_buffer += p_stream->m_bytes_in_buffer;
+ p_size -= p_stream->m_bytes_in_buffer;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ }
+ else {
+ l_read_nb_bytes += p_size;
+ memcpy(p_buffer,p_stream->m_current_data,p_size);
+ p_stream->m_current_data += p_size;
+ p_stream->m_bytes_in_buffer -= p_size;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+ return l_read_nb_bytes;
+ }
+ }
+ else {
+ /* direct read on the dest buffer */
+ p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer,p_size,p_stream->m_user_data);
+
+ if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
+ /* end of stream */
+ opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+ p_stream->m_bytes_in_buffer = 0;
+ p_stream->m_status |= opj_stream_e_end;
+ /* end of stream */
+ return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
+ }
+ else if (p_stream->m_bytes_in_buffer < p_size) {
+ /* not enough data */
+ l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_buffer += p_stream->m_bytes_in_buffer;
+ p_size -= p_stream->m_bytes_in_buffer;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ }
+ else {
+ /* we have read the exact size */
+ l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_stream->m_bytes_in_buffer = 0;
+ return l_read_nb_bytes;
+ }
+ }
+ }
+}
+
+OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,
+ const OPJ_BYTE * p_buffer,
+ OPJ_SIZE_T p_size,
+ opj_event_mgr_t * p_event_mgr)
+{
+ OPJ_SIZE_T l_remaining_bytes = 0;
+ OPJ_SIZE_T l_write_nb_bytes = 0;
+
+ if (p_stream->m_status & opj_stream_e_error) {
+ return (OPJ_SIZE_T)-1;
+ }
+
+ while(1) {
+ l_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;
+
+ /* we have more memory than required */
+ if (l_remaining_bytes >= p_size) {
+ memcpy(p_stream->m_current_data, p_buffer, p_size);
+
+ p_stream->m_current_data += p_size;
+ p_stream->m_bytes_in_buffer += p_size;
+ l_write_nb_bytes += p_size;
+ p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+
+ return l_write_nb_bytes;
+ }
+
+ /* we copy data and then do an actual read on the stream */
+ if (l_remaining_bytes) {
+ l_write_nb_bytes += l_remaining_bytes;
+
+ memcpy(p_stream->m_current_data,p_buffer,l_remaining_bytes);
+
+ p_stream->m_current_data = p_stream->m_stored_data;
+
+ p_buffer += l_remaining_bytes;
+ p_size -= l_remaining_bytes;
+ p_stream->m_bytes_in_buffer += l_remaining_bytes;
+ p_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;
+ }
+
+ if (! opj_stream_flush(p_stream, p_event_mgr)) {
+ return (OPJ_SIZE_T)-1;
+ }
+ }
+
+}
+
+OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, opj_event_mgr_t * p_event_mgr)
+{
+ /* the number of bytes written on the media. */
+ OPJ_SIZE_T l_current_write_nb_bytes = 0;
+
+ p_stream->m_current_data = p_stream->m_stored_data;
+
+ while (p_stream->m_bytes_in_buffer) {
+ /* we should do an actual write on the media */
+ l_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,
+ p_stream->m_bytes_in_buffer,
+ p_stream->m_user_data);
+
+ if (l_current_write_nb_bytes == (OPJ_SIZE_T)-1) {
+ p_stream->m_status |= opj_stream_e_error;
+ opj_event_msg(p_event_mgr, EVT_INFO, "Error on writing stream!\n");
+
+ return OPJ_FALSE;
+ }
+
+ p_stream->m_current_data += l_current_write_nb_bytes;
+ p_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;
+ }
+
+ p_stream->m_current_data = p_stream->m_stored_data;
+
+ return OPJ_TRUE;
+}
+
+OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ OPJ_OFF_T l_skip_nb_bytes = 0;
+ OPJ_OFF_T l_current_skip_nb_bytes = 0;
+
+ assert( p_size >= 0 );
+
+ if (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {
+ p_stream->m_current_data += p_size;
+ /* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer
+ which is of type OPJ_SIZE_T */
+ p_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;
+ l_skip_nb_bytes += p_size;
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+ return l_skip_nb_bytes;
+ }
+
+ /* we are now in the case when the remaining data if not sufficient */
+ if (p_stream->m_status & opj_stream_e_end) {
+ l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+ return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
+ }
+
+ /* the flag is not set, we copy data and then do an actual skip on the stream */
+ if (p_stream->m_bytes_in_buffer) {
+ l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+ p_stream->m_bytes_in_buffer = 0;
+ }
+
+ while (p_size > 0) {
+ /* we should do an actual skip on the media */
+ l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
+ if (l_current_skip_nb_bytes == (OPJ_OFF_T) -1) {
+ opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+ p_stream->m_status |= opj_stream_e_end;
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+ /* end if stream */
+ return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
+ }
+ p_size -= l_current_skip_nb_bytes;
+ l_skip_nb_bytes += l_current_skip_nb_bytes;
+ }
+
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+
+ return l_skip_nb_bytes;
+}
+
+OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ OPJ_BOOL l_is_written = 0;
+ OPJ_OFF_T l_current_skip_nb_bytes = 0;
+ OPJ_OFF_T l_skip_nb_bytes = 0;
+
+ if (p_stream->m_status & opj_stream_e_error) {
+ return (OPJ_OFF_T) -1;
+ }
+
+ /* we should flush data */
+ l_is_written = opj_stream_flush (p_stream, p_event_mgr);
+ if (! l_is_written) {
+ p_stream->m_status |= opj_stream_e_error;
+ p_stream->m_bytes_in_buffer = 0;
+ return (OPJ_OFF_T) -1;
+ }
+ /* then skip */
+
+ while (p_size > 0) {
+ /* we should do an actual skip on the media */
+ l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
+
+ if (l_current_skip_nb_bytes == (OPJ_OFF_T)-1) {
+ opj_event_msg(p_event_mgr, EVT_INFO, "Stream error!\n");
+
+ p_stream->m_status |= opj_stream_e_error;
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+ /* end if stream */
+ return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T)-1;
+ }
+ p_size -= l_current_skip_nb_bytes;
+ l_skip_nb_bytes += l_current_skip_nb_bytes;
+ }
+
+ p_stream->m_byte_offset += l_skip_nb_bytes;
+
+ return l_skip_nb_bytes;
+}
+
+OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream)
+{
+ return p_stream->m_byte_offset;
+}
+
+OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream)
+{
+ assert( p_stream->m_byte_offset >= 0 );
+ assert( p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);
+ return p_stream->m_user_data_length ?
+ (OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :
+ 0;
+}
+
+OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ assert(p_size >= 0);
+ return p_stream->m_opj_skip(p_stream,p_size,p_event_mgr);
+}
+
+OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ OPJ_ARG_NOT_USED(p_event_mgr);
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_stream->m_bytes_in_buffer = 0;
+
+ if( !(p_stream->m_seek_fn(p_size,p_stream->m_user_data)) ) {
+ p_stream->m_status |= opj_stream_e_end;
+ return OPJ_FALSE;
+ }
+ else {
+ /* reset stream status */
+ p_stream->m_status &= (~opj_stream_e_end);
+ p_stream->m_byte_offset = p_size;
+
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+{
+ if (! opj_stream_flush(p_stream,p_event_mgr)) {
+ p_stream->m_status |= opj_stream_e_error;
+ return OPJ_FALSE;
+ }
+
+ p_stream->m_current_data = p_stream->m_stored_data;
+ p_stream->m_bytes_in_buffer = 0;
+
+ if (! p_stream->m_seek_fn(p_size,p_stream->m_user_data)) {
+ p_stream->m_status |= opj_stream_e_error;
+ return OPJ_FALSE;
+ }
+ else {
+ p_stream->m_byte_offset = p_size;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr)
+{
+ assert(p_size >= 0);
+ return p_stream->m_opj_seek(p_stream,p_size,p_event_mgr);
+}
+
+OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream)
+{
+ return p_stream->m_seek_fn != opj_stream_default_seek;
+}
+
+OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+{
+ OPJ_ARG_NOT_USED(p_buffer);
+ OPJ_ARG_NOT_USED(p_nb_bytes);
+ OPJ_ARG_NOT_USED(p_user_data);
+ return (OPJ_SIZE_T) -1;
+}
+
+OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+{
+ OPJ_ARG_NOT_USED(p_buffer);
+ OPJ_ARG_NOT_USED(p_nb_bytes);
+ OPJ_ARG_NOT_USED(p_user_data);
+ return (OPJ_SIZE_T) -1;
+}
+
+OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+{
+ OPJ_ARG_NOT_USED(p_nb_bytes);
+ OPJ_ARG_NOT_USED(p_user_data);
+ return (OPJ_OFF_T) -1;
+}
+
+OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+{
+ OPJ_ARG_NOT_USED(p_nb_bytes);
+ OPJ_ARG_NOT_USED(p_user_data);
+ return OPJ_FALSE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h
new file mode 100644
index 0000000000..729d073ac2
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/cio.h
@@ -0,0 +1,399 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __CIO_H
+#define __CIO_H
+/**
+@file cio.h
+@brief Implementation of a byte input-output process (CIO)
+
+The functions in CIO.C have for goal to realize a byte input / output process.
+*/
+
+/** @defgroup CIO CIO - byte input-output stream */
+/*@{*/
+
+#include "opj_config.h"
+
+/* ----------------------------------------------------------------------- */
+
+#if defined(OPJ_BIG_ENDIAN)
+ #define opj_write_bytes opj_write_bytes_BE
+ #define opj_read_bytes opj_read_bytes_BE
+ #define opj_write_double opj_write_double_BE
+ #define opj_read_double opj_read_double_BE
+ #define opj_write_float opj_write_float_BE
+ #define opj_read_float opj_read_float_BE
+#else
+ #define opj_write_bytes opj_write_bytes_LE
+ #define opj_read_bytes opj_read_bytes_LE
+ #define opj_write_double opj_write_double_LE
+ #define opj_read_double opj_read_double_LE
+ #define opj_write_float opj_write_float_LE
+ #define opj_read_float opj_read_float_LE
+#endif
+
+
+
+typedef enum
+{
+ opj_signed_sentinel = -1, /* do not use in code */
+ opj_stream_e_output = 0x1,
+ opj_stream_e_input = 0x2,
+ opj_stream_e_end = 0x4,
+ opj_stream_e_error = 0x8
+}
+opj_stream_flag ;
+
+/**
+Byte input-output stream.
+*/
+typedef struct opj_stream_private
+{
+ /**
+ * User data, be it files, ... The actual data depends on the type of the stream.
+ */
+ void * m_user_data;
+
+ /**
+ * Pointer to function to free m_user_data (NULL at initialization)
+ * when destroying the stream. If pointer is NULL the function is not
+ * called and the m_user_data is not freed (even if non-NULL).
+ */
+ opj_stream_free_user_data_fn m_free_user_data_fn;
+
+ /**
+ * User data length
+ */
+ OPJ_UINT64 m_user_data_length;
+
+ /**
+ * Pointer to actual read function (NULL at the initialization of the cio.
+ */
+ opj_stream_read_fn m_read_fn;
+
+ /**
+ * Pointer to actual write function (NULL at the initialization of the cio.
+ */
+ opj_stream_write_fn m_write_fn;
+
+ /**
+ * Pointer to actual skip function (NULL at the initialization of the cio.
+ * There is no seek function to prevent from back and forth slow procedures.
+ */
+ opj_stream_skip_fn m_skip_fn;
+
+ /**
+ * Pointer to actual seek function (if available).
+ */
+ opj_stream_seek_fn m_seek_fn;
+
+ /**
+ * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.
+ * you should never access this data directly.
+ */
+ OPJ_BYTE * m_stored_data;
+
+ /**
+ * Pointer to the current read data.
+ */
+ OPJ_BYTE * m_current_data;
+
+ /**
+ * FIXME DOC.
+ */
+ OPJ_OFF_T (* m_opj_skip)(struct opj_stream_private * ,OPJ_OFF_T , struct opj_event_mgr *);
+
+ /**
+ * FIXME DOC.
+ */
+ OPJ_BOOL (* m_opj_seek) (struct opj_stream_private * , OPJ_OFF_T , struct opj_event_mgr *);
+
+ /**
+ * number of bytes containing in the buffer.
+ */
+ OPJ_SIZE_T m_bytes_in_buffer;
+
+ /**
+ * The number of bytes read/written from the beginning of the stream
+ */
+ OPJ_OFF_T m_byte_offset;
+
+ /**
+ * The size of the buffer.
+ */
+ OPJ_SIZE_T m_buffer_size;
+
+ /**
+ * Flags to tell the status of the stream.
+ */
+ opj_stream_flag m_status;
+
+}
+opj_stream_private_t;
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ * @param p_nb_bytes the number of bytes to write
+*/
+void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ * @param p_nb_bytes the nb bytes to read.
+ * @return the number of bytes read or -1 if an error occured.
+ */
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ * @param p_nb_bytes the number of bytes to write
+ * @return the number of bytes written or -1 if an error occured
+*/
+void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ * @param p_nb_bytes the nb bytes to read.
+ * @return the number of bytes read or -1 if an error occured.
+ */
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ */
+void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
+
+/***
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ */
+void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ */
+void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ */
+void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ */
+void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
+
+/**
+ * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to read data from.
+ * @param p_value pointer to the value that will store the data.
+ */
+void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
+
+/**
+ * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ */
+void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
+
+/***
+ * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
+ * @param p_buffer pointer the data buffer to write data to.
+ * @param p_value the value to write
+ */
+void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
+
+/**
+ * Reads some bytes from the stream.
+ * @param p_stream the stream to read data from.
+ * @param p_buffer pointer to the data buffer that will receive the data.
+ * @param p_size number of bytes to read.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes read, or -1 if an error occured or if the stream is at the end.
+ */
+OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Writes some bytes to the stream.
+ * @param p_stream the stream to write data to.
+ * @param p_buffer pointer to the data buffer holds the data to be writtent.
+ * @param p_size number of bytes to write.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes writtent, or -1 if an error occured.
+ */
+OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Writes the content of the stream buffer to the stream.
+ * @param p_stream the stream to write data to.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return true if the data could be flushed, false else.
+ */
+OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream,OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Tells the byte offset on the stream (similar to ftell).
+ *
+ * @param p_stream the stream to get the information from.
+ *
+ * @return the current position o fthe stream.
+ */
+OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream);
+
+
+/**
+ * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft).
+ *
+ * @param p_stream the stream to get the information from.
+ *
+ * @return Number of bytes left before the end of the stream.
+ */
+OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return OPJ_TRUE if success, or OPJ_FALSE if an error occured.
+ */
+OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Skips a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return the number of bytes skipped, or -1 if an error occured.
+ */
+OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Seeks a number of bytes from the stream.
+ * @param p_stream the stream to skip data from.
+ * @param p_size the number of bytes to skip.
+ * @param p_event_mgr the user event manager to be notified of special events.
+ * @return true if the stream is seekable.
+ */
+OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+
+/**
+ * Tells if the given stream is seekable.
+ */
+OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+
+/**
+ * FIXME DOC.
+ */
+OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+
+#endif /* __CIO_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c
new file mode 100644
index 0000000000..e1f8a337d4
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.c
@@ -0,0 +1,925 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
+#include "opj_includes.h"
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+#define OPJ_WS(i) v->mem[(i)*2]
+#define OPJ_WD(i) v->mem[(1+(i)*2)]
+
+/** @name Local data structures */
+/*@{*/
+
+typedef struct dwt_local {
+ OPJ_INT32* mem;
+ OPJ_INT32 dn;
+ OPJ_INT32 sn;
+ OPJ_INT32 cas;
+} opj_dwt_t;
+
+typedef union {
+ OPJ_FLOAT32 f[4];
+} opj_v4_t;
+
+typedef struct v4dwt_local {
+ opj_v4_t* wavelet ;
+ OPJ_INT32 dn ;
+ OPJ_INT32 sn ;
+ OPJ_INT32 cas ;
+} opj_v4dwt_t ;
+
+static const OPJ_FLOAT32 opj_dwt_alpha = 1.586134342f; /* 12994 */
+static const OPJ_FLOAT32 opj_dwt_beta = 0.052980118f; /* 434 */
+static const OPJ_FLOAT32 opj_dwt_gamma = -0.882911075f; /* -7233 */
+static const OPJ_FLOAT32 opj_dwt_delta = -0.443506852f; /* -3633 */
+
+static const OPJ_FLOAT32 opj_K = 1.230174105f; /* 10078 */
+static const OPJ_FLOAT32 opj_c13318 = 1.625732422f;
+
+/*@}*/
+
+/**
+Virtual function type for wavelet transform in 1-D
+*/
+typedef void (*DWT1DFN)(opj_dwt_t* v);
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Forward lazy transform (horizontal)
+*/
+static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Forward lazy transform (vertical)
+*/
+static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas);
+/**
+Inverse lazy transform (horizontal)
+*/
+static void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a);
+/**
+Inverse lazy transform (vertical)
+*/
+static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x);
+/**
+Forward 5-3 wavelet transform in 1-D
+*/
+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Inverse 5-3 wavelet transform in 1-D
+*/
+static void opj_dwt_decode_1(opj_dwt_t *v);
+static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Forward 9-7 wavelet transform in 1-D
+*/
+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+/**
+Explicit calculation of the Quantization Stepsizes
+*/
+static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize);
+/**
+Inverse wavelet transform in 2-D.
+*/
+static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
+
+static OPJ_BOOL opj_dwt_encode_procedure( opj_tcd_tilecomp_t * tilec,
+ void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );
+
+static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);
+
+/* <summary> */
+/* Inverse 9-7 wavelet transform in 1-D. */
+/* </summary> */
+static void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt);
+
+static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size);
+
+static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);
+
+#ifdef __SSE__
+static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);
+
+static void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c);
+
+#else
+static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c);
+
+static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c);
+
+#endif
+
+/*@}*/
+
+/*@}*/
+
+#define OPJ_S(i) a[(i)*2]
+#define OPJ_D(i) a[(1+(i)*2)]
+#define OPJ_S_(i) ((i)<0?OPJ_S(0):((i)>=sn?OPJ_S(sn-1):OPJ_S(i)))
+#define OPJ_D_(i) ((i)<0?OPJ_D(0):((i)>=dn?OPJ_D(dn-1):OPJ_D(i)))
+/* new */
+#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i)))
+#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i)))
+
+/* <summary> */
+/* This table contains the norms of the 5-3 wavelets for different bands. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_dwt_norms[4][10] = {
+ {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
+ {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
+ {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
+ {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
+};
+
+/* <summary> */
+/* This table contains the norms of the 9-7 wavelets for different bands. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_dwt_norms_real[4][10] = {
+ {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
+ {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
+ {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
+ {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
+};
+
+/*
+==========================================================
+ local functions
+==========================================================
+*/
+
+/* <summary> */
+/* Forward lazy transform (horizontal). */
+/* </summary> */
+void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+ OPJ_INT32 i;
+ OPJ_INT32 * l_dest = b;
+ OPJ_INT32 * l_src = a+cas;
+
+ for (i=0; i<sn; ++i) {
+ *l_dest++ = *l_src;
+ l_src += 2;
+ }
+
+ l_dest = b + sn;
+ l_src = a + 1 - cas;
+
+ for (i=0; i<dn; ++i) {
+ *l_dest++=*l_src;
+ l_src += 2;
+ }
+}
+
+/* <summary> */
+/* Forward lazy transform (vertical). */
+/* </summary> */
+void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas) {
+ OPJ_INT32 i = sn;
+ OPJ_INT32 * l_dest = b;
+ OPJ_INT32 * l_src = a+cas;
+
+ while (i--) {
+ *l_dest = *l_src;
+ l_dest += x;
+ l_src += 2;
+ } /* b[i*x]=a[2*i+cas]; */
+
+ l_dest = b + sn * x;
+ l_src = a + 1 - cas;
+
+ i = dn;
+ while (i--) {
+ *l_dest = *l_src;
+ l_dest += x;
+ l_src += 2;
+ } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/
+}
+
+/* <summary> */
+/* Inverse lazy transform (horizontal). */
+/* </summary> */
+void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a) {
+ OPJ_INT32 *ai = a;
+ OPJ_INT32 *bi = h->mem + h->cas;
+ OPJ_INT32 i = h->sn;
+ while( i-- ) {
+ *bi = *(ai++);
+ bi += 2;
+ }
+ ai = a + h->sn;
+ bi = h->mem + 1 - h->cas;
+ i = h->dn ;
+ while( i-- ) {
+ *bi = *(ai++);
+ bi += 2;
+ }
+}
+
+/* <summary> */
+/* Inverse lazy transform (vertical). */
+/* </summary> */
+void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) {
+ OPJ_INT32 *ai = a;
+ OPJ_INT32 *bi = v->mem + v->cas;
+ OPJ_INT32 i = v->sn;
+ while( i-- ) {
+ *bi = *ai;
+ bi += 2;
+ ai += x;
+ }
+ ai = a + (v->sn * x);
+ bi = v->mem + 1 - v->cas;
+ i = v->dn ;
+ while( i-- ) {
+ *bi = *ai;
+ bi += 2;
+ ai += x;
+ }
+}
+
+
+/* <summary> */
+/* Forward 5-3 wavelet transform in 1-D. */
+/* </summary> */
+void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+ OPJ_INT32 i;
+
+ if (!cas) {
+ if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
+ for (i = 0; i < dn; i++) OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+ for (i = 0; i < sn; i++) OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+ }
+ } else {
+ if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
+ OPJ_S(0) *= 2;
+ else {
+ for (i = 0; i < dn; i++) OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+ for (i = 0; i < sn; i++) OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+ }
+ }
+}
+
+/* <summary> */
+/* Inverse 5-3 wavelet transform in 1-D. */
+/* </summary> */
+void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+ OPJ_INT32 i;
+
+ if (!cas) {
+ if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
+ for (i = 0; i < sn; i++) OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+ for (i = 0; i < dn; i++) OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+ }
+ } else {
+ if (!sn && dn == 1) /* NEW : CASE ONE ELEMENT */
+ OPJ_S(0) /= 2;
+ else {
+ for (i = 0; i < sn; i++) OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+ for (i = 0; i < dn; i++) OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+ }
+ }
+}
+
+/* <summary> */
+/* Inverse 5-3 wavelet transform in 1-D. */
+/* </summary> */
+void opj_dwt_decode_1(opj_dwt_t *v) {
+ opj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
+}
+
+/* <summary> */
+/* Forward 9-7 wavelet transform in 1-D. */
+/* </summary> */
+void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
+ OPJ_INT32 i;
+ if (!cas) {
+ if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
+ for (i = 0; i < dn; i++)
+ OPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993);
+ for (i = 0; i < sn; i++)
+ OPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434);
+ for (i = 0; i < dn; i++)
+ OPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233);
+ for (i = 0; i < sn; i++)
+ OPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633);
+ for (i = 0; i < dn; i++)
+ OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038); /*5038 */
+ for (i = 0; i < sn; i++)
+ OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659); /*6660 */
+ }
+ } else {
+ if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
+ for (i = 0; i < dn; i++)
+ OPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993);
+ for (i = 0; i < sn; i++)
+ OPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434);
+ for (i = 0; i < dn; i++)
+ OPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233);
+ for (i = 0; i < sn; i++)
+ OPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633);
+ for (i = 0; i < dn; i++)
+ OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038); /*5038 */
+ for (i = 0; i < sn; i++)
+ OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659); /*6660 */
+ }
+ }
+}
+
+void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize) {
+ OPJ_INT32 p, n;
+ p = opj_int_floorlog2(stepsize) - 13;
+ n = 11 - opj_int_floorlog2(stepsize);
+ bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
+ bandno_stepsize->expn = numbps - p;
+}
+
+/*
+==========================================================
+ DWT interface
+==========================================================
+*/
+
+
+/* <summary> */
+/* Forward 5-3 wavelet transform in 2-D. */
+/* </summary> */
+INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) )
+{
+ OPJ_INT32 i, j, k;
+ OPJ_INT32 *a = 00;
+ OPJ_INT32 *aj = 00;
+ OPJ_INT32 *bj = 00;
+ OPJ_INT32 w, l;
+
+ OPJ_INT32 rw; /* width of the resolution level computed */
+ OPJ_INT32 rh; /* height of the resolution level computed */
+ OPJ_UINT32 l_data_size;
+
+ opj_tcd_resolution_t * l_cur_res = 0;
+ opj_tcd_resolution_t * l_last_res = 0;
+
+ w = tilec->x1-tilec->x0;
+ l = (OPJ_INT32)tilec->numresolutions-1;
+ a = tilec->data;
+
+ l_cur_res = tilec->resolutions + l;
+ l_last_res = l_cur_res - 1;
+
+ l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
+ bj = (OPJ_INT32*)opj_malloc((size_t)l_data_size);
+ if (! bj) {
+ return OPJ_FALSE;
+ }
+ i = l;
+
+ while (i--) {
+ OPJ_INT32 rw1; /* width of the resolution level once lower than computed one */
+ OPJ_INT32 rh1; /* height of the resolution level once lower than computed one */
+ OPJ_INT32 cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
+ OPJ_INT32 cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
+ OPJ_INT32 dn, sn;
+
+ rw = l_cur_res->x1 - l_cur_res->x0;
+ rh = l_cur_res->y1 - l_cur_res->y0;
+ rw1 = l_last_res->x1 - l_last_res->x0;
+ rh1 = l_last_res->y1 - l_last_res->y0;
+
+ cas_row = l_cur_res->x0 & 1;
+ cas_col = l_cur_res->y0 & 1;
+
+ sn = rh1;
+ dn = rh - rh1;
+ for (j = 0; j < rw; ++j) {
+ aj = a + j;
+ for (k = 0; k < rh; ++k) {
+ bj[k] = aj[k*w];
+ }
+
+ (*p_function) (bj, dn, sn, cas_col);
+
+ opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
+ }
+
+ sn = rw1;
+ dn = rw - rw1;
+
+ for (j = 0; j < rh; j++) {
+ aj = a + j * w;
+ for (k = 0; k < rw; k++) bj[k] = aj[k];
+ (*p_function) (bj, dn, sn, cas_row);
+ opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
+ }
+
+ l_cur_res = l_last_res;
+
+ --l_last_res;
+ }
+
+ opj_free(bj);
+ return OPJ_TRUE;
+}
+
+/* Forward 5-3 wavelet transform in 2-D. */
+/* </summary> */
+OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec)
+{
+ return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1);
+}
+
+/* <summary> */
+/* Inverse 5-3 wavelet transform in 2-D. */
+/* </summary> */
+OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {
+ return opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1);
+}
+
+
+/* <summary> */
+/* Get gain of 5-3 wavelet transform. */
+/* </summary> */
+OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) {
+ if (orient == 0)
+ return 0;
+ if (orient == 1 || orient == 2)
+ return 1;
+ return 2;
+}
+
+/* <summary> */
+/* Get norm of 5-3 wavelet. */
+/* </summary> */
+OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient) {
+ return opj_dwt_norms[orient][level];
+}
+
+/* <summary> */
+/* Forward 9-7 wavelet transform in 2-D. */
+/* </summary> */
+OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec)
+{
+ return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1_real);
+}
+
+/* <summary> */
+/* Get gain of 9-7 wavelet transform. */
+/* </summary> */
+OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient) {
+ (void)orient;
+ return 0;
+}
+
+/* <summary> */
+/* Get norm of 9-7 wavelet. */
+/* </summary> */
+OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient) {
+ return opj_dwt_norms_real[orient][level];
+}
+
+void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) {
+ OPJ_UINT32 numbands, bandno;
+ numbands = 3 * tccp->numresolutions - 2;
+ for (bandno = 0; bandno < numbands; bandno++) {
+ OPJ_FLOAT64 stepsize;
+ OPJ_UINT32 resno, level, orient, gain;
+
+ resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
+ orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
+ level = tccp->numresolutions - 1 - resno;
+ gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
+ if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+ stepsize = 1.0;
+ } else {
+ OPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level];
+ stepsize = (1 << (gain)) / norm;
+ }
+ opj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0), (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]);
+ }
+}
+
+/* <summary> */
+/* Determine maximum computed resolution level for inverse wavelet transform */
+/* </summary> */
+OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) {
+ OPJ_UINT32 mr = 0;
+ OPJ_UINT32 w;
+ while( --i ) {
+ ++r;
+ if( mr < ( w = (OPJ_UINT32)(r->x1 - r->x0) ) )
+ mr = w ;
+ if( mr < ( w = (OPJ_UINT32)(r->y1 - r->y0) ) )
+ mr = w ;
+ }
+ return mr ;
+}
+
+/* <summary> */
+/* Inverse wavelet transform in 2-D. */
+/* </summary> */
+OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
+ opj_dwt_t h;
+ opj_dwt_t v;
+
+ opj_tcd_resolution_t* tr = tilec->resolutions;
+
+ OPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 - tr->x0); /* width of the resolution level computed */
+ OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0); /* height of the resolution level computed */
+
+ OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+ h.mem = (OPJ_INT32*)
+ opj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32));
+ if (! h.mem){
+ return OPJ_FALSE;
+ }
+
+ v.mem = h.mem;
+
+ while( --numres) {
+ OPJ_INT32 * restrict tiledp = tilec->data;
+ OPJ_UINT32 j;
+
+ ++tr;
+ h.sn = (OPJ_INT32)rw;
+ v.sn = (OPJ_INT32)rh;
+
+ rw = (OPJ_UINT32)(tr->x1 - tr->x0);
+ rh = (OPJ_UINT32)(tr->y1 - tr->y0);
+
+ h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+ h.cas = tr->x0 % 2;
+
+ for(j = 0; j < rh; ++j) {
+ opj_dwt_interleave_h(&h, &tiledp[j*w]);
+ (dwt_1D)(&h);
+ memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));
+ }
+
+ v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+ v.cas = tr->y0 % 2;
+
+ for(j = 0; j < rw; ++j){
+ OPJ_UINT32 k;
+ opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);
+ (dwt_1D)(&v);
+ for(k = 0; k < rh; ++k) {
+ tiledp[k * w + j] = v.mem[k];
+ }
+ }
+ }
+ opj_aligned_free(h.mem);
+ return OPJ_TRUE;
+}
+
+void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){
+ OPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);
+ OPJ_INT32 count = w->sn;
+ OPJ_INT32 i, k;
+
+ for(k = 0; k < 2; ++k){
+ if ( count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0 ) {
+ /* Fast code path */
+ for(i = 0; i < count; ++i){
+ OPJ_INT32 j = i;
+ bi[i*8 ] = a[j];
+ j += x;
+ bi[i*8 + 1] = a[j];
+ j += x;
+ bi[i*8 + 2] = a[j];
+ j += x;
+ bi[i*8 + 3] = a[j];
+ }
+ }
+ else {
+ /* Slow code path */
+ for(i = 0; i < count; ++i){
+ OPJ_INT32 j = i;
+ bi[i*8 ] = a[j];
+ j += x;
+ if(j >= size) continue;
+ bi[i*8 + 1] = a[j];
+ j += x;
+ if(j >= size) continue;
+ bi[i*8 + 2] = a[j];
+ j += x;
+ if(j >= size) continue;
+ bi[i*8 + 3] = a[j]; /* This one*/
+ }
+ }
+
+ bi = (OPJ_FLOAT32*) (w->wavelet + 1 - w->cas);
+ a += w->sn;
+ size -= w->sn;
+ count = w->dn;
+ }
+}
+
+void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){
+ opj_v4_t* restrict bi = v->wavelet + v->cas;
+ OPJ_INT32 i;
+
+ for(i = 0; i < v->sn; ++i){
+ memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+ }
+
+ a += v->sn * x;
+ bi = v->wavelet + 1 - v->cas;
+
+ for(i = 0; i < v->dn; ++i){
+ memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+ }
+}
+
+#ifdef __SSE__
+
+void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){
+ __m128* restrict vw = (__m128*) w;
+ OPJ_INT32 i;
+ /* 4x unrolled loop */
+ for(i = 0; i < count >> 2; ++i){
+ *vw = _mm_mul_ps(*vw, c);
+ vw += 2;
+ *vw = _mm_mul_ps(*vw, c);
+ vw += 2;
+ *vw = _mm_mul_ps(*vw, c);
+ vw += 2;
+ *vw = _mm_mul_ps(*vw, c);
+ vw += 2;
+ }
+ count &= 3;
+ for(i = 0; i < count; ++i){
+ *vw = _mm_mul_ps(*vw, c);
+ vw += 2;
+ }
+}
+
+void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){
+ __m128* restrict vl = (__m128*) l;
+ __m128* restrict vw = (__m128*) w;
+ OPJ_INT32 i;
+ __m128 tmp1, tmp2, tmp3;
+ tmp1 = vl[0];
+ for(i = 0; i < m; ++i){
+ tmp2 = vw[-1];
+ tmp3 = vw[ 0];
+ vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
+ tmp1 = tmp3;
+ vw += 2;
+ }
+ vl = vw - 2;
+ if(m >= k){
+ return;
+ }
+ c = _mm_add_ps(c, c);
+ c = _mm_mul_ps(c, vl[0]);
+ for(; m < k; ++m){
+ __m128 tmp = vw[-1];
+ vw[-1] = _mm_add_ps(tmp, c);
+ vw += 2;
+ }
+}
+
+#else
+
+void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)
+{
+ OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
+ OPJ_INT32 i;
+ for(i = 0; i < count; ++i){
+ OPJ_FLOAT32 tmp1 = fw[i*8 ];
+ OPJ_FLOAT32 tmp2 = fw[i*8 + 1];
+ OPJ_FLOAT32 tmp3 = fw[i*8 + 2];
+ OPJ_FLOAT32 tmp4 = fw[i*8 + 3];
+ fw[i*8 ] = tmp1 * c;
+ fw[i*8 + 1] = tmp2 * c;
+ fw[i*8 + 2] = tmp3 * c;
+ fw[i*8 + 3] = tmp4 * c;
+ }
+}
+
+void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c)
+{
+ OPJ_FLOAT32* restrict fl = (OPJ_FLOAT32*) l;
+ OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
+ OPJ_INT32 i;
+ for(i = 0; i < m; ++i){
+ OPJ_FLOAT32 tmp1_1 = fl[0];
+ OPJ_FLOAT32 tmp1_2 = fl[1];
+ OPJ_FLOAT32 tmp1_3 = fl[2];
+ OPJ_FLOAT32 tmp1_4 = fl[3];
+ OPJ_FLOAT32 tmp2_1 = fw[-4];
+ OPJ_FLOAT32 tmp2_2 = fw[-3];
+ OPJ_FLOAT32 tmp2_3 = fw[-2];
+ OPJ_FLOAT32 tmp2_4 = fw[-1];
+ OPJ_FLOAT32 tmp3_1 = fw[0];
+ OPJ_FLOAT32 tmp3_2 = fw[1];
+ OPJ_FLOAT32 tmp3_3 = fw[2];
+ OPJ_FLOAT32 tmp3_4 = fw[3];
+ fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
+ fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
+ fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
+ fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
+ fl = fw;
+ fw += 8;
+ }
+ if(m < k){
+ OPJ_FLOAT32 c1;
+ OPJ_FLOAT32 c2;
+ OPJ_FLOAT32 c3;
+ OPJ_FLOAT32 c4;
+ c += c;
+ c1 = fl[0] * c;
+ c2 = fl[1] * c;
+ c3 = fl[2] * c;
+ c4 = fl[3] * c;
+ for(; m < k; ++m){
+ OPJ_FLOAT32 tmp1 = fw[-4];
+ OPJ_FLOAT32 tmp2 = fw[-3];
+ OPJ_FLOAT32 tmp3 = fw[-2];
+ OPJ_FLOAT32 tmp4 = fw[-1];
+ fw[-4] = tmp1 + c1;
+ fw[-3] = tmp2 + c2;
+ fw[-2] = tmp3 + c3;
+ fw[-1] = tmp4 + c4;
+ fw += 8;
+ }
+ }
+}
+
+#endif
+
+/* <summary> */
+/* Inverse 9-7 wavelet transform in 1-D. */
+/* </summary> */
+void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt)
+{
+ OPJ_INT32 a, b;
+ if(dwt->cas == 0) {
+ if(!((dwt->dn > 0) || (dwt->sn > 1))){
+ return;
+ }
+ a = 0;
+ b = 1;
+ }else{
+ if(!((dwt->sn > 0) || (dwt->dn > 1))) {
+ return;
+ }
+ a = 1;
+ b = 0;
+ }
+#ifdef __SSE__
+ opj_v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(opj_K));
+ opj_v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(opj_c13318));
+ opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_delta));
+ opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_gamma));
+ opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_beta));
+ opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_alpha));
+#else
+ opj_v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, opj_K);
+ opj_v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, opj_c13318);
+ opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_delta);
+ opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_gamma);
+ opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_beta);
+ opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_alpha);
+#endif
+}
+
+
+/* <summary> */
+/* Inverse 9-7 wavelet transform in 2-D. */
+/* </summary> */
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres)
+{
+ opj_v4dwt_t h;
+ opj_v4dwt_t v;
+
+ opj_tcd_resolution_t* res = tilec->resolutions;
+
+ OPJ_UINT32 rw = (OPJ_UINT32)(res->x1 - res->x0); /* width of the resolution level computed */
+ OPJ_UINT32 rh = (OPJ_UINT32)(res->y1 - res->y0); /* height of the resolution level computed */
+
+ OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+ h.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t));
+ v.wavelet = h.wavelet;
+
+ while( --numres) {
+ OPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data;
+ OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));
+ OPJ_INT32 j;
+
+ h.sn = (OPJ_INT32)rw;
+ v.sn = (OPJ_INT32)rh;
+
+ ++res;
+
+ rw = (OPJ_UINT32)(res->x1 - res->x0); /* width of the resolution level computed */
+ rh = (OPJ_UINT32)(res->y1 - res->y0); /* height of the resolution level computed */
+
+ h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+ h.cas = res->x0 % 2;
+
+ for(j = (OPJ_INT32)rh; j > 3; j -= 4) {
+ OPJ_INT32 k;
+ opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+ opj_v4dwt_decode(&h);
+
+ for(k = (OPJ_INT32)rw; --k >= 0;){
+ aj[k ] = h.wavelet[k].f[0];
+ aj[k+(OPJ_INT32)w ] = h.wavelet[k].f[1];
+ aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
+ aj[k+(OPJ_INT32)w*3] = h.wavelet[k].f[3];
+ }
+
+ aj += w*4;
+ bufsize -= w*4;
+ }
+
+ if (rh & 0x03) {
+ OPJ_INT32 k;
+ j = rh & 0x03;
+ opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+ opj_v4dwt_decode(&h);
+ for(k = (OPJ_INT32)rw; --k >= 0;){
+ switch(j) {
+ case 3: aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
+ case 2: aj[k+(OPJ_INT32)w ] = h.wavelet[k].f[1];
+ case 1: aj[k ] = h.wavelet[k].f[0];
+ }
+ }
+ }
+
+ v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+ v.cas = res->y0 % 2;
+
+ aj = (OPJ_FLOAT32*) tilec->data;
+ for(j = (OPJ_INT32)rw; j > 3; j -= 4){
+ OPJ_UINT32 k;
+
+ opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4);
+ opj_v4dwt_decode(&v);
+
+ for(k = 0; k < rh; ++k){
+ memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32));
+ }
+ aj += 4;
+ }
+
+ if (rw & 0x03){
+ OPJ_UINT32 k;
+
+ j = rw & 0x03;
+
+ opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j);
+ opj_v4dwt_decode(&v);
+
+ for(k = 0; k < rh; ++k){
+ memcpy(&aj[k*w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32));
+ }
+ }
+ }
+
+ opj_aligned_free(h.wavelet);
+ return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h
new file mode 100644
index 0000000000..f8b57bc0c7
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/dwt.h
@@ -0,0 +1,122 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __DWT_H
+#define __DWT_H
+/**
+@file dwt.h
+@brief Implementation of a discrete wavelet transform (DWT)
+
+The functions in DWT.C have for goal to realize forward and inverse discret wavelet
+transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
+DWT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Forward 5-3 wavelet tranform in 2-D.
+Apply a reversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec);
+
+/**
+Inverse 5-3 wavelet tranform in 2-D.
+Apply a reversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param numres Number of resolution levels to decode
+*/
+OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);
+
+/**
+Get the gain of a subband for the reversible 5-3 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
+*/
+OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) ;
+/**
+Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the wavelet function
+*/
+OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient);
+/**
+Forward 9-7 wavelet transform in 2-D.
+Apply an irreversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec);
+/**
+Inverse 9-7 wavelet transform in 2-D.
+Apply an irreversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param numres Number of resolution levels to decode
+*/
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres);
+
+/**
+Get the gain of a subband for the irreversible 9-7 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns the gain of the 9-7 wavelet transform
+*/
+OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient);
+/**
+Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the 9-7 wavelet
+*/
+OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient);
+/**
+Explicit calculation of the Quantization Stepsizes
+@param tccp Tile-component coding parameters
+@param prec Precint analyzed
+*/
+void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __DWT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c
new file mode 100644
index 0000000000..b6034b42d0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.c
@@ -0,0 +1,146 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ==========================================================
+ Utility functions
+ ==========================================================*/
+
+#ifdef OPJ_CODE_NOT_USED
+#ifndef _WIN32
+static char*
+i2a(unsigned i, char *a, unsigned r) {
+ if (i/r > 0) a = i2a(i/r,a,r);
+ *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];
+ return a+1;
+}
+
+/**
+ Transforms integer i into an ascii string and stores the result in a;
+ string is encoded in the base indicated by r.
+ @param i Number to be converted
+ @param a String result
+ @param r Base of value; must be in the range 2 - 36
+ @return Returns a
+*/
+static char *
+_itoa(int i, char *a, int r) {
+ r = ((r < 2) || (r > 36)) ? 10 : r;
+ if(i < 0) {
+ *a = '-';
+ *i2a(-i, a+1, r) = 0;
+ }
+ else *i2a(i, a, r) = 0;
+ return a;
+}
+
+#endif /* !_WIN32 */
+#endif
+
+/* ----------------------------------------------------------------------- */
+/**
+ * Default callback function.
+ * Do nothing.
+ */
+static void opj_default_callback (const char *msg, void *client_data)
+{
+ OPJ_ARG_NOT_USED(msg);
+ OPJ_ARG_NOT_USED(client_data);
+}
+
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* p_event_mgr, OPJ_INT32 event_type, const char *fmt, ...) {
+#define OPJ_MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
+ opj_msg_callback msg_handler = 00;
+ void * l_data = 00;
+
+ if(p_event_mgr != 00) {
+ switch(event_type) {
+ case EVT_ERROR:
+ msg_handler = p_event_mgr->error_handler;
+ l_data = p_event_mgr->m_error_data;
+ break;
+ case EVT_WARNING:
+ msg_handler = p_event_mgr->warning_handler;
+ l_data = p_event_mgr->m_warning_data;
+ break;
+ case EVT_INFO:
+ msg_handler = p_event_mgr->info_handler;
+ l_data = p_event_mgr->m_info_data;
+ break;
+ default:
+ break;
+ }
+ if(msg_handler == 00) {
+ return OPJ_FALSE;
+ }
+ } else {
+ return OPJ_FALSE;
+ }
+
+ if ((fmt != 00) && (p_event_mgr != 00)) {
+ va_list arg;
+ size_t str_length/*, i, j*/; /* UniPG */
+ char message[OPJ_MSG_SIZE];
+ memset(message, 0, OPJ_MSG_SIZE);
+ /* initialize the optional parameter list */
+ va_start(arg, fmt);
+ /* check the length of the format string */
+ str_length = (strlen(fmt) > OPJ_MSG_SIZE) ? OPJ_MSG_SIZE : strlen(fmt);
+ (void)str_length;
+ /* parse the format string and put the result in 'message' */
+ vsnprintf(message, OPJ_MSG_SIZE, fmt, arg); /* UniPG */
+ /* deinitialize the optional parameter list */
+ va_end(arg);
+
+ /* output the message to the user program */
+ msg_handler(message, l_data);
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_set_default_event_handler(opj_event_mgr_t * p_manager)
+{
+ p_manager->m_error_data = 00;
+ p_manager->m_warning_data = 00;
+ p_manager->m_info_data = 00;
+ p_manager->error_handler = opj_default_callback;
+ p_manager->info_handler = opj_default_callback;
+ p_manager->warning_handler = opj_default_callback;
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h
new file mode 100644
index 0000000000..88e0395b4f
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/event.h
@@ -0,0 +1,102 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __EVENT_H
+#define __EVENT_H
+/**
+@file event.h
+@brief Implementation of a event callback system
+
+The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
+*/
+/**
+Message handler object
+used for
+<ul>
+<li>Error messages
+<li>Warning messages
+<li>Debugging messages
+</ul>
+*/
+typedef struct opj_event_mgr
+{
+ /** Data to call the event manager upon */
+ void * m_error_data;
+ /** Data to call the event manager upon */
+ void * m_warning_data;
+ /** Data to call the event manager upon */
+ void * m_info_data;
+ /** Error message callback if available, NULL otherwise */
+ opj_msg_callback error_handler;
+ /** Warning message callback if available, NULL otherwise */
+ opj_msg_callback warning_handler;
+ /** Debug message callback if available, NULL otherwise */
+ opj_msg_callback info_handler;
+} opj_event_mgr_t;
+
+
+#define EVT_ERROR 1 /**< Error event type */
+#define EVT_WARNING 2 /**< Warning event type */
+#define EVT_INFO 4 /**< Debug event type */
+
+/** @defgroup EVENT EVENT - Implementation of a event callback system */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Write formatted data to a string and send the string to a user callback.
+ *
+ * @param event_mgr Event handler
+ * @param event_type Event type or callback to use to send the message
+ * @param fmt Format-control string (plus optional arguments)
+ *
+ * @return Returns true if successful, returns false otherwise
+ */
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* event_mgr, OPJ_INT32 event_type, const char *fmt, ...);
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Set the event manager with the default callback function for the 3 levels.
+ */
+void opj_set_default_event_handler(opj_event_mgr_t * p_manager);
+
+/*@}*/
+
+/*@}*/
+
+#endif /* __EVENT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c
new file mode 100644
index 0000000000..4c8aae621e
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.c
@@ -0,0 +1,119 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/**
+ * Default size of the validation list, if not sufficient, data will be reallocated with a double size.
+ */
+#define OPJ_VALIDATION_SIZE 10
+
+opj_procedure_list_t * opj_procedure_list_create()
+{
+ /* memory allocation */
+ opj_procedure_list_t * l_validation = (opj_procedure_list_t *) opj_malloc(sizeof(opj_procedure_list_t));
+ if (! l_validation)
+ {
+ return 00;
+ }
+ /* initialization */
+ memset(l_validation,0,sizeof(opj_procedure_list_t));
+ l_validation->m_nb_max_procedures = OPJ_VALIDATION_SIZE;
+ l_validation->m_procedures = (opj_procedure*)opj_malloc(
+ OPJ_VALIDATION_SIZE * sizeof(opj_procedure));
+ if (! l_validation->m_procedures)
+ {
+ opj_free(l_validation);
+ return 00;
+ }
+ memset(l_validation->m_procedures,0,OPJ_VALIDATION_SIZE * sizeof(opj_procedure));
+ return l_validation;
+}
+
+void opj_procedure_list_destroy(opj_procedure_list_t * p_list)
+{
+ if (! p_list)
+ {
+ return;
+ }
+ /* initialization */
+ if (p_list->m_procedures)
+ {
+ opj_free(p_list->m_procedures);
+ }
+ opj_free(p_list);
+}
+
+OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure)
+{
+ if (p_validation_list->m_nb_max_procedures == p_validation_list->m_nb_procedures)
+ {
+ opj_procedure * new_procedures;
+
+ p_validation_list->m_nb_max_procedures += OPJ_VALIDATION_SIZE;
+ new_procedures = (opj_procedure*)opj_realloc(
+ p_validation_list->m_procedures,
+ p_validation_list->m_nb_max_procedures * sizeof(opj_procedure));
+ if (! new_procedures)
+ {
+ opj_free(p_validation_list->m_procedures);
+ p_validation_list->m_nb_max_procedures = 0;
+ p_validation_list->m_nb_procedures = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add a new validation procedure\n"); */
+ fprintf(stderr, "Not enough memory to add a new validation procedure\n");
+
+ return OPJ_FALSE;
+ }
+ else
+ {
+ p_validation_list->m_procedures = new_procedures;
+ }
+ }
+ p_validation_list->m_procedures[p_validation_list->m_nb_procedures] = p_procedure;
+ ++p_validation_list->m_nb_procedures;
+
+ return OPJ_TRUE;
+}
+
+OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list)
+{
+ return p_validation_list->m_nb_procedures;
+}
+
+opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list)
+{
+ return p_validation_list->m_procedures;
+}
+
+void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list)
+{
+ p_validation_list->m_nb_procedures = 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h
new file mode 100644
index 0000000000..749ad9e457
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/function_list.h
@@ -0,0 +1,131 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FUNCTION_LIST_H
+#define __FUNCTION_LIST_H
+
+/**
+ * @file function_list.h
+ * @brief Implementation of a list of procedures.
+
+ * The functions in validation.c aims to have access to a list of procedures.
+*/
+
+/** @defgroup VAL VAL - validation procedure*/
+/*@{*/
+
+/**************************************************************************************************
+ ***************************************** FORWARD DECLARATION ************************************
+ **************************************************************************************************/
+
+/**
+ * declare a function pointer
+ */
+typedef void (*opj_procedure)(void);
+
+/**
+ * A list of procedures.
+*/
+typedef struct opj_procedure_list
+{
+ /**
+ * The number of validation procedures.
+ */
+ OPJ_UINT32 m_nb_procedures;
+ /**
+ * The number of the array of validation procedures.
+ */
+ OPJ_UINT32 m_nb_max_procedures;
+ /**
+ * The array of procedures.
+ */
+ opj_procedure * m_procedures;
+
+} opj_procedure_list_t;
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Creates a validation list.
+ *
+ * @return the newly created validation list.
+ */
+opj_procedure_list_t * opj_procedure_list_create(void);
+
+/**
+ * Destroys a validation list.
+ *
+ * @param p_list the list to destroy.
+ */
+void opj_procedure_list_destroy(opj_procedure_list_t * p_list);
+
+/**
+ * Adds a new validation procedure.
+ *
+ * @param p_validation_list the list of procedure to modify.
+ * @param p_procedure the procedure to add.
+ *
+ * @return OPJ_TRUE if the procedure could be added.
+ */
+OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure);
+
+/**
+ * Gets the number of validation procedures.
+ *
+ * @param p_validation_list the list of procedure to modify.
+ *
+ * @return the number of validation procedures.
+ */
+OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list);
+
+/**
+ * Gets the pointer on the first validation procedure. This function is similar to the C++
+ * iterator class to iterate through all the procedures inside the validation list.
+ * the caller does not take ownership of the pointer.
+ *
+ * @param p_validation_list the list of procedure to get the first procedure from.
+ *
+ * @return a pointer to the first procedure.
+ */
+opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list);
+
+
+/**
+ * Clears the list of validation procedures.
+ *
+ * @param p_validation_list the list of procedure to clear.
+ *
+ */
+void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list);
+/*@}*/
+
+#endif /* __FUNCTION_LIST_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c
new file mode 100644
index 0000000000..2c3540c517
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.c
@@ -0,0 +1,240 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+opj_image_t* opj_image_create0(void) {
+ opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
+ return image;
+}
+
+opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
+ OPJ_UINT32 compno;
+ opj_image_t *image = NULL;
+
+ image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
+ if(image) {
+ image->color_space = clrspc;
+ image->numcomps = numcmpts;
+ /* allocate memory for the per-component information */
+ image->comps = (opj_image_comp_t*)opj_calloc(1,image->numcomps * sizeof(opj_image_comp_t));
+ if(!image->comps) {
+ fprintf(stderr,"Unable to allocate memory for image.\n");
+ opj_image_destroy(image);
+ return NULL;
+ }
+ /* create the individual image components */
+ for(compno = 0; compno < numcmpts; compno++) {
+ opj_image_comp_t *comp = &image->comps[compno];
+ comp->dx = cmptparms[compno].dx;
+ comp->dy = cmptparms[compno].dy;
+ comp->w = cmptparms[compno].w;
+ comp->h = cmptparms[compno].h;
+ comp->x0 = cmptparms[compno].x0;
+ comp->y0 = cmptparms[compno].y0;
+ comp->prec = cmptparms[compno].prec;
+ comp->bpp = cmptparms[compno].bpp;
+ comp->sgnd = cmptparms[compno].sgnd;
+ comp->data = (OPJ_INT32*) opj_calloc(comp->w * comp->h, sizeof(OPJ_INT32));
+ if(!comp->data) {
+ fprintf(stderr,"Unable to allocate memory for image.\n");
+ opj_image_destroy(image);
+ return NULL;
+ }
+ }
+ }
+
+ return image;
+}
+
+void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
+ if(image) {
+ if(image->comps) {
+ OPJ_UINT32 compno;
+
+ /* image components */
+ for(compno = 0; compno < image->numcomps; compno++) {
+ opj_image_comp_t *image_comp = &(image->comps[compno]);
+ if(image_comp->data) {
+ opj_free(image_comp->data);
+ }
+ }
+ opj_free(image->comps);
+ }
+
+ if(image->icc_profile_buf) {
+ opj_free(image->icc_profile_buf);
+ }
+
+ opj_free(image);
+ }
+}
+
+/**
+ * Updates the components characteristics of the image from the coding parameters.
+ *
+ * @param p_image_header the image header to update.
+ * @param p_cp the coding parameters from which to update the image.
+ */
+void opj_image_comp_header_update(opj_image_t * p_image_header, const struct opj_cp * p_cp)
+{
+ OPJ_UINT32 i, l_width, l_height;
+ OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
+ OPJ_INT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;
+ opj_image_comp_t* l_img_comp = NULL;
+
+ l_x0 = opj_int_max((OPJ_INT32)p_cp->tx0 , (OPJ_INT32)p_image_header->x0);
+ l_y0 = opj_int_max((OPJ_INT32)p_cp->ty0 , (OPJ_INT32)p_image_header->y0);
+ l_x1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + p_cp->tw * p_cp->tdx), (OPJ_INT32)p_image_header->x1);
+ l_y1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + p_cp->th * p_cp->tdy), (OPJ_INT32)p_image_header->y1);
+
+ l_img_comp = p_image_header->comps;
+ for (i = 0; i < p_image_header->numcomps; ++i) {
+ l_comp_x0 = opj_int_ceildiv(l_x0, (OPJ_INT32)l_img_comp->dx);
+ l_comp_y0 = opj_int_ceildiv(l_y0, (OPJ_INT32)l_img_comp->dy);
+ l_comp_x1 = opj_int_ceildiv(l_x1, (OPJ_INT32)l_img_comp->dx);
+ l_comp_y1 = opj_int_ceildiv(l_y1, (OPJ_INT32)l_img_comp->dy);
+ l_width = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_x1 - l_comp_x0, (OPJ_INT32)l_img_comp->factor);
+ l_height = (OPJ_UINT32)opj_int_ceildivpow2(l_comp_y1 - l_comp_y0, (OPJ_INT32)l_img_comp->factor);
+ l_img_comp->w = l_width;
+ l_img_comp->h = l_height;
+ l_img_comp->x0 = (OPJ_UINT32)l_comp_x0/*l_x0*/;
+ l_img_comp->y0 = (OPJ_UINT32)l_comp_y0/*l_y0*/;
+ ++l_img_comp;
+ }
+}
+
+
+/**
+ * Copy only header of image and its component header (no data are copied)
+ * if dest image have data, they will be freed
+ *
+ * @param p_image_src the src image
+ * @param p_image_dest the dest image
+ *
+ */
+void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest)
+{
+ OPJ_UINT32 compno;
+
+ /* preconditions */
+ assert(p_image_src != 00);
+ assert(p_image_dest != 00);
+
+ p_image_dest->x0 = p_image_src->x0;
+ p_image_dest->y0 = p_image_src->y0;
+ p_image_dest->x1 = p_image_src->x1;
+ p_image_dest->y1 = p_image_src->y1;
+
+ if (p_image_dest->comps){
+ for(compno = 0; compno < p_image_dest->numcomps; compno++) {
+ opj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);
+ if(image_comp->data) {
+ opj_free(image_comp->data);
+ }
+ }
+ opj_free(p_image_dest->comps);
+ p_image_dest->comps = NULL;
+ }
+
+ p_image_dest->numcomps = p_image_src->numcomps;
+
+ p_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps * sizeof(opj_image_comp_t));
+ if (!p_image_dest->comps){
+ p_image_dest->comps = NULL;
+ p_image_dest->numcomps = 0;
+ return;
+ }
+
+ for (compno=0; compno < p_image_dest->numcomps; compno++){
+ memcpy( &(p_image_dest->comps[compno]),
+ &(p_image_src->comps[compno]),
+ sizeof(opj_image_comp_t));
+ p_image_dest->comps[compno].data = NULL;
+ }
+
+ p_image_dest->color_space = p_image_src->color_space;
+ p_image_dest->icc_profile_len = p_image_src->icc_profile_len;
+
+ if (p_image_dest->icc_profile_len) {
+ p_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(p_image_dest->icc_profile_len);
+ if (!p_image_dest->icc_profile_buf){
+ p_image_dest->icc_profile_buf = NULL;
+ p_image_dest->icc_profile_len = 0;
+ return;
+ }
+ memcpy( p_image_dest->icc_profile_buf,
+ p_image_src->icc_profile_buf,
+ p_image_src->icc_profile_len);
+ }
+ else
+ p_image_dest->icc_profile_buf = NULL;
+
+ return;
+}
+
+opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
+ OPJ_UINT32 compno;
+ opj_image_t *image = 00;
+
+ image = (opj_image_t*) opj_malloc(sizeof(opj_image_t));
+ if (image)
+ {
+ memset(image,0,sizeof(opj_image_t));
+
+ image->color_space = clrspc;
+ image->numcomps = numcmpts;
+
+ /* allocate memory for the per-component information */
+ image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
+ if (!image->comps) {
+ opj_image_destroy(image);
+ return 00;
+ }
+ memset(image->comps,0,image->numcomps * sizeof(opj_image_comp_t));
+
+ /* create the individual image components */
+ for(compno = 0; compno < numcmpts; compno++) {
+ opj_image_comp_t *comp = &image->comps[compno];
+ comp->dx = cmptparms[compno].dx;
+ comp->dy = cmptparms[compno].dy;
+ comp->w = cmptparms[compno].w;
+ comp->h = cmptparms[compno].h;
+ comp->x0 = cmptparms[compno].x0;
+ comp->y0 = cmptparms[compno].y0;
+ comp->prec = cmptparms[compno].prec;
+ comp->sgnd = cmptparms[compno].sgnd;
+ comp->data = 0;
+ }
+ }
+
+ return image;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h
new file mode 100644
index 0000000000..e0e2772d40
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/image.h
@@ -0,0 +1,68 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __IMAGE_H
+#define __IMAGE_H
+/**
+@file image.h
+@brief Implementation of operations on images (IMAGE)
+
+The functions in IMAGE.C have for goal to realize operations on images.
+*/
+
+struct opj_image;
+struct opj_cp;
+
+/** @defgroup IMAGE IMAGE - Implementation of operations on images */
+/*@{*/
+
+/**
+ * Create an empty image
+ *
+ * @return returns an empty image if successful, returns NULL otherwise
+ */
+opj_image_t* opj_image_create0(void);
+
+
+
+/**
+ * Updates the components characteristics of the image from the coding parameters.
+ *
+ * @param p_image_header the image header to update.
+ * @param p_cp the coding parameters from which to update the image.
+ */
+void opj_image_comp_header_update(opj_image_t * p_image, const struct opj_cp* p_cp);
+
+void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest);
+
+/*@}*/
+
+#endif /* __IMAGE_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h
new file mode 100644
index 0000000000..ec5525f530
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/indexbox_manager.h
@@ -0,0 +1,148 @@
+/*
+ * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*! \file
+ * \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#ifndef INDEXBOX_MANAGER_H_
+# define INDEXBOX_MANAGER_H_
+
+#include "openjpeg.h"
+#include "j2k.h" /* needed to use jp2.h */
+#include "jp2.h"
+
+#define JPIP_CIDX 0x63696478 /* Codestream index */
+#define JPIP_CPTR 0x63707472 /* Codestream Finder Box */
+#define JPIP_MANF 0x6d616e66 /* Manifest Box */
+#define JPIP_FAIX 0x66616978 /* Fragment array Index box */
+#define JPIP_MHIX 0x6d686978 /* Main Header Index Table */
+#define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */
+#define JPIP_THIX 0x74686978 /* Tile header Index Table box */
+#define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */
+#define JPIP_PHIX 0x70686978 /* Packet Header index Table */
+#define JPIP_FIDX 0x66696478 /* File Index */
+#define JPIP_FPTR 0x66707472 /* File Finder */
+#define JPIP_PRXY 0x70727879 /* Proxy boxes */
+#define JPIP_IPTR 0x69707472 /* Index finder box */
+#define JPIP_PHLD 0x70686c64 /* Place holder */
+
+
+/*
+ * Write tile-part Index table box (superbox)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] j2klen length of j2k codestream
+ * @param[in] cio file output handle
+ * @return length of tpix box
+ */
+int opj_write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+
+/*
+ * Write tile header index table box (superbox)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information pointer
+ * @param[in] cio file output handle
+ * @return length of thix box
+ */
+int opj_write_thix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio, opj_event_mgr_t * p_manager );
+
+
+/*
+ * Write precinct packet index table box (superbox)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused true if EPH option used
+ * @param[in] j2klen length of j2k codestream
+ * @param[in] cio file output handle
+ * @return length of ppix box
+ */
+int opj_write_ppix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+
+/*
+ * Write packet header index table box (superbox)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused true if EPH option used
+ * @param[in] j2klen length of j2k codestream
+ * @param[in] cio file output handle
+ * @return length of ppix box
+ */
+int opj_write_phix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/*
+ * Wriet manifest box (box)
+ *
+ * @param[in] second number to be visited
+ * @param[in] v number of boxes
+ * @param[in] box box to be manifested
+ * @param[in] cio file output handle
+ */
+
+void opj_write_manf(int second,
+ int v,
+ opj_jp2_box_t *box,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/*
+ * Write main header index table (box)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] cio file output handle
+ * @return length of mainmhix box
+ */
+int opj_write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+int opj_write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+int opj_write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+int opj_write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+int opj_write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+#endif /* !INDEXBOX_MANAGER_H_ */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c
new file mode 100644
index 0000000000..4c1ee780d3
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.c
@@ -0,0 +1,294 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/**
+ * LUP decomposition
+ */
+static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,
+ OPJ_UINT32 * permutations,
+ OPJ_FLOAT32 * p_swap_area,
+ OPJ_UINT32 nb_compo);
+/**
+ * LUP solving
+ */
+static void opj_lupSolve(OPJ_FLOAT32 * pResult,
+ OPJ_FLOAT32* pMatrix,
+ OPJ_FLOAT32* pVector,
+ OPJ_UINT32* pPermutations,
+ OPJ_UINT32 nb_compo,
+ OPJ_FLOAT32 * p_intermediate_data);
+
+/**
+ *LUP inversion (call with the result of lupDecompose)
+ */
+static void opj_lupInvert ( OPJ_FLOAT32 * pSrcMatrix,
+ OPJ_FLOAT32 * pDestMatrix,
+ OPJ_UINT32 nb_compo,
+ OPJ_UINT32 * pPermutations,
+ OPJ_FLOAT32 * p_src_temp,
+ OPJ_FLOAT32 * p_dest_temp,
+ OPJ_FLOAT32 * p_swap_area);
+
+/*
+==========================================================
+ Matric inversion interface
+==========================================================
+*/
+/**
+ * Matrix inversion.
+ */
+OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
+ OPJ_FLOAT32 * pDestMatrix,
+ OPJ_UINT32 nb_compo)
+{
+ OPJ_BYTE * l_data = 00;
+ OPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);
+ OPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+ OPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;
+ OPJ_UINT32 * lPermutations = 00;
+ OPJ_FLOAT32 * l_double_data = 00;
+
+ l_data = (OPJ_BYTE *) opj_malloc(l_total_size);
+ if (l_data == 0) {
+ return OPJ_FALSE;
+ }
+ lPermutations = (OPJ_UINT32 *) l_data;
+ l_double_data = (OPJ_FLOAT32 *) (l_data + l_permutation_size);
+ memset(lPermutations,0,l_permutation_size);
+
+ if(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,nb_compo)) {
+ opj_free(l_data);
+ return OPJ_FALSE;
+ }
+
+ opj_lupInvert(pSrcMatrix,pDestMatrix,nb_compo,lPermutations,l_double_data,l_double_data + nb_compo,l_double_data + 2*nb_compo);
+ opj_free(l_data);
+
+ return OPJ_TRUE;
+}
+
+
+/*
+==========================================================
+ Local functions
+==========================================================
+*/
+OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations,
+ OPJ_FLOAT32 * p_swap_area,
+ OPJ_UINT32 nb_compo)
+{
+ OPJ_UINT32 * tmpPermutations = permutations;
+ OPJ_UINT32 * dstPermutations;
+ OPJ_UINT32 k2=0,t;
+ OPJ_FLOAT32 temp;
+ OPJ_UINT32 i,j,k;
+ OPJ_FLOAT32 p;
+ OPJ_UINT32 lLastColum = nb_compo - 1;
+ OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+ OPJ_FLOAT32 * lTmpMatrix = matrix;
+ OPJ_FLOAT32 * lColumnMatrix,* lDestMatrix;
+ OPJ_UINT32 offset = 1;
+ OPJ_UINT32 lStride = nb_compo-1;
+
+ /*initialize permutations */
+ for (i = 0; i < nb_compo; ++i)
+ {
+ *tmpPermutations++ = i;
+ }
+ /* now make a pivot with colum switch */
+ tmpPermutations = permutations;
+ for (k = 0; k < lLastColum; ++k) {
+ p = 0.0;
+
+ /* take the middle element */
+ lColumnMatrix = lTmpMatrix + k;
+
+ /* make permutation with the biggest value in the column */
+ for (i = k; i < nb_compo; ++i) {
+ temp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));
+ if (temp > p) {
+ p = temp;
+ k2 = i;
+ }
+ /* next line */
+ lColumnMatrix += nb_compo;
+ }
+
+ /* a whole rest of 0 -> non singular */
+ if (p == 0.0) {
+ return OPJ_FALSE;
+ }
+
+ /* should we permute ? */
+ if (k2 != k) {
+ /*exchange of line */
+ /* k2 > k */
+ dstPermutations = tmpPermutations + k2 - k;
+ /* swap indices */
+ t = *tmpPermutations;
+ *tmpPermutations = *dstPermutations;
+ *dstPermutations = t;
+
+ /* and swap entire line. */
+ lColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;
+ memcpy(p_swap_area,lColumnMatrix,lSwapSize);
+ memcpy(lColumnMatrix,lTmpMatrix,lSwapSize);
+ memcpy(lTmpMatrix,p_swap_area,lSwapSize);
+ }
+
+ /* now update data in the rest of the line and line after */
+ lDestMatrix = lTmpMatrix + k;
+ lColumnMatrix = lDestMatrix + nb_compo;
+ /* take the middle element */
+ temp = *(lDestMatrix++);
+
+ /* now compute up data (i.e. coeff up of the diagonal). */
+ for (i = offset; i < nb_compo; ++i) {
+ /*lColumnMatrix; */
+ /* divide the lower column elements by the diagonal value */
+
+ /* matrix[i][k] /= matrix[k][k]; */
+ /* p = matrix[i][k] */
+ p = *lColumnMatrix / temp;
+ *(lColumnMatrix++) = p;
+
+ for (j = /* k + 1 */ offset; j < nb_compo; ++j) {
+ /* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */
+ *(lColumnMatrix++) -= p * (*(lDestMatrix++));
+ }
+ /* come back to the k+1th element */
+ lDestMatrix -= lStride;
+ /* go to kth element of the next line */
+ lColumnMatrix += k;
+ }
+
+ /* offset is now k+2 */
+ ++offset;
+ /* 1 element less for stride */
+ --lStride;
+ /* next line */
+ lTmpMatrix+=nb_compo;
+ /* next permutation element */
+ ++tmpPermutations;
+ }
+ return OPJ_TRUE;
+}
+
+void opj_lupSolve (OPJ_FLOAT32 * pResult,
+ OPJ_FLOAT32 * pMatrix,
+ OPJ_FLOAT32 * pVector,
+ OPJ_UINT32* pPermutations,
+ OPJ_UINT32 nb_compo,OPJ_FLOAT32 * p_intermediate_data)
+{
+ OPJ_INT32 k;
+ OPJ_UINT32 i,j;
+ OPJ_FLOAT32 sum;
+ OPJ_FLOAT32 u;
+ OPJ_UINT32 lStride = nb_compo+1;
+ OPJ_FLOAT32 * lCurrentPtr;
+ OPJ_FLOAT32 * lIntermediatePtr;
+ OPJ_FLOAT32 * lDestPtr;
+ OPJ_FLOAT32 * lTmpMatrix;
+ OPJ_FLOAT32 * lLineMatrix = pMatrix;
+ OPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;
+ OPJ_FLOAT32 * lGeneratedData;
+ OPJ_UINT32 * lCurrentPermutationPtr = pPermutations;
+
+
+ lIntermediatePtr = p_intermediate_data;
+ lGeneratedData = p_intermediate_data + nb_compo - 1;
+
+ for (i = 0; i < nb_compo; ++i) {
+ sum = 0.0;
+ lCurrentPtr = p_intermediate_data;
+ lTmpMatrix = lLineMatrix;
+ for (j = 1; j <= i; ++j)
+ {
+ /* sum += matrix[i][j-1] * y[j-1]; */
+ sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+ }
+ /*y[i] = pVector[pPermutations[i]] - sum; */
+ *(lIntermediatePtr++) = pVector[*(lCurrentPermutationPtr++)] - sum;
+ lLineMatrix += nb_compo;
+ }
+
+ /* we take the last point of the matrix */
+ lLineMatrix = pMatrix + nb_compo*nb_compo - 1;
+
+ /* and we take after the last point of the destination vector */
+ lDestPtr = pResult + nb_compo;
+
+
+ assert(nb_compo != 0);
+ for (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {
+ sum = 0.0;
+ lTmpMatrix = lLineMatrix;
+ u = *(lTmpMatrix++);
+ lCurrentPtr = lDestPtr--;
+ for (j = (OPJ_UINT32)(k + 1); j < nb_compo; ++j) {
+ /* sum += matrix[k][j] * x[j] */
+ sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+ }
+ /*x[k] = (y[k] - sum) / u; */
+ *(lBeginPtr--) = (*(lGeneratedData--) - sum) / u;
+ lLineMatrix -= lStride;
+ }
+}
+
+
+void opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,
+ OPJ_FLOAT32 * pDestMatrix,
+ OPJ_UINT32 nb_compo,
+ OPJ_UINT32 * pPermutations,
+ OPJ_FLOAT32 * p_src_temp,
+ OPJ_FLOAT32 * p_dest_temp,
+ OPJ_FLOAT32 * p_swap_area )
+{
+ OPJ_UINT32 j,i;
+ OPJ_FLOAT32 * lCurrentPtr;
+ OPJ_FLOAT32 * lLineMatrix = pDestMatrix;
+ OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+
+ for (j = 0; j < nb_compo; ++j) {
+ lCurrentPtr = lLineMatrix++;
+ memset(p_src_temp,0,lSwapSize);
+ p_src_temp[j] = 1.0;
+ opj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, nb_compo , p_swap_area);
+
+ for (i = 0; i < nb_compo; ++i) {
+ *(lCurrentPtr) = p_dest_temp[i];
+ lCurrentPtr+=nb_compo;
+ }
+ }
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h
new file mode 100644
index 0000000000..2fae8e54bd
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/invert.h
@@ -0,0 +1,64 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __INVERT_H
+#define __INVERT_H
+/**
+@file invert.h
+@brief Implementation of the matrix inversion
+
+The function in INVERT.H compute a matrix inversion with a LUP method
+*/
+
+/** @defgroup INVERT INVERT - Implementation of a matrix inversion */
+/*@{*/
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Calculates a n x n double matrix inversion with a LUP method. Data is aligned, rows after rows (or columns after columns).
+ * The function does not take ownership of any memory block, data must be fred by the user.
+ *
+ * @param pSrcMatrix the matrix to invert.
+ * @param pDestMatrix data to store the inverted matrix.
+ * @param n size of the matrix
+ * @return OPJ_TRUE if the inversion is successful, OPJ_FALSE if the matrix is singular.
+ */
+OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
+ OPJ_FLOAT32 * pDestMatrix,
+ OPJ_UINT32 nb_compo);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __INVERT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c
new file mode 100644
index 0000000000..77a864ebb9
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.c
@@ -0,0 +1,10295 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+#define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/
+#define CINEMA_48_CS 651041 /*Codestream length for 48fps*/
+#define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/
+#define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+ * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k);
+
+/**
+ * The read header procedure.
+ */
+static OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * The default encoding validation procedure without any extension.
+ *
+ * @param p_j2k the jpeg2000 codec to validate.
+ * @param p_stream the input stream to validate.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * The default decoding validation procedure without any extension.
+ *
+ * @param p_j2k the jpeg2000 codec to validate.
+ * @param p_stream the input stream to validate.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k);
+
+/**
+ * The mct encoding validation procedure.
+ *
+ * @param p_j2k the jpeg2000 codec to validate.
+ * @param p_stream the input stream to validate.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the parameters are correct.
+ */
+static OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Builds the tcd decoder to use to decode tile.
+ */
+static OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+/**
+ * Builds the tcd encoder to use to encode tile.
+ */
+static OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a tile-coder decoder.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_create_tcd( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param p_procedure_list the list of procedures to execute
+ * @param p_j2k the jpeg2000 codec to execute the procedures on.
+ * @param p_stream the stream to execute the procedures on.
+ * @param p_manager the user manager.
+ *
+ * @return true if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,
+ opj_procedure_list_t * p_procedure_list,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Updates the rates of the tcp.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Copies the decoding tile parameters onto all the tile parameters.
+ * Creates also the tile decoder.
+ */
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Destroys the memory associated with the decoding of headers.
+ */
+static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the lookup table containing all the marker, status and action, and returns the handler associated
+ * with the marker value.
+ * @param p_id Marker value to look up
+ *
+ * @return the handler associated with the id.
+*/
+static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id);
+
+/**
+ * Destroys a tile coding parameter structure.
+ *
+ * @param p_tcp the tile coding parameter to destroy.
+ */
+static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp);
+
+/**
+ * Destroys the data inside a tile coding parameter structure.
+ *
+ * @param p_tcp the tile coding parameter which contain data to destroy.
+ */
+static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp);
+
+/**
+ * Destroys a coding parameter structure.
+ *
+ * @param p_cp the coding parameter to destroy.
+ */
+static void opj_j2k_cp_destroy (opj_cp_t *p_cp);
+
+/**
+ * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
+ *
+ * @param p_j2k J2K codec.
+ * @param p_tile_no FIXME DOC
+ * @param p_comp_no the component number to output.
+ * @param p_data FIXME DOC
+ * @param p_header_size FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return FIXME DOC
+*/
+static OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
+ *
+ * @param p_j2k the J2K codec.
+ * @param p_tile_no the tile index.
+ * @param p_comp_no the component being outputted.
+ *
+ * @return the number of bytes taken by the SPCod element.
+ */
+static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no );
+
+/**
+ * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
+ * @param p_j2k the jpeg2000 codec.
+ * @param compno FIXME DOC
+ * @param p_header_data the data contained in the COM box.
+ * @param p_header_size the size of the data contained in the COM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 compno,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param p_tile_no the tile index.
+ * @param p_comp_no the component being outputted.
+ * @param p_j2k the J2K codec.
+ *
+ * @return the number of bytes taken by the SPCod element.
+ */
+static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no );
+
+/**
+ * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param p_tile_no the tile to output.
+ * @param p_comp_no the component number to output.
+ * @param p_data the data buffer.
+ * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+ *
+*/
+static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Updates the Tile Length Marker.
+ */
+static void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
+
+/**
+ * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param p_j2k J2K codec.
+ * @param compno the component number to output.
+ * @param p_header_data the data buffer.
+ * @param p_header_size pointer to the size of the data buffer, it is changed by the function.
+ * @param p_manager the user event manager.
+ *
+*/
+static OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 compno,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Copies the tile component parameters of all the component from the first tile component.
+ *
+ * @param p_j2k the J2k codec.
+ */
+static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k );
+
+/**
+ * Copies the tile quantization parameters of all the component from the first tile component.
+ *
+ * @param p_j2k the J2k codec.
+ */
+static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k );
+
+/**
+ * Reads the tiles.
+ */
+static OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager);
+
+static OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image);
+
+static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
+
+static OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the procedures to do on writing header.
+ * Developers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k);
+
+static OPJ_BOOL opj_j2k_write_first_tile_part( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ opj_stream_private_t *p_stream,
+ struct opj_event_mgr * p_manager );
+
+static OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ opj_stream_private_t *p_stream,
+ struct opj_event_mgr * p_manager );
+
+/**
+ * Gets the offset of the header.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
+
+/*
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ */
+
+/**
+ * Writes the SOC marker (Start Of Codestream)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SOC marker (Start of Codestream)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_stream XXX needs data
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_soc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the SIZ marker (image and tile size)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SIZ marker (image and tile size)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_header_data the data contained in the SIZ box.
+ * @param p_header_size the size of the data contained in the SIZ marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Writes the COM marker (comment)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a COM marker (comments)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_header_data the data contained in the COM box.
+ * @param p_header_size the size of the data contained in the COM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_com ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+/**
+ * Writes the COD marker (Coding style default)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a COD marker (Coding Styke defaults)
+ * @param p_header_data the data contained in the COD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the COD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cod ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+
+#if 0
+/**
+ * Writes the COC marker (Coding style component)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_comp_no the index of the component to output.
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes the COC marker (Coding style component)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_comp_no the index of the component to output.
+ * @param p_data FIXME DOC
+ * @param p_data_written FIXME DOC
+ * @param p_manager the user event manager.
+*/
+static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Gets the maximum size taken by a coc.
+ *
+ * @param p_j2k the jpeg2000 codec to use.
+ */
+static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a COC marker (Coding Style Component)
+ * @param p_header_data the data contained in the COC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the COC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_coc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the QCD marker (quantization default)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a QCD marker (Quantization defaults)
+ * @param p_header_data the data contained in the QCD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the QCD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcd ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+#if 0
+/**
+ * Writes the QCC marker (quantization component)
+ *
+ * @param p_comp_no the index of the component to output.
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes the QCC marker (quantization component)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_comp_no the index of the component to output.
+ * @param p_data FIXME DOC
+ * @param p_data_written the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Gets the maximum size taken by a qcc.
+ */
+static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k);
+
+/**
+ * Reads a QCC marker (Quantization component)
+ * @param p_header_data the data contained in the QCC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the QCC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcc( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+/**
+ * Writes the POC marker (Progression Order Change)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+/**
+ * Writes the POC marker (Progression Order Change)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_data FIXME DOC
+ * @param p_data_written the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager );
+/**
+ * Gets the maximum size taken by the writing of a POC.
+ */
+static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a POC marker (Progression Order Change)
+ *
+ * @param p_header_data the data contained in the POC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the POC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_poc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
+ */
+static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k);
+
+/**
+ * Gets the maximum size taken by the headers of the SOT.
+ *
+ * @param p_j2k the jpeg2000 codec to use.
+ */
+static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k);
+
+/**
+ * Reads a CRG marker (Component registration)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_crg ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+/**
+ * Reads a TLM marker (Tile Length Marker)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_tlm ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Writes the updated tlm.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PLM marker (Packet length, main header marker)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plm ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+/**
+ * Reads a PLT marker (Packet length, tile-part header)
+ *
+ * @param p_header_data the data contained in the PLT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the PLT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+#if 0
+/**
+ * Reads a PPM marker (Packed packet headers, main header)
+ *
+ * @param p_header_data the data contained in the POC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the POC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL j2k_read_ppm_v2 (
+ opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ struct opj_event_mgr * p_manager
+ );
+#endif
+
+static OPJ_BOOL j2k_read_ppm_v3 (
+ opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param p_header_data the data contained in the PPT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the PPT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+/**
+ * Writes the TLM marker (Tile Length Marker)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the SOT marker (Start of tile-part)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_data FIXME DOC
+ * @param p_data_written FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ const opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param p_header_data the data contained in the PPT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the PPT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+/**
+ * Writes the SOD marker (Start of data)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_tile_coder FIXME DOC
+ * @param p_data FIXME DOC
+ * @param p_data_written FIXME DOC
+ * @param p_total_data_size FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k,
+ opj_tcd_t * p_tile_coder,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ const opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a SOD marker (Start Of Data)
+ *
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_stream FIXME DOC
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_sod( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size )
+{
+ opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1); /* PSOT */
+ ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
+
+ opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4); /* PSOT */
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
+}
+
+/**
+ * Writes the RGN marker (Region Of Interest)
+ *
+ * @param p_tile_no the tile to output
+ * @param p_comp_no the component to output
+ * @param nb_comps the number of components
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_rgn( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_UINT32 nb_comps,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a RGN marker (Region Of Interest)
+ *
+ * @param p_header_data the data contained in the POC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the POC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the EOC marker (End of Codestream)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+#if 0
+/**
+ * Reads a EOC marker (End Of Codestream)
+ *
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_stream FIXME DOC
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Writes the CBD-MCT-MCC-MCO markers (Multi components transform)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Inits the Info
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+Add main header marker information
+@param cstr_index Codestream information structure
+@param type marker type
+@param pos byte offset of marker segment
+@param len length of marker segment
+ */
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
+/**
+Add tile header marker information
+@param tileno tile index number
+@param cstr_index Codestream information structure
+@param type marker type
+@param pos byte offset of marker segment
+@param len length of marker segment
+ */
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len);
+
+/**
+ * Reads an unknown marker
+ *
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_stream the stream object to read from.
+ * @param output_marker FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the marker could be deduced.
+*/
+static OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ OPJ_UINT32 *output_marker,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCT marker (Multiple Component Transform)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_mct_record FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k,
+ opj_mct_data_t * p_mct_record,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param p_header_data the data contained in the MCT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the MCT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mct ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCC marker (Multiple Component Collection)
+ *
+ * @param p_j2k J2K codec.
+ * @param p_mcc_record FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k,
+ opj_simple_mcc_decorrelation_data_t * p_mcc_record,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCC marker (Multiple Component Collection)
+ *
+ * @param p_header_data the data contained in the MCC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the MCC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the MCO marker (Multiple component transformation ordering)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a MCO marker (Multiple Component Transform Ordering)
+ *
+ * @param p_header_data the data contained in the MCO box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the MCO marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index);
+
+static void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+static void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+static void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+/**
+ * Ends the encoding, i.e. frees memory.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the CBD marker (Component bit depth definition)
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a CBD marker (Component bit depth definition)
+ * @param p_header_data the data contained in the CBD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the CBD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cbd ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+
+#if 0
+/**
+ * Writes COC marker for each component.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+#endif
+
+#if 0
+/**
+ * Writes QCC marker for each component.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+#endif
+
+/**
+ * Writes regions of interests.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes EPC ????
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Checks the progression order changes values. Tells of the poc given as input are valid.
+ * A nice message is outputted at errors.
+ *
+ * @param p_pocs the progression order changes.
+ * @param p_nb_pocs the number of progression order changes.
+ * @param p_nb_resolutions the number of resolutions.
+ * @param numcomps the number of components
+ * @param numlayers the number of layers.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the pocs are valid.
+ */
+static OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,
+ OPJ_UINT32 p_nb_pocs,
+ OPJ_UINT32 p_nb_resolutions,
+ OPJ_UINT32 numcomps,
+ OPJ_UINT32 numlayers,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
+ *
+ * @param cp the coding parameters.
+ * @param pino the offset of the given poc (i.e. its position in the coding parameter).
+ * @param tileno the given tile.
+ *
+ * @return the number of tile parts.
+ */
+static OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno);
+
+/**
+ * Calculates the total number of tile parts needed by the encoder to
+ * encode such an image. If not enough memory is available, then the function return false.
+ *
+ * @param p_nb_tiles pointer that will hold the number of tile parts.
+ * @param cp the coding parameters for the image.
+ * @param image the image to encode.
+ * @param p_j2k the p_j2k encoder.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the function was successful, false else.
+ */
+static OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k,
+ opj_cp_t *cp,
+ OPJ_UINT32 * p_nb_tiles,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager);
+
+static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
+
+static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream);
+
+static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
+
+static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp);
+
+static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp);
+
+static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
+
+static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager);
+
+static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+typedef struct j2k_prog_order{
+ OPJ_PROG_ORDER enum_prog;
+ char str_prog[5];
+}j2k_prog_order_t;
+
+j2k_prog_order_t j2k_prog_order_list[] = {
+ {OPJ_CPRL, "CPRL"},
+ {OPJ_LRCP, "LRCP"},
+ {OPJ_PCRL, "PCRL"},
+ {OPJ_RLCP, "RLCP"},
+ {OPJ_RPCL, "RPCL"},
+ {(OPJ_PROG_ORDER)-1, ""}
+};
+
+/**
+ * FIXME DOC
+ */
+static const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
+{
+ 2,
+ 4,
+ 4,
+ 8
+};
+
+typedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+
+const opj_j2k_mct_function j2k_mct_read_functions_to_float [] =
+{
+ opj_j2k_read_int16_to_float,
+ opj_j2k_read_int32_to_float,
+ opj_j2k_read_float32_to_float,
+ opj_j2k_read_float64_to_float
+};
+
+const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] =
+{
+ opj_j2k_read_int16_to_int32,
+ opj_j2k_read_int32_to_int32,
+ opj_j2k_read_float32_to_int32,
+ opj_j2k_read_float64_to_int32
+};
+
+const opj_j2k_mct_function j2k_mct_write_functions_from_float [] =
+{
+ opj_j2k_write_float_to_int16,
+ opj_j2k_write_float_to_int32,
+ opj_j2k_write_float_to_float,
+ opj_j2k_write_float_to_float64
+};
+
+typedef struct opj_dec_memory_marker_handler
+{
+ /** marker value */
+ OPJ_UINT32 id;
+ /** value of the state when the marker can appear */
+ OPJ_UINT32 states;
+ /** action linked to the marker */
+ OPJ_BOOL (*handler) ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+}
+opj_dec_memory_marker_handler_t;
+
+const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
+{
+ {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
+ {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
+ {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
+ {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
+ {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
+ {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
+ {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
+ {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
+ {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
+ {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
+ {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
+ {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm_v3},
+ {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
+ {J2K_MS_SOP, 0, 0},
+ {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
+ {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
+ {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
+ {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd},
+ {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
+ {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
+#ifdef USE_JPWL
+#ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */
+ {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
+ {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
+ {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
+ {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
+#endif
+#endif /* USE_JPWL */
+#ifdef USE_JPSEC
+ {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
+ {J2K_MS_INSEC, 0, j2k_read_insec}
+#endif /* USE_JPSEC */
+ {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
+};
+
+void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_bytes(l_src_data,&l_temp,2);
+
+ l_src_data+=sizeof(OPJ_INT16);
+
+ *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+ }
+}
+
+void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_bytes(l_src_data,&l_temp,4);
+
+ l_src_data+=sizeof(OPJ_INT32);
+
+ *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+ }
+}
+
+void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_float(l_src_data,&l_temp);
+
+ l_src_data+=sizeof(OPJ_FLOAT32);
+
+ *(l_dest_data++) = l_temp;
+ }
+}
+
+void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT64 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_double(l_src_data,&l_temp);
+
+ l_src_data+=sizeof(OPJ_FLOAT64);
+
+ *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+ }
+}
+
+void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_bytes(l_src_data,&l_temp,2);
+
+ l_src_data+=sizeof(OPJ_INT16);
+
+ *(l_dest_data++) = (OPJ_INT32) l_temp;
+ }
+}
+
+void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_bytes(l_src_data,&l_temp,4);
+
+ l_src_data+=sizeof(OPJ_INT32);
+
+ *(l_dest_data++) = (OPJ_INT32) l_temp;
+ }
+}
+
+void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_float(l_src_data,&l_temp);
+
+ l_src_data+=sizeof(OPJ_FLOAT32);
+
+ *(l_dest_data++) = (OPJ_INT32) l_temp;
+ }
+}
+
+void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+ OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT64 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ opj_read_double(l_src_data,&l_temp);
+
+ l_src_data+=sizeof(OPJ_FLOAT64);
+
+ *(l_dest_data++) = (OPJ_INT32) l_temp;
+ }
+}
+
+void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+ OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ l_temp = (OPJ_UINT32) *(l_src_data++);
+
+ opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));
+
+ l_dest_data+=sizeof(OPJ_INT16);
+ }
+}
+
+void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+ OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ l_temp = (OPJ_UINT32) *(l_src_data++);
+
+ opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));
+
+ l_dest_data+=sizeof(OPJ_INT32);
+ }
+}
+
+void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+ OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT32 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ l_temp = (OPJ_FLOAT32) *(l_src_data++);
+
+ opj_write_float(l_dest_data,l_temp);
+
+ l_dest_data+=sizeof(OPJ_FLOAT32);
+ }
+}
+
+void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+{
+ OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+ OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+ OPJ_UINT32 i;
+ OPJ_FLOAT64 l_temp;
+
+ for (i=0;i<p_nb_elem;++i) {
+ l_temp = (OPJ_FLOAT64) *(l_src_data++);
+
+ opj_write_double(l_dest_data,l_temp);
+
+ l_dest_data+=sizeof(OPJ_FLOAT64);
+ }
+}
+
+char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
+ j2k_prog_order_t *po;
+ for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
+ if(po->enum_prog == prg_order){
+ return po->str_prog;
+ }
+ }
+ return po->str_prog;
+}
+
+OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,
+ OPJ_UINT32 p_nb_pocs,
+ OPJ_UINT32 p_nb_resolutions,
+ OPJ_UINT32 p_num_comps,
+ OPJ_UINT32 p_num_layers,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32* packet_array;
+ OPJ_UINT32 index , resno, compno, layno;
+ OPJ_UINT32 i;
+ OPJ_UINT32 step_c = 1;
+ OPJ_UINT32 step_r = p_num_comps * step_c;
+ OPJ_UINT32 step_l = p_nb_resolutions * step_r;
+ OPJ_BOOL loss = OPJ_FALSE;
+ OPJ_UINT32 layno0 = 0;
+
+ packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));
+ if (packet_array == 00) {
+ opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n");
+ return OPJ_FALSE;
+ }
+ memset(packet_array,0,step_l * p_num_layers* sizeof(OPJ_UINT32));
+
+ if (p_nb_pocs == 0) {
+ opj_free(packet_array);
+ return OPJ_TRUE;
+ }
+
+ index = step_r * p_pocs->resno0;
+ /* take each resolution for each poc */
+ for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
+ {
+ OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+
+ /* take each comp of each resolution for each poc */
+ for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+ OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+
+ /* and finally take each layer of each res of ... */
+ for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+ /*index = step_r * resno + step_c * compno + step_l * layno;*/
+ packet_array[comp_index] = 1;
+ comp_index += step_l;
+ }
+
+ res_index += step_c;
+ }
+
+ index += step_r;
+ }
+ ++p_pocs;
+
+ /* iterate through all the pocs */
+ for (i = 1; i < p_nb_pocs ; ++i) {
+ OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;
+
+ layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;
+ index = step_r * p_pocs->resno0;
+
+ /* take each resolution for each poc */
+ for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
+ OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+
+ /* take each comp of each resolution for each poc */
+ for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+ OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+
+ /* and finally take each layer of each res of ... */
+ for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+ /*index = step_r * resno + step_c * compno + step_l * layno;*/
+ packet_array[comp_index] = 1;
+ comp_index += step_l;
+ }
+
+ res_index += step_c;
+ }
+
+ index += step_r;
+ }
+
+ ++p_pocs;
+ }
+
+ index = 0;
+ for (layno = 0; layno < p_num_layers ; ++layno) {
+ for (resno = 0; resno < p_nb_resolutions; ++resno) {
+ for (compno = 0; compno < p_num_comps; ++compno) {
+ loss |= (packet_array[index]!=1);
+ /*index = step_r * resno + step_c * compno + step_l * layno;*/
+ index += step_c;
+ }
+ }
+ }
+
+ if (loss) {
+ opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n");
+ }
+
+ opj_free(packet_array);
+
+ return !loss;
+}
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno)
+{
+ const OPJ_CHAR *prog = 00;
+ OPJ_INT32 i;
+ OPJ_UINT32 tpnum = 1;
+ opj_tcp_t *tcp = 00;
+ opj_poc_t * l_current_poc = 00;
+
+ /* preconditions */
+ assert(tileno < (cp->tw * cp->th));
+ assert(pino < (cp->tcps[tileno].numpocs + 1));
+
+ /* get the given tile coding parameter */
+ tcp = &cp->tcps[tileno];
+ assert(tcp != 00);
+
+ l_current_poc = &(tcp->pocs[pino]);
+ assert(l_current_poc != 0);
+
+ /* get the progression order as a character string */
+ prog = opj_j2k_convert_progression_order(tcp->prg);
+ assert(strlen(prog) > 0);
+
+ if (cp->m_specific_param.m_enc.m_tp_on == 1) {
+ for (i=0;i<4;++i) {
+ switch (prog[i])
+ {
+ /* component wise */
+ case 'C':
+ tpnum *= l_current_poc->compE;
+ break;
+ /* resolution wise */
+ case 'R':
+ tpnum *= l_current_poc->resE;
+ break;
+ /* precinct wise */
+ case 'P':
+ tpnum *= l_current_poc->prcE;
+ break;
+ /* layer wise */
+ case 'L':
+ tpnum *= l_current_poc->layE;
+ break;
+ }
+ /* whould we split here ? */
+ if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) {
+ cp->m_specific_param.m_enc.m_tp_pos=i;
+ break;
+ }
+ }
+ }
+ else {
+ tpnum=1;
+ }
+
+ return tpnum;
+}
+
+OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k,
+ opj_cp_t *cp,
+ OPJ_UINT32 * p_nb_tiles,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 pino,tileno;
+ OPJ_UINT32 l_nb_tiles;
+ opj_tcp_t *tcp;
+
+ /* preconditions */
+ assert(p_nb_tiles != 00);
+ assert(cp != 00);
+ assert(image != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_nb_tiles = cp->tw * cp->th;
+ * p_nb_tiles = 0;
+ tcp = cp->tcps;
+
+ /* INDEX >> */
+ /* TODO mergeV2: check this part which use cstr_info */
+ /*if (p_j2k->cstr_info) {
+ opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
+
+ for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+ OPJ_UINT32 cur_totnum_tp = 0;
+
+ opj_pi_update_encoding_parameters(image,cp,tileno);
+
+ for (pino = 0; pino <= tcp->numpocs; ++pino)
+ {
+ OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
+
+ *p_nb_tiles = *p_nb_tiles + tp_num;
+
+ cur_totnum_tp += tp_num;
+ }
+
+ tcp->m_nb_tile_parts = cur_totnum_tp;
+
+ l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
+ if (l_info_tile_ptr->tp == 00) {
+ return OPJ_FALSE;
+ }
+
+ memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
+
+ l_info_tile_ptr->num_tps = cur_totnum_tp;
+
+ ++l_info_tile_ptr;
+ ++tcp;
+ }
+ }
+ else */{
+ for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+ OPJ_UINT32 cur_totnum_tp = 0;
+
+ opj_pi_update_encoding_parameters(image,cp,tileno);
+
+ for (pino = 0; pino <= tcp->numpocs; ++pino) {
+ OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
+
+ *p_nb_tiles = *p_nb_tiles + tp_num;
+
+ cur_totnum_tp += tp_num;
+ }
+ tcp->m_nb_tile_parts = cur_totnum_tp;
+
+ ++tcp;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ /* 2 bytes will be written */
+ OPJ_BYTE * l_start_stream = 00;
+
+ /* preconditions */
+ assert(p_stream != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ /* write SOC identifier */
+ opj_write_bytes(l_start_stream,J2K_MS_SOC,2);
+
+ if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) {
+ return OPJ_FALSE;
+ }
+
+/* UniPG>> */
+#ifdef USE_JPWL
+ /* update markers struct */
+/*
+ OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
+*/
+ assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+/* <<UniPG */
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a SOC marker (Start of Codestream)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_stream FIXME DOC
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_soc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_BYTE l_data [2];
+ OPJ_UINT32 l_marker;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(l_data,&l_marker,2);
+ if (l_marker != J2K_MS_SOC) {
+ return OPJ_FALSE;
+ }
+
+ /* Next marker should be a SIZ marker in the main header */
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
+
+ /* FIXME move it in a index structure included in p_j2k*/
+ p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
+
+ opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n", p_j2k->cstr_index->main_head_start);
+
+ /* Add the marker to the codestream index*/
+ if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+ return OPJ_FALSE;
+ }
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_size_len;
+ OPJ_BYTE * l_current_ptr;
+ opj_image_t * l_image = 00;
+ opj_cp_t *cp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+
+ /* preconditions */
+ assert(p_stream != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ cp = &(p_j2k->m_cp);
+ l_size_len = 40 + 3 * l_image->numcomps;
+ l_img_comp = l_image->comps;
+
+ if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
+ }
+
+ l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ /* write SOC identifier */
+ opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2); /* SIZ */
+ l_current_ptr+=2;
+
+ opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */
+ l_current_ptr+=2;
+
+ opj_write_bytes(l_current_ptr, cp->rsiz, 2); /* Rsiz (capabilities) */
+ l_current_ptr+=2;
+
+ opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, cp->tdx, 4); /* XTsiz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, cp->tdy, 4); /* YTsiz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, cp->tx0, 4); /* XT0siz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, cp->ty0, 4); /* YT0siz */
+ l_current_ptr+=4;
+
+ opj_write_bytes(l_current_ptr, l_image->numcomps, 2); /* Csiz */
+ l_current_ptr+=2;
+
+ for (i = 0; i < l_image->numcomps; ++i) {
+ /* TODO here with MCT ? */
+ opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1); /* Ssiz_i */
+ ++l_current_ptr;
+
+ opj_write_bytes(l_current_ptr, l_img_comp->dx, 1); /* XRsiz_i */
+ ++l_current_ptr;
+
+ opj_write_bytes(l_current_ptr, l_img_comp->dy, 1); /* YRsiz_i */
+ ++l_current_ptr;
+
+ ++l_img_comp;
+ }
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a SIZ marker (image and tile size)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_header_data the data contained in the SIZ box.
+ * @param p_header_size the size of the data contained in the SIZ marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_nb_comp;
+ OPJ_UINT32 l_nb_comp_remain;
+ OPJ_UINT32 l_remaining_size;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 l_tmp;
+ opj_image_t *l_image = 00;
+ opj_cp_t *l_cp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcp_t * l_current_tile_param = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_header_data != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_cp = &(p_j2k->m_cp);
+
+ /* minimum size == 39 - 3 (= minimum component parameter) */
+ if (p_header_size < 36) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+ return OPJ_FALSE;
+ }
+
+ l_remaining_size = p_header_size - 36;
+ l_nb_comp = l_remaining_size / 3;
+ l_nb_comp_remain = l_remaining_size % 3;
+ if (l_nb_comp_remain != 0){
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_tmp ,2); /* Rsiz (capabilities) */
+ p_header_data+=2;
+ l_cp->rsiz = (OPJ_RSIZ_CAPABILITIES) l_tmp;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4); /* Xsiz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4); /* Ysiz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4); /* X0siz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4); /* Y0siz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4); /* XTsiz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4); /* YTsiz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4); /* XT0siz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4); /* YT0siz */
+ p_header_data+=4;
+ opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2); /* Csiz */
+ p_header_data+=2;
+ if (l_tmp < 16385)
+ l_image->numcomps = (OPJ_UINT16) l_tmp;
+ else {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
+ return OPJ_FALSE;
+ }
+
+ if (l_image->numcomps != l_nb_comp) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n", l_image->numcomps, l_nb_comp);
+ return OPJ_FALSE;
+ }
+
+ /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
+ if (l_image->x0 > l_image->x1 || l_image->y0 > l_image->y1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: negative image size (%d x %d)\n", l_image->x1 - l_image->x0, l_image->y1 - l_image->y0);
+ return OPJ_FALSE;
+ }
+ /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
+ if (!(l_cp->tdx * l_cp->tdy)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx, l_cp->tdy);
+ return OPJ_FALSE;
+ }
+
+ /* testcase 1610.pdf.SIGSEGV.59c.681 */
+ if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1);
+ return OPJ_FALSE;
+ }
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+ /* if JPWL is on, we check whether TX errors have damaged
+ too much the SIZ parameters */
+ if (!(l_image->x1 * l_image->y1)) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "JPWL: bad image size (%d x %d)\n",
+ l_image->x1, l_image->y1);
+ if (!JPWL_ASSUME || JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ }
+
+ /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
+ if (l_image->numcomps != ((len - 38) / 3)) {
+ opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+ "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
+ l_image->numcomps, ((len - 38) / 3));
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ */ /* we try to correct */
+ /* opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n");
+ if (l_image->numcomps < ((len - 38) / 3)) {
+ len = 38 + 3 * l_image->numcomps;
+ opj_event_msg(p_manager, EVT_WARNING, "- setting Lsiz to %d => HYPOTHESIS!!!\n",
+ len);
+ } else {
+ l_image->numcomps = ((len - 38) / 3);
+ opj_event_msg(p_manager, EVT_WARNING, "- setting Csiz to %d => HYPOTHESIS!!!\n",
+ l_image->numcomps);
+ }
+ }
+ */
+
+ /* update components number in the jpwl_exp_comps filed */
+ l_cp->exp_comps = l_image->numcomps;
+ }
+#endif /* USE_JPWL */
+
+ /* Allocate the resulting image components */
+ l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));
+ if (l_image->comps == 00){
+ l_image->numcomps = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+
+ memset(l_image->comps,0,l_image->numcomps * sizeof(opj_image_comp_t));
+ l_img_comp = l_image->comps;
+
+ /* Read the component information */
+ for (i = 0; i < l_image->numcomps; ++i){
+ OPJ_UINT32 tmp;
+ opj_read_bytes(p_header_data,&tmp,1); /* Ssiz_i */
+ ++p_header_data;
+ l_img_comp->prec = (tmp & 0x7f) + 1;
+ l_img_comp->sgnd = tmp >> 7;
+ opj_read_bytes(p_header_data,&tmp,1); /* XRsiz_i */
+ ++p_header_data;
+ l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+ opj_read_bytes(p_header_data,&tmp,1); /* YRsiz_i */
+ ++p_header_data;
+ l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+ if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
+ l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Invalid values for comp = %d : dx=%u dy=%u\n (should be between 1 and 255 according the JPEG2000 norm)",
+ i, l_img_comp->dx, l_img_comp->dy);
+ return OPJ_FALSE;
+ }
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+ /* if JPWL is on, we check whether TX errors have damaged
+ too much the SIZ parameters, again */
+ if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
+ opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+ "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
+ i, i, l_image->comps[i].dx, l_image->comps[i].dy);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+ if (!l_image->comps[i].dx) {
+ l_image->comps[i].dx = 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
+ i, l_image->comps[i].dx);
+ }
+ if (!l_image->comps[i].dy) {
+ l_image->comps[i].dy = 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
+ i, l_image->comps[i].dy);
+ }
+ }
+ }
+#endif /* USE_JPWL */
+ l_img_comp->resno_decoded = 0; /* number of resolution decoded */
+ l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
+ ++l_img_comp;
+ }
+
+ /* Compute the number of tiles */
+ l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
+ l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
+
+ /* Check that the number of tiles is valid */
+ if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
+ opj_event_msg( p_manager, EVT_ERROR,
+ "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
+ l_cp->tw, l_cp->th);
+ return OPJ_FALSE;
+ }
+ l_nb_tiles = l_cp->tw * l_cp->th;
+
+ /* Define the tiles which will be decoded */
+ if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
+ p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
+ p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
+ p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
+ p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
+ }
+ else {
+ p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+ p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+ p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+ p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+ }
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+ /* if JPWL is on, we check whether TX errors have damaged
+ too much the SIZ parameters */
+ if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) {
+ opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+ "JPWL: bad number of tiles (%d x %d)\n",
+ l_cp->tw, l_cp->th);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+ if (l_cp->tw < 1) {
+ l_cp->tw= 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
+ l_cp->tw);
+ }
+ if (l_cp->tw > l_cp->max_tiles) {
+ l_cp->tw= 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- too large x, increase expectance of %d\n"
+ "- setting %d tiles in x => HYPOTHESIS!!!\n",
+ l_cp->max_tiles, l_cp->tw);
+ }
+ if (l_cp->th < 1) {
+ l_cp->th= 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
+ l_cp->th);
+ }
+ if (l_cp->th > l_cp->max_tiles) {
+ l_cp->th= 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
+ "- setting %d tiles in y => HYPOTHESIS!!!\n",
+ l_cp->max_tiles, l_cp->th);
+ }
+ }
+ }
+#endif /* USE_JPWL */
+
+ /* memory allocations */
+ l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
+ if (l_cp->tcps == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ memset(l_cp->tcps,0,l_nb_tiles*sizeof(opj_tcp_t));
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+ if (!l_cp->tcps) {
+ opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+ "JPWL: could not alloc tcps field of cp\n");
+ if (!JPWL_ASSUME || JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ }
+ }
+#endif /* USE_JPWL */
+
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
+ (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
+ if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps ,0,l_image->numcomps*sizeof(opj_tccp_t));
+
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
+ (opj_mct_data_t*)opj_malloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
+
+ if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records,0,OPJ_J2K_MCT_DEFAULT_NB_RECORDS * sizeof(opj_mct_data_t));
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
+ (opj_simple_mcc_decorrelation_data_t*)
+ opj_malloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
+
+ if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ memset(p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records,0,OPJ_J2K_MCC_DEFAULT_NB_RECORDS * sizeof(opj_simple_mcc_decorrelation_data_t));
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+ /* set up default dc level shift */
+ for (i=0;i<l_image->numcomps;++i) {
+ if (! l_image->comps[i].sgnd) {
+ p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);
+ }
+ }
+
+ l_current_tile_param = l_cp->tcps;
+ for (i = 0; i < l_nb_tiles; ++i) {
+ l_current_tile_param->tccps = (opj_tccp_t*) opj_malloc(l_image->numcomps * sizeof(opj_tccp_t));
+ if (l_current_tile_param->tccps == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+ return OPJ_FALSE;
+ }
+ memset(l_current_tile_param->tccps,0,l_image->numcomps * sizeof(opj_tccp_t));
+
+ ++l_current_tile_param;
+ }
+
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */
+ opj_image_comp_header_update(l_image,l_cp);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_comment_size;
+ OPJ_UINT32 l_total_com_size;
+ const OPJ_CHAR *l_comment;
+ OPJ_BYTE * l_current_ptr = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ l_comment = p_j2k->m_cp.comment;
+ l_comment_size = (OPJ_UINT32)strlen(l_comment);
+ l_total_com_size = l_comment_size + 6;
+
+ if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write the COM marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
+ }
+
+ l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_ptr,J2K_MS_COM , 2); /* COM */
+ l_current_ptr+=2;
+
+ opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2); /* L_COM */
+ l_current_ptr+=2;
+
+ opj_write_bytes(l_current_ptr,1 , 2); /* General use (IS 8859-15:1999 (Latin) values) */
+ l_current_ptr+=2;
+
+ memcpy( l_current_ptr,l_comment,l_comment_size);
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a COM marker (comments)
+ * @param p_j2k the jpeg2000 file codec.
+ * @param p_header_data the data contained in the COM box.
+ * @param p_header_size the size of the data contained in the COM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_com ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_header_data != 00);
+ (void)p_header_size;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_code_size,l_remaining_size;
+ OPJ_BYTE * l_current_data = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+ l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);
+ l_remaining_size = l_code_size;
+
+ if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_COD,2); /* COD */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_code_size-2,2); /* L_COD */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_tcp->csty,1); /* Scod */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,l_tcp->prg,1); /* SGcod (A) */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,l_tcp->numlayers,2); /* SGcod (B) */
+ l_current_data+=2;
+
+ opj_write_bytes(l_current_data,l_tcp->mct,1); /* SGcod (C) */
+ ++l_current_data;
+
+ l_remaining_size -= 9;
+
+ if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (l_remaining_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a COD marker (Coding Styke defaults)
+ * @param p_header_data the data contained in the COD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the COD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cod ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* loop */
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_tmp;
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_image_t *l_image = 00;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_cp = &(p_j2k->m_cp);
+
+ /* If we are in the first tile-part header of the current tile */
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ /* Make sure room is sufficient */
+ if (p_header_size < 5) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_tcp->csty,1); /* Scod */
+ ++p_header_data;
+ opj_read_bytes(p_header_data,&l_tmp,1); /* SGcod (A) */
+ ++p_header_data;
+ l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
+ opj_read_bytes(p_header_data,&l_tcp->numlayers,2); /* SGcod (B) */
+ p_header_data+=2;
+
+ /* If user didn't set a number layer to decode take the max specify in the codestream. */
+ if (l_cp->m_specific_param.m_dec.m_layer) {
+ l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
+ }
+ else {
+ l_tcp->num_layers_to_decode = l_tcp->numlayers;
+ }
+
+ opj_read_bytes(p_header_data,&l_tcp->mct,1); /* SGcod (C) */
+ ++p_header_data;
+
+ p_header_size -= 5;
+ for (i = 0; i < l_image->numcomps; ++i) {
+ l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
+ }
+
+ if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (p_header_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* Apply the coding style to other components of the current tile or the m_default_tcp*/
+ opj_j2k_copy_tile_component_parameters(p_j2k);
+
+ /* Index */
+#ifdef WIP_REMOVE_MSD
+ if (p_j2k->cstr_info) {
+ /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
+ p_j2k->cstr_info->prog = l_tcp->prg;
+ p_j2k->cstr_info->numlayers = l_tcp->numlayers;
+ p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));
+ for (i = 0; i < l_image->numcomps; ++i) {
+ p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
+ }
+ }
+#endif
+
+ return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 l_coc_size,l_remaining_size;
+ OPJ_UINT32 l_comp_room;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
+
+ l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+
+ if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data;
+ /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
+ = (OPJ_BYTE*)opj_realloc(
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data,
+ l_coc_size);*/
+
+ new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
+ }
+
+ opj_j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+#endif
+
+#if 0
+void opj_j2k_write_coc_in_memory( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_coc_size,l_remaining_size;
+ OPJ_BYTE * l_current_data = 00;
+ opj_image_t *l_image = 00;
+ OPJ_UINT32 l_comp_room;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+ l_image = p_j2k->m_private_image;
+ l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
+
+ l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+ l_remaining_size = l_coc_size;
+
+ l_current_data = p_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_COC,2); /* COC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_coc_size-2,2); /* L_COC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,p_comp_no, l_comp_room); /* Ccoc */
+ l_current_data+=l_comp_room;
+
+ opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1); /* Scoc */
+ ++l_current_data;
+
+ l_remaining_size -= (5 + l_comp_room);
+ opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);
+ * p_data_written = l_coc_size;
+}
+#endif
+
+OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
+{
+ OPJ_UINT32 i,j;
+ OPJ_UINT32 l_nb_comp;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 l_max = 0;
+
+ /* preconditions */
+
+ l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+ l_nb_comp = p_j2k->m_private_image->numcomps;
+
+ for (i=0;i<l_nb_tiles;++i) {
+ for (j=0;j<l_nb_comp;++j) {
+ l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j));
+ }
+ }
+
+ return 6 + l_max;
+}
+
+/**
+ * Reads a COC marker (Coding Style Component)
+ * @param p_header_data the data contained in the COC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the COC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_coc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_cp_t *l_cp = NULL;
+ opj_tcp_t *l_tcp = NULL;
+ opj_image_t *l_image = NULL;
+ OPJ_UINT32 l_comp_room;
+ OPJ_UINT32 l_comp_no;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+ l_image = p_j2k->m_private_image;
+
+ l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
+
+ /* make sure room is sufficient*/
+ if (p_header_size < l_comp_room + 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+ return OPJ_FALSE;
+ }
+ p_header_size -= l_comp_room + 1;
+
+ opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Ccoc */
+ p_header_data += l_comp_room;
+ if (l_comp_no >= l_image->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1); /* Scoc */
+ ++p_header_data ;
+
+ if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (p_header_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+ return OPJ_FALSE;
+ }
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_qcd_size,l_remaining_size;
+ OPJ_BYTE * l_current_data = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);
+ l_remaining_size = l_qcd_size;
+
+ if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_QCD,2); /* QCD */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_qcd_size-2,2); /* L_QCD */
+ l_current_data += 2;
+
+ l_remaining_size -= 4;
+
+ if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (l_remaining_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a QCD marker (Quantization defaults)
+ * @param p_header_data the data contained in the QCD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the QCD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcd ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (p_header_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
+ opj_j2k_copy_tile_quantization_parameters(p_j2k);
+
+ return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_qcc_size,l_remaining_size;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+ l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1;
+ l_remaining_size = l_qcc_size;
+
+ if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
+ }
+
+ opj_j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+#endif
+
+#if 0
+void opj_j2k_write_qcc_in_memory( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_qcc_size,l_remaining_size;
+ OPJ_BYTE * l_current_data = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+ l_remaining_size = l_qcc_size;
+
+ l_current_data = p_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_QCC,2); /* QCC */
+ l_current_data += 2;
+
+ if (p_j2k->m_private_image->numcomps <= 256) {
+ --l_qcc_size;
+
+ opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data, p_comp_no, 1); /* Cqcc */
+ ++l_current_data;
+
+ /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
+ l_remaining_size -= 6;
+ }
+ else {
+ opj_write_bytes(l_current_data,l_qcc_size-2,2); /* L_QCC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data, p_comp_no, 2); /* Cqcc */
+ l_current_data+=2;
+
+ l_remaining_size -= 6;
+ }
+
+ opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);
+
+ *p_data_written = l_qcc_size;
+}
+#endif
+
+OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k)
+{
+ return opj_j2k_get_max_coc_size(p_j2k);
+}
+
+/**
+ * Reads a QCC marker (Quantization component)
+ * @param p_header_data the data contained in the QCC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the QCC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_qcc( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_num_comp,l_comp_no;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_num_comp = p_j2k->m_private_image->numcomps;
+
+ if (l_num_comp <= 256) {
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+ return OPJ_FALSE;
+ }
+ opj_read_bytes(p_header_data,&l_comp_no,1);
+ ++p_header_data;
+ --p_header_size;
+ }
+ else {
+ if (p_header_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+ return OPJ_FALSE;
+ }
+ opj_read_bytes(p_header_data,&l_comp_no,2);
+ p_header_data+=2;
+ p_header_size-=2;
+ }
+
+#ifdef USE_JPWL
+ if (p_j2k->m_cp.correct) {
+
+ static OPJ_UINT32 backup_compno = 0;
+
+ /* compno is negative or larger than the number of components!!! */
+ if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
+ l_comp_no, l_num_comp);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ l_comp_no = backup_compno % l_num_comp;
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+ "- setting component number to %d\n",
+ l_comp_no);
+ }
+
+ /* keep your private count of tiles */
+ backup_compno++;
+ };
+#endif /* USE_JPWL */
+
+ if (l_comp_no >= p_j2k->m_private_image->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Invalid component number: %d, regarding the number of components %d\n",
+ l_comp_no, p_j2k->m_private_image->numcomps);
+ return OPJ_FALSE;
+ }
+
+ if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ if (p_header_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_nb_comp;
+ OPJ_UINT32 l_nb_poc;
+ OPJ_UINT32 l_poc_size;
+ OPJ_UINT32 l_written_size = 0;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_poc_room;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+ l_nb_comp = p_j2k->m_private_image->numcomps;
+ l_nb_poc = 1 + l_tcp->numpocs;
+
+ if (l_nb_comp <= 256) {
+ l_poc_room = 1;
+ }
+ else {
+ l_poc_room = 2;
+ }
+ l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+
+ if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
+ }
+
+ opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_write_poc_in_memory( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i;
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_nb_comp;
+ OPJ_UINT32 l_nb_poc;
+ OPJ_UINT32 l_poc_size;
+ opj_image_t *l_image = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+ opj_poc_t *l_current_poc = 00;
+ OPJ_UINT32 l_poc_room;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+ l_tccp = &l_tcp->tccps[0];
+ l_image = p_j2k->m_private_image;
+ l_nb_comp = l_image->numcomps;
+ l_nb_poc = 1 + l_tcp->numpocs;
+
+ if (l_nb_comp <= 256) {
+ l_poc_room = 1;
+ }
+ else {
+ l_poc_room = 2;
+ }
+
+ l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+
+ l_current_data = p_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_POC,2); /* POC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_poc_size-2,2); /* Lpoc */
+ l_current_data += 2;
+
+ l_current_poc = l_tcp->pocs;
+ for (i = 0; i < l_nb_poc; ++i) {
+ opj_write_bytes(l_current_data,l_current_poc->resno0,1); /* RSpoc_i */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room); /* CSpoc_i */
+ l_current_data+=l_poc_room;
+
+ opj_write_bytes(l_current_data,l_current_poc->layno1,2); /* LYEpoc_i */
+ l_current_data+=2;
+
+ opj_write_bytes(l_current_data,l_current_poc->resno1,1); /* REpoc_i */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room); /* CEpoc_i */
+ l_current_data+=l_poc_room;
+
+ opj_write_bytes(l_current_data,l_current_poc->prg,1); /* Ppoc_i */
+ ++l_current_data;
+
+ /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
+ l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
+ l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
+ l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
+
+ ++l_current_poc;
+ }
+
+ *p_data_written = l_poc_size;
+}
+
+OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
+{
+ opj_tcp_t * l_tcp = 00;
+ OPJ_UINT32 l_nb_tiles = 0;
+ OPJ_UINT32 l_max_poc = 0;
+ OPJ_UINT32 i;
+
+ l_tcp = p_j2k->m_cp.tcps;
+ l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+
+ for (i=0;i<l_nb_tiles;++i) {
+ l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs);
+ ++l_tcp;
+ }
+
+ ++l_max_poc;
+
+ return 4 + 9 * l_max_poc;
+}
+
+OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k)
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 l_max = 0;
+ opj_tcp_t * l_tcp = 00;
+
+ l_tcp = p_j2k->m_cp.tcps;
+ l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+
+ for (i=0;i<l_nb_tiles;++i) {
+ l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts);
+
+ ++l_tcp;
+ }
+
+ return 12 * l_max;
+}
+
+OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
+{
+ OPJ_UINT32 l_nb_bytes = 0;
+ OPJ_UINT32 l_nb_comps;
+ OPJ_UINT32 l_coc_bytes,l_qcc_bytes;
+
+ l_nb_comps = p_j2k->m_private_image->numcomps - 1;
+ l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
+
+ if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == 0) {
+ l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
+ l_nb_bytes += l_nb_comps * l_coc_bytes;
+
+ l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
+ l_nb_bytes += l_nb_comps * l_qcc_bytes;
+ }
+
+ l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
+
+ /*** DEVELOPER CORNER, Add room for your headers ***/
+
+ return l_nb_bytes;
+}
+
+/**
+ * Reads a POC marker (Progression Order Change)
+ *
+ * @param p_header_data the data contained in the POC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the POC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_poc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i, l_nb_comp, l_tmp;
+ opj_image_t * l_image = 00;
+ OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
+ OPJ_UINT32 l_chunk_size, l_comp_room;
+
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_poc_t *l_current_poc = 00;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_nb_comp = l_image->numcomps;
+ if (l_nb_comp <= 256) {
+ l_comp_room = 1;
+ }
+ else {
+ l_comp_room = 2;
+ }
+ l_chunk_size = 5 + 2 * l_comp_room;
+ l_current_poc_nb = p_header_size / l_chunk_size;
+ l_current_poc_remaining = p_header_size % l_chunk_size;
+
+ if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+ l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
+ l_current_poc_nb += l_old_poc_nb;
+
+ if(l_current_poc_nb >= 32)
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
+ return OPJ_FALSE;
+ }
+ assert(l_current_poc_nb < 32);
+
+ /* now poc is in use.*/
+ l_tcp->POC = 1;
+
+ l_current_poc = &l_tcp->pocs[l_old_poc_nb];
+ for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
+ opj_read_bytes(p_header_data,&(l_current_poc->resno0),1); /* RSpoc_i */
+ ++p_header_data;
+ opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room); /* CSpoc_i */
+ p_header_data+=l_comp_room;
+ opj_read_bytes(p_header_data,&(l_current_poc->layno1),2); /* LYEpoc_i */
+ /* make sure layer end is in acceptable bounds */
+ l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
+ p_header_data+=2;
+ opj_read_bytes(p_header_data,&(l_current_poc->resno1),1); /* REpoc_i */
+ ++p_header_data;
+ opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room); /* CEpoc_i */
+ p_header_data+=l_comp_room;
+ opj_read_bytes(p_header_data,&l_tmp,1); /* Ppoc_i */
+ ++p_header_data;
+ l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
+ /* make sure comp is in acceptable bounds */
+ l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
+ ++l_current_poc;
+ }
+
+ l_tcp->numpocs = l_current_poc_nb - 1;
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a CRG marker (Component registration)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_crg ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_nb_comp;
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_nb_comp = p_j2k->m_private_image->numcomps;
+
+ if (p_header_size != l_nb_comp *4) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
+ return OPJ_FALSE;
+ }
+ /* Do not care of this at the moment since only local variables are set here */
+ /*
+ for
+ (i = 0; i < l_nb_comp; ++i)
+ {
+ opj_read_bytes(p_header_data,&l_Xcrg_i,2); // Xcrg_i
+ p_header_data+=2;
+ opj_read_bytes(p_header_data,&l_Ycrg_i,2); // Xcrg_i
+ p_header_data+=2;
+ }
+ */
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a TLM marker (Tile Length Marker)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_tlm ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if (p_header_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+ return OPJ_FALSE;
+ }
+ p_header_size -= 2;
+
+ opj_read_bytes(p_header_data,&l_Ztlm,1); /* Ztlm */
+ ++p_header_data;
+ opj_read_bytes(p_header_data,&l_Stlm,1); /* Stlm */
+ ++p_header_data;
+
+ l_ST = ((l_Stlm >> 4) & 0x3);
+ l_SP = (l_Stlm >> 6) & 0x1;
+
+ l_Ptlm_size = (l_SP + 1) * 2;
+ l_quotient = l_Ptlm_size + l_ST;
+
+ l_tot_num_tp_remaining = p_header_size % l_quotient;
+
+ if (l_tot_num_tp_remaining != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+ return OPJ_FALSE;
+ }
+ /* FIXME Do not care of this at the moment since only local variables are set here */
+ /*
+ for
+ (i = 0; i < l_tot_num_tp; ++i)
+ {
+ opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST); // Ttlm_i
+ p_header_data += l_ST;
+ opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size); // Ptlm_i
+ p_header_data += l_Ptlm_size;
+ }*/
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a PLM marker (Packet length, main header marker)
+ *
+ * @param p_header_data the data contained in the TLM box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the TLM marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plm ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+ return OPJ_FALSE;
+ }
+ /* Do not care of this at the moment since only local variables are set here */
+ /*
+ opj_read_bytes(p_header_data,&l_Zplm,1); // Zplm
+ ++p_header_data;
+ --p_header_size;
+
+ while
+ (p_header_size > 0)
+ {
+ opj_read_bytes(p_header_data,&l_Nplm,1); // Nplm
+ ++p_header_data;
+ p_header_size -= (1+l_Nplm);
+ if
+ (p_header_size < 0)
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+ return false;
+ }
+ for
+ (i = 0; i < l_Nplm; ++i)
+ {
+ opj_read_bytes(p_header_data,&l_tmp,1); // Iplm_ij
+ ++p_header_data;
+ // take only the last seven bytes
+ l_packet_len |= (l_tmp & 0x7f);
+ if
+ (l_tmp & 0x80)
+ {
+ l_packet_len <<= 7;
+ }
+ else
+ {
+ // store packet length and proceed to next packet
+ l_packet_len = 0;
+ }
+ }
+ if
+ (l_packet_len != 0)
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+ return false;
+ }
+ }
+ */
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a PLT marker (Packet length, tile-part header)
+ *
+ * @param p_header_data the data contained in the PLT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the PLT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_Zplt,1); /* Zplt */
+ ++p_header_data;
+ --p_header_size;
+
+ for (i = 0; i < p_header_size; ++i) {
+ opj_read_bytes(p_header_data,&l_tmp,1); /* Iplt_ij */
+ ++p_header_data;
+ /* take only the last seven bytes */
+ l_packet_len |= (l_tmp & 0x7f);
+ if (l_tmp & 0x80) {
+ l_packet_len <<= 7;
+ }
+ else {
+ /* store packet length and proceed to next packet */
+ l_packet_len = 0;
+ }
+ }
+
+ if (l_packet_len != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL j2k_read_ppm_v2 (
+ opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ struct opj_event_mgr * p_manager
+ )
+{
+
+ opj_cp_t *l_cp = 00;
+ OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ l_cp->ppm = 1;
+
+ opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */
+ ++p_header_data;
+ --p_header_size;
+
+ /* First PPM marker */
+ if (l_Z_ppm == 0) {
+ if (p_header_size < 4) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */
+ p_header_data+=4;
+ p_header_size-=4;
+
+ /* First PPM marker: Initialization */
+ l_cp->ppm_len = l_N_ppm;
+ l_cp->ppm_data_size = 0;
+
+ l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
+ if (l_cp->ppm_buffer == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
+ return OPJ_FALSE;
+ }
+ memset(l_cp->ppm_buffer,0,l_cp->ppm_len);
+
+ l_cp->ppm_data = l_cp->ppm_buffer;
+ }
+
+ while (1) {
+ if (l_cp->ppm_data_size == l_cp->ppm_len) {
+ if (p_header_size >= 4) {
+ /* read a N_ppm */
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */
+ p_header_data+=4;
+ p_header_size-=4;
+ l_cp->ppm_len += l_N_ppm ;
+
+ OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
+ if (! new_ppm_buffer) {
+ opj_free(l_cp->ppm_buffer);
+ l_cp->ppm_buffer = NULL;
+ l_cp->ppm_len = 0;
+ l_cp->ppm_data = NULL;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n");
+ return OPJ_FALSE;
+ }
+ l_cp->ppm_buffer = new_ppm_buffer;
+ memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
+ l_cp->ppm_data = l_cp->ppm_buffer;
+ }
+ else {
+ return OPJ_FALSE;
+ }
+ }
+
+ l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
+
+ if (l_remaining_data <= p_header_size) {
+ /* we must store less information than available in the packet */
+ memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
+ l_cp->ppm_data_size = l_cp->ppm_len;
+ p_header_size -= l_remaining_data;
+ p_header_data += l_remaining_data;
+ }
+ else {
+ memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
+ l_cp->ppm_data_size += p_header_size;
+ p_header_data += p_header_size;
+ p_header_size = 0;
+ break;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+#endif
+
+OPJ_BOOL j2k_read_ppm_v3 (
+ opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ struct opj_event_mgr * p_manager
+ )
+{
+ opj_cp_t *l_cp = 00;
+ OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ /* Minimum size of PPM marker is equal to the size of Zppm element */
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ l_cp->ppm = 1;
+
+ opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */
+ ++p_header_data;
+ --p_header_size;
+
+ /* First PPM marker */
+ if (l_Z_ppm == 0) {
+ /* We need now at least the Nppm^0 element */
+ if (p_header_size < 4) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* First N_ppm */
+ p_header_data+=4;
+ p_header_size-=4;
+
+ /* sanity check: how much bytes is left for Ippm */
+ if( p_header_size < l_N_ppm )
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
+ opj_free(l_cp->ppm_data);
+ l_cp->ppm_data = NULL;
+ l_cp->ppm_buffer = NULL;
+ l_cp->ppm = 0; /* do not use PPM */
+ return OPJ_FALSE;
+ }
+
+ /* First PPM marker: Initialization */
+ l_cp->ppm_len = l_N_ppm;
+ l_cp->ppm_data_read = 0;
+
+ l_cp->ppm_data = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len);
+ l_cp->ppm_buffer = l_cp->ppm_data;
+ if (l_cp->ppm_data == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
+ return OPJ_FALSE;
+ }
+ memset(l_cp->ppm_data,0,l_cp->ppm_len);
+
+ l_cp->ppm_data_current = l_cp->ppm_data;
+
+ /*l_cp->ppm_data = l_cp->ppm_buffer;*/
+ }
+ else {
+ if (p_header_size < 4) {
+ opj_event_msg(p_manager, EVT_WARNING, "Empty PPM marker\n");
+ return OPJ_TRUE;
+ }
+ else {
+ /* Uncompleted Ippm series in the previous PPM marker?*/
+ if (l_cp->ppm_data_read < l_cp->ppm_len) {
+ /* Get the place where add the remaining Ippm series*/
+ l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_data_read]);
+ l_N_ppm = l_cp->ppm_len - l_cp->ppm_data_read;
+ }
+ else {
+ OPJ_BYTE *new_ppm_data;
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* First N_ppm */
+ p_header_data+=4;
+ p_header_size-=4;
+
+ /* sanity check: how much bytes is left for Ippm */
+ if( p_header_size < l_N_ppm )
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm );
+ opj_free(l_cp->ppm_data);
+ l_cp->ppm_data = NULL;
+ l_cp->ppm_buffer = NULL;
+ l_cp->ppm = 0; /* do not use PPM */
+ return OPJ_FALSE;
+ }
+ /* Increase the size of ppm_data to add the new Ippm series*/
+ assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+ new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+ if (! new_ppm_data) {
+ opj_free(l_cp->ppm_data);
+ l_cp->ppm_data = NULL;
+ l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+ l_cp->ppm_len = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new Ippm series\n");
+ return OPJ_FALSE;
+ }
+ l_cp->ppm_data = new_ppm_data;
+ l_cp->ppm_buffer = l_cp->ppm_data;
+
+ /* Keep the position of the place where concatenate the new series*/
+ l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+ l_cp->ppm_len += l_N_ppm;
+ }
+ }
+ }
+
+ l_remaining_data = p_header_size;
+
+ while (l_remaining_data >= l_N_ppm) {
+ /* read a complete Ippm series*/
+ memcpy(l_cp->ppm_data_current, p_header_data, l_N_ppm);
+ p_header_size -= l_N_ppm;
+ p_header_data += l_N_ppm;
+
+ l_cp->ppm_data_read += l_N_ppm; /* Increase the number of data read*/
+
+ if (p_header_size)
+ {
+ if (p_header_size < 4) return OPJ_FALSE;
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm^i */
+ p_header_data+=4;
+ p_header_size-=4;
+ }
+ else {
+ l_remaining_data = p_header_size;
+ break;
+ }
+
+ l_remaining_data = p_header_size;
+
+ /* Next Ippm series is a complete series ?*/
+ if (l_remaining_data >= l_N_ppm) {
+ OPJ_BYTE *new_ppm_data;
+ /* Increase the size of ppm_data to add the new Ippm series*/
+ assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+ new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+ if (! new_ppm_data) {
+ opj_free(l_cp->ppm_data);
+ l_cp->ppm_data = NULL;
+ l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+ l_cp->ppm_len = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n");
+ return OPJ_FALSE;
+ }
+ l_cp->ppm_data = new_ppm_data;
+ l_cp->ppm_buffer = l_cp->ppm_data;
+
+ /* Keep the position of the place where concatenate the new series */
+ l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+ l_cp->ppm_len += l_N_ppm;
+ }
+
+ }
+
+ /* Need to read an incomplete Ippm series*/
+ if (l_remaining_data) {
+ OPJ_BYTE *new_ppm_data;
+ assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating");
+ new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm);
+ if (! new_ppm_data) {
+ opj_free(l_cp->ppm_data);
+ l_cp->ppm_data = NULL;
+ l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */
+ l_cp->ppm_len = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (incomplete) Ippm series\n");
+ return OPJ_FALSE;
+ }
+ l_cp->ppm_data = new_ppm_data;
+ l_cp->ppm_buffer = l_cp->ppm_data;
+
+ /* Keep the position of the place where concatenate the new series*/
+ l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]);
+ l_cp->ppm_len += l_N_ppm;
+
+ /* Read incomplete Ippm series*/
+ memcpy(l_cp->ppm_data_current, p_header_data, l_remaining_data);
+ p_header_size -= l_remaining_data;
+ p_header_data += l_remaining_data;
+
+ l_cp->ppm_data_read += l_remaining_data; /* Increase the number of data read*/
+ }
+
+#ifdef CLEAN_MSD
+
+ if (l_cp->ppm_data_size == l_cp->ppm_len) {
+ if (p_header_size >= 4) {
+ /* read a N_ppm*/
+ opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */
+ p_header_data+=4;
+ p_header_size-=4;
+ l_cp->ppm_len += l_N_ppm ;
+
+ OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len);
+ if (! new_ppm_buffer) {
+ opj_free(l_cp->ppm_buffer);
+ l_cp->ppm_buffer = NULL;
+ l_cp->ppm_len = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n");
+ return OPJ_FALSE;
+ }
+ l_cp->ppm_buffer = new_ppm_buffer;
+ memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm);
+
+ l_cp->ppm_data = l_cp->ppm_buffer;
+ }
+ else {
+ return OPJ_FALSE;
+ }
+ }
+
+ l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size;
+
+ if (l_remaining_data <= p_header_size) {
+ /* we must store less information than available in the packet */
+ memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data);
+ l_cp->ppm_data_size = l_cp->ppm_len;
+ p_header_size -= l_remaining_data;
+ p_header_data += l_remaining_data;
+ }
+ else {
+ memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size);
+ l_cp->ppm_data_size += p_header_size;
+ p_header_data += p_header_size;
+ p_header_size = 0;
+ break;
+ }
+ }
+#endif
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a PPT marker (Packed packet headers, tile-part header)
+ *
+ * @param p_header_data the data contained in the PPT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the PPT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_Z_ppt;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ /* We need to have the Z_ppt element at minimum */
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ if (l_cp->ppm){
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
+ return OPJ_FALSE;
+ }
+
+ l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
+ l_tcp->ppt = 1;
+
+ opj_read_bytes(p_header_data,&l_Z_ppt,1); /* Z_ppt */
+ ++p_header_data;
+ --p_header_size;
+
+ /* Allocate buffer to read the packet header */
+ if (l_Z_ppt == 0) {
+ /* First PPT marker */
+ l_tcp->ppt_data_size = 0;
+ l_tcp->ppt_len = p_header_size;
+
+ opj_free(l_tcp->ppt_buffer);
+ l_tcp->ppt_buffer = (OPJ_BYTE *) opj_calloc(l_tcp->ppt_len, sizeof(OPJ_BYTE) );
+ if (l_tcp->ppt_buffer == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+ return OPJ_FALSE;
+ }
+ l_tcp->ppt_data = l_tcp->ppt_buffer;
+
+ /* memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len); */
+ }
+ else {
+ OPJ_BYTE *new_ppt_buffer;
+ l_tcp->ppt_len += p_header_size;
+
+ new_ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer, l_tcp->ppt_len);
+ if (! new_ppt_buffer) {
+ opj_free(l_tcp->ppt_buffer);
+ l_tcp->ppt_buffer = NULL;
+ l_tcp->ppt_len = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+ return OPJ_FALSE;
+ }
+ l_tcp->ppt_buffer = new_ppt_buffer;
+ l_tcp->ppt_data = l_tcp->ppt_buffer;
+
+ memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size);
+ }
+
+ /* Read packet header from buffer */
+ memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size);
+
+ l_tcp->ppt_data_size += p_header_size;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_tlm_size;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
+
+ if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ /* change the way data is written to avoid seeking if possible */
+ /* TODO */
+ p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
+
+ opj_write_bytes(l_current_data,J2K_MS_TLM,2); /* TLM */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_tlm_size-2,2); /* Lpoc */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,0,1); /* Ztlm=0*/
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,0x50,1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
+ ++l_current_data;
+
+ /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ const opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ opj_write_bytes(p_data,J2K_MS_SOT,2); /* SOT */
+ p_data += 2;
+
+ opj_write_bytes(p_data,10,2); /* Lsot */
+ p_data += 2;
+
+ opj_write_bytes(p_data, p_j2k->m_current_tile_number,2); /* Isot */
+ p_data += 2;
+
+ /* Psot */
+ p_data += 4;
+
+ opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1); /* TPsot */
+ ++p_data;
+
+ opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1); /* TNsot */
+ ++p_data;
+
+ /* UniPG>> */
+#ifdef USE_JPWL
+ /* update markers struct */
+/*
+ OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
+*/
+ assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+
+ * p_data_written = 12;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager )
+{
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_tot_len, l_num_parts = 0;
+ OPJ_UINT32 l_current_part;
+ OPJ_UINT32 l_tile_x,l_tile_y;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
+ if (p_header_size != 8) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2); /* Isot */
+ p_header_data+=2;
+
+ /* testcase 2.pdf.SIGFPE.706.1112 */
+ if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n", p_j2k->m_current_tile_number);
+ return OPJ_FALSE;
+ }
+
+ l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+ l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
+ l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+
+ OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
+ static OPJ_UINT32 backup_tileno = 0;
+
+ /* tileno is negative or larger than the number of tiles!!! */
+ if (tileno > (l_cp->tw * l_cp->th)) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "JPWL: bad tile number (%d out of a maximum of %d)\n",
+ tileno, (l_cp->tw * l_cp->th));
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ tileno = backup_tileno;
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+ "- setting tile number to %d\n",
+ tileno);
+ }
+
+ /* keep your private count of tiles */
+ backup_tileno++;
+ };
+#endif /* USE_JPWL */
+
+ /* look for the tile in the list of already processed tile (in parts). */
+ /* Optimization possible here with a more complex data structure and with the removing of tiles */
+ /* since the time taken by this function can only grow at the time */
+
+ opj_read_bytes(p_header_data,&l_tot_len,4); /* Psot */
+ p_header_data+=4;
+
+ /* PSot should be equal to zero or >=14 or <= 2^32-1 */
+ if ((l_tot_len !=0 ) && (l_tot_len < 14) )
+ {
+ if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/
+ {
+ opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n", l_tot_len);
+ }
+ else
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
+ return OPJ_FALSE;
+ }
+ }
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+
+ /* totlen is negative or larger than the bytes left!!! */
+ if (/*(l_tot_len < 0) ||*/ (l_tot_len > p_header_size ) ) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
+ opj_event_msg(p_manager, EVT_ERROR,
+ "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
+ l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ l_tot_len = 0;
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+ "- setting Psot to %d => assuming it is the last tile\n",
+ l_tot_len);
+ }
+ };
+#endif /* USE_JPWL */
+
+ /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
+ if (!l_tot_len) {
+ opj_event_msg(p_manager, EVT_INFO, "Psot value of the current tile-part is equal to zero, "
+ "we assuming it is the last tile-part of the codestream.\n");
+ p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+ }
+
+ opj_read_bytes(p_header_data,&l_current_part ,1); /* TPsot */
+ ++p_header_data;
+
+ opj_read_bytes(p_header_data,&l_num_parts ,1); /* TNsot */
+ ++p_header_data;
+
+ if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */
+ /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
+ * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
+ if (l_tcp->m_nb_tile_parts) {
+ if (l_current_part >= l_tcp->m_nb_tile_parts){
+ opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
+ "number of tile-part (%d), giving up\n", l_current_part, l_tcp->m_nb_tile_parts );
+ // p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+ // return OPJ_FALSE;
+
+ l_num_parts++;
+ }
+ }
+ if( l_current_part >= l_num_parts ) {
+ /* testcase 451.pdf.SIGSEGV.ce9.3723 */
+ opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
+ "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts );
+ p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+ return OPJ_FALSE;
+ }
+ l_tcp->m_nb_tile_parts = l_num_parts;
+ }
+
+ /* If know the number of tile part header we will check if we didn't read the last*/
+ if (l_tcp->m_nb_tile_parts) {
+ if (l_tcp->m_nb_tile_parts == (l_current_part+1)) {
+ p_j2k->m_specific_param.m_decoder.m_can_decode = 0; /* Process the last tile-part header*/
+ }
+ }
+
+ if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){
+ /* Keep the size of data to skip after this marker */
+ p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */
+ }
+ else {
+ /* FIXME: need to be computed from the number of bytes remaining in the codestream */
+ p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
+ }
+
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
+
+ /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
+ if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
+ p_j2k->m_specific_param.m_decoder.m_skip_data =
+ (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
+ || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
+ || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
+ || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
+ }
+ else {
+ assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 );
+ p_j2k->m_specific_param.m_decoder.m_skip_data =
+ (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
+ }
+
+ /* Index */
+ if (p_j2k->cstr_index)
+ {
+ assert(p_j2k->cstr_index->tile_index != 00);
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part;
+
+ if (l_num_parts != 0){
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts;
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts;
+
+ if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+ (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
+ }
+ else {
+ opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t));
+ if (! new_tp_index) {
+ opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
+ }
+ }
+ else{
+ /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
+
+ if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+ (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
+ sizeof(opj_tp_index_t));
+ }
+
+ if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){
+ opj_tp_index_t *new_tp_index;
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1;
+ new_tp_index = (opj_tp_index_t *) opj_realloc(
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t));
+ if (! new_tp_index) {
+ opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
+ }
+ }
+
+ }
+
+ }
+
+ /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */
+ /* if (p_j2k->cstr_info) {
+ if (l_tcp->first) {
+ if (tileno == 0) {
+ p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
+ }
+
+ p_j2k->cstr_info->tile[tileno].tileno = tileno;
+ p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
+ p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
+ p_j2k->cstr_info->tile[tileno].num_tps = numparts;
+
+ if (numparts) {
+ p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
+ }
+ else {
+ p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
+ }
+ }
+ else {
+ p_j2k->cstr_info->tile[tileno].end_pos += totlen;
+ }
+
+ p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
+ p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
+ p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
+ }*/
+ return OPJ_TRUE;
+ }
+
+OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k,
+ opj_tcd_t * p_tile_coder,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ const opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_codestream_info_t *l_cstr_info = 00;
+ OPJ_UINT32 l_remaining_data;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ opj_write_bytes(p_data,J2K_MS_SOD,2); /* SOD */
+ p_data += 2;
+
+ /* make room for the EOF marker */
+ l_remaining_data = p_total_data_size - 4;
+
+ /* update tile coder */
+ p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
+ p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+
+ /* INDEX >> */
+ /* TODO mergeV2: check this part which use cstr_info */
+ /*l_cstr_info = p_j2k->cstr_info;
+ if (l_cstr_info) {
+ if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
+ //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
+ l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
+ }
+ else {*/
+ /*
+ TODO
+ if
+ (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
+ {
+ cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
+ }*/
+ /*}*/
+ /* UniPG>> */
+#ifdef USE_JPWL
+ /* update markers struct */
+ /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
+*/
+ assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+ /* <<UniPG */
+ /*}*/
+ /* << INDEX */
+
+ if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
+ p_tile_coder->tcd_image->tiles->packno = 0;
+ if (l_cstr_info) {
+ l_cstr_info->packno = 0;
+ }
+ }
+
+ *p_data_written = 0;
+
+ if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
+ return OPJ_FALSE;
+ }
+
+ *p_data_written += 2;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_SIZE_T l_current_read_size;
+ opj_codestream_index_t * l_cstr_index = 00;
+ OPJ_BYTE ** l_current_data = 00;
+ opj_tcp_t * l_tcp = 00;
+ OPJ_UINT32 * l_tile_len = 00;
+ OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+
+ if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
+ /* opj_stream_get_number_byte_left returns OPJ_OFF_T
+ // but we are in the last tile part,
+ // so its result will fit on OPJ_UINT32 unless we find
+ // a file with a single tile part of more than 4 GB...*/
+ p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2);
+ }
+ else {
+ /* Check to avoid pass the limit of OPJ_UINT32 */
+ if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 )
+ p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
+ else {
+ /* MSD: case commented to support empty SOT marker (PHR data) */
+ }
+ }
+
+ l_current_data = &(l_tcp->m_data);
+ l_tile_len = &l_tcp->m_data_size;
+
+ /* Patch to support new PHR data */
+ if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
+ if (! *l_current_data) {
+ /* LH: oddly enough, in this path, l_tile_len!=0.
+ * TODO: If this was consistant, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
+ */
+ *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);
+ }
+ else {
+ OPJ_BYTE *l_new_current_data = NULL;
+ //BUGID: 0056005 and 0056022.
+ //test file: 366683_fuzz-asan_heap-oob_6bae99_3155_5245.pdf and fuzz-12.pdf.
+ if ((OPJ_UINT32)-1 - p_j2k->m_specific_param.m_decoder.m_sot_length >= *l_tile_len)
+ l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);
+ if (! l_new_current_data) {
+ opj_free(*l_current_data);
+ /*nothing more is done as l_current_data will be set to null, and just
+ afterward we enter in the error path
+ and the actual tile_len is updated (committed) at the end of the
+ function. */
+ }
+ *l_current_data = l_new_current_data;
+ }
+
+ if (*l_current_data == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ l_sot_length_pb_detected = OPJ_TRUE;
+ }
+
+ /* Index */
+ l_cstr_index = p_j2k->cstr_index;
+ if (l_cstr_index) {
+ OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
+
+ OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
+ l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header =
+ l_current_pos;
+ l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos =
+ l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
+
+ if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+ l_cstr_index,
+ J2K_MS_SOD,
+ l_current_pos,
+ p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+ return OPJ_FALSE;
+ }
+
+ /*l_cstr_index->packno = 0;*/
+ }
+
+ /* Patch to support new PHR data */
+ if (!l_sot_length_pb_detected) {
+ l_current_read_size = opj_stream_read_data(
+ p_stream,
+ *l_current_data + *l_tile_len,
+ p_j2k->m_specific_param.m_decoder.m_sot_length,
+ p_manager);
+ }
+ else
+ {
+ l_current_read_size = 0;
+ }
+
+ if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+ }
+ else {
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+ }
+
+ *l_tile_len += (OPJ_UINT32)l_current_read_size;
+
+ return OPJ_TRUE;
+}
+
+ OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_UINT32 nb_comps,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_rgn_size;
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+ OPJ_UINT32 l_comp_room;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_tile_no];
+ l_tccp = &l_tcp->tccps[p_comp_no];
+
+ if (nb_comps <= 256) {
+ l_comp_room = 1;
+ }
+ else {
+ l_comp_room = 2;
+ }
+
+ l_rgn_size = 6 + l_comp_room;
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_RGN,2); /* RGN */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_rgn_size-2,2); /* Lrgn */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,p_comp_no,l_comp_room); /* Crgn */
+ l_current_data+=l_comp_room;
+
+ opj_write_bytes(l_current_data, 0,1); /* Srgn */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1); /* SPrgn */
+ ++l_current_data;
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2); /* EOC */
+
+/* UniPG>> */
+#ifdef USE_JPWL
+ /* update markers struct */
+ /*
+ OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
+*/
+#endif /* USE_JPWL */
+
+ if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) {
+ return OPJ_FALSE;
+ }
+
+ if ( ! opj_stream_flush(p_stream,p_manager) ) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a RGN marker (Region Of Interest)
+ *
+ * @param p_header_data the data contained in the POC box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the POC marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_nb_comp;
+ opj_image_t * l_image = 00;
+
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
+
+ /* preconditions*/
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_nb_comp = l_image->numcomps;
+
+ if (l_nb_comp <= 256) {
+ l_comp_room = 1; }
+ else {
+ l_comp_room = 2; }
+
+ if (p_header_size != 2 + l_comp_room) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ opj_read_bytes(p_header_data,&l_comp_no,l_comp_room); /* Crgn */
+ p_header_data+=l_comp_room;
+ opj_read_bytes(p_header_data,&l_roi_sty,1); /* Srgn */
+ ++p_header_data;
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+ /* totlen is negative or larger than the bytes left!!! */
+ if (l_comp_room >= l_nb_comp) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "JPWL: bad component number in RGN (%d when there are only %d)\n",
+ l_comp_room, l_nb_comp);
+ if (!JPWL_ASSUME || JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ }
+ };
+#endif /* USE_JPWL */
+
+ /* testcase 3635.pdf.asan.77.2930 */
+ if (l_comp_no >= l_nb_comp) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "bad component number in RGN (%d when there are only %d)\n",
+ l_comp_no, l_nb_comp);
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1); /* SPrgn */
+ ++p_header_data;
+
+ return OPJ_TRUE;
+
+}
+
+OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp)
+{
+ return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);
+}
+
+OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp)
+{
+ (void)p_tcp;
+ return 0;
+}
+
+OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ opj_cp_t * l_cp = 00;
+ opj_image_t * l_image = 00;
+ opj_tcp_t * l_tcp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+
+ OPJ_UINT32 i,j,k;
+ OPJ_INT32 l_x0,l_y0,l_x1,l_y1;
+ OPJ_FLOAT32 * l_rates = 0;
+ OPJ_FLOAT32 l_sot_remove;
+ OPJ_UINT32 l_bits_empty, l_size_pixel;
+ OPJ_UINT32 l_tile_size = 0;
+ OPJ_UINT32 l_last_res;
+ OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_image = p_j2k->m_private_image;
+ l_tcp = l_cp->tcps;
+
+ l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
+ l_size_pixel = l_image->numcomps * l_image->comps->prec;
+ l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw);
+
+ if (l_cp->m_specific_param.m_enc.m_tp_on) {
+ l_tp_stride_func = opj_j2k_get_tp_stride;
+ }
+ else {
+ l_tp_stride_func = opj_j2k_get_default_stride;
+ }
+
+ for (i=0;i<l_cp->th;++i) {
+ for (j=0;j<l_cp->tw;++j) {
+ OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers;
+
+ /* 4 borders of the tile rescale on the image if necessary */
+ l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0);
+ l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0);
+ l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);
+ l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);
+
+ l_rates = l_tcp->rates;
+
+ /* Modification of the RATE >> */
+ if (*l_rates) {
+ *l_rates = (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
+ /
+ ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+ )
+ -
+ l_offset;
+ }
+
+ ++l_rates;
+
+ for (k = 1; k < l_tcp->numlayers; ++k) {
+ if (*l_rates) {
+ *l_rates = (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
+ /
+ ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+ )
+ -
+ l_offset;
+ }
+
+ ++l_rates;
+ }
+
+ ++l_tcp;
+
+ }
+ }
+
+ l_tcp = l_cp->tcps;
+
+ for (i=0;i<l_cp->th;++i) {
+ for (j=0;j<l_cp->tw;++j) {
+ l_rates = l_tcp->rates;
+
+ if (*l_rates) {
+ *l_rates -= l_sot_remove;
+
+ if (*l_rates < 30) {
+ *l_rates = 30;
+ }
+ }
+
+ ++l_rates;
+
+ l_last_res = l_tcp->numlayers - 1;
+
+ for (k = 1; k < l_last_res; ++k) {
+
+ if (*l_rates) {
+ *l_rates -= l_sot_remove;
+
+ if (*l_rates < *(l_rates - 1) + 10) {
+ *l_rates = (*(l_rates - 1)) + 20;
+ }
+ }
+
+ ++l_rates;
+ }
+
+ if (*l_rates) {
+ *l_rates -= (l_sot_remove + 2.f);
+
+ if (*l_rates < *(l_rates - 1) + 10) {
+ *l_rates = (*(l_rates - 1)) + 20;
+ }
+ }
+
+ ++l_tcp;
+ }
+ }
+
+ l_img_comp = l_image->comps;
+ l_tile_size = 0;
+
+ for (i=0;i<l_image->numcomps;++i) {
+ l_tile_size += ( opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx)
+ *
+ opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy)
+ *
+ l_img_comp->prec
+ );
+
+ ++l_img_comp;
+ }
+
+ l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */
+
+ l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
+
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
+ (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
+ if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
+ return OPJ_FALSE;
+ }
+
+ if (l_cp->m_specific_param.m_enc.m_cinema) {
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
+ (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
+ if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+ return OPJ_FALSE;
+ }
+
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
+ }
+
+ return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 i;
+ opj_tcd_t * l_tcd = 00;
+ OPJ_UINT32 l_nb_tiles;
+ opj_tcp_t * l_tcp = 00;
+ OPJ_BOOL l_success;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+ l_tcp = p_j2k->m_cp.tcps;
+
+ l_tcd = opj_tcd_create(OPJ_TRUE);
+ if (l_tcd == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+ return OPJ_FALSE;
+ }
+
+ for (i = 0; i < l_nb_tiles; ++i) {
+ if (l_tcp->m_data) {
+ if (! opj_tcd_init_decode_tile(l_tcd, i)) {
+ opj_tcd_destroy(l_tcd);
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+ return OPJ_FALSE;
+ }
+
+ l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index);
+ /* cleanup */
+
+ if (! l_success) {
+ p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
+ break;
+ }
+ }
+
+ opj_j2k_tcp_destroy(l_tcp);
+ ++l_tcp;
+ }
+
+ opj_tcd_destroy(l_tcd);
+ return OPJ_TRUE;
+}
+#endif
+
+OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 i;
+ opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+ opj_mct_data_t * l_mct_record;
+ opj_tcp_t * l_tcp;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+ l_mct_record = l_tcp->m_mct_records;
+
+ for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+
+ if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ ++l_mct_record;
+ }
+
+ l_mcc_record = l_tcp->m_mcc_records;
+
+ for (i=0;i<l_tcp->m_nb_mcc_records;++i) {
+
+ if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ ++l_mcc_record;
+ }
+
+ if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+#if 0
+OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 compno;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
+ {
+ if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+#endif
+
+#if 0
+OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 compno;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
+ {
+ if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+#endif
+
+
+OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 compno;
+ const opj_tccp_t *l_tccp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tccp = p_j2k->m_cp.tcps->tccps;
+
+ for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) {
+ if (l_tccp->roishift) {
+
+ if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ ++l_tccp;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ opj_codestream_index_t * l_cstr_index = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_cstr_index = p_j2k->cstr_index;
+ if (l_cstr_index) {
+ l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
+ /* UniPG>> */
+ /* The following adjustment is done to adjust the codestream size */
+ /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
+ /* the first bunch of bytes is not in the codestream */
+ l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
+ /* <<UniPG */
+ }
+
+#ifdef USE_JPWL
+ /* preparation of JPWL marker segments */
+#if 0
+ if(cp->epc_on) {
+
+ /* encode according to JPWL */
+ jpwl_encode(p_j2k, p_stream, image);
+
+ }
+#endif
+ assert( 0 && "TODO" );
+#endif /* USE_JPWL */
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ OPJ_UINT32 *output_marker,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_unknown_marker;
+ const opj_dec_memory_marker_handler_t * l_marker_handler;
+ OPJ_UINT32 l_size_unk = 2;
+
+ /* preconditions*/
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
+
+ while(1) {
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* read 2 bytes as the new marker ID*/
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2);
+
+ if (!(l_unknown_marker < 0xff00)) {
+
+ /* Get the marker handler from the marker ID*/
+ l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
+
+ if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+ return OPJ_FALSE;
+ }
+ else {
+ if (l_marker_handler->id != J2K_MS_UNK) {
+ /* Add the marker to the codestream index*/
+ if (l_marker_handler->id != J2K_MS_SOT)
+ {
+ OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
+ (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
+ l_size_unk);
+ if (res == OPJ_FALSE) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+ return OPJ_FALSE;
+ }
+ }
+ break; /* next marker is known and well located */
+ }
+ else
+ l_size_unk += 2;
+ }
+ }
+ }
+
+ *output_marker = l_marker_handler->id ;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k,
+ opj_mct_data_t * p_mct_record,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 l_mct_size;
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_tmp;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_mct_size = 10 + p_mct_record->m_data_size;
+
+ if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_MCT,2); /* MCT */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_mct_size-2,2); /* Lmct */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,0,2); /* Zmct */
+ l_current_data += 2;
+
+ /* only one marker atm */
+ l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);
+
+ opj_write_bytes(l_current_data,l_tmp,2);
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,0,2); /* Ymct */
+ l_current_data+=2;
+
+ memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param p_header_data the data contained in the MCT box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the MCT marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mct ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i;
+ opj_tcp_t *l_tcp = 00;
+ OPJ_UINT32 l_tmp;
+ OPJ_UINT32 l_indix;
+ opj_mct_data_t * l_mct_data;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+
+ l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+ &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ if (p_header_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* first marker */
+ opj_read_bytes(p_header_data,&l_tmp,2); /* Zmct */
+ p_header_data += 2;
+ if (l_tmp != 0) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
+ return OPJ_TRUE;
+ }
+
+ if(p_header_size <= 6) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
+ opj_read_bytes(p_header_data,&l_tmp,2); /* Imct */
+ p_header_data += 2;
+
+ l_indix = l_tmp & 0xff;
+ l_mct_data = l_tcp->m_mct_records;
+
+ for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+ if (l_mct_data->m_index == l_indix) {
+ break;
+ }
+ ++l_mct_data;
+ }
+
+ /* NOT FOUND */
+ if (i == l_tcp->m_nb_mct_records) {
+ if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
+ opj_mct_data_t *new_mct_records;
+ l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+ new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records, l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+ if (! new_mct_records) {
+ opj_free(l_tcp->m_mct_records);
+ l_tcp->m_mct_records = NULL;
+ l_tcp->m_nb_max_mct_records = 0;
+ l_tcp->m_nb_mct_records = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
+ return OPJ_FALSE;
+ }
+ l_tcp->m_mct_records = new_mct_records;
+ l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+ memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+ }
+
+ l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+ }
+
+ if (l_mct_data->m_data) {
+ opj_free(l_mct_data->m_data);
+ l_mct_data->m_data = 00;
+ }
+
+ l_mct_data->m_index = l_indix;
+ l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp >> 8) & 3);
+ l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp >> 10) & 3);
+
+ opj_read_bytes(p_header_data,&l_tmp,2); /* Ymct */
+ p_header_data+=2;
+ if (l_tmp != 0) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
+ return OPJ_TRUE;
+ }
+
+ p_header_size -= 6;
+
+ l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
+ if (! l_mct_data->m_data) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+ return OPJ_FALSE;
+ }
+ memcpy(l_mct_data->m_data,p_header_data,p_header_size);
+
+ l_mct_data->m_data_size = p_header_size;
+ ++l_tcp->m_nb_mct_records;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k,
+ struct opj_simple_mcc_decorrelation_data * p_mcc_record,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_mcc_size;
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_nb_bytes_for_comp;
+ OPJ_UINT32 l_mask;
+ OPJ_UINT32 l_tmcc;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ if (p_mcc_record->m_nb_comps > 255 ) {
+ l_nb_bytes_for_comp = 2;
+ l_mask = 0x8000;
+ }
+ else {
+ l_nb_bytes_for_comp = 1;
+ l_mask = 0;
+ }
+
+ l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
+ if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
+ {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_MCC,2); /* MCC */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_mcc_size-2,2); /* Lmcc */
+ l_current_data += 2;
+
+ /* first marker */
+ opj_write_bytes(l_current_data,0,2); /* Zmcc */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,p_mcc_record->m_index,1); /* Imcc -> no need for other values, take the first */
+ ++l_current_data;
+
+ /* only one marker atm */
+ opj_write_bytes(l_current_data,0,2); /* Ymcc */
+ l_current_data+=2;
+
+ opj_write_bytes(l_current_data,1,2); /* Qmcc -> number of collections -> 1 */
+ l_current_data+=2;
+
+ opj_write_bytes(l_current_data,0x1,1); /* Xmcci type of component transformation -> array based decorrelation */
+ ++l_current_data;
+
+ opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2); /* Nmcci number of input components involved and size for each component offset = 8 bits */
+ l_current_data+=2;
+
+ for (i=0;i<p_mcc_record->m_nb_comps;++i) {
+ opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Cmccij Component offset*/
+ l_current_data+=l_nb_bytes_for_comp;
+ }
+
+ opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2); /* Mmcci number of output components involved and size for each component offset = 8 bits */
+ l_current_data+=2;
+
+ for (i=0;i<p_mcc_record->m_nb_comps;++i)
+ {
+ opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp); /* Wmccij Component offset*/
+ l_current_data+=l_nb_bytes_for_comp;
+ }
+
+ l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;
+
+ if (p_mcc_record->m_decorrelation_array) {
+ l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
+ }
+
+ if (p_mcc_record->m_offset_array) {
+ l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);
+ }
+
+ opj_write_bytes(l_current_data,l_tmcc,3); /* Tmcci : use MCT defined as number 1 and irreversible array based. */
+ l_current_data+=3;
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 i,j;
+ OPJ_UINT32 l_tmp;
+ OPJ_UINT32 l_indix;
+ opj_tcp_t * l_tcp;
+ opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+ opj_mct_data_t * l_mct_data;
+ OPJ_UINT32 l_nb_collections;
+ OPJ_UINT32 l_nb_comps;
+ OPJ_UINT32 l_nb_bytes_by_comp;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+ &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ if (p_header_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* first marker */
+ opj_read_bytes(p_header_data,&l_tmp,2); /* Zmcc */
+ p_header_data += 2;
+ if (l_tmp != 0) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
+ return OPJ_TRUE;
+ }
+
+ if (p_header_size < 7) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */
+ ++p_header_data;
+
+ l_mcc_record = l_tcp->m_mcc_records;
+
+ for(i=0;i<l_tcp->m_nb_mcc_records;++i) {
+ if (l_mcc_record->m_index == l_indix) {
+ break;
+ }
+ ++l_mcc_record;
+ }
+
+ /** NOT FOUND */
+ if (i == l_tcp->m_nb_mcc_records) {
+ if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
+ opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+ l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+ new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+ l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
+ if (! new_mcc_records) {
+ opj_free(l_tcp->m_mcc_records);
+ l_tcp->m_mcc_records = NULL;
+ l_tcp->m_nb_max_mcc_records = 0;
+ l_tcp->m_nb_mcc_records = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
+ return OPJ_FALSE;
+ }
+ l_tcp->m_mcc_records = new_mcc_records;
+ l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+ memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
+ }
+ l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+ }
+ l_mcc_record->m_index = l_indix;
+
+ /* only one marker atm */
+ opj_read_bytes(p_header_data,&l_tmp,2); /* Ymcc */
+ p_header_data+=2;
+ if (l_tmp != 0) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
+ return OPJ_TRUE;
+ }
+
+ opj_read_bytes(p_header_data,&l_nb_collections,2); /* Qmcc -> number of collections -> 1 */
+ p_header_data+=2;
+
+ if (l_nb_collections > 1) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n");
+ return OPJ_TRUE;
+ }
+
+ p_header_size -= 7;
+
+ for (i=0;i<l_nb_collections;++i) {
+ if (p_header_size < 3) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */
+ ++p_header_data;
+
+ if (l_tmp != 1) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n");
+ return OPJ_TRUE;
+ }
+
+ opj_read_bytes(p_header_data,&l_nb_comps,2);
+
+ p_header_data+=2;
+ p_header_size-=3;
+
+ l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
+ l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
+
+ if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
+
+ for (j=0;j<l_mcc_record->m_nb_comps;++j) {
+ opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Cmccij Component offset*/
+ p_header_data+=l_nb_bytes_by_comp;
+
+ if (l_tmp != j) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
+ return OPJ_TRUE;
+ }
+ }
+
+ opj_read_bytes(p_header_data,&l_nb_comps,2);
+ p_header_data+=2;
+
+ l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
+ l_nb_comps &= 0x7fff;
+
+ if (l_nb_comps != l_mcc_record->m_nb_comps) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n");
+ return OPJ_TRUE;
+ }
+
+ if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
+
+ for (j=0;j<l_mcc_record->m_nb_comps;++j) {
+ opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp); /* Wmccij Component offset*/
+ p_header_data+=l_nb_bytes_by_comp;
+
+ if (l_tmp != j) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
+ return OPJ_TRUE;
+ }
+ }
+
+ opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/
+ p_header_data += 3;
+
+ l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);
+ l_mcc_record->m_decorrelation_array = 00;
+ l_mcc_record->m_offset_array = 00;
+
+ l_indix = l_tmp & 0xff;
+ if (l_indix != 0) {
+ l_mct_data = l_tcp->m_mct_records;
+ for (j=0;j<l_tcp->m_nb_mct_records;++j) {
+ if (l_mct_data->m_index == l_indix) {
+ l_mcc_record->m_decorrelation_array = l_mct_data;
+ break;
+ }
+ ++l_mct_data;
+ }
+
+ if (l_mcc_record->m_decorrelation_array == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+ }
+
+ l_indix = (l_tmp >> 8) & 0xff;
+ if (l_indix != 0) {
+ l_mct_data = l_tcp->m_mct_records;
+ for (j=0;j<l_tcp->m_nb_mct_records;++j) {
+ if (l_mct_data->m_index == l_indix) {
+ l_mcc_record->m_offset_array = l_mct_data;
+ break;
+ }
+ ++l_mct_data;
+ }
+
+ if (l_mcc_record->m_offset_array == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+ }
+ }
+
+ if (p_header_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+ return OPJ_FALSE;
+ }
+
+ ++l_tcp->m_nb_mcc_records;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager
+ )
+{
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_mco_size;
+ opj_tcp_t * l_tcp = 00;
+ opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+ OPJ_UINT32 i;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ l_mco_size = 5 + l_tcp->m_nb_mcc_records;
+ if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
+ }
+
+ opj_write_bytes(l_current_data,J2K_MS_MCO,2); /* MCO */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_mco_size-2,2); /* Lmco */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1); /* Nmco : only one tranform stage*/
+ ++l_current_data;
+
+ l_mcc_record = l_tcp->m_mcc_records;
+ for (i=0;i<l_tcp->m_nb_mcc_records;++i) {
+ opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/
+ ++l_current_data;
+
+ ++l_mcc_record;
+ }
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a MCO marker (Multiple Component Transform Ordering)
+ *
+ * @param p_header_data the data contained in the MCO box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the MCO marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_tmp, i;
+ OPJ_UINT32 l_nb_stages;
+ opj_tcp_t * l_tcp;
+ opj_tccp_t * l_tccp;
+ opj_image_t * l_image;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+ &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ if (p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_nb_stages,1); /* Nmco : only one tranform stage*/
+ ++p_header_data;
+
+ if (l_nb_stages > 1) {
+ opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n");
+ return OPJ_TRUE;
+ }
+
+ if (p_header_size != l_nb_stages + 1) {
+ opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_tccp = l_tcp->tccps;
+
+ for (i=0;i<l_image->numcomps;++i) {
+ l_tccp->m_dc_level_shift = 0;
+ ++l_tccp;
+ }
+
+ if (l_tcp->m_mct_decoding_matrix) {
+ opj_free(l_tcp->m_mct_decoding_matrix);
+ l_tcp->m_mct_decoding_matrix = 00;
+ }
+
+ for (i=0;i<l_nb_stages;++i) {
+ opj_read_bytes(p_header_data,&l_tmp,1);
+ ++p_header_data;
+
+ if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index)
+{
+ OPJ_UINT32 i;
+ opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+ opj_mct_data_t * l_deco_array, * l_offset_array;
+ OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;
+ OPJ_UINT32 l_nb_elem;
+ OPJ_UINT32 * l_offset_data, * l_current_offset_data;
+ opj_tccp_t * l_tccp;
+
+ /* preconditions */
+ assert(p_tcp != 00);
+
+ l_mcc_record = p_tcp->m_mcc_records;
+
+ for (i=0;i<p_tcp->m_nb_mcc_records;++i) {
+ if (l_mcc_record->m_index == p_index) {
+ break;
+ }
+ }
+
+ if (i==p_tcp->m_nb_mcc_records) {
+ /** element discarded **/
+ return OPJ_TRUE;
+ }
+
+ if (l_mcc_record->m_nb_comps != p_image->numcomps) {
+ /** do not support number of comps != image */
+ return OPJ_TRUE;
+ }
+
+ l_deco_array = l_mcc_record->m_decorrelation_array;
+
+ if (l_deco_array) {
+ l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
+ if (l_deco_array->m_data_size != l_data_size) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_elem = p_image->numcomps * p_image->numcomps;
+ l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+ p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+
+ if (! p_tcp->m_mct_decoding_matrix ) {
+ return OPJ_FALSE;
+ }
+
+ j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);
+ }
+
+ l_offset_array = l_mcc_record->m_offset_array;
+
+ if (l_offset_array) {
+ l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
+ if (l_offset_array->m_data_size != l_data_size) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_elem = p_image->numcomps;
+ l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
+ l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
+
+ if (! l_offset_data ) {
+ return OPJ_FALSE;
+ }
+
+ j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);
+
+ l_tccp = p_tcp->tccps;
+ l_current_offset_data = l_offset_data;
+
+ for (i=0;i<p_image->numcomps;++i) {
+ l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++);
+ ++l_tccp;
+ }
+
+ opj_free(l_offset_data);
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_cbd_size;
+ OPJ_BYTE * l_current_data = 00;
+ opj_image_t *l_image = 00;
+ opj_image_comp_t * l_comp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
+
+ if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+ OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
+ if (! new_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
+ }
+
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+ opj_write_bytes(l_current_data,J2K_MS_CBD,2); /* CBD */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_cbd_size-2,2); /* L_CBD */
+ l_current_data += 2;
+
+ opj_write_bytes(l_current_data,l_image->numcomps, 2); /* Ncbd */
+ l_current_data+=2;
+
+ l_comp = l_image->comps;
+
+ for (i=0;i<l_image->numcomps;++i) {
+ opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1); /* Component bit depth */
+ ++l_current_data;
+
+ ++l_comp;
+ }
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a CBD marker (Component bit depth definition)
+ * @param p_header_data the data contained in the CBD box.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_header_size the size of the data contained in the CBD marker.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_read_cbd ( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_nb_comp,l_num_comp;
+ OPJ_UINT32 l_comp_def;
+ OPJ_UINT32 i;
+ opj_image_comp_t * l_comp = 00;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ l_num_comp = p_j2k->m_private_image->numcomps;
+
+ if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&l_nb_comp,2); /* Ncbd */
+ p_header_data+=2;
+
+ if (l_nb_comp != l_num_comp) {
+ opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+ return OPJ_FALSE;
+ }
+
+ l_comp = p_j2k->m_private_image->comps;
+ for (i=0;i<l_num_comp;++i) {
+ opj_read_bytes(p_header_data,&l_comp_def,1); /* Component bit depth */
+ ++p_header_data;
+ l_comp->sgnd = (l_comp_def>>7) & 1;
+ l_comp->prec = (l_comp_def&0x7f) + 1;
+ ++l_comp;
+ }
+
+ return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* J2K / JPT decoder interface */
+/* ----------------------------------------------------------------------- */
+
+void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
+{
+ if(j2k && parameters) {
+ j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
+ j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
+
+#ifdef USE_JPWL
+ j2k->m_cp.correct = parameters->jpwl_correct;
+ j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
+ j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
+#endif /* USE_JPWL */
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+/* J2K encoder interface */
+/* ----------------------------------------------------------------------- */
+
+opj_j2k_t* opj_j2k_create_compress(void)
+{
+ opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
+ if (!l_j2k) {
+ return NULL;
+ }
+
+ memset(l_j2k,0,sizeof(opj_j2k_t));
+
+ l_j2k->m_is_decoder = 0;
+ l_j2k->m_cp.m_is_decoder = 0;
+
+ l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
+ if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+ opj_j2k_destroy(l_j2k);
+ return NULL;
+ }
+
+ l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+
+ /* validation list creation*/
+ l_j2k->m_validation_list = opj_procedure_list_create();
+ if (! l_j2k->m_validation_list) {
+ opj_j2k_destroy(l_j2k);
+ return NULL;
+ }
+
+ /* execution list creation*/
+ l_j2k->m_procedure_list = opj_procedure_list_create();
+ if (! l_j2k->m_procedure_list) {
+ opj_j2k_destroy(l_j2k);
+ return NULL;
+ }
+
+ return l_j2k;
+}
+
+int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){
+ POC[0].tile = 1;
+ POC[0].resno0 = 0;
+ POC[0].compno0 = 0;
+ POC[0].layno1 = 1;
+ POC[0].resno1 = (OPJ_UINT32)(numres-1);
+ POC[0].compno1 = 3;
+ POC[0].prg1 = OPJ_CPRL;
+ POC[1].tile = 1;
+ POC[1].resno0 = (OPJ_UINT32)(numres-1);
+ POC[1].compno0 = 0;
+ POC[1].layno1 = 1;
+ POC[1].resno1 = (OPJ_UINT32)numres;
+ POC[1].compno1 = 3;
+ POC[1].prg1 = OPJ_CPRL;
+ return 2;
+}
+
+void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager)
+{
+ /* Configure cinema parameters */
+ OPJ_FLOAT32 max_rate = 0;
+ OPJ_FLOAT32 temp_rate = 0;
+ int i;
+
+ /* profile (Rsiz) */
+ switch (parameters->cp_cinema){
+ case OPJ_CINEMA2K_24:
+ case OPJ_CINEMA2K_48:
+ parameters->cp_rsiz = OPJ_CINEMA2K;
+ break;
+ case OPJ_CINEMA4K_24:
+ parameters->cp_rsiz = OPJ_CINEMA4K;
+ break;
+ case OPJ_OFF:
+ assert(0);
+ break;
+ }
+
+ /* No tiling */
+ parameters->tile_size_on = OPJ_FALSE;
+ parameters->cp_tdx=1;
+ parameters->cp_tdy=1;
+
+ /* One tile part for each component */
+ parameters->tp_flag = 'C';
+ parameters->tp_on = 1;
+
+ /* Tile and Image shall be at (0,0) */
+ parameters->cp_tx0 = 0;
+ parameters->cp_ty0 = 0;
+ parameters->image_offset_x0 = 0;
+ parameters->image_offset_y0 = 0;
+
+ /* Codeblock size= 32*32 */
+ parameters->cblockw_init = 32;
+ parameters->cblockh_init = 32;
+
+ /* Codeblock style: no mode switch enabled */
+ parameters->mode = 0;
+
+ /* No ROI */
+ parameters->roi_compno = -1;
+
+ /* No subsampling */
+ parameters->subsampling_dx = 1;
+ parameters->subsampling_dy = 1;
+
+ /* 9-7 transform */
+ parameters->irreversible = 1;
+
+ /* Number of layers */
+ if (parameters->tcp_numlayers > 1){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
+ "1 single quality layer"
+ "-> Number of layers forced to 1 (rather than %d)\n",
+ parameters->tcp_numlayers);
+ parameters->tcp_numlayers = 1;
+ }
+
+ /* Resolution levels */
+ switch (parameters->cp_cinema){
+ case OPJ_CINEMA2K_24:
+ case OPJ_CINEMA2K_48:
+ if(parameters->numresolution > 6){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+ "Number of decomposition levels <= 5\n"
+ "-> Number of decomposition levels forced to 5 (rather than %d)\n",
+ parameters->numresolution+1);
+ parameters->numresolution = 6;
+ }
+ break;
+ case OPJ_CINEMA4K_24:
+ if(parameters->numresolution < 2){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+ "Number of decomposition levels >= 1 && <= 6\n"
+ "-> Number of decomposition levels forced to 1 (rather than %d)\n",
+ parameters->numresolution+1);
+ parameters->numresolution = 1;
+ }else if(parameters->numresolution > 7){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+ "Number of decomposition levels >= 1 && <= 6\n"
+ "-> Number of decomposition levels forced to 6 (rather than %d)\n",
+ parameters->numresolution+1);
+ parameters->numresolution = 7;
+ }
+ break;
+ default :
+ break;
+ }
+
+ /* Precincts */
+ parameters->csty |= 0x01;
+ parameters->res_spec = parameters->numresolution-1;
+ for (i = 0; i<parameters->res_spec; i++) {
+ parameters->prcw_init[i] = 256;
+ parameters->prch_init[i] = 256;
+ }
+
+ /* The progression order shall be CPRL */
+ parameters->prog_order = OPJ_CPRL;
+
+ /* Progression order changes for 4K, disallowed for 2K */
+ if (parameters->cp_cinema == OPJ_CINEMA4K_24) {
+ parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution);
+ } else {
+ parameters->numpocs = 0;
+ }
+
+ /* Limited bit-rate */
+ parameters->cp_disto_alloc = 1;
+ switch (parameters->cp_cinema){
+ case OPJ_CINEMA2K_24:
+ case OPJ_CINEMA4K_24:
+ max_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
+ (OPJ_FLOAT32)(CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+ if (parameters->tcp_rates[0] == 0){
+ parameters->tcp_rates[0] = max_rate;
+ }else{
+ temp_rate =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
+ (parameters->tcp_rates[0] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);
+ if (temp_rate > CINEMA_24_CS ){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
+ "Maximum 1302083 compressed bytes @ 24fps\n"
+ "-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\n",
+ parameters->tcp_rates[0], max_rate);
+ parameters->tcp_rates[0]= max_rate;
+ }else{
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 and 4 (2k/4k dc profile):\n"
+ "INFO : Specified rate (%3.1f) is below the 2k/4k limit @ 24fps.\n",
+ parameters->tcp_rates[0]);
+ }
+ }
+ parameters->max_comp_size = COMP_24_CS;
+ break;
+ case OPJ_CINEMA2K_48:
+ max_rate = ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+ (float)(CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+ if (parameters->tcp_rates[0] == 0){
+ parameters->tcp_rates[0] = max_rate;
+ }else{
+ temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+ (parameters->tcp_rates[0] * 8 * (float)image->comps[0].dx * (float)image->comps[0].dy);
+ if (temp_rate > CINEMA_48_CS ){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+ "Maximum 651041 compressed bytes @ 48fps\n"
+ "-> Specified rate (%3.1f) exceeds this limit. Rate will be forced to %3.1f.\n",
+ parameters->tcp_rates[0], max_rate);
+ parameters->tcp_rates[0]= max_rate;
+ }else{
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile):\n"
+ "INFO : Specified rate (%3.1f) is below the 2k limit @ 48 fps.\n",
+ parameters->tcp_rates[0]);
+ }
+ }
+ parameters->max_comp_size = COMP_48_CS;
+ break;
+ default:
+ break;
+ }
+}
+
+OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_CINEMA_MODE cinema_mode, opj_event_mgr_t *p_manager)
+{
+ OPJ_UINT32 i;
+
+ /* Number of components */
+ if (image->numcomps != 3){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+ "3 components"
+ "-> Number of components of input image (%d) is not compliant\n"
+ "-> Non-profile-3 codestream will be generated\n",
+ image->numcomps);
+ return OPJ_FALSE;
+ }
+
+ /* Bitdepth */
+ for (i = 0; i < image->numcomps; i++) {
+ if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){
+ char signed_str[] = "signed";
+ char unsigned_str[] = "unsigned";
+ char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str;
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+ "Precision of each component shall be 12 bits unsigned"
+ "-> At least component %d of input image (%d bits, %s) is not compliant\n"
+ "-> Non-profile-3 codestream will be generated\n",
+ i,image->comps[i].bpp, tmp_str);
+ return OPJ_FALSE;
+ }
+ }
+
+ /* Image size */
+ switch (cinema_mode){
+ case OPJ_CINEMA2K_24:
+ case OPJ_CINEMA2K_48:
+ if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+ "width <= 2048 and height <= 1080\n"
+ "-> Input image size %d x %d is not compliant\n"
+ "-> Non-profile-3 codestream will be generated\n",
+ image->comps[0].w,image->comps[0].h);
+ return OPJ_FALSE;
+ }
+ break;
+ case OPJ_CINEMA4K_24:
+ if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+ "width <= 4096 and height <= 2160\n"
+ "-> Image size %d x %d is not compliant\n"
+ "-> Non-profile-4 codestream will be generated\n",
+ image->comps[0].w,image->comps[0].h);
+ return OPJ_FALSE;
+ }
+ break;
+ default :
+ break;
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_setup_encoder( opj_j2k_t *p_j2k,
+ opj_cparameters_t *parameters,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 i, j, tileno, numpocs_tile;
+ opj_cp_t *cp = 00;
+
+ if(!p_j2k || !parameters || ! image) {
+ return;
+ }
+
+ /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
+ cp = &(p_j2k->m_cp);
+
+ /* set default values for cp */
+ cp->tw = 1;
+ cp->th = 1;
+
+ /* set cinema parameters if required */
+ if (parameters->cp_cinema){
+ opj_j2k_set_cinema_parameters(parameters,image,p_manager);
+ if (!opj_j2k_is_cinema_compliant(image,parameters->cp_cinema,p_manager)) {
+ parameters->cp_rsiz = OPJ_STD_RSIZ;
+ }
+ }
+
+ /*
+ copy user encoding parameters
+ */
+ cp->m_specific_param.m_enc.m_cinema = parameters->cp_cinema;
+ cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size;
+ cp->rsiz = parameters->cp_rsiz;
+ cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u;
+ cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u;
+ cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u;
+
+ /* mod fixed_quality */
+ if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
+ size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
+ cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
+ memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);
+ }
+
+ /* tiles */
+ cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
+ cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
+
+ /* tile offset */
+ cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
+ cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
+
+ /* comment string */
+ if(parameters->cp_comment) {
+ cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
+ if(cp->comment) {
+ strcpy(cp->comment, parameters->cp_comment);
+ }
+ }
+
+ /*
+ calculate other encoding parameters
+ */
+
+ if (parameters->tile_size_on) {
+ cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0), (OPJ_INT32)cp->tdx);
+ cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0), (OPJ_INT32)cp->tdy);
+ } else {
+ cp->tdx = image->x1 - cp->tx0;
+ cp->tdy = image->y1 - cp->ty0;
+ }
+
+ if (parameters->tp_on) {
+ cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
+ cp->m_specific_param.m_enc.m_tp_on = 1;
+ }
+
+#ifdef USE_JPWL
+ /*
+ calculate JPWL encoding parameters
+ */
+
+ if (parameters->jpwl_epc_on) {
+ OPJ_INT32 i;
+
+ /* set JPWL on */
+ cp->epc_on = OPJ_TRUE;
+ cp->info_on = OPJ_FALSE; /* no informative technique */
+
+ /* set EPB on */
+ if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
+ cp->epb_on = OPJ_TRUE;
+
+ cp->hprot_MH = parameters->jpwl_hprot_MH;
+ for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+ cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
+ cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
+ }
+ /* if tile specs are not specified, copy MH specs */
+ if (cp->hprot_TPH[0] == -1) {
+ cp->hprot_TPH_tileno[0] = 0;
+ cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
+ }
+ for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+ cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
+ cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
+ cp->pprot[i] = parameters->jpwl_pprot[i];
+ }
+ }
+
+ /* set ESD writing */
+ if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
+ cp->esd_on = OPJ_TRUE;
+
+ cp->sens_size = parameters->jpwl_sens_size;
+ cp->sens_addr = parameters->jpwl_sens_addr;
+ cp->sens_range = parameters->jpwl_sens_range;
+
+ cp->sens_MH = parameters->jpwl_sens_MH;
+ for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+ cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
+ cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
+ }
+ }
+
+ /* always set RED writing to false: we are at the encoder */
+ cp->red_on = OPJ_FALSE;
+
+ } else {
+ cp->epc_on = OPJ_FALSE;
+ }
+#endif /* USE_JPWL */
+
+ /* initialize the mutiple tiles */
+ /* ---------------------------- */
+ cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
+ if (parameters->numpocs) {
+ /* initialisation of POC */
+ opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
+ /* TODO MSD use the return value*/
+ }
+
+ for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+ opj_tcp_t *tcp = &cp->tcps[tileno];
+ tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
+
+ for (j = 0; j < tcp->numlayers; j++) {
+ if(cp->m_specific_param.m_enc.m_cinema){
+ if (cp->m_specific_param.m_enc.m_fixed_quality) {
+ tcp->distoratio[j] = parameters->tcp_distoratio[j];
+ }
+ tcp->rates[j] = parameters->tcp_rates[j];
+ }else{
+ if (cp->m_specific_param.m_enc.m_fixed_quality) { /* add fixed_quality */
+ tcp->distoratio[j] = parameters->tcp_distoratio[j];
+ } else {
+ tcp->rates[j] = parameters->tcp_rates[j];
+ }
+ }
+ }
+
+ tcp->csty = (OPJ_UINT32)parameters->csty;
+ tcp->prg = parameters->prog_order;
+ tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
+
+ numpocs_tile = 0;
+ tcp->POC = 0;
+
+ if (parameters->numpocs) {
+ /* initialisation of POC */
+ tcp->POC = 1;
+ for (i = 0; i < parameters->numpocs; i++) {
+ if (tileno + 1 == parameters->POC[i].tile ) {
+ opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
+
+ tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
+ tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
+ tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
+ tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
+ tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
+ tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
+ tcp_poc->tile = parameters->POC[numpocs_tile].tile;
+
+ numpocs_tile++;
+ }
+ }
+
+ tcp->numpocs = numpocs_tile -1 ;
+ }else{
+ tcp->numpocs = 0;
+ }
+
+ tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
+
+ if (parameters->mct_data) {
+
+ OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+ OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+ OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);
+
+ tcp->mct = 2;
+ tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+ memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);
+ memcpy(lTmpBuf,parameters->mct_data,lMctSize);
+
+ tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+ assert(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps));
+
+ tcp->mct_norms = (OPJ_FLOAT64*)
+ opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
+
+ opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);
+ opj_free(lTmpBuf);
+
+ for (i = 0; i < image->numcomps; i++) {
+ opj_tccp_t *tccp = &tcp->tccps[i];
+ tccp->m_dc_level_shift = l_dc_shift[i];
+ }
+
+ opj_j2k_setup_mct_encoding(tcp,image);
+ }
+ else {
+ for (i = 0; i < image->numcomps; i++) {
+ opj_tccp_t *tccp = &tcp->tccps[i];
+ opj_image_comp_t * l_comp = &(image->comps[i]);
+
+ if (! l_comp->sgnd) {
+ tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
+ }
+ }
+ }
+
+ for (i = 0; i < image->numcomps; i++) {
+ opj_tccp_t *tccp = &tcp->tccps[i];
+
+ tccp->csty = parameters->csty & 0x01; /* 0 => one precinct || 1 => custom precinct */
+ tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
+ tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
+ tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
+ tccp->cblksty = (OPJ_UINT32)parameters->mode;
+ tccp->qmfbid = parameters->irreversible ? 0 : 1;
+ tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
+ tccp->numgbits = 2;
+
+ if ((OPJ_INT32)i == parameters->roi_compno) {
+ tccp->roishift = parameters->roi_shift;
+ } else {
+ tccp->roishift = 0;
+ }
+
+ if (parameters->csty & J2K_CCP_CSTY_PRT) {
+ OPJ_INT32 p = 0, it_res;
+ assert( tccp->numresolutions > 0 );
+ for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
+ if (p < parameters->res_spec) {
+
+ if (parameters->prcw_init[p] < 1) {
+ tccp->prcw[it_res] = 1;
+ } else {
+ tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
+ }
+
+ if (parameters->prch_init[p] < 1) {
+ tccp->prch[it_res] = 1;
+ }else {
+ tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
+ }
+
+ } else {
+ OPJ_INT32 res_spec = parameters->res_spec;
+ OPJ_INT32 size_prcw = 0;
+ OPJ_INT32 size_prch = 0;
+
+ assert(res_spec>0); /* issue 189 */
+ size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
+ size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
+
+
+ if (size_prcw < 1) {
+ tccp->prcw[it_res] = 1;
+ } else {
+ tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
+ }
+
+ if (size_prch < 1) {
+ tccp->prch[it_res] = 1;
+ } else {
+ tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
+ }
+ }
+ p++;
+ /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
+ } /*end for*/
+ } else {
+ for (j = 0; j < tccp->numresolutions; j++) {
+ tccp->prcw[j] = 15;
+ tccp->prch[j] = 15;
+ }
+ }
+
+ opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
+ }
+ }
+
+ if (parameters->mct_data) {
+ opj_free(parameters->mct_data);
+ parameters->mct_data = 00;
+ }
+}
+
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+{
+ assert(cstr_index != 00);
+
+ /* expand the list? */
+ if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
+ opj_marker_info_t *new_marker;
+ cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum);
+ new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t));
+ if (! new_marker) {
+ opj_free(cstr_index->marker);
+ cstr_index->marker = NULL;
+ cstr_index->maxmarknum = 0;
+ cstr_index->marknum = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
+ return OPJ_FALSE;
+ }
+ cstr_index->marker = new_marker;
+ }
+
+ /* add the marker */
+ cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
+ cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
+ cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
+ cstr_index->marknum++;
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+{
+ assert(cstr_index != 00);
+ assert(cstr_index->tile_index != 00);
+
+ /* expand the list? */
+ if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) {
+ opj_marker_info_t *new_marker;
+ cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
+ new_marker = (opj_marker_info_t *) opj_realloc(
+ cstr_index->tile_index[tileno].marker,
+ cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t));
+ if (! new_marker) {
+ opj_free(cstr_index->tile_index[tileno].marker);
+ cstr_index->tile_index[tileno].marker = NULL;
+ cstr_index->tile_index[tileno].maxmarknum = 0;
+ cstr_index->tile_index[tileno].marknum = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
+ return OPJ_FALSE;
+ }
+ cstr_index->tile_index[tileno].marker = new_marker;
+ }
+
+ /* add the marker */
+ cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type;
+ cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos;
+ cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len;
+ cstr_index->tile_index[tileno].marknum++;
+
+ if (type == J2K_MS_SOT) {
+ OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
+
+ if (cstr_index->tile_index[tileno].tp_index)
+ cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
+
+ }
+ return OPJ_TRUE;
+}
+
+/*
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ * -----------------------------------------------------------------------
+ */
+
+OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ (void)p_j2k;
+ (void)p_stream;
+ (void)p_manager;
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream,
+ opj_j2k_t* p_j2k,
+ opj_image_t** p_image,
+ opj_event_mgr_t* p_manager )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ /* create an empty image header */
+ p_j2k->m_private_image = opj_image_create0();
+ if (! p_j2k->m_private_image) {
+ return OPJ_FALSE;
+ }
+
+ /* customization of the validation */
+ opj_j2k_setup_decoding_validation(p_j2k);
+
+ /* validation of the parameters codec */
+ if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) {
+ opj_image_destroy(p_j2k->m_private_image);
+ p_j2k->m_private_image = NULL;
+ return OPJ_FALSE;
+ }
+
+ /* customization of the encoding */
+ opj_j2k_setup_header_reading(p_j2k);
+
+ /* read header */
+ if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+ opj_image_destroy(p_j2k->m_private_image);
+ p_j2k->m_private_image = NULL;
+ return OPJ_FALSE;
+ }
+
+ *p_image = opj_image_create0();
+ if (! (*p_image)) {
+ return OPJ_FALSE;
+ }
+
+ /* Copy codestream image information to the output image */
+ opj_copy_image_header(p_j2k->m_private_image, *p_image);
+
+ /*Allocate and initialize some elements of codestrem index*/
+ if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k)
+{
+ /* preconditions*/
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure);
+
+ /* DEVELOPER CORNER, add your custom procedures */
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd);
+
+}
+
+void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k)
+{
+ /* preconditions*/
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_decoder);
+ opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_decoding_validation);
+ /* DEVELOPER CORNER, add your custom validation procedure */
+
+}
+
+OPJ_BOOL opj_j2k_mct_validation ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_BOOL l_is_valid = OPJ_TRUE;
+ OPJ_UINT32 i,j;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
+ OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+ opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+
+ for (i=0;i<l_nb_tiles;++i) {
+ if (l_tcp->mct == 2) {
+ opj_tccp_t * l_tccp = l_tcp->tccps;
+ l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
+
+ for (j=0;j<p_j2k->m_private_image->numcomps;++j) {
+ l_is_valid &= ! (l_tccp->qmfbid & 1);
+ ++l_tccp;
+ }
+ }
+ ++l_tcp;
+ }
+ }
+
+ return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_indix = 1;
+ opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;
+ opj_simple_mcc_decorrelation_data_t * l_mcc_data;
+ OPJ_UINT32 l_mct_size,l_nb_elem;
+ OPJ_FLOAT32 * l_data, * l_current_data;
+ opj_tccp_t * l_tccp;
+
+ /* preconditions */
+ assert(p_tcp != 00);
+
+ if (p_tcp->mct != 2) {
+ return OPJ_TRUE;
+ }
+
+ if (p_tcp->m_mct_decoding_matrix) {
+ if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
+ opj_mct_data_t *new_mct_records;
+ p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+ new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+ if (! new_mct_records) {
+ opj_free(p_tcp->m_mct_records);
+ p_tcp->m_mct_records = NULL;
+ p_tcp->m_nb_max_mct_records = 0;
+ p_tcp->m_nb_mct_records = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+ return OPJ_FALSE;
+ }
+ p_tcp->m_mct_records = new_mct_records;
+ l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+ memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+ }
+ l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+ if (l_mct_deco_data->m_data) {
+ opj_free(l_mct_deco_data->m_data);
+ l_mct_deco_data->m_data = 00;
+ }
+
+ l_mct_deco_data->m_index = l_indix++;
+ l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
+ l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
+ l_nb_elem = p_image->numcomps * p_image->numcomps;
+ l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
+ l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
+
+ if (! l_mct_deco_data->m_data) {
+ return OPJ_FALSE;
+ }
+
+ j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);
+
+ l_mct_deco_data->m_data_size = l_mct_size;
+ ++p_tcp->m_nb_mct_records;
+ }
+
+ if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
+ opj_mct_data_t *new_mct_records;
+ p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+ new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+ if (! new_mct_records) {
+ opj_free(p_tcp->m_mct_records);
+ p_tcp->m_mct_records = NULL;
+ p_tcp->m_nb_max_mct_records = 0;
+ p_tcp->m_nb_mct_records = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+ return OPJ_FALSE;
+ }
+ p_tcp->m_mct_records = new_mct_records;
+ l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+ memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+
+ if (l_mct_deco_data) {
+ l_mct_deco_data = l_mct_offset_data - 1;
+ }
+ }
+
+ l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+ if (l_mct_offset_data->m_data) {
+ opj_free(l_mct_offset_data->m_data);
+ l_mct_offset_data->m_data = 00;
+ }
+
+ l_mct_offset_data->m_index = l_indix++;
+ l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
+ l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
+ l_nb_elem = p_image->numcomps;
+ l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
+ l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
+
+ if (! l_mct_offset_data->m_data) {
+ return OPJ_FALSE;
+ }
+
+ l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
+ if (! l_data) {
+ opj_free(l_mct_offset_data->m_data);
+ l_mct_offset_data->m_data = 00;
+ return OPJ_FALSE;
+ }
+
+ l_tccp = p_tcp->tccps;
+ l_current_data = l_data;
+
+ for (i=0;i<l_nb_elem;++i) {
+ *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);
+ ++l_tccp;
+ }
+
+ j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);
+
+ opj_free(l_data);
+
+ l_mct_offset_data->m_data_size = l_mct_size;
+
+ ++p_tcp->m_nb_mct_records;
+
+ if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
+ opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+ p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+ new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+ p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
+ if (! new_mcc_records) {
+ opj_free(p_tcp->m_mcc_records);
+ p_tcp->m_mcc_records = NULL;
+ p_tcp->m_nb_max_mcc_records = 0;
+ p_tcp->m_nb_mcc_records = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+ return OPJ_FALSE;
+ }
+ p_tcp->m_mcc_records = new_mcc_records;
+ l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
+ memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
+
+ }
+
+ l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
+ l_mcc_data->m_decorrelation_array = l_mct_deco_data;
+ l_mcc_data->m_is_irreversible = 1;
+ l_mcc_data->m_nb_comps = p_image->numcomps;
+ l_mcc_data->m_index = l_indix++;
+ l_mcc_data->m_offset_array = l_mct_offset_data;
+ ++p_tcp->m_nb_mcc_records;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ /* add here initialization of cp
+ copy paste of setup_decoder */
+ (void)p_j2k;
+ (void)p_stream;
+ (void)p_manager;
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ /* add here initialization of cp
+ copy paste of setup_encoder */
+ (void)p_j2k;
+ (void)p_stream;
+ (void)p_manager;
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_BOOL l_is_valid = OPJ_TRUE;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ /* STATE checking */
+ /* make sure the state is at 0 */
+ l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
+
+ /* POINTER validation */
+ /* make sure a p_j2k codec is present */
+ l_is_valid &= (p_j2k->m_procedure_list != 00);
+ /* make sure a validation list is present */
+ l_is_valid &= (p_j2k->m_validation_list != 00);
+
+ if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
+ return OPJ_FALSE;
+ }
+
+ if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << p_j2k->m_cp.tcps->tccps->numresolutions)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
+ return OPJ_FALSE;
+ }
+
+ /* PARAMETER VALIDATION */
+ return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_BOOL l_is_valid = OPJ_TRUE;
+
+ /* preconditions*/
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ /* STATE checking */
+ /* make sure the state is at 0 */
+#ifdef TODO_MSD
+ l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
+#endif
+ l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
+
+ /* POINTER validation */
+ /* make sure a p_j2k codec is present */
+ /* make sure a procedure list is present */
+ l_is_valid &= (p_j2k->m_procedure_list != 00);
+ /* make sure a validation list is present */
+ l_is_valid &= (p_j2k->m_validation_list != 00);
+
+ /* PARAMETER VALIDATION */
+ return l_is_valid;
+}
+
+OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 l_current_marker;
+ OPJ_UINT32 l_marker_size;
+ const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+
+ /* preconditions */
+ assert(p_stream != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ /* We enter in the main header */
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
+
+ /* Try to read the SOC marker, the codestream must begin with SOC marker */
+ if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
+ return OPJ_FALSE;
+ }
+
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* Read 2 bytes as the new marker ID */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+
+ /* Try to read until the SOT is detected */
+ while (l_current_marker != J2K_MS_SOT) {
+
+ /* Check if the current marker ID is valid */
+ if (l_current_marker < 0xff00) {
+ opj_event_msg(p_manager, EVT_ERROR, "We expected read a marker ID (0xff--) instead of %.8x\n", l_current_marker);
+ return OPJ_FALSE;
+ }
+
+ /* Get the marker handler from the marker ID */
+ l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+ /* Manage case where marker is unknown */
+ if (l_marker_handler->id == J2K_MS_UNK) {
+ if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){
+ opj_event_msg(p_manager, EVT_ERROR, "Unknow marker have been detected and generated error.\n");
+ return OPJ_FALSE;
+ }
+
+ if (l_current_marker == J2K_MS_SOT)
+ break; /* SOT marker is detected main header is completely read */
+ else /* Get the marker handler from the marker ID */
+ l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+ }
+
+ /* Check if the marker is known and if it is the right place to find it */
+ if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+ return OPJ_FALSE;
+ }
+
+ /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* read 2 bytes as the marker size */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
+ l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+ /* Check if the marker size is compatible with the header data size */
+ if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+ OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+ if (! new_header_data) {
+ opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+ p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+ p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+ p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+ }
+
+ /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* Read the marker segment with the correct marker handler */
+ if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Marker handler function failed to read the marker segment\n");
+ return OPJ_FALSE;
+ }
+
+ /* Add the marker to the codestream index*/
+ if (OPJ_FALSE == opj_j2k_add_mhmarker(
+ p_j2k->cstr_index,
+ l_marker_handler->id,
+ (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+ l_marker_size + 4 )) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* read 2 bytes as the new marker ID */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+ }
+
+ opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
+
+ /* Position of the last element if the main header */
+ p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
+
+ /* Next step: read a tile-part header */
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,
+ opj_procedure_list_t * p_procedure_list,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;
+ OPJ_BOOL l_result = OPJ_TRUE;
+ OPJ_UINT32 l_nb_proc, i;
+
+ /* preconditions*/
+ assert(p_procedure_list != 00);
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+ l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+
+ for (i=0;i<l_nb_proc;++i) {
+ l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));
+ ++l_procedure;
+ }
+
+ /* and clear the procedure list at the end.*/
+ opj_procedure_list_clear(p_procedure_list);
+ return l_result;
+}
+
+/* FIXME DOC*/
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_tcp_t * l_tcp = 00;
+ opj_tcp_t * l_default_tcp = 00;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 i,j;
+ opj_tccp_t *l_current_tccp = 00;
+ OPJ_UINT32 l_tccp_size;
+ OPJ_UINT32 l_mct_size;
+ opj_image_t * l_image;
+ OPJ_UINT32 l_mcc_records_size,l_mct_records_size;
+ opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
+ opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
+ OPJ_UINT32 l_offset;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ l_image = p_j2k->m_private_image;
+ l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+ l_tcp = p_j2k->m_cp.tcps;
+ l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
+ l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+ l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+
+ /* For each tile */
+ for (i=0; i<l_nb_tiles; ++i) {
+ /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
+ l_current_tccp = l_tcp->tccps;
+ /*Copy default coding parameters into the current tile coding parameters*/
+ memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
+ /* Initialize some values of the current tile coding parameters*/
+ l_tcp->ppt = 0;
+ l_tcp->ppt_data = 00;
+ /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
+ l_tcp->tccps = l_current_tccp;
+
+ /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
+ if (l_default_tcp->m_mct_decoding_matrix) {
+ l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+ if (! l_tcp->m_mct_decoding_matrix ) {
+ return OPJ_FALSE;
+ }
+ memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);
+ }
+
+ /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
+ l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t);
+ l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
+ if (! l_tcp->m_mct_records) {
+ return OPJ_FALSE;
+ }
+ memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);
+
+ /* Copy the mct record data from dflt_tile_cp to the current tile*/
+ l_src_mct_rec = l_default_tcp->m_mct_records;
+ l_dest_mct_rec = l_tcp->m_mct_records;
+
+ for (j=0;j<l_default_tcp->m_nb_mct_records;++j) {
+
+ if (l_src_mct_rec->m_data) {
+
+ l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
+ if(! l_dest_mct_rec->m_data) {
+ return OPJ_FALSE;
+ }
+ memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);
+ }
+
+ ++l_src_mct_rec;
+ ++l_dest_mct_rec;
+ }
+
+ /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
+ l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t);
+ l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size);
+ if (! l_tcp->m_mcc_records) {
+ return OPJ_FALSE;
+ }
+ memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);
+
+ /* Copy the mcc record data from dflt_tile_cp to the current tile*/
+ l_src_mcc_rec = l_default_tcp->m_mcc_records;
+ l_dest_mcc_rec = l_tcp->m_mcc_records;
+
+ for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) {
+
+ if (l_src_mcc_rec->m_decorrelation_array) {
+ l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records);
+ l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
+ }
+
+ if (l_src_mcc_rec->m_offset_array) {
+ l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records);
+ l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
+ }
+
+ ++l_src_mcc_rec;
+ ++l_dest_mcc_rec;
+ }
+
+ /* Copy all the dflt_tile_compo_cp to the current tile cp */
+ memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);
+
+ /* Move to next tile cp*/
+ ++l_tcp;
+ }
+
+ /* Create the current tile decoder*/
+ p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */
+ if (! p_j2k->m_tcd ) {
+ return OPJ_FALSE;
+ }
+
+ if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {
+ opj_tcd_destroy(p_j2k->m_tcd);
+ p_j2k->m_tcd = 00;
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id)
+{
+ const opj_dec_memory_marker_handler_t *e;
+ for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
+ if (e->id == p_id) {
+ break; /* we find a handler corresponding to the marker ID*/
+ }
+ }
+ return e;
+}
+
+void opj_j2k_destroy (opj_j2k_t *p_j2k)
+{
+ if (p_j2k == 00) {
+ return;
+ }
+
+ if (p_j2k->m_is_decoder) {
+
+ if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
+ opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+ opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+ p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
+ }
+
+ if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
+ opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+ p_j2k->m_specific_param.m_decoder.m_header_data = 00;
+ p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+ }
+ }
+ else {
+
+ if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
+ }
+
+ if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
+ }
+
+ if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+ }
+ }
+
+ opj_tcd_destroy(p_j2k->m_tcd);
+
+ opj_j2k_cp_destroy(&(p_j2k->m_cp));
+ memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
+
+ opj_procedure_list_destroy(p_j2k->m_procedure_list);
+ p_j2k->m_procedure_list = 00;
+
+ opj_procedure_list_destroy(p_j2k->m_validation_list);
+ p_j2k->m_procedure_list = 00;
+
+ j2k_destroy_cstr_index(p_j2k->cstr_index);
+ p_j2k->cstr_index = NULL;
+
+ opj_image_destroy(p_j2k->m_private_image);
+ p_j2k->m_private_image = NULL;
+
+ opj_image_destroy(p_j2k->m_output_image);
+ p_j2k->m_output_image = NULL;
+
+ opj_free(p_j2k);
+}
+
+void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)
+{
+ if (p_cstr_ind) {
+
+ if (p_cstr_ind->marker) {
+ opj_free(p_cstr_ind->marker);
+ p_cstr_ind->marker = NULL;
+ }
+
+ if (p_cstr_ind->tile_index) {
+ OPJ_UINT32 it_tile = 0;
+
+ for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
+
+ if(p_cstr_ind->tile_index[it_tile].packet_index) {
+ opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
+ p_cstr_ind->tile_index[it_tile].packet_index = NULL;
+ }
+
+ if(p_cstr_ind->tile_index[it_tile].tp_index){
+ opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
+ p_cstr_ind->tile_index[it_tile].tp_index = NULL;
+ }
+
+ if(p_cstr_ind->tile_index[it_tile].marker){
+ opj_free(p_cstr_ind->tile_index[it_tile].marker);
+ p_cstr_ind->tile_index[it_tile].marker = NULL;
+
+ }
+ }
+
+ opj_free( p_cstr_ind->tile_index);
+ p_cstr_ind->tile_index = NULL;
+ }
+
+ opj_free(p_cstr_ind);
+ }
+}
+
+void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)
+{
+ if (p_tcp == 00) {
+ return;
+ }
+
+ if (p_tcp->ppt_buffer != 00) {
+ opj_free(p_tcp->ppt_buffer);
+ p_tcp->ppt_buffer = 00;
+ }
+
+ if (p_tcp->tccps != 00) {
+ opj_free(p_tcp->tccps);
+ p_tcp->tccps = 00;
+ }
+
+ if (p_tcp->m_mct_coding_matrix != 00) {
+ opj_free(p_tcp->m_mct_coding_matrix);
+ p_tcp->m_mct_coding_matrix = 00;
+ }
+
+ if (p_tcp->m_mct_decoding_matrix != 00) {
+ opj_free(p_tcp->m_mct_decoding_matrix);
+ p_tcp->m_mct_decoding_matrix = 00;
+ }
+
+ if (p_tcp->m_mcc_records) {
+ opj_free(p_tcp->m_mcc_records);
+ p_tcp->m_mcc_records = 00;
+ p_tcp->m_nb_max_mcc_records = 0;
+ p_tcp->m_nb_mcc_records = 0;
+ }
+
+ if (p_tcp->m_mct_records) {
+ opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
+ OPJ_UINT32 i;
+
+ for (i=0;i<p_tcp->m_nb_mct_records;++i) {
+ if (l_mct_data->m_data) {
+ opj_free(l_mct_data->m_data);
+ l_mct_data->m_data = 00;
+ }
+
+ ++l_mct_data;
+ }
+
+ opj_free(p_tcp->m_mct_records);
+ p_tcp->m_mct_records = 00;
+ }
+
+ if (p_tcp->mct_norms != 00) {
+ opj_free(p_tcp->mct_norms);
+ p_tcp->mct_norms = 00;
+ }
+
+ opj_j2k_tcp_data_destroy(p_tcp);
+
+}
+
+void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)
+{
+ if (p_tcp->m_data) {
+ opj_free(p_tcp->m_data);
+ p_tcp->m_data = NULL;
+ p_tcp->m_data_size = 0;
+ }
+}
+
+void opj_j2k_cp_destroy (opj_cp_t *p_cp)
+{
+ OPJ_UINT32 l_nb_tiles;
+ opj_tcp_t * l_current_tile = 00;
+ OPJ_UINT32 i;
+
+ if (p_cp == 00)
+ {
+ return;
+ }
+ if (p_cp->tcps != 00)
+ {
+ l_current_tile = p_cp->tcps;
+ l_nb_tiles = p_cp->th * p_cp->tw;
+
+ for (i = 0; i < l_nb_tiles; ++i)
+ {
+ opj_j2k_tcp_destroy(l_current_tile);
+ ++l_current_tile;
+ }
+ opj_free(p_cp->tcps);
+ p_cp->tcps = 00;
+ }
+ opj_free(p_cp->ppm_buffer);
+ p_cp->ppm_buffer = 00;
+ p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
+ opj_free(p_cp->comment);
+ p_cp->comment = 00;
+ if (! p_cp->m_is_decoder)
+ {
+ opj_free(p_cp->m_specific_param.m_enc.m_matrice);
+ p_cp->m_specific_param.m_enc.m_matrice = 00;
+ }
+}
+
+OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_go_on,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 l_current_marker = J2K_MS_SOT;
+ OPJ_UINT32 l_marker_size;
+ const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+ opj_tcp_t * l_tcp = NULL;
+ OPJ_UINT32 l_nb_tiles;
+
+ /* preconditions */
+ assert(p_stream != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ /* Reach the End Of Codestream ?*/
+ if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){
+ l_current_marker = J2K_MS_EOC;
+ }
+ /* We need to encounter a SOT marker (a new tile-part header) */
+ else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){
+ return OPJ_FALSE;
+ }
+
+ /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
+ while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {
+
+ /* Try to read until the Start Of Data is detected */
+ while (l_current_marker != J2K_MS_SOD) {
+
+ if(opj_stream_get_number_byte_left(p_stream) == 0)
+ {
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+ break;
+ }
+
+ /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* Read 2 bytes from the buffer as the marker size */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
+
+ /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
+ if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) {
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+ break;
+ }
+
+ /* Why this condition? FIXME */
+ if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){
+ p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
+ }
+ l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+ /* Get the marker handler from the marker ID */
+ l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+ /* Check if the marker is known and if it is the right place to find it */
+ if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
+ return OPJ_FALSE;
+ }
+/* FIXME manage case of unknown marker as in the main header ? */
+
+ /* Check if the marker size is compatible with the header data size */
+ if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+ OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+ if (! new_header_data) {
+ opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+ p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+ p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+ p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+ }
+
+ /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ if (!l_marker_handler->handler) {
+ /* See issue #175 */
+ opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
+ return OPJ_FALSE;
+ }
+ /* Read the marker segment with the correct marker handler */
+ if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Fail to read the current marker segment (%#x)\n", l_current_marker);
+ return OPJ_FALSE;
+ }
+
+ /* Add the marker to the codestream index*/
+ if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+ p_j2k->cstr_index,
+ l_marker_handler->id,
+ (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+ l_marker_size + 4 )) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+ return OPJ_FALSE;
+ }
+
+ /* Keep the position of the last SOT marker read */
+ if ( l_marker_handler->id == J2K_MS_SOT ) {
+ OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ;
+ if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos)
+ {
+ p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
+ }
+ }
+
+ if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
+ /* Skip the rest of the tile part header*/
+ if (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+ l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
+ }
+ else {
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+ /* Read 2 bytes from the buffer as the new marker ID */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+ }
+ }
+ if(opj_stream_get_number_byte_left(p_stream) == 0
+ && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
+ break;
+
+ /* If we didn't skip data before, we need to read the SOD marker*/
+ if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
+ /* Try to read the SOD marker and skip data ? FIXME */
+ if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ if (! p_j2k->m_specific_param.m_decoder.m_can_decode){
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+ while(1) //liang
+ {
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* Read 2 bytes from buffer as the new marker ID */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+ if((l_current_marker & 0xff00) == 0xff00) break;
+ }
+ }
+ }
+ else {
+ /* Indicate we will try to read a new tile-part header*/
+ p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
+ p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+ /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+ if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ /* Read 2 bytes from buffer as the new marker ID */
+ opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
+ }
+ }
+
+ /* Current marker is the EOC marker ?*/
+ if (l_current_marker == J2K_MS_EOC) {
+ if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){
+ p_j2k->m_current_tile_number = 0;
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
+ }
+ }
+
+ /* FIXME DOC ???*/
+ if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) {
+ l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
+ l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+
+ while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) {
+ ++p_j2k->m_current_tile_number;
+ ++l_tcp;
+ }
+
+ if (p_j2k->m_current_tile_number == l_nb_tiles) {
+ *p_go_on = OPJ_FALSE;
+ return OPJ_TRUE;
+ }
+ }
+
+ /*FIXME ???*/
+ if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+ return OPJ_FALSE;
+ }
+
+ opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
+ p_j2k->m_current_tile_number, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+
+ *p_tile_index = p_j2k->m_current_tile_number;
+ *p_go_on = OPJ_TRUE;
+ *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
+ *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
+ *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
+ *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
+ *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
+ *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
+
+ p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_decode_tile ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 l_current_marker;
+ OPJ_BYTE l_data [2];
+ opj_tcp_t * l_tcp;
+
+ /* preconditions */
+ assert(p_stream != 00);
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+
+ if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)
+ || (p_tile_index != p_j2k->m_current_tile_number) ) {
+ return OPJ_FALSE;
+ }
+
+ l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
+ if (! l_tcp->m_data) {
+ opj_j2k_tcp_destroy(l_tcp);
+ return OPJ_FALSE;
+ }
+
+ if (! opj_tcd_decode_tile( p_j2k->m_tcd,
+ l_tcp->m_data,
+ l_tcp->m_data_size,
+ p_tile_index,
+ p_j2k->cstr_index) ) {
+ opj_j2k_tcp_destroy(l_tcp);
+ p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
+ return OPJ_FALSE;
+ }
+
+ if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
+ return OPJ_FALSE;
+ }
+
+ /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
+ * we destroy just the data which will be re-read in read_tile_header*/
+ /*opj_j2k_tcp_destroy(l_tcp);
+ p_j2k->m_tcd->tcp = 0;*/
+ opj_j2k_tcp_data_destroy(l_tcp);
+
+ p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+ p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/
+
+ if(opj_stream_get_number_byte_left(p_stream) == 0
+ && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){
+ return OPJ_TRUE;
+ }
+
+ if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/
+ if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(l_data,&l_current_marker,2);
+
+ if (l_current_marker == J2K_MS_EOC) {
+ p_j2k->m_current_tile_number = 0;
+ p_j2k->m_specific_param.m_decoder.m_state = 0x0100;/*FIXME J2K_DEC_STATE_EOC;*/
+ }
+ else if (l_current_marker != J2K_MS_SOT)
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
+
+ if(opj_stream_get_number_byte_left(p_stream) == 0) {
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+ return OPJ_TRUE;
+ }
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image)
+{
+ OPJ_UINT32 i,j,k = 0;
+ OPJ_UINT32 l_width_src,l_height_src;
+ OPJ_UINT32 l_width_dest,l_height_dest;
+ OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
+ OPJ_INT32 l_start_offset_src, l_line_offset_src, l_end_offset_src ;
+ OPJ_UINT32 l_start_x_dest , l_start_y_dest;
+ OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
+ OPJ_INT32 l_start_offset_dest, l_line_offset_dest;
+
+ opj_image_comp_t * l_img_comp_src = 00;
+ opj_image_comp_t * l_img_comp_dest = 00;
+
+ opj_tcd_tilecomp_t * l_tilec = 00;
+ opj_image_t * l_image_src = 00;
+ OPJ_UINT32 l_size_comp, l_remaining;
+ OPJ_INT32 * l_dest_ptr;
+ opj_tcd_resolution_t* l_res= 00;
+
+ l_tilec = p_tcd->tcd_image->tiles->comps;
+ l_image_src = p_tcd->image;
+ l_img_comp_src = l_image_src->comps;
+
+ l_img_comp_dest = p_output_image->comps;
+
+ for (i=0; i<l_image_src->numcomps; i++) {
+
+ /* Allocate output component buffer if necessary */
+ if (!l_img_comp_dest->data) {
+
+ l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(l_img_comp_dest->w * l_img_comp_dest->h, sizeof(OPJ_INT32));
+ if (! l_img_comp_dest->data) {
+ return OPJ_FALSE;
+ }
+ }
+
+ /* Copy info from decoded comp image to output image */
+ l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
+
+ /*-----*/
+ /* Compute the precision of the output buffer */
+ l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/
+ l_remaining = l_img_comp_src->prec & 7; /* (%8) */
+ l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;
+
+ if (l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+ /*-----*/
+
+ /* Current tile component size*/
+ /*if (i == 0) {
+ fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
+ l_res->x0, l_res->x1, l_res->y0, l_res->y1);
+ }*/
+
+ l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+ l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+
+ /* Border of the current output component*/
+ l_x0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->x0, (OPJ_INT32)l_img_comp_dest->factor);
+ l_y0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->y0, (OPJ_INT32)l_img_comp_dest->factor);
+ l_x1_dest = l_x0_dest + l_img_comp_dest->w;
+ l_y1_dest = l_y0_dest + l_img_comp_dest->h;
+
+ /*if (i == 0) {
+ fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
+ l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
+ }*/
+
+ /*-----*/
+ /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
+ * of the input buffer (decoded tile component) which will be move
+ * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
+ * l_start_y_dest, l_width_dest, l_height_dest) which will be modified
+ * by this input area.
+ * */
+ assert( l_res->x0 >= 0);
+ assert( l_res->x1 >= 0);
+ if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {
+ l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
+ l_offset_x0_src = 0;
+
+ if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
+ l_width_dest = l_width_src;
+ l_offset_x1_src = 0;
+ }
+ else {
+ l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;
+ l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
+ }
+ }
+ else {
+ l_start_x_dest = 0 ;
+ l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;
+
+ if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
+ l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
+ l_offset_x1_src = 0;
+ }
+ else {
+ l_width_dest = l_img_comp_dest->w ;
+ l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;
+ }
+ }
+
+ if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) {
+ l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;
+ l_offset_y0_src = 0;
+
+ if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
+ l_height_dest = l_height_src;
+ l_offset_y1_src = 0;
+ }
+ else {
+ l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;
+ l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
+ }
+ }
+ else {
+ l_start_y_dest = 0 ;
+ l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;
+
+ if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
+ l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
+ l_offset_y1_src = 0;
+ }
+ else {
+ l_height_dest = l_img_comp_dest->h ;
+ l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;
+ }
+ }
+
+ if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){
+ return OPJ_FALSE;
+ }
+ /* testcase 2977.pdf.asan.67.2198 */
+ if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
+ return OPJ_FALSE;
+ }
+ /*-----*/
+
+ /* Compute the input buffer offset */
+ l_start_offset_src = l_offset_x0_src + l_offset_y0_src * (OPJ_INT32)l_width_src;
+ l_line_offset_src = l_offset_x1_src + l_offset_x0_src;
+ l_end_offset_src = l_offset_y1_src * (OPJ_INT32)l_width_src - l_offset_x0_src;
+
+ /* Compute the output buffer offset */
+ l_start_offset_dest = (OPJ_INT32)(l_start_x_dest + l_start_y_dest * l_img_comp_dest->w);
+ l_line_offset_dest = (OPJ_INT32)(l_img_comp_dest->w - l_width_dest);
+
+ /* Move the output buffer to the first place where we will write*/
+ l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
+
+ /*if (i == 0) {
+ fprintf(stdout, "COMPO[%d]:\n",i);
+ fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n"
+ "\t tile offset:%d, %d, %d, %d\n"
+ "\t buffer offset: %d; %d, %d\n",
+ l_res->x0, l_res->y0, l_width_src, l_height_src,
+ l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,
+ l_start_offset_src, l_line_offset_src, l_end_offset_src);
+
+ fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n"
+ "\t start offset: %d, line offset= %d\n",
+ l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);
+ }*/
+
+ switch (l_size_comp) {
+ case 1:
+ {
+ OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
+ l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/
+
+ if (l_img_comp_src->sgnd) {
+ for (j = 0 ; j < l_height_dest ; ++j) {
+ for ( k = 0 ; k < l_width_dest ; ++k) {
+ *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */
+ }
+
+ l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */
+ l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */
+ }
+ }
+ else {
+ for ( j = 0 ; j < l_height_dest ; ++j ) {
+ for ( k = 0 ; k < l_width_dest ; ++k) {
+ *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);
+ }
+
+ l_dest_ptr+= l_line_offset_dest;
+ l_src_ptr += l_line_offset_src;
+ }
+ }
+
+ l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */
+ p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */
+ }
+ break;
+ case 2:
+ {
+ OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
+ l_src_ptr += l_start_offset_src;
+
+ if (l_img_comp_src->sgnd) {
+ for (j=0;j<l_height_dest;++j) {
+ for (k=0;k<l_width_dest;++k) {
+ *(l_dest_ptr++) = *(l_src_ptr++);
+ }
+
+ l_dest_ptr+= l_line_offset_dest;
+ l_src_ptr += l_line_offset_src ;
+ }
+ }
+ else {
+ for (j=0;j<l_height_dest;++j) {
+ for (k=0;k<l_width_dest;++k) {
+ *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
+ }
+
+ l_dest_ptr+= l_line_offset_dest;
+ l_src_ptr += l_line_offset_src ;
+ }
+ }
+
+ l_src_ptr += l_end_offset_src;
+ p_data = (OPJ_BYTE*) l_src_ptr;
+ }
+ break;
+ case 4:
+ {
+ OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
+ l_src_ptr += l_start_offset_src;
+
+ for (j=0;j<l_height_dest;++j) {
+ for (k=0;k<l_width_dest;++k) {
+ *(l_dest_ptr++) = (*(l_src_ptr++));
+ }
+
+ l_dest_ptr+= l_line_offset_dest;
+ l_src_ptr += l_line_offset_src ;
+ }
+
+ l_src_ptr += l_end_offset_src;
+ p_data = (OPJ_BYTE*) l_src_ptr;
+ }
+ break;
+ }
+
+ ++l_img_comp_dest;
+ ++l_img_comp_src;
+ ++l_tilec;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_set_decode_area( opj_j2k_t *p_j2k,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+ opj_event_mgr_t * p_manager )
+{
+ opj_cp_t * l_cp = &(p_j2k->m_cp);
+ opj_image_t * l_image = p_j2k->m_private_image;
+
+ OPJ_UINT32 it_comp;
+ OPJ_INT32 l_comp_x1, l_comp_y1;
+ opj_image_comp_t* l_img_comp = NULL;
+
+ /* Check if we are read the main header */
+ if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/
+ opj_event_msg(p_manager, EVT_ERROR, "Need to decode the main header before begin to decode the remaining codestream");
+ return OPJ_FALSE;
+ }
+
+ if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){
+ opj_event_msg(p_manager, EVT_INFO, "No decoded area parameters, set the decoded area to the whole image\n");
+
+ p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+ p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+ p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+ p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+
+ return OPJ_TRUE;
+ }
+
+ /* ----- */
+ /* Check if the positions provided by the user are correct */
+
+ /* Left */
+ assert(p_start_x >= 0 );
+ assert(p_start_y >= 0 );
+
+ if ((OPJ_UINT32)p_start_x > l_image->x1 ) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
+ p_start_x, l_image->x1);
+ return OPJ_FALSE;
+ }
+ else if ((OPJ_UINT32)p_start_x < l_image->x0){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
+ p_start_x, l_image->x0);
+ p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+ p_image->x0 = l_image->x0;
+ }
+ else {
+ p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx;
+ p_image->x0 = (OPJ_UINT32)p_start_x;
+ }
+
+ /* Up */
+ if ((OPJ_UINT32)p_start_y > l_image->y1){
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
+ p_start_y, l_image->y1);
+ return OPJ_FALSE;
+ }
+ else if ((OPJ_UINT32)p_start_y < l_image->y0){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
+ p_start_y, l_image->y0);
+ p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+ p_image->y0 = l_image->y0;
+ }
+ else {
+ p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy;
+ p_image->y0 = (OPJ_UINT32)p_start_y;
+ }
+
+ /* Right */
+ assert((OPJ_UINT32)p_end_x > 0);
+ assert((OPJ_UINT32)p_end_y > 0);
+ if ((OPJ_UINT32)p_end_x < l_image->x0) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
+ p_end_x, l_image->x0);
+ return OPJ_FALSE;
+ }
+ else if ((OPJ_UINT32)p_end_x > l_image->x1) {
+ opj_event_msg(p_manager, EVT_WARNING,
+ "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
+ p_end_x, l_image->x1);
+ p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+ p_image->x1 = l_image->x1;
+ }
+ else {
+ p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
+ p_image->x1 = (OPJ_UINT32)p_end_x;
+ }
+
+ /* Bottom */
+ if ((OPJ_UINT32)p_end_y < l_image->y0) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
+ p_end_y, l_image->y0);
+ return OPJ_FALSE;
+ }
+ if ((OPJ_UINT32)p_end_y > l_image->y1){
+ opj_event_msg(p_manager, EVT_WARNING,
+ "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
+ p_end_y, l_image->y1);
+ p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+ p_image->y1 = l_image->y1;
+ }
+ else{
+ p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
+ p_image->y1 = (OPJ_UINT32)p_end_y;
+ }
+ /* ----- */
+
+ p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
+
+ l_img_comp = p_image->comps;
+ for (it_comp=0; it_comp < p_image->numcomps; ++it_comp)
+ {
+ OPJ_INT32 l_h,l_w;
+
+ l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
+ l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
+ l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+ l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+ l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
+ - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
+ if (l_w < 0){
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
+ it_comp, l_w);
+ return OPJ_FALSE;
+ }
+ l_img_comp->w = (OPJ_UINT32)l_w;
+
+ l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
+ - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
+ if (l_h < 0){
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
+ it_comp, l_h);
+ return OPJ_FALSE;
+ }
+ l_img_comp->h = (OPJ_UINT32)l_h;
+
+ l_img_comp++;
+ }
+
+ opj_event_msg( p_manager, EVT_INFO,"Setting decoding area to %d,%d,%d,%d\n",
+ p_image->x0, p_image->y0, p_image->x1, p_image->y1);
+
+ return OPJ_TRUE;
+}
+
+opj_j2k_t* opj_j2k_create_decompress(void)
+{
+ opj_j2k_t *l_j2k = (opj_j2k_t*) opj_malloc(sizeof(opj_j2k_t));
+ if (!l_j2k) {
+ return 00;
+ }
+ memset(l_j2k,0,sizeof(opj_j2k_t));
+
+ l_j2k->m_is_decoder = 1;
+ l_j2k->m_cp.m_is_decoder = 1;
+
+ l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_malloc(sizeof(opj_tcp_t));
+ if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
+ opj_j2k_destroy(l_j2k);
+ return 00;
+ }
+ memset(l_j2k->m_specific_param.m_decoder.m_default_tcp,0,sizeof(opj_tcp_t));
+
+ l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
+ if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
+ opj_j2k_destroy(l_j2k);
+ return 00;
+ }
+
+ l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+
+ l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
+
+ l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
+
+ /* codestream index creation */
+ l_j2k->cstr_index = opj_j2k_create_cstr_index();
+
+ /*(opj_codestream_index_t*) opj_malloc(sizeof(opj_codestream_index_t));
+ if (!l_j2k->cstr_index){
+ opj_j2k_destroy(l_j2k);
+ return NULL;
+ }
+
+ l_j2k->cstr_index->marker = (opj_marker_info_t*) opj_malloc(100 * sizeof(opj_marker_info_t));
+*/
+
+ /* validation list creation */
+ l_j2k->m_validation_list = opj_procedure_list_create();
+ if (! l_j2k->m_validation_list) {
+ opj_j2k_destroy(l_j2k);
+ return 00;
+ }
+
+ /* execution list creation */
+ l_j2k->m_procedure_list = opj_procedure_list_create();
+ if (! l_j2k->m_procedure_list) {
+ opj_j2k_destroy(l_j2k);
+ return 00;
+ }
+
+ return l_j2k;
+}
+
+opj_codestream_index_t* opj_j2k_create_cstr_index(void)
+{
+ opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
+ opj_calloc(1,sizeof(opj_codestream_index_t));
+ if (!cstr_index)
+ return NULL;
+
+ cstr_index->maxmarknum = 100;
+ cstr_index->marknum = 0;
+ cstr_index->marker = (opj_marker_info_t*)
+ opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
+ if (!cstr_index-> marker)
+ return NULL;
+
+ cstr_index->tile_index = NULL;
+
+ return cstr_index;
+}
+
+OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size ( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no )
+{
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_tile_no];
+ l_tccp = &l_tcp->tccps[p_comp_no];
+
+ /* preconditions again */
+ assert(p_tile_no < (l_cp->tw * l_cp->th));
+ assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+ if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+ return 5 + l_tccp->numresolutions;
+ }
+ else {
+ return 5;
+ }
+}
+
+OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_header_size,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 i;
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_header_size != 00);
+ assert(p_manager != 00);
+ assert(p_data != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_tile_no];
+ l_tccp = &l_tcp->tccps[p_comp_no];
+
+ /* preconditions again */
+ assert(p_tile_no < (l_cp->tw * l_cp->th));
+ assert(p_comp_no <(p_j2k->m_private_image->numcomps));
+
+ if (*p_header_size < 5) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
+ return OPJ_FALSE;
+ }
+
+ opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
+ ++p_data;
+
+ opj_write_bytes(p_data,l_tccp->cblkw - 2, 1); /* SPcoc (E) */
+ ++p_data;
+
+ opj_write_bytes(p_data,l_tccp->cblkh - 2, 1); /* SPcoc (F) */
+ ++p_data;
+
+ opj_write_bytes(p_data,l_tccp->cblksty, 1); /* SPcoc (G) */
+ ++p_data;
+
+ opj_write_bytes(p_data,l_tccp->qmfbid, 1); /* SPcoc (H) */
+ ++p_data;
+
+ *p_header_size = *p_header_size - 5;
+
+ if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+
+ if (*p_header_size < l_tccp->numresolutions) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
+ return OPJ_FALSE;
+ }
+
+ for (i = 0; i < l_tccp->numresolutions; ++i) {
+ opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1); /* SPcoc (I_i) */
+ ++p_data;
+ }
+
+ *p_header_size = *p_header_size - l_tccp->numresolutions;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 compno,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 i, l_tmp;
+ opj_cp_t *l_cp = NULL;
+ opj_tcp_t *l_tcp = NULL;
+ opj_tccp_t *l_tccp = NULL;
+ OPJ_BYTE * l_current_ptr = NULL;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_header_data != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ /* precondition again */
+ assert(compno < p_j2k->m_private_image->numcomps);
+
+ l_tccp = &l_tcp->tccps[compno];
+ l_current_ptr = p_header_data;
+
+ /* make sure room is sufficient */
+ if (*p_header_size < 5) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1); /* SPcox (D) */
+ ++l_tccp->numresolutions; /* tccp->numresolutions = read() + 1 */
+ if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
+ opj_event_msg(p_manager, EVT_ERROR,
+ "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
+ l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
+ return OPJ_FALSE;
+ }
+ ++l_current_ptr;
+
+ /* If user wants to remove more resolutions than the codestream contains, return error */
+ if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
+ "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
+ p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1); /* SPcoc (E) */
+ ++l_current_ptr;
+ l_tccp->cblkw += 2;
+
+ opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1); /* SPcoc (F) */
+ ++l_current_ptr;
+ l_tccp->cblkh += 2;
+
+ opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1); /* SPcoc (G) */
+ ++l_current_ptr;
+
+ opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1); /* SPcoc (H) */
+ ++l_current_ptr;
+
+ *p_header_size = *p_header_size - 5;
+
+ /* use custom precinct size ? */
+ if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+ if (*p_header_size < l_tccp->numresolutions) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+ return OPJ_FALSE;
+ }
+
+ for (i = 0; i < l_tccp->numresolutions; ++i) {
+ opj_read_bytes(l_current_ptr,&l_tmp ,1); /* SPcoc (I_i) */
+ ++l_current_ptr;
+ l_tccp->prcw[i] = l_tmp & 0xf;
+ l_tccp->prch[i] = l_tmp >> 4;
+ }
+
+ *p_header_size = *p_header_size - l_tccp->numresolutions;
+ }
+ else {
+ /* set default size for the precinct width and height */
+ for (i = 0; i < l_tccp->numresolutions; ++i) {
+ l_tccp->prcw[i] = 15;
+ l_tccp->prch[i] = 15;
+ }
+ }
+
+#ifdef WIP_REMOVE_MSD
+ /* INDEX >> */
+ if (p_j2k->cstr_info && compno == 0) {
+ OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
+
+ p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh;
+ p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw;
+ p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions;
+ p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty;
+ p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid;
+
+ memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);
+ memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);
+ }
+ /* << INDEX */
+#endif
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k )
+{
+ /* loop */
+ OPJ_UINT32 i;
+ opj_cp_t *l_cp = NULL;
+ opj_tcp_t *l_tcp = NULL;
+ opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
+ OPJ_UINT32 l_prc_size;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ l_ref_tccp = &l_tcp->tccps[0];
+ l_copied_tccp = l_ref_tccp + 1;
+ l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
+
+ for (i=1; i<p_j2k->m_private_image->numcomps; ++i) {
+ l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
+ l_copied_tccp->cblkw = l_ref_tccp->cblkw;
+ l_copied_tccp->cblkh = l_ref_tccp->cblkh;
+ l_copied_tccp->cblksty = l_ref_tccp->cblksty;
+ l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
+ memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);
+ memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);
+ ++l_copied_tccp;
+ }
+}
+
+OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no )
+{
+ OPJ_UINT32 l_num_bands;
+
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_tile_no];
+ l_tccp = &l_tcp->tccps[p_comp_no];
+
+ /* preconditions again */
+ assert(p_tile_no < l_cp->tw * l_cp->th);
+ assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+ l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
+
+ if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+ return 1 + l_num_bands;
+ }
+ else {
+ return 1 + 2*l_num_bands;
+ }
+}
+
+OPJ_BOOL opj_j2k_write_SQcd_SQcc( opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_tile_no,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_header_size,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 l_header_size;
+ OPJ_UINT32 l_band_no, l_num_bands;
+ OPJ_UINT32 l_expn,l_mant;
+
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_header_size != 00);
+ assert(p_manager != 00);
+ assert(p_data != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = &l_cp->tcps[p_tile_no];
+ l_tccp = &l_tcp->tccps[p_comp_no];
+
+ /* preconditions again */
+ assert(p_tile_no < l_cp->tw * l_cp->th);
+ assert(p_comp_no <p_j2k->m_private_image->numcomps);
+
+ l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
+
+ if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+ l_header_size = 1 + l_num_bands;
+
+ if (*p_header_size < l_header_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+ return OPJ_FALSE;
+ }
+
+ opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */
+ ++p_data;
+
+ for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+ l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+ opj_write_bytes(p_data, l_expn << 3, 1); /* SPqcx_i */
+ ++p_data;
+ }
+ }
+ else {
+ l_header_size = 1 + 2*l_num_bands;
+
+ if (*p_header_size < l_header_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+ return OPJ_FALSE;
+ }
+
+ opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1); /* Sqcx */
+ ++p_data;
+
+ for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+ l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+ l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
+
+ opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2); /* SPqcx_i */
+ p_data += 2;
+ }
+ }
+
+ *p_header_size = *p_header_size - l_header_size;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
+ OPJ_UINT32 p_comp_no,
+ OPJ_BYTE* p_header_data,
+ OPJ_UINT32 * p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* loop*/
+ OPJ_UINT32 l_band_no;
+ opj_cp_t *l_cp = 00;
+ opj_tcp_t *l_tcp = 00;
+ opj_tccp_t *l_tccp = 00;
+ OPJ_BYTE * l_current_ptr = 00;
+ OPJ_UINT32 l_tmp, l_num_band;
+
+ /* preconditions*/
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_header_data != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ /* come from tile part header or main header ?*/
+ l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ /* precondition again*/
+ assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+ l_tccp = &l_tcp->tccps[p_comp_no];
+ l_current_ptr = p_header_data;
+
+ if (*p_header_size < 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
+ return OPJ_FALSE;
+ }
+ *p_header_size -= 1;
+
+ opj_read_bytes(l_current_ptr, &l_tmp ,1); /* Sqcx */
+ ++l_current_ptr;
+
+ l_tccp->qntsty = l_tmp & 0x1f;
+ l_tccp->numgbits = l_tmp >> 5;
+ if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+ l_num_band = 1;
+ }
+ else {
+ l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
+ (*p_header_size) :
+ (*p_header_size) / 2;
+
+ if( l_num_band > OPJ_J2K_MAXBANDS ) {
+ opj_event_msg(p_manager, EVT_WARNING, "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
+ "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
+ "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS);
+ /*return OPJ_FALSE;*/
+ }
+ }
+
+#ifdef USE_JPWL
+ if (l_cp->correct) {
+
+ /* if JPWL is on, we check whether there are too many subbands */
+ if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
+ opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+ "JPWL: bad number of subbands in Sqcx (%d)\n",
+ l_num_band);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ /* we try to correct */
+ l_num_band = 1;
+ opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
+ "- setting number of bands to %d => HYPOTHESIS!!!\n",
+ l_num_band);
+ };
+
+ };
+#endif /* USE_JPWL */
+
+ if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+ for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+ opj_read_bytes(l_current_ptr, &l_tmp ,1); /* SPqcx_i */
+ ++l_current_ptr;
+ if (l_band_no < OPJ_J2K_MAXBANDS){
+ l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
+ l_tccp->stepsizes[l_band_no].mant = 0;
+ }
+ }
+ *p_header_size = *p_header_size - l_num_band;
+ }
+ else {
+ for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+ opj_read_bytes(l_current_ptr, &l_tmp ,2); /* SPqcx_i */
+ l_current_ptr+=2;
+ if (l_band_no < OPJ_J2K_MAXBANDS){
+ l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
+ l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
+ }
+ }
+ *p_header_size = *p_header_size - 2*l_num_band;
+ }
+
+ /* Add Antonin : if scalar_derived -> compute other stepsizes */
+ if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+ for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
+ l_tccp->stepsizes[l_band_no].expn =
+ ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ?
+ (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
+ l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k )
+{
+ OPJ_UINT32 i;
+ opj_cp_t *l_cp = NULL;
+ opj_tcp_t *l_tcp = NULL;
+ opj_tccp_t *l_ref_tccp = NULL;
+ opj_tccp_t *l_copied_tccp = NULL;
+ OPJ_UINT32 l_size;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+ &l_cp->tcps[p_j2k->m_current_tile_number] :
+ p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ l_ref_tccp = &l_tcp->tccps[0];
+ l_copied_tccp = l_ref_tccp + 1;
+ l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
+
+ for (i=1;i<p_j2k->m_private_image->numcomps;++i) {
+ l_copied_tccp->qntsty = l_ref_tccp->qntsty;
+ l_copied_tccp->numgbits = l_ref_tccp->numgbits;
+ memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);
+ ++l_copied_tccp;
+ }
+}
+
+static void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream)
+{
+ if (l_default_tile)
+ {
+ OPJ_INT32 compno;
+
+ fprintf(out_stream, "\t default tile {\n");
+ fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
+ fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
+ fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
+ fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
+
+ for (compno = 0; compno < numcomps; compno++) {
+ opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+ OPJ_UINT32 resno;
+ OPJ_INT32 bandno, numbands;
+
+ /* coding style*/
+ fprintf(out_stream, "\t\t comp %d {\n", compno);
+ fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
+ fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
+ fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
+ fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
+ fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
+ fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
+
+ fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
+ for (resno = 0; resno < l_tccp->numresolutions; resno++) {
+ fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
+ }
+ fprintf(out_stream, "\n");
+
+ /* quantization style*/
+ fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
+ fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
+ fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
+ numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+ for (bandno = 0; bandno < numbands; bandno++) {
+ fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
+ l_tccp->stepsizes[bandno].expn);
+ }
+ fprintf(out_stream, "\n");
+
+ /* RGN value*/
+ fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
+
+ fprintf(out_stream, "\t\t }\n");
+ } /*end of component of default tile*/
+ fprintf(out_stream, "\t }\n"); /*end of default tile*/
+ }
+}
+
+void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
+{
+ /* Check if the flag is compatible with j2k file*/
+ if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){
+ fprintf(out_stream, "Wrong flag\n");
+ return;
+ }
+
+ /* Dump the image_header */
+ if (flag & OPJ_IMG_INFO){
+ if (p_j2k->m_private_image)
+ j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
+ }
+
+ /* Dump the codestream info from main header */
+ if (flag & OPJ_J2K_MH_INFO){
+ opj_j2k_dump_MH_info(p_j2k, out_stream);
+ }
+ /* Dump all tile/codestream info */
+ if (flag & OPJ_J2K_TCH_INFO){
+ OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+ OPJ_UINT32 i;
+ opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+ for (i=0;i<l_nb_tiles;++i) {
+ opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
+ ++l_tcp;
+ }
+ }
+
+ /* Dump the codestream info of the current tile */
+ if (flag & OPJ_J2K_TH_INFO){
+
+ }
+
+ /* Dump the codestream index from main header */
+ if (flag & OPJ_J2K_MH_IND){
+ opj_j2k_dump_MH_index(p_j2k, out_stream);
+ }
+
+ /* Dump the codestream index of the current tile */
+ if (flag & OPJ_J2K_TH_IND){
+
+ }
+
+}
+
+void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
+{
+ opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
+ OPJ_UINT32 it_marker, it_tile, it_tile_part;
+
+ fprintf(out_stream, "Codestream index from main header: {\n");
+
+ fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
+ "\t Main header end position=%" PRIi64 "\n",
+ cstr_index->main_head_start, cstr_index->main_head_end);
+
+ fprintf(out_stream, "\t Marker list: {\n");
+
+ if (cstr_index->marker){
+ for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){
+ fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+ cstr_index->marker[it_marker].type,
+ cstr_index->marker[it_marker].pos,
+ cstr_index->marker[it_marker].len );
+ }
+ }
+
+ fprintf(out_stream, "\t }\n");
+
+ if (cstr_index->tile_index){
+
+ /* Simple test to avoid to write empty information*/
+ OPJ_UINT32 l_acc_nb_of_tile_part = 0;
+ for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
+ l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
+ }
+
+ if (l_acc_nb_of_tile_part)
+ {
+ fprintf(out_stream, "\t Tile index: {\n");
+
+ for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
+ OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
+
+ fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile, nb_of_tile_part);
+
+ if (cstr_index->tile_index[it_tile].tp_index){
+ for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){
+ fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%" PRIi64 ", end_pos=%" PRIi64 ".\n",
+ it_tile_part,
+ cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
+ cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
+ cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
+ }
+ }
+
+ if (cstr_index->tile_index[it_tile].marker){
+ for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){
+ fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+ cstr_index->tile_index[it_tile].marker[it_marker].type,
+ cstr_index->tile_index[it_tile].marker[it_marker].pos,
+ cstr_index->tile_index[it_tile].marker[it_marker].len );
+ }
+ }
+ }
+ fprintf(out_stream,"\t }\n");
+ }
+ }
+
+ fprintf(out_stream,"}\n");
+
+}
+
+
+void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
+{
+
+ fprintf(out_stream, "Codestream info from main header: {\n");
+
+ fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
+ fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
+ fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
+ opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
+ fprintf(out_stream, "}\n");
+}
+
+void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+{
+ char tab[2];
+
+ if (dev_dump_flag){
+ fprintf(stdout, "[DEV] Dump an image_header struct {\n");
+ tab[0] = '\0';
+ }
+ else {
+ fprintf(out_stream, "Image info {\n");
+ tab[0] = '\t';tab[1] = '\0';
+ }
+
+ fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
+ fprintf(out_stream, "%s x1=%d, y1=%d\n", tab, img_header->x1, img_header->y1);
+ fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
+
+ if (img_header->comps){
+ OPJ_UINT32 compno;
+ for (compno = 0; compno < img_header->numcomps; compno++) {
+ fprintf(out_stream, "%s\t component %d {\n", tab, compno);
+ j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream);
+ fprintf(out_stream,"%s}\n",tab);
+ }
+ }
+
+ fprintf(out_stream, "}\n");
+}
+
+void j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+{
+ char tab[3];
+
+ if (dev_dump_flag){
+ fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
+ tab[0] = '\0';
+ } else {
+ tab[0] = '\t';tab[1] = '\t';tab[2] = '\0';
+ }
+
+ fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
+ fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
+ fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
+
+ if (dev_dump_flag)
+ fprintf(out_stream, "}\n");
+}
+
+opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
+{
+ OPJ_UINT32 compno;
+ OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
+ opj_tcp_t *l_default_tile;
+ opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t));
+ if (!cstr_info)
+ return NULL;
+
+ cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
+
+ cstr_info->tx0 = p_j2k->m_cp.tx0;
+ cstr_info->ty0 = p_j2k->m_cp.ty0;
+ cstr_info->tdx = p_j2k->m_cp.tdx;
+ cstr_info->tdy = p_j2k->m_cp.tdy;
+ cstr_info->tw = p_j2k->m_cp.tw;
+ cstr_info->th = p_j2k->m_cp.th;
+
+ cstr_info->tile_info = NULL; /* Not fill from the main header*/
+
+ l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+ cstr_info->m_default_tile_info.csty = l_default_tile->csty;
+ cstr_info->m_default_tile_info.prg = l_default_tile->prg;
+ cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
+ cstr_info->m_default_tile_info.mct = l_default_tile->mct;
+
+ cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t));
+ if (!cstr_info->m_default_tile_info.tccp_info)
+ {
+ opj_destroy_cstr_info(&cstr_info);
+ return NULL;
+ }
+
+ for (compno = 0; compno < numcomps; compno++) {
+ opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+ opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]);
+ OPJ_INT32 bandno, numbands;
+
+ /* coding style*/
+ l_tccp_info->csty = l_tccp->csty;
+ l_tccp_info->numresolutions = l_tccp->numresolutions;
+ l_tccp_info->cblkw = l_tccp->cblkw;
+ l_tccp_info->cblkh = l_tccp->cblkh;
+ l_tccp_info->cblksty = l_tccp->cblksty;
+ l_tccp_info->qmfbid = l_tccp->qmfbid;
+ if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS)
+ {
+ memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
+ memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
+ }
+
+ /* quantization style*/
+ l_tccp_info->qntsty = l_tccp->qntsty;
+ l_tccp_info->numgbits = l_tccp->numgbits;
+
+ numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+ if (numbands < OPJ_J2K_MAXBANDS) {
+ for (bandno = 0; bandno < numbands; bandno++) {
+ l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant;
+ l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn;
+ }
+ }
+
+ /* RGN value*/
+ l_tccp_info->roishift = l_tccp->roishift;
+ }
+
+ return cstr_info;
+}
+
+opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
+{
+ opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
+ opj_calloc(1,sizeof(opj_codestream_index_t));
+ if (!l_cstr_index)
+ return NULL;
+
+ l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
+ l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
+ l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
+
+ l_cstr_index->marknum = p_j2k->cstr_index->marknum;
+ l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t));
+ if (!l_cstr_index->marker){
+ opj_free( l_cstr_index);
+ return NULL;
+ }
+
+ if (p_j2k->cstr_index->marker)
+ memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );
+ else{
+ opj_free(l_cstr_index->marker);
+ l_cstr_index->marker = NULL;
+ }
+
+ l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
+ l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) );
+ if (!l_cstr_index->tile_index){
+ opj_free( l_cstr_index->marker);
+ opj_free( l_cstr_index);
+ return NULL;
+ }
+
+ if (!p_j2k->cstr_index->tile_index){
+ opj_free(l_cstr_index->tile_index);
+ l_cstr_index->tile_index = NULL;
+ }
+ else {
+ OPJ_UINT32 it_tile = 0;
+ for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){
+
+ /* Tile Marker*/
+ l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum;
+
+ l_cstr_index->tile_index[it_tile].marker =
+ (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t));
+
+ if (!l_cstr_index->tile_index[it_tile].marker) {
+ OPJ_UINT32 it_tile_free;
+
+ for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
+ opj_free(l_cstr_index->tile_index[it_tile_free].marker);
+ }
+
+ opj_free( l_cstr_index->tile_index);
+ opj_free( l_cstr_index->marker);
+ opj_free( l_cstr_index);
+ return NULL;
+ }
+
+ if (p_j2k->cstr_index->tile_index[it_tile].marker)
+ memcpy( l_cstr_index->tile_index[it_tile].marker,
+ p_j2k->cstr_index->tile_index[it_tile].marker,
+ l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) );
+ else{
+ opj_free(l_cstr_index->tile_index[it_tile].marker);
+ l_cstr_index->tile_index[it_tile].marker = NULL;
+ }
+
+ /* Tile part index*/
+ l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps;
+
+ l_cstr_index->tile_index[it_tile].tp_index =
+ (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t));
+
+ if(!l_cstr_index->tile_index[it_tile].tp_index){
+ OPJ_UINT32 it_tile_free;
+
+ for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
+ opj_free(l_cstr_index->tile_index[it_tile_free].marker);
+ opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
+ }
+
+ opj_free( l_cstr_index->tile_index);
+ opj_free( l_cstr_index->marker);
+ opj_free( l_cstr_index);
+ return NULL;
+ }
+
+ if (p_j2k->cstr_index->tile_index[it_tile].tp_index){
+ memcpy( l_cstr_index->tile_index[it_tile].tp_index,
+ p_j2k->cstr_index->tile_index[it_tile].tp_index,
+ l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) );
+ }
+ else{
+ opj_free(l_cstr_index->tile_index[it_tile].tp_index);
+ l_cstr_index->tile_index[it_tile].tp_index = NULL;
+ }
+
+ /* Packet index (NOT USED)*/
+ l_cstr_index->tile_index[it_tile].nb_packet = 0;
+ l_cstr_index->tile_index[it_tile].packet_index = NULL;
+
+ }
+ }
+
+ return l_cstr_index;
+}
+
+OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
+{
+ OPJ_UINT32 it_tile=0;
+
+ p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+ p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
+ if (!p_j2k->cstr_index->tile_index)
+ return OPJ_FALSE;
+
+ for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){
+ p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
+ p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
+ p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
+ opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t));
+ if (!p_j2k->cstr_index->tile_index[it_tile].marker)
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_BOOL l_go_on = OPJ_TRUE;
+ OPJ_UINT32 l_current_tile_no;
+ OPJ_UINT32 l_data_size,l_max_data_size;
+ OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
+ OPJ_UINT32 l_nb_comps;
+ OPJ_BYTE * l_current_data;
+ OPJ_UINT32 nr_tiles = 0;
+
+ l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+ if (! l_current_data) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n");
+ return OPJ_FALSE;
+ }
+ l_max_data_size = 1000;
+
+ while (OPJ_TRUE) {
+ if (! opj_j2k_read_tile_header( p_j2k,
+ &l_current_tile_no,
+ &l_data_size,
+ &l_tile_x0, &l_tile_y0,
+ &l_tile_x1, &l_tile_y1,
+ &l_nb_comps,
+ &l_go_on,
+ p_stream,
+ p_manager)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+
+ if (! l_go_on) {
+ break;
+ }
+
+ if (l_data_size > l_max_data_size) {
+ OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
+ if (! l_new_current_data) {
+ opj_free(l_current_data);
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+ return OPJ_FALSE;
+ }
+ l_current_data = l_new_current_data;
+ l_max_data_size = l_data_size;
+ }
+
+ if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
+ opj_free(l_current_data);
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+ return OPJ_FALSE;
+ }
+ opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+
+ if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
+
+ if(opj_stream_get_number_byte_left(p_stream) == 0
+ && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
+ break;
+ if(++nr_tiles == p_j2k->m_cp.th * p_j2k->m_cp.tw)
+ break;
+ }
+
+ opj_free(l_current_data);
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_decoding (opj_j2k_t *p_j2k)
+{
+ /* preconditions*/
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles);
+ /* DEVELOPER CORNER, add your custom procedures */
+
+}
+
+/*
+ * Read and decode one tile.
+ */
+static OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_BOOL l_go_on = OPJ_TRUE;
+ OPJ_UINT32 l_current_tile_no;
+ OPJ_UINT32 l_tile_no_to_dec;
+ OPJ_UINT32 l_data_size,l_max_data_size;
+ OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
+ OPJ_UINT32 l_nb_comps;
+ OPJ_BYTE * l_current_data;
+
+ l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+ if (! l_current_data) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n");
+ return OPJ_FALSE;
+ }
+ l_max_data_size = 1000;
+
+ /*Allocate and initialize some elements of codestrem index if not already done*/
+ if( !p_j2k->cstr_index->tile_index)
+ {
+ if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ /* Move into the codestream to the first SOT used to decode the desired tile */
+ l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
+ if (p_j2k->cstr_index->tile_index)
+ if(p_j2k->cstr_index->tile_index->tp_index)
+ {
+ if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
+ /* the index for this tile has not been built,
+ * so move to the last SOT read */
+ if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){
+ opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ else{
+ if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
+ if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC)
+ p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+ }
+
+ while (OPJ_TRUE) {
+ if (! opj_j2k_read_tile_header( p_j2k,
+ &l_current_tile_no,
+ &l_data_size,
+ &l_tile_x0, &l_tile_y0,
+ &l_tile_x1, &l_tile_y1,
+ &l_nb_comps,
+ &l_go_on,
+ p_stream,
+ p_manager)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+
+ if (! l_go_on) {
+ break;
+ }
+
+ if (l_data_size > l_max_data_size) {
+ OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
+ if (! l_new_current_data) {
+ opj_free(l_current_data);
+ l_current_data = NULL;
+ /* TODO: LH: why tile numbering policy used in messages differs from
+ the one used in opj_j2k_decode_tiles() ? */
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+ return OPJ_FALSE;
+ }
+ l_current_data = l_new_current_data;
+ l_max_data_size = l_data_size;
+ }
+
+ if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
+
+ if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no);
+
+ if(l_current_tile_no == l_tile_no_to_dec)
+ {
+ /* move into the codestream to the the first SOT (FIXME or not move?)*/
+ if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+ return OPJ_FALSE;
+ }
+ break;
+ }
+ else {
+ opj_event_msg(p_manager, EVT_WARNING, "Tile read, decode and updated is not the desired (%d vs %d).\n", l_current_tile_no, l_tile_no_to_dec);
+ }
+
+ }
+
+ opj_free(l_current_data);
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.
+ */
+static void opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k)
+{
+ /* preconditions*/
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile);
+ /* DEVELOPER CORNER, add your custom procedures */
+
+}
+
+OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
+ opj_stream_private_t * p_stream,
+ opj_image_t * p_image,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 compno;
+
+ if (!p_image)
+ return OPJ_FALSE;
+
+ p_j2k->m_output_image = opj_image_create0();
+ if (! (p_j2k->m_output_image)) {
+ return OPJ_FALSE;
+ }
+ opj_copy_image_header(p_image, p_j2k->m_output_image);
+
+ /* customization of the decoding */
+ opj_j2k_setup_decoding(p_j2k);
+
+ /* Decode the codestream */
+ if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+ opj_image_destroy(p_j2k->m_private_image);
+ p_j2k->m_private_image = NULL;
+ return OPJ_FALSE;
+ }
+
+ /* Move data and copy one information from codec to output image*/
+ for (compno = 0; compno < p_image->numcomps; compno++) {
+ p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
+ p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
+#if 0
+ char fn[256];
+ sprintf( fn, "/tmp/%d.raw", compno );
+ FILE *debug = fopen( fn, "wb" );
+ fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug );
+ fclose( debug );
+#endif
+ p_j2k->m_output_image->comps[compno].data = NULL;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_get_tile( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager,
+ OPJ_UINT32 tile_index )
+{
+ OPJ_UINT32 compno;
+ OPJ_UINT32 l_tile_x, l_tile_y;
+ opj_image_comp_t* l_img_comp;
+
+ if (!p_image) {
+ opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
+ return OPJ_FALSE;
+ }
+
+ if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){
+ opj_event_msg(p_manager, EVT_ERROR, "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index, (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
+ return OPJ_FALSE;
+ }
+
+ /* Compute the dimension of the desired tile*/
+ l_tile_x = tile_index % p_j2k->m_cp.tw;
+ l_tile_y = tile_index / p_j2k->m_cp.tw;
+
+ p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+ if (p_image->x0 < p_j2k->m_private_image->x0)
+ p_image->x0 = p_j2k->m_private_image->x0;
+ p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+ if (p_image->x1 > p_j2k->m_private_image->x1)
+ p_image->x1 = p_j2k->m_private_image->x1;
+
+ p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+ if (p_image->y0 < p_j2k->m_private_image->y0)
+ p_image->y0 = p_j2k->m_private_image->y0;
+ p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+ if (p_image->y1 > p_j2k->m_private_image->y1)
+ p_image->y1 = p_j2k->m_private_image->y1;
+
+ l_img_comp = p_image->comps;
+ for (compno=0; compno < p_image->numcomps; ++compno)
+ {
+ OPJ_INT32 l_comp_x1, l_comp_y1;
+
+ l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
+
+ l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
+ l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
+ l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+ l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+ l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor));
+ l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor));
+
+ l_img_comp++;
+ }
+
+ /* Destroy the previous output image*/
+ if (p_j2k->m_output_image)
+ opj_image_destroy(p_j2k->m_output_image);
+
+ /* Create the ouput image from the information previously computed*/
+ p_j2k->m_output_image = opj_image_create0();
+ if (! (p_j2k->m_output_image)) {
+ return OPJ_FALSE;
+ }
+ opj_copy_image_header(p_image, p_j2k->m_output_image);
+
+ p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
+
+ /* customization of the decoding */
+ opj_j2k_setup_decoding_tile(p_j2k);
+
+ /* Decode the codestream */
+ if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+ opj_image_destroy(p_j2k->m_private_image);
+ p_j2k->m_private_image = NULL;
+ return OPJ_FALSE;
+ }
+
+ /* Move data and copy one information from codec to output image*/
+ for (compno = 0; compno < p_image->numcomps; compno++) {
+ p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
+
+ if (p_image->comps[compno].data)
+ opj_free(p_image->comps[compno].data);
+
+ p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
+
+ p_j2k->m_output_image->comps[compno].data = NULL;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 it_comp;
+
+ p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
+
+ if (p_j2k->m_private_image) {
+ if (p_j2k->m_private_image->comps) {
+ if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
+ if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
+ for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
+ OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
+ if ( res_factor >= max_res){
+ opj_event_msg(p_manager, EVT_ERROR, "Resolution factor is greater than the maximum resolution in the component.\n");
+ return OPJ_FALSE;
+ }
+ p_j2k->m_private_image->comps[it_comp].factor = res_factor;
+ }
+ return OPJ_TRUE;
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_nb_tiles;
+ OPJ_UINT32 l_max_tile_size, l_current_tile_size;
+ OPJ_BYTE * l_current_data;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+ if (! l_current_data) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
+ return OPJ_FALSE;
+ }
+ l_max_tile_size = 1000;
+
+ l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+ for (i=0;i<l_nb_tiles;++i) {
+ if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+
+ l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
+ if (l_current_tile_size > l_max_tile_size) {
+ OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size);
+ if (! l_new_current_data) {
+ opj_free(l_current_data);
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
+ return OPJ_FALSE;
+ }
+ l_current_data = l_new_current_data;
+ l_max_tile_size = l_current_tile_size;
+ }
+
+ opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data);
+
+ if (! opj_j2k_post_write_tile (p_j2k,l_current_data,l_current_tile_size,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ opj_free(l_current_data);
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_end_compress( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager)
+{
+ /* customization of the encoding */
+ opj_j2k_setup_end_compress(p_j2k);
+
+ if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager))
+ {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_image_t * p_image,
+ opj_event_mgr_t * p_manager)
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ p_j2k->m_private_image = opj_image_create0();
+ opj_copy_image_header(p_image, p_j2k->m_private_image);
+
+ /* TODO_MSD: Find a better way */
+ if (p_image->comps) {
+ OPJ_UINT32 it_comp;
+ for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
+ if (p_image->comps[it_comp].data) {
+ p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data;
+ p_image->comps[it_comp].data = NULL;
+
+ }
+ }
+ }
+
+ /* customization of the validation */
+ opj_j2k_setup_encoding_validation (p_j2k);
+
+ /* validation of the parameters codec */
+ if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* customization of the encoding */
+ opj_j2k_setup_header_writing(p_j2k);
+
+ /* write header */
+ if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ (void)p_stream;
+ if (p_tile_index != p_j2k->m_current_tile_number) {
+ opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." );
+ return OPJ_FALSE;
+ }
+
+ opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
+
+ p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
+ p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
+ p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+
+ /* initialisation before tile encoding */
+ if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
+{
+ OPJ_UINT32 i,j,k = 0;
+ OPJ_UINT32 l_width,l_height,l_stride, l_offset_x,l_offset_y, l_image_width;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tilecomp_t * l_tilec = 00;
+ opj_image_t * l_image = 00;
+ OPJ_UINT32 l_size_comp, l_remaining;
+ OPJ_INT32 * l_src_ptr;
+ l_tilec = p_tcd->tcd_image->tiles->comps;
+ l_image = p_tcd->image;
+ l_img_comp = l_image->comps;
+
+ for (i=0;i<p_tcd->image->numcomps;++i) {
+ l_size_comp = l_img_comp->prec >> 3; /* (/8) */
+ l_remaining = l_img_comp->prec & 7; /* (%8) */
+ if (l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+
+ l_width = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+ l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
+ l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+ l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0, (OPJ_INT32)l_img_comp->dy);
+ l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+ l_stride = l_image_width - l_width;
+ l_src_ptr = l_img_comp->data + ((OPJ_UINT32)l_tilec->x0 - l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - l_offset_y) * l_image_width;
+
+ switch (l_size_comp) {
+ case 1:
+ {
+ OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);
+ ++l_dest_ptr;
+ ++l_src_ptr;
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+ else {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff);
+ ++l_dest_ptr;
+ ++l_src_ptr;
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+
+ p_data = (OPJ_BYTE*) l_dest_ptr;
+ }
+ break;
+ case 2:
+ {
+ OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+ else {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+
+ p_data = (OPJ_BYTE*) l_dest_ptr;
+ }
+ break;
+ case 4:
+ {
+ OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = *(l_src_ptr++);
+ }
+ l_src_ptr += l_stride;
+ }
+
+ p_data = (OPJ_BYTE*) l_dest_ptr;
+ }
+ break;
+ }
+
+ ++l_img_comp;
+ ++l_tilec;
+ }
+}
+
+OPJ_BOOL opj_j2k_post_write_tile ( opj_j2k_t * p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ opj_tcd_t * l_tcd = 00;
+ OPJ_UINT32 l_nb_bytes_written;
+ OPJ_BYTE * l_current_data = 00;
+ OPJ_UINT32 l_tile_size = 0;
+ OPJ_UINT32 l_available_data;
+
+ /* preconditions */
+ assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+
+ l_tcd = p_j2k->m_tcd;
+
+ l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
+ l_available_data = l_tile_size;
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
+
+ if (! opj_tcd_copy_tile_data(l_tcd,p_data,p_data_size)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written = 0;
+ if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+ l_current_data += l_nb_bytes_written;
+ l_available_data -= l_nb_bytes_written;
+
+ l_nb_bytes_written = 0;
+ if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_available_data -= l_nb_bytes_written;
+ l_nb_bytes_written = l_tile_size - l_available_data;
+
+ if ( opj_stream_write_data( p_stream,
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
+ l_nb_bytes_written,p_manager) != l_nb_bytes_written) {
+ return OPJ_FALSE;
+ }
+
+ ++p_j2k->m_current_tile_number;
+
+ return OPJ_TRUE;
+}
+
+void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k)
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ /* DEVELOPER CORNER, insert your custom procedures */
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc );
+
+ if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm);
+ }
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory);
+}
+
+void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k)
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder);
+ opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation);
+
+ /* DEVELOPER CORNER, add your custom validation procedure */
+ opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation);
+}
+
+void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k)
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd );
+
+ if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema) {
+ /* No need for COC or QCC, QCD and COD are used
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc );
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc );
+ */
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm );
+
+ if (p_j2k->m_cp.m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24) {
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc );
+ }
+ }
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions);
+
+ if (p_j2k->m_cp.comment != 00) {
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com);
+ }
+
+ /* DEVELOPER CORNER, insert your custom procedures */
+ if (p_j2k->m_cp.rsiz & OPJ_MCT) {
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group );
+ }
+ /* End of Developer Corner */
+
+ if (p_j2k->cstr_index) {
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header );
+ }
+
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd);
+ opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates);
+}
+
+OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ opj_stream_private_t *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 l_nb_bytes_written = 0;
+ OPJ_UINT32 l_current_nb_bytes_written;
+ OPJ_BYTE * l_begin_data = 00;
+
+ opj_tcd_t * l_tcd = 00;
+ opj_cp_t * l_cp = 00;
+
+ l_tcd = p_j2k->m_tcd;
+ l_cp = &(p_j2k->m_cp);
+
+ l_tcd->cur_pino = 0;
+
+ /*Get number of tile parts*/
+ p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+
+ /* INDEX >> */
+ /* << INDEX */
+
+ l_current_nb_bytes_written = 0;
+ l_begin_data = p_data;
+ if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
+ {
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+
+ if (l_cp->m_specific_param.m_enc.m_cinema == 0) {
+#if 0
+ for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
+ l_current_nb_bytes_written = 0;
+ opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+
+ l_current_nb_bytes_written = 0;
+ opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ }
+#endif
+
+ if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {
+ l_current_nb_bytes_written = 0;
+ opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ }
+ }
+
+ l_current_nb_bytes_written = 0;
+ if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ * p_data_written = l_nb_bytes_written;
+
+ /* Writing Psot in SOT marker */
+ opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4); /* PSOT */
+
+ if (l_cp->m_specific_param.m_enc.m_cinema){
+ opj_j2k_update_tlm(p_j2k,l_nb_bytes_written);
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_total_data_size,
+ opj_stream_private_t *p_stream,
+ struct opj_event_mgr * p_manager
+ )
+{
+ OPJ_UINT32 tilepartno=0;
+ OPJ_UINT32 l_nb_bytes_written = 0;
+ OPJ_UINT32 l_current_nb_bytes_written;
+ OPJ_UINT32 l_part_tile_size;
+ OPJ_UINT32 tot_num_tp;
+ OPJ_UINT32 pino;
+
+ OPJ_BYTE * l_begin_data;
+ opj_tcp_t *l_tcp = 00;
+ opj_tcd_t * l_tcd = 00;
+ opj_cp_t * l_cp = 00;
+
+ l_tcd = p_j2k->m_tcd;
+ l_cp = &(p_j2k->m_cp);
+ l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
+
+ /*Get number of tile parts*/
+ tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);
+
+ /* start writing remaining tile parts */
+ ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+ for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
+ p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
+ l_current_nb_bytes_written = 0;
+ l_part_tile_size = 0;
+ l_begin_data = p_data;
+
+ if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ l_part_tile_size += l_current_nb_bytes_written;
+
+ l_current_nb_bytes_written = 0;
+ if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ p_data += l_current_nb_bytes_written;
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ l_part_tile_size += l_current_nb_bytes_written;
+
+ /* Writing Psot in SOT marker */
+ opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */
+
+ if (l_cp->m_specific_param.m_enc.m_cinema) {
+ opj_j2k_update_tlm(p_j2k,l_part_tile_size);
+ }
+
+ ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+ }
+
+ for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
+ l_tcd->cur_pino = pino;
+
+ /*Get number of tile parts*/
+ tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);
+ for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
+ p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
+ l_current_nb_bytes_written = 0;
+ l_part_tile_size = 0;
+ l_begin_data = p_data;
+
+ if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ l_part_tile_size += l_current_nb_bytes_written;
+
+ l_current_nb_bytes_written = 0;
+
+ if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_bytes_written += l_current_nb_bytes_written;
+ p_data += l_current_nb_bytes_written;
+ p_total_data_size -= l_current_nb_bytes_written;
+ l_part_tile_size += l_current_nb_bytes_written;
+
+ /* Writing Psot in SOT marker */
+ opj_write_bytes(l_begin_data + 6,l_part_tile_size,4); /* PSOT */
+
+ if (l_cp->m_specific_param.m_enc.m_cinema) {
+ opj_j2k_update_tlm(p_j2k,l_part_tile_size);
+ }
+
+ ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+ }
+ }
+
+ *p_data_written = l_nb_bytes_written;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ OPJ_UINT32 l_tlm_size;
+ OPJ_OFF_T l_tlm_position, l_current_position;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
+ l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
+ l_current_position = opj_stream_tell(p_stream);
+
+ if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size) {
+ return OPJ_FALSE;
+ }
+
+ if (! opj_stream_seek(p_stream,l_current_position,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ opj_tcd_destroy(p_j2k->m_tcd);
+ p_j2k->m_tcd = 00;
+
+ if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
+ p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
+ }
+
+ if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
+ }
+
+ p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Destroys the memory associated with the decoding of headers.
+ */
+static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+ opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
+ }
+
+ p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k,
+ struct opj_stream_private *p_stream,
+ struct opj_event_mgr * p_manager )
+{
+ opj_codestream_info_t * l_cstr_info = 00;
+
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+ (void)l_cstr_info;
+
+ /* TODO mergeV2: check this part which use cstr_info */
+ /*l_cstr_info = p_j2k->cstr_info;
+
+ if (l_cstr_info) {
+ OPJ_UINT32 compno;
+ l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
+
+ l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
+ l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
+
+ l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
+
+ l_cstr_info->tw = p_j2k->m_cp.tw;
+ l_cstr_info->th = p_j2k->m_cp.th;
+
+ l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/ /* new version parser */
+ /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/ /* new version parser */
+ /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/ /* new version parser */
+ /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/ /* new version parser */
+
+ /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
+
+ l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
+
+ l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
+
+ for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
+ l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
+ }
+
+ l_cstr_info->D_max = 0.0; */ /* ADD Marcela */
+
+ /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
+
+ /*l_cstr_info->maxmarknum = 100;
+ l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
+ l_cstr_info->marknum = 0;
+ }*/
+
+ return opj_j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_private_image,p_manager);
+}
+
+/**
+ * Creates a tile-coder decoder.
+ *
+ * @param p_stream the stream to write data to.
+ * @param p_j2k J2K codec.
+ * @param p_manager the user event manager.
+*/
+static OPJ_BOOL opj_j2k_create_tcd( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(p_j2k != 00);
+ assert(p_manager != 00);
+ assert(p_stream != 00);
+
+ p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
+
+ if (! p_j2k->m_tcd) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
+ return OPJ_FALSE;
+ }
+
+ if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {
+ opj_tcd_destroy(p_j2k->m_tcd);
+ p_j2k->m_tcd = 00;
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager )
+{
+ if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
+ return OPJ_FALSE;
+ }
+ else {
+ if (! opj_j2k_post_write_tile(p_j2k,p_data,p_data_size,p_stream,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+#ifdef _FOXIT_MEM_MANAGER_
+/** Allocate number of bytes */
+void* FXMEM_DefaultAlloc(int byte_size, int flags);
+void* FXMEM_DefaultRealloc(void* pointer, int new_size, int flags);
+void FXMEM_DefaultFree(void* pointer, int flags);
+
+void* opj_malloc(size_t size)
+{
+ if (size >= (size_t)-0x100 || (int)size < 0) return NULL;
+
+ return FXMEM_DefaultAlloc(size, 0);
+}
+
+void* opj_calloc(size_t _NumOfElements, size_t _SizeOfElements)
+{
+ void* buffer = NULL;
+
+ if (_NumOfElements != 0 && _NumOfElements >= (size_t)-0x100 / _SizeOfElements) return NULL;
+ if ((int)_NumOfElements < 0 || (int)_SizeOfElements < 0) return NULL;
+
+ buffer = FXMEM_DefaultAlloc(_NumOfElements * _SizeOfElements, 0);
+ if (!buffer) return 0;
+
+ memset(buffer, 0, _NumOfElements * _SizeOfElements);
+ return buffer;
+}
+
+void* opj_realloc(void * m, size_t s)
+{
+ if (s >= (size_t)-0x100 || (int)s < 0) return NULL;
+ return FXMEM_DefaultRealloc(m, s, 0);
+}
+
+void opj_free(void * m)
+{
+ FXMEM_DefaultFree(m, 0);
+}
+
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h
new file mode 100644
index 0000000000..4228bd66dc
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/j2k.h
@@ -0,0 +1,844 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __J2K_H
+#define __J2K_H
+/**
+@file j2k.h
+@brief The JPEG-2000 Codestream Reader/Writer (J2K)
+
+The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
+*/
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+#define J2K_CP_CSTY_PRT 0x01
+#define J2K_CP_CSTY_SOP 0x02
+#define J2K_CP_CSTY_EPH 0x04
+#define J2K_CCP_CSTY_PRT 0x01
+#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */
+#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */
+#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */
+#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */
+#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */
+#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */
+#define J2K_CCP_QNTSTY_NOQNT 0
+#define J2K_CCP_QNTSTY_SIQNT 1
+#define J2K_CCP_QNTSTY_SEQNT 2
+
+#define OPJ_J2K_DEFAULT_CBLK_DATA_SIZE 8192
+
+/* ----------------------------------------------------------------------- */
+
+#define J2K_MS_SOC 0xff4f /**< SOC marker value */
+#define J2K_MS_SOT 0xff90 /**< SOT marker value */
+#define J2K_MS_SOD 0xff93 /**< SOD marker value */
+#define J2K_MS_EOC 0xffd9 /**< EOC marker value */
+#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
+#define J2K_MS_COD 0xff52 /**< COD marker value */
+#define J2K_MS_COC 0xff53 /**< COC marker value */
+#define J2K_MS_RGN 0xff5e /**< RGN marker value */
+#define J2K_MS_QCD 0xff5c /**< QCD marker value */
+#define J2K_MS_QCC 0xff5d /**< QCC marker value */
+#define J2K_MS_POC 0xff5f /**< POC marker value */
+#define J2K_MS_TLM 0xff55 /**< TLM marker value */
+#define J2K_MS_PLM 0xff57 /**< PLM marker value */
+#define J2K_MS_PLT 0xff58 /**< PLT marker value */
+#define J2K_MS_PPM 0xff60 /**< PPM marker value */
+#define J2K_MS_PPT 0xff61 /**< PPT marker value */
+#define J2K_MS_SOP 0xff91 /**< SOP marker value */
+#define J2K_MS_EPH 0xff92 /**< EPH marker value */
+#define J2K_MS_CRG 0xff63 /**< CRG marker value */
+#define J2K_MS_COM 0xff64 /**< COM marker value */
+#define J2K_MS_CBD 0xff78 /**< CBD marker value */
+#define J2K_MS_MCC 0xff75 /**< MCC marker value */
+#define J2K_MS_MCT 0xff74 /**< MCT marker value */
+#define J2K_MS_MCO 0xff77 /**< MCO marker value */
+
+#define J2K_MS_UNK 0 /**< UNKNOWN marker value */
+
+/* UniPG>> */
+#ifdef USE_JPWL
+#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
+#endif /* USE_JPWL */
+#ifdef USE_JPSEC
+#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */
+#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */
+#endif /* USE_JPSEC */
+/* <<UniPG */
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Values that specify the status of the decoding process when decoding the main header.
+ * These values may be combined with a | operator.
+ * */
+typedef enum J2K_STATUS {
+ J2K_STATE_NONE = 0x0000, /**< a SOC marker is expected */
+ J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
+ J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
+ J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
+ J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
+ J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
+ J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
+ J2K_STATE_NEOC = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
+
+ J2K_STATE_EOC = 0x0100, /**< the decoding process has encountered the EOC marker */
+ J2K_STATE_ERR = 0x8000 /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
+} J2K_STATUS;
+
+/**
+ * Type of elements storing in the MCT data
+ */
+typedef enum MCT_ELEMENT_TYPE
+{
+ MCT_TYPE_INT16 = 0, /** MCT data is stored as signed shorts*/
+ MCT_TYPE_INT32 = 1, /** MCT data is stored as signed integers*/
+ MCT_TYPE_FLOAT = 2, /** MCT data is stored as floats*/
+ MCT_TYPE_DOUBLE = 3 /** MCT data is stored as doubles*/
+} J2K_MCT_ELEMENT_TYPE;
+
+/**
+ * Type of MCT array
+ */
+typedef enum MCT_ARRAY_TYPE
+{
+ MCT_TYPE_DEPENDENCY = 0,
+ MCT_TYPE_DECORRELATION = 1,
+ MCT_TYPE_OFFSET = 2
+} J2K_MCT_ARRAY_TYPE;
+
+/* ----------------------------------------------------------------------- */
+
+/**
+T2 encoding mode
+*/
+typedef enum T2_MODE {
+ THRESH_CALC = 0, /** Function called in Rate allocation process*/
+ FINAL_PASS = 1 /** Function called in Tier 2 process*/
+}J2K_T2_MODE;
+
+/**
+ * Quantization stepsize
+ */
+typedef struct opj_stepsize {
+ /** exponent */
+ OPJ_INT32 expn;
+ /** mantissa */
+ OPJ_INT32 mant;
+} opj_stepsize_t;
+
+/**
+Tile-component coding parameters
+*/
+typedef struct opj_tccp
+{
+ /** coding style */
+ OPJ_UINT32 csty;
+ /** number of resolutions */
+ OPJ_UINT32 numresolutions;
+ /** code-blocks width */
+ OPJ_UINT32 cblkw;
+ /** code-blocks height */
+ OPJ_UINT32 cblkh;
+ /** code-block coding style */
+ OPJ_UINT32 cblksty;
+ /** discrete wavelet transform identifier */
+ OPJ_UINT32 qmfbid;
+ /** quantisation style */
+ OPJ_UINT32 qntsty;
+ /** stepsizes used for quantization */
+ opj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];
+ /** number of guard bits */
+ OPJ_UINT32 numgbits;
+ /** Region Of Interest shift */
+ OPJ_INT32 roishift;
+ /** precinct width */
+ OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+ /** precinct height */
+ OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+ /** the dc_level_shift **/
+ OPJ_INT32 m_dc_level_shift;
+}
+opj_tccp_t;
+
+
+
+/**
+ * FIXME DOC
+ */
+typedef struct opj_mct_data
+{
+ J2K_MCT_ELEMENT_TYPE m_element_type;
+ J2K_MCT_ARRAY_TYPE m_array_type;
+ OPJ_UINT32 m_index;
+ OPJ_BYTE * m_data;
+ OPJ_UINT32 m_data_size;
+}
+opj_mct_data_t;
+
+/**
+ * FIXME DOC
+ */
+typedef struct opj_simple_mcc_decorrelation_data
+{
+ OPJ_UINT32 m_index;
+ OPJ_UINT32 m_nb_comps;
+ opj_mct_data_t * m_decorrelation_array;
+ opj_mct_data_t * m_offset_array;
+ OPJ_UINT32 m_is_irreversible : 1;
+}
+opj_simple_mcc_decorrelation_data_t;
+
+/**
+Tile coding parameters :
+this structure is used to store coding/decoding parameters common to all
+tiles (information like COD, COC in main header)
+*/
+typedef struct opj_tcp
+{
+ /** coding style */
+ OPJ_UINT32 csty;
+ /** progression order */
+ OPJ_PROG_ORDER prg;
+ /** number of layers */
+ OPJ_UINT32 numlayers;
+ OPJ_UINT32 num_layers_to_decode;
+ /** multi-component transform identifier */
+ OPJ_UINT32 mct;
+ /** rates of layers */
+ OPJ_FLOAT32 rates[100];
+ /** number of progression order changes */
+ OPJ_UINT32 numpocs;
+ /** progression order changes */
+ opj_poc_t pocs[32];
+ /** packet header store there for futur use in t2_decode_packet */
+ OPJ_BYTE *ppt_data;
+ /** used to keep a track of the allocated memory */
+ OPJ_BYTE *ppt_buffer;
+ /** Number of bytes stored inside ppt_data*/
+ OPJ_UINT32 ppt_data_size;
+ /** size of ppt_data*/
+ OPJ_UINT32 ppt_len;
+ /** add fixed_quality */
+ OPJ_FLOAT32 distoratio[100];
+ /** tile-component coding parameters */
+ opj_tccp_t *tccps;
+ /** number of tile parts for the tile. */
+ OPJ_UINT32 m_nb_tile_parts;
+ /** data for the tile */
+ OPJ_BYTE * m_data;
+ /** size of data */
+ OPJ_UINT32 m_data_size;
+ /** encoding norms */
+ OPJ_FLOAT64 * mct_norms;
+ /** the mct decoding matrix */
+ OPJ_FLOAT32 * m_mct_decoding_matrix;
+ /** the mct coding matrix */
+ OPJ_FLOAT32 * m_mct_coding_matrix;
+ /** mct records */
+ opj_mct_data_t * m_mct_records;
+ /** the number of mct records. */
+ OPJ_UINT32 m_nb_mct_records;
+ /** the max number of mct records. */
+ OPJ_UINT32 m_nb_max_mct_records;
+ /** mcc records */
+ opj_simple_mcc_decorrelation_data_t * m_mcc_records;
+ /** the number of mct records. */
+ OPJ_UINT32 m_nb_mcc_records;
+ /** the max number of mct records. */
+ OPJ_UINT32 m_nb_max_mcc_records;
+
+
+ /***** FLAGS *******/
+ /** If ppt == 1 --> there was a PPT marker for the present tile */
+ OPJ_UINT32 ppt : 1;
+ /** indicates if a POC marker has been used O:NO, 1:YES */
+ OPJ_UINT32 POC : 1;
+} opj_tcp_t;
+
+
+
+
+typedef struct opj_encoding_param
+{
+ /** Digital cinema profile*/
+ OPJ_CINEMA_MODE m_cinema;
+ /** Maximum rate for each component. If == 0, component size limitation is not considered */
+ OPJ_UINT32 m_max_comp_size;
+ /** Position of tile part flag in progression order*/
+ OPJ_INT32 m_tp_pos;
+ /** fixed layer */
+ OPJ_INT32 *m_matrice;
+ /** Flag determining tile part generation*/
+ OPJ_BYTE m_tp_flag;
+ /** allocation by rate/distortion */
+ OPJ_UINT32 m_disto_alloc : 1;
+ /** allocation by fixed layer */
+ OPJ_UINT32 m_fixed_alloc : 1;
+ /** add fixed_quality */
+ OPJ_UINT32 m_fixed_quality : 1;
+ /** Enabling Tile part generation*/
+ OPJ_UINT32 m_tp_on : 1;
+}
+opj_encoding_param_t;
+
+typedef struct opj_decoding_param
+{
+ /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
+ OPJ_UINT32 m_reduce;
+ /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
+ OPJ_UINT32 m_layer;
+}
+opj_decoding_param_t;
+
+
+/**
+ * Coding parameters
+ */
+typedef struct opj_cp
+{
+ /** Size of the image in bits*/
+ /*int img_size;*/
+ /** Rsiz*/
+ OPJ_RSIZ_CAPABILITIES rsiz;
+ /** XTOsiz */
+ OPJ_UINT32 tx0; /* MSD see norm */
+ /** YTOsiz */
+ OPJ_UINT32 ty0; /* MSD see norm */
+ /** XTsiz */
+ OPJ_UINT32 tdx;
+ /** YTsiz */
+ OPJ_UINT32 tdy;
+ /** comment */
+ OPJ_CHAR *comment;
+ /** number of tiles in width */
+ OPJ_UINT32 tw;
+ /** number of tiles in heigth */
+ OPJ_UINT32 th;
+
+ /** packet header store there for futur use in t2_decode_packet */
+ OPJ_BYTE *ppm_data;
+ /** size of the ppm_data*/
+ OPJ_UINT32 ppm_len;
+ /** size of the ppm_data*/
+ OPJ_UINT32 ppm_data_read;
+
+ OPJ_BYTE *ppm_data_current;
+
+ /** packet header storage original buffer */
+ OPJ_BYTE *ppm_buffer;
+ /** pointer remaining on the first byte of the first header if ppm is used */
+ OPJ_BYTE *ppm_data_first;
+ /** Number of bytes actually stored inside the ppm_data */
+ OPJ_UINT32 ppm_data_size;
+ /** use in case of multiple marker PPM (number of info already store) */
+ OPJ_INT32 ppm_store;
+ /** use in case of multiple marker PPM (case on non-finished previous info) */
+ OPJ_INT32 ppm_previous;
+
+ /** tile coding parameters */
+ opj_tcp_t *tcps;
+
+ union
+ {
+ opj_decoding_param_t m_dec;
+ opj_encoding_param_t m_enc;
+ }
+ m_specific_param;
+
+
+/* UniPG>> */
+#ifdef USE_JPWL
+ /** enables writing of EPC in MH, thus activating JPWL */
+ OPJ_BOOL epc_on;
+ /** enables writing of EPB, in case of activated JPWL */
+ OPJ_BOOL epb_on;
+ /** enables writing of ESD, in case of activated JPWL */
+ OPJ_BOOL esd_on;
+ /** enables writing of informative techniques of ESD, in case of activated JPWL */
+ OPJ_BOOL info_on;
+ /** enables writing of RED, in case of activated JPWL */
+ OPJ_BOOL red_on;
+ /** error protection method for MH (0,1,16,32,37-128) */
+ int hprot_MH;
+ /** tile number of header protection specification (>=0) */
+ int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+ /** error protection methods for TPHs (0,1,16,32,37-128) */
+ int hprot_TPH[JPWL_MAX_NO_TILESPECS];
+ /** tile number of packet protection specification (>=0) */
+ int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+ /** packet number of packet protection specification (>=0) */
+ int pprot_packno[JPWL_MAX_NO_PACKSPECS];
+ /** error protection methods for packets (0,1,16,32,37-128) */
+ int pprot[JPWL_MAX_NO_PACKSPECS];
+ /** enables writing of ESD, (0/2/4 bytes) */
+ int sens_size;
+ /** sensitivity addressing size (0=auto/2/4 bytes) */
+ int sens_addr;
+ /** sensitivity range (0-3) */
+ int sens_range;
+ /** sensitivity method for MH (-1,0-7) */
+ int sens_MH;
+ /** tile number of sensitivity specification (>=0) */
+ int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+ /** sensitivity methods for TPHs (-1,0-7) */
+ int sens_TPH[JPWL_MAX_NO_TILESPECS];
+ /** enables JPWL correction at the decoder */
+ OPJ_BOOL correct;
+ /** expected number of components at the decoder */
+ int exp_comps;
+ /** maximum number of tiles at the decoder */
+ OPJ_UINT32 max_tiles;
+#endif /* USE_JPWL */
+
+ /******** FLAGS *********/
+ /** if ppm == 1 --> there was a PPM marker*/
+ OPJ_UINT32 ppm : 1;
+ /** tells if the parameter is a coding or decoding one */
+ OPJ_UINT32 m_is_decoder : 1;
+/* <<UniPG */
+} opj_cp_t;
+
+
+typedef struct opj_j2k_dec
+{
+ /** locate in which part of the codestream the decoder is (main header, tile header, end) */
+ OPJ_UINT32 m_state;
+ /**
+ * store decoding parameters common to all tiles (information like COD, COC in main header)
+ */
+ opj_tcp_t *m_default_tcp;
+ OPJ_BYTE *m_header_data;
+ OPJ_UINT32 m_header_data_size;
+ /** to tell the tile part length */
+ OPJ_UINT32 m_sot_length;
+ /** Only tiles index in the correct range will be decoded.*/
+ OPJ_UINT32 m_start_tile_x;
+ OPJ_UINT32 m_start_tile_y;
+ OPJ_UINT32 m_end_tile_x;
+ OPJ_UINT32 m_end_tile_y;
+ /**
+ * Decoded area set by the user
+ */
+ OPJ_UINT32 m_DA_x0;
+ OPJ_UINT32 m_DA_y0;
+ OPJ_UINT32 m_DA_x1;
+ OPJ_UINT32 m_DA_y1;
+
+ /** Index of the tile to decode (used in get_tile) */
+ OPJ_INT32 m_tile_ind_to_dec;
+ /** Position of the last SOT marker read */
+ OPJ_OFF_T m_last_sot_read_pos;
+
+ /**
+ * Indicate that the current tile-part is assume as the last tile part of the codestream.
+ * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
+ * SOD reader function. FIXME NOT USED for the moment
+ */
+ OPJ_BOOL m_last_tile_part;
+ /** to tell that a tile can be decoded. */
+ OPJ_UINT32 m_can_decode : 1;
+ OPJ_UINT32 m_discard_tiles : 1;
+ OPJ_UINT32 m_skip_data : 1;
+
+} opj_j2k_dec_t;
+
+typedef struct opj_j2k_enc
+{
+ /** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
+ OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
+
+ /** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
+ OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
+
+ /**
+ locate the start position of the TLM marker
+ after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
+ */
+ OPJ_OFF_T m_tlm_start;
+ /**
+ * Stores the sizes of the tlm.
+ */
+ OPJ_BYTE * m_tlm_sot_offsets_buffer;
+ /**
+ * The current offset of the tlm buffer.
+ */
+ OPJ_BYTE * m_tlm_sot_offsets_current;
+
+ /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
+ /** used in TLMmarker*/
+ OPJ_UINT32 m_total_tile_parts; /* totnum_tp */
+
+ /* encoded data for a tile */
+ OPJ_BYTE * m_encoded_tile_data;
+
+ /* size of the encoded_data */
+ OPJ_UINT32 m_encoded_tile_size;
+
+ /* encoded data for a tile */
+ OPJ_BYTE * m_header_tile_data;
+
+ /* size of the encoded_data */
+ OPJ_UINT32 m_header_tile_data_size;
+
+
+} opj_j2k_enc_t;
+
+
+
+struct opj_tcd;
+/**
+JPEG-2000 codestream reader/writer
+*/
+typedef struct opj_j2k
+{
+ /* J2K codestream is decoded*/
+ OPJ_BOOL m_is_decoder;
+
+ /* FIXME DOC*/
+ union
+ {
+ opj_j2k_dec_t m_decoder;
+ opj_j2k_enc_t m_encoder;
+ }
+ m_specific_param;
+
+ /** pointer to the internal/private encoded / decoded image */
+ opj_image_t* m_private_image;
+
+ /* pointer to the output image (decoded)*/
+ opj_image_t* m_output_image;
+
+ /** Coding parameters */
+ opj_cp_t m_cp;
+
+ /** the list of procedures to exec **/
+ opj_procedure_list_t * m_procedure_list;
+
+ /** the list of validation procedures to follow to make sure the code is valid **/
+ opj_procedure_list_t * m_validation_list;
+
+ /** helper used to write the index file */
+ opj_codestream_index_t *cstr_index;
+
+ /** number of the tile curently concern by coding/decoding */
+ OPJ_UINT32 m_current_tile_number;
+
+ /** the current tile coder/decoder **/
+ struct opj_tcd * m_tcd;
+
+}
+opj_j2k_t;
+
+
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in j2k->cp.
+@param j2k J2K decompressor handle
+@param parameters decompression parameters
+*/
+void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
+
+/**
+ * Creates a J2K compression structure
+ *
+ * @return Returns a handle to a J2K compressor if successful, returns NULL otherwise
+*/
+opj_j2k_t* opj_j2k_create_compress(void);
+
+
+void opj_j2k_setup_encoder( opj_j2k_t *p_j2k,
+ opj_cparameters_t *parameters,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager);
+
+/**
+Converts an enum type progression order to string type
+*/
+char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+/**
+ * Ends the decompression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *j2k,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Reads a jpeg2000 codestream header structure.
+ *
+ * @param p_stream the stream to read data from.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_image FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+OPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream,
+ opj_j2k_t* p_j2k,
+ opj_image_t** p_image,
+ opj_event_mgr_t* p_manager );
+
+
+/**
+ * Destroys a jpeg2000 codec.
+ *
+ * @param p_j2k the jpeg20000 structure to destroy.
+ */
+void opj_j2k_destroy (opj_j2k_t *p_j2k);
+
+/**
+ * Destroys a codestream index structure.
+ *
+ * @param p_cstr_ind the codestream index parameter to destroy.
+ */
+void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);
+
+/**
+ * Decode tile data.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_tile_index
+ * @param p_data FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+OPJ_BOOL opj_j2k_decode_tile ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a tile header.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_tile_x0 FIXME DOC
+ * @param p_tile_y0 FIXME DOC
+ * @param p_tile_x1 FIXME DOC
+ * @param p_tile_y1 FIXME DOC
+ * @param p_nb_comps FIXME DOC
+ * @param p_go_on FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+OPJ_BOOL opj_j2k_read_tile_header ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0,
+ OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1,
+ OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_go_on,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_image FIXME DOC
+ * @param p_start_x the left position of the rectangle to decode (in image coordinates).
+ * @param p_start_y the up position of the rectangle to decode (in image coordinates).
+ * @param p_end_x the right position of the rectangle to decode (in image coordinates).
+ * @param p_end_y the bottom position of the rectangle to decode (in image coordinates).
+ * @param p_manager the user event manager
+ *
+ * @return true if the area could be set.
+ */
+OPJ_BOOL opj_j2k_set_decode_area( opj_j2k_t *p_j2k,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a J2K decompression structure.
+ *
+ * @return a handle to a J2K decompressor if successful, NULL otherwise.
+ */
+opj_j2k_t* opj_j2k_create_decompress(void);
+
+
+/**
+ * Dump some elements from the J2K decompression structure .
+ *
+ *@param p_j2k the jpeg2000 codec.
+ *@param flag flag to describe what elments are dump.
+ *@param out_stream output stream where dump the elements.
+ *
+*/
+void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
+
+
+
+/**
+ * Dump an image header structure.
+ *
+ *@param image the image header to dump.
+ *@param dev_dump_flag flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream output stream where dump the elements.
+ */
+void j2k_dump_image_header(opj_image_t* image, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+
+/**
+ * Dump a component image header structure.
+ *
+ *@param comp the component image header to dump.
+ *@param dev_dump_flag flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream output stream where dump the elements.
+ */
+void j2k_dump_image_comp_header(opj_image_comp_t* comp, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+
+/**
+ * Get the codestream info from a JPEG2000 codec.
+ *
+ *@param p_j2k the component image header to dump.
+ *
+ *@return the codestream information extract from the jpg2000 codec
+ */
+opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k);
+
+/**
+ * Get the codestream index from a JPEG2000 codec.
+ *
+ *@param p_j2k the component image header to dump.
+ *
+ *@return the codestream index extract from the jpg2000 codec
+ */
+opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k);
+
+/**
+ * Decode an image from a JPEG-2000 codestream
+ * @param j2k J2K decompressor handle
+ * @param p_stream FIXME DOC
+ * @param p_image FIXME DOC
+ * @param p_manager FIXME DOC
+ * @return FIXME DOC
+*/
+OPJ_BOOL opj_j2k_decode(opj_j2k_t *j2k,
+ opj_stream_private_t *p_stream,
+ opj_image_t *p_image,
+ opj_event_mgr_t *p_manager);
+
+
+OPJ_BOOL opj_j2k_get_tile( opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager,
+ OPJ_UINT32 tile_index );
+
+OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager);
+
+
+/**
+ * Writes a tile.
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+OPJ_BOOL opj_j2k_write_tile ( opj_j2k_t * p_j2k,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Encodes an image into a JPEG-2000 codestream
+ */
+OPJ_BOOL opj_j2k_encode( opj_j2k_t * p_j2k,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
+ *
+ * @param p_j2k the jpeg2000 codec.
+ * @param p_stream the stream object.
+ * @param p_image FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the codec is valid.
+ */
+OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
+ opj_stream_private_t *p_stream,
+ opj_image_t * p_image,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Ends the compression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_j2k_end_compress( opj_j2k_t *p_j2k,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager);
+
+OPJ_BOOL opj_j2k_setup_mct_encoding (opj_tcp_t * p_tcp, opj_image_t * p_image);
+
+
+#endif /* __J2K_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
new file mode 100644
index 0000000000..0a16d1e0e0
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c
@@ -0,0 +1,2825 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "opj_includes.h"
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+#define OPJ_BOX_SIZE 1024
+
+/** @name Local static functions */
+/*@{*/
+
+/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
+
+/**
+ * Reads a IHDR box - Image Header box
+ *
+ * @param p_image_header_data pointer to actual data (already read from file)
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_image_header_size the size of the image header
+ * @param p_manager the user event manager.
+ *
+ * @return true if the image header is valid, false else.
+ */
+static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
+ OPJ_BYTE *p_image_header_data,
+ OPJ_UINT32 p_image_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the Image Header box - Image Header box.
+ *
+ * @param jp2 jpeg2000 file codec.
+ * @param p_nb_bytes_written pointer to store the nb of bytes written by the function.
+ *
+ * @return the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Writes the Bit per Component box.
+ *
+ * @param jp2 jpeg2000 file codec.
+ * @param p_nb_bytes_written pointer to store the nb of bytes written by the function.
+ *
+ * @return the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_bpcc( opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Reads a Bit per Component box.
+ *
+ * @param p_bpc_header_data pointer to actual data (already read from file)
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_bpc_header_size the size of the bpc header
+ * @param p_manager the user event manager.
+ *
+ * @return true if the bpc header is valid, fale else.
+ */
+static OPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,
+ OPJ_BYTE * p_bpc_header_data,
+ OPJ_UINT32 p_bpc_header_size,
+ opj_event_mgr_t * p_manager );
+
+static OPJ_BOOL opj_jp2_read_cdef( opj_jp2_t * jp2,
+ OPJ_BYTE * p_cdef_header_data,
+ OPJ_UINT32 p_cdef_header_size,
+ opj_event_mgr_t * p_manager );
+
+static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color);
+
+/**
+ * Writes the Colour Specification box.
+ *
+ * @param jp2 jpeg2000 file codec.
+ * @param p_nb_bytes_written pointer to store the nb of bytes written by the function.
+ *
+ * @return the data being copied.
+*/
+static OPJ_BYTE * opj_jp2_write_colr( opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written );
+
+/**
+ * Writes a FTYP box - File type box
+ *
+ * @param cio the stream to write data to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager the user event manager.
+ *
+ * @return true if writing was successful.
+ */
+static OPJ_BOOL opj_jp2_write_ftyp( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a a FTYP box - File type box
+ *
+ * @param p_header_data the data contained in the FTYP box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the FTYP box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the FTYP box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_ftyp( opj_jp2_t *jp2,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+OPJ_BOOL opj_jp2_skip_jp2c( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param p_header_data the data contained in the file header box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the file header box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the JP2 Header box was successfully reconized.
+*/
+static OPJ_BOOL opj_jp2_read_jp2h( opj_jp2_t *jp2,
+ OPJ_BYTE *p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
+ *
+ * @param cio the stream to write data to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager user event manager.
+ *
+ * @return true if writing was successful.
+*/
+static OPJ_BOOL opj_jp2_write_jp2c( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+#ifdef USE_JPIP
+/**
+ * Write index Finder box
+ * @param cio the stream to write to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager user event manager.
+*/
+static OPJ_BOOL opj_jpip_write_iptr( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Write index Finder box
+ * @param cio the stream to write to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager user event manager.
+ */
+static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Write file Index (superbox)
+ * @param cio the stream to write to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager user event manager.
+ */
+static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+#endif /* USE_JPIP */
+
+/**
+ * Reads a jpeg2000 file signature box.
+ *
+ * @param p_header_data the data contained in the signature box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the signature box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the file signature box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Writes a jpeg2000 file signature box.
+ *
+ * @param cio the stream to write data to.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_manager the user event manager.
+ *
+ * @return true if writing was successful.
+ */
+static OPJ_BOOL opj_jp2_write_jp( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+Apply collected palette data
+@param color Collector for profile, cdef and pclr data
+@param image
+*/
+static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);
+
+static void opj_jp2_free_pclr(opj_jp2_color_t *color);
+
+/**
+ * Collect palette data
+ *
+ * @param jp2 JP2 handle
+ * @param p_pclr_header_data FIXME DOC
+ * @param p_pclr_header_size FIXME DOC
+ * @param p_manager
+ *
+ * @return Returns true if successful, returns false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_pclr( opj_jp2_t *jp2,
+ OPJ_BYTE * p_pclr_header_data,
+ OPJ_UINT32 p_pclr_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Collect component mapping data
+ *
+ * @param jp2 JP2 handle
+ * @param p_cmap_header_data FIXME DOC
+ * @param p_cmap_header_size FIXME DOC
+ * @param p_manager FIXME DOC
+ *
+ * @return Returns true if successful, returns false otherwise
+*/
+
+static OPJ_BOOL opj_jp2_read_cmap( opj_jp2_t * jp2,
+ OPJ_BYTE * p_cmap_header_data,
+ OPJ_UINT32 p_cmap_header_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads the Color Specification box.
+ *
+ * @param p_colr_header_data pointer to actual data (already read from file)
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_colr_header_size the size of the color header
+ * @param p_manager the user event manager.
+ *
+ * @return true if the bpc header is valid, fale else.
+*/
+static OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
+ OPJ_BYTE * p_colr_header_data,
+ OPJ_UINT32 p_colr_header_size,
+ opj_event_mgr_t * p_manager );
+
+/*@}*/
+
+/*@}*/
+
+/**
+ * Sets up the procedures to do on writing header after the codestream.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on reading header after the codestream.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2);
+
+/**
+ * Reads a jpeg2000 file header structure.
+ *
+ * @param jp2 the jpeg2000 file header structure.
+ * @param stream the stream to read data from.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_header_procedure( opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param p_procedure_list the list of procedures to execute
+ * @param jp2 the jpeg2000 file codec to execute the procedures on.
+ * @param stream the stream to execute the procedures on.
+ * @param p_manager the user manager.
+ *
+ * @return true if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_jp2_exec ( opj_jp2_t * jp2,
+ opj_procedure_list_t * p_procedure_list,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
+ *
+ * @param cio the input stream to read data from.
+ * @param box the box structure to fill.
+ * @param p_number_bytes_read pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param p_manager user event manager.
+ *
+ * @return true if the box is reconized, false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
+ OPJ_UINT32 * p_number_bytes_read,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_header_writing (opj_jp2_t *jp2);
+
+OPJ_BOOL opj_jp2_default_validation ( opj_jp2_t * jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Finds the image execution function related to the given box id.
+ *
+ * @param p_id the id of the handler to fetch.
+ *
+ * @return the given handler or NULL if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);
+
+/**
+ * Finds the execution function related to the given box id.
+ *
+ * @param p_id the id of the handler to fetch.
+ *
+ * @return the given handler or NULL if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );
+
+const opj_jp2_header_handler_t jp2_header [] =
+{
+ {JP2_JP,opj_jp2_read_jp},
+ {JP2_FTYP,opj_jp2_read_ftyp},
+ {JP2_JP2H,opj_jp2_read_jp2h}
+};
+
+const opj_jp2_header_handler_t jp2_img_header [] =
+{
+ {JP2_IHDR,opj_jp2_read_ihdr},
+ {JP2_COLR,opj_jp2_read_colr},
+ {JP2_BPCC,opj_jp2_read_bpcc},
+ {JP2_PCLR,opj_jp2_read_pclr},
+ {JP2_CMAP,opj_jp2_read_cmap},
+ {JP2_CDEF,opj_jp2_read_cdef}
+
+};
+
+/**
+ * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
+ *
+ * @param box the box structure to fill.
+ * @param p_data the character string to read data from.
+ * @param p_number_bytes_read pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param p_box_max_size the maximum number of bytes in the box.
+ * @param p_manager FIXME DOC
+ *
+ * @return true if the box is reconized, false otherwise
+*/
+static OPJ_BOOL opj_jp2_read_boxhdr_char( opj_jp2_box_t *box,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_number_bytes_read,
+ OPJ_UINT32 p_box_max_size,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * are valid. Developpers wanting to extend the library can add their own validation procedures.
+ */
+static void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2);
+
+/**
+ * Sets up the procedures to do on reading header.
+ * Developpers wanting to extend the library can add their own writing procedures.
+ */
+static void opj_jp2_setup_header_reading (opj_jp2_t *jp2);
+
+/* ----------------------------------------------------------------------- */
+ OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
+ OPJ_UINT32 * p_number_bytes_read,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ /* read header from file */
+ OPJ_BYTE l_data_header [8];
+
+ /* preconditions */
+ assert(cio != 00);
+ assert(box != 00);
+ assert(p_number_bytes_read != 00);
+ assert(p_manager != 00);
+
+ *p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
+ if (*p_number_bytes_read != 8) {
+ return OPJ_FALSE;
+ }
+
+ /* process read data */
+ opj_read_bytes(l_data_header,&(box->length), 4);
+ opj_read_bytes(l_data_header+4,&(box->type), 4);
+
+ if(box->length == 0)/* last box */
+ {
+ const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
+ box->length = (OPJ_UINT32)bleft;
+ assert( (OPJ_OFF_T)box->length == bleft );
+ return OPJ_TRUE;
+ }
+
+ /* do we have a "special very large box ?" */
+ /* read then the XLBox */
+ if (box->length == 1) {
+ OPJ_UINT32 l_xl_part_size;
+
+ OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
+ if (l_nb_bytes_read != 8) {
+ if (l_nb_bytes_read > 0) {
+ *p_number_bytes_read += l_nb_bytes_read;
+ }
+
+ return OPJ_FALSE;
+ }
+
+ *p_number_bytes_read = 16;
+ opj_read_bytes(l_data_header,&l_xl_part_size, 4);
+ if (l_xl_part_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
+ return OPJ_FALSE;
+ }
+ opj_read_bytes(l_data_header+4,&(box->length), 4);
+ }
+ return OPJ_TRUE;
+}
+
+#if 0
+static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
+ OPJ_UINT32 i;
+ opj_jp2_box_t box;
+
+ box.init_pos = cio_tell(cio);
+ cio_skip(cio, 4);
+ cio_write(cio, JP2_URL, 4); /* DBTL */
+ cio_write(cio, 0, 1); /* VERS */
+ cio_write(cio, 0, 3); /* FLAG */
+
+ if(Idx_file) {
+ for (i = 0; i < strlen(Idx_file); i++) {
+ cio_write(cio, Idx_file[i], 1);
+ }
+ }
+
+ box.length = cio_tell(cio) - box.init_pos;
+ cio_seek(cio, box.init_pos);
+ cio_write(cio, box.length, 4); /* L */
+ cio_seek(cio, box.init_pos + box.length);
+}
+#endif
+
+OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
+ OPJ_BYTE *p_image_header_data,
+ OPJ_UINT32 p_image_header_size,
+ opj_event_mgr_t * p_manager )
+{
+ /* preconditions */
+ assert(p_image_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ if (p_image_header_size != 14) {
+ opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_image_header_data,&(jp2->h),4); /* HEIGHT */
+ p_image_header_data += 4;
+ opj_read_bytes(p_image_header_data,&(jp2->w),4); /* WIDTH */
+ p_image_header_data += 4;
+ opj_read_bytes(p_image_header_data,&(jp2->numcomps),2); /* NC */
+ p_image_header_data += 2;
+
+ /* allocate memory for components */
+ jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
+ if (jp2->comps == 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
+ return OPJ_FALSE;
+ }
+ memset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));
+
+ opj_read_bytes(p_image_header_data,&(jp2->bpc),1); /* BPC */
+ ++ p_image_header_data;
+
+ opj_read_bytes(p_image_header_data,&(jp2->C),1); /* C */
+ ++ p_image_header_data;
+
+ /* Should be equal to 7 cf. chapter about image header box of the norm */
+ if (jp2->C != 7){
+ opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n", jp2->C);
+ }
+
+ opj_read_bytes(p_image_header_data,&(jp2->UnkC),1); /* UnkC */
+ ++ p_image_header_data;
+ opj_read_bytes(p_image_header_data,&(jp2->IPR),1); /* IPR */
+ ++ p_image_header_data;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written
+ )
+{
+ OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_nb_bytes_written != 00);
+
+ /* default image header is 22 bytes wide */
+ l_ihdr_data = (OPJ_BYTE *) opj_malloc(22);
+ if (l_ihdr_data == 00) {
+ return 00;
+ }
+ memset(l_ihdr_data,0,22);
+
+ l_current_ihdr_ptr = l_ihdr_data;
+
+ opj_write_bytes(l_current_ihdr_ptr,22,4); /* write box size */
+ l_current_ihdr_ptr+=4;
+
+ opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4); /* IHDR */
+ l_current_ihdr_ptr+=4;
+
+ opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4); /* HEIGHT */
+ l_current_ihdr_ptr+=4;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4); /* WIDTH */
+ l_current_ihdr_ptr+=4;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2); /* NC */
+ l_current_ihdr_ptr+=2;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1); /* BPC */
+ ++l_current_ihdr_ptr;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1); /* C : Always 7 */
+ ++l_current_ihdr_ptr;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1); /* UnkC, colorspace unknown */
+ ++l_current_ihdr_ptr;
+
+ opj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1); /* IPR, no intellectual property */
+ ++l_current_ihdr_ptr;
+
+ *p_nb_bytes_written = 22;
+
+ return l_ihdr_data;
+}
+
+OPJ_BYTE * opj_jp2_write_bpcc( opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written
+ )
+{
+ OPJ_UINT32 i;
+ /* room for 8 bytes for box and 1 byte for each component */
+ OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;
+ OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_nb_bytes_written != 00);
+
+ l_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size);
+ if (l_bpcc_data == 00) {
+ return 00;
+ }
+ memset(l_bpcc_data,0,l_bpcc_size);
+
+ l_current_bpcc_ptr = l_bpcc_data;
+
+ opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4); /* write box size */
+ l_current_bpcc_ptr += 4;
+
+ opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4); /* BPCC */
+ l_current_bpcc_ptr += 4;
+
+ for (i = 0; i < jp2->numcomps; ++i) {
+ opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */
+ ++l_current_bpcc_ptr;
+ }
+
+ *p_nb_bytes_written = l_bpcc_size;
+
+ return l_bpcc_data;
+}
+
+OPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,
+ OPJ_BYTE * p_bpc_header_data,
+ OPJ_UINT32 p_bpc_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i;
+
+ /* preconditions */
+ assert(p_bpc_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+
+ if (jp2->bpc != 255 ){
+ opj_event_msg(p_manager, EVT_WARNING, "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",jp2->bpc);
+ }
+
+ /* and length is relevant */
+ if (p_bpc_header_size != jp2->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
+ return OPJ_FALSE;
+ }
+
+ /* read info for each component */
+ for (i = 0; i < jp2->numcomps; ++i) {
+ opj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1); /* read each BPCC component */
+ ++p_bpc_header_data;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BYTE * opj_jp2_write_colr( opj_jp2_t *jp2,
+ OPJ_UINT32 * p_nb_bytes_written
+ )
+{
+ /* room for 8 bytes for box 3 for common data and variable upon profile*/
+ OPJ_UINT32 l_colr_size = 11;
+ OPJ_BYTE * l_colr_data,* l_current_colr_ptr;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_nb_bytes_written != 00);
+ assert(jp2->meth == 1 || jp2->meth == 2);
+
+ switch (jp2->meth) {
+ case 1 :
+ l_colr_size += 4; /* EnumCS */
+ break;
+ case 2 :
+ assert(jp2->color.icc_profile_len); /* ICC profile */
+ l_colr_size += jp2->color.icc_profile_len;
+ break;
+ default :
+ return 00;
+ }
+
+ l_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size);
+ if (l_colr_data == 00) {
+ return 00;
+ }
+ memset(l_colr_data,0,l_colr_size);
+
+ l_current_colr_ptr = l_colr_data;
+
+ opj_write_bytes(l_current_colr_ptr,l_colr_size,4); /* write box size */
+ l_current_colr_ptr += 4;
+
+ opj_write_bytes(l_current_colr_ptr,JP2_COLR,4); /* BPCC */
+ l_current_colr_ptr += 4;
+
+ opj_write_bytes(l_current_colr_ptr, jp2->meth,1); /* METH */
+ ++l_current_colr_ptr;
+
+ opj_write_bytes(l_current_colr_ptr, jp2->precedence,1); /* PRECEDENCE */
+ ++l_current_colr_ptr;
+
+ opj_write_bytes(l_current_colr_ptr, jp2->approx,1); /* APPROX */
+ ++l_current_colr_ptr;
+
+ if (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
+ opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); } /* EnumCS */
+ else {
+ if (jp2->meth == 2) { /* ICC profile */
+ OPJ_UINT32 i;
+ for(i = 0; i < jp2->color.icc_profile_len; ++i) {
+ opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
+ ++l_current_colr_ptr;
+ }
+ }
+ }
+
+ *p_nb_bytes_written = l_colr_size;
+
+ return l_colr_data;
+}
+
+void opj_jp2_free_pclr(opj_jp2_color_t *color)
+{
+ opj_free(color->jp2_pclr->channel_sign);
+ opj_free(color->jp2_pclr->channel_size);
+ opj_free(color->jp2_pclr->entries);
+
+ if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
+
+ opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
+}
+
+static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *p_manager)
+{
+ OPJ_UINT16 i;
+
+ /* testcase 4149.pdf.SIGSEGV.cf7.3501 */
+ if (color->jp2_cdef) {
+ opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
+ OPJ_UINT16 n = color->jp2_cdef->n;
+
+ for (i = 0; i < n; i++) {
+ if (info[i].cn >= image->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, image->numcomps);
+ return OPJ_FALSE;
+ }
+ if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= image->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, image->numcomps);
+ return OPJ_FALSE;
+ }
+ }
+ }
+
+ /* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
+ 66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
+ if (color->jp2_pclr && color->jp2_pclr->cmap) {
+ OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
+ opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
+ OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
+
+ /* verify that all original components match an existing one */
+ for (i = 0; i < nr_channels; i++) {
+ if (cmap[i].cmp >= image->numcomps) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps);
+ is_sane = OPJ_FALSE;
+ }
+ }
+
+ pcol_usage = opj_calloc(nr_channels, sizeof(OPJ_BOOL));
+ if (!pcol_usage) {
+ opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
+ return OPJ_FALSE;
+ }
+ /* verify that no component is targeted more than once */
+ for (i = 0; i < nr_channels; i++) {
+ OPJ_UINT16 pcol = cmap[i].pcol;
+ assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1);
+ if (pcol >= nr_channels) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
+ is_sane = OPJ_FALSE;
+ }
+ else if (pcol_usage[pcol] && cmap[i].mtyp == 1) {
+ opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
+ is_sane = OPJ_FALSE;
+ }
+ else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
+ /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
+ * the value of this field shall be 0. */
+ opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol);
+ is_sane = OPJ_FALSE;
+ }
+ else
+ pcol_usage[pcol] = OPJ_TRUE;
+ }
+ /* verify that all components are targeted at least once */
+ for (i = 0; i < nr_channels; i++) {
+ if (!pcol_usage[i] && cmap[i].mtyp != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n", i);
+ is_sane = OPJ_FALSE;
+ }
+ }
+ opj_free(pcol_usage);
+ if (!is_sane) {
+ return OPJ_FALSE;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+/* file9.jp2 */
+void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
+{
+ opj_image_comp_t *old_comps, *new_comps;
+ OPJ_BYTE *channel_size, *channel_sign;
+ OPJ_UINT32 *entries;
+ opj_jp2_cmap_comp_t *cmap;
+ OPJ_INT32 *src, *dst;
+ OPJ_UINT32 j, max;
+ OPJ_UINT16 i, nr_channels, cmp, pcol;
+ OPJ_INT32 k, top_k;
+
+ channel_size = color->jp2_pclr->channel_size;
+ channel_sign = color->jp2_pclr->channel_sign;
+ entries = color->jp2_pclr->entries;
+ cmap = color->jp2_pclr->cmap;
+ nr_channels = color->jp2_pclr->nr_channels;
+
+ old_comps = image->comps;
+ new_comps = (opj_image_comp_t*)
+ opj_malloc(nr_channels * sizeof(opj_image_comp_t));
+
+ for(i = 0; i < nr_channels; ++i) {
+ pcol = cmap[i].pcol; cmp = cmap[i].cmp;
+
+ /* Direct use */
+ if(cmap[i].mtyp == 0){
+ assert( pcol == 0 );
+ new_comps[i] = old_comps[cmp];
+ } else {
+ assert( i == pcol );
+ new_comps[pcol] = old_comps[cmp];
+ }
+
+ /* Palette mapping: */
+ new_comps[i].data = (OPJ_INT32*)
+ opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
+ new_comps[i].prec = channel_size[i];
+ new_comps[i].sgnd = channel_sign[i];
+ }
+
+ top_k = color->jp2_pclr->nr_entries - 1;
+
+ for(i = 0; i < nr_channels; ++i) {
+ /* Palette mapping: */
+ cmp = cmap[i].cmp; pcol = cmap[i].pcol;
+ src = old_comps[cmp].data;
+ assert( src );
+ max = new_comps[pcol].w * new_comps[pcol].h;
+
+ /* Direct use: */
+ if(cmap[i].mtyp == 0) {
+ assert( cmp == 0 );
+ dst = new_comps[i].data;
+ assert( dst );
+ for(j = 0; j < max; ++j) {
+ dst[j] = src[j];
+ }
+ }
+ else {
+ assert( i == pcol );
+ dst = new_comps[pcol].data;
+ assert( dst );
+ for(j = 0; j < max; ++j) {
+ /* The index */
+ if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
+
+ /* The colour */
+ dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
+ }
+ }
+ }
+
+ max = image->numcomps;
+ for(i = 0; i < max; ++i) {
+ if(old_comps[i].data) opj_free(old_comps[i].data);
+ }
+
+ opj_free(old_comps);
+ image->comps = new_comps;
+ image->numcomps = nr_channels;
+
+ opj_jp2_free_pclr(color);
+
+}/* apply_pclr() */
+
+OPJ_BOOL opj_jp2_read_pclr( opj_jp2_t *jp2,
+ OPJ_BYTE * p_pclr_header_data,
+ OPJ_UINT32 p_pclr_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_jp2_pclr_t *jp2_pclr;
+ OPJ_BYTE *channel_size, *channel_sign;
+ OPJ_UINT32 *entries;
+ OPJ_UINT16 nr_entries,nr_channels;
+ OPJ_UINT16 i, j;
+ OPJ_UINT32 l_value;
+ OPJ_BYTE *orig_header_data = p_pclr_header_data;
+
+ /* preconditions */
+ assert(p_pclr_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+ (void)p_pclr_header_size;
+
+ if(jp2->color.jp2_pclr)
+ return OPJ_FALSE;
+
+ if (p_pclr_header_size < 3)
+ return OPJ_FALSE;
+
+ opj_read_bytes(p_pclr_header_data, &l_value , 2); /* NE */
+ p_pclr_header_data += 2;
+ nr_entries = (OPJ_UINT16) l_value;
+
+ opj_read_bytes(p_pclr_header_data, &l_value , 1); /* NPC */
+ ++p_pclr_header_data;
+ nr_channels = (OPJ_UINT16) l_value;
+
+ if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels || nr_channels == 0 || nr_entries >= (OPJ_UINT32)-1 / nr_channels)
+ return OPJ_FALSE;
+
+ entries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(OPJ_UINT32));
+ if (!entries)
+ return OPJ_FALSE;
+ channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
+ if (!channel_size)
+ {
+ opj_free(entries);
+ return OPJ_FALSE;
+ }
+ channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
+ if (!channel_sign)
+ {
+ opj_free(entries);
+ opj_free(channel_size);
+ return OPJ_FALSE;
+ }
+
+ jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
+ if (!jp2_pclr)
+ {
+ opj_free(entries);
+ opj_free(channel_size);
+ opj_free(channel_sign);
+ return OPJ_FALSE;
+ }
+
+ jp2_pclr->channel_sign = channel_sign;
+ jp2_pclr->channel_size = channel_size;
+ jp2_pclr->entries = entries;
+ jp2_pclr->nr_entries = nr_entries;
+ jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
+ jp2_pclr->cmap = NULL;
+
+ jp2->color.jp2_pclr = jp2_pclr;
+
+ for(i = 0; i < nr_channels; ++i) {
+ opj_read_bytes(p_pclr_header_data, &l_value , 1); /* Bi */
+ ++p_pclr_header_data;
+
+ channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
+ channel_sign[i] = (l_value & 0x80) ? 1 : 0;
+ }
+
+ for(j = 0; j < nr_entries; ++j) {
+ for(i = 0; i < nr_channels; ++i) {
+ OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i]+7)>>3);
+
+ if (bytes_to_read > sizeof(OPJ_UINT32))
+ bytes_to_read = sizeof(OPJ_UINT32);
+ if ((ptrdiff_t)p_pclr_header_size < p_pclr_header_data - orig_header_data + (ptrdiff_t)bytes_to_read)
+ return OPJ_FALSE;
+
+ opj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read); /* Cji */
+ p_pclr_header_data += bytes_to_read;
+ *entries = (OPJ_UINT32) l_value;
+ entries++;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_cmap( opj_jp2_t * jp2,
+ OPJ_BYTE * p_cmap_header_data,
+ OPJ_UINT32 p_cmap_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_jp2_cmap_comp_t *cmap;
+ OPJ_BYTE i, nr_channels;
+ OPJ_UINT32 l_value;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_cmap_header_data != 00);
+ assert(p_manager != 00);
+ (void)p_cmap_header_size;
+
+ /* Need nr_channels: */
+ if(jp2->color.jp2_pclr == NULL) {
+ opj_event_msg(p_manager, EVT_ERROR, "Need to read a PCLR box before the CMAP box.\n");
+ return OPJ_FALSE;
+ }
+
+ /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
+ * inside a JP2 Header box' :
+ */
+ if(jp2->color.jp2_pclr->cmap) {
+ opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
+ return OPJ_FALSE;
+ }
+
+ nr_channels = jp2->color.jp2_pclr->nr_channels;
+ if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
+ opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
+ return OPJ_FALSE;
+ }
+
+ cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
+ if (!cmap)
+ return OPJ_FALSE;
+
+
+ for(i = 0; i < nr_channels; ++i) {
+ opj_read_bytes(p_cmap_header_data, &l_value, 2); /* CMP^i */
+ p_cmap_header_data +=2;
+ cmap[i].cmp = (OPJ_UINT16) l_value;
+
+ opj_read_bytes(p_cmap_header_data, &l_value, 1); /* MTYP^i */
+ ++p_cmap_header_data;
+ cmap[i].mtyp = (OPJ_BYTE) l_value;
+
+ opj_read_bytes(p_cmap_header_data, &l_value, 1); /* PCOL^i */
+ ++p_cmap_header_data;
+ cmap[i].pcol = (OPJ_BYTE) l_value;
+ }
+
+ jp2->color.jp2_pclr->cmap = cmap;
+
+ return OPJ_TRUE;
+}
+
+void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
+{
+ opj_jp2_cdef_info_t *info;
+ OPJ_UINT16 i, n, cn, asoc, acn;
+
+ info = color->jp2_cdef->info;
+ n = color->jp2_cdef->n;
+
+ for(i = 0; i < n; ++i)
+ {
+ /* WATCH: acn = asoc - 1 ! */
+ asoc = info[i].asoc;
+ if(asoc == 0 || asoc == 65535)
+ {
+ if (i < image->numcomps)
+ image->comps[i].alpha = info[i].typ;
+ continue;
+ }
+
+ cn = info[i].cn;
+ acn = (OPJ_UINT16)(asoc - 1);
+ if( cn >= image->numcomps || acn >= image->numcomps )
+ {
+ fprintf(stderr, "cn=%d, acn=%d, numcomps=%d\n", cn, acn, image->numcomps);
+ continue;
+ }
+
+ if(cn != acn)
+ {
+ opj_image_comp_t saved;
+
+ memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
+ memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
+ memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
+
+ info[i].asoc = (OPJ_UINT16)(cn + 1);
+ info[acn].asoc = (OPJ_UINT16)(info[acn].cn + 1);
+ }
+
+ image->comps[cn].alpha = info[i].typ;
+ }
+
+ if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
+
+ opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
+
+}/* jp2_apply_cdef() */
+
+OPJ_BOOL opj_jp2_read_cdef( opj_jp2_t * jp2,
+ OPJ_BYTE * p_cdef_header_data,
+ OPJ_UINT32 p_cdef_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_jp2_cdef_info_t *cdef_info;
+ OPJ_UINT16 i;
+ OPJ_UINT32 l_value;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_cdef_header_data != 00);
+ assert(p_manager != 00);
+ (void)p_cdef_header_size;
+
+ /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
+ * inside a JP2 Header box.'*/
+ if(jp2->color.jp2_cdef) return OPJ_FALSE;
+
+ if (p_cdef_header_size < 2) {
+ opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_cdef_header_data,&l_value ,2); /* N */
+ p_cdef_header_data+= 2;
+
+ if ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */
+ opj_event_msg(p_manager, EVT_ERROR, "Number of channel description is equal to zero in CDEF box.\n");
+ return OPJ_FALSE;
+ }
+
+ if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
+ opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+ return OPJ_FALSE;
+ }
+
+ cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));
+ if (!cdef_info)
+ return OPJ_FALSE;
+
+ jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+ if(!jp2->color.jp2_cdef)
+ {
+ opj_free(cdef_info);
+ return OPJ_FALSE;
+ }
+ jp2->color.jp2_cdef->info = cdef_info;
+ jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
+
+ for(i = 0; i < jp2->color.jp2_cdef->n; ++i) {
+ opj_read_bytes(p_cdef_header_data, &l_value, 2); /* Cn^i */
+ p_cdef_header_data +=2;
+ cdef_info[i].cn = (OPJ_UINT16) l_value;
+
+ opj_read_bytes(p_cdef_header_data, &l_value, 2); /* Typ^i */
+ p_cdef_header_data +=2;
+ cdef_info[i].typ = (OPJ_UINT16) l_value;
+
+ opj_read_bytes(p_cdef_header_data, &l_value, 2); /* Asoc^i */
+ p_cdef_header_data +=2;
+ cdef_info[i].asoc = (OPJ_UINT16) l_value;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
+ OPJ_BYTE * p_colr_header_data,
+ OPJ_UINT32 p_colr_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_value;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_colr_header_data != 00);
+ assert(p_manager != 00);
+
+ if (p_colr_header_size < 3) {
+ opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
+ return OPJ_FALSE;
+ }
+
+ /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
+ * Specification boxes after the first.'
+ */
+ if(jp2->color.jp2_has_colr) {
+ opj_event_msg(p_manager, EVT_INFO, "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
+ p_colr_header_data += p_colr_header_size;
+ return OPJ_TRUE;
+ }
+
+ opj_read_bytes(p_colr_header_data,&jp2->meth ,1); /* METH */
+ ++p_colr_header_data;
+
+ opj_read_bytes(p_colr_header_data,&jp2->precedence ,1); /* PRECEDENCE */
+ ++p_colr_header_data;
+
+ opj_read_bytes(p_colr_header_data,&jp2->approx ,1); /* APPROX */
+ ++p_colr_header_data;
+
+ if (jp2->meth == 1) {
+ if (p_colr_header_size > 7) {
+ /* testcase Altona_Technical_v20_x4.pdf */
+ opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
+ }
+
+ opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4); /* EnumCS */
+
+ p_colr_header_data += 4;
+
+ if(jp2->enumcs == 14)/* CIELab */
+ {
+ OPJ_UINT32 *cielab;
+ OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
+
+ cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
+ cielab[0] = 14; /* enumcs */
+
+ if(p_colr_header_size == 7)/* default values */
+ {
+ rl = ra = rb = ol = oa = ob = 0;
+ il = 0x00443530; /* D50 */
+ cielab[1] = 0x44454600;/* DEF */
+ }
+ else if(p_colr_header_size == 35)
+ {
+ opj_read_bytes(p_colr_header_data, &rl, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &ol, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &ra, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &oa, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &rb, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &ob, 4);
+ p_colr_header_data += 4;
+ opj_read_bytes(p_colr_header_data, &il, 4);
+ p_colr_header_data += 4;
+ cielab[1] = 0;
+ }
+ cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
+ cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
+ cielab[8] = il;
+
+ jp2->color.icc_profile_buf = (unsigned char*)cielab;
+ jp2->color.icc_profile_len = 0;
+ }
+
+ jp2->color.jp2_has_colr = 1;
+ }
+ else if (jp2->meth == 2) {
+ /* ICC profile */
+ OPJ_INT32 it_icc_value = 0;
+ OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
+
+ jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
+ jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc((size_t)icc_len);
+ if (!jp2->color.icc_profile_buf)
+ {
+ jp2->color.icc_profile_len = 0;
+ return OPJ_FALSE;
+ }
+ memset(jp2->color.icc_profile_buf, 0, (size_t)icc_len * sizeof(OPJ_BYTE));
+
+ for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
+ {
+ opj_read_bytes(p_colr_header_data,&l_value,1); /* icc values */
+ ++p_colr_header_data;
+ jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
+ }
+
+ jp2->color.jp2_has_colr = 1;
+ }
+ else if (jp2->meth > 2)
+ {
+ /* ISO/IEC 15444-1:2004 (E), Table I.9 ?Legal METH values:
+ conforming JP2 reader shall ignore the entire Colour Specification box.*/
+ opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), "
+ "so we will ignore the entire Colour Specification box. \n", jp2->meth);
+ }
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager)
+{
+ if (!p_image)
+ return OPJ_FALSE;
+
+ /* J2K decoding */
+ if( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
+ return OPJ_FALSE;
+ }
+
+ if (!jp2->ignore_pclr_cmap_cdef){
+ if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* Set Image Color Space */
+ if (jp2->enumcs == 16)
+ p_image->color_space = OPJ_CLRSPC_SRGB;
+ else if (jp2->enumcs == 17)
+ p_image->color_space = OPJ_CLRSPC_GRAY;
+ else if (jp2->enumcs == 18)
+ p_image->color_space = OPJ_CLRSPC_SYCC;
+ else if (jp2->enumcs == 24)
+ p_image->color_space = OPJ_CLRSPC_EYCC;
+ else
+ p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+
+ /* Apply the color space if needed */
+ if(jp2->color.jp2_cdef) {
+ opj_jp2_apply_cdef(p_image, &(jp2->color));
+ }
+
+ if(jp2->color.jp2_pclr) {
+ /* Part 1, I.5.3.4: Either both or none : */
+ if( !jp2->color.jp2_pclr->cmap)
+ opj_jp2_free_pclr(&(jp2->color));
+ else
+ if(!p_image->useColorSpace)
+ opj_jp2_apply_pclr(p_image, &(jp2->color));
+ }
+
+ if(jp2->color.icc_profile_buf) {
+ p_image->icc_profile_buf = jp2->color.icc_profile_buf;
+ p_image->icc_profile_len = jp2->color.icc_profile_len;
+ jp2->color.icc_profile_buf = NULL;
+ }
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_jp2_img_header_writer_handler_t l_writers [3];
+ opj_jp2_img_header_writer_handler_t * l_current_writer;
+
+ OPJ_INT32 i, l_nb_pass;
+ /* size of data for super box*/
+ OPJ_UINT32 l_jp2h_size = 8;
+ OPJ_BOOL l_result = OPJ_TRUE;
+
+ /* to store the data of the super box */
+ OPJ_BYTE l_jp2h_data [8];
+
+ /* preconditions */
+ assert(stream != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ memset(l_writers,0,sizeof(l_writers));
+
+ if (jp2->bpc == 255) {
+ l_nb_pass = 3;
+ l_writers[0].handler = opj_jp2_write_ihdr;
+ l_writers[1].handler = opj_jp2_write_bpcc;
+ l_writers[2].handler = opj_jp2_write_colr;
+ }
+ else {
+ l_nb_pass = 2;
+ l_writers[0].handler = opj_jp2_write_ihdr;
+ l_writers[1].handler = opj_jp2_write_colr;
+ }
+
+ /* write box header */
+ /* write JP2H type */
+ opj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);
+
+ l_current_writer = l_writers;
+ for (i=0;i<l_nb_pass;++i) {
+ l_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));
+ if (l_current_writer->m_data == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to hold JP2 Header data\n");
+ l_result = OPJ_FALSE;
+ break;
+ }
+
+ l_jp2h_size += l_current_writer->m_size;
+ ++l_current_writer;
+ }
+
+ if (! l_result) {
+ l_current_writer = l_writers;
+ for (i=0;i<l_nb_pass;++i) {
+ if (l_current_writer->m_data != 00) {
+ opj_free(l_current_writer->m_data );
+ }
+ ++l_current_writer;
+ }
+
+ return OPJ_FALSE;
+ }
+
+ /* write super box size */
+ opj_write_bytes(l_jp2h_data,l_jp2h_size,4);
+
+ /* write super box data on stream */
+ if (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
+ l_result = OPJ_FALSE;
+ }
+
+ if (l_result) {
+ l_current_writer = l_writers;
+ for (i=0;i<l_nb_pass;++i) {
+ if (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
+ l_result = OPJ_FALSE;
+ break;
+ }
+ ++l_current_writer;
+ }
+ }
+
+ l_current_writer = l_writers;
+
+ /* cleanup */
+ for (i=0;i<l_nb_pass;++i) {
+ if (l_current_writer->m_data != 00) {
+ opj_free(l_current_writer->m_data );
+ }
+ ++l_current_writer;
+ }
+
+ return l_result;
+}
+
+OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
+ OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
+ OPJ_BOOL l_result;
+
+ /* preconditions */
+ assert(cio != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ l_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size);
+
+ if (l_ftyp_data == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
+ return OPJ_FALSE;
+ }
+
+ memset(l_ftyp_data,0,l_ftyp_size);
+
+ l_current_data_ptr = l_ftyp_data;
+
+ opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
+ l_current_data_ptr += 4;
+
+ opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
+ l_current_data_ptr += 4;
+
+ opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
+ l_current_data_ptr += 4;
+
+ opj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */
+ l_current_data_ptr += 4;
+
+ for (i = 0; i < jp2->numcl; i++) {
+ opj_write_bytes(l_current_data_ptr, jp2->cl[i],4); /* CL */
+ }
+
+ l_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);
+ if (! l_result)
+ {
+ opj_event_msg(p_manager, EVT_ERROR, "Error while writing ftyp data to stream\n");
+ }
+
+ opj_free(l_ftyp_data);
+
+ return l_result;
+}
+
+OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [8];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ opj_write_bytes(l_data_header,
+ (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),
+ 4); /* size of codestream */
+ opj_write_bytes(l_data_header + 4,JP2_JP2C,4); /* JP2C */
+
+ if (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_write_jp( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ /* 12 bytes will be read */
+ OPJ_BYTE l_signature_data [12];
+
+ /* preconditions */
+ assert(cio != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ /* write box length */
+ opj_write_bytes(l_signature_data,12,4);
+ /* writes box type */
+ opj_write_bytes(l_signature_data+4,JP2_JP,4);
+ /* writes magic number*/
+ opj_write_bytes(l_signature_data+8,0x0d0a870a,4);
+
+ if (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 decoder interface */
+/* ----------------------------------------------------------------------- */
+
+void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
+{
+ /* setup the J2K codec */
+ opj_j2k_setup_decoder(jp2->j2k, parameters);
+
+ /* further JP2 initializations go here */
+ jp2->color.jp2_has_colr = 0;
+ jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 encoder interface */
+/* ----------------------------------------------------------------------- */
+
+void opj_jp2_setup_encoder( opj_jp2_t *jp2,
+ opj_cparameters_t *parameters,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager)
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 depth_0;
+ OPJ_UINT32 sign;
+
+ if(!jp2 || !parameters || !image)
+ return;
+
+ /* setup the J2K codec */
+ /* ------------------- */
+
+ /* Check if number of components respects standard */
+ if (image->numcomps < 1 || image->numcomps > 16384) {
+ opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
+ return;
+ }
+
+ opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager );
+
+ /* setup the JP2 codec */
+ /* ------------------- */
+
+ /* Profile box */
+
+ jp2->brand = JP2_JP2; /* BR */
+ jp2->minversion = 0; /* MinV */
+ jp2->numcl = 1;
+ jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
+ if (!jp2->cl){
+ jp2->cl = NULL;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
+ return;
+ }
+ jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
+
+ /* Image Header box */
+
+ jp2->numcomps = image->numcomps; /* NC */
+ jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
+ if (!jp2->comps) {
+ jp2->comps = NULL;
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
+ return;
+ }
+
+ jp2->h = image->y1 - image->y0; /* HEIGHT */
+ jp2->w = image->x1 - image->x0; /* WIDTH */
+ /* BPC */
+ depth_0 = image->comps[0].prec - 1;
+ sign = image->comps[0].sgnd;
+ jp2->bpc = depth_0 + (sign << 7);
+ for (i = 1; i < image->numcomps; i++) {
+ OPJ_UINT32 depth = image->comps[i].prec - 1;
+ sign = image->comps[i].sgnd;
+ if (depth_0 != depth)
+ jp2->bpc = 255;
+ }
+ jp2->C = 7; /* C : Always 7 */
+ jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */
+ jp2->IPR = 0; /* IPR, no intellectual property */
+
+ /* BitsPerComponent box */
+ for (i = 0; i < image->numcomps; i++) {
+ jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
+ }
+
+ /* Colour Specification box */
+ if(image->icc_profile_len) {
+ jp2->meth = 2;
+ jp2->enumcs = 0;
+ }
+ else {
+ jp2->meth = 1;
+ if (image->color_space == 1)
+ jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2-1 */
+ else if (image->color_space == 2)
+ jp2->enumcs = 17; /* greyscale */
+ else if (image->color_space == 3)
+ jp2->enumcs = 18; /* YUV */
+ }
+
+
+ jp2->precedence = 0; /* PRECEDENCE */
+ jp2->approx = 0; /* APPROX */
+
+ jp2->jpip_on = parameters->jpip_on;
+}
+
+OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager)
+{
+ return opj_j2k_encode(jp2->j2k, stream, p_manager);
+}
+
+OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+
+ /* customization of the end encoding */
+ opj_jp2_setup_end_header_reading(jp2);
+
+ /* write header */
+ if (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
+}
+
+OPJ_BOOL opj_jp2_end_compress( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+
+ /* customization of the end encoding */
+ opj_jp2_setup_end_header_writing(jp2);
+
+ if (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* write header */
+ return opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);
+}
+
+void opj_jp2_setup_end_header_writing (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+
+#ifdef USE_JPIP
+ if( jp2->jpip_on )
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_iptr );
+#endif
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c );
+ /* DEVELOPER CORNER, add your custom procedures */
+#ifdef USE_JPIP
+ if( jp2->jpip_on )
+ {
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_cidx );
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_fidx );
+ }
+#endif
+}
+
+void opj_jp2_setup_end_header_reading (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
+ /* DEVELOPER CORNER, add your custom procedures */
+}
+
+OPJ_BOOL opj_jp2_default_validation ( opj_jp2_t * jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_BOOL l_is_valid = OPJ_TRUE;
+ OPJ_UINT32 i;
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+
+ /* JPEG2000 codec validation */
+
+ /* STATE checking */
+ /* make sure the state is at 0 */
+ l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
+
+ /* make sure not reading a jp2h ???? WEIRD */
+ l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
+
+ /* POINTER validation */
+ /* make sure a j2k codec is present */
+ l_is_valid &= (jp2->j2k != 00);
+
+ /* make sure a procedure list is present */
+ l_is_valid &= (jp2->m_procedure_list != 00);
+
+ /* make sure a validation list is present */
+ l_is_valid &= (jp2->m_validation_list != 00);
+
+ /* PARAMETER VALIDATION */
+ /* number of components */
+ l_is_valid &= (jp2->numcl > 0);
+ /* width */
+ l_is_valid &= (jp2->h > 0);
+ /* height */
+ l_is_valid &= (jp2->w > 0);
+ /* precision */
+ for (i = 0; i < jp2->numcomps; ++i) {
+ l_is_valid &= (jp2->comps[i].bpcc > 0);
+ }
+
+ /* METH */
+ l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
+
+ /* stream validation */
+ /* back and forth is needed */
+ l_is_valid &= opj_stream_has_seek(cio);
+
+ return l_is_valid;
+}
+
+OPJ_BOOL opj_jp2_read_header_procedure( opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ opj_jp2_box_t box;
+ OPJ_UINT32 l_nb_bytes_read;
+ const opj_jp2_header_handler_t * l_current_handler;
+ OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
+ OPJ_UINT32 l_current_data_size;
+ OPJ_BYTE * l_current_data = 00;
+
+ /* preconditions */
+ assert(stream != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ l_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size);
+
+ if (l_current_data == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
+ return OPJ_FALSE;
+ }
+ memset(l_current_data, 0 , l_last_data_size);
+
+ while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
+ /* is it the codestream box ? */
+ if (box.type == JP2_JP2C) {
+ if (jp2->jp2_state & JP2_STATE_HEADER) {
+ jp2->jp2_state |= JP2_STATE_CODESTREAM;
+ opj_free(l_current_data);
+ return OPJ_TRUE;
+ }
+ else {
+ opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ else if (box.length == 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ /* testcase 1851.pdf.SIGSEGV.ce9.948 */
+ /* testcase K-5787457125613568 */
+ else if (box.length < l_nb_bytes_read || box.length > opj_stream_get_number_byte_left(stream)) {
+ opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+
+ l_current_handler = opj_jp2_find_handler(box.type);
+ l_current_data_size = box.length - l_nb_bytes_read;
+
+ if (l_current_handler != 00) {
+ if (l_current_data_size > l_last_data_size) {
+ OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);
+ if (!new_current_data) {
+ opj_free(l_current_data);
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 box\n");
+ return OPJ_FALSE;
+ }
+ l_current_data = new_current_data;
+ l_last_data_size = l_current_data_size;
+ }
+
+ l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);
+ if (l_nb_bytes_read != l_current_data_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Problem with reading JPEG2000 box, stream error\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+
+ if (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ jp2->jp2_state |= JP2_STATE_UNKNOWN;
+ if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
+ opj_free(l_current_data);
+ return OPJ_FALSE;
+ }
+ }
+ }
+
+ opj_free(l_current_data);
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Excutes the given procedures on the given codec.
+ *
+ * @param p_procedure_list the list of procedures to execute
+ * @param jp2 the jpeg2000 file codec to execute the procedures on.
+ * @param stream the stream to execute the procedures on.
+ * @param p_manager the user manager.
+ *
+ * @return true if all the procedures were successfully executed.
+ */
+static OPJ_BOOL opj_jp2_exec ( opj_jp2_t * jp2,
+ opj_procedure_list_t * p_procedure_list,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager
+ )
+
+{
+ OPJ_BOOL (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;
+ OPJ_BOOL l_result = OPJ_TRUE;
+ OPJ_UINT32 l_nb_proc, i;
+
+ /* preconditions */
+ assert(p_procedure_list != 00);
+ assert(jp2 != 00);
+ assert(stream != 00);
+ assert(p_manager != 00);
+
+ l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+ l_procedure = (OPJ_BOOL (**) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+
+ for (i=0;i<l_nb_proc;++i) {
+ l_result = l_result && (*l_procedure) (jp2,stream,p_manager);
+ ++l_procedure;
+ }
+
+ /* and clear the procedure list at the end. */
+ opj_procedure_list_clear(p_procedure_list);
+ return l_result;
+}
+
+OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_image_t * p_image,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(stream != 00);
+ assert(p_manager != 00);
+
+ /* customization of the validation */
+ opj_jp2_setup_encoding_validation (jp2);
+
+ /* validation of the parameters codec */
+ if (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* customization of the encoding */
+ opj_jp2_setup_header_writing(jp2);
+
+ /* write header */
+ if (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);
+}
+
+const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)
+{
+ OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);
+
+ for (i=0;i<l_handler_size;++i) {
+ if (jp2_header[i].id == p_id) {
+ return &jp2_header[i];
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Finds the image execution function related to the given box id.
+ *
+ * @param p_id the id of the handler to fetch.
+ *
+ * @return the given handler or 00 if it could not be found.
+ */
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)
+{
+ OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);
+ for (i=0;i<l_handler_size;++i)
+ {
+ if (jp2_img_header[i].id == p_id) {
+ return &jp2_img_header[i];
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * Reads a jpeg2000 file signature box.
+ *
+ * @param p_header_data the data contained in the signature box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the signature box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the file signature box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_jp(opj_jp2_t *jp2,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+
+{
+ OPJ_UINT32 l_magic_number;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ if (jp2->jp2_state != JP2_STATE_NONE) {
+ opj_event_msg(p_manager, EVT_ERROR, "The signature box must be the first box in the file.\n");
+ return OPJ_FALSE;
+ }
+
+ /* assure length of data is correct (4 -> magic number) */
+ if (p_header_size != 4) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
+ return OPJ_FALSE;
+ }
+
+ /* rearrange data */
+ opj_read_bytes(p_header_data,&l_magic_number,4);
+ if (l_magic_number != 0x0d0a870a ) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with JP Signature : bad magic number\n");
+ return OPJ_FALSE;
+ }
+
+ jp2->jp2_state |= JP2_STATE_SIGNATURE;
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads a a FTYP box - File type box
+ *
+ * @param p_header_data the data contained in the FTYP box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the FTYP box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the FTYP box is valid.
+ */
+static OPJ_BOOL opj_jp2_read_ftyp( opj_jp2_t *jp2,
+ OPJ_BYTE * p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 i, l_remaining_bytes;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
+ opj_event_msg(p_manager, EVT_ERROR, "The ftyp box must be the second box in the file.\n");
+ return OPJ_FALSE;
+ }
+
+ /* assure length of data is correct */
+ if (p_header_size < 8) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_header_data,&jp2->brand,4); /* BR */
+ p_header_data += 4;
+
+ opj_read_bytes(p_header_data,&jp2->minversion,4); /* MinV */
+ p_header_data += 4;
+
+ l_remaining_bytes = p_header_size - 8;
+
+ /* the number of remaining bytes should be a multiple of 4 */
+ if ((l_remaining_bytes & 0x3) != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+ return OPJ_FALSE;
+ }
+
+ /* div by 4 */
+ jp2->numcl = l_remaining_bytes >> 2;
+ if (jp2->numcl) {
+ jp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
+ if (jp2->cl == 00) {
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
+ return OPJ_FALSE;
+ }
+ memset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));
+ }
+
+ for (i = 0; i < jp2->numcl; ++i)
+ {
+ opj_read_bytes(p_header_data,&jp2->cl[i],4); /* CLi */
+ p_header_data += 4;
+ }
+
+ jp2->jp2_state |= JP2_STATE_FILE_TYPE;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_skip_jp2c( opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(stream != 00);
+ assert(p_manager != 00);
+
+ jp2->j2k_codestream_offset = opj_stream_tell(stream);
+
+ if (opj_stream_skip(stream,8,p_manager) != 8) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_skip_iptr( opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(stream != 00);
+ assert(p_manager != 00);
+
+ jp2->jpip_iptr_offset = opj_stream_tell(stream);
+
+ if (opj_stream_skip(stream,24,p_manager) != 24) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param p_header_data the data contained in the file header box.
+ * @param jp2 the jpeg2000 file codec.
+ * @param p_header_size the size of the data contained in the file header box.
+ * @param p_manager the user event manager.
+ *
+ * @return true if the JP2 Header box was successfully reconized.
+*/
+static OPJ_BOOL opj_jp2_read_jp2h( opj_jp2_t *jp2,
+ OPJ_BYTE *p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_box_size=0, l_current_data_size = 0;
+ opj_jp2_box_t box;
+ const opj_jp2_header_handler_t * l_current_handler;
+
+ /* preconditions */
+ assert(p_header_data != 00);
+ assert(jp2 != 00);
+ assert(p_manager != 00);
+
+ /* make sure the box is well placed */
+ if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {
+ opj_event_msg(p_manager, EVT_ERROR, "The box must be the first box in the file.\n");
+ return OPJ_FALSE;
+ }
+
+ jp2->jp2_img_state = JP2_IMG_STATE_NONE;
+
+ /* iterate while remaining data */
+ while (p_header_size > 0) {
+
+ if (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
+ return OPJ_FALSE;
+ }
+
+ if (box.length > p_header_size) {
+ opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
+ return OPJ_FALSE;
+ }
+
+ l_current_handler = opj_jp2_img_find_handler(box.type);
+ //BUGID:0055999
+ //test file: fuzz-signal_sigsegv_6b88de_1123_2509.pdf
+ if (box.length < l_box_size) return OPJ_FALSE;
+ l_current_data_size = box.length - l_box_size;
+ p_header_data += l_box_size;
+
+ if (l_current_handler != 00) {
+ if (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
+ }
+
+ p_header_data += l_current_data_size;
+ p_header_size -= box.length;
+ }
+
+ jp2->jp2_state |= JP2_STATE_HEADER;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_boxhdr_char( opj_jp2_box_t *box,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 * p_number_bytes_read,
+ OPJ_UINT32 p_box_max_size,
+ opj_event_mgr_t * p_manager
+ )
+{
+ OPJ_UINT32 l_value;
+
+ /* preconditions */
+ assert(p_data != 00);
+ assert(box != 00);
+ assert(p_number_bytes_read != 00);
+ assert(p_manager != 00);
+
+ if (p_box_max_size < 8) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
+ return OPJ_FALSE;
+ }
+
+ /* process read data */
+ opj_read_bytes(p_data, &l_value, 4);
+ p_data += 4;
+ box->length = (OPJ_UINT32)(l_value);
+
+ opj_read_bytes(p_data, &l_value, 4);
+ p_data += 4;
+ box->type = (OPJ_UINT32)(l_value);
+
+ *p_number_bytes_read = 8;
+
+ /* do we have a "special very large box ?" */
+ /* read then the XLBox */
+ if (box->length == 1) {
+ OPJ_UINT32 l_xl_part_size;
+
+ if (p_box_max_size < 16) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle XL box of less than 16 bytes\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_data,&l_xl_part_size, 4);
+ p_data += 4;
+ *p_number_bytes_read += 4;
+
+ if (l_xl_part_size != 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
+ return OPJ_FALSE;
+ }
+
+ opj_read_bytes(p_data, &l_value, 4);
+ *p_number_bytes_read += 4;
+ box->length = (OPJ_UINT32)(l_value);
+
+ if (box->length == 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+ return OPJ_FALSE;
+ }
+ }
+ else if (box->length == 0) {
+ opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_jp2_read_header( opj_stream_private_t *p_stream,
+ opj_jp2_t *jp2,
+ opj_image_t ** p_image,
+ opj_event_mgr_t * p_manager
+ )
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(p_stream != 00);
+ assert(p_manager != 00);
+
+ /* customization of the validation */
+ opj_jp2_setup_decoding_validation (jp2);
+
+ /* customization of the encoding */
+ opj_jp2_setup_header_reading(jp2);
+
+ /* validation of the parameters codec */
+ if (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* read header */
+ if (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ return opj_j2k_read_header( p_stream,
+ jp2->j2k,
+ p_image,
+ p_manager);
+}
+
+void opj_jp2_setup_encoding_validation (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+
+ opj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation);
+ /* DEVELOPER CORNER, add your custom validation procedure */
+}
+
+void opj_jp2_setup_decoding_validation (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+ /* DEVELOPER CORNER, add your custom validation procedure */
+}
+
+void opj_jp2_setup_header_writing (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp );
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp );
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h );
+ if( jp2->jpip_on )
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_skip_iptr );
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c );
+
+ /* DEVELOPER CORNER, insert your custom procedures */
+
+}
+
+void opj_jp2_setup_header_reading (opj_jp2_t *jp2)
+{
+ /* preconditions */
+ assert(jp2 != 00);
+
+ opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure );
+ /* DEVELOPER CORNER, add your custom procedures */
+}
+
+OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0,
+ OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1,
+ OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_go_on,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ return opj_j2k_read_tile_header(p_jp2->j2k,
+ p_tile_index,
+ p_data_size,
+ p_tile_x0, p_tile_y0,
+ p_tile_x1, p_tile_y1,
+ p_nb_comps,
+ p_go_on,
+ p_stream,
+ p_manager);
+}
+
+OPJ_BOOL opj_jp2_write_tile ( opj_jp2_t *p_jp2,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+
+{
+ return opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+}
+
+OPJ_BOOL opj_jp2_decode_tile ( opj_jp2_t * p_jp2,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager
+ )
+{
+ return opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+}
+
+void opj_jp2_destroy(opj_jp2_t *jp2)
+{
+ if (jp2) {
+ /* destroy the J2K codec */
+ opj_j2k_destroy(jp2->j2k);
+ jp2->j2k = 00;
+
+ if (jp2->comps) {
+ opj_free(jp2->comps);
+ jp2->comps = 00;
+ }
+
+ if (jp2->cl) {
+ opj_free(jp2->cl);
+ jp2->cl = 00;
+ }
+
+ if (jp2->color.icc_profile_buf) {
+ opj_free(jp2->color.icc_profile_buf);
+ jp2->color.icc_profile_buf = 00;
+ }
+
+ if (jp2->color.jp2_cdef) {
+ if (jp2->color.jp2_cdef->info) {
+ opj_free(jp2->color.jp2_cdef->info);
+ jp2->color.jp2_cdef->info = NULL;
+ }
+
+ opj_free(jp2->color.jp2_cdef);
+ jp2->color.jp2_cdef = 00;
+ }
+
+ if (jp2->color.jp2_pclr) {
+ if (jp2->color.jp2_pclr->cmap) {
+ opj_free(jp2->color.jp2_pclr->cmap);
+ jp2->color.jp2_pclr->cmap = NULL;
+ }
+ if (jp2->color.jp2_pclr->channel_sign) {
+ opj_free(jp2->color.jp2_pclr->channel_sign);
+ jp2->color.jp2_pclr->channel_sign = NULL;
+ }
+ if (jp2->color.jp2_pclr->channel_size) {
+ opj_free(jp2->color.jp2_pclr->channel_size);
+ jp2->color.jp2_pclr->channel_size = NULL;
+ }
+ if (jp2->color.jp2_pclr->entries) {
+ opj_free(jp2->color.jp2_pclr->entries);
+ jp2->color.jp2_pclr->entries = NULL;
+ }
+
+ opj_free(jp2->color.jp2_pclr);
+ jp2->color.jp2_pclr = 00;
+ }
+
+ if (jp2->m_validation_list) {
+ opj_procedure_list_destroy(jp2->m_validation_list);
+ jp2->m_validation_list = 00;
+ }
+
+ if (jp2->m_procedure_list) {
+ opj_procedure_list_destroy(jp2->m_procedure_list);
+ jp2->m_procedure_list = 00;
+ }
+
+ opj_free(jp2);
+ }
+}
+
+OPJ_BOOL opj_jp2_set_decode_area( opj_jp2_t *p_jp2,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+ opj_event_mgr_t * p_manager
+ )
+{
+ return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);
+}
+
+OPJ_BOOL opj_jp2_get_tile( opj_jp2_t *p_jp2,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager,
+ OPJ_UINT32 tile_index
+ )
+{
+ if (!p_image)
+ return OPJ_FALSE;
+
+ opj_event_msg(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
+
+ if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
+ return OPJ_FALSE;
+ }
+
+ if (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {
+ return OPJ_FALSE;
+ }
+
+ /* Set Image Color Space */
+ if (p_jp2->enumcs == 16)
+ p_image->color_space = OPJ_CLRSPC_SRGB;
+ else if (p_jp2->enumcs == 17)
+ p_image->color_space = OPJ_CLRSPC_GRAY;
+ else if (p_jp2->enumcs == 18)
+ p_image->color_space = OPJ_CLRSPC_SYCC;
+ else
+ p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+
+ /* Apply the color space if needed */
+ if(p_jp2->color.jp2_cdef) {
+ opj_jp2_apply_cdef(p_image, &(p_jp2->color));
+ }
+
+ if(p_jp2->color.jp2_pclr) {
+ /* Part 1, I.5.3.4: Either both or none : */
+ if( !p_jp2->color.jp2_pclr->cmap)
+ opj_jp2_free_pclr(&(p_jp2->color));
+ else
+ opj_jp2_apply_pclr(p_image, &(p_jp2->color));
+ }
+
+ if(p_jp2->color.icc_profile_buf) {
+ p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
+ p_image->icc_profile_len = p_jp2->color.icc_profile_len;
+ p_jp2->color.icc_profile_buf = NULL;
+ }
+
+ return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 encoder interface */
+/* ----------------------------------------------------------------------- */
+
+opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
+{
+ opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
+ if (jp2) {
+ memset(jp2,0,sizeof(opj_jp2_t));
+
+ /* create the J2K codec */
+ if (! p_is_decoder) {
+ jp2->j2k = opj_j2k_create_compress();
+ }
+ else {
+ jp2->j2k = opj_j2k_create_decompress();
+ }
+
+ if (jp2->j2k == 00) {
+ opj_jp2_destroy(jp2);
+ return 00;
+ }
+
+ /* Color structure */
+ jp2->color.icc_profile_buf = NULL;
+ jp2->color.icc_profile_len = 0;
+ jp2->color.jp2_cdef = NULL;
+ jp2->color.jp2_pclr = NULL;
+ jp2->color.jp2_has_colr = 0;
+
+ /* validation list creation */
+ jp2->m_validation_list = opj_procedure_list_create();
+ if (! jp2->m_validation_list) {
+ opj_jp2_destroy(jp2);
+ return 00;
+ }
+
+ /* execution list creation */
+ jp2->m_procedure_list = opj_procedure_list_create();
+ if (! jp2->m_procedure_list) {
+ opj_jp2_destroy(jp2);
+ return 00;
+ }
+ }
+
+ return jp2;
+}
+
+void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
+{
+ /* preconditions */
+ assert(p_jp2 != 00);
+
+ j2k_dump(p_jp2->j2k,
+ flag,
+ out_stream);
+}
+
+opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
+{
+ return j2k_get_cstr_index(p_jp2->j2k);
+}
+
+opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
+{
+ return j2k_get_cstr_info(p_jp2->j2k);
+}
+
+OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager)
+{
+ return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
+}
+
+/* JPIP specific */
+
+#ifdef USE_JPIP
+static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4,JPIP_IPTR,4); /* IPTR */
+#if 0
+ opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+ opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+ if (! opj_stream_seek(cio,jp2->jpip_iptr_offset,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4,JPIP_FIDX,4); /* IPTR */
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+
+ if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_OFF_T j2k_codestream_exit;
+ OPJ_BYTE l_data_header [24];
+
+ /* preconditions */
+ assert(jp2 != 00);
+ assert(cio != 00);
+ assert(p_manager != 00);
+ assert(opj_stream_has_seek(cio));
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+ opj_write_bytes(l_data_header + 4,JPIP_CIDX,4); /* IPTR */
+#if 0
+ opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+ opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+#else
+ opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+ opj_write_double(l_data_header + 8 + 8, 0); /* length */
+#endif
+
+ if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ j2k_codestream_exit = opj_stream_tell(cio);
+ if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+#if 0
+static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_BYTE l_data_header [8];
+ OPJ_OFF_T len, lenp;
+
+ lenp = opj_stream_tell(cio);
+ opj_stream_skip(cio, 4, p_manager); /* L [at the end] */
+ opj_write_bytes(l_data_header,JPIP_PRXY,4); /* IPTR */
+ opj_stream_write_data(cio,l_data_header,4,p_manager);
+
+ opj_write_bytes( l_data_header, offset_jp2c, 8); /* OOFF */
+ opj_stream_write_data(cio,l_data_header,8,p_manager);
+ opj_write_bytes( l_data_header, length_jp2c, 4); /* OBH part 1 */
+ opj_write_bytes( l_data_header+4, JP2_JP2C, 4); /* OBH part 2 */
+ opj_stream_write_data(cio,l_data_header,8,p_manager);
+
+ opj_write_bytes( l_data_header, 1, 1);/* NI */
+ opj_stream_write_data(cio,l_data_header,1,p_manager);
+
+ opj_write_bytes( l_data_header, offset_idx, 8); /* IOFF */
+ opj_stream_write_data(cio,l_data_header,8,p_manager);
+ opj_write_bytes( l_data_header, length_idx, 4); /* IBH part 1 */
+ opj_write_bytes( l_data_header+4, JPIP_CIDX, 4); /* IBH part 2 */
+ opj_stream_write_data(cio,l_data_header,8,p_manager);
+
+ len = opj_stream_tell(cio)-lenp;
+ opj_stream_skip(cio, lenp, p_manager);
+ opj_write_bytes(l_data_header,len,4);/* L */
+ opj_stream_write_data(cio,l_data_header,4,p_manager);
+ opj_stream_seek(cio, lenp+len,p_manager);
+}
+#endif
+
+
+#if 0
+static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager )
+{
+ OPJ_BYTE l_data_header [4];
+ OPJ_OFF_T len, lenp;
+
+ lenp = opj_stream_tell(cio);
+ opj_stream_skip(cio, 4, p_manager);
+ opj_write_bytes(l_data_header,JPIP_FIDX,4); /* FIDX */
+ opj_stream_write_data(cio,l_data_header,4,p_manager);
+
+ write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio,p_manager);
+
+ len = opj_stream_tell(cio)-lenp;
+ opj_stream_skip(cio, lenp, p_manager);
+ opj_write_bytes(l_data_header,len,4);/* L */
+ opj_stream_write_data(cio,l_data_header,4,p_manager);
+ opj_stream_seek(cio, lenp+len,p_manager);
+
+ return len;
+}
+#endif
+#endif /* USE_JPIP */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h
new file mode 100644
index 0000000000..c11d2f3135
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h
@@ -0,0 +1,495 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __JP2_H
+#define __JP2_H
+/**
+@file jp2.h
+@brief The JPEG-2000 file format Reader/Writer (JP2)
+
+*/
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+/*#define JPIP_JPIP 0x6a706970*/
+
+#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
+#define JP2_FTYP 0x66747970 /**< File type box */
+#define JP2_JP2H 0x6a703268 /**< JP2 header box (super-box) */
+#define JP2_IHDR 0x69686472 /**< Image header box */
+#define JP2_COLR 0x636f6c72 /**< Colour specification box */
+#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
+#define JP2_URL 0x75726c20 /**< Data entry URL box */
+#define JP2_PCLR 0x70636c72 /**< Palette box */
+#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
+#define JP2_CDEF 0x63646566 /**< Channel Definition box */
+#define JP2_DTBL 0x6474626c /**< Data Reference box */
+#define JP2_BPCC 0x62706363 /**< Bits per component box */
+#define JP2_JP2 0x6a703220 /**< File type fields */
+
+/* For the future */
+/* #define JP2_RES 0x72657320 */ /**< Resolution box (super-box) */
+/* #define JP2_JP2I 0x6a703269 */ /**< Intellectual property box */
+/* #define JP2_XML 0x786d6c20 */ /**< XML box */
+/* #define JP2_UUID 0x75756994 */ /**< UUID box */
+/* #define JP2_UINF 0x75696e66 */ /**< UUID info box (super-box) */
+/* #define JP2_ULST 0x756c7374 */ /**< UUID list box */
+
+/* ----------------------------------------------------------------------- */
+
+typedef enum
+{
+ JP2_STATE_NONE = 0x0,
+ JP2_STATE_SIGNATURE = 0x1,
+ JP2_STATE_FILE_TYPE = 0x2,
+ JP2_STATE_HEADER = 0x4,
+ JP2_STATE_CODESTREAM = 0x8,
+ JP2_STATE_END_CODESTREAM = 0x10,
+ JP2_STATE_UNKNOWN = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */
+}
+JP2_STATE;
+
+typedef enum
+{
+ JP2_IMG_STATE_NONE = 0x0,
+ JP2_IMG_STATE_UNKNOWN = 0x7fffffff
+}
+JP2_IMG_STATE;
+
+/**
+Channel description: channel index, type, assocation
+*/
+typedef struct opj_jp2_cdef_info
+{
+ OPJ_UINT16 cn, typ, asoc;
+} opj_jp2_cdef_info_t;
+
+/**
+Channel descriptions and number of descriptions
+*/
+typedef struct opj_jp2_cdef
+{
+ opj_jp2_cdef_info_t *info;
+ OPJ_UINT16 n;
+} opj_jp2_cdef_t;
+
+/**
+Component mappings: channel index, mapping type, palette index
+*/
+typedef struct opj_jp2_cmap_comp
+{
+ OPJ_UINT16 cmp;
+ OPJ_BYTE mtyp, pcol;
+} opj_jp2_cmap_comp_t;
+
+/**
+Palette data: table entries, palette columns
+*/
+typedef struct opj_jp2_pclr
+{
+ OPJ_UINT32 *entries;
+ OPJ_BYTE *channel_sign;
+ OPJ_BYTE *channel_size;
+ opj_jp2_cmap_comp_t *cmap;
+ OPJ_UINT16 nr_entries;
+ OPJ_BYTE nr_channels;
+} opj_jp2_pclr_t;
+
+/**
+Collector for ICC profile, palette, component mapping, channel description
+*/
+typedef struct opj_jp2_color
+{
+ OPJ_BYTE *icc_profile_buf;
+ OPJ_UINT32 icc_profile_len;
+
+ opj_jp2_cdef_t *jp2_cdef;
+ opj_jp2_pclr_t *jp2_pclr;
+ OPJ_BYTE jp2_has_colr;
+} opj_jp2_color_t;
+
+/**
+JP2 component
+*/
+typedef struct opj_jp2_comps {
+ OPJ_UINT32 depth;
+ OPJ_UINT32 sgnd;
+ OPJ_UINT32 bpcc;
+} opj_jp2_comps_t;
+
+/**
+JPEG-2000 file format reader/writer
+*/
+typedef struct opj_jp2
+{
+ /** handle to the J2K codec */
+ opj_j2k_t *j2k;
+ /** list of validation procedures */
+ struct opj_procedure_list * m_validation_list;
+ /** list of execution procedures */
+ struct opj_procedure_list * m_procedure_list;
+
+ /* width of image */
+ OPJ_UINT32 w;
+ /* height of image */
+ OPJ_UINT32 h;
+ /* number of components in the image */
+ OPJ_UINT32 numcomps;
+ OPJ_UINT32 bpc;
+ OPJ_UINT32 C;
+ OPJ_UINT32 UnkC;
+ OPJ_UINT32 IPR;
+ OPJ_UINT32 meth;
+ OPJ_UINT32 approx;
+ OPJ_UINT32 enumcs;
+ OPJ_UINT32 precedence;
+ OPJ_UINT32 brand;
+ OPJ_UINT32 minversion;
+ OPJ_UINT32 numcl;
+ OPJ_UINT32 *cl;
+ opj_jp2_comps_t *comps;
+ /* FIXME: The following two variables are used to save offset
+ as we write out a JP2 file to disk. This mecanism is not flexible
+ as codec writers will need to extand those fields as new part
+ of the standard are implemented.
+ */
+ OPJ_OFF_T j2k_codestream_offset;
+ OPJ_OFF_T jpip_iptr_offset;
+ OPJ_BOOL jpip_on;
+ OPJ_UINT32 jp2_state;
+ OPJ_UINT32 jp2_img_state;
+
+ opj_jp2_color_t color;
+
+ OPJ_BOOL ignore_pclr_cmap_cdef;
+}
+opj_jp2_t;
+
+/**
+JP2 Box
+*/
+typedef struct opj_jp2_box {
+ OPJ_UINT32 length;
+ OPJ_UINT32 type;
+ OPJ_INT32 init_pos;
+} opj_jp2_box_t;
+
+typedef struct opj_jp2_header_handler
+{
+ /* marker value */
+ OPJ_UINT32 id;
+ /* action linked to the marker */
+ OPJ_BOOL (*handler) ( opj_jp2_t *jp2,
+ OPJ_BYTE *p_header_data,
+ OPJ_UINT32 p_header_size,
+ opj_event_mgr_t * p_manager);
+}
+opj_jp2_header_handler_t;
+
+
+typedef struct opj_jp2_img_header_writer_handler
+{
+ /* action to perform */
+ OPJ_BYTE* (*handler) (opj_jp2_t *jp2, OPJ_UINT32 * p_data_size);
+ /* result of the action : data */
+ OPJ_BYTE* m_data;
+ /* size of data */
+ OPJ_UINT32 m_size;
+}
+opj_jp2_img_header_writer_handler_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
+ *
+ * @param jp2 the jpeg2000 file codec.
+ * @param stream the stream to write data to.
+ * @param p_manager user event manager.
+ *
+ * @return true if writing was successful.
+*/
+OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in jp2->j2k->cp.
+@param jp2 JP2 decompressor handle
+@param parameters decompression parameters
+*/
+void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
+
+/**
+ * Decode an image from a JPEG-2000 file stream
+ * @param jp2 JP2 decompressor handle
+ * @param p_stream FIXME DOC
+ * @param p_image FIXME DOC
+ * @param p_manager FIXME DOC
+ *
+ * @return Returns a decoded image if successful, returns NULL otherwise
+*/
+OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Setup the encoder parameters using the current image and using user parameters.
+ * Coding parameters are returned in jp2->j2k->cp.
+ *
+ * @param jp2 JP2 compressor handle
+ * @param parameters compression parameters
+ * @param image input filled image
+ * @param p_manager FIXME DOC
+*/
+void opj_jp2_setup_encoder( opj_jp2_t *jp2,
+ opj_cparameters_t *parameters,
+ opj_image_t *image,
+ opj_event_mgr_t * p_manager);
+
+/**
+Encode an image into a JPEG-2000 file stream
+@param jp2 JP2 compressor handle
+@param stream Output buffer stream
+@param p_manager event manager
+@return Returns true if successful, returns false otherwise
+*/
+OPJ_BOOL opj_jp2_encode( opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_event_mgr_t * p_manager);
+
+
+/**
+ * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
+ *
+ * @param jp2 the jpeg2000 file codec.
+ * @param stream the stream object.
+ * @param p_image FIXME DOC
+ * @param p_manager FIXME DOC
+ *
+ * @return true if the codec is valid.
+ */
+OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
+ opj_stream_private_t *stream,
+ opj_image_t * p_image,
+ opj_event_mgr_t * p_manager);
+
+
+/**
+ * Ends the compression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_jp2_end_compress( opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager);
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Ends the decompression procedures and possibiliy add data to be read after the
+ * codestream.
+ */
+OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
+ opj_stream_private_t *cio,
+ opj_event_mgr_t * p_manager);
+
+/**
+ * Reads a jpeg2000 file header structure.
+ *
+ * @param p_stream the stream to read data from.
+ * @param jp2 the jpeg2000 file header structure.
+ * @param p_image FIXME DOC
+ * @param p_manager the user event manager.
+ *
+ * @return true if the box is valid.
+ */
+OPJ_BOOL opj_jp2_read_header( opj_stream_private_t *p_stream,
+ opj_jp2_t *jp2,
+ opj_image_t ** p_image,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Reads a tile header.
+ * @param p_jp2 the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_tile_x0 FIXME DOC
+ * @param p_tile_y0 FIXME DOC
+ * @param p_tile_x1 FIXME DOC
+ * @param p_tile_y1 FIXME DOC
+ * @param p_nb_comps FIXME DOC
+ * @param p_go_on FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0,
+ OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1,
+ OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_go_on,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Writes a tile.
+ *
+ * @param p_jp2 the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ */
+OPJ_BOOL opj_jp2_write_tile ( opj_jp2_t *p_jp2,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Decode tile data.
+ * @param p_jp2 the jpeg2000 codec.
+ * @param p_tile_index FIXME DOC
+ * @param p_data FIXME DOC
+ * @param p_data_size FIXME DOC
+ * @param p_stream the stream to write data to.
+ * @param p_manager the user event manager.
+ *
+ * @return FIXME DOC
+ */
+OPJ_BOOL opj_jp2_decode_tile ( opj_jp2_t * p_jp2,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_private_t *p_stream,
+ opj_event_mgr_t * p_manager );
+
+/**
+ * Creates a jpeg2000 file decompressor.
+ *
+ * @return an empty jpeg2000 file codec.
+ */
+opj_jp2_t* opj_jp2_create (OPJ_BOOL p_is_decoder);
+
+/**
+Destroy a JP2 decompressor handle
+@param jp2 JP2 decompressor handle to destroy
+*/
+void opj_jp2_destroy(opj_jp2_t *jp2);
+
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param p_jp2 the jpeg2000 codec.
+ * @param p_image FIXME DOC
+ * @param p_start_x the left position of the rectangle to decode (in image coordinates).
+ * @param p_start_y the up position of the rectangle to decode (in image coordinates).
+ * @param p_end_x the right position of the rectangle to decode (in image coordinates).
+ * @param p_end_y the bottom position of the rectangle to decode (in image coordinates).
+ * @param p_manager the user event manager
+ *
+ * @return true if the area could be set.
+ */
+OPJ_BOOL opj_jp2_set_decode_area( opj_jp2_t *p_jp2,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+ opj_event_mgr_t * p_manager );
+
+ /**
+ *
+ */
+OPJ_BOOL opj_jp2_get_tile( opj_jp2_t *p_jp2,
+ opj_stream_private_t *p_stream,
+ opj_image_t* p_image,
+ opj_event_mgr_t * p_manager,
+ OPJ_UINT32 tile_index );
+
+
+/**
+ *
+ */
+OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager);
+
+
+/* TODO MSD: clean these 3 functions */
+/**
+ * Dump some elements from the JP2 decompression structure .
+ *
+ *@param p_jp2 the jp2 codec.
+ *@param flag flag to describe what elments are dump.
+ *@param out_stream output stream where dump the elements.
+ *
+*/
+void jp2_dump (opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream);
+
+/**
+ * Get the codestream info from a JPEG2000 codec.
+ *
+ *@param p_jp2 jp2 codec.
+ *
+ *@return the codestream information extract from the jpg2000 codec
+ */
+opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2);
+
+/**
+ * Get the codestream index from a JPEG2000 codec.
+ *
+ *@param p_jp2 jp2 codec.
+ *
+ *@return the codestream index extract from the jpg2000 codec
+ */
+opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2);
+
+
+/*@}*/
+
+/*@}*/
+
+#endif /* __JP2_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
new file mode 100644
index 0000000000..0a64938b5c
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c
@@ -0,0 +1,342 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
+#include "opj_includes.h"
+
+/* <summary> */
+/* This table contains the norms of the basis function of the reversible MCT. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_mct_norms[3] = { 1.732, .8292, .8292 };
+
+/* <summary> */
+/* This table contains the norms of the basis function of the irreversible MCT. */
+/* </summary> */
+static const OPJ_FLOAT64 opj_mct_norms_real[3] = { 1.732, 1.805, 1.573 };
+
+const OPJ_FLOAT64 * opj_mct_get_mct_norms ()
+{
+ return opj_mct_norms;
+}
+
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()
+{
+ return opj_mct_norms_real;
+}
+
+/* <summary> */
+/* Foward reversible MCT. */
+/* </summary> */
+void opj_mct_encode(
+ OPJ_INT32* restrict c0,
+ OPJ_INT32* restrict c1,
+ OPJ_INT32* restrict c2,
+ OPJ_UINT32 n)
+{
+ OPJ_UINT32 i;
+ for(i = 0; i < n; ++i) {
+ OPJ_INT32 r = c0[i];
+ OPJ_INT32 g = c1[i];
+ OPJ_INT32 b = c2[i];
+ OPJ_INT32 y = (r + (g * 2) + b) >> 2;
+ OPJ_INT32 u = b - g;
+ OPJ_INT32 v = r - g;
+ c0[i] = y;
+ c1[i] = u;
+ c2[i] = v;
+ }
+}
+
+/* <summary> */
+/* Inverse reversible MCT. */
+/* </summary> */
+void opj_mct_decode(
+ OPJ_INT32* restrict c0,
+ OPJ_INT32* restrict c1,
+ OPJ_INT32* restrict c2,
+ OPJ_UINT32 n)
+{
+ OPJ_UINT32 i;
+ for (i = 0; i < n; ++i) {
+ OPJ_INT32 y = c0[i];
+ OPJ_INT32 u = c1[i];
+ OPJ_INT32 v = c2[i];
+ OPJ_INT32 g = y - ((u + v) >> 2);
+ OPJ_INT32 r = v + g;
+ OPJ_INT32 b = u + g;
+ c0[i] = r;
+ c1[i] = g;
+ c2[i] = b;
+ }
+}
+
+/* <summary> */
+/* Get norm of basis function of reversible MCT. */
+/* </summary> */
+OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {
+ return opj_mct_norms[compno];
+}
+
+/* <summary> */
+/* Foward irreversible MCT. */
+/* </summary> */
+void opj_mct_encode_real(
+ OPJ_INT32* restrict c0,
+ OPJ_INT32* restrict c1,
+ OPJ_INT32* restrict c2,
+ OPJ_UINT32 n)
+{
+ OPJ_UINT32 i;
+ for(i = 0; i < n; ++i) {
+ OPJ_INT32 r = c0[i];
+ OPJ_INT32 g = c1[i];
+ OPJ_INT32 b = c2[i];
+ OPJ_INT32 y = opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g, 4809) + opj_int_fix_mul(b, 934);
+ OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g, 2714) + opj_int_fix_mul(b, 4096);
+ OPJ_INT32 v = opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g, 3430) - opj_int_fix_mul(b, 666);
+ c0[i] = y;
+ c1[i] = u;
+ c2[i] = v;
+ }
+}
+
+/* <summary> */
+/* Inverse irreversible MCT. */
+/* </summary> */
+void opj_mct_decode_real(
+ OPJ_FLOAT32* restrict c0,
+ OPJ_FLOAT32* restrict c1,
+ OPJ_FLOAT32* restrict c2,
+ OPJ_UINT32 n)
+{
+ OPJ_UINT32 i;
+#ifdef __SSE__
+ // Mantis BUGID: 0056291. The address must be 16-byte aligned.
+ // TestFile: fuzz-signal_sigsegv_6e9e7f_5076_5265.pdf
+ if ((OPJ_UINT32)c0 % 16 == 0 && (OPJ_UINT32)c1 % 16 == 0 && (OPJ_UINT32)c2 % 16 == 0){
+ __m128 vrv, vgu, vgv, vbu;
+ vrv = _mm_set1_ps(1.402f);
+ vgu = _mm_set1_ps(0.34413f);
+ vgv = _mm_set1_ps(0.71414f);
+ vbu = _mm_set1_ps(1.772f);
+ for (i = 0; i < (n >> 3); ++i) {
+ __m128 vy, vu, vv;
+ __m128 vr, vg, vb;
+
+ vy = _mm_load_ps(c0);
+ vu = _mm_load_ps(c1);
+ vv = _mm_load_ps(c2);
+ vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+ vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+ vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+ _mm_store_ps(c0, vr);
+ _mm_store_ps(c1, vg);
+ _mm_store_ps(c2, vb);
+ c0 += 4;
+ c1 += 4;
+ c2 += 4;
+
+ vy = _mm_load_ps(c0);
+ vu = _mm_load_ps(c1);
+ vv = _mm_load_ps(c2);
+ vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+ vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+ vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+ _mm_store_ps(c0, vr);
+ _mm_store_ps(c1, vg);
+ _mm_store_ps(c2, vb);
+ c0 += 4;
+ c1 += 4;
+ c2 += 4;
+ }
+ n &= 7;
+ } else {
+ for(i = 0; i < n; ++i) {
+ OPJ_FLOAT32 y = c0[i];
+ OPJ_FLOAT32 u = c1[i];
+ OPJ_FLOAT32 v = c2[i];
+ OPJ_FLOAT32 r = y + (v * 1.402f);
+ OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
+ OPJ_FLOAT32 b = y + (u * 1.772f);
+ c0[i] = r;
+ c1[i] = g;
+ c2[i] = b;
+ }
+ }
+
+#endif
+ for(i = 0; i < n; ++i) {
+ OPJ_FLOAT32 y = c0[i];
+ OPJ_FLOAT32 u = c1[i];
+ OPJ_FLOAT32 v = c2[i];
+ OPJ_FLOAT32 r = y + (v * 1.402f);
+ OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
+ OPJ_FLOAT32 b = y + (u * 1.772f);
+ c0[i] = r;
+ c1[i] = g;
+ c2[i] = b;
+ }
+}
+
+/* <summary> */
+/* Get norm of basis function of irreversible MCT. */
+/* </summary> */
+OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno) {
+ return opj_mct_norms_real[compno];
+}
+
+
+OPJ_BOOL opj_mct_encode_custom(
+ OPJ_BYTE * pCodingdata,
+ OPJ_UINT32 n,
+ OPJ_BYTE ** pData,
+ OPJ_UINT32 pNbComp,
+ OPJ_UINT32 isSigned)
+{
+ OPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;
+ OPJ_UINT32 i;
+ OPJ_UINT32 j;
+ OPJ_UINT32 k;
+ OPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;
+ OPJ_INT32 * lCurrentData = 00;
+ OPJ_INT32 * lCurrentMatrix = 00;
+ OPJ_INT32 ** lData = (OPJ_INT32 **) pData;
+ OPJ_UINT32 lMultiplicator = 1 << 13;
+ OPJ_INT32 * lMctPtr;
+
+ OPJ_ARG_NOT_USED(isSigned);
+
+ lCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(OPJ_INT32));
+ if (! lCurrentData) {
+ return OPJ_FALSE;
+ }
+
+ lCurrentMatrix = lCurrentData + pNbComp;
+
+ for (i =0;i<lNbMatCoeff;++i) {
+ lCurrentMatrix[i] = (OPJ_INT32) (*(lMct++) * (OPJ_FLOAT32)lMultiplicator);
+ }
+
+ for (i = 0; i < n; ++i) {
+ lMctPtr = lCurrentMatrix;
+ for (j=0;j<pNbComp;++j) {
+ lCurrentData[j] = (*(lData[j]));
+ }
+
+ for (j=0;j<pNbComp;++j) {
+ *(lData[j]) = 0;
+ for (k=0;k<pNbComp;++k) {
+ *(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);
+ ++lMctPtr;
+ }
+
+ ++lData[j];
+ }
+ }
+
+ opj_free(lCurrentData);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_mct_decode_custom(
+ OPJ_BYTE * pDecodingData,
+ OPJ_UINT32 n,
+ OPJ_BYTE ** pData,
+ OPJ_UINT32 pNbComp,
+ OPJ_UINT32 isSigned)
+{
+ OPJ_FLOAT32 * lMct;
+ OPJ_UINT32 i;
+ OPJ_UINT32 j;
+ OPJ_UINT32 k;
+
+ OPJ_FLOAT32 * lCurrentData = 00;
+ OPJ_FLOAT32 * lCurrentResult = 00;
+ OPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;
+
+ OPJ_ARG_NOT_USED(isSigned);
+
+ lCurrentData = (OPJ_FLOAT32 *) opj_malloc (2 * pNbComp * sizeof(OPJ_FLOAT32));
+ if (! lCurrentData) {
+ return OPJ_FALSE;
+ }
+ lCurrentResult = lCurrentData + pNbComp;
+
+ for (i = 0; i < n; ++i) {
+ lMct = (OPJ_FLOAT32 *) pDecodingData;
+ for (j=0;j<pNbComp;++j) {
+ lCurrentData[j] = (OPJ_FLOAT32) (*(lData[j]));
+ }
+ for (j=0;j<pNbComp;++j) {
+ lCurrentResult[j] = 0;
+ for (k=0;k<pNbComp;++k) {
+ lCurrentResult[j] += *(lMct++) * lCurrentData[k];
+ }
+ *(lData[j]++) = (OPJ_FLOAT32) (lCurrentResult[j]);
+ }
+ }
+ opj_free(lCurrentData);
+ return OPJ_TRUE;
+}
+
+void opj_calculate_norms( OPJ_FLOAT64 * pNorms,
+ OPJ_UINT32 pNbComps,
+ OPJ_FLOAT32 * pMatrix)
+{
+ OPJ_UINT32 i,j,lIndex;
+ OPJ_FLOAT32 lCurrentValue;
+ OPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;
+ OPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;
+
+ for (i=0;i<pNbComps;++i) {
+ lNorms[i] = 0;
+ lIndex = i;
+
+ for (j=0;j<pNbComps;++j) {
+ lCurrentValue = lMatrix[lIndex];
+ lIndex += pNbComps;
+ lNorms[i] += lCurrentValue * lCurrentValue;
+ }
+ lNorms[i] = sqrt(lNorms[i]);
+ }
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h
new file mode 100644
index 0000000000..1c1f4d0c4d
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.h
@@ -0,0 +1,155 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MCT_H
+#define __MCT_H
+/**
+@file mct.h
+@brief Implementation of a multi-component transforms (MCT)
+
+The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
+transform. The functions in MCT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup MCT MCT - Implementation of a multi-component transform */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Apply a reversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param n Number of samples for each component
+*/
+void opj_mct_encode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Apply a reversible multi-component inverse transform to an image
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void opj_mct_decode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Get norm of the basis function used for the reversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return
+*/
+OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno);
+
+/**
+Apply an irreversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param n Number of samples for each component
+*/
+void opj_mct_encode_real(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+/**
+Apply an irreversible multi-component inverse transform to an image
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void opj_mct_decode_real(OPJ_FLOAT32* c0, OPJ_FLOAT32* c1, OPJ_FLOAT32* c2, OPJ_UINT32 n);
+/**
+Get norm of the basis function used for the irreversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return
+*/
+OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno);
+
+/**
+FIXME DOC
+@param p_coding_data MCT data
+@param n size of components
+@param p_data components
+@param p_nb_comp nb of components (i.e. size of p_data)
+@param is_signed tells if the data is signed
+@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
+*/
+OPJ_BOOL opj_mct_encode_custom(
+ OPJ_BYTE * p_coding_data,
+ OPJ_UINT32 n,
+ OPJ_BYTE ** p_data,
+ OPJ_UINT32 p_nb_comp,
+ OPJ_UINT32 is_signed);
+/**
+FIXME DOC
+@param pDecodingData MCT data
+@param n size of components
+@param pData components
+@param pNbComp nb of components (i.e. size of p_data)
+@param isSigned tells if the data is signed
+@return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
+*/
+OPJ_BOOL opj_mct_decode_custom(
+ OPJ_BYTE * pDecodingData,
+ OPJ_UINT32 n,
+ OPJ_BYTE ** pData,
+ OPJ_UINT32 pNbComp,
+ OPJ_UINT32 isSigned);
+/**
+FIXME DOC
+@param pNorms MCT data
+@param p_nb_comps size of components
+@param pMatrix components
+@return
+*/
+void opj_calculate_norms( OPJ_FLOAT64 * pNorms,
+ OPJ_UINT32 p_nb_comps,
+ OPJ_FLOAT32 * pMatrix);
+/**
+FIXME DOC
+*/
+const OPJ_FLOAT64 * opj_mct_get_mct_norms (void);
+/**
+FIXME DOC
+*/
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real (void);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MCT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c
new file mode 100644
index 0000000000..18fcc47605
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.c
@@ -0,0 +1,610 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Output a byte, doing bit-stuffing if necessary.
+After a 0xff byte, the next byte must be smaller than 0x90.
+@param mqc MQC handle
+*/
+static void opj_mqc_byteout(opj_mqc_t *mqc);
+/**
+Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
+@param mqc MQC handle
+*/
+static void opj_mqc_renorme(opj_mqc_t *mqc);
+/**
+Encode the most probable symbol
+@param mqc MQC handle
+*/
+static void opj_mqc_codemps(opj_mqc_t *mqc);
+/**
+Encode the most least symbol
+@param mqc MQC handle
+*/
+static void opj_mqc_codelps(opj_mqc_t *mqc);
+/**
+Fill mqc->c with 1's for flushing
+@param mqc MQC handle
+*/
+static void opj_mqc_setbits(opj_mqc_t *mqc);
+/**
+FIXME DOC
+@param mqc MQC handle
+@return
+*/
+static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);
+/**
+FIXME DOC
+@param mqc MQC handle
+@return
+*/
+static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);
+/**
+Input a byte
+@param mqc MQC handle
+*/
+static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);
+/**
+Renormalize mqc->a and mqc->c while decoding
+@param mqc MQC handle
+*/
+static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);
+/*@}*/
+
+/*@}*/
+
+/* <summary> */
+/* This array defines all the possible states for a context. */
+/* </summary> */
+static opj_mqc_state_t mqc_states[47 * 2] = {
+ {0x5601, 0, &mqc_states[2], &mqc_states[3]},
+ {0x5601, 1, &mqc_states[3], &mqc_states[2]},
+ {0x3401, 0, &mqc_states[4], &mqc_states[12]},
+ {0x3401, 1, &mqc_states[5], &mqc_states[13]},
+ {0x1801, 0, &mqc_states[6], &mqc_states[18]},
+ {0x1801, 1, &mqc_states[7], &mqc_states[19]},
+ {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
+ {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
+ {0x0521, 0, &mqc_states[10], &mqc_states[58]},
+ {0x0521, 1, &mqc_states[11], &mqc_states[59]},
+ {0x0221, 0, &mqc_states[76], &mqc_states[66]},
+ {0x0221, 1, &mqc_states[77], &mqc_states[67]},
+ {0x5601, 0, &mqc_states[14], &mqc_states[13]},
+ {0x5601, 1, &mqc_states[15], &mqc_states[12]},
+ {0x5401, 0, &mqc_states[16], &mqc_states[28]},
+ {0x5401, 1, &mqc_states[17], &mqc_states[29]},
+ {0x4801, 0, &mqc_states[18], &mqc_states[28]},
+ {0x4801, 1, &mqc_states[19], &mqc_states[29]},
+ {0x3801, 0, &mqc_states[20], &mqc_states[28]},
+ {0x3801, 1, &mqc_states[21], &mqc_states[29]},
+ {0x3001, 0, &mqc_states[22], &mqc_states[34]},
+ {0x3001, 1, &mqc_states[23], &mqc_states[35]},
+ {0x2401, 0, &mqc_states[24], &mqc_states[36]},
+ {0x2401, 1, &mqc_states[25], &mqc_states[37]},
+ {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
+ {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
+ {0x1601, 0, &mqc_states[58], &mqc_states[42]},
+ {0x1601, 1, &mqc_states[59], &mqc_states[43]},
+ {0x5601, 0, &mqc_states[30], &mqc_states[29]},
+ {0x5601, 1, &mqc_states[31], &mqc_states[28]},
+ {0x5401, 0, &mqc_states[32], &mqc_states[28]},
+ {0x5401, 1, &mqc_states[33], &mqc_states[29]},
+ {0x5101, 0, &mqc_states[34], &mqc_states[30]},
+ {0x5101, 1, &mqc_states[35], &mqc_states[31]},
+ {0x4801, 0, &mqc_states[36], &mqc_states[32]},
+ {0x4801, 1, &mqc_states[37], &mqc_states[33]},
+ {0x3801, 0, &mqc_states[38], &mqc_states[34]},
+ {0x3801, 1, &mqc_states[39], &mqc_states[35]},
+ {0x3401, 0, &mqc_states[40], &mqc_states[36]},
+ {0x3401, 1, &mqc_states[41], &mqc_states[37]},
+ {0x3001, 0, &mqc_states[42], &mqc_states[38]},
+ {0x3001, 1, &mqc_states[43], &mqc_states[39]},
+ {0x2801, 0, &mqc_states[44], &mqc_states[38]},
+ {0x2801, 1, &mqc_states[45], &mqc_states[39]},
+ {0x2401, 0, &mqc_states[46], &mqc_states[40]},
+ {0x2401, 1, &mqc_states[47], &mqc_states[41]},
+ {0x2201, 0, &mqc_states[48], &mqc_states[42]},
+ {0x2201, 1, &mqc_states[49], &mqc_states[43]},
+ {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
+ {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
+ {0x1801, 0, &mqc_states[52], &mqc_states[46]},
+ {0x1801, 1, &mqc_states[53], &mqc_states[47]},
+ {0x1601, 0, &mqc_states[54], &mqc_states[48]},
+ {0x1601, 1, &mqc_states[55], &mqc_states[49]},
+ {0x1401, 0, &mqc_states[56], &mqc_states[50]},
+ {0x1401, 1, &mqc_states[57], &mqc_states[51]},
+ {0x1201, 0, &mqc_states[58], &mqc_states[52]},
+ {0x1201, 1, &mqc_states[59], &mqc_states[53]},
+ {0x1101, 0, &mqc_states[60], &mqc_states[54]},
+ {0x1101, 1, &mqc_states[61], &mqc_states[55]},
+ {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
+ {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
+ {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
+ {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
+ {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
+ {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
+ {0x0521, 0, &mqc_states[68], &mqc_states[62]},
+ {0x0521, 1, &mqc_states[69], &mqc_states[63]},
+ {0x0441, 0, &mqc_states[70], &mqc_states[64]},
+ {0x0441, 1, &mqc_states[71], &mqc_states[65]},
+ {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
+ {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
+ {0x0221, 0, &mqc_states[74], &mqc_states[68]},
+ {0x0221, 1, &mqc_states[75], &mqc_states[69]},
+ {0x0141, 0, &mqc_states[76], &mqc_states[70]},
+ {0x0141, 1, &mqc_states[77], &mqc_states[71]},
+ {0x0111, 0, &mqc_states[78], &mqc_states[72]},
+ {0x0111, 1, &mqc_states[79], &mqc_states[73]},
+ {0x0085, 0, &mqc_states[80], &mqc_states[74]},
+ {0x0085, 1, &mqc_states[81], &mqc_states[75]},
+ {0x0049, 0, &mqc_states[82], &mqc_states[76]},
+ {0x0049, 1, &mqc_states[83], &mqc_states[77]},
+ {0x0025, 0, &mqc_states[84], &mqc_states[78]},
+ {0x0025, 1, &mqc_states[85], &mqc_states[79]},
+ {0x0015, 0, &mqc_states[86], &mqc_states[80]},
+ {0x0015, 1, &mqc_states[87], &mqc_states[81]},
+ {0x0009, 0, &mqc_states[88], &mqc_states[82]},
+ {0x0009, 1, &mqc_states[89], &mqc_states[83]},
+ {0x0005, 0, &mqc_states[90], &mqc_states[84]},
+ {0x0005, 1, &mqc_states[91], &mqc_states[85]},
+ {0x0001, 0, &mqc_states[90], &mqc_states[86]},
+ {0x0001, 1, &mqc_states[91], &mqc_states[87]},
+ {0x5601, 0, &mqc_states[92], &mqc_states[92]},
+ {0x5601, 1, &mqc_states[93], &mqc_states[93]},
+};
+
+/*
+==========================================================
+ local functions
+==========================================================
+*/
+
+void opj_mqc_byteout(opj_mqc_t *mqc) {
+ if (*mqc->bp == 0xff) {
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+ mqc->c &= 0xfffff;
+ mqc->ct = 7;
+ } else {
+ if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+ mqc->c &= 0x7ffff;
+ mqc->ct = 8;
+ } else {
+ (*mqc->bp)++;
+ if (*mqc->bp == 0xff) {
+ mqc->c &= 0x7ffffff;
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+ mqc->c &= 0xfffff;
+ mqc->ct = 7;
+ } else {
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+ mqc->c &= 0x7ffff;
+ mqc->ct = 8;
+ }
+ }
+ }
+}
+
+void opj_mqc_renorme(opj_mqc_t *mqc) {
+ do {
+ mqc->a <<= 1;
+ mqc->c <<= 1;
+ mqc->ct--;
+ if (mqc->ct == 0) {
+ opj_mqc_byteout(mqc);
+ }
+ } while ((mqc->a & 0x8000) == 0);
+}
+
+void opj_mqc_codemps(opj_mqc_t *mqc) {
+ mqc->a -= (*mqc->curctx)->qeval;
+ if ((mqc->a & 0x8000) == 0) {
+ if (mqc->a < (*mqc->curctx)->qeval) {
+ mqc->a = (*mqc->curctx)->qeval;
+ } else {
+ mqc->c += (*mqc->curctx)->qeval;
+ }
+ *mqc->curctx = (*mqc->curctx)->nmps;
+ opj_mqc_renorme(mqc);
+ } else {
+ mqc->c += (*mqc->curctx)->qeval;
+ }
+}
+
+void opj_mqc_codelps(opj_mqc_t *mqc) {
+ mqc->a -= (*mqc->curctx)->qeval;
+ if (mqc->a < (*mqc->curctx)->qeval) {
+ mqc->c += (*mqc->curctx)->qeval;
+ } else {
+ mqc->a = (*mqc->curctx)->qeval;
+ }
+ *mqc->curctx = (*mqc->curctx)->nlps;
+ opj_mqc_renorme(mqc);
+}
+
+void opj_mqc_setbits(opj_mqc_t *mqc) {
+ OPJ_UINT32 tempc = mqc->c + mqc->a;
+ mqc->c |= 0xffff;
+ if (mqc->c >= tempc) {
+ mqc->c -= 0x8000;
+ }
+}
+
+static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
+ OPJ_INT32 d;
+ if (mqc->a < (*mqc->curctx)->qeval) {
+ d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
+ *mqc->curctx = (*mqc->curctx)->nlps;
+ } else {
+ d = (OPJ_INT32)(*mqc->curctx)->mps;
+ *mqc->curctx = (*mqc->curctx)->nmps;
+ }
+
+ return d;
+}
+
+static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
+ OPJ_INT32 d;
+ if (mqc->a < (*mqc->curctx)->qeval) {
+ mqc->a = (*mqc->curctx)->qeval;
+ d = (OPJ_INT32)(*mqc->curctx)->mps;
+ *mqc->curctx = (*mqc->curctx)->nmps;
+ } else {
+ mqc->a = (*mqc->curctx)->qeval;
+ d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
+ *mqc->curctx = (*mqc->curctx)->nlps;
+ }
+
+ return d;
+}
+
+#ifdef MQC_PERF_OPT
+static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
+ unsigned int i = *((unsigned int *) mqc->bp);
+ mqc->c += i & 0xffff00;
+ mqc->ct = i & 0x0f;
+ mqc->bp += (i >> 2) & 0x04;
+}
+#else
+static void opj_mqc_bytein(opj_mqc_t *const mqc) {
+ if (mqc->bp != mqc->end) {
+ OPJ_UINT32 c;
+ if (mqc->bp + 1 != mqc->end) {
+ c = *(mqc->bp + 1);
+ } else {
+ c = 0xff;
+ }
+ if (*mqc->bp == 0xff) {
+ if (c > 0x8f) {
+ mqc->c += 0xff00;
+ mqc->ct = 8;
+ } else {
+ mqc->bp++;
+ mqc->c += c << 9;
+ mqc->ct = 7;
+ }
+ } else {
+ mqc->bp++;
+ mqc->c += c << 8;
+ mqc->ct = 8;
+ }
+ } else {
+ mqc->c += 0xff00;
+ mqc->ct = 8;
+ }
+}
+#endif
+
+static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
+ do {
+ if (mqc->ct == 0) {
+ opj_mqc_bytein(mqc);
+ }
+ mqc->a <<= 1;
+ mqc->c <<= 1;
+ mqc->ct--;
+ } while (mqc->a < 0x8000);
+}
+
+/*
+==========================================================
+ MQ-Coder interface
+==========================================================
+*/
+
+opj_mqc_t* opj_mqc_create(void) {
+ opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
+#ifdef MQC_PERF_OPT
+ mqc->buffer = NULL;
+#endif
+ return mqc;
+}
+
+void opj_mqc_destroy(opj_mqc_t *mqc) {
+ if(mqc) {
+#ifdef MQC_PERF_OPT
+ opj_free(mqc->buffer);
+#endif
+ opj_free(mqc);
+ }
+}
+
+OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc) {
+ const ptrdiff_t diff = mqc->bp - mqc->start;
+#if 0
+ assert( diff <= 0xffffffff && diff >= 0 ); /* UINT32_MAX */
+#endif
+ return (OPJ_UINT32)diff;
+}
+
+void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp) {
+ /* TODO MSD: need to take a look to the v2 version */
+ opj_mqc_setcurctx(mqc, 0);
+ mqc->a = 0x8000;
+ mqc->c = 0;
+ mqc->bp = bp - 1;
+ mqc->ct = 12;
+ if (*mqc->bp == 0xff) {
+ mqc->ct = 13;
+ }
+ mqc->start = bp;
+}
+
+void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d) {
+ if ((*mqc->curctx)->mps == d) {
+ opj_mqc_codemps(mqc);
+ } else {
+ opj_mqc_codelps(mqc);
+ }
+}
+
+void opj_mqc_flush(opj_mqc_t *mqc) {
+ opj_mqc_setbits(mqc);
+ mqc->c <<= mqc->ct;
+ opj_mqc_byteout(mqc);
+ mqc->c <<= mqc->ct;
+ opj_mqc_byteout(mqc);
+
+ if (*mqc->bp != 0xff) {
+ mqc->bp++;
+ }
+}
+
+void opj_mqc_bypass_init_enc(opj_mqc_t *mqc) {
+ mqc->c = 0;
+ mqc->ct = 8;
+ /*if (*mqc->bp == 0xff) {
+ mqc->ct = 7;
+ } */
+}
+
+void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d) {
+ mqc->ct--;
+ mqc->c = mqc->c + (d << mqc->ct);
+ if (mqc->ct == 0) {
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)mqc->c;
+ mqc->ct = 8;
+ if (*mqc->bp == 0xff) {
+ mqc->ct = 7;
+ }
+ mqc->c = 0;
+ }
+}
+
+OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc) {
+ OPJ_BYTE bit_padding;
+
+ bit_padding = 0;
+
+ if (mqc->ct != 0) {
+ while (mqc->ct > 0) {
+ mqc->ct--;
+ mqc->c += (OPJ_UINT32)(bit_padding << mqc->ct);
+ bit_padding = (bit_padding + 1) & 0x01;
+ }
+ mqc->bp++;
+ *mqc->bp = (OPJ_BYTE)mqc->c;
+ mqc->ct = 8;
+ mqc->c = 0;
+ }
+
+ return 1;
+}
+
+void opj_mqc_reset_enc(opj_mqc_t *mqc) {
+ opj_mqc_resetstates(mqc);
+ opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+ opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+ opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+}
+
+OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc) {
+ OPJ_UINT32 correction = 1;
+
+ /* <flush part> */
+ OPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);
+ mqc->c <<= mqc->ct;
+ while (n > 0) {
+ opj_mqc_byteout(mqc);
+ n -= (OPJ_INT32)mqc->ct;
+ mqc->c <<= mqc->ct;
+ }
+ opj_mqc_byteout(mqc);
+
+ return correction;
+}
+
+void opj_mqc_restart_init_enc(opj_mqc_t *mqc) {
+ /* <Re-init part> */
+ opj_mqc_setcurctx(mqc, 0);
+ mqc->a = 0x8000;
+ mqc->c = 0;
+ mqc->ct = 12;
+ mqc->bp--;
+ if (*mqc->bp == 0xff) {
+ mqc->ct = 13;
+ }
+}
+
+void opj_mqc_erterm_enc(opj_mqc_t *mqc) {
+ OPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);
+
+ while (k > 0) {
+ mqc->c <<= mqc->ct;
+ mqc->ct = 0;
+ opj_mqc_byteout(mqc);
+ k -= (OPJ_INT32)mqc->ct;
+ }
+
+ if (*mqc->bp != 0xff) {
+ opj_mqc_byteout(mqc);
+ }
+}
+
+void opj_mqc_segmark_enc(opj_mqc_t *mqc) {
+ OPJ_UINT32 i;
+ opj_mqc_setcurctx(mqc, 18);
+
+ for (i = 1; i < 5; i++) {
+ opj_mqc_encode(mqc, i % 2);
+ }
+}
+
+OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {
+ opj_mqc_setcurctx(mqc, 0);
+ mqc->start = bp;
+ mqc->end = bp + len;
+ mqc->bp = bp;
+ if (len==0) mqc->c = 0xff << 16;
+ else mqc->c = (OPJ_UINT32)(*mqc->bp << 16);
+
+#ifdef MQC_PERF_OPT /* TODO_MSD: check this option and put in experimental */
+ {
+ OPJ_UINT32 c;
+ OPJ_UINT32 *ip;
+ OPJ_BYTE *end = mqc->end - 1;
+ void* new_buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(OPJ_UINT32));
+ if (! new_buffer) {
+ opj_free(mqc->buffer);
+ mqc->buffer = NULL;
+ return OPJ_FALSE;
+ }
+ mqc->buffer = new_buffer;
+
+ ip = (OPJ_UINT32 *) mqc->buffer;
+
+ while (bp < end) {
+ c = *(bp + 1);
+ if (*bp == 0xff) {
+ if (c > 0x8f) {
+ break;
+ } else {
+ *ip = 0x00000017 | (c << 9);
+ }
+ } else {
+ *ip = 0x00000018 | (c << 8);
+ }
+ bp++;
+ ip++;
+ }
+
+ /* Handle last byte of data */
+ c = 0xff;
+ if (*bp == 0xff) {
+ *ip = 0x0000ff18;
+ } else {
+ bp++;
+ *ip = 0x00000018 | (c << 8);
+ }
+ ip++;
+
+ *ip = 0x0000ff08;
+ mqc->bp = mqc->buffer;
+ }
+#endif
+ opj_mqc_bytein(mqc);
+ mqc->c <<= 7;
+ mqc->ct -= 7;
+ mqc->a = 0x8000;
+ return OPJ_TRUE;
+}
+
+OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
+ OPJ_INT32 d;
+ mqc->a -= (*mqc->curctx)->qeval;
+ if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
+ d = opj_mqc_lpsexchange(mqc);
+ opj_mqc_renormd(mqc);
+ } else {
+ mqc->c -= (*mqc->curctx)->qeval << 16;
+ if ((mqc->a & 0x8000) == 0) {
+ d = opj_mqc_mpsexchange(mqc);
+ opj_mqc_renormd(mqc);
+ } else {
+ d = (OPJ_INT32)(*mqc->curctx)->mps;
+ }
+ }
+
+ return d;
+}
+
+void opj_mqc_resetstates(opj_mqc_t *mqc) {
+ OPJ_UINT32 i;
+ for (i = 0; i < MQC_NUMCTXS; i++) {
+ mqc->ctxs[i] = mqc_states;
+ }
+}
+
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob) {
+ mqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];
+}
+
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h
new file mode 100644
index 0000000000..69a2d46029
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mqc.h
@@ -0,0 +1,207 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MQC_H
+#define __MQC_H
+/**
+@file mqc.h
+@brief Implementation of an MQ-Coder (MQC)
+
+The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
+in MQC.C are used by some function in T1.C.
+*/
+
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/**
+This struct defines the state of a context.
+*/
+typedef struct opj_mqc_state {
+ /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
+ OPJ_UINT32 qeval;
+ /** the Most Probable Symbol (0 or 1) */
+ OPJ_UINT32 mps;
+ /** next state if the next encoded symbol is the MPS */
+ struct opj_mqc_state *nmps;
+ /** next state if the next encoded symbol is the LPS */
+ struct opj_mqc_state *nlps;
+} opj_mqc_state_t;
+
+#define MQC_NUMCTXS 19
+
+/**
+MQ coder
+*/
+typedef struct opj_mqc {
+ OPJ_UINT32 c;
+ OPJ_UINT32 a;
+ OPJ_UINT32 ct;
+ OPJ_BYTE *bp;
+ OPJ_BYTE *start;
+ OPJ_BYTE *end;
+ opj_mqc_state_t *ctxs[MQC_NUMCTXS];
+ opj_mqc_state_t **curctx;
+#ifdef MQC_PERF_OPT
+ unsigned char *buffer;
+#endif
+} opj_mqc_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new MQC handle
+@return Returns a new MQC handle if successful, returns NULL otherwise
+*/
+opj_mqc_t* opj_mqc_create(void);
+/**
+Destroy a previously created MQC handle
+@param mqc MQC handle to destroy
+*/
+void opj_mqc_destroy(opj_mqc_t *mqc);
+/**
+Return the number of bytes written/read since initialisation
+@param mqc MQC handle
+@return Returns the number of bytes already encoded
+*/
+OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
+/**
+Reset the states of all the context of the coder/decoder
+(each context is set to a state where 0 and 1 are more or less equiprobable)
+@param mqc MQC handle
+*/
+void opj_mqc_resetstates(opj_mqc_t *mqc);
+/**
+Set the state of a particular context
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+@param msb The MSB of the new state of the context
+@param prob Number that identifies the probability of the symbols for the new state of the context
+*/
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob);
+/**
+Initialize the encoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer where the bytes will be written
+*/
+void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp);
+/**
+Set the current context used for coding/decoding
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+*/
+#define opj_mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
+/**
+Encode a symbol using the MQ-coder
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d);
+/**
+Flush the encoder, so that all remaining data is written
+@param mqc MQC handle
+*/
+void opj_mqc_flush(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, initialization operation.
+JPEG 2000 p 505.
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+*/
+void opj_mqc_bypass_init_enc(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, coding operation.
+JPEG 2000 p 505.
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
+/**
+BYPASS mode switch, flush operation
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc);
+/**
+RESET mode switch
+@param mqc MQC handle
+*/
+void opj_mqc_reset_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL)
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL) reinitialisation
+@param mqc MQC handle
+*/
+void opj_mqc_restart_init_enc(opj_mqc_t *mqc);
+/**
+ERTERM mode switch (PTERM)
+@param mqc MQC handle
+*/
+void opj_mqc_erterm_enc(opj_mqc_t *mqc);
+/**
+SEGMARK mode switch (SEGSYM)
+@param mqc MQC handle
+*/
+void opj_mqc_segmark_enc(opj_mqc_t *mqc);
+/**
+Initialize the decoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Decode a symbol
+@param mqc MQC handle
+@return Returns the decoded symbol (0 or 1)
+*/
+OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MQC_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c
new file mode 100644
index 0000000000..89bb75a552
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.c
@@ -0,0 +1,960 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#endif /* _WIN32 */
+
+#include "opj_includes.h"
+
+
+/* ---------------------------------------------------------------------- */
+/* Functions to set the message handlers */
+
+OPJ_BOOL OPJ_CALLCONV opj_set_info_handler( opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data)
+{
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ if(! l_codec){
+ return OPJ_FALSE;
+ }
+
+ l_codec->m_event_mgr.info_handler = p_callback;
+ l_codec->m_event_mgr.m_info_data = p_user_data;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler( opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data)
+{
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ if (! l_codec) {
+ return OPJ_FALSE;
+ }
+
+ l_codec->m_event_mgr.warning_handler = p_callback;
+ l_codec->m_event_mgr.m_warning_data = p_user_data;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data)
+{
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ if (! l_codec) {
+ return OPJ_FALSE;
+ }
+
+ l_codec->m_event_mgr.error_handler = p_callback;
+ l_codec->m_event_mgr.m_error_data = p_user_data;
+
+ return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+{
+ OPJ_SIZE_T l_nb_read = fread(p_buffer,1,p_nb_bytes,p_file);
+ return l_nb_read ? l_nb_read : (OPJ_SIZE_T)-1;
+}
+
+static OPJ_UINT64 opj_get_data_length_from_file (FILE * p_file)
+{
+ OPJ_OFF_T file_length = 0;
+
+ OPJ_FSEEK(p_file, 0, SEEK_END);
+ file_length = (OPJ_OFF_T)OPJ_FTELL(p_file);
+ OPJ_FSEEK(p_file, 0, SEEK_SET);
+
+ return (OPJ_UINT64)file_length;
+}
+
+static OPJ_SIZE_T opj_write_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+{
+ return fwrite(p_buffer,1,p_nb_bytes,p_file);
+}
+
+static OPJ_OFF_T opj_skip_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+{
+ if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_CUR)) {
+ return -1;
+ }
+
+ return p_nb_bytes;
+}
+
+static OPJ_BOOL opj_seek_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+{
+ if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_SET)) {
+ return OPJ_FALSE;
+ }
+
+ return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+#ifdef _WIN32
+#ifndef OPJ_STATIC
+BOOL APIENTRY
+DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
+
+ OPJ_ARG_NOT_USED(lpReserved);
+ OPJ_ARG_NOT_USED(hModule);
+
+ switch (ul_reason_for_call) {
+ case DLL_PROCESS_ATTACH :
+ break;
+ case DLL_PROCESS_DETACH :
+ break;
+ case DLL_THREAD_ATTACH :
+ case DLL_THREAD_DETACH :
+ break;
+ }
+
+ return TRUE;
+}
+#endif /* OPJ_STATIC */
+#endif /* _WIN32 */
+
+/* ---------------------------------------------------------------------- */
+
+const char* OPJ_CALLCONV opj_version(void) {
+ return OPJ_PACKAGE_VERSION;
+}
+
+/* ---------------------------------------------------------------------- */
+/* DECOMPRESSION FUNCTIONS*/
+
+opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
+{
+ opj_codec_private_t *l_codec = 00;
+
+ l_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));
+ if (!l_codec){
+ return 00;
+ }
+ memset(l_codec, 0, sizeof(opj_codec_private_t));
+
+ l_codec->is_decompressor = 1;
+
+ switch (p_format) {
+ case OPJ_CODEC_J2K:
+ l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) j2k_dump;
+
+ l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) j2k_get_cstr_info;
+
+ l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) j2k_get_cstr_index;
+
+ l_codec->m_codec_data.m_decompression.opj_decode =
+ (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ opj_image_t*, struct opj_event_mgr * )) opj_j2k_decode;
+
+ l_codec->m_codec_data.m_decompression.opj_end_decompress =
+ (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_j2k_end_decompress;
+
+ l_codec->m_codec_data.m_decompression.opj_read_header =
+ (OPJ_BOOL (*) ( struct opj_stream_private *,
+ void *,
+ opj_image_t **,
+ struct opj_event_mgr * )) opj_j2k_read_header;
+
+ l_codec->m_codec_data.m_decompression.opj_destroy =
+ (void (*) (void *))opj_j2k_destroy;
+
+ l_codec->m_codec_data.m_decompression.opj_setup_decoder =
+ (void (*) (void * , opj_dparameters_t * )) opj_j2k_setup_decoder;
+
+ l_codec->m_codec_data.m_decompression.opj_read_tile_header =
+ (OPJ_BOOL (*) ( void *,
+ OPJ_UINT32*,
+ OPJ_UINT32*,
+ OPJ_INT32*, OPJ_INT32*,
+ OPJ_INT32*, OPJ_INT32*,
+ OPJ_UINT32*,
+ OPJ_BOOL*,
+ struct opj_stream_private *,
+ struct opj_event_mgr * )) opj_j2k_read_tile_header;
+
+ l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
+ (OPJ_BOOL (*) ( void *,
+ OPJ_UINT32,
+ OPJ_BYTE*,
+ OPJ_UINT32,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_j2k_decode_tile;
+
+ l_codec->m_codec_data.m_decompression.opj_set_decode_area =
+ (OPJ_BOOL (*) ( void *,
+ opj_image_t*,
+ OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32,
+ struct opj_event_mgr *)) opj_j2k_set_decode_area;
+
+ l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
+ (OPJ_BOOL (*) ( void *p_codec,
+ opj_stream_private_t *p_cio,
+ opj_image_t *p_image,
+ struct opj_event_mgr * p_manager,
+ OPJ_UINT32 tile_index)) opj_j2k_get_tile;
+
+ l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
+ (OPJ_BOOL (*) ( void * p_codec,
+ OPJ_UINT32 res_factor,
+ struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
+
+ l_codec->m_codec = opj_j2k_create_decompress();
+
+ if (! l_codec->m_codec) {
+ opj_free(l_codec);
+ return NULL;
+ }
+
+ break;
+
+ case OPJ_CODEC_JP2:
+ /* get a JP2 decoder handle */
+ l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) jp2_dump;
+
+ l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) jp2_get_cstr_info;
+
+ l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) jp2_get_cstr_index;
+
+ l_codec->m_codec_data.m_decompression.opj_decode =
+ (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ opj_image_t*,
+ struct opj_event_mgr * )) opj_jp2_decode;
+
+ l_codec->m_codec_data.m_decompression.opj_end_decompress =
+ (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_jp2_end_decompress;
+
+ l_codec->m_codec_data.m_decompression.opj_read_header =
+ (OPJ_BOOL (*) ( struct opj_stream_private *,
+ void *,
+ opj_image_t **,
+ struct opj_event_mgr * )) opj_jp2_read_header;
+
+ l_codec->m_codec_data.m_decompression.opj_read_tile_header =
+ (OPJ_BOOL (*) ( void *,
+ OPJ_UINT32*,
+ OPJ_UINT32*,
+ OPJ_INT32*,
+ OPJ_INT32*,
+ OPJ_INT32 * ,
+ OPJ_INT32 * ,
+ OPJ_UINT32 * ,
+ OPJ_BOOL *,
+ struct opj_stream_private *,
+ struct opj_event_mgr * )) opj_jp2_read_tile_header;
+
+ l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
+ (OPJ_BOOL (*) ( void *,
+ OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,
+ struct opj_stream_private *,
+ struct opj_event_mgr * )) opj_jp2_decode_tile;
+
+ l_codec->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))opj_jp2_destroy;
+
+ l_codec->m_codec_data.m_decompression.opj_setup_decoder =
+ (void (*) (void * ,opj_dparameters_t * )) opj_jp2_setup_decoder;
+
+ l_codec->m_codec_data.m_decompression.opj_set_decode_area =
+ (OPJ_BOOL (*) ( void *,
+ opj_image_t*,
+ OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32,
+ struct opj_event_mgr * )) opj_jp2_set_decode_area;
+
+ l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
+ (OPJ_BOOL (*) ( void *p_codec,
+ opj_stream_private_t *p_cio,
+ opj_image_t *p_image,
+ struct opj_event_mgr * p_manager,
+ OPJ_UINT32 tile_index)) opj_jp2_get_tile;
+
+ l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
+ (OPJ_BOOL (*) ( void * p_codec,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
+
+ l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
+
+ if (! l_codec->m_codec) {
+ opj_free(l_codec);
+ return 00;
+ }
+
+ break;
+ case OPJ_CODEC_UNKNOWN:
+ case OPJ_CODEC_JPT:
+ default:
+ opj_free(l_codec);
+ return 00;
+ }
+
+ opj_set_default_event_handler(&(l_codec->m_event_mgr));
+ return (opj_codec_t*) l_codec;
+}
+
+void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
+ if(parameters) {
+ memset(parameters, 0, sizeof(opj_dparameters_t));
+ /* default decoding parameters */
+ parameters->cp_layer = 0;
+ parameters->cp_reduce = 0;
+
+ parameters->decod_format = -1;
+ parameters->cod_format = -1;
+ parameters->flags = 0;
+/* UniPG>> */
+#ifdef USE_JPWL
+ parameters->jpwl_correct = OPJ_FALSE;
+ parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
+ parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
+#endif /* USE_JPWL */
+/* <<UniPG */
+ }
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
+ opj_dparameters_t *parameters
+ )
+{
+ if (p_codec && parameters) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+ if (! l_codec->is_decompressor) {
+ opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
+ "Codec provided to the opj_setup_decoder function is not a decompressor handler.\n");
+ return OPJ_FALSE;
+ }
+
+ l_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,
+ parameters);
+ return OPJ_TRUE;
+ }
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_read_header ( opj_stream_t *p_stream,
+ opj_codec_t *p_codec,
+ opj_image_t **p_image )
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+ opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+ if(! l_codec->is_decompressor) {
+ opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
+ "Codec provided to the opj_read_header function is not a decompressor handler.\n");
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_read_header( l_stream,
+ l_codec->m_codec,
+ p_image,
+ &(l_codec->m_event_mgr) );
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_decode( opj_codec_t *p_codec,
+ opj_stream_t *p_stream,
+ opj_image_t* p_image)
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,
+ l_stream,
+ p_image,
+ &(l_codec->m_event_mgr) );
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_decode_area( opj_codec_t *p_codec,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y
+ )
+{
+ if (p_codec) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_set_decode_area( l_codec->m_codec,
+ p_image,
+ p_start_x, p_start_y,
+ p_end_x, p_end_y,
+ &(l_codec->m_event_mgr) );
+ }
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_read_tile_header( opj_codec_t *p_codec,
+ opj_stream_t * p_stream,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_should_go_on)
+{
+ if (p_codec && p_stream && p_data_size && p_tile_index) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_read_tile_header( l_codec->m_codec,
+ p_tile_index,
+ p_data_size,
+ p_tile_x0, p_tile_y0,
+ p_tile_x1, p_tile_y1,
+ p_nb_comps,
+ p_should_go_on,
+ l_stream,
+ &(l_codec->m_event_mgr));
+ }
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data( opj_codec_t *p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_t *p_stream
+ )
+{
+ if (p_codec && p_data && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_decode_tile_data( l_codec->m_codec,
+ p_tile_index,
+ p_data,
+ p_data_size,
+ l_stream,
+ &(l_codec->m_event_mgr) );
+ }
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile( opj_codec_t *p_codec,
+ opj_stream_t *p_stream,
+ opj_image_t *p_image,
+ OPJ_UINT32 tile_index)
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_get_decoded_tile( l_codec->m_codec,
+ l_stream,
+ p_image,
+ &(l_codec->m_event_mgr),
+ tile_index);
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec,
+ OPJ_UINT32 res_factor )
+{
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+ if ( !l_codec ){
+ fprintf(stderr, "[ERROR] Input parameters of the setup_decoder function are incorrect.\n");
+ return OPJ_FALSE;
+ }
+
+ l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(l_codec->m_codec,
+ res_factor,
+ &(l_codec->m_event_mgr) );
+ return OPJ_TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+/* COMPRESSION FUNCTIONS*/
+
+opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT p_format)
+{
+ opj_codec_private_t *l_codec = 00;
+
+ l_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));
+ if (!l_codec) {
+ return 00;
+ }
+ memset(l_codec, 0, sizeof(opj_codec_private_t));
+
+ l_codec->is_decompressor = 0;
+
+ switch(p_format) {
+ case OPJ_CODEC_J2K:
+ l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr * )) opj_j2k_encode;
+
+ l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_j2k_end_compress;
+
+ l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
+ struct opj_stream_private *,
+ struct opj_image * ,
+ struct opj_event_mgr *)) opj_j2k_start_compress;
+
+ l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
+ OPJ_UINT32,
+ OPJ_BYTE*,
+ OPJ_UINT32,
+ struct opj_stream_private *,
+ struct opj_event_mgr *) ) opj_j2k_write_tile;
+
+ l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_j2k_destroy;
+
+ l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) ( void *,
+ opj_cparameters_t *,
+ struct opj_image *,
+ struct opj_event_mgr * )) opj_j2k_setup_encoder;
+
+ l_codec->m_codec = opj_j2k_create_compress();
+ if (! l_codec->m_codec) {
+ opj_free(l_codec);
+ return 00;
+ }
+
+ break;
+
+ case OPJ_CODEC_JP2:
+ /* get a JP2 decoder handle */
+ l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr * )) opj_jp2_encode;
+
+ l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) ( void *,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_jp2_end_compress;
+
+ l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
+ struct opj_stream_private *,
+ struct opj_image * ,
+ struct opj_event_mgr *)) opj_jp2_start_compress;
+
+ l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
+ OPJ_UINT32,
+ OPJ_BYTE*,
+ OPJ_UINT32,
+ struct opj_stream_private *,
+ struct opj_event_mgr *)) opj_jp2_write_tile;
+
+ l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_jp2_destroy;
+
+ l_codec->m_codec_data.m_compression.opj_setup_encoder = (void (*) ( void *,
+ opj_cparameters_t *,
+ struct opj_image *,
+ struct opj_event_mgr * )) opj_jp2_setup_encoder;
+
+ l_codec->m_codec = opj_jp2_create(OPJ_FALSE);
+ if (! l_codec->m_codec) {
+ opj_free(l_codec);
+ return 00;
+ }
+
+ break;
+
+ case OPJ_CODEC_UNKNOWN:
+ case OPJ_CODEC_JPT:
+ default:
+ opj_free(l_codec);
+ return 00;
+ }
+
+ opj_set_default_event_handler(&(l_codec->m_event_mgr));
+ return (opj_codec_t*) l_codec;
+}
+
+void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
+ if(parameters) {
+ memset(parameters, 0, sizeof(opj_cparameters_t));
+ /* default coding parameters */
+ parameters->cp_cinema = OPJ_OFF;
+ parameters->max_comp_size = 0;
+ parameters->numresolution = 6;
+ parameters->cp_rsiz = OPJ_STD_RSIZ;
+ parameters->cblockw_init = 64;
+ parameters->cblockh_init = 64;
+ parameters->prog_order = OPJ_LRCP;
+ parameters->roi_compno = -1; /* no ROI */
+ parameters->subsampling_dx = 1;
+ parameters->subsampling_dy = 1;
+ parameters->tp_on = 0;
+ parameters->decod_format = -1;
+ parameters->cod_format = -1;
+ parameters->tcp_rates[0] = 0;
+ parameters->tcp_numlayers = 0;
+ parameters->cp_disto_alloc = 0;
+ parameters->cp_fixed_alloc = 0;
+ parameters->cp_fixed_quality = 0;
+ parameters->jpip_on = OPJ_FALSE;
+/* UniPG>> */
+#ifdef USE_JPWL
+ parameters->jpwl_epc_on = OPJ_FALSE;
+ parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
+ {
+ int i;
+ for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+ parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
+ parameters->jpwl_hprot_TPH[i] = 0; /* absent */
+ }
+ };
+ {
+ int i;
+ for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+ parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
+ parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
+ parameters->jpwl_pprot[i] = 0; /* absent */
+ }
+ };
+ parameters->jpwl_sens_size = 0; /* 0 means no ESD */
+ parameters->jpwl_sens_addr = 0; /* 0 means auto */
+ parameters->jpwl_sens_range = 0; /* 0 means packet */
+ parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
+ {
+ int i;
+ for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+ parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
+ parameters->jpwl_sens_TPH[i] = -1; /* absent */
+ }
+ };
+#endif /* USE_JPWL */
+/* <<UniPG */
+ }
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec,
+ opj_cparameters_t *parameters,
+ opj_image_t *p_image)
+{
+ if (p_codec && parameters && p_image) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+ if (! l_codec->is_decompressor) {
+ l_codec->m_codec_data.m_compression.opj_setup_encoder( l_codec->m_codec,
+ parameters,
+ p_image,
+ &(l_codec->m_event_mgr) );
+ return OPJ_TRUE;
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_start_compress ( opj_codec_t *p_codec,
+ opj_image_t * p_image,
+ opj_stream_t *p_stream)
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return l_codec->m_codec_data.m_compression.opj_start_compress( l_codec->m_codec,
+ l_stream,
+ p_image,
+ &(l_codec->m_event_mgr));
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_info, opj_stream_t *p_stream)
+{
+ if (p_info && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return l_codec->m_codec_data.m_compression.opj_encode( l_codec->m_codec,
+ l_stream,
+ &(l_codec->m_event_mgr));
+ }
+ }
+
+ return OPJ_FALSE;
+
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
+ opj_stream_t *p_stream)
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,
+ l_stream,
+ &(l_codec->m_event_mgr));
+ }
+ }
+ return OPJ_FALSE;
+
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_end_decompress ( opj_codec_t *p_codec,
+ opj_stream_t *p_stream)
+{
+ if (p_codec && p_stream) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (! l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_decompression.opj_end_decompress(l_codec->m_codec,
+ l_stream,
+ &(l_codec->m_event_mgr) );
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,
+ OPJ_FLOAT32 * pEncodingMatrix,
+ OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp)
+{
+ OPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+ OPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);
+ OPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;
+
+ /* add MCT capability */
+ OPJ_INT32 rsiz = (OPJ_INT32)parameters->cp_rsiz | (OPJ_INT32)OPJ_MCT;
+ parameters->cp_rsiz = (OPJ_RSIZ_CAPABILITIES)rsiz;
+ parameters->irreversible = 1;
+
+ /* use array based MCT */
+ parameters->tcp_mct = 2;
+ parameters->mct_data = opj_malloc(l_mct_total_size);
+ if (! parameters->mct_data) {
+ return OPJ_FALSE;
+ }
+
+ memcpy(parameters->mct_data,pEncodingMatrix,l_matrix_size);
+ memcpy(((OPJ_BYTE *) parameters->mct_data) + l_matrix_size,p_dc_shift,l_dc_shift_size);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL OPJ_CALLCONV opj_write_tile ( opj_codec_t *p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_t *p_stream )
+{
+ if (p_codec && p_stream && p_data) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+ opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+
+ if (l_codec->is_decompressor) {
+ return OPJ_FALSE;
+ }
+
+ return l_codec->m_codec_data.m_compression.opj_write_tile( l_codec->m_codec,
+ p_tile_index,
+ p_data,
+ p_data_size,
+ l_stream,
+ &(l_codec->m_event_mgr) );
+ }
+
+ return OPJ_FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void OPJ_CALLCONV opj_destroy_codec(opj_codec_t *p_codec)
+{
+ if (p_codec) {
+ opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+ if (l_codec->is_decompressor) {
+ l_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);
+ }
+ else {
+ l_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);
+ }
+
+ l_codec->m_codec = 00;
+ opj_free(l_codec);
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+
+void OPJ_CALLCONV opj_dump_codec( opj_codec_t *p_codec,
+ OPJ_INT32 info_flag,
+ FILE* output_stream)
+{
+ if (p_codec) {
+ opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+ l_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);
+ return;
+ }
+
+ fprintf(stderr, "[ERROR] Input parameter of the dump_codec function are incorrect.\n");
+ return;
+}
+
+opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec)
+{
+ if (p_codec) {
+ opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+ return l_codec->opj_get_codec_info(l_codec->m_codec);
+ }
+
+ return NULL;
+}
+
+void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info) {
+ if (cstr_info) {
+
+ if ((*cstr_info)->m_default_tile_info.tccp_info){
+ opj_free((*cstr_info)->m_default_tile_info.tccp_info);
+ }
+
+ if ((*cstr_info)->tile_info){
+ /* FIXME not used for the moment*/
+ }
+
+ opj_free((*cstr_info));
+ (*cstr_info) = NULL;
+ }
+}
+
+opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)
+{
+ if (p_codec) {
+ opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+
+ return l_codec->opj_get_codec_index(l_codec->m_codec);
+ }
+
+ return NULL;
+}
+
+void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)
+{
+ if (*p_cstr_index){
+ j2k_destroy_cstr_index(*p_cstr_index);
+ (*p_cstr_index) = NULL;
+ }
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream)
+{
+ return opj_stream_create_file_stream_v3(fname, OPJ_J2K_STREAM_CHUNK_SIZE, p_is_read_stream);
+}
+
+opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (
+ const char *fname,
+ OPJ_SIZE_T p_size,
+ OPJ_BOOL p_is_read_stream)
+{
+ opj_stream_t* l_stream = 00;
+ FILE *p_file;
+ const char *mode;
+
+ if (! fname) {
+ return NULL;
+ }
+
+ if(p_is_read_stream) mode = "rb"; else mode = "wb";
+
+ p_file = fopen(fname, mode);
+
+ if (! p_file) {
+ return NULL;
+ }
+
+ l_stream = opj_stream_create(p_size,p_is_read_stream);
+ if (! l_stream) {
+ fclose(p_file);
+ return NULL;
+ }
+
+ opj_stream_set_user_data_v3(l_stream, p_file, (opj_stream_free_user_data_fn) fclose);
+ opj_stream_set_user_data_length(l_stream, opj_get_data_length_from_file(p_file));
+ opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_file);
+ opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_file);
+ opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_file);
+ opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_file);
+
+ return l_stream;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h
new file mode 100644
index 0000000000..29a9a9084f
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/openjpeg.h
@@ -0,0 +1,1501 @@
+ /*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPENJPEG_H
+#define OPENJPEG_H
+
+#ifndef OPJ_STATIC
+#define OPJ_STATIC
+#endif
+
+
+
+/*
+==========================================================
+ Compiler directives
+==========================================================
+*/
+
+/*
+The inline keyword is supported by C99 but not by C90.
+Most compilers implement their own version of this keyword ...
+*/
+#ifndef INLINE
+ #if defined(_MSC_VER)
+ #define INLINE __forceinline
+ #elif defined(__GNUC__)
+ #define INLINE __inline__
+ #elif defined(__MWERKS__)
+ #define INLINE inline
+ #else
+ /* add other compilers here ... */
+ #define INLINE
+ #endif /* defined(<Compiler>) */
+#endif /* INLINE */
+
+/* deprecated attribute */
+#ifdef __GNUC__
+ #define OPJ_DEPRECATED(func) func __attribute__ ((deprecated))
+#elif defined(_MSC_VER)
+ #define OPJ_DEPRECATED(func) __declspec(deprecated) func
+#else
+ #pragma message("WARNING: You need to implement DEPRECATED for this compiler")
+ #define OPJ_DEPRECATED(func) func
+#endif
+
+#if defined(OPJ_STATIC) || !defined(_WIN32)
+/* http://gcc.gnu.org/wiki/Visibility */
+#if __GNUC__ >= 4
+#define OPJ_API __attribute__ ((visibility ("default")))
+#define OPJ_LOCAL __attribute__ ((visibility ("hidden")))
+#else
+#define OPJ_API
+#define OPJ_LOCAL
+#endif
+#define OPJ_CALLCONV
+#else
+#define OPJ_CALLCONV __stdcall
+/*
+The following ifdef block is the standard way of creating macros which make exporting
+from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
+symbol defined on the command line. this symbol should not be defined on any project
+that uses this DLL. This way any other project whose source files include this file see
+OPJ_API functions as being imported from a DLL, wheras this DLL sees symbols
+defined with this macro as being exported.
+*/
+#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
+#define OPJ_API __declspec(dllexport)
+#else
+#define OPJ_API __declspec(dllimport)
+#endif /* OPJ_EXPORTS */
+#endif /* !OPJ_STATIC || !_WIN32 */
+
+typedef int OPJ_BOOL;
+#define OPJ_TRUE 1
+#define OPJ_FALSE 0
+
+typedef char OPJ_CHAR;
+typedef float OPJ_FLOAT32;
+typedef double OPJ_FLOAT64;
+typedef unsigned char OPJ_BYTE;
+#include "opj_stdint.h"
+
+typedef int8_t OPJ_INT8;
+typedef uint8_t OPJ_UINT8;
+typedef int16_t OPJ_INT16;
+typedef uint16_t OPJ_UINT16;
+typedef int32_t OPJ_INT32;
+typedef uint32_t OPJ_UINT32;
+typedef int64_t OPJ_INT64;
+typedef uint64_t OPJ_UINT64;
+
+typedef int64_t OPJ_OFF_T; /* 64-bit file offset type */
+
+#include <stdio.h>
+typedef size_t OPJ_SIZE_T;
+
+/* Avoid compile-time warning because parameter is not used */
+#define OPJ_ARG_NOT_USED(x) (void)(x)
+
+/*
+==========================================================
+ Useful constant definitions
+==========================================================
+*/
+
+#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
+
+#define OPJ_J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
+#define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
+
+#define OPJ_J2K_DEFAULT_NB_SEGS 10
+#define OPJ_J2K_STREAM_CHUNK_SIZE 0x100000 /** 1 mega by default */
+#define OPJ_J2K_DEFAULT_HEADER_SIZE 1000
+#define OPJ_J2K_MCC_DEFAULT_NB_RECORDS 10
+#define OPJ_J2K_MCT_DEFAULT_NB_RECORDS 10
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
+#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
+#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
+#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
+#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
+#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
+/* <<UniPG */
+
+/**
+ * EXPERIMENTAL FOR THE MOMENT
+ * Supported options about file information used only in j2k_dump
+*/
+#define OPJ_IMG_INFO 1 /**< Basic image information provided to the user */
+#define OPJ_J2K_MH_INFO 2 /**< Codestream information based only on the main header */
+#define OPJ_J2K_TH_INFO 4 /**< Tile information based on the current tile header */
+#define OPJ_J2K_TCH_INFO 8 /**< Tile/Component information of all tiles */
+#define OPJ_J2K_MH_IND 16 /**< Codestream index based only on the main header */
+#define OPJ_J2K_TH_IND 32 /**< Tile index based on the current tile */
+/*FIXME #define OPJ_J2K_CSTR_IND 48*/ /**< */
+#define OPJ_JP2_INFO 128 /**< JP2 file information */
+#define OPJ_JP2_IND 256 /**< JP2 file index */
+
+
+/*
+==========================================================
+ enum definitions
+==========================================================
+*/
+/**
+ * Rsiz Capabilities
+ * */
+typedef enum RSIZ_CAPABILITIES {
+ OPJ_STD_RSIZ = 0, /** Standard JPEG2000 profile*/
+ OPJ_CINEMA2K = 3, /** Profile name for a 2K image*/
+ OPJ_CINEMA4K = 4, /** Profile name for a 4K image*/
+ OPJ_MCT = 0x8100
+} OPJ_RSIZ_CAPABILITIES;
+
+/**
+ * Digital cinema operation mode
+ * */
+typedef enum CINEMA_MODE {
+ OPJ_OFF = 0, /** Not Digital Cinema*/
+ OPJ_CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/
+ OPJ_CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/
+ OPJ_CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/
+}OPJ_CINEMA_MODE;
+
+/**
+ * Progression order
+ * */
+typedef enum PROG_ORDER {
+ OPJ_PROG_UNKNOWN = -1, /**< place-holder */
+ OPJ_LRCP = 0, /**< layer-resolution-component-precinct order */
+ OPJ_RLCP = 1, /**< resolution-layer-component-precinct order */
+ OPJ_RPCL = 2, /**< resolution-precinct-component-layer order */
+ OPJ_PCRL = 3, /**< precinct-component-resolution-layer order */
+ OPJ_CPRL = 4 /**< component-precinct-resolution-layer order */
+} OPJ_PROG_ORDER;
+
+/**
+ * Supported image color spaces
+*/
+typedef enum COLOR_SPACE {
+ OPJ_CLRSPC_UNKNOWN = -1, /**< not supported by the library */
+ OPJ_CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
+ OPJ_CLRSPC_SRGB = 1, /**< sRGB */
+ OPJ_CLRSPC_GRAY = 2, /**< grayscale */
+ OPJ_CLRSPC_SYCC = 3, /**< YUV */
+ OPJ_CLRSPC_EYCC = 4 /**< e-YCC */
+} OPJ_COLOR_SPACE;
+
+/**
+ * Supported codec
+*/
+typedef enum CODEC_FORMAT {
+ OPJ_CODEC_UNKNOWN = -1, /**< place-holder */
+ OPJ_CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
+ OPJ_CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
+ OPJ_CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
+} OPJ_CODEC_FORMAT;
+
+
+/*
+==========================================================
+ event manager typedef definitions
+==========================================================
+*/
+
+/**
+ * Callback function prototype for events
+ * @param msg Event message
+ * @param client_data Client object where will be return the event message
+ * */
+typedef void (*opj_msg_callback) (const char *msg, void *client_data);
+
+/*
+==========================================================
+ codec typedef definitions
+==========================================================
+*/
+
+/**
+ * Progression order changes
+ *
+ */
+typedef struct opj_poc {
+ /** Resolution num start, Component num start, given by POC */
+ OPJ_UINT32 resno0, compno0;
+ /** Layer num end,Resolution num end, Component num end, given by POC */
+ OPJ_UINT32 layno1, resno1, compno1;
+ /** Layer num start,Precinct num start, Precinct num end */
+ OPJ_UINT32 layno0, precno0, precno1;
+ /** Progression order enum*/
+ OPJ_PROG_ORDER prg1,prg;
+ /** Progression order string*/
+ OPJ_CHAR progorder[5];
+ /** Tile number */
+ OPJ_UINT32 tile;
+ /** Start and end values for Tile width and height*/
+ OPJ_INT32 tx0,tx1,ty0,ty1;
+ /** Start value, initialised in pi_initialise_encode*/
+ OPJ_UINT32 layS, resS, compS, prcS;
+ /** End value, initialised in pi_initialise_encode */
+ OPJ_UINT32 layE, resE, compE, prcE;
+ /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
+ OPJ_UINT32 txS,txE,tyS,tyE,dx,dy;
+ /** Temporary values for Tile parts, initialised in pi_create_encode */
+ OPJ_UINT32 lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
+} opj_poc_t;
+
+/**
+ * Compression parameters
+ * */
+typedef struct opj_cparameters {
+ /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
+ OPJ_BOOL tile_size_on;
+ /** XTOsiz */
+ int cp_tx0;
+ /** YTOsiz */
+ int cp_ty0;
+ /** XTsiz */
+ int cp_tdx;
+ /** YTsiz */
+ int cp_tdy;
+ /** allocation by rate/distortion */
+ int cp_disto_alloc;
+ /** allocation by fixed layer */
+ int cp_fixed_alloc;
+ /** add fixed_quality */
+ int cp_fixed_quality;
+ /** fixed layer */
+ int *cp_matrice;
+ /** comment for coding */
+ char *cp_comment;
+ /** csty : coding style */
+ int csty;
+ /** progression order (default OPJ_LRCP) */
+ OPJ_PROG_ORDER prog_order;
+ /** progression order changes */
+ opj_poc_t POC[32];
+ /** number of progression order changes (POC), default to 0 */
+ OPJ_UINT32 numpocs;
+ /** number of layers */
+ int tcp_numlayers;
+ /** rates of layers */
+ float tcp_rates[100];
+ /** different psnr for successive layers */
+ float tcp_distoratio[100];
+ /** number of resolutions */
+ int numresolution;
+ /** initial code block width, default to 64 */
+ int cblockw_init;
+ /** initial code block height, default to 64 */
+ int cblockh_init;
+ /** mode switch (cblk_style) */
+ int mode;
+ /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
+ int irreversible;
+ /** region of interest: affected component in [0..3], -1 means no ROI */
+ int roi_compno;
+ /** region of interest: upshift value */
+ int roi_shift;
+ /* number of precinct size specifications */
+ int res_spec;
+ /** initial precinct width */
+ int prcw_init[OPJ_J2K_MAXRLVLS];
+ /** initial precinct height */
+ int prch_init[OPJ_J2K_MAXRLVLS];
+
+ /**@name command line encoder parameters (not used inside the library) */
+ /*@{*/
+ /** input file name */
+ char infile[OPJ_PATH_LEN];
+ /** output file name */
+ char outfile[OPJ_PATH_LEN];
+ /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+ int index_on;
+ /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+ char index[OPJ_PATH_LEN];
+ /** subimage encoding: origin image offset in x direction */
+ int image_offset_x0;
+ /** subimage encoding: origin image offset in y direction */
+ int image_offset_y0;
+ /** subsampling value for dx */
+ int subsampling_dx;
+ /** subsampling value for dy */
+ int subsampling_dy;
+ /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
+ int decod_format;
+ /** output file format 0: J2K, 1: JP2, 2: JPT */
+ int cod_format;
+ /*@}*/
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+ /**@name JPWL encoding parameters */
+ /*@{*/
+ /** enables writing of EPC in MH, thus activating JPWL */
+ OPJ_BOOL jpwl_epc_on;
+ /** error protection method for MH (0,1,16,32,37-128) */
+ int jpwl_hprot_MH;
+ /** tile number of header protection specification (>=0) */
+ int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+ /** error protection methods for TPHs (0,1,16,32,37-128) */
+ int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
+ /** tile number of packet protection specification (>=0) */
+ int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+ /** packet number of packet protection specification (>=0) */
+ int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
+ /** error protection methods for packets (0,1,16,32,37-128) */
+ int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
+ /** enables writing of ESD, (0=no/1/2 bytes) */
+ int jpwl_sens_size;
+ /** sensitivity addressing size (0=auto/2/4 bytes) */
+ int jpwl_sens_addr;
+ /** sensitivity range (0-3) */
+ int jpwl_sens_range;
+ /** sensitivity method for MH (-1=no,0-7) */
+ int jpwl_sens_MH;
+ /** tile number of sensitivity specification (>=0) */
+ int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+ /** sensitivity methods for TPHs (-1=no,0-7) */
+ int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
+ /*@}*/
+/* <<UniPG */
+
+ /** Digital Cinema compliance 0-not compliant, 1-compliant*/
+ OPJ_CINEMA_MODE cp_cinema;
+ /** Maximum rate for each component. If == 0, component size limitation is not considered */
+ int max_comp_size;
+ /** Profile name*/
+ OPJ_RSIZ_CAPABILITIES cp_rsiz;
+ /** Tile part generation*/
+ char tp_on;
+ /** Flag for Tile part generation*/
+ char tp_flag;
+ /** MCT (multiple component transform) */
+ char tcp_mct;
+ /** Enable JPIP indexing*/
+ OPJ_BOOL jpip_on;
+ /** Naive implementation of MCT restricted to a single reversible array based
+ encoding without offset concerning all the components. */
+ void * mct_data;
+} opj_cparameters_t;
+
+#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG 0x0001
+
+/**
+ * Decompression parameters
+ * */
+typedef struct opj_dparameters {
+ /**
+ Set the number of highest resolution levels to be discarded.
+ The image resolution is effectively divided by 2 to the power of the number of discarded levels.
+ The reduce factor is limited by the smallest total number of decomposition levels among tiles.
+ if != 0, then original dimension divided by 2^(reduce);
+ if == 0 or not used, image is decoded to the full resolution
+ */
+ OPJ_UINT32 cp_reduce;
+ /**
+ Set the maximum number of quality layers to decode.
+ If there are less quality layers than the specified number, all the quality layers are decoded.
+ if != 0, then only the first "layer" layers are decoded;
+ if == 0 or not used, all the quality layers are decoded
+ */
+ OPJ_UINT32 cp_layer;
+
+ /**@name command line decoder parameters (not used inside the library) */
+ /*@{*/
+ /** input file name */
+ char infile[OPJ_PATH_LEN];
+ /** output file name */
+ char outfile[OPJ_PATH_LEN];
+ /** input file format 0: J2K, 1: JP2, 2: JPT */
+ int decod_format;
+ /** output file format 0: PGX, 1: PxM, 2: BMP */
+ int cod_format;
+
+ /** Decoding area left boundary */
+ OPJ_UINT32 DA_x0;
+ /** Decoding area right boundary */
+ OPJ_UINT32 DA_x1;
+ /** Decoding area up boundary */
+ OPJ_UINT32 DA_y0;
+ /** Decoding area bottom boundary */
+ OPJ_UINT32 DA_y1;
+ /** Verbose mode */
+ OPJ_BOOL m_verbose;
+
+ /** tile number ot the decoded tile*/
+ OPJ_UINT32 tile_index;
+ /** Nb of tile to decode */
+ OPJ_UINT32 nb_tile_to_decode;
+
+ /*@}*/
+
+/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+ /**@name JPWL decoding parameters */
+ /*@{*/
+ /** activates the JPWL correction capabilities */
+ OPJ_BOOL jpwl_correct;
+ /** expected number of components */
+ int jpwl_exp_comps;
+ /** maximum number of tiles */
+ int jpwl_max_tiles;
+ /*@}*/
+/* <<UniPG */
+
+ unsigned int flags;
+
+} opj_dparameters_t;
+
+
+/**
+ * JPEG2000 codec V2.
+ * */
+typedef void * opj_codec_t;
+
+/*
+==========================================================
+ I/O stream typedef definitions
+==========================================================
+*/
+
+/**
+ * Stream open flags.
+ * */
+/** The stream was opened for reading. */
+#define OPJ_STREAM_READ OPJ_TRUE
+/** The stream was opened for writing. */
+#define OPJ_STREAM_WRITE OPJ_FALSE
+
+/*
+ * Callback function prototype for read function
+ */
+typedef OPJ_SIZE_T (* opj_stream_read_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for write function
+ */
+typedef OPJ_SIZE_T (* opj_stream_write_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for skip function
+ */
+typedef OPJ_OFF_T (* opj_stream_skip_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for seek function
+ */
+typedef OPJ_BOOL (* opj_stream_seek_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+
+/*
+ * Callback function prototype for free user data function
+ */
+typedef void (* opj_stream_free_user_data_fn) (void * p_user_data) ;
+
+/*
+ * JPEG2000 Stream.
+ */
+typedef void * opj_stream_t;
+
+/*
+==========================================================
+ image typedef definitions
+==========================================================
+*/
+
+/**
+ * Defines a single image component
+ * */
+typedef struct opj_image_comp {
+ /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+ OPJ_UINT32 dx;
+ /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+ OPJ_UINT32 dy;
+ /** data width */
+ OPJ_UINT32 w;
+ /** data height */
+ OPJ_UINT32 h;
+ /** x component offset compared to the whole image */
+ OPJ_UINT32 x0;
+ /** y component offset compared to the whole image */
+ OPJ_UINT32 y0;
+ /** precision */
+ OPJ_UINT32 prec;
+ /** image depth in bits */
+ OPJ_UINT32 bpp;
+ /** signed (1) / unsigned (0) */
+ OPJ_UINT32 sgnd;
+ /** number of decoded resolution */
+ OPJ_UINT32 resno_decoded;
+ /** number of division by 2 of the out image compared to the original size of image */
+ OPJ_UINT32 factor;
+ /** image component data */
+ OPJ_INT32 *data;
+ /** alpha channel */
+ OPJ_UINT16 alpha;
+} opj_image_comp_t;
+
+/**
+ * Defines image data and characteristics
+ * */
+typedef struct opj_image {
+ /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
+ OPJ_UINT32 x0;
+ /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
+ OPJ_UINT32 y0;
+ /** Xsiz: width of the reference grid */
+ OPJ_UINT32 x1;
+ /** Ysiz: height of the reference grid */
+ OPJ_UINT32 y1;
+ /** number of components in the image */
+ OPJ_UINT32 numcomps;
+ /** color space: sRGB, Greyscale or YUV */
+ OPJ_COLOR_SPACE color_space;
+ /** image components */
+ opj_image_comp_t *comps;
+ /** 'restricted' ICC profile */
+ OPJ_BYTE *icc_profile_buf;
+ /** size of ICC profile */
+ OPJ_UINT32 icc_profile_len;
+
+ OPJ_INT8 useColorSpace; //liang
+} opj_image_t;
+
+
+/**
+ * Component parameters structure used by the opj_image_create function
+ * */
+typedef struct opj_image_comptparm {
+ /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+ OPJ_UINT32 dx;
+ /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+ OPJ_UINT32 dy;
+ /** data width */
+ OPJ_UINT32 w;
+ /** data height */
+ OPJ_UINT32 h;
+ /** x component offset compared to the whole image */
+ OPJ_UINT32 x0;
+ /** y component offset compared to the whole image */
+ OPJ_UINT32 y0;
+ /** precision */
+ OPJ_UINT32 prec;
+ /** image depth in bits */
+ OPJ_UINT32 bpp;
+ /** signed (1) / unsigned (0) */
+ OPJ_UINT32 sgnd;
+} opj_image_cmptparm_t;
+
+
+/*
+==========================================================
+ Information on the JPEG 2000 codestream
+==========================================================
+*/
+/* QUITE EXPERIMENTAL FOR THE MOMENT */
+
+/**
+ * Index structure : Information concerning a packet inside tile
+ * */
+typedef struct opj_packet_info {
+ /** packet start position (including SOP marker if it exists) */
+ OPJ_OFF_T start_pos;
+ /** end of packet header position (including EPH marker if it exists)*/
+ OPJ_OFF_T end_ph_pos;
+ /** packet end position */
+ OPJ_OFF_T end_pos;
+ /** packet distorsion */
+ double disto;
+} opj_packet_info_t;
+
+
+/* UniPG>> */
+/**
+ * Marker structure
+ * */
+typedef struct opj_marker_info {
+ /** marker type */
+ unsigned short int type;
+ /** position in codestream */
+ OPJ_OFF_T pos;
+ /** length, marker val included */
+ int len;
+} opj_marker_info_t;
+/* <<UniPG */
+
+/**
+ * Index structure : Information concerning tile-parts
+*/
+typedef struct opj_tp_info {
+ /** start position of tile part */
+ int tp_start_pos;
+ /** end position of tile part header */
+ int tp_end_header;
+ /** end position of tile part */
+ int tp_end_pos;
+ /** start packet of tile part */
+ int tp_start_pack;
+ /** number of packets of tile part */
+ int tp_numpacks;
+} opj_tp_info_t;
+
+/**
+ * Index structure : information regarding tiles
+*/
+typedef struct opj_tile_info {
+ /** value of thresh for each layer by tile cfr. Marcela */
+ double *thresh;
+ /** number of tile */
+ int tileno;
+ /** start position */
+ int start_pos;
+ /** end position of the header */
+ int end_header;
+ /** end position */
+ int end_pos;
+ /** precinct number for each resolution level (width) */
+ int pw[33];
+ /** precinct number for each resolution level (height) */
+ int ph[33];
+ /** precinct size (in power of 2), in X for each resolution level */
+ int pdx[33];
+ /** precinct size (in power of 2), in Y for each resolution level */
+ int pdy[33];
+ /** information concerning packets inside tile */
+ opj_packet_info_t *packet;
+ /** add fixed_quality */
+ int numpix;
+ /** add fixed_quality */
+ double distotile;
+ /** number of markers */
+ int marknum;
+ /** list of markers */
+ opj_marker_info_t *marker;
+ /** actual size of markers array */
+ int maxmarknum;
+ /** number of tile parts */
+ int num_tps;
+ /** information concerning tile parts */
+ opj_tp_info_t *tp;
+} opj_tile_info_t;
+
+/**
+ * Index structure of the codestream
+*/
+typedef struct opj_codestream_info {
+ /** maximum distortion reduction on the whole image (add for Marcela) */
+ double D_max;
+ /** packet number */
+ int packno;
+ /** writing the packet in the index with t2_encode_packets */
+ int index_write;
+ /** image width */
+ int image_w;
+ /** image height */
+ int image_h;
+ /** progression order */
+ OPJ_PROG_ORDER prog;
+ /** tile size in x */
+ int tile_x;
+ /** tile size in y */
+ int tile_y;
+ /** */
+ int tile_Ox;
+ /** */
+ int tile_Oy;
+ /** number of tiles in X */
+ int tw;
+ /** number of tiles in Y */
+ int th;
+ /** component numbers */
+ int numcomps;
+ /** number of layer */
+ int numlayers;
+ /** number of decomposition for each component */
+ int *numdecompos;
+/* UniPG>> */
+ /** number of markers */
+ int marknum;
+ /** list of markers */
+ opj_marker_info_t *marker;
+ /** actual size of markers array */
+ int maxmarknum;
+/* <<UniPG */
+ /** main header position */
+ int main_head_start;
+ /** main header position */
+ int main_head_end;
+ /** codestream's size */
+ int codestream_size;
+ /** information regarding tiles inside image */
+ opj_tile_info_t *tile;
+} opj_codestream_info_t;
+
+/* <----------------------------------------------------------- */
+/* new output managment of the codestream information and index */
+
+/**
+ * Tile-component coding parameters information
+ */
+typedef struct opj_tccp_info
+{
+ /** component index */
+ OPJ_UINT32 compno;
+ /** coding style */
+ OPJ_UINT32 csty;
+ /** number of resolutions */
+ OPJ_UINT32 numresolutions;
+ /** code-blocks width */
+ OPJ_UINT32 cblkw;
+ /** code-blocks height */
+ OPJ_UINT32 cblkh;
+ /** code-block coding style */
+ OPJ_UINT32 cblksty;
+ /** discrete wavelet transform identifier */
+ OPJ_UINT32 qmfbid;
+ /** quantisation style */
+ OPJ_UINT32 qntsty;
+ /** stepsizes used for quantization */
+ OPJ_UINT32 stepsizes_mant[OPJ_J2K_MAXBANDS];
+ /** stepsizes used for quantization */
+ OPJ_UINT32 stepsizes_expn[OPJ_J2K_MAXBANDS];
+ /** number of guard bits */
+ OPJ_UINT32 numgbits;
+ /** Region Of Interest shift */
+ OPJ_INT32 roishift;
+ /** precinct width */
+ OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+ /** precinct height */
+ OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+}
+opj_tccp_info_t;
+
+/**
+ * Tile coding parameters information
+ */
+typedef struct opj_tile_v2_info {
+
+ /** number (index) of tile */
+ int tileno;
+ /** coding style */
+ OPJ_UINT32 csty;
+ /** progression order */
+ OPJ_PROG_ORDER prg;
+ /** number of layers */
+ OPJ_UINT32 numlayers;
+ /** multi-component transform identifier */
+ OPJ_UINT32 mct;
+
+ /** information concerning tile component parameters*/
+ opj_tccp_info_t *tccp_info;
+
+} opj_tile_info_v2_t;
+
+/**
+ * Information structure about the codestream (FIXME should be expand and enhance)
+ */
+typedef struct opj_codestream_info_v2 {
+ /* Tile info */
+ /** tile origin in x = XTOsiz */
+ OPJ_UINT32 tx0;
+ /** tile origin in y = YTOsiz */
+ OPJ_UINT32 ty0;
+ /** tile size in x = XTsiz */
+ OPJ_UINT32 tdx;
+ /** tile size in y = YTsiz */
+ OPJ_UINT32 tdy;
+ /** number of tiles in X */
+ OPJ_UINT32 tw;
+ /** number of tiles in Y */
+ OPJ_UINT32 th;
+
+ /** number of components*/
+ OPJ_UINT32 nbcomps;
+
+ /** Default information regarding tiles inside image */
+ opj_tile_info_v2_t m_default_tile_info;
+
+ /** information regarding tiles inside image */
+ opj_tile_info_v2_t *tile_info; /* FIXME not used for the moment */
+
+} opj_codestream_info_v2_t;
+
+
+/**
+ * Index structure about a tile part
+ */
+typedef struct opj_tp_index {
+ /** start position */
+ OPJ_OFF_T start_pos;
+ /** end position of the header */
+ OPJ_OFF_T end_header;
+ /** end position */
+ OPJ_OFF_T end_pos;
+
+} opj_tp_index_t;
+
+/**
+ * Index structure about a tile
+ */
+typedef struct opj_tile_index {
+ /** tile index */
+ OPJ_UINT32 tileno;
+
+ /** number of tile parts */
+ OPJ_UINT32 nb_tps;
+ /** current nb of tile part (allocated)*/
+ OPJ_UINT32 current_nb_tps;
+ /** current tile-part index */
+ OPJ_UINT32 current_tpsno;
+ /** information concerning tile parts */
+ opj_tp_index_t *tp_index;
+
+ /* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+ /** number of markers */
+ OPJ_UINT32 marknum;
+ /** list of markers */
+ opj_marker_info_t *marker;
+ /** actual size of markers array */
+ OPJ_UINT32 maxmarknum;
+ /* <<UniPG */
+
+ /** packet number */
+ OPJ_UINT32 nb_packet;
+ /** information concerning packets inside tile */
+ opj_packet_info_t *packet_index;
+
+} opj_tile_index_t;
+
+/**
+ * Index structure of the codestream (FIXME should be expand and enhance)
+ */
+typedef struct opj_codestream_index {
+ /** main header start position (SOC position) */
+ OPJ_OFF_T main_head_start;
+ /** main header end position (first SOT position) */
+ OPJ_OFF_T main_head_end;
+
+ /** codestream's size */
+ OPJ_UINT64 codestream_size;
+
+/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+ /** number of markers */
+ OPJ_UINT32 marknum;
+ /** list of markers */
+ opj_marker_info_t *marker;
+ /** actual size of markers array */
+ OPJ_UINT32 maxmarknum;
+/* <<UniPG */
+
+ /** */
+ OPJ_UINT32 nb_of_tiles;
+ /** */
+ opj_tile_index_t *tile_index; /* FIXME not used for the moment */
+
+}opj_codestream_index_t;
+/* -----------------------------------------------------------> */
+
+/*
+==========================================================
+ Metadata from the JP2file
+==========================================================
+*/
+
+/**
+ * Info structure of the JP2 file
+ * EXPERIMENTAL FOR THE MOMENT
+ */
+typedef struct opj_jp2_metadata {
+ /** */
+ OPJ_INT32 not_used;
+
+} opj_jp2_metadata_t;
+
+/**
+ * Index structure of the JP2 file
+ * EXPERIMENTAL FOR THE MOMENT
+ */
+typedef struct opj_jp2_index {
+ /** */
+ OPJ_INT32 not_used;
+
+} opj_jp2_index_t;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+==========================================================
+ openjpeg version
+==========================================================
+*/
+
+/* Get the version of the openjpeg library*/
+OPJ_API const char * OPJ_CALLCONV opj_version(void);
+
+/*
+==========================================================
+ image functions definitions
+==========================================================
+*/
+
+/**
+ * Create an image
+ *
+ * @param numcmpts number of components
+ * @param cmptparms components parameters
+ * @param clrspc image color space
+ * @return returns a new image structure if successful, returns NULL otherwise
+ * */
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+
+/**
+ * Deallocate any resources associated with an image
+ *
+ * @param image image to be destroyed
+ */
+OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
+
+/**
+ * Creates an image without allocating memory for the image (used in the new version of the library).
+ *
+ * @param numcmpts the number of components
+ * @param cmptparms the components parameters
+ * @param clrspc the image color space
+ *
+ * @return a new image structure if successful, NULL otherwise.
+*/
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+
+/*
+==========================================================
+ stream functions definitions
+==========================================================
+*/
+
+/**
+ * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
+ *
+ * @param p_is_input if set to true then the stream will be an input stream, an output stream else.
+ *
+ * @return a stream object.
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL p_is_input);
+
+/**
+ * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
+ *
+ * @param p_buffer_size FIXME DOC
+ * @param p_is_input if set to true then the stream will be an input stream, an output stream else.
+ *
+ * @return a stream object.
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_input);
+
+/**
+ * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. If needed the user must
+ * close its own implementation of the stream.
+ *
+ * @param p_stream the stream to destroy.
+ */
+OPJ_API void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream);
+
+/**
+ * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream.
+ * If needed the user must close its own implementation of the stream.
+ *
+ * @param p_stream the stream to destroy.
+ */
+OPJ_API void OPJ_CALLCONV opj_stream_destroy_v3(opj_stream_t* p_stream);
+
+/**
+ * Sets the given function to be used as a read function.
+ * @param p_stream the stream to modify
+ * @param p_function the function to use a read function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function);
+
+/**
+ * Sets the given function to be used as a write function.
+ * @param p_stream the stream to modify
+ * @param p_function the function to use a write function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function);
+
+/**
+ * Sets the given function to be used as a skip function.
+ * @param p_stream the stream to modify
+ * @param p_function the function to use a skip function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function);
+
+/**
+ * Sets the given function to be used as a seek function, the stream is then seekable.
+ * @param p_stream the stream to modify
+ * @param p_function the function to use a skip function.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function);
+
+/**
+ * Sets the given data to be used as a user data for the stream.
+ * @param p_stream the stream to modify
+ * @param p_data the data to set.
+ * @warning depending on your source object p_stream this function may leak, use opj_stream_set_user_data_v3
+*/
+OPJ_DEPRECATED(OPJ_API void OPJ_CALLCONV opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data));
+
+/**
+ * Sets the given data to be used as a user data for the stream.
+ * @param p_stream the stream to modify
+ * @param p_data the data to set.
+ * @param p_function the function to free p_data when opj_stream_destroy() is called.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_v3 (opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function);
+
+/**
+ * Sets the length of the user data for the stream.
+ *
+ * @param p_stream the stream to modify
+ * @param data_length length of the user_data.
+*/
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length);
+
+/**
+ * Create a stream from a file identified with its filename with default parameters (helper function)
+ * @param fname the filename of the file to stream
+ * @param p_is_read_stream whether the stream is a read stream (true) or not (false)
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream_v3 (const char *fname, OPJ_BOOL p_is_read_stream);
+
+/** Create a stream from a file identified with its filename with a specific buffer size
+ * @param fname the filename of the file to stream
+ * @param p_buffer_size size of the chunk used to stream
+ * @param p_is_read_stream whether the stream is a read stream (true) or not (false)
+*/
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream_v3 (const char *fname,
+ OPJ_SIZE_T p_buffer_size,
+ OPJ_BOOL p_is_read_stream);
+
+/*
+==========================================================
+ event manager functions definitions
+==========================================================
+*/
+/**
+ * Set the info handler use by openjpeg.
+ * @param p_codec the codec previously initialise
+ * @param p_callback the callback function which will be used
+ * @param p_user_data client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data);
+/**
+ * Set the warning handler use by openjpeg.
+ * @param p_codec the codec previously initialise
+ * @param p_callback the callback function which will be used
+ * @param p_user_data client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data);
+/**
+ * Set the error handler use by openjpeg.
+ * @param p_codec the codec previously initialise
+ * @param p_callback the callback function which will be used
+ * @param p_user_data client object where will be returned the message
+*/
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
+ opj_msg_callback p_callback,
+ void * p_user_data);
+
+/*
+==========================================================
+ codec functions definitions
+==========================================================
+*/
+
+/**
+ * Creates a J2K/JP2 decompression structure
+ * @param format Decoder to select
+ *
+ * @return Returns a handle to a decompressor if successful, returns NULL otherwise
+ * */
+OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
+
+/**
+ * Destroy a decompressor handle
+ *
+ * @param p_codec decompressor handle to destroy
+ */
+OPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec);
+
+/**
+ * Read after the codestream if necessary
+ * @param p_codec the JPEG2000 codec to read.
+ * @param p_stream the JPEG2000 stream.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress ( opj_codec_t *p_codec,
+ opj_stream_t *p_stream);
+
+
+/**
+ * Set decoding parameters to default values
+ * @param parameters Decompression parameters
+ */
+OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+
+/**
+ * Setup the decoder with decompression parameters provided by the user and with the message handler
+ * provided by the user.
+ *
+ * @param p_codec decompressor handler
+ * @param parameters decompression parameters
+ *
+ * @return true if the decoder is correctly set
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
+ opj_dparameters_t *parameters );
+
+/**
+ * Decodes an image header.
+ *
+ * @param p_stream the jpeg2000 stream.
+ * @param p_codec the jpeg2000 codec to read.
+ * @param p_image the image structure initialized with the characteristics of encoded image.
+ *
+ * @return true if the main header of the codestream and the JP2 header is correctly read.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header ( opj_stream_t *p_stream,
+ opj_codec_t *p_codec,
+ opj_image_t **p_image);
+
+/**
+ * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param p_image the decoded image previously setted by opj_read_header
+ * @param p_start_x the left position of the rectangle to decode (in image coordinates).
+ * @param p_end_x the right position of the rectangle to decode (in image coordinates).
+ * @param p_start_y the up position of the rectangle to decode (in image coordinates).
+ * @param p_end_y the bottom position of the rectangle to decode (in image coordinates).
+ *
+ * @return true if the area could be set.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decode_area( opj_codec_t *p_codec,
+ opj_image_t* p_image,
+ OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_x, OPJ_INT32 p_end_y );
+
+/**
+ * Decode an image from a JPEG-2000 codestream
+ *
+ * @param p_decompressor decompressor handle
+ * @param p_stream Input buffer stream
+ * @param p_image the decoded image
+ * @return true if success, otherwise false
+ * */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode( opj_codec_t *p_decompressor,
+ opj_stream_t *p_stream,
+ opj_image_t *p_image);
+
+/**
+ * Get the decoded tile from the codec
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param p_stream input streamm
+ * @param p_image output image
+ * @param tile_index index of the tile which will be decode
+ *
+ * @return true if success, otherwise false
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile( opj_codec_t *p_codec,
+ opj_stream_t *p_stream,
+ opj_image_t *p_image,
+ OPJ_UINT32 tile_index);
+
+/**
+ * Set the resolution factor of the decoded image
+ * @param p_codec the jpeg2000 codec.
+ * @param res_factor resolution factor to set
+ *
+ * @return true if success, otherwise false
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, OPJ_UINT32 res_factor);
+
+/**
+ * Writes a tile with the given data.
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param p_tile_index the index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence.
+ * @param p_data pointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set.
+ * @param p_data_size this value os used to make sure the data being written is correct. The size must be equal to the sum for each component of
+ * tile_width * tile_height * component_size. component_size can be 1,2 or 4 bytes, depending on the precision of the given component.
+ * @param p_stream the stream to write data to.
+ *
+ * @return true if the data could be written.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_write_tile ( opj_codec_t *p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_t *p_stream );
+
+/**
+ * Reads a tile header. This function is compulsory and allows one to know the size of the tile thta will be decoded.
+ * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param p_tile_index pointer to a value that will hold the index of the tile being decoded, in case of success.
+ * @param p_data_size pointer to a value that will hold the maximum size of the decoded data, in case of success. In case
+ * of truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same
+ * as depicted in opj_write_tile.
+ * @param p_tile_x0 pointer to a value that will hold the x0 pos of the tile (in the image).
+ * @param p_tile_y0 pointer to a value that will hold the y0 pos of the tile (in the image).
+ * @param p_tile_x1 pointer to a value that will hold the x1 pos of the tile (in the image).
+ * @param p_tile_y1 pointer to a value that will hold the y1 pos of the tile (in the image).
+ * @param p_nb_comps pointer to a value that will hold the number of components in the tile.
+ * @param p_should_go_on pointer to a boolean that will hold the fact that the decoding should go on. In case the
+ * codestream is over at the time of the call, the value will be set to false. The user should then stop
+ * the decoding.
+ * @param p_stream the stream to decode.
+ * @return true if the tile header could be decoded. In case the decoding should end, the returned value is still true.
+ * returning false may be the result of a shortage of memory or an internal error.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_tile_header( opj_codec_t *p_codec,
+ opj_stream_t * p_stream,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_should_go_on );
+
+/**
+ * Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.
+ * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param p_tile_index the index of the tile being decoded, this should be the value set by opj_read_tile_header.
+ * @param p_data pointer to a memory block that will hold the decoded data.
+ * @param p_data_size size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
+ * @param p_stream the stream to decode.
+ *
+ * @return true if the data could be decoded.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data( opj_codec_t *p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ opj_stream_t *p_stream );
+
+/* COMPRESSION FUNCTIONS*/
+
+/**
+ * Creates a J2K/JP2 compression structure
+ * @param format Coder to select
+ * @return Returns a handle to a compressor if successful, returns NULL otherwise
+ */
+OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
+
+/**
+Set encoding parameters to default values, that means :
+<ul>
+<li>Lossless
+<li>1 tile
+<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
+<li>Size of code-block : 64 x 64
+<li>Number of resolutions: 6
+<li>No SOP marker in the codestream
+<li>No EPH marker in the codestream
+<li>No sub-sampling in x or y direction
+<li>No mode switch activated
+<li>Progression order: LRCP
+<li>No index file
+<li>No ROI upshifted
+<li>No offset of the origin of the image
+<li>No offset of the origin of the tiles
+<li>Reversible DWT 5-3
+</ul>
+@param parameters Compression parameters
+*/
+OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+
+/**
+ * Setup the encoder parameters using the current image and using user parameters.
+ * @param p_codec Compressor handle
+ * @param parameters Compression parameters
+ * @param image Input filled image
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec,
+ opj_cparameters_t *parameters,
+ opj_image_t *image);
+
+/**
+ * Start to compress the current image.
+ * @param p_codec Compressor handle
+ * @param image Input filled image
+ * @param p_stream Input stgream
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress ( opj_codec_t *p_codec,
+ opj_image_t * p_image,
+ opj_stream_t *p_stream);
+
+/**
+ * End to compress the current image.
+ * @param p_codec Compressor handle
+ * @param p_stream Input stgream
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
+ opj_stream_t *p_stream);
+
+/**
+ * Encode an image into a JPEG-2000 codestream
+ * @param p_codec compressor handle
+ * @param p_stream Output buffer stream
+ *
+ * @return Returns true if successful, returns false otherwise
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_codec,
+ opj_stream_t *p_stream);
+/*
+==========================================================
+ codec output functions definitions
+==========================================================
+*/
+/* EXPERIMENTAL FUNCTIONS FOR NOW, USED ONLY IN J2K_DUMP*/
+
+/**
+Destroy Codestream information after compression or decompression
+@param cstr_info Codestream information structure
+*/
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info);
+
+
+/**
+ * Dump the codec information into the output stream
+ *
+ * @param p_codec the jpeg2000 codec.
+ * @param info_flag type of information dump.
+ * @param output_stream output stream where dump the informations get from the codec.
+ *
+ */
+OPJ_API void OPJ_CALLCONV opj_dump_codec( opj_codec_t *p_codec,
+ OPJ_INT32 info_flag,
+ FILE* output_stream);
+
+/**
+ * Get the codestream information from the codec
+ *
+ * @param p_codec the jpeg2000 codec.
+ *
+ * @return a pointer to a codestream information structure.
+ *
+ */
+OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec);
+
+/**
+ * Get the codestream index from the codec
+ *
+ * @param p_codec the jpeg2000 codec.
+ *
+ * @return a pointer to a codestream index structure.
+ *
+ */
+OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec);
+
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index);
+
+
+/**
+ * Get the JP2 file information from the codec FIXME
+ *
+ * @param p_codec the jpeg2000 codec.
+ *
+ * @return a pointer to a JP2 metadata structure.
+ *
+ */
+OPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(opj_codec_t *p_codec);
+
+/**
+ * Get the JP2 file index from the codec FIXME
+ *
+ * @param p_codec the jpeg2000 codec.
+ *
+ * @return a pointer to a JP2 index structure.
+ *
+ */
+OPJ_API opj_jp2_index_t* OPJ_CALLCONV opj_get_jp2_index(opj_codec_t *p_codec);
+
+
+/*
+==========================================================
+ MCT functions
+==========================================================
+*/
+
+/**
+ * Sets the MCT matrix to use.
+ *
+ * @param parameters the parameters to change.
+ * @param pEncodingMatrix the encoding matrix.
+ * @param p_dc_shift the dc shift coefficients to use.
+ * @param pNbComp the number of components of the image.
+ *
+ * @return true if the parameters could be set.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters,
+ OPJ_FLOAT32 * pEncodingMatrix,
+ OPJ_INT32 * p_dc_shift,
+ OPJ_UINT32 pNbComp);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPENJPEG_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c
new file mode 100644
index 0000000000..0df99ef04d
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.c
@@ -0,0 +1,64 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/times.h>
+#endif /* _WIN32 */
+#include "opj_includes.h"
+
+OPJ_FLOAT64 opj_clock(void) {
+#ifdef _WIN32
+ /* _WIN32: use QueryPerformance (very accurate) */
+ LARGE_INTEGER freq , t ;
+ /* freq is the clock speed of the CPU */
+ QueryPerformanceFrequency(&freq) ;
+ /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
+ /* t is the high resolution performance counter (see MSDN) */
+ QueryPerformanceCounter ( & t ) ;
+ return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ;
+#else
+ /* Unix or Linux: use resource usage */
+ struct rusage t;
+ OPJ_FLOAT64 procTime;
+ /* (1) Get the rusage data structure at this moment (man getrusage) */
+ getrusage(0,&t);
+ /* (2) What is the elapsed time ? - CPU time = User time + System time */
+ /* (2a) Get the seconds */
+ procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
+ /* (2b) More precisely! Get the microseconds part ! */
+ return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
+#endif
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h
new file mode 100644
index 0000000000..6f5168b572
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_clock.h
@@ -0,0 +1,59 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_CLOCK_H
+#define __OPJ_CLOCK_H
+/**
+@file opj_clock.h
+@brief Internal function for timing
+
+The functions in OPJ_CLOCK.C are internal utilities mainly used for timing.
+*/
+
+/** @defgroup MISC MISC - Miscellaneous internal functions */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Difference in successive opj_clock() calls tells you the elapsed time
+@return Returns time in seconds
+*/
+OPJ_FLOAT64 opj_clock(void);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __OPJ_CLOCK_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h
new file mode 100644
index 0000000000..4fdfa7d8b9
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_codec.h
@@ -0,0 +1,165 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_CODEC_H
+#define __OPJ_CODEC_H
+/**
+@file opj_codec.h
+*/
+
+
+/**
+ * Main codec handler used for compression or decompression.
+ */
+typedef struct opj_codec_private
+{
+ /** FIXME DOC */
+ union
+ {
+ /**
+ * Decompression handler.
+ */
+ struct opj_decompression
+ {
+ /** Main header reading function handler */
+ OPJ_BOOL (*opj_read_header) ( struct opj_stream_private * cio,
+ void * p_codec,
+ opj_image_t **p_image,
+ struct opj_event_mgr * p_manager);
+
+ /** Decoding function */
+ OPJ_BOOL (*opj_decode) ( void * p_codec,
+ struct opj_stream_private * p_cio,
+ opj_image_t * p_image,
+ struct opj_event_mgr * p_manager);
+
+ /** FIXME DOC */
+ OPJ_BOOL (*opj_read_tile_header)( void * p_codec,
+ OPJ_UINT32 * p_tile_index,
+ OPJ_UINT32 * p_data_size,
+ OPJ_INT32 * p_tile_x0,
+ OPJ_INT32 * p_tile_y0,
+ OPJ_INT32 * p_tile_x1,
+ OPJ_INT32 * p_tile_y1,
+ OPJ_UINT32 * p_nb_comps,
+ OPJ_BOOL * p_should_go_on,
+ struct opj_stream_private * p_cio,
+ struct opj_event_mgr * p_manager);
+
+ /** FIXME DOC */
+ OPJ_BOOL (*opj_decode_tile_data)( void * p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ struct opj_stream_private * p_cio,
+ struct opj_event_mgr * p_manager);
+
+ /** Reading function used after codestream if necessary */
+ OPJ_BOOL (* opj_end_decompress) ( void *p_codec,
+ struct opj_stream_private * cio,
+ struct opj_event_mgr * p_manager);
+
+ /** Codec destroy function handler */
+ void (*opj_destroy) (void * p_codec);
+
+ /** Setup decoder function handler */
+ void (*opj_setup_decoder) ( void * p_codec, opj_dparameters_t * p_param);
+
+ /** Set decode area function handler */
+ OPJ_BOOL (*opj_set_decode_area) ( void * p_codec,
+ opj_image_t * p_image,
+ OPJ_INT32 p_start_x,
+ OPJ_INT32 p_end_x,
+ OPJ_INT32 p_start_y,
+ OPJ_INT32 p_end_y,
+ struct opj_event_mgr * p_manager);
+
+ /** Get tile function */
+ OPJ_BOOL (*opj_get_decoded_tile) ( void *p_codec,
+ opj_stream_private_t * p_cio,
+ opj_image_t *p_image,
+ struct opj_event_mgr * p_manager,
+ OPJ_UINT32 tile_index);
+
+ /** Set the decoded resolution factor */
+ OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,
+ OPJ_UINT32 res_factor,
+ opj_event_mgr_t * p_manager);
+ } m_decompression;
+
+ /**
+ * Compression handler. FIXME DOC
+ */
+ struct opj_compression
+ {
+ OPJ_BOOL (* opj_start_compress) ( void *p_codec,
+ struct opj_stream_private * cio,
+ struct opj_image * p_image,
+ struct opj_event_mgr * p_manager);
+
+ OPJ_BOOL (* opj_encode) ( void * p_codec,
+ struct opj_stream_private *p_cio,
+ struct opj_event_mgr * p_manager);
+
+ OPJ_BOOL (* opj_write_tile) ( void * p_codec,
+ OPJ_UINT32 p_tile_index,
+ OPJ_BYTE * p_data,
+ OPJ_UINT32 p_data_size,
+ struct opj_stream_private * p_cio,
+ struct opj_event_mgr * p_manager);
+
+ OPJ_BOOL (* opj_end_compress) ( void * p_codec,
+ struct opj_stream_private * p_cio,
+ struct opj_event_mgr * p_manager);
+
+ void (* opj_destroy) (void * p_codec);
+
+ void (* opj_setup_encoder) ( void * p_codec,
+ opj_cparameters_t * p_param,
+ struct opj_image * p_image,
+ struct opj_event_mgr * p_manager);
+ } m_compression;
+ } m_codec_data;
+ /** FIXME DOC*/
+ void * m_codec;
+ /** Event handler */
+ opj_event_mgr_t m_event_mgr;
+ /** Flag to indicate if the codec is used to decode or encode*/
+ OPJ_BOOL is_decompressor;
+ void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);
+ opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);
+ opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);
+}
+opj_codec_private_t;
+
+
+#endif /* __OPJ_CODEC_H */
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h
new file mode 100644
index 0000000000..2f91e850a1
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h
@@ -0,0 +1,2 @@
+/* create opj_config.h for CMake */
+#define OPJ_HAVE_STDINT_H 1
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in
new file mode 100644
index 0000000000..2f5311b87c
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config.h.cmake.in
@@ -0,0 +1,2 @@
+/* create opj_config.h for CMake */
+#cmakedefine OPJ_HAVE_STDINT_H @OPJ_HAVE_STDINT_H@
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h
new file mode 100644
index 0000000000..37077fc961
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_config_private.h
@@ -0,0 +1,43 @@
+/* create opj_config_private.h for CMake */
+/* #undef OPJ_HAVE_INTTYPES_H */
+
+#ifndef _WIN32
+#ifndef OPJ_HAVE_INTTYPES_H
+#define OPJ_HAVE_INTTYPES_H
+#endif
+#endif
+
+#define OPJ_PACKAGE_VERSION "2.1.0"
+
+/* Not used by openjp2*/
+/*#define HAVE_MEMORY_H 1*/
+/*#define HAVE_STDLIB_H 1*/
+/* #undef HAVE_STRINGS_H */
+/*#define HAVE_STRING_H 1*/
+/*#define HAVE_SYS_STAT_H 1*/
+/*#define HAVE_SYS_TYPES_H 1 */
+/* #undef HAVE_UNISTD_H */
+
+/* #undef _LARGEFILE_SOURCE */
+/* #undef _LARGE_FILES */
+/* #undef _FILE_OFFSET_BITS */
+/* #undef OPJ_HAVE_FSEEKO */
+
+#ifndef _WIN32
+#ifndef OPJ_HAVE_FSEEKO
+#define OPJ_HAVE_FSEEKO
+#endif
+#endif
+
+/* Byte order. */
+/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or
+__LITTLE_ENDIAN__ to match the endianness of the architecture being
+compiled for. This is not necessarily the same as the architecture of the
+machine doing the building. In order to support Universal Binaries on
+Mac OS X, we prefer those defines to decide the endianness.
+On other platforms we use the result of the TRY_RUN. */
+#if !defined(__APPLE__)
+/* #undef OPJ_BIG_ENDIAN */
+#elif defined(__BIG_ENDIAN__)
+# define OPJ_BIG_ENDIAN
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h
new file mode 100644
index 0000000000..d9238b1bfd
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_includes.h
@@ -0,0 +1,180 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_INCLUDES_H
+#define OPJ_INCLUDES_H
+
+/*
+ * This must be included before any system headers,
+ * since they can react to macro defined there
+ */
+#include "opj_config_private.h"
+
+/*
+ ==========================================================
+ Standard includes used by the library
+ ==========================================================
+*/
+#include <memory.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+#include <assert.h>
+
+/*
+ Use fseeko() and ftello() if they are available since they use
+ 'off_t' rather than 'long'. It is wrong to use fseeko() and
+ ftello() only on systems with special LFS support since some systems
+ (e.g. FreeBSD) support a 64-bit off_t by default.
+*/
+#if defined(OPJ_HAVE_FSEEKO) && !defined(fseek)
+# define fseek fseeko
+# define ftell ftello
+#endif
+
+
+#if defined(WIN32) && !defined(Windows95) && !defined(__BORLANDC__) && \
+ !(defined(_MSC_VER) && _MSC_VER < 1400) && \
+ !(defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x800)
+ /*
+ Windows '95 and Borland C do not support _lseeki64
+ Visual Studio does not support _fseeki64 and _ftelli64 until the 2005 release.
+ Without these interfaces, files over 2GB in size are not supported for Windows.
+ */
+# define OPJ_FSEEK(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
+# define OPJ_FSTAT(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
+# define OPJ_FTELL(stream) /* __int64 */ _ftelli64(stream)
+# define OPJ_STAT_STRUCT_T struct _stati64
+# define OPJ_STAT(path,stat_buff) _stati64(path,/* struct _stati64 */ stat_buff)
+#else
+# define OPJ_FSEEK(stream,offset,whence) fseek(stream,offset,whence)
+# define OPJ_FSTAT(fildes,stat_buff) fstat(fildes,stat_buff)
+# define OPJ_FTELL(stream) ftell(stream)
+# define OPJ_STAT_STRUCT_T struct stat
+# define OPJ_STAT(path,stat_buff) stat(path,stat_buff)
+#endif
+
+
+/*
+ ==========================================================
+ OpenJPEG interface
+ ==========================================================
+ */
+#include "openjpeg.h"
+
+/*
+ ==========================================================
+ OpenJPEG modules
+ ==========================================================
+*/
+
+/* Ignore GCC attributes if this is not GCC */
+#ifndef __GNUC__
+ #define __attribute__(x) /* __attribute__(x) */
+#endif
+
+
+/* Are restricted pointers available? (C99) */
+#if (__STDC_VERSION__ != 199901L)
+ /* Not a C99 compiler */
+ #ifdef __GNUC__
+ #define restrict __restrict__
+ #else
+ #define restrict /* restrict */
+ #endif
+#endif
+
+/* MSVC before 2013 and Borland C do not have lrintf */
+#if defined(_MSC_VER) && (_MSC_VER < 1800) || defined(__BORLANDC__)
+static INLINE long lrintf(float f){
+#ifdef _M_X64
+ return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
+#else
+ int i;
+
+ _asm{
+ fld f
+ fistp i
+ };
+
+ return i;
+#endif
+}
+#endif
+
+#include "opj_inttypes.h"
+#include "opj_clock.h"
+#include "opj_malloc.h"
+#include "function_list.h"
+#include "event.h"
+#include "bio.h"
+#include "cio.h"
+
+#include "image.h"
+#include "invert.h"
+#include "j2k.h"
+#include "jp2.h"
+
+#include "mqc.h"
+#include "raw.h"
+#include "bio.h"
+
+#include "pi.h"
+#include "tgt.h"
+#include "tcd.h"
+#include "t1.h"
+#include "dwt.h"
+#include "t2.h"
+#include "mct.h"
+#include "opj_intmath.h"
+
+#ifdef USE_JPIP
+#include "cidx_manager.h"
+#include "indexbox_manager.h"
+#endif
+
+/* JPWL>> */
+#ifdef USE_JPWL
+#include "openjpwl/jpwl.h"
+#endif /* USE_JPWL */
+/* <<JPWL */
+
+/* V2 */
+#include "opj_codec.h"
+
+
+#endif /* OPJ_INCLUDES_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h
new file mode 100644
index 0000000000..dc89895301
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_intmath.h
@@ -0,0 +1,178 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __INT_H
+#define __INT_H
+/**
+@file opj_intmath.h
+@brief Implementation of operations on integers (INT)
+
+The functions in OPJ_INTMATH.H have for goal to realize operations on integers.
+*/
+
+/** @defgroup OPJ_INTMATH OPJ_INTMATH - Implementation of operations on integers */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Get the minimum of two integers
+@return Returns a if a < b else b
+*/
+static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {
+ return a < b ? a : b;
+}
+
+/**
+Get the minimum of two integers
+@return Returns a if a < b else b
+*/
+static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
+ return a < b ? a : b;
+}
+
+/**
+Get the maximum of two integers
+@return Returns a if a > b else b
+*/
+static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
+ return (a > b) ? a : b;
+}
+
+/**
+Get the maximum of two integers
+@return Returns a if a > b else b
+*/
+static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32 a, OPJ_UINT32 b) {
+ return (a > b) ? a : b;
+}
+
+/**
+Clamp an integer inside an interval
+@return
+<ul>
+<li>Returns a if (min < a < max)
+<li>Returns max if (a > max)
+<li>Returns min if (a < min)
+</ul>
+*/
+static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
+ if (a < min)
+ return min;
+ if (a > max)
+ return max;
+ return a;
+}
+/**
+@return Get absolute value of integer
+*/
+static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
+ return a < 0 ? -a : a;
+}
+/**
+Divide an integer and round upwards
+@return Returns a divided by b
+*/
+static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
+ assert(b);
+ return (a + b - 1) / b;
+}
+
+/**
+Divide an integer and round upwards
+@return Returns a divided by b
+*/
+static INLINE OPJ_UINT32 opj_uint_ceildiv(OPJ_UINT32 a, OPJ_UINT32 b) {
+ return (a + b - 1) / b;
+}
+
+/**
+Divide an integer by a power of 2 and round upwards
+@return Returns a divided by 2^b
+*/
+static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
+ return (OPJ_INT32)((a + (OPJ_INT64)(1 << b) - 1) >> b);
+}
+/**
+Divide an integer by a power of 2 and round downwards
+@return Returns a divided by 2^b
+*/
+static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
+ return a >> b;
+}
+/**
+Get logarithm of an integer and round downwards
+@return Returns log2(a)
+*/
+static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
+ OPJ_INT32 l;
+ for (l = 0; a > 1; l++) {
+ a >>= 1;
+ }
+ return l;
+}
+/**
+Get logarithm of an integer and round downwards
+@return Returns log2(a)
+*/
+static INLINE OPJ_UINT32 opj_uint_floorlog2(OPJ_UINT32 a) {
+ OPJ_UINT32 l;
+ for (l = 0; a > 1; ++l)
+ {
+ a >>= 1;
+ }
+ return l;
+}
+
+/**
+Multiply two fixed-precision rational numbers.
+@param a
+@param b
+@return Returns a * b
+*/
+static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
+ OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
+ temp += temp & 4096;
+ return (OPJ_INT32) (temp >> 13) ;
+}
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h
new file mode 100644
index 0000000000..e74aed6a17
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_inttypes.h
@@ -0,0 +1,48 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_INTTYPES_H
+#define OPJ_INTTYPES_H
+
+#include "opj_config_private.h"
+#ifdef OPJ_HAVE_INTTYPES_H
+#include <inttypes.h>
+#else
+#if defined(_WIN32)
+#define PRId64 "I64d"
+#define PRIi64 "I64i"
+#define PRIu64 "I64u"
+#define PRIx64 "I64x"
+#else
+#error unsupported platform
+#endif
+#endif
+
+#endif /* OPJ_INTTYPES_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h
new file mode 100644
index 0000000000..ed1dfaf983
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_malloc.h
@@ -0,0 +1,194 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __OPJ_MALLOC_H
+#define __OPJ_MALLOC_H
+/**
+@file opj_malloc.h
+@brief Internal functions
+
+The functions in opj_malloc.h are internal utilities used for memory management.
+*/
+
+/** @defgroup MISC MISC - Miscellaneous internal functions */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Allocate an uninitialized memory block
+@param size Bytes to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+#define _FOXIT_MEM_MANAGER_
+#ifdef _FOXIT_MEM_MANAGER_
+void* opj_malloc(size_t size);
+void* opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
+void* opj_realloc(void * m, size_t s);
+void opj_free(void * m);
+
+#define opj_aligned_malloc(size) opj_malloc(size)
+#define opj_aligned_free(m) opj_free(m)
+#else
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_malloc(size_t size);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_malloc(size) ((size_t)(size) >= (size_t)-0x100 ? NULL : malloc(size))
+#else
+#define opj_malloc(size) malloc(size)
+#endif
+#endif
+
+/**
+Allocate a memory block with elements initialized to 0
+@param num Blocks to allocate
+@param size Bytes per block to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_calloc(num, size) ((size_t)(num) != 0 && (size_t)(num) >= (size_t)-0x100 / (size_t)(size) ? NULL : calloc(num, size))
+#else
+#define opj_calloc(num, size) calloc(num, size)
+#endif
+#endif
+
+/**
+Allocate memory aligned to a 16 byte boundry
+@param size Bytes to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
+#ifdef _WIN32
+ /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
+ #ifdef __GNUC__
+ #include <mm_malloc.h>
+ #define HAVE_MM_MALLOC
+ #else /* MSVC, Intel C++ */
+ #include <malloc.h>
+ #ifdef _mm_malloc
+ #define HAVE_MM_MALLOC
+ #endif
+ #endif
+#else /* Not _WIN32 */
+ #if defined(__sun)
+ #define HAVE_MEMALIGN
+ #elif defined(__FreeBSD__)
+ #define HAVE_POSIX_MEMALIGN
+ /* Linux x86_64 and OSX always align allocations to 16 bytes */
+ #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
+ #define HAVE_MEMALIGN
+ #include <malloc.h>
+ #endif
+#endif
+
+#define opj_aligned_malloc(size) malloc(size)
+#define opj_aligned_free(m) free(m)
+
+#ifdef HAVE_MM_MALLOC
+ #undef opj_aligned_malloc
+ #define opj_aligned_malloc(size) _mm_malloc(size, 16)
+ #undef opj_aligned_free
+ #define opj_aligned_free(m) _mm_free(m)
+#endif
+
+#ifdef HAVE_MEMALIGN
+ extern void* memalign(size_t, size_t);
+ #undef opj_aligned_malloc
+ #define opj_aligned_malloc(size) memalign(16, (size))
+ #undef opj_aligned_free
+ #define opj_aligned_free(m) free(m)
+#endif
+
+#ifdef HAVE_POSIX_MEMALIGN
+ #undef opj_aligned_malloc
+ extern int posix_memalign(void**, size_t, size_t);
+
+ static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
+ void* mem = NULL;
+ posix_memalign(&mem, 16, size);
+ return mem;
+ }
+ #undef opj_aligned_free
+ #define opj_aligned_free(m) free(m)
+#endif
+
+#ifdef ALLOC_PERF_OPT
+ #undef opj_aligned_malloc
+ #define opj_aligned_malloc(size) opj_malloc(size)
+ #undef opj_aligned_free
+ #define opj_aligned_free(m) opj_free(m)
+#endif
+
+/**
+Reallocate memory blocks.
+@param m Pointer to previously allocated memory block
+@param s New size in bytes
+@return Returns a void pointer to the reallocated (and possibly moved) memory block
+*/
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
+#else
+/* prevent assertion on overflow for MSVC */
+#ifdef _MSC_VER
+#define opj_realloc(m, s) ((size_t)(s) >= (size_t)-0x100 ? NULL : realloc(m, s))
+#else
+#define opj_realloc(m, s) realloc(m, s)
+#endif
+#endif
+
+/**
+Deallocates or frees a memory block.
+@param m Previously allocated memory block to be freed
+*/
+#ifdef ALLOC_PERF_OPT
+void OPJ_CALLCONV opj_free(void * m);
+#else
+#define opj_free(m) free(m)
+#endif
+
+#ifdef __GNUC__
+#pragma GCC poison malloc calloc realloc free
+#endif
+#endif
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __OPJ_MALLOC_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h
new file mode 100644
index 0000000000..b8556a1938
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/opj_stdint.h
@@ -0,0 +1,52 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2012, Mathieu Malaterre <mathieu.malaterre@gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_STDINT_H
+#define OPJ_STDINT_H
+
+#include "opj_config.h"
+#ifdef OPJ_HAVE_STDINT_H
+#include <stdint.h>
+#else
+#if defined(_WIN32)
+typedef signed __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef signed __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef signed __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef signed __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+#error unsupported platform
+#endif
+#endif
+
+#endif /* OPJ_STDINT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c
new file mode 100644
index 0000000000..02bbefeef9
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.c
@@ -0,0 +1,1876 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Get next packet in layer-resolution-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-layer-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-precinct-component-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi);
+/**
+Get next packet in precinct-component-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi);
+/**
+Get next packet in component-precinct-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true
+*/
+static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi);
+
+/**
+ * Updates the coding parameters if the encoding is used with Progression order changes and final (or cinema parameters are used).
+ *
+ * @param p_cp the coding parameters to modify
+ * @param p_tileno the tile index being concerned.
+ * @param p_tx0 X0 parameter for the tile
+ * @param p_tx1 X1 parameter for the tile
+ * @param p_ty0 Y0 parameter for the tile
+ * @param p_ty1 Y1 parameter for the tile
+ * @param p_max_prec the maximum precision for all the bands of the tile
+ * @param p_max_res the maximum number of resolutions for all the poc inside the tile.
+ * @param p_dx_min the minimum dx of all the components of all the resolutions for the tile.
+ * @param p_dy_min the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,
+ OPJ_UINT32 p_tileno,
+ OPJ_INT32 p_tx0,
+ OPJ_INT32 p_tx1,
+ OPJ_INT32 p_ty0,
+ OPJ_INT32 p_ty1,
+ OPJ_UINT32 p_max_prec,
+ OPJ_UINT32 p_max_res,
+ OPJ_UINT32 p_dx_min,
+ OPJ_UINT32 p_dy_min);
+
+/**
+ * Updates the coding parameters if the encoding is not used with Progression order changes and final (and cinema parameters are used).
+ *
+ * @param p_cp the coding parameters to modify
+ * @param p_num_comps the number of components
+ * @param p_tileno the tile index being concerned.
+ * @param p_tx0 X0 parameter for the tile
+ * @param p_tx1 X1 parameter for the tile
+ * @param p_ty0 Y0 parameter for the tile
+ * @param p_ty1 Y1 parameter for the tile
+ * @param p_max_prec the maximum precision for all the bands of the tile
+ * @param p_max_res the maximum number of resolutions for all the poc inside the tile.
+ * @param p_dx_min the minimum dx of all the components of all the resolutions for the tile.
+ * @param p_dy_min the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_pi_update_encode_not_poc ( opj_cp_t *p_cp,
+ OPJ_UINT32 p_num_comps,
+ OPJ_UINT32 p_tileno,
+ OPJ_INT32 p_tx0,
+ OPJ_INT32 p_tx1,
+ OPJ_INT32 p_ty0,
+ OPJ_INT32 p_ty1,
+ OPJ_UINT32 p_max_prec,
+ OPJ_UINT32 p_max_res,
+ OPJ_UINT32 p_dx_min,
+ OPJ_UINT32 p_dy_min);
+/**
+ * Gets the encoding parameters needed to update the coding parameters and all the pocs.
+ *
+ * @param p_image the image being encoded.
+ * @param p_cp the coding parameters.
+ * @param tileno the tile index of the tile being encoded.
+ * @param p_tx0 pointer that will hold the X0 parameter for the tile
+ * @param p_tx1 pointer that will hold the X1 parameter for the tile
+ * @param p_ty0 pointer that will hold the Y0 parameter for the tile
+ * @param p_ty1 pointer that will hold the Y1 parameter for the tile
+ * @param p_max_prec pointer that will hold the the maximum precision for all the bands of the tile
+ * @param p_max_res pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
+ * @param p_dx_min pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
+ * @param p_dy_min pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
+ */
+static void opj_get_encoding_parameters(const opj_image_t *p_image,
+ const opj_cp_t *p_cp,
+ OPJ_UINT32 tileno,
+ OPJ_INT32 * p_tx0,
+ OPJ_INT32 * p_tx1,
+ OPJ_INT32 * p_ty0,
+ OPJ_INT32 * p_ty1,
+ OPJ_UINT32 * p_dx_min,
+ OPJ_UINT32 * p_dy_min,
+ OPJ_UINT32 * p_max_prec,
+ OPJ_UINT32 * p_max_res );
+
+/**
+ * Gets the encoding parameters needed to update the coding parameters and all the pocs.
+ * The precinct widths, heights, dx and dy for each component at each resolution will be stored as well.
+ * the last parameter of the function should be an array of pointers of size nb components, each pointer leading
+ * to an area of size 4 * max_res. The data is stored inside this area with the following pattern :
+ * dx_compi_res0 , dy_compi_res0 , w_compi_res0, h_compi_res0 , dx_compi_res1 , dy_compi_res1 , w_compi_res1, h_compi_res1 , ...
+ *
+ * @param p_image the image being encoded.
+ * @param p_cp the coding parameters.
+ * @param tileno the tile index of the tile being encoded.
+ * @param p_tx0 pointer that will hold the X0 parameter for the tile
+ * @param p_tx1 pointer that will hold the X1 parameter for the tile
+ * @param p_ty0 pointer that will hold the Y0 parameter for the tile
+ * @param p_ty1 pointer that will hold the Y1 parameter for the tile
+ * @param p_max_prec pointer that will hold the the maximum precision for all the bands of the tile
+ * @param p_max_res pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
+ * @param p_dx_min pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
+ * @param p_dy_min pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
+ * @param p_resolutions pointer to an area corresponding to the one described above.
+ */
+static void opj_get_all_encoding_parameters(const opj_image_t *p_image,
+ const opj_cp_t *p_cp,
+ OPJ_UINT32 tileno,
+ OPJ_INT32 * p_tx0,
+ OPJ_INT32 * p_tx1,
+ OPJ_INT32 * p_ty0,
+ OPJ_INT32 * p_ty1,
+ OPJ_UINT32 * p_dx_min,
+ OPJ_UINT32 * p_dy_min,
+ OPJ_UINT32 * p_max_prec,
+ OPJ_UINT32 * p_max_res,
+ OPJ_UINT32 ** p_resolutions );
+/**
+ * Allocates memory for a packet iterator. Data and data sizes are set by this operation.
+ * No other data is set. The include section of the packet iterator is not allocated.
+ *
+ * @param p_image the image used to initialize the packet iterator (in fact only the number of components is relevant.
+ * @param p_cp the coding parameters.
+ * @param tileno the index of the tile from which creating the packet iterator.
+ */
+static opj_pi_iterator_t * opj_pi_create( const opj_image_t *p_image,
+ const opj_cp_t *p_cp,
+ OPJ_UINT32 tileno );
+/**
+ * FIXME DOC
+ */
+static void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
+ opj_tcp_t * p_tcp,
+ OPJ_UINT32 p_max_precision,
+ OPJ_UINT32 p_max_res);
+/**
+ * FIXME DOC
+ */
+static void opj_pi_update_decode_poc ( opj_pi_iterator_t * p_pi,
+ opj_tcp_t * p_tcp,
+ OPJ_UINT32 p_max_precision,
+ OPJ_UINT32 p_max_res);
+
+/**
+ * FIXME DOC
+ */
+OPJ_BOOL opj_pi_check_next_level( OPJ_INT32 pos,
+ opj_cp_t *cp,
+ OPJ_UINT32 tileno,
+ OPJ_UINT32 pino,
+ const OPJ_CHAR *prog);
+
+/*@}*/
+
+/*@}*/
+
+/*
+==========================================================
+ local functions
+==========================================================
+*/
+
+OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi) {
+ opj_pi_comp_t *comp = NULL;
+ opj_pi_resolution_t *res = NULL;
+ OPJ_UINT32 index = 0;
+
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ res = &comp->resolutions[pi->resno];
+ goto LABEL_SKIP;
+ } else {
+ pi->first = 0;
+ }
+
+ for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+ for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
+ pi->resno++) {
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+ comp = &pi->comps[pi->compno];
+ if (pi->resno >= comp->numresolutions) {
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ if (!pi->tp_on){
+ pi->poc.precno1 = res->pw * res->ph;
+ }
+ for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+ index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+ if (!pi->include[index]) {
+ pi->include[index] = 1;
+ return OPJ_TRUE;
+ }
+LABEL_SKIP:;
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi) {
+ opj_pi_comp_t *comp = NULL;
+ opj_pi_resolution_t *res = NULL;
+ OPJ_UINT32 index = 0;
+
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ res = &comp->resolutions[pi->resno];
+ goto LABEL_SKIP;
+ } else {
+ pi->first = 0;
+ }
+
+ for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+ for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+ comp = &pi->comps[pi->compno];
+ if (pi->resno >= comp->numresolutions) {
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ if(!pi->tp_on){
+ pi->poc.precno1 = res->pw * res->ph;
+ }
+ for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+ index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+ if (!pi->include[index]) {
+ pi->include[index] = 1;
+ return OPJ_TRUE;
+ }
+LABEL_SKIP:;
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi) {
+ opj_pi_comp_t *comp = NULL;
+ opj_pi_resolution_t *res = NULL;
+ OPJ_UINT32 index = 0;
+
+ if (!pi->first) {
+ goto LABEL_SKIP;
+ } else {
+ OPJ_UINT32 compno, resno;
+ pi->first = 0;
+ pi->dx = 0;
+ pi->dy = 0;
+ for (compno = 0; compno < pi->numcomps; compno++) {
+ comp = &pi->comps[compno];
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ OPJ_UINT32 dx, dy;
+ res = &comp->resolutions[resno];
+ dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+ dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+ }
+ }
+ }
+if (!pi->tp_on){
+ pi->poc.ty0 = pi->ty0;
+ pi->poc.tx0 = pi->tx0;
+ pi->poc.ty1 = pi->ty1;
+ pi->poc.tx1 = pi->tx1;
+ }
+ for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+ for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+ for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+ OPJ_UINT32 levelno;
+ OPJ_INT32 trx0, try0;
+ OPJ_INT32 trx1, try1;
+ OPJ_UINT32 rpx, rpy;
+ OPJ_INT32 prci, prcj;
+ comp = &pi->comps[pi->compno];
+ if (pi->resno >= comp->numresolutions) {
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+ try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+ trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+ try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+ continue;
+ }
+ if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+ continue;
+ }
+
+ if ((res->pw==0)||(res->ph==0)) continue;
+
+ if ((trx0==trx1)||(try0==try1)) continue;
+
+ prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+ - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+ prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+ - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+ pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+ for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+ index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+ if (!pi->include[index]) {
+ pi->include[index] = 1;
+ return OPJ_TRUE;
+ }
+LABEL_SKIP:;
+ }
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
+ opj_pi_comp_t *comp = NULL;
+ opj_pi_resolution_t *res = NULL;
+ OPJ_UINT32 index = 0;
+
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ goto LABEL_SKIP;
+ } else {
+ OPJ_UINT32 compno, resno;
+ pi->first = 0;
+ pi->dx = 0;
+ pi->dy = 0;
+ for (compno = 0; compno < pi->numcomps; compno++) {
+ comp = &pi->comps[compno];
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ OPJ_UINT32 dx, dy;
+ res = &comp->resolutions[resno];
+ dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+ dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+ }
+ }
+ }
+ if (!pi->tp_on){
+ pi->poc.ty0 = pi->ty0;
+ pi->poc.tx0 = pi->tx0;
+ pi->poc.ty1 = pi->ty1;
+ pi->poc.tx1 = pi->tx1;
+ }
+ for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+ for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+ comp = &pi->comps[pi->compno];
+ for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+ OPJ_UINT32 levelno;
+ OPJ_INT32 trx0, try0;
+ OPJ_INT32 trx1, try1;
+ OPJ_UINT32 rpx, rpy;
+ OPJ_INT32 prci, prcj;
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+ try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+ trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+ try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+ continue;
+ }
+ if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+ continue;
+ }
+
+ if ((res->pw==0)||(res->ph==0)) continue;
+
+ if ((trx0==trx1)||(try0==try1)) continue;
+
+ prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+ - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+ prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+ - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+ pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+ for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+ index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+ if (!pi->include[index]) {
+ pi->include[index] = 1;
+ return OPJ_TRUE;
+ }
+LABEL_SKIP:;
+ }
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
+ opj_pi_comp_t *comp = NULL;
+ opj_pi_resolution_t *res = NULL;
+ OPJ_UINT32 index = 0;
+
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ goto LABEL_SKIP;
+ } else {
+ pi->first = 0;
+ }
+
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+ OPJ_UINT32 resno;
+ comp = &pi->comps[pi->compno];
+ pi->dx = 0;
+ pi->dy = 0;
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ OPJ_UINT32 dx, dy;
+ res = &comp->resolutions[resno];
+ dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+ dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+ }
+ if (!pi->tp_on){
+ pi->poc.ty0 = pi->ty0;
+ pi->poc.tx0 = pi->tx0;
+ pi->poc.ty1 = pi->ty1;
+ pi->poc.tx1 = pi->tx1;
+ }
+ for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+ for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+ for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+ OPJ_UINT32 levelno;
+ OPJ_INT32 trx0, try0;
+ OPJ_INT32 trx1, try1;
+ OPJ_UINT32 rpx, rpy;
+ OPJ_INT32 prci, prcj;
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+ try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+ trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+ try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
+ continue;
+ }
+ if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
+ continue;
+ }
+
+ if ((res->pw==0)||(res->ph==0)) continue;
+
+ if ((trx0==trx1)||(try0==try1)) continue;
+
+ prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+ - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+ prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+ - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+ pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+ for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
+ index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+ if (!pi->include[index]) {
+ pi->include[index] = 1;
+ return OPJ_TRUE;
+ }
+LABEL_SKIP:;
+ }
+ }
+ }
+ }
+ }
+
+ return OPJ_FALSE;
+}
+
+void opj_get_encoding_parameters( const opj_image_t *p_image,
+ const opj_cp_t *p_cp,
+ OPJ_UINT32 p_tileno,
+ OPJ_INT32 * p_tx0,
+ OPJ_INT32 * p_tx1,
+ OPJ_INT32 * p_ty0,
+ OPJ_INT32 * p_ty1,
+ OPJ_UINT32 * p_dx_min,
+ OPJ_UINT32 * p_dy_min,
+ OPJ_UINT32 * p_max_prec,
+ OPJ_UINT32 * p_max_res )
+{
+ /* loop */
+ OPJ_UINT32 compno, resno;
+ /* pointers */
+ const opj_tcp_t *l_tcp = 00;
+ const opj_tccp_t * l_tccp = 00;
+ const opj_image_comp_t * l_img_comp = 00;
+
+ /* position in x and y of tile */
+ OPJ_UINT32 p, q;
+
+ /* preconditions */
+ assert(p_cp != 00);
+ assert(p_image != 00);
+ assert(p_tileno < p_cp->tw * p_cp->th);
+
+ /* initializations */
+ l_tcp = &p_cp->tcps [p_tileno];
+ l_img_comp = p_image->comps;
+ l_tccp = l_tcp->tccps;
+
+ /* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */
+ p = p_tileno % p_cp->tw;
+ q = p_tileno / p_cp->tw;
+
+ /* find extent of tile */
+ *p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
+ *p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
+ *p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
+ *p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
+
+ /* max precision is 0 (can only grow) */
+ *p_max_prec = 0;
+ *p_max_res = 0;
+
+ /* take the largest value for dx_min and dy_min */
+ *p_dx_min = 0x7fffffff;
+ *p_dy_min = 0x7fffffff;
+
+ for (compno = 0; compno < p_image->numcomps; ++compno) {
+ /* arithmetic variables to calculate */
+ OPJ_UINT32 l_level_no;
+ OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+ OPJ_INT32 l_px0, l_py0, l_px1, py1;
+ OPJ_UINT32 l_pdx, l_pdy;
+ OPJ_UINT32 l_pw, l_ph;
+ OPJ_UINT32 l_product;
+ OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
+
+ l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+ l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+ l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+ l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+
+ if (l_tccp->numresolutions > *p_max_res) {
+ *p_max_res = l_tccp->numresolutions;
+ }
+
+ /* use custom size for precincts */
+ for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+ OPJ_UINT32 l_dx, l_dy;
+
+ /* precinct width and height */
+ l_pdx = l_tccp->prcw[resno];
+ l_pdy = l_tccp->prch[resno];
+
+ l_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));
+ l_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));
+
+ /* take the minimum size for dx for each comp and resolution */
+ *p_dx_min = opj_uint_min(*p_dx_min, l_dx);
+ *p_dy_min = opj_uint_min(*p_dy_min, l_dy);
+
+ /* various calculations of extents */
+ l_level_no = l_tccp->numresolutions - 1 - resno;
+
+ l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+ l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+ l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+ l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+
+ l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+ l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+ l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+
+ py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+
+ l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+ l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+
+ l_product = l_pw * l_ph;
+
+ /* update precision */
+ if (l_product > *p_max_prec) {
+ *p_max_prec = l_product;
+ }
+ }
+ ++l_img_comp;
+ ++l_tccp;
+ }
+}
+
+
+void opj_get_all_encoding_parameters( const opj_image_t *p_image,
+ const opj_cp_t *p_cp,
+ OPJ_UINT32 tileno,
+ OPJ_INT32 * p_tx0,
+ OPJ_INT32 * p_tx1,
+ OPJ_INT32 * p_ty0,
+ OPJ_INT32 * p_ty1,
+ OPJ_UINT32 * p_dx_min,
+ OPJ_UINT32 * p_dy_min,
+ OPJ_UINT32 * p_max_prec,
+ OPJ_UINT32 * p_max_res,
+ OPJ_UINT32 ** p_resolutions )
+{
+ /* loop*/
+ OPJ_UINT32 compno, resno;
+
+ /* pointers*/
+ const opj_tcp_t *tcp = 00;
+ const opj_tccp_t * l_tccp = 00;
+ const opj_image_comp_t * l_img_comp = 00;
+
+ /* to store l_dx, l_dy, w and h for each resolution and component.*/
+ OPJ_UINT32 * lResolutionPtr;
+
+ /* position in x and y of tile*/
+ OPJ_UINT32 p, q;
+
+ /* preconditions in debug*/
+ assert(p_cp != 00);
+ assert(p_image != 00);
+ assert(tileno < p_cp->tw * p_cp->th);
+
+ /* initializations*/
+ tcp = &p_cp->tcps [tileno];
+ l_tccp = tcp->tccps;
+ l_img_comp = p_image->comps;
+
+ /* position in x and y of tile*/
+ p = tileno % p_cp->tw;
+ q = tileno / p_cp->tw;
+
+ /* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */
+ *p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
+ *p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
+ *p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
+ *p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
+
+ /* max precision and resolution is 0 (can only grow)*/
+ *p_max_prec = 0;
+ *p_max_res = 0;
+
+ /* take the largest value for dx_min and dy_min*/
+ *p_dx_min = 0x7fffffff;
+ *p_dy_min = 0x7fffffff;
+
+ for (compno = 0; compno < p_image->numcomps; ++compno) {
+ /* aritmetic variables to calculate*/
+ OPJ_UINT32 l_level_no;
+ OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+ OPJ_INT32 l_px0, l_py0, l_px1, py1;
+ OPJ_UINT32 l_product;
+ OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
+ OPJ_UINT32 l_pdx, l_pdy , l_pw , l_ph;
+
+ lResolutionPtr = p_resolutions[compno];
+
+ l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+ l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+ l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+ l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+
+ if (l_tccp->numresolutions > *p_max_res) {
+ *p_max_res = l_tccp->numresolutions;
+ }
+
+ /* use custom size for precincts*/
+ l_level_no = l_tccp->numresolutions - 1;
+ for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+ OPJ_UINT32 l_dx, l_dy;
+
+ /* precinct width and height*/
+ l_pdx = l_tccp->prcw[resno];
+ l_pdy = l_tccp->prch[resno];
+ *lResolutionPtr++ = l_pdx;
+ *lResolutionPtr++ = l_pdy;
+ l_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));
+ l_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));
+ /* take the minimum size for l_dx for each comp and resolution*/
+ *p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dx_min, (OPJ_INT32)l_dx);
+ *p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dy_min, (OPJ_INT32)l_dy);
+
+ /* various calculations of extents*/
+ l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+ l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+ l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+ l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+ l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+ l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+ l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+ py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+ l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+ l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+ *lResolutionPtr++ = l_pw;
+ *lResolutionPtr++ = l_ph;
+ l_product = l_pw * l_ph;
+
+ /* update precision*/
+ if (l_product > *p_max_prec) {
+ *p_max_prec = l_product;
+ }
+
+ --l_level_no;
+ }
+ ++l_tccp;
+ ++l_img_comp;
+ }
+}
+
+opj_pi_iterator_t * opj_pi_create( const opj_image_t *image,
+ const opj_cp_t *cp,
+ OPJ_UINT32 tileno )
+{
+ /* loop*/
+ OPJ_UINT32 pino, compno;
+ /* number of poc in the p_pi*/
+ OPJ_UINT32 l_poc_bound;
+
+ /* pointers to tile coding parameters and components.*/
+ opj_pi_iterator_t *l_pi = 00;
+ opj_tcp_t *tcp = 00;
+ const opj_tccp_t *tccp = 00;
+
+ /* current packet iterator being allocated*/
+ opj_pi_iterator_t *l_current_pi = 00;
+
+ /* preconditions in debug*/
+ assert(cp != 00);
+ assert(image != 00);
+ assert(tileno < cp->tw * cp->th);
+
+ /* initializations*/
+ tcp = &cp->tcps[tileno];
+ l_poc_bound = tcp->numpocs+1;
+
+ /* memory allocations*/
+ l_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound), sizeof(opj_pi_iterator_t));
+ if (!l_pi) {
+ return NULL;
+ }
+ memset(l_pi,0,l_poc_bound * sizeof(opj_pi_iterator_t));
+
+ l_current_pi = l_pi;
+ for (pino = 0; pino < l_poc_bound ; ++pino) {
+
+ l_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
+ if (! l_current_pi->comps) {
+ opj_pi_destroy(l_pi, l_poc_bound);
+ return NULL;
+ }
+
+ l_current_pi->numcomps = image->numcomps;
+ memset(l_current_pi->comps,0,image->numcomps * sizeof(opj_pi_comp_t));
+
+ for (compno = 0; compno < image->numcomps; ++compno) {
+ opj_pi_comp_t *comp = &l_current_pi->comps[compno];
+
+ tccp = &tcp->tccps[compno];
+
+ comp->resolutions = (opj_pi_resolution_t*) opj_malloc(tccp->numresolutions * sizeof(opj_pi_resolution_t));
+ if (!comp->resolutions) {
+ opj_pi_destroy(l_pi, l_poc_bound);
+ return 00;
+ }
+
+ comp->numresolutions = tccp->numresolutions;
+ memset(comp->resolutions,0,tccp->numresolutions * sizeof(opj_pi_resolution_t));
+ }
+ ++l_current_pi;
+ }
+ return l_pi;
+}
+
+void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,
+ OPJ_UINT32 p_tileno,
+ OPJ_INT32 p_tx0,
+ OPJ_INT32 p_tx1,
+ OPJ_INT32 p_ty0,
+ OPJ_INT32 p_ty1,
+ OPJ_UINT32 p_max_prec,
+ OPJ_UINT32 p_max_res,
+ OPJ_UINT32 p_dx_min,
+ OPJ_UINT32 p_dy_min)
+{
+ /* loop*/
+ OPJ_UINT32 pino;
+ /* tile coding parameter*/
+ opj_tcp_t *l_tcp = 00;
+ /* current poc being updated*/
+ opj_poc_t * l_current_poc = 00;
+
+ /* number of pocs*/
+ OPJ_UINT32 l_poc_bound;
+
+ OPJ_ARG_NOT_USED(p_max_res);
+
+ /* preconditions in debug*/
+ assert(p_cp != 00);
+ assert(p_tileno < p_cp->tw * p_cp->th);
+
+ /* initializations*/
+ l_tcp = &p_cp->tcps [p_tileno];
+ /* number of iterations in the loop */
+ l_poc_bound = l_tcp->numpocs+1;
+
+ /* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+ store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+ l_current_poc = l_tcp->pocs;
+
+ l_current_poc->compS = l_current_poc->compno0;
+ l_current_poc->compE = l_current_poc->compno1;
+ l_current_poc->resS = l_current_poc->resno0;
+ l_current_poc->resE = l_current_poc->resno1;
+ l_current_poc->layE = l_current_poc->layno1;
+
+ /* special treatment for the first element*/
+ l_current_poc->layS = 0;
+ l_current_poc->prg = l_current_poc->prg1;
+ l_current_poc->prcS = 0;
+
+ l_current_poc->prcE = p_max_prec;
+ l_current_poc->txS = (OPJ_UINT32)p_tx0;
+ l_current_poc->txE = (OPJ_UINT32)p_tx1;
+ l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+ l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+ l_current_poc->dx = p_dx_min;
+ l_current_poc->dy = p_dy_min;
+
+ ++ l_current_poc;
+ for (pino = 1;pino < l_poc_bound ; ++pino) {
+ l_current_poc->compS = l_current_poc->compno0;
+ l_current_poc->compE= l_current_poc->compno1;
+ l_current_poc->resS = l_current_poc->resno0;
+ l_current_poc->resE = l_current_poc->resno1;
+ l_current_poc->layE = l_current_poc->layno1;
+ l_current_poc->prg = l_current_poc->prg1;
+ l_current_poc->prcS = 0;
+ /* special treatment here different from the first element*/
+ l_current_poc->layS = (l_current_poc->layE > (l_current_poc-1)->layE) ? l_current_poc->layE : 0;
+
+ l_current_poc->prcE = p_max_prec;
+ l_current_poc->txS = (OPJ_UINT32)p_tx0;
+ l_current_poc->txE = (OPJ_UINT32)p_tx1;
+ l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+ l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+ l_current_poc->dx = p_dx_min;
+ l_current_poc->dy = p_dy_min;
+ ++ l_current_poc;
+ }
+}
+
+void opj_pi_update_encode_not_poc ( opj_cp_t *p_cp,
+ OPJ_UINT32 p_num_comps,
+ OPJ_UINT32 p_tileno,
+ OPJ_INT32 p_tx0,
+ OPJ_INT32 p_tx1,
+ OPJ_INT32 p_ty0,
+ OPJ_INT32 p_ty1,
+ OPJ_UINT32 p_max_prec,
+ OPJ_UINT32 p_max_res,
+ OPJ_UINT32 p_dx_min,
+ OPJ_UINT32 p_dy_min)
+{
+ /* loop*/
+ OPJ_UINT32 pino;
+ /* tile coding parameter*/
+ opj_tcp_t *l_tcp = 00;
+ /* current poc being updated*/
+ opj_poc_t * l_current_poc = 00;
+ /* number of pocs*/
+ OPJ_UINT32 l_poc_bound;
+
+ /* preconditions in debug*/
+ assert(p_cp != 00);
+ assert(p_tileno < p_cp->tw * p_cp->th);
+
+ /* initializations*/
+ l_tcp = &p_cp->tcps [p_tileno];
+
+ /* number of iterations in the loop */
+ l_poc_bound = l_tcp->numpocs+1;
+
+ /* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+ store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+ l_current_poc = l_tcp->pocs;
+
+ for (pino = 0; pino < l_poc_bound ; ++pino) {
+ l_current_poc->compS = 0;
+ l_current_poc->compE = p_num_comps;/*p_image->numcomps;*/
+ l_current_poc->resS = 0;
+ l_current_poc->resE = p_max_res;
+ l_current_poc->layS = 0;
+ l_current_poc->layE = l_tcp->numlayers;
+ l_current_poc->prg = l_tcp->prg;
+ l_current_poc->prcS = 0;
+ l_current_poc->prcE = p_max_prec;
+ l_current_poc->txS = (OPJ_UINT32)p_tx0;
+ l_current_poc->txE = (OPJ_UINT32)p_tx1;
+ l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+ l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+ l_current_poc->dx = p_dx_min;
+ l_current_poc->dy = p_dy_min;
+ ++ l_current_poc;
+ }
+}
+
+void opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,
+ opj_tcp_t * p_tcp,
+ OPJ_UINT32 p_max_precision,
+ OPJ_UINT32 p_max_res)
+{
+ /* loop*/
+ OPJ_UINT32 pino;
+
+ /* encoding prameters to set*/
+ OPJ_UINT32 l_bound;
+
+ opj_pi_iterator_t * l_current_pi = 00;
+ opj_poc_t* l_current_poc = 0;
+
+ OPJ_ARG_NOT_USED(p_max_res);
+
+ /* preconditions in debug*/
+ assert(p_pi != 00);
+ assert(p_tcp != 00);
+
+ /* initializations*/
+ l_bound = p_tcp->numpocs+1;
+ l_current_pi = p_pi;
+ l_current_poc = p_tcp->pocs;
+
+ for (pino = 0;pino<l_bound;++pino) {
+ l_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */
+ l_current_pi->first = 1;
+
+ l_current_pi->poc.resno0 = l_current_poc->resno0; /* Resolution Level Index #0 (Start) */
+ l_current_pi->poc.compno0 = l_current_poc->compno0; /* Component Index #0 (Start) */
+ l_current_pi->poc.layno0 = 0;
+ l_current_pi->poc.precno0 = 0;
+ l_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */
+ l_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */
+ l_current_pi->poc.layno1 = l_current_poc->layno1; /* Layer Index #0 (End) */
+ l_current_pi->poc.precno1 = p_max_precision;
+ ++l_current_pi;
+ ++l_current_poc;
+ }
+}
+
+void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
+ opj_tcp_t * p_tcp,
+ OPJ_UINT32 p_max_precision,
+ OPJ_UINT32 p_max_res)
+{
+ /* loop*/
+ OPJ_UINT32 pino;
+
+ /* encoding prameters to set*/
+ OPJ_UINT32 l_bound;
+
+ opj_pi_iterator_t * l_current_pi = 00;
+ /* preconditions in debug*/
+ assert(p_tcp != 00);
+ assert(p_pi != 00);
+
+ /* initializations*/
+ l_bound = p_tcp->numpocs+1;
+ l_current_pi = p_pi;
+
+ for (pino = 0;pino<l_bound;++pino) {
+ l_current_pi->poc.prg = p_tcp->prg;
+ l_current_pi->first = 1;
+ l_current_pi->poc.resno0 = 0;
+ l_current_pi->poc.compno0 = 0;
+ l_current_pi->poc.layno0 = 0;
+ l_current_pi->poc.precno0 = 0;
+ l_current_pi->poc.resno1 = p_max_res;
+ l_current_pi->poc.compno1 = l_current_pi->numcomps;
+ l_current_pi->poc.layno1 = p_tcp->numlayers;
+ l_current_pi->poc.precno1 = p_max_precision;
+ ++l_current_pi;
+ }
+}
+
+
+
+OPJ_BOOL opj_pi_check_next_level( OPJ_INT32 pos,
+ opj_cp_t *cp,
+ OPJ_UINT32 tileno,
+ OPJ_UINT32 pino,
+ const OPJ_CHAR *prog)
+{
+ OPJ_INT32 i;
+ opj_tcp_t *tcps =&cp->tcps[tileno];
+ opj_poc_t *tcp = &tcps->pocs[pino];
+
+ if(pos>=0){
+ for(i=pos;pos>=0;i--){
+ switch(prog[i]){
+ case 'R':
+ if(tcp->res_t==tcp->resE){
+ if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+ return OPJ_TRUE;
+ }else{
+ return OPJ_FALSE;
+ }
+ }else{
+ return OPJ_TRUE;
+ }
+ break;
+ case 'C':
+ if(tcp->comp_t==tcp->compE){
+ if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+ return OPJ_TRUE;
+ }else{
+ return OPJ_FALSE;
+ }
+ }else{
+ return OPJ_TRUE;
+ }
+ break;
+ case 'L':
+ if(tcp->lay_t==tcp->layE){
+ if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
+ return OPJ_TRUE;
+ }else{
+ return OPJ_FALSE;
+ }
+ }else{
+ return OPJ_TRUE;
+ }
+ break;
+ case 'P':
+ switch(tcp->prg){
+ case OPJ_LRCP||OPJ_RLCP:
+ if(tcp->prc_t == tcp->prcE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ return OPJ_TRUE;
+ }else{
+ return OPJ_FALSE;
+ }
+ }else{
+ return OPJ_TRUE;
+ }
+ break;
+ default:
+ if(tcp->tx0_t == tcp->txE){
+ /*TY*/
+ if(tcp->ty0_t == tcp->tyE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ return OPJ_TRUE;
+ }else{
+ return OPJ_FALSE;
+ }
+ }else{
+ return OPJ_TRUE;
+ }/*TY*/
+ }else{
+ return OPJ_TRUE;
+ }
+ break;
+ }/*end case P*/
+ }/*end switch*/
+ }/*end for*/
+ }/*end if*/
+ return OPJ_FALSE;
+}
+
+
+/*
+==========================================================
+ Packet iterator interface
+==========================================================
+*/
+opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
+ opj_cp_t *p_cp,
+ OPJ_UINT32 p_tile_no)
+{
+ /* loop */
+ OPJ_UINT32 pino;
+ OPJ_UINT32 compno, resno;
+
+ /* to store w, h, dx and dy fro all components and resolutions */
+ OPJ_UINT32 * l_tmp_data;
+ OPJ_UINT32 ** l_tmp_ptr;
+
+ /* encoding prameters to set */
+ OPJ_UINT32 l_max_res;
+ OPJ_UINT32 l_max_prec;
+ OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+ OPJ_UINT32 l_dx_min,l_dy_min;
+ OPJ_UINT32 l_bound;
+ OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
+ OPJ_UINT32 l_data_stride;
+
+ /* pointers */
+ opj_pi_iterator_t *l_pi = 00;
+ opj_tcp_t *l_tcp = 00;
+ const opj_tccp_t *l_tccp = 00;
+ opj_pi_comp_t *l_current_comp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_pi_iterator_t * l_current_pi = 00;
+ OPJ_UINT32 * l_encoding_value_ptr = 00;
+
+ /* preconditions in debug */
+ assert(p_cp != 00);
+ assert(p_image != 00);
+ assert(p_tile_no < p_cp->tw * p_cp->th);
+
+ /* initializations */
+ l_tcp = &p_cp->tcps[p_tile_no];
+ l_bound = l_tcp->numpocs+1;
+
+ l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+ l_tmp_data = (OPJ_UINT32*)opj_malloc(
+ l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
+ if
+ (! l_tmp_data)
+ {
+ return 00;
+ }
+ l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+ p_image->numcomps * sizeof(OPJ_UINT32 *));
+ if
+ (! l_tmp_ptr)
+ {
+ opj_free(l_tmp_data);
+ return 00;
+ }
+
+ /* memory allocation for pi */
+ l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
+ if (!l_pi) {
+ opj_free(l_tmp_data);
+ opj_free(l_tmp_ptr);
+ return 00;
+ }
+
+ l_encoding_value_ptr = l_tmp_data;
+ /* update pointer array */
+ for
+ (compno = 0; compno < p_image->numcomps; ++compno)
+ {
+ l_tmp_ptr[compno] = l_encoding_value_ptr;
+ l_encoding_value_ptr += l_data_stride;
+ }
+ /* get encoding parameters */
+ opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+
+ /* step calculations */
+ l_step_p = 1;
+ l_step_c = l_max_prec * l_step_p;
+ l_step_r = p_image->numcomps * l_step_c;
+ l_step_l = l_max_res * l_step_r;
+
+ /* set values for first packet iterator */
+ l_current_pi = l_pi;
+
+ /* memory allocation for include */
+ l_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));
+ if
+ (!l_current_pi->include)
+ {
+ opj_free(l_tmp_data);
+ opj_free(l_tmp_ptr);
+ opj_pi_destroy(l_pi, l_bound);
+ return 00;
+ }
+ memset(l_current_pi->include,0, (l_tcp->numlayers + 1) * l_step_l* sizeof(OPJ_INT16));
+
+ /* special treatment for the first packet iterator */
+ l_current_comp = l_current_pi->comps;
+ l_img_comp = p_image->comps;
+ l_tccp = l_tcp->tccps;
+
+ l_current_pi->tx0 = l_tx0;
+ l_current_pi->ty0 = l_ty0;
+ l_current_pi->tx1 = l_tx1;
+ l_current_pi->ty1 = l_ty1;
+
+ /*l_current_pi->dx = l_img_comp->dx;*/
+ /*l_current_pi->dy = l_img_comp->dy;*/
+
+ l_current_pi->step_p = l_step_p;
+ l_current_pi->step_c = l_step_c;
+ l_current_pi->step_r = l_step_r;
+ l_current_pi->step_l = l_step_l;
+
+ /* allocation for components and number of components has already been calculated by opj_pi_create */
+ for
+ (compno = 0; compno < l_current_pi->numcomps; ++compno)
+ {
+ opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+ l_encoding_value_ptr = l_tmp_ptr[compno];
+
+ l_current_comp->dx = l_img_comp->dx;
+ l_current_comp->dy = l_img_comp->dy;
+ /* resolutions have already been initialized */
+ for
+ (resno = 0; resno < l_current_comp->numresolutions; resno++)
+ {
+ l_res->pdx = *(l_encoding_value_ptr++);
+ l_res->pdy = *(l_encoding_value_ptr++);
+ l_res->pw = *(l_encoding_value_ptr++);
+ l_res->ph = *(l_encoding_value_ptr++);
+ ++l_res;
+ }
+ ++l_current_comp;
+ ++l_img_comp;
+ ++l_tccp;
+ }
+ ++l_current_pi;
+
+ for (pino = 1 ; pino<l_bound ; ++pino )
+ {
+ l_current_comp = l_current_pi->comps;
+ l_img_comp = p_image->comps;
+ l_tccp = l_tcp->tccps;
+
+ l_current_pi->tx0 = l_tx0;
+ l_current_pi->ty0 = l_ty0;
+ l_current_pi->tx1 = l_tx1;
+ l_current_pi->ty1 = l_ty1;
+ /*l_current_pi->dx = l_dx_min;*/
+ /*l_current_pi->dy = l_dy_min;*/
+ l_current_pi->step_p = l_step_p;
+ l_current_pi->step_c = l_step_c;
+ l_current_pi->step_r = l_step_r;
+ l_current_pi->step_l = l_step_l;
+
+ /* allocation for components and number of components has already been calculated by opj_pi_create */
+ for
+ (compno = 0; compno < l_current_pi->numcomps; ++compno)
+ {
+ opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+ l_encoding_value_ptr = l_tmp_ptr[compno];
+
+ l_current_comp->dx = l_img_comp->dx;
+ l_current_comp->dy = l_img_comp->dy;
+ /* resolutions have already been initialized */
+ for
+ (resno = 0; resno < l_current_comp->numresolutions; resno++)
+ {
+ l_res->pdx = *(l_encoding_value_ptr++);
+ l_res->pdy = *(l_encoding_value_ptr++);
+ l_res->pw = *(l_encoding_value_ptr++);
+ l_res->ph = *(l_encoding_value_ptr++);
+ ++l_res;
+ }
+ ++l_current_comp;
+ ++l_img_comp;
+ ++l_tccp;
+ }
+ /* special treatment*/
+ l_current_pi->include = (l_current_pi-1)->include;
+ ++l_current_pi;
+ }
+ opj_free(l_tmp_data);
+ l_tmp_data = 00;
+ opj_free(l_tmp_ptr);
+ l_tmp_ptr = 00;
+ if
+ (l_tcp->POC)
+ {
+ opj_pi_update_decode_poc (l_pi,l_tcp,l_max_prec,l_max_res);
+ }
+ else
+ {
+ opj_pi_update_decode_not_poc(l_pi,l_tcp,l_max_prec,l_max_res);
+ }
+ return l_pi;
+}
+
+
+
+opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *p_image,
+ opj_cp_t *p_cp,
+ OPJ_UINT32 p_tile_no,
+ J2K_T2_MODE p_t2_mode )
+{
+ /* loop*/
+ OPJ_UINT32 pino;
+ OPJ_UINT32 compno, resno;
+
+ /* to store w, h, dx and dy fro all components and resolutions*/
+ OPJ_UINT32 * l_tmp_data;
+ OPJ_UINT32 ** l_tmp_ptr;
+
+ /* encoding prameters to set*/
+ OPJ_UINT32 l_max_res;
+ OPJ_UINT32 l_max_prec;
+ OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+ OPJ_UINT32 l_dx_min,l_dy_min;
+ OPJ_UINT32 l_bound;
+ OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
+ OPJ_UINT32 l_data_stride;
+
+ /* pointers*/
+ opj_pi_iterator_t *l_pi = 00;
+ opj_tcp_t *l_tcp = 00;
+ const opj_tccp_t *l_tccp = 00;
+ opj_pi_comp_t *l_current_comp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_pi_iterator_t * l_current_pi = 00;
+ OPJ_UINT32 * l_encoding_value_ptr = 00;
+
+ /* preconditions in debug*/
+ assert(p_cp != 00);
+ assert(p_image != 00);
+ assert(p_tile_no < p_cp->tw * p_cp->th);
+
+ /* initializations*/
+ l_tcp = &p_cp->tcps[p_tile_no];
+ l_bound = l_tcp->numpocs+1;
+
+ l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+ l_tmp_data = (OPJ_UINT32*)opj_malloc(
+ l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
+ if (! l_tmp_data) {
+ return 00;
+ }
+
+ l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+ p_image->numcomps * sizeof(OPJ_UINT32 *));
+ if (! l_tmp_ptr) {
+ opj_free(l_tmp_data);
+ return 00;
+ }
+
+ /* memory allocation for pi*/
+ l_pi = opj_pi_create(p_image,p_cp,p_tile_no);
+ if (!l_pi) {
+ opj_free(l_tmp_data);
+ opj_free(l_tmp_ptr);
+ return 00;
+ }
+
+ l_encoding_value_ptr = l_tmp_data;
+ /* update pointer array*/
+ for (compno = 0; compno < p_image->numcomps; ++compno) {
+ l_tmp_ptr[compno] = l_encoding_value_ptr;
+ l_encoding_value_ptr += l_data_stride;
+ }
+
+ /* get encoding parameters*/
+ opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+
+ /* step calculations*/
+ l_step_p = 1;
+ l_step_c = l_max_prec * l_step_p;
+ l_step_r = p_image->numcomps * l_step_c;
+ l_step_l = l_max_res * l_step_r;
+
+ /* set values for first packet iterator*/
+ l_pi->tp_on = p_cp->m_specific_param.m_enc.m_tp_on;
+ l_current_pi = l_pi;
+
+ /* memory allocation for include*/
+ l_current_pi->include = (OPJ_INT16*) opj_calloc(l_tcp->numlayers * l_step_l, sizeof(OPJ_INT16));
+ if (!l_current_pi->include) {
+ opj_free(l_tmp_data);
+ opj_free(l_tmp_ptr);
+ opj_pi_destroy(l_pi, l_bound);
+ return 00;
+ }
+ memset(l_current_pi->include,0,l_tcp->numlayers * l_step_l* sizeof(OPJ_INT16));
+
+ /* special treatment for the first packet iterator*/
+ l_current_comp = l_current_pi->comps;
+ l_img_comp = p_image->comps;
+ l_tccp = l_tcp->tccps;
+ l_current_pi->tx0 = l_tx0;
+ l_current_pi->ty0 = l_ty0;
+ l_current_pi->tx1 = l_tx1;
+ l_current_pi->ty1 = l_ty1;
+ l_current_pi->dx = l_dx_min;
+ l_current_pi->dy = l_dy_min;
+ l_current_pi->step_p = l_step_p;
+ l_current_pi->step_c = l_step_c;
+ l_current_pi->step_r = l_step_r;
+ l_current_pi->step_l = l_step_l;
+
+ /* allocation for components and number of components has already been calculated by opj_pi_create */
+ for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
+ opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+ l_encoding_value_ptr = l_tmp_ptr[compno];
+
+ l_current_comp->dx = l_img_comp->dx;
+ l_current_comp->dy = l_img_comp->dy;
+
+ /* resolutions have already been initialized */
+ for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+ l_res->pdx = *(l_encoding_value_ptr++);
+ l_res->pdy = *(l_encoding_value_ptr++);
+ l_res->pw = *(l_encoding_value_ptr++);
+ l_res->ph = *(l_encoding_value_ptr++);
+ ++l_res;
+ }
+
+ ++l_current_comp;
+ ++l_img_comp;
+ ++l_tccp;
+ }
+ ++l_current_pi;
+
+ for (pino = 1 ; pino<l_bound ; ++pino ) {
+ l_current_comp = l_current_pi->comps;
+ l_img_comp = p_image->comps;
+ l_tccp = l_tcp->tccps;
+
+ l_current_pi->tx0 = l_tx0;
+ l_current_pi->ty0 = l_ty0;
+ l_current_pi->tx1 = l_tx1;
+ l_current_pi->ty1 = l_ty1;
+ l_current_pi->dx = l_dx_min;
+ l_current_pi->dy = l_dy_min;
+ l_current_pi->step_p = l_step_p;
+ l_current_pi->step_c = l_step_c;
+ l_current_pi->step_r = l_step_r;
+ l_current_pi->step_l = l_step_l;
+
+ /* allocation for components and number of components has already been calculated by opj_pi_create */
+ for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
+ opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+ l_encoding_value_ptr = l_tmp_ptr[compno];
+
+ l_current_comp->dx = l_img_comp->dx;
+ l_current_comp->dy = l_img_comp->dy;
+ /* resolutions have already been initialized */
+ for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+ l_res->pdx = *(l_encoding_value_ptr++);
+ l_res->pdy = *(l_encoding_value_ptr++);
+ l_res->pw = *(l_encoding_value_ptr++);
+ l_res->ph = *(l_encoding_value_ptr++);
+ ++l_res;
+ }
+ ++l_current_comp;
+ ++l_img_comp;
+ ++l_tccp;
+ }
+
+ /* special treatment*/
+ l_current_pi->include = (l_current_pi-1)->include;
+ ++l_current_pi;
+ }
+
+ opj_free(l_tmp_data);
+ l_tmp_data = 00;
+ opj_free(l_tmp_ptr);
+ l_tmp_ptr = 00;
+
+ if (l_tcp->POC && ( p_cp->m_specific_param.m_enc.m_cinema || p_t2_mode == FINAL_PASS)) {
+ opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+ }
+ else {
+ opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+ }
+
+ return l_pi;
+}
+
+void opj_pi_create_encode( opj_pi_iterator_t *pi,
+ opj_cp_t *cp,
+ OPJ_UINT32 tileno,
+ OPJ_UINT32 pino,
+ OPJ_UINT32 tpnum,
+ OPJ_INT32 tppos,
+ J2K_T2_MODE t2_mode)
+{
+ const OPJ_CHAR *prog;
+ OPJ_INT32 i;
+ OPJ_UINT32 incr_top=1,resetX=0;
+ opj_tcp_t *tcps =&cp->tcps[tileno];
+ opj_poc_t *tcp= &tcps->pocs[pino];
+
+ prog = opj_j2k_convert_progression_order(tcp->prg);
+
+ pi[pino].first = 1;
+ pi[pino].poc.prg = tcp->prg;
+
+ if(!(cp->m_specific_param.m_enc.m_tp_on && ((!cp->m_specific_param.m_enc.m_cinema && (t2_mode == FINAL_PASS)) || cp->m_specific_param.m_enc.m_cinema))){
+ pi[pino].poc.resno0 = tcp->resS;
+ pi[pino].poc.resno1 = tcp->resE;
+ pi[pino].poc.compno0 = tcp->compS;
+ pi[pino].poc.compno1 = tcp->compE;
+ pi[pino].poc.layno0 = tcp->layS;
+ pi[pino].poc.layno1 = tcp->layE;
+ pi[pino].poc.precno0 = tcp->prcS;
+ pi[pino].poc.precno1 = tcp->prcE;
+ pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+ pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+ pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+ pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+ }else {
+ for(i=tppos+1;i<4;i++){
+ switch(prog[i]){
+ case 'R':
+ pi[pino].poc.resno0 = tcp->resS;
+ pi[pino].poc.resno1 = tcp->resE;
+ break;
+ case 'C':
+ pi[pino].poc.compno0 = tcp->compS;
+ pi[pino].poc.compno1 = tcp->compE;
+ break;
+ case 'L':
+ pi[pino].poc.layno0 = tcp->layS;
+ pi[pino].poc.layno1 = tcp->layE;
+ break;
+ case 'P':
+ switch(tcp->prg){
+ case OPJ_LRCP:
+ case OPJ_RLCP:
+ pi[pino].poc.precno0 = tcp->prcS;
+ pi[pino].poc.precno1 = tcp->prcE;
+ break;
+ default:
+ pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+ pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+ pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+ pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+ break;
+ }
+ break;
+ }
+ }
+
+ if(tpnum==0){
+ for(i=tppos;i>=0;i--){
+ switch(prog[i]){
+ case 'C':
+ tcp->comp_t = tcp->compS;
+ pi[pino].poc.compno0 = tcp->comp_t;
+ pi[pino].poc.compno1 = tcp->comp_t+1;
+ tcp->comp_t+=1;
+ break;
+ case 'R':
+ tcp->res_t = tcp->resS;
+ pi[pino].poc.resno0 = tcp->res_t;
+ pi[pino].poc.resno1 = tcp->res_t+1;
+ tcp->res_t+=1;
+ break;
+ case 'L':
+ tcp->lay_t = tcp->layS;
+ pi[pino].poc.layno0 = tcp->lay_t;
+ pi[pino].poc.layno1 = tcp->lay_t+1;
+ tcp->lay_t+=1;
+ break;
+ case 'P':
+ switch(tcp->prg){
+ case OPJ_LRCP:
+ case OPJ_RLCP:
+ tcp->prc_t = tcp->prcS;
+ pi[pino].poc.precno0 = tcp->prc_t;
+ pi[pino].poc.precno1 = tcp->prc_t+1;
+ tcp->prc_t+=1;
+ break;
+ default:
+ tcp->tx0_t = tcp->txS;
+ tcp->ty0_t = tcp->tyS;
+ pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+ pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
+ pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+ pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+ tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+ tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+ break;
+ }
+ break;
+ }
+ }
+ incr_top=1;
+ }else{
+ for(i=tppos;i>=0;i--){
+ switch(prog[i]){
+ case 'C':
+ pi[pino].poc.compno0 = tcp->comp_t-1;
+ pi[pino].poc.compno1 = tcp->comp_t;
+ break;
+ case 'R':
+ pi[pino].poc.resno0 = tcp->res_t-1;
+ pi[pino].poc.resno1 = tcp->res_t;
+ break;
+ case 'L':
+ pi[pino].poc.layno0 = tcp->lay_t-1;
+ pi[pino].poc.layno1 = tcp->lay_t;
+ break;
+ case 'P':
+ switch(tcp->prg){
+ case OPJ_LRCP:
+ case OPJ_RLCP:
+ pi[pino].poc.precno0 = tcp->prc_t-1;
+ pi[pino].poc.precno1 = tcp->prc_t;
+ break;
+ default:
+ pi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));
+ pi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;
+ pi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));
+ pi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;
+ break;
+ }
+ break;
+ }
+ if(incr_top==1){
+ switch(prog[i]){
+ case 'R':
+ if(tcp->res_t==tcp->resE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ tcp->res_t = tcp->resS;
+ pi[pino].poc.resno0 = tcp->res_t;
+ pi[pino].poc.resno1 = tcp->res_t+1;
+ tcp->res_t+=1;
+ incr_top=1;
+ }else{
+ incr_top=0;
+ }
+ }else{
+ pi[pino].poc.resno0 = tcp->res_t;
+ pi[pino].poc.resno1 = tcp->res_t+1;
+ tcp->res_t+=1;
+ incr_top=0;
+ }
+ break;
+ case 'C':
+ if(tcp->comp_t ==tcp->compE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ tcp->comp_t = tcp->compS;
+ pi[pino].poc.compno0 = tcp->comp_t;
+ pi[pino].poc.compno1 = tcp->comp_t+1;
+ tcp->comp_t+=1;
+ incr_top=1;
+ }else{
+ incr_top=0;
+ }
+ }else{
+ pi[pino].poc.compno0 = tcp->comp_t;
+ pi[pino].poc.compno1 = tcp->comp_t+1;
+ tcp->comp_t+=1;
+ incr_top=0;
+ }
+ break;
+ case 'L':
+ if(tcp->lay_t == tcp->layE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ tcp->lay_t = tcp->layS;
+ pi[pino].poc.layno0 = tcp->lay_t;
+ pi[pino].poc.layno1 = tcp->lay_t+1;
+ tcp->lay_t+=1;
+ incr_top=1;
+ }else{
+ incr_top=0;
+ }
+ }else{
+ pi[pino].poc.layno0 = tcp->lay_t;
+ pi[pino].poc.layno1 = tcp->lay_t+1;
+ tcp->lay_t+=1;
+ incr_top=0;
+ }
+ break;
+ case 'P':
+ switch(tcp->prg){
+ case OPJ_LRCP:
+ case OPJ_RLCP:
+ if(tcp->prc_t == tcp->prcE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ tcp->prc_t = tcp->prcS;
+ pi[pino].poc.precno0 = tcp->prc_t;
+ pi[pino].poc.precno1 = tcp->prc_t+1;
+ tcp->prc_t+=1;
+ incr_top=1;
+ }else{
+ incr_top=0;
+ }
+ }else{
+ pi[pino].poc.precno0 = tcp->prc_t;
+ pi[pino].poc.precno1 = tcp->prc_t+1;
+ tcp->prc_t+=1;
+ incr_top=0;
+ }
+ break;
+ default:
+ if(tcp->tx0_t >= tcp->txE){
+ if(tcp->ty0_t >= tcp->tyE){
+ if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
+ tcp->ty0_t = tcp->tyS;
+ pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+ pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+ tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+ incr_top=1;resetX=1;
+ }else{
+ incr_top=0;resetX=0;
+ }
+ }else{
+ pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+ pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+ tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+ incr_top=0;resetX=1;
+ }
+ if(resetX==1){
+ tcp->tx0_t = tcp->txS;
+ pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+ pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
+ tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+ }
+ }else{
+ pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+ pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
+ tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+ incr_top=0;
+ }
+ break;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+void opj_pi_destroy(opj_pi_iterator_t *p_pi,
+ OPJ_UINT32 p_nb_elements)
+{
+ OPJ_UINT32 compno, pino;
+ opj_pi_iterator_t *l_current_pi = p_pi;
+ if (p_pi) {
+ if (p_pi->include) {
+ opj_free(p_pi->include);
+ p_pi->include = 00;
+ }
+ for (pino = 0; pino < p_nb_elements; ++pino){
+ if(l_current_pi->comps) {
+ opj_pi_comp_t *l_current_component = l_current_pi->comps;
+ for (compno = 0; compno < l_current_pi->numcomps; compno++){
+ if(l_current_component->resolutions) {
+ opj_free(l_current_component->resolutions);
+ l_current_component->resolutions = 00;
+ }
+
+ ++l_current_component;
+ }
+ opj_free(l_current_pi->comps);
+ l_current_pi->comps = 0;
+ }
+ ++l_current_pi;
+ }
+ opj_free(p_pi);
+ }
+}
+
+
+
+void opj_pi_update_encoding_parameters( const opj_image_t *p_image,
+ opj_cp_t *p_cp,
+ OPJ_UINT32 p_tile_no )
+{
+ /* encoding parameters to set */
+ OPJ_UINT32 l_max_res;
+ OPJ_UINT32 l_max_prec;
+ OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
+ OPJ_UINT32 l_dx_min,l_dy_min;
+
+ /* pointers */
+ opj_tcp_t *l_tcp = 00;
+
+ /* preconditions */
+ assert(p_cp != 00);
+ assert(p_image != 00);
+ assert(p_tile_no < p_cp->tw * p_cp->th);
+
+ l_tcp = &(p_cp->tcps[p_tile_no]);
+
+ /* get encoding parameters */
+ opj_get_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res);
+
+ if (l_tcp->POC) {
+ opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+ }
+ else {
+ opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
+ }
+}
+
+OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi) {
+ switch (pi->poc.prg) {
+ case OPJ_LRCP:
+ return opj_pi_next_lrcp(pi);
+ case OPJ_RLCP:
+ return opj_pi_next_rlcp(pi);
+ case OPJ_RPCL:
+ return opj_pi_next_rpcl(pi);
+ case OPJ_PCRL:
+ return opj_pi_next_pcrl(pi);
+ case OPJ_CPRL:
+ return opj_pi_next_cprl(pi);
+ case OPJ_PROG_UNKNOWN:
+ return OPJ_FALSE;
+ }
+
+ return OPJ_FALSE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h
new file mode 100644
index 0000000000..f239679f5b
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/pi.h
@@ -0,0 +1,188 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __PI_H
+#define __PI_H
+/**
+@file pi.h
+@brief Implementation of a packet iterator (PI)
+
+The functions in PI.C have for goal to realize a packet iterator that permits to get the next
+packet following the progression order and change of it. The functions in PI.C are used
+by some function in T2.C.
+*/
+
+/** @defgroup PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/**
+FIXME DOC
+*/
+typedef struct opj_pi_resolution {
+ OPJ_UINT32 pdx, pdy;
+ OPJ_UINT32 pw, ph;
+} opj_pi_resolution_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_pi_comp {
+ OPJ_UINT32 dx, dy;
+ /** number of resolution levels */
+ OPJ_UINT32 numresolutions;
+ opj_pi_resolution_t *resolutions;
+} opj_pi_comp_t;
+
+/**
+Packet iterator
+*/
+typedef struct opj_pi_iterator {
+ /** Enabling Tile part generation*/
+ OPJ_BYTE tp_on;
+ /** precise if the packet has been already used (usefull for progression order change) */
+ OPJ_INT16 *include;
+ /** layer step used to localize the packet in the include vector */
+ OPJ_UINT32 step_l;
+ /** resolution step used to localize the packet in the include vector */
+ OPJ_UINT32 step_r;
+ /** component step used to localize the packet in the include vector */
+ OPJ_UINT32 step_c;
+ /** precinct step used to localize the packet in the include vector */
+ OPJ_UINT32 step_p;
+ /** component that identify the packet */
+ OPJ_UINT32 compno;
+ /** resolution that identify the packet */
+ OPJ_UINT32 resno;
+ /** precinct that identify the packet */
+ OPJ_UINT32 precno;
+ /** layer that identify the packet */
+ OPJ_UINT32 layno;
+ /** 0 if the first packet */
+ OPJ_BOOL first;
+ /** progression order change information */
+ opj_poc_t poc;
+ /** number of components in the image */
+ OPJ_UINT32 numcomps;
+ /** Components*/
+ opj_pi_comp_t *comps;
+ /** FIXME DOC*/
+ OPJ_INT32 tx0, ty0, tx1, ty1;
+ /** FIXME DOC*/
+ OPJ_INT32 x, y;
+ /** FIXME DOC*/
+ OPJ_UINT32 dx, dy;
+} opj_pi_iterator_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+ * Creates a packet iterator for encoding.
+ *
+ * @param image the image being encoded.
+ * @param cp the coding parameters.
+ * @param tileno index of the tile being encoded.
+ * @param t2_mode the type of pass for generating the packet iterator
+ *
+ * @return a list of packet iterator that points to the first packet of the tile (not true).
+*/
+opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *image,
+ opj_cp_t *cp,
+ OPJ_UINT32 tileno,
+ J2K_T2_MODE t2_mode);
+
+/**
+ * Updates the encoding parameters of the codec.
+ *
+ * @param p_image the image being encoded.
+ * @param p_cp the coding parameters.
+ * @param p_tile_no index of the tile being encoded.
+*/
+void opj_pi_update_encoding_parameters( const opj_image_t *p_image,
+ opj_cp_t *p_cp,
+ OPJ_UINT32 p_tile_no );
+
+/**
+Modify the packet iterator for enabling tile part generation
+@param pi Handle to the packet iterator generated in pi_initialise_encode
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which to list the packets
+@param pino FIXME DOC
+@param tpnum Tile part number of the current tile
+@param tppos The position of the tile part flag in the progression order
+@param t2_mode FIXME DOC
+*/
+void opj_pi_create_encode( opj_pi_iterator_t *pi,
+ opj_cp_t *cp,
+ OPJ_UINT32 tileno,
+ OPJ_UINT32 pino,
+ OPJ_UINT32 tpnum,
+ OPJ_INT32 tppos,
+ J2K_T2_MODE t2_mode);
+
+/**
+Create a packet iterator for Decoder
+@param image Raw image for which the packets will be listed
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which to list the packets
+@return Returns a packet iterator that points to the first packet of the tile
+@see opj_pi_destroy
+*/
+opj_pi_iterator_t *opj_pi_create_decode(opj_image_t * image,
+ opj_cp_t * cp,
+ OPJ_UINT32 tileno);
+/**
+ * Destroys a packet iterator array.
+ *
+ * @param p_pi the packet iterator array to destroy.
+ * @param p_nb_elements the number of elements in the array.
+ */
+void opj_pi_destroy(opj_pi_iterator_t *p_pi,
+ OPJ_UINT32 p_nb_elements);
+
+/**
+Modify the packet iterator to point to the next packet
+@param pi Packet iterator to modify
+@return Returns false if pi pointed to the last packet or else returns true
+*/
+OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __PI_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c
new file mode 100644
index 0000000000..2498761c42
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.c
@@ -0,0 +1,95 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/*
+==========================================================
+ local functions
+==========================================================
+*/
+
+
+/*
+==========================================================
+ RAW encoding interface
+==========================================================
+*/
+
+opj_raw_t* opj_raw_create(void) {
+ opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
+ return raw;
+}
+
+void opj_raw_destroy(opj_raw_t *raw) {
+ if(raw) {
+ opj_free(raw);
+ }
+}
+
+OPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw) {
+ const ptrdiff_t diff = raw->bp - raw->start;
+ assert( diff <= (ptrdiff_t)0xffffffff && diff >= 0 ); /* UINT32_MAX */
+ return (OPJ_UINT32)diff;
+}
+
+void opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len) {
+ raw->start = bp;
+ raw->lenmax = len;
+ raw->len = 0;
+ raw->c = 0;
+ raw->ct = 0;
+}
+
+OPJ_UINT32 opj_raw_decode(opj_raw_t *raw) {
+ OPJ_UINT32 d;
+ if (raw->ct == 0) {
+ raw->ct = 8;
+ if (raw->len == raw->lenmax) {
+ raw->c = 0xff;
+ } else {
+ if (raw->c == 0xff) {
+ raw->ct = 7;
+ }
+ raw->c = *(raw->start + raw->len);
+ raw->len++;
+ }
+ }
+ raw->ct--;
+ d = (raw->c >> raw->ct) & 0x01;
+
+ return d;
+}
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h
new file mode 100644
index 0000000000..572c666176
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/raw.h
@@ -0,0 +1,106 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __RAW_H
+#define __RAW_H
+/**
+@file raw.h
+@brief Implementation of operations for raw encoding (RAW)
+
+The functions in RAW.C have for goal to realize the operation of raw encoding linked
+with the corresponding mode switch.
+*/
+
+/** @defgroup RAW RAW - Implementation of operations for raw encoding */
+/*@{*/
+
+/**
+RAW encoding operations
+*/
+typedef struct opj_raw {
+ /** temporary buffer where bits are coded or decoded */
+ OPJ_BYTE c;
+ /** number of bits already read or free to write */
+ OPJ_UINT32 ct;
+ /** maximum length to decode */
+ OPJ_UINT32 lenmax;
+ /** length decoded */
+ OPJ_UINT32 len;
+ /** pointer to the current position in the buffer */
+ OPJ_BYTE *bp;
+ /** pointer to the start of the buffer */
+ OPJ_BYTE *start;
+ /** pointer to the end of the buffer */
+ OPJ_BYTE *end;
+} opj_raw_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new RAW handle
+@return Returns a new RAW handle if successful, returns NULL otherwise
+*/
+opj_raw_t* opj_raw_create(void);
+/**
+Destroy a previously created RAW handle
+@param raw RAW handle to destroy
+*/
+void opj_raw_destroy(opj_raw_t *raw);
+/**
+Return the number of bytes written/read since initialisation
+@param raw RAW handle to destroy
+@return Returns the number of bytes already encoded
+*/
+OPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw);
+/**
+Initialize the decoder
+@param raw RAW handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+void opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len);
+/**
+Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
+@param raw RAW handle
+@return Returns the decoded symbol (0 or 1)
+*/
+OPJ_UINT32 opj_raw_decode(opj_raw_t *raw);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __RAW_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
new file mode 100644
index 0000000000..0d6c2f606a
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.c
@@ -0,0 +1,1757 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+#include "t1_luts.h"
+
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient);
+static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);
+static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
+static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);
+static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
+static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
+static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride);
+/**
+Encode significant pass
+*/
+static void opj_t1_enc_sigpass_step(opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc);
+
+/**
+Decode significant pass
+*/
+#if 0
+static void opj_t1_dec_sigpass_step(opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc);
+#endif
+
+static INLINE void opj_t1_dec_sigpass_step_raw(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 vsc);
+static INLINE void opj_t1_dec_sigpass_step_mqc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf);
+static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 vsc);
+
+
+/**
+Encode significant pass
+*/
+static void opj_t1_enc_sigpass( opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 orient,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 cblksty);
+
+/**
+Decode significant pass
+*/
+static void opj_t1_dec_sigpass_raw(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient,
+ OPJ_INT32 cblksty);
+static void opj_t1_dec_sigpass_mqc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient);
+static void opj_t1_dec_sigpass_mqc_vsc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient);
+
+
+
+/**
+Encode refinement pass
+*/
+static void opj_t1_enc_refpass_step(opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc);
+
+
+/**
+Encode refinement pass
+*/
+static void opj_t1_enc_refpass( opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 cblksty);
+
+/**
+Decode refinement pass
+*/
+static void opj_t1_dec_refpass_raw(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 cblksty);
+static void opj_t1_dec_refpass_mqc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno);
+static void opj_t1_dec_refpass_mqc_vsc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno);
+
+
+/**
+Decode refinement pass
+*/
+#if 0
+static void opj_t1_dec_refpass_step(opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc);
+#endif
+
+static INLINE void opj_t1_dec_refpass_step_raw(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_INT32 vsc);
+static INLINE void opj_t1_dec_refpass_step_mqc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf);
+static INLINE void opj_t1_dec_refpass_step_mqc_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_INT32 vsc);
+
+
+
+/**
+Encode clean-up pass
+*/
+static void opj_t1_enc_clnpass_step(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_UINT32 partial,
+ OPJ_UINT32 vsc);
+/**
+Decode clean-up pass
+*/
+static void opj_t1_dec_clnpass_step_partial(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf);
+static void opj_t1_dec_clnpass_step(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf);
+static void opj_t1_dec_clnpass_step_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 partial,
+ OPJ_INT32 vsc);
+/**
+Encode clean-up pass
+*/
+static void opj_t1_enc_clnpass(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 orient,
+ OPJ_INT32 *nmsedec,
+ OPJ_UINT32 cblksty);
+/**
+Decode clean-up pass
+*/
+static void opj_t1_dec_clnpass(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient,
+ OPJ_INT32 cblksty);
+
+static OPJ_FLOAT64 opj_t1_getwmsedec(
+ OPJ_INT32 nmsedec,
+ OPJ_UINT32 compno,
+ OPJ_UINT32 level,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 qmfbid,
+ OPJ_FLOAT64 stepsize,
+ OPJ_UINT32 numcomps,
+ const OPJ_FLOAT64 * mct_norms);
+
+static void opj_t1_encode_cblk( opj_t1_t *t1,
+ opj_tcd_cblk_enc_t* cblk,
+ OPJ_UINT32 orient,
+ OPJ_UINT32 compno,
+ OPJ_UINT32 level,
+ OPJ_UINT32 qmfbid,
+ OPJ_FLOAT64 stepsize,
+ OPJ_UINT32 cblksty,
+ OPJ_UINT32 numcomps,
+ opj_tcd_tile_t * tile,
+ const OPJ_FLOAT64 * mct_norms);
+
+/**
+Decode 1 code-block
+@param t1 T1 handle
+@param cblk Code-block coding parameters
+@param orient
+@param roishift Region of interest shifting value
+@param cblksty Code-block style
+*/
+static OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1,
+ opj_tcd_cblk_dec_t* cblk,
+ OPJ_UINT32 orient,
+ OPJ_UINT32 roishift,
+ OPJ_UINT32 cblksty);
+
+OPJ_BOOL opj_t1_allocate_buffers( opj_t1_t *t1,
+ OPJ_UINT32 w,
+ OPJ_UINT32 h);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) {
+ return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
+}
+
+OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {
+ return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) {
+ OPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
+ OPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
+ return (tmp2);
+}
+
+OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) {
+ return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
+ if (bitpos > T1_NMSEDEC_FRACBITS) {
+ return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+ }
+
+ return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
+ if (bitpos > T1_NMSEDEC_FRACBITS) {
+ return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+ }
+
+ return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) {
+ opj_flag_t *np = flagsp - stride;
+ opj_flag_t *sp = flagsp + stride;
+
+ static const opj_flag_t mod[] = {
+ T1_SIG_S, T1_SIG_S|T1_SGN_S,
+ T1_SIG_E, T1_SIG_E|T1_SGN_E,
+ T1_SIG_W, T1_SIG_W|T1_SGN_W,
+ T1_SIG_N, T1_SIG_N|T1_SGN_N
+ };
+
+ np[-1] |= T1_SIG_SE;
+ np[0] |= mod[s];
+ np[1] |= T1_SIG_SW;
+
+ flagsp[-1] |= mod[s+2];
+ flagsp[0] |= T1_SIG;
+ flagsp[1] |= mod[s+4];
+
+ sp[-1] |= T1_SIG_NE;
+ sp[0] |= mod[s+6];
+ sp[1] |= T1_SIG_NW;
+}
+
+void opj_t1_enc_sigpass_step( opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc
+ )
+{
+ OPJ_INT32 v;
+ OPJ_UINT32 flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+ if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+ v = opj_int_abs(*datap) & one ? 1 : 0;
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient)); /* ESSAI */
+ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
+ opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+ } else {
+ opj_mqc_encode(mqc, (OPJ_UINT32)v);
+ }
+ if (v) {
+ v = *datap < 0 ? 1 : 0;
+ *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag)); /* ESSAI */
+ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
+ opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+ } else {
+ opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
+ }
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ *flagsp |= T1_VISIT;
+ }
+}
+
+
+static INLINE void opj_t1_dec_sigpass_step_raw(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 vsc)
+{
+ OPJ_INT32 v, flag;
+ opj_raw_t *raw = t1->raw; /* RAW component */
+ OPJ_ARG_NOT_USED(orient);
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+ if (opj_raw_decode(raw)) {
+ v = (OPJ_INT32)opj_raw_decode(raw); /* ESSAI */
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ *flagsp |= T1_VISIT;
+ }
+}
+
+INLINE void opj_t1_dec_sigpass_step_mqc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf)
+{
+ OPJ_INT32 v, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = *flagsp;
+ if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+ if (opj_mqc_decode(mqc)) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ *flagsp |= T1_VISIT;
+ }
+} /* VSC and BYPASS by Antonin */
+
+INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 vsc)
+{
+ OPJ_INT32 v, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+ if (opj_mqc_decode(mqc)) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ *flagsp |= T1_VISIT;
+ }
+} /* VSC and BYPASS by Antonin */
+
+
+
+void opj_t1_enc_sigpass(opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 orient,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 cblksty
+ )
+{
+ OPJ_UINT32 i, j, k, vsc;
+ OPJ_INT32 one;
+
+ *nmsedec = 0;
+ one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_enc_sigpass_step(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ orient,
+ bpno,
+ one,
+ nmsedec,
+ type,
+ vsc);
+ }
+ }
+ }
+}
+
+void opj_t1_dec_sigpass_raw(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient,
+ OPJ_INT32 cblksty)
+{
+ OPJ_INT32 one, half, oneplushalf, vsc;
+ OPJ_UINT32 i, j, k;
+ one = 1 << bpno;
+ half = one >> 1;
+ oneplushalf = one | half;
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_dec_sigpass_step_raw(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ orient,
+ oneplushalf,
+ vsc);
+ }
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+void opj_t1_dec_sigpass_mqc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient)
+{
+ OPJ_INT32 one, half, oneplushalf;
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 *data1 = t1->data;
+ opj_flag_t *flags1 = &t1->flags[1];
+ one = 1 << bpno;
+ half = one >> 1;
+ oneplushalf = one | half;
+ for (k = 0; k < (t1->h & ~3u); k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ }
+ data1 += t1->w << 2;
+ flags1 += t1->flags_stride << 2;
+ }
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ for (j = k; j < t1->h; ++j) {
+ flags2 += t1->flags_stride;
+ opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+void opj_t1_dec_sigpass_mqc_vsc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient)
+{
+ OPJ_INT32 one, half, oneplushalf, vsc;
+ OPJ_UINT32 i, j, k;
+ one = 1 << bpno;
+ half = one >> 1;
+ oneplushalf = one | half;
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
+ opj_t1_dec_sigpass_step_mqc_vsc(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ orient,
+ oneplushalf,
+ vsc);
+ }
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+
+
+void opj_t1_enc_refpass_step( opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc)
+{
+ OPJ_INT32 v;
+ OPJ_UINT32 flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+ if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+ *nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+ v = opj_int_abs(*datap) & one ? 1 : 0;
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag)); /* ESSAI */
+ if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
+ opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
+ } else {
+ opj_mqc_encode(mqc, (OPJ_UINT32)v);
+ }
+ *flagsp |= T1_REFINE;
+ }
+}
+
+INLINE void opj_t1_dec_refpass_step_raw(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_INT32 vsc)
+{
+ OPJ_INT32 v, t, flag;
+
+ opj_raw_t *raw = t1->raw; /* RAW component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+ v = (OPJ_INT32)opj_raw_decode(raw);
+ t = v ? poshalf : neghalf;
+ *datap += *datap < 0 ? -t : t;
+ *flagsp |= T1_REFINE;
+ }
+} /* VSC and BYPASS by Antonin */
+
+INLINE void opj_t1_dec_refpass_step_mqc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf)
+{
+ OPJ_INT32 v, t, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = *flagsp;
+ if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag)); /* ESSAI */
+ v = opj_mqc_decode(mqc);
+ t = v ? poshalf : neghalf;
+ *datap += *datap < 0 ? -t : t;
+ *flagsp |= T1_REFINE;
+ }
+} /* VSC and BYPASS by Antonin */
+
+INLINE void opj_t1_dec_refpass_step_mqc_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_INT32 vsc)
+{
+ OPJ_INT32 v, t, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag)); /* ESSAI */
+ v = opj_mqc_decode(mqc);
+ t = v ? poshalf : neghalf;
+ *datap += *datap < 0 ? -t : t;
+ *flagsp |= T1_REFINE;
+ }
+} /* VSC and BYPASS by Antonin */
+
+
+void opj_t1_enc_refpass(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 *nmsedec,
+ OPJ_BYTE type,
+ OPJ_UINT32 cblksty)
+{
+ OPJ_UINT32 i, j, k, vsc;
+ OPJ_INT32 one;
+
+ *nmsedec = 0;
+ one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_enc_refpass_step(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ bpno,
+ one,
+ nmsedec,
+ type,
+ vsc);
+ }
+ }
+ }
+}
+
+void opj_t1_dec_refpass_raw(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 cblksty)
+{
+ OPJ_INT32 one, poshalf, neghalf;
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 vsc;
+ one = 1 << bpno;
+ poshalf = one >> 1;
+ neghalf = bpno > 0 ? -poshalf : -1;
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_dec_refpass_step_raw(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ poshalf,
+ neghalf,
+ vsc);
+ }
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+void opj_t1_dec_refpass_mqc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno)
+{
+ OPJ_INT32 one, poshalf, neghalf;
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 *data1 = t1->data;
+ opj_flag_t *flags1 = &t1->flags[1];
+ one = 1 << bpno;
+ poshalf = one >> 1;
+ neghalf = bpno > 0 ? -poshalf : -1;
+ for (k = 0; k < (t1->h & ~3u); k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+ data2 += t1->w;
+ }
+ data1 += t1->w << 2;
+ flags1 += t1->flags_stride << 2;
+ }
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ for (j = k; j < t1->h; ++j) {
+ flags2 += t1->flags_stride;
+ opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+ data2 += t1->w;
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+void opj_t1_dec_refpass_mqc_vsc(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno)
+{
+ OPJ_INT32 one, poshalf, neghalf;
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 vsc;
+ one = 1 << bpno;
+ poshalf = one >> 1;
+ neghalf = bpno > 0 ? -poshalf : -1;
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ for (j = k; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_dec_refpass_step_mqc_vsc(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ poshalf,
+ neghalf,
+ vsc);
+ }
+ }
+ }
+} /* VSC and BYPASS by Antonin */
+
+
+void opj_t1_enc_clnpass_step(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_INT32 one,
+ OPJ_INT32 *nmsedec,
+ OPJ_UINT32 partial,
+ OPJ_UINT32 vsc)
+{
+ OPJ_INT32 v;
+ OPJ_UINT32 flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
+ if (partial) {
+ goto LABEL_PARTIAL;
+ }
+ if (!(*flagsp & (T1_SIG | T1_VISIT))) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
+ v = opj_int_abs(*datap) & one ? 1 : 0;
+ opj_mqc_encode(mqc, (OPJ_UINT32)v);
+ if (v) {
+LABEL_PARTIAL:
+ *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno + T1_NMSEDEC_FRACBITS));
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
+ v = *datap < 0 ? 1 : 0;
+ opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ }
+ *flagsp &= ~T1_VISIT;
+}
+
+static void opj_t1_dec_clnpass_step_partial(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf)
+{
+ OPJ_INT32 v, flag;
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ OPJ_ARG_NOT_USED(orient);
+
+ flag = *flagsp;
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ *flagsp &= ~T1_VISIT;
+} /* VSC and BYPASS by Antonin */
+
+static void opj_t1_dec_clnpass_step(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf)
+{
+ OPJ_INT32 v, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = *flagsp;
+ if (!(flag & (T1_SIG | T1_VISIT))) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+ if (opj_mqc_decode(mqc)) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ }
+ *flagsp &= ~T1_VISIT;
+} /* VSC and BYPASS by Antonin */
+
+static void opj_t1_dec_clnpass_step_vsc(
+ opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_INT32 partial,
+ OPJ_INT32 vsc)
+{
+ OPJ_INT32 v, flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if (partial) {
+ goto LABEL_PARTIAL;
+ }
+ if (!(flag & (T1_SIG | T1_VISIT))) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
+ if (opj_mqc_decode(mqc)) {
+LABEL_PARTIAL:
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
+ }
+ }
+ *flagsp &= ~T1_VISIT;
+}
+
+void opj_t1_enc_clnpass(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 orient,
+ OPJ_INT32 *nmsedec,
+ OPJ_UINT32 cblksty)
+{
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 one;
+ OPJ_UINT32 agg, runlen, vsc;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ *nmsedec = 0;
+ one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ if (k + 3 < t1->h) {
+ if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+ agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || (MACRO_t1_flags(1 + k + 3,1 + i)
+ & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+ } else {
+ agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+ }
+ } else {
+ agg = 0;
+ }
+ if (agg) {
+ for (runlen = 0; runlen < 4; ++runlen) {
+ if (opj_int_abs(t1->data[((k + runlen)*t1->w) + i]) & one)
+ break;
+ }
+ opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+ opj_mqc_encode(mqc, runlen != 4);
+ if (runlen == 4) {
+ continue;
+ }
+ opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+ opj_mqc_encode(mqc, runlen >> 1);
+ opj_mqc_encode(mqc, runlen & 1);
+ } else {
+ runlen = 0;
+ }
+ for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
+ vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
+ opj_t1_enc_clnpass_step(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ orient,
+ bpno,
+ one,
+ nmsedec,
+ agg && (j == k + runlen),
+ vsc);
+ }
+ }
+ }
+}
+
+static void opj_t1_dec_clnpass(
+ opj_t1_t *t1,
+ OPJ_INT32 bpno,
+ OPJ_INT32 orient,
+ OPJ_INT32 cblksty)
+{
+ OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc;
+ OPJ_UINT32 i, j, k;
+ OPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ one = 1 << bpno;
+ half = one >> 1;
+ oneplushalf = one | half;
+ if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+ for (k = 0; k < t1->h; k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ if (k + 3 < t1->h) {
+ agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || (MACRO_t1_flags(1 + k + 3,1 + i)
+ & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+ } else {
+ agg = 0;
+ }
+ if (agg) {
+ opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+ if (!opj_mqc_decode(mqc)) {
+ continue;
+ }
+ opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+ runlen = opj_mqc_decode(mqc);
+ runlen = (runlen << 1) | opj_mqc_decode(mqc);
+ } else {
+ runlen = 0;
+ }
+ for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
+ vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
+ opj_t1_dec_clnpass_step_vsc(
+ t1,
+ &t1->flags[((j+1) * t1->flags_stride) + i + 1],
+ &t1->data[(j * t1->w) + i],
+ orient,
+ oneplushalf,
+ agg && (j == k + (OPJ_UINT32)runlen),
+ vsc);
+ }
+ }
+ }
+ } else {
+ OPJ_INT32 *data1 = t1->data;
+ opj_flag_t *flags1 = &t1->flags[1];
+ for (k = 0; k < (t1->h & ~3u); k += 4) {
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
+ || MACRO_t1_flags(1 + k + 3,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
+ if (agg) {
+ opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+ if (!opj_mqc_decode(mqc)) {
+ continue;
+ }
+ opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+ runlen = opj_mqc_decode(mqc);
+ runlen = (runlen << 1) | opj_mqc_decode(mqc);
+ flags2 += (OPJ_UINT32)runlen * t1->flags_stride;
+ data2 += (OPJ_UINT32)runlen * t1->w;
+ for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
+ flags2 += t1->flags_stride;
+ if (agg && (j == k + (OPJ_UINT32)runlen)) {
+ opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
+ } else {
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ }
+ data2 += t1->w;
+ }
+ } else {
+ flags2 += t1->flags_stride;
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ flags2 += t1->flags_stride;
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ }
+ }
+ data1 += t1->w << 2;
+ flags1 += t1->flags_stride << 2;
+ }
+ for (i = 0; i < t1->w; ++i) {
+ OPJ_INT32 *data2 = data1 + i;
+ opj_flag_t *flags2 = flags1 + i;
+ for (j = k; j < t1->h; ++j) {
+ flags2 += t1->flags_stride;
+ opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+ data2 += t1->w;
+ }
+ }
+ }
+
+ if (segsym) {
+ OPJ_INT32 v = 0;
+ opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+ v = opj_mqc_decode(mqc);
+ v = (v << 1) | opj_mqc_decode(mqc);
+ v = (v << 1) | opj_mqc_decode(mqc);
+ v = (v << 1) | opj_mqc_decode(mqc);
+ /*
+ if (v!=0xa) {
+ opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
+ }
+ */
+ }
+} /* VSC and BYPASS by Antonin */
+
+
+/** mod fixed_quality */
+static OPJ_FLOAT64 opj_t1_getwmsedec(
+ OPJ_INT32 nmsedec,
+ OPJ_UINT32 compno,
+ OPJ_UINT32 level,
+ OPJ_UINT32 orient,
+ OPJ_INT32 bpno,
+ OPJ_UINT32 qmfbid,
+ OPJ_FLOAT64 stepsize,
+ OPJ_UINT32 numcomps,
+ const OPJ_FLOAT64 * mct_norms)
+{
+ OPJ_FLOAT64 w1 = 1, w2, wmsedec;
+ OPJ_ARG_NOT_USED(numcomps);
+
+ if (mct_norms) {
+ w1 = mct_norms[compno];
+ }
+
+ if (qmfbid == 1) {
+ w2 = opj_dwt_getnorm(level, orient);
+ } else { /* if (qmfbid == 0) */
+ w2 = opj_dwt_getnorm_real(level, orient);
+ }
+
+ wmsedec = w1 * w2 * stepsize * (1 << bpno);
+ wmsedec *= wmsedec * nmsedec / 8192.0;
+
+ return wmsedec;
+}
+
+OPJ_BOOL opj_t1_allocate_buffers(
+ opj_t1_t *t1,
+ OPJ_UINT32 w,
+ OPJ_UINT32 h)
+{
+ OPJ_UINT32 datasize=w * h;
+ OPJ_UINT32 flagssize;
+
+ if(datasize > t1->datasize){
+ opj_aligned_free(t1->data);
+ t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
+ if(!t1->data){
+ return OPJ_FALSE;
+ }
+ t1->datasize=datasize;
+ }
+ memset(t1->data,0,datasize * sizeof(OPJ_INT32));
+
+ t1->flags_stride=w+2;
+ flagssize=t1->flags_stride * (h+2);
+
+ if(flagssize > t1->flagssize){
+ opj_aligned_free(t1->flags);
+ t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));
+ if(!t1->flags){
+ return OPJ_FALSE;
+ }
+ t1->flagssize=flagssize;
+ }
+ memset(t1->flags,0,flagssize * sizeof(opj_flag_t));
+
+ t1->w=w;
+ t1->h=h;
+
+ return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/* ----------------------------------------------------------------------- */
+/**
+ * Creates a new Tier 1 handle
+ * and initializes the look-up tables of the Tier-1 coder/decoder
+ * @return a new T1 handle if successful, returns NULL otherwise
+*/
+opj_t1_t* opj_t1_create()
+{
+ opj_t1_t *l_t1 = 00;
+
+ l_t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
+ if (!l_t1) {
+ return 00;
+ }
+ memset(l_t1,0,sizeof(opj_t1_t));
+
+ /* create MQC and RAW handles */
+ l_t1->mqc = opj_mqc_create();
+ if (! l_t1->mqc) {
+ opj_t1_destroy(l_t1);
+ return 00;
+ }
+
+ l_t1->raw = opj_raw_create();
+ if (! l_t1->raw) {
+ opj_t1_destroy(l_t1);
+ return 00;
+ }
+
+ return l_t1;
+}
+
+
+/**
+ * Destroys a previously created T1 handle
+ *
+ * @param p_t1 Tier 1 handle to destroy
+*/
+void opj_t1_destroy(opj_t1_t *p_t1)
+{
+ if (! p_t1) {
+ return;
+ }
+
+ /* destroy MQC and RAW handles */
+ opj_mqc_destroy(p_t1->mqc);
+ p_t1->mqc = 00;
+ opj_raw_destroy(p_t1->raw);
+ p_t1->raw = 00;
+
+ if (p_t1->data) {
+ opj_aligned_free(p_t1->data);
+ p_t1->data = 00;
+ }
+
+ if (p_t1->flags) {
+ opj_aligned_free(p_t1->flags);
+ p_t1->flags = 00;
+ }
+
+ opj_free(p_t1);
+}
+
+OPJ_BOOL opj_t1_decode_cblks( opj_t1_t* t1,
+ opj_tcd_tilecomp_t* tilec,
+ opj_tccp_t* tccp
+ )
+{
+ OPJ_UINT32 resno, bandno, precno, cblkno;
+ OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+ for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
+ opj_tcd_resolution_t* res = &tilec->resolutions[resno];
+
+ for (bandno = 0; bandno < res->numbands; ++bandno) {
+ opj_tcd_band_t* restrict band = &res->bands[bandno];
+
+ for (precno = 0; precno < res->pw * res->ph; ++precno) {
+ opj_tcd_precinct_t* precinct = &band->precincts[precno];
+
+ for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
+ opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
+ OPJ_INT32* restrict datap;
+ /*void* restrict tiledp;*/
+ OPJ_UINT32 cblk_w, cblk_h;
+ OPJ_INT32 x, y;
+ OPJ_UINT32 i, j;
+
+ if (OPJ_FALSE == opj_t1_decode_cblk(
+ t1,
+ cblk,
+ band->bandno,
+ (OPJ_UINT32)tccp->roishift,
+ tccp->cblksty)) {
+ return OPJ_FALSE;
+ }
+
+ x = cblk->x0 - band->x0;
+ y = cblk->y0 - band->y0;
+ if (band->bandno & 1) {
+ opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+ x += pres->x1 - pres->x0;
+ }
+ if (band->bandno & 2) {
+ opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+ y += pres->y1 - pres->y0;
+ }
+
+ datap=t1->data;
+ cblk_w = t1->w;
+ cblk_h = t1->h;
+
+ if (tccp->roishift) {
+ OPJ_INT32 thresh = 1 << tccp->roishift;
+ for (j = 0; j < cblk_h; ++j) {
+ for (i = 0; i < cblk_w; ++i) {
+ OPJ_INT32 val = datap[(j * cblk_w) + i];
+ OPJ_INT32 mag = abs(val);
+ if (mag >= thresh) {
+ mag >>= tccp->roishift;
+ datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
+ }
+ }
+ }
+ }
+
+ /*tiledp=(void*)&tilec->data[(y * tile_w) + x];*/
+ if (tccp->qmfbid == 1) {
+ OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+ for (j = 0; j < cblk_h; ++j) {
+ for (i = 0; i < cblk_w; ++i) {
+ OPJ_INT32 tmp = datap[(j * cblk_w) + i];
+ ((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2;
+ }
+ }
+ } else { /* if (tccp->qmfbid == 0) */
+ OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+ for (j = 0; j < cblk_h; ++j) {
+ OPJ_FLOAT32* restrict tiledp2 = tiledp;
+ for (i = 0; i < cblk_w; ++i) {
+ OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize;
+ *tiledp2 = tmp;
+ datap++;
+ tiledp2++;
+ /*float tmp = datap[(j * cblk_w) + i] * band->stepsize;
+ ((float*)tiledp)[(j * tile_w) + i] = tmp;*/
+
+ }
+ tiledp += tile_w;
+ }
+ }
+ /*opj_free(cblk->data);
+ opj_free(cblk->segs);*/
+ /*cblk->segs = 00;*/
+ } /* cblkno */
+ /*opj_free(precinct->cblks.dec);*/
+ } /* precno */
+ } /* bandno */
+ } /* resno */
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
+ opj_tcd_cblk_dec_t* cblk,
+ OPJ_UINT32 orient,
+ OPJ_UINT32 roishift,
+ OPJ_UINT32 cblksty)
+{
+ opj_raw_t *raw = t1->raw; /* RAW component */
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ OPJ_INT32 bpno;
+ OPJ_UINT32 passtype;
+ OPJ_UINT32 segno, passno;
+ OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
+
+ if(!opj_t1_allocate_buffers(
+ t1,
+ (OPJ_UINT32)(cblk->x1 - cblk->x0),
+ (OPJ_UINT32)(cblk->y1 - cblk->y0)))
+ {
+ return OPJ_FALSE;
+ }
+
+ bpno = (OPJ_INT32)(roishift + cblk->numbps - 1);
+ passtype = 2;
+
+ opj_mqc_resetstates(mqc);
+ opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+ opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+ opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+
+ for (segno = 0; segno < cblk->real_num_segs; ++segno) {
+ opj_tcd_seg_t *seg = &cblk->segs[segno];
+
+ /* BYPASS mode */
+ type = ((bpno <= ((OPJ_INT32) (cblk->numbps) - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+ /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
+ if(seg->data == 00){
+ continue;
+ }
+ if (type == T1_TYPE_RAW) {
+ opj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
+ } else {
+ if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ for (passno = 0; passno < seg->real_num_passes; ++passno) {
+ switch (passtype) {
+ case 0:
+ if (type == T1_TYPE_RAW) {
+ opj_t1_dec_sigpass_raw(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
+ } else {
+ if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+ opj_t1_dec_sigpass_mqc_vsc(t1, bpno+1, (OPJ_INT32)orient);
+ } else {
+ opj_t1_dec_sigpass_mqc(t1, bpno+1, (OPJ_INT32)orient);
+ }
+ }
+ break;
+ case 1:
+ if (type == T1_TYPE_RAW) {
+ opj_t1_dec_refpass_raw(t1, bpno+1, (OPJ_INT32)cblksty);
+ } else {
+ if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+ opj_t1_dec_refpass_mqc_vsc(t1, bpno+1);
+ } else {
+ opj_t1_dec_refpass_mqc(t1, bpno+1);
+ }
+ }
+ break;
+ case 2:
+ opj_t1_dec_clnpass(t1, bpno+1, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
+ break;
+ }
+
+ if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
+ opj_mqc_resetstates(mqc);
+ opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+ opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+ opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+ }
+ if (++passtype == 3) {
+ passtype = 0;
+ bpno--;
+ }
+ }
+ }
+ return OPJ_TRUE;
+}
+
+
+
+
+OPJ_BOOL opj_t1_encode_cblks( opj_t1_t *t1,
+ opj_tcd_tile_t *tile,
+ opj_tcp_t *tcp,
+ const OPJ_FLOAT64 * mct_norms
+ )
+{
+ OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+
+ tile->distotile = 0; /* fixed_quality */
+
+ for (compno = 0; compno < tile->numcomps; ++compno) {
+ opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
+ opj_tccp_t* tccp = &tcp->tccps[compno];
+ OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+
+ for (resno = 0; resno < tilec->numresolutions; ++resno) {
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+ for (bandno = 0; bandno < res->numbands; ++bandno) {
+ opj_tcd_band_t* restrict band = &res->bands[bandno];
+ OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));
+
+ for (precno = 0; precno < res->pw * res->ph; ++precno) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
+ opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
+ OPJ_INT32 * restrict datap;
+ OPJ_INT32* restrict tiledp;
+ OPJ_UINT32 cblk_w;
+ OPJ_UINT32 cblk_h;
+ OPJ_UINT32 i, j;
+
+ OPJ_INT32 x = cblk->x0 - band->x0;
+ OPJ_INT32 y = cblk->y0 - band->y0;
+ if (band->bandno & 1) {
+ opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+ x += pres->x1 - pres->x0;
+ }
+ if (band->bandno & 2) {
+ opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+ y += pres->y1 - pres->y0;
+ }
+
+ if(!opj_t1_allocate_buffers(
+ t1,
+ (OPJ_UINT32)(cblk->x1 - cblk->x0),
+ (OPJ_UINT32)(cblk->y1 - cblk->y0)))
+ {
+ return OPJ_FALSE;
+ }
+
+ datap=t1->data;
+ cblk_w = t1->w;
+ cblk_h = t1->h;
+
+ tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+ if (tccp->qmfbid == 1) {
+ for (j = 0; j < cblk_h; ++j) {
+ for (i = 0; i < cblk_w; ++i) {
+ OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
+ datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
+ }
+ }
+ } else { /* if (tccp->qmfbid == 0) */
+ for (j = 0; j < cblk_h; ++j) {
+ for (i = 0; i < cblk_w; ++i) {
+ OPJ_INT32 tmp = tiledp[(j * tile_w) + i];
+ datap[(j * cblk_w) + i] =
+ opj_int_fix_mul(
+ tmp,
+ bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
+ }
+ }
+ }
+
+ opj_t1_encode_cblk(
+ t1,
+ cblk,
+ band->bandno,
+ compno,
+ tilec->numresolutions - 1 - resno,
+ tccp->qmfbid,
+ band->stepsize,
+ tccp->cblksty,
+ tile->numcomps,
+ tile,
+ mct_norms);
+
+ } /* cblkno */
+ } /* precno */
+ } /* bandno */
+ } /* resno */
+ } /* compno */
+ return OPJ_TRUE;
+}
+
+/** mod fixed_quality */
+void opj_t1_encode_cblk(opj_t1_t *t1,
+ opj_tcd_cblk_enc_t* cblk,
+ OPJ_UINT32 orient,
+ OPJ_UINT32 compno,
+ OPJ_UINT32 level,
+ OPJ_UINT32 qmfbid,
+ OPJ_FLOAT64 stepsize,
+ OPJ_UINT32 cblksty,
+ OPJ_UINT32 numcomps,
+ opj_tcd_tile_t * tile,
+ const OPJ_FLOAT64 * mct_norms)
+{
+ OPJ_FLOAT64 cumwmsedec = 0.0;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ OPJ_UINT32 passno;
+ OPJ_INT32 bpno;
+ OPJ_UINT32 passtype;
+ OPJ_INT32 nmsedec = 0;
+ OPJ_INT32 max;
+ OPJ_UINT32 i;
+ OPJ_BYTE type = T1_TYPE_MQ;
+ OPJ_FLOAT64 tempwmsedec;
+
+ max = 0;
+ for (i = 0; i < t1->w * t1->h; ++i) {
+ OPJ_INT32 tmp = abs(t1->data[i]);
+ max = opj_int_max(max, tmp);
+ }
+
+ cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;
+
+ bpno = (OPJ_INT32)(cblk->numbps - 1);
+ passtype = 2;
+
+ opj_mqc_resetstates(mqc);
+ opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+ opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+ opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+ opj_mqc_init_enc(mqc, cblk->data);
+
+ for (passno = 0; bpno >= 0; ++passno) {
+ opj_tcd_pass_t *pass = &cblk->passes[passno];
+ OPJ_UINT32 correction = 3;
+ type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+
+ switch (passtype) {
+ case 0:
+ opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
+ break;
+ case 1:
+ opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
+ break;
+ case 2:
+ opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
+ /* code switch SEGMARK (i.e. SEGSYM) */
+ if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
+ opj_mqc_segmark_enc(mqc);
+ break;
+ }
+
+ /* fixed_quality */
+ tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms) ;
+ cumwmsedec += tempwmsedec;
+ tile->distotile += tempwmsedec;
+
+ /* Code switch "RESTART" (i.e. TERMALL) */
+ if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) && (bpno - 1 < 0))) {
+ if (type == T1_TYPE_RAW) {
+ opj_mqc_flush(mqc);
+ correction = 1;
+ /* correction = mqc_bypass_flush_enc(); */
+ } else { /* correction = mqc_restart_enc(); */
+ opj_mqc_flush(mqc);
+ correction = 1;
+ }
+ pass->term = 1;
+ } else {
+ if (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0))
+ || ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
+ if (type == T1_TYPE_RAW) {
+ opj_mqc_flush(mqc);
+ correction = 1;
+ /* correction = mqc_bypass_flush_enc(); */
+ } else { /* correction = mqc_restart_enc(); */
+ opj_mqc_flush(mqc);
+ correction = 1;
+ }
+ pass->term = 1;
+ } else {
+ pass->term = 0;
+ }
+ }
+
+ if (++passtype == 3) {
+ passtype = 0;
+ bpno--;
+ }
+
+ if (pass->term && bpno > 0) {
+ type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+ if (type == T1_TYPE_RAW)
+ opj_mqc_bypass_init_enc(mqc);
+ else
+ opj_mqc_restart_init_enc(mqc);
+ }
+
+ pass->distortiondec = cumwmsedec;
+ pass->rate = opj_mqc_numbytes(mqc) + correction; /* FIXME */
+
+ /* Code-switch "RESET" */
+ if (cblksty & J2K_CCP_CBLKSTY_RESET)
+ opj_mqc_reset_enc(mqc);
+ }
+
+ /* Code switch "ERTERM" (i.e. PTERM) */
+ if (cblksty & J2K_CCP_CBLKSTY_PTERM)
+ opj_mqc_erterm_enc(mqc);
+ else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
+ opj_mqc_flush(mqc);
+
+ cblk->totalpasses = passno;
+
+ for (passno = 0; passno<cblk->totalpasses; passno++) {
+ opj_tcd_pass_t *pass = &cblk->passes[passno];
+ if (pass->rate > opj_mqc_numbytes(mqc))
+ pass->rate = opj_mqc_numbytes(mqc);
+ /*Preventing generation of FF as last data byte of a pass*/
+ if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
+ pass->rate--;
+ }
+ pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
+ }
+}
+
+#if 0
+void opj_t1_dec_refpass_step( opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_INT32 poshalf,
+ OPJ_INT32 neghalf,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc)
+{
+ OPJ_INT32 t;
+ OPJ_UINT32 v,flag;
+
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+ opj_raw_t *raw = t1->raw; /* RAW component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag)); /* ESSAI */
+ if (type == T1_TYPE_RAW) {
+ v = opj_raw_decode(raw);
+ } else {
+ v = opj_mqc_decode(mqc);
+ }
+ t = v ? poshalf : neghalf;
+ *datap += *datap < 0 ? -t : t;
+ *flagsp |= T1_REFINE;
+ }
+} /* VSC and BYPASS by Antonin */
+#endif
+
+
+
+#if 0
+void opj_t1_dec_sigpass_step( opj_t1_t *t1,
+ opj_flag_t *flagsp,
+ OPJ_INT32 *datap,
+ OPJ_UINT32 orient,
+ OPJ_INT32 oneplushalf,
+ OPJ_BYTE type,
+ OPJ_UINT32 vsc)
+{
+ OPJ_UINT32 v, flag;
+
+ opj_raw_t *raw = t1->raw; /* RAW component */
+ opj_mqc_t *mqc = t1->mqc; /* MQC component */
+
+ flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
+ if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
+ if (type == T1_TYPE_RAW) {
+ if (opj_raw_decode(raw)) {
+ v = opj_raw_decode(raw); /* ESSAI */
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, v, t1->flags_stride);
+ }
+ } else {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
+ if (opj_mqc_decode(mqc)) {
+ opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
+ v = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag);
+ *datap = v ? -oneplushalf : oneplushalf;
+ opj_t1_updateflags(flagsp, v, t1->flags_stride);
+ }
+ }
+ *flagsp |= T1_VISIT;
+ }
+} /* VSC and BYPASS by Antonin */
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h
new file mode 100644
index 0000000000..e5be70ed5b
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1.h
@@ -0,0 +1,163 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __T1_H
+#define __T1_H
+/**
+@file t1.h
+@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
+
+The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
+in T1.C are used by some function in TCD.C.
+*/
+
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/* ----------------------------------------------------------------------- */
+#define T1_NMSEDEC_BITS 7
+
+#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
+#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
+#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
+#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
+#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
+#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
+#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
+#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
+#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
+#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
+
+#define T1_SGN_N 0x0100
+#define T1_SGN_E 0x0200
+#define T1_SGN_S 0x0400
+#define T1_SGN_W 0x0800
+#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
+
+#define T1_SIG 0x1000
+#define T1_REFINE 0x2000
+#define T1_VISIT 0x4000
+
+#define T1_NUMCTXS_ZC 9
+#define T1_NUMCTXS_SC 5
+#define T1_NUMCTXS_MAG 3
+#define T1_NUMCTXS_AGG 1
+#define T1_NUMCTXS_UNI 1
+
+#define T1_CTXNO_ZC 0
+#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
+#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
+#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
+#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
+#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
+
+#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
+
+#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
+#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
+
+/* ----------------------------------------------------------------------- */
+
+typedef OPJ_INT16 opj_flag_t;
+
+/**
+Tier-1 coding (coding of code-block coefficients)
+*/
+typedef struct opj_t1 {
+
+ /** MQC component */
+ opj_mqc_t *mqc;
+ /** RAW component */
+ opj_raw_t *raw;
+
+ OPJ_INT32 *data;
+ opj_flag_t *flags;
+ OPJ_UINT32 w;
+ OPJ_UINT32 h;
+ OPJ_UINT32 datasize;
+ OPJ_UINT32 flagssize;
+ OPJ_UINT32 flags_stride;
+} opj_t1_t;
+
+#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Encode the code-blocks of a tile
+@param t1 T1 handle
+@param tile The tile to encode
+@param tcp Tile coding parameters
+@param mct_norms FIXME DOC
+*/
+OPJ_BOOL opj_t1_encode_cblks( opj_t1_t *t1,
+ opj_tcd_tile_t *tile,
+ opj_tcp_t *tcp,
+ const OPJ_FLOAT64 * mct_norms);
+
+/**
+Decode the code-blocks of a tile
+@param t1 T1 handle
+@param tilec The tile to decode
+@param tccp Tile coding parameters
+*/
+OPJ_BOOL opj_t1_decode_cblks( opj_t1_t* t1,
+ opj_tcd_tilecomp_t* tilec,
+ opj_tccp_t* tccp);
+
+
+
+/**
+ * Creates a new Tier 1 handle
+ * and initializes the look-up tables of the Tier-1 coder/decoder
+ * @return a new T1 handle if successful, returns NULL otherwise
+*/
+opj_t1_t* opj_t1_create(void);
+
+/**
+ * Destroys a previously created T1 handle
+ *
+ * @param p_t1 Tier 1 handle to destroy
+*/
+void opj_t1_destroy(opj_t1_t *p_t1);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T1_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c
new file mode 100644
index 0000000000..1997d39977
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_generate_luts.c
@@ -0,0 +1,282 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+static int t1_init_ctxno_zc(int f, int orient) {
+ int h, v, d, n, t, hv;
+ n = 0;
+ h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
+ v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
+ d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);
+
+ switch (orient) {
+ case 2:
+ t = h;
+ h = v;
+ v = t;
+ case 0:
+ case 1:
+ if (!h) {
+ if (!v) {
+ if (!d)
+ n = 0;
+ else if (d == 1)
+ n = 1;
+ else
+ n = 2;
+ } else if (v == 1) {
+ n = 3;
+ } else {
+ n = 4;
+ }
+ } else if (h == 1) {
+ if (!v) {
+ if (!d)
+ n = 5;
+ else
+ n = 6;
+ } else {
+ n = 7;
+ }
+ } else
+ n = 8;
+ break;
+ case 3:
+ hv = h + v;
+ if (!d) {
+ if (!hv) {
+ n = 0;
+ } else if (hv == 1) {
+ n = 1;
+ } else {
+ n = 2;
+ }
+ } else if (d == 1) {
+ if (!hv) {
+ n = 3;
+ } else if (hv == 1) {
+ n = 4;
+ } else {
+ n = 5;
+ }
+ } else if (d == 2) {
+ if (!hv) {
+ n = 6;
+ } else {
+ n = 7;
+ }
+ } else {
+ n = 8;
+ }
+ break;
+ }
+
+ return (T1_CTXNO_ZC + n);
+}
+
+static int t1_init_ctxno_sc(int f) {
+ int hc, vc, n;
+ n = 0;
+
+ hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+ T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
+ 1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+ (T1_SIG_E | T1_SGN_E)) +
+ ((f & (T1_SIG_W | T1_SGN_W)) ==
+ (T1_SIG_W | T1_SGN_W)), 1);
+
+ vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+ T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
+ 1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+ (T1_SIG_N | T1_SGN_N)) +
+ ((f & (T1_SIG_S | T1_SGN_S)) ==
+ (T1_SIG_S | T1_SGN_S)), 1);
+
+ if (hc < 0) {
+ hc = -hc;
+ vc = -vc;
+ }
+ if (!hc) {
+ if (vc == -1)
+ n = 1;
+ else if (!vc)
+ n = 0;
+ else
+ n = 1;
+ } else if (hc == 1) {
+ if (vc == -1)
+ n = 2;
+ else if (!vc)
+ n = 3;
+ else
+ n = 4;
+ }
+
+ return (T1_CTXNO_SC + n);
+}
+
+static int t1_init_spb(int f) {
+ int hc, vc, n;
+
+ hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+ T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
+ 1) - opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
+ (T1_SIG_E | T1_SGN_E)) +
+ ((f & (T1_SIG_W | T1_SGN_W)) ==
+ (T1_SIG_W | T1_SGN_W)), 1);
+
+ vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+ T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
+ 1) - opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
+ (T1_SIG_N | T1_SGN_N)) +
+ ((f & (T1_SIG_S | T1_SGN_S)) ==
+ (T1_SIG_S | T1_SGN_S)), 1);
+
+ if (!hc && !vc)
+ n = 0;
+ else
+ n = (!(hc > 0 || (!hc && vc > 0)));
+
+ return n;
+}
+
+static void dump_array16(int array[],int size){
+ int i;
+ --size;
+ for (i = 0; i < size; ++i) {
+ printf("0x%04x, ", array[i]);
+ if(!((i+1)&0x7))
+ printf("\n ");
+ }
+ printf("0x%04x\n};\n\n", array[size]);
+}
+
+int main(int argc, char **argv)
+{
+ int i, j;
+ double u, v, t;
+
+ int lut_ctxno_zc[1024];
+ int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
+ int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
+ int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
+ int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
+ (void)argc; (void)argv;
+
+ printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
+
+ /* lut_ctxno_zc */
+ for (j = 0; j < 4; ++j) {
+ for (i = 0; i < 256; ++i) {
+ int orient = j;
+ if (orient == 2) {
+ orient = 1;
+ } else if (orient == 1) {
+ orient = 2;
+ }
+ lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
+ }
+ }
+
+ printf("static OPJ_BYTE lut_ctxno_zc[1024] = {\n ");
+ for (i = 0; i < 1023; ++i) {
+ printf("%i, ", lut_ctxno_zc[i]);
+ if(!((i+1)&0x1f))
+ printf("\n ");
+ }
+ printf("%i\n};\n\n", lut_ctxno_zc[1023]);
+
+ /* lut_ctxno_sc */
+ printf("static OPJ_BYTE lut_ctxno_sc[256] = {\n ");
+ for (i = 0; i < 255; ++i) {
+ printf("0x%x, ", t1_init_ctxno_sc(i << 4));
+ if(!((i+1)&0xf))
+ printf("\n ");
+ }
+ printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
+
+ /* lut_spb */
+ printf("static OPJ_BYTE lut_spb[256] = {\n ");
+ for (i = 0; i < 255; ++i) {
+ printf("%i, ", t1_init_spb(i << 4));
+ if(!((i+1)&0x1f))
+ printf("\n ");
+ }
+ printf("%i\n};\n\n", t1_init_spb(255 << 4));
+
+ /* FIXME FIXME FIXME */
+ /* fprintf(stdout,"nmsedec luts:\n"); */
+ for (i = 0; i < (1 << T1_NMSEDEC_BITS); ++i) {
+ t = i / pow(2, T1_NMSEDEC_FRACBITS);
+ u = t;
+ v = t - 1.5;
+ lut_nmsedec_sig[i] =
+ opj_int_max(0,
+ (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+ lut_nmsedec_sig0[i] =
+ opj_int_max(0,
+ (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+ u = t - 1.0;
+ if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
+ v = t - 1.5;
+ } else {
+ v = t - 0.5;
+ }
+ lut_nmsedec_ref[i] =
+ opj_int_max(0,
+ (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+ lut_nmsedec_ref0[i] =
+ opj_int_max(0,
+ (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
+ }
+
+ printf("static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n ");
+ dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
+
+ printf("static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n ");
+ dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
+
+ printf("static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n ");
+ dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
+
+ printf("static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n ");
+ dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
+
+ return 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h
new file mode 100644
index 0000000000..37776b65a1
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t1_luts.h
@@ -0,0 +1,143 @@
+/* This file was automatically generated by t1_generate_luts.c */
+
+static OPJ_BYTE lut_ctxno_zc[1024] = {
+ 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8,
+ 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
+ 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
+};
+
+static OPJ_BYTE lut_ctxno_sc[256] = {
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
+ 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
+ 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
+};
+
+static OPJ_BYTE lut_spb[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
+ 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80,
+ 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680,
+ 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280,
+ 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80,
+ 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80,
+ 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
+ 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280,
+ 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80,
+ 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80,
+ 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
+};
+
+static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
+ 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
+ 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
+ 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+ 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
+ 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
+ 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
+ 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00,
+ 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780,
+ 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100,
+ 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00,
+ 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
+ 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300,
+ 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080,
+ 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80,
+ 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
+};
+
+static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
+ 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
+ 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
+ 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
+ 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
+ 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480,
+ 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
+ 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+ 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80,
+ 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80,
+ 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380,
+ 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
+};
+
+static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
+ 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
+ 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
+ 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
+ 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
+ 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500,
+ 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280,
+ 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080,
+ 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
+ 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
+ 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
+ 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+ 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
+ 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
+ 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
+ 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
+};
+
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c
new file mode 100644
index 0000000000..de054acc54
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.c
@@ -0,0 +1,1344 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);
+
+static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio);
+/**
+Variable length code for signalling delta Zil (truncation point)
+@param bio Bit Input/Output component
+@param n delta Zil
+*/
+static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n);
+static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio);
+
+/**
+Encode a packet of a tile to a destination buffer
+@param tileno Number of the tile encoded
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@param dest Destination buffer
+@param p_data_written FIXME DOC
+@param len Length of the destination buffer
+@param cstr_info Codestream information structure
+@return
+*/
+static OPJ_BOOL opj_t2_encode_packet( OPJ_UINT32 tileno,
+ opj_tcd_tile_t *tile,
+ opj_tcp_t *tcp,
+ opj_pi_iterator_t *pi,
+ OPJ_BYTE *dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 len,
+ opj_codestream_info_t *cstr_info);
+
+/**
+Decode a packet of a tile from a source buffer
+@param t2 T2 handle
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@param src Source buffer
+@param data_read FIXME DOC
+@param max_length FIXME DOC
+@param pack_info Packet information
+
+@return FIXME DOC
+*/
+static OPJ_BOOL opj_t2_decode_packet( opj_t2_t* t2,
+ opj_tcd_tile_t *tile,
+ opj_tcp_t *tcp,
+ opj_pi_iterator_t *pi,
+ OPJ_BYTE *src,
+ OPJ_UINT32 * data_read,
+ OPJ_UINT32 max_length,
+ opj_packet_info_t *pack_info);
+
+static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_tcp_t *p_tcp,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BYTE *p_src,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *p_pack_info);
+
+static OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_tcp_t *p_tcp,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BOOL * p_is_data_present,
+ OPJ_BYTE *p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *p_pack_info);
+
+static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BYTE *p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *pack_info);
+
+static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_pi_iterator_t *p_pi,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *pack_info);
+
+/**
+@param cblk
+@param index
+@param cblksty
+@param first
+*/
+static OPJ_BOOL opj_t2_init_seg( opj_tcd_cblk_dec_t* cblk,
+ OPJ_UINT32 index,
+ OPJ_UINT32 cblksty,
+ OPJ_UINT32 first);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+/* #define RESTART 0x04 */
+static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {
+ while (--n >= 0) {
+ opj_bio_write(bio, 1, 1);
+ }
+ opj_bio_write(bio, 0, 1);
+}
+
+OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio)
+{
+ OPJ_UINT32 n = 0;
+ while (opj_bio_read(bio, 1)) {
+ ++n;
+ }
+ return n;
+}
+
+void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {
+ if (n == 1) {
+ opj_bio_write(bio, 0, 1);
+ } else if (n == 2) {
+ opj_bio_write(bio, 2, 2);
+ } else if (n <= 5) {
+ opj_bio_write(bio, 0xc | (n - 3), 4);
+ } else if (n <= 36) {
+ opj_bio_write(bio, 0x1e0 | (n - 6), 9);
+ } else if (n <= 164) {
+ opj_bio_write(bio, 0xff80 | (n - 37), 16);
+ }
+}
+
+OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {
+ OPJ_UINT32 n;
+ if (!opj_bio_read(bio, 1))
+ return 1;
+ if (!opj_bio_read(bio, 1))
+ return 2;
+ if ((n = opj_bio_read(bio, 2)) != 3)
+ return (3 + n);
+ if ((n = opj_bio_read(bio, 5)) != 31)
+ return (6 + n);
+ return (37 + opj_bio_read(bio, 7));
+}
+
+/* ----------------------------------------------------------------------- */
+
+OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,
+ OPJ_UINT32 p_tile_no,
+ opj_tcd_tile_t *p_tile,
+ OPJ_UINT32 p_maxlayers,
+ OPJ_BYTE *p_dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_max_len,
+ opj_codestream_info_t *cstr_info,
+ OPJ_UINT32 p_tp_num,
+ OPJ_INT32 p_tp_pos,
+ OPJ_UINT32 p_pino,
+ J2K_T2_MODE p_t2_mode)
+{
+ OPJ_BYTE *l_current_data = p_dest;
+ OPJ_UINT32 l_nb_bytes = 0;
+ OPJ_UINT32 compno;
+ OPJ_UINT32 poc;
+ opj_pi_iterator_t *l_pi = 00;
+ opj_pi_iterator_t *l_current_pi = 00;
+ opj_image_t *l_image = p_t2->image;
+ opj_cp_t *l_cp = p_t2->cp;
+ opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
+ OPJ_UINT32 pocno = l_cp->m_specific_param.m_enc.m_cinema == OPJ_CINEMA4K_24? 2: 1;
+ OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;
+ OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+
+ l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
+ if (!l_pi) {
+ return OPJ_FALSE;
+ }
+
+ * p_data_written = 0;
+
+ if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */
+ l_current_pi = l_pi;
+
+ for (compno = 0; compno < l_max_comp; ++compno) {
+ OPJ_UINT32 l_comp_len = 0;
+ l_current_pi = l_pi;
+
+ for (poc = 0; poc < pocno ; ++poc) {
+ OPJ_UINT32 l_tp_num = compno;
+
+ /* TODO MSD : check why this function cannot fail (cf. v1) */
+ opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);
+
+ while (opj_pi_next(l_current_pi)) {
+ if (l_current_pi->layno < p_maxlayers) {
+ l_nb_bytes = 0;
+
+ if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+ opj_pi_destroy(l_pi, l_nb_pocs);
+ return OPJ_FALSE;
+ }
+
+ l_comp_len += l_nb_bytes;
+ l_current_data += l_nb_bytes;
+ p_max_len -= l_nb_bytes;
+
+ * p_data_written += l_nb_bytes;
+ }
+ }
+
+ if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
+ if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
+ opj_pi_destroy(l_pi, l_nb_pocs);
+ return OPJ_FALSE;
+ }
+ }
+
+ ++l_current_pi;
+ }
+ }
+ }
+ else { /* t2_mode == FINAL_PASS */
+ opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
+
+ l_current_pi = &l_pi[p_pino];
+
+ while (opj_pi_next(l_current_pi)) {
+ if (l_current_pi->layno < p_maxlayers) {
+ l_nb_bytes=0;
+
+ if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+ opj_pi_destroy(l_pi, l_nb_pocs);
+ return OPJ_FALSE;
+ }
+
+ l_current_data += l_nb_bytes;
+ p_max_len -= l_nb_bytes;
+
+ * p_data_written += l_nb_bytes;
+
+ /* INDEX >> */
+ if(cstr_info) {
+ if(cstr_info->index_write) {
+ opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
+ opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
+ if (!cstr_info->packno) {
+ info_PK->start_pos = info_TL->end_header + 1;
+ } else {
+ info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
+ }
+ info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
+ info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance
+ to start of packet is incremented by value of start of packet*/
+ }
+
+ cstr_info->packno++;
+ }
+ /* << INDEX */
+ ++p_tile->packno;
+ }
+ }
+ }
+
+ opj_pi_destroy(l_pi, l_nb_pocs);
+
+ return OPJ_TRUE;
+}
+
+/* see issue 80 */
+#if 0
+#define JAS_FPRINTF fprintf
+#else
+/* issue 290 */
+static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
+{
+ (void)file;
+ (void)format;
+}
+#define JAS_FPRINTF opj_null_jas_fprintf
+#endif
+
+OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
+ OPJ_UINT32 p_tile_no,
+ opj_tcd_tile_t *p_tile,
+ OPJ_BYTE *p_src,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_len,
+ opj_codestream_index_t *p_cstr_index)
+{
+ OPJ_BYTE *l_current_data = p_src;
+ opj_pi_iterator_t *l_pi = 00;
+ OPJ_UINT32 pino;
+ opj_image_t *l_image = p_t2->image;
+ opj_cp_t *l_cp = p_t2->cp;
+ opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
+ OPJ_UINT32 l_nb_bytes_read;
+ OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+ opj_pi_iterator_t *l_current_pi = 00;
+#ifdef TODO_MSD
+ OPJ_UINT32 curtp = 0;
+ OPJ_UINT32 tp_start_packno;
+#endif
+ opj_packet_info_t *l_pack_info = 00;
+ opj_image_comp_t* l_img_comp = 00;
+
+ OPJ_ARG_NOT_USED(p_cstr_index);
+
+#ifdef TODO_MSD
+ if (p_cstr_index) {
+ l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
+ }
+#endif
+
+ /* create a packet iterator */
+ l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
+ if (!l_pi) {
+ return OPJ_FALSE;
+ }
+
+
+ l_current_pi = l_pi;
+
+ for (pino = 0; pino <= l_tcp->numpocs; ++pino) {
+
+ /* if the resolution needed is too low, one dim of the tilec could be equal to zero
+ * and no packets are used to decode this resolution and
+ * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
+ * and no l_img_comp->resno_decoded are computed
+ */
+ OPJ_BOOL* first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
+ if (!first_pass_failed)
+ {
+ opj_pi_destroy(l_pi,l_nb_pocs);
+ return OPJ_FALSE;
+ }
+ memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
+
+ while (opj_pi_next(l_current_pi)) {
+ JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
+ l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
+
+ if (l_tcp->num_layers_to_decode > l_current_pi->layno
+ && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
+ l_nb_bytes_read = 0;
+
+ first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
+
+ if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
+ opj_pi_destroy(l_pi,l_nb_pocs);
+ opj_free(first_pass_failed);
+ return OPJ_FALSE;
+ }
+
+ l_img_comp = &(l_image->comps[l_current_pi->compno]);
+ l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
+ }
+ else {
+ l_nb_bytes_read = 0;
+ if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info)) {
+ opj_pi_destroy(l_pi,l_nb_pocs);
+ opj_free(first_pass_failed);
+ return OPJ_FALSE;
+ }
+ }
+
+ if (first_pass_failed[l_current_pi->compno]) {
+ l_img_comp = &(l_image->comps[l_current_pi->compno]);
+ if (l_img_comp->resno_decoded == 0)
+ l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
+ }
+
+ l_current_data += l_nb_bytes_read;
+ p_max_len -= l_nb_bytes_read;
+
+ /* INDEX >> */
+#ifdef TODO_MSD
+ if(p_cstr_info) {
+ opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
+ opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
+ tp_start_packno = 0;
+ if (!p_cstr_info->packno) {
+ info_PK->start_pos = info_TL->end_header + 1;
+ } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */
+ info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
+ tp_start_packno = p_cstr_info->packno;
+ curtp++;
+ info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
+ } else {
+ info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;
+ }
+ info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
+ info_PK->end_ph_pos += info_PK->start_pos - 1; /* End of packet header which now only represents the distance */
+ ++p_cstr_info->packno;
+ }
+#endif
+ /* << INDEX */
+ }
+ ++l_current_pi;
+
+ opj_free(first_pass_failed);
+ }
+ /* INDEX >> */
+#ifdef TODO_MSD
+ if
+ (p_cstr_info) {
+ p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */
+ }
+#endif
+ /* << INDEX */
+
+ /* don't forget to release pi */
+ opj_pi_destroy(l_pi,l_nb_pocs);
+ *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
+ return OPJ_TRUE;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/**
+ * Creates a Tier 2 handle
+ *
+ * @param p_image Source or destination image
+ * @param p_cp Image coding parameters.
+ * @return a new T2 handle if successful, NULL otherwise.
+*/
+opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
+{
+ /* create the t2 structure */
+ opj_t2_t *l_t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
+ if (!l_t2) {
+ return NULL;
+ }
+ memset(l_t2,0,sizeof(opj_t2_t));
+
+ l_t2->image = p_image;
+ l_t2->cp = p_cp;
+
+ return l_t2;
+}
+
+void opj_t2_destroy(opj_t2_t *t2) {
+ if(t2) {
+ opj_free(t2);
+ }
+}
+
+OPJ_BOOL opj_t2_decode_packet( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_tcp_t *p_tcp,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BYTE *p_src,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *p_pack_info)
+{
+ OPJ_BOOL l_read_data;
+ OPJ_UINT32 l_nb_bytes_read = 0;
+ OPJ_UINT32 l_nb_total_bytes_read = 0;
+
+ *p_data_read = 0;
+
+ if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+ return OPJ_FALSE;
+ }
+
+ p_src += l_nb_bytes_read;
+ l_nb_total_bytes_read += l_nb_bytes_read;
+ p_max_length -= l_nb_bytes_read;
+
+ /* we should read data for the packet */
+ if (l_read_data) {
+ l_nb_bytes_read = 0;
+
+ if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_total_bytes_read += l_nb_bytes_read;
+ }
+
+ *p_data_read = l_nb_total_bytes_read;
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_encode_packet( OPJ_UINT32 tileno,
+ opj_tcd_tile_t * tile,
+ opj_tcp_t * tcp,
+ opj_pi_iterator_t *pi,
+ OPJ_BYTE *dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 length,
+ opj_codestream_info_t *cstr_info)
+{
+ OPJ_UINT32 bandno, cblkno;
+ OPJ_BYTE* c = dest;
+ OPJ_UINT32 l_nb_bytes;
+ OPJ_UINT32 compno = pi->compno; /* component value */
+ OPJ_UINT32 resno = pi->resno; /* resolution level value */
+ OPJ_UINT32 precno = pi->precno; /* precinct value */
+ OPJ_UINT32 layno = pi->layno; /* quality layer value */
+ OPJ_UINT32 l_nb_blocks;
+ opj_tcd_band_t *band = 00;
+ opj_tcd_cblk_enc_t* cblk = 00;
+ opj_tcd_pass_t *pass = 00;
+
+ opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+ opj_bio_t *bio = 00; /* BIO component */
+
+ /* <SOP 0xff91> */
+ if (tcp->csty & J2K_CP_CSTY_SOP) {
+ c[0] = 255;
+ c[1] = 145;
+ c[2] = 0;
+ c[3] = 4;
+#if 0
+ c[4] = (tile->packno % 65536) / 256;
+ c[5] = (tile->packno % 65536) % 256;
+#else
+ c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
+ c[5] = tile->packno & 0xff;
+#endif
+ c += 6;
+ length -= 6;
+ }
+ /* </SOP> */
+
+ if (!layno) {
+ band = res->bands;
+
+ for(bandno = 0; bandno < res->numbands; ++bandno) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ opj_tgt_reset(prc->incltree);
+ opj_tgt_reset(prc->imsbtree);
+
+ l_nb_blocks = prc->cw * prc->ch;
+ for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+ cblk = &prc->cblks.enc[cblkno];
+
+ cblk->numpasses = 0;
+ opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
+ }
+ ++band;
+ }
+ }
+
+ bio = opj_bio_create();
+ opj_bio_init_enc(bio, c, length);
+ opj_bio_write(bio, 1, 1); /* Empty header bit */
+
+ /* Writing Packet header */
+ band = res->bands;
+ for (bandno = 0; bandno < res->numbands; ++bandno) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ l_nb_blocks = prc->cw * prc->ch;
+ cblk = prc->cblks.enc;
+
+ for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+ opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+ if (!cblk->numpasses && layer->numpasses) {
+ opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
+ }
+
+ ++cblk;
+ }
+
+ cblk = prc->cblks.enc;
+ for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
+ opj_tcd_layer_t *layer = &cblk->layers[layno];
+ OPJ_UINT32 increment = 0;
+ OPJ_UINT32 nump = 0;
+ OPJ_UINT32 len = 0, passno;
+ OPJ_UINT32 l_nb_passes;
+
+ /* cblk inclusion bits */
+ if (!cblk->numpasses) {
+ opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
+ } else {
+ opj_bio_write(bio, layer->numpasses != 0, 1);
+ }
+
+ /* if cblk not included, go to the next cblk */
+ if (!layer->numpasses) {
+ ++cblk;
+ continue;
+ }
+
+ /* if first instance of cblk --> zero bit-planes information */
+ if (!cblk->numpasses) {
+ cblk->numlenbits = 3;
+ opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
+ }
+
+ /* number of coding passes included */
+ opj_t2_putnumpasses(bio, layer->numpasses);
+ l_nb_passes = cblk->numpasses + layer->numpasses;
+ pass = cblk->passes + cblk->numpasses;
+
+ /* computation of the increase of the length indicator and insertion in the header */
+ for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+ ++nump;
+ len += pass->len;
+
+ if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+ increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
+ - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
+ len = 0;
+ nump = 0;
+ }
+
+ ++pass;
+ }
+ opj_t2_putcommacode(bio, (OPJ_INT32)increment);
+
+ /* computation of the new Length indicator */
+ cblk->numlenbits += increment;
+
+ pass = cblk->passes + cblk->numpasses;
+ /* insertion of the codeword segment length */
+ for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+ nump++;
+ len += pass->len;
+
+ if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+ opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
+ len = 0;
+ nump = 0;
+ }
+ ++pass;
+ }
+
+ ++cblk;
+ }
+
+ ++band;
+ }
+
+ if (!opj_bio_flush(bio)) {
+ opj_bio_destroy(bio);
+ return OPJ_FALSE; /* modified to eliminate longjmp !! */
+ }
+
+ l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
+ c += l_nb_bytes;
+ length -= l_nb_bytes;
+
+ opj_bio_destroy(bio);
+
+ /* <EPH 0xff92> */
+ if (tcp->csty & J2K_CP_CSTY_EPH) {
+ c[0] = 255;
+ c[1] = 146;
+ c += 2;
+ length -= 2;
+ }
+ /* </EPH> */
+
+ /* << INDEX */
+ /* End of packet header position. Currently only represents the distance to start of packet
+ Will be updated later by incrementing with packet start value*/
+ if(cstr_info && cstr_info->index_write) {
+ opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
+ info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
+ }
+ /* INDEX >> */
+
+ /* Writing the packet body */
+ band = res->bands;
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ l_nb_blocks = prc->cw * prc->ch;
+ cblk = prc->cblks.enc;
+
+ for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+ opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+ if (!layer->numpasses) {
+ ++cblk;
+ continue;
+ }
+
+ if (layer->len > length) {
+ return OPJ_FALSE;
+ }
+
+ memcpy(c, layer->data, layer->len);
+ cblk->numpasses += layer->numpasses;
+ c += layer->len;
+ length -= layer->len;
+
+ /* << INDEX */
+ if(cstr_info && cstr_info->index_write) {
+ opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
+ info_PK->disto += layer->disto;
+ if (cstr_info->D_max < info_PK->disto) {
+ cstr_info->D_max = info_PK->disto;
+ }
+ }
+
+ ++cblk;
+ /* INDEX >> */
+ }
+ ++band;
+ }
+
+ assert( c >= dest );
+ * p_data_written += (OPJ_UINT32)(c - dest);
+
+ return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_tcp_t *p_tcp,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BYTE *p_src,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *p_pack_info)
+{
+ OPJ_BOOL l_read_data;
+ OPJ_UINT32 l_nb_bytes_read = 0;
+ OPJ_UINT32 l_nb_total_bytes_read = 0;
+
+ *p_data_read = 0;
+
+ if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+ return OPJ_FALSE;
+ }
+
+ p_src += l_nb_bytes_read;
+ l_nb_total_bytes_read += l_nb_bytes_read;
+ p_max_length -= l_nb_bytes_read;
+
+ /* we should read data for the packet */
+ if (l_read_data) {
+ l_nb_bytes_read = 0;
+
+ if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info)) {
+ return OPJ_FALSE;
+ }
+
+ l_nb_total_bytes_read += l_nb_bytes_read;
+ }
+ *p_data_read = l_nb_total_bytes_read;
+
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_tcp_t *p_tcp,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BOOL * p_is_data_present,
+ OPJ_BYTE *p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *p_pack_info)
+
+{
+ /* loop */
+ OPJ_UINT32 bandno, cblkno;
+ OPJ_UINT32 l_nb_code_blocks;
+ OPJ_UINT32 l_remaining_length;
+ OPJ_UINT32 l_header_length;
+ OPJ_UINT32 * l_modified_length_ptr = 00;
+ OPJ_BYTE *l_current_data = p_src_data;
+ opj_cp_t *l_cp = p_t2->cp;
+ opj_bio_t *l_bio = 00; /* BIO component */
+ opj_tcd_band_t *l_band = 00;
+ opj_tcd_cblk_dec_t* l_cblk = 00;
+ opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+ OPJ_BYTE *l_header_data = 00;
+ OPJ_BYTE **l_header_data_start = 00;
+
+ OPJ_UINT32 l_present;
+
+ if (p_pi->layno == 0) {
+ l_band = l_res->bands;
+
+ /* reset tagtrees */
+ for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+ opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+ if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
+ opj_tgt_reset(l_prc->incltree);
+ opj_tgt_reset(l_prc->imsbtree);
+ l_cblk = l_prc->cblks.dec;
+
+ l_nb_code_blocks = l_prc->cw * l_prc->ch;
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+ l_cblk->numsegs = 0;
+ l_cblk->real_num_segs = 0;
+ ++l_cblk;
+ }
+ }
+
+ ++l_band;
+ }
+ }
+
+ /* SOP markers */
+
+ if (p_tcp->csty & J2K_CP_CSTY_SOP) {
+ if (p_max_length < 6) {
+ /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Not enough space for expected SOP marker\n"); */
+ printf("Not enough space for expected SOP marker\n");
+ } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
+ /* TODO opj_event_msg(p_t2->cinfo->event_mgr, EVT_WARNING, "Expected SOP marker\n"); */
+ printf("Expected SOP marker\n");
+ fprintf(stderr, "Error : expected SOP marker\n");
+ } else {
+ l_current_data += 6;
+ }
+
+ /** TODO : check the Nsop value */
+ }
+
+ /*
+ When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
+ This part deal with this caracteristic
+ step 1: Read packet header in the saved structure
+ step 2: Return to codestream for decoding
+ */
+
+ l_bio = opj_bio_create();
+ if (! l_bio) {
+ return OPJ_FALSE;
+ }
+
+ if (l_cp->ppm == 1) { /* PPM */
+ l_header_data_start = &l_cp->ppm_data;
+ l_header_data = *l_header_data_start;
+ l_modified_length_ptr = &(l_cp->ppm_len);
+
+ }
+ else if (p_tcp->ppt == 1) { /* PPT */
+ l_header_data_start = &(p_tcp->ppt_data);
+ l_header_data = *l_header_data_start;
+ l_modified_length_ptr = &(p_tcp->ppt_len);
+ }
+ else { /* Normal Case */
+ l_header_data_start = &(l_current_data);
+ l_header_data = *l_header_data_start;
+ l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
+ l_modified_length_ptr = &(l_remaining_length);
+ }
+
+ opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
+
+ l_present = opj_bio_read(l_bio, 1);
+ JAS_FPRINTF(stderr, "present=%d \n", l_present );
+ if (!l_present) {
+ /* TODO MSD: no test to control the output of this function*/
+ opj_bio_inalign(l_bio);
+ l_header_data += opj_bio_numbytes(l_bio);
+ opj_bio_destroy(l_bio);
+
+ /* EPH markers */
+ if (p_tcp->csty & J2K_CP_CSTY_EPH) {
+ if (p_max_length < 2) {
+ fprintf(stderr, "Not enough space for expected EPH marker\n");
+ } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+ fprintf(stderr, "Error : expected EPH marker\n");
+ } else {
+ l_header_data += 2;
+ }
+ }
+
+ l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
+ *l_modified_length_ptr -= l_header_length;
+ *l_header_data_start += l_header_length;
+
+ /* << INDEX */
+ /* End of packet header position. Currently only represents the distance to start of packet
+ Will be updated later by incrementing with packet start value */
+ if (p_pack_info) {
+ p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+ }
+ /* INDEX >> */
+
+ * p_is_data_present = OPJ_FALSE;
+ *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
+ return OPJ_TRUE;
+ }
+
+ l_band = l_res->bands;
+ for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+ opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
+
+ if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+ ++l_band;
+ continue;
+ }
+
+ l_nb_code_blocks = l_prc->cw * l_prc->ch;
+ l_cblk = l_prc->cblks.dec;
+ for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
+ OPJ_UINT32 l_included,l_increment, l_segno;
+ OPJ_INT32 n;
+
+ /* if cblk not yet included before --> inclusion tagtree */
+ if (!l_cblk->numsegs) {
+ l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
+ /* else one bit */
+ }
+ else {
+ l_included = opj_bio_read(l_bio, 1);
+ }
+
+ /* if cblk not included */
+ if (!l_included) {
+ l_cblk->numnewpasses = 0;
+ ++l_cblk;
+ JAS_FPRINTF(stderr, "included=%d \n", l_included);
+ continue;
+ }
+
+ /* if cblk not yet included --> zero-bitplane tagtree */
+ if (!l_cblk->numsegs) {
+ OPJ_UINT32 i = 0;
+
+ while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
+ ++i;
+ }
+
+ l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
+ l_cblk->numlenbits = 3;
+ }
+
+ /* number of coding passes */
+ l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
+ l_increment = opj_t2_getcommacode(l_bio);
+
+ /* length indicator increment */
+ l_cblk->numlenbits += l_increment;
+ l_segno = 0;
+
+ if (!l_cblk->numsegs) {
+ if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
+ opj_bio_destroy(l_bio);
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ l_segno = l_cblk->numsegs - 1;
+ if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
+ ++l_segno;
+ if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+ opj_bio_destroy(l_bio);
+ return OPJ_FALSE;
+ }
+ }
+ }
+ n = (OPJ_INT32)l_cblk->numnewpasses;
+
+ do {
+ l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
+ l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
+ JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );
+
+ n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
+ if (n > 0) {
+ ++l_segno;
+
+ if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+ opj_bio_destroy(l_bio);
+ return OPJ_FALSE;
+ }
+ }
+ } while (n > 0);
+
+ ++l_cblk;
+ }
+
+ ++l_band;
+ }
+
+ if (!opj_bio_inalign(l_bio)) {
+ opj_bio_destroy(l_bio);
+ return OPJ_FALSE;
+ }
+
+ l_header_data += opj_bio_numbytes(l_bio);
+ opj_bio_destroy(l_bio);
+
+ /* EPH markers */
+ if (p_tcp->csty & J2K_CP_CSTY_EPH) {
+ if (p_max_length < 2) {
+ fprintf(stderr, "Not enough space for expected EPH marker\n");
+ } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+ /* TODO opj_event_msg(t2->cinfo->event_mgr, EVT_ERROR, "Expected EPH marker\n"); */
+ fprintf(stderr, "Error : expected EPH marker\n");
+ } else {
+ l_header_data += 2;
+ }
+ }
+
+ l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
+ JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
+ JAS_FPRINTF( stderr, "packet body\n");
+ *l_modified_length_ptr -= l_header_length;
+ *l_header_data_start += l_header_length;
+
+ /* << INDEX */
+ /* End of packet header position. Currently only represents the distance to start of packet
+ Will be updated later by incrementing with packet start value */
+ if (p_pack_info) {
+ p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+ }
+ /* INDEX >> */
+
+ *p_is_data_present = OPJ_TRUE;
+ *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_read_packet_data( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_pi_iterator_t *p_pi,
+ OPJ_BYTE *p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *pack_info)
+{
+ OPJ_UINT32 bandno, cblkno;
+ OPJ_UINT32 l_nb_code_blocks;
+ OPJ_BYTE *l_current_data = p_src_data;
+ opj_tcd_band_t *l_band = 00;
+ opj_tcd_cblk_dec_t* l_cblk = 00;
+ opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+ OPJ_ARG_NOT_USED(p_t2);
+ OPJ_ARG_NOT_USED(pack_info);
+
+ l_band = l_res->bands;
+ for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+ opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+ if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+ ++l_band;
+ continue;
+ }
+
+ l_nb_code_blocks = l_prc->cw * l_prc->ch;
+ l_cblk = l_prc->cblks.dec;
+
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+ opj_tcd_seg_t *l_seg = 00;
+
+ if (!l_cblk->numnewpasses) {
+ /* nothing to do */
+ ++l_cblk;
+ continue;
+ }
+
+ if (!l_cblk->numsegs) {
+ l_seg = l_cblk->segs;
+ ++l_cblk->numsegs;
+ l_cblk->data_current_size = 0;
+ }
+ else {
+ l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+ if (l_seg->numpasses == l_seg->maxpasses) {
+ ++l_seg;
+ ++l_cblk->numsegs;
+ }
+ }
+
+ do {
+ if (l_current_data + l_seg->newlen > p_src_data + p_max_length) {
+ fprintf(stderr, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+ l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+ return OPJ_FALSE;
+ }
+
+#ifdef USE_JPWL
+ /* we need here a j2k handle to verify if making a check to
+ the validity of cblocks parameters is selected from user (-W) */
+
+ /* let's check that we are not exceeding */
+ if ((l_cblk->len + l_seg->newlen) > 8192) {
+ opj_event_msg(p_t2->cinfo, EVT_WARNING,
+ "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+ l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
+ return OPJ_FALSE;
+ }
+ l_seg->newlen = 8192 - l_cblk->len;
+ opj_event_msg(p_t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", l_seg->newlen);
+ break;
+ };
+
+#endif /* USE_JPWL */
+ /* Check if the cblk->data have allocated enough memory */
+ if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
+ OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
+ if(! new_cblk_data) {
+ opj_free(l_cblk->data);
+ l_cblk->data_max_size = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
+ return OPJ_FALSE;
+ }
+ l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
+ l_cblk->data = new_cblk_data;
+ }
+
+ memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
+
+ if (l_seg->numpasses == 0) {
+ l_seg->data = &l_cblk->data;
+ l_seg->dataindex = l_cblk->data_current_size;
+ }
+
+ l_current_data += l_seg->newlen;
+ l_seg->numpasses += l_seg->numnewpasses;
+ l_cblk->numnewpasses -= l_seg->numnewpasses;
+
+ l_seg->real_num_passes = l_seg->numpasses;
+ l_cblk->data_current_size += l_seg->newlen;
+ l_seg->len += l_seg->newlen;
+
+ if (l_cblk->numnewpasses > 0) {
+ ++l_seg;
+ ++l_cblk->numsegs;
+ }
+ } while (l_cblk->numnewpasses > 0);
+
+ l_cblk->real_num_segs = l_cblk->numsegs;
+ ++l_cblk;
+ } /* next code_block */
+
+ ++l_band;
+ }
+
+ *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_t2_skip_packet_data( opj_t2_t* p_t2,
+ opj_tcd_tile_t *p_tile,
+ opj_pi_iterator_t *p_pi,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_length,
+ opj_packet_info_t *pack_info)
+{
+ OPJ_UINT32 bandno, cblkno;
+ OPJ_UINT32 l_nb_code_blocks;
+ opj_tcd_band_t *l_band = 00;
+ opj_tcd_cblk_dec_t* l_cblk = 00;
+ opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+ OPJ_ARG_NOT_USED(p_t2);
+ OPJ_ARG_NOT_USED(pack_info);
+
+ *p_data_read = 0;
+ l_band = l_res->bands;
+
+ for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+ opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+ if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
+ ++l_band;
+ continue;
+ }
+
+ l_nb_code_blocks = l_prc->cw * l_prc->ch;
+ l_cblk = l_prc->cblks.dec;
+
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+ opj_tcd_seg_t *l_seg = 00;
+
+ if (!l_cblk->numnewpasses) {
+ /* nothing to do */
+ ++l_cblk;
+ continue;
+ }
+
+ if (!l_cblk->numsegs) {
+ l_seg = l_cblk->segs;
+ ++l_cblk->numsegs;
+ l_cblk->data_current_size = 0;
+ }
+ else {
+ l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+ if (l_seg->numpasses == l_seg->maxpasses) {
+ ++l_seg;
+ ++l_cblk->numsegs;
+ }
+ }
+
+ do {
+ if (* p_data_read + l_seg->newlen > p_max_length) {
+ fprintf(stderr, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+ l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+ return OPJ_FALSE;
+ }
+
+#ifdef USE_JPWL
+ /* we need here a j2k handle to verify if making a check to
+ the validity of cblocks parameters is selected from user (-W) */
+
+ /* let's check that we are not exceeding */
+ if ((l_cblk->len + l_seg->newlen) > 8192) {
+ opj_event_msg(p_t2->cinfo, EVT_WARNING,
+ "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+ l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+ if (!JPWL_ASSUME) {
+ opj_event_msg(p_t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
+ return -999;
+ }
+ l_seg->newlen = 8192 - l_cblk->len;
+ opj_event_msg(p_t2->cinfo, EVT_WARNING, " - truncating segment to %d\n", l_seg->newlen);
+ break;
+ };
+
+#endif /* USE_JPWL */
+ JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
+ *(p_data_read) += l_seg->newlen;
+
+ l_seg->numpasses += l_seg->numnewpasses;
+ l_cblk->numnewpasses -= l_seg->numnewpasses;
+ if (l_cblk->numnewpasses > 0)
+ {
+ ++l_seg;
+ ++l_cblk->numsegs;
+ }
+ } while (l_cblk->numnewpasses > 0);
+
+ ++l_cblk;
+ }
+
+ ++l_band;
+ }
+
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_t2_init_seg( opj_tcd_cblk_dec_t* cblk,
+ OPJ_UINT32 index,
+ OPJ_UINT32 cblksty,
+ OPJ_UINT32 first)
+{
+ opj_tcd_seg_t* seg = 00;
+ OPJ_UINT32 l_nb_segs = index + 1;
+
+ if (l_nb_segs > cblk->m_current_max_segs) {
+ opj_tcd_seg_t* new_segs;
+ cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
+
+ new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
+ if(! new_segs) {
+ opj_free(cblk->segs);
+ cblk->segs = NULL;
+ cblk->m_current_max_segs = 0;
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
+ return OPJ_FALSE;
+ }
+ cblk->segs = new_segs;
+ }
+
+ seg = &cblk->segs[index];
+ memset(seg,0,sizeof(opj_tcd_seg_t));
+
+ if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
+ seg->maxpasses = 1;
+ }
+ else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
+ if (first) {
+ seg->maxpasses = 10;
+ } else {
+ seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;
+ }
+ } else {
+ seg->maxpasses = 109;
+ }
+
+ return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h
new file mode 100644
index 0000000000..931141e057
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/t2.h
@@ -0,0 +1,133 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __T2_H
+#define __T2_H
+/**
+@file t2.h
+@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
+
+*/
+
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/**
+Tier-2 coding
+*/
+typedef struct opj_t2 {
+
+ /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
+ opj_image_t *image;
+ /** pointer to the image coding parameters */
+ opj_cp_t *cp;
+} opj_t2_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Encode the packets of a tile to a destination buffer
+@param t2 T2 handle
+@param tileno number of the tile encoded
+@param tile the tile for which to write the packets
+@param maxlayers maximum number of layers
+@param dest the destination buffer
+@param p_data_written FIXME DOC
+@param len the length of the destination buffer
+@param cstr_info Codestream information structure
+@param tpnum Tile part number of the current tile
+@param tppos The position of the tile part flag in the progression order
+@param pino FIXME DOC
+@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
+*/
+OPJ_BOOL opj_t2_encode_packets( opj_t2_t* t2,
+ OPJ_UINT32 tileno,
+ opj_tcd_tile_t *tile,
+ OPJ_UINT32 maxlayers,
+ OPJ_BYTE *dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 len,
+ opj_codestream_info_t *cstr_info,
+ OPJ_UINT32 tpnum,
+ OPJ_INT32 tppos,
+ OPJ_UINT32 pino,
+ J2K_T2_MODE t2_mode);
+
+/**
+Decode the packets of a tile from a source buffer
+@param t2 T2 handle
+@param tileno number that identifies the tile for which to decode the packets
+@param tile tile for which to decode the packets
+@param src FIXME DOC
+@param p_data_read the source buffer
+@param len length of the source buffer
+@param cstr_info FIXME DOC
+
+@return FIXME DOC
+ */
+OPJ_BOOL opj_t2_decode_packets( opj_t2_t *t2,
+ OPJ_UINT32 tileno,
+ opj_tcd_tile_t *tile,
+ OPJ_BYTE *src,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 len,
+ opj_codestream_index_t *cstr_info);
+
+/**
+ * Creates a Tier 2 handle
+ *
+ * @param p_image Source or destination image
+ * @param p_cp Image coding parameters.
+ * @return a new T2 handle if successful, NULL otherwise.
+*/
+opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp);
+
+/**
+Destroy a T2 handle
+@param t2 T2 handle to destroy
+*/
+void opj_t2_destroy(opj_t2_t *t2);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T2_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c
new file mode 100644
index 0000000000..94feb17e4a
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.c
@@ -0,0 +1,2129 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ----------------------------------------------------------------------- */
+
+/* TODO MSD: */
+#ifdef TODO_MSD
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
+ int tileno, compno, resno, bandno, precno;/*, cblkno;*/
+
+ fprintf(fd, "image {\n");
+ fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
+ img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
+
+ for (tileno = 0; tileno < img->th * img->tw; tileno++) {
+ opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
+ fprintf(fd, " tile {\n");
+ fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
+ tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
+ for (compno = 0; compno < tile->numcomps; compno++) {
+ opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+ fprintf(fd, " tilec {\n");
+ fprintf(fd,
+ " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
+ tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
+ for (resno = 0; resno < tilec->numresolutions; resno++) {
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+ fprintf(fd, "\n res {\n");
+ fprintf(fd,
+ " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
+ res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ opj_tcd_band_t *band = &res->bands[bandno];
+ fprintf(fd, " band {\n");
+ fprintf(fd,
+ " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
+ band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
+ for (precno = 0; precno < res->pw * res->ph; precno++) {
+ opj_tcd_precinct_t *prec = &band->precincts[precno];
+ fprintf(fd, " prec {\n");
+ fprintf(fd,
+ " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
+ prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
+ /*
+ for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
+ opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
+ fprintf(fd, " cblk {\n");
+ fprintf(fd,
+ " x0=%d, y0=%d, x1=%d, y1=%d\n",
+ cblk->x0, cblk->y0, cblk->x1, cblk->y1);
+ fprintf(fd, " }\n");
+ }
+ */
+ fprintf(fd, " }\n");
+ }
+ fprintf(fd, " }\n");
+ }
+ fprintf(fd, " }\n");
+ }
+ fprintf(fd, " }\n");
+ }
+ fprintf(fd, " }\n");
+ }
+ fprintf(fd, "}\n");
+}
+#endif
+/**
+* Allocates memory for a decoding code block.
+*/
+static OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block);
+
+/**
+ * Deallocates the decoding data of the given precinct.
+ */
+static void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct);
+
+/**
+ * Allocates memory for an encoding code block.
+ */
+static OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block);
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+static void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct);
+
+
+/**
+Free the memory allocated for encoding
+@param tcd TCD handle
+*/
+static void opj_tcd_free_tile(opj_tcd_t *tcd);
+
+
+static OPJ_BOOL opj_tcd_t2_decode ( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_src_size,
+ opj_codestream_index_t *p_cstr_index );
+
+static OPJ_BOOL opj_tcd_t1_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_dwt_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_mct_decode (opj_tcd_t *p_tcd);
+
+static OPJ_BOOL opj_tcd_dc_level_shift_decode (opj_tcd_t *p_tcd);
+
+
+static OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd );
+
+static OPJ_BOOL opj_tcd_t2_encode ( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_max_dest_size,
+ opj_codestream_info_t *p_cstr_info );
+
+static OPJ_BOOL opj_tcd_rate_allocate_encode( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest_data,
+ OPJ_UINT32 p_max_dest_size,
+ opj_codestream_info_t *p_cstr_info );
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Create a new TCD handle
+*/
+opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder)
+{
+ opj_tcd_t *l_tcd = 00;
+
+ /* create the tcd structure */
+ l_tcd = (opj_tcd_t*) opj_malloc(sizeof(opj_tcd_t));
+ if (!l_tcd) {
+ return 00;
+ }
+ memset(l_tcd,0,sizeof(opj_tcd_t));
+
+ l_tcd->m_is_decoder = p_is_decoder ? 1 : 0;
+
+ l_tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
+ if (!l_tcd->tcd_image) {
+ opj_free(l_tcd);
+ return 00;
+ }
+ memset(l_tcd->tcd_image,0,sizeof(opj_tcd_image_t));
+
+ return l_tcd;
+}
+
+
+/* ----------------------------------------------------------------------- */
+
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd) {
+ OPJ_UINT32 layno;
+
+ for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
+ opj_tcd_makelayer_fixed(tcd, layno, 1);
+ }
+}
+
+
+void opj_tcd_makelayer( opj_tcd_t *tcd,
+ OPJ_UINT32 layno,
+ OPJ_FLOAT64 thresh,
+ OPJ_UINT32 final)
+{
+ OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+ OPJ_UINT32 passno;
+
+ opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+
+ tcd_tile->distolayer[layno] = 0; /* fixed_quality */
+
+ for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+ opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+
+ for (resno = 0; resno < tilec->numresolutions; resno++) {
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ opj_tcd_band_t *band = &res->bands[bandno];
+
+ for (precno = 0; precno < res->pw * res->ph; precno++) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+ opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+ opj_tcd_layer_t *layer = &cblk->layers[layno];
+ OPJ_UINT32 n;
+
+ if (layno == 0) {
+ cblk->numpassesinlayers = 0;
+ }
+
+ n = cblk->numpassesinlayers;
+
+ for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
+ OPJ_UINT32 dr;
+ OPJ_FLOAT64 dd;
+ opj_tcd_pass_t *pass = &cblk->passes[passno];
+
+ if (n == 0) {
+ dr = pass->rate;
+ dd = pass->distortiondec;
+ } else {
+ dr = pass->rate - cblk->passes[n - 1].rate;
+ dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
+ }
+
+ if (!dr) {
+ if (dd != 0)
+ n = passno + 1;
+ continue;
+ }
+ if (dd / dr >= thresh)
+ n = passno + 1;
+ }
+
+ layer->numpasses = n - cblk->numpassesinlayers;
+
+ if (!layer->numpasses) {
+ layer->disto = 0;
+ continue;
+ }
+
+ if (cblk->numpassesinlayers == 0) {
+ layer->len = cblk->passes[n - 1].rate;
+ layer->data = cblk->data;
+ layer->disto = cblk->passes[n - 1].distortiondec;
+ } else {
+ layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
+ layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+ layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
+ }
+
+ tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */
+
+ if (final)
+ cblk->numpassesinlayers = n;
+ }
+ }
+ }
+ }
+ }
+}
+
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final) {
+ OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+ OPJ_INT32 value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
+ OPJ_INT32 matrice[10][10][3];
+ OPJ_UINT32 i, j, k;
+
+ opj_cp_t *cp = tcd->cp;
+ opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+ opj_tcp_t *tcd_tcp = tcd->tcp;
+
+ for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+ opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+
+ for (i = 0; i < tcd_tcp->numlayers; i++) {
+ for (j = 0; j < tilec->numresolutions; j++) {
+ for (k = 0; k < 3; k++) {
+ matrice[i][j][k] =
+ (OPJ_INT32) ((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i * tilec->numresolutions * 3 + j * 3 + k]
+ * (OPJ_FLOAT32) (tcd->image->comps[compno].prec / 16.0));
+ }
+ }
+ }
+
+ for (resno = 0; resno < tilec->numresolutions; resno++) {
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ opj_tcd_band_t *band = &res->bands[bandno];
+
+ for (precno = 0; precno < res->pw * res->ph; precno++) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+ opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+ opj_tcd_layer_t *layer = &cblk->layers[layno];
+ OPJ_UINT32 n;
+ OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec - cblk->numbps); /* number of bit-plan equal to zero */
+
+ /* Correction of the matrix of coefficient to include the IMSB information */
+ if (layno == 0) {
+ value = matrice[layno][resno][bandno];
+ if (imsb >= value) {
+ value = 0;
+ } else {
+ value -= imsb;
+ }
+ } else {
+ value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
+ if (imsb >= matrice[layno - 1][resno][bandno]) {
+ value -= (imsb - matrice[layno - 1][resno][bandno]);
+ if (value < 0) {
+ value = 0;
+ }
+ }
+ }
+
+ if (layno == 0) {
+ cblk->numpassesinlayers = 0;
+ }
+
+ n = cblk->numpassesinlayers;
+ if (cblk->numpassesinlayers == 0) {
+ if (value != 0) {
+ n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers;
+ } else {
+ n = cblk->numpassesinlayers;
+ }
+ } else {
+ n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers;
+ }
+
+ layer->numpasses = n - cblk->numpassesinlayers;
+
+ if (!layer->numpasses)
+ continue;
+
+ if (cblk->numpassesinlayers == 0) {
+ layer->len = cblk->passes[n - 1].rate;
+ layer->data = cblk->data;
+ } else {
+ layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
+ layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+ }
+
+ if (final)
+ cblk->numpassesinlayers = n;
+ }
+ }
+ }
+ }
+ }
+}
+
+OPJ_BOOL opj_tcd_rateallocate( opj_tcd_t *tcd,
+ OPJ_BYTE *dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 len,
+ opj_codestream_info_t *cstr_info)
+{
+ OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno;
+ OPJ_UINT32 passno;
+ OPJ_FLOAT64 min, max;
+ OPJ_FLOAT64 cumdisto[100]; /* fixed_quality */
+ const OPJ_FLOAT64 K = 1; /* 1.1; fixed_quality */
+ OPJ_FLOAT64 maxSE = 0;
+
+ opj_cp_t *cp = tcd->cp;
+ opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+ opj_tcp_t *tcd_tcp = tcd->tcp;
+
+ min = DBL_MAX;
+ max = 0;
+
+ tcd_tile->numpix = 0; /* fixed_quality */
+
+ for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+ opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+ tilec->numpix = 0;
+
+ for (resno = 0; resno < tilec->numresolutions; resno++) {
+ opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ opj_tcd_band_t *band = &res->bands[bandno];
+
+ for (precno = 0; precno < res->pw * res->ph; precno++) {
+ opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+ opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+
+ for (passno = 0; passno < cblk->totalpasses; passno++) {
+ opj_tcd_pass_t *pass = &cblk->passes[passno];
+ OPJ_INT32 dr;
+ OPJ_FLOAT64 dd, rdslope;
+
+ if (passno == 0) {
+ dr = (OPJ_INT32)pass->rate;
+ dd = pass->distortiondec;
+ } else {
+ dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate);
+ dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
+ }
+
+ if (dr == 0) {
+ continue;
+ }
+
+ rdslope = dd / dr;
+ if (rdslope < min) {
+ min = rdslope;
+ }
+
+ if (rdslope > max) {
+ max = rdslope;
+ }
+ } /* passno */
+
+ /* fixed_quality */
+ tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+ tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+ } /* cbklno */
+ } /* precno */
+ } /* bandno */
+ } /* resno */
+
+ maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)
+ * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) -1.0))
+ * ((OPJ_FLOAT64)(tilec->numpix));
+ } /* compno */
+
+ /* index file */
+ if(cstr_info) {
+ opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
+ tile_info->numpix = tcd_tile->numpix;
+ tile_info->distotile = tcd_tile->distotile;
+ tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof(OPJ_FLOAT64));
+ }
+
+ for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
+ OPJ_FLOAT64 lo = min;
+ OPJ_FLOAT64 hi = max;
+ OPJ_BOOL success = OPJ_FALSE;
+ OPJ_UINT32 maxlen = tcd_tcp->rates[layno] ? opj_uint_min(((OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len;
+ OPJ_FLOAT64 goodthresh = 0;
+ OPJ_FLOAT64 stable_thresh = 0;
+ OPJ_UINT32 i;
+ OPJ_FLOAT64 distotarget; /* fixed_quality */
+
+ /* fixed_quality */
+ distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10, tcd_tcp->distoratio[layno] / 10));
+
+ /* Don't try to find an optimal threshold but rather take everything not included yet, if
+ -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0)
+ -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0)
+ ==> possible to have some lossy layers and the last layer for sure lossless */
+ if ( ((cp->m_specific_param.m_enc.m_disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->m_specific_param.m_enc.m_fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
+ opj_t2_t*t2 = opj_t2_create(tcd->image, cp);
+ OPJ_FLOAT64 thresh = 0;
+
+ if (t2 == 00) {
+ return OPJ_FALSE;
+ }
+
+ for (i = 0; i < 128; ++i) {
+ OPJ_FLOAT64 distoachieved = 0; /* fixed_quality */
+
+ thresh = (lo + hi) / 2;
+
+ opj_tcd_makelayer(tcd, layno, thresh, 0);
+
+ if (cp->m_specific_param.m_enc.m_fixed_quality) { /* fixed_quality */
+ if(cp->m_specific_param.m_enc.m_cinema){
+ if (! opj_t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC)) {
+
+ lo = thresh;
+ continue;
+ }
+ else {
+ distoachieved = layno == 0 ?
+ tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
+
+ if (distoachieved < distotarget) {
+ hi=thresh;
+ stable_thresh = thresh;
+ continue;
+ }else{
+ lo=thresh;
+ }
+ }
+ }else{
+ distoachieved = (layno == 0) ?
+ tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+
+ if (distoachieved < distotarget) {
+ hi = thresh;
+ stable_thresh = thresh;
+ continue;
+ }
+ lo = thresh;
+ }
+ } else {
+ if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC))
+ {
+ /* TODO: what to do with l ??? seek / tell ??? */
+ /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
+ lo = thresh;
+ continue;
+ }
+
+ hi = thresh;
+ stable_thresh = thresh;
+ }
+ }
+
+ success = OPJ_TRUE;
+ goodthresh = stable_thresh == 0? thresh : stable_thresh;
+
+ opj_t2_destroy(t2);
+ } else {
+ success = OPJ_TRUE;
+ goodthresh = min;
+ }
+
+ if (!success) {
+ return OPJ_FALSE;
+ }
+
+ if(cstr_info) { /* Threshold for Marcela Index */
+ cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
+ }
+
+ opj_tcd_makelayer(tcd, layno, goodthresh, 1);
+
+ /* fixed_quality */
+ cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
+ opj_image_t * p_image,
+ opj_cp_t * p_cp )
+{
+ OPJ_UINT32 l_tile_comp_size;
+
+ p_tcd->image = p_image;
+ p_tcd->cp = p_cp;
+
+ p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
+ if (! p_tcd->tcd_image->tiles) {
+ return OPJ_FALSE;
+ }
+ memset(p_tcd->tcd_image->tiles,0, sizeof(opj_tcd_tile_t));
+
+ l_tile_comp_size = p_image->numcomps * (OPJ_UINT32)sizeof(opj_tcd_tilecomp_t);
+ p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_malloc(l_tile_comp_size);
+ if (! p_tcd->tcd_image->tiles->comps ) {
+ return OPJ_FALSE;
+ }
+ memset( p_tcd->tcd_image->tiles->comps , 0 , l_tile_comp_size);
+
+ p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
+ p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
+
+ return OPJ_TRUE;
+}
+
+/**
+Destroy a previously created TCD handle
+*/
+void opj_tcd_destroy(opj_tcd_t *tcd) {
+ if (tcd) {
+ opj_tcd_free_tile(tcd);
+
+ if (tcd->tcd_image) {
+ opj_free(tcd->tcd_image);
+ tcd->tcd_image = 00;
+ }
+ opj_free(tcd);
+ }
+}
+
+/* ----------------------------------------------------------------------- */
+#define OPJ_MACRO_TCD_ALLOCATE(FUNCTION,TYPE,FRACTION,ELEMENT,FUNCTION_ELEMENT) \
+OPJ_BOOL FUNCTION ( opj_tcd_t *p_tcd, \
+ OPJ_UINT32 p_tile_no \
+ ) \
+{ \
+ OPJ_UINT32 (*l_gain_ptr)(OPJ_UINT32) = 00; \
+ OPJ_UINT32 compno, resno, bandno, precno, cblkno; \
+ opj_tcp_t * l_tcp = 00; \
+ opj_cp_t * l_cp = 00; \
+ opj_tcd_tile_t * l_tile = 00; \
+ opj_tccp_t *l_tccp = 00; \
+ opj_tcd_tilecomp_t *l_tilec = 00; \
+ opj_image_comp_t * l_image_comp = 00; \
+ opj_tcd_resolution_t *l_res = 00; \
+ opj_tcd_band_t *l_band = 00; \
+ opj_stepsize_t * l_step_size = 00; \
+ opj_tcd_precinct_t *l_current_precinct = 00; \
+ TYPE* l_code_block = 00; \
+ opj_image_t *l_image = 00; \
+ OPJ_UINT32 p,q; \
+ OPJ_UINT32 l_level_no; \
+ OPJ_UINT32 l_pdx, l_pdy; \
+ OPJ_UINT32 l_gain; \
+ OPJ_INT32 l_x0b, l_y0b; \
+ /* extent of precincts , top left, bottom right**/ \
+ OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end; \
+ /* number of precinct for a resolution */ \
+ OPJ_UINT32 l_nb_precincts; \
+ /* room needed to store l_nb_precinct precinct for a resolution */ \
+ OPJ_UINT32 l_nb_precinct_size; \
+ /* number of code blocks for a precinct*/ \
+ OPJ_UINT32 l_nb_code_blocks; \
+ /* room needed to store l_nb_code_blocks code blocks for a precinct*/ \
+ OPJ_UINT32 l_nb_code_blocks_size; \
+ /* size of data for a tile */ \
+ OPJ_UINT32 l_data_size; \
+ \
+ l_cp = p_tcd->cp; \
+ l_tcp = &(l_cp->tcps[p_tile_no]); \
+ l_tile = p_tcd->tcd_image->tiles; \
+ l_tccp = l_tcp->tccps; \
+ l_tilec = l_tile->comps; \
+ l_image = p_tcd->image; \
+ l_image_comp = p_tcd->image->comps; \
+ \
+ p = p_tile_no % l_cp->tw; /* tile coordinates */ \
+ q = p_tile_no / l_cp->tw; \
+ /*fprintf(stderr, "Tile coordinate = %d,%d\n", p, q);*/ \
+ \
+ /* 4 borders of the tile rescale on the image if necessary */ \
+ l_tile->x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + p * l_cp->tdx), (OPJ_INT32)l_image->x0); \
+ l_tile->y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + q * l_cp->tdy), (OPJ_INT32)l_image->y0); \
+ l_tile->x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (p + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1); \
+ l_tile->y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (q + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1); \
+ /* testcase 1888.pdf.asan.35.988 */ \
+ if (l_tccp->numresolutions == 0) { \
+ fprintf(stderr, "tiles require at least one resolution\n"); \
+ return OPJ_FALSE; \
+ } \
+ /*fprintf(stderr, "Tile border = %d,%d,%d,%d\n", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/ \
+ \
+ /*tile->numcomps = image->numcomps; */ \
+ for(compno = 0; compno < l_tile->numcomps; ++compno) { \
+ /*fprintf(stderr, "compno = %d/%d\n", compno, l_tile->numcomps);*/ \
+ \
+ /* border of each l_tile component (global) */ \
+ l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx); \
+ l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy); \
+ l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx); \
+ l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy); \
+ /*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/ \
+ if (l_tilec->x1 < 0 || l_tilec->x0 < 0 || l_tilec->y1 < 0 || l_tilec->y0 < 0) return OPJ_FALSE;\
+ l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) \
+ * (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0) * (OPJ_UINT32)sizeof(OPJ_UINT32 );\
+ l_tilec->numresolutions = l_tccp->numresolutions; \
+ if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) { \
+ l_tilec->minimum_num_resolutions = 1; \
+ } \
+ else { \
+ l_tilec->minimum_num_resolutions = l_tccp->numresolutions \
+ - l_cp->m_specific_param.m_dec.m_reduce; \
+ } \
+ \
+ if (l_tilec->data == 00) { \
+ l_tilec->data = (OPJ_INT32 *) opj_malloc(l_data_size); \
+ if (! l_tilec->data ) { \
+ return OPJ_FALSE; \
+ } \
+ /*fprintf(stderr, "\tAllocate data of tilec (int): %d x OPJ_UINT32\n",l_data_size);*/ \
+ \
+ l_tilec->data_size = l_data_size; \
+ } \
+ else if (l_data_size > l_tilec->data_size) { \
+ OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_data_size); \
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle tile data\n"); */ \
+ fprintf(stderr, "Not enough memory to handle tile data\n"); \
+ if (! new_data) { \
+ opj_free(l_tilec->data); \
+ l_tilec->data = NULL; \
+ l_tilec->data_size = 0; \
+ return OPJ_FALSE; \
+ } \
+ l_tilec->data = new_data; \
+ /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->data_size, l_data_size);*/ \
+ l_tilec->data_size = l_data_size; \
+ } \
+ \
+ l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(opj_tcd_resolution_t); \
+ \
+ if (l_tilec->resolutions == 00) { \
+ l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size); \
+ if (! l_tilec->resolutions ) { \
+ return OPJ_FALSE; \
+ } \
+ /*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/ \
+ l_tilec->resolutions_size = l_data_size; \
+ memset(l_tilec->resolutions,0,l_data_size); \
+ } \
+ else if (l_data_size > l_tilec->resolutions_size) { \
+ opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(l_tilec->resolutions, l_data_size); \
+ if (! new_resolutions) { \
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to tile resolutions\n"); */ \
+ fprintf(stderr, "Not enough memory to tile resolutions\n"); \
+ opj_free(l_tilec->resolutions); \
+ l_tilec->resolutions = NULL; \
+ l_tilec->resolutions_size = 0; \
+ return OPJ_FALSE; \
+ } \
+ l_tilec->resolutions = new_resolutions; \
+ /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/ \
+ memset(((OPJ_BYTE*) l_tilec->resolutions)+l_tilec->resolutions_size,0,l_data_size - l_tilec->resolutions_size); \
+ l_tilec->resolutions_size = l_data_size; \
+ } \
+ \
+ l_level_no = l_tilec->numresolutions - 1; \
+ l_res = l_tilec->resolutions; \
+ l_step_size = l_tccp->stepsizes; \
+ if (l_tccp->qmfbid == 0) { \
+ l_gain_ptr = &opj_dwt_getgain_real; \
+ } \
+ else { \
+ l_gain_ptr = &opj_dwt_getgain; \
+ } \
+ /*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/ \
+ \
+ for(resno = 0; resno < l_tilec->numresolutions; ++resno) { \
+ /*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/ \
+ OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/; \
+ OPJ_UINT32 cbgwidthexpn, cbgheightexpn; \
+ OPJ_UINT32 cblkwidthexpn, cblkheightexpn; \
+ \
+ /* border for each resolution level (global) */ \
+ l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no); \
+ l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no); \
+ l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no); \
+ l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no); \
+ /*fprintf(stderr, "\t\t\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\n", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/ \
+ /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ \
+ l_pdx = l_tccp->prcw[resno]; \
+ l_pdy = l_tccp->prch[resno]; \
+ /*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/ \
+ /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ \
+ l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx; \
+ l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy; \
+ l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx; \
+ l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy; \
+ /*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/ \
+ \
+ l_res->pw = (l_res->x0 == l_res->x1) ? 0 : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx); \
+ l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy); \
+ /*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/ \
+ \
+ l_nb_precincts = l_res->pw * l_res->ph; \
+ l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t); \
+ if (resno == 0) { \
+ tlcbgxstart = l_tl_prc_x_start; \
+ tlcbgystart = l_tl_prc_y_start; \
+ /*brcbgxend = l_br_prc_x_end;*/ \
+ /* brcbgyend = l_br_prc_y_end;*/ \
+ cbgwidthexpn = l_pdx; \
+ cbgheightexpn = l_pdy; \
+ l_res->numbands = 1; \
+ } \
+ else { \
+ tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1); \
+ tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1); \
+ /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/ \
+ /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/ \
+ cbgwidthexpn = l_pdx - 1; \
+ cbgheightexpn = l_pdy - 1; \
+ l_res->numbands = 3; \
+ } \
+ \
+ cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn); \
+ cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn); \
+ l_band = l_res->bands; \
+ \
+ for (bandno = 0; bandno < l_res->numbands; ++bandno) { \
+ OPJ_INT32 numbps; \
+ /*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/ \
+ \
+ if (resno == 0) { \
+ l_band->bandno = 0 ; \
+ l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no); \
+ l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no); \
+ l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no); \
+ l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no); \
+ } \
+ else { \
+ l_band->bandno = bandno + 1; \
+ /* x0b = 1 if bandno = 1 or 3 */ \
+ l_x0b = l_band->bandno&1; \
+ /* y0b = 1 if bandno = 2 or 3 */ \
+ l_y0b = (OPJ_INT32)((l_band->bandno)>>1); \
+ /* l_band border (global) */ \
+ l_band->x0 = opj_int_ceildivpow2(l_tilec->x0 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1)); \
+ l_band->y0 = opj_int_ceildivpow2(l_tilec->y0 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1)); \
+ l_band->x1 = opj_int_ceildivpow2(l_tilec->x1 - (1 << l_level_no) * l_x0b, (OPJ_INT32)(l_level_no + 1)); \
+ l_band->y1 = opj_int_ceildivpow2(l_tilec->y1 - (1 << l_level_no) * l_y0b, (OPJ_INT32)(l_level_no + 1)); \
+ } \
+ \
+ /** avoid an if with storing function pointer */ \
+ l_gain = (*l_gain_ptr) (l_band->bandno); \
+ numbps = (OPJ_INT32)(l_image_comp->prec + l_gain); \
+ l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0, (OPJ_INT32) (numbps - l_step_size->expn)))) * FRACTION; \
+ l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits - 1; /* WHY -1 ? */ \
+ \
+ if (! l_band->precincts) { \
+ l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size); \
+ if (! l_band->precincts) { \
+ return OPJ_FALSE; \
+ } \
+ /*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size); */ \
+ memset(l_band->precincts,0,l_nb_precinct_size); \
+ l_band->precincts_data_size = l_nb_precinct_size; \
+ } \
+ else if (l_band->precincts_data_size < l_nb_precinct_size) { \
+ \
+ opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(l_band->precincts,/*3 * */ l_nb_precinct_size); \
+ if (! new_precincts) { \
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle band precints\n"); */ \
+ fprintf(stderr, "Not enough memory to handle band precints\n"); \
+ opj_free(l_band->precincts); \
+ l_band->precincts = NULL; \
+ l_band->precincts_data_size = 0; \
+ return OPJ_FALSE; \
+ } \
+ l_band->precincts = new_precincts; \
+ /*fprintf(stderr, "\t\t\t\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\n",l_band->precincts_data_size, l_nb_precinct_size);*/ \
+ memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size,0,l_nb_precinct_size - l_band->precincts_data_size); \
+ l_band->precincts_data_size = l_nb_precinct_size; \
+ } \
+ \
+ l_current_precinct = l_band->precincts; \
+ for (precno = 0; precno < l_nb_precincts; ++precno) { \
+ OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; \
+ OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) * (1 << cbgwidthexpn); \
+ OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) * (1 << cbgheightexpn); \
+ OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn); \
+ OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn); \
+ /*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/ \
+ /*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/ \
+ \
+ /* precinct size (global) */ \
+ /*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/ \
+ \
+ l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0); \
+ l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0); \
+ l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1); \
+ l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1); \
+ /*fprintf(stderr, "\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\n",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/ \
+ \
+ tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn; \
+ /*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/ \
+ tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0, (OPJ_INT32)cblkheightexpn) << cblkheightexpn; \
+ /*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/ \
+ brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn; \
+ /*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/ \
+ brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1, (OPJ_INT32)cblkheightexpn) << cblkheightexpn; \
+ /*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/ \
+ l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> cblkwidthexpn); \
+ l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> cblkheightexpn); \
+ \
+ l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch; \
+ /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch); */ \
+ l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof(TYPE); \
+ \
+ if (! l_current_precinct->cblks.ELEMENT) { \
+ l_current_precinct->cblks.ELEMENT = (TYPE*) opj_malloc(l_nb_code_blocks_size); \
+ if (! l_current_precinct->cblks.ELEMENT ) { \
+ return OPJ_FALSE; \
+ } \
+ /*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/ \
+ \
+ memset(l_current_precinct->cblks.ELEMENT,0,l_nb_code_blocks_size); \
+ \
+ l_current_precinct->block_size = l_nb_code_blocks_size; \
+ } \
+ else if (l_nb_code_blocks_size > l_current_precinct->block_size) { \
+ TYPE *new_ELEMENT = (TYPE*) opj_realloc(l_current_precinct->cblks.ELEMENT, l_nb_code_blocks_size); \
+ if (! new_ELEMENT) { \
+ opj_free(l_current_precinct->cblks.ELEMENT); \
+ l_current_precinct->cblks.ELEMENT = NULL; \
+ l_current_precinct->block_size = 0; \
+ /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for current precinct codeblock element\n"); */ \
+ fprintf(stderr, "Not enough memory for current precinct codeblock element\n"); \
+ return OPJ_FALSE; \
+ } \
+ l_current_precinct->cblks.ELEMENT = new_ELEMENT; \
+ /*fprintf(stderr, "\t\t\t\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\n",l_current_precinct->block_size, l_nb_code_blocks_size); */\
+ \
+ memset(((OPJ_BYTE *) l_current_precinct->cblks.ELEMENT) + l_current_precinct->block_size \
+ ,0 \
+ ,l_nb_code_blocks_size - l_current_precinct->block_size); \
+ \
+ l_current_precinct->block_size = l_nb_code_blocks_size; \
+ } \
+ \
+ if (! l_current_precinct->incltree) { \
+ l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw, \
+ l_current_precinct->ch); \
+ } \
+ else{ \
+ l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree, \
+ l_current_precinct->cw, \
+ l_current_precinct->ch); \
+ } \
+ \
+ if (! l_current_precinct->incltree) { \
+ fprintf(stderr, "WARNING: No incltree created.\n"); \
+ /*return OPJ_FALSE;*/ \
+ } \
+ \
+ if (! l_current_precinct->imsbtree) { \
+ l_current_precinct->imsbtree = opj_tgt_create( \
+ l_current_precinct->cw, \
+ l_current_precinct->ch); \
+ } \
+ else { \
+ l_current_precinct->imsbtree = opj_tgt_init( \
+ l_current_precinct->imsbtree, \
+ l_current_precinct->cw, \
+ l_current_precinct->ch); \
+ } \
+ \
+ if (! l_current_precinct->imsbtree) { \
+ fprintf(stderr, "WARNING: No imsbtree created.\n"); \
+ /*return OPJ_FALSE;*/ \
+ } \
+ \
+ l_code_block = l_current_precinct->cblks.ELEMENT; \
+ \
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) { \
+ OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno % l_current_precinct->cw) * (1 << cblkwidthexpn); \
+ OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno / l_current_precinct->cw) * (1 << cblkheightexpn); \
+ OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn); \
+ OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn); \
+ \
+ /* code-block size (global) */ \
+ l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0); \
+ l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0); \
+ l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1); \
+ l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1); \
+ \
+ if (! FUNCTION_ELEMENT(l_code_block)) { \
+ return OPJ_FALSE; \
+ } \
+ ++l_code_block; \
+ } \
+ ++l_current_precinct; \
+ } /* precno */ \
+ ++l_band; \
+ ++l_step_size; \
+ } /* bandno */ \
+ ++l_res; \
+ --l_level_no; \
+ } /* resno */ \
+ ++l_tccp; \
+ ++l_tilec; \
+ ++l_image_comp; \
+ } /* compno */ \
+ return OPJ_TRUE; \
+} \
+
+
+OPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_encode_tile, opj_tcd_cblk_enc_t, 1.f, enc, opj_tcd_code_block_enc_allocate)
+OPJ_MACRO_TCD_ALLOCATE(opj_tcd_init_decode_tile, opj_tcd_cblk_dec_t, 0.5f, dec, opj_tcd_code_block_dec_allocate)
+
+#undef OPJ_MACRO_TCD_ALLOCATE
+
+/**
+ * Allocates memory for an encoding code block.
+ */
+OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block)
+{
+ if (! p_code_block->data) {
+
+ p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE*2); /*why +1 ?*/
+ if(! p_code_block->data) {
+ return OPJ_FALSE;
+ }
+
+ p_code_block->data[0] = 0;
+ p_code_block->data+=1;
+
+ /* no memset since data */
+ p_code_block->layers = (opj_tcd_layer_t*) opj_malloc(100 * sizeof(opj_tcd_layer_t));
+ if (! p_code_block->layers) {
+ return OPJ_FALSE;
+ }
+
+ p_code_block->passes = (opj_tcd_pass_t*) opj_malloc(100 * sizeof(opj_tcd_pass_t));
+ if (! p_code_block->passes) {
+ return OPJ_FALSE;
+ }
+ }
+
+ memset(p_code_block->layers,0,100 * sizeof(opj_tcd_layer_t));
+ memset(p_code_block->passes,0,100 * sizeof(opj_tcd_pass_t));
+
+ return OPJ_TRUE;
+}
+
+/**
+ * Allocates memory for a decoding code block.
+ */
+OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block)
+{
+ OPJ_UINT32 l_seg_size;
+
+ if (! p_code_block->data) {
+
+ p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE);
+ if (! p_code_block->data) {
+ return OPJ_FALSE;
+ }
+ p_code_block->data_max_size = OPJ_J2K_DEFAULT_CBLK_DATA_SIZE;
+ /*fprintf(stderr, "Allocate 8192 elements of code_block->data\n");*/
+
+ l_seg_size = OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t);
+ p_code_block->segs = (opj_tcd_seg_t *) opj_malloc(l_seg_size);
+ if (! p_code_block->segs) {
+ return OPJ_FALSE;
+ }
+ memset(p_code_block->segs,0,l_seg_size);
+ /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/
+
+ p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;
+ /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/
+ }
+ /* TODO */
+ /*p_code_block->numsegs = 0; */
+
+ return OPJ_TRUE;
+}
+
+OPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 i;
+ OPJ_UINT32 l_data_size = 0;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tilecomp_t * l_tile_comp = 00;
+ opj_tcd_resolution_t * l_res = 00;
+ OPJ_UINT32 l_size_comp, l_remaining;
+
+ l_tile_comp = p_tcd->tcd_image->tiles->comps;
+ l_img_comp = p_tcd->image->comps;
+
+ for (i=0;i<p_tcd->image->numcomps;++i) {
+ l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+ l_remaining = l_img_comp->prec & 7; /* (%8) */
+
+ if(l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+
+ l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
+ l_data_size += l_size_comp * (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0));
+ ++l_img_comp;
+ ++l_tile_comp;
+ }
+
+ return l_data_size;
+}
+
+OPJ_BOOL opj_tcd_encode_tile( opj_tcd_t *p_tcd,
+ OPJ_UINT32 p_tile_no,
+ OPJ_BYTE *p_dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_max_length,
+ opj_codestream_info_t *p_cstr_info)
+{
+
+ if (p_tcd->cur_tp_num == 0) {
+
+ p_tcd->tcd_tileno = p_tile_no;
+ p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];
+
+ /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
+ if(p_cstr_info) {
+ OPJ_UINT32 l_num_packs = 0;
+ OPJ_UINT32 i;
+ opj_tcd_tilecomp_t *l_tilec_idx = &p_tcd->tcd_image->tiles->comps[0]; /* based on component 0 */
+ opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */
+
+ for (i = 0; i < l_tilec_idx->numresolutions; i++) {
+ opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];
+
+ p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;
+ p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;
+
+ l_num_packs += l_res_idx->pw * l_res_idx->ph;
+ p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];
+ p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];
+ }
+ p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((size_t)p_cstr_info->numcomps * (size_t)p_cstr_info->numlayers * l_num_packs, sizeof(opj_packet_info_t));
+ }
+ /* << INDEX */
+
+ /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
+ /*---------------TILE-------------------*/
+ if (! opj_tcd_dc_level_shift_encode(p_tcd)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
+
+ /* FIXME _ProfStart(PGROUP_MCT); */
+ if (! opj_tcd_mct_encode(p_tcd)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_MCT); */
+
+ /* FIXME _ProfStart(PGROUP_DWT); */
+ if (! opj_tcd_dwt_encode(p_tcd)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_DWT); */
+
+ /* FIXME _ProfStart(PGROUP_T1); */
+ if (! opj_tcd_t1_encode(p_tcd)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_T1); */
+
+ /* FIXME _ProfStart(PGROUP_RATE); */
+ if (! opj_tcd_rate_allocate_encode(p_tcd,p_dest,p_max_length,p_cstr_info)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_RATE); */
+
+ }
+ /*--------------TIER2------------------*/
+
+ /* INDEX */
+ if (p_cstr_info) {
+ p_cstr_info->index_write = 1;
+ }
+ /* FIXME _ProfStart(PGROUP_T2); */
+
+ if (! opj_tcd_t2_encode(p_tcd,p_dest,p_data_written,p_max_length,p_cstr_info)) {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_T2); */
+
+ /*---------------CLEAN-------------------*/
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_decode_tile( opj_tcd_t *p_tcd,
+ OPJ_BYTE *p_src,
+ OPJ_UINT32 p_max_length,
+ OPJ_UINT32 p_tile_no,
+ opj_codestream_index_t *p_cstr_index
+ )
+{
+ OPJ_UINT32 l_data_read;
+ p_tcd->tcd_tileno = p_tile_no;
+ p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);
+
+#ifdef TODO_MSD /* FIXME */
+ /* INDEX >> */
+ if(p_cstr_info) {
+ OPJ_UINT32 resno, compno, numprec = 0;
+ for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {
+ opj_tcp_t *tcp = &p_tcd->cp->tcps[0];
+ opj_tccp_t *tccp = &tcp->tccps[compno];
+ opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];
+ for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
+ opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
+ p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;
+ p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;
+ numprec += res_idx->pw * res_idx->ph;
+ p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];
+ p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];
+ }
+ }
+ p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
+ p_cstr_info->packno = 0;
+ }
+ /* << INDEX */
+#endif
+
+ /*--------------TIER2------------------*/
+ /* FIXME _ProfStart(PGROUP_T2); */
+ l_data_read = 0;
+ if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index))
+ {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_T2); */
+
+ /*------------------TIER1-----------------*/
+
+ /* FIXME _ProfStart(PGROUP_T1); */
+ if
+ (! opj_tcd_t1_decode(p_tcd))
+ {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_T1); */
+
+ /*----------------DWT---------------------*/
+
+ /* FIXME _ProfStart(PGROUP_DWT); */
+ if
+ (! opj_tcd_dwt_decode(p_tcd))
+ {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_DWT); */
+
+ /*----------------MCT-------------------*/
+ /* FIXME _ProfStart(PGROUP_MCT); */
+ if
+ (! opj_tcd_mct_decode(p_tcd))
+ {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_MCT); */
+
+ /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
+ if
+ (! opj_tcd_dc_level_shift_decode(p_tcd))
+ {
+ return OPJ_FALSE;
+ }
+ /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
+
+
+ /*---------------TILE-------------------*/
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest,
+ OPJ_UINT32 p_dest_length
+ )
+{
+ OPJ_UINT32 i,j,k,l_data_size = 0;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tilecomp_t * l_tilec = 00;
+ opj_tcd_resolution_t * l_res;
+ OPJ_UINT32 l_size_comp, l_remaining;
+ OPJ_UINT32 l_stride, l_width,l_height;
+
+ l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);
+ if (l_data_size > p_dest_length) {
+ return OPJ_FALSE;
+ }
+
+ l_tilec = p_tcd->tcd_image->tiles->comps;
+ l_img_comp = p_tcd->image->comps;
+
+ for (i=0;i<p_tcd->image->numcomps;++i) {
+ l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+ l_remaining = l_img_comp->prec & 7; /* (%8) */
+ l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
+ l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+ l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+ l_stride = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) - l_width;
+
+ if (l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+
+ switch (l_size_comp)
+ {
+ case 1:
+ {
+ OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;
+ const OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_CHAR) (*(l_src_ptr++));
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+ else {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_CHAR) ((*(l_src_ptr++))&0xff);
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+
+ p_dest = (OPJ_BYTE *)l_dest_ptr;
+ }
+ break;
+ case 2:
+ {
+ const OPJ_INT32 * l_src_ptr = l_tilec->data;
+ OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;
+
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+ else {
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (OPJ_INT16) ((*(l_src_ptr++))&0xffff);
+ }
+ l_src_ptr += l_stride;
+ }
+ }
+
+ p_dest = (OPJ_BYTE*) l_dest_ptr;
+ }
+ break;
+ case 4:
+ {
+ OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;
+ OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+ for (j=0;j<l_height;++j) {
+ for (k=0;k<l_width;++k) {
+ *(l_dest_ptr++) = (*(l_src_ptr++));
+ }
+ l_src_ptr += l_stride;
+ }
+
+ p_dest = (OPJ_BYTE*) l_dest_ptr;
+ }
+ break;
+ }
+
+ ++l_img_comp;
+ ++l_tilec;
+ }
+
+ return OPJ_TRUE;
+}
+
+
+
+
+void opj_tcd_free_tile(opj_tcd_t *p_tcd)
+{
+ OPJ_UINT32 compno, resno, bandno, precno;
+ opj_tcd_tile_t *l_tile = 00;
+ opj_tcd_tilecomp_t *l_tile_comp = 00;
+ opj_tcd_resolution_t *l_res = 00;
+ opj_tcd_band_t *l_band = 00;
+ opj_tcd_precinct_t *l_precinct = 00;
+ OPJ_UINT32 l_nb_resolutions, l_nb_precincts;
+ void (* l_tcd_code_block_deallocate) (opj_tcd_precinct_t *) = 00;
+
+ if (! p_tcd) {
+ return;
+ }
+
+ if (! p_tcd->tcd_image) {
+ return;
+ }
+
+ if (p_tcd->m_is_decoder) {
+ l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;
+ }
+ else {
+ l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;
+ }
+
+ l_tile = p_tcd->tcd_image->tiles;
+ if (! l_tile) {
+ return;
+ }
+
+ l_tile_comp = l_tile->comps;
+
+ for (compno = 0; compno < l_tile->numcomps; ++compno) {
+ l_res = l_tile_comp->resolutions;
+ if (l_res) {
+
+ l_nb_resolutions = l_tile_comp->resolutions_size / sizeof(opj_tcd_resolution_t);
+ for (resno = 0; resno < l_nb_resolutions; ++resno) {
+ l_band = l_res->bands;
+ for (bandno = 0; bandno < 3; ++bandno) {
+ l_precinct = l_band->precincts;
+ if (l_precinct) {
+
+ l_nb_precincts = l_band->precincts_data_size / sizeof(opj_tcd_precinct_t);
+ for (precno = 0; precno < l_nb_precincts; ++precno) {
+ opj_tgt_destroy(l_precinct->incltree);
+ l_precinct->incltree = 00;
+ opj_tgt_destroy(l_precinct->imsbtree);
+ l_precinct->imsbtree = 00;
+ (*l_tcd_code_block_deallocate) (l_precinct);
+ ++l_precinct;
+ }
+
+ opj_free(l_band->precincts);
+ l_band->precincts = 00;
+ }
+ ++l_band;
+ } /* for (resno */
+ ++l_res;
+ }
+
+ opj_free(l_tile_comp->resolutions);
+ l_tile_comp->resolutions = 00;
+ }
+
+ if (l_tile_comp->data) {
+ opj_free(l_tile_comp->data);
+ l_tile_comp->data = 00;
+ }
+ ++l_tile_comp;
+ }
+
+ opj_free(l_tile->comps);
+ l_tile->comps = 00;
+ opj_free(p_tcd->tcd_image->tiles);
+ p_tcd->tcd_image->tiles = 00;
+}
+
+
+OPJ_BOOL opj_tcd_t2_decode (opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_src_data,
+ OPJ_UINT32 * p_data_read,
+ OPJ_UINT32 p_max_src_size,
+ opj_codestream_index_t *p_cstr_index
+ )
+{
+ opj_t2_t * l_t2;
+
+ l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+ if (l_t2 == 00) {
+ return OPJ_FALSE;
+ }
+
+ if (! opj_t2_decode_packets(
+ l_t2,
+ p_tcd->tcd_tileno,
+ p_tcd->tcd_image->tiles,
+ p_src_data,
+ p_data_read,
+ p_max_src_size,
+ p_cstr_index)) {
+ opj_t2_destroy(l_t2);
+ return OPJ_FALSE;
+ }
+
+ opj_t2_destroy(l_t2);
+
+ /*---------------CLEAN-------------------*/
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 compno;
+ opj_t1_t * l_t1;
+ opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+ opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
+ opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+
+
+ l_t1 = opj_t1_create();
+ if (l_t1 == 00) {
+ return OPJ_FALSE;
+ }
+
+ for (compno = 0; compno < l_tile->numcomps; ++compno) {
+ /* The +3 is headroom required by the vectorized DWT */
+ if (OPJ_FALSE == opj_t1_decode_cblks(l_t1, l_tile_comp, l_tccp)) {
+ opj_t1_destroy(l_t1);
+ return OPJ_FALSE;
+ }
+ ++l_tile_comp;
+ ++l_tccp;
+ }
+
+ opj_t1_destroy(l_t1);
+
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_dwt_decode ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 compno;
+ opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+ opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+ opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+ opj_image_comp_t * l_img_comp = p_tcd->image->comps;
+
+ for (compno = 0; compno < l_tile->numcomps; compno++) {
+ /*
+ if (tcd->cp->reduce != 0) {
+ tcd->image->comps[compno].resno_decoded =
+ tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
+ if (tcd->image->comps[compno].resno_decoded < 0)
+ {
+ return false;
+ }
+ }
+ numres2decode = tcd->image->comps[compno].resno_decoded + 1;
+ if(numres2decode > 0){
+ */
+
+ if (l_tccp->qmfbid == 1) {
+ if (! opj_dwt_decode(l_tile_comp, l_img_comp->resno_decoded+1)) {
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ if (! opj_dwt_decode_real(l_tile_comp, l_img_comp->resno_decoded+1)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ ++l_tile_comp;
+ ++l_img_comp;
+ ++l_tccp;
+ }
+
+ return OPJ_TRUE;
+}
+OPJ_BOOL opj_tcd_mct_decode ( opj_tcd_t *p_tcd )
+{
+ opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+ opj_tcp_t * l_tcp = p_tcd->tcp;
+ opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+ OPJ_UINT32 l_samples,i;
+
+ if (! l_tcp->mct) {
+ return OPJ_TRUE;
+ }
+
+ l_samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+
+ if (l_tile->numcomps >= 3 ){
+ /* testcase 1336.pdf.asan.47.376 */
+ if ((l_tile->comps[0].x1 - l_tile->comps[0].x0) * (l_tile->comps[0].y1 - l_tile->comps[0].y0) < (OPJ_INT32)l_samples ||
+ (l_tile->comps[1].x1 - l_tile->comps[1].x0) * (l_tile->comps[1].y1 - l_tile->comps[1].y0) < (OPJ_INT32)l_samples ||
+ (l_tile->comps[2].x1 - l_tile->comps[2].x0) * (l_tile->comps[2].y1 - l_tile->comps[2].y0) < (OPJ_INT32)l_samples) {
+ fprintf(stderr, "Tiles don't all have the same dimension. Skip the MCT step.\n");
+ return OPJ_FALSE;
+ }
+ else if (l_tcp->mct == 2) {
+ OPJ_BYTE ** l_data;
+
+ if (! l_tcp->m_mct_decoding_matrix) {
+ return OPJ_TRUE;
+ }
+
+ l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
+ if (! l_data) {
+ return OPJ_FALSE;
+ }
+
+ for (i=0;i<l_tile->numcomps;++i) {
+ l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
+ ++l_tile_comp;
+ }
+
+ if (! opj_mct_decode_custom(/* MCT data */
+ (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,
+ /* size of components */
+ l_samples,
+ /* components */
+ l_data,
+ /* nb of components (i.e. size of pData) */
+ l_tile->numcomps,
+ /* tells if the data is signed */
+ p_tcd->image->comps->sgnd)) {
+ opj_free(l_data);
+ return OPJ_FALSE;
+ }
+
+ opj_free(l_data);
+ }
+ else {
+ if (l_tcp->tccps->qmfbid == 1) {
+ opj_mct_decode( l_tile->comps[0].data,
+ l_tile->comps[1].data,
+ l_tile->comps[2].data,
+ l_samples);
+ }
+ else {
+ opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,
+ (OPJ_FLOAT32*)l_tile->comps[1].data,
+ (OPJ_FLOAT32*)l_tile->comps[2].data,
+ l_samples);
+ }
+ }
+ }
+ else {
+ /* FIXME need to use opj_event_msg function */
+ fprintf(stderr,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",l_tile->numcomps);
+ }
+
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_dc_level_shift_decode ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 compno;
+ opj_tcd_tilecomp_t * l_tile_comp = 00;
+ opj_tccp_t * l_tccp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_resolution_t* l_res = 00;
+ opj_tcd_tile_t * l_tile;
+ OPJ_UINT32 l_width,l_height,i,j;
+ OPJ_INT32 * l_current_ptr;
+ OPJ_INT32 l_min, l_max;
+ OPJ_UINT32 l_stride;
+
+ l_tile = p_tcd->tcd_image->tiles;
+ l_tile_comp = l_tile->comps;
+ l_tccp = p_tcd->tcp->tccps;
+ l_img_comp = p_tcd->image->comps;
+
+ for (compno = 0; compno < l_tile->numcomps; compno++) {
+ l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;
+ l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+ l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+ l_stride = (OPJ_UINT32)(l_tile_comp->x1 - l_tile_comp->x0) - l_width;
+
+ assert(l_height == 0 || l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/
+
+ if (l_img_comp->sgnd) {
+ l_min = -(1 << (l_img_comp->prec - 1));
+ l_max = (1 << (l_img_comp->prec - 1)) - 1;
+ }
+ else {
+ l_min = 0;
+ l_max = (1 << l_img_comp->prec) - 1;
+ }
+
+ l_current_ptr = l_tile_comp->data;
+
+ if (l_tccp->qmfbid == 1) {
+ for (j=0;j<l_height;++j) {
+ for (i = 0; i < l_width; ++i) {
+ *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min, l_max);
+ ++l_current_ptr;
+ }
+ l_current_ptr += l_stride;
+ }
+ }
+ else {
+ for (j=0;j<l_height;++j) {
+ for (i = 0; i < l_width; ++i) {
+ OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);
+ *l_current_ptr = opj_int_clamp((OPJ_INT32)lrintf(l_value) + l_tccp->m_dc_level_shift, l_min, l_max); ;
+ ++l_current_ptr;
+ }
+ l_current_ptr += l_stride;
+ }
+ }
+
+ ++l_img_comp;
+ ++l_tccp;
+ ++l_tile_comp;
+ }
+
+ return OPJ_TRUE;
+}
+
+
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct)
+{
+ OPJ_UINT32 cblkno , l_nb_code_blocks;
+
+ opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;
+ if (l_code_block) {
+ /*fprintf(stderr,"deallocate codeblock:{\n");*/
+ /*fprintf(stderr,"\t x0=%d, y0=%d, x1=%d, y1=%d\n",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/
+ /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ",
+ l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/
+
+
+ l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_dec_t);
+ /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/
+
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+
+ if (l_code_block->data) {
+ opj_free(l_code_block->data);
+ l_code_block->data = 00;
+ }
+
+ if (l_code_block->segs) {
+ opj_free(l_code_block->segs );
+ l_code_block->segs = 00;
+ }
+
+ ++l_code_block;
+ }
+
+ opj_free(p_precinct->cblks.dec);
+ p_precinct->cblks.dec = 00;
+ }
+}
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct)
+{
+ OPJ_UINT32 cblkno , l_nb_code_blocks;
+
+ opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;
+ if (l_code_block) {
+ l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_enc_t);
+
+ for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+ if (l_code_block->data) {
+ opj_free(l_code_block->data - 1);
+ l_code_block->data = 00;
+ }
+
+ if (l_code_block->layers) {
+ opj_free(l_code_block->layers );
+ l_code_block->layers = 00;
+ }
+
+ if (l_code_block->passes) {
+ opj_free(l_code_block->passes );
+ l_code_block->passes = 00;
+ }
+ ++l_code_block;
+ }
+
+ opj_free(p_precinct->cblks.enc);
+
+ p_precinct->cblks.enc = 00;
+ }
+}
+
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 i,l_data_size = 0;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tilecomp_t * l_tilec = 00;
+ OPJ_UINT32 l_size_comp, l_remaining;
+
+ l_tilec = p_tcd->tcd_image->tiles->comps;
+ l_img_comp = p_tcd->image->comps;
+ for (i=0;i<p_tcd->image->numcomps;++i) {
+ l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+ l_remaining = l_img_comp->prec & 7; /* (%8) */
+
+ if (l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+
+ l_data_size += l_size_comp * (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
+ ++l_img_comp;
+ ++l_tilec;
+ }
+
+ return l_data_size;
+}
+
+OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd )
+{
+ OPJ_UINT32 compno;
+ opj_tcd_tilecomp_t * l_tile_comp = 00;
+ opj_tccp_t * l_tccp = 00;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tile_t * l_tile;
+ OPJ_UINT32 l_nb_elem,i;
+ OPJ_INT32 * l_current_ptr;
+
+ l_tile = p_tcd->tcd_image->tiles;
+ l_tile_comp = l_tile->comps;
+ l_tccp = p_tcd->tcp->tccps;
+ l_img_comp = p_tcd->image->comps;
+
+ for (compno = 0; compno < l_tile->numcomps; compno++) {
+ l_current_ptr = l_tile_comp->data;
+ l_nb_elem = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+
+ if (l_tccp->qmfbid == 1) {
+ for (i = 0; i < l_nb_elem; ++i) {
+ *l_current_ptr -= l_tccp->m_dc_level_shift ;
+ ++l_current_ptr;
+ }
+ }
+ else {
+ for (i = 0; i < l_nb_elem; ++i) {
+ *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) << 11 ;
+ ++l_current_ptr;
+ }
+ }
+
+ ++l_img_comp;
+ ++l_tccp;
+ ++l_tile_comp;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd )
+{
+ opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+ opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+ OPJ_UINT32 samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
+ OPJ_UINT32 i;
+ OPJ_BYTE ** l_data = 00;
+ opj_tcp_t * l_tcp = p_tcd->tcp;
+
+ if(!p_tcd->tcp->mct) {
+ return OPJ_TRUE;
+ }
+
+ if (p_tcd->tcp->mct == 2) {
+ if (! p_tcd->tcp->m_mct_coding_matrix) {
+ return OPJ_TRUE;
+ }
+
+ l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
+ if (! l_data) {
+ return OPJ_FALSE;
+ }
+
+ for (i=0;i<l_tile->numcomps;++i) {
+ l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
+ ++l_tile_comp;
+ }
+
+ if (! opj_mct_encode_custom(/* MCT data */
+ (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,
+ /* size of components */
+ samples,
+ /* components */
+ l_data,
+ /* nb of components (i.e. size of pData) */
+ l_tile->numcomps,
+ /* tells if the data is signed */
+ p_tcd->image->comps->sgnd) )
+ {
+ opj_free(l_data);
+ return OPJ_FALSE;
+ }
+
+ opj_free(l_data);
+ }
+ else if (l_tcp->tccps->qmfbid == 0) {
+ opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
+ }
+ else {
+ opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd )
+{
+ opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+ opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+ opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+ OPJ_UINT32 compno;
+
+ for (compno = 0; compno < l_tile->numcomps; ++compno) {
+ if (l_tccp->qmfbid == 1) {
+ if (! opj_dwt_encode(l_tile_comp)) {
+ return OPJ_FALSE;
+ }
+ }
+ else if (l_tccp->qmfbid == 0) {
+ if (! opj_dwt_encode_real(l_tile_comp)) {
+ return OPJ_FALSE;
+ }
+ }
+
+ ++l_tile_comp;
+ ++l_tccp;
+ }
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
+{
+ opj_t1_t * l_t1;
+ const OPJ_FLOAT64 * l_mct_norms;
+ opj_tcp_t * l_tcp = p_tcd->tcp;
+
+ l_t1 = opj_t1_create();
+ if (l_t1 == 00) {
+ return OPJ_FALSE;
+ }
+
+ if (l_tcp->mct == 1) {
+ /* irreversible encoding */
+ if (l_tcp->tccps->qmfbid == 0) {
+ l_mct_norms = opj_mct_get_mct_norms_real();
+ }
+ else {
+ l_mct_norms = opj_mct_get_mct_norms();
+ }
+ }
+ else {
+ l_mct_norms = (const OPJ_FLOAT64 *) (l_tcp->mct_norms);
+ }
+
+ if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms)) {
+ opj_t1_destroy(l_t1);
+ return OPJ_FALSE;
+ }
+
+ opj_t1_destroy(l_t1);
+
+ return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_t2_encode (opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest_data,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_max_dest_size,
+ opj_codestream_info_t *p_cstr_info )
+{
+ opj_t2_t * l_t2;
+
+ l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+ if (l_t2 == 00) {
+ return OPJ_FALSE;
+ }
+
+ if (! opj_t2_encode_packets(
+ l_t2,
+ p_tcd->tcd_tileno,
+ p_tcd->tcd_image->tiles,
+ p_tcd->tcp->numlayers,
+ p_dest_data,
+ p_data_written,
+ p_max_dest_size,
+ p_cstr_info,
+ p_tcd->tp_num,
+ p_tcd->tp_pos,
+ p_tcd->cur_pino,
+ FINAL_PASS))
+ {
+ opj_t2_destroy(l_t2);
+ return OPJ_FALSE;
+ }
+
+ opj_t2_destroy(l_t2);
+
+ /*---------------CLEAN-------------------*/
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_rate_allocate_encode( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest_data,
+ OPJ_UINT32 p_max_dest_size,
+ opj_codestream_info_t *p_cstr_info )
+{
+ opj_cp_t * l_cp = p_tcd->cp;
+ OPJ_UINT32 l_nb_written = 0;
+
+ if (p_cstr_info) {
+ p_cstr_info->index_write = 0;
+ }
+
+ if (l_cp->m_specific_param.m_enc.m_disto_alloc|| l_cp->m_specific_param.m_enc.m_fixed_quality) {
+ /* fixed_quality */
+ /* Normal Rate/distortion allocation */
+ if (! opj_tcd_rateallocate(p_tcd, p_dest_data,&l_nb_written, p_max_dest_size, p_cstr_info)) {
+ return OPJ_FALSE;
+ }
+ }
+ else {
+ /* Fixed layer allocation */
+ opj_tcd_rateallocate_fixed(p_tcd);
+ }
+
+ return OPJ_TRUE;
+}
+
+
+OPJ_BOOL opj_tcd_copy_tile_data ( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_src,
+ OPJ_UINT32 p_src_length )
+{
+ OPJ_UINT32 i,j,l_data_size = 0;
+ opj_image_comp_t * l_img_comp = 00;
+ opj_tcd_tilecomp_t * l_tilec = 00;
+ OPJ_UINT32 l_size_comp, l_remaining;
+ OPJ_UINT32 l_nb_elem;
+
+ l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);
+ if (l_data_size != p_src_length) {
+ return OPJ_FALSE;
+ }
+
+ l_tilec = p_tcd->tcd_image->tiles->comps;
+ l_img_comp = p_tcd->image->comps;
+ for (i=0;i<p_tcd->image->numcomps;++i) {
+ l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+ l_remaining = l_img_comp->prec & 7; /* (%8) */
+ l_nb_elem = (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
+
+ if (l_remaining) {
+ ++l_size_comp;
+ }
+
+ if (l_size_comp == 3) {
+ l_size_comp = 4;
+ }
+
+ switch (l_size_comp) {
+ case 1:
+ {
+ OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;
+ OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_nb_elem;++j) {
+ *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+ }
+ }
+ else {
+ for (j=0;j<l_nb_elem;++j) {
+ *(l_dest_ptr++) = (*(l_src_ptr++))&0xff;
+ }
+ }
+
+ p_src = (OPJ_BYTE*) l_src_ptr;
+ }
+ break;
+ case 2:
+ {
+ OPJ_INT32 * l_dest_ptr = l_tilec->data;
+ OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;
+
+ if (l_img_comp->sgnd) {
+ for (j=0;j<l_nb_elem;++j) {
+ *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+ }
+ }
+ else {
+ for (j=0;j<l_nb_elem;++j) {
+ *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
+ }
+ }
+
+ p_src = (OPJ_BYTE*) l_src_ptr;
+ }
+ break;
+ case 4:
+ {
+ OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;
+ OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+ for (j=0;j<l_nb_elem;++j) {
+ *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
+ }
+
+ p_src = (OPJ_BYTE*) l_src_ptr;
+ }
+ break;
+ }
+
+ ++l_img_comp;
+ ++l_tilec;
+ }
+
+ return OPJ_TRUE;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h
new file mode 100644
index 0000000000..360923b151
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tcd.h
@@ -0,0 +1,354 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __TCD_H
+#define __TCD_H
+/**
+@file tcd.h
+@brief Implementation of a tile coder/decoder (TCD)
+
+The functions in TCD.C encode or decode each tile independently from
+each other. The functions in TCD.C are used by other functions in J2K.C.
+*/
+
+/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
+/*@{*/
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_seg {
+ OPJ_BYTE ** data;
+ OPJ_UINT32 dataindex;
+ OPJ_UINT32 numpasses;
+ OPJ_UINT32 real_num_passes;
+ OPJ_UINT32 len;
+ OPJ_UINT32 maxpasses;
+ OPJ_UINT32 numnewpasses;
+ OPJ_UINT32 newlen;
+} opj_tcd_seg_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_pass {
+ OPJ_UINT32 rate;
+ OPJ_FLOAT64 distortiondec;
+ OPJ_UINT32 len;
+ OPJ_UINT32 term : 1;
+} opj_tcd_pass_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_layer {
+ OPJ_UINT32 numpasses; /* Number of passes in the layer */
+ OPJ_UINT32 len; /* len of information */
+ OPJ_FLOAT64 disto; /* add for index (Cfr. Marcela) */
+ OPJ_BYTE *data; /* data */
+} opj_tcd_layer_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_cblk_enc {
+ OPJ_BYTE* data; /* Data */
+ opj_tcd_layer_t* layers; /* layer information */
+ opj_tcd_pass_t* passes; /* information about the passes */
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 numbps;
+ OPJ_UINT32 numlenbits;
+ OPJ_UINT32 numpasses; /* number of pass already done for the code-blocks */
+ OPJ_UINT32 numpassesinlayers; /* number of passes in the layer */
+ OPJ_UINT32 totalpasses; /* total number of passes */
+} opj_tcd_cblk_enc_t;
+
+
+typedef struct opj_tcd_cblk_dec {
+ OPJ_BYTE * data; /* Data */
+ opj_tcd_seg_t* segs; /* segments information */
+ OPJ_INT32 x0, y0, x1, y1; /* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 numbps;
+ OPJ_UINT32 numlenbits;
+ OPJ_UINT32 data_max_size; /* Size of allocated data buffer */
+ OPJ_UINT32 data_current_size; /* Size of used data buffer */
+ OPJ_UINT32 numnewpasses; /* number of pass added to the code-blocks */
+ OPJ_UINT32 numsegs; /* number of segments */
+ OPJ_UINT32 real_num_segs;
+ OPJ_UINT32 m_current_max_segs;
+} opj_tcd_cblk_dec_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_precinct {
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 cw, ch; /* number of precinct in width and height */
+ union{ /* code-blocks information */
+ opj_tcd_cblk_enc_t* enc;
+ opj_tcd_cblk_dec_t* dec;
+ } cblks;
+ OPJ_UINT32 block_size; /* size taken by cblks (in bytes) */
+ opj_tgt_tree_t *incltree; /* inclusion tree */
+ opj_tgt_tree_t *imsbtree; /* IMSB tree */
+} opj_tcd_precinct_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_band {
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 bandno;
+ opj_tcd_precinct_t *precincts; /* precinct information */
+ OPJ_UINT32 precincts_data_size; /* size of data taken by precincts */
+ OPJ_INT32 numbps;
+ OPJ_FLOAT32 stepsize;
+} opj_tcd_band_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_resolution {
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 pw, ph;
+ OPJ_UINT32 numbands; /* number sub-band for the resolution level */
+ opj_tcd_band_t bands[3]; /* subband information */
+} opj_tcd_resolution_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_tilecomp
+{
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 numresolutions; /* number of resolutions level */
+ OPJ_UINT32 minimum_num_resolutions; /* number of resolutions level to decode (at max)*/
+ opj_tcd_resolution_t *resolutions; /* resolutions information */
+ OPJ_UINT32 resolutions_size; /* size of data for resolutions (in bytes) */
+ OPJ_INT32 *data; /* data of the component */
+ OPJ_UINT32 data_size; /* size of the data of the component */
+ OPJ_INT32 numpix; /* add fixed_quality */
+} opj_tcd_tilecomp_t;
+
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_tile {
+ OPJ_INT32 x0, y0, x1, y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
+ OPJ_UINT32 numcomps; /* number of components in tile */
+ opj_tcd_tilecomp_t *comps; /* Components information */
+ OPJ_INT32 numpix; /* add fixed_quality */
+ OPJ_FLOAT64 distotile; /* add fixed_quality */
+ OPJ_FLOAT64 distolayer[100]; /* add fixed_quality */
+ OPJ_UINT32 packno; /* packet number */
+} opj_tcd_tile_t;
+
+/**
+FIXME DOC
+*/
+typedef struct opj_tcd_image
+{
+ opj_tcd_tile_t *tiles; /* Tiles information */
+}
+opj_tcd_image_t;
+
+
+/**
+Tile coder/decoder
+*/
+typedef struct opj_tcd
+{
+ /** Position of the tilepart flag in Progression order*/
+ OPJ_INT32 tp_pos;
+ /** Tile part number*/
+ OPJ_UINT32 tp_num;
+ /** Current tile part number*/
+ OPJ_UINT32 cur_tp_num;
+ /** Total number of tileparts of the current tile*/
+ OPJ_UINT32 cur_totnum_tp;
+ /** Current Packet iterator number */
+ OPJ_UINT32 cur_pino;
+ /** info on each image tile */
+ opj_tcd_image_t *tcd_image;
+ /** image header */
+ opj_image_t *image;
+ /** coding parameters */
+ opj_cp_t *cp;
+ /** coding/decoding parameters common to all tiles */
+ opj_tcp_t *tcp;
+ /** current encoded/decoded tile */
+ OPJ_UINT32 tcd_tileno;
+ /** tell if the tcd is a decoder. */
+ OPJ_UINT32 m_is_decoder : 1;
+} opj_tcd_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Dump the content of a tcd structure
+*/
+/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */
+
+/**
+Create a new TCD handle
+@param p_is_decoder FIXME DOC
+@return Returns a new TCD handle if successful returns NULL otherwise
+*/
+opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder);
+
+/**
+Destroy a previously created TCD handle
+@param tcd TCD handle to destroy
+*/
+void opj_tcd_destroy(opj_tcd_t *tcd);
+
+/**
+ * Initialize the tile coder and may reuse some memory.
+ * @param p_tcd TCD handle.
+ * @param p_image raw image.
+ * @param p_cp coding parameters.
+ *
+ * @return true if the encoding values could be set (false otherwise).
+*/
+OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
+ opj_image_t * p_image,
+ opj_cp_t * p_cp );
+
+/**
+ * Allocates memory for decoding a specific tile.
+ *
+ * @param p_tcd the tile decoder.
+ * @param p_tile_no the index of the tile received in sequence. This not necessarily lead to the
+ * tile at index p_tile_no.
+ *
+ * @return true if the remaining data is sufficient.
+ */
+OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no);
+
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
+
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
+
+void opj_tcd_makelayer( opj_tcd_t *tcd,
+ OPJ_UINT32 layno,
+ OPJ_FLOAT64 thresh,
+ OPJ_UINT32 final);
+
+OPJ_BOOL opj_tcd_rateallocate( opj_tcd_t *tcd,
+ OPJ_BYTE *dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 len,
+ opj_codestream_info_t *cstr_info);
+
+/**
+ * Gets the maximum tile size that will be taken by the tile once decoded.
+ */
+OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
+
+/**
+ * Encodes a tile from the raw image into the given buffer.
+ * @param p_tcd Tile Coder handle
+ * @param p_tile_no Index of the tile to encode.
+ * @param p_dest Destination buffer
+ * @param p_data_written pointer to an int that is incremented by the number of bytes really written on p_dest
+ * @param p_len Maximum length of the destination buffer
+ * @param p_cstr_info Codestream information structure
+ * @return true if the coding is successfull.
+*/
+OPJ_BOOL opj_tcd_encode_tile( opj_tcd_t *p_tcd,
+ OPJ_UINT32 p_tile_no,
+ OPJ_BYTE *p_dest,
+ OPJ_UINT32 * p_data_written,
+ OPJ_UINT32 p_len,
+ struct opj_codestream_info *p_cstr_info);
+
+
+/**
+Decode a tile from a buffer into a raw image
+@param tcd TCD handle
+@param src Source buffer
+@param len Length of source buffer
+@param tileno Number that identifies one of the tiles to be decoded
+@param cstr_info FIXME DOC
+*/
+OPJ_BOOL opj_tcd_decode_tile( opj_tcd_t *tcd,
+ OPJ_BYTE *src,
+ OPJ_UINT32 len,
+ OPJ_UINT32 tileno,
+ opj_codestream_index_t *cstr_info);
+
+
+/**
+ * Copies tile data from the system onto the given memory block.
+ */
+OPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_dest,
+ OPJ_UINT32 p_dest_length );
+
+/**
+ *
+ */
+OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
+
+/**
+ * Initialize the tile coder and may reuse some meory.
+ *
+ * @param p_tcd TCD handle.
+ * @param p_tile_no current tile index to encode.
+ *
+ * @return true if the encoding values could be set (false otherwise).
+*/
+OPJ_BOOL opj_tcd_init_encode_tile ( opj_tcd_t *p_tcd,
+ OPJ_UINT32 p_tile_no );
+
+/**
+ * Copies tile data from the given memory block onto the system.
+ */
+OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
+ OPJ_BYTE * p_src,
+ OPJ_UINT32 p_src_length );
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TCD_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c
new file mode 100644
index 0000000000..e77adb3bb8
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.c
@@ -0,0 +1,337 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/*
+==========================================================
+ Tag-tree coder interface
+==========================================================
+*/
+
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv) {
+ OPJ_INT32 nplh[32];
+ OPJ_INT32 nplv[32];
+ opj_tgt_node_t *node = 00;
+ opj_tgt_node_t *l_parent_node = 00;
+ opj_tgt_node_t *l_parent_node0 = 00;
+ opj_tgt_tree_t *tree = 00;
+ OPJ_UINT32 i;
+ OPJ_INT32 j,k;
+ OPJ_UINT32 numlvls;
+ OPJ_UINT32 n;
+
+ tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
+ if(!tree) {
+ fprintf(stderr, "ERROR in tgt_create while allocating tree\n");
+ return 00;
+ }
+ memset(tree,0,sizeof(opj_tgt_tree_t));
+
+ tree->numleafsh = numleafsh;
+ tree->numleafsv = numleafsv;
+
+ numlvls = 0;
+ nplh[0] = (OPJ_INT32)numleafsh;
+ nplv[0] = (OPJ_INT32)numleafsv;
+ tree->numnodes = 0;
+ do {
+ n = (OPJ_UINT32)(nplh[numlvls] * nplv[numlvls]);
+ nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
+ nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
+ tree->numnodes += n;
+ ++numlvls;
+ } while (n > 1);
+
+ /* ADD */
+ if (tree->numnodes == 0) {
+ opj_free(tree);
+ fprintf(stderr, "WARNING in tgt_create tree->numnodes == 0, no tree created.\n");
+ return 00;
+ }
+
+ tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));
+ if(!tree->nodes) {
+ fprintf(stderr, "ERROR in tgt_create while allocating node of the tree\n");
+ opj_free(tree);
+ return 00;
+ }
+ memset(tree->nodes,0,tree->numnodes * sizeof(opj_tgt_node_t));
+ tree->nodes_size = tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+
+ node = tree->nodes;
+ l_parent_node = &tree->nodes[tree->numleafsh * tree->numleafsv];
+ l_parent_node0 = l_parent_node;
+
+ for (i = 0; i < numlvls - 1; ++i) {
+ for (j = 0; j < nplv[i]; ++j) {
+ k = nplh[i];
+ while (--k >= 0) {
+ node->parent = l_parent_node;
+ ++node;
+ if (--k >= 0) {
+ node->parent = l_parent_node;
+ ++node;
+ }
+ ++l_parent_node;
+ }
+ if ((j & 1) || j == nplv[i] - 1) {
+ l_parent_node0 = l_parent_node;
+ } else {
+ l_parent_node = l_parent_node0;
+ l_parent_node0 += nplh[i];
+ }
+ }
+ }
+ node->parent = 0;
+ opj_tgt_reset(tree);
+ return tree;
+}
+
+/**
+ * Reinitialises a tag-tree from an existing one.
+ *
+ * @param p_tree the tree to reinitialize.
+ * @param p_num_leafs_h the width of the array of leafs of the tree
+ * @param p_num_leafs_v the height of the array of leafs of the tree
+ * @return a new tag-tree if successful, NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,OPJ_UINT32 p_num_leafs_h, OPJ_UINT32 p_num_leafs_v)
+{
+ OPJ_INT32 l_nplh[32];
+ OPJ_INT32 l_nplv[32];
+ opj_tgt_node_t *l_node = 00;
+ opj_tgt_node_t *l_parent_node = 00;
+ opj_tgt_node_t *l_parent_node0 = 00;
+ OPJ_UINT32 i;
+ OPJ_INT32 j,k;
+ OPJ_UINT32 l_num_levels;
+ OPJ_UINT32 n;
+ OPJ_UINT32 l_node_size;
+
+ if (! p_tree){
+ return 00;
+ }
+
+ if ((p_tree->numleafsh != p_num_leafs_h) || (p_tree->numleafsv != p_num_leafs_v)) {
+ p_tree->numleafsh = p_num_leafs_h;
+ p_tree->numleafsv = p_num_leafs_v;
+
+ l_num_levels = 0;
+ l_nplh[0] = (OPJ_INT32)p_num_leafs_h;
+ l_nplv[0] = (OPJ_INT32)p_num_leafs_v;
+ p_tree->numnodes = 0;
+ do
+ {
+ n = (OPJ_UINT32)(l_nplh[l_num_levels] * l_nplv[l_num_levels]);
+ l_nplh[l_num_levels + 1] = (l_nplh[l_num_levels] + 1) / 2;
+ l_nplv[l_num_levels + 1] = (l_nplv[l_num_levels] + 1) / 2;
+ p_tree->numnodes += n;
+ ++l_num_levels;
+ }
+ while (n > 1);
+
+ /* ADD */
+ if (p_tree->numnodes == 0) {
+ opj_tgt_destroy(p_tree);
+ return 00;
+ }
+ l_node_size = p_tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+
+ if (l_node_size > p_tree->nodes_size) {
+ opj_tgt_node_t* new_nodes = (opj_tgt_node_t*) opj_realloc(p_tree->nodes, l_node_size);
+ if (! new_nodes) {
+ fprintf(stderr, "ERROR Not enough memory to reinitialize the tag tree\n");
+ opj_tgt_destroy(p_tree);
+ return 00;
+ }
+ p_tree->nodes = new_nodes;
+ memset(((char *) p_tree->nodes) + p_tree->nodes_size, 0 , l_node_size - p_tree->nodes_size);
+ p_tree->nodes_size = l_node_size;
+ }
+ l_node = p_tree->nodes;
+ l_parent_node = &p_tree->nodes[p_tree->numleafsh * p_tree->numleafsv];
+ l_parent_node0 = l_parent_node;
+
+ for (i = 0; i < l_num_levels - 1; ++i) {
+ for (j = 0; j < l_nplv[i]; ++j) {
+ k = l_nplh[i];
+ while (--k >= 0) {
+ l_node->parent = l_parent_node;
+ ++l_node;
+ if (--k >= 0) {
+ l_node->parent = l_parent_node;
+ ++l_node;
+ }
+ ++l_parent_node;
+ }
+ if ((j & 1) || j == l_nplv[i] - 1)
+ {
+ l_parent_node0 = l_parent_node;
+ }
+ else
+ {
+ l_parent_node = l_parent_node0;
+ l_parent_node0 += l_nplh[i];
+ }
+ }
+ }
+ l_node->parent = 0;
+ }
+ opj_tgt_reset(p_tree);
+
+ return p_tree;
+}
+
+void opj_tgt_destroy(opj_tgt_tree_t *p_tree)
+{
+ if (! p_tree) {
+ return;
+ }
+
+ if (p_tree->nodes) {
+ opj_free(p_tree->nodes);
+ p_tree->nodes = 00;
+ }
+ opj_free(p_tree);
+}
+
+void opj_tgt_reset(opj_tgt_tree_t *p_tree) {
+ OPJ_UINT32 i;
+ opj_tgt_node_t * l_current_node = 00;;
+
+ if (! p_tree) {
+ return;
+ }
+
+ l_current_node = p_tree->nodes;
+ for (i = 0; i < p_tree->numnodes; ++i)
+ {
+ l_current_node->value = 999;
+ l_current_node->low = 0;
+ l_current_node->known = 0;
+ ++l_current_node;
+ }
+}
+
+void opj_tgt_setvalue(opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 value) {
+ opj_tgt_node_t *node;
+ node = &tree->nodes[leafno];
+ while (node && node->value > value) {
+ node->value = value;
+ node = node->parent;
+ }
+}
+
+void opj_tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
+ opj_tgt_node_t *stk[31];
+ opj_tgt_node_t **stkptr;
+ opj_tgt_node_t *node;
+ OPJ_INT32 low;
+
+ stkptr = stk;
+ node = &tree->nodes[leafno];
+ while (node->parent) {
+ *stkptr++ = node;
+ node = node->parent;
+ }
+
+ low = 0;
+ for (;;) {
+ if (low > node->low) {
+ node->low = low;
+ } else {
+ low = node->low;
+ }
+
+ while (low < threshold) {
+ if (low >= node->value) {
+ if (!node->known) {
+ opj_bio_write(bio, 1, 1);
+ node->known = 1;
+ }
+ break;
+ }
+ opj_bio_write(bio, 0, 1);
+ ++low;
+ }
+
+ node->low = low;
+ if (stkptr == stk)
+ break;
+ node = *--stkptr;
+ }
+}
+
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
+ opj_tgt_node_t *stk[31];
+ opj_tgt_node_t **stkptr;
+ opj_tgt_node_t *node;
+ OPJ_INT32 low;
+
+ stkptr = stk;
+ node = &tree->nodes[leafno];
+ while (node->parent) {
+ *stkptr++ = node;
+ node = node->parent;
+ }
+
+ low = 0;
+ for (;;) {
+ if (low > node->low) {
+ node->low = low;
+ } else {
+ low = node->low;
+ }
+ while (low < threshold && low < node->value) {
+ if (opj_bio_read(bio, 1)) {
+ node->value = low;
+ } else {
+ ++low;
+ }
+ }
+ node->low = low;
+ if (stkptr == stk) {
+ break;
+ }
+ node = *--stkptr;
+ }
+
+ return (node->value < threshold) ? 1 : 0;
+}
diff --git a/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h
new file mode 100644
index 0000000000..3d152f8a90
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/tgt.h
@@ -0,0 +1,146 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+ * Copyright (c) 2012, CS Systemes d'Information, France
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __TGT_H
+#define __TGT_H
+/**
+@file tgt.h
+@brief Implementation of a tag-tree coder (TGT)
+
+The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
+are used by some function in T2.C.
+*/
+
+/** @defgroup TGT TGT - Implementation of a tag-tree coder */
+/*@{*/
+
+/**
+Tag node
+*/
+typedef struct opj_tgt_node {
+ struct opj_tgt_node *parent;
+ OPJ_INT32 value;
+ OPJ_INT32 low;
+ OPJ_UINT32 known;
+} opj_tgt_node_t;
+
+/**
+Tag tree
+*/
+typedef struct opj_tgt_tree
+{
+ OPJ_UINT32 numleafsh;
+ OPJ_UINT32 numleafsv;
+ OPJ_UINT32 numnodes;
+ opj_tgt_node_t *nodes;
+ OPJ_UINT32 nodes_size; /* maximum size taken by nodes */
+} opj_tgt_tree_t;
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a tag-tree
+@param numleafsh Width of the array of leafs of the tree
+@param numleafsv Height of the array of leafs of the tree
+@return Returns a new tag-tree if successful, returns NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv);
+
+/**
+ * Reinitialises a tag-tree from an exixting one.
+ *
+ * @param p_tree the tree to reinitialize.
+ * @param p_num_leafs_h the width of the array of leafs of the tree
+ * @param p_num_leafs_v the height of the array of leafs of the tree
+ * @return a new tag-tree if successful, NULL otherwise
+*/
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,
+ OPJ_UINT32 p_num_leafs_h,
+ OPJ_UINT32 p_num_leafs_v);
+/**
+Destroy a tag-tree, liberating memory
+@param tree Tag-tree to destroy
+*/
+void opj_tgt_destroy(opj_tgt_tree_t *tree);
+/**
+Reset a tag-tree (set all leaves to 0)
+@param tree Tag-tree to reset
+*/
+void opj_tgt_reset(opj_tgt_tree_t *tree);
+/**
+Set the value of a leaf of a tag-tree
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to modify
+@param value New value of the leaf
+*/
+void opj_tgt_setvalue(opj_tgt_tree_t *tree,
+ OPJ_UINT32 leafno,
+ OPJ_INT32 value);
+/**
+Encode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to encode
+@param threshold Threshold to use when encoding value of the leaf
+*/
+void opj_tgt_encode(opj_bio_t *bio,
+ opj_tgt_tree_t *tree,
+ OPJ_UINT32 leafno,
+ OPJ_INT32 threshold);
+/**
+Decode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to decode
+@param leafno Number that identifies the leaf to decode
+@param threshold Threshold to use when decoding value of the leaf
+@return Returns 1 if the node's value < threshold, returns 0 otherwise
+*/
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio,
+ opj_tgt_tree_t *tree,
+ OPJ_UINT32 leafno,
+ OPJ_INT32 threshold);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TGT_H */
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c
new file mode 100644
index 0000000000..57ed6f83a5
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/bio.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c
new file mode 100644
index 0000000000..5f70ee540c
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/cio.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c
new file mode 100644
index 0000000000..2dd428f1b7
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/dwt.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c
new file mode 100644
index 0000000000..a7d9bcae10
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_event.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/event.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c
new file mode 100644
index 0000000000..499b1419dd
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/function_list.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c
new file mode 100644
index 0000000000..46b0faab35
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_image.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/image.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c
new file mode 100644
index 0000000000..daa89ab2c3
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/invert.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c
new file mode 100644
index 0000000000..c3ae6d42d6
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/j2k.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c
new file mode 100644
index 0000000000..0aa62a05ba
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c
new file mode 100644
index 0000000000..0aa62a05ba
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c
@@ -0,0 +1,9 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c
new file mode 100644
index 0000000000..d2a3861a98
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/mct.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c
new file mode 100644
index 0000000000..bda851de93
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/mqc.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c
new file mode 100644
index 0000000000..8addb90bb9
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/openjpeg.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c
new file mode 100644
index 0000000000..4271dd0b86
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/jp2.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c
new file mode 100644
index 0000000000..1aed471673
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/opj_clock.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c
new file mode 100644
index 0000000000..034a1208bb
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/pi.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c
new file mode 100644
index 0000000000..c475df2b65
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/raw.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c
new file mode 100644
index 0000000000..ada8ae22ac
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t1.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c
new file mode 100644
index 0000000000..a4b8890154
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t1_generate_luts.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c
new file mode 100644
index 0000000000..4e5ca50783
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/t2.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c
new file mode 100644
index 0000000000..8d575701ec
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/tcd.c"
diff --git a/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c b/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c
new file mode 100644
index 0000000000..283dc54b79
--- /dev/null
+++ b/core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../libopenjpeg20/tgt.c"
diff --git a/core/src/fxcodec/fx_zlib/include/fx_zlib.h b/core/src/fxcodec/fx_zlib/include/fx_zlib.h
new file mode 100644
index 0000000000..955481ce7b
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/include/fx_zlib.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/zlib.h"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c
new file mode 100644
index 0000000000..38a35a03e7
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_adler32.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c
new file mode 100644
index 0000000000..c88a675922
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_compress.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c
new file mode 100644
index 0000000000..e7f7453519
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_crc32.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c
new file mode 100644
index 0000000000..377779aedc
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_deflate.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c
new file mode 100644
index 0000000000..726cbc2390
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzclose.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c
new file mode 100644
index 0000000000..3e95454682
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzlib.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c
new file mode 100644
index 0000000000..2c14ff7468
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzread.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c
new file mode 100644
index 0000000000..2a37fed390
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/gzwrite.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c
new file mode 100644
index 0000000000..17bc781d06
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_infback.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c
new file mode 100644
index 0000000000..a6828cc424
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inffast.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c
new file mode 100644
index 0000000000..f28a389c07
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inflate.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c
new file mode 100644
index 0000000000..9abe3f0570
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_inftrees.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c
new file mode 100644
index 0000000000..05e175b33f
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_trees.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c
new file mode 100644
index 0000000000..451cb6fa85
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_uncompr.c"
diff --git a/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c b/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c
new file mode 100644
index 0000000000..f97edd50fd
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+#include "../zlib_v128/fx_zlib_zutil.c"
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h b/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h
new file mode 100644
index 0000000000..9e0c778102
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/crc32.h
@@ -0,0 +1,441 @@
+/* crc32.h -- tables for rapid CRC calculation
+ * Generated automatically by crc32.c
+ */
+
+local const z_crc_t FAR crc_table[TBLS][256] =
+{
+ {
+ 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
+ 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
+ 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
+ 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
+ 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
+ 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
+ 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
+ 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
+ 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
+ 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
+ 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
+ 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
+ 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
+ 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
+ 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
+ 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
+ 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
+ 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
+ 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
+ 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
+ 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
+ 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
+ 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
+ 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
+ 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
+ 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
+ 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
+ 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
+ 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
+ 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
+ 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
+ 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
+ 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
+ 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
+ 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
+ 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
+ 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
+ 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
+ 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
+ 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
+ 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
+ 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
+ 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
+ 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
+ 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
+ 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
+ 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
+ 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
+ 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
+ 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
+ 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
+ 0x2d02ef8dUL
+#ifdef BYFOUR
+ },
+ {
+ 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
+ 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
+ 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
+ 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
+ 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
+ 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
+ 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
+ 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
+ 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
+ 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
+ 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
+ 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
+ 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
+ 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
+ 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
+ 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
+ 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
+ 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
+ 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
+ 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
+ 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
+ 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
+ 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
+ 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
+ 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
+ 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
+ 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
+ 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
+ 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
+ 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
+ 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
+ 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
+ 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
+ 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
+ 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
+ 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
+ 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
+ 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
+ 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
+ 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
+ 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
+ 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
+ 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
+ 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
+ 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
+ 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
+ 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
+ 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
+ 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
+ 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
+ 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
+ 0x9324fd72UL
+ },
+ {
+ 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
+ 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
+ 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
+ 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
+ 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
+ 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
+ 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
+ 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
+ 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
+ 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
+ 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
+ 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
+ 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
+ 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
+ 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
+ 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
+ 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
+ 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
+ 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
+ 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
+ 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
+ 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
+ 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
+ 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
+ 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
+ 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
+ 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
+ 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
+ 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
+ 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
+ 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
+ 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
+ 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
+ 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
+ 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
+ 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
+ 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
+ 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
+ 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
+ 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
+ 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
+ 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
+ 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
+ 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
+ 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
+ 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
+ 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
+ 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
+ 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
+ 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
+ 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
+ 0xbe9834edUL
+ },
+ {
+ 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
+ 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
+ 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
+ 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
+ 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
+ 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
+ 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
+ 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
+ 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
+ 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
+ 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
+ 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
+ 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
+ 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
+ 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
+ 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
+ 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
+ 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
+ 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
+ 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
+ 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
+ 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
+ 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
+ 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
+ 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
+ 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
+ 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
+ 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
+ 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
+ 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
+ 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
+ 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
+ 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
+ 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
+ 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
+ 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
+ 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
+ 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
+ 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
+ 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
+ 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
+ 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
+ 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
+ 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
+ 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
+ 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
+ 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
+ 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
+ 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
+ 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
+ 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
+ 0xde0506f1UL
+ },
+ {
+ 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
+ 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
+ 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
+ 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
+ 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
+ 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
+ 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
+ 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
+ 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
+ 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
+ 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
+ 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
+ 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
+ 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
+ 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
+ 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
+ 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
+ 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
+ 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
+ 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
+ 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
+ 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
+ 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
+ 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
+ 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
+ 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
+ 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
+ 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
+ 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
+ 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
+ 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
+ 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
+ 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
+ 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
+ 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
+ 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
+ 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
+ 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
+ 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
+ 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
+ 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
+ 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
+ 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
+ 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
+ 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
+ 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
+ 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
+ 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
+ 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
+ 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
+ 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
+ 0x8def022dUL
+ },
+ {
+ 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
+ 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
+ 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
+ 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
+ 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
+ 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
+ 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
+ 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
+ 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
+ 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
+ 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
+ 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
+ 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
+ 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
+ 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
+ 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
+ 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
+ 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
+ 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
+ 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
+ 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
+ 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
+ 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
+ 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
+ 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
+ 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
+ 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
+ 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
+ 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
+ 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
+ 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
+ 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
+ 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
+ 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
+ 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
+ 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
+ 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
+ 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
+ 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
+ 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
+ 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
+ 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
+ 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
+ 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
+ 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
+ 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
+ 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
+ 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
+ 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
+ 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
+ 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
+ 0x72fd2493UL
+ },
+ {
+ 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
+ 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
+ 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
+ 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
+ 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
+ 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
+ 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
+ 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
+ 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
+ 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
+ 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
+ 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
+ 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
+ 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
+ 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
+ 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
+ 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
+ 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
+ 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
+ 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
+ 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
+ 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
+ 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
+ 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
+ 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
+ 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
+ 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
+ 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
+ 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
+ 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
+ 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
+ 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
+ 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
+ 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
+ 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
+ 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
+ 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
+ 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
+ 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
+ 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
+ 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
+ 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
+ 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
+ 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
+ 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
+ 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
+ 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
+ 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
+ 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
+ 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
+ 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
+ 0xed3498beUL
+ },
+ {
+ 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
+ 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
+ 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
+ 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
+ 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
+ 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
+ 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
+ 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
+ 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
+ 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
+ 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
+ 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
+ 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
+ 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
+ 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
+ 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
+ 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
+ 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
+ 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
+ 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
+ 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
+ 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
+ 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
+ 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
+ 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
+ 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
+ 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
+ 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
+ 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
+ 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
+ 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
+ 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
+ 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
+ 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
+ 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
+ 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
+ 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
+ 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
+ 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
+ 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
+ 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
+ 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
+ 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
+ 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
+ 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
+ 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
+ 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
+ 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
+ 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
+ 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
+ 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
+ 0xf10605deUL
+#endif
+ }
+};
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h b/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h
new file mode 100644
index 0000000000..ce0299edd1
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/deflate.h
@@ -0,0 +1,346 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-2012 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef DEFLATE_H
+#define DEFLATE_H
+
+#include "zutil.h"
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer creation by deflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip encoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GZIP
+#endif
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS 256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES 30
+/* number of distance codes */
+
+#define BL_CODES 19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define Buf_size 16
+/* size of bit buffer in bi_buf */
+
+#define INIT_STATE 42
+#define EXTRA_STATE 69
+#define NAME_STATE 73
+#define COMMENT_STATE 91
+#define HCRC_STATE 103
+#define BUSY_STATE 113
+#define FINISH_STATE 666
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+ union {
+ ush freq; /* frequency count */
+ ush code; /* bit string */
+ } fc;
+ union {
+ ush dad; /* father node in Huffman tree */
+ ush len; /* length of bit string */
+ } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad dl.dad
+#define Len dl.len
+
+typedef struct static_tree_desc_s static_tree_desc;
+
+typedef struct tree_desc_s {
+ ct_data *dyn_tree; /* the dynamic tree */
+ int max_code; /* largest code with non zero frequency */
+ static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+ z_streamp strm; /* pointer back to this zlib stream */
+ int status; /* as the name implies */
+ Bytef *pending_buf; /* output still pending */
+ ulg pending_buf_size; /* size of pending_buf */
+ Bytef *pending_out; /* next pending byte to output to the stream */
+ uInt pending; /* nb of bytes in the pending buffer */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ gz_headerp gzhead; /* gzip header information to write */
+ uInt gzindex; /* where in extra, name, or comment */
+ Byte method; /* can only be DEFLATED */
+ int last_flush; /* value of flush param for previous deflate call */
+
+ /* used by deflate.c: */
+
+ uInt w_size; /* LZ77 window size (32K by default) */
+ uInt w_bits; /* log2(w_size) (8..16) */
+ uInt w_mask; /* w_size - 1 */
+
+ Bytef *window;
+ /* Sliding window. Input bytes are read into the second half of the window,
+ * and move to the first half later to keep a dictionary of at least wSize
+ * bytes. With this organization, matches are limited to a distance of
+ * wSize-MAX_MATCH bytes, but this ensures that IO is always
+ * performed with a length multiple of the block size. Also, it limits
+ * the window size to 64K, which is quite useful on MSDOS.
+ * To do: use the user input buffer as sliding window.
+ */
+
+ ulg window_size;
+ /* Actual size of window: 2*wSize, except when the user input buffer
+ * is directly used as sliding window.
+ */
+
+ Posf *prev;
+ /* Link to older string with same hash index. To limit the size of this
+ * array to 64K, this link is maintained only for the last 32K strings.
+ * An index in this array is thus a window index modulo 32K.
+ */
+
+ Posf *head; /* Heads of the hash chains or NIL. */
+
+ uInt ins_h; /* hash index of string to be inserted */
+ uInt hash_size; /* number of elements in hash table */
+ uInt hash_bits; /* log2(hash_size) */
+ uInt hash_mask; /* hash_size-1 */
+
+ uInt hash_shift;
+ /* Number of bits by which ins_h must be shifted at each input
+ * step. It must be such that after MIN_MATCH steps, the oldest
+ * byte no longer takes part in the hash key, that is:
+ * hash_shift * MIN_MATCH >= hash_bits
+ */
+
+ long block_start;
+ /* Window position at the beginning of the current output block. Gets
+ * negative when the window is moved backwards.
+ */
+
+ uInt match_length; /* length of best match */
+ IPos prev_match; /* previous match */
+ int match_available; /* set if previous match exists */
+ uInt strstart; /* start of string to insert */
+ uInt match_start; /* start of matching string */
+ uInt lookahead; /* number of valid bytes ahead in window */
+
+ uInt prev_length;
+ /* Length of the best match at previous step. Matches not greater than this
+ * are discarded. This is used in the lazy match evaluation.
+ */
+
+ uInt max_chain_length;
+ /* To speed up deflation, hash chains are never searched beyond this
+ * length. A higher limit improves compression ratio but degrades the
+ * speed.
+ */
+
+ uInt max_lazy_match;
+ /* Attempt to find a better match only when the current match is strictly
+ * smaller than this value. This mechanism is used only for compression
+ * levels >= 4.
+ */
+# define max_insert_length max_lazy_match
+ /* Insert new strings in the hash table only if the match length is not
+ * greater than this length. This saves time but degrades compression.
+ * max_insert_length is used only for compression levels <= 3.
+ */
+
+ int level; /* compression level (1..9) */
+ int strategy; /* favor or force Huffman coding*/
+
+ uInt good_match;
+ /* Use a faster search when the previous match is longer than this */
+
+ int nice_match; /* Stop searching when current match exceeds this */
+
+ /* used by trees.c: */
+ /* Didn't use ct_data typedef below to suppress compiler warning */
+ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
+ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
+
+ struct tree_desc_s l_desc; /* desc. for literal tree */
+ struct tree_desc_s d_desc; /* desc. for distance tree */
+ struct tree_desc_s bl_desc; /* desc. for bit length tree */
+
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
+ int heap_len; /* number of elements in the heap */
+ int heap_max; /* element of largest frequency */
+ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+ * The same heap array is used to build all trees.
+ */
+
+ uch depth[2*L_CODES+1];
+ /* Depth of each subtree used as tie breaker for trees of equal frequency
+ */
+
+ uchf *l_buf; /* buffer for literals or lengths */
+
+ uInt lit_bufsize;
+ /* Size of match buffer for literals/lengths. There are 4 reasons for
+ * limiting lit_bufsize to 64K:
+ * - frequencies can be kept in 16 bit counters
+ * - if compression is not successful for the first block, all input
+ * data is still in the window so we can still emit a stored block even
+ * when input comes from standard input. (This can also be done for
+ * all blocks if lit_bufsize is not greater than 32K.)
+ * - if compression is not successful for a file smaller than 64K, we can
+ * even emit a stored file instead of a stored block (saving 5 bytes).
+ * This is applicable only for zip (not gzip or zlib).
+ * - creating new Huffman trees less frequently may not provide fast
+ * adaptation to changes in the input data statistics. (Take for
+ * example a binary file with poorly compressible code followed by
+ * a highly compressible string table.) Smaller buffer sizes give
+ * fast adaptation but have of course the overhead of transmitting
+ * trees more frequently.
+ * - I can't count above 4
+ */
+
+ uInt last_lit; /* running index in l_buf */
+
+ ushf *d_buf;
+ /* Buffer for distances. To simplify the code, d_buf and l_buf have
+ * the same number of elements. To use different lengths, an extra flag
+ * array would be necessary.
+ */
+
+ ulg opt_len; /* bit length of current block with optimal trees */
+ ulg static_len; /* bit length of current block with static trees */
+ uInt matches; /* number of string matches in current block */
+ uInt insert; /* bytes at end of window left to insert */
+
+#ifdef DEBUG
+ ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
+#endif
+
+ ush bi_buf;
+ /* Output buffer. bits are inserted starting at the bottom (least
+ * significant bits).
+ */
+ int bi_valid;
+ /* Number of valid bits in bi_buf. All bits above the last valid bit
+ * are always zero.
+ */
+
+ ulg high_water;
+ /* High water mark offset in window for initialized bytes -- bytes above
+ * this are set to zero in order to avoid memory check warnings when
+ * longest match routines access bytes past the input. This is then
+ * updated to the new high water mark.
+ */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+#define WIN_INIT MAX_MATCH
+/* Number of bytes after end of data in window to initialize in order to avoid
+ memory checker errors from longest match routines */
+
+ /* in trees.c */
+void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
+int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
+
+#define d_code(dist) \
+ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+ extern uch ZLIB_INTERNAL _length_code[];
+ extern uch ZLIB_INTERNAL _dist_code[];
+#else
+ extern const uch ZLIB_INTERNAL _length_code[];
+ extern const uch ZLIB_INTERNAL _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->last_lit] = 0; \
+ s->l_buf[s->last_lit++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (length); \
+ ush dist = (distance); \
+ s->d_buf[s->last_lit] = dist; \
+ s->l_buf[s->last_lit++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+ flush = _tr_tally(s, distance, length)
+#endif
+
+#endif /* DEFLATE_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c
new file mode 100644
index 0000000000..82a84ceed2
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_adler32.c
@@ -0,0 +1,179 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2011 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+
+#define local static
+
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
+
+#define BASE 65521 /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
+#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf) DO8(buf,0); DO8(buf,8);
+
+/* use NO_DIVIDE if your processor does not do division in hardware --
+ try it both ways to see which is faster */
+#ifdef NO_DIVIDE
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
+ (thank you to John Reiser for pointing this out) */
+# define CHOP(a) \
+ do { \
+ unsigned long tmp = a >> 16; \
+ a &= 0xffffUL; \
+ a += (tmp << 4) - tmp; \
+ } while (0)
+# define MOD28(a) \
+ do { \
+ CHOP(a); \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+# define MOD(a) \
+ do { \
+ CHOP(a); \
+ MOD28(a); \
+ } while (0)
+# define MOD63(a) \
+ do { /* this assumes a is not negative */ \
+ z_off64_t tmp = a >> 32; \
+ a &= 0xffffffffL; \
+ a += (tmp << 8) - (tmp << 5) + tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+#else
+# define MOD(a) a %= BASE
+# define MOD28(a) a %= BASE
+# define MOD63(a) a %= BASE
+#endif
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(
+ uLong adler,
+ const Bytef *buf,
+ uInt len)
+{
+ unsigned long sum2;
+ unsigned n;
+
+ /* split Adler-32 into component sums */
+ sum2 = (adler >> 16) & 0xffff;
+ adler &= 0xffff;
+
+ /* in case user likes doing a byte at a time, keep it fast */
+ if (len == 1) {
+ adler += buf[0];
+ if (adler >= BASE)
+ adler -= BASE;
+ sum2 += adler;
+ if (sum2 >= BASE)
+ sum2 -= BASE;
+ return adler | (sum2 << 16);
+ }
+
+ /* initial Adler-32 value (deferred check for len == 1 speed) */
+ if (buf == Z_NULL)
+ return 1L;
+
+ /* in case short lengths are provided, keep it somewhat fast */
+ if (len < 16) {
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ if (adler >= BASE)
+ adler -= BASE;
+ MOD28(sum2); /* only added so many BASE's */
+ return adler | (sum2 << 16);
+ }
+
+ /* do length NMAX blocks -- requires just one modulo operation */
+ while (len >= NMAX) {
+ len -= NMAX;
+ n = NMAX / 16; /* NMAX is divisible by 16 */
+ do {
+ DO16(buf); /* 16 sums unrolled */
+ buf += 16;
+ } while (--n);
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* do remaining bytes (less than NMAX, still just one modulo) */
+ if (len) { /* avoid modulos if none remaining */
+ while (len >= 16) {
+ len -= 16;
+ DO16(buf);
+ buf += 16;
+ }
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* return recombined sums */
+ return adler | (sum2 << 16);
+}
+
+/* ========================================================================= */
+local uLong adler32_combine_(
+ uLong adler1,
+ uLong adler2,
+ z_off64_t len2)
+{
+ unsigned long sum1;
+ unsigned long sum2;
+ unsigned rem;
+
+ /* for negative len, return invalid adler32 as a clue for debugging */
+ if (len2 < 0)
+ return 0xffffffffUL;
+
+ /* the derivation of this formula is left as an exercise for the reader */
+ MOD63(len2); /* assumes len2 >= 0 */
+ rem = (unsigned)len2;
+ sum1 = adler1 & 0xffff;
+ sum2 = rem * sum1;
+ MOD(sum2);
+ sum1 += (adler2 & 0xffff) + BASE - 1;
+ sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
+ if (sum2 >= BASE) sum2 -= BASE;
+ return sum1 | (sum2 << 16);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(
+ uLong adler1,
+ uLong adler2,
+ z_off_t len2)
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
+
+uLong ZEXPORT adler32_combine64(
+ uLong adler1,
+ uLong adler2,
+ z_off64_t len2)
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c
new file mode 100644
index 0000000000..0314fbc61a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_compress.c
@@ -0,0 +1,80 @@
+/* compress.c -- compress a memory buffer
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least 0.1% larger than sourceLen plus
+ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+int ZEXPORT compress2 (
+ Bytef *dest,
+ uLongf *destLen,
+ const Bytef *source,
+ uLong sourceLen,
+ int level)
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = (z_const Bytef *)source;
+ stream.avail_in = (uInt)sourceLen;
+#ifdef MAXSEG_64K
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+#endif
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ err = deflateInit(&stream, level);
+ if (err != Z_OK) return err;
+
+ err = deflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ deflateEnd(&stream);
+ return err == Z_OK ? Z_BUF_ERROR : err;
+ }
+ *destLen = stream.total_out;
+
+ err = deflateEnd(&stream);
+ return err;
+}
+
+/* ===========================================================================
+ */
+int ZEXPORT compress (
+ Bytef *dest,
+ uLongf *destLen,
+ const Bytef *source,
+ uLong sourceLen)
+{
+ return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
+}
+
+/* ===========================================================================
+ If the default memLevel or windowBits for deflateInit() is changed, then
+ this function needs to be updated.
+ */
+uLong ZEXPORT compressBound (
+ uLong sourceLen)
+{
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c
new file mode 100644
index 0000000000..f0072c94bf
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_crc32.c
@@ -0,0 +1,425 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
+ * tables for updating the shift register in one step with three exclusive-ors
+ * instead of four steps with four exclusive-ors. This results in about a
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
+ */
+
+/* @(#) $Id$ */
+
+/*
+ Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
+ protection on the static variables used to control the first-use generation
+ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+ first call get_crc_table() to initialize the tables before allowing more than
+ one thread to use crc32().
+
+ DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
+ */
+
+#ifdef MAKECRCH
+# include <stdio.h>
+# ifndef DYNAMIC_CRC_TABLE
+# define DYNAMIC_CRC_TABLE
+# endif /* !DYNAMIC_CRC_TABLE */
+#endif /* MAKECRCH */
+
+#include "zutil.h" /* for STDC and FAR definitions */
+
+#define local static
+
+/* Definitions for doing the crc four data bytes at a time. */
+#if !defined(NOBYFOUR) && defined(Z_U4)
+# define BYFOUR
+#endif
+#ifdef BYFOUR
+ local unsigned long crc32_little OF((unsigned long,
+ const unsigned char FAR *, unsigned));
+ local unsigned long crc32_big OF((unsigned long,
+ const unsigned char FAR *, unsigned));
+# define TBLS 8
+#else
+# define TBLS 1
+#endif /* BYFOUR */
+
+/* Local functions for crc concatenation */
+local unsigned long gf2_matrix_times OF((unsigned long *mat,
+ unsigned long vec));
+local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
+
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local volatile int crc_table_empty = 1;
+local z_crc_t FAR crc_table[TBLS][256];
+local void make_crc_table OF((void));
+#ifdef MAKECRCH
+ local void write_table OF((FILE *, const z_crc_t FAR *));
+#endif /* MAKECRCH */
+/*
+ Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
+ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+ Polynomials over GF(2) are represented in binary, one bit per coefficient,
+ with the lowest powers in the most significant bit. Then adding polynomials
+ is just exclusive-or, and multiplying a polynomial by x is a right shift by
+ one. If we call the above polynomial p, and represent a byte as the
+ polynomial q, also with the lowest power in the most significant bit (so the
+ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+ where a mod b means the remainder after dividing a by b.
+
+ This calculation is done using the shift-register method of multiplying and
+ taking the remainder. The register is initialized to zero, and for each
+ incoming bit, x^32 is added mod p to the register if the bit is a one (where
+ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+ x (which is shifting right by one and adding x^32 mod p if the bit shifted
+ out is a one). We start with the highest power (least significant bit) of
+ q and repeat for all eight bits of q.
+
+ The first table is simply the CRC of all possible eight bit values. This is
+ all the information needed to generate CRCs on data a byte at a time for all
+ combinations of CRC register values and incoming bytes. The remaining tables
+ allow for word-at-a-time CRC calculation for both big-endian and little-
+ endian machines, where a word is four bytes.
+*/
+local void make_crc_table()
+{
+ z_crc_t c;
+ int n, k;
+ z_crc_t poly; /* polynomial exclusive-or pattern */
+ /* terms of polynomial defining this crc (except x^32): */
+ static volatile int first = 1; /* flag to limit concurrent making */
+ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+ /* See if another task is already doing this (not thread-safe, but better
+ than nothing -- significantly reduces duration of vulnerability in
+ case the advice about DYNAMIC_CRC_TABLE is ignored) */
+ if (first) {
+ first = 0;
+
+ /* make exclusive-or pattern from polynomial (0xedb88320UL) */
+ poly = 0;
+ for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
+ poly |= (z_crc_t)1 << (31 - p[n]);
+
+ /* generate a crc for every 8-bit value */
+ for (n = 0; n < 256; n++) {
+ c = (z_crc_t)n;
+ for (k = 0; k < 8; k++)
+ c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+ crc_table[0][n] = c;
+ }
+
+#ifdef BYFOUR
+ /* generate crc for each value followed by one, two, and three zeros,
+ and then the byte reversal of those as well as the first table */
+ for (n = 0; n < 256; n++) {
+ c = crc_table[0][n];
+ crc_table[4][n] = ZSWAP32(c);
+ for (k = 1; k < 4; k++) {
+ c = crc_table[0][c & 0xff] ^ (c >> 8);
+ crc_table[k][n] = c;
+ crc_table[k + 4][n] = ZSWAP32(c);
+ }
+ }
+#endif /* BYFOUR */
+
+ crc_table_empty = 0;
+ }
+ else { /* not first */
+ /* wait for the other guy to finish (not efficient, but rare) */
+ while (crc_table_empty)
+ ;
+ }
+
+#ifdef MAKECRCH
+ /* write out CRC tables to crc32.h */
+ {
+ FILE *out;
+
+ out = fopen("crc32.h", "w");
+ if (out == NULL) return;
+ fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
+ fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
+ fprintf(out, "local const z_crc_t FAR ");
+ fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
+ write_table(out, crc_table[0]);
+# ifdef BYFOUR
+ fprintf(out, "#ifdef BYFOUR\n");
+ for (k = 1; k < 8; k++) {
+ fprintf(out, " },\n {\n");
+ write_table(out, crc_table[k]);
+ }
+ fprintf(out, "#endif\n");
+# endif /* BYFOUR */
+ fprintf(out, " }\n};\n");
+ fclose(out);
+ }
+#endif /* MAKECRCH */
+}
+
+#ifdef MAKECRCH
+local void write_table(
+ FILE *out,
+ const z_crc_t FAR *table)
+{
+ int n;
+
+ for (n = 0; n < 256; n++)
+ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
+ (unsigned long)(table[n]),
+ n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
+}
+#endif /* MAKECRCH */
+
+#else /* !DYNAMIC_CRC_TABLE */
+/* ========================================================================
+ * Tables of CRC-32s of all single-byte values, made by make_crc_table().
+ */
+#include "crc32.h"
+#endif /* DYNAMIC_CRC_TABLE */
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const z_crc_t FAR * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+ return (const z_crc_t FAR *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
+#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
+
+/* ========================================================================= */
+unsigned long ZEXPORT crc32(
+ unsigned long crc,
+ const unsigned char FAR *buf,
+ uInt len)
+{
+ if (buf == Z_NULL) return 0UL;
+
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+
+#ifdef BYFOUR
+ if (sizeof(void *) == sizeof(ptrdiff_t)) {
+ z_crc_t endian;
+
+ endian = 1;
+ if (*((unsigned char *)(&endian)))
+ return crc32_little(crc, buf, len);
+ else
+ return crc32_big(crc, buf, len);
+ }
+#endif /* BYFOUR */
+ crc = crc ^ 0xffffffffUL;
+ while (len >= 8) {
+ DO8;
+ len -= 8;
+ }
+ if (len) do {
+ DO1;
+ } while (--len);
+ return crc ^ 0xffffffffUL;
+}
+
+#ifdef BYFOUR
+
+/* ========================================================================= */
+#define DOLIT4 c ^= *buf4++; \
+ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
+ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
+#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
+
+/* ========================================================================= */
+local unsigned long crc32_little(
+ unsigned long crc,
+ const unsigned char FAR *buf,
+ unsigned len)
+{
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
+
+ c = (z_crc_t)crc;
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ len--;
+ }
+
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+ while (len >= 32) {
+ DOLIT32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOLIT4;
+ len -= 4;
+ }
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)c;
+}
+
+/* ========================================================================= */
+#define DOBIG4 c ^= *++buf4; \
+ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
+ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
+#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
+
+/* ========================================================================= */
+local unsigned long crc32_big(
+ unsigned long crc,
+ const unsigned char FAR *buf,
+ unsigned len)
+{
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
+
+ c = ZSWAP32((z_crc_t)crc);
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ len--;
+ }
+
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+ buf4--;
+ while (len >= 32) {
+ DOBIG32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOBIG4;
+ len -= 4;
+ }
+ buf4++;
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)(ZSWAP32(c));
+}
+
+#endif /* BYFOUR */
+
+#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
+
+/* ========================================================================= */
+local unsigned long gf2_matrix_times(
+ unsigned long *mat,
+ unsigned long vec)
+{
+ unsigned long sum;
+
+ sum = 0;
+ while (vec) {
+ if (vec & 1)
+ sum ^= *mat;
+ vec >>= 1;
+ mat++;
+ }
+ return sum;
+}
+
+/* ========================================================================= */
+local void gf2_matrix_square(
+ unsigned long *square,
+ unsigned long *mat)
+{
+ int n;
+
+ for (n = 0; n < GF2_DIM; n++)
+ square[n] = gf2_matrix_times(mat, mat[n]);
+}
+
+/* ========================================================================= */
+local uLong crc32_combine_(
+ uLong crc1,
+ uLong crc2,
+ z_off64_t len2)
+{
+ int n;
+ unsigned long row;
+ unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
+ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
+
+ /* degenerate case (also disallow negative lengths) */
+ if (len2 <= 0)
+ return crc1;
+
+ /* put operator for one zero bit in odd */
+ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
+ row = 1;
+ for (n = 1; n < GF2_DIM; n++) {
+ odd[n] = row;
+ row <<= 1;
+ }
+
+ /* put operator for two zero bits in even */
+ gf2_matrix_square(even, odd);
+
+ /* put operator for four zero bits in odd */
+ gf2_matrix_square(odd, even);
+
+ /* apply len2 zeros to crc1 (first square will put the operator for one
+ zero byte, eight zero bits, in even) */
+ do {
+ /* apply zeros operator for this bit of len2 */
+ gf2_matrix_square(even, odd);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(even, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ if (len2 == 0)
+ break;
+
+ /* another iteration of the loop with odd and even swapped */
+ gf2_matrix_square(odd, even);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(odd, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ } while (len2 != 0);
+
+ /* return combined crc */
+ crc1 ^= crc2;
+ return crc1;
+}
+
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine(
+ uLong crc1,
+ uLong crc2,
+ z_off_t len2)
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
+
+uLong ZEXPORT crc32_combine64(
+ uLong crc1,
+ uLong crc2,
+ z_off64_t len2)
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c
new file mode 100644
index 0000000000..1afe233c9a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_deflate.c
@@ -0,0 +1,1966 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process depends on being able to identify portions
+ * of the input text which are identical to earlier input (within a
+ * sliding window trailing behind the input currently being processed).
+ *
+ * The most straightforward technique turns out to be the fastest for
+ * most input files: try all possible matches and select the longest.
+ * The key feature of this algorithm is that insertions into the string
+ * dictionary are very simple and thus fast, and deletions are avoided
+ * completely. Insertions are performed at each input character, whereas
+ * string matches are performed only when the previous match ends. So it
+ * is preferable to spend more time in matches to allow very fast string
+ * insertions and avoid deletions. The matching algorithm for small
+ * strings is inspired from that of Rabin & Karp. A brute force approach
+ * is used to find longer strings when a small match has been found.
+ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ * (by Leonid Broukhis).
+ * A previous version of this file used a more sophisticated algorithm
+ * (by Fiala and Greene) which is guaranteed to run in linear amortized
+ * time, but has a larger average cost, uses more memory and is patented.
+ * However the F&G algorithm may be faster for some highly redundant
+ * files if the parameter max_chain_length (described below) is too large.
+ *
+ * ACKNOWLEDGEMENTS
+ *
+ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ * I found it in 'freeze' written by Leonid Broukhis.
+ * Thanks to many people for bug reports and testing.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ * Available in http://tools.ietf.org/html/rfc1951
+ *
+ * A description of the Rabin and Karp algorithm is given in the book
+ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ * Fiala,E.R., and Greene,D.H.
+ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+/* @(#) $Id$ */
+
+#include "deflate.h"
+
+const char deflate_copyright[] =
+ " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ * Function prototypes.
+ */
+typedef enum {
+ need_more, /* block not completed, need more input or more output */
+ block_done, /* block flush performed */
+ finish_started, /* finish started, need only more output at next deflate */
+ finish_done /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local void fill_window OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast OF((deflate_state *s, int flush));
+#ifndef FASTEST
+local block_state deflate_slow OF((deflate_state *s, int flush));
+#endif
+local block_state deflate_rle OF((deflate_state *s, int flush));
+local block_state deflate_huff OF((deflate_state *s, int flush));
+local void lm_init OF((deflate_state *s));
+local void putShortMSB OF((deflate_state *s, uInt b));
+local void flush_pending OF((z_streamp strm));
+local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifdef ASMV
+ void match_init OF((void)); /* asm code initialization */
+ uInt longest_match OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match OF((deflate_state *s, IPos cur_match));
+#endif
+
+#ifdef DEBUG
+local void check_match OF((deflate_state *s, IPos start, IPos match,
+ int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+# define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+ ush good_length; /* reduce lazy search above this match length */
+ ush max_lazy; /* do not perform lazy search above this match length */
+ ush nice_length; /* quit search above this match length */
+ ush max_chain;
+ compress_func func;
+} config;
+
+#ifdef FASTEST
+local const config configuration_table[2] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */
+#else
+local const config configuration_table[10] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
+/* 2 */ {4, 5, 16, 8, deflate_fast},
+/* 3 */ {4, 6, 32, 32, deflate_fast},
+
+/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
+/* 5 */ {8, 16, 32, 32, deflate_slow},
+/* 6 */ {8, 16, 128, 128, deflate_slow},
+/* 7 */ {8, 32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
+#endif
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+#ifndef NO_DUMMY_DECL
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
+#endif
+
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
+#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to to UPDATE_HASH are made with consecutive
+ * input characters, so that a running hash key can be computed from the
+ * previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN assertion: all calls to to INSERT_STRING are made with consecutive
+ * input characters and the first MIN_MATCH bytes of str are valid
+ * (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+ s->head[s->hash_size-1] = NIL; \
+ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(
+ z_streamp strm,
+ int level,
+ const char *version,
+ int stream_size)
+{
+ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+ Z_DEFAULT_STRATEGY, version, stream_size);
+ /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(
+ z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char *version,
+ int stream_size)
+{
+ deflate_state *s;
+ int wrap = 1;
+ static const char my_version[] = ZLIB_VERSION;
+
+ ushf *overlay;
+ /* We overlay pending_buf and d_buf+l_buf. This works since the average
+ * output size for (length,distance) codes is <= 24 bits.
+ */
+
+ if (version == Z_NULL || version[0] != my_version[0] ||
+ stream_size != sizeof(z_stream)) {
+ return Z_VERSION_ERROR;
+ }
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+ strm->msg = Z_NULL;
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+
+ if (windowBits < 0) { /* suppress zlib wrapper */
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+#ifdef GZIP
+ else if (windowBits > 15) {
+ wrap = 2; /* write gzip wrapper instead */
+ windowBits -= 16;
+ }
+#endif
+ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+ strategy < 0 || strategy > Z_FIXED) {
+ return Z_STREAM_ERROR;
+ }
+ if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
+ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+ if (s == Z_NULL) return Z_MEM_ERROR;
+ strm->state = (struct internal_state FAR *)s;
+ s->strm = strm;
+
+ s->wrap = wrap;
+ s->gzhead = Z_NULL;
+ s->w_bits = windowBits;
+ s->w_size = 1 << s->w_bits;
+ s->w_mask = s->w_size - 1;
+
+ s->hash_bits = memLevel + 7;
+ s->hash_size = 1 << s->hash_bits;
+ s->hash_mask = s->hash_size - 1;
+ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
+ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+ s->high_water = 0; /* nothing written to s->window yet */
+
+ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+ s->pending_buf = (uchf *) overlay;
+ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+ s->pending_buf == Z_NULL) {
+ s->status = FINISH_STATE;
+ strm->msg = ERR_MSG(Z_MEM_ERROR);
+ deflateEnd (strm);
+ return Z_MEM_ERROR;
+ }
+ s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+ s->level = level;
+ s->strategy = strategy;
+ s->method = (Byte)method;
+
+ return deflateReset(strm);
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (
+ z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength)
+{
+ deflate_state *s;
+ uInt str, n;
+ int wrap;
+ unsigned avail;
+ z_const unsigned char *next;
+
+ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
+ return Z_STREAM_ERROR;
+ s = strm->state;
+ wrap = s->wrap;
+ if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
+ return Z_STREAM_ERROR;
+
+ /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+ if (wrap == 1)
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+ s->wrap = 0; /* avoid computing Adler-32 in read_buf */
+
+ /* if dictionary would fill window, just replace the history */
+ if (dictLength >= s->w_size) {
+ if (wrap == 0) { /* already empty otherwise */
+ CLEAR_HASH(s);
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ dictionary += dictLength - s->w_size; /* use the tail */
+ dictLength = s->w_size;
+ }
+
+ /* insert dictionary into window and hash */
+ avail = strm->avail_in;
+ next = strm->next_in;
+ strm->avail_in = dictLength;
+ strm->next_in = (z_const Bytef *)dictionary;
+ fill_window(s);
+ while (s->lookahead >= MIN_MATCH) {
+ str = s->strstart;
+ n = s->lookahead - (MIN_MATCH-1);
+ do {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ } while (--n);
+ s->strstart = str;
+ s->lookahead = MIN_MATCH-1;
+ fill_window(s);
+ }
+ s->strstart += s->lookahead;
+ s->block_start = (long)s->strstart;
+ s->insert = s->lookahead;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ strm->next_in = next;
+ strm->avail_in = avail;
+ s->wrap = wrap;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateResetKeep (
+ z_streamp strm)
+{
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
+ return Z_STREAM_ERROR;
+ }
+
+ strm->total_in = strm->total_out = 0;
+ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+ strm->data_type = Z_UNKNOWN;
+
+ s = (deflate_state *)strm->state;
+ s->pending = 0;
+ s->pending_out = s->pending_buf;
+
+ if (s->wrap < 0) {
+ s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
+ }
+ s->status = s->wrap ? INIT_STATE : BUSY_STATE;
+ strm->adler =
+#ifdef GZIP
+ s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
+#endif
+ adler32(0L, Z_NULL, 0);
+ s->last_flush = Z_NO_FLUSH;
+
+ _tr_init(s);
+
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (
+ z_streamp strm)
+{
+ int ret;
+
+ ret = deflateResetKeep(strm);
+ if (ret == Z_OK)
+ lm_init(strm->state);
+ return ret;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetHeader (strm, head)
+ z_streamp strm;
+ gz_headerp head;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ if (strm->state->wrap != 2) return Z_STREAM_ERROR;
+ strm->state->gzhead = head;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePending (
+ z_streamp strm,
+ unsigned *pending,
+ int *bits)
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ if (pending != Z_NULL)
+ *pending = strm->state->pending;
+ if (bits != Z_NULL)
+ *bits = strm->state->bi_valid;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePrime (strm, bits, value)
+ z_streamp strm;
+ int bits;
+ int value;
+{
+ deflate_state *s;
+ int put;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+ if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+ do {
+ put = Buf_size - s->bi_valid;
+ if (put > bits)
+ put = bits;
+ s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
+ s->bi_valid += put;
+ _tr_flush_bits(s);
+ value >>= put;
+ bits -= put;
+ } while (bits);
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(
+ z_streamp strm,
+ int level,
+ int strategy)
+{
+ deflate_state *s;
+ compress_func func;
+ int err = Z_OK;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
+ return Z_STREAM_ERROR;
+ }
+ func = configuration_table[s->level].func;
+
+ if ((strategy != s->strategy || func != configuration_table[level].func) &&
+ strm->total_in != 0) {
+ /* Flush the last buffer: */
+ err = deflate(strm, Z_BLOCK);
+ if (err == Z_BUF_ERROR && s->pending == 0)
+ err = Z_OK;
+ }
+ if (s->level != level) {
+ s->level = level;
+ s->max_lazy_match = configuration_table[level].max_lazy;
+ s->good_match = configuration_table[level].good_length;
+ s->nice_match = configuration_table[level].nice_length;
+ s->max_chain_length = configuration_table[level].max_chain;
+ }
+ s->strategy = strategy;
+ return err;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateTune(
+ z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain)
+{
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+ s->good_match = good_length;
+ s->max_lazy_match = max_lazy;
+ s->nice_match = nice_length;
+ s->max_chain_length = max_chain;
+ return Z_OK;
+}
+
+/* =========================================================================
+ * For the default windowBits of 15 and memLevel of 8, this function returns
+ * a close to exact, as well as small, upper bound on the compressed size.
+ * They are coded as constants here for a reason--if the #define's are
+ * changed, then this function needs to be changed as well. The return
+ * value for 15 and 8 only works for those exact settings.
+ *
+ * For any setting other than those defaults for windowBits and memLevel,
+ * the value returned is a conservative worst case for the maximum expansion
+ * resulting from using fixed blocks instead of stored blocks, which deflate
+ * can emit on compressed data for some combinations of the parameters.
+ *
+ * This function could be more sophisticated to provide closer upper bounds for
+ * every combination of windowBits and memLevel. But even the conservative
+ * upper bound of about 14% expansion does not seem onerous for output buffer
+ * allocation.
+ */
+uLong ZEXPORT deflateBound(
+ z_streamp strm,
+ uLong sourceLen)
+{
+ deflate_state *s;
+ uLong complen, wraplen;
+ Bytef *str;
+
+ /* conservative upper bound for compressed data */
+ complen = sourceLen +
+ ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+
+ /* if can't get parameters, return conservative bound plus zlib wrapper */
+ if (strm == Z_NULL || strm->state == Z_NULL)
+ return complen + 6;
+
+ /* compute wrapper length */
+ s = strm->state;
+ switch (s->wrap) {
+ case 0: /* raw deflate */
+ wraplen = 0;
+ break;
+ case 1: /* zlib wrapper */
+ wraplen = 6 + (s->strstart ? 4 : 0);
+ break;
+ case 2: /* gzip wrapper */
+ wraplen = 18;
+ if (s->gzhead != Z_NULL) { /* user-supplied gzip header */
+ if (s->gzhead->extra != Z_NULL)
+ wraplen += 2 + s->gzhead->extra_len;
+ str = s->gzhead->name;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ str = s->gzhead->comment;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ if (s->gzhead->hcrc)
+ wraplen += 2;
+ }
+ break;
+ default: /* for compiler happiness */
+ wraplen = 6;
+ }
+
+ /* if not default parameters, return conservative bound */
+ if (s->w_bits != 15 || s->hash_bits != 8 + 7)
+ return complen + wraplen;
+
+ /* default settings: return tight bound for that case */
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13 - 6 + wraplen;
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (
+ deflate_state *s,
+ uInt b)
+{
+ put_byte(s, (Byte)(b >> 8));
+ put_byte(s, (Byte)(b & 0xff));
+}
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->next_out buffer and copying into it.
+ * (See also read_buf()).
+ */
+local void flush_pending(
+ z_streamp strm)
+{
+ unsigned len;
+ deflate_state *s = strm->state;
+
+ _tr_flush_bits(s);
+ len = s->pending;
+ if (len > strm->avail_out) len = strm->avail_out;
+ if (len == 0) return;
+
+ zmemcpy(strm->next_out, s->pending_out, len);
+ strm->next_out += len;
+ s->pending_out += len;
+ strm->total_out += len;
+ strm->avail_out -= len;
+ s->pending -= len;
+ if (s->pending == 0) {
+ s->pending_out = s->pending_buf;
+ }
+}
+
+/* ========================================================================= */
+int ZEXPORT deflate (
+ z_streamp strm,
+ int flush)
+{
+ int old_flush; /* value of flush param for previous deflate call */
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ flush > Z_BLOCK || flush < 0) {
+ return Z_STREAM_ERROR;
+ }
+ s = strm->state;
+
+ if (strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0) ||
+ (s->status == FINISH_STATE && flush != Z_FINISH)) {
+ ERR_RETURN(strm, Z_STREAM_ERROR);
+ }
+ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+ s->strm = strm; /* just in case */
+ old_flush = s->last_flush;
+ s->last_flush = flush;
+
+ /* Write the header */
+ if (s->status == INIT_STATE) {
+#ifdef GZIP
+ if (s->wrap == 2) {
+ strm->adler = crc32(0L, Z_NULL, 0);
+ put_byte(s, 31);
+ put_byte(s, 139);
+ put_byte(s, 8);
+ if (s->gzhead == Z_NULL) {
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, OS_CODE);
+ s->status = BUSY_STATE;
+ }
+ else {
+ put_byte(s, (s->gzhead->text ? 1 : 0) +
+ (s->gzhead->hcrc ? 2 : 0) +
+ (s->gzhead->extra == Z_NULL ? 0 : 4) +
+ (s->gzhead->name == Z_NULL ? 0 : 8) +
+ (s->gzhead->comment == Z_NULL ? 0 : 16)
+ );
+ put_byte(s, (Byte)(s->gzhead->time & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, s->gzhead->os & 0xff);
+ if (s->gzhead->extra != Z_NULL) {
+ put_byte(s, s->gzhead->extra_len & 0xff);
+ put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
+ }
+ if (s->gzhead->hcrc)
+ strm->adler = crc32(strm->adler, s->pending_buf,
+ s->pending);
+ s->gzindex = 0;
+ s->status = EXTRA_STATE;
+ }
+ }
+ else
+#endif
+ {
+ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+ uInt level_flags;
+
+ if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
+ level_flags = 0;
+ else if (s->level < 6)
+ level_flags = 1;
+ else if (s->level == 6)
+ level_flags = 2;
+ else
+ level_flags = 3;
+ header |= (level_flags << 6);
+ if (s->strstart != 0) header |= PRESET_DICT;
+ header += 31 - (header % 31);
+
+ s->status = BUSY_STATE;
+ putShortMSB(s, header);
+
+ /* Save the adler32 of the preset dictionary: */
+ if (s->strstart != 0) {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ strm->adler = adler32(0L, Z_NULL, 0);
+ }
+ }
+#ifdef GZIP
+ if (s->status == EXTRA_STATE) {
+ if (s->gzhead->extra != Z_NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+
+ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size)
+ break;
+ }
+ put_byte(s, s->gzhead->extra[s->gzindex]);
+ s->gzindex++;
+ }
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (s->gzindex == s->gzhead->extra_len) {
+ s->gzindex = 0;
+ s->status = NAME_STATE;
+ }
+ }
+ else
+ s->status = NAME_STATE;
+ }
+ if (s->status == NAME_STATE) {
+ if (s->gzhead->name != Z_NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+ int val;
+
+ do {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size) {
+ val = 1;
+ break;
+ }
+ }
+ val = s->gzhead->name[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (val == 0) {
+ s->gzindex = 0;
+ s->status = COMMENT_STATE;
+ }
+ }
+ else
+ s->status = COMMENT_STATE;
+ }
+ if (s->status == COMMENT_STATE) {
+ if (s->gzhead->comment != Z_NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+ int val;
+
+ do {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size) {
+ val = 1;
+ break;
+ }
+ }
+ val = s->gzhead->comment[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (val == 0)
+ s->status = HCRC_STATE;
+ }
+ else
+ s->status = HCRC_STATE;
+ }
+ if (s->status == HCRC_STATE) {
+ if (s->gzhead->hcrc) {
+ if (s->pending + 2 > s->pending_buf_size)
+ flush_pending(strm);
+ if (s->pending + 2 <= s->pending_buf_size) {
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ strm->adler = crc32(0L, Z_NULL, 0);
+ s->status = BUSY_STATE;
+ }
+ }
+ else
+ s->status = BUSY_STATE;
+ }
+#endif
+
+ /* Flush as much pending output as possible */
+ if (s->pending != 0) {
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ /* Since avail_out is 0, deflate will be called again with
+ * more output space, but possibly with both pending and
+ * avail_in equal to zero. There won't be anything to do,
+ * but this is not an error situation so make sure we
+ * return OK instead of BUF_ERROR at next call of deflate:
+ */
+ s->last_flush = -1;
+ return Z_OK;
+ }
+
+ /* Make sure there is something to do and avoid duplicate consecutive
+ * flushes. For repeated and useless calls with Z_FINISH, we keep
+ * returning Z_STREAM_END instead of Z_BUF_ERROR.
+ */
+ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
+ flush != Z_FINISH) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* User must not provide more input after the first FINISH: */
+ if (s->status == FINISH_STATE && strm->avail_in != 0) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* Start a new block or continue the current one.
+ */
+ if (strm->avail_in != 0 || s->lookahead != 0 ||
+ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+ block_state bstate;
+
+ bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+ (s->strategy == Z_RLE ? deflate_rle(s, flush) :
+ (*(configuration_table[s->level].func))(s, flush));
+
+ if (bstate == finish_started || bstate == finish_done) {
+ s->status = FINISH_STATE;
+ }
+ if (bstate == need_more || bstate == finish_started) {
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+ }
+ return Z_OK;
+ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+ * of deflate should use the same flush parameter to make sure
+ * that the flush is complete. So we don't have to output an
+ * empty block here, this will be done at next call. This also
+ * ensures that for a very small output buffer, we emit at most
+ * one empty block.
+ */
+ }
+ if (bstate == block_done) {
+ if (flush == Z_PARTIAL_FLUSH) {
+ _tr_align(s);
+ } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+ _tr_stored_block(s, (char*)0, 0L, 0);
+ /* For a full flush, this empty block will be recognized
+ * as a special marker by inflate_sync().
+ */
+ if (flush == Z_FULL_FLUSH) {
+ CLEAR_HASH(s); /* forget history */
+ if (s->lookahead == 0) {
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ }
+ }
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+ return Z_OK;
+ }
+ }
+ }
+ Assert(strm->avail_out > 0, "bug2");
+
+ if (flush != Z_FINISH) return Z_OK;
+ if (s->wrap <= 0) return Z_STREAM_END;
+
+ /* Write the trailer */
+#ifdef GZIP
+ if (s->wrap == 2) {
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
+ put_byte(s, (Byte)(strm->total_in & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
+ }
+ else
+#endif
+ {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ flush_pending(strm);
+ /* If avail_out is zero, the application will call deflate again
+ * to flush the rest.
+ */
+ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
+ return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (
+ z_streamp strm)
+{
+ int status;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+
+ status = strm->state->status;
+ if (status != INIT_STATE &&
+ status != EXTRA_STATE &&
+ status != NAME_STATE &&
+ status != COMMENT_STATE &&
+ status != HCRC_STATE &&
+ status != BUSY_STATE &&
+ status != FINISH_STATE) {
+ return Z_STREAM_ERROR;
+ }
+
+ /* Deallocate in reverse order of allocations: */
+ TRY_FREE(strm, strm->state->pending_buf);
+ TRY_FREE(strm, strm->state->head);
+ TRY_FREE(strm, strm->state->prev);
+ TRY_FREE(strm, strm->state->window);
+
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+
+ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (
+ z_streamp dest,
+ z_streamp source)
+{
+#ifdef MAXSEG_64K
+ return Z_STREAM_ERROR;
+#else
+ deflate_state *ds;
+ deflate_state *ss;
+ ushf *overlay;
+
+
+ if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
+ return Z_STREAM_ERROR;
+ }
+
+ ss = source->state;
+
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+
+ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+ if (ds == Z_NULL) return Z_MEM_ERROR;
+ dest->state = (struct internal_state FAR *) ds;
+ zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
+ ds->strm = dest;
+
+ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
+ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
+ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+ ds->pending_buf = (uchf *) overlay;
+
+ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+ ds->pending_buf == Z_NULL) {
+ deflateEnd (dest);
+ return Z_MEM_ERROR;
+ }
+ /* following zmemcpy do not work for 16-bit MSDOS */
+ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+ zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+ ds->l_desc.dyn_tree = ds->dyn_ltree;
+ ds->d_desc.dyn_tree = ds->dyn_dtree;
+ ds->bl_desc.dyn_tree = ds->bl_tree;
+
+ return Z_OK;
+#endif /* MAXSEG_64K */
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read. All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local int read_buf(
+ z_streamp strm,
+ Bytef *buf,
+ unsigned size)
+{
+ unsigned len = strm->avail_in;
+
+ if (len > size) len = size;
+ if (len == 0) return 0;
+
+ strm->avail_in -= len;
+
+ zmemcpy(buf, strm->next_in, len);
+ if (strm->state->wrap == 1) {
+ strm->adler = adler32(strm->adler, buf, len);
+ }
+#ifdef GZIP
+ else if (strm->state->wrap == 2) {
+ strm->adler = crc32(strm->adler, buf, len);
+ }
+#endif
+ strm->next_in += len;
+ strm->total_in += len;
+
+ return (int)len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (
+ deflate_state *s)
+{
+ s->window_size = (ulg)2L*s->w_size;
+
+ CLEAR_HASH(s);
+
+ /* Set the default configuration parameters:
+ */
+ s->max_lazy_match = configuration_table[s->level].max_lazy;
+ s->good_match = configuration_table[s->level].good_length;
+ s->nice_match = configuration_table[s->level].nice_length;
+ s->max_chain_length = configuration_table[s->level].max_chain;
+
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->lookahead = 0;
+ s->insert = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ s->ins_h = 0;
+#ifndef FASTEST
+#ifdef ASMV
+ match_init(); /* initialize the asm code */
+#endif
+#endif
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+local uInt longest_match(
+ deflate_state *s,
+ IPos cur_match) /* current match */
+{
+ unsigned chain_length = s->max_chain_length;/* max hash chain length */
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = s->prev_length; /* best match length so far */
+ int nice_match = s->nice_match; /* stop if match long enough */
+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+ s->strstart - (IPos)MAX_DIST(s) : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+ Posf *prev = s->prev;
+ uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ushf*)scan;
+ register ush scan_end = *(ushf*)(scan+best_len-1);
+#else
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ register Byte scan_end1 = scan[best_len-1];
+ register Byte scan_end = scan[best_len];
+#endif
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ /* Do not waste too much time if we already have a good match: */
+ if (s->prev_length >= s->good_match) {
+ chain_length >>= 2;
+ }
+ /* Do not look for matches beyond the end of the input. This is necessary
+ * to make deflate deterministic.
+ */
+ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ do {
+ Assert(cur_match < s->strstart, "no future");
+ match = s->window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2. Note that the checks below
+ * for insufficient lookahead only occur occasionally for performance
+ * reasons. Therefore uninitialized memory will be accessed, and
+ * conditional jumps will be made that depend on those values.
+ * However the length of the match is limited to the lookahead, so
+ * the output of deflate is not affected by the uninitialized values.
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ushf*)(match+best_len-1) != scan_end ||
+ *(ushf*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ Assert(scan[2] == match[2], "scan[2]?");
+ scan++, match++;
+ do {
+ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ s->match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ushf*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & wmask]) > limit
+ && --chain_length != 0);
+
+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+ return s->lookahead;
+}
+#endif /* ASMV */
+
+#else /* FASTEST */
+
+/* ---------------------------------------------------------------------------
+ * Optimized version for FASTEST only
+ */
+local uInt longest_match(
+ deflate_state *s,
+ IPos cur_match) /* current match */
+{
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ Assert(cur_match < s->strstart, "no future");
+
+ match = s->window + cur_match;
+
+ /* Return failure if the match length is less than 2:
+ */
+ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match += 2;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+
+ if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+ s->match_start = cur_match;
+ return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
+}
+
+#endif /* FASTEST */
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(
+ deflate_state *s,
+ IPos start, IPos match,
+ int length)
+{
+ /* check that the match is indeed a match */
+ if (zmemcmp(s->window + match,
+ s->window + start, length) != EQUAL) {
+ fprintf(stderr, " start %u, match %u, length %d\n",
+ start, match, length);
+ do {
+ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+ } while (--length != 0);
+ z_error("invalid match");
+ }
+ if (z_verbose > 1) {
+ fprintf(stderr,"\\[%d,%d]", start-match, length);
+ do { putc(s->window[start++], stderr); } while (--length != 0);
+ }
+}
+#else
+# define check_match(s, start, match, length)
+#endif /* DEBUG */
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ * At least one byte has been read, or avail_in == 0; reads are
+ * performed for at least two bytes (required for the zip translate_eol
+ * option -- not supported here).
+ */
+local void fill_window(
+ deflate_state *s)
+{
+ register unsigned n, m;
+ register Posf *p;
+ unsigned more; /* Amount of free space at the end of the window. */
+ uInt wsize = s->w_size;
+
+ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+ do {
+ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+ /* Deal with !@#$% 64K limit: */
+ if (sizeof(int) <= 2) {
+ if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+ more = wsize;
+
+ } else if (more == (unsigned)(-1)) {
+ /* Very unlikely, but possible on 16 bit machine if
+ * strstart == 0 && lookahead == 1 (input done a byte at time)
+ */
+ more--;
+ }
+ }
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ if (s->strstart >= wsize+MAX_DIST(s)) {
+
+ zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
+ s->match_start -= wsize;
+ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
+ s->block_start -= (long) wsize;
+
+ /* Slide the hash table (could be avoided with 32 bit values
+ at the expense of memory usage). We slide even when level == 0
+ to keep the hash table consistent if we switch back to level > 0
+ later. (Using level 0 permanently is not an optimal usage of
+ zlib, so we don't care about this pathological case.)
+ */
+ n = s->hash_size;
+ p = &s->head[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ } while (--n);
+
+ n = wsize;
+#ifndef FASTEST
+ p = &s->prev[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ /* If n is not on any hash chain, prev[n] is garbage but
+ * its value will never be used.
+ */
+ } while (--n);
+#endif
+ more += wsize;
+ }
+ if (s->strm->avail_in == 0) break;
+
+ /* If there was no sliding:
+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+ * more == window_size - lookahead - strstart
+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+ * => more >= window_size - 2*WSIZE + 2
+ * In the BIG_MEM or MMAP case (not yet supported),
+ * window_size == input_size + MIN_LOOKAHEAD &&
+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+ * Otherwise, window_size == 2*WSIZE so more >= 2.
+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+ */
+ Assert(more >= 2, "more < 2");
+
+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+ s->lookahead += n;
+
+ /* Initialize the hash value now that we have some input: */
+ if (s->lookahead + s->insert >= MIN_MATCH) {
+ uInt str = s->strstart - s->insert;
+ s->ins_h = s->window[str];
+ UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ while (s->insert) {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ s->insert--;
+ if (s->lookahead + s->insert < MIN_MATCH)
+ break;
+ }
+ }
+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+ * but this is not important since only literal bytes will be emitted.
+ */
+
+ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+ /* If the WIN_INIT bytes after the end of the current data have never been
+ * written, then zero those bytes in order to avoid memory check reports of
+ * the use of uninitialized (or uninitialised as Julian writes) bytes by
+ * the longest match routines. Update the high water mark for the next
+ * time through here. WIN_INIT is set to MAX_MATCH since the longest match
+ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+ */
+ if (s->high_water < s->window_size) {
+ ulg curr = s->strstart + (ulg)(s->lookahead);
+ ulg init;
+
+ if (s->high_water < curr) {
+ /* Previous high water mark below current data -- zero WIN_INIT
+ * bytes or up to end of window, whichever is less.
+ */
+ init = s->window_size - curr;
+ if (init > WIN_INIT)
+ init = WIN_INIT;
+ zmemzero(s->window + curr, (unsigned)init);
+ s->high_water = curr + init;
+ }
+ else if (s->high_water < (ulg)curr + WIN_INIT) {
+ /* High water mark at or above current data, but below current data
+ * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+ * to end of window, whichever is less.
+ */
+ init = (ulg)curr + WIN_INIT - s->high_water;
+ if (init > s->window_size - s->high_water)
+ init = s->window_size - s->high_water;
+ zmemzero(s->window + s->high_water, (unsigned)init);
+ s->high_water += init;
+ }
+ }
+
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "not enough room for search");
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, last) { \
+ _tr_flush_block(s, (s->block_start >= 0L ? \
+ (charf *)&s->window[(unsigned)s->block_start] : \
+ (charf *)Z_NULL), \
+ (ulg)((long)s->strstart - s->block_start), \
+ (last)); \
+ s->block_start = s->strstart; \
+ flush_pending(s->strm); \
+ Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, last) { \
+ FLUSH_BLOCK_ONLY(s, last); \
+ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+local block_state deflate_stored(
+ deflate_state *s,
+ int flush)
+{
+ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+ * to pending_buf_size, and each stored block has a 5 byte header:
+ */
+ ulg max_block_size = 0xffff;
+ ulg max_start;
+
+ if (max_block_size > s->pending_buf_size - 5) {
+ max_block_size = s->pending_buf_size - 5;
+ }
+
+ /* Copy as much as possible from input to output: */
+ for (;;) {
+ /* Fill the window as much as possible: */
+ if (s->lookahead <= 1) {
+
+ Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+ s->block_start >= (long)s->w_size, "slide too late");
+
+ fill_window(s);
+ if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
+
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+ Assert(s->block_start >= 0L, "block gone");
+
+ s->strstart += s->lookahead;
+ s->lookahead = 0;
+
+ /* Emit a stored block if pending_buf will be full: */
+ max_start = s->block_start + max_block_size;
+ if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
+ /* strstart == 0 is possible when wraparound on 16-bit machine */
+ s->lookahead = (uInt)(s->strstart - max_start);
+ s->strstart = (uInt)max_start;
+ FLUSH_BLOCK(s, 0);
+ }
+ /* Flush if we may have to slide, otherwise block_start may become
+ * negative and the data will be gone:
+ */
+ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
+ FLUSH_BLOCK(s, 0);
+ }
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if ((long)s->strstart > s->block_start)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(
+ deflate_state *s,
+ int flush)
+{
+ IPos hash_head; /* head of the hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ hash_head = NIL;
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ * At this point we have always match_length < MIN_MATCH
+ */
+ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
+ }
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->match_start, s->match_length);
+
+ _tr_tally_dist(s, s->strstart - s->match_start,
+ s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+
+ /* Insert new strings in the hash table only if the match length
+ * is not too large. This saves time but degrades compression.
+ */
+#ifndef FASTEST
+ if (s->match_length <= s->max_insert_length &&
+ s->lookahead >= MIN_MATCH) {
+ s->match_length--; /* string at strstart already in table */
+ do {
+ s->strstart++;
+ INSERT_STRING(s, s->strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead.
+ */
+ } while (--s->match_length != 0);
+ s->strstart++;
+ } else
+#endif
+ {
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+ * matter since it will be recomputed at next deflate call.
+ */
+ }
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(
+ deflate_state *s,
+ int flush)
+{
+ IPos hash_head; /* head of hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ /* Process the input block. */
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ hash_head = NIL;
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ */
+ s->prev_length = s->match_length, s->prev_match = s->match_start;
+ s->match_length = MIN_MATCH-1;
+
+ if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+ s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
+
+ if (s->match_length <= 5 && (s->strategy == Z_FILTERED
+#if TOO_FAR <= 32767
+ || (s->match_length == MIN_MATCH &&
+ s->strstart - s->match_start > TOO_FAR)
+#endif
+ )) {
+
+ /* If prev_match is also MIN_MATCH, match_start is garbage
+ * but we will ignore the current match anyway.
+ */
+ s->match_length = MIN_MATCH-1;
+ }
+ }
+ /* If there was a match at the previous step and the current
+ * match is not better, output the previous match:
+ */
+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+ /* Do not insert strings in hash table beyond this. */
+
+ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+ _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ s->prev_length - MIN_MATCH, bflush);
+
+ /* Insert in hash table all strings up to the end of the match.
+ * strstart-1 and strstart are already inserted. If there is not
+ * enough lookahead, the last two strings are not inserted in
+ * the hash table.
+ */
+ s->lookahead -= s->prev_length-1;
+ s->prev_length -= 2;
+ do {
+ if (++s->strstart <= max_insert) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+ } while (--s->prev_length != 0);
+ s->match_available = 0;
+ s->match_length = MIN_MATCH-1;
+ s->strstart++;
+
+ if (bflush) FLUSH_BLOCK(s, 0);
+
+ } else if (s->match_available) {
+ /* If there was no match at the previous position, output a
+ * single literal. If there was a match but the current match
+ * is longer, truncate the previous match to a single literal.
+ */
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ if (bflush) {
+ FLUSH_BLOCK_ONLY(s, 0);
+ }
+ s->strstart++;
+ s->lookahead--;
+ if (s->strm->avail_out == 0) return need_more;
+ } else {
+ /* There is no previous match to compare with, wait for
+ * the next step to decide.
+ */
+ s->match_available = 1;
+ s->strstart++;
+ s->lookahead--;
+ }
+ }
+ Assert (flush != Z_NO_FLUSH, "no flush?");
+ if (s->match_available) {
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ s->match_available = 0;
+ }
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+#endif /* FASTEST */
+
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one. Do not maintain a hash table. (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+local block_state deflate_rle(
+ deflate_state *s,
+ int flush)
+{
+ int bflush; /* set if current block must be flushed */
+ uInt prev; /* byte at distance one to match */
+ Bytef *scan, *strend; /* scan goes up to strend for length of run */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the longest run, plus one for the unrolled loop.
+ */
+ if (s->lookahead <= MAX_MATCH) {
+ fill_window(s);
+ if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* See how many times the previous byte repeats */
+ s->match_length = 0;
+ if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
+ scan = s->window + s->strstart - 1;
+ prev = *scan;
+ if (prev == *++scan && prev == *++scan && prev == *++scan) {
+ strend = s->window + s->strstart + MAX_MATCH;
+ do {
+ } while (prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ scan < strend);
+ s->match_length = MAX_MATCH - (int)(strend - scan);
+ if (s->match_length > s->lookahead)
+ s->match_length = s->lookahead;
+ }
+ Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+ }
+
+ /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->strstart - 1, s->match_length);
+
+ _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
+ */
+local block_state deflate_huff(
+ deflate_state *s,
+ int flush)
+{
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we have a literal to write. */
+ if (s->lookahead == 0) {
+ fill_window(s);
+ if (s->lookahead == 0) {
+ if (flush == Z_NO_FLUSH)
+ return need_more;
+ break; /* flush the current block */
+ }
+ }
+
+ /* Output a literal byte */
+ s->match_length = 0;
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c
new file mode 100644
index 0000000000..157bbd64e9
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_infback.c
@@ -0,0 +1,640 @@
+/* infback.c -- inflate using a call-back interface
+ * Copyright (C) 1995-2011 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ This code is largely copied from inflate.c. Normally either infback.o or
+ inflate.o would be linked into an application--not both. The interface
+ with inffast.c is retained so that optimized assembler-coded versions of
+ inflate_fast() can be used with either inflate.c or infback.c.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+
+/*
+ strm provides memory allocation functions in zalloc and zfree, or
+ Z_NULL to use the library memory allocation functions.
+
+ windowBits is in the range 8..15, and window is a user-supplied
+ window and output buffer that is 2**windowBits bytes.
+ */
+int ZEXPORT inflateBackInit_(
+z_streamp strm,
+int windowBits,
+unsigned char FAR *window,
+const char *version,
+int stream_size)
+{
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL || window == Z_NULL ||
+ windowBits < 8 || windowBits > 15)
+ return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+ state = (struct inflate_state FAR *)ZALLOC(strm, 1,
+ sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (struct internal_state FAR *)state;
+ state->dmax = 32768U;
+ state->wbits = windowBits;
+ state->wsize = 1U << windowBits;
+ state->window = window;
+ state->wnext = 0;
+ state->whave = 0;
+ return Z_OK;
+}
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+local void fixedtables(
+struct inflate_state FAR *state)
+{
+#ifdef BUILDFIXED
+ static int virgin = 1;
+ static code *lenfix, *distfix;
+ static code fixed[544];
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ unsigned sym, bits;
+ static code *next;
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state->lens[sym++] = 8;
+ while (sym < 256) state->lens[sym++] = 9;
+ while (sym < 280) state->lens[sym++] = 7;
+ while (sym < 288) state->lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state->lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+ /* do this just once */
+ virgin = 0;
+ }
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+/* Macros for inflateBack(): */
+
+/* Load returned state from inflate_fast() */
+#define LOAD() \
+ do { \
+ put = strm->next_out; \
+ left = strm->avail_out; \
+ next = strm->next_in; \
+ have = strm->avail_in; \
+ hold = state->hold; \
+ bits = state->bits; \
+ } while (0)
+
+/* Set state from registers for inflate_fast() */
+#define RESTORE() \
+ do { \
+ strm->next_out = put; \
+ strm->avail_out = left; \
+ strm->next_in = next; \
+ strm->avail_in = have; \
+ state->hold = hold; \
+ state->bits = bits; \
+ } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Assure that some input is available. If input is requested, but denied,
+ then return a Z_BUF_ERROR from inflateBack(). */
+#define PULL() \
+ do { \
+ if (have == 0) { \
+ have = in(in_desc, &next); \
+ if (have == 0) { \
+ next = Z_NULL; \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflateBack()
+ with an error if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ PULL(); \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflateBack() with
+ an error. */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/* Assure that some output space is available, by writing out the window
+ if it's full. If the write fails, return from inflateBack() with a
+ Z_BUF_ERROR. */
+#define ROOM() \
+ do { \
+ if (left == 0) { \
+ put = state->window; \
+ left = state->wsize; \
+ state->whave = left; \
+ if (out(out_desc, put, left)) { \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/*
+ strm provides the memory allocation functions and window buffer on input,
+ and provides information on the unused input on return. For Z_DATA_ERROR
+ returns, strm will also provide an error message.
+
+ in() and out() are the call-back input and output functions. When
+ inflateBack() needs more input, it calls in(). When inflateBack() has
+ filled the window with output, or when it completes with data in the
+ window, it calls out() to write out the data. The application must not
+ change the provided input until in() is called again or inflateBack()
+ returns. The application must not change the window/output buffer until
+ inflateBack() returns.
+
+ in() and out() are called with a descriptor parameter provided in the
+ inflateBack() call. This parameter can be a structure that provides the
+ information required to do the read or write, as well as accumulated
+ information on the input and output such as totals and check values.
+
+ in() should return zero on failure. out() should return non-zero on
+ failure. If either in() or out() fails, than inflateBack() returns a
+ Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
+ was in() or out() that caused in the error. Otherwise, inflateBack()
+ returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
+ error, or Z_MEM_ERROR if it could not allocate memory for the state.
+ inflateBack() can also return Z_STREAM_ERROR if the input parameters
+ are not correct, i.e. strm is Z_NULL or the state was not initialized.
+ */
+int ZEXPORT inflateBack(
+z_streamp strm,
+in_func in,
+void FAR *in_desc,
+out_func out,
+void FAR *out_desc)
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have, left; /* available input and output */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code here; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ /* Check that the strm exists and that the state was initialized */
+ if (strm == Z_NULL || strm->state == Z_NULL)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* Reset the state */
+ strm->msg = Z_NULL;
+ state->mode = TYPE;
+ state->last = 0;
+ state->whave = 0;
+ next = strm->next_in;
+ have = next != Z_NULL ? strm->avail_in : 0;
+ hold = 0;
+ bits = 0;
+ put = state->window;
+ left = state->wsize;
+
+ /* Inflate until end of block marked as last */
+ for (;;)
+ switch (state->mode) {
+ case TYPE:
+ /* determine and dispatch block type */
+ if (state->last) {
+ BYTEBITS();
+ state->mode = DONE;
+ break;
+ }
+ NEEDBITS(3);
+ state->last = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = STORED;
+ break;
+ case 1: /* fixed block */
+ fixedtables(state);
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = LEN; /* decode codes */
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ state->mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+
+ case STORED:
+ /* get and verify stored block length */
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ state->mode = BAD;
+ break;
+ }
+ state->length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %u\n",
+ state->length));
+ INITBITS();
+
+ /* copy stored block from input to output */
+ while (state->length != 0) {
+ copy = state->length;
+ PULL();
+ ROOM();
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ state->length -= copy;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ state->mode = TYPE;
+ break;
+
+ case TABLE:
+ /* get dynamic table entries descriptor */
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+ if (state->nlen > 286 || state->ndist > 30) {
+ strm->msg = (char *)"too many length or distance symbols";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracev((stderr, "inflate: table sizes ok\n"));
+
+ /* get code length code lengths (not a typo) */
+ state->have = 0;
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 7;
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+
+ /* get length and distance code code lengths */
+ state->have = 0;
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.val < 16) {
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
+ }
+ else {
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ len = (unsigned)(state->lens[state->have - 1]);
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (state->mode == BAD) break;
+
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ state->mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftrees.h
+ concerning the ENOUGH constants, which depend on those values */
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 9;
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ state->mode = BAD;
+ break;
+ }
+ state->distcode = (code const FAR *)(state->next);
+ state->distbits = 6;
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+ &(state->next), &(state->distbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN;
+
+ case LEN:
+ /* use inflate_fast() if we have enough input and output */
+ if (have >= 6 && left >= 258) {
+ RESTORE();
+ if (state->whave < state->wsize)
+ state->whave = state->wsize - left;
+ inflate_fast(strm, state->wsize);
+ LOAD();
+ break;
+ }
+
+ /* get a literal, length, or end-of-block code */
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ state->length = (unsigned)here.val;
+
+ /* process literal */
+ if (here.op == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ ROOM();
+ *put++ = (unsigned char)(state->length);
+ left--;
+ state->mode = LEN;
+ break;
+ }
+
+ /* process end of block */
+ if (here.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+
+ /* invalid code */
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+
+ /* length code -- get extra bits, if any */
+ state->extra = (unsigned)(here.op) & 15;
+ if (state->extra != 0) {
+ NEEDBITS(state->extra);
+ state->length += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+ Tracevv((stderr, "inflate: length %u\n", state->length));
+
+ /* get distance code */
+ for (;;) {
+ here = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ state->offset = (unsigned)here.val;
+
+ /* get distance extra bits, if any */
+ state->extra = (unsigned)(here.op) & 15;
+ if (state->extra != 0) {
+ NEEDBITS(state->extra);
+ state->offset += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+ if (state->offset > state->wsize - (state->whave < state->wsize ?
+ left : 0)) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
+
+ /* copy match from window to output */
+ do {
+ ROOM();
+ copy = state->wsize - state->offset;
+ if (copy < left) {
+ from = put + copy;
+ copy = left - copy;
+ }
+ else {
+ from = put - state->offset;
+ copy = left;
+ }
+ if (copy > state->length) copy = state->length;
+ state->length -= copy;
+ left -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ } while (state->length != 0);
+ break;
+
+ case DONE:
+ /* inflate stream terminated properly -- write leftover output */
+ ret = Z_STREAM_END;
+ if (left < state->wsize) {
+ if (out(out_desc, state->window, state->wsize - left))
+ ret = Z_BUF_ERROR;
+ }
+ goto inf_leave;
+
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+
+ default: /* can't happen, but makes compilers happy */
+ ret = Z_STREAM_ERROR;
+ goto inf_leave;
+ }
+
+ /* Return unused input */
+ inf_leave:
+ strm->next_in = next;
+ strm->avail_in = have;
+ return ret;
+}
+
+int ZEXPORT inflateBackEnd(
+z_streamp strm)
+{
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c
new file mode 100644
index 0000000000..3fcffae498
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inffast.c
@@ -0,0 +1,340 @@
+/* inffast.c -- fast decoding
+ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifndef ASMINF
+
+/* Allow machine dependent optimization for post-increment or pre-increment.
+ Based on testing to date,
+ Pre-increment preferred for:
+ - PowerPC G3 (Adler)
+ - MIPS R5000 (Randers-Pehrson)
+ Post-increment preferred for:
+ - none
+ No measurable difference:
+ - Pentium III (Anderson)
+ - M68060 (Nikl)
+ */
+#ifdef POSTINC
+# define OFF 0
+# define PUP(a) *(a)++
+#else
+# define OFF 1
+# define PUP(a) *++(a)
+#endif
+
+/*
+ Decode literal, length, and distance codes and write out the resulting
+ literal and match bytes until either not enough input or output is
+ available, an end-of-block is encountered, or a data error is encountered.
+ When large enough input and output buffers are supplied to inflate(), for
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
+ inflate execution time is spent in this routine.
+
+ Entry assumptions:
+
+ state->mode == LEN
+ strm->avail_in >= 6
+ strm->avail_out >= 258
+ start >= strm->avail_out
+ state->bits < 8
+
+ On return, state->mode is one of:
+
+ LEN -- ran out of enough output space or enough available input
+ TYPE -- reached end of block code, inflate() to interpret next block
+ BAD -- error in block data
+
+ Notes:
+
+ - The maximum input bits used by a length/distance pair is 15 bits for the
+ length code, 5 bits for the length extra, 15 bits for the distance code,
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
+ checking for available input while decoding.
+
+ - The maximum bytes that a single length/distance pair can output is 258
+ bytes, which is the maximum length that can be coded. inflate_fast()
+ requires strm->avail_out >= 258 for each loop to avoid checking for
+ output space.
+ */
+void ZLIB_INTERNAL inflate_fast(
+z_streamp strm,
+unsigned start) /* inflate()'s starting value for strm->avail_out */
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *in; /* local strm->next_in */
+ z_const unsigned char FAR *last; /* have enough input while in < last */
+ unsigned char FAR *out; /* local strm->next_out */
+ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
+ unsigned char FAR *end; /* while out < end, enough space available */
+#ifdef INFLATE_STRICT
+ unsigned dmax; /* maximum distance from zlib header */
+#endif
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned wnext; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
+ unsigned long hold; /* local strm->hold */
+ unsigned bits; /* local strm->bits */
+ code const FAR *lcode; /* local strm->lencode */
+ code const FAR *dcode; /* local strm->distcode */
+ unsigned lmask; /* mask for first level of length codes */
+ unsigned dmask; /* mask for first level of distance codes */
+ code here; /* retrieved table entry */
+ unsigned op; /* code bits, operation, extra bits, or */
+ /* window position, window bytes to copy */
+ unsigned len; /* match length, unused bytes */
+ unsigned dist; /* match distance */
+ unsigned char FAR *from; /* where to copy match from */
+
+ /* copy state to local variables */
+ state = (struct inflate_state FAR *)strm->state;
+ in = strm->next_in - OFF;
+ last = in + (strm->avail_in - 5);
+ out = strm->next_out - OFF;
+ beg = out - (start - strm->avail_out);
+ end = out + (strm->avail_out - 257);
+#ifdef INFLATE_STRICT
+ dmax = state->dmax;
+#endif
+ wsize = state->wsize;
+ whave = state->whave;
+ wnext = state->wnext;
+ window = state->window;
+ hold = state->hold;
+ bits = state->bits;
+ lcode = state->lencode;
+ dcode = state->distcode;
+ lmask = (1U << state->lenbits) - 1;
+ dmask = (1U << state->distbits) - 1;
+
+ /* decode literals and length/distances until end-of-block or not enough
+ input data or output space */
+ do {
+ if (bits < 15) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ here = lcode[hold & lmask];
+ dolen:
+ op = (unsigned)(here.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(here.op);
+ if (op == 0) { /* literal */
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ PUP(out) = (unsigned char)(here.val);
+ }
+ else if (op & 16) { /* length base */
+ len = (unsigned)(here.val);
+ op &= 15; /* number of extra bits */
+ if (op) {
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ len += (unsigned)hold & ((1U << op) - 1);
+ hold >>= op;
+ bits -= op;
+ }
+ Tracevv((stderr, "inflate: length %u\n", len));
+ if (bits < 15) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ here = dcode[hold & dmask];
+ dodist:
+ op = (unsigned)(here.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(here.op);
+ if (op & 16) { /* distance base */
+ dist = (unsigned)(here.val);
+ op &= 15; /* number of extra bits */
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ }
+ dist += (unsigned)hold & ((1U << op) - 1);
+#ifdef INFLATE_STRICT
+ if (dist > dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ hold >>= op;
+ bits -= op;
+ Tracevv((stderr, "inflate: distance %u\n", dist));
+ op = (unsigned)(out - beg); /* max distance in output */
+ if (dist > op) { /* see if copy from window */
+ op = dist - op; /* distance back in window */
+ if (op > whave) {
+ if (state->sane) {
+ strm->msg =
+ (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ if (len <= op - whave) {
+ do {
+ PUP(out) = 0;
+ } while (--len);
+ continue;
+ }
+ len -= op - whave;
+ do {
+ PUP(out) = 0;
+ } while (--op > whave);
+ if (op == 0) {
+ from = out - dist;
+ do {
+ PUP(out) = PUP(from);
+ } while (--len);
+ continue;
+ }
+#endif
+ }
+ from = window - OFF;
+ if (wnext == 0) { /* very common case */
+ from += wsize - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ else if (wnext < op) { /* wrap around window */
+ from += wsize + wnext - op;
+ op -= wnext;
+ if (op < len) { /* some from end of window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = window - OFF;
+ if (wnext < len) { /* some from start of window */
+ op = wnext;
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ }
+ else { /* contiguous in window */
+ from += wnext - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ while (len > 2) {
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ len -= 3;
+ }
+ if (len) {
+ PUP(out) = PUP(from);
+ if (len > 1)
+ PUP(out) = PUP(from);
+ }
+ }
+ else {
+ from = out - dist; /* copy direct from output */
+ do { /* minimum length is three */
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ len -= 3;
+ } while (len > 2);
+ if (len) {
+ PUP(out) = PUP(from);
+ if (len > 1)
+ PUP(out) = PUP(from);
+ }
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level distance code */
+ here = dcode[here.val + (hold & ((1U << op) - 1))];
+ goto dodist;
+ }
+ else {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level length code */
+ here = lcode[here.val + (hold & ((1U << op) - 1))];
+ goto dolen;
+ }
+ else if (op & 32) { /* end-of-block */
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+ else {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ } while (in < last && out < end);
+
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+ len = bits >> 3;
+ in -= len;
+ bits -= len << 3;
+ hold &= (1U << bits) - 1;
+
+ /* update state and return */
+ strm->next_in = in + OFF;
+ strm->next_out = out + OFF;
+ strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
+ strm->avail_out = (unsigned)(out < end ?
+ 257 + (end - out) : 257 - (out - end));
+ state->hold = hold;
+ state->bits = bits;
+ return;
+}
+
+/*
+ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
+ - Using bit fields for code structure
+ - Different op definition to avoid & for extra bits (do & for table bits)
+ - Three separate decoding do-loops for direct, window, and wnext == 0
+ - Special case for distance > 1 copies to do overlapped load and store copy
+ - Explicit branch predictions (based on measured branch probabilities)
+ - Deferring match copy and interspersed it with decoding subsequent codes
+ - Swapping literal/length else
+ - Swapping window/direct else
+ - Larger unrolled copy loops (three is about right)
+ - Moving len -= 3 statement into middle of loop
+ */
+
+#endif /* !ASMINF */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c
new file mode 100644
index 0000000000..bc5e448daf
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inflate.c
@@ -0,0 +1,1513 @@
+/* inflate.c -- zlib decompression
+ * Copyright (C) 1995-2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * Change history:
+ *
+ * 1.2.beta0 24 Nov 2002
+ * - First version -- complete rewrite of inflate to simplify code, avoid
+ * creation of window when not needed, minimize use of window when it is
+ * needed, make inffast.c even faster, implement gzip decoding, and to
+ * improve code readability and style over the previous zlib inflate code
+ *
+ * 1.2.beta1 25 Nov 2002
+ * - Use pointers for available input and output checking in inffast.c
+ * - Remove input and output counters in inffast.c
+ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
+ * - Remove unnecessary second byte pull from length extra in inffast.c
+ * - Unroll direct copy to three copies per loop in inffast.c
+ *
+ * 1.2.beta2 4 Dec 2002
+ * - Change external routine names to reduce potential conflicts
+ * - Correct filename to inffixed.h for fixed tables in inflate.c
+ * - Make hbuf[] unsigned char to match parameter type in inflate.c
+ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
+ * to avoid negation problem on Alphas (64 bit) in inflate.c
+ *
+ * 1.2.beta3 22 Dec 2002
+ * - Add comments on state->bits assertion in inffast.c
+ * - Add comments on op field in inftrees.h
+ * - Fix bug in reuse of allocated window after inflateReset()
+ * - Remove bit fields--back to byte structure for speed
+ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
+ * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
+ * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
+ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
+ * - Use local copies of stream next and avail values, as well as local bit
+ * buffer and bit count in inflate()--for speed when inflate_fast() not used
+ *
+ * 1.2.beta4 1 Jan 2003
+ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
+ * - Move a comment on output buffer sizes from inffast.c to inflate.c
+ * - Add comments in inffast.c to introduce the inflate_fast() routine
+ * - Rearrange window copies in inflate_fast() for speed and simplification
+ * - Unroll last copy for window match in inflate_fast()
+ * - Use local copies of window variables in inflate_fast() for speed
+ * - Pull out common wnext == 0 case for speed in inflate_fast()
+ * - Make op and len in inflate_fast() unsigned for consistency
+ * - Add FAR to lcode and dcode declarations in inflate_fast()
+ * - Simplified bad distance check in inflate_fast()
+ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
+ * source file infback.c to provide a call-back interface to inflate for
+ * programs like gzip and unzip -- uses window as output buffer to avoid
+ * window copying
+ *
+ * 1.2.beta5 1 Jan 2003
+ * - Improved inflateBack() interface to allow the caller to provide initial
+ * input in strm.
+ * - Fixed stored blocks bug in inflateBack()
+ *
+ * 1.2.beta6 4 Jan 2003
+ * - Added comments in inffast.c on effectiveness of POSTINC
+ * - Typecasting all around to reduce compiler warnings
+ * - Changed loops from while (1) or do {} while (1) to for (;;), again to
+ * make compilers happy
+ * - Changed type of window in inflateBackInit() to unsigned char *
+ *
+ * 1.2.beta7 27 Jan 2003
+ * - Changed many types to unsigned or unsigned short to avoid warnings
+ * - Added inflateCopy() function
+ *
+ * 1.2.0 9 Mar 2003
+ * - Changed inflateBack() interface to provide separate opaque descriptors
+ * for the in() and out() functions
+ * - Changed inflateBack() argument and in_func typedef to swap the length
+ * and buffer address return values for the input function
+ * - Check next_in and next_out for Z_NULL on entry to inflate()
+ *
+ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifdef MAKEFIXED
+# ifndef BUILDFIXED
+# define BUILDFIXED
+# endif
+#endif
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
+ unsigned copy));
+#ifdef BUILDFIXED
+ void makefixed OF((void));
+#endif
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
+ unsigned len));
+
+int ZEXPORT inflateResetKeep(
+z_streamp strm)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ strm->total_in = strm->total_out = state->total = 0;
+ strm->msg = Z_NULL;
+ if (state->wrap) /* to support ill-conceived Java test suite */
+ strm->adler = state->wrap & 1;
+ state->mode = HEAD;
+ state->last = 0;
+ state->havedict = 0;
+ state->dmax = 32768U;
+ state->head = Z_NULL;
+ state->hold = 0;
+ state->bits = 0;
+ state->lencode = state->distcode = state->next = state->codes;
+ state->sane = 1;
+ state->back = -1;
+ Tracev((stderr, "inflate: reset\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateReset(
+z_streamp strm)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ state->wsize = 0;
+ state->whave = 0;
+ state->wnext = 0;
+ return inflateResetKeep(strm);
+}
+
+int ZEXPORT inflateReset2(
+z_streamp strm,
+int windowBits)
+{
+ int wrap;
+ struct inflate_state FAR *state;
+
+ /* get the state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* extract wrap request from windowBits parameter */
+ if (windowBits < 0) {
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+ else {
+ wrap = (windowBits >> 4) + 1;
+#ifdef GUNZIP
+ if (windowBits < 48)
+ windowBits &= 15;
+#endif
+ }
+
+ /* set number of window bits, free window if different */
+ if (windowBits && (windowBits < 8 || windowBits > 15))
+ return Z_STREAM_ERROR;
+ if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
+ ZFREE(strm, state->window);
+ state->window = Z_NULL;
+ }
+
+ /* update state and reset the rest of it */
+ state->wrap = wrap;
+ state->wbits = (unsigned)windowBits;
+ return inflateReset(strm);
+}
+
+int ZEXPORT inflateInit2_(
+z_streamp strm,
+int windowBits,
+const char *version,
+int stream_size)
+{
+ int ret;
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+ state = (struct inflate_state FAR *)
+ ZALLOC(strm, 1, sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (struct internal_state FAR *)state;
+ state->window = Z_NULL;
+ ret = inflateReset2(strm, windowBits);
+ if (ret != Z_OK) {
+ ZFREE(strm, state);
+ strm->state = Z_NULL;
+ }
+ return ret;
+}
+
+int ZEXPORT inflateInit_(
+z_streamp strm,
+const char *version,
+int stream_size)
+{
+ return inflateInit2_(strm, DEF_WBITS, version, stream_size);
+}
+
+int ZEXPORT inflatePrime(
+z_streamp strm,
+int bits,
+int value)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (bits < 0) {
+ state->hold = 0;
+ state->bits = 0;
+ return Z_OK;
+ }
+ if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
+ value &= (1L << bits) - 1;
+ state->hold += value << state->bits;
+ state->bits += bits;
+ return Z_OK;
+}
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+local void fixedtables(
+struct inflate_state FAR *state)
+{
+#ifdef BUILDFIXED
+ static int virgin = 1;
+ static code *lenfix, *distfix;
+ static code fixed[544];
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ unsigned sym, bits;
+ static code *next;
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state->lens[sym++] = 8;
+ while (sym < 256) state->lens[sym++] = 9;
+ while (sym < 280) state->lens[sym++] = 7;
+ while (sym < 288) state->lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state->lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+ /* do this just once */
+ virgin = 0;
+ }
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+#ifdef MAKEFIXED
+#include <stdio.h>
+
+/*
+ Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
+ defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
+ those tables to stdout, which would be piped to inffixed.h. A small program
+ can simply call makefixed to do this:
+
+ void makefixed(void);
+
+ int main(void)
+ {
+ makefixed();
+ return 0;
+ }
+
+ Then that can be linked with zlib built with MAKEFIXED defined and run:
+
+ a.out > inffixed.h
+ */
+void makefixed()
+{
+ unsigned low, size;
+ struct inflate_state state;
+
+ fixedtables(&state);
+ puts(" /* inffixed.h -- table for decoding fixed codes");
+ puts(" * Generated automatically by makefixed().");
+ puts(" */");
+ puts("");
+ puts(" /* WARNING: this file should *not* be used by applications.");
+ puts(" It is part of the implementation of this library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ size = 1U << 9;
+ printf(" static const code lenfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 7) == 0) printf("\n ");
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+ state.lencode[low].bits, state.lencode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+ size = 1U << 5;
+ printf("\n static const code distfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 6) == 0) printf("\n ");
+ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
+ state.distcode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+}
+#endif /* MAKEFIXED */
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning. If window does not exist yet, create it. This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
+ */
+local int updatewindow(
+z_streamp strm,
+const Bytef *end,
+unsigned copy)
+{
+ struct inflate_state FAR *state;
+ unsigned dist;
+
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* if it hasn't been done already, allocate space for the window */
+ if (state->window == Z_NULL) {
+ state->window = (unsigned char FAR *)
+ ZALLOC(strm, 1U << state->wbits,
+ sizeof(unsigned char));
+ if (state->window == Z_NULL) return 1;
+ }
+
+ /* if window not in use yet, initialize */
+ if (state->wsize == 0) {
+ state->wsize = 1U << state->wbits;
+ state->wnext = 0;
+ state->whave = 0;
+ }
+
+ /* copy state->wsize or less output bytes into the circular window */
+ if (copy >= state->wsize) {
+ zmemcpy(state->window, end - state->wsize, state->wsize);
+ state->wnext = 0;
+ state->whave = state->wsize;
+ }
+ else {
+ dist = state->wsize - state->wnext;
+ if (dist > copy) dist = copy;
+ zmemcpy(state->window + state->wnext, end - copy, dist);
+ copy -= dist;
+ if (copy) {
+ zmemcpy(state->window, end - copy, copy);
+ state->wnext = copy;
+ state->whave = state->wsize;
+ }
+ else {
+ state->wnext += dist;
+ if (state->wnext == state->wsize) state->wnext = 0;
+ if (state->whave < state->wsize) state->whave += dist;
+ }
+ }
+ return 0;
+}
+
+/* Macros for inflate(): */
+
+/* check function to use adler32() for zlib or crc32() for gzip */
+#ifdef GUNZIP
+# define UPDATE(check, buf, len) \
+ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
+#else
+# define UPDATE(check, buf, len) adler32(check, buf, len)
+#endif
+
+/* check macros for header crc */
+#ifdef GUNZIP
+# define CRC2(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ check = crc32(check, hbuf, 2); \
+ } while (0)
+
+# define CRC4(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ hbuf[2] = (unsigned char)((word) >> 16); \
+ hbuf[3] = (unsigned char)((word) >> 24); \
+ check = crc32(check, hbuf, 4); \
+ } while (0)
+#endif
+
+/* Load registers with state in inflate() for speed */
+#define LOAD() \
+ do { \
+ put = strm->next_out; \
+ left = strm->avail_out; \
+ next = strm->next_in; \
+ have = strm->avail_in; \
+ hold = state->hold; \
+ bits = state->bits; \
+ } while (0)
+
+/* Restore state from registers in inflate() */
+#define RESTORE() \
+ do { \
+ strm->next_out = put; \
+ strm->avail_out = left; \
+ strm->next_in = next; \
+ strm->avail_in = have; \
+ state->hold = hold; \
+ state->bits = bits; \
+ } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflate()
+ if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ if (have == 0) goto inf_leave; \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflate(). */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/*
+ inflate() uses a state machine to process as much input data and generate as
+ much output data as possible before returning. The state machine is
+ structured roughly as follows:
+
+ for (;;) switch (state) {
+ ...
+ case STATEn:
+ if (not enough input data or output space to make progress)
+ return;
+ ... make progress ...
+ state = STATEm;
+ break;
+ ...
+ }
+
+ so when inflate() is called again, the same case is attempted again, and
+ if the appropriate resources are provided, the machine proceeds to the
+ next state. The NEEDBITS() macro is usually the way the state evaluates
+ whether it can proceed or should return. NEEDBITS() does the return if
+ the requested bits are not available. The typical use of the BITS macros
+ is:
+
+ NEEDBITS(n);
+ ... do something with BITS(n) ...
+ DROPBITS(n);
+
+ where NEEDBITS(n) either returns from inflate() if there isn't enough
+ input left to load n bits into the accumulator, or it continues. BITS(n)
+ gives the low n bits in the accumulator. When done, DROPBITS(n) drops
+ the low n bits off the accumulator. INITBITS() clears the accumulator
+ and sets the number of available bits to zero. BYTEBITS() discards just
+ enough bits to put the accumulator on a byte boundary. After BYTEBITS()
+ and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
+
+ NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
+ if there is no input available. The decoding of variable length codes uses
+ PULLBYTE() directly in order to pull just enough bytes to decode the next
+ code, and no more.
+
+ Some states loop until they get enough input, making sure that enough
+ state information is maintained to continue the loop where it left off
+ if NEEDBITS() returns in the loop. For example, want, need, and keep
+ would all have to actually be part of the saved state in case NEEDBITS()
+ returns:
+
+ case STATEw:
+ while (want < need) {
+ NEEDBITS(n);
+ keep[want++] = BITS(n);
+ DROPBITS(n);
+ }
+ state = STATEx;
+ case STATEx:
+
+ As shown above, if the next state is also the next case, then the break
+ is omitted.
+
+ A state may also return if there is not enough output space available to
+ complete that state. Those states are copying stored data, writing a
+ literal byte, and copying a matching string.
+
+ When returning, a "goto inf_leave" is used to update the total counters,
+ update the check value, and determine whether any progress has been made
+ during that inflate() call in order to return the proper return code.
+ Progress is defined as a change in either strm->avail_in or strm->avail_out.
+ When there is a window, goto inf_leave will update the window with the last
+ output written. If a goto inf_leave occurs in the middle of decompression
+ and there is no window currently, goto inf_leave will create one and copy
+ output to the window for the next call of inflate().
+
+ In this implementation, the flush parameter of inflate() only affects the
+ return code (per zlib.h). inflate() always writes as much as possible to
+ strm->next_out, given the space available and the provided input--the effect
+ documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
+ the allocation of and copying into a sliding window until necessary, which
+ provides the effect documented in zlib.h for Z_FINISH when the entire input
+ stream available. So the only thing the flush parameter actually does is:
+ when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
+ will return Z_BUF_ERROR if it has not reached the end of the stream.
+ */
+
+int ZEXPORT inflate(
+z_streamp strm,
+int flush)
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have, left; /* available input and output */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned in, out; /* save starting available input and output */
+ unsigned copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code here; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+#ifdef GUNZIP
+ unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
+#endif
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0))
+ return Z_STREAM_ERROR;
+
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
+ LOAD();
+ in = have;
+ out = left;
+ ret = Z_OK;
+ for (;;)
+ switch (state->mode) {
+ case HEAD:
+ if (state->wrap == 0) {
+ state->mode = TYPEDO;
+ break;
+ }
+ NEEDBITS(16);
+#ifdef GUNZIP
+ if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
+ state->check = crc32(0L, Z_NULL, 0);
+ CRC2(state->check, hold);
+ INITBITS();
+ state->mode = FLAGS;
+ break;
+ }
+ state->flags = 0; /* expect zlib header */
+ if (state->head != Z_NULL)
+ state->head->done = -1;
+ if (!(state->wrap & 1) || /* check if zlib header allowed */
+#else
+ if (
+#endif
+ ((BITS(8) << 8) + (hold >> 8)) % 31) {
+ strm->msg = (char *)"incorrect header check";
+ state->mode = BAD;
+ break;
+ }
+ if (BITS(4) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ DROPBITS(4);
+ len = BITS(4) + 8;
+ if (state->wbits == 0)
+ state->wbits = len;
+ else if (len > state->wbits) {
+ strm->msg = (char *)"invalid window size";
+ state->mode = BAD;
+ break;
+ }
+ state->dmax = 1U << len;
+ Tracev((stderr, "inflate: zlib header ok\n"));
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = hold & 0x200 ? DICTID : TYPE;
+ INITBITS();
+ break;
+#ifdef GUNZIP
+ case FLAGS:
+ NEEDBITS(16);
+ state->flags = (int)(hold);
+ if ((state->flags & 0xff) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ if (state->flags & 0xe000) {
+ strm->msg = (char *)"unknown header flags set";
+ state->mode = BAD;
+ break;
+ }
+ if (state->head != Z_NULL)
+ state->head->text = (int)((hold >> 8) & 1);
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ state->mode = TIME;
+ case TIME:
+ NEEDBITS(32);
+ if (state->head != Z_NULL)
+ state->head->time = hold;
+ if (state->flags & 0x0200) CRC4(state->check, hold);
+ INITBITS();
+ state->mode = OS;
+ case OS:
+ NEEDBITS(16);
+ if (state->head != Z_NULL) {
+ state->head->xflags = (int)(hold & 0xff);
+ state->head->os = (int)(hold >> 8);
+ }
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ state->mode = EXLEN;
+ case EXLEN:
+ if (state->flags & 0x0400) {
+ NEEDBITS(16);
+ state->length = (unsigned)(hold);
+ if (state->head != Z_NULL)
+ state->head->extra_len = (unsigned)hold;
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ }
+ else if (state->head != Z_NULL)
+ state->head->extra = Z_NULL;
+ state->mode = EXTRA;
+ case EXTRA:
+ if (state->flags & 0x0400) {
+ copy = state->length;
+ if (copy > have) copy = have;
+ if (copy) {
+ if (state->head != Z_NULL &&
+ state->head->extra != Z_NULL) {
+ len = state->head->extra_len - state->length;
+ zmemcpy(state->head->extra + len, next,
+ len + copy > state->head->extra_max ?
+ state->head->extra_max - len : copy);
+ }
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ state->length -= copy;
+ }
+ if (state->length) goto inf_leave;
+ }
+ state->length = 0;
+ state->mode = NAME;
+ case NAME:
+ if (state->flags & 0x0800) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->name != Z_NULL &&
+ state->length < state->head->name_max)
+ state->head->name[state->length++] = len;
+ } while (len && copy < have);
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->name = Z_NULL;
+ state->length = 0;
+ state->mode = COMMENT;
+ case COMMENT:
+ if (state->flags & 0x1000) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->comment != Z_NULL &&
+ state->length < state->head->comm_max)
+ state->head->comment[state->length++] = len;
+ } while (len && copy < have);
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->comment = Z_NULL;
+ state->mode = HCRC;
+ case HCRC:
+ if (state->flags & 0x0200) {
+ NEEDBITS(16);
+ if (hold != (state->check & 0xffff)) {
+ strm->msg = (char *)"header crc mismatch";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ }
+ if (state->head != Z_NULL) {
+ state->head->hcrc = (int)((state->flags >> 9) & 1);
+ state->head->done = 1;
+ }
+ strm->adler = state->check = crc32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ break;
+#endif
+ case DICTID:
+ NEEDBITS(32);
+ strm->adler = state->check = ZSWAP32(hold);
+ INITBITS();
+ state->mode = DICT;
+ case DICT:
+ if (state->havedict == 0) {
+ RESTORE();
+ return Z_NEED_DICT;
+ }
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ case TYPE:
+ if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
+ case TYPEDO:
+ if (state->last) {
+ BYTEBITS();
+ state->mode = CHECK;
+ break;
+ }
+ NEEDBITS(3);
+ state->last = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = STORED;
+ break;
+ case 1: /* fixed block */
+ fixedtables(state);
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = LEN_; /* decode codes */
+ if (flush == Z_TREES) {
+ DROPBITS(2);
+ goto inf_leave;
+ }
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ state->mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+ case STORED:
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ state->mode = BAD;
+ break;
+ }
+ state->length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %u\n",
+ state->length));
+ INITBITS();
+ state->mode = COPY_;
+ if (flush == Z_TREES) goto inf_leave;
+ case COPY_:
+ state->mode = COPY;
+ case COPY:
+ copy = state->length;
+ if (copy) {
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ if (copy == 0) goto inf_leave;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ state->length -= copy;
+ break;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ state->mode = TYPE;
+ break;
+ case TABLE:
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+ if (state->nlen > 286 || state->ndist > 30) {
+ strm->msg = (char *)"too many length or distance symbols";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracev((stderr, "inflate: table sizes ok\n"));
+ state->have = 0;
+ state->mode = LENLENS;
+ case LENLENS:
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ state->lencode = (const code FAR *)(state->next);
+ state->lenbits = 7;
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+ state->have = 0;
+ state->mode = CODELENS;
+ case CODELENS:
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.val < 16) {
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
+ }
+ else {
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ len = state->lens[state->have - 1];
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (state->mode == BAD) break;
+
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ state->mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftrees.h
+ concerning the ENOUGH constants, which depend on those values */
+ state->next = state->codes;
+ state->lencode = (const code FAR *)(state->next);
+ state->lenbits = 9;
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ state->mode = BAD;
+ break;
+ }
+ state->distcode = (const code FAR *)(state->next);
+ state->distbits = 6;
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+ &(state->next), &(state->distbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN_;
+ if (flush == Z_TREES) goto inf_leave;
+ case LEN_:
+ state->mode = LEN;
+ case LEN:
+ if (have >= 6 && left >= 258) {
+ RESTORE();
+ inflate_fast(strm, out);
+ LOAD();
+ if (state->mode == TYPE)
+ state->back = -1;
+ break;
+ }
+ state->back = 0;
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ state->back += last.bits;
+ }
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ state->length = (unsigned)here.val;
+ if ((int)(here.op) == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ state->mode = LIT;
+ break;
+ }
+ if (here.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->back = -1;
+ state->mode = TYPE;
+ break;
+ }
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ state->extra = (unsigned)(here.op) & 15;
+ state->mode = LENEXT;
+ case LENEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->length += BITS(state->extra);
+ DROPBITS(state->extra);
+ state->back += state->extra;
+ }
+ Tracevv((stderr, "inflate: length %u\n", state->length));
+ state->was = state->length;
+ state->mode = DIST;
+ case DIST:
+ for (;;) {
+ here = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ state->back += last.bits;
+ }
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ state->offset = (unsigned)here.val;
+ state->extra = (unsigned)(here.op) & 15;
+ state->mode = DISTEXT;
+ case DISTEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->offset += BITS(state->extra);
+ DROPBITS(state->extra);
+ state->back += state->extra;
+ }
+#ifdef INFLATE_STRICT
+ if (state->offset > state->dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
+ state->mode = MATCH;
+ case MATCH:
+ if (left == 0) goto inf_leave;
+ copy = out - left;
+ if (state->offset > copy) { /* copy from window */
+ copy = state->offset - copy;
+ if (copy > state->whave) {
+ if (state->sane) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ Trace((stderr, "inflate.c too far\n"));
+ copy -= state->whave;
+ if (copy > state->length) copy = state->length;
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = 0;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+#endif
+ }
+ if (copy > state->wnext) {
+ copy -= state->wnext;
+ from = state->window + (state->wsize - copy);
+ }
+ else
+ from = state->window + (state->wnext - copy);
+ if (copy > state->length) copy = state->length;
+ }
+ else { /* copy from output */
+ from = put - state->offset;
+ copy = state->length;
+ }
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+ case LIT:
+ if (left == 0) goto inf_leave;
+ *put++ = (unsigned char)(state->length);
+ left--;
+ state->mode = LEN;
+ break;
+ case CHECK:
+ if (state->wrap) {
+ NEEDBITS(32);
+ out -= left;
+ strm->total_out += out;
+ state->total += out;
+ if (out)
+ strm->adler = state->check =
+ UPDATE(state->check, put - out, out);
+ out = left;
+ if ((
+#ifdef GUNZIP
+ state->flags ? hold :
+#endif
+ ZSWAP32(hold)) != state->check) {
+ strm->msg = (char *)"incorrect data check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: check matches trailer\n"));
+ }
+#ifdef GUNZIP
+ state->mode = LENGTH;
+ case LENGTH:
+ if (state->wrap && state->flags) {
+ NEEDBITS(32);
+ if (hold != (state->total & 0xffffffffUL)) {
+ strm->msg = (char *)"incorrect length check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: length matches trailer\n"));
+ }
+#endif
+ state->mode = DONE;
+ case DONE:
+ ret = Z_STREAM_END;
+ goto inf_leave;
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+ case MEM:
+ return Z_MEM_ERROR;
+ case SYNC:
+ default:
+ return Z_STREAM_ERROR;
+ }
+
+ /*
+ Return from inflate(), updating the total counts and the check value.
+ If there was no progress during the inflate() call, return a buffer
+ error. Call updatewindow() to create and/or update the window state.
+ Note: a memory error from inflate() is non-recoverable.
+ */
+ inf_leave:
+ RESTORE();
+ if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
+ (state->mode < CHECK || flush != Z_FINISH)))
+ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ in -= strm->avail_in;
+ out -= strm->avail_out;
+ strm->total_in += in;
+ strm->total_out += out;
+ state->total += out;
+ if (state->wrap && out)
+ strm->adler = state->check =
+ UPDATE(state->check, strm->next_out - out, out);
+ strm->data_type = state->bits + (state->last ? 64 : 0) +
+ (state->mode == TYPE ? 128 : 0) +
+ (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
+ if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
+ ret = Z_BUF_ERROR;
+ return ret;
+}
+
+int ZEXPORT inflateEnd(
+z_streamp strm)
+{
+ struct inflate_state FAR *state;
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->window != Z_NULL) ZFREE(strm, state->window);
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateGetDictionary(
+z_streamp strm,
+Bytef *dictionary,
+uInt *dictLength)
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* copy dictionary */
+ if (state->whave && dictionary != Z_NULL) {
+ zmemcpy(dictionary, state->window + state->wnext,
+ state->whave - state->wnext);
+ zmemcpy(dictionary + state->whave - state->wnext,
+ state->window, state->wnext);
+ }
+ if (dictLength != Z_NULL)
+ *dictLength = state->whave;
+ return Z_OK;
+}
+
+int ZEXPORT inflateSetDictionary(
+z_streamp strm,
+const Bytef *dictionary,
+uInt dictLength)
+{
+ struct inflate_state FAR *state;
+ unsigned long dictid;
+ int ret;
+
+ dictid = 0;
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->wrap != 0 && state->mode != DICT)
+ return Z_STREAM_ERROR;
+
+ /* check for correct dictionary identifier */
+ if (state->mode == DICT) {
+ dictid = adler32(0L, Z_NULL, 0);
+ dictid = adler32(dictid, dictionary, dictLength);
+ if (dictid != state->check)
+ return Z_DATA_ERROR;
+ }
+
+ /* copy dictionary to window using updatewindow(), which will amend the
+ existing dictionary if appropriate */
+ ret = updatewindow(strm, dictionary + dictLength, dictLength);
+ if (ret) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ state->havedict = 1;
+ Tracev((stderr, "inflate: dictionary set\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateGetHeader(
+z_streamp strm,
+gz_headerp head)
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
+
+ /* save header structure */
+ state->head = head;
+ head->done = 0;
+ return Z_OK;
+}
+
+/*
+ Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
+ or when out of input. When called, *have is the number of pattern bytes
+ found in order so far, in 0..3. On return *have is updated to the new
+ state. If on return *have equals four, then the pattern was found and the
+ return value is how many bytes were read including the last byte of the
+ pattern. If *have is less than four, then the pattern has not been found
+ yet and the return value is len. In the latter case, syncsearch() can be
+ called again with more data and the *have state. *have is initialized to
+ zero for the first call.
+ */
+local unsigned syncsearch(
+unsigned FAR *have,
+const unsigned char FAR *buf,
+unsigned len)
+{
+ unsigned got;
+ unsigned next;
+
+ got = *have;
+ next = 0;
+ while (next < len && got < 4) {
+ if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
+ got++;
+ else if (buf[next])
+ got = 0;
+ else
+ got = 4 - got;
+ next++;
+ }
+ *have = got;
+ return next;
+}
+
+int ZEXPORT inflateSync(
+z_streamp strm)
+{
+ unsigned len; /* number of bytes to look at or looked at */
+ unsigned long in, out; /* temporary to save total_in and total_out */
+ unsigned char buf[4]; /* to restore bit buffer to byte string */
+ struct inflate_state FAR *state;
+
+ /* check parameters */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
+
+ /* if first time, start search in bit buffer */
+ if (state->mode != SYNC) {
+ state->mode = SYNC;
+ state->hold <<= state->bits & 7;
+ state->bits -= state->bits & 7;
+ len = 0;
+ while (state->bits >= 8) {
+ buf[len++] = (unsigned char)(state->hold);
+ state->hold >>= 8;
+ state->bits -= 8;
+ }
+ state->have = 0;
+ syncsearch(&(state->have), buf, len);
+ }
+
+ /* search available input */
+ len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
+ strm->avail_in -= len;
+ strm->next_in += len;
+ strm->total_in += len;
+
+ /* return no joy or set up to restart inflate() on a new block */
+ if (state->have != 4) return Z_DATA_ERROR;
+ in = strm->total_in; out = strm->total_out;
+ inflateReset(strm);
+ strm->total_in = in; strm->total_out = out;
+ state->mode = TYPE;
+ return Z_OK;
+}
+
+/*
+ Returns true if inflate is currently at the end of a block generated by
+ Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+ implementation to provide an additional safety check. PPP uses
+ Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
+ block. When decompressing, PPP checks that at the end of input packet,
+ inflate is waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(
+z_streamp strm)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ return state->mode == STORED && state->bits == 0;
+}
+
+int ZEXPORT inflateCopy(
+z_streamp dest,
+z_streamp source)
+{
+ struct inflate_state FAR *state;
+ struct inflate_state FAR *copy;
+ unsigned char FAR *window;
+ unsigned wsize;
+
+ /* check input */
+ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
+ source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)source->state;
+
+ /* allocate space */
+ copy = (struct inflate_state FAR *)
+ ZALLOC(source, 1, sizeof(struct inflate_state));
+ if (copy == Z_NULL) return Z_MEM_ERROR;
+ window = Z_NULL;
+ if (state->window != Z_NULL) {
+ window = (unsigned char FAR *)
+ ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
+ if (window == Z_NULL) {
+ ZFREE(source, copy);
+ return Z_MEM_ERROR;
+ }
+ }
+
+ /* copy state */
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
+ if (state->lencode >= state->codes &&
+ state->lencode <= state->codes + ENOUGH - 1) {
+ copy->lencode = copy->codes + (state->lencode - state->codes);
+ copy->distcode = copy->codes + (state->distcode - state->codes);
+ }
+ copy->next = copy->codes + (state->next - state->codes);
+ if (window != Z_NULL) {
+ wsize = 1U << state->wbits;
+ zmemcpy(window, state->window, wsize);
+ }
+ copy->window = window;
+ dest->state = (struct internal_state FAR *)copy;
+ return Z_OK;
+}
+
+int ZEXPORT inflateUndermine(
+z_streamp strm,
+int subvert)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ state->sane = !subvert;
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ return Z_OK;
+#else
+ state->sane = 1;
+ return Z_DATA_ERROR;
+#endif
+}
+
+long ZEXPORT inflateMark(
+z_streamp strm)
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
+ state = (struct inflate_state FAR *)strm->state;
+ return ((long)(state->back) << 16) +
+ (state->mode == COPY ? state->length :
+ (state->mode == MATCH ? state->was - state->length : 0));
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c
new file mode 100644
index 0000000000..05ba1324f4
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_inftrees.c
@@ -0,0 +1,306 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#define MAXBITS 15
+
+const char inflate_copyright[] =
+ " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/*
+ Build a set of tables to decode the provided canonical Huffman code.
+ The code lengths are lens[0..codes-1]. The result starts at *table,
+ whose indices are 0..2^bits-1. work is a writable array of at least
+ lens shorts, which is used as a work area. type is the type of code
+ to be generated, CODES, LENS, or DISTS. On return, zero is success,
+ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
+ on return points to the next available entry's address. bits is the
+ requested root table index bits, and on return it is the actual root
+ table index bits. It will differ if the request is greater than the
+ longest code or if it is less than the shortest code.
+ */
+int ZLIB_INTERNAL inflate_table(
+codetype type,
+unsigned short FAR *lens,
+unsigned codes,
+code FAR * FAR *table,
+unsigned FAR *bits,
+unsigned short FAR *work)
+{
+ unsigned len; /* a code's length in bits */
+ unsigned sym; /* index of code symbols */
+ unsigned min, max; /* minimum and maximum code lengths */
+ unsigned root; /* number of index bits for root table */
+ unsigned curr; /* number of index bits for current table */
+ unsigned drop; /* code bits to drop for sub-table */
+ int left; /* number of prefix codes available */
+ unsigned used; /* code entries in table used */
+ unsigned huff; /* Huffman code */
+ unsigned incr; /* for incrementing code, index */
+ unsigned fill; /* index for replicating entries */
+ unsigned low; /* low bits for current root entry */
+ unsigned mask; /* mask for low root bits */
+ code here; /* table entry for duplication */
+ code FAR *next; /* next available space in table */
+ const unsigned short FAR *base; /* base value table to use */
+ const unsigned short FAR *extra; /* extra bits table to use */
+ int end; /* use base and extra for symbol > end */
+ unsigned short count[MAXBITS+1]; /* number of codes of each length */
+ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
+ static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
+ static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577, 0, 0};
+ static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
+ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+ 28, 28, 29, 29, 64, 64};
+
+ /*
+ Process a set of code lengths to create a canonical Huffman code. The
+ code lengths are lens[0..codes-1]. Each length corresponds to the
+ symbols 0..codes-1. The Huffman code is generated by first sorting the
+ symbols by length from short to long, and retaining the symbol order
+ for codes with equal lengths. Then the code starts with all zero bits
+ for the first code of the shortest length, and the codes are integer
+ increments for the same length, and zeros are appended as the length
+ increases. For the deflate format, these bits are stored backwards
+ from their more natural integer increment ordering, and so when the
+ decoding tables are built in the large loop below, the integer codes
+ are incremented backwards.
+
+ This routine assumes, but does not check, that all of the entries in
+ lens[] are in the range 0..MAXBITS. The caller must assure this.
+ 1..MAXBITS is interpreted as that code length. zero means that that
+ symbol does not occur in this code.
+
+ The codes are sorted by computing a count of codes for each length,
+ creating from that a table of starting indices for each length in the
+ sorted table, and then entering the symbols in order in the sorted
+ table. The sorted table is work[], with that space being provided by
+ the caller.
+
+ The length counts are used for other purposes as well, i.e. finding
+ the minimum and maximum length codes, determining if there are any
+ codes at all, checking for a valid set of lengths, and looking ahead
+ at length counts to determine sub-table sizes when building the
+ decoding tables.
+ */
+
+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+ for (len = 0; len <= MAXBITS; len++)
+ count[len] = 0;
+ for (sym = 0; sym < codes; sym++)
+ count[lens[sym]]++;
+
+ /* bound code lengths, force root to be within code lengths */
+ root = *bits;
+ for (max = MAXBITS; max >= 1; max--)
+ if (count[max] != 0) break;
+ if (root > max) root = max;
+ if (max == 0) { /* no symbols to code at all */
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)1;
+ here.val = (unsigned short)0;
+ *(*table)++ = here; /* make a table to force an error */
+ *(*table)++ = here;
+ *bits = 1;
+ return 0; /* no symbols, but wait for decoding to report error */
+ }
+ for (min = 1; min < max; min++)
+ if (count[min] != 0) break;
+ if (root < min) root = min;
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1;
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1;
+ left -= count[len];
+ if (left < 0) return -1; /* over-subscribed */
+ }
+ if (left > 0 && (type == CODES || max != 1))
+ return -1; /* incomplete set */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + count[len];
+
+ /* sort symbols by length, by symbol order within each length */
+ for (sym = 0; sym < codes; sym++)
+ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
+
+ /*
+ Create and fill in decoding tables. In this loop, the table being
+ filled is at next and has curr index bits. The code being used is huff
+ with length len. That code is converted to an index by dropping drop
+ bits off of the bottom. For codes where len is less than drop + curr,
+ those top drop + curr - len bits are incremented through all values to
+ fill the table with replicated entries.
+
+ root is the number of index bits for the root table. When len exceeds
+ root, sub-tables are created pointed to by the root entry with an index
+ of the low root bits of huff. This is saved in low to check for when a
+ new sub-table should be started. drop is zero when the root table is
+ being filled, and drop is root when sub-tables are being filled.
+
+ When a new sub-table is needed, it is necessary to look ahead in the
+ code lengths to determine what size sub-table is needed. The length
+ counts are used for this, and so count[] is decremented as codes are
+ entered in the tables.
+
+ used keeps track of how many table entries have been allocated from the
+ provided *table space. It is checked for LENS and DIST tables against
+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+ the initial root table size constants. See the comments in inftrees.h
+ for more information.
+
+ sym increments through all symbols, and the loop terminates when
+ all codes of length max, i.e. all codes, have been processed. This
+ routine permits incomplete codes, so another loop after this one fills
+ in the rest of the decoding tables with invalid code markers.
+ */
+
+ /* set up for code type */
+ switch (type) {
+ case CODES:
+ base = extra = work; /* dummy value--not used */
+ end = 19;
+ break;
+ case LENS:
+ base = lbase;
+ base -= 257;
+ extra = lext;
+ extra -= 257;
+ end = 256;
+ break;
+ default: /* DISTS */
+ base = dbase;
+ extra = dext;
+ end = -1;
+ }
+
+ /* initialize state for loop */
+ huff = 0; /* starting code */
+ sym = 0; /* starting code symbol */
+ len = min; /* starting code length */
+ next = *table; /* current table to fill in */
+ curr = root; /* current table index bits */
+ drop = 0; /* current bits to drop from code for index */
+ low = (unsigned)(-1); /* trigger new sub-table when len > root */
+ used = 1U << root; /* use root table entries */
+ mask = used - 1; /* mask for comparing low */
+
+ /* check available table space */
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
+ return 1;
+
+ /* process all codes and make table entries */
+ for (;;) {
+ /* create table entry */
+ here.bits = (unsigned char)(len - drop);
+ if ((int)(work[sym]) < end) {
+ here.op = (unsigned char)0;
+ here.val = work[sym];
+ }
+ else if ((int)(work[sym]) > end) {
+ here.op = (unsigned char)(extra[work[sym]]);
+ here.val = base[work[sym]];
+ }
+ else {
+ here.op = (unsigned char)(32 + 64); /* end of block */
+ here.val = 0;
+ }
+
+ /* replicate for those indices with low len bits equal to huff */
+ incr = 1U << (len - drop);
+ fill = 1U << curr;
+ min = fill; /* save offset to next table */
+ do {
+ fill -= incr;
+ next[(huff >> drop) + fill] = here;
+ } while (fill != 0);
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+
+ /* go to next symbol, update count, len */
+ sym++;
+ if (--(count[len]) == 0) {
+ if (len == max) break;
+ len = lens[work[sym]];
+ }
+
+ /* create new sub-table if needed */
+ if (len > root && (huff & mask) != low) {
+ /* if first time, transition to sub-tables */
+ if (drop == 0)
+ drop = root;
+
+ /* increment past last table */
+ next += min; /* here min is 1 << curr */
+
+ /* determine length of next table */
+ curr = len - drop;
+ left = (int)(1 << curr);
+ while (curr + drop < max) {
+ left -= count[curr + drop];
+ if (left <= 0) break;
+ curr++;
+ left <<= 1;
+ }
+
+ /* check for enough space */
+ used += 1U << curr;
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
+ return 1;
+
+ /* point entry in root table to sub-table */
+ low = huff & mask;
+ (*table)[low].op = (unsigned char)curr;
+ (*table)[low].bits = (unsigned char)root;
+ (*table)[low].val = (unsigned short)(next - *table);
+ }
+ }
+
+ /* fill in remaining table entry if code is incomplete (guaranteed to have
+ at most one remaining entry, since if the code is incomplete, the
+ maximum code length that was allowed to get this far is one bit) */
+ if (huff != 0) {
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)(len - drop);
+ here.val = (unsigned short)0;
+ next[huff] = here;
+ }
+
+ /* set return parameters */
+ *table += used;
+ *bits = root;
+ return 0;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c
new file mode 100644
index 0000000000..e1fd952046
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_trees.c
@@ -0,0 +1,1226 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-2012 Jean-loup Gailly
+ * detect_data_type() function provided freely by Cosmin Truta, 2006
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process uses several Huffman trees. The more
+ * common source values are represented by shorter bit sequences.
+ *
+ * Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values). The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ * Storer, James A.
+ * Data Compression: Methods and Theory, pp. 49-50.
+ * Computer Science Press, 1988. ISBN 0-7167-8156-5.
+ *
+ * Sedgewick, R.
+ * Algorithms, p290.
+ * Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* @(#) $Id$ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef DEBUG
+# include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6 16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10 17
+/* repeat a zero length 3-10 times (3 bits of repeat count) */
+
+#define REPZ_11_138 18
+/* repeat a zero length 11-138 times (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+# include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+ const ct_data *static_tree; /* static tree or NULL */
+ const intf *extra_bits; /* extra bits for each code or NULL */
+ int extra_base; /* base index for extra_bits */
+ int elems; /* max number of elements in the tree */
+ int max_length; /* max bit length for the codes */
+};
+
+local static_tree_desc static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local static_tree_desc static_d_desc =
+{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
+
+local static_tree_desc static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block OF((deflate_state *s));
+local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
+local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree OF((deflate_state *s, tree_desc *desc));
+local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local int build_bl_tree OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+ int blcodes));
+local void compress_block OF((deflate_state *s, const ct_data *ltree,
+ const ct_data *dtree));
+local int detect_data_type OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup OF((deflate_state *s));
+local void bi_flush OF((deflate_state *s));
+local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
+ int header));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef DEBUG
+# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+ /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+# define send_code(s, c, tree) \
+ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+ send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+ put_byte(s, (uch)((w) & 0xff)); \
+ put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits OF((deflate_state *s, int value, int length));
+
+local void send_bits(
+ deflate_state *s,
+ int value, /* value to send */
+ int length) /* number of bits */
+{
+ Tracevv((stderr," l %2d v %4x ", length, value));
+ Assert(length > 0 && length <= 15, "invalid length");
+ s->bits_sent += (ulg)length;
+
+ /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+ * unused bits in value.
+ */
+ if (s->bi_valid > (int)Buf_size - length) {
+ s->bi_buf |= (ush)value << s->bi_valid;
+ put_short(s, s->bi_buf);
+ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+ s->bi_valid += length - Buf_size;
+ } else {
+ s->bi_buf |= (ush)value << s->bi_valid;
+ s->bi_valid += length;
+ }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+ if (s->bi_valid > (int)Buf_size - len) {\
+ int val = value;\
+ s->bi_buf |= (ush)val << s->bi_valid;\
+ put_short(s, s->bi_buf);\
+ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+ s->bi_valid += len - Buf_size;\
+ } else {\
+ s->bi_buf |= (ush)(value) << s->bi_valid;\
+ s->bi_valid += len;\
+ }\
+}
+#endif /* DEBUG */
+
+
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+ static int static_init_done = 0;
+ int n; /* iterates over tree elements */
+ int bits; /* bit counter */
+ int length; /* length value */
+ int code; /* code value */
+ int dist; /* distance index */
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ if (static_init_done) return;
+
+ /* For some embedded targets, global variables are not initialized: */
+#ifdef NO_INIT_GLOBAL_POINTERS
+ static_l_desc.static_tree = static_ltree;
+ static_l_desc.extra_bits = extra_lbits;
+ static_d_desc.static_tree = static_dtree;
+ static_d_desc.extra_bits = extra_dbits;
+ static_bl_desc.extra_bits = extra_blbits;
+#endif
+
+ /* Initialize the mapping length (0..255) -> length code (0..28) */
+ length = 0;
+ for (code = 0; code < LENGTH_CODES-1; code++) {
+ base_length[code] = length;
+ for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ _length_code[length++] = (uch)code;
+ }
+ }
+ Assert (length == 256, "tr_static_init: length != 256");
+ /* Note that the length 255 (match length 258) can be represented
+ * in two different ways: code 284 + 5 bits or code 285, so we
+ * overwrite length_code[255] to use the best encoding:
+ */
+ _length_code[length-1] = (uch)code;
+
+ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+ dist = 0;
+ for (code = 0 ; code < 16; code++) {
+ base_dist[code] = dist;
+ for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ _dist_code[dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: dist != 256");
+ dist >>= 7; /* from now on, all distances are divided by 128 */
+ for ( ; code < D_CODES; code++) {
+ base_dist[code] = dist << 7;
+ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+ _dist_code[256 + dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+ /* Construct the codes of the static literal tree */
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+ n = 0;
+ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+ /* Codes 286 and 287 do not exist, but we must include them in the
+ * tree construction to get a canonical Huffman tree (longest code
+ * all ones)
+ */
+ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+ /* The static distance tree is trivial: */
+ for (n = 0; n < D_CODES; n++) {
+ static_dtree[n].Len = 5;
+ static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+ }
+ static_init_done = 1;
+
+# ifdef GEN_TREES_H
+ gen_trees_header();
+# endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+# ifndef DEBUG
+# include <stdio.h>
+# endif
+
+# define SEPARATOR(i, last, width) \
+ ((i) == (last)? "\n};\n\n" : \
+ ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+ FILE *header = fopen("trees.h", "w");
+ int i;
+
+ Assert (header != NULL, "Can't open trees.h");
+ fprintf(header,
+ "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+ fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+ for (i = 0; i < L_CODES+2; i++) {
+ fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+ static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+ }
+
+ fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+ static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+ }
+
+ fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");
+ for (i = 0; i < DIST_CODE_LEN; i++) {
+ fprintf(header, "%2u%s", _dist_code[i],
+ SEPARATOR(i, DIST_CODE_LEN-1, 20));
+ }
+
+ fprintf(header,
+ "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+ for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+ fprintf(header, "%2u%s", _length_code[i],
+ SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+ }
+
+ fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+ for (i = 0; i < LENGTH_CODES; i++) {
+ fprintf(header, "%1u%s", base_length[i],
+ SEPARATOR(i, LENGTH_CODES-1, 20));
+ }
+
+ fprintf(header, "local const int base_dist[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "%5u%s", base_dist[i],
+ SEPARATOR(i, D_CODES-1, 10));
+ }
+
+ fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void ZLIB_INTERNAL _tr_init(
+ deflate_state *s)
+{
+ tr_static_init();
+
+ s->l_desc.dyn_tree = s->dyn_ltree;
+ s->l_desc.stat_desc = &static_l_desc;
+
+ s->d_desc.dyn_tree = s->dyn_dtree;
+ s->d_desc.stat_desc = &static_d_desc;
+
+ s->bl_desc.dyn_tree = s->bl_tree;
+ s->bl_desc.stat_desc = &static_bl_desc;
+
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef DEBUG
+ s->compressed_len = 0L;
+ s->bits_sent = 0L;
+#endif
+
+ /* Initialize the first block of the first file: */
+ init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(
+ deflate_state *s)
+{
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+ s->dyn_ltree[END_BLOCK].Freq = 1;
+ s->opt_len = s->static_len = 0L;
+ s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+ top = s->heap[SMALLEST]; \
+ s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+ pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+ (tree[n].Freq < tree[m].Freq || \
+ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(
+ deflate_state *s,
+ ct_data *tree, /* the tree to restore */
+ int k) /* node to move down */
+{
+ int v = s->heap[k];
+ int j = k << 1; /* left son of k */
+ while (j <= s->heap_len) {
+ /* Set j to the smallest of the two sons: */
+ if (j < s->heap_len &&
+ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+ j++;
+ }
+ /* Exit if v is smaller than both sons */
+ if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+ /* Exchange v with the smallest son */
+ s->heap[k] = s->heap[j]; k = j;
+
+ /* And continue down the tree, setting j to the left son of k */
+ j <<= 1;
+ }
+ s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ * above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ * array bl_count contains the frequencies for each bit length.
+ * The length opt_len is updated; static_len is also updated if stree is
+ * not null.
+ */
+local void gen_bitlen(
+ deflate_state *s,
+ tree_desc *desc) /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ int max_code = desc->max_code;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ const intf *extra = desc->stat_desc->extra_bits;
+ int base = desc->stat_desc->extra_base;
+ int max_length = desc->stat_desc->max_length;
+ int h; /* heap index */
+ int n, m; /* iterate over the tree elements */
+ int bits; /* bit length */
+ int xbits; /* extra bits */
+ ush f; /* frequency */
+ int overflow = 0; /* number of elements with bit length too large */
+
+ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+ /* In a first pass, compute the optimal bit lengths (which may
+ * overflow in the case of the bit length tree).
+ */
+ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+ for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+ n = s->heap[h];
+ bits = tree[tree[n].Dad].Len + 1;
+ if (bits > max_length) bits = max_length, overflow++;
+ tree[n].Len = (ush)bits;
+ /* We overwrite tree[n].Dad which is no longer needed */
+
+ if (n > max_code) continue; /* not a leaf node */
+
+ s->bl_count[bits]++;
+ xbits = 0;
+ if (n >= base) xbits = extra[n-base];
+ f = tree[n].Freq;
+ s->opt_len += (ulg)f * (bits + xbits);
+ if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
+ }
+ if (overflow == 0) return;
+
+ Trace((stderr,"\nbit length overflow\n"));
+ /* This happens for example on obj2 and pic of the Calgary corpus */
+
+ /* Find the first bit length which could increase: */
+ do {
+ bits = max_length-1;
+ while (s->bl_count[bits] == 0) bits--;
+ s->bl_count[bits]--; /* move one leaf down the tree */
+ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+ s->bl_count[max_length]--;
+ /* The brother of the overflow item also moves one step up,
+ * but this does not affect bl_count[max_length]
+ */
+ overflow -= 2;
+ } while (overflow > 0);
+
+ /* Now recompute all bit lengths, scanning in increasing frequency.
+ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+ * lengths instead of fixing only the wrong ones. This idea is taken
+ * from 'ar' written by Haruhiko Okumura.)
+ */
+ for (bits = max_length; bits != 0; bits--) {
+ n = s->bl_count[bits];
+ while (n != 0) {
+ m = s->heap[--h];
+ if (m > max_code) continue;
+ if ((unsigned) tree[m].Len != (unsigned) bits) {
+ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+ s->opt_len += ((long)bits - (long)tree[m].Len)
+ *(long)tree[m].Freq;
+ tree[m].Len = (ush)bits;
+ }
+ n--;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes (
+ ct_data *tree, /* the tree to decorate */
+ int max_code, /* largest code with non zero frequency */
+ ushf *bl_count) /* number of codes at each bit length */
+{
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ ush code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = bi_reverse(next_code[len]++, len);
+
+ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ * and corresponding code. The length opt_len is updated; static_len is
+ * also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(
+ deflate_state *s,
+ tree_desc *desc) /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ int elems = desc->stat_desc->elems;
+ int n, m; /* iterate over heap elements */
+ int max_code = -1; /* largest code with non zero frequency */
+ int node; /* new node being created */
+
+ /* Construct the initial heap, with least frequent element in
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[0] is not used.
+ */
+ s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+ for (n = 0; n < elems; n++) {
+ if (tree[n].Freq != 0) {
+ s->heap[++(s->heap_len)] = max_code = n;
+ s->depth[n] = 0;
+ } else {
+ tree[n].Len = 0;
+ }
+ }
+
+ /* The pkzip format requires that at least one distance code exists,
+ * and that at least one bit should be sent even if there is only one
+ * possible code. So to avoid special checks later on we force at least
+ * two codes of non zero frequency.
+ */
+ while (s->heap_len < 2) {
+ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+ tree[node].Freq = 1;
+ s->depth[node] = 0;
+ s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+ /* node is 0 or 1 so it does not have extra bits */
+ }
+ desc->max_code = max_code;
+
+ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ * establish sub-heaps of increasing lengths:
+ */
+ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+ /* Construct the Huffman tree by repeatedly combining the least two
+ * frequent nodes.
+ */
+ node = elems; /* next internal node of the tree */
+ do {
+ pqremove(s, tree, n); /* n = node of least frequency */
+ m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+ s->heap[--(s->heap_max)] = m;
+
+ /* Create a new node father of n and m */
+ tree[node].Freq = tree[n].Freq + tree[m].Freq;
+ s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
+ s->depth[n] : s->depth[m]) + 1);
+ tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+ if (tree == s->bl_tree) {
+ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+ }
+#endif
+ /* and insert the new node in the heap */
+ s->heap[SMALLEST] = node++;
+ pqdownheap(s, tree, SMALLEST);
+
+ } while (s->heap_len >= 2);
+
+ s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+ /* At this point, the fields freq and dad are set. We can now
+ * generate the bit lengths.
+ */
+ gen_bitlen(s, (tree_desc *)desc);
+
+ /* The field len is now set, we can generate the bit codes */
+ gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (
+ deflate_state *s,
+ ct_data *tree, /* the tree to be scanned */
+ int max_code) /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ if (nextlen == 0) max_count = 138, min_count = 3;
+ tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ s->bl_tree[curlen].Freq += count;
+ } else if (curlen != 0) {
+ if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+ s->bl_tree[REP_3_6].Freq++;
+ } else if (count <= 10) {
+ s->bl_tree[REPZ_3_10].Freq++;
+ } else {
+ s->bl_tree[REPZ_11_138].Freq++;
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (
+ deflate_state *s,
+ ct_data *tree, /* the tree to be scanned */
+ int max_code) /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ /* tree[max_code+1].Len = -1; */ /* guard already set */
+ if (nextlen == 0) max_count = 138, min_count = 3;
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+ } else if (curlen != 0) {
+ if (curlen != prevlen) {
+ send_code(s, curlen, s->bl_tree); count--;
+ }
+ Assert(count >= 3 && count <= 6, " 3_6?");
+ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+ } else if (count <= 10) {
+ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+ } else {
+ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(
+ deflate_state *s)
+{
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ /* Determine the bit length frequencies for literal and distance trees */
+ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+ /* Build the bit length tree: */
+ build_tree(s, (tree_desc *)(&(s->bl_desc)));
+ /* opt_len now includes the length of the tree representations, except
+ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+ */
+
+ /* Determine the number of bit length codes to send. The pkzip format
+ * requires that at least 4 bit length codes be sent. (appnote.txt says
+ * 3 but the actual value used is 4.)
+ */
+ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+ }
+ /* Update opt_len to include the bit length tree and counts */
+ s->opt_len += 3*(max_blindex+1) + 5+5+4;
+ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+ s->opt_len, s->static_len));
+
+ return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(
+ deflate_state *s,
+ int lcodes, int dcodes, int blcodes) /* number of codes for each tree */
+{
+ int rank; /* index in bl_order */
+
+ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+ "too many codes");
+ Tracev((stderr, "\nbl counts: "));
+ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+ send_bits(s, dcodes-1, 5);
+ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
+ for (rank = 0; rank < blcodes; rank++) {
+ Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+ }
+ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void ZLIB_INTERNAL _tr_stored_block(
+ deflate_state *s,
+ charf *buf, /* input block */
+ ulg stored_len, /* length of input block */
+ int last) /* one if this is the last block for a file */
+{
+ send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */
+#ifdef DEBUG
+ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+ s->compressed_len += (stored_len + 4) << 3;
+#endif
+ copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
+}
+
+/* ===========================================================================
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
+ */
+void ZLIB_INTERNAL _tr_flush_bits(
+ deflate_state *s)
+{
+ bi_flush(s);
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ */
+void ZLIB_INTERNAL _tr_align(
+ deflate_state *s)
+{
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+ bi_flush(s);
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+void ZLIB_INTERNAL _tr_flush_block(
+ deflate_state *s,
+ charf *buf, /* input block, or NULL if too old */
+ ulg stored_len, /* length of input block */
+ int last) /* one if this is the last block for a file */
+{
+ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+ int max_blindex = 0; /* index of last bit length code of non zero freq */
+
+ /* Build the Huffman trees unless a stored block is forced */
+ if (s->level > 0) {
+
+ /* Check if the file is binary or text */
+ if (s->strm->data_type == Z_UNKNOWN)
+ s->strm->data_type = detect_data_type(s);
+
+ /* Construct the literal and distance trees */
+ build_tree(s, (tree_desc *)(&(s->l_desc)));
+ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+
+ build_tree(s, (tree_desc *)(&(s->d_desc)));
+ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+ /* At this point, opt_len and static_len are the total bit lengths of
+ * the compressed block data, excluding the tree representations.
+ */
+
+ /* Build the bit length tree for the above two trees, and get the index
+ * in bl_order of the last bit length code to send.
+ */
+ max_blindex = build_bl_tree(s);
+
+ /* Determine the best encoding. Compute the block lengths in bytes. */
+ opt_lenb = (s->opt_len+3+7)>>3;
+ static_lenb = (s->static_len+3+7)>>3;
+
+ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+ s->last_lit));
+
+ if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+ } else {
+ Assert(buf != (char*)0, "lost buf");
+ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+ }
+
+#ifdef FORCE_STORED
+ if (buf != (char*)0) { /* force stored block */
+#else
+ if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ /* 4: two words for the lengths */
+#endif
+ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+ * Otherwise we can't have processed more than WSIZE input bytes since
+ * the last block flush, because compression would have been
+ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+ * transform a block into a stored block.
+ */
+ _tr_stored_block(s, buf, stored_len, last);
+
+#ifdef FORCE_STATIC
+ } else if (static_lenb >= 0) { /* force static trees */
+#else
+ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
+#endif
+ send_bits(s, (STATIC_TREES<<1)+last, 3);
+ compress_block(s, (const ct_data *)static_ltree,
+ (const ct_data *)static_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->static_len;
+#endif
+ } else {
+ send_bits(s, (DYN_TREES<<1)+last, 3);
+ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+ max_blindex+1);
+ compress_block(s, (const ct_data *)s->dyn_ltree,
+ (const ct_data *)s->dyn_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->opt_len;
+#endif
+ }
+ Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+ /* The above check is made mod 2^32, for files larger than 512 MB
+ * and uLong implemented on 32 bits.
+ */
+ init_block(s);
+
+ if (last) {
+ bi_windup(s);
+#ifdef DEBUG
+ s->compressed_len += 7; /* align on byte boundary */
+#endif
+ }
+ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+ s->compressed_len-7*last));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int ZLIB_INTERNAL _tr_tally (
+ deflate_state *s,
+ unsigned dist, /* distance of matched string */
+ unsigned lc) /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+ s->d_buf[s->last_lit] = (ush)dist;
+ s->l_buf[s->last_lit++] = (uch)lc;
+ if (dist == 0) {
+ /* lc is the unmatched char */
+ s->dyn_ltree[lc].Freq++;
+ } else {
+ s->matches++;
+ /* Here, lc is the match length - MIN_MATCH */
+ dist--; /* dist = match distance - 1 */
+ Assert((ush)dist < (ush)MAX_DIST(s) &&
+ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
+
+ s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+ s->dyn_dtree[d_code(dist)].Freq++;
+ }
+
+#ifdef TRUNCATE_BLOCK
+ /* Try to guess if it is profitable to stop the current block here */
+ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+ /* Compute an upper bound for the compressed length */
+ ulg out_length = (ulg)s->last_lit*8L;
+ ulg in_length = (ulg)((long)s->strstart - s->block_start);
+ int dcode;
+ for (dcode = 0; dcode < D_CODES; dcode++) {
+ out_length += (ulg)s->dyn_dtree[dcode].Freq *
+ (5L+extra_dbits[dcode]);
+ }
+ out_length >>= 3;
+ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+ s->last_lit, in_length, out_length,
+ 100L - out_length*100L/in_length));
+ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+ }
+#endif
+ return (s->last_lit == s->lit_bufsize-1);
+ /* We avoid equality with lit_bufsize because of wraparound at 64K
+ * on 16 bit machines and because stored blocks are restricted to
+ * 64K-1 bytes.
+ */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(
+ deflate_state *s,
+ const ct_data *ltree, /* literal tree */
+ const ct_data *dtree) /* distance tree */
+{
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned lx = 0; /* running index in l_buf */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (s->last_lit != 0) do {
+ dist = s->d_buf[lx];
+ lc = s->l_buf[lx++];
+ if (dist == 0) {
+ send_code(s, lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = _length_code[lc];
+ send_code(s, code+LITERALS+1, ltree); /* send the length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(s, lc, extra); /* send the extra length bits */
+ }
+ dist--; /* dist is now the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(s, code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= base_dist[code];
+ send_bits(s, dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+
+ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+ "pendingBuf overflow");
+
+ } while (lx < s->last_lit);
+
+ send_code(s, END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ * a) There are no non-portable control characters belonging to the
+ * "black list" (0..6, 14..25, 28..31).
+ * b) There is at least one printable character belonging to the
+ * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ * "gray list" that is ignored in this detection algorithm:
+ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local int detect_data_type(
+ deflate_state *s)
+{
+ /* black_mask is the bit mask of black-listed bytes
+ * set bits 0..6, 14..25, and 28..31
+ * 0xf3ffc07f = binary 11110011111111111100000001111111
+ */
+ unsigned long black_mask = 0xf3ffc07fUL;
+ int n;
+
+ /* Check for non-textual ("black-listed") bytes. */
+ for (n = 0; n <= 31; n++, black_mask >>= 1)
+ if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+ return Z_BINARY;
+
+ /* Check for textual ("white-listed") bytes. */
+ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+ || s->dyn_ltree[13].Freq != 0)
+ return Z_TEXT;
+ for (n = 32; n < LITERALS; n++)
+ if (s->dyn_ltree[n].Freq != 0)
+ return Z_TEXT;
+
+ /* There are no "black-listed" or "white-listed" bytes:
+ * this stream either is empty or has tolerated ("gray-listed") bytes only.
+ */
+ return Z_BINARY;
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(
+ unsigned code, /* the value to invert */
+ int len) /* its bit length */
+{
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(
+ deflate_state *s)
+{
+ if (s->bi_valid == 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ } else if (s->bi_valid >= 8) {
+ put_byte(s, (Byte)s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(
+ deflate_state *s)
+{
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ } else if (s->bi_valid > 0) {
+ put_byte(s, (Byte)s->bi_buf);
+ }
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef DEBUG
+ s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+local void copy_block(
+ deflate_state *s,
+ charf *buf, /* the input data */
+ unsigned len, /* its length */
+ int header) /* true if block header must be written */
+{
+ bi_windup(s); /* align on byte boundary */
+
+ if (header) {
+ put_short(s, (ush)len);
+ put_short(s, (ush)~len);
+#ifdef DEBUG
+ s->bits_sent += 2*16;
+#endif
+ }
+#ifdef DEBUG
+ s->bits_sent += (ulg)len<<3;
+#endif
+ while (len--) {
+ put_byte(s, *buf++);
+ }
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c
new file mode 100644
index 0000000000..d3cb8fe183
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_uncompr.c
@@ -0,0 +1,59 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+int ZEXPORT uncompress (
+ Bytef *dest,
+ uLongf *destLen,
+ const Bytef *source,
+ uLong sourceLen)
+{
+ z_stream stream;
+ int err;
+
+ stream.next_in = (z_const Bytef *)source;
+ stream.avail_in = (uInt)sourceLen;
+ /* Check for source > 64K on 16-bit machine: */
+ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+ stream.next_out = dest;
+ stream.avail_out = (uInt)*destLen;
+ if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+
+ err = inflateInit(&stream);
+ if (err != Z_OK) return err;
+
+ err = inflate(&stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ inflateEnd(&stream);
+ if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
+ return Z_DATA_ERROR;
+ return err;
+ }
+ *destLen = stream.total_out;
+
+ err = inflateEnd(&stream);
+ return err;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c
new file mode 100644
index 0000000000..02b945f7d8
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/fx_zlib_zutil.c
@@ -0,0 +1,349 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+#ifndef Z_SOLO
+# include "gzguts.h"
+#endif
+
+#ifndef NO_DUMMY_DECL
+struct internal_state {int dummy;}; /* for buggy compilers */
+#endif
+
+z_const char * const z_errmsg[10] = {
+"need dictionary", /* Z_NEED_DICT 2 */
+"stream end", /* Z_STREAM_END 1 */
+"", /* Z_OK 0 */
+"file error", /* Z_ERRNO (-1) */
+"stream error", /* Z_STREAM_ERROR (-2) */
+"data error", /* Z_DATA_ERROR (-3) */
+"insufficient memory", /* Z_MEM_ERROR (-4) */
+"buffer error", /* Z_BUF_ERROR (-5) */
+"incompatible version",/* Z_VERSION_ERROR (-6) */
+""};
+
+
+const char * ZEXPORT zlibVersion()
+{
+ return ZLIB_VERSION;
+}
+
+uLong ZEXPORT zlibCompileFlags()
+{
+ uLong flags;
+
+ flags = 0;
+ switch ((int)(sizeof(uInt))) {
+ case 2: break;
+ case 4: flags += 1; break;
+ case 8: flags += 2; break;
+ default: flags += 3;
+ }
+ switch ((int)(sizeof(uLong))) {
+ case 2: break;
+ case 4: flags += 1 << 2; break;
+ case 8: flags += 2 << 2; break;
+ default: flags += 3 << 2;
+ }
+ switch ((int)(sizeof(voidpf))) {
+ case 2: break;
+ case 4: flags += 1 << 4; break;
+ case 8: flags += 2 << 4; break;
+ default: flags += 3 << 4;
+ }
+ switch ((int)(sizeof(z_off_t))) {
+ case 2: break;
+ case 4: flags += 1 << 6; break;
+ case 8: flags += 2 << 6; break;
+ default: flags += 3 << 6;
+ }
+#ifdef DEBUG
+ flags += 1 << 8;
+#endif
+#if defined(ASMV) || defined(ASMINF)
+ flags += 1 << 9;
+#endif
+#ifdef ZLIB_WINAPI
+ flags += 1 << 10;
+#endif
+#ifdef BUILDFIXED
+ flags += 1 << 12;
+#endif
+#ifdef DYNAMIC_CRC_TABLE
+ flags += 1 << 13;
+#endif
+#ifdef NO_GZCOMPRESS
+ flags += 1L << 16;
+#endif
+#ifdef NO_GZIP
+ flags += 1L << 17;
+#endif
+#ifdef PKZIP_BUG_WORKAROUND
+ flags += 1L << 20;
+#endif
+#ifdef FASTEST
+ flags += 1L << 21;
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifdef NO_vsnprintf
+ flags += 1L << 25;
+# ifdef HAS_vsprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_vsnprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#else
+ flags += 1L << 24;
+# ifdef NO_snprintf
+ flags += 1L << 25;
+# ifdef HAS_sprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_snprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#endif
+ return flags;
+}
+
+#ifdef DEBUG
+
+# ifndef verbose
+# define verbose 0
+# endif
+int ZLIB_INTERNAL z_verbose = verbose;
+
+void ZLIB_INTERNAL z_error (
+ char *m)
+{
+ fprintf(stderr, "%s\n", m);
+ exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(
+ int err)
+{
+ return ERR_MSG(err);
+}
+
+#if defined(_WIN32_WCE)
+ /* The Microsoft C Run-Time Library for Windows CE doesn't have
+ * errno. We define it as a global variable to simplify porting.
+ * Its value is always 0 and should not be used.
+ */
+ /* does not exist on WCE. XYQ: and we don't need it! */
+ /*int errno = 0;*/
+#endif
+
+#ifndef HAVE_MEMCPY
+
+void ZLIB_INTERNAL zmemcpy(
+ Bytef* dest,
+ const Bytef* source,
+ uInt len)
+{
+ if (len == 0) return;
+ do {
+ *dest++ = *source++; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+
+int ZLIB_INTERNAL zmemcmp(
+ const Bytef* s1,
+ const Bytef* s2,
+ uInt len)
+{
+ uInt j;
+
+ for (j = 0; j < len; j++) {
+ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+ }
+ return 0;
+}
+
+void ZLIB_INTERNAL zmemzero(
+ Bytef* dest,
+ uInt len)
+{
+ if (len == 0) return;
+ do {
+ *dest++ = 0; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+#endif
+
+#if 0
+#ifndef Z_SOLO
+
+#ifdef SYS16BIT
+
+#ifdef __TURBOC__
+/* Turbo C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+ voidpf org_ptr;
+ voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ voidpf buf = opaque; /* just to make some compilers happy */
+ ulg bsize = (ulg)items*size;
+
+ /* If we allocate less than 65520 bytes, we assume that farmalloc
+ * will return a usable pointer which doesn't have to be normalized.
+ */
+ if (bsize < 65520L) {
+ buf = farmalloc(bsize);
+ if (*(ush*)&buf != 0) return buf;
+ } else {
+ buf = farmalloc(bsize + 16L);
+ }
+ if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+ table[next_ptr].org_ptr = buf;
+
+ /* Normalize the pointer to seg:0 */
+ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+ *(ush*)&buf = 0;
+ table[next_ptr++].new_ptr = buf;
+ return buf;
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+ int n;
+ if (*(ush*)&ptr != 0) { /* object < 64K */
+ farfree(ptr);
+ return;
+ }
+ /* Find the original pointer */
+ for (n = 0; n < next_ptr; n++) {
+ if (ptr != table[n].new_ptr) continue;
+
+ farfree(table[n].org_ptr);
+ while (++n < next_ptr) {
+ table[n-1] = table[n];
+ }
+ next_ptr--;
+ return;
+ }
+ ptr = opaque; /* just to make some compilers happy */
+ Assert(0, "zcfree: ptr not found");
+}
+
+#endif /* __TURBOC__ */
+
+
+#ifdef M_I86
+/* Microsoft C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+# define _halloc halloc
+# define _hfree hfree
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ return _halloc((long)items, size);
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ _hfree(ptr);
+}
+
+#endif /* M_I86 */
+
+#endif /* SYS16BIT */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp malloc OF((uInt size));
+extern voidp calloc OF((uInt items, uInt size));
+extern void free OF((voidpf ptr));
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
+ voidpf opaque;
+ unsigned items;
+ unsigned size;
+{
+ if (opaque) items += size - size; /* make compiler happy */
+ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
+ (voidpf)calloc(items, size);
+}
+
+void ZLIB_INTERNAL zcfree (opaque, ptr)
+ voidpf opaque;
+ voidpf ptr;
+{
+ free(ptr);
+ if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
+
+#endif /* !Z_SOLO */
+#endif /* 0 */
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+extern void* FXMEM_DefaultAlloc(size_t, int);
+extern void FXMEM_DefaultFree(void*, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+/* XYQ 2007-1-19 */
+voidpf zcalloc(voidpf opaque, unsigned items, unsigned size)
+{
+ return FXMEM_DefaultAlloc(items * size, 0);
+}
+
+void zcfree(voidpf opaque, voidpf ptr)
+{
+ FXMEM_DefaultFree(ptr, 0);
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c
new file mode 100644
index 0000000000..0f010b84c8
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzclose.c
@@ -0,0 +1,25 @@
+/* gzclose.c -- zlib gzclose() function
+ * Copyright (C) 2004, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* gzclose() is in a separate file so that it is linked in only if it is used.
+ That way the other gzclose functions can be used instead to avoid linking in
+ unneeded compression or decompression routines. */
+int ZEXPORT gzclose(
+ gzFile file)
+{
+#ifndef NO_GZCOMPRESS
+ gz_statep state;
+
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
+#else
+ return gzclose_r(file);
+#endif
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h b/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h
new file mode 100644
index 0000000000..e4454aa65d
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzguts.h
@@ -0,0 +1,227 @@
+/* gzguts.h -- zlib internal header definitions for gz* operations
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#ifdef _LARGEFILE64_SOURCE
+# ifndef _LARGEFILE_SOURCE
+# define _LARGEFILE_SOURCE 1
+# endif
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+#endif
+
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
+#include <stdio.h>
+#include "zlib.h"
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+# include <limits.h>
+#endif
+#include <fcntl.h>
+
+#ifdef _WIN32
+# include <stddef.h>
+#endif
+
+#ifdef __APPLE__
+#include <unistd.h>
+#endif
+
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
+# include <io.h>
+#endif
+
+#ifdef WINAPI_FAMILY
+# define open _open
+# define read _read
+# define write _write
+# define close _close
+#endif
+
+#ifdef NO_DEFLATE /* for compatibility with old definition */
+# define NO_GZCOMPRESS
+#endif
+
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(__CYGWIN__)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+# ifdef MSDOS
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+ but for now we just assume it doesn't. */
+# define NO_vsnprintf
+# endif
+# ifdef __TURBOC__
+# define NO_vsnprintf
+# endif
+# ifdef WIN32
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+# if !defined(vsnprintf) && !defined(NO_vsnprintf)
+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+# define vsnprintf _vsnprintf
+# endif
+# endif
+# endif
+# ifdef __SASC
+# define NO_vsnprintf
+# endif
+# ifdef VMS
+# define NO_vsnprintf
+# endif
+# ifdef __OS400__
+# define NO_vsnprintf
+# endif
+# ifdef __MVS__
+# define NO_vsnprintf
+# endif
+#endif
+
+/* unlike snprintf (which is required in C99, yet still not supported by
+ Microsoft more than a decade later!), _snprintf does not guarantee null
+ termination of the result -- however this is only used in gzlib.c where
+ the result is assured to fit in the space provided */
+#ifdef _MSC_VER
+# define snprintf _snprintf
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+/* gz* functions always use library allocation functions */
+#ifndef STDC
+ extern voidp malloc OF((uInt size));
+ extern void free OF((voidpf ptr));
+#endif
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+extern void* FXMEM_DefaultAlloc(size_t, int);
+extern void FXMEM_DefaultFree(void*, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+#define malloc(size) FXMEM_DefaultAlloc(size, 0)
+#define free(ptr) FXMEM_DefaultFree(ptr, 0)
+
+/* get errno and strerror definition */
+#if defined UNDER_CE
+# include <windows.h>
+# define zstrerror() gz_strwinerror((DWORD)GetLastError())
+#else
+# ifndef NO_STRERROR
+# include <errno.h>
+# define zstrerror() strerror(errno)
+# else
+# define zstrerror() "stdio error (consult errno)"
+# endif
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+#endif
+
+/* default memLevel */
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+
+/* default i/o buffer size -- double this for output when reading (this and
+ twice this must be able to fit in an unsigned type) */
+#define GZBUFSIZE 8192
+
+/* gzip modes, also provide a little integrity check on the passed structure */
+#define GZ_NONE 0
+#define GZ_READ 7247
+#define GZ_WRITE 31153
+#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
+
+/* values for gz_state how */
+#define LOOK 0 /* look for a gzip header */
+#define COPY 1 /* copy input directly */
+#define GZIP 2 /* decompress a gzip stream */
+
+/* internal gzip file state data structure */
+typedef struct {
+ /* exposed contents for gzgetc() macro */
+ struct gzFile_s x; /* "x" for exposed */
+ /* x.have: number of bytes available at x.next */
+ /* x.next: next output data to deliver or write */
+ /* x.pos: current position in uncompressed data */
+ /* used for both reading and writing */
+ int mode; /* see gzip modes above */
+ int fd; /* file descriptor */
+ char *path; /* path or fd for error messages */
+ unsigned size; /* buffer size, zero if not allocated yet */
+ unsigned want; /* requested buffer size, default is GZBUFSIZE */
+ unsigned char *in; /* input buffer */
+ unsigned char *out; /* output buffer (double-sized when reading) */
+ int direct; /* 0 if processing gzip, 1 if transparent */
+ /* just for reading */
+ int how; /* 0: get header, 1: copy, 2: decompress */
+ z_off64_t start; /* where the gzip data started, for rewinding */
+ int eof; /* true if end of input file reached */
+ int past; /* true if read requested past end */
+ /* just for writing */
+ int level; /* compression level */
+ int strategy; /* compression strategy */
+ /* seek request */
+ z_off64_t skip; /* amount to skip (already rewound if backwards) */
+ int seek; /* true if seek request pending */
+ /* error information */
+ int err; /* error code */
+ char *msg; /* error message */
+ /* zlib inflate or deflate stream */
+ z_stream strm; /* stream structure in-place (not a pointer) */
+} gz_state;
+typedef gz_state FAR *gz_statep;
+
+/* shared functions */
+void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+#if defined UNDER_CE
+char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+#endif
+
+/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
+ value -- needed when comparing unsigned to z_off64_t, which is signed
+ (possible z_off64_t types off_t, off64_t, and long are all signed) */
+#ifdef INT_MAX
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
+#else
+unsigned ZLIB_INTERNAL gz_intmax OF((void));
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
+#endif
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c
new file mode 100644
index 0000000000..68b176478d
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzlib.c
@@ -0,0 +1,634 @@
+/* gzlib.c -- zlib functions common to reading and writing gzip files
+ * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+#if defined(_WIN32) && !defined(__BORLANDC__)
+# define LSEEK _lseeki64
+#else
+#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+# define LSEEK lseek64
+#else
+# define LSEEK lseek
+#endif
+#endif
+
+/* Local functions */
+local void gz_reset OF((gz_statep));
+local gzFile gz_open OF((const void *, int, const char *));
+
+#if defined UNDER_CE
+
+/* Map the Windows error number in ERROR to a locale-dependent error message
+ string and return a pointer to it. Typically, the values for ERROR come
+ from GetLastError.
+
+ The string pointed to shall not be modified by the application, but may be
+ overwritten by a subsequent call to gz_strwinerror
+
+ The gz_strwinerror function does not change the current setting of
+ GetLastError. */
+char ZLIB_INTERNAL *gz_strwinerror (
+ DWORD error)
+{
+ static char buf[1024];
+
+ wchar_t *msgbuf;
+ DWORD lasterr = GetLastError();
+ DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+ NULL,
+ error,
+ 0, /* Default language */
+ (LPVOID)&msgbuf,
+ 0,
+ NULL);
+ if (chars != 0) {
+ /* If there is an \r\n appended, zap it. */
+ if (chars >= 2
+ && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
+ chars -= 2;
+ msgbuf[chars] = 0;
+ }
+
+ if (chars > sizeof (buf) - 1) {
+ chars = sizeof (buf) - 1;
+ msgbuf[chars] = 0;
+ }
+
+ wcstombs(buf, msgbuf, chars + 1);
+ LocalFree(msgbuf);
+ }
+ else {
+ sprintf(buf, "unknown win32 error (%ld)", error);
+ }
+
+ SetLastError(lasterr);
+ return buf;
+}
+
+#endif /* UNDER_CE */
+
+/* Reset gzip file state */
+local void gz_reset(
+ gz_statep state)
+{
+ state->x.have = 0; /* no output data available */
+ if (state->mode == GZ_READ) { /* for reading ... */
+ state->eof = 0; /* not at end of file */
+ state->past = 0; /* have not read past end yet */
+ state->how = LOOK; /* look for gzip header */
+ }
+ state->seek = 0; /* no seek request pending */
+ gz_error(state, Z_OK, NULL); /* clear error */
+ state->x.pos = 0; /* no uncompressed data yet */
+ state->strm.avail_in = 0; /* no input data yet */
+}
+
+/* Open a gzip file either by name or file descriptor. */
+local gzFile gz_open(
+ const void *path,
+ int fd,
+ const char *mode)
+{
+ gz_statep state;
+ size_t len;
+ int oflag;
+#ifdef O_CLOEXEC
+ int cloexec = 0;
+#endif
+#ifdef O_EXCL
+ int exclusive = 0;
+#endif
+
+ /* check input */
+ if (path == NULL)
+ return NULL;
+
+ /* allocate gzFile structure to return */
+ state = (gz_statep)malloc(sizeof(gz_state));
+ if (state == NULL)
+ return NULL;
+ state->size = 0; /* no buffers allocated yet */
+ state->want = GZBUFSIZE; /* requested buffer size */
+ state->msg = NULL; /* no error message yet */
+
+ /* interpret mode */
+ state->mode = GZ_NONE;
+ state->level = Z_DEFAULT_COMPRESSION;
+ state->strategy = Z_DEFAULT_STRATEGY;
+ state->direct = 0;
+ while (*mode) {
+ if (*mode >= '0' && *mode <= '9')
+ state->level = *mode - '0';
+ else
+ switch (*mode) {
+ case 'r':
+ state->mode = GZ_READ;
+ break;
+#ifndef NO_GZCOMPRESS
+ case 'w':
+ state->mode = GZ_WRITE;
+ break;
+ case 'a':
+ state->mode = GZ_APPEND;
+ break;
+#endif
+ case '+': /* can't read and write at the same time */
+ free(state);
+ return NULL;
+ case 'b': /* ignore -- will request binary anyway */
+ break;
+#ifdef O_CLOEXEC
+ case 'e':
+ cloexec = 1;
+ break;
+#endif
+#ifdef O_EXCL
+ case 'x':
+ exclusive = 1;
+ break;
+#endif
+ case 'f':
+ state->strategy = Z_FILTERED;
+ break;
+ case 'h':
+ state->strategy = Z_HUFFMAN_ONLY;
+ break;
+ case 'R':
+ state->strategy = Z_RLE;
+ break;
+ case 'F':
+ state->strategy = Z_FIXED;
+ break;
+ case 'T':
+ state->direct = 1;
+ break;
+ default: /* could consider as an error, but just ignore */
+ ;
+ }
+ mode++;
+ }
+
+ /* must provide an "r", "w", or "a" */
+ if (state->mode == GZ_NONE) {
+ free(state);
+ return NULL;
+ }
+
+ /* can't force transparent read */
+ if (state->mode == GZ_READ) {
+ if (state->direct) {
+ free(state);
+ return NULL;
+ }
+ state->direct = 1; /* for empty file */
+ }
+
+ /* save the path name for error messages */
+#ifdef _WIN32
+ if (fd == -2) {
+ len = wcstombs(NULL, path, 0);
+ if (len == (size_t)-1)
+ len = 0;
+ }
+ else
+#endif
+ len = strlen((const char *)path);
+ state->path = (char *)malloc(len + 1);
+ if (state->path == NULL) {
+ free(state);
+ return NULL;
+ }
+#ifdef _WIN32
+ if (fd == -2)
+ if (len)
+ wcstombs(state->path, path, len + 1);
+ else
+ *(state->path) = 0;
+ else
+#endif
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(state->path, len + 1, "%s", (const char *)path);
+#else
+ strcpy(state->path, path);
+#endif
+
+ /* compute the flags for open() */
+ oflag =
+#ifdef O_LARGEFILE
+ O_LARGEFILE |
+#endif
+#ifdef O_BINARY
+ O_BINARY |
+#endif
+#ifdef O_CLOEXEC
+ (cloexec ? O_CLOEXEC : 0) |
+#endif
+ (state->mode == GZ_READ ?
+ O_RDONLY :
+ (O_WRONLY | O_CREAT |
+#ifdef O_EXCL
+ (exclusive ? O_EXCL : 0) |
+#endif
+ (state->mode == GZ_WRITE ?
+ O_TRUNC :
+ O_APPEND)));
+
+ /* open the file with the appropriate flags (or just use fd) */
+ state->fd = fd > -1 ? fd : (
+#ifdef _WIN32
+ fd == -2 ? _wopen(path, oflag, 0666) :
+#endif
+ open((const char *)path, oflag, 0666));
+ if (state->fd == -1) {
+ free(state->path);
+ free(state);
+ return NULL;
+ }
+ if (state->mode == GZ_APPEND)
+ state->mode = GZ_WRITE; /* simplify later checks */
+
+ /* save the current position for rewinding (only if reading) */
+ if (state->mode == GZ_READ) {
+ state->start = LSEEK(state->fd, 0, SEEK_CUR);
+ if (state->start == -1) state->start = 0;
+ }
+
+ /* initialize stream */
+ gz_reset(state);
+
+ /* return stream */
+ return (gzFile)state;
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen(
+ const char *path,
+ const char *mode)
+{
+ return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen64(
+ const char *path,
+ const char *mode)
+{
+ return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzdopen(
+ int fd,
+ const char *mode)
+{
+ char *path; /* identifier for error messages */
+ gzFile gz;
+
+ if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
+ return NULL;
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */
+#else
+ sprintf(path, "<fd:%d>", fd); /* for debugging */
+#endif
+ gz = gz_open(path, fd, mode);
+ free(path);
+ return gz;
+}
+
+/* -- see zlib.h -- */
+#ifdef _WIN32
+gzFile ZEXPORT gzopen_w(
+ const wchar_t *path,
+ const char *mode)
+{
+ return gz_open(path, -2, mode);
+}
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzbuffer(
+ gzFile file,
+ unsigned size)
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* make sure we haven't already allocated memory */
+ if (state->size != 0)
+ return -1;
+
+ /* check and set requested size */
+ if (size < 2)
+ size = 2; /* need two bytes to check magic header */
+ state->want = size;
+ return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzrewind(
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* back up and start over */
+ if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
+ return -1;
+ gz_reset(state);
+ return 0;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzseek64(
+ gzFile file,
+ z_off64_t offset,
+ int whence)
+{
+ unsigned n;
+ z_off64_t ret;
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* check that there's no error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+
+ /* can only seek from start or relative to current position */
+ if (whence != SEEK_SET && whence != SEEK_CUR)
+ return -1;
+
+ /* normalize offset to a SEEK_CUR specification */
+ if (whence == SEEK_SET)
+ offset -= state->x.pos;
+ else if (state->seek)
+ offset += state->skip;
+ state->seek = 0;
+
+ /* if within raw area while reading, just go there */
+ if (state->mode == GZ_READ && state->how == COPY &&
+ state->x.pos + offset >= 0) {
+ ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
+ if (ret == -1)
+ return -1;
+ state->x.have = 0;
+ state->eof = 0;
+ state->past = 0;
+ state->seek = 0;
+ gz_error(state, Z_OK, NULL);
+ state->strm.avail_in = 0;
+ state->x.pos += offset;
+ return state->x.pos;
+ }
+
+ /* calculate skip amount, rewinding if needed for back seek when reading */
+ if (offset < 0) {
+ if (state->mode != GZ_READ) /* writing -- can't go backwards */
+ return -1;
+ offset += state->x.pos;
+ if (offset < 0) /* before start of file! */
+ return -1;
+ if (gzrewind(file) == -1) /* rewind, then skip to offset */
+ return -1;
+ }
+
+ /* if reading, skip what's in output buffer (one less gzgetc() check) */
+ if (state->mode == GZ_READ) {
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
+ (unsigned)offset : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ offset -= n;
+ }
+
+ /* request skip (if not zero) */
+ if (offset) {
+ state->seek = 1;
+ state->skip = offset;
+ }
+ return state->x.pos + offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzseek(
+ gzFile file,
+ z_off_t offset,
+ int whence)
+{
+ z_off64_t ret;
+
+ ret = gzseek64(file, (z_off64_t)offset, whence);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gztell64(
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* return position */
+ return state->x.pos + (state->seek ? state->skip : 0);
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gztell(
+ gzFile file)
+{
+ z_off64_t ret;
+
+ ret = gztell64(file);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzoffset64(
+ gzFile file)
+{
+ z_off64_t offset;
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* compute and return effective offset in file */
+ offset = LSEEK(state->fd, 0, SEEK_CUR);
+ if (offset == -1)
+ return -1;
+ if (state->mode == GZ_READ) /* reading */
+ offset -= state->strm.avail_in; /* don't count buffered input */
+ return offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzoffset(
+ gzFile file)
+{
+ z_off64_t ret;
+
+ ret = gzoffset64(file);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzeof(
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return 0;
+
+ /* return end-of-file state */
+ return state->mode == GZ_READ ? state->past : 0;
+}
+
+/* -- see zlib.h -- */
+const char * ZEXPORT gzerror(
+ gzFile file,
+ int *errnum)
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return NULL;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return NULL;
+
+ /* return error information */
+ if (errnum != NULL)
+ *errnum = state->err;
+ return state->err == Z_MEM_ERROR ? "out of memory" :
+ (state->msg == NULL ? "" : state->msg);
+}
+
+/* -- see zlib.h -- */
+void ZEXPORT gzclearerr(
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return;
+
+ /* clear error and end-of-file */
+ if (state->mode == GZ_READ) {
+ state->eof = 0;
+ state->past = 0;
+ }
+ gz_error(state, Z_OK, NULL);
+}
+
+/* Create an error message in allocated memory and set state->err and
+ state->msg accordingly. Free any previous error message already there. Do
+ not try to free or allocate space if the error is Z_MEM_ERROR (out of
+ memory). Simply save the error message as a static string. If there is an
+ allocation failure constructing the error message, then convert the error to
+ out of memory. */
+void ZLIB_INTERNAL gz_error(
+ gz_statep state,
+ int err,
+ const char *msg)
+{
+ /* free previously allocated message and clear */
+ if (state->msg != NULL) {
+ if (state->err != Z_MEM_ERROR)
+ free(state->msg);
+ state->msg = NULL;
+ }
+
+ /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
+ if (err != Z_OK && err != Z_BUF_ERROR)
+ state->x.have = 0;
+
+ /* set error code, and if no message, then done */
+ state->err = err;
+ if (msg == NULL)
+ return;
+
+ /* for an out of memory error, return literal string when requested */
+ if (err == Z_MEM_ERROR)
+ return;
+
+ /* construct error message with path */
+ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
+ NULL) {
+ state->err = Z_MEM_ERROR;
+ return;
+ }
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
+ "%s%s%s", state->path, ": ", msg);
+#else
+ strcpy(state->msg, state->path);
+ strcat(state->msg, ": ");
+ strcat(state->msg, msg);
+#endif
+ return;
+}
+
+#ifndef INT_MAX
+/* portably return maximum value for an int (when limits.h presumed not
+ available) -- we need to do this to cover cases where 2's complement not
+ used, since C standard permits 1's complement and sign-bit representations,
+ otherwise we could just use ((unsigned)-1) >> 1 */
+unsigned ZLIB_INTERNAL gz_intmax()
+{
+ unsigned p, q;
+
+ p = 1;
+ do {
+ q = p;
+ p <<= 1;
+ p++;
+ } while (p > q);
+ return q >> 1;
+}
+#endif
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c
new file mode 100644
index 0000000000..f162a32f10
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzread.c
@@ -0,0 +1,594 @@
+/* gzread.c -- zlib functions for reading gzip files
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
+local int gz_avail OF((gz_statep));
+local int gz_look OF((gz_statep));
+local int gz_decomp OF((gz_statep));
+local int gz_fetch OF((gz_statep));
+local int gz_skip OF((gz_statep, z_off64_t));
+
+/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
+ state->fd, and update state->eof, state->err, and state->msg as appropriate.
+ This function needs to loop on read(), since read() is not guaranteed to
+ read the number of bytes requested, depending on the type of descriptor. */
+local int gz_load(
+ gz_statep state,
+ unsigned char *buf,
+ unsigned len,
+ unsigned *have)
+{
+ int ret;
+
+ *have = 0;
+ do {
+ ret = read(state->fd, buf + *have, len - *have);
+ if (ret <= 0)
+ break;
+ *have += ret;
+ } while (*have < len);
+ if (ret < 0) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ if (ret == 0)
+ state->eof = 1;
+ return 0;
+}
+
+/* Load up input buffer and set eof flag if last data loaded -- return -1 on
+ error, 0 otherwise. Note that the eof flag is set when the end of the input
+ file is reached, even though there may be unused data in the buffer. Once
+ that data has been used, no more attempts will be made to read the file.
+ If strm->avail_in != 0, then the current data is moved to the beginning of
+ the input buffer, and then the remainder of the buffer is loaded with the
+ available data from the input file. */
+local int gz_avail(
+ gz_statep state)
+{
+ unsigned got;
+ z_streamp strm = &(state->strm);
+
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+ if (state->eof == 0) {
+ if (strm->avail_in) { /* copy what's there to the start */
+ unsigned char *p = state->in;
+ unsigned const char *q = strm->next_in;
+ unsigned n = strm->avail_in;
+ do {
+ *p++ = *q++;
+ } while (--n);
+ }
+ if (gz_load(state, state->in + strm->avail_in,
+ state->size - strm->avail_in, &got) == -1)
+ return -1;
+ strm->avail_in += got;
+ strm->next_in = state->in;
+ }
+ return 0;
+}
+
+/* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
+ If this is the first time in, allocate required memory. state->how will be
+ left unchanged if there is no more input data available, will be set to COPY
+ if there is no gzip header and direct copying will be performed, or it will
+ be set to GZIP for decompression. If direct copying, then leftover input
+ data from the input buffer will be copied to the output buffer. In that
+ case, all further file reads will be directly to either the output buffer or
+ a user buffer. If decompressing, the inflate state will be initialized.
+ gz_look() will return 0 on success or -1 on failure. */
+local int gz_look(
+ gz_statep state)
+{
+ z_streamp strm = &(state->strm);
+
+ /* allocate read buffers and inflate memory */
+ if (state->size == 0) {
+ /* allocate buffers */
+ state->in = (unsigned char *)malloc(state->want);
+ state->out = (unsigned char *)malloc(state->want << 1);
+ if (state->in == NULL || state->out == NULL) {
+ if (state->out != NULL)
+ free(state->out);
+ if (state->in != NULL)
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ state->size = state->want;
+
+ /* allocate inflate memory */
+ state->strm.zalloc = Z_NULL;
+ state->strm.zfree = Z_NULL;
+ state->strm.opaque = Z_NULL;
+ state->strm.avail_in = 0;
+ state->strm.next_in = Z_NULL;
+ if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
+ free(state->out);
+ free(state->in);
+ state->size = 0;
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ }
+
+ /* get at least the magic bytes in the input buffer */
+ if (strm->avail_in < 2) {
+ if (gz_avail(state) == -1)
+ return -1;
+ if (strm->avail_in == 0)
+ return 0;
+ }
+
+ /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
+ a logical dilemma here when considering the case of a partially written
+ gzip file, to wit, if a single 31 byte is written, then we cannot tell
+ whether this is a single-byte file, or just a partially written gzip
+ file -- for here we assume that if a gzip file is being written, then
+ the header will be written in a single operation, so that reading a
+ single byte is sufficient indication that it is not a gzip file) */
+ if (strm->avail_in > 1 &&
+ strm->next_in[0] == 31 && strm->next_in[1] == 139) {
+ inflateReset(strm);
+ state->how = GZIP;
+ state->direct = 0;
+ return 0;
+ }
+
+ /* no gzip header -- if we were decoding gzip before, then this is trailing
+ garbage. Ignore the trailing garbage and finish. */
+ if (state->direct == 0) {
+ strm->avail_in = 0;
+ state->eof = 1;
+ state->x.have = 0;
+ return 0;
+ }
+
+ /* doing raw i/o, copy any leftover input to output -- this assumes that
+ the output buffer is larger than the input buffer, which also assures
+ space for gzungetc() */
+ state->x.next = state->out;
+ if (strm->avail_in) {
+ memcpy(state->x.next, strm->next_in, strm->avail_in);
+ state->x.have = strm->avail_in;
+ strm->avail_in = 0;
+ }
+ state->how = COPY;
+ state->direct = 1;
+ return 0;
+}
+
+/* Decompress from input to the provided next_out and avail_out in the state.
+ On return, state->x.have and state->x.next point to the just decompressed
+ data. If the gzip stream completes, state->how is reset to LOOK to look for
+ the next gzip stream or raw data, once state->x.have is depleted. Returns 0
+ on success, -1 on failure. */
+local int gz_decomp(
+ gz_statep state)
+{
+ int ret = Z_OK;
+ unsigned had;
+ z_streamp strm = &(state->strm);
+
+ /* fill output buffer up to end of deflate stream */
+ had = strm->avail_out;
+ do {
+ /* get more input for inflate() */
+ if (strm->avail_in == 0 && gz_avail(state) == -1)
+ return -1;
+ if (strm->avail_in == 0) {
+ gz_error(state, Z_BUF_ERROR, "unexpected end of file");
+ break;
+ }
+
+ /* decompress and handle errors */
+ ret = inflate(strm, Z_NO_FLUSH);
+ if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
+ gz_error(state, Z_STREAM_ERROR,
+ "internal error: inflate stream corrupt");
+ return -1;
+ }
+ if (ret == Z_MEM_ERROR) {
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
+ gz_error(state, Z_DATA_ERROR,
+ strm->msg == NULL ? "compressed data error" : strm->msg);
+ return -1;
+ }
+ } while (strm->avail_out && ret != Z_STREAM_END);
+
+ /* update available output */
+ state->x.have = had - strm->avail_out;
+ state->x.next = strm->next_out - state->x.have;
+
+ /* if the gzip stream completed successfully, look for another */
+ if (ret == Z_STREAM_END)
+ state->how = LOOK;
+
+ /* good decompression */
+ return 0;
+}
+
+/* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
+ Data is either copied from the input file or decompressed from the input
+ file depending on state->how. If state->how is LOOK, then a gzip header is
+ looked for to determine whether to copy or decompress. Returns -1 on error,
+ otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
+ end of the input file has been reached and all data has been processed. */
+local int gz_fetch(
+ gz_statep state)
+{
+ z_streamp strm = &(state->strm);
+
+ do {
+ switch(state->how) {
+ case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
+ if (gz_look(state) == -1)
+ return -1;
+ if (state->how == LOOK)
+ return 0;
+ break;
+ case COPY: /* -> COPY */
+ if (gz_load(state, state->out, state->size << 1, &(state->x.have))
+ == -1)
+ return -1;
+ state->x.next = state->out;
+ return 0;
+ case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
+ strm->avail_out = state->size << 1;
+ strm->next_out = state->out;
+ if (gz_decomp(state) == -1)
+ return -1;
+ }
+ } while (state->x.have == 0 && (!state->eof || strm->avail_in));
+ return 0;
+}
+
+/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
+local int gz_skip(
+ gz_statep state,
+ z_off64_t len)
+{
+ unsigned n;
+
+ /* skip over len bytes or reach end-of-file, whichever comes first */
+ while (len)
+ /* skip over whatever is in output buffer */
+ if (state->x.have) {
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
+ (unsigned)len : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ len -= n;
+ }
+
+ /* output buffer empty -- return if we're at the end of the input */
+ else if (state->eof && state->strm.avail_in == 0)
+ break;
+
+ /* need more data to skip -- load up output buffer */
+ else {
+ /* get more output, looking for header if required */
+ if (gz_fetch(state) == -1)
+ return -1;
+ }
+ return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzread(
+ gzFile file,
+ voidp buf,
+ unsigned len)
+{
+ unsigned got, n;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* since an int is returned, make sure len fits in one, otherwise return
+ with an error (this avoids the flaw in the interface) */
+ if ((int)len < 0) {
+ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
+ return -1;
+ }
+
+ /* if len is zero, avoid unnecessary operations */
+ if (len == 0)
+ return 0;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* get len bytes to buf, or less than len if at the end */
+ got = 0;
+ do {
+ /* first just try copying data from the output buffer */
+ if (state->x.have) {
+ n = state->x.have > len ? len : state->x.have;
+ memcpy(buf, state->x.next, n);
+ state->x.next += n;
+ state->x.have -= n;
+ }
+
+ /* output buffer empty -- return if we're at the end of the input */
+ else if (state->eof && strm->avail_in == 0) {
+ state->past = 1; /* tried to read past end */
+ break;
+ }
+
+ /* need output data -- for small len or new stream load up our output
+ buffer */
+ else if (state->how == LOOK || len < (state->size << 1)) {
+ /* get more output, looking for header if required */
+ if (gz_fetch(state) == -1)
+ return -1;
+ continue; /* no progress yet -- go back to copy above */
+ /* the copy above assures that we will leave with space in the
+ output buffer, allowing at least one gzungetc() to succeed */
+ }
+
+ /* large len -- read directly into user buffer */
+ else if (state->how == COPY) { /* read directly */
+ if (gz_load(state, (unsigned char *)buf, len, &n) == -1)
+ return -1;
+ }
+
+ /* large len -- decompress directly into user buffer */
+ else { /* state->how == GZIP */
+ strm->avail_out = len;
+ strm->next_out = (unsigned char *)buf;
+ if (gz_decomp(state) == -1)
+ return -1;
+ n = state->x.have;
+ state->x.have = 0;
+ }
+
+ /* update progress */
+ len -= n;
+ buf = (char *)buf + n;
+ got += n;
+ state->x.pos += n;
+ } while (len);
+
+ /* return number of bytes read into user buffer (will fit in int) */
+ return (int)got;
+}
+
+/* -- see zlib.h -- */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+#else
+# undef gzgetc
+#endif
+int ZEXPORT gzgetc(
+ gzFile file)
+{
+ int ret;
+ unsigned char buf[1];
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* try output buffer (no need to check for skip request) */
+ if (state->x.have) {
+ state->x.have--;
+ state->x.pos++;
+ return *(state->x.next)++;
+ }
+
+ /* nothing there -- try gzread() */
+ ret = gzread(file, buf, 1);
+ return ret < 1 ? -1 : buf[0];
+}
+
+int ZEXPORT gzgetc_(
+gzFile file)
+{
+ return gzgetc(file);
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzungetc(
+ int c,
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* can't push EOF */
+ if (c < 0)
+ return -1;
+
+ /* if output buffer empty, put byte at end (allows more pushing) */
+ if (state->x.have == 0) {
+ state->x.have = 1;
+ state->x.next = state->out + (state->size << 1) - 1;
+ state->x.next[0] = c;
+ state->x.pos--;
+ state->past = 0;
+ return c;
+ }
+
+ /* if no room, give up (must have already done a gzungetc()) */
+ if (state->x.have == (state->size << 1)) {
+ gz_error(state, Z_DATA_ERROR, "out of room to push characters");
+ return -1;
+ }
+
+ /* slide output data if needed and insert byte before existing data */
+ if (state->x.next == state->out) {
+ unsigned char *src = state->out + state->x.have;
+ unsigned char *dest = state->out + (state->size << 1);
+ while (src > state->out)
+ *--dest = *--src;
+ state->x.next = dest;
+ }
+ state->x.have++;
+ state->x.next--;
+ state->x.next[0] = c;
+ state->x.pos--;
+ state->past = 0;
+ return c;
+}
+
+/* -- see zlib.h -- */
+char * ZEXPORT gzgets(
+ gzFile file,
+ char *buf,
+ int len)
+{
+ unsigned left, n;
+ char *str;
+ unsigned char *eol;
+ gz_statep state;
+
+ /* check parameters and get internal structure */
+ if (file == NULL || buf == NULL || len < 1)
+ return NULL;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return NULL;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return NULL;
+ }
+
+ /* copy output bytes up to new line or len - 1, whichever comes first --
+ append a terminating zero to the string (we don't check for a zero in
+ the contents, let the user worry about that) */
+ str = buf;
+ left = (unsigned)len - 1;
+ if (left) do {
+ /* assure that something is in the output buffer */
+ if (state->x.have == 0 && gz_fetch(state) == -1)
+ return NULL; /* error */
+ if (state->x.have == 0) { /* end of file */
+ state->past = 1; /* read past end */
+ break; /* return what we have */
+ }
+
+ /* look for end-of-line in current output buffer */
+ n = state->x.have > left ? left : state->x.have;
+ eol = (unsigned char *)memchr(state->x.next, '\n', n);
+ if (eol != NULL)
+ n = (unsigned)(eol - state->x.next) + 1;
+
+ /* copy through end-of-line, or remainder if not found */
+ memcpy(buf, state->x.next, n);
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ left -= n;
+ buf += n;
+ } while (left && eol == NULL);
+
+ /* return terminated string, or if nothing, end of file */
+ if (buf == str)
+ return NULL;
+ buf[0] = 0;
+ return str;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzdirect(
+ gzFile file)
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+
+ /* if the state is not known, but we can find out, then do so (this is
+ mainly for right after a gzopen() or gzdopen()) */
+ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+ (void)gz_look(state);
+
+ /* return 1 if transparent, 0 if processing a gzip stream */
+ return state->direct;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_r(
+ gzFile file)
+{
+ int ret, err;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ /* check that we're reading */
+ if (state->mode != GZ_READ)
+ return Z_STREAM_ERROR;
+
+ /* free memory and close file */
+ if (state->size) {
+ inflateEnd(&(state->strm));
+ free(state->out);
+ free(state->in);
+ }
+ err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
+ gz_error(state, Z_OK, NULL);
+ free(state->path);
+ ret = close(state->fd);
+ free(state);
+ return ret ? Z_ERRNO : err;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c b/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c
new file mode 100644
index 0000000000..161070866f
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/gzwrite.c
@@ -0,0 +1,576 @@
+/* gzwrite.c -- zlib functions for writing gzip files
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_init OF((gz_statep));
+local int gz_comp OF((gz_statep, int));
+local int gz_zero OF((gz_statep, z_off64_t));
+
+/* Initialize state for writing a gzip file. Mark initialization by setting
+ state->size to non-zero. Return -1 on failure or 0 on success. */
+local int gz_init(
+ gz_statep state)
+{
+ int ret;
+ z_streamp strm = &(state->strm);
+
+ /* allocate input buffer */
+ state->in = (unsigned char *)malloc(state->want);
+ if (state->in == NULL) {
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+
+ /* only need output buffer and deflate state if compressing */
+ if (!state->direct) {
+ /* allocate output buffer */
+ state->out = (unsigned char *)malloc(state->want);
+ if (state->out == NULL) {
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+
+ /* allocate deflate memory, set up for gzip compression */
+ strm->zalloc = Z_NULL;
+ strm->zfree = Z_NULL;
+ strm->opaque = Z_NULL;
+ ret = deflateInit2(strm, state->level, Z_DEFLATED,
+ MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
+ if (ret != Z_OK) {
+ free(state->out);
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ }
+
+ /* mark state as initialized */
+ state->size = state->want;
+
+ /* initialize write buffer if compressing */
+ if (!state->direct) {
+ strm->avail_out = state->size;
+ strm->next_out = state->out;
+ state->x.next = strm->next_out;
+ }
+ return 0;
+}
+
+/* Compress whatever is at avail_in and next_in and write to the output file.
+ Return -1 if there is an error writing to the output file, otherwise 0.
+ flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH,
+ then the deflate() state is reset to start a new gzip stream. If gz->direct
+ is true, then simply write to the output file without compressing, and
+ ignore flush. */
+local int gz_comp(
+ gz_statep state,
+ int flush)
+{
+ int ret, got;
+ unsigned have;
+ z_streamp strm = &(state->strm);
+
+ /* allocate memory if this is the first time through */
+ if (state->size == 0 && gz_init(state) == -1)
+ return -1;
+
+ /* write directly if requested */
+ if (state->direct) {
+ got = write(state->fd, strm->next_in, strm->avail_in);
+ if (got < 0 || (unsigned)got != strm->avail_in) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ strm->avail_in = 0;
+ return 0;
+ }
+
+ /* run deflate() on provided input until it produces no more output */
+ ret = Z_OK;
+ do {
+ /* write out current buffer contents if full, or if flushing, but if
+ doing Z_FINISH then don't write until we get to Z_STREAM_END */
+ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
+ (flush != Z_FINISH || ret == Z_STREAM_END))) {
+ have = (unsigned)(strm->next_out - state->x.next);
+ if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||
+ (unsigned)got != have)) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ if (strm->avail_out == 0) {
+ strm->avail_out = state->size;
+ strm->next_out = state->out;
+ }
+ state->x.next = strm->next_out;
+ }
+
+ /* compress */
+ have = strm->avail_out;
+ ret = deflate(strm, flush);
+ if (ret == Z_STREAM_ERROR) {
+ gz_error(state, Z_STREAM_ERROR,
+ "internal error: deflate stream corrupt");
+ return -1;
+ }
+ have -= strm->avail_out;
+ } while (have);
+
+ /* if that completed a deflate stream, allow another to start */
+ if (flush == Z_FINISH)
+ deflateReset(strm);
+
+ /* all done, no errors */
+ return 0;
+}
+
+/* Compress len zeros to output. Return -1 on error, 0 on success. */
+local int gz_zero(
+ gz_statep state,
+ z_off64_t len)
+{
+ int first;
+ unsigned n;
+ z_streamp strm = &(state->strm);
+
+ /* consume whatever's left in the input buffer */
+ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return -1;
+
+ /* compress len zeros (len guaranteed > 0) */
+ first = 1;
+ while (len) {
+ n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
+ (unsigned)len : state->size;
+ if (first) {
+ memset(state->in, 0, n);
+ first = 0;
+ }
+ strm->avail_in = n;
+ strm->next_in = state->in;
+ state->x.pos += n;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return -1;
+ len -= n;
+ }
+ return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzwrite(
+ gzFile file,
+ voidpc buf,
+ unsigned len)
+{
+ unsigned put = len;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return 0;
+
+ /* since an int is returned, make sure len fits in one, otherwise return
+ with an error (this avoids the flaw in the interface) */
+ if ((int)len < 0) {
+ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
+ return 0;
+ }
+
+ /* if len is zero, avoid unnecessary operations */
+ if (len == 0)
+ return 0;
+
+ /* allocate memory if this is the first time through */
+ if (state->size == 0 && gz_init(state) == -1)
+ return 0;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return 0;
+ }
+
+ /* for small len, copy to input buffer, otherwise compress directly */
+ if (len < state->size) {
+ /* copy to input buffer, compress when full */
+ do {
+ unsigned have, copy;
+
+ if (strm->avail_in == 0)
+ strm->next_in = state->in;
+ have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+ copy = state->size - have;
+ if (copy > len)
+ copy = len;
+ memcpy(state->in + have, buf, copy);
+ strm->avail_in += copy;
+ state->x.pos += copy;
+ buf = (const char *)buf + copy;
+ len -= copy;
+ if (len && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+ } while (len);
+ }
+ else {
+ /* consume whatever's left in the input buffer */
+ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+
+ /* directly compress user buffer to file */
+ strm->avail_in = len;
+ strm->next_in = (z_const Bytef *)buf;
+ state->x.pos += len;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+ }
+
+ /* input was all buffered or compressed (put will fit in int) */
+ return (int)put;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputc(
+ gzFile file,
+ int c)
+{
+ unsigned have;
+ unsigned char buf[1];
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return -1;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* try writing to input buffer for speed (state->size == 0 if buffer not
+ initialized) */
+ if (state->size) {
+ if (strm->avail_in == 0)
+ strm->next_in = state->in;
+ have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+ if (have < state->size) {
+ state->in[have] = c;
+ strm->avail_in++;
+ state->x.pos++;
+ return c & 0xff;
+ }
+ }
+
+ /* no room in buffer or not initialized, use gz_write() */
+ buf[0] = c;
+ if (gzwrite(file, buf, 1) != 1)
+ return -1;
+ return c & 0xff;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputs(
+ gzFile file,
+ const char *str)
+{
+ int ret;
+ unsigned len;
+
+ /* write string */
+ len = (unsigned)strlen(str);
+ ret = gzwrite(file, str, len);
+ return ret == 0 && len != 0 ? -1 : ret;
+}
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#include <stdarg.h>
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
+{
+ int size, len;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return 0;
+
+ /* make sure we have some buffer space */
+ if (state->size == 0 && gz_init(state) == -1)
+ return 0;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return 0;
+ }
+
+ /* consume whatever's left in the input buffer */
+ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+
+ /* do the printf() into the input buffer, put length in len */
+ size = (int)(state->size);
+ state->in[size - 1] = 0;
+#ifdef NO_vsnprintf
+# ifdef HAS_vsprintf_void
+ (void)vsprintf((char *)(state->in), format, va);
+ for (len = 0; len < size; len++)
+ if (state->in[len] == 0) break;
+# else
+ len = vsprintf((char *)(state->in), format, va);
+# endif
+#else
+# ifdef HAS_vsnprintf_void
+ (void)vsnprintf((char *)(state->in), size, format, va);
+ len = strlen((char *)(state->in));
+# else
+ len = vsnprintf((char *)(state->in), size, format, va);
+# endif
+#endif
+
+ /* check that printf() results fit in buffer */
+ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
+ return 0;
+
+ /* update buffer and position, defer compression until needed */
+ strm->avail_in = (unsigned)len;
+ strm->next_in = state->in;
+ state->x.pos += len;
+ return len;
+}
+
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
+{
+ va_list va;
+ int ret;
+
+ va_start(va, format);
+ ret = gzvprintf(file, format, va);
+ va_end(va);
+ return ret;
+}
+
+#else /* !STDC && !Z_HAVE_STDARG_H */
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzprintf (
+ gzFile file,
+ const char *format,
+ int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10,
+ int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20)
+{
+ int size, len;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that can really pass pointer in ints */
+ if (sizeof(int) != sizeof(void *))
+ return 0;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return 0;
+
+ /* make sure we have some buffer space */
+ if (state->size == 0 && gz_init(state) == -1)
+ return 0;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return 0;
+ }
+
+ /* consume whatever's left in the input buffer */
+ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+
+ /* do the printf() into the input buffer, put length in len */
+ size = (int)(state->size);
+ state->in[size - 1] = 0;
+#ifdef NO_snprintf
+# ifdef HAS_sprintf_void
+ sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+ for (len = 0; len < size; len++)
+ if (state->in[len] == 0) break;
+# else
+ len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+# endif
+#else
+# ifdef HAS_snprintf_void
+ snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+ len = strlen((char *)(state->in));
+# else
+ len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6,
+ a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,
+ a19, a20);
+# endif
+#endif
+
+ /* check that printf() results fit in buffer */
+ if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)
+ return 0;
+
+ /* update buffer and position, defer compression until needed */
+ strm->avail_in = (unsigned)len;
+ strm->next_in = state->in;
+ state->x.pos += len;
+ return len;
+}
+
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzflush(
+ gzFile file,
+ int flush)
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* check flush parameter */
+ if (flush < 0 || flush > Z_FINISH)
+ return Z_STREAM_ERROR;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* compress remaining data with requested flush */
+ gz_comp(state, flush);
+ return state->err;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzsetparams(
+ gzFile file,
+ int level,
+ int strategy)
+{
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* if no change is requested, then do nothing */
+ if (level == state->level && strategy == state->strategy)
+ return Z_OK;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* change compression parameters for subsequent input */
+ if (state->size) {
+ /* flush previous input with previous parameters before changing */
+ if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)
+ return state->err;
+ deflateParams(strm, level, strategy);
+ }
+ state->level = level;
+ state->strategy = strategy;
+ return Z_OK;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_w(
+ gzFile file)
+{
+ int ret = Z_OK;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ /* check that we're writing */
+ if (state->mode != GZ_WRITE)
+ return Z_STREAM_ERROR;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ ret = state->err;
+ }
+
+ /* flush, free memory, and close file */
+ if (gz_comp(state, Z_FINISH) == -1)
+ ret = state->err;
+ if (state->size) {
+ if (!state->direct) {
+ (void)deflateEnd(&(state->strm));
+ free(state->out);
+ }
+ free(state->in);
+ }
+ gz_error(state, Z_OK, NULL);
+ free(state->path);
+ if (close(state->fd) == -1)
+ ret = Z_ERRNO;
+ free(state);
+ return ret;
+}
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h b/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h
new file mode 100644
index 0000000000..e5c1aa4ca8
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inffast.h
@@ -0,0 +1,11 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-2003, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h b/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h
new file mode 100644
index 0000000000..d628327769
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inffixed.h
@@ -0,0 +1,94 @@
+ /* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by makefixed().
+ */
+
+ /* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+ static const code lenfix[512] = {
+ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
+ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
+ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
+ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+ {0,9,255}
+ };
+
+ static const code distfix[32] = {
+ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
+ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+ {22,5,193},{64,5,0}
+ };
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h b/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h
new file mode 100644
index 0000000000..95f4986d40
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inflate.h
@@ -0,0 +1,122 @@
+/* inflate.h -- internal inflate state definition
+ * Copyright (C) 1995-2009 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip decoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GUNZIP
+#endif
+
+/* Possible inflate modes between inflate() calls */
+typedef enum {
+ HEAD, /* i: waiting for magic header */
+ FLAGS, /* i: waiting for method and flags (gzip) */
+ TIME, /* i: waiting for modification time (gzip) */
+ OS, /* i: waiting for extra flags and operating system (gzip) */
+ EXLEN, /* i: waiting for extra length (gzip) */
+ EXTRA, /* i: waiting for extra bytes (gzip) */
+ NAME, /* i: waiting for end of file name (gzip) */
+ COMMENT, /* i: waiting for end of comment (gzip) */
+ HCRC, /* i: waiting for header crc (gzip) */
+ DICTID, /* i: waiting for dictionary check value */
+ DICT, /* waiting for inflateSetDictionary() call */
+ TYPE, /* i: waiting for type bits, including last-flag bit */
+ TYPEDO, /* i: same, but skip check to exit inflate on new block */
+ STORED, /* i: waiting for stored size (length and complement) */
+ COPY_, /* i/o: same as COPY below, but only first time in */
+ COPY, /* i/o: waiting for input or output to copy stored block */
+ TABLE, /* i: waiting for dynamic block table lengths */
+ LENLENS, /* i: waiting for code length code lengths */
+ CODELENS, /* i: waiting for length/lit and distance code lengths */
+ LEN_, /* i: same as LEN below, but only first time in */
+ LEN, /* i: waiting for length/lit/eob code */
+ LENEXT, /* i: waiting for length extra bits */
+ DIST, /* i: waiting for distance code */
+ DISTEXT, /* i: waiting for distance extra bits */
+ MATCH, /* o: waiting for output space to copy string */
+ LIT, /* o: waiting for output space to write literal */
+ CHECK, /* i: waiting for 32-bit check value */
+ LENGTH, /* i: waiting for 32-bit length (gzip) */
+ DONE, /* finished check, done -- remain here until reset */
+ BAD, /* got a data error -- remain here until reset */
+ MEM, /* got an inflate() memory error -- remain here until reset */
+ SYNC /* looking for synchronization bytes to restart inflate() */
+} inflate_mode;
+
+/*
+ State transitions between above modes -
+
+ (most modes can go to BAD or MEM on error -- not shown for clarity)
+
+ Process header:
+ HEAD -> (gzip) or (zlib) or (raw)
+ (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
+ HCRC -> TYPE
+ (zlib) -> DICTID or TYPE
+ DICTID -> DICT -> TYPE
+ (raw) -> TYPEDO
+ Read deflate blocks:
+ TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
+ STORED -> COPY_ -> COPY -> TYPE
+ TABLE -> LENLENS -> CODELENS -> LEN_
+ LEN_ -> LEN
+ Read deflate codes in fixed or dynamic block:
+ LEN -> LENEXT or LIT or TYPE
+ LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
+ LIT -> LEN
+ Process trailer:
+ CHECK -> LENGTH -> DONE
+ */
+
+/* state maintained between inflate() calls. Approximately 10K bytes. */
+struct inflate_state {
+ inflate_mode mode; /* current inflate mode */
+ int last; /* true if processing last block */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ int havedict; /* true if dictionary provided */
+ int flags; /* gzip header method and flags (0 if zlib) */
+ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
+ unsigned long check; /* protected copy of check value */
+ unsigned long total; /* protected copy of output count */
+ gz_headerp head; /* where to save gzip header information */
+ /* sliding window */
+ unsigned wbits; /* log base 2 of requested window size */
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned wnext; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if needed */
+ /* bit accumulator */
+ unsigned long hold; /* input bit accumulator */
+ unsigned bits; /* number of bits in "in" */
+ /* for string and stored block copying */
+ unsigned length; /* literal or length of data to copy */
+ unsigned offset; /* distance back to copy string from */
+ /* for table and code decoding */
+ unsigned extra; /* extra bits needed */
+ /* fixed and dynamic code tables */
+ code const FAR *lencode; /* starting table for length/literal codes */
+ code const FAR *distcode; /* starting table for distance codes */
+ unsigned lenbits; /* index bits for lencode */
+ unsigned distbits; /* index bits for distcode */
+ /* dynamic table building */
+ unsigned ncode; /* number of code length code lengths */
+ unsigned nlen; /* number of length code lengths */
+ unsigned ndist; /* number of distance code lengths */
+ unsigned have; /* number of code lengths in lens[] */
+ code FAR *next; /* next available space in codes[] */
+ unsigned short lens[320]; /* temporary storage for code lengths */
+ unsigned short work[288]; /* work area for code table building */
+ code codes[ENOUGH]; /* space for code tables */
+ int sane; /* if false, allow invalid distance too far */
+ int back; /* bits back of last unprocessed length/lit */
+ unsigned was; /* initial length of match */
+};
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h b/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h
new file mode 100644
index 0000000000..baa53a0b1a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/inftrees.h
@@ -0,0 +1,62 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2005, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Structure for decoding tables. Each entry provides either the
+ information needed to do the operation requested by the code that
+ indexed that table entry, or it provides a pointer to another
+ table that indexes more bits of the code. op indicates whether
+ the entry is a pointer to another table, a literal, a length or
+ distance, an end-of-block, or an invalid code. For a table
+ pointer, the low four bits of op is the number of index bits of
+ that table. For a length or distance, the low four bits of op
+ is the number of extra bits to get after the code. bits is
+ the number of bits in this code or part of the code to drop off
+ of the bit buffer. val is the actual byte to output in the case
+ of a literal, the base length or distance, or the offset from
+ the current table to the next table. Each entry is four bytes. */
+typedef struct {
+ unsigned char op; /* operation, extra bits, table bits */
+ unsigned char bits; /* bits in this part of the code */
+ unsigned short val; /* offset in table or code value */
+} code;
+
+/* op values as set by inflate_table():
+ 00000000 - literal
+ 0000tttt - table link, tttt != 0 is the number of table index bits
+ 0001eeee - length or distance, eeee is the number of extra bits
+ 01100000 - end of block
+ 01000000 - invalid code
+ */
+
+/* Maximum size of the dynamic table. The maximum number of code structures is
+ 1444, which is the sum of 852 for literal/length codes and 592 for distance
+ codes. These values were found by exhaustive searches using the program
+ examples/enough.c found in the zlib distribtution. The arguments to that
+ program are the number of symbols, the initial root table size, and the
+ maximum bit length of a code. "enough 286 9 15" for literal/length codes
+ returns returns 852, and "enough 30 6 15" for distance codes returns 592.
+ The initial root table size (9 or 6) is found in the fifth argument of the
+ inflate_table() calls in inflate.c and infback.c. If the root table size is
+ changed, then these maximum sizes would be need to be recalculated and
+ updated. */
+#define ENOUGH_LENS 852
+#define ENOUGH_DISTS 592
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
+
+/* Type of code to build for inflate_table() */
+typedef enum {
+ CODES,
+ LENS,
+ DISTS
+} codetype;
+
+int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work));
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/trees.h b/core/src/fxcodec/fx_zlib/zlib_v128/trees.h
new file mode 100644
index 0000000000..d35639d82a
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/trees.h
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */
+
+local const ct_data static_ltree[L_CODES+2] = {
+{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
+{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
+{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
+{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
+{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
+{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
+{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
+{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
+{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
+{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
+{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
+{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
+{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
+{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
+{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
+{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
+{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
+{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
+{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
+{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
+{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
+{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
+{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
+{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
+{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
+{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
+{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
+{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
+{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
+{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
+{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
+{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
+{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
+{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
+{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
+{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
+{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
+{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
+{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
+{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
+{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
+{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
+{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
+{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
+{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
+{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
+{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
+{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
+{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
+{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
+{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
+{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
+{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
+{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
+{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
+{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
+{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
+{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
+};
+
+local const ct_data static_dtree[D_CODES] = {
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
+};
+
+const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
+ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+};
+
+const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
+};
+
+local const int base_length[LENGTH_CODES] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
+64, 80, 96, 112, 128, 160, 192, 224, 0
+};
+
+local const int base_dist[D_CODES] = {
+ 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
+ 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
+ 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
+};
+
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h b/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h
new file mode 100644
index 0000000000..5708a377e0
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zconf.h
@@ -0,0 +1,519 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
+# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
+# define deflateEnd z_deflateEnd
+# define deflateInit2_ z_deflateInit2_
+# define deflateInit_ z_deflateInit_
+# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
+# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzvprintf z_gzvprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetHeader z_inflateGetHeader
+# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateGetDictionary z_inflateGetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateUndermine z_inflateUndermine
+# define inflateResetKeep z_inflateResetKeep
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# endif
+# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
+# define alloc_func z_alloc_func
+# define charf z_charf
+# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
+# define in_func z_in_func
+# define intf z_intf
+# define out_func z_out_func
+# define uInt z_uInt
+# define uIntf z_uIntf
+# define uLong z_uLong
+# define uLongf z_uLongf
+# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
+# define NO_DUMMY_DECL
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+#endif /* 0 */
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+#endif /* 0 */
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+#endif /* 0 */
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+#if 0 /* Sunliang.Liu 20100908 sync the config to the old revision, otherwise, evc compile failed. */
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif /* 0 */
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h b/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h
new file mode 100644
index 0000000000..ec8ca7adb8
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zlib.h
@@ -0,0 +1,1832 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.8, April 28th, 2013
+
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#define deflate_copyright FPDFAPI_deflate_copyright
+#define adler32 FPDFAPI_adler32
+#define compress2 FPDFAPI_compress2
+#define compress FPDFAPI_compress
+#define compressBound FPDFAPI_compressBound
+#define get_crc_table FPDFAPI_get_crc_table
+#define crc32 FPDFAPI_crc32
+#define deflateInit_ FPDFAPI_deflateInit_
+#define deflateInit2_ FPDFAPI_deflateInit2_
+#define deflateSetDictionary FPDFAPI_deflateSetDictionary
+#define deflateReset FPDFAPI_deflateReset
+#define deflatePrime FPDFAPI_deflatePrime
+#define deflateParams FPDFAPI_deflateParams
+#define deflateBound FPDFAPI_deflateBound
+#define deflateSetHeader FPDFAPI_deflateSetHeader
+#define deflateTune FPDFAPI_deflateTune
+#define deflate FPDFAPI_deflate
+#define deflateEnd FPDFAPI_deflateEnd
+#define deflateCopy FPDFAPI_deflateCopy
+#define inflateBackInit_ FPDFAPI_inflateBackInit_
+#define inflateBack FPDFAPI_inflateBack
+#define inflateBackEnd FPDFAPI_inflateBackEnd
+#define inflateReset FPDFAPI_inflateReset
+#define inflateInit2_ FPDFAPI_inflateInit2_
+#define inflateInit_ FPDFAPI_inflateInit_
+#define inflate FPDFAPI_inflate
+#define inflateEnd FPDFAPI_inflateEnd
+#define inflateSetDictionary FPDFAPI_inflateSetDictionary
+#define inflateSync FPDFAPI_inflateSync
+#define inflateSyncPoint FPDFAPI_inflateSyncPoint
+#define inflateCopy FPDFAPI_inflateCopy
+#define uncompress FPDFAPI_uncompress
+#define zlibVersion FPDFAPI_zlibVersion
+#define zlibCompileFlags FPDFAPI_zlibCompileFlags
+#define zError FPDFAPI_zError
+#define z_errmsg FPDFAPI_z_errmsg
+#define zcfree FPDFAPI_zcfree
+#define zcalloc FPDFAPI_zcalloc
+#define inflate_fast FPDFAPI_inflate_fast
+#define inflate_table FPDFAPI_inflate_table
+#define inflate_copyright FPDFAPI_inflate_copyright
+#define _length_code FPDFAPI_length_code
+#define _tr_flush_block FPDFAPI_tr_flush_block
+#define _dist_code FPDFAPI_dist_code
+#define _tr_stored_block FPDFAPI_tr_stored_block
+#define _tr_init FPDFAPI_tr_init
+#define _tr_align FPDFAPI_tr_align
+#define _tr_tally FPDFAPI_tr_tally
+#define adler32_combine FPDFAPI_adler32_combine
+#define inflatePrime FPDFAPI_inflatePrime
+#define inflateGetHeader FPDFAPI_inflateGetHeader
+#define crc32_combine FPDFAPI_crc32_combine
+#define inflateReset2 FPDFAPI_inflateReset2
+#define inflateUndermine FPDFAPI_inflateUndermine
+#define inflateMark FPDFAPI_inflateMark
+#define adler32_combine64 FPDFAPI_adler32_combine64
+
+#include "zconf.h"
+
+/* Sunliang.Liu 20100908 sync the config to the old revision. NO_GZIP */
+#define NO_GZIP /* XYQ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.8"
+#define ZLIB_VERNUM 0x1280
+#define ZLIB_VER_MAJOR 1
+#define ZLIB_VER_MINOR 2
+#define ZLIB_VER_REVISION 8
+#define ZLIB_VER_SUBREVISION 0
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed data.
+ This version of the library supports only one compression method (deflation)
+ but other algorithms will be added later and will have the same stream
+ interface.
+
+ Compression can be done in a single step if the buffers are large enough,
+ or can be done by repeated calls of the compression function. In the latter
+ case, the application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never crash
+ even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ z_const Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total number of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total number of bytes output so far */
+
+ z_const char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has dropped
+ to zero. It must update next_out and avail_out when avail_out has dropped
+ to zero. The application must initialize zalloc, zfree and opaque before
+ calling the init function. All other fields are set by the compression
+ library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this if
+ the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers
+ returned by zalloc for objects of exactly 65536 bytes *must* have their
+ offset normalized to zero. The default allocation function provided by this
+ library ensures this (see zutil.c). To reduce memory requirements and avoid
+ any allocation of 64K objects, at the expense of compression ratio, compile
+ the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or progress
+ reports. After compression, total_in holds the total size of the
+ uncompressed data and may be saved for use in the decompressor (particularly
+ if the decompressor wants to decompress everything in a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+#define Z_TREES 6
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is not
+ compatible with the zlib.h header file used by the application. This check
+ is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller. If
+ zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
+ allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at all
+ (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION
+ requests a default compromise between speed and compression (currently
+ equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if level is not a valid compression level, or
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION). msg is set to null
+ if there is no error message. deflateInit does not perform any compression:
+ this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications). Some
+ output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating avail_in or avail_out accordingly; avail_out should
+ never be zero before the call. The application can consume the compressed
+ output when it wants, for example when the output buffer is full (avail_out
+ == 0), or after each call of deflate(). If deflate returns Z_OK and with
+ zero avail_out, it must be called again after making room in the output
+ buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumulate before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In
+ particular avail_in is zero after the call if enough output space has been
+ provided before the call.) Flushing may degrade compression for some
+ compression algorithms and so it should be used only when necessary. This
+ completes the current deflate block and follows it with an empty stored block
+ that is three bits plus filler bits to the next byte, followed by four bytes
+ (00 00 ff ff).
+
+ If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the
+ output buffer, but the output is not aligned to a byte boundary. All of the
+ input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.
+ This completes the current deflate block and follows it with an empty fixed
+ codes block that is 10 bits long. This assures that enough bytes are output
+ in order for the decompressor to finish the block before the empty fixed code
+ block.
+
+ If flush is set to Z_BLOCK, a deflate block is completed and emitted, as
+ for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to
+ seven bits of the current block are held to be written as the next byte after
+ the next deflate block is completed. In this case, the decompressor may not
+ be provided enough bits at this point in order to complete decompression of
+ the data provided so far to the compressor. It may need to wait for the next
+ block to be emitted. This is for advanced applications that need to control
+ the emission of deflate blocks.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there was
+ enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the stream
+ are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least the
+ value returned by deflateBound (see below). Then deflate is guaranteed to
+ return Z_STREAM_END. If not enough output space is provided, deflate will
+ not return Z_STREAM_END, and it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect the
+ compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case, msg
+ may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the
+ exact value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit() does not process any header information -- that is deferred
+ until inflate() is called.
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing will
+ resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there is
+ no more input data or no more space in the output buffer (see below about
+ the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating the next_* and avail_* values accordingly. The
+ application can consume the uncompressed output when it wants, for example
+ when the output buffer is full (avail_out == 0), or after each call of
+ inflate(). If inflate returns Z_OK and with zero avail_out, it must be
+ called again after making room in the output buffer because there might be
+ more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,
+ Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate()
+ stop if and when it gets to the next deflate block boundary. When decoding
+ the zlib or gzip format, this will cause inflate() to return immediately
+ after the header and before the first block. When doing a raw inflate,
+ inflate() will go ahead and process the first block, and will return when it
+ gets to the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64 if
+ inflate() is currently decoding the last block in the deflate stream, plus
+ 128 if inflate() returned immediately after decoding an end-of-block code or
+ decoding the complete header up to just before the first byte of the deflate
+ stream. The end-of-block will not be indicated until all of the uncompressed
+ data from that block has been written to strm->next_out. The number of
+ unused bits may in general be greater than seven, except when bit 7 of
+ data_type is set, in which case the number of unused bits will be less than
+ eight. data_type is set as noted here every time inflate() returns for all
+ flush options, and so can be used to determine the amount of currently
+ consumed input in bits.
+
+ The Z_TREES option behaves as Z_BLOCK does, but it also returns when the
+ end of each deflate block header is reached, before any actual data in that
+ block is decoded. This allows the caller to determine the length of the
+ deflate block header for later use in random access within a deflate block.
+ 256 is added to the value of strm->data_type when inflate() returns
+ immediately after reaching the end of the deflate block header.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step (a
+ single call of inflate), the parameter flush should be set to Z_FINISH. In
+ this case all pending input is processed and all pending output is flushed;
+ avail_out must be large enough to hold all of the uncompressed data for the
+ operation to complete. (The size of the uncompressed data may have been
+ saved by the compressor for this purpose.) The use of Z_FINISH is not
+ required to perform an inflation in one step. However it may be used to
+ inform inflate that a faster approach can be used for the single inflate()
+ call. Z_FINISH also informs inflate to not maintain a sliding window if the
+ stream completes, which reduces inflate's memory footprint. If the stream
+ does not complete, either because not all of the stream is provided or not
+ enough output space is provided, then a sliding window will be allocated and
+ inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+ been used.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the effects of the flush parameter in this implementation are
+ on the return value of inflate() as noted below, when inflate() returns early
+ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+ memory for a sliding window when Z_FINISH is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the Adler-32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() can decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically, if requested when
+ initializing with inflateInit2(). Any information contained in the gzip
+ header is not retained, so applications that need that information should
+ instead use raw inflate, see inflateInit2() below, or inflateBack() and
+ perform their own processing of the gzip header and trailer. When processing
+ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+ producted so far. The CRC-32 is checked against the gzip trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may
+ then call inflateSync() to look for a good compression block if a partial
+ recovery of the data is desired.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by the
+ caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero), no
+ header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but is
+ slow and reduces compression ratio; memLevel=9 uses maximum memory for
+ optimal speed. The default value is 8. See zconf.h for total memory usage
+ as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as
+ fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The
+ strategy parameter only affects the compression ratio but not the
+ correctness of the compressed output even if it is not set appropriately.
+ Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
+ decoder for special applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
+ method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is
+ incompatible with the version assumed by the caller (ZLIB_VERSION). msg is
+ set to null if there is no error message. deflateInit2 does not perform any
+ compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. When using the zlib format, this
+ function must be called immediately after deflateInit, deflateInit2 or
+ deflateReset, and before any call of deflate. When doing raw deflate, this
+ function must be called either before any call of deflate, or immediately
+ after the completion of a deflate block, i.e. after all input has been
+ consumed and all output has been delivered when using any of the flush
+ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The
+ compressor and decompressor must use exactly the same dictionary (see
+ inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size
+ provided in deflateInit or deflateInit2. Thus the strings most likely to be
+ useful should be put at the end of the dictionary, not at the front. In
+ addition, the current implementation of deflate will use at most the window
+ size minus 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if not at a block boundary for raw deflate). deflateSetDictionary does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and can
+ consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state. The
+ stream will keep the same compression level and any other attributes that
+ may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different strategy.
+ If the compression level is changed, the input available so far is
+ compressed with the old level (and may be flushed); the new level will take
+ effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to be
+ compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if
+ strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit() or
+ deflateInit2(), and after deflateSetHeader(), if used. This would be used
+ to allocate an output buffer for deflation in a single pass, and so would be
+ called before deflate(). If that first deflate() call is provided the
+ sourceLen input bytes, an output buffer allocated to the size returned by
+ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+ to return Z_STREAM_END. Note that it is possible for the compressed size to
+ be larger than the value returned by deflateBound() if flush options other
+ than Z_FINISH or Z_NO_FLUSH are used.
+*/
+
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+ unsigned *pending,
+ int *bits));
+/*
+ deflatePending() returns the number of bytes and bits of output that have
+ been generated, but not yet provided in the available output. The bytes not
+ provided would be due to the available output space having being consumed.
+ The number of bits of output not provided are between 0 and 7, where they
+ await more bits to join them in order to fill out a full byte. If pending
+ or bits are Z_NULL, then those values are not set.
+
+ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+ */
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the bits
+ leftover from a previous deflate stream when appending to it. As such, this
+ function can only be used for raw deflate, and must be used before the first
+ deflate() call after a deflateInit2() or deflateReset(). bits must be less
+ than or equal to 16, and that many of the least significant bits of value
+ will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be zero to request that inflate use the window size in
+ the zlib header of the compressed stream.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
+ crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit2 does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit2() does not process any header information -- that is
+ deferred until inflate() is called.
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called at any
+ time to set the dictionary. If the provided dictionary is smaller than the
+ window and there is already data in the window, then the provided dictionary
+ will amend what's there. The application must insure that the dictionary
+ that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by inflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If inflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a possible full flush point (see above
+ for the description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+ All full flush points have this pattern, but not all occurrences of this
+ pattern are full flush points.
+
+ inflateSync returns Z_OK if a possible full flush point has been found,
+ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+ In the success case, the application may save the current current value of
+ total_in which indicates where valid compressed data was found. In the
+ error case, the application may repeatedly call inflateSync, providing more
+ input each time, until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state. The
+ stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
+ int windowBits));
+/*
+ This function is the same as inflateReset, but it also permits changing
+ the wrap and window size requests. The windowBits parameter is interpreted
+ the same as it is for inflateInit2.
+
+ inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL), or if
+ the windowBits parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ If bits is negative, then the input stream bit buffer is emptied. Then
+ inflatePrime() can be called again to put bits in the buffer. This is used
+ to clear out bits leftover after feeding inflate a block description prior
+ to feeding inflate codes.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+/*
+ This function returns two values, one in the lower 16 bits of the return
+ value, and the other in the remaining upper bits, obtained by shifting the
+ return value down 16 bits. If the upper value is -1 and the lower value is
+ zero, then inflate() is currently decoding information outside of a block.
+ If the upper value is -1 and the lower value is non-zero, then inflate is in
+ the middle of a stored block, with the lower value equaling the number of
+ bytes from the input remaining to copy. If the upper value is not -1, then
+ it is the number of bits back from the current bit position in the input of
+ the code (literal or length/distance pair) currently being processed. In
+ that case the lower value is the number of bytes already emitted for that
+ code.
+
+ A code is being processed if inflate is waiting for more input to complete
+ decoding of the code, or if it has completed decoding but is waiting for
+ more output space to write the literal or match data.
+
+ inflateMark() is used to mark locations in the input data for random
+ access, which may be at bit positions, and to note those cases where the
+ output of a code may span boundaries of random access blocks. The current
+ location in the input stream can be determined from avail_in and data_type
+ as noted in the description for the Z_BLOCK flush parameter for inflate.
+
+ inflateMark returns the value noted above or -1 << 16 if the provided
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be
+ used to force inflate() to return immediately after header processing is
+ complete and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When any
+ of extra, name, or comment are not Z_NULL and the respective field is not
+ present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the parameters are invalid, Z_MEM_ERROR if the internal state could not be
+ allocated, or Z_VERSION_ERROR if the version of the library does not match
+ the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *,
+ z_const unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is potentially more efficient than
+ inflate() for file i/o applications, in that it avoids copying between the
+ output and the sliding window by simply making the window itself the output
+ buffer. inflate() can be faster on modern CPUs when used with large
+ buffers. inflateBack() trusts the application to not change the output
+ buffer passed by the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free the
+ allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects only
+ the raw deflate stream to decompress. This is different from the normal
+ behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format error
+ in the deflate stream (in which case strm->msg is set to indicate the nature
+ of the error), or Z_STREAM_ERROR if the stream was not properly initialized.
+ In the case of Z_BUF_ERROR, an input or output error can be distinguished
+ using strm->next_in which will be Z_NULL only if in() returned an error. If
+ strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning
+ non-zero. (in() will always be called before out(), so strm->next_in is
+ assured to be defined if out() returns non-zero.) Note that inflateBack()
+ cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+#ifndef Z_SOLO
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the basic
+ stream-oriented functions. To simplify the interface, some default options
+ are assumed (compression level and memory usage, standard memory allocation
+ functions). The source code of these utility functions can be modified if
+ you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before a
+ compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit, destLen
+ is the actual size of the uncompressed buffer.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
+ the case where there is not enough room, uncompress() will fill the output
+ buffer with the uncompressed data up to that point.
+*/
+
+ /* gzip file access functions */
+
+/*
+ This library supports reading and writing files in gzip (.gz) format with
+ an interface similar to that of stdio, using the functions that start with
+ "gz". The gzip format is different from the zlib format. gzip is a gzip
+ wrapper, documented in RFC 1952, wrapped around a deflate stream.
+*/
+
+typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
+
+/*
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+
+ Opens a gzip (.gz) file for reading or writing. The mode parameter is as
+ in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
+ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
+ compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
+ for fixed code compression as in "wb9F". (See the description of
+ deflateInit2 for more information about the strategy parameter.) 'T' will
+ request transparent writing or appending with no compression and not using
+ the gzip format.
+
+ "a" can be used instead of "w" to request that the gzip stream that will
+ be written be appended to the file. "+" will result in an error, since
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
+
+ These functions, as well as gzip, will read and decode a sequence of gzip
+ streams in a file. The append function of gzopen() can be used to create
+ such a file. (Also see gzflush() for another way to do this.) When
+ appending, gzopen does not test whether the file begins with a gzip stream,
+ nor does it look for the end of the gzip streams to begin appending. gzopen
+ will simply append a gzip stream to the existing file.
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression. When
+ reading, this will be detected automatically by looking for the magic two-
+ byte gzip header.
+
+ gzopen returns NULL if the file could not be opened, if there was
+ insufficient memory to allocate the gzFile state, or if an invalid mode was
+ specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
+ errno can be checked to determine if the reason gzopen failed was that the
+ file could not be opened.
+*/
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen associates a gzFile with the file descriptor fd. File descriptors
+ are obtained from calls like open, dup, creat, pipe or fileno (if the file
+ has been previously opened with fopen). The mode parameter is as in gzopen.
+
+ The next call of gzclose on the returned gzFile will also close the file
+ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
+ fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
+ mode);. The duplicated descriptor should be saved to avoid a leak, since
+ gzdopen does not close fd if it fails. If you are using fileno() to get the
+ file descriptor from a FILE *, then you will have to use dup() to avoid
+ double-close()ing the file descriptor. Both gzclose() and fclose() will
+ close the associated file descriptor, so they need to have different file
+ descriptors.
+
+ gzdopen returns NULL if there was insufficient memory to allocate the
+ gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
+ provided, or '+' was provided), or if fd is -1. The file descriptor is not
+ used until the next gz* read, write, seek, or close operation, so gzdopen
+ will not detect if fd is invalid (unless fd is -1).
+*/
+
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+/*
+ Set the internal buffer size used by this library's functions. The
+ default buffer size is 8192 bytes. This function must be called after
+ gzopen() or gzdopen(), and before any other calls that read or write the
+ file. The buffer memory allocation is always deferred to the first read or
+ write. Two buffers are allocated, either both of the specified size when
+ writing, or one of the specified size and the other twice that size when
+ reading. A larger buffer size of, for example, 64K or 128K bytes will
+ noticeably increase the speed of decompression (reading).
+
+ The new buffer size also affects the maximum length for gzprintf().
+
+ gzbuffer() returns 0 on success, or -1 on failure, such as being called
+ too late.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file. If
+ the input file is not in gzip format, gzread copies the given number of
+ bytes into the buffer directly from the file.
+
+ After reaching the end of a gzip stream in the input, gzread will continue
+ to read, looking for another gzip stream. Any number of gzip streams may be
+ concatenated in the input file, and will all be decompressed by gzread().
+ If something other than a gzip stream is encountered after a gzip stream,
+ that remaining trailing garbage is ignored (and no error is returned).
+
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
+
+ gzread returns the number of uncompressed bytes actually read, less than
+ len for end of file, or -1 for error.
+*/
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes written or 0 in case of
+ error.
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the arguments to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written, or 0 in case of error. The number of
+ uncompressed bytes written is limited to 8191, or one less than the buffer
+ size given to gzbuffer(). The caller should assure that this limit is not
+ exceeded. If it is exceeded, then gzprintf() will return an error (0) with
+ nothing written. In this case, there may also be a buffer overflow with
+ unpredictable consequences, which is possible only if zlib was compiled with
+ the insecure functions sprintf() or vsprintf() because the secure snprintf()
+ or vsnprintf() functions were not available. This can be determined using
+ zlibCompileFlags().
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or a
+ newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. If any characters are read or if len == 1, the
+ string is terminated with a null character. If no characters are read due
+ to an end-of-file or len < 1, then the buffer is left untouched.
+
+ gzgets returns buf which is a null-terminated string, or it returns NULL
+ for end-of-file or in case of error. If there was an error, the contents at
+ buf are indeterminate.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file. gzputc
+ returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte or -1
+ in case of end of file or error. This is implemented as a macro for speed.
+ As such, it does not do all of the checking the other functions do. I.e.
+ it does not check to see if file is NULL, nor whether the structure file
+ points to has been clobbered or not.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read as the first character
+ on the next read. At least one character of push-back is allowed.
+ gzungetc() returns the character pushed, or -1 on failure. gzungetc() will
+ fail if c is -1, and may fail if a character has been pushed but not read
+ yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
+ output buffer size of pushed characters is allowed. (See gzbuffer above.)
+ The pushed character will be discarded if the stream is repositioned with
+ gzseek() or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter flush
+ is as in the deflate() function. The return value is the zlib error number
+ (see function gzerror below). gzflush is only permitted when writing.
+
+ If the flush parameter is Z_FINISH, the remaining data is written and the
+ gzip stream is completed in the output. If gzwrite() is called again, a new
+ gzip stream will be started in the output. gzread() is able to read such
+ concatented gzip streams.
+
+ gzflush should be called only when strictly necessary because it will
+ degrade compression if called too often.
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+
+ Sets the starting position for the next gzread or gzwrite on the given
+ compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+
+ Returns the starting position for the next gzread or gzwrite on the given
+ compressed file. This position represents a number of bytes in the
+ uncompressed data stream, and is zero when starting, even if appending or
+ reading a gzip stream from the middle of a file using gzdopen().
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+
+ Returns the current offset in the file being read or written. This offset
+ includes the count of bytes that precede the gzip stream, for example when
+ appending or when using gzdopen() for reading. When reading, the offset
+ does not include as yet unused buffered input. This information can be used
+ for a progress indicator. On error, gzoffset() returns -1.
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns true (1) if the end-of-file indicator has been set while reading,
+ false (0) otherwise. Note that the end-of-file indicator is set only if the
+ read tried to go past the end of the input, but came up short. Therefore,
+ just like feof(), gzeof() may return false even if there is no more data to
+ read, in the event that the last read request was for the exact number of
+ bytes remaining in the input file. This will happen if the input file size
+ is an exact multiple of the buffer size.
+
+ If gzeof() returns true, then the read functions will return no more data,
+ unless the end-of-file indicator is reset by gzclearerr() and the input file
+ has grown since the previous end of file was detected.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns true (1) if file is being copied directly while reading, or false
+ (0) if file is a gzip stream being decompressed.
+
+ If the input file is empty, gzdirect() will return true, since the input
+ does not contain a gzip stream.
+
+ If gzdirect() is used immediately after gzopen() or gzdopen() it will
+ cause buffers to be allocated to allow reading the file to determine if it
+ is a gzip file. Therefore if gzbuffer() is used, it should be called before
+ gzdirect().
+
+ When writing, gzdirect() returns true (1) if transparent writing was
+ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
+ gzdirect() is not needed when writing. Transparent writing must be
+ explicitly requested, so the application already knows the answer. When
+ linking statically, using gzdirect() will include all of the zlib code for
+ gzip file reading and decompression, which may not be desired.)
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file and
+ deallocates the (de)compression state. Note that once file is closed, you
+ cannot call gzerror with file, since its structures have been deallocated.
+ gzclose must not be called more than once on the same file, just as free
+ must not be called more than once on the same allocation.
+
+ gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
+*/
+
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+/*
+ Same as gzclose(), but gzclose_r() is only for use when reading, and
+ gzclose_w() is only for use when writing or appending. The advantage to
+ using these instead of gzclose() is that they avoid linking in zlib
+ compression or decompression code that is not used when only reading or only
+ writing respectively. If gzclose() is used, then both compression and
+ decompression code will be included the application when linking to a static
+ zlib library.
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the given
+ compressed file. errnum is set to zlib error number. If an error occurred
+ in the file system and not in the compression library, errnum is set to
+ Z_ERRNO and the application may consult errno to get the exact error code.
+
+ The application must not modify the returned string. Future calls to
+ this function may invalidate the previously returned string. If file is
+ closed, then the string previously returned by gzerror will no longer be
+ available.
+
+ gzerror() should be used to distinguish errors from end-of-file for those
+ functions above that do not distinguish those cases in their return values.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+#endif /* !Z_SOLO */
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the compression
+ library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is Z_NULL, this function returns the
+ required initial value for the checksum.
+
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster.
+
+ Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
+ negative, the result has no meaning or utility.
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is Z_NULL, this function returns the required
+ initial value for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+/*
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure. Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro. The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously. They can
+ * only be used by the gzgetc() macro. You have been warned.
+ */
+struct gzFile_s {
+ unsigned have;
+ unsigned char *next;
+ z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+# define z_gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#else
+# define gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#endif
+
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
+ * both are true, the application gets the *64 functions, and the regular
+ * functions are changed to 64 bits) -- in case these are set on systems
+ * without large file support, _LFS64_LARGEFILE must also be true
+ */
+#ifdef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+#endif
+
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+# ifdef Z_PREFIX_SET
+# define z_gzopen z_gzopen64
+# define z_gzseek z_gzseek64
+# define z_gztell z_gztell64
+# define z_gzoffset z_gzoffset64
+# define z_adler32_combine z_adler32_combine64
+# define z_crc32_combine z_crc32_combine64
+# else
+# define gzopen gzopen64
+# define gzseek gzseek64
+# define gztell gztell64
+# define gzoffset gzoffset64
+# define adler32_combine adler32_combine64
+# define crc32_combine crc32_combine64
+# endif
+# ifndef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN off64_t ZEXPORT gzseek64 OF((gzFile, off64_t, int));
+ ZEXTERN off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, off64_t));
+# endif
+#else
+ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+#endif
+
+#else /* Z_SOLO */
+
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
+/* hack for buggy compilers */
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;};
+#endif
+
+/* undocumented functions */
+ZEXTERN const char * ZEXPORT zError OF((int));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
+ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+#if defined(_WIN32) && !defined(Z_SOLO)
+ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
+ const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+ const char *format,
+ va_list va));
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
diff --git a/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h b/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h
new file mode 100644
index 0000000000..582d1b5f3c
--- /dev/null
+++ b/core/src/fxcodec/fx_zlib/zlib_v128/zutil.h
@@ -0,0 +1,255 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZUTIL_H
+#define ZUTIL_H
+
+#include "../../../../include/fxcrt/fx_system.h" /* XYQ 2007-5-22 */
+
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
+#include "zlib.h"
+
+#if defined(STDC) && !defined(Z_SOLO)
+# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
+# include <stddef.h>
+# endif
+# include <string.h>
+# include <stdlib.h>
+#endif
+
+#ifdef Z_SOLO
+ typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long ulg;
+
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+ return (strm->msg = ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+ /* common constants */
+
+#ifndef DEF_WBITS
+# define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES 2
+/* The three kinds of block type */
+
+#define MIN_MATCH 3
+#define MAX_MATCH 258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+ /* target dependencies */
+
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
+# define OS_CODE 0x00
+# ifndef Z_SOLO
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
+# endif
+# endif
+#endif
+
+#ifdef AMIGA
+# define OS_CODE 0x01
+#endif
+
+#if defined(VAXC) || defined(VMS)
+# define OS_CODE 0x02
+# define F_OPEN(name, mode) \
+ FXSYS_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#if defined(ATARI) || defined(atarist)
+# define OS_CODE 0x05
+#endif
+
+#ifdef OS2
+# define OS_CODE 0x06
+# if defined(M_I86) && !defined(Z_SOLO)
+# include <malloc.h>
+# endif
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+# define OS_CODE 0x07
+# ifndef Z_SOLO
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
+# endif
+# endif
+#endif
+
+#ifdef TOPS20
+# define OS_CODE 0x0a
+#endif
+
+#ifdef WIN32
+# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
+# define OS_CODE 0x0b
+# endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+# define OS_CODE 0x0f
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
+# if defined(_WIN32_WCE)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# ifndef _PTRDIFF_T_DEFINED
+ typedef int ptrdiff_t;
+# define _PTRDIFF_T_DEFINED
+# endif
+# else
+# define fdopen(fd,type) _fdopen(fd,type)
+# endif
+#endif
+
+#if defined(__BORLANDC__) && !defined(MSDOS)
+ #pragma warn -8004
+ #pragma warn -8008
+ #pragma warn -8066
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_WIN32) && \
+ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+#endif
+
+ /* common defaults */
+
+#ifndef OS_CODE
+# define OS_CODE 0x03 /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+# define F_OPEN(name, mode) FXSYS_fopen((name), (mode))
+#endif
+
+ /* functions */
+
+#if defined(pyr) || defined(Z_SOLO)
+# define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+ * You may have to use the same strategy for Borland C (untested).
+ * The __SC__ check is for Symantec.
+ */
+# define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+# define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+# define zmemcpy _fmemcpy
+# define zmemcmp _fmemcmp
+# define zmemzero(dest, len) _fmemset(dest, 0, len)
+# else
+# define zmemcpy FXSYS_memcpy32
+# define zmemcmp FXSYS_memcmp32
+# define zmemzero(dest, len) FXSYS_memset32(dest, 0, len)
+# endif
+#else
+ void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
+ int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
+ void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+# include <stdio.h>
+ extern int ZLIB_INTERNAL z_verbose;
+ extern void ZLIB_INTERNAL z_error OF((char *m));
+# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+# define Trace(x) {if (z_verbose>=0) FXSYS_fprintf x ;}
+# define Tracev(x) {if (z_verbose>0) FXSYS_fprintf x ;}
+# define Tracevv(x) {if (z_verbose>1) FXSYS_fprintf x ;}
+# define Tracec(c,x) {if (z_verbose>0 && (c)) FXSYS_fprintf x ;}
+# define Tracecv(c,x) {if (z_verbose>1 && (c)) FXSYS_fprintf x ;}
+#else
+# define Assert(cond,msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c,x)
+# define Tracecv(c,x)
+#endif
+
+#ifndef Z_SOLO
+ voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
+ unsigned size));
+ void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+#endif
+
+#define ZALLOC(strm, items, size) \
+ (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+/* Reverse the bytes in a 32-bit value */
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
+#endif /* ZUTIL_H */
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
new file mode 100644
index 0000000000..1664257411
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithDecoder.h
@@ -0,0 +1,126 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITHMETIC_DECODER_H_
+#define _JBIG2_ARITHMETIC_DECODER_H_
+#include "JBig2_Define.h"
+#include "JBig2_BitStream.h"
+#include "JBig2_ArithQe.h"
+typedef struct {
+ unsigned int MPS;
+ unsigned int I;
+} JBig2ArithCtx;
+class CJBig2_ArithDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithDecoder(CJBig2_BitStream *pStream);
+
+ ~CJBig2_ArithDecoder();
+
+ int DECODE(JBig2ArithCtx *pCX);
+private:
+
+ void INITDEC();
+
+ void BYTEIN();
+ unsigned char B;
+ unsigned int C;
+ unsigned int A;
+ unsigned int CT;
+ CJBig2_BitStream *m_pStream;
+};
+inline CJBig2_ArithDecoder::CJBig2_ArithDecoder(CJBig2_BitStream *pStream)
+{
+ m_pStream = pStream;
+ INITDEC();
+}
+inline CJBig2_ArithDecoder::~CJBig2_ArithDecoder()
+{
+}
+inline void CJBig2_ArithDecoder::INITDEC()
+{
+ B = m_pStream->getCurByte_arith();
+ C = (B ^ 0xff) << 16;;
+ BYTEIN();
+ C = C << 7;
+ CT = CT - 7;
+ A = 0x8000;
+}
+inline void CJBig2_ArithDecoder::BYTEIN()
+{
+ unsigned char B1;
+ if(B == 0xff) {
+ B1 = m_pStream->getNextByte_arith();
+ if(B1 > 0x8f) {
+ CT = 8;
+ } else {
+ m_pStream->incByteIdx();
+ B = B1;
+ C = C + 0xfe00 - (B << 9);
+ CT = 7;
+ }
+ } else {
+ m_pStream->incByteIdx();
+ B = m_pStream->getCurByte_arith();
+ C = C + 0xff00 - (B << 8);
+ CT = 8;
+ }
+}
+inline int CJBig2_ArithDecoder::DECODE(JBig2ArithCtx *pCX)
+{
+ int D;
+ const JBig2ArithQe * qe = &QeTable[pCX->I];
+ A = A - qe->Qe;
+ if((C >> 16) < A) {
+ if(A & 0x8000) {
+ D = pCX->MPS;
+ } else {
+ if(A < qe->Qe) {
+ D = 1 - pCX->MPS;
+ if(qe->nSwitch == 1) {
+ pCX->MPS = 1 - pCX->MPS;
+ }
+ pCX->I = qe->NLPS;
+ } else {
+ D = pCX->MPS;
+ pCX->I = qe->NMPS;
+ }
+ do {
+ if (CT == 0) {
+ BYTEIN();
+ }
+ A <<= 1;
+ C <<= 1;
+ CT--;
+ } while ((A & 0x8000) == 0);
+ }
+ } else {
+ C -= A << 16;
+ if(A < qe->Qe) {
+ A = qe->Qe;
+ D = pCX->MPS;
+ pCX->I = qe->NMPS;
+ } else {
+ A = qe->Qe;
+ D = 1 - pCX->MPS;
+ if(qe->nSwitch == 1) {
+ pCX->MPS = 1 - pCX->MPS;
+ }
+ pCX->I = qe->NLPS;
+ }
+ do {
+ if (CT == 0) {
+ BYTEIN();
+ }
+ A <<= 1;
+ C <<= 1;
+ CT--;
+ } while ((A & 0x8000) == 0);
+ }
+ return D;
+}
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
new file mode 100644
index 0000000000..bb4e0bba9f
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp
@@ -0,0 +1,105 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_ArithIntDecoder.h"
+CJBig2_ArithIntDecoder::CJBig2_ArithIntDecoder()
+{
+ IAx = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), 512);
+ JBIG2_memset(IAx, 0, sizeof(JBig2ArithCtx) * 512);
+}
+CJBig2_ArithIntDecoder::~CJBig2_ArithIntDecoder()
+{
+ m_pModule->JBig2_Free(IAx);
+}
+int CJBig2_ArithIntDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+ int PREV, V;
+ int S, D;
+ int nNeedBits, nTemp, i;
+ PREV = 1;
+ S = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | S;
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ PREV = (PREV << 1) | D;
+ if(D) {
+ nNeedBits = 32;
+ V = 4436;
+ } else {
+ nNeedBits = 12;
+ V = 340;
+ }
+ } else {
+ nNeedBits = 8;
+ V = 84;
+ }
+ } else {
+ nNeedBits = 6;
+ V = 20;
+ }
+ } else {
+ nNeedBits = 4;
+ V = 4;
+ }
+ } else {
+ nNeedBits = 2;
+ V = 0;
+ }
+ nTemp = 0;
+ for(i = 0; i < nNeedBits; i++) {
+ D = pArithDecoder->DECODE(IAx + PREV);
+ if(PREV < 256) {
+ PREV = (PREV << 1) | D;
+ } else {
+ PREV = (((PREV << 1) | D) & 511) | 256;
+ }
+ nTemp = (nTemp << 1) | D;
+ }
+ V += nTemp;
+ if(S == 1 && V > 0) {
+ V = -V;
+ }
+ *nResult = V;
+ if(S == 1 && V == 0) {
+ return JBIG2_OOB;
+ }
+ return 0;
+}
+CJBig2_ArithIaidDecoder::CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA)
+{
+ SBSYMCODELEN = SBSYMCODELENA;
+ IAID = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), (1 << SBSYMCODELEN));
+ JBIG2_memset(IAID, 0, sizeof(JBig2ArithCtx) * (int)(1 << SBSYMCODELEN));
+}
+CJBig2_ArithIaidDecoder::~CJBig2_ArithIaidDecoder()
+{
+ m_pModule->JBig2_Free(IAID);
+}
+int CJBig2_ArithIaidDecoder::decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult)
+{
+ int PREV;
+ int D;
+ int i;
+ PREV = 1;
+ for(i = 0; i < SBSYMCODELEN; i++) {
+ D = pArithDecoder->DECODE(IAID + PREV);
+ PREV = (PREV << 1) | D;
+ }
+ PREV = PREV - (1 << SBSYMCODELEN);
+ *nResult = PREV;
+ return 0;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
new file mode 100644
index 0000000000..ad4656f54d
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITH_INT_DECODER_H_
+#define _JBIG2_ARITH_INT_DECODER_H_
+#include "JBig2_Module.h"
+#include "JBig2_ArithDecoder.h"
+class CJBig2_ArithIntDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithIntDecoder();
+
+ ~CJBig2_ArithIntDecoder();
+
+ int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
+private:
+
+ JBig2ArithCtx *IAx;
+};
+class CJBig2_ArithIaidDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_ArithIaidDecoder(unsigned char SBSYMCODELENA);
+
+ ~CJBig2_ArithIaidDecoder();
+
+ int decode(CJBig2_ArithDecoder *pArithDecoder, int *nResult);
+private:
+
+ JBig2ArithCtx *IAID;
+
+ unsigned char SBSYMCODELEN;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_ArithQe.h b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
new file mode 100644
index 0000000000..17bc18aa03
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_ArithQe.h
@@ -0,0 +1,64 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_ARITH_QE_H_
+#define _JBIG2_ARITH_QE_H_
+typedef struct {
+ unsigned int Qe;
+ unsigned int NMPS;
+ unsigned int NLPS;
+ unsigned int nSwitch;
+} JBig2ArithQe;
+const JBig2ArithQe QeTable[] = {
+ { 0x5601, 1, 1, 1 },
+ { 0x3401, 2, 6, 0 },
+ { 0x1801, 3, 9, 0 },
+ { 0x0AC1, 4, 12, 0 },
+ { 0x0521, 5, 29, 0 },
+ { 0x0221, 38, 33, 0 },
+ { 0x5601, 7, 6, 1 },
+ { 0x5401, 8, 14, 0 },
+ { 0x4801, 9, 14, 0 },
+ { 0x3801, 10, 14, 0 },
+ { 0x3001, 11, 17, 0 },
+ { 0x2401, 12, 18, 0 },
+ { 0x1C01, 13, 20, 0 },
+ { 0x1601, 29, 21, 0 },
+ { 0x5601, 15, 14, 1 },
+ { 0x5401, 16, 14, 0 },
+ { 0x5101, 17, 15, 0 },
+ { 0x4801, 18, 16, 0 },
+ { 0x3801, 19, 17, 0 },
+ { 0x3401, 20, 18, 0 },
+ { 0x3001, 21, 19, 0 },
+ { 0x2801, 22, 19, 0 },
+ { 0x2401, 23, 20, 0 },
+ { 0x2201, 24, 21, 0 },
+ { 0x1C01, 25, 22, 0 },
+ { 0x1801, 26, 23, 0 },
+ { 0x1601, 27, 24, 0 },
+ { 0x1401, 28, 25, 0 },
+ { 0x1201, 29, 26, 0 },
+ { 0x1101, 30, 27, 0 },
+ { 0x0AC1, 31, 28, 0 },
+ { 0x09C1, 32, 29, 0 },
+ { 0x08A1, 33, 30, 0 },
+ { 0x0521, 34, 31, 0 },
+ { 0x0441, 35, 32, 0 },
+ { 0x02A1, 36, 33, 0 },
+ { 0x0221, 37, 34, 0 },
+ { 0x0141, 38, 35, 0 },
+ { 0x0111, 39, 36, 0 },
+ { 0x0085, 40, 37, 0 },
+ { 0x0049, 41, 38, 0 },
+ { 0x0025, 42, 39, 0 },
+ { 0x0015, 43, 40, 0 },
+ { 0x0009, 44, 41, 0 },
+ { 0x0005, 45, 42, 0 },
+ { 0x0001, 45, 43, 0 },
+ { 0x5601, 46, 46, 0 }
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_BitStream.h b/core/src/fxcodec/jbig2/JBig2_BitStream.h
new file mode 100644
index 0000000000..8ed473a150
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_BitStream.h
@@ -0,0 +1,316 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_BIT_STREAM_H_
+#define _JBIG2_BIT_STREAM_H_
+#include "JBig2_Define.h"
+class CJBig2_BitStream : public CJBig2_Object
+{
+public:
+
+ CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength);
+
+ CJBig2_BitStream(CJBig2_BitStream &bs);
+
+ ~CJBig2_BitStream();
+
+ FX_INT32 readNBits(FX_DWORD nBits, FX_DWORD *dwResult);
+
+ FX_INT32 readNBits(FX_DWORD nBits, FX_INT32 *nResult);
+
+ FX_INT32 read1Bit(FX_DWORD *dwResult);
+
+ FX_INT32 read1Bit(FX_BOOL *bResult);
+
+ FX_INT32 read1Byte(FX_BYTE *cResult);
+
+ FX_INT32 readInteger(FX_DWORD *dwResult);
+
+ FX_INT32 readShortInteger(FX_WORD *wResult);
+
+ void alignByte();
+
+ void align4Byte();
+
+ FX_BYTE getAt(FX_DWORD dwOffset);
+
+ FX_BYTE getCurByte();
+
+ FX_BYTE getNextByte();
+
+ FX_INT32 incByteIdx();
+
+ FX_BYTE getCurByte_arith();
+
+ FX_BYTE getNextByte_arith();
+
+ FX_DWORD getOffset();
+
+ void setOffset(FX_DWORD dwOffset);
+
+ FX_DWORD getBitPos();
+
+ void setBitPos(FX_DWORD dwBitPos);
+
+ FX_BYTE *getBuf();
+
+ FX_DWORD getLength()
+ {
+ return m_dwLength;
+ }
+
+ FX_BYTE *getPointer();
+
+ void offset(FX_DWORD dwOffset);
+
+ FX_DWORD getByteLeft();
+private:
+
+ FX_BYTE *m_pBuf;
+
+ FX_DWORD m_dwLength;
+
+ FX_DWORD m_dwByteIdx;
+
+ FX_DWORD m_dwBitIdx;
+};
+inline CJBig2_BitStream::CJBig2_BitStream(FX_BYTE *pBuffer, FX_DWORD dwLength)
+{
+ m_pBuf = pBuffer;
+ m_dwLength = dwLength;
+ m_dwByteIdx = 0;
+ m_dwBitIdx = 0;
+ if (m_dwLength > 256 * 1024 * 1024) {
+ m_dwLength = 0;
+ m_pBuf = NULL;
+ }
+}
+inline CJBig2_BitStream::CJBig2_BitStream(CJBig2_BitStream &bs)
+{
+ m_pBuf = bs.m_pBuf;
+ m_dwLength = bs.m_dwLength;
+ m_dwByteIdx = bs.m_dwByteIdx;
+ m_dwBitIdx = bs.m_dwBitIdx;
+}
+inline CJBig2_BitStream::~CJBig2_BitStream()
+{
+}
+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_DWORD *dwResult)
+{
+ FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
+ if(dwTemp <= (m_dwLength << 3)) {
+ *dwResult = 0;
+ if(dwTemp + dwBits <= (m_dwLength << 3)) {
+ dwTemp = dwBits;
+ } else {
+ dwTemp = (m_dwLength << 3) - dwTemp;
+ }
+ while(dwTemp > 0) {
+ *dwResult = (*dwResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ dwTemp --;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::readNBits(FX_DWORD dwBits, FX_INT32 *nResult)
+{
+ FX_DWORD dwTemp = (m_dwByteIdx << 3) + m_dwBitIdx;
+ if(dwTemp <= (m_dwLength << 3)) {
+ *nResult = 0;
+ if(dwTemp + dwBits <= (m_dwLength << 3)) {
+ dwTemp = dwBits;
+ } else {
+ dwTemp = (m_dwLength << 3) - dwTemp;
+ }
+ while(dwTemp > 0) {
+ *nResult = (*nResult << 1) | ((m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01);
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ dwTemp --;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_DWORD *dwResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::read1Bit(FX_BOOL *bResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *bResult = (m_pBuf[m_dwByteIdx] >> (7 - m_dwBitIdx)) & 0x01;
+ if(m_dwBitIdx == 7) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ } else {
+ m_dwBitIdx ++;
+ }
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::read1Byte(FX_BYTE *cResult)
+{
+ if(m_dwByteIdx < m_dwLength) {
+ *cResult = m_pBuf[m_dwByteIdx];
+ m_dwByteIdx ++;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::readInteger(FX_DWORD *dwResult)
+{
+ if(m_dwByteIdx + 3 < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] << 24) | (m_pBuf[m_dwByteIdx + 1] << 16)
+ | (m_pBuf[m_dwByteIdx + 2] << 8) | m_pBuf[m_dwByteIdx + 3];
+ m_dwByteIdx += 4;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+inline FX_INT32 CJBig2_BitStream::readShortInteger(FX_WORD *dwResult)
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ *dwResult = (m_pBuf[m_dwByteIdx] << 8) | m_pBuf[m_dwByteIdx + 1];
+ m_dwByteIdx += 2;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline void CJBig2_BitStream::alignByte()
+{
+ if(m_dwBitIdx != 0) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ }
+}
+inline void CJBig2_BitStream::align4Byte()
+{
+ if(m_dwBitIdx != 0) {
+ m_dwByteIdx ++;
+ m_dwBitIdx = 0;
+ }
+ m_dwByteIdx = (m_dwByteIdx + 3) & -4;
+}
+inline FX_BYTE CJBig2_BitStream::getAt(FX_DWORD dwOffset)
+{
+ if(dwOffset < m_dwLength) {
+ return m_pBuf[dwOffset];
+ } else {
+ return 0;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getCurByte()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ return m_pBuf[m_dwByteIdx];
+ } else {
+ return 0;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getNextByte()
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ return m_pBuf[m_dwByteIdx + 1];
+ } else {
+ return 0;
+ }
+}
+inline FX_INT32 CJBig2_BitStream::incByteIdx()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ m_dwByteIdx ++;
+ return 0;
+ } else {
+ return -1;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getCurByte_arith()
+{
+ if(m_dwByteIdx < m_dwLength) {
+ return m_pBuf[m_dwByteIdx];
+ } else {
+ return 0xff;
+ }
+}
+inline FX_BYTE CJBig2_BitStream::getNextByte_arith()
+{
+ if(m_dwByteIdx + 1 < m_dwLength) {
+ return m_pBuf[m_dwByteIdx + 1];
+ } else {
+ return 0xff;
+ }
+}
+inline FX_DWORD CJBig2_BitStream::getOffset()
+{
+ return m_dwByteIdx;
+}
+inline void CJBig2_BitStream::setOffset(FX_DWORD dwOffset)
+{
+ if (dwOffset > m_dwLength) {
+ dwOffset = m_dwLength;
+ }
+ m_dwByteIdx = dwOffset;
+}
+inline FX_DWORD CJBig2_BitStream::getBitPos()
+{
+ return (m_dwByteIdx << 3) + m_dwBitIdx;
+}
+inline void CJBig2_BitStream::setBitPos(FX_DWORD dwBitPos)
+{
+ m_dwByteIdx = dwBitPos >> 3;
+ m_dwBitIdx = dwBitPos & 7;
+}
+inline FX_BYTE *CJBig2_BitStream::getBuf()
+{
+ return m_pBuf;
+}
+inline FX_BYTE *CJBig2_BitStream::getPointer()
+{
+ return m_pBuf + m_dwByteIdx;
+}
+inline void CJBig2_BitStream::offset(FX_DWORD dwOffset)
+{
+ m_dwByteIdx += dwOffset;
+}
+inline FX_DWORD CJBig2_BitStream::getByteLeft()
+{
+ return m_dwLength - m_dwByteIdx;
+}
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.cpp b/core/src/fxcodec/jbig2/JBig2_Context.cpp
new file mode 100644
index 0000000000..856c0c3bda
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Context.cpp
@@ -0,0 +1,1812 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Context.h"
+void OutputBitmap(CJBig2_Image* pImage)
+{
+ if(!pImage) {
+ return;
+ }
+}
+CJBig2_Context *CJBig2_Context::CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
+{
+ return new(pModule) CJBig2_Context(pGlobalData, dwGlobalLength, pData, dwLength, nStreamType, pPause);
+}
+void CJBig2_Context::DestroyContext(CJBig2_Context *pContext)
+{
+ if(pContext) {
+ delete pContext;
+ }
+}
+CJBig2_Context::CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause)
+{
+ if(pGlobalData && (dwGlobalLength > 0)) {
+ JBIG2_ALLOC(m_pGlobalContext, CJBig2_Context(NULL, 0, pGlobalData, dwGlobalLength,
+ JBIG2_EMBED_STREAM, pPause));
+ } else {
+ m_pGlobalContext = NULL;
+ }
+ JBIG2_ALLOC(m_pStream, CJBig2_BitStream(pData, dwLength));
+ m_nStreamType = nStreamType;
+ m_nState = JBIG2_OUT_OF_PAGE;
+ JBIG2_ALLOC(m_pSegmentList, CJBig2_List<CJBig2_Segment>);
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(1));
+ m_pPage = NULL;
+ m_bBufSpecified = FALSE;
+ m_pPause = pPause;
+ m_nSegmentDecoded = 0;
+ m_PauseStep = 10;
+ m_pArithDecoder = NULL;
+ m_pGRD = NULL;
+ m_gbContext = NULL;
+ m_pSegment = NULL;
+ m_dwOffset = 0;
+ m_ProcessiveStatus = FXCODEC_STATUS_FRAME_READY;
+}
+CJBig2_Context::~CJBig2_Context()
+{
+ if(m_pArithDecoder) {
+ delete m_pArithDecoder;
+ }
+ m_pArithDecoder = NULL;
+ if(m_pGRD) {
+ delete m_pGRD;
+ }
+ m_pGRD = NULL;
+ if(m_gbContext) {
+ delete m_gbContext;
+ }
+ m_gbContext = NULL;
+ if(m_pGlobalContext) {
+ delete m_pGlobalContext;
+ }
+ m_pGlobalContext = NULL;
+ if(m_pPageInfoList) {
+ delete m_pPageInfoList;
+ }
+ m_pPageInfoList = NULL;
+ if(m_bBufSpecified && m_pPage) {
+ delete m_pPage;
+ }
+ m_pPage = NULL;
+ if(m_pStream) {
+ delete m_pStream;
+ }
+ m_pStream = NULL;
+ if(m_pSegmentList) {
+ delete m_pSegmentList;
+ }
+ m_pSegmentList = NULL;
+}
+FX_INT32 CJBig2_Context::decodeFile(IFX_Pause* pPause)
+{
+ FX_BYTE cFlags;
+ FX_DWORD dwTemp;
+ const FX_BYTE fileID[] = {0x97, 0x4A, 0x42, 0x32, 0x0D, 0x0A, 0x1A, 0x0A};
+ FX_INT32 nRet;
+ if(m_pStream->getByteLeft() < 8) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(JBIG2_memcmp(m_pStream->getPointer(), fileID, 8) != 0) {
+ m_pModule->JBig2_Error("not jbig2 file");
+ nRet = JBIG2_ERROR_FILE_FORMAT;
+ goto failed;
+ }
+ m_pStream->offset(8);
+ if(m_pStream->read1Byte(&cFlags) != 0) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(!(cFlags & 0x02)) {
+ if(m_pStream->readInteger(&dwTemp) != 0) {
+ m_pModule->JBig2_Error("file header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if(dwTemp > 0) {
+ delete m_pPageInfoList;
+ JBIG2_ALLOC(m_pPageInfoList, CJBig2_List<JBig2PageInfo>(dwTemp));
+ }
+ }
+ if(cFlags & 0x01) {
+ m_nStreamType = JBIG2_SQUENTIAL_STREAM;
+ return decode_SquentialOrgnazation(pPause);
+ } else {
+ m_nStreamType = JBIG2_RANDOM_STREAM;
+ return decode_RandomOrgnazation_FirstPage(pPause);
+ }
+failed:
+ return nRet;
+}
+FX_INT32 CJBig2_Context::decode_SquentialOrgnazation(IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ if(m_pStream->getByteLeft() > 0) {
+ while(m_pStream->getByteLeft() >= JBIG2_MIN_SEGMENT_SIZE) {
+ if(m_pSegment == NULL) {
+ JBIG2_ALLOC(m_pSegment, CJBig2_Segment());
+ nRet = parseSegmentHeader(m_pSegment);
+ if(nRet != JBIG2_SUCCESS) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ return nRet;
+ }
+ m_dwOffset = m_pStream->getOffset();
+ }
+ nRet = parseSegmentData(m_pSegment, pPause);
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ m_PauseStep = 2;
+ return JBIG2_SUCCESS;
+ }
+ if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ break;
+ } else if(nRet != JBIG2_SUCCESS) {
+ delete m_pSegment;
+ m_pSegment = NULL;
+ return nRet;
+ }
+ m_pSegmentList->addItem(m_pSegment);
+ if(m_pSegment->m_dwData_length != 0xffffffff) {
+ m_dwOffset = m_dwOffset + m_pSegment->m_dwData_length;
+ m_pStream->setOffset(m_dwOffset);
+ } else {
+ m_pStream->offset(4);
+ }
+ OutputBitmap(m_pPage);
+ m_pSegment = NULL;
+ if(m_pStream->getByteLeft() > 0 && m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ m_PauseStep = 2;
+ return JBIG2_SUCCESS;
+ }
+ }
+ } else {
+ return JBIG2_END_OF_FILE;
+ }
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::decode_EmbedOrgnazation(IFX_Pause* pPause)
+{
+ return decode_SquentialOrgnazation(pPause);
+}
+FX_INT32 CJBig2_Context::decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause)
+{
+ CJBig2_Segment *pSegment;
+ FX_INT32 nRet;
+ while(m_pStream->getByteLeft() > JBIG2_MIN_SEGMENT_SIZE) {
+ JBIG2_ALLOC(pSegment, CJBig2_Segment());
+ nRet = parseSegmentHeader(pSegment);
+ if(nRet != JBIG2_SUCCESS) {
+ delete pSegment;
+ return nRet;
+ } else if(pSegment->m_cFlags.s.type == 51) {
+ delete pSegment;
+ break;
+ }
+ m_pSegmentList->addItem(pSegment);
+ if(pPause && m_pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 3;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return JBIG2_SUCCESS;
+ }
+ }
+ m_nSegmentDecoded = 0;
+ return decode_RandomOrgnazation(pPause);
+}
+FX_INT32 CJBig2_Context::decode_RandomOrgnazation(IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ for(; m_nSegmentDecoded < m_pSegmentList->getLength(); m_nSegmentDecoded++) {
+ nRet = parseSegmentData(m_pSegmentList->getAt(m_nSegmentDecoded), pPause);
+ if((nRet == JBIG2_END_OF_PAGE) || (nRet == JBIG2_END_OF_FILE)) {
+ break;
+ } else if(nRet != JBIG2_SUCCESS) {
+ return nRet;
+ }
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 4;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return JBIG2_SUCCESS;
+ }
+ }
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
+{
+ FX_INT32 nRet = 0;
+ if(m_pGlobalContext) {
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
+ if(nRet != JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ return nRet;
+ }
+ }
+ m_bFirstPage = TRUE;
+ m_PauseStep = 0;
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
+ m_bBufSpecified = TRUE;
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 1;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return nRet;
+ }
+ int ret = Continue(pPause);
+ return ret;
+}
+FX_INT32 CJBig2_Context::Continue(IFX_Pause* pPause)
+{
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_READY;
+ FX_INT32 nRet;
+ if(m_PauseStep <= 1) {
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ if(m_bFirstPage) {
+ nRet = decode_RandomOrgnazation_FirstPage(pPause);
+ } else {
+ nRet = decode_RandomOrgnazation(pPause);
+ }
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ } else if(m_PauseStep == 2) {
+ nRet = decode_SquentialOrgnazation(pPause);
+ } else if(m_PauseStep == 3) {
+ nRet = decode_RandomOrgnazation_FirstPage(pPause);
+ } else if(m_PauseStep == 4) {
+ nRet = decode_RandomOrgnazation(pPause);
+ } else if(m_PauseStep == 5) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return JBIG2_SUCCESS;
+ }
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return nRet;
+ }
+ m_PauseStep = 5;
+ if(!m_bBufSpecified && nRet == JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return JBIG2_SUCCESS;
+ }
+ if(nRet == JBIG2_SUCCESS) {
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ } else {
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ }
+ return nRet;
+}
+FX_INT32 CJBig2_Context::getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause)
+{
+ FX_INT32 nRet = JBIG2_ERROR_STREAM_TYPE;
+ m_bFirstPage = FALSE;
+ m_PauseStep = 0;
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(width, height, stride, pBuf));
+ m_bBufSpecified = TRUE;
+ if(m_pPage && pPause && pPause->NeedToPauseNow()) {
+ m_PauseStep = 1;
+ m_ProcessiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return nRet;
+ }
+ return Continue(pPause);
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ nRet = decode_RandomOrgnazation(pPause);
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ return nRet;
+}
+FX_INT32 CJBig2_Context::getFirstPage(CJBig2_Image **image, IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ m_bFirstPage = TRUE;
+ m_PauseStep = 0;
+ if(m_pGlobalContext) {
+ nRet = m_pGlobalContext->decode_EmbedOrgnazation(pPause);
+ if(nRet != JBIG2_SUCCESS) {
+ return nRet;
+ }
+ }
+ m_bBufSpecified = FALSE;
+ return Continue(pPause);
+}
+FX_INT32 CJBig2_Context::getNextPage(CJBig2_Image **image, IFX_Pause* pPause)
+{
+ FX_INT32 nRet;
+ m_bBufSpecified = FALSE;
+ m_bFirstPage = FALSE;
+ m_PauseStep = 0;
+ switch(m_nStreamType) {
+ case JBIG2_FILE_STREAM:
+ nRet = decodeFile(pPause);
+ break;
+ case JBIG2_SQUENTIAL_STREAM:
+ nRet = decode_SquentialOrgnazation(pPause);
+ break;
+ case JBIG2_RANDOM_STREAM:
+ nRet = decode_RandomOrgnazation(pPause);
+ break;
+ case JBIG2_EMBED_STREAM:
+ nRet = decode_EmbedOrgnazation(pPause);
+ break;
+ default:
+ return JBIG2_ERROR_STREAM_TYPE;
+ }
+ if(nRet == JBIG2_SUCCESS) {
+ *image = m_pPage;
+ m_pPage = NULL;
+ return JBIG2_SUCCESS;
+ }
+ return nRet;
+}
+CJBig2_Segment *CJBig2_Context::findSegmentByNumber(FX_DWORD dwNumber)
+{
+ CJBig2_Segment *pSeg;
+ FX_INT32 i;
+ if(m_pGlobalContext) {
+ pSeg = m_pGlobalContext->findSegmentByNumber(dwNumber);
+ if(pSeg) {
+ return pSeg;
+ }
+ }
+ for(i = 0; i < m_pSegmentList->getLength(); i++) {
+ pSeg = m_pSegmentList->getAt(i);
+ if(pSeg->m_dwNumber == dwNumber) {
+ return pSeg;
+ }
+ }
+ return NULL;
+}
+CJBig2_Segment *CJBig2_Context::findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment,
+ FX_BYTE cType, FX_INT32 nIndex)
+{
+ CJBig2_Segment *pSeg;
+ FX_INT32 i, count;
+ count = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg && pSeg->m_cFlags.s.type == cType) {
+ if(count == nIndex) {
+ return pSeg;
+ } else {
+ count ++;
+ }
+ }
+ }
+ return NULL;
+}
+FX_INT32 CJBig2_Context::parseSegmentHeader(CJBig2_Segment *pSegment)
+{
+ FX_BYTE cSSize, cPSize;
+ FX_BYTE cTemp;
+ FX_WORD wTemp;
+ FX_DWORD dwTemp;
+ if((m_pStream->readInteger(&pSegment->m_dwNumber) != 0)
+ || (m_pStream->read1Byte(&pSegment->m_cFlags.c) != 0)) {
+ goto failed;
+ }
+ cTemp = m_pStream->getCurByte();
+ if((cTemp >> 5) == 7) {
+ if(m_pStream->readInteger((FX_DWORD*)&pSegment->m_nReferred_to_segment_count) != 0) {
+ goto failed;
+ }
+ pSegment->m_nReferred_to_segment_count &= 0x1fffffff;
+ if (pSegment->m_nReferred_to_segment_count > JBIG2_MAX_REFERRED_SEGMENT_COUNT) {
+ m_pModule->JBig2_Error("Too many referred segments.");
+ return JBIG2_ERROR_LIMIT;
+ }
+ dwTemp = 5 + 4 + (pSegment->m_nReferred_to_segment_count + 1) / 8;
+ } else {
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_nReferred_to_segment_count = cTemp >> 5;
+ dwTemp = 5 + 1;
+ }
+ cSSize = pSegment->m_dwNumber > 65536 ? 4 : pSegment->m_dwNumber > 256 ? 2 : 1;
+ cPSize = pSegment->m_cFlags.s.page_association_size ? 4 : 1;
+ if(pSegment->m_nReferred_to_segment_count) {
+ pSegment->m_pReferred_to_segment_numbers = (FX_DWORD*)m_pModule->JBig2_Malloc2(
+ sizeof(FX_DWORD), pSegment->m_nReferred_to_segment_count);
+ for(FX_INT32 i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ switch(cSSize) {
+ case 1:
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = cTemp;
+ break;
+ case 2:
+ if(m_pStream->readShortInteger(&wTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = wTemp;
+ break;
+ case 4:
+ if(m_pStream->readInteger(&dwTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_pReferred_to_segment_numbers[i] = dwTemp;
+ break;
+ }
+ if (pSegment->m_pReferred_to_segment_numbers[i] >= pSegment->m_dwNumber) {
+ m_pModule->JBig2_Error("The referred segment number is greater than this segment number.");
+ goto failed;
+ }
+ }
+ }
+ if(cPSize == 1) {
+ if(m_pStream->read1Byte(&cTemp) != 0) {
+ goto failed;
+ }
+ pSegment->m_dwPage_association = cTemp;
+ } else {
+ if(m_pStream->readInteger(&pSegment->m_dwPage_association) != 0) {
+ goto failed;
+ }
+ }
+ if(m_pStream->readInteger(&pSegment->m_dwData_length) != 0) {
+ goto failed;
+ }
+ pSegment->m_pData = m_pStream->getPointer();
+ pSegment->m_State = JBIG2_SEGMENT_DATA_UNPARSED;
+ return JBIG2_SUCCESS;
+failed:
+ m_pModule->JBig2_Error("header too short.");
+ return JBIG2_ERROR_TOO_SHORT;
+}
+FX_INT32 CJBig2_Context::parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_INT32 ret = ProcessiveParseSegmentData(pSegment, pPause);
+ while(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE && m_pStream->getByteLeft() > 0) {
+ ret = ProcessiveParseSegmentData(pSegment, pPause);
+ }
+ return ret;
+}
+FX_INT32 CJBig2_Context::ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ switch(pSegment->m_cFlags.s.type) {
+ case 0:
+ return parseSymbolDict(pSegment, pPause);
+ case 4:
+ case 6:
+ case 7:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseTextRegion(pSegment);
+ }
+ case 16:
+ return parsePatternDict(pSegment, pPause);
+ case 20:
+ case 22:
+ case 23:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseHalftoneRegion(pSegment, pPause);
+ }
+ case 36:
+ case 38:
+ case 39:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseGenericRegion(pSegment, pPause);
+ }
+ case 40:
+ case 42:
+ case 43:
+ if(m_nState == JBIG2_OUT_OF_PAGE) {
+ goto failed2;
+ } else {
+ return parseGenericRefinementRegion(pSegment);
+ }
+ case 48: {
+ FX_WORD wTemp;
+ JBig2PageInfo *pPageInfo;
+ JBIG2_ALLOC(pPageInfo, JBig2PageInfo);
+ if((m_pStream->readInteger(&pPageInfo->m_dwWidth) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwHeight) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwResolutionX) != 0)
+ || (m_pStream->readInteger(&pPageInfo->m_dwResolutionY) != 0)
+ || (m_pStream->read1Byte(&pPageInfo->m_cFlags) != 0)
+ || (m_pStream->readShortInteger(&wTemp) != 0)) {
+ delete pPageInfo;
+ goto failed1;
+ }
+ pPageInfo->m_bIsStriped = ((wTemp >> 15) & 1) ? 1 : 0;
+ pPageInfo->m_wMaxStripeSize = wTemp & 0x7fff;
+ if((pPageInfo->m_dwHeight == 0xffffffff) && (pPageInfo->m_bIsStriped != 1)) {
+ m_pModule->JBig2_Warn("page height = 0xffffffff buf stripe field is 0");
+ pPageInfo->m_bIsStriped = 1;
+ }
+ if(!m_bBufSpecified) {
+ if(m_pPage) {
+ delete m_pPage;
+ }
+ if(pPageInfo->m_dwHeight == 0xffffffff) {
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_wMaxStripeSize));
+ } else {
+ JBIG2_ALLOC(m_pPage, CJBig2_Image(pPageInfo->m_dwWidth, pPageInfo->m_dwHeight));
+ }
+ }
+ m_pPage->fill((pPageInfo->m_cFlags & 4) ? 1 : 0);
+ m_pPageInfoList->addItem(pPageInfo);
+ m_nState = JBIG2_IN_PAGE;
+ }
+ break;
+ case 49:
+ m_nState = JBIG2_OUT_OF_PAGE;
+ return JBIG2_END_OF_PAGE;
+ break;
+ case 50:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ case 51:
+ return JBIG2_END_OF_FILE;
+ case 52:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ case 53:
+ return parseTable(pSegment);
+ case 62:
+ m_pStream->offset(pSegment->m_dwData_length);
+ break;
+ default:
+ break;
+ }
+ return JBIG2_SUCCESS;
+failed1:
+ m_pModule->JBig2_Error("segment data too short.");
+ return JBIG2_ERROR_TOO_SHORT;
+failed2:
+ m_pModule->JBig2_Error("segment syntax error.");
+ return JBIG2_ERROR_FETAL;
+}
+FX_INT32 CJBig2_Context::parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_WORD wFlags;
+ FX_BYTE cSDHUFFDH, cSDHUFFDW, cSDHUFFBMSIZE, cSDHUFFAGGINST;
+ CJBig2_HuffmanTable *Table_B1 = NULL, *Table_B2 = NULL, *Table_B3 = NULL, *Table_B4 = NULL, *Table_B5 = NULL;
+ FX_INT32 i, nIndex, nRet;
+ CJBig2_Segment *pSeg = NULL, *pLRSeg = NULL;
+ FX_BOOL bUsed;
+ CJBig2_Image ** SDINSYMS = NULL;
+ CJBig2_SDDProc *pSymbolDictDecoder;
+ JBig2ArithCtx *gbContext = NULL, *grContext = NULL;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pSymbolDictDecoder, CJBig2_SDDProc());
+ if(m_pStream->readShortInteger(&wFlags) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFF = wFlags & 0x0001;
+ pSymbolDictDecoder->SDREFAGG = (wFlags >> 1) & 0x0001;
+ pSymbolDictDecoder->SDTEMPLATE = (wFlags >> 10) & 0x0003;
+ pSymbolDictDecoder->SDRTEMPLATE = (wFlags >> 12) & 0x0003;
+ cSDHUFFDH = (wFlags >> 2) & 0x0003;
+ cSDHUFFDW = (wFlags >> 4) & 0x0003;
+ cSDHUFFBMSIZE = (wFlags >> 6) & 0x0001;
+ cSDHUFFAGGINST = (wFlags >> 7) & 0x0001;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ if(pSymbolDictDecoder->SDTEMPLATE == 0) {
+ dwTemp = 8;
+ } else {
+ dwTemp = 2;
+ }
+ for(i = 0; i < (FX_INT32)dwTemp; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDAT[i]) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if((pSymbolDictDecoder->SDREFAGG == 1) && (pSymbolDictDecoder->SDRTEMPLATE == 0)) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pSymbolDictDecoder->SDRAT[i]) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if((m_pStream->readInteger(&pSymbolDictDecoder->SDNUMEXSYMS) != 0)
+ || (m_pStream->readInteger(&pSymbolDictDecoder->SDNUMNEWSYMS) != 0)) {
+ m_pModule->JBig2_Error("symbol dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (pSymbolDictDecoder->SDNUMEXSYMS > JBIG2_MAX_EXPORT_SYSMBOLS
+ || pSymbolDictDecoder->SDNUMNEWSYMS > JBIG2_MAX_NEW_SYSMBOLS) {
+ m_pModule->JBig2_Error("symbol dictionary segment : too many export/new symbols.");
+ nRet = JBIG2_ERROR_LIMIT;
+ goto failed;
+ }
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
+ m_pModule->JBig2_Error("symbol dictionary segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ }
+ pSymbolDictDecoder->SDNUMINSYMS = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ pSymbolDictDecoder->SDNUMINSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
+ pLRSeg = pSeg;
+ }
+ }
+ if(pSymbolDictDecoder->SDNUMINSYMS == 0) {
+ SDINSYMS = NULL;
+ } else {
+ SDINSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
+ sizeof(CJBig2_Image*), pSymbolDictDecoder->SDNUMINSYMS);
+ dwTemp = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ JBIG2_memcpy(SDINSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ }
+ pSymbolDictDecoder->SDINSYMS = SDINSYMS;
+ if(pSymbolDictDecoder->SDHUFF == 1) {
+ if((cSDHUFFDH == 2) || (cSDHUFFDW == 2)) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH=2 or SDHUFFDW=2 is not permitted.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ nIndex = 0;
+ if(cSDHUFFDH == 0) {
+ JBIG2_ALLOC(Table_B4, CJBig2_HuffmanTable(HuffmanTable_B4,
+ sizeof(HuffmanTable_B4) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B4));
+ pSymbolDictDecoder->SDHUFFDH = Table_B4;
+ } else if(cSDHUFFDH == 1) {
+ JBIG2_ALLOC(Table_B5, CJBig2_HuffmanTable(HuffmanTable_B5,
+ sizeof(HuffmanTable_B5) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B5));
+ pSymbolDictDecoder->SDHUFFDH = Table_B5;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDH can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFDH = pSeg->m_Result.ht;
+ }
+ if(cSDHUFFDW == 0) {
+ JBIG2_ALLOC(Table_B2, CJBig2_HuffmanTable(HuffmanTable_B2,
+ sizeof(HuffmanTable_B2) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B2));
+ pSymbolDictDecoder->SDHUFFDW = Table_B2;
+ } else if(cSDHUFFDW == 1) {
+ JBIG2_ALLOC(Table_B3, CJBig2_HuffmanTable(HuffmanTable_B3,
+ sizeof(HuffmanTable_B3) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B3));
+ pSymbolDictDecoder->SDHUFFDW = Table_B3;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFDW can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFDW = pSeg->m_Result.ht;
+ }
+ if(cSDHUFFBMSIZE == 0) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pSymbolDictDecoder->SDHUFFBMSIZE = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFBMSIZE can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFBMSIZE = pSeg->m_Result.ht;
+ }
+ if(pSymbolDictDecoder->SDREFAGG == 1) {
+ if(cSDHUFFAGGINST == 0) {
+ if(!Table_B1) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ }
+ pSymbolDictDecoder->SDHUFFAGGINST = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("symbol dictionary segment : SDHUFFAGGINST can't find user supplied table.");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSymbolDictDecoder->SDHUFFAGGINST = pSeg->m_Result.ht;
+ }
+ }
+ }
+ if((wFlags & 0x0100) && pLRSeg && pLRSeg->m_Result.sd->m_bContextRetained) {
+ if (pSymbolDictDecoder->SDHUFF == 0) {
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
+ 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memcpy(gbContext, pLRSeg->m_Result.sd->m_gbContext, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if (pSymbolDictDecoder->SDREFAGG == 1) {
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memcpy(grContext, pLRSeg->m_Result.sd->m_grContext, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ } else {
+ if (pSymbolDictDecoder->SDHUFF == 0) {
+ dwTemp = pSymbolDictDecoder->SDTEMPLATE == 0 ? 65536 : pSymbolDictDecoder->SDTEMPLATE == 1 ?
+ 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if (pSymbolDictDecoder->SDREFAGG == 1) {
+ dwTemp = pSymbolDictDecoder->SDRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ }
+ pSegment->m_nResultType = JBIG2_SYMBOL_DICT_POINTER;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.sd = pSymbolDictDecoder->decode_Arith(pArithDecoder, gbContext, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.sd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.sd = pSymbolDictDecoder->decode_Huffman(m_pStream, gbContext, grContext, pPause);
+ if(pSegment->m_Result.sd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(wFlags & 0x0200) {
+ pSegment->m_Result.sd->m_bContextRetained = TRUE;
+ if(pSymbolDictDecoder->SDHUFF == 0) {
+ pSegment->m_Result.sd->m_gbContext = gbContext;
+ }
+ if(pSymbolDictDecoder->SDREFAGG == 1) {
+ pSegment->m_Result.sd->m_grContext = grContext;
+ }
+ bUsed = TRUE;
+ } else {
+ bUsed = FALSE;
+ }
+ delete pSymbolDictDecoder;
+ if(SDINSYMS) {
+ m_pModule->JBig2_Free(SDINSYMS);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B2) {
+ delete Table_B2;
+ }
+ if(Table_B3) {
+ delete Table_B3;
+ }
+ if(Table_B4) {
+ delete Table_B4;
+ }
+ if(Table_B5) {
+ delete Table_B5;
+ }
+ if(bUsed == FALSE) {
+ if(gbContext) {
+ m_pModule->JBig2_Free(gbContext);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ }
+ return JBIG2_SUCCESS;
+failed:
+ delete pSymbolDictDecoder;
+ if(SDINSYMS) {
+ m_pModule->JBig2_Free(SDINSYMS);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B2) {
+ delete Table_B2;
+ }
+ if(Table_B3) {
+ delete Table_B3;
+ }
+ if(Table_B4) {
+ delete Table_B4;
+ }
+ if(Table_B5) {
+ delete Table_B5;
+ }
+ if(gbContext) {
+ m_pModule->JBig2_Free(gbContext);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseTextRegion(CJBig2_Segment *pSegment)
+{
+ FX_DWORD dwTemp;
+ FX_WORD wFlags;
+ FX_INT32 i, nIndex, nRet;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ CJBig2_Image **SBSYMS = NULL;
+ JBig2HuffmanCode *SBSYMCODES = NULL;
+ FX_BYTE cSBHUFFFS, cSBHUFFDS, cSBHUFFDT, cSBHUFFRDW, cSBHUFFRDH, cSBHUFFRDX, cSBHUFFRDY, cSBHUFFRSIZE;
+ CJBig2_HuffmanTable *Table_B1 = NULL,
+ *Table_B6 = NULL,
+ *Table_B7 = NULL,
+ *Table_B8 = NULL,
+ *Table_B9 = NULL,
+ *Table_B10 = NULL,
+ *Table_B11 = NULL,
+ *Table_B12 = NULL,
+ *Table_B13 = NULL,
+ *Table_B14 = NULL,
+ *Table_B15 = NULL;
+ JBig2ArithCtx *grContext = NULL;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_TRDProc *pTRD;
+ JBIG2_ALLOC(pTRD, CJBig2_TRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->readShortInteger(&wFlags) != 0)) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pTRD->SBW = ri.width;
+ pTRD->SBH = ri.height;
+ pTRD->SBHUFF = wFlags & 0x0001;
+ pTRD->SBREFINE = (wFlags >> 1) & 0x0001;
+ dwTemp = (wFlags >> 2) & 0x0003;
+ pTRD->SBSTRIPS = 1 << dwTemp;
+ pTRD->REFCORNER = (JBig2Corner)((wFlags >> 4) & 0x0003);
+ pTRD->TRANSPOSED = (wFlags >> 6) & 0x0001;
+ pTRD->SBCOMBOP = (JBig2ComposeOp)((wFlags >> 7) & 0x0003);
+ pTRD->SBDEFPIXEL = (wFlags >> 9) & 0x0001;
+ pTRD->SBDSOFFSET = (wFlags >> 10) & 0x001f;
+ if(pTRD->SBDSOFFSET >= 0x0010) {
+ pTRD->SBDSOFFSET = pTRD->SBDSOFFSET - 0x0020;
+ }
+ pTRD->SBRTEMPLATE = (wFlags >> 15) & 0x0001;
+ if(pTRD->SBHUFF == 1) {
+ if(m_pStream->readShortInteger(&wFlags) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ cSBHUFFFS = wFlags & 0x0003;
+ cSBHUFFDS = (wFlags >> 2) & 0x0003;
+ cSBHUFFDT = (wFlags >> 4) & 0x0003;
+ cSBHUFFRDW = (wFlags >> 6) & 0x0003;
+ cSBHUFFRDH = (wFlags >> 8) & 0x0003;
+ cSBHUFFRDX = (wFlags >> 10) & 0x0003;
+ cSBHUFFRDY = (wFlags >> 12) & 0x0003;
+ cSBHUFFRSIZE = (wFlags >> 14) & 0x0001;
+ }
+ if((pTRD->SBREFINE == 1) && (pTRD->SBRTEMPLATE == 0)) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pTRD->SBRAT[i]) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ if(m_pStream->readInteger(&pTRD->SBNUMINSTANCES) != 0) {
+ m_pModule->JBig2_Error("text region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ if(!findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i])) {
+ m_pModule->JBig2_Error("text region segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ }
+ pTRD->SBNUMSYMS = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ pTRD->SBNUMSYMS += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ if (pTRD->SBNUMSYMS > 0) {
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(
+ sizeof(CJBig2_Image*), pTRD->SBNUMSYMS);
+ dwTemp = 0;
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[i]);
+ if(pSeg->m_cFlags.s.type == 0) {
+ JBIG2_memcpy(SBSYMS + dwTemp, pSeg->m_Result.sd->SDEXSYMS,
+ pSeg->m_Result.sd->SDNUMEXSYMS * sizeof(CJBig2_Image*));
+ dwTemp += pSeg->m_Result.sd->SDNUMEXSYMS;
+ }
+ }
+ pTRD->SBSYMS = SBSYMS;
+ } else {
+ pTRD->SBSYMS = NULL;
+ }
+ if(pTRD->SBHUFF == 1) {
+ SBSYMCODES = decodeSymbolIDHuffmanTable(m_pStream, pTRD->SBNUMSYMS);
+ if(SBSYMCODES == NULL) {
+ m_pModule->JBig2_Error("text region segment: symbol ID huffman table decode failure!");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ pTRD->SBSYMCODES = SBSYMCODES;
+ } else {
+ dwTemp = 0;
+ while((FX_DWORD)(1 << dwTemp) < pTRD->SBNUMSYMS) {
+ dwTemp ++;
+ }
+ pTRD->SBSYMCODELEN = (FX_BYTE)dwTemp;
+ }
+ if(pTRD->SBHUFF == 1) {
+ if((cSBHUFFFS == 2) || (cSBHUFFRDW == 2) || (cSBHUFFRDH == 2)
+ || (cSBHUFFRDX == 2) || (cSBHUFFRDY == 2)) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFFS=2 or SBHUFFRDW=2 or "
+ "SBHUFFRDH=2 or SBHUFFRDX=2 or SBHUFFRDY=2 is not permitted");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ nIndex = 0;
+ if(cSBHUFFFS == 0) {
+ JBIG2_ALLOC(Table_B6, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ pTRD->SBHUFFFS = Table_B6;
+ } else if(cSBHUFFFS == 1) {
+ JBIG2_ALLOC(Table_B7, CJBig2_HuffmanTable(HuffmanTable_B7,
+ sizeof(HuffmanTable_B7) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B7));
+ pTRD->SBHUFFFS = Table_B7;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFFS can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFFS = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFDS == 0) {
+ JBIG2_ALLOC(Table_B8, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ pTRD->SBHUFFDS = Table_B8;
+ } else if(cSBHUFFDS == 1) {
+ JBIG2_ALLOC(Table_B9, CJBig2_HuffmanTable(HuffmanTable_B9,
+ sizeof(HuffmanTable_B9) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B9));
+ pTRD->SBHUFFDS = Table_B9;
+ } else if(cSBHUFFDS == 2) {
+ JBIG2_ALLOC(Table_B10, CJBig2_HuffmanTable(HuffmanTable_B10,
+ sizeof(HuffmanTable_B10) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B10));
+ pTRD->SBHUFFDS = Table_B10;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFDS can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFDS = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFDT == 0) {
+ JBIG2_ALLOC(Table_B11, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ pTRD->SBHUFFDT = Table_B11;
+ } else if(cSBHUFFDT == 1) {
+ JBIG2_ALLOC(Table_B12, CJBig2_HuffmanTable(HuffmanTable_B12,
+ sizeof(HuffmanTable_B12) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B12));
+ pTRD->SBHUFFDT = Table_B12;
+ } else if(cSBHUFFDT == 2) {
+ JBIG2_ALLOC(Table_B13, CJBig2_HuffmanTable(HuffmanTable_B13,
+ sizeof(HuffmanTable_B13) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B13));
+ pTRD->SBHUFFDT = Table_B13;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFDT can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFDT = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDW == 0) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ pTRD->SBHUFFRDW = Table_B14;
+ } else if(cSBHUFFRDW == 1) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ pTRD->SBHUFFRDW = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDW can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDW = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDH == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDH = Table_B14;
+ } else if(cSBHUFFRDH == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDH = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDH can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDH = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDX == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDX = Table_B14;
+ } else if(cSBHUFFRDX == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDX = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDX can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDX = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRDY == 0) {
+ if(!Table_B14) {
+ JBIG2_ALLOC(Table_B14, CJBig2_HuffmanTable(HuffmanTable_B14,
+ sizeof(HuffmanTable_B14) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B14));
+ }
+ pTRD->SBHUFFRDY = Table_B14;
+ } else if(cSBHUFFRDY == 1) {
+ if(!Table_B15) {
+ JBIG2_ALLOC(Table_B15, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ }
+ pTRD->SBHUFFRDY = Table_B15;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRDY can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRDY = pSeg->m_Result.ht;
+ }
+ if(cSBHUFFRSIZE == 0) {
+ JBIG2_ALLOC(Table_B1, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pTRD->SBHUFFRSIZE = Table_B1;
+ } else {
+ pSeg = findReferredSegmentByTypeAndIndex(pSegment, 53, nIndex++);
+ if(!pSeg) {
+ m_pModule->JBig2_Error("text region segment : SBHUFFRSIZE can't find user supplied table");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pTRD->SBHUFFRSIZE = pSeg->m_Result.ht;
+ }
+ }
+ if(pTRD->SBREFINE == 1) {
+ dwTemp = pTRD->SBRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if(pTRD->SBHUFF == 0) {
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pTRD->decode_Arith(pArithDecoder, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pTRD->decode_Huffman(m_pStream, grContext);
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 4) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pTRD;
+ if(SBSYMS) {
+ m_pModule->JBig2_Free(SBSYMS);
+ }
+ if(SBSYMCODES) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B6) {
+ delete Table_B6;
+ }
+ if(Table_B7) {
+ delete Table_B7;
+ }
+ if(Table_B8) {
+ delete Table_B8;
+ }
+ if(Table_B9) {
+ delete Table_B9;
+ }
+ if(Table_B10) {
+ delete Table_B10;
+ }
+ if(Table_B11) {
+ delete Table_B11;
+ }
+ if(Table_B12) {
+ delete Table_B12;
+ }
+ if(Table_B13) {
+ delete Table_B13;
+ }
+ if(Table_B14) {
+ delete Table_B14;
+ }
+ if(Table_B15) {
+ delete Table_B15;
+ }
+ return JBIG2_SUCCESS;
+failed:
+ delete pTRD;
+ if(SBSYMS) {
+ m_pModule->JBig2_Free(SBSYMS);
+ }
+ if(SBSYMCODES) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ }
+ if(grContext) {
+ m_pModule->JBig2_Free(grContext);
+ }
+ if(Table_B1) {
+ delete Table_B1;
+ }
+ if(Table_B6) {
+ delete Table_B6;
+ }
+ if(Table_B7) {
+ delete Table_B7;
+ }
+ if(Table_B8) {
+ delete Table_B8;
+ }
+ if(Table_B9) {
+ delete Table_B9;
+ }
+ if(Table_B10) {
+ delete Table_B10;
+ }
+ if(Table_B11) {
+ delete Table_B11;
+ }
+ if(Table_B12) {
+ delete Table_B12;
+ }
+ if(Table_B13) {
+ delete Table_B13;
+ }
+ if(Table_B14) {
+ delete Table_B14;
+ }
+ if(Table_B15) {
+ delete Table_B15;
+ }
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ JBig2ArithCtx *gbContext;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_PDDProc *pPDD;
+ FX_INT32 nRet;
+ JBIG2_ALLOC(pPDD, CJBig2_PDDProc());
+ if((m_pStream->read1Byte(&cFlags) != 0)
+ || (m_pStream->read1Byte(&pPDD->HDPW) != 0)
+ || (m_pStream->read1Byte(&pPDD->HDPH) != 0)
+ || (m_pStream->readInteger(&pPDD->GRAYMAX) != 0)) {
+ m_pModule->JBig2_Error("pattern dictionary segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (pPDD->GRAYMAX > JBIG2_MAX_PATTERN_INDEX) {
+ m_pModule->JBig2_Error("pattern dictionary segment : too max gray max.");
+ nRet = JBIG2_ERROR_LIMIT;
+ goto failed;
+ }
+ pPDD->HDMMR = cFlags & 0x01;
+ pPDD->HDTEMPLATE = (cFlags >> 1) & 0x03;
+ pSegment->m_nResultType = JBIG2_PATTERN_DICT_POINTER;
+ if(pPDD->HDMMR == 0) {
+ dwTemp = pPDD->HDTEMPLATE == 0 ? 65536 : pPDD->HDTEMPLATE == 1 ? 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.pd = pPDD->decode_Arith(pArithDecoder, gbContext, pPause);
+ delete pArithDecoder;
+ if(pSegment->m_Result.pd == NULL) {
+ m_pModule->JBig2_Free(gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(gbContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.pd = pPDD->decode_MMR(m_pStream, pPause);
+ if(pSegment->m_Result.pd == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ delete pPDD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pPDD;
+ return nRet;
+}
+FX_BOOL CJBig2_Context::parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ CJBig2_PatternDict *pPatternDict;
+ JBig2ArithCtx *gbContext;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_HTRDProc *pHRD;
+ FX_INT32 nRet;
+ JBIG2_ALLOC(pHRD, CJBig2_HTRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)
+ || (m_pStream->readInteger(&pHRD->HGW) != 0)
+ || (m_pStream->readInteger(&pHRD->HGH) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGX) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pHRD->HGY) != 0)
+ || (m_pStream->readShortInteger(&pHRD->HRX) != 0)
+ || (m_pStream->readShortInteger(&pHRD->HRY) != 0)) {
+ m_pModule->JBig2_Error("halftone region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pHRD->HBW = ri.width;
+ pHRD->HBH = ri.height;
+ pHRD->HMMR = cFlags & 0x01;
+ pHRD->HTEMPLATE = (cFlags >> 1) & 0x03;
+ pHRD->HENABLESKIP = (cFlags >> 3) & 0x01;
+ pHRD->HCOMBOP = (JBig2ComposeOp)((cFlags >> 4) & 0x07);
+ pHRD->HDEFPIXEL = (cFlags >> 7) & 0x01;
+ if(pSegment->m_nReferred_to_segment_count != 1) {
+ m_pModule->JBig2_Error("halftone region segment : refered to segment count not equals 1");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pSeg = findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
+ if( (pSeg == NULL) || (pSeg->m_cFlags.s.type != 16)) {
+ m_pModule->JBig2_Error("halftone region segment : refered to segment is not pattern dict");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pPatternDict = pSeg->m_Result.pd;
+ if((pPatternDict == NULL) || (pPatternDict->NUMPATS == 0)) {
+ m_pModule->JBig2_Error("halftone region segment : has no patterns input");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pHRD->HNUMPATS = pPatternDict->NUMPATS;
+ pHRD->HPATS = pPatternDict->HDPATS;
+ pHRD->HPW = pPatternDict->HDPATS[0]->m_nWidth;
+ pHRD->HPH = pPatternDict->HDPATS[0]->m_nHeight;
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ if(pHRD->HMMR == 0) {
+ dwTemp = pHRD->HTEMPLATE == 0 ? 65536 : pHRD->HTEMPLATE == 1 ? 8192 : 1024;
+ gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_Result.im = pHRD->decode_Arith(pArithDecoder, gbContext, pPause);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(gbContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ } else {
+ pSegment->m_Result.im = pHRD->decode_MMR(m_pStream, pPause);
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 20) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pHRD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pHRD;
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause)
+{
+ FX_DWORD dwTemp;
+ FX_BYTE cFlags;
+ FX_INT32 i, nRet;
+ if(m_pGRD == NULL) {
+ JBIG2_ALLOC(m_pGRD, CJBig2_GRDProc());
+ if((parseRegionInfo(&m_ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ if (m_ri.height < 0 || m_ri.width < 0) {
+ m_pModule->JBig2_Error("generic region segment : wrong data.");
+ nRet = JBIG2_FAILED;
+ goto failed;
+ }
+ m_pGRD->GBW = m_ri.width;
+ m_pGRD->GBH = m_ri.height;
+ m_pGRD->MMR = cFlags & 0x01;
+ m_pGRD->GBTEMPLATE = (cFlags >> 1) & 0x03;
+ m_pGRD->TPGDON = (cFlags >> 3) & 0x01;
+ if(m_pGRD->MMR == 0) {
+ if(m_pGRD->GBTEMPLATE == 0) {
+ for(i = 0; i < 8; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ } else {
+ for(i = 0; i < 2; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&m_pGRD->GBAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ }
+ m_pGRD->USESKIP = 0;
+ }
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ if(m_pGRD->MMR == 0) {
+ dwTemp = m_pGRD->GBTEMPLATE == 0 ? 65536 : m_pGRD->GBTEMPLATE == 1 ? 8192 : 1024;
+ if(m_gbContext == NULL) {
+ m_gbContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc(sizeof(JBig2ArithCtx) * dwTemp);
+ JBIG2_memset(m_gbContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ }
+ if(m_pArithDecoder == NULL) {
+ JBIG2_ALLOC(m_pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ m_ProcessiveStatus = m_pGRD->Start_decode_Arith(&pSegment->m_Result.im, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProcessiveStatus = m_pGRD->Continue_decode(pPause);
+ }
+ OutputBitmap(pSegment->m_Result.im);
+ if(m_ProcessiveStatus == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ if(pSegment->m_cFlags.s.type != 36) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ FX_RECT Rect = m_pGRD->GetReplaceRect();
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
+ }
+ return JBIG2_SUCCESS;
+ } else {
+ delete m_pArithDecoder;
+ m_pArithDecoder = NULL;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(m_gbContext);
+ nRet = JBIG2_ERROR_FETAL;
+ m_gbContext = NULL;
+ m_ProcessiveStatus = FXCODEC_STATUS_ERROR;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(m_gbContext);
+ m_gbContext = NULL;
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ }
+ } else {
+ FXCODEC_STATUS status = m_pGRD->Start_decode_MMR(&pSegment->m_Result.im, m_pStream, pPause);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ m_pGRD->Continue_decode(pPause);
+ }
+ if(pSegment->m_Result.im == NULL) {
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pStream->alignByte();
+ }
+ if(pSegment->m_cFlags.s.type != 36) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (m_ri.y + m_ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(m_ri.y + m_ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ FX_RECT Rect = m_pGRD->GetReplaceRect();
+ m_pPage->composeFrom(m_ri.x + Rect.left, m_ri.y + Rect.top, pSegment->m_Result.im, (JBig2ComposeOp)(m_ri.flags & 0x03), &Rect);
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete m_pGRD;
+ m_pGRD = NULL;
+ return JBIG2_SUCCESS;
+failed:
+ delete m_pGRD;
+ m_pGRD = NULL;
+ return nRet;
+}
+
+FX_BOOL CJBig2_Context::parseGenericRefinementRegion(CJBig2_Segment *pSegment)
+{
+ FX_DWORD dwTemp;
+ JBig2RegionInfo ri;
+ CJBig2_Segment *pSeg;
+ FX_INT32 i, nRet;
+ FX_BYTE cFlags;
+ JBig2ArithCtx *grContext;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ if((parseRegionInfo(&ri) != JBIG2_SUCCESS)
+ || (m_pStream->read1Byte(&cFlags) != 0)) {
+ m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ pGRRD->GRW = ri.width;
+ pGRRD->GRH = ri.height;
+ pGRRD->GRTEMPLATE = cFlags & 0x01;
+ pGRRD->TPGRON = (cFlags >> 1) & 0x01;
+ if(pGRRD->GRTEMPLATE == 0) {
+ for(i = 0; i < 4; i++) {
+ if(m_pStream->read1Byte((FX_BYTE*)&pGRRD->GRAT[i]) != 0) {
+ m_pModule->JBig2_Error("generic refinement region segment : data header too short.");
+ nRet = JBIG2_ERROR_TOO_SHORT;
+ goto failed;
+ }
+ }
+ }
+ pSeg = NULL;
+ if(pSegment->m_nReferred_to_segment_count > 0) {
+ for(i = 0; i < pSegment->m_nReferred_to_segment_count; i++) {
+ pSeg = this->findSegmentByNumber(pSegment->m_pReferred_to_segment_numbers[0]);
+ if(pSeg == NULL) {
+ m_pModule->JBig2_Error("generic refinement region segment : can't find refered to segments");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ if((pSeg->m_cFlags.s.type == 4) || (pSeg->m_cFlags.s.type == 20)
+ || (pSeg->m_cFlags.s.type == 36) || (pSeg->m_cFlags.s.type == 40)) {
+ break;
+ }
+ }
+ if(i >= pSegment->m_nReferred_to_segment_count) {
+ m_pModule->JBig2_Error("generic refinement region segment : can't find refered to intermediate region");
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ pGRRD->GRREFERENCE = pSeg->m_Result.im;
+ } else {
+ pGRRD->GRREFERENCE = m_pPage;
+ }
+ pGRRD->GRREFERENCEDX = 0;
+ pGRRD->GRREFERENCEDY = 0;
+ dwTemp = pGRRD->GRTEMPLATE ? 1 << 10 : 1 << 13;
+ grContext = (JBig2ArithCtx*)m_pModule->JBig2_Malloc2(sizeof(JBig2ArithCtx), dwTemp);
+ JBIG2_memset(grContext, 0, sizeof(JBig2ArithCtx)*dwTemp);
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(m_pStream));
+ pSegment->m_nResultType = JBIG2_IMAGE_POINTER;
+ pSegment->m_Result.im = pGRRD->decode(pArithDecoder, grContext);
+ delete pArithDecoder;
+ if(pSegment->m_Result.im == NULL) {
+ m_pModule->JBig2_Free(grContext);
+ nRet = JBIG2_ERROR_FETAL;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(grContext);
+ m_pStream->alignByte();
+ m_pStream->offset(2);
+ if(pSegment->m_cFlags.s.type != 40) {
+ if(!m_bBufSpecified) {
+ JBig2PageInfo *pPageInfo = m_pPageInfoList->getLast();
+ if ((pPageInfo->m_bIsStriped == 1) && (ri.y + ri.height > m_pPage->m_nHeight)) {
+ m_pPage->expand(ri.y + ri.height, (pPageInfo->m_cFlags & 4) ? 1 : 0);
+ }
+ }
+ m_pPage->composeFrom(ri.x, ri.y, pSegment->m_Result.im, (JBig2ComposeOp)(ri.flags & 0x03));
+ delete pSegment->m_Result.im;
+ pSegment->m_Result.im = NULL;
+ }
+ delete pGRRD;
+ return JBIG2_SUCCESS;
+failed:
+ delete pGRRD;
+ return nRet;
+}
+FX_BOOL CJBig2_Context::parseTable(CJBig2_Segment *pSegment)
+{
+ pSegment->m_nResultType = JBIG2_HUFFMAN_TABLE_POINTER;
+ JBIG2_ALLOC(pSegment->m_Result.ht, CJBig2_HuffmanTable(m_pStream));
+ if(!pSegment->m_Result.ht->isOK()) {
+ delete pSegment->m_Result.ht;
+ pSegment->m_Result.ht = NULL;
+ return JBIG2_ERROR_FETAL;
+ }
+ m_pStream->alignByte();
+ return JBIG2_SUCCESS;
+}
+FX_INT32 CJBig2_Context::parseRegionInfo(JBig2RegionInfo *pRI)
+{
+ if((m_pStream->readInteger((FX_DWORD*)&pRI->width) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->height) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->x) != 0)
+ || (m_pStream->readInteger((FX_DWORD*)&pRI->y) != 0)
+ || (m_pStream->read1Byte(&pRI->flags) != 0)) {
+ return JBIG2_ERROR_TOO_SHORT;
+ }
+ return JBIG2_SUCCESS;
+}
+JBig2HuffmanCode *CJBig2_Context::decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream,
+ FX_DWORD SBNUMSYMS)
+{
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_INT32 runcodes[35], runcodes_len[35], runcode;
+ FX_INT32 i, j, nTemp, nVal, nBits;
+ FX_INT32 run;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(sizeof(JBig2HuffmanCode), SBNUMSYMS);
+ for (i = 0; i < 35; i ++) {
+ if(pStream->readNBits(4, &runcodes_len[i]) != 0) {
+ goto failed;
+ }
+ }
+ huffman_assign_code(runcodes, runcodes_len, 35);
+ i = 0;
+ while(i < (int)SBNUMSYMS) {
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTemp) != 0) {
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTemp;
+ nBits ++;
+ for(j = 0; j < 35; j++) {
+ if((nBits == runcodes_len[j]) && (nVal == runcodes[j])) {
+ break;
+ }
+ }
+ if(j < 35) {
+ break;
+ }
+ }
+ runcode = j;
+ if(runcode < 32) {
+ SBSYMCODES[i].codelen = runcode;
+ run = 0;
+ } else if(runcode == 32) {
+ if(pStream->readNBits(2, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 3;
+ } else if(runcode == 33) {
+ if(pStream->readNBits(3, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 3;
+ } else if(runcode == 34) {
+ if(pStream->readNBits(7, &nTemp) != 0) {
+ goto failed;
+ }
+ run = nTemp + 11;
+ }
+ if(run > 0) {
+ if (i + run > (int)SBNUMSYMS) {
+ goto failed;
+ }
+ for(j = 0; j < run; j++) {
+ if(runcode == 32 && i > 0) {
+ SBSYMCODES[i + j].codelen = SBSYMCODES[i - 1].codelen;
+ } else {
+ SBSYMCODES[i + j].codelen = 0;
+ }
+ }
+ i += run;
+ } else {
+ i ++;
+ }
+ }
+ huffman_assign_code(SBSYMCODES, SBNUMSYMS);
+ return SBSYMCODES;
+failed:
+ m_pModule->JBig2_Free(SBSYMCODES);
+ return NULL;
+}
+void CJBig2_Context::huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+}
+void CJBig2_Context::huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(SBSYMCODES[i].codelen > LENMAX) {
+ LENMAX = SBSYMCODES[i].codelen;
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[SBSYMCODES[i].codelen] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(SBSYMCODES[CURTEMP].codelen == CURLEN) {
+ SBSYMCODES[CURTEMP].code = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Context.h b/core/src/fxcodec/jbig2/JBig2_Context.h
new file mode 100644
index 0000000000..369dba3512
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Context.h
@@ -0,0 +1,135 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_CONTEXT_H_
+#define _JBIG2_CONTEXT_H_
+#include "JBig2_Module.h"
+#include "JBig2_List.h"
+#include "JBig2_Segment.h"
+#include "JBig2_Page.h"
+#include "JBig2_GeneralDecoder.h"
+#include "../../../include/fxcodec/fx_codec_def.h"
+#include "../../../include/fxcrt/fx_basic.h"
+typedef enum {
+ JBIG2_OUT_OF_PAGE = 0,
+ JBIG2_IN_PAGE,
+} JBig2State;
+#define JBIG2_SUCCESS 0
+#define JBIG2_FAILED -1
+#define JBIG2_ERROR_TOO_SHORT -2
+#define JBIG2_ERROR_FETAL -3
+#define JBIG2_END_OF_PAGE 2
+#define JBIG2_END_OF_FILE 3
+#define JBIG2_ERROR_FILE_FORMAT -4
+#define JBIG2_ERROR_STREAM_TYPE -5
+#define JBIG2_ERROR_LIMIT -6
+#define JBIG2_FILE_STREAM 0
+#define JBIG2_SQUENTIAL_STREAM 1
+#define JBIG2_RANDOM_STREAM 2
+#define JBIG2_EMBED_STREAM 3
+#define JBIG2_MIN_SEGMENT_SIZE 11
+class CJBig2_Context : public CJBig2_Object
+{
+public:
+
+ static CJBig2_Context *CreateContext(CJBig2_Module *pModule, FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause = NULL);
+
+ static void DestroyContext(CJBig2_Context *pContext);
+
+ FX_INT32 getFirstPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
+
+ FX_INT32 getNextPage(FX_BYTE *pBuf, FX_INT32 width, FX_INT32 height, FX_INT32 stride, IFX_Pause* pPause);
+
+ FX_INT32 getFirstPage(CJBig2_Image **image, IFX_Pause* pPause);
+
+ FX_INT32 getNextPage(CJBig2_Image **image, IFX_Pause* pPause);
+ FX_INT32 Continue(IFX_Pause* pPause);
+ FXCODEC_STATUS GetProcessiveStatus()
+ {
+ return m_ProcessiveStatus;
+ };
+private:
+
+ CJBig2_Context(FX_BYTE *pGlobalData, FX_DWORD dwGlobalLength,
+ FX_BYTE *pData, FX_DWORD dwLength, FX_INT32 nStreamType, IFX_Pause* pPause);
+
+ ~CJBig2_Context();
+
+ FX_INT32 decodeFile(IFX_Pause* pPause);
+
+ FX_INT32 decode_SquentialOrgnazation(IFX_Pause* pPause);
+
+ FX_INT32 decode_EmbedOrgnazation(IFX_Pause* pPause);
+
+ FX_INT32 decode_RandomOrgnazation_FirstPage(IFX_Pause* pPause);
+
+ FX_INT32 decode_RandomOrgnazation(IFX_Pause* pPause);
+
+ CJBig2_Segment *findSegmentByNumber(FX_DWORD dwNumber);
+
+ CJBig2_Segment *findReferredSegmentByTypeAndIndex(CJBig2_Segment *pSegment, FX_BYTE cType, FX_INT32 nIndex);
+
+ FX_INT32 parseSegmentHeader(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+ FX_INT32 ProcessiveParseSegmentData(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseSymbolDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseTextRegion(CJBig2_Segment *pSegment);
+
+ FX_INT32 parsePatternDict(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseHalftoneRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseGenericRegion(CJBig2_Segment *pSegment, IFX_Pause* pPause);
+
+ FX_INT32 parseGenericRefinementRegion(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseTable(CJBig2_Segment *pSegment);
+
+ FX_INT32 parseRegionInfo(JBig2RegionInfo *pRI);
+
+
+
+ JBig2HuffmanCode *decodeSymbolIDHuffmanTable(CJBig2_BitStream *pStream, FX_DWORD SBNUMSYMS);
+
+ void huffman_assign_code(int* CODES, int* PREFLEN, int NTEMP);
+
+ void huffman_assign_code(JBig2HuffmanCode *SBSYMCODES, int NTEMP);
+
+private:
+
+ CJBig2_Context *m_pGlobalContext;
+
+ FX_INT32 m_nStreamType;
+
+ CJBig2_BitStream *m_pStream;
+
+ FX_INT32 m_nState;
+
+ CJBig2_List<CJBig2_Segment> *m_pSegmentList;
+
+ CJBig2_List<JBig2PageInfo> *m_pPageInfoList;
+
+ CJBig2_Image *m_pPage;
+
+ FX_BOOL m_bBufSpecified;
+
+ FX_INT32 m_nSegmentDecoded;
+ IFX_Pause* m_pPause;
+ FX_INT32 m_PauseStep;
+ FXCODEC_STATUS m_ProcessiveStatus;
+ FX_BOOL m_bFirstPage;
+ CJBig2_ArithDecoder *m_pArithDecoder;
+ CJBig2_GRDProc *m_pGRD;
+ JBig2ArithCtx *m_gbContext;
+ CJBig2_Segment *m_pSegment;
+ FX_DWORD m_dwOffset;
+ JBig2RegionInfo m_ri;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Define.h b/core/src/fxcodec/jbig2/JBig2_Define.h
new file mode 100644
index 0000000000..1019b6af5d
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Define.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_DEFINE_H_
+#define _JBIG2_DEFINE_H_
+#include "../../../include/fxcrt/fx_system.h"
+#define JBIG2_memset FXSYS_memset8
+#define JBIG2_memcmp FXSYS_memcmp32
+#define JBIG2_memcpy FXSYS_memcpy32
+#include "JBig2_Object.h"
+#define JBIG2_OOB 1
+typedef struct {
+ FX_INT32 width,
+ height;
+ FX_INT32 x,
+ y;
+ FX_BYTE flags;
+} JBig2RegionInfo;
+typedef struct {
+ FX_INT32 codelen;
+ FX_INT32 code;
+} JBig2HuffmanCode;
+extern "C" {
+ void _FaxG4Decode(void *pModule, FX_LPCBYTE src_buf, FX_DWORD src_size, int* pbitpos, FX_LPBYTE dest_buf, int width, int height, int pitch = 0);
+};
+#define JBIG2_MAX_REFERRED_SEGMENT_COUNT 64
+#define JBIG2_MAX_EXPORT_SYSMBOLS 65535
+#define JBIG2_MAX_NEW_SYSMBOLS 65535
+#define JBIG2_MAX_PATTERN_INDEX 65535
+#define JBIG2_MAX_IMAGE_SIZE 65535
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
new file mode 100644
index 0000000000..9aa714a228
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp
@@ -0,0 +1,4290 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_GeneralDecoder.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_ArithIntDecoder.h"
+#include "JBig2_HuffmanDecoder.h"
+#include "JBig2_HuffmanTable.h"
+#include "JBig2_PatternDict.h"
+CJBig2_Image *CJBig2_GRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ if (GBW == 0 || GBH == 0) {
+ CJBig2_Image* pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
+ return pImage;
+ }
+ if(GBTEMPLATE == 0) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
+ && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
+ && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
+ && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
+ return decode_Arith_Template0_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template0_unopt(pArithDecoder, gbContext);
+ }
+ } else if(GBTEMPLATE == 1) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template1_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template1_unopt(pArithDecoder, gbContext);
+ }
+ } else if(GBTEMPLATE == 2) {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template2_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template2_unopt(pArithDecoder, gbContext);
+ }
+ } else {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ return decode_Arith_Template3_opt3(pArithDecoder, gbContext);
+ } else {
+ return decode_Arith_Template3_unopt(pArithDecoder, gbContext);
+ }
+ }
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(3, h - 1);
+ line2 |= GBREG->getPixel(2, h - 1) << 1;
+ line2 |= GBREG->getPixel(1, h - 1) << 2;
+ line2 |= GBREG->getPixel(0, h - 1) << 3;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 11;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x1f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x7f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 6 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0xf800) | (line2 & 0x07f0);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 6);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ FX_DWORD height = GBH & 0x7fffffff;
+ for(FX_DWORD h = 0; h < height; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 6;
+ line2 = *pLine2++;
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 6);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> k) & 0x0800)
+ | ((line2 >> k) & 0x0010));
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 & 0x07f0);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> k) & 0x0010));
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | (((line2 >> (7 - k))) & 0x0010));
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(3, h - 1);
+ line2 |= GBREG->getPixel(2, h - 1) << 1;
+ line2 |= GBREG->getPixel(1, h - 1) << 2;
+ line2 |= GBREG->getPixel(0, h - 1) << 3;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 4, h - 1)) & 0x3f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 4 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 4);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 4;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 4);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> k) & 0x0200)
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 1) & 0x01f8;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= line2 << 2;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 1) ? pLine[-nStride2] << 1 : 0;
+ line2 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 1) {
+ line1 = (line1 << 8) | (pLine[-nStride2 + (w >> 3) + 1] << 1);
+ }
+ if(h > 0) {
+ line2 = (line2 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 1) {
+ line1 <<= 8;
+ }
+ if(h > 0) {
+ line2 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine, *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 1) {
+ pLine1 = pLine - nStride2;
+ pLine2 = pLine - nStride;
+ line1 = (*pLine1++) << 1;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 1);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> k) & 0x0080)
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = pLine - nStride;
+ line2 = (h & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 3) & 0x007c;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(h & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | (((line2 >> (10 - k))) & 0x0004);
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(1, h - 1);
+ line2 |= GBREG->getPixel(0, h - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(2, h - 1);
+ line1 |= GBREG->getPixel(1, h - 1) << 1;
+ line1 |= GBREG->getPixel(0, h - 1) << 2;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= line1 << 4;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x3f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1;
+ FX_BYTE *pLine, cVal;
+ FX_INTPTR nStride, nStride2;
+ FX_INT32 nBits, k;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nStride2 = nStride << 1;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = (h > 0) ? pLine[-nStride] : 0;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(FX_DWORD w = 0; w < GBW; w += 8) {
+ if(w + 8 < GBW) {
+ nBits = 8;
+ if(h > 0) {
+ line1 = (line1 << 8) | (pLine[-nStride + (w >> 3) + 1]);
+ }
+ } else {
+ nBits = GBW - w;
+ if(h > 0) {
+ line1 <<= 8;
+ }
+ }
+ cVal = 0;
+ for(k = 0; k < nBits; k++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1;
+ FX_BYTE *pLine, *pLine1, cVal;
+ FX_INT32 nStride, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ if (GBREG->m_pData == NULL) {
+ delete GBREG;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ pLine = GBREG->m_pData;
+ nStride = GBREG->m_nStride;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ if(h > 0) {
+ pLine1 = pLine - nStride;
+ line1 = *pLine1++;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | (*pLine1++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (k + 1)) & 0x0010);
+ }
+ pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ pLine[nLineBytes] = cVal;
+ } else {
+ CONTEXT = 0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ pLine[cc] = cVal;
+ }
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ pLine[nLineBytes] = cVal;
+ }
+ }
+ pLine += nStride;
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ line1 = GBREG->getPixel(1, h - 1);
+ line1 |= GBREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(h, h - 1);
+ } else {
+ switch(GBTEMPLATE) {
+ case 0: {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ case 1: {
+ line1 = GBREG->getPixel(2, h - 2);
+ line1 |= GBREG->getPixel(1, h - 2) << 1;
+ line1 |= GBREG->getPixel(0, h - 2) << 2;
+ line2 = GBREG->getPixel(2, h - 1);
+ line2 |= GBREG->getPixel(1, h - 1) << 1;
+ line2 |= GBREG->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ break;
+ case 2: {
+ line1 = GBREG->getPixel(1, h - 2);
+ line1 |= GBREG->getPixel(0, h - 2) << 1;
+ line2 = GBREG->getPixel(1, h - 1);
+ line2 |= GBREG->getPixel(0, h - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ break;
+ case 3: {
+ line1 = GBREG->getPixel(1, h - 1);
+ line1 |= GBREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, h - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT = 0;
+ CJBig2_Image *GBREG;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ GBREG->setPixel(w, h, GBREG->getPixel(w, h - 1));
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ GBREG->setPixel(w, h, 0);
+ } else {
+ CONTEXT = 0;
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 9;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], h + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], h + GBAT[5]) << 11;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 12;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 13;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 14;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], h + GBAT[7]) << 15;
+ break;
+ case 1:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w + 2, h - 2) << 9;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 10;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 11;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 12;
+ break;
+ case 2:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 2;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 3;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 2) << 7;
+ CONTEXT |= GBREG->getPixel(w, h - 2) << 8;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 2) << 9;
+ break;
+ case 3:
+ CONTEXT |= GBREG->getPixel(w - 1, h);
+ CONTEXT |= GBREG->getPixel(w - 2, h) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, h) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, h) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], h + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, h - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, h - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, h - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, h - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 3, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ GBREG->setPixel(w, h, bVal);
+ }
+ }
+ }
+ }
+ return GBREG;
+}
+CJBig2_Image *CJBig2_GRDProc::decode_MMR(CJBig2_BitStream *pStream)
+{
+ int bitpos, i;
+ CJBig2_Image *pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GBW, GBH));
+ if (pImage->m_pData == NULL) {
+ delete pImage;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ return NULL;
+ }
+ bitpos = (int)pStream->getBitPos();
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, pImage->m_pData, GBW, GBH, pImage->m_nStride);
+ pStream->setBitPos(bitpos);
+ for(i = 0; (FX_DWORD)i < pImage->m_nStride * GBH; i++) {
+ pImage->m_pData[i] = ~pImage->m_pData[i];
+ }
+ return pImage;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ if (GRW == 0 || GRH == 0) {
+ CJBig2_Image* pImage;
+ JBIG2_ALLOC(pImage, CJBig2_Image(GRW, GRH));
+ return pImage;
+ }
+ if(GRTEMPLATE == 0) {
+ if((GRAT[0] == (signed char) - 1) && (GRAT[1] == (signed char) - 1)
+ && (GRAT[2] == (signed char) - 1) && (GRAT[3] == (signed char) - 1)
+ && (GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
+ return decode_Template0_opt(pArithDecoder, grContext);
+ } else {
+ return decode_Template0_unopt(pArithDecoder, grContext);
+ }
+ } else {
+ if((GRREFERENCEDX == 0) && (GRW == (FX_DWORD)GRREFERENCE->m_nWidth)) {
+ return decode_Template1_opt(pArithDecoder, grContext);
+ } else {
+ return decode_Template1_unopt(pArithDecoder, grContext);
+ }
+ }
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line2, line3, line4, line5;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 3;
+ CONTEXT |= line3 << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= line2 << 9;
+ CONTEXT |= line1 << 10;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
+ }
+ } else {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY - 1);
+ line3 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1) << 1;
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 3;
+ CONTEXT |= line3 << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= line2 << 9;
+ CONTEXT |= line1 << 10;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x03;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY - 1)) & 0x03;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x07;
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line1_r, line2_r, line3_r;
+ FX_BYTE *pLine, *pLineR, cVal;
+ FX_INTPTR nStride, nStrideR, nOffset;
+ FX_INT32 k, nBits;
+ FX_INT32 GRWR, GRHR;
+ FX_INT32 GRW, GRH;
+ GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
+ GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ if (GRREG->m_pData == NULL) {
+ delete GRREG;
+ m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
+ return NULL;
+ }
+ pLine = GRREG->m_pData;
+ pLineR = GRREFERENCE->m_pData;
+ nStride = GRREG->m_nStride;
+ nStrideR = GRREFERENCE->m_nStride;
+ GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
+ GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
+ GRREFERENCEDY = 0;
+ }
+ nOffset = -GRREFERENCEDY * nStrideR;
+ for (FX_INT32 h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0010]);
+ LTP = LTP ^ SLTP;
+ }
+ line1 = (h > 0) ? pLine[-nStride] << 4 : 0;
+ FX_INT32 reference_h = h - GRREFERENCEDY;
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0;
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
+ if(LTP == 0) {
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
+ | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
+ if (h > GRHR + GRREFERENCEDY + 1) {
+ line1_r = 0;
+ line2_r = 0;
+ line3_r = 0;
+ } else {
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
+ ((line1 >> (7 - k)) & 0x0400) |
+ ((line1_r >> (7 - k)) & 0x0040) |
+ ((line2_r >> (10 - k)) & 0x0008) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ } else {
+ CONTEXT = (line1 & 0x1c00) | (line1_r & 0x01c0)
+ | ((line2_r >> 3) & 0x0038) | ((line3_r >> 6) & 0x0007);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 4 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = GRREFERENCE->getPixel(w + k, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0cdb) << 1) | (bVal << 9) |
+ ((line1 >> (7 - k)) & 0x0400) |
+ ((line1_r >> (7 - k)) & 0x0040) |
+ ((line2_r >> (10 - k)) & 0x0008) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ if (h < GRHR + GRREFERENCEDY) {
+ pLineR += nStrideR;
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line2, line3, line4, line5;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line1 |= GRREG->getPixel(-1, h - 1) << 2;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 2;
+ CONTEXT |= line3 << 5;
+ CONTEXT |= line2 << 6;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
+ }
+ } else {
+ line1 = GRREG->getPixel(1, h - 1);
+ line1 |= GRREG->getPixel(0, h - 1) << 1;
+ line1 |= GRREG->getPixel(-1, h - 1) << 2;
+ line2 = 0;
+ line3 = GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY - 1);
+ line4 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY);
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY) << 1;
+ line4 |= GRREFERENCE->getPixel(-GRREFERENCEDX - 1, h - GRREFERENCEDY) << 2;
+ line5 = GRREFERENCE->getPixel(-GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ line5 |= GRREFERENCE->getPixel(-GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1)))) {
+ CONTEXT = line5;
+ CONTEXT |= line4 << 2;
+ CONTEXT |= line3 << 5;
+ CONTEXT |= line2 << 6;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ GRREG->setPixel(w, h, bVal);
+ line1 = ((line1 << 1) | GRREG->getPixel(w + 2, h - 1)) & 0x07;
+ line2 = ((line2 << 1) | bVal) & 0x01;
+ line3 = ((line3 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1)) & 0x01;
+ line4 = ((line4 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY)) & 0x07;
+ line5 = ((line5 << 1) | GRREFERENCE->getPixel(w - GRREFERENCEDX + 2, h - GRREFERENCEDY + 1)) & 0x03;
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ FX_DWORD line1, line1_r, line2_r, line3_r;
+ FX_BYTE *pLine, *pLineR, cVal;
+ FX_INTPTR nStride, nStrideR, nOffset;
+ FX_INT32 k, nBits;
+ FX_INT32 GRWR, GRHR;
+ FX_INT32 GRW, GRH;
+ GRW = (FX_INT32)CJBig2_GRRDProc::GRW;
+ GRH = (FX_INT32)CJBig2_GRRDProc::GRH;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ if (GRREG->m_pData == NULL) {
+ delete GRREG;
+ m_pModule->JBig2_Error("Generic refinement region decoding procedure: Create Image Failed with width = %d, height = %d\n", GRW, GRH);
+ return NULL;
+ }
+ pLine = GRREG->m_pData;
+ pLineR = GRREFERENCE->m_pData;
+ nStride = GRREG->m_nStride;
+ nStrideR = GRREFERENCE->m_nStride;
+ GRWR = (FX_INT32)GRREFERENCE->m_nWidth;
+ GRHR = (FX_INT32)GRREFERENCE->m_nHeight;
+ if (GRREFERENCEDY < -GRHR + 1 || GRREFERENCEDY > GRHR - 1) {
+ GRREFERENCEDY = 0;
+ }
+ nOffset = -GRREFERENCEDY * nStrideR;
+ for (FX_INT32 h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ SLTP = pArithDecoder->DECODE(&grContext[0x0008]);
+ LTP = LTP ^ SLTP;
+ }
+ line1 = (h > 0) ? pLine[-nStride] << 1 : 0;
+ FX_INT32 reference_h = h - GRREFERENCEDY;
+ FX_BOOL line1_r_ok = (reference_h > 0 && reference_h < GRHR + 1);
+ FX_BOOL line2_r_ok = (reference_h > -1 && reference_h < GRHR);
+ FX_BOOL line3_r_ok = (reference_h > -2 && reference_h < GRHR - 1);
+ line1_r = line1_r_ok ? pLineR[nOffset - nStrideR] : 0;
+ line2_r = line2_r_ok ? pLineR[nOffset] : 0;
+ line3_r = line3_r_ok ? pLineR[nOffset + nStrideR] : 0;
+ if(LTP == 0) {
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
+ | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
+ ((line1 >> (7 - k)) & 0x0080) |
+ ((line1_r >> (9 - k)) & 0x0020) |
+ ((line2_r >> (11 - k)) & 0x0004) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ } else {
+ CONTEXT = (line1 & 0x0380) | ((line1_r >> 2) & 0x0020)
+ | ((line2_r >> 4) & 0x001c) | ((line3_r >> 6) & 0x0003);
+ for (FX_INT32 w = 0; w < GRW; w += 8) {
+ nBits = GRW - w > 8 ? 8 : GRW - w;
+ if (h > 0)
+ line1 = (line1 << 8) |
+ (w + 8 < GRW ? pLine[-nStride + (w >> 3) + 1] << 1 : 0);
+ if(line1_r_ok)
+ line1_r = (line1_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset - nStrideR + (w >> 3) + 1] : 0);
+ if(line2_r_ok)
+ line2_r = (line2_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + (w >> 3) + 1] : 0);
+ if(line3_r_ok)
+ line3_r = (line3_r << 8) |
+ (w + 8 < GRWR ? pLineR[nOffset + nStrideR + (w >> 3) + 1] : 0);
+ else {
+ line3_r = 0;
+ }
+ cVal = 0;
+ for (k = 0; k < nBits; k++) {
+ bVal = GRREFERENCE->getPixel(w + k, h);
+ if(!(TPGRON && (bVal == GRREFERENCE->getPixel(w + k - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + k - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + k + 1, h + 1)))) {
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ }
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x018d) << 1) | (bVal << 6) |
+ ((line1 >> (7 - k)) & 0x0080) |
+ ((line1_r >> (9 - k)) & 0x0020) |
+ ((line2_r >> (11 - k)) & 0x0004) |
+ ((line3_r >> (13 - k)) & 0x0001);
+ }
+ pLine[w >> 3] = cVal;
+ }
+ }
+ pLine += nStride;
+ if (h < GRHR + GRREFERENCEDY) {
+ pLineR += nStrideR;
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_GRRDProc::decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext)
+{
+ FX_BOOL LTP, SLTP, bVal;
+ FX_BOOL TPGRPIX, TPGRVAL;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GRREG;
+ LTP = 0;
+ JBIG2_ALLOC(GRREG, CJBig2_Image(GRW, GRH));
+ GRREG->fill(0);
+ for(FX_DWORD h = 0; h < GRH; h++) {
+ if(TPGRON) {
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT = 0x0010;
+ break;
+ case 1:
+ CONTEXT = 0x0008;
+ break;
+ }
+ SLTP = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 0) {
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ CONTEXT = 0;
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ break;
+ case 1:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GRW; w++) {
+ bVal = GRREFERENCE->getPixel(w, h);
+ if(TPGRON && (bVal == GRREFERENCE->getPixel(w - 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h - 1))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h))
+ && (bVal == GRREFERENCE->getPixel(w - 1, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w, h + 1))
+ && (bVal == GRREFERENCE->getPixel(w + 1, h + 1))) {
+ TPGRPIX = 1;
+ TPGRVAL = bVal;
+ } else {
+ TPGRPIX = 0;
+ }
+ if(TPGRPIX) {
+ GRREG->setPixel(w, h, TPGRVAL);
+ } else {
+ CONTEXT = 0;
+ switch(GRTEMPLATE) {
+ case 0:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY + 1) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 5;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY - 1) << 6;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 7;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + GRAT[2], h - GRREFERENCEDY + GRAT[3]) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 9;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 10;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 11;
+ CONTEXT |= GRREG->getPixel(w + GRAT[0], h + GRAT[1]) << 12;
+ break;
+ case 1:
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY + 1);
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY + 1) << 1;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX + 1, h - GRREFERENCEDY) << 2;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY) << 3;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX - 1, h - GRREFERENCEDY) << 4;
+ CONTEXT |= GRREFERENCE->getPixel(w - GRREFERENCEDX, h - GRREFERENCEDY - 1) << 5;
+ CONTEXT |= GRREG->getPixel(w - 1, h) << 6;
+ CONTEXT |= GRREG->getPixel(w + 1, h - 1) << 7;
+ CONTEXT |= GRREG->getPixel(w, h - 1) << 8;
+ CONTEXT |= GRREG->getPixel(w - 1, h - 1) << 9;
+ break;
+ }
+ bVal = pArithDecoder->DECODE(&grContext[CONTEXT]);
+ GRREG->setPixel(w, h, bVal);
+ }
+ }
+ }
+ }
+ return GRREG;
+}
+CJBig2_Image *CJBig2_TRDProc::decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext)
+{
+ FX_INT32 STRIPT, FIRSTS;
+ FX_DWORD NINSTANCES;
+ FX_INT32 DT, DFS, CURS;
+ FX_BYTE CURT;
+ FX_INT32 SI, TI;
+ FX_DWORD IDI;
+ CJBig2_Image *IBI;
+ FX_DWORD WI, HI;
+ FX_INT32 IDS;
+ FX_BOOL RI;
+ FX_INT32 RDWI, RDHI, RDXI, RDYI;
+ CJBig2_Image *IBOI;
+ FX_DWORD WOI, HOI;
+ CJBig2_Image *SBREG;
+ FX_BOOL bFirst;
+ FX_DWORD nTmp;
+ FX_INT32 nVal, nBits;
+ CJBig2_HuffmanDecoder *pHuffmanDecoder;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
+ SBREG->fill(SBDEFPIXEL);
+ if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &STRIPT) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ STRIPT *= SBSTRIPS;
+ STRIPT = -STRIPT;
+ FIRSTS = 0;
+ NINSTANCES = 0;
+ while(NINSTANCES < SBNUMINSTANCES) {
+ if(pHuffmanDecoder->decodeAValue(SBHUFFDT, &DT) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ DT *= SBSTRIPS;
+ STRIPT = STRIPT + DT;
+ bFirst = TRUE;
+ for(;;) {
+ if(bFirst) {
+ if(pHuffmanDecoder->decodeAValue(SBHUFFFS, &DFS) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ FIRSTS = FIRSTS + DFS;
+ CURS = FIRSTS;
+ bFirst = FALSE;
+ } else {
+ nVal = pHuffmanDecoder->decodeAValue(SBHUFFDS, &IDS);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ } else {
+ CURS = CURS + IDS + SBDSOFFSET;
+ }
+ }
+ if(SBSTRIPS == 1) {
+ CURT = 0;
+ } else {
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBSTRIPS) {
+ nTmp ++;
+ }
+ if(pStream->readNBits(nTmp, &nVal) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ CURT = nVal;
+ }
+ TI = STRIPT + CURT;
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTmp) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTmp;
+ nBits ++;
+ for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
+ if((nBits == SBSYMCODES[IDI].codelen) && (nVal == SBSYMCODES[IDI].code)) {
+ break;
+ }
+ }
+ if(IDI < SBNUMSYMS) {
+ break;
+ }
+ }
+ if(SBREFINE == 0) {
+ RI = 0;
+ } else {
+ if(pStream->read1Bit(&RI) != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ }
+ if(RI == 0) {
+ IBI = SBSYMS[IDI];
+ } else {
+ if((pHuffmanDecoder->decodeAValue(SBHUFFRDW, &RDWI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDH, &RDHI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDY, &RDYI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ pStream->alignByte();
+ nTmp = pStream->getOffset();
+ IBOI = SBSYMS[IDI];
+ if (!IBOI) {
+ goto failed;
+ }
+ WOI = IBOI->m_nWidth;
+ HOI = IBOI->m_nHeight;
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (huffman): Invalid RDWI or RDHI value.");
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = WOI + RDWI;
+ pGRRD->GRH = HOI + RDHI;
+ pGRRD->GRTEMPLATE = SBRTEMPLATE;
+ pGRRD->GRREFERENCE = IBOI;
+ pGRRD->GRREFERENCEDX = (RDWI >> 2) + RDXI;
+ pGRRD->GRREFERENCEDY = (RDHI >> 2) + RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SBRAT[0];
+ pGRRD->GRAT[1] = SBRAT[1];
+ pGRRD->GRAT[2] = SBRAT[2];
+ pGRRD->GRAT[3] = SBRAT[3];
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
+ IBI = pGRRD->decode(pArithDecoder, grContext);
+ if(IBI == NULL) {
+ delete pGRRD;
+ delete pArithDecoder;
+ goto failed;
+ }
+ delete pArithDecoder;
+ pStream->alignByte();
+ pStream->offset(2);
+ if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
+ delete IBI;
+ delete pGRRD;
+ m_pModule->JBig2_Error("text region decoding procedure (huffman):"
+ "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
+ goto failed;
+ }
+ delete pGRRD;
+ }
+ if (!IBI) {
+ continue;
+ }
+ WI = IBI->m_nWidth;
+ HI = IBI->m_nHeight;
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ SI = CURS;
+ if(TRANSPOSED == 0) {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ } else {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ }
+ if(RI != 0) {
+ delete IBI;
+ }
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ NINSTANCES = NINSTANCES + 1;
+ }
+ }
+ delete pHuffmanDecoder;
+ return SBREG;
+failed:
+ delete pHuffmanDecoder;
+ delete SBREG;
+ return NULL;
+}
+CJBig2_Image *CJBig2_TRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
+ JBig2IntDecoderState *pIDS)
+{
+ FX_INT32 STRIPT, FIRSTS;
+ FX_DWORD NINSTANCES;
+ FX_INT32 DT, DFS, CURS;
+ FX_INT32 CURT;
+ FX_INT32 SI, TI;
+ FX_DWORD IDI;
+ CJBig2_Image *IBI;
+ FX_DWORD WI, HI;
+ FX_INT32 IDS;
+ FX_BOOL RI;
+ FX_INT32 RDWI, RDHI, RDXI, RDYI;
+ CJBig2_Image *IBOI;
+ FX_DWORD WOI, HOI;
+ CJBig2_Image *SBREG;
+ FX_BOOL bFirst;
+ FX_INT32 nRet, nVal;
+ FX_INT32 bRetained;
+ CJBig2_ArithIntDecoder *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH, *IARDX, *IARDY;
+ CJBig2_ArithIaidDecoder *IAID;
+ CJBig2_GRRDProc *pGRRD;
+ if(pIDS) {
+ IADT = pIDS->IADT;
+ IAFS = pIDS->IAFS;
+ IADS = pIDS->IADS;
+ IAIT = pIDS->IAIT;
+ IARI = pIDS->IARI;
+ IARDW = pIDS->IARDW;
+ IARDH = pIDS->IARDH;
+ IARDX = pIDS->IARDX;
+ IARDY = pIDS->IARDY;
+ IAID = pIDS->IAID;
+ bRetained = TRUE;
+ } else {
+ JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAID , CJBig2_ArithIaidDecoder(SBSYMCODELEN));
+ bRetained = FALSE;
+ }
+ JBIG2_ALLOC(SBREG, CJBig2_Image(SBW, SBH));
+ SBREG->fill(SBDEFPIXEL);
+ if(IADT->decode(pArithDecoder, &STRIPT) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ STRIPT *= SBSTRIPS;
+ STRIPT = -STRIPT;
+ FIRSTS = 0;
+ NINSTANCES = 0;
+ while(NINSTANCES < SBNUMINSTANCES) {
+ if(IADT->decode(pArithDecoder, &DT) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ DT *= SBSTRIPS;
+ STRIPT = STRIPT + DT;
+ bFirst = TRUE;
+ for(;;) {
+ if(bFirst) {
+ if(IAFS->decode(pArithDecoder, &DFS) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ FIRSTS = FIRSTS + DFS;
+ CURS = FIRSTS;
+ bFirst = FALSE;
+ } else {
+ nRet = IADS->decode(pArithDecoder, &IDS);
+ if(nRet == JBIG2_OOB) {
+ break;
+ } else if(nRet != 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ } else {
+ CURS = CURS + IDS + SBDSOFFSET;
+ }
+ }
+ if (NINSTANCES >= SBNUMINSTANCES) {
+ break;
+ }
+ if(SBSTRIPS == 1) {
+ CURT = 0;
+ } else {
+ if(IAIT->decode(pArithDecoder, &nVal) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ CURT = nVal;
+ }
+ TI = STRIPT + CURT;
+ if(IAID->decode(pArithDecoder, &nVal) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ IDI = nVal;
+ if(IDI >= SBNUMSYMS) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): symbol id out of range.(%d/%d)",
+ IDI, SBNUMSYMS);
+ goto failed;
+ }
+ if(SBREFINE == 0) {
+ RI = 0;
+ } else {
+ if(IARI->decode(pArithDecoder, &RI) == -1) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ }
+ if (!SBSYMS[IDI]) {
+ goto failed;
+ }
+ if(RI == 0) {
+ IBI = SBSYMS[IDI];
+ } else {
+ if((IARDW->decode(pArithDecoder, &RDWI) == -1)
+ || (IARDH->decode(pArithDecoder, &RDHI) == -1)
+ || (IARDX->decode(pArithDecoder, &RDXI) == -1)
+ || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): too short.");
+ goto failed;
+ }
+ IBOI = SBSYMS[IDI];
+ WOI = IBOI->m_nWidth;
+ HOI = IBOI->m_nHeight;
+ if ((int)(WOI + RDWI) < 0 || (int)(HOI + RDHI) < 0) {
+ m_pModule->JBig2_Error("text region decoding procedure (arith): Invalid RDWI or RDHI value.");
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = WOI + RDWI;
+ pGRRD->GRH = HOI + RDHI;
+ pGRRD->GRTEMPLATE = SBRTEMPLATE;
+ pGRRD->GRREFERENCE = IBOI;
+ pGRRD->GRREFERENCEDX = (RDWI >> 1) + RDXI;
+ pGRRD->GRREFERENCEDY = (RDHI >> 1) + RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SBRAT[0];
+ pGRRD->GRAT[1] = SBRAT[1];
+ pGRRD->GRAT[2] = SBRAT[2];
+ pGRRD->GRAT[3] = SBRAT[3];
+ IBI = pGRRD->decode(pArithDecoder, grContext);
+ if(IBI == NULL) {
+ delete pGRRD;
+ goto failed;
+ }
+ delete pGRRD;
+ }
+ WI = IBI->m_nWidth;
+ HI = IBI->m_nHeight;
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPRIGHT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_BOTTOMLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ SI = CURS;
+ if(TRANSPOSED == 0) {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(SI, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(SI, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(SI - WI + 1, TI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ } else {
+ switch(REFCORNER) {
+ case JBIG2_CORNER_TOPLEFT:
+ SBREG->composeFrom(TI, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_TOPRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMLEFT:
+ SBREG->composeFrom(TI, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ case JBIG2_CORNER_BOTTOMRIGHT:
+ SBREG->composeFrom(TI - WI + 1, SI - HI + 1, IBI, SBCOMBOP);
+ break;
+ }
+ }
+ if(RI != 0) {
+ delete IBI;
+ }
+ if(TRANSPOSED == 0 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_BOTTOMLEFT))) {
+ CURS = CURS + WI - 1;
+ } else if(TRANSPOSED == 1 && ((REFCORNER == JBIG2_CORNER_TOPLEFT)
+ || (REFCORNER == JBIG2_CORNER_TOPRIGHT))) {
+ CURS = CURS + HI - 1;
+ }
+ NINSTANCES = NINSTANCES + 1;
+ }
+ }
+ if(bRetained == FALSE) {
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ delete IARDX;
+ delete IARDY;
+ delete IAID;
+ }
+ return SBREG;
+failed:
+ if(bRetained == FALSE) {
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ delete IARDX;
+ delete IARDY;
+ delete IAID;
+ }
+ delete SBREG;
+ return NULL;
+}
+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext)
+{
+ CJBig2_Image **SDNEWSYMS;
+ FX_DWORD HCHEIGHT, NSYMSDECODED;
+ FX_INT32 HCDH;
+ FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
+ FX_INT32 DW;
+ CJBig2_Image *BS;
+ FX_DWORD I, J, REFAGGNINST;
+ FX_BOOL *EXFLAGS;
+ FX_DWORD EXINDEX;
+ FX_BOOL CUREXFLAG;
+ FX_DWORD EXRUNLENGTH;
+ FX_INT32 nVal;
+ FX_DWORD nTmp;
+ FX_BOOL SBHUFF;
+ FX_DWORD SBNUMSYMS;
+ FX_BYTE SBSYMCODELEN;
+ FX_DWORD IDI;
+ FX_INT32 RDXI, RDYI;
+ CJBig2_Image **SBSYMS;
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
+ *SBHUFFRSIZE;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_GRDProc *pGRD;
+ CJBig2_ArithIntDecoder *IADH, *IADW, *IAAI, *IARDX, *IARDY, *IAEX,
+ *IADT, *IAFS, *IADS, *IAIT, *IARI, *IARDW, *IARDH;
+ CJBig2_ArithIaidDecoder *IAID;
+ CJBig2_SymbolDict *pDict;
+ JBIG2_ALLOC(IADH, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAAI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDY, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAEX, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAFS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IADS, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IAIT, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARI, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDW, CJBig2_ArithIntDecoder());
+ JBIG2_ALLOC(IARDH, CJBig2_ArithIntDecoder());
+ nTmp = 0;
+ while((FX_DWORD)(1 << nTmp) < (SDNUMINSYMS + SDNUMNEWSYMS)) {
+ nTmp ++;
+ }
+ JBIG2_ALLOC(IAID, CJBig2_ArithIaidDecoder((FX_BYTE)nTmp));
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
+ FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
+ HCHEIGHT = 0;
+ NSYMSDECODED = 0;
+ while(NSYMSDECODED < SDNUMNEWSYMS) {
+ BS = NULL;
+ if(IADH->decode(pArithDecoder, &HCDH) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ HCHEIGHT = HCHEIGHT + HCDH;
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid HCHEIGHT value.");
+ goto failed;
+ }
+ SYMWIDTH = 0;
+ TOTWIDTH = 0;
+ HCFIRSTSYM = NSYMSDECODED;
+ for(;;) {
+ nVal = IADW->decode(pArithDecoder, &DW);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ } else {
+ if (NSYMSDECODED >= SDNUMNEWSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): NSYMSDECODED >= SDNUMNEWSYMS.");
+ goto failed;
+ }
+ SYMWIDTH = SYMWIDTH + DW;
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): invalid SYMWIDTH value.");
+ goto failed;
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ SDNEWSYMS[NSYMSDECODED] = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ continue;
+ }
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ }
+ if(SDREFAGG == 0) {
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = 0;
+ pGRD->GBW = SYMWIDTH;
+ pGRD->GBH = HCHEIGHT;
+ pGRD->GBTEMPLATE = SDTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = 0;
+ pGRD->GBAT[0] = SDAT[0];
+ pGRD->GBAT[1] = SDAT[1];
+ pGRD->GBAT[2] = SDAT[2];
+ pGRD->GBAT[3] = SDAT[3];
+ pGRD->GBAT[4] = SDAT[4];
+ pGRD->GBAT[5] = SDAT[5];
+ pGRD->GBAT[6] = SDAT[6];
+ pGRD->GBAT[7] = SDAT[7];
+ BS = pGRD->decode_Arith(pArithDecoder, gbContext);
+ if(BS == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ } else {
+ if(IAAI->decode(pArithDecoder, (int*)&REFAGGNINST) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if(REFAGGNINST > 1) {
+ CJBig2_TRDProc *pDecoder;
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
+ pDecoder->SBHUFF = SDHUFF;
+ pDecoder->SBREFINE = 1;
+ pDecoder->SBW = SYMWIDTH;
+ pDecoder->SBH = HCHEIGHT;
+ pDecoder->SBNUMINSTANCES = REFAGGNINST;
+ pDecoder->SBSTRIPS = 1;
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ SBNUMSYMS = pDecoder->SBNUMSYMS;
+ nTmp = 0;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ SBSYMCODELEN = (FX_BYTE)nTmp;
+ pDecoder->SBSYMCODELEN = SBSYMCODELEN;
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ pDecoder->SBSYMS = SBSYMS;
+ pDecoder->SBDEFPIXEL = 0;
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
+ pDecoder->TRANSPOSED = 0;
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
+ pDecoder->SBDSOFFSET = 0;
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pDecoder->SBHUFFFS = SBHUFFFS;
+ pDecoder->SBHUFFDS = SBHUFFDS;
+ pDecoder->SBHUFFDT = SBHUFFDT;
+ pDecoder->SBHUFFRDW = SBHUFFRDW;
+ pDecoder->SBHUFFRDH = SBHUFFRDH;
+ pDecoder->SBHUFFRDX = SBHUFFRDX;
+ pDecoder->SBHUFFRDY = SBHUFFRDY;
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE;
+ pDecoder->SBRAT[0] = SDRAT[0];
+ pDecoder->SBRAT[1] = SDRAT[1];
+ pDecoder->SBRAT[2] = SDRAT[2];
+ pDecoder->SBRAT[3] = SDRAT[3];
+ JBig2IntDecoderState ids;
+ ids.IADT = IADT;
+ ids.IAFS = IAFS;
+ ids.IADS = IADS;
+ ids.IAIT = IAIT;
+ ids.IARI = IARI;
+ ids.IARDW = IARDW;
+ ids.IARDH = IARDH;
+ ids.IARDX = IARDX;
+ ids.IARDY = IARDY;
+ ids.IAID = IAID;
+ BS = pDecoder->decode_Arith(pArithDecoder, grContext, &ids);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ } else if(REFAGGNINST == 1) {
+ SBHUFF = SDHUFF;
+ SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ if(IAID->decode(pArithDecoder, (int*)&IDI) == -1) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if((IARDX->decode(pArithDecoder, &RDXI) == -1)
+ || (IARDY->decode(pArithDecoder, &RDYI) == -1)) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if (IDI >= SBNUMSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith):"
+ " refinement references unknown symbol %d", IDI);
+ goto failed;
+ }
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ if (!SBSYMS[IDI]) {
+ m_pModule->JBig2_Free(SBSYMS);
+ goto failed;
+ }
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = SYMWIDTH;
+ pGRRD->GRH = HCHEIGHT;
+ pGRRD->GRTEMPLATE = SDRTEMPLATE;
+ pGRRD->GRREFERENCE = SBSYMS[IDI];
+ pGRRD->GRREFERENCEDX = RDXI;
+ pGRRD->GRREFERENCEDY = RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SDRAT[0];
+ pGRRD->GRAT[1] = SDRAT[1];
+ pGRRD->GRAT[2] = SDRAT[2];
+ pGRRD->GRAT[3] = SDRAT[3];
+ BS = pGRRD->decode(pArithDecoder, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ }
+ }
+ SDNEWSYMS[NSYMSDECODED] = BS;
+ BS = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ }
+ }
+ EXINDEX = 0;
+ CUREXFLAG = 0;
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
+ while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
+ if(IAEX->decode(pArithDecoder, (int*)&EXRUNLENGTH) == -1) {
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): too short.");
+ goto failed;
+ }
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
+ goto failed;
+ }
+ if(EXRUNLENGTH != 0) {
+ for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
+ EXFLAGS[I] = CUREXFLAG;
+ }
+ }
+ EXINDEX = EXINDEX + EXRUNLENGTH;
+ CUREXFLAG = !CUREXFLAG;
+ }
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS;
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
+ I = J = 0;
+ for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
+ if(EXFLAGS[I] && J < SDNUMEXSYMS) {
+ if(I < SDNUMINSYMS) {
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
+ } else {
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ J = J + 1;
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
+ delete SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ }
+ if (J < SDNUMEXSYMS) {
+ pDict->SDNUMEXSYMS = J;
+ }
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ delete IADH;
+ delete IADW;
+ delete IAAI;
+ delete IARDX;
+ delete IARDY;
+ delete IAEX;
+ delete IAID;
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ return pDict;
+failed:
+ for(I = 0; I < NSYMSDECODED; I++) {
+ if (SDNEWSYMS[I]) {
+ delete SDNEWSYMS[I];
+ SDNEWSYMS[I] = NULL;
+ }
+ }
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ delete IADH;
+ delete IADW;
+ delete IAAI;
+ delete IARDX;
+ delete IARDY;
+ delete IAEX;
+ delete IAID;
+ delete IADT;
+ delete IAFS;
+ delete IADS;
+ delete IAIT;
+ delete IARI;
+ delete IARDW;
+ delete IARDH;
+ return NULL;
+}
+CJBig2_SymbolDict *CJBig2_SDDProc::decode_Huffman(CJBig2_BitStream *pStream,
+ JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause)
+{
+ CJBig2_Image **SDNEWSYMS;
+ FX_DWORD *SDNEWSYMWIDTHS;
+ FX_DWORD HCHEIGHT, NSYMSDECODED;
+ FX_INT32 HCDH;
+ FX_DWORD SYMWIDTH, TOTWIDTH, HCFIRSTSYM;
+ FX_INT32 DW;
+ CJBig2_Image *BS, *BHC;
+ FX_DWORD I, J, REFAGGNINST;
+ FX_BOOL *EXFLAGS;
+ FX_DWORD EXINDEX;
+ FX_BOOL CUREXFLAG;
+ FX_DWORD EXRUNLENGTH;
+ FX_INT32 nVal, nBits;
+ FX_DWORD nTmp;
+ FX_BOOL SBHUFF;
+ FX_DWORD SBNUMSYMS;
+ FX_BYTE SBSYMCODELEN;
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_DWORD IDI;
+ FX_INT32 RDXI, RDYI;
+ FX_DWORD BMSIZE;
+ FX_DWORD stride;
+ CJBig2_Image **SBSYMS;
+ CJBig2_HuffmanTable *SBHUFFFS, *SBHUFFDS, *SBHUFFDT, *SBHUFFRDW, *SBHUFFRDH, *SBHUFFRDX, *SBHUFFRDY,
+ *SBHUFFRSIZE, *pTable;
+ CJBig2_HuffmanDecoder *pHuffmanDecoder;
+ CJBig2_GRRDProc *pGRRD;
+ CJBig2_ArithDecoder *pArithDecoder;
+ CJBig2_GRDProc *pGRD;
+ CJBig2_SymbolDict *pDict;
+ JBIG2_ALLOC(pHuffmanDecoder, CJBig2_HuffmanDecoder(pStream));
+ SDNEWSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(CJBig2_Image*));
+ FXSYS_memset32(SDNEWSYMS, 0 , SDNUMNEWSYMS * sizeof(CJBig2_Image*));
+ SDNEWSYMWIDTHS = NULL;
+ BHC = NULL;
+ if(SDREFAGG == 0) {
+ SDNEWSYMWIDTHS = (FX_DWORD *)m_pModule->JBig2_Malloc2(SDNUMNEWSYMS, sizeof(FX_DWORD));
+ FXSYS_memset32(SDNEWSYMWIDTHS, 0 , SDNUMNEWSYMS * sizeof(FX_DWORD));
+ }
+ HCHEIGHT = 0;
+ NSYMSDECODED = 0;
+ BS = NULL;
+ while(NSYMSDECODED < SDNUMNEWSYMS) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFDH, &HCDH) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ HCHEIGHT = HCHEIGHT + HCDH;
+ if ((int)HCHEIGHT < 0 || (int)HCHEIGHT > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid HCHEIGHT value.");
+ goto failed;
+ }
+ SYMWIDTH = 0;
+ TOTWIDTH = 0;
+ HCFIRSTSYM = NSYMSDECODED;
+ for(;;) {
+ nVal = pHuffmanDecoder->decodeAValue(SDHUFFDW, &DW);
+ if(nVal == JBIG2_OOB) {
+ break;
+ } else if(nVal != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ } else {
+ if (NSYMSDECODED >= SDNUMNEWSYMS) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): NSYMSDECODED >= SDNUMNEWSYMS.");
+ goto failed;
+ }
+ SYMWIDTH = SYMWIDTH + DW;
+ if ((int)SYMWIDTH < 0 || (int)SYMWIDTH > JBIG2_MAX_IMAGE_SIZE) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): invalid SYMWIDTH value.");
+ goto failed;
+ } else if (HCHEIGHT == 0 || SYMWIDTH == 0) {
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ SDNEWSYMS[NSYMSDECODED] = NULL;
+ NSYMSDECODED = NSYMSDECODED + 1;
+ continue;
+ }
+ TOTWIDTH = TOTWIDTH + SYMWIDTH;
+ }
+ if(SDREFAGG == 1) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFAGGINST, (int*)&REFAGGNINST) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ BS = NULL;
+ if(REFAGGNINST > 1) {
+ CJBig2_TRDProc *pDecoder;
+ JBIG2_ALLOC(pDecoder, CJBig2_TRDProc());
+ pDecoder->SBHUFF = SDHUFF;
+ pDecoder->SBREFINE = 1;
+ pDecoder->SBW = SYMWIDTH;
+ pDecoder->SBH = HCHEIGHT;
+ pDecoder->SBNUMINSTANCES = REFAGGNINST;
+ pDecoder->SBSTRIPS = 1;
+ pDecoder->SBNUMSYMS = SDNUMINSYMS + NSYMSDECODED;
+ SBNUMSYMS = pDecoder->SBNUMSYMS;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ for(I = 0; I < SBNUMSYMS; I++) {
+ SBSYMCODES[I].codelen = nTmp;
+ SBSYMCODES[I].code = I;
+ }
+ pDecoder->SBSYMCODES = SBSYMCODES;
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ pDecoder->SBSYMS = SBSYMS;
+ pDecoder->SBDEFPIXEL = 0;
+ pDecoder->SBCOMBOP = JBIG2_COMPOSE_OR;
+ pDecoder->TRANSPOSED = 0;
+ pDecoder->REFCORNER = JBIG2_CORNER_TOPLEFT;
+ pDecoder->SBDSOFFSET = 0;
+ JBIG2_ALLOC(SBHUFFFS, CJBig2_HuffmanTable(HuffmanTable_B6,
+ sizeof(HuffmanTable_B6) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B6));
+ JBIG2_ALLOC(SBHUFFDS, CJBig2_HuffmanTable(HuffmanTable_B8,
+ sizeof(HuffmanTable_B8) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B8));
+ JBIG2_ALLOC(SBHUFFDT, CJBig2_HuffmanTable(HuffmanTable_B11,
+ sizeof(HuffmanTable_B11) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B11));
+ JBIG2_ALLOC(SBHUFFRDW, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDH, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRDY, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ pDecoder->SBHUFFFS = SBHUFFFS;
+ pDecoder->SBHUFFDS = SBHUFFDS;
+ pDecoder->SBHUFFDT = SBHUFFDT;
+ pDecoder->SBHUFFRDW = SBHUFFRDW;
+ pDecoder->SBHUFFRDH = SBHUFFRDH;
+ pDecoder->SBHUFFRDX = SBHUFFRDX;
+ pDecoder->SBHUFFRDY = SBHUFFRDY;
+ pDecoder->SBHUFFRSIZE = SBHUFFRSIZE;
+ pDecoder->SBRTEMPLATE = SDRTEMPLATE;
+ pDecoder->SBRAT[0] = SDRAT[0];
+ pDecoder->SBRAT[1] = SDRAT[1];
+ pDecoder->SBRAT[2] = SDRAT[2];
+ pDecoder->SBRAT[3] = SDRAT[3];
+ BS = pDecoder->decode_Huffman(pStream, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Free(SBSYMS);
+ delete SBHUFFFS;
+ delete SBHUFFDS;
+ delete SBHUFFDT;
+ delete SBHUFFRDW;
+ delete SBHUFFRDH;
+ delete SBHUFFRDX;
+ delete SBHUFFRDY;
+ delete SBHUFFRSIZE;
+ delete pDecoder;
+ } else if(REFAGGNINST == 1) {
+ SBHUFF = SDHUFF;
+ SBNUMSYMS = SDNUMINSYMS + SDNUMNEWSYMS;
+ nTmp = 1;
+ while((FX_DWORD)(1 << nTmp) < SBNUMSYMS) {
+ nTmp ++;
+ }
+ SBSYMCODELEN = (FX_BYTE)nTmp;
+ SBSYMCODES = (JBig2HuffmanCode*)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(JBig2HuffmanCode));
+ for(I = 0; I < SBNUMSYMS; I++) {
+ SBSYMCODES[I].codelen = SBSYMCODELEN;
+ SBSYMCODES[I].code = I;
+ }
+ nVal = 0;
+ nBits = 0;
+ for(;;) {
+ if(pStream->read1Bit(&nTmp) != 0) {
+ m_pModule->JBig2_Free(SBSYMCODES);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ nVal = (nVal << 1) | nTmp;
+ for(IDI = 0; IDI < SBNUMSYMS; IDI++) {
+ if((nVal == SBSYMCODES[IDI].code)
+ && (nBits == SBSYMCODES[IDI].codelen)) {
+ break;
+ }
+ }
+ if(IDI < SBNUMSYMS) {
+ break;
+ }
+ }
+ m_pModule->JBig2_Free(SBSYMCODES);
+ JBIG2_ALLOC(SBHUFFRDX, CJBig2_HuffmanTable(HuffmanTable_B15,
+ sizeof(HuffmanTable_B15) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B15));
+ JBIG2_ALLOC(SBHUFFRSIZE, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ if((pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDXI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRDX, &RDYI) != 0)
+ || (pHuffmanDecoder->decodeAValue(SBHUFFRSIZE, &nVal) != 0)) {
+ delete SBHUFFRDX;
+ delete SBHUFFRSIZE;
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ delete SBHUFFRDX;
+ delete SBHUFFRSIZE;
+ pStream->alignByte();
+ nTmp = pStream->getOffset();
+ SBSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(SBNUMSYMS, sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS, SDINSYMS, SDNUMINSYMS * sizeof(CJBig2_Image*));
+ JBIG2_memcpy(SBSYMS + SDNUMINSYMS, SDNEWSYMS, NSYMSDECODED * sizeof(CJBig2_Image*));
+ JBIG2_ALLOC(pGRRD, CJBig2_GRRDProc());
+ pGRRD->GRW = SYMWIDTH;
+ pGRRD->GRH = HCHEIGHT;
+ pGRRD->GRTEMPLATE = SDRTEMPLATE;
+ pGRRD->GRREFERENCE = SBSYMS[IDI];
+ pGRRD->GRREFERENCEDX = RDXI;
+ pGRRD->GRREFERENCEDY = RDYI;
+ pGRRD->TPGRON = 0;
+ pGRRD->GRAT[0] = SDRAT[0];
+ pGRRD->GRAT[1] = SDRAT[1];
+ pGRRD->GRAT[2] = SDRAT[2];
+ pGRRD->GRAT[3] = SDRAT[3];
+ JBIG2_ALLOC(pArithDecoder, CJBig2_ArithDecoder(pStream));
+ BS = pGRRD->decode(pArithDecoder, grContext);
+ if(BS == NULL) {
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ goto failed;
+ }
+ pStream->alignByte();
+ pStream->offset(2);
+ if((FX_DWORD)nVal != (pStream->getOffset() - nTmp)) {
+ delete BS;
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman):"
+ "bytes processed by generic refinement region decoding procedure doesn't equal SBHUFFRSIZE.");
+ goto failed;
+ }
+ m_pModule->JBig2_Free(SBSYMS);
+ delete pGRRD;
+ delete pArithDecoder;
+ }
+ SDNEWSYMS[NSYMSDECODED] = BS;
+ }
+ if(SDREFAGG == 0) {
+ SDNEWSYMWIDTHS[NSYMSDECODED] = SYMWIDTH;
+ }
+ NSYMSDECODED = NSYMSDECODED + 1;
+ }
+ if(SDREFAGG == 0) {
+ if(pHuffmanDecoder->decodeAValue(SDHUFFBMSIZE, (FX_INT32*)&BMSIZE) != 0) {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ pStream->alignByte();
+ if(BMSIZE == 0) {
+ stride = (TOTWIDTH + 7) >> 3;
+ if(pStream->getByteLeft() >= stride * HCHEIGHT) {
+ JBIG2_ALLOC(BHC, CJBig2_Image(TOTWIDTH, HCHEIGHT));
+ for(I = 0; I < HCHEIGHT; I ++) {
+ JBIG2_memcpy(BHC->m_pData + I * BHC->m_nStride, pStream->getPointer(), stride);
+ pStream->offset(stride);
+ }
+ } else {
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ } else {
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = 1;
+ pGRD->GBW = TOTWIDTH;
+ pGRD->GBH = HCHEIGHT;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHC, pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ delete pGRD;
+ pStream->alignByte();
+ }
+ nTmp = 0;
+ if (!BHC) {
+ continue;
+ }
+ for(I = HCFIRSTSYM; I < NSYMSDECODED; I++) {
+ SDNEWSYMS[I] = BHC->subImage(nTmp, 0, SDNEWSYMWIDTHS[I], HCHEIGHT);
+ nTmp += SDNEWSYMWIDTHS[I];
+ }
+ delete BHC;
+ BHC = NULL;
+ }
+ }
+ EXINDEX = 0;
+ CUREXFLAG = 0;
+ JBIG2_ALLOC(pTable, CJBig2_HuffmanTable(HuffmanTable_B1,
+ sizeof(HuffmanTable_B1) / sizeof(JBig2TableLine), HuffmanTable_HTOOB_B1));
+ EXFLAGS = (FX_BOOL*)m_pModule->JBig2_Malloc2(sizeof(FX_BOOL), (SDNUMINSYMS + SDNUMNEWSYMS));
+ while(EXINDEX < SDNUMINSYMS + SDNUMNEWSYMS) {
+ if(pHuffmanDecoder->decodeAValue(pTable, (int*)&EXRUNLENGTH) != 0) {
+ delete pTable;
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (huffman): too short.");
+ goto failed;
+ }
+ if (EXINDEX + EXRUNLENGTH > SDNUMINSYMS + SDNUMNEWSYMS) {
+ delete pTable;
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Error("symbol dictionary decoding procedure (arith): Invalid EXRUNLENGTH value.");
+ goto failed;
+ }
+ if(EXRUNLENGTH != 0) {
+ for(I = EXINDEX; I < EXINDEX + EXRUNLENGTH; I++) {
+ EXFLAGS[I] = CUREXFLAG;
+ }
+ }
+ EXINDEX = EXINDEX + EXRUNLENGTH;
+ CUREXFLAG = !CUREXFLAG;
+ }
+ delete pTable;
+ JBIG2_ALLOC(pDict, CJBig2_SymbolDict());
+ pDict->SDNUMEXSYMS = SDNUMEXSYMS;
+ pDict->SDEXSYMS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), SDNUMEXSYMS);
+ I = J = 0;
+ for(I = 0; I < SDNUMINSYMS + SDNUMNEWSYMS; I++) {
+ if(EXFLAGS[I] && J < SDNUMEXSYMS) {
+ if(I < SDNUMINSYMS) {
+ JBIG2_ALLOC(pDict->SDEXSYMS[J], CJBig2_Image(*SDINSYMS[I]));
+ } else {
+ pDict->SDEXSYMS[J] = SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ J = J + 1;
+ } else if (!EXFLAGS[I] && I >= SDNUMINSYMS) {
+ delete SDNEWSYMS[I - SDNUMINSYMS];
+ }
+ }
+ if (J < SDNUMEXSYMS) {
+ pDict->SDNUMEXSYMS = J;
+ }
+ m_pModule->JBig2_Free(EXFLAGS);
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ if(SDREFAGG == 0) {
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
+ }
+ delete pHuffmanDecoder;
+ return pDict;
+failed:
+ for(I = 0; I < NSYMSDECODED; I++) {
+ if (SDNEWSYMS[I]) {
+ delete SDNEWSYMS[I];
+ }
+ }
+ m_pModule->JBig2_Free(SDNEWSYMS);
+ if(SDREFAGG == 0) {
+ m_pModule->JBig2_Free(SDNEWSYMWIDTHS);
+ }
+ delete pHuffmanDecoder;
+ return NULL;
+}
+CJBig2_Image *CJBig2_HTRDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_DWORD ng, mg;
+ FX_INT32 x, y;
+ CJBig2_Image *HSKIP;
+ FX_DWORD HBPP;
+ FX_DWORD *GI;
+ CJBig2_Image *HTREG;
+ CJBig2_GSIDProc *pGID;
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
+ HTREG->fill(HDEFPIXEL);
+ HSKIP = NULL;
+ if(HENABLESKIP == 1) {
+ JBIG2_ALLOC(HSKIP, CJBig2_Image(HGW, HGH));
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ if((x + HPW <= 0) | (x >= (FX_INT32)HBW)
+ | (y + HPH <= 0) | (y >= (FX_INT32)HPH)) {
+ HSKIP->setPixel(ng, mg, 1);
+ } else {
+ HSKIP->setPixel(ng, mg, 0);
+ }
+ }
+ }
+ }
+ HBPP = 1;
+ while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
+ HBPP ++;
+ }
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
+ pGID->GSMMR = HMMR;
+ pGID->GSW = HGW;
+ pGID->GSH = HGH;
+ pGID->GSBPP = (FX_BYTE)HBPP;
+ pGID->GSUSESKIP = HENABLESKIP;
+ pGID->GSKIP = HSKIP;
+ pGID->GSTEMPLATE = HTEMPLATE;
+ GI = pGID->decode_Arith(pArithDecoder, gbContext, pPause);
+ if(GI == NULL) {
+ goto failed;
+ }
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ FX_DWORD pat_index = GI[mg * HGW + ng];
+ if (pat_index >= HNUMPATS) {
+ pat_index = HNUMPATS - 1;
+ }
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
+ }
+ }
+ m_pModule->JBig2_Free(GI);
+ if(HSKIP) {
+ delete HSKIP;
+ }
+ delete pGID;
+ return HTREG;
+failed:
+ if(HSKIP) {
+ delete HSKIP;
+ }
+ delete pGID;
+ delete HTREG;
+ return NULL;
+}
+CJBig2_Image *CJBig2_HTRDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ FX_DWORD ng, mg;
+ FX_INT32 x, y;
+ FX_DWORD HBPP;
+ FX_DWORD *GI;
+ CJBig2_Image *HTREG;
+ CJBig2_GSIDProc *pGID;
+ JBIG2_ALLOC(HTREG, CJBig2_Image(HBW, HBH));
+ HTREG->fill(HDEFPIXEL);
+ HBPP = 1;
+ while((FX_DWORD)(1 << HBPP) < HNUMPATS) {
+ HBPP ++;
+ }
+ JBIG2_ALLOC(pGID, CJBig2_GSIDProc());
+ pGID->GSMMR = HMMR;
+ pGID->GSW = HGW;
+ pGID->GSH = HGH;
+ pGID->GSBPP = (FX_BYTE)HBPP;
+ pGID->GSUSESKIP = 0;
+ GI = pGID->decode_MMR(pStream, pPause);
+ if(GI == NULL) {
+ goto failed;
+ }
+ for(mg = 0; mg < HGH; mg++) {
+ for(ng = 0; ng < HGW; ng++) {
+ x = (HGX + mg * HRY + ng * HRX) >> 8;
+ y = (HGY + mg * HRX - ng * HRY) >> 8;
+ FX_DWORD pat_index = GI[mg * HGW + ng];
+ if (pat_index >= HNUMPATS) {
+ pat_index = HNUMPATS - 1;
+ }
+ HTREG->composeFrom(x, y, HPATS[pat_index], HCOMBOP);
+ }
+ }
+ m_pModule->JBig2_Free(GI);
+ delete pGID;
+ return HTREG;
+failed:
+ delete pGID;
+ delete HTREG;
+ return NULL;
+}
+CJBig2_PatternDict *CJBig2_PDDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_DWORD GRAY;
+ CJBig2_Image *BHDC = NULL;
+ CJBig2_PatternDict *pDict;
+ CJBig2_GRDProc *pGRD;
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict());
+ pDict->NUMPATS = GRAYMAX + 1;
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = HDMMR;
+ pGRD->GBW = (GRAYMAX + 1) * HDPW;
+ pGRD->GBH = HDPH;
+ pGRD->GBTEMPLATE = HDTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = 0;
+ pGRD->GBAT[0] = -(FX_INT32)HDPW;
+ pGRD->GBAT[1] = 0;
+ if(pGRD->GBTEMPLATE == 0) {
+ pGRD->GBAT[2] = -3;
+ pGRD->GBAT[3] = -1;
+ pGRD->GBAT[4] = 2;
+ pGRD->GBAT[5] = -2;
+ pGRD->GBAT[6] = -2;
+ pGRD->GBAT[7] = -2;
+ }
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&BHDC, pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(BHDC == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ GRAY = 0;
+ while(GRAY <= GRAYMAX) {
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
+ GRAY = GRAY + 1;
+ }
+ delete BHDC;
+ return pDict;
+failed:
+ delete pDict;
+ return NULL;
+}
+
+CJBig2_PatternDict *CJBig2_PDDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ FX_DWORD GRAY;
+ CJBig2_Image *BHDC = NULL;
+ CJBig2_PatternDict *pDict;
+ CJBig2_GRDProc *pGRD;
+ JBIG2_ALLOC(pDict, CJBig2_PatternDict());
+ pDict->NUMPATS = GRAYMAX + 1;
+ pDict->HDPATS = (CJBig2_Image**)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), pDict->NUMPATS);
+ JBIG2_memset(pDict->HDPATS, 0, sizeof(CJBig2_Image*)*pDict->NUMPATS);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = HDMMR;
+ pGRD->GBW = (GRAYMAX + 1) * HDPW;
+ pGRD->GBH = HDPH;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&BHDC, pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(BHDC == NULL) {
+ delete pGRD;
+ goto failed;
+ }
+ delete pGRD;
+ GRAY = 0;
+ while(GRAY <= GRAYMAX) {
+ pDict->HDPATS[GRAY] = BHDC->subImage(HDPW * GRAY, 0, HDPW, HDPH);
+ GRAY = GRAY + 1;
+ }
+ delete BHDC;
+ return pDict;
+failed:
+ delete pDict;
+ return NULL;
+}
+FX_DWORD *CJBig2_GSIDProc::decode_Arith(CJBig2_ArithDecoder *pArithDecoder,
+ JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ CJBig2_Image **GSPLANES;
+ FX_INT32 J, K;
+ FX_DWORD x, y;
+ FX_DWORD *GSVALS;
+ CJBig2_GRDProc *pGRD;
+ GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
+ if (!GSPLANES) {
+ return NULL;
+ }
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
+ if (!GSVALS) {
+ m_pModule->JBig2_Free(GSPLANES);
+ return NULL;
+ }
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = GSMMR;
+ pGRD->GBW = GSW;
+ pGRD->GBH = GSH;
+ pGRD->GBTEMPLATE = GSTEMPLATE;
+ pGRD->TPGDON = 0;
+ pGRD->USESKIP = GSUSESKIP;
+ pGRD->SKIP = GSKIP;
+ if(GSTEMPLATE <= 1) {
+ pGRD->GBAT[0] = 3;
+ } else {
+ pGRD->GBAT[0] = 2;
+ }
+ pGRD->GBAT[1] = -1;
+ if(pGRD->GBTEMPLATE == 0) {
+ pGRD->GBAT[2] = -3;
+ pGRD->GBAT[3] = -1;
+ pGRD->GBAT[4] = 2;
+ pGRD->GBAT[5] = -2;
+ pGRD->GBAT[6] = -2;
+ pGRD->GBAT[7] = -2;
+ }
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[GSBPP - 1], pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[GSBPP - 1] == NULL) {
+ goto failed;
+ }
+ J = GSBPP - 2;
+ while(J >= 0) {
+ FXCODEC_STATUS status = pGRD->Start_decode_Arith(&GSPLANES[J], pArithDecoder, gbContext);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[J] == NULL) {
+ for(K = GSBPP - 1; K > J; K--) {
+ delete GSPLANES[K];
+ goto failed;
+ }
+ }
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+ J = J - 1;
+ }
+ for(y = 0; y < GSH; y++) {
+ for(x = 0; x < GSW; x++) {
+ for(J = 0; J < GSBPP; J++) {
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+ }
+ }
+ }
+ for(J = 0; J < GSBPP; J++) {
+ delete GSPLANES[J];
+ }
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ return GSVALS;
+failed:
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ m_pModule->JBig2_Free(GSVALS);
+ return NULL;
+}
+FX_DWORD *CJBig2_GSIDProc::decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ CJBig2_Image **GSPLANES;
+ FX_INT32 J, K;
+ FX_DWORD x, y;
+ FX_DWORD *GSVALS;
+ CJBig2_GRDProc *pGRD;
+ GSPLANES = (CJBig2_Image **)m_pModule->JBig2_Malloc2(sizeof(CJBig2_Image*), GSBPP);
+ if (!GSPLANES) {
+ return NULL;
+ }
+ GSVALS = (FX_DWORD*)m_pModule->JBig2_Malloc3(sizeof(FX_DWORD), GSW, GSH);
+ if (!GSVALS) {
+ if (GSPLANES) {
+ m_pModule->JBig2_Free(GSPLANES);
+ }
+ return NULL;
+ }
+ JBIG2_memset(GSPLANES, 0, sizeof(CJBig2_Image*)*GSBPP);
+ JBIG2_memset(GSVALS, 0, sizeof(FX_DWORD)*GSW * GSH);
+ JBIG2_ALLOC(pGRD, CJBig2_GRDProc());
+ pGRD->MMR = GSMMR;
+ pGRD->GBW = GSW;
+ pGRD->GBH = GSH;
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[GSBPP - 1], pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[GSBPP - 1] == NULL) {
+ goto failed;
+ }
+ pStream->alignByte();
+ pStream->offset(3);
+ J = GSBPP - 2;
+ while(J >= 0) {
+ FXCODEC_STATUS status = pGRD->Start_decode_MMR(&GSPLANES[J], pStream);
+ while(status == FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ pGRD->Continue_decode(pPause);
+ }
+ if(GSPLANES[J] == NULL) {
+ for(K = GSBPP - 1; K > J; K--) {
+ delete GSPLANES[K];
+ goto failed;
+ }
+ }
+ pStream->alignByte();
+ pStream->offset(3);
+ GSPLANES[J]->composeFrom(0, 0, GSPLANES[J + 1], JBIG2_COMPOSE_XOR);
+ J = J - 1;
+ }
+ for(y = 0; y < GSH; y++) {
+ for(x = 0; x < GSW; x++) {
+ for(J = 0; J < GSBPP; J++) {
+ GSVALS[y * GSW + x] |= GSPLANES[J]->getPixel(x, y) << J;
+ }
+ }
+ }
+ for(J = 0; J < GSBPP; J++) {
+ delete GSPLANES[J];
+ }
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ return GSVALS;
+failed:
+ m_pModule->JBig2_Free(GSPLANES);
+ delete pGRD;
+ m_pModule->JBig2_Free(GSVALS);
+ return NULL;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if (GBW == 0 || GBH == 0) {
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_pPause = pPause;
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_DecodeType = 1;
+ m_pImage = pImage;
+ (*m_pImage)->fill(0);
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ LTP = 0;
+ m_pLine = NULL;
+ m_loopIndex = 0;
+ return decode_Arith(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith(IFX_Pause* pPause)
+{
+ int iline = m_loopIndex;
+ CJBig2_Image* pImage = *m_pImage;
+ if(GBTEMPLATE == 0) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)
+ && (GBAT[2] == (signed char) - 3) && (GBAT[3] == (signed char) - 1)
+ && (GBAT[4] == 2) && (GBAT[5] == (signed char) - 2)
+ && (GBAT[6] == (signed char) - 2) && (GBAT[7] == (signed char) - 2)) {
+ m_ProssiveStatus = decode_Arith_Template0_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template0_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else if(GBTEMPLATE == 1) {
+ if((GBAT[0] == 3) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template1_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template1_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else if(GBTEMPLATE == 2) {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template2_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template2_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ } else {
+ if((GBAT[0] == 2) && (GBAT[1] == (signed char) - 1)) {
+ m_ProssiveStatus = decode_Arith_Template3_opt3(pImage, m_pArithDecoder, m_gbContext, pPause);
+ } else {
+ m_ProssiveStatus = decode_Arith_Template3_unopt(pImage, m_pArithDecoder, m_gbContext, pPause);
+ }
+ }
+ m_ReplaceRect.left = 0;
+ m_ReplaceRect.right = pImage->m_nWidth;
+ m_ReplaceRect.top = iline;
+ m_ReplaceRect.bottom = m_loopIndex;
+ if(m_ProssiveStatus == FXCODEC_STATUS_DECODE_FINISH) {
+ m_loopIndex = 0;
+ }
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if(GBW == 0 || GBH == 0) {
+ * pImage = NULL;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_DecodeType = 2;
+ m_pPause = pPause;
+ m_pImage = pImage;
+ (*m_pImage)->fill(0);
+ LTP = 0;
+ m_loopIndex = 0;
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ return decode_Arith_V2(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V2(IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ CJBig2_Image *GBREG = *m_pImage;
+ FX_DWORD line1, line2, line3;
+ LTP = 0;
+ JBIG2_ALLOC(GBREG, CJBig2_Image(GBW, GBH));
+ GBREG->fill(0);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ GBREG->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ switch(GBTEMPLATE) {
+ case 0: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = GBREG->getPixel(2, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ case 1: {
+ line1 = GBREG->getPixel(2, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(1, m_loopIndex - 2) << 1;
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 2;
+ line2 = GBREG->getPixel(2, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 2)) & 0x0f;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ break;
+ case 2: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 2);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = GBREG->getPixel(1, m_loopIndex - 1);
+ line2 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ break;
+ case 3: {
+ line1 = GBREG->getPixel(1, m_loopIndex - 1);
+ line1 |= GBREG->getPixel(0, m_loopIndex - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | GBREG->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ break;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex ++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ if(GBW == 0 || GBH == 0) {
+ * pImage = NULL;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+ }
+ if(*pImage == NULL) {
+ JBIG2_ALLOC((*pImage), CJBig2_Image(GBW, GBH));
+ }
+ if ((*pImage)->m_pData == NULL) {
+ delete *pImage;
+ *pImage = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return FXCODEC_STATUS_ERROR;
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_READY;
+ m_pPause = pPause;
+ m_pImage = pImage;
+ m_DecodeType = 3;
+ (*m_pImage)->fill(0);
+ LTP = 0;
+ m_loopIndex = 0;
+ m_pArithDecoder = pArithDecoder;
+ m_gbContext = gbContext;
+ return decode_Arith_V1(pPause);
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_V1(IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT = 0;
+ CJBig2_Image *GBREG = (*m_pImage);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT = 0x9b25;
+ break;
+ case 1:
+ CONTEXT = 0x0795;
+ break;
+ case 2:
+ CONTEXT = 0x00e5;
+ break;
+ case 3:
+ CONTEXT = 0x0195;
+ break;
+ }
+ SLTP = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ GBREG->setPixel(w, m_loopIndex, GBREG->getPixel(w, m_loopIndex - 1));
+ }
+ } else {
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ GBREG->setPixel(w, m_loopIndex, 0);
+ } else {
+ CONTEXT = 0;
+ switch(GBTEMPLATE) {
+ case 0:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 9;
+ CONTEXT |= GBREG->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= GBREG->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 12;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 13;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 14;
+ CONTEXT |= GBREG->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ break;
+ case 1:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 3;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w + 2, m_loopIndex - 2) << 9;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 10;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 11;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 12;
+ break;
+ case 2:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 3;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 4;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 2) << 7;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 2) << 8;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 2) << 9;
+ break;
+ case 3:
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex);
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex) << 1;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex) << 2;
+ CONTEXT |= GBREG->getPixel(w - 4, m_loopIndex) << 3;
+ CONTEXT |= GBREG->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= GBREG->getPixel(w + 1, m_loopIndex - 1) << 5;
+ CONTEXT |= GBREG->getPixel(w, m_loopIndex - 1) << 6;
+ CONTEXT |= GBREG->getPixel(w - 1, m_loopIndex - 1) << 7;
+ CONTEXT |= GBREG->getPixel(w - 2, m_loopIndex - 1) << 8;
+ CONTEXT |= GBREG->getPixel(w - 3, m_loopIndex - 1) << 9;
+ break;
+ }
+ bVal = m_pArithDecoder->DECODE(&m_gbContext[CONTEXT]);
+ GBREG->setPixel(w, m_loopIndex, bVal);
+ }
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex ++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause)
+{
+ int bitpos, i;
+ JBIG2_ALLOC((* pImage), CJBig2_Image(GBW, GBH));
+ if ((* pImage)->m_pData == NULL) {
+ delete (* pImage);
+ (* pImage) = NULL;
+ m_pModule->JBig2_Error("Generic region decoding procedure: Create Image Failed with width = %d, height = %d\n", GBW, GBH);
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return m_ProssiveStatus;
+ }
+ bitpos = (int)pStream->getBitPos();
+ _FaxG4Decode(m_pModule, pStream->getBuf(), pStream->getLength(), &bitpos, (* pImage)->m_pData, GBW, GBH, (* pImage)->m_nStride);
+ pStream->setBitPos(bitpos);
+ for(i = 0; (FX_DWORD)i < (* pImage)->m_nStride * GBH; i++) {
+ (* pImage)->m_pData[i] = ~(* pImage)->m_pData[i];
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_MMR()
+{
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::Continue_decode(IFX_Pause* pPause)
+{
+ if(m_ProssiveStatus != FXCODEC_STATUS_DECODE_TOBECONTINUE) {
+ return m_ProssiveStatus;
+ }
+ switch (m_DecodeType) {
+ case 1:
+ return decode_Arith(pPause);
+ case 2:
+ return decode_Arith_V2(pPause);
+ case 3:
+ return decode_Arith_V1(pPause);
+ case 4:
+ return decode_MMR();
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_ERROR;
+ return m_ProssiveStatus;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if(m_pLine == NULL) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ FX_DWORD height = GBH & 0x7fffffff;
+ for(; m_loopIndex < height; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 6;
+ line2 = *pLine2++;
+ CONTEXT = ((line1 & 0xf800) | (line2 & 0x07f0));
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 6);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> k) & 0x0800)
+ | ((line2 >> k) & 0x0010));
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0800)
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 & 0x07f0);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> k) & 0x0010));
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = (((CONTEXT & 0x7bf7) << 1) | bVal
+ | ((line2 >> (7 - k)) & 0x0010));
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template0_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x9b25]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 2);
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = pImage->getPixel(2, m_loopIndex - 1);
+ line2 |= pImage->getPixel(1, m_loopIndex - 1) << 1;
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line2 << 5;
+ CONTEXT |= pImage->getPixel(w + GBAT[2], m_loopIndex + GBAT[3]) << 10;
+ CONTEXT |= pImage->getPixel(w + GBAT[4], m_loopIndex + GBAT[5]) << 11;
+ CONTEXT |= line1 << 12;
+ CONTEXT |= pImage->getPixel(w + GBAT[6], m_loopIndex + GBAT[7]) << 15;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 3, m_loopIndex - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x0f;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if (!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 4;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x1e00) | ((line2 >> 1) & 0x01f8);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 4);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> k) & 0x0200)
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0200)
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 1) & 0x01f8;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (k + 1)) & 0x0008);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x0efb) << 1) | bVal
+ | ((line2 >> (8 - k)) & 0x0008);
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(FX_DWORD h = 0; h < GBH; h++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0795]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(h, h - 1);
+ } else {
+ line1 = pImage->getPixel(2, h - 2);
+ line1 |= pImage->getPixel(1, h - 2) << 1;
+ line1 |= pImage->getPixel(0, h - 2) << 2;
+ line2 = pImage->getPixel(2, h - 1);
+ line2 |= pImage->getPixel(1, h - 1) << 1;
+ line2 |= pImage->getPixel(0, h - 1) << 2;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, h)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], h + GBAT[1]) << 3;
+ CONTEXT |= line2 << 4;
+ CONTEXT |= line1 << 9;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, h, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 3, h - 2)) & 0x0f;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 3, h - 1)) & 0x1f;
+ line3 = ((line3 << 1) | bVal) & 0x07;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ FX_BYTE *pLine1, *pLine2, cVal;
+ FX_INT32 nStride, nStride2, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if(!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nStride2 = nStride << 1;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 1) {
+ pLine1 = m_pLine - nStride2;
+ pLine2 = m_pLine - nStride;
+ line1 = (*pLine1++) << 1;
+ line2 = *pLine2++;
+ CONTEXT = (line1 & 0x0380) | ((line2 >> 3) & 0x007c);
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | ((*pLine1++) << 1);
+ line2 = (line2 << 8) | (*pLine2++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> k) & 0x0080)
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line1 >> (7 - k)) & 0x0080)
+ | ((line2 >> (10 - k)) & 0x0004);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ pLine2 = m_pLine - nStride;
+ line2 = (m_loopIndex & 1) ? (*pLine2++) : 0;
+ CONTEXT = (line2 >> 3) & 0x007c;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ if(m_loopIndex & 1) {
+ line2 = (line2 << 8) | (*pLine2++);
+ }
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | ((line2 >> (k + 3)) & 0x0004);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line2 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01bd) << 1) | bVal
+ | (((line2 >> (10 - k))) & 0x0004);
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && m_loopIndex % 50 == 0 && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2, line3;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x00e5]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 2);
+ line1 |= pImage->getPixel(0, m_loopIndex - 2) << 1;
+ line2 = pImage->getPixel(1, m_loopIndex - 1);
+ line2 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
+ line3 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line3;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 2;
+ CONTEXT |= line2 << 3;
+ CONTEXT |= line1 << 7;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 2)) & 0x07;
+ line2 = ((line2 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x0f;
+ line3 = ((line3 << 1) | bVal) & 0x03;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1;
+ FX_BYTE *pLine1, cVal;
+ FX_INT32 nStride, k;
+ FX_INT32 nLineBytes, nBitsLeft, cc;
+ if (!m_pLine) {
+ m_pLine = pImage->m_pData;
+ }
+ nStride = pImage->m_nStride;
+ nLineBytes = ((GBW + 7) >> 3) - 1;
+ nBitsLeft = GBW - (nLineBytes << 3);
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ if(m_loopIndex > 0) {
+ pLine1 = m_pLine - nStride;
+ line1 = *pLine1++;
+ CONTEXT = (line1 >> 1) & 0x03f0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ line1 = (line1 << 8) | (*pLine1++);
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (k + 1)) & 0x0010);
+ }
+ m_pLine[cc] = cVal;
+ }
+ line1 <<= 8;
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal
+ | ((line1 >> (8 - k)) & 0x0010);
+ }
+ m_pLine[nLineBytes] = cVal;
+ } else {
+ CONTEXT = 0;
+ for(cc = 0; cc < nLineBytes; cc++) {
+ cVal = 0;
+ for(k = 7; k >= 0; k--) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << k;
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ m_pLine[cc] = cVal;
+ }
+ cVal = 0;
+ for(k = 0; k < nBitsLeft; k++) {
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ cVal |= bVal << (7 - k);
+ CONTEXT = ((CONTEXT & 0x01f7) << 1) | bVal;
+ }
+ m_pLine[nLineBytes] = cVal;
+ }
+ }
+ m_pLine += nStride;
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
+FXCODEC_STATUS CJBig2_GRDProc::decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause)
+{
+ FX_BOOL SLTP, bVal;
+ FX_DWORD CONTEXT;
+ FX_DWORD line1, line2;
+ for(; m_loopIndex < GBH; m_loopIndex++) {
+ if(TPGDON) {
+ SLTP = pArithDecoder->DECODE(&gbContext[0x0195]);
+ LTP = LTP ^ SLTP;
+ }
+ if(LTP == 1) {
+ pImage->copyLine(m_loopIndex, m_loopIndex - 1);
+ } else {
+ line1 = pImage->getPixel(1, m_loopIndex - 1);
+ line1 |= pImage->getPixel(0, m_loopIndex - 1) << 1;
+ line2 = 0;
+ for(FX_DWORD w = 0; w < GBW; w++) {
+ if(USESKIP && SKIP->getPixel(w, m_loopIndex)) {
+ bVal = 0;
+ } else {
+ CONTEXT = line2;
+ CONTEXT |= pImage->getPixel(w + GBAT[0], m_loopIndex + GBAT[1]) << 4;
+ CONTEXT |= line1 << 5;
+ bVal = pArithDecoder->DECODE(&gbContext[CONTEXT]);
+ }
+ if(bVal) {
+ pImage->setPixel(w, m_loopIndex, bVal);
+ }
+ line1 = ((line1 << 1) | pImage->getPixel(w + 2, m_loopIndex - 1)) & 0x1f;
+ line2 = ((line2 << 1) | bVal) & 0x0f;
+ }
+ }
+ if(pPause && pPause->NeedToPauseNow()) {
+ m_loopIndex++;
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ return FXCODEC_STATUS_DECODE_TOBECONTINUE;
+ }
+ }
+ m_ProssiveStatus = FXCODEC_STATUS_DECODE_FINISH;
+ return FXCODEC_STATUS_DECODE_FINISH;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
new file mode 100644
index 0000000000..a89d0d62ef
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_GENERAL_DECODER_H_
+#define _JBIG2_GENERAL_DECODER_H_
+#include "../../../include/fxcodec/fx_codec_def.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "JBig2_Define.h"
+#include "JBig2_SymbolDict.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_ArithIntDecoder.h"
+#include "../../../include/fxcrt/fx_coordinates.h"
+class CJBig2_HuffmanTable;
+class CJBig2_Image;
+class CJBig2_PatternDict;
+typedef enum {
+ JBIG2_CORNER_BOTTOMLEFT = 0,
+ JBIG2_CORNER_TOPLEFT = 1,
+ JBIG2_CORNER_BOTTOMRIGHT = 2,
+ JBIG2_CORNER_TOPRIGHT = 3
+} JBig2Corner;
+class CJBig2_GRDProc : public CJBig2_Object
+{
+public:
+ CJBig2_GRDProc()
+ {
+ m_loopIndex = 0;
+ m_pLine = NULL;
+ m_pPause = NULL;
+ m_DecodeType = 0;
+ LTP = 0;
+ m_ReplaceRect.left = 0;
+ m_ReplaceRect.bottom = 0;
+ m_ReplaceRect.top = 0;
+ m_ReplaceRect.right = 0;
+ }
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_V2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream);
+ FXCODEC_STATUS Start_decode_Arith(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_Arith_V2(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_Arith_V1(CJBig2_Image** pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Start_decode_MMR(CJBig2_Image** pImage, CJBig2_BitStream *pStream, IFX_Pause* pPause = NULL);
+ FXCODEC_STATUS Continue_decode(IFX_Pause* pPause);
+ FX_RECT GetReplaceRect()
+ {
+ return m_ReplaceRect;
+ };
+private:
+ FXCODEC_STATUS decode_Arith(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_V2(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_V1(IFX_Pause* pPause);
+ FXCODEC_STATUS decode_MMR();
+ FXCODEC_STATUS decode_Arith_Template0_opt3(CJBig2_Image*pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template0_unopt(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template1_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template1_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template2_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template2_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template3_opt3(CJBig2_Image *pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FXCODEC_STATUS decode_Arith_Template3_unopt(CJBig2_Image * pImage, CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+ FX_DWORD m_loopIndex;
+ FX_BYTE * m_pLine;
+ IFX_Pause* m_pPause;
+ FXCODEC_STATUS m_ProssiveStatus;
+ CJBig2_Image** m_pImage;
+ CJBig2_ArithDecoder *m_pArithDecoder;
+ JBig2ArithCtx *m_gbContext;
+ FX_WORD m_DecodeType;
+ FX_BOOL LTP;
+ FX_RECT m_ReplaceRect;
+private:
+
+ CJBig2_Image *decode_Arith_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template2_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt2(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_opt3(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+
+ CJBig2_Image *decode_Arith_Template3_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext);
+public:
+ FX_BOOL MMR;
+ FX_DWORD GBW;
+ FX_DWORD GBH;
+ FX_BYTE GBTEMPLATE;
+ FX_BOOL TPGDON;
+ FX_BOOL USESKIP;
+ CJBig2_Image * SKIP;
+ signed char GBAT[8];
+};
+class CJBig2_GRRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template0_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template0_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template1_unopt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Template1_opt(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_V1(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext);
+public:
+ FX_DWORD GRW;
+ FX_DWORD GRH;
+ FX_BOOL GRTEMPLATE;
+ CJBig2_Image *GRREFERENCE;
+ FX_INT32 GRREFERENCEDX;
+ FX_INT32 GRREFERENCEDY;
+ FX_BOOL TPGRON;
+ signed char GRAT[4];
+};
+typedef struct {
+ CJBig2_ArithIntDecoder *IADT,
+ *IAFS,
+ *IADS,
+ *IAIT,
+ *IARI,
+ *IARDW,
+ *IARDH,
+ *IARDX,
+ *IARDY;
+ CJBig2_ArithIaidDecoder *IAID;
+} JBig2IntDecoderState;
+class CJBig2_TRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *grContext);
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *grContext,
+ JBig2IntDecoderState *pIDS = NULL);
+public:
+ FX_BOOL SBHUFF;
+ FX_BOOL SBREFINE;
+ FX_DWORD SBW;
+ FX_DWORD SBH;
+ FX_DWORD SBNUMINSTANCES;
+ FX_DWORD SBSTRIPS;
+ FX_DWORD SBNUMSYMS;
+
+ JBig2HuffmanCode *SBSYMCODES;
+ FX_BYTE SBSYMCODELEN;
+
+ CJBig2_Image **SBSYMS;
+ FX_BOOL SBDEFPIXEL;
+
+ JBig2ComposeOp SBCOMBOP;
+ FX_BOOL TRANSPOSED;
+
+ JBig2Corner REFCORNER;
+ signed char SBDSOFFSET;
+ CJBig2_HuffmanTable *SBHUFFFS,
+ *SBHUFFDS,
+ *SBHUFFDT,
+ *SBHUFFRDW,
+ *SBHUFFRDH,
+ *SBHUFFRDX,
+ *SBHUFFRDY,
+ *SBHUFFRSIZE;
+ FX_BOOL SBRTEMPLATE;
+ signed char SBRAT[4];
+};
+class CJBig2_SDDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_SymbolDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext);
+
+ CJBig2_SymbolDict *decode_Huffman(CJBig2_BitStream *pStream, JBig2ArithCtx *gbContext, JBig2ArithCtx *grContext, IFX_Pause* pPause);
+public:
+ FX_BOOL SDHUFF;
+ FX_BOOL SDREFAGG;
+ FX_DWORD SDNUMINSYMS;
+ CJBig2_Image ** SDINSYMS;
+ FX_DWORD SDNUMNEWSYMS;
+ FX_DWORD SDNUMEXSYMS;
+ CJBig2_HuffmanTable *SDHUFFDH,
+ *SDHUFFDW,
+ *SDHUFFBMSIZE,
+ *SDHUFFAGGINST;
+ FX_BYTE SDTEMPLATE;
+ signed char SDAT[8];
+ FX_BOOL SDRTEMPLATE;
+ signed char SDRAT[4];
+};
+class CJBig2_HTRDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ CJBig2_Image *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_DWORD HBW,
+ HBH;
+ FX_BOOL HMMR;
+ FX_BYTE HTEMPLATE;
+ FX_DWORD HNUMPATS;
+ CJBig2_Image **HPATS;
+ FX_BOOL HDEFPIXEL;
+ JBig2ComposeOp HCOMBOP;
+ FX_BOOL HENABLESKIP;
+ FX_DWORD HGW,
+ HGH;
+ FX_INT32 HGX,
+ HGY;
+ FX_WORD HRX,
+ HRY;
+ FX_BYTE HPW,
+ HPH;
+};
+class CJBig2_PDDProc : public CJBig2_Object
+{
+public:
+
+ CJBig2_PatternDict *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ CJBig2_PatternDict *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_BOOL HDMMR;
+ FX_BYTE HDPW,
+ HDPH;
+ FX_DWORD GRAYMAX;
+ FX_BYTE HDTEMPLATE;
+};
+class CJBig2_GSIDProc : public CJBig2_Object
+{
+public:
+
+ FX_DWORD *decode_Arith(CJBig2_ArithDecoder *pArithDecoder, JBig2ArithCtx *gbContext, IFX_Pause* pPause);
+
+ FX_DWORD *decode_MMR(CJBig2_BitStream *pStream, IFX_Pause* pPause);
+public:
+ FX_BOOL GSMMR;
+ FX_BOOL GSUSESKIP;
+ FX_BYTE GSBPP;
+ FX_DWORD GSW,
+ GSH;
+ FX_BYTE GSTEMPLATE;
+ CJBig2_Image *GSKIP;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
new file mode 100644
index 0000000000..8199fe7c21
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp
@@ -0,0 +1,55 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_HuffmanDecoder.h"
+CJBig2_HuffmanDecoder::CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream)
+{
+ m_pStream = pStream;
+}
+CJBig2_HuffmanDecoder::~CJBig2_HuffmanDecoder()
+{
+}
+int CJBig2_HuffmanDecoder::decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult)
+{
+ int nVal, nTmp, i, nBits;
+ nVal = 0;
+ nBits = 0;
+ while(1) {
+ if(m_pStream->read1Bit(&nTmp) == -1) {
+ return -1;
+ }
+ nVal = (nVal << 1) | nTmp;
+ nBits ++;
+ for(i = 0; i < pTable->NTEMP; i++) {
+ if((pTable->PREFLEN[i] == nBits) && (pTable->CODES[i] == nVal)) {
+ if((pTable->HTOOB == 1) && (i == pTable->NTEMP - 1)) {
+ return JBIG2_OOB;
+ }
+ if(m_pStream->readNBits(pTable->RANGELEN[i], &nTmp) == -1) {
+ return -1;
+ }
+ if(pTable->HTOOB) {
+ if(i == pTable->NTEMP - 3) {
+ *nResult = pTable->RANGELOW[i] - nTmp;
+ return 0;
+ } else {
+ *nResult = pTable->RANGELOW[i] + nTmp;
+ return 0;
+ }
+ } else {
+ if(i == pTable->NTEMP - 2) {
+ *nResult = pTable->RANGELOW[i] - nTmp;
+ return 0;
+ } else {
+ *nResult = pTable->RANGELOW[i] + nTmp;
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ return -2;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
new file mode 100644
index 0000000000..38b2021d20
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_DECODER_H_
+#define _JBIG2_HUFFMAN_DECODER_H_
+#include "JBig2_BitStream.h"
+#include "JBig2_HuffmanTable.h"
+class CJBig2_HuffmanDecoder : public CJBig2_Object
+{
+public:
+
+ CJBig2_HuffmanDecoder(CJBig2_BitStream *pStream);
+
+ ~CJBig2_HuffmanDecoder();
+
+ int decodeAValue(CJBig2_HuffmanTable *pTable, int *nResult);
+private:
+
+ CJBig2_BitStream *m_pStream;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
new file mode 100644
index 0000000000..af4a54988d
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp
@@ -0,0 +1,193 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_HuffmanTable.h"
+#include "JBig2_BitStream.h"
+#include <string.h>
+
+CJBig2_HuffmanTable::CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines,
+ FX_BOOL bHTOOB)
+{
+ init();
+ m_bOK = parseFromStandardTable(pTable, nLines, bHTOOB);
+}
+
+CJBig2_HuffmanTable::CJBig2_HuffmanTable(CJBig2_BitStream *pStream)
+{
+ init();
+ m_bOK = parseFromCodedBuffer(pStream);
+}
+
+CJBig2_HuffmanTable::~CJBig2_HuffmanTable()
+{
+ if(CODES) {
+ m_pModule->JBig2_Free(CODES);
+ }
+ if(PREFLEN) {
+ m_pModule->JBig2_Free(PREFLEN);
+ }
+ if(RANGELEN) {
+ m_pModule->JBig2_Free(RANGELEN);
+ }
+ if(RANGELOW) {
+ m_pModule->JBig2_Free(RANGELOW);
+ }
+}
+void CJBig2_HuffmanTable::init()
+{
+ HTOOB = FALSE;
+ NTEMP = 0;
+ CODES = NULL;
+ PREFLEN = NULL;
+ RANGELEN = NULL;
+ RANGELOW = NULL;
+}
+int CJBig2_HuffmanTable::parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB)
+{
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ HTOOB = bHTOOB;
+ NTEMP = nLines;
+ CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ PREFLEN[i] = pTable[i].PREFLEN;
+ RANGELEN[i] = pTable[i].RANDELEN;
+ RANGELOW[i] = pTable[i].RANGELOW;
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+ return 1;
+}
+
+#define HT_CHECK_MEMORY_ADJUST \
+ if(NTEMP >= nSize) \
+ { \
+ nSize += 16; \
+ PREFLEN = (int*)m_pModule->JBig2_Realloc(PREFLEN,sizeof(int)*nSize); \
+ RANGELEN = (int*)m_pModule->JBig2_Realloc(RANGELEN,sizeof(int)*nSize); \
+ RANGELOW = (int*)m_pModule->JBig2_Realloc(RANGELOW,sizeof(int)*nSize); \
+ }
+int CJBig2_HuffmanTable::parseFromCodedBuffer(CJBig2_BitStream *pStream)
+{
+ unsigned char HTPS, HTRS;
+ int HTLOW, HTHIGH;
+ int CURRANGELOW;
+ int nSize = 16;
+ int CURLEN, LENMAX, CURCODE, CURTEMP, i;
+ int *LENCOUNT;
+ int *FIRSTCODE;
+ unsigned char cTemp;
+ if(pStream->read1Byte(&cTemp) == -1) {
+ goto failed;
+ }
+ HTOOB = cTemp & 0x01;
+ HTPS = ((cTemp >> 1) & 0x07) + 1;
+ HTRS = ((cTemp >> 4) & 0x07) + 1;
+ if(pStream->readInteger((FX_DWORD*)&HTLOW) == -1 ||
+ pStream->readInteger((FX_DWORD*)&HTHIGH) == -1) {
+ goto failed;
+ }
+ PREFLEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ RANGELEN = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ RANGELOW = (int*)m_pModule->JBig2_Malloc2(sizeof(int), nSize);
+ CURRANGELOW = HTLOW;
+ NTEMP = 0;
+ do {
+ HT_CHECK_MEMORY_ADJUST
+ if((pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1)
+ || (pStream->readNBits(HTRS, &RANGELEN[NTEMP]) == -1)) {
+ goto failed;
+ }
+ RANGELOW[NTEMP] = CURRANGELOW;
+ CURRANGELOW = CURRANGELOW + (1 << RANGELEN[NTEMP]);
+ NTEMP = NTEMP + 1;
+ } while(CURRANGELOW < HTHIGH);
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ RANGELEN[NTEMP] = 32;
+ RANGELOW[NTEMP] = HTLOW - 1;
+ NTEMP = NTEMP + 1;
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ RANGELEN[NTEMP] = 32;
+ RANGELOW[NTEMP] = HTHIGH;
+ NTEMP = NTEMP + 1;
+ if(HTOOB) {
+ HT_CHECK_MEMORY_ADJUST
+ if(pStream->readNBits(HTPS, &PREFLEN[NTEMP]) == -1) {
+ goto failed;
+ }
+ NTEMP = NTEMP + 1;
+ }
+ CODES = (int*)m_pModule->JBig2_Malloc2(sizeof(int), NTEMP);
+ LENMAX = 0;
+ for(i = 0; i < NTEMP; i++) {
+ if(PREFLEN[i] > LENMAX) {
+ LENMAX = PREFLEN[i];
+ }
+ }
+ LENCOUNT = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ JBIG2_memset(LENCOUNT, 0, sizeof(int) * (LENMAX + 1));
+ FIRSTCODE = (int*)m_pModule->JBig2_Malloc2(sizeof(int), (LENMAX + 1));
+ for(i = 0; i < NTEMP; i++) {
+ LENCOUNT[PREFLEN[i]] ++;
+ }
+ CURLEN = 1;
+ FIRSTCODE[0] = 0;
+ LENCOUNT[0] = 0;
+ while(CURLEN <= LENMAX) {
+ FIRSTCODE[CURLEN] = (FIRSTCODE[CURLEN - 1] + LENCOUNT[CURLEN - 1]) << 1;
+ CURCODE = FIRSTCODE[CURLEN];
+ CURTEMP = 0;
+ while(CURTEMP < NTEMP) {
+ if(PREFLEN[CURTEMP] == CURLEN) {
+ CODES[CURTEMP] = CURCODE;
+ CURCODE = CURCODE + 1;
+ }
+ CURTEMP = CURTEMP + 1;
+ }
+ CURLEN = CURLEN + 1;
+ }
+ m_pModule->JBig2_Free(LENCOUNT);
+ m_pModule->JBig2_Free(FIRSTCODE);
+ return TRUE;
+failed:
+ return FALSE;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
new file mode 100644
index 0000000000..df051c28d4
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_TABLE_H_
+#define _JBIG2_HUFFMAN_TABLE_H_
+#include "JBig2_Module.h"
+#include "JBig2_HuffmanTable_Standard.h"
+#include "JBig2_BitStream.h"
+class CJBig2_HuffmanTable : public CJBig2_Object
+{
+public:
+
+ CJBig2_HuffmanTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
+
+ CJBig2_HuffmanTable(CJBig2_BitStream *pStream);
+
+ ~CJBig2_HuffmanTable();
+
+ void init();
+
+ int parseFromStandardTable(const JBig2TableLine *pTable, int nLines, FX_BOOL bHTOOB);
+
+ int parseFromCodedBuffer(CJBig2_BitStream *pStream);
+
+ FX_BOOL isOK()
+ {
+ return m_bOK;
+ }
+private:
+ FX_BOOL HTOOB;
+ int NTEMP;
+ int *CODES;
+ int *PREFLEN;
+ int *RANGELEN;
+ int *RANGELOW;
+ FX_BOOL m_bOK;
+ friend class CJBig2_HuffmanDecoder;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
new file mode 100644
index 0000000000..f6114364f1
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h
@@ -0,0 +1,251 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_HUFFMAN_TABLE_STANDARD_H_
+#define _JBIG2_HUFFMAN_TABLE_STANDARD_H_
+typedef struct {
+ int PREFLEN;
+ int RANDELEN;
+ int RANGELOW;
+} JBig2TableLine;
+const FX_BOOL HuffmanTable_HTOOB_B1 = FALSE;
+const JBig2TableLine HuffmanTable_B1[] = {
+ { 1, 4, 0 },
+ { 2, 8, 16 },
+ { 3, 16, 272 },
+ { 0, 32, -1 },
+ { 3, 32, 65808 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B2 = TRUE;
+const JBig2TableLine HuffmanTable_B2[] = {
+ { 1, 0, 0 },
+ { 2, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 3, 3 },
+ { 5, 6, 11 },
+ { 0, 32, -1 },
+ { 6, 32, 75 },
+ { 6, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B3 = TRUE;
+const JBig2TableLine HuffmanTable_B3[] = {
+ { 8, 8, -256 },
+ { 1, 0, 0 },
+ { 2, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 3, 3 },
+ { 5, 6, 11 },
+ { 8, 32, -257 },
+ { 7, 32, 75 },
+ { 6, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B4 = FALSE;
+const JBig2TableLine HuffmanTable_B4[] = {
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 0, 3 },
+ { 4, 3, 4 },
+ { 5, 6, 12 },
+ { 0, 32, -1 },
+ { 5, 32, 76 },
+};
+const FX_BOOL HuffmanTable_HTOOB_B5 = FALSE;
+const JBig2TableLine HuffmanTable_B5[] = {
+ { 7, 8, -255 },
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 0, 3 },
+ { 4, 3, 4 },
+ { 5, 6, 12 },
+ { 7, 32, -256 },
+ { 6, 32, 76 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B6 = FALSE;
+const JBig2TableLine HuffmanTable_B6[] = {
+ { 5, 10, -2048 },
+ { 4, 9, -1024 },
+ { 4, 8, -512 },
+ { 4, 7, -256 },
+ { 5, 6, -128 },
+ { 5, 5, -64 },
+ { 4, 5, -32 },
+ { 2, 7, 0 },
+ { 3, 7, 128 },
+ { 3, 8, 256 },
+ { 4, 9, 512 },
+ { 4, 10, 1024 },
+ { 6, 32, -2049 },
+ { 6, 32, 2048 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B7 = FALSE;
+const JBig2TableLine HuffmanTable_B7[] = {
+ { 4, 9, -1024 },
+ { 3, 8, -512 },
+ { 4, 7, -256 },
+ { 5, 6, -128 },
+ { 5, 5, -64 },
+ { 4, 5, -32 },
+ { 4, 5, 0 },
+ { 5, 5, 32 },
+ { 5, 6, 64 },
+ { 4, 7, 128 },
+ { 3, 8, 256 },
+ { 3, 9, 512 },
+ { 3, 10, 1024 },
+ { 5, 32, -1025 },
+ { 5, 32, 2048 },
+};
+const FX_BOOL HuffmanTable_HTOOB_B8 = TRUE;
+const JBig2TableLine HuffmanTable_B8[] = {
+ { 8, 3, -15 },
+ { 9, 1, -7 },
+ { 8, 1, -5 },
+ { 9, 0, -3 },
+ { 7, 0, -2 },
+ { 4, 0, -1 },
+ { 2, 1, 0 },
+ { 5, 0, 2 },
+ { 6, 0, 3 },
+ { 3, 4, 4 },
+ { 6, 1, 20 },
+ { 4, 4, 22 },
+ { 4, 5, 38 },
+ { 5, 6, 70 },
+ { 5, 7, 134 },
+ { 6, 7, 262 },
+ { 7, 8, 390 },
+ { 6, 10, 646 },
+ { 9, 32, -16 },
+ { 9, 32, 1670 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B9 = TRUE;
+const JBig2TableLine HuffmanTable_B9[] = {
+ { 8, 4, -31 },
+ { 9, 2, -15 },
+ { 8, 2, -11 },
+ { 9, 1, -7 },
+ { 7, 1, -5 },
+ { 4, 1, -3 },
+ { 3, 1, -1 },
+ { 3, 1, 1 },
+ { 5, 1, 3 },
+ { 6, 1, 5 },
+ { 3, 5, 7 },
+ { 6, 2, 39 },
+ { 4, 5, 43 },
+ { 4, 6, 75 },
+ { 5, 7, 139 },
+ { 5, 8, 267 },
+ { 6, 8, 523 },
+ { 7, 9, 779 },
+ { 6, 11, 1291 },
+ { 9, 32, -32 },
+ { 9, 32, 3339 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B10 = TRUE;
+const JBig2TableLine HuffmanTable_B10[] = {
+ { 7, 4, -21 },
+ { 8, 0, -5 },
+ { 7, 0, -4 },
+ { 5, 0, -3 },
+ { 2, 2, -2 },
+ { 5, 0, 2 },
+ { 6, 0, 3 },
+ { 7, 0, 4 },
+ { 8, 0, 5 },
+ { 2, 6, 6 },
+ { 5, 5, 70 },
+ { 6, 5, 102 },
+ { 6, 6, 134 },
+ { 6, 7, 198 },
+ { 6, 8, 326 },
+ { 6, 9, 582 },
+ { 6, 10, 1094 },
+ { 7, 11, 2118 },
+ { 8, 32, -22 },
+ { 8, 32, 4166 },
+ { 2, 0, 0 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B11 = FALSE;
+const JBig2TableLine HuffmanTable_B11[] = {
+ { 1, 0, 1 },
+ { 2, 1, 2 },
+ { 4, 0, 4 },
+ { 4, 1, 5 },
+ { 5, 1, 7 },
+ { 5, 2, 9 },
+ { 6, 2, 13 },
+ { 7, 2, 17 },
+ { 7, 3, 21 },
+ { 7, 4, 29 },
+ { 7, 5, 45 },
+ { 7, 6, 77 },
+ { 0, 32, 0 },
+ { 7, 32, 141 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B12 = FALSE;
+const JBig2TableLine HuffmanTable_B12[] = {
+ { 1, 0, 1 },
+ { 2, 0, 2 },
+ { 3, 1, 3 },
+ { 5, 0, 5 },
+ { 5, 1, 6 },
+ { 6, 1, 8 },
+ { 7, 0, 10 },
+ { 7, 1, 11 },
+ { 7, 2, 13 },
+ { 7, 3, 17 },
+ { 7, 4, 25 },
+ { 8, 5, 41 },
+ { 0, 32, 0 },
+ { 8, 32, 73 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B13 = FALSE;
+const JBig2TableLine HuffmanTable_B13[] = {
+ { 1, 0, 1 },
+ { 3, 0, 2 },
+ { 4, 0, 3 },
+ { 5, 0, 4 },
+ { 4, 1, 5 },
+ { 3, 3, 7 },
+ { 6, 1, 15 },
+ { 6, 2, 17 },
+ { 6, 3, 21 },
+ { 6, 4, 29 },
+ { 6, 5, 45 },
+ { 7, 6, 77 },
+ { 0, 32, 0 },
+ { 7, 32, 141 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B14 = FALSE;
+const JBig2TableLine HuffmanTable_B14[] = {
+ { 3, 0, -2 },
+ { 3, 0, -1 },
+ { 1, 0, 0 },
+ { 3, 0, 1 },
+ { 3, 0, 2 },
+ { 0, 32, -3 },
+ { 0, 32, 3 }
+};
+const FX_BOOL HuffmanTable_HTOOB_B15 = FALSE;
+const JBig2TableLine HuffmanTable_B15[] = {
+ { 7, 4, -24 },
+ { 6, 2, -8 },
+ { 5, 1, -4 },
+ { 4, 0, -2 },
+ { 3, 0, -1 },
+ { 1, 0, 0 },
+ { 3, 0, 1 },
+ { 4, 0, 2 },
+ { 5, 1, 3 },
+ { 6, 2, 5 },
+ { 7, 4, 9 },
+ { 7, 32, -25 },
+ { 7, 32, 25 }
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp
new file mode 100644
index 0000000000..1719028176
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp
@@ -0,0 +1,1619 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Image.h"
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fxcrt/fx_coordinates.h"
+#include <limits.h>
+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)
+{
+ m_nWidth = w;
+ m_nHeight = h;
+ if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
+ m_pData = NULL;
+ m_bNeedFree = FALSE;
+ return;
+ }
+ m_nStride = ((w + 31) >> 5) << 2;
+ if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
+ m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
+ } else {
+ m_pData = NULL;
+ }
+ m_bNeedFree = TRUE;
+}
+CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)
+{
+ m_nWidth = w;
+ m_nHeight = h;
+ m_nStride = stride;
+ m_pData = pBuf;
+ m_bNeedFree = FALSE;
+}
+CJBig2_Image::CJBig2_Image(CJBig2_Image &im)
+{
+ m_pModule = im.m_pModule;
+ m_nWidth = im.m_nWidth;
+ m_nHeight = im.m_nHeight;
+ m_nStride = im.m_nStride;
+ if (im.m_pData) {
+ m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
+ JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);
+ } else {
+ m_pData = NULL;
+ }
+ m_bNeedFree = TRUE;
+}
+CJBig2_Image::~CJBig2_Image()
+{
+ if(m_bNeedFree && m_pData) {
+ m_pModule->JBig2_Free(m_pData);
+ }
+}
+FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)
+{
+ if (!m_pData) {
+ return 0;
+ }
+ FX_INT32 m, n;
+ if(x < 0 || x >= m_nWidth) {
+ return 0;
+ }
+ if(y < 0 || y >= m_nHeight) {
+ return 0;
+ }
+ m = y * m_nStride + (x >> 3);
+ n = x & 7;
+ return ((m_pData[m] >> (7 - n)) & 1);
+}
+
+FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)
+{
+ if (!m_pData) {
+ return 0;
+ }
+ FX_INT32 m, n;
+ if(x < 0 || x >= m_nWidth) {
+ return 0;
+ }
+ if(y < 0 || y >= m_nHeight) {
+ return 0;
+ }
+ m = y * m_nStride + (x >> 3);
+ n = x & 7;
+ if(v) {
+ m_pData[m] |= 1 << (7 - n);
+ } else {
+ m_pData[m] &= ~(1 << (7 - n));
+ }
+ return 1;
+}
+void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)
+{
+ if (!m_pData) {
+ return;
+ }
+ if(hFrom < 0 || hFrom >= m_nHeight) {
+ JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
+ } else {
+ JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);
+ }
+}
+void CJBig2_Image::fill(FX_BOOL v)
+{
+ if (!m_pData) {
+ return;
+ }
+ JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
+}
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return composeTo_opt2(pDst, x, y, op);
+}
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
+ return composeTo_opt2(pDst, x, y, op);
+ }
+ return composeTo_opt2(pDst, x, y, op, pSrcRect);
+}
+FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 w, h, dx, dy;
+ FX_INT32 i, j;
+ w = m_nWidth;
+ h = m_nHeight;
+ dx = dy = 0;
+ if(x < 0) {
+ dx += -x;
+ w -= -x;
+ x = 0;
+ }
+ if(y < 0) {
+ dy += -y;
+ h -= -y;
+ y = 0;
+ }
+ if(x + w > pDst->m_nWidth) {
+ w = pDst->m_nWidth - x;
+ }
+ if(y + h > pDst->m_nHeight) {
+ h = pDst->m_nHeight - y;
+ }
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j,
+ (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
+ }
+ }
+ break;
+ }
+ return TRUE;
+}
+
+FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 x0, x1, y0, y1, xx, yy;
+ FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;
+ FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
+ FX_BOOL oneByte;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (y < 0) {
+ y0 = -y;
+ } else {
+ y0 = 0;
+ }
+ if (y + m_nHeight > pDst->m_nHeight) {
+ y1 = pDst->m_nHeight - y;
+ } else {
+ y1 = m_nHeight;
+ }
+ if (y0 >= y1) {
+ return FALSE;
+ }
+ if (x >= 0) {
+ x0 = x & ~7;
+ } else {
+ x0 = 0;
+ }
+ x1 = x + m_nWidth;
+ if (x1 > pDst->m_nWidth) {
+ x1 = pDst->m_nWidth;
+ }
+ if (x0 >= x1) {
+ return FALSE;
+ }
+ s1 = x & 7;
+ s2 = 8 - s1;
+ m1 = 0xff >> (x1 & 7);
+ m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
+ m3 = (0xff >> s1) & m2;
+ oneByte = x0 == ((x1 - 1) & ~7);
+ pLineDst = pDst->m_pData + y * pDst->m_nStride;
+ pLineSrc = m_pData + y0 * m_nStride;
+ if(oneByte) {
+ if(x >= 0) {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest |= (*srcPtr >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest &= ((0xff00 | *srcPtr) >> s1) | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest ^= (*srcPtr >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for (yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ dest = *destPtr;
+ dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ } else {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest |= *srcPtr & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest &= *srcPtr | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest ^= *srcPtr & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest ^= (*srcPtr ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ dest = *destPtr;
+ dest = (*srcPtr & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ }
+ } else {
+ if(x >= 0) {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest |= src1 >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest &= (0xff00 | src1) >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest ^= src1 >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest ^= (src1 ^ 0xff) >> s1;
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src ^ 0xff;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= (src ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst + (x >> 3);
+ srcPtr = pLineSrc;
+ src1 = *srcPtr++;
+ dest = *destPtr;
+ dest = (dest & (0xff << s2)) | (src1 >> s1);
+ *destPtr++ = (FX_BYTE)dest;
+ xx = x0 + 8;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = (src & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ } else {
+ switch(op) {
+ case JBIG2_COMPOSE_OR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest |= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_AND: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest &= src | m1;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_XNOR: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= src ^ 0xff;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest ^= (src ^ 0xff) & m2;
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ case JBIG2_COMPOSE_REPLACE: {
+ for(yy = y0; yy < y1; ++yy) {
+ destPtr = pLineDst;
+ srcPtr = pLineSrc + (-x >> 3);
+ src1 = *srcPtr++;
+ xx = x0;
+ for (; xx < x1 - 8; xx += 8) {
+ dest = *destPtr;
+ src0 = src1;
+ src1 = *srcPtr++;
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = src;
+ *destPtr++ = (FX_BYTE)dest;
+ }
+ dest = *destPtr;
+ src0 = src1;
+ if(srcPtr - pLineSrc < m_nStride) {
+ src1 = *srcPtr++;
+ } else {
+ src1 = 0;
+ }
+ src = (((src0 << 8) | src1) >> s1) & 0xff;
+ dest = (src & m2) | (dest & m1);
+ *destPtr = (FX_BYTE)dest;
+ pLineDst += pDst->m_nStride;
+ pLineSrc += m_nStride;
+ }
+ }
+ break;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return pSrc->composeTo(this, x, y, op);
+}
+FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ if (!m_pData) {
+ return FALSE;
+ }
+ return pSrc->composeTo(this, x, y, op, pSrcRect);
+}
+CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
+{
+ CJBig2_Image *pImage;
+ FX_INT32 i, j;
+ JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
+ for(j = 0; j < h; j++) {
+ for(i = 0; i < w; i++) {
+ pImage->setPixel(i, j, getPixel(x + i, y + j));
+ }
+ }
+ return pImage;
+}
+#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
+CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
+{
+ CJBig2_Image *pImage;
+ FX_INT32 m, n, j;
+ FX_BYTE *pLineSrc, *pLineDst;
+ FX_DWORD wTmp;
+ FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;
+ if (w == 0 || h == 0) {
+ return NULL;
+ }
+ JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
+ if (!m_pData) {
+ pImage->fill(0);
+ return pImage;
+ }
+ if (!pImage->m_pData) {
+ return pImage;
+ }
+ pLineSrc = m_pData + m_nStride * y;
+ pLineDst = pImage->m_pData;
+ m = (x >> 5) << 2;
+ n = x & 31;
+ if(n == 0) {
+ for(j = 0; j < h; j++) {
+ pSrc = pLineSrc + m;
+ pSrcEnd = pLineSrc + m_nStride;
+ pDst = pLineDst;
+ pDstEnd = pLineDst + pImage->m_nStride;
+ for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
+ *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
+ }
+ pLineSrc += m_nStride;
+ pLineDst += pImage->m_nStride;
+ }
+ } else {
+ for(j = 0; j < h; j++) {
+ pSrc = pLineSrc + m;
+ pSrcEnd = pLineSrc + m_nStride;
+ pDst = pLineDst;
+ pDstEnd = pLineDst + pImage->m_nStride;
+ for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
+ if(pSrc + 4 < pSrcEnd) {
+ wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
+ } else {
+ wTmp = JBIG2_GETDWORD(pSrc) << n;
+ }
+ pDst[0] = (FX_BYTE)(wTmp >> 24);
+ pDst[1] = (FX_BYTE)(wTmp >> 16);
+ pDst[2] = (FX_BYTE)(wTmp >> 8);
+ pDst[3] = (FX_BYTE)wTmp;
+ }
+ pLineSrc += m_nStride;
+ pLineDst += pImage->m_nStride;
+ }
+ }
+ return pImage;
+}
+void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
+{
+ if (!m_pData) {
+ return;
+ }
+ m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);
+ if(h > m_nHeight) {
+ JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
+ }
+ m_nHeight = h;
+}
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
+{
+ FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
+ FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
+ FX_BYTE *lineSrc, *lineDst, *sp, *dp;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
+ return FALSE;
+ }
+ if(y < 0) {
+ ys0 = -y;
+ } else {
+ ys0 = 0;
+ }
+ if(y + m_nHeight > pDst->m_nHeight) {
+ ys1 = pDst->m_nHeight - y;
+ } else {
+ ys1 = m_nHeight;
+ }
+ if(x < 0) {
+ xs0 = -x;
+ } else {
+ xs0 = 0;
+ }
+ if(x + m_nWidth > pDst->m_nWidth) {
+ xs1 = pDst->m_nWidth - x;
+ } else {
+ xs1 = m_nWidth;
+ }
+ if((ys0 >= ys1) || (xs0 >= xs1)) {
+ return 0;
+ }
+ w = xs1 - xs0;
+ h = ys1 - ys0;
+ if(y < 0) {
+ yd0 = 0;
+ } else {
+ yd0 = y;
+ }
+ if(x < 0) {
+ xd0 = 0;
+ } else {
+ xd0 = x;
+ }
+ xd1 = xd0 + w;
+ yd1 = yd0 + h;
+ d1 = xd0 & 31;
+ d2 = xd1 & 31;
+ s1 = xs0 & 31;
+ maskL = 0xffffffff >> d1;
+ maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
+ maskM = maskL & maskR;
+ lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
+ lineLeft = m_nStride - ((xs0 >> 5) << 2);
+ lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
+ if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
+ if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
+ if(s1 > d1) {
+ shift = s1 - d1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift = d1 - s1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ if(s1 > d1) {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else if(s1 == d1) {
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift1 = d1 - s1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp) >> shift1;
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ }
+ return 1;
+}
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
+{
+ FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
+ FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
+ FX_BYTE *lineSrc, *lineDst, *sp, *dp;
+ FX_INT32 sw, sh;
+ if (!m_pData) {
+ return FALSE;
+ }
+ if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
+ return FALSE;
+ }
+ sw = pSrcRect->Width();
+ sh = pSrcRect->Height();
+ if(y < 0) {
+ ys0 = -y;
+ } else {
+ ys0 = 0;
+ }
+ if(y + sh > pDst->m_nHeight) {
+ ys1 = pDst->m_nHeight - y;
+ } else {
+ ys1 = sh;
+ }
+ if(x < 0) {
+ xs0 = -x;
+ } else {
+ xs0 = 0;
+ }
+ if(x + sw > pDst->m_nWidth) {
+ xs1 = pDst->m_nWidth - x;
+ } else {
+ xs1 = sw;
+ }
+ if((ys0 >= ys1) || (xs0 >= xs1)) {
+ return 0;
+ }
+ w = xs1 - xs0;
+ h = ys1 - ys0;
+ if(y < 0) {
+ yd0 = 0;
+ } else {
+ yd0 = y;
+ }
+ if(x < 0) {
+ xd0 = 0;
+ } else {
+ xd0 = x;
+ }
+ xd1 = xd0 + w;
+ yd1 = yd0 + h;
+ d1 = xd0 & 31;
+ d2 = xd1 & 31;
+ s1 = xs0 & 31;
+ maskL = 0xffffffff >> d1;
+ maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
+ maskM = maskL & maskR;
+ lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);
+ lineLeft = m_nStride - ((xs0 >> 5) << 2);
+ lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
+ if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
+ if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
+ if(s1 > d1) {
+ shift = s1 - d1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift = d1 - s1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ for(yy = yd0; yy < yd1; yy++) {
+ tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(lineDst);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
+ break;
+ }
+ lineDst[0] = (FX_BYTE)(tmp >> 24);
+ lineDst[1] = (FX_BYTE)(tmp >> 16);
+ lineDst[2] = (FX_BYTE)(tmp >> 8);
+ lineDst[3] = (FX_BYTE)tmp;
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ } else {
+ if(s1 > d1) {
+ shift1 = s1 - d1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else if(s1 == d1) {
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ } else {
+ shift1 = d1 - s1;
+ shift2 = 32 - shift1;
+ middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
+ for(yy = yd0; yy < yd1; yy++) {
+ sp = lineSrc;
+ dp = lineDst;
+ if(d1 != 0) {
+ tmp1 = JBIG2_GETDWORD(sp) >> shift1;
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ dp += 4;
+ }
+ for(xx = 0; xx < middleDwords; xx++) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = tmp1 | tmp2;
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = tmp1 & tmp2;
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = tmp1 ^ tmp2;
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = ~(tmp1 ^ tmp2);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = tmp1;
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ sp += 4;
+ dp += 4;
+ }
+ if(d2 != 0) {
+ tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
+ ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
+ tmp2 = JBIG2_GETDWORD(dp);
+ switch(op) {
+ case JBIG2_COMPOSE_OR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_AND:
+ tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XOR:
+ tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
+ break;
+ case JBIG2_COMPOSE_XNOR:
+ tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
+ break;
+ case JBIG2_COMPOSE_REPLACE:
+ tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
+ break;
+ }
+ dp[0] = (FX_BYTE)(tmp >> 24);
+ dp[1] = (FX_BYTE)(tmp >> 16);
+ dp[2] = (FX_BYTE)(tmp >> 8);
+ dp[3] = (FX_BYTE)tmp;
+ }
+ lineSrc += m_nStride;
+ lineDst += pDst->m_nStride;
+ }
+ }
+ }
+ return 1;
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.h b/core/src/fxcodec/jbig2/JBig2_Image.h
new file mode 100644
index 0000000000..3c69f647e3
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Image.h
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_IMAGE_H_
+#define _JBIG2_IMAGE_H_
+#include "JBig2_Define.h"
+#include "JBig2_Module.h"
+typedef enum {
+ JBIG2_COMPOSE_OR = 0,
+ JBIG2_COMPOSE_AND = 1,
+ JBIG2_COMPOSE_XOR = 2,
+ JBIG2_COMPOSE_XNOR = 3,
+ JBIG2_COMPOSE_REPLACE = 4
+} JBig2ComposeOp;
+struct FX_RECT;
+class CJBig2_Image : public CJBig2_Object
+{
+public:
+
+ CJBig2_Image(FX_INT32 w, FX_INT32 h);
+
+ CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf);
+
+ CJBig2_Image(CJBig2_Image &im);
+
+ ~CJBig2_Image();
+
+ FX_BOOL getPixel(FX_INT32 x, FX_INT32 y);
+
+ FX_INT32 setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v);
+
+ void copyLine(FX_INT32 hTo, FX_INT32 hFrom);
+
+ void fill(FX_BOOL v);
+
+ FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+ FX_BOOL composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+
+ FX_BOOL composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+
+ FX_BOOL composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+
+ FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op);
+ FX_BOOL composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+
+ FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op);
+ FX_BOOL composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);
+ CJBig2_Image *subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
+
+ CJBig2_Image *subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h);
+
+ void expand(FX_INT32 h, FX_BOOL v);
+public:
+
+ FX_INT32 m_nWidth;
+
+ FX_INT32 m_nHeight;
+
+ FX_INT32 m_nStride;
+
+ FX_BYTE *m_pData;
+
+ FX_BOOL m_bNeedFree;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_List.h b/core/src/fxcodec/jbig2/JBig2_List.h
new file mode 100644
index 0000000000..a737d9e112
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_List.h
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_LIST_H_
+#define _JBIG2_LIST_H_
+#include "JBig2_Define.h"
+#include "JBig2_Object.h"
+template <class TYPE>
+class CJBig2_List : public CJBig2_Object
+{
+public:
+
+ CJBig2_List(FX_INT32 nSize = 8)
+ {
+ m_nSize = nSize;
+ m_pArray = (TYPE**)m_pModule->JBig2_Malloc2(sizeof(TYPE*), nSize);
+ m_nLength = 0;
+ }
+
+ ~CJBig2_List()
+ {
+ clear();
+ m_pModule->JBig2_Free(m_pArray);
+ }
+
+ void clear()
+ {
+ FX_INT32 i;
+ for(i = 0; i < m_nLength; i++) {
+ delete m_pArray[i];
+ }
+ m_nLength = 0;
+ }
+
+ void addItem(TYPE *pItem)
+ {
+ if(m_nLength >= m_nSize) {
+ m_nSize += 8;
+ m_pArray = (TYPE**)m_pModule->JBig2_Realloc(m_pArray, sizeof(TYPE*)*m_nSize);
+ }
+ m_pArray[m_nLength++] = pItem;
+ }
+
+
+ FX_INT32 getLength()
+ {
+ return m_nLength;
+ }
+
+ TYPE *getAt(FX_INT32 nIndex)
+ {
+ return m_pArray[nIndex];
+ }
+
+ TYPE *getLast()
+ {
+ return m_pArray[m_nLength - 1];
+ }
+private:
+ FX_INT32 m_nSize;
+ TYPE **m_pArray;
+ FX_INT32 m_nLength;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Module.h b/core/src/fxcodec/jbig2/JBig2_Module.h
new file mode 100644
index 0000000000..ccde5ade02
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Module.h
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_MODULE_H_
+#define _JBIG2_MODULE_H_
+#include "JBig2_Define.h"
+class CJBig2_Module
+{
+public:
+
+ virtual void *JBig2_Malloc(FX_DWORD dwSize) = 0;
+
+ virtual void *JBig2_Malloc2(FX_DWORD num, FX_DWORD dwSize) = 0;
+
+ virtual void *JBig2_Malloc3(FX_DWORD num, FX_DWORD dwSize, FX_DWORD dwSize2) = 0;
+
+ virtual void *JBig2_Realloc(FX_LPVOID pMem, FX_DWORD dwSize) = 0;
+
+ virtual void JBig2_Free(FX_LPVOID pMem) = 0;
+
+ virtual void JBig2_Assert(FX_INT32 nExpression) {};
+
+ virtual void JBig2_Error(FX_LPCSTR format, ...) {};
+
+ virtual void JBig2_Warn(FX_LPCSTR format, ...) {};
+
+ virtual void JBig2_Log(FX_LPCSTR format, ...) {};
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Object.cpp b/core/src/fxcodec/jbig2/JBig2_Object.cpp
new file mode 100644
index 0000000000..3a94f0e65a
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Object.cpp
@@ -0,0 +1,72 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Object.h"
+#include "JBig2_Module.h"
+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
+{
+ CJBig2_Object *p;
+ p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
+ p->m_pModule = pModule;
+ return p;
+}
+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new(size_t size, CJBig2_Module *pModule)
+{
+ CJBig2_Object *p;
+ p = (CJBig2_Object *)pModule->JBig2_Malloc((FX_DWORD)size);
+ p->m_pModule = pModule;
+ return p;
+}
+void CJBig2_Object::operator delete(void *p)
+{
+ ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
+}
+void CJBig2_Object::operator delete(void *p, CJBig2_Module *pModule)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line)
+{
+ void *p;
+ FX_BYTE *pCur, *pEnd;
+ p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
+ pCur = (FX_BYTE *)p;
+ pEnd = pCur + size;
+ for(; pCur < pEnd; pCur += unit_size) {
+ ((CJBig2_Object *)pCur)->m_pModule = pModule;
+ }
+ return p;
+}
+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line)
+{
+ pModule->JBig2_Free(p);
+}
+void *CJBig2_Object::operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size)
+{
+ void *p;
+ FX_BYTE *pCur, *pEnd;
+ p = (FX_BYTE *)pModule->JBig2_Malloc((FX_DWORD)size);
+ pCur = (FX_BYTE *)p;
+ pEnd = pCur + size;
+ for(; pCur < pEnd; pCur += unit_size) {
+ ((CJBig2_Object *)pCur)->m_pModule = pModule;
+ }
+ return p;
+}
+void CJBig2_Object::operator delete[](void* p)
+{
+ ((CJBig2_Object *)p)->m_pModule->JBig2_Free(p);
+}
+void CJBig2_Object::operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size)
+{
+ pModule->JBig2_Free(p);
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Object.h b/core/src/fxcodec/jbig2/JBig2_Object.h
new file mode 100644
index 0000000000..7fef1a21a9
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Object.h
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_OBJECT_H_
+#define _JBIG2_OBJECT_H_
+#include "JBig2_Define.h"
+class CJBig2_Module;
+#define _JBIG2_NO_EXPECTION_
+class CJBig2_Object
+{
+public:
+
+ void *operator new(size_t size, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
+
+ void operator delete(void *p, CJBig2_Module *pModule, FX_LPCSTR filename, int line);
+
+ void *operator new(size_t size, CJBig2_Module *pModule);
+
+ void operator delete(void *p);
+
+ void operator delete(void *p, CJBig2_Module *pModule);
+
+ void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line);
+
+ void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size,
+ FX_LPCSTR filename, int line);
+
+ void *operator new[](size_t size, CJBig2_Module *pModule, size_t unit_size);
+
+ void operator delete[](void* p);
+
+ void operator delete[](void *p, CJBig2_Module *pModule, size_t unit_size);
+public:
+
+ CJBig2_Module *m_pModule;
+};
+#define JBIG2_NEW new(m_pModule)
+#define JBIG2_ALLOC(p, a) p = JBIG2_NEW a; p->m_pModule = m_pModule;
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Page.h b/core/src/fxcodec/jbig2/JBig2_Page.h
new file mode 100644
index 0000000000..490705448c
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Page.h
@@ -0,0 +1,19 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_PAGE_H_
+#define _JBIG2_PAGE_H_
+#include "JBig2_Image.h"
+struct JBig2PageInfo : public CJBig2_Object {
+ FX_DWORD m_dwWidth,
+ m_dwHeight;
+ FX_DWORD m_dwResolutionX,
+ m_dwResolutionY;
+ FX_BYTE m_cFlags;
+ FX_BOOL m_bIsStriped;
+ FX_WORD m_wMaxStripeSize;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
new file mode 100644
index 0000000000..58c52a5848
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.cpp
@@ -0,0 +1,24 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_PatternDict.h"
+CJBig2_PatternDict::CJBig2_PatternDict()
+{
+ NUMPATS = 0;
+ HDPATS = NULL;
+}
+
+CJBig2_PatternDict::~CJBig2_PatternDict()
+{
+ if(HDPATS) {
+ for(FX_DWORD i = 0; i < NUMPATS; i++) {
+ if(HDPATS[i]) {
+ delete HDPATS[i];
+ }
+ }
+ m_pModule->JBig2_Free(HDPATS);
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_PatternDict.h b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
new file mode 100644
index 0000000000..c8686507d9
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_PatternDict.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_PATTERN_DICT_H_
+#define _JBIG2_PATTERN_DICT_H_
+#include "JBig2_Define.h"
+#include "JBig2_Image.h"
+class CJBig2_PatternDict : public CJBig2_Object
+{
+public:
+
+ CJBig2_PatternDict();
+
+ ~CJBig2_PatternDict();
+public:
+ FX_DWORD NUMPATS;
+ CJBig2_Image **HDPATS;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.cpp b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
new file mode 100644
index 0000000000..788207dc6e
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.cpp
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_Segment.h"
+CJBig2_Segment::CJBig2_Segment()
+{
+ init();
+}
+CJBig2_Segment::~CJBig2_Segment()
+{
+ clean();
+}
+void CJBig2_Segment::init()
+{
+ m_dwNumber = 0;
+ m_cFlags.c = 0;
+ m_nReferred_to_segment_count = 0;
+ m_pReferred_to_segment_numbers = NULL;
+ m_dwPage_association = 0;
+ m_dwData_length = 0;
+ m_dwHeader_Length = 0;
+ m_pData = NULL;
+ m_State = JBIG2_SEGMENT_HEADER_UNPARSED;
+ m_nResultType = JBIG2_VOID_POINTER;
+ m_Result.vd = NULL;
+}
+void CJBig2_Segment::clean()
+{
+ if(m_pReferred_to_segment_numbers) {
+ m_pModule->JBig2_Free(m_pReferred_to_segment_numbers);
+ }
+ if(m_Result.vd) {
+ switch(m_nResultType) {
+ case JBIG2_IMAGE_POINTER:
+ delete m_Result.im;
+ break;
+ case JBIG2_SYMBOL_DICT_POINTER:
+ delete m_Result.sd;
+ break;
+ case JBIG2_PATTERN_DICT_POINTER:
+ delete m_Result.pd;
+ break;
+ case JBIG2_HUFFMAN_TABLE_POINTER:
+ delete m_Result.ht;
+ break;
+ default:
+ m_pModule->JBig2_Free(m_Result.vd);
+ }
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_Segment.h b/core/src/fxcodec/jbig2/JBig2_Segment.h
new file mode 100644
index 0000000000..48c31b17bb
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_Segment.h
@@ -0,0 +1,68 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_SEGMENT_H_
+#define _JBIG2_SEGMENT_H_
+#include "JBig2_Define.h"
+#include "JBig2_SymbolDict.h"
+#include "JBig2_PatternDict.h"
+#include "JBig2_Module.h"
+#include "JBig2_HuffmanTable.h"
+#define JBIG2_GET_INT32(buf) (((buf)[0]<<24) | ((buf)[1]<<16) | ((buf)[2]<<8) | (buf)[3])
+#define JBIG2_GET_INT16(buf) (((buf)[0]<<8) | (buf)[1])
+typedef enum {
+ JBIG2_SEGMENT_HEADER_UNPARSED,
+ JBIG2_SEGMENT_DATA_UNPARSED,
+ JBIG2_SEGMENT_PARSE_COMPLETE,
+ JBIG2_SEGMENT_PAUSED,
+ JBIG2_SEGMENT_ERROR
+} JBig2_SegmentState;
+typedef enum {
+ JBIG2_VOID_POINTER = 0,
+ JBIG2_IMAGE_POINTER,
+ JBIG2_SYMBOL_DICT_POINTER,
+ JBIG2_PATTERN_DICT_POINTER,
+ JBIG2_HUFFMAN_TABLE_POINTER
+} JBig2_ResultType;
+class CJBig2_Segment : public CJBig2_Object
+{
+public:
+
+ CJBig2_Segment();
+
+ ~CJBig2_Segment();
+
+ void init();
+
+ void clean();
+public:
+ FX_DWORD m_dwNumber;
+ union {
+ struct {
+ FX_BYTE type : 6;
+ FX_BYTE page_association_size : 1;
+ FX_BYTE deferred_non_retain : 1;
+ } s;
+ FX_BYTE c;
+ } m_cFlags;
+ FX_INT32 m_nReferred_to_segment_count;
+ FX_DWORD * m_pReferred_to_segment_numbers;
+ FX_DWORD m_dwPage_association;
+ FX_DWORD m_dwData_length;
+
+ FX_DWORD m_dwHeader_Length;
+ FX_BYTE *m_pData;
+ JBig2_SegmentState m_State;
+ JBig2_ResultType m_nResultType;
+ union {
+ CJBig2_SymbolDict *sd;
+ CJBig2_PatternDict *pd;
+ CJBig2_Image *im;
+ CJBig2_HuffmanTable *ht;
+ FX_LPVOID vd;
+ } m_Result;
+};
+#endif
diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
new file mode 100644
index 0000000000..8516c045c6
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "JBig2_SymbolDict.h"
+CJBig2_SymbolDict::CJBig2_SymbolDict()
+{
+ SDNUMEXSYMS = 0;
+ SDEXSYMS = NULL;
+ m_bContextRetained = FALSE;
+ m_gbContext = m_grContext = NULL;
+}
+
+CJBig2_SymbolDict::~CJBig2_SymbolDict()
+{
+ if(SDEXSYMS) {
+ for(FX_DWORD i = 0; i < SDNUMEXSYMS; i++) {
+ if(SDEXSYMS[i]) {
+ delete SDEXSYMS[i];
+ }
+ }
+ m_pModule->JBig2_Free(SDEXSYMS);
+ }
+ if(m_bContextRetained) {
+ if(m_gbContext) {
+ m_pModule->JBig2_Free(m_gbContext);
+ }
+ if(m_grContext) {
+ m_pModule->JBig2_Free(m_grContext);
+ }
+ }
+}
diff --git a/core/src/fxcodec/jbig2/JBig2_SymbolDict.h b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
new file mode 100644
index 0000000000..cb97a167d1
--- /dev/null
+++ b/core/src/fxcodec/jbig2/JBig2_SymbolDict.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JBIG2_SYMBOL_DICT_H_
+#define _JBIG2_SYMBOL_DICT_H_
+#include "JBig2_Define.h"
+#include "JBig2_ArithDecoder.h"
+#include "JBig2_Image.h"
+class CJBig2_SymbolDict : public CJBig2_Object
+{
+public:
+
+ CJBig2_SymbolDict();
+
+ ~CJBig2_SymbolDict();
+public:
+ FX_DWORD SDNUMEXSYMS;
+ CJBig2_Image **SDEXSYMS;
+ FX_BOOL m_bContextRetained;
+ JBig2ArithCtx *m_gbContext,
+ *m_grContext;
+};
+#endif
diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2.h b/core/src/fxcodec/lcms2/include/fx_lcms2.h
new file mode 100644
index 0000000000..53038322d3
--- /dev/null
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_LCMS2_H_
+#define _FX_LCMS2_H_
+#include "../lcms2-2.6/include/lcms2.h"
+#endif
diff --git a/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
new file mode 100644
index 0000000000..1103b7f698
--- /dev/null
+++ b/core/src/fxcodec/lcms2/include/fx_lcms2_plugin.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_LCMS2_H_
+#define _FX_LCMS2_H_
+#include "../lcms2-2.6/include/lcms2_plugin.h"
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h
new file mode 100644
index 0000000000..8595f70203
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2.h
@@ -0,0 +1,1882 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+// Version 2.6
+//
+
+#ifndef _lcms2_H
+
+// ********** Configuration toggles ****************************************
+
+// Uncomment this one if you are using big endian machines
+// #define CMS_USE_BIG_ENDIAN 1
+
+// Uncomment this one if your compiler/machine does NOT support the
+// "long long" type.
+// #define CMS_DONT_USE_INT64 1
+
+// Uncomment this if your compiler doesn't work with fast floor function
+// #define CMS_DONT_USE_FAST_FLOOR 1
+
+// Uncomment this line if you want lcms to use the black point tag in profile,
+// if commented, lcms will compute the black point by its own.
+// It is safer to leave it commented out
+// #define CMS_USE_PROFILE_BLACK_POINT_TAG 1
+
+// Uncomment this line if you are compiling as C++ and want a C++ API
+// #define CMS_USE_CPP_API
+
+// Uncomment this line if you need strict CGATS syntax. Makes CGATS files to
+// require "KEYWORD" on undefined identifiers, keep it comented out unless needed
+// #define CMS_STRICT_CGATS 1
+
+// Uncomment to get rid of the tables for "half" float support
+// #define CMS_NO_HALF_SUPPORT 1
+
+// Uncomment to get rid of pthreads/windows dependency
+// #define CMS_NO_PTHREADS 1
+
+// ********** End of configuration toggles ******************************
+
+// Needed for streams
+#include <stdio.h>
+
+// Needed for portability (C99 per 7.1.2)
+#include <limits.h>
+#include <time.h>
+#include <stddef.h>
+
+#ifndef CMS_USE_CPP_API
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
+
+// Version/release
+#define LCMS_VERSION 2060
+
+// I will give the chance of redefining basic types for compilers that are not fully C99 compliant
+#ifndef CMS_BASIC_TYPES_ALREADY_DEFINED
+
+// Base types
+typedef unsigned char cmsUInt8Number; // That is guaranteed by the C99 spec
+typedef signed char cmsInt8Number; // That is guaranteed by the C99 spec
+
+#if CHAR_BIT != 8
+# error "Unable to find 8 bit type, unsupported compiler"
+#endif
+
+// IEEE float storage numbers
+typedef float cmsFloat32Number;
+typedef double cmsFloat64Number;
+
+// 16-bit base types
+#if (USHRT_MAX == 65535U)
+ typedef unsigned short cmsUInt16Number;
+#elif (UINT_MAX == 65535U)
+ typedef unsigned int cmsUInt16Number;
+#else
+# error "Unable to find 16 bits unsigned type, unsupported compiler"
+#endif
+
+#if (SHRT_MAX == 32767)
+ typedef short cmsInt16Number;
+#elif (INT_MAX == 32767)
+ typedef int cmsInt16Number;
+#else
+# error "Unable to find 16 bits signed type, unsupported compiler"
+#endif
+
+// 32-bit base type
+#if (UINT_MAX == 4294967295U)
+ typedef unsigned int cmsUInt32Number;
+#elif (ULONG_MAX == 4294967295U)
+ typedef unsigned long cmsUInt32Number;
+#else
+# error "Unable to find 32 bit unsigned type, unsupported compiler"
+#endif
+
+#if (INT_MAX == +2147483647)
+ typedef int cmsInt32Number;
+#elif (LONG_MAX == +2147483647)
+ typedef long cmsInt32Number;
+#else
+# error "Unable to find 32 bit signed type, unsupported compiler"
+#endif
+
+// 64-bit base types
+#ifndef CMS_DONT_USE_INT64
+# if (ULONG_MAX == 18446744073709551615U)
+ typedef unsigned long cmsUInt64Number;
+# elif (ULLONG_MAX == 18446744073709551615U)
+ typedef unsigned long long cmsUInt64Number;
+# else
+# define CMS_DONT_USE_INT64 1
+# endif
+# if (LONG_MAX == +9223372036854775807)
+ typedef long cmsInt64Number;
+# elif (LLONG_MAX == +9223372036854775807)
+ typedef long long cmsInt64Number;
+# else
+# define CMS_DONT_USE_INT64 1
+# endif
+#endif
+#endif
+
+// In the case 64 bit numbers are not supported by the compiler
+#ifdef CMS_DONT_USE_INT64
+ typedef cmsUInt32Number cmsUInt64Number[2];
+ typedef cmsInt32Number cmsInt64Number[2];
+#endif
+
+// Derivative types
+typedef cmsUInt32Number cmsSignature;
+typedef cmsUInt16Number cmsU8Fixed8Number;
+typedef cmsInt32Number cmsS15Fixed16Number;
+typedef cmsUInt32Number cmsU16Fixed16Number;
+
+// Boolean type, which will be using the native integer
+typedef int cmsBool;
+
+// Try to detect windows
+#if defined (_WIN32) || defined(_WIN64) || defined(WIN32) || defined(_WIN32_)
+# define CMS_IS_WINDOWS_ 1
+#endif
+
+#ifdef _MSC_VER
+# define CMS_IS_WINDOWS_ 1
+#endif
+
+#ifdef __BORLANDC__
+# define CMS_IS_WINDOWS_ 1
+#endif
+
+// Try to detect big endian platforms. This list can be endless, so only some checks are performed over here.
+// you can pass this toggle to the compiler by using -DCMS_USE_BIG_ENDIAN or something similar
+
+#if defined(__sgi__) || defined(__sgi) || defined(sparc)
+# define CMS_USE_BIG_ENDIAN 1
+#endif
+
+#if defined(__s390__) || defined(__s390x__)
+# define CMS_USE_BIG_ENDIAN 1
+#endif
+
+# ifdef TARGET_CPU_PPC
+# if TARGET_CPU_PPC
+# define CMS_USE_BIG_ENDIAN 1
+# endif
+# endif
+
+#if defined(__powerpc__) || defined(__ppc__) || defined(TARGET_CPU_PPC)
+# define CMS_USE_BIG_ENDIAN 1
+# if defined (__GNUC__) && defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN)
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+// // Don't use big endian for PowerPC little endian mode
+# undef CMS_USE_BIG_ENDIAN
+# endif
+# endif
+#endif
+
+// WORDS_BIGENDIAN takes precedence
+#if defined(_HOST_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(WORDS_BIGENDIAN)
+# define CMS_USE_BIG_ENDIAN 1
+#endif
+
+#ifdef macintosh
+# ifdef __BIG_ENDIAN__
+# define CMS_USE_BIG_ENDIAN 1
+# endif
+# ifdef __LITTLE_ENDIAN__
+# undef CMS_USE_BIG_ENDIAN
+# endif
+#endif
+
+// Calling convention -- this is hardly platform and compiler dependent
+#ifdef CMS_IS_WINDOWS_
+# if defined(CMS_DLL) || defined(CMS_DLL_BUILD)
+# ifdef __BORLANDC__
+# define CMSEXPORT __stdcall _export
+# define CMSAPI
+# else
+# define CMSEXPORT _stdcall
+# ifdef CMS_DLL_BUILD
+# define CMSAPI __declspec(dllexport)
+# else
+# define CMSAPI __declspec(dllimport)
+# endif
+# endif
+# else
+# define CMSEXPORT
+# define CMSAPI
+# endif
+#else
+# define CMSEXPORT
+# define CMSAPI
+#endif
+
+#ifdef HasTHREADS
+# if HasTHREADS == 1
+# undef CMS_NO_PTHREADS
+# else
+# define CMS_NO_PTHREADS 1
+# endif
+#endif
+
+// Some common definitions
+#define cmsMAX_PATH 256
+
+#ifndef FALSE
+# define FALSE 0
+#endif
+#ifndef TRUE
+# define TRUE 1
+#endif
+
+// D50 XYZ normalized to Y=1.0
+#define cmsD50X 0.9642
+#define cmsD50Y 1.0
+#define cmsD50Z 0.8249
+
+// V4 perceptual black
+#define cmsPERCEPTUAL_BLACK_X 0.00336
+#define cmsPERCEPTUAL_BLACK_Y 0.0034731
+#define cmsPERCEPTUAL_BLACK_Z 0.00287
+
+// Definitions in ICC spec
+#define cmsMagicNumber 0x61637370 // 'acsp'
+#define lcmsSignature 0x6c636d73 // 'lcms'
+
+
+// Base ICC type definitions
+typedef enum {
+ cmsSigChromaticityType = 0x6368726D, // 'chrm'
+ cmsSigColorantOrderType = 0x636C726F, // 'clro'
+ cmsSigColorantTableType = 0x636C7274, // 'clrt'
+ cmsSigCrdInfoType = 0x63726469, // 'crdi'
+ cmsSigCurveType = 0x63757276, // 'curv'
+ cmsSigDataType = 0x64617461, // 'data'
+ cmsSigDictType = 0x64696374, // 'dict'
+ cmsSigDateTimeType = 0x6474696D, // 'dtim'
+ cmsSigDeviceSettingsType = 0x64657673, // 'devs'
+ cmsSigLut16Type = 0x6d667432, // 'mft2'
+ cmsSigLut8Type = 0x6d667431, // 'mft1'
+ cmsSigLutAtoBType = 0x6d414220, // 'mAB '
+ cmsSigLutBtoAType = 0x6d424120, // 'mBA '
+ cmsSigMeasurementType = 0x6D656173, // 'meas'
+ cmsSigMultiLocalizedUnicodeType = 0x6D6C7563, // 'mluc'
+ cmsSigMultiProcessElementType = 0x6D706574, // 'mpet'
+ cmsSigNamedColorType = 0x6E636f6C, // 'ncol' -- DEPRECATED!
+ cmsSigNamedColor2Type = 0x6E636C32, // 'ncl2'
+ cmsSigParametricCurveType = 0x70617261, // 'para'
+ cmsSigProfileSequenceDescType = 0x70736571, // 'pseq'
+ cmsSigProfileSequenceIdType = 0x70736964, // 'psid'
+ cmsSigResponseCurveSet16Type = 0x72637332, // 'rcs2'
+ cmsSigS15Fixed16ArrayType = 0x73663332, // 'sf32'
+ cmsSigScreeningType = 0x7363726E, // 'scrn'
+ cmsSigSignatureType = 0x73696720, // 'sig '
+ cmsSigTextType = 0x74657874, // 'text'
+ cmsSigTextDescriptionType = 0x64657363, // 'desc'
+ cmsSigU16Fixed16ArrayType = 0x75663332, // 'uf32'
+ cmsSigUcrBgType = 0x62666420, // 'bfd '
+ cmsSigUInt16ArrayType = 0x75693136, // 'ui16'
+ cmsSigUInt32ArrayType = 0x75693332, // 'ui32'
+ cmsSigUInt64ArrayType = 0x75693634, // 'ui64'
+ cmsSigUInt8ArrayType = 0x75693038, // 'ui08'
+ cmsSigVcgtType = 0x76636774, // 'vcgt'
+ cmsSigViewingConditionsType = 0x76696577, // 'view'
+ cmsSigXYZType = 0x58595A20 // 'XYZ '
+
+
+} cmsTagTypeSignature;
+
+// Base ICC tag definitions
+typedef enum {
+ cmsSigAToB0Tag = 0x41324230, // 'A2B0'
+ cmsSigAToB1Tag = 0x41324231, // 'A2B1'
+ cmsSigAToB2Tag = 0x41324232, // 'A2B2'
+ cmsSigBlueColorantTag = 0x6258595A, // 'bXYZ'
+ cmsSigBlueMatrixColumnTag = 0x6258595A, // 'bXYZ'
+ cmsSigBlueTRCTag = 0x62545243, // 'bTRC'
+ cmsSigBToA0Tag = 0x42324130, // 'B2A0'
+ cmsSigBToA1Tag = 0x42324131, // 'B2A1'
+ cmsSigBToA2Tag = 0x42324132, // 'B2A2'
+ cmsSigCalibrationDateTimeTag = 0x63616C74, // 'calt'
+ cmsSigCharTargetTag = 0x74617267, // 'targ'
+ cmsSigChromaticAdaptationTag = 0x63686164, // 'chad'
+ cmsSigChromaticityTag = 0x6368726D, // 'chrm'
+ cmsSigColorantOrderTag = 0x636C726F, // 'clro'
+ cmsSigColorantTableTag = 0x636C7274, // 'clrt'
+ cmsSigColorantTableOutTag = 0x636C6F74, // 'clot'
+ cmsSigColorimetricIntentImageStateTag = 0x63696973, // 'ciis'
+ cmsSigCopyrightTag = 0x63707274, // 'cprt'
+ cmsSigCrdInfoTag = 0x63726469, // 'crdi'
+ cmsSigDataTag = 0x64617461, // 'data'
+ cmsSigDateTimeTag = 0x6474696D, // 'dtim'
+ cmsSigDeviceMfgDescTag = 0x646D6E64, // 'dmnd'
+ cmsSigDeviceModelDescTag = 0x646D6464, // 'dmdd'
+ cmsSigDeviceSettingsTag = 0x64657673, // 'devs'
+ cmsSigDToB0Tag = 0x44324230, // 'D2B0'
+ cmsSigDToB1Tag = 0x44324231, // 'D2B1'
+ cmsSigDToB2Tag = 0x44324232, // 'D2B2'
+ cmsSigDToB3Tag = 0x44324233, // 'D2B3'
+ cmsSigBToD0Tag = 0x42324430, // 'B2D0'
+ cmsSigBToD1Tag = 0x42324431, // 'B2D1'
+ cmsSigBToD2Tag = 0x42324432, // 'B2D2'
+ cmsSigBToD3Tag = 0x42324433, // 'B2D3'
+ cmsSigGamutTag = 0x67616D74, // 'gamt'
+ cmsSigGrayTRCTag = 0x6b545243, // 'kTRC'
+ cmsSigGreenColorantTag = 0x6758595A, // 'gXYZ'
+ cmsSigGreenMatrixColumnTag = 0x6758595A, // 'gXYZ'
+ cmsSigGreenTRCTag = 0x67545243, // 'gTRC'
+ cmsSigLuminanceTag = 0x6C756d69, // 'lumi'
+ cmsSigMeasurementTag = 0x6D656173, // 'meas'
+ cmsSigMediaBlackPointTag = 0x626B7074, // 'bkpt'
+ cmsSigMediaWhitePointTag = 0x77747074, // 'wtpt'
+ cmsSigNamedColorTag = 0x6E636f6C, // 'ncol' // Deprecated by the ICC
+ cmsSigNamedColor2Tag = 0x6E636C32, // 'ncl2'
+ cmsSigOutputResponseTag = 0x72657370, // 'resp'
+ cmsSigPerceptualRenderingIntentGamutTag = 0x72696730, // 'rig0'
+ cmsSigPreview0Tag = 0x70726530, // 'pre0'
+ cmsSigPreview1Tag = 0x70726531, // 'pre1'
+ cmsSigPreview2Tag = 0x70726532, // 'pre2'
+ cmsSigProfileDescriptionTag = 0x64657363, // 'desc'
+ cmsSigProfileDescriptionMLTag = 0x6473636d, // 'dscm'
+ cmsSigProfileSequenceDescTag = 0x70736571, // 'pseq'
+ cmsSigProfileSequenceIdTag = 0x70736964, // 'psid'
+ cmsSigPs2CRD0Tag = 0x70736430, // 'psd0'
+ cmsSigPs2CRD1Tag = 0x70736431, // 'psd1'
+ cmsSigPs2CRD2Tag = 0x70736432, // 'psd2'
+ cmsSigPs2CRD3Tag = 0x70736433, // 'psd3'
+ cmsSigPs2CSATag = 0x70733273, // 'ps2s'
+ cmsSigPs2RenderingIntentTag = 0x70733269, // 'ps2i'
+ cmsSigRedColorantTag = 0x7258595A, // 'rXYZ'
+ cmsSigRedMatrixColumnTag = 0x7258595A, // 'rXYZ'
+ cmsSigRedTRCTag = 0x72545243, // 'rTRC'
+ cmsSigSaturationRenderingIntentGamutTag = 0x72696732, // 'rig2'
+ cmsSigScreeningDescTag = 0x73637264, // 'scrd'
+ cmsSigScreeningTag = 0x7363726E, // 'scrn'
+ cmsSigTechnologyTag = 0x74656368, // 'tech'
+ cmsSigUcrBgTag = 0x62666420, // 'bfd '
+ cmsSigViewingCondDescTag = 0x76756564, // 'vued'
+ cmsSigViewingConditionsTag = 0x76696577, // 'view'
+ cmsSigVcgtTag = 0x76636774, // 'vcgt'
+ cmsSigMetaTag = 0x6D657461 // 'meta'
+
+} cmsTagSignature;
+
+
+// ICC Technology tag
+typedef enum {
+ cmsSigDigitalCamera = 0x6463616D, // 'dcam'
+ cmsSigFilmScanner = 0x6673636E, // 'fscn'
+ cmsSigReflectiveScanner = 0x7273636E, // 'rscn'
+ cmsSigInkJetPrinter = 0x696A6574, // 'ijet'
+ cmsSigThermalWaxPrinter = 0x74776178, // 'twax'
+ cmsSigElectrophotographicPrinter = 0x6570686F, // 'epho'
+ cmsSigElectrostaticPrinter = 0x65737461, // 'esta'
+ cmsSigDyeSublimationPrinter = 0x64737562, // 'dsub'
+ cmsSigPhotographicPaperPrinter = 0x7270686F, // 'rpho'
+ cmsSigFilmWriter = 0x6670726E, // 'fprn'
+ cmsSigVideoMonitor = 0x7669646D, // 'vidm'
+ cmsSigVideoCamera = 0x76696463, // 'vidc'
+ cmsSigProjectionTelevision = 0x706A7476, // 'pjtv'
+ cmsSigCRTDisplay = 0x43525420, // 'CRT '
+ cmsSigPMDisplay = 0x504D4420, // 'PMD '
+ cmsSigAMDisplay = 0x414D4420, // 'AMD '
+ cmsSigPhotoCD = 0x4B504344, // 'KPCD'
+ cmsSigPhotoImageSetter = 0x696D6773, // 'imgs'
+ cmsSigGravure = 0x67726176, // 'grav'
+ cmsSigOffsetLithography = 0x6F666673, // 'offs'
+ cmsSigSilkscreen = 0x73696C6B, // 'silk'
+ cmsSigFlexography = 0x666C6578, // 'flex'
+ cmsSigMotionPictureFilmScanner = 0x6D706673, // 'mpfs'
+ cmsSigMotionPictureFilmRecorder = 0x6D706672, // 'mpfr'
+ cmsSigDigitalMotionPictureCamera = 0x646D7063, // 'dmpc'
+ cmsSigDigitalCinemaProjector = 0x64636A70 // 'dcpj'
+
+} cmsTechnologySignature;
+
+
+// ICC Color spaces
+typedef enum {
+ cmsSigXYZData = 0x58595A20, // 'XYZ '
+ cmsSigLabData = 0x4C616220, // 'Lab '
+ cmsSigLuvData = 0x4C757620, // 'Luv '
+ cmsSigYCbCrData = 0x59436272, // 'YCbr'
+ cmsSigYxyData = 0x59787920, // 'Yxy '
+ cmsSigRgbData = 0x52474220, // 'RGB '
+ cmsSigGrayData = 0x47524159, // 'GRAY'
+ cmsSigHsvData = 0x48535620, // 'HSV '
+ cmsSigHlsData = 0x484C5320, // 'HLS '
+ cmsSigCmykData = 0x434D594B, // 'CMYK'
+ cmsSigCmyData = 0x434D5920, // 'CMY '
+ cmsSigMCH1Data = 0x4D434831, // 'MCH1'
+ cmsSigMCH2Data = 0x4D434832, // 'MCH2'
+ cmsSigMCH3Data = 0x4D434833, // 'MCH3'
+ cmsSigMCH4Data = 0x4D434834, // 'MCH4'
+ cmsSigMCH5Data = 0x4D434835, // 'MCH5'
+ cmsSigMCH6Data = 0x4D434836, // 'MCH6'
+ cmsSigMCH7Data = 0x4D434837, // 'MCH7'
+ cmsSigMCH8Data = 0x4D434838, // 'MCH8'
+ cmsSigMCH9Data = 0x4D434839, // 'MCH9'
+ cmsSigMCHAData = 0x4D434841, // 'MCHA'
+ cmsSigMCHBData = 0x4D434842, // 'MCHB'
+ cmsSigMCHCData = 0x4D434843, // 'MCHC'
+ cmsSigMCHDData = 0x4D434844, // 'MCHD'
+ cmsSigMCHEData = 0x4D434845, // 'MCHE'
+ cmsSigMCHFData = 0x4D434846, // 'MCHF'
+ cmsSigNamedData = 0x6e6d636c, // 'nmcl'
+ cmsSig1colorData = 0x31434C52, // '1CLR'
+ cmsSig2colorData = 0x32434C52, // '2CLR'
+ cmsSig3colorData = 0x33434C52, // '3CLR'
+ cmsSig4colorData = 0x34434C52, // '4CLR'
+ cmsSig5colorData = 0x35434C52, // '5CLR'
+ cmsSig6colorData = 0x36434C52, // '6CLR'
+ cmsSig7colorData = 0x37434C52, // '7CLR'
+ cmsSig8colorData = 0x38434C52, // '8CLR'
+ cmsSig9colorData = 0x39434C52, // '9CLR'
+ cmsSig10colorData = 0x41434C52, // 'ACLR'
+ cmsSig11colorData = 0x42434C52, // 'BCLR'
+ cmsSig12colorData = 0x43434C52, // 'CCLR'
+ cmsSig13colorData = 0x44434C52, // 'DCLR'
+ cmsSig14colorData = 0x45434C52, // 'ECLR'
+ cmsSig15colorData = 0x46434C52, // 'FCLR'
+ cmsSigLuvKData = 0x4C75764B // 'LuvK'
+
+} cmsColorSpaceSignature;
+
+// ICC Profile Class
+typedef enum {
+ cmsSigInputClass = 0x73636E72, // 'scnr'
+ cmsSigDisplayClass = 0x6D6E7472, // 'mntr'
+ cmsSigOutputClass = 0x70727472, // 'prtr'
+ cmsSigLinkClass = 0x6C696E6B, // 'link'
+ cmsSigAbstractClass = 0x61627374, // 'abst'
+ cmsSigColorSpaceClass = 0x73706163, // 'spac'
+ cmsSigNamedColorClass = 0x6e6d636c // 'nmcl'
+
+} cmsProfileClassSignature;
+
+// ICC Platforms
+typedef enum {
+ cmsSigMacintosh = 0x4150504C, // 'APPL'
+ cmsSigMicrosoft = 0x4D534654, // 'MSFT'
+ cmsSigSolaris = 0x53554E57, // 'SUNW'
+ cmsSigSGI = 0x53474920, // 'SGI '
+ cmsSigTaligent = 0x54474E54, // 'TGNT'
+ cmsSigUnices = 0x2A6E6978 // '*nix' // From argyll -- Not official
+
+} cmsPlatformSignature;
+
+// Reference gamut
+#define cmsSigPerceptualReferenceMediumGamut 0x70726d67 //'prmg'
+
+// For cmsSigColorimetricIntentImageStateTag
+#define cmsSigSceneColorimetryEstimates 0x73636F65 //'scoe'
+#define cmsSigSceneAppearanceEstimates 0x73617065 //'sape'
+#define cmsSigFocalPlaneColorimetryEstimates 0x66706365 //'fpce'
+#define cmsSigReflectionHardcopyOriginalColorimetry 0x72686F63 //'rhoc'
+#define cmsSigReflectionPrintOutputColorimetry 0x72706F63 //'rpoc'
+
+// Multi process elements types
+typedef enum {
+ cmsSigCurveSetElemType = 0x63767374, //'cvst'
+ cmsSigMatrixElemType = 0x6D617466, //'matf'
+ cmsSigCLutElemType = 0x636C7574, //'clut'
+
+ cmsSigBAcsElemType = 0x62414353, // 'bACS'
+ cmsSigEAcsElemType = 0x65414353, // 'eACS'
+
+ // Custom from here, not in the ICC Spec
+ cmsSigXYZ2LabElemType = 0x6C327820, // 'l2x '
+ cmsSigLab2XYZElemType = 0x78326C20, // 'x2l '
+ cmsSigNamedColorElemType = 0x6E636C20, // 'ncl '
+ cmsSigLabV2toV4 = 0x32203420, // '2 4 '
+ cmsSigLabV4toV2 = 0x34203220, // '4 2 '
+
+ // Identities
+ cmsSigIdentityElemType = 0x69646E20, // 'idn '
+
+ // Float to floatPCS
+ cmsSigLab2FloatPCS = 0x64326C20, // 'd2l '
+ cmsSigFloatPCS2Lab = 0x6C326420, // 'l2d '
+ cmsSigXYZ2FloatPCS = 0x64327820, // 'd2x '
+ cmsSigFloatPCS2XYZ = 0x78326420 // 'x2d '
+
+} cmsStageSignature;
+
+// Types of CurveElements
+typedef enum {
+
+ cmsSigFormulaCurveSeg = 0x70617266, // 'parf'
+ cmsSigSampledCurveSeg = 0x73616D66, // 'samf'
+ cmsSigSegmentedCurve = 0x63757266 // 'curf'
+
+} cmsCurveSegSignature;
+
+// Used in ResponseCurveType
+#define cmsSigStatusA 0x53746141 //'StaA'
+#define cmsSigStatusE 0x53746145 //'StaE'
+#define cmsSigStatusI 0x53746149 //'StaI'
+#define cmsSigStatusT 0x53746154 //'StaT'
+#define cmsSigStatusM 0x5374614D //'StaM'
+#define cmsSigDN 0x444E2020 //'DN '
+#define cmsSigDNP 0x444E2050 //'DN P'
+#define cmsSigDNN 0x444E4E20 //'DNN '
+#define cmsSigDNNP 0x444E4E50 //'DNNP'
+
+// Device attributes, currently defined values correspond to the low 4 bytes
+// of the 8 byte attribute quantity
+#define cmsReflective 0
+#define cmsTransparency 1
+#define cmsGlossy 0
+#define cmsMatte 2
+
+// Common structures in ICC tags
+typedef struct {
+ cmsUInt32Number len;
+ cmsUInt32Number flag;
+ cmsUInt8Number data[1];
+
+} cmsICCData;
+
+// ICC date time
+typedef struct {
+ cmsUInt16Number year;
+ cmsUInt16Number month;
+ cmsUInt16Number day;
+ cmsUInt16Number hours;
+ cmsUInt16Number minutes;
+ cmsUInt16Number seconds;
+
+} cmsDateTimeNumber;
+
+// ICC XYZ
+typedef struct {
+ cmsS15Fixed16Number X;
+ cmsS15Fixed16Number Y;
+ cmsS15Fixed16Number Z;
+
+} cmsEncodedXYZNumber;
+
+
+// Profile ID as computed by MD5 algorithm
+typedef union {
+ cmsUInt8Number ID8[16];
+ cmsUInt16Number ID16[8];
+ cmsUInt32Number ID32[4];
+
+} cmsProfileID;
+
+
+// ----------------------------------------------------------------------------------------------
+// ICC profile internal base types. Strictly, shouldn't be declared in this header, but maybe
+// somebody want to use this info for accessing profile header directly, so here it is.
+
+// Profile header -- it is 32-bit aligned, so no issues are expected on alignment
+typedef struct {
+ cmsUInt32Number size; // Profile size in bytes
+ cmsSignature cmmId; // CMM for this profile
+ cmsUInt32Number version; // Format version number
+ cmsProfileClassSignature deviceClass; // Type of profile
+ cmsColorSpaceSignature colorSpace; // Color space of data
+ cmsColorSpaceSignature pcs; // PCS, XYZ or Lab only
+ cmsDateTimeNumber date; // Date profile was created
+ cmsSignature magic; // Magic Number to identify an ICC profile
+ cmsPlatformSignature platform; // Primary Platform
+ cmsUInt32Number flags; // Various bit settings
+ cmsSignature manufacturer; // Device manufacturer
+ cmsUInt32Number model; // Device model number
+ cmsUInt64Number attributes; // Device attributes
+ cmsUInt32Number renderingIntent;// Rendering intent
+ cmsEncodedXYZNumber illuminant; // Profile illuminant
+ cmsSignature creator; // Profile creator
+ cmsProfileID profileID; // Profile ID using MD5
+ cmsInt8Number reserved[28]; // Reserved for future use
+
+} cmsICCHeader;
+
+// ICC base tag
+typedef struct {
+ cmsTagTypeSignature sig;
+ cmsInt8Number reserved[4];
+
+} cmsTagBase;
+
+// A tag entry in directory
+typedef struct {
+ cmsTagSignature sig; // The tag signature
+ cmsUInt32Number offset; // Start of tag
+ cmsUInt32Number size; // Size in bytes
+
+} cmsTagEntry;
+
+// ----------------------------------------------------------------------------------------------
+
+// Little CMS specific typedefs
+
+typedef void* cmsHANDLE ; // Generic handle
+typedef void* cmsHPROFILE; // Opaque typedefs to hide internals
+typedef void* cmsHTRANSFORM;
+
+#define cmsMAXCHANNELS 16 // Maximum number of channels in ICC profiles
+
+// Format of pixel is defined by one cmsUInt32Number, using bit fields as follows
+//
+// 2 1 0
+// 3 2 10987 6 5 4 3 2 1 098 7654 321
+// A O TTTTT U Y F P X S EEE CCCC BBB
+//
+// A: Floating point -- With this flag we can differentiate 16 bits as float and as int
+// O: Optimized -- previous optimization already returns the final 8-bit value
+// T: Pixeltype
+// F: Flavor 0=MinIsBlack(Chocolate) 1=MinIsWhite(Vanilla)
+// P: Planar? 0=Chunky, 1=Planar
+// X: swap 16 bps endianess?
+// S: Do swap? ie, BGR, KYMC
+// E: Extra samples
+// C: Channels (Samples per pixel)
+// B: bytes per sample
+// Y: Swap first - changes ABGR to BGRA and KCMY to CMYK
+
+#define FLOAT_SH(a) ((a) << 22)
+#define OPTIMIZED_SH(s) ((s) << 21)
+#define COLORSPACE_SH(s) ((s) << 16)
+#define SWAPFIRST_SH(s) ((s) << 14)
+#define FLAVOR_SH(s) ((s) << 13)
+#define PLANAR_SH(p) ((p) << 12)
+#define ENDIAN16_SH(e) ((e) << 11)
+#define DOSWAP_SH(e) ((e) << 10)
+#define EXTRA_SH(e) ((e) << 7)
+#define CHANNELS_SH(c) ((c) << 3)
+#define BYTES_SH(b) (b)
+
+// These macros unpack format specifiers into integers
+#define T_FLOAT(a) (((a)>>22)&1)
+#define T_OPTIMIZED(o) (((o)>>21)&1)
+#define T_COLORSPACE(s) (((s)>>16)&31)
+#define T_SWAPFIRST(s) (((s)>>14)&1)
+#define T_FLAVOR(s) (((s)>>13)&1)
+#define T_PLANAR(p) (((p)>>12)&1)
+#define T_ENDIAN16(e) (((e)>>11)&1)
+#define T_DOSWAP(e) (((e)>>10)&1)
+#define T_EXTRA(e) (((e)>>7)&7)
+#define T_CHANNELS(c) (((c)>>3)&15)
+#define T_BYTES(b) ((b)&7)
+
+
+// Pixel types
+#define PT_ANY 0 // Don't check colorspace
+ // 1 & 2 are reserved
+#define PT_GRAY 3
+#define PT_RGB 4
+#define PT_CMY 5
+#define PT_CMYK 6
+#define PT_YCbCr 7
+#define PT_YUV 8 // Lu'v'
+#define PT_XYZ 9
+#define PT_Lab 10
+#define PT_YUVK 11 // Lu'v'K
+#define PT_HSV 12
+#define PT_HLS 13
+#define PT_Yxy 14
+
+#define PT_MCH1 15
+#define PT_MCH2 16
+#define PT_MCH3 17
+#define PT_MCH4 18
+#define PT_MCH5 19
+#define PT_MCH6 20
+#define PT_MCH7 21
+#define PT_MCH8 22
+#define PT_MCH9 23
+#define PT_MCH10 24
+#define PT_MCH11 25
+#define PT_MCH12 26
+#define PT_MCH13 27
+#define PT_MCH14 28
+#define PT_MCH15 29
+
+#define PT_LabV2 30 // Identical to PT_Lab, but using the V2 old encoding
+
+// Some (not all!) representations
+
+#ifndef TYPE_RGB_8 // TYPE_RGB_8 is a very common identifier, so don't include ours
+ // if user has it already defined.
+
+#define TYPE_GRAY_8 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAY_8_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_GRAY_16 (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAY_16_REV (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_GRAY_16_SE (COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1))
+#define TYPE_GRAYA_16 (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_GRAYA_16_SE (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_GRAYA_8_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_GRAYA_16_PLANAR (COLORSPACE_SH(PT_GRAY)|EXTRA_SH(1)|CHANNELS_SH(1)|BYTES_SH(2)|PLANAR_SH(1))
+
+#define TYPE_RGB_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_8 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_BGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_RGB_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGB_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGB_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_BGR_16 (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_BGR_16_SE (COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_RGBA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_RGBA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_RGBA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_RGBA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_ARGB_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ARGB_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
+#define TYPE_ARGB_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+
+#define TYPE_ABGR_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_ABGR_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_ABGR_16_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|PLANAR_SH(1))
+#define TYPE_ABGR_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_BGRA_8 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_8_PLANAR (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|PLANAR_SH(1))
+#define TYPE_BGRA_16 (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_BGRA_16_SE (COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMY_8 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_CMY_8_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMY_16 (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMY_16_PLANAR (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMY_16_SE (COLORSPACE_SH(PT_CMY)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_CMYK_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYKA_8 (COLORSPACE_SH(PT_CMYK)|EXTRA_SH(1)|CHANNELS_SH(4)|BYTES_SH(1))
+#define TYPE_CMYK_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1))
+#define TYPE_YUVK_8 TYPE_CMYK_8_REV
+#define TYPE_CMYK_8_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+#define TYPE_CMYK_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1))
+#define TYPE_YUVK_16 TYPE_CMYK_16_REV
+#define TYPE_CMYK_16_PLANAR (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+#define TYPE_KYMC_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+#define TYPE_KCMY_8 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_8_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16 (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_REV (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_KCMY_16_SE (COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1)|SWAPFIRST_SH(1))
+
+#define TYPE_CMYK5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1))
+#define TYPE_CMYK5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2))
+#define TYPE_CMYK5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC5_8 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16 (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC5_16_SE (COLORSPACE_SH(PT_MCH5)|CHANNELS_SH(5)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK6_8 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1))
+#define TYPE_CMYK6_8_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_CMYK6_16 (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2))
+#define TYPE_CMYK6_16_PLANAR (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_CMYK6_16_SE (COLORSPACE_SH(PT_MCH6)|CHANNELS_SH(6)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_CMYK7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1))
+#define TYPE_CMYK7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2))
+#define TYPE_CMYK7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC7_8 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16 (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC7_16_SE (COLORSPACE_SH(PT_MCH7)|CHANNELS_SH(7)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1))
+#define TYPE_CMYK8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2))
+#define TYPE_CMYK8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC8_8 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16 (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC8_16_SE (COLORSPACE_SH(PT_MCH8)|CHANNELS_SH(8)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1))
+#define TYPE_CMYK9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2))
+#define TYPE_CMYK9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC9_8 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16 (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC9_16_SE (COLORSPACE_SH(PT_MCH9)|CHANNELS_SH(9)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1))
+#define TYPE_CMYK10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2))
+#define TYPE_CMYK10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC10_8 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16 (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC10_16_SE (COLORSPACE_SH(PT_MCH10)|CHANNELS_SH(10)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1))
+#define TYPE_CMYK11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2))
+#define TYPE_CMYK11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC11_8 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16 (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC11_16_SE (COLORSPACE_SH(PT_MCH11)|CHANNELS_SH(11)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+#define TYPE_CMYK12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1))
+#define TYPE_CMYK12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2))
+#define TYPE_CMYK12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|ENDIAN16_SH(1))
+#define TYPE_KYMC12_8 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(1)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16 (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_KYMC12_16_SE (COLORSPACE_SH(PT_MCH12)|CHANNELS_SH(12)|BYTES_SH(2)|DOSWAP_SH(1)|ENDIAN16_SH(1))
+
+// Colorimetric
+#define TYPE_XYZ_16 (COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Lab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_LabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1))
+
+#define TYPE_ALab_8 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ALabV2_8 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_Lab_16 (COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_LabV2_16 (COLORSPACE_SH(PT_LabV2)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_Yxy_16 (COLORSPACE_SH(PT_Yxy)|CHANNELS_SH(3)|BYTES_SH(2))
+
+// YCbCr
+#define TYPE_YCbCr_8 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YCbCr_8_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YCbCr_16 (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YCbCr_16_PLANAR (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YCbCr_16_SE (COLORSPACE_SH(PT_YCbCr)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// YUV
+#define TYPE_YUV_8 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_YUV_8_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_YUV_16 (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_YUV_16_PLANAR (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_YUV_16_SE (COLORSPACE_SH(PT_YUV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HLS
+#define TYPE_HLS_8 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HLS_8_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HLS_16 (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HLS_16_PLANAR (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HLS_16_SE (COLORSPACE_SH(PT_HLS)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// HSV
+#define TYPE_HSV_8 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1))
+#define TYPE_HSV_8_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(1)|PLANAR_SH(1))
+#define TYPE_HSV_16 (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_HSV_16_PLANAR (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|PLANAR_SH(1))
+#define TYPE_HSV_16_SE (COLORSPACE_SH(PT_HSV)|CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1))
+
+// Named color index. Only 16 bits allowed (don't check colorspace)
+#define TYPE_NAMED_COLOR_INDEX (CHANNELS_SH(1)|BYTES_SH(2))
+
+// Float formatters.
+#define TYPE_XYZ_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_Lab_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_LabA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_GRAY_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(4))
+#define TYPE_RGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4))
+
+#define TYPE_RGBA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
+#define TYPE_ARGB_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|SWAPFIRST_SH(1))
+#define TYPE_BGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
+#define TYPE_BGRA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ABGR_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(4)|DOSWAP_SH(1))
+
+#define TYPE_CMYK_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(4))
+
+// Floating point formatters.
+// NOTE THAT 'BYTES' FIELD IS SET TO ZERO ON DLB because 8 bytes overflows the bitfield
+#define TYPE_XYZ_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_Lab_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_Lab)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_GRAY_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(0))
+#define TYPE_RGB_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0))
+#define TYPE_BGR_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(0)|DOSWAP_SH(1))
+#define TYPE_CMYK_DBL (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(0))
+
+// IEEE 754-2008 "half"
+#define TYPE_GRAY_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_GRAY)|CHANNELS_SH(1)|BYTES_SH(2))
+#define TYPE_RGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_CMYK_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_CMYK)|CHANNELS_SH(4)|BYTES_SH(2))
+
+#define TYPE_RGBA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2))
+#define TYPE_ARGB_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|SWAPFIRST_SH(1))
+#define TYPE_BGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+#define TYPE_BGRA_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1))
+#define TYPE_ABGR_HALF_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_RGB)|CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1))
+
+#endif
+
+// Colorspaces
+typedef struct {
+ cmsFloat64Number X;
+ cmsFloat64Number Y;
+ cmsFloat64Number Z;
+
+ } cmsCIEXYZ;
+
+typedef struct {
+ cmsFloat64Number x;
+ cmsFloat64Number y;
+ cmsFloat64Number Y;
+
+ } cmsCIExyY;
+
+typedef struct {
+ cmsFloat64Number L;
+ cmsFloat64Number a;
+ cmsFloat64Number b;
+
+ } cmsCIELab;
+
+typedef struct {
+ cmsFloat64Number L;
+ cmsFloat64Number C;
+ cmsFloat64Number h;
+
+ } cmsCIELCh;
+
+typedef struct {
+ cmsFloat64Number J;
+ cmsFloat64Number C;
+ cmsFloat64Number h;
+
+ } cmsJCh;
+
+typedef struct {
+ cmsCIEXYZ Red;
+ cmsCIEXYZ Green;
+ cmsCIEXYZ Blue;
+
+ } cmsCIEXYZTRIPLE;
+
+typedef struct {
+ cmsCIExyY Red;
+ cmsCIExyY Green;
+ cmsCIExyY Blue;
+
+ } cmsCIExyYTRIPLE;
+
+// Illuminant types for structs below
+#define cmsILLUMINANT_TYPE_UNKNOWN 0x0000000
+#define cmsILLUMINANT_TYPE_D50 0x0000001
+#define cmsILLUMINANT_TYPE_D65 0x0000002
+#define cmsILLUMINANT_TYPE_D93 0x0000003
+#define cmsILLUMINANT_TYPE_F2 0x0000004
+#define cmsILLUMINANT_TYPE_D55 0x0000005
+#define cmsILLUMINANT_TYPE_A 0x0000006
+#define cmsILLUMINANT_TYPE_E 0x0000007
+#define cmsILLUMINANT_TYPE_F8 0x0000008
+
+typedef struct {
+ cmsUInt32Number Observer; // 0 = unknown, 1=CIE 1931, 2=CIE 1964
+ cmsCIEXYZ Backing; // Value of backing
+ cmsUInt32Number Geometry; // 0=unknown, 1=45/0, 0/45 2=0d, d/0
+ cmsFloat64Number Flare; // 0..1.0
+ cmsUInt32Number IlluminantType;
+
+ } cmsICCMeasurementConditions;
+
+typedef struct {
+ cmsCIEXYZ IlluminantXYZ; // Not the same struct as CAM02,
+ cmsCIEXYZ SurroundXYZ; // This is for storing the tag
+ cmsUInt32Number IlluminantType; // viewing condition
+
+ } cmsICCViewingConditions;
+
+// Support of non-standard functions --------------------------------------------------------------------------------------
+
+CMSAPI int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2);
+CMSAPI long int CMSEXPORT cmsfilelength(FILE* f);
+
+
+// Context handling --------------------------------------------------------------------------------------------------------
+
+// Each context holds its owns globals and its own plug-ins. There is a global context with the id = 0 for lecacy compatibility
+// though using the global context is not recomended. Proper context handling makes lcms more thread-safe.
+
+typedef struct _cmsContext_struct* cmsContext;
+
+CMSAPI cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData);
+CMSAPI void CMSEXPORT cmsDeleteContext(cmsContext ContexID);
+CMSAPI cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData);
+CMSAPI void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID);
+
+// Plug-In registering --------------------------------------------------------------------------------------------------
+
+CMSAPI cmsBool CMSEXPORT cmsPlugin(void* Plugin);
+CMSAPI cmsBool CMSEXPORT cmsPluginTHR(cmsContext ContextID, void* Plugin);
+CMSAPI void CMSEXPORT cmsUnregisterPlugins(void);
+CMSAPI void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID);
+
+// Error logging ----------------------------------------------------------------------------------------------------------
+
+// There is no error handling at all. When a function fails, it returns proper value.
+// For example, all create functions does return NULL on failure. Other may return FALSE.
+// It may be interesting, for the developer, to know why the function is failing.
+// for that reason, lcms2 does offer a logging function. This function will get
+// an ENGLISH string with some clues on what is going wrong. You can show this
+// info to the end user if you wish, or just create some sort of log on disk.
+// The logging function should NOT terminate the program, as this obviously can leave
+// unfreed resources. It is the programmer's responsibility to check each function
+// return code to make sure it didn't fail.
+
+#define cmsERROR_UNDEFINED 0
+#define cmsERROR_FILE 1
+#define cmsERROR_RANGE 2
+#define cmsERROR_INTERNAL 3
+#define cmsERROR_NULL 4
+#define cmsERROR_READ 5
+#define cmsERROR_SEEK 6
+#define cmsERROR_WRITE 7
+#define cmsERROR_UNKNOWN_EXTENSION 8
+#define cmsERROR_COLORSPACE_CHECK 9
+#define cmsERROR_ALREADY_DEFINED 10
+#define cmsERROR_BAD_SIGNATURE 11
+#define cmsERROR_CORRUPTION_DETECTED 12
+#define cmsERROR_NOT_SUITABLE 13
+
+// Error logger is called with the ContextID when a message is raised. This gives the
+// chance to know which thread is responsible of the warning and any environment associated
+// with it. Non-multithreading applications may safely ignore this parameter.
+// Note that under certain special circumstances, ContextID may be NULL.
+typedef void (* cmsLogErrorHandlerFunction)(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
+
+// Allows user to set any specific logger
+CMSAPI void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn);
+CMSAPI void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn);
+
+// Conversions --------------------------------------------------------------------------------------------------------------
+
+// Returns pointers to constant structs
+CMSAPI const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void);
+CMSAPI const cmsCIExyY* CMSEXPORT cmsD50_xyY(void);
+
+// Colorimetric space conversions
+CMSAPI void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source);
+CMSAPI void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source);
+CMSAPI void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz);
+CMSAPI void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab);
+CMSAPI void CMSEXPORT cmsLab2LCh(cmsCIELCh*LCh, const cmsCIELab* Lab);
+CMSAPI void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh);
+
+// Encoding /Decoding on PCS
+CMSAPI void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
+CMSAPI void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3]);
+CMSAPI void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
+CMSAPI void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* Lab);
+CMSAPI void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fxyz, const cmsUInt16Number XYZ[3]);
+CMSAPI void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ);
+
+// DeltaE metrics
+CMSAPI cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2);
+CMSAPI cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c);
+CMSAPI cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh);
+
+// Temperature <-> Chromaticity (Black body)
+CMSAPI cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK);
+CMSAPI cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint);
+
+// Chromatic adaptation
+CMSAPI cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result, const cmsCIEXYZ* SourceWhitePt,
+ const cmsCIEXYZ* Illuminant,
+ const cmsCIEXYZ* Value);
+
+// CIECAM02 ---------------------------------------------------------------------------------------------------
+
+// Viewing conditions. Please note those are CAM model viewing conditions, and not the ICC tag viewing
+// conditions, which I'm naming cmsICCViewingConditions to make differences evident. Unfortunately, the tag
+// cannot deal with surround La, Yb and D value so is basically useless to store CAM02 viewing conditions.
+
+
+#define AVG_SURROUND 1
+#define DIM_SURROUND 2
+#define DARK_SURROUND 3
+#define CUTSHEET_SURROUND 4
+
+#define D_CALCULATE (-1)
+
+typedef struct {
+ cmsCIEXYZ whitePoint;
+ cmsFloat64Number Yb;
+ cmsFloat64Number La;
+ int surround;
+ cmsFloat64Number D_value;
+
+ } cmsViewingConditions;
+
+CMSAPI cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC);
+CMSAPI void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel);
+CMSAPI void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut);
+CMSAPI void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut);
+
+
+// Tone curves -----------------------------------------------------------------------------------------
+
+// This describes a curve segment. For a table of supported types, see the manual. User can increase the number of
+// available types by using a proper plug-in. Parametric segments allow 10 parameters at most
+
+typedef struct {
+ cmsFloat32Number x0, x1; // Domain; for x0 < x <= x1
+ cmsInt32Number Type; // Parametric type, Type == 0 means sampled segment. Negative values are reserved
+ cmsFloat64Number Params[10]; // Parameters if Type != 0
+ cmsUInt32Number nGridPoints; // Number of grid points if Type == 0
+ cmsFloat32Number* SampledPoints; // Points to an array of floats if Type == 0
+
+} cmsCurveSegment;
+
+// The internal representation is none of your business.
+typedef struct _cms_curve_struct cmsToneCurve;
+
+CMSAPI cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID, cmsInt32Number nSegments, const cmsCurveSegment Segments[]);
+CMSAPI cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[]);
+CMSAPI cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma);
+CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number values[]);
+CMSAPI cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[]);
+CMSAPI void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve);
+CMSAPI void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3]);
+CMSAPI cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* Src);
+CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma);
+CMSAPI cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InGamma);
+CMSAPI cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID, const cmsToneCurve* X, const cmsToneCurve* Y, cmsUInt32Number nPoints);
+CMSAPI cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda);
+CMSAPI cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v);
+CMSAPI cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v);
+CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* InGamma);
+CMSAPI cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve);
+CMSAPI cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t);
+CMSAPI cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t);
+CMSAPI cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t);
+CMSAPI cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision);
+
+// Tone curve tabular estimation
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t);
+CMSAPI const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t);
+
+
+// Implements pipelines of multi-processing elements -------------------------------------------------------------
+
+// Nothing to see here, move along
+typedef struct _cmsPipeline_struct cmsPipeline;
+typedef struct _cmsStage_struct cmsStage;
+
+// Those are hi-level pipelines
+CMSAPI cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels);
+CMSAPI void CMSEXPORT cmsPipelineFree(cmsPipeline* lut);
+CMSAPI cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* Orig);
+
+CMSAPI cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut);
+CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut);
+CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut);
+CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut);
+CMSAPI cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut);
+
+CMSAPI void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut);
+CMSAPI void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut);
+CMSAPI cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[], cmsFloat32Number Result[], cmsFloat32Number Hint[], const cmsPipeline* lut);
+CMSAPI cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2);
+CMSAPI cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On);
+
+// Where to place/locate the stages in the pipeline chain
+typedef enum { cmsAT_BEGIN, cmsAT_END } cmsStageLoc;
+
+CMSAPI int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe);
+CMSAPI void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe);
+
+// This function is quite useful to analyze the structure of a Pipeline and retrieve the Stage elements
+// that conform the Pipeline. It should be called with the Pipeline, the number of expected elements and
+// then a list of expected types followed with a list of double pointers to Stage elements. If
+// the function founds a match with current pipeline, it fills the pointers and returns TRUE
+// if not, returns FALSE without touching anything.
+CMSAPI cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...);
+
+// Matrix has double precision and CLUT has only float precision. That is because an ICC profile can encode
+// matrices with far more precision that CLUTS
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels);
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[]);
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols, const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset);
+
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID, cmsUInt32Number nGridPoints, cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
+
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsUInt16Number* Table);
+CMSAPI cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table);
+
+CMSAPI cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe);
+CMSAPI void CMSEXPORT cmsStageFree(cmsStage* mpe);
+CMSAPI cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe);
+CMSAPI cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe);
+CMSAPI cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe);
+CMSAPI void* CMSEXPORT cmsStageData(const cmsStage* mpe);
+
+// Sampling
+typedef cmsInt32Number (* cmsSAMPLER16) (register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register void * Cargo);
+
+typedef cmsInt32Number (* cmsSAMPLERFLOAT)(register const cmsFloat32Number In[],
+ register cmsFloat32Number Out[],
+ register void * Cargo);
+
+// Use this flag to prevent changes being written to destination
+#define SAMPLER_INSPECT 0x01000000
+
+// For CLUT only
+CMSAPI cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void* Cargo, cmsUInt32Number dwFlags);
+CMSAPI cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void* Cargo, cmsUInt32Number dwFlags);
+
+// Slicers
+CMSAPI cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+ cmsSAMPLER16 Sampler, void * Cargo);
+
+CMSAPI cmsBool CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+ cmsSAMPLERFLOAT Sampler, void * Cargo);
+
+// Multilocalized Unicode management ---------------------------------------------------------------------------------------
+
+typedef struct _cms_MLU_struct cmsMLU;
+
+#define cmsNoLanguage "\0\0"
+#define cmsNoCountry "\0\0"
+
+CMSAPI cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems);
+CMSAPI void CMSEXPORT cmsMLUfree(cmsMLU* mlu);
+CMSAPI cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu);
+
+CMSAPI cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ const char* ASCIIString);
+CMSAPI cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ const wchar_t* WideString);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ char* Buffer, cmsUInt32Number BufferSize);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ wchar_t* Buffer, cmsUInt32Number BufferSize);
+
+CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ char ObtainedLanguage[3], char ObtainedCountry[3]);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu);
+
+CMSAPI cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+ cmsUInt32Number idx,
+ char LanguageCode[3],
+ char CountryCode[3]);
+
+// Undercolorremoval & black generation -------------------------------------------------------------------------------------
+
+typedef struct {
+ cmsToneCurve* Ucr;
+ cmsToneCurve* Bg;
+ cmsMLU* Desc;
+
+} cmsUcrBg;
+
+// Screening ----------------------------------------------------------------------------------------------------------------
+
+#define cmsPRINTER_DEFAULT_SCREENS 0x0001
+#define cmsFREQUENCE_UNITS_LINES_CM 0x0000
+#define cmsFREQUENCE_UNITS_LINES_INCH 0x0002
+
+#define cmsSPOT_UNKNOWN 0
+#define cmsSPOT_PRINTER_DEFAULT 1
+#define cmsSPOT_ROUND 2
+#define cmsSPOT_DIAMOND 3
+#define cmsSPOT_ELLIPSE 4
+#define cmsSPOT_LINE 5
+#define cmsSPOT_SQUARE 6
+#define cmsSPOT_CROSS 7
+
+typedef struct {
+ cmsFloat64Number Frequency;
+ cmsFloat64Number ScreenAngle;
+ cmsUInt32Number SpotShape;
+
+} cmsScreeningChannel;
+
+typedef struct {
+ cmsUInt32Number Flag;
+ cmsUInt32Number nChannels;
+ cmsScreeningChannel Channels[cmsMAXCHANNELS];
+
+} cmsScreening;
+
+
+// Named color -----------------------------------------------------------------------------------------------------------------
+
+typedef struct _cms_NAMEDCOLORLIST_struct cmsNAMEDCOLORLIST;
+
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID,
+ cmsUInt32Number n,
+ cmsUInt32Number ColorantCount,
+ const char* Prefix, const char* Suffix);
+
+CMSAPI void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v);
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v);
+CMSAPI cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* v, const char* Name,
+ cmsUInt16Number PCS[3],
+ cmsUInt16Number Colorant[cmsMAXCHANNELS]);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* v);
+CMSAPI cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* v, const char* Name);
+
+CMSAPI cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,
+ char* Name,
+ char* Prefix,
+ char* Suffix,
+ cmsUInt16Number* PCS,
+ cmsUInt16Number* Colorant);
+
+// Retrieve named color list from transform
+CMSAPI cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform);
+
+// Profile sequence -----------------------------------------------------------------------------------------------------
+
+// Profile sequence descriptor. Some fields come from profile sequence descriptor tag, others
+// come from Profile Sequence Identifier Tag
+typedef struct {
+
+ cmsSignature deviceMfg;
+ cmsSignature deviceModel;
+ cmsUInt64Number attributes;
+ cmsTechnologySignature technology;
+ cmsProfileID ProfileID;
+ cmsMLU* Manufacturer;
+ cmsMLU* Model;
+ cmsMLU* Description;
+
+} cmsPSEQDESC;
+
+typedef struct {
+
+ cmsUInt32Number n;
+ cmsContext ContextID;
+ cmsPSEQDESC* seq;
+
+} cmsSEQ;
+
+CMSAPI cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n);
+CMSAPI cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq);
+CMSAPI void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq);
+
+// Dictionaries --------------------------------------------------------------------------------------------------------
+
+typedef struct _cmsDICTentry_struct {
+
+ struct _cmsDICTentry_struct* Next;
+
+ cmsMLU *DisplayName;
+ cmsMLU *DisplayValue;
+ wchar_t* Name;
+ wchar_t* Value;
+
+} cmsDICTentry;
+
+CMSAPI cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID);
+CMSAPI void CMSEXPORT cmsDictFree(cmsHANDLE hDict);
+CMSAPI cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict);
+
+CMSAPI cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue);
+CMSAPI const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict);
+CMSAPI const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e);
+
+// Access to Profile data ----------------------------------------------------------------------------------------------
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID);
+
+CMSAPI cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile);
+CMSAPI cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile);
+CMSAPI cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n);
+CMSAPI cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig);
+
+// Read and write pre-formatted data
+CMSAPI void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig);
+CMSAPI cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data);
+CMSAPI cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest);
+CMSAPI cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig);
+
+// Read and write raw data
+CMSAPI cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* Buffer, cmsUInt32Number BufferSize);
+CMSAPI cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size);
+
+// Access header data
+#define cmsEmbeddedProfileFalse 0x00000000
+#define cmsEmbeddedProfileTrue 0x00000001
+#define cmsUseAnywhere 0x00000000
+#define cmsUseWithEmbeddedDataOnly 0x00000002
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags);
+CMSAPI void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
+CMSAPI cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile);
+
+CMSAPI void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model);
+CMSAPI void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags);
+CMSAPI void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID);
+CMSAPI void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent);
+
+CMSAPI cmsColorSpaceSignature
+ CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs);
+CMSAPI cmsColorSpaceSignature
+ CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig);
+CMSAPI cmsProfileClassSignature
+ CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig);
+CMSAPI void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version);
+CMSAPI cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile);
+CMSAPI void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version);
+
+// How profiles may be used
+#define LCMS_USED_AS_INPUT 0
+#define LCMS_USED_AS_OUTPUT 1
+#define LCMS_USED_AS_PROOF 2
+
+CMSAPI cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
+CMSAPI cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile);
+CMSAPI cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection);
+
+// Translate form/to our notation to ICC
+CMSAPI cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation);
+CMSAPI int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace);
+
+// Build a suitable formatter for the colorspace of this profile
+CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
+CMSAPI cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat);
+
+
+// Localized info
+typedef enum {
+ cmsInfoDescription = 0,
+ cmsInfoManufacturer = 1,
+ cmsInfoModel = 2,
+ cmsInfoCopyright = 3
+} cmsInfoType;
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,
+ const char LanguageCode[3], const char CountryCode[3],
+ wchar_t* Buffer, cmsUInt32Number BufferSize);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,
+ const char LanguageCode[3], const char CountryCode[3],
+ char* Buffer, cmsUInt32Number BufferSize);
+
+// IO handlers ----------------------------------------------------------------------------------------------------------
+
+typedef struct _cms_io_handler cmsIOHANDLER;
+
+CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode);
+CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream);
+CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode);
+CMSAPI cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID);
+CMSAPI cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io);
+
+// MD5 message digest --------------------------------------------------------------------------------------------------
+
+CMSAPI cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile);
+CMSAPI cmsBool CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16]);
+
+// Profile high level funtions ------------------------------------------------------------------------------------------
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *ICCProfile, const char *sAccess);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char* sAccess);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char* sAccess);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void * MemPtr, cmsUInt32Number dwSize);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void * MemPtr, cmsUInt32Number dwSize);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io);
+CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write);
+CMSAPI cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile);
+
+CMSAPI cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName);
+CMSAPI cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream);
+CMSAPI cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded);
+CMSAPI cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io);
+
+// Predefined virtual profiles ------------------------------------------------------------------------------------------
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
+ const cmsCIExyY* WhitePoint,
+ const cmsCIExyYTRIPLE* Primaries,
+ cmsToneCurve* const TransferFunction[3]);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,
+ const cmsCIExyYTRIPLE* Primaries,
+ cmsToneCurve* const TransferFunction[3]);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
+ const cmsCIExyY* WhitePoint,
+ const cmsToneCurve* TransferFunction);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,
+ const cmsToneCurve* TransferFunction);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
+ cmsColorSpaceSignature ColorSpace,
+ cmsToneCurve* const TransferFunctions[]);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,
+ cmsToneCurve* const TransferFunctions[]);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
+ cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit);
+
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
+ int nLUTPoints,
+ cmsFloat64Number Bright,
+ cmsFloat64Number Contrast,
+ cmsFloat64Number Hue,
+ cmsFloat64Number Saturation,
+ int TempSrc,
+ int TempDest);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+ cmsFloat64Number Bright,
+ cmsFloat64Number Contrast,
+ cmsFloat64Number Hue,
+ cmsFloat64Number Saturation,
+ int TempSrc,
+ int TempDest);
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID);
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void);
+
+// Converts a transform to a devicelink profile
+CMSAPI cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags);
+
+// Intents ----------------------------------------------------------------------------------------------
+
+// ICC Intents
+#define INTENT_PERCEPTUAL 0
+#define INTENT_RELATIVE_COLORIMETRIC 1
+#define INTENT_SATURATION 2
+#define INTENT_ABSOLUTE_COLORIMETRIC 3
+
+// Non-ICC intents
+#define INTENT_PRESERVE_K_ONLY_PERCEPTUAL 10
+#define INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC 11
+#define INTENT_PRESERVE_K_ONLY_SATURATION 12
+#define INTENT_PRESERVE_K_PLANE_PERCEPTUAL 13
+#define INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC 14
+#define INTENT_PRESERVE_K_PLANE_SATURATION 15
+
+// Call with NULL as parameters to get the intent count
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions);
+
+// Flags
+
+#define cmsFLAGS_NOCACHE 0x0040 // Inhibit 1-pixel cache
+#define cmsFLAGS_NOOPTIMIZE 0x0100 // Inhibit optimizations
+#define cmsFLAGS_NULLTRANSFORM 0x0200 // Don't transform anyway
+
+// Proofing flags
+#define cmsFLAGS_GAMUTCHECK 0x1000 // Out of Gamut alarm
+#define cmsFLAGS_SOFTPROOFING 0x4000 // Do softproofing
+
+// Misc
+#define cmsFLAGS_BLACKPOINTCOMPENSATION 0x2000
+#define cmsFLAGS_NOWHITEONWHITEFIXUP 0x0004 // Don't fix scum dot
+#define cmsFLAGS_HIGHRESPRECALC 0x0400 // Use more memory to give better accurancy
+#define cmsFLAGS_LOWRESPRECALC 0x0800 // Use less memory to minimize resouces
+
+// For devicelink creation
+#define cmsFLAGS_8BITS_DEVICELINK 0x0008 // Create 8 bits devicelinks
+#define cmsFLAGS_GUESSDEVICECLASS 0x0020 // Guess device class (for transform2devicelink)
+#define cmsFLAGS_KEEP_SEQUENCE 0x0080 // Keep profile sequence for devicelink creation
+
+// Specific to a particular optimizations
+#define cmsFLAGS_FORCE_CLUT 0x0002 // Force CLUT optimization
+#define cmsFLAGS_CLUT_POST_LINEARIZATION 0x0001 // create postlinearization tables if possible
+#define cmsFLAGS_CLUT_PRE_LINEARIZATION 0x0010 // create prelinearization tables if possible
+
+// Fine-tune control over number of gridpoints
+#define cmsFLAGS_GRIDPOINTS(n) (((n) & 0xFF) << 16)
+
+// CRD special
+#define cmsFLAGS_NODEFAULTRESOURCEDEF 0x01000000
+
+// Transforms ---------------------------------------------------------------------------------------------------
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,
+ cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
+ cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsHPROFILE Proofing,
+ cmsUInt32Number Intent,
+ cmsUInt32Number ProofingIntent,
+ cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsHPROFILE Proofing,
+ cmsUInt32Number Intent,
+ cmsUInt32Number ProofingIntent,
+ cmsUInt32Number dwFlags);
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
+ cmsHPROFILE hProfiles[],
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags);
+
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags);
+
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
+ cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsUInt32Number Intents[],
+ cmsFloat64Number AdaptationStates[],
+ cmsHPROFILE hGamutProfile,
+ cmsUInt32Number nGamutPCSposition,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number dwFlags);
+
+CMSAPI void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform);
+
+CMSAPI void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+ const void * InputBuffer,
+ void * OutputBuffer,
+ cmsUInt32Number Size);
+
+CMSAPI void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform,
+ const void * InputBuffer,
+ void * OutputBuffer,
+ cmsUInt32Number Size,
+ cmsUInt32Number Stride);
+
+
+CMSAPI void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
+CMSAPI void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number NewAlarm[cmsMAXCHANNELS]);
+
+
+CMSAPI void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID,
+ const cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
+CMSAPI void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID,
+ cmsUInt16Number AlarmCodes[cmsMAXCHANNELS]);
+
+
+
+// Adaptation state for absolute colorimetric intent
+CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d);
+CMSAPI cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d);
+
+
+
+// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
+CMSAPI cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform);
+
+// Grab the input/output formats
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform);
+
+// For backwards compatibility
+CMSAPI cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat);
+
+
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray ----------------------------------------------------
+
+typedef enum { cmsPS_RESOURCE_CSA, cmsPS_RESOURCE_CRD } cmsPSResourceType;
+
+// lcms2 unified method to access postscript color resources
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
+ cmsPSResourceType Type,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags,
+ cmsIOHANDLER* io);
+
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
+CMSAPI cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags, void* Buffer, cmsUInt32Number dwBufferLen);
+
+
+// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
+
+CMSAPI cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID);
+CMSAPI void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8);
+
+// Tables
+CMSAPI cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8);
+CMSAPI cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE hIT8, cmsUInt32Number nTable);
+
+// Persistence
+CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName);
+CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len);
+// CMSAPI cmsHANDLE CMSEXPORT cmsIT8LoadFromIOhandler(cmsContext ContextID, cmsIOHANDLER* io);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName);
+CMSAPI cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded);
+
+// Properties
+CMSAPI const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* cComment);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* cProp, const char *Str);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer);
+
+
+CMSAPI const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* cProp);
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp);
+CMSAPI const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey);
+CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames);
+CMSAPI cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames);
+
+// Datasets
+CMSAPI const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col);
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col,
+ const char* Val);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col,
+ cmsFloat64Number Val);
+
+CMSAPI const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
+
+
+CMSAPI cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE hIT8, const char* cPatch, const char* cSample);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ const char *Val);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ cmsFloat64Number Val);
+
+CMSAPI int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample);
+CMSAPI cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE hIT8, int n, const char *Sample);
+CMSAPI int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames);
+
+CMSAPI const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer);
+CMSAPI int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch);
+
+// The LABEL extension
+CMSAPI int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType);
+
+CMSAPI cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample);
+
+// Formatter for double
+CMSAPI void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter);
+
+// Gamut boundary description routines ------------------------------------------------------------------------------
+
+CMSAPI cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID);
+CMSAPI void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD);
+CMSAPI cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
+CMSAPI cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGDB, cmsUInt32Number dwFlags);
+CMSAPI cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab);
+
+// Feature detection ----------------------------------------------------------------------------------------------
+
+// Estimate the black point
+CMSAPI cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
+CMSAPI cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags);
+
+// Estimate total area coverage
+CMSAPI cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile);
+
+
+// Poor man's gamut mapping
+CMSAPI cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
+ double amax, double amin,
+ double bmax, double bmin);
+
+#ifndef CMS_USE_CPP_API
+# ifdef __cplusplus
+ }
+# endif
+#endif
+
+#define _lcms2_H
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h
new file mode 100644
index 0000000000..0c95d1f73c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/include/lcms2_plugin.h
@@ -0,0 +1,637 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+// This is the plug-in header file. Normal LittleCMS clients should not use it.
+// It is provided for plug-in writters that may want to access the support
+// functions to do low level operations. All plug-in related structures
+// are defined here. Including this file forces to include the standard API too.
+
+#ifndef _lcms_plugin_H
+
+// Deal with Microsoft's attempt at deprecating C standard runtime functions
+#ifdef _MSC_VER
+# if (_MSC_VER >= 1400)
+# ifndef _CRT_SECURE_NO_DEPRECATE
+# define _CRT_SECURE_NO_DEPRECATE
+# endif
+# ifndef _CRT_SECURE_NO_WARNINGS
+# define _CRT_SECURE_NO_WARNINGS
+# endif
+# endif
+#endif
+
+#ifndef _lcms2_H
+#include "lcms2.h"
+#endif
+
+// We need some standard C functions.
+#include <stdlib.h>
+#include <math.h>
+#include <stdarg.h>
+#include <memory.h>
+#include <string.h>
+
+
+#ifndef CMS_USE_CPP_API
+# ifdef __cplusplus
+extern "C" {
+# endif
+#endif
+
+// Vector & Matrix operations -----------------------------------------------------------------------
+
+// Axis of the matrix/array. No specific meaning at all.
+#define VX 0
+#define VY 1
+#define VZ 2
+
+// Vectors
+typedef struct {
+ cmsFloat64Number n[3];
+
+ } cmsVEC3;
+
+// 3x3 Matrix
+typedef struct {
+ cmsVEC3 v[3];
+
+ } cmsMAT3;
+
+CMSAPI void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z);
+CMSAPI void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b);
+CMSAPI void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v);
+CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v);
+CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a);
+CMSAPI cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b);
+
+CMSAPI void CMSEXPORT _cmsMAT3identity(cmsMAT3* a);
+CMSAPI cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a);
+CMSAPI void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b);
+CMSAPI cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b);
+CMSAPI cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b);
+CMSAPI void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v);
+
+
+// Error logging -------------------------------------------------------------------------------------
+
+CMSAPI void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...);
+
+// Memory management ----------------------------------------------------------------------------------
+
+CMSAPI void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size);
+CMSAPI void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size);
+CMSAPI void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);
+CMSAPI void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);
+CMSAPI void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr);
+CMSAPI void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size);
+
+// I/O handler ----------------------------------------------------------------------------------
+
+struct _cms_io_handler {
+
+ void* stream; // Associated stream, which is implemented differently depending on media.
+
+ cmsContext ContextID;
+ cmsUInt32Number UsedSpace;
+ cmsUInt32Number ReportedSize;
+ char PhysicalFile[cmsMAX_PATH];
+
+ cmsUInt32Number (* Read)(struct _cms_io_handler* iohandler, void *Buffer,
+ cmsUInt32Number size,
+ cmsUInt32Number count);
+ cmsBool (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset);
+ cmsBool (* Close)(struct _cms_io_handler* iohandler);
+ cmsUInt32Number (* Tell)(struct _cms_io_handler* iohandler);
+ cmsBool (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size,
+ const void* Buffer);
+};
+
+// Endianess adjust functions
+CMSAPI cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word);
+CMSAPI cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number Value);
+CMSAPI void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord);
+
+// Helper IO functions
+CMSAPI cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ);
+CMSAPI cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array);
+
+CMSAPI cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n);
+CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n);
+CMSAPI cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n);
+CMSAPI cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n);
+CMSAPI cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n);
+CMSAPI cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n);
+CMSAPI cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ);
+CMSAPI cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array);
+
+// ICC base tag
+typedef struct {
+ cmsTagTypeSignature sig;
+ cmsInt8Number reserved[4];
+
+} _cmsTagBase;
+
+// Type base helper functions
+CMSAPI cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io);
+CMSAPI cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig);
+
+// Alignment functions
+CMSAPI cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io);
+CMSAPI cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io);
+
+// To deal with text streams. 2K at most
+CMSAPI cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...);
+
+// Fixed point helper functions
+CMSAPI cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8);
+CMSAPI cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val);
+
+CMSAPI cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32);
+CMSAPI cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v);
+
+// Date/time helper functions
+CMSAPI void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source);
+CMSAPI void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest);
+
+//----------------------------------------------------------------------------------------------------------
+
+// Shared callbacks for user data
+typedef void (* _cmsFreeUserDataFn)(cmsContext ContextID, void* Data);
+typedef void* (* _cmsDupUserDataFn)(cmsContext ContextID, const void* Data);
+
+//----------------------------------------------------------------------------------------------------------
+
+// Plug-in foundation
+#define cmsPluginMagicNumber 0x61637070 // 'acpp'
+
+#define cmsPluginMemHandlerSig 0x6D656D48 // 'memH'
+#define cmsPluginInterpolationSig 0x696E7048 // 'inpH'
+#define cmsPluginParametricCurveSig 0x70617248 // 'parH'
+#define cmsPluginFormattersSig 0x66726D48 // 'frmH
+#define cmsPluginTagTypeSig 0x74797048 // 'typH'
+#define cmsPluginTagSig 0x74616748 // 'tagH'
+#define cmsPluginRenderingIntentSig 0x696E7448 // 'intH'
+#define cmsPluginMultiProcessElementSig 0x6D706548 // 'mpeH'
+#define cmsPluginOptimizationSig 0x6F707448 // 'optH'
+#define cmsPluginTransformSig 0x7A666D48 // 'xfmH'
+#define cmsPluginMutexSig 0x6D747A48 // 'mtxH'
+
+typedef struct _cmsPluginBaseStruct {
+
+ cmsUInt32Number Magic; // 'acpp' signature
+ cmsUInt32Number ExpectedVersion; // Expected version of LittleCMS
+ cmsUInt32Number Type; // Type of plug-in
+ struct _cmsPluginBaseStruct* Next; // For multiple plugin definition. NULL for end of list.
+
+} cmsPluginBase;
+
+// Maximum number of types in a plugin array
+#define MAX_TYPES_IN_LCMS_PLUGIN 20
+
+//----------------------------------------------------------------------------------------------------------
+
+// Memory handler. Each new plug-in type replaces current behaviour
+
+typedef void* (* _cmsMallocFnPtrType)(cmsContext ContextID, cmsUInt32Number size);
+typedef void (* _cmsFreeFnPtrType)(cmsContext ContextID, void *Ptr);
+typedef void* (* _cmsReallocFnPtrType)(cmsContext ContextID, void* Ptr, cmsUInt32Number NewSize);
+
+typedef void* (* _cmsMalloZerocFnPtrType)(cmsContext ContextID, cmsUInt32Number size);
+typedef void* (* _cmsCallocFnPtrType)(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size);
+typedef void* (* _cmsDupFnPtrType)(cmsContext ContextID, const void* Org, cmsUInt32Number size);
+
+typedef struct {
+
+ cmsPluginBase base;
+
+ // Required
+ _cmsMallocFnPtrType MallocPtr;
+ _cmsFreeFnPtrType FreePtr;
+ _cmsReallocFnPtrType ReallocPtr;
+
+ // Optional
+ _cmsMalloZerocFnPtrType MallocZeroPtr;
+ _cmsCallocFnPtrType CallocPtr;
+ _cmsDupFnPtrType DupPtr;
+
+} cmsPluginMemHandler;
+
+
+// ------------------------------------------------------------------------------------------------------------------
+
+// Interpolation. 16 bits and floating point versions.
+struct _cms_interp_struc;
+
+// Interpolation callbacks
+
+// 16 bits forward interpolation. This function performs precision-limited linear interpolation
+// and is supposed to be quite fast. Implementation may be tetrahedral or trilinear, and plug-ins may
+// choose to implement any other interpolation algorithm.
+typedef void (* _cmsInterpFn16)(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const struct _cms_interp_struc* p);
+
+// Floating point forward interpolation. Full precision interpolation using floats. This is not a
+// time critical function. Implementation may be tetrahedral or trilinear, and plug-ins may
+// choose to implement any other interpolation algorithm.
+typedef void (* _cmsInterpFnFloat)(cmsFloat32Number const Input[],
+ cmsFloat32Number Output[],
+ const struct _cms_interp_struc* p);
+
+
+
+// This type holds a pointer to an interpolator that can be either 16 bits or float
+typedef union {
+ _cmsInterpFn16 Lerp16; // Forward interpolation in 16 bits
+ _cmsInterpFnFloat LerpFloat; // Forward interpolation in floating point
+} cmsInterpFunction;
+
+// Flags for interpolator selection
+#define CMS_LERP_FLAGS_16BITS 0x0000 // The default
+#define CMS_LERP_FLAGS_FLOAT 0x0001 // Requires different implementation
+#define CMS_LERP_FLAGS_TRILINEAR 0x0100 // Hint only
+
+
+#define MAX_INPUT_DIMENSIONS 8
+
+typedef struct _cms_interp_struc { // Used on all interpolations. Supplied by lcms2 when calling the interpolation function
+
+ cmsContext ContextID; // The calling thread
+
+ cmsUInt32Number dwFlags; // Keep original flags
+ cmsUInt32Number nInputs; // != 1 only in 3D interpolation
+ cmsUInt32Number nOutputs; // != 1 only in 3D interpolation
+
+ cmsUInt32Number nSamples[MAX_INPUT_DIMENSIONS]; // Valid on all kinds of tables
+ cmsUInt32Number Domain[MAX_INPUT_DIMENSIONS]; // Domain = nSamples - 1
+
+ cmsUInt32Number opta[MAX_INPUT_DIMENSIONS]; // Optimization for 3D CLUT. This is the number of nodes premultiplied for each
+ // dimension. For example, in 7 nodes, 7, 7^2 , 7^3, 7^4, etc. On non-regular
+ // Samplings may vary according of the number of nodes for each dimension.
+
+ const void *Table; // Points to the actual interpolation table
+ cmsInterpFunction Interpolation; // Points to the function to do the interpolation
+
+ } cmsInterpParams;
+
+// Interpolators factory
+typedef cmsInterpFunction (* cmsInterpFnFactory)(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);
+
+// The plug-in
+typedef struct {
+ cmsPluginBase base;
+
+ // Points to a user-supplied function which implements the factory
+ cmsInterpFnFactory InterpolatorsFactory;
+
+} cmsPluginInterpolation;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Parametric curves. A negative type means same function but analytically inverted. Max. number of params is 10
+
+// Evaluator callback for user-suplied parametric curves. May implement more than one type
+typedef cmsFloat64Number (* cmsParametricCurveEvaluator)(cmsInt32Number Type, const cmsFloat64Number Params[10], cmsFloat64Number R);
+
+// Plug-in may implement an arbitrary number of parametric curves
+typedef struct {
+ cmsPluginBase base;
+
+ cmsUInt32Number nFunctions; // Number of supported functions
+ cmsUInt32Number FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types
+ cmsUInt32Number ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function
+
+ cmsParametricCurveEvaluator Evaluator; // The evaluator
+
+} cmsPluginParametricCurves;
+//----------------------------------------------------------------------------------------------------------
+
+// Formatters. This plug-in adds new handlers, replacing them if they already exist. Formatters dealing with
+// cmsFloat32Number (bps = 4) or double (bps = 0) types are requested via FormatterFloat callback. Others come across
+// Formatter16 callback
+
+struct _cmstransform_struct;
+
+typedef cmsUInt8Number* (* cmsFormatter16)(register struct _cmstransform_struct* CMMcargo,
+ register cmsUInt16Number Values[],
+ register cmsUInt8Number* Buffer,
+ register cmsUInt32Number Stride);
+
+typedef cmsUInt8Number* (* cmsFormatterFloat)(struct _cmstransform_struct* CMMcargo,
+ cmsFloat32Number Values[],
+ cmsUInt8Number* Buffer,
+ cmsUInt32Number Stride);
+
+// This type holds a pointer to a formatter that can be either 16 bits or cmsFloat32Number
+typedef union {
+ cmsFormatter16 Fmt16;
+ cmsFormatterFloat FmtFloat;
+
+} cmsFormatter;
+
+#define CMS_PACK_FLAGS_16BITS 0x0000
+#define CMS_PACK_FLAGS_FLOAT 0x0001
+
+typedef enum { cmsFormatterInput=0, cmsFormatterOutput=1 } cmsFormatterDirection;
+
+typedef cmsFormatter (* cmsFormatterFactory)(cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
+ cmsFormatterDirection Dir,
+ cmsUInt32Number dwFlags); // precision
+
+// Plug-in may implement an arbitrary number of formatters
+typedef struct {
+ cmsPluginBase base;
+ cmsFormatterFactory FormattersFactory;
+
+} cmsPluginFormatters;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Tag type handler. Each type is free to return anything it wants, and it is up to the caller to
+// know in advance what is the type contained in the tag.
+typedef struct _cms_typehandler_struct {
+
+ cmsTagTypeSignature Signature; // The signature of the type
+
+ // Allocates and reads items
+ void * (* ReadPtr)(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ cmsUInt32Number* nItems,
+ cmsUInt32Number SizeOfTag);
+
+ // Writes n Items
+ cmsBool (* WritePtr)(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Ptr,
+ cmsUInt32Number nItems);
+
+ // Duplicate an item or array of items
+ void* (* DupPtr)(struct _cms_typehandler_struct* self,
+ const void *Ptr,
+ cmsUInt32Number n);
+
+ // Free all resources
+ void (* FreePtr)(struct _cms_typehandler_struct* self,
+ void *Ptr);
+
+ // Additional parameters used by the calling thread
+ cmsContext ContextID;
+ cmsUInt32Number ICCVersion;
+
+} cmsTagTypeHandler;
+
+// Each plug-in implements a single type
+typedef struct {
+ cmsPluginBase base;
+ cmsTagTypeHandler Handler;
+
+} cmsPluginTagType;
+
+//----------------------------------------------------------------------------------------------------------
+
+// This is the tag plugin, which identifies tags. For writing, a pointer to function is provided.
+// This function should return the desired type for this tag, given the version of profile
+// and the data being serialized.
+typedef struct {
+
+ cmsUInt32Number ElemCount; // If this tag needs an array, how many elements should keep
+
+ // For reading.
+ cmsUInt32Number nSupportedTypes; // In how many types this tag can come (MAX_TYPES_IN_LCMS_PLUGIN maximum)
+ cmsTagTypeSignature SupportedTypes[MAX_TYPES_IN_LCMS_PLUGIN];
+
+ // For writting
+ cmsTagTypeSignature (* DecideType)(cmsFloat64Number ICCVersion, const void *Data);
+
+} cmsTagDescriptor;
+
+// Plug-in implements a single tag
+typedef struct {
+ cmsPluginBase base;
+
+ cmsTagSignature Signature;
+ cmsTagDescriptor Descriptor;
+
+} cmsPluginTag;
+
+//----------------------------------------------------------------------------------------------------------
+
+// Custom intents. This function should join all profiles specified in the array in
+// a single LUT. Any custom intent in the chain redirects to custom function. If more than
+// one custom intent is found, the one located first is invoked. Usually users should use only one
+// custom intent, so mixing custom intents in same multiprofile transform is not supported.
+
+typedef cmsPipeline* (* cmsIntentFn)( cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+
+// Each plug-in defines a single intent number.
+typedef struct {
+ cmsPluginBase base;
+ cmsUInt32Number Intent;
+ cmsIntentFn Link;
+ char Description[256];
+
+} cmsPluginRenderingIntent;
+
+
+// The default ICC intents (perceptual, saturation, rel.col and abs.col)
+CMSAPI cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+
+//----------------------------------------------------------------------------------------------------------
+
+// Pipelines, Multi Process Elements.
+
+typedef void (* _cmsStageEvalFn) (const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage* mpe);
+typedef void*(* _cmsStageDupElemFn) (cmsStage* mpe);
+typedef void (* _cmsStageFreeElemFn) (cmsStage* mpe);
+
+
+// This function allocates a generic MPE
+CMSAPI cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,
+ cmsStageSignature Type,
+ cmsUInt32Number InputChannels,
+ cmsUInt32Number OutputChannels,
+ _cmsStageEvalFn EvalPtr, // Points to fn that evaluates the element (always in floating point)
+ _cmsStageDupElemFn DupElemPtr, // Points to a fn that duplicates the stage
+ _cmsStageFreeElemFn FreePtr, // Points to a fn that sets the element free
+ void* Data); // A generic pointer to whatever memory needed by the element
+typedef struct {
+ cmsPluginBase base;
+ cmsTagTypeHandler Handler;
+
+} cmsPluginMultiProcessElement;
+
+
+// Data kept in "Element" member of cmsStage
+
+// Curves
+typedef struct {
+ cmsUInt32Number nCurves;
+ cmsToneCurve** TheCurves;
+
+} _cmsStageToneCurvesData;
+
+// Matrix
+typedef struct {
+ cmsFloat64Number* Double; // floating point for the matrix
+ cmsFloat64Number* Offset; // The offset
+
+} _cmsStageMatrixData;
+
+// CLUT
+typedef struct {
+
+ union { // Can have only one of both representations at same time
+ cmsUInt16Number* T; // Points to the table 16 bits table
+ cmsFloat32Number* TFloat; // Points to the cmsFloat32Number table
+
+ } Tab;
+
+ cmsInterpParams* Params;
+ cmsUInt32Number nEntries;
+ cmsBool HasFloatValues;
+
+} _cmsStageCLutData;
+
+
+//----------------------------------------------------------------------------------------------------------
+// Optimization. Using this plug-in, additional optimization strategies may be implemented.
+// The function should return TRUE if any optimization is done on the LUT, this terminates
+// the optimization search. Or FALSE if it is unable to optimize and want to give a chance
+// to the rest of optimizers.
+
+typedef void (* _cmsOPTeval16Fn)(register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register const void* Data);
+
+
+typedef cmsBool (* _cmsOPToptimizeFn)(cmsPipeline** Lut,
+ cmsUInt32Number Intent,
+ cmsUInt32Number* InputFormat,
+ cmsUInt32Number* OutputFormat,
+ cmsUInt32Number* dwFlags);
+
+// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional
+// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.
+
+CMSAPI void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,
+ _cmsOPTeval16Fn Eval16,
+ void* PrivateData,
+ _cmsFreeUserDataFn FreePrivateDataFn,
+ _cmsDupUserDataFn DupPrivateDataFn);
+
+typedef struct {
+ cmsPluginBase base;
+
+ // Optimize entry point
+ _cmsOPToptimizeFn OptimizePtr;
+
+} cmsPluginOptimization;
+
+//----------------------------------------------------------------------------------------------------------
+// Full xform
+typedef void (* _cmsTransformFn)(struct _cmstransform_struct *CMMcargo,
+ const void* InputBuffer,
+ void* OutputBuffer,
+ cmsUInt32Number Size,
+ cmsUInt32Number Stride);
+
+typedef cmsBool (* _cmsTransformFactory)(_cmsTransformFn* xform,
+ void** UserData,
+ _cmsFreeUserDataFn* FreePrivateDataFn,
+ cmsPipeline** Lut,
+ cmsUInt32Number* InputFormat,
+ cmsUInt32Number* OutputFormat,
+ cmsUInt32Number* dwFlags);
+
+
+// Retrieve user data as specified by the factory
+CMSAPI void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn);
+CMSAPI void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo);
+
+
+// Retrieve formatters
+CMSAPI void CMSEXPORT _cmsGetTransformFormatters16 (struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput);
+CMSAPI void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput);
+
+typedef struct {
+ cmsPluginBase base;
+
+ // Transform entry point
+ _cmsTransformFactory Factory;
+
+} cmsPluginTransform;
+
+//----------------------------------------------------------------------------------------------------------
+// Mutex
+
+typedef void* (* _cmsCreateMutexFnPtrType)(cmsContext ContextID);
+typedef void (* _cmsDestroyMutexFnPtrType)(cmsContext ContextID, void* mtx);
+typedef cmsBool (* _cmsLockMutexFnPtrType)(cmsContext ContextID, void* mtx);
+typedef void (* _cmsUnlockMutexFnPtrType)(cmsContext ContextID, void* mtx);
+
+typedef struct {
+ cmsPluginBase base;
+
+ _cmsCreateMutexFnPtrType CreateMutexPtr;
+ _cmsDestroyMutexFnPtrType DestroyMutexPtr;
+ _cmsLockMutexFnPtrType LockMutexPtr;
+ _cmsUnlockMutexFnPtrType UnlockMutexPtr;
+
+} cmsPluginMutex;
+
+CMSAPI void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID);
+CMSAPI void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx);
+CMSAPI cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx);
+CMSAPI void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx);
+
+
+#ifndef CMS_USE_CPP_API
+# ifdef __cplusplus
+ }
+# endif
+#endif
+
+#define _lcms_plugin_H
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c
new file mode 100644
index 0000000000..9d874aa205
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscam02.c
@@ -0,0 +1,486 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// CIECAM 02 appearance model. Many thanks to Jordi Vilar for the debugging.
+
+// ---------- Implementation --------------------------------------------
+
+typedef struct {
+
+ cmsFloat64Number XYZ[3];
+ cmsFloat64Number RGB[3];
+ cmsFloat64Number RGBc[3];
+ cmsFloat64Number RGBp[3];
+ cmsFloat64Number RGBpa[3];
+ cmsFloat64Number a, b, h, e, H, A, J, Q, s, t, C, M;
+ cmsFloat64Number abC[2];
+ cmsFloat64Number abs[2];
+ cmsFloat64Number abM[2];
+
+} CAM02COLOR;
+
+typedef struct {
+
+ CAM02COLOR adoptedWhite;
+ cmsFloat64Number LA, Yb;
+ cmsFloat64Number F, c, Nc;
+ cmsUInt32Number surround;
+ cmsFloat64Number n, Nbb, Ncb, z, FL, D;
+
+ cmsContext ContextID;
+
+} cmsCIECAM02;
+
+
+static
+cmsFloat64Number compute_n(cmsCIECAM02* pMod)
+{
+ return (pMod -> Yb / pMod -> adoptedWhite.XYZ[1]);
+}
+
+static
+cmsFloat64Number compute_z(cmsCIECAM02* pMod)
+{
+ return (1.48 + pow(pMod -> n, 0.5));
+}
+
+static
+cmsFloat64Number computeNbb(cmsCIECAM02* pMod)
+{
+ return (0.725 * pow((1.0 / pMod -> n), 0.2));
+}
+
+static
+cmsFloat64Number computeFL(cmsCIECAM02* pMod)
+{
+ cmsFloat64Number k, FL;
+
+ k = 1.0 / ((5.0 * pMod->LA) + 1.0);
+ FL = 0.2 * pow(k, 4.0) * (5.0 * pMod->LA) + 0.1 *
+ (pow((1.0 - pow(k, 4.0)), 2.0)) *
+ (pow((5.0 * pMod->LA), (1.0 / 3.0)));
+
+ return FL;
+}
+
+static
+cmsFloat64Number computeD(cmsCIECAM02* pMod)
+{
+ cmsFloat64Number D;
+
+ D = pMod->F - (1.0/3.6)*(exp(((-pMod ->LA-42) / 92.0)));
+
+ return D;
+}
+
+
+static
+CAM02COLOR XYZtoCAT02(CAM02COLOR clr)
+{
+ clr.RGB[0] = (clr.XYZ[0] * 0.7328) + (clr.XYZ[1] * 0.4296) + (clr.XYZ[2] * -0.1624);
+ clr.RGB[1] = (clr.XYZ[0] * -0.7036) + (clr.XYZ[1] * 1.6975) + (clr.XYZ[2] * 0.0061);
+ clr.RGB[2] = (clr.XYZ[0] * 0.0030) + (clr.XYZ[1] * 0.0136) + (clr.XYZ[2] * 0.9834);
+
+ return clr;
+}
+
+static
+CAM02COLOR ChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+ cmsUInt32Number i;
+
+ for (i = 0; i < 3; i++) {
+ clr.RGBc[i] = ((pMod -> adoptedWhite.XYZ[1] *
+ (pMod->D / pMod -> adoptedWhite.RGB[i])) +
+ (1.0 - pMod->D)) * clr.RGB[i];
+ }
+
+ return clr;
+}
+
+
+static
+CAM02COLOR CAT02toHPE(CAM02COLOR clr)
+{
+ cmsFloat64Number M[9];
+
+ M[0] =(( 0.38971 * 1.096124) + (0.68898 * 0.454369) + (-0.07868 * -0.009628));
+ M[1] =(( 0.38971 * -0.278869) + (0.68898 * 0.473533) + (-0.07868 * -0.005698));
+ M[2] =(( 0.38971 * 0.182745) + (0.68898 * 0.072098) + (-0.07868 * 1.015326));
+ M[3] =((-0.22981 * 1.096124) + (1.18340 * 0.454369) + ( 0.04641 * -0.009628));
+ M[4] =((-0.22981 * -0.278869) + (1.18340 * 0.473533) + ( 0.04641 * -0.005698));
+ M[5] =((-0.22981 * 0.182745) + (1.18340 * 0.072098) + ( 0.04641 * 1.015326));
+ M[6] =(-0.009628);
+ M[7] =(-0.005698);
+ M[8] =( 1.015326);
+
+ clr.RGBp[0] = (clr.RGBc[0] * M[0]) + (clr.RGBc[1] * M[1]) + (clr.RGBc[2] * M[2]);
+ clr.RGBp[1] = (clr.RGBc[0] * M[3]) + (clr.RGBc[1] * M[4]) + (clr.RGBc[2] * M[5]);
+ clr.RGBp[2] = (clr.RGBc[0] * M[6]) + (clr.RGBc[1] * M[7]) + (clr.RGBc[2] * M[8]);
+
+ return clr;
+}
+
+static
+CAM02COLOR NonlinearCompression(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+ cmsUInt32Number i;
+ cmsFloat64Number temp;
+
+ for (i = 0; i < 3; i++) {
+ if (clr.RGBp[i] < 0) {
+
+ temp = pow((-1.0 * pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+ clr.RGBpa[i] = (-1.0 * 400.0 * temp) / (temp + 27.13) + 0.1;
+ }
+ else {
+ temp = pow((pMod->FL * clr.RGBp[i] / 100.0), 0.42);
+ clr.RGBpa[i] = (400.0 * temp) / (temp + 27.13) + 0.1;
+ }
+ }
+
+ clr.A = (((2.0 * clr.RGBpa[0]) + clr.RGBpa[1] +
+ (clr.RGBpa[2] / 20.0)) - 0.305) * pMod->Nbb;
+
+ return clr;
+}
+
+static
+CAM02COLOR ComputeCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+ cmsFloat64Number a, b, temp, e, t, r2d, d2r;
+
+ a = clr.RGBpa[0] - (12.0 * clr.RGBpa[1] / 11.0) + (clr.RGBpa[2] / 11.0);
+ b = (clr.RGBpa[0] + clr.RGBpa[1] - (2.0 * clr.RGBpa[2])) / 9.0;
+
+ r2d = (180.0 / 3.141592654);
+ if (a == 0) {
+ if (b == 0) clr.h = 0;
+ else if (b > 0) clr.h = 90;
+ else clr.h = 270;
+ }
+ else if (a > 0) {
+ temp = b / a;
+ if (b > 0) clr.h = (r2d * atan(temp));
+ else if (b == 0) clr.h = 0;
+ else clr.h = (r2d * atan(temp)) + 360;
+ }
+ else {
+ temp = b / a;
+ clr.h = (r2d * atan(temp)) + 180;
+ }
+
+ d2r = (3.141592654 / 180.0);
+ e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+ (cos((clr.h * d2r + 2.0)) + 3.8);
+
+ if (clr.h < 20.14) {
+ temp = ((clr.h + 122.47)/1.2) + ((20.14 - clr.h)/0.8);
+ clr.H = 300 + (100*((clr.h + 122.47)/1.2)) / temp;
+ }
+ else if (clr.h < 90.0) {
+ temp = ((clr.h - 20.14)/0.8) + ((90.00 - clr.h)/0.7);
+ clr.H = (100*((clr.h - 20.14)/0.8)) / temp;
+ }
+ else if (clr.h < 164.25) {
+ temp = ((clr.h - 90.00)/0.7) + ((164.25 - clr.h)/1.0);
+ clr.H = 100 + ((100*((clr.h - 90.00)/0.7)) / temp);
+ }
+ else if (clr.h < 237.53) {
+ temp = ((clr.h - 164.25)/1.0) + ((237.53 - clr.h)/1.2);
+ clr.H = 200 + ((100*((clr.h - 164.25)/1.0)) / temp);
+ }
+ else {
+ temp = ((clr.h - 237.53)/1.2) + ((360 - clr.h + 20.14)/0.8);
+ clr.H = 300 + ((100*((clr.h - 237.53)/1.2)) / temp);
+ }
+
+ clr.J = 100.0 * pow((clr.A / pMod->adoptedWhite.A),
+ (pMod->c * pMod->z));
+
+ clr.Q = (4.0 / pMod->c) * pow((clr.J / 100.0), 0.5) *
+ (pMod->adoptedWhite.A + 4.0) * pow(pMod->FL, 0.25);
+
+ t = (e * pow(((a * a) + (b * b)), 0.5)) /
+ (clr.RGBpa[0] + clr.RGBpa[1] +
+ ((21.0 / 20.0) * clr.RGBpa[2]));
+
+ clr.C = pow(t, 0.9) * pow((clr.J / 100.0), 0.5) *
+ pow((1.64 - pow(0.29, pMod->n)), 0.73);
+
+ clr.M = clr.C * pow(pMod->FL, 0.25);
+ clr.s = 100.0 * pow((clr.M / clr.Q), 0.5);
+
+ return clr;
+}
+
+
+static
+CAM02COLOR InverseCorrelates(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+
+ cmsFloat64Number t, e, p1, p2, p3, p4, p5, hr, d2r;
+ d2r = 3.141592654 / 180.0;
+
+ t = pow( (clr.C / (pow((clr.J / 100.0), 0.5) *
+ (pow((1.64 - pow(0.29, pMod->n)), 0.73)))),
+ (1.0 / 0.9) );
+ e = ((12500.0 / 13.0) * pMod->Nc * pMod->Ncb) *
+ (cos((clr.h * d2r + 2.0)) + 3.8);
+
+ clr.A = pMod->adoptedWhite.A * pow(
+ (clr.J / 100.0),
+ (1.0 / (pMod->c * pMod->z)));
+
+ p1 = e / t;
+ p2 = (clr.A / pMod->Nbb) + 0.305;
+ p3 = 21.0 / 20.0;
+
+ hr = clr.h * d2r;
+
+ if (fabs(sin(hr)) >= fabs(cos(hr))) {
+ p4 = p1 / sin(hr);
+ clr.b = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+ (p4 + (2.0 + p3) * (220.0 / 1403.0) *
+ (cos(hr) / sin(hr)) - (27.0 / 1403.0) +
+ p3 * (6300.0 / 1403.0));
+ clr.a = clr.b * (cos(hr) / sin(hr));
+ }
+ else {
+ p5 = p1 / cos(hr);
+ clr.a = (p2 * (2.0 + p3) * (460.0 / 1403.0)) /
+ (p5 + (2.0 + p3) * (220.0 / 1403.0) -
+ ((27.0 / 1403.0) - p3 * (6300.0 / 1403.0)) *
+ (sin(hr) / cos(hr)));
+ clr.b = clr.a * (sin(hr) / cos(hr));
+ }
+
+ clr.RGBpa[0] = ((460.0 / 1403.0) * p2) +
+ ((451.0 / 1403.0) * clr.a) +
+ ((288.0 / 1403.0) * clr.b);
+ clr.RGBpa[1] = ((460.0 / 1403.0) * p2) -
+ ((891.0 / 1403.0) * clr.a) -
+ ((261.0 / 1403.0) * clr.b);
+ clr.RGBpa[2] = ((460.0 / 1403.0) * p2) -
+ ((220.0 / 1403.0) * clr.a) -
+ ((6300.0 / 1403.0) * clr.b);
+
+ return clr;
+}
+
+static
+CAM02COLOR InverseNonlinearity(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+ cmsUInt32Number i;
+ cmsFloat64Number c1;
+
+ for (i = 0; i < 3; i++) {
+ if ((clr.RGBpa[i] - 0.1) < 0) c1 = -1;
+ else c1 = 1;
+ clr.RGBp[i] = c1 * (100.0 / pMod->FL) *
+ pow(((27.13 * fabs(clr.RGBpa[i] - 0.1)) /
+ (400.0 - fabs(clr.RGBpa[i] - 0.1))),
+ (1.0 / 0.42));
+ }
+
+ return clr;
+}
+
+static
+CAM02COLOR HPEtoCAT02(CAM02COLOR clr)
+{
+ cmsFloat64Number M[9];
+
+ M[0] = (( 0.7328 * 1.910197) + (0.4296 * 0.370950));
+ M[1] = (( 0.7328 * -1.112124) + (0.4296 * 0.629054));
+ M[2] = (( 0.7328 * 0.201908) + (0.4296 * 0.000008) - 0.1624);
+ M[3] = ((-0.7036 * 1.910197) + (1.6975 * 0.370950));
+ M[4] = ((-0.7036 * -1.112124) + (1.6975 * 0.629054));
+ M[5] = ((-0.7036 * 0.201908) + (1.6975 * 0.000008) + 0.0061);
+ M[6] = (( 0.0030 * 1.910197) + (0.0136 * 0.370950));
+ M[7] = (( 0.0030 * -1.112124) + (0.0136 * 0.629054));
+ M[8] = (( 0.0030 * 0.201908) + (0.0136 * 0.000008) + 0.9834);;
+
+ clr.RGBc[0] = (clr.RGBp[0] * M[0]) + (clr.RGBp[1] * M[1]) + (clr.RGBp[2] * M[2]);
+ clr.RGBc[1] = (clr.RGBp[0] * M[3]) + (clr.RGBp[1] * M[4]) + (clr.RGBp[2] * M[5]);
+ clr.RGBc[2] = (clr.RGBp[0] * M[6]) + (clr.RGBp[1] * M[7]) + (clr.RGBp[2] * M[8]);
+ return clr;
+}
+
+
+static
+CAM02COLOR InverseChromaticAdaptation(CAM02COLOR clr, cmsCIECAM02* pMod)
+{
+ cmsUInt32Number i;
+ for (i = 0; i < 3; i++) {
+ clr.RGB[i] = clr.RGBc[i] /
+ ((pMod->adoptedWhite.XYZ[1] * pMod->D / pMod->adoptedWhite.RGB[i]) + 1.0 - pMod->D);
+ }
+ return clr;
+}
+
+
+static
+CAM02COLOR CAT02toXYZ(CAM02COLOR clr)
+{
+ clr.XYZ[0] = (clr.RGB[0] * 1.096124) + (clr.RGB[1] * -0.278869) + (clr.RGB[2] * 0.182745);
+ clr.XYZ[1] = (clr.RGB[0] * 0.454369) + (clr.RGB[1] * 0.473533) + (clr.RGB[2] * 0.072098);
+ clr.XYZ[2] = (clr.RGB[0] * -0.009628) + (clr.RGB[1] * -0.005698) + (clr.RGB[2] * 1.015326);
+
+ return clr;
+}
+
+
+cmsHANDLE CMSEXPORT cmsCIECAM02Init(cmsContext ContextID, const cmsViewingConditions* pVC)
+{
+ cmsCIECAM02* lpMod;
+
+ _cmsAssert(pVC != NULL);
+
+ if((lpMod = (cmsCIECAM02*) _cmsMallocZero(ContextID, sizeof(cmsCIECAM02))) == NULL) {
+ return NULL;
+ }
+
+ lpMod ->ContextID = ContextID;
+
+ lpMod ->adoptedWhite.XYZ[0] = pVC ->whitePoint.X;
+ lpMod ->adoptedWhite.XYZ[1] = pVC ->whitePoint.Y;
+ lpMod ->adoptedWhite.XYZ[2] = pVC ->whitePoint.Z;
+
+ lpMod -> LA = pVC ->La;
+ lpMod -> Yb = pVC ->Yb;
+ lpMod -> D = pVC ->D_value;
+ lpMod -> surround = pVC ->surround;
+
+ switch (lpMod -> surround) {
+
+
+ case CUTSHEET_SURROUND:
+ lpMod->F = 0.8;
+ lpMod->c = 0.41;
+ lpMod->Nc = 0.8;
+ break;
+
+ case DARK_SURROUND:
+ lpMod -> F = 0.8;
+ lpMod -> c = 0.525;
+ lpMod -> Nc = 0.8;
+ break;
+
+ case DIM_SURROUND:
+ lpMod -> F = 0.9;
+ lpMod -> c = 0.59;
+ lpMod -> Nc = 0.95;
+ break;
+
+ default:
+ // Average surround
+ lpMod -> F = 1.0;
+ lpMod -> c = 0.69;
+ lpMod -> Nc = 1.0;
+ }
+
+ lpMod -> n = compute_n(lpMod);
+ lpMod -> z = compute_z(lpMod);
+ lpMod -> Nbb = computeNbb(lpMod);
+ lpMod -> FL = computeFL(lpMod);
+
+ if (lpMod -> D == D_CALCULATE) {
+ lpMod -> D = computeD(lpMod);
+ }
+
+ lpMod -> Ncb = lpMod -> Nbb;
+
+ lpMod -> adoptedWhite = XYZtoCAT02(lpMod -> adoptedWhite);
+ lpMod -> adoptedWhite = ChromaticAdaptation(lpMod -> adoptedWhite, lpMod);
+ lpMod -> adoptedWhite = CAT02toHPE(lpMod -> adoptedWhite);
+ lpMod -> adoptedWhite = NonlinearCompression(lpMod -> adoptedWhite, lpMod);
+
+ return (cmsHANDLE) lpMod;
+
+}
+
+void CMSEXPORT cmsCIECAM02Done(cmsHANDLE hModel)
+{
+ cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
+ if (lpMod) _cmsFree(lpMod ->ContextID, lpMod);
+}
+
+
+void CMSEXPORT cmsCIECAM02Forward(cmsHANDLE hModel, const cmsCIEXYZ* pIn, cmsJCh* pOut)
+{
+ CAM02COLOR clr;
+ cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
+ _cmsAssert(lpMod != NULL);
+ _cmsAssert(pIn != NULL);
+ _cmsAssert(pOut != NULL);
+
+ memset(&clr, 0, sizeof(clr));
+
+ clr.XYZ[0] = pIn ->X;
+ clr.XYZ[1] = pIn ->Y;
+ clr.XYZ[2] = pIn ->Z;
+
+ clr = XYZtoCAT02(clr);
+ clr = ChromaticAdaptation(clr, lpMod);
+ clr = CAT02toHPE(clr);
+ clr = NonlinearCompression(clr, lpMod);
+ clr = ComputeCorrelates(clr, lpMod);
+
+ pOut ->J = clr.J;
+ pOut ->C = clr.C;
+ pOut ->h = clr.h;
+}
+
+void CMSEXPORT cmsCIECAM02Reverse(cmsHANDLE hModel, const cmsJCh* pIn, cmsCIEXYZ* pOut)
+{
+ CAM02COLOR clr;
+ cmsCIECAM02* lpMod = (cmsCIECAM02*) hModel;
+
+ _cmsAssert(lpMod != NULL);
+ _cmsAssert(pIn != NULL);
+ _cmsAssert(pOut != NULL);
+
+ memset(&clr, 0, sizeof(clr));
+
+ clr.J = pIn -> J;
+ clr.C = pIn -> C;
+ clr.h = pIn -> h;
+
+ clr = InverseCorrelates(clr, lpMod);
+ clr = InverseNonlinearity(clr, lpMod);
+ clr = HPEtoCAT02(clr);
+ clr = InverseChromaticAdaptation(clr, lpMod);
+ clr = CAT02toXYZ(clr);
+
+ pOut ->X = clr.XYZ[0];
+ pOut ->Y = clr.XYZ[1];
+ pOut ->Z = clr.XYZ[2];
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c
new file mode 100644
index 0000000000..90174351e3
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscgats.c
@@ -0,0 +1,2775 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// IT8.7 / CGATS.17-200x handling -----------------------------------------------------------------------------
+
+
+#define MAXID 128 // Max length of identifier
+#define MAXSTR 1024 // Max length of string
+#define MAXTABLES 255 // Max Number of tables in a single stream
+#define MAXINCLUDE 20 // Max number of nested includes
+
+#define DEFAULT_DBL_FORMAT "%.10g" // Double formatting
+
+#ifdef CMS_IS_WINDOWS_
+//sunliang.liu modified 2010426 for wince error
+# ifndef _WIN32_WCE
+# include <io.h>
+# endif
+# define DIR_CHAR '\\'
+#else
+# define DIR_CHAR '/'
+#endif
+
+
+// Symbols
+typedef enum {
+
+ SNONE,
+ SINUM, // Integer
+ SDNUM, // Real
+ SIDENT, // Identifier
+ SSTRING, // string
+ SCOMMENT, // comment
+ SEOLN, // End of line
+ SEOF, // End of stream
+ SSYNERROR, // Syntax error found on stream
+
+ // Keywords
+
+ SBEGIN_DATA,
+ SBEGIN_DATA_FORMAT,
+ SEND_DATA,
+ SEND_DATA_FORMAT,
+ SKEYWORD,
+ SDATA_FORMAT_ID,
+ SINCLUDE
+
+ } SYMBOL;
+
+
+// How to write the value
+typedef enum {
+
+ WRITE_UNCOOKED,
+ WRITE_STRINGIFY,
+ WRITE_HEXADECIMAL,
+ WRITE_BINARY,
+ WRITE_PAIR
+
+ } WRITEMODE;
+
+// Linked list of variable names
+typedef struct _KeyVal {
+
+ struct _KeyVal* Next;
+ char* Keyword; // Name of variable
+ struct _KeyVal* NextSubkey; // If key is a dictionary, points to the next item
+ char* Subkey; // If key is a dictionary, points to the subkey name
+ char* Value; // Points to value
+ WRITEMODE WriteAs; // How to write the value
+
+ } KEYVALUE;
+
+
+// Linked list of memory chunks (Memory sink)
+typedef struct _OwnedMem {
+
+ struct _OwnedMem* Next;
+ void * Ptr; // Point to value
+
+ } OWNEDMEM;
+
+// Suballocator
+typedef struct _SubAllocator {
+
+ cmsUInt8Number* Block;
+ cmsUInt32Number BlockSize;
+ cmsUInt32Number Used;
+
+ } SUBALLOCATOR;
+
+// Table. Each individual table can hold properties and rows & cols
+typedef struct _Table {
+
+ char SheetType[MAXSTR]; // The first row of the IT8 (the type)
+
+ int nSamples, nPatches; // Cols, Rows
+ int SampleID; // Pos of ID
+
+ KEYVALUE* HeaderList; // The properties
+
+ char** DataFormat; // The binary stream descriptor
+ char** Data; // The binary stream
+
+ } TABLE;
+
+// File stream being parsed
+typedef struct _FileContext {
+ char FileName[cmsMAX_PATH]; // File name if being readed from file
+ FILE* Stream; // File stream or NULL if holded in memory
+ } FILECTX;
+
+// This struct hold all information about an open IT8 handler.
+typedef struct {
+
+
+ cmsUInt32Number TablesCount; // How many tables in this stream
+ cmsUInt32Number nTable; // The actual table
+
+ TABLE Tab[MAXTABLES];
+
+ // Memory management
+ OWNEDMEM* MemorySink; // The storage backend
+ SUBALLOCATOR Allocator; // String suballocator -- just to keep it fast
+
+ // Parser state machine
+ SYMBOL sy; // Current symbol
+ int ch; // Current character
+
+ int inum; // integer value
+ cmsFloat64Number dnum; // real value
+ char id[MAXID]; // identifier
+ char str[MAXSTR]; // string
+
+ // Allowed keywords & datasets. They have visibility on whole stream
+ KEYVALUE* ValidKeywords;
+ KEYVALUE* ValidSampleID;
+
+ char* Source; // Points to loc. being parsed
+ int lineno; // line counter for error reporting
+
+ FILECTX* FileStack[MAXINCLUDE]; // Stack of files being parsed
+ int IncludeSP; // Include Stack Pointer
+
+ char* MemoryBlock; // The stream if holded in memory
+
+ char DoubleFormatter[MAXID];// Printf-like 'cmsFloat64Number' formatter
+
+ cmsContext ContextID; // The threading context
+
+ } cmsIT8;
+
+
+// The stream for save operations
+typedef struct {
+
+ FILE* stream; // For save-to-file behaviour
+
+ cmsUInt8Number* Base;
+ cmsUInt8Number* Ptr; // For save-to-mem behaviour
+ cmsUInt32Number Used;
+ cmsUInt32Number Max;
+
+ } SAVESTREAM;
+
+
+// ------------------------------------------------------ cmsIT8 parsing routines
+
+
+// A keyword
+typedef struct {
+
+ const char *id;
+ SYMBOL sy;
+
+ } KEYWORD;
+
+// The keyword->symbol translation table. Sorting is required.
+static const KEYWORD TabKeys[] = {
+
+ {"$INCLUDE", SINCLUDE}, // This is an extension!
+ {".INCLUDE", SINCLUDE}, // This is an extension!
+
+ {"BEGIN_DATA", SBEGIN_DATA },
+ {"BEGIN_DATA_FORMAT", SBEGIN_DATA_FORMAT },
+ {"DATA_FORMAT_IDENTIFIER", SDATA_FORMAT_ID},
+ {"END_DATA", SEND_DATA},
+ {"END_DATA_FORMAT", SEND_DATA_FORMAT},
+ {"KEYWORD", SKEYWORD}
+ };
+
+#define NUMKEYS (sizeof(TabKeys)/sizeof(KEYWORD))
+
+// Predefined properties
+
+// A property
+typedef struct {
+ const char *id; // The identifier
+ WRITEMODE as; // How is supposed to be written
+ } PROPERTY;
+
+static PROPERTY PredefinedProperties[] = {
+
+ {"NUMBER_OF_FIELDS", WRITE_UNCOOKED}, // Required - NUMBER OF FIELDS
+ {"NUMBER_OF_SETS", WRITE_UNCOOKED}, // Required - NUMBER OF SETS
+ {"ORIGINATOR", WRITE_STRINGIFY}, // Required - Identifies the specific system, organization or individual that created the data file.
+ {"FILE_DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file.
+ {"CREATED", WRITE_STRINGIFY}, // Required - Indicates date of creation of the data file.
+ {"DESCRIPTOR", WRITE_STRINGIFY}, // Required - Describes the purpose or contents of the data file.
+ {"DIFFUSE_GEOMETRY", WRITE_STRINGIFY}, // The diffuse geometry used. Allowed values are "sphere" or "opal".
+ {"MANUFACTURER", WRITE_STRINGIFY},
+ {"MANUFACTURE", WRITE_STRINGIFY}, // Some broken Fuji targets does store this value
+ {"PROD_DATE", WRITE_STRINGIFY}, // Identifies year and month of production of the target in the form yyyy:mm.
+ {"SERIAL", WRITE_STRINGIFY}, // Uniquely identifies individual physical target.
+
+ {"MATERIAL", WRITE_STRINGIFY}, // Identifies the material on which the target was produced using a code
+ // uniquely identifying th e material. This is intend ed to be used for IT8.7
+ // physical targets only (i.e . IT8.7/1 a nd IT8.7/2).
+
+ {"INSTRUMENTATION", WRITE_STRINGIFY}, // Used to report the specific instrumentation used (manufacturer and
+ // model number) to generate the data reported. This data will often
+ // provide more information about the particular data collected than an
+ // extensive list of specific details. This is particularly important for
+ // spectral data or data derived from spectrophotometry.
+
+ {"MEASUREMENT_SOURCE", WRITE_STRINGIFY}, // Illumination used for spectral measurements. This data helps provide
+ // a guide to the potential for issues of paper fluorescence, etc.
+
+ {"PRINT_CONDITIONS", WRITE_STRINGIFY}, // Used to define the characteristics of the printed sheet being reported.
+ // Where standard conditions have been defined (e.g., SWOP at nominal)
+ // named conditions may suffice. Otherwise, detailed information is
+ // needed.
+
+ {"SAMPLE_BACKING", WRITE_STRINGIFY}, // Identifies the backing material used behind the sample during
+ // measurement. Allowed values are “black? “white? or {"na".
+
+ {"CHISQ_DOF", WRITE_STRINGIFY}, // Degrees of freedom associated with the Chi squared statistic
+
+ // below properties are new in recent specs:
+
+ {"MEASUREMENT_GEOMETRY", WRITE_STRINGIFY}, // The type of measurement, either reflection or transmission, should be indicated
+ // along with details of the geometry and the aperture size and shape. For example,
+ // for transmission measurements it is important to identify 0/diffuse, diffuse/0,
+ // opal or integrating sphere, etc. For reflection it is important to identify 0/45,
+ // 45/0, sphere (specular included or excluded), etc.
+
+ {"FILTER", WRITE_STRINGIFY}, // Identifies the use of physical filter(s) during measurement. Typically used to
+ // denote the use of filters such as none, D65, Red, Green or Blue.
+
+ {"POLARIZATION", WRITE_STRINGIFY}, // Identifies the use of a physical polarization filter during measurement. Allowed
+ // values are {"yes? “white? “none?or “na?
+
+ {"WEIGHTING_FUNCTION", WRITE_PAIR}, // Indicates such functions as: the CIE standard observer functions used in the
+ // calculation of various data parameters (2 degree and 10 degree), CIE standard
+ // illuminant functions used in the calculation of various data parameters (e.g., D50,
+ // D65, etc.), density status response, etc. If used there shall be at least one
+ // name-value pair following the WEIGHTING_FUNCTION tag/keyword. The first attribute
+ // in the set shall be {"name" and shall identify the particular parameter used.
+ // The second shall be {"value" and shall provide the value associated with that name.
+ // For ASCII data, a string containing the Name and Value attribute pairs shall follow
+ // the weighting function keyword. A semi-colon separates attribute pairs from each
+ // other and within the attribute the name and value are separated by a comma.
+
+ {"COMPUTATIONAL_PARAMETER", WRITE_PAIR}, // Parameter that is used in computing a value from measured data. Name is the name
+ // of the calculation, parameter is the name of the parameter used in the calculation
+ // and value is the value of the parameter.
+
+ {"TARGET_TYPE", WRITE_STRINGIFY}, // The type of target being measured, e.g. IT8.7/1, IT8.7/3, user defined, etc.
+
+ {"COLORANT", WRITE_STRINGIFY}, // Identifies the colorant(s) used in creating the target.
+
+ {"TABLE_DESCRIPTOR", WRITE_STRINGIFY}, // Describes the purpose or contents of a data table.
+
+ {"TABLE_NAME", WRITE_STRINGIFY} // Provides a short name for a data table.
+};
+
+#define NUMPREDEFINEDPROPS (sizeof(PredefinedProperties)/sizeof(PROPERTY))
+
+
+// Predefined sample types on dataset
+static const char* PredefinedSampleID[] = {
+ "SAMPLE_ID", // Identifies sample that data represents
+ "STRING", // Identifies label, or other non-machine readable value.
+ // Value must begin and end with a " symbol
+
+ "CMYK_C", // Cyan component of CMYK data expressed as a percentage
+ "CMYK_M", // Magenta component of CMYK data expressed as a percentage
+ "CMYK_Y", // Yellow component of CMYK data expressed as a percentage
+ "CMYK_K", // Black component of CMYK data expressed as a percentage
+ "D_RED", // Red filter density
+ "D_GREEN", // Green filter density
+ "D_BLUE", // Blue filter density
+ "D_VIS", // Visual filter density
+ "D_MAJOR_FILTER", // Major filter d ensity
+ "RGB_R", // Red component of RGB data
+ "RGB_G", // Green component of RGB data
+ "RGB_B", // Blue com ponent of RGB data
+ "SPECTRAL_NM", // Wavelength of measurement expressed in nanometers
+ "SPECTRAL_PCT", // Percentage reflectance/transmittance
+ "SPECTRAL_DEC", // Reflectance/transmittance
+ "XYZ_X", // X component of tristimulus data
+ "XYZ_Y", // Y component of tristimulus data
+ "XYZ_Z", // Z component of tristimulus data
+ "XYY_X" // x component of chromaticity data
+ "XYY_Y", // y component of chromaticity data
+ "XYY_CAPY", // Y component of tristimulus data
+ "LAB_L", // L* component of Lab data
+ "LAB_A", // a* component of Lab data
+ "LAB_B", // b* component of Lab data
+ "LAB_C", // C*ab component of Lab data
+ "LAB_H", // hab component of Lab data
+ "LAB_DE", // CIE dE
+ "LAB_DE_94", // CIE dE using CIE 94
+ "LAB_DE_CMC", // dE using CMC
+ "LAB_DE_2000", // CIE dE using CIE DE 2000
+ "MEAN_DE", // Mean Delta E (LAB_DE) of samples compared to batch average
+ // (Used for data files for ANSI IT8.7/1 and IT8.7/2 targets)
+ "STDEV_X", // Standard deviation of X (tristimulus data)
+ "STDEV_Y", // Standard deviation of Y (tristimulus data)
+ "STDEV_Z", // Standard deviation of Z (tristimulus data)
+ "STDEV_L", // Standard deviation of L*
+ "STDEV_A", // Standard deviation of a*
+ "STDEV_B", // Standard deviation of b*
+ "STDEV_DE", // Standard deviation of CIE dE
+ "CHI_SQD_PAR"}; // The average of the standard deviations of L*, a* and b*. It is
+ // used to derive an estimate of the chi-squared parameter which is
+ // recommended as the predictor of the variability of dE
+
+#define NUMPREDEFINEDSAMPLEID (sizeof(PredefinedSampleID)/sizeof(char *))
+
+//Forward declaration of some internal functions
+static void* AllocChunk(cmsIT8* it8, cmsUInt32Number size);
+
+// Checks whatever c is a separator
+static
+cmsBool isseparator(int c)
+{
+ return (c == ' ') || (c == '\t') ;
+}
+
+// Checks whatever c is a valid identifier char
+static
+cmsBool ismiddle(int c)
+{
+ return (!isseparator(c) && (c != '#') && (c !='\"') && (c != '\'') && (c > 32) && (c < 127));
+}
+
+// Checks whatsever c is a valid identifier middle char.
+static
+cmsBool isidchar(int c)
+{
+ return isalnum(c) || ismiddle(c);
+}
+
+// Checks whatsever c is a valid identifier first char.
+static
+cmsBool isfirstidchar(int c)
+{
+ return !isdigit(c) && ismiddle(c);
+}
+
+// Guess whether the supplied path looks like an absolute path
+static
+cmsBool isabsolutepath(const char *path)
+{
+ char ThreeChars[4];
+
+ if(path == NULL)
+ return FALSE;
+ if (path[0] == 0)
+ return FALSE;
+
+ strncpy(ThreeChars, path, 3);
+ ThreeChars[3] = 0;
+
+ if(ThreeChars[0] == DIR_CHAR)
+ return TRUE;
+
+#ifdef CMS_IS_WINDOWS_
+ if (isalpha((int) ThreeChars[0]) && ThreeChars[1] == ':')
+ return TRUE;
+#endif
+ return FALSE;
+}
+
+
+// Makes a file path based on a given reference path
+// NOTE: this function doesn't check if the path exists or even if it's legal
+static
+cmsBool BuildAbsolutePath(const char *relPath, const char *basePath, char *buffer, cmsUInt32Number MaxLen)
+{
+ char *tail;
+ cmsUInt32Number len;
+
+ // Already absolute?
+ if (isabsolutepath(relPath)) {
+
+ strncpy(buffer, relPath, MaxLen);
+ buffer[MaxLen-1] = 0;
+ return TRUE;
+ }
+
+ // No, search for last
+ strncpy(buffer, basePath, MaxLen);
+ buffer[MaxLen-1] = 0;
+
+ tail = strrchr(buffer, DIR_CHAR);
+ if (tail == NULL) return FALSE; // Is not absolute and has no separators??
+
+ len = (cmsUInt32Number) (tail - buffer);
+ if (len >= MaxLen) return FALSE;
+
+ // No need to assure zero terminator over here
+ strncpy(tail + 1, relPath, MaxLen - len);
+
+ return TRUE;
+}
+
+
+// Make sure no exploit is being even tried
+static
+const char* NoMeta(const char* str)
+{
+ if (strchr(str, '%') != NULL)
+ return "**** CORRUPTED FORMAT STRING ***";
+
+ return str;
+}
+
+// Syntax error
+static
+cmsBool SynError(cmsIT8* it8, const char *Txt, ...)
+{
+ char Buffer[256], ErrMsg[1024];
+ va_list args;
+
+ va_start(args, Txt);
+ vsnprintf(Buffer, 255, Txt, args);
+ Buffer[255] = 0;
+ va_end(args);
+
+ snprintf(ErrMsg, 1023, "%s: Line %d, %s", it8->FileStack[it8 ->IncludeSP]->FileName, it8->lineno, Buffer);
+ ErrMsg[1023] = 0;
+ it8->sy = SSYNERROR;
+ cmsSignalError(it8 ->ContextID, cmsERROR_CORRUPTION_DETECTED, "%s", ErrMsg);
+ return FALSE;
+}
+
+// Check if current symbol is same as specified. issue an error else.
+static
+cmsBool Check(cmsIT8* it8, SYMBOL sy, const char* Err)
+{
+ if (it8 -> sy != sy)
+ return SynError(it8, NoMeta(Err));
+ return TRUE;
+}
+
+// Read Next character from stream
+static
+void NextCh(cmsIT8* it8)
+{
+ if (it8 -> FileStack[it8 ->IncludeSP]->Stream) {
+
+ it8 ->ch = fgetc(it8 ->FileStack[it8 ->IncludeSP]->Stream);
+
+ if (feof(it8 -> FileStack[it8 ->IncludeSP]->Stream)) {
+
+ if (it8 ->IncludeSP > 0) {
+
+ fclose(it8 ->FileStack[it8->IncludeSP--]->Stream);
+ it8 -> ch = ' '; // Whitespace to be ignored
+
+ } else
+ it8 ->ch = 0; // EOF
+ }
+ }
+ else {
+ it8->ch = *it8->Source;
+ if (it8->ch) it8->Source++;
+ }
+}
+
+
+// Try to see if current identifier is a keyword, if so return the referred symbol
+static
+SYMBOL BinSrchKey(const char *id)
+{
+ int l = 1;
+ int r = NUMKEYS;
+ int x, res;
+
+ while (r >= l)
+ {
+ x = (l+r)/2;
+ res = cmsstrcasecmp(id, TabKeys[x-1].id);
+ if (res == 0) return TabKeys[x-1].sy;
+ if (res < 0) r = x - 1;
+ else l = x + 1;
+ }
+
+ return SNONE;
+}
+
+
+// 10 ^n
+static
+cmsFloat64Number xpow10(int n)
+{
+ return pow(10, (cmsFloat64Number) n);
+}
+
+
+// Reads a Real number, tries to follow from integer number
+static
+void ReadReal(cmsIT8* it8, int inum)
+{
+ it8->dnum = (cmsFloat64Number) inum;
+
+ while (isdigit(it8->ch)) {
+
+ it8->dnum = it8->dnum * 10.0 + (it8->ch - '0');
+ NextCh(it8);
+ }
+
+ if (it8->ch == '.') { // Decimal point
+
+ cmsFloat64Number frac = 0.0; // fraction
+ int prec = 0; // precision
+
+ NextCh(it8); // Eats dec. point
+
+ while (isdigit(it8->ch)) {
+
+ frac = frac * 10.0 + (it8->ch - '0');
+ prec++;
+ NextCh(it8);
+ }
+
+ it8->dnum = it8->dnum + (frac / xpow10(prec));
+ }
+
+ // Exponent, example 34.00E+20
+ if (toupper(it8->ch) == 'E') {
+
+ int e;
+ int sgn;
+
+ NextCh(it8); sgn = 1;
+
+ if (it8->ch == '-') {
+
+ sgn = -1; NextCh(it8);
+ }
+ else
+ if (it8->ch == '+') {
+
+ sgn = +1;
+ NextCh(it8);
+ }
+
+ e = 0;
+ while (isdigit(it8->ch)) {
+
+ if ((cmsFloat64Number) e * 10L < INT_MAX)
+ e = e * 10 + (it8->ch - '0');
+
+ NextCh(it8);
+ }
+
+ e = sgn*e;
+ it8 -> dnum = it8 -> dnum * xpow10(e);
+ }
+}
+
+// Parses a float number
+// This can not call directly atof because it uses locale dependant
+// parsing, while CCMX files always use . as decimal separator
+static
+cmsFloat64Number ParseFloatNumber(const char *Buffer)
+{
+ cmsFloat64Number dnum = 0.0;
+ int sign = 1;
+
+ // keep safe
+ if (Buffer == NULL) return 0.0;
+
+ if (*Buffer == '-' || *Buffer == '+') {
+
+ sign = (*Buffer == '-') ? -1 : 1;
+ Buffer++;
+ }
+
+
+ while (*Buffer && isdigit((int) *Buffer)) {
+
+ dnum = dnum * 10.0 + (*Buffer - '0');
+ if (*Buffer) Buffer++;
+ }
+
+ if (*Buffer == '.') {
+
+ cmsFloat64Number frac = 0.0; // fraction
+ int prec = 0; // precission
+
+ if (*Buffer) Buffer++;
+
+ while (*Buffer && isdigit((int) *Buffer)) {
+
+ frac = frac * 10.0 + (*Buffer - '0');
+ prec++;
+ if (*Buffer) Buffer++;
+ }
+
+ dnum = dnum + (frac / xpow10(prec));
+ }
+
+ // Exponent, example 34.00E+20
+ if (*Buffer && toupper(*Buffer) == 'E') {
+
+ int e;
+ int sgn;
+
+ if (*Buffer) Buffer++;
+ sgn = 1;
+
+ if (*Buffer == '-') {
+
+ sgn = -1;
+ if (*Buffer) Buffer++;
+ }
+ else
+ if (*Buffer == '+') {
+
+ sgn = +1;
+ if (*Buffer) Buffer++;
+ }
+
+ e = 0;
+ while (*Buffer && isdigit((int) *Buffer)) {
+
+ if ((cmsFloat64Number) e * 10L < INT_MAX)
+ e = e * 10 + (*Buffer - '0');
+
+ if (*Buffer) Buffer++;
+ }
+
+ e = sgn*e;
+ dnum = dnum * xpow10(e);
+ }
+
+ return sign * dnum;
+}
+
+
+// Reads next symbol
+static
+void InSymbol(cmsIT8* it8)
+{
+ register char *idptr;
+ register int k;
+ SYMBOL key;
+ int sng;
+
+ do {
+
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ if (isfirstidchar(it8->ch)) { // Identifier
+
+ k = 0;
+ idptr = it8->id;
+
+ do {
+
+ if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+ NextCh(it8);
+
+ } while (isidchar(it8->ch));
+
+ *idptr = '\0';
+
+
+ key = BinSrchKey(it8->id);
+ if (key == SNONE) it8->sy = SIDENT;
+ else it8->sy = key;
+
+ }
+ else // Is a number?
+ if (isdigit(it8->ch) || it8->ch == '.' || it8->ch == '-' || it8->ch == '+')
+ {
+ int sign = 1;
+
+ if (it8->ch == '-') {
+ sign = -1;
+ NextCh(it8);
+ }
+
+ it8->inum = 0;
+ it8->sy = SINUM;
+
+ if (it8->ch == '0') { // 0xnnnn (Hexa) or 0bnnnn (Binary)
+
+ NextCh(it8);
+ if (toupper(it8->ch) == 'X') {
+
+ int j;
+
+ NextCh(it8);
+ while (isxdigit(it8->ch))
+ {
+ it8->ch = toupper(it8->ch);
+ if (it8->ch >= 'A' && it8->ch <= 'F') j = it8->ch -'A'+10;
+ else j = it8->ch - '0';
+
+ if ((long) it8->inum * 16L > (long) INT_MAX)
+ {
+ SynError(it8, "Invalid hexadecimal number");
+ return;
+ }
+
+ it8->inum = it8->inum * 16 + j;
+ NextCh(it8);
+ }
+ return;
+ }
+
+ if (toupper(it8->ch) == 'B') { // Binary
+
+ int j;
+
+ NextCh(it8);
+ while (it8->ch == '0' || it8->ch == '1')
+ {
+ j = it8->ch - '0';
+
+ if ((long) it8->inum * 2L > (long) INT_MAX)
+ {
+ SynError(it8, "Invalid binary number");
+ return;
+ }
+
+ it8->inum = it8->inum * 2 + j;
+ NextCh(it8);
+ }
+ return;
+ }
+ }
+
+
+ while (isdigit(it8->ch)) {
+
+ if ((long) it8->inum * 10L > (long) INT_MAX) {
+ ReadReal(it8, it8->inum);
+ it8->sy = SDNUM;
+ it8->dnum *= sign;
+ return;
+ }
+
+ it8->inum = it8->inum * 10 + (it8->ch - '0');
+ NextCh(it8);
+ }
+
+ if (it8->ch == '.') {
+
+ ReadReal(it8, it8->inum);
+ it8->sy = SDNUM;
+ it8->dnum *= sign;
+ return;
+ }
+
+ it8 -> inum *= sign;
+
+ // Special case. Numbers followed by letters are taken as identifiers
+
+ if (isidchar(it8 ->ch)) {
+
+ if (it8 ->sy == SINUM) {
+
+ sprintf(it8->id, "%d", it8->inum);
+ }
+ else {
+
+ sprintf(it8->id, it8 ->DoubleFormatter, it8->dnum);
+ }
+
+ k = (int) strlen(it8 ->id);
+ idptr = it8 ->id + k;
+ do {
+
+ if (++k < MAXID) *idptr++ = (char) it8->ch;
+
+ NextCh(it8);
+
+ } while (isidchar(it8->ch));
+
+ *idptr = '\0';
+ it8->sy = SIDENT;
+ }
+ return;
+
+ }
+ else
+ switch ((int) it8->ch) {
+
+ // EOF marker -- ignore it
+ case '\x1a':
+ NextCh(it8);
+ break;
+
+ // Eof stream markers
+ case 0:
+ case -1:
+ it8->sy = SEOF;
+ break;
+
+
+ // Next line
+ case '\r':
+ NextCh(it8);
+ if (it8 ->ch == '\n')
+ NextCh(it8);
+ it8->sy = SEOLN;
+ it8->lineno++;
+ break;
+
+ case '\n':
+ NextCh(it8);
+ it8->sy = SEOLN;
+ it8->lineno++;
+ break;
+
+ // Comment
+ case '#':
+ NextCh(it8);
+ while (it8->ch && it8->ch != '\n' && it8->ch != '\r')
+ NextCh(it8);
+
+ it8->sy = SCOMMENT;
+ break;
+
+ // String.
+ case '\'':
+ case '\"':
+ idptr = it8->str;
+ sng = it8->ch;
+ k = 0;
+ NextCh(it8);
+
+ while (k < MAXSTR && it8->ch != sng) {
+
+ if (it8->ch == '\n'|| it8->ch == '\r') k = MAXSTR+1;
+ else {
+ *idptr++ = (char) it8->ch;
+ NextCh(it8);
+ k++;
+ }
+ }
+
+ it8->sy = SSTRING;
+ *idptr = '\0';
+ NextCh(it8);
+ break;
+
+
+ default:
+ SynError(it8, "Unrecognized character: 0x%x", it8 ->ch);
+ return;
+ }
+
+ } while (it8->sy == SCOMMENT);
+
+ // Handle the include special token
+
+ if (it8 -> sy == SINCLUDE) {
+
+ FILECTX* FileNest;
+
+ if(it8 -> IncludeSP >= (MAXINCLUDE-1)) {
+
+ SynError(it8, "Too many recursion levels");
+ return;
+ }
+
+ InSymbol(it8);
+ if (!Check(it8, SSTRING, "Filename expected")) return;
+
+ FileNest = it8 -> FileStack[it8 -> IncludeSP + 1];
+ if(FileNest == NULL) {
+
+ FileNest = it8 ->FileStack[it8 -> IncludeSP + 1] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));
+ //if(FileNest == NULL)
+ // TODO: how to manage out-of-memory conditions?
+ }
+
+ if (BuildAbsolutePath(it8->str,
+ it8->FileStack[it8->IncludeSP]->FileName,
+ FileNest->FileName, cmsMAX_PATH-1) == FALSE) {
+ SynError(it8, "File path too long");
+ return;
+ }
+
+ FileNest->Stream = fopen(FileNest->FileName, "rt");
+ if (FileNest->Stream == NULL) {
+
+ SynError(it8, "File %s not found", FileNest->FileName);
+ return;
+ }
+ it8->IncludeSP++;
+
+ it8 ->ch = ' ';
+ InSymbol(it8);
+ }
+
+}
+
+// Checks end of line separator
+static
+cmsBool CheckEOLN(cmsIT8* it8)
+{
+ if (!Check(it8, SEOLN, "Expected separator")) return FALSE;
+ while (it8 -> sy == SEOLN)
+ InSymbol(it8);
+ return TRUE;
+
+}
+
+// Skip a symbol
+
+static
+void Skip(cmsIT8* it8, SYMBOL sy)
+{
+ if (it8->sy == sy && it8->sy != SEOF)
+ InSymbol(it8);
+}
+
+
+// Skip multiple EOLN
+static
+void SkipEOLN(cmsIT8* it8)
+{
+ while (it8->sy == SEOLN) {
+ InSymbol(it8);
+ }
+}
+
+
+// Returns a string holding current value
+static
+cmsBool GetVal(cmsIT8* it8, char* Buffer, cmsUInt32Number max, const char* ErrorTitle)
+{
+ switch (it8->sy) {
+
+ case SEOLN: // Empty value
+ Buffer[0]=0;
+ break;
+ case SIDENT: strncpy(Buffer, it8->id, max);
+ Buffer[max-1]=0;
+ break;
+ case SINUM: snprintf(Buffer, max, "%d", it8 -> inum); break;
+ case SDNUM: snprintf(Buffer, max, it8->DoubleFormatter, it8 -> dnum); break;
+ case SSTRING: strncpy(Buffer, it8->str, max);
+ Buffer[max-1] = 0;
+ break;
+
+
+ default:
+ return SynError(it8, "%s", ErrorTitle);
+ }
+
+ Buffer[max] = 0;
+ return TRUE;
+}
+
+// ---------------------------------------------------------- Table
+
+static
+TABLE* GetTable(cmsIT8* it8)
+{
+ if ((it8 -> nTable >= it8 ->TablesCount)) {
+
+ SynError(it8, "Table %d out of sequence", it8 -> nTable);
+ return it8 -> Tab;
+ }
+
+ return it8 ->Tab + it8 ->nTable;
+}
+
+// ---------------------------------------------------------- Memory management
+
+
+// Frees an allocator and owned memory
+void CMSEXPORT cmsIT8Free(cmsHANDLE hIT8)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ if (it8 == NULL)
+ return;
+
+ if (it8->MemorySink) {
+
+ OWNEDMEM* p;
+ OWNEDMEM* n;
+
+ for (p = it8->MemorySink; p != NULL; p = n) {
+
+ n = p->Next;
+ if (p->Ptr) _cmsFree(it8 ->ContextID, p->Ptr);
+ _cmsFree(it8 ->ContextID, p);
+ }
+ }
+
+ if (it8->MemoryBlock)
+ _cmsFree(it8 ->ContextID, it8->MemoryBlock);
+
+ _cmsFree(it8 ->ContextID, it8);
+}
+
+
+// Allocates a chunk of data, keep linked list
+static
+void* AllocBigBlock(cmsIT8* it8, cmsUInt32Number size)
+{
+ OWNEDMEM* ptr1;
+ void* ptr = _cmsMallocZero(it8->ContextID, size);
+
+ if (ptr != NULL) {
+
+ ptr1 = (OWNEDMEM*) _cmsMallocZero(it8 ->ContextID, sizeof(OWNEDMEM));
+
+ if (ptr1 == NULL) {
+
+ _cmsFree(it8 ->ContextID, ptr);
+ return NULL;
+ }
+
+ ptr1-> Ptr = ptr;
+ ptr1-> Next = it8 -> MemorySink;
+ it8 -> MemorySink = ptr1;
+ }
+
+ return ptr;
+}
+
+
+// Suballocator.
+static
+void* AllocChunk(cmsIT8* it8, cmsUInt32Number size)
+{
+ cmsUInt32Number Free = it8 ->Allocator.BlockSize - it8 ->Allocator.Used;
+ cmsUInt8Number* ptr;
+
+ size = _cmsALIGNMEM(size);
+
+ if (size > Free) {
+
+ if (it8 -> Allocator.BlockSize == 0)
+
+ it8 -> Allocator.BlockSize = 20*1024;
+ else
+ it8 ->Allocator.BlockSize *= 2;
+
+ if (it8 ->Allocator.BlockSize < size)
+ it8 ->Allocator.BlockSize = size;
+
+ it8 ->Allocator.Used = 0;
+ it8 ->Allocator.Block = (cmsUInt8Number*) AllocBigBlock(it8, it8 ->Allocator.BlockSize);
+ }
+
+ ptr = it8 ->Allocator.Block + it8 ->Allocator.Used;
+ it8 ->Allocator.Used += size;
+
+ return (void*) ptr;
+
+}
+
+
+// Allocates a string
+static
+char *AllocString(cmsIT8* it8, const char* str)
+{
+ cmsUInt32Number Size = (cmsUInt32Number) strlen(str)+1;
+ char *ptr;
+
+
+ ptr = (char *) AllocChunk(it8, Size);
+ if (ptr) strncpy (ptr, str, Size-1);
+
+ return ptr;
+}
+
+// Searches through linked list
+
+static
+cmsBool IsAvailableOnList(KEYVALUE* p, const char* Key, const char* Subkey, KEYVALUE** LastPtr)
+{
+ if (LastPtr) *LastPtr = p;
+
+ for (; p != NULL; p = p->Next) {
+
+ if (LastPtr) *LastPtr = p;
+
+ if (*Key != '#') { // Comments are ignored
+
+ if (cmsstrcasecmp(Key, p->Keyword) == 0)
+ break;
+ }
+ }
+
+ if (p == NULL)
+ return FALSE;
+
+ if (Subkey == 0)
+ return TRUE;
+
+ for (; p != NULL; p = p->NextSubkey) {
+
+ if (p ->Subkey == NULL) continue;
+
+ if (LastPtr) *LastPtr = p;
+
+ if (cmsstrcasecmp(Subkey, p->Subkey) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+
+// Add a property into a linked list
+static
+KEYVALUE* AddToList(cmsIT8* it8, KEYVALUE** Head, const char *Key, const char *Subkey, const char* xValue, WRITEMODE WriteAs)
+{
+ KEYVALUE* p;
+ KEYVALUE* last;
+
+
+ // Check if property is already in list
+
+ if (IsAvailableOnList(*Head, Key, Subkey, &p)) {
+
+ // This may work for editing properties
+
+ // return SynError(it8, "duplicate key <%s>", Key);
+ }
+ else {
+
+ last = p;
+
+ // Allocate the container
+ p = (KEYVALUE*) AllocChunk(it8, sizeof(KEYVALUE));
+ if (p == NULL)
+ {
+ SynError(it8, "AddToList: out of memory");
+ return NULL;
+ }
+
+ // Store name and value
+ p->Keyword = AllocString(it8, Key);
+ p->Subkey = (Subkey == NULL) ? NULL : AllocString(it8, Subkey);
+
+ // Keep the container in our list
+ if (*Head == NULL) {
+ *Head = p;
+ }
+ else
+ {
+ if (Subkey != NULL && last != NULL) {
+
+ last->NextSubkey = p;
+
+ // If Subkey is not null, then last is the last property with the same key,
+ // but not necessarily is the last property in the list, so we need to move
+ // to the actual list end
+ while (last->Next != NULL)
+ last = last->Next;
+ }
+
+ if (last != NULL) last->Next = p;
+ }
+
+ p->Next = NULL;
+ p->NextSubkey = NULL;
+ }
+
+ p->WriteAs = WriteAs;
+
+ if (xValue != NULL) {
+
+ p->Value = AllocString(it8, xValue);
+ }
+ else {
+ p->Value = NULL;
+ }
+
+ return p;
+}
+
+static
+KEYVALUE* AddAvailableProperty(cmsIT8* it8, const char* Key, WRITEMODE as)
+{
+ return AddToList(it8, &it8->ValidKeywords, Key, NULL, NULL, as);
+}
+
+
+static
+KEYVALUE* AddAvailableSampleID(cmsIT8* it8, const char* Key)
+{
+ return AddToList(it8, &it8->ValidSampleID, Key, NULL, NULL, WRITE_UNCOOKED);
+}
+
+
+static
+void AllocTable(cmsIT8* it8)
+{
+ TABLE* t;
+
+ t = it8 ->Tab + it8 ->TablesCount;
+
+ t->HeaderList = NULL;
+ t->DataFormat = NULL;
+ t->Data = NULL;
+
+ it8 ->TablesCount++;
+}
+
+
+cmsInt32Number CMSEXPORT cmsIT8SetTable(cmsHANDLE IT8, cmsUInt32Number nTable)
+{
+ cmsIT8* it8 = (cmsIT8*) IT8;
+
+ if (nTable >= it8 ->TablesCount) {
+
+ if (nTable == it8 ->TablesCount) {
+
+ AllocTable(it8);
+ }
+ else {
+ SynError(it8, "Table %d is out of sequence", nTable);
+ return -1;
+ }
+ }
+
+ it8 ->nTable = nTable;
+
+ return (cmsInt32Number) nTable;
+}
+
+
+
+// Init an empty container
+cmsHANDLE CMSEXPORT cmsIT8Alloc(cmsContext ContextID)
+{
+ cmsIT8* it8;
+ cmsUInt32Number i;
+
+ it8 = (cmsIT8*) _cmsMallocZero(ContextID, sizeof(cmsIT8));
+ if (it8 == NULL) return NULL;
+
+ AllocTable(it8);
+
+ it8->MemoryBlock = NULL;
+ it8->MemorySink = NULL;
+
+ it8 ->nTable = 0;
+
+ it8->ContextID = ContextID;
+ it8->Allocator.Used = 0;
+ it8->Allocator.Block = NULL;
+ it8->Allocator.BlockSize = 0;
+
+ it8->ValidKeywords = NULL;
+ it8->ValidSampleID = NULL;
+
+ it8 -> sy = SNONE;
+ it8 -> ch = ' ';
+ it8 -> Source = NULL;
+ it8 -> inum = 0;
+ it8 -> dnum = 0.0;
+
+ it8->FileStack[0] = (FILECTX*)AllocChunk(it8, sizeof(FILECTX));
+ it8->IncludeSP = 0;
+ it8 -> lineno = 1;
+
+ strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+ cmsIT8SetSheetType((cmsHANDLE) it8, "CGATS.17");
+
+ // Initialize predefined properties & data
+
+ for (i=0; i < NUMPREDEFINEDPROPS; i++)
+ AddAvailableProperty(it8, PredefinedProperties[i].id, PredefinedProperties[i].as);
+
+ for (i=0; i < NUMPREDEFINEDSAMPLEID; i++)
+ AddAvailableSampleID(it8, PredefinedSampleID[i]);
+
+
+ return (cmsHANDLE) it8;
+}
+
+
+const char* CMSEXPORT cmsIT8GetSheetType(cmsHANDLE hIT8)
+{
+ return GetTable((cmsIT8*) hIT8)->SheetType;
+}
+
+cmsBool CMSEXPORT cmsIT8SetSheetType(cmsHANDLE hIT8, const char* Type)
+{
+ TABLE* t = GetTable((cmsIT8*) hIT8);
+
+ strncpy(t ->SheetType, Type, MAXSTR-1);
+ t ->SheetType[MAXSTR-1] = 0;
+ return TRUE;
+}
+
+cmsBool CMSEXPORT cmsIT8SetComment(cmsHANDLE hIT8, const char* Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ if (!Val) return FALSE;
+ if (!*Val) return FALSE;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, "# ", NULL, Val, WRITE_UNCOOKED) != NULL;
+}
+
+// Sets a property
+cmsBool CMSEXPORT cmsIT8SetPropertyStr(cmsHANDLE hIT8, const char* Key, const char *Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ if (!Val) return FALSE;
+ if (!*Val) return FALSE;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Val, WRITE_STRINGIFY) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyDbl(cmsHANDLE hIT8, const char* cProp, cmsFloat64Number Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ char Buffer[1024];
+
+ sprintf(Buffer, it8->DoubleFormatter, Val);
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_UNCOOKED) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyHex(cmsHANDLE hIT8, const char* cProp, cmsUInt32Number Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ char Buffer[1024];
+
+ sprintf(Buffer, "%u", Val);
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, cProp, NULL, Buffer, WRITE_HEXADECIMAL) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyUncooked(cmsHANDLE hIT8, const char* Key, const char* Buffer)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, Key, NULL, Buffer, WRITE_UNCOOKED) != NULL;
+}
+
+cmsBool CMSEXPORT cmsIT8SetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char* SubKey, const char *Buffer)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ return AddToList(it8, &GetTable(it8)->HeaderList, Key, SubKey, Buffer, WRITE_PAIR) != NULL;
+}
+
+// Gets a property
+const char* CMSEXPORT cmsIT8GetProperty(cmsHANDLE hIT8, const char* Key)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ KEYVALUE* p;
+
+ if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, NULL, &p))
+ {
+ return p -> Value;
+ }
+ return NULL;
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetPropertyDbl(cmsHANDLE hIT8, const char* cProp)
+{
+ const char *v = cmsIT8GetProperty(hIT8, cProp);
+
+ if (v == NULL) return 0.0;
+
+ return ParseFloatNumber(v);
+}
+
+const char* CMSEXPORT cmsIT8GetPropertyMulti(cmsHANDLE hIT8, const char* Key, const char *SubKey)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ KEYVALUE* p;
+
+ if (IsAvailableOnList(GetTable(it8) -> HeaderList, Key, SubKey, &p)) {
+ return p -> Value;
+ }
+ return NULL;
+}
+
+// ----------------------------------------------------------------- Datasets
+
+
+static
+void AllocateDataFormat(cmsIT8* it8)
+{
+ TABLE* t = GetTable(it8);
+
+ if (t -> DataFormat) return; // Already allocated
+
+ t -> nSamples = (int) cmsIT8GetPropertyDbl(it8, "NUMBER_OF_FIELDS");
+
+ if (t -> nSamples <= 0) {
+
+ SynError(it8, "AllocateDataFormat: Unknown NUMBER_OF_FIELDS");
+ t -> nSamples = 10;
+ }
+
+ t -> DataFormat = (char**) AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * sizeof(char *));
+ if (t->DataFormat == NULL) {
+
+ SynError(it8, "AllocateDataFormat: Unable to allocate dataFormat array");
+ }
+
+}
+
+static
+const char *GetDataFormat(cmsIT8* it8, int n)
+{
+ TABLE* t = GetTable(it8);
+
+ if (t->DataFormat)
+ return t->DataFormat[n];
+
+ return NULL;
+}
+
+static
+cmsBool SetDataFormat(cmsIT8* it8, int n, const char *label)
+{
+ TABLE* t = GetTable(it8);
+
+ if (!t->DataFormat)
+ AllocateDataFormat(it8);
+
+ if (n > t -> nSamples) {
+ SynError(it8, "More than NUMBER_OF_FIELDS fields.");
+ return FALSE;
+ }
+
+ if (t->DataFormat) {
+ t->DataFormat[n] = AllocString(it8, label);
+ }
+
+ return TRUE;
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataFormat(cmsHANDLE h, int n, const char *Sample)
+{
+ cmsIT8* it8 = (cmsIT8*) h;
+ return SetDataFormat(it8, n, Sample);
+}
+
+static
+void AllocateDataSet(cmsIT8* it8)
+{
+ TABLE* t = GetTable(it8);
+
+ if (t -> Data) return; // Already allocated
+
+ t-> nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+ t-> nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+ t-> Data = (char**)AllocChunk (it8, ((cmsUInt32Number) t->nSamples + 1) * ((cmsUInt32Number) t->nPatches + 1) *sizeof (char*));
+ if (t->Data == NULL) {
+
+ SynError(it8, "AllocateDataSet: Unable to allocate data array");
+ }
+
+}
+
+static
+char* GetData(cmsIT8* it8, int nSet, int nField)
+{
+ TABLE* t = GetTable(it8);
+ int nSamples = t -> nSamples;
+ int nPatches = t -> nPatches;
+
+ if (nSet >= nPatches || nField >= nSamples)
+ return NULL;
+
+ if (!t->Data) return NULL;
+ return t->Data [nSet * nSamples + nField];
+}
+
+static
+cmsBool SetData(cmsIT8* it8, int nSet, int nField, const char *Val)
+{
+ TABLE* t = GetTable(it8);
+
+ if (!t->Data)
+ AllocateDataSet(it8);
+
+ if (!t->Data) return FALSE;
+
+ if (nSet > t -> nPatches || nSet < 0) {
+
+ return SynError(it8, "Patch %d out of range, there are %d patches", nSet, t -> nPatches);
+ }
+
+ if (nField > t ->nSamples || nField < 0) {
+ return SynError(it8, "Sample %d out of range, there are %d samples", nField, t ->nSamples);
+
+ }
+
+ t->Data [nSet * t -> nSamples + nField] = AllocString(it8, Val);
+ return TRUE;
+}
+
+
+// --------------------------------------------------------------- File I/O
+
+
+// Writes a string to file
+static
+void WriteStr(SAVESTREAM* f, const char *str)
+{
+ cmsUInt32Number len;
+
+ if (str == NULL)
+ str = " ";
+
+ // Length to write
+ len = (cmsUInt32Number) strlen(str);
+ f ->Used += len;
+
+
+ if (f ->stream) { // Should I write it to a file?
+
+ if (fwrite(str, 1, len, f->stream) != len) {
+ cmsSignalError(0, cmsERROR_WRITE, "Write to file error in CGATS parser");
+ return;
+ }
+
+ }
+ else { // Or to a memory block?
+
+ if (f ->Base) { // Am I just counting the bytes?
+
+ if (f ->Used > f ->Max) {
+
+ cmsSignalError(0, cmsERROR_WRITE, "Write to memory overflows in CGATS parser");
+ return;
+ }
+
+ memmove(f ->Ptr, str, len);
+ f->Ptr += len;
+ }
+
+ }
+}
+
+
+// Write formatted
+
+static
+void Writef(SAVESTREAM* f, const char* frm, ...)
+{
+ char Buffer[4096];
+ va_list args;
+
+ va_start(args, frm);
+ vsnprintf(Buffer, 4095, frm, args);
+ Buffer[4095] = 0;
+ WriteStr(f, Buffer);
+ va_end(args);
+
+}
+
+// Writes full header
+static
+void WriteHeader(cmsIT8* it8, SAVESTREAM* fp)
+{
+ KEYVALUE* p;
+ TABLE* t = GetTable(it8);
+
+ // Writes the type
+ WriteStr(fp, t->SheetType);
+ WriteStr(fp, "\n");
+
+ for (p = t->HeaderList; (p != NULL); p = p->Next)
+ {
+ if (*p ->Keyword == '#') {
+
+ char* Pt;
+
+ WriteStr(fp, "#\n# ");
+ for (Pt = p ->Value; *Pt; Pt++) {
+
+
+ Writef(fp, "%c", *Pt);
+
+ if (*Pt == '\n') {
+ WriteStr(fp, "# ");
+ }
+ }
+
+ WriteStr(fp, "\n#\n");
+ continue;
+ }
+
+
+ if (!IsAvailableOnList(it8-> ValidKeywords, p->Keyword, NULL, NULL)) {
+
+#ifdef CMS_STRICT_CGATS
+ WriteStr(fp, "KEYWORD\t\"");
+ WriteStr(fp, p->Keyword);
+ WriteStr(fp, "\"\n");
+#endif
+
+ AddAvailableProperty(it8, p->Keyword, WRITE_UNCOOKED);
+ }
+
+ WriteStr(fp, p->Keyword);
+ if (p->Value) {
+
+ switch (p ->WriteAs) {
+
+ case WRITE_UNCOOKED:
+ Writef(fp, "\t%s", p ->Value);
+ break;
+
+ case WRITE_STRINGIFY:
+ Writef(fp, "\t\"%s\"", p->Value );
+ break;
+
+ case WRITE_HEXADECIMAL:
+ Writef(fp, "\t0x%X", atoi(p ->Value));
+ break;
+
+ case WRITE_BINARY:
+ Writef(fp, "\t0x%B", atoi(p ->Value));
+ break;
+
+ case WRITE_PAIR:
+ Writef(fp, "\t\"%s,%s\"", p->Subkey, p->Value);
+ break;
+
+ default: SynError(it8, "Unknown write mode %d", p ->WriteAs);
+ return;
+ }
+ }
+
+ WriteStr (fp, "\n");
+ }
+
+}
+
+
+// Writes the data format
+static
+void WriteDataFormat(SAVESTREAM* fp, cmsIT8* it8)
+{
+ int i, nSamples;
+ TABLE* t = GetTable(it8);
+
+ if (!t -> DataFormat) return;
+
+ WriteStr(fp, "BEGIN_DATA_FORMAT\n");
+ WriteStr(fp, " ");
+ nSamples = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_FIELDS"));
+
+ for (i = 0; i < nSamples; i++) {
+
+ WriteStr(fp, t->DataFormat[i]);
+ WriteStr(fp, ((i == (nSamples-1)) ? "\n" : "\t"));
+ }
+
+ WriteStr (fp, "END_DATA_FORMAT\n");
+}
+
+
+// Writes data array
+static
+void WriteData(SAVESTREAM* fp, cmsIT8* it8)
+{
+ int i, j;
+ TABLE* t = GetTable(it8);
+
+ if (!t->Data) return;
+
+ WriteStr (fp, "BEGIN_DATA\n");
+
+ t->nPatches = atoi(cmsIT8GetProperty(it8, "NUMBER_OF_SETS"));
+
+ for (i = 0; i < t-> nPatches; i++) {
+
+ WriteStr(fp, " ");
+
+ for (j = 0; j < t->nSamples; j++) {
+
+ char *ptr = t->Data[i*t->nSamples+j];
+
+ if (ptr == NULL) WriteStr(fp, "\"\"");
+ else {
+ // If value contains whitespace, enclose within quote
+
+ if (strchr(ptr, ' ') != NULL) {
+
+ WriteStr(fp, "\"");
+ WriteStr(fp, ptr);
+ WriteStr(fp, "\"");
+ }
+ else
+ WriteStr(fp, ptr);
+ }
+
+ WriteStr(fp, ((j == (t->nSamples-1)) ? "\n" : "\t"));
+ }
+ }
+ WriteStr (fp, "END_DATA\n");
+}
+
+
+
+// Saves whole file
+cmsBool CMSEXPORT cmsIT8SaveToFile(cmsHANDLE hIT8, const char* cFileName)
+{
+ SAVESTREAM sd;
+ cmsUInt32Number i;
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ memset(&sd, 0, sizeof(sd));
+
+ sd.stream = fopen(cFileName, "wt");
+ if (!sd.stream) return FALSE;
+
+ for (i=0; i < it8 ->TablesCount; i++) {
+
+ cmsIT8SetTable(hIT8, i);
+ WriteHeader(it8, &sd);
+ WriteDataFormat(&sd, it8);
+ WriteData(&sd, it8);
+ }
+
+ if (fclose(sd.stream) != 0) return FALSE;
+
+ return TRUE;
+}
+
+
+// Saves to memory
+cmsBool CMSEXPORT cmsIT8SaveToMem(cmsHANDLE hIT8, void *MemPtr, cmsUInt32Number* BytesNeeded)
+{
+ SAVESTREAM sd;
+ cmsUInt32Number i;
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ memset(&sd, 0, sizeof(sd));
+
+ sd.stream = NULL;
+ sd.Base = (cmsUInt8Number*) MemPtr;
+ sd.Ptr = sd.Base;
+
+ sd.Used = 0;
+
+ if (sd.Base)
+ sd.Max = *BytesNeeded; // Write to memory?
+ else
+ sd.Max = 0; // Just counting the needed bytes
+
+ for (i=0; i < it8 ->TablesCount; i++) {
+
+ cmsIT8SetTable(hIT8, i);
+ WriteHeader(it8, &sd);
+ WriteDataFormat(&sd, it8);
+ WriteData(&sd, it8);
+ }
+
+ sd.Used++; // The \0 at the very end
+
+ if (sd.Base)
+ *sd.Ptr = 0;
+
+ *BytesNeeded = sd.Used;
+
+ return TRUE;
+}
+
+
+// -------------------------------------------------------------- Higer level parsing
+
+static
+cmsBool DataFormatSection(cmsIT8* it8)
+{
+ int iField = 0;
+ TABLE* t = GetTable(it8);
+
+ InSymbol(it8); // Eats "BEGIN_DATA_FORMAT"
+ CheckEOLN(it8);
+
+ while (it8->sy != SEND_DATA_FORMAT &&
+ it8->sy != SEOLN &&
+ it8->sy != SEOF &&
+ it8->sy != SSYNERROR) {
+
+ if (it8->sy != SIDENT) {
+
+ return SynError(it8, "Sample type expected");
+ }
+
+ if (!SetDataFormat(it8, iField, it8->id)) return FALSE;
+ iField++;
+
+ InSymbol(it8);
+ SkipEOLN(it8);
+ }
+
+ SkipEOLN(it8);
+ Skip(it8, SEND_DATA_FORMAT);
+ SkipEOLN(it8);
+
+ if (iField != t ->nSamples) {
+ SynError(it8, "Count mismatch. NUMBER_OF_FIELDS was %d, found %d\n", t ->nSamples, iField);
+
+
+ }
+
+ return TRUE;
+}
+
+
+
+static
+cmsBool DataSection (cmsIT8* it8)
+{
+ int iField = 0;
+ int iSet = 0;
+ char Buffer[256];
+ TABLE* t = GetTable(it8);
+
+ InSymbol(it8); // Eats "BEGIN_DATA"
+ CheckEOLN(it8);
+
+ if (!t->Data)
+ AllocateDataSet(it8);
+
+ while (it8->sy != SEND_DATA && it8->sy != SEOF)
+ {
+ if (iField >= t -> nSamples) {
+ iField = 0;
+ iSet++;
+
+ }
+
+ if (it8->sy != SEND_DATA && it8->sy != SEOF) {
+
+ if (!GetVal(it8, Buffer, 255, "Sample data expected"))
+ return FALSE;
+
+ if (!SetData(it8, iSet, iField, Buffer))
+ return FALSE;
+
+ iField++;
+
+ InSymbol(it8);
+ SkipEOLN(it8);
+ }
+ }
+
+ SkipEOLN(it8);
+ Skip(it8, SEND_DATA);
+ SkipEOLN(it8);
+
+ // Check for data completion.
+
+ if ((iSet+1) != t -> nPatches)
+ return SynError(it8, "Count mismatch. NUMBER_OF_SETS was %d, found %d\n", t ->nPatches, iSet+1);
+
+ return TRUE;
+}
+
+
+
+
+static
+cmsBool HeaderSection(cmsIT8* it8)
+{
+ char VarName[MAXID];
+ char Buffer[MAXSTR];
+ KEYVALUE* Key;
+
+ while (it8->sy != SEOF &&
+ it8->sy != SSYNERROR &&
+ it8->sy != SBEGIN_DATA_FORMAT &&
+ it8->sy != SBEGIN_DATA) {
+
+
+ switch (it8 -> sy) {
+
+ case SKEYWORD:
+ InSymbol(it8);
+ if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;
+ if (!AddAvailableProperty(it8, Buffer, WRITE_UNCOOKED)) return FALSE;
+ InSymbol(it8);
+ break;
+
+
+ case SDATA_FORMAT_ID:
+ InSymbol(it8);
+ if (!GetVal(it8, Buffer, MAXSTR-1, "Keyword expected")) return FALSE;
+ if (!AddAvailableSampleID(it8, Buffer)) return FALSE;
+ InSymbol(it8);
+ break;
+
+
+ case SIDENT:
+ strncpy(VarName, it8->id, MAXID-1);
+ VarName[MAXID-1] = 0;
+
+ if (!IsAvailableOnList(it8-> ValidKeywords, VarName, NULL, &Key)) {
+
+#ifdef CMS_STRICT_CGATS
+ return SynError(it8, "Undefined keyword '%s'", VarName);
+#else
+ Key = AddAvailableProperty(it8, VarName, WRITE_UNCOOKED);
+ if (Key == NULL) return FALSE;
+#endif
+ }
+
+ InSymbol(it8);
+ if (!GetVal(it8, Buffer, MAXSTR-1, "Property data expected")) return FALSE;
+
+ if(Key->WriteAs != WRITE_PAIR) {
+ AddToList(it8, &GetTable(it8)->HeaderList, VarName, NULL, Buffer,
+ (it8->sy == SSTRING) ? WRITE_STRINGIFY : WRITE_UNCOOKED);
+ }
+ else {
+ const char *Subkey;
+ char *Nextkey;
+ if (it8->sy != SSTRING)
+ return SynError(it8, "Invalid value '%s' for property '%s'.", Buffer, VarName);
+
+ // chop the string as a list of "subkey, value" pairs, using ';' as a separator
+ for (Subkey = Buffer; Subkey != NULL; Subkey = Nextkey)
+ {
+ char *Value, *temp;
+
+ // identify token pair boundary
+ Nextkey = (char*) strchr(Subkey, ';');
+ if(Nextkey)
+ *Nextkey++ = '\0';
+
+ // for each pair, split the subkey and the value
+ Value = (char*) strrchr(Subkey, ',');
+ if(Value == NULL)
+ return SynError(it8, "Invalid value for property '%s'.", VarName);
+
+ // gobble the spaces before the coma, and the coma itself
+ temp = Value++;
+ do *temp-- = '\0'; while(temp >= Subkey && *temp == ' ');
+
+ // gobble any space at the right
+ temp = Value + strlen(Value) - 1;
+ while(*temp == ' ') *temp-- = '\0';
+
+ // trim the strings from the left
+ Subkey += strspn(Subkey, " ");
+ Value += strspn(Value, " ");
+
+ if(Subkey[0] == 0 || Value[0] == 0)
+ return SynError(it8, "Invalid value for property '%s'.", VarName);
+ AddToList(it8, &GetTable(it8)->HeaderList, VarName, Subkey, Value, WRITE_PAIR);
+ }
+ }
+
+ InSymbol(it8);
+ break;
+
+
+ case SEOLN: break;
+
+ default:
+ return SynError(it8, "expected keyword or identifier");
+ }
+
+ SkipEOLN(it8);
+ }
+
+ return TRUE;
+
+}
+
+
+static
+void ReadType(cmsIT8* it8, char* SheetTypePtr)
+{
+ // First line is a very special case.
+
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ while (it8->ch != '\r' && it8 ->ch != '\n' && it8->ch != '\t' && it8 -> ch != -1) {
+
+ *SheetTypePtr++= (char) it8 ->ch;
+ NextCh(it8);
+ }
+
+ *SheetTypePtr = 0;
+}
+
+
+static
+cmsBool ParseIT8(cmsIT8* it8, cmsBool nosheet)
+{
+ char* SheetTypePtr = it8 ->Tab[0].SheetType;
+
+ if (nosheet == 0) {
+ ReadType(it8, SheetTypePtr);
+ }
+
+ InSymbol(it8);
+
+ SkipEOLN(it8);
+
+ while (it8-> sy != SEOF &&
+ it8-> sy != SSYNERROR) {
+
+ switch (it8 -> sy) {
+
+ case SBEGIN_DATA_FORMAT:
+ if (!DataFormatSection(it8)) return FALSE;
+ break;
+
+ case SBEGIN_DATA:
+
+ if (!DataSection(it8)) return FALSE;
+
+ if (it8 -> sy != SEOF) {
+
+ AllocTable(it8);
+ it8 ->nTable = it8 ->TablesCount - 1;
+
+ // Read sheet type if present. We only support identifier and string.
+ // <ident> <eoln> is a type string
+ // anything else, is not a type string
+ if (nosheet == 0) {
+
+ if (it8 ->sy == SIDENT) {
+
+ // May be a type sheet or may be a prop value statement. We cannot use insymbol in
+ // this special case...
+ while (isseparator(it8->ch))
+ NextCh(it8);
+
+ // If a newline is found, then this is a type string
+ if (it8 ->ch == '\n' || it8->ch == '\r') {
+
+ cmsIT8SetSheetType(it8, it8 ->id);
+ InSymbol(it8);
+ }
+ else
+ {
+ // It is not. Just continue
+ cmsIT8SetSheetType(it8, "");
+ }
+ }
+ else
+ // Validate quoted strings
+ if (it8 ->sy == SSTRING) {
+ cmsIT8SetSheetType(it8, it8 ->str);
+ InSymbol(it8);
+ }
+ }
+
+ }
+ break;
+
+ case SEOLN:
+ SkipEOLN(it8);
+ break;
+
+ default:
+ if (!HeaderSection(it8)) return FALSE;
+ }
+
+ }
+
+ return (it8 -> sy != SSYNERROR);
+}
+
+
+
+// Init usefull pointers
+
+static
+void CookPointers(cmsIT8* it8)
+{
+ int idField, i;
+ char* Fld;
+ cmsUInt32Number j;
+ cmsUInt32Number nOldTable = it8 ->nTable;
+
+ for (j=0; j < it8 ->TablesCount; j++) {
+
+ TABLE* t = it8 ->Tab + j;
+
+ t -> SampleID = 0;
+ it8 ->nTable = j;
+
+ for (idField = 0; idField < t -> nSamples; idField++)
+ {
+ if (t ->DataFormat == NULL){
+ SynError(it8, "Undefined DATA_FORMAT");
+ return;
+ }
+
+ Fld = t->DataFormat[idField];
+ if (!Fld) continue;
+
+
+ if (cmsstrcasecmp(Fld, "SAMPLE_ID") == 0) {
+
+ t -> SampleID = idField;
+
+ for (i=0; i < t -> nPatches; i++) {
+
+ char *Data = GetData(it8, i, idField);
+ if (Data) {
+ char Buffer[256];
+
+ strncpy(Buffer, Data, 255);
+ Buffer[255] = 0;
+
+ if (strlen(Buffer) <= strlen(Data))
+ strcpy(Data, Buffer);
+ else
+ SetData(it8, i, idField, Buffer);
+
+ }
+ }
+
+ }
+
+ // "LABEL" is an extension. It keeps references to forward tables
+
+ if ((cmsstrcasecmp(Fld, "LABEL") == 0) || Fld[0] == '$' ) {
+
+ // Search for table references...
+ for (i=0; i < t -> nPatches; i++) {
+
+ char *Label = GetData(it8, i, idField);
+
+ if (Label) {
+
+ cmsUInt32Number k;
+
+ // This is the label, search for a table containing
+ // this property
+
+ for (k=0; k < it8 ->TablesCount; k++) {
+
+ TABLE* Table = it8 ->Tab + k;
+ KEYVALUE* p;
+
+ if (IsAvailableOnList(Table->HeaderList, Label, NULL, &p)) {
+
+ // Available, keep type and table
+ char Buffer[256];
+
+ char *Type = p ->Value;
+ int nTable = (int) k;
+
+ snprintf(Buffer, 255, "%s %d %s", Label, nTable, Type );
+
+ SetData(it8, i, idField, Buffer);
+ }
+ }
+
+
+ }
+
+ }
+
+
+ }
+
+ }
+ }
+
+ it8 ->nTable = nOldTable;
+}
+
+// Try to infere if the file is a CGATS/IT8 file at all. Read first line
+// that should be something like some printable characters plus a \n
+// returns 0 if this is not like a CGATS, or an integer otherwise. This integer is the number of words in first line?
+static
+int IsMyBlock(cmsUInt8Number* Buffer, int n)
+{
+ int words = 1, space = 0, quot = 0;
+ int i;
+
+ if (n < 10) return 0; // Too small
+
+ if (n > 132)
+ n = 132;
+
+ for (i = 1; i < n; i++) {
+
+ switch(Buffer[i])
+ {
+ case '\n':
+ case '\r':
+ return ((quot == 1) || (words > 2)) ? 0 : words;
+ case '\t':
+ case ' ':
+ if(!quot && !space)
+ space = 1;
+ break;
+ case '\"':
+ quot = !quot;
+ break;
+ default:
+ if (Buffer[i] < 32) return 0;
+ if (Buffer[i] > 127) return 0;
+ words += space;
+ space = 0;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+static
+cmsBool IsMyFile(const char* FileName)
+{
+ FILE *fp;
+ cmsUInt32Number Size;
+ cmsUInt8Number Ptr[133];
+
+ fp = fopen(FileName, "rt");
+ if (!fp) {
+ cmsSignalError(0, cmsERROR_FILE, "File '%s' not found", FileName);
+ return FALSE;
+ }
+
+ Size = (cmsUInt32Number) fread(Ptr, 1, 132, fp);
+
+ if (fclose(fp) != 0)
+ return FALSE;
+
+ Ptr[Size] = '\0';
+
+ return IsMyBlock(Ptr, Size);
+}
+
+// ---------------------------------------------------------- Exported routines
+
+
+cmsHANDLE CMSEXPORT cmsIT8LoadFromMem(cmsContext ContextID, void *Ptr, cmsUInt32Number len)
+{
+ cmsHANDLE hIT8;
+ cmsIT8* it8;
+ int type;
+
+ _cmsAssert(Ptr != NULL);
+ _cmsAssert(len != 0);
+
+ type = IsMyBlock((cmsUInt8Number*)Ptr, len);
+ if (type == 0) return NULL;
+
+ hIT8 = cmsIT8Alloc(ContextID);
+ if (!hIT8) return NULL;
+
+ it8 = (cmsIT8*) hIT8;
+ it8 ->MemoryBlock = (char*) _cmsMalloc(ContextID, len + 1);
+
+ strncpy(it8 ->MemoryBlock, (const char*) Ptr, len);
+ it8 ->MemoryBlock[len] = 0;
+
+ strncpy(it8->FileStack[0]->FileName, "", cmsMAX_PATH-1);
+ it8-> Source = it8 -> MemoryBlock;
+
+ if (!ParseIT8(it8, type-1)) {
+
+ cmsIT8Free(hIT8);
+ return FALSE;
+ }
+
+ CookPointers(it8);
+ it8 ->nTable = 0;
+
+ _cmsFree(ContextID, it8->MemoryBlock);
+ it8 -> MemoryBlock = NULL;
+
+ return hIT8;
+
+
+}
+
+
+cmsHANDLE CMSEXPORT cmsIT8LoadFromFile(cmsContext ContextID, const char* cFileName)
+{
+
+ cmsHANDLE hIT8;
+ cmsIT8* it8;
+ int type;
+
+ _cmsAssert(cFileName != NULL);
+
+ type = IsMyFile(cFileName);
+ if (type == 0) return NULL;
+
+ hIT8 = cmsIT8Alloc(ContextID);
+ it8 = (cmsIT8*) hIT8;
+ if (!hIT8) return NULL;
+
+
+ it8 ->FileStack[0]->Stream = fopen(cFileName, "rt");
+
+ if (!it8 ->FileStack[0]->Stream) {
+ cmsIT8Free(hIT8);
+ return NULL;
+ }
+
+
+ strncpy(it8->FileStack[0]->FileName, cFileName, cmsMAX_PATH-1);
+ it8->FileStack[0]->FileName[cmsMAX_PATH-1] = 0;
+
+ if (!ParseIT8(it8, type-1)) {
+
+ fclose(it8 ->FileStack[0]->Stream);
+ cmsIT8Free(hIT8);
+ return NULL;
+ }
+
+ CookPointers(it8);
+ it8 ->nTable = 0;
+
+ if (fclose(it8 ->FileStack[0]->Stream)!= 0) {
+ cmsIT8Free(hIT8);
+ return NULL;
+ }
+
+ return hIT8;
+
+}
+
+int CMSEXPORT cmsIT8EnumDataFormat(cmsHANDLE hIT8, char ***SampleNames)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ TABLE* t;
+
+ _cmsAssert(hIT8 != NULL);
+
+ t = GetTable(it8);
+
+ if (SampleNames)
+ *SampleNames = t -> DataFormat;
+ return t -> nSamples;
+}
+
+
+cmsUInt32Number CMSEXPORT cmsIT8EnumProperties(cmsHANDLE hIT8, char ***PropertyNames)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ KEYVALUE* p;
+ cmsUInt32Number n;
+ char **Props;
+ TABLE* t;
+
+ _cmsAssert(hIT8 != NULL);
+
+ t = GetTable(it8);
+
+ // Pass#1 - count properties
+
+ n = 0;
+ for (p = t -> HeaderList; p != NULL; p = p->Next) {
+ n++;
+ }
+
+
+ Props = (char **) AllocChunk(it8, sizeof(char *) * n);
+
+ // Pass#2 - Fill pointers
+ n = 0;
+ for (p = t -> HeaderList; p != NULL; p = p->Next) {
+ Props[n++] = p -> Keyword;
+ }
+
+ *PropertyNames = Props;
+ return n;
+}
+
+cmsUInt32Number CMSEXPORT cmsIT8EnumPropertyMulti(cmsHANDLE hIT8, const char* cProp, const char ***SubpropertyNames)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ KEYVALUE *p, *tmp;
+ cmsUInt32Number n;
+ const char **Props;
+ TABLE* t;
+
+ _cmsAssert(hIT8 != NULL);
+
+
+ t = GetTable(it8);
+
+ if(!IsAvailableOnList(t->HeaderList, cProp, NULL, &p)) {
+ *SubpropertyNames = 0;
+ return 0;
+ }
+
+ // Pass#1 - count properties
+
+ n = 0;
+ for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) {
+ if(tmp->Subkey != NULL)
+ n++;
+ }
+
+
+ Props = (const char **) AllocChunk(it8, sizeof(char *) * n);
+
+ // Pass#2 - Fill pointers
+ n = 0;
+ for (tmp = p; tmp != NULL; tmp = tmp->NextSubkey) {
+ if(tmp->Subkey != NULL)
+ Props[n++] = p ->Subkey;
+ }
+
+ *SubpropertyNames = Props;
+ return n;
+}
+
+static
+int LocatePatch(cmsIT8* it8, const char* cPatch)
+{
+ int i;
+ const char *data;
+ TABLE* t = GetTable(it8);
+
+ for (i=0; i < t-> nPatches; i++) {
+
+ data = GetData(it8, i, t->SampleID);
+
+ if (data != NULL) {
+
+ if (cmsstrcasecmp(data, cPatch) == 0)
+ return i;
+ }
+ }
+
+ // SynError(it8, "Couldn't find patch '%s'\n", cPatch);
+ return -1;
+}
+
+
+static
+int LocateEmptyPatch(cmsIT8* it8)
+{
+ int i;
+ const char *data;
+ TABLE* t = GetTable(it8);
+
+ for (i=0; i < t-> nPatches; i++) {
+
+ data = GetData(it8, i, t->SampleID);
+
+ if (data == NULL)
+ return i;
+
+ }
+
+ return -1;
+}
+
+static
+int LocateSample(cmsIT8* it8, const char* cSample)
+{
+ int i;
+ const char *fld;
+ TABLE* t = GetTable(it8);
+
+ for (i=0; i < t->nSamples; i++) {
+
+ fld = GetDataFormat(it8, i);
+ if (cmsstrcasecmp(fld, cSample) == 0)
+ return i;
+ }
+
+ return -1;
+
+}
+
+
+int CMSEXPORT cmsIT8FindDataFormat(cmsHANDLE hIT8, const char* cSample)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ _cmsAssert(hIT8 != NULL);
+
+ return LocateSample(it8, cSample);
+}
+
+
+
+const char* CMSEXPORT cmsIT8GetDataRowCol(cmsHANDLE hIT8, int row, int col)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ _cmsAssert(hIT8 != NULL);
+
+ return GetData(it8, row, col);
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetDataRowColDbl(cmsHANDLE hIT8, int row, int col)
+{
+ const char* Buffer;
+
+ Buffer = cmsIT8GetDataRowCol(hIT8, row, col);
+
+ if (Buffer == NULL) return 0.0;
+
+ return ParseFloatNumber(Buffer);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataRowCol(cmsHANDLE hIT8, int row, int col, const char* Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ _cmsAssert(hIT8 != NULL);
+
+ return SetData(it8, row, col, Val);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataRowColDbl(cmsHANDLE hIT8, int row, int col, cmsFloat64Number Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ char Buff[256];
+
+ _cmsAssert(hIT8 != NULL);
+
+ sprintf(Buff, it8->DoubleFormatter, Val);
+
+ return SetData(it8, row, col, Buff);
+}
+
+
+
+const char* CMSEXPORT cmsIT8GetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ int iField, iSet;
+
+ _cmsAssert(hIT8 != NULL);
+
+ iField = LocateSample(it8, cSample);
+ if (iField < 0) {
+ return NULL;
+ }
+
+ iSet = LocatePatch(it8, cPatch);
+ if (iSet < 0) {
+ return NULL;
+ }
+
+ return GetData(it8, iSet, iField);
+}
+
+
+cmsFloat64Number CMSEXPORT cmsIT8GetDataDbl(cmsHANDLE it8, const char* cPatch, const char* cSample)
+{
+ const char* Buffer;
+
+ Buffer = cmsIT8GetData(it8, cPatch, cSample);
+
+ return ParseFloatNumber(Buffer);
+}
+
+
+
+cmsBool CMSEXPORT cmsIT8SetData(cmsHANDLE hIT8, const char* cPatch, const char* cSample, const char *Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ int iField, iSet;
+ TABLE* t;
+
+ _cmsAssert(hIT8 != NULL);
+
+ t = GetTable(it8);
+
+ iField = LocateSample(it8, cSample);
+
+ if (iField < 0)
+ return FALSE;
+
+ if (t-> nPatches == 0) {
+
+ AllocateDataFormat(it8);
+ AllocateDataSet(it8);
+ CookPointers(it8);
+ }
+
+ if (cmsstrcasecmp(cSample, "SAMPLE_ID") == 0) {
+
+ iSet = LocateEmptyPatch(it8);
+ if (iSet < 0) {
+ return SynError(it8, "Couldn't add more patches '%s'\n", cPatch);
+ }
+
+ iField = t -> SampleID;
+ }
+ else {
+ iSet = LocatePatch(it8, cPatch);
+ if (iSet < 0) {
+ return FALSE;
+ }
+ }
+
+ return SetData(it8, iSet, iField, Val);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetDataDbl(cmsHANDLE hIT8, const char* cPatch,
+ const char* cSample,
+ cmsFloat64Number Val)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ char Buff[256];
+
+ _cmsAssert(hIT8 != NULL);
+
+ snprintf(Buff, 255, it8->DoubleFormatter, Val);
+ return cmsIT8SetData(hIT8, cPatch, cSample, Buff);
+}
+
+// Buffer should get MAXSTR at least
+
+const char* CMSEXPORT cmsIT8GetPatchName(cmsHANDLE hIT8, int nPatch, char* buffer)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ TABLE* t;
+ char* Data;
+
+ _cmsAssert(hIT8 != NULL);
+
+ t = GetTable(it8);
+ Data = GetData(it8, nPatch, t->SampleID);
+
+ if (!Data) return NULL;
+ if (!buffer) return Data;
+
+ strncpy(buffer, Data, MAXSTR-1);
+ buffer[MAXSTR-1] = 0;
+ return buffer;
+}
+
+int CMSEXPORT cmsIT8GetPatchByName(cmsHANDLE hIT8, const char *cPatch)
+{
+ _cmsAssert(hIT8 != NULL);
+
+ return LocatePatch((cmsIT8*)hIT8, cPatch);
+}
+
+cmsUInt32Number CMSEXPORT cmsIT8TableCount(cmsHANDLE hIT8)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ _cmsAssert(hIT8 != NULL);
+
+ return it8 ->TablesCount;
+}
+
+// This handles the "LABEL" extension.
+// Label, nTable, Type
+
+int CMSEXPORT cmsIT8SetTableByLabel(cmsHANDLE hIT8, const char* cSet, const char* cField, const char* ExpectedType)
+{
+ const char* cLabelFld;
+ char Type[256], Label[256];
+ int nTable;
+
+ _cmsAssert(hIT8 != NULL);
+
+ if (cField != NULL && *cField == 0)
+ cField = "LABEL";
+
+ if (cField == NULL)
+ cField = "LABEL";
+
+ cLabelFld = cmsIT8GetData(hIT8, cSet, cField);
+ if (!cLabelFld) return -1;
+
+ if (sscanf(cLabelFld, "%255s %d %255s", Label, &nTable, Type) != 3)
+ return -1;
+
+ if (ExpectedType != NULL && *ExpectedType == 0)
+ ExpectedType = NULL;
+
+ if (ExpectedType) {
+
+ if (cmsstrcasecmp(Type, ExpectedType) != 0) return -1;
+ }
+
+ return cmsIT8SetTable(hIT8, nTable);
+}
+
+
+cmsBool CMSEXPORT cmsIT8SetIndexColumn(cmsHANDLE hIT8, const char* cSample)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+ int pos;
+
+ _cmsAssert(hIT8 != NULL);
+
+ pos = LocateSample(it8, cSample);
+ if(pos == -1)
+ return FALSE;
+
+ it8->Tab[it8->nTable].SampleID = pos;
+ return TRUE;
+}
+
+
+void CMSEXPORT cmsIT8DefineDblFormat(cmsHANDLE hIT8, const char* Formatter)
+{
+ cmsIT8* it8 = (cmsIT8*) hIT8;
+
+ _cmsAssert(hIT8 != NULL);
+
+ if (Formatter == NULL)
+ strcpy(it8->DoubleFormatter, DEFAULT_DBL_FORMAT);
+ else
+ strncpy(it8->DoubleFormatter, Formatter, sizeof(it8->DoubleFormatter));
+
+ it8 ->DoubleFormatter[sizeof(it8 ->DoubleFormatter)-1] = 0;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c
new file mode 100644
index 0000000000..1a93e83f90
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmscnvrt.c
@@ -0,0 +1,1142 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Link several profiles to obtain a single LUT modelling the whole color transform. Intents, Black point
+// compensation and Adaptation parameters may vary across profiles. BPC and Adaptation refers to the PCS
+// after the profile. I.e, BPC[0] refers to connexion between profile(0) and profile(1)
+cmsPipeline* _cmsLinkProfiles(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the default routine for ICC-style intents. A user may decide to override it by using a plugin.
+// Supported intents are perceptual, relative colorimetric, saturation and ICC-absolute colorimetric
+static
+cmsPipeline* DefaultICCintents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the entry for black-preserving K-only intents, which are non-ICC. Last profile have to be a output profile
+// to do the trick (no devicelinks allowed at that position)
+static
+cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+// This is the entry for black-plane preserving, which are non-ICC. Again, Last profile have to be a output profile
+// to do the trick (no devicelinks allowed at that position)
+static
+cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number Intents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+//---------------------------------------------------------------------------------
+
+
+// This is a structure holding implementations for all supported intents.
+typedef struct _cms_intents_list {
+
+ cmsUInt32Number Intent;
+ char Description[256];
+ cmsIntentFn Link;
+ struct _cms_intents_list* Next;
+
+} cmsIntentsList;
+
+
+// Built-in intents
+static cmsIntentsList DefaultIntents[] = {
+
+ { INTENT_PERCEPTUAL, "Perceptual", DefaultICCintents, &DefaultIntents[1] },
+ { INTENT_RELATIVE_COLORIMETRIC, "Relative colorimetric", DefaultICCintents, &DefaultIntents[2] },
+ { INTENT_SATURATION, "Saturation", DefaultICCintents, &DefaultIntents[3] },
+ { INTENT_ABSOLUTE_COLORIMETRIC, "Absolute colorimetric", DefaultICCintents, &DefaultIntents[4] },
+ { INTENT_PRESERVE_K_ONLY_PERCEPTUAL, "Perceptual preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[5] },
+ { INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC, "Relative colorimetric preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[6] },
+ { INTENT_PRESERVE_K_ONLY_SATURATION, "Saturation preserving black ink", BlackPreservingKOnlyIntents, &DefaultIntents[7] },
+ { INTENT_PRESERVE_K_PLANE_PERCEPTUAL, "Perceptual preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[8] },
+ { INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC,"Relative colorimetric preserving black plane", BlackPreservingKPlaneIntents, &DefaultIntents[9] },
+ { INTENT_PRESERVE_K_PLANE_SATURATION, "Saturation preserving black plane", BlackPreservingKPlaneIntents, NULL }
+};
+
+
+// A pointer to the begining of the list
+_cmsIntentsPluginChunkType _cmsIntentsPluginChunk = { NULL };
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginIntentsList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsIntentsPluginChunkType newHead = { NULL };
+ cmsIntentsList* entry;
+ cmsIntentsList* Anterior = NULL;
+ _cmsIntentsPluginChunkType* head = (_cmsIntentsPluginChunkType*) src->chunks[IntentPlugin];
+
+ // Walk the list copying all nodes
+ for (entry = head->Intents;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ cmsIntentsList *newEntry = ( cmsIntentsList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsIntentsList));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.Intents == NULL)
+ newHead.Intents = newEntry;
+ }
+
+ ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsIntentsPluginChunkType));
+}
+
+void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ // Copy all linked list
+ DupPluginIntentsList(ctx, src);
+ }
+ else {
+ static _cmsIntentsPluginChunkType IntentsPluginChunkType = { NULL };
+ ctx ->chunks[IntentPlugin] = _cmsSubAllocDup(ctx ->MemPool, &IntentsPluginChunkType, sizeof(_cmsIntentsPluginChunkType));
+ }
+}
+
+
+// Search the list for a suitable intent. Returns NULL if not found
+static
+cmsIntentsList* SearchIntent(cmsContext ContextID, cmsUInt32Number Intent)
+{
+ _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);
+ cmsIntentsList* pt;
+
+ for (pt = ctx -> Intents; pt != NULL; pt = pt -> Next)
+ if (pt ->Intent == Intent) return pt;
+
+ for (pt = DefaultIntents; pt != NULL; pt = pt -> Next)
+ if (pt ->Intent == Intent) return pt;
+
+ return NULL;
+}
+
+// Black point compensation. Implemented as a linear scaling in XYZ. Black points
+// should come relative to the white point. Fills an matrix/offset element m
+// which is organized as a 4x4 matrix.
+static
+void ComputeBlackPointCompensation(const cmsCIEXYZ* BlackPointIn,
+ const cmsCIEXYZ* BlackPointOut,
+ cmsMAT3* m, cmsVEC3* off)
+{
+ cmsFloat64Number ax, ay, az, bx, by, bz, tx, ty, tz;
+
+ // Now we need to compute a matrix plus an offset m and of such of
+ // [m]*bpin + off = bpout
+ // [m]*D50 + off = D50
+ //
+ // This is a linear scaling in the form ax+b, where
+ // a = (bpout - D50) / (bpin - D50)
+ // b = - D50* (bpout - bpin) / (bpin - D50)
+
+ tx = BlackPointIn->X - cmsD50_XYZ()->X;
+ ty = BlackPointIn->Y - cmsD50_XYZ()->Y;
+ tz = BlackPointIn->Z - cmsD50_XYZ()->Z;
+
+ ax = (BlackPointOut->X - cmsD50_XYZ()->X) / tx;
+ ay = (BlackPointOut->Y - cmsD50_XYZ()->Y) / ty;
+ az = (BlackPointOut->Z - cmsD50_XYZ()->Z) / tz;
+
+ bx = - cmsD50_XYZ()-> X * (BlackPointOut->X - BlackPointIn->X) / tx;
+ by = - cmsD50_XYZ()-> Y * (BlackPointOut->Y - BlackPointIn->Y) / ty;
+ bz = - cmsD50_XYZ()-> Z * (BlackPointOut->Z - BlackPointIn->Z) / tz;
+
+ _cmsVEC3init(&m ->v[0], ax, 0, 0);
+ _cmsVEC3init(&m ->v[1], 0, ay, 0);
+ _cmsVEC3init(&m ->v[2], 0, 0, az);
+ _cmsVEC3init(off, bx, by, bz);
+
+}
+
+
+// Approximate a blackbody illuminant based on CHAD information
+static
+cmsFloat64Number CHAD2Temp(const cmsMAT3* Chad)
+{
+ // Convert D50 across inverse CHAD to get the absolute white point
+ cmsVEC3 d, s;
+ cmsCIEXYZ Dest;
+ cmsCIExyY DestChromaticity;
+ cmsFloat64Number TempK;
+ cmsMAT3 m1, m2;
+
+ m1 = *Chad;
+ if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;
+
+ s.n[VX] = cmsD50_XYZ() -> X;
+ s.n[VY] = cmsD50_XYZ() -> Y;
+ s.n[VZ] = cmsD50_XYZ() -> Z;
+
+ _cmsMAT3eval(&d, &m2, &s);
+
+ Dest.X = d.n[VX];
+ Dest.Y = d.n[VY];
+ Dest.Z = d.n[VZ];
+
+ cmsXYZ2xyY(&DestChromaticity, &Dest);
+
+ if (!cmsTempFromWhitePoint(&TempK, &DestChromaticity))
+ return -1.0;
+
+ return TempK;
+}
+
+// Compute a CHAD based on a given temperature
+static
+ void Temp2CHAD(cmsMAT3* Chad, cmsFloat64Number Temp)
+{
+ cmsCIEXYZ White;
+ cmsCIExyY ChromaticityOfWhite;
+
+ cmsWhitePointFromTemp(&ChromaticityOfWhite, Temp);
+ cmsxyY2XYZ(&White, &ChromaticityOfWhite);
+ _cmsAdaptationMatrix(Chad, NULL, &White, cmsD50_XYZ());
+}
+
+// Join scalings to obtain relative input to absolute and then to relative output.
+// Result is stored in a 3x3 matrix
+static
+cmsBool ComputeAbsoluteIntent(cmsFloat64Number AdaptationState,
+ const cmsCIEXYZ* WhitePointIn,
+ const cmsMAT3* ChromaticAdaptationMatrixIn,
+ const cmsCIEXYZ* WhitePointOut,
+ const cmsMAT3* ChromaticAdaptationMatrixOut,
+ cmsMAT3* m)
+{
+ cmsMAT3 Scale, m1, m2, m3, m4;
+
+ // Adaptation state
+ if (AdaptationState == 1.0) {
+
+ // Observer is fully adapted. Keep chromatic adaptation.
+ // That is the standard V4 behaviour
+ _cmsVEC3init(&m->v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);
+ _cmsVEC3init(&m->v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0);
+ _cmsVEC3init(&m->v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z);
+
+ }
+ else {
+
+ // Incomplete adaptation. This is an advanced feature.
+ _cmsVEC3init(&Scale.v[0], WhitePointIn->X / WhitePointOut->X, 0, 0);
+ _cmsVEC3init(&Scale.v[1], 0, WhitePointIn->Y / WhitePointOut->Y, 0);
+ _cmsVEC3init(&Scale.v[2], 0, 0, WhitePointIn->Z / WhitePointOut->Z);
+
+
+ if (AdaptationState == 0.0) {
+
+ m1 = *ChromaticAdaptationMatrixOut;
+ _cmsMAT3per(&m2, &m1, &Scale);
+ // m2 holds CHAD from output white to D50 times abs. col. scaling
+
+ // Observer is not adapted, undo the chromatic adaptation
+ _cmsMAT3per(m, &m2, ChromaticAdaptationMatrixOut);
+
+ m3 = *ChromaticAdaptationMatrixIn;
+ if (!_cmsMAT3inverse(&m3, &m4)) return FALSE;
+ _cmsMAT3per(m, &m2, &m4);
+
+ } else {
+
+ cmsMAT3 MixedCHAD;
+ cmsFloat64Number TempSrc, TempDest, Temp;
+
+ m1 = *ChromaticAdaptationMatrixIn;
+ if (!_cmsMAT3inverse(&m1, &m2)) return FALSE;
+ _cmsMAT3per(&m3, &m2, &Scale);
+ // m3 holds CHAD from input white to D50 times abs. col. scaling
+
+ TempSrc = CHAD2Temp(ChromaticAdaptationMatrixIn);
+ TempDest = CHAD2Temp(ChromaticAdaptationMatrixOut);
+
+ if (TempSrc < 0.0 || TempDest < 0.0) return FALSE; // Something went wrong
+
+ if (_cmsMAT3isIdentity(&Scale) && fabs(TempSrc - TempDest) < 0.01) {
+
+ _cmsMAT3identity(m);
+ return TRUE;
+ }
+
+ Temp = (1.0 - AdaptationState) * TempDest + AdaptationState * TempSrc;
+
+ // Get a CHAD from whatever output temperature to D50. This replaces output CHAD
+ Temp2CHAD(&MixedCHAD, Temp);
+
+ _cmsMAT3per(m, &m3, &MixedCHAD);
+ }
+
+ }
+ return TRUE;
+
+}
+
+// Just to see if m matrix should be applied
+static
+cmsBool IsEmptyLayer(cmsMAT3* m, cmsVEC3* off)
+{
+ cmsFloat64Number diff = 0;
+ cmsMAT3 Ident;
+ int i;
+
+ if (m == NULL && off == NULL) return TRUE; // NULL is allowed as an empty layer
+ if (m == NULL && off != NULL) return FALSE; // This is an internal error
+
+ _cmsMAT3identity(&Ident);
+
+ for (i=0; i < 3*3; i++)
+ diff += fabs(((cmsFloat64Number*)m)[i] - ((cmsFloat64Number*)&Ident)[i]);
+
+ for (i=0; i < 3; i++)
+ diff += fabs(((cmsFloat64Number*)off)[i]);
+
+
+ return (diff < 0.002);
+}
+
+
+// Compute the conversion layer
+static
+cmsBool ComputeConversion(int i, cmsHPROFILE hProfiles[],
+ cmsUInt32Number Intent,
+ cmsBool BPC,
+ cmsFloat64Number AdaptationState,
+ cmsMAT3* m, cmsVEC3* off)
+{
+
+ int k;
+
+ // m and off are set to identity and this is detected latter on
+ _cmsMAT3identity(m);
+ _cmsVEC3init(off, 0, 0, 0);
+
+ // If intent is abs. colorimetric,
+ if (Intent == INTENT_ABSOLUTE_COLORIMETRIC) {
+
+ cmsCIEXYZ WhitePointIn, WhitePointOut;
+ cmsMAT3 ChromaticAdaptationMatrixIn, ChromaticAdaptationMatrixOut;
+
+ _cmsReadMediaWhitePoint(&WhitePointIn, hProfiles[i-1]);
+ _cmsReadCHAD(&ChromaticAdaptationMatrixIn, hProfiles[i-1]);
+
+ _cmsReadMediaWhitePoint(&WhitePointOut, hProfiles[i]);
+ _cmsReadCHAD(&ChromaticAdaptationMatrixOut, hProfiles[i]);
+
+ if (!ComputeAbsoluteIntent(AdaptationState,
+ &WhitePointIn, &ChromaticAdaptationMatrixIn,
+ &WhitePointOut, &ChromaticAdaptationMatrixOut, m)) return FALSE;
+
+ }
+ else {
+ // Rest of intents may apply BPC.
+
+ if (BPC) {
+
+ cmsCIEXYZ BlackPointIn, BlackPointOut;
+
+ cmsDetectBlackPoint(&BlackPointIn, hProfiles[i-1], Intent, 0);
+ cmsDetectDestinationBlackPoint(&BlackPointOut, hProfiles[i], Intent, 0);
+
+ // If black points are equal, then do nothing
+ if (BlackPointIn.X != BlackPointOut.X ||
+ BlackPointIn.Y != BlackPointOut.Y ||
+ BlackPointIn.Z != BlackPointOut.Z)
+ ComputeBlackPointCompensation(&BlackPointIn, &BlackPointOut, m, off);
+ }
+ }
+
+ // Offset should be adjusted because the encoding. We encode XYZ normalized to 0..1.0,
+ // to do that, we divide by MAX_ENCODEABLE_XZY. The conversion stage goes XYZ -> XYZ so
+ // we have first to convert from encoded to XYZ and then convert back to encoded.
+ // y = Mx + Off
+ // x = x'c
+ // y = M x'c + Off
+ // y = y'c; y' = y / c
+ // y' = (Mx'c + Off) /c = Mx' + (Off / c)
+
+ for (k=0; k < 3; k++) {
+ off ->n[k] /= MAX_ENCODEABLE_XYZ;
+ }
+
+ return TRUE;
+}
+
+
+// Add a conversion stage if needed. If a matrix/offset m is given, it applies to XYZ space
+static
+cmsBool AddConversion(cmsPipeline* Result, cmsColorSpaceSignature InPCS, cmsColorSpaceSignature OutPCS, cmsMAT3* m, cmsVEC3* off)
+{
+ cmsFloat64Number* m_as_dbl = (cmsFloat64Number*) m;
+ cmsFloat64Number* off_as_dbl = (cmsFloat64Number*) off;
+
+ // Handle PCS mismatches. A specialized stage is added to the LUT in such case
+ switch (InPCS) {
+
+ case cmsSigXYZData: // Input profile operates in XYZ
+
+ switch (OutPCS) {
+
+ case cmsSigXYZData: // XYZ -> XYZ
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ break;
+
+ case cmsSigLabData: // XYZ -> Lab
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+ return FALSE;
+ break;
+
+ default:
+ return FALSE; // Colorspace mismatch
+ }
+ break;
+
+ case cmsSigLabData: // Input profile operates in Lab
+
+ switch (OutPCS) {
+
+ case cmsSigXYZData: // Lab -> XYZ
+
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)))
+ return FALSE;
+ if (!IsEmptyLayer(m, off) &&
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)))
+ return FALSE;
+ break;
+
+ case cmsSigLabData: // Lab -> Lab
+
+ if (!IsEmptyLayer(m, off)) {
+ if (!cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocLab2XYZ(Result ->ContextID)) ||
+ !cmsPipelineInsertStage(Result, cmsAT_END, cmsStageAllocMatrix(Result ->ContextID, 3, 3, m_as_dbl, off_as_dbl)) ||
+ !cmsPipelineInsertStage(Result, cmsAT_END, _cmsStageAllocXYZ2Lab(Result ->ContextID)))
+ return FALSE;
+ }
+ break;
+
+ default:
+ return FALSE; // Mismatch
+ }
+ break;
+
+ // On colorspaces other than PCS, check for same space
+ default:
+ if (InPCS != OutPCS) return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+
+// Is a given space compatible with another?
+static
+cmsBool ColorSpaceIsCompatible(cmsColorSpaceSignature a, cmsColorSpaceSignature b)
+{
+ // If they are same, they are compatible.
+ if (a == b) return TRUE;
+
+ // Check for MCH4 substitution of CMYK
+ if ((a == cmsSig4colorData) && (b == cmsSigCmykData)) return TRUE;
+ if ((a == cmsSigCmykData) && (b == cmsSig4colorData)) return TRUE;
+
+ // Check for XYZ/Lab. Those spaces are interchangeable as they can be computed one from other.
+ if ((a == cmsSigXYZData) && (b == cmsSigLabData)) return TRUE;
+ if ((a == cmsSigLabData) && (b == cmsSigXYZData)) return TRUE;
+
+ return FALSE;
+}
+
+
+// Default handler for ICC-style intents
+static
+cmsPipeline* DefaultICCintents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsPipeline* Lut = NULL;
+ cmsPipeline* Result;
+ cmsHPROFILE hProfile;
+ cmsMAT3 m;
+ cmsVEC3 off;
+ cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut, CurrentColorSpace;
+ cmsProfileClassSignature ClassSig;
+ cmsUInt32Number i, Intent;
+
+ // For safety
+ if (nProfiles == 0) return NULL;
+
+ // Allocate an empty LUT for holding the result. 0 as channel count means 'undefined'
+ Result = cmsPipelineAlloc(ContextID, 0, 0);
+ if (Result == NULL) return NULL;
+
+ CurrentColorSpace = cmsGetColorSpace(hProfiles[0]);
+
+ for (i=0; i < nProfiles; i++) {
+
+ cmsBool lIsDeviceLink, lIsInput;
+
+ hProfile = hProfiles[i];
+ ClassSig = cmsGetDeviceClass(hProfile);
+ lIsDeviceLink = (ClassSig == cmsSigLinkClass || ClassSig == cmsSigAbstractClass );
+
+ // First profile is used as input unless devicelink or abstract
+ if ((i == 0) && !lIsDeviceLink) {
+ lIsInput = TRUE;
+ }
+ else {
+ // Else use profile in the input direction if current space is not PCS
+ lIsInput = (CurrentColorSpace != cmsSigXYZData) &&
+ (CurrentColorSpace != cmsSigLabData);
+ }
+
+ Intent = TheIntents[i];
+
+ if (lIsInput || lIsDeviceLink) {
+
+ ColorSpaceIn = cmsGetColorSpace(hProfile);
+ ColorSpaceOut = cmsGetPCS(hProfile);
+ }
+ else {
+
+ ColorSpaceIn = cmsGetPCS(hProfile);
+ ColorSpaceOut = cmsGetColorSpace(hProfile);
+ }
+
+ if (!ColorSpaceIsCompatible(ColorSpaceIn, CurrentColorSpace)) {
+
+ cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "ColorSpace mismatch");
+ goto Error;
+ }
+
+ // If devicelink is found, then no custom intent is allowed and we can
+ // read the LUT to be applied. Settings don't apply here.
+ if (lIsDeviceLink || ((ClassSig == cmsSigNamedColorClass) && (nProfiles == 1))) {
+
+ // Get the involved LUT from the profile
+ Lut = _cmsReadDevicelinkLUT(hProfile, Intent);
+ if (Lut == NULL) goto Error;
+
+ // What about abstract profiles?
+ if (ClassSig == cmsSigAbstractClass && i > 0) {
+ if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;
+ }
+ else {
+ _cmsMAT3identity(&m);
+ _cmsVEC3init(&off, 0, 0, 0);
+ }
+
+
+ if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;
+
+ }
+ else {
+
+ if (lIsInput) {
+ // Input direction means non-pcs connection, so proceed like devicelinks
+ Lut = _cmsReadInputLUT(hProfile, Intent);
+ if (Lut == NULL) goto Error;
+ }
+ else {
+
+ // Output direction means PCS connection. Intent may apply here
+ Lut = _cmsReadOutputLUT(hProfile, Intent);
+ if (Lut == NULL) goto Error;
+
+
+ if (!ComputeConversion(i, hProfiles, Intent, BPC[i], AdaptationStates[i], &m, &off)) goto Error;
+ if (!AddConversion(Result, CurrentColorSpace, ColorSpaceIn, &m, &off)) goto Error;
+
+ }
+ }
+
+ // Concatenate to the output LUT
+ if (!cmsPipelineCat(Result, Lut))
+ goto Error;
+
+ cmsPipelineFree(Lut);
+ Lut = NULL;
+
+ // Update current space
+ CurrentColorSpace = ColorSpaceOut;
+ }
+
+ return Result;
+
+Error:
+
+ if (Lut != NULL) cmsPipelineFree(Lut);
+ if (Result != NULL) cmsPipelineFree(Result);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(dwFlags);
+}
+
+
+// Wrapper for DLL calling convention
+cmsPipeline* CMSEXPORT _cmsDefaultICCintents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ return DefaultICCintents(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+}
+
+// Black preserving intents ---------------------------------------------------------------------------------------------
+
+// Translate black-preserving intents to ICC ones
+static
+int TranslateNonICCIntents(int Intent)
+{
+ switch (Intent) {
+ case INTENT_PRESERVE_K_ONLY_PERCEPTUAL:
+ case INTENT_PRESERVE_K_PLANE_PERCEPTUAL:
+ return INTENT_PERCEPTUAL;
+
+ case INTENT_PRESERVE_K_ONLY_RELATIVE_COLORIMETRIC:
+ case INTENT_PRESERVE_K_PLANE_RELATIVE_COLORIMETRIC:
+ return INTENT_RELATIVE_COLORIMETRIC;
+
+ case INTENT_PRESERVE_K_ONLY_SATURATION:
+ case INTENT_PRESERVE_K_PLANE_SATURATION:
+ return INTENT_SATURATION;
+
+ default: return Intent;
+ }
+}
+
+// Sampler for Black-only preserving CMYK->CMYK transforms
+
+typedef struct {
+ cmsPipeline* cmyk2cmyk; // The original transform
+ cmsToneCurve* KTone; // Black-to-black tone curve
+
+} GrayOnlyParams;
+
+
+// Preserve black only if that is the only ink used
+static
+int BlackPreservingGrayOnlySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ GrayOnlyParams* bp = (GrayOnlyParams*) Cargo;
+
+ // If going across black only, keep black only
+ if (In[0] == 0 && In[1] == 0 && In[2] == 0) {
+
+ // TAC does not apply because it is black ink!
+ Out[0] = Out[1] = Out[2] = 0;
+ Out[3] = cmsEvalToneCurve16(bp->KTone, In[3]);
+ return TRUE;
+ }
+
+ // Keep normal transform for other colors
+ bp ->cmyk2cmyk ->Eval16Fn(In, Out, bp ->cmyk2cmyk->Data);
+ return TRUE;
+}
+
+// This is the entry for black-preserving K-only intents, which are non-ICC
+static
+cmsPipeline* BlackPreservingKOnlyIntents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ GrayOnlyParams bp;
+ cmsPipeline* Result;
+ cmsUInt32Number ICCIntents[256];
+ cmsStage* CLUT;
+ cmsUInt32Number i, nGridPoints;
+
+
+ // Sanity check
+ if (nProfiles < 1 || nProfiles > 255) return NULL;
+
+ // Translate black-preserving intents to ICC ones
+ for (i=0; i < nProfiles; i++)
+ ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);
+
+ // Check for non-cmyk profiles
+ if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+ cmsGetColorSpace(hProfiles[nProfiles-1]) != cmsSigCmykData)
+ return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+
+ memset(&bp, 0, sizeof(bp));
+
+ // Allocate an empty LUT for holding the result
+ Result = cmsPipelineAlloc(ContextID, 4, 4);
+ if (Result == NULL) return NULL;
+
+ // Create a LUT holding normal ICC transform
+ bp.cmyk2cmyk = DefaultICCintents(ContextID,
+ nProfiles,
+ ICCIntents,
+ hProfiles,
+ BPC,
+ AdaptationStates,
+ dwFlags);
+
+ if (bp.cmyk2cmyk == NULL) goto Error;
+
+ // Now, compute the tone curve
+ bp.KTone = _cmsBuildKToneCurve(ContextID,
+ 4096,
+ nProfiles,
+ ICCIntents,
+ hProfiles,
+ BPC,
+ AdaptationStates,
+ dwFlags);
+
+ if (bp.KTone == NULL) goto Error;
+
+
+ // How many gridpoints are we going to use?
+ nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);
+
+ // Create the CLUT. 16 bits
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
+ if (CLUT == NULL) goto Error;
+
+ // This is the one and only MPE in this LUT
+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+ goto Error;
+
+ // Sample it. We cannot afford pre/post linearization this time.
+ if (!cmsStageSampleCLut16bit(CLUT, BlackPreservingGrayOnlySampler, (void*) &bp, 0))
+ goto Error;
+
+ // Get rid of xform and tone curve
+ cmsPipelineFree(bp.cmyk2cmyk);
+ cmsFreeToneCurve(bp.KTone);
+
+ return Result;
+
+Error:
+
+ if (bp.cmyk2cmyk != NULL) cmsPipelineFree(bp.cmyk2cmyk);
+ if (bp.KTone != NULL) cmsFreeToneCurve(bp.KTone);
+ if (Result != NULL) cmsPipelineFree(Result);
+ return NULL;
+
+}
+
+// K Plane-preserving CMYK to CMYK ------------------------------------------------------------------------------------
+
+typedef struct {
+
+ cmsPipeline* cmyk2cmyk; // The original transform
+ cmsHTRANSFORM hProofOutput; // Output CMYK to Lab (last profile)
+ cmsHTRANSFORM cmyk2Lab; // The input chain
+ cmsToneCurve* KTone; // Black-to-black tone curve
+ cmsPipeline* LabK2cmyk; // The output profile
+ cmsFloat64Number MaxError;
+
+ cmsHTRANSFORM hRoundTrip;
+ cmsFloat64Number MaxTAC;
+
+
+} PreserveKPlaneParams;
+
+
+// The CLUT will be stored at 16 bits, but calculations are performed at cmsFloat32Number precision
+static
+int BlackPreservingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ int i;
+ cmsFloat32Number Inf[4], Outf[4];
+ cmsFloat32Number LabK[4];
+ cmsFloat64Number SumCMY, SumCMYK, Error, Ratio;
+ cmsCIELab ColorimetricLab, BlackPreservingLab;
+ PreserveKPlaneParams* bp = (PreserveKPlaneParams*) Cargo;
+
+ // Convert from 16 bits to floating point
+ for (i=0; i < 4; i++)
+ Inf[i] = (cmsFloat32Number) (In[i] / 65535.0);
+
+ // Get the K across Tone curve
+ LabK[3] = cmsEvalToneCurveFloat(bp ->KTone, Inf[3]);
+
+ // If going across black only, keep black only
+ if (In[0] == 0 && In[1] == 0 && In[2] == 0) {
+
+ Out[0] = Out[1] = Out[2] = 0;
+ Out[3] = _cmsQuickSaturateWord(LabK[3] * 65535.0);
+ return TRUE;
+ }
+
+ // Try the original transform,
+ cmsPipelineEvalFloat( Inf, Outf, bp ->cmyk2cmyk);
+
+ // Store a copy of the floating point result into 16-bit
+ for (i=0; i < 4; i++)
+ Out[i] = _cmsQuickSaturateWord(Outf[i] * 65535.0);
+
+ // Maybe K is already ok (mostly on K=0)
+ if ( fabs(Outf[3] - LabK[3]) < (3.0 / 65535.0) ) {
+ return TRUE;
+ }
+
+ // K differ, mesure and keep Lab measurement for further usage
+ // this is done in relative colorimetric intent
+ cmsDoTransform(bp->hProofOutput, Out, &ColorimetricLab, 1);
+
+ // Is not black only and the transform doesn't keep black.
+ // Obtain the Lab of output CMYK. After that we have Lab + K
+ cmsDoTransform(bp ->cmyk2Lab, Outf, LabK, 1);
+
+ // Obtain the corresponding CMY using reverse interpolation
+ // (K is fixed in LabK[3])
+ if (!cmsPipelineEvalReverseFloat(LabK, Outf, Outf, bp ->LabK2cmyk)) {
+
+ // Cannot find a suitable value, so use colorimetric xform
+ // which is already stored in Out[]
+ return TRUE;
+ }
+
+ // Make sure to pass thru K (which now is fixed)
+ Outf[3] = LabK[3];
+
+ // Apply TAC if needed
+ SumCMY = Outf[0] + Outf[1] + Outf[2];
+ SumCMYK = SumCMY + Outf[3];
+
+ if (SumCMYK > bp ->MaxTAC) {
+
+ Ratio = 1 - ((SumCMYK - bp->MaxTAC) / SumCMY);
+ if (Ratio < 0)
+ Ratio = 0;
+ }
+ else
+ Ratio = 1.0;
+
+ Out[0] = _cmsQuickSaturateWord(Outf[0] * Ratio * 65535.0); // C
+ Out[1] = _cmsQuickSaturateWord(Outf[1] * Ratio * 65535.0); // M
+ Out[2] = _cmsQuickSaturateWord(Outf[2] * Ratio * 65535.0); // Y
+ Out[3] = _cmsQuickSaturateWord(Outf[3] * 65535.0);
+
+ // Estimate the error (this goes 16 bits to Lab DBL)
+ cmsDoTransform(bp->hProofOutput, Out, &BlackPreservingLab, 1);
+ Error = cmsDeltaE(&ColorimetricLab, &BlackPreservingLab);
+ if (Error > bp -> MaxError)
+ bp->MaxError = Error;
+
+ return TRUE;
+}
+
+// This is the entry for black-plane preserving, which are non-ICC
+static
+cmsPipeline* BlackPreservingKPlaneIntents(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ PreserveKPlaneParams bp;
+ cmsPipeline* Result = NULL;
+ cmsUInt32Number ICCIntents[256];
+ cmsStage* CLUT;
+ cmsUInt32Number i, nGridPoints;
+ cmsHPROFILE hLab;
+
+ // Sanity check
+ if (nProfiles < 1 || nProfiles > 255) return NULL;
+
+ // Translate black-preserving intents to ICC ones
+ for (i=0; i < nProfiles; i++)
+ ICCIntents[i] = TranslateNonICCIntents(TheIntents[i]);
+
+ // Check for non-cmyk profiles
+ if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+ !(cmsGetColorSpace(hProfiles[nProfiles-1]) == cmsSigCmykData ||
+ cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigOutputClass))
+ return DefaultICCintents(ContextID, nProfiles, ICCIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+
+ // Allocate an empty LUT for holding the result
+ Result = cmsPipelineAlloc(ContextID, 4, 4);
+ if (Result == NULL) return NULL;
+
+
+ memset(&bp, 0, sizeof(bp));
+
+ // We need the input LUT of the last profile, assuming this one is responsible of
+ // black generation. This LUT will be seached in inverse order.
+ bp.LabK2cmyk = _cmsReadInputLUT(hProfiles[nProfiles-1], INTENT_RELATIVE_COLORIMETRIC);
+ if (bp.LabK2cmyk == NULL) goto Cleanup;
+
+ // Get total area coverage (in 0..1 domain)
+ bp.MaxTAC = cmsDetectTAC(hProfiles[nProfiles-1]) / 100.0;
+ if (bp.MaxTAC <= 0) goto Cleanup;
+
+
+ // Create a LUT holding normal ICC transform
+ bp.cmyk2cmyk = DefaultICCintents(ContextID,
+ nProfiles,
+ ICCIntents,
+ hProfiles,
+ BPC,
+ AdaptationStates,
+ dwFlags);
+ if (bp.cmyk2cmyk == NULL) goto Cleanup;
+
+ // Now the tone curve
+ bp.KTone = _cmsBuildKToneCurve(ContextID, 4096, nProfiles,
+ ICCIntents,
+ hProfiles,
+ BPC,
+ AdaptationStates,
+ dwFlags);
+ if (bp.KTone == NULL) goto Cleanup;
+
+ // To measure the output, Last profile to Lab
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ bp.hProofOutput = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],
+ CHANNELS_SH(4)|BYTES_SH(2), hLab, TYPE_Lab_DBL,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+ if ( bp.hProofOutput == NULL) goto Cleanup;
+
+ // Same as anterior, but lab in the 0..1 range
+ bp.cmyk2Lab = cmsCreateTransformTHR(ContextID, hProfiles[nProfiles-1],
+ FLOAT_SH(1)|CHANNELS_SH(4)|BYTES_SH(4), hLab,
+ FLOAT_SH(1)|CHANNELS_SH(3)|BYTES_SH(4),
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+ if (bp.cmyk2Lab == NULL) goto Cleanup;
+ cmsCloseProfile(hLab);
+
+ // Error estimation (for debug only)
+ bp.MaxError = 0;
+
+ // How many gridpoints are we going to use?
+ nGridPoints = _cmsReasonableGridpointsByColorspace(cmsSigCmykData, dwFlags);
+
+
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridPoints, 4, 4, NULL);
+ if (CLUT == NULL) goto Cleanup;
+
+ if (!cmsPipelineInsertStage(Result, cmsAT_BEGIN, CLUT))
+ goto Cleanup;
+
+ cmsStageSampleCLut16bit(CLUT, BlackPreservingSampler, (void*) &bp, 0);
+
+Cleanup:
+
+ if (bp.cmyk2cmyk) cmsPipelineFree(bp.cmyk2cmyk);
+ if (bp.cmyk2Lab) cmsDeleteTransform(bp.cmyk2Lab);
+ if (bp.hProofOutput) cmsDeleteTransform(bp.hProofOutput);
+
+ if (bp.KTone) cmsFreeToneCurve(bp.KTone);
+ if (bp.LabK2cmyk) cmsPipelineFree(bp.LabK2cmyk);
+
+ return Result;
+}
+
+// Link routines ------------------------------------------------------------------------------------------------------
+
+// Chain several profiles into a single LUT. It just checks the parameters and then calls the handler
+// for the first intent in chain. The handler may be user-defined. Is up to the handler to deal with the
+// rest of intents in chain. A maximum of 255 profiles at time are supported, which is pretty reasonable.
+cmsPipeline* _cmsLinkProfiles(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsUInt32Number i;
+ cmsIntentsList* Intent;
+
+ // Make sure a reasonable number of profiles is provided
+ if (nProfiles <= 0 || nProfiles > 255) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't link '%d' profiles", nProfiles);
+ return NULL;
+ }
+
+ for (i=0; i < nProfiles; i++) {
+
+ // Check if black point is really needed or allowed. Note that
+ // following Adobe's document:
+ // BPC does not apply to devicelink profiles, nor to abs colorimetric,
+ // and applies always on V4 perceptual and saturation.
+
+ if (TheIntents[i] == INTENT_ABSOLUTE_COLORIMETRIC)
+ BPC[i] = FALSE;
+
+ if (TheIntents[i] == INTENT_PERCEPTUAL || TheIntents[i] == INTENT_SATURATION) {
+
+ // Force BPC for V4 profiles in perceptual and saturation
+ if (cmsGetProfileVersion(hProfiles[i]) >= 4.0)
+ BPC[i] = TRUE;
+ }
+ }
+
+ // Search for a handler. The first intent in the chain defines the handler. That would
+ // prevent using multiple custom intents in a multiintent chain, but the behaviour of
+ // this case would present some issues if the custom intent tries to do things like
+ // preserve primaries. This solution is not perfect, but works well on most cases.
+
+ Intent = SearchIntent(ContextID, TheIntents[0]);
+ if (Intent == NULL) {
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported intent '%d'", TheIntents[0]);
+ return NULL;
+ }
+
+ // Call the handler
+ return Intent ->Link(ContextID, nProfiles, TheIntents, hProfiles, BPC, AdaptationStates, dwFlags);
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// Get information about available intents. nMax is the maximum space for the supplied "Codes"
+// and "Descriptions" the function returns the total number of intents, which may be greater
+// than nMax, although the matrices are not populated beyond this level.
+cmsUInt32Number CMSEXPORT cmsGetSupportedIntentsTHR(cmsContext ContextID, cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)
+{
+ _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(ContextID, IntentPlugin);
+ cmsIntentsList* pt;
+ cmsUInt32Number nIntents;
+
+
+ for (nIntents=0, pt = ctx->Intents; pt != NULL; pt = pt -> Next)
+ {
+ if (nIntents < nMax) {
+ if (Codes != NULL)
+ Codes[nIntents] = pt ->Intent;
+
+ if (Descriptions != NULL)
+ Descriptions[nIntents] = pt ->Description;
+ }
+
+ nIntents++;
+ }
+
+ for (nIntents=0, pt = DefaultIntents; pt != NULL; pt = pt -> Next)
+ {
+ if (nIntents < nMax) {
+ if (Codes != NULL)
+ Codes[nIntents] = pt ->Intent;
+
+ if (Descriptions != NULL)
+ Descriptions[nIntents] = pt ->Description;
+ }
+
+ nIntents++;
+ }
+ return nIntents;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetSupportedIntents(cmsUInt32Number nMax, cmsUInt32Number* Codes, char** Descriptions)
+{
+ return cmsGetSupportedIntentsTHR(NULL, nMax, Codes, Descriptions);
+}
+
+// The plug-in registration. User can add new intents or override default routines
+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext id, cmsPluginBase* Data)
+{
+ _cmsIntentsPluginChunkType* ctx = ( _cmsIntentsPluginChunkType*) _cmsContextGetClientChunk(id, IntentPlugin);
+ cmsPluginRenderingIntent* Plugin = (cmsPluginRenderingIntent*) Data;
+ cmsIntentsList* fl;
+
+ // Do we have to reset the custom intents?
+ if (Data == NULL) {
+
+ ctx->Intents = NULL;
+ return TRUE;
+ }
+
+ fl = (cmsIntentsList*) _cmsPluginMalloc(id, sizeof(cmsIntentsList));
+ if (fl == NULL) return FALSE;
+
+
+ fl ->Intent = Plugin ->Intent;
+ strncpy(fl ->Description, Plugin ->Description, sizeof(fl ->Description)-1);
+ fl ->Description[sizeof(fl ->Description)-1] = 0;
+
+ fl ->Link = Plugin ->Link;
+
+ fl ->Next = ctx ->Intents;
+ ctx ->Intents = fl;
+
+ return TRUE;
+}
+
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
new file mode 100644
index 0000000000..745238c6e2
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmserr.c
@@ -0,0 +1,707 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+// I am so tired about incompatibilities on those functions that here are some replacements
+// that hopefully would be fully portable.
+
+// compare two strings ignoring case
+int CMSEXPORT cmsstrcasecmp(const char* s1, const char* s2)
+{
+ register const unsigned char *us1 = (const unsigned char *)s1,
+ *us2 = (const unsigned char *)s2;
+
+ while (toupper(*us1) == toupper(*us2++))
+ if (*us1++ == '\0')
+ return 0;
+
+ return (toupper(*us1) - toupper(*--us2));
+}
+
+// long int because C99 specifies ftell in such way (7.19.9.2)
+long int CMSEXPORT cmsfilelength(FILE* f)
+{
+ long int p , n;
+
+ p = ftell(f); // register current file position
+
+ if (fseek(f, 0, SEEK_END) != 0) {
+ return -1;
+ }
+
+ n = ftell(f);
+ fseek(f, p, SEEK_SET); // file position restored
+
+ return n;
+}
+
+#if 0
+// Memory handling ------------------------------------------------------------------
+//
+// This is the interface to low-level memory management routines. By default a simple
+// wrapping to malloc/free/realloc is provided, although there is a limit on the max
+// amount of memoy that can be reclaimed. This is mostly as a safety feature to prevent
+// bogus or evil code to allocate huge blocks that otherwise lcms would never need.
+
+#define MAX_MEMORY_FOR_ALLOC ((cmsUInt32Number)(1024U*1024U*512U))
+
+// User may override this behaviour by using a memory plug-in, which basically replaces
+// the default memory management functions. In this case, no check is performed and it
+// is up to the plug-in writter to keep in the safe side. There are only three functions
+// required to be implemented: malloc, realloc and free, although the user may want to
+// replace the optional mallocZero, calloc and dup as well.
+
+cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// *********************************************************************************
+
+// This is the default memory allocation function. It does a very coarse
+// check of amout of memory, just to prevent exploits
+static
+void* _cmsMallocDefaultFn(cmsContext ContextID, cmsUInt32Number size)
+{
+ if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never allow over maximum
+
+ return (void*) malloc(size);
+
+ cmsUNUSED_PARAMETER(ContextID);
+}
+
+// Generic allocate & zero
+static
+void* _cmsMallocZeroDefaultFn(cmsContext ContextID, cmsUInt32Number size)
+{
+ void *pt = _cmsMalloc(ContextID, size);
+ if (pt == NULL) return NULL;
+
+ memset(pt, 0, size);
+ return pt;
+}
+
+
+// The default free function. The only check proformed is against NULL pointers
+static
+void _cmsFreeDefaultFn(cmsContext ContextID, void *Ptr)
+{
+ // free(NULL) is defined a no-op by C99, therefore it is safe to
+ // avoid the check, but it is here just in case...
+
+ if (Ptr) free(Ptr);
+
+ cmsUNUSED_PARAMETER(ContextID);
+}
+
+// The default realloc function. Again it checks for exploits. If Ptr is NULL,
+// realloc behaves the same way as malloc and allocates a new block of size bytes.
+static
+void* _cmsReallocDefaultFn(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
+{
+
+ if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never realloc over 512Mb
+
+ return realloc(Ptr, size);
+
+ cmsUNUSED_PARAMETER(ContextID);
+}
+
+
+// The default calloc function. Allocates an array of num elements, each one of size bytes
+// all memory is initialized to zero.
+static
+void* _cmsCallocDefaultFn(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
+{
+ cmsUInt32Number Total = num * size;
+
+ // Preserve calloc behaviour
+ if (Total == 0) return NULL;
+
+ // Safe check for overflow.
+ if (num >= UINT_MAX / size) return NULL;
+
+ // Check for overflow
+ if (Total < num || Total < size) {
+ return NULL;
+ }
+
+ if (Total > MAX_MEMORY_FOR_ALLOC) return NULL; // Never alloc over 512Mb
+
+ return _cmsMallocZero(ContextID, Total);
+}
+
+// Generic block duplication
+static
+void* _cmsDupDefaultFn(cmsContext ContextID, const void* Org, cmsUInt32Number size)
+{
+ void* mem;
+
+ if (size > MAX_MEMORY_FOR_ALLOC) return NULL; // Never dup over 512Mb
+
+ mem = _cmsMalloc(ContextID, size);
+
+ if (mem != NULL && Org != NULL)
+ memmove(mem, Org, size);
+
+ return mem;
+}
+
+
+// Pointers to memory manager functions in Context0
+_cmsMemPluginChunkType _cmsMemPluginChunk = { _cmsMallocDefaultFn, _cmsMallocZeroDefaultFn, _cmsFreeDefaultFn,
+ _cmsReallocDefaultFn, _cmsCallocDefaultFn, _cmsDupDefaultFn
+ };
+
+
+// Reset and duplicate memory manager
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+ _cmsAssert(ctx != NULL);
+
+ if (src != NULL) {
+
+ // Duplicate
+ ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));
+ }
+ else {
+
+ // To reset it, we use the default allocators, which cannot be overriden
+ ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
+ }
+}
+
+// Auxiliar to fill memory management functions from plugin (or context 0 defaults)
+void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
+{
+ if (Plugin == NULL) {
+
+ memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));
+ }
+ else {
+
+ ptr ->MallocPtr = Plugin -> MallocPtr;
+ ptr ->FreePtr = Plugin -> FreePtr;
+ ptr ->ReallocPtr = Plugin -> ReallocPtr;
+
+ // Make sure we revert to defaults
+ ptr ->MallocZeroPtr= _cmsMallocZeroDefaultFn;
+ ptr ->CallocPtr = _cmsCallocDefaultFn;
+ ptr ->DupPtr = _cmsDupDefaultFn;
+
+ if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;
+ if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr;
+ if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr;
+
+ }
+}
+
+
+// Plug-in replacement entry
+cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase *Data)
+{
+ cmsPluginMemHandler* Plugin = (cmsPluginMemHandler*) Data;
+ _cmsMemPluginChunkType* ptr;
+
+ // NULL forces to reset to defaults. In this special case, the defaults are stored in the context structure.
+ // Remaining plug-ins does NOT have any copy in the context structure, but this is somehow special as the
+ // context internal data should be malloce'd by using those functions.
+ if (Data == NULL) {
+
+ struct _cmsContext_struct* ctx = ( struct _cmsContext_struct*) ContextID;
+
+ // Return to the default allocators
+ if (ContextID != NULL) {
+ ctx->chunks[MemPlugin] = (void*) &ctx->DefaultMemoryManager;
+ }
+ return TRUE;
+ }
+
+ // Check for required callbacks
+ if (Plugin -> MallocPtr == NULL ||
+ Plugin -> FreePtr == NULL ||
+ Plugin -> ReallocPtr == NULL) return FALSE;
+
+ // Set replacement functions
+ ptr = (_cmsMemPluginChunkType*) _cmsContextGetClientChunk(ContextID, MemPlugin);
+ if (ptr == NULL)
+ return FALSE;
+
+ _cmsInstallAllocFunctions(Plugin, ptr);
+ return TRUE;
+}
+#else
+#include "../../../../../include/fxcrt/fx_system.h"
+#include "../../../../../include/fxcrt/fx_memory.h"
+
+cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin)
+{
+ return TRUE;
+}
+
+// Generic allocate
+void* CMSEXPORT _cmsMalloc(cmsContext ContextID, cmsUInt32Number size)
+{
+ return FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+}
+
+// Generic allocate & zero
+void* CMSEXPORT _cmsMallocZero(cmsContext ContextID, cmsUInt32Number size)
+{
+ void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+ if (p) FXSYS_memset32(p, 0, size);
+ return p;
+}
+
+// Generic calloc
+void* CMSEXPORT _cmsCalloc(cmsContext ContextID, cmsUInt32Number num, cmsUInt32Number size)
+{
+ cmsUInt32Number total = num * size;
+ if (total == 0 || total / size != num || total >= 512 * 1024 * 1024)
+ return NULL;
+
+ return _cmsMallocZero(ContextID, num * size);
+}
+
+// Generic reallocate
+void* CMSEXPORT _cmsRealloc(cmsContext ContextID, void* Ptr, cmsUInt32Number size)
+{
+ return FXMEM_DefaultRealloc(Ptr, size, FXMEM_NONLEAVE);
+}
+
+// Generic free memory
+void CMSEXPORT _cmsFree(cmsContext ContextID, void* Ptr)
+{
+ if (Ptr != NULL) FXMEM_DefaultFree(Ptr, 0);
+}
+
+// Generic block duplication
+void* CMSEXPORT _cmsDupMem(cmsContext ContextID, const void* Org, cmsUInt32Number size)
+{
+ void* p = FXMEM_DefaultAlloc(size, FXMEM_NONLEAVE);
+ FXSYS_memmove32(p, Org, size);
+ return p;
+}
+
+_cmsMemPluginChunkType _cmsMemPluginChunk = {_cmsMalloc, _cmsMallocZero, _cmsFree,
+ _cmsRealloc, _cmsCalloc, _cmsDupMem
+ };
+
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+ _cmsAssert(ctx != NULL);
+
+ if (src != NULL) {
+
+ // Duplicate
+ ctx ->chunks[MemPlugin] = _cmsSubAllocDup(ctx ->MemPool, src ->chunks[MemPlugin], sizeof(_cmsMemPluginChunkType));
+ }
+ else {
+
+ // To reset it, we use the default allocators, which cannot be overriden
+ ctx ->chunks[MemPlugin] = &ctx ->DefaultMemoryManager;
+ }
+}
+
+void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr)
+{
+ if (Plugin == NULL) {
+
+ memcpy(ptr, &_cmsMemPluginChunk, sizeof(_cmsMemPluginChunk));
+ }
+ else {
+
+ ptr ->MallocPtr = Plugin -> MallocPtr;
+ ptr ->FreePtr = Plugin -> FreePtr;
+ ptr ->ReallocPtr = Plugin -> ReallocPtr;
+
+ // Make sure we revert to defaults
+ ptr ->MallocZeroPtr= _cmsMallocZero;
+ ptr ->CallocPtr = _cmsCalloc;
+ ptr ->DupPtr = _cmsDupMem;
+
+ if (Plugin ->MallocZeroPtr != NULL) ptr ->MallocZeroPtr = Plugin -> MallocZeroPtr;
+ if (Plugin ->CallocPtr != NULL) ptr ->CallocPtr = Plugin -> CallocPtr;
+ if (Plugin ->DupPtr != NULL) ptr ->DupPtr = Plugin -> DupPtr;
+
+ }
+}
+#endif
+
+// ********************************************************************************************
+
+// Sub allocation takes care of many pointers of small size. The memory allocated in
+// this way have be freed at once. Next function allocates a single chunk for linked list
+// I prefer this method over realloc due to the big inpact on xput realloc may have if
+// memory is being swapped to disk. This approach is safer (although that may not be true on all platforms)
+static
+_cmsSubAllocator_chunk* _cmsCreateSubAllocChunk(cmsContext ContextID, cmsUInt32Number Initial)
+{
+ _cmsSubAllocator_chunk* chunk;
+
+ // 20K by default
+ if (Initial == 0)
+ Initial = 20*1024;
+
+ // Create the container
+ chunk = (_cmsSubAllocator_chunk*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator_chunk));
+ if (chunk == NULL) return NULL;
+
+ // Initialize values
+ chunk ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, Initial);
+ if (chunk ->Block == NULL) {
+
+ // Something went wrong
+ _cmsFree(ContextID, chunk);
+ return NULL;
+ }
+
+ chunk ->BlockSize = Initial;
+ chunk ->Used = 0;
+ chunk ->next = NULL;
+
+ return chunk;
+}
+
+// The suballocated is nothing but a pointer to the first element in the list. We also keep
+// the thread ID in this structure.
+_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial)
+{
+ _cmsSubAllocator* sub;
+
+ // Create the container
+ sub = (_cmsSubAllocator*) _cmsMallocZero(ContextID, sizeof(_cmsSubAllocator));
+ if (sub == NULL) return NULL;
+
+ sub ->ContextID = ContextID;
+
+ sub ->h = _cmsCreateSubAllocChunk(ContextID, Initial);
+ if (sub ->h == NULL) {
+ _cmsFree(ContextID, sub);
+ return NULL;
+ }
+
+ return sub;
+}
+
+
+// Get rid of whole linked list
+void _cmsSubAllocDestroy(_cmsSubAllocator* sub)
+{
+ _cmsSubAllocator_chunk *chunk, *n;
+
+ for (chunk = sub ->h; chunk != NULL; chunk = n) {
+
+ n = chunk->next;
+ if (chunk->Block != NULL) _cmsFree(sub ->ContextID, chunk->Block);
+ _cmsFree(sub ->ContextID, chunk);
+ }
+
+ // Free the header
+ _cmsFree(sub ->ContextID, sub);
+}
+
+
+// Get a pointer to small memory block.
+void* _cmsSubAlloc(_cmsSubAllocator* sub, cmsUInt32Number size)
+{
+ cmsUInt32Number Free = sub -> h ->BlockSize - sub -> h -> Used;
+ cmsUInt8Number* ptr;
+
+ size = _cmsALIGNMEM(size);
+
+ // Check for memory. If there is no room, allocate a new chunk of double memory size.
+ if (size > Free) {
+
+ _cmsSubAllocator_chunk* chunk;
+ cmsUInt32Number newSize;
+
+ newSize = sub -> h ->BlockSize * 2;
+ if (newSize < size) newSize = size;
+
+ chunk = _cmsCreateSubAllocChunk(sub -> ContextID, newSize);
+ if (chunk == NULL) return NULL;
+
+ // Link list
+ chunk ->next = sub ->h;
+ sub ->h = chunk;
+
+ }
+
+ ptr = sub -> h ->Block + sub -> h ->Used;
+ sub -> h -> Used += size;
+
+ return (void*) ptr;
+}
+
+// Duplicate in pool
+void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size)
+{
+ void *NewPtr;
+
+ // Dup of null pointer is also NULL
+ if (ptr == NULL)
+ return NULL;
+
+ NewPtr = _cmsSubAlloc(s, size);
+
+ if (ptr != NULL && NewPtr != NULL) {
+ memcpy(NewPtr, ptr, size);
+ }
+
+ return NewPtr;
+}
+
+
+
+// Error logging ******************************************************************
+
+// There is no error handling at all. When a funtion fails, it returns proper value.
+// For example, all create functions does return NULL on failure. Other return FALSE
+// It may be interesting, for the developer, to know why the function is failing.
+// for that reason, lcms2 does offer a logging function. This function does recive
+// a ENGLISH string with some clues on what is going wrong. You can show this
+// info to the end user, or just create some sort of log.
+// The logging function should NOT terminate the program, as this obviously can leave
+// resources. It is the programmer's responsability to check each function return code
+// to make sure it didn't fail.
+
+// Error messages are limited to MAX_ERROR_MESSAGE_LEN
+
+#define MAX_ERROR_MESSAGE_LEN 1024
+
+// ---------------------------------------------------------------------------------------------------------
+
+// This is our default log error
+static void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text);
+
+// Context0 storage, which is global
+_cmsLogErrorChunkType _cmsLogErrorChunk = { DefaultLogErrorHandlerFunction };
+
+// Allocates and inits error logger container for a given context. If src is NULL, only initializes the value
+// to the default. Otherwise, it duplicates the value. The interface is standard across all context clients
+void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ static _cmsLogErrorChunkType LogErrorChunk = { DefaultLogErrorHandlerFunction };
+ void* from;
+
+ if (src != NULL) {
+ from = src ->chunks[Logger];
+ }
+ else {
+ from = &LogErrorChunk;
+ }
+
+ ctx ->chunks[Logger] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsLogErrorChunkType));
+}
+
+// The default error logger does nothing.
+static
+void DefaultLogErrorHandlerFunction(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *Text)
+{
+ // fprintf(stderr, "[lcms]: %s\n", Text);
+ // fflush(stderr);
+
+ cmsUNUSED_PARAMETER(ContextID);
+ cmsUNUSED_PARAMETER(ErrorCode);
+ cmsUNUSED_PARAMETER(Text);
+}
+
+// Change log error, context based
+void CMSEXPORT cmsSetLogErrorHandlerTHR(cmsContext ContextID, cmsLogErrorHandlerFunction Fn)
+{
+ _cmsLogErrorChunkType* lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
+
+ if (lhg != NULL) {
+
+ if (Fn == NULL)
+ lhg -> LogErrorHandler = DefaultLogErrorHandlerFunction;
+ else
+ lhg -> LogErrorHandler = Fn;
+ }
+}
+
+// Change log error, legacy
+void CMSEXPORT cmsSetLogErrorHandler(cmsLogErrorHandlerFunction Fn)
+{
+ cmsSetLogErrorHandlerTHR(NULL, Fn);
+}
+
+// Log an error
+// ErrorText is a text holding an english description of error.
+void CMSEXPORT cmsSignalError(cmsContext ContextID, cmsUInt32Number ErrorCode, const char *ErrorText, ...)
+{
+ va_list args;
+ char Buffer[MAX_ERROR_MESSAGE_LEN];
+ _cmsLogErrorChunkType* lhg;
+
+
+ va_start(args, ErrorText);
+ vsnprintf(Buffer, MAX_ERROR_MESSAGE_LEN-1, ErrorText, args);
+ va_end(args);
+
+ // Check for the context, if specified go there. If not, go for the global
+ lhg = (_cmsLogErrorChunkType*) _cmsContextGetClientChunk(ContextID, Logger);
+ if (lhg ->LogErrorHandler) {
+ lhg ->LogErrorHandler(ContextID, ErrorCode, Buffer);
+ }
+}
+
+// Utility function to print signatures
+void _cmsTagSignature2String(char String[5], cmsTagSignature sig)
+{
+ cmsUInt32Number be;
+
+ // Convert to big endian
+ be = _cmsAdjustEndianess32((cmsUInt32Number) sig);
+
+ // Move chars
+ memmove(String, &be, 4);
+
+ // Make sure of terminator
+ String[4] = 0;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+
+static
+void* defMtxCreate(cmsContext id)
+{
+ _cmsMutex* ptr_mutex = (_cmsMutex*) _cmsMalloc(id, sizeof(_cmsMutex));
+ _cmsInitMutexPrimitive(ptr_mutex);
+ return (void*) ptr_mutex;
+}
+
+static
+void defMtxDestroy(cmsContext id, void* mtx)
+{
+ _cmsDestroyMutexPrimitive((_cmsMutex *) mtx);
+ _cmsFree(id, mtx);
+}
+
+static
+cmsBool defMtxLock(cmsContext id, void* mtx)
+{
+ cmsUNUSED_PARAMETER(id);
+ return _cmsLockPrimitive((_cmsMutex *) mtx) == 0;
+}
+
+static
+void defMtxUnlock(cmsContext id, void* mtx)
+{
+ cmsUNUSED_PARAMETER(id);
+ _cmsUnlockPrimitive((_cmsMutex *) mtx);
+}
+
+
+
+// Pointers to memory manager functions in Context0
+_cmsMutexPluginChunkType _cmsMutexPluginChunk = { defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
+
+// Allocate and init mutex container.
+void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ static _cmsMutexPluginChunkType MutexChunk = {defMtxCreate, defMtxDestroy, defMtxLock, defMtxUnlock };
+ void* from;
+
+ if (src != NULL) {
+ from = src ->chunks[MutexPlugin];
+ }
+ else {
+ from = &MutexChunk;
+ }
+
+ ctx ->chunks[MutexPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsMutexPluginChunkType));
+}
+
+// Register new ways to transform
+cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ cmsPluginMutex* Plugin = (cmsPluginMutex*) Data;
+ _cmsMutexPluginChunkType* ctx = ( _cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+ if (Data == NULL) {
+
+ // No lock routines
+ ctx->CreateMutexPtr = NULL;
+ ctx->DestroyMutexPtr = NULL;
+ ctx->LockMutexPtr = NULL;
+ ctx ->UnlockMutexPtr = NULL;
+ return TRUE;
+ }
+
+ // Factory callback is required
+ if (Plugin ->CreateMutexPtr == NULL || Plugin ->DestroyMutexPtr == NULL ||
+ Plugin ->LockMutexPtr == NULL || Plugin ->UnlockMutexPtr == NULL) return FALSE;
+
+
+ ctx->CreateMutexPtr = Plugin->CreateMutexPtr;
+ ctx->DestroyMutexPtr = Plugin ->DestroyMutexPtr;
+ ctx ->LockMutexPtr = Plugin ->LockMutexPtr;
+ ctx ->UnlockMutexPtr = Plugin ->UnlockMutexPtr;
+
+ // All is ok
+ return TRUE;
+}
+
+// Generic Mutex fns
+void* CMSEXPORT _cmsCreateMutex(cmsContext ContextID)
+{
+ _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+ if (ptr ->CreateMutexPtr == NULL) return NULL;
+
+ return ptr ->CreateMutexPtr(ContextID);
+}
+
+void CMSEXPORT _cmsDestroyMutex(cmsContext ContextID, void* mtx)
+{
+ _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+ if (ptr ->DestroyMutexPtr != NULL) {
+
+ ptr ->DestroyMutexPtr(ContextID, mtx);
+ }
+}
+
+cmsBool CMSEXPORT _cmsLockMutex(cmsContext ContextID, void* mtx)
+{
+ _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+ if (ptr ->LockMutexPtr == NULL) return TRUE;
+
+ return ptr ->LockMutexPtr(ContextID, mtx);
+}
+
+void CMSEXPORT _cmsUnlockMutex(cmsContext ContextID, void* mtx)
+{
+ _cmsMutexPluginChunkType* ptr = (_cmsMutexPluginChunkType*) _cmsContextGetClientChunk(ContextID, MutexPlugin);
+
+ if (ptr ->UnlockMutexPtr != NULL) {
+
+ ptr ->UnlockMutexPtr(ContextID, mtx);
+ }
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c
new file mode 100644
index 0000000000..d5aa87b105
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgamma.c
@@ -0,0 +1,1298 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2013 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Tone curves are powerful constructs that can contain curves specified in diverse ways.
+// The curve is stored in segments, where each segment can be sampled or specified by parameters.
+// a 16.bit simplification of the *whole* curve is kept for optimization purposes. For float operation,
+// each segment is evaluated separately. Plug-ins may be used to define new parametric schemes,
+// each plug-in may define up to MAX_TYPES_IN_LCMS_PLUGIN functions types. For defining a function,
+// the plug-in should provide the type id, how many parameters each type has, and a pointer to
+// a procedure that evaluates the function. In the case of reverse evaluation, the evaluator will
+// be called with the type id as a negative value, and a sampled version of the reversed curve
+// will be built.
+
+// ----------------------------------------------------------------- Implementation
+// Maxim number of nodes
+#define MAX_NODES_IN_CURVE 4097
+#define MINUS_INF (-1E22F)
+#define PLUS_INF (+1E22F)
+
+// The list of supported parametric curves
+typedef struct _cmsParametricCurvesCollection_st {
+
+ int nFunctions; // Number of supported functions in this chunk
+ int FunctionTypes[MAX_TYPES_IN_LCMS_PLUGIN]; // The identification types
+ int ParameterCount[MAX_TYPES_IN_LCMS_PLUGIN]; // Number of parameters for each function
+ cmsParametricCurveEvaluator Evaluator; // The evaluator
+
+ struct _cmsParametricCurvesCollection_st* Next; // Next in list
+
+} _cmsParametricCurvesCollection;
+
+// This is the default (built-in) evaluator
+static cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R);
+
+// The built-in list
+static _cmsParametricCurvesCollection DefaultCurves = {
+ 9, // # of curve types
+ { 1, 2, 3, 4, 5, 6, 7, 8, 108 }, // Parametric curve ID
+ { 1, 3, 4, 5, 7, 4, 5, 5, 1 }, // Parameters by type
+ DefaultEvalParametricFn, // Evaluator
+ NULL // Next in chain
+};
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginCurvesList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsCurvesPluginChunkType newHead = { NULL };
+ _cmsParametricCurvesCollection* entry;
+ _cmsParametricCurvesCollection* Anterior = NULL;
+ _cmsCurvesPluginChunkType* head = (_cmsCurvesPluginChunkType*) src->chunks[CurvesPlugin];
+
+ _cmsAssert(head != NULL);
+
+ // Walk the list copying all nodes
+ for (entry = head->ParametricCurves;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ _cmsParametricCurvesCollection *newEntry = ( _cmsParametricCurvesCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsParametricCurvesCollection));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.ParametricCurves == NULL)
+ newHead.ParametricCurves = newEntry;
+ }
+
+ ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsCurvesPluginChunkType));
+}
+
+// The allocator have to follow the chain
+void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsAssert(ctx != NULL);
+
+ if (src != NULL) {
+
+ // Copy all linked list
+ DupPluginCurvesList(ctx, src);
+ }
+ else {
+ static _cmsCurvesPluginChunkType CurvesPluginChunk = { NULL };
+ ctx ->chunks[CurvesPlugin] = _cmsSubAllocDup(ctx ->MemPool, &CurvesPluginChunk, sizeof(_cmsCurvesPluginChunkType));
+ }
+}
+
+
+// The linked list head
+_cmsCurvesPluginChunkType _cmsCurvesPluginChunk = { NULL };
+
+// As a way to install new parametric curves
+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);
+ cmsPluginParametricCurves* Plugin = (cmsPluginParametricCurves*) Data;
+ _cmsParametricCurvesCollection* fl;
+
+ if (Data == NULL) {
+
+ ctx -> ParametricCurves = NULL;
+ return TRUE;
+ }
+
+ fl = (_cmsParametricCurvesCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsParametricCurvesCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+ fl ->Evaluator = Plugin ->Evaluator;
+ fl ->nFunctions = Plugin ->nFunctions;
+
+ // Make sure no mem overwrites
+ if (fl ->nFunctions > MAX_TYPES_IN_LCMS_PLUGIN)
+ fl ->nFunctions = MAX_TYPES_IN_LCMS_PLUGIN;
+
+ // Copy the data
+ memmove(fl->FunctionTypes, Plugin ->FunctionTypes, fl->nFunctions * sizeof(cmsUInt32Number));
+ memmove(fl->ParameterCount, Plugin ->ParameterCount, fl->nFunctions * sizeof(cmsUInt32Number));
+
+ // Keep linked list
+ fl ->Next = ctx->ParametricCurves;
+ ctx->ParametricCurves = fl;
+
+ // All is ok
+ return TRUE;
+}
+
+
+// Search in type list, return position or -1 if not found
+static
+int IsInSet(int Type, _cmsParametricCurvesCollection* c)
+{
+ int i;
+
+ for (i=0; i < c ->nFunctions; i++)
+ if (abs(Type) == c ->FunctionTypes[i]) return i;
+
+ return -1;
+}
+
+
+// Search for the collection which contains a specific type
+static
+_cmsParametricCurvesCollection *GetParametricCurveByType(cmsContext ContextID, int Type, int* index)
+{
+ _cmsParametricCurvesCollection* c;
+ int Position;
+ _cmsCurvesPluginChunkType* ctx = ( _cmsCurvesPluginChunkType*) _cmsContextGetClientChunk(ContextID, CurvesPlugin);
+
+ for (c = ctx->ParametricCurves; c != NULL; c = c ->Next) {
+
+ Position = IsInSet(Type, c);
+
+ if (Position != -1) {
+ if (index != NULL)
+ *index = Position;
+ return c;
+ }
+ }
+ // If none found, revert for defaults
+ for (c = &DefaultCurves; c != NULL; c = c ->Next) {
+
+ Position = IsInSet(Type, c);
+
+ if (Position != -1) {
+ if (index != NULL)
+ *index = Position;
+ return c;
+ }
+ }
+
+ return NULL;
+}
+
+// Low level allocate, which takes care of memory details. nEntries may be zero, and in this case
+// no optimation curve is computed. nSegments may also be zero in the inverse case, where only the
+// optimization curve is given. Both features simultaneously is an error
+static
+cmsToneCurve* AllocateToneCurveStruct(cmsContext ContextID, cmsInt32Number nEntries,
+ cmsInt32Number nSegments, const cmsCurveSegment* Segments,
+ const cmsUInt16Number* Values)
+{
+ cmsToneCurve* p;
+ int i;
+
+ // We allow huge tables, which are then restricted for smoothing operations
+ if (nEntries > 65530 || nEntries < 0) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve of more than 65530 entries");
+ return NULL;
+ }
+
+ if (nEntries <= 0 && nSegments <= 0) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Couldn't create tone curve with zero segments and no table");
+ return NULL;
+ }
+
+ // Allocate all required pointers, etc.
+ p = (cmsToneCurve*) _cmsMallocZero(ContextID, sizeof(cmsToneCurve));
+ if (!p) return NULL;
+
+ // In this case, there are no segments
+ if (nSegments <= 0) {
+ p ->Segments = NULL;
+ p ->Evals = NULL;
+ }
+ else {
+ p ->Segments = (cmsCurveSegment*) _cmsCalloc(ContextID, nSegments, sizeof(cmsCurveSegment));
+ if (p ->Segments == NULL) goto Error;
+
+ p ->Evals = (cmsParametricCurveEvaluator*) _cmsCalloc(ContextID, nSegments, sizeof(cmsParametricCurveEvaluator));
+ if (p ->Evals == NULL) goto Error;
+ }
+
+ p -> nSegments = nSegments;
+
+ // This 16-bit table contains a limited precision representation of the whole curve and is kept for
+ // increasing xput on certain operations.
+ if (nEntries <= 0) {
+ p ->Table16 = NULL;
+ }
+ else {
+ p ->Table16 = (cmsUInt16Number*) _cmsCalloc(ContextID, nEntries, sizeof(cmsUInt16Number));
+ if (p ->Table16 == NULL) goto Error;
+ }
+
+ p -> nEntries = nEntries;
+
+ // Initialize members if requested
+ if (Values != NULL && (nEntries > 0)) {
+
+ for (i=0; i < nEntries; i++)
+ p ->Table16[i] = Values[i];
+ }
+
+ // Initialize the segments stuff. The evaluator for each segment is located and a pointer to it
+ // is placed in advance to maximize performance.
+ if (Segments != NULL && (nSegments > 0)) {
+
+ _cmsParametricCurvesCollection *c;
+
+ p ->SegInterp = (cmsInterpParams**) _cmsCalloc(ContextID, nSegments, sizeof(cmsInterpParams*));
+ if (p ->SegInterp == NULL) goto Error;
+
+ for (i=0; i< nSegments; i++) {
+
+ // Type 0 is a special marker for table-based curves
+ if (Segments[i].Type == 0)
+ p ->SegInterp[i] = _cmsComputeInterpParams(ContextID, Segments[i].nGridPoints, 1, 1, NULL, CMS_LERP_FLAGS_FLOAT);
+
+ memmove(&p ->Segments[i], &Segments[i], sizeof(cmsCurveSegment));
+
+ if (Segments[i].Type == 0 && Segments[i].SampledPoints != NULL)
+ p ->Segments[i].SampledPoints = (cmsFloat32Number*) _cmsDupMem(ContextID, Segments[i].SampledPoints, sizeof(cmsFloat32Number) * Segments[i].nGridPoints);
+ else
+ p ->Segments[i].SampledPoints = NULL;
+
+
+ c = GetParametricCurveByType(ContextID, Segments[i].Type, NULL);
+ if (c != NULL)
+ p ->Evals[i] = c ->Evaluator;
+ }
+ }
+
+ p ->InterpParams = _cmsComputeInterpParams(ContextID, p ->nEntries, 1, 1, p->Table16, CMS_LERP_FLAGS_16BITS);
+ if (p->InterpParams != NULL)
+ return p;
+
+Error:
+ if (p -> Segments) _cmsFree(ContextID, p ->Segments);
+ if (p -> Evals) _cmsFree(ContextID, p -> Evals);
+ if (p ->Table16) _cmsFree(ContextID, p ->Table16);
+ _cmsFree(ContextID, p);
+ return NULL;
+}
+
+
+// Parametric Fn using floating point
+static
+cmsFloat64Number DefaultEvalParametricFn(cmsInt32Number Type, const cmsFloat64Number Params[], cmsFloat64Number R)
+{
+ cmsFloat64Number e, Val, disc;
+
+ switch (Type) {
+
+ // X = Y ^ Gamma
+ case 1:
+ if (R < 0) {
+
+ if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)
+ Val = R;
+ else
+ Val = 0;
+ }
+ else
+ Val = pow(R, Params[0]);
+ break;
+
+ // Type 1 Reversed: X = Y ^1/gamma
+ case -1:
+ if (R < 0) {
+
+ if (fabs(Params[0] - 1.0) < MATRIX_DET_TOLERANCE)
+ Val = R;
+ else
+ Val = 0;
+ }
+ else
+ Val = pow(R, 1/Params[0]);
+ break;
+
+ // CIE 122-1966
+ // Y = (aX + b)^Gamma | X >= -b/a
+ // Y = 0 | else
+ case 2:
+ disc = -Params[2] / Params[1];
+
+ if (R >= disc ) {
+
+ e = Params[1]*R + Params[2];
+
+ if (e > 0)
+ Val = pow(e, Params[0]);
+ else
+ Val = 0;
+ }
+ else
+ Val = 0;
+ break;
+
+ // Type 2 Reversed
+ // X = (Y ^1/g - b) / a
+ case -2:
+ if (R < 0)
+ Val = 0;
+ else
+ Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+
+ if (Val < 0)
+ Val = 0;
+ break;
+
+
+ // IEC 61966-3
+ // Y = (aX + b)^Gamma | X <= -b/a
+ // Y = c | else
+ case 3:
+ disc = -Params[2] / Params[1];
+ if (disc < 0)
+ disc = 0;
+
+ if (R >= disc) {
+
+ e = Params[1]*R + Params[2];
+
+ if (e > 0)
+ Val = pow(e, Params[0]) + Params[3];
+ else
+ Val = 0;
+ }
+ else
+ Val = Params[3];
+ break;
+
+
+ // Type 3 reversed
+ // X=((Y-c)^1/g - b)/a | (Y>=c)
+ // X=-b/a | (Y<c)
+ case -3:
+ if (R >= Params[3]) {
+
+ e = R - Params[3];
+
+ if (e > 0)
+ Val = (pow(e, 1/Params[0]) - Params[2]) / Params[1];
+ else
+ Val = 0;
+ }
+ else {
+ Val = -Params[2] / Params[1];
+ }
+ break;
+
+
+ // IEC 61966-2.1 (sRGB)
+ // Y = (aX + b)^Gamma | X >= d
+ // Y = cX | X < d
+ case 4:
+ if (R >= Params[4]) {
+
+ e = Params[1]*R + Params[2];
+
+ if (e > 0)
+ Val = pow(e, Params[0]);
+ else
+ Val = 0;
+ }
+ else
+ Val = R * Params[3];
+ break;
+
+ // Type 4 reversed
+ // X=((Y^1/g-b)/a) | Y >= (ad+b)^g
+ // X=Y/c | Y< (ad+b)^g
+ case -4:
+ e = Params[1] * Params[4] + Params[2];
+ if (e < 0)
+ disc = 0;
+ else
+ disc = pow(e, Params[0]);
+
+ if (R >= disc) {
+
+ Val = (pow(R, 1.0/Params[0]) - Params[2]) / Params[1];
+ }
+ else {
+ Val = R / Params[3];
+ }
+ break;
+
+
+ // Y = (aX + b)^Gamma + e | X >= d
+ // Y = cX + f | X < d
+ case 5:
+ if (R >= Params[4]) {
+
+ e = Params[1]*R + Params[2];
+
+ if (e > 0)
+ Val = pow(e, Params[0]) + Params[5];
+ else
+ Val = Params[5];
+ }
+ else
+ Val = R*Params[3] + Params[6];
+ break;
+
+
+ // Reversed type 5
+ // X=((Y-e)1/g-b)/a | Y >=(ad+b)^g+e), cd+f
+ // X=(Y-f)/c | else
+ case -5:
+
+ disc = Params[3] * Params[4] + Params[6];
+ if (R >= disc) {
+
+ e = R - Params[5];
+ if (e < 0)
+ Val = 0;
+ else
+ Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];
+ }
+ else {
+ Val = (R - Params[6]) / Params[3];
+ }
+ break;
+
+
+ // Types 6,7,8 comes from segmented curves as described in ICCSpecRevision_02_11_06_Float.pdf
+ // Type 6 is basically identical to type 5 without d
+
+ // Y = (a * X + b) ^ Gamma + c
+ case 6:
+ e = Params[1]*R + Params[2];
+
+ if (e < 0)
+ Val = Params[3];
+ else
+ Val = pow(e, Params[0]) + Params[3];
+ break;
+
+ // ((Y - c) ^1/Gamma - b) / a
+ case -6:
+ e = R - Params[3];
+ if (e < 0)
+ Val = 0;
+ else
+ Val = (pow(e, 1.0/Params[0]) - Params[2]) / Params[1];
+ break;
+
+
+ // Y = a * log (b * X^Gamma + c) + d
+ case 7:
+
+ e = Params[2] * pow(R, Params[0]) + Params[3];
+ if (e <= 0)
+ Val = Params[4];
+ else
+ Val = Params[1]*log10(e) + Params[4];
+ break;
+
+ // (Y - d) / a = log(b * X ^Gamma + c)
+ // pow(10, (Y-d) / a) = b * X ^Gamma + c
+ // pow((pow(10, (Y-d) / a) - c) / b, 1/g) = X
+ case -7:
+ Val = pow((pow(10.0, (R-Params[4]) / Params[1]) - Params[3]) / Params[2], 1.0 / Params[0]);
+ break;
+
+
+ //Y = a * b^(c*X+d) + e
+ case 8:
+ Val = (Params[0] * pow(Params[1], Params[2] * R + Params[3]) + Params[4]);
+ break;
+
+
+ // Y = (log((y-e) / a) / log(b) - d ) / c
+ // a=0, b=1, c=2, d=3, e=4,
+ case -8:
+
+ disc = R - Params[4];
+ if (disc < 0) Val = 0;
+ else
+ Val = (log(disc / Params[0]) / log(Params[1]) - Params[3]) / Params[2];
+ break;
+
+ // S-Shaped: (1 - (1-x)^1/g)^1/g
+ case 108:
+ Val = pow(1.0 - pow(1 - R, 1/Params[0]), 1/Params[0]);
+ break;
+
+ // y = (1 - (1-x)^1/g)^1/g
+ // y^g = (1 - (1-x)^1/g)
+ // 1 - y^g = (1-x)^1/g
+ // (1 - y^g)^g = 1 - x
+ // 1 - (1 - y^g)^g
+ case -108:
+ Val = 1 - pow(1 - pow(R, Params[0]), Params[0]);
+ break;
+
+ default:
+ // Unsupported parametric curve. Should never reach here
+ return 0;
+ }
+
+ return Val;
+}
+
+// Evaluate a segmented funtion for a single value. Return -1 if no valid segment found .
+// If fn type is 0, perform an interpolation on the table
+static
+cmsFloat64Number EvalSegmentedFn(const cmsToneCurve *g, cmsFloat64Number R)
+{
+ int i;
+
+ for (i = g ->nSegments-1; i >= 0 ; --i) {
+
+ // Check for domain
+ if ((R > g ->Segments[i].x0) && (R <= g ->Segments[i].x1)) {
+
+ // Type == 0 means segment is sampled
+ if (g ->Segments[i].Type == 0) {
+
+ cmsFloat32Number R1 = (cmsFloat32Number) (R - g ->Segments[i].x0) / (g ->Segments[i].x1 - g ->Segments[i].x0);
+ cmsFloat32Number Out;
+
+ // Setup the table (TODO: clean that)
+ g ->SegInterp[i]-> Table = g ->Segments[i].SampledPoints;
+
+ g ->SegInterp[i] -> Interpolation.LerpFloat(&R1, &Out, g ->SegInterp[i]);
+
+ return Out;
+ }
+ else
+ return g ->Evals[i](g->Segments[i].Type, g ->Segments[i].Params, R);
+ }
+ }
+
+ return MINUS_INF;
+}
+
+// Access to estimated low-res table
+cmsUInt32Number CMSEXPORT cmsGetToneCurveEstimatedTableEntries(const cmsToneCurve* t)
+{
+ _cmsAssert(t != NULL);
+ return t ->nEntries;
+}
+
+const cmsUInt16Number* CMSEXPORT cmsGetToneCurveEstimatedTable(const cmsToneCurve* t)
+{
+ _cmsAssert(t != NULL);
+ return t ->Table16;
+}
+
+
+// Create an empty gamma curve, by using tables. This specifies only the limited-precision part, and leaves the
+// floating point description empty.
+cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurve16(cmsContext ContextID, cmsInt32Number nEntries, const cmsUInt16Number Values[])
+{
+ return AllocateToneCurveStruct(ContextID, nEntries, 0, NULL, Values);
+}
+
+static
+int EntriesByGamma(cmsFloat64Number Gamma)
+{
+ if (fabs(Gamma - 1.0) < 0.001) return 2;
+ return 4096;
+}
+
+
+// Create a segmented gamma, fill the table
+cmsToneCurve* CMSEXPORT cmsBuildSegmentedToneCurve(cmsContext ContextID,
+ cmsInt32Number nSegments, const cmsCurveSegment Segments[])
+{
+ int i;
+ cmsFloat64Number R, Val;
+ cmsToneCurve* g;
+ int nGridPoints = 4096;
+
+ _cmsAssert(Segments != NULL);
+
+ // Optimizatin for identity curves.
+ if (nSegments == 1 && Segments[0].Type == 1) {
+
+ nGridPoints = EntriesByGamma(Segments[0].Params[0]);
+ }
+
+ g = AllocateToneCurveStruct(ContextID, nGridPoints, nSegments, Segments, NULL);
+ if (g == NULL) return NULL;
+
+ // Once we have the floating point version, we can approximate a 16 bit table of 4096 entries
+ // for performance reasons. This table would normally not be used except on 8/16 bits transforms.
+ for (i=0; i < nGridPoints; i++) {
+
+ R = (cmsFloat64Number) i / (nGridPoints-1);
+
+ Val = EvalSegmentedFn(g, R);
+
+ // Round and saturate
+ g ->Table16[i] = _cmsQuickSaturateWord(Val * 65535.0);
+ }
+
+ return g;
+}
+
+// Use a segmented curve to store the floating point table
+cmsToneCurve* CMSEXPORT cmsBuildTabulatedToneCurveFloat(cmsContext ContextID, cmsUInt32Number nEntries, const cmsFloat32Number values[])
+{
+ cmsCurveSegment Seg[3];
+
+ // A segmented tone curve should have function segments in the first and last positions
+ // Initialize segmented curve part up to 0 to constant value = samples[0]
+ Seg[0].x0 = MINUS_INF;
+ Seg[0].x1 = 0;
+ Seg[0].Type = 6;
+
+ Seg[0].Params[0] = 1;
+ Seg[0].Params[1] = 0;
+ Seg[0].Params[2] = 0;
+ Seg[0].Params[3] = values[0];
+ Seg[0].Params[4] = 0;
+
+ // From zero to 1
+ Seg[1].x0 = 0;
+ Seg[1].x1 = 1.0;
+ Seg[1].Type = 0;
+
+ Seg[1].nGridPoints = nEntries;
+ Seg[1].SampledPoints = (cmsFloat32Number*) values;
+
+ // Final segment is constant = lastsample
+ Seg[2].x0 = 1.0;
+ Seg[2].x1 = PLUS_INF;
+ Seg[2].Type = 6;
+
+ Seg[2].Params[0] = 1;
+ Seg[2].Params[1] = 0;
+ Seg[2].Params[2] = 0;
+ Seg[2].Params[3] = values[nEntries-1];
+ Seg[2].Params[4] = 0;
+
+
+ return cmsBuildSegmentedToneCurve(ContextID, 3, Seg);
+}
+
+// Parametric curves
+//
+// Parameters goes as: Curve, a, b, c, d, e, f
+// Type is the ICC type +1
+// if type is negative, then the curve is analyticaly inverted
+cmsToneCurve* CMSEXPORT cmsBuildParametricToneCurve(cmsContext ContextID, cmsInt32Number Type, const cmsFloat64Number Params[])
+{
+ cmsCurveSegment Seg0;
+ int Pos = 0;
+ cmsUInt32Number size;
+ _cmsParametricCurvesCollection* c = GetParametricCurveByType(ContextID, Type, &Pos);
+
+ _cmsAssert(Params != NULL);
+
+ if (c == NULL) {
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Invalid parametric curve type %d", Type);
+ return NULL;
+ }
+
+ memset(&Seg0, 0, sizeof(Seg0));
+
+ Seg0.x0 = MINUS_INF;
+ Seg0.x1 = PLUS_INF;
+ Seg0.Type = Type;
+
+ size = c->ParameterCount[Pos] * sizeof(cmsFloat64Number);
+ memmove(Seg0.Params, Params, size);
+
+ return cmsBuildSegmentedToneCurve(ContextID, 1, &Seg0);
+}
+
+
+
+// Build a gamma table based on gamma constant
+cmsToneCurve* CMSEXPORT cmsBuildGamma(cmsContext ContextID, cmsFloat64Number Gamma)
+{
+ return cmsBuildParametricToneCurve(ContextID, 1, &Gamma);
+}
+
+
+// Free all memory taken by the gamma curve
+void CMSEXPORT cmsFreeToneCurve(cmsToneCurve* Curve)
+{
+ cmsContext ContextID;
+
+ // added by Xiaochuan Liu
+ // Curve->InterpParams may be null
+ if (Curve == NULL || Curve->InterpParams == NULL) return;
+
+ ContextID = Curve ->InterpParams->ContextID;
+
+ _cmsFreeInterpParams(Curve ->InterpParams);
+ Curve ->InterpParams = NULL;
+
+ if (Curve -> Table16)
+ {
+ _cmsFree(ContextID, Curve ->Table16);
+ Curve ->Table16 = NULL;
+ }
+
+ if (Curve ->Segments) {
+
+ cmsUInt32Number i;
+
+ for (i=0; i < Curve ->nSegments; i++) {
+
+ if (Curve ->Segments[i].SampledPoints) {
+ _cmsFree(ContextID, Curve ->Segments[i].SampledPoints);
+ Curve ->Segments[i].SampledPoints = NULL;
+ }
+
+ if (Curve ->SegInterp[i] != 0)
+ {
+ _cmsFreeInterpParams(Curve->SegInterp[i]);
+ Curve->SegInterp[i] = NULL;
+ }
+ }
+
+ _cmsFree(ContextID, Curve ->Segments);
+ Curve ->Segments = NULL;
+ _cmsFree(ContextID, Curve ->SegInterp);
+ Curve ->SegInterp = NULL;
+ }
+
+ if (Curve -> Evals)
+ {
+ _cmsFree(ContextID, Curve -> Evals);
+ Curve -> Evals = NULL;
+ }
+
+ if (Curve)
+ {
+ _cmsFree(ContextID, Curve);
+ Curve = NULL;
+ }
+}
+
+// Utility function, free 3 gamma tables
+void CMSEXPORT cmsFreeToneCurveTriple(cmsToneCurve* Curve[3])
+{
+
+ _cmsAssert(Curve != NULL);
+
+ if (Curve[0] != NULL) cmsFreeToneCurve(Curve[0]);
+ if (Curve[1] != NULL) cmsFreeToneCurve(Curve[1]);
+ if (Curve[2] != NULL) cmsFreeToneCurve(Curve[2]);
+
+ Curve[0] = Curve[1] = Curve[2] = NULL;
+}
+
+
+// Duplicate a gamma table
+cmsToneCurve* CMSEXPORT cmsDupToneCurve(const cmsToneCurve* In)
+{
+ // Xiaochuan Liu
+ // fix openpdf bug(mantis id:0055683, google id:360198)
+ // the function CurveSetElemTypeFree in cmslut.c also needs to check pointer
+ if (In == NULL || In ->InterpParams == NULL) return NULL;
+
+ return AllocateToneCurveStruct(In ->InterpParams ->ContextID, In ->nEntries, In ->nSegments, In ->Segments, In ->Table16);
+}
+
+// Joins two curves for X and Y. Curves should be monotonic.
+// We want to get
+//
+// y = Y^-1(X(t))
+//
+cmsToneCurve* CMSEXPORT cmsJoinToneCurve(cmsContext ContextID,
+ const cmsToneCurve* X,
+ const cmsToneCurve* Y, cmsUInt32Number nResultingPoints)
+{
+ cmsToneCurve* out = NULL;
+ cmsToneCurve* Yreversed = NULL;
+ cmsFloat32Number t, x;
+ cmsFloat32Number* Res = NULL;
+ cmsUInt32Number i;
+
+
+ _cmsAssert(X != NULL);
+ _cmsAssert(Y != NULL);
+
+ Yreversed = cmsReverseToneCurveEx(nResultingPoints, Y);
+ if (Yreversed == NULL) goto Error;
+
+ Res = (cmsFloat32Number*) _cmsCalloc(ContextID, nResultingPoints, sizeof(cmsFloat32Number));
+ if (Res == NULL) goto Error;
+
+ //Iterate
+ for (i=0; i < nResultingPoints; i++) {
+
+ t = (cmsFloat32Number) i / (nResultingPoints-1);
+ x = cmsEvalToneCurveFloat(X, t);
+ Res[i] = cmsEvalToneCurveFloat(Yreversed, x);
+ }
+
+ // Allocate space for output
+ out = cmsBuildTabulatedToneCurveFloat(ContextID, nResultingPoints, Res);
+
+Error:
+
+ if (Res != NULL) _cmsFree(ContextID, Res);
+ if (Yreversed != NULL) cmsFreeToneCurve(Yreversed);
+
+ return out;
+}
+
+
+
+// Get the surrounding nodes. This is tricky on non-monotonic tables
+static
+int GetInterval(cmsFloat64Number In, const cmsUInt16Number LutTable[], const struct _cms_interp_struc* p)
+{
+ int i;
+ int y0, y1;
+
+ // A 1 point table is not allowed
+ if (p -> Domain[0] < 1) return -1;
+
+ // Let's see if ascending or descending.
+ if (LutTable[0] < LutTable[p ->Domain[0]]) {
+
+ // Table is overall ascending
+ for (i=p->Domain[0]-1; i >=0; --i) {
+
+ y0 = LutTable[i];
+ y1 = LutTable[i+1];
+
+ if (y0 <= y1) { // Increasing
+ if (In >= y0 && In <= y1) return i;
+ }
+ else
+ if (y1 < y0) { // Decreasing
+ if (In >= y1 && In <= y0) return i;
+ }
+ }
+ }
+ else {
+ // Table is overall descending
+ for (i=0; i < (int) p -> Domain[0]; i++) {
+
+ y0 = LutTable[i];
+ y1 = LutTable[i+1];
+
+ if (y0 <= y1) { // Increasing
+ if (In >= y0 && In <= y1) return i;
+ }
+ else
+ if (y1 < y0) { // Decreasing
+ if (In >= y1 && In <= y0) return i;
+ }
+ }
+ }
+
+ return -1;
+}
+
+// Reverse a gamma table
+cmsToneCurve* CMSEXPORT cmsReverseToneCurveEx(cmsInt32Number nResultSamples, const cmsToneCurve* InCurve)
+{
+ cmsToneCurve *out;
+ cmsFloat64Number a = 0, b = 0, y, x1, y1, x2, y2;
+ int i, j;
+ int Ascending;
+
+ _cmsAssert(InCurve != NULL);
+
+ // Try to reverse it analytically whatever possible
+
+ if (InCurve ->nSegments == 1 && InCurve ->Segments[0].Type > 0 &&
+ /* InCurve -> Segments[0].Type <= 5 */
+ GetParametricCurveByType(InCurve ->InterpParams->ContextID, InCurve ->Segments[0].Type, NULL) != NULL) {
+
+ return cmsBuildParametricToneCurve(InCurve ->InterpParams->ContextID,
+ -(InCurve -> Segments[0].Type),
+ InCurve -> Segments[0].Params);
+ }
+
+ // Nope, reverse the table.
+ out = cmsBuildTabulatedToneCurve16(InCurve ->InterpParams->ContextID, nResultSamples, NULL);
+ if (out == NULL)
+ return NULL;
+
+ // We want to know if this is an ascending or descending table
+ Ascending = !cmsIsToneCurveDescending(InCurve);
+
+ // Iterate across Y axis
+ for (i=0; i < nResultSamples; i++) {
+
+ y = (cmsFloat64Number) i * 65535.0 / (nResultSamples - 1);
+
+ // Find interval in which y is within.
+ j = GetInterval(y, InCurve->Table16, InCurve->InterpParams);
+ if (j >= 0) {
+
+
+ // Get limits of interval
+ x1 = InCurve ->Table16[j];
+ x2 = InCurve ->Table16[j+1];
+
+ y1 = (cmsFloat64Number) (j * 65535.0) / (InCurve ->nEntries - 1);
+ y2 = (cmsFloat64Number) ((j+1) * 65535.0 ) / (InCurve ->nEntries - 1);
+
+ // If collapsed, then use any
+ if (x1 == x2) {
+
+ out ->Table16[i] = _cmsQuickSaturateWord(Ascending ? y2 : y1);
+ continue;
+
+ } else {
+
+ // Interpolate
+ a = (y2 - y1) / (x2 - x1);
+ b = y2 - a * x2;
+ }
+ }
+
+ out ->Table16[i] = _cmsQuickSaturateWord(a* y + b);
+ }
+
+
+ return out;
+}
+
+// Reverse a gamma table
+cmsToneCurve* CMSEXPORT cmsReverseToneCurve(const cmsToneCurve* InGamma)
+{
+ _cmsAssert(InGamma != NULL);
+
+ return cmsReverseToneCurveEx(4096, InGamma);
+}
+
+// From: Eilers, P.H.C. (1994) Smoothing and interpolation with finite
+// differences. in: Graphic Gems IV, Heckbert, P.S. (ed.), Academic press.
+//
+// Smoothing and interpolation with second differences.
+//
+// Input: weights (w), data (y): vector from 1 to m.
+// Input: smoothing parameter (lambda), length (m).
+// Output: smoothed vector (z): vector from 1 to m.
+
+static
+cmsBool smooth2(cmsContext ContextID, cmsFloat32Number w[], cmsFloat32Number y[], cmsFloat32Number z[], cmsFloat32Number lambda, int m)
+{
+ int i, i1, i2;
+ cmsFloat32Number *c, *d, *e;
+ cmsBool st;
+
+
+ c = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+ d = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+ e = (cmsFloat32Number*) _cmsCalloc(ContextID, MAX_NODES_IN_CURVE, sizeof(cmsFloat32Number));
+
+ if (c != NULL && d != NULL && e != NULL) {
+
+
+ d[1] = w[1] + lambda;
+ c[1] = -2 * lambda / d[1];
+ e[1] = lambda /d[1];
+ z[1] = w[1] * y[1];
+ d[2] = w[2] + 5 * lambda - d[1] * c[1] * c[1];
+ c[2] = (-4 * lambda - d[1] * c[1] * e[1]) / d[2];
+ e[2] = lambda / d[2];
+ z[2] = w[2] * y[2] - c[1] * z[1];
+
+ for (i = 3; i < m - 1; i++) {
+ i1 = i - 1; i2 = i - 2;
+ d[i]= w[i] + 6 * lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ c[i] = (-4 * lambda -d[i1] * c[i1] * e[i1])/ d[i];
+ e[i] = lambda / d[i];
+ z[i] = w[i] * y[i] - c[i1] * z[i1] - e[i2] * z[i2];
+ }
+
+ i1 = m - 2; i2 = m - 3;
+
+ d[m - 1] = w[m - 1] + 5 * lambda -c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ c[m - 1] = (-2 * lambda - d[i1] * c[i1] * e[i1]) / d[m - 1];
+ z[m - 1] = w[m - 1] * y[m - 1] - c[i1] * z[i1] - e[i2] * z[i2];
+ i1 = m - 1; i2 = m - 2;
+
+ d[m] = w[m] + lambda - c[i1] * c[i1] * d[i1] - e[i2] * e[i2] * d[i2];
+ z[m] = (w[m] * y[m] - c[i1] * z[i1] - e[i2] * z[i2]) / d[m];
+ z[m - 1] = z[m - 1] / d[m - 1] - c[m - 1] * z[m];
+
+ for (i = m - 2; 1<= i; i--)
+ z[i] = z[i] / d[i] - c[i] * z[i + 1] - e[i] * z[i + 2];
+
+ st = TRUE;
+ }
+ else st = FALSE;
+
+ if (c != NULL) _cmsFree(ContextID, c);
+ if (d != NULL) _cmsFree(ContextID, d);
+ if (e != NULL) _cmsFree(ContextID, e);
+
+ return st;
+}
+
+// Smooths a curve sampled at regular intervals.
+cmsBool CMSEXPORT cmsSmoothToneCurve(cmsToneCurve* Tab, cmsFloat64Number lambda)
+{
+ cmsFloat32Number w[MAX_NODES_IN_CURVE], y[MAX_NODES_IN_CURVE], z[MAX_NODES_IN_CURVE];
+ int i, nItems, Zeros, Poles;
+
+ if (Tab == NULL) return FALSE;
+
+ if (cmsIsToneCurveLinear(Tab)) return TRUE; // Nothing to do
+
+ nItems = Tab -> nEntries;
+
+ if (nItems >= MAX_NODES_IN_CURVE) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: too many points.");
+ return FALSE;
+ }
+
+ memset(w, 0, nItems * sizeof(cmsFloat32Number));
+ memset(y, 0, nItems * sizeof(cmsFloat32Number));
+ memset(z, 0, nItems * sizeof(cmsFloat32Number));
+
+ for (i=0; i < nItems; i++)
+ {
+ y[i+1] = (cmsFloat32Number) Tab -> Table16[i];
+ w[i+1] = 1.0;
+ }
+
+ if (!smooth2(Tab ->InterpParams->ContextID, w, y, z, (cmsFloat32Number) lambda, nItems)) return FALSE;
+
+ // Do some reality - checking...
+ Zeros = Poles = 0;
+ for (i=nItems; i > 1; --i) {
+
+ if (z[i] == 0.) Zeros++;
+ if (z[i] >= 65535.) Poles++;
+ if (z[i] < z[i-1]) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Non-Monotonic.");
+ return FALSE;
+ }
+ }
+
+ if (Zeros > (nItems / 3)) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly zeros.");
+ return FALSE;
+ }
+ if (Poles > (nItems / 3)) {
+ cmsSignalError(Tab ->InterpParams->ContextID, cmsERROR_RANGE, "cmsSmoothToneCurve: Degenerated, mostly poles.");
+ return FALSE;
+ }
+
+ // Seems ok
+ for (i=0; i < nItems; i++) {
+
+ // Clamp to cmsUInt16Number
+ Tab -> Table16[i] = _cmsQuickSaturateWord(z[i+1]);
+ }
+
+ return TRUE;
+}
+
+// Is a table linear? Do not use parametric since we cannot guarantee some weird parameters resulting
+// in a linear table. This way assures it is linear in 12 bits, which should be enought in most cases.
+cmsBool CMSEXPORT cmsIsToneCurveLinear(const cmsToneCurve* Curve)
+{
+ cmsUInt32Number i;
+ int diff;
+
+ _cmsAssert(Curve != NULL);
+
+ for (i=0; i < Curve ->nEntries; i++) {
+
+ diff = abs((int) Curve->Table16[i] - (int) _cmsQuantizeVal(i, Curve ->nEntries));
+ if (diff > 0x0f)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+// Same, but for monotonicity
+cmsBool CMSEXPORT cmsIsToneCurveMonotonic(const cmsToneCurve* t)
+{
+ int n;
+ int i, last;
+ cmsBool lDescending;
+
+ _cmsAssert(t != NULL);
+
+ // Degenerated curves are monotonic? Ok, let's pass them
+ n = t ->nEntries;
+ if (n < 2) return TRUE;
+
+ // Curve direction
+ lDescending = cmsIsToneCurveDescending(t);
+
+ if (lDescending) {
+
+ last = t ->Table16[0];
+
+ for (i = 1; i < n; i++) {
+
+ if (t ->Table16[i] - last > 2) // We allow some ripple
+ return FALSE;
+ else
+ last = t ->Table16[i];
+
+ }
+ }
+ else {
+
+ last = t ->Table16[n-1];
+
+ for (i = n-2; i >= 0; --i) {
+
+ if (t ->Table16[i] - last > 2)
+ return FALSE;
+ else
+ last = t ->Table16[i];
+
+ }
+ }
+
+ return TRUE;
+}
+
+// Same, but for descending tables
+cmsBool CMSEXPORT cmsIsToneCurveDescending(const cmsToneCurve* t)
+{
+ _cmsAssert(t != NULL);
+
+ return t ->Table16[0] > t ->Table16[t ->nEntries-1];
+}
+
+
+// Another info fn: is out gamma table multisegment?
+cmsBool CMSEXPORT cmsIsToneCurveMultisegment(const cmsToneCurve* t)
+{
+ _cmsAssert(t != NULL);
+
+ return t -> nSegments > 1;
+}
+
+cmsInt32Number CMSEXPORT cmsGetToneCurveParametricType(const cmsToneCurve* t)
+{
+ _cmsAssert(t != NULL);
+
+ if (t -> nSegments != 1) return 0;
+ return t ->Segments[0].Type;
+}
+
+// We need accuracy this time
+cmsFloat32Number CMSEXPORT cmsEvalToneCurveFloat(const cmsToneCurve* Curve, cmsFloat32Number v)
+{
+ _cmsAssert(Curve != NULL);
+
+ // Check for 16 bits table. If so, this is a limited-precision tone curve
+ if (Curve ->nSegments == 0) {
+
+ cmsUInt16Number In, Out;
+
+ In = (cmsUInt16Number) _cmsQuickSaturateWord(v * 65535.0);
+ Out = cmsEvalToneCurve16(Curve, In);
+
+ return (cmsFloat32Number) (Out / 65535.0);
+ }
+
+ return (cmsFloat32Number) EvalSegmentedFn(Curve, v);
+}
+
+// We need xput over here
+cmsUInt16Number CMSEXPORT cmsEvalToneCurve16(const cmsToneCurve* Curve, cmsUInt16Number v)
+{
+ cmsUInt16Number out;
+
+ _cmsAssert(Curve != NULL);
+
+ Curve ->InterpParams ->Interpolation.Lerp16(&v, &out, Curve ->InterpParams);
+ return out;
+}
+
+
+// Least squares fitting.
+// A mathematical procedure for finding the best-fitting curve to a given set of points by
+// minimizing the sum of the squares of the offsets ("the residuals") of the points from the curve.
+// The sum of the squares of the offsets is used instead of the offset absolute values because
+// this allows the residuals to be treated as a continuous differentiable quantity.
+//
+// y = f(x) = x ^ g
+//
+// R = (yi - (xi^g))
+// R2 = (yi - (xi^g))2
+// SUM R2 = SUM (yi - (xi^g))2
+//
+// dR2/dg = -2 SUM x^g log(x)(y - x^g)
+// solving for dR2/dg = 0
+//
+// g = 1/n * SUM(log(y) / log(x))
+
+cmsFloat64Number CMSEXPORT cmsEstimateGamma(const cmsToneCurve* t, cmsFloat64Number Precision)
+{
+ cmsFloat64Number gamma, sum, sum2;
+ cmsFloat64Number n, x, y, Std;
+ cmsUInt32Number i;
+
+ _cmsAssert(t != NULL);
+
+ sum = sum2 = n = 0;
+
+ // Excluding endpoints
+ for (i=1; i < (MAX_NODES_IN_CURVE-1); i++) {
+
+ x = (cmsFloat64Number) i / (MAX_NODES_IN_CURVE-1);
+ y = (cmsFloat64Number) cmsEvalToneCurveFloat(t, (cmsFloat32Number) x);
+
+ // Avoid 7% on lower part to prevent
+ // artifacts due to linear ramps
+
+ if (y > 0. && y < 1. && x > 0.07) {
+
+ gamma = log(y) / log(x);
+ sum += gamma;
+ sum2 += gamma * gamma;
+ n++;
+ }
+ }
+
+ // Take a look on SD to see if gamma isn't exponential at all
+ Std = sqrt((n * sum2 - sum * sum) / (n*(n-1)));
+
+ if (Std > Precision)
+ return -1.0;
+
+ return (sum / n); // The mean
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
new file mode 100644
index 0000000000..09427650c9
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsgmt.c
@@ -0,0 +1,590 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Auxiliar: append a Lab identity after the given sequence of profiles
+// and return the transform. Lab profile is closed, rest of profiles are kept open.
+cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsHTRANSFORM xform;
+ cmsHPROFILE hLab;
+ cmsHPROFILE ProfileList[256];
+ cmsBool BPCList[256];
+ cmsFloat64Number AdaptationList[256];
+ cmsUInt32Number IntentList[256];
+ cmsUInt32Number i;
+
+ // This is a rather big number and there is no need of dynamic memory
+ // since we are adding a profile, 254 + 1 = 255 and this is the limit
+ if (nProfiles > 254) return NULL;
+
+ // The output space
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return NULL;
+
+ // Create a copy of parameters
+ for (i=0; i < nProfiles; i++) {
+
+ ProfileList[i] = hProfiles[i];
+ BPCList[i] = BPC[i];
+ AdaptationList[i] = AdaptationStates[i];
+ IntentList[i] = Intents[i];
+ }
+
+ // Place Lab identity at chain's end.
+ ProfileList[nProfiles] = hLab;
+ BPCList[nProfiles] = 0;
+ AdaptationList[nProfiles] = 1.0;
+ IntentList[nProfiles] = INTENT_RELATIVE_COLORIMETRIC;
+
+ // Create the transform
+ xform = cmsCreateExtendedTransform(ContextID, nProfiles + 1, ProfileList,
+ BPCList,
+ IntentList,
+ AdaptationList,
+ NULL, 0,
+ InputFormat,
+ OutputFormat,
+ dwFlags);
+
+ cmsCloseProfile(hLab);
+
+ return xform;
+}
+
+
+// Compute K -> L* relationship. Flags may include black point compensation. In this case,
+// the relationship is assumed from the profile with BPC to a black point zero.
+static
+cmsToneCurve* ComputeKToLstar(cmsContext ContextID,
+ cmsUInt32Number nPoints,
+ cmsUInt32Number nProfiles,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsToneCurve* out = NULL;
+ cmsUInt32Number i;
+ cmsHTRANSFORM xform;
+ cmsCIELab Lab;
+ cmsFloat32Number cmyk[4];
+ cmsFloat32Number* SampledPoints;
+
+ xform = _cmsChain2Lab(ContextID, nProfiles, TYPE_CMYK_FLT, TYPE_Lab_DBL, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+ if (xform == NULL) return NULL;
+
+ SampledPoints = (cmsFloat32Number*) _cmsCalloc(ContextID, nPoints, sizeof(cmsFloat32Number));
+ if (SampledPoints == NULL) goto Error;
+
+ for (i=0; i < nPoints; i++) {
+
+ cmyk[0] = 0;
+ cmyk[1] = 0;
+ cmyk[2] = 0;
+ cmyk[3] = (cmsFloat32Number) ((i * 100.0) / (nPoints-1));
+
+ cmsDoTransform(xform, cmyk, &Lab, 1);
+ SampledPoints[i]= (cmsFloat32Number) (1.0 - Lab.L / 100.0); // Negate K for easier operation
+ }
+
+ out = cmsBuildTabulatedToneCurveFloat(ContextID, nPoints, SampledPoints);
+
+Error:
+
+ cmsDeleteTransform(xform);
+ if (SampledPoints) _cmsFree(ContextID, SampledPoints);
+
+ return out;
+}
+
+
+// Compute Black tone curve on a CMYK -> CMYK transform. This is done by
+// using the proof direction on both profiles to find K->L* relationship
+// then joining both curves. dwFlags may include black point compensation.
+cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
+ cmsUInt32Number nPoints,
+ cmsUInt32Number nProfiles,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags)
+{
+ cmsToneCurve *in, *out, *KTone;
+
+ // Make sure CMYK -> CMYK
+ if (cmsGetColorSpace(hProfiles[0]) != cmsSigCmykData ||
+ cmsGetColorSpace(hProfiles[nProfiles-1])!= cmsSigCmykData) return NULL;
+
+
+ // Make sure last is an output profile
+ if (cmsGetDeviceClass(hProfiles[nProfiles - 1]) != cmsSigOutputClass) return NULL;
+
+ // Create individual curves. BPC works also as each K to L* is
+ // computed as a BPC to zero black point in case of L*
+ in = ComputeKToLstar(ContextID, nPoints, nProfiles - 1, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+ if (in == NULL) return NULL;
+
+ out = ComputeKToLstar(ContextID, nPoints, 1,
+ Intents + (nProfiles - 1),
+ &hProfiles [nProfiles - 1],
+ BPC + (nProfiles - 1),
+ AdaptationStates + (nProfiles - 1),
+ dwFlags);
+ if (out == NULL) {
+ cmsFreeToneCurve(in);
+ return NULL;
+ }
+
+ // Build the relationship. This effectively limits the maximum accuracy to 16 bits, but
+ // since this is used on black-preserving LUTs, we are not loosing accuracy in any case
+ KTone = cmsJoinToneCurve(ContextID, in, out, nPoints);
+
+ // Get rid of components
+ cmsFreeToneCurve(in); cmsFreeToneCurve(out);
+
+ // Something went wrong...
+ if (KTone == NULL) return NULL;
+
+ // Make sure it is monotonic
+ if (!cmsIsToneCurveMonotonic(KTone)) {
+ cmsFreeToneCurve(KTone);
+ return NULL;
+ }
+
+ return KTone;
+}
+
+
+// Gamut LUT Creation -----------------------------------------------------------------------------------------
+
+// Used by gamut & softproofing
+
+typedef struct {
+
+ cmsHTRANSFORM hInput; // From whatever input color space. 16 bits to DBL
+ cmsHTRANSFORM hForward, hReverse; // Transforms going from Lab to colorant and back
+ cmsFloat64Number Thereshold; // The thereshold after which is considered out of gamut
+
+ } GAMUTCHAIN;
+
+// This sampler does compute gamut boundaries by comparing original
+// values with a transform going back and forth. Values above ERR_THERESHOLD
+// of maximum are considered out of gamut.
+
+#define ERR_THERESHOLD 5
+
+
+static
+int GamutSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ GAMUTCHAIN* t = (GAMUTCHAIN* ) Cargo;
+ cmsCIELab LabIn1, LabOut1;
+ cmsCIELab LabIn2, LabOut2;
+ cmsUInt16Number Proof[cmsMAXCHANNELS], Proof2[cmsMAXCHANNELS];
+ cmsFloat64Number dE1, dE2, ErrorRatio;
+
+ // Assume in-gamut by default.
+ ErrorRatio = 1.0;
+
+ // Convert input to Lab
+ cmsDoTransform(t -> hInput, In, &LabIn1, 1);
+
+ // converts from PCS to colorant. This always
+ // does return in-gamut values,
+ cmsDoTransform(t -> hForward, &LabIn1, Proof, 1);
+
+ // Now, do the inverse, from colorant to PCS.
+ cmsDoTransform(t -> hReverse, Proof, &LabOut1, 1);
+
+ memmove(&LabIn2, &LabOut1, sizeof(cmsCIELab));
+
+ // Try again, but this time taking Check as input
+ cmsDoTransform(t -> hForward, &LabOut1, Proof2, 1);
+ cmsDoTransform(t -> hReverse, Proof2, &LabOut2, 1);
+
+ // Take difference of direct value
+ dE1 = cmsDeltaE(&LabIn1, &LabOut1);
+
+ // Take difference of converted value
+ dE2 = cmsDeltaE(&LabIn2, &LabOut2);
+
+
+ // if dE1 is small and dE2 is small, value is likely to be in gamut
+ if (dE1 < t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = 0;
+ else {
+
+ // if dE1 is small and dE2 is big, undefined. Assume in gamut
+ if (dE1 < t->Thereshold && dE2 > t->Thereshold)
+ Out[0] = 0;
+ else
+ // dE1 is big and dE2 is small, clearly out of gamut
+ if (dE1 > t->Thereshold && dE2 < t->Thereshold)
+ Out[0] = (cmsUInt16Number) _cmsQuickFloor((dE1 - t->Thereshold) + .5);
+ else {
+
+ // dE1 is big and dE2 is also big, could be due to perceptual mapping
+ // so take error ratio
+ if (dE2 == 0.0)
+ ErrorRatio = dE1;
+ else
+ ErrorRatio = dE1 / dE2;
+
+ if (ErrorRatio > t->Thereshold)
+ Out[0] = (cmsUInt16Number) _cmsQuickFloor((ErrorRatio - t->Thereshold) + .5);
+ else
+ Out[0] = 0;
+ }
+ }
+
+
+ return TRUE;
+}
+
+// Does compute a gamut LUT going back and forth across pcs -> relativ. colorimetric intent -> pcs
+// the dE obtained is then annotated on the LUT. Values truely out of gamut are clipped to dE = 0xFFFE
+// and values changed are supposed to be handled by any gamut remapping, so, are out of gamut as well.
+//
+// **WARNING: This algorithm does assume that gamut remapping algorithms does NOT move in-gamut colors,
+// of course, many perceptual and saturation intents does not work in such way, but relativ. ones should.
+
+cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsUInt32Number Intents[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number nGamutPCSposition,
+ cmsHPROFILE hGamut)
+{
+ cmsHPROFILE hLab;
+ cmsPipeline* Gamut;
+ cmsStage* CLUT;
+ cmsUInt32Number dwFormat;
+ GAMUTCHAIN Chain;
+ int nChannels, nGridpoints;
+ cmsColorSpaceSignature ColorSpace;
+ cmsUInt32Number i;
+ cmsHPROFILE ProfileList[256];
+ cmsBool BPCList[256];
+ cmsFloat64Number AdaptationList[256];
+ cmsUInt32Number IntentList[256];
+
+ memset(&Chain, 0, sizeof(GAMUTCHAIN));
+
+
+ if (nGamutPCSposition <= 0 || nGamutPCSposition > 255) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong position of PCS. 1..255 expected, %d found.", nGamutPCSposition);
+ return NULL;
+ }
+
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return NULL;
+
+
+ // The figure of merit. On matrix-shaper profiles, should be almost zero as
+ // the conversion is pretty exact. On LUT based profiles, different resolutions
+ // of input and output CLUT may result in differences.
+
+ if (cmsIsMatrixShaper(hGamut)) {
+
+ Chain.Thereshold = 1.0;
+ }
+ else {
+ Chain.Thereshold = ERR_THERESHOLD;
+ }
+
+
+ // Create a copy of parameters
+ for (i=0; i < nGamutPCSposition; i++) {
+ ProfileList[i] = hProfiles[i];
+ BPCList[i] = BPC[i];
+ AdaptationList[i] = AdaptationStates[i];
+ IntentList[i] = Intents[i];
+ }
+
+ // Fill Lab identity
+ ProfileList[nGamutPCSposition] = hLab;
+ BPCList[nGamutPCSposition] = 0;
+ AdaptationList[nGamutPCSposition] = 1.0;
+ IntentList[nGamutPCSposition] = INTENT_RELATIVE_COLORIMETRIC;
+
+
+ ColorSpace = cmsGetColorSpace(hGamut);
+
+ nChannels = cmsChannelsOf(ColorSpace);
+ nGridpoints = _cmsReasonableGridpointsByColorspace(ColorSpace, cmsFLAGS_HIGHRESPRECALC);
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+
+ // 16 bits to Lab double
+ Chain.hInput = cmsCreateExtendedTransform(ContextID,
+ nGamutPCSposition + 1,
+ ProfileList,
+ BPCList,
+ IntentList,
+ AdaptationList,
+ NULL, 0,
+ dwFormat, TYPE_Lab_DBL,
+ cmsFLAGS_NOCACHE);
+
+
+ // Does create the forward step. Lab double to device
+ dwFormat = (CHANNELS_SH(nChannels)|BYTES_SH(2));
+ Chain.hForward = cmsCreateTransformTHR(ContextID,
+ hLab, TYPE_Lab_DBL,
+ hGamut, dwFormat,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
+
+ // Does create the backwards step
+ Chain.hReverse = cmsCreateTransformTHR(ContextID, hGamut, dwFormat,
+ hLab, TYPE_Lab_DBL,
+ INTENT_RELATIVE_COLORIMETRIC,
+ cmsFLAGS_NOCACHE);
+
+
+ // All ok?
+ if (Chain.hInput && Chain.hForward && Chain.hReverse) {
+
+ // Go on, try to compute gamut LUT from PCS. This consist on a single channel containing
+ // dE when doing a transform back and forth on the colorimetric intent.
+
+ Gamut = cmsPipelineAlloc(ContextID, 3, 1);
+ if (Gamut != NULL) {
+
+ CLUT = cmsStageAllocCLut16bit(ContextID, nGridpoints, nChannels, 1, NULL);
+ if (!cmsPipelineInsertStage(Gamut, cmsAT_BEGIN, CLUT)) {
+ cmsPipelineFree(Gamut);
+ Gamut = NULL;
+ }
+ else {
+ cmsStageSampleCLut16bit(CLUT, GamutSampler, (void*) &Chain, 0);
+ }
+ }
+ }
+ else
+ Gamut = NULL; // Didn't work...
+
+ // Free all needed stuff.
+ if (Chain.hInput) cmsDeleteTransform(Chain.hInput);
+ if (Chain.hForward) cmsDeleteTransform(Chain.hForward);
+ if (Chain.hReverse) cmsDeleteTransform(Chain.hReverse);
+ if (hLab) cmsCloseProfile(hLab);
+
+ // And return computed hull
+ return Gamut;
+}
+
+// Total Area Coverage estimation ----------------------------------------------------------------
+
+typedef struct {
+ cmsUInt32Number nOutputChans;
+ cmsHTRANSFORM hRoundTrip;
+ cmsFloat32Number MaxTAC;
+ cmsFloat32Number MaxInput[cmsMAXCHANNELS];
+
+} cmsTACestimator;
+
+
+// This callback just accounts the maximum ink dropped in the given node. It does not populate any
+// memory, as the destination table is NULL. Its only purpose it to know the global maximum.
+static
+int EstimateTAC(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)
+{
+ cmsTACestimator* bp = (cmsTACestimator*) Cargo;
+ cmsFloat32Number RoundTrip[cmsMAXCHANNELS];
+ cmsUInt32Number i;
+ cmsFloat32Number Sum;
+
+
+ // Evaluate the xform
+ cmsDoTransform(bp->hRoundTrip, In, RoundTrip, 1);
+
+ // All all amounts of ink
+ for (Sum=0, i=0; i < bp ->nOutputChans; i++)
+ Sum += RoundTrip[i];
+
+ // If above maximum, keep track of input values
+ if (Sum > bp ->MaxTAC) {
+
+ bp ->MaxTAC = Sum;
+
+ for (i=0; i < bp ->nOutputChans; i++) {
+ bp ->MaxInput[i] = In[i];
+ }
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(Out);
+}
+
+
+// Detect Total area coverage of the profile
+cmsFloat64Number CMSEXPORT cmsDetectTAC(cmsHPROFILE hProfile)
+{
+ cmsTACestimator bp;
+ cmsUInt32Number dwFormatter;
+ cmsUInt32Number GridPoints[MAX_INPUT_DIMENSIONS];
+ cmsHPROFILE hLab;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ // TAC only works on output profiles
+ if (cmsGetDeviceClass(hProfile) != cmsSigOutputClass) {
+ return 0;
+ }
+
+ // Create a fake formatter for result
+ dwFormatter = cmsFormatterForColorspaceOfProfile(hProfile, 4, TRUE);
+
+ bp.nOutputChans = T_CHANNELS(dwFormatter);
+ bp.MaxTAC = 0; // Initial TAC is 0
+
+ // for safety
+ if (bp.nOutputChans >= cmsMAXCHANNELS) return 0;
+
+ hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) return 0;
+ // Setup a roundtrip on perceptual intent in output profile for TAC estimation
+ bp.hRoundTrip = cmsCreateTransformTHR(ContextID, hLab, TYPE_Lab_16,
+ hProfile, dwFormatter, INTENT_PERCEPTUAL, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);
+
+ cmsCloseProfile(hLab);
+ if (bp.hRoundTrip == NULL) return 0;
+
+ // For L* we only need black and white. For C* we need many points
+ GridPoints[0] = 6;
+ GridPoints[1] = 74;
+ GridPoints[2] = 74;
+
+
+ if (!cmsSliceSpace16(3, GridPoints, EstimateTAC, &bp)) {
+ bp.MaxTAC = 0;
+ }
+
+ cmsDeleteTransform(bp.hRoundTrip);
+
+ // Results in %
+ return bp.MaxTAC;
+}
+
+
+// Carefully, clamp on CIELab space.
+
+cmsBool CMSEXPORT cmsDesaturateLab(cmsCIELab* Lab,
+ double amax, double amin,
+ double bmax, double bmin)
+{
+
+ // Whole Luma surface to zero
+
+ if (Lab -> L < 0) {
+
+ Lab-> L = Lab->a = Lab-> b = 0.0;
+ return FALSE;
+ }
+
+ // Clamp white, DISCARD HIGHLIGHTS. This is done
+ // in such way because icc spec doesn't allow the
+ // use of L>100 as a highlight means.
+
+ if (Lab->L > 100)
+ Lab -> L = 100;
+
+ // Check out gamut prism, on a, b faces
+
+ if (Lab -> a < amin || Lab->a > amax||
+ Lab -> b < bmin || Lab->b > bmax) {
+
+ cmsCIELCh LCh;
+ double h, slope;
+
+ // Falls outside a, b limits. Transports to LCh space,
+ // and then do the clipping
+
+
+ if (Lab -> a == 0.0) { // Is hue exactly 90?
+
+ // atan will not work, so clamp here
+ Lab -> b = Lab->b < 0 ? bmin : bmax;
+ return TRUE;
+ }
+
+ cmsLab2LCh(&LCh, Lab);
+
+ slope = Lab -> b / Lab -> a;
+ h = LCh.h;
+
+ // There are 4 zones
+
+ if ((h >= 0. && h < 45.) ||
+ (h >= 315 && h <= 360.)) {
+
+ // clip by amax
+ Lab -> a = amax;
+ Lab -> b = amax * slope;
+ }
+ else
+ if (h >= 45. && h < 135.)
+ {
+ // clip by bmax
+ Lab -> b = bmax;
+ Lab -> a = bmax / slope;
+ }
+ else
+ if (h >= 135. && h < 225.) {
+ // clip by amin
+ Lab -> a = amin;
+ Lab -> b = amin * slope;
+
+ }
+ else
+ if (h >= 225. && h < 315.) {
+ // clip by bmin
+ Lab -> b = bmin;
+ Lab -> a = bmin / slope;
+ }
+ else {
+ cmsSignalError(0, cmsERROR_RANGE, "Invalid angle");
+ return FALSE;
+ }
+
+ }
+
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c
new file mode 100644
index 0000000000..f038b57b4c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmshalf.c
@@ -0,0 +1,534 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+#ifndef CMS_NO_HALF_SUPPORT
+
+// This code is inspired in the paper "Fast Half Float Conversions"
+// by Jeroen van der Zijp
+
+static cmsUInt32Number Mantissa[2048] = {
+
+0x00000000, 0x33800000, 0x34000000, 0x34400000, 0x34800000, 0x34a00000,
+0x34c00000, 0x34e00000, 0x35000000, 0x35100000, 0x35200000, 0x35300000,
+0x35400000, 0x35500000, 0x35600000, 0x35700000, 0x35800000, 0x35880000,
+0x35900000, 0x35980000, 0x35a00000, 0x35a80000, 0x35b00000, 0x35b80000,
+0x35c00000, 0x35c80000, 0x35d00000, 0x35d80000, 0x35e00000, 0x35e80000,
+0x35f00000, 0x35f80000, 0x36000000, 0x36040000, 0x36080000, 0x360c0000,
+0x36100000, 0x36140000, 0x36180000, 0x361c0000, 0x36200000, 0x36240000,
+0x36280000, 0x362c0000, 0x36300000, 0x36340000, 0x36380000, 0x363c0000,
+0x36400000, 0x36440000, 0x36480000, 0x364c0000, 0x36500000, 0x36540000,
+0x36580000, 0x365c0000, 0x36600000, 0x36640000, 0x36680000, 0x366c0000,
+0x36700000, 0x36740000, 0x36780000, 0x367c0000, 0x36800000, 0x36820000,
+0x36840000, 0x36860000, 0x36880000, 0x368a0000, 0x368c0000, 0x368e0000,
+0x36900000, 0x36920000, 0x36940000, 0x36960000, 0x36980000, 0x369a0000,
+0x369c0000, 0x369e0000, 0x36a00000, 0x36a20000, 0x36a40000, 0x36a60000,
+0x36a80000, 0x36aa0000, 0x36ac0000, 0x36ae0000, 0x36b00000, 0x36b20000,
+0x36b40000, 0x36b60000, 0x36b80000, 0x36ba0000, 0x36bc0000, 0x36be0000,
+0x36c00000, 0x36c20000, 0x36c40000, 0x36c60000, 0x36c80000, 0x36ca0000,
+0x36cc0000, 0x36ce0000, 0x36d00000, 0x36d20000, 0x36d40000, 0x36d60000,
+0x36d80000, 0x36da0000, 0x36dc0000, 0x36de0000, 0x36e00000, 0x36e20000,
+0x36e40000, 0x36e60000, 0x36e80000, 0x36ea0000, 0x36ec0000, 0x36ee0000,
+0x36f00000, 0x36f20000, 0x36f40000, 0x36f60000, 0x36f80000, 0x36fa0000,
+0x36fc0000, 0x36fe0000, 0x37000000, 0x37010000, 0x37020000, 0x37030000,
+0x37040000, 0x37050000, 0x37060000, 0x37070000, 0x37080000, 0x37090000,
+0x370a0000, 0x370b0000, 0x370c0000, 0x370d0000, 0x370e0000, 0x370f0000,
+0x37100000, 0x37110000, 0x37120000, 0x37130000, 0x37140000, 0x37150000,
+0x37160000, 0x37170000, 0x37180000, 0x37190000, 0x371a0000, 0x371b0000,
+0x371c0000, 0x371d0000, 0x371e0000, 0x371f0000, 0x37200000, 0x37210000,
+0x37220000, 0x37230000, 0x37240000, 0x37250000, 0x37260000, 0x37270000,
+0x37280000, 0x37290000, 0x372a0000, 0x372b0000, 0x372c0000, 0x372d0000,
+0x372e0000, 0x372f0000, 0x37300000, 0x37310000, 0x37320000, 0x37330000,
+0x37340000, 0x37350000, 0x37360000, 0x37370000, 0x37380000, 0x37390000,
+0x373a0000, 0x373b0000, 0x373c0000, 0x373d0000, 0x373e0000, 0x373f0000,
+0x37400000, 0x37410000, 0x37420000, 0x37430000, 0x37440000, 0x37450000,
+0x37460000, 0x37470000, 0x37480000, 0x37490000, 0x374a0000, 0x374b0000,
+0x374c0000, 0x374d0000, 0x374e0000, 0x374f0000, 0x37500000, 0x37510000,
+0x37520000, 0x37530000, 0x37540000, 0x37550000, 0x37560000, 0x37570000,
+0x37580000, 0x37590000, 0x375a0000, 0x375b0000, 0x375c0000, 0x375d0000,
+0x375e0000, 0x375f0000, 0x37600000, 0x37610000, 0x37620000, 0x37630000,
+0x37640000, 0x37650000, 0x37660000, 0x37670000, 0x37680000, 0x37690000,
+0x376a0000, 0x376b0000, 0x376c0000, 0x376d0000, 0x376e0000, 0x376f0000,
+0x37700000, 0x37710000, 0x37720000, 0x37730000, 0x37740000, 0x37750000,
+0x37760000, 0x37770000, 0x37780000, 0x37790000, 0x377a0000, 0x377b0000,
+0x377c0000, 0x377d0000, 0x377e0000, 0x377f0000, 0x37800000, 0x37808000,
+0x37810000, 0x37818000, 0x37820000, 0x37828000, 0x37830000, 0x37838000,
+0x37840000, 0x37848000, 0x37850000, 0x37858000, 0x37860000, 0x37868000,
+0x37870000, 0x37878000, 0x37880000, 0x37888000, 0x37890000, 0x37898000,
+0x378a0000, 0x378a8000, 0x378b0000, 0x378b8000, 0x378c0000, 0x378c8000,
+0x378d0000, 0x378d8000, 0x378e0000, 0x378e8000, 0x378f0000, 0x378f8000,
+0x37900000, 0x37908000, 0x37910000, 0x37918000, 0x37920000, 0x37928000,
+0x37930000, 0x37938000, 0x37940000, 0x37948000, 0x37950000, 0x37958000,
+0x37960000, 0x37968000, 0x37970000, 0x37978000, 0x37980000, 0x37988000,
+0x37990000, 0x37998000, 0x379a0000, 0x379a8000, 0x379b0000, 0x379b8000,
+0x379c0000, 0x379c8000, 0x379d0000, 0x379d8000, 0x379e0000, 0x379e8000,
+0x379f0000, 0x379f8000, 0x37a00000, 0x37a08000, 0x37a10000, 0x37a18000,
+0x37a20000, 0x37a28000, 0x37a30000, 0x37a38000, 0x37a40000, 0x37a48000,
+0x37a50000, 0x37a58000, 0x37a60000, 0x37a68000, 0x37a70000, 0x37a78000,
+0x37a80000, 0x37a88000, 0x37a90000, 0x37a98000, 0x37aa0000, 0x37aa8000,
+0x37ab0000, 0x37ab8000, 0x37ac0000, 0x37ac8000, 0x37ad0000, 0x37ad8000,
+0x37ae0000, 0x37ae8000, 0x37af0000, 0x37af8000, 0x37b00000, 0x37b08000,
+0x37b10000, 0x37b18000, 0x37b20000, 0x37b28000, 0x37b30000, 0x37b38000,
+0x37b40000, 0x37b48000, 0x37b50000, 0x37b58000, 0x37b60000, 0x37b68000,
+0x37b70000, 0x37b78000, 0x37b80000, 0x37b88000, 0x37b90000, 0x37b98000,
+0x37ba0000, 0x37ba8000, 0x37bb0000, 0x37bb8000, 0x37bc0000, 0x37bc8000,
+0x37bd0000, 0x37bd8000, 0x37be0000, 0x37be8000, 0x37bf0000, 0x37bf8000,
+0x37c00000, 0x37c08000, 0x37c10000, 0x37c18000, 0x37c20000, 0x37c28000,
+0x37c30000, 0x37c38000, 0x37c40000, 0x37c48000, 0x37c50000, 0x37c58000,
+0x37c60000, 0x37c68000, 0x37c70000, 0x37c78000, 0x37c80000, 0x37c88000,
+0x37c90000, 0x37c98000, 0x37ca0000, 0x37ca8000, 0x37cb0000, 0x37cb8000,
+0x37cc0000, 0x37cc8000, 0x37cd0000, 0x37cd8000, 0x37ce0000, 0x37ce8000,
+0x37cf0000, 0x37cf8000, 0x37d00000, 0x37d08000, 0x37d10000, 0x37d18000,
+0x37d20000, 0x37d28000, 0x37d30000, 0x37d38000, 0x37d40000, 0x37d48000,
+0x37d50000, 0x37d58000, 0x37d60000, 0x37d68000, 0x37d70000, 0x37d78000,
+0x37d80000, 0x37d88000, 0x37d90000, 0x37d98000, 0x37da0000, 0x37da8000,
+0x37db0000, 0x37db8000, 0x37dc0000, 0x37dc8000, 0x37dd0000, 0x37dd8000,
+0x37de0000, 0x37de8000, 0x37df0000, 0x37df8000, 0x37e00000, 0x37e08000,
+0x37e10000, 0x37e18000, 0x37e20000, 0x37e28000, 0x37e30000, 0x37e38000,
+0x37e40000, 0x37e48000, 0x37e50000, 0x37e58000, 0x37e60000, 0x37e68000,
+0x37e70000, 0x37e78000, 0x37e80000, 0x37e88000, 0x37e90000, 0x37e98000,
+0x37ea0000, 0x37ea8000, 0x37eb0000, 0x37eb8000, 0x37ec0000, 0x37ec8000,
+0x37ed0000, 0x37ed8000, 0x37ee0000, 0x37ee8000, 0x37ef0000, 0x37ef8000,
+0x37f00000, 0x37f08000, 0x37f10000, 0x37f18000, 0x37f20000, 0x37f28000,
+0x37f30000, 0x37f38000, 0x37f40000, 0x37f48000, 0x37f50000, 0x37f58000,
+0x37f60000, 0x37f68000, 0x37f70000, 0x37f78000, 0x37f80000, 0x37f88000,
+0x37f90000, 0x37f98000, 0x37fa0000, 0x37fa8000, 0x37fb0000, 0x37fb8000,
+0x37fc0000, 0x37fc8000, 0x37fd0000, 0x37fd8000, 0x37fe0000, 0x37fe8000,
+0x37ff0000, 0x37ff8000, 0x38000000, 0x38004000, 0x38008000, 0x3800c000,
+0x38010000, 0x38014000, 0x38018000, 0x3801c000, 0x38020000, 0x38024000,
+0x38028000, 0x3802c000, 0x38030000, 0x38034000, 0x38038000, 0x3803c000,
+0x38040000, 0x38044000, 0x38048000, 0x3804c000, 0x38050000, 0x38054000,
+0x38058000, 0x3805c000, 0x38060000, 0x38064000, 0x38068000, 0x3806c000,
+0x38070000, 0x38074000, 0x38078000, 0x3807c000, 0x38080000, 0x38084000,
+0x38088000, 0x3808c000, 0x38090000, 0x38094000, 0x38098000, 0x3809c000,
+0x380a0000, 0x380a4000, 0x380a8000, 0x380ac000, 0x380b0000, 0x380b4000,
+0x380b8000, 0x380bc000, 0x380c0000, 0x380c4000, 0x380c8000, 0x380cc000,
+0x380d0000, 0x380d4000, 0x380d8000, 0x380dc000, 0x380e0000, 0x380e4000,
+0x380e8000, 0x380ec000, 0x380f0000, 0x380f4000, 0x380f8000, 0x380fc000,
+0x38100000, 0x38104000, 0x38108000, 0x3810c000, 0x38110000, 0x38114000,
+0x38118000, 0x3811c000, 0x38120000, 0x38124000, 0x38128000, 0x3812c000,
+0x38130000, 0x38134000, 0x38138000, 0x3813c000, 0x38140000, 0x38144000,
+0x38148000, 0x3814c000, 0x38150000, 0x38154000, 0x38158000, 0x3815c000,
+0x38160000, 0x38164000, 0x38168000, 0x3816c000, 0x38170000, 0x38174000,
+0x38178000, 0x3817c000, 0x38180000, 0x38184000, 0x38188000, 0x3818c000,
+0x38190000, 0x38194000, 0x38198000, 0x3819c000, 0x381a0000, 0x381a4000,
+0x381a8000, 0x381ac000, 0x381b0000, 0x381b4000, 0x381b8000, 0x381bc000,
+0x381c0000, 0x381c4000, 0x381c8000, 0x381cc000, 0x381d0000, 0x381d4000,
+0x381d8000, 0x381dc000, 0x381e0000, 0x381e4000, 0x381e8000, 0x381ec000,
+0x381f0000, 0x381f4000, 0x381f8000, 0x381fc000, 0x38200000, 0x38204000,
+0x38208000, 0x3820c000, 0x38210000, 0x38214000, 0x38218000, 0x3821c000,
+0x38220000, 0x38224000, 0x38228000, 0x3822c000, 0x38230000, 0x38234000,
+0x38238000, 0x3823c000, 0x38240000, 0x38244000, 0x38248000, 0x3824c000,
+0x38250000, 0x38254000, 0x38258000, 0x3825c000, 0x38260000, 0x38264000,
+0x38268000, 0x3826c000, 0x38270000, 0x38274000, 0x38278000, 0x3827c000,
+0x38280000, 0x38284000, 0x38288000, 0x3828c000, 0x38290000, 0x38294000,
+0x38298000, 0x3829c000, 0x382a0000, 0x382a4000, 0x382a8000, 0x382ac000,
+0x382b0000, 0x382b4000, 0x382b8000, 0x382bc000, 0x382c0000, 0x382c4000,
+0x382c8000, 0x382cc000, 0x382d0000, 0x382d4000, 0x382d8000, 0x382dc000,
+0x382e0000, 0x382e4000, 0x382e8000, 0x382ec000, 0x382f0000, 0x382f4000,
+0x382f8000, 0x382fc000, 0x38300000, 0x38304000, 0x38308000, 0x3830c000,
+0x38310000, 0x38314000, 0x38318000, 0x3831c000, 0x38320000, 0x38324000,
+0x38328000, 0x3832c000, 0x38330000, 0x38334000, 0x38338000, 0x3833c000,
+0x38340000, 0x38344000, 0x38348000, 0x3834c000, 0x38350000, 0x38354000,
+0x38358000, 0x3835c000, 0x38360000, 0x38364000, 0x38368000, 0x3836c000,
+0x38370000, 0x38374000, 0x38378000, 0x3837c000, 0x38380000, 0x38384000,
+0x38388000, 0x3838c000, 0x38390000, 0x38394000, 0x38398000, 0x3839c000,
+0x383a0000, 0x383a4000, 0x383a8000, 0x383ac000, 0x383b0000, 0x383b4000,
+0x383b8000, 0x383bc000, 0x383c0000, 0x383c4000, 0x383c8000, 0x383cc000,
+0x383d0000, 0x383d4000, 0x383d8000, 0x383dc000, 0x383e0000, 0x383e4000,
+0x383e8000, 0x383ec000, 0x383f0000, 0x383f4000, 0x383f8000, 0x383fc000,
+0x38400000, 0x38404000, 0x38408000, 0x3840c000, 0x38410000, 0x38414000,
+0x38418000, 0x3841c000, 0x38420000, 0x38424000, 0x38428000, 0x3842c000,
+0x38430000, 0x38434000, 0x38438000, 0x3843c000, 0x38440000, 0x38444000,
+0x38448000, 0x3844c000, 0x38450000, 0x38454000, 0x38458000, 0x3845c000,
+0x38460000, 0x38464000, 0x38468000, 0x3846c000, 0x38470000, 0x38474000,
+0x38478000, 0x3847c000, 0x38480000, 0x38484000, 0x38488000, 0x3848c000,
+0x38490000, 0x38494000, 0x38498000, 0x3849c000, 0x384a0000, 0x384a4000,
+0x384a8000, 0x384ac000, 0x384b0000, 0x384b4000, 0x384b8000, 0x384bc000,
+0x384c0000, 0x384c4000, 0x384c8000, 0x384cc000, 0x384d0000, 0x384d4000,
+0x384d8000, 0x384dc000, 0x384e0000, 0x384e4000, 0x384e8000, 0x384ec000,
+0x384f0000, 0x384f4000, 0x384f8000, 0x384fc000, 0x38500000, 0x38504000,
+0x38508000, 0x3850c000, 0x38510000, 0x38514000, 0x38518000, 0x3851c000,
+0x38520000, 0x38524000, 0x38528000, 0x3852c000, 0x38530000, 0x38534000,
+0x38538000, 0x3853c000, 0x38540000, 0x38544000, 0x38548000, 0x3854c000,
+0x38550000, 0x38554000, 0x38558000, 0x3855c000, 0x38560000, 0x38564000,
+0x38568000, 0x3856c000, 0x38570000, 0x38574000, 0x38578000, 0x3857c000,
+0x38580000, 0x38584000, 0x38588000, 0x3858c000, 0x38590000, 0x38594000,
+0x38598000, 0x3859c000, 0x385a0000, 0x385a4000, 0x385a8000, 0x385ac000,
+0x385b0000, 0x385b4000, 0x385b8000, 0x385bc000, 0x385c0000, 0x385c4000,
+0x385c8000, 0x385cc000, 0x385d0000, 0x385d4000, 0x385d8000, 0x385dc000,
+0x385e0000, 0x385e4000, 0x385e8000, 0x385ec000, 0x385f0000, 0x385f4000,
+0x385f8000, 0x385fc000, 0x38600000, 0x38604000, 0x38608000, 0x3860c000,
+0x38610000, 0x38614000, 0x38618000, 0x3861c000, 0x38620000, 0x38624000,
+0x38628000, 0x3862c000, 0x38630000, 0x38634000, 0x38638000, 0x3863c000,
+0x38640000, 0x38644000, 0x38648000, 0x3864c000, 0x38650000, 0x38654000,
+0x38658000, 0x3865c000, 0x38660000, 0x38664000, 0x38668000, 0x3866c000,
+0x38670000, 0x38674000, 0x38678000, 0x3867c000, 0x38680000, 0x38684000,
+0x38688000, 0x3868c000, 0x38690000, 0x38694000, 0x38698000, 0x3869c000,
+0x386a0000, 0x386a4000, 0x386a8000, 0x386ac000, 0x386b0000, 0x386b4000,
+0x386b8000, 0x386bc000, 0x386c0000, 0x386c4000, 0x386c8000, 0x386cc000,
+0x386d0000, 0x386d4000, 0x386d8000, 0x386dc000, 0x386e0000, 0x386e4000,
+0x386e8000, 0x386ec000, 0x386f0000, 0x386f4000, 0x386f8000, 0x386fc000,
+0x38700000, 0x38704000, 0x38708000, 0x3870c000, 0x38710000, 0x38714000,
+0x38718000, 0x3871c000, 0x38720000, 0x38724000, 0x38728000, 0x3872c000,
+0x38730000, 0x38734000, 0x38738000, 0x3873c000, 0x38740000, 0x38744000,
+0x38748000, 0x3874c000, 0x38750000, 0x38754000, 0x38758000, 0x3875c000,
+0x38760000, 0x38764000, 0x38768000, 0x3876c000, 0x38770000, 0x38774000,
+0x38778000, 0x3877c000, 0x38780000, 0x38784000, 0x38788000, 0x3878c000,
+0x38790000, 0x38794000, 0x38798000, 0x3879c000, 0x387a0000, 0x387a4000,
+0x387a8000, 0x387ac000, 0x387b0000, 0x387b4000, 0x387b8000, 0x387bc000,
+0x387c0000, 0x387c4000, 0x387c8000, 0x387cc000, 0x387d0000, 0x387d4000,
+0x387d8000, 0x387dc000, 0x387e0000, 0x387e4000, 0x387e8000, 0x387ec000,
+0x387f0000, 0x387f4000, 0x387f8000, 0x387fc000, 0x38000000, 0x38002000,
+0x38004000, 0x38006000, 0x38008000, 0x3800a000, 0x3800c000, 0x3800e000,
+0x38010000, 0x38012000, 0x38014000, 0x38016000, 0x38018000, 0x3801a000,
+0x3801c000, 0x3801e000, 0x38020000, 0x38022000, 0x38024000, 0x38026000,
+0x38028000, 0x3802a000, 0x3802c000, 0x3802e000, 0x38030000, 0x38032000,
+0x38034000, 0x38036000, 0x38038000, 0x3803a000, 0x3803c000, 0x3803e000,
+0x38040000, 0x38042000, 0x38044000, 0x38046000, 0x38048000, 0x3804a000,
+0x3804c000, 0x3804e000, 0x38050000, 0x38052000, 0x38054000, 0x38056000,
+0x38058000, 0x3805a000, 0x3805c000, 0x3805e000, 0x38060000, 0x38062000,
+0x38064000, 0x38066000, 0x38068000, 0x3806a000, 0x3806c000, 0x3806e000,
+0x38070000, 0x38072000, 0x38074000, 0x38076000, 0x38078000, 0x3807a000,
+0x3807c000, 0x3807e000, 0x38080000, 0x38082000, 0x38084000, 0x38086000,
+0x38088000, 0x3808a000, 0x3808c000, 0x3808e000, 0x38090000, 0x38092000,
+0x38094000, 0x38096000, 0x38098000, 0x3809a000, 0x3809c000, 0x3809e000,
+0x380a0000, 0x380a2000, 0x380a4000, 0x380a6000, 0x380a8000, 0x380aa000,
+0x380ac000, 0x380ae000, 0x380b0000, 0x380b2000, 0x380b4000, 0x380b6000,
+0x380b8000, 0x380ba000, 0x380bc000, 0x380be000, 0x380c0000, 0x380c2000,
+0x380c4000, 0x380c6000, 0x380c8000, 0x380ca000, 0x380cc000, 0x380ce000,
+0x380d0000, 0x380d2000, 0x380d4000, 0x380d6000, 0x380d8000, 0x380da000,
+0x380dc000, 0x380de000, 0x380e0000, 0x380e2000, 0x380e4000, 0x380e6000,
+0x380e8000, 0x380ea000, 0x380ec000, 0x380ee000, 0x380f0000, 0x380f2000,
+0x380f4000, 0x380f6000, 0x380f8000, 0x380fa000, 0x380fc000, 0x380fe000,
+0x38100000, 0x38102000, 0x38104000, 0x38106000, 0x38108000, 0x3810a000,
+0x3810c000, 0x3810e000, 0x38110000, 0x38112000, 0x38114000, 0x38116000,
+0x38118000, 0x3811a000, 0x3811c000, 0x3811e000, 0x38120000, 0x38122000,
+0x38124000, 0x38126000, 0x38128000, 0x3812a000, 0x3812c000, 0x3812e000,
+0x38130000, 0x38132000, 0x38134000, 0x38136000, 0x38138000, 0x3813a000,
+0x3813c000, 0x3813e000, 0x38140000, 0x38142000, 0x38144000, 0x38146000,
+0x38148000, 0x3814a000, 0x3814c000, 0x3814e000, 0x38150000, 0x38152000,
+0x38154000, 0x38156000, 0x38158000, 0x3815a000, 0x3815c000, 0x3815e000,
+0x38160000, 0x38162000, 0x38164000, 0x38166000, 0x38168000, 0x3816a000,
+0x3816c000, 0x3816e000, 0x38170000, 0x38172000, 0x38174000, 0x38176000,
+0x38178000, 0x3817a000, 0x3817c000, 0x3817e000, 0x38180000, 0x38182000,
+0x38184000, 0x38186000, 0x38188000, 0x3818a000, 0x3818c000, 0x3818e000,
+0x38190000, 0x38192000, 0x38194000, 0x38196000, 0x38198000, 0x3819a000,
+0x3819c000, 0x3819e000, 0x381a0000, 0x381a2000, 0x381a4000, 0x381a6000,
+0x381a8000, 0x381aa000, 0x381ac000, 0x381ae000, 0x381b0000, 0x381b2000,
+0x381b4000, 0x381b6000, 0x381b8000, 0x381ba000, 0x381bc000, 0x381be000,
+0x381c0000, 0x381c2000, 0x381c4000, 0x381c6000, 0x381c8000, 0x381ca000,
+0x381cc000, 0x381ce000, 0x381d0000, 0x381d2000, 0x381d4000, 0x381d6000,
+0x381d8000, 0x381da000, 0x381dc000, 0x381de000, 0x381e0000, 0x381e2000,
+0x381e4000, 0x381e6000, 0x381e8000, 0x381ea000, 0x381ec000, 0x381ee000,
+0x381f0000, 0x381f2000, 0x381f4000, 0x381f6000, 0x381f8000, 0x381fa000,
+0x381fc000, 0x381fe000, 0x38200000, 0x38202000, 0x38204000, 0x38206000,
+0x38208000, 0x3820a000, 0x3820c000, 0x3820e000, 0x38210000, 0x38212000,
+0x38214000, 0x38216000, 0x38218000, 0x3821a000, 0x3821c000, 0x3821e000,
+0x38220000, 0x38222000, 0x38224000, 0x38226000, 0x38228000, 0x3822a000,
+0x3822c000, 0x3822e000, 0x38230000, 0x38232000, 0x38234000, 0x38236000,
+0x38238000, 0x3823a000, 0x3823c000, 0x3823e000, 0x38240000, 0x38242000,
+0x38244000, 0x38246000, 0x38248000, 0x3824a000, 0x3824c000, 0x3824e000,
+0x38250000, 0x38252000, 0x38254000, 0x38256000, 0x38258000, 0x3825a000,
+0x3825c000, 0x3825e000, 0x38260000, 0x38262000, 0x38264000, 0x38266000,
+0x38268000, 0x3826a000, 0x3826c000, 0x3826e000, 0x38270000, 0x38272000,
+0x38274000, 0x38276000, 0x38278000, 0x3827a000, 0x3827c000, 0x3827e000,
+0x38280000, 0x38282000, 0x38284000, 0x38286000, 0x38288000, 0x3828a000,
+0x3828c000, 0x3828e000, 0x38290000, 0x38292000, 0x38294000, 0x38296000,
+0x38298000, 0x3829a000, 0x3829c000, 0x3829e000, 0x382a0000, 0x382a2000,
+0x382a4000, 0x382a6000, 0x382a8000, 0x382aa000, 0x382ac000, 0x382ae000,
+0x382b0000, 0x382b2000, 0x382b4000, 0x382b6000, 0x382b8000, 0x382ba000,
+0x382bc000, 0x382be000, 0x382c0000, 0x382c2000, 0x382c4000, 0x382c6000,
+0x382c8000, 0x382ca000, 0x382cc000, 0x382ce000, 0x382d0000, 0x382d2000,
+0x382d4000, 0x382d6000, 0x382d8000, 0x382da000, 0x382dc000, 0x382de000,
+0x382e0000, 0x382e2000, 0x382e4000, 0x382e6000, 0x382e8000, 0x382ea000,
+0x382ec000, 0x382ee000, 0x382f0000, 0x382f2000, 0x382f4000, 0x382f6000,
+0x382f8000, 0x382fa000, 0x382fc000, 0x382fe000, 0x38300000, 0x38302000,
+0x38304000, 0x38306000, 0x38308000, 0x3830a000, 0x3830c000, 0x3830e000,
+0x38310000, 0x38312000, 0x38314000, 0x38316000, 0x38318000, 0x3831a000,
+0x3831c000, 0x3831e000, 0x38320000, 0x38322000, 0x38324000, 0x38326000,
+0x38328000, 0x3832a000, 0x3832c000, 0x3832e000, 0x38330000, 0x38332000,
+0x38334000, 0x38336000, 0x38338000, 0x3833a000, 0x3833c000, 0x3833e000,
+0x38340000, 0x38342000, 0x38344000, 0x38346000, 0x38348000, 0x3834a000,
+0x3834c000, 0x3834e000, 0x38350000, 0x38352000, 0x38354000, 0x38356000,
+0x38358000, 0x3835a000, 0x3835c000, 0x3835e000, 0x38360000, 0x38362000,
+0x38364000, 0x38366000, 0x38368000, 0x3836a000, 0x3836c000, 0x3836e000,
+0x38370000, 0x38372000, 0x38374000, 0x38376000, 0x38378000, 0x3837a000,
+0x3837c000, 0x3837e000, 0x38380000, 0x38382000, 0x38384000, 0x38386000,
+0x38388000, 0x3838a000, 0x3838c000, 0x3838e000, 0x38390000, 0x38392000,
+0x38394000, 0x38396000, 0x38398000, 0x3839a000, 0x3839c000, 0x3839e000,
+0x383a0000, 0x383a2000, 0x383a4000, 0x383a6000, 0x383a8000, 0x383aa000,
+0x383ac000, 0x383ae000, 0x383b0000, 0x383b2000, 0x383b4000, 0x383b6000,
+0x383b8000, 0x383ba000, 0x383bc000, 0x383be000, 0x383c0000, 0x383c2000,
+0x383c4000, 0x383c6000, 0x383c8000, 0x383ca000, 0x383cc000, 0x383ce000,
+0x383d0000, 0x383d2000, 0x383d4000, 0x383d6000, 0x383d8000, 0x383da000,
+0x383dc000, 0x383de000, 0x383e0000, 0x383e2000, 0x383e4000, 0x383e6000,
+0x383e8000, 0x383ea000, 0x383ec000, 0x383ee000, 0x383f0000, 0x383f2000,
+0x383f4000, 0x383f6000, 0x383f8000, 0x383fa000, 0x383fc000, 0x383fe000,
+0x38400000, 0x38402000, 0x38404000, 0x38406000, 0x38408000, 0x3840a000,
+0x3840c000, 0x3840e000, 0x38410000, 0x38412000, 0x38414000, 0x38416000,
+0x38418000, 0x3841a000, 0x3841c000, 0x3841e000, 0x38420000, 0x38422000,
+0x38424000, 0x38426000, 0x38428000, 0x3842a000, 0x3842c000, 0x3842e000,
+0x38430000, 0x38432000, 0x38434000, 0x38436000, 0x38438000, 0x3843a000,
+0x3843c000, 0x3843e000, 0x38440000, 0x38442000, 0x38444000, 0x38446000,
+0x38448000, 0x3844a000, 0x3844c000, 0x3844e000, 0x38450000, 0x38452000,
+0x38454000, 0x38456000, 0x38458000, 0x3845a000, 0x3845c000, 0x3845e000,
+0x38460000, 0x38462000, 0x38464000, 0x38466000, 0x38468000, 0x3846a000,
+0x3846c000, 0x3846e000, 0x38470000, 0x38472000, 0x38474000, 0x38476000,
+0x38478000, 0x3847a000, 0x3847c000, 0x3847e000, 0x38480000, 0x38482000,
+0x38484000, 0x38486000, 0x38488000, 0x3848a000, 0x3848c000, 0x3848e000,
+0x38490000, 0x38492000, 0x38494000, 0x38496000, 0x38498000, 0x3849a000,
+0x3849c000, 0x3849e000, 0x384a0000, 0x384a2000, 0x384a4000, 0x384a6000,
+0x384a8000, 0x384aa000, 0x384ac000, 0x384ae000, 0x384b0000, 0x384b2000,
+0x384b4000, 0x384b6000, 0x384b8000, 0x384ba000, 0x384bc000, 0x384be000,
+0x384c0000, 0x384c2000, 0x384c4000, 0x384c6000, 0x384c8000, 0x384ca000,
+0x384cc000, 0x384ce000, 0x384d0000, 0x384d2000, 0x384d4000, 0x384d6000,
+0x384d8000, 0x384da000, 0x384dc000, 0x384de000, 0x384e0000, 0x384e2000,
+0x384e4000, 0x384e6000, 0x384e8000, 0x384ea000, 0x384ec000, 0x384ee000,
+0x384f0000, 0x384f2000, 0x384f4000, 0x384f6000, 0x384f8000, 0x384fa000,
+0x384fc000, 0x384fe000, 0x38500000, 0x38502000, 0x38504000, 0x38506000,
+0x38508000, 0x3850a000, 0x3850c000, 0x3850e000, 0x38510000, 0x38512000,
+0x38514000, 0x38516000, 0x38518000, 0x3851a000, 0x3851c000, 0x3851e000,
+0x38520000, 0x38522000, 0x38524000, 0x38526000, 0x38528000, 0x3852a000,
+0x3852c000, 0x3852e000, 0x38530000, 0x38532000, 0x38534000, 0x38536000,
+0x38538000, 0x3853a000, 0x3853c000, 0x3853e000, 0x38540000, 0x38542000,
+0x38544000, 0x38546000, 0x38548000, 0x3854a000, 0x3854c000, 0x3854e000,
+0x38550000, 0x38552000, 0x38554000, 0x38556000, 0x38558000, 0x3855a000,
+0x3855c000, 0x3855e000, 0x38560000, 0x38562000, 0x38564000, 0x38566000,
+0x38568000, 0x3856a000, 0x3856c000, 0x3856e000, 0x38570000, 0x38572000,
+0x38574000, 0x38576000, 0x38578000, 0x3857a000, 0x3857c000, 0x3857e000,
+0x38580000, 0x38582000, 0x38584000, 0x38586000, 0x38588000, 0x3858a000,
+0x3858c000, 0x3858e000, 0x38590000, 0x38592000, 0x38594000, 0x38596000,
+0x38598000, 0x3859a000, 0x3859c000, 0x3859e000, 0x385a0000, 0x385a2000,
+0x385a4000, 0x385a6000, 0x385a8000, 0x385aa000, 0x385ac000, 0x385ae000,
+0x385b0000, 0x385b2000, 0x385b4000, 0x385b6000, 0x385b8000, 0x385ba000,
+0x385bc000, 0x385be000, 0x385c0000, 0x385c2000, 0x385c4000, 0x385c6000,
+0x385c8000, 0x385ca000, 0x385cc000, 0x385ce000, 0x385d0000, 0x385d2000,
+0x385d4000, 0x385d6000, 0x385d8000, 0x385da000, 0x385dc000, 0x385de000,
+0x385e0000, 0x385e2000, 0x385e4000, 0x385e6000, 0x385e8000, 0x385ea000,
+0x385ec000, 0x385ee000, 0x385f0000, 0x385f2000, 0x385f4000, 0x385f6000,
+0x385f8000, 0x385fa000, 0x385fc000, 0x385fe000, 0x38600000, 0x38602000,
+0x38604000, 0x38606000, 0x38608000, 0x3860a000, 0x3860c000, 0x3860e000,
+0x38610000, 0x38612000, 0x38614000, 0x38616000, 0x38618000, 0x3861a000,
+0x3861c000, 0x3861e000, 0x38620000, 0x38622000, 0x38624000, 0x38626000,
+0x38628000, 0x3862a000, 0x3862c000, 0x3862e000, 0x38630000, 0x38632000,
+0x38634000, 0x38636000, 0x38638000, 0x3863a000, 0x3863c000, 0x3863e000,
+0x38640000, 0x38642000, 0x38644000, 0x38646000, 0x38648000, 0x3864a000,
+0x3864c000, 0x3864e000, 0x38650000, 0x38652000, 0x38654000, 0x38656000,
+0x38658000, 0x3865a000, 0x3865c000, 0x3865e000, 0x38660000, 0x38662000,
+0x38664000, 0x38666000, 0x38668000, 0x3866a000, 0x3866c000, 0x3866e000,
+0x38670000, 0x38672000, 0x38674000, 0x38676000, 0x38678000, 0x3867a000,
+0x3867c000, 0x3867e000, 0x38680000, 0x38682000, 0x38684000, 0x38686000,
+0x38688000, 0x3868a000, 0x3868c000, 0x3868e000, 0x38690000, 0x38692000,
+0x38694000, 0x38696000, 0x38698000, 0x3869a000, 0x3869c000, 0x3869e000,
+0x386a0000, 0x386a2000, 0x386a4000, 0x386a6000, 0x386a8000, 0x386aa000,
+0x386ac000, 0x386ae000, 0x386b0000, 0x386b2000, 0x386b4000, 0x386b6000,
+0x386b8000, 0x386ba000, 0x386bc000, 0x386be000, 0x386c0000, 0x386c2000,
+0x386c4000, 0x386c6000, 0x386c8000, 0x386ca000, 0x386cc000, 0x386ce000,
+0x386d0000, 0x386d2000, 0x386d4000, 0x386d6000, 0x386d8000, 0x386da000,
+0x386dc000, 0x386de000, 0x386e0000, 0x386e2000, 0x386e4000, 0x386e6000,
+0x386e8000, 0x386ea000, 0x386ec000, 0x386ee000, 0x386f0000, 0x386f2000,
+0x386f4000, 0x386f6000, 0x386f8000, 0x386fa000, 0x386fc000, 0x386fe000,
+0x38700000, 0x38702000, 0x38704000, 0x38706000, 0x38708000, 0x3870a000,
+0x3870c000, 0x3870e000, 0x38710000, 0x38712000, 0x38714000, 0x38716000,
+0x38718000, 0x3871a000, 0x3871c000, 0x3871e000, 0x38720000, 0x38722000,
+0x38724000, 0x38726000, 0x38728000, 0x3872a000, 0x3872c000, 0x3872e000,
+0x38730000, 0x38732000, 0x38734000, 0x38736000, 0x38738000, 0x3873a000,
+0x3873c000, 0x3873e000, 0x38740000, 0x38742000, 0x38744000, 0x38746000,
+0x38748000, 0x3874a000, 0x3874c000, 0x3874e000, 0x38750000, 0x38752000,
+0x38754000, 0x38756000, 0x38758000, 0x3875a000, 0x3875c000, 0x3875e000,
+0x38760000, 0x38762000, 0x38764000, 0x38766000, 0x38768000, 0x3876a000,
+0x3876c000, 0x3876e000, 0x38770000, 0x38772000, 0x38774000, 0x38776000,
+0x38778000, 0x3877a000, 0x3877c000, 0x3877e000, 0x38780000, 0x38782000,
+0x38784000, 0x38786000, 0x38788000, 0x3878a000, 0x3878c000, 0x3878e000,
+0x38790000, 0x38792000, 0x38794000, 0x38796000, 0x38798000, 0x3879a000,
+0x3879c000, 0x3879e000, 0x387a0000, 0x387a2000, 0x387a4000, 0x387a6000,
+0x387a8000, 0x387aa000, 0x387ac000, 0x387ae000, 0x387b0000, 0x387b2000,
+0x387b4000, 0x387b6000, 0x387b8000, 0x387ba000, 0x387bc000, 0x387be000,
+0x387c0000, 0x387c2000, 0x387c4000, 0x387c6000, 0x387c8000, 0x387ca000,
+0x387cc000, 0x387ce000, 0x387d0000, 0x387d2000, 0x387d4000, 0x387d6000,
+0x387d8000, 0x387da000, 0x387dc000, 0x387de000, 0x387e0000, 0x387e2000,
+0x387e4000, 0x387e6000, 0x387e8000, 0x387ea000, 0x387ec000, 0x387ee000,
+0x387f0000, 0x387f2000, 0x387f4000, 0x387f6000, 0x387f8000, 0x387fa000,
+0x387fc000, 0x387fe000
+};
+
+static cmsUInt16Number Offset[64] = {
+0x0000, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0000, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400, 0x0400, 0x0400,
+0x0400, 0x0400, 0x0400, 0x0400
+};
+
+static cmsUInt32Number Exponent[64] = {
+0x00000000, 0x00800000, 0x01000000, 0x01800000, 0x02000000, 0x02800000,
+0x03000000, 0x03800000, 0x04000000, 0x04800000, 0x05000000, 0x05800000,
+0x06000000, 0x06800000, 0x07000000, 0x07800000, 0x08000000, 0x08800000,
+0x09000000, 0x09800000, 0x0a000000, 0x0a800000, 0x0b000000, 0x0b800000,
+0x0c000000, 0x0c800000, 0x0d000000, 0x0d800000, 0x0e000000, 0x0e800000,
+0x0f000000, 0x47800000, 0x80000000, 0x80800000, 0x81000000, 0x81800000,
+0x82000000, 0x82800000, 0x83000000, 0x83800000, 0x84000000, 0x84800000,
+0x85000000, 0x85800000, 0x86000000, 0x86800000, 0x87000000, 0x87800000,
+0x88000000, 0x88800000, 0x89000000, 0x89800000, 0x8a000000, 0x8a800000,
+0x8b000000, 0x8b800000, 0x8c000000, 0x8c800000, 0x8d000000, 0x8d800000,
+0x8e000000, 0x8e800000, 0x8f000000, 0xc7800000
+};
+
+static cmsUInt16Number Base[512] = {
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040,
+0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00,
+0x2000, 0x2400, 0x2800, 0x2c00, 0x3000, 0x3400, 0x3800, 0x3c00, 0x4000, 0x4400,
+0x4800, 0x4c00, 0x5000, 0x5400, 0x5800, 0x5c00, 0x6000, 0x6400, 0x6800, 0x6c00,
+0x7000, 0x7400, 0x7800, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00,
+0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x7c00, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8001,
+0x8002, 0x8004, 0x8008, 0x8010, 0x8020, 0x8040, 0x8080, 0x8100, 0x8200, 0x8400,
+0x8800, 0x8c00, 0x9000, 0x9400, 0x9800, 0x9c00, 0xa000, 0xa400, 0xa800, 0xac00,
+0xb000, 0xb400, 0xb800, 0xbc00, 0xc000, 0xc400, 0xc800, 0xcc00, 0xd000, 0xd400,
+0xd800, 0xdc00, 0xe000, 0xe400, 0xe800, 0xec00, 0xf000, 0xf400, 0xf800, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00, 0xfc00,
+0xfc00, 0xfc00
+};
+
+static cmsUInt8Number Shift[512] = {
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17,
+0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13,
+0x12, 0x11, 0x10, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+0x18, 0x18, 0x18, 0x18, 0x0d
+};
+
+cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h)
+{
+ union {
+ cmsFloat32Number flt;
+ cmsUInt32Number num;
+ } out;
+
+ int n = h >> 10;
+
+ out.num = Mantissa[ (h & 0x3ff) + Offset[ n ] ] + Exponent[ n ];
+ return out.flt;
+}
+
+cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt)
+{
+ union {
+ cmsFloat32Number flt;
+ cmsUInt32Number num;
+ } in;
+
+ cmsUInt32Number n, j;
+
+ in.flt = flt;
+ n = in.num;
+ j = (n >> 23) & 0x1ff;
+
+ return (cmsUInt16Number) ((cmsUInt32Number) Base[ j ] + (( n & 0x007fffff) >> Shift[ j ]));
+}
+
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c
new file mode 100644
index 0000000000..5d5f35d3fc
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsintrp.c
@@ -0,0 +1,1506 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// This module incorporates several interpolation routines, for 1 to 8 channels on input and
+// up to 65535 channels on output. The user may change those by using the interpolation plug-in
+
+// Interpolation routines by default
+static cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags);
+
+// This is the default factory
+_cmsInterpPluginChunkType _cmsInterpPluginChunk = { NULL };
+
+// The interpolation plug-in memory chunk allocator/dup
+void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx, const struct _cmsContext_struct* src)
+{
+ void* from;
+
+ _cmsAssert(ctx != NULL);
+
+ if (src != NULL) {
+ from = src ->chunks[InterpPlugin];
+ }
+ else {
+ static _cmsInterpPluginChunkType InterpPluginChunk = { NULL };
+
+ from = &InterpPluginChunk;
+ }
+
+ _cmsAssert(from != NULL);
+ ctx ->chunks[InterpPlugin] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsInterpPluginChunkType));
+}
+
+
+// Main plug-in entry
+cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ cmsPluginInterpolation* Plugin = (cmsPluginInterpolation*) Data;
+ _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);
+
+ if (Data == NULL) {
+
+ ptr ->Interpolators = NULL;
+ return TRUE;
+ }
+
+ // Set replacement functions
+ ptr ->Interpolators = Plugin ->InterpolatorsFactory;
+ return TRUE;
+}
+
+
+// Set the interpolation method
+cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p)
+{
+ _cmsInterpPluginChunkType* ptr = (_cmsInterpPluginChunkType*) _cmsContextGetClientChunk(ContextID, InterpPlugin);
+
+ p ->Interpolation.Lerp16 = NULL;
+
+ // Invoke factory, possibly in the Plug-in
+ if (ptr ->Interpolators != NULL)
+ p ->Interpolation = ptr->Interpolators(p -> nInputs, p ->nOutputs, p ->dwFlags);
+
+ // If unsupported by the plug-in, go for the LittleCMS default.
+ // If happens only if an extern plug-in is being used
+ if (p ->Interpolation.Lerp16 == NULL)
+ p ->Interpolation = DefaultInterpolatorsFactory(p ->nInputs, p ->nOutputs, p ->dwFlags);
+
+ // Check for valid interpolator (we just check one member of the union)
+ if (p ->Interpolation.Lerp16 == NULL) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// This function precalculates as many parameters as possible to speed up the interpolation.
+cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID,
+ const cmsUInt32Number nSamples[],
+ int InputChan, int OutputChan,
+ const void *Table,
+ cmsUInt32Number dwFlags)
+{
+ cmsInterpParams* p;
+ int i;
+
+ // Check for maximum inputs
+ if (InputChan > MAX_INPUT_DIMENSIONS) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", InputChan, MAX_INPUT_DIMENSIONS);
+ return NULL;
+ }
+
+ // Creates an empty object
+ p = (cmsInterpParams*) _cmsMallocZero(ContextID, sizeof(cmsInterpParams));
+ if (p == NULL) return NULL;
+
+ // Keep original parameters
+ p -> dwFlags = dwFlags;
+ p -> nInputs = InputChan;
+ p -> nOutputs = OutputChan;
+ p ->Table = Table;
+ p ->ContextID = ContextID;
+
+ // Fill samples per input direction and domain (which is number of nodes minus one)
+ for (i=0; i < InputChan; i++) {
+
+ p -> nSamples[i] = nSamples[i];
+ p -> Domain[i] = nSamples[i] - 1;
+ }
+
+ // Compute factors to apply to each component to index the grid array
+ p -> opta[0] = p -> nOutputs;
+ for (i=1; i < InputChan; i++)
+ p ->opta[i] = p ->opta[i-1] * nSamples[InputChan-i];
+
+
+ if (!_cmsSetInterpolationRoutine(ContextID, p)) {
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported interpolation (%d->%d channels)", InputChan, OutputChan);
+ _cmsFree(ContextID, p);
+ return NULL;
+ }
+
+ // All seems ok
+ return p;
+}
+
+
+// This one is a wrapper on the anterior, but assuming all directions have same number of nodes
+cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags)
+{
+ int i;
+ cmsUInt32Number Samples[MAX_INPUT_DIMENSIONS];
+
+ // Fill the auxiliar array
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+ Samples[i] = nSamples;
+
+ // Call the extended function
+ return _cmsComputeInterpParamsEx(ContextID, Samples, InputChan, OutputChan, Table, dwFlags);
+}
+
+
+// Free all associated memory
+void _cmsFreeInterpParams(cmsInterpParams* p)
+{
+ if (p != NULL) _cmsFree(p ->ContextID, p);
+}
+
+
+// Inline fixed point interpolation
+cmsINLINE cmsUInt16Number LinearInterp(cmsS15Fixed16Number a, cmsS15Fixed16Number l, cmsS15Fixed16Number h)
+{
+ cmsUInt32Number dif = (cmsUInt32Number) (h - l) * a + 0x8000;
+ dif = (dif >> 16) + l;
+ return (cmsUInt16Number) (dif);
+}
+
+
+// Linear interpolation (Fixed-point optimized)
+static
+void LinLerp1D(register const cmsUInt16Number Value[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p)
+{
+ cmsUInt16Number y1, y0;
+ int cell0, rest;
+ int val3;
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+
+ // if last value...
+ if (Value[0] == 0xffff) {
+
+ Output[0] = LutTable[p -> Domain[0]];
+ return;
+ }
+
+ val3 = p -> Domain[0] * Value[0];
+ val3 = _cmsToFixedDomain(val3); // To fixed 15.16
+
+ cell0 = FIXED_TO_INT(val3); // Cell is 16 MSB bits
+ rest = FIXED_REST_TO_INT(val3); // Rest is 16 LSB bits
+
+ y0 = LutTable[cell0];
+ y1 = LutTable[cell0+1];
+
+
+ Output[0] = LinearInterp(rest, y0, y1);
+}
+
+// To prevent out of bounds indexing
+cmsINLINE cmsFloat32Number fclamp(cmsFloat32Number v)
+{
+ return v < 0.0f ? 0.0f : (v > 1.0f ? 1.0f : v);
+}
+
+// Floating-point version of 1D interpolation
+static
+void LinLerp1Dfloat(const cmsFloat32Number Value[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ cmsFloat32Number y1, y0;
+ cmsFloat32Number val2, rest;
+ int cell0, cell1;
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
+ val2 = fclamp(Value[0]);
+
+ // if last value...
+ if (val2 == 1.0) {
+ Output[0] = LutTable[p -> Domain[0]];
+ return;
+ }
+
+ val2 *= p -> Domain[0];
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ // Rest is 16 LSB bits
+ rest = val2 - cell0;
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell1] ;
+
+ Output[0] = y0 + (y1 - y0) * rest;
+}
+
+
+
+// Eval gray LUT having only one input channel
+static
+void Eval1Input(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+{
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, k1, rk, K0, K1;
+ int v;
+ cmsUInt32Number OutChan;
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+
+ v = Input[0] * p16 -> Domain[0];
+ fk = _cmsToFixedDomain(v);
+
+ k0 = FIXED_TO_INT(fk);
+ rk = (cmsUInt16Number) FIXED_REST_TO_INT(fk);
+
+ k1 = k0 + (Input[0] != 0xFFFFU ? 1 : 0);
+
+ K0 = p16 -> opta[0] * k0;
+ K1 = p16 -> opta[0] * k1;
+
+ for (OutChan=0; OutChan < p16->nOutputs; OutChan++) {
+
+ Output[OutChan] = LinearInterp(rk, LutTable[K0+OutChan], LutTable[K1+OutChan]);
+ }
+}
+
+
+
+// Eval gray LUT having only one input channel
+static
+void Eval1InputFloat(const cmsFloat32Number Value[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ cmsFloat32Number y1, y0;
+ cmsFloat32Number val2, rest;
+ int cell0, cell1;
+ cmsUInt32Number OutChan;
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+
+ val2 = fclamp(Value[0]);
+
+ // if last value...
+ if (val2 == 1.0) {
+ Output[0] = LutTable[p -> Domain[0]];
+ return;
+ }
+
+ val2 *= p -> Domain[0];
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ // Rest is 16 LSB bits
+ rest = val2 - cell0;
+
+ cell0 *= p -> opta[0];
+ cell1 *= p -> opta[0];
+
+ for (OutChan=0; OutChan < p->nOutputs; OutChan++) {
+
+ y0 = LutTable[cell0 + OutChan] ;
+ y1 = LutTable[cell1 + OutChan] ;
+
+ Output[OutChan] = y0 + (y1 - y0) * rest;
+ }
+}
+
+// Bilinear interpolation (16 bits) - cmsFloat32Number version
+static
+void BilinearInterpFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+
+{
+# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a)))
+# define DENS(i,j) (LutTable[(i)+(j)+OutChan])
+
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+ cmsFloat32Number px, py;
+ int x0, y0,
+ X0, Y0, X1, Y1;
+ int TotalOut, OutChan;
+ cmsFloat32Number fx, fy,
+ d00, d01, d10, d11,
+ dx0, dx1,
+ dxy;
+
+ TotalOut = p -> nOutputs;
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
+
+ x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+ y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+
+ X0 = p -> opta[1] * x0;
+ X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[1]);
+
+ Y0 = p -> opta[0] * y0;
+ Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[0]);
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+ d00 = DENS(X0, Y0);
+ d01 = DENS(X0, Y1);
+ d10 = DENS(X1, Y0);
+ d11 = DENS(X1, Y1);
+
+ dx0 = LERP(fx, d00, d10);
+ dx1 = LERP(fx, d01, d11);
+
+ dxy = LERP(fy, dx0, dx1);
+
+ Output[OutChan] = dxy;
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+// Bilinear interpolation (16 bits) - optimized version
+static
+void BilinearInterp16(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p)
+
+{
+#define DENS(i,j) (LutTable[(i)+(j)+OutChan])
+#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))
+
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+ int OutChan, TotalOut;
+ cmsS15Fixed16Number fx, fy;
+ register int rx, ry;
+ int x0, y0;
+ register int X0, X1, Y0, Y1;
+ int d00, d01, d10, d11,
+ dx0, dx1,
+ dxy;
+
+ TotalOut = p -> nOutputs;
+
+ fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+ x0 = FIXED_TO_INT(fx);
+ rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain
+
+
+ fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+ y0 = FIXED_TO_INT(fy);
+ ry = FIXED_REST_TO_INT(fy);
+
+
+ X0 = p -> opta[1] * x0;
+ X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[1]);
+
+ Y0 = p -> opta[0] * y0;
+ Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[0]);
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+ d00 = DENS(X0, Y0);
+ d01 = DENS(X0, Y1);
+ d10 = DENS(X1, Y0);
+ d11 = DENS(X1, Y1);
+
+ dx0 = LERP(rx, d00, d10);
+ dx1 = LERP(rx, d01, d11);
+
+ dxy = LERP(ry, dx0, dx1);
+
+ Output[OutChan] = (cmsUInt16Number) dxy;
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+
+// Trilinear interpolation (16 bits) - cmsFloat32Number version
+static
+void TrilinearInterpFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+
+{
+# define LERP(a,l,h) (cmsFloat32Number) ((l)+(((h)-(l))*(a)))
+# define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p ->Table;
+ cmsFloat32Number px, py, pz;
+ int x0, y0, z0,
+ X0, Y0, Z0, X1, Y1, Z1;
+ int TotalOut, OutChan;
+ cmsFloat32Number fx, fy, fz,
+ d000, d001, d010, d011,
+ d100, d101, d110, d111,
+ dx00, dx01, dx10, dx11,
+ dxy0, dxy1, dxyz;
+
+ TotalOut = p -> nOutputs;
+
+ // We need some clipping here
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
+ pz = fclamp(Input[2]) * p->Domain[2];
+
+ x0 = (int) _cmsQuickFloor(px); fx = px - (cmsFloat32Number) x0;
+ y0 = (int) _cmsQuickFloor(py); fy = py - (cmsFloat32Number) y0;
+ z0 = (int) _cmsQuickFloor(pz); fz = pz - (cmsFloat32Number) z0;
+
+ X0 = p -> opta[2] * x0;
+ X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);
+
+ Y0 = p -> opta[1] * y0;
+ Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);
+
+ Z0 = p -> opta[0] * z0;
+ Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+ d000 = DENS(X0, Y0, Z0);
+ d001 = DENS(X0, Y0, Z1);
+ d010 = DENS(X0, Y1, Z0);
+ d011 = DENS(X0, Y1, Z1);
+
+ d100 = DENS(X1, Y0, Z0);
+ d101 = DENS(X1, Y0, Z1);
+ d110 = DENS(X1, Y1, Z0);
+ d111 = DENS(X1, Y1, Z1);
+
+
+ dx00 = LERP(fx, d000, d100);
+ dx01 = LERP(fx, d001, d101);
+ dx10 = LERP(fx, d010, d110);
+ dx11 = LERP(fx, d011, d111);
+
+ dxy0 = LERP(fy, dx00, dx10);
+ dxy1 = LERP(fy, dx01, dx11);
+
+ dxyz = LERP(fz, dxy0, dxy1);
+
+ Output[OutChan] = dxyz;
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+// Trilinear interpolation (16 bits) - optimized version
+static
+void TrilinearInterp16(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p)
+
+{
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+#define LERP(a,l,h) (cmsUInt16Number) (l + ROUND_FIXED_TO_INT(((h-l)*a)))
+
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p ->Table;
+ int OutChan, TotalOut;
+ cmsS15Fixed16Number fx, fy, fz;
+ register int rx, ry, rz;
+ int x0, y0, z0;
+ register int X0, X1, Y0, Y1, Z0, Z1;
+ int d000, d001, d010, d011,
+ d100, d101, d110, d111,
+ dx00, dx01, dx10, dx11,
+ dxy0, dxy1, dxyz;
+
+ TotalOut = p -> nOutputs;
+
+ fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+ x0 = FIXED_TO_INT(fx);
+ rx = FIXED_REST_TO_INT(fx); // Rest in 0..1.0 domain
+
+
+ fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+ y0 = FIXED_TO_INT(fy);
+ ry = FIXED_REST_TO_INT(fy);
+
+ fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);
+ z0 = FIXED_TO_INT(fz);
+ rz = FIXED_REST_TO_INT(fz);
+
+
+ X0 = p -> opta[2] * x0;
+ X1 = X0 + (Input[0] == 0xFFFFU ? 0 : p->opta[2]);
+
+ Y0 = p -> opta[1] * y0;
+ Y1 = Y0 + (Input[1] == 0xFFFFU ? 0 : p->opta[1]);
+
+ Z0 = p -> opta[0] * z0;
+ Z1 = Z0 + (Input[2] == 0xFFFFU ? 0 : p->opta[0]);
+
+ for (OutChan = 0; OutChan < TotalOut; OutChan++) {
+
+ d000 = DENS(X0, Y0, Z0);
+ d001 = DENS(X0, Y0, Z1);
+ d010 = DENS(X0, Y1, Z0);
+ d011 = DENS(X0, Y1, Z1);
+
+ d100 = DENS(X1, Y0, Z0);
+ d101 = DENS(X1, Y0, Z1);
+ d110 = DENS(X1, Y1, Z0);
+ d111 = DENS(X1, Y1, Z1);
+
+
+ dx00 = LERP(rx, d000, d100);
+ dx01 = LERP(rx, d001, d101);
+ dx10 = LERP(rx, d010, d110);
+ dx11 = LERP(rx, d011, d111);
+
+ dxy0 = LERP(ry, dx00, dx10);
+ dxy1 = LERP(ry, dx01, dx11);
+
+ dxyz = LERP(rz, dxy0, dxy1);
+
+ Output[OutChan] = (cmsUInt16Number) dxyz;
+ }
+
+
+# undef LERP
+# undef DENS
+}
+
+
+// Tetrahedral interpolation, using Sakamoto algorithm.
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void TetrahedralInterpFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number px, py, pz;
+ int x0, y0, z0,
+ X0, Y0, Z0, X1, Y1, Z1;
+ cmsFloat32Number rx, ry, rz;
+ cmsFloat32Number c0, c1=0, c2=0, c3=0;
+ int OutChan, TotalOut;
+
+ TotalOut = p -> nOutputs;
+
+ // We need some clipping here
+ px = fclamp(Input[0]) * p->Domain[0];
+ py = fclamp(Input[1]) * p->Domain[1];
+ pz = fclamp(Input[2]) * p->Domain[2];
+
+ x0 = (int) _cmsQuickFloor(px); rx = (px - (cmsFloat32Number) x0);
+ y0 = (int) _cmsQuickFloor(py); ry = (py - (cmsFloat32Number) y0);
+ z0 = (int) _cmsQuickFloor(pz); rz = (pz - (cmsFloat32Number) z0);
+
+
+ X0 = p -> opta[2] * x0;
+ X1 = X0 + (Input[0] >= 1.0 ? 0 : p->opta[2]);
+
+ Y0 = p -> opta[1] * y0;
+ Y1 = Y0 + (Input[1] >= 1.0 ? 0 : p->opta[1]);
+
+ Z0 = p -> opta[0] * z0;
+ Z1 = Z0 + (Input[2] >= 1.0 ? 0 : p->opta[0]);
+
+ for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+ // These are the 6 Tetrahedral
+
+ c0 = DENS(X0, Y0, Z0);
+
+ if (rx >= ry && ry >= rz) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (rx >= rz && rz >= ry) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+ }
+ else
+ if (rz >= rx && rx >= ry) {
+
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else
+ if (ry >= rx && rx >= rz) {
+
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (ry >= rz && rz >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+ }
+ else
+ if (rz >= ry && ry >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ }
+
+ Output[OutChan] = c0 + c1 * rx + c2 * ry + c3 * rz;
+ }
+
+}
+
+#undef DENS
+
+
+
+
+static
+void TetrahedralInterp16(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p)
+{
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p -> Table;
+ cmsS15Fixed16Number fx, fy, fz;
+ cmsS15Fixed16Number rx, ry, rz;
+ int x0, y0, z0;
+ cmsS15Fixed16Number c0, c1, c2, c3, Rest;
+ cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
+ cmsUInt32Number TotalOut = p -> nOutputs;
+
+ fx = _cmsToFixedDomain((int) Input[0] * p -> Domain[0]);
+ fy = _cmsToFixedDomain((int) Input[1] * p -> Domain[1]);
+ fz = _cmsToFixedDomain((int) Input[2] * p -> Domain[2]);
+
+ x0 = FIXED_TO_INT(fx);
+ y0 = FIXED_TO_INT(fy);
+ z0 = FIXED_TO_INT(fz);
+
+ rx = FIXED_REST_TO_INT(fx);
+ ry = FIXED_REST_TO_INT(fy);
+ rz = FIXED_REST_TO_INT(fz);
+
+ X0 = p -> opta[2] * x0;
+ X1 = (Input[0] == 0xFFFFU ? 0 : p->opta[2]);
+
+ Y0 = p -> opta[1] * y0;
+ Y1 = (Input[1] == 0xFFFFU ? 0 : p->opta[1]);
+
+ Z0 = p -> opta[0] * z0;
+ Z1 = (Input[2] == 0xFFFFU ? 0 : p->opta[0]);
+
+ LutTable = &LutTable[X0+Y0+Z0];
+
+ // Output should be computed as x = ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest))
+ // which expands as: x = (Rest + ((Rest+0x7fff)/0xFFFF) + 0x8000)>>16
+ // This can be replaced by: t = Rest+0x8001, x = (t + (t>>16))>>16
+ // at the cost of being off by one at 7fff and 17ffe.
+
+ if (rx >= ry) {
+ if (ry >= rz) {
+ Y1 += X1;
+ Z1 += Y1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c3 -= c2;
+ c2 -= c1;
+ c1 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ } else if (rz >= rx) {
+ X1 += Z1;
+ Y1 += X1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c2 -= c1;
+ c1 -= c3;
+ c3 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ } else {
+ Z1 += X1;
+ Y1 += Z1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c2 -= c3;
+ c3 -= c1;
+ c1 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ }
+ } else {
+ if (rx >= rz) {
+ X1 += Y1;
+ Z1 += X1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c3 -= c1;
+ c1 -= c2;
+ c2 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ } else if (ry >= rz) {
+ Z1 += Y1;
+ X1 += Z1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c1 -= c3;
+ c3 -= c2;
+ c2 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ } else {
+ Y1 += Z1;
+ X1 += Y1;
+ for (; TotalOut; TotalOut--) {
+ c1 = LutTable[X1];
+ c2 = LutTable[Y1];
+ c3 = LutTable[Z1];
+ c0 = *LutTable++;
+ c1 -= c2;
+ c2 -= c3;
+ c3 -= c0;
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ *Output++ = (cmsUInt16Number) c0 + ((Rest + (Rest>>16))>>16);
+ }
+ }
+ }
+}
+
+
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void Eval4Inputs(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+{
+ const cmsUInt16Number* LutTable;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+ cmsS15Fixed16Number fx, fy, fz;
+ cmsS15Fixed16Number rx, ry, rz;
+ int x0, y0, z0;
+ cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
+ cmsUInt32Number i;
+ cmsS15Fixed16Number c0, c1, c2, c3, Rest;
+ cmsUInt32Number OutChan;
+ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+
+
+ fk = _cmsToFixedDomain((int) Input[0] * p16 -> Domain[0]);
+ fx = _cmsToFixedDomain((int) Input[1] * p16 -> Domain[1]);
+ fy = _cmsToFixedDomain((int) Input[2] * p16 -> Domain[2]);
+ fz = _cmsToFixedDomain((int) Input[3] * p16 -> Domain[3]);
+
+ k0 = FIXED_TO_INT(fk);
+ x0 = FIXED_TO_INT(fx);
+ y0 = FIXED_TO_INT(fy);
+ z0 = FIXED_TO_INT(fz);
+
+ rk = FIXED_REST_TO_INT(fk);
+ rx = FIXED_REST_TO_INT(fx);
+ ry = FIXED_REST_TO_INT(fy);
+ rz = FIXED_REST_TO_INT(fz);
+
+ K0 = p16 -> opta[3] * k0;
+ K1 = K0 + (Input[0] == 0xFFFFU ? 0 : p16->opta[3]);
+
+ X0 = p16 -> opta[2] * x0;
+ X1 = X0 + (Input[1] == 0xFFFFU ? 0 : p16->opta[2]);
+
+ Y0 = p16 -> opta[1] * y0;
+ Y1 = Y0 + (Input[2] == 0xFFFFU ? 0 : p16->opta[1]);
+
+ Z0 = p16 -> opta[0] * z0;
+ Z1 = Z0 + (Input[3] == 0xFFFFU ? 0 : p16->opta[0]);
+
+ LutTable = (cmsUInt16Number*) p16 -> Table;
+ LutTable += K0;
+
+ for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {
+
+ c0 = DENS(X0, Y0, Z0);
+
+ if (rx >= ry && ry >= rz) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (rx >= rz && rz >= ry) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+ }
+ else
+ if (rz >= rx && rx >= ry) {
+
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else
+ if (ry >= rx && rx >= rz) {
+
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (ry >= rz && rz >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+ }
+ else
+ if (rz >= ry && ry >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ }
+
+ Rest = c1 * rx + c2 * ry + c3 * rz;
+
+ Tmp1[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+ }
+
+
+ LutTable = (cmsUInt16Number*) p16 -> Table;
+ LutTable += K1;
+
+ for (OutChan=0; OutChan < p16 -> nOutputs; OutChan++) {
+
+ c0 = DENS(X0, Y0, Z0);
+
+ if (rx >= ry && ry >= rz) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (rx >= rz && rz >= ry) {
+
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+
+ }
+ else
+ if (rz >= rx && rx >= ry) {
+
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else
+ if (ry >= rx && rx >= rz) {
+
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+
+ }
+ else
+ if (ry >= rz && rz >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+
+ }
+ else
+ if (rz >= ry && ry >= rx) {
+
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ }
+
+ Rest = c1 * rx + c2 * ry + c3 * rz;
+
+ Tmp2[OutChan] = (cmsUInt16Number) c0 + ROUND_FIXED_TO_INT(_cmsToFixedDomain(Rest));
+ }
+
+
+
+ for (i=0; i < p16 -> nOutputs; i++) {
+ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+ }
+}
+#undef DENS
+
+
+// For more that 3 inputs (i.e., CMYK)
+// evaluate two 3-dimensional interpolations and then linearly interpolate between them.
+
+
+static
+void Eval4InputsFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number rest;
+ cmsFloat32Number pk;
+ int k0, K0, K1;
+ const cmsFloat32Number* T;
+ cmsUInt32Number i;
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+ K0 = p -> opta[3] * k0;
+ K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[3]);
+
+ p1 = *p;
+ memmove(&p1.Domain[0], &p ->Domain[1], 3*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ TetrahedralInterpFloat(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+ TetrahedralInterpFloat(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p -> nOutputs; i++)
+ {
+ cmsFloat32Number y0 = Tmp1[i];
+ cmsFloat32Number y1 = Tmp2[i];
+
+ Output[i] = y0 + (y1 - y0) * rest;
+ }
+}
+
+
+static
+void Eval5Inputs(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+
+ register const cmsInterpParams* p16)
+{
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+ const cmsUInt16Number* T;
+ cmsUInt32Number i;
+ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+
+ fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta[4] * k0;
+ K1 = p16 -> opta[4] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+ p1 = *p16;
+ memmove(&p1.Domain[0], &p16 ->Domain[1], 4*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval4Inputs(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval4Inputs(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p16 -> nOutputs; i++) {
+
+ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+ }
+
+}
+
+
+static
+void Eval5InputsFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number rest;
+ cmsFloat32Number pk;
+ int k0, K0, K1;
+ const cmsFloat32Number* T;
+ cmsUInt32Number i;
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+ K0 = p -> opta[4] * k0;
+ K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[4]);
+
+ p1 = *p;
+ memmove(&p1.Domain[0], &p ->Domain[1], 4*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval4InputsFloat(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval4InputsFloat(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p -> nOutputs; i++) {
+
+ cmsFloat32Number y0 = Tmp1[i];
+ cmsFloat32Number y1 = Tmp2[i];
+
+ Output[i] = y0 + (y1 - y0) * rest;
+ }
+}
+
+
+
+static
+void Eval6Inputs(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+{
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+ const cmsUInt16Number* T;
+ cmsUInt32Number i;
+ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta[5] * k0;
+ K1 = p16 -> opta[5] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+ p1 = *p16;
+ memmove(&p1.Domain[0], &p16 ->Domain[1], 5*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval5Inputs(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval5Inputs(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p16 -> nOutputs; i++) {
+
+ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+ }
+
+}
+
+
+static
+void Eval6InputsFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number rest;
+ cmsFloat32Number pk;
+ int k0, K0, K1;
+ const cmsFloat32Number* T;
+ cmsUInt32Number i;
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+ K0 = p -> opta[5] * k0;
+ K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[5]);
+
+ p1 = *p;
+ memmove(&p1.Domain[0], &p ->Domain[1], 5*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval5InputsFloat(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval5InputsFloat(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p -> nOutputs; i++) {
+
+ cmsFloat32Number y0 = Tmp1[i];
+ cmsFloat32Number y1 = Tmp2[i];
+
+ Output[i] = y0 + (y1 - y0) * rest;
+ }
+}
+
+
+static
+void Eval7Inputs(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+{
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+ const cmsUInt16Number* T;
+ cmsUInt32Number i;
+ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+
+ fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta[6] * k0;
+ K1 = p16 -> opta[6] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+ p1 = *p16;
+ memmove(&p1.Domain[0], &p16 ->Domain[1], 6*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval6Inputs(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval6Inputs(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p16 -> nOutputs; i++) {
+ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+ }
+}
+
+
+static
+void Eval7InputsFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number rest;
+ cmsFloat32Number pk;
+ int k0, K0, K1;
+ const cmsFloat32Number* T;
+ cmsUInt32Number i;
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+ K0 = p -> opta[6] * k0;
+ K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[6]);
+
+ p1 = *p;
+ memmove(&p1.Domain[0], &p ->Domain[1], 6*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval6InputsFloat(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval6InputsFloat(Input + 1, Tmp2, &p1);
+
+
+ for (i=0; i < p -> nOutputs; i++) {
+
+ cmsFloat32Number y0 = Tmp1[i];
+ cmsFloat32Number y1 = Tmp2[i];
+
+ Output[i] = y0 + (y1 - y0) * rest;
+
+ }
+}
+
+static
+void Eval8Inputs(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const cmsInterpParams* p16)
+{
+ const cmsUInt16Number* LutTable = (cmsUInt16Number*) p16 -> Table;
+ cmsS15Fixed16Number fk;
+ cmsS15Fixed16Number k0, rk;
+ int K0, K1;
+ const cmsUInt16Number* T;
+ cmsUInt32Number i;
+ cmsUInt16Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ fk = _cmsToFixedDomain((cmsS15Fixed16Number) Input[0] * p16 -> Domain[0]);
+ k0 = FIXED_TO_INT(fk);
+ rk = FIXED_REST_TO_INT(fk);
+
+ K0 = p16 -> opta[7] * k0;
+ K1 = p16 -> opta[7] * (k0 + (Input[0] != 0xFFFFU ? 1 : 0));
+
+ p1 = *p16;
+ memmove(&p1.Domain[0], &p16 ->Domain[1], 7*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval7Inputs(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+ Eval7Inputs(Input + 1, Tmp2, &p1);
+
+ for (i=0; i < p16 -> nOutputs; i++) {
+ Output[i] = LinearInterp(rk, Tmp1[i], Tmp2[i]);
+ }
+}
+
+
+
+static
+void Eval8InputsFloat(const cmsFloat32Number Input[],
+ cmsFloat32Number Output[],
+ const cmsInterpParams* p)
+{
+ const cmsFloat32Number* LutTable = (cmsFloat32Number*) p -> Table;
+ cmsFloat32Number rest;
+ cmsFloat32Number pk;
+ int k0, K0, K1;
+ const cmsFloat32Number* T;
+ cmsUInt32Number i;
+ cmsFloat32Number Tmp1[MAX_STAGE_CHANNELS], Tmp2[MAX_STAGE_CHANNELS];
+ cmsInterpParams p1;
+
+ pk = fclamp(Input[0]) * p->Domain[0];
+ k0 = _cmsQuickFloor(pk);
+ rest = pk - (cmsFloat32Number) k0;
+
+ K0 = p -> opta[7] * k0;
+ K1 = K0 + (Input[0] >= 1.0 ? 0 : p->opta[7]);
+
+ p1 = *p;
+ memmove(&p1.Domain[0], &p ->Domain[1], 7*sizeof(cmsUInt32Number));
+
+ T = LutTable + K0;
+ p1.Table = T;
+
+ Eval7InputsFloat(Input + 1, Tmp1, &p1);
+
+ T = LutTable + K1;
+ p1.Table = T;
+
+ Eval7InputsFloat(Input + 1, Tmp2, &p1);
+
+
+ for (i=0; i < p -> nOutputs; i++) {
+
+ cmsFloat32Number y0 = Tmp1[i];
+ cmsFloat32Number y1 = Tmp2[i];
+
+ Output[i] = y0 + (y1 - y0) * rest;
+ }
+}
+
+// The default factory
+static
+cmsInterpFunction DefaultInterpolatorsFactory(cmsUInt32Number nInputChannels, cmsUInt32Number nOutputChannels, cmsUInt32Number dwFlags)
+{
+
+ cmsInterpFunction Interpolation;
+ cmsBool IsFloat = (dwFlags & CMS_LERP_FLAGS_FLOAT);
+ cmsBool IsTrilinear = (dwFlags & CMS_LERP_FLAGS_TRILINEAR);
+
+ memset(&Interpolation, 0, sizeof(Interpolation));
+
+ // Safety check
+ if (nInputChannels >= 4 && nOutputChannels >= MAX_STAGE_CHANNELS)
+ return Interpolation;
+
+ switch (nInputChannels) {
+
+ case 1: // Gray LUT / linear
+
+ if (nOutputChannels == 1) {
+
+ if (IsFloat)
+ Interpolation.LerpFloat = LinLerp1Dfloat;
+ else
+ Interpolation.Lerp16 = LinLerp1D;
+
+ }
+ else {
+
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval1InputFloat;
+ else
+ Interpolation.Lerp16 = Eval1Input;
+ }
+ break;
+
+ case 2: // Duotone
+ if (IsFloat)
+ Interpolation.LerpFloat = BilinearInterpFloat;
+ else
+ Interpolation.Lerp16 = BilinearInterp16;
+ break;
+
+ case 3: // RGB et al
+
+ if (IsTrilinear) {
+
+ if (IsFloat)
+ Interpolation.LerpFloat = TrilinearInterpFloat;
+ else
+ Interpolation.Lerp16 = TrilinearInterp16;
+ }
+ else {
+
+ if (IsFloat)
+ Interpolation.LerpFloat = TetrahedralInterpFloat;
+ else {
+
+ Interpolation.Lerp16 = TetrahedralInterp16;
+ }
+ }
+ break;
+
+ case 4: // CMYK lut
+
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval4InputsFloat;
+ else
+ Interpolation.Lerp16 = Eval4Inputs;
+ break;
+
+ case 5: // 5 Inks
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval5InputsFloat;
+ else
+ Interpolation.Lerp16 = Eval5Inputs;
+ break;
+
+ case 6: // 6 Inks
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval6InputsFloat;
+ else
+ Interpolation.Lerp16 = Eval6Inputs;
+ break;
+
+ case 7: // 7 inks
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval7InputsFloat;
+ else
+ Interpolation.Lerp16 = Eval7Inputs;
+ break;
+
+ case 8: // 8 inks
+ if (IsFloat)
+ Interpolation.LerpFloat = Eval8InputsFloat;
+ else
+ Interpolation.Lerp16 = Eval8Inputs;
+ break;
+
+ break;
+
+ default:
+ Interpolation.Lerp16 = NULL;
+ }
+
+ return Interpolation;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c
new file mode 100644
index 0000000000..6549d15d9e
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio0.c
@@ -0,0 +1,1883 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+#include "lcms2_internal.h"
+
+// Generic I/O, tag dictionary management, profile struct
+
+// IOhandlers are abstractions used by littleCMS to read from whatever file, stream,
+// memory block or any storage. Each IOhandler provides implementations for read,
+// write, seek and tell functions. LittleCMS code deals with IO across those objects.
+// In this way, is easier to add support for new storage media.
+
+// NULL stream, for taking care of used space -------------------------------------
+
+// NULL IOhandler basically does nothing but keep track on how many bytes have been
+// written. This is handy when creating profiles, where the file size is needed in the
+// header. Then, whole profile is serialized across NULL IOhandler and a second pass
+// writes the bytes to the pertinent IOhandler.
+
+typedef struct {
+ cmsUInt32Number Pointer; // Points to current location
+} FILENULL;
+
+static
+cmsUInt32Number NULLRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+ FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+ cmsUInt32Number len = size * count;
+ ResData -> Pointer += len;
+ return count;
+
+ cmsUNUSED_PARAMETER(Buffer);
+}
+
+static
+cmsBool NULLSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
+{
+ FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+ ResData ->Pointer = offset;
+ return TRUE;
+}
+
+static
+cmsUInt32Number NULLTell(cmsIOHANDLER* iohandler)
+{
+ FILENULL* ResData = (FILENULL*) iohandler ->stream;
+ return ResData -> Pointer;
+}
+
+static
+cmsBool NULLWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void *Ptr)
+{
+ FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+ ResData ->Pointer += size;
+ if (ResData ->Pointer > iohandler->UsedSpace)
+ iohandler->UsedSpace = ResData ->Pointer;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(Ptr);
+}
+
+static
+cmsBool NULLClose(cmsIOHANDLER* iohandler)
+{
+ FILENULL* ResData = (FILENULL*) iohandler ->stream;
+
+ _cmsFree(iohandler ->ContextID, ResData);
+ _cmsFree(iohandler ->ContextID, iohandler);
+ return TRUE;
+}
+
+// The NULL IOhandler creator
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromNULL(cmsContext ContextID)
+{
+ struct _cms_io_handler* iohandler = NULL;
+ FILENULL* fm = NULL;
+
+ iohandler = (struct _cms_io_handler*) _cmsMallocZero(ContextID, sizeof(struct _cms_io_handler));
+ if (iohandler == NULL) return NULL;
+
+ fm = (FILENULL*) _cmsMallocZero(ContextID, sizeof(FILENULL));
+ if (fm == NULL) goto Error;
+
+ fm ->Pointer = 0;
+
+ iohandler ->ContextID = ContextID;
+ iohandler ->stream = (void*) fm;
+ iohandler ->UsedSpace = 0;
+ iohandler ->ReportedSize = 0;
+ iohandler ->PhysicalFile[0] = 0;
+
+ iohandler ->Read = NULLRead;
+ iohandler ->Seek = NULLSeek;
+ iohandler ->Close = NULLClose;
+ iohandler ->Tell = NULLTell;
+ iohandler ->Write = NULLWrite;
+
+ return iohandler;
+
+Error:
+ if (iohandler) _cmsFree(ContextID, iohandler);
+ return NULL;
+
+}
+
+
+// Memory-based stream --------------------------------------------------------------
+
+// Those functions implements an iohandler which takes a block of memory as storage medium.
+
+typedef struct {
+ cmsUInt8Number* Block; // Points to allocated memory
+ cmsUInt32Number Size; // Size of allocated memory
+ cmsUInt32Number Pointer; // Points to current location
+ int FreeBlockOnClose; // As title
+
+} FILEMEM;
+
+static
+cmsUInt32Number MemoryRead(struct _cms_io_handler* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+ cmsUInt8Number* Ptr;
+ cmsUInt32Number len = size * count;
+
+ if (ResData -> Pointer + len > ResData -> Size){
+
+ len = (ResData -> Size - ResData -> Pointer);
+ cmsSignalError(iohandler ->ContextID, cmsERROR_READ, "Read from memory error. Got %d bytes, block should be of %d bytes", len, count * size);
+ return 0;
+ }
+
+ Ptr = ResData -> Block;
+ Ptr += ResData -> Pointer;
+ memmove(Buffer, Ptr, len);
+ ResData -> Pointer += len;
+
+ return count;
+}
+
+// SEEK_CUR is assumed
+static
+cmsBool MemorySeek(struct _cms_io_handler* iohandler, cmsUInt32Number offset)
+{
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+ if (offset > ResData ->Size) {
+ cmsSignalError(iohandler ->ContextID, cmsERROR_SEEK, "Too few data; probably corrupted profile");
+ return FALSE;
+ }
+
+ ResData ->Pointer = offset;
+ return TRUE;
+}
+
+// Tell for memory
+static
+cmsUInt32Number MemoryTell(struct _cms_io_handler* iohandler)
+{
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+ if (ResData == NULL) return 0;
+ return ResData -> Pointer;
+}
+
+
+// Writes data to memory, also keeps used space for further reference.
+static
+cmsBool MemoryWrite(struct _cms_io_handler* iohandler, cmsUInt32Number size, const void *Ptr)
+{
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+ if (ResData == NULL) return FALSE; // Housekeeping
+
+ // Check for available space. Clip.
+ if (ResData->Pointer + size > ResData->Size) {
+ size = ResData ->Size - ResData->Pointer;
+ }
+
+ if (size == 0) return TRUE; // Write zero bytes is ok, but does nothing
+
+ memmove(ResData ->Block + ResData ->Pointer, Ptr, size);
+ ResData ->Pointer += size;
+
+ if (ResData ->Pointer > iohandler->UsedSpace)
+ iohandler->UsedSpace = ResData ->Pointer;
+
+ return TRUE;
+}
+
+
+static
+cmsBool MemoryClose(struct _cms_io_handler* iohandler)
+{
+ FILEMEM* ResData = (FILEMEM*) iohandler ->stream;
+
+ if (ResData ->FreeBlockOnClose) {
+
+ if (ResData ->Block) _cmsFree(iohandler ->ContextID, ResData ->Block);
+ }
+
+ _cmsFree(iohandler ->ContextID, ResData);
+ _cmsFree(iohandler ->ContextID, iohandler);
+
+ return TRUE;
+}
+
+// Create a iohandler for memory block. AccessMode=='r' assumes the iohandler is going to read, and makes
+// a copy of the memory block for letting user to free the memory after invoking open profile. In write
+// mode ("w"), Buffere points to the begin of memory block to be written.
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromMem(cmsContext ContextID, void *Buffer, cmsUInt32Number size, const char* AccessMode)
+{
+ cmsIOHANDLER* iohandler = NULL;
+ FILEMEM* fm = NULL;
+
+ _cmsAssert(AccessMode != NULL);
+
+ iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+ if (iohandler == NULL) return NULL;
+
+ switch (*AccessMode) {
+
+ case 'r':
+ fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));
+ if (fm == NULL) goto Error;
+
+ if (Buffer == NULL) {
+ cmsSignalError(ContextID, cmsERROR_READ, "Couldn't read profile from NULL pointer");
+ goto Error;
+ }
+
+ fm ->Block = (cmsUInt8Number*) _cmsMalloc(ContextID, size);
+ if (fm ->Block == NULL) {
+
+ _cmsFree(ContextID, fm);
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_READ, "Couldn't allocate %ld bytes for profile", size);
+ return NULL;
+ }
+
+
+ memmove(fm->Block, Buffer, size);
+ fm ->FreeBlockOnClose = TRUE;
+ fm ->Size = size;
+ fm ->Pointer = 0;
+ iohandler -> ReportedSize = size;
+ break;
+
+ case 'w':
+ fm = (FILEMEM*) _cmsMallocZero(ContextID, sizeof(FILEMEM));
+ if (fm == NULL) goto Error;
+
+ fm ->Block = (cmsUInt8Number*) Buffer;
+ fm ->FreeBlockOnClose = FALSE;
+ fm ->Size = size;
+ fm ->Pointer = 0;
+ iohandler -> ReportedSize = 0;
+ break;
+
+ default:
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown access mode '%c'", *AccessMode);
+ return NULL;
+ }
+
+ iohandler ->ContextID = ContextID;
+ iohandler ->stream = (void*) fm;
+ iohandler ->UsedSpace = 0;
+ iohandler ->PhysicalFile[0] = 0;
+
+ iohandler ->Read = MemoryRead;
+ iohandler ->Seek = MemorySeek;
+ iohandler ->Close = MemoryClose;
+ iohandler ->Tell = MemoryTell;
+ iohandler ->Write = MemoryWrite;
+
+ return iohandler;
+
+Error:
+ if (fm) _cmsFree(ContextID, fm);
+ if (iohandler) _cmsFree(ContextID, iohandler);
+ return NULL;
+}
+
+// File-based stream -------------------------------------------------------
+
+// Read count elements of size bytes each. Return number of elements read
+static
+cmsUInt32Number FileRead(cmsIOHANDLER* iohandler, void *Buffer, cmsUInt32Number size, cmsUInt32Number count)
+{
+ cmsUInt32Number nReaded = (cmsUInt32Number) fread(Buffer, size, count, (FILE*) iohandler->stream);
+
+ if (nReaded != count) {
+ cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Read error. Got %d bytes, block should be of %d bytes", nReaded * size, count * size);
+ return 0;
+ }
+
+ return nReaded;
+}
+
+// Postion file pointer in the file
+static
+cmsBool FileSeek(cmsIOHANDLER* iohandler, cmsUInt32Number offset)
+{
+ if (fseek((FILE*) iohandler ->stream, (long) offset, SEEK_SET) != 0) {
+
+ cmsSignalError(iohandler ->ContextID, cmsERROR_FILE, "Seek error; probably corrupted file");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+// Returns file pointer position
+static
+cmsUInt32Number FileTell(cmsIOHANDLER* iohandler)
+{
+ return (cmsUInt32Number) ftell((FILE*)iohandler ->stream);
+}
+
+// Writes data to stream, also keeps used space for further reference. Returns TRUE on success, FALSE on error
+static
+cmsBool FileWrite(cmsIOHANDLER* iohandler, cmsUInt32Number size, const void* Buffer)
+{
+ if (size == 0) return TRUE; // We allow to write 0 bytes, but nothing is written
+
+ iohandler->UsedSpace += size;
+ return (fwrite(Buffer, size, 1, (FILE*) iohandler->stream) == 1);
+}
+
+// Closes the file
+static
+cmsBool FileClose(cmsIOHANDLER* iohandler)
+{
+ if (fclose((FILE*) iohandler ->stream) != 0) return FALSE;
+ _cmsFree(iohandler ->ContextID, iohandler);
+ return TRUE;
+}
+
+// Create a iohandler for disk based files.
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromFile(cmsContext ContextID, const char* FileName, const char* AccessMode)
+{
+ cmsIOHANDLER* iohandler = NULL;
+ FILE* fm = NULL;
+
+ _cmsAssert(FileName != NULL);
+ _cmsAssert(AccessMode != NULL);
+
+ iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+ if (iohandler == NULL) return NULL;
+
+ switch (*AccessMode) {
+
+ case 'r':
+ fm = fopen(FileName, "rb");
+ if (fm == NULL) {
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_FILE, "File '%s' not found", FileName);
+ return NULL;
+ }
+ iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(fm);
+ break;
+
+ case 'w':
+ fm = fopen(FileName, "wb");
+ if (fm == NULL) {
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_FILE, "Couldn't create '%s'", FileName);
+ return NULL;
+ }
+ iohandler -> ReportedSize = 0;
+ break;
+
+ default:
+ _cmsFree(ContextID, iohandler);
+ cmsSignalError(ContextID, cmsERROR_FILE, "Unknown access mode '%c'", *AccessMode);
+ return NULL;
+ }
+
+ iohandler ->ContextID = ContextID;
+ iohandler ->stream = (void*) fm;
+ iohandler ->UsedSpace = 0;
+
+ // Keep track of the original file
+ strncpy(iohandler -> PhysicalFile, FileName, sizeof(iohandler -> PhysicalFile)-1);
+ iohandler -> PhysicalFile[sizeof(iohandler -> PhysicalFile)-1] = 0;
+
+ iohandler ->Read = FileRead;
+ iohandler ->Seek = FileSeek;
+ iohandler ->Close = FileClose;
+ iohandler ->Tell = FileTell;
+ iohandler ->Write = FileWrite;
+
+ return iohandler;
+}
+
+// Create a iohandler for stream based files
+cmsIOHANDLER* CMSEXPORT cmsOpenIOhandlerFromStream(cmsContext ContextID, FILE* Stream)
+{
+ cmsIOHANDLER* iohandler = NULL;
+
+ iohandler = (cmsIOHANDLER*) _cmsMallocZero(ContextID, sizeof(cmsIOHANDLER));
+ if (iohandler == NULL) return NULL;
+
+ iohandler -> ContextID = ContextID;
+ iohandler -> stream = (void*) Stream;
+ iohandler -> UsedSpace = 0;
+ iohandler -> ReportedSize = (cmsUInt32Number) cmsfilelength(Stream);
+ iohandler -> PhysicalFile[0] = 0;
+
+ iohandler ->Read = FileRead;
+ iohandler ->Seek = FileSeek;
+ iohandler ->Close = FileClose;
+ iohandler ->Tell = FileTell;
+ iohandler ->Write = FileWrite;
+
+ return iohandler;
+}
+
+
+
+// Close an open IO handler
+cmsBool CMSEXPORT cmsCloseIOhandler(cmsIOHANDLER* io)
+{
+ return io -> Close(io);
+}
+
+// -------------------------------------------------------------------------------------------------------
+
+#ifdef _WIN32_WCE
+time_t wceex_time(time_t *timer);
+struct tm * wceex_gmtime(const time_t *timer);
+
+#define time wceex_time
+#define gmtime wceex_gmtime
+#endif
+
+// Creates an empty structure holding all required parameters
+cmsHPROFILE CMSEXPORT cmsCreateProfilePlaceholder(cmsContext ContextID)
+{
+ time_t now = time(NULL);
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) _cmsMallocZero(ContextID, sizeof(_cmsICCPROFILE));
+ if (Icc == NULL) return NULL;
+
+ Icc ->ContextID = ContextID;
+
+ // Set it to empty
+ Icc -> TagCount = 0;
+
+ // Set default version
+ Icc ->Version = 0x02100000;
+
+ // Set creation date/time
+ memmove(&Icc ->Created, gmtime(&now), sizeof(Icc ->Created));
+
+ // Create a mutex if the user provided proper plugin. NULL otherwise
+ Icc ->UsrMutex = _cmsCreateMutex(ContextID);
+
+ // Return the handle
+ return (cmsHPROFILE) Icc;
+}
+
+cmsContext CMSEXPORT cmsGetProfileContextID(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+
+ if (Icc == NULL) return NULL;
+ return Icc -> ContextID;
+}
+
+
+// Return the number of tags
+cmsInt32Number CMSEXPORT cmsGetTagCount(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ if (Icc == NULL) return -1;
+
+ return Icc->TagCount;
+}
+
+// Return the tag signature of a given tag number
+cmsTagSignature CMSEXPORT cmsGetTagSignature(cmsHPROFILE hProfile, cmsUInt32Number n)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+
+ if (n > Icc->TagCount) return (cmsTagSignature) 0; // Mark as not available
+ if (n >= MAX_TABLE_TAG) return (cmsTagSignature) 0; // As double check
+
+ return Icc ->TagNames[n];
+}
+
+
+static
+int SearchOneTag(_cmsICCPROFILE* Profile, cmsTagSignature sig)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < Profile -> TagCount; i++) {
+
+ if (sig == Profile -> TagNames[i])
+ return i;
+ }
+
+ return -1;
+}
+
+// Search for a specific tag in tag dictionary. Returns position or -1 if tag not found.
+// If followlinks is turned on, then the position of the linked tag is returned
+int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks)
+{
+ int n;
+ cmsTagSignature LinkedSig;
+
+ do {
+
+ // Search for given tag in ICC profile directory
+ n = SearchOneTag(Icc, sig);
+ if (n < 0)
+ return -1; // Not found
+
+ if (!lFollowLinks)
+ return n; // Found, don't follow links
+
+ // Is this a linked tag?
+ LinkedSig = Icc ->TagLinked[n];
+
+ // Yes, follow link
+ if (LinkedSig != (cmsTagSignature) 0) {
+ // fix bug mantis id#0055942
+ // assume that TRCTag and ColorantTag can't be linked.
+ // Xiaochuan Liu 2014-04-23
+ if ((sig == cmsSigRedTRCTag || sig == cmsSigGreenTRCTag || sig == cmsSigBlueTRCTag) &&
+ (LinkedSig == cmsSigRedColorantTag || LinkedSig == cmsSigGreenColorantTag || LinkedSig == cmsSigBlueColorantTag))
+ {
+ return n;
+ }
+ sig = LinkedSig;
+ }
+
+ } while (LinkedSig != (cmsTagSignature) 0);
+
+ return n;
+}
+
+// Deletes a tag entry
+
+static
+void _cmsDeleteTagByPos(_cmsICCPROFILE* Icc, int i)
+{
+ _cmsAssert(Icc != NULL);
+ _cmsAssert(i >= 0);
+
+
+ if (Icc -> TagPtrs[i] != NULL) {
+
+ // Free previous version
+ if (Icc ->TagSaveAsRaw[i]) {
+ _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
+ }
+ else {
+ cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
+
+ if (TypeHandler != NULL) {
+
+ cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameter
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+ Icc ->TagPtrs[i] = NULL;
+ }
+ }
+
+ }
+}
+
+
+// Creates a new tag entry
+static
+cmsBool _cmsNewTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, int* NewPos)
+{
+ int i;
+
+ // Search for the tag
+ i = _cmsSearchTag(Icc, sig, FALSE);
+ if (i >= 0) {
+
+ // Already exists? delete it
+ _cmsDeleteTagByPos(Icc, i);
+ *NewPos = i;
+ }
+ else {
+
+ // No, make a new one
+
+ if (Icc -> TagCount >= MAX_TABLE_TAG) {
+ cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", MAX_TABLE_TAG);
+ return FALSE;
+ }
+
+ *NewPos = Icc ->TagCount;
+ Icc -> TagCount++;
+ }
+
+ return TRUE;
+}
+
+
+// Check existance
+cmsBool CMSEXPORT cmsIsTag(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) (void*) hProfile;
+ return _cmsSearchTag(Icc, sig, FALSE) >= 0;
+}
+
+
+// Read profile header and validate it
+cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc)
+{
+ cmsTagEntry Tag;
+ cmsICCHeader Header;
+ cmsUInt32Number i, j;
+ cmsUInt32Number HeaderSize;
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsUInt32Number TagCount;
+
+
+ // Read the header
+ if (io -> Read(io, &Header, sizeof(cmsICCHeader), 1) != 1) {
+ return FALSE;
+ }
+
+ // Validate file as an ICC profile
+ if (_cmsAdjustEndianess32(Header.magic) != cmsMagicNumber) {
+ cmsSignalError(Icc ->ContextID, cmsERROR_BAD_SIGNATURE, "not an ICC profile, invalid signature");
+ return FALSE;
+ }
+
+ // Adjust endianess of the used parameters
+ Icc -> DeviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Header.deviceClass);
+ Icc -> ColorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.colorSpace);
+ Icc -> PCS = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Header.pcs);
+
+ Icc -> RenderingIntent = _cmsAdjustEndianess32(Header.renderingIntent);
+ Icc -> flags = _cmsAdjustEndianess32(Header.flags);
+ Icc -> manufacturer = _cmsAdjustEndianess32(Header.manufacturer);
+ Icc -> model = _cmsAdjustEndianess32(Header.model);
+ Icc -> creator = _cmsAdjustEndianess32(Header.creator);
+
+ _cmsAdjustEndianess64(&Icc -> attributes, &Header.attributes);
+ Icc -> Version = _cmsAdjustEndianess32(Header.version);
+
+ // Get size as reported in header
+ HeaderSize = _cmsAdjustEndianess32(Header.size);
+
+ // Make sure HeaderSize is lower than profile size
+ if (HeaderSize >= Icc ->IOhandler ->ReportedSize)
+ HeaderSize = Icc ->IOhandler ->ReportedSize;
+
+
+ // Get creation date/time
+ _cmsDecodeDateTimeNumber(&Header.date, &Icc ->Created);
+
+ // The profile ID are 32 raw bytes
+ memmove(Icc ->ProfileID.ID32, Header.profileID.ID32, 16);
+
+
+ // Read tag directory
+ if (!_cmsReadUInt32Number(io, &TagCount)) return FALSE;
+ if (TagCount > MAX_TABLE_TAG) {
+
+ cmsSignalError(Icc ->ContextID, cmsERROR_RANGE, "Too many tags (%d)", TagCount);
+ return FALSE;
+ }
+
+
+ // Read tag directory
+ Icc -> TagCount = 0;
+ for (i=0; i < TagCount; i++) {
+
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number *) &Tag.sig)) return FALSE;
+ if (!_cmsReadUInt32Number(io, &Tag.offset)) return FALSE;
+ if (!_cmsReadUInt32Number(io, &Tag.size)) return FALSE;
+
+ // Perform some sanity check. Offset + size should fall inside file.
+ if (Tag.offset + Tag.size > HeaderSize ||
+ Tag.offset + Tag.size < Tag.offset)
+ continue;
+
+ Icc -> TagNames[Icc ->TagCount] = Tag.sig;
+ Icc -> TagOffsets[Icc ->TagCount] = Tag.offset;
+ Icc -> TagSizes[Icc ->TagCount] = Tag.size;
+
+ // Search for links
+ for (j=0; j < Icc ->TagCount; j++) {
+
+ if ((Icc ->TagOffsets[j] == Tag.offset) &&
+ (Icc ->TagSizes[j] == Tag.size)) {
+
+ Icc ->TagLinked[Icc ->TagCount] = Icc ->TagNames[j];
+ }
+
+ }
+
+ Icc ->TagCount++;
+ }
+
+ return TRUE;
+}
+
+// Saves profile header
+cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace)
+{
+ cmsICCHeader Header;
+ cmsUInt32Number i;
+ cmsTagEntry Tag;
+ cmsInt32Number Count = 0;
+
+ Header.size = _cmsAdjustEndianess32(UsedSpace);
+ Header.cmmId = _cmsAdjustEndianess32(lcmsSignature);
+ Header.version = _cmsAdjustEndianess32(Icc ->Version);
+
+ Header.deviceClass = (cmsProfileClassSignature) _cmsAdjustEndianess32(Icc -> DeviceClass);
+ Header.colorSpace = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> ColorSpace);
+ Header.pcs = (cmsColorSpaceSignature) _cmsAdjustEndianess32(Icc -> PCS);
+
+ // NOTE: in v4 Timestamp must be in UTC rather than in local time
+ _cmsEncodeDateTimeNumber(&Header.date, &Icc ->Created);
+
+ Header.magic = _cmsAdjustEndianess32(cmsMagicNumber);
+
+#ifdef CMS_IS_WINDOWS_
+ Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMicrosoft);
+#else
+ Header.platform = (cmsPlatformSignature) _cmsAdjustEndianess32(cmsSigMacintosh);
+#endif
+
+ Header.flags = _cmsAdjustEndianess32(Icc -> flags);
+ Header.manufacturer = _cmsAdjustEndianess32(Icc -> manufacturer);
+ Header.model = _cmsAdjustEndianess32(Icc -> model);
+
+ _cmsAdjustEndianess64(&Header.attributes, &Icc -> attributes);
+
+ // Rendering intent in the header (for embedded profiles)
+ Header.renderingIntent = _cmsAdjustEndianess32(Icc -> RenderingIntent);
+
+ // Illuminant is always D50
+ Header.illuminant.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->X));
+ Header.illuminant.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Y));
+ Header.illuminant.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(cmsD50_XYZ()->Z));
+
+ // Created by LittleCMS (that's me!)
+ Header.creator = _cmsAdjustEndianess32(lcmsSignature);
+
+ memset(&Header.reserved, 0, sizeof(Header.reserved));
+
+ // Set profile ID. Endianess is always big endian
+ memmove(&Header.profileID, &Icc ->ProfileID, 16);
+
+ // Dump the header
+ if (!Icc -> IOhandler->Write(Icc->IOhandler, sizeof(cmsICCHeader), &Header)) return FALSE;
+
+ // Saves Tag directory
+
+ // Get true count
+ for (i=0; i < Icc -> TagCount; i++) {
+ if (Icc ->TagNames[i] != 0)
+ Count++;
+ }
+
+ // Store number of tags
+ if (!_cmsWriteUInt32Number(Icc ->IOhandler, Count)) return FALSE;
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc ->TagNames[i] == 0) continue; // It is just a placeholder
+
+ Tag.sig = (cmsTagSignature) _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagNames[i]);
+ Tag.offset = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagOffsets[i]);
+ Tag.size = _cmsAdjustEndianess32((cmsInt32Number) Icc -> TagSizes[i]);
+
+ if (!Icc ->IOhandler -> Write(Icc-> IOhandler, sizeof(cmsTagEntry), &Tag)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+// ----------------------------------------------------------------------- Set/Get several struct members
+
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderRenderingIntent(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc -> RenderingIntent;
+}
+
+void CMSEXPORT cmsSetHeaderRenderingIntent(cmsHPROFILE hProfile, cmsUInt32Number RenderingIntent)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> RenderingIntent = RenderingIntent;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderFlags(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return (cmsUInt32Number) Icc -> flags;
+}
+
+void CMSEXPORT cmsSetHeaderFlags(cmsHPROFILE hProfile, cmsUInt32Number Flags)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> flags = (cmsUInt32Number) Flags;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderManufacturer(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc ->manufacturer;
+}
+
+void CMSEXPORT cmsSetHeaderManufacturer(cmsHPROFILE hProfile, cmsUInt32Number manufacturer)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> manufacturer = manufacturer;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderCreator(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc ->creator;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetHeaderModel(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc ->model;
+}
+
+void CMSEXPORT cmsSetHeaderModel(cmsHPROFILE hProfile, cmsUInt32Number model)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> model = model;
+}
+
+void CMSEXPORT cmsGetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number* Flags)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ memmove(Flags, &Icc -> attributes, sizeof(cmsUInt64Number));
+}
+
+void CMSEXPORT cmsSetHeaderAttributes(cmsHPROFILE hProfile, cmsUInt64Number Flags)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ memmove(&Icc -> attributes, &Flags, sizeof(cmsUInt64Number));
+}
+
+void CMSEXPORT cmsGetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ memmove(ProfileID, Icc ->ProfileID.ID8, 16);
+}
+
+void CMSEXPORT cmsSetHeaderProfileID(cmsHPROFILE hProfile, cmsUInt8Number* ProfileID)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ memmove(&Icc -> ProfileID, ProfileID, 16);
+}
+
+cmsBool CMSEXPORT cmsGetHeaderCreationDateTime(cmsHPROFILE hProfile, struct tm *Dest)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ memmove(Dest, &Icc ->Created, sizeof(struct tm));
+ return TRUE;
+}
+
+cmsColorSpaceSignature CMSEXPORT cmsGetPCS(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc -> PCS;
+}
+
+void CMSEXPORT cmsSetPCS(cmsHPROFILE hProfile, cmsColorSpaceSignature pcs)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> PCS = pcs;
+}
+
+cmsColorSpaceSignature CMSEXPORT cmsGetColorSpace(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc -> ColorSpace;
+}
+
+void CMSEXPORT cmsSetColorSpace(cmsHPROFILE hProfile, cmsColorSpaceSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> ColorSpace = sig;
+}
+
+cmsProfileClassSignature CMSEXPORT cmsGetDeviceClass(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc -> DeviceClass;
+}
+
+void CMSEXPORT cmsSetDeviceClass(cmsHPROFILE hProfile, cmsProfileClassSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> DeviceClass = sig;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetEncodedICCversion(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ return Icc -> Version;
+}
+
+void CMSEXPORT cmsSetEncodedICCversion(cmsHPROFILE hProfile, cmsUInt32Number Version)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ Icc -> Version = Version;
+}
+
+// Get an hexadecimal number with same digits as v
+static
+cmsUInt32Number BaseToBase(cmsUInt32Number in, int BaseIn, int BaseOut)
+{
+ char Buff[100];
+ int i, len;
+ cmsUInt32Number out;
+
+ for (len=0; in > 0 && len < 100; len++) {
+
+ Buff[len] = (char) (in % BaseIn);
+ in /= BaseIn;
+ }
+
+ for (i=len-1, out=0; i >= 0; --i) {
+ out = out * BaseOut + Buff[i];
+ }
+
+ return out;
+}
+
+void CMSEXPORT cmsSetProfileVersion(cmsHPROFILE hProfile, cmsFloat64Number Version)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+
+ // 4.2 -> 0x4200000
+
+ Icc -> Version = BaseToBase((cmsUInt32Number) floor(Version * 100.0 + 0.5), 10, 16) << 16;
+}
+
+cmsFloat64Number CMSEXPORT cmsGetProfileVersion(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsUInt32Number n = Icc -> Version >> 16;
+
+ return BaseToBase(n, 16, 10) / 100.0;
+}
+// --------------------------------------------------------------------------------------------------------------
+
+
+// Create profile from IOhandler
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandlerTHR(cmsContext ContextID, cmsIOHANDLER* io)
+{
+ _cmsICCPROFILE* NewIcc;
+ cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+ if (hEmpty == NULL) return NULL;
+
+ NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+ NewIcc ->IOhandler = io;
+ if (!_cmsReadHeader(NewIcc)) goto Error;
+ return hEmpty;
+
+Error:
+ cmsCloseProfile(hEmpty);
+ return NULL;
+}
+
+// Create profile from IOhandler
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromIOhandler2THR(cmsContext ContextID, cmsIOHANDLER* io, cmsBool write)
+{
+ _cmsICCPROFILE* NewIcc;
+ cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+ if (hEmpty == NULL) return NULL;
+
+ NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+ NewIcc ->IOhandler = io;
+ if (write) {
+
+ NewIcc -> IsWrite = TRUE;
+ return hEmpty;
+ }
+
+ if (!_cmsReadHeader(NewIcc)) goto Error;
+ return hEmpty;
+
+Error:
+ cmsCloseProfile(hEmpty);
+ return NULL;
+}
+
+
+// Create profile from disk file
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromFileTHR(cmsContext ContextID, const char *lpFileName, const char *sAccess)
+{
+ _cmsICCPROFILE* NewIcc;
+ cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+ if (hEmpty == NULL) return NULL;
+
+ NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+ NewIcc ->IOhandler = cmsOpenIOhandlerFromFile(ContextID, lpFileName, sAccess);
+ if (NewIcc ->IOhandler == NULL) goto Error;
+
+ if (*sAccess == 'W' || *sAccess == 'w') {
+
+ NewIcc -> IsWrite = TRUE;
+
+ return hEmpty;
+ }
+
+ if (!_cmsReadHeader(NewIcc)) goto Error;
+ return hEmpty;
+
+Error:
+ cmsCloseProfile(hEmpty);
+ return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess)
+{
+ return cmsOpenProfileFromFileTHR(NULL, ICCProfile, sAccess);
+}
+
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromStreamTHR(cmsContext ContextID, FILE* ICCProfile, const char *sAccess)
+{
+ _cmsICCPROFILE* NewIcc;
+ cmsHPROFILE hEmpty = cmsCreateProfilePlaceholder(ContextID);
+
+ if (hEmpty == NULL) return NULL;
+
+ NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+ NewIcc ->IOhandler = cmsOpenIOhandlerFromStream(ContextID, ICCProfile);
+ if (NewIcc ->IOhandler == NULL) goto Error;
+
+ if (*sAccess == 'w') {
+
+ NewIcc -> IsWrite = TRUE;
+ return hEmpty;
+ }
+
+ if (!_cmsReadHeader(NewIcc)) goto Error;
+ return hEmpty;
+
+Error:
+ cmsCloseProfile(hEmpty);
+ return NULL;
+
+}
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromStream(FILE* ICCProfile, const char *sAccess)
+{
+ return cmsOpenProfileFromStreamTHR(NULL, ICCProfile, sAccess);
+}
+
+
+// Open from memory block
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromMemTHR(cmsContext ContextID, const void* MemPtr, cmsUInt32Number dwSize)
+{
+ _cmsICCPROFILE* NewIcc;
+ cmsHPROFILE hEmpty;
+
+ hEmpty = cmsCreateProfilePlaceholder(ContextID);
+ if (hEmpty == NULL) return NULL;
+
+ NewIcc = (_cmsICCPROFILE*) hEmpty;
+
+ // Ok, in this case const void* is casted to void* just because open IO handler
+ // shares read and writting modes. Don't abuse this feature!
+ NewIcc ->IOhandler = cmsOpenIOhandlerFromMem(ContextID, (void*) MemPtr, dwSize, "r");
+ if (NewIcc ->IOhandler == NULL) goto Error;
+
+ if (!_cmsReadHeader(NewIcc)) goto Error;
+
+ return hEmpty;
+
+Error:
+ cmsCloseProfile(hEmpty);
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsOpenProfileFromMem(const void* MemPtr, cmsUInt32Number dwSize)
+{
+ return cmsOpenProfileFromMemTHR(NULL, MemPtr, dwSize);
+}
+
+
+
+// Dump tag contents. If the profile is being modified, untouched tags are copied from FileOrig
+static
+cmsBool SaveTags(_cmsICCPROFILE* Icc, _cmsICCPROFILE* FileOrig)
+{
+ cmsUInt8Number* Data;
+ cmsUInt32Number i;
+ cmsUInt32Number Begin;
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature TypeBase;
+ cmsTagTypeSignature Type;
+ cmsTagTypeHandler* TypeHandler;
+ cmsFloat64Number Version = cmsGetProfileVersion((cmsHPROFILE) Icc);
+ cmsTagTypeHandler LocalTypeHandler;
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc ->TagNames[i] == 0) continue;
+
+ // Linked tags are not written
+ if (Icc ->TagLinked[i] != (cmsTagSignature) 0) continue;
+
+ Icc -> TagOffsets[i] = Begin = io ->UsedSpace;
+
+ Data = (cmsUInt8Number*) Icc -> TagPtrs[i];
+
+ if (!Data) {
+
+ // Reach here if we are copying a tag from a disk-based ICC profile which has not been modified by user.
+ // In this case a blind copy of the block data is performed
+ if (FileOrig != NULL && Icc -> TagOffsets[i]) {
+
+ cmsUInt32Number TagSize = FileOrig -> TagSizes[i];
+ cmsUInt32Number TagOffset = FileOrig -> TagOffsets[i];
+ void* Mem;
+
+ if (!FileOrig ->IOhandler->Seek(FileOrig ->IOhandler, TagOffset)) return FALSE;
+
+ Mem = _cmsMalloc(Icc ->ContextID, TagSize);
+ if (Mem == NULL) return FALSE;
+
+ if (FileOrig ->IOhandler->Read(FileOrig->IOhandler, Mem, TagSize, 1) != 1) return FALSE;
+ if (!io ->Write(io, TagSize, Mem)) return FALSE;
+ _cmsFree(Icc ->ContextID, Mem);
+
+ Icc -> TagSizes[i] = (io ->UsedSpace - Begin);
+
+
+ // Align to 32 bit boundary.
+ if (! _cmsWriteAlignment(io))
+ return FALSE;
+ }
+
+ continue;
+ }
+
+
+ // Should this tag be saved as RAW? If so, tagsizes should be specified in advance (no further cooking is done)
+ if (Icc ->TagSaveAsRaw[i]) {
+
+ if (io -> Write(io, Icc ->TagSizes[i], Data) != 1) return FALSE;
+ }
+ else {
+
+ // Search for support on this tag
+ TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, Icc -> TagNames[i]);
+ if (TagDescriptor == NULL) continue; // Unsupported, ignore it
+
+ if (TagDescriptor ->DecideType != NULL) {
+
+ Type = TagDescriptor ->DecideType(Version, Data);
+ }
+ else {
+
+ Type = TagDescriptor ->SupportedTypes[0];
+ }
+
+ TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type);
+
+ if (TypeHandler == NULL) {
+ cmsSignalError(Icc ->ContextID, cmsERROR_INTERNAL, "(Internal) no handler for tag %x", Icc -> TagNames[i]);
+ continue;
+ }
+
+ TypeBase = TypeHandler ->Signature;
+ if (!_cmsWriteTypeBase(io, TypeBase))
+ return FALSE;
+
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, io, Data, TagDescriptor ->ElemCount)) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) TypeBase);
+ cmsSignalError(Icc ->ContextID, cmsERROR_WRITE, "Couldn't write type '%s'", String);
+ return FALSE;
+ }
+ }
+
+
+ Icc -> TagSizes[i] = (io ->UsedSpace - Begin);
+
+ // Align to 32 bit boundary.
+ if (! _cmsWriteAlignment(io))
+ return FALSE;
+ }
+
+
+ return TRUE;
+}
+
+
+// Fill the offset and size fields for all linked tags
+static
+cmsBool SetLinks( _cmsICCPROFILE* Icc)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ cmsTagSignature lnk = Icc ->TagLinked[i];
+ if (lnk != (cmsTagSignature) 0) {
+
+ int j = _cmsSearchTag(Icc, lnk, FALSE);
+ if (j >= 0) {
+
+ Icc ->TagOffsets[i] = Icc ->TagOffsets[j];
+ Icc ->TagSizes[i] = Icc ->TagSizes[j];
+ }
+
+ }
+ }
+
+ return TRUE;
+}
+
+// Low-level save to IOHANDLER. It returns the number of bytes used to
+// store the profile, or zero on error. io may be NULL and in this case
+// no data is written--only sizes are calculated
+cmsUInt32Number CMSEXPORT cmsSaveProfileToIOhandler(cmsHPROFILE hProfile, cmsIOHANDLER* io)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ _cmsICCPROFILE Keep;
+ cmsIOHANDLER* PrevIO = NULL;
+ cmsUInt32Number UsedSpace;
+ cmsContext ContextID;
+
+ _cmsAssert(hProfile != NULL);
+
+ memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));
+
+ ContextID = cmsGetProfileContextID(hProfile);
+ PrevIO = Icc ->IOhandler = cmsOpenIOhandlerFromNULL(ContextID);
+ if (PrevIO == NULL) return 0;
+
+ // Pass #1 does compute offsets
+
+ if (!_cmsWriteHeader(Icc, 0)) goto Error;
+ if (!SaveTags(Icc, &Keep)) goto Error;
+
+ UsedSpace = PrevIO ->UsedSpace;
+
+ // Pass #2 does save to iohandler
+
+ if (io != NULL) {
+
+ Icc ->IOhandler = io;
+ if (!SetLinks(Icc)) goto Error;
+ if (!_cmsWriteHeader(Icc, UsedSpace)) goto Error;
+ if (!SaveTags(Icc, &Keep)) goto Error;
+ }
+
+ memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+ if (!cmsCloseIOhandler(PrevIO)) return 0;
+
+ return UsedSpace;
+
+
+Error:
+ cmsCloseIOhandler(PrevIO);
+ memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+ return 0;
+}
+
+#ifdef _WIN32_WCE
+int wceex_unlink(const char *filename);
+#ifndef remove
+# define remove wceex_unlink
+#endif
+#endif
+
+// Low-level save to disk.
+cmsBool CMSEXPORT cmsSaveProfileToFile(cmsHPROFILE hProfile, const char* FileName)
+{
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsIOHANDLER* io = cmsOpenIOhandlerFromFile(ContextID, FileName, "w");
+ cmsBool rc;
+
+ if (io == NULL) return FALSE;
+
+ rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+ rc &= cmsCloseIOhandler(io);
+
+ if (rc == FALSE) { // remove() is C99 per 7.19.4.1
+ remove(FileName); // We have to IGNORE return value in this case
+ }
+ return rc;
+}
+
+// Same as anterior, but for streams
+cmsBool CMSEXPORT cmsSaveProfileToStream(cmsHPROFILE hProfile, FILE* Stream)
+{
+ cmsBool rc;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsIOHANDLER* io = cmsOpenIOhandlerFromStream(ContextID, Stream);
+
+ if (io == NULL) return FALSE;
+
+ rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+ rc &= cmsCloseIOhandler(io);
+
+ return rc;
+}
+
+
+// Same as anterior, but for memory blocks. In this case, a NULL as MemPtr means calculate needed space only
+cmsBool CMSEXPORT cmsSaveProfileToMem(cmsHPROFILE hProfile, void *MemPtr, cmsUInt32Number* BytesNeeded)
+{
+ cmsBool rc;
+ cmsIOHANDLER* io;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ _cmsAssert(BytesNeeded != NULL);
+
+ // Should we just calculate the needed space?
+ if (MemPtr == NULL) {
+
+ *BytesNeeded = cmsSaveProfileToIOhandler(hProfile, NULL);
+ return (*BytesNeeded == 0) ? FALSE : TRUE;
+ }
+
+ // That is a real write operation
+ io = cmsOpenIOhandlerFromMem(ContextID, MemPtr, *BytesNeeded, "w");
+ if (io == NULL) return FALSE;
+
+ rc = (cmsSaveProfileToIOhandler(hProfile, io) != 0);
+ rc &= cmsCloseIOhandler(io);
+
+ return rc;
+}
+
+
+
+// Closes a profile freeing any involved resources
+cmsBool CMSEXPORT cmsCloseProfile(cmsHPROFILE hProfile)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsBool rc = TRUE;
+ cmsUInt32Number i;
+
+ if (!Icc) return FALSE;
+
+ // Was open in write mode?
+ if (Icc ->IsWrite) {
+
+ Icc ->IsWrite = FALSE; // Assure no further writting
+ rc &= cmsSaveProfileToFile(hProfile, Icc ->IOhandler->PhysicalFile);
+ }
+
+ for (i=0; i < Icc -> TagCount; i++) {
+
+ if (Icc -> TagPtrs[i]) {
+
+ cmsTagTypeHandler* TypeHandler = Icc ->TagTypeHandlers[i];
+
+ if (TypeHandler != NULL) {
+ cmsTagTypeHandler LocalTypeHandler = *TypeHandler;
+
+ LocalTypeHandler.ContextID = Icc ->ContextID; // As an additional parameters
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ LocalTypeHandler.FreePtr(&LocalTypeHandler, Icc -> TagPtrs[i]);
+ }
+ else
+ _cmsFree(Icc ->ContextID, Icc ->TagPtrs[i]);
+ }
+ }
+
+ if (Icc ->IOhandler != NULL) {
+ rc &= cmsCloseIOhandler(Icc->IOhandler);
+ }
+
+ _cmsDestroyMutex(Icc->ContextID, Icc->UsrMutex);
+
+ _cmsFree(Icc ->ContextID, Icc); // Free placeholder memory
+
+ return rc;
+}
+
+
+// -------------------------------------------------------------------------------------------------------------------
+
+
+// Returns TRUE if a given tag is supported by a plug-in
+static
+cmsBool IsTypeSupported(cmsTagDescriptor* TagDescriptor, cmsTagTypeSignature Type)
+{
+ cmsUInt32Number i, nMaxTypes;
+
+ nMaxTypes = TagDescriptor->nSupportedTypes;
+ if (nMaxTypes >= MAX_TYPES_IN_LCMS_PLUGIN)
+ nMaxTypes = MAX_TYPES_IN_LCMS_PLUGIN;
+
+ for (i=0; i < nMaxTypes; i++) {
+ if (Type == TagDescriptor ->SupportedTypes[i]) return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+// That's the main read function
+void* CMSEXPORT cmsReadTag(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsIOHANDLER* io = Icc ->IOhandler;
+ cmsTagTypeHandler* TypeHandler;
+ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor;
+ cmsTagTypeSignature BaseType;
+ cmsUInt32Number Offset, TagSize;
+ cmsUInt32Number ElemCount;
+ int n;
+
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return NULL;
+
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0) goto Error; // Not found, return NULL
+
+
+ // If the element is already in memory, return the pointer
+ if (Icc -> TagPtrs[n]) {
+
+ if (Icc ->TagSaveAsRaw[n]) goto Error; // We don't support read raw tags as cooked
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return Icc -> TagPtrs[n];
+ }
+
+ // We need to read it. Get the offset and size to the file
+ Offset = Icc -> TagOffsets[n];
+ TagSize = Icc -> TagSizes[n];
+
+ // Seek to its location
+ if (!io -> Seek(io, Offset))
+ goto Error;
+
+ // Search for support on this tag
+ TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+ if (TagDescriptor == NULL) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, sig);
+
+ // An unknown element was found.
+ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown tag type '%s' found.", String);
+ goto Error; // Unsupported.
+ }
+
+ // if supported, get type and check if in list
+ BaseType = _cmsReadTypeBase(io);
+ if (BaseType == 0) goto Error;
+
+ if (!IsTypeSupported(TagDescriptor, BaseType)) goto Error;
+
+ TagSize -= 8; // Alredy read by the type base logic
+
+ // Get type handler
+ TypeHandler = _cmsGetTagTypeHandler(Icc ->ContextID, BaseType);
+ if (TypeHandler == NULL) goto Error;
+ LocalTypeHandler = *TypeHandler;
+
+
+ // Read the tag
+ Icc -> TagTypeHandlers[n] = TypeHandler;
+
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ Icc -> TagPtrs[n] = LocalTypeHandler.ReadPtr(&LocalTypeHandler, io, &ElemCount, TagSize);
+
+ // The tag type is supported, but something wrong happend and we cannot read the tag.
+ // let know the user about this (although it is just a warning)
+ if (Icc -> TagPtrs[n] == NULL) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, sig);
+ cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Corrupted tag '%s'", String);
+ goto Error;
+ }
+
+ // This is a weird error that may be a symptom of something more serious, the number of
+ // stored item is actually less than the number of required elements.
+ if (ElemCount < TagDescriptor ->ElemCount) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, sig);
+ cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "'%s' Inconsistent number of items: expected %d, got %d",
+ String, TagDescriptor ->ElemCount, ElemCount);
+ }
+
+
+ // Return the data
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return Icc -> TagPtrs[n];
+
+
+ // Return error and unlock tha data
+Error:
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return NULL;
+}
+
+
+// Get true type of data
+cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsTagTypeHandler* TypeHandler;
+ int n;
+
+ // Search for given tag in ICC profile directory
+ n = _cmsSearchTag(Icc, sig, TRUE);
+ if (n < 0) return (cmsTagTypeSignature) 0; // Not found, return NULL
+
+ // Get the handler. The true type is there
+ TypeHandler = Icc -> TagTypeHandlers[n];
+ return TypeHandler ->Signature;
+}
+
+
+// Write a single tag. This just keeps track of the tak into a list of "to be written". If the tag is already
+// in that list, the previous version is deleted.
+cmsBool CMSEXPORT cmsWriteTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ cmsTagTypeHandler* TypeHandler = NULL;
+ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsTagTypeSignature Type;
+ int i;
+ cmsFloat64Number Version;
+ char TypeString[5], SigString[5];
+
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;
+
+ // To delete tags.
+ if (data == NULL) {
+
+ // Delete the tag
+ i = _cmsSearchTag(Icc, sig, FALSE);
+ if (i >= 0) {
+
+ // Use zero as a mark of deleted
+ _cmsDeleteTagByPos(Icc, i);
+ Icc ->TagNames[i] = (cmsTagSignature) 0;
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TRUE;
+ }
+ // Didn't find the tag
+ goto Error;
+ }
+
+ if (!_cmsNewTag(Icc, sig, &i)) goto Error;
+
+ // This is not raw
+ Icc ->TagSaveAsRaw[i] = FALSE;
+
+ // This is not a link
+ Icc ->TagLinked[i] = (cmsTagSignature) 0;
+
+ // Get information about the TAG.
+ TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+ if (TagDescriptor == NULL){
+ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag '%x'", sig);
+ goto Error;
+ }
+
+
+ // Now we need to know which type to use. It depends on the version.
+ Version = cmsGetProfileVersion(hProfile);
+
+ if (TagDescriptor ->DecideType != NULL) {
+
+ // Let the tag descriptor to decide the type base on depending on
+ // the data. This is useful for example on parametric curves, where
+ // curves specified by a table cannot be saved as parametric and needs
+ // to be casted to single v2-curves, even on v4 profiles.
+
+ Type = TagDescriptor ->DecideType(Version, data);
+ }
+ else {
+
+ Type = TagDescriptor ->SupportedTypes[0];
+ }
+
+ // Does the tag support this type?
+ if (!IsTypeSupported(TagDescriptor, Type)) {
+
+ _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+ _cmsTagSignature2String(SigString, sig);
+
+ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString);
+ goto Error;
+ }
+
+ // Does we have a handler for this type?
+ TypeHandler = _cmsGetTagTypeHandler(Icc->ContextID, Type);
+ if (TypeHandler == NULL) {
+
+ _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+ _cmsTagSignature2String(SigString, sig);
+
+ cmsSignalError(Icc ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported type '%s' for tag '%s'", TypeString, SigString);
+ goto Error; // Should never happen
+ }
+
+
+ // Fill fields on icc structure
+ Icc ->TagTypeHandlers[i] = TypeHandler;
+ Icc ->TagNames[i] = sig;
+ Icc ->TagSizes[i] = 0;
+ Icc ->TagOffsets[i] = 0;
+
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+ Icc ->TagPtrs[i] = LocalTypeHandler.DupPtr(&LocalTypeHandler, data, TagDescriptor ->ElemCount);
+
+ if (Icc ->TagPtrs[i] == NULL) {
+
+ _cmsTagSignature2String(TypeString, (cmsTagSignature) Type);
+ _cmsTagSignature2String(SigString, sig);
+ cmsSignalError(Icc ->ContextID, cmsERROR_CORRUPTION_DETECTED, "Malformed struct in type '%s' for tag '%s'", TypeString, SigString);
+
+ goto Error;
+ }
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TRUE;
+
+Error:
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return FALSE;
+
+}
+
+// Read and write raw data. The only way those function would work and keep consistence with normal read and write
+// is to do an additional step of serialization. That means, readRaw would issue a normal read and then convert the obtained
+// data to raw bytes by using the "write" serialization logic. And vice-versa. I know this may end in situations where
+// raw data written does not exactly correspond with the raw data proposed to cmsWriteRaw data, but this approach allows
+// to write a tag as raw data and the read it as handled.
+
+cmsInt32Number CMSEXPORT cmsReadRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, void* data, cmsUInt32Number BufferSize)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ void *Object;
+ int i;
+ cmsIOHANDLER* MemIO;
+ cmsTagTypeHandler* TypeHandler = NULL;
+ cmsTagTypeHandler LocalTypeHandler;
+ cmsTagDescriptor* TagDescriptor = NULL;
+ cmsUInt32Number rc;
+ cmsUInt32Number Offset, TagSize;
+
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+ // Search for given tag in ICC profile directory
+ i = _cmsSearchTag(Icc, sig, TRUE);
+ if (i < 0) goto Error; // Not found,
+
+ // It is already read?
+ if (Icc -> TagPtrs[i] == NULL) {
+
+ // No yet, get original position
+ Offset = Icc ->TagOffsets[i];
+ TagSize = Icc ->TagSizes[i];
+
+ // read the data directly, don't keep copy
+ if (data != NULL) {
+
+ if (BufferSize < TagSize)
+ TagSize = BufferSize;
+
+ if (!Icc ->IOhandler ->Seek(Icc ->IOhandler, Offset)) goto Error;
+ if (!Icc ->IOhandler ->Read(Icc ->IOhandler, data, 1, TagSize)) goto Error;
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TagSize;
+ }
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return Icc ->TagSizes[i];
+ }
+
+ // The data has been already read, or written. But wait!, maybe the user choosed to save as
+ // raw data. In this case, return the raw data directly
+ if (Icc ->TagSaveAsRaw[i]) {
+
+ if (data != NULL) {
+
+ TagSize = Icc ->TagSizes[i];
+ if (BufferSize < TagSize)
+ TagSize = BufferSize;
+
+ memmove(data, Icc ->TagPtrs[i], TagSize);
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TagSize;
+ }
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return Icc ->TagSizes[i];
+ }
+
+ // Already readed, or previously set by cmsWriteTag(). We need to serialize that
+ // data to raw in order to maintain consistency.
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ Object = cmsReadTag(hProfile, sig);
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+ if (Object == NULL) goto Error;
+
+ // Now we need to serialize to a memory block: just use a memory iohandler
+
+ if (data == NULL) {
+ MemIO = cmsOpenIOhandlerFromNULL(cmsGetProfileContextID(hProfile));
+ } else{
+ MemIO = cmsOpenIOhandlerFromMem(cmsGetProfileContextID(hProfile), data, BufferSize, "w");
+ }
+ if (MemIO == NULL) goto Error;
+
+ // Obtain type handling for the tag
+ TypeHandler = Icc ->TagTypeHandlers[i];
+ TagDescriptor = _cmsGetTagDescriptor(Icc-> ContextID, sig);
+ if (TagDescriptor == NULL) {
+ cmsCloseIOhandler(MemIO);
+ goto Error;
+ }
+
+ if (TypeHandler == NULL) goto Error;
+
+ // Serialize
+ LocalTypeHandler = *TypeHandler;
+ LocalTypeHandler.ContextID = Icc ->ContextID;
+ LocalTypeHandler.ICCVersion = Icc ->Version;
+
+ if (!_cmsWriteTypeBase(MemIO, TypeHandler ->Signature)) {
+ cmsCloseIOhandler(MemIO);
+ goto Error;
+ }
+
+ if (!LocalTypeHandler.WritePtr(&LocalTypeHandler, MemIO, Object, TagDescriptor ->ElemCount)) {
+ cmsCloseIOhandler(MemIO);
+ goto Error;
+ }
+
+ // Get Size and close
+ rc = MemIO ->Tell(MemIO);
+ cmsCloseIOhandler(MemIO); // Ignore return code this time
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return rc;
+
+Error:
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return 0;
+}
+
+// Similar to the anterior. This function allows to write directly to the ICC profile any data, without
+// checking anything. As a rule, mixing Raw with cooked doesn't work, so writting a tag as raw and then reading
+// it as cooked without serializing does result into an error. If that is wha you want, you will need to dump
+// the profile to memry or disk and then reopen it.
+cmsBool CMSEXPORT cmsWriteRawTag(cmsHPROFILE hProfile, cmsTagSignature sig, const void* data, cmsUInt32Number Size)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ int i;
+
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return 0;
+
+ if (!_cmsNewTag(Icc, sig, &i)) {
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return FALSE;
+ }
+
+ // Mark the tag as being written as RAW
+ Icc ->TagSaveAsRaw[i] = TRUE;
+ Icc ->TagNames[i] = sig;
+ Icc ->TagLinked[i] = (cmsTagSignature) 0;
+
+ // Keep a copy of the block
+ Icc ->TagPtrs[i] = _cmsDupMem(Icc ->ContextID, data, Size);
+ Icc ->TagSizes[i] = Size;
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TRUE;
+}
+
+// Using this function you can collapse several tag entries to the same block in the profile
+cmsBool CMSEXPORT cmsLinkTag(cmsHPROFILE hProfile, cmsTagSignature sig, cmsTagSignature dest)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ int i;
+
+ if (!_cmsLockMutex(Icc->ContextID, Icc ->UsrMutex)) return FALSE;
+
+ if (!_cmsNewTag(Icc, sig, &i)) {
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return FALSE;
+ }
+
+ // Keep necessary information
+ Icc ->TagSaveAsRaw[i] = FALSE;
+ Icc ->TagNames[i] = sig;
+ Icc ->TagLinked[i] = dest;
+
+ Icc ->TagPtrs[i] = NULL;
+ Icc ->TagSizes[i] = 0;
+ Icc ->TagOffsets[i] = 0;
+
+ _cmsUnlockMutex(Icc->ContextID, Icc ->UsrMutex);
+ return TRUE;
+}
+
+
+// Returns the tag linked to sig, in the case two tags are sharing same resource
+cmsTagSignature CMSEXPORT cmsTagLinkedTo(cmsHPROFILE hProfile, cmsTagSignature sig)
+{
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ int i;
+
+ // Search for given tag in ICC profile directory
+ i = _cmsSearchTag(Icc, sig, FALSE);
+ if (i < 0) return (cmsTagSignature) 0; // Not found, return 0
+
+ return Icc -> TagLinked[i];
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c
new file mode 100644
index 0000000000..778aa2b4fc
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsio1.c
@@ -0,0 +1,1020 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Read tags using low-level functions, provides necessary glue code to adapt versions, etc.
+
+// LUT tags
+static const cmsTagSignature Device2PCS16[] = {cmsSigAToB0Tag, // Perceptual
+ cmsSigAToB1Tag, // Relative colorimetric
+ cmsSigAToB2Tag, // Saturation
+ cmsSigAToB1Tag }; // Absolute colorimetric
+
+static const cmsTagSignature Device2PCSFloat[] = {cmsSigDToB0Tag, // Perceptual
+ cmsSigDToB1Tag, // Relative colorimetric
+ cmsSigDToB2Tag, // Saturation
+ cmsSigDToB3Tag }; // Absolute colorimetric
+
+static const cmsTagSignature PCS2Device16[] = {cmsSigBToA0Tag, // Perceptual
+ cmsSigBToA1Tag, // Relative colorimetric
+ cmsSigBToA2Tag, // Saturation
+ cmsSigBToA1Tag }; // Absolute colorimetric
+
+static const cmsTagSignature PCS2DeviceFloat[] = {cmsSigBToD0Tag, // Perceptual
+ cmsSigBToD1Tag, // Relative colorimetric
+ cmsSigBToD2Tag, // Saturation
+ cmsSigBToD3Tag }; // Absolute colorimetric
+
+
+// Factors to convert from 1.15 fixed point to 0..1.0 range and vice-versa
+#define InpAdj (1.0/MAX_ENCODEABLE_XYZ) // (65536.0/(65535.0*2.0))
+#define OutpAdj (MAX_ENCODEABLE_XYZ) // ((2.0*65535.0)/65536.0)
+
+// Several resources for gray conversions.
+static const cmsFloat64Number GrayInputMatrix[] = { (InpAdj*cmsD50X), (InpAdj*cmsD50Y), (InpAdj*cmsD50Z) };
+static const cmsFloat64Number OneToThreeInputMatrix[] = { 1, 1, 1 };
+static const cmsFloat64Number PickYMatrix[] = { 0, (OutpAdj*cmsD50Y), 0 };
+static const cmsFloat64Number PickLstarMatrix[] = { 1, 0, 0 };
+
+// Get a media white point fixing some issues found in certain old profiles
+cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile)
+{
+ cmsCIEXYZ* Tag;
+
+ _cmsAssert(Dest != NULL);
+
+ Tag = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);
+
+ // If no wp, take D50
+ if (Tag == NULL) {
+ *Dest = *cmsD50_XYZ();
+ return TRUE;
+ }
+
+ // V2 display profiles should give D50
+ if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {
+
+ if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {
+ *Dest = *cmsD50_XYZ();
+ return TRUE;
+ }
+ }
+
+ // All seems ok
+ *Dest = *Tag;
+ return TRUE;
+}
+
+
+// Chromatic adaptation matrix. Fix some issues as well
+cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile)
+{
+ cmsMAT3* Tag;
+
+ _cmsAssert(Dest != NULL);
+
+ Tag = (cmsMAT3*) cmsReadTag(hProfile, cmsSigChromaticAdaptationTag);
+
+ if (Tag != NULL) {
+ *Dest = *Tag;
+ return TRUE;
+ }
+
+ // No CHAD available, default it to identity
+ _cmsMAT3identity(Dest);
+
+ // V2 display profiles should give D50
+ if (cmsGetEncodedICCversion(hProfile) < 0x4000000) {
+
+ if (cmsGetDeviceClass(hProfile) == cmsSigDisplayClass) {
+
+ cmsCIEXYZ* White = (cmsCIEXYZ*) cmsReadTag(hProfile, cmsSigMediaWhitePointTag);
+
+ if (White == NULL) {
+
+ _cmsMAT3identity(Dest);
+ return TRUE;
+ }
+
+ return _cmsAdaptationMatrix(Dest, NULL, White, cmsD50_XYZ());
+ }
+ }
+
+ return TRUE;
+}
+
+
+// Auxiliar, read colorants as a MAT3 structure. Used by any function that needs a matrix-shaper
+static
+cmsBool ReadICCMatrixRGB2XYZ(cmsMAT3* r, cmsHPROFILE hProfile)
+{
+ cmsCIEXYZ *PtrRed, *PtrGreen, *PtrBlue;
+
+ _cmsAssert(r != NULL);
+
+ PtrRed = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigRedColorantTag);
+ PtrGreen = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigGreenColorantTag);
+ PtrBlue = (cmsCIEXYZ *) cmsReadTag(hProfile, cmsSigBlueColorantTag);
+
+ if (PtrRed == NULL || PtrGreen == NULL || PtrBlue == NULL)
+ return FALSE;
+
+ _cmsVEC3init(&r -> v[0], PtrRed -> X, PtrGreen -> X, PtrBlue -> X);
+ _cmsVEC3init(&r -> v[1], PtrRed -> Y, PtrGreen -> Y, PtrBlue -> Y);
+ _cmsVEC3init(&r -> v[2], PtrRed -> Z, PtrGreen -> Z, PtrBlue -> Z);
+
+ return TRUE;
+}
+
+
+// Gray input pipeline
+static
+cmsPipeline* BuildGrayInputMatrixPipeline(cmsHPROFILE hProfile)
+{
+ cmsToneCurve *GrayTRC;
+ cmsPipeline* Lut;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);
+ if (GrayTRC == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 1, 3);
+ if (Lut == NULL)
+ goto Error;
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+ // In this case we implement the profile as an identity matrix plus 3 tone curves
+ cmsUInt16Number Zero[2] = { 0x8080, 0x8080 };
+ cmsToneCurve* EmptyTab;
+ cmsToneCurve* LabCurves[3];
+
+ EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
+
+ if (EmptyTab == NULL)
+ goto Error;
+
+ LabCurves[0] = GrayTRC;
+ LabCurves[1] = EmptyTab;
+ LabCurves[2] = EmptyTab;
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, OneToThreeInputMatrix, NULL)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, LabCurves))) {
+ cmsFreeToneCurve(EmptyTab);
+ goto Error;
+ }
+
+ cmsFreeToneCurve(EmptyTab);
+
+ }
+ else {
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &GrayTRC)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 1, GrayInputMatrix, NULL)))
+ goto Error;
+ }
+
+ return Lut;
+
+Error:
+ // memory pointed by GrayTRC is not a new malloc memory, so don't free it here,
+ // memory pointed by GrayTRC will be freed when hProfile is closed.
+ // test file :0047776_Pocket Medicine_ The Massachusetts General Hospital Handbook of Internal Medicine-2.pdf
+ // Xiaochuan Liu, 20140421
+ //cmsFreeToneCurve(GrayTRC);
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+// RGB Matrix shaper
+static
+cmsPipeline* BuildRGBInputMatrixShaper(cmsHPROFILE hProfile)
+{
+ cmsPipeline* Lut;
+ cmsMAT3 Mat;
+ cmsToneCurve *Shapes[3];
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ int i, j;
+
+ if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile)) return NULL;
+
+ // XYZ PCS in encoded in 1.15 format, and the matrix output comes in 0..0xffff range, so
+ // we need to adjust the output by a factor of (0x10000/0xffff) to put data in
+ // a 1.16 range, and then a >> 1 to obtain 1.15. The total factor is (65536.0)/(65535.0*2)
+
+ for (i=0; i < 3; i++)
+ for (j=0; j < 3; j++)
+ Mat.v[i].n[j] *= InpAdj;
+
+
+ Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);
+ Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);
+ Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);
+
+ if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+ return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 3, 3);
+ if (Lut != NULL) {
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, Shapes)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Mat, NULL)))
+ goto Error;
+
+ // Note that it is certainly possible a single profile would have a LUT based
+ // tag for output working in lab and a matrix-shaper for the fallback cases.
+ // This is not allowed by the spec, but this code is tolerant to those cases
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocXYZ2Lab(ContextID)))
+ goto Error;
+ }
+
+ }
+
+ return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+
+
+// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatInputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+ cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
+ cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+
+ if (Lut == NULL) return NULL;
+
+ // input and output of transform are in lcms 0..1 encoding. If XYZ or Lab spaces are used,
+ // these need to be normalized into the appropriate ranges (Lab = 100,0,0, XYZ=1.0,1.0,1.0)
+ if ( spc == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
+ }
+ else if (spc == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ if ( PCS == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
+ }
+ else if( PCS == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+
+// Read and create a BRAND NEW MPE LUT from a given profile. All stuff dependent of version, etc
+// is adjusted here in order to create a LUT that takes care of all those details.
+// We add intent = -1 as a way to read matrix shaper always, no matter of other LUT
+cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent)
+{
+ cmsTagTypeSignature OriginalType;
+ cmsTagSignature tag16 = Device2PCS16[Intent];
+ cmsTagSignature tagFloat = Device2PCSFloat[Intent];
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ // On named color, take the appropiate tag
+ if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+ cmsPipeline* Lut;
+ cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);
+
+ if (nc == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 0, 0);
+ if (Lut == NULL) {
+ cmsFreeNamedColorList(nc);
+ return NULL;
+ }
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, TRUE)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID))) {
+ cmsPipelineFree(Lut);
+ return NULL;
+ }
+ return Lut;
+ }
+
+ // This is an attempt to reuse this funtion to retrieve the matrix-shaper as pipeline no
+ // matter other LUT are present and have precedence. Intent = -1 means just this.
+ if (Intent != -1) {
+
+ if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
+
+ // Floating point LUT are always V4, but the encoding range is no
+ // longer 0..1.0, so we need to add an stage depending on the color space
+ return _cmsReadFloatInputTag(hProfile, tagFloat);
+ }
+
+ // Revert to perceptual if no tag is found
+ if (!cmsIsTag(hProfile, tag16)) {
+ tag16 = Device2PCS16[0];
+ }
+
+ if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
+
+ // Check profile version and LUT type. Do the necessary adjustments if needed
+
+ // First read the tag
+ cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+ if (Lut == NULL) return NULL;
+
+ // After reading it, we have now info about the original type
+ OriginalType = _cmsGetTagTrueType(hProfile, tag16);
+
+ // The profile owns the Lut, so we need to copy it
+ Lut = cmsPipelineDup(Lut);
+
+ // We need to adjust data only for Lab16 on output
+ if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
+ return Lut;
+
+ // If the input is Lab, add also a conversion at the begin
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData &&
+ !cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
+
+ // Add a matrix for conversion V2 to V4 Lab PCS
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
+
+ return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+ }
+ }
+
+ // Lut was not found, try to create a matrix-shaper
+
+ // Check if this is a grayscale profile.
+ if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+
+ // if so, build appropiate conversion tables.
+ // The tables are the PCS iluminant, scaled across GrayTRC
+ return BuildGrayInputMatrixPipeline(hProfile);
+ }
+
+ // Not gray, create a normal matrix-shaper
+ return BuildRGBInputMatrixShaper(hProfile);
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Gray output pipeline.
+// XYZ -> Gray or Lab -> Gray. Since we only know the GrayTRC, we need to do some assumptions. Gray component will be
+// given by Y on XYZ PCS and by L* on Lab PCS, Both across inverse TRC curve.
+// The complete pipeline on XYZ is Matrix[3:1] -> Tone curve and in Lab Matrix[3:1] -> Tone Curve as well.
+
+static
+cmsPipeline* BuildGrayOutputPipeline(cmsHPROFILE hProfile)
+{
+ cmsToneCurve *GrayTRC, *RevGrayTRC;
+ cmsPipeline* Lut;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ GrayTRC = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGrayTRCTag);
+ if (GrayTRC == NULL) return NULL;
+
+ RevGrayTRC = cmsReverseToneCurve(GrayTRC);
+ if (RevGrayTRC == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 3, 1);
+ if (Lut == NULL) {
+ cmsFreeToneCurve(RevGrayTRC);
+ return NULL;
+ }
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickLstarMatrix, NULL)))
+ goto Error;
+ }
+ else {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 1, 3, PickYMatrix, NULL)))
+ goto Error;
+ }
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 1, &RevGrayTRC)))
+ goto Error;
+
+ cmsFreeToneCurve(RevGrayTRC);
+ return Lut;
+
+Error:
+ cmsFreeToneCurve(RevGrayTRC);
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+
+static
+cmsPipeline* BuildRGBOutputMatrixShaper(cmsHPROFILE hProfile)
+{
+ cmsPipeline* Lut;
+ cmsToneCurve *Shapes[3], *InvShapes[3];
+ cmsMAT3 Mat, Inv;
+ int i, j;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ if (!ReadICCMatrixRGB2XYZ(&Mat, hProfile))
+ return NULL;
+
+ if (!_cmsMAT3inverse(&Mat, &Inv))
+ return NULL;
+
+ // XYZ PCS in encoded in 1.15 format, and the matrix input should come in 0..0xffff range, so
+ // we need to adjust the input by a << 1 to obtain a 1.16 fixed and then by a factor of
+ // (0xffff/0x10000) to put data in 0..0xffff range. Total factor is (2.0*65535.0)/65536.0;
+
+ for (i=0; i < 3; i++)
+ for (j=0; j < 3; j++)
+ Inv.v[i].n[j] *= OutpAdj;
+
+ Shapes[0] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigRedTRCTag);
+ Shapes[1] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigGreenTRCTag);
+ Shapes[2] = (cmsToneCurve *) cmsReadTag(hProfile, cmsSigBlueTRCTag);
+
+ if (!Shapes[0] || !Shapes[1] || !Shapes[2])
+ return NULL;
+
+ InvShapes[0] = cmsReverseToneCurve(Shapes[0]);
+ InvShapes[1] = cmsReverseToneCurve(Shapes[1]);
+ InvShapes[2] = cmsReverseToneCurve(Shapes[2]);
+
+ if (!InvShapes[0] || !InvShapes[1] || !InvShapes[2]) {
+ return NULL;
+ }
+
+ Lut = cmsPipelineAlloc(ContextID, 3, 3);
+ if (Lut != NULL) {
+
+ // Note that it is certainly possible a single profile would have a LUT based
+ // tag for output working in lab and a matrix-shaper for the fallback cases.
+ // This is not allowed by the spec, but this code is tolerant to those cases
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLab2XYZ(ContextID)))
+ goto Error;
+ }
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocMatrix(ContextID, 3, 3, (cmsFloat64Number*) &Inv, NULL)) ||
+ !cmsPipelineInsertStage(Lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, 3, InvShapes)))
+ goto Error;
+ }
+
+ cmsFreeToneCurveTriple(InvShapes);
+ return Lut;
+Error:
+ cmsFreeToneCurveTriple(InvShapes);
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+
+// Change CLUT interpolation to trilinear
+static
+void ChangeInterpolationToTrilinear(cmsPipeline* Lut)
+{
+ cmsStage* Stage;
+
+ for (Stage = cmsPipelineGetPtrToFirstStage(Lut);
+ Stage != NULL;
+ Stage = cmsStageNext(Stage)) {
+
+ if (cmsStageType(Stage) == cmsSigCLutElemType) {
+
+ _cmsStageCLutData* CLUT = (_cmsStageCLutData*) Stage ->Data;
+
+ CLUT ->Params->dwFlags |= CMS_LERP_FLAGS_TRILINEAR;
+ _cmsSetInterpolationRoutine(Lut->ContextID, CLUT ->Params);
+ }
+ }
+}
+
+
+// Read the DToAX tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatOutputTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+ cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+ cmsColorSpaceSignature dataSpace = cmsGetColorSpace(hProfile);
+
+ if (Lut == NULL) return NULL;
+
+ // If PCS is Lab or XYZ, the floating point tag is accepting data in the space encoding,
+ // and since the formatter has already accomodated to 0..1.0, we should undo this change
+ if ( PCS == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
+ }
+ else
+ if (PCS == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ // the output can be Lab or XYZ, in which case normalisation is needed on the end of the pipeline
+ if ( dataSpace == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
+ }
+ else if (dataSpace == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ return Lut;
+
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+// Create an output MPE LUT from agiven profile. Version mismatches are handled here
+cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent)
+{
+ cmsTagTypeSignature OriginalType;
+ cmsTagSignature tag16 = PCS2Device16[Intent];
+ cmsTagSignature tagFloat = PCS2DeviceFloat[Intent];
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+
+ if (Intent != -1) {
+
+ if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
+
+ // Floating point LUT are always V4
+ return _cmsReadFloatOutputTag(hProfile, tagFloat);
+ }
+
+ // Revert to perceptual if no tag is found
+ if (!cmsIsTag(hProfile, tag16)) {
+ tag16 = PCS2Device16[0];
+ }
+
+ if (cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
+
+ // Check profile version and LUT type. Do the necessary adjustments if needed
+
+ // First read the tag
+ cmsPipeline* Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+ if (Lut == NULL) return NULL;
+
+ // After reading it, we have info about the original type
+ OriginalType = _cmsGetTagTrueType(hProfile, tag16);
+
+ // The profile owns the Lut, so we need to copy it
+ Lut = cmsPipelineDup(Lut);
+ if (Lut == NULL) return NULL;
+
+ // Now it is time for a controversial stuff. I found that for 3D LUTS using
+ // Lab used as indexer space, trilinear interpolation should be used
+ if (cmsGetPCS(hProfile) == cmsSigLabData)
+ ChangeInterpolationToTrilinear(Lut);
+
+ // We need to adjust data only for Lab and Lut16 type
+ if (OriginalType != cmsSigLut16Type || cmsGetPCS(hProfile) != cmsSigLabData)
+ return Lut;
+
+ // Add a matrix for conversion V4 to V2 Lab PCS
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
+
+ // If the output is Lab, add also a conversion at the end
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
+
+ return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+ }
+ }
+
+ // Lut not found, try to create a matrix-shaper
+
+ // Check if this is a grayscale profile.
+ if (cmsGetColorSpace(hProfile) == cmsSigGrayData) {
+
+ // if so, build appropiate conversion tables.
+ // The tables are the PCS iluminant, scaled across GrayTRC
+ return BuildGrayOutputPipeline(hProfile);
+ }
+
+ // Not gray, create a normal matrix-shaper, which only operates in XYZ space
+ return BuildRGBOutputMatrixShaper(hProfile);
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Read the AToD0 tag, adjusting the encoding of Lab or XYZ if neded
+static
+cmsPipeline* _cmsReadFloatDevicelinkTag(cmsHPROFILE hProfile, cmsTagSignature tagFloat)
+{
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsPipeline* Lut = cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+ cmsColorSpaceSignature PCS = cmsGetPCS(hProfile);
+ cmsColorSpaceSignature spc = cmsGetColorSpace(hProfile);
+
+ if (Lut == NULL) return NULL;
+
+ if (spc == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToLabFloat(ContextID)))
+ goto Error;
+ }
+ else
+ if (spc == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageNormalizeToXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ if (PCS == cmsSigLabData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromLabFloat(ContextID)))
+ goto Error;
+ }
+ else
+ if (PCS == cmsSigXYZData)
+ {
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageNormalizeFromXyzFloat(ContextID)))
+ goto Error;
+ }
+
+ return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+// This one includes abstract profiles as well. Matrix-shaper cannot be obtained on that device class. The
+// tag name here may default to AToB0
+cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent)
+{
+ cmsPipeline* Lut;
+ cmsTagTypeSignature OriginalType;
+ cmsTagSignature tag16 = Device2PCS16[Intent];
+ cmsTagSignature tagFloat = Device2PCSFloat[Intent];
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+
+ // On named color, take the appropiate tag
+ if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+ cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) cmsReadTag(hProfile, cmsSigNamedColor2Tag);
+
+ if (nc == NULL) return NULL;
+
+ Lut = cmsPipelineAlloc(ContextID, 0, 0);
+ if (Lut == NULL)
+ goto Error;
+
+ if (!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocNamedColor(nc, FALSE)))
+ goto Error;
+
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData)
+ if (!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error;
+
+ return Lut;
+Error:
+ cmsPipelineFree(Lut);
+ cmsFreeNamedColorList(nc);
+ return NULL;
+ }
+
+ if (cmsIsTag(hProfile, tagFloat)) { // Float tag takes precedence
+
+ // Floating point LUT are always V
+ return _cmsReadFloatDevicelinkTag(hProfile, tagFloat);
+ }
+
+ tagFloat = Device2PCSFloat[0];
+ if (cmsIsTag(hProfile, tagFloat)) {
+
+ return cmsPipelineDup((cmsPipeline*) cmsReadTag(hProfile, tagFloat));
+ }
+
+ if (!cmsIsTag(hProfile, tag16)) { // Is there any LUT-Based table?
+
+ tag16 = Device2PCS16[0];
+ if (!cmsIsTag(hProfile, tag16)) return NULL;
+ }
+
+ // Check profile version and LUT type. Do the necessary adjustments if needed
+
+ // Read the tag
+ Lut = (cmsPipeline*) cmsReadTag(hProfile, tag16);
+ if (Lut == NULL) return NULL;
+
+ // The profile owns the Lut, so we need to copy it
+ Lut = cmsPipelineDup(Lut);
+ if (Lut == NULL) return NULL;
+
+ // Now it is time for a controversial stuff. I found that for 3D LUTS using
+ // Lab used as indexer space, trilinear interpolation should be used
+ if (cmsGetPCS(hProfile) == cmsSigLabData)
+ ChangeInterpolationToTrilinear(Lut);
+
+ // After reading it, we have info about the original type
+ OriginalType = _cmsGetTagTrueType(hProfile, tag16);
+
+ // We need to adjust data for Lab16 on output
+ if (OriginalType != cmsSigLut16Type) return Lut;
+
+ // Here it is possible to get Lab on both sides
+
+ if (cmsGetColorSpace(hProfile) == cmsSigLabData) {
+ if(!cmsPipelineInsertStage(Lut, cmsAT_BEGIN, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error2;
+ }
+
+ if (cmsGetPCS(hProfile) == cmsSigLabData) {
+ if(!cmsPipelineInsertStage(Lut, cmsAT_END, _cmsStageAllocLabV2ToV4(ContextID)))
+ goto Error2;
+ }
+
+ return Lut;
+
+Error2:
+ cmsPipelineFree(Lut);
+ return NULL;
+}
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Returns TRUE if the profile is implemented as matrix-shaper
+cmsBool CMSEXPORT cmsIsMatrixShaper(cmsHPROFILE hProfile)
+{
+ switch (cmsGetColorSpace(hProfile)) {
+
+ case cmsSigGrayData:
+
+ return cmsIsTag(hProfile, cmsSigGrayTRCTag);
+
+ case cmsSigRgbData:
+
+ return (cmsIsTag(hProfile, cmsSigRedColorantTag) &&
+ cmsIsTag(hProfile, cmsSigGreenColorantTag) &&
+ cmsIsTag(hProfile, cmsSigBlueColorantTag) &&
+ cmsIsTag(hProfile, cmsSigRedTRCTag) &&
+ cmsIsTag(hProfile, cmsSigGreenTRCTag) &&
+ cmsIsTag(hProfile, cmsSigBlueTRCTag));
+
+ default:
+
+ return FALSE;
+ }
+}
+
+// Returns TRUE if the intent is implemented as CLUT
+cmsBool CMSEXPORT cmsIsCLUT(cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number UsedDirection)
+{
+ const cmsTagSignature* TagTable;
+
+ // For devicelinks, the supported intent is that one stated in the header
+ if (cmsGetDeviceClass(hProfile) == cmsSigLinkClass) {
+ return (cmsGetHeaderRenderingIntent(hProfile) == Intent);
+ }
+
+ switch (UsedDirection) {
+
+ case LCMS_USED_AS_INPUT: TagTable = Device2PCS16; break;
+ case LCMS_USED_AS_OUTPUT:TagTable = PCS2Device16; break;
+
+ // For proofing, we need rel. colorimetric in output. Let's do some recursion
+ case LCMS_USED_AS_PROOF:
+ return cmsIsIntentSupported(hProfile, Intent, LCMS_USED_AS_INPUT) &&
+ cmsIsIntentSupported(hProfile, INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT);
+
+ default:
+ cmsSignalError(cmsGetProfileContextID(hProfile), cmsERROR_RANGE, "Unexpected direction (%d)", UsedDirection);
+ return FALSE;
+ }
+
+ return cmsIsTag(hProfile, TagTable[Intent]);
+
+}
+
+
+// Return info about supported intents
+cmsBool CMSEXPORT cmsIsIntentSupported(cmsHPROFILE hProfile,
+ cmsUInt32Number Intent, cmsUInt32Number UsedDirection)
+{
+
+ if (cmsIsCLUT(hProfile, Intent, UsedDirection)) return TRUE;
+
+ // Is there any matrix-shaper? If so, the intent is supported. This is a bit odd, since V2 matrix shaper
+ // does not fully support relative colorimetric because they cannot deal with non-zero black points, but
+ // many profiles claims that, and this is certainly not true for V4 profiles. Lets answer "yes" no matter
+ // the accuracy would be less than optimal in rel.col and v2 case.
+
+ return cmsIsMatrixShaper(hProfile);
+}
+
+
+// ---------------------------------------------------------------------------------------------------------------
+
+// Read both, profile sequence description and profile sequence id if present. Then combine both to
+// create qa unique structure holding both. Shame on ICC to store things in such complicated way.
+cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile)
+{
+ cmsSEQ* ProfileSeq;
+ cmsSEQ* ProfileId;
+ cmsSEQ* NewSeq;
+ cmsUInt32Number i;
+
+ // Take profile sequence description first
+ ProfileSeq = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceDescTag);
+
+ // Take profile sequence ID
+ ProfileId = (cmsSEQ*) cmsReadTag(hProfile, cmsSigProfileSequenceIdTag);
+
+ if (ProfileSeq == NULL && ProfileId == NULL) return NULL;
+
+ if (ProfileSeq == NULL) return cmsDupProfileSequenceDescription(ProfileId);
+ if (ProfileId == NULL) return cmsDupProfileSequenceDescription(ProfileSeq);
+
+ // We have to mix both together. For that they must agree
+ if (ProfileSeq ->n != ProfileId ->n) return cmsDupProfileSequenceDescription(ProfileSeq);
+
+ NewSeq = cmsDupProfileSequenceDescription(ProfileSeq);
+
+ // Ok, proceed to the mixing
+ if (NewSeq != NULL) {
+ for (i=0; i < ProfileSeq ->n; i++) {
+
+ memmove(&NewSeq ->seq[i].ProfileID, &ProfileId ->seq[i].ProfileID, sizeof(cmsProfileID));
+ NewSeq ->seq[i].Description = cmsMLUdup(ProfileId ->seq[i].Description);
+ }
+ }
+ return NewSeq;
+}
+
+// Dump the contents of profile sequence in both tags (if v4 available)
+cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq)
+{
+ if (!cmsWriteTag(hProfile, cmsSigProfileSequenceDescTag, seq)) return FALSE;
+
+ if (cmsGetProfileVersion(hProfile) >= 4.0) {
+
+ if (!cmsWriteTag(hProfile, cmsSigProfileSequenceIdTag, seq)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+// Auxiliar, read and duplicate a MLU if found.
+static
+cmsMLU* GetMLUFromProfile(cmsHPROFILE h, cmsTagSignature sig)
+{
+ cmsMLU* mlu = (cmsMLU*) cmsReadTag(h, sig);
+ if (mlu == NULL) return NULL;
+
+ return cmsMLUdup(mlu);
+}
+
+// Create a sequence description out of an array of profiles
+cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[])
+{
+ cmsUInt32Number i;
+ cmsSEQ* seq = cmsAllocProfileSequenceDescription(ContextID, nProfiles);
+
+ if (seq == NULL) return NULL;
+
+ for (i=0; i < nProfiles; i++) {
+
+ cmsPSEQDESC* ps = &seq ->seq[i];
+ cmsHPROFILE h = hProfiles[i];
+ cmsTechnologySignature* techpt;
+
+ cmsGetHeaderAttributes(h, &ps ->attributes);
+ cmsGetHeaderProfileID(h, ps ->ProfileID.ID8);
+ ps ->deviceMfg = cmsGetHeaderManufacturer(h);
+ ps ->deviceModel = cmsGetHeaderModel(h);
+
+ techpt = (cmsTechnologySignature*) cmsReadTag(h, cmsSigTechnologyTag);
+ if (techpt == NULL)
+ ps ->technology = (cmsTechnologySignature) 0;
+ else
+ ps ->technology = *techpt;
+
+ ps ->Manufacturer = GetMLUFromProfile(h, cmsSigDeviceMfgDescTag);
+ ps ->Model = GetMLUFromProfile(h, cmsSigDeviceModelDescTag);
+ ps ->Description = GetMLUFromProfile(h, cmsSigProfileDescriptionTag);
+
+ }
+
+ return seq;
+}
+
+// -------------------------------------------------------------------------------------------------------------------
+
+
+static
+const cmsMLU* GetInfo(cmsHPROFILE hProfile, cmsInfoType Info)
+{
+ cmsTagSignature sig;
+
+ switch (Info) {
+
+ case cmsInfoDescription:
+ sig = cmsSigProfileDescriptionTag;
+ break;
+
+ case cmsInfoManufacturer:
+ sig = cmsSigDeviceMfgDescTag;
+ break;
+
+ case cmsInfoModel:
+ sig = cmsSigDeviceModelDescTag;
+ break;
+
+ case cmsInfoCopyright:
+ sig = cmsSigCopyrightTag;
+ break;
+
+ default: return NULL;
+ }
+
+
+ return (cmsMLU*) cmsReadTag(hProfile, sig);
+}
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetProfileInfo(cmsHPROFILE hProfile, cmsInfoType Info,
+ const char LanguageCode[3], const char CountryCode[3],
+ wchar_t* Buffer, cmsUInt32Number BufferSize)
+{
+ const cmsMLU* mlu = GetInfo(hProfile, Info);
+ if (mlu == NULL) return 0;
+
+ return cmsMLUgetWide(mlu, LanguageCode, CountryCode, Buffer, BufferSize);
+}
+
+
+cmsUInt32Number CMSEXPORT cmsGetProfileInfoASCII(cmsHPROFILE hProfile, cmsInfoType Info,
+ const char LanguageCode[3], const char CountryCode[3],
+ char* Buffer, cmsUInt32Number BufferSize)
+{
+ const cmsMLU* mlu = GetInfo(hProfile, Info);
+ if (mlu == NULL) return 0;
+
+ return cmsMLUgetASCII(mlu, LanguageCode, CountryCode, Buffer, BufferSize);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c
new file mode 100644
index 0000000000..c4f93467ca
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmslut.c
@@ -0,0 +1,1793 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// Allocates an empty multi profile element
+cmsStage* CMSEXPORT _cmsStageAllocPlaceholder(cmsContext ContextID,
+ cmsStageSignature Type,
+ cmsUInt32Number InputChannels,
+ cmsUInt32Number OutputChannels,
+ _cmsStageEvalFn EvalPtr,
+ _cmsStageDupElemFn DupElemPtr,
+ _cmsStageFreeElemFn FreePtr,
+ void* Data)
+{
+ cmsStage* ph = (cmsStage*) _cmsMallocZero(ContextID, sizeof(cmsStage));
+
+ if (ph == NULL) return NULL;
+
+
+ ph ->ContextID = ContextID;
+
+ ph ->Type = Type;
+ ph ->Implements = Type; // By default, no clue on what is implementing
+
+ ph ->InputChannels = InputChannels;
+ ph ->OutputChannels = OutputChannels;
+ ph ->EvalPtr = EvalPtr;
+ ph ->DupElemPtr = DupElemPtr;
+ ph ->FreePtr = FreePtr;
+ ph ->Data = Data;
+
+ return ph;
+}
+
+
+static
+void EvaluateIdentity(const cmsFloat32Number In[],
+ cmsFloat32Number Out[],
+ const cmsStage *mpe)
+{
+ memmove(Out, In, mpe ->InputChannels * sizeof(cmsFloat32Number));
+}
+
+
+cmsStage* CMSEXPORT cmsStageAllocIdentity(cmsContext ContextID, cmsUInt32Number nChannels)
+{
+ return _cmsStageAllocPlaceholder(ContextID,
+ cmsSigIdentityElemType,
+ nChannels, nChannels,
+ EvaluateIdentity,
+ NULL,
+ NULL,
+ NULL);
+ }
+
+// Conversion functions. From floating point to 16 bits
+static
+void FromFloatTo16(const cmsFloat32Number In[], cmsUInt16Number Out[], cmsUInt32Number n)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < n; i++) {
+ Out[i] = _cmsQuickSaturateWord(In[i] * 65535.0);
+ }
+}
+
+// From 16 bits to floating point
+static
+void From16ToFloat(const cmsUInt16Number In[], cmsFloat32Number Out[], cmsUInt32Number n)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < n; i++) {
+ Out[i] = (cmsFloat32Number) In[i] / 65535.0F;
+ }
+}
+
+
+// This function is quite useful to analyze the structure of a LUT and retrieve the MPE elements
+// that conform the LUT. It should be called with the LUT, the number of expected elements and
+// then a list of expected types followed with a list of cmsFloat64Number pointers to MPE elements. If
+// the function founds a match with current pipeline, it fills the pointers and returns TRUE
+// if not, returns FALSE without touching anything. Setting pointers to NULL does bypass
+// the storage process.
+cmsBool CMSEXPORT cmsPipelineCheckAndRetreiveStages(const cmsPipeline* Lut, cmsUInt32Number n, ...)
+{
+ va_list args;
+ cmsUInt32Number i;
+ cmsStage* mpe;
+ cmsStageSignature Type;
+ void** ElemPtr;
+
+ // Make sure same number of elements
+ if (cmsPipelineStageCount(Lut) != n) return FALSE;
+
+ va_start(args, n);
+
+ // Iterate across asked types
+ mpe = Lut ->Elements;
+ for (i=0; i < n; i++) {
+
+ // Get asked type
+ Type = (cmsStageSignature)va_arg(args, cmsStageSignature);
+ if (mpe ->Type != Type) {
+
+ va_end(args); // Mismatch. We are done.
+ return FALSE;
+ }
+ mpe = mpe ->Next;
+ }
+
+ // Found a combination, fill pointers if not NULL
+ mpe = Lut ->Elements;
+ for (i=0; i < n; i++) {
+
+ ElemPtr = va_arg(args, void**);
+ if (ElemPtr != NULL)
+ *ElemPtr = mpe;
+
+ mpe = mpe ->Next;
+ }
+
+ va_end(args);
+ return TRUE;
+}
+
+// Below there are implementations for several types of elements. Each type may be implemented by a
+// evaluation function, a duplication function, a function to free resources and a constructor.
+
+// *************************************************************************************************
+// Type cmsSigCurveSetElemType (curves)
+// *************************************************************************************************
+
+cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe)
+{
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;
+
+ return Data ->TheCurves;
+}
+
+static
+void EvaluateCurves(const cmsFloat32Number In[],
+ cmsFloat32Number Out[],
+ const cmsStage *mpe)
+{
+ _cmsStageToneCurvesData* Data;
+ cmsUInt32Number i;
+
+ _cmsAssert(mpe != NULL);
+
+ Data = (_cmsStageToneCurvesData*) mpe ->Data;
+ if (Data == NULL) return;
+
+ if (Data ->TheCurves == NULL) return;
+
+ for (i=0; i < Data ->nCurves; i++) {
+ Out[i] = cmsEvalToneCurveFloat(Data ->TheCurves[i], In[i]);
+ }
+}
+
+static
+void CurveSetElemTypeFree(cmsStage* mpe)
+{
+ _cmsStageToneCurvesData* Data;
+ cmsUInt32Number i;
+
+ _cmsAssert(mpe != NULL);
+
+ Data = (_cmsStageToneCurvesData*) mpe ->Data;
+ if (Data == NULL) return;
+
+ if (Data ->TheCurves != NULL) {
+ for (i=0; i < Data ->nCurves; i++) {
+ if (Data ->TheCurves[i] != NULL)
+ cmsFreeToneCurve(Data ->TheCurves[i]);
+ }
+ }
+ _cmsFree(mpe ->ContextID, Data ->TheCurves);
+ _cmsFree(mpe ->ContextID, Data);
+}
+
+
+static
+void* CurveSetDup(cmsStage* mpe)
+{
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) mpe ->Data;
+ _cmsStageToneCurvesData* NewElem;
+ cmsUInt32Number i;
+
+ NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageToneCurvesData));
+ if (NewElem == NULL) return NULL;
+
+ NewElem ->nCurves = Data ->nCurves;
+ NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(mpe ->ContextID, NewElem ->nCurves, sizeof(cmsToneCurve*));
+
+ if (NewElem ->TheCurves == NULL) goto Error;
+
+ for (i=0; i < NewElem ->nCurves; i++) {
+
+ // Duplicate each curve. It may fail.
+ NewElem ->TheCurves[i] = cmsDupToneCurve(Data ->TheCurves[i]);
+ if (NewElem ->TheCurves[i] == NULL) goto Error;
+
+
+ }
+ return (void*) NewElem;
+
+Error:
+
+ if (NewElem ->TheCurves != NULL) {
+ for (i=0; i < NewElem ->nCurves; i++) {
+ if (NewElem ->TheCurves[i])
+ cmsFreeToneCurve(NewElem ->TheCurves[i]);
+ }
+ }
+ _cmsFree(mpe ->ContextID, NewElem ->TheCurves);
+ _cmsFree(mpe ->ContextID, NewElem);
+ return NULL;
+}
+
+
+// Curves == NULL forces identity curves
+cmsStage* CMSEXPORT cmsStageAllocToneCurves(cmsContext ContextID, cmsUInt32Number nChannels, cmsToneCurve* const Curves[])
+{
+ cmsUInt32Number i;
+ _cmsStageToneCurvesData* NewElem;
+ cmsStage* NewMPE;
+
+
+ NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCurveSetElemType, nChannels, nChannels,
+ EvaluateCurves, CurveSetDup, CurveSetElemTypeFree, NULL );
+ if (NewMPE == NULL) return NULL;
+
+ NewElem = (_cmsStageToneCurvesData*) _cmsMallocZero(ContextID, sizeof(_cmsStageToneCurvesData));
+ if (NewElem == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ NewMPE ->Data = (void*) NewElem;
+
+ NewElem ->nCurves = nChannels;
+ NewElem ->TheCurves = (cmsToneCurve**) _cmsCalloc(ContextID, nChannels, sizeof(cmsToneCurve*));
+ if (NewElem ->TheCurves == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ for (i=0; i < nChannels; i++) {
+
+ if (Curves == NULL) {
+ NewElem ->TheCurves[i] = cmsBuildGamma(ContextID, 1.0);
+ }
+ else {
+ NewElem ->TheCurves[i] = cmsDupToneCurve(Curves[i]);
+ }
+
+ if (NewElem ->TheCurves[i] == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ }
+
+ return NewMPE;
+}
+
+
+// Create a bunch of identity curves
+cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels)
+{
+ cmsStage* mpe = cmsStageAllocToneCurves(ContextID, nChannels, NULL);
+
+ if (mpe == NULL) return NULL;
+ mpe ->Implements = cmsSigIdentityElemType;
+ return mpe;
+}
+
+
+// *************************************************************************************************
+// Type cmsSigMatrixElemType (Matrices)
+// *************************************************************************************************
+
+
+// Special care should be taken here because precision loss. A temporary cmsFloat64Number buffer is being used
+static
+void EvaluateMatrix(const cmsFloat32Number In[],
+ cmsFloat32Number Out[],
+ const cmsStage *mpe)
+{
+ cmsUInt32Number i, j;
+ _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+ cmsFloat64Number Tmp;
+
+ // Input is already in 0..1.0 notation
+ for (i=0; i < mpe ->OutputChannels; i++) {
+
+ Tmp = 0;
+ for (j=0; j < mpe->InputChannels; j++) {
+ Tmp += In[j] * Data->Double[i*mpe->InputChannels + j];
+ }
+
+ if (Data ->Offset != NULL)
+ Tmp += Data->Offset[i];
+
+ Out[i] = (cmsFloat32Number) Tmp;
+ }
+
+
+ // Output in 0..1.0 domain
+}
+
+
+// Duplicate a yet-existing matrix element
+static
+void* MatrixElemDup(cmsStage* mpe)
+{
+ _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+ _cmsStageMatrixData* NewElem;
+ cmsUInt32Number sz;
+
+ NewElem = (_cmsStageMatrixData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageMatrixData));
+ if (NewElem == NULL) return NULL;
+
+ sz = mpe ->InputChannels * mpe ->OutputChannels;
+
+ NewElem ->Double = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID, Data ->Double, sz * sizeof(cmsFloat64Number)) ;
+
+ if (Data ->Offset)
+ NewElem ->Offset = (cmsFloat64Number*) _cmsDupMem(mpe ->ContextID,
+ Data ->Offset, mpe -> OutputChannels * sizeof(cmsFloat64Number)) ;
+
+ return (void*) NewElem;
+}
+
+
+static
+void MatrixElemTypeFree(cmsStage* mpe)
+{
+ _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+ if (Data == NULL)
+ return;
+ if (Data ->Double)
+ _cmsFree(mpe ->ContextID, Data ->Double);
+
+ if (Data ->Offset)
+ _cmsFree(mpe ->ContextID, Data ->Offset);
+
+ _cmsFree(mpe ->ContextID, mpe ->Data);
+}
+
+
+
+cmsStage* CMSEXPORT cmsStageAllocMatrix(cmsContext ContextID, cmsUInt32Number Rows, cmsUInt32Number Cols,
+ const cmsFloat64Number* Matrix, const cmsFloat64Number* Offset)
+{
+ cmsUInt32Number i, n;
+ _cmsStageMatrixData* NewElem;
+ cmsStage* NewMPE;
+
+ n = Rows * Cols;
+
+ // Check for overflow
+ if (n == 0) return NULL;
+ if (n >= UINT_MAX / Cols) return NULL;
+ if (n >= UINT_MAX / Rows) return NULL;
+ if (n < Rows || n < Cols) return NULL;
+
+ NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigMatrixElemType, Cols, Rows,
+ EvaluateMatrix, MatrixElemDup, MatrixElemTypeFree, NULL );
+ if (NewMPE == NULL) return NULL;
+
+
+ NewElem = (_cmsStageMatrixData*) _cmsMallocZero(ContextID, sizeof(_cmsStageMatrixData));
+ if (NewElem == NULL) return NULL;
+
+
+ NewElem ->Double = (cmsFloat64Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat64Number));
+
+ if (NewElem->Double == NULL) {
+ MatrixElemTypeFree(NewMPE);
+ return NULL;
+ }
+
+ for (i=0; i < n; i++) {
+ NewElem ->Double[i] = Matrix[i];
+ }
+
+
+ if (Offset != NULL) {
+
+ NewElem ->Offset = (cmsFloat64Number*) _cmsCalloc(ContextID, Cols, sizeof(cmsFloat64Number));
+ if (NewElem->Offset == NULL) {
+ MatrixElemTypeFree(NewMPE);
+ return NULL;
+ }
+
+ for (i=0; i < Cols; i++) {
+ NewElem ->Offset[i] = Offset[i];
+ }
+
+ }
+
+ NewMPE ->Data = (void*) NewElem;
+ return NewMPE;
+}
+
+
+// *************************************************************************************************
+// Type cmsSigCLutElemType
+// *************************************************************************************************
+
+
+// Evaluate in true floating point
+static
+void EvaluateCLUTfloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+ _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+
+ Data -> Params ->Interpolation.LerpFloat(In, Out, Data->Params);
+}
+
+
+// Convert to 16 bits, evaluate, and back to floating point
+static
+void EvaluateCLUTfloatIn16(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+ _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+ cmsUInt16Number In16[MAX_STAGE_CHANNELS], Out16[MAX_STAGE_CHANNELS];
+
+ _cmsAssert(mpe ->InputChannels <= MAX_STAGE_CHANNELS);
+ _cmsAssert(mpe ->OutputChannels <= MAX_STAGE_CHANNELS);
+
+ FromFloatTo16(In, In16, mpe ->InputChannels);
+ Data -> Params ->Interpolation.Lerp16(In16, Out16, Data->Params);
+ From16ToFloat(Out16, Out, mpe ->OutputChannels);
+}
+
+
+// Given an hypercube of b dimensions, with Dims[] number of nodes by dimension, calculate the total amount of nodes
+static
+cmsUInt32Number CubeSize(const cmsUInt32Number Dims[], cmsUInt32Number b)
+{
+ cmsUInt32Number rv, dim;
+
+ _cmsAssert(Dims != NULL);
+
+ for (rv = 1; b > 0; b--) {
+
+ dim = Dims[b-1];
+ if (dim == 0) return 0; // Error
+
+ rv *= dim;
+
+ // Check for overflow
+ if (rv > UINT_MAX / dim) return 0;
+ }
+
+ return rv;
+}
+
+static
+void* CLUTElemDup(cmsStage* mpe)
+{
+ _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+ _cmsStageCLutData* NewElem;
+
+
+ NewElem = (_cmsStageCLutData*) _cmsMallocZero(mpe ->ContextID, sizeof(_cmsStageCLutData));
+ if (NewElem == NULL) return NULL;
+
+ NewElem ->nEntries = Data ->nEntries;
+ NewElem ->HasFloatValues = Data ->HasFloatValues;
+
+ if (Data ->Tab.T) {
+
+ if (Data ->HasFloatValues) {
+ NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.TFloat, Data ->nEntries * sizeof (cmsFloat32Number));
+ if (NewElem ->Tab.TFloat == NULL)
+ goto Error;
+ } else {
+ NewElem ->Tab.T = (cmsUInt16Number*) _cmsDupMem(mpe ->ContextID, Data ->Tab.T, Data ->nEntries * sizeof (cmsUInt16Number));
+ if (NewElem ->Tab.TFloat == NULL)
+ goto Error;
+ }
+ }
+
+ NewElem ->Params = _cmsComputeInterpParamsEx(mpe ->ContextID,
+ Data ->Params ->nSamples,
+ Data ->Params ->nInputs,
+ Data ->Params ->nOutputs,
+ NewElem ->Tab.T,
+ Data ->Params ->dwFlags);
+ if (NewElem->Params != NULL)
+ return (void*) NewElem;
+ Error:
+ if (NewElem->Tab.T)
+ // This works for both types
+ _cmsFree(mpe ->ContextID, NewElem -> Tab.T);
+ _cmsFree(mpe ->ContextID, NewElem);
+ return NULL;
+}
+
+
+static
+void CLutElemTypeFree(cmsStage* mpe)
+{
+
+ _cmsStageCLutData* Data = (_cmsStageCLutData*) mpe ->Data;
+
+ // Already empty
+ if (Data == NULL) return;
+
+ // This works for both types
+ if (Data -> Tab.T)
+ _cmsFree(mpe ->ContextID, Data -> Tab.T);
+
+ _cmsFreeInterpParams(Data ->Params);
+ _cmsFree(mpe ->ContextID, mpe ->Data);
+}
+
+
+// Allocates a 16-bit multidimensional CLUT. This is evaluated at 16-bit precision. Table may have different
+// granularity on each dimension.
+cmsStage* CMSEXPORT cmsStageAllocCLut16bitGranular(cmsContext ContextID,
+ const cmsUInt32Number clutPoints[],
+ cmsUInt32Number inputChan,
+ cmsUInt32Number outputChan,
+ const cmsUInt16Number* Table)
+{
+ cmsUInt32Number i, n;
+ _cmsStageCLutData* NewElem;
+ cmsStage* NewMPE;
+
+ _cmsAssert(clutPoints != NULL);
+
+ if (inputChan > MAX_INPUT_DIMENSIONS) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS);
+ return NULL;
+ }
+
+ NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
+ EvaluateCLUTfloatIn16, CLUTElemDup, CLutElemTypeFree, NULL );
+
+ if (NewMPE == NULL) return NULL;
+
+ NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));
+ if (NewElem == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ NewMPE ->Data = (void*) NewElem;
+
+ NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);
+ NewElem -> HasFloatValues = FALSE;
+
+ if (n == 0) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+
+ NewElem ->Tab.T = (cmsUInt16Number*) _cmsCalloc(ContextID, n, sizeof(cmsUInt16Number));
+ if (NewElem ->Tab.T == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ if (Table != NULL) {
+ for (i=0; i < n; i++) {
+ NewElem ->Tab.T[i] = Table[i];
+ }
+ }
+
+ NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.T, CMS_LERP_FLAGS_16BITS);
+ if (NewElem ->Params == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ return NewMPE;
+}
+
+cmsStage* CMSEXPORT cmsStageAllocCLut16bit(cmsContext ContextID,
+ cmsUInt32Number nGridPoints,
+ cmsUInt32Number inputChan,
+ cmsUInt32Number outputChan,
+ const cmsUInt16Number* Table)
+{
+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+ int i;
+
+ // Our resulting LUT would be same gridpoints on all dimensions
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+ Dimensions[i] = nGridPoints;
+
+ return cmsStageAllocCLut16bitGranular(ContextID, Dimensions, inputChan, outputChan, Table);
+}
+
+
+cmsStage* CMSEXPORT cmsStageAllocCLutFloat(cmsContext ContextID,
+ cmsUInt32Number nGridPoints,
+ cmsUInt32Number inputChan,
+ cmsUInt32Number outputChan,
+ const cmsFloat32Number* Table)
+{
+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+ int i;
+
+ // Our resulting LUT would be same gridpoints on all dimensions
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+ Dimensions[i] = nGridPoints;
+
+ return cmsStageAllocCLutFloatGranular(ContextID, Dimensions, inputChan, outputChan, Table);
+}
+
+
+
+cmsStage* CMSEXPORT cmsStageAllocCLutFloatGranular(cmsContext ContextID, const cmsUInt32Number clutPoints[], cmsUInt32Number inputChan, cmsUInt32Number outputChan, const cmsFloat32Number* Table)
+{
+ cmsUInt32Number i, n;
+ _cmsStageCLutData* NewElem;
+ cmsStage* NewMPE;
+
+ _cmsAssert(clutPoints != NULL);
+
+ if (inputChan > MAX_INPUT_DIMENSIONS) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Too many input channels (%d channels, max=%d)", inputChan, MAX_INPUT_DIMENSIONS);
+ return NULL;
+ }
+
+ NewMPE = _cmsStageAllocPlaceholder(ContextID, cmsSigCLutElemType, inputChan, outputChan,
+ EvaluateCLUTfloat, CLUTElemDup, CLutElemTypeFree, NULL);
+ if (NewMPE == NULL) return NULL;
+
+
+ NewElem = (_cmsStageCLutData*) _cmsMallocZero(ContextID, sizeof(_cmsStageCLutData));
+ if (NewElem == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ NewMPE ->Data = (void*) NewElem;
+
+ // There is a potential integer overflow on conputing n and nEntries.
+ NewElem -> nEntries = n = outputChan * CubeSize(clutPoints, inputChan);
+ NewElem -> HasFloatValues = TRUE;
+
+ if (n == 0) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ NewElem ->Tab.TFloat = (cmsFloat32Number*) _cmsCalloc(ContextID, n, sizeof(cmsFloat32Number));
+ if (NewElem ->Tab.TFloat == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ if (Table != NULL) {
+ for (i=0; i < n; i++) {
+ NewElem ->Tab.TFloat[i] = Table[i];
+ }
+ }
+
+ NewElem ->Params = _cmsComputeInterpParamsEx(ContextID, clutPoints, inputChan, outputChan, NewElem ->Tab.TFloat, CMS_LERP_FLAGS_FLOAT);
+ if (NewElem ->Params == NULL) {
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ return NewMPE;
+}
+
+
+static
+int IdentitySampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void * Cargo)
+{
+ int nChan = *(int*) Cargo;
+ int i;
+
+ for (i=0; i < nChan; i++)
+ Out[i] = In[i];
+
+ return 1;
+}
+
+// Creates an MPE that just copies input to output
+cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan)
+{
+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+ cmsStage* mpe ;
+ int i;
+
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++)
+ Dimensions[i] = 2;
+
+ mpe = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, nChan, nChan, NULL);
+ if (mpe == NULL) return NULL;
+
+ if (!cmsStageSampleCLut16bit(mpe, IdentitySampler, &nChan, 0)) {
+ cmsStageFree(mpe);
+ return NULL;
+ }
+
+ mpe ->Implements = cmsSigIdentityElemType;
+ return mpe;
+}
+
+
+
+// Quantize a value 0 <= i < MaxSamples to 0..0xffff
+cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples)
+{
+ cmsFloat64Number x;
+
+ x = ((cmsFloat64Number) i * 65535.) / (cmsFloat64Number) (MaxSamples - 1);
+ return _cmsQuickSaturateWord(x);
+}
+
+
+// This routine does a sweep on whole input space, and calls its callback
+// function on knots. returns TRUE if all ok, FALSE otherwise.
+cmsBool CMSEXPORT cmsStageSampleCLut16bit(cmsStage* mpe, cmsSAMPLER16 Sampler, void * Cargo, cmsUInt32Number dwFlags)
+{
+ int i, t, nTotalPoints, index, rest;
+ int nInputs, nOutputs;
+ cmsUInt32Number* nSamples;
+ cmsUInt16Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+ _cmsStageCLutData* clut;
+
+ if (mpe == NULL) return FALSE;
+
+ clut = (_cmsStageCLutData*) mpe->Data;
+
+ if (clut == NULL) return FALSE;
+
+ nSamples = clut->Params ->nSamples;
+ nInputs = clut->Params ->nInputs;
+ nOutputs = clut->Params ->nOutputs;
+
+ if (nInputs <= 0) return FALSE;
+ if (nOutputs <= 0) return FALSE;
+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
+ if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(nSamples, nInputs);
+ if (nTotalPoints == 0) return FALSE;
+
+ index = 0;
+ for (i = 0; i < nTotalPoints; i++) {
+
+ rest = i;
+ for (t = nInputs-1; t >=0; --t) {
+
+ cmsUInt32Number Colorant = rest % nSamples[t];
+
+ rest /= nSamples[t];
+
+ In[t] = _cmsQuantizeVal(Colorant, nSamples[t]);
+ }
+
+ if (clut ->Tab.T != NULL) {
+ for (t=0; t < nOutputs; t++)
+ Out[t] = clut->Tab.T[index + t];
+ }
+
+ if (!Sampler(In, Out, Cargo))
+ return FALSE;
+
+ if (!(dwFlags & SAMPLER_INSPECT)) {
+
+ if (clut ->Tab.T != NULL) {
+ for (t=0; t < nOutputs; t++)
+ clut->Tab.T[index + t] = Out[t];
+ }
+ }
+
+ index += nOutputs;
+ }
+
+ return TRUE;
+}
+
+// Same as anterior, but for floting point
+cmsBool CMSEXPORT cmsStageSampleCLutFloat(cmsStage* mpe, cmsSAMPLERFLOAT Sampler, void * Cargo, cmsUInt32Number dwFlags)
+{
+ int i, t, nTotalPoints, index, rest;
+ int nInputs, nOutputs;
+ cmsUInt32Number* nSamples;
+ cmsFloat32Number In[MAX_INPUT_DIMENSIONS+1], Out[MAX_STAGE_CHANNELS];
+ _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe->Data;
+
+ nSamples = clut->Params ->nSamples;
+ nInputs = clut->Params ->nInputs;
+ nOutputs = clut->Params ->nOutputs;
+
+ if (nInputs <= 0) return FALSE;
+ if (nOutputs <= 0) return FALSE;
+ if (nInputs > MAX_INPUT_DIMENSIONS) return FALSE;
+ if (nOutputs >= MAX_STAGE_CHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(nSamples, nInputs);
+ if (nTotalPoints == 0) return FALSE;
+
+ index = 0;
+ for (i = 0; i < nTotalPoints; i++) {
+
+ rest = i;
+ for (t = nInputs-1; t >=0; --t) {
+
+ cmsUInt32Number Colorant = rest % nSamples[t];
+
+ rest /= nSamples[t];
+
+ In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, nSamples[t]) / 65535.0);
+ }
+
+ if (clut ->Tab.TFloat != NULL) {
+ for (t=0; t < nOutputs; t++)
+ Out[t] = clut->Tab.TFloat[index + t];
+ }
+
+ if (!Sampler(In, Out, Cargo))
+ return FALSE;
+
+ if (!(dwFlags & SAMPLER_INSPECT)) {
+
+ if (clut ->Tab.TFloat != NULL) {
+ for (t=0; t < nOutputs; t++)
+ clut->Tab.TFloat[index + t] = Out[t];
+ }
+ }
+
+ index += nOutputs;
+ }
+
+ return TRUE;
+}
+
+
+
+// This routine does a sweep on whole input space, and calls its callback
+// function on knots. returns TRUE if all ok, FALSE otherwise.
+cmsBool CMSEXPORT cmsSliceSpace16(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+ cmsSAMPLER16 Sampler, void * Cargo)
+{
+ int i, t, nTotalPoints, rest;
+ cmsUInt16Number In[cmsMAXCHANNELS];
+
+ if (nInputs >= cmsMAXCHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(clutPoints, nInputs);
+ if (nTotalPoints == 0) return FALSE;
+
+ for (i = 0; i < nTotalPoints; i++) {
+
+ rest = i;
+ for (t = nInputs-1; t >=0; --t) {
+
+ cmsUInt32Number Colorant = rest % clutPoints[t];
+
+ rest /= clutPoints[t];
+ In[t] = _cmsQuantizeVal(Colorant, clutPoints[t]);
+
+ }
+
+ if (!Sampler(In, NULL, Cargo))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+cmsInt32Number CMSEXPORT cmsSliceSpaceFloat(cmsUInt32Number nInputs, const cmsUInt32Number clutPoints[],
+ cmsSAMPLERFLOAT Sampler, void * Cargo)
+{
+ int i, t, nTotalPoints, rest;
+ cmsFloat32Number In[cmsMAXCHANNELS];
+
+ if (nInputs >= cmsMAXCHANNELS) return FALSE;
+
+ nTotalPoints = CubeSize(clutPoints, nInputs);
+ if (nTotalPoints == 0) return FALSE;
+
+ for (i = 0; i < nTotalPoints; i++) {
+
+ rest = i;
+ for (t = nInputs-1; t >=0; --t) {
+
+ cmsUInt32Number Colorant = rest % clutPoints[t];
+
+ rest /= clutPoints[t];
+ In[t] = (cmsFloat32Number) (_cmsQuantizeVal(Colorant, clutPoints[t]) / 65535.0);
+
+ }
+
+ if (!Sampler(In, NULL, Cargo))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+// ********************************************************************************
+// Type cmsSigLab2XYZElemType
+// ********************************************************************************
+
+
+static
+void EvaluateLab2XYZ(const cmsFloat32Number In[],
+ cmsFloat32Number Out[],
+ const cmsStage *mpe)
+{
+ cmsCIELab Lab;
+ cmsCIEXYZ XYZ;
+ const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;
+
+ // V4 rules
+ Lab.L = In[0] * 100.0;
+ Lab.a = In[1] * 255.0 - 128.0;
+ Lab.b = In[2] * 255.0 - 128.0;
+
+ cmsLab2XYZ(NULL, &XYZ, &Lab);
+
+ // From XYZ, range 0..19997 to 0..1.0, note that 1.99997 comes from 0xffff
+ // encoded as 1.15 fixed point, so 1 + (32767.0 / 32768.0)
+
+ Out[0] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.X / XYZadj);
+ Out[1] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Y / XYZadj);
+ Out[2] = (cmsFloat32Number) ((cmsFloat64Number) XYZ.Z / XYZadj);
+ return;
+
+ cmsUNUSED_PARAMETER(mpe);
+}
+
+
+// No dup or free routines needed, as the structure has no pointers in it.
+cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID)
+{
+ return _cmsStageAllocPlaceholder(ContextID, cmsSigLab2XYZElemType, 3, 3, EvaluateLab2XYZ, NULL, NULL, NULL);
+}
+
+// ********************************************************************************
+
+// v2 L=100 is supposed to be placed on 0xFF00. There is no reasonable
+// number of gridpoints that would make exact match. However, a prelinearization
+// of 258 entries, would map 0xFF00 exactly on entry 257, and this is good to avoid scum dot.
+// Almost all what we need but unfortunately, the rest of entries should be scaled by
+// (255*257/256) and this is not exact.
+
+cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID)
+{
+ cmsStage* mpe;
+ cmsToneCurve* LabTable[3];
+ int i, j;
+
+ LabTable[0] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+ LabTable[1] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+ LabTable[2] = cmsBuildTabulatedToneCurve16(ContextID, 258, NULL);
+
+ for (j=0; j < 3; j++) {
+
+ if (LabTable[j] == NULL) {
+ cmsFreeToneCurveTriple(LabTable);
+ return NULL;
+ }
+
+ // We need to map * (0xffff / 0xff00), thats same as (257 / 256)
+ // So we can use 258-entry tables to do the trick (i / 257) * (255 * 257) * (257 / 256);
+ for (i=0; i < 257; i++) {
+
+ LabTable[j]->Table16[i] = (cmsUInt16Number) ((i * 0xffff + 0x80) >> 8);
+ }
+
+ LabTable[j] ->Table16[257] = 0xffff;
+ }
+
+ mpe = cmsStageAllocToneCurves(ContextID, 3, LabTable);
+ cmsFreeToneCurveTriple(LabTable);
+
+ if (mpe == NULL) return NULL;
+ mpe ->Implements = cmsSigLabV2toV4;
+ return mpe;
+}
+
+// ********************************************************************************
+
+// Matrix-based conversion, which is more accurate, but slower and cannot properly be saved in devicelink profiles
+cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID)
+{
+ static const cmsFloat64Number V2ToV4[] = { 65535.0/65280.0, 0, 0,
+ 0, 65535.0/65280.0, 0,
+ 0, 0, 65535.0/65280.0
+ };
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V2ToV4, NULL);
+
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigLabV2toV4;
+ return mpe;
+}
+
+
+// Reverse direction
+cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID)
+{
+ static const cmsFloat64Number V4ToV2[] = { 65280.0/65535.0, 0, 0,
+ 0, 65280.0/65535.0, 0,
+ 0, 0, 65280.0/65535.0
+ };
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, V4ToV2, NULL);
+
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigLabV4toV2;
+ return mpe;
+}
+
+
+// To Lab to float. Note that the MPE gives numbers in normal Lab range
+// and we need 0..1.0 range for the formatters
+// L* : 0...100 => 0...1.0 (L* / 100)
+// ab* : -128..+127 to 0..1 ((ab* + 128) / 255)
+
+cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID)
+{
+ static const cmsFloat64Number a1[] = {
+ 1.0/100.0, 0, 0,
+ 0, 1.0/255.0, 0,
+ 0, 0, 1.0/255.0
+ };
+
+ static const cmsFloat64Number o1[] = {
+ 0,
+ 128.0/255.0,
+ 128.0/255.0
+ };
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);
+
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigLab2FloatPCS;
+ return mpe;
+}
+
+// Fom XYZ to floating point PCS
+cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID)
+{
+#define n (32768.0/65535.0)
+ static const cmsFloat64Number a1[] = {
+ n, 0, 0,
+ 0, n, 0,
+ 0, 0, n
+ };
+#undef n
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);
+
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigXYZ2FloatPCS;
+ return mpe;
+}
+
+cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID)
+{
+ static const cmsFloat64Number a1[] = {
+ 100.0, 0, 0,
+ 0, 255.0, 0,
+ 0, 0, 255.0
+ };
+
+ static const cmsFloat64Number o1[] = {
+ 0,
+ -128.0,
+ -128.0
+ };
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, o1);
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigFloatPCS2Lab;
+ return mpe;
+}
+
+cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID)
+{
+#define n (65535.0/32768.0)
+
+ static const cmsFloat64Number a1[] = {
+ n, 0, 0,
+ 0, n, 0,
+ 0, 0, n
+ };
+#undef n
+
+ cmsStage *mpe = cmsStageAllocMatrix(ContextID, 3, 3, a1, NULL);
+ if (mpe == NULL) return mpe;
+ mpe ->Implements = cmsSigFloatPCS2XYZ;
+ return mpe;
+}
+
+
+
+// ********************************************************************************
+// Type cmsSigXYZ2LabElemType
+// ********************************************************************************
+
+static
+void EvaluateXYZ2Lab(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+ cmsCIELab Lab;
+ cmsCIEXYZ XYZ;
+ const cmsFloat64Number XYZadj = MAX_ENCODEABLE_XYZ;
+
+ // From 0..1.0 to XYZ
+
+ XYZ.X = In[0] * XYZadj;
+ XYZ.Y = In[1] * XYZadj;
+ XYZ.Z = In[2] * XYZadj;
+
+ cmsXYZ2Lab(NULL, &Lab, &XYZ);
+
+ // From V4 Lab to 0..1.0
+
+ Out[0] = (cmsFloat32Number) (Lab.L / 100.0);
+ Out[1] = (cmsFloat32Number) ((Lab.a + 128.0) / 255.0);
+ Out[2] = (cmsFloat32Number) ((Lab.b + 128.0) / 255.0);
+ return;
+
+ cmsUNUSED_PARAMETER(mpe);
+}
+
+cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID)
+{
+ return _cmsStageAllocPlaceholder(ContextID, cmsSigXYZ2LabElemType, 3, 3, EvaluateXYZ2Lab, NULL, NULL, NULL);
+
+}
+
+// ********************************************************************************
+
+// For v4, S-Shaped curves are placed in a/b axis to increase resolution near gray
+
+cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID)
+{
+ cmsToneCurve* LabTable[3];
+ cmsFloat64Number Params[1] = {2.4} ;
+
+ LabTable[0] = cmsBuildGamma(ContextID, 1.0);
+ LabTable[1] = cmsBuildParametricToneCurve(ContextID, 108, Params);
+ LabTable[2] = cmsBuildParametricToneCurve(ContextID, 108, Params);
+
+ return cmsStageAllocToneCurves(ContextID, 3, LabTable);
+}
+
+
+// Free a single MPE
+void CMSEXPORT cmsStageFree(cmsStage* mpe)
+{
+ if (mpe ->FreePtr)
+ mpe ->FreePtr(mpe);
+
+ _cmsFree(mpe ->ContextID, mpe);
+}
+
+
+cmsUInt32Number CMSEXPORT cmsStageInputChannels(const cmsStage* mpe)
+{
+ return mpe ->InputChannels;
+}
+
+cmsUInt32Number CMSEXPORT cmsStageOutputChannels(const cmsStage* mpe)
+{
+ return mpe ->OutputChannels;
+}
+
+cmsStageSignature CMSEXPORT cmsStageType(const cmsStage* mpe)
+{
+ return mpe -> Type;
+}
+
+void* CMSEXPORT cmsStageData(const cmsStage* mpe)
+{
+ return mpe -> Data;
+}
+
+cmsStage* CMSEXPORT cmsStageNext(const cmsStage* mpe)
+{
+ return mpe -> Next;
+}
+
+
+// Duplicates an MPE
+cmsStage* CMSEXPORT cmsStageDup(cmsStage* mpe)
+{
+ cmsStage* NewMPE;
+
+ if (mpe == NULL) return NULL;
+ NewMPE = _cmsStageAllocPlaceholder(mpe ->ContextID,
+ mpe ->Type,
+ mpe ->InputChannels,
+ mpe ->OutputChannels,
+ mpe ->EvalPtr,
+ mpe ->DupElemPtr,
+ mpe ->FreePtr,
+ NULL);
+ if (NewMPE == NULL) return NULL;
+
+ NewMPE ->Implements = mpe ->Implements;
+
+ if (mpe ->DupElemPtr) {
+
+ NewMPE ->Data = mpe ->DupElemPtr(mpe);
+
+ if (NewMPE->Data == NULL) {
+
+ cmsStageFree(NewMPE);
+ return NULL;
+ }
+
+ } else {
+
+ NewMPE ->Data = NULL;
+ }
+
+ return NewMPE;
+}
+
+
+// ***********************************************************************************************************
+
+// This function sets up the channel count
+
+static
+void BlessLUT(cmsPipeline* lut)
+{
+ // We can set the input/ouput channels only if we have elements.
+ if (lut ->Elements != NULL) {
+
+ cmsStage *First, *Last;
+
+ First = cmsPipelineGetPtrToFirstStage(lut);
+ Last = cmsPipelineGetPtrToLastStage(lut);
+
+ if (First != NULL)lut ->InputChannels = First ->InputChannels;
+ if (Last != NULL) lut ->OutputChannels = Last ->OutputChannels;
+ }
+}
+
+
+// Default to evaluate the LUT on 16 bit-basis. Precision is retained.
+static
+void _LUTeval16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register const void* D)
+{
+ cmsPipeline* lut = (cmsPipeline*) D;
+ cmsStage *mpe;
+ cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS];
+ int Phase = 0, NextPhase;
+
+ From16ToFloat(In, &Storage[Phase][0], lut ->InputChannels);
+
+ for (mpe = lut ->Elements;
+ mpe != NULL;
+ mpe = mpe ->Next) {
+
+ NextPhase = Phase ^ 1;
+ mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);
+ Phase = NextPhase;
+ }
+
+
+ FromFloatTo16(&Storage[Phase][0], Out, lut ->OutputChannels);
+}
+
+
+
+// Does evaluate the LUT on cmsFloat32Number-basis.
+static
+void _LUTevalFloat(register const cmsFloat32Number In[], register cmsFloat32Number Out[], const void* D)
+{
+ cmsPipeline* lut = (cmsPipeline*) D;
+ cmsStage *mpe;
+ cmsFloat32Number Storage[2][MAX_STAGE_CHANNELS];
+ int Phase = 0, NextPhase;
+
+ memmove(&Storage[Phase][0], In, lut ->InputChannels * sizeof(cmsFloat32Number));
+
+ for (mpe = lut ->Elements;
+ mpe != NULL;
+ mpe = mpe ->Next) {
+
+ NextPhase = Phase ^ 1;
+ mpe ->EvalPtr(&Storage[Phase][0], &Storage[NextPhase][0], mpe);
+ Phase = NextPhase;
+ }
+
+ memmove(Out, &Storage[Phase][0], lut ->OutputChannels * sizeof(cmsFloat32Number));
+}
+
+
+
+
+// LUT Creation & Destruction
+
+cmsPipeline* CMSEXPORT cmsPipelineAlloc(cmsContext ContextID, cmsUInt32Number InputChannels, cmsUInt32Number OutputChannels)
+{
+ cmsPipeline* NewLUT;
+
+ if (InputChannels >= cmsMAXCHANNELS ||
+ OutputChannels >= cmsMAXCHANNELS) return NULL;
+
+ NewLUT = (cmsPipeline*) _cmsMallocZero(ContextID, sizeof(cmsPipeline));
+ if (NewLUT == NULL) return NULL;
+
+
+ NewLUT -> InputChannels = InputChannels;
+ NewLUT -> OutputChannels = OutputChannels;
+
+ NewLUT ->Eval16Fn = _LUTeval16;
+ NewLUT ->EvalFloatFn = _LUTevalFloat;
+ NewLUT ->DupDataFn = NULL;
+ NewLUT ->FreeDataFn = NULL;
+ NewLUT ->Data = NewLUT;
+ NewLUT ->ContextID = ContextID;
+
+ BlessLUT(NewLUT);
+
+ return NewLUT;
+}
+
+cmsContext CMSEXPORT cmsGetPipelineContextID(const cmsPipeline* lut)
+{
+ _cmsAssert(lut != NULL);
+ return lut ->ContextID;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineInputChannels(const cmsPipeline* lut)
+{
+ _cmsAssert(lut != NULL);
+ return lut ->InputChannels;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineOutputChannels(const cmsPipeline* lut)
+{
+ _cmsAssert(lut != NULL);
+ return lut ->OutputChannels;
+}
+
+// Free a profile elements LUT
+void CMSEXPORT cmsPipelineFree(cmsPipeline* lut)
+{
+ cmsStage *mpe, *Next;
+
+ if (lut == NULL) return;
+
+ for (mpe = lut ->Elements;
+ mpe != NULL;
+ mpe = Next) {
+
+ Next = mpe ->Next;
+ cmsStageFree(mpe);
+ }
+
+ if (lut ->FreeDataFn) lut ->FreeDataFn(lut ->ContextID, lut ->Data);
+
+ _cmsFree(lut ->ContextID, lut);
+}
+
+
+// Default to evaluate the LUT on 16 bit-basis.
+void CMSEXPORT cmsPipelineEval16(const cmsUInt16Number In[], cmsUInt16Number Out[], const cmsPipeline* lut)
+{
+ _cmsAssert(lut != NULL);
+ lut ->Eval16Fn(In, Out, lut->Data);
+}
+
+
+// Does evaluate the LUT on cmsFloat32Number-basis.
+void CMSEXPORT cmsPipelineEvalFloat(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsPipeline* lut)
+{
+ _cmsAssert(lut != NULL);
+ lut ->EvalFloatFn(In, Out, lut);
+}
+
+
+
+// Duplicates a LUT
+cmsPipeline* CMSEXPORT cmsPipelineDup(const cmsPipeline* lut)
+{
+ cmsPipeline* NewLUT;
+ cmsStage *NewMPE, *Anterior = NULL, *mpe;
+ cmsBool First = TRUE;
+
+ if (lut == NULL) return NULL;
+
+ NewLUT = cmsPipelineAlloc(lut ->ContextID, lut ->InputChannels, lut ->OutputChannels);
+ if (NewLUT == NULL) return NULL;
+
+ for (mpe = lut ->Elements;
+ mpe != NULL;
+ mpe = mpe ->Next) {
+
+ NewMPE = cmsStageDup(mpe);
+
+ if (NewMPE == NULL) {
+ cmsPipelineFree(NewLUT);
+ return NULL;
+ }
+
+ if (First) {
+ NewLUT ->Elements = NewMPE;
+ First = FALSE;
+ }
+ else {
+ Anterior ->Next = NewMPE;
+ }
+
+ Anterior = NewMPE;
+ }
+
+ NewLUT ->Eval16Fn = lut ->Eval16Fn;
+ NewLUT ->EvalFloatFn = lut ->EvalFloatFn;
+ NewLUT ->DupDataFn = lut ->DupDataFn;
+ NewLUT ->FreeDataFn = lut ->FreeDataFn;
+
+ if (NewLUT ->DupDataFn != NULL)
+ NewLUT ->Data = NewLUT ->DupDataFn(lut ->ContextID, lut->Data);
+
+
+ NewLUT ->SaveAs8Bits = lut ->SaveAs8Bits;
+
+ BlessLUT(NewLUT);
+ return NewLUT;
+}
+
+
+int CMSEXPORT cmsPipelineInsertStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage* mpe)
+{
+ cmsStage* Anterior = NULL, *pt;
+
+ if (lut == NULL || mpe == NULL)
+ return FALSE;
+
+ switch (loc) {
+
+ case cmsAT_BEGIN:
+ mpe ->Next = lut ->Elements;
+ lut ->Elements = mpe;
+ break;
+
+ case cmsAT_END:
+
+ if (lut ->Elements == NULL)
+ lut ->Elements = mpe;
+ else {
+
+ for (pt = lut ->Elements;
+ pt != NULL;
+ pt = pt -> Next) Anterior = pt;
+
+ Anterior ->Next = mpe;
+ mpe ->Next = NULL;
+ }
+ break;
+ default:;
+ return FALSE;
+ }
+
+ BlessLUT(lut);
+ return TRUE;
+}
+
+// Unlink an element and return the pointer to it
+void CMSEXPORT cmsPipelineUnlinkStage(cmsPipeline* lut, cmsStageLoc loc, cmsStage** mpe)
+{
+ cmsStage *Anterior, *pt, *Last;
+ cmsStage *Unlinked = NULL;
+
+
+ // If empty LUT, there is nothing to remove
+ if (lut ->Elements == NULL) {
+ if (mpe) *mpe = NULL;
+ return;
+ }
+
+ // On depending on the strategy...
+ switch (loc) {
+
+ case cmsAT_BEGIN:
+ {
+ cmsStage* elem = lut ->Elements;
+
+ lut ->Elements = elem -> Next;
+ elem ->Next = NULL;
+ Unlinked = elem;
+
+ }
+ break;
+
+ case cmsAT_END:
+ Anterior = Last = NULL;
+ for (pt = lut ->Elements;
+ pt != NULL;
+ pt = pt -> Next) {
+ Anterior = Last;
+ Last = pt;
+ }
+
+ Unlinked = Last; // Next already points to NULL
+
+ // Truncate the chain
+ if (Anterior)
+ Anterior ->Next = NULL;
+ else
+ lut ->Elements = NULL;
+ break;
+ default:;
+ }
+
+ if (mpe)
+ *mpe = Unlinked;
+ else
+ cmsStageFree(Unlinked);
+
+ BlessLUT(lut);
+}
+
+
+// Concatenate two LUT into a new single one
+cmsBool CMSEXPORT cmsPipelineCat(cmsPipeline* l1, const cmsPipeline* l2)
+{
+ cmsStage* mpe;
+
+ // If both LUTS does not have elements, we need to inherit
+ // the number of channels
+ if (l1 ->Elements == NULL && l2 ->Elements == NULL) {
+ l1 ->InputChannels = l2 ->InputChannels;
+ l1 ->OutputChannels = l2 ->OutputChannels;
+ }
+
+ // Cat second
+ for (mpe = l2 ->Elements;
+ mpe != NULL;
+ mpe = mpe ->Next) {
+
+ // We have to dup each element
+ if (!cmsPipelineInsertStage(l1, cmsAT_END, cmsStageDup(mpe)))
+ return FALSE;
+ }
+
+ BlessLUT(l1);
+ return TRUE;
+}
+
+
+cmsBool CMSEXPORT cmsPipelineSetSaveAs8bitsFlag(cmsPipeline* lut, cmsBool On)
+{
+ cmsBool Anterior = lut ->SaveAs8Bits;
+
+ lut ->SaveAs8Bits = On;
+ return Anterior;
+}
+
+
+cmsStage* CMSEXPORT cmsPipelineGetPtrToFirstStage(const cmsPipeline* lut)
+{
+ return lut ->Elements;
+}
+
+cmsStage* CMSEXPORT cmsPipelineGetPtrToLastStage(const cmsPipeline* lut)
+{
+ cmsStage *mpe, *Anterior = NULL;
+
+ for (mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)
+ Anterior = mpe;
+
+ return Anterior;
+}
+
+cmsUInt32Number CMSEXPORT cmsPipelineStageCount(const cmsPipeline* lut)
+{
+ cmsStage *mpe;
+ cmsUInt32Number n;
+
+ for (n=0, mpe = lut ->Elements; mpe != NULL; mpe = mpe ->Next)
+ n++;
+
+ return n;
+}
+
+// This function may be used to set the optional evaluator and a block of private data. If private data is being used, an optional
+// duplicator and free functions should also be specified in order to duplicate the LUT construct. Use NULL to inhibit such functionality.
+void CMSEXPORT _cmsPipelineSetOptimizationParameters(cmsPipeline* Lut,
+ _cmsOPTeval16Fn Eval16,
+ void* PrivateData,
+ _cmsFreeUserDataFn FreePrivateDataFn,
+ _cmsDupUserDataFn DupPrivateDataFn)
+{
+
+ Lut ->Eval16Fn = Eval16;
+ Lut ->DupDataFn = DupPrivateDataFn;
+ Lut ->FreeDataFn = FreePrivateDataFn;
+ Lut ->Data = PrivateData;
+}
+
+
+// ----------------------------------------------------------- Reverse interpolation
+// Here's how it goes. The derivative Df(x) of the function f is the linear
+// transformation that best approximates f near the point x. It can be represented
+// by a matrix A whose entries are the partial derivatives of the components of f
+// with respect to all the coordinates. This is know as the Jacobian
+//
+// The best linear approximation to f is given by the matrix equation:
+//
+// y-y0 = A (x-x0)
+//
+// So, if x0 is a good "guess" for the zero of f, then solving for the zero of this
+// linear approximation will give a "better guess" for the zero of f. Thus let y=0,
+// and since y0=f(x0) one can solve the above equation for x. This leads to the
+// Newton's method formula:
+//
+// xn+1 = xn - A-1 f(xn)
+//
+// where xn+1 denotes the (n+1)-st guess, obtained from the n-th guess xn in the
+// fashion described above. Iterating this will give better and better approximations
+// if you have a "good enough" initial guess.
+
+
+#define JACOBIAN_EPSILON 0.001f
+#define INVERSION_MAX_ITERATIONS 30
+
+// Increment with reflexion on boundary
+static
+void IncDelta(cmsFloat32Number *Val)
+{
+ if (*Val < (1.0 - JACOBIAN_EPSILON))
+
+ *Val += JACOBIAN_EPSILON;
+
+ else
+ *Val -= JACOBIAN_EPSILON;
+
+}
+
+
+
+// Euclidean distance between two vectors of n elements each one
+static
+cmsFloat32Number EuclideanDistance(cmsFloat32Number a[], cmsFloat32Number b[], int n)
+{
+ cmsFloat32Number sum = 0;
+ int i;
+
+ for (i=0; i < n; i++) {
+ cmsFloat32Number dif = b[i] - a[i];
+ sum += dif * dif;
+ }
+
+ return sqrtf(sum);
+}
+
+
+// Evaluate a LUT in reverse direction. It only searches on 3->3 LUT. Uses Newton method
+//
+// x1 <- x - [J(x)]^-1 * f(x)
+//
+// lut: The LUT on where to do the search
+// Target: LabK, 3 values of Lab plus destination K which is fixed
+// Result: The obtained CMYK
+// Hint: Location where begin the search
+
+cmsBool CMSEXPORT cmsPipelineEvalReverseFloat(cmsFloat32Number Target[],
+ cmsFloat32Number Result[],
+ cmsFloat32Number Hint[],
+ const cmsPipeline* lut)
+{
+ cmsUInt32Number i, j;
+ cmsFloat64Number error, LastError = 1E20;
+ cmsFloat32Number fx[4], x[4], xd[4], fxd[4];
+ cmsVEC3 tmp, tmp2;
+ cmsMAT3 Jacobian;
+
+ // Only 3->3 and 4->3 are supported
+ if (lut ->InputChannels != 3 && lut ->InputChannels != 4) return FALSE;
+ if (lut ->OutputChannels != 3) return FALSE;
+
+ // Take the hint as starting point if specified
+ if (Hint == NULL) {
+
+ // Begin at any point, we choose 1/3 of CMY axis
+ x[0] = x[1] = x[2] = 0.3f;
+ }
+ else {
+
+ // Only copy 3 channels from hint...
+ for (j=0; j < 3; j++)
+ x[j] = Hint[j];
+ }
+
+ // If Lut is 4-dimensions, then grab target[3], which is fixed
+ if (lut ->InputChannels == 4) {
+ x[3] = Target[3];
+ }
+ else x[3] = 0; // To keep lint happy
+
+
+ // Iterate
+ for (i = 0; i < INVERSION_MAX_ITERATIONS; i++) {
+
+ // Get beginning fx
+ cmsPipelineEvalFloat(x, fx, lut);
+
+ // Compute error
+ error = EuclideanDistance(fx, Target, 3);
+
+ // If not convergent, return last safe value
+ if (error >= LastError)
+ break;
+
+ // Keep latest values
+ LastError = error;
+ for (j=0; j < lut ->InputChannels; j++)
+ Result[j] = x[j];
+
+ // Found an exact match?
+ if (error <= 0)
+ break;
+
+ // Obtain slope (the Jacobian)
+ for (j = 0; j < 3; j++) {
+
+ xd[0] = x[0];
+ xd[1] = x[1];
+ xd[2] = x[2];
+ xd[3] = x[3]; // Keep fixed channel
+
+ IncDelta(&xd[j]);
+
+ cmsPipelineEvalFloat(xd, fxd, lut);
+
+ Jacobian.v[0].n[j] = ((fxd[0] - fx[0]) / JACOBIAN_EPSILON);
+ Jacobian.v[1].n[j] = ((fxd[1] - fx[1]) / JACOBIAN_EPSILON);
+ Jacobian.v[2].n[j] = ((fxd[2] - fx[2]) / JACOBIAN_EPSILON);
+ }
+
+ // Solve system
+ tmp2.n[0] = fx[0] - Target[0];
+ tmp2.n[1] = fx[1] - Target[1];
+ tmp2.n[2] = fx[2] - Target[2];
+
+ if (!_cmsMAT3solve(&tmp, &Jacobian, &tmp2))
+ return FALSE;
+
+ // Move our guess
+ x[0] -= (cmsFloat32Number) tmp.n[0];
+ x[1] -= (cmsFloat32Number) tmp.n[1];
+ x[2] -= (cmsFloat32Number) tmp.n[2];
+
+ // Some clipping....
+ for (j=0; j < 3; j++) {
+ if (x[j] < 0) x[j] = 0;
+ else
+ if (x[j] > 1.0) x[j] = 1.0;
+ }
+ }
+
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c
new file mode 100644
index 0000000000..a4758ff662
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmd5.c
@@ -0,0 +1,343 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+
+#include "lcms2_internal.h"
+
+#ifdef CMS_USE_BIG_ENDIAN
+
+static
+void byteReverse(cmsUInt8Number * buf, cmsUInt32Number longs)
+{
+ do {
+
+ cmsUInt32Number t = _cmsAdjustEndianess32(*(cmsUInt32Number *) buf);
+ *(cmsUInt32Number *) buf = t;
+ buf += sizeof(cmsUInt32Number);
+
+ } while (--longs);
+
+}
+
+#else
+#define byteReverse(buf, len)
+#endif
+
+
+typedef struct {
+
+ cmsUInt32Number buf[4];
+ cmsUInt32Number bits[2];
+ cmsUInt8Number in[64];
+ cmsContext ContextID;
+
+} _cmsMD5;
+
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+#define STEP(f, w, x, y, z, data, s) \
+ ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
+
+
+static
+void MD5_Transform(cmsUInt32Number buf[4], cmsUInt32Number in[16])
+
+{
+ register cmsUInt32Number a, b, c, d;
+
+ a = buf[0];
+ b = buf[1];
+ c = buf[2];
+ d = buf[3];
+
+ STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+ STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+ STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
+ STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+ STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+ STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+ STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
+ STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
+ STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
+ STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+ STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+ STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+ STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
+ STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
+ STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
+ STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
+
+ STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+ STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
+ STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+ STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+ STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+ STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
+ STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+ STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+ STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+ STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+ STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+ STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+ STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+ STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+ STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+ STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+
+ STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+ STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
+ STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+ STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+ STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+ STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+ STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+ STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+ STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+ STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+ STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+ STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
+ STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+ STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+ STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+ STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+
+ STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
+ STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
+ STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+ STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+ STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+ STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+ STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+ STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+ STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+ STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+ STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
+ STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+ STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+ STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+ STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+ STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+
+ buf[0] += a;
+ buf[1] += b;
+ buf[2] += c;
+ buf[3] += d;
+}
+
+
+// Create a MD5 object
+static
+cmsHANDLE MD5alloc(cmsContext ContextID)
+{
+ _cmsMD5* ctx = (_cmsMD5*) _cmsMallocZero(ContextID, sizeof(_cmsMD5));
+ if (ctx == NULL) return NULL;
+
+ ctx ->ContextID = ContextID;
+
+ ctx->buf[0] = 0x67452301;
+ ctx->buf[1] = 0xefcdab89;
+ ctx->buf[2] = 0x98badcfe;
+ ctx->buf[3] = 0x10325476;
+
+ ctx->bits[0] = 0;
+ ctx->bits[1] = 0;
+
+ return (cmsHANDLE) ctx;
+}
+
+
+static
+void MD5add(cmsHANDLE Handle, cmsUInt8Number* buf, cmsUInt32Number len)
+{
+ _cmsMD5* ctx = (_cmsMD5*) Handle;
+ cmsUInt32Number t;
+
+ t = ctx->bits[0];
+ if ((ctx->bits[0] = t + (len << 3)) < t)
+ ctx->bits[1]++;
+
+ ctx->bits[1] += len >> 29;
+
+ t = (t >> 3) & 0x3f;
+
+ if (t) {
+
+ cmsUInt8Number *p = (cmsUInt8Number *) ctx->in + t;
+
+ t = 64 - t;
+ if (len < t) {
+ memmove(p, buf, len);
+ return;
+ }
+
+ memmove(p, buf, t);
+ byteReverse(ctx->in, 16);
+
+ MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+ buf += t;
+ len -= t;
+ }
+
+ while (len >= 64) {
+ memmove(ctx->in, buf, 64);
+ byteReverse(ctx->in, 16);
+ MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+ buf += 64;
+ len -= 64;
+ }
+
+ memmove(ctx->in, buf, len);
+}
+
+// Destroy the object and return the checksum
+static
+void MD5finish(cmsProfileID* ProfileID, cmsHANDLE Handle)
+{
+ _cmsMD5* ctx = (_cmsMD5*) Handle;
+ cmsUInt32Number count;
+ cmsUInt8Number *p;
+
+ count = (ctx->bits[0] >> 3) & 0x3F;
+
+ p = ctx->in + count;
+ *p++ = 0x80;
+
+ count = 64 - 1 - count;
+
+ if (count < 8) {
+
+ memset(p, 0, count);
+ byteReverse(ctx->in, 16);
+ MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+
+ memset(ctx->in, 0, 56);
+ } else {
+ memset(p, 0, count - 8);
+ }
+ byteReverse(ctx->in, 14);
+
+ ((cmsUInt32Number *) ctx->in)[14] = ctx->bits[0];
+ ((cmsUInt32Number *) ctx->in)[15] = ctx->bits[1];
+
+ MD5_Transform(ctx->buf, (cmsUInt32Number *) ctx->in);
+
+ byteReverse((cmsUInt8Number *) ctx->buf, 4);
+ memmove(ProfileID ->ID8, ctx->buf, 16);
+
+ _cmsFree(ctx ->ContextID, ctx);
+}
+
+
+
+// Assuming io points to an ICC profile, compute and store MD5 checksum
+// In the header, rendering intentent, attributes and ID should be set to zero
+// before computing MD5 checksum (per 6.1.13 in ICC spec)
+
+cmsBool CMSEXPORT cmsMD5computeID(cmsHPROFILE hProfile)
+{
+ cmsContext ContextID;
+ cmsUInt32Number BytesNeeded;
+ cmsUInt8Number* Mem = NULL;
+ cmsHANDLE MD5 = NULL;
+ _cmsICCPROFILE* Icc = (_cmsICCPROFILE*) hProfile;
+ _cmsICCPROFILE Keep;
+
+ _cmsAssert(hProfile != NULL);
+
+ ContextID = cmsGetProfileContextID(hProfile);
+
+ // Save a copy of the profile header
+ memmove(&Keep, Icc, sizeof(_cmsICCPROFILE));
+
+ // Set RI, attributes and ID
+ memset(&Icc ->attributes, 0, sizeof(Icc ->attributes));
+ Icc ->RenderingIntent = 0;
+ memset(&Icc ->ProfileID, 0, sizeof(Icc ->ProfileID));
+
+ // Compute needed storage
+ if (!cmsSaveProfileToMem(hProfile, NULL, &BytesNeeded)) goto Error;
+
+ // Allocate memory
+ Mem = (cmsUInt8Number*) _cmsMalloc(ContextID, BytesNeeded);
+ if (Mem == NULL) goto Error;
+
+ // Save to temporary storage
+ if (!cmsSaveProfileToMem(hProfile, Mem, &BytesNeeded)) goto Error;
+
+ // Create MD5 object
+ MD5 = MD5alloc(ContextID);
+ if (MD5 == NULL) goto Error;
+
+ // Add all bytes
+ MD5add(MD5, Mem, BytesNeeded);
+
+ // Temp storage is no longer needed
+ _cmsFree(ContextID, Mem);
+
+ // Restore header
+ memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+
+ // And store the ID
+ MD5finish(&Icc ->ProfileID, MD5);
+ return TRUE;
+
+Error:
+
+ // Free resources as something went wrong
+ // "MD5" cannot be other than NULL here, so no need to free it
+ if (Mem != NULL) _cmsFree(ContextID, Mem);
+ memmove(Icc, &Keep, sizeof(_cmsICCPROFILE));
+ return FALSE;
+}
+
+cmsBool CMSEXPORT cmsMD5computeIDExt(const void* buf, unsigned long size, unsigned char ProfileID[16])
+{
+ cmsHANDLE MD5;
+ cmsUInt8Number* Mem;
+
+ if (buf == NULL)
+ return FALSE;
+ MD5 = NULL;
+ Mem = (cmsUInt8Number*)_cmsMalloc(NULL,size);
+ memmove(Mem,buf,size);
+ // Create MD5 object
+ MD5 = MD5alloc(NULL);
+ if (MD5 == NULL) goto Error;
+
+ // Add all bytes
+ MD5add(MD5, Mem, size);
+
+ // Temp storage is no longer needed
+ _cmsFree(NULL, Mem);
+
+ // And store the ID
+ MD5finish((cmsProfileID*)ProfileID, MD5);
+ return TRUE;
+Error:
+ if (MD5 != NULL) _cmsFree(NULL, MD5);
+ return FALSE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c
new file mode 100644
index 0000000000..fb7b91caf1
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsmtrx.c
@@ -0,0 +1,175 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+#define DSWAP(x, y) {cmsFloat64Number tmp = (x); (x)=(y); (y)=tmp;}
+
+
+// Initiate a vector
+void CMSEXPORT _cmsVEC3init(cmsVEC3* r, cmsFloat64Number x, cmsFloat64Number y, cmsFloat64Number z)
+{
+ r -> n[VX] = x;
+ r -> n[VY] = y;
+ r -> n[VZ] = z;
+}
+
+// Vector substraction
+void CMSEXPORT _cmsVEC3minus(cmsVEC3* r, const cmsVEC3* a, const cmsVEC3* b)
+{
+ r -> n[VX] = a -> n[VX] - b -> n[VX];
+ r -> n[VY] = a -> n[VY] - b -> n[VY];
+ r -> n[VZ] = a -> n[VZ] - b -> n[VZ];
+}
+
+// Vector cross product
+void CMSEXPORT _cmsVEC3cross(cmsVEC3* r, const cmsVEC3* u, const cmsVEC3* v)
+{
+ r ->n[VX] = u->n[VY] * v->n[VZ] - v->n[VY] * u->n[VZ];
+ r ->n[VY] = u->n[VZ] * v->n[VX] - v->n[VZ] * u->n[VX];
+ r ->n[VZ] = u->n[VX] * v->n[VY] - v->n[VX] * u->n[VY];
+}
+
+// Vector dot product
+cmsFloat64Number CMSEXPORT _cmsVEC3dot(const cmsVEC3* u, const cmsVEC3* v)
+{
+ return u->n[VX] * v->n[VX] + u->n[VY] * v->n[VY] + u->n[VZ] * v->n[VZ];
+}
+
+// Euclidean length
+cmsFloat64Number CMSEXPORT _cmsVEC3length(const cmsVEC3* a)
+{
+ return sqrt(a ->n[VX] * a ->n[VX] +
+ a ->n[VY] * a ->n[VY] +
+ a ->n[VZ] * a ->n[VZ]);
+}
+
+// Euclidean distance
+cmsFloat64Number CMSEXPORT _cmsVEC3distance(const cmsVEC3* a, const cmsVEC3* b)
+{
+ cmsFloat64Number d1 = a ->n[VX] - b ->n[VX];
+ cmsFloat64Number d2 = a ->n[VY] - b ->n[VY];
+ cmsFloat64Number d3 = a ->n[VZ] - b ->n[VZ];
+
+ return sqrt(d1*d1 + d2*d2 + d3*d3);
+}
+
+
+
+// 3x3 Identity
+void CMSEXPORT _cmsMAT3identity(cmsMAT3* a)
+{
+ _cmsVEC3init(&a-> v[0], 1.0, 0.0, 0.0);
+ _cmsVEC3init(&a-> v[1], 0.0, 1.0, 0.0);
+ _cmsVEC3init(&a-> v[2], 0.0, 0.0, 1.0);
+}
+
+static
+cmsBool CloseEnough(cmsFloat64Number a, cmsFloat64Number b)
+{
+ return fabs(b - a) < (1.0 / 65535.0);
+}
+
+
+cmsBool CMSEXPORT _cmsMAT3isIdentity(const cmsMAT3* a)
+{
+ cmsMAT3 Identity;
+ int i, j;
+
+ _cmsMAT3identity(&Identity);
+
+ for (i=0; i < 3; i++)
+ for (j=0; j < 3; j++)
+ if (!CloseEnough(a ->v[i].n[j], Identity.v[i].n[j])) return FALSE;
+
+ return TRUE;
+}
+
+
+// Multiply two matrices
+void CMSEXPORT _cmsMAT3per(cmsMAT3* r, const cmsMAT3* a, const cmsMAT3* b)
+{
+#define ROWCOL(i, j) \
+ a->v[i].n[0]*b->v[0].n[j] + a->v[i].n[1]*b->v[1].n[j] + a->v[i].n[2]*b->v[2].n[j]
+
+ _cmsVEC3init(&r-> v[0], ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2));
+ _cmsVEC3init(&r-> v[1], ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2));
+ _cmsVEC3init(&r-> v[2], ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2));
+
+#undef ROWCOL //(i, j)
+}
+
+
+
+// Inverse of a matrix b = a^(-1)
+cmsBool CMSEXPORT _cmsMAT3inverse(const cmsMAT3* a, cmsMAT3* b)
+{
+ cmsFloat64Number det, c0, c1, c2;
+
+ c0 = a -> v[1].n[1]*a -> v[2].n[2] - a -> v[1].n[2]*a -> v[2].n[1];
+ c1 = -a -> v[1].n[0]*a -> v[2].n[2] + a -> v[1].n[2]*a -> v[2].n[0];
+ c2 = a -> v[1].n[0]*a -> v[2].n[1] - a -> v[1].n[1]*a -> v[2].n[0];
+
+ det = a -> v[0].n[0]*c0 + a -> v[0].n[1]*c1 + a -> v[0].n[2]*c2;
+
+ if (fabs(det) < MATRIX_DET_TOLERANCE) return FALSE; // singular matrix; can't invert
+
+ b -> v[0].n[0] = c0/det;
+ b -> v[0].n[1] = (a -> v[0].n[2]*a -> v[2].n[1] - a -> v[0].n[1]*a -> v[2].n[2])/det;
+ b -> v[0].n[2] = (a -> v[0].n[1]*a -> v[1].n[2] - a -> v[0].n[2]*a -> v[1].n[1])/det;
+ b -> v[1].n[0] = c1/det;
+ b -> v[1].n[1] = (a -> v[0].n[0]*a -> v[2].n[2] - a -> v[0].n[2]*a -> v[2].n[0])/det;
+ b -> v[1].n[2] = (a -> v[0].n[2]*a -> v[1].n[0] - a -> v[0].n[0]*a -> v[1].n[2])/det;
+ b -> v[2].n[0] = c2/det;
+ b -> v[2].n[1] = (a -> v[0].n[1]*a -> v[2].n[0] - a -> v[0].n[0]*a -> v[2].n[1])/det;
+ b -> v[2].n[2] = (a -> v[0].n[0]*a -> v[1].n[1] - a -> v[0].n[1]*a -> v[1].n[0])/det;
+
+ return TRUE;
+}
+
+
+// Solve a system in the form Ax = b
+cmsBool CMSEXPORT _cmsMAT3solve(cmsVEC3* x, cmsMAT3* a, cmsVEC3* b)
+{
+ cmsMAT3 m, a_1;
+
+ memmove(&m, a, sizeof(cmsMAT3));
+
+ if (!_cmsMAT3inverse(&m, &a_1)) return FALSE; // Singular matrix
+
+ _cmsMAT3eval(x, &a_1, b);
+ return TRUE;
+}
+
+// Evaluate a vector across a matrix
+void CMSEXPORT _cmsMAT3eval(cmsVEC3* r, const cmsMAT3* a, const cmsVEC3* v)
+{
+ r->n[VX] = a->v[0].n[VX]*v->n[VX] + a->v[0].n[VY]*v->n[VY] + a->v[0].n[VZ]*v->n[VZ];
+ r->n[VY] = a->v[1].n[VX]*v->n[VX] + a->v[1].n[VY]*v->n[VY] + a->v[1].n[VZ]*v->n[VZ];
+ r->n[VZ] = a->v[2].n[VX]*v->n[VX] + a->v[2].n[VY]*v->n[VY] + a->v[2].n[VZ]*v->n[VZ];
+}
+
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c
new file mode 100644
index 0000000000..acfd1c8cf9
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsnamed.c
@@ -0,0 +1,929 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2012 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Multilocalized unicode objects. That is an attempt to encapsulate i18n.
+
+
+// Allocates an empty multi localizad unicode object
+cmsMLU* CMSEXPORT cmsMLUalloc(cmsContext ContextID, cmsUInt32Number nItems)
+{
+ cmsMLU* mlu;
+
+ // nItems should be positive if given
+ if (nItems <= 0) nItems = 2;
+
+ // Create the container
+ mlu = (cmsMLU*) _cmsMallocZero(ContextID, sizeof(cmsMLU));
+ if (mlu == NULL) return NULL;
+
+ mlu ->ContextID = ContextID;
+
+ // Create entry array
+ mlu ->Entries = (_cmsMLUentry*) _cmsCalloc(ContextID, nItems, sizeof(_cmsMLUentry));
+ if (mlu ->Entries == NULL) {
+ _cmsFree(ContextID, mlu);
+ return NULL;
+ }
+
+ // Ok, keep indexes up to date
+ mlu ->AllocatedEntries = nItems;
+ mlu ->UsedEntries = 0;
+
+ return mlu;
+}
+
+
+// Grows a mempool table for a MLU. Each time this function is called, mempool size is multiplied times two.
+static
+cmsBool GrowMLUpool(cmsMLU* mlu)
+{
+ cmsUInt32Number size;
+ void *NewPtr;
+
+ // Sanity check
+ if (mlu == NULL) return FALSE;
+
+ if (mlu ->PoolSize == 0)
+ size = 256;
+ else
+ size = mlu ->PoolSize * 2;
+
+ // Check for overflow
+ if (size < mlu ->PoolSize) return FALSE;
+
+ // Reallocate the pool
+ NewPtr = _cmsRealloc(mlu ->ContextID, mlu ->MemPool, size);
+ if (NewPtr == NULL) return FALSE;
+
+
+ mlu ->MemPool = NewPtr;
+ mlu ->PoolSize = size;
+
+ return TRUE;
+}
+
+
+// Grows a entry table for a MLU. Each time this function is called, table size is multiplied times two.
+static
+cmsBool GrowMLUtable(cmsMLU* mlu)
+{
+ int AllocatedEntries;
+ _cmsMLUentry *NewPtr;
+
+ // Sanity check
+ if (mlu == NULL) return FALSE;
+
+ AllocatedEntries = mlu ->AllocatedEntries * 2;
+
+ // Check for overflow
+ if (AllocatedEntries / 2 != mlu ->AllocatedEntries) return FALSE;
+
+ // Reallocate the memory
+ NewPtr = (_cmsMLUentry*)_cmsRealloc(mlu ->ContextID, mlu ->Entries, AllocatedEntries*sizeof(_cmsMLUentry));
+ if (NewPtr == NULL) return FALSE;
+
+ mlu ->Entries = NewPtr;
+ mlu ->AllocatedEntries = AllocatedEntries;
+
+ return TRUE;
+}
+
+
+// Search for a specific entry in the structure. Language and Country are used.
+static
+int SearchMLUEntry(cmsMLU* mlu, cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)
+{
+ int i;
+
+ // Sanity check
+ if (mlu == NULL) return -1;
+
+ // Iterate whole table
+ for (i=0; i < mlu ->UsedEntries; i++) {
+
+ if (mlu ->Entries[i].Country == CountryCode &&
+ mlu ->Entries[i].Language == LanguageCode) return i;
+ }
+
+ // Not found
+ return -1;
+}
+
+// Add a block of characters to the intended MLU. Language and country are specified.
+// Only one entry for Language/country pair is allowed.
+static
+cmsBool AddMLUBlock(cmsMLU* mlu, cmsUInt32Number size, const wchar_t *Block,
+ cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode)
+{
+ cmsUInt32Number Offset;
+ cmsUInt8Number* Ptr;
+
+ // Sanity check
+ if (mlu == NULL) return FALSE;
+
+ // Is there any room available?
+ if (mlu ->UsedEntries >= mlu ->AllocatedEntries) {
+ if (!GrowMLUtable(mlu)) return FALSE;
+ }
+
+ // Only one ASCII string
+ if (SearchMLUEntry(mlu, LanguageCode, CountryCode) >= 0) return FALSE; // Only one is allowed!
+
+ // Check for size
+ while ((mlu ->PoolSize - mlu ->PoolUsed) < size) {
+
+ if (!GrowMLUpool(mlu)) return FALSE;
+ }
+
+ Offset = mlu ->PoolUsed;
+
+ Ptr = (cmsUInt8Number*) mlu ->MemPool;
+ if (Ptr == NULL) return FALSE;
+
+ // Set the entry
+ memmove(Ptr + Offset, Block, size);
+ mlu ->PoolUsed += size;
+
+ mlu ->Entries[mlu ->UsedEntries].StrW = Offset;
+ mlu ->Entries[mlu ->UsedEntries].Len = size;
+ mlu ->Entries[mlu ->UsedEntries].Country = CountryCode;
+ mlu ->Entries[mlu ->UsedEntries].Language = LanguageCode;
+ mlu ->UsedEntries++;
+
+ return TRUE;
+}
+
+
+// Add an ASCII entry.
+cmsBool CMSEXPORT cmsMLUsetASCII(cmsMLU* mlu, const char LanguageCode[3], const char CountryCode[3], const char* ASCIIString)
+{
+ cmsUInt32Number i, len = (cmsUInt32Number) strlen(ASCIIString)+1;
+ wchar_t* WStr;
+ cmsBool rc;
+ cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+ cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+ if (mlu == NULL) return FALSE;
+
+ WStr = (wchar_t*) _cmsCalloc(mlu ->ContextID, len, sizeof(wchar_t));
+ if (WStr == NULL) return FALSE;
+
+ for (i=0; i < len; i++)
+ WStr[i] = (wchar_t) ASCIIString[i];
+
+ rc = AddMLUBlock(mlu, len * sizeof(wchar_t), WStr, Lang, Cntry);
+
+ _cmsFree(mlu ->ContextID, WStr);
+ return rc;
+
+}
+
+// We don't need any wcs support library
+static
+cmsUInt32Number mywcslen(const wchar_t *s)
+{
+ const wchar_t *p;
+
+ p = s;
+ while (*p)
+ p++;
+
+ return (cmsUInt32Number)(p - s);
+}
+
+
+// Add a wide entry
+cmsBool CMSEXPORT cmsMLUsetWide(cmsMLU* mlu, const char Language[3], const char Country[3], const wchar_t* WideString)
+{
+ cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) Language);
+ cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) Country);
+ cmsUInt32Number len;
+
+ if (mlu == NULL) return FALSE;
+ if (WideString == NULL) return FALSE;
+
+ len = (cmsUInt32Number) (mywcslen(WideString) + 1) * sizeof(wchar_t);
+ return AddMLUBlock(mlu, len, WideString, Lang, Cntry);
+}
+
+// Duplicating a MLU is as easy as copying all members
+cmsMLU* CMSEXPORT cmsMLUdup(const cmsMLU* mlu)
+{
+ cmsMLU* NewMlu = NULL;
+
+ // Duplicating a NULL obtains a NULL
+ if (mlu == NULL) return NULL;
+
+ NewMlu = cmsMLUalloc(mlu ->ContextID, mlu ->UsedEntries);
+ if (NewMlu == NULL) return NULL;
+
+ // Should never happen
+ if (NewMlu ->AllocatedEntries < mlu ->UsedEntries)
+ goto Error;
+
+ // Sanitize...
+ if (NewMlu ->Entries == NULL || mlu ->Entries == NULL) goto Error;
+
+ memmove(NewMlu ->Entries, mlu ->Entries, mlu ->UsedEntries * sizeof(_cmsMLUentry));
+ NewMlu ->UsedEntries = mlu ->UsedEntries;
+
+ // The MLU may be empty
+ if (mlu ->PoolUsed == 0) {
+ NewMlu ->MemPool = NULL;
+ }
+ else {
+ // It is not empty
+ NewMlu ->MemPool = _cmsMalloc(mlu ->ContextID, mlu ->PoolUsed);
+ if (NewMlu ->MemPool == NULL) goto Error;
+ }
+
+ NewMlu ->PoolSize = mlu ->PoolUsed;
+
+ if (NewMlu ->MemPool == NULL || mlu ->MemPool == NULL) goto Error;
+
+ memmove(NewMlu ->MemPool, mlu->MemPool, mlu ->PoolUsed);
+ NewMlu ->PoolUsed = mlu ->PoolUsed;
+
+ return NewMlu;
+
+Error:
+
+ if (NewMlu != NULL) cmsMLUfree(NewMlu);
+ return NULL;
+}
+
+// Free any used memory
+void CMSEXPORT cmsMLUfree(cmsMLU* mlu)
+{
+ if (mlu) {
+
+ if (mlu -> Entries) _cmsFree(mlu ->ContextID, mlu->Entries);
+ if (mlu -> MemPool) _cmsFree(mlu ->ContextID, mlu->MemPool);
+
+ _cmsFree(mlu ->ContextID, mlu);
+ }
+}
+
+
+// The algorithm first searches for an exact match of country and language, if not found it uses
+// the Language. If none is found, first entry is used instead.
+static
+const wchar_t* _cmsMLUgetWide(const cmsMLU* mlu,
+ cmsUInt32Number *len,
+ cmsUInt16Number LanguageCode, cmsUInt16Number CountryCode,
+ cmsUInt16Number* UsedLanguageCode, cmsUInt16Number* UsedCountryCode)
+{
+ int i;
+ int Best = -1;
+ _cmsMLUentry* v;
+
+ if (mlu == NULL) return NULL;
+
+ if (mlu -> AllocatedEntries <= 0) return NULL;
+
+ for (i=0; i < mlu ->UsedEntries; i++) {
+
+ v = mlu ->Entries + i;
+
+ if (v -> Language == LanguageCode) {
+
+ if (Best == -1) Best = i;
+
+ if (v -> Country == CountryCode) {
+
+ if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+ if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country;
+
+ if (len != NULL) *len = v ->Len;
+
+ return (wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v -> StrW); // Found exact match
+ }
+ }
+ }
+
+ // No string found. Return First one
+ if (Best == -1)
+ Best = 0;
+
+ v = mlu ->Entries + Best;
+
+ if (UsedLanguageCode != NULL) *UsedLanguageCode = v ->Language;
+ if (UsedCountryCode != NULL) *UsedCountryCode = v ->Country;
+
+ if (len != NULL) *len = v ->Len;
+
+ return(wchar_t*) ((cmsUInt8Number*) mlu ->MemPool + v ->StrW);
+}
+
+
+// Obtain an ASCII representation of the wide string. Setting buffer to NULL returns the len
+cmsUInt32Number CMSEXPORT cmsMLUgetASCII(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ char* Buffer, cmsUInt32Number BufferSize)
+{
+ const wchar_t *Wide;
+ cmsUInt32Number StrLen = 0;
+ cmsUInt32Number ASCIIlen, i;
+
+ cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+ cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+ // Sanitize
+ if (mlu == NULL) return 0;
+
+ // Get WideChar
+ Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);
+ if (Wide == NULL) return 0;
+
+ ASCIIlen = StrLen / sizeof(wchar_t);
+
+ // Maybe we want only to know the len?
+ if (Buffer == NULL) return ASCIIlen + 1; // Note the zero at the end
+
+ // No buffer size means no data
+ if (BufferSize <= 0) return 0;
+
+ // Some clipping may be required
+ if (BufferSize < ASCIIlen + 1)
+ ASCIIlen = BufferSize - 1;
+
+ // Precess each character
+ for (i=0; i < ASCIIlen; i++) {
+
+ if (Wide[i] == 0)
+ Buffer[i] = 0;
+ else
+ Buffer[i] = (char) Wide[i];
+ }
+
+ // We put a termination "\0"
+ Buffer[ASCIIlen] = 0;
+ return ASCIIlen + 1;
+}
+
+// Obtain a wide representation of the MLU, on depending on current locale settings
+cmsUInt32Number CMSEXPORT cmsMLUgetWide(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ wchar_t* Buffer, cmsUInt32Number BufferSize)
+{
+ const wchar_t *Wide;
+ cmsUInt32Number StrLen = 0;
+
+ cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+ cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+
+ // Sanitize
+ if (mlu == NULL) return 0;
+
+ Wide = _cmsMLUgetWide(mlu, &StrLen, Lang, Cntry, NULL, NULL);
+ if (Wide == NULL) return 0;
+
+ // Maybe we want only to know the len?
+ if (Buffer == NULL) return StrLen + sizeof(wchar_t);
+
+ // No buffer size means no data
+ if (BufferSize <= 0) return 0;
+
+ // Some clipping may be required
+ if (BufferSize < StrLen + sizeof(wchar_t))
+ StrLen = BufferSize - + sizeof(wchar_t);
+
+ memmove(Buffer, Wide, StrLen);
+ Buffer[StrLen / sizeof(wchar_t)] = 0;
+
+ return StrLen + sizeof(wchar_t);
+}
+
+
+// Get also the language and country
+CMSAPI cmsBool CMSEXPORT cmsMLUgetTranslation(const cmsMLU* mlu,
+ const char LanguageCode[3], const char CountryCode[3],
+ char ObtainedLanguage[3], char ObtainedCountry[3])
+{
+ const wchar_t *Wide;
+
+ cmsUInt16Number Lang = _cmsAdjustEndianess16(*(cmsUInt16Number*) LanguageCode);
+ cmsUInt16Number Cntry = _cmsAdjustEndianess16(*(cmsUInt16Number*) CountryCode);
+ cmsUInt16Number ObtLang, ObtCode;
+
+ // Sanitize
+ if (mlu == NULL) return FALSE;
+
+ Wide = _cmsMLUgetWide(mlu, NULL, Lang, Cntry, &ObtLang, &ObtCode);
+ if (Wide == NULL) return FALSE;
+
+ // Get used language and code
+ *(cmsUInt16Number *)ObtainedLanguage = _cmsAdjustEndianess16(ObtLang);
+ *(cmsUInt16Number *)ObtainedCountry = _cmsAdjustEndianess16(ObtCode);
+
+ ObtainedLanguage[2] = ObtainedCountry[2] = 0;
+ return TRUE;
+}
+
+
+
+// Get the number of translations in the MLU object
+cmsUInt32Number CMSEXPORT cmsMLUtranslationsCount(const cmsMLU* mlu)
+{
+ if (mlu == NULL) return 0;
+ return mlu->UsedEntries;
+}
+
+// Get the language and country codes for a specific MLU index
+cmsBool CMSEXPORT cmsMLUtranslationsCodes(const cmsMLU* mlu,
+ cmsUInt32Number idx,
+ char LanguageCode[3],
+ char CountryCode[3])
+{
+ _cmsMLUentry *entry;
+
+ if (mlu == NULL) return FALSE;
+
+ if (idx >= (cmsUInt32Number) mlu->UsedEntries) return FALSE;
+
+ entry = &mlu->Entries[idx];
+
+ *(cmsUInt16Number *)LanguageCode = _cmsAdjustEndianess16(entry->Language);
+ *(cmsUInt16Number *)CountryCode = _cmsAdjustEndianess16(entry->Country);
+
+ return TRUE;
+}
+
+
+// Named color lists --------------------------------------------------------------------------------------------
+
+// Grow the list to keep at least NumElements
+static
+cmsBool GrowNamedColorList(cmsNAMEDCOLORLIST* v)
+{
+ cmsUInt32Number size;
+ _cmsNAMEDCOLOR * NewPtr;
+
+ if (v == NULL) return FALSE;
+
+ if (v ->Allocated == 0)
+ size = 64; // Initial guess
+ else
+ size = v ->Allocated * 2;
+
+ // Keep a maximum color lists can grow, 100K entries seems reasonable
+ if (size > 1024*100) return FALSE;
+
+ NewPtr = (_cmsNAMEDCOLOR*) _cmsRealloc(v ->ContextID, v ->List, size * sizeof(_cmsNAMEDCOLOR));
+ if (NewPtr == NULL)
+ return FALSE;
+
+ v ->List = NewPtr;
+ v ->Allocated = size;
+ return TRUE;
+}
+
+// Allocate a list for n elements
+cmsNAMEDCOLORLIST* CMSEXPORT cmsAllocNamedColorList(cmsContext ContextID, cmsUInt32Number n, cmsUInt32Number ColorantCount, const char* Prefix, const char* Suffix)
+{
+ cmsNAMEDCOLORLIST* v = (cmsNAMEDCOLORLIST*) _cmsMallocZero(ContextID, sizeof(cmsNAMEDCOLORLIST));
+
+ if (v == NULL) return NULL;
+
+ v ->List = NULL;
+ v ->nColors = 0;
+ v ->ContextID = ContextID;
+
+ while (v -> Allocated < n)
+ GrowNamedColorList(v);
+
+ strncpy(v ->Prefix, Prefix, sizeof(v ->Prefix)-1);
+ strncpy(v ->Suffix, Suffix, sizeof(v ->Suffix)-1);
+ v->Prefix[32] = v->Suffix[32] = 0;
+
+ v -> ColorantCount = ColorantCount;
+
+ return v;
+}
+
+// Free a list
+void CMSEXPORT cmsFreeNamedColorList(cmsNAMEDCOLORLIST* v)
+{
+ if (v == NULL) return;
+ if (v ->List) _cmsFree(v ->ContextID, v ->List);
+ _cmsFree(v ->ContextID, v);
+}
+
+cmsNAMEDCOLORLIST* CMSEXPORT cmsDupNamedColorList(const cmsNAMEDCOLORLIST* v)
+{
+ cmsNAMEDCOLORLIST* NewNC;
+
+ if (v == NULL) return NULL;
+
+ NewNC= cmsAllocNamedColorList(v ->ContextID, v -> nColors, v ->ColorantCount, v ->Prefix, v ->Suffix);
+ if (NewNC == NULL) return NULL;
+
+ // For really large tables we need this
+ while (NewNC ->Allocated < v ->Allocated)
+ GrowNamedColorList(NewNC);
+
+ memmove(NewNC ->Prefix, v ->Prefix, sizeof(v ->Prefix));
+ memmove(NewNC ->Suffix, v ->Suffix, sizeof(v ->Suffix));
+ NewNC ->ColorantCount = v ->ColorantCount;
+ memmove(NewNC->List, v ->List, v->nColors * sizeof(_cmsNAMEDCOLOR));
+ NewNC ->nColors = v ->nColors;
+ return NewNC;
+}
+
+
+// Append a color to a list. List pointer may change if reallocated
+cmsBool CMSEXPORT cmsAppendNamedColor(cmsNAMEDCOLORLIST* NamedColorList,
+ const char* Name,
+ cmsUInt16Number PCS[3], cmsUInt16Number Colorant[cmsMAXCHANNELS])
+{
+ cmsUInt32Number i;
+
+ if (NamedColorList == NULL) return FALSE;
+
+ if (NamedColorList ->nColors + 1 > NamedColorList ->Allocated) {
+ if (!GrowNamedColorList(NamedColorList)) return FALSE;
+ }
+
+ for (i=0; i < NamedColorList ->ColorantCount; i++)
+ NamedColorList ->List[NamedColorList ->nColors].DeviceColorant[i] = Colorant == NULL? 0 : Colorant[i];
+
+ for (i=0; i < 3; i++)
+ NamedColorList ->List[NamedColorList ->nColors].PCS[i] = PCS == NULL ? 0 : PCS[i];
+
+ if (Name != NULL) {
+
+ strncpy(NamedColorList ->List[NamedColorList ->nColors].Name, Name, cmsMAX_PATH-1);
+ NamedColorList ->List[NamedColorList ->nColors].Name[cmsMAX_PATH-1] = 0;
+
+ }
+ else
+ NamedColorList ->List[NamedColorList ->nColors].Name[0] = 0;
+
+
+ NamedColorList ->nColors++;
+ return TRUE;
+}
+
+// Returns number of elements
+cmsUInt32Number CMSEXPORT cmsNamedColorCount(const cmsNAMEDCOLORLIST* NamedColorList)
+{
+ if (NamedColorList == NULL) return 0;
+ return NamedColorList ->nColors;
+}
+
+// Info aboout a given color
+cmsBool CMSEXPORT cmsNamedColorInfo(const cmsNAMEDCOLORLIST* NamedColorList, cmsUInt32Number nColor,
+ char* Name,
+ char* Prefix,
+ char* Suffix,
+ cmsUInt16Number* PCS,
+ cmsUInt16Number* Colorant)
+{
+ if (NamedColorList == NULL) return FALSE;
+
+ if (nColor >= cmsNamedColorCount(NamedColorList)) return FALSE;
+
+ if (Name) strcpy(Name, NamedColorList->List[nColor].Name);
+ if (Prefix) strcpy(Prefix, NamedColorList->Prefix);
+ if (Suffix) strcpy(Suffix, NamedColorList->Suffix);
+ if (PCS)
+ memmove(PCS, NamedColorList ->List[nColor].PCS, 3*sizeof(cmsUInt16Number));
+
+ if (Colorant)
+ memmove(Colorant, NamedColorList ->List[nColor].DeviceColorant,
+ sizeof(cmsUInt16Number) * NamedColorList ->ColorantCount);
+
+
+ return TRUE;
+}
+
+// Search for a given color name (no prefix or suffix)
+cmsInt32Number CMSEXPORT cmsNamedColorIndex(const cmsNAMEDCOLORLIST* NamedColorList, const char* Name)
+{
+ int i, n;
+
+ if (NamedColorList == NULL) return -1;
+ n = cmsNamedColorCount(NamedColorList);
+ for (i=0; i < n; i++) {
+ if (cmsstrcasecmp(Name, NamedColorList->List[i].Name) == 0)
+ return i;
+ }
+
+ return -1;
+}
+
+// MPE support -----------------------------------------------------------------------------------------------------------------
+
+static
+void FreeNamedColorList(cmsStage* mpe)
+{
+ cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;
+ cmsFreeNamedColorList(List);
+}
+
+static
+void* DupNamedColorList(cmsStage* mpe)
+{
+ cmsNAMEDCOLORLIST* List = (cmsNAMEDCOLORLIST*) mpe ->Data;
+ return cmsDupNamedColorList(List);
+}
+
+static
+void EvalNamedColorPCS(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+ cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;
+ cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);
+
+ if (index >= NamedColorList-> nColors) {
+ cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index);
+ }
+ else {
+
+ // Named color always uses Lab
+ Out[0] = (cmsFloat32Number) (NamedColorList->List[index].PCS[0] / 65535.0);
+ Out[1] = (cmsFloat32Number) (NamedColorList->List[index].PCS[1] / 65535.0);
+ Out[2] = (cmsFloat32Number) (NamedColorList->List[index].PCS[2] / 65535.0);
+ }
+}
+
+static
+void EvalNamedColor(const cmsFloat32Number In[], cmsFloat32Number Out[], const cmsStage *mpe)
+{
+ cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) mpe ->Data;
+ cmsUInt16Number index = (cmsUInt16Number) _cmsQuickSaturateWord(In[0] * 65535.0);
+ cmsUInt32Number j;
+
+ if (index >= NamedColorList-> nColors) {
+ cmsSignalError(NamedColorList ->ContextID, cmsERROR_RANGE, "Color %d out of range; ignored", index);
+ }
+ else {
+ for (j=0; j < NamedColorList ->ColorantCount; j++)
+ Out[j] = (cmsFloat32Number) (NamedColorList->List[index].DeviceColorant[j] / 65535.0);
+ }
+}
+
+
+// Named color lookup element
+cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS)
+{
+ return _cmsStageAllocPlaceholder(NamedColorList ->ContextID,
+ cmsSigNamedColorElemType,
+ 1, UsePCS ? 3 : NamedColorList ->ColorantCount,
+ UsePCS ? EvalNamedColorPCS : EvalNamedColor,
+ DupNamedColorList,
+ FreeNamedColorList,
+ cmsDupNamedColorList(NamedColorList));
+
+}
+
+
+// Retrieve the named color list from a transform. Should be first element in the LUT
+cmsNAMEDCOLORLIST* CMSEXPORT cmsGetNamedColorList(cmsHTRANSFORM xform)
+{
+ _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+ cmsStage* mpe = v ->Lut->Elements;
+
+ if (mpe ->Type != cmsSigNamedColorElemType) return NULL;
+ return (cmsNAMEDCOLORLIST*) mpe ->Data;
+}
+
+
+// Profile sequence description routines -------------------------------------------------------------------------------------
+
+cmsSEQ* CMSEXPORT cmsAllocProfileSequenceDescription(cmsContext ContextID, cmsUInt32Number n)
+{
+ cmsSEQ* Seq;
+ cmsUInt32Number i;
+
+ if (n == 0) return NULL;
+
+ // In a absolutely arbitrary way, I hereby decide to allow a maxim of 255 profiles linked
+ // in a devicelink. It makes not sense anyway and may be used for exploits, so let's close the door!
+ if (n > 255) return NULL;
+
+ Seq = (cmsSEQ*) _cmsMallocZero(ContextID, sizeof(cmsSEQ));
+ if (Seq == NULL) return NULL;
+
+ Seq -> ContextID = ContextID;
+ Seq -> seq = (cmsPSEQDESC*) _cmsCalloc(ContextID, n, sizeof(cmsPSEQDESC));
+ Seq -> n = n;
+
+ if (Seq -> seq == NULL) {
+ _cmsFree(ContextID, Seq);
+ return NULL;
+ }
+
+ for (i=0; i < n; i++) {
+ Seq -> seq[i].Manufacturer = NULL;
+ Seq -> seq[i].Model = NULL;
+ Seq -> seq[i].Description = NULL;
+ }
+
+ return Seq;
+}
+
+void CMSEXPORT cmsFreeProfileSequenceDescription(cmsSEQ* pseq)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < pseq ->n; i++) {
+ if (pseq ->seq[i].Manufacturer != NULL) cmsMLUfree(pseq ->seq[i].Manufacturer);
+ if (pseq ->seq[i].Model != NULL) cmsMLUfree(pseq ->seq[i].Model);
+ if (pseq ->seq[i].Description != NULL) cmsMLUfree(pseq ->seq[i].Description);
+ }
+
+ if (pseq ->seq != NULL) _cmsFree(pseq ->ContextID, pseq ->seq);
+ _cmsFree(pseq -> ContextID, pseq);
+}
+
+cmsSEQ* CMSEXPORT cmsDupProfileSequenceDescription(const cmsSEQ* pseq)
+{
+ cmsSEQ *NewSeq;
+ cmsUInt32Number i;
+
+ if (pseq == NULL)
+ return NULL;
+
+ NewSeq = (cmsSEQ*) _cmsMalloc(pseq -> ContextID, sizeof(cmsSEQ));
+ if (NewSeq == NULL) return NULL;
+
+
+ NewSeq -> seq = (cmsPSEQDESC*) _cmsCalloc(pseq ->ContextID, pseq ->n, sizeof(cmsPSEQDESC));
+ if (NewSeq ->seq == NULL) goto Error;
+
+ NewSeq -> ContextID = pseq ->ContextID;
+ NewSeq -> n = pseq ->n;
+
+ for (i=0; i < pseq->n; i++) {
+
+ memmove(&NewSeq ->seq[i].attributes, &pseq ->seq[i].attributes, sizeof(cmsUInt64Number));
+
+ NewSeq ->seq[i].deviceMfg = pseq ->seq[i].deviceMfg;
+ NewSeq ->seq[i].deviceModel = pseq ->seq[i].deviceModel;
+ memmove(&NewSeq ->seq[i].ProfileID, &pseq ->seq[i].ProfileID, sizeof(cmsProfileID));
+ NewSeq ->seq[i].technology = pseq ->seq[i].technology;
+
+ NewSeq ->seq[i].Manufacturer = cmsMLUdup(pseq ->seq[i].Manufacturer);
+ NewSeq ->seq[i].Model = cmsMLUdup(pseq ->seq[i].Model);
+ NewSeq ->seq[i].Description = cmsMLUdup(pseq ->seq[i].Description);
+
+ }
+
+ return NewSeq;
+
+Error:
+
+ cmsFreeProfileSequenceDescription(NewSeq);
+ return NULL;
+}
+
+// Dictionaries --------------------------------------------------------------------------------------------------------
+
+// Dictionaries are just very simple linked lists
+
+
+typedef struct _cmsDICT_struct {
+ cmsDICTentry* head;
+ cmsContext ContextID;
+} _cmsDICT;
+
+
+// Allocate an empty dictionary
+cmsHANDLE CMSEXPORT cmsDictAlloc(cmsContext ContextID)
+{
+ _cmsDICT* dict = (_cmsDICT*) _cmsMallocZero(ContextID, sizeof(_cmsDICT));
+ if (dict == NULL) return NULL;
+
+ dict ->ContextID = ContextID;
+ return (cmsHANDLE) dict;
+
+}
+
+// Dispose resources
+void CMSEXPORT cmsDictFree(cmsHANDLE hDict)
+{
+ _cmsDICT* dict = (_cmsDICT*) hDict;
+ cmsDICTentry *entry, *next;
+
+ _cmsAssert(dict != NULL);
+
+ // Walk the list freeing all nodes
+ entry = dict ->head;
+ while (entry != NULL) {
+
+ if (entry ->DisplayName != NULL) cmsMLUfree(entry ->DisplayName);
+ if (entry ->DisplayValue != NULL) cmsMLUfree(entry ->DisplayValue);
+ if (entry ->Name != NULL) _cmsFree(dict ->ContextID, entry -> Name);
+ if (entry ->Value != NULL) _cmsFree(dict ->ContextID, entry -> Value);
+
+ // Don't fall in the habitual trap...
+ next = entry ->Next;
+ _cmsFree(dict ->ContextID, entry);
+
+ entry = next;
+ }
+
+ _cmsFree(dict ->ContextID, dict);
+}
+
+
+// Duplicate a wide char string
+static
+wchar_t* DupWcs(cmsContext ContextID, const wchar_t* ptr)
+{
+ if (ptr == NULL) return NULL;
+ return (wchar_t*) _cmsDupMem(ContextID, ptr, (mywcslen(ptr) + 1) * sizeof(wchar_t));
+}
+
+// Add a new entry to the linked list
+cmsBool CMSEXPORT cmsDictAddEntry(cmsHANDLE hDict, const wchar_t* Name, const wchar_t* Value, const cmsMLU *DisplayName, const cmsMLU *DisplayValue)
+{
+ _cmsDICT* dict = (_cmsDICT*) hDict;
+ cmsDICTentry *entry;
+
+ _cmsAssert(dict != NULL);
+ _cmsAssert(Name != NULL);
+
+ entry = (cmsDICTentry*) _cmsMallocZero(dict ->ContextID, sizeof(cmsDICTentry));
+ if (entry == NULL) return FALSE;
+
+ entry ->DisplayName = cmsMLUdup(DisplayName);
+ entry ->DisplayValue = cmsMLUdup(DisplayValue);
+ entry ->Name = DupWcs(dict ->ContextID, Name);
+ entry ->Value = DupWcs(dict ->ContextID, Value);
+
+ entry ->Next = dict ->head;
+ dict ->head = entry;
+
+ return TRUE;
+}
+
+
+// Duplicates an existing dictionary
+cmsHANDLE CMSEXPORT cmsDictDup(cmsHANDLE hDict)
+{
+ _cmsDICT* old_dict = (_cmsDICT*) hDict;
+ cmsHANDLE hNew;
+ cmsDICTentry *entry;
+
+ _cmsAssert(old_dict != NULL);
+
+ hNew = cmsDictAlloc(old_dict ->ContextID);
+ if (hNew == NULL) return NULL;
+
+ // Walk the list freeing all nodes
+ entry = old_dict ->head;
+ while (entry != NULL) {
+
+ if (!cmsDictAddEntry(hNew, entry ->Name, entry ->Value, entry ->DisplayName, entry ->DisplayValue)) {
+
+ cmsDictFree(hNew);
+ return NULL;
+ }
+
+ entry = entry -> Next;
+ }
+
+ return hNew;
+}
+
+// Get a pointer to the linked list
+const cmsDICTentry* CMSEXPORT cmsDictGetEntryList(cmsHANDLE hDict)
+{
+ _cmsDICT* dict = (_cmsDICT*) hDict;
+
+ if (dict == NULL) return NULL;
+ return dict ->head;
+}
+
+// Helper For external languages
+const cmsDICTentry* CMSEXPORT cmsDictNextEntry(const cmsDICTentry* e)
+{
+ if (e == NULL) return NULL;
+ return e ->Next;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c
new file mode 100644
index 0000000000..f885ef3f60
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsopt.c
@@ -0,0 +1,1795 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+//----------------------------------------------------------------------------------
+
+// Optimization for 8 bits, Shaper-CLUT (3 inputs only)
+typedef struct {
+
+ cmsContext ContextID;
+
+ const cmsInterpParams* p; // Tetrahedrical interpolation parameters. This is a not-owned pointer.
+
+ cmsUInt16Number rx[256], ry[256], rz[256];
+ cmsUInt32Number X0[256], Y0[256], Z0[256]; // Precomputed nodes and offsets for 8-bit input data
+
+
+} Prelin8Data;
+
+
+// Generic optimization for 16 bits Shaper-CLUT-Shaper (any inputs)
+typedef struct {
+
+ cmsContext ContextID;
+
+ // Number of channels
+ int nInputs;
+ int nOutputs;
+
+ _cmsInterpFn16 EvalCurveIn16[MAX_INPUT_DIMENSIONS]; // The maximum number of input channels is known in advance
+ cmsInterpParams* ParamsCurveIn16[MAX_INPUT_DIMENSIONS];
+
+ _cmsInterpFn16 EvalCLUT; // The evaluator for 3D grid
+ const cmsInterpParams* CLUTparams; // (not-owned pointer)
+
+
+ _cmsInterpFn16* EvalCurveOut16; // Points to an array of curve evaluators in 16 bits (not-owned pointer)
+ cmsInterpParams** ParamsCurveOut16; // Points to an array of references to interpolation params (not-owned pointer)
+
+
+} Prelin16Data;
+
+
+// Optimization for matrix-shaper in 8 bits. Numbers are operated in n.14 signed, tables are stored in 1.14 fixed
+
+typedef cmsInt32Number cmsS1Fixed14Number; // Note that this may hold more than 16 bits!
+
+#define DOUBLE_TO_1FIXED14(x) ((cmsS1Fixed14Number) floor((x) * 16384.0 + 0.5))
+
+typedef struct {
+
+ cmsContext ContextID;
+
+ cmsS1Fixed14Number Shaper1R[256]; // from 0..255 to 1.14 (0.0...1.0)
+ cmsS1Fixed14Number Shaper1G[256];
+ cmsS1Fixed14Number Shaper1B[256];
+
+ cmsS1Fixed14Number Mat[3][3]; // n.14 to n.14 (needs a saturation after that)
+ cmsS1Fixed14Number Off[3];
+
+ cmsUInt16Number Shaper2R[16385]; // 1.14 to 0..255
+ cmsUInt16Number Shaper2G[16385];
+ cmsUInt16Number Shaper2B[16385];
+
+} MatShaper8Data;
+
+// Curves, optimization is shared between 8 and 16 bits
+typedef struct {
+
+ cmsContext ContextID;
+
+ int nCurves; // Number of curves
+ int nElements; // Elements in curves
+ cmsUInt16Number** Curves; // Points to a dynamically allocated array
+
+} Curves16Data;
+
+
+// Simple optimizations ----------------------------------------------------------------------------------------------------------
+
+
+// Remove an element in linked chain
+static
+void _RemoveElement(cmsStage** head)
+{
+ cmsStage* mpe = *head;
+ cmsStage* next = mpe ->Next;
+ *head = next;
+ cmsStageFree(mpe);
+}
+
+// Remove all identities in chain. Note that pt actually is a double pointer to the element that holds the pointer.
+static
+cmsBool _Remove1Op(cmsPipeline* Lut, cmsStageSignature UnaryOp)
+{
+ cmsStage** pt = &Lut ->Elements;
+ cmsBool AnyOpt = FALSE;
+
+ while (*pt != NULL) {
+
+ if ((*pt) ->Implements == UnaryOp) {
+ _RemoveElement(pt);
+ AnyOpt = TRUE;
+ }
+ else
+ pt = &((*pt) -> Next);
+ }
+
+ return AnyOpt;
+}
+
+// Same, but only if two adjacent elements are found
+static
+cmsBool _Remove2Op(cmsPipeline* Lut, cmsStageSignature Op1, cmsStageSignature Op2)
+{
+ cmsStage** pt1;
+ cmsStage** pt2;
+ cmsBool AnyOpt = FALSE;
+
+ pt1 = &Lut ->Elements;
+ if (*pt1 == NULL) return AnyOpt;
+
+ while (*pt1 != NULL) {
+
+ pt2 = &((*pt1) -> Next);
+ if (*pt2 == NULL) return AnyOpt;
+
+ if ((*pt1) ->Implements == Op1 && (*pt2) ->Implements == Op2) {
+ _RemoveElement(pt2);
+ _RemoveElement(pt1);
+ AnyOpt = TRUE;
+ }
+ else
+ pt1 = &((*pt1) -> Next);
+ }
+
+ return AnyOpt;
+}
+
+// Preoptimize just gets rif of no-ops coming paired. Conversion from v2 to v4 followed
+// by a v4 to v2 and vice-versa. The elements are then discarded.
+static
+cmsBool PreOptimize(cmsPipeline* Lut)
+{
+ cmsBool AnyOpt = FALSE, Opt;
+
+ do {
+
+ Opt = FALSE;
+
+ // Remove all identities
+ Opt |= _Remove1Op(Lut, cmsSigIdentityElemType);
+
+ // Remove XYZ2Lab followed by Lab2XYZ
+ Opt |= _Remove2Op(Lut, cmsSigXYZ2LabElemType, cmsSigLab2XYZElemType);
+
+ // Remove Lab2XYZ followed by XYZ2Lab
+ Opt |= _Remove2Op(Lut, cmsSigLab2XYZElemType, cmsSigXYZ2LabElemType);
+
+ // Remove V4 to V2 followed by V2 to V4
+ Opt |= _Remove2Op(Lut, cmsSigLabV4toV2, cmsSigLabV2toV4);
+
+ // Remove V2 to V4 followed by V4 to V2
+ Opt |= _Remove2Op(Lut, cmsSigLabV2toV4, cmsSigLabV4toV2);
+
+ // Remove float pcs Lab conversions
+ Opt |= _Remove2Op(Lut, cmsSigLab2FloatPCS, cmsSigFloatPCS2Lab);
+
+ // Remove float pcs Lab conversions
+ Opt |= _Remove2Op(Lut, cmsSigXYZ2FloatPCS, cmsSigFloatPCS2XYZ);
+
+ if (Opt) AnyOpt = TRUE;
+
+ } while (Opt);
+
+ return AnyOpt;
+}
+
+static
+void Eval16nop1D(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const struct _cms_interp_struc* p)
+{
+ Output[0] = Input[0];
+
+ cmsUNUSED_PARAMETER(p);
+}
+
+static
+void PrelinEval16(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const void* D)
+{
+ Prelin16Data* p16 = (Prelin16Data*) D;
+ cmsUInt16Number StageABC[MAX_INPUT_DIMENSIONS];
+ cmsUInt16Number StageDEF[cmsMAXCHANNELS];
+ int i;
+
+ for (i=0; i < p16 ->nInputs; i++) {
+
+ p16 ->EvalCurveIn16[i](&Input[i], &StageABC[i], p16 ->ParamsCurveIn16[i]);
+ }
+
+ p16 ->EvalCLUT(StageABC, StageDEF, p16 ->CLUTparams);
+
+ for (i=0; i < p16 ->nOutputs; i++) {
+
+ p16 ->EvalCurveOut16[i](&StageDEF[i], &Output[i], p16 ->ParamsCurveOut16[i]);
+ }
+}
+
+
+static
+void PrelinOpt16free(cmsContext ContextID, void* ptr)
+{
+ Prelin16Data* p16 = (Prelin16Data*) ptr;
+
+ _cmsFree(ContextID, p16 ->EvalCurveOut16);
+ _cmsFree(ContextID, p16 ->ParamsCurveOut16);
+
+ _cmsFree(ContextID, p16);
+}
+
+static
+void* Prelin16dup(cmsContext ContextID, const void* ptr)
+{
+ Prelin16Data* p16 = (Prelin16Data*) ptr;
+ Prelin16Data* Duped = _cmsDupMem(ContextID, p16, sizeof(Prelin16Data));
+
+ if (Duped == NULL) return NULL;
+
+ Duped ->EvalCurveOut16 = (_cmsInterpFn16*)_cmsDupMem(ContextID, p16 ->EvalCurveOut16, p16 ->nOutputs * sizeof(_cmsInterpFn16));
+ Duped ->ParamsCurveOut16 = (cmsInterpParams**)_cmsDupMem(ContextID, p16 ->ParamsCurveOut16, p16 ->nOutputs * sizeof(cmsInterpParams* ));
+
+ return Duped;
+}
+
+
+static
+Prelin16Data* PrelinOpt16alloc(cmsContext ContextID,
+ const cmsInterpParams* ColorMap,
+ int nInputs, cmsToneCurve** In,
+ int nOutputs, cmsToneCurve** Out )
+{
+ int i;
+ Prelin16Data* p16 = _cmsMallocZero(ContextID, sizeof(Prelin16Data));
+ if (p16 == NULL) return NULL;
+
+ p16 ->nInputs = nInputs;
+ p16 -> nOutputs = nOutputs;
+
+
+ for (i=0; i < nInputs; i++) {
+
+ if (In == NULL) {
+ p16 -> ParamsCurveIn16[i] = NULL;
+ p16 -> EvalCurveIn16[i] = Eval16nop1D;
+
+ }
+ else {
+ p16 -> ParamsCurveIn16[i] = In[i] ->InterpParams;
+ p16 -> EvalCurveIn16[i] = p16 ->ParamsCurveIn16[i]->Interpolation.Lerp16;
+ }
+ }
+
+ p16 ->CLUTparams = ColorMap;
+ p16 ->EvalCLUT = ColorMap ->Interpolation.Lerp16;
+
+
+ p16 -> EvalCurveOut16 = (_cmsInterpFn16*) _cmsCalloc(ContextID, nOutputs, sizeof(_cmsInterpFn16));
+ p16 -> ParamsCurveOut16 = (cmsInterpParams**) _cmsCalloc(ContextID, nOutputs, sizeof(cmsInterpParams* ));
+
+ for (i=0; i < nOutputs; i++) {
+
+ if (Out == NULL) {
+ p16 ->ParamsCurveOut16[i] = NULL;
+ p16 -> EvalCurveOut16[i] = Eval16nop1D;
+ }
+ else {
+
+ p16 ->ParamsCurveOut16[i] = Out[i] ->InterpParams;
+ p16 -> EvalCurveOut16[i] = p16 ->ParamsCurveOut16[i]->Interpolation.Lerp16;
+ }
+ }
+
+ return p16;
+}
+
+
+
+// Resampling ---------------------------------------------------------------------------------
+
+#define PRELINEARIZATION_POINTS 4096
+
+// Sampler implemented by another LUT. This is a clean way to precalculate the devicelink 3D CLUT for
+// almost any transform. We use floating point precision and then convert from floating point to 16 bits.
+static
+int XFormSampler16(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ cmsPipeline* Lut = (cmsPipeline*) Cargo;
+ cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];
+ cmsUInt32Number i;
+
+ _cmsAssert(Lut -> InputChannels < cmsMAXCHANNELS);
+ _cmsAssert(Lut -> OutputChannels < cmsMAXCHANNELS);
+
+ // From 16 bit to floating point
+ for (i=0; i < Lut ->InputChannels; i++)
+ InFloat[i] = (cmsFloat32Number) (In[i] / 65535.0);
+
+ // Evaluate in floating point
+ cmsPipelineEvalFloat(InFloat, OutFloat, Lut);
+
+ // Back to 16 bits representation
+ for (i=0; i < Lut ->OutputChannels; i++)
+ Out[i] = _cmsQuickSaturateWord(OutFloat[i] * 65535.0);
+
+ // Always succeed
+ return TRUE;
+}
+
+// Try to see if the curves of a given MPE are linear
+static
+cmsBool AllCurvesAreLinear(cmsStage* mpe)
+{
+ cmsToneCurve** Curves;
+ cmsUInt32Number i, n;
+
+ Curves = _cmsStageGetPtrToCurveSet(mpe);
+ if (Curves == NULL) return FALSE;
+
+ n = cmsStageOutputChannels(mpe);
+
+ for (i=0; i < n; i++) {
+ if (!cmsIsToneCurveLinear(Curves[i])) return FALSE;
+ }
+
+ return TRUE;
+}
+
+// This function replaces a specific node placed in "At" by the "Value" numbers. Its purpose
+// is to fix scum dot on broken profiles/transforms. Works on 1, 3 and 4 channels
+static
+cmsBool PatchLUT(cmsStage* CLUT, cmsUInt16Number At[], cmsUInt16Number Value[],
+ int nChannelsOut, int nChannelsIn)
+{
+ _cmsStageCLutData* Grid = (_cmsStageCLutData*) CLUT ->Data;
+ cmsInterpParams* p16 = Grid ->Params;
+ cmsFloat64Number px, py, pz, pw;
+ int x0, y0, z0, w0;
+ int i, index;
+
+ if (CLUT -> Type != cmsSigCLutElemType) {
+ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) Attempt to PatchLUT on non-lut stage");
+ return FALSE;
+ }
+
+ if (nChannelsIn != 1 && nChannelsIn != 3 && nChannelsIn != 4) {
+ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
+ return FALSE;
+ }
+ if (nChannelsIn == 4) {
+
+ px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+ py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;
+ pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;
+ pw = ((cmsFloat64Number) At[3] * (p16->Domain[3])) / 65535.0;
+
+ x0 = (int) floor(px);
+ y0 = (int) floor(py);
+ z0 = (int) floor(pz);
+ w0 = (int) floor(pw);
+
+ if (((px - x0) != 0) ||
+ ((py - y0) != 0) ||
+ ((pz - z0) != 0) ||
+ ((pw - w0) != 0)) return FALSE; // Not on exact node
+
+ index = p16 -> opta[3] * x0 +
+ p16 -> opta[2] * y0 +
+ p16 -> opta[1] * z0 +
+ p16 -> opta[0] * w0;
+ }
+ else
+ if (nChannelsIn == 3) {
+
+ px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+ py = ((cmsFloat64Number) At[1] * (p16->Domain[1])) / 65535.0;
+ pz = ((cmsFloat64Number) At[2] * (p16->Domain[2])) / 65535.0;
+
+ x0 = (int) floor(px);
+ y0 = (int) floor(py);
+ z0 = (int) floor(pz);
+
+ if (((px - x0) != 0) ||
+ ((py - y0) != 0) ||
+ ((pz - z0) != 0)) return FALSE; // Not on exact node
+
+ index = p16 -> opta[2] * x0 +
+ p16 -> opta[1] * y0 +
+ p16 -> opta[0] * z0;
+ }
+ else
+ if (nChannelsIn == 1) {
+
+ px = ((cmsFloat64Number) At[0] * (p16->Domain[0])) / 65535.0;
+
+ x0 = (int) floor(px);
+
+ if (((px - x0) != 0)) return FALSE; // Not on exact node
+
+ index = p16 -> opta[0] * x0;
+ }
+ else {
+ cmsSignalError(CLUT->ContextID, cmsERROR_INTERNAL, "(internal) %d Channels are not supported on PatchLUT", nChannelsIn);
+ return FALSE;
+ }
+
+ for (i=0; i < nChannelsOut; i++)
+ Grid -> Tab.T[index + i] = Value[i];
+
+ return TRUE;
+}
+
+// Auxiliar, to see if two values are equal or very different
+static
+cmsBool WhitesAreEqual(int n, cmsUInt16Number White1[], cmsUInt16Number White2[] )
+{
+ int i;
+
+ for (i=0; i < n; i++) {
+
+ if (abs(White1[i] - White2[i]) > 0xf000) return TRUE; // Values are so extremly different that the fixup should be avoided
+ if (White1[i] != White2[i]) return FALSE;
+ }
+ return TRUE;
+}
+
+
+// Locate the node for the white point and fix it to pure white in order to avoid scum dot.
+static
+cmsBool FixWhiteMisalignment(cmsPipeline* Lut, cmsColorSpaceSignature EntryColorSpace, cmsColorSpaceSignature ExitColorSpace)
+{
+ cmsUInt16Number *WhitePointIn, *WhitePointOut;
+ cmsUInt16Number WhiteIn[cmsMAXCHANNELS], WhiteOut[cmsMAXCHANNELS], ObtainedOut[cmsMAXCHANNELS];
+ cmsUInt32Number i, nOuts, nIns;
+ cmsStage *PreLin = NULL, *CLUT = NULL, *PostLin = NULL;
+
+ if (!_cmsEndPointsBySpace(EntryColorSpace,
+ &WhitePointIn, NULL, &nIns)) return FALSE;
+
+ if (!_cmsEndPointsBySpace(ExitColorSpace,
+ &WhitePointOut, NULL, &nOuts)) return FALSE;
+
+ // It needs to be fixed?
+ if (Lut ->InputChannels != nIns) return FALSE;
+ if (Lut ->OutputChannels != nOuts) return FALSE;
+
+ cmsPipelineEval16(WhitePointIn, ObtainedOut, Lut);
+
+ if (WhitesAreEqual(nOuts, WhitePointOut, ObtainedOut)) return TRUE; // whites already match
+
+ // Check if the LUT comes as Prelin, CLUT or Postlin. We allow all combinations
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &PreLin, &CLUT, &PostLin))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCurveSetElemType, cmsSigCLutElemType, &PreLin, &CLUT))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 2, cmsSigCLutElemType, cmsSigCurveSetElemType, &CLUT, &PostLin))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCLutElemType, &CLUT))
+ return FALSE;
+
+ // We need to interpolate white points of both, pre and post curves
+ if (PreLin) {
+
+ cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PreLin);
+
+ for (i=0; i < nIns; i++) {
+ WhiteIn[i] = cmsEvalToneCurve16(Curves[i], WhitePointIn[i]);
+ }
+ }
+ else {
+ for (i=0; i < nIns; i++)
+ WhiteIn[i] = WhitePointIn[i];
+ }
+
+ // If any post-linearization, we need to find how is represented white before the curve, do
+ // a reverse interpolation in this case.
+ if (PostLin) {
+
+ cmsToneCurve** Curves = _cmsStageGetPtrToCurveSet(PostLin);
+
+ for (i=0; i < nOuts; i++) {
+
+ cmsToneCurve* InversePostLin = cmsReverseToneCurve(Curves[i]);
+ if (InversePostLin == NULL) {
+ WhiteOut[i] = WhitePointOut[i];
+
+ } else {
+
+ WhiteOut[i] = cmsEvalToneCurve16(InversePostLin, WhitePointOut[i]);
+ cmsFreeToneCurve(InversePostLin);
+ }
+ }
+ }
+ else {
+ for (i=0; i < nOuts; i++)
+ WhiteOut[i] = WhitePointOut[i];
+ }
+
+ // Ok, proceed with patching. May fail and we don't care if it fails
+ PatchLUT(CLUT, WhiteIn, WhiteOut, nOuts, nIns);
+
+ return TRUE;
+}
+
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+// This function creates simple LUT from complex ones. The generated LUT has an optional set of
+// prelinearization curves, a CLUT of nGridPoints and optional postlinearization tables.
+// These curves have to exist in the original LUT in order to be used in the simplified output.
+// Caller may also use the flags to allow this feature.
+// LUTS with all curves will be simplified to a single curve. Parametric curves are lost.
+// This function should be used on 16-bits LUTS only, as floating point losses precision when simplified
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+
+static
+cmsBool OptimizeByResampling(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+ cmsPipeline* Src = NULL;
+ cmsPipeline* Dest = NULL;
+ cmsStage* mpe;
+ cmsStage* CLUT;
+ cmsStage *KeepPreLin = NULL, *KeepPostLin = NULL;
+ int nGridPoints;
+ cmsColorSpaceSignature ColorSpace, OutputColorSpace;
+ cmsStage *NewPreLin = NULL;
+ cmsStage *NewPostLin = NULL;
+ _cmsStageCLutData* DataCLUT;
+ cmsToneCurve** DataSetIn;
+ cmsToneCurve** DataSetOut;
+ Prelin16Data* p16;
+
+ // This is a loosy optimization! does not apply in floating-point cases
+ if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+ ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));
+ OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));
+ nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
+
+ // For empty LUTs, 2 points are enough
+ if (cmsPipelineStageCount(*Lut) == 0)
+ nGridPoints = 2;
+
+ Src = *Lut;
+
+ // Named color pipelines cannot be optimized either
+ for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+ mpe != NULL;
+ mpe = cmsStageNext(mpe)) {
+ if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
+ }
+
+ // Allocate an empty LUT
+ Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+ if (!Dest) return FALSE;
+
+ // Prelinearization tables are kept unless indicated by flags
+ if (*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION) {
+
+ // Get a pointer to the prelinearization element
+ cmsStage* PreLin = cmsPipelineGetPtrToFirstStage(Src);
+
+ // Check if suitable
+ if (PreLin ->Type == cmsSigCurveSetElemType) {
+
+ // Maybe this is a linear tram, so we can avoid the whole stuff
+ if (!AllCurvesAreLinear(PreLin)) {
+
+ // All seems ok, proceed.
+ NewPreLin = cmsStageDup(PreLin);
+ if(!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, NewPreLin))
+ goto Error;
+
+ // Remove prelinearization. Since we have duplicated the curve
+ // in destination LUT, the sampling shoud be applied after this stage.
+ cmsPipelineUnlinkStage(Src, cmsAT_BEGIN, &KeepPreLin);
+ }
+ }
+ }
+
+ // Allocate the CLUT
+ CLUT = cmsStageAllocCLut16bit(Src ->ContextID, nGridPoints, Src ->InputChannels, Src->OutputChannels, NULL);
+ if (CLUT == NULL) return FALSE;
+
+ // Add the CLUT to the destination LUT
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, CLUT)) {
+ goto Error;
+ }
+
+ // Postlinearization tables are kept unless indicated by flags
+ if (*dwFlags & cmsFLAGS_CLUT_POST_LINEARIZATION) {
+
+ // Get a pointer to the postlinearization if present
+ cmsStage* PostLin = cmsPipelineGetPtrToLastStage(Src);
+
+ // Check if suitable
+ if (cmsStageType(PostLin) == cmsSigCurveSetElemType) {
+
+ // Maybe this is a linear tram, so we can avoid the whole stuff
+ if (!AllCurvesAreLinear(PostLin)) {
+
+ // All seems ok, proceed.
+ NewPostLin = cmsStageDup(PostLin);
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, NewPostLin))
+ goto Error;
+
+ // In destination LUT, the sampling shoud be applied after this stage.
+ cmsPipelineUnlinkStage(Src, cmsAT_END, &KeepPostLin);
+ }
+ }
+ }
+
+ // Now its time to do the sampling. We have to ignore pre/post linearization
+ // The source LUT whithout pre/post curves is passed as parameter.
+ if (!cmsStageSampleCLut16bit(CLUT, XFormSampler16, (void*) Src, 0)) {
+Error:
+ // Ops, something went wrong, Restore stages
+ if (KeepPreLin != NULL) {
+ if (!cmsPipelineInsertStage(Src, cmsAT_BEGIN, KeepPreLin)) {
+ _cmsAssert(0); // This never happens
+ }
+ }
+ if (KeepPostLin != NULL) {
+ if (!cmsPipelineInsertStage(Src, cmsAT_END, KeepPostLin)) {
+ _cmsAssert(0); // This never happens
+ }
+ }
+ cmsPipelineFree(Dest);
+ return FALSE;
+ }
+
+ // Done.
+
+ if (KeepPreLin != NULL) cmsStageFree(KeepPreLin);
+ if (KeepPostLin != NULL) cmsStageFree(KeepPostLin);
+ cmsPipelineFree(Src);
+
+ DataCLUT = (_cmsStageCLutData*) CLUT ->Data;
+
+ if (NewPreLin == NULL) DataSetIn = NULL;
+ else DataSetIn = ((_cmsStageToneCurvesData*) NewPreLin ->Data) ->TheCurves;
+
+ if (NewPostLin == NULL) DataSetOut = NULL;
+ else DataSetOut = ((_cmsStageToneCurvesData*) NewPostLin ->Data) ->TheCurves;
+
+
+ if (DataSetIn == NULL && DataSetOut == NULL) {
+
+ _cmsPipelineSetOptimizationParameters(Dest, (_cmsOPTeval16Fn) DataCLUT->Params->Interpolation.Lerp16, DataCLUT->Params, NULL, NULL);
+ }
+ else {
+
+ p16 = PrelinOpt16alloc(Dest ->ContextID,
+ DataCLUT ->Params,
+ Dest ->InputChannels,
+ DataSetIn,
+ Dest ->OutputChannels,
+ DataSetOut);
+
+ _cmsPipelineSetOptimizationParameters(Dest, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
+ }
+
+
+ // Don't fix white on absolute colorimetric
+ if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+ *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;
+
+ if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {
+
+ FixWhiteMisalignment(Dest, ColorSpace, OutputColorSpace);
+ }
+
+ *Lut = Dest;
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(Intent);
+}
+
+
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+// Fixes the gamma balancing of transform. This is described in my paper "Prelinearization Stages on
+// Color-Management Application-Specific Integrated Circuits (ASICs)" presented at NIP24. It only works
+// for RGB transforms. See the paper for more details
+// -----------------------------------------------------------------------------------------------------------------------------------------------
+
+
+// Normalize endpoints by slope limiting max and min. This assures endpoints as well.
+// Descending curves are handled as well.
+static
+void SlopeLimiting(cmsToneCurve* g)
+{
+ int BeginVal, EndVal;
+ int AtBegin = (int) floor((cmsFloat64Number) g ->nEntries * 0.02 + 0.5); // Cutoff at 2%
+ int AtEnd = g ->nEntries - AtBegin - 1; // And 98%
+ cmsFloat64Number Val, Slope, beta;
+ int i;
+
+ if (cmsIsToneCurveDescending(g)) {
+ BeginVal = 0xffff; EndVal = 0;
+ }
+ else {
+ BeginVal = 0; EndVal = 0xffff;
+ }
+
+ // Compute slope and offset for begin of curve
+ Val = g ->Table16[AtBegin];
+ Slope = (Val - BeginVal) / AtBegin;
+ beta = Val - Slope * AtBegin;
+
+ for (i=0; i < AtBegin; i++)
+ g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);
+
+ // Compute slope and offset for the end
+ Val = g ->Table16[AtEnd];
+ Slope = (EndVal - Val) / AtBegin; // AtBegin holds the X interval, which is same in both cases
+ beta = Val - Slope * AtEnd;
+
+ for (i = AtEnd; i < (int) g ->nEntries; i++)
+ g ->Table16[i] = _cmsQuickSaturateWord(i * Slope + beta);
+}
+
+
+// Precomputes tables for 8-bit on input devicelink.
+static
+Prelin8Data* PrelinOpt8alloc(cmsContext ContextID, const cmsInterpParams* p, cmsToneCurve* G[3])
+{
+ int i;
+ cmsUInt16Number Input[3];
+ cmsS15Fixed16Number v1, v2, v3;
+ Prelin8Data* p8;
+
+ p8 = (Prelin8Data*)_cmsMallocZero(ContextID, sizeof(Prelin8Data));
+ if (p8 == NULL) return NULL;
+
+ // Since this only works for 8 bit input, values comes always as x * 257,
+ // we can safely take msb byte (x << 8 + x)
+
+ for (i=0; i < 256; i++) {
+
+ if (G != NULL) {
+
+ // Get 16-bit representation
+ Input[0] = cmsEvalToneCurve16(G[0], FROM_8_TO_16(i));
+ Input[1] = cmsEvalToneCurve16(G[1], FROM_8_TO_16(i));
+ Input[2] = cmsEvalToneCurve16(G[2], FROM_8_TO_16(i));
+ }
+ else {
+ Input[0] = FROM_8_TO_16(i);
+ Input[1] = FROM_8_TO_16(i);
+ Input[2] = FROM_8_TO_16(i);
+ }
+
+
+ // Move to 0..1.0 in fixed domain
+ v1 = _cmsToFixedDomain(Input[0] * p -> Domain[0]);
+ v2 = _cmsToFixedDomain(Input[1] * p -> Domain[1]);
+ v3 = _cmsToFixedDomain(Input[2] * p -> Domain[2]);
+
+ // Store the precalculated table of nodes
+ p8 ->X0[i] = (p->opta[2] * FIXED_TO_INT(v1));
+ p8 ->Y0[i] = (p->opta[1] * FIXED_TO_INT(v2));
+ p8 ->Z0[i] = (p->opta[0] * FIXED_TO_INT(v3));
+
+ // Store the precalculated table of offsets
+ p8 ->rx[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v1);
+ p8 ->ry[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v2);
+ p8 ->rz[i] = (cmsUInt16Number) FIXED_REST_TO_INT(v3);
+ }
+
+ p8 ->ContextID = ContextID;
+ p8 ->p = p;
+
+ return p8;
+}
+
+static
+void Prelin8free(cmsContext ContextID, void* ptr)
+{
+ _cmsFree(ContextID, ptr);
+}
+
+static
+void* Prelin8dup(cmsContext ContextID, const void* ptr)
+{
+ return _cmsDupMem(ContextID, ptr, sizeof(Prelin8Data));
+}
+
+
+
+// A optimized interpolation for 8-bit input.
+#define DENS(i,j,k) (LutTable[(i)+(j)+(k)+OutChan])
+static
+void PrelinEval8(register const cmsUInt16Number Input[],
+ register cmsUInt16Number Output[],
+ register const void* D)
+{
+
+ cmsUInt8Number r, g, b;
+ cmsS15Fixed16Number rx, ry, rz;
+ cmsS15Fixed16Number c0, c1, c2, c3, Rest;
+ int OutChan;
+ register cmsS15Fixed16Number X0, X1, Y0, Y1, Z0, Z1;
+ Prelin8Data* p8 = (Prelin8Data*) D;
+ register const cmsInterpParams* p = p8 ->p;
+ int TotalOut = p -> nOutputs;
+ const cmsUInt16Number* LutTable = (const cmsUInt16Number*)p -> Table;
+
+ r = Input[0] >> 8;
+ g = Input[1] >> 8;
+ b = Input[2] >> 8;
+
+ X0 = X1 = p8->X0[r];
+ Y0 = Y1 = p8->Y0[g];
+ Z0 = Z1 = p8->Z0[b];
+
+ rx = p8 ->rx[r];
+ ry = p8 ->ry[g];
+ rz = p8 ->rz[b];
+
+ X1 = X0 + ((rx == 0) ? 0 : p ->opta[2]);
+ Y1 = Y0 + ((ry == 0) ? 0 : p ->opta[1]);
+ Z1 = Z0 + ((rz == 0) ? 0 : p ->opta[0]);
+
+
+ // These are the 6 Tetrahedral
+ for (OutChan=0; OutChan < TotalOut; OutChan++) {
+
+ c0 = DENS(X0, Y0, Z0);
+
+ if (rx >= ry && ry >= rz)
+ {
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z0) - DENS(X1, Y0, Z0);
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+ }
+ else
+ if (rx >= rz && rz >= ry)
+ {
+ c1 = DENS(X1, Y0, Z0) - c0;
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X1, Y0, Z1) - DENS(X1, Y0, Z0);
+ }
+ else
+ if (rz >= rx && rx >= ry)
+ {
+ c1 = DENS(X1, Y0, Z1) - DENS(X0, Y0, Z1);
+ c2 = DENS(X1, Y1, Z1) - DENS(X1, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+ }
+ else
+ if (ry >= rx && rx >= rz)
+ {
+ c1 = DENS(X1, Y1, Z0) - DENS(X0, Y1, Z0);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X1, Y1, Z1) - DENS(X1, Y1, Z0);
+ }
+ else
+ if (ry >= rz && rz >= rx)
+ {
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z0) - c0;
+ c3 = DENS(X0, Y1, Z1) - DENS(X0, Y1, Z0);
+ }
+ else
+ if (rz >= ry && ry >= rx)
+ {
+ c1 = DENS(X1, Y1, Z1) - DENS(X0, Y1, Z1);
+ c2 = DENS(X0, Y1, Z1) - DENS(X0, Y0, Z1);
+ c3 = DENS(X0, Y0, Z1) - c0;
+ }
+ else {
+ c1 = c2 = c3 = 0;
+ }
+
+
+ Rest = c1 * rx + c2 * ry + c3 * rz + 0x8001;
+ Output[OutChan] = (cmsUInt16Number)c0 + ((Rest + (Rest>>16))>>16);
+
+ }
+}
+
+#undef DENS
+
+
+// Curves that contain wide empty areas are not optimizeable
+static
+cmsBool IsDegenerated(const cmsToneCurve* g)
+{
+ int i, Zeros = 0, Poles = 0;
+ int nEntries = g ->nEntries;
+
+ for (i=0; i < nEntries; i++) {
+
+ if (g ->Table16[i] == 0x0000) Zeros++;
+ if (g ->Table16[i] == 0xffff) Poles++;
+ }
+
+ if (Zeros == 1 && Poles == 1) return FALSE; // For linear tables
+ if (Zeros > (nEntries / 4)) return TRUE; // Degenerated, mostly zeros
+ if (Poles > (nEntries / 4)) return TRUE; // Degenerated, mostly poles
+
+ return FALSE;
+}
+
+// --------------------------------------------------------------------------------------------------------------
+// We need xput over here
+
+static
+cmsBool OptimizeByComputingLinearization(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+ cmsPipeline* OriginalLut;
+ int nGridPoints;
+ cmsToneCurve *Trans[cmsMAXCHANNELS], *TransReverse[cmsMAXCHANNELS];
+ cmsUInt32Number t, i;
+ cmsFloat32Number v, In[cmsMAXCHANNELS], Out[cmsMAXCHANNELS];
+ cmsBool lIsSuitable, lIsLinear;
+ cmsPipeline* OptimizedLUT = NULL, *LutPlusCurves = NULL;
+ cmsStage* OptimizedCLUTmpe;
+ cmsColorSpaceSignature ColorSpace, OutputColorSpace;
+ cmsStage* OptimizedPrelinMpe;
+ cmsStage* mpe;
+ cmsToneCurve** OptimizedPrelinCurves;
+ _cmsStageCLutData* OptimizedPrelinCLUT;
+
+
+ // This is a loosy optimization! does not apply in floating-point cases
+ if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+ // Only on RGB
+ if (T_COLORSPACE(*InputFormat) != PT_RGB) return FALSE;
+ if (T_COLORSPACE(*OutputFormat) != PT_RGB) return FALSE;
+
+
+ // On 16 bits, user has to specify the feature
+ if (!_cmsFormatterIs8bit(*InputFormat)) {
+ if (!(*dwFlags & cmsFLAGS_CLUT_PRE_LINEARIZATION)) return FALSE;
+ }
+
+ OriginalLut = *Lut;
+
+ // Named color pipelines cannot be optimized either
+ for (mpe = cmsPipelineGetPtrToFirstStage(OriginalLut);
+ mpe != NULL;
+ mpe = cmsStageNext(mpe)) {
+ if (cmsStageType(mpe) == cmsSigNamedColorElemType) return FALSE;
+ }
+
+ ColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*InputFormat));
+ OutputColorSpace = _cmsICCcolorSpace(T_COLORSPACE(*OutputFormat));
+ nGridPoints = _cmsReasonableGridpointsByColorspace(ColorSpace, *dwFlags);
+
+ // Empty gamma containers
+ memset(Trans, 0, sizeof(Trans));
+ memset(TransReverse, 0, sizeof(TransReverse));
+
+ for (t = 0; t < OriginalLut ->InputChannels; t++) {
+ Trans[t] = cmsBuildTabulatedToneCurve16(OriginalLut ->ContextID, PRELINEARIZATION_POINTS, NULL);
+ if (Trans[t] == NULL) goto Error;
+ }
+
+ // Populate the curves
+ for (i=0; i < PRELINEARIZATION_POINTS; i++) {
+
+ v = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));
+
+ // Feed input with a gray ramp
+ for (t=0; t < OriginalLut ->InputChannels; t++)
+ In[t] = v;
+
+ // Evaluate the gray value
+ cmsPipelineEvalFloat(In, Out, OriginalLut);
+
+ // Store result in curve
+ for (t=0; t < OriginalLut ->InputChannels; t++)
+ Trans[t] ->Table16[i] = _cmsQuickSaturateWord(Out[t] * 65535.0);
+ }
+
+ // Slope-limit the obtained curves
+ for (t = 0; t < OriginalLut ->InputChannels; t++)
+ SlopeLimiting(Trans[t]);
+
+ // Check for validity
+ lIsSuitable = TRUE;
+ lIsLinear = TRUE;
+ for (t=0; (lIsSuitable && (t < OriginalLut ->InputChannels)); t++) {
+
+ // Exclude if already linear
+ if (!cmsIsToneCurveLinear(Trans[t]))
+ lIsLinear = FALSE;
+
+ // Exclude if non-monotonic
+ if (!cmsIsToneCurveMonotonic(Trans[t]))
+ lIsSuitable = FALSE;
+
+ if (IsDegenerated(Trans[t]))
+ lIsSuitable = FALSE;
+ }
+
+ // If it is not suitable, just quit
+ if (!lIsSuitable) goto Error;
+
+ // Invert curves if possible
+ for (t = 0; t < OriginalLut ->InputChannels; t++) {
+ TransReverse[t] = cmsReverseToneCurveEx(PRELINEARIZATION_POINTS, Trans[t]);
+ if (TransReverse[t] == NULL) goto Error;
+ }
+
+ // Now inset the reversed curves at the begin of transform
+ LutPlusCurves = cmsPipelineDup(OriginalLut);
+ if (LutPlusCurves == NULL) goto Error;
+
+ if (!cmsPipelineInsertStage(LutPlusCurves, cmsAT_BEGIN, cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, TransReverse)))
+ goto Error;
+
+ // Create the result LUT
+ OptimizedLUT = cmsPipelineAlloc(OriginalLut ->ContextID, OriginalLut ->InputChannels, OriginalLut ->OutputChannels);
+ if (OptimizedLUT == NULL) goto Error;
+
+ OptimizedPrelinMpe = cmsStageAllocToneCurves(OriginalLut ->ContextID, OriginalLut ->InputChannels, Trans);
+
+ // Create and insert the curves at the beginning
+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_BEGIN, OptimizedPrelinMpe))
+ goto Error;
+
+ // Allocate the CLUT for result
+ OptimizedCLUTmpe = cmsStageAllocCLut16bit(OriginalLut ->ContextID, nGridPoints, OriginalLut ->InputChannels, OriginalLut ->OutputChannels, NULL);
+
+ // Add the CLUT to the destination LUT
+ if (!cmsPipelineInsertStage(OptimizedLUT, cmsAT_END, OptimizedCLUTmpe))
+ goto Error;
+
+ // Resample the LUT
+ if (!cmsStageSampleCLut16bit(OptimizedCLUTmpe, XFormSampler16, (void*) LutPlusCurves, 0)) goto Error;
+
+ // Free resources
+ for (t = 0; t < OriginalLut ->InputChannels; t++) {
+
+ if (Trans[t]) cmsFreeToneCurve(Trans[t]);
+ if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);
+ }
+
+ cmsPipelineFree(LutPlusCurves);
+
+
+ OptimizedPrelinCurves = _cmsStageGetPtrToCurveSet(OptimizedPrelinMpe);
+ OptimizedPrelinCLUT = (_cmsStageCLutData*) OptimizedCLUTmpe ->Data;
+
+ // Set the evaluator if 8-bit
+ if (_cmsFormatterIs8bit(*InputFormat)) {
+
+ Prelin8Data* p8 = PrelinOpt8alloc(OptimizedLUT ->ContextID,
+ OptimizedPrelinCLUT ->Params,
+ OptimizedPrelinCurves);
+ if (p8 == NULL) return FALSE;
+
+ _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval8, (void*) p8, Prelin8free, Prelin8dup);
+
+ }
+ else
+ {
+ Prelin16Data* p16 = PrelinOpt16alloc(OptimizedLUT ->ContextID,
+ OptimizedPrelinCLUT ->Params,
+ 3, OptimizedPrelinCurves, 3, NULL);
+ if (p16 == NULL) return FALSE;
+
+ _cmsPipelineSetOptimizationParameters(OptimizedLUT, PrelinEval16, (void*) p16, PrelinOpt16free, Prelin16dup);
+
+ }
+
+ // Don't fix white on absolute colorimetric
+ if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+ *dwFlags |= cmsFLAGS_NOWHITEONWHITEFIXUP;
+
+ if (!(*dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP)) {
+
+ if (!FixWhiteMisalignment(OptimizedLUT, ColorSpace, OutputColorSpace)) {
+
+ return FALSE;
+ }
+ }
+
+ // And return the obtained LUT
+
+ cmsPipelineFree(OriginalLut);
+ *Lut = OptimizedLUT;
+ return TRUE;
+
+Error:
+
+ for (t = 0; t < OriginalLut ->InputChannels; t++) {
+
+ if (Trans[t]) cmsFreeToneCurve(Trans[t]);
+ if (TransReverse[t]) cmsFreeToneCurve(TransReverse[t]);
+ }
+
+ if (LutPlusCurves != NULL) cmsPipelineFree(LutPlusCurves);
+ if (OptimizedLUT != NULL) cmsPipelineFree(OptimizedLUT);
+
+ return FALSE;
+
+ cmsUNUSED_PARAMETER(Intent);
+}
+
+
+// Curves optimizer ------------------------------------------------------------------------------------------------------------------
+
+static
+void CurvesFree(cmsContext ContextID, void* ptr)
+{
+ Curves16Data* Data = (Curves16Data*) ptr;
+ int i;
+
+ for (i=0; i < Data -> nCurves; i++) {
+
+ _cmsFree(ContextID, Data ->Curves[i]);
+ }
+
+ _cmsFree(ContextID, Data ->Curves);
+ _cmsFree(ContextID, ptr);
+}
+
+static
+void* CurvesDup(cmsContext ContextID, const void* ptr)
+{
+ Curves16Data* Data = (Curves16Data*)_cmsDupMem(ContextID, ptr, sizeof(Curves16Data));
+ int i;
+
+ if (Data == NULL) return NULL;
+
+ Data ->Curves = (cmsUInt16Number**)_cmsDupMem(ContextID, Data ->Curves, Data ->nCurves * sizeof(cmsUInt16Number*));
+
+ for (i=0; i < Data -> nCurves; i++) {
+ Data ->Curves[i] = (cmsUInt16Number*)_cmsDupMem(ContextID, Data ->Curves[i], Data -> nElements * sizeof(cmsUInt16Number));
+ }
+
+ return (void*) Data;
+}
+
+// Precomputes tables for 8-bit on input devicelink.
+static
+Curves16Data* CurvesAlloc(cmsContext ContextID, int nCurves, int nElements, cmsToneCurve** G)
+{
+ int i, j;
+ Curves16Data* c16;
+
+ c16 = (Curves16Data*)_cmsMallocZero(ContextID, sizeof(Curves16Data));
+ if (c16 == NULL) return NULL;
+
+ c16 ->nCurves = nCurves;
+ c16 ->nElements = nElements;
+
+ c16 ->Curves = (cmsUInt16Number**)_cmsCalloc(ContextID, nCurves, sizeof(cmsUInt16Number*));
+ if (c16 ->Curves == NULL) return NULL;
+
+ for (i=0; i < nCurves; i++) {
+
+ c16->Curves[i] = (cmsUInt16Number*)_cmsCalloc(ContextID, nElements, sizeof(cmsUInt16Number));
+
+ if (c16->Curves[i] == NULL) {
+
+ for (j=0; j < i; j++) {
+ _cmsFree(ContextID, c16->Curves[j]);
+ }
+ _cmsFree(ContextID, c16->Curves);
+ _cmsFree(ContextID, c16);
+ return NULL;
+ }
+
+ if (nElements == 256) {
+
+ for (j=0; j < nElements; j++) {
+
+ c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], FROM_8_TO_16(j));
+ }
+ }
+ else {
+
+ for (j=0; j < nElements; j++) {
+ c16 ->Curves[i][j] = cmsEvalToneCurve16(G[i], (cmsUInt16Number) j);
+ }
+ }
+ }
+
+ return c16;
+}
+
+static
+void FastEvaluateCurves8(register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register const void* D)
+{
+ Curves16Data* Data = (Curves16Data*) D;
+ cmsUInt8Number x;
+ int i;
+
+ for (i=0; i < Data ->nCurves; i++) {
+
+ x = (In[i] >> 8);
+ Out[i] = Data -> Curves[i][x];
+ }
+}
+
+
+static
+void FastEvaluateCurves16(register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register const void* D)
+{
+ Curves16Data* Data = (Curves16Data*) D;
+ int i;
+
+ for (i=0; i < Data ->nCurves; i++) {
+ Out[i] = Data -> Curves[i][In[i]];
+ }
+}
+
+
+static
+void FastIdentity16(register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register const void* D)
+{
+ cmsPipeline* Lut = (cmsPipeline*) D;
+ cmsUInt32Number i;
+
+ for (i=0; i < Lut ->InputChannels; i++) {
+ Out[i] = In[i];
+ }
+}
+
+
+// If the target LUT holds only curves, the optimization procedure is to join all those
+// curves together. That only works on curves and does not work on matrices.
+static
+cmsBool OptimizeByJoiningCurves(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+ cmsToneCurve** GammaTables = NULL;
+ cmsFloat32Number InFloat[cmsMAXCHANNELS], OutFloat[cmsMAXCHANNELS];
+ cmsUInt32Number i, j;
+ cmsPipeline* Src = *Lut;
+ cmsPipeline* Dest = NULL;
+ cmsStage* mpe;
+ cmsStage* ObtainedCurves = NULL;
+
+
+ // This is a loosy optimization! does not apply in floating-point cases
+ if (_cmsFormatterIsFloat(*InputFormat) || _cmsFormatterIsFloat(*OutputFormat)) return FALSE;
+
+ // Only curves in this LUT?
+ for (mpe = cmsPipelineGetPtrToFirstStage(Src);
+ mpe != NULL;
+ mpe = cmsStageNext(mpe)) {
+ if (cmsStageType(mpe) != cmsSigCurveSetElemType) return FALSE;
+ }
+
+ // Allocate an empty LUT
+ Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+ if (Dest == NULL) return FALSE;
+
+ // Create target curves
+ GammaTables = (cmsToneCurve**) _cmsCalloc(Src ->ContextID, Src ->InputChannels, sizeof(cmsToneCurve*));
+ if (GammaTables == NULL) goto Error;
+
+ for (i=0; i < Src ->InputChannels; i++) {
+ GammaTables[i] = cmsBuildTabulatedToneCurve16(Src ->ContextID, PRELINEARIZATION_POINTS, NULL);
+ if (GammaTables[i] == NULL) goto Error;
+ }
+
+ // Compute 16 bit result by using floating point
+ for (i=0; i < PRELINEARIZATION_POINTS; i++) {
+
+ for (j=0; j < Src ->InputChannels; j++)
+ InFloat[j] = (cmsFloat32Number) ((cmsFloat64Number) i / (PRELINEARIZATION_POINTS - 1));
+
+ cmsPipelineEvalFloat(InFloat, OutFloat, Src);
+
+ for (j=0; j < Src ->InputChannels; j++)
+ GammaTables[j] -> Table16[i] = _cmsQuickSaturateWord(OutFloat[j] * 65535.0);
+ }
+
+ ObtainedCurves = cmsStageAllocToneCurves(Src ->ContextID, Src ->InputChannels, GammaTables);
+ if (ObtainedCurves == NULL) goto Error;
+
+ for (i=0; i < Src ->InputChannels; i++) {
+ cmsFreeToneCurve(GammaTables[i]);
+ GammaTables[i] = NULL;
+ }
+
+ if (GammaTables != NULL) _cmsFree(Src ->ContextID, GammaTables);
+
+ // Maybe the curves are linear at the end
+ if (!AllCurvesAreLinear(ObtainedCurves)) {
+
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, ObtainedCurves))
+ goto Error;
+
+ // If the curves are to be applied in 8 bits, we can save memory
+ if (_cmsFormatterIs8bit(*InputFormat)) {
+
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) ObtainedCurves ->Data;
+ Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 256, Data ->TheCurves);
+
+ if (c16 == NULL) goto Error;
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves8, c16, CurvesFree, CurvesDup);
+
+ }
+ else {
+
+ _cmsStageToneCurvesData* Data = (_cmsStageToneCurvesData*) cmsStageData(ObtainedCurves);
+ Curves16Data* c16 = CurvesAlloc(Dest ->ContextID, Data ->nCurves, 65536, Data ->TheCurves);
+
+ if (c16 == NULL) goto Error;
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastEvaluateCurves16, c16, CurvesFree, CurvesDup);
+ }
+ }
+ else {
+
+ // LUT optimizes to nothing. Set the identity LUT
+ cmsStageFree(ObtainedCurves);
+
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageAllocIdentity(Dest ->ContextID, Src ->InputChannels)))
+ goto Error;
+
+ *dwFlags |= cmsFLAGS_NOCACHE;
+ _cmsPipelineSetOptimizationParameters(Dest, FastIdentity16, (void*) Dest, NULL, NULL);
+ }
+
+ // We are done.
+ cmsPipelineFree(Src);
+ *Lut = Dest;
+ return TRUE;
+
+Error:
+
+ if (ObtainedCurves != NULL) cmsStageFree(ObtainedCurves);
+ if (GammaTables != NULL) {
+ for (i=0; i < Src ->InputChannels; i++) {
+ if (GammaTables[i] != NULL) cmsFreeToneCurve(GammaTables[i]);
+ }
+
+ _cmsFree(Src ->ContextID, GammaTables);
+ }
+
+ if (Dest != NULL) cmsPipelineFree(Dest);
+ return FALSE;
+
+ cmsUNUSED_PARAMETER(Intent);
+ cmsUNUSED_PARAMETER(InputFormat);
+ cmsUNUSED_PARAMETER(OutputFormat);
+ cmsUNUSED_PARAMETER(dwFlags);
+}
+
+// -------------------------------------------------------------------------------------------------------------------------------------
+// LUT is Shaper - Matrix - Matrix - Shaper, which is very frequent when combining two matrix-shaper profiles
+
+
+static
+void FreeMatShaper(cmsContext ContextID, void* Data)
+{
+ if (Data != NULL) _cmsFree(ContextID, Data);
+}
+
+static
+void* DupMatShaper(cmsContext ContextID, const void* Data)
+{
+ return _cmsDupMem(ContextID, Data, sizeof(MatShaper8Data));
+}
+
+
+// A fast matrix-shaper evaluator for 8 bits. This is a bit ticky since I'm using 1.14 signed fixed point
+// to accomplish some performance. Actually it takes 256x3 16 bits tables and 16385 x 3 tables of 8 bits,
+// in total about 50K, and the performance boost is huge!
+static
+void MatShaperEval16(register const cmsUInt16Number In[],
+ register cmsUInt16Number Out[],
+ register const void* D)
+{
+ MatShaper8Data* p = (MatShaper8Data*) D;
+ cmsS1Fixed14Number l1, l2, l3, r, g, b;
+ cmsUInt32Number ri, gi, bi;
+
+ // In this case (and only in this case!) we can use this simplification since
+ // In[] is assured to come from a 8 bit number. (a << 8 | a)
+ ri = In[0] & 0xFF;
+ gi = In[1] & 0xFF;
+ bi = In[2] & 0xFF;
+
+ // Across first shaper, which also converts to 1.14 fixed point
+ r = p->Shaper1R[ri];
+ g = p->Shaper1G[gi];
+ b = p->Shaper1B[bi];
+
+ // Evaluate the matrix in 1.14 fixed point
+ l1 = (p->Mat[0][0] * r + p->Mat[0][1] * g + p->Mat[0][2] * b + p->Off[0] + 0x2000) >> 14;
+ l2 = (p->Mat[1][0] * r + p->Mat[1][1] * g + p->Mat[1][2] * b + p->Off[1] + 0x2000) >> 14;
+ l3 = (p->Mat[2][0] * r + p->Mat[2][1] * g + p->Mat[2][2] * b + p->Off[2] + 0x2000) >> 14;
+
+ // Now we have to clip to 0..1.0 range
+ ri = (l1 < 0) ? 0 : ((l1 > 16384) ? 16384 : l1);
+ gi = (l2 < 0) ? 0 : ((l2 > 16384) ? 16384 : l2);
+ bi = (l3 < 0) ? 0 : ((l3 > 16384) ? 16384 : l3);
+
+ // And across second shaper,
+ Out[0] = p->Shaper2R[ri];
+ Out[1] = p->Shaper2G[gi];
+ Out[2] = p->Shaper2B[bi];
+
+}
+
+// This table converts from 8 bits to 1.14 after applying the curve
+static
+void FillFirstShaper(cmsS1Fixed14Number* Table, cmsToneCurve* Curve)
+{
+ int i;
+ cmsFloat32Number R, y;
+
+ for (i=0; i < 256; i++) {
+
+ R = (cmsFloat32Number) (i / 255.0);
+ y = cmsEvalToneCurveFloat(Curve, R);
+
+ Table[i] = DOUBLE_TO_1FIXED14(y);
+ }
+}
+
+// This table converts form 1.14 (being 0x4000 the last entry) to 8 bits after applying the curve
+static
+void FillSecondShaper(cmsUInt16Number* Table, cmsToneCurve* Curve, cmsBool Is8BitsOutput)
+{
+ int i;
+ cmsFloat32Number R, Val;
+
+ for (i=0; i < 16385; i++) {
+
+ R = (cmsFloat32Number) (i / 16384.0);
+ Val = cmsEvalToneCurveFloat(Curve, R); // Val comes 0..1.0
+
+ if (Is8BitsOutput) {
+
+ // If 8 bits output, we can optimize further by computing the / 257 part.
+ // first we compute the resulting byte and then we store the byte times
+ // 257. This quantization allows to round very quick by doing a >> 8, but
+ // since the low byte is always equal to msb, we can do a & 0xff and this works!
+ cmsUInt16Number w = _cmsQuickSaturateWord(Val * 65535.0);
+ cmsUInt8Number b = FROM_16_TO_8(w);
+
+ Table[i] = FROM_8_TO_16(b);
+ }
+ else Table[i] = _cmsQuickSaturateWord(Val * 65535.0);
+ }
+}
+
+// Compute the matrix-shaper structure
+static
+cmsBool SetMatShaper(cmsPipeline* Dest, cmsToneCurve* Curve1[3], cmsMAT3* Mat, cmsVEC3* Off, cmsToneCurve* Curve2[3], cmsUInt32Number* OutputFormat)
+{
+ MatShaper8Data* p;
+ int i, j;
+ cmsBool Is8Bits = _cmsFormatterIs8bit(*OutputFormat);
+
+ // Allocate a big chuck of memory to store precomputed tables
+ p = (MatShaper8Data*) _cmsMalloc(Dest ->ContextID, sizeof(MatShaper8Data));
+ if (p == NULL) return FALSE;
+
+ p -> ContextID = Dest -> ContextID;
+
+ // Precompute tables
+ FillFirstShaper(p ->Shaper1R, Curve1[0]);
+ FillFirstShaper(p ->Shaper1G, Curve1[1]);
+ FillFirstShaper(p ->Shaper1B, Curve1[2]);
+
+ FillSecondShaper(p ->Shaper2R, Curve2[0], Is8Bits);
+ FillSecondShaper(p ->Shaper2G, Curve2[1], Is8Bits);
+ FillSecondShaper(p ->Shaper2B, Curve2[2], Is8Bits);
+
+ // Convert matrix to nFixed14. Note that those values may take more than 16 bits as
+ for (i=0; i < 3; i++) {
+ for (j=0; j < 3; j++) {
+ p ->Mat[i][j] = DOUBLE_TO_1FIXED14(Mat->v[i].n[j]);
+ }
+ }
+
+ for (i=0; i < 3; i++) {
+
+ if (Off == NULL) {
+ p ->Off[i] = 0;
+ }
+ else {
+ p ->Off[i] = DOUBLE_TO_1FIXED14(Off->n[i]);
+ }
+ }
+
+ // Mark as optimized for faster formatter
+ if (Is8Bits)
+ *OutputFormat |= OPTIMIZED_SH(1);
+
+ // Fill function pointers
+ _cmsPipelineSetOptimizationParameters(Dest, MatShaperEval16, (void*) p, FreeMatShaper, DupMatShaper);
+ return TRUE;
+}
+
+// 8 bits on input allows matrix-shaper boot up to 25 Mpixels per second on RGB. That's fast!
+// TODO: Allow a third matrix for abs. colorimetric
+static
+cmsBool OptimizeMatrixShaper(cmsPipeline** Lut, cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+ cmsStage* Curve1, *Curve2;
+ cmsStage* Matrix1, *Matrix2;
+ _cmsStageMatrixData* Data1;
+ _cmsStageMatrixData* Data2;
+ cmsMAT3 res;
+ cmsBool IdentityMat;
+ cmsPipeline* Dest, *Src;
+
+ // Only works on RGB to RGB
+ if (T_CHANNELS(*InputFormat) != 3 || T_CHANNELS(*OutputFormat) != 3) return FALSE;
+
+ // Only works on 8 bit input
+ if (!_cmsFormatterIs8bit(*InputFormat)) return FALSE;
+
+ // Seems suitable, proceed
+ Src = *Lut;
+
+ // Check for shaper-matrix-matrix-shaper structure, that is what this optimizer stands for
+ if (!cmsPipelineCheckAndRetreiveStages(Src, 4,
+ cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+ &Curve1, &Matrix1, &Matrix2, &Curve2)) return FALSE;
+
+ // Get both matrices
+ Data1 = (_cmsStageMatrixData*) cmsStageData(Matrix1);
+ Data2 = (_cmsStageMatrixData*) cmsStageData(Matrix2);
+
+ // Input offset should be zero
+ if (Data1 ->Offset != NULL) return FALSE;
+
+ // Multiply both matrices to get the result
+ _cmsMAT3per(&res, (cmsMAT3*) Data2 ->Double, (cmsMAT3*) Data1 ->Double);
+
+ // Now the result is in res + Data2 -> Offset. Maybe is a plain identity?
+ IdentityMat = FALSE;
+ if (_cmsMAT3isIdentity(&res) && Data2 ->Offset == NULL) {
+
+ // We can get rid of full matrix
+ IdentityMat = TRUE;
+ }
+
+ // Allocate an empty LUT
+ Dest = cmsPipelineAlloc(Src ->ContextID, Src ->InputChannels, Src ->OutputChannels);
+ if (!Dest) return FALSE;
+
+ // Assamble the new LUT
+ if (!cmsPipelineInsertStage(Dest, cmsAT_BEGIN, cmsStageDup(Curve1)))
+ goto Error;
+
+ if (!IdentityMat)
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageAllocMatrix(Dest ->ContextID, 3, 3, (const cmsFloat64Number*) &res, Data2 ->Offset)))
+ goto Error;
+ if (!cmsPipelineInsertStage(Dest, cmsAT_END, cmsStageDup(Curve2)))
+ goto Error;
+
+ // If identity on matrix, we can further optimize the curves, so call the join curves routine
+ if (IdentityMat) {
+
+ OptimizeByJoiningCurves(&Dest, Intent, InputFormat, OutputFormat, dwFlags);
+ }
+ else {
+ _cmsStageToneCurvesData* mpeC1 = (_cmsStageToneCurvesData*) cmsStageData(Curve1);
+ _cmsStageToneCurvesData* mpeC2 = (_cmsStageToneCurvesData*) cmsStageData(Curve2);
+
+ // In this particular optimization, cach?does not help as it takes more time to deal with
+ // the cach?that with the pixel handling
+ *dwFlags |= cmsFLAGS_NOCACHE;
+
+ // Setup the optimizarion routines
+ SetMatShaper(Dest, mpeC1 ->TheCurves, &res, (cmsVEC3*) Data2 ->Offset, mpeC2->TheCurves, OutputFormat);
+ }
+
+ cmsPipelineFree(Src);
+ *Lut = Dest;
+ return TRUE;
+Error:
+ // Leave Src unchanged
+ cmsPipelineFree(Dest);
+ return FALSE;
+}
+
+
+// -------------------------------------------------------------------------------------------------------------------------------------
+// Optimization plug-ins
+
+// List of optimizations
+typedef struct _cmsOptimizationCollection_st {
+
+ _cmsOPToptimizeFn OptimizePtr;
+
+ struct _cmsOptimizationCollection_st *Next;
+
+} _cmsOptimizationCollection;
+
+
+// The built-in list. We currently implement 4 types of optimizations. Joining of curves, matrix-shaper, linearization and resampling
+static _cmsOptimizationCollection DefaultOptimization[] = {
+
+ { OptimizeByJoiningCurves, &DefaultOptimization[1] },
+ { OptimizeMatrixShaper, &DefaultOptimization[2] },
+ { OptimizeByComputingLinearization, &DefaultOptimization[3] },
+ { OptimizeByResampling, NULL }
+};
+
+// The linked list head
+_cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginOptimizationList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsOptimizationPluginChunkType newHead = { NULL };
+ _cmsOptimizationCollection* entry;
+ _cmsOptimizationCollection* Anterior = NULL;
+ _cmsOptimizationPluginChunkType* head = (_cmsOptimizationPluginChunkType*) src->chunks[OptimizationPlugin];
+
+ _cmsAssert(ctx != NULL);
+ _cmsAssert(head != NULL);
+
+ // Walk the list copying all nodes
+ for (entry = head->OptimizationCollection;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ _cmsOptimizationCollection *newEntry = ( _cmsOptimizationCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsOptimizationCollection));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.OptimizationCollection == NULL)
+ newHead.OptimizationCollection = newEntry;
+ }
+
+ ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsOptimizationPluginChunkType));
+}
+
+void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ // Copy all linked list
+ DupPluginOptimizationList(ctx, src);
+ }
+ else {
+ static _cmsOptimizationPluginChunkType OptimizationPluginChunkType = { NULL };
+ ctx ->chunks[OptimizationPlugin] = _cmsSubAllocDup(ctx ->MemPool, &OptimizationPluginChunkType, sizeof(_cmsOptimizationPluginChunkType));
+ }
+}
+
+
+// Register new ways to optimize
+cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ cmsPluginOptimization* Plugin = (cmsPluginOptimization*) Data;
+ _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);
+ _cmsOptimizationCollection* fl;
+
+ if (Data == NULL) {
+
+ ctx->OptimizationCollection = NULL;
+ return TRUE;
+ }
+
+ // Optimizer callback is required
+ if (Plugin ->OptimizePtr == NULL) return FALSE;
+
+ fl = (_cmsOptimizationCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsOptimizationCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+ fl ->OptimizePtr = Plugin ->OptimizePtr;
+
+ // Keep linked list
+ fl ->Next = ctx->OptimizationCollection;
+
+ // Set the head
+ ctx ->OptimizationCollection = fl;
+
+ // All is ok
+ return TRUE;
+}
+
+// The entry point for LUT optimization
+cmsBool _cmsOptimizePipeline(cmsContext ContextID,
+ cmsPipeline** PtrLut,
+ int Intent,
+ cmsUInt32Number* InputFormat,
+ cmsUInt32Number* OutputFormat,
+ cmsUInt32Number* dwFlags)
+{
+ _cmsOptimizationPluginChunkType* ctx = ( _cmsOptimizationPluginChunkType*) _cmsContextGetClientChunk(ContextID, OptimizationPlugin);
+ _cmsOptimizationCollection* Opts;
+ cmsBool AnySuccess = FALSE;
+
+ // A CLUT is being asked, so force this specific optimization
+ if (*dwFlags & cmsFLAGS_FORCE_CLUT) {
+
+ PreOptimize(*PtrLut);
+ return OptimizeByResampling(PtrLut, Intent, InputFormat, OutputFormat, dwFlags);
+ }
+
+ // Anything to optimize?
+ if ((*PtrLut) ->Elements == NULL) {
+ _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);
+ return TRUE;
+ }
+
+ // Try to get rid of identities and trivial conversions.
+ AnySuccess = PreOptimize(*PtrLut);
+
+ // After removal do we end with an identity?
+ if ((*PtrLut) ->Elements == NULL) {
+ _cmsPipelineSetOptimizationParameters(*PtrLut, FastIdentity16, (void*) *PtrLut, NULL, NULL);
+ return TRUE;
+ }
+
+ // Do not optimize, keep all precision
+ if (*dwFlags & cmsFLAGS_NOOPTIMIZE)
+ return FALSE;
+
+ // Try plug-in optimizations
+ for (Opts = ctx->OptimizationCollection;
+ Opts != NULL;
+ Opts = Opts ->Next) {
+
+ // If one schema succeeded, we are done
+ if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {
+
+ return TRUE; // Optimized!
+ }
+ }
+
+ // Try built-in optimizations
+ for (Opts = DefaultOptimization;
+ Opts != NULL;
+ Opts = Opts ->Next) {
+
+ if (Opts ->OptimizePtr(PtrLut, Intent, InputFormat, OutputFormat, dwFlags)) {
+
+ return TRUE;
+ }
+ }
+
+ // Only simple optimizations succeeded
+ return AnySuccess;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c
new file mode 100644
index 0000000000..9323b53ec5
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspack.c
@@ -0,0 +1,3369 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+#include "lcms2_internal.h"
+
+// This module handles all formats supported by lcms. There are two flavors, 16 bits and
+// floating point. Floating point is supported only in a subset, those formats holding
+// cmsFloat32Number (4 bytes per component) and double (marked as 0 bytes per component
+// as special case)
+
+// ---------------------------------------------------------------------------
+
+
+// This macro return words stored as big endian
+#define CHANGE_ENDIAN(w) (cmsUInt16Number) ((cmsUInt16Number) ((w)<<8)|((w)>>8))
+
+// These macros handles reversing (negative)
+#define REVERSE_FLAVOR_8(x) ((cmsUInt8Number) (0xff-(x)))
+#define REVERSE_FLAVOR_16(x) ((cmsUInt16Number)(0xffff-(x)))
+
+// * 0xffff / 0xff00 = (255 * 257) / (255 * 256) = 257 / 256
+cmsINLINE cmsUInt16Number FomLabV2ToLabV4(cmsUInt16Number x)
+{
+ int a = (x << 8 | x) >> 8; // * 257 / 256
+ if ( a > 0xffff) return 0xffff;
+ return (cmsUInt16Number) a;
+}
+
+// * 0xf00 / 0xffff = * 256 / 257
+cmsINLINE cmsUInt16Number FomLabV4ToLabV2(cmsUInt16Number x)
+{
+ return (cmsUInt16Number) (((x << 8) + 0x80) / 257);
+}
+
+
+typedef struct {
+ cmsUInt32Number Type;
+ cmsUInt32Number Mask;
+ cmsFormatter16 Frm;
+
+} cmsFormatters16;
+
+typedef struct {
+ cmsUInt32Number Type;
+ cmsUInt32Number Mask;
+ cmsFormatterFloat Frm;
+
+} cmsFormattersFloat;
+
+
+#define ANYSPACE COLORSPACE_SH(31)
+#define ANYCHANNELS CHANNELS_SH(15)
+#define ANYEXTRA EXTRA_SH(7)
+#define ANYPLANAR PLANAR_SH(1)
+#define ANYENDIAN ENDIAN16_SH(1)
+#define ANYSWAP DOSWAP_SH(1)
+#define ANYSWAPFIRST SWAPFIRST_SH(1)
+#define ANYFLAVOR FLAVOR_SH(1)
+
+
+// Supress waning about info never being used
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4100)
+#endif
+
+// Unpacking routines (16 bits) ----------------------------------------------------------------------------------------
+
+
+// Does almost everything but is slow
+static
+cmsUInt8Number* UnrollChunkyBytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsUInt16Number v;
+ int i;
+
+ if (ExtraFirst) {
+ accum += Extra;
+ }
+
+ for (i=0; i < nChan; i++) {
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = FROM_8_TO_16(*accum);
+ v = Reverse ? REVERSE_FLAVOR_16(v) : v;
+ wIn[index] = v;
+ accum++;
+ }
+
+ if (!ExtraFirst) {
+ accum += Extra;
+ }
+
+ if (Extra == 0 && SwapFirst) {
+ cmsUInt16Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+
+}
+
+// Extra channels are just ignored because come in the next planes
+static
+cmsUInt8Number* UnrollPlanarBytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int i;
+ cmsUInt8Number* Init = accum;
+
+ if (DoSwap ^ SwapFirst) {
+ accum += T_EXTRA(info -> InputFormat) * Stride;
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+ cmsUInt16Number v = FROM_8_TO_16(*accum);
+
+ wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+ accum += Stride;
+ }
+
+ return (Init + 1);
+}
+
+// Special cases, provided for performance
+static
+cmsUInt8Number* Unroll4Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // C
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // M
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
+ wIn[3] = FROM_8_TO_16(*accum); accum++; // K
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesReverse(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // C
+ wIn[1] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // M
+ wIn[2] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // Y
+ wIn[3] = FROM_8_TO_16(REVERSE_FLAVOR_8(*accum)); accum++; // K
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[3] = FROM_8_TO_16(*accum); accum++; // K
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // C
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // M
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// KYMC
+static
+cmsUInt8Number* Unroll4BytesSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[3] = FROM_8_TO_16(*accum); accum++; // K
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // Y
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // M
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // C
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4BytesSwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // K
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // Y
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // M
+ wIn[3] = FROM_8_TO_16(*accum); accum++; // C
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1Swap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ accum++; // A
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+ accum++; // A
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3BytesSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ accum++; // A
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// BRG
+static
+cmsUInt8Number* Unroll3BytesSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = FROM_8_TO_16(*accum); accum++; // B
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // G
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // R
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollLabV2_8(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
+ wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
+ wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollALabV2_8(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ accum++; // A
+ wIn[0] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // L
+ wIn[1] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // a
+ wIn[2] = FomLabV2ToLabV4(FROM_8_TO_16(*accum)); accum++; // b
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollLabV2_16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // L
+ wIn[1] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // a
+ wIn[2] = FomLabV2ToLabV4(*(cmsUInt16Number*) accum); accum += 2; // b
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// for duplex
+static
+cmsUInt8Number* Unroll2Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = FROM_8_TO_16(*accum); accum++; // ch1
+ wIn[1] = FROM_8_TO_16(*accum); accum++; // ch2
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+
+// Monochrome duplicates L into RGB for null-transforms
+static
+cmsUInt8Number* Unroll1Byte(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Unroll1ByteSkip1(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
+ accum += 1;
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1ByteSkip2(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = FROM_8_TO_16(*accum); accum++; // L
+ accum += 2;
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1ByteReversed(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(FROM_8_TO_16(*accum)); accum++; // L
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* UnrollAnyWords(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int SwapEndian = T_ENDIAN16(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int i;
+
+ if (ExtraFirst) {
+ accum += Extra * sizeof(cmsUInt16Number);
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+ cmsUInt16Number v = *(cmsUInt16Number*) accum;
+
+ if (SwapEndian)
+ v = CHANGE_ENDIAN(v);
+
+ wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+
+ accum += sizeof(cmsUInt16Number);
+ }
+
+ if (!ExtraFirst) {
+ accum += Extra * sizeof(cmsUInt16Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ cmsUInt16Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* UnrollPlanarWords(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap= T_DOSWAP(info ->InputFormat);
+ int Reverse= T_FLAVOR(info ->InputFormat);
+ int SwapEndian = T_ENDIAN16(info -> InputFormat);
+ int i;
+ cmsUInt8Number* Init = accum;
+
+ if (DoSwap) {
+ accum += T_EXTRA(info -> InputFormat) * Stride * sizeof(cmsUInt16Number);
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+ cmsUInt16Number v = *(cmsUInt16Number*) accum;
+
+ if (SwapEndian)
+ v = CHANGE_ENDIAN(v);
+
+ wIn[index] = Reverse ? REVERSE_FLAVOR_16(v) : v;
+
+ accum += Stride * sizeof(cmsUInt16Number);
+ }
+
+ return (Init + sizeof(cmsUInt16Number));
+}
+
+
+static
+cmsUInt8Number* Unroll4Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+ wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsReverse(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // C
+ wIn[1] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // M
+ wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // Y
+ wIn[3] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2; // K
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// KYMC
+static
+cmsUInt8Number* Unroll4WordsSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // K
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll4WordsSwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // K
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // Y
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // M
+ wIn[3] = *(cmsUInt16Number*) accum; accum+= 2; // C
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // C R
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // Y B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // C R
+ wIn[1] = *(cmsUInt16Number*) accum; accum+= 2; // M G
+ wIn[0] = *(cmsUInt16Number*) accum; accum+= 2; // Y B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSkip1Swap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ accum += 2; // A
+ wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // R
+ wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
+ wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll3WordsSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ accum += 2; // A
+ wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // R
+ wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // G
+ wIn[2] = *(cmsUInt16Number*) accum; accum += 2; // B
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1Word(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum; accum+= 2; // L
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1WordReversed(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = REVERSE_FLAVOR_16(*(cmsUInt16Number*) accum); accum+= 2;
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll1WordSkip3(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = wIn[1] = wIn[2] = *(cmsUInt16Number*) accum;
+
+ accum += 8;
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Unroll2Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ wIn[0] = *(cmsUInt16Number*) accum; accum += 2; // ch1
+ wIn[1] = *(cmsUInt16Number*) accum; accum += 2; // ch2
+
+ return accum;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// This is a conversion of Lab double to 16 bits
+static
+cmsUInt8Number* UnrollLabDoubleTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ if (T_PLANAR(info -> InputFormat)) {
+
+ cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+ cmsCIELab Lab;
+
+ Lab.L = Pt[0];
+ Lab.a = Pt[Stride];
+ Lab.b = Pt[Stride*2];
+
+ cmsFloat2LabEncoded(wIn, &Lab);
+ return accum + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ cmsFloat2LabEncoded(wIn, (cmsCIELab*) accum);
+ accum += sizeof(cmsCIELab) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
+ return accum;
+ }
+}
+
+
+// This is a conversion of Lab float to 16 bits
+static
+cmsUInt8Number* UnrollLabFloatTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ cmsCIELab Lab;
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+
+ Lab.L = Pt[0];
+ Lab.a = Pt[Stride];
+ Lab.b = Pt[Stride*2];
+
+ cmsFloat2LabEncoded(wIn, &Lab);
+ return accum + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ Lab.L = ((cmsFloat32Number*) accum)[0];
+ Lab.a = ((cmsFloat32Number*) accum)[1];
+ Lab.b = ((cmsFloat32Number*) accum)[2];
+
+ cmsFloat2LabEncoded(wIn, &Lab);
+ accum += (3 + T_EXTRA(info ->InputFormat)) * sizeof(cmsFloat32Number);
+ return accum;
+ }
+}
+
+// This is a conversion of XYZ double to 16 bits
+static
+cmsUInt8Number* UnrollXYZDoubleTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ if (T_PLANAR(info -> InputFormat)) {
+
+ cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+ cmsCIEXYZ XYZ;
+
+ XYZ.X = Pt[0];
+ XYZ.Y = Pt[Stride];
+ XYZ.Z = Pt[Stride*2];
+ cmsFloat2XYZEncoded(wIn, &XYZ);
+
+ return accum + sizeof(cmsFloat64Number);
+
+ }
+
+ else {
+ cmsFloat2XYZEncoded(wIn, (cmsCIEXYZ*) accum);
+ accum += sizeof(cmsCIEXYZ) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat64Number);
+
+ return accum;
+ }
+}
+
+// This is a conversion of XYZ float to 16 bits
+static
+cmsUInt8Number* UnrollXYZFloatTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ if (T_PLANAR(info -> InputFormat)) {
+
+ cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+ cmsCIEXYZ XYZ;
+
+ XYZ.X = Pt[0];
+ XYZ.Y = Pt[Stride];
+ XYZ.Z = Pt[Stride*2];
+ cmsFloat2XYZEncoded(wIn, &XYZ);
+
+ return accum + sizeof(cmsFloat32Number);
+
+ }
+
+ else {
+ cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+ cmsCIEXYZ XYZ;
+
+ XYZ.X = Pt[0];
+ XYZ.Y = Pt[1];
+ XYZ.Z = Pt[2];
+ cmsFloat2XYZEncoded(wIn, &XYZ);
+
+ accum += 3 * sizeof(cmsFloat32Number) + T_EXTRA(info ->InputFormat) * sizeof(cmsFloat32Number);
+
+ return accum;
+ }
+}
+
+// Check if space is marked as ink
+cmsINLINE cmsBool IsInkSpace(cmsUInt32Number Type)
+{
+ switch (T_COLORSPACE(Type)) {
+
+ case PT_CMY:
+ case PT_CMYK:
+ case PT_MCH5:
+ case PT_MCH6:
+ case PT_MCH7:
+ case PT_MCH8:
+ case PT_MCH9:
+ case PT_MCH10:
+ case PT_MCH11:
+ case PT_MCH12:
+ case PT_MCH13:
+ case PT_MCH14:
+ case PT_MCH15: return TRUE;
+
+ default: return FALSE;
+ }
+}
+
+// Inks does come in percentage, remaining cases are between 0..1.0, again to 16 bits
+static
+cmsUInt8Number* UnrollDoubleTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat64Number v;
+ cmsUInt16Number vi;
+ int i, start = 0;
+ cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];
+ else
+ v = (cmsFloat32Number) ((cmsFloat64Number*) accum)[i + start];
+
+ vi = _cmsQuickSaturateWord(v * maximum);
+
+ if (Reverse)
+ vi = REVERSE_FLAVOR_16(vi);
+
+ wIn[index] = vi;
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsUInt16Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsFloat64Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
+}
+
+
+
+static
+cmsUInt8Number* UnrollFloatTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat32Number v;
+ cmsUInt16Number vi;
+ int i, start = 0;
+ cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 655.35 : 65535.0;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];
+ else
+ v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];
+
+ vi = _cmsQuickSaturateWord(v * maximum);
+
+ if (Reverse)
+ vi = REVERSE_FLAVOR_16(vi);
+
+ wIn[index] = vi;
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsUInt16Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsFloat32Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
+}
+
+
+
+
+// For 1 channel, we need to duplicate data (it comes in 0..1.0 range)
+static
+cmsUInt8Number* UnrollDouble1Chan(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+ cmsFloat64Number* Inks = (cmsFloat64Number*) accum;
+
+ wIn[0] = wIn[1] = wIn[2] = _cmsQuickSaturateWord(Inks[0] * 65535.0);
+
+ return accum + sizeof(cmsFloat64Number);
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+//-------------------------------------------------------------------------------------------------------------------
+
+// For anything going from cmsFloat32Number
+static
+cmsUInt8Number* UnrollFloatsToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat32Number v;
+ int i, start = 0;
+ cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[(i + start) * Stride];
+ else
+ v = (cmsFloat32Number) ((cmsFloat32Number*) accum)[i + start];
+
+ v /= maximum;
+
+ wIn[index] = Reverse ? 1 - v : v;
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsFloat32Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsFloat32Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsFloat32Number);
+}
+
+// For anything going from double
+
+static
+cmsUInt8Number* UnrollDoublesToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat64Number v;
+ int i, start = 0;
+ cmsFloat64Number maximum = IsInkSpace(info ->InputFormat) ? 100.0 : 1.0;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[(i + start) * Stride];
+ else
+ v = (cmsFloat64Number) ((cmsFloat64Number*) accum)[i + start];
+
+ v /= maximum;
+
+ wIn[index] = (cmsFloat32Number) (Reverse ? 1.0 - v : v);
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsFloat32Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsFloat64Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsFloat64Number);
+}
+
+
+
+// From Lab double to cmsFloat32Number
+static
+cmsUInt8Number* UnrollLabDoubleToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+ cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
+ wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
+ wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
+
+ return accum + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
+ wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1
+ wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
+
+ accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
+ return accum;
+ }
+}
+
+// From Lab double to cmsFloat32Number
+static
+cmsUInt8Number* UnrollLabFloatToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+ cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
+ wIn[1] = (cmsFloat32Number) ((Pt[Stride] + 128) / 255.0); // form -128..+127 to 0..1
+ wIn[2] = (cmsFloat32Number) ((Pt[Stride*2] + 128) / 255.0);
+
+ return accum + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / 100.0); // from 0..100 to 0..1
+ wIn[1] = (cmsFloat32Number) ((Pt[1] + 128) / 255.0); // form -128..+127 to 0..1
+ wIn[2] = (cmsFloat32Number) ((Pt[2] + 128) / 255.0);
+
+ accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
+ return accum;
+ }
+}
+
+
+
+// 1.15 fixed point, that means maximum value is MAX_ENCODEABLE_XYZ (0xFFFF)
+static
+cmsUInt8Number* UnrollXYZDoubleToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+ cmsFloat64Number* Pt = (cmsFloat64Number*) accum;
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+ wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
+ wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
+
+ return accum + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+ wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
+ wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
+
+ accum += sizeof(cmsFloat64Number)*(3 + T_EXTRA(info ->InputFormat));
+ return accum;
+ }
+}
+
+static
+cmsUInt8Number* UnrollXYZFloatToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+ cmsFloat32Number* Pt = (cmsFloat32Number*) accum;
+
+ if (T_PLANAR(info -> InputFormat)) {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+ wIn[1] = (cmsFloat32Number) (Pt[Stride] / MAX_ENCODEABLE_XYZ);
+ wIn[2] = (cmsFloat32Number) (Pt[Stride*2] / MAX_ENCODEABLE_XYZ);
+
+ return accum + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ wIn[0] = (cmsFloat32Number) (Pt[0] / MAX_ENCODEABLE_XYZ);
+ wIn[1] = (cmsFloat32Number) (Pt[1] / MAX_ENCODEABLE_XYZ);
+ wIn[2] = (cmsFloat32Number) (Pt[2] / MAX_ENCODEABLE_XYZ);
+
+ accum += sizeof(cmsFloat32Number)*(3 + T_EXTRA(info ->InputFormat));
+ return accum;
+ }
+}
+
+
+
+// Packing routines -----------------------------------------------------------------------------------------------------------
+
+
+// Generic chunky for byte
+
+static
+cmsUInt8Number* PackAnyBytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsUInt8Number* swap1;
+ cmsUInt8Number v = 0;
+ int i;
+
+ swap1 = output;
+
+ if (ExtraFirst) {
+ output += Extra;
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = FROM_16_TO_8(wOut[index]);
+
+ if (Reverse)
+ v = REVERSE_FLAVOR_8(v);
+
+ *output++ = v;
+ }
+
+ if (!ExtraFirst) {
+ output += Extra;
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, nChan-1);
+ *swap1 = v;
+ }
+
+
+ return output;
+
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+static
+cmsUInt8Number* PackAnyWords(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int SwapEndian = T_ENDIAN16(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsUInt16Number* swap1;
+ cmsUInt16Number v = 0;
+ int i;
+
+ swap1 = (cmsUInt16Number*) output;
+
+ if (ExtraFirst) {
+ output += Extra * sizeof(cmsUInt16Number);
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = wOut[index];
+
+ if (SwapEndian)
+ v = CHANGE_ENDIAN(v);
+
+ if (Reverse)
+ v = REVERSE_FLAVOR_16(v);
+
+ *(cmsUInt16Number*) output = v;
+
+ output += sizeof(cmsUInt16Number);
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsUInt16Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+ *swap1 = v;
+ }
+
+
+ return output;
+
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackPlanarBytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int i;
+ cmsUInt8Number* Init = output;
+
+
+ if (DoSwap ^ SwapFirst) {
+ output += T_EXTRA(info -> OutputFormat) * Stride;
+ }
+
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+ cmsUInt8Number v = FROM_16_TO_8(wOut[index]);
+
+ *(cmsUInt8Number*) output = (cmsUInt8Number) (Reverse ? REVERSE_FLAVOR_8(v) : v);
+ output += Stride;
+ }
+
+ return (Init + 1);
+
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackPlanarWords(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse= T_FLAVOR(info ->OutputFormat);
+ int SwapEndian = T_ENDIAN16(info -> OutputFormat);
+ int i;
+ cmsUInt8Number* Init = output;
+ cmsUInt16Number v;
+
+ if (DoSwap) {
+ output += T_EXTRA(info -> OutputFormat) * Stride * sizeof(cmsUInt16Number);
+ }
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = wOut[index];
+
+ if (SwapEndian)
+ v = CHANGE_ENDIAN(v);
+
+ if (Reverse)
+ v = REVERSE_FLAVOR_16(v);
+
+ *(cmsUInt16Number*) output = v;
+ output += (Stride * sizeof(cmsUInt16Number));
+ }
+
+ return (Init + sizeof(cmsUInt16Number));
+}
+
+// CMYKcm (unrolled for speed)
+
+static
+cmsUInt8Number* Pack6Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[3]);
+ *output++ = FROM_16_TO_8(wOut[4]);
+ *output++ = FROM_16_TO_8(wOut[5]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// KCMYcm
+
+static
+cmsUInt8Number* Pack6BytesSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[5]);
+ *output++ = FROM_16_TO_8(wOut[4]);
+ *output++ = FROM_16_TO_8(wOut[3]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// CMYKcm
+static
+cmsUInt8Number* Pack6Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[3];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[4];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[5];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// KCMYcm
+static
+cmsUInt8Number* Pack6WordsSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[5];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[4];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[3];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack4Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[3]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4BytesReverse(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[0]));
+ *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[1]));
+ *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[2]));
+ *output++ = REVERSE_FLAVOR_8(FROM_16_TO_8(wOut[3]));
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack4BytesSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[3]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// ABGR
+static
+cmsUInt8Number* Pack4BytesSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[3]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4BytesSwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[3]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[3];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack4WordsReverse(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
+ output+= 2;
+ *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[1]);
+ output+= 2;
+ *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[2]);
+ output+= 2;
+ *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[3]);
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// ABGR
+static
+cmsUInt8Number* Pack4WordsSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[3];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+// CMYK
+static
+cmsUInt8Number* Pack4WordsBigEndian(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[3]);
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* PackLabV2_8(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* PackALabV2_8(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[0]));
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[1]));
+ *output++ = FROM_16_TO_8(FomLabV4ToLabV2(wOut[2]));
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* PackLabV2_16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[0]);
+ output += 2;
+ *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[1]);
+ output += 2;
+ *(cmsUInt16Number*) output = FomLabV4ToLabV2(wOut[2]);
+ output += 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3Bytes(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesOptimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = (wOut[0] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[2] & 0xFF);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesSwapOptimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = (wOut[2] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[0] & 0xFF);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3Words(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsSwap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsBigEndian(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[1]);
+ output+= 2;
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[2]);
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+ output++;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1Optimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = (wOut[0] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[2] & 0xFF);
+ output++;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = FROM_16_TO_8(wOut[0]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[2]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapFirstOptimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = (wOut[0] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[2] & 0xFF);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1Swap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapOptimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = (wOut[2] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[0] & 0xFF);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[2]);
+ *output++ = FROM_16_TO_8(wOut[1]);
+ *output++ = FROM_16_TO_8(wOut[0]);
+ output++;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3BytesAndSkip1SwapSwapFirstOptimized(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = (wOut[2] & 0xFF);
+ *output++ = (wOut[1] & 0xFF);
+ *output++ = (wOut[0] & 0xFF);
+ output++;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1Swap(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack3WordsAndSkip1SwapSwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[2];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[1];
+ output+= 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+
+static
+cmsUInt8Number* Pack1Byte(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteReversed(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(REVERSE_FLAVOR_16(wOut[0]));
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteSkip1(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *output++ = FROM_16_TO_8(wOut[0]);
+ output++;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1ByteSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output++;
+ *output++ = FROM_16_TO_8(wOut[0]);
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1Word(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1WordReversed(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = REVERSE_FLAVOR_16(wOut[0]);
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1WordBigEndian(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = CHANGE_ENDIAN(wOut[0]);
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+static
+cmsUInt8Number* Pack1WordSkip1(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 4;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+static
+cmsUInt8Number* Pack1WordSkip1SwapFirst(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ output += 2;
+ *(cmsUInt16Number*) output = wOut[0];
+ output+= 2;
+
+ return output;
+
+ cmsUNUSED_PARAMETER(info);
+ cmsUNUSED_PARAMETER(Stride);
+}
+
+
+// Unencoded Float values -- don't try optimize speed
+static
+cmsUInt8Number* PackLabDoubleFrom16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+
+ if (T_PLANAR(info -> OutputFormat)) {
+
+ cmsCIELab Lab;
+ cmsFloat64Number* Out = (cmsFloat64Number*) output;
+ cmsLabEncoded2Float(&Lab, wOut);
+
+ Out[0] = Lab.L;
+ Out[Stride] = Lab.a;
+ Out[Stride*2] = Lab.b;
+
+ return output + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ cmsLabEncoded2Float((cmsCIELab*) output, wOut);
+ return output + (sizeof(cmsCIELab) + T_EXTRA(info ->OutputFormat) * sizeof(cmsFloat64Number));
+ }
+}
+
+
+static
+cmsUInt8Number* PackLabFloatFrom16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ cmsCIELab Lab;
+ cmsLabEncoded2Float(&Lab, wOut);
+
+ if (T_PLANAR(info -> OutputFormat)) {
+
+ cmsFloat32Number* Out = (cmsFloat32Number*) output;
+
+ Out[0] = (cmsFloat32Number)Lab.L;
+ Out[Stride] = (cmsFloat32Number)Lab.a;
+ Out[Stride*2] = (cmsFloat32Number)Lab.b;
+
+ return output + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ ((cmsFloat32Number*) output)[0] = (cmsFloat32Number) Lab.L;
+ ((cmsFloat32Number*) output)[1] = (cmsFloat32Number) Lab.a;
+ ((cmsFloat32Number*) output)[2] = (cmsFloat32Number) Lab.b;
+
+ return output + (3 + T_EXTRA(info ->OutputFormat)) * sizeof(cmsFloat32Number);
+ }
+}
+
+static
+cmsUInt8Number* PackXYZDoubleFrom16(register _cmsTRANSFORM* Info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ cmsCIEXYZ XYZ;
+ cmsFloat64Number* Out = (cmsFloat64Number*) output;
+ cmsXYZEncoded2Float(&XYZ, wOut);
+
+ Out[0] = XYZ.X;
+ Out[Stride] = XYZ.Y;
+ Out[Stride*2] = XYZ.Z;
+
+ return output + sizeof(cmsFloat64Number);
+
+ }
+ else {
+
+ cmsXYZEncoded2Float((cmsCIEXYZ*) output, wOut);
+
+ return output + (sizeof(cmsCIEXYZ) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+ }
+}
+
+static
+cmsUInt8Number* PackXYZFloatFrom16(register _cmsTRANSFORM* Info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ cmsCIEXYZ XYZ;
+ cmsFloat32Number* Out = (cmsFloat32Number*) output;
+ cmsXYZEncoded2Float(&XYZ, wOut);
+
+ Out[0] = (cmsFloat32Number) XYZ.X;
+ Out[Stride] = (cmsFloat32Number) XYZ.Y;
+ Out[Stride*2] = (cmsFloat32Number) XYZ.Z;
+
+ return output + sizeof(cmsFloat32Number);
+
+ }
+ else {
+
+ cmsCIEXYZ XYZ;
+ cmsFloat32Number* Out = (cmsFloat32Number*) output;
+ cmsXYZEncoded2Float(&XYZ, wOut);
+
+ Out[0] = (cmsFloat32Number) XYZ.X;
+ Out[1] = (cmsFloat32Number) XYZ.Y;
+ Out[2] = (cmsFloat32Number) XYZ.Z;
+
+ return output + (3 * sizeof(cmsFloat32Number) + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+ }
+}
+
+static
+cmsUInt8Number* PackDoubleFrom16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
+ cmsFloat64Number v = 0;
+ cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = (cmsFloat64Number) wOut[index] / maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsFloat64Number*) output)[(i + start) * Stride]= v;
+ else
+ ((cmsFloat64Number*) output)[i + start] = v;
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsFloat64Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
+ *swap1 = v;
+ }
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsFloat64Number);
+ else
+ return output + nChan * sizeof(cmsFloat64Number);
+
+}
+
+
+static
+cmsUInt8Number* PackFloatFrom16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35 : 65535.0;
+ cmsFloat64Number v = 0;
+ cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = (cmsFloat64Number) wOut[index] / maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsFloat32Number*) output)[(i + start ) * Stride]= (cmsFloat32Number) v;
+ else
+ ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsFloat32Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
+ *swap1 = (cmsFloat32Number) v;
+ }
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsFloat32Number);
+ else
+ return output + nChan * sizeof(cmsFloat32Number);
+}
+
+
+
+// --------------------------------------------------------------------------------------------------------
+
+static
+cmsUInt8Number* PackFloatsFromFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
+ cmsFloat32Number* swap1 = (cmsFloat32Number*) output;
+ cmsFloat64Number v = 0;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = wOut[index] * maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsFloat32Number*) output)[(i + start)* Stride]= (cmsFloat32Number) v;
+ else
+ ((cmsFloat32Number*) output)[i + start] = (cmsFloat32Number) v;
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsFloat32Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat32Number));
+ *swap1 = (cmsFloat32Number) v;
+ }
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsFloat32Number);
+ else
+ return output + nChan * sizeof(cmsFloat32Number);
+}
+
+static
+cmsUInt8Number* PackDoublesFromFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat64Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0 : 1.0;
+ cmsFloat64Number v = 0;
+ cmsFloat64Number* swap1 = (cmsFloat64Number*) output;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = wOut[index] * maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsFloat64Number*) output)[(i + start) * Stride] = v;
+ else
+ ((cmsFloat64Number*) output)[i + start] = v;
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsFloat64Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsFloat64Number));
+ *swap1 = v;
+ }
+
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsFloat64Number);
+ else
+ return output + nChan * sizeof(cmsFloat64Number);
+
+}
+
+
+
+
+
+static
+cmsUInt8Number* PackLabFloatFromFloat(_cmsTRANSFORM* Info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ cmsFloat32Number* Out = (cmsFloat32Number*) output;
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
+ Out[Stride] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
+ Out[Stride*2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
+
+ return output + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ Out[0] = (cmsFloat32Number) (wOut[0] * 100.0);
+ Out[1] = (cmsFloat32Number) (wOut[1] * 255.0 - 128.0);
+ Out[2] = (cmsFloat32Number) (wOut[2] * 255.0 - 128.0);
+
+ return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+ }
+
+}
+
+
+static
+cmsUInt8Number* PackLabDoubleFromFloat(_cmsTRANSFORM* Info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ cmsFloat64Number* Out = (cmsFloat64Number*) output;
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
+ Out[Stride] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
+ Out[Stride*2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
+
+ return output + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ Out[0] = (cmsFloat64Number) (wOut[0] * 100.0);
+ Out[1] = (cmsFloat64Number) (wOut[1] * 255.0 - 128.0);
+ Out[2] = (cmsFloat64Number) (wOut[2] * 255.0 - 128.0);
+
+ return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+ }
+
+}
+
+
+// From 0..1 range to 0..MAX_ENCODEABLE_XYZ
+static
+cmsUInt8Number* PackXYZFloatFromFloat(_cmsTRANSFORM* Info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ cmsFloat32Number* Out = (cmsFloat32Number*) output;
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+ Out[Stride] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+ Out[Stride*2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+ return output + sizeof(cmsFloat32Number);
+ }
+ else {
+
+ Out[0] = (cmsFloat32Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+ Out[1] = (cmsFloat32Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+ Out[2] = (cmsFloat32Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+ return output + (sizeof(cmsFloat32Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat32Number));
+ }
+
+}
+
+// Same, but convert to double
+static
+cmsUInt8Number* PackXYZDoubleFromFloat(_cmsTRANSFORM* Info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ cmsFloat64Number* Out = (cmsFloat64Number*) output;
+
+ if (T_PLANAR(Info -> OutputFormat)) {
+
+ Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+ Out[Stride] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+ Out[Stride*2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+ return output + sizeof(cmsFloat64Number);
+ }
+ else {
+
+ Out[0] = (cmsFloat64Number) (wOut[0] * MAX_ENCODEABLE_XYZ);
+ Out[1] = (cmsFloat64Number) (wOut[1] * MAX_ENCODEABLE_XYZ);
+ Out[2] = (cmsFloat64Number) (wOut[2] * MAX_ENCODEABLE_XYZ);
+
+ return output + (sizeof(cmsFloat64Number)*3 + T_EXTRA(Info ->OutputFormat) * sizeof(cmsFloat64Number));
+ }
+
+}
+
+
+// ----------------------------------------------------------------------------------------------------------------
+
+#ifndef CMS_NO_HALF_SUPPORT
+
+// Decodes an stream of half floats to wIn[] described by input format
+
+static
+cmsUInt8Number* UnrollHalfTo16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wIn[],
+ register cmsUInt8Number* accum,
+ register cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat32Number v;
+ int i, start = 0;
+ cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 655.35F : 65535.0F;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
+ else
+ v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
+
+ if (Reverse) v = maximum - v;
+
+ wIn[index] = _cmsQuickSaturateWord(v * maximum);
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsUInt16Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsUInt16Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsUInt16Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
+}
+
+// Decodes an stream of half floats to wIn[] described by input format
+
+static
+cmsUInt8Number* UnrollHalfToFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wIn[],
+ cmsUInt8Number* accum,
+ cmsUInt32Number Stride)
+{
+
+ int nChan = T_CHANNELS(info -> InputFormat);
+ int DoSwap = T_DOSWAP(info ->InputFormat);
+ int Reverse = T_FLAVOR(info ->InputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> InputFormat);
+ int Extra = T_EXTRA(info -> InputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ int Planar = T_PLANAR(info -> InputFormat);
+ cmsFloat32Number v;
+ int i, start = 0;
+ cmsFloat32Number maximum = IsInkSpace(info ->InputFormat) ? 100.0F : 1.0F;
+
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ if (Planar)
+ v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[(i + start) * Stride] );
+ else
+ v = _cmsHalf2Float ( ((cmsUInt16Number*) accum)[i + start] ) ;
+
+ v /= maximum;
+
+ wIn[index] = Reverse ? 1 - v : v;
+ }
+
+
+ if (Extra == 0 && SwapFirst) {
+ cmsFloat32Number tmp = wIn[0];
+
+ memmove(&wIn[0], &wIn[1], (nChan-1) * sizeof(cmsFloat32Number));
+ wIn[nChan-1] = tmp;
+ }
+
+ if (T_PLANAR(info -> InputFormat))
+ return accum + sizeof(cmsUInt16Number);
+ else
+ return accum + (nChan + Extra) * sizeof(cmsUInt16Number);
+}
+
+
+static
+cmsUInt8Number* PackHalfFrom16(register _cmsTRANSFORM* info,
+ register cmsUInt16Number wOut[],
+ register cmsUInt8Number* output,
+ register cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 655.35F : 65535.0F;
+ cmsFloat32Number v = 0;
+ cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = (cmsFloat32Number) wOut[index] / maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsUInt16Number*) output)[(i + start ) * Stride]= _cmsFloat2Half(v);
+ else
+ ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half(v);
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsUInt16Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+ *swap1 = _cmsFloat2Half(v);
+ }
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsUInt16Number);
+ else
+ return output + nChan * sizeof(cmsUInt16Number);
+}
+
+
+
+static
+cmsUInt8Number* PackHalfFromFloat(_cmsTRANSFORM* info,
+ cmsFloat32Number wOut[],
+ cmsUInt8Number* output,
+ cmsUInt32Number Stride)
+{
+ int nChan = T_CHANNELS(info -> OutputFormat);
+ int DoSwap = T_DOSWAP(info ->OutputFormat);
+ int Reverse = T_FLAVOR(info ->OutputFormat);
+ int Extra = T_EXTRA(info -> OutputFormat);
+ int SwapFirst = T_SWAPFIRST(info -> OutputFormat);
+ int Planar = T_PLANAR(info -> OutputFormat);
+ int ExtraFirst = DoSwap ^ SwapFirst;
+ cmsFloat32Number maximum = IsInkSpace(info ->OutputFormat) ? 100.0F : 1.0F;
+ cmsUInt16Number* swap1 = (cmsUInt16Number*) output;
+ cmsFloat32Number v = 0;
+ int i, start = 0;
+
+ if (ExtraFirst)
+ start = Extra;
+
+ for (i=0; i < nChan; i++) {
+
+ int index = DoSwap ? (nChan - i - 1) : i;
+
+ v = wOut[index] * maximum;
+
+ if (Reverse)
+ v = maximum - v;
+
+ if (Planar)
+ ((cmsUInt16Number*) output)[(i + start)* Stride]= _cmsFloat2Half( v );
+ else
+ ((cmsUInt16Number*) output)[i + start] = _cmsFloat2Half( v );
+ }
+
+ if (!ExtraFirst) {
+ output += Extra * sizeof(cmsUInt16Number);
+ }
+
+ if (Extra == 0 && SwapFirst) {
+
+ memmove(swap1 + 1, swap1, (nChan-1)* sizeof(cmsUInt16Number));
+ *swap1 = (cmsUInt16Number) _cmsFloat2Half( v );
+ }
+
+ if (T_PLANAR(info -> OutputFormat))
+ return output + sizeof(cmsUInt16Number);
+ else
+ return output + nChan * sizeof(cmsUInt16Number);
+}
+
+#endif
+
+// ----------------------------------------------------------------------------------------------------------------
+
+
+static cmsFormatters16 InputFormatters16[] = {
+
+ // Type Mask Function
+ // ---------------------------- ------------------------------------ ----------------------------
+ { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleTo16},
+ { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleTo16},
+ { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatTo16},
+ { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatTo16},
+ { TYPE_GRAY_DBL, 0, UnrollDouble1Chan},
+ { FLOAT_SH(1)|BYTES_SH(0), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+ ANYSWAP|ANYEXTRA|ANYSPACE, UnrollDoubleTo16},
+ { FLOAT_SH(1)|BYTES_SH(4), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+ ANYSWAP|ANYEXTRA|ANYSPACE, UnrollFloatTo16},
+#ifndef CMS_NO_HALF_SUPPORT
+ { FLOAT_SH(1)|BYTES_SH(2), ANYCHANNELS|ANYPLANAR|ANYSWAPFIRST|ANYFLAVOR|
+ ANYEXTRA|ANYSWAP|ANYSPACE, UnrollHalfTo16},
+#endif
+
+ { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Unroll1Byte},
+ { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Unroll1ByteSkip1},
+ { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(2), ANYSPACE, Unroll1ByteSkip2},
+ { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll1ByteReversed},
+ { COLORSPACE_SH(PT_MCH2)|CHANNELS_SH(2)|BYTES_SH(1), 0, Unroll2Bytes},
+
+ { TYPE_LabV2_8, 0, UnrollLabV2_8 },
+ { TYPE_ALabV2_8, 0, UnrollALabV2_8 },
+ { TYPE_LabV2_16, 0, UnrollLabV2_16 },
+
+ { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Unroll3Bytes},
+ { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSwap},
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3BytesSkip1Swap},
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3BytesSkip1SwapFirst},
+
+ { CHANNELS_SH(3)|EXTRA_SH(1)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+ ANYSPACE, Unroll3BytesSkip1SwapSwapFirst},
+
+ { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Unroll4Bytes},
+ { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Unroll4BytesReverse},
+ { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapFirst},
+ { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll4BytesSwap},
+ { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4BytesSwapSwapFirst},
+
+ { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|
+ ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarBytes},
+
+ { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+ ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollChunkyBytes},
+
+ { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Unroll1Word},
+ { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll1WordReversed},
+ { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(3), ANYSPACE, Unroll1WordSkip3},
+
+ { CHANNELS_SH(2)|BYTES_SH(2), ANYSPACE, Unroll2Words},
+ { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Unroll3Words},
+ { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Unroll4Words},
+
+ { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSwap},
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll3WordsSkip1SwapFirst},
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Unroll3WordsSkip1Swap},
+ { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Unroll4WordsReverse},
+ { CHANNELS_SH(4)|BYTES_SH(2)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapFirst},
+ { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Unroll4WordsSwap},
+ { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Unroll4WordsSwapSwapFirst},
+
+
+ { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollPlanarWords},
+ { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, UnrollAnyWords},
+};
+
+
+
+static cmsFormattersFloat InputFormattersFloat[] = {
+
+ // Type Mask Function
+ // ---------------------------- ------------------------------------ ----------------------------
+ { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, UnrollLabDoubleToFloat},
+ { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, UnrollLabFloatToFloat},
+
+ { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, UnrollXYZDoubleToFloat},
+ { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, UnrollXYZFloatToFloat},
+
+ { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+ ANYCHANNELS|ANYSPACE, UnrollFloatsToFloat},
+
+ { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+ ANYCHANNELS|ANYSPACE, UnrollDoublesToFloat},
+#ifndef CMS_NO_HALF_SUPPORT
+ { FLOAT_SH(1)|BYTES_SH(2), ANYPLANAR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|
+ ANYCHANNELS|ANYSPACE, UnrollHalfToFloat},
+#endif
+};
+
+
+// Bit fields set to one in the mask are not compared
+static
+cmsFormatter _cmsGetStockInputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
+{
+ cmsUInt32Number i;
+ cmsFormatter fr;
+
+ switch (dwFlags) {
+
+ case CMS_PACK_FLAGS_16BITS: {
+ for (i=0; i < sizeof(InputFormatters16) / sizeof(cmsFormatters16); i++) {
+ cmsFormatters16* f = InputFormatters16 + i;
+
+ if ((dwInput & ~f ->Mask) == f ->Type) {
+ fr.Fmt16 = f ->Frm;
+ return fr;
+ }
+ }
+ }
+ break;
+
+ case CMS_PACK_FLAGS_FLOAT: {
+ for (i=0; i < sizeof(InputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
+ cmsFormattersFloat* f = InputFormattersFloat + i;
+
+ if ((dwInput & ~f ->Mask) == f ->Type) {
+ fr.FmtFloat = f ->Frm;
+ return fr;
+ }
+ }
+ }
+ break;
+
+ default:;
+
+ }
+
+ fr.Fmt16 = NULL;
+ return fr;
+}
+
+static cmsFormatters16 OutputFormatters16[] = {
+ // Type Mask Function
+ // ---------------------------- ------------------------------------ ----------------------------
+
+ { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFrom16},
+ { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFrom16},
+
+ { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFrom16},
+ { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFrom16},
+
+ { FLOAT_SH(1)|BYTES_SH(0), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+ ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackDoubleFrom16},
+ { FLOAT_SH(1)|BYTES_SH(4), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+ ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackFloatFrom16},
+#ifndef CMS_NO_HALF_SUPPORT
+ { FLOAT_SH(1)|BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|
+ ANYCHANNELS|ANYPLANAR|ANYEXTRA|ANYSPACE, PackHalfFrom16},
+#endif
+
+ { CHANNELS_SH(1)|BYTES_SH(1), ANYSPACE, Pack1Byte},
+ { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack1ByteSkip1},
+ { CHANNELS_SH(1)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1ByteSkip1SwapFirst},
+
+ { CHANNELS_SH(1)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack1ByteReversed},
+
+ { TYPE_LabV2_8, 0, PackLabV2_8 },
+ { TYPE_ALabV2_8, 0, PackALabV2_8 },
+ { TYPE_LabV2_16, 0, PackLabV2_16 },
+
+ { CHANNELS_SH(3)|BYTES_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesOptimized},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesAndSkip1Optimized},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
+ ANYSPACE, Pack3BytesAndSkip1SwapFirstOptimized},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1)|OPTIMIZED_SH(1),
+ ANYSPACE, Pack3BytesAndSkip1SwapSwapFirstOptimized},
+ { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1)|OPTIMIZED_SH(1),
+ ANYSPACE, Pack3BytesAndSkip1SwapOptimized},
+ { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|OPTIMIZED_SH(1), ANYSPACE, Pack3BytesSwapOptimized},
+
+
+
+ { CHANNELS_SH(3)|BYTES_SH(1), ANYSPACE, Pack3Bytes},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3BytesAndSkip1SwapFirst},
+ { CHANNELS_SH(3)|BYTES_SH(1)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+ ANYSPACE, Pack3BytesAndSkip1SwapSwapFirst},
+ { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1)|EXTRA_SH(1), ANYSPACE, Pack3BytesAndSkip1Swap},
+ { CHANNELS_SH(3)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3BytesSwap},
+ { CHANNELS_SH(6)|BYTES_SH(1), ANYSPACE, Pack6Bytes},
+ { CHANNELS_SH(6)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack6BytesSwap},
+ { CHANNELS_SH(4)|BYTES_SH(1), ANYSPACE, Pack4Bytes},
+ { CHANNELS_SH(4)|BYTES_SH(1)|FLAVOR_SH(1), ANYSPACE, Pack4BytesReverse},
+ { CHANNELS_SH(4)|BYTES_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapFirst},
+ { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack4BytesSwap},
+ { CHANNELS_SH(4)|BYTES_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack4BytesSwapSwapFirst},
+
+ { BYTES_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyBytes},
+ { BYTES_SH(1)|PLANAR_SH(1), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarBytes},
+
+ { CHANNELS_SH(1)|BYTES_SH(2), ANYSPACE, Pack1Word},
+ { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack1WordSkip1},
+ { CHANNELS_SH(1)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack1WordSkip1SwapFirst},
+ { CHANNELS_SH(1)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack1WordReversed},
+ { CHANNELS_SH(1)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack1WordBigEndian},
+ { CHANNELS_SH(3)|BYTES_SH(2), ANYSPACE, Pack3Words},
+ { CHANNELS_SH(3)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack3WordsSwap},
+ { CHANNELS_SH(3)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack3WordsBigEndian},
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1), ANYSPACE, Pack3WordsAndSkip1},
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1), ANYSPACE, Pack3WordsAndSkip1Swap},
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|SWAPFIRST_SH(1), ANYSPACE, Pack3WordsAndSkip1SwapFirst},
+
+ { CHANNELS_SH(3)|BYTES_SH(2)|EXTRA_SH(1)|DOSWAP_SH(1)|SWAPFIRST_SH(1),
+ ANYSPACE, Pack3WordsAndSkip1SwapSwapFirst},
+
+ { CHANNELS_SH(4)|BYTES_SH(2), ANYSPACE, Pack4Words},
+ { CHANNELS_SH(4)|BYTES_SH(2)|FLAVOR_SH(1), ANYSPACE, Pack4WordsReverse},
+ { CHANNELS_SH(4)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack4WordsSwap},
+ { CHANNELS_SH(4)|BYTES_SH(2)|ENDIAN16_SH(1), ANYSPACE, Pack4WordsBigEndian},
+
+ { CHANNELS_SH(6)|BYTES_SH(2), ANYSPACE, Pack6Words},
+ { CHANNELS_SH(6)|BYTES_SH(2)|DOSWAP_SH(1), ANYSPACE, Pack6WordsSwap},
+
+ { BYTES_SH(2)|PLANAR_SH(1), ANYFLAVOR|ANYENDIAN|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackPlanarWords},
+ { BYTES_SH(2), ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYENDIAN|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackAnyWords}
+
+};
+
+
+static cmsFormattersFloat OutputFormattersFloat[] = {
+ // Type Mask Function
+ // ---------------------------- --------------------------------------------------- ----------------------------
+ { TYPE_Lab_FLT, ANYPLANAR|ANYEXTRA, PackLabFloatFromFloat},
+ { TYPE_XYZ_FLT, ANYPLANAR|ANYEXTRA, PackXYZFloatFromFloat},
+
+ { TYPE_Lab_DBL, ANYPLANAR|ANYEXTRA, PackLabDoubleFromFloat},
+ { TYPE_XYZ_DBL, ANYPLANAR|ANYEXTRA, PackXYZDoubleFromFloat},
+
+ { FLOAT_SH(1)|BYTES_SH(4), ANYPLANAR|
+ ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackFloatsFromFloat },
+ { FLOAT_SH(1)|BYTES_SH(0), ANYPLANAR|
+ ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackDoublesFromFloat },
+#ifndef CMS_NO_HALF_SUPPORT
+ { FLOAT_SH(1)|BYTES_SH(2),
+ ANYFLAVOR|ANYSWAPFIRST|ANYSWAP|ANYEXTRA|ANYCHANNELS|ANYSPACE, PackHalfFromFloat },
+#endif
+
+
+
+};
+
+
+// Bit fields set to one in the mask are not compared
+static
+cmsFormatter _cmsGetStockOutputFormatter(cmsUInt32Number dwInput, cmsUInt32Number dwFlags)
+{
+ cmsUInt32Number i;
+ cmsFormatter fr;
+
+
+ switch (dwFlags)
+ {
+
+ case CMS_PACK_FLAGS_16BITS: {
+
+ for (i=0; i < sizeof(OutputFormatters16) / sizeof(cmsFormatters16); i++) {
+ cmsFormatters16* f = OutputFormatters16 + i;
+
+ if ((dwInput & ~f ->Mask) == f ->Type) {
+ fr.Fmt16 = f ->Frm;
+ return fr;
+ }
+ }
+ }
+ break;
+
+ case CMS_PACK_FLAGS_FLOAT: {
+
+ for (i=0; i < sizeof(OutputFormattersFloat) / sizeof(cmsFormattersFloat); i++) {
+ cmsFormattersFloat* f = OutputFormattersFloat + i;
+
+ if ((dwInput & ~f ->Mask) == f ->Type) {
+ fr.FmtFloat = f ->Frm;
+ return fr;
+ }
+ }
+ }
+ break;
+
+ default:;
+
+ }
+
+ fr.Fmt16 = NULL;
+ return fr;
+}
+
+
+typedef struct _cms_formatters_factory_list {
+
+ cmsFormatterFactory Factory;
+ struct _cms_formatters_factory_list *Next;
+
+} cmsFormattersFactoryList;
+
+_cmsFormattersPluginChunkType _cmsFormattersPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupFormatterFactoryList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsFormattersPluginChunkType newHead = { NULL };
+ cmsFormattersFactoryList* entry;
+ cmsFormattersFactoryList* Anterior = NULL;
+ _cmsFormattersPluginChunkType* head = (_cmsFormattersPluginChunkType*) src->chunks[FormattersPlugin];
+
+ _cmsAssert(head != NULL);
+
+ // Walk the list copying all nodes
+ for (entry = head->FactoryList;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ cmsFormattersFactoryList *newEntry = ( cmsFormattersFactoryList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(cmsFormattersFactoryList));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.FactoryList == NULL)
+ newHead.FactoryList = newEntry;
+ }
+
+ ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsFormattersPluginChunkType));
+}
+
+// The interpolation plug-in memory chunk allocator/dup
+void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsAssert(ctx != NULL);
+
+ if (src != NULL) {
+
+ // Duplicate the LIST
+ DupFormatterFactoryList(ctx, src);
+ }
+ else {
+ static _cmsFormattersPluginChunkType FormattersPluginChunk = { NULL };
+ ctx ->chunks[FormattersPlugin] = _cmsSubAllocDup(ctx ->MemPool, &FormattersPluginChunk, sizeof(_cmsFormattersPluginChunkType));
+ }
+}
+
+
+
+// Formatters management
+cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
+ cmsPluginFormatters* Plugin = (cmsPluginFormatters*) Data;
+ cmsFormattersFactoryList* fl ;
+
+ // Reset to built-in defaults
+ if (Data == NULL) {
+
+ ctx ->FactoryList = NULL;
+ return TRUE;
+ }
+
+ fl = (cmsFormattersFactoryList*) _cmsPluginMalloc(ContextID, sizeof(cmsFormattersFactoryList));
+ if (fl == NULL) return FALSE;
+
+ fl ->Factory = Plugin ->FormattersFactory;
+
+ fl ->Next = ctx -> FactoryList;
+ ctx ->FactoryList = fl;
+
+ return TRUE;
+}
+
+cmsFormatter _cmsGetFormatter(cmsContext ContextID,
+ cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
+ cmsFormatterDirection Dir,
+ cmsUInt32Number dwFlags)
+{
+ _cmsFormattersPluginChunkType* ctx = ( _cmsFormattersPluginChunkType*) _cmsContextGetClientChunk(ContextID, FormattersPlugin);
+ cmsFormattersFactoryList* f;
+
+ for (f =ctx->FactoryList; f != NULL; f = f ->Next) {
+
+ cmsFormatter fn = f ->Factory(Type, Dir, dwFlags);
+ if (fn.Fmt16 != NULL) return fn;
+ }
+
+ // Revert to default
+ if (Dir == cmsFormatterInput)
+ return _cmsGetStockInputFormatter(Type, dwFlags);
+ else
+ return _cmsGetStockOutputFormatter(Type, dwFlags);
+}
+
+
+// Return whatever given formatter refers to float values
+cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type)
+{
+ return T_FLOAT(Type) ? TRUE : FALSE;
+}
+
+// Return whatever given formatter refers to 8 bits
+cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type)
+{
+ int Bytes = T_BYTES(Type);
+
+ return (Bytes == 1);
+}
+
+// Build a suitable formatter for the colorspace of this profile
+cmsUInt32Number CMSEXPORT cmsFormatterForColorspaceOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
+{
+
+ cmsColorSpaceSignature ColorSpace = cmsGetColorSpace(hProfile);
+ cmsUInt32Number ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace);
+ cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace);
+ cmsUInt32Number Float = lIsFloat ? 1 : 0;
+
+ // Create a fake formatter for result
+ return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
+}
+
+// Build a suitable formatter for the colorspace of this profile
+cmsUInt32Number CMSEXPORT cmsFormatterForPCSOfProfile(cmsHPROFILE hProfile, cmsUInt32Number nBytes, cmsBool lIsFloat)
+{
+
+ cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);
+ int ColorSpaceBits = _cmsLCMScolorSpace(ColorSpace);
+ cmsUInt32Number nOutputChans = cmsChannelsOf(ColorSpace);
+ cmsUInt32Number Float = lIsFloat ? 1 : 0;
+
+ // Create a fake formatter for result
+ return FLOAT_SH(Float) | COLORSPACE_SH(ColorSpaceBits) | BYTES_SH(nBytes) | CHANNELS_SH(nOutputChans);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c
new file mode 100644
index 0000000000..102cd7d21e
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmspcs.c
@@ -0,0 +1,931 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// inter PCS conversions XYZ <-> CIE L* a* b*
+/*
+
+
+ CIE 15:2004 CIELab is defined as:
+
+ L* = 116*f(Y/Yn) - 16 0 <= L* <= 100
+ a* = 500*[f(X/Xn) - f(Y/Yn)]
+ b* = 200*[f(Y/Yn) - f(Z/Zn)]
+
+ and
+
+ f(t) = t^(1/3) 1 >= t > (24/116)^3
+ (841/108)*t + (16/116) 0 <= t <= (24/116)^3
+
+
+ Reverse transform is:
+
+ X = Xn*[a* / 500 + (L* + 16) / 116] ^ 3 if (X/Xn) > (24/116)
+ = Xn*(a* / 500 + L* / 116) / 7.787 if (X/Xn) <= (24/116)
+
+
+
+ PCS in Lab2 is encoded as:
+
+ 8 bit Lab PCS:
+
+ L* 0..100 into a 0..ff byte.
+ a* t + 128 range is -128.0 +127.0
+ b*
+
+ 16 bit Lab PCS:
+
+ L* 0..100 into a 0..ff00 word.
+ a* t + 128 range is -128.0 +127.9961
+ b*
+
+
+
+Interchange Space Component Actual Range Encoded Range
+CIE XYZ X 0 -> 1.99997 0x0000 -> 0xffff
+CIE XYZ Y 0 -> 1.99997 0x0000 -> 0xffff
+CIE XYZ Z 0 -> 1.99997 0x0000 -> 0xffff
+
+Version 2,3
+-----------
+
+CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xff00
+CIELAB (16 bit) a* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff
+CIELAB (16 bit) b* -128.0 -> +127.996 0x0000 -> 0x8000 -> 0xffff
+
+
+Version 4
+---------
+
+CIELAB (16 bit) L* 0 -> 100.0 0x0000 -> 0xffff
+CIELAB (16 bit) a* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff
+CIELAB (16 bit) b* -128.0 -> +127 0x0000 -> 0x8080 -> 0xffff
+
+*/
+
+// Conversions
+void CMSEXPORT cmsXYZ2xyY(cmsCIExyY* Dest, const cmsCIEXYZ* Source)
+{
+ cmsFloat64Number ISum;
+
+ ISum = 1./(Source -> X + Source -> Y + Source -> Z);
+
+ Dest -> x = (Source -> X) * ISum;
+ Dest -> y = (Source -> Y) * ISum;
+ Dest -> Y = Source -> Y;
+}
+
+void CMSEXPORT cmsxyY2XYZ(cmsCIEXYZ* Dest, const cmsCIExyY* Source)
+{
+ Dest -> X = (Source -> x / Source -> y) * Source -> Y;
+ Dest -> Y = Source -> Y;
+ Dest -> Z = ((1 - Source -> x - Source -> y) / Source -> y) * Source -> Y;
+}
+
+static
+cmsFloat64Number f(cmsFloat64Number t)
+{
+ const cmsFloat64Number Limit = (24.0/116.0) * (24.0/116.0) * (24.0/116.0);
+
+ if (t <= Limit)
+ return (841.0/108.0) * t + (16.0/116.0);
+ else
+ return pow(t, 1.0/3.0);
+}
+
+static
+cmsFloat64Number f_1(cmsFloat64Number t)
+{
+ const cmsFloat64Number Limit = (24.0/116.0);
+
+ if (t <= Limit) {
+ return (108.0/841.0) * (t - (16.0/116.0));
+ }
+
+ return t * t * t;
+}
+
+
+// Standard XYZ to Lab. it can handle negative XZY numbers in some cases
+void CMSEXPORT cmsXYZ2Lab(const cmsCIEXYZ* WhitePoint, cmsCIELab* Lab, const cmsCIEXYZ* xyz)
+{
+ cmsFloat64Number fx, fy, fz;
+
+ if (WhitePoint == NULL)
+ WhitePoint = cmsD50_XYZ();
+
+ fx = f(xyz->X / WhitePoint->X);
+ fy = f(xyz->Y / WhitePoint->Y);
+ fz = f(xyz->Z / WhitePoint->Z);
+
+ Lab->L = 116.0*fy - 16.0;
+ Lab->a = 500.0*(fx - fy);
+ Lab->b = 200.0*(fy - fz);
+}
+
+
+// Standard XYZ to Lab. It can return negative XYZ in some cases
+void CMSEXPORT cmsLab2XYZ(const cmsCIEXYZ* WhitePoint, cmsCIEXYZ* xyz, const cmsCIELab* Lab)
+{
+ cmsFloat64Number x, y, z;
+
+ if (WhitePoint == NULL)
+ WhitePoint = cmsD50_XYZ();
+
+ y = (Lab-> L + 16.0) / 116.0;
+ x = y + 0.002 * Lab -> a;
+ z = y - 0.005 * Lab -> b;
+
+ xyz -> X = f_1(x) * WhitePoint -> X;
+ xyz -> Y = f_1(y) * WhitePoint -> Y;
+ xyz -> Z = f_1(z) * WhitePoint -> Z;
+
+}
+
+static
+cmsFloat64Number L2float2(cmsUInt16Number v)
+{
+ return (cmsFloat64Number) v / 652.800;
+}
+
+// the a/b part
+static
+cmsFloat64Number ab2float2(cmsUInt16Number v)
+{
+ return ((cmsFloat64Number) v / 256.0) - 128.0;
+}
+
+static
+cmsUInt16Number L2Fix2(cmsFloat64Number L)
+{
+ return _cmsQuickSaturateWord(L * 652.8);
+}
+
+static
+cmsUInt16Number ab2Fix2(cmsFloat64Number ab)
+{
+ return _cmsQuickSaturateWord((ab + 128.0) * 256.0);
+}
+
+
+static
+cmsFloat64Number L2float4(cmsUInt16Number v)
+{
+ return (cmsFloat64Number) v / 655.35;
+}
+
+// the a/b part
+static
+cmsFloat64Number ab2float4(cmsUInt16Number v)
+{
+ return ((cmsFloat64Number) v / 257.0) - 128.0;
+}
+
+
+void CMSEXPORT cmsLabEncoded2FloatV2(cmsCIELab* Lab, const cmsUInt16Number wLab[3])
+{
+ Lab->L = L2float2(wLab[0]);
+ Lab->a = ab2float2(wLab[1]);
+ Lab->b = ab2float2(wLab[2]);
+}
+
+
+void CMSEXPORT cmsLabEncoded2Float(cmsCIELab* Lab, const cmsUInt16Number wLab[3])
+{
+ Lab->L = L2float4(wLab[0]);
+ Lab->a = ab2float4(wLab[1]);
+ Lab->b = ab2float4(wLab[2]);
+}
+
+static
+cmsFloat64Number Clamp_L_doubleV2(cmsFloat64Number L)
+{
+ const cmsFloat64Number L_max = (cmsFloat64Number) (0xFFFF * 100.0) / 0xFF00;
+
+ if (L < 0) L = 0;
+ if (L > L_max) L = L_max;
+
+ return L;
+}
+
+
+static
+cmsFloat64Number Clamp_ab_doubleV2(cmsFloat64Number ab)
+{
+ if (ab < MIN_ENCODEABLE_ab2) ab = MIN_ENCODEABLE_ab2;
+ if (ab > MAX_ENCODEABLE_ab2) ab = MAX_ENCODEABLE_ab2;
+
+ return ab;
+}
+
+void CMSEXPORT cmsFloat2LabEncodedV2(cmsUInt16Number wLab[3], const cmsCIELab* fLab)
+{
+ cmsCIELab Lab;
+
+ Lab.L = Clamp_L_doubleV2(fLab ->L);
+ Lab.a = Clamp_ab_doubleV2(fLab ->a);
+ Lab.b = Clamp_ab_doubleV2(fLab ->b);
+
+ wLab[0] = L2Fix2(Lab.L);
+ wLab[1] = ab2Fix2(Lab.a);
+ wLab[2] = ab2Fix2(Lab.b);
+}
+
+
+static
+cmsFloat64Number Clamp_L_doubleV4(cmsFloat64Number L)
+{
+ if (L < 0) L = 0;
+ if (L > 100.0) L = 100.0;
+
+ return L;
+}
+
+static
+cmsFloat64Number Clamp_ab_doubleV4(cmsFloat64Number ab)
+{
+ if (ab < MIN_ENCODEABLE_ab4) ab = MIN_ENCODEABLE_ab4;
+ if (ab > MAX_ENCODEABLE_ab4) ab = MAX_ENCODEABLE_ab4;
+
+ return ab;
+}
+
+static
+cmsUInt16Number L2Fix4(cmsFloat64Number L)
+{
+ return _cmsQuickSaturateWord(L * 655.35);
+}
+
+static
+cmsUInt16Number ab2Fix4(cmsFloat64Number ab)
+{
+ return _cmsQuickSaturateWord((ab + 128.0) * 257.0);
+}
+
+void CMSEXPORT cmsFloat2LabEncoded(cmsUInt16Number wLab[3], const cmsCIELab* fLab)
+{
+ cmsCIELab Lab;
+
+ Lab.L = Clamp_L_doubleV4(fLab ->L);
+ Lab.a = Clamp_ab_doubleV4(fLab ->a);
+ Lab.b = Clamp_ab_doubleV4(fLab ->b);
+
+ wLab[0] = L2Fix4(Lab.L);
+ wLab[1] = ab2Fix4(Lab.a);
+ wLab[2] = ab2Fix4(Lab.b);
+}
+
+// Auxiliar: convert to Radians
+static
+cmsFloat64Number RADIANS(cmsFloat64Number deg)
+{
+ return (deg * M_PI) / 180.;
+}
+
+
+// Auxiliar: atan2 but operating in degrees and returning 0 if a==b==0
+static
+cmsFloat64Number atan2deg(cmsFloat64Number a, cmsFloat64Number b)
+{
+ cmsFloat64Number h;
+
+ if (a == 0 && b == 0)
+ h = 0;
+ else
+ h = atan2(a, b);
+
+ h *= (180. / M_PI);
+
+ while (h > 360.)
+ h -= 360.;
+
+ while ( h < 0)
+ h += 360.;
+
+ return h;
+}
+
+
+// Auxiliar: Square
+static
+cmsFloat64Number Sqr(cmsFloat64Number v)
+{
+ return v * v;
+}
+// From cylindrical coordinates. No check is performed, then negative values are allowed
+void CMSEXPORT cmsLab2LCh(cmsCIELCh* LCh, const cmsCIELab* Lab)
+{
+ LCh -> L = Lab -> L;
+ LCh -> C = pow(Sqr(Lab ->a) + Sqr(Lab ->b), 0.5);
+ LCh -> h = atan2deg(Lab ->b, Lab ->a);
+}
+
+
+// To cylindrical coordinates. No check is performed, then negative values are allowed
+void CMSEXPORT cmsLCh2Lab(cmsCIELab* Lab, const cmsCIELCh* LCh)
+{
+ cmsFloat64Number h = (LCh -> h * M_PI) / 180.0;
+
+ Lab -> L = LCh -> L;
+ Lab -> a = LCh -> C * cos(h);
+ Lab -> b = LCh -> C * sin(h);
+}
+
+// In XYZ All 3 components are encoded using 1.15 fixed point
+static
+cmsUInt16Number XYZ2Fix(cmsFloat64Number d)
+{
+ return _cmsQuickSaturateWord(d * 32768.0);
+}
+
+void CMSEXPORT cmsFloat2XYZEncoded(cmsUInt16Number XYZ[3], const cmsCIEXYZ* fXYZ)
+{
+ cmsCIEXYZ xyz;
+
+ xyz.X = fXYZ -> X;
+ xyz.Y = fXYZ -> Y;
+ xyz.Z = fXYZ -> Z;
+
+ // Clamp to encodeable values.
+ if (xyz.Y <= 0) {
+
+ xyz.X = 0;
+ xyz.Y = 0;
+ xyz.Z = 0;
+ }
+
+ if (xyz.X > MAX_ENCODEABLE_XYZ)
+ xyz.X = MAX_ENCODEABLE_XYZ;
+
+ if (xyz.X < 0)
+ xyz.X = 0;
+
+ if (xyz.Y > MAX_ENCODEABLE_XYZ)
+ xyz.Y = MAX_ENCODEABLE_XYZ;
+
+ if (xyz.Y < 0)
+ xyz.Y = 0;
+
+ if (xyz.Z > MAX_ENCODEABLE_XYZ)
+ xyz.Z = MAX_ENCODEABLE_XYZ;
+
+ if (xyz.Z < 0)
+ xyz.Z = 0;
+
+
+ XYZ[0] = XYZ2Fix(xyz.X);
+ XYZ[1] = XYZ2Fix(xyz.Y);
+ XYZ[2] = XYZ2Fix(xyz.Z);
+}
+
+
+// To convert from Fixed 1.15 point to cmsFloat64Number
+static
+cmsFloat64Number XYZ2float(cmsUInt16Number v)
+{
+ cmsS15Fixed16Number fix32;
+
+ // From 1.15 to 15.16
+ fix32 = v << 1;
+
+ // From fixed 15.16 to cmsFloat64Number
+ return _cms15Fixed16toDouble(fix32);
+}
+
+
+void CMSEXPORT cmsXYZEncoded2Float(cmsCIEXYZ* fXYZ, const cmsUInt16Number XYZ[3])
+{
+ fXYZ -> X = XYZ2float(XYZ[0]);
+ fXYZ -> Y = XYZ2float(XYZ[1]);
+ fXYZ -> Z = XYZ2float(XYZ[2]);
+}
+
+
+// Returns dE on two Lab values
+cmsFloat64Number CMSEXPORT cmsDeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+ cmsFloat64Number dL, da, db;
+
+ dL = fabs(Lab1 -> L - Lab2 -> L);
+ da = fabs(Lab1 -> a - Lab2 -> a);
+ db = fabs(Lab1 -> b - Lab2 -> b);
+
+ return pow(Sqr(dL) + Sqr(da) + Sqr(db), 0.5);
+}
+
+
+// Return the CIE94 Delta E
+cmsFloat64Number CMSEXPORT cmsCIE94DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+ cmsCIELCh LCh1, LCh2;
+ cmsFloat64Number dE, dL, dC, dh, dhsq;
+ cmsFloat64Number c12, sc, sh;
+
+ dL = fabs(Lab1 ->L - Lab2 ->L);
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+ dC = fabs(LCh1.C - LCh2.C);
+ dE = cmsDeltaE(Lab1, Lab2);
+
+ dhsq = Sqr(dE) - Sqr(dL) - Sqr(dC);
+ if (dhsq < 0)
+ dh = 0;
+ else
+ dh = pow(dhsq, 0.5);
+
+ c12 = sqrt(LCh1.C * LCh2.C);
+
+ sc = 1.0 + (0.048 * c12);
+ sh = 1.0 + (0.014 * c12);
+
+ return sqrt(Sqr(dL) + Sqr(dC) / Sqr(sc) + Sqr(dh) / Sqr(sh));
+}
+
+
+// Auxiliary
+static
+cmsFloat64Number ComputeLBFD(const cmsCIELab* Lab)
+{
+ cmsFloat64Number yt;
+
+ if (Lab->L > 7.996969)
+ yt = (Sqr((Lab->L+16)/116)*((Lab->L+16)/116))*100;
+ else
+ yt = 100 * (Lab->L / 903.3);
+
+ return (54.6 * (M_LOG10E * (log(yt + 1.5))) - 9.6);
+}
+
+
+
+// bfd - gets BFD(1:1) difference between Lab1, Lab2
+cmsFloat64Number CMSEXPORT cmsBFDdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2)
+{
+ cmsFloat64Number lbfd1,lbfd2,AveC,Aveh,dE,deltaL,
+ deltaC,deltah,dc,t,g,dh,rh,rc,rt,bfd;
+ cmsCIELCh LCh1, LCh2;
+
+
+ lbfd1 = ComputeLBFD(Lab1);
+ lbfd2 = ComputeLBFD(Lab2);
+ deltaL = lbfd2 - lbfd1;
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+ deltaC = LCh2.C - LCh1.C;
+ AveC = (LCh1.C+LCh2.C)/2;
+ Aveh = (LCh1.h+LCh2.h)/2;
+
+ dE = cmsDeltaE(Lab1, Lab2);
+
+ if (Sqr(dE)>(Sqr(Lab2->L-Lab1->L)+Sqr(deltaC)))
+ deltah = sqrt(Sqr(dE)-Sqr(Lab2->L-Lab1->L)-Sqr(deltaC));
+ else
+ deltah =0;
+
+
+ dc = 0.035 * AveC / (1 + 0.00365 * AveC)+0.521;
+ g = sqrt(Sqr(Sqr(AveC))/(Sqr(Sqr(AveC))+14000));
+ t = 0.627+(0.055*cos((Aveh-254)/(180/M_PI))-
+ 0.040*cos((2*Aveh-136)/(180/M_PI))+
+ 0.070*cos((3*Aveh-31)/(180/M_PI))+
+ 0.049*cos((4*Aveh+114)/(180/M_PI))-
+ 0.015*cos((5*Aveh-103)/(180/M_PI)));
+
+ dh = dc*(g*t+1-g);
+ rh = -0.260*cos((Aveh-308)/(180/M_PI))-
+ 0.379*cos((2*Aveh-160)/(180/M_PI))-
+ 0.636*cos((3*Aveh+254)/(180/M_PI))+
+ 0.226*cos((4*Aveh+140)/(180/M_PI))-
+ 0.194*cos((5*Aveh+280)/(180/M_PI));
+
+ rc = sqrt((AveC*AveC*AveC*AveC*AveC*AveC)/((AveC*AveC*AveC*AveC*AveC*AveC)+70000000));
+ rt = rh*rc;
+
+ bfd = sqrt(Sqr(deltaL)+Sqr(deltaC/dc)+Sqr(deltah/dh)+(rt*(deltaC/dc)*(deltah/dh)));
+
+ return bfd;
+}
+
+
+// cmc - CMC(l:c) difference between Lab1, Lab2
+cmsFloat64Number CMSEXPORT cmsCMCdeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2, cmsFloat64Number l, cmsFloat64Number c)
+{
+ cmsFloat64Number dE,dL,dC,dh,sl,sc,sh,t,f,cmc;
+ cmsCIELCh LCh1, LCh2;
+
+ if (Lab1 ->L == 0 && Lab2 ->L == 0) return 0;
+
+ cmsLab2LCh(&LCh1, Lab1);
+ cmsLab2LCh(&LCh2, Lab2);
+
+
+ dL = Lab2->L-Lab1->L;
+ dC = LCh2.C-LCh1.C;
+
+ dE = cmsDeltaE(Lab1, Lab2);
+
+ if (Sqr(dE)>(Sqr(dL)+Sqr(dC)))
+ dh = sqrt(Sqr(dE)-Sqr(dL)-Sqr(dC));
+ else
+ dh =0;
+
+ if ((LCh1.h > 164) && (LCh1.h < 345))
+ t = 0.56 + fabs(0.2 * cos(((LCh1.h + 168)/(180/M_PI))));
+ else
+ t = 0.36 + fabs(0.4 * cos(((LCh1.h + 35 )/(180/M_PI))));
+
+ sc = 0.0638 * LCh1.C / (1 + 0.0131 * LCh1.C) + 0.638;
+ sl = 0.040975 * Lab1->L /(1 + 0.01765 * Lab1->L);
+
+ if (Lab1->L<16)
+ sl = 0.511;
+
+ f = sqrt((LCh1.C * LCh1.C * LCh1.C * LCh1.C)/((LCh1.C * LCh1.C * LCh1.C * LCh1.C)+1900));
+ sh = sc*(t*f+1-f);
+ cmc = sqrt(Sqr(dL/(l*sl))+Sqr(dC/(c*sc))+Sqr(dh/sh));
+
+ return cmc;
+}
+
+// dE2000 The weightings KL, KC and KH can be modified to reflect the relative
+// importance of lightness, chroma and hue in different industrial applications
+cmsFloat64Number CMSEXPORT cmsCIE2000DeltaE(const cmsCIELab* Lab1, const cmsCIELab* Lab2,
+ cmsFloat64Number Kl, cmsFloat64Number Kc, cmsFloat64Number Kh)
+{
+ cmsFloat64Number L1 = Lab1->L;
+ cmsFloat64Number a1 = Lab1->a;
+ cmsFloat64Number b1 = Lab1->b;
+ cmsFloat64Number C = sqrt( Sqr(a1) + Sqr(b1) );
+
+ cmsFloat64Number Ls = Lab2 ->L;
+ cmsFloat64Number as = Lab2 ->a;
+ cmsFloat64Number bs = Lab2 ->b;
+ cmsFloat64Number Cs = sqrt( Sqr(as) + Sqr(bs) );
+
+ cmsFloat64Number G = 0.5 * ( 1 - sqrt(pow((C + Cs) / 2 , 7.0) / (pow((C + Cs) / 2, 7.0) + pow(25.0, 7.0) ) ));
+
+ cmsFloat64Number a_p = (1 + G ) * a1;
+ cmsFloat64Number b_p = b1;
+ cmsFloat64Number C_p = sqrt( Sqr(a_p) + Sqr(b_p));
+ cmsFloat64Number h_p = atan2deg(b_p, a_p);
+
+
+ cmsFloat64Number a_ps = (1 + G) * as;
+ cmsFloat64Number b_ps = bs;
+ cmsFloat64Number C_ps = sqrt(Sqr(a_ps) + Sqr(b_ps));
+ cmsFloat64Number h_ps = atan2deg(b_ps, a_ps);
+
+ cmsFloat64Number meanC_p =(C_p + C_ps) / 2;
+
+ cmsFloat64Number hps_plus_hp = h_ps + h_p;
+ cmsFloat64Number hps_minus_hp = h_ps - h_p;
+
+ cmsFloat64Number meanh_p = fabs(hps_minus_hp) <= 180.000001 ? (hps_plus_hp)/2 :
+ (hps_plus_hp) < 360 ? (hps_plus_hp + 360)/2 :
+ (hps_plus_hp - 360)/2;
+
+ cmsFloat64Number delta_h = (hps_minus_hp) <= -180.000001 ? (hps_minus_hp + 360) :
+ (hps_minus_hp) > 180 ? (hps_minus_hp - 360) :
+ (hps_minus_hp);
+ cmsFloat64Number delta_L = (Ls - L1);
+ cmsFloat64Number delta_C = (C_ps - C_p );
+
+
+ cmsFloat64Number delta_H =2 * sqrt(C_ps*C_p) * sin(RADIANS(delta_h) / 2);
+
+ cmsFloat64Number T = 1 - 0.17 * cos(RADIANS(meanh_p-30))
+ + 0.24 * cos(RADIANS(2*meanh_p))
+ + 0.32 * cos(RADIANS(3*meanh_p + 6))
+ - 0.2 * cos(RADIANS(4*meanh_p - 63));
+
+ cmsFloat64Number Sl = 1 + (0.015 * Sqr((Ls + L1) /2- 50) )/ sqrt(20 + Sqr( (Ls+L1)/2 - 50) );
+
+ cmsFloat64Number Sc = 1 + 0.045 * (C_p + C_ps)/2;
+ cmsFloat64Number Sh = 1 + 0.015 * ((C_ps + C_p)/2) * T;
+
+ cmsFloat64Number delta_ro = 30 * exp( -Sqr(((meanh_p - 275 ) / 25)));
+
+ cmsFloat64Number Rc = 2 * sqrt(( pow(meanC_p, 7.0) )/( pow(meanC_p, 7.0) + pow(25.0, 7.0)));
+
+ cmsFloat64Number Rt = -sin(2 * RADIANS(delta_ro)) * Rc;
+
+ cmsFloat64Number deltaE00 = sqrt( Sqr(delta_L /(Sl * Kl)) +
+ Sqr(delta_C/(Sc * Kc)) +
+ Sqr(delta_H/(Sh * Kh)) +
+ Rt*(delta_C/(Sc * Kc)) * (delta_H / (Sh * Kh)));
+
+ return deltaE00;
+}
+
+// This function returns a number of gridpoints to be used as LUT table. It assumes same number
+// of gripdpoints in all dimensions. Flags may override the choice.
+int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags)
+{
+ int nChannels;
+
+ // Already specified?
+ if (dwFlags & 0x00FF0000) {
+ // Yes, grab'em
+ return (dwFlags >> 16) & 0xFF;
+ }
+
+ nChannels = cmsChannelsOf(Colorspace);
+
+ // HighResPrecalc is maximum resolution
+ if (dwFlags & cmsFLAGS_HIGHRESPRECALC) {
+
+ if (nChannels > 4)
+ return 7; // 7 for Hifi
+
+ if (nChannels == 4) // 23 for CMYK
+ return 23;
+
+ return 49; // 49 for RGB and others
+ }
+
+
+ // LowResPrecal is lower resolution
+ if (dwFlags & cmsFLAGS_LOWRESPRECALC) {
+
+ if (nChannels > 4)
+ return 6; // 6 for more than 4 channels
+
+ if (nChannels == 1)
+ return 33; // For monochrome
+
+ return 17; // 17 for remaining
+ }
+
+ // Default values
+ if (nChannels > 4)
+ return 7; // 7 for Hifi
+
+ if (nChannels == 4)
+ return 17; // 17 for CMYK
+
+ return 33; // 33 for RGB
+}
+
+
+cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
+ cmsUInt16Number **White,
+ cmsUInt16Number **Black,
+ cmsUInt32Number *nOutputs)
+{
+ // Only most common spaces
+
+ static cmsUInt16Number RGBblack[4] = { 0, 0, 0 };
+ static cmsUInt16Number RGBwhite[4] = { 0xffff, 0xffff, 0xffff };
+ static cmsUInt16Number CMYKblack[4] = { 0xffff, 0xffff, 0xffff, 0xffff }; // 400% of ink
+ static cmsUInt16Number CMYKwhite[4] = { 0, 0, 0, 0 };
+ static cmsUInt16Number LABblack[4] = { 0, 0x8080, 0x8080 }; // V4 Lab encoding
+ static cmsUInt16Number LABwhite[4] = { 0xFFFF, 0x8080, 0x8080 };
+ static cmsUInt16Number CMYblack[4] = { 0xffff, 0xffff, 0xffff };
+ static cmsUInt16Number CMYwhite[4] = { 0, 0, 0 };
+ static cmsUInt16Number Grayblack[4] = { 0 };
+ static cmsUInt16Number GrayWhite[4] = { 0xffff };
+
+ switch (Space) {
+
+ case cmsSigGrayData: if (White) *White = GrayWhite;
+ if (Black) *Black = Grayblack;
+ if (nOutputs) *nOutputs = 1;
+ return TRUE;
+
+ case cmsSigRgbData: if (White) *White = RGBwhite;
+ if (Black) *Black = RGBblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ case cmsSigLabData: if (White) *White = LABwhite;
+ if (Black) *Black = LABblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ case cmsSigCmykData: if (White) *White = CMYKwhite;
+ if (Black) *Black = CMYKblack;
+ if (nOutputs) *nOutputs = 4;
+ return TRUE;
+
+ case cmsSigCmyData: if (White) *White = CMYwhite;
+ if (Black) *Black = CMYblack;
+ if (nOutputs) *nOutputs = 3;
+ return TRUE;
+
+ default:;
+ }
+
+ return FALSE;
+}
+
+
+
+// Several utilities -------------------------------------------------------
+
+// Translate from our colorspace to ICC representation
+
+cmsColorSpaceSignature CMSEXPORT _cmsICCcolorSpace(int OurNotation)
+{
+ switch (OurNotation) {
+
+ case 1:
+ case PT_GRAY: return cmsSigGrayData;
+
+ case 2:
+ case PT_RGB: return cmsSigRgbData;
+
+ case PT_CMY: return cmsSigCmyData;
+ case PT_CMYK: return cmsSigCmykData;
+ case PT_YCbCr:return cmsSigYCbCrData;
+ case PT_YUV: return cmsSigLuvData;
+ case PT_XYZ: return cmsSigXYZData;
+
+ case PT_LabV2:
+ case PT_Lab: return cmsSigLabData;
+
+ case PT_YUVK: return cmsSigLuvKData;
+ case PT_HSV: return cmsSigHsvData;
+ case PT_HLS: return cmsSigHlsData;
+ case PT_Yxy: return cmsSigYxyData;
+
+ case PT_MCH1: return cmsSigMCH1Data;
+ case PT_MCH2: return cmsSigMCH2Data;
+ case PT_MCH3: return cmsSigMCH3Data;
+ case PT_MCH4: return cmsSigMCH4Data;
+ case PT_MCH5: return cmsSigMCH5Data;
+ case PT_MCH6: return cmsSigMCH6Data;
+ case PT_MCH7: return cmsSigMCH7Data;
+ case PT_MCH8: return cmsSigMCH8Data;
+
+ case PT_MCH9: return cmsSigMCH9Data;
+ case PT_MCH10: return cmsSigMCHAData;
+ case PT_MCH11: return cmsSigMCHBData;
+ case PT_MCH12: return cmsSigMCHCData;
+ case PT_MCH13: return cmsSigMCHDData;
+ case PT_MCH14: return cmsSigMCHEData;
+ case PT_MCH15: return cmsSigMCHFData;
+
+ default: return (cmsColorSpaceSignature) (-1);
+ }
+}
+
+
+int CMSEXPORT _cmsLCMScolorSpace(cmsColorSpaceSignature ProfileSpace)
+{
+ switch (ProfileSpace) {
+
+ case cmsSigGrayData: return PT_GRAY;
+ case cmsSigRgbData: return PT_RGB;
+ case cmsSigCmyData: return PT_CMY;
+ case cmsSigCmykData: return PT_CMYK;
+ case cmsSigYCbCrData:return PT_YCbCr;
+ case cmsSigLuvData: return PT_YUV;
+ case cmsSigXYZData: return PT_XYZ;
+ case cmsSigLabData: return PT_Lab;
+ case cmsSigLuvKData: return PT_YUVK;
+ case cmsSigHsvData: return PT_HSV;
+ case cmsSigHlsData: return PT_HLS;
+ case cmsSigYxyData: return PT_Yxy;
+
+ case cmsSig1colorData:
+ case cmsSigMCH1Data: return PT_MCH1;
+
+ case cmsSig2colorData:
+ case cmsSigMCH2Data: return PT_MCH2;
+
+ case cmsSig3colorData:
+ case cmsSigMCH3Data: return PT_MCH3;
+
+ case cmsSig4colorData:
+ case cmsSigMCH4Data: return PT_MCH4;
+
+ case cmsSig5colorData:
+ case cmsSigMCH5Data: return PT_MCH5;
+
+ case cmsSig6colorData:
+ case cmsSigMCH6Data: return PT_MCH6;
+
+ case cmsSigMCH7Data:
+ case cmsSig7colorData:return PT_MCH7;
+
+ case cmsSigMCH8Data:
+ case cmsSig8colorData:return PT_MCH8;
+
+ case cmsSigMCH9Data:
+ case cmsSig9colorData:return PT_MCH9;
+
+ case cmsSigMCHAData:
+ case cmsSig10colorData:return PT_MCH10;
+
+ case cmsSigMCHBData:
+ case cmsSig11colorData:return PT_MCH11;
+
+ case cmsSigMCHCData:
+ case cmsSig12colorData:return PT_MCH12;
+
+ case cmsSigMCHDData:
+ case cmsSig13colorData:return PT_MCH13;
+
+ case cmsSigMCHEData:
+ case cmsSig14colorData:return PT_MCH14;
+
+ case cmsSigMCHFData:
+ case cmsSig15colorData:return PT_MCH15;
+
+ default: return (cmsColorSpaceSignature) (-1);
+ }
+}
+
+
+cmsUInt32Number CMSEXPORT cmsChannelsOf(cmsColorSpaceSignature ColorSpace)
+{
+ switch (ColorSpace) {
+
+ case cmsSigMCH1Data:
+ case cmsSig1colorData:
+ case cmsSigGrayData: return 1;
+
+ case cmsSigMCH2Data:
+ case cmsSig2colorData: return 2;
+
+ case cmsSigXYZData:
+ case cmsSigLabData:
+ case cmsSigLuvData:
+ case cmsSigYCbCrData:
+ case cmsSigYxyData:
+ case cmsSigRgbData:
+ case cmsSigHsvData:
+ case cmsSigHlsData:
+ case cmsSigCmyData:
+ case cmsSigMCH3Data:
+ case cmsSig3colorData: return 3;
+
+ case cmsSigLuvKData:
+ case cmsSigCmykData:
+ case cmsSigMCH4Data:
+ case cmsSig4colorData: return 4;
+
+ case cmsSigMCH5Data:
+ case cmsSig5colorData: return 5;
+
+ case cmsSigMCH6Data:
+ case cmsSig6colorData: return 6;
+
+ case cmsSigMCH7Data:
+ case cmsSig7colorData: return 7;
+
+ case cmsSigMCH8Data:
+ case cmsSig8colorData: return 8;
+
+ case cmsSigMCH9Data:
+ case cmsSig9colorData: return 9;
+
+ case cmsSigMCHAData:
+ case cmsSig10colorData: return 10;
+
+ case cmsSigMCHBData:
+ case cmsSig11colorData: return 11;
+
+ case cmsSigMCHCData:
+ case cmsSig12colorData: return 12;
+
+ case cmsSigMCHDData:
+ case cmsSig13colorData: return 13;
+
+ case cmsSigMCHEData:
+ case cmsSig14colorData: return 14;
+
+ case cmsSigMCHFData:
+ case cmsSig15colorData: return 15;
+
+ default: return 3;
+ }
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c
new file mode 100644
index 0000000000..55928b7018
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsplugin.c
@@ -0,0 +1,955 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// ----------------------------------------------------------------------------------
+// Encoding & Decoding support functions
+// ----------------------------------------------------------------------------------
+
+// Little-Endian to Big-Endian
+
+// Adjust a word value after being readed/ before being written from/to an ICC profile
+cmsUInt16Number CMSEXPORT _cmsAdjustEndianess16(cmsUInt16Number Word)
+{
+#ifndef CMS_USE_BIG_ENDIAN
+
+ cmsUInt8Number* pByte = (cmsUInt8Number*) &Word;
+ cmsUInt8Number tmp;
+
+ tmp = pByte[0];
+ pByte[0] = pByte[1];
+ pByte[1] = tmp;
+#endif
+
+ return Word;
+}
+
+
+// Transports to properly encoded values - note that icc profiles does use big endian notation.
+
+// 1 2 3 4
+// 4 3 2 1
+
+cmsUInt32Number CMSEXPORT _cmsAdjustEndianess32(cmsUInt32Number DWord)
+{
+#ifndef CMS_USE_BIG_ENDIAN
+
+ cmsUInt8Number* pByte = (cmsUInt8Number*) &DWord;
+ cmsUInt8Number temp1;
+ cmsUInt8Number temp2;
+
+ temp1 = *pByte++;
+ temp2 = *pByte++;
+ *(pByte-1) = *pByte;
+ *pByte++ = temp2;
+ *(pByte-3) = *pByte;
+ *pByte = temp1;
+#endif
+ return DWord;
+}
+
+// 1 2 3 4 5 6 7 8
+// 8 7 6 5 4 3 2 1
+
+void CMSEXPORT _cmsAdjustEndianess64(cmsUInt64Number* Result, cmsUInt64Number* QWord)
+{
+
+#ifndef CMS_USE_BIG_ENDIAN
+
+ cmsUInt8Number* pIn = (cmsUInt8Number*) QWord;
+ cmsUInt8Number* pOut = (cmsUInt8Number*) Result;
+
+ _cmsAssert(Result != NULL);
+
+ pOut[7] = pIn[0];
+ pOut[6] = pIn[1];
+ pOut[5] = pIn[2];
+ pOut[4] = pIn[3];
+ pOut[3] = pIn[4];
+ pOut[2] = pIn[5];
+ pOut[1] = pIn[6];
+ pOut[0] = pIn[7];
+
+#else
+ _cmsAssert(Result != NULL);
+
+# ifdef CMS_DONT_USE_INT64
+ (*Result)[0] = QWord[0];
+ (*Result)[1] = QWord[1];
+# else
+ *Result = *QWord;
+# endif
+#endif
+}
+
+// Auxiliar -- read 8, 16 and 32-bit numbers
+cmsBool CMSEXPORT _cmsReadUInt8Number(cmsIOHANDLER* io, cmsUInt8Number* n)
+{
+ cmsUInt8Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsUInt8Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) *n = tmp;
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsReadUInt16Number(cmsIOHANDLER* io, cmsUInt16Number* n)
+{
+ cmsUInt16Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsUInt16Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) *n = _cmsAdjustEndianess16(tmp);
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsReadUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, cmsUInt16Number* Array)
+{
+ cmsUInt32Number i;
+
+ _cmsAssert(io != NULL);
+
+ for (i=0; i < n; i++) {
+
+ if (Array != NULL) {
+ if (!_cmsReadUInt16Number(io, Array + i)) return FALSE;
+ }
+ else {
+ if (!_cmsReadUInt16Number(io, NULL)) return FALSE;
+ }
+
+ }
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsReadUInt32Number(cmsIOHANDLER* io, cmsUInt32Number* n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) *n = _cmsAdjustEndianess32(tmp);
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsReadFloat32Number(cmsIOHANDLER* io, cmsFloat32Number* n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsFloat32Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) {
+
+ tmp = _cmsAdjustEndianess32(tmp);
+ *n = *(cmsFloat32Number*) &tmp;
+ }
+ return TRUE;
+}
+
+
+cmsBool CMSEXPORT _cmsReadUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
+{
+ cmsUInt64Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsUInt64Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) _cmsAdjustEndianess64(n, &tmp);
+ return TRUE;
+}
+
+
+cmsBool CMSEXPORT _cmsRead15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number* n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &tmp, sizeof(cmsUInt32Number), 1) != 1)
+ return FALSE;
+
+ if (n != NULL) {
+ *n = _cms15Fixed16toDouble(_cmsAdjustEndianess32(tmp));
+ }
+
+ return TRUE;
+}
+
+
+// Jun-21-2000: Some profiles (those that comes with W2K) comes
+// with the media white (media black?) x 100. Add a sanity check
+
+static
+void NormalizeXYZ(cmsCIEXYZ* Dest)
+{
+ while (Dest -> X > 2. &&
+ Dest -> Y > 2. &&
+ Dest -> Z > 2.) {
+
+ Dest -> X /= 10.;
+ Dest -> Y /= 10.;
+ Dest -> Z /= 10.;
+ }
+}
+
+cmsBool CMSEXPORT _cmsReadXYZNumber(cmsIOHANDLER* io, cmsCIEXYZ* XYZ)
+{
+ cmsEncodedXYZNumber xyz;
+
+ _cmsAssert(io != NULL);
+
+ if (io ->Read(io, &xyz, sizeof(cmsEncodedXYZNumber), 1) != 1) return FALSE;
+
+ if (XYZ != NULL) {
+
+ XYZ->X = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.X));
+ XYZ->Y = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Y));
+ XYZ->Z = _cms15Fixed16toDouble(_cmsAdjustEndianess32(xyz.Z));
+
+ NormalizeXYZ(XYZ);
+ }
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteUInt8Number(cmsIOHANDLER* io, cmsUInt8Number n)
+{
+ _cmsAssert(io != NULL);
+
+ if (io -> Write(io, sizeof(cmsUInt8Number), &n) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteUInt16Number(cmsIOHANDLER* io, cmsUInt16Number n)
+{
+ cmsUInt16Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ tmp = _cmsAdjustEndianess16(n);
+ if (io -> Write(io, sizeof(cmsUInt16Number), &tmp) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteUInt16Array(cmsIOHANDLER* io, cmsUInt32Number n, const cmsUInt16Number* Array)
+{
+ cmsUInt32Number i;
+
+ _cmsAssert(io != NULL);
+ _cmsAssert(Array != NULL);
+
+ for (i=0; i < n; i++) {
+ if (!_cmsWriteUInt16Number(io, Array[i])) return FALSE;
+ }
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteUInt32Number(cmsIOHANDLER* io, cmsUInt32Number n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ tmp = _cmsAdjustEndianess32(n);
+ if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+
+cmsBool CMSEXPORT _cmsWriteFloat32Number(cmsIOHANDLER* io, cmsFloat32Number n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ tmp = *(cmsUInt32Number*) &n;
+ tmp = _cmsAdjustEndianess32(tmp);
+ if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteUInt64Number(cmsIOHANDLER* io, cmsUInt64Number* n)
+{
+ cmsUInt64Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ _cmsAdjustEndianess64(&tmp, n);
+ if (io -> Write(io, sizeof(cmsUInt64Number), &tmp) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWrite15Fixed16Number(cmsIOHANDLER* io, cmsFloat64Number n)
+{
+ cmsUInt32Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ tmp = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(n));
+ if (io -> Write(io, sizeof(cmsUInt32Number), &tmp) != 1)
+ return FALSE;
+
+ return TRUE;
+}
+
+cmsBool CMSEXPORT _cmsWriteXYZNumber(cmsIOHANDLER* io, const cmsCIEXYZ* XYZ)
+{
+ cmsEncodedXYZNumber xyz;
+
+ _cmsAssert(io != NULL);
+ _cmsAssert(XYZ != NULL);
+
+ xyz.X = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->X));
+ xyz.Y = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Y));
+ xyz.Z = _cmsAdjustEndianess32(_cmsDoubleTo15Fixed16(XYZ->Z));
+
+ return io -> Write(io, sizeof(cmsEncodedXYZNumber), &xyz);
+}
+
+// from Fixed point 8.8 to double
+cmsFloat64Number CMSEXPORT _cms8Fixed8toDouble(cmsUInt16Number fixed8)
+{
+ cmsUInt8Number msb, lsb;
+
+ lsb = (cmsUInt8Number) (fixed8 & 0xff);
+ msb = (cmsUInt8Number) (((cmsUInt16Number) fixed8 >> 8) & 0xff);
+
+ return (cmsFloat64Number) ((cmsFloat64Number) msb + ((cmsFloat64Number) lsb / 256.0));
+}
+
+cmsUInt16Number CMSEXPORT _cmsDoubleTo8Fixed8(cmsFloat64Number val)
+{
+ cmsS15Fixed16Number GammaFixed32 = _cmsDoubleTo15Fixed16(val);
+ return (cmsUInt16Number) ((GammaFixed32 >> 8) & 0xFFFF);
+}
+
+// from Fixed point 15.16 to double
+cmsFloat64Number CMSEXPORT _cms15Fixed16toDouble(cmsS15Fixed16Number fix32)
+{
+ cmsFloat64Number floater, sign, mid;
+ int Whole, FracPart;
+
+ sign = (fix32 < 0 ? -1 : 1);
+ fix32 = abs(fix32);
+
+ Whole = (cmsUInt16Number)(fix32 >> 16) & 0xffff;
+ FracPart = (cmsUInt16Number)(fix32 & 0xffff);
+
+ mid = (cmsFloat64Number) FracPart / 65536.0;
+ floater = (cmsFloat64Number) Whole + mid;
+
+ return sign * floater;
+}
+
+// from double to Fixed point 15.16
+cmsS15Fixed16Number CMSEXPORT _cmsDoubleTo15Fixed16(cmsFloat64Number v)
+{
+ return ((cmsS15Fixed16Number) floor((v)*65536.0 + 0.5));
+}
+
+// Date/Time functions
+
+void CMSEXPORT _cmsDecodeDateTimeNumber(const cmsDateTimeNumber *Source, struct tm *Dest)
+{
+
+ _cmsAssert(Dest != NULL);
+ _cmsAssert(Source != NULL);
+
+ Dest->tm_sec = _cmsAdjustEndianess16(Source->seconds);
+ Dest->tm_min = _cmsAdjustEndianess16(Source->minutes);
+ Dest->tm_hour = _cmsAdjustEndianess16(Source->hours);
+ Dest->tm_mday = _cmsAdjustEndianess16(Source->day);
+ Dest->tm_mon = _cmsAdjustEndianess16(Source->month) - 1;
+ Dest->tm_year = _cmsAdjustEndianess16(Source->year) - 1900;
+ Dest->tm_wday = -1;
+ Dest->tm_yday = -1;
+ Dest->tm_isdst = 0;
+}
+
+void CMSEXPORT _cmsEncodeDateTimeNumber(cmsDateTimeNumber *Dest, const struct tm *Source)
+{
+ _cmsAssert(Dest != NULL);
+ _cmsAssert(Source != NULL);
+
+ Dest->seconds = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_sec);
+ Dest->minutes = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_min);
+ Dest->hours = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_hour);
+ Dest->day = _cmsAdjustEndianess16((cmsUInt16Number) Source->tm_mday);
+ Dest->month = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_mon + 1));
+ Dest->year = _cmsAdjustEndianess16((cmsUInt16Number) (Source->tm_year + 1900));
+}
+
+// Read base and return type base
+cmsTagTypeSignature CMSEXPORT _cmsReadTypeBase(cmsIOHANDLER* io)
+{
+ _cmsTagBase Base;
+
+ _cmsAssert(io != NULL);
+
+ if (io -> Read(io, &Base, sizeof(_cmsTagBase), 1) != 1)
+ return (cmsTagTypeSignature) 0;
+
+ return (cmsTagTypeSignature) _cmsAdjustEndianess32(Base.sig);
+}
+
+// Setup base marker
+cmsBool CMSEXPORT _cmsWriteTypeBase(cmsIOHANDLER* io, cmsTagTypeSignature sig)
+{
+ _cmsTagBase Base;
+
+ _cmsAssert(io != NULL);
+
+ Base.sig = (cmsTagTypeSignature) _cmsAdjustEndianess32(sig);
+ memset(&Base.reserved, 0, sizeof(Base.reserved));
+ return io -> Write(io, sizeof(_cmsTagBase), &Base);
+}
+
+cmsBool CMSEXPORT _cmsReadAlignment(cmsIOHANDLER* io)
+{
+ cmsUInt8Number Buffer[4];
+ cmsUInt32Number NextAligned, At;
+ cmsUInt32Number BytesToNextAlignedPos;
+
+ _cmsAssert(io != NULL);
+
+ At = io -> Tell(io);
+ NextAligned = _cmsALIGNLONG(At);
+ BytesToNextAlignedPos = NextAligned - At;
+ if (BytesToNextAlignedPos == 0) return TRUE;
+ if (BytesToNextAlignedPos > 4) return FALSE;
+
+ return (io ->Read(io, Buffer, BytesToNextAlignedPos, 1) == 1);
+}
+
+cmsBool CMSEXPORT _cmsWriteAlignment(cmsIOHANDLER* io)
+{
+ cmsUInt8Number Buffer[4];
+ cmsUInt32Number NextAligned, At;
+ cmsUInt32Number BytesToNextAlignedPos;
+
+ _cmsAssert(io != NULL);
+
+ At = io -> Tell(io);
+ NextAligned = _cmsALIGNLONG(At);
+ BytesToNextAlignedPos = NextAligned - At;
+ if (BytesToNextAlignedPos == 0) return TRUE;
+ if (BytesToNextAlignedPos > 4) return FALSE;
+
+ memset(Buffer, 0, BytesToNextAlignedPos);
+ return io -> Write(io, BytesToNextAlignedPos, Buffer);
+}
+
+
+// To deal with text streams. 2K at most
+cmsBool CMSEXPORT _cmsIOPrintf(cmsIOHANDLER* io, const char* frm, ...)
+{
+ va_list args;
+ int len;
+ cmsUInt8Number Buffer[2048];
+ cmsBool rc;
+
+ _cmsAssert(io != NULL);
+ _cmsAssert(frm != NULL);
+
+ va_start(args, frm);
+
+ len = vsnprintf((char*) Buffer, 2047, frm, args);
+ if (len < 0) return FALSE; // Truncated, which is a fatal error for us
+
+ rc = io ->Write(io, len, Buffer);
+
+ va_end(args);
+
+ return rc;
+}
+
+
+// Plugin memory management -------------------------------------------------------------------------------------------------
+
+// Specialized malloc for plug-ins, that is freed upon exit.
+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size)
+{
+ struct _cmsContext_struct* ctx = _cmsGetContext(ContextID);
+
+ if (ctx ->MemPool == NULL) {
+
+ if (ContextID == NULL) {
+
+ ctx->MemPool = _cmsCreateSubAlloc(0, 2*1024);
+ }
+ else {
+ cmsSignalError(ContextID, cmsERROR_CORRUPTION_DETECTED, "NULL memory pool on context");
+ return NULL;
+ }
+ }
+
+ return _cmsSubAlloc(ctx->MemPool, size);
+}
+
+
+// Main plug-in dispatcher
+cmsBool CMSEXPORT cmsPlugin(void* Plug_in)
+{
+ return cmsPluginTHR(NULL, Plug_in);
+}
+
+cmsBool CMSEXPORT cmsPluginTHR(cmsContext id, void* Plug_in)
+{
+ cmsPluginBase* Plugin;
+
+ for (Plugin = (cmsPluginBase*) Plug_in;
+ Plugin != NULL;
+ Plugin = Plugin -> Next) {
+
+ if (Plugin -> Magic != cmsPluginMagicNumber) {
+ cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin");
+ return FALSE;
+ }
+
+ if (Plugin ->ExpectedVersion > LCMS_VERSION) {
+ cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "plugin needs Little CMS %d, current version is %d",
+ Plugin ->ExpectedVersion, LCMS_VERSION);
+ return FALSE;
+ }
+
+ switch (Plugin -> Type) {
+
+ case cmsPluginMemHandlerSig:
+ if (!_cmsRegisterMemHandlerPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginInterpolationSig:
+ if (!_cmsRegisterInterpPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginTagTypeSig:
+ if (!_cmsRegisterTagTypePlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginTagSig:
+ if (!_cmsRegisterTagPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginFormattersSig:
+ if (!_cmsRegisterFormattersPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginRenderingIntentSig:
+ if (!_cmsRegisterRenderingIntentPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginParametricCurveSig:
+ if (!_cmsRegisterParametricCurvesPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginMultiProcessElementSig:
+ if (!_cmsRegisterMultiProcessElementPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginOptimizationSig:
+ if (!_cmsRegisterOptimizationPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginTransformSig:
+ if (!_cmsRegisterTransformPlugin(id, Plugin)) return FALSE;
+ break;
+
+ case cmsPluginMutexSig:
+ if (!_cmsRegisterMutexPlugin(id, Plugin)) return FALSE;
+ break;
+
+ default:
+ cmsSignalError(id, cmsERROR_UNKNOWN_EXTENSION, "Unrecognized plugin type '%X'", Plugin -> Type);
+ return FALSE;
+ }
+ }
+
+ // Keep a reference to the plug-in
+ return TRUE;
+}
+
+
+// Revert all plug-ins to default
+void CMSEXPORT cmsUnregisterPlugins(void)
+{
+ cmsUnregisterPluginsTHR(NULL);
+}
+
+
+// The Global storage for system context. This is the one and only global variable
+// pointers structure. All global vars are referenced here.
+static struct _cmsContext_struct globalContext = {
+
+ NULL, // Not in the linked list
+ NULL, // No suballocator
+ {
+ NULL, // UserPtr,
+ &_cmsLogErrorChunk, // Logger,
+ &_cmsAlarmCodesChunk, // AlarmCodes,
+ &_cmsAdaptationStateChunk, // AdaptationState,
+ &_cmsMemPluginChunk, // MemPlugin,
+ &_cmsInterpPluginChunk, // InterpPlugin,
+ &_cmsCurvesPluginChunk, // CurvesPlugin,
+ &_cmsFormattersPluginChunk, // FormattersPlugin,
+ &_cmsTagTypePluginChunk, // TagTypePlugin,
+ &_cmsTagPluginChunk, // TagPlugin,
+ &_cmsIntentsPluginChunk, // IntentPlugin,
+ &_cmsMPETypePluginChunk, // MPEPlugin,
+ &_cmsOptimizationPluginChunk, // OptimizationPlugin,
+ &_cmsTransformPluginChunk, // TransformPlugin,
+ &_cmsMutexPluginChunk // MutexPlugin
+ },
+
+ { NULL, NULL, NULL, NULL, NULL, NULL } // The default memory allocator is not used for context 0
+};
+
+
+// The context pool (linked list head)
+static _cmsMutex _cmsContextPoolHeadMutex = CMS_MUTEX_INITIALIZER;
+static struct _cmsContext_struct* _cmsContextPoolHead = NULL;
+
+// Internal, get associated pointer, with guessing. Never returns NULL.
+struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID)
+{
+ struct _cmsContext_struct* id = (struct _cmsContext_struct*) ContextID;
+ struct _cmsContext_struct* ctx;
+
+
+ // On 0, use global settings
+ if (id == NULL)
+ return &globalContext;
+
+ // Search
+ for (ctx = _cmsContextPoolHead;
+ ctx != NULL;
+ ctx = ctx ->Next) {
+
+ // Found it?
+ if (id == ctx)
+ return ctx; // New-style context,
+ }
+
+ return &globalContext;
+}
+
+
+// Internal: get the memory area associanted with each context client
+// Returns the block assigned to the specific zone.
+void* _cmsContextGetClientChunk(cmsContext ContextID, _cmsMemoryClient mc)
+{
+ struct _cmsContext_struct* ctx;
+ void *ptr;
+
+ if (mc < 0 || mc >= MemoryClientMax) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Bad context client");
+ return NULL;
+ }
+
+ ctx = _cmsGetContext(ContextID);
+ ptr = ctx ->chunks[mc];
+
+ if (ptr != NULL)
+ return ptr;
+
+ // A null ptr means no special settings for that context, and this
+ // reverts to Context0 globals
+ return globalContext.chunks[mc];
+}
+
+
+// This function returns the given context its default pristine state,
+// as no plug-ins were declared. There is no way to unregister a single
+// plug-in, as a single call to cmsPluginTHR() function may register
+// many different plug-ins simultaneously, then there is no way to
+// identify which plug-in to unregister.
+void CMSEXPORT cmsUnregisterPluginsTHR(cmsContext ContextID)
+{
+ _cmsRegisterMemHandlerPlugin(ContextID, NULL);
+ _cmsRegisterInterpPlugin(ContextID, NULL);
+ _cmsRegisterTagTypePlugin(ContextID, NULL);
+ _cmsRegisterTagPlugin(ContextID, NULL);
+ _cmsRegisterFormattersPlugin(ContextID, NULL);
+ _cmsRegisterRenderingIntentPlugin(ContextID, NULL);
+ _cmsRegisterParametricCurvesPlugin(ContextID, NULL);
+ _cmsRegisterMultiProcessElementPlugin(ContextID, NULL);
+ _cmsRegisterOptimizationPlugin(ContextID, NULL);
+ _cmsRegisterTransformPlugin(ContextID, NULL);
+ _cmsRegisterMutexPlugin(ContextID, NULL);
+}
+
+
+// Returns the memory manager plug-in, if any, from the Plug-in bundle
+static
+cmsPluginMemHandler* _cmsFindMemoryPlugin(void* PluginBundle)
+{
+ cmsPluginBase* Plugin;
+
+ for (Plugin = (cmsPluginBase*) PluginBundle;
+ Plugin != NULL;
+ Plugin = Plugin -> Next) {
+
+ if (Plugin -> Magic == cmsPluginMagicNumber &&
+ Plugin -> ExpectedVersion <= LCMS_VERSION &&
+ Plugin -> Type == cmsPluginMemHandlerSig) {
+
+ // Found!
+ return (cmsPluginMemHandler*) Plugin;
+ }
+ }
+
+ // Nope, revert to defaults
+ return NULL;
+}
+
+
+// Creates a new context with optional associated plug-ins. Caller may also specify an optional pointer to user-defined
+// data that will be forwarded to plug-ins and logger.
+cmsContext CMSEXPORT cmsCreateContext(void* Plugin, void* UserData)
+{
+ struct _cmsContext_struct* ctx;
+ struct _cmsContext_struct fakeContext;
+
+ _cmsInstallAllocFunctions(_cmsFindMemoryPlugin(Plugin), &fakeContext.DefaultMemoryManager);
+
+ fakeContext.chunks[UserPtr] = UserData;
+ fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager;
+
+ // Create the context structure.
+ ctx = (struct _cmsContext_struct*) _cmsMalloc(&fakeContext, sizeof(struct _cmsContext_struct));
+ if (ctx == NULL)
+ return NULL; // Something very wrong happened!
+
+ // Init the structure and the memory manager
+ memset(ctx, 0, sizeof(struct _cmsContext_struct));
+
+ // Keep memory manager
+ memcpy(&ctx->DefaultMemoryManager, &fakeContext.DefaultMemoryManager, sizeof(_cmsMemPluginChunk));
+
+ // Maintain the linked list (with proper locking)
+ _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+ ctx ->Next = _cmsContextPoolHead;
+ _cmsContextPoolHead = ctx;
+ _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+ ctx ->chunks[UserPtr] = UserData;
+ ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager;
+
+ // Now we can allocate the pool by using default memory manager
+ ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*)); // default size about 32 pointers
+ if (ctx ->MemPool == NULL) {
+
+ cmsDeleteContext(ctx);
+ return NULL;
+ }
+
+ _cmsAllocLogErrorChunk(ctx, NULL);
+ _cmsAllocAlarmCodesChunk(ctx, NULL);
+ _cmsAllocAdaptationStateChunk(ctx, NULL);
+ _cmsAllocMemPluginChunk(ctx, NULL);
+ _cmsAllocInterpPluginChunk(ctx, NULL);
+ _cmsAllocCurvesPluginChunk(ctx, NULL);
+ _cmsAllocFormattersPluginChunk(ctx, NULL);
+ _cmsAllocTagTypePluginChunk(ctx, NULL);
+ _cmsAllocMPETypePluginChunk(ctx, NULL);
+ _cmsAllocTagPluginChunk(ctx, NULL);
+ _cmsAllocIntentsPluginChunk(ctx, NULL);
+ _cmsAllocOptimizationPluginChunk(ctx, NULL);
+ _cmsAllocTransformPluginChunk(ctx, NULL);
+ _cmsAllocMutexPluginChunk(ctx, NULL);
+
+ // Setup the plug-ins
+ if (!cmsPluginTHR(ctx, Plugin)) {
+
+ cmsDeleteContext(ctx);
+ return NULL;
+ }
+
+ return (cmsContext) ctx;
+}
+
+// Duplicates a context with all associated plug-ins.
+// Caller may specify an optional pointer to user-defined
+// data that will be forwarded to plug-ins and logger.
+cmsContext CMSEXPORT cmsDupContext(cmsContext ContextID, void* NewUserData)
+{
+ int i;
+ struct _cmsContext_struct* ctx;
+ const struct _cmsContext_struct* src = _cmsGetContext(ContextID);
+
+ void* userData = (NewUserData != NULL) ? NewUserData : src -> chunks[UserPtr];
+
+
+ ctx = (struct _cmsContext_struct*) _cmsMalloc(ContextID, sizeof(struct _cmsContext_struct));
+ if (ctx == NULL)
+ return NULL; // Something very wrong happened
+
+ // Setup default memory allocators
+ memcpy(&ctx->DefaultMemoryManager, &src->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));
+
+ // Maintain the linked list
+ _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+ ctx ->Next = _cmsContextPoolHead;
+ _cmsContextPoolHead = ctx;
+ _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+ ctx ->chunks[UserPtr] = userData;
+ ctx ->chunks[MemPlugin] = &ctx->DefaultMemoryManager;
+
+ ctx ->MemPool = _cmsCreateSubAlloc(ctx, 22 * sizeof(void*));
+ if (ctx ->MemPool == NULL) {
+
+ cmsDeleteContext(ctx);
+ return NULL;
+ }
+
+ // Allocate all required chunks.
+ _cmsAllocLogErrorChunk(ctx, src);
+ _cmsAllocAlarmCodesChunk(ctx, src);
+ _cmsAllocAdaptationStateChunk(ctx, src);
+ _cmsAllocMemPluginChunk(ctx, src);
+ _cmsAllocInterpPluginChunk(ctx, src);
+ _cmsAllocCurvesPluginChunk(ctx, src);
+ _cmsAllocFormattersPluginChunk(ctx, src);
+ _cmsAllocTagTypePluginChunk(ctx, src);
+ _cmsAllocMPETypePluginChunk(ctx, src);
+ _cmsAllocTagPluginChunk(ctx, src);
+ _cmsAllocIntentsPluginChunk(ctx, src);
+ _cmsAllocOptimizationPluginChunk(ctx, src);
+ _cmsAllocTransformPluginChunk(ctx, src);
+ _cmsAllocMutexPluginChunk(ctx, src);
+
+ // Make sure no one failed
+ for (i=Logger; i < MemoryClientMax; i++) {
+
+ if (src ->chunks[i] == NULL) {
+ cmsDeleteContext((cmsContext) ctx);
+ return NULL;
+ }
+ }
+
+ return (cmsContext) ctx;
+}
+
+
+
+static
+struct _cmsContext_struct* FindPrev(struct _cmsContext_struct* id)
+{
+ struct _cmsContext_struct* prev;
+
+ // Search for previous
+ for (prev = _cmsContextPoolHead;
+ prev != NULL;
+ prev = prev ->Next)
+ {
+ if (prev ->Next == id)
+ return prev;
+ }
+
+ return NULL; // List is empty or only one element!
+}
+
+// Frees any resources associated with the given context,
+// and destroys the context placeholder.
+// The ContextID can no longer be used in any THR operation.
+void CMSEXPORT cmsDeleteContext(cmsContext ContextID)
+{
+ if (ContextID != NULL) {
+
+ struct _cmsContext_struct* ctx = (struct _cmsContext_struct*) ContextID;
+ struct _cmsContext_struct fakeContext;
+ struct _cmsContext_struct* prev;
+
+ memcpy(&fakeContext.DefaultMemoryManager, &ctx->DefaultMemoryManager, sizeof(ctx->DefaultMemoryManager));
+
+ fakeContext.chunks[UserPtr] = ctx ->chunks[UserPtr];
+ fakeContext.chunks[MemPlugin] = &fakeContext.DefaultMemoryManager;
+
+ // Get rid of plugins
+ cmsUnregisterPluginsTHR(ContextID);
+
+ // Since all memory is allocated in the private pool, all what we need to do is destroy the pool
+ if (ctx -> MemPool != NULL)
+ _cmsSubAllocDestroy(ctx ->MemPool);
+ ctx -> MemPool = NULL;
+
+ // Maintain list
+ _cmsEnterCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+ if (_cmsContextPoolHead == ctx) {
+
+ _cmsContextPoolHead = ctx->Next;
+ }
+ else {
+
+ // Search for previous
+ for (prev = _cmsContextPoolHead;
+ prev != NULL;
+ prev = prev ->Next)
+ {
+ if (prev -> Next == ctx) {
+ prev -> Next = ctx ->Next;
+ break;
+ }
+ }
+ }
+ _cmsLeaveCriticalSectionPrimitive(&_cmsContextPoolHeadMutex);
+
+ // free the memory block itself
+ _cmsFree(&fakeContext, ctx);
+ }
+}
+
+// Returns the user data associated to the given ContextID, or NULL if no user data was attached on context creation
+void* CMSEXPORT cmsGetContextUserData(cmsContext ContextID)
+{
+ return _cmsContextGetClientChunk(ContextID, UserPtr);
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c
new file mode 100644
index 0000000000..224b44b542
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsps2.c
@@ -0,0 +1,1597 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// PostScript ColorRenderingDictionary and ColorSpaceArray
+
+
+#define MAXPSCOLS 60 // Columns on tables
+
+/*
+ Implementation
+ --------------
+
+ PostScript does use XYZ as its internal PCS. But since PostScript
+ interpolation tables are limited to 8 bits, I use Lab as a way to
+ improve the accuracy, favoring perceptual results. So, for the creation
+ of each CRD, CSA the profiles are converted to Lab via a device
+ link between profile -> Lab or Lab -> profile. The PS code necessary to
+ convert Lab <-> XYZ is also included.
+
+
+
+ Color Space Arrays (CSA)
+ ==================================================================================
+
+ In order to obtain precision, code chooses between three ways to implement
+ the device -> XYZ transform. These cases identifies monochrome profiles (often
+ implemented as a set of curves), matrix-shaper and Pipeline-based.
+
+ Monochrome
+ -----------
+
+ This is implemented as /CIEBasedA CSA. The prelinearization curve is
+ placed into /DecodeA section, and matrix equals to D50. Since here is
+ no interpolation tables, I do the conversion directly to XYZ
+
+ NOTE: CLUT-based monochrome profiles are NOT supported. So, cmsFLAGS_MATRIXINPUT
+ flag is forced on such profiles.
+
+ [ /CIEBasedA
+ <<
+ /DecodeA { transfer function } bind
+ /MatrixA [D50]
+ /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ >>
+ ]
+
+ On simpler profiles, the PCS is already XYZ, so no conversion is required.
+
+
+ Matrix-shaper based
+ -------------------
+
+ This is implemented both with /CIEBasedABC or /CIEBasedDEF on dependig
+ of profile implementation. Since here there are no interpolation tables, I do
+ the conversion directly to XYZ
+
+
+
+ [ /CIEBasedABC
+ <<
+ /DecodeABC [ {transfer1} {transfer2} {transfer3} ]
+ /MatrixABC [Matrix]
+ /RangeLMN [ 0.0 cmsD50X 0.0 cmsD50Y 0.0 cmsD50Z ]
+ /DecodeLMN [ { / 2} dup dup ]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ >>
+ ]
+
+
+ CLUT based
+ ----------
+
+ Lab is used in such cases.
+
+ [ /CIEBasedDEF
+ <<
+ /DecodeDEF [ <prelinearization> ]
+ /Table [ p p p [<...>]]
+ /RangeABC [ 0 1 0 1 0 1]
+ /DecodeABC[ <postlinearization> ]
+ /RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]
+ % -128/500 1+127/500 0 1 -127/200 1+128/200
+ /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+ /WhitePoint [D50]
+ /BlackPoint [BP]
+ /RenderingIntent (intent)
+ ]
+
+
+ Color Rendering Dictionaries (CRD)
+ ==================================
+ These are always implemented as CLUT, and always are using Lab. Since CRD are expected to
+ be used as resources, the code adds the definition as well.
+
+ <<
+ /ColorRenderingType 1
+ /WhitePoint [ D50 ]
+ /BlackPoint [BP]
+ /MatrixPQR [ Bradford ]
+ /RangePQR [-0.125 1.375 -0.125 1.375 -0.125 1.375 ]
+ /TransformPQR [
+ {4 index 3 get div 2 index 3 get mul exch pop exch pop exch pop exch pop } bind
+ {4 index 4 get div 2 index 4 get mul exch pop exch pop exch pop exch pop } bind
+ {4 index 5 get div 2 index 5 get mul exch pop exch pop exch pop exch pop } bind
+ ]
+ /MatrixABC <...>
+ /EncodeABC <...>
+ /RangeABC <.. used for XYZ -> Lab>
+ /EncodeLMN
+ /RenderTable [ p p p [<...>]]
+
+ /RenderingIntent (Perceptual)
+ >>
+ /Current exch /ColorRendering defineresource pop
+
+
+ The following stages are used to convert from XYZ to Lab
+ --------------------------------------------------------
+
+ Input is given at LMN stage on X, Y, Z
+
+ Encode LMN gives us f(X/Xn), f(Y/Yn), f(Z/Zn)
+
+ /EncodeLMN [
+
+ { 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+ { 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+ { 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind
+
+ ]
+
+
+ MatrixABC is used to compute f(Y/Yn), f(X/Xn) - f(Y/Yn), f(Y/Yn) - f(Z/Zn)
+
+ | 0 1 0|
+ | 1 -1 0|
+ | 0 1 -1|
+
+ /MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]
+
+ EncodeABC finally gives Lab values.
+
+ /EncodeABC [
+ { 116 mul 16 sub 100 div } bind
+ { 500 mul 128 add 255 div } bind
+ { 200 mul 128 add 255 div } bind
+ ]
+
+ The following stages are used to convert Lab to XYZ
+ ----------------------------------------------------
+
+ /RangeABC [ 0 1 0 1 0 1]
+ /DecodeABC [ { 100 mul 16 add 116 div } bind
+ { 255 mul 128 sub 500 div } bind
+ { 255 mul 128 sub 200 div } bind
+ ]
+
+ /MatrixABC [ 1 1 1 1 0 0 0 0 -1]
+ /DecodeLMN [
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind
+ {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind
+ ]
+
+
+*/
+
+/*
+
+ PostScript algorithms discussion.
+ =========================================================================================================
+
+ 1D interpolation algorithm
+
+
+ 1D interpolation (float)
+ ------------------------
+
+ val2 = Domain * Value;
+
+ cell0 = (int) floor(val2);
+ cell1 = (int) ceil(val2);
+
+ rest = val2 - cell0;
+
+ y0 = LutTable[cell0] ;
+ y1 = LutTable[cell1] ;
+
+ y = y0 + (y1 - y0) * rest;
+
+
+
+ PostScript code Stack
+ ================================================
+
+ { % v
+ <check 0..1.0>
+ [array] % v tab
+ dup % v tab tab
+ length 1 sub % v tab dom
+
+ 3 -1 roll % tab dom v
+
+ mul % tab val2
+ dup % tab val2 val2
+ dup % tab val2 val2 val2
+ floor cvi % tab val2 val2 cell0
+ exch % tab val2 cell0 val2
+ ceiling cvi % tab val2 cell0 cell1
+
+ 3 index % tab val2 cell0 cell1 tab
+ exch % tab val2 cell0 tab cell1
+ get % tab val2 cell0 y1
+
+ 4 -1 roll % val2 cell0 y1 tab
+ 3 -1 roll % val2 y1 tab cell0
+ get % val2 y1 y0
+
+ dup % val2 y1 y0 y0
+ 3 1 roll % val2 y0 y1 y0
+
+ sub % val2 y0 (y1-y0)
+ 3 -1 roll % y0 (y1-y0) val2
+ dup % y0 (y1-y0) val2 val2
+ floor cvi % y0 (y1-y0) val2 floor(val2)
+ sub % y0 (y1-y0) rest
+ mul % y0 t1
+ add % y
+ 65535 div % result
+
+ } bind
+
+
+*/
+
+
+// This struct holds the memory block currently being write
+typedef struct {
+ _cmsStageCLutData* Pipeline;
+ cmsIOHANDLER* m;
+
+ int FirstComponent;
+ int SecondComponent;
+
+ const char* PreMaj;
+ const char* PostMaj;
+ const char* PreMin;
+ const char* PostMin;
+
+ int FixWhite; // Force mapping of pure white
+
+ cmsColorSpaceSignature ColorSpace; // ColorSpace of profile
+
+
+} cmsPsSamplerCargo;
+
+static int _cmsPSActualColumn = 0;
+
+
+// Convert to byte
+static
+cmsUInt8Number Word2Byte(cmsUInt16Number w)
+{
+ return (cmsUInt8Number) floor((cmsFloat64Number) w / 257.0 + 0.5);
+}
+
+
+// Convert to byte (using ICC2 notation)
+/*
+static
+cmsUInt8Number L2Byte(cmsUInt16Number w)
+{
+ int ww = w + 0x0080;
+
+ if (ww > 0xFFFF) return 0xFF;
+
+ return (cmsUInt8Number) ((cmsUInt16Number) (ww >> 8) & 0xFF);
+}
+*/
+
+// Write a cooked byte
+
+static
+void WriteByte(cmsIOHANDLER* m, cmsUInt8Number b)
+{
+ _cmsIOPrintf(m, "%02x", b);
+ _cmsPSActualColumn += 2;
+
+ if (_cmsPSActualColumn > MAXPSCOLS) {
+
+ _cmsIOPrintf(m, "\n");
+ _cmsPSActualColumn = 0;
+ }
+}
+
+// ----------------------------------------------------------------- PostScript generation
+
+
+// Removes offending Carriage returns
+static
+char* RemoveCR(const char* txt)
+{
+ static char Buffer[2048];
+ char* pt;
+
+ strncpy(Buffer, txt, 2047);
+ Buffer[2047] = 0;
+ for (pt = Buffer; *pt; pt++)
+ if (*pt == '\n' || *pt == '\r') *pt = ' ';
+
+ return Buffer;
+
+}
+
+static
+void EmitHeader(cmsIOHANDLER* m, const char* Title, cmsHPROFILE hProfile)
+{
+ time_t timer;
+ cmsMLU *Description, *Copyright;
+ char DescASCII[256], CopyrightASCII[256];
+
+ time(&timer);
+
+ Description = (cmsMLU*) cmsReadTag(hProfile, cmsSigProfileDescriptionTag);
+ Copyright = (cmsMLU*) cmsReadTag(hProfile, cmsSigCopyrightTag);
+
+ DescASCII[0] = DescASCII[255] = 0;
+ CopyrightASCII[0] = CopyrightASCII[255] = 0;
+
+ if (Description != NULL) cmsMLUgetASCII(Description, cmsNoLanguage, cmsNoCountry, DescASCII, 255);
+ if (Copyright != NULL) cmsMLUgetASCII(Copyright, cmsNoLanguage, cmsNoCountry, CopyrightASCII, 255);
+
+ _cmsIOPrintf(m, "%%!PS-Adobe-3.0\n");
+ _cmsIOPrintf(m, "%%\n");
+ _cmsIOPrintf(m, "%% %s\n", Title);
+ _cmsIOPrintf(m, "%% Source: %s\n", RemoveCR(DescASCII));
+ _cmsIOPrintf(m, "%% %s\n", RemoveCR(CopyrightASCII));
+ _cmsIOPrintf(m, "%% Created: %s", ctime(&timer)); // ctime appends a \n!!!
+ _cmsIOPrintf(m, "%%\n");
+ _cmsIOPrintf(m, "%%%%BeginResource\n");
+
+}
+
+
+// Emits White & Black point. White point is always D50, Black point is the device
+// Black point adapted to D50.
+
+static
+void EmitWhiteBlackD50(cmsIOHANDLER* m, cmsCIEXYZ* BlackPoint)
+{
+
+ _cmsIOPrintf(m, "/BlackPoint [%f %f %f]\n", BlackPoint -> X,
+ BlackPoint -> Y,
+ BlackPoint -> Z);
+
+ _cmsIOPrintf(m, "/WhitePoint [%f %f %f]\n", cmsD50_XYZ()->X,
+ cmsD50_XYZ()->Y,
+ cmsD50_XYZ()->Z);
+}
+
+
+static
+void EmitRangeCheck(cmsIOHANDLER* m)
+{
+ _cmsIOPrintf(m, "dup 0.0 lt { pop 0.0 } if "
+ "dup 1.0 gt { pop 1.0 } if ");
+
+}
+
+// Does write the intent
+
+static
+void EmitIntent(cmsIOHANDLER* m, int RenderingIntent)
+{
+ const char *intent;
+
+ switch (RenderingIntent) {
+
+ case INTENT_PERCEPTUAL: intent = "Perceptual"; break;
+ case INTENT_RELATIVE_COLORIMETRIC: intent = "RelativeColorimetric"; break;
+ case INTENT_ABSOLUTE_COLORIMETRIC: intent = "AbsoluteColorimetric"; break;
+ case INTENT_SATURATION: intent = "Saturation"; break;
+
+ default: intent = "Undefined"; break;
+ }
+
+ _cmsIOPrintf(m, "/RenderingIntent (%s)\n", intent );
+}
+
+//
+// Convert L* to Y
+//
+// Y = Yn*[ (L* + 16) / 116] ^ 3 if (L*) >= 6 / 29
+// = Yn*( L* / 116) / 7.787 if (L*) < 6 / 29
+//
+
+/*
+static
+void EmitL2Y(cmsIOHANDLER* m)
+{
+ _cmsIOPrintf(m,
+ "{ "
+ "100 mul 16 add 116 div " // (L * 100 + 16) / 116
+ "dup 6 29 div ge " // >= 6 / 29 ?
+ "{ dup dup mul mul } " // yes, ^3 and done
+ "{ 4 29 div sub 108 841 div mul } " // no, slope limiting
+ "ifelse } bind ");
+}
+*/
+
+
+// Lab -> XYZ, see the discussion above
+
+static
+void EmitLab2XYZ(cmsIOHANDLER* m)
+{
+ _cmsIOPrintf(m, "/RangeABC [ 0 1 0 1 0 1]\n");
+ _cmsIOPrintf(m, "/DecodeABC [\n");
+ _cmsIOPrintf(m, "{100 mul 16 add 116 div } bind\n");
+ _cmsIOPrintf(m, "{255 mul 128 sub 500 div } bind\n");
+ _cmsIOPrintf(m, "{255 mul 128 sub 200 div } bind\n");
+ _cmsIOPrintf(m, "]\n");
+ _cmsIOPrintf(m, "/MatrixABC [ 1 1 1 1 0 0 0 0 -1]\n");
+ _cmsIOPrintf(m, "/RangeLMN [ -0.236 1.254 0 1 -0.635 1.640 ]\n");
+ _cmsIOPrintf(m, "/DecodeLMN [\n");
+ _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.964200 mul} bind\n");
+ _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse } bind\n");
+ _cmsIOPrintf(m, "{dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse 0.824900 mul} bind\n");
+ _cmsIOPrintf(m, "]\n");
+}
+
+
+
+// Outputs a table of words. It does use 16 bits
+
+static
+void Emit1Gamma(cmsIOHANDLER* m, cmsToneCurve* Table)
+{
+ cmsUInt32Number i;
+ cmsFloat64Number gamma;
+
+ if (Table == NULL) return; // Error
+
+ if (Table ->nEntries <= 0) return; // Empty table
+
+ // Suppress whole if identity
+ if (cmsIsToneCurveLinear(Table)) return;
+
+ // Check if is really an exponential. If so, emit "exp"
+ gamma = cmsEstimateGamma(Table, 0.001);
+ if (gamma > 0) {
+ _cmsIOPrintf(m, "{ %g exp } bind ", gamma);
+ return;
+ }
+
+ _cmsIOPrintf(m, "{ ");
+
+ // Bounds check
+ EmitRangeCheck(m);
+
+ // Emit intepolation code
+
+ // PostScript code Stack
+ // =============== ========================
+ // v
+ _cmsIOPrintf(m, " [");
+
+ for (i=0; i < Table->nEntries; i++) {
+ _cmsIOPrintf(m, "%d ", Table->Table16[i]);
+ }
+
+ _cmsIOPrintf(m, "] "); // v tab
+
+ _cmsIOPrintf(m, "dup "); // v tab tab
+ _cmsIOPrintf(m, "length 1 sub "); // v tab dom
+ _cmsIOPrintf(m, "3 -1 roll "); // tab dom v
+ _cmsIOPrintf(m, "mul "); // tab val2
+ _cmsIOPrintf(m, "dup "); // tab val2 val2
+ _cmsIOPrintf(m, "dup "); // tab val2 val2 val2
+ _cmsIOPrintf(m, "floor cvi "); // tab val2 val2 cell0
+ _cmsIOPrintf(m, "exch "); // tab val2 cell0 val2
+ _cmsIOPrintf(m, "ceiling cvi "); // tab val2 cell0 cell1
+ _cmsIOPrintf(m, "3 index "); // tab val2 cell0 cell1 tab
+ _cmsIOPrintf(m, "exch "); // tab val2 cell0 tab cell1
+ _cmsIOPrintf(m, "get "); // tab val2 cell0 y1
+ _cmsIOPrintf(m, "4 -1 roll "); // val2 cell0 y1 tab
+ _cmsIOPrintf(m, "3 -1 roll "); // val2 y1 tab cell0
+ _cmsIOPrintf(m, "get "); // val2 y1 y0
+ _cmsIOPrintf(m, "dup "); // val2 y1 y0 y0
+ _cmsIOPrintf(m, "3 1 roll "); // val2 y0 y1 y0
+ _cmsIOPrintf(m, "sub "); // val2 y0 (y1-y0)
+ _cmsIOPrintf(m, "3 -1 roll "); // y0 (y1-y0) val2
+ _cmsIOPrintf(m, "dup "); // y0 (y1-y0) val2 val2
+ _cmsIOPrintf(m, "floor cvi "); // y0 (y1-y0) val2 floor(val2)
+ _cmsIOPrintf(m, "sub "); // y0 (y1-y0) rest
+ _cmsIOPrintf(m, "mul "); // y0 t1
+ _cmsIOPrintf(m, "add "); // y
+ _cmsIOPrintf(m, "65535 div "); // result
+
+ _cmsIOPrintf(m, " } bind ");
+}
+
+
+// Compare gamma table
+
+static
+cmsBool GammaTableEquals(cmsUInt16Number* g1, cmsUInt16Number* g2, int nEntries)
+{
+ return memcmp(g1, g2, nEntries* sizeof(cmsUInt16Number)) == 0;
+}
+
+
+// Does write a set of gamma curves
+
+static
+void EmitNGamma(cmsIOHANDLER* m, int n, cmsToneCurve* g[])
+{
+ int i;
+
+ for( i=0; i < n; i++ )
+ {
+ if (g[i] == NULL) return; // Error
+
+ if (i > 0 && GammaTableEquals(g[i-1]->Table16, g[i]->Table16, g[i]->nEntries)) {
+
+ _cmsIOPrintf(m, "dup ");
+ }
+ else {
+ Emit1Gamma(m, g[i]);
+ }
+ }
+
+}
+
+
+
+
+
+// Following code dumps a LUT onto memory stream
+
+
+// This is the sampler. Intended to work in SAMPLER_INSPECT mode,
+// that is, the callback will be called for each knot with
+//
+// In[] The grid location coordinates, normalized to 0..ffff
+// Out[] The Pipeline values, normalized to 0..ffff
+//
+// Returning a value other than 0 does terminate the sampling process
+//
+// Each row contains Pipeline values for all but first component. So, I
+// detect row changing by keeping a copy of last value of first
+// component. -1 is used to mark begining of whole block.
+
+static
+int OutputValueSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ cmsPsSamplerCargo* sc = (cmsPsSamplerCargo*) Cargo;
+ cmsUInt32Number i;
+
+
+ if (sc -> FixWhite) {
+
+ if (In[0] == 0xFFFF) { // Only in L* = 100, ab = [-8..8]
+
+ if ((In[1] >= 0x7800 && In[1] <= 0x8800) &&
+ (In[2] >= 0x7800 && In[2] <= 0x8800)) {
+
+ cmsUInt16Number* Black;
+ cmsUInt16Number* White;
+ cmsUInt32Number nOutputs;
+
+ if (!_cmsEndPointsBySpace(sc ->ColorSpace, &White, &Black, &nOutputs))
+ return 0;
+
+ for (i=0; i < nOutputs; i++)
+ Out[i] = White[i];
+ }
+
+
+ }
+ }
+
+
+ // Hadle the parenthesis on rows
+
+ if (In[0] != sc ->FirstComponent) {
+
+ if (sc ->FirstComponent != -1) {
+
+ _cmsIOPrintf(sc ->m, sc ->PostMin);
+ sc ->SecondComponent = -1;
+ _cmsIOPrintf(sc ->m, sc ->PostMaj);
+ }
+
+ // Begin block
+ _cmsPSActualColumn = 0;
+
+ _cmsIOPrintf(sc ->m, sc ->PreMaj);
+ sc ->FirstComponent = In[0];
+ }
+
+
+ if (In[1] != sc ->SecondComponent) {
+
+ if (sc ->SecondComponent != -1) {
+
+ _cmsIOPrintf(sc ->m, sc ->PostMin);
+ }
+
+ _cmsIOPrintf(sc ->m, sc ->PreMin);
+ sc ->SecondComponent = In[1];
+ }
+
+ // Dump table.
+
+ for (i=0; i < sc -> Pipeline ->Params->nOutputs; i++) {
+
+ cmsUInt16Number wWordOut = Out[i];
+ cmsUInt8Number wByteOut; // Value as byte
+
+
+ // We always deal with Lab4
+
+ wByteOut = Word2Byte(wWordOut);
+ WriteByte(sc -> m, wByteOut);
+ }
+
+ return 1;
+}
+
+// Writes a Pipeline on memstream. Could be 8 or 16 bits based
+
+static
+void WriteCLUT(cmsIOHANDLER* m, cmsStage* mpe, const char* PreMaj,
+ const char* PostMaj,
+ const char* PreMin,
+ const char* PostMin,
+ int FixWhite,
+ cmsColorSpaceSignature ColorSpace)
+{
+ cmsUInt32Number i;
+ cmsPsSamplerCargo sc;
+
+ sc.FirstComponent = -1;
+ sc.SecondComponent = -1;
+ sc.Pipeline = (_cmsStageCLutData *) mpe ->Data;
+ sc.m = m;
+ sc.PreMaj = PreMaj;
+ sc.PostMaj= PostMaj;
+
+ sc.PreMin = PreMin;
+ sc.PostMin = PostMin;
+ sc.FixWhite = FixWhite;
+ sc.ColorSpace = ColorSpace;
+
+ _cmsIOPrintf(m, "[");
+
+ for (i=0; i < sc.Pipeline->Params->nInputs; i++)
+ _cmsIOPrintf(m, " %d ", sc.Pipeline->Params->nSamples[i]);
+
+ _cmsIOPrintf(m, " [\n");
+
+ cmsStageSampleCLut16bit(mpe, OutputValueSampler, (void*) &sc, SAMPLER_INSPECT);
+
+ _cmsIOPrintf(m, PostMin);
+ _cmsIOPrintf(m, PostMaj);
+ _cmsIOPrintf(m, "] ");
+
+}
+
+
+// Dumps CIEBasedA Color Space Array
+
+static
+int EmitCIEBasedA(cmsIOHANDLER* m, cmsToneCurve* Curve, cmsCIEXYZ* BlackPoint)
+{
+
+ _cmsIOPrintf(m, "[ /CIEBasedA\n");
+ _cmsIOPrintf(m, " <<\n");
+
+ _cmsIOPrintf(m, "/DecodeA ");
+
+ Emit1Gamma(m, Curve);
+
+ _cmsIOPrintf(m, " \n");
+
+ _cmsIOPrintf(m, "/MatrixA [ 0.9642 1.0000 0.8249 ]\n");
+ _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, INTENT_PERCEPTUAL);
+
+ _cmsIOPrintf(m, ">>\n");
+ _cmsIOPrintf(m, "]\n");
+
+ return 1;
+}
+
+
+// Dumps CIEBasedABC Color Space Array
+
+static
+int EmitCIEBasedABC(cmsIOHANDLER* m, cmsFloat64Number* Matrix, cmsToneCurve** CurveSet, cmsCIEXYZ* BlackPoint)
+{
+ int i;
+
+ _cmsIOPrintf(m, "[ /CIEBasedABC\n");
+ _cmsIOPrintf(m, "<<\n");
+ _cmsIOPrintf(m, "/DecodeABC [ ");
+
+ EmitNGamma(m, 3, CurveSet);
+
+ _cmsIOPrintf(m, "]\n");
+
+ _cmsIOPrintf(m, "/MatrixABC [ " );
+
+ for( i=0; i < 3; i++ ) {
+
+ _cmsIOPrintf(m, "%.6f %.6f %.6f ", Matrix[i + 3*0],
+ Matrix[i + 3*1],
+ Matrix[i + 3*2]);
+ }
+
+
+ _cmsIOPrintf(m, "]\n");
+
+ _cmsIOPrintf(m, "/RangeLMN [ 0.0 0.9642 0.0 1.0000 0.0 0.8249 ]\n");
+
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, INTENT_PERCEPTUAL);
+
+ _cmsIOPrintf(m, ">>\n");
+ _cmsIOPrintf(m, "]\n");
+
+
+ return 1;
+}
+
+
+static
+int EmitCIEBasedDEF(cmsIOHANDLER* m, cmsPipeline* Pipeline, int Intent, cmsCIEXYZ* BlackPoint)
+{
+ const char* PreMaj;
+ const char* PostMaj;
+ const char* PreMin, *PostMin;
+ cmsStage* mpe;
+
+ mpe = Pipeline ->Elements;
+
+ switch (cmsStageInputChannels(mpe)) {
+ case 3:
+
+ _cmsIOPrintf(m, "[ /CIEBasedDEF\n");
+ PreMaj ="<";
+ PostMaj= ">\n";
+ PreMin = PostMin = "";
+ break;
+ case 4:
+ _cmsIOPrintf(m, "[ /CIEBasedDEFG\n");
+ PreMaj = "[";
+ PostMaj = "]\n";
+ PreMin = "<";
+ PostMin = ">\n";
+ break;
+ default:
+ return 0;
+
+ }
+
+ _cmsIOPrintf(m, "<<\n");
+
+ if (cmsStageType(mpe) == cmsSigCurveSetElemType) {
+
+ _cmsIOPrintf(m, "/DecodeDEF [ ");
+ EmitNGamma(m, cmsStageOutputChannels(mpe), _cmsStageGetPtrToCurveSet(mpe));
+ _cmsIOPrintf(m, "]\n");
+
+ mpe = mpe ->Next;
+ }
+
+ if (cmsStageType(mpe) == cmsSigCLutElemType) {
+
+ _cmsIOPrintf(m, "/Table ");
+ WriteCLUT(m, mpe, PreMaj, PostMaj, PreMin, PostMin, FALSE, (cmsColorSpaceSignature) 0);
+ _cmsIOPrintf(m, "]\n");
+ }
+
+ EmitLab2XYZ(m);
+ EmitWhiteBlackD50(m, BlackPoint);
+ EmitIntent(m, Intent);
+
+ _cmsIOPrintf(m, " >>\n");
+ _cmsIOPrintf(m, "]\n");
+
+ return 1;
+}
+
+// Generates a curve from a gray profile
+
+static
+ cmsToneCurve* ExtractGray2Y(cmsContext ContextID, cmsHPROFILE hProfile, int Intent)
+{
+ cmsToneCurve* Out = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);
+ cmsHPROFILE hXYZ = cmsCreateXYZProfile();
+ cmsHTRANSFORM xform = cmsCreateTransformTHR(ContextID, hProfile, TYPE_GRAY_8, hXYZ, TYPE_XYZ_DBL, Intent, cmsFLAGS_NOOPTIMIZE);
+ int i;
+
+ if (Out != NULL) {
+ for (i=0; i < 256; i++) {
+
+ cmsUInt8Number Gray = (cmsUInt8Number) i;
+ cmsCIEXYZ XYZ;
+
+ cmsDoTransform(xform, &Gray, &XYZ, 1);
+
+ Out ->Table16[i] =_cmsQuickSaturateWord(XYZ.Y * 65535.0);
+ }
+ }
+
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hXYZ);
+ return Out;
+}
+
+
+
+// Because PostScript has only 8 bits in /Table, we should use
+// a more perceptually uniform space... I do choose Lab.
+
+static
+int WriteInputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)
+{
+ cmsHPROFILE hLab;
+ cmsHTRANSFORM xform;
+ cmsUInt32Number nChannels;
+ cmsUInt32Number InputFormat;
+ int rc;
+ cmsHPROFILE Profiles[2];
+ cmsCIEXYZ BlackPointAdaptedToD50;
+
+ // Does create a device-link based transform.
+ // The DeviceLink is next dumped as working CSA.
+
+ InputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);
+ nChannels = T_CHANNELS(InputFormat);
+
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);
+
+ // Adjust output to Lab4
+ hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+
+ Profiles[0] = hProfile;
+ Profiles[1] = hLab;
+
+ xform = cmsCreateMultiprofileTransform(Profiles, 2, InputFormat, TYPE_Lab_DBL, Intent, 0);
+ cmsCloseProfile(hLab);
+
+ if (xform == NULL) {
+
+ cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Profile -> Lab");
+ return 0;
+ }
+
+ // Only 1, 3 and 4 channels are allowed
+
+ switch (nChannels) {
+
+ case 1: {
+ cmsToneCurve* Gray2Y = ExtractGray2Y(m ->ContextID, hProfile, Intent);
+ EmitCIEBasedA(m, Gray2Y, &BlackPointAdaptedToD50);
+ cmsFreeToneCurve(Gray2Y);
+ }
+ break;
+
+ case 3:
+ case 4: {
+ cmsUInt32Number OutFrm = TYPE_Lab_16;
+ cmsPipeline* DeviceLink;
+ _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+
+ DeviceLink = cmsPipelineDup(v ->Lut);
+ if (DeviceLink == NULL) return 0;
+
+ dwFlags |= cmsFLAGS_FORCE_CLUT;
+ _cmsOptimizePipeline(m->ContextID, &DeviceLink, Intent, &InputFormat, &OutFrm, &dwFlags);
+
+ rc = EmitCIEBasedDEF(m, DeviceLink, Intent, &BlackPointAdaptedToD50);
+ cmsPipelineFree(DeviceLink);
+ if (rc == 0) return 0;
+ }
+ break;
+
+ default:
+
+ cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Only 3, 4 channels supported for CSA. This profile has %d channels.", nChannels);
+ return 0;
+ }
+
+
+ cmsDeleteTransform(xform);
+
+ return 1;
+}
+
+static
+cmsFloat64Number* GetPtrToMatrix(const cmsStage* mpe)
+{
+ _cmsStageMatrixData* Data = (_cmsStageMatrixData*) mpe ->Data;
+
+ return Data -> Double;
+}
+
+
+// Does create CSA based on matrix-shaper. Allowed types are gray and RGB based
+
+static
+int WriteInputMatrixShaper(cmsIOHANDLER* m, cmsHPROFILE hProfile, cmsStage* Matrix, cmsStage* Shaper)
+{
+ cmsColorSpaceSignature ColorSpace;
+ int rc;
+ cmsCIEXYZ BlackPointAdaptedToD50;
+
+ ColorSpace = cmsGetColorSpace(hProfile);
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, INTENT_RELATIVE_COLORIMETRIC, 0);
+
+ if (ColorSpace == cmsSigGrayData) {
+
+ cmsToneCurve** ShaperCurve = _cmsStageGetPtrToCurveSet(Shaper);
+ rc = EmitCIEBasedA(m, ShaperCurve[0], &BlackPointAdaptedToD50);
+
+ }
+ else
+ if (ColorSpace == cmsSigRgbData) {
+
+ cmsMAT3 Mat;
+ int i, j;
+
+ memmove(&Mat, GetPtrToMatrix(Matrix), sizeof(Mat));
+
+ for (i=0; i < 3; i++)
+ for (j=0; j < 3; j++)
+ Mat.v[i].n[j] *= MAX_ENCODEABLE_XYZ;
+
+ rc = EmitCIEBasedABC(m, (cmsFloat64Number *) &Mat,
+ _cmsStageGetPtrToCurveSet(Shaper),
+ &BlackPointAdaptedToD50);
+ }
+ else {
+
+ cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Profile is not suitable for CSA. Unsupported colorspace.");
+ return 0;
+ }
+
+ return rc;
+}
+
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension, and it works in Lab instead of XYZ
+
+static
+int WriteNamedColorCSA(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent)
+{
+ cmsHTRANSFORM xform;
+ cmsHPROFILE hLab;
+ int i, nColors;
+ char ColorName[32];
+ cmsNAMEDCOLORLIST* NamedColorList;
+
+ hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+ xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, hLab, TYPE_Lab_DBL, Intent, 0);
+ if (xform == NULL) return 0;
+
+ NamedColorList = cmsGetNamedColorList(xform);
+ if (NamedColorList == NULL) return 0;
+
+ _cmsIOPrintf(m, "<<\n");
+ _cmsIOPrintf(m, "(colorlistcomment) (%s)\n", "Named color CSA");
+ _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+ _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+ nColors = cmsNamedColorCount(NamedColorList);
+
+
+ for (i=0; i < nColors; i++) {
+
+ cmsUInt16Number In[1];
+ cmsCIELab Lab;
+
+ In[0] = (cmsUInt16Number) i;
+
+ if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))
+ continue;
+
+ cmsDoTransform(xform, In, &Lab, 1);
+ _cmsIOPrintf(m, " (%s) [ %.3f %.3f %.3f ]\n", ColorName, Lab.L, Lab.a, Lab.b);
+ }
+
+
+
+ _cmsIOPrintf(m, ">>\n");
+
+ cmsDeleteTransform(xform);
+ cmsCloseProfile(hLab);
+ return 1;
+}
+
+
+// Does create a Color Space Array on XYZ colorspace for PostScript usage
+static
+cmsUInt32Number GenerateCSA(cmsContext ContextID,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags,
+ cmsIOHANDLER* mem)
+{
+ cmsUInt32Number dwBytesUsed;
+ cmsPipeline* lut = NULL;
+ cmsStage* Matrix, *Shaper;
+
+
+ // Is a named color profile?
+ if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+ if (!WriteNamedColorCSA(mem, hProfile, Intent)) goto Error;
+ }
+ else {
+
+
+ // Any profile class are allowed (including devicelink), but
+ // output (PCS) colorspace must be XYZ or Lab
+ cmsColorSpaceSignature ColorSpace = cmsGetPCS(hProfile);
+
+ if (ColorSpace != cmsSigXYZData &&
+ ColorSpace != cmsSigLabData) {
+
+ cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Invalid output color space");
+ goto Error;
+ }
+
+
+ // Read the lut with all necessary conversion stages
+ lut = _cmsReadInputLUT(hProfile, Intent);
+ if (lut == NULL) goto Error;
+
+
+ // Tone curves + matrix can be implemented without any LUT
+ if (cmsPipelineCheckAndRetreiveStages(lut, 2, cmsSigCurveSetElemType, cmsSigMatrixElemType, &Shaper, &Matrix)) {
+
+ if (!WriteInputMatrixShaper(mem, hProfile, Matrix, Shaper)) goto Error;
+
+ }
+ else {
+ // We need a LUT for the rest
+ if (!WriteInputLUT(mem, hProfile, Intent, dwFlags)) goto Error;
+ }
+ }
+
+
+ // Done, keep memory usage
+ dwBytesUsed = mem ->UsedSpace;
+
+ // Get rid of LUT
+ if (lut != NULL) cmsPipelineFree(lut);
+
+ // Finally, return used byte count
+ return dwBytesUsed;
+
+Error:
+ if (lut != NULL) cmsPipelineFree(lut);
+ return 0;
+}
+
+// ------------------------------------------------------ Color Rendering Dictionary (CRD)
+
+
+
+/*
+
+ Black point compensation plus chromatic adaptation:
+
+ Step 1 - Chromatic adaptation
+ =============================
+
+ WPout
+ X = ------- PQR
+ Wpin
+
+ Step 2 - Black point compensation
+ =================================
+
+ (WPout - BPout)*X - WPout*(BPin - BPout)
+ out = ---------------------------------------
+ WPout - BPin
+
+
+ Algorithm discussion
+ ====================
+
+ TransformPQR(WPin, BPin, WPout, BPout, PQR)
+
+ Wpin,etc= { Xws Yws Zws Pws Qws Rws }
+
+
+ Algorithm Stack 0...n
+ ===========================================================
+ PQR BPout WPout BPin WPin
+ 4 index 3 get WPin PQR BPout WPout BPin WPin
+ div (PQR/WPin) BPout WPout BPin WPin
+ 2 index 3 get WPout (PQR/WPin) BPout WPout BPin WPin
+ mult WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ 2 index 3 get WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+ 2 index 3 get BPout WPout WPout*(PQR/WPin) BPout WPout BPin WPin
+ sub (WPout-BPout) WPout*(PQR/WPin) BPout WPout BPin WPin
+ mult (WPout-BPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ 2 index 3 get WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ 4 index 3 get BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ 3 index 3 get BPout BPin WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+
+ sub (BPin-BPout) WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ mult (BPin-BPout)*WPout (BPout-WPout)* WPout*(PQR/WPin) BPout WPout BPin WPin
+ sub (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+
+ 3 index 3 get BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ 3 index 3 get WPout BPin (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ exch
+ sub (WPout-BPin) (BPout-WPout)* WPout*(PQR/WPin)-(BPin-BPout)*WPout BPout WPout BPin WPin
+ div
+
+ exch pop
+ exch pop
+ exch pop
+ exch pop
+
+*/
+
+
+static
+void EmitPQRStage(cmsIOHANDLER* m, cmsHPROFILE hProfile, int DoBPC, int lIsAbsolute)
+{
+
+
+ if (lIsAbsolute) {
+
+ // For absolute colorimetric intent, encode back to relative
+ // and generate a relative Pipeline
+
+ // Relative encoding is obtained across XYZpcs*(D50/WhitePoint)
+
+ cmsCIEXYZ White;
+
+ _cmsReadMediaWhitePoint(&White, hProfile);
+
+ _cmsIOPrintf(m,"/MatrixPQR [1 0 0 0 1 0 0 0 1 ]\n");
+ _cmsIOPrintf(m,"/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
+
+ _cmsIOPrintf(m, "%% Absolute colorimetric -- encode to relative to maximize LUT usage\n"
+ "/TransformPQR [\n"
+ "{0.9642 mul %g div exch pop exch pop exch pop exch pop} bind\n"
+ "{1.0000 mul %g div exch pop exch pop exch pop exch pop} bind\n"
+ "{0.8249 mul %g div exch pop exch pop exch pop exch pop} bind\n]\n",
+ White.X, White.Y, White.Z);
+ return;
+ }
+
+
+ _cmsIOPrintf(m,"%% Bradford Cone Space\n"
+ "/MatrixPQR [0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296 ] \n");
+
+ _cmsIOPrintf(m, "/RangePQR [ -0.5 2 -0.5 2 -0.5 2 ]\n");
+
+
+ // No BPC
+
+ if (!DoBPC) {
+
+ _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space\n"
+ "/TransformPQR [\n"
+ "{exch pop exch 3 get mul exch pop exch 3 get div} bind\n"
+ "{exch pop exch 4 get mul exch pop exch 4 get div} bind\n"
+ "{exch pop exch 5 get mul exch pop exch 5 get div} bind\n]\n");
+ } else {
+
+ // BPC
+
+ _cmsIOPrintf(m, "%% VonKries-like transform in Bradford Cone Space plus BPC\n"
+ "/TransformPQR [\n");
+
+ _cmsIOPrintf(m, "{4 index 3 get div 2 index 3 get mul "
+ "2 index 3 get 2 index 3 get sub mul "
+ "2 index 3 get 4 index 3 get 3 index 3 get sub mul sub "
+ "3 index 3 get 3 index 3 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n");
+
+ _cmsIOPrintf(m, "{4 index 4 get div 2 index 4 get mul "
+ "2 index 4 get 2 index 4 get sub mul "
+ "2 index 4 get 4 index 4 get 3 index 4 get sub mul sub "
+ "3 index 4 get 3 index 4 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n");
+
+ _cmsIOPrintf(m, "{4 index 5 get div 2 index 5 get mul "
+ "2 index 5 get 2 index 5 get sub mul "
+ "2 index 5 get 4 index 5 get 3 index 5 get sub mul sub "
+ "3 index 5 get 3 index 5 get exch sub div "
+ "exch pop exch pop exch pop exch pop } bind\n]\n");
+
+ }
+
+
+}
+
+
+static
+void EmitXYZ2Lab(cmsIOHANDLER* m)
+{
+ _cmsIOPrintf(m, "/RangeLMN [ -0.635 2.0 0 2 -0.635 2.0 ]\n");
+ _cmsIOPrintf(m, "/EncodeLMN [\n");
+ _cmsIOPrintf(m, "{ 0.964200 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ _cmsIOPrintf(m, "{ 1.000000 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ _cmsIOPrintf(m, "{ 0.824900 div dup 0.008856 le {7.787 mul 16 116 div add}{1 3 div exp} ifelse } bind\n");
+ _cmsIOPrintf(m, "]\n");
+ _cmsIOPrintf(m, "/MatrixABC [ 0 1 0 1 -1 1 0 0 -1 ]\n");
+ _cmsIOPrintf(m, "/EncodeABC [\n");
+
+
+ _cmsIOPrintf(m, "{ 116 mul 16 sub 100 div } bind\n");
+ _cmsIOPrintf(m, "{ 500 mul 128 add 256 div } bind\n");
+ _cmsIOPrintf(m, "{ 200 mul 128 add 256 div } bind\n");
+
+
+ _cmsIOPrintf(m, "]\n");
+
+
+}
+
+// Due to impedance mismatch between XYZ and almost all RGB and CMYK spaces
+// I choose to dump LUTS in Lab instead of XYZ. There is still a lot of wasted
+// space on 3D CLUT, but since space seems not to be a problem here, 33 points
+// would give a reasonable accurancy. Note also that CRD tables must operate in
+// 8 bits.
+
+static
+int WriteOutputLUT(cmsIOHANDLER* m, cmsHPROFILE hProfile, int Intent, cmsUInt32Number dwFlags)
+{
+ cmsHPROFILE hLab;
+ cmsHTRANSFORM xform;
+ int i, nChannels;
+ cmsUInt32Number OutputFormat;
+ _cmsTRANSFORM* v;
+ cmsPipeline* DeviceLink;
+ cmsHPROFILE Profiles[3];
+ cmsCIEXYZ BlackPointAdaptedToD50;
+ cmsBool lDoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION);
+ cmsBool lFixWhite = !(dwFlags & cmsFLAGS_NOWHITEONWHITEFIXUP);
+ cmsUInt32Number InFrm = TYPE_Lab_16;
+ int RelativeEncodingIntent;
+ cmsColorSpaceSignature ColorSpace;
+
+
+ hLab = cmsCreateLab4ProfileTHR(m ->ContextID, NULL);
+ if (hLab == NULL) return 0;
+
+ OutputFormat = cmsFormatterForColorspaceOfProfile(hProfile, 2, FALSE);
+ nChannels = T_CHANNELS(OutputFormat);
+
+ ColorSpace = cmsGetColorSpace(hProfile);
+
+ // For absolute colorimetric, the LUT is encoded as relative in order to preserve precision.
+
+ RelativeEncodingIntent = Intent;
+ if (RelativeEncodingIntent == INTENT_ABSOLUTE_COLORIMETRIC)
+ RelativeEncodingIntent = INTENT_RELATIVE_COLORIMETRIC;
+
+
+ // Use V4 Lab always
+ Profiles[0] = hLab;
+ Profiles[1] = hProfile;
+
+ xform = cmsCreateMultiprofileTransformTHR(m ->ContextID,
+ Profiles, 2, TYPE_Lab_DBL,
+ OutputFormat, RelativeEncodingIntent, 0);
+ cmsCloseProfile(hLab);
+
+ if (xform == NULL) {
+
+ cmsSignalError(m ->ContextID, cmsERROR_COLORSPACE_CHECK, "Cannot create transform Lab -> Profile in CRD creation");
+ return 0;
+ }
+
+ // Get a copy of the internal devicelink
+ v = (_cmsTRANSFORM*) xform;
+ DeviceLink = cmsPipelineDup(v ->Lut);
+ if (DeviceLink == NULL) return 0;
+
+
+ // We need a CLUT
+ dwFlags |= cmsFLAGS_FORCE_CLUT;
+ _cmsOptimizePipeline(m->ContextID, &DeviceLink, RelativeEncodingIntent, &InFrm, &OutputFormat, &dwFlags);
+
+ _cmsIOPrintf(m, "<<\n");
+ _cmsIOPrintf(m, "/ColorRenderingType 1\n");
+
+
+ cmsDetectBlackPoint(&BlackPointAdaptedToD50, hProfile, Intent, 0);
+
+ // Emit headers, etc.
+ EmitWhiteBlackD50(m, &BlackPointAdaptedToD50);
+ EmitPQRStage(m, hProfile, lDoBPC, Intent == INTENT_ABSOLUTE_COLORIMETRIC);
+ EmitXYZ2Lab(m);
+
+
+ // FIXUP: map Lab (100, 0, 0) to perfect white, because the particular encoding for Lab
+ // does map a=b=0 not falling into any specific node. Since range a,b goes -128..127,
+ // zero is slightly moved towards right, so assure next node (in L=100 slice) is mapped to
+ // zero. This would sacrifice a bit of highlights, but failure to do so would cause
+ // scum dot. Ouch.
+
+ if (Intent == INTENT_ABSOLUTE_COLORIMETRIC)
+ lFixWhite = FALSE;
+
+ _cmsIOPrintf(m, "/RenderTable ");
+
+
+ WriteCLUT(m, cmsPipelineGetPtrToFirstStage(DeviceLink), "<", ">\n", "", "", lFixWhite, ColorSpace);
+
+ _cmsIOPrintf(m, " %d {} bind ", nChannels);
+
+ for (i=1; i < nChannels; i++)
+ _cmsIOPrintf(m, "dup ");
+
+ _cmsIOPrintf(m, "]\n");
+
+
+ EmitIntent(m, Intent);
+
+ _cmsIOPrintf(m, ">>\n");
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ _cmsIOPrintf(m, "/Current exch /ColorRendering defineresource pop\n");
+ }
+
+ cmsPipelineFree(DeviceLink);
+ cmsDeleteTransform(xform);
+
+ return 1;
+}
+
+
+// Builds a ASCII string containing colorant list in 0..1.0 range
+static
+void BuildColorantList(char *Colorant, int nColorant, cmsUInt16Number Out[])
+{
+ char Buff[32];
+ int j;
+
+ Colorant[0] = 0;
+ if (nColorant > cmsMAXCHANNELS)
+ nColorant = cmsMAXCHANNELS;
+
+ for (j=0; j < nColorant; j++) {
+
+ sprintf(Buff, "%.3f", Out[j] / 65535.0);
+ strcat(Colorant, Buff);
+ if (j < nColorant -1)
+ strcat(Colorant, " ");
+
+ }
+}
+
+
+// Creates a PostScript color list from a named profile data.
+// This is a HP extension.
+
+static
+int WriteNamedColorCRD(cmsIOHANDLER* m, cmsHPROFILE hNamedColor, int Intent, cmsUInt32Number dwFlags)
+{
+ cmsHTRANSFORM xform;
+ int i, nColors, nColorant;
+ cmsUInt32Number OutputFormat;
+ char ColorName[32];
+ char Colorant[128];
+ cmsNAMEDCOLORLIST* NamedColorList;
+
+
+ OutputFormat = cmsFormatterForColorspaceOfProfile(hNamedColor, 2, FALSE);
+ nColorant = T_CHANNELS(OutputFormat);
+
+
+ xform = cmsCreateTransform(hNamedColor, TYPE_NAMED_COLOR_INDEX, NULL, OutputFormat, Intent, dwFlags);
+ if (xform == NULL) return 0;
+
+
+ NamedColorList = cmsGetNamedColorList(xform);
+ if (NamedColorList == NULL) return 0;
+
+ _cmsIOPrintf(m, "<<\n");
+ _cmsIOPrintf(m, "(colorlistcomment) (%s) \n", "Named profile");
+ _cmsIOPrintf(m, "(Prefix) [ (Pantone ) (PANTONE ) ]\n");
+ _cmsIOPrintf(m, "(Suffix) [ ( CV) ( CVC) ( C) ]\n");
+
+ nColors = cmsNamedColorCount(NamedColorList);
+
+ for (i=0; i < nColors; i++) {
+
+ cmsUInt16Number In[1];
+ cmsUInt16Number Out[cmsMAXCHANNELS];
+
+ In[0] = (cmsUInt16Number) i;
+
+ if (!cmsNamedColorInfo(NamedColorList, i, ColorName, NULL, NULL, NULL, NULL))
+ continue;
+
+ cmsDoTransform(xform, In, Out, 1);
+ BuildColorantList(Colorant, nColorant, Out);
+ _cmsIOPrintf(m, " (%s) [ %s ]\n", ColorName, Colorant);
+ }
+
+ _cmsIOPrintf(m, " >>");
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ _cmsIOPrintf(m, " /Current exch /HPSpotTable defineresource pop\n");
+ }
+
+ cmsDeleteTransform(xform);
+ return 1;
+}
+
+
+
+// This one does create a Color Rendering Dictionary.
+// CRD are always LUT-Based, no matter if profile is
+// implemented as matrix-shaper.
+
+static
+cmsUInt32Number GenerateCRD(cmsContext ContextID,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent, cmsUInt32Number dwFlags,
+ cmsIOHANDLER* mem)
+{
+ cmsUInt32Number dwBytesUsed;
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ EmitHeader(mem, "Color Rendering Dictionary (CRD)", hProfile);
+ }
+
+
+ // Is a named color profile?
+ if (cmsGetDeviceClass(hProfile) == cmsSigNamedColorClass) {
+
+ if (!WriteNamedColorCRD(mem, hProfile, Intent, dwFlags)) {
+ return 0;
+ }
+ }
+ else {
+
+ // CRD are always implemented as LUT
+
+ if (!WriteOutputLUT(mem, hProfile, Intent, dwFlags)) {
+ return 0;
+ }
+ }
+
+ if (!(dwFlags & cmsFLAGS_NODEFAULTRESOURCEDEF)) {
+
+ _cmsIOPrintf(mem, "%%%%EndResource\n");
+ _cmsIOPrintf(mem, "\n%% CRD End\n");
+ }
+
+ // Done, keep memory usage
+ dwBytesUsed = mem ->UsedSpace;
+
+ // Finally, return used byte count
+ return dwBytesUsed;
+
+ cmsUNUSED_PARAMETER(ContextID);
+}
+
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetPostScriptColorResource(cmsContext ContextID,
+ cmsPSResourceType Type,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags,
+ cmsIOHANDLER* io)
+{
+ cmsUInt32Number rc;
+
+
+ switch (Type) {
+
+ case cmsPS_RESOURCE_CSA:
+ rc = GenerateCSA(ContextID, hProfile, Intent, dwFlags, io);
+ break;
+
+ default:
+ case cmsPS_RESOURCE_CRD:
+ rc = GenerateCRD(ContextID, hProfile, Intent, dwFlags, io);
+ break;
+ }
+
+ return rc;
+}
+
+
+
+cmsUInt32Number CMSEXPORT cmsGetPostScriptCRD(cmsContext ContextID,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent, cmsUInt32Number dwFlags,
+ void* Buffer, cmsUInt32Number dwBufferLen)
+{
+ cmsIOHANDLER* mem;
+ cmsUInt32Number dwBytesUsed;
+
+ // Set up the serialization engine
+ if (Buffer == NULL)
+ mem = cmsOpenIOhandlerFromNULL(ContextID);
+ else
+ mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w");
+
+ if (!mem) return 0;
+
+ dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CRD, hProfile, Intent, dwFlags, mem);
+
+ // Get rid of memory stream
+ cmsCloseIOhandler(mem);
+
+ return dwBytesUsed;
+}
+
+
+
+// Does create a Color Space Array on XYZ colorspace for PostScript usage
+cmsUInt32Number CMSEXPORT cmsGetPostScriptCSA(cmsContext ContextID,
+ cmsHPROFILE hProfile,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags,
+ void* Buffer,
+ cmsUInt32Number dwBufferLen)
+{
+ cmsIOHANDLER* mem;
+ cmsUInt32Number dwBytesUsed;
+
+ if (Buffer == NULL)
+ mem = cmsOpenIOhandlerFromNULL(ContextID);
+ else
+ mem = cmsOpenIOhandlerFromMem(ContextID, Buffer, dwBufferLen, "w");
+
+ if (!mem) return 0;
+
+ dwBytesUsed = cmsGetPostScriptColorResource(ContextID, cmsPS_RESOURCE_CSA, hProfile, Intent, dwFlags, mem);
+
+ // Get rid of memory stream
+ cmsCloseIOhandler(mem);
+
+ return dwBytesUsed;
+
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c
new file mode 100644
index 0000000000..70e469161f
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssamp.c
@@ -0,0 +1,572 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2010 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+#define cmsmin(a, b) (((a) < (b)) ? (a) : (b))
+#define cmsmax(a, b) (((a) > (b)) ? (a) : (b))
+
+// This file contains routines for resampling and LUT optimization, black point detection
+// and black preservation.
+
+// Black point detection -------------------------------------------------------------------------
+
+
+// PCS -> PCS round trip transform, always uses relative intent on the device -> pcs
+static
+cmsHTRANSFORM CreateRoundtripXForm(cmsHPROFILE hProfile, cmsUInt32Number nIntent)
+{
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsHPROFILE hLab = cmsCreateLab4ProfileTHR(ContextID, NULL);
+ cmsHTRANSFORM xform;
+ cmsBool BPC[4] = { FALSE, FALSE, FALSE, FALSE };
+ cmsFloat64Number States[4] = { 1.0, 1.0, 1.0, 1.0 };
+ cmsHPROFILE hProfiles[4];
+ cmsUInt32Number Intents[4];
+
+ hProfiles[0] = hLab; hProfiles[1] = hProfile; hProfiles[2] = hProfile; hProfiles[3] = hLab;
+ Intents[0] = INTENT_RELATIVE_COLORIMETRIC; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = INTENT_RELATIVE_COLORIMETRIC;
+
+ xform = cmsCreateExtendedTransform(ContextID, 4, hProfiles, BPC, Intents,
+ States, NULL, 0, TYPE_Lab_DBL, TYPE_Lab_DBL, cmsFLAGS_NOCACHE|cmsFLAGS_NOOPTIMIZE);
+
+ cmsCloseProfile(hLab);
+ return xform;
+}
+
+// Use darker colorants to obtain black point. This works in the relative colorimetric intent and
+// assumes more ink results in darker colors. No ink limit is assumed.
+static
+cmsBool BlackPointAsDarkerColorant(cmsHPROFILE hInput,
+ cmsUInt32Number Intent,
+ cmsCIEXYZ* BlackPoint,
+ cmsUInt32Number dwFlags)
+{
+ cmsUInt16Number *Black;
+ cmsHTRANSFORM xform;
+ cmsColorSpaceSignature Space;
+ cmsUInt32Number nChannels;
+ cmsUInt32Number dwFormat;
+ cmsHPROFILE hLab;
+ cmsCIELab Lab;
+ cmsCIEXYZ BlackXYZ;
+ cmsContext ContextID = cmsGetProfileContextID(hInput);
+
+ // If the profile does not support input direction, assume Black point 0
+ if (!cmsIsIntentSupported(hInput, Intent, LCMS_USED_AS_INPUT)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Create a formatter which has n channels and floating point
+ dwFormat = cmsFormatterForColorspaceOfProfile(hInput, 2, FALSE);
+
+ // Try to get black by using black colorant
+ Space = cmsGetColorSpace(hInput);
+
+ // This function returns darker colorant in 16 bits for several spaces
+ if (!_cmsEndPointsBySpace(Space, NULL, &Black, &nChannels)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ if (nChannels != T_CHANNELS(dwFormat)) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Lab will be used as the output space, but lab2 will avoid recursion
+ hLab = cmsCreateLab2ProfileTHR(ContextID, NULL);
+ if (hLab == NULL) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Create the transform
+ xform = cmsCreateTransformTHR(ContextID, hInput, dwFormat,
+ hLab, TYPE_Lab_DBL, Intent, cmsFLAGS_NOOPTIMIZE|cmsFLAGS_NOCACHE);
+ cmsCloseProfile(hLab);
+
+ if (xform == NULL) {
+
+ // Something went wrong. Get rid of open resources and return zero as black
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Convert black to Lab
+ cmsDoTransform(xform, Black, &Lab, 1);
+
+ // Force it to be neutral, clip to max. L* of 50
+ Lab.a = Lab.b = 0;
+ if (Lab.L > 50) Lab.L = 50;
+
+ // Free the resources
+ cmsDeleteTransform(xform);
+
+ // Convert from Lab (which is now clipped) to XYZ.
+ cmsLab2XYZ(NULL, &BlackXYZ, &Lab);
+
+ if (BlackPoint != NULL)
+ *BlackPoint = BlackXYZ;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(dwFlags);
+}
+
+// Get a black point of output CMYK profile, discounting any ink-limiting embedded
+// in the profile. For doing that, we use perceptual intent in input direction:
+// Lab (0, 0, 0) -> [Perceptual] Profile -> CMYK -> [Rel. colorimetric] Profile -> Lab
+static
+cmsBool BlackPointUsingPerceptualBlack(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile)
+{
+ cmsHTRANSFORM hRoundTrip;
+ cmsCIELab LabIn, LabOut;
+ cmsCIEXYZ BlackXYZ;
+
+ // Is the intent supported by the profile?
+ if (!cmsIsIntentSupported(hProfile, INTENT_PERCEPTUAL, LCMS_USED_AS_INPUT)) {
+
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return TRUE;
+ }
+
+ hRoundTrip = CreateRoundtripXForm(hProfile, INTENT_PERCEPTUAL);
+ if (hRoundTrip == NULL) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ LabIn.L = LabIn.a = LabIn.b = 0;
+ cmsDoTransform(hRoundTrip, &LabIn, &LabOut, 1);
+
+ // Clip Lab to reasonable limits
+ if (LabOut.L > 50) LabOut.L = 50;
+ LabOut.a = LabOut.b = 0;
+
+ cmsDeleteTransform(hRoundTrip);
+
+ // Convert it to XYZ
+ cmsLab2XYZ(NULL, &BlackXYZ, &LabOut);
+
+ if (BlackPoint != NULL)
+ *BlackPoint = BlackXYZ;
+
+ return TRUE;
+}
+
+// This function shouldn't exist at all -- there is such quantity of broken
+// profiles on black point tag, that we must somehow fix chromaticity to
+// avoid huge tint when doing Black point compensation. This function does
+// just that. There is a special flag for using black point tag, but turned
+// off by default because it is bogus on most profiles. The detection algorithm
+// involves to turn BP to neutral and to use only L component.
+cmsBool CMSEXPORT cmsDetectBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
+{
+ cmsProfileClassSignature devClass;
+
+ // Make sure the device class is adequate
+ devClass = cmsGetDeviceClass(hProfile);
+ if (devClass == cmsSigLinkClass ||
+ devClass == cmsSigAbstractClass ||
+ devClass == cmsSigNamedColorClass) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Make sure intent is adequate
+ if (Intent != INTENT_PERCEPTUAL &&
+ Intent != INTENT_RELATIVE_COLORIMETRIC &&
+ Intent != INTENT_SATURATION) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // v4 + perceptual & saturation intents does have its own black point, and it is
+ // well specified enough to use it. Black point tag is deprecated in V4.
+ if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
+ (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+ // Matrix shaper share MRC & perceptual intents
+ if (cmsIsMatrixShaper(hProfile))
+ return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);
+
+ // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents
+ BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;
+ BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;
+ BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;
+
+ return TRUE;
+ }
+
+
+#ifdef CMS_USE_PROFILE_BLACK_POINT_TAG
+
+ // v2, v4 rel/abs colorimetric
+ if (cmsIsTag(hProfile, cmsSigMediaBlackPointTag) &&
+ Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+ cmsCIEXYZ *BlackPtr, BlackXYZ, UntrustedBlackPoint, TrustedBlackPoint, MediaWhite;
+ cmsCIELab Lab;
+
+ // If black point is specified, then use it,
+
+ BlackPtr = cmsReadTag(hProfile, cmsSigMediaBlackPointTag);
+ if (BlackPtr != NULL) {
+
+ BlackXYZ = *BlackPtr;
+ _cmsReadMediaWhitePoint(&MediaWhite, hProfile);
+
+ // Black point is absolute XYZ, so adapt to D50 to get PCS value
+ cmsAdaptToIlluminant(&UntrustedBlackPoint, &MediaWhite, cmsD50_XYZ(), &BlackXYZ);
+
+ // Force a=b=0 to get rid of any chroma
+ cmsXYZ2Lab(NULL, &Lab, &UntrustedBlackPoint);
+ Lab.a = Lab.b = 0;
+ if (Lab.L > 50) Lab.L = 50; // Clip to L* <= 50
+ cmsLab2XYZ(NULL, &TrustedBlackPoint, &Lab);
+
+ if (BlackPoint != NULL)
+ *BlackPoint = TrustedBlackPoint;
+
+ return TRUE;
+ }
+ }
+#endif
+
+ // That is about v2 profiles.
+
+ // If output profile, discount ink-limiting and that's all
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC &&
+ (cmsGetDeviceClass(hProfile) == cmsSigOutputClass) &&
+ (cmsGetColorSpace(hProfile) == cmsSigCmykData))
+ return BlackPointUsingPerceptualBlack(BlackPoint, hProfile);
+
+ // Nope, compute BP using current intent.
+ return BlackPointAsDarkerColorant(hProfile, Intent, BlackPoint, dwFlags);
+}
+
+
+
+// ---------------------------------------------------------------------------------------------------------
+
+// Least Squares Fit of a Quadratic Curve to Data
+// http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html
+
+static
+cmsFloat64Number RootOfLeastSquaresFitQuadraticCurve(int n, cmsFloat64Number x[], cmsFloat64Number y[])
+{
+ double sum_x = 0, sum_x2 = 0, sum_x3 = 0, sum_x4 = 0;
+ double sum_y = 0, sum_yx = 0, sum_yx2 = 0;
+ double d, a, b, c;
+ int i;
+ cmsMAT3 m;
+ cmsVEC3 v, res;
+
+ if (n < 4) return 0;
+
+ for (i=0; i < n; i++) {
+
+ double xn = x[i];
+ double yn = y[i];
+
+ sum_x += xn;
+ sum_x2 += xn*xn;
+ sum_x3 += xn*xn*xn;
+ sum_x4 += xn*xn*xn*xn;
+
+ sum_y += yn;
+ sum_yx += yn*xn;
+ sum_yx2 += yn*xn*xn;
+ }
+
+ _cmsVEC3init(&m.v[0], n, sum_x, sum_x2);
+ _cmsVEC3init(&m.v[1], sum_x, sum_x2, sum_x3);
+ _cmsVEC3init(&m.v[2], sum_x2, sum_x3, sum_x4);
+
+ _cmsVEC3init(&v, sum_y, sum_yx, sum_yx2);
+
+ if (!_cmsMAT3solve(&res, &m, &v)) return 0;
+
+
+ a = res.n[2];
+ b = res.n[1];
+ c = res.n[0];
+
+ if (fabs(a) < 1.0E-10) {
+
+ return cmsmin(0, cmsmax(50, -c/b ));
+ }
+ else {
+
+ d = b*b - 4.0 * a * c;
+ if (d <= 0) {
+ return 0;
+ }
+ else {
+
+ double rt = (-b + sqrt(d)) / (2.0 * a);
+
+ return cmsmax(0, cmsmin(50, rt));
+ }
+ }
+
+}
+
+/*
+static
+cmsBool IsMonotonic(int n, const cmsFloat64Number Table[])
+{
+ int i;
+ cmsFloat64Number last;
+
+ last = Table[n-1];
+
+ for (i = n-2; i >= 0; --i) {
+
+ if (Table[i] > last)
+
+ return FALSE;
+ else
+ last = Table[i];
+
+ }
+
+ return TRUE;
+}
+*/
+
+// Calculates the black point of a destination profile.
+// This algorithm comes from the Adobe paper disclosing its black point compensation method.
+cmsBool CMSEXPORT cmsDetectDestinationBlackPoint(cmsCIEXYZ* BlackPoint, cmsHPROFILE hProfile, cmsUInt32Number Intent, cmsUInt32Number dwFlags)
+{
+ cmsColorSpaceSignature ColorSpace;
+ cmsHTRANSFORM hRoundTrip = NULL;
+ cmsCIELab InitialLab, destLab, Lab;
+ cmsFloat64Number inRamp[256], outRamp[256];
+ cmsFloat64Number MinL, MaxL;
+ cmsBool NearlyStraightMidrange = TRUE;
+ cmsFloat64Number yRamp[256];
+ cmsFloat64Number x[256], y[256];
+ cmsFloat64Number lo, hi;
+ int n, l;
+ cmsProfileClassSignature devClass;
+
+ // Make sure the device class is adequate
+ devClass = cmsGetDeviceClass(hProfile);
+ if (devClass == cmsSigLinkClass ||
+ devClass == cmsSigAbstractClass ||
+ devClass == cmsSigNamedColorClass) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+ // Make sure intent is adequate
+ if (Intent != INTENT_PERCEPTUAL &&
+ Intent != INTENT_RELATIVE_COLORIMETRIC &&
+ Intent != INTENT_SATURATION) {
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+
+ // v4 + perceptual & saturation intents does have its own black point, and it is
+ // well specified enough to use it. Black point tag is deprecated in V4.
+ if ((cmsGetEncodedICCversion(hProfile) >= 0x4000000) &&
+ (Intent == INTENT_PERCEPTUAL || Intent == INTENT_SATURATION)) {
+
+ // Matrix shaper share MRC & perceptual intents
+ if (cmsIsMatrixShaper(hProfile))
+ return BlackPointAsDarkerColorant(hProfile, INTENT_RELATIVE_COLORIMETRIC, BlackPoint, 0);
+
+ // Get Perceptual black out of v4 profiles. That is fixed for perceptual & saturation intents
+ BlackPoint -> X = cmsPERCEPTUAL_BLACK_X;
+ BlackPoint -> Y = cmsPERCEPTUAL_BLACK_Y;
+ BlackPoint -> Z = cmsPERCEPTUAL_BLACK_Z;
+ return TRUE;
+ }
+
+
+ // Check if the profile is lut based and gray, rgb or cmyk (7.2 in Adobe's document)
+ ColorSpace = cmsGetColorSpace(hProfile);
+ if (!cmsIsCLUT(hProfile, Intent, LCMS_USED_AS_OUTPUT ) ||
+ (ColorSpace != cmsSigGrayData &&
+ ColorSpace != cmsSigRgbData &&
+ ColorSpace != cmsSigCmykData)) {
+
+ // In this case, handle as input case
+ return cmsDetectBlackPoint(BlackPoint, hProfile, Intent, dwFlags);
+ }
+
+ // It is one of the valid cases!, use Adobe algorithm
+
+
+ // Set a first guess, that should work on good profiles.
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+ cmsCIEXYZ IniXYZ;
+
+ // calculate initial Lab as source black point
+ if (!cmsDetectBlackPoint(&IniXYZ, hProfile, Intent, dwFlags)) {
+ return FALSE;
+ }
+
+ // convert the XYZ to lab
+ cmsXYZ2Lab(NULL, &InitialLab, &IniXYZ);
+
+ } else {
+
+ // set the initial Lab to zero, that should be the black point for perceptual and saturation
+ InitialLab.L = 0;
+ InitialLab.a = 0;
+ InitialLab.b = 0;
+ }
+
+
+ // Step 2
+ // ======
+
+ // Create a roundtrip. Define a Transform BT for all x in L*a*b*
+ hRoundTrip = CreateRoundtripXForm(hProfile, Intent);
+ if (hRoundTrip == NULL) return FALSE;
+
+ // Compute ramps
+
+ for (l=0; l < 256; l++) {
+
+ Lab.L = (cmsFloat64Number) (l * 100.0) / 255.0;
+ Lab.a = cmsmin(50, cmsmax(-50, InitialLab.a));
+ Lab.b = cmsmin(50, cmsmax(-50, InitialLab.b));
+
+ cmsDoTransform(hRoundTrip, &Lab, &destLab, 1);
+
+ inRamp[l] = Lab.L;
+ outRamp[l] = destLab.L;
+ }
+
+ // Make monotonic
+ for (l = 254; l > 0; --l) {
+ outRamp[l] = cmsmin(outRamp[l], outRamp[l+1]);
+ }
+
+ // Check
+ if (! (outRamp[0] < outRamp[255])) {
+
+ cmsDeleteTransform(hRoundTrip);
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+
+ // Test for mid range straight (only on relative colorimetric)
+
+ NearlyStraightMidrange = TRUE;
+ MinL = outRamp[0]; MaxL = outRamp[255];
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+
+ for (l=0; l < 256; l++) {
+
+ if (! ((inRamp[l] <= MinL + 0.2 * (MaxL - MinL) ) ||
+ (fabs(inRamp[l] - outRamp[l]) < 4.0 )))
+ NearlyStraightMidrange = FALSE;
+ }
+
+ // If the mid range is straight (as determined above) then the
+ // DestinationBlackPoint shall be the same as initialLab.
+ // Otherwise, the DestinationBlackPoint shall be determined
+ // using curve fitting.
+
+ if (NearlyStraightMidrange) {
+
+ cmsLab2XYZ(NULL, BlackPoint, &InitialLab);
+ cmsDeleteTransform(hRoundTrip);
+ return TRUE;
+ }
+ }
+
+
+ // curve fitting: The round-trip curve normally looks like a nearly constant section at the black point,
+ // with a corner and a nearly straight line to the white point.
+
+ for (l=0; l < 256; l++) {
+
+ yRamp[l] = (outRamp[l] - MinL) / (MaxL - MinL);
+ }
+
+ // find the black point using the least squares error quadratic curve fitting
+
+ if (Intent == INTENT_RELATIVE_COLORIMETRIC) {
+ lo = 0.1;
+ hi = 0.5;
+ }
+ else {
+
+ // Perceptual and saturation
+ lo = 0.03;
+ hi = 0.25;
+ }
+
+ // Capture shadow points for the fitting.
+ n = 0;
+ for (l=0; l < 256; l++) {
+
+ cmsFloat64Number ff = yRamp[l];
+
+ if (ff >= lo && ff < hi) {
+ x[n] = inRamp[l];
+ y[n] = yRamp[l];
+ n++;
+ }
+ }
+
+
+ // No suitable points
+ if (n < 3 ) {
+ cmsDeleteTransform(hRoundTrip);
+ BlackPoint -> X = BlackPoint ->Y = BlackPoint -> Z = 0.0;
+ return FALSE;
+ }
+
+
+ // fit and get the vertex of quadratic curve
+ Lab.L = RootOfLeastSquaresFitQuadraticCurve(n, x, y);
+
+ if (Lab.L < 0.0) { // clip to zero L* if the vertex is negative
+ Lab.L = 0;
+ }
+
+ Lab.a = InitialLab.a;
+ Lab.b = InitialLab.b;
+
+ cmsLab2XYZ(NULL, BlackPoint, &Lab);
+
+ cmsDeleteTransform(hRoundTrip);
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c
new file mode 100644
index 0000000000..5836e15506
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmssm.c
@@ -0,0 +1,734 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2011 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// ------------------------------------------------------------------------
+
+// Gamut boundary description by using Jan Morovic's Segment maxima method
+// Many thanks to Jan for allowing me to use his algorithm.
+
+// r = C*
+// alpha = Hab
+// theta = L*
+
+#define SECTORS 16 // number of divisions in alpha and theta
+
+// Spherical coordinates
+typedef struct {
+
+ cmsFloat64Number r;
+ cmsFloat64Number alpha;
+ cmsFloat64Number theta;
+
+} cmsSpherical;
+
+typedef enum {
+ GP_EMPTY,
+ GP_SPECIFIED,
+ GP_MODELED
+
+ } GDBPointType;
+
+
+typedef struct {
+
+ GDBPointType Type;
+ cmsSpherical p; // Keep also alpha & theta of maximum
+
+} cmsGDBPoint;
+
+
+typedef struct {
+
+ cmsContext ContextID;
+ cmsGDBPoint Gamut[SECTORS][SECTORS];
+
+} cmsGDB;
+
+
+// A line using the parametric form
+// P = a + t*u
+typedef struct {
+
+ cmsVEC3 a;
+ cmsVEC3 u;
+
+} cmsLine;
+
+
+// A plane using the parametric form
+// Q = b + r*v + s*w
+typedef struct {
+
+ cmsVEC3 b;
+ cmsVEC3 v;
+ cmsVEC3 w;
+
+} cmsPlane;
+
+
+
+// --------------------------------------------------------------------------------------------
+
+// ATAN2() which always returns degree positive numbers
+
+static
+cmsFloat64Number _cmsAtan2(cmsFloat64Number y, cmsFloat64Number x)
+{
+ cmsFloat64Number a;
+
+ // Deal with undefined case
+ if (x == 0.0 && y == 0.0) return 0;
+
+ a = (atan2(y, x) * 180.0) / M_PI;
+
+ while (a < 0) {
+ a += 360;
+ }
+
+ return a;
+}
+
+// Convert to spherical coordinates
+static
+void ToSpherical(cmsSpherical* sp, const cmsVEC3* v)
+{
+
+ cmsFloat64Number L, a, b;
+
+ L = v ->n[VX];
+ a = v ->n[VY];
+ b = v ->n[VZ];
+
+ sp ->r = sqrt( L*L + a*a + b*b );
+
+ if (sp ->r == 0) {
+ sp ->alpha = sp ->theta = 0;
+ return;
+ }
+
+ sp ->alpha = _cmsAtan2(a, b);
+ sp ->theta = _cmsAtan2(sqrt(a*a + b*b), L);
+}
+
+
+// Convert to cartesian from spherical
+static
+void ToCartesian(cmsVEC3* v, const cmsSpherical* sp)
+{
+ cmsFloat64Number sin_alpha;
+ cmsFloat64Number cos_alpha;
+ cmsFloat64Number sin_theta;
+ cmsFloat64Number cos_theta;
+ cmsFloat64Number L, a, b;
+
+ sin_alpha = sin((M_PI * sp ->alpha) / 180.0);
+ cos_alpha = cos((M_PI * sp ->alpha) / 180.0);
+ sin_theta = sin((M_PI * sp ->theta) / 180.0);
+ cos_theta = cos((M_PI * sp ->theta) / 180.0);
+
+ a = sp ->r * sin_theta * sin_alpha;
+ b = sp ->r * sin_theta * cos_alpha;
+ L = sp ->r * cos_theta;
+
+ v ->n[VX] = L;
+ v ->n[VY] = a;
+ v ->n[VZ] = b;
+}
+
+
+// Quantize sector of a spherical coordinate. Saturate 360, 180 to last sector
+// The limits are the centers of each sector, so
+static
+void QuantizeToSector(const cmsSpherical* sp, int* alpha, int* theta)
+{
+ *alpha = (int) floor(((sp->alpha * (SECTORS)) / 360.0) );
+ *theta = (int) floor(((sp->theta * (SECTORS)) / 180.0) );
+
+ if (*alpha >= SECTORS)
+ *alpha = SECTORS-1;
+ if (*theta >= SECTORS)
+ *theta = SECTORS-1;
+}
+
+
+// Line determined by 2 points
+static
+void LineOf2Points(cmsLine* line, cmsVEC3* a, cmsVEC3* b)
+{
+
+ _cmsVEC3init(&line ->a, a ->n[VX], a ->n[VY], a ->n[VZ]);
+ _cmsVEC3init(&line ->u, b ->n[VX] - a ->n[VX],
+ b ->n[VY] - a ->n[VY],
+ b ->n[VZ] - a ->n[VZ]);
+}
+
+
+// Evaluate parametric line
+static
+void GetPointOfLine(cmsVEC3* p, const cmsLine* line, cmsFloat64Number t)
+{
+ p ->n[VX] = line ->a.n[VX] + t * line->u.n[VX];
+ p ->n[VY] = line ->a.n[VY] + t * line->u.n[VY];
+ p ->n[VZ] = line ->a.n[VZ] + t * line->u.n[VZ];
+}
+
+
+
+/*
+ Closest point in sector line1 to sector line2 (both are defined as 0 <=t <= 1)
+ http://softsurfer.com/Archive/algorithm_0106/algorithm_0106.htm
+
+ Copyright 2001, softSurfer (www.softsurfer.com)
+ This code may be freely used and modified for any purpose
+ providing that this copyright notice is included with it.
+ SoftSurfer makes no warranty for this code, and cannot be held
+ liable for any real or imagined damage resulting from its use.
+ Users of this code must verify correctness for their application.
+
+*/
+
+static
+cmsBool ClosestLineToLine(cmsVEC3* r, const cmsLine* line1, const cmsLine* line2)
+{
+ cmsFloat64Number a, b, c, d, e, D;
+ cmsFloat64Number sc, sN, sD;
+ cmsFloat64Number tc, tN, tD;
+ cmsVEC3 w0;
+
+ _cmsVEC3minus(&w0, &line1 ->a, &line2 ->a);
+
+ a = _cmsVEC3dot(&line1 ->u, &line1 ->u);
+ b = _cmsVEC3dot(&line1 ->u, &line2 ->u);
+ c = _cmsVEC3dot(&line2 ->u, &line2 ->u);
+ d = _cmsVEC3dot(&line1 ->u, &w0);
+ e = _cmsVEC3dot(&line2 ->u, &w0);
+
+ D = a*c - b * b; // Denominator
+ sD = tD = D; // default sD = D >= 0
+
+ if (D < MATRIX_DET_TOLERANCE) { // the lines are almost parallel
+
+ sN = 0.0; // force using point P0 on segment S1
+ sD = 1.0; // to prevent possible division by 0.0 later
+ tN = e;
+ tD = c;
+ }
+ else { // get the closest points on the infinite lines
+
+ sN = (b*e - c*d);
+ tN = (a*e - b*d);
+
+ if (sN < 0.0) { // sc < 0 => the s=0 edge is visible
+
+ sN = 0.0;
+ tN = e;
+ tD = c;
+ }
+ else if (sN > sD) { // sc > 1 => the s=1 edge is visible
+ sN = sD;
+ tN = e + b;
+ tD = c;
+ }
+ }
+
+ if (tN < 0.0) { // tc < 0 => the t=0 edge is visible
+
+ tN = 0.0;
+ // recompute sc for this edge
+ if (-d < 0.0)
+ sN = 0.0;
+ else if (-d > a)
+ sN = sD;
+ else {
+ sN = -d;
+ sD = a;
+ }
+ }
+ else if (tN > tD) { // tc > 1 => the t=1 edge is visible
+
+ tN = tD;
+
+ // recompute sc for this edge
+ if ((-d + b) < 0.0)
+ sN = 0;
+ else if ((-d + b) > a)
+ sN = sD;
+ else {
+ sN = (-d + b);
+ sD = a;
+ }
+ }
+ // finally do the division to get sc and tc
+ sc = (fabs(sN) < MATRIX_DET_TOLERANCE ? 0.0 : sN / sD);
+ tc = (fabs(tN) < MATRIX_DET_TOLERANCE ? 0.0 : tN / tD);
+
+ GetPointOfLine(r, line1, sc);
+ return TRUE;
+}
+
+
+
+// ------------------------------------------------------------------ Wrapper
+
+
+// Allocate & free structure
+cmsHANDLE CMSEXPORT cmsGBDAlloc(cmsContext ContextID)
+{
+ cmsGDB* gbd = (cmsGDB*) _cmsMallocZero(ContextID, sizeof(cmsGDB));
+ if (gbd == NULL) return NULL;
+
+ gbd -> ContextID = ContextID;
+
+ return (cmsHANDLE) gbd;
+}
+
+
+void CMSEXPORT cmsGBDFree(cmsHANDLE hGBD)
+{
+ cmsGDB* gbd = (cmsGDB*) hGBD;
+ if (hGBD != NULL)
+ _cmsFree(gbd->ContextID, (void*) gbd);
+}
+
+
+// Auxiliar to retrieve a pointer to the segmentr containing the Lab value
+static
+cmsGDBPoint* GetPoint(cmsGDB* gbd, const cmsCIELab* Lab, cmsSpherical* sp)
+{
+ cmsVEC3 v;
+ int alpha, theta;
+
+ // Housekeeping
+ _cmsAssert(gbd != NULL);
+ _cmsAssert(Lab != NULL);
+ _cmsAssert(sp != NULL);
+
+ // Center L* by substracting half of its domain, that's 50
+ _cmsVEC3init(&v, Lab ->L - 50.0, Lab ->a, Lab ->b);
+
+ // Convert to spherical coordinates
+ ToSpherical(sp, &v);
+
+ if (sp ->r < 0 || sp ->alpha < 0 || sp->theta < 0) {
+ cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, "spherical value out of range");
+ return NULL;
+ }
+
+ // On which sector it falls?
+ QuantizeToSector(sp, &alpha, &theta);
+
+ if (alpha < 0 || theta < 0 || alpha >= SECTORS || theta >= SECTORS) {
+ cmsSignalError(gbd ->ContextID, cmsERROR_RANGE, " quadrant out of range");
+ return NULL;
+ }
+
+ // Get pointer to the sector
+ return &gbd ->Gamut[theta][alpha];
+}
+
+// Add a point to gamut descriptor. Point to add is in Lab color space.
+// GBD is centered on a=b=0 and L*=50
+cmsBool CMSEXPORT cmsGDBAddPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)
+{
+ cmsGDB* gbd = (cmsGDB*) hGBD;
+ cmsGDBPoint* ptr;
+ cmsSpherical sp;
+
+
+ // Get pointer to the sector
+ ptr = GetPoint(gbd, Lab, &sp);
+ if (ptr == NULL) return FALSE;
+
+ // If no samples at this sector, add it
+ if (ptr ->Type == GP_EMPTY) {
+
+ ptr -> Type = GP_SPECIFIED;
+ ptr -> p = sp;
+ }
+ else {
+
+
+ // Substitute only if radius is greater
+ if (sp.r > ptr -> p.r) {
+
+ ptr -> Type = GP_SPECIFIED;
+ ptr -> p = sp;
+ }
+ }
+
+ return TRUE;
+}
+
+// Check if a given point falls inside gamut
+cmsBool CMSEXPORT cmsGDBCheckPoint(cmsHANDLE hGBD, const cmsCIELab* Lab)
+{
+ cmsGDB* gbd = (cmsGDB*) hGBD;
+ cmsGDBPoint* ptr;
+ cmsSpherical sp;
+
+ // Get pointer to the sector
+ ptr = GetPoint(gbd, Lab, &sp);
+ if (ptr == NULL) return FALSE;
+
+ // If no samples at this sector, return no data
+ if (ptr ->Type == GP_EMPTY) return FALSE;
+
+ // In gamut only if radius is greater
+
+ return (sp.r <= ptr -> p.r);
+}
+
+// -----------------------------------------------------------------------------------------------------------------------
+
+// Find near sectors. The list of sectors found is returned on Close[].
+// The function returns the number of sectors as well.
+
+// 24 9 10 11 12
+// 23 8 1 2 13
+// 22 7 * 3 14
+// 21 6 5 4 15
+// 20 19 18 17 16
+//
+// Those are the relative movements
+// {-2,-2}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2},
+// {-2,-1}, {-1, -1}, {0, -1}, {+1, -1}, {+2, -1},
+// {-2, 0}, {-1, 0}, {0, 0}, {+1, 0}, {+2, 0},
+// {-2,+1}, {-1, +1}, {0, +1}, {+1, +1}, {+2, +1},
+// {-2,+2}, {-1, +2}, {0, +2}, {+1, +2}, {+2, +2}};
+
+
+static
+const struct _spiral {
+
+ int AdvX, AdvY;
+
+ } Spiral[] = { {0, -1}, {+1, -1}, {+1, 0}, {+1, +1}, {0, +1}, {-1, +1},
+ {-1, 0}, {-1, -1}, {-1, -2}, {0, -2}, {+1, -2}, {+2, -2},
+ {+2, -1}, {+2, 0}, {+2, +1}, {+2, +2}, {+1, +2}, {0, +2},
+ {-1, +2}, {-2, +2}, {-2, +1}, {-2, 0}, {-2, -1}, {-2, -2} };
+
+#define NSTEPS (sizeof(Spiral) / sizeof(struct _spiral))
+
+static
+int FindNearSectors(cmsGDB* gbd, int alpha, int theta, cmsGDBPoint* Close[])
+{
+ int nSectors = 0;
+ int a, t;
+ cmsUInt32Number i;
+ cmsGDBPoint* pt;
+
+ for (i=0; i < NSTEPS; i++) {
+
+ a = alpha + Spiral[i].AdvX;
+ t = theta + Spiral[i].AdvY;
+
+ // Cycle at the end
+ a %= SECTORS;
+ t %= SECTORS;
+
+ // Cycle at the begin
+ if (a < 0) a = SECTORS + a;
+ if (t < 0) t = SECTORS + t;
+
+ pt = &gbd ->Gamut[t][a];
+
+ if (pt -> Type != GP_EMPTY) {
+
+ Close[nSectors++] = pt;
+ }
+ }
+
+ return nSectors;
+}
+
+
+// Interpolate a missing sector. Method identifies whatever this is top, bottom or mid
+static
+cmsBool InterpolateMissingSector(cmsGDB* gbd, int alpha, int theta)
+{
+ cmsSpherical sp;
+ cmsVEC3 Lab;
+ cmsVEC3 Centre;
+ cmsLine ray;
+ int nCloseSectors;
+ cmsGDBPoint* Close[NSTEPS + 1];
+ cmsSpherical closel, templ;
+ cmsLine edge;
+ int k, m;
+
+ // Is that point already specified?
+ if (gbd ->Gamut[theta][alpha].Type != GP_EMPTY) return TRUE;
+
+ // Fill close points
+ nCloseSectors = FindNearSectors(gbd, alpha, theta, Close);
+
+
+ // Find a central point on the sector
+ sp.alpha = (cmsFloat64Number) ((alpha + 0.5) * 360.0) / (SECTORS);
+ sp.theta = (cmsFloat64Number) ((theta + 0.5) * 180.0) / (SECTORS);
+ sp.r = 50.0;
+
+ // Convert to Cartesian
+ ToCartesian(&Lab, &sp);
+
+ // Create a ray line from centre to this point
+ _cmsVEC3init(&Centre, 50.0, 0, 0);
+ LineOf2Points(&ray, &Lab, &Centre);
+
+ // For all close sectors
+ closel.r = 0.0;
+ closel.alpha = 0;
+ closel.theta = 0;
+
+ for (k=0; k < nCloseSectors; k++) {
+
+ for(m = k+1; m < nCloseSectors; m++) {
+
+ cmsVEC3 temp, a1, a2;
+
+ // A line from sector to sector
+ ToCartesian(&a1, &Close[k]->p);
+ ToCartesian(&a2, &Close[m]->p);
+
+ LineOf2Points(&edge, &a1, &a2);
+
+ // Find a line
+ ClosestLineToLine(&temp, &ray, &edge);
+
+ // Convert to spherical
+ ToSpherical(&templ, &temp);
+
+
+ if ( templ.r > closel.r &&
+ templ.theta >= (theta*180.0/SECTORS) &&
+ templ.theta <= ((theta+1)*180.0/SECTORS) &&
+ templ.alpha >= (alpha*360.0/SECTORS) &&
+ templ.alpha <= ((alpha+1)*360.0/SECTORS)) {
+
+ closel = templ;
+ }
+ }
+ }
+
+ gbd ->Gamut[theta][alpha].p = closel;
+ gbd ->Gamut[theta][alpha].Type = GP_MODELED;
+
+ return TRUE;
+
+}
+
+
+// Interpolate missing parts. The algorithm fist computes slices at
+// theta=0 and theta=Max.
+cmsBool CMSEXPORT cmsGDBCompute(cmsHANDLE hGBD, cmsUInt32Number dwFlags)
+{
+ int alpha, theta;
+ cmsGDB* gbd = (cmsGDB*) hGBD;
+
+ _cmsAssert(hGBD != NULL);
+
+ // Interpolate black
+ for (alpha = 0; alpha < SECTORS; alpha++) {
+
+ if (!InterpolateMissingSector(gbd, alpha, 0)) return FALSE;
+ }
+
+ // Interpolate white
+ for (alpha = 0; alpha < SECTORS; alpha++) {
+
+ if (!InterpolateMissingSector(gbd, alpha, SECTORS-1)) return FALSE;
+ }
+
+
+ // Interpolate Mid
+ for (theta = 1; theta < SECTORS; theta++) {
+ for (alpha = 0; alpha < SECTORS; alpha++) {
+
+ if (!InterpolateMissingSector(gbd, alpha, theta)) return FALSE;
+ }
+ }
+
+ // Done
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(dwFlags);
+}
+
+
+
+
+// --------------------------------------------------------------------------------------------------------
+
+// Great for debug, but not suitable for real use
+
+#if 0
+cmsBool cmsGBDdumpVRML(cmsHANDLE hGBD, const char* fname)
+{
+ FILE* fp;
+ int i, j;
+ cmsGDB* gbd = (cmsGDB*) hGBD;
+ cmsGDBPoint* pt;
+
+ fp = fopen (fname, "wt");
+ if (fp == NULL)
+ return FALSE;
+
+ fprintf (fp, "#VRML V2.0 utf8\n");
+
+ // set the viewing orientation and distance
+ fprintf (fp, "DEF CamTest Group {\n");
+ fprintf (fp, "\tchildren [\n");
+ fprintf (fp, "\t\tDEF Cameras Group {\n");
+ fprintf (fp, "\t\t\tchildren [\n");
+ fprintf (fp, "\t\t\t\tDEF DefaultView Viewpoint {\n");
+ fprintf (fp, "\t\t\t\t\tposition 0 0 340\n");
+ fprintf (fp, "\t\t\t\t\torientation 0 0 1 0\n");
+ fprintf (fp, "\t\t\t\t\tdescription \"default view\"\n");
+ fprintf (fp, "\t\t\t\t}\n");
+ fprintf (fp, "\t\t\t]\n");
+ fprintf (fp, "\t\t},\n");
+ fprintf (fp, "\t]\n");
+ fprintf (fp, "}\n");
+
+ // Output the background stuff
+ fprintf (fp, "Background {\n");
+ fprintf (fp, "\tskyColor [\n");
+ fprintf (fp, "\t\t.5 .5 .5\n");
+ fprintf (fp, "\t]\n");
+ fprintf (fp, "}\n");
+
+ // Output the shape stuff
+ fprintf (fp, "Transform {\n");
+ fprintf (fp, "\tscale .3 .3 .3\n");
+ fprintf (fp, "\tchildren [\n");
+
+ // Draw the axes as a shape:
+ fprintf (fp, "\t\tShape {\n");
+ fprintf (fp, "\t\t\tappearance Appearance {\n");
+ fprintf (fp, "\t\t\t\tmaterial Material {\n");
+ fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n");
+ fprintf (fp, "\t\t\t\t\temissiveColor 1.0 1.0 1.0\n");
+ fprintf (fp, "\t\t\t\t\tshininess 0.8\n");
+ fprintf (fp, "\t\t\t\t}\n");
+ fprintf (fp, "\t\t\t}\n");
+ fprintf (fp, "\t\t\tgeometry IndexedLineSet {\n");
+ fprintf (fp, "\t\t\t\tcoord Coordinate {\n");
+ fprintf (fp, "\t\t\t\t\tpoint [\n");
+ fprintf (fp, "\t\t\t\t\t0.0 0.0 0.0,\n");
+ fprintf (fp, "\t\t\t\t\t%f 0.0 0.0,\n", 255.0);
+ fprintf (fp, "\t\t\t\t\t0.0 %f 0.0,\n", 255.0);
+ fprintf (fp, "\t\t\t\t\t0.0 0.0 %f]\n", 255.0);
+ fprintf (fp, "\t\t\t\t}\n");
+ fprintf (fp, "\t\t\t\tcoordIndex [\n");
+ fprintf (fp, "\t\t\t\t\t0, 1, -1\n");
+ fprintf (fp, "\t\t\t\t\t0, 2, -1\n");
+ fprintf (fp, "\t\t\t\t\t0, 3, -1]\n");
+ fprintf (fp, "\t\t\t}\n");
+ fprintf (fp, "\t\t}\n");
+
+
+ fprintf (fp, "\t\tShape {\n");
+ fprintf (fp, "\t\t\tappearance Appearance {\n");
+ fprintf (fp, "\t\t\t\tmaterial Material {\n");
+ fprintf (fp, "\t\t\t\t\tdiffuseColor 0 0.8 0\n");
+ fprintf (fp, "\t\t\t\t\temissiveColor 1 1 1\n");
+ fprintf (fp, "\t\t\t\t\tshininess 0.8\n");
+ fprintf (fp, "\t\t\t\t}\n");
+ fprintf (fp, "\t\t\t}\n");
+ fprintf (fp, "\t\t\tgeometry PointSet {\n");
+
+ // fill in the points here
+ fprintf (fp, "\t\t\t\tcoord Coordinate {\n");
+ fprintf (fp, "\t\t\t\t\tpoint [\n");
+
+ // We need to transverse all gamut hull.
+ for (i=0; i < SECTORS; i++)
+ for (j=0; j < SECTORS; j++) {
+
+ cmsVEC3 v;
+
+ pt = &gbd ->Gamut[i][j];
+ ToCartesian(&v, &pt ->p);
+
+ fprintf (fp, "\t\t\t\t\t%g %g %g", v.n[0]+50, v.n[1], v.n[2]);
+
+ if ((j == SECTORS - 1) && (i == SECTORS - 1))
+ fprintf (fp, "]\n");
+ else
+ fprintf (fp, ",\n");
+
+ }
+
+ fprintf (fp, "\t\t\t\t}\n");
+
+
+
+ // fill in the face colors
+ fprintf (fp, "\t\t\t\tcolor Color {\n");
+ fprintf (fp, "\t\t\t\t\tcolor [\n");
+
+ for (i=0; i < SECTORS; i++)
+ for (j=0; j < SECTORS; j++) {
+
+ cmsVEC3 v;
+
+ pt = &gbd ->Gamut[i][j];
+
+
+ ToCartesian(&v, &pt ->p);
+
+
+ if (pt ->Type == GP_EMPTY)
+ fprintf (fp, "\t\t\t\t\t%g %g %g", 0.0, 0.0, 0.0);
+ else
+ if (pt ->Type == GP_MODELED)
+ fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, .5, .5);
+ else {
+ fprintf (fp, "\t\t\t\t\t%g %g %g", 1.0, 1.0, 1.0);
+
+ }
+
+ if ((j == SECTORS - 1) && (i == SECTORS - 1))
+ fprintf (fp, "]\n");
+ else
+ fprintf (fp, ",\n");
+ }
+ fprintf (fp, "\t\t\t}\n");
+
+
+ fprintf (fp, "\t\t\t}\n");
+ fprintf (fp, "\t\t}\n");
+ fprintf (fp, "\t]\n");
+ fprintf (fp, "}\n");
+
+ fclose (fp);
+
+ return TRUE;
+}
+#endif
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c
new file mode 100644
index 0000000000..06742b5ad6
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmstypes.c
@@ -0,0 +1,5564 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Tag Serialization -----------------------------------------------------------------------------
+// This file implements every single tag and tag type as described in the ICC spec. Some types
+// have been deprecated, like ncl and Data. There is no implementation for those types as there
+// are no profiles holding them. The programmer can also extend this list by defining his own types
+// by using the appropiate plug-in. There are three types of plug ins regarding that. First type
+// allows to define new tags using any existing type. Next plug-in type allows to define new types
+// and the third one is very specific: allows to extend the number of elements in the multiprocessing
+// elements special type.
+//--------------------------------------------------------------------------------------------------
+
+// Some broken types
+#define cmsCorbisBrokenXYZtype ((cmsTagTypeSignature) 0x17A505B8)
+#define cmsMonacoBrokenCurveType ((cmsTagTypeSignature) 0x9478ee00)
+
+// This is the linked list that keeps track of the defined types
+typedef struct _cmsTagTypeLinkedList_st {
+
+ cmsTagTypeHandler Handler;
+ struct _cmsTagTypeLinkedList_st* Next;
+
+} _cmsTagTypeLinkedList;
+
+// Some macros to define callbacks.
+#define READ_FN(x) Type_##x##_Read
+#define WRITE_FN(x) Type_##x##_Write
+#define FREE_FN(x) Type_##x##_Free
+#define DUP_FN(x) Type_##x##_Dup
+
+// Helper macro to define a handler. Callbacks do have a fixed naming convention.
+#define TYPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), DUP_FN(x), FREE_FN(x), NULL, 0 }
+
+// Helper macro to define a MPE handler. Callbacks do have a fixed naming convention
+#define TYPE_MPE_HANDLER(t, x) { (t), READ_FN(x), WRITE_FN(x), GenericMPEdup, GenericMPEfree, NULL, 0 }
+
+// Register a new type handler. This routine is shared between normal types and MPE. LinkedList points to the optional list head
+static
+cmsBool RegisterTypesPlugin(cmsContext id, cmsPluginBase* Data, _cmsMemoryClient pos)
+{
+ cmsPluginTagType* Plugin = (cmsPluginTagType*) Data;
+ _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(id, pos);
+ _cmsTagTypeLinkedList *pt;
+
+ // Calling the function with NULL as plug-in would unregister the plug in.
+ if (Data == NULL) {
+
+ // There is no need to set free the memory, as pool is destroyed as a whole.
+ ctx ->TagTypes = NULL;
+ return TRUE;
+ }
+
+ // Registering happens in plug-in memory pool.
+ pt = (_cmsTagTypeLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagTypeLinkedList));
+ if (pt == NULL) return FALSE;
+
+ pt ->Handler = Plugin ->Handler;
+ pt ->Next = ctx ->TagTypes;
+
+ ctx ->TagTypes = pt;
+
+ return TRUE;
+}
+
+// Return handler for a given type or NULL if not found. Shared between normal types and MPE. It first tries the additons
+// made by plug-ins and then the built-in defaults.
+static
+cmsTagTypeHandler* GetHandler(cmsTagTypeSignature sig, _cmsTagTypeLinkedList* PluginLinkedList, _cmsTagTypeLinkedList* DefaultLinkedList)
+{
+ _cmsTagTypeLinkedList* pt;
+
+ for (pt = PluginLinkedList;
+ pt != NULL;
+ pt = pt ->Next) {
+
+ if (sig == pt -> Handler.Signature) return &pt ->Handler;
+ }
+
+ for (pt = DefaultLinkedList;
+ pt != NULL;
+ pt = pt ->Next) {
+
+ if (sig == pt -> Handler.Signature) return &pt ->Handler;
+ }
+
+ return NULL;
+}
+
+
+// Auxiliar to convert UTF-32 to UTF-16 in some cases
+static
+cmsBool _cmsWriteWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, const wchar_t* Array)
+{
+ cmsUInt32Number i;
+
+ _cmsAssert(io != NULL);
+ _cmsAssert(!(Array == NULL && n > 0));
+
+ for (i=0; i < n; i++) {
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Array[i])) return FALSE;
+ }
+
+ return TRUE;
+}
+
+// Auxiliar to read an array of wchar_t
+static
+cmsBool _cmsReadWCharArray(cmsIOHANDLER* io, cmsUInt32Number n, wchar_t* Array)
+{
+ cmsUInt32Number i;
+ cmsUInt16Number tmp;
+
+ _cmsAssert(io != NULL);
+
+ for (i=0; i < n; i++) {
+
+ if (Array != NULL) {
+
+ if (!_cmsReadUInt16Number(io, &tmp)) return FALSE;
+ Array[i] = (wchar_t) tmp;
+ }
+ else {
+ if (!_cmsReadUInt16Number(io, NULL)) return FALSE;
+ }
+
+ }
+ return TRUE;
+}
+
+// To deal with position tables
+typedef cmsBool (* PositionTableEntryFn)(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag);
+
+// Helper function to deal with position tables as decribed in ICC spec 4.3
+// A table of n elements is readed, where first comes n records containing offsets and sizes and
+// then a block containing the data itself. This allows to reuse same data in more than one entry
+static
+cmsBool ReadPositionTable(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ cmsUInt32Number Count,
+ cmsUInt32Number BaseOffset,
+ void *Cargo,
+ PositionTableEntryFn ElementFn)
+{
+ cmsUInt32Number i;
+ cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+ // Let's take the offsets to each element
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ for (i=0; i < Count; i++) {
+
+ if (!_cmsReadUInt32Number(io, &ElementOffsets[i])) goto Error;
+ if (!_cmsReadUInt32Number(io, &ElementSizes[i])) goto Error;
+
+ ElementOffsets[i] += BaseOffset;
+ }
+
+ // Seek to each element and read it
+ for (i=0; i < Count; i++) {
+
+ if (!io -> Seek(io, ElementOffsets[i])) goto Error;
+
+ // This is the reader callback
+ if (!ElementFn(self, io, Cargo, i, ElementSizes[i])) goto Error;
+ }
+
+ // Success
+ if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+ return TRUE;
+
+Error:
+ if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+ return FALSE;
+}
+
+// Same as anterior, but for write position tables
+static
+cmsBool WritePositionTable(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ cmsUInt32Number SizeOfTag,
+ cmsUInt32Number Count,
+ cmsUInt32Number BaseOffset,
+ void *Cargo,
+ PositionTableEntryFn ElementFn)
+{
+ cmsUInt32Number i;
+ cmsUInt32Number DirectoryPos, CurrentPos, Before;
+ cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL;
+
+ // Create table
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(io ->ContextID, Count, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ // Keep starting position of curve offsets
+ DirectoryPos = io ->Tell(io);
+
+ // Write a fake directory to be filled latter on
+ for (i=0; i < Count; i++) {
+
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size
+ }
+
+ // Write each element. Keep track of the size as well.
+ for (i=0; i < Count; i++) {
+
+ Before = io ->Tell(io);
+ ElementOffsets[i] = Before - BaseOffset;
+
+ // Callback to write...
+ if (!ElementFn(self, io, Cargo, i, SizeOfTag)) goto Error;
+
+ // Now the size
+ ElementSizes[i] = io ->Tell(io) - Before;
+ }
+
+ // Write the directory
+ CurrentPos = io ->Tell(io);
+ if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+ for (i=0; i < Count; i++) {
+ if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;
+ if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;
+ }
+
+ if (!io ->Seek(io, CurrentPos)) goto Error;
+
+ if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+ return TRUE;
+
+Error:
+ if (ElementOffsets != NULL) _cmsFree(io ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(io ->ContextID, ElementSizes);
+ return FALSE;
+}
+
+
+// ********************************************************************************
+// Type XYZ. Only one value is allowed
+// ********************************************************************************
+
+//The XYZType contains an array of three encoded values for the XYZ tristimulus
+//values. Tristimulus values must be non-negative. The signed encoding allows for
+//implementation optimizations by minimizing the number of fixed formats.
+
+
+static
+void *Type_XYZ_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsCIEXYZ* xyz;
+
+ *nItems = 0;
+ xyz = (cmsCIEXYZ*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIEXYZ));
+ if (xyz == NULL) return NULL;
+
+ if (!_cmsReadXYZNumber(io, xyz)) {
+ _cmsFree(self ->ContextID, xyz);
+ return NULL;
+ }
+
+ *nItems = 1;
+ return (void*) xyz;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_XYZ_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ return _cmsWriteXYZNumber(io, (cmsCIEXYZ*) Ptr);
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_XYZ_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIEXYZ));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_XYZ_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+static
+cmsTagTypeSignature DecideXYZtype(cmsFloat64Number ICCVersion, const void *Data)
+{
+ return cmsSigXYZType;
+
+ cmsUNUSED_PARAMETER(ICCVersion);
+ cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type chromaticity. Only one value is allowed
+// ********************************************************************************
+// The chromaticity tag type provides basic chromaticity data and type of
+// phosphors or colorants of a monitor to applications and utilities.
+
+static
+void *Type_Chromaticity_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsCIExyYTRIPLE* chrm;
+ cmsUInt16Number nChans, Table;
+
+ *nItems = 0;
+ chrm = (cmsCIExyYTRIPLE*) _cmsMallocZero(self ->ContextID, sizeof(cmsCIExyYTRIPLE));
+ if (chrm == NULL) return NULL;
+
+ if (!_cmsReadUInt16Number(io, &nChans)) goto Error;
+
+ // Let's recover from a bug introduced in early versions of lcms1
+ if (nChans == 0 && SizeOfTag == 32) {
+
+ if (!_cmsReadUInt16Number(io, NULL)) goto Error;
+ if (!_cmsReadUInt16Number(io, &nChans)) goto Error;
+ }
+
+ if (nChans != 3) goto Error;
+
+ if (!_cmsReadUInt16Number(io, &Table)) goto Error;
+
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Red.x)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Red.y)) goto Error;
+
+ chrm ->Red.Y = 1.0;
+
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Green.x)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Green.y)) goto Error;
+
+ chrm ->Green.Y = 1.0;
+
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.x)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &chrm ->Blue.y)) goto Error;
+
+ chrm ->Blue.Y = 1.0;
+
+ *nItems = 1;
+ return (void*) chrm;
+
+Error:
+ _cmsFree(self ->ContextID, (void*) chrm);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool SaveOneChromaticity(cmsFloat64Number x, cmsFloat64Number y, cmsIOHANDLER* io)
+{
+ if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(x))) return FALSE;
+ if (!_cmsWriteUInt32Number(io, _cmsDoubleTo15Fixed16(y))) return FALSE;
+
+ return TRUE;
+}
+
+static
+cmsBool Type_Chromaticity_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsCIExyYTRIPLE* chrm = (cmsCIExyYTRIPLE*) Ptr;
+
+ if (!_cmsWriteUInt16Number(io, 3)) return FALSE; // nChannels
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Table
+
+ if (!SaveOneChromaticity(chrm -> Red.x, chrm -> Red.y, io)) return FALSE;
+ if (!SaveOneChromaticity(chrm -> Green.x, chrm -> Green.y, io)) return FALSE;
+ if (!SaveOneChromaticity(chrm -> Blue.x, chrm -> Blue.y, io)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Chromaticity_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsCIExyYTRIPLE));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Chromaticity_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigColorantOrderType
+// ********************************************************************************
+
+// This is an optional tag which specifies the laydown order in which colorants will
+// be printed on an n-colorant device. The laydown order may be the same as the
+// channel generation order listed in the colorantTableTag or the channel order of a
+// colour space such as CMYK, in which case this tag is not needed. When this is not
+// the case (for example, ink-towers sometimes use the order KCMY), this tag may be
+// used to specify the laydown order of the colorants.
+
+
+static
+void *Type_ColorantOrderType_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt8Number* ColorantOrder;
+ cmsUInt32Number Count;
+
+ *nItems = 0;
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+ if (Count > cmsMAXCHANNELS) return NULL;
+
+ ColorantOrder = (cmsUInt8Number*) _cmsCalloc(self ->ContextID, cmsMAXCHANNELS, sizeof(cmsUInt8Number));
+ if (ColorantOrder == NULL) return NULL;
+
+ // We use FF as end marker
+ memset(ColorantOrder, 0xFF, cmsMAXCHANNELS * sizeof(cmsUInt8Number));
+
+ if (io ->Read(io, ColorantOrder, sizeof(cmsUInt8Number), Count) != Count) {
+
+ _cmsFree(self ->ContextID, (void*) ColorantOrder);
+ return NULL;
+ }
+
+ *nItems = 1;
+ return (void*) ColorantOrder;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_ColorantOrderType_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt8Number* ColorantOrder = (cmsUInt8Number*) Ptr;
+ cmsUInt32Number i, sz, Count;
+
+ // Get the length
+ for (Count=i=0; i < cmsMAXCHANNELS; i++) {
+ if (ColorantOrder[i] != 0xFF) Count++;
+ }
+
+ if (!_cmsWriteUInt32Number(io, Count)) return FALSE;
+
+ sz = Count * sizeof(cmsUInt8Number);
+ if (!io -> Write(io, sz, ColorantOrder)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_ColorantOrderType_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, cmsMAXCHANNELS * sizeof(cmsUInt8Number));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_ColorantOrderType_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigS15Fixed16ArrayType
+// ********************************************************************************
+// This type represents an array of generic 4-byte/32-bit fixed point quantity.
+// The number of values is determined from the size of the tag.
+
+static
+void *Type_S15Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsFloat64Number* array_double;
+ cmsUInt32Number i, n;
+
+ *nItems = 0;
+ n = SizeOfTag / sizeof(cmsUInt32Number);
+ array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));
+ if (array_double == NULL) return NULL;
+
+ for (i=0; i < n; i++) {
+
+ if (!_cmsRead15Fixed16Number(io, &array_double[i])) {
+
+ _cmsFree(self ->ContextID, array_double);
+ return NULL;
+ }
+ }
+
+ *nItems = n;
+ return (void*) array_double;
+}
+
+static
+cmsBool Type_S15Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;
+ cmsUInt32Number i;
+
+ for (i=0; i < nItems; i++) {
+
+ if (!_cmsWrite15Fixed16Number(io, Value[i])) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_S15Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));
+}
+
+
+static
+void Type_S15Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigU16Fixed16ArrayType
+// ********************************************************************************
+// This type represents an array of generic 4-byte/32-bit quantity.
+// The number of values is determined from the size of the tag.
+
+
+static
+void *Type_U16Fixed16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsFloat64Number* array_double;
+ cmsUInt32Number v;
+ cmsUInt32Number i, n;
+
+ *nItems = 0;
+ n = SizeOfTag / sizeof(cmsUInt32Number);
+ array_double = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, n, sizeof(cmsFloat64Number));
+ if (array_double == NULL) return NULL;
+
+ for (i=0; i < n; i++) {
+
+ if (!_cmsReadUInt32Number(io, &v)) {
+ _cmsFree(self ->ContextID, (void*) array_double);
+ return NULL;
+ }
+
+ // Convert to cmsFloat64Number
+ array_double[i] = (cmsFloat64Number) (v / 65536.0);
+ }
+
+ *nItems = n;
+ return (void*) array_double;
+}
+
+static
+cmsBool Type_U16Fixed16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsFloat64Number* Value = (cmsFloat64Number*) Ptr;
+ cmsUInt32Number i;
+
+ for (i=0; i < nItems; i++) {
+
+ cmsUInt32Number v = (cmsUInt32Number) floor(Value[i]*65536.0 + 0.5);
+
+ if (!_cmsWriteUInt32Number(io, v)) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_U16Fixed16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsFloat64Number));
+}
+
+static
+void Type_U16Fixed16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigSignatureType
+// ********************************************************************************
+//
+// The signatureType contains a four-byte sequence, Sequences of less than four
+// characters are padded at the end with spaces, 20h.
+// Typically this type is used for registered tags that can be displayed on many
+// development systems as a sequence of four characters.
+
+static
+void *Type_Signature_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsSignature* SigPtr = (cmsSignature*) _cmsMalloc(self ->ContextID, sizeof(cmsSignature));
+ if (SigPtr == NULL) return NULL;
+
+ if (!_cmsReadUInt32Number(io, SigPtr)) return NULL;
+ *nItems = 1;
+
+ return SigPtr;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_Signature_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsSignature* SigPtr = (cmsSignature*) Ptr;
+
+ return _cmsWriteUInt32Number(io, *SigPtr);
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Signature_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, n * sizeof(cmsSignature));
+}
+
+static
+void Type_Signature_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigTextType
+// ********************************************************************************
+//
+// The textType is a simple text structure that contains a 7-bit ASCII text string.
+// The length of the string is obtained by subtracting 8 from the element size portion
+// of the tag itself. This string must be terminated with a 00h byte.
+
+static
+void *Type_Text_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ char* Text = NULL;
+ cmsMLU* mlu = NULL;
+
+ // Create a container
+ mlu = cmsMLUalloc(self ->ContextID, 1);
+ if (mlu == NULL) return NULL;
+
+ *nItems = 0;
+
+ // We need to store the "\0" at the end, so +1
+ if (SizeOfTag == UINT_MAX) goto Error;
+
+ Text = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);
+ if (Text == NULL) goto Error;
+
+ if (io -> Read(io, Text, sizeof(char), SizeOfTag) != SizeOfTag) goto Error;
+
+ // Make sure text is properly ended
+ Text[SizeOfTag] = 0;
+ *nItems = 1;
+
+ // Keep the result
+ if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;
+
+ _cmsFree(self ->ContextID, Text);
+ return (void*) mlu;
+
+Error:
+ if (mlu != NULL)
+ cmsMLUfree(mlu);
+ if (Text != NULL)
+ _cmsFree(self ->ContextID, Text);
+
+ return NULL;
+}
+
+// The conversion implies to choose a language. So, we choose the actual language.
+static
+cmsBool Type_Text_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsMLU* mlu = (cmsMLU*) Ptr;
+ cmsUInt32Number size;
+ cmsBool rc;
+ char* Text;
+
+ // Get the size of the string. Note there is an extra "\0" at the end
+ size = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);
+ if (size == 0) return FALSE; // Cannot be zero!
+
+ // Create memory
+ Text = (char*) _cmsMalloc(self ->ContextID, size);
+ if (Text == NULL) return FALSE;
+
+ cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, size);
+
+ // Write it, including separator
+ rc = io ->Write(io, size, Text);
+
+ _cmsFree(self ->ContextID, Text);
+ return rc;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_Text_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_Text_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsMLU* mlu = (cmsMLU*) Ptr;
+ cmsMLUfree(mlu);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+cmsTagTypeSignature DecideTextType(cmsFloat64Number ICCVersion, const void *Data)
+{
+ if (ICCVersion >= 4.0)
+ return cmsSigMultiLocalizedUnicodeType;
+
+ return cmsSigTextType;
+
+ cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDataType
+// ********************************************************************************
+
+// General purpose data type
+static
+void *Type_Data_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsICCData* BinData;
+ cmsUInt32Number LenOfData;
+
+ *nItems = 0;
+
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+
+ LenOfData = SizeOfTag - sizeof(cmsUInt32Number);
+ if (LenOfData > INT_MAX) return NULL;
+
+ BinData = (cmsICCData*) _cmsMalloc(self ->ContextID, sizeof(cmsICCData) + LenOfData - 1);
+ if (BinData == NULL) return NULL;
+
+ BinData ->len = LenOfData;
+ if (!_cmsReadUInt32Number(io, &BinData->flag)) {
+ _cmsFree(self ->ContextID, BinData);
+ return NULL;
+ }
+
+ if (io -> Read(io, BinData ->data, sizeof(cmsUInt8Number), LenOfData) != LenOfData) {
+
+ _cmsFree(self ->ContextID, BinData);
+ return NULL;
+ }
+
+ *nItems = 1;
+
+ return (void*) BinData;
+}
+
+
+static
+cmsBool Type_Data_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsICCData* BinData = (cmsICCData*) Ptr;
+
+ if (!_cmsWriteUInt32Number(io, BinData ->flag)) return FALSE;
+
+ return io ->Write(io, BinData ->len, BinData ->data);
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Data_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ cmsICCData* BinData = (cmsICCData*) Ptr;
+
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCData) + BinData ->len - 1);
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Data_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigTextDescriptionType
+// ********************************************************************************
+
+static
+void *Type_Text_Description_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ char* Text = NULL;
+ cmsMLU* mlu = NULL;
+ cmsUInt32Number AsciiCount;
+ cmsUInt32Number i, UnicodeCode, UnicodeCount;
+ cmsUInt16Number ScriptCodeCode, Dummy;
+ cmsUInt8Number ScriptCodeCount;
+
+ *nItems = 0;
+
+ // One dword should be there
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+
+ // Read len of ASCII
+ if (!_cmsReadUInt32Number(io, &AsciiCount)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ // Check for size
+ if (SizeOfTag < AsciiCount) return NULL;
+
+ // All seems Ok, allocate the container
+ mlu = cmsMLUalloc(self ->ContextID, 1);
+ if (mlu == NULL) return NULL;
+
+ // As many memory as size of tag
+ Text = (char*) _cmsMalloc(self ->ContextID, AsciiCount + 1);
+ if (Text == NULL) goto Error;
+
+ // Read it
+ if (io ->Read(io, Text, sizeof(char), AsciiCount) != AsciiCount) goto Error;
+ SizeOfTag -= AsciiCount;
+
+ // Make sure there is a terminator
+ Text[AsciiCount] = 0;
+
+ // Set the MLU entry. From here we can be tolerant to wrong types
+ if (!cmsMLUsetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text)) goto Error;
+ _cmsFree(self ->ContextID, (void*) Text);
+ Text = NULL;
+
+ // Skip Unicode code
+ if (SizeOfTag < 2* sizeof(cmsUInt32Number)) goto Done;
+ if (!_cmsReadUInt32Number(io, &UnicodeCode)) goto Done;
+ if (!_cmsReadUInt32Number(io, &UnicodeCount)) goto Done;
+ SizeOfTag -= 2* sizeof(cmsUInt32Number);
+
+ if (SizeOfTag < UnicodeCount*sizeof(cmsUInt16Number)) goto Done;
+
+ for (i=0; i < UnicodeCount; i++) {
+ if (!io ->Read(io, &Dummy, sizeof(cmsUInt16Number), 1)) goto Done;
+ }
+ SizeOfTag -= UnicodeCount*sizeof(cmsUInt16Number);
+
+ // Skip ScriptCode code if present. Some buggy profiles does have less
+ // data that stricttly required. We need to skip it as this type may come
+ // embedded in other types.
+
+ if (SizeOfTag >= sizeof(cmsUInt16Number) + sizeof(cmsUInt8Number) + 67) {
+
+ if (!_cmsReadUInt16Number(io, &ScriptCodeCode)) goto Done;
+ if (!_cmsReadUInt8Number(io, &ScriptCodeCount)) goto Done;
+
+ // Skip rest of tag
+ for (i=0; i < 67; i++) {
+ if (!io ->Read(io, &Dummy, sizeof(cmsUInt8Number), 1)) goto Error;
+ }
+ }
+
+Done:
+
+ *nItems = 1;
+ return mlu;
+
+Error:
+ if (Text) _cmsFree(self ->ContextID, (void*) Text);
+ if (mlu) cmsMLUfree(mlu);
+ return NULL;
+}
+
+
+// This tag can come IN UNALIGNED SIZE. In order to prevent issues, we force zeros on description to align it
+static
+cmsBool Type_Text_Description_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsMLU* mlu = (cmsMLU*) Ptr;
+ char *Text = NULL;
+ wchar_t *Wide = NULL;
+ cmsUInt32Number len, len_aligned, len_filler_alignment;
+ cmsBool rc = FALSE;
+ char Filler[68];
+
+ // Used below for writting zeroes
+ memset(Filler, 0, sizeof(Filler));
+
+ // Get the len of string
+ len = cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, NULL, 0);
+
+ // From ICC3.4: It has been found that textDescriptionType can contain misaligned data
+ //(see clause 4.1 for the definition of “aligned?. Because the Unicode language
+ // code and Unicode count immediately follow the ASCII description, their
+ // alignment is not correct if the ASCII count is not a multiple of four. The
+ // ScriptCode code is misaligned when the ASCII count is odd. Profile reading and
+ // writing software must be written carefully in order to handle these alignment
+ // problems.
+
+ // Compute an aligned size
+ len_aligned = _cmsALIGNLONG(len);
+ len_filler_alignment = len_aligned - len;
+
+ // Null strings
+ if (len <= 0) {
+
+ Text = (char*) _cmsDupMem(self ->ContextID, "", sizeof(char));
+ Wide = (wchar_t*) _cmsDupMem(self ->ContextID, L"", sizeof(wchar_t));
+ }
+ else {
+ // Create independent buffers
+ Text = (char*) _cmsCalloc(self ->ContextID, len, sizeof(char));
+ if (Text == NULL) goto Error;
+
+ Wide = (wchar_t*) _cmsCalloc(self ->ContextID, len, sizeof(wchar_t));
+ if (Wide == NULL) goto Error;
+
+ // Get both representations.
+ cmsMLUgetASCII(mlu, cmsNoLanguage, cmsNoCountry, Text, len * sizeof(char));
+ cmsMLUgetWide(mlu, cmsNoLanguage, cmsNoCountry, Wide, len * sizeof(wchar_t));
+ }
+
+ // * cmsUInt32Number count; * Description length
+ // * cmsInt8Number desc[count] * NULL terminated ascii string
+ // * cmsUInt32Number ucLangCode; * UniCode language code
+ // * cmsUInt32Number ucCount; * UniCode description length
+ // * cmsInt16Number ucDesc[ucCount];* The UniCode description
+ // * cmsUInt16Number scCode; * ScriptCode code
+ // * cmsUInt8Number scCount; * ScriptCode count
+ // * cmsInt8Number scDesc[67]; * ScriptCode Description
+
+ if (!_cmsWriteUInt32Number(io, len_aligned)) goto Error;
+ if (!io ->Write(io, len, Text)) goto Error;
+ if (!io ->Write(io, len_filler_alignment, Filler)) goto Error;
+
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error; // ucLanguageCode
+
+ // This part is tricky: we need an aligned tag size, and the ScriptCode part
+ // takes 70 bytes, so we need 2 extra bytes to do the alignment
+
+ if (!_cmsWriteUInt32Number(io, len_aligned+1)) goto Error;
+
+ // Note that in some compilers sizeof(cmsUInt16Number) != sizeof(wchar_t)
+ if (!_cmsWriteWCharArray(io, len, Wide)) goto Error;
+ if (!_cmsWriteUInt16Array(io, len_filler_alignment+1, (cmsUInt16Number*) Filler)) goto Error;
+
+ // ScriptCode Code & count (unused)
+ if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+ if (!_cmsWriteUInt8Number(io, 0)) goto Error;
+
+ if (!io ->Write(io, 67, Filler)) goto Error;
+
+ rc = TRUE;
+
+Error:
+ if (Text) _cmsFree(self ->ContextID, Text);
+ if (Wide) _cmsFree(self ->ContextID, Wide);
+
+ return rc;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_Text_Description_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_Text_Description_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsMLU* mlu = (cmsMLU*) Ptr;
+
+ cmsMLUfree(mlu);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+cmsTagTypeSignature DecideTextDescType(cmsFloat64Number ICCVersion, const void *Data)
+{
+ if (ICCVersion >= 4.0)
+ return cmsSigMultiLocalizedUnicodeType;
+
+ return cmsSigTextDescriptionType;
+
+ cmsUNUSED_PARAMETER(Data);
+}
+
+
+// ********************************************************************************
+// Type cmsSigCurveType
+// ********************************************************************************
+
+static
+void *Type_Curve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt32Number Count;
+ cmsToneCurve* NewGamma;
+
+ *nItems = 0;
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+ switch (Count) {
+
+ case 0: // Linear.
+ {
+ cmsFloat64Number SingleGamma = 1.0;
+
+ NewGamma = cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
+ if (!NewGamma) return NULL;
+ *nItems = 1;
+ return NewGamma;
+ }
+
+ case 1: // Specified as the exponent of gamma function
+ {
+ cmsUInt16Number SingleGammaFixed;
+ cmsFloat64Number SingleGamma;
+
+ if (!_cmsReadUInt16Number(io, &SingleGammaFixed)) return NULL;
+ SingleGamma = _cms8Fixed8toDouble(SingleGammaFixed);
+
+ *nItems = 1;
+ return cmsBuildParametricToneCurve(self ->ContextID, 1, &SingleGamma);
+ }
+
+ default: // Curve
+
+ if (Count > 0x7FFF)
+ return NULL; // This is to prevent bad guys for doing bad things
+
+ NewGamma = cmsBuildTabulatedToneCurve16(self ->ContextID, Count, NULL);
+ if (!NewGamma) return NULL;
+
+ if (!_cmsReadUInt16Array(io, Count, NewGamma -> Table16)) return NULL;
+
+ *nItems = 1;
+ return NewGamma;
+ }
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_Curve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsToneCurve* Curve = (cmsToneCurve*) Ptr;
+
+ if (Curve ->nSegments == 1 && Curve ->Segments[0].Type == 1) {
+
+ // Single gamma, preserve number
+ cmsUInt16Number SingleGammaFixed = _cmsDoubleTo8Fixed8(Curve ->Segments[0].Params[0]);
+
+ if (!_cmsWriteUInt32Number(io, 1)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, SingleGammaFixed)) return FALSE;
+ return TRUE;
+
+ }
+
+ if (!_cmsWriteUInt32Number(io, Curve ->nEntries)) return FALSE;
+ return _cmsWriteUInt16Array(io, Curve ->nEntries, Curve ->Table16);
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Curve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_Curve_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsToneCurve* gamma = (cmsToneCurve*) Ptr;
+
+ cmsFreeToneCurve(gamma);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigParametricCurveType
+// ********************************************************************************
+
+
+// Decide which curve type to use on writting
+static
+cmsTagTypeSignature DecideCurveType(cmsFloat64Number ICCVersion, const void *Data)
+{
+ cmsToneCurve* Curve = (cmsToneCurve*) Data;
+
+ if (ICCVersion < 4.0) return cmsSigCurveType;
+ if (Curve ->nSegments != 1) return cmsSigCurveType; // Only 1-segment curves can be saved as parametric
+ if (Curve ->Segments[0].Type < 0) return cmsSigCurveType; // Only non-inverted curves
+ if (Curve ->Segments[0].Type > 5) return cmsSigCurveType; // Only ICC parametric curves
+
+ return cmsSigParametricCurveType;
+}
+
+static
+void *Type_ParametricCurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ static const int ParamsByType[] = { 1, 3, 4, 5, 7 };
+ cmsFloat64Number Params[10];
+ cmsUInt16Number Type;
+ int i, n;
+ cmsToneCurve* NewGamma;
+
+ if (!_cmsReadUInt16Number(io, &Type)) return NULL;
+ if (!_cmsReadUInt16Number(io, NULL)) return NULL; // Reserved
+
+ if (Type > 4) {
+
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown parametric curve type '%d'", Type);
+ return NULL;
+ }
+
+ memset(Params, 0, sizeof(Params));
+ n = ParamsByType[Type];
+
+ for (i=0; i < n; i++) {
+
+ if (!_cmsRead15Fixed16Number(io, &Params[i])) return NULL;
+ }
+
+ NewGamma = cmsBuildParametricToneCurve(self ->ContextID, Type+1, Params);
+
+ *nItems = 1;
+ return NewGamma;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_ParametricCurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsToneCurve* Curve = (cmsToneCurve*) Ptr;
+ int i, nParams, typen;
+ static const int ParamsByType[] = { 0, 1, 3, 4, 5, 7 };
+
+ typen = Curve -> Segments[0].Type;
+
+ if (Curve ->nSegments > 1 || typen < 1) {
+
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Multisegment or Inverted parametric curves cannot be written");
+ return FALSE;
+ }
+
+ if (typen > 5) {
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported parametric curve");
+ return FALSE;
+ }
+
+ nParams = ParamsByType[typen];
+
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) (Curve ->Segments[0].Type - 1))) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE; // Reserved
+
+ for (i=0; i < nParams; i++) {
+
+ if (!_cmsWrite15Fixed16Number(io, Curve -> Segments[0].Params[i])) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_ParametricCurve_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsDupToneCurve((cmsToneCurve*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ParametricCurve_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsToneCurve* gamma = (cmsToneCurve*) Ptr;
+
+ cmsFreeToneCurve(gamma);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDateTimeType
+// ********************************************************************************
+
+// A 12-byte value representation of the time and date, where the byte usage is assigned
+// as specified in table 1. The actual values are encoded as 16-bit unsigned integers
+// (uInt16Number - see 5.1.6).
+//
+// All the dateTimeNumber values in a profile shall be in Coordinated Universal Time
+// (UTC, also known as GMT or ZULU Time). Profile writers are required to convert local
+// time to UTC when setting these values. Programmes that display these values may show
+// the dateTimeNumber as UTC, show the equivalent local time (at current locale), or
+// display both UTC and local versions of the dateTimeNumber.
+
+static
+void *Type_DateTime_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsDateTimeNumber timestamp;
+ struct tm * NewDateTime;
+
+ *nItems = 0;
+ NewDateTime = (struct tm*) _cmsMalloc(self ->ContextID, sizeof(struct tm));
+ if (NewDateTime == NULL) return NULL;
+
+ if (io->Read(io, &timestamp, sizeof(cmsDateTimeNumber), 1) != 1) return NULL;
+
+ _cmsDecodeDateTimeNumber(&timestamp, NewDateTime);
+
+ *nItems = 1;
+ return NewDateTime;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_DateTime_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ struct tm * DateTime = (struct tm*) Ptr;
+ cmsDateTimeNumber timestamp;
+
+ _cmsEncodeDateTimeNumber(&timestamp, DateTime);
+ if (!io ->Write(io, sizeof(cmsDateTimeNumber), &timestamp)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_DateTime_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(struct tm));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_DateTime_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+
+// ********************************************************************************
+// Type icMeasurementType
+// ********************************************************************************
+
+/*
+The measurementType information refers only to the internal profile data and is
+meant to provide profile makers an alternative to the default measurement
+specifications.
+*/
+
+static
+void *Type_Measurement_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsICCMeasurementConditions mc;
+
+
+ memset(&mc, 0, sizeof(mc));
+
+ if (!_cmsReadUInt32Number(io, &mc.Observer)) return NULL;
+ if (!_cmsReadXYZNumber(io, &mc.Backing)) return NULL;
+ if (!_cmsReadUInt32Number(io, &mc.Geometry)) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &mc.Flare)) return NULL;
+ if (!_cmsReadUInt32Number(io, &mc.IlluminantType)) return NULL;
+
+ *nItems = 1;
+ return _cmsDupMem(self ->ContextID, &mc, sizeof(cmsICCMeasurementConditions));
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_Measurement_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsICCMeasurementConditions* mc =(cmsICCMeasurementConditions*) Ptr;
+
+ if (!_cmsWriteUInt32Number(io, mc->Observer)) return FALSE;
+ if (!_cmsWriteXYZNumber(io, &mc->Backing)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, mc->Geometry)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, mc->Flare)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, mc->IlluminantType)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_Measurement_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsICCMeasurementConditions));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_Measurement_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigMultiLocalizedUnicodeType
+// ********************************************************************************
+//
+// Do NOT trust SizeOfTag as there is an issue on the definition of profileSequenceDescTag. See the TechNote from
+// Max Derhak and Rohit Patil about this: basically the size of the string table should be guessed and cannot be
+// taken from the size of tag if this tag is embedded as part of bigger structures (profileSequenceDescTag, for instance)
+//
+
+static
+void *Type_MLU_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsMLU* mlu;
+ cmsUInt32Number Count, RecLen, NumOfWchar;
+ cmsUInt32Number SizeOfHeader;
+ cmsUInt32Number Len, Offset;
+ cmsUInt32Number i;
+ wchar_t* Block;
+ cmsUInt32Number BeginOfThisString, EndOfThisString, LargestPosition;
+
+ *nItems = 0;
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+ if (!_cmsReadUInt32Number(io, &RecLen)) return NULL;
+
+ if (RecLen != 12) {
+
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "multiLocalizedUnicodeType of len != 12 is not supported.");
+ return NULL;
+ }
+
+ mlu = cmsMLUalloc(self ->ContextID, Count);
+ if (mlu == NULL) return NULL;
+
+ mlu ->UsedEntries = Count;
+
+ SizeOfHeader = 12 * Count + sizeof(_cmsTagBase);
+ LargestPosition = 0;
+
+ for (i=0; i < Count; i++) {
+
+ if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Language)) goto Error;
+ if (!_cmsReadUInt16Number(io, &mlu ->Entries[i].Country)) goto Error;
+
+ // Now deal with Len and offset.
+ if (!_cmsReadUInt32Number(io, &Len)) goto Error;
+ if (!_cmsReadUInt32Number(io, &Offset)) goto Error;
+
+ // Check for overflow
+ if (Offset < (SizeOfHeader + 8)) goto Error;
+
+ // True begin of the string
+ BeginOfThisString = Offset - SizeOfHeader - 8;
+
+ // Ajust to wchar_t elements
+ mlu ->Entries[i].Len = (Len * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+ mlu ->Entries[i].StrW = (BeginOfThisString * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+
+ // To guess maximum size, add offset + len
+ EndOfThisString = BeginOfThisString + Len;
+ if (EndOfThisString > LargestPosition)
+ LargestPosition = EndOfThisString;
+ }
+
+ // Now read the remaining of tag and fill all strings. Substract the directory
+ SizeOfTag = (LargestPosition * sizeof(wchar_t)) / sizeof(cmsUInt16Number);
+ if (SizeOfTag == 0)
+ {
+ Block = NULL;
+ NumOfWchar = 0;
+
+ }
+ else
+ {
+ Block = (wchar_t*) _cmsMalloc(self ->ContextID, SizeOfTag);
+ if (Block == NULL) goto Error;
+ NumOfWchar = SizeOfTag / sizeof(wchar_t);
+ if (!_cmsReadWCharArray(io, NumOfWchar, Block)) goto Error;
+ }
+
+ mlu ->MemPool = Block;
+ mlu ->PoolSize = SizeOfTag;
+ mlu ->PoolUsed = SizeOfTag;
+
+ *nItems = 1;
+ return (void*) mlu;
+
+Error:
+ if (mlu) cmsMLUfree(mlu);
+ return NULL;
+}
+
+static
+cmsBool Type_MLU_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsMLU* mlu =(cmsMLU*) Ptr;
+ cmsUInt32Number HeaderSize;
+ cmsUInt32Number Len, Offset;
+ int i;
+
+ if (Ptr == NULL) {
+
+ // Empty placeholder
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 12)) return FALSE;
+ return TRUE;
+ }
+
+ if (!_cmsWriteUInt32Number(io, mlu ->UsedEntries)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 12)) return FALSE;
+
+ HeaderSize = 12 * mlu ->UsedEntries + sizeof(_cmsTagBase);
+
+ for (i=0; i < mlu ->UsedEntries; i++) {
+
+ Len = mlu ->Entries[i].Len;
+ Offset = mlu ->Entries[i].StrW;
+
+ Len = (Len * sizeof(cmsUInt16Number)) / sizeof(wchar_t);
+ Offset = (Offset * sizeof(cmsUInt16Number)) / sizeof(wchar_t) + HeaderSize + 8;
+
+ if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Language)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, mlu ->Entries[i].Country)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, Len)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, Offset)) return FALSE;
+ }
+
+ if (!_cmsWriteWCharArray(io, mlu ->PoolUsed / sizeof(wchar_t), (wchar_t*) mlu ->MemPool)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_MLU_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_MLU_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsMLUfree((cmsMLU*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigLut8Type
+// ********************************************************************************
+
+// Decide which LUT type to use on writting
+static
+cmsTagTypeSignature DecideLUTtypeA2B(cmsFloat64Number ICCVersion, const void *Data)
+{
+ cmsPipeline* Lut = (cmsPipeline*) Data;
+
+ if (ICCVersion < 4.0) {
+ if (Lut ->SaveAs8Bits) return cmsSigLut8Type;
+ return cmsSigLut16Type;
+ }
+ else {
+ return cmsSigLutAtoBType;
+ }
+}
+
+static
+cmsTagTypeSignature DecideLUTtypeB2A(cmsFloat64Number ICCVersion, const void *Data)
+{
+ cmsPipeline* Lut = (cmsPipeline*) Data;
+
+ if (ICCVersion < 4.0) {
+ if (Lut ->SaveAs8Bits) return cmsSigLut8Type;
+ return cmsSigLut16Type;
+ }
+ else {
+ return cmsSigLutBtoAType;
+ }
+}
+
+/*
+This structure represents a colour transform using tables of 8-bit precision.
+This type contains four processing elements: a 3 by 3 matrix (which shall be
+the identity matrix unless the input colour space is XYZ), a set of one dimensional
+input tables, a multidimensional lookup table, and a set of one dimensional output
+tables. Data is processed using these elements via the following sequence:
+(matrix) -> (1d input tables) -> (multidimensional lookup table - CLUT) -> (1d output tables)
+
+Byte Position Field Length (bytes) Content Encoded as...
+8 1 Number of Input Channels (i) uInt8Number
+9 1 Number of Output Channels (o) uInt8Number
+10 1 Number of CLUT grid points (identical for each side) (g) uInt8Number
+11 1 Reserved for padding (fill with 00h)
+
+12..15 4 Encoded e00 parameter s15Fixed16Number
+*/
+
+
+// Read 8 bit tables as gamma functions
+static
+cmsBool Read8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels)
+{
+ cmsUInt8Number* Temp = NULL;
+ int i, j;
+ cmsToneCurve* Tables[cmsMAXCHANNELS];
+
+ if (nChannels > cmsMAXCHANNELS) return FALSE;
+ if (nChannels <= 0) return FALSE;
+
+ memset(Tables, 0, sizeof(Tables));
+
+ Temp = (cmsUInt8Number*) _cmsMalloc(ContextID, 256);
+ if (Temp == NULL) return FALSE;
+
+ for (i=0; i < nChannels; i++) {
+ Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, 256, NULL);
+ if (Tables[i] == NULL) goto Error;
+ }
+
+ for (i=0; i < nChannels; i++) {
+
+ if (io ->Read(io, Temp, 256, 1) != 1) goto Error;
+
+ for (j=0; j < 256; j++)
+ Tables[i]->Table16[j] = (cmsUInt16Number) FROM_8_TO_16(Temp[j]);
+ }
+
+ _cmsFree(ContextID, Temp);
+ Temp = NULL;
+
+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+ goto Error;
+
+ for (i=0; i < nChannels; i++)
+ cmsFreeToneCurve(Tables[i]);
+
+ return TRUE;
+
+Error:
+ for (i=0; i < nChannels; i++) {
+ if (Tables[i]) cmsFreeToneCurve(Tables[i]);
+ }
+
+ if (Temp) _cmsFree(ContextID, Temp);
+ return FALSE;
+}
+
+
+static
+cmsBool Write8bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsUInt32Number n, _cmsStageToneCurvesData* Tables)
+{
+ int j;
+ cmsUInt32Number i;
+ cmsUInt8Number val;
+
+ for (i=0; i < n; i++) {
+
+ if (Tables) {
+
+ // Usual case of identity curves
+ if ((Tables ->TheCurves[i]->nEntries == 2) &&
+ (Tables->TheCurves[i]->Table16[0] == 0) &&
+ (Tables->TheCurves[i]->Table16[1] == 65535)) {
+
+ for (j=0; j < 256; j++) {
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) j)) return FALSE;
+ }
+ }
+ else
+ if (Tables ->TheCurves[i]->nEntries != 256) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "LUT8 needs 256 entries on prelinearization");
+ return FALSE;
+ }
+ else
+ for (j=0; j < 256; j++) {
+
+ if (Tables != NULL)
+ val = (cmsUInt8Number) FROM_16_TO_8(Tables->TheCurves[i]->Table16[j]);
+ else
+ val = (cmsUInt8Number) j;
+
+ if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+
+// Check overflow
+static
+cmsUInt32Number uipow(cmsUInt32Number n, cmsUInt32Number a, cmsUInt32Number b)
+{
+ cmsUInt32Number rv = 1, rc;
+
+ if (a == 0) return 0;
+ if (n == 0) return 0;
+
+ for (; b > 0; b--) {
+
+ rv *= a;
+
+ // Check for overflow
+ if (rv > UINT_MAX / a) return (cmsUInt32Number) -1;
+
+ }
+
+ rc = rv * n;
+
+ if (rv != rc / n) return (cmsUInt32Number) -1;
+ return rc;
+}
+
+
+// That will create a MPE LUT with Matrix, pre tables, CLUT and post tables.
+// 8 bit lut may be scaled easely to v4 PCS, but we need also to properly adjust
+// PCS on BToAxx tags and AtoB if abstract. We need to fix input direction.
+
+static
+void *Type_LUT8_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+ cmsUInt8Number* Temp = NULL;
+ cmsPipeline* NewLUT = NULL;
+ cmsUInt32Number nTabSize, i;
+ cmsFloat64Number Matrix[3*3];
+
+ *nItems = 0;
+
+ if (!_cmsReadUInt8Number(io, &InputChannels)) goto Error;
+ if (!_cmsReadUInt8Number(io, &OutputChannels)) goto Error;
+ if (!_cmsReadUInt8Number(io, &CLUTpoints)) goto Error;
+
+ if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least
+
+ // Padding
+ if (!_cmsReadUInt8Number(io, NULL)) goto Error;
+
+ // Do some checking
+ if (InputChannels > cmsMAXCHANNELS) goto Error;
+ if (OutputChannels > cmsMAXCHANNELS) goto Error;
+
+ // Allocates an empty Pipeline
+ NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);
+ if (NewLUT == NULL) goto Error;
+
+ // Read the Matrix
+ if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error;
+
+
+ // Only operates if not identity...
+ if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_BEGIN, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+ goto Error;
+ }
+
+ // Get input tables
+ if (!Read8bitTables(self ->ContextID, io, NewLUT, InputChannels)) goto Error;
+
+ // Get 3D CLUT. Check the overflow....
+ nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
+ if (nTabSize > 0) {
+
+ cmsUInt16Number *PtrW, *T;
+
+ PtrW = T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
+ if (T == NULL) goto Error;
+
+ Temp = (cmsUInt8Number*) _cmsMalloc(self ->ContextID, nTabSize);
+ if (Temp == NULL) {
+ _cmsFree(self ->ContextID, T);
+ goto Error;
+ }
+
+ if (io ->Read(io, Temp, nTabSize, 1) != 1) {
+ _cmsFree(self ->ContextID, T);
+ _cmsFree(self ->ContextID, Temp);
+ goto Error;
+ }
+
+ for (i = 0; i < nTabSize; i++) {
+
+ *PtrW++ = FROM_8_TO_16(Temp[i]);
+ }
+ _cmsFree(self ->ContextID, Temp);
+ Temp = NULL;
+
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T)))
+ goto Error;
+ _cmsFree(self ->ContextID, T);
+ }
+
+
+ // Get output tables
+ if (!Read8bitTables(self ->ContextID, io, NewLUT, OutputChannels)) goto Error;
+
+ *nItems = 1;
+ return NewLUT;
+
+Error:
+ if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// We only allow a specific MPE structure: Matrix plus prelin, plus clut, plus post-lin.
+static
+cmsBool Type_LUT8_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt32Number j, nTabSize;
+ cmsUInt8Number val;
+ cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
+ cmsStage* mpe;
+ _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
+ _cmsStageMatrixData* MatMPE = NULL;
+ _cmsStageCLutData* clut = NULL;
+ int clutPoints;
+
+ // Disassemble the LUT into components.
+ mpe = NewLUT -> Elements;
+ if (mpe ->Type == cmsSigMatrixElemType) {
+
+ MatMPE = (_cmsStageMatrixData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+ if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+ PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+ if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {
+ clut = (_cmsStageCLutData*) mpe -> Data;
+ mpe = mpe ->Next;
+ }
+
+ if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+ PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+ // That should be all
+ if (mpe != NULL) {
+ cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT8");
+ return FALSE;
+ }
+
+
+ if (clut == NULL)
+ clutPoints = 0;
+ else
+ clutPoints = clut->Params->nSamples[0];
+
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->InputChannels)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) NewLUT ->OutputChannels)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding
+
+
+ if (MatMPE != NULL) {
+
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;
+
+ }
+ else {
+
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ }
+
+ // The prelinearization table
+ if (!Write8bitTables(self ->ContextID, io, NewLUT ->InputChannels, PreMPE)) return FALSE;
+
+ nTabSize = uipow(NewLUT->OutputChannels, clutPoints, NewLUT ->InputChannels);
+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+ if (nTabSize > 0) {
+
+ // The 3D CLUT.
+ if (clut != NULL) {
+
+ for (j=0; j < nTabSize; j++) {
+
+ val = (cmsUInt8Number) FROM_16_TO_8(clut ->Tab.T[j]);
+ if (!_cmsWriteUInt8Number(io, val)) return FALSE;
+ }
+ }
+ }
+
+ // The postlinearization table
+ if (!Write8bitTables(self ->ContextID, io, NewLUT ->OutputChannels, PostMPE)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_LUT8_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUT8_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsPipelineFree((cmsPipeline*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+// ********************************************************************************
+// Type cmsSigLut16Type
+// ********************************************************************************
+
+// Read 16 bit tables as gamma functions
+static
+cmsBool Read16bitTables(cmsContext ContextID, cmsIOHANDLER* io, cmsPipeline* lut, int nChannels, int nEntries)
+{
+ int i;
+ cmsToneCurve* Tables[cmsMAXCHANNELS];
+
+ // Maybe an empty table? (this is a lcms extension)
+ if (nEntries <= 0) return TRUE;
+
+ // Check for malicious profiles
+ if (nEntries < 2) return FALSE;
+ if (nChannels > cmsMAXCHANNELS) return FALSE;
+
+ // Init table to zero
+ memset(Tables, 0, sizeof(Tables));
+
+ for (i=0; i < nChannels; i++) {
+
+ Tables[i] = cmsBuildTabulatedToneCurve16(ContextID, nEntries, NULL);
+ if (Tables[i] == NULL) goto Error;
+
+ if (!_cmsReadUInt16Array(io, nEntries, Tables[i]->Table16)) goto Error;
+ }
+
+
+ // Add the table (which may certainly be an identity, but this is up to the optimizer, not the reading code)
+ if (!cmsPipelineInsertStage(lut, cmsAT_END, cmsStageAllocToneCurves(ContextID, nChannels, Tables)))
+ goto Error;
+
+ for (i=0; i < nChannels; i++)
+ cmsFreeToneCurve(Tables[i]);
+
+ return TRUE;
+
+Error:
+ for (i=0; i < nChannels; i++) {
+ if (Tables[i]) cmsFreeToneCurve(Tables[i]);
+ }
+
+ return FALSE;
+}
+
+static
+cmsBool Write16bitTables(cmsContext ContextID, cmsIOHANDLER* io, _cmsStageToneCurvesData* Tables)
+{
+ int j;
+ cmsUInt32Number i;
+ cmsUInt16Number val;
+ int nEntries;
+
+ _cmsAssert(Tables != NULL);
+
+ nEntries = Tables->TheCurves[0]->nEntries;
+
+ for (i=0; i < Tables ->nCurves; i++) {
+
+ for (j=0; j < nEntries; j++) {
+
+ val = Tables->TheCurves[i]->Table16[j];
+ if (!_cmsWriteUInt16Number(io, val)) return FALSE;
+ }
+ }
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(ContextID);
+}
+
+static
+void *Type_LUT16_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt8Number InputChannels, OutputChannels, CLUTpoints;
+ cmsPipeline* NewLUT = NULL;
+ cmsUInt32Number nTabSize;
+ cmsFloat64Number Matrix[3*3];
+ cmsUInt16Number InputEntries, OutputEntries;
+
+ *nItems = 0;
+
+ if (!_cmsReadUInt8Number(io, &InputChannels)) return NULL;
+ if (!_cmsReadUInt8Number(io, &OutputChannels)) return NULL;
+ if (!_cmsReadUInt8Number(io, &CLUTpoints)) return NULL; // 255 maximum
+
+ // Padding
+ if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+
+ // Do some checking
+ if (InputChannels > cmsMAXCHANNELS) goto Error;
+ if (OutputChannels > cmsMAXCHANNELS) goto Error;
+
+ // Allocates an empty LUT
+ NewLUT = cmsPipelineAlloc(self ->ContextID, InputChannels, OutputChannels);
+ if (NewLUT == NULL) goto Error;
+
+ // Read the Matrix
+ if (!_cmsRead15Fixed16Number(io, &Matrix[0])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[1])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[2])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[3])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[4])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[5])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[6])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[7])) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Matrix[8])) goto Error;
+
+
+ // Only operates on 3 channels
+ if ((InputChannels == 3) && !_cmsMAT3isIdentity((cmsMAT3*) Matrix)) {
+
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocMatrix(self ->ContextID, 3, 3, Matrix, NULL)))
+ goto Error;
+ }
+
+ if (!_cmsReadUInt16Number(io, &InputEntries)) goto Error;
+ if (!_cmsReadUInt16Number(io, &OutputEntries)) goto Error;
+
+ if (InputEntries > 0x7FFF || OutputEntries > 0x7FFF) goto Error;
+ if (CLUTpoints == 1) goto Error; // Impossible value, 0 for no CLUT and then 2 at least
+
+ // Get input tables
+ if (!Read16bitTables(self ->ContextID, io, NewLUT, InputChannels, InputEntries)) goto Error;
+
+ // Get 3D CLUT
+ nTabSize = uipow(OutputChannels, CLUTpoints, InputChannels);
+ if (nTabSize == (cmsUInt32Number) -1) goto Error;
+ if (nTabSize > 0) {
+
+ cmsUInt16Number *T;
+
+ T = (cmsUInt16Number*) _cmsCalloc(self ->ContextID, nTabSize, sizeof(cmsUInt16Number));
+ if (T == NULL) goto Error;
+
+ if (!_cmsReadUInt16Array(io, nTabSize, T)) {
+ _cmsFree(self ->ContextID, T);
+ goto Error;
+ }
+
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, cmsStageAllocCLut16bit(self ->ContextID, CLUTpoints, InputChannels, OutputChannels, T))) {
+ _cmsFree(self ->ContextID, T);
+ goto Error;
+ }
+ _cmsFree(self ->ContextID, T);
+ }
+
+
+ // Get output tables
+ if (!Read16bitTables(self ->ContextID, io, NewLUT, OutputChannels, OutputEntries)) goto Error;
+
+ *nItems = 1;
+ return NewLUT;
+
+Error:
+ if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// We only allow some specific MPE structures: Matrix plus prelin, plus clut, plus post-lin.
+// Some empty defaults are created for missing parts
+
+static
+cmsBool Type_LUT16_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt32Number nTabSize;
+ cmsPipeline* NewLUT = (cmsPipeline*) Ptr;
+ cmsStage* mpe;
+ _cmsStageToneCurvesData* PreMPE = NULL, *PostMPE = NULL;
+ _cmsStageMatrixData* MatMPE = NULL;
+ _cmsStageCLutData* clut = NULL;
+ int i, InputChannels, OutputChannels, clutPoints;
+
+ // Disassemble the LUT into components.
+ mpe = NewLUT -> Elements;
+ if (mpe != NULL && mpe ->Type == cmsSigMatrixElemType) {
+
+ MatMPE = (_cmsStageMatrixData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+
+ if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+ PreMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+ if (mpe != NULL && mpe ->Type == cmsSigCLutElemType) {
+ clut = (_cmsStageCLutData*) mpe -> Data;
+ mpe = mpe ->Next;
+ }
+
+ if (mpe != NULL && mpe ->Type == cmsSigCurveSetElemType) {
+ PostMPE = (_cmsStageToneCurvesData*) mpe ->Data;
+ mpe = mpe -> Next;
+ }
+
+ // That should be all
+ if (mpe != NULL) {
+ cmsSignalError(mpe->ContextID, cmsERROR_UNKNOWN_EXTENSION, "LUT is not suitable to be saved as LUT16");
+ return FALSE;
+ }
+
+ InputChannels = cmsPipelineInputChannels(NewLUT);
+ OutputChannels = cmsPipelineOutputChannels(NewLUT);
+
+ if (clut == NULL)
+ clutPoints = 0;
+ else
+ clutPoints = clut->Params->nSamples[0];
+
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) InputChannels)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) OutputChannels)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) clutPoints)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, 0)) return FALSE; // Padding
+
+
+ if (MatMPE != NULL) {
+
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[0])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[1])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[2])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[3])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[4])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[5])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[6])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[7])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, MatMPE -> Double[8])) return FALSE;
+ }
+ else {
+
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 1)) return FALSE;
+ }
+
+
+ if (PreMPE != NULL) {
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PreMPE ->TheCurves[0]->nEntries)) return FALSE;
+ } else {
+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+ }
+
+ if (PostMPE != NULL) {
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) PostMPE ->TheCurves[0]->nEntries)) return FALSE;
+ } else {
+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+
+ }
+
+ // The prelinearization table
+
+ if (PreMPE != NULL) {
+ if (!Write16bitTables(self ->ContextID, io, PreMPE)) return FALSE;
+ }
+ else {
+ for (i=0; i < InputChannels; i++) {
+
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+ }
+ }
+
+ nTabSize = uipow(OutputChannels, clutPoints, InputChannels);
+ if (nTabSize == (cmsUInt32Number) -1) return FALSE;
+ if (nTabSize > 0) {
+ // The 3D CLUT.
+ if (clut != NULL) {
+ if (!_cmsWriteUInt16Array(io, nTabSize, clut->Tab.T)) return FALSE;
+ }
+ }
+
+ // The postlinearization table
+ if (PostMPE != NULL) {
+ if (!Write16bitTables(self ->ContextID, io, PostMPE)) return FALSE;
+ }
+ else {
+ for (i=0; i < OutputChannels; i++) {
+
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0xffff)) return FALSE;
+ }
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_LUT16_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUT16_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsPipelineFree((cmsPipeline*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigLutAToBType
+// ********************************************************************************
+
+
+// V4 stuff. Read matrix for LutAtoB and LutBtoA
+
+static
+cmsStage* ReadMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset)
+{
+ cmsFloat64Number dMat[3*3];
+ cmsFloat64Number dOff[3];
+ cmsStage* Mat;
+
+ // Go to address
+ if (!io -> Seek(io, Offset)) return NULL;
+
+ // Read the Matrix
+ if (!_cmsRead15Fixed16Number(io, &dMat[0])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[1])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[2])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[3])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[4])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[5])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[6])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[7])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dMat[8])) return NULL;
+
+ if (!_cmsRead15Fixed16Number(io, &dOff[0])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dOff[1])) return NULL;
+ if (!_cmsRead15Fixed16Number(io, &dOff[2])) return NULL;
+
+ Mat = cmsStageAllocMatrix(self ->ContextID, 3, 3, dMat, dOff);
+
+ return Mat;
+}
+
+
+
+
+// V4 stuff. Read CLUT part for LutAtoB and LutBtoA
+
+static
+cmsStage* ReadCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, int InputChannels, int OutputChannels)
+{
+ cmsUInt8Number gridPoints8[cmsMAXCHANNELS]; // Number of grid points in each dimension.
+ cmsUInt32Number GridPoints[cmsMAXCHANNELS], i;
+ cmsUInt8Number Precision;
+ cmsStage* CLUT;
+ _cmsStageCLutData* Data;
+
+ if (!io -> Seek(io, Offset)) return NULL;
+ if (io -> Read(io, gridPoints8, cmsMAXCHANNELS, 1) != 1) return NULL;
+
+
+ for (i=0; i < cmsMAXCHANNELS; i++) {
+
+ if (gridPoints8[i] == 1) return NULL; // Impossible value, 0 for no CLUT and then 2 at least
+ GridPoints[i] = gridPoints8[i];
+ }
+
+ if (!_cmsReadUInt8Number(io, &Precision)) return NULL;
+
+ if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+ if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+ if (!_cmsReadUInt8Number(io, NULL)) return NULL;
+
+ CLUT = cmsStageAllocCLut16bitGranular(self ->ContextID, GridPoints, InputChannels, OutputChannels, NULL);
+ if (CLUT == NULL) return NULL;
+
+ Data = (_cmsStageCLutData*) CLUT ->Data;
+
+ // Precision can be 1 or 2 bytes
+ if (Precision == 1) {
+
+ cmsUInt8Number v;
+
+ for (i=0; i < Data ->nEntries; i++) {
+
+ if (io ->Read(io, &v, sizeof(cmsUInt8Number), 1) != 1) return NULL;
+ Data ->Tab.T[i] = FROM_8_TO_16(v);
+ }
+
+ }
+ else
+ if (Precision == 2) {
+
+ if (!_cmsReadUInt16Array(io, Data->nEntries, Data ->Tab.T)) {
+ cmsStageFree(CLUT);
+ return NULL;
+ }
+ }
+ else {
+ cmsStageFree(CLUT);
+ cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision);
+ return NULL;
+ }
+
+ return CLUT;
+}
+
+static
+cmsToneCurve* ReadEmbeddedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)
+{
+ cmsTagTypeSignature BaseType;
+ cmsUInt32Number nItems;
+
+ BaseType = _cmsReadTypeBase(io);
+ switch (BaseType) {
+
+ case cmsSigCurveType:
+ return (cmsToneCurve*) Type_Curve_Read(self, io, &nItems, 0);
+
+ case cmsSigParametricCurveType:
+ return (cmsToneCurve*) Type_ParametricCurve_Read(self, io, &nItems, 0);
+
+ default:
+ {
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) BaseType);
+ cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String);
+ }
+ return NULL;
+ }
+}
+
+
+// Read a set of curves from specific offset
+static
+cmsStage* ReadSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number Offset, cmsUInt32Number nCurves)
+{
+ cmsToneCurve* Curves[cmsMAXCHANNELS];
+ cmsUInt32Number i;
+ cmsStage* Lin = NULL;
+
+ if (nCurves > cmsMAXCHANNELS) return FALSE;
+
+ if (!io -> Seek(io, Offset)) return FALSE;
+
+ for (i=0; i < nCurves; i++)
+ Curves[i] = NULL;
+
+ for (i=0; i < nCurves; i++) {
+
+ Curves[i] = ReadEmbeddedCurve(self, io);
+ if (Curves[i] == NULL) goto Error;
+ if (!_cmsReadAlignment(io)) goto Error;
+
+ }
+
+ Lin = cmsStageAllocToneCurves(self ->ContextID, nCurves, Curves);
+
+Error:
+ for (i=0; i < nCurves; i++)
+ cmsFreeToneCurve(Curves[i]);
+
+ return Lin;
+}
+
+
+// LutAtoB type
+
+// This structure represents a colour transform. The type contains up to five processing
+// elements which are stored in the AtoBTag tag in the following order: a set of one
+// dimensional curves, a 3 by 3 matrix with offset terms, a set of one dimensional curves,
+// a multidimensional lookup table, and a set of one dimensional output curves.
+// Data are processed using these elements via the following sequence:
+//
+//("A" curves) -> (multidimensional lookup table - CLUT) -> ("M" curves) -> (matrix) -> ("B" curves).
+//
+/*
+It is possible to use any or all of these processing elements. At least one processing element
+must be included.Only the following combinations are allowed:
+
+B
+M - Matrix - B
+A - CLUT - B
+A - CLUT - M - Matrix - B
+
+*/
+
+static
+void* Type_LUTA2B_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt32Number BaseOffset;
+ cmsUInt8Number inputChan; // Number of input channels
+ cmsUInt8Number outputChan; // Number of output channels
+ cmsUInt32Number offsetB; // Offset to first "B" curve
+ cmsUInt32Number offsetMat; // Offset to matrix
+ cmsUInt32Number offsetM; // Offset to first "M" curve
+ cmsUInt32Number offsetC; // Offset to CLUT
+ cmsUInt32Number offsetA; // Offset to first "A" curve
+ cmsPipeline* NewLUT = NULL;
+
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;
+ if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;
+
+ if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+ if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;
+
+ // Allocates an empty LUT
+ NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);
+ if (NewLUT == NULL) return NULL;
+
+ if (offsetA!= 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, inputChan)))
+ goto Error;
+ }
+
+ if (offsetC != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+ goto Error;
+ }
+
+ if (offsetM != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, outputChan)))
+ goto Error;
+ }
+
+ if (offsetMat != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+ goto Error;
+ }
+
+ if (offsetB != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, outputChan)))
+ goto Error;
+ }
+
+ *nItems = 1;
+ return NewLUT;
+Error:
+ cmsPipelineFree(NewLUT);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// Write a set of curves
+static
+cmsBool WriteMatrix(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsStage* mpe)
+{
+ _cmsStageMatrixData* m = (_cmsStageMatrixData*) mpe -> Data;
+
+ // Write the Matrix
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[0])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[1])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[2])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[3])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[4])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[5])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[6])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[7])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Double[8])) return FALSE;
+
+ if (m ->Offset != NULL) {
+
+ if (!_cmsWrite15Fixed16Number(io, m -> Offset[0])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Offset[1])) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, m -> Offset[2])) return FALSE;
+ }
+ else {
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, 0)) return FALSE;
+
+ }
+
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// Write a set of curves
+static
+cmsBool WriteSetOfCurves(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsTagTypeSignature Type, cmsStage* mpe)
+{
+ cmsUInt32Number i, n;
+ cmsTagTypeSignature CurrentType;
+ cmsToneCurve** Curves;
+
+
+ n = cmsStageOutputChannels(mpe);
+ Curves = _cmsStageGetPtrToCurveSet(mpe);
+
+ for (i=0; i < n; i++) {
+
+ // If this is a table-based curve, use curve type even on V4
+ CurrentType = Type;
+
+ if ((Curves[i] ->nSegments == 0)||
+ ((Curves[i]->nSegments == 2) && (Curves[i] ->Segments[1].Type == 0)) )
+ CurrentType = cmsSigCurveType;
+ else
+ if (Curves[i] ->Segments[0].Type < 0)
+ CurrentType = cmsSigCurveType;
+
+ if (!_cmsWriteTypeBase(io, CurrentType)) return FALSE;
+
+ switch (CurrentType) {
+
+ case cmsSigCurveType:
+ if (!Type_Curve_Write(self, io, Curves[i], 1)) return FALSE;
+ break;
+
+ case cmsSigParametricCurveType:
+ if (!Type_ParametricCurve_Write(self, io, Curves[i], 1)) return FALSE;
+ break;
+
+ default:
+ {
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) Type);
+ cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve type '%s'", String);
+ }
+ return FALSE;
+ }
+
+ if (!_cmsWriteAlignment(io)) return FALSE;
+ }
+
+
+ return TRUE;
+}
+
+
+static
+cmsBool WriteCLUT(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt8Number Precision, cmsStage* mpe)
+{
+ cmsUInt8Number gridPoints[cmsMAXCHANNELS]; // Number of grid points in each dimension.
+ cmsUInt32Number i;
+ _cmsStageCLutData* CLUT = ( _cmsStageCLutData*) mpe -> Data;
+
+ if (CLUT ->HasFloatValues) {
+ cmsSignalError(self ->ContextID, cmsERROR_NOT_SUITABLE, "Cannot save floating point data, CLUT are 8 or 16 bit only");
+ return FALSE;
+ }
+
+ memset(gridPoints, 0, sizeof(gridPoints));
+ for (i=0; i < (cmsUInt32Number) CLUT ->Params ->nInputs; i++)
+ gridPoints[i] = (cmsUInt8Number) CLUT ->Params ->nSamples[i];
+
+ if (!io -> Write(io, cmsMAXCHANNELS*sizeof(cmsUInt8Number), gridPoints)) return FALSE;
+
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) Precision)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, 0)) return FALSE;
+
+ // Precision can be 1 or 2 bytes
+ if (Precision == 1) {
+
+ for (i=0; i < CLUT->nEntries; i++) {
+
+ if (!_cmsWriteUInt8Number(io, FROM_16_TO_8(CLUT->Tab.T[i]))) return FALSE;
+ }
+ }
+ else
+ if (Precision == 2) {
+
+ if (!_cmsWriteUInt16Array(io, CLUT->nEntries, CLUT ->Tab.T)) return FALSE;
+ }
+ else {
+ cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown precision of '%d'", Precision);
+ return FALSE;
+ }
+
+ if (!_cmsWriteAlignment(io)) return FALSE;
+
+ return TRUE;
+}
+
+
+
+
+static
+cmsBool Type_LUTA2B_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsPipeline* Lut = (cmsPipeline*) Ptr;
+ int inputChan, outputChan;
+ cmsStage *A = NULL, *B = NULL, *M = NULL;
+ cmsStage * Matrix = NULL;
+ cmsStage * CLUT = NULL;
+ cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;
+ cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;
+
+ // Get the base for all offsets
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ if (Lut ->Elements != NULL)
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &M, &Matrix, &B))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &A, &CLUT, &B))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType,
+ cmsSigMatrixElemType, cmsSigCurveSetElemType, &A, &CLUT, &M, &Matrix, &B)) {
+
+ cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutAToB");
+ return FALSE;
+ }
+
+ // Get input, output channels
+ inputChan = cmsPipelineInputChannels(Lut);
+ outputChan = cmsPipelineOutputChannels(Lut);
+
+ // Write channel count
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+
+ // Keep directory to be filled latter
+ DirectoryPos = io ->Tell(io);
+
+ // Write the directory
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+
+ if (A != NULL) {
+
+ offsetA = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;
+ }
+
+ if (CLUT != NULL) {
+ offsetC = io ->Tell(io) - BaseOffset;
+ if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;
+
+ }
+ if (M != NULL) {
+
+ offsetM = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;
+ }
+
+ if (Matrix != NULL) {
+ offsetMat = io ->Tell(io) - BaseOffset;
+ if (!WriteMatrix(self, io, Matrix)) return FALSE;
+ }
+
+ if (B != NULL) {
+
+ offsetB = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;
+ }
+
+ CurrentPos = io ->Tell(io);
+
+ if (!io ->Seek(io, DirectoryPos)) return FALSE;
+
+ if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;
+
+ if (!io ->Seek(io, CurrentPos)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_LUTA2B_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUTA2B_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsPipelineFree((cmsPipeline*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// LutBToA type
+
+static
+void* Type_LUTB2A_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt8Number inputChan; // Number of input channels
+ cmsUInt8Number outputChan; // Number of output channels
+ cmsUInt32Number BaseOffset; // Actual position in file
+ cmsUInt32Number offsetB; // Offset to first "B" curve
+ cmsUInt32Number offsetMat; // Offset to matrix
+ cmsUInt32Number offsetM; // Offset to first "M" curve
+ cmsUInt32Number offsetC; // Offset to CLUT
+ cmsUInt32Number offsetA; // Offset to first "A" curve
+ cmsPipeline* NewLUT = NULL;
+
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ if (!_cmsReadUInt8Number(io, &inputChan)) return NULL;
+ if (!_cmsReadUInt8Number(io, &outputChan)) return NULL;
+
+ // Padding
+ if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+ if (!_cmsReadUInt32Number(io, &offsetB)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetMat)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetM)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetC)) return NULL;
+ if (!_cmsReadUInt32Number(io, &offsetA)) return NULL;
+
+ // Allocates an empty LUT
+ NewLUT = cmsPipelineAlloc(self ->ContextID, inputChan, outputChan);
+ if (NewLUT == NULL) return NULL;
+
+ if (offsetB != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetB, inputChan)))
+ goto Error;
+ }
+
+ if (offsetMat != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadMatrix(self, io, BaseOffset + offsetMat)))
+ goto Error;
+ }
+
+ if (offsetM != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetM, inputChan)))
+ goto Error;
+ }
+
+ if (offsetC != 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadCLUT(self, io, BaseOffset + offsetC, inputChan, outputChan)))
+ goto Error;
+ }
+
+ if (offsetA!= 0) {
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, ReadSetOfCurves(self, io, BaseOffset + offsetA, outputChan)))
+ goto Error;
+ }
+
+ *nItems = 1;
+ return NewLUT;
+Error:
+ cmsPipelineFree(NewLUT);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+/*
+B
+B - Matrix - M
+B - CLUT - A
+B - Matrix - M - CLUT - A
+*/
+
+static
+cmsBool Type_LUTB2A_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsPipeline* Lut = (cmsPipeline*) Ptr;
+ int inputChan, outputChan;
+ cmsStage *A = NULL, *B = NULL, *M = NULL;
+ cmsStage *Matrix = NULL;
+ cmsStage *CLUT = NULL;
+ cmsUInt32Number offsetB = 0, offsetMat = 0, offsetM = 0, offsetC = 0, offsetA = 0;
+ cmsUInt32Number BaseOffset, DirectoryPos, CurrentPos;
+
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 1, cmsSigCurveSetElemType, &B))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, &B, &Matrix, &M))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 3, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &CLUT, &A))
+ if (!cmsPipelineCheckAndRetreiveStages(Lut, 5, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType,
+ cmsSigCLutElemType, cmsSigCurveSetElemType, &B, &Matrix, &M, &CLUT, &A)) {
+ cmsSignalError(self->ContextID, cmsERROR_NOT_SUITABLE, "LUT is not suitable to be saved as LutBToA");
+ return FALSE;
+ }
+
+ inputChan = cmsPipelineInputChannels(Lut);
+ outputChan = cmsPipelineOutputChannels(Lut);
+
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) inputChan)) return FALSE;
+ if (!_cmsWriteUInt8Number(io, (cmsUInt8Number) outputChan)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 0)) return FALSE;
+
+ DirectoryPos = io ->Tell(io);
+
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+
+ if (A != NULL) {
+
+ offsetA = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, A)) return FALSE;
+ }
+
+ if (CLUT != NULL) {
+ offsetC = io ->Tell(io) - BaseOffset;
+ if (!WriteCLUT(self, io, Lut ->SaveAs8Bits ? 1 : 2, CLUT)) return FALSE;
+
+ }
+ if (M != NULL) {
+
+ offsetM = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, M)) return FALSE;
+ }
+
+ if (Matrix != NULL) {
+ offsetMat = io ->Tell(io) - BaseOffset;
+ if (!WriteMatrix(self, io, Matrix)) return FALSE;
+ }
+
+ if (B != NULL) {
+
+ offsetB = io ->Tell(io) - BaseOffset;
+ if (!WriteSetOfCurves(self, io, cmsSigParametricCurveType, B)) return FALSE;
+ }
+
+ CurrentPos = io ->Tell(io);
+
+ if (!io ->Seek(io, DirectoryPos)) return FALSE;
+
+ if (!_cmsWriteUInt32Number(io, offsetB)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetMat)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetM)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetC)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, offsetA)) return FALSE;
+
+ if (!io ->Seek(io, CurrentPos)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+
+static
+void* Type_LUTB2A_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_LUTB2A_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsPipelineFree((cmsPipeline*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+
+// ********************************************************************************
+// Type cmsSigColorantTableType
+// ********************************************************************************
+/*
+The purpose of this tag is to identify the colorants used in the profile by a
+unique name and set of XYZ or L*a*b* values to give the colorant an unambiguous
+value. The first colorant listed is the colorant of the first device channel of
+a lut tag. The second colorant listed is the colorant of the second device channel
+of a lut tag, and so on.
+*/
+
+static
+void *Type_ColorantTable_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt32Number i, Count;
+ cmsNAMEDCOLORLIST* List;
+ char Name[34];
+ cmsUInt16Number PCS[3];
+
+
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+ if (Count > cmsMAXCHANNELS) {
+ cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many colorants '%d'", Count);
+ return NULL;
+ }
+
+ List = cmsAllocNamedColorList(self ->ContextID, Count, 0, "", "");
+ for (i=0; i < Count; i++) {
+
+ if (io ->Read(io, Name, 32, 1) != 1) goto Error;
+ Name[33] = 0;
+
+ if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;
+
+ if (!cmsAppendNamedColor(List, Name, PCS, NULL)) goto Error;
+
+ }
+
+ *nItems = 1;
+ return List;
+
+Error:
+ *nItems = 0;
+ cmsFreeNamedColorList(List);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+
+// Saves a colorant table. It is using the named color structure for simplicity sake
+static
+cmsBool Type_ColorantTable_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;
+ int i, nColors;
+
+ nColors = cmsNamedColorCount(NamedColorList);
+
+ if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;
+
+ for (i=0; i < nColors; i++) {
+
+ char root[33];
+ cmsUInt16Number PCS[3];
+
+ if (!cmsNamedColorInfo(NamedColorList, i, root, NULL, NULL, PCS, NULL)) return 0;
+ root[32] = 0;
+
+ if (!io ->Write(io, 32, root)) return FALSE;
+ if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_ColorantTable_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+ cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;
+ return (void*) cmsDupNamedColorList(nc);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_ColorantTable_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigNamedColor2Type
+// ********************************************************************************
+//
+//The namedColor2Type is a count value and array of structures that provide color
+//coordinates for 7-bit ASCII color names. For each named color, a PCS and optional
+//device representation of the color are given. Both representations are 16-bit values.
+//The device representation corresponds to the header’s “color space of data?field.
+//This representation should be consistent with the “number of device components?//field in the namedColor2Type. If this field is 0, device coordinates are not provided.
+//The PCS representation corresponds to the header’s PCS field. The PCS representation
+//is always provided. Color names are fixed-length, 32-byte fields including null
+//termination. In order to maintain maximum portability, it is strongly recommended
+//that special characters of the 7-bit ASCII set not be used.
+
+static
+void *Type_NamedColor_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+
+ cmsUInt32Number vendorFlag; // Bottom 16 bits for ICC use
+ cmsUInt32Number count; // Count of named colors
+ cmsUInt32Number nDeviceCoords; // Num of device coordinates
+ char prefix[32]; // Prefix for each color name
+ char suffix[32]; // Suffix for each color name
+ cmsNAMEDCOLORLIST* v;
+ cmsUInt32Number i;
+
+
+ *nItems = 0;
+ if (!_cmsReadUInt32Number(io, &vendorFlag)) return NULL;
+ if (!_cmsReadUInt32Number(io, &count)) return NULL;
+ if (!_cmsReadUInt32Number(io, &nDeviceCoords)) return NULL;
+
+ if (io -> Read(io, prefix, 32, 1) != 1) return NULL;
+ if (io -> Read(io, suffix, 32, 1) != 1) return NULL;
+
+ prefix[31] = suffix[31] = 0;
+
+ v = cmsAllocNamedColorList(self ->ContextID, count, nDeviceCoords, prefix, suffix);
+ if (v == NULL) {
+ cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many named colors '%d'", count);
+ return NULL;
+ }
+
+ if (nDeviceCoords > cmsMAXCHANNELS) {
+ cmsSignalError(self->ContextID, cmsERROR_RANGE, "Too many device coordinates '%d'", nDeviceCoords);
+ return 0;
+ }
+ for (i=0; i < count; i++) {
+
+ cmsUInt16Number PCS[3];
+ cmsUInt16Number Colorant[cmsMAXCHANNELS];
+ char Root[33];
+
+ memset(Colorant, 0, sizeof(Colorant));
+ if (io -> Read(io, Root, 32, 1) != 1) return NULL;
+ if (!_cmsReadUInt16Array(io, 3, PCS)) goto Error;
+ if (!_cmsReadUInt16Array(io, nDeviceCoords, Colorant)) goto Error;
+
+ if (!cmsAppendNamedColor(v, Root, PCS, Colorant)) goto Error;
+ }
+
+ *nItems = 1;
+ return (void*) v ;
+
+Error:
+ cmsFreeNamedColorList(v);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// Saves a named color list into a named color profile
+static
+cmsBool Type_NamedColor_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsNAMEDCOLORLIST* NamedColorList = (cmsNAMEDCOLORLIST*) Ptr;
+ char prefix[32]; // Prefix for each color name
+ char suffix[32]; // Suffix for each color name
+ int i, nColors;
+
+ nColors = cmsNamedColorCount(NamedColorList);
+
+ if (!_cmsWriteUInt32Number(io, 0)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, nColors)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, NamedColorList ->ColorantCount)) return FALSE;
+
+ strncpy(prefix, (const char*) NamedColorList->Prefix, 32);
+ strncpy(suffix, (const char*) NamedColorList->Suffix, 32);
+
+ suffix[31] = prefix[31] = 0;
+
+ if (!io ->Write(io, 32, prefix)) return FALSE;
+ if (!io ->Write(io, 32, suffix)) return FALSE;
+
+ for (i=0; i < nColors; i++) {
+
+ cmsUInt16Number PCS[3];
+ cmsUInt16Number Colorant[cmsMAXCHANNELS];
+ char Root[33];
+
+ if (!cmsNamedColorInfo(NamedColorList, i, Root, NULL, NULL, PCS, Colorant)) return 0;
+ if (!io ->Write(io, 32 , Root)) return FALSE;
+ if (!_cmsWriteUInt16Array(io, 3, PCS)) return FALSE;
+ if (!_cmsWriteUInt16Array(io, NamedColorList ->ColorantCount, Colorant)) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void* Type_NamedColor_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+ cmsNAMEDCOLORLIST* nc = (cmsNAMEDCOLORLIST*) Ptr;
+
+ return (void*) cmsDupNamedColorList(nc);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_NamedColor_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsFreeNamedColorList((cmsNAMEDCOLORLIST*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigProfileSequenceDescType
+// ********************************************************************************
+
+// This type is an array of structures, each of which contains information from the
+// header fields and tags from the original profiles which were combined to create
+// the final profile. The order of the structures is the order in which the profiles
+// were combined and includes a structure for the final profile. This provides a
+// description of the profile sequence from source to destination,
+// typically used with the DeviceLink profile.
+
+static
+cmsBool ReadEmbeddedText(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU** mlu, cmsUInt32Number SizeOfTag)
+{
+ cmsTagTypeSignature BaseType;
+ cmsUInt32Number nItems;
+
+ BaseType = _cmsReadTypeBase(io);
+
+ switch (BaseType) {
+
+ case cmsSigTextType:
+ if (*mlu) cmsMLUfree(*mlu);
+ *mlu = (cmsMLU*)Type_Text_Read(self, io, &nItems, SizeOfTag);
+ return (*mlu != NULL);
+
+ case cmsSigTextDescriptionType:
+ if (*mlu) cmsMLUfree(*mlu);
+ *mlu = (cmsMLU*) Type_Text_Description_Read(self, io, &nItems, SizeOfTag);
+ return (*mlu != NULL);
+
+ /*
+ TBD: Size is needed for MLU, and we have no idea on which is the available size
+ */
+
+ case cmsSigMultiLocalizedUnicodeType:
+ if (*mlu) cmsMLUfree(*mlu);
+ *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, SizeOfTag);
+ return (*mlu != NULL);
+
+ default: return FALSE;
+ }
+}
+
+
+static
+void *Type_ProfileSequenceDesc_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsSEQ* OutSeq;
+ cmsUInt32Number i, Count;
+
+ *nItems = 0;
+
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+
+ OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);
+ if (OutSeq == NULL) return NULL;
+
+ OutSeq ->n = Count;
+
+ // Get structures as well
+
+ for (i=0; i < Count; i++) {
+
+ cmsPSEQDESC* sec = &OutSeq -> seq[i];
+
+ if (!_cmsReadUInt32Number(io, &sec ->deviceMfg)) goto Error;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ if (!_cmsReadUInt32Number(io, &sec ->deviceModel)) goto Error;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ if (!_cmsReadUInt64Number(io, &sec ->attributes)) goto Error;
+ if (SizeOfTag < sizeof(cmsUInt64Number)) goto Error;
+ SizeOfTag -= sizeof(cmsUInt64Number);
+
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number *)&sec ->technology)) goto Error;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) goto Error;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ if (!ReadEmbeddedText(self, io, &sec ->Manufacturer, SizeOfTag)) goto Error;
+ if (!ReadEmbeddedText(self, io, &sec ->Model, SizeOfTag)) goto Error;
+ }
+
+ *nItems = 1;
+ return OutSeq;
+
+Error:
+ cmsFreeProfileSequenceDescription(OutSeq);
+ return NULL;
+}
+
+
+// Aux--Embed a text description type. It can be of type text description or multilocalized unicode
+// and it depends of the version number passed on cmsTagDescriptor structure instead of stack
+static
+cmsBool SaveDescription(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* Text)
+{
+ if (self ->ICCVersion < 0x4000000) {
+
+ if (!_cmsWriteTypeBase(io, cmsSigTextDescriptionType)) return FALSE;
+ return Type_Text_Description_Write(self, io, Text, 1);
+ }
+ else {
+ if (!_cmsWriteTypeBase(io, cmsSigMultiLocalizedUnicodeType)) return FALSE;
+ return Type_MLU_Write(self, io, Text, 1);
+ }
+}
+
+
+static
+cmsBool Type_ProfileSequenceDesc_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsSEQ* Seq = (cmsSEQ*) Ptr;
+ cmsUInt32Number i;
+
+ if (!_cmsWriteUInt32Number(io, Seq->n)) return FALSE;
+
+ for (i=0; i < Seq ->n; i++) {
+
+ cmsPSEQDESC* sec = &Seq -> seq[i];
+
+ if (!_cmsWriteUInt32Number(io, sec ->deviceMfg)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, sec ->deviceModel)) return FALSE;
+ if (!_cmsWriteUInt64Number(io, &sec ->attributes)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, sec ->technology)) return FALSE;
+
+ if (!SaveDescription(self, io, sec ->Manufacturer)) return FALSE;
+ if (!SaveDescription(self, io, sec ->Model)) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_ProfileSequenceDesc_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ProfileSequenceDesc_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigProfileSequenceIdType
+// ********************************************************************************
+/*
+In certain workflows using ICC Device Link Profiles, it is necessary to identify the
+original profiles that were combined to create the Device Link Profile.
+This type is an array of structures, each of which contains information for
+identification of a profile used in a sequence
+*/
+
+
+static
+cmsBool ReadSeqID(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag)
+{
+ cmsSEQ* OutSeq = (cmsSEQ*) Cargo;
+ cmsPSEQDESC* seq = &OutSeq ->seq[n];
+
+ if (io -> Read(io, seq ->ProfileID.ID8, 16, 1) != 1) return FALSE;
+ if (!ReadEmbeddedText(self, io, &seq ->Description, SizeOfTag)) return FALSE;
+
+ return TRUE;
+}
+
+
+
+static
+void *Type_ProfileSequenceId_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsSEQ* OutSeq;
+ cmsUInt32Number Count;
+ cmsUInt32Number BaseOffset;
+
+ *nItems = 0;
+
+ // Get actual position as a basis for element offsets
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // Get table count
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ // Allocate an empty structure
+ OutSeq = cmsAllocProfileSequenceDescription(self ->ContextID, Count);
+ if (OutSeq == NULL) return NULL;
+
+
+ // Read the position table
+ if (!ReadPositionTable(self, io, Count, BaseOffset, OutSeq, ReadSeqID)) {
+
+ cmsFreeProfileSequenceDescription(OutSeq);
+ return NULL;
+ }
+
+ // Success
+ *nItems = 1;
+ return OutSeq;
+
+}
+
+
+static
+cmsBool WriteSeqID(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag)
+{
+ cmsSEQ* Seq = (cmsSEQ*) Cargo;
+
+ if (!io ->Write(io, 16, Seq ->seq[n].ProfileID.ID8)) return FALSE;
+
+ // Store here the MLU
+ if (!SaveDescription(self, io, Seq ->seq[n].Description)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_ProfileSequenceId_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsSEQ* Seq = (cmsSEQ*) Ptr;
+ cmsUInt32Number BaseOffset;
+
+ // Keep the base offset
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // This is the table count
+ if (!_cmsWriteUInt32Number(io, Seq ->n)) return FALSE;
+
+ // This is the position table and content
+ if (!WritePositionTable(self, io, 0, Seq ->n, BaseOffset, Seq, WriteSeqID)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_ProfileSequenceId_Dup(struct _cms_typehandler_struct* self, const void* Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsDupProfileSequenceDescription((cmsSEQ*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_ProfileSequenceId_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsFreeProfileSequenceDescription((cmsSEQ*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigUcrBgType
+// ********************************************************************************
+/*
+This type contains curves representing the under color removal and black
+generation and a text string which is a general description of the method used
+for the ucr/bg.
+*/
+
+static
+void *Type_UcrBg_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUcrBg* n = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));
+ cmsUInt32Number CountUcr, CountBg;
+ char* ASCIIString;
+
+ *nItems = 0;
+ if (n == NULL) return NULL;
+
+ // First curve is Under color removal
+ if (!_cmsReadUInt32Number(io, &CountUcr)) return NULL;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ n ->Ucr = cmsBuildTabulatedToneCurve16(self ->ContextID, CountUcr, NULL);
+ if (n ->Ucr == NULL) return NULL;
+
+ if (!_cmsReadUInt16Array(io, CountUcr, n ->Ucr->Table16)) return NULL;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+ SizeOfTag -= CountUcr * sizeof(cmsUInt16Number);
+
+ // Second curve is Black generation
+ if (!_cmsReadUInt32Number(io, &CountBg)) return NULL;
+ if (SizeOfTag < sizeof(cmsUInt32Number)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ n ->Bg = cmsBuildTabulatedToneCurve16(self ->ContextID, CountBg, NULL);
+ if (n ->Bg == NULL) return NULL;
+ if (!_cmsReadUInt16Array(io, CountBg, n ->Bg->Table16)) return NULL;
+ if (SizeOfTag < CountBg * sizeof(cmsUInt16Number)) return NULL;
+ SizeOfTag -= CountBg * sizeof(cmsUInt16Number);
+ if (SizeOfTag == UINT_MAX) return NULL;
+
+ // Now comes the text. The length is specified by the tag size
+ n ->Desc = cmsMLUalloc(self ->ContextID, 1);
+ if (n ->Desc == NULL) return NULL;
+
+ ASCIIString = (char*) _cmsMalloc(self ->ContextID, SizeOfTag + 1);
+ if (io ->Read(io, ASCIIString, sizeof(char), SizeOfTag) != SizeOfTag) return NULL;
+ ASCIIString[SizeOfTag] = 0;
+ cmsMLUsetASCII(n ->Desc, cmsNoLanguage, cmsNoCountry, ASCIIString);
+ _cmsFree(self ->ContextID, ASCIIString);
+
+ *nItems = 1;
+ return (void*) n;
+}
+
+static
+cmsBool Type_UcrBg_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUcrBg* Value = (cmsUcrBg*) Ptr;
+ cmsUInt32Number TextSize;
+ char* Text;
+
+ // First curve is Under color removal
+ if (!_cmsWriteUInt32Number(io, Value ->Ucr ->nEntries)) return FALSE;
+ if (!_cmsWriteUInt16Array(io, Value ->Ucr ->nEntries, Value ->Ucr ->Table16)) return FALSE;
+
+ // Then black generation
+ if (!_cmsWriteUInt32Number(io, Value ->Bg ->nEntries)) return FALSE;
+ if (!_cmsWriteUInt16Array(io, Value ->Bg ->nEntries, Value ->Bg ->Table16)) return FALSE;
+
+ // Now comes the text. The length is specified by the tag size
+ TextSize = cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, NULL, 0);
+ Text = (char*) _cmsMalloc(self ->ContextID, TextSize);
+ if (cmsMLUgetASCII(Value ->Desc, cmsNoLanguage, cmsNoCountry, Text, TextSize) != TextSize) return FALSE;
+
+ if (!io ->Write(io, TextSize, Text)) return FALSE;
+ _cmsFree(self ->ContextID, Text);
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_UcrBg_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ cmsUcrBg* Src = (cmsUcrBg*) Ptr;
+ cmsUcrBg* NewUcrBg = (cmsUcrBg*) _cmsMallocZero(self ->ContextID, sizeof(cmsUcrBg));
+
+ if (NewUcrBg == NULL) return NULL;
+
+ NewUcrBg ->Bg = cmsDupToneCurve(Src ->Bg);
+ NewUcrBg ->Ucr = cmsDupToneCurve(Src ->Ucr);
+ NewUcrBg ->Desc = cmsMLUdup(Src ->Desc);
+
+ return (void*) NewUcrBg;
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+static
+void Type_UcrBg_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+ cmsUcrBg* Src = (cmsUcrBg*) Ptr;
+
+ if (Src ->Ucr) cmsFreeToneCurve(Src ->Ucr);
+ if (Src ->Bg) cmsFreeToneCurve(Src ->Bg);
+ if (Src ->Desc) cmsMLUfree(Src ->Desc);
+
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigCrdInfoType
+// ********************************************************************************
+
+/*
+This type contains the PostScript product name to which this profile corresponds
+and the names of the companion CRDs. Recall that a single profile can generate
+multiple CRDs. It is implemented as a MLU being the language code "PS" and then
+country varies for each element:
+
+ nm: PostScript product name
+ #0: Rendering intent 0 CRD name
+ #1: Rendering intent 1 CRD name
+ #2: Rendering intent 2 CRD name
+ #3: Rendering intent 3 CRD name
+*/
+
+
+
+// Auxiliar, read an string specified as count + string
+static
+cmsBool ReadCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, cmsUInt32Number* SizeOfTag, const char* Section)
+{
+ cmsUInt32Number Count;
+ char* Text;
+
+ if (*SizeOfTag < sizeof(cmsUInt32Number)) return FALSE;
+
+ if (!_cmsReadUInt32Number(io, &Count)) return FALSE;
+
+ if (Count > UINT_MAX - sizeof(cmsUInt32Number)) return FALSE;
+ if (*SizeOfTag < Count + sizeof(cmsUInt32Number)) return FALSE;
+
+ Text = (char*) _cmsMalloc(self ->ContextID, Count+1);
+ if (Text == NULL) return FALSE;
+
+ if (io ->Read(io, Text, sizeof(cmsUInt8Number), Count) != Count) {
+ _cmsFree(self ->ContextID, Text);
+ return FALSE;
+ }
+
+ Text[Count] = 0;
+
+ cmsMLUsetASCII(mlu, "PS", Section, Text);
+ _cmsFree(self ->ContextID, Text);
+
+ *SizeOfTag -= (Count + sizeof(cmsUInt32Number));
+ return TRUE;
+}
+
+static
+cmsBool WriteCountAndSting(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsMLU* mlu, const char* Section)
+{
+ cmsUInt32Number TextSize;
+ char* Text;
+
+ TextSize = cmsMLUgetASCII(mlu, "PS", Section, NULL, 0);
+ Text = (char*) _cmsMalloc(self ->ContextID, TextSize);
+
+ if (!_cmsWriteUInt32Number(io, TextSize)) return FALSE;
+
+ if (cmsMLUgetASCII(mlu, "PS", Section, Text, TextSize) == 0) return FALSE;
+
+ if (!io ->Write(io, TextSize, Text)) return FALSE;
+ _cmsFree(self ->ContextID, Text);
+
+ return TRUE;
+}
+
+static
+void *Type_CrdInfo_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsMLU* mlu = cmsMLUalloc(self ->ContextID, 5);
+
+ *nItems = 0;
+ if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "nm")) goto Error;
+ if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#0")) goto Error;
+ if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#1")) goto Error;
+ if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#2")) goto Error;
+ if (!ReadCountAndSting(self, io, mlu, &SizeOfTag, "#3")) goto Error;
+
+ *nItems = 1;
+ return (void*) mlu;
+
+Error:
+ cmsMLUfree(mlu);
+ return NULL;
+
+}
+
+static
+cmsBool Type_CrdInfo_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+
+ cmsMLU* mlu = (cmsMLU*) Ptr;
+
+ if (!WriteCountAndSting(self, io, mlu, "nm")) goto Error;
+ if (!WriteCountAndSting(self, io, mlu, "#0")) goto Error;
+ if (!WriteCountAndSting(self, io, mlu, "#1")) goto Error;
+ if (!WriteCountAndSting(self, io, mlu, "#2")) goto Error;
+ if (!WriteCountAndSting(self, io, mlu, "#3")) goto Error;
+
+ return TRUE;
+
+Error:
+ return FALSE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_CrdInfo_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsMLUdup((cmsMLU*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_CrdInfo_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+ cmsMLUfree((cmsMLU*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+// ********************************************************************************
+// Type cmsSigScreeningType
+// ********************************************************************************
+//
+//The screeningType describes various screening parameters including screen
+//frequency, screening angle, and spot shape.
+
+static
+void *Type_Screening_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsScreening* sc = NULL;
+ cmsUInt32Number i;
+
+ sc = (cmsScreening*) _cmsMallocZero(self ->ContextID, sizeof(cmsScreening));
+ if (sc == NULL) return NULL;
+
+ *nItems = 0;
+
+ if (!_cmsReadUInt32Number(io, &sc ->Flag)) goto Error;
+ if (!_cmsReadUInt32Number(io, &sc ->nChannels)) goto Error;
+
+ if (sc ->nChannels > cmsMAXCHANNELS - 1)
+ sc ->nChannels = cmsMAXCHANNELS - 1;
+
+ for (i=0; i < sc ->nChannels; i++) {
+
+ if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].Frequency)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &sc ->Channels[i].ScreenAngle)) goto Error;
+ if (!_cmsReadUInt32Number(io, &sc ->Channels[i].SpotShape)) goto Error;
+ }
+
+
+ *nItems = 1;
+
+ return (void*) sc;
+
+Error:
+ if (sc != NULL)
+ _cmsFree(self ->ContextID, sc);
+
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_Screening_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsScreening* sc = (cmsScreening* ) Ptr;
+ cmsUInt32Number i;
+
+ if (!_cmsWriteUInt32Number(io, sc ->Flag)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, sc ->nChannels)) return FALSE;
+
+ for (i=0; i < sc ->nChannels; i++) {
+
+ if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].Frequency)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, sc ->Channels[i].ScreenAngle)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, sc ->Channels[i].SpotShape)) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_Screening_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_Screening_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+// ********************************************************************************
+// Type cmsSigViewingConditionsType
+// ********************************************************************************
+//
+//This type represents a set of viewing condition parameters including:
+//CIE ’absolute?illuminant white point tristimulus values and CIE ’absolute?//surround tristimulus values.
+
+static
+void *Type_ViewingConditions_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsICCViewingConditions* vc = NULL;
+
+ vc = (cmsICCViewingConditions*) _cmsMallocZero(self ->ContextID, sizeof(cmsICCViewingConditions));
+ if (vc == NULL) return NULL;
+
+ *nItems = 0;
+
+ if (!_cmsReadXYZNumber(io, &vc ->IlluminantXYZ)) goto Error;
+ if (!_cmsReadXYZNumber(io, &vc ->SurroundXYZ)) goto Error;
+ if (!_cmsReadUInt32Number(io, &vc ->IlluminantType)) goto Error;
+
+ *nItems = 1;
+
+ return (void*) vc;
+
+Error:
+ if (vc != NULL)
+ _cmsFree(self ->ContextID, vc);
+
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+static
+cmsBool Type_ViewingConditions_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsICCViewingConditions* sc = (cmsICCViewingConditions* ) Ptr;
+
+ if (!_cmsWriteXYZNumber(io, &sc ->IlluminantXYZ)) return FALSE;
+ if (!_cmsWriteXYZNumber(io, &sc ->SurroundXYZ)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, sc ->IlluminantType)) return FALSE;
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void* Type_ViewingConditions_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return _cmsDupMem(self ->ContextID, Ptr, sizeof(cmsScreening));
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_ViewingConditions_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigMultiProcessElementType
+// ********************************************************************************
+
+
+static
+void* GenericMPEdup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsStageDup((cmsStage*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void GenericMPEfree(struct _cms_typehandler_struct* self, void *Ptr)
+{
+ cmsStageFree((cmsStage*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+// Each curve is stored in one or more curve segments, with break-points specified between curve segments.
+// The first curve segment always starts at –Infinity, and the last curve segment always ends at +Infinity. The
+// first and last curve segments shall be specified in terms of a formula, whereas the other segments shall be
+// specified either in terms of a formula, or by a sampled curve.
+
+
+// Read an embedded segmented curve
+static
+cmsToneCurve* ReadSegmentedCurve(struct _cms_typehandler_struct* self, cmsIOHANDLER* io)
+{
+ cmsCurveSegSignature ElementSig;
+ cmsUInt32Number i, j;
+ cmsUInt16Number nSegments;
+ cmsCurveSegment* Segments;
+ cmsToneCurve* Curve;
+ cmsFloat32Number PrevBreak = -1E22F; // - infinite
+
+ // Take signature and channels for each element.
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return NULL;
+
+ // That should be a segmented curve
+ if (ElementSig != cmsSigSegmentedCurve) return NULL;
+
+ if (!_cmsReadUInt32Number(io, NULL)) return NULL;
+ if (!_cmsReadUInt16Number(io, &nSegments)) return NULL;
+ if (!_cmsReadUInt16Number(io, NULL)) return NULL;
+
+ if (nSegments < 1) return NULL;
+ Segments = (cmsCurveSegment*) _cmsCalloc(self ->ContextID, nSegments, sizeof(cmsCurveSegment));
+ if (Segments == NULL) return NULL;
+
+ // Read breakpoints
+ for (i=0; i < (cmsUInt32Number) nSegments - 1; i++) {
+
+ Segments[i].x0 = PrevBreak;
+ if (!_cmsReadFloat32Number(io, &Segments[i].x1)) goto Error;
+ PrevBreak = Segments[i].x1;
+ }
+
+ Segments[nSegments-1].x0 = PrevBreak;
+ Segments[nSegments-1].x1 = 1E22F; // A big cmsFloat32Number number
+
+ // Read segments
+ for (i=0; i < nSegments; i++) {
+
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) goto Error;
+ if (!_cmsReadUInt32Number(io, NULL)) goto Error;
+
+ switch (ElementSig) {
+
+ case cmsSigFormulaCurveSeg: {
+
+ cmsUInt16Number Type;
+ cmsUInt32Number ParamsByType[] = {4, 5, 5 };
+
+ if (!_cmsReadUInt16Number(io, &Type)) goto Error;
+ if (!_cmsReadUInt16Number(io, NULL)) goto Error;
+
+ Segments[i].Type = Type + 6;
+ if (Type > 2) goto Error;
+
+ for (j=0; j < ParamsByType[Type]; j++) {
+
+ cmsFloat32Number f;
+ if (!_cmsReadFloat32Number(io, &f)) goto Error;
+ Segments[i].Params[j] = f;
+ }
+ }
+ break;
+
+
+ case cmsSigSampledCurveSeg: {
+ cmsUInt32Number Count;
+
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+
+ Segments[i].nGridPoints = Count;
+ Segments[i].SampledPoints = (cmsFloat32Number*) _cmsCalloc(self ->ContextID, Count, sizeof(cmsFloat32Number));
+ if (Segments[i].SampledPoints == NULL) goto Error;
+
+ for (j=0; j < Count; j++) {
+ if (!_cmsReadFloat32Number(io, &Segments[i].SampledPoints[j])) goto Error;
+ }
+ }
+ break;
+
+ default:
+ {
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown curve element type '%s' found.", String);
+ }
+ return NULL;
+
+ }
+ }
+
+ Curve = cmsBuildSegmentedToneCurve(self ->ContextID, nSegments, Segments);
+
+ for (i=0; i < nSegments; i++) {
+ if (Segments[i].SampledPoints) _cmsFree(self ->ContextID, Segments[i].SampledPoints);
+ }
+ _cmsFree(self ->ContextID, Segments);
+ return Curve;
+
+Error:
+ if (Segments) _cmsFree(self ->ContextID, Segments);
+ return NULL;
+}
+
+
+static
+cmsBool ReadMPECurve(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag)
+{
+ cmsToneCurve** GammaTables = ( cmsToneCurve**) Cargo;
+
+ GammaTables[n] = ReadSegmentedCurve(self, io);
+ return (GammaTables[n] != NULL);
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+void *Type_MPEcurve_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsStage* mpe = NULL;
+ cmsUInt16Number InputChans, OutputChans;
+ cmsUInt32Number i, BaseOffset;
+ cmsToneCurve** GammaTables;
+
+ *nItems = 0;
+
+ // Get actual position as a basis for element offsets
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+ if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+ if (InputChans != OutputChans) return NULL;
+
+ GammaTables = (cmsToneCurve**) _cmsCalloc(self ->ContextID, InputChans, sizeof(cmsToneCurve*));
+ if (GammaTables == NULL) return NULL;
+
+ if (ReadPositionTable(self, io, InputChans, BaseOffset, GammaTables, ReadMPECurve)) {
+
+ mpe = cmsStageAllocToneCurves(self ->ContextID, InputChans, GammaTables);
+ }
+ else {
+ mpe = NULL;
+ }
+
+ for (i=0; i < InputChans; i++) {
+ if (GammaTables[i]) cmsFreeToneCurve(GammaTables[i]);
+ }
+
+ _cmsFree(self ->ContextID, GammaTables);
+ *nItems = (mpe != NULL) ? 1 : 0;
+ return mpe;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// Write a single segmented curve. NO CHECK IS PERFORMED ON VALIDITY
+static
+cmsBool WriteSegmentedCurve(cmsIOHANDLER* io, cmsToneCurve* g)
+{
+ cmsUInt32Number i, j;
+ cmsCurveSegment* Segments = g ->Segments;
+ cmsUInt32Number nSegments = g ->nSegments;
+
+ if (!_cmsWriteUInt32Number(io, cmsSigSegmentedCurve)) goto Error;
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) nSegments)) goto Error;
+ if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+
+ // Write the break-points
+ for (i=0; i < nSegments - 1; i++) {
+ if (!_cmsWriteFloat32Number(io, Segments[i].x1)) goto Error;
+ }
+
+ // Write the segments
+ for (i=0; i < g ->nSegments; i++) {
+
+ cmsCurveSegment* ActualSeg = Segments + i;
+
+ if (ActualSeg -> Type == 0) {
+
+ // This is a sampled curve
+ if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigSampledCurveSeg)) goto Error;
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+ if (!_cmsWriteUInt32Number(io, ActualSeg -> nGridPoints)) goto Error;
+
+ for (j=0; j < g ->Segments[i].nGridPoints; j++) {
+ if (!_cmsWriteFloat32Number(io, ActualSeg -> SampledPoints[j])) goto Error;
+ }
+
+ }
+ else {
+ int Type;
+ cmsUInt32Number ParamsByType[] = { 4, 5, 5 };
+
+ // This is a formula-based
+ if (!_cmsWriteUInt32Number(io, (cmsUInt32Number) cmsSigFormulaCurveSeg)) goto Error;
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+
+ // We only allow 1, 2 and 3 as types
+ Type = ActualSeg ->Type - 6;
+ if (Type > 2 || Type < 0) goto Error;
+
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) Type)) goto Error;
+ if (!_cmsWriteUInt16Number(io, 0)) goto Error;
+
+ for (j=0; j < ParamsByType[Type]; j++) {
+ if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) ActualSeg ->Params[j])) goto Error;
+ }
+ }
+
+ // It seems there is no need to align. Code is here, and for safety commented out
+ // if (!_cmsWriteAlignment(io)) goto Error;
+ }
+
+ return TRUE;
+
+Error:
+ return FALSE;
+}
+
+
+static
+cmsBool WriteMPECurve(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag)
+{
+ _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) Cargo;
+
+ return WriteSegmentedCurve(io, Curves ->TheCurves[n]);
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+ cmsUNUSED_PARAMETER(self);
+}
+
+// Write a curve, checking first for validity
+static
+cmsBool Type_MPEcurve_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt32Number BaseOffset;
+ cmsStage* mpe = (cmsStage*) Ptr;
+ _cmsStageToneCurvesData* Curves = (_cmsStageToneCurvesData*) mpe ->Data;
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // Write the header. Since those are curves, input and output channels are same
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+
+ if (!WritePositionTable(self, io, 0,
+ mpe ->InputChannels, BaseOffset, Curves, WriteMPECurve)) return FALSE;
+
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+
+// The matrix is organized as an array of PxQ+Q elements, where P is the number of input channels to the
+// matrix, and Q is the number of output channels. The matrix elements are each float32Numbers. The array
+// is organized as follows:
+// array = [e11, e12, ? e1P, e21, e22, ? e2P, ? eQ1, eQ2, ? eQP, e1, e2, ? eQ]
+
+static
+void *Type_MPEmatrix_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsStage* mpe;
+ cmsUInt16Number InputChans, OutputChans;
+ cmsUInt32Number nElems, i;
+ cmsFloat64Number* Matrix;
+ cmsFloat64Number* Offsets;
+
+ if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+ if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+
+ nElems = InputChans * OutputChans;
+
+ // Input and output chans may be ANY (up to 0xffff)
+ Matrix = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, nElems, sizeof(cmsFloat64Number));
+ if (Matrix == NULL) return NULL;
+
+ Offsets = (cmsFloat64Number*) _cmsCalloc(self ->ContextID, OutputChans, sizeof(cmsFloat64Number));
+ if (Offsets == NULL) {
+
+ _cmsFree(self ->ContextID, Matrix);
+ return NULL;
+ }
+
+ for (i=0; i < nElems; i++) {
+
+ cmsFloat32Number v;
+
+ if (!_cmsReadFloat32Number(io, &v)) return NULL;
+ Matrix[i] = v;
+ }
+
+
+ for (i=0; i < OutputChans; i++) {
+
+ cmsFloat32Number v;
+
+ if (!_cmsReadFloat32Number(io, &v)) return NULL;
+ Offsets[i] = v;
+ }
+
+
+ mpe = cmsStageAllocMatrix(self ->ContextID, OutputChans, InputChans, Matrix, Offsets);
+ _cmsFree(self ->ContextID, Matrix);
+ _cmsFree(self ->ContextID, Offsets);
+
+ *nItems = 1;
+
+ return mpe;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+static
+cmsBool Type_MPEmatrix_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt32Number i, nElems;
+ cmsStage* mpe = (cmsStage*) Ptr;
+ _cmsStageMatrixData* Matrix = (_cmsStageMatrixData*) mpe ->Data;
+
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;
+
+ nElems = mpe ->InputChannels * mpe ->OutputChannels;
+
+ for (i=0; i < nElems; i++) {
+ if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Double[i])) return FALSE;
+ }
+
+
+ for (i=0; i < mpe ->OutputChannels; i++) {
+
+ if (Matrix ->Offset == NULL) {
+
+ if (!_cmsWriteFloat32Number(io, 0)) return FALSE;
+ }
+ else {
+ if (!_cmsWriteFloat32Number(io, (cmsFloat32Number) Matrix->Offset[i])) return FALSE;
+ }
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+
+static
+void *Type_MPEclut_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsStage* mpe = NULL;
+ cmsUInt16Number InputChans, OutputChans;
+ cmsUInt8Number Dimensions8[16];
+ cmsUInt32Number i, nMaxGrids, GridPoints[MAX_INPUT_DIMENSIONS];
+ _cmsStageCLutData* clut;
+
+ if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+ if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+ if (InputChans == 0) goto Error;
+ if (OutputChans == 0) goto Error;
+
+ if (io ->Read(io, Dimensions8, sizeof(cmsUInt8Number), 16) != 16)
+ goto Error;
+
+ // Copy MAX_INPUT_DIMENSIONS at most. Expand to cmsUInt32Number
+ nMaxGrids = InputChans > MAX_INPUT_DIMENSIONS ? MAX_INPUT_DIMENSIONS : InputChans;
+ for (i=0; i < nMaxGrids; i++) GridPoints[i] = (cmsUInt32Number) Dimensions8[i];
+
+ // Allocate the true CLUT
+ mpe = cmsStageAllocCLutFloatGranular(self ->ContextID, GridPoints, InputChans, OutputChans, NULL);
+ if (mpe == NULL) goto Error;
+
+ // Read the data
+ clut = (_cmsStageCLutData*) mpe ->Data;
+ for (i=0; i < clut ->nEntries; i++) {
+
+ if (!_cmsReadFloat32Number(io, &clut ->Tab.TFloat[i])) goto Error;
+ }
+
+ *nItems = 1;
+ return mpe;
+
+Error:
+ *nItems = 0;
+ if (mpe != NULL) cmsStageFree(mpe);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+// Write a CLUT in floating point
+static
+cmsBool Type_MPEclut_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt8Number Dimensions8[16];
+ cmsUInt32Number i;
+ cmsStage* mpe = (cmsStage*) Ptr;
+ _cmsStageCLutData* clut = (_cmsStageCLutData*) mpe ->Data;
+
+ // Check for maximum number of channels
+ if (mpe -> InputChannels > 15) return FALSE;
+
+ // Only floats are supported in MPE
+ if (clut ->HasFloatValues == FALSE) return FALSE;
+
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->InputChannels)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) mpe ->OutputChannels)) return FALSE;
+
+ memset(Dimensions8, 0, sizeof(Dimensions8));
+
+ for (i=0; i < mpe ->InputChannels; i++)
+ Dimensions8[i] = (cmsUInt8Number) clut ->Params ->nSamples[i];
+
+ if (!io ->Write(io, 16, Dimensions8)) return FALSE;
+
+ for (i=0; i < clut ->nEntries; i++) {
+
+ if (!_cmsWriteFloat32Number(io, clut ->Tab.TFloat[i])) return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(nItems);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+
+// This is the list of built-in MPE types
+static _cmsTagTypeLinkedList SupportedMPEtypes[] = {
+
+{{ (cmsTagTypeSignature) cmsSigBAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[1] }, // Ignore those elements for now
+{{ (cmsTagTypeSignature) cmsSigEAcsElemType, NULL, NULL, NULL, NULL, NULL, 0 }, &SupportedMPEtypes[2] }, // (That's what the spec says)
+
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCurveSetElemType, MPEcurve), &SupportedMPEtypes[3] },
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigMatrixElemType, MPEmatrix), &SupportedMPEtypes[4] },
+{TYPE_MPE_HANDLER((cmsTagTypeSignature) cmsSigCLutElemType, MPEclut), NULL },
+};
+
+_cmsTagTypePluginChunkType _cmsMPETypePluginChunk = { NULL };
+
+static
+cmsBool ReadMPEElem(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ void* Cargo,
+ cmsUInt32Number n,
+ cmsUInt32Number SizeOfTag)
+{
+ cmsStageSignature ElementSig;
+ cmsTagTypeHandler* TypeHandler;
+ cmsUInt32Number nItems;
+ cmsPipeline *NewLUT = (cmsPipeline *) Cargo;
+ _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);
+
+
+ // Take signature and channels for each element.
+ if (!_cmsReadUInt32Number(io, (cmsUInt32Number*) &ElementSig)) return FALSE;
+
+ // The reserved placeholder
+ if (!_cmsReadUInt32Number(io, NULL)) return FALSE;
+
+ // Read diverse MPE types
+ TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk ->TagTypes, SupportedMPEtypes);
+ if (TypeHandler == NULL) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+
+ // An unknown element was found.
+ cmsSignalError(self ->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown MPE type '%s' found.", String);
+ return FALSE;
+ }
+
+ // If no read method, just ignore the element (valid for cmsSigBAcsElemType and cmsSigEAcsElemType)
+ // Read the MPE. No size is given
+ if (TypeHandler ->ReadPtr != NULL) {
+
+ // This is a real element which should be read and processed
+ if (!cmsPipelineInsertStage(NewLUT, cmsAT_END, (cmsStage*) TypeHandler ->ReadPtr(self, io, &nItems, SizeOfTag)))
+ return FALSE;
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+ cmsUNUSED_PARAMETER(n);
+}
+
+
+// This is the main dispatcher for MPE
+static
+void *Type_MPE_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsUInt16Number InputChans, OutputChans;
+ cmsUInt32Number ElementCount;
+ cmsPipeline *NewLUT = NULL;
+ cmsUInt32Number BaseOffset;
+
+ // Get actual position as a basis for element offsets
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // Read channels and element count
+ if (!_cmsReadUInt16Number(io, &InputChans)) return NULL;
+ if (!_cmsReadUInt16Number(io, &OutputChans)) return NULL;
+
+ // Allocates an empty LUT
+ NewLUT = cmsPipelineAlloc(self ->ContextID, InputChans, OutputChans);
+ if (NewLUT == NULL) return NULL;
+
+ if (!_cmsReadUInt32Number(io, &ElementCount)) return NULL;
+
+ if (!ReadPositionTable(self, io, ElementCount, BaseOffset, NewLUT, ReadMPEElem)) {
+ if (NewLUT != NULL) cmsPipelineFree(NewLUT);
+ *nItems = 0;
+ return NULL;
+ }
+
+ // Success
+ *nItems = 1;
+ return NewLUT;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+
+// This one is a liitle bit more complex, so we don't use position tables this time.
+static
+cmsBool Type_MPE_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsUInt32Number i, BaseOffset, DirectoryPos, CurrentPos;
+ int inputChan, outputChan;
+ cmsUInt32Number ElemCount;
+ cmsUInt32Number *ElementOffsets = NULL, *ElementSizes = NULL, Before;
+ cmsStageSignature ElementSig;
+ cmsPipeline* Lut = (cmsPipeline*) Ptr;
+ cmsStage* Elem = Lut ->Elements;
+ cmsTagTypeHandler* TypeHandler;
+ _cmsTagTypePluginChunkType* MPETypePluginChunk = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(self->ContextID, MPEPlugin);
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ inputChan = cmsPipelineInputChannels(Lut);
+ outputChan = cmsPipelineOutputChannels(Lut);
+ ElemCount = cmsPipelineStageCount(Lut);
+
+ ElementOffsets = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+ if (ElementOffsets == NULL) goto Error;
+
+ ElementSizes = (cmsUInt32Number *) _cmsCalloc(self ->ContextID, ElemCount, sizeof(cmsUInt32Number));
+ if (ElementSizes == NULL) goto Error;
+
+ // Write the head
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) inputChan)) goto Error;
+ if (!_cmsWriteUInt16Number(io, (cmsUInt16Number) outputChan)) goto Error;
+ if (!_cmsWriteUInt32Number(io, (cmsUInt16Number) ElemCount)) goto Error;
+
+ DirectoryPos = io ->Tell(io);
+
+ // Write a fake directory to be filled latter on
+ for (i=0; i < ElemCount; i++) {
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error; // Offset
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error; // size
+ }
+
+ // Write each single tag. Keep track of the size as well.
+ for (i=0; i < ElemCount; i++) {
+
+ ElementOffsets[i] = io ->Tell(io) - BaseOffset;
+
+ ElementSig = Elem ->Type;
+
+ TypeHandler = GetHandler((cmsTagTypeSignature) ElementSig, MPETypePluginChunk->TagTypes, SupportedMPEtypes);
+ if (TypeHandler == NULL) {
+
+ char String[5];
+
+ _cmsTagSignature2String(String, (cmsTagSignature) ElementSig);
+
+ // An unknow element was found.
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Found unknown MPE type '%s'", String);
+ goto Error;
+ }
+
+ if (!_cmsWriteUInt32Number(io, ElementSig)) goto Error;
+ if (!_cmsWriteUInt32Number(io, 0)) goto Error;
+ Before = io ->Tell(io);
+ if (!TypeHandler ->WritePtr(self, io, Elem, 1)) goto Error;
+ if (!_cmsWriteAlignment(io)) goto Error;
+
+ ElementSizes[i] = io ->Tell(io) - Before;
+
+ Elem = Elem ->Next;
+ }
+
+ // Write the directory
+ CurrentPos = io ->Tell(io);
+
+ if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+ for (i=0; i < ElemCount; i++) {
+ if (!_cmsWriteUInt32Number(io, ElementOffsets[i])) goto Error;
+ if (!_cmsWriteUInt32Number(io, ElementSizes[i])) goto Error;
+ }
+
+ if (!io ->Seek(io, CurrentPos)) goto Error;
+
+ if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);
+ return TRUE;
+
+Error:
+ if (ElementOffsets != NULL) _cmsFree(self ->ContextID, ElementOffsets);
+ if (ElementSizes != NULL) _cmsFree(self ->ContextID, ElementSizes);
+ return FALSE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_MPE_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsPipelineDup((cmsPipeline*) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+static
+void Type_MPE_Free(struct _cms_typehandler_struct* self, void *Ptr)
+{
+ cmsPipelineFree((cmsPipeline*) Ptr);
+ return;
+
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type cmsSigVcgtType
+// ********************************************************************************
+
+
+#define cmsVideoCardGammaTableType 0
+#define cmsVideoCardGammaFormulaType 1
+
+// Used internally
+typedef struct {
+ double Gamma;
+ double Min;
+ double Max;
+} _cmsVCGTGAMMA;
+
+
+static
+void *Type_vcgt_Read(struct _cms_typehandler_struct* self,
+ cmsIOHANDLER* io,
+ cmsUInt32Number* nItems,
+ cmsUInt32Number SizeOfTag)
+{
+ cmsUInt32Number TagType, n, i;
+ cmsToneCurve** Curves;
+
+ *nItems = 0;
+
+ // Read tag type
+ if (!_cmsReadUInt32Number(io, &TagType)) return NULL;
+
+ // Allocate space for the array
+ Curves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));
+ if (Curves == NULL) return NULL;
+
+ // There are two possible flavors
+ switch (TagType) {
+
+ // Gamma is stored as a table
+ case cmsVideoCardGammaTableType:
+ {
+ cmsUInt16Number nChannels, nElems, nBytes;
+
+ // Check channel count, which should be 3 (we don't support monochrome this time)
+ if (!_cmsReadUInt16Number(io, &nChannels)) goto Error;
+
+ if (nChannels != 3) {
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported number of channels for VCGT '%d'", nChannels);
+ goto Error;
+ }
+
+ // Get Table element count and bytes per element
+ if (!_cmsReadUInt16Number(io, &nElems)) goto Error;
+ if (!_cmsReadUInt16Number(io, &nBytes)) goto Error;
+
+ // Adobe's quirk fixup. Fixing broken profiles...
+ if (nElems == 256 && nBytes == 1 && SizeOfTag == 1576)
+ nBytes = 2;
+
+
+ // Populate tone curves
+ for (n=0; n < 3; n++) {
+
+ Curves[n] = cmsBuildTabulatedToneCurve16(self ->ContextID, nElems, NULL);
+ if (Curves[n] == NULL) goto Error;
+
+ // On depending on byte depth
+ switch (nBytes) {
+
+ // One byte, 0..255
+ case 1:
+ for (i=0; i < nElems; i++) {
+
+ cmsUInt8Number v;
+
+ if (!_cmsReadUInt8Number(io, &v)) goto Error;
+ Curves[n] ->Table16[i] = FROM_8_TO_16(v);
+ }
+ break;
+
+ // One word 0..65535
+ case 2:
+ if (!_cmsReadUInt16Array(io, nElems, Curves[n]->Table16)) goto Error;
+ break;
+
+ // Unsupported
+ default:
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported bit depth for VCGT '%d'", nBytes * 8);
+ goto Error;
+ }
+ } // For all 3 channels
+ }
+ break;
+
+ // In this case, gamma is stored as a formula
+ case cmsVideoCardGammaFormulaType:
+ {
+ _cmsVCGTGAMMA Colorant[3];
+
+ // Populate tone curves
+ for (n=0; n < 3; n++) {
+
+ double Params[10];
+
+ if (!_cmsRead15Fixed16Number(io, &Colorant[n].Gamma)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Colorant[n].Min)) goto Error;
+ if (!_cmsRead15Fixed16Number(io, &Colorant[n].Max)) goto Error;
+
+ // Parametric curve type 5 is:
+ // Y = (aX + b)^Gamma + e | X >= d
+ // Y = cX + f | X < d
+
+ // vcgt formula is:
+ // Y = (Max ?Min) * (X ^ Gamma) + Min
+
+ // So, the translation is
+ // a = (Max ?Min) ^ ( 1 / Gamma)
+ // e = Min
+ // b=c=d=f=0
+
+ Params[0] = Colorant[n].Gamma;
+ Params[1] = pow((Colorant[n].Max - Colorant[n].Min), (1.0 / Colorant[n].Gamma));
+ Params[2] = 0;
+ Params[3] = 0;
+ Params[4] = 0;
+ Params[5] = Colorant[n].Min;
+ Params[6] = 0;
+
+ Curves[n] = cmsBuildParametricToneCurve(self ->ContextID, 5, Params);
+ if (Curves[n] == NULL) goto Error;
+ }
+ }
+ break;
+
+ // Unsupported
+ default:
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported tag type for VCGT '%d'", TagType);
+ goto Error;
+ }
+
+ *nItems = 1;
+ return (void*) Curves;
+
+// Regret, free all resources
+Error:
+
+ cmsFreeToneCurveTriple(Curves);
+ _cmsFree(self ->ContextID, Curves);
+ return NULL;
+
+ cmsUNUSED_PARAMETER(SizeOfTag);
+}
+
+
+// We don't support all flavors, only 16bits tables and formula
+static
+cmsBool Type_vcgt_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsToneCurve** Curves = (cmsToneCurve**) Ptr;
+ cmsUInt32Number i, j;
+
+ if (cmsGetToneCurveParametricType(Curves[0]) == 5 &&
+ cmsGetToneCurveParametricType(Curves[1]) == 5 &&
+ cmsGetToneCurveParametricType(Curves[2]) == 5) {
+
+ if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaFormulaType)) return FALSE;
+
+ // Save parameters
+ for (i=0; i < 3; i++) {
+
+ _cmsVCGTGAMMA v;
+
+ v.Gamma = Curves[i] ->Segments[0].Params[0];
+ v.Min = Curves[i] ->Segments[0].Params[5];
+ v.Max = pow(Curves[i] ->Segments[0].Params[1], v.Gamma) + v.Min;
+
+ if (!_cmsWrite15Fixed16Number(io, v.Gamma)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, v.Min)) return FALSE;
+ if (!_cmsWrite15Fixed16Number(io, v.Max)) return FALSE;
+ }
+ }
+
+ else {
+
+ // Always store as a table of 256 words
+ if (!_cmsWriteUInt32Number(io, cmsVideoCardGammaTableType)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 3)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 256)) return FALSE;
+ if (!_cmsWriteUInt16Number(io, 2)) return FALSE;
+
+ for (i=0; i < 3; i++) {
+ for (j=0; j < 256; j++) {
+
+ cmsFloat32Number v = cmsEvalToneCurveFloat(Curves[i], (cmsFloat32Number) (j / 255.0));
+ cmsUInt16Number n = _cmsQuickSaturateWord(v * 65535.0);
+
+ if (!_cmsWriteUInt16Number(io, n)) return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+
+ cmsUNUSED_PARAMETER(self);
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+static
+void* Type_vcgt_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ cmsToneCurve** OldCurves = (cmsToneCurve**) Ptr;
+ cmsToneCurve** NewCurves;
+
+ NewCurves = ( cmsToneCurve**) _cmsCalloc(self ->ContextID, 3, sizeof(cmsToneCurve*));
+ if (NewCurves == NULL) return NULL;
+
+ NewCurves[0] = cmsDupToneCurve(OldCurves[0]);
+ NewCurves[1] = cmsDupToneCurve(OldCurves[1]);
+ NewCurves[2] = cmsDupToneCurve(OldCurves[2]);
+
+ return (void*) NewCurves;
+
+ cmsUNUSED_PARAMETER(n);
+}
+
+
+static
+void Type_vcgt_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsFreeToneCurveTriple((cmsToneCurve**) Ptr);
+ _cmsFree(self ->ContextID, Ptr);
+}
+
+
+// ********************************************************************************
+// Type cmsSigDictType
+// ********************************************************************************
+
+// Single column of the table can point to wchar or MLUC elements. Holds arrays of data
+typedef struct {
+ cmsContext ContextID;
+ cmsUInt32Number *Offsets;
+ cmsUInt32Number *Sizes;
+} _cmsDICelem;
+
+typedef struct {
+ _cmsDICelem Name, Value, DisplayName, DisplayValue;
+
+} _cmsDICarray;
+
+// Allocate an empty array element
+static
+cmsBool AllocElem(cmsContext ContextID, _cmsDICelem* e, cmsUInt32Number Count)
+{
+ e->Offsets = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+ if (e->Offsets == NULL) return FALSE;
+
+ e->Sizes = (cmsUInt32Number *) _cmsCalloc(ContextID, Count, sizeof(cmsUInt32Number));
+ if (e->Sizes == NULL) {
+
+ _cmsFree(ContextID, e -> Offsets);
+ return FALSE;
+ }
+
+ e ->ContextID = ContextID;
+ return TRUE;
+}
+
+// Free an array element
+static
+void FreeElem(_cmsDICelem* e)
+{
+ if (e ->Offsets != NULL) _cmsFree(e -> ContextID, e -> Offsets);
+ if (e ->Sizes != NULL) _cmsFree(e -> ContextID, e -> Sizes);
+ e->Offsets = e ->Sizes = NULL;
+}
+
+// Get rid of whole array
+static
+void FreeArray( _cmsDICarray* a)
+{
+ if (a ->Name.Offsets != NULL) FreeElem(&a->Name);
+ if (a ->Value.Offsets != NULL) FreeElem(&a ->Value);
+ if (a ->DisplayName.Offsets != NULL) FreeElem(&a->DisplayName);
+ if (a ->DisplayValue.Offsets != NULL) FreeElem(&a ->DisplayValue);
+}
+
+
+// Allocate whole array
+static
+cmsBool AllocArray(cmsContext ContextID, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)
+{
+ // Empty values
+ memset(a, 0, sizeof(_cmsDICarray));
+
+ // On depending on record size, create column arrays
+ if (!AllocElem(ContextID, &a ->Name, Count)) goto Error;
+ if (!AllocElem(ContextID, &a ->Value, Count)) goto Error;
+
+ if (Length > 16) {
+ if (!AllocElem(ContextID, &a -> DisplayName, Count)) goto Error;
+
+ }
+ if (Length > 24) {
+ if (!AllocElem(ContextID, &a ->DisplayValue, Count)) goto Error;
+ }
+ return TRUE;
+
+Error:
+ FreeArray(a);
+ return FALSE;
+}
+
+// Read one element
+static
+cmsBool ReadOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsUInt32Number BaseOffset)
+{
+ if (!_cmsReadUInt32Number(io, &e->Offsets[i])) return FALSE;
+ if (!_cmsReadUInt32Number(io, &e ->Sizes[i])) return FALSE;
+
+ // An offset of zero has special meaning and shal be preserved
+ if (e ->Offsets[i] > 0)
+ e ->Offsets[i] += BaseOffset;
+ return TRUE;
+}
+
+
+static
+cmsBool ReadOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length, cmsUInt32Number BaseOffset)
+{
+ cmsUInt32Number i;
+
+ // Read column arrays
+ for (i=0; i < Count; i++) {
+
+ if (!ReadOneElem(io, &a -> Name, i, BaseOffset)) return FALSE;
+ if (!ReadOneElem(io, &a -> Value, i, BaseOffset)) return FALSE;
+
+ if (Length > 16) {
+
+ if (!ReadOneElem(io, &a ->DisplayName, i, BaseOffset)) return FALSE;
+
+ }
+
+ if (Length > 24) {
+
+ if (!ReadOneElem(io, & a -> DisplayValue, i, BaseOffset)) return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+
+// Write one element
+static
+cmsBool WriteOneElem(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i)
+{
+ if (!_cmsWriteUInt32Number(io, e->Offsets[i])) return FALSE;
+ if (!_cmsWriteUInt32Number(io, e ->Sizes[i])) return FALSE;
+
+ return TRUE;
+}
+
+static
+cmsBool WriteOffsetArray(cmsIOHANDLER* io, _cmsDICarray* a, cmsUInt32Number Count, cmsUInt32Number Length)
+{
+ cmsUInt32Number i;
+
+ for (i=0; i < Count; i++) {
+
+ if (!WriteOneElem(io, &a -> Name, i)) return FALSE;
+ if (!WriteOneElem(io, &a -> Value, i)) return FALSE;
+
+ if (Length > 16) {
+
+ if (!WriteOneElem(io, &a -> DisplayName, i)) return FALSE;
+ }
+
+ if (Length > 24) {
+
+ if (!WriteOneElem(io, &a -> DisplayValue, i)) return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static
+cmsBool ReadOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, wchar_t ** wcstr)
+{
+
+ cmsUInt32Number nChars;
+
+ // Special case for undefined strings (see ICC Votable
+ // Proposal Submission, Dictionary Type and Metadata TAG Definition)
+ if (e -> Offsets[i] == 0) {
+
+ *wcstr = NULL;
+ return TRUE;
+ }
+
+ if (!io -> Seek(io, e -> Offsets[i])) return FALSE;
+
+ nChars = e ->Sizes[i] / sizeof(cmsUInt16Number);
+
+
+ *wcstr = (wchar_t*) _cmsMallocZero(e ->ContextID, (nChars + 1) * sizeof(wchar_t));
+ if (*wcstr == NULL) return FALSE;
+
+ if (!_cmsReadWCharArray(io, nChars, *wcstr)) {
+ _cmsFree(e ->ContextID, *wcstr);
+ return FALSE;
+ }
+
+ // End of string marker
+ (*wcstr)[nChars] = 0;
+ return TRUE;
+}
+
+static
+cmsUInt32Number mywcslen(const wchar_t *s)
+{
+ const wchar_t *p;
+
+ p = s;
+ while (*p)
+ p++;
+
+ return (cmsUInt32Number)(p - s);
+}
+
+static
+cmsBool WriteOneWChar(cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const wchar_t * wcstr, cmsUInt32Number BaseOffset)
+{
+ cmsUInt32Number Before = io ->Tell(io);
+ cmsUInt32Number n;
+
+ e ->Offsets[i] = Before - BaseOffset;
+
+ if (wcstr == NULL) {
+ e ->Sizes[i] = 0;
+ e ->Offsets[i] = 0;
+ return TRUE;
+ }
+
+ n = mywcslen(wcstr);
+ if (!_cmsWriteWCharArray(io, n, wcstr)) return FALSE;
+
+ e ->Sizes[i] = io ->Tell(io) - Before;
+ return TRUE;
+}
+
+static
+cmsBool ReadOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, cmsMLU** mlu)
+{
+ cmsUInt32Number nItems = 0;
+
+ // A way to get null MLUCs
+ if (e -> Offsets[i] == 0 || e ->Sizes[i] == 0) {
+
+ *mlu = NULL;
+ return TRUE;
+ }
+
+ if (!io -> Seek(io, e -> Offsets[i])) return FALSE;
+
+ *mlu = (cmsMLU*) Type_MLU_Read(self, io, &nItems, e ->Sizes[i]);
+ return *mlu != NULL;
+}
+
+static
+cmsBool WriteOneMLUC(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, _cmsDICelem* e, cmsUInt32Number i, const cmsMLU* mlu, cmsUInt32Number BaseOffset)
+{
+ cmsUInt32Number Before;
+
+ // Special case for undefined strings (see ICC Votable
+ // Proposal Submission, Dictionary Type and Metadata TAG Definition)
+ if (mlu == NULL) {
+ e ->Sizes[i] = 0;
+ e ->Offsets[i] = 0;
+ return TRUE;
+ }
+
+ Before = io ->Tell(io);
+ e ->Offsets[i] = Before - BaseOffset;
+
+ if (!Type_MLU_Write(self, io, (void*) mlu, 1)) return FALSE;
+
+ e ->Sizes[i] = io ->Tell(io) - Before;
+ return TRUE;
+}
+
+
+static
+void *Type_Dictionary_Read(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, cmsUInt32Number* nItems, cmsUInt32Number SizeOfTag)
+{
+ cmsHANDLE hDict;
+ cmsUInt32Number i, Count, Length;
+ cmsUInt32Number BaseOffset;
+ _cmsDICarray a;
+ wchar_t *NameWCS = NULL, *ValueWCS = NULL;
+ cmsMLU *DisplayNameMLU = NULL, *DisplayValueMLU=NULL;
+ cmsBool rc;
+
+ *nItems = 0;
+
+ // Get actual position as a basis for element offsets
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // Get name-value record count
+ if (!_cmsReadUInt32Number(io, &Count)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ // Get rec length
+ if (!_cmsReadUInt32Number(io, &Length)) return NULL;
+ SizeOfTag -= sizeof(cmsUInt32Number);
+
+ // Check for valid lengths
+ if (Length != 16 && Length != 24 && Length != 32) {
+ cmsSignalError(self->ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unknown record length in dictionary '%d'", Length);
+ return NULL;
+ }
+
+ // Creates an empty dictionary
+ hDict = cmsDictAlloc(self -> ContextID);
+ if (hDict == NULL) return NULL;
+
+ // On depending on record size, create column arrays
+ if (!AllocArray(self -> ContextID, &a, Count, Length)) goto Error;
+
+ // Read column arrays
+ if (!ReadOffsetArray(io, &a, Count, Length, BaseOffset)) goto Error;
+
+ // Seek to each element and read it
+ for (i=0; i < Count; i++) {
+
+ if (!ReadOneWChar(io, &a.Name, i, &NameWCS)) goto Error;
+ if (!ReadOneWChar(io, &a.Value, i, &ValueWCS)) goto Error;
+
+ if (Length > 16) {
+ if (!ReadOneMLUC(self, io, &a.DisplayName, i, &DisplayNameMLU)) goto Error;
+ }
+
+ if (Length > 24) {
+ if (!ReadOneMLUC(self, io, &a.DisplayValue, i, &DisplayValueMLU)) goto Error;
+ }
+
+ if (NameWCS == NULL || ValueWCS == NULL) {
+
+ cmsSignalError(self->ContextID, cmsERROR_CORRUPTION_DETECTED, "Bad dictionary Name/Value");
+ rc = FALSE;
+ }
+ else {
+
+ rc = cmsDictAddEntry(hDict, NameWCS, ValueWCS, DisplayNameMLU, DisplayValueMLU);
+ }
+
+ if (NameWCS != NULL) _cmsFree(self ->ContextID, NameWCS);
+ if (ValueWCS != NULL) _cmsFree(self ->ContextID, ValueWCS);
+ if (DisplayNameMLU != NULL) cmsMLUfree(DisplayNameMLU);
+ if (DisplayValueMLU != NULL) cmsMLUfree(DisplayValueMLU);
+
+ if (!rc) goto Error;
+ }
+
+ FreeArray(&a);
+ *nItems = 1;
+ return (void*) hDict;
+
+Error:
+ FreeArray(&a);
+ cmsDictFree(hDict);
+ return NULL;
+}
+
+
+static
+cmsBool Type_Dictionary_Write(struct _cms_typehandler_struct* self, cmsIOHANDLER* io, void* Ptr, cmsUInt32Number nItems)
+{
+ cmsHANDLE hDict = (cmsHANDLE) Ptr;
+ const cmsDICTentry* p;
+ cmsBool AnyName, AnyValue;
+ cmsUInt32Number i, Count, Length;
+ cmsUInt32Number DirectoryPos, CurrentPos, BaseOffset;
+ _cmsDICarray a;
+
+ if (hDict == NULL) return FALSE;
+
+ BaseOffset = io ->Tell(io) - sizeof(_cmsTagBase);
+
+ // Let's inspect the dictionary
+ Count = 0; AnyName = FALSE; AnyValue = FALSE;
+ for (p = cmsDictGetEntryList(hDict); p != NULL; p = cmsDictNextEntry(p)) {
+
+ if (p ->DisplayName != NULL) AnyName = TRUE;
+ if (p ->DisplayValue != NULL) AnyValue = TRUE;
+ Count++;
+ }
+
+ Length = 16;
+ if (AnyName) Length += 8;
+ if (AnyValue) Length += 8;
+
+ if (!_cmsWriteUInt32Number(io, Count)) return FALSE;
+ if (!_cmsWriteUInt32Number(io, Length)) return FALSE;
+
+ // Keep starting position of offsets table
+ DirectoryPos = io ->Tell(io);
+
+ // Allocate offsets array
+ if (!AllocArray(self ->ContextID, &a, Count, Length)) goto Error;
+
+ // Write a fake directory to be filled latter on
+ if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;
+
+ // Write each element. Keep track of the size as well.
+ p = cmsDictGetEntryList(hDict);
+ for (i=0; i < Count; i++) {
+
+ if (!WriteOneWChar(io, &a.Name, i, p ->Name, BaseOffset)) goto Error;
+ if (!WriteOneWChar(io, &a.Value, i, p ->Value, BaseOffset)) goto Error;
+
+ if (p ->DisplayName != NULL) {
+ if (!WriteOneMLUC(self, io, &a.DisplayName, i, p ->DisplayName, BaseOffset)) goto Error;
+ }
+
+ if (p ->DisplayValue != NULL) {
+ if (!WriteOneMLUC(self, io, &a.DisplayValue, i, p ->DisplayValue, BaseOffset)) goto Error;
+ }
+
+ p = cmsDictNextEntry(p);
+ }
+
+ // Write the directory
+ CurrentPos = io ->Tell(io);
+ if (!io ->Seek(io, DirectoryPos)) goto Error;
+
+ if (!WriteOffsetArray(io, &a, Count, Length)) goto Error;
+
+ if (!io ->Seek(io, CurrentPos)) goto Error;
+
+ FreeArray(&a);
+ return TRUE;
+
+Error:
+ FreeArray(&a);
+ return FALSE;
+
+ cmsUNUSED_PARAMETER(nItems);
+}
+
+
+static
+void* Type_Dictionary_Dup(struct _cms_typehandler_struct* self, const void *Ptr, cmsUInt32Number n)
+{
+ return (void*) cmsDictDup((cmsHANDLE) Ptr);
+
+ cmsUNUSED_PARAMETER(n);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+static
+void Type_Dictionary_Free(struct _cms_typehandler_struct* self, void* Ptr)
+{
+ cmsDictFree((cmsHANDLE) Ptr);
+ cmsUNUSED_PARAMETER(self);
+}
+
+
+// ********************************************************************************
+// Type support main routines
+// ********************************************************************************
+
+
+// This is the list of built-in types
+static _cmsTagTypeLinkedList SupportedTagTypes[] = {
+
+{TYPE_HANDLER(cmsSigChromaticityType, Chromaticity), &SupportedTagTypes[1] },
+{TYPE_HANDLER(cmsSigColorantOrderType, ColorantOrderType), &SupportedTagTypes[2] },
+{TYPE_HANDLER(cmsSigS15Fixed16ArrayType, S15Fixed16), &SupportedTagTypes[3] },
+{TYPE_HANDLER(cmsSigU16Fixed16ArrayType, U16Fixed16), &SupportedTagTypes[4] },
+{TYPE_HANDLER(cmsSigTextType, Text), &SupportedTagTypes[5] },
+{TYPE_HANDLER(cmsSigTextDescriptionType, Text_Description), &SupportedTagTypes[6] },
+{TYPE_HANDLER(cmsSigCurveType, Curve), &SupportedTagTypes[7] },
+{TYPE_HANDLER(cmsSigParametricCurveType, ParametricCurve), &SupportedTagTypes[8] },
+{TYPE_HANDLER(cmsSigDateTimeType, DateTime), &SupportedTagTypes[9] },
+{TYPE_HANDLER(cmsSigLut8Type, LUT8), &SupportedTagTypes[10] },
+{TYPE_HANDLER(cmsSigLut16Type, LUT16), &SupportedTagTypes[11] },
+{TYPE_HANDLER(cmsSigColorantTableType, ColorantTable), &SupportedTagTypes[12] },
+{TYPE_HANDLER(cmsSigNamedColor2Type, NamedColor), &SupportedTagTypes[13] },
+{TYPE_HANDLER(cmsSigMultiLocalizedUnicodeType, MLU), &SupportedTagTypes[14] },
+{TYPE_HANDLER(cmsSigProfileSequenceDescType, ProfileSequenceDesc), &SupportedTagTypes[15] },
+{TYPE_HANDLER(cmsSigSignatureType, Signature), &SupportedTagTypes[16] },
+{TYPE_HANDLER(cmsSigMeasurementType, Measurement), &SupportedTagTypes[17] },
+{TYPE_HANDLER(cmsSigDataType, Data), &SupportedTagTypes[18] },
+{TYPE_HANDLER(cmsSigLutAtoBType, LUTA2B), &SupportedTagTypes[19] },
+{TYPE_HANDLER(cmsSigLutBtoAType, LUTB2A), &SupportedTagTypes[20] },
+{TYPE_HANDLER(cmsSigUcrBgType, UcrBg), &SupportedTagTypes[21] },
+{TYPE_HANDLER(cmsSigCrdInfoType, CrdInfo), &SupportedTagTypes[22] },
+{TYPE_HANDLER(cmsSigMultiProcessElementType, MPE), &SupportedTagTypes[23] },
+{TYPE_HANDLER(cmsSigScreeningType, Screening), &SupportedTagTypes[24] },
+{TYPE_HANDLER(cmsSigViewingConditionsType, ViewingConditions), &SupportedTagTypes[25] },
+{TYPE_HANDLER(cmsSigXYZType, XYZ), &SupportedTagTypes[26] },
+{TYPE_HANDLER(cmsCorbisBrokenXYZtype, XYZ), &SupportedTagTypes[27] },
+{TYPE_HANDLER(cmsMonacoBrokenCurveType, Curve), &SupportedTagTypes[28] },
+{TYPE_HANDLER(cmsSigProfileSequenceIdType, ProfileSequenceId), &SupportedTagTypes[29] },
+{TYPE_HANDLER(cmsSigDictType, Dictionary), &SupportedTagTypes[30] },
+{TYPE_HANDLER(cmsSigVcgtType, vcgt), NULL }
+};
+
+
+_cmsTagTypePluginChunkType _cmsTagTypePluginChunk = { NULL };
+
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupTagTypeList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src,
+ int loc)
+{
+ _cmsTagTypePluginChunkType newHead = { NULL };
+ _cmsTagTypeLinkedList* entry;
+ _cmsTagTypeLinkedList* Anterior = NULL;
+ _cmsTagTypePluginChunkType* head = (_cmsTagTypePluginChunkType*) src->chunks[loc];
+
+ // Walk the list copying all nodes
+ for (entry = head->TagTypes;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ _cmsTagTypeLinkedList *newEntry = ( _cmsTagTypeLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagTypeLinkedList));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.TagTypes == NULL)
+ newHead.TagTypes = newEntry;
+ }
+
+ ctx ->chunks[loc] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagTypePluginChunkType));
+}
+
+
+void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ // Duplicate the LIST
+ DupTagTypeList(ctx, src, TagTypePlugin);
+ }
+ else {
+ static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };
+ ctx ->chunks[TagTypePlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));
+ }
+}
+
+void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ // Duplicate the LIST
+ DupTagTypeList(ctx, src, MPEPlugin);
+ }
+ else {
+ static _cmsTagTypePluginChunkType TagTypePluginChunk = { NULL };
+ ctx ->chunks[MPEPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagTypePluginChunk, sizeof(_cmsTagTypePluginChunkType));
+ }
+
+}
+
+
+// Both kind of plug-ins share same structure
+cmsBool _cmsRegisterTagTypePlugin(cmsContext id, cmsPluginBase* Data)
+{
+ return RegisterTypesPlugin(id, Data, TagTypePlugin);
+}
+
+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext id, cmsPluginBase* Data)
+{
+ return RegisterTypesPlugin(id, Data,MPEPlugin);
+}
+
+
+// Wrapper for tag types
+cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig)
+{
+ _cmsTagTypePluginChunkType* ctx = ( _cmsTagTypePluginChunkType*) _cmsContextGetClientChunk(ContextID, TagTypePlugin);
+
+ return GetHandler(sig, ctx->TagTypes, SupportedTagTypes);
+}
+
+// ********************************************************************************
+// Tag support main routines
+// ********************************************************************************
+
+typedef struct _cmsTagLinkedList_st {
+
+ cmsTagSignature Signature;
+ cmsTagDescriptor Descriptor;
+ struct _cmsTagLinkedList_st* Next;
+
+} _cmsTagLinkedList;
+
+// This is the list of built-in tags
+static _cmsTagLinkedList SupportedTags[] = {
+
+ { cmsSigAToB0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[1]},
+ { cmsSigAToB1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[2]},
+ { cmsSigAToB2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutAtoBType, cmsSigLut8Type}, DecideLUTtypeA2B}, &SupportedTags[3]},
+ { cmsSigBToA0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[4]},
+ { cmsSigBToA1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[5]},
+ { cmsSigBToA2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type}, DecideLUTtypeB2A}, &SupportedTags[6]},
+
+ // Allow corbis and its broken XYZ type
+ { cmsSigRedColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[7]},
+ { cmsSigGreenColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[8]},
+ { cmsSigBlueColorantTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, DecideXYZtype}, &SupportedTags[9]},
+
+ { cmsSigRedTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[10]},
+ { cmsSigGreenTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[11]},
+ { cmsSigBlueTRCTag, { 1, 3, { cmsSigCurveType, cmsSigParametricCurveType, cmsMonacoBrokenCurveType }, DecideCurveType}, &SupportedTags[12]},
+
+ { cmsSigCalibrationDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[13]},
+ { cmsSigCharTargetTag, { 1, 1, { cmsSigTextType }, NULL}, &SupportedTags[14]},
+
+ { cmsSigChromaticAdaptationTag, { 9, 1, { cmsSigS15Fixed16ArrayType }, NULL}, &SupportedTags[15]},
+ { cmsSigChromaticityTag, { 1, 1, { cmsSigChromaticityType }, NULL}, &SupportedTags[16]},
+ { cmsSigColorantOrderTag, { 1, 1, { cmsSigColorantOrderType }, NULL}, &SupportedTags[17]},
+ { cmsSigColorantTableTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[18]},
+ { cmsSigColorantTableOutTag, { 1, 1, { cmsSigColorantTableType }, NULL}, &SupportedTags[19]},
+
+ { cmsSigCopyrightTag, { 1, 3, { cmsSigTextType, cmsSigMultiLocalizedUnicodeType, cmsSigTextDescriptionType}, DecideTextType}, &SupportedTags[20]},
+ { cmsSigDateTimeTag, { 1, 1, { cmsSigDateTimeType }, NULL}, &SupportedTags[21]},
+
+ { cmsSigDeviceMfgDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[22]},
+ { cmsSigDeviceModelDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[23]},
+
+ { cmsSigGamutTag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[24]},
+
+ { cmsSigGrayTRCTag, { 1, 2, { cmsSigCurveType, cmsSigParametricCurveType }, DecideCurveType}, &SupportedTags[25]},
+ { cmsSigLuminanceTag, { 1, 1, { cmsSigXYZType }, NULL}, &SupportedTags[26]},
+
+ { cmsSigMediaBlackPointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[27]},
+ { cmsSigMediaWhitePointTag, { 1, 2, { cmsSigXYZType, cmsCorbisBrokenXYZtype }, NULL}, &SupportedTags[28]},
+
+ { cmsSigNamedColor2Tag, { 1, 1, { cmsSigNamedColor2Type }, NULL}, &SupportedTags[29]},
+
+ { cmsSigPreview0Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[30]},
+ { cmsSigPreview1Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[31]},
+ { cmsSigPreview2Tag, { 1, 3, { cmsSigLut16Type, cmsSigLutBtoAType, cmsSigLut8Type }, DecideLUTtypeB2A}, &SupportedTags[32]},
+
+ { cmsSigProfileDescriptionTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[33]},
+ { cmsSigProfileSequenceDescTag, { 1, 1, { cmsSigProfileSequenceDescType }, NULL}, &SupportedTags[34]},
+ { cmsSigTechnologyTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[35]},
+
+ { cmsSigColorimetricIntentImageStateTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[36]},
+ { cmsSigPerceptualRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[37]},
+ { cmsSigSaturationRenderingIntentGamutTag, { 1, 1, { cmsSigSignatureType }, NULL}, &SupportedTags[38]},
+
+ { cmsSigMeasurementTag, { 1, 1, { cmsSigMeasurementType }, NULL}, &SupportedTags[39]},
+
+ { cmsSigPs2CRD0Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[40]},
+ { cmsSigPs2CRD1Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[41]},
+ { cmsSigPs2CRD2Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[42]},
+ { cmsSigPs2CRD3Tag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[43]},
+ { cmsSigPs2CSATag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[44]},
+ { cmsSigPs2RenderingIntentTag, { 1, 1, { cmsSigDataType }, NULL}, &SupportedTags[45]},
+
+ { cmsSigViewingCondDescTag, { 1, 3, { cmsSigTextDescriptionType, cmsSigMultiLocalizedUnicodeType, cmsSigTextType}, DecideTextDescType}, &SupportedTags[46]},
+
+ { cmsSigUcrBgTag, { 1, 1, { cmsSigUcrBgType}, NULL}, &SupportedTags[47]},
+ { cmsSigCrdInfoTag, { 1, 1, { cmsSigCrdInfoType}, NULL}, &SupportedTags[48]},
+
+ { cmsSigDToB0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[49]},
+ { cmsSigDToB1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[50]},
+ { cmsSigDToB2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[51]},
+ { cmsSigDToB3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[52]},
+ { cmsSigBToD0Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[53]},
+ { cmsSigBToD1Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[54]},
+ { cmsSigBToD2Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[55]},
+ { cmsSigBToD3Tag, { 1, 1, { cmsSigMultiProcessElementType}, NULL}, &SupportedTags[56]},
+
+ { cmsSigScreeningDescTag, { 1, 1, { cmsSigTextDescriptionType }, NULL}, &SupportedTags[57]},
+ { cmsSigViewingConditionsTag, { 1, 1, { cmsSigViewingConditionsType }, NULL}, &SupportedTags[58]},
+
+ { cmsSigScreeningTag, { 1, 1, { cmsSigScreeningType}, NULL }, &SupportedTags[59]},
+ { cmsSigVcgtTag, { 1, 1, { cmsSigVcgtType}, NULL }, &SupportedTags[60]},
+ { cmsSigMetaTag, { 1, 1, { cmsSigDictType}, NULL }, &SupportedTags[61]},
+ { cmsSigProfileSequenceIdTag, { 1, 1, { cmsSigProfileSequenceIdType}, NULL }, &SupportedTags[62]},
+ { cmsSigProfileDescriptionMLTag,{ 1, 1, { cmsSigMultiLocalizedUnicodeType}, NULL}, NULL}
+
+
+};
+
+/*
+ Not supported Why
+ ======================= =========================================
+ cmsSigOutputResponseTag ==> WARNING, POSSIBLE PATENT ON THIS SUBJECT!
+ cmsSigNamedColorTag ==> Deprecated
+ cmsSigDataTag ==> Ancient, unused
+ cmsSigDeviceSettingsTag ==> Deprecated, useless
+*/
+
+
+_cmsTagPluginChunkType _cmsTagPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupTagList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsTagPluginChunkType newHead = { NULL };
+ _cmsTagLinkedList* entry;
+ _cmsTagLinkedList* Anterior = NULL;
+ _cmsTagPluginChunkType* head = (_cmsTagPluginChunkType*) src->chunks[TagPlugin];
+
+ // Walk the list copying all nodes
+ for (entry = head->Tag;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ _cmsTagLinkedList *newEntry = ( _cmsTagLinkedList *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTagLinkedList));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.Tag == NULL)
+ newHead.Tag = newEntry;
+ }
+
+ ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTagPluginChunkType));
+}
+
+void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ DupTagList(ctx, src);
+ }
+ else {
+ static _cmsTagPluginChunkType TagPluginChunk = { NULL };
+ ctx ->chunks[TagPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TagPluginChunk, sizeof(_cmsTagPluginChunkType));
+ }
+
+}
+
+cmsBool _cmsRegisterTagPlugin(cmsContext id, cmsPluginBase* Data)
+{
+ cmsPluginTag* Plugin = (cmsPluginTag*) Data;
+ _cmsTagLinkedList *pt;
+ _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(id, TagPlugin);
+
+ if (Data == NULL) {
+
+ TagPluginChunk->Tag = NULL;
+ return TRUE;
+ }
+
+ pt = (_cmsTagLinkedList*) _cmsPluginMalloc(id, sizeof(_cmsTagLinkedList));
+ if (pt == NULL) return FALSE;
+
+ pt ->Signature = Plugin ->Signature;
+ pt ->Descriptor = Plugin ->Descriptor;
+ pt ->Next = TagPluginChunk ->Tag;
+
+ TagPluginChunk ->Tag = pt;
+
+ return TRUE;
+}
+
+// Return a descriptor for a given tag or NULL
+cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig)
+{
+ _cmsTagLinkedList* pt;
+ _cmsTagPluginChunkType* TagPluginChunk = ( _cmsTagPluginChunkType*) _cmsContextGetClientChunk(ContextID, TagPlugin);
+
+ for (pt = TagPluginChunk->Tag;
+ pt != NULL;
+ pt = pt ->Next) {
+
+ if (sig == pt -> Signature) return &pt ->Descriptor;
+ }
+
+ for (pt = SupportedTags;
+ pt != NULL;
+ pt = pt ->Next) {
+
+ if (sig == pt -> Signature) return &pt ->Descriptor;
+ }
+
+ return NULL;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c
new file mode 100644
index 0000000000..b324c9902a
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsvirt.c
@@ -0,0 +1,1194 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Virtual (built-in) profiles
+// -----------------------------------------------------------------------------------
+
+static
+cmsBool SetTextTags(cmsHPROFILE hProfile, const wchar_t* Description)
+{
+ cmsMLU *DescriptionMLU, *CopyrightMLU;
+ cmsBool rc = FALSE;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+
+ DescriptionMLU = cmsMLUalloc(ContextID, 1);
+ CopyrightMLU = cmsMLUalloc(ContextID, 1);
+
+ if (DescriptionMLU == NULL || CopyrightMLU == NULL) goto Error;
+
+ if (!cmsMLUsetWide(DescriptionMLU, "en", "US", Description)) goto Error;
+ if (!cmsMLUsetWide(CopyrightMLU, "en", "US", L"No copyright, use freely")) goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigProfileDescriptionTag, DescriptionMLU)) goto Error;
+ if (!cmsWriteTag(hProfile, cmsSigCopyrightTag, CopyrightMLU)) goto Error;
+
+ rc = TRUE;
+
+Error:
+
+ if (DescriptionMLU)
+ cmsMLUfree(DescriptionMLU);
+ if (CopyrightMLU)
+ cmsMLUfree(CopyrightMLU);
+ return rc;
+}
+
+
+static
+cmsBool SetSeqDescTag(cmsHPROFILE hProfile, const char* Model)
+{
+ cmsBool rc = FALSE;
+ cmsContext ContextID = cmsGetProfileContextID(hProfile);
+ cmsSEQ* Seq = cmsAllocProfileSequenceDescription(ContextID, 1);
+
+ if (Seq == NULL) return FALSE;
+
+ Seq->seq[0].deviceMfg = (cmsSignature) 0;
+ Seq->seq[0].deviceModel = (cmsSignature) 0;
+
+#ifdef CMS_DONT_USE_INT64
+ Seq->seq[0].attributes[0] = 0;
+ Seq->seq[0].attributes[1] = 0;
+#else
+ Seq->seq[0].attributes = 0;
+#endif
+
+ Seq->seq[0].technology = (cmsTechnologySignature) 0;
+
+ cmsMLUsetASCII( Seq->seq[0].Manufacturer, cmsNoLanguage, cmsNoCountry, "Little CMS");
+ cmsMLUsetASCII( Seq->seq[0].Model, cmsNoLanguage, cmsNoCountry, Model);
+
+ if (!_cmsWriteProfileSequence(hProfile, Seq)) goto Error;
+
+ rc = TRUE;
+
+Error:
+ if (Seq)
+ cmsFreeProfileSequenceDescription(Seq);
+
+ return rc;
+}
+
+
+
+// This function creates a profile based on White point, primaries and
+// transfer functions.
+cmsHPROFILE CMSEXPORT cmsCreateRGBProfileTHR(cmsContext ContextID,
+ const cmsCIExyY* WhitePoint,
+ const cmsCIExyYTRIPLE* Primaries,
+ cmsToneCurve* const TransferFunction[3])
+{
+ cmsHPROFILE hICC;
+ cmsMAT3 MColorants;
+ cmsCIEXYZTRIPLE Colorants;
+ cmsCIExyY MaxWhite;
+ cmsMAT3 CHAD;
+ cmsCIEXYZ WhitePointXYZ;
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC) // can't allocate
+ return NULL;
+
+ cmsSetProfileVersion(hICC, 4.3);
+
+ cmsSetDeviceClass(hICC, cmsSigDisplayClass);
+ cmsSetColorSpace(hICC, cmsSigRgbData);
+ cmsSetPCS(hICC, cmsSigXYZData);
+
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Implement profile using following tags:
+ //
+ // 1 cmsSigProfileDescriptionTag
+ // 2 cmsSigMediaWhitePointTag
+ // 3 cmsSigRedColorantTag
+ // 4 cmsSigGreenColorantTag
+ // 5 cmsSigBlueColorantTag
+ // 6 cmsSigRedTRCTag
+ // 7 cmsSigGreenTRCTag
+ // 8 cmsSigBlueTRCTag
+ // 9 Chromatic adaptation Tag
+ // This conforms a standard RGB DisplayProfile as says ICC, and then I add (As per addendum II)
+ // 10 cmsSigChromaticityTag
+
+
+ if (!SetTextTags(hICC, L"RGB built-in")) goto Error;
+
+ if (WhitePoint) {
+
+ if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
+
+ cmsxyY2XYZ(&WhitePointXYZ, WhitePoint);
+ _cmsAdaptationMatrix(&CHAD, NULL, &WhitePointXYZ, cmsD50_XYZ());
+
+ // This is a V4 tag, but many CMM does read and understand it no matter which version
+ if (!cmsWriteTag(hICC, cmsSigChromaticAdaptationTag, (void*) &CHAD)) goto Error;
+ }
+
+ if (WhitePoint && Primaries) {
+
+ MaxWhite.x = WhitePoint -> x;
+ MaxWhite.y = WhitePoint -> y;
+ MaxWhite.Y = 1.0;
+
+ if (!_cmsBuildRGB2XYZtransferMatrix(&MColorants, &MaxWhite, Primaries)) goto Error;
+
+ Colorants.Red.X = MColorants.v[0].n[0];
+ Colorants.Red.Y = MColorants.v[1].n[0];
+ Colorants.Red.Z = MColorants.v[2].n[0];
+
+ Colorants.Green.X = MColorants.v[0].n[1];
+ Colorants.Green.Y = MColorants.v[1].n[1];
+ Colorants.Green.Z = MColorants.v[2].n[1];
+
+ Colorants.Blue.X = MColorants.v[0].n[2];
+ Colorants.Blue.Y = MColorants.v[1].n[2];
+ Colorants.Blue.Z = MColorants.v[2].n[2];
+
+ if (!cmsWriteTag(hICC, cmsSigRedColorantTag, (void*) &Colorants.Red)) goto Error;
+ if (!cmsWriteTag(hICC, cmsSigBlueColorantTag, (void*) &Colorants.Blue)) goto Error;
+ if (!cmsWriteTag(hICC, cmsSigGreenColorantTag, (void*) &Colorants.Green)) goto Error;
+ }
+
+
+ if (TransferFunction) {
+
+ // Tries to minimize space. Thanks to Richard Hughes for this nice idea
+ if (!cmsWriteTag(hICC, cmsSigRedTRCTag, (void*) TransferFunction[0])) goto Error;
+
+ if (TransferFunction[1] == TransferFunction[0]) {
+
+ if (!cmsLinkTag (hICC, cmsSigGreenTRCTag, cmsSigRedTRCTag)) goto Error;
+
+ } else {
+
+ if (!cmsWriteTag(hICC, cmsSigGreenTRCTag, (void*) TransferFunction[1])) goto Error;
+ }
+
+ if (TransferFunction[2] == TransferFunction[0]) {
+
+ if (!cmsLinkTag (hICC, cmsSigBlueTRCTag, cmsSigRedTRCTag)) goto Error;
+
+ } else {
+
+ if (!cmsWriteTag(hICC, cmsSigBlueTRCTag, (void*) TransferFunction[2])) goto Error;
+ }
+ }
+
+ if (Primaries) {
+ if (!cmsWriteTag(hICC, cmsSigChromaticityTag, (void*) Primaries)) goto Error;
+ }
+
+
+ return hICC;
+
+Error:
+ if (hICC)
+ cmsCloseProfile(hICC);
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateRGBProfile(const cmsCIExyY* WhitePoint,
+ const cmsCIExyYTRIPLE* Primaries,
+ cmsToneCurve* const TransferFunction[3])
+{
+ return cmsCreateRGBProfileTHR(NULL, WhitePoint, Primaries, TransferFunction);
+}
+
+
+
+// This function creates a profile based on White point and transfer function.
+cmsHPROFILE CMSEXPORT cmsCreateGrayProfileTHR(cmsContext ContextID,
+ const cmsCIExyY* WhitePoint,
+ const cmsToneCurve* TransferFunction)
+{
+ cmsHPROFILE hICC;
+ cmsCIEXYZ tmp;
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC) // can't allocate
+ return NULL;
+
+ cmsSetProfileVersion(hICC, 4.3);
+
+ cmsSetDeviceClass(hICC, cmsSigDisplayClass);
+ cmsSetColorSpace(hICC, cmsSigGrayData);
+ cmsSetPCS(hICC, cmsSigXYZData);
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Implement profile using following tags:
+ //
+ // 1 cmsSigProfileDescriptionTag
+ // 2 cmsSigMediaWhitePointTag
+ // 3 cmsSigGrayTRCTag
+
+ // This conforms a standard Gray DisplayProfile
+
+ // Fill-in the tags
+
+ if (!SetTextTags(hICC, L"gray built-in")) goto Error;
+
+
+ if (WhitePoint) {
+
+ cmsxyY2XYZ(&tmp, WhitePoint);
+ if (!cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) &tmp)) goto Error;
+ }
+
+ if (TransferFunction) {
+
+ if (!cmsWriteTag(hICC, cmsSigGrayTRCTag, (void*) TransferFunction)) goto Error;
+ }
+
+ return hICC;
+
+Error:
+ if (hICC)
+ cmsCloseProfile(hICC);
+ return NULL;
+}
+
+
+
+cmsHPROFILE CMSEXPORT cmsCreateGrayProfile(const cmsCIExyY* WhitePoint,
+ const cmsToneCurve* TransferFunction)
+{
+ return cmsCreateGrayProfileTHR(NULL, WhitePoint, TransferFunction);
+}
+
+// This is a devicelink operating in the target colorspace with as many transfer functions as components
+
+cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLinkTHR(cmsContext ContextID,
+ cmsColorSpaceSignature ColorSpace,
+ cmsToneCurve* const TransferFunctions[])
+{
+ cmsHPROFILE hICC;
+ cmsPipeline* Pipeline;
+ int nChannels;
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC)
+ return NULL;
+
+ cmsSetProfileVersion(hICC, 4.3);
+
+ cmsSetDeviceClass(hICC, cmsSigLinkClass);
+ cmsSetColorSpace(hICC, ColorSpace);
+ cmsSetPCS(hICC, ColorSpace);
+
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+ // Set up channels
+ nChannels = cmsChannelsOf(ColorSpace);
+
+ // Creates a Pipeline with prelinearization step only
+ Pipeline = cmsPipelineAlloc(ContextID, nChannels, nChannels);
+ if (Pipeline == NULL) goto Error;
+
+
+ // Copy tables to Pipeline
+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_BEGIN, cmsStageAllocToneCurves(ContextID, nChannels, TransferFunctions)))
+ goto Error;
+
+ // Create tags
+ if (!SetTextTags(hICC, L"Linearization built-in")) goto Error;
+ if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline)) goto Error;
+ if (!SetSeqDescTag(hICC, "Linearization built-in")) goto Error;
+
+ // Pipeline is already on virtual profile
+ cmsPipelineFree(Pipeline);
+
+ // Ok, done
+ return hICC;
+
+Error:
+ cmsPipelineFree(Pipeline);
+ if (hICC)
+ cmsCloseProfile(hICC);
+
+
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateLinearizationDeviceLink(cmsColorSpaceSignature ColorSpace,
+ cmsToneCurve* const TransferFunctions[])
+{
+ return cmsCreateLinearizationDeviceLinkTHR(NULL, ColorSpace, TransferFunctions);
+}
+
+// Ink-limiting algorithm
+//
+// Sum = C + M + Y + K
+// If Sum > InkLimit
+// Ratio= 1 - (Sum - InkLimit) / (C + M + Y)
+// if Ratio <0
+// Ratio=0
+// endif
+// Else
+// Ratio=1
+// endif
+//
+// C = Ratio * C
+// M = Ratio * M
+// Y = Ratio * Y
+// K: Does not change
+
+static
+int InkLimitingSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ cmsFloat64Number InkLimit = *(cmsFloat64Number *) Cargo;
+ cmsFloat64Number SumCMY, SumCMYK, Ratio;
+
+ InkLimit = (InkLimit * 655.35);
+
+ SumCMY = In[0] + In[1] + In[2];
+ SumCMYK = SumCMY + In[3];
+
+ if (SumCMYK > InkLimit) {
+
+ Ratio = 1 - ((SumCMYK - InkLimit) / SumCMY);
+ if (Ratio < 0)
+ Ratio = 0;
+ }
+ else Ratio = 1;
+
+ Out[0] = _cmsQuickSaturateWord(In[0] * Ratio); // C
+ Out[1] = _cmsQuickSaturateWord(In[1] * Ratio); // M
+ Out[2] = _cmsQuickSaturateWord(In[2] * Ratio); // Y
+
+ Out[3] = In[3]; // K (untouched)
+
+ return TRUE;
+}
+
+// This is a devicelink operating in CMYK for ink-limiting
+
+cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLinkTHR(cmsContext ContextID,
+ cmsColorSpaceSignature ColorSpace,
+ cmsFloat64Number Limit)
+{
+ cmsHPROFILE hICC;
+ cmsPipeline* LUT;
+ cmsStage* CLUT;
+ int nChannels;
+
+ if (ColorSpace != cmsSigCmykData) {
+ cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "InkLimiting: Only CMYK currently supported");
+ return NULL;
+ }
+
+ if (Limit < 0.0 || Limit > 400) {
+
+ cmsSignalError(ContextID, cmsERROR_RANGE, "InkLimiting: Limit should be between 0..400");
+ if (Limit < 0) Limit = 0;
+ if (Limit > 400) Limit = 400;
+
+ }
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC) // can't allocate
+ return NULL;
+
+ cmsSetProfileVersion(hICC, 4.3);
+
+ cmsSetDeviceClass(hICC, cmsSigLinkClass);
+ cmsSetColorSpace(hICC, ColorSpace);
+ cmsSetPCS(hICC, ColorSpace);
+
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+
+ // Creates a Pipeline with 3D grid only
+ LUT = cmsPipelineAlloc(ContextID, 4, 4);
+ if (LUT == NULL) goto Error;
+
+
+ nChannels = cmsChannelsOf(ColorSpace);
+
+ CLUT = cmsStageAllocCLut16bit(ContextID, 17, nChannels, nChannels, NULL);
+ if (CLUT == NULL) goto Error;
+
+ if (!cmsStageSampleCLut16bit(CLUT, InkLimitingSampler, (void*) &Limit, 0)) goto Error;
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, nChannels)) ||
+ !cmsPipelineInsertStage(LUT, cmsAT_END, CLUT) ||
+ !cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, nChannels)))
+ goto Error;
+
+ // Create tags
+ if (!SetTextTags(hICC, L"ink-limiting built-in")) goto Error;
+
+ if (!cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) LUT)) goto Error;
+ if (!SetSeqDescTag(hICC, "ink-limiting built-in")) goto Error;
+
+ // cmsPipeline is already on virtual profile
+ cmsPipelineFree(LUT);
+
+ // Ok, done
+ return hICC;
+
+Error:
+ if (LUT != NULL)
+ cmsPipelineFree(LUT);
+
+ if (hICC != NULL)
+ cmsCloseProfile(hICC);
+
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateInkLimitingDeviceLink(cmsColorSpaceSignature ColorSpace, cmsFloat64Number Limit)
+{
+ return cmsCreateInkLimitingDeviceLinkTHR(NULL, ColorSpace, Limit);
+}
+
+
+// Creates a fake Lab identity.
+cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)
+{
+ cmsHPROFILE hProfile;
+ cmsPipeline* LUT = NULL;
+
+ hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+ if (hProfile == NULL) return NULL;
+
+ cmsSetProfileVersion(hProfile, 2.1);
+
+ cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+ cmsSetColorSpace(hProfile, cmsSigLabData);
+ cmsSetPCS(hProfile, cmsSigLabData);
+
+ if (!SetTextTags(hProfile, L"Lab identity built-in")) return NULL;
+
+ // An identity LUT is all we need
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3)))
+ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+
+ return hProfile;
+
+Error:
+
+ if (LUT != NULL)
+ cmsPipelineFree(LUT);
+
+ if (hProfile != NULL)
+ cmsCloseProfile(hProfile);
+
+ return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsCreateLab2Profile(const cmsCIExyY* WhitePoint)
+{
+ return cmsCreateLab2ProfileTHR(NULL, WhitePoint);
+}
+
+
+// Creates a fake Lab V4 identity.
+cmsHPROFILE CMSEXPORT cmsCreateLab4ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint)
+{
+ cmsHPROFILE hProfile;
+ cmsPipeline* LUT = NULL;
+
+ hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL);
+ if (hProfile == NULL) return NULL;
+
+ cmsSetProfileVersion(hProfile, 4.3);
+
+ cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+ cmsSetColorSpace(hProfile, cmsSigLabData);
+ cmsSetPCS(hProfile, cmsSigLabData);
+
+ if (!SetTextTags(hProfile, L"Lab identity built-in")) goto Error;
+
+ // An empty LUTs is all we need
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+
+ return hProfile;
+
+Error:
+
+ if (LUT != NULL)
+ cmsPipelineFree(LUT);
+
+ if (hProfile != NULL)
+ cmsCloseProfile(hProfile);
+
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateLab4Profile(const cmsCIExyY* WhitePoint)
+{
+ return cmsCreateLab4ProfileTHR(NULL, WhitePoint);
+}
+
+
+// Creates a fake XYZ identity
+cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID)
+{
+ cmsHPROFILE hProfile;
+ cmsPipeline* LUT = NULL;
+
+ hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL);
+ if (hProfile == NULL) return NULL;
+
+ cmsSetProfileVersion(hProfile, 4.3);
+
+ cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+ cmsSetColorSpace(hProfile, cmsSigXYZData);
+ cmsSetPCS(hProfile, cmsSigXYZData);
+
+ if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error;
+
+ // An identity LUT is all we need
+ LUT = cmsPipelineAlloc(ContextID, 3, 3);
+ if (LUT == NULL) goto Error;
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3)))
+ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error;
+ cmsPipelineFree(LUT);
+
+ return hProfile;
+
+Error:
+
+ if (LUT != NULL)
+ cmsPipelineFree(LUT);
+
+ if (hProfile != NULL)
+ cmsCloseProfile(hProfile);
+
+ return NULL;
+}
+
+
+cmsHPROFILE CMSEXPORT cmsCreateXYZProfile(void)
+{
+ return cmsCreateXYZProfileTHR(NULL);
+}
+
+
+//sRGB Curves are defined by:
+//
+//If R’sRGB,G’sRGB, B’sRGB < 0.04045
+//
+// R = R’sRGB / 12.92
+// G = G’sRGB / 12.92
+// B = B’sRGB / 12.92
+//
+//
+//else if R’sRGB,G’sRGB, B’sRGB >= 0.04045
+//
+// R = ((R’sRGB + 0.055) / 1.055)^2.4
+// G = ((G’sRGB + 0.055) / 1.055)^2.4
+// B = ((B’sRGB + 0.055) / 1.055)^2.4
+
+static
+cmsToneCurve* Build_sRGBGamma(cmsContext ContextID)
+{
+ cmsFloat64Number Parameters[5];
+
+ Parameters[0] = 2.4;
+ Parameters[1] = 1. / 1.055;
+ Parameters[2] = 0.055 / 1.055;
+ Parameters[3] = 1. / 12.92;
+ Parameters[4] = 0.04045;
+
+ return cmsBuildParametricToneCurve(ContextID, 4, Parameters);
+}
+
+// Create the ICC virtual profile for sRGB space
+cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfileTHR(cmsContext ContextID)
+{
+ cmsCIExyY D65;
+ cmsCIExyYTRIPLE Rec709Primaries = {
+ {0.6400, 0.3300, 1.0},
+ {0.3000, 0.6000, 1.0},
+ {0.1500, 0.0600, 1.0}
+ };
+ cmsToneCurve* Gamma22[3];
+ cmsHPROFILE hsRGB;
+
+ cmsWhitePointFromTemp(&D65, 6504);
+ Gamma22[0] = Gamma22[1] = Gamma22[2] = Build_sRGBGamma(ContextID);
+ if (Gamma22[0] == NULL) return NULL;
+
+ hsRGB = cmsCreateRGBProfileTHR(ContextID, &D65, &Rec709Primaries, Gamma22);
+ cmsFreeToneCurve(Gamma22[0]);
+ if (hsRGB == NULL) return NULL;
+
+ if (!SetTextTags(hsRGB, L"sRGB built-in")) {
+ cmsCloseProfile(hsRGB);
+ return NULL;
+ }
+
+ return hsRGB;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void)
+{
+ return cmsCreate_sRGBProfileTHR(NULL);
+}
+
+
+
+typedef struct {
+ cmsFloat64Number Brightness;
+ cmsFloat64Number Contrast;
+ cmsFloat64Number Hue;
+ cmsFloat64Number Saturation;
+ cmsCIEXYZ WPsrc, WPdest;
+
+} BCHSWADJUSTS, *LPBCHSWADJUSTS;
+
+
+static
+int bchswSampler(register const cmsUInt16Number In[], register cmsUInt16Number Out[], register void* Cargo)
+{
+ cmsCIELab LabIn, LabOut;
+ cmsCIELCh LChIn, LChOut;
+ cmsCIEXYZ XYZ;
+ LPBCHSWADJUSTS bchsw = (LPBCHSWADJUSTS) Cargo;
+
+
+ cmsLabEncoded2Float(&LabIn, In);
+
+
+ cmsLab2LCh(&LChIn, &LabIn);
+
+ // Do some adjusts on LCh
+
+ LChOut.L = LChIn.L * bchsw ->Contrast + bchsw ->Brightness;
+ LChOut.C = LChIn.C + bchsw -> Saturation;
+ LChOut.h = LChIn.h + bchsw -> Hue;
+
+
+ cmsLCh2Lab(&LabOut, &LChOut);
+
+ // Move white point in Lab
+
+ cmsLab2XYZ(&bchsw ->WPsrc, &XYZ, &LabOut);
+ cmsXYZ2Lab(&bchsw ->WPdest, &LabOut, &XYZ);
+
+ // Back to encoded
+
+ cmsFloat2LabEncoded(Out, &LabOut);
+
+ return TRUE;
+}
+
+
+// Creates an abstract profile operating in Lab space for Brightness,
+// contrast, Saturation and white point displacement
+
+cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfileTHR(cmsContext ContextID,
+ int nLUTPoints,
+ cmsFloat64Number Bright,
+ cmsFloat64Number Contrast,
+ cmsFloat64Number Hue,
+ cmsFloat64Number Saturation,
+ int TempSrc,
+ int TempDest)
+{
+ cmsHPROFILE hICC;
+ cmsPipeline* Pipeline;
+ BCHSWADJUSTS bchsw;
+ cmsCIExyY WhitePnt;
+ cmsStage* CLUT;
+ cmsUInt32Number Dimensions[MAX_INPUT_DIMENSIONS];
+ int i;
+
+ bchsw.Brightness = Bright;
+ bchsw.Contrast = Contrast;
+ bchsw.Hue = Hue;
+ bchsw.Saturation = Saturation;
+
+ cmsWhitePointFromTemp(&WhitePnt, TempSrc );
+ cmsxyY2XYZ(&bchsw.WPsrc, &WhitePnt);
+
+ cmsWhitePointFromTemp(&WhitePnt, TempDest);
+ cmsxyY2XYZ(&bchsw.WPdest, &WhitePnt);
+
+ hICC = cmsCreateProfilePlaceholder(ContextID);
+ if (!hICC) // can't allocate
+ return NULL;
+
+
+ cmsSetDeviceClass(hICC, cmsSigAbstractClass);
+ cmsSetColorSpace(hICC, cmsSigLabData);
+ cmsSetPCS(hICC, cmsSigLabData);
+
+ cmsSetHeaderRenderingIntent(hICC, INTENT_PERCEPTUAL);
+
+ // Creates a Pipeline with 3D grid only
+ Pipeline = cmsPipelineAlloc(ContextID, 3, 3);
+ if (Pipeline == NULL) {
+ cmsCloseProfile(hICC);
+ return NULL;
+ }
+
+ for (i=0; i < MAX_INPUT_DIMENSIONS; i++) Dimensions[i] = nLUTPoints;
+ CLUT = cmsStageAllocCLut16bitGranular(ContextID, Dimensions, 3, 3, NULL);
+ if (CLUT == NULL) return NULL;
+
+
+ if (!cmsStageSampleCLut16bit(CLUT, bchswSampler, (void*) &bchsw, 0)) {
+
+ // Shouldn't reach here
+ goto Error;
+ }
+
+ if (!cmsPipelineInsertStage(Pipeline, cmsAT_END, CLUT)) {
+ goto Error;
+ }
+
+ // Create tags
+ if (!SetTextTags(hICC, L"BCHS built-in")) return NULL;
+
+ cmsWriteTag(hICC, cmsSigMediaWhitePointTag, (void*) cmsD50_XYZ());
+
+ cmsWriteTag(hICC, cmsSigAToB0Tag, (void*) Pipeline);
+
+ // Pipeline is already on virtual profile
+ cmsPipelineFree(Pipeline);
+
+ // Ok, done
+ return hICC;
+
+Error:
+ cmsPipelineFree(Pipeline);
+ cmsCloseProfile(hICC);
+ return NULL;
+}
+
+
+CMSAPI cmsHPROFILE CMSEXPORT cmsCreateBCHSWabstractProfile(int nLUTPoints,
+ cmsFloat64Number Bright,
+ cmsFloat64Number Contrast,
+ cmsFloat64Number Hue,
+ cmsFloat64Number Saturation,
+ int TempSrc,
+ int TempDest)
+{
+ return cmsCreateBCHSWabstractProfileTHR(NULL, nLUTPoints, Bright, Contrast, Hue, Saturation, TempSrc, TempDest);
+}
+
+
+// Creates a fake NULL profile. This profile return 1 channel as always 0.
+// Is useful only for gamut checking tricks
+cmsHPROFILE CMSEXPORT cmsCreateNULLProfileTHR(cmsContext ContextID)
+{
+ cmsHPROFILE hProfile;
+ cmsPipeline* LUT = NULL;
+ cmsStage* PostLin;
+ cmsToneCurve* EmptyTab;
+ cmsUInt16Number Zero[2] = { 0, 0 };
+
+ hProfile = cmsCreateProfilePlaceholder(ContextID);
+ if (!hProfile) // can't allocate
+ return NULL;
+
+ cmsSetProfileVersion(hProfile, 4.3);
+
+ if (!SetTextTags(hProfile, L"NULL profile built-in")) goto Error;
+
+
+
+ cmsSetDeviceClass(hProfile, cmsSigOutputClass);
+ cmsSetColorSpace(hProfile, cmsSigGrayData);
+ cmsSetPCS(hProfile, cmsSigLabData);
+
+ // An empty LUTs is all we need
+ LUT = cmsPipelineAlloc(ContextID, 1, 1);
+ if (LUT == NULL) goto Error;
+
+ EmptyTab = cmsBuildTabulatedToneCurve16(ContextID, 2, Zero);
+ PostLin = cmsStageAllocToneCurves(ContextID, 1, &EmptyTab);
+ cmsFreeToneCurve(EmptyTab);
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, PostLin))
+ goto Error;
+
+ if (!cmsWriteTag(hProfile, cmsSigBToA0Tag, (void*) LUT)) goto Error;
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, cmsD50_XYZ())) goto Error;
+
+ cmsPipelineFree(LUT);
+ return hProfile;
+
+Error:
+
+ if (LUT != NULL)
+ cmsPipelineFree(LUT);
+
+ if (hProfile != NULL)
+ cmsCloseProfile(hProfile);
+
+ return NULL;
+}
+
+cmsHPROFILE CMSEXPORT cmsCreateNULLProfile(void)
+{
+ return cmsCreateNULLProfileTHR(NULL);
+}
+
+
+static
+int IsPCS(cmsColorSpaceSignature ColorSpace)
+{
+ return (ColorSpace == cmsSigXYZData ||
+ ColorSpace == cmsSigLabData);
+}
+
+
+static
+void FixColorSpaces(cmsHPROFILE hProfile,
+ cmsColorSpaceSignature ColorSpace,
+ cmsColorSpaceSignature PCS,
+ cmsUInt32Number dwFlags)
+{
+ if (dwFlags & cmsFLAGS_GUESSDEVICECLASS) {
+
+ if (IsPCS(ColorSpace) && IsPCS(PCS)) {
+
+ cmsSetDeviceClass(hProfile, cmsSigAbstractClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+ return;
+ }
+
+ if (IsPCS(ColorSpace) && !IsPCS(PCS)) {
+
+ cmsSetDeviceClass(hProfile, cmsSigOutputClass);
+ cmsSetPCS(hProfile, ColorSpace);
+ cmsSetColorSpace(hProfile, PCS);
+ return;
+ }
+
+ if (IsPCS(PCS) && !IsPCS(ColorSpace)) {
+
+ cmsSetDeviceClass(hProfile, cmsSigInputClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+ return;
+ }
+ }
+
+ cmsSetDeviceClass(hProfile, cmsSigLinkClass);
+ cmsSetColorSpace(hProfile, ColorSpace);
+ cmsSetPCS(hProfile, PCS);
+}
+
+
+
+// This function creates a named color profile dumping all the contents of transform to a single profile
+// In this way, LittleCMS may be used to "group" several named color databases into a single profile.
+// It has, however, several minor limitations. PCS is always Lab, which is not very critic since this
+// is the normal PCS for named color profiles.
+static
+cmsHPROFILE CreateNamedColorDevicelink(cmsHTRANSFORM xform)
+{
+ _cmsTRANSFORM* v = (_cmsTRANSFORM*) xform;
+ cmsHPROFILE hICC = NULL;
+ int i, nColors;
+ cmsNAMEDCOLORLIST *nc2 = NULL, *Original = NULL;
+
+ // Create an empty placeholder
+ hICC = cmsCreateProfilePlaceholder(v->ContextID);
+ if (hICC == NULL) return NULL;
+
+ // Critical information
+ cmsSetDeviceClass(hICC, cmsSigNamedColorClass);
+ cmsSetColorSpace(hICC, v ->ExitColorSpace);
+ cmsSetPCS(hICC, cmsSigLabData);
+
+ // Tag profile with information
+ if (!SetTextTags(hICC, L"Named color devicelink")) goto Error;
+
+ Original = cmsGetNamedColorList(xform);
+ if (Original == NULL) goto Error;
+
+ nColors = cmsNamedColorCount(Original);
+ nc2 = cmsDupNamedColorList(Original);
+ if (nc2 == NULL) goto Error;
+
+ // Colorant count now depends on the output space
+ nc2 ->ColorantCount = cmsPipelineOutputChannels(v ->Lut);
+
+ // Make sure we have proper formatters
+ cmsChangeBuffersFormat(xform, TYPE_NAMED_COLOR_INDEX,
+ FLOAT_SH(0) | COLORSPACE_SH(_cmsLCMScolorSpace(v ->ExitColorSpace))
+ | BYTES_SH(2) | CHANNELS_SH(cmsChannelsOf(v ->ExitColorSpace)));
+
+ // Apply the transfor to colorants.
+ for (i=0; i < nColors; i++) {
+ cmsDoTransform(xform, &i, nc2 ->List[i].DeviceColorant, 1);
+ }
+
+ if (!cmsWriteTag(hICC, cmsSigNamedColor2Tag, (void*) nc2)) goto Error;
+ cmsFreeNamedColorList(nc2);
+
+ return hICC;
+
+Error:
+ if (hICC != NULL) cmsCloseProfile(hICC);
+ return NULL;
+}
+
+
+// This structure holds information about which MPU can be stored on a profile based on the version
+
+typedef struct {
+ cmsBool IsV4; // Is a V4 tag?
+ cmsTagSignature RequiredTag; // Set to 0 for both types
+ cmsTagTypeSignature LutType; // The LUT type
+ int nTypes; // Number of types (up to 5)
+ cmsStageSignature MpeTypes[5]; // 5 is the maximum number
+
+} cmsAllowedLUT;
+
+static const cmsAllowedLUT AllowedLUTTypes[] = {
+
+ { FALSE, 0, cmsSigLut16Type, 4, { cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+ { FALSE, 0, cmsSigLut16Type, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType}},
+ { FALSE, 0, cmsSigLut16Type, 2, { cmsSigCurveSetElemType, cmsSigCLutElemType}},
+ { TRUE , 0, cmsSigLutAtoBType, 1, { cmsSigCurveSetElemType }},
+ { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType } },
+ { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType } },
+ { TRUE , cmsSigAToB0Tag, cmsSigLutAtoBType, 5, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},
+ { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 1, { cmsSigCurveSetElemType }},
+ { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType }},
+ { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 3, { cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }},
+ { TRUE , cmsSigBToA0Tag, cmsSigLutBtoAType, 5, { cmsSigCurveSetElemType, cmsSigMatrixElemType, cmsSigCurveSetElemType, cmsSigCLutElemType, cmsSigCurveSetElemType }}
+};
+
+#define SIZE_OF_ALLOWED_LUT (sizeof(AllowedLUTTypes)/sizeof(cmsAllowedLUT))
+
+// Check a single entry
+static
+cmsBool CheckOne(const cmsAllowedLUT* Tab, const cmsPipeline* Lut)
+{
+ cmsStage* mpe;
+ int n;
+
+ for (n=0, mpe = Lut ->Elements; mpe != NULL; mpe = mpe ->Next, n++) {
+
+ if (n > Tab ->nTypes) return FALSE;
+ if (cmsStageType(mpe) != Tab ->MpeTypes[n]) return FALSE;
+ }
+
+ return (n == Tab ->nTypes);
+}
+
+
+static
+const cmsAllowedLUT* FindCombination(const cmsPipeline* Lut, cmsBool IsV4, cmsTagSignature DestinationTag)
+{
+ cmsUInt32Number n;
+
+ for (n=0; n < SIZE_OF_ALLOWED_LUT; n++) {
+
+ const cmsAllowedLUT* Tab = AllowedLUTTypes + n;
+
+ if (IsV4 ^ Tab -> IsV4) continue;
+ if ((Tab ->RequiredTag != 0) && (Tab ->RequiredTag != DestinationTag)) continue;
+
+ if (CheckOne(Tab, Lut)) return Tab;
+ }
+
+ return NULL;
+}
+
+
+// Does convert a transform into a device link profile
+cmsHPROFILE CMSEXPORT cmsTransform2DeviceLink(cmsHTRANSFORM hTransform, cmsFloat64Number Version, cmsUInt32Number dwFlags)
+{
+ cmsHPROFILE hProfile = NULL;
+ cmsUInt32Number FrmIn, FrmOut, ChansIn, ChansOut;
+ cmsUInt32Number ColorSpaceBitsIn, ColorSpaceBitsOut;
+ _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+ cmsPipeline* LUT = NULL;
+ cmsStage* mpe;
+ cmsContext ContextID = cmsGetTransformContextID(hTransform);
+ const cmsAllowedLUT* AllowedLUT;
+ cmsTagSignature DestinationTag;
+ cmsProfileClassSignature deviceClass;
+
+ _cmsAssert(hTransform != NULL);
+
+ // Get the first mpe to check for named color
+ mpe = cmsPipelineGetPtrToFirstStage(xform ->Lut);
+
+ // Check if is a named color transform
+ if (mpe != NULL) {
+
+ if (cmsStageType(mpe) == cmsSigNamedColorElemType) {
+ return CreateNamedColorDevicelink(hTransform);
+ }
+ }
+
+ // First thing to do is to get a copy of the transformation
+ LUT = cmsPipelineDup(xform ->Lut);
+ if (LUT == NULL) return NULL;
+
+ // Time to fix the Lab2/Lab4 issue.
+ if ((xform ->EntryColorSpace == cmsSigLabData) && (Version < 4.0)) {
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocLabV2ToV4curves(ContextID)))
+ goto Error;
+ }
+
+ // On the output side too
+ if ((xform ->ExitColorSpace) == cmsSigLabData && (Version < 4.0)) {
+
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocLabV4ToV2(ContextID)))
+ goto Error;
+ }
+
+
+ hProfile = cmsCreateProfilePlaceholder(ContextID);
+ if (!hProfile) goto Error; // can't allocate
+
+ cmsSetProfileVersion(hProfile, Version);
+
+ FixColorSpaces(hProfile, xform -> EntryColorSpace, xform -> ExitColorSpace, dwFlags);
+
+ // Optimize the LUT and precalculate a devicelink
+
+ ChansIn = cmsChannelsOf(xform -> EntryColorSpace);
+ ChansOut = cmsChannelsOf(xform -> ExitColorSpace);
+
+ ColorSpaceBitsIn = _cmsLCMScolorSpace(xform -> EntryColorSpace);
+ ColorSpaceBitsOut = _cmsLCMScolorSpace(xform -> ExitColorSpace);
+
+ FrmIn = COLORSPACE_SH(ColorSpaceBitsIn) | CHANNELS_SH(ChansIn)|BYTES_SH(2);
+ FrmOut = COLORSPACE_SH(ColorSpaceBitsOut) | CHANNELS_SH(ChansOut)|BYTES_SH(2);
+
+ deviceClass = cmsGetDeviceClass(hProfile);
+
+ if (deviceClass == cmsSigOutputClass)
+ DestinationTag = cmsSigBToA0Tag;
+ else
+ DestinationTag = cmsSigAToB0Tag;
+
+ // Check if the profile/version can store the result
+ if (dwFlags & cmsFLAGS_FORCE_CLUT)
+ AllowedLUT = NULL;
+ else
+ AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+
+ if (AllowedLUT == NULL) {
+
+ // Try to optimize
+ _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
+ AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+
+ }
+
+ // If no way, then force CLUT that for sure can be written
+ if (AllowedLUT == NULL) {
+
+ dwFlags |= cmsFLAGS_FORCE_CLUT;
+ _cmsOptimizePipeline(ContextID, &LUT, xform ->RenderingIntent, &FrmIn, &FrmOut, &dwFlags);
+
+ // Put identity curves if needed
+ if (cmsPipelineGetPtrToFirstStage(LUT) ->Type != cmsSigCurveSetElemType)
+ if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, ChansIn)))
+ goto Error;
+
+ if (cmsPipelineGetPtrToLastStage(LUT) ->Type != cmsSigCurveSetElemType)
+ if (!cmsPipelineInsertStage(LUT, cmsAT_END, _cmsStageAllocIdentityCurves(ContextID, ChansOut)))
+ goto Error;
+
+ AllowedLUT = FindCombination(LUT, Version >= 4.0, DestinationTag);
+ }
+
+ // Somethings is wrong...
+ if (AllowedLUT == NULL) {
+ goto Error;
+ }
+
+
+ if (dwFlags & cmsFLAGS_8BITS_DEVICELINK)
+ cmsPipelineSetSaveAs8bitsFlag(LUT, TRUE);
+
+ // Tag profile with information
+ if (!SetTextTags(hProfile, L"devicelink")) goto Error;
+
+ // Store result
+ if (!cmsWriteTag(hProfile, DestinationTag, LUT)) goto Error;
+
+
+ if (xform -> InputColorant != NULL) {
+ if (!cmsWriteTag(hProfile, cmsSigColorantTableTag, xform->InputColorant)) goto Error;
+ }
+
+ if (xform -> OutputColorant != NULL) {
+ if (!cmsWriteTag(hProfile, cmsSigColorantTableOutTag, xform->OutputColorant)) goto Error;
+ }
+
+ if ((deviceClass == cmsSigLinkClass) && (xform ->Sequence != NULL)) {
+ if (!_cmsWriteProfileSequence(hProfile, xform ->Sequence)) goto Error;
+ }
+
+ // Set the white point
+ if (deviceClass == cmsSigInputClass) {
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->EntryWhitePoint)) goto Error;
+ }
+ else {
+ if (!cmsWriteTag(hProfile, cmsSigMediaWhitePointTag, &xform ->ExitWhitePoint)) goto Error;
+ }
+
+
+ // Per 7.2.15 in spec 4.3
+ cmsSetHeaderRenderingIntent(hProfile, xform ->RenderingIntent);
+
+ cmsPipelineFree(LUT);
+ return hProfile;
+
+Error:
+ if (LUT != NULL) cmsPipelineFree(LUT);
+ cmsCloseProfile(hProfile);
+ return NULL;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c
new file mode 100644
index 0000000000..903fdd7497
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmswtpnt.c
@@ -0,0 +1,349 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+
+// D50 - Widely used
+const cmsCIEXYZ* CMSEXPORT cmsD50_XYZ(void)
+{
+ static cmsCIEXYZ D50XYZ = {cmsD50X, cmsD50Y, cmsD50Z};
+
+ return &D50XYZ;
+}
+
+const cmsCIExyY* CMSEXPORT cmsD50_xyY(void)
+{
+ static cmsCIExyY D50xyY;
+
+ cmsXYZ2xyY(&D50xyY, cmsD50_XYZ());
+
+ return &D50xyY;
+}
+
+// Obtains WhitePoint from Temperature
+cmsBool CMSEXPORT cmsWhitePointFromTemp(cmsCIExyY* WhitePoint, cmsFloat64Number TempK)
+{
+ cmsFloat64Number x, y;
+ cmsFloat64Number T, T2, T3;
+ // cmsFloat64Number M1, M2;
+
+ _cmsAssert(WhitePoint != NULL);
+
+ T = TempK;
+ T2 = T*T; // Square
+ T3 = T2*T; // Cube
+
+ // For correlated color temperature (T) between 4000K and 7000K:
+
+ if (T >= 4000. && T <= 7000.)
+ {
+ x = -4.6070*(1E9/T3) + 2.9678*(1E6/T2) + 0.09911*(1E3/T) + 0.244063;
+ }
+ else
+ // or for correlated color temperature (T) between 7000K and 25000K:
+
+ if (T > 7000.0 && T <= 25000.0)
+ {
+ x = -2.0064*(1E9/T3) + 1.9018*(1E6/T2) + 0.24748*(1E3/T) + 0.237040;
+ }
+ else {
+ cmsSignalError(0, cmsERROR_RANGE, "cmsWhitePointFromTemp: invalid temp");
+ return FALSE;
+ }
+
+ // Obtain y(x)
+
+ y = -3.000*(x*x) + 2.870*x - 0.275;
+
+ // wave factors (not used, but here for futures extensions)
+
+ // M1 = (-1.3515 - 1.7703*x + 5.9114 *y)/(0.0241 + 0.2562*x - 0.7341*y);
+ // M2 = (0.0300 - 31.4424*x + 30.0717*y)/(0.0241 + 0.2562*x - 0.7341*y);
+
+ WhitePoint -> x = x;
+ WhitePoint -> y = y;
+ WhitePoint -> Y = 1.0;
+
+ return TRUE;
+}
+
+
+
+typedef struct {
+
+ cmsFloat64Number mirek; // temp (in microreciprocal kelvin)
+ cmsFloat64Number ut; // u coord of intersection w/ blackbody locus
+ cmsFloat64Number vt; // v coord of intersection w/ blackbody locus
+ cmsFloat64Number tt; // slope of ISOTEMPERATURE. line
+
+ } ISOTEMPERATURE;
+
+static ISOTEMPERATURE isotempdata[] = {
+// {Mirek, Ut, Vt, Tt }
+ {0, 0.18006, 0.26352, -0.24341},
+ {10, 0.18066, 0.26589, -0.25479},
+ {20, 0.18133, 0.26846, -0.26876},
+ {30, 0.18208, 0.27119, -0.28539},
+ {40, 0.18293, 0.27407, -0.30470},
+ {50, 0.18388, 0.27709, -0.32675},
+ {60, 0.18494, 0.28021, -0.35156},
+ {70, 0.18611, 0.28342, -0.37915},
+ {80, 0.18740, 0.28668, -0.40955},
+ {90, 0.18880, 0.28997, -0.44278},
+ {100, 0.19032, 0.29326, -0.47888},
+ {125, 0.19462, 0.30141, -0.58204},
+ {150, 0.19962, 0.30921, -0.70471},
+ {175, 0.20525, 0.31647, -0.84901},
+ {200, 0.21142, 0.32312, -1.0182 },
+ {225, 0.21807, 0.32909, -1.2168 },
+ {250, 0.22511, 0.33439, -1.4512 },
+ {275, 0.23247, 0.33904, -1.7298 },
+ {300, 0.24010, 0.34308, -2.0637 },
+ {325, 0.24702, 0.34655, -2.4681 },
+ {350, 0.25591, 0.34951, -2.9641 },
+ {375, 0.26400, 0.35200, -3.5814 },
+ {400, 0.27218, 0.35407, -4.3633 },
+ {425, 0.28039, 0.35577, -5.3762 },
+ {450, 0.28863, 0.35714, -6.7262 },
+ {475, 0.29685, 0.35823, -8.5955 },
+ {500, 0.30505, 0.35907, -11.324 },
+ {525, 0.31320, 0.35968, -15.628 },
+ {550, 0.32129, 0.36011, -23.325 },
+ {575, 0.32931, 0.36038, -40.770 },
+ {600, 0.33724, 0.36051, -116.45 }
+};
+
+#define NISO sizeof(isotempdata)/sizeof(ISOTEMPERATURE)
+
+
+// Robertson's method
+cmsBool CMSEXPORT cmsTempFromWhitePoint(cmsFloat64Number* TempK, const cmsCIExyY* WhitePoint)
+{
+ cmsUInt32Number j;
+ cmsFloat64Number us,vs;
+ cmsFloat64Number uj,vj,tj,di,dj,mi,mj;
+ cmsFloat64Number xs, ys;
+
+ _cmsAssert(WhitePoint != NULL);
+ _cmsAssert(TempK != NULL);
+
+ di = mi = 0;
+ xs = WhitePoint -> x;
+ ys = WhitePoint -> y;
+
+ // convert (x,y) to CIE 1960 (u,WhitePoint)
+
+ us = (2*xs) / (-xs + 6*ys + 1.5);
+ vs = (3*ys) / (-xs + 6*ys + 1.5);
+
+
+ for (j=0; j < NISO; j++) {
+
+ uj = isotempdata[j].ut;
+ vj = isotempdata[j].vt;
+ tj = isotempdata[j].tt;
+ mj = isotempdata[j].mirek;
+
+ dj = ((vs - vj) - tj * (us - uj)) / sqrt(1.0 + tj * tj);
+
+ if ((j != 0) && (di/dj < 0.0)) {
+
+ // Found a match
+ *TempK = 1000000.0 / (mi + (di / (di - dj)) * (mj - mi));
+ return TRUE;
+ }
+
+ di = dj;
+ mi = mj;
+ }
+
+ // Not found
+ return FALSE;
+}
+
+
+// Compute chromatic adaptation matrix using Chad as cone matrix
+
+static
+cmsBool ComputeChromaticAdaptation(cmsMAT3* Conversion,
+ const cmsCIEXYZ* SourceWhitePoint,
+ const cmsCIEXYZ* DestWhitePoint,
+ const cmsMAT3* Chad)
+
+{
+
+ cmsMAT3 Chad_Inv;
+ cmsVEC3 ConeSourceXYZ, ConeSourceRGB;
+ cmsVEC3 ConeDestXYZ, ConeDestRGB;
+ cmsMAT3 Cone, Tmp;
+
+
+ Tmp = *Chad;
+ if (!_cmsMAT3inverse(&Tmp, &Chad_Inv)) return FALSE;
+
+ _cmsVEC3init(&ConeSourceXYZ, SourceWhitePoint -> X,
+ SourceWhitePoint -> Y,
+ SourceWhitePoint -> Z);
+
+ _cmsVEC3init(&ConeDestXYZ, DestWhitePoint -> X,
+ DestWhitePoint -> Y,
+ DestWhitePoint -> Z);
+
+ _cmsMAT3eval(&ConeSourceRGB, Chad, &ConeSourceXYZ);
+ _cmsMAT3eval(&ConeDestRGB, Chad, &ConeDestXYZ);
+
+ // Build matrix
+ _cmsVEC3init(&Cone.v[0], ConeDestRGB.n[0]/ConeSourceRGB.n[0], 0.0, 0.0);
+ _cmsVEC3init(&Cone.v[1], 0.0, ConeDestRGB.n[1]/ConeSourceRGB.n[1], 0.0);
+ _cmsVEC3init(&Cone.v[2], 0.0, 0.0, ConeDestRGB.n[2]/ConeSourceRGB.n[2]);
+
+
+ // Normalize
+ _cmsMAT3per(&Tmp, &Cone, Chad);
+ _cmsMAT3per(Conversion, &Chad_Inv, &Tmp);
+
+ return TRUE;
+}
+
+// Returns the final chrmatic adaptation from illuminant FromIll to Illuminant ToIll
+// The cone matrix can be specified in ConeMatrix. If NULL, Bradford is assumed
+cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll)
+{
+ cmsMAT3 LamRigg = {{ // Bradford matrix
+ {{ 0.8951, 0.2664, -0.1614 }},
+ {{ -0.7502, 1.7135, 0.0367 }},
+ {{ 0.0389, -0.0685, 1.0296 }}
+ }};
+
+ if (ConeMatrix == NULL)
+ ConeMatrix = &LamRigg;
+
+ return ComputeChromaticAdaptation(r, FromIll, ToIll, ConeMatrix);
+}
+
+// Same as anterior, but assuming D50 destination. White point is given in xyY
+static
+cmsBool _cmsAdaptMatrixToD50(cmsMAT3* r, const cmsCIExyY* SourceWhitePt)
+{
+ cmsCIEXYZ Dn;
+ cmsMAT3 Bradford;
+ cmsMAT3 Tmp;
+
+ cmsxyY2XYZ(&Dn, SourceWhitePt);
+
+ if (!_cmsAdaptationMatrix(&Bradford, NULL, &Dn, cmsD50_XYZ())) return FALSE;
+
+ Tmp = *r;
+ _cmsMAT3per(r, &Bradford, &Tmp);
+
+ return TRUE;
+}
+
+// Build a White point, primary chromas transfer matrix from RGB to CIE XYZ
+// This is just an approximation, I am not handling all the non-linear
+// aspects of the RGB to XYZ process, and assumming that the gamma correction
+// has transitive property in the tranformation chain.
+//
+// the alghoritm:
+//
+// - First I build the absolute conversion matrix using
+// primaries in XYZ. This matrix is next inverted
+// - Then I eval the source white point across this matrix
+// obtaining the coeficients of the transformation
+// - Then, I apply these coeficients to the original matrix
+//
+cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePt, const cmsCIExyYTRIPLE* Primrs)
+{
+ cmsVEC3 WhitePoint, Coef;
+ cmsMAT3 Result, Primaries;
+ cmsFloat64Number xn, yn;
+ cmsFloat64Number xr, yr;
+ cmsFloat64Number xg, yg;
+ cmsFloat64Number xb, yb;
+
+ xn = WhitePt -> x;
+ yn = WhitePt -> y;
+ xr = Primrs -> Red.x;
+ yr = Primrs -> Red.y;
+ xg = Primrs -> Green.x;
+ yg = Primrs -> Green.y;
+ xb = Primrs -> Blue.x;
+ yb = Primrs -> Blue.y;
+
+ // Build Primaries matrix
+ _cmsVEC3init(&Primaries.v[0], xr, xg, xb);
+ _cmsVEC3init(&Primaries.v[1], yr, yg, yb);
+ _cmsVEC3init(&Primaries.v[2], (1-xr-yr), (1-xg-yg), (1-xb-yb));
+
+
+ // Result = Primaries ^ (-1) inverse matrix
+ if (!_cmsMAT3inverse(&Primaries, &Result))
+ return FALSE;
+
+
+ _cmsVEC3init(&WhitePoint, xn/yn, 1.0, (1.0-xn-yn)/yn);
+
+ // Across inverse primaries ...
+ _cmsMAT3eval(&Coef, &Result, &WhitePoint);
+
+ // Give us the Coefs, then I build transformation matrix
+ _cmsVEC3init(&r -> v[0], Coef.n[VX]*xr, Coef.n[VY]*xg, Coef.n[VZ]*xb);
+ _cmsVEC3init(&r -> v[1], Coef.n[VX]*yr, Coef.n[VY]*yg, Coef.n[VZ]*yb);
+ _cmsVEC3init(&r -> v[2], Coef.n[VX]*(1.0-xr-yr), Coef.n[VY]*(1.0-xg-yg), Coef.n[VZ]*(1.0-xb-yb));
+
+
+ return _cmsAdaptMatrixToD50(r, WhitePt);
+
+}
+
+
+// Adapts a color to a given illuminant. Original color is expected to have
+// a SourceWhitePt white point.
+cmsBool CMSEXPORT cmsAdaptToIlluminant(cmsCIEXYZ* Result,
+ const cmsCIEXYZ* SourceWhitePt,
+ const cmsCIEXYZ* Illuminant,
+ const cmsCIEXYZ* Value)
+{
+ cmsMAT3 Bradford;
+ cmsVEC3 In, Out;
+
+ _cmsAssert(Result != NULL);
+ _cmsAssert(SourceWhitePt != NULL);
+ _cmsAssert(Illuminant != NULL);
+ _cmsAssert(Value != NULL);
+
+ if (!_cmsAdaptationMatrix(&Bradford, NULL, SourceWhitePt, Illuminant)) return FALSE;
+
+ _cmsVEC3init(&In, Value -> X, Value -> Y, Value -> Z);
+ _cmsMAT3eval(&Out, &Bradford, &In);
+
+ Result -> X = Out.n[0];
+ Result -> Y = Out.n[1];
+ Result -> Z = Out.n[2];
+
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c
new file mode 100644
index 0000000000..eddb9bd02c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/cmsxform.c
@@ -0,0 +1,1132 @@
+//---------------------------------------------------------------------------------
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#include "lcms2_internal.h"
+
+// Transformations stuff
+// -----------------------------------------------------------------------
+
+#define DEFAULT_OBSERVER_ADAPTATION_STATE 1.0
+
+// The Context0 observer adaptation state.
+_cmsAdaptationStateChunkType _cmsAdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };
+
+// Init and duplicate observer adaptation state
+void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ static _cmsAdaptationStateChunkType AdaptationStateChunk = { DEFAULT_OBSERVER_ADAPTATION_STATE };
+ void* from;
+
+ if (src != NULL) {
+ from = src ->chunks[AdaptationStateContext];
+ }
+ else {
+ from = &AdaptationStateChunk;
+ }
+
+ ctx ->chunks[AdaptationStateContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAdaptationStateChunkType));
+}
+
+
+// Sets adaptation state for absolute colorimetric intent in the given context. Adaptation state applies on all
+// but cmsCreateExtendedTransformTHR(). Little CMS can handle incomplete adaptation states.
+cmsFloat64Number CMSEXPORT cmsSetAdaptationStateTHR(cmsContext ContextID, cmsFloat64Number d)
+{
+ cmsFloat64Number prev;
+ _cmsAdaptationStateChunkType* ptr = (_cmsAdaptationStateChunkType*) _cmsContextGetClientChunk(ContextID, AdaptationStateContext);
+
+ // Get previous value for return
+ prev = ptr ->AdaptationState;
+
+ // Set the value if d is positive or zero
+ if (d >= 0.0) {
+
+ ptr ->AdaptationState = d;
+ }
+
+ // Always return previous value
+ return prev;
+}
+
+
+// The adaptation state may be defaulted by this function. If you don't like it, use the extended transform routine
+cmsFloat64Number CMSEXPORT cmsSetAdaptationState(cmsFloat64Number d)
+{
+ return cmsSetAdaptationStateTHR(NULL, d);
+}
+
+// -----------------------------------------------------------------------
+
+// Alarm codes for 16-bit transformations, because the fixed range of containers there are
+// no values left to mark out of gamut.
+
+#define DEFAULT_ALARM_CODES_VALUE {0x7F00, 0x7F00, 0x7F00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
+
+_cmsAlarmCodesChunkType _cmsAlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };
+
+// Sets the codes used to mark out-out-gamut on Proofing transforms for a given context. Values are meant to be
+// encoded in 16 bits.
+void CMSEXPORT cmsSetAlarmCodesTHR(cmsContext ContextID, const cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])
+{
+ _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);
+
+ _cmsAssert(ContextAlarmCodes != NULL); // Can't happen
+
+ memcpy(ContextAlarmCodes->AlarmCodes, AlarmCodesP, sizeof(ContextAlarmCodes->AlarmCodes));
+}
+
+// Gets the current codes used to mark out-out-gamut on Proofing transforms for the given context.
+// Values are meant to be encoded in 16 bits.
+void CMSEXPORT cmsGetAlarmCodesTHR(cmsContext ContextID, cmsUInt16Number AlarmCodesP[cmsMAXCHANNELS])
+{
+ _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(ContextID, AlarmCodesContext);
+
+ _cmsAssert(ContextAlarmCodes != NULL); // Can't happen
+
+ memcpy(AlarmCodesP, ContextAlarmCodes->AlarmCodes, sizeof(ContextAlarmCodes->AlarmCodes));
+}
+
+void CMSEXPORT cmsSetAlarmCodes(const cmsUInt16Number NewAlarm[cmsMAXCHANNELS])
+{
+ _cmsAssert(NewAlarm != NULL);
+
+ cmsSetAlarmCodesTHR(NULL, NewAlarm);
+}
+
+void CMSEXPORT cmsGetAlarmCodes(cmsUInt16Number OldAlarm[cmsMAXCHANNELS])
+{
+ _cmsAssert(OldAlarm != NULL);
+ cmsGetAlarmCodesTHR(NULL, OldAlarm);
+}
+
+
+// Init and duplicate alarm codes
+void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ static _cmsAlarmCodesChunkType AlarmCodesChunk = { DEFAULT_ALARM_CODES_VALUE };
+ void* from;
+
+ if (src != NULL) {
+ from = src ->chunks[AlarmCodesContext];
+ }
+ else {
+ from = &AlarmCodesChunk;
+ }
+
+ ctx ->chunks[AlarmCodesContext] = _cmsSubAllocDup(ctx ->MemPool, from, sizeof(_cmsAlarmCodesChunkType));
+}
+
+// -----------------------------------------------------------------------
+
+// Get rid of transform resources
+void CMSEXPORT cmsDeleteTransform(cmsHTRANSFORM hTransform)
+{
+ _cmsTRANSFORM* p = (_cmsTRANSFORM*) hTransform;
+
+ _cmsAssert(p != NULL);
+
+ if (p -> GamutCheck)
+ cmsPipelineFree(p -> GamutCheck);
+
+ if (p -> Lut)
+ cmsPipelineFree(p -> Lut);
+
+ if (p ->InputColorant)
+ cmsFreeNamedColorList(p ->InputColorant);
+
+ if (p -> OutputColorant)
+ cmsFreeNamedColorList(p ->OutputColorant);
+
+ if (p ->Sequence)
+ cmsFreeProfileSequenceDescription(p ->Sequence);
+
+ if (p ->UserData)
+ p ->FreeUserData(p ->ContextID, p ->UserData);
+
+ _cmsFree(p ->ContextID, (void *) p);
+}
+
+// Apply transform.
+void CMSEXPORT cmsDoTransform(cmsHTRANSFORM Transform,
+ const void* InputBuffer,
+ void* OutputBuffer,
+ cmsUInt32Number Size)
+
+{
+ _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;
+
+ p -> xform(p, InputBuffer, OutputBuffer, Size, Size);
+}
+
+
+// Apply transform.
+void CMSEXPORT cmsDoTransformStride(cmsHTRANSFORM Transform,
+ const void* InputBuffer,
+ void* OutputBuffer,
+ cmsUInt32Number Size, cmsUInt32Number Stride)
+
+{
+ _cmsTRANSFORM* p = (_cmsTRANSFORM*) Transform;
+
+ p -> xform(p, InputBuffer, OutputBuffer, Size, Stride);
+}
+
+
+// Transform routines ----------------------------------------------------------------------------------------------------------
+
+// Float xform converts floats. Since there are no performance issues, one routine does all job, including gamut check.
+// Note that because extended range, we can use a -1.0 value for out of gamut in this case.
+static
+void FloatXFORM(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsFloat32Number fIn[cmsMAXCHANNELS], fOut[cmsMAXCHANNELS];
+ cmsFloat32Number OutOfGamut;
+ cmsUInt32Number i, j;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+
+ for (i=0; i < Size; i++) {
+
+ accum = p -> FromInputFloat(p, fIn, accum, Stride);
+
+ // Any gamut chack to do?
+ if (p ->GamutCheck != NULL) {
+
+ // Evaluate gamut marker.
+ cmsPipelineEvalFloat( fIn, &OutOfGamut, p ->GamutCheck);
+
+ // Is current color out of gamut?
+ if (OutOfGamut > 0.0) {
+
+ // Certainly, out of gamut
+ for (j=0; j < cmsMAXCHANNELS; j++)
+ fOut[j] = -1.0;
+
+ }
+ else {
+ // No, proceed normally
+ cmsPipelineEvalFloat(fIn, fOut, p -> Lut);
+ }
+ }
+ else {
+
+ // No gamut check at all
+ cmsPipelineEvalFloat(fIn, fOut, p -> Lut);
+ }
+
+ // Back to asked representation
+ output = p -> ToOutputFloat(p, fOut, output, Stride);
+ }
+}
+
+
+static
+void NullFloatXFORM(_cmsTRANSFORM* p,
+ const void* in,
+ void* out,
+ cmsUInt32Number Size,
+ cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsFloat32Number fIn[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size;
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInputFloat(p, fIn, accum, Stride);
+ output = p -> ToOutputFloat(p, fIn, output, Stride);
+ }
+}
+
+// 16 bit precision -----------------------------------------------------------------------------------------------------------
+
+// Null transformation, only applies formatters. No cach?static
+void NullXFORM(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size,
+ cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsUInt16Number wIn[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum, Stride);
+ output = p -> ToOutput(p, wIn, output, Stride);
+ }
+}
+
+
+// No gamut check, no cache, 16 bits
+static
+void PrecalculatedXFORM(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+ register cmsUInt8Number* accum;
+ register cmsUInt8Number* output;
+ cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size;
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum, Stride);
+ p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+ output = p -> ToOutput(p, wOut, output, Stride);
+ }
+}
+
+
+// Auxiliar: Handle precalculated gamut check. The retrieval of context may be alittle bit slow, but this function is not critical.
+static
+void TransformOnePixelWithGamutCheck(_cmsTRANSFORM* p,
+ const cmsUInt16Number wIn[],
+ cmsUInt16Number wOut[])
+{
+ cmsUInt16Number wOutOfGamut;
+
+ p ->GamutCheck ->Eval16Fn(wIn, &wOutOfGamut, p ->GamutCheck ->Data);
+ if (wOutOfGamut >= 1) {
+
+ cmsUInt16Number i;
+ _cmsAlarmCodesChunkType* ContextAlarmCodes = (_cmsAlarmCodesChunkType*) _cmsContextGetClientChunk(p->ContextID, AlarmCodesContext);
+
+ for (i=0; i < p ->Lut->OutputChannels; i++) {
+
+ wOut[i] = ContextAlarmCodes ->AlarmCodes[i];
+ }
+ }
+ else
+ p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+}
+
+// Gamut check, No cach? 16 bits.
+static
+void PrecalculatedXFORMGamutCheck(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size; // Buffer len
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum, Stride);
+ TransformOnePixelWithGamutCheck(p, wIn, wOut);
+ output = p -> ToOutput(p, wOut, output, Stride);
+ }
+}
+
+
+// No gamut check, Cach? 16 bits,
+static
+void CachedXFORM(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+ _cmsCACHE Cache;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size; // Buffer len
+
+ // Empty buffers for quick memcmp
+ memset(wIn, 0, sizeof(wIn));
+ memset(wOut, 0, sizeof(wOut));
+
+ // Get copy of zero cache
+ memcpy(&Cache, &p ->Cache, sizeof(Cache));
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum, Stride);
+
+ if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {
+
+ memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));
+ }
+ else {
+
+ p ->Lut ->Eval16Fn(wIn, wOut, p -> Lut->Data);
+
+ memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn));
+ memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));
+ }
+
+ output = p -> ToOutput(p, wOut, output, Stride);
+ }
+
+}
+
+
+// All those nice features together
+static
+void CachedXFORMGamutCheck(_cmsTRANSFORM* p,
+ const void* in,
+ void* out, cmsUInt32Number Size, cmsUInt32Number Stride)
+{
+ cmsUInt8Number* accum;
+ cmsUInt8Number* output;
+ cmsUInt16Number wIn[cmsMAXCHANNELS], wOut[cmsMAXCHANNELS];
+ cmsUInt32Number i, n;
+ _cmsCACHE Cache;
+
+ accum = (cmsUInt8Number*) in;
+ output = (cmsUInt8Number*) out;
+ n = Size; // Buffer len
+
+ // Empty buffers for quick memcmp
+ memset(wIn, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);
+ memset(wOut, 0, sizeof(cmsUInt16Number) * cmsMAXCHANNELS);
+
+ // Get copy of zero cache
+ memcpy(&Cache, &p ->Cache, sizeof(Cache));
+
+ for (i=0; i < n; i++) {
+
+ accum = p -> FromInput(p, wIn, accum, Stride);
+
+ if (memcmp(wIn, Cache.CacheIn, sizeof(Cache.CacheIn)) == 0) {
+ memcpy(wOut, Cache.CacheOut, sizeof(Cache.CacheOut));
+ }
+ else {
+ TransformOnePixelWithGamutCheck(p, wIn, wOut);
+ memcpy(Cache.CacheIn, wIn, sizeof(Cache.CacheIn));
+ memcpy(Cache.CacheOut, wOut, sizeof(Cache.CacheOut));
+ }
+
+ output = p -> ToOutput(p, wOut, output, Stride);
+ }
+
+}
+
+// -------------------------------------------------------------------------------------------------------------
+
+// List of used-defined transform factories
+typedef struct _cmsTransformCollection_st {
+
+ _cmsTransformFactory Factory;
+ struct _cmsTransformCollection_st *Next;
+
+} _cmsTransformCollection;
+
+// The linked list head
+_cmsTransformPluginChunkType _cmsTransformPluginChunk = { NULL };
+
+
+// Duplicates the zone of memory used by the plug-in in the new context
+static
+void DupPluginTransformList(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ _cmsTransformPluginChunkType newHead = { NULL };
+ _cmsTransformCollection* entry;
+ _cmsTransformCollection* Anterior = NULL;
+ _cmsTransformPluginChunkType* head = (_cmsTransformPluginChunkType*) src->chunks[TransformPlugin];
+
+ // Walk the list copying all nodes
+ for (entry = head->TransformCollection;
+ entry != NULL;
+ entry = entry ->Next) {
+
+ _cmsTransformCollection *newEntry = ( _cmsTransformCollection *) _cmsSubAllocDup(ctx ->MemPool, entry, sizeof(_cmsTransformCollection));
+
+ if (newEntry == NULL)
+ return;
+
+ // We want to keep the linked list order, so this is a little bit tricky
+ newEntry -> Next = NULL;
+ if (Anterior)
+ Anterior -> Next = newEntry;
+
+ Anterior = newEntry;
+
+ if (newHead.TransformCollection == NULL)
+ newHead.TransformCollection = newEntry;
+ }
+
+ ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx->MemPool, &newHead, sizeof(_cmsTransformPluginChunkType));
+}
+
+void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src)
+{
+ if (src != NULL) {
+
+ // Copy all linked list
+ DupPluginTransformList(ctx, src);
+ }
+ else {
+ static _cmsTransformPluginChunkType TransformPluginChunkType = { NULL };
+ ctx ->chunks[TransformPlugin] = _cmsSubAllocDup(ctx ->MemPool, &TransformPluginChunkType, sizeof(_cmsTransformPluginChunkType));
+ }
+}
+
+
+
+// Register new ways to transform
+cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Data)
+{
+ cmsPluginTransform* Plugin = (cmsPluginTransform*) Data;
+ _cmsTransformCollection* fl;
+ _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID,TransformPlugin);
+
+ if (Data == NULL) {
+
+ // Free the chain. Memory is safely freed at exit
+ ctx->TransformCollection = NULL;
+ return TRUE;
+ }
+
+ // Factory callback is required
+ if (Plugin ->Factory == NULL) return FALSE;
+
+
+ fl = (_cmsTransformCollection*) _cmsPluginMalloc(ContextID, sizeof(_cmsTransformCollection));
+ if (fl == NULL) return FALSE;
+
+ // Copy the parameters
+ fl ->Factory = Plugin ->Factory;
+
+ // Keep linked list
+ fl ->Next = ctx->TransformCollection;
+ ctx->TransformCollection = fl;
+
+ // All is ok
+ return TRUE;
+}
+
+
+void CMSEXPORT _cmsSetTransformUserData(struct _cmstransform_struct *CMMcargo, void* ptr, _cmsFreeUserDataFn FreePrivateDataFn)
+{
+ _cmsAssert(CMMcargo != NULL);
+ CMMcargo ->UserData = ptr;
+ CMMcargo ->FreeUserData = FreePrivateDataFn;
+}
+
+// returns the pointer defined by the plug-in to store private data
+void * CMSEXPORT _cmsGetTransformUserData(struct _cmstransform_struct *CMMcargo)
+{
+ _cmsAssert(CMMcargo != NULL);
+ return CMMcargo ->UserData;
+}
+
+// returns the current formatters
+void CMSEXPORT _cmsGetTransformFormatters16(struct _cmstransform_struct *CMMcargo, cmsFormatter16* FromInput, cmsFormatter16* ToOutput)
+{
+ _cmsAssert(CMMcargo != NULL);
+ if (FromInput) *FromInput = CMMcargo ->FromInput;
+ if (ToOutput) *ToOutput = CMMcargo ->ToOutput;
+}
+
+void CMSEXPORT _cmsGetTransformFormattersFloat(struct _cmstransform_struct *CMMcargo, cmsFormatterFloat* FromInput, cmsFormatterFloat* ToOutput)
+{
+ _cmsAssert(CMMcargo != NULL);
+ if (FromInput) *FromInput = CMMcargo ->FromInputFloat;
+ if (ToOutput) *ToOutput = CMMcargo ->ToOutputFloat;
+}
+
+
+// Allocate transform struct and set it to defaults. Ask the optimization plug-in about if those formats are proper
+// for separated transforms. If this is the case,
+static
+_cmsTRANSFORM* AllocEmptyTransform(cmsContext ContextID, cmsPipeline* lut,
+ cmsUInt32Number Intent, cmsUInt32Number* InputFormat, cmsUInt32Number* OutputFormat, cmsUInt32Number* dwFlags)
+{
+ _cmsTransformPluginChunkType* ctx = ( _cmsTransformPluginChunkType*) _cmsContextGetClientChunk(ContextID, TransformPlugin);
+ _cmsTransformCollection* Plugin;
+
+ // Allocate needed memory
+ _cmsTRANSFORM* p = (_cmsTRANSFORM*) _cmsMallocZero(ContextID, sizeof(_cmsTRANSFORM));
+ if (!p) return NULL;
+
+ // Store the proposed pipeline
+ p ->Lut = lut;
+
+ // Let's see if any plug-in want to do the transform by itself
+ for (Plugin = ctx ->TransformCollection;
+ Plugin != NULL;
+ Plugin = Plugin ->Next) {
+
+ if (Plugin ->Factory(&p->xform, &p->UserData, &p ->FreeUserData, &p ->Lut, InputFormat, OutputFormat, dwFlags)) {
+
+ // Last plugin in the declaration order takes control. We just keep
+ // the original parameters as a logging.
+ // Note that cmsFLAGS_CAN_CHANGE_FORMATTER is not set, so by default
+ // an optimized transform is not reusable. The plug-in can, however, change
+ // the flags and make it suitable.
+
+ p ->ContextID = ContextID;
+ p ->InputFormat = *InputFormat;
+ p ->OutputFormat = *OutputFormat;
+ p ->dwOriginalFlags = *dwFlags;
+
+ // Fill the formatters just in case the optimized routine is interested.
+ // No error is thrown if the formatter doesn't exist. It is up to the optimization
+ // factory to decide what to do in those cases.
+ p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+ p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+ p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+ p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+
+ return p;
+ }
+ }
+
+ // Not suitable for the transform plug-in, let's check the pipeline plug-in
+ if (p ->Lut != NULL)
+ _cmsOptimizePipeline(ContextID, &p->Lut, Intent, InputFormat, OutputFormat, dwFlags);
+
+ // Check whatever this is a true floating point transform
+ if (_cmsFormatterIsFloat(*InputFormat) && _cmsFormatterIsFloat(*OutputFormat)) {
+
+ // Get formatter function always return a valid union, but the contents of this union may be NULL.
+ p ->FromInputFloat = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+ p ->ToOutputFloat = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_FLOAT).FmtFloat;
+ *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+
+ if (p ->FromInputFloat == NULL || p ->ToOutputFloat == NULL) {
+
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+ _cmsFree(ContextID, p);
+ return NULL;
+ }
+
+ if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {
+
+ p ->xform = NullFloatXFORM;
+ }
+ else {
+ // Float transforms don't use cach? always are non-NULL
+ p ->xform = FloatXFORM;
+ }
+
+ }
+ else {
+
+ if (*InputFormat == 0 && *OutputFormat == 0) {
+ p ->FromInput = p ->ToOutput = NULL;
+ *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+ }
+ else {
+
+ int BytesPerPixelInput;
+
+ p ->FromInput = _cmsGetFormatter(ContextID, *InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+ p ->ToOutput = _cmsGetFormatter(ContextID, *OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+
+ if (p ->FromInput == NULL || p ->ToOutput == NULL) {
+
+ cmsSignalError(ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+ _cmsFree(ContextID, p);
+ return NULL;
+ }
+
+ BytesPerPixelInput = T_BYTES(p ->InputFormat);
+ if (BytesPerPixelInput == 0 || BytesPerPixelInput >= 2)
+ *dwFlags |= cmsFLAGS_CAN_CHANGE_FORMATTER;
+
+ }
+
+ if (*dwFlags & cmsFLAGS_NULLTRANSFORM) {
+
+ p ->xform = NullXFORM;
+ }
+ else {
+ if (*dwFlags & cmsFLAGS_NOCACHE) {
+
+ if (*dwFlags & cmsFLAGS_GAMUTCHECK)
+ p ->xform = PrecalculatedXFORMGamutCheck; // Gamut check, no cach? else
+ p ->xform = PrecalculatedXFORM; // No cach? no gamut check
+ }
+ else {
+
+ if (*dwFlags & cmsFLAGS_GAMUTCHECK)
+ p ->xform = CachedXFORMGamutCheck; // Gamut check, cach? else
+ p ->xform = CachedXFORM; // No gamut check, cach?
+ }
+ }
+ }
+
+ p ->InputFormat = *InputFormat;
+ p ->OutputFormat = *OutputFormat;
+ p ->dwOriginalFlags = *dwFlags;
+ p ->ContextID = ContextID;
+ p ->UserData = NULL;
+ return p;
+}
+
+static
+cmsBool GetXFormColorSpaces(int nProfiles, cmsHPROFILE hProfiles[], cmsColorSpaceSignature* Input, cmsColorSpaceSignature* Output)
+{
+ cmsColorSpaceSignature ColorSpaceIn, ColorSpaceOut;
+ cmsColorSpaceSignature PostColorSpace;
+ int i;
+
+ if (nProfiles <= 0) return FALSE;
+ if (hProfiles[0] == NULL) return FALSE;
+
+ *Input = PostColorSpace = cmsGetColorSpace(hProfiles[0]);
+
+ for (i=0; i < nProfiles; i++) {
+
+ cmsProfileClassSignature cls;
+ cmsHPROFILE hProfile = hProfiles[i];
+
+ int lIsInput = (PostColorSpace != cmsSigXYZData) &&
+ (PostColorSpace != cmsSigLabData);
+
+ if (hProfile == NULL) return FALSE;
+
+ cls = cmsGetDeviceClass(hProfile);
+
+ if (cls == cmsSigNamedColorClass) {
+
+ ColorSpaceIn = cmsSig1colorData;
+ ColorSpaceOut = (nProfiles > 1) ? cmsGetPCS(hProfile) : cmsGetColorSpace(hProfile);
+ }
+ else
+ if (lIsInput || (cls == cmsSigLinkClass)) {
+
+ ColorSpaceIn = cmsGetColorSpace(hProfile);
+ ColorSpaceOut = cmsGetPCS(hProfile);
+ }
+ else
+ {
+ ColorSpaceIn = cmsGetPCS(hProfile);
+ ColorSpaceOut = cmsGetColorSpace(hProfile);
+ }
+
+ if (i==0)
+ *Input = ColorSpaceIn;
+
+ PostColorSpace = ColorSpaceOut;
+ }
+
+ *Output = PostColorSpace;
+
+ return TRUE;
+}
+
+// Check colorspace
+static
+cmsBool IsProperColorSpace(cmsColorSpaceSignature Check, cmsUInt32Number dwFormat)
+{
+ int Space1 = T_COLORSPACE(dwFormat);
+ int Space2 = _cmsLCMScolorSpace(Check);
+
+ if (Space1 == PT_ANY) return TRUE;
+ if (Space1 == Space2) return TRUE;
+
+ if (Space1 == PT_LabV2 && Space2 == PT_Lab) return TRUE;
+ if (Space1 == PT_Lab && Space2 == PT_LabV2) return TRUE;
+
+ return FALSE;
+}
+
+// ----------------------------------------------------------------------------------------------------------------
+
+static
+void SetWhitePoint(cmsCIEXYZ* wtPt, const cmsCIEXYZ* src)
+{
+ if (src == NULL) {
+ wtPt ->X = cmsD50X;
+ wtPt ->Y = cmsD50Y;
+ wtPt ->Z = cmsD50Z;
+ }
+ else {
+ wtPt ->X = src->X;
+ wtPt ->Y = src->Y;
+ wtPt ->Z = src->Z;
+ }
+
+}
+
+// New to lcms 2.0 -- have all parameters available.
+cmsHTRANSFORM CMSEXPORT cmsCreateExtendedTransform(cmsContext ContextID,
+ cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsUInt32Number Intents[],
+ cmsFloat64Number AdaptationStates[],
+ cmsHPROFILE hGamutProfile,
+ cmsUInt32Number nGamutPCSposition,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number dwFlags)
+{
+ _cmsTRANSFORM* xform;
+ cmsColorSpaceSignature EntryColorSpace;
+ cmsColorSpaceSignature ExitColorSpace;
+ cmsPipeline* Lut;
+ cmsUInt32Number LastIntent = Intents[nProfiles-1];
+
+ // If it is a fake transform
+ if (dwFlags & cmsFLAGS_NULLTRANSFORM)
+ {
+ return AllocEmptyTransform(ContextID, NULL, INTENT_PERCEPTUAL, &InputFormat, &OutputFormat, &dwFlags);
+ }
+
+ // If gamut check is requested, make sure we have a gamut profile
+ if (dwFlags & cmsFLAGS_GAMUTCHECK) {
+ if (hGamutProfile == NULL) dwFlags &= ~cmsFLAGS_GAMUTCHECK;
+ }
+
+ // On floating point transforms, inhibit cache
+ if (_cmsFormatterIsFloat(InputFormat) || _cmsFormatterIsFloat(OutputFormat))
+ dwFlags |= cmsFLAGS_NOCACHE;
+
+ // Mark entry/exit spaces
+ if (!GetXFormColorSpaces(nProfiles, hProfiles, &EntryColorSpace, &ExitColorSpace)) {
+ cmsSignalError(ContextID, cmsERROR_NULL, "NULL input profiles on transform");
+ return NULL;
+ }
+
+ // Check if proper colorspaces
+ if (!IsProperColorSpace(EntryColorSpace, InputFormat)) {
+ cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong input color space on transform");
+ return NULL;
+ }
+
+ if (!IsProperColorSpace(ExitColorSpace, OutputFormat)) {
+ cmsSignalError(ContextID, cmsERROR_COLORSPACE_CHECK, "Wrong output color space on transform");
+ return NULL;
+ }
+
+ // Create a pipeline with all transformations
+ Lut = _cmsLinkProfiles(ContextID, nProfiles, Intents, hProfiles, BPC, AdaptationStates, dwFlags);
+ if (Lut == NULL) {
+ cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Couldn't link the profiles");
+ return NULL;
+ }
+
+ // Check channel count
+ if ((cmsChannelsOf(EntryColorSpace) != cmsPipelineInputChannels(Lut)) ||
+ (cmsChannelsOf(ExitColorSpace) != cmsPipelineOutputChannels(Lut))) {
+ cmsPipelineFree(Lut);
+ cmsSignalError(ContextID, cmsERROR_NOT_SUITABLE, "Channel count doesn't match. Profile is corrupted");
+ return NULL;
+ }
+
+
+ // All seems ok
+ xform = AllocEmptyTransform(ContextID, Lut, LastIntent, &InputFormat, &OutputFormat, &dwFlags);
+ if (xform == NULL) {
+ return NULL;
+ }
+
+ // Keep values
+ xform ->EntryColorSpace = EntryColorSpace;
+ xform ->ExitColorSpace = ExitColorSpace;
+ xform ->RenderingIntent = Intents[nProfiles-1];
+
+ // Take white points
+ SetWhitePoint(&xform->EntryWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[0], cmsSigMediaWhitePointTag));
+ SetWhitePoint(&xform->ExitWhitePoint, (cmsCIEXYZ*) cmsReadTag(hProfiles[nProfiles-1], cmsSigMediaWhitePointTag));
+
+
+ // Create a gamut check LUT if requested
+ if (hGamutProfile != NULL && (dwFlags & cmsFLAGS_GAMUTCHECK))
+ xform ->GamutCheck = _cmsCreateGamutCheckPipeline(ContextID, hProfiles,
+ BPC, Intents,
+ AdaptationStates,
+ nGamutPCSposition,
+ hGamutProfile);
+
+
+ // Try to read input and output colorant table
+ if (cmsIsTag(hProfiles[0], cmsSigColorantTableTag)) {
+
+ // Input table can only come in this way.
+ xform ->InputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[0], cmsSigColorantTableTag));
+ }
+
+ // Output is a little bit more complex.
+ if (cmsGetDeviceClass(hProfiles[nProfiles-1]) == cmsSigLinkClass) {
+
+ // This tag may exist only on devicelink profiles.
+ if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag)) {
+
+ // It may be NULL if error
+ xform ->OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableOutTag));
+ }
+
+ } else {
+
+ if (cmsIsTag(hProfiles[nProfiles-1], cmsSigColorantTableTag)) {
+
+ xform -> OutputColorant = cmsDupNamedColorList((cmsNAMEDCOLORLIST*) cmsReadTag(hProfiles[nProfiles-1], cmsSigColorantTableTag));
+ }
+ }
+
+ // Store the sequence of profiles
+ if (dwFlags & cmsFLAGS_KEEP_SEQUENCE) {
+ xform ->Sequence = _cmsCompileProfileSequence(ContextID, nProfiles, hProfiles);
+ }
+ else
+ xform ->Sequence = NULL;
+
+ // If this is a cached transform, init first value, which is zero (16 bits only)
+ if (!(dwFlags & cmsFLAGS_NOCACHE)) {
+
+ memset(&xform ->Cache.CacheIn, 0, sizeof(xform ->Cache.CacheIn));
+
+ if (xform ->GamutCheck != NULL) {
+ TransformOnePixelWithGamutCheck(xform, xform ->Cache.CacheIn, xform->Cache.CacheOut);
+ }
+ else {
+
+ xform ->Lut ->Eval16Fn(xform ->Cache.CacheIn, xform->Cache.CacheOut, xform -> Lut->Data);
+ }
+
+ }
+
+ return (cmsHTRANSFORM) xform;
+}
+
+// Multiprofile transforms: Gamut check is not available here, as it is unclear from which profile the gamut comes.
+cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransformTHR(cmsContext ContextID,
+ cmsHPROFILE hProfiles[],
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags)
+{
+ cmsUInt32Number i;
+ cmsBool BPC[256];
+ cmsUInt32Number Intents[256];
+ cmsFloat64Number AdaptationStates[256];
+
+ if (nProfiles <= 0 || nProfiles > 255) {
+ cmsSignalError(ContextID, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles);
+ return NULL;
+ }
+
+ for (i=0; i < nProfiles; i++) {
+ BPC[i] = dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION ? TRUE : FALSE;
+ Intents[i] = Intent;
+ AdaptationStates[i] = cmsSetAdaptationStateTHR(ContextID, -1);
+ }
+
+
+ return cmsCreateExtendedTransform(ContextID, nProfiles, hProfiles, BPC, Intents, AdaptationStates, NULL, 0, InputFormat, OutputFormat, dwFlags);
+}
+
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateMultiprofileTransform(cmsHPROFILE hProfiles[],
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags)
+{
+
+ if (nProfiles <= 0 || nProfiles > 255) {
+ cmsSignalError(NULL, cmsERROR_RANGE, "Wrong number of profiles. 1..255 expected, %d found.", nProfiles);
+ return NULL;
+ }
+
+ return cmsCreateMultiprofileTransformTHR(cmsGetProfileContextID(hProfiles[0]),
+ hProfiles,
+ nProfiles,
+ InputFormat,
+ OutputFormat,
+ Intent,
+ dwFlags);
+}
+
+cmsHTRANSFORM CMSEXPORT cmsCreateTransformTHR(cmsContext ContextID,
+ cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags)
+{
+
+ cmsHPROFILE hArray[2];
+
+ hArray[0] = Input;
+ hArray[1] = Output;
+
+ return cmsCreateMultiprofileTransformTHR(ContextID, hArray, Output == NULL ? 1 : 2, InputFormat, OutputFormat, Intent, dwFlags);
+}
+
+CMSAPI cmsHTRANSFORM CMSEXPORT cmsCreateTransform(cmsHPROFILE Input,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE Output,
+ cmsUInt32Number OutputFormat,
+ cmsUInt32Number Intent,
+ cmsUInt32Number dwFlags)
+{
+ return cmsCreateTransformTHR(cmsGetProfileContextID(Input), Input, InputFormat, Output, OutputFormat, Intent, dwFlags);
+}
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransformTHR(cmsContext ContextID,
+ cmsHPROFILE InputProfile,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE OutputProfile,
+ cmsUInt32Number OutputFormat,
+ cmsHPROFILE ProofingProfile,
+ cmsUInt32Number nIntent,
+ cmsUInt32Number ProofingIntent,
+ cmsUInt32Number dwFlags)
+{
+ cmsHPROFILE hArray[4];
+ cmsUInt32Number Intents[4];
+ cmsBool BPC[4];
+ cmsFloat64Number Adaptation[4];
+ cmsBool DoBPC = (dwFlags & cmsFLAGS_BLACKPOINTCOMPENSATION) ? TRUE : FALSE;
+
+
+ hArray[0] = InputProfile; hArray[1] = ProofingProfile; hArray[2] = ProofingProfile; hArray[3] = OutputProfile;
+ Intents[0] = nIntent; Intents[1] = nIntent; Intents[2] = INTENT_RELATIVE_COLORIMETRIC; Intents[3] = ProofingIntent;
+ BPC[0] = DoBPC; BPC[1] = DoBPC; BPC[2] = 0; BPC[3] = 0;
+
+ Adaptation[0] = Adaptation[1] = Adaptation[2] = Adaptation[3] = cmsSetAdaptationStateTHR(ContextID, -1);
+
+ if (!(dwFlags & (cmsFLAGS_SOFTPROOFING|cmsFLAGS_GAMUTCHECK)))
+ return cmsCreateTransformTHR(ContextID, InputProfile, InputFormat, OutputProfile, OutputFormat, nIntent, dwFlags);
+
+ return cmsCreateExtendedTransform(ContextID, 4, hArray, BPC, Intents, Adaptation,
+ ProofingProfile, 1, InputFormat, OutputFormat, dwFlags);
+
+}
+
+
+cmsHTRANSFORM CMSEXPORT cmsCreateProofingTransform(cmsHPROFILE InputProfile,
+ cmsUInt32Number InputFormat,
+ cmsHPROFILE OutputProfile,
+ cmsUInt32Number OutputFormat,
+ cmsHPROFILE ProofingProfile,
+ cmsUInt32Number nIntent,
+ cmsUInt32Number ProofingIntent,
+ cmsUInt32Number dwFlags)
+{
+ return cmsCreateProofingTransformTHR(cmsGetProfileContextID(InputProfile),
+ InputProfile,
+ InputFormat,
+ OutputProfile,
+ OutputFormat,
+ ProofingProfile,
+ nIntent,
+ ProofingIntent,
+ dwFlags);
+}
+
+
+// Grab the ContextID from an open transform. Returns NULL if a NULL transform is passed
+cmsContext CMSEXPORT cmsGetTransformContextID(cmsHTRANSFORM hTransform)
+{
+ _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+ if (xform == NULL) return NULL;
+ return xform -> ContextID;
+}
+
+// Grab the input/output formats
+cmsUInt32Number CMSEXPORT cmsGetTransformInputFormat(cmsHTRANSFORM hTransform)
+{
+ _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+ if (xform == NULL) return 0;
+ return xform->InputFormat;
+}
+
+cmsUInt32Number CMSEXPORT cmsGetTransformOutputFormat(cmsHTRANSFORM hTransform)
+{
+ _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+
+ if (xform == NULL) return 0;
+ return xform->OutputFormat;
+}
+
+// For backwards compatibility
+cmsBool CMSEXPORT cmsChangeBuffersFormat(cmsHTRANSFORM hTransform,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat)
+{
+
+ _cmsTRANSFORM* xform = (_cmsTRANSFORM*) hTransform;
+ cmsFormatter16 FromInput, ToOutput;
+
+
+ // We only can afford to change formatters if previous transform is at least 16 bits
+ if (!(xform ->dwOriginalFlags & cmsFLAGS_CAN_CHANGE_FORMATTER)) {
+
+ cmsSignalError(xform ->ContextID, cmsERROR_NOT_SUITABLE, "cmsChangeBuffersFormat works only on transforms created originally with at least 16 bits of precision");
+ return FALSE;
+ }
+
+ FromInput = _cmsGetFormatter(xform->ContextID, InputFormat, cmsFormatterInput, CMS_PACK_FLAGS_16BITS).Fmt16;
+ ToOutput = _cmsGetFormatter(xform->ContextID, OutputFormat, cmsFormatterOutput, CMS_PACK_FLAGS_16BITS).Fmt16;
+
+ if (FromInput == NULL || ToOutput == NULL) {
+
+ cmsSignalError(xform -> ContextID, cmsERROR_UNKNOWN_EXTENSION, "Unsupported raster format");
+ return FALSE;
+ }
+
+ xform ->InputFormat = InputFormat;
+ xform ->OutputFormat = OutputFormat;
+ xform ->FromInput = FromInput;
+ xform ->ToOutput = ToOutput;
+ return TRUE;
+}
diff --git a/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h b/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h
new file mode 100644
index 0000000000..5119218ceb
--- /dev/null
+++ b/core/src/fxcodec/lcms2/lcms2-2.6/src/lcms2_internal.h
@@ -0,0 +1,1032 @@
+//<<<+++OPENSOURCE
+//<<<+++OPENSOURCE_MUST_BEGIN COMMENT==TRUE
+//
+// Little Color Management System
+// Copyright (c) 1998-2014 Marti Maria Saguer
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the Software
+// is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+//---------------------------------------------------------------------------------
+//
+
+#ifndef _lcms_internal_H
+
+// Include plug-in foundation
+#ifndef _lcms_plugin_H
+# include "../include/lcms2_plugin.h"
+#endif
+
+// ctype is part of C99 as per 7.1.2
+#include <ctype.h>
+
+// assert macro is part of C99 as per 7.2
+#include <assert.h>
+
+// Some needed constants
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+#ifndef M_LOG10E
+# define M_LOG10E 0.434294481903251827651
+#endif
+
+// BorlandC 5.5, VC2003 are broken on that
+#if defined(__BORLANDC__) || (_MSC_VER < 1400) // 1400 == VC++ 8.0
+#define sinf(x) (float)sin((float)x)
+#define sqrtf(x) (float)sqrt((float)x)
+#endif
+
+
+// Alignment of ICC file format uses 4 bytes (cmsUInt32Number)
+#define _cmsALIGNLONG(x) (((x)+(sizeof(cmsUInt32Number)-1)) & ~(sizeof(cmsUInt32Number)-1))
+
+// Alignment to memory pointer
+#define _cmsALIGNMEM(x) (((x)+(sizeof(void *) - 1)) & ~(sizeof(void *) - 1))
+
+// Maximum encodeable values in floating point
+#define MAX_ENCODEABLE_XYZ (1.0 + 32767.0/32768.0)
+#define MIN_ENCODEABLE_ab2 (-128.0)
+#define MAX_ENCODEABLE_ab2 ((65535.0/256.0) - 128.0)
+#define MIN_ENCODEABLE_ab4 (-128.0)
+#define MAX_ENCODEABLE_ab4 (127.0)
+
+// Maximum of channels for internal pipeline evaluation
+#define MAX_STAGE_CHANNELS 128
+
+// Unused parameter warning supression
+#define cmsUNUSED_PARAMETER(x) ((void)x)
+
+// The specification for "inline" is section 6.7.4 of the C99 standard (ISO/IEC 9899:1999).
+// unfortunately VisualC++ does not conform that
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+# define cmsINLINE __inline
+#else
+# define cmsINLINE static inline
+#endif
+
+// Other replacement functions
+#ifdef _MSC_VER
+# ifndef snprintf
+# define snprintf _snprintf
+# endif
+# ifndef vsnprintf
+# define vsnprintf _vsnprintf
+# endif
+#endif
+
+
+// A fast way to convert from/to 16 <-> 8 bits
+#define FROM_8_TO_16(rgb) (cmsUInt16Number) ((((cmsUInt16Number) (rgb)) << 8)|(rgb))
+#define FROM_16_TO_8(rgb) (cmsUInt8Number) ((((rgb) * 65281 + 8388608) >> 24) & 0xFF)
+
+// Code analysis is broken on asserts
+#ifdef _MSC_VER
+# if (_MSC_VER >= 1500)
+# define _cmsAssert(a) { assert((a)); __analysis_assume((a)); }
+# else
+# define _cmsAssert(a) assert((a))
+# endif
+#else
+# define _cmsAssert(a) assert((a))
+#endif
+
+//---------------------------------------------------------------------------------
+
+// Determinant lower than that are assumed zero (used on matrix invert)
+#define MATRIX_DET_TOLERANCE 0.0001
+
+//---------------------------------------------------------------------------------
+
+// Fixed point
+#define FIXED_TO_INT(x) ((x)>>16)
+#define FIXED_REST_TO_INT(x) ((x)&0xFFFFU)
+#define ROUND_FIXED_TO_INT(x) (((x)+0x8000)>>16)
+
+cmsINLINE cmsS15Fixed16Number _cmsToFixedDomain(int a) { return a + ((a + 0x7fff) / 0xffff); }
+cmsINLINE int _cmsFromFixedDomain(cmsS15Fixed16Number a) { return a - ((a + 0x7fff) >> 16); }
+
+// -----------------------------------------------------------------------------------------------------------
+
+// Fast floor conversion logic. Thanks to Sree Kotay and Stuart Nixon
+// note than this only works in the range ..-32767...+32767 because
+// mantissa is interpreted as 15.16 fixed point.
+// The union is to avoid pointer aliasing overoptimization.
+cmsINLINE int _cmsQuickFloor(cmsFloat64Number val)
+{
+#ifdef CMS_DONT_USE_FAST_FLOOR
+ return (int) floor(val);
+#else
+ const cmsFloat64Number _lcms_double2fixmagic = 68719476736.0 * 1.5; // 2^36 * 1.5, (52-16=36) uses limited precision to floor
+ union {
+ cmsFloat64Number val;
+ int halves[2];
+ } temp;
+
+ temp.val = val + _lcms_double2fixmagic;
+
+#ifdef CMS_USE_BIG_ENDIAN
+ return temp.halves[1] >> 16;
+#else
+ return temp.halves[0] >> 16;
+#endif
+#endif
+}
+
+// Fast floor restricted to 0..65535.0
+cmsINLINE cmsUInt16Number _cmsQuickFloorWord(cmsFloat64Number d)
+{
+ return (cmsUInt16Number) _cmsQuickFloor(d - 32767.0) + 32767U;
+}
+
+// Floor to word, taking care of saturation
+cmsINLINE cmsUInt16Number _cmsQuickSaturateWord(cmsFloat64Number d)
+{
+ d += 0.5;
+ if (d <= 0) return 0;
+ if (d >= 65535.0) return 0xffff;
+
+ return _cmsQuickFloorWord(d);
+}
+
+
+// Pthread support --------------------------------------------------------------------
+#ifndef CMS_NO_PTHREADS
+
+// This is the threading support. Unfortunately, it has to be platform-dependent because
+// windows does not support pthreads.
+
+#ifdef CMS_IS_WINDOWS_
+
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+
+
+// From: http://locklessinc.com/articles/pthreads_on_windows/
+// The pthreads API has an initialization macro that has no correspondence to anything in
+// the windows API. By investigating the internal definition of the critical section type,
+// one may work out how to initialize one without calling InitializeCriticalSection().
+// The trick here is that InitializeCriticalSection() is not allowed to fail. It tries
+// to allocate a critical section debug object, but if no memory is available, it sets
+// the pointer to a specific value. (One would expect that value to be NULL, but it is
+// actually (void *)-1 for some reason.) Thus we can use this special value for that
+// pointer, and the critical section code will work.
+
+// The other important part of the critical section type to initialize is the number
+// of waiters. This controls whether or not the mutex is locked. Fortunately, this
+// part of the critical section is unlikely to change. Apparently, many programs
+// already test critical sections to see if they are locked using this value, so
+// Microsoft felt that it was necessary to keep it set at -1 for an unlocked critical
+// section, even when they changed the underlying algorithm to be more scalable.
+// The final parts of the critical section object are unimportant, and can be set
+// to zero for their defaults. This yields an initialization macro:
+
+typedef CRITICAL_SECTION _cmsMutex;
+
+#define CMS_MUTEX_INITIALIZER {(void*) -1,-1,0,0,0,0}
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+ EnterCriticalSection(m);
+ return 0;
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+ LeaveCriticalSection(m);
+ return 0;
+}
+
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+ InitializeCriticalSection(m);
+ return 0;
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+ DeleteCriticalSection(m);
+ return 0;
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+ EnterCriticalSection(m);
+ return 0;
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+ LeaveCriticalSection(m);
+ return 0;
+}
+
+#else
+
+// Rest of the wide world
+#include <pthread.h>
+
+#define CMS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
+typedef pthread_mutex_t _cmsMutex;
+
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_lock(m);
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_unlock(m);
+}
+
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_init(m, NULL);
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_destroy(m);
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_lock(m);
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+ return pthread_mutex_unlock(m);
+}
+
+#endif
+#else
+
+#define CMS_MUTEX_INITIALIZER 0
+typedef int _cmsMutex;
+
+
+cmsINLINE int _cmsLockPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsUnlockPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsInitMutexPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsDestroyMutexPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsEnterCriticalSectionPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+
+cmsINLINE int _cmsLeaveCriticalSectionPrimitive(_cmsMutex *m)
+{
+ return 0;
+ cmsUNUSED_PARAMETER(m);
+}
+#endif
+
+// Plug-In registration ---------------------------------------------------------------
+
+// Specialized function for plug-in memory management. No pairing free() since whole pool is freed at once.
+void* _cmsPluginMalloc(cmsContext ContextID, cmsUInt32Number size);
+
+// Memory management
+cmsBool _cmsRegisterMemHandlerPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Interpolation
+cmsBool _cmsRegisterInterpPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Parametric curves
+cmsBool _cmsRegisterParametricCurvesPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Formatters management
+cmsBool _cmsRegisterFormattersPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Tag type management
+cmsBool _cmsRegisterTagTypePlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Tag management
+cmsBool _cmsRegisterTagPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Intent management
+cmsBool _cmsRegisterRenderingIntentPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Multi Process elements
+cmsBool _cmsRegisterMultiProcessElementPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Optimization
+cmsBool _cmsRegisterOptimizationPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Transform
+cmsBool _cmsRegisterTransformPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// Mutex
+cmsBool _cmsRegisterMutexPlugin(cmsContext ContextID, cmsPluginBase* Plugin);
+
+// ---------------------------------------------------------------------------------------------------------
+
+// Suballocators.
+typedef struct _cmsSubAllocator_chunk_st {
+
+ cmsUInt8Number* Block;
+ cmsUInt32Number BlockSize;
+ cmsUInt32Number Used;
+
+ struct _cmsSubAllocator_chunk_st* next;
+
+} _cmsSubAllocator_chunk;
+
+
+typedef struct {
+
+ cmsContext ContextID;
+ _cmsSubAllocator_chunk* h;
+
+} _cmsSubAllocator;
+
+
+_cmsSubAllocator* _cmsCreateSubAlloc(cmsContext ContextID, cmsUInt32Number Initial);
+void _cmsSubAllocDestroy(_cmsSubAllocator* s);
+void* _cmsSubAlloc(_cmsSubAllocator* s, cmsUInt32Number size);
+void* _cmsSubAllocDup(_cmsSubAllocator* s, const void *ptr, cmsUInt32Number size);
+
+// ----------------------------------------------------------------------------------
+
+// The context clients.
+typedef enum {
+
+ UserPtr, // User-defined pointer
+ Logger,
+ AlarmCodesContext,
+ AdaptationStateContext,
+ MemPlugin,
+ InterpPlugin,
+ CurvesPlugin,
+ FormattersPlugin,
+ TagTypePlugin,
+ TagPlugin,
+ IntentPlugin,
+ MPEPlugin,
+ OptimizationPlugin,
+ TransformPlugin,
+ MutexPlugin,
+
+ // Last in list
+ MemoryClientMax
+
+} _cmsMemoryClient;
+
+
+// Container for memory management plug-in.
+typedef struct {
+
+ _cmsMallocFnPtrType MallocPtr;
+ _cmsMalloZerocFnPtrType MallocZeroPtr;
+ _cmsFreeFnPtrType FreePtr;
+ _cmsReallocFnPtrType ReallocPtr;
+ _cmsCallocFnPtrType CallocPtr;
+ _cmsDupFnPtrType DupPtr;
+
+} _cmsMemPluginChunkType;
+
+// Copy memory management function pointers from plug-in to chunk, taking care of missing routines
+void _cmsInstallAllocFunctions(cmsPluginMemHandler* Plugin, _cmsMemPluginChunkType* ptr);
+
+// Internal structure for context
+struct _cmsContext_struct {
+
+ struct _cmsContext_struct* Next; // Points to next context in the new style
+ _cmsSubAllocator* MemPool; // The memory pool that stores context data
+
+ void* chunks[MemoryClientMax]; // array of pointers to client chunks. Memory itself is hold in the suballocator.
+ // If NULL, then it reverts to global Context0
+
+ _cmsMemPluginChunkType DefaultMemoryManager; // The allocators used for creating the context itself. Cannot be overriden
+};
+
+// Returns a pointer to a valid context structure, including the global one if id is zero.
+// Verifies the magic number.
+struct _cmsContext_struct* _cmsGetContext(cmsContext ContextID);
+
+// Returns the block assigned to the specific zone.
+void* _cmsContextGetClientChunk(cmsContext id, _cmsMemoryClient mc);
+
+
+// Chunks of context memory by plug-in client -------------------------------------------------------
+
+// Those structures encapsulates all variables needed by the several context clients (mostly plug-ins)
+
+// Container for error logger -- not a plug-in
+typedef struct {
+
+ cmsLogErrorHandlerFunction LogErrorHandler; // Set to NULL for Context0 fallback
+
+} _cmsLogErrorChunkType;
+
+// The global Context0 storage for error logger
+extern _cmsLogErrorChunkType _cmsLogErrorChunk;
+
+// Allocate and init error logger container.
+void _cmsAllocLogErrorChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for alarm codes -- not a plug-in
+typedef struct {
+
+ cmsUInt16Number AlarmCodes[cmsMAXCHANNELS];
+
+} _cmsAlarmCodesChunkType;
+
+// The global Context0 storage for alarm codes
+extern _cmsAlarmCodesChunkType _cmsAlarmCodesChunk;
+
+// Allocate and init alarm codes container.
+void _cmsAllocAlarmCodesChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for adaptation state -- not a plug-in
+typedef struct {
+
+ cmsFloat64Number AdaptationState;
+
+} _cmsAdaptationStateChunkType;
+
+// The global Context0 storage for adaptation state
+extern _cmsAdaptationStateChunkType _cmsAdaptationStateChunk;
+
+// Allocate and init adaptation state container.
+void _cmsAllocAdaptationStateChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+
+// The global Context0 storage for memory management
+extern _cmsMemPluginChunkType _cmsMemPluginChunk;
+
+// Allocate and init memory management container.
+void _cmsAllocMemPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for interpolation plug-in
+typedef struct {
+
+ cmsInterpFnFactory Interpolators;
+
+} _cmsInterpPluginChunkType;
+
+// The global Context0 storage for interpolation plug-in
+extern _cmsInterpPluginChunkType _cmsInterpPluginChunk;
+
+// Allocate and init interpolation container.
+void _cmsAllocInterpPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for parametric curves plug-in
+typedef struct {
+
+ struct _cmsParametricCurvesCollection_st* ParametricCurves;
+
+} _cmsCurvesPluginChunkType;
+
+// The global Context0 storage for tone curves plug-in
+extern _cmsCurvesPluginChunkType _cmsCurvesPluginChunk;
+
+// Allocate and init parametric curves container.
+void _cmsAllocCurvesPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for formatters plug-in
+typedef struct {
+
+ struct _cms_formatters_factory_list* FactoryList;
+
+} _cmsFormattersPluginChunkType;
+
+// The global Context0 storage for formatters plug-in
+extern _cmsFormattersPluginChunkType _cmsFormattersPluginChunk;
+
+// Allocate and init formatters container.
+void _cmsAllocFormattersPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// This chunk type is shared by TagType plug-in and MPE Plug-in
+typedef struct {
+
+ struct _cmsTagTypeLinkedList_st* TagTypes;
+
+} _cmsTagTypePluginChunkType;
+
+
+// The global Context0 storage for tag types plug-in
+extern _cmsTagTypePluginChunkType _cmsTagTypePluginChunk;
+
+
+// The global Context0 storage for mult process elements plug-in
+extern _cmsTagTypePluginChunkType _cmsMPETypePluginChunk;
+
+// Allocate and init Tag types container.
+void _cmsAllocTagTypePluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+// Allocate and init MPE container.
+void _cmsAllocMPETypePluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+// Container for tag plug-in
+typedef struct {
+
+ struct _cmsTagLinkedList_st* Tag;
+
+} _cmsTagPluginChunkType;
+
+
+// The global Context0 storage for tag plug-in
+extern _cmsTagPluginChunkType _cmsTagPluginChunk;
+
+// Allocate and init Tag container.
+void _cmsAllocTagPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for intents plug-in
+typedef struct {
+
+ struct _cms_intents_list* Intents;
+
+} _cmsIntentsPluginChunkType;
+
+
+// The global Context0 storage for intents plug-in
+extern _cmsIntentsPluginChunkType _cmsIntentsPluginChunk;
+
+// Allocate and init intents container.
+void _cmsAllocIntentsPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for optimization plug-in
+typedef struct {
+
+ struct _cmsOptimizationCollection_st* OptimizationCollection;
+
+} _cmsOptimizationPluginChunkType;
+
+
+// The global Context0 storage for optimizers plug-in
+extern _cmsOptimizationPluginChunkType _cmsOptimizationPluginChunk;
+
+// Allocate and init optimizers container.
+void _cmsAllocOptimizationPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for transform plug-in
+typedef struct {
+
+ struct _cmsTransformCollection_st* TransformCollection;
+
+} _cmsTransformPluginChunkType;
+
+// The global Context0 storage for full-transform replacement plug-in
+extern _cmsTransformPluginChunkType _cmsTransformPluginChunk;
+
+// Allocate and init transform container.
+void _cmsAllocTransformPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// Container for mutex plug-in
+typedef struct {
+
+ _cmsCreateMutexFnPtrType CreateMutexPtr;
+ _cmsDestroyMutexFnPtrType DestroyMutexPtr;
+ _cmsLockMutexFnPtrType LockMutexPtr;
+ _cmsUnlockMutexFnPtrType UnlockMutexPtr;
+
+} _cmsMutexPluginChunkType;
+
+// The global Context0 storage for mutex plug-in
+extern _cmsMutexPluginChunkType _cmsMutexPluginChunk;
+
+// Allocate and init mutex container.
+void _cmsAllocMutexPluginChunk(struct _cmsContext_struct* ctx,
+ const struct _cmsContext_struct* src);
+
+// ----------------------------------------------------------------------------------
+// MLU internal representation
+typedef struct {
+
+ cmsUInt16Number Language;
+ cmsUInt16Number Country;
+
+ cmsUInt32Number StrW; // Offset to current unicode string
+ cmsUInt32Number Len; // Length in bytes
+
+} _cmsMLUentry;
+
+struct _cms_MLU_struct {
+
+ cmsContext ContextID;
+
+ // The directory
+ int AllocatedEntries;
+ int UsedEntries;
+ _cmsMLUentry* Entries; // Array of pointers to strings allocated in MemPool
+
+ // The Pool
+ cmsUInt32Number PoolSize; // The maximum allocated size
+ cmsUInt32Number PoolUsed; // The used size
+ void* MemPool; // Pointer to begin of memory pool
+};
+
+// Named color list internal representation
+typedef struct {
+
+ char Name[cmsMAX_PATH];
+ cmsUInt16Number PCS[3];
+ cmsUInt16Number DeviceColorant[cmsMAXCHANNELS];
+
+} _cmsNAMEDCOLOR;
+
+struct _cms_NAMEDCOLORLIST_struct {
+
+ cmsUInt32Number nColors;
+ cmsUInt32Number Allocated;
+ cmsUInt32Number ColorantCount;
+
+ char Prefix[33]; // Prefix and suffix are defined to be 32 characters at most
+ char Suffix[33];
+
+ _cmsNAMEDCOLOR* List;
+
+ cmsContext ContextID;
+};
+
+
+// ----------------------------------------------------------------------------------
+
+// This is the internal struct holding profile details.
+
+// Maximum supported tags in a profile
+#define MAX_TABLE_TAG 100
+
+typedef struct _cms_iccprofile_struct {
+
+ // I/O handler
+ cmsIOHANDLER* IOhandler;
+
+ // The thread ID
+ cmsContext ContextID;
+
+ // Creation time
+ struct tm Created;
+
+ // Only most important items found in ICC profiles
+ cmsUInt32Number Version;
+ cmsProfileClassSignature DeviceClass;
+ cmsColorSpaceSignature ColorSpace;
+ cmsColorSpaceSignature PCS;
+ cmsUInt32Number RenderingIntent;
+
+ cmsUInt32Number flags;
+ cmsUInt32Number manufacturer, model;
+ cmsUInt64Number attributes;
+ cmsUInt32Number creator;
+
+ cmsProfileID ProfileID;
+
+ // Dictionary
+ cmsUInt32Number TagCount;
+ cmsTagSignature TagNames[MAX_TABLE_TAG];
+ cmsTagSignature TagLinked[MAX_TABLE_TAG]; // The tag to wich is linked (0=none)
+ cmsUInt32Number TagSizes[MAX_TABLE_TAG]; // Size on disk
+ cmsUInt32Number TagOffsets[MAX_TABLE_TAG];
+ cmsBool TagSaveAsRaw[MAX_TABLE_TAG]; // True to write uncooked
+ void * TagPtrs[MAX_TABLE_TAG];
+ cmsTagTypeHandler* TagTypeHandlers[MAX_TABLE_TAG]; // Same structure may be serialized on different types
+ // depending on profile version, so we keep track of the
+ // type handler for each tag in the list.
+ // Special
+ cmsBool IsWrite;
+
+ // Keep a mutex for cmsReadTag -- Note that this only works if the user includes a mutex plugin
+ void * UsrMutex;
+
+} _cmsICCPROFILE;
+
+// IO helpers for profiles
+cmsBool _cmsReadHeader(_cmsICCPROFILE* Icc);
+cmsBool _cmsWriteHeader(_cmsICCPROFILE* Icc, cmsUInt32Number UsedSpace);
+int _cmsSearchTag(_cmsICCPROFILE* Icc, cmsTagSignature sig, cmsBool lFollowLinks);
+
+// Tag types
+cmsTagTypeHandler* _cmsGetTagTypeHandler(cmsContext ContextID, cmsTagTypeSignature sig);
+cmsTagTypeSignature _cmsGetTagTrueType(cmsHPROFILE hProfile, cmsTagSignature sig);
+cmsTagDescriptor* _cmsGetTagDescriptor(cmsContext ContextID, cmsTagSignature sig);
+
+// Error logging ---------------------------------------------------------------------------------------------------------
+
+void _cmsTagSignature2String(char String[5], cmsTagSignature sig);
+
+// Interpolation ---------------------------------------------------------------------------------------------------------
+
+cmsInterpParams* _cmsComputeInterpParams(cmsContext ContextID, int nSamples, int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);
+cmsInterpParams* _cmsComputeInterpParamsEx(cmsContext ContextID, const cmsUInt32Number nSamples[], int InputChan, int OutputChan, const void* Table, cmsUInt32Number dwFlags);
+void _cmsFreeInterpParams(cmsInterpParams* p);
+cmsBool _cmsSetInterpolationRoutine(cmsContext ContextID, cmsInterpParams* p);
+
+// Curves ----------------------------------------------------------------------------------------------------------------
+
+// This struct holds information about a segment, plus a pointer to the function that implements the evaluation.
+// In the case of table-based, Eval pointer is set to NULL
+
+// The gamma function main structure
+struct _cms_curve_struct {
+
+ cmsInterpParams* InterpParams; // Private optimizations for interpolation
+
+ cmsUInt32Number nSegments; // Number of segments in the curve. Zero for a 16-bit based tables
+ cmsCurveSegment* Segments; // The segments
+ cmsInterpParams** SegInterp; // Array of private optimizations for interpolation in table-based segments
+
+ cmsParametricCurveEvaluator* Evals; // Evaluators (one per segment)
+
+ // 16 bit Table-based representation follows
+ cmsUInt32Number nEntries; // Number of table elements
+ cmsUInt16Number* Table16; // The table itself.
+};
+
+
+// Pipelines & Stages ---------------------------------------------------------------------------------------------
+
+// A single stage
+struct _cmsStage_struct {
+
+ cmsContext ContextID;
+
+ cmsStageSignature Type; // Identifies the stage
+ cmsStageSignature Implements; // Identifies the *function* of the stage (for optimizations)
+
+ cmsUInt32Number InputChannels; // Input channels -- for optimization purposes
+ cmsUInt32Number OutputChannels; // Output channels -- for optimization purposes
+
+ _cmsStageEvalFn EvalPtr; // Points to fn that evaluates the stage (always in floating point)
+ _cmsStageDupElemFn DupElemPtr; // Points to a fn that duplicates the *data* of the stage
+ _cmsStageFreeElemFn FreePtr; // Points to a fn that sets the *data* of the stage free
+
+ // A generic pointer to whatever memory needed by the stage
+ void* Data;
+
+ // Maintains linked list (used internally)
+ struct _cmsStage_struct* Next;
+};
+
+
+// Special Stages (cannot be saved)
+cmsStage* _cmsStageAllocLab2XYZ(cmsContext ContextID);
+cmsStage* _cmsStageAllocXYZ2Lab(cmsContext ContextID);
+cmsStage* _cmsStageAllocLabPrelin(cmsContext ContextID);
+cmsStage* _cmsStageAllocLabV2ToV4(cmsContext ContextID);
+cmsStage* _cmsStageAllocLabV2ToV4curves(cmsContext ContextID);
+cmsStage* _cmsStageAllocLabV4ToV2(cmsContext ContextID);
+cmsStage* _cmsStageAllocNamedColor(cmsNAMEDCOLORLIST* NamedColorList, cmsBool UsePCS);
+cmsStage* _cmsStageAllocIdentityCurves(cmsContext ContextID, int nChannels);
+cmsStage* _cmsStageAllocIdentityCLut(cmsContext ContextID, int nChan);
+cmsStage* _cmsStageNormalizeFromLabFloat(cmsContext ContextID);
+cmsStage* _cmsStageNormalizeFromXyzFloat(cmsContext ContextID);
+cmsStage* _cmsStageNormalizeToLabFloat(cmsContext ContextID);
+cmsStage* _cmsStageNormalizeToXyzFloat(cmsContext ContextID);
+
+// For curve set only
+cmsToneCurve** _cmsStageGetPtrToCurveSet(const cmsStage* mpe);
+
+
+// Pipeline Evaluator (in floating point)
+typedef void (* _cmsPipelineEvalFloatFn)(const cmsFloat32Number In[],
+ cmsFloat32Number Out[],
+ const void* Data);
+
+struct _cmsPipeline_struct {
+
+ cmsStage* Elements; // Points to elements chain
+ cmsUInt32Number InputChannels, OutputChannels;
+
+ // Data & evaluators
+ void *Data;
+
+ _cmsOPTeval16Fn Eval16Fn;
+ _cmsPipelineEvalFloatFn EvalFloatFn;
+ _cmsFreeUserDataFn FreeDataFn;
+ _cmsDupUserDataFn DupDataFn;
+
+ cmsContext ContextID; // Environment
+
+ cmsBool SaveAs8Bits; // Implementation-specific: save as 8 bits if possible
+};
+
+// LUT reading & creation -------------------------------------------------------------------------------------------
+
+// Read tags using low-level function, provide necessary glue code to adapt versions, etc. All those return a brand new copy
+// of the LUTS, since ownership of original is up to the profile. The user should free allocated resources.
+
+cmsPipeline* _cmsReadInputLUT(cmsHPROFILE hProfile, int Intent);
+cmsPipeline* _cmsReadOutputLUT(cmsHPROFILE hProfile, int Intent);
+cmsPipeline* _cmsReadDevicelinkLUT(cmsHPROFILE hProfile, int Intent);
+
+// Special values
+cmsBool _cmsReadMediaWhitePoint(cmsCIEXYZ* Dest, cmsHPROFILE hProfile);
+cmsBool _cmsReadCHAD(cmsMAT3* Dest, cmsHPROFILE hProfile);
+
+// Profile linker --------------------------------------------------------------------------------------------------
+
+cmsPipeline* _cmsLinkProfiles(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number TheIntents[],
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+// Sequence --------------------------------------------------------------------------------------------------------
+
+cmsSEQ* _cmsReadProfileSequence(cmsHPROFILE hProfile);
+cmsBool _cmsWriteProfileSequence(cmsHPROFILE hProfile, const cmsSEQ* seq);
+cmsSEQ* _cmsCompileProfileSequence(cmsContext ContextID, cmsUInt32Number nProfiles, cmsHPROFILE hProfiles[]);
+
+
+// LUT optimization ------------------------------------------------------------------------------------------------
+
+cmsUInt16Number _cmsQuantizeVal(cmsFloat64Number i, int MaxSamples);
+int _cmsReasonableGridpointsByColorspace(cmsColorSpaceSignature Colorspace, cmsUInt32Number dwFlags);
+
+cmsBool _cmsEndPointsBySpace(cmsColorSpaceSignature Space,
+ cmsUInt16Number **White,
+ cmsUInt16Number **Black,
+ cmsUInt32Number *nOutputs);
+
+cmsBool _cmsOptimizePipeline(cmsContext ContextID,
+ cmsPipeline** Lut,
+ int Intent,
+ cmsUInt32Number* InputFormat,
+ cmsUInt32Number* OutputFormat,
+ cmsUInt32Number* dwFlags );
+
+
+// Hi level LUT building ----------------------------------------------------------------------------------------------
+
+cmsPipeline* _cmsCreateGamutCheckPipeline(cmsContext ContextID,
+ cmsHPROFILE hProfiles[],
+ cmsBool BPC[],
+ cmsUInt32Number Intents[],
+ cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number nGamutPCSposition,
+ cmsHPROFILE hGamut);
+
+
+// Formatters ------------------------------------------------------------------------------------------------------------
+
+#define cmsFLAGS_CAN_CHANGE_FORMATTER 0x02000000 // Allow change buffer format
+
+cmsBool _cmsFormatterIsFloat(cmsUInt32Number Type);
+cmsBool _cmsFormatterIs8bit(cmsUInt32Number Type);
+
+cmsFormatter _cmsGetFormatter(cmsContext ContextID,
+ cmsUInt32Number Type, // Specific type, i.e. TYPE_RGB_8
+ cmsFormatterDirection Dir,
+ cmsUInt32Number dwFlags);
+
+
+#ifndef CMS_NO_HALF_SUPPORT
+
+// Half float
+cmsFloat32Number _cmsHalf2Float(cmsUInt16Number h);
+cmsUInt16Number _cmsFloat2Half(cmsFloat32Number flt);
+
+#endif
+
+// Transform logic ------------------------------------------------------------------------------------------------------
+
+struct _cmstransform_struct;
+
+typedef struct {
+
+ // 1-pixel cache (16 bits only)
+ cmsUInt16Number CacheIn[cmsMAXCHANNELS];
+ cmsUInt16Number CacheOut[cmsMAXCHANNELS];
+
+} _cmsCACHE;
+
+
+
+// Transformation
+typedef struct _cmstransform_struct {
+
+ cmsUInt32Number InputFormat, OutputFormat; // Keep formats for further reference
+
+ // Points to transform code
+ _cmsTransformFn xform;
+
+ // Formatters, cannot be embedded into LUT because cache
+ cmsFormatter16 FromInput;
+ cmsFormatter16 ToOutput;
+
+ cmsFormatterFloat FromInputFloat;
+ cmsFormatterFloat ToOutputFloat;
+
+ // 1-pixel cache seed for zero as input (16 bits, read only)
+ _cmsCACHE Cache;
+
+ // A Pipeline holding the full (optimized) transform
+ cmsPipeline* Lut;
+
+ // A Pipeline holding the gamut check. It goes from the input space to bilevel
+ cmsPipeline* GamutCheck;
+
+ // Colorant tables
+ cmsNAMEDCOLORLIST* InputColorant; // Input Colorant table
+ cmsNAMEDCOLORLIST* OutputColorant; // Colorant table (for n chans > CMYK)
+
+ // Informational only
+ cmsColorSpaceSignature EntryColorSpace;
+ cmsColorSpaceSignature ExitColorSpace;
+
+ // White points (informative only)
+ cmsCIEXYZ EntryWhitePoint;
+ cmsCIEXYZ ExitWhitePoint;
+
+ // Profiles used to create the transform
+ cmsSEQ* Sequence;
+
+ cmsUInt32Number dwOriginalFlags;
+ cmsFloat64Number AdaptationState;
+
+ // The intent of this transform. That is usually the last intent in the profilechain, but may differ
+ cmsUInt32Number RenderingIntent;
+
+ // An id that uniquely identifies the running context. May be null.
+ cmsContext ContextID;
+
+ // A user-defined pointer that can be used to store data for transform plug-ins
+ void* UserData;
+ _cmsFreeUserDataFn FreeUserData;
+
+} _cmsTRANSFORM;
+
+// --------------------------------------------------------------------------------------------------
+
+cmsHTRANSFORM _cmsChain2Lab(cmsContext ContextID,
+ cmsUInt32Number nProfiles,
+ cmsUInt32Number InputFormat,
+ cmsUInt32Number OutputFormat,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+
+cmsToneCurve* _cmsBuildKToneCurve(cmsContext ContextID,
+ cmsUInt32Number nPoints,
+ cmsUInt32Number nProfiles,
+ const cmsUInt32Number Intents[],
+ const cmsHPROFILE hProfiles[],
+ const cmsBool BPC[],
+ const cmsFloat64Number AdaptationStates[],
+ cmsUInt32Number dwFlags);
+
+cmsBool _cmsAdaptationMatrix(cmsMAT3* r, const cmsMAT3* ConeMatrix, const cmsCIEXYZ* FromIll, const cmsCIEXYZ* ToIll);
+
+cmsBool _cmsBuildRGB2XYZtransferMatrix(cmsMAT3* r, const cmsCIExyY* WhitePoint, const cmsCIExyYTRIPLE* Primaries);
+
+
+#define _lcms_internal_H
+#endif
+//<<<+++OPENSOURCE_MUST_END
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscam02.c b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
new file mode 100644
index 0000000000..05584aa8f8
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscam02.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscam02.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscgats.c b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
new file mode 100644
index 0000000000..80dcba7830
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscgats.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscgats.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
new file mode 100644
index 0000000000..9b8a292f7b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmscnvrt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmscnvrt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmserr.c b/core/src/fxcodec/lcms2/src/fx_cmserr.c
new file mode 100644
index 0000000000..6929e7b34c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmserr.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmserr.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgamma.c b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
new file mode 100644
index 0000000000..f5bb690220
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgamma.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsgamma.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsgmt.c b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
new file mode 100644
index 0000000000..ea82b15be0
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsgmt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsgmt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmshalf.c b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
new file mode 100644
index 0000000000..6ed6b2b075
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmshalf.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmshalf.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsintrp.c b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
new file mode 100644
index 0000000000..affca53ca9
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsintrp.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsintrp.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio0.c b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
new file mode 100644
index 0000000000..2b6bc689cc
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio0.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsio0.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsio1.c b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
new file mode 100644
index 0000000000..192e879063
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsio1.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsio1.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmslut.c b/core/src/fxcodec/lcms2/src/fx_cmslut.c
new file mode 100644
index 0000000000..d9a319c774
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmslut.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmslut.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmd5.c b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
new file mode 100644
index 0000000000..3a3a99719c
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmd5.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsmd5.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
new file mode 100644
index 0000000000..667ac1f09e
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsmtrx.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsmtrx.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsnamed.c b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
new file mode 100644
index 0000000000..5e1b028e94
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsnamed.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsnamed.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsopt.c b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
new file mode 100644
index 0000000000..f12429c551
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsopt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsopt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmspack.c b/core/src/fxcodec/lcms2/src/fx_cmspack.c
new file mode 100644
index 0000000000..6e0640905d
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmspack.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmspack.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmspcs.c b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
new file mode 100644
index 0000000000..48ce39de52
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmspcs.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmspcs.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsplugin.c b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
new file mode 100644
index 0000000000..39266c2222
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsplugin.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsplugin.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsps2.c b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
new file mode 100644
index 0000000000..dcf55409e4
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsps2.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsps2.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmssamp.c b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
new file mode 100644
index 0000000000..f1468fe16d
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmssamp.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmssamp.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmssm.c b/core/src/fxcodec/lcms2/src/fx_cmssm.c
new file mode 100644
index 0000000000..a53ad71f42
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmssm.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmssm.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmstypes.c b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
new file mode 100644
index 0000000000..19f9e706c1
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmstypes.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmstypes.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsvirt.c b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
new file mode 100644
index 0000000000..3e5397f11b
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsvirt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsvirt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
new file mode 100644
index 0000000000..c11afd6016
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmswtpnt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmswtpnt.c"
diff --git a/core/src/fxcodec/lcms2/src/fx_cmsxform.c b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
new file mode 100644
index 0000000000..a4b6d85536
--- /dev/null
+++ b/core/src/fxcodec/lcms2/src/fx_cmsxform.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../lcms2-2.6/src/cmsxform.c"
diff --git a/core/src/fxcodec/libjpeg/cderror.h b/core/src/fxcodec/libjpeg/cderror.h
new file mode 100644
index 0000000000..c19d38fb4a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/cderror.h
@@ -0,0 +1,132 @@
+/*
+ * cderror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the cjpeg/djpeg
+ * applications. These strings are not needed as part of the JPEG library
+ * proper.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE. To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef CDERROR_H
+#define CDERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* CDERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string) code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */
+
+#ifdef BMP_SUPPORTED
+JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
+JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")
+JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
+JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
+JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
+JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
+JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
+JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
+JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
+JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")
+JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
+#endif /* BMP_SUPPORTED */
+
+#ifdef GIF_SUPPORTED
+JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
+JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
+JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
+JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
+JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
+JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
+JMESSAGE(JTRC_GIF_BADVERSION,
+ "Warning: unexpected GIF version number '%c%c%c'")
+JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
+JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
+JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
+JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring")
+JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image")
+JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")
+#endif /* GIF_SUPPORTED */
+
+#ifdef PPM_SUPPORTED
+JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
+JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
+JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
+JMESSAGE(JTRC_PGM, "%ux%u PGM image")
+JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
+JMESSAGE(JTRC_PPM, "%ux%u PPM image")
+JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
+#endif /* PPM_SUPPORTED */
+
+#ifdef RLE_SUPPORTED
+JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")
+JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")
+JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")
+JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")
+JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")
+JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")
+JMESSAGE(JERR_RLE_NOT, "Not an RLE file")
+JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")
+JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")
+JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")
+JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")
+JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")
+JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")
+JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")
+#endif /* RLE_SUPPORTED */
+
+#ifdef TARGA_SUPPORTED
+JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
+JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
+JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB")
+JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image")
+JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image")
+JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image")
+#else
+JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")
+#endif /* TARGA_SUPPORTED */
+
+JMESSAGE(JERR_BAD_CMAP_FILE,
+ "Color map file is invalid or of unsupported format")
+JMESSAGE(JERR_TOO_MANY_COLORS,
+ "Output file format cannot handle %d colormap entries")
+JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
+#ifdef TARGA_SUPPORTED
+JMESSAGE(JERR_UNKNOWN_FORMAT,
+ "Unrecognized input file format --- perhaps you need -targa")
+#else
+JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
+#endif
+JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
+
+#ifdef JMAKE_ENUM_LIST
+
+ JMSG_LASTADDONCODE
+} ADDON_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
diff --git a/core/src/fxcodec/libjpeg/cdjpeg.h b/core/src/fxcodec/libjpeg/cdjpeg.h
new file mode 100644
index 0000000000..be12278810
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/cdjpeg.h
@@ -0,0 +1,184 @@
+/*
+ * cdjpeg.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains common declarations for the sample applications
+ * cjpeg and djpeg. It is NOT used by the core JPEG library.
+ */
+
+#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
+#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jerror.h" /* get library error codes too */
+#include "cderror.h" /* get application-specific error codes */
+
+
+/*
+ * Object interface for cjpeg's source file decoding modules
+ */
+
+typedef struct cjpeg_source_struct * cjpeg_source_ptr;
+
+struct cjpeg_source_struct {
+ JMETHOD(void, start_input, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+ JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+ JMETHOD(void, finish_input, (j_compress_ptr cinfo,
+ cjpeg_source_ptr sinfo));
+
+ FXSYS_FILE *input_file;
+
+ JSAMPARRAY buffer;
+ JDIMENSION buffer_height;
+};
+
+
+/*
+ * Object interface for djpeg's output file encoding modules
+ */
+
+typedef struct djpeg_dest_struct * djpeg_dest_ptr;
+
+struct djpeg_dest_struct {
+ /* start_output is called after jpeg_start_decompress finishes.
+ * The color map will be ready at this time, if one is needed.
+ */
+ JMETHOD(void, start_output, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo));
+ /* Emit the specified number of pixel rows from the buffer. */
+ JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo,
+ JDIMENSION rows_supplied));
+ /* Finish up at the end of the image. */
+ JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
+ djpeg_dest_ptr dinfo));
+
+ /* Target file spec; filled in by djpeg.c after object is created. */
+ FXSYS_FILE * output_file;
+
+ /* Output pixel-row buffer. Created by module init or start_output.
+ * Width is cinfo->output_width * cinfo->output_components;
+ * height is buffer_height.
+ */
+ JSAMPARRAY buffer;
+ JDIMENSION buffer_height;
+};
+
+
+/*
+ * cjpeg/djpeg may need to perform extra passes to convert to or from
+ * the source/destination file format. The JPEG library does not know
+ * about these passes, but we'd like them to be counted by the progress
+ * monitor. We use an expanded progress monitor object to hold the
+ * additional pass count.
+ */
+
+struct cdjpeg_progress_mgr {
+ struct jpeg_progress_mgr pub; /* fields known to JPEG library */
+ int completed_extra_passes; /* extra passes completed */
+ int total_extra_passes; /* total extra */
+ /* last printed percentage stored here to avoid multiple printouts */
+ int percent_done;
+};
+
+typedef struct cdjpeg_progress_mgr * cd_progress_ptr;
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_read_bmp jIRdBMP
+#define jinit_write_bmp jIWrBMP
+#define jinit_read_gif jIRdGIF
+#define jinit_write_gif jIWrGIF
+#define jinit_read_ppm jIRdPPM
+#define jinit_write_ppm jIWrPPM
+#define jinit_read_rle jIRdRLE
+#define jinit_write_rle jIWrRLE
+#define jinit_read_targa jIRdTarga
+#define jinit_write_targa jIWrTarga
+#define read_quant_tables RdQTables
+#define read_scan_script RdScnScript
+#define set_quant_slots SetQSlots
+#define set_sample_factors SetSFacts
+#define read_color_map RdCMap
+#define enable_signal_catcher EnSigCatcher
+#define start_progress_monitor StProgMon
+#define end_progress_monitor EnProgMon
+#define read_stdin RdStdin
+#define write_stdout WrStdout
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Module selection routines for I/O modules. */
+
+EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,
+ boolean is_os2));
+EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));
+EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));
+EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));
+
+/* cjpeg support routines (in rdswitch.c) */
+
+EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,
+ int scale_factor, boolean force_baseline));
+EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));
+EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));
+EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));
+
+/* djpeg support routines (in rdcolmap.c) */
+
+EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
+
+/* common support routines (in cdjpeg.c) */
+
+EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));
+EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,
+ cd_progress_ptr progress));
+EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));
+EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));
+EXTERN(FXSYS_FILE *) read_stdin JPP((void));
+EXTERN(FXSYS_FILE *) write_stdout JPP((void));
+
+/* miscellaneous useful macros */
+
+#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
+#define READ_BINARY "r"
+#define WRITE_BINARY "w"
+#else
+#ifdef VMS /* VMS is very nonstandard */
+#define READ_BINARY "rb", "ctx=stm"
+#define WRITE_BINARY "wb", "ctx=stm"
+#else /* standard ANSI-compliant case */
+#define READ_BINARY "rb"
+#define WRITE_BINARY "wb"
+#endif
+#endif
+
+#ifndef EXIT_FAILURE /* define exit() codes if not provided */
+#define EXIT_FAILURE 1
+#endif
+#ifndef EXIT_SUCCESS
+#ifdef VMS
+#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
+#else
+#define EXIT_SUCCESS 0
+#endif
+#endif
+#ifndef EXIT_WARNING
+#ifdef VMS
+#define EXIT_WARNING 1 /* VMS is very nonstandard */
+#else
+#define EXIT_WARNING 2
+#endif
+#endif
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
new file mode 100644
index 0000000000..ec88cff26d
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c
@@ -0,0 +1,283 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library. These are the "minimum" API routines that may be
+ * needed in either the normal full-compression case or the transcoding-only
+ * case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jcapistd.c. But also see jcparam.c for
+ * parameter-setup helper routines, jcomapi.c for routines shared by
+ * compression and decompression, and jctrans.c for the transcoding case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG compression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
+{
+ int i;
+
+ /* Guard against version mismatches between library and caller. */
+ cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
+ if (version != JPEG_LIB_VERSION)
+ ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+ if (structsize != SIZEOF(struct jpeg_compress_struct))
+ ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+ (int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
+
+ /* For debugging purposes, we zero the whole master structure.
+ * But the application has already set the err pointer, and may have set
+ * client_data, so we have to save and restore those fields.
+ * Note: if application hasn't set client_data, tools like Purify may
+ * complain here.
+ */
+ {
+ struct jpeg_error_mgr * err = cinfo->err;
+ void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+ MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
+ cinfo->err = err;
+ cinfo->client_data = client_data;
+ }
+ cinfo->is_decompressor = FALSE;
+
+ /* Initialize a memory manager instance for this object */
+ jinit_memory_mgr((j_common_ptr) cinfo);
+
+ /* Zero out pointers to permanent structures. */
+ cinfo->progress = NULL;
+ cinfo->dest = NULL;
+
+ cinfo->comp_info = NULL;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++)
+ cinfo->quant_tbl_ptrs[i] = NULL;
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ cinfo->dc_huff_tbl_ptrs[i] = NULL;
+ cinfo->ac_huff_tbl_ptrs[i] = NULL;
+ }
+
+ cinfo->script_space = NULL;
+
+ cinfo->input_gamma = 1.0; /* in case application forgets */
+
+ /* OK, I'm ready */
+ cinfo->global_state = CSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG compression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_compress (j_compress_ptr cinfo)
+{
+ jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG compression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_compress (j_compress_ptr cinfo)
+{
+ jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Forcibly suppress or un-suppress all quantization and Huffman tables.
+ * Marks all currently defined tables as already written (if suppress)
+ * or not written (if !suppress). This will control whether they get emitted
+ * by a subsequent jpeg_start_compress call.
+ *
+ * This routine is exported for use by applications that want to produce
+ * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but
+ * since it is called by jpeg_start_compress, we put it here --- otherwise
+ * jcparam.o would be linked whether the application used it or not.
+ */
+
+GLOBAL(void)
+jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
+{
+ int i;
+ JQUANT_TBL * qtbl;
+ JHUFF_TBL * htbl;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
+ qtbl->sent_table = suppress;
+ }
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
+ htbl->sent_table = suppress;
+ if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
+ htbl->sent_table = suppress;
+ }
+}
+
+
+/*
+ * Finish JPEG compression.
+ *
+ * If a multipass operating mode was selected, this may do a great deal of
+ * work including most of the actual output.
+ */
+
+GLOBAL(void)
+jpeg_finish_compress (j_compress_ptr cinfo)
+{
+ JDIMENSION iMCU_row;
+
+ if (cinfo->global_state == CSTATE_SCANNING ||
+ cinfo->global_state == CSTATE_RAW_OK) {
+ /* Terminate first pass */
+ if (cinfo->next_scanline < cinfo->image_height)
+ ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+ (*cinfo->master->finish_pass) (cinfo);
+ } else if (cinfo->global_state != CSTATE_WRCOEFS)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Perform any remaining passes */
+ while (! cinfo->master->is_last_pass) {
+ (*cinfo->master->prepare_for_pass) (cinfo);
+ for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) iMCU_row;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+ /* We bypass the main controller and invoke coef controller directly;
+ * all work is being done from the coefficient buffer.
+ */
+ if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+ }
+ (*cinfo->master->finish_pass) (cinfo);
+ }
+ /* Write EOI, do final cleanup */
+ (*cinfo->marker->write_file_trailer) (cinfo);
+ (*cinfo->dest->term_destination) (cinfo);
+ /* We can use jpeg_abort to release memory and reset global_state */
+ jpeg_abort((j_common_ptr) cinfo);
+}
+
+
+/*
+ * Write a special marker.
+ * This is only recommended for writing COM or APPn markers.
+ * Must be called after jpeg_start_compress() and before
+ * first call to jpeg_write_scanlines() or jpeg_write_raw_data().
+ */
+
+GLOBAL(void)
+jpeg_write_marker (j_compress_ptr cinfo, int marker,
+ const JOCTET *dataptr, unsigned int datalen)
+{
+ JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
+
+ if (cinfo->next_scanline != 0 ||
+ (cinfo->global_state != CSTATE_SCANNING &&
+ cinfo->global_state != CSTATE_RAW_OK &&
+ cinfo->global_state != CSTATE_WRCOEFS))
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+ write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
+ while (datalen--) {
+ (*write_marker_byte) (cinfo, *dataptr);
+ dataptr++;
+ }
+}
+
+/* Same, but piecemeal. */
+
+GLOBAL(void)
+jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+{
+ if (cinfo->next_scanline != 0 ||
+ (cinfo->global_state != CSTATE_SCANNING &&
+ cinfo->global_state != CSTATE_RAW_OK &&
+ cinfo->global_state != CSTATE_WRCOEFS))
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ (*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
+}
+
+GLOBAL(void)
+jpeg_write_m_byte (j_compress_ptr cinfo, int val)
+{
+ (*cinfo->marker->write_marker_byte) (cinfo, val);
+}
+
+
+/*
+ * Alternate compression function: just write an abbreviated table file.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * To produce a pair of files containing abbreviated tables and abbreviated
+ * image data, one would proceed as follows:
+ *
+ * initialize JPEG object
+ * set JPEG parameters
+ * set destination to table file
+ * jpeg_write_tables(cinfo);
+ * set destination to image file
+ * jpeg_start_compress(cinfo, FALSE);
+ * write data...
+ * jpeg_finish_compress(cinfo);
+ *
+ * jpeg_write_tables has the side effect of marking all tables written
+ * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress
+ * will not re-emit the tables unless it is passed write_all_tables=TRUE.
+ */
+
+GLOBAL(void)
+jpeg_write_tables (j_compress_ptr cinfo)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Initialize the marker writer ... bit of a crock to do it here. */
+ jinit_marker_writer(cinfo);
+ /* Write them tables! */
+ (*cinfo->marker->write_tables_only) (cinfo);
+ /* And clean up. */
+ (*cinfo->dest->term_destination) (cinfo);
+ /*
+ * In library releases up through v6a, we called jpeg_abort() here to free
+ * any working memory allocated by the destination manager and marker
+ * writer. Some applications had a problem with that: they allocated space
+ * of their own from the library memory manager, and didn't want it to go
+ * away during write_tables. So now we do nothing. This will cause a
+ * memory leak if an app calls write_tables repeatedly without doing a full
+ * compression cycle or otherwise resetting the JPEG object. However, that
+ * seems less bad than unexpectedly freeing memory in the normal case.
+ * An app that prefers the old behavior can call jpeg_abort for itself after
+ * each call to jpeg_write_tables().
+ */
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
new file mode 100644
index 0000000000..bf13542539
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c
@@ -0,0 +1,164 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the compression half
+ * of the JPEG library. These are the "standard" API routines that are
+ * used in the normal full-compression case. They are not used by a
+ * transcoding-only application. Note that if an application links in
+ * jpeg_start_compress, it will end up linking in the entire compressor.
+ * We thus must separate this file from jcapimin.c to avoid linking the
+ * whole compression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Compression initialization.
+ * Before calling this, all parameters and a data destination must be set up.
+ *
+ * We require a write_all_tables parameter as a failsafe check when writing
+ * multiple datastreams from the same compression object. Since prior runs
+ * will have left all the tables marked sent_table=TRUE, a subsequent run
+ * would emit an abbreviated stream (no tables) by default. This may be what
+ * is wanted, but for safety's sake it should not be the default behavior:
+ * programmers should have to make a deliberate choice to emit abbreviated
+ * images. Therefore the documentation and examples should encourage people
+ * to pass write_all_tables=TRUE; then it will take active thought to do the
+ * wrong thing.
+ */
+
+GLOBAL(void)
+jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (write_all_tables)
+ jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
+
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Perform master selection of active modules */
+ jinit_compress_master(cinfo);
+ /* Set up for the first pass */
+ (*cinfo->master->prepare_for_pass) (cinfo);
+ /* Ready for application to drive first pass through jpeg_write_scanlines
+ * or jpeg_write_raw_data.
+ */
+ cinfo->next_scanline = 0;
+ cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
+}
+
+
+/*
+ * Write some scanlines of data to the JPEG compressor.
+ *
+ * The return value will be the number of lines actually written.
+ * This should be less than the supplied num_lines only in case that
+ * the data destination module has requested suspension of the compressor,
+ * or if more than image_height scanlines are passed in.
+ *
+ * Note: we warn about excess calls to jpeg_write_scanlines() since
+ * this likely signals an application programmer error. However,
+ * excess scanlines passed in the last valid call are *silently* ignored,
+ * so that the application need not adjust num_lines for end-of-image
+ * when using a multiple-scanline buffer.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
+ JDIMENSION num_lines)
+{
+ JDIMENSION row_ctr, rows_left;
+
+ if (cinfo->global_state != CSTATE_SCANNING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->next_scanline >= cinfo->image_height)
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->image_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Give master control module another chance if this is first call to
+ * jpeg_write_scanlines. This lets output of the frame/scan headers be
+ * delayed so that application can write COM, etc, markers between
+ * jpeg_start_compress and jpeg_write_scanlines.
+ */
+ if (cinfo->master->call_pass_startup)
+ (*cinfo->master->pass_startup) (cinfo);
+
+ /* Ignore any extra scanlines at bottom of image. */
+ rows_left = cinfo->image_height - cinfo->next_scanline;
+ if (num_lines > rows_left)
+ num_lines = rows_left;
+
+ row_ctr = 0;
+ (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
+ cinfo->next_scanline += row_ctr;
+ return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to write raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
+ JDIMENSION num_lines)
+{
+ JDIMENSION lines_per_iMCU_row;
+
+ if (cinfo->global_state != CSTATE_RAW_OK)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->next_scanline >= cinfo->image_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->next_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->image_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Give master control module another chance if this is first call to
+ * jpeg_write_raw_data. This lets output of the frame/scan headers be
+ * delayed so that application can write COM, etc, markers between
+ * jpeg_start_compress and jpeg_write_raw_data.
+ */
+ if (cinfo->master->call_pass_startup)
+ (*cinfo->master->pass_startup) (cinfo);
+
+ /* Verify that at least one iMCU row has been passed. */
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
+ if (num_lines < lines_per_iMCU_row)
+ ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+ /* Directly compress the row. */
+ if (! (*cinfo->coef->compress_data) (cinfo, data)) {
+ /* If compressor did not consume the whole row, suspend processing. */
+ return 0;
+ }
+
+ /* OK, we processed one iMCU row. */
+ cinfo->next_scanline += lines_per_iMCU_row;
+ return lines_per_iMCU_row;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
new file mode 100644
index 0000000000..ea2a4a6cbb
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c
@@ -0,0 +1,452 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jccoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for compression.
+ * This controller is the top level of the JPEG compressor proper.
+ * The coefficient buffer lies between forward-DCT and entropy encoding steps.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* We use a full-image coefficient buffer when doing Huffman optimization,
+ * and also for writing multiple-scan JPEG files. In all cases, the DCT
+ * step is run during the first pass, and subsequent passes need only read
+ * the buffered coefficients.
+ */
+#ifdef ENTROPY_OPT_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#else
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+#define FULL_COEF_BUFFER_SUPPORTED
+#endif
+#endif
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_coef_controller pub; /* public fields */
+
+ JDIMENSION iMCU_row_num; /* iMCU row # within image */
+ JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* For single-pass compression, it's sufficient to buffer just one MCU
+ * (although this may prove a bit slow in practice). We allocate a
+ * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
+ * MCU constructed and sent. (On 80x86, the workspace is FAR even though
+ * it's not really very big; this is to keep the module interfaces unchanged
+ * when a large coefficient buffer is necessary.)
+ * In multi-pass modes, this array points to the current MCU's blocks
+ * within the virtual arrays.
+ */
+ JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+
+ /* In multi-pass modes, we need a virtual block array for each component. */
+ jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+/* Forward declarations */
+METHODDEF(boolean) compress_data
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+METHODDEF(boolean) compress_first_pass
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+METHODDEF(boolean) compress_output
+ JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->mcu_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ coef->iMCU_row_num = 0;
+ start_iMCU_row(cinfo);
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (coef->whole_image[0] != NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_data;
+ break;
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+ case JBUF_SAVE_AND_PASS:
+ if (coef->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_first_pass;
+ break;
+ case JBUF_CRANK_DEST:
+ if (coef->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ coef->pub.compress_data = compress_output;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data in the single-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(boolean)
+compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, bi, ci, yindex, yoffset, blockcnt;
+ JDIMENSION ypos, xpos;
+ jpeg_component_info *compptr;
+
+ /* Loop to write as much as one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
+ MCU_col_num++) {
+ /* Determine where data comes from in input_buf and do the DCT thing.
+ * Each call on forward_DCT processes a horizontal row of DCT blocks
+ * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
+ * sequentially. Dummy blocks at the right or bottom edge are filled in
+ * specially. The data in them does not matter for image reconstruction,
+ * so we fill them with values that will encode to the smallest amount of
+ * data, viz: all zeroes in the AC entries, DC entries equal to previous
+ * block's DC value. (Thanks to Thomas Kinsman for this idea.)
+ */
+ blkn = 0;
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ xpos = MCU_col_num * compptr->MCU_sample_width;
+ ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (coef->iMCU_row_num < last_iMCU_row ||
+ yoffset+yindex < compptr->last_row_height) {
+ (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+ input_buf[compptr->component_index],
+ coef->MCU_buffer[blkn],
+ ypos, xpos, (JDIMENSION) blockcnt);
+ if (blockcnt < compptr->MCU_width) {
+ /* Create some dummy blocks at the right edge of the image. */
+ jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
+ (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
+ for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
+ coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
+ }
+ }
+ } else {
+ /* Create a row of dummy blocks at the bottom of the image. */
+ jzero_far((void FAR *) coef->MCU_buffer[blkn],
+ compptr->MCU_width * SIZEOF(JBLOCK));
+ for (bi = 0; bi < compptr->MCU_width; bi++) {
+ coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
+ }
+ }
+ blkn += compptr->MCU_width;
+ ypos += DCTSIZE;
+ }
+ }
+ /* Try to write the MCU. In event of a suspension failure, we will
+ * re-DCT the MCU on restart (a bit inefficient, could be fixed...)
+ */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+
+/*
+ * Process some data in the first pass of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the image.
+ * This amount of data is read from the source buffer, DCT'd and quantized,
+ * and saved into the virtual arrays. We also generate suitable dummy blocks
+ * as needed at the right and lower edges. (The dummy blocks are constructed
+ * in the virtual arrays, which have been padded appropriately.) This makes
+ * it possible for subsequent passes not to worry about real vs. dummy blocks.
+ *
+ * We must also emit the data to the entropy encoder. This is conveniently
+ * done by calling compress_output() after we've loaded the current strip
+ * of the virtual arrays.
+ *
+ * NB: input_buf contains a plane for each component in image. All
+ * components are DCT'd and loaded into the virtual arrays in this pass.
+ * However, it may be that only a subset of the components are emitted to
+ * the entropy encoder during this first pass; be careful about looking
+ * at the scan-dependent variables (MCU dimensions, etc).
+ */
+
+METHODDEF(boolean)
+compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION blocks_across, MCUs_across, MCUindex;
+ int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
+ JCOEF lastDC;
+ jpeg_component_info *compptr;
+ JBLOCKARRAY buffer;
+ JBLOCKROW thisblockrow, lastblockrow;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Align the virtual buffer for this component. */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (coef->iMCU_row_num < last_iMCU_row)
+ block_rows = compptr->v_samp_factor;
+ else {
+ /* NB: can't use last_row_height here, since may not be set! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ }
+ blocks_across = compptr->width_in_blocks;
+ h_samp_factor = compptr->h_samp_factor;
+ /* Count number of dummy blocks to be added at the right margin. */
+ ndummy = (int) (blocks_across % h_samp_factor);
+ if (ndummy > 0)
+ ndummy = h_samp_factor - ndummy;
+ /* Perform DCT for all non-dummy blocks in this iMCU row. Each call
+ * on forward_DCT processes a complete horizontal row of DCT blocks.
+ */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ thisblockrow = buffer[block_row];
+ (*cinfo->fdct->forward_DCT) (cinfo, compptr,
+ input_buf[ci], thisblockrow,
+ (JDIMENSION) (block_row * DCTSIZE),
+ (JDIMENSION) 0, blocks_across);
+ if (ndummy > 0) {
+ /* Create dummy blocks at the right edge of the image. */
+ thisblockrow += blocks_across; /* => first dummy block */
+ jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
+ lastDC = thisblockrow[-1][0];
+ for (bi = 0; bi < ndummy; bi++) {
+ thisblockrow[bi][0] = lastDC;
+ }
+ }
+ }
+ /* If at end of image, create dummy block rows as needed.
+ * The tricky part here is that within each MCU, we want the DC values
+ * of the dummy blocks to match the last real block's DC value.
+ * This squeezes a few more bytes out of the resulting file...
+ */
+ if (coef->iMCU_row_num == last_iMCU_row) {
+ blocks_across += ndummy; /* include lower right corner */
+ MCUs_across = blocks_across / h_samp_factor;
+ for (block_row = block_rows; block_row < compptr->v_samp_factor;
+ block_row++) {
+ thisblockrow = buffer[block_row];
+ lastblockrow = buffer[block_row-1];
+ jzero_far((void FAR *) thisblockrow,
+ (size_t) (blocks_across * SIZEOF(JBLOCK)));
+ for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
+ lastDC = lastblockrow[h_samp_factor-1][0];
+ for (bi = 0; bi < h_samp_factor; bi++) {
+ thisblockrow[bi][0] = lastDC;
+ }
+ thisblockrow += h_samp_factor; /* advance to next MCU in row */
+ lastblockrow += h_samp_factor;
+ }
+ }
+ }
+ }
+ /* NB: compress_output will increment iMCU_row_num if successful.
+ * A suspension return will result in redoing all the work above next time.
+ */
+
+ /* Emit data to the entropy encoder, sharing code with subsequent passes */
+ return compress_output(cinfo, input_buf);
+}
+
+
+/*
+ * Process some data in subsequent passes of a multi-pass case.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ int blkn, ci, xindex, yindex, yoffset;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan.
+ * NB: during first pass, this is safe only because the buffers will
+ * already be aligned properly, so jmemmgr.c won't need to do any I/O.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+ coef->MCU_buffer[blkn++] = buffer_ptr++;
+ }
+ }
+ }
+ /* Try to write the MCU. */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+#endif /* FULL_COEF_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_coef_ptr coef;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ coef->pub.start_pass = start_pass_coef;
+
+ /* Create the coefficient buffer. */
+ if (need_full_buffer) {
+#ifdef FULL_COEF_BUFFER_SUPPORTED
+ /* Allocate a full-image virtual array for each component, */
+ /* padded to a multiple of samp_factor DCT blocks in each direction. */
+ int ci;
+ jpeg_component_info *compptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+ (long) compptr->h_samp_factor),
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor),
+ (JDIMENSION) compptr->v_samp_factor);
+ }
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ } else {
+ /* We only need a single-MCU buffer. */
+ JBLOCKROW buffer;
+ int i;
+
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+ coef->MCU_buffer[i] = buffer + i;
+ }
+ coef->whole_image[0] = NULL; /* flag for no virtual arrays */
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
new file mode 100644
index 0000000000..8ff863a14b
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jccolor.c
@@ -0,0 +1,462 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jccolor.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_converter pub; /* public fields */
+
+ /* Private state for RGB->YCC conversion */
+ INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
+} my_color_converter;
+
+typedef my_color_converter * my_cconvert_ptr;
+
+
+/**************** RGB -> YCbCr conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
+ * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
+ * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
+ * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
+ * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
+ * were not represented exactly. Now we sacrifice exact representation of
+ * maximum red and maximum blue in order to get exact grayscales.
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times R,G,B for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
+ * in the tables to save adding them separately in the inner loop.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+/* We allocate one big table and divide it up into eight parts, instead of
+ * doing eight alloc_small requests. This lets us use a single table base
+ * address, which can be held in a register in the inner loops on many
+ * machines (more than can hold all eight addresses, anyway).
+ */
+
+#define R_Y_OFF 0 /* offset to R => Y section */
+#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
+#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
+#define R_CB_OFF (3*(MAXJSAMPLE+1))
+#define G_CB_OFF (4*(MAXJSAMPLE+1))
+#define B_CB_OFF (5*(MAXJSAMPLE+1))
+#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */
+#define G_CR_OFF (6*(MAXJSAMPLE+1))
+#define B_CR_OFF (7*(MAXJSAMPLE+1))
+#define TABLE_SIZE (8*(MAXJSAMPLE+1))
+
+
+/*
+ * Initialize for RGB->YCC colorspace conversion.
+ */
+
+METHODDEF(void)
+rgb_ycc_start (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_ycc_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++) {
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
+ * This ensures that the maximum output will round to MAXJSAMPLE
+ * not MAXJSAMPLE+1, and thus that we don't have to range-limit.
+ */
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+/* B=>Cb and R=>Cr tables are the same
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+*/
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ *
+ * Note that we change from the application's interleaved-pixel format
+ * to our internal noninterleaved, one-plane-per-component format.
+ * The input buffer is therefore three times as wide as the output buffer.
+ *
+ * A starting row offset is provided only for the output buffer. The caller
+ * can easily adjust the passed input_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+rgb_ycc_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/**************** Cases other than RGB -> YCbCr **************/
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles RGB->grayscale conversion, which is the same
+ * as the RGB->Y portion of RGB->YCbCr.
+ * We assume rgb_ycc_start has been called (we only use the Y tables).
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ inptr += RGB_PIXELSIZE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles Adobe-style CMYK->YCCK conversion,
+ * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume rgb_ycc_start has been called.
+ */
+
+METHODDEF(void)
+cmyk_ycck_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int r, g, b;
+ register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2, outptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ outptr3 = output_buf[3][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
+ g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
+ b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
+ /* K passes through as-is */
+ outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
+ inptr += 4;
+ /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
+ * must be too; we do not need an explicit range-limiting operation.
+ * Hence the value being shifted is never negative, and we don't
+ * need the general RIGHT_SHIFT macro.
+ */
+ /* Y */
+ outptr0[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ /* Cb */
+ outptr1[col] = (JSAMPLE)
+ ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
+ >> SCALEBITS);
+ /* Cr */
+ outptr2[col] = (JSAMPLE)
+ ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles grayscale output with no conversion.
+ * The source can be either plain grayscale or YCbCr (since Y == gray).
+ */
+
+METHODDEF(void)
+grayscale_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+ int instride = cinfo->input_components;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr = output_buf[0][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
+ inptr += instride;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * This version handles multi-component colorspaces without conversion.
+ * We assume input_components == num_components.
+ */
+
+METHODDEF(void)
+null_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr;
+ register JDIMENSION col;
+ register int ci;
+ int nc = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ /* It seems fastest to make a separate pass for each component. */
+ for (ci = 0; ci < nc; ci++) {
+ inptr = *input_buf;
+ outptr = output_buf[ci][output_row];
+ for (col = 0; col < num_cols; col++) {
+ outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ inptr += nc;
+ }
+ }
+ input_buf++;
+ output_row++;
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+null_method (j_compress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for input colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_converter (j_compress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_converter));
+ cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ /* set start_pass to null method until we find out differently */
+ cconvert->pub.start_pass = null_method;
+
+ /* Make sure input_components agrees with in_color_space */
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->input_components != 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ if (cinfo->input_components != RGB_PIXELSIZE)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+#endif /* else share code with YCbCr */
+
+ case JCS_YCbCr:
+ if (cinfo->input_components != 3)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->input_components != 4)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->input_components < 1)
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ break;
+ }
+
+ /* Check num_components, set conversion method based on requested space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_GRAYSCALE)
+ cconvert->pub.color_convert = grayscale_convert;
+ else if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_gray_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = grayscale_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_RGB) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ } else if (cinfo->in_color_space == JCS_YCbCr)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ if (cinfo->in_color_space == JCS_CMYK) {
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = cmyk_ycck_convert;
+ } else if (cinfo->in_color_space == JCS_YCCK)
+ cconvert->pub.color_convert = null_convert;
+ else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default: /* allow null conversion of JCS_UNKNOWN */
+ if (cinfo->jpeg_color_space != cinfo->in_color_space ||
+ cinfo->num_components != cinfo->input_components)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ cconvert->pub.color_convert = null_convert;
+ break;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
new file mode 100644
index 0000000000..d4082043a5
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c
@@ -0,0 +1,390 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcdctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the forward-DCT management logic.
+ * This code selects a particular DCT implementation to be used,
+ * and it performs related housekeeping chores including coefficient
+ * quantization.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+ struct jpeg_forward_dct pub; /* public fields */
+
+ /* Pointer to the DCT routine actually in use */
+ forward_DCT_method_ptr do_dct;
+
+ /* The actual post-DCT divisors --- not identical to the quant table
+ * entries, because of scaling (especially for an unnormalized DCT).
+ * Each table is given in normal array order.
+ */
+ DCTELEM * divisors[NUM_QUANT_TBLS];
+
+#ifdef DCT_FLOAT_SUPPORTED
+ /* Same as above for the floating-point case. */
+ float_DCT_method_ptr do_float_dct;
+ FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
+#endif
+} my_fdct_controller;
+
+typedef my_fdct_controller * my_fdct_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ * Verify that all referenced Q-tables are present, and set up
+ * the divisor table for each one.
+ * In the current implementation, DCT of all components is done during
+ * the first pass, even if only some components will be output in the
+ * first scan. Hence all components should be examined here.
+ */
+
+METHODDEF(void)
+start_pass_fdctmgr (j_compress_ptr cinfo)
+{
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ int ci, qtblno, i;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtbl;
+ DCTELEM * dtbl;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ qtblno = compptr->quant_tbl_no;
+ /* Make sure specified quantization table is present */
+ if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+ cinfo->quant_tbl_ptrs[qtblno] == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+ qtbl = cinfo->quant_tbl_ptrs[qtblno];
+ /* Compute divisors for this quant table */
+ /* We may do this more than once for same table, but it's not a big deal */
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ /* For LL&M IDCT method, divisors are equal to raw quantization
+ * coefficients multiplied by 8 (to counteract scaling).
+ */
+ if (fdct->divisors[qtblno] == NULL) {
+ fdct->divisors[qtblno] = (DCTELEM *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(DCTELEM));
+ }
+ dtbl = fdct->divisors[qtblno];
+ for (i = 0; i < DCTSIZE2; i++) {
+ dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
+ }
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ {
+ /* For AA&N IDCT method, divisors are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * We apply a further scale factor of 8.
+ */
+#define CONST_BITS 14
+ static const INT16 aanscales[DCTSIZE2] = {
+ /* precomputed values scaled up by 14 bits */
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
+ 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
+ 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
+ 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
+ 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
+ };
+ SHIFT_TEMPS
+
+ if (fdct->divisors[qtblno] == NULL) {
+ fdct->divisors[qtblno] = (DCTELEM *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(DCTELEM));
+ }
+ dtbl = fdct->divisors[qtblno];
+ for (i = 0; i < DCTSIZE2; i++) {
+ dtbl[i] = (DCTELEM)
+ DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+ (INT32) aanscales[i]),
+ CONST_BITS-3);
+ }
+ }
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ {
+ /* For float AA&N IDCT method, divisors are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * We apply a further scale factor of 8.
+ * What's actually stored is 1/divisor so that the inner loop can
+ * use a multiplication rather than a division.
+ */
+ FAST_FLOAT * fdtbl;
+ int row, col;
+ static const double aanscalefactor[DCTSIZE] = {
+ 1.0, 1.387039845, 1.306562965, 1.175875602,
+ 1.0, 0.785694958, 0.541196100, 0.275899379
+ };
+
+ if (fdct->float_divisors[qtblno] == NULL) {
+ fdct->float_divisors[qtblno] = (FAST_FLOAT *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ DCTSIZE2 * SIZEOF(FAST_FLOAT));
+ }
+ fdtbl = fdct->float_divisors[qtblno];
+ i = 0;
+ for (row = 0; row < DCTSIZE; row++) {
+ for (col = 0; col < DCTSIZE; col++) {
+ fdtbl[i] = (FAST_FLOAT)
+ (1.0 / (((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col] * 8.0)));
+ i++;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Perform forward DCT on one or more blocks of a component.
+ *
+ * The input samples are taken from the sample_data[] array starting at
+ * position start_row/start_col, and moving to the right for any additional
+ * blocks. The quantized coefficients are returned in coef_blocks[].
+ */
+
+METHODDEF(void)
+forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks)
+/* This version is used for integer DCT implementations. */
+{
+ /* This routine is heavily used, so it's worth coding it tightly. */
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ forward_DCT_method_ptr do_dct = fdct->do_dct;
+ DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
+ DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
+ JDIMENSION bi;
+
+ sample_data += start_row; /* fold in the vertical offset once */
+
+ for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+ /* Load data into workspace, applying unsigned->signed conversion */
+ { register DCTELEM *workspaceptr;
+ register JSAMPROW elemptr;
+ register int elemr;
+
+ workspaceptr = workspace;
+ for (elemr = 0; elemr < DCTSIZE; elemr++) {
+ elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8 /* unroll the inner loop */
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+#else
+ { register int elemc;
+ for (elemc = DCTSIZE; elemc > 0; elemc--) {
+ *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
+ }
+ }
+#endif
+ }
+ }
+
+ /* Perform the DCT */
+ (*do_dct) (workspace);
+
+ /* Quantize/descale the coefficients, and store into coef_blocks[] */
+ { register DCTELEM temp, qval;
+ register int i;
+ register JCOEFPTR output_ptr = coef_blocks[bi];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ qval = divisors[i];
+ temp = workspace[i];
+ /* Divide the coefficient value by qval, ensuring proper rounding.
+ * Since C does not specify the direction of rounding for negative
+ * quotients, we have to force the dividend positive for portability.
+ *
+ * In most files, at least half of the output values will be zero
+ * (at default quantization settings, more like three-quarters...)
+ * so we should ensure that this case is fast. On many machines,
+ * a comparison is enough cheaper than a divide to make a special test
+ * a win. Since both inputs will be nonnegative, we need only test
+ * for a < b to discover whether a/b is 0.
+ * If your machine's division is fast enough, define FAST_DIVIDE.
+ */
+#ifdef FAST_DIVIDE
+#define DIVIDE_BY(a,b) a /= b
+#else
+#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0
+#endif
+ if (temp < 0) {
+ temp = -temp;
+ temp += qval>>1; /* for rounding */
+ DIVIDE_BY(temp, qval);
+ temp = -temp;
+ } else {
+ temp += qval>>1; /* for rounding */
+ DIVIDE_BY(temp, qval);
+ }
+ output_ptr[i] = (JCOEF) temp;
+ }
+ }
+ }
+}
+
+
+#ifdef DCT_FLOAT_SUPPORTED
+
+METHODDEF(void)
+forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks)
+/* This version is used for floating-point DCT implementations. */
+{
+ /* This routine is heavily used, so it's worth coding it tightly. */
+ my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
+ float_DCT_method_ptr do_dct = fdct->do_float_dct;
+ FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
+ FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
+ JDIMENSION bi;
+
+ sample_data += start_row; /* fold in the vertical offset once */
+
+ for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
+ /* Load data into workspace, applying unsigned->signed conversion */
+ { register FAST_FLOAT *workspaceptr;
+ register JSAMPROW elemptr;
+ register int elemr;
+
+ workspaceptr = workspace;
+ for (elemr = 0; elemr < DCTSIZE; elemr++) {
+ elemptr = sample_data[elemr] + start_col;
+#if DCTSIZE == 8 /* unroll the inner loop */
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+#else
+ { register int elemc;
+ for (elemc = DCTSIZE; elemc > 0; elemc--) {
+ *workspaceptr++ = (FAST_FLOAT)
+ (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
+ }
+ }
+#endif
+ }
+ }
+
+ /* Perform the DCT */
+ (*do_dct) (workspace);
+
+ /* Quantize/descale the coefficients, and store into coef_blocks[] */
+ { register FAST_FLOAT temp;
+ register int i;
+ register JCOEFPTR output_ptr = coef_blocks[bi];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ /* Apply the quantization and scaling factor */
+ temp = workspace[i] * divisors[i];
+ /* Round to nearest integer.
+ * Since C does not specify the direction of rounding for negative
+ * quotients, we have to force the dividend positive for portability.
+ * The maximum coefficient size is +-16K (for 12-bit data), so this
+ * code should work for either 16-bit or 32-bit ints.
+ */
+ output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
+ }
+ }
+ }
+}
+
+#endif /* DCT_FLOAT_SUPPORTED */
+
+
+/*
+ * Initialize FDCT manager.
+ */
+
+GLOBAL(void)
+jinit_forward_dct (j_compress_ptr cinfo)
+{
+ my_fdct_ptr fdct;
+ int i;
+
+ fdct = (my_fdct_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_fdct_controller));
+ cinfo->fdct = (struct jpeg_forward_dct *) fdct;
+ fdct->pub.start_pass = start_pass_fdctmgr;
+
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ fdct->pub.forward_DCT = forward_DCT;
+ fdct->do_dct = jpeg_fdct_islow;
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ fdct->pub.forward_DCT = forward_DCT;
+ fdct->do_dct = jpeg_fdct_ifast;
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ fdct->pub.forward_DCT = forward_DCT_float;
+ fdct->do_float_dct = jpeg_fdct_float;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+
+ /* Mark divisor tables unallocated */
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ fdct->divisors[i] = NULL;
+#ifdef DCT_FLOAT_SUPPORTED
+ fdct->float_divisors[i] = NULL;
+#endif
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
new file mode 100644
index 0000000000..9ed1fe6da2
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jchuff.c
@@ -0,0 +1,915 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jchuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines.
+ *
+ * Much of the complexity here has to do with supporting output suspension.
+ * If the data destination module demands suspension, we want to be able to
+ * back up to the start of the current MCU. To do this, we copy state
+ * variables into local working storage, and update them back to the
+ * permanent JPEG objects only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h" /* Declarations shared with jcphuff.c */
+
+#ifdef _FX_MANAGED_CODE_
+#define savable_state savable_state_c
+#endif
+
+/* Expanded entropy encoder object for Huffman encoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ INT32 put_buffer; /* current bit-accumulation buffer */
+ int put_bits; /* # of bits now in it */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).put_buffer = (src).put_buffer, \
+ (dest).put_bits = (src).put_bits, \
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_encoder pub; /* public fields */
+
+ savable_state saved; /* Bit buffer & DC state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+ int next_restart_num; /* next restart number to write (0-7) */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+ c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */
+ long * dc_count_ptrs[NUM_HUFF_TBLS];
+ long * ac_count_ptrs[NUM_HUFF_TBLS];
+#endif
+} huff_entropy_encoder;
+
+typedef huff_entropy_encoder * huff_entropy_ptr;
+
+/* Working state while writing an MCU.
+ * This struct contains all the fields that are needed by subroutines.
+ */
+
+typedef struct {
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+ savable_state cur; /* Current bit buffer & DC state */
+ j_compress_ptr cinfo; /* dump_buffer needs access to this */
+} working_state;
+
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo));
+#ifdef ENTROPY_OPT_SUPPORTED
+METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo));
+#endif
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ * If gather_statistics is TRUE, we do not output anything during the scan,
+ * just count the Huffman symbols used and generate Huffman code tables.
+ */
+
+METHODDEF(void)
+start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, dctbl, actbl;
+ jpeg_component_info * compptr;
+
+ if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+ entropy->pub.encode_mcu = encode_mcu_gather;
+ entropy->pub.finish_pass = finish_pass_gather;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ entropy->pub.encode_mcu = encode_mcu_huff;
+ entropy->pub.finish_pass = finish_pass_huff;
+ }
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ if (gather_statistics) {
+#ifdef ENTROPY_OPT_SUPPORTED
+ /* Check for invalid table indexes */
+ /* (make_c_derived_tbl does this in the other path) */
+ if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl);
+ if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
+ /* Allocate and zero the statistics tables */
+ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+ if (entropy->dc_count_ptrs[dctbl] == NULL)
+ entropy->dc_count_ptrs[dctbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long));
+ if (entropy->ac_count_ptrs[actbl] == NULL)
+ entropy->ac_count_ptrs[actbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
+#endif
+ } else {
+ /* Compute derived values for Huffman tables */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl,
+ & entropy->dc_derived_tbls[dctbl]);
+ jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
+ & entropy->ac_derived_tbls[actbl]);
+ }
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Initialize bit buffer to empty */
+ entropy->saved.put_buffer = 0;
+ entropy->saved.put_bits = 0;
+
+ /* Initialize restart stuff */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num = 0;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jcphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno,
+ c_derived_tbl ** pdtbl)
+{
+ JHUFF_TBL *htbl;
+ c_derived_tbl *dtbl;
+ int p, i, l, lastp, _si, maxsymbol;
+ char huffsize[257];
+ unsigned int huffcode[257];
+ unsigned int code;
+
+ /* Note that huffsize[] and huffcode[] are filled in code-length order,
+ * paralleling the order of the symbols themselves in htbl->huffval[].
+ */
+
+ /* Find the input Huffman table */
+ if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+ htbl =
+ isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+ /* Allocate a workspace if we haven't already done so. */
+ if (*pdtbl == NULL)
+ *pdtbl = (c_derived_tbl *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(c_derived_tbl));
+ dtbl = *pdtbl;
+
+ /* Figure C.1: make table of Huffman code length for each symbol */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ i = (int) htbl->bits[l];
+ if (i < 0 || p + i > 256) /* protect against table overrun */
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ while (i--)
+ huffsize[p++] = (char) l;
+ }
+ huffsize[p] = 0;
+ lastp = p;
+
+ /* Figure C.2: generate the codes themselves */
+ /* We also validate that the counts represent a legal Huffman code tree. */
+
+ code = 0;
+ _si = huffsize[0];
+ p = 0;
+ while (huffsize[p]) {
+ while (((int) huffsize[p]) == _si) {
+ huffcode[p++] = code;
+ code++;
+ }
+ /* code is now 1 more than the last code used for codelength si; but
+ * it must still fit in si bits, since no code is allowed to be all ones.
+ */
+ if (((INT32) code) >= (((INT32) 1) << _si))
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ code <<= 1;
+ _si++;
+ }
+
+ /* Figure C.3: generate encoding tables */
+ /* These are code and size indexed by symbol value */
+
+ /* Set all codeless symbols to have code length 0;
+ * this lets us detect duplicate VAL entries here, and later
+ * allows emit_bits to detect any attempt to emit such symbols.
+ */
+ MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi));
+
+ /* This is also a convenient place to check for out-of-range
+ * and duplicated VAL entries. We allow 0..255 for AC symbols
+ * but only 0..15 for DC. (We could constrain them further
+ * based on data depth and mode, but this seems enough.)
+ */
+ maxsymbol = isDC ? 15 : 255;
+
+ for (p = 0; p < lastp; p++) {
+ i = htbl->huffval[p];
+ if (i < 0 || i > maxsymbol || dtbl->ehufsi[i])
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ dtbl->ehufco[i] = huffcode[p];
+ dtbl->ehufsi[i] = huffsize[p];
+ }
+}
+
+
+/* Outputting bytes to the file */
+
+/* Emit a byte, taking 'action' if must suspend. */
+#define emit_byte(state,val,action) \
+ { *(state)->next_output_byte++ = (JOCTET) (val); \
+ if (--(state)->free_in_buffer == 0) \
+ if (! dump_buffer(state)) \
+ { action; } }
+
+
+LOCAL(boolean)
+dump_buffer (working_state * state)
+/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */
+{
+ struct jpeg_destination_mgr * dest = state->cinfo->dest;
+
+ if (! (*dest->empty_output_buffer) (state->cinfo))
+ return FALSE;
+ /* After a successful buffer dump, must reset buffer pointers */
+ state->next_output_byte = dest->next_output_byte;
+ state->free_in_buffer = dest->free_in_buffer;
+ return TRUE;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part. At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(boolean)
+emit_bits (working_state * state, unsigned int code, int size)
+/* Emit some bits; return TRUE if successful, FALSE if must suspend */
+{
+ /* This routine is heavily used, so it's worth coding tightly. */
+ register INT32 put_buffer = (INT32) code;
+ register int put_bits = state->cur.put_bits;
+
+ /* if size is 0, caller used an invalid Huffman table entry */
+ if (size == 0)
+ ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
+
+ put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+ put_bits += size; /* new number of bits in buffer */
+
+ put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+ put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
+
+ while (put_bits >= 8) {
+ int c = (int) ((put_buffer >> 16) & 0xFF);
+
+ emit_byte(state, c, return FALSE);
+ if (c == 0xFF) { /* need to stuff a zero byte? */
+ emit_byte(state, 0, return FALSE);
+ }
+ put_buffer <<= 8;
+ put_bits -= 8;
+ }
+
+ state->cur.put_buffer = put_buffer; /* update state variables */
+ state->cur.put_bits = put_bits;
+
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+flush_bits (working_state * state)
+{
+ if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */
+ return FALSE;
+ state->cur.put_buffer = 0; /* and reset bit-buffer to empty */
+ state->cur.put_bits = 0;
+ return TRUE;
+}
+
+
+/* Encode a single block's worth of coefficients */
+
+LOCAL(boolean)
+encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
+ c_derived_tbl *dctbl, c_derived_tbl *actbl)
+{
+ register int temp, temp2;
+ register int nbits;
+ register int k, r, i;
+
+ /* Encode the DC coefficient difference per section F.1.2.1 */
+
+ temp = temp2 = block[0] - last_dc_val;
+
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+ /* Emit the Huffman-coded symbol for the number of bits */
+ if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits]))
+ return FALSE;
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (nbits) /* emit_bits rejects calls with size 0 */
+ if (! emit_bits(state, (unsigned int) temp2, nbits))
+ return FALSE;
+
+ /* Encode the AC coefficients per section F.1.2.2 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = 1; k < DCTSIZE2; k++) {
+ if ((temp = block[jpeg_natural_order[k]]) == 0) {
+ r++;
+ } else {
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0]))
+ return FALSE;
+ r -= 16;
+ }
+
+ temp2 = temp;
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
+
+ /* Emit Huffman symbol for run length / number of bits */
+ i = (r << 4) + nbits;
+ if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i]))
+ return FALSE;
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (! emit_bits(state, (unsigned int) temp2, nbits))
+ return FALSE;
+
+ r = 0;
+ }
+ }
+
+ /* If the last coef(s) were zero, emit an end-of-block code */
+ if (r > 0)
+ if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0]))
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(boolean)
+emit_restart (working_state * state, int restart_num)
+{
+ int ci;
+
+ if (! flush_bits(state))
+ return FALSE;
+
+ emit_byte(state, 0xFF, return FALSE);
+ emit_byte(state, JPEG_RST0 + restart_num, return FALSE);
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < state->cinfo->comps_in_scan; ci++)
+ state->cur.last_dc_val[ci] = 0;
+
+ /* The restart counter is not updated until we successfully write the MCU. */
+
+ return TRUE;
+}
+
+
+/*
+ * Encode and output one MCU's worth of Huffman-compressed coefficients.
+ */
+
+METHODDEF(boolean)
+encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ working_state state;
+ int blkn, ci;
+ jpeg_component_info * compptr;
+
+ /* Load up working state */
+ state.next_output_byte = cinfo->dest->next_output_byte;
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
+ ASSIGN_STATE(state.cur, entropy->saved);
+ state.cinfo = cinfo;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! emit_restart(&state, entropy->next_restart_num))
+ return FALSE;
+ }
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ if (! encode_one_block(&state,
+ MCU_data[blkn][0], state.cur.last_dc_val[ci],
+ entropy->dc_derived_tbls[compptr->dc_tbl_no],
+ entropy->ac_derived_tbls[compptr->ac_tbl_no]))
+ return FALSE;
+ /* Update last_dc_val */
+ state.cur.last_dc_val[ci] = MCU_data[blkn][0][0];
+ }
+
+ /* Completed MCU, so update state */
+ cinfo->dest->next_output_byte = state.next_output_byte;
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
+ ASSIGN_STATE(entropy->saved, state.cur);
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass_huff (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ working_state state;
+
+ /* Load up working state ... flush_bits needs it */
+ state.next_output_byte = cinfo->dest->next_output_byte;
+ state.free_in_buffer = cinfo->dest->free_in_buffer;
+ ASSIGN_STATE(state.cur, entropy->saved);
+ state.cinfo = cinfo;
+
+ /* Flush out the last data */
+ if (! flush_bits(&state))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+
+ /* Update state */
+ cinfo->dest->next_output_byte = state.next_output_byte;
+ cinfo->dest->free_in_buffer = state.free_in_buffer;
+ ASSIGN_STATE(entropy->saved, state.cur);
+}
+
+
+/*
+ * Huffman coding optimization.
+ *
+ * We first scan the supplied data and count the number of uses of each symbol
+ * that is to be Huffman-coded. (This process MUST agree with the code above.)
+ * Then we build a Huffman coding tree for the observed counts.
+ * Symbols which are not needed at all for the particular image are not
+ * assigned any code, which saves space in the DHT marker as well as in
+ * the compressed data.
+ */
+
+#ifdef ENTROPY_OPT_SUPPORTED
+
+
+/* Process a single block's worth of coefficients */
+
+LOCAL(void)
+htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
+ long dc_counts[], long ac_counts[])
+{
+ register int temp;
+ register int nbits;
+ register int k, r;
+
+ /* Encode the DC coefficient difference per section F.1.2.1 */
+
+ temp = block[0] - last_dc_val;
+ if (temp < 0)
+ temp = -temp;
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count the Huffman symbol for the number of bits */
+ dc_counts[nbits]++;
+
+ /* Encode the AC coefficients per section F.1.2.2 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = 1; k < DCTSIZE2; k++) {
+ if ((temp = block[jpeg_natural_order[k]]) == 0) {
+ r++;
+ } else {
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ ac_counts[0xF0]++;
+ r -= 16;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ if (temp < 0)
+ temp = -temp;
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count Huffman symbol for run length / number of bits */
+ ac_counts[(r << 4) + nbits]++;
+
+ r = 0;
+ }
+ }
+
+ /* If the last coef(s) were zero, emit an end-of-block code */
+ if (r > 0)
+ ac_counts[0]++;
+}
+
+
+/*
+ * Trial-encode one MCU's worth of Huffman-compressed coefficients.
+ * No data is actually output, so no suspension return is possible.
+ */
+
+METHODDEF(boolean)
+encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int blkn, ci;
+ jpeg_component_info * compptr;
+
+ /* Take care of restart intervals if needed */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+ /* Update restart state */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci],
+ entropy->dc_count_ptrs[compptr->dc_tbl_no],
+ entropy->ac_count_ptrs[compptr->ac_tbl_no]);
+ entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0];
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Generate the best Huffman code table for the given counts, fill htbl.
+ * Note this is also used by jcphuff.c.
+ *
+ * The JPEG standard requires that no symbol be assigned a codeword of all
+ * one bits (so that padding bits added at the end of a compressed segment
+ * can't look like a valid code). Because of the canonical ordering of
+ * codewords, this just means that there must be an unused slot in the
+ * longest codeword length category. Section K.2 of the JPEG spec suggests
+ * reserving such a slot by pretending that symbol 256 is a valid symbol
+ * with count 1. In theory that's not optimal; giving it count zero but
+ * including it in the symbol set anyway should give a better Huffman code.
+ * But the theoretically better code actually seems to come out worse in
+ * practice, because it produces more all-ones bytes (which incur stuffed
+ * zero bytes in the final file). In any case the difference is tiny.
+ *
+ * The JPEG standard requires Huffman codes to be no more than 16 bits long.
+ * If some symbols have a very small but nonzero probability, the Huffman tree
+ * must be adjusted to meet the code length restriction. We currently use
+ * the adjustment method suggested in JPEG section K.2. This method is *not*
+ * optimal; it may not choose the best possible limited-length code. But
+ * typically only very-low-frequency symbols will be given less-than-optimal
+ * lengths, so the code is almost optimal. Experimental comparisons against
+ * an optimal limited-length-code algorithm indicate that the difference is
+ * microscopic --- usually less than a hundredth of a percent of total size.
+ * So the extra complexity of an optimal algorithm doesn't seem worthwhile.
+ */
+
+GLOBAL(void)
+jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])
+{
+#define MAX_CLEN 32 /* assumed maximum initial code length */
+ UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */
+ int codesize[257]; /* codesize[k] = code length of symbol k */
+ int others[257]; /* next symbol in current branch of tree */
+ int c1, c2;
+ int p, i, j;
+ long v;
+
+ /* This algorithm is explained in section K.2 of the JPEG standard */
+
+ MEMZERO(bits, SIZEOF(bits));
+ MEMZERO(codesize, SIZEOF(codesize));
+ for (i = 0; i < 257; i++)
+ others[i] = -1; /* init links to empty */
+
+ freq[256] = 1; /* make sure 256 has a nonzero count */
+ /* Including the pseudo-symbol 256 in the Huffman procedure guarantees
+ * that no real symbol is given code-value of all ones, because 256
+ * will be placed last in the largest codeword category.
+ */
+
+ /* Huffman's basic algorithm to assign optimal code lengths to symbols */
+
+ for (;;) {
+ /* Find the smallest nonzero frequency, set c1 = its symbol */
+ /* In case of ties, take the larger symbol number */
+ c1 = -1;
+ v = 1000000000L;
+ for (i = 0; i <= 256; i++) {
+ if (freq[i] && freq[i] <= v) {
+ v = freq[i];
+ c1 = i;
+ }
+ }
+
+ /* Find the next smallest nonzero frequency, set c2 = its symbol */
+ /* In case of ties, take the larger symbol number */
+ c2 = -1;
+ v = 1000000000L;
+ for (i = 0; i <= 256; i++) {
+ if (freq[i] && freq[i] <= v && i != c1) {
+ v = freq[i];
+ c2 = i;
+ }
+ }
+
+ /* Done if we've merged everything into one frequency */
+ if (c2 < 0)
+ break;
+
+ /* Else merge the two counts/trees */
+ freq[c1] += freq[c2];
+ freq[c2] = 0;
+
+ /* Increment the codesize of everything in c1's tree branch */
+ codesize[c1]++;
+ while (others[c1] >= 0) {
+ c1 = others[c1];
+ codesize[c1]++;
+ }
+
+ others[c1] = c2; /* chain c2 onto c1's tree branch */
+
+ /* Increment the codesize of everything in c2's tree branch */
+ codesize[c2]++;
+ while (others[c2] >= 0) {
+ c2 = others[c2];
+ codesize[c2]++;
+ }
+ }
+
+ /* Now count the number of symbols of each code length */
+ for (i = 0; i <= 256; i++) {
+ if (codesize[i]) {
+ /* The JPEG standard seems to think that this can't happen, */
+ /* but I'm paranoid... */
+ if (codesize[i] > MAX_CLEN)
+ ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW);
+
+ bits[codesize[i]]++;
+ }
+ }
+
+ /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure
+ * Huffman procedure assigned any such lengths, we must adjust the coding.
+ * Here is what the JPEG spec says about how this next bit works:
+ * Since symbols are paired for the longest Huffman code, the symbols are
+ * removed from this length category two at a time. The prefix for the pair
+ * (which is one bit shorter) is allocated to one of the pair; then,
+ * skipping the BITS entry for that prefix length, a code word from the next
+ * shortest nonzero BITS entry is converted into a prefix for two code words
+ * one bit longer.
+ */
+
+ for (i = MAX_CLEN; i > 16; i--) {
+ while (bits[i] > 0) {
+ j = i - 2; /* find length of new prefix to be used */
+ while (bits[j] == 0)
+ j--;
+
+ bits[i] -= 2; /* remove two symbols */
+ bits[i-1]++; /* one goes in this length */
+ bits[j+1] += 2; /* two new symbols in this length */
+ bits[j]--; /* symbol of this length is now a prefix */
+ }
+ }
+
+ /* Remove the count for the pseudo-symbol 256 from the largest codelength */
+ while (bits[i] == 0) /* find largest codelength still in use */
+ i--;
+ bits[i]--;
+
+ /* Return final symbol counts (only for lengths 0..16) */
+ MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits));
+
+ /* Return a list of the symbols sorted by code length */
+ /* It's not real clear to me why we don't need to consider the codelength
+ * changes made above, but the JPEG spec seems to think this works.
+ */
+ p = 0;
+ for (i = 1; i <= MAX_CLEN; i++) {
+ for (j = 0; j <= 255; j++) {
+ if (codesize[j] == i) {
+ htbl->huffval[p] = (UINT8) j;
+ p++;
+ }
+ }
+ }
+
+ /* Set sent_table FALSE so updated table will be written to JPEG file. */
+ htbl->sent_table = FALSE;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, dctbl, actbl;
+ jpeg_component_info * compptr;
+ JHUFF_TBL **htblptr;
+ boolean did_dc[NUM_HUFF_TBLS];
+ boolean did_ac[NUM_HUFF_TBLS];
+
+ /* It's important not to apply jpeg_gen_optimal_table more than once
+ * per table, because it clobbers the input frequency counts!
+ */
+ MEMZERO(did_dc, SIZEOF(did_dc));
+ MEMZERO(did_ac, SIZEOF(did_ac));
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ if (! did_dc[dctbl]) {
+ htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]);
+ did_dc[dctbl] = TRUE;
+ }
+ if (! did_ac[actbl]) {
+ htblptr = & cinfo->ac_huff_tbl_ptrs[actbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]);
+ did_ac[actbl] = TRUE;
+ }
+ }
+}
+
+
+#endif /* ENTROPY_OPT_SUPPORTED */
+
+
+/*
+ * Module initialization routine for Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_huff_encoder (j_compress_ptr cinfo)
+{
+ huff_entropy_ptr entropy;
+ int i;
+
+ entropy = (huff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(huff_entropy_encoder));
+ cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ entropy->pub.start_pass = start_pass_huff;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+#ifdef ENTROPY_OPT_SUPPORTED
+ entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
+#endif
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
new file mode 100644
index 0000000000..a0d8f8148f
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcinit.c
@@ -0,0 +1,75 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcinit.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains initialization logic for the JPEG compressor.
+ * This routine is in charge of selecting the modules to be executed and
+ * making an initialization call to each one.
+ *
+ * Logically, this code belongs in jcmaster.c. It's split out because
+ * linking this routine implies linking the entire compression library.
+ * For a transcoding-only application, we want to be able to use jcmaster.c
+ * without linking in the whole library.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Master selection of compression modules.
+ * This is done once at the start of processing an image. We determine
+ * which modules will be used and give them appropriate initialization calls.
+ */
+
+GLOBAL(void)
+jinit_compress_master (j_compress_ptr cinfo)
+{
+ /* Initialize master control (includes parameter checking/processing) */
+ jinit_c_master_control(cinfo, FALSE /* full compression */);
+
+ /* Preprocessing */
+ if (! cinfo->raw_data_in) {
+ jinit_color_converter(cinfo);
+ jinit_downsampler(cinfo);
+ jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
+ }
+ /* Forward DCT */
+ jinit_forward_dct(cinfo);
+ /* Entropy encoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ jinit_phuff_encoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_encoder(cinfo);
+ }
+
+ /* Need a full-image coefficient buffer in any multi-pass mode. */
+ jinit_c_coef_controller(cinfo,
+ (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
+ jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+ jinit_marker_writer(cinfo);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Write the datastream header (SOI) immediately.
+ * Frame and scan headers are postponed till later.
+ * This lets application insert special markers after the SOI.
+ */
+ (*cinfo->marker->write_file_header) (cinfo);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
new file mode 100644
index 0000000000..25d61f2284
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c
@@ -0,0 +1,296 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for compression.
+ * The main buffer lies between the pre-processor and the JPEG
+ * compressor proper; it holds downsampled data in the JPEG colorspace.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Note: currently, there is no operating mode in which a full-image buffer
+ * is needed at this step. If there were, that mode could not be used with
+ * "raw data" input, since this module is bypassed in that case. However,
+ * we've left the code here for possible use in special applications.
+ */
+#undef FULL_MAIN_BUFFER_SUPPORTED
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_main_controller pub; /* public fields */
+
+ JDIMENSION cur_iMCU_row; /* number of current iMCU row */
+ JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */
+ boolean suspended; /* remember if we suspended output */
+ J_BUF_MODE pass_mode; /* current operating mode */
+
+ /* If using just a strip buffer, this points to the entire set of buffers
+ * (we allocate one for each component). In the full-image case, this
+ * points to the currently accessible strips of the virtual arrays.
+ */
+ JSAMPARRAY buffer[MAX_COMPONENTS];
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ /* If using full-image storage, this array holds pointers to virtual-array
+ * control blocks for each component. Unused if not full-image storage.
+ */
+ jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
+#endif
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+METHODDEF(void) process_data_buffer_main
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ /* Do nothing in raw-data mode. */
+ if (cinfo->raw_data_in)
+ return;
+
+ main->cur_iMCU_row = 0; /* initialize counters */
+ main->rowgroup_ctr = 0;
+ main->suspended = FALSE;
+ main->pass_mode = pass_mode; /* save mode for use by process_data */
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ if (main->whole_image[0] != NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ main->pub.process_data = process_data_simple_main;
+ break;
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ case JBUF_SAVE_SOURCE:
+ case JBUF_CRANK_DEST:
+ case JBUF_SAVE_AND_PASS:
+ if (main->whole_image[0] == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ main->pub.process_data = process_data_buffer_main;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This routine handles the simple pass-through mode,
+ * where we have only a strip buffer.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ /* Read input data if we haven't filled the main buffer yet */
+ if (main->rowgroup_ctr < DCTSIZE)
+ (*cinfo->prep->pre_process_data) (cinfo,
+ input_buf, in_row_ctr, in_rows_avail,
+ main->buffer, &main->rowgroup_ctr,
+ (JDIMENSION) DCTSIZE);
+
+ /* If we don't have a full iMCU row buffered, return to application for
+ * more data. Note that preprocessor will always pad to fill the iMCU row
+ * at the bottom of the image.
+ */
+ if (main->rowgroup_ctr != DCTSIZE)
+ return;
+
+ /* Send the completed row to the compressor */
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
+ /* If compressor did not consume the whole row, then we must need to
+ * suspend processing and return to the application. In this situation
+ * we pretend we didn't yet consume the last input row; otherwise, if
+ * it happened to be the last row of the image, the application would
+ * think we were done.
+ */
+ if (! main->suspended) {
+ (*in_row_ctr)--;
+ main->suspended = TRUE;
+ }
+ return;
+ }
+ /* We did finish the row. Undo our little suspension hack if a previous
+ * call suspended; then mark the main buffer empty.
+ */
+ if (main->suspended) {
+ (*in_row_ctr)++;
+ main->suspended = FALSE;
+ }
+ main->rowgroup_ctr = 0;
+ main->cur_iMCU_row++;
+ }
+}
+
+
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+
+/*
+ * Process some data.
+ * This routine handles all of the modes that use a full-size buffer.
+ */
+
+METHODDEF(void)
+process_data_buffer_main (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci;
+ jpeg_component_info *compptr;
+ boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
+
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ /* Realign the virtual buffers if at the start of an iMCU row. */
+ if (main->rowgroup_ctr == 0) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, main->whole_image[ci],
+ main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
+ }
+ /* In a read pass, pretend we just read some source data. */
+ if (! writing) {
+ *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
+ main->rowgroup_ctr = DCTSIZE;
+ }
+ }
+
+ /* If a write pass, read input data until the current iMCU row is full. */
+ /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
+ if (writing) {
+ (*cinfo->prep->pre_process_data) (cinfo,
+ input_buf, in_row_ctr, in_rows_avail,
+ main->buffer, &main->rowgroup_ctr,
+ (JDIMENSION) DCTSIZE);
+ /* Return to application if we need more data to fill the iMCU row. */
+ if (main->rowgroup_ctr < DCTSIZE)
+ return;
+ }
+
+ /* Emit data, unless this is a sink-only pass. */
+ if (main->pass_mode != JBUF_SAVE_SOURCE) {
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
+ /* If compressor did not consume the whole row, then we must need to
+ * suspend processing and return to the application. In this situation
+ * we pretend we didn't yet consume the last input row; otherwise, if
+ * it happened to be the last row of the image, the application would
+ * think we were done.
+ */
+ if (! main->suspended) {
+ (*in_row_ctr)--;
+ main->suspended = TRUE;
+ }
+ return;
+ }
+ /* We did finish the row. Undo our little suspension hack if a previous
+ * call suspended; then mark the main buffer empty.
+ */
+ if (main->suspended) {
+ (*in_row_ctr)++;
+ main->suspended = FALSE;
+ }
+ }
+
+ /* If get here, we are done with this iMCU row. Mark buffer empty. */
+ main->rowgroup_ctr = 0;
+ main->cur_iMCU_row++;
+ }
+}
+
+#endif /* FULL_MAIN_BUFFER_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_main_ptr main;
+ int ci;
+ jpeg_component_info *compptr;
+
+ main = (my_main_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_main_controller));
+ cinfo->main = (struct jpeg_c_main_controller *) main;
+ main->pub.start_pass = start_pass_main;
+
+ /* We don't need to create a buffer in raw-data mode. */
+ if (cinfo->raw_data_in)
+ return;
+
+ /* Create the buffer. It holds downsampled data, so each component
+ * may be of a different size.
+ */
+ if (need_full_buffer) {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ /* Allocate a full-image virtual array for each component */
+ /* Note we pad the bottom to a multiple of the iMCU height */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor) * DCTSIZE,
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+ }
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif
+ } else {
+#ifdef FULL_MAIN_BUFFER_SUPPORTED
+ main->whole_image[0] = NULL; /* flag for no virtual arrays */
+#endif
+ /* Allocate a strip buffer for each component */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * DCTSIZE,
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE));
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
new file mode 100644
index 0000000000..d0a9e87650
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c
@@ -0,0 +1,667 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to write JPEG datastream markers.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum { /* JPEG marker codes */
+ M_SOF0 = 0xc0,
+ M_SOF1 = 0xc1,
+ M_SOF2 = 0xc2,
+ M_SOF3 = 0xc3,
+
+ M_SOF5 = 0xc5,
+ M_SOF6 = 0xc6,
+ M_SOF7 = 0xc7,
+
+ M_JPG = 0xc8,
+ M_SOF9 = 0xc9,
+ M_SOF10 = 0xca,
+ M_SOF11 = 0xcb,
+
+ M_SOF13 = 0xcd,
+ M_SOF14 = 0xce,
+ M_SOF15 = 0xcf,
+
+ M_DHT = 0xc4,
+
+ M_DAC = 0xcc,
+
+ M_RST0 = 0xd0,
+ M_RST1 = 0xd1,
+ M_RST2 = 0xd2,
+ M_RST3 = 0xd3,
+ M_RST4 = 0xd4,
+ M_RST5 = 0xd5,
+ M_RST6 = 0xd6,
+ M_RST7 = 0xd7,
+
+ M_SOI = 0xd8,
+ M_EOI = 0xd9,
+ M_SOS = 0xda,
+ M_DQT = 0xdb,
+ M_DNL = 0xdc,
+ M_DRI = 0xdd,
+ M_DHP = 0xde,
+ M_EXP = 0xdf,
+
+ M_APP0 = 0xe0,
+ M_APP1 = 0xe1,
+ M_APP2 = 0xe2,
+ M_APP3 = 0xe3,
+ M_APP4 = 0xe4,
+ M_APP5 = 0xe5,
+ M_APP6 = 0xe6,
+ M_APP7 = 0xe7,
+ M_APP8 = 0xe8,
+ M_APP9 = 0xe9,
+ M_APP10 = 0xea,
+ M_APP11 = 0xeb,
+ M_APP12 = 0xec,
+ M_APP13 = 0xed,
+ M_APP14 = 0xee,
+ M_APP15 = 0xef,
+
+ M_JPG0 = 0xf0,
+ M_JPG13 = 0xfd,
+ M_COM = 0xfe,
+
+ M_TEM = 0x01,
+
+ M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_marker_writer pub; /* public fields */
+
+ unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
+} my_marker_writer;
+
+typedef my_marker_writer * my_marker_ptr;
+
+
+/*
+ * Basic output routines.
+ *
+ * Note that we do not support suspension while writing a marker.
+ * Therefore, an application using suspension must ensure that there is
+ * enough buffer space for the initial markers (typ. 600-700 bytes) before
+ * calling jpeg_start_compress, and enough space to write the trailing EOI
+ * (a few bytes) before calling jpeg_finish_compress. Multipass compression
+ * modes are not supported at all with suspension, so those two are the only
+ * points where markers will be written.
+ */
+
+LOCAL(void)
+emit_byte (j_compress_ptr cinfo, int val)
+/* Emit a byte */
+{
+ struct jpeg_destination_mgr * dest = cinfo->dest;
+
+ *(dest->next_output_byte)++ = (JOCTET) val;
+ if (--dest->free_in_buffer == 0) {
+ if (! (*dest->empty_output_buffer) (cinfo))
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
+ }
+}
+
+
+LOCAL(void)
+emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
+/* Emit a marker code */
+{
+ emit_byte(cinfo, 0xFF);
+ emit_byte(cinfo, (int) mark);
+}
+
+
+LOCAL(void)
+emit_2bytes (j_compress_ptr cinfo, int value)
+/* Emit a 2-byte integer; these are always MSB first in JPEG files */
+{
+ emit_byte(cinfo, (value >> 8) & 0xFF);
+ emit_byte(cinfo, value & 0xFF);
+}
+
+
+/*
+ * Routines to write specific marker types.
+ */
+
+LOCAL(int)
+emit_dqt (j_compress_ptr cinfo, int index)
+/* Emit a DQT marker */
+/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
+{
+ JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
+ int prec;
+ int i;
+
+ if (qtbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
+
+ prec = 0;
+ for (i = 0; i < DCTSIZE2; i++) {
+ if (qtbl->quantval[i] > 255)
+ prec = 1;
+ }
+
+ if (! qtbl->sent_table) {
+ emit_marker(cinfo, M_DQT);
+
+ emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
+
+ emit_byte(cinfo, index + (prec<<4));
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ /* The table entries must be emitted in zigzag order. */
+ unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
+ if (prec)
+ emit_byte(cinfo, (int) (qval >> 8));
+ emit_byte(cinfo, (int) (qval & 0xFF));
+ }
+
+ qtbl->sent_table = TRUE;
+ }
+
+ return prec;
+}
+
+
+LOCAL(void)
+emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
+/* Emit a DHT marker */
+{
+ JHUFF_TBL * htbl;
+ int length, i;
+
+ if (is_ac) {
+ htbl = cinfo->ac_huff_tbl_ptrs[index];
+ index += 0x10; /* output index has AC bit set */
+ } else {
+ htbl = cinfo->dc_huff_tbl_ptrs[index];
+ }
+
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
+
+ if (! htbl->sent_table) {
+ emit_marker(cinfo, M_DHT);
+
+ length = 0;
+ for (i = 1; i <= 16; i++)
+ length += htbl->bits[i];
+
+ emit_2bytes(cinfo, length + 2 + 1 + 16);
+ emit_byte(cinfo, index);
+
+ for (i = 1; i <= 16; i++)
+ emit_byte(cinfo, htbl->bits[i]);
+
+ for (i = 0; i < length; i++)
+ emit_byte(cinfo, htbl->huffval[i]);
+
+ htbl->sent_table = TRUE;
+ }
+}
+
+
+LOCAL(void)
+emit_dac (j_compress_ptr cinfo)
+/* Emit a DAC marker */
+/* Since the useful info is so small, we want to emit all the tables in */
+/* one DAC marker. Therefore this routine does its own scan of the table. */
+{
+#ifdef C_ARITH_CODING_SUPPORTED
+ char dc_in_use[NUM_ARITH_TBLS];
+ char ac_in_use[NUM_ARITH_TBLS];
+ int length, i;
+ jpeg_component_info *compptr;
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
+ dc_in_use[i] = ac_in_use[i] = 0;
+
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ dc_in_use[compptr->dc_tbl_no] = 1;
+ ac_in_use[compptr->ac_tbl_no] = 1;
+ }
+
+ length = 0;
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
+ length += dc_in_use[i] + ac_in_use[i];
+
+ emit_marker(cinfo, M_DAC);
+
+ emit_2bytes(cinfo, length*2 + 2);
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ if (dc_in_use[i]) {
+ emit_byte(cinfo, i);
+ emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
+ }
+ if (ac_in_use[i]) {
+ emit_byte(cinfo, i + 0x10);
+ emit_byte(cinfo, cinfo->arith_ac_K[i]);
+ }
+ }
+#endif /* C_ARITH_CODING_SUPPORTED */
+}
+
+
+LOCAL(void)
+emit_dri (j_compress_ptr cinfo)
+/* Emit a DRI marker */
+{
+ emit_marker(cinfo, M_DRI);
+
+ emit_2bytes(cinfo, 4); /* fixed length */
+
+ emit_2bytes(cinfo, (int) cinfo->restart_interval);
+}
+
+
+LOCAL(void)
+emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
+/* Emit a SOF marker */
+{
+ int ci;
+ jpeg_component_info *compptr;
+
+ emit_marker(cinfo, code);
+
+ emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
+
+ /* Make sure image isn't bigger than SOF field can handle */
+ if ((long) cinfo->image_height > 65535L ||
+ (long) cinfo->image_width > 65535L)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
+
+ emit_byte(cinfo, cinfo->data_precision);
+ emit_2bytes(cinfo, (int) cinfo->image_height);
+ emit_2bytes(cinfo, (int) cinfo->image_width);
+
+ emit_byte(cinfo, cinfo->num_components);
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ emit_byte(cinfo, compptr->component_id);
+ emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
+ emit_byte(cinfo, compptr->quant_tbl_no);
+ }
+}
+
+
+LOCAL(void)
+emit_sos (j_compress_ptr cinfo)
+/* Emit a SOS marker */
+{
+ int i, td, ta;
+ jpeg_component_info *compptr;
+
+ emit_marker(cinfo, M_SOS);
+
+ emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
+
+ emit_byte(cinfo, cinfo->comps_in_scan);
+
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ emit_byte(cinfo, compptr->component_id);
+ td = compptr->dc_tbl_no;
+ ta = compptr->ac_tbl_no;
+ if (cinfo->progressive_mode) {
+ /* Progressive mode: only DC or only AC tables are used in one scan;
+ * furthermore, Huffman coding of DC refinement uses no table at all.
+ * We emit 0 for unused field(s); this is recommended by the P&M text
+ * but does not seem to be specified in the standard.
+ */
+ if (cinfo->Ss == 0) {
+ ta = 0; /* DC scan */
+ if (cinfo->Ah != 0 && !cinfo->arith_code)
+ td = 0; /* no DC table either */
+ } else {
+ td = 0; /* AC scan */
+ }
+ }
+ emit_byte(cinfo, (td << 4) + ta);
+ }
+
+ emit_byte(cinfo, cinfo->Ss);
+ emit_byte(cinfo, cinfo->Se);
+ emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
+}
+
+
+LOCAL(void)
+emit_jfif_app0 (j_compress_ptr cinfo)
+/* Emit a JFIF-compliant APP0 marker */
+{
+ /*
+ * Length of APP0 block (2 bytes)
+ * Block ID (4 bytes - ASCII "JFIF")
+ * Zero byte (1 byte to terminate the ID string)
+ * Version Major, Minor (2 bytes - major first)
+ * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
+ * Xdpu (2 bytes - dots per unit horizontal)
+ * Ydpu (2 bytes - dots per unit vertical)
+ * Thumbnail X size (1 byte)
+ * Thumbnail Y size (1 byte)
+ */
+
+ emit_marker(cinfo, M_APP0);
+
+ emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
+
+ emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */
+ emit_byte(cinfo, 0x46);
+ emit_byte(cinfo, 0x49);
+ emit_byte(cinfo, 0x46);
+ emit_byte(cinfo, 0);
+ emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
+ emit_byte(cinfo, cinfo->JFIF_minor_version);
+ emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
+ emit_2bytes(cinfo, (int) cinfo->X_density);
+ emit_2bytes(cinfo, (int) cinfo->Y_density);
+ emit_byte(cinfo, 0); /* No thumbnail image */
+ emit_byte(cinfo, 0);
+}
+
+
+LOCAL(void)
+emit_adobe_app14 (j_compress_ptr cinfo)
+/* Emit an Adobe APP14 marker */
+{
+ /*
+ * Length of APP14 block (2 bytes)
+ * Block ID (5 bytes - ASCII "Adobe")
+ * Version Number (2 bytes - currently 100)
+ * Flags0 (2 bytes - currently 0)
+ * Flags1 (2 bytes - currently 0)
+ * Color transform (1 byte)
+ *
+ * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
+ * now in circulation seem to use Version = 100, so that's what we write.
+ *
+ * We write the color transform byte as 1 if the JPEG color space is
+ * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with
+ * whether the encoder performed a transformation, which is pretty useless.
+ */
+
+ emit_marker(cinfo, M_APP14);
+
+ emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
+
+ emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */
+ emit_byte(cinfo, 0x64);
+ emit_byte(cinfo, 0x6F);
+ emit_byte(cinfo, 0x62);
+ emit_byte(cinfo, 0x65);
+ emit_2bytes(cinfo, 100); /* Version */
+ emit_2bytes(cinfo, 0); /* Flags0 */
+ emit_2bytes(cinfo, 0); /* Flags1 */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_YCbCr:
+ emit_byte(cinfo, 1); /* Color transform = 1 */
+ break;
+ case JCS_YCCK:
+ emit_byte(cinfo, 2); /* Color transform = 2 */
+ break;
+ default:
+ emit_byte(cinfo, 0); /* Color transform = 0 */
+ break;
+ }
+}
+
+
+/*
+ * These routines allow writing an arbitrary marker with parameters.
+ * The only intended use is to emit COM or APPn markers after calling
+ * write_file_header and before calling write_frame_header.
+ * Other uses are not guaranteed to produce desirable results.
+ * Counting the parameter bytes properly is the caller's responsibility.
+ */
+
+METHODDEF(void)
+write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
+/* Emit an arbitrary marker header */
+{
+ if (datalen > (unsigned int) 65533) /* safety check */
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ emit_marker(cinfo, (JPEG_MARKER) marker);
+
+ emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */
+}
+
+METHODDEF(void)
+write_marker_byte (j_compress_ptr cinfo, int val)
+/* Emit one byte of marker parameters following write_marker_header */
+{
+ emit_byte(cinfo, val);
+}
+
+
+/*
+ * Write datastream header.
+ * This consists of an SOI and optional APPn markers.
+ * We recommend use of the JFIF marker, but not the Adobe marker,
+ * when using YCbCr or grayscale data. The JFIF marker should NOT
+ * be used for any other JPEG colorspace. The Adobe marker is helpful
+ * to distinguish RGB, CMYK, and YCCK colorspaces.
+ * Note that an application can write additional header markers after
+ * jpeg_start_compress returns.
+ */
+
+METHODDEF(void)
+write_file_header (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ emit_marker(cinfo, M_SOI); /* first the SOI */
+
+ /* SOI is defined to reset restart interval to 0 */
+ marker->last_restart_interval = 0;
+
+ if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
+ emit_jfif_app0(cinfo);
+ if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
+ emit_adobe_app14(cinfo);
+}
+
+
+/*
+ * Write frame header.
+ * This consists of DQT and SOFn markers.
+ * Note that we do not emit the SOF until we have emitted the DQT(s).
+ * This avoids compatibility problems with incorrect implementations that
+ * try to error-check the quant table numbers as soon as they see the SOF.
+ */
+
+METHODDEF(void)
+write_frame_header (j_compress_ptr cinfo)
+{
+ int ci, prec;
+ boolean is_baseline;
+ jpeg_component_info *compptr;
+
+ /* Emit DQT for each quantization table.
+ * Note that emit_dqt() suppresses any duplicate tables.
+ */
+ prec = 0;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ prec += emit_dqt(cinfo, compptr->quant_tbl_no);
+ }
+ /* now prec is nonzero iff there are any 16-bit quant tables. */
+
+ /* Check for a non-baseline specification.
+ * Note we assume that Huffman table numbers won't be changed later.
+ */
+ if (cinfo->arith_code || cinfo->progressive_mode ||
+ cinfo->data_precision != 8) {
+ is_baseline = FALSE;
+ } else {
+ is_baseline = TRUE;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
+ is_baseline = FALSE;
+ }
+ if (prec && is_baseline) {
+ is_baseline = FALSE;
+ /* If it's baseline except for quantizer size, warn the user */
+ TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
+ }
+ }
+
+ /* Emit the proper SOF marker */
+ if (cinfo->arith_code) {
+ emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */
+ } else {
+ if (cinfo->progressive_mode)
+ emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */
+ else if (is_baseline)
+ emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */
+ else
+ emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
+ }
+}
+
+
+/*
+ * Write scan header.
+ * This consists of DHT or DAC markers, optional DRI, and SOS.
+ * Compressed data will be written following the SOS.
+ */
+
+METHODDEF(void)
+write_scan_header (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ int i;
+ jpeg_component_info *compptr;
+
+ if (cinfo->arith_code) {
+ /* Emit arith conditioning info. We may have some duplication
+ * if the file has multiple scans, but it's so small it's hardly
+ * worth worrying about.
+ */
+ emit_dac(cinfo);
+ } else {
+ /* Emit Huffman tables.
+ * Note that emit_dht() suppresses any duplicate tables.
+ */
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
+ compptr = cinfo->cur_comp_info[i];
+ if (cinfo->progressive_mode) {
+ /* Progressive mode: only DC or only AC tables are used in one scan */
+ if (cinfo->Ss == 0) {
+ if (cinfo->Ah == 0) /* DC needs no table for refinement scan */
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+ } else {
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+ }
+ } else {
+ /* Sequential mode: need both DC and AC tables */
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
+ }
+ }
+ }
+
+ /* Emit DRI if required --- note that DRI value could change for each scan.
+ * We avoid wasting space with unnecessary DRIs, however.
+ */
+ if (cinfo->restart_interval != marker->last_restart_interval) {
+ emit_dri(cinfo);
+ marker->last_restart_interval = cinfo->restart_interval;
+ }
+
+ emit_sos(cinfo);
+}
+
+
+/*
+ * Write datastream trailer.
+ */
+
+METHODDEF(void)
+write_file_trailer (j_compress_ptr cinfo)
+{
+ emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Write an abbreviated table-specification datastream.
+ * This consists of SOI, DQT and DHT tables, and EOI.
+ * Any table that is defined and not marked sent_table = TRUE will be
+ * emitted. Note that all tables will be marked sent_table = TRUE at exit.
+ */
+
+METHODDEF(void)
+write_tables_only (j_compress_ptr cinfo)
+{
+ int i;
+
+ emit_marker(cinfo, M_SOI);
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
+ if (cinfo->quant_tbl_ptrs[i] != NULL)
+ (void) emit_dqt(cinfo, i);
+ }
+
+ if (! cinfo->arith_code) {
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
+ emit_dht(cinfo, i, FALSE);
+ if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
+ emit_dht(cinfo, i, TRUE);
+ }
+ }
+
+ emit_marker(cinfo, M_EOI);
+}
+
+
+/*
+ * Initialize the marker writer module.
+ */
+
+GLOBAL(void)
+jinit_marker_writer (j_compress_ptr cinfo)
+{
+ my_marker_ptr marker;
+
+ /* Create the subobject */
+ marker = (my_marker_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_marker_writer));
+ cinfo->marker = (struct jpeg_marker_writer *) marker;
+ /* Initialize method pointers */
+ marker->pub.write_file_header = write_file_header;
+ marker->pub.write_frame_header = write_frame_header;
+ marker->pub.write_scan_header = write_scan_header;
+ marker->pub.write_file_trailer = write_file_trailer;
+ marker->pub.write_tables_only = write_tables_only;
+ marker->pub.write_marker_header = write_marker_header;
+ marker->pub.write_marker_byte = write_marker_byte;
+ /* Initialize private state */
+ marker->last_restart_interval = 0;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
new file mode 100644
index 0000000000..870f775191
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c
@@ -0,0 +1,593 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG compressor.
+ * These routines are concerned with parameter validation, initial setup,
+ * and inter-pass control (determining the number of passes and the work
+ * to be done in each pass).
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef enum {
+ main_pass, /* input data, also do first output step */
+ huff_opt_pass, /* Huffman code optimization pass */
+ output_pass /* data output pass */
+} c_pass_type;
+
+typedef struct {
+ struct jpeg_comp_master pub; /* public fields */
+
+ c_pass_type pass_type; /* the type of the current pass */
+
+ int pass_number; /* # of passes completed */
+ int total_passes; /* total # of passes needed */
+
+ int scan_number; /* current index in scan_info[] */
+} my_comp_master;
+
+typedef my_comp_master * my_master_ptr;
+
+
+/*
+ * Support routines that do various essential calculations.
+ */
+
+LOCAL(void)
+initial_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+ int ci;
+ jpeg_component_info *compptr;
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* Sanity check on image dimensions */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+ || cinfo->num_components <= 0 || cinfo->input_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ /* Make sure image isn't bigger than I can handle */
+ if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+ (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+ /* Width of an input scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Check that number of components won't exceed internal array sizes */
+ if (cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+
+ /* Compute maximum sampling factors; check factor validity */
+ cinfo->max_h_samp_factor = 1;
+ cinfo->max_v_samp_factor = 1;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+ compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+ ERREXIT(cinfo, JERR_BAD_SAMPLING);
+ cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+ compptr->h_samp_factor);
+ cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+ compptr->v_samp_factor);
+ }
+
+ /* Compute dimensions of components */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Fill in the correct component_index value; don't rely on application */
+ compptr->component_index = ci;
+ /* For compression, we never do DCT scaling. */
+ compptr->DCT_scaled_size = DCTSIZE;
+ /* Size in DCT blocks */
+ compptr->width_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->height_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ /* Size in samples */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) cinfo->max_h_samp_factor);
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) cinfo->max_v_samp_factor);
+ /* Mark component needed (this flag isn't actually used for compression) */
+ compptr->component_needed = TRUE;
+ }
+
+ /* Compute number of fully interleaved MCU rows (number of times that
+ * main controller will call coefficient controller).
+ */
+ cinfo->total_iMCU_rows = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+}
+
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+
+LOCAL(void)
+validate_script (j_compress_ptr cinfo)
+/* Verify that the scan script in cinfo->scan_info[] is valid; also
+ * determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
+ */
+{
+ const jpeg_scan_info * scanptr;
+ int scanno, ncomps, ci, coefi, thisi;
+ int Ss, Se, Ah, Al;
+ boolean component_sent[MAX_COMPONENTS];
+#ifdef C_PROGRESSIVE_SUPPORTED
+ int * last_bitpos_ptr;
+ int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
+ /* -1 until that coefficient has been seen; then last Al for it */
+#endif
+
+ if (cinfo->num_scans <= 0)
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
+
+ /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
+ * for progressive JPEG, no scan can have this.
+ */
+ scanptr = cinfo->scan_info;
+ if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ cinfo->progressive_mode = TRUE;
+ last_bitpos_ptr = & last_bitpos[0][0];
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ for (coefi = 0; coefi < DCTSIZE2; coefi++)
+ *last_bitpos_ptr++ = -1;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ cinfo->progressive_mode = FALSE;
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ component_sent[ci] = FALSE;
+ }
+
+ for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
+ /* Validate component indexes */
+ ncomps = scanptr->comps_in_scan;
+ if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
+ for (ci = 0; ci < ncomps; ci++) {
+ thisi = scanptr->component_index[ci];
+ if (thisi < 0 || thisi >= cinfo->num_components)
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ /* Components must appear in SOF order within each scan */
+ if (ci > 0 && thisi <= scanptr->component_index[ci-1])
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ }
+ /* Validate progression parameters */
+ Ss = scanptr->Ss;
+ Se = scanptr->Se;
+ Ah = scanptr->Ah;
+ Al = scanptr->Al;
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
+ * seems wrong: the upper bound ought to depend on data precision.
+ * Perhaps they really meant 0..N+1 for N-bit precision.
+ * Here we allow 0..10 for 8-bit data; Al larger than 10 results in
+ * out-of-range reconstructed DC values during the first DC scan,
+ * which might cause problems for some decoders.
+ */
+#if BITS_IN_JSAMPLE == 8
+#define MAX_AH_AL 10
+#else
+#define MAX_AH_AL 13
+#endif
+ if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
+ Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ if (Ss == 0) {
+ if (Se != 0) /* DC and AC together not OK */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ } else {
+ if (ncomps != 1) /* AC scans must be for only one component */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ }
+ for (ci = 0; ci < ncomps; ci++) {
+ last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
+ if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ for (coefi = Ss; coefi <= Se; coefi++) {
+ if (last_bitpos_ptr[coefi] < 0) {
+ /* first scan of this coefficient */
+ if (Ah != 0)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ } else {
+ /* not first scan */
+ if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ }
+ last_bitpos_ptr[coefi] = Al;
+ }
+ }
+#endif
+ } else {
+ /* For sequential JPEG, all progression parameters must be these: */
+ if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
+ ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
+ /* Make sure components are not sent twice */
+ for (ci = 0; ci < ncomps; ci++) {
+ thisi = scanptr->component_index[ci];
+ if (component_sent[thisi])
+ ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
+ component_sent[thisi] = TRUE;
+ }
+ }
+ }
+
+ /* Now verify that everything got sent. */
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ /* For progressive mode, we only check that at least some DC data
+ * got sent for each component; the spec does not require that all bits
+ * of all coefficients be transmitted. Would it be wiser to enforce
+ * transmission of all coefficient bits??
+ */
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ if (last_bitpos[ci][0] < 0)
+ ERREXIT(cinfo, JERR_MISSING_DATA);
+ }
+#endif
+ } else {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ if (! component_sent[ci])
+ ERREXIT(cinfo, JERR_MISSING_DATA);
+ }
+ }
+}
+
+#endif /* C_MULTISCAN_FILES_SUPPORTED */
+
+
+LOCAL(void)
+select_scan_parameters (j_compress_ptr cinfo)
+/* Set up the scan parameters for the current scan */
+{
+ int ci;
+
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+ if (cinfo->scan_info != NULL) {
+ /* Prepare for current scan --- the script is already validated */
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+ const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
+
+ cinfo->comps_in_scan = scanptr->comps_in_scan;
+ for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
+ cinfo->cur_comp_info[ci] =
+ &cinfo->comp_info[scanptr->component_index[ci]];
+ }
+ cinfo->Ss = scanptr->Ss;
+ cinfo->Se = scanptr->Se;
+ cinfo->Ah = scanptr->Ah;
+ cinfo->Al = scanptr->Al;
+ }
+ else
+#endif
+ {
+ /* Prepare for single sequential-JPEG scan containing all components */
+ if (cinfo->num_components > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPS_IN_SCAN);
+ cinfo->comps_in_scan = cinfo->num_components;
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
+ }
+ cinfo->Ss = 0;
+ cinfo->Se = DCTSIZE2-1;
+ cinfo->Ah = 0;
+ cinfo->Al = 0;
+ }
+}
+
+
+LOCAL(void)
+per_scan_setup (j_compress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
+{
+ int ci, mcublks, tmp;
+ jpeg_component_info *compptr;
+
+ if (cinfo->comps_in_scan == 1) {
+
+ /* Noninterleaved (single-component) scan */
+ compptr = cinfo->cur_comp_info[0];
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = compptr->width_in_blocks;
+ cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+ /* For noninterleaved scan, always one block per MCU */
+ compptr->MCU_width = 1;
+ compptr->MCU_height = 1;
+ compptr->MCU_blocks = 1;
+ compptr->MCU_sample_width = DCTSIZE;
+ compptr->last_col_width = 1;
+ /* For noninterleaved scans, it is convenient to define last_row_height
+ * as the number of block rows present in the last iMCU row.
+ */
+ tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (tmp == 0) tmp = compptr->v_samp_factor;
+ compptr->last_row_height = tmp;
+
+ /* Prepare array describing MCU composition */
+ cinfo->blocks_in_MCU = 1;
+ cinfo->MCU_membership[0] = 0;
+
+ } else {
+
+ /* Interleaved (multi-component) scan */
+ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+ MAX_COMPS_IN_SCAN);
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width,
+ (long) (cinfo->max_h_samp_factor*DCTSIZE));
+ cinfo->MCU_rows_in_scan = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ cinfo->blocks_in_MCU = 0;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Sampling factors give # of blocks of component in each MCU */
+ compptr->MCU_width = compptr->h_samp_factor;
+ compptr->MCU_height = compptr->v_samp_factor;
+ compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+ compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE;
+ /* Figure number of non-dummy blocks in last MCU column & row */
+ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+ if (tmp == 0) tmp = compptr->MCU_width;
+ compptr->last_col_width = tmp;
+ tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+ if (tmp == 0) tmp = compptr->MCU_height;
+ compptr->last_row_height = tmp;
+ /* Prepare array describing MCU composition */
+ mcublks = compptr->MCU_blocks;
+ if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
+ ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+ while (mcublks-- > 0) {
+ cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+ }
+ }
+
+ }
+
+ /* Convert restart specified in rows to actual MCU count. */
+ /* Note that count must fit in 16 bits, so we provide limiting. */
+ if (cinfo->restart_in_rows > 0) {
+ long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
+ cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
+ }
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each pass. We determine which modules
+ * will be active during this pass and give them appropriate start_pass calls.
+ * We also set is_last_pass to indicate whether any more passes will be
+ * required.
+ */
+
+METHODDEF(void)
+prepare_for_pass (j_compress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ switch (master->pass_type) {
+ case main_pass:
+ /* Initial pass: will collect input data, and do either Huffman
+ * optimization or data output for the first scan.
+ */
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ if (! cinfo->raw_data_in) {
+ (*cinfo->cconvert->start_pass) (cinfo);
+ (*cinfo->downsample->start_pass) (cinfo);
+ (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
+ }
+ (*cinfo->fdct->start_pass) (cinfo);
+ (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
+ (*cinfo->coef->start_pass) (cinfo,
+ (master->total_passes > 1 ?
+ JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+ (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+ if (cinfo->optimize_coding) {
+ /* No immediate data output; postpone writing frame/scan headers */
+ master->pub.call_pass_startup = FALSE;
+ } else {
+ /* Will write frame/scan headers at first jpeg_write_scanlines call */
+ master->pub.call_pass_startup = TRUE;
+ }
+ break;
+#ifdef ENTROPY_OPT_SUPPORTED
+ case huff_opt_pass:
+ /* Do Huffman optimization for a scan after the first one. */
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
+ (*cinfo->entropy->start_pass) (cinfo, TRUE);
+ (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+ master->pub.call_pass_startup = FALSE;
+ break;
+ }
+ /* Special case: Huffman DC refinement scans need no Huffman table
+ * and therefore we can skip the optimization pass for them.
+ */
+ master->pass_type = output_pass;
+ master->pass_number++;
+ /*FALLTHROUGH*/
+#endif
+ case output_pass:
+ /* Do a data-output pass. */
+ /* We need not repeat per-scan setup if prior optimization pass did it. */
+ if (! cinfo->optimize_coding) {
+ select_scan_parameters(cinfo);
+ per_scan_setup(cinfo);
+ }
+ (*cinfo->entropy->start_pass) (cinfo, FALSE);
+ (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
+ /* We emit frame/scan headers now */
+ if (master->scan_number == 0)
+ (*cinfo->marker->write_frame_header) (cinfo);
+ (*cinfo->marker->write_scan_header) (cinfo);
+ master->pub.call_pass_startup = FALSE;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ }
+
+ master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
+
+ /* Set up progress monitor's pass info if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->completed_passes = master->pass_number;
+ cinfo->progress->total_passes = master->total_passes;
+ }
+}
+
+
+/*
+ * Special start-of-pass hook.
+ * This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
+ * In single-pass processing, we need this hook because we don't want to
+ * write frame/scan headers during jpeg_start_compress; we want to let the
+ * application write COM markers etc. between jpeg_start_compress and the
+ * jpeg_write_scanlines loop.
+ * In multi-pass processing, this routine is not used.
+ */
+
+METHODDEF(void)
+pass_startup (j_compress_ptr cinfo)
+{
+ cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
+
+ (*cinfo->marker->write_frame_header) (cinfo);
+ (*cinfo->marker->write_scan_header) (cinfo);
+}
+
+
+/*
+ * Finish up at end of pass.
+ */
+
+METHODDEF(void)
+finish_pass_master (j_compress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ /* The entropy coder always needs an end-of-pass call,
+ * either to analyze statistics or to flush its output buffer.
+ */
+ (*cinfo->entropy->finish_pass) (cinfo);
+
+ /* Update state for next pass */
+ switch (master->pass_type) {
+ case main_pass:
+ /* next pass is either output of scan 0 (after optimization)
+ * or output of scan 1 (if no optimization).
+ */
+ master->pass_type = output_pass;
+ if (! cinfo->optimize_coding)
+ master->scan_number++;
+ break;
+ case huff_opt_pass:
+ /* next pass is always output of current scan */
+ master->pass_type = output_pass;
+ break;
+ case output_pass:
+ /* next pass is either optimization or output of next scan */
+ if (cinfo->optimize_coding)
+ master->pass_type = huff_opt_pass;
+ master->scan_number++;
+ break;
+ }
+
+ master->pass_number++;
+}
+
+
+/*
+ * Initialize master compression control.
+ */
+
+GLOBAL(void)
+jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
+{
+ my_master_ptr master;
+
+ master = (my_master_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_comp_master));
+ cinfo->master = (struct jpeg_comp_master *) master;
+ master->pub.prepare_for_pass = prepare_for_pass;
+ master->pub.pass_startup = pass_startup;
+ master->pub.finish_pass = finish_pass_master;
+ master->pub.is_last_pass = FALSE;
+
+ /* Validate parameters, determine derived values */
+ initial_setup(cinfo);
+
+ if (cinfo->scan_info != NULL) {
+#ifdef C_MULTISCAN_FILES_SUPPORTED
+ validate_script(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ cinfo->progressive_mode = FALSE;
+ cinfo->num_scans = 1;
+ }
+
+ if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */
+ cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
+
+ /* Initialize my private state */
+ if (transcode_only) {
+ /* no main pass in transcoding */
+ if (cinfo->optimize_coding)
+ master->pass_type = huff_opt_pass;
+ else
+ master->pass_type = output_pass;
+ } else {
+ /* for normal compression, first pass is always this type: */
+ master->pass_type = main_pass;
+ }
+ master->scan_number = 0;
+ master->pass_number = 0;
+ if (cinfo->optimize_coding)
+ master->total_passes = cinfo->num_scans * 2;
+ else
+ master->total_passes = cinfo->num_scans;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
new file mode 100644
index 0000000000..964909ac4e
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c
@@ -0,0 +1,109 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcomapi.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface routines that are used for both
+ * compression and decompression.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Abort processing of a JPEG compression or decompression operation,
+ * but don't destroy the object itself.
+ *
+ * For this, we merely clean up all the nonpermanent memory pools.
+ * Note that temp files (virtual arrays) are not allowed to belong to
+ * the permanent pool, so we will be able to close all temp files here.
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_abort (j_common_ptr cinfo)
+{
+ int pool;
+
+ /* Do nothing if called on a not-initialized or destroyed JPEG object. */
+ if (cinfo->mem == NULL)
+ return;
+
+ /* Releasing pools in reverse order might help avoid fragmentation
+ * with some (brain-damaged) malloc libraries.
+ */
+ for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
+ (*cinfo->mem->free_pool) (cinfo, pool);
+ }
+
+ /* Reset overall state for possible reuse of object */
+ if (cinfo->is_decompressor) {
+ cinfo->global_state = DSTATE_START;
+ /* Try to keep application from accessing now-deleted marker list.
+ * A bit kludgy to do it here, but this is the most central place.
+ */
+ ((j_decompress_ptr) cinfo)->marker_list = NULL;
+ } else {
+ cinfo->global_state = CSTATE_START;
+ }
+}
+
+
+/*
+ * Destruction of a JPEG object.
+ *
+ * Everything gets deallocated except the master jpeg_compress_struct itself
+ * and the error manager struct. Both of these are supplied by the application
+ * and must be freed, if necessary, by the application. (Often they are on
+ * the stack and so don't need to be freed anyway.)
+ * Closing a data source or destination, if necessary, is the application's
+ * responsibility.
+ */
+
+GLOBAL(void)
+jpeg_destroy (j_common_ptr cinfo)
+{
+ /* We need only tell the memory manager to release everything. */
+ /* NB: mem pointer is NULL if memory mgr failed to initialize. */
+ if (cinfo->mem != NULL)
+ (*cinfo->mem->self_destruct) (cinfo);
+ cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */
+ cinfo->global_state = 0; /* mark it destroyed */
+}
+
+
+/*
+ * Convenience routines for allocating quantization and Huffman tables.
+ * (Would jutils.c be a more reasonable place to put these?)
+ */
+
+GLOBAL(JQUANT_TBL *)
+jpeg_alloc_quant_table (j_common_ptr cinfo)
+{
+ JQUANT_TBL *tbl;
+
+ tbl = (JQUANT_TBL *)
+ (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
+ tbl->sent_table = FALSE; /* make sure this is false in any new table */
+ return tbl;
+}
+
+
+GLOBAL(JHUFF_TBL *)
+jpeg_alloc_huff_table (j_common_ptr cinfo)
+{
+ JHUFF_TBL *tbl;
+
+ tbl = (JHUFF_TBL *)
+ (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
+ tbl->sent_table = FALSE; /* make sure this is false in any new table */
+ return tbl;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
new file mode 100644
index 0000000000..8b1b9b9fb6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcparam.c
@@ -0,0 +1,613 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcparam.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains optional default-setting code for the JPEG compressor.
+ * Applications do not have to use this file, but those that don't use it
+ * must know a lot more about the innards of the JPEG code.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Quantization table setup routines
+ */
+
+GLOBAL(void)
+jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl,
+ const unsigned int *basic_table,
+ int scale_factor, boolean force_baseline)
+/* Define a quantization table equal to the basic_table times
+ * a scale factor (given as a percentage).
+ * If force_baseline is TRUE, the computed quantization table entries
+ * are limited to 1..255 for JPEG baseline compatibility.
+ */
+{
+ JQUANT_TBL ** qtblptr;
+ int i;
+ long temp;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS)
+ ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl);
+
+ qtblptr = & cinfo->quant_tbl_ptrs[which_tbl];
+
+ if (*qtblptr == NULL)
+ *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ temp = ((long) basic_table[i] * scale_factor + 50L) / 100L;
+ /* limit the values to the valid range */
+ if (temp <= 0L) temp = 1L;
+ if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */
+ if (force_baseline && temp > 255L)
+ temp = 255L; /* limit to baseline range if requested */
+ (*qtblptr)->quantval[i] = (UINT16) temp;
+ }
+
+ /* Initialize sent_table FALSE so table will be written to JPEG file. */
+ (*qtblptr)->sent_table = FALSE;
+}
+
+
+GLOBAL(void)
+jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor,
+ boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables
+ * and a straight percentage-scaling quality scale. In most cases it's better
+ * to use jpeg_set_quality (below); this entry point is provided for
+ * applications that insist on a linear percentage scaling.
+ */
+{
+ /* These are the sample quantization tables given in JPEG spec section K.1.
+ * The spec says that the values given produce "good" quality, and
+ * when divided by 2, "very good" quality.
+ */
+ static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = {
+ 16, 11, 10, 16, 24, 40, 51, 61,
+ 12, 12, 14, 19, 26, 58, 60, 55,
+ 14, 13, 16, 24, 40, 57, 69, 56,
+ 14, 17, 22, 29, 51, 87, 80, 62,
+ 18, 22, 37, 56, 68, 109, 103, 77,
+ 24, 35, 55, 64, 81, 104, 113, 92,
+ 49, 64, 78, 87, 103, 121, 120, 101,
+ 72, 92, 95, 98, 112, 100, 103, 99
+ };
+ static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = {
+ 17, 18, 24, 47, 99, 99, 99, 99,
+ 18, 21, 26, 66, 99, 99, 99, 99,
+ 24, 26, 56, 99, 99, 99, 99, 99,
+ 47, 66, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99
+ };
+
+ /* Set up two quantization tables using the specified scaling */
+ jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl,
+ scale_factor, force_baseline);
+ jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl,
+ scale_factor, force_baseline);
+}
+
+
+GLOBAL(int)
+jpeg_quality_scaling (int quality)
+/* Convert a user-specified quality rating to a percentage scaling factor
+ * for an underlying quantization table, using our recommended scaling curve.
+ * The input 'quality' factor should be 0 (terrible) to 100 (very good).
+ */
+{
+ /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */
+ if (quality <= 0) quality = 1;
+ if (quality > 100) quality = 100;
+
+ /* The basic table is used as-is (scaling 100) for a quality of 50.
+ * Qualities 50..100 are converted to scaling percentage 200 - 2*Q;
+ * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table
+ * to make all the table entries 1 (hence, minimum quantization loss).
+ * Qualities 1..50 are converted to scaling percentage 5000/Q.
+ */
+ if (quality < 50)
+ quality = 5000 / quality;
+ else
+ quality = 200 - quality*2;
+
+ return quality;
+}
+
+
+GLOBAL(void)
+jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
+/* Set or change the 'quality' (quantization) setting, using default tables.
+ * This is the standard quality-adjusting entry point for typical user
+ * interfaces; only those who want detailed control over quantization tables
+ * would use the preceding three routines directly.
+ */
+{
+ /* Convert user 0-100 rating to percentage scaling */
+ quality = jpeg_quality_scaling(quality);
+
+ /* Set up standard quality tables */
+ jpeg_set_linear_quality(cinfo, quality, force_baseline);
+}
+
+
+/*
+ * Huffman table setup routines
+ */
+
+LOCAL(void)
+add_huff_table (j_compress_ptr cinfo,
+ JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val)
+/* Define a Huffman table */
+{
+ int nsymbols, len;
+
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+ /* Copy the number-of-symbols-of-each-code-length counts */
+ MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+
+ /* Validate the counts. We do this here mainly so we can copy the right
+ * number of symbols from the val[] array, without risking marching off
+ * the end of memory. jchuff.c will do a more thorough test later.
+ */
+ nsymbols = 0;
+ for (len = 1; len <= 16; len++)
+ nsymbols += bits[len];
+ if (nsymbols < 1 || nsymbols > 256)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+ MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8));
+
+ /* Initialize sent_table FALSE so table will be written to JPEG file. */
+ (*htblptr)->sent_table = FALSE;
+}
+
+
+LOCAL(void)
+std_huff_tables (j_compress_ptr cinfo)
+/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
+/* IMPORTANT: these are only valid for 8-bit data precision! */
+{
+ static const UINT8 bits_dc_luminance[17] =
+ { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
+ static const UINT8 val_dc_luminance[] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+ static const UINT8 bits_dc_chrominance[17] =
+ { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
+ static const UINT8 val_dc_chrominance[] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+
+ static const UINT8 bits_ac_luminance[17] =
+ { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
+ static const UINT8 val_ac_luminance[] =
+ { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
+ 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
+ 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
+ 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
+ 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
+ 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
+ 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
+ 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
+ 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
+ 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
+ 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+ 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
+ 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
+ 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
+ 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
+ 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
+ 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa };
+
+ static const UINT8 bits_ac_chrominance[17] =
+ { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
+ static const UINT8 val_ac_chrominance[] =
+ { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
+ 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
+ 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
+ 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
+ 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
+ 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
+ 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+ 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+ 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
+ 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
+ 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
+ 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
+ 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
+ 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
+ 0xf9, 0xfa };
+
+ add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0],
+ bits_dc_luminance, val_dc_luminance);
+ add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0],
+ bits_ac_luminance, val_ac_luminance);
+ add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1],
+ bits_dc_chrominance, val_dc_chrominance);
+ add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1],
+ bits_ac_chrominance, val_ac_chrominance);
+}
+
+
+/*
+ * Default parameter setup for compression.
+ *
+ * Applications that don't choose to use this routine must do their
+ * own setup of all these parameters. Alternately, you can call this
+ * to establish defaults and then alter parameters selectively. This
+ * is the recommended approach since, if we add any new parameters,
+ * your code will still work (they'll be set to reasonable defaults).
+ */
+
+GLOBAL(void)
+jpeg_set_defaults (j_compress_ptr cinfo)
+{
+ int i;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* Allocate comp_info array large enough for maximum component count.
+ * Array is made permanent in case application wants to compress
+ * multiple images at same param settings.
+ */
+ if (cinfo->comp_info == NULL)
+ cinfo->comp_info = (jpeg_component_info *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ MAX_COMPONENTS * SIZEOF(jpeg_component_info));
+
+ /* Initialize everything not dependent on the color space */
+
+ cinfo->data_precision = BITS_IN_JSAMPLE;
+ /* Set up two quantization tables using default quality of 75 */
+ jpeg_set_quality(cinfo, 75, TRUE);
+ /* Set up two Huffman tables */
+ std_huff_tables(cinfo);
+
+ /* Initialize default arithmetic coding conditioning */
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ cinfo->arith_dc_L[i] = 0;
+ cinfo->arith_dc_U[i] = 1;
+ cinfo->arith_ac_K[i] = 5;
+ }
+
+ /* Default is no multiple-scan output */
+ cinfo->scan_info = NULL;
+ cinfo->num_scans = 0;
+
+ /* Expect normal source image, not raw downsampled data */
+ cinfo->raw_data_in = FALSE;
+
+ /* Use Huffman coding, not arithmetic coding, by default */
+ cinfo->arith_code = FALSE;
+
+ /* By default, don't do extra passes to optimize entropy coding */
+ cinfo->optimize_coding = FALSE;
+ /* The standard Huffman tables are only valid for 8-bit data precision.
+ * If the precision is higher, force optimization on so that usable
+ * tables will be computed. This test can be removed if default tables
+ * are supplied that are valid for the desired precision.
+ */
+ if (cinfo->data_precision > 8)
+ cinfo->optimize_coding = TRUE;
+
+ /* By default, use the simpler non-cosited sampling alignment */
+ cinfo->CCIR601_sampling = FALSE;
+
+ /* No input smoothing */
+ cinfo->smoothing_factor = 0;
+
+ /* DCT algorithm preference */
+ cinfo->dct_method = JDCT_DEFAULT;
+
+ /* No restart markers */
+ cinfo->restart_interval = 0;
+ cinfo->restart_in_rows = 0;
+
+ /* Fill in default JFIF marker parameters. Note that whether the marker
+ * will actually be written is determined by jpeg_set_colorspace.
+ *
+ * By default, the library emits JFIF version code 1.01.
+ * An application that wants to emit JFIF 1.02 extension markers should set
+ * JFIF_minor_version to 2. We could probably get away with just defaulting
+ * to 1.02, but there may still be some decoders in use that will complain
+ * about that; saying 1.01 should minimize compatibility problems.
+ */
+ cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
+ cinfo->JFIF_minor_version = 1;
+ cinfo->density_unit = 0; /* Pixel size is unknown by default */
+ cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
+ cinfo->Y_density = 1;
+
+ /* Choose JPEG colorspace based on input space, set defaults accordingly */
+
+ jpeg_default_colorspace(cinfo);
+}
+
+
+/*
+ * Select an appropriate JPEG colorspace for in_color_space.
+ */
+
+GLOBAL(void)
+jpeg_default_colorspace (j_compress_ptr cinfo)
+{
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
+ break;
+ case JCS_RGB:
+ jpeg_set_colorspace(cinfo, JCS_YCbCr);
+ break;
+ case JCS_YCbCr:
+ jpeg_set_colorspace(cinfo, JCS_YCbCr);
+ break;
+ case JCS_CMYK:
+ jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */
+ break;
+ case JCS_YCCK:
+ jpeg_set_colorspace(cinfo, JCS_YCCK);
+ break;
+ case JCS_UNKNOWN:
+ jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ break;
+ default:
+ ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
+ }
+}
+
+
+/*
+ * Set the JPEG colorspace, and choose colorspace-dependent default values.
+ */
+
+GLOBAL(void)
+jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
+{
+ jpeg_component_info * compptr;
+ int ci;
+
+#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \
+ (compptr = &cinfo->comp_info[index], \
+ compptr->component_id = (id), \
+ compptr->h_samp_factor = (hsamp), \
+ compptr->v_samp_factor = (vsamp), \
+ compptr->quant_tbl_no = (quant), \
+ compptr->dc_tbl_no = (dctbl), \
+ compptr->ac_tbl_no = (actbl) )
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* For all colorspaces, we use Q and Huff tables 0 for luminance components,
+ * tables 1 for chrominance components.
+ */
+
+ cinfo->jpeg_color_space = colorspace;
+
+ cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */
+ cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
+
+ switch (colorspace) {
+ case JCS_GRAYSCALE:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->num_components = 1;
+ /* JFIF specifies component ID 1 */
+ SET_COMP(0, 1, 1,1, 0, 0,0);
+ break;
+ case JCS_RGB:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
+ cinfo->num_components = 3;
+ SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
+ SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
+ break;
+ case JCS_YCbCr:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->num_components = 3;
+ /* JFIF specifies component IDs 1,2,3 */
+ /* We default to 2x2 subsamples of chrominance */
+ SET_COMP(0, 1, 2,2, 0, 0,0);
+ SET_COMP(1, 2, 1,1, 1, 1,1);
+ SET_COMP(2, 3, 1,1, 1, 1,1);
+ break;
+ case JCS_CMYK:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
+ cinfo->num_components = 4;
+ SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0);
+ SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0);
+ SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0);
+ break;
+ case JCS_YCCK:
+ cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
+ cinfo->num_components = 4;
+ SET_COMP(0, 1, 2,2, 0, 0,0);
+ SET_COMP(1, 2, 1,1, 1, 1,1);
+ SET_COMP(2, 3, 1,1, 1, 1,1);
+ SET_COMP(3, 4, 2,2, 0, 0,0);
+ break;
+ case JCS_UNKNOWN:
+ cinfo->num_components = cinfo->input_components;
+ if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ SET_COMP(ci, ci, 1,1, 0, 0,0);
+ }
+ break;
+ default:
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ }
+}
+
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+LOCAL(jpeg_scan_info *)
+fill_a_scan (jpeg_scan_info * scanptr, int ci,
+ int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for specified component */
+{
+ scanptr->comps_in_scan = 1;
+ scanptr->component_index[0] = ci;
+ scanptr->Ss = Ss;
+ scanptr->Se = Se;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_scans (jpeg_scan_info * scanptr, int ncomps,
+ int Ss, int Se, int Ah, int Al)
+/* Support routine: generate one scan for each component */
+{
+ int ci;
+
+ for (ci = 0; ci < ncomps; ci++) {
+ scanptr->comps_in_scan = 1;
+ scanptr->component_index[0] = ci;
+ scanptr->Ss = Ss;
+ scanptr->Se = Se;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ }
+ return scanptr;
+}
+
+LOCAL(jpeg_scan_info *)
+fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al)
+/* Support routine: generate interleaved DC scan if possible, else N scans */
+{
+ int ci;
+
+ if (ncomps <= MAX_COMPS_IN_SCAN) {
+ /* Single interleaved DC scan */
+ scanptr->comps_in_scan = ncomps;
+ for (ci = 0; ci < ncomps; ci++)
+ scanptr->component_index[ci] = ci;
+ scanptr->Ss = scanptr->Se = 0;
+ scanptr->Ah = Ah;
+ scanptr->Al = Al;
+ scanptr++;
+ } else {
+ /* Noninterleaved DC scan for each component */
+ scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al);
+ }
+ return scanptr;
+}
+
+
+/*
+ * Create a recommended progressive-JPEG script.
+ * cinfo->num_components and cinfo->jpeg_color_space must be correct.
+ */
+
+GLOBAL(void)
+jpeg_simple_progression (j_compress_ptr cinfo)
+{
+ int ncomps = cinfo->num_components;
+ int nscans;
+ jpeg_scan_info * scanptr;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ /* Figure space needed for script. Calculation must match code below! */
+ if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+ /* Custom script for YCbCr color images. */
+ nscans = 10;
+ } else {
+ /* All-purpose script for other color spaces. */
+ if (ncomps > MAX_COMPS_IN_SCAN)
+ nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */
+ else
+ nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */
+ }
+
+ /* Allocate space for script.
+ * We need to put it in the permanent pool in case the application performs
+ * multiple compressions without changing the settings. To avoid a memory
+ * leak if jpeg_simple_progression is called repeatedly for the same JPEG
+ * object, we try to re-use previously allocated space, and we allocate
+ * enough space to handle YCbCr even if initially asked for grayscale.
+ */
+ if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
+ cinfo->script_space_size = MAX(nscans, 10);
+ cinfo->script_space = (jpeg_scan_info *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ cinfo->script_space_size * SIZEOF(jpeg_scan_info));
+ }
+ scanptr = cinfo->script_space;
+ cinfo->scan_info = scanptr;
+ cinfo->num_scans = nscans;
+
+ if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
+ /* Custom script for YCbCr color images. */
+ /* Initial DC scan */
+ scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+ /* Initial AC scan: get some luma data out in a hurry */
+ scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2);
+ /* Chroma data is too small to be worth expending many scans on */
+ scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1);
+ scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1);
+ /* Complete spectral selection for luma AC */
+ scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2);
+ /* Refine next bit of luma AC */
+ scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1);
+ /* Finish DC successive approximation */
+ scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+ /* Finish AC successive approximation */
+ scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0);
+ scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0);
+ /* Luma bottom bit comes last since it's usually largest scan */
+ scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0);
+ } else {
+ /* All-purpose script for other color spaces. */
+ /* Successive approximation first pass */
+ scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
+ scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2);
+ scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2);
+ /* Successive approximation second pass */
+ scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1);
+ /* Successive approximation final pass */
+ scanptr = fill_dc_scans(scanptr, ncomps, 1, 0);
+ scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0);
+ }
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
new file mode 100644
index 0000000000..c2655fbb48
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c
@@ -0,0 +1,836 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy encoding routines for progressive JPEG.
+ *
+ * We do not support output suspension in this module, since the library
+ * currently does not allow multiple-scan files to be written with output
+ * suspension.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jchuff.h" /* Declarations shared with jchuff.c */
+
+#ifdef C_PROGRESSIVE_SUPPORTED
+
+/* Expanded entropy encoder object for progressive Huffman encoding. */
+
+typedef struct {
+ struct jpeg_entropy_encoder pub; /* public fields */
+
+ /* Mode flag: TRUE for optimization, FALSE for actual data output */
+ boolean gather_statistics;
+
+ /* Bit-level coding status.
+ * next_output_byte/free_in_buffer are local copies of cinfo->dest fields.
+ */
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+ INT32 put_buffer; /* current bit-accumulation buffer */
+ int put_bits; /* # of bits now in it */
+ j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */
+
+ /* Coding status for DC components */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+
+ /* Coding status for AC components */
+ int ac_tbl_no; /* the table number of the single component */
+ unsigned int EOBRUN; /* run length of EOBs */
+ unsigned int BE; /* # of buffered correction bits before MCU */
+ char * bit_buffer; /* buffer for correction bits (1 per char) */
+ /* packing correction bits tightly would save some space but cost time... */
+
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+ int next_restart_num; /* next restart number to write (0-7) */
+
+ /* Pointers to derived tables (these workspaces have image lifespan).
+ * Since any one scan codes only DC or only AC, we only need one set
+ * of tables, not one for DC and one for AC.
+ */
+ c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+ /* Statistics tables for optimization; again, one set is enough */
+ long * count_ptrs[NUM_HUFF_TBLS];
+} phuff_entropy_encoder;
+
+typedef phuff_entropy_encoder * phuff_entropy_ptr;
+
+/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit
+ * buffer can hold. Larger sizes may slightly improve compression, but
+ * 1000 is already well into the realm of overkill.
+ * The minimum safe size is 64 bits.
+ */
+
+#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */
+
+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
+ * We assume that int right shift is unsigned if INT32 right shift is,
+ * which should be safe.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS int ishift_temp;
+#define IRIGHT_SHIFT(x,shft) \
+ ((ishift_temp = (x)) < 0 ? \
+ (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
+ (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+/* Forward declarations */
+METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo));
+METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo));
+
+
+/*
+ * Initialize for a Huffman-compressed scan using progressive JPEG.
+ */
+
+METHODDEF(void)
+start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band;
+ int ci, tbl;
+ jpeg_component_info * compptr;
+
+ entropy->cinfo = cinfo;
+ entropy->gather_statistics = gather_statistics;
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* We assume jcmaster.c already validated the scan parameters. */
+
+ /* Select execution routines */
+ if (cinfo->Ah == 0) {
+ if (is_DC_band)
+ entropy->pub.encode_mcu = encode_mcu_DC_first;
+ else
+ entropy->pub.encode_mcu = encode_mcu_AC_first;
+ } else {
+ if (is_DC_band)
+ entropy->pub.encode_mcu = encode_mcu_DC_refine;
+ else {
+ entropy->pub.encode_mcu = encode_mcu_AC_refine;
+ /* AC refinement needs a correction bit buffer */
+ if (entropy->bit_buffer == NULL)
+ entropy->bit_buffer = (char *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ MAX_CORR_BITS * SIZEOF(char));
+ }
+ }
+ if (gather_statistics)
+ entropy->pub.finish_pass = finish_pass_gather_phuff;
+ else
+ entropy->pub.finish_pass = finish_pass_phuff;
+
+ /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
+ * for AC coefficients.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Initialize DC predictions to 0 */
+ entropy->last_dc_val[ci] = 0;
+ /* Get table index */
+ if (is_DC_band) {
+ if (cinfo->Ah != 0) /* DC refinement needs no table */
+ continue;
+ tbl = compptr->dc_tbl_no;
+ } else {
+ entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
+ }
+ if (gather_statistics) {
+ /* Check for invalid table index */
+ /* (make_c_derived_tbl does this in the other path) */
+ if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
+ /* Allocate and zero the statistics tables */
+ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
+ if (entropy->count_ptrs[tbl] == NULL)
+ entropy->count_ptrs[tbl] = (long *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 257 * SIZEOF(long));
+ MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
+ } else {
+ /* Compute derived values for Huffman table */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl,
+ & entropy->derived_tbls[tbl]);
+ }
+ }
+
+ /* Initialize AC stuff */
+ entropy->EOBRUN = 0;
+ entropy->BE = 0;
+
+ /* Initialize bit buffer to empty */
+ entropy->put_buffer = 0;
+ entropy->put_bits = 0;
+
+ /* Initialize restart stuff */
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num = 0;
+}
+
+
+/* Outputting bytes to the file.
+ * NB: these must be called only when actually outputting,
+ * that is, entropy->gather_statistics == FALSE.
+ */
+
+/* Emit a byte */
+#define emit_byte(entropy,val) \
+ { *(entropy)->next_output_byte++ = (JOCTET) (val); \
+ if (--(entropy)->free_in_buffer == 0) \
+ dump_buffer(entropy); }
+
+
+LOCAL(void)
+dump_buffer (phuff_entropy_ptr entropy)
+/* Empty the output buffer; we do not support suspension in this module. */
+{
+ struct jpeg_destination_mgr * dest = entropy->cinfo->dest;
+
+ if (! (*dest->empty_output_buffer) (entropy->cinfo))
+ ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND);
+ /* After a successful buffer dump, must reset buffer pointers */
+ entropy->next_output_byte = dest->next_output_byte;
+ entropy->free_in_buffer = dest->free_in_buffer;
+}
+
+
+/* Outputting bits to the file */
+
+/* Only the right 24 bits of put_buffer are used; the valid bits are
+ * left-justified in this part. At most 16 bits can be passed to emit_bits
+ * in one call, and we never retain more than 7 bits in put_buffer
+ * between calls, so 24 bits are sufficient.
+ */
+
+INLINE
+LOCAL(void)
+emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size)
+/* Emit some bits, unless we are in gather mode */
+{
+ /* This routine is heavily used, so it's worth coding tightly. */
+ register INT32 put_buffer = (INT32) code;
+ register int put_bits = entropy->put_bits;
+
+ /* if size is 0, caller used an invalid Huffman table entry */
+ if (size == 0)
+ ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+ if (entropy->gather_statistics)
+ return; /* do nothing if we're only getting stats */
+
+ put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
+
+ put_bits += size; /* new number of bits in buffer */
+
+ put_buffer <<= 24 - put_bits; /* align incoming bits */
+
+ put_buffer |= entropy->put_buffer; /* and merge with old buffer contents */
+
+ while (put_bits >= 8) {
+ int c = (int) ((put_buffer >> 16) & 0xFF);
+
+ emit_byte(entropy, c);
+ if (c == 0xFF) { /* need to stuff a zero byte? */
+ emit_byte(entropy, 0);
+ }
+ put_buffer <<= 8;
+ put_bits -= 8;
+ }
+
+ entropy->put_buffer = put_buffer; /* update variables */
+ entropy->put_bits = put_bits;
+}
+
+
+LOCAL(void)
+flush_bits (phuff_entropy_ptr entropy)
+{
+ emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */
+ entropy->put_buffer = 0; /* and reset bit-buffer to empty */
+ entropy->put_bits = 0;
+}
+
+
+/*
+ * Emit (or just count) a Huffman symbol.
+ */
+
+INLINE
+LOCAL(void)
+emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol)
+{
+ if (entropy->gather_statistics)
+ entropy->count_ptrs[tbl_no][symbol]++;
+ else {
+ c_derived_tbl * tbl = entropy->derived_tbls[tbl_no];
+ emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
+ }
+}
+
+
+/*
+ * Emit bits from a correction bit buffer.
+ */
+
+LOCAL(void)
+emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart,
+ unsigned int nbits)
+{
+ if (entropy->gather_statistics)
+ return; /* no real work */
+
+ while (nbits > 0) {
+ emit_bits(entropy, (unsigned int) (*bufstart), 1);
+ bufstart++;
+ nbits--;
+ }
+}
+
+
+/*
+ * Emit any pending EOBRUN symbol.
+ */
+
+LOCAL(void)
+emit_eobrun (phuff_entropy_ptr entropy)
+{
+ register int temp, nbits;
+
+ if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */
+ temp = entropy->EOBRUN;
+ nbits = 0;
+ while ((temp >>= 1))
+ nbits++;
+ /* safety check: shouldn't happen given limited correction-bit buffer */
+ if (nbits > 14)
+ ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
+
+ emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
+ if (nbits)
+ emit_bits(entropy, entropy->EOBRUN, nbits);
+
+ entropy->EOBRUN = 0;
+
+ /* Emit any buffered correction bits */
+ emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE);
+ entropy->BE = 0;
+ }
+}
+
+
+/*
+ * Emit a restart marker & resynchronize predictions.
+ */
+
+LOCAL(void)
+emit_restart (phuff_entropy_ptr entropy, int restart_num)
+{
+ int ci;
+
+ emit_eobrun(entropy);
+
+ if (! entropy->gather_statistics) {
+ flush_bits(entropy);
+ emit_byte(entropy, 0xFF);
+ emit_byte(entropy, JPEG_RST0 + restart_num);
+ }
+
+ if (entropy->cinfo->Ss == 0) {
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++)
+ entropy->last_dc_val[ci] = 0;
+ } else {
+ /* Re-initialize all AC-related fields to 0 */
+ entropy->EOBRUN = 0;
+ entropy->BE = 0;
+ }
+}
+
+
+/*
+ * MCU encoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp, temp2;
+ register int nbits;
+ int blkn, ci;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+ jpeg_component_info * compptr;
+ ISHIFT_TEMPS
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+
+ /* Compute the DC value after the required point transform by Al.
+ * This is simply an arithmetic right shift.
+ */
+ temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
+
+ /* DC differences are figured on the point-transformed values. */
+ temp = temp2 - entropy->last_dc_val[ci];
+ entropy->last_dc_val[ci] = temp2;
+
+ /* Encode the DC coefficient difference per section G.1.2.1 */
+ temp2 = temp;
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ /* For a negative input, want temp2 = bitwise complement of abs(input) */
+ /* This code assumes we are on a two's complement machine */
+ temp2--;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 0;
+ while (temp) {
+ nbits++;
+ temp >>= 1;
+ }
+ /* Check for out-of-range coefficient values.
+ * Since we're encoding a difference, the range limit is twice as much.
+ */
+ if (nbits > MAX_COEF_BITS+1)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count/emit the Huffman-coded symbol for the number of bits */
+ emit_symbol(entropy, compptr->dc_tbl_no, nbits);
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ if (nbits) /* emit_bits rejects calls with size 0 */
+ emit_bits(entropy, (unsigned int) temp2, nbits);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp, temp2;
+ register int nbits;
+ register int r, k;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data block */
+ block = MCU_data[0];
+
+ /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */
+
+ r = 0; /* r = run length of zeros */
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ if ((temp = (*block)[jpeg_natural_order[k]]) == 0) {
+ r++;
+ continue;
+ }
+ /* We must apply the point transform by Al. For AC coefficients this
+ * is an integer division with rounding towards 0. To do this portably
+ * in C, we shift after obtaining the absolute value; so the code is
+ * interwoven with finding the abs value (temp) and output bits (temp2).
+ */
+ if (temp < 0) {
+ temp = -temp; /* temp is abs value of input */
+ temp >>= Al; /* apply the point transform */
+ /* For a negative coef, want temp2 = bitwise complement of abs(coef) */
+ temp2 = ~temp;
+ } else {
+ temp >>= Al; /* apply the point transform */
+ temp2 = temp;
+ }
+ /* Watch out for case that nonzero coef is zero after point transform */
+ if (temp == 0) {
+ r++;
+ continue;
+ }
+
+ /* Emit any pending EOBRUN */
+ if (entropy->EOBRUN > 0)
+ emit_eobrun(entropy);
+ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
+ while (r > 15) {
+ emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+ r -= 16;
+ }
+
+ /* Find the number of bits needed for the magnitude of the coefficient */
+ nbits = 1; /* there must be at least one 1 bit */
+ while ((temp >>= 1))
+ nbits++;
+ /* Check for out-of-range coefficient values */
+ if (nbits > MAX_COEF_BITS)
+ ERREXIT(cinfo, JERR_BAD_DCT_COEF);
+
+ /* Count/emit Huffman symbol for run length / number of bits */
+ emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
+
+ /* Emit that number of bits of the value, if positive, */
+ /* or the complement of its magnitude, if negative. */
+ emit_bits(entropy, (unsigned int) temp2, nbits);
+
+ r = 0; /* reset zero run length */
+ }
+
+ if (r > 0) { /* If there are trailing zeroes, */
+ entropy->EOBRUN++; /* count an EOB */
+ if (entropy->EOBRUN == 0x7FFF)
+ emit_eobrun(entropy); /* force it out to avoid overflow */
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp;
+ int blkn;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data blocks */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+
+ /* We simply emit the Al'th bit of the DC coefficient value. */
+ temp = (*block)[0];
+ emit_bits(entropy, (unsigned int) (temp >> Al), 1);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * MCU encoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ register int temp;
+ register int r, k;
+ int EOB;
+ char *BR_buffer;
+ unsigned int BR;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ JBLOCKROW block;
+ int absvalues[DCTSIZE2];
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Emit restart marker if needed */
+ if (cinfo->restart_interval)
+ if (entropy->restarts_to_go == 0)
+ emit_restart(entropy, entropy->next_restart_num);
+
+ /* Encode the MCU data block */
+ block = MCU_data[0];
+
+ /* It is convenient to make a pre-pass to determine the transformed
+ * coefficients' absolute values and the EOB position.
+ */
+ EOB = 0;
+ for (k = cinfo->Ss; k <= Se; k++) {
+ temp = (*block)[jpeg_natural_order[k]];
+ /* We must apply the point transform by Al. For AC coefficients this
+ * is an integer division with rounding towards 0. To do this portably
+ * in C, we shift after obtaining the absolute value.
+ */
+ if (temp < 0)
+ temp = -temp; /* temp is abs value of input */
+ temp >>= Al; /* apply the point transform */
+ absvalues[k] = temp; /* save abs value for main pass */
+ if (temp == 1)
+ EOB = k; /* EOB = index of last newly-nonzero coef */
+ }
+
+ /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */
+
+ r = 0; /* r = run length of zeros */
+ BR = 0; /* BR = count of buffered bits added now */
+ BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ if ((temp = absvalues[k]) == 0) {
+ r++;
+ continue;
+ }
+
+ /* Emit any required ZRLs, but not if they can be folded into EOB */
+ while (r > 15 && k <= EOB) {
+ /* emit any pending EOBRUN and the BE correction bits */
+ emit_eobrun(entropy);
+ /* Emit ZRL */
+ emit_symbol(entropy, entropy->ac_tbl_no, 0xF0);
+ r -= 16;
+ /* Emit buffered correction bits that must be associated with ZRL */
+ emit_buffered_bits(entropy, BR_buffer, BR);
+ BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+ BR = 0;
+ }
+
+ /* If the coef was previously nonzero, it only needs a correction bit.
+ * NOTE: a straight translation of the spec's figure G.7 would suggest
+ * that we also need to test r > 15. But if r > 15, we can only get here
+ * if k > EOB, which implies that this coefficient is not 1.
+ */
+ if (temp > 1) {
+ /* The correction bit is the next bit of the absolute value. */
+ BR_buffer[BR++] = (char) (temp & 1);
+ continue;
+ }
+
+ /* Emit any pending EOBRUN and the BE correction bits */
+ emit_eobrun(entropy);
+
+ /* Count/emit Huffman symbol for run length / number of bits */
+ emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
+
+ /* Emit output bit for newly-nonzero coef */
+ temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1;
+ emit_bits(entropy, (unsigned int) temp, 1);
+
+ /* Emit buffered correction bits that must be associated with this code */
+ emit_buffered_bits(entropy, BR_buffer, BR);
+ BR_buffer = entropy->bit_buffer; /* BE bits are gone now */
+ BR = 0;
+ r = 0; /* reset zero run length */
+ }
+
+ if (r > 0 || BR > 0) { /* If there are trailing zeroes, */
+ entropy->EOBRUN++; /* count an EOB */
+ entropy->BE += BR; /* concat my correction bits to older ones */
+ /* We force out the EOB if we risk either:
+ * 1. overflow of the EOB counter;
+ * 2. overflow of the correction bit buffer during the next MCU.
+ */
+ if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1))
+ emit_eobrun(entropy);
+ }
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+
+ /* Update restart-interval state too */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0) {
+ entropy->restarts_to_go = cinfo->restart_interval;
+ entropy->next_restart_num++;
+ entropy->next_restart_num &= 7;
+ }
+ entropy->restarts_to_go--;
+ }
+
+ return TRUE;
+}
+
+
+/*
+ * Finish up at the end of a Huffman-compressed progressive scan.
+ */
+
+METHODDEF(void)
+finish_pass_phuff (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+
+ entropy->next_output_byte = cinfo->dest->next_output_byte;
+ entropy->free_in_buffer = cinfo->dest->free_in_buffer;
+
+ /* Flush out any buffered data */
+ emit_eobrun(entropy);
+ flush_bits(entropy);
+
+ cinfo->dest->next_output_byte = entropy->next_output_byte;
+ cinfo->dest->free_in_buffer = entropy->free_in_buffer;
+}
+
+
+/*
+ * Finish up a statistics-gathering pass and create the new Huffman tables.
+ */
+
+METHODDEF(void)
+finish_pass_gather_phuff (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band;
+ int ci, tbl;
+ jpeg_component_info * compptr;
+ JHUFF_TBL **htblptr;
+ boolean did[NUM_HUFF_TBLS];
+
+ /* Flush out buffered data (all we care about is counting the EOB symbol) */
+ emit_eobrun(entropy);
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* It's important not to apply jpeg_gen_optimal_table more than once
+ * per table, because it clobbers the input frequency counts!
+ */
+ MEMZERO(did, SIZEOF(did));
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ if (is_DC_band) {
+ if (cinfo->Ah != 0) /* DC refinement needs no table */
+ continue;
+ tbl = compptr->dc_tbl_no;
+ } else {
+ tbl = compptr->ac_tbl_no;
+ }
+ if (! did[tbl]) {
+ if (is_DC_band)
+ htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
+ else
+ htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+ jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
+ did[tbl] = TRUE;
+ }
+ }
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy encoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_encoder (j_compress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy;
+ int i;
+
+ entropy = (phuff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(phuff_entropy_encoder));
+ cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ entropy->pub.start_pass = start_pass_phuff;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->derived_tbls[i] = NULL;
+ entropy->count_ptrs[i] = NULL;
+ }
+ entropy->bit_buffer = NULL; /* needed only in AC refinement scan */
+}
+
+#endif /* C_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
new file mode 100644
index 0000000000..539d87bbae
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c
@@ -0,0 +1,357 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcprepct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the compression preprocessing controller.
+ * This controller manages the color conversion, downsampling,
+ * and edge expansion steps.
+ *
+ * Most of the complexity here is associated with buffering input rows
+ * as required by the downsampler. See the comments at the head of
+ * jcsample.c for the downsampler's needs.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* At present, jcsample.c can request context rows only for smoothing.
+ * In the future, we might also need context rows for CCIR601 sampling
+ * or other more-complex downsampling procedures. The code to support
+ * context rows should be compiled only if needed.
+ */
+#ifdef INPUT_SMOOTHING_SUPPORTED
+#define CONTEXT_ROWS_SUPPORTED
+#endif
+
+
+/*
+ * For the simple (no-context-row) case, we just need to buffer one
+ * row group's worth of pixels for the downsampling step. At the bottom of
+ * the image, we pad to a full row group by replicating the last pixel row.
+ * The downsampler's last output row is then replicated if needed to pad
+ * out to a full iMCU row.
+ *
+ * When providing context rows, we must buffer three row groups' worth of
+ * pixels. Three row groups are physically allocated, but the row pointer
+ * arrays are made five row groups high, with the extra pointers above and
+ * below "wrapping around" to point to the last and first real row groups.
+ * This allows the downsampler to access the proper context rows.
+ * At the top and bottom of the image, we create dummy context rows by
+ * copying the first or last real pixel row. This copying could be avoided
+ * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the
+ * trouble on the compression side.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_prep_controller pub; /* public fields */
+
+ /* Downsampling input buffer. This buffer holds color-converted data
+ * until we have enough to do a downsample step.
+ */
+ JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+ JDIMENSION rows_to_go; /* counts rows remaining in source image */
+ int next_buf_row; /* index of next row to store in color_buf */
+
+#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */
+ int this_row_group; /* starting row index of group to process */
+ int next_buf_stop; /* downsample when we reach this index */
+#endif
+} my_prep_controller;
+
+typedef my_prep_controller * my_prep_ptr;
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+
+ if (pass_mode != JBUF_PASS_THRU)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ /* Initialize total-height counter for detecting bottom of image */
+ prep->rows_to_go = cinfo->image_height;
+ /* Mark the conversion buffer empty */
+ prep->next_buf_row = 0;
+#ifdef CONTEXT_ROWS_SUPPORTED
+ /* Preset additional state variables for context mode.
+ * These aren't used in non-context mode, so we needn't test which mode.
+ */
+ prep->this_row_group = 0;
+ /* Set next_buf_stop to stop after two row groups have been read in. */
+ prep->next_buf_stop = 2 * cinfo->max_v_samp_factor;
+#endif
+}
+
+
+/*
+ * Expand an image vertically from height input_rows to height output_rows,
+ * by duplicating the bottom row.
+ */
+
+LOCAL(void)
+expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols,
+ int input_rows, int output_rows)
+{
+ register int row;
+
+ for (row = input_rows; row < output_rows; row++) {
+ jcopy_sample_rows(image_data, input_rows-1, image_data, row,
+ 1, num_cols);
+ }
+}
+
+
+/*
+ * Process some data in the simple no-context case.
+ *
+ * Preprocessor output data is counted in "row groups". A row group
+ * is defined to be v_samp_factor sample rows of each component.
+ * Downsampling will produce this much data from each max_v_samp_factor
+ * input rows.
+ */
+
+METHODDEF(void)
+pre_process_data (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int numrows, ci;
+ JDIMENSION inrows;
+ jpeg_component_info * compptr;
+
+ while (*in_row_ctr < in_rows_avail &&
+ *out_row_group_ctr < out_row_groups_avail) {
+ /* Do color conversion to fill the conversion buffer. */
+ inrows = in_rows_avail - *in_row_ctr;
+ numrows = cinfo->max_v_samp_factor - prep->next_buf_row;
+ numrows = (int) MIN((JDIMENSION) numrows, inrows);
+ (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+ prep->color_buf,
+ (JDIMENSION) prep->next_buf_row,
+ numrows);
+ *in_row_ctr += numrows;
+ prep->next_buf_row += numrows;
+ prep->rows_to_go -= numrows;
+ /* If at bottom of image, pad to fill the conversion buffer. */
+ if (prep->rows_to_go == 0 &&
+ prep->next_buf_row < cinfo->max_v_samp_factor) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+ prep->next_buf_row, cinfo->max_v_samp_factor);
+ }
+ prep->next_buf_row = cinfo->max_v_samp_factor;
+ }
+ /* If we've filled the conversion buffer, empty it. */
+ if (prep->next_buf_row == cinfo->max_v_samp_factor) {
+ (*cinfo->downsample->downsample) (cinfo,
+ prep->color_buf, (JDIMENSION) 0,
+ output_buf, *out_row_group_ctr);
+ prep->next_buf_row = 0;
+ (*out_row_group_ctr)++;
+ }
+ /* If at bottom of image, pad the output to a full iMCU height.
+ * Note we assume the caller is providing a one-iMCU-height output buffer!
+ */
+ if (prep->rows_to_go == 0 &&
+ *out_row_group_ctr < out_row_groups_avail) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ expand_bottom_edge(output_buf[ci],
+ compptr->width_in_blocks * DCTSIZE,
+ (int) (*out_row_group_ctr * compptr->v_samp_factor),
+ (int) (out_row_groups_avail * compptr->v_samp_factor));
+ }
+ *out_row_group_ctr = out_row_groups_avail;
+ break; /* can exit outer loop without test */
+ }
+ }
+}
+
+
+#ifdef CONTEXT_ROWS_SUPPORTED
+
+/*
+ * Process some data in the context case.
+ */
+
+METHODDEF(void)
+pre_process_context (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int numrows, ci;
+ int buf_height = cinfo->max_v_samp_factor * 3;
+ JDIMENSION inrows;
+
+ while (*out_row_group_ctr < out_row_groups_avail) {
+ if (*in_row_ctr < in_rows_avail) {
+ /* Do color conversion to fill the conversion buffer. */
+ inrows = in_rows_avail - *in_row_ctr;
+ numrows = prep->next_buf_stop - prep->next_buf_row;
+ numrows = (int) MIN((JDIMENSION) numrows, inrows);
+ (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr,
+ prep->color_buf,
+ (JDIMENSION) prep->next_buf_row,
+ numrows);
+ /* Pad at top of image, if first time through */
+ if (prep->rows_to_go == cinfo->image_height) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ int row;
+ for (row = 1; row <= cinfo->max_v_samp_factor; row++) {
+ jcopy_sample_rows(prep->color_buf[ci], 0,
+ prep->color_buf[ci], -row,
+ 1, cinfo->image_width);
+ }
+ }
+ }
+ *in_row_ctr += numrows;
+ prep->next_buf_row += numrows;
+ prep->rows_to_go -= numrows;
+ } else {
+ /* Return for more data, unless we are at the bottom of the image. */
+ if (prep->rows_to_go != 0)
+ break;
+ /* When at bottom of image, pad to fill the conversion buffer. */
+ if (prep->next_buf_row < prep->next_buf_stop) {
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ expand_bottom_edge(prep->color_buf[ci], cinfo->image_width,
+ prep->next_buf_row, prep->next_buf_stop);
+ }
+ prep->next_buf_row = prep->next_buf_stop;
+ }
+ }
+ /* If we've gotten enough data, downsample a row group. */
+ if (prep->next_buf_row == prep->next_buf_stop) {
+ (*cinfo->downsample->downsample) (cinfo,
+ prep->color_buf,
+ (JDIMENSION) prep->this_row_group,
+ output_buf, *out_row_group_ctr);
+ (*out_row_group_ctr)++;
+ /* Advance pointers with wraparound as necessary. */
+ prep->this_row_group += cinfo->max_v_samp_factor;
+ if (prep->this_row_group >= buf_height)
+ prep->this_row_group = 0;
+ if (prep->next_buf_row >= buf_height)
+ prep->next_buf_row = 0;
+ prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor;
+ }
+ }
+}
+
+
+/*
+ * Create the wrapped-around downsampling input buffer needed for context mode.
+ */
+
+LOCAL(void)
+create_context_buffer (j_compress_ptr cinfo)
+{
+ my_prep_ptr prep = (my_prep_ptr) cinfo->prep;
+ int rgroup_height = cinfo->max_v_samp_factor;
+ int ci, i;
+ jpeg_component_info * compptr;
+ JSAMPARRAY true_buffer, fake_buffer;
+
+ /* Grab enough space for fake row pointers for all the components;
+ * we need five row groups' worth of pointers for each component.
+ */
+ fake_buffer = (JSAMPARRAY)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (cinfo->num_components * 5 * rgroup_height) *
+ SIZEOF(JSAMPROW));
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate the actual buffer space (3 row groups) for this component.
+ * We make the buffer wide enough to allow the downsampler to edge-expand
+ * horizontally within the buffer, if it so chooses.
+ */
+ true_buffer = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+ cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+ (JDIMENSION) (3 * rgroup_height));
+ /* Copy true buffer row pointers into the middle of the fake row array */
+ MEMCOPY(fake_buffer + rgroup_height, true_buffer,
+ 3 * rgroup_height * SIZEOF(JSAMPROW));
+ /* Fill in the above and below wraparound pointers */
+ for (i = 0; i < rgroup_height; i++) {
+ fake_buffer[i] = true_buffer[2 * rgroup_height + i];
+ fake_buffer[4 * rgroup_height + i] = true_buffer[i];
+ }
+ prep->color_buf[ci] = fake_buffer + rgroup_height;
+ fake_buffer += 5 * rgroup_height; /* point to space for next component */
+ }
+}
+
+#endif /* CONTEXT_ROWS_SUPPORTED */
+
+
+/*
+ * Initialize preprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer)
+{
+ my_prep_ptr prep;
+ int ci;
+ jpeg_component_info * compptr;
+
+ if (need_full_buffer) /* safety check */
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ prep = (my_prep_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_prep_controller));
+ cinfo->prep = (struct jpeg_c_prep_controller *) prep;
+ prep->pub.start_pass = start_pass_prep;
+
+ /* Allocate the color conversion buffer.
+ * We make the buffer wide enough to allow the downsampler to edge-expand
+ * horizontally within the buffer, if it so chooses.
+ */
+ if (cinfo->downsample->need_context_rows) {
+ /* Set up to provide context rows */
+#ifdef CONTEXT_ROWS_SUPPORTED
+ prep->pub.pre_process_data = pre_process_context;
+ create_context_buffer(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ /* No context, just make it tall enough for one row group */
+ prep->pub.pre_process_data = pre_process_data;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ prep->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE *
+ cinfo->max_h_samp_factor) / compptr->h_samp_factor),
+ (JDIMENSION) cinfo->max_v_samp_factor);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
new file mode 100644
index 0000000000..7256bd7356
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jcsample.c
@@ -0,0 +1,522 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jcsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains downsampling routines.
+ *
+ * Downsampling input data is counted in "row groups". A row group
+ * is defined to be max_v_samp_factor pixel rows of each component,
+ * from which the downsampler produces v_samp_factor sample rows.
+ * A single row group is processed in each call to the downsampler module.
+ *
+ * The downsampler is responsible for edge-expansion of its output data
+ * to fill an integral number of DCT blocks horizontally. The source buffer
+ * may be modified if it is helpful for this purpose (the source buffer is
+ * allocated wide enough to correspond to the desired output width).
+ * The caller (the prep controller) is responsible for vertical padding.
+ *
+ * The downsampler may request "context rows" by setting need_context_rows
+ * during startup. In this case, the input arrays will contain at least
+ * one row group's worth of pixels above and below the passed-in data;
+ * the caller will create dummy rows at image top and bottom by replicating
+ * the first or last real pixel row.
+ *
+ * An excellent reference for image resampling is
+ * Digital Image Warping, George Wolberg, 1990.
+ * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ *
+ * The downsampling algorithm used here is a simple average of the source
+ * pixels covered by the output pixel. The hi-falutin sampling literature
+ * refers to this as a "box filter". In general the characteristics of a box
+ * filter are not very good, but for the specific cases we normally use (1:1
+ * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not
+ * nearly so bad. If you intend to use other sampling ratios, you'd be well
+ * advised to improve this code.
+ *
+ * A simple input-smoothing capability is provided. This is mainly intended
+ * for cleaning up color-dithered GIF input files (if you find it inadequate,
+ * we suggest using an external filtering program such as pnmconvol). When
+ * enabled, each input pixel P is replaced by a weighted sum of itself and its
+ * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF,
+ * where SF = (smoothing_factor / 1024).
+ * Currently, smoothing is only supported for 2h2v sampling factors.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to downsample a single component */
+typedef JMETHOD(void, downsample1_ptr,
+ (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data));
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_downsampler pub; /* public fields */
+
+ /* Downsampling method pointers, one per component */
+ downsample1_ptr methods[MAX_COMPONENTS];
+} my_downsampler;
+
+typedef my_downsampler * my_downsample_ptr;
+
+
+/*
+ * Initialize for a downsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_downsample (j_compress_ptr cinfo)
+{
+ /* no work for now */
+}
+
+
+/*
+ * Expand a component horizontally from width input_cols to width output_cols,
+ * by duplicating the rightmost samples.
+ */
+
+LOCAL(void)
+expand_right_edge (JSAMPARRAY image_data, int num_rows,
+ JDIMENSION input_cols, JDIMENSION output_cols)
+{
+ register JSAMPROW ptr;
+ register JSAMPLE pixval;
+ register int count;
+ int row;
+ int numcols = (int) (output_cols - input_cols);
+
+ if (numcols > 0) {
+ for (row = 0; row < num_rows; row++) {
+ ptr = image_data[row] + input_cols;
+ pixval = ptr[-1]; /* don't need GETJSAMPLE() here */
+ for (count = numcols; count > 0; count--)
+ *ptr++ = pixval;
+ }
+ }
+}
+
+
+/*
+ * Do downsampling for a whole row group (all components).
+ *
+ * In this version we simply downsample each component independently.
+ */
+
+METHODDEF(void)
+sep_downsample (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf, JDIMENSION out_row_group_index)
+{
+ my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample;
+ int ci;
+ jpeg_component_info * compptr;
+ JSAMPARRAY in_ptr, out_ptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ in_ptr = input_buf[ci] + in_row_index;
+ out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor);
+ (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr);
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * One row group is processed per call.
+ * This version handles arbitrary integral sampling ratios, without smoothing.
+ * Note that this version is not actually used for customary sampling ratios.
+ */
+
+METHODDEF(void)
+int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v;
+ JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ JSAMPROW inptr, outptr;
+ INT32 outvalue;
+
+ h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor;
+ v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor;
+ numpix = h_expand * v_expand;
+ numpix2 = numpix/2;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * h_expand);
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ for (outcol = 0, outcol_h = 0; outcol < output_cols;
+ outcol++, outcol_h += h_expand) {
+ outvalue = 0;
+ for (v = 0; v < v_expand; v++) {
+ inptr = input_data[inrow+v] + outcol_h;
+ for (h = 0; h < h_expand; h++) {
+ outvalue += (INT32) GETJSAMPLE(*inptr++);
+ }
+ }
+ *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix);
+ }
+ inrow += v_expand;
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ /* Copy the data */
+ jcopy_sample_rows(input_data, 0, output_data, 0,
+ cinfo->max_v_samp_factor, cinfo->image_width);
+ /* Edge-expand */
+ expand_right_edge(output_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, compptr->width_in_blocks * DCTSIZE);
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the common case of 2:1 horizontal and 1:1 vertical,
+ * without smoothing.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int outrow;
+ JDIMENSION outcol;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr, outptr;
+ register int bias;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * 2);
+
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr = input_data[outrow];
+ bias = 0; /* bias = 0,1,0,1,... for successive samples */
+ for (outcol = 0; outcol < output_cols; outcol++) {
+ *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1])
+ + bias) >> 1);
+ bias ^= 1; /* 0=>1, 1=>0 */
+ inptr += 2;
+ }
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * without smoothing.
+ */
+
+METHODDEF(void)
+h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow;
+ JDIMENSION outcol;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr0, inptr1, outptr;
+ register int bias;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data, cinfo->max_v_samp_factor,
+ cinfo->image_width, output_cols * 2);
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr0 = input_data[inrow];
+ inptr1 = input_data[inrow+1];
+ bias = 1; /* bias = 1,2,1,2,... for successive samples */
+ for (outcol = 0; outcol < output_cols; outcol++) {
+ *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1])
+ + bias) >> 2);
+ bias ^= 3; /* 1=>2, 2=>1 */
+ inptr0 += 2; inptr1 += 2;
+ }
+ inrow += 2;
+ }
+}
+
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the standard case of 2:1 horizontal and 2:1 vertical,
+ * with smoothing. One row of context is required.
+ */
+
+METHODDEF(void)
+h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int inrow, outrow;
+ JDIMENSION colctr;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr;
+ INT32 membersum, neighsum, memberscale, neighscale;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+ cinfo->image_width, output_cols * 2);
+
+ /* We don't bother to form the individual "smoothed" input pixel values;
+ * we can directly compute the output which is the average of the four
+ * smoothed values. Each of the four member pixels contributes a fraction
+ * (1-8*SF) to its own smoothed image and a fraction SF to each of the three
+ * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final
+ * output. The four corner-adjacent neighbor pixels contribute a fraction
+ * SF to just one smoothed pixel, or SF/4 to the final output; while the
+ * eight edge-adjacent neighbors contribute SF to each of two smoothed
+ * pixels, or SF/2 overall. In order to use integer arithmetic, these
+ * factors are scaled by 2^16 = 65536.
+ * Also recall that SF = smoothing_factor / 1024.
+ */
+
+ memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */
+ neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */
+
+ inrow = 0;
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr0 = input_data[inrow];
+ inptr1 = input_data[inrow+1];
+ above_ptr = input_data[inrow-1];
+ below_ptr = input_data[inrow+2];
+
+ /* Special case for first column: pretend column -1 is same as column 0 */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]);
+ neighsum += neighsum;
+ neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]);
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+
+ for (colctr = output_cols - 2; colctr > 0; colctr--) {
+ /* sum of pixels directly mapped to this output element */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ /* sum of edge-neighbor pixels */
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) +
+ GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]);
+ /* The edge-neighbors count twice as much as corner-neighbors */
+ neighsum += neighsum;
+ /* Add in the corner-neighbors */
+ neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) +
+ GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]);
+ /* form final output scaled up by 2^16 */
+ membersum = membersum * memberscale + neighsum * neighscale;
+ /* round, descale and output it */
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2;
+ }
+
+ /* Special case for last column */
+ membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]);
+ neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) +
+ GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) +
+ GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]);
+ neighsum += neighsum;
+ neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) +
+ GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]);
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+ inrow += 2;
+ }
+}
+
+
+/*
+ * Downsample pixel values of a single component.
+ * This version handles the special case of a full-size component,
+ * with smoothing. One row of context is required.
+ */
+
+METHODDEF(void)
+fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr,
+ JSAMPARRAY input_data, JSAMPARRAY output_data)
+{
+ int outrow;
+ JDIMENSION colctr;
+ JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE;
+ register JSAMPROW inptr, above_ptr, below_ptr, outptr;
+ INT32 membersum, neighsum, memberscale, neighscale;
+ int colsum, lastcolsum, nextcolsum;
+
+ /* Expand input data enough to let all the output samples be generated
+ * by the standard loop. Special-casing padded output would be more
+ * efficient.
+ */
+ expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2,
+ cinfo->image_width, output_cols);
+
+ /* Each of the eight neighbor pixels contributes a fraction SF to the
+ * smoothed pixel, while the main pixel contributes (1-8*SF). In order
+ * to use integer arithmetic, these factors are multiplied by 2^16 = 65536.
+ * Also recall that SF = smoothing_factor / 1024.
+ */
+
+ memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */
+ neighscale = cinfo->smoothing_factor * 64; /* scaled SF */
+
+ for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) {
+ outptr = output_data[outrow];
+ inptr = input_data[outrow];
+ above_ptr = input_data[outrow-1];
+ below_ptr = input_data[outrow+1];
+
+ /* Special case for first column */
+ colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) +
+ GETJSAMPLE(*inptr);
+ membersum = GETJSAMPLE(*inptr++);
+ nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+ GETJSAMPLE(*inptr);
+ neighsum = colsum + (colsum - membersum) + nextcolsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ lastcolsum = colsum; colsum = nextcolsum;
+
+ for (colctr = output_cols - 2; colctr > 0; colctr--) {
+ membersum = GETJSAMPLE(*inptr++);
+ above_ptr++; below_ptr++;
+ nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) +
+ GETJSAMPLE(*inptr);
+ neighsum = lastcolsum + (colsum - membersum) + nextcolsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16);
+ lastcolsum = colsum; colsum = nextcolsum;
+ }
+
+ /* Special case for last column */
+ membersum = GETJSAMPLE(*inptr);
+ neighsum = lastcolsum + (colsum - membersum) + colsum;
+ membersum = membersum * memberscale + neighsum * neighscale;
+ *outptr = (JSAMPLE) ((membersum + 32768) >> 16);
+
+ }
+}
+
+#endif /* INPUT_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Module initialization routine for downsampling.
+ * Note that we must select a routine for each component.
+ */
+
+GLOBAL(void)
+jinit_downsampler (j_compress_ptr cinfo)
+{
+ my_downsample_ptr downsample;
+ int ci;
+ jpeg_component_info * compptr;
+ boolean smoothok = TRUE;
+
+ downsample = (my_downsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_downsampler));
+ cinfo->downsample = (struct jpeg_downsampler *) downsample;
+ downsample->pub.start_pass = start_pass_downsample;
+ downsample->pub.downsample = sep_downsample;
+ downsample->pub.need_context_rows = FALSE;
+
+ if (cinfo->CCIR601_sampling)
+ ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+ /* Verify we can handle the sampling factors, and set up method pointers */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor) {
+ downsample->methods[ci] = fullsize_smooth_downsample;
+ downsample->pub.need_context_rows = TRUE;
+ } else
+#endif
+ downsample->methods[ci] = fullsize_downsample;
+ } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor == cinfo->max_v_samp_factor) {
+ smoothok = FALSE;
+ downsample->methods[ci] = h2v1_downsample;
+ } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor &&
+ compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) {
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor) {
+ downsample->methods[ci] = h2v2_smooth_downsample;
+ downsample->pub.need_context_rows = TRUE;
+ } else
+#endif
+ downsample->methods[ci] = h2v2_downsample;
+ } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 &&
+ (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) {
+ smoothok = FALSE;
+ downsample->methods[ci] = int_downsample;
+ } else
+ ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+ }
+
+#ifdef INPUT_SMOOTHING_SUPPORTED
+ if (cinfo->smoothing_factor && !smoothok)
+ TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL);
+#endif
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
new file mode 100644
index 0000000000..ed541159f1
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jctrans.c
@@ -0,0 +1,391 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jctrans.c
+ *
+ * Copyright (C) 1995-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding compression,
+ * that is, writing raw DCT coefficient arrays to an output JPEG file.
+ * The routines in jcapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transencode_master_selection
+ JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+LOCAL(void) transencode_coef_controller
+ JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+
+
+/*
+ * Compression initialization for writing raw-coefficient data.
+ * Before calling this, all parameters and a data destination must be set up.
+ * Call jpeg_finish_compress() to actually write the data.
+ *
+ * The number of passed virtual arrays must match cinfo->num_components.
+ * Note that the virtual arrays need not be filled or even realized at
+ * the time write_coefficients is called; indeed, if the virtual arrays
+ * were requested from this compression object's memory manager, they
+ * typically will be realized during this routine and filled afterwards.
+ */
+
+GLOBAL(void)
+jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)
+{
+ if (cinfo->global_state != CSTATE_START)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Mark all tables to be written */
+ jpeg_suppress_tables(cinfo, FALSE);
+ /* (Re)initialize error mgr and destination modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->dest->init_destination) (cinfo);
+ /* Perform master selection of active modules */
+ transencode_master_selection(cinfo, coef_arrays);
+ /* Wait for jpeg_finish_compress() call */
+ cinfo->next_scanline = 0; /* so jpeg_write_marker works */
+ cinfo->global_state = CSTATE_WRCOEFS;
+}
+
+
+/*
+ * Initialize the compression object with default parameters,
+ * then copy from the source object all parameters needed for lossless
+ * transcoding. Parameters that can be varied without loss (such as
+ * scan script and Huffman optimization) are left in their default states.
+ */
+
+GLOBAL(void)
+jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
+ j_compress_ptr dstinfo)
+{
+ JQUANT_TBL ** qtblptr;
+ jpeg_component_info *incomp, *outcomp;
+ JQUANT_TBL *c_quant, *slot_quant;
+ int tblno, ci, coefi;
+
+ /* Safety check to ensure start_compress not called yet. */
+ if (dstinfo->global_state != CSTATE_START)
+ ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state);
+ /* Copy fundamental image dimensions */
+ dstinfo->image_width = srcinfo->image_width;
+ dstinfo->image_height = srcinfo->image_height;
+ dstinfo->input_components = srcinfo->num_components;
+ dstinfo->in_color_space = srcinfo->jpeg_color_space;
+ /* Initialize all parameters to default values */
+ jpeg_set_defaults(dstinfo);
+ /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
+ * Fix it to get the right header markers for the image colorspace.
+ */
+ jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
+ dstinfo->data_precision = srcinfo->data_precision;
+ dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
+ /* Copy the source's quantization tables. */
+ for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) {
+ if (srcinfo->quant_tbl_ptrs[tblno] != NULL) {
+ qtblptr = & dstinfo->quant_tbl_ptrs[tblno];
+ if (*qtblptr == NULL)
+ *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo);
+ MEMCOPY((*qtblptr)->quantval,
+ srcinfo->quant_tbl_ptrs[tblno]->quantval,
+ SIZEOF((*qtblptr)->quantval));
+ (*qtblptr)->sent_table = FALSE;
+ }
+ }
+ /* Copy the source's per-component info.
+ * Note we assume jpeg_set_defaults has allocated the dest comp_info array.
+ */
+ dstinfo->num_components = srcinfo->num_components;
+ if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info;
+ ci < dstinfo->num_components; ci++, incomp++, outcomp++) {
+ outcomp->component_id = incomp->component_id;
+ outcomp->h_samp_factor = incomp->h_samp_factor;
+ outcomp->v_samp_factor = incomp->v_samp_factor;
+ outcomp->quant_tbl_no = incomp->quant_tbl_no;
+ /* Make sure saved quantization table for component matches the qtable
+ * slot. If not, the input file re-used this qtable slot.
+ * IJG encoder currently cannot duplicate this.
+ */
+ tblno = outcomp->quant_tbl_no;
+ if (tblno < 0 || tblno >= NUM_QUANT_TBLS ||
+ srcinfo->quant_tbl_ptrs[tblno] == NULL)
+ ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno);
+ slot_quant = srcinfo->quant_tbl_ptrs[tblno];
+ c_quant = incomp->quant_table;
+ if (c_quant != NULL) {
+ for (coefi = 0; coefi < DCTSIZE2; coefi++) {
+ if (c_quant->quantval[coefi] != slot_quant->quantval[coefi])
+ ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
+ }
+ }
+ /* Note: we do not copy the source's Huffman table assignments;
+ * instead we rely on jpeg_set_colorspace to have made a suitable choice.
+ */
+ }
+ /* Also copy JFIF version and resolution information, if available.
+ * Strictly speaking this isn't "critical" info, but it's nearly
+ * always appropriate to copy it if available. In particular,
+ * if the application chooses to copy JFIF 1.02 extension markers from
+ * the source file, we need to copy the version to make sure we don't
+ * emit a file that has 1.02 extensions but a claimed version of 1.01.
+ * We will *not*, however, copy version info from mislabeled "2.01" files.
+ */
+ if (srcinfo->saw_JFIF_marker) {
+ if (srcinfo->JFIF_major_version == 1) {
+ dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
+ dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
+ }
+ dstinfo->density_unit = srcinfo->density_unit;
+ dstinfo->X_density = srcinfo->X_density;
+ dstinfo->Y_density = srcinfo->Y_density;
+ }
+}
+
+
+/*
+ * Master selection of compression modules for transcoding.
+ * This substitutes for jcinit.c's initialization of the full compressor.
+ */
+
+LOCAL(void)
+transencode_master_selection (j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays)
+{
+ /* Although we don't actually use input_components for transcoding,
+ * jcmaster.c's initial_setup will complain if input_components is 0.
+ */
+ cinfo->input_components = 1;
+ /* Initialize master control (includes parameter checking/processing) */
+ jinit_c_master_control(cinfo, TRUE /* transcode only */);
+
+ /* Entropy encoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+ jinit_phuff_encoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_encoder(cinfo);
+ }
+
+ /* We need a special coefficient buffer controller. */
+ transencode_coef_controller(cinfo, coef_arrays);
+
+ jinit_marker_writer(cinfo);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Write the datastream header (SOI, JFIF) immediately.
+ * Frame and scan headers are postponed till later.
+ * This lets application insert special markers after the SOI.
+ */
+ (*cinfo->marker->write_file_header) (cinfo);
+}
+
+
+/*
+ * The rest of this file is a special implementation of the coefficient
+ * buffer controller. This is similar to jccoefct.c, but it handles only
+ * output from presupplied virtual arrays. Furthermore, we generate any
+ * dummy padding blocks on-the-fly rather than expecting them to be present
+ * in the arrays.
+ */
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_c_coef_controller pub; /* public fields */
+
+ JDIMENSION iMCU_row_num; /* iMCU row # within image */
+ JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* Virtual block array for each component. */
+ jvirt_barray_ptr * whole_image;
+
+ /* Workspace for constructing dummy blocks at right/bottom edges. */
+ JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+
+LOCAL(void)
+start_iMCU_row (j_compress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->mcu_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ if (pass_mode != JBUF_CRANK_DEST)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ coef->iMCU_row_num = 0;
+ start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Process some data.
+ * We process the equivalent of one fully interleaved MCU row ("iMCU" row)
+ * per call, ie, v_samp_factor block rows for each component in the scan.
+ * The data is obtained from the virtual arrays and fed to the entropy coder.
+ * Returns TRUE if the iMCU row is completed, FALSE if suspended.
+ *
+ * NB: input_buf is ignored; it is likely to be a NULL pointer.
+ */
+
+METHODDEF(boolean)
+compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, ci, xindex, yindex, yoffset, blockcnt;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan. */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ coef->iMCU_row_num * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (coef->iMCU_row_num < last_iMCU_row ||
+ yindex+yoffset < compptr->last_row_height) {
+ /* Fill in pointers to real blocks in this row */
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < blockcnt; xindex++)
+ MCU_buffer[blkn++] = buffer_ptr++;
+ } else {
+ /* At bottom of image, need a whole row of dummy blocks */
+ xindex = 0;
+ }
+ /* Fill in any dummy blocks needed in this row.
+ * Dummy blocks are filled in the same way as in jccoefct.c:
+ * all zeroes in the AC entries, DC entries equal to previous
+ * block's DC value. The init routine has already zeroed the
+ * AC entries, so we need only set the DC entries correctly.
+ */
+ for (; xindex < compptr->MCU_width; xindex++) {
+ MCU_buffer[blkn] = coef->dummy_buffer[blkn];
+ MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0];
+ blkn++;
+ }
+ }
+ }
+ /* Try to write the MCU. */
+ if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->mcu_ctr = MCU_col_num;
+ return FALSE;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->mcu_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ coef->iMCU_row_num++;
+ start_iMCU_row(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Initialize coefficient buffer controller.
+ *
+ * Each passed coefficient array must be the right size for that
+ * coefficient: width_in_blocks wide and height_in_blocks high,
+ * with unitheight at least v_samp_factor.
+ */
+
+LOCAL(void)
+transencode_coef_controller (j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays)
+{
+ my_coef_ptr coef;
+ JBLOCKROW buffer;
+ int i;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ coef->pub.start_pass = start_pass_coef;
+ coef->pub.compress_data = compress_output;
+
+ /* Save pointer to virtual arrays */
+ coef->whole_image = coef_arrays;
+
+ /* Allocate and pre-zero space for dummy DCT blocks. */
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+ coef->dummy_buffer[i] = buffer + i;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
new file mode 100644
index 0000000000..1b24b707b2
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c
@@ -0,0 +1,398 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdapimin.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library. These are the "minimum" API routines that may be
+ * needed in either the normal full-decompression case or the
+ * transcoding-only case.
+ *
+ * Most of the routines intended to be called directly by an application
+ * are in this file or in jdapistd.c. But also see jcomapi.c for routines
+ * shared by compression and decompression, and jdtrans.c for the transcoding
+ * case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * Initialization of a JPEG decompression object.
+ * The error manager must already be set up (in case memory manager fails).
+ */
+
+GLOBAL(void)
+jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
+{
+ int i;
+
+ /* Guard against version mismatches between library and caller. */
+ cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
+ if (version != JPEG_LIB_VERSION)
+ ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
+ if (structsize != SIZEOF(struct jpeg_decompress_struct))
+ ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
+ (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
+
+ /* For debugging purposes, we zero the whole master structure.
+ * But the application has already set the err pointer, and may have set
+ * client_data, so we have to save and restore those fields.
+ * Note: if application hasn't set client_data, tools like Purify may
+ * complain here.
+ */
+ {
+ struct jpeg_error_mgr * err = cinfo->err;
+ void * client_data = cinfo->client_data; /* ignore Purify complaint here */
+ MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
+ cinfo->err = err;
+ cinfo->client_data = client_data;
+ }
+ cinfo->is_decompressor = TRUE;
+
+ /* Initialize a memory manager instance for this object */
+ jinit_memory_mgr((j_common_ptr) cinfo);
+
+ /* Zero out pointers to permanent structures. */
+ cinfo->progress = NULL;
+ cinfo->src = NULL;
+
+ for (i = 0; i < NUM_QUANT_TBLS; i++)
+ cinfo->quant_tbl_ptrs[i] = NULL;
+
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ cinfo->dc_huff_tbl_ptrs[i] = NULL;
+ cinfo->ac_huff_tbl_ptrs[i] = NULL;
+ }
+
+ /* Initialize marker processor so application can override methods
+ * for COM, APPn markers before calling jpeg_read_header.
+ */
+ cinfo->marker_list = NULL;
+ jinit_marker_reader(cinfo);
+
+ /* And initialize the overall input controller. */
+ jinit_input_controller(cinfo);
+
+ /* OK, I'm ready */
+ cinfo->global_state = DSTATE_START;
+}
+
+
+/*
+ * Destruction of a JPEG decompression object
+ */
+
+GLOBAL(void)
+jpeg_destroy_decompress (j_decompress_ptr cinfo)
+{
+ jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Abort processing of a JPEG decompression operation,
+ * but don't destroy the object itself.
+ */
+
+GLOBAL(void)
+jpeg_abort_decompress (j_decompress_ptr cinfo)
+{
+ jpeg_abort((j_common_ptr) cinfo); /* use common routine */
+}
+
+
+/*
+ * Set default decompression parameters.
+ */
+
+LOCAL(void)
+default_decompress_parms (j_decompress_ptr cinfo)
+{
+ /* Guess the input colorspace, and set output colorspace accordingly. */
+ /* (Wish JPEG committee had provided a real way to specify this...) */
+ /* Note application may override our guesses. */
+ switch (cinfo->num_components) {
+ case 1:
+ cinfo->jpeg_color_space = JCS_GRAYSCALE;
+ cinfo->out_color_space = JCS_GRAYSCALE;
+ break;
+
+ case 3:
+ if (cinfo->saw_JFIF_marker) {
+ cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
+ } else if (cinfo->saw_Adobe_marker) {
+ switch (cinfo->Adobe_transform) {
+ case 0:
+ cinfo->jpeg_color_space = JCS_RGB;
+ break;
+ case 1:
+ cinfo->jpeg_color_space = JCS_YCbCr;
+ break;
+ default:
+ WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ break;
+ }
+ } else {
+ /* Saw no special markers, try to guess from the component IDs */
+ int cid0 = cinfo->comp_info[0].component_id;
+ int cid1 = cinfo->comp_info[1].component_id;
+ int cid2 = cinfo->comp_info[2].component_id;
+
+ if (cid0 == 1 && cid1 == 2 && cid2 == 3)
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
+ else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
+ cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
+ else {
+ TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ }
+ }
+ /* Always guess RGB is proper output colorspace. */
+ cinfo->out_color_space = JCS_RGB;
+ break;
+
+ case 4:
+ if (cinfo->saw_Adobe_marker) {
+ switch (cinfo->Adobe_transform) {
+ case 0:
+ cinfo->jpeg_color_space = JCS_CMYK;
+ break;
+ case 2:
+ cinfo->jpeg_color_space = JCS_YCCK;
+ break;
+ default:
+ WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
+ cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
+ break;
+ }
+ } else {
+ /* No special markers, assume straight CMYK. */
+ cinfo->jpeg_color_space = JCS_CMYK;
+ }
+ cinfo->out_color_space = JCS_CMYK;
+ break;
+
+ default:
+ cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->out_color_space = JCS_UNKNOWN;
+ break;
+ }
+
+ /* Set defaults for other decompression parameters. */
+ cinfo->scale_num = 1; /* 1:1 scaling */
+ cinfo->scale_denom = 1;
+ cinfo->output_gamma = 1.0;
+ cinfo->buffered_image = FALSE;
+ cinfo->raw_data_out = FALSE;
+ cinfo->dct_method = JDCT_DEFAULT;
+ cinfo->do_fancy_upsampling = TRUE;
+ cinfo->do_block_smoothing = TRUE;
+ cinfo->quantize_colors = FALSE;
+ /* We set these in case application only sets quantize_colors. */
+ cinfo->dither_mode = JDITHER_FS;
+#ifdef QUANT_2PASS_SUPPORTED
+ cinfo->two_pass_quantize = TRUE;
+#else
+ cinfo->two_pass_quantize = FALSE;
+#endif
+ cinfo->desired_number_of_colors = 256;
+ cinfo->colormap = NULL;
+ /* Initialize for no mode change in buffered-image mode. */
+ cinfo->enable_1pass_quant = FALSE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+}
+
+
+/*
+ * Decompression startup: read start of JPEG datastream to see what's there.
+ * Need only initialize JPEG object and supply a data source before calling.
+ *
+ * This routine will read as far as the first SOS marker (ie, actual start of
+ * compressed data), and will save all tables and parameters in the JPEG
+ * object. It will also initialize the decompression parameters to default
+ * values, and finally return JPEG_HEADER_OK. On return, the application may
+ * adjust the decompression parameters and then call jpeg_start_decompress.
+ * (Or, if the application only wanted to determine the image parameters,
+ * the data need not be decompressed. In that case, call jpeg_abort or
+ * jpeg_destroy to release any temporary space.)
+ * If an abbreviated (tables only) datastream is presented, the routine will
+ * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then
+ * re-use the JPEG object to read the abbreviated image datastream(s).
+ * It is unnecessary (but OK) to call jpeg_abort in this case.
+ * The JPEG_SUSPENDED return code only occurs if the data source module
+ * requests suspension of the decompressor. In this case the application
+ * should load more source data and then re-call jpeg_read_header to resume
+ * processing.
+ * If a non-suspending data source is used and require_image is TRUE, then the
+ * return code need not be inspected since only JPEG_HEADER_OK is possible.
+ *
+ * This routine is now just a front end to jpeg_consume_input, with some
+ * extra error checking.
+ */
+
+GLOBAL(int)
+jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
+{
+ int retcode;
+
+ if (cinfo->global_state != DSTATE_START &&
+ cinfo->global_state != DSTATE_INHEADER)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ retcode = jpeg_consume_input(cinfo);
+
+ switch (retcode) {
+ case JPEG_REACHED_SOS:
+ retcode = JPEG_HEADER_OK;
+ break;
+ case JPEG_REACHED_EOI:
+ if (require_image) /* Complain if application wanted an image */
+ ERREXIT(cinfo, JERR_NO_IMAGE);
+ /* Reset to start state; it would be safer to require the application to
+ * call jpeg_abort, but we can't change it now for compatibility reasons.
+ * A side effect is to free any temporary memory (there shouldn't be any).
+ */
+ jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */
+ retcode = JPEG_HEADER_TABLES_ONLY;
+ break;
+ case JPEG_SUSPENDED:
+ /* no work */
+ break;
+ }
+
+ return retcode;
+}
+
+
+/*
+ * Consume data in advance of what the decompressor requires.
+ * This can be called at any time once the decompressor object has
+ * been created and a data source has been set up.
+ *
+ * This routine is essentially a state machine that handles a couple
+ * of critical state-transition actions, namely initial setup and
+ * transition from header scanning to ready-for-start_decompress.
+ * All the actual input is done via the input controller's consume_input
+ * method.
+ */
+
+GLOBAL(int)
+jpeg_consume_input (j_decompress_ptr cinfo)
+{
+ int retcode = JPEG_SUSPENDED;
+
+ /* NB: every possible DSTATE value should be listed in this switch */
+ switch (cinfo->global_state) {
+ case DSTATE_START:
+ /* Start-of-datastream actions: reset appropriate modules */
+ (*cinfo->inputctl->reset_input_controller) (cinfo);
+ /* Initialize application's data source module */
+ (*cinfo->src->init_source) (cinfo);
+ cinfo->global_state = DSTATE_INHEADER;
+ /*FALLTHROUGH*/
+ case DSTATE_INHEADER:
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */
+ /* Set up default parameters based on header data */
+ default_decompress_parms(cinfo);
+ /* Set global state: ready for start_decompress */
+ cinfo->global_state = DSTATE_READY;
+ }
+ break;
+ case DSTATE_READY:
+ /* Can't advance past first SOS until start_decompress is called */
+ retcode = JPEG_REACHED_SOS;
+ break;
+ case DSTATE_PRELOAD:
+ case DSTATE_PRESCAN:
+ case DSTATE_SCANNING:
+ case DSTATE_RAW_OK:
+ case DSTATE_BUFIMAGE:
+ case DSTATE_BUFPOST:
+ case DSTATE_STOPPING:
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ break;
+ default:
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ return retcode;
+}
+
+
+/*
+ * Have we finished reading the input file?
+ */
+
+GLOBAL(boolean)
+jpeg_input_complete (j_decompress_ptr cinfo)
+{
+ /* Check for valid jpeg object */
+ if (cinfo->global_state < DSTATE_START ||
+ cinfo->global_state > DSTATE_STOPPING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return cinfo->inputctl->eoi_reached;
+}
+
+
+/*
+ * Is there more than one scan?
+ */
+
+GLOBAL(boolean)
+jpeg_has_multiple_scans (j_decompress_ptr cinfo)
+{
+ /* Only valid after jpeg_read_header completes */
+ if (cinfo->global_state < DSTATE_READY ||
+ cinfo->global_state > DSTATE_STOPPING)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return cinfo->inputctl->has_multiple_scans;
+}
+
+
+/*
+ * Finish JPEG decompression.
+ *
+ * This will normally just verify the file trailer and release temp storage.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_decompress (j_decompress_ptr cinfo)
+{
+ if ((cinfo->global_state == DSTATE_SCANNING ||
+ cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
+ /* Terminate final pass of non-buffered mode */
+ if (cinfo->output_scanline < cinfo->output_height)
+ ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
+ (*cinfo->master->finish_output_pass) (cinfo);
+ cinfo->global_state = DSTATE_STOPPING;
+ } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
+ /* Finishing after a buffered-image operation */
+ cinfo->global_state = DSTATE_STOPPING;
+ } else if (cinfo->global_state != DSTATE_STOPPING) {
+ /* STOPPING = repeat call after a suspension, anything else is error */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ /* Read until EOI */
+ while (! cinfo->inputctl->eoi_reached) {
+ if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+ return FALSE; /* Suspend, come back later */
+ }
+ /* Do final cleanup */
+ (*cinfo->src->term_source) (cinfo);
+ /* We can use jpeg_abort to release memory and reset global_state */
+ jpeg_abort((j_common_ptr) cinfo);
+ return TRUE;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
new file mode 100644
index 0000000000..8c969eb309
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c
@@ -0,0 +1,279 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdapistd.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains application interface code for the decompression half
+ * of the JPEG library. These are the "standard" API routines that are
+ * used in the normal full-decompression case. They are not used by a
+ * transcoding-only application. Note that if an application links in
+ * jpeg_start_decompress, it will end up linking in the entire decompressor.
+ * We thus must separate this file from jdapimin.c to avoid linking the
+ * whole decompression library into a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Decompression initialization.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * If a multipass operating mode was selected, this will do all but the
+ * last pass, and thus may take a great deal of time.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_start_decompress (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state == DSTATE_READY) {
+ /* First call: initialize master control, select active modules */
+ jinit_master_decompress(cinfo);
+ if (cinfo->buffered_image) {
+ /* No more work here; expecting jpeg_start_output next */
+ cinfo->global_state = DSTATE_BUFIMAGE;
+ return TRUE;
+ }
+ cinfo->global_state = DSTATE_PRELOAD;
+ }
+ if (cinfo->global_state == DSTATE_PRELOAD) {
+ /* If file has multiple scans, absorb them all into the coef buffer */
+ if (cinfo->inputctl->has_multiple_scans) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ for (;;) {
+ int retcode;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL)
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ /* Absorb some more input */
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_SUSPENDED)
+ return FALSE;
+ if (retcode == JPEG_REACHED_EOI)
+ break;
+ /* Advance progress counter if appropriate */
+ if (cinfo->progress != NULL &&
+ (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+ if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+ /* jdmaster underestimated number of scans; ratchet up one scan */
+ cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+ }
+ }
+ }
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+ }
+ cinfo->output_scan_number = cinfo->input_scan_number;
+ } else if (cinfo->global_state != DSTATE_PRESCAN)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Perform any dummy output passes, and set up for the final pass */
+ return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Set up for an output pass, and perform any dummy pass(es) needed.
+ * Common subroutine for jpeg_start_decompress and jpeg_start_output.
+ * Entry: global_state = DSTATE_PRESCAN only if previously suspended.
+ * Exit: If done, returns TRUE and sets global_state for proper output mode.
+ * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN.
+ */
+
+LOCAL(boolean)
+output_pass_setup (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state != DSTATE_PRESCAN) {
+ /* First call: do pass setup */
+ (*cinfo->master->prepare_for_output_pass) (cinfo);
+ cinfo->output_scanline = 0;
+ cinfo->global_state = DSTATE_PRESCAN;
+ }
+ /* Loop over any required dummy passes */
+ while (cinfo->master->is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+ /* Crank through the dummy pass */
+ while (cinfo->output_scanline < cinfo->output_height) {
+ JDIMENSION last_scanline;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+ /* Process some data */
+ last_scanline = cinfo->output_scanline;
+ (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
+ &cinfo->output_scanline, (JDIMENSION) 0);
+ if (cinfo->output_scanline == last_scanline)
+ return FALSE; /* No progress made, must suspend */
+ }
+ /* Finish up dummy pass, and set up for another one */
+ (*cinfo->master->finish_output_pass) (cinfo);
+ (*cinfo->master->prepare_for_output_pass) (cinfo);
+ cinfo->output_scanline = 0;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+ }
+ /* Ready for application to drive output pass through
+ * jpeg_read_scanlines or jpeg_read_raw_data.
+ */
+ cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
+ return TRUE;
+}
+
+
+/*
+ * Read some scanlines of data from the JPEG decompressor.
+ *
+ * The return value will be the number of lines actually read.
+ * This may be less than the number requested in several cases,
+ * including bottom of image, data source suspension, and operating
+ * modes that emit multiple scanlines at a time.
+ *
+ * Note: we warn about excess calls to jpeg_read_scanlines() since
+ * this likely signals an application programmer error. However,
+ * an oversize buffer (max_lines > scanlines remaining) is not an error.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
+ JDIMENSION max_lines)
+{
+ JDIMENSION row_ctr;
+
+ if (cinfo->global_state != DSTATE_SCANNING)
+ return 0; /* XYQ 2010-6-27: don't throw exception here */
+/* ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); */
+ if (cinfo->output_scanline >= cinfo->output_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Process some data */
+ row_ctr = 0;
+ (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
+ cinfo->output_scanline += row_ctr;
+ return row_ctr;
+}
+
+
+/*
+ * Alternate entry point to read raw data.
+ * Processes exactly one iMCU row per call, unless suspended.
+ */
+
+GLOBAL(JDIMENSION)
+jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
+ JDIMENSION max_lines)
+{
+ JDIMENSION lines_per_iMCU_row;
+
+ if (cinfo->global_state != DSTATE_RAW_OK)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ if (cinfo->output_scanline >= cinfo->output_height) {
+ WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
+ return 0;
+ }
+
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->pass_counter = (long) cinfo->output_scanline;
+ cinfo->progress->pass_limit = (long) cinfo->output_height;
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ }
+
+ /* Verify that at least one iMCU row can be returned. */
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
+ if (max_lines < lines_per_iMCU_row)
+ ERREXIT(cinfo, JERR_BUFFER_SIZE);
+
+ /* Decompress directly into user's buffer. */
+ if (! (*cinfo->coef->decompress_data) (cinfo, data))
+ return 0; /* suspension forced, can do nothing more */
+
+ /* OK, we processed one iMCU row. */
+ cinfo->output_scanline += lines_per_iMCU_row;
+ return lines_per_iMCU_row;
+}
+
+
+/* Additional entry points for buffered-image mode. */
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Initialize for an output pass in buffered-image mode.
+ */
+
+GLOBAL(boolean)
+jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
+{
+ if (cinfo->global_state != DSTATE_BUFIMAGE &&
+ cinfo->global_state != DSTATE_PRESCAN)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ /* Limit scan number to valid range */
+ if (scan_number <= 0)
+ scan_number = 1;
+ if (cinfo->inputctl->eoi_reached &&
+ scan_number > cinfo->input_scan_number)
+ scan_number = cinfo->input_scan_number;
+ cinfo->output_scan_number = scan_number;
+ /* Perform any dummy output passes, and set up for the real pass */
+ return output_pass_setup(cinfo);
+}
+
+
+/*
+ * Finish up after an output pass in buffered-image mode.
+ *
+ * Returns FALSE if suspended. The return value need be inspected only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(boolean)
+jpeg_finish_output (j_decompress_ptr cinfo)
+{
+ if ((cinfo->global_state == DSTATE_SCANNING ||
+ cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
+ /* Terminate this pass. */
+ /* We do not require the whole pass to have been completed. */
+ (*cinfo->master->finish_output_pass) (cinfo);
+ cinfo->global_state = DSTATE_BUFPOST;
+ } else if (cinfo->global_state != DSTATE_BUFPOST) {
+ /* BUFPOST = repeat call after a suspension, anything else is error */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ }
+ /* Read markers looking for SOS or EOI */
+ while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+ ! cinfo->inputctl->eoi_reached) {
+ if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
+ return FALSE; /* Suspend, come back later */
+ }
+ cinfo->global_state = DSTATE_BUFIMAGE;
+ return TRUE;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
new file mode 100644
index 0000000000..89041f36f4
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c
@@ -0,0 +1,739 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdcoefct.c
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the coefficient buffer controller for decompression.
+ * This controller is the top level of the JPEG decompressor proper.
+ * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
+ *
+ * In buffered-image mode, this controller is the interface between
+ * input-oriented processing and output-oriented processing.
+ * Also, the input side (only) is used when reading a file for transcoding.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+/* Block smoothing is only applicable for progressive JPEG, so: */
+#ifndef D_PROGRESSIVE_SUPPORTED
+#undef BLOCK_SMOOTHING_SUPPORTED
+#endif
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_coef_controller pub; /* public fields */
+
+ /* These variables keep track of the current location of the input side. */
+ /* cinfo->input_iMCU_row is also used for this. */
+ JDIMENSION MCU_ctr; /* counts MCUs processed in current row */
+ int MCU_vert_offset; /* counts MCU rows within iMCU row */
+ int MCU_rows_per_iMCU_row; /* number of such rows needed */
+
+ /* The output side's location is represented by cinfo->output_iMCU_row. */
+
+ /* In single-pass modes, it's sufficient to buffer just one MCU.
+ * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks,
+ * and let the entropy decoder write into that workspace each time.
+ * (On 80x86, the workspace is FAR even though it's not really very big;
+ * this is to keep the module interfaces unchanged when a large coefficient
+ * buffer is necessary.)
+ * In multi-pass modes, this array points to the current MCU's blocks
+ * within the virtual arrays; it is used only by the input side.
+ */
+ JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU];
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* In multi-pass modes, we need a virtual block array for each component. */
+ jvirt_barray_ptr whole_image[MAX_COMPONENTS];
+#endif
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ /* When doing block smoothing, we latch coefficient Al values here */
+ int * coef_bits_latch;
+#define SAVED_COEFS 6 /* we save coef_bits[0..5] */
+#endif
+} my_coef_controller;
+
+typedef my_coef_controller * my_coef_ptr;
+
+/* Forward declarations */
+METHODDEF(int) decompress_onepass
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+METHODDEF(int) decompress_data
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo));
+METHODDEF(int) decompress_smooth_data
+ JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf));
+#endif
+
+
+LOCAL(void)
+start_iMCU_row (j_decompress_ptr cinfo)
+/* Reset within-iMCU-row counters for a new row (input side) */
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* In an interleaved scan, an MCU row is the same as an iMCU row.
+ * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
+ * But at the bottom of the image, process only what's left.
+ */
+ if (cinfo->comps_in_scan > 1) {
+ coef->MCU_rows_per_iMCU_row = 1;
+ } else {
+ if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1))
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
+ else
+ coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
+ }
+
+ coef->MCU_ctr = 0;
+ coef->MCU_vert_offset = 0;
+}
+
+
+/*
+ * Initialize for an input processing pass.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+ cinfo->input_iMCU_row = 0;
+ start_iMCU_row(cinfo);
+}
+
+
+/*
+ * Initialize for an output processing pass.
+ */
+
+METHODDEF(void)
+start_output_pass (j_decompress_ptr cinfo)
+{
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+
+ /* If multipass, check to see whether to use block smoothing on this pass */
+ if (coef->pub.coef_arrays != NULL) {
+ if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
+ coef->pub.decompress_data = decompress_smooth_data;
+ else
+ coef->pub.decompress_data = decompress_data;
+ }
+#endif
+ cinfo->output_iMCU_row = 0;
+}
+
+
+/*
+ * Decompress and return some data in the single-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Input and output must run in lockstep since we have only a one-MCU buffer.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image,
+ * which we index according to the component's SOF position.
+ */
+
+METHODDEF(int)
+decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ int blkn, ci, xindex, yindex, yoffset, useful_width;
+ JSAMPARRAY output_ptr;
+ JDIMENSION start_col, output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+
+ /* Loop to process as much as one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
+ MCU_col_num++) {
+ /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
+ jzero_far((void FAR *) coef->MCU_buffer[0],
+ (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
+ if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->MCU_ctr = MCU_col_num;
+ return JPEG_SUSPENDED;
+ }
+ /* Determine where data should go in output_buf and do the IDCT thing.
+ * We skip dummy blocks at the right and bottom edges (but blkn gets
+ * incremented past them!). Note the inner loop relies on having
+ * allocated the MCU_buffer[] blocks sequentially.
+ */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed) {
+ blkn += compptr->MCU_blocks;
+ continue;
+ }
+ inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
+ useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
+ : compptr->last_col_width;
+ output_ptr = output_buf[compptr->component_index] +
+ yoffset * compptr->DCT_scaled_size;
+ start_col = MCU_col_num * compptr->MCU_sample_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ if (cinfo->input_iMCU_row < last_iMCU_row ||
+ yoffset+yindex < compptr->last_row_height) {
+ output_col = start_col;
+ for (xindex = 0; xindex < useful_width; xindex++) {
+ (*inverse_DCT) (cinfo, compptr,
+ (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
+ output_ptr, output_col);
+ output_col += compptr->DCT_scaled_size;
+ }
+ }
+ blkn += compptr->MCU_width;
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->MCU_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ cinfo->output_iMCU_row++;
+ if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+ start_iMCU_row(cinfo);
+ return JPEG_ROW_COMPLETED;
+ }
+ /* Completed the scan */
+ (*cinfo->inputctl->finish_input_pass) (cinfo);
+ return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Dummy consume-input routine for single-pass operation.
+ */
+
+METHODDEF(int)
+dummy_consume_data (j_decompress_ptr cinfo)
+{
+ return JPEG_SUSPENDED; /* Always indicate nothing was done */
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Consume input data and store it in the full-image coefficient buffer.
+ * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
+ * ie, v_samp_factor block rows for each component in the scan.
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ */
+
+METHODDEF(int)
+consume_data (j_decompress_ptr cinfo)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION MCU_col_num; /* index of current MCU within row */
+ int blkn, ci, xindex, yindex, yoffset;
+ JDIMENSION start_col;
+ JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
+ JBLOCKROW buffer_ptr;
+ jpeg_component_info *compptr;
+
+ /* Align the virtual buffers for the components used in this scan. */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ buffer[ci] = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
+ cinfo->input_iMCU_row * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ /* Note: entropy decoder expects buffer to be zeroed,
+ * but this is handled automatically by the memory manager
+ * because we requested a pre-zeroed array.
+ */
+ }
+
+ /* Loop to process one whole iMCU row */
+ for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
+ yoffset++) {
+ for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
+ MCU_col_num++) {
+ /* Construct list of pointers to DCT blocks belonging to this MCU */
+ blkn = 0; /* index of current DCT block within MCU */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ start_col = MCU_col_num * compptr->MCU_width;
+ for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
+ buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
+ for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
+ coef->MCU_buffer[blkn++] = buffer_ptr++;
+ }
+ }
+ }
+ /* Try to fetch the MCU. */
+ if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
+ /* Suspension forced; update state counters and exit */
+ coef->MCU_vert_offset = yoffset;
+ coef->MCU_ctr = MCU_col_num;
+ return JPEG_SUSPENDED;
+ }
+ }
+ /* Completed an MCU row, but perhaps not an iMCU row */
+ coef->MCU_ctr = 0;
+ }
+ /* Completed the iMCU row, advance counters for next one */
+ if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
+ start_iMCU_row(cinfo);
+ return JPEG_ROW_COMPLETED;
+ }
+ /* Completed the scan */
+ (*cinfo->inputctl->finish_input_pass) (cinfo);
+ return JPEG_SCAN_COMPLETED;
+}
+
+
+/*
+ * Decompress and return some data in the multi-pass case.
+ * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
+ * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
+ *
+ * NB: output_buf contains a plane for each component in image.
+ */
+
+METHODDEF(int)
+decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION block_num;
+ int ci, block_row, block_rows;
+ JBLOCKARRAY buffer;
+ JBLOCKROW buffer_ptr;
+ JSAMPARRAY output_ptr;
+ JDIMENSION output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+
+ /* Force some input to be done if we are getting ahead of the input. */
+ while (cinfo->input_scan_number < cinfo->output_scan_number ||
+ (cinfo->input_scan_number == cinfo->output_scan_number &&
+ cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
+ if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+ return JPEG_SUSPENDED;
+ }
+
+ /* OK, output from the virtual arrays. */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed)
+ continue;
+ /* Align the virtual buffer for this component. */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ cinfo->output_iMCU_row * compptr->v_samp_factor,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (cinfo->output_iMCU_row < last_iMCU_row)
+ block_rows = compptr->v_samp_factor;
+ else {
+ /* NB: can't use last_row_height here; it is input-side-dependent! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ }
+ inverse_DCT = cinfo->idct->inverse_DCT[ci];
+ output_ptr = output_buf[ci];
+ /* Loop over all DCT blocks to be processed. */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ buffer_ptr = buffer[block_row];
+ output_col = 0;
+ for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) {
+ (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr,
+ output_ptr, output_col);
+ buffer_ptr++;
+ output_col += compptr->DCT_scaled_size;
+ }
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+
+ if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+ return JPEG_ROW_COMPLETED;
+ return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+
+/*
+ * This code applies interblock smoothing as described by section K.8
+ * of the JPEG standard: the first 5 AC coefficients are estimated from
+ * the DC values of a DCT block and its 8 neighboring blocks.
+ * We apply smoothing only for progressive JPEG decoding, and only if
+ * the coefficients it can estimate are not yet known to full precision.
+ */
+
+/* Natural-order array positions of the first 5 zigzag-order coefficients */
+#define Q01_POS 1
+#define Q10_POS 8
+#define Q20_POS 16
+#define Q11_POS 9
+#define Q02_POS 2
+
+/*
+ * Determine whether block smoothing is applicable and safe.
+ * We also latch the current states of the coef_bits[] entries for the
+ * AC coefficients; otherwise, if the input side of the decompressor
+ * advances into a new scan, we might think the coefficients are known
+ * more accurately than they really are.
+ */
+
+LOCAL(boolean)
+smoothing_ok (j_decompress_ptr cinfo)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ boolean smoothing_useful = FALSE;
+ int ci, coefi;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtable;
+ int * coef_bits;
+ int * coef_bits_latch;
+
+ if (! cinfo->progressive_mode || cinfo->coef_bits == NULL)
+ return FALSE;
+
+ /* Allocate latch area if not already done */
+ if (coef->coef_bits_latch == NULL)
+ coef->coef_bits_latch = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components *
+ (SAVED_COEFS * SIZEOF(int)));
+ coef_bits_latch = coef->coef_bits_latch;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* All components' quantization values must already be latched. */
+ if ((qtable = compptr->quant_table) == NULL)
+ return FALSE;
+ /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */
+ if (qtable->quantval[0] == 0 ||
+ qtable->quantval[Q01_POS] == 0 ||
+ qtable->quantval[Q10_POS] == 0 ||
+ qtable->quantval[Q20_POS] == 0 ||
+ qtable->quantval[Q11_POS] == 0 ||
+ qtable->quantval[Q02_POS] == 0)
+ return FALSE;
+ /* DC values must be at least partly known for all components. */
+ coef_bits = cinfo->coef_bits[ci];
+ if (coef_bits[0] < 0)
+ return FALSE;
+ /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
+ for (coefi = 1; coefi <= 5; coefi++) {
+ coef_bits_latch[coefi] = coef_bits[coefi];
+ if (coef_bits[coefi] != 0)
+ smoothing_useful = TRUE;
+ }
+ coef_bits_latch += SAVED_COEFS;
+ }
+
+ return smoothing_useful;
+}
+
+
+/*
+ * Variant of decompress_data for use when doing block smoothing.
+ */
+
+METHODDEF(int)
+decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
+{
+ my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+ JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
+ JDIMENSION block_num, last_block_column;
+ int ci, block_row, block_rows, access_rows;
+ JBLOCKARRAY buffer;
+ JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
+ JSAMPARRAY output_ptr;
+ JDIMENSION output_col;
+ jpeg_component_info *compptr;
+ inverse_DCT_method_ptr inverse_DCT;
+ boolean first_row, last_row;
+ JBLOCK workspace;
+ int *coef_bits;
+ JQUANT_TBL *quanttbl;
+ INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
+ int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
+ int Al, pred;
+
+ /* Force some input to be done if we are getting ahead of the input. */
+ while (cinfo->input_scan_number <= cinfo->output_scan_number &&
+ ! cinfo->inputctl->eoi_reached) {
+ if (cinfo->input_scan_number == cinfo->output_scan_number) {
+ /* If input is working on current scan, we ordinarily want it to
+ * have completed the current row. But if input scan is DC,
+ * we want it to keep one row ahead so that next block row's DC
+ * values are up to date.
+ */
+ JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
+ if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
+ break;
+ }
+ if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
+ return JPEG_SUSPENDED;
+ }
+
+ /* OK, output from the virtual arrays. */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Don't bother to IDCT an uninteresting component. */
+ if (! compptr->component_needed)
+ continue;
+ /* Count non-dummy DCT block rows in this iMCU row. */
+ if (cinfo->output_iMCU_row < last_iMCU_row) {
+ block_rows = compptr->v_samp_factor;
+ access_rows = block_rows * 2; /* this and next iMCU row */
+ last_row = FALSE;
+ } else {
+ /* NB: can't use last_row_height here; it is input-side-dependent! */
+ block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (block_rows == 0) block_rows = compptr->v_samp_factor;
+ access_rows = block_rows; /* this iMCU row only */
+ last_row = TRUE;
+ }
+ /* Align the virtual buffer for this component. */
+ if (cinfo->output_iMCU_row > 0) {
+ access_rows += compptr->v_samp_factor; /* prior iMCU row too */
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
+ (JDIMENSION) access_rows, FALSE);
+ buffer += compptr->v_samp_factor; /* point to current iMCU row */
+ first_row = FALSE;
+ } else {
+ buffer = (*cinfo->mem->access_virt_barray)
+ ((j_common_ptr) cinfo, coef->whole_image[ci],
+ (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
+ first_row = TRUE;
+ }
+ /* Fetch component-dependent info */
+ coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
+ quanttbl = compptr->quant_table;
+ Q00 = quanttbl->quantval[0];
+ Q01 = quanttbl->quantval[Q01_POS];
+ Q10 = quanttbl->quantval[Q10_POS];
+ Q20 = quanttbl->quantval[Q20_POS];
+ Q11 = quanttbl->quantval[Q11_POS];
+ Q02 = quanttbl->quantval[Q02_POS];
+ inverse_DCT = cinfo->idct->inverse_DCT[ci];
+ output_ptr = output_buf[ci];
+ /* Loop over all DCT blocks to be processed. */
+ for (block_row = 0; block_row < block_rows; block_row++) {
+ buffer_ptr = buffer[block_row];
+ if (first_row && block_row == 0)
+ prev_block_row = buffer_ptr;
+ else
+ prev_block_row = buffer[block_row-1];
+ if (last_row && block_row == block_rows-1)
+ next_block_row = buffer_ptr;
+ else
+ next_block_row = buffer[block_row+1];
+ /* We fetch the surrounding DC values using a sliding-register approach.
+ * Initialize all nine here so as to do the right thing on narrow pics.
+ */
+ DC1 = DC2 = DC3 = (int) prev_block_row[0][0];
+ DC4 = DC5 = DC6 = (int) buffer_ptr[0][0];
+ DC7 = DC8 = DC9 = (int) next_block_row[0][0];
+ output_col = 0;
+ last_block_column = compptr->width_in_blocks - 1;
+ for (block_num = 0; block_num <= last_block_column; block_num++) {
+ /* Fetch current DCT block into workspace so we can modify it. */
+ jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1);
+ /* Update DC values */
+ if (block_num < last_block_column) {
+ DC3 = (int) prev_block_row[1][0];
+ DC6 = (int) buffer_ptr[1][0];
+ DC9 = (int) next_block_row[1][0];
+ }
+ /* Compute coefficient estimates per K.8.
+ * An estimate is applied only if coefficient is still zero,
+ * and is not known to be fully accurate.
+ */
+ /* AC01 */
+ if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) {
+ num = 36 * Q00 * (DC4 - DC6);
+ if (num >= 0) {
+ pred = (int) (((Q01<<7) + num) / (Q01<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q01<<7) - num) / (Q01<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[1] = (JCOEF) pred;
+ }
+ /* AC10 */
+ if ((Al=coef_bits[2]) != 0 && workspace[8] == 0) {
+ num = 36 * Q00 * (DC2 - DC8);
+ if (num >= 0) {
+ pred = (int) (((Q10<<7) + num) / (Q10<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q10<<7) - num) / (Q10<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[8] = (JCOEF) pred;
+ }
+ /* AC20 */
+ if ((Al=coef_bits[3]) != 0 && workspace[16] == 0) {
+ num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
+ if (num >= 0) {
+ pred = (int) (((Q20<<7) + num) / (Q20<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q20<<7) - num) / (Q20<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[16] = (JCOEF) pred;
+ }
+ /* AC11 */
+ if ((Al=coef_bits[4]) != 0 && workspace[9] == 0) {
+ num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
+ if (num >= 0) {
+ pred = (int) (((Q11<<7) + num) / (Q11<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q11<<7) - num) / (Q11<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[9] = (JCOEF) pred;
+ }
+ /* AC02 */
+ if ((Al=coef_bits[5]) != 0 && workspace[2] == 0) {
+ num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
+ if (num >= 0) {
+ pred = (int) (((Q02<<7) + num) / (Q02<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ } else {
+ pred = (int) (((Q02<<7) - num) / (Q02<<8));
+ if (Al > 0 && pred >= (1<<Al))
+ pred = (1<<Al)-1;
+ pred = -pred;
+ }
+ workspace[2] = (JCOEF) pred;
+ }
+ /* OK, do the IDCT */
+ (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) workspace,
+ output_ptr, output_col);
+ /* Advance for next column */
+ DC1 = DC2; DC2 = DC3;
+ DC4 = DC5; DC5 = DC6;
+ DC7 = DC8; DC8 = DC9;
+ buffer_ptr++, prev_block_row++, next_block_row++;
+ output_col += compptr->DCT_scaled_size;
+ }
+ output_ptr += compptr->DCT_scaled_size;
+ }
+ }
+
+ if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
+ return JPEG_ROW_COMPLETED;
+ return JPEG_SCAN_COMPLETED;
+}
+
+#endif /* BLOCK_SMOOTHING_SUPPORTED */
+
+
+/*
+ * Initialize coefficient buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_coef_ptr coef;
+
+ coef = (my_coef_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_coef_controller));
+ cinfo->coef = (struct jpeg_d_coef_controller *) coef;
+ coef->pub.start_input_pass = start_input_pass;
+ coef->pub.start_output_pass = start_output_pass;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ coef->coef_bits_latch = NULL;
+#endif
+
+ /* Create the coefficient buffer. */
+ if (need_full_buffer) {
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* Allocate a full-image virtual array for each component, */
+ /* padded to a multiple of samp_factor DCT blocks in each direction. */
+ /* Note we ask for a pre-zeroed array. */
+ int ci, access_rows;
+ jpeg_component_info *compptr;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ access_rows = compptr->v_samp_factor;
+#ifdef BLOCK_SMOOTHING_SUPPORTED
+ /* If block smoothing could be used, need a bigger window */
+ if (cinfo->progressive_mode)
+ access_rows *= 3;
+#endif
+ coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE,
+ (JDIMENSION) jround_up((long) compptr->width_in_blocks,
+ (long) compptr->h_samp_factor),
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor),
+ (JDIMENSION) access_rows);
+ }
+ coef->pub.consume_data = consume_data;
+ coef->pub.decompress_data = decompress_data;
+ coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ /* We only need a single-MCU buffer. */
+ JBLOCKROW buffer;
+ int i;
+
+ buffer = (JBLOCKROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
+ coef->MCU_buffer[i] = buffer + i;
+ }
+ coef->pub.consume_data = dummy_consume_data;
+ coef->pub.decompress_data = decompress_onepass;
+ coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
new file mode 100644
index 0000000000..5cd35f5ec9
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c
@@ -0,0 +1,399 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdcolor.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains output colorspace conversion routines.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_color_deconverter pub; /* public fields */
+
+ /* Private state for YCC->RGB conversion */
+ int * Cr_r_tab; /* => table for Cr to R conversion */
+ int * Cb_b_tab; /* => table for Cb to B conversion */
+ INT32 * Cr_g_tab; /* => table for Cr to G conversion */
+ INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+} my_color_deconverter;
+
+typedef my_color_deconverter * my_cconvert_ptr;
+
+
+/**************** YCbCr -> RGB conversion: most common case **************/
+
+/*
+ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
+ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * The conversion equations to be implemented are therefore
+ * R = Y + 1.40200 * Cr
+ * G = Y - 0.34414 * Cb - 0.71414 * Cr
+ * B = Y + 1.77200 * Cb
+ * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
+ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ *
+ * To avoid floating-point arithmetic, we represent the fractional constants
+ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide
+ * the products by 2^16, with appropriate rounding, to get the correct answer.
+ * Notice that Y, being an integral input, does not contribute any fraction
+ * so it need not participate in the rounding.
+ *
+ * For even more speed, we avoid doing any multiplications in the inner loop
+ * by precalculating the constants times Cb and Cr for all possible values.
+ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
+ * for 12-bit samples it is still acceptable. It's not very reasonable for
+ * 16-bit samples, but if you want lossless storage you shouldn't be changing
+ * colorspace anyway.
+ * The Cr=>R and Cb=>B values can be rounded to integers in advance; the
+ * values for the G calculation are left scaled up, since we must add them
+ * together before rounding.
+ */
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ cconvert->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ cconvert->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.40200 * x */
+ cconvert->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.77200 * x */
+ cconvert->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.71414 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+ /* Cb=>G value is scaled-up -0.34414 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the output colorspace.
+ *
+ * Note that we change from noninterleaved, one-plane-per-component format
+ * to interleaved-pixel format. The output buffer is therefore three times
+ * as wide as the input buffer.
+ * A starting row offset is provided only for the input buffer. The caller
+ * can easily adjust the passed output_buf value to accommodate any row
+ * offset required on that side.
+ */
+
+METHODDEF(void)
+ycc_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int y, cb, cr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ register int * Crrtab = cconvert->Cr_r_tab;
+ register int * Cbbtab = cconvert->Cb_b_tab;
+ register INT32 * Crgtab = cconvert->Cr_g_tab;
+ register INT32 * Cbgtab = cconvert->Cb_g_tab;
+ SHIFT_TEMPS
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ y = GETJSAMPLE(inptr0[col]);
+ cb = GETJSAMPLE(inptr1[col]);
+ cr = GETJSAMPLE(inptr2[col]);
+ /* Range-limiting is essential due to noise introduced by DCT losses. */
+ outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
+ outptr[RGB_GREEN] = range_limit[y +
+ ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+ SCALEBITS))];
+ outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/**************** Cases other than YCbCr -> RGB **************/
+
+
+/*
+ * Color conversion for no colorspace change: just copy the data,
+ * converting from separate-planes to interleaved representation.
+ */
+
+METHODDEF(void)
+null_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW inptr, outptr;
+ register JDIMENSION count;
+ register int num_components = cinfo->num_components;
+ JDIMENSION num_cols = cinfo->output_width;
+ int ci;
+
+ while (--num_rows >= 0) {
+ for (ci = 0; ci < num_components; ci++) {
+ inptr = input_buf[ci][input_row];
+ outptr = output_buf[0] + ci;
+ for (count = num_cols; count > 0; count--) {
+ *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
+ outptr += num_components;
+ }
+ }
+ input_row++;
+ output_buf++;
+ }
+}
+
+
+/*
+ * Color conversion for grayscale: just copy the data.
+ * This also works for YCbCr -> grayscale conversion, in which
+ * we just copy the Y (luminance) component and ignore chrominance.
+ */
+
+METHODDEF(void)
+grayscale_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0,
+ num_rows, cinfo->output_width);
+}
+
+
+/*
+ * Convert grayscale to RGB: just duplicate the graylevel three times.
+ * This is provided to support applications that don't want to cope
+ * with grayscale as a separate case.
+ */
+
+METHODDEF(void)
+gray_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW inptr, outptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr = input_buf[0][input_row++];
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * Adobe-style YCCK->CMYK conversion.
+ * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same
+ * conversion as above, while passing K (black) unchanged.
+ * We assume build_ycc_rgb_table has been called.
+ */
+
+METHODDEF(void)
+ycck_cmyk_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register int y, cb, cr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2, inptr3;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ register int * Crrtab = cconvert->Cr_r_tab;
+ register int * Cbbtab = cconvert->Cb_b_tab;
+ register INT32 * Crgtab = cconvert->Cr_g_tab;
+ register INT32 * Cbgtab = cconvert->Cb_g_tab;
+ SHIFT_TEMPS
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ inptr3 = input_buf[3][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ y = GETJSAMPLE(inptr0[col]);
+ cb = GETJSAMPLE(inptr1[col]);
+ cr = GETJSAMPLE(inptr2[col]);
+ /* Range-limiting is essential due to noise introduced by DCT losses. */
+ outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
+ outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
+ ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
+ SCALEBITS)))];
+ outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */
+ /* K passes through unchanged */
+ outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */
+ outptr += 4;
+ }
+ }
+}
+
+
+/*
+ * Empty method for start_pass.
+ */
+
+METHODDEF(void)
+start_pass_dcolor (j_decompress_ptr cinfo)
+{
+ /* no work needed */
+}
+
+
+/*
+ * Module initialization routine for output colorspace conversion.
+ */
+
+GLOBAL(void)
+jinit_color_deconverter (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert;
+ int ci;
+
+ cconvert = (my_cconvert_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_color_deconverter));
+ cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
+ cconvert->pub.start_pass = start_pass_dcolor;
+
+ /* Make sure num_components agrees with jpeg_color_space */
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ if (cinfo->num_components != 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ case JCS_RGB:
+ case JCS_YCbCr:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ case JCS_CMYK:
+ case JCS_YCCK:
+ if (cinfo->num_components != 4)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+
+ default: /* JCS_UNKNOWN can be anything */
+ if (cinfo->num_components < 1)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ break;
+ }
+
+ /* Set out_color_components and conversion method based on requested space.
+ * Also clear the component_needed flags for any unused components,
+ * so that earlier pipeline stages can avoid useless computation.
+ */
+
+ switch (cinfo->out_color_space) {
+ case JCS_GRAYSCALE:
+ cinfo->out_color_components = 1;
+ if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
+ cinfo->jpeg_color_space == JCS_YCbCr) {
+ cconvert->pub.color_convert = grayscale_convert;
+ /* For color->grayscale conversion, only the Y (0) component is needed */
+ for (ci = 1; ci < cinfo->num_components; ci++)
+ cinfo->comp_info[ci].component_needed = FALSE;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_RGB:
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ if (cinfo->jpeg_color_space == JCS_YCbCr) {
+ cconvert->pub.color_convert = ycc_rgb_convert;
+ build_ycc_rgb_table(cinfo);
+ } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
+ cconvert->pub.color_convert = gray_rgb_convert;
+ } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
+ cconvert->pub.color_convert = null_convert;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ case JCS_CMYK:
+ cinfo->out_color_components = 4;
+ if (cinfo->jpeg_color_space == JCS_YCCK) {
+ cconvert->pub.color_convert = ycck_cmyk_convert;
+ build_ycc_rgb_table(cinfo);
+ } else if (cinfo->jpeg_color_space == JCS_CMYK) {
+ cconvert->pub.color_convert = null_convert;
+ } else
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+
+ default:
+ /* Permit null conversion to same output space */
+ if (cinfo->out_color_space == cinfo->jpeg_color_space) {
+ cinfo->out_color_components = cinfo->num_components;
+ cconvert->pub.color_convert = null_convert;
+ } else /* unsupported non-null conversion */
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ break;
+ }
+
+ if (cinfo->quantize_colors)
+ cinfo->output_components = 1; /* single colormapped output component */
+ else
+ cinfo->output_components = cinfo->out_color_components;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
new file mode 100644
index 0000000000..811d51d51a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c
@@ -0,0 +1,272 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jddctmgr.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the inverse-DCT management logic.
+ * This code selects a particular IDCT implementation to be used,
+ * and it performs related housekeeping chores. No code in this file
+ * is executed per IDCT step, only during output pass setup.
+ *
+ * Note that the IDCT routines are responsible for performing coefficient
+ * dequantization as well as the IDCT proper. This module sets up the
+ * dequantization multiplier table needed by the IDCT routine.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+
+/*
+ * The decompressor input side (jdinput.c) saves away the appropriate
+ * quantization table for each component at the start of the first scan
+ * involving that component. (This is necessary in order to correctly
+ * decode files that reuse Q-table slots.)
+ * When we are ready to make an output pass, the saved Q-table is converted
+ * to a multiplier table that will actually be used by the IDCT routine.
+ * The multiplier table contents are IDCT-method-dependent. To support
+ * application changes in IDCT method between scans, we can remake the
+ * multiplier tables if necessary.
+ * In buffered-image mode, the first output pass may occur before any data
+ * has been seen for some components, and thus before their Q-tables have
+ * been saved away. To handle this case, multiplier tables are preset
+ * to zeroes; the result of the IDCT will be a neutral gray level.
+ */
+
+
+/* Private subobject for this module */
+
+typedef struct {
+ struct jpeg_inverse_dct pub; /* public fields */
+
+ /* This array contains the IDCT method code that each multiplier table
+ * is currently set up for, or -1 if it's not yet set up.
+ * The actual multiplier tables are pointed to by dct_table in the
+ * per-component comp_info structures.
+ */
+ int cur_method[MAX_COMPONENTS];
+} my_idct_controller;
+
+typedef my_idct_controller * my_idct_ptr;
+
+
+/* Allocated multiplier tables: big enough for any supported variant */
+
+typedef union {
+ ISLOW_MULT_TYPE islow_array[DCTSIZE2];
+#ifdef DCT_IFAST_SUPPORTED
+ IFAST_MULT_TYPE ifast_array[DCTSIZE2];
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ FLOAT_MULT_TYPE float_array[DCTSIZE2];
+#endif
+} multiplier_table;
+
+
+/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
+ * so be sure to compile that code if either ISLOW or SCALING is requested.
+ */
+#ifdef DCT_ISLOW_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#else
+#ifdef IDCT_SCALING_SUPPORTED
+#define PROVIDE_ISLOW_TABLES
+#endif
+#endif
+
+
+/*
+ * Prepare for an output pass.
+ * Here we select the proper IDCT routine for each component and build
+ * a matching multiplier table.
+ */
+
+METHODDEF(void)
+start_pass (j_decompress_ptr cinfo)
+{
+ my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
+ int ci, i;
+ jpeg_component_info *compptr;
+ int method = 0;
+ inverse_DCT_method_ptr method_ptr = NULL;
+ JQUANT_TBL * qtbl;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Select the proper IDCT routine for this component's scaling */
+ switch (compptr->DCT_scaled_size) {
+#ifdef IDCT_SCALING_SUPPORTED
+ case 1:
+ method_ptr = jpeg_idct_1x1;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+ case 2:
+ method_ptr = jpeg_idct_2x2;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+ case 4:
+ method_ptr = jpeg_idct_4x4;
+ method = JDCT_ISLOW; /* jidctred uses islow-style table */
+ break;
+#endif
+ case DCTSIZE:
+ switch (cinfo->dct_method) {
+#ifdef DCT_ISLOW_SUPPORTED
+ case JDCT_ISLOW:
+ method_ptr = jpeg_idct_islow;
+ method = JDCT_ISLOW;
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ method_ptr = jpeg_idct_ifast;
+ method = JDCT_IFAST;
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ method_ptr = jpeg_idct_float;
+ method = JDCT_FLOAT;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ break;
+ default:
+ ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
+ break;
+ }
+ idct->pub.inverse_DCT[ci] = method_ptr;
+ /* Create multiplier table from quant table.
+ * However, we can skip this if the component is uninteresting
+ * or if we already built the table. Also, if no quant table
+ * has yet been saved for the component, we leave the
+ * multiplier table all-zero; we'll be reading zeroes from the
+ * coefficient controller's buffer anyway.
+ */
+ if (! compptr->component_needed || idct->cur_method[ci] == method)
+ continue;
+ qtbl = compptr->quant_table;
+ if (qtbl == NULL) /* happens if no data yet for component */
+ continue;
+ idct->cur_method[ci] = method;
+ switch (method) {
+#ifdef PROVIDE_ISLOW_TABLES
+ case JDCT_ISLOW:
+ {
+ /* For LL&M IDCT method, multipliers are equal to raw quantization
+ * coefficients, but are stored as ints to ensure access efficiency.
+ */
+ ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ for (i = 0; i < DCTSIZE2; i++) {
+ ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
+ }
+ }
+ break;
+#endif
+#ifdef DCT_IFAST_SUPPORTED
+ case JDCT_IFAST:
+ {
+ /* For AA&N IDCT method, multipliers are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ * For integer operation, the multiplier table is to be scaled by
+ * IFAST_SCALE_BITS.
+ */
+ IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
+#define CONST_BITS 14
+ static const INT16 aanscales[DCTSIZE2] = {
+ /* precomputed values scaled up by 14 bits */
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
+ 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
+ 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
+ 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
+ 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
+ 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
+ 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
+ };
+ SHIFT_TEMPS
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ ifmtbl[i] = (IFAST_MULT_TYPE)
+ DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
+ (INT32) aanscales[i]),
+ CONST_BITS-IFAST_SCALE_BITS);
+ }
+ }
+ break;
+#endif
+#ifdef DCT_FLOAT_SUPPORTED
+ case JDCT_FLOAT:
+ {
+ /* For float AA&N IDCT method, multipliers are equal to quantization
+ * coefficients scaled by scalefactor[row]*scalefactor[col], where
+ * scalefactor[0] = 1
+ * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
+ */
+ FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
+ int row, col;
+ static const double aanscalefactor[DCTSIZE] = {
+ 1.0, 1.387039845, 1.306562965, 1.175875602,
+ 1.0, 0.785694958, 0.541196100, 0.275899379
+ };
+
+ i = 0;
+ for (row = 0; row < DCTSIZE; row++) {
+ for (col = 0; col < DCTSIZE; col++) {
+ fmtbl[i] = (FLOAT_MULT_TYPE)
+ ((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col]);
+ i++;
+ }
+ }
+ }
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+ break;
+ }
+ }
+}
+
+
+/*
+ * Initialize IDCT manager.
+ */
+
+GLOBAL(void)
+jinit_inverse_dct (j_decompress_ptr cinfo)
+{
+ my_idct_ptr idct;
+ int ci;
+ jpeg_component_info *compptr;
+
+ idct = (my_idct_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_idct_controller));
+ cinfo->idct = (struct jpeg_inverse_dct *) idct;
+ idct->pub.start_pass = start_pass;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate and pre-zero a multiplier table for each component */
+ compptr->dct_table =
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(multiplier_table));
+ MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
+ /* Mark multiplier table not yet set up for any method */
+ idct->cur_method[ci] = -1;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
new file mode 100644
index 0000000000..b724d52b95
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c
@@ -0,0 +1,657 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdhuff.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU. To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h" /* Declarations shared with jdphuff.c */
+
+#ifdef _FX_MANAGED_CODE_
+#define savable_state savable_state_d
+#endif
+
+/*
+ * Expanded entropy decoder object for Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_decoder pub; /* public fields */
+
+ /* These fields are loaded into local variables at start of each MCU.
+ * In case of suspension, we exit WITHOUT updating them.
+ */
+ bitread_perm_state bitstate; /* Bit buffer at start of MCU */
+ savable_state saved; /* Other state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
+ d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
+
+ /* Precalculated info set up by start_pass for use in decode_mcu: */
+
+ /* Pointers to derived tables to be used for each block within an MCU */
+ d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+ d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU];
+ /* Whether we care about the DC and AC coefficient values for each block */
+ boolean dc_needed[D_MAX_BLOCKS_IN_MCU];
+ boolean ac_needed[D_MAX_BLOCKS_IN_MCU];
+} huff_entropy_decoder;
+
+typedef huff_entropy_decoder * huff_entropy_ptr;
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_huff_decoder (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci, blkn, dctbl, actbl;
+ jpeg_component_info * compptr;
+
+ /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
+ * This ought to be an error condition, but we make it a warning because
+ * there are some baseline files out there with all zeroes in these bytes.
+ */
+ if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
+ cinfo->Ah != 0 || cinfo->Al != 0)
+ WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ dctbl = compptr->dc_tbl_no;
+ actbl = compptr->ac_tbl_no;
+ /* Compute derived values for Huffman tables */
+ /* We may do this more than once for a table, but it's not expensive */
+ jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl,
+ & entropy->dc_derived_tbls[dctbl]);
+ jpeg_make_d_derived_tbl(cinfo, FALSE, actbl,
+ & entropy->ac_derived_tbls[actbl]);
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Precalculate decoding info for each block in an MCU of this scan */
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ /* Precalculate which table to use for each block */
+ entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no];
+ entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no];
+ /* Decide whether we really care about the coefficient values */
+ if (compptr->component_needed) {
+ entropy->dc_needed[blkn] = TRUE;
+ /* we don't need the ACs if producing a 1/8th-size image */
+ entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1);
+ } else {
+ entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE;
+ }
+ }
+
+ /* Initialize bitread state variables */
+ entropy->bitstate.bits_left = 0;
+ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+ entropy->pub.insufficient_data = FALSE;
+
+ /* Initialize restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Compute the derived values for a Huffman table.
+ * This routine also performs some validation checks on the table.
+ *
+ * Note this is also used by jdphuff.c.
+ */
+
+GLOBAL(void)
+jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno,
+ d_derived_tbl ** pdtbl)
+{
+ JHUFF_TBL *htbl;
+ d_derived_tbl *dtbl;
+ int p, i, l, _si, numsymbols;
+ int lookbits, ctr;
+ char huffsize[257];
+ unsigned int huffcode[257];
+ unsigned int code;
+
+ /* Note that huffsize[] and huffcode[] are filled in code-length order,
+ * paralleling the order of the symbols themselves in htbl->huffval[].
+ */
+
+ /* Find the input Huffman table */
+ if (tblno < 0 || tblno >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+ htbl =
+ isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno];
+ if (htbl == NULL)
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno);
+
+ /* Allocate a workspace if we haven't already done so. */
+ if (*pdtbl == NULL)
+ *pdtbl = (d_derived_tbl *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(d_derived_tbl));
+ dtbl = *pdtbl;
+ dtbl->pub = htbl; /* fill in back link */
+
+ /* Figure C.1: make table of Huffman code length for each symbol */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ i = (int) htbl->bits[l];
+ if (i < 0 || p + i > 256) /* protect against table overrun */
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ while (i--)
+ huffsize[p++] = (char) l;
+ }
+ huffsize[p] = 0;
+ numsymbols = p;
+
+ /* Figure C.2: generate the codes themselves */
+ /* We also validate that the counts represent a legal Huffman code tree. */
+
+ code = 0;
+ _si = huffsize[0];
+ p = 0;
+ while (huffsize[p]) {
+ while (((int) huffsize[p]) == _si) {
+ huffcode[p++] = code;
+ code++;
+ }
+ /* code is now 1 more than the last code used for codelength si; but
+ * it must still fit in si bits, since no code is allowed to be all ones.
+ */
+ if (((INT32) code) >= (((INT32) 1) << _si))
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ code <<= 1;
+ _si++;
+ }
+
+ /* Figure F.15: generate decoding tables for bit-sequential decoding */
+
+ p = 0;
+ for (l = 1; l <= 16; l++) {
+ if (htbl->bits[l]) {
+ /* valoffset[l] = huffval[] index of 1st symbol of code length l,
+ * minus the minimum code of length l
+ */
+ dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p];
+ p += htbl->bits[l];
+ dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */
+ } else {
+ dtbl->maxcode[l] = -1; /* -1 if no codes of this length */
+ }
+ }
+ dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */
+
+ /* Compute lookahead tables to speed up decoding.
+ * First we set all the table entries to 0, indicating "too long";
+ * then we iterate through the Huffman codes that are short enough and
+ * fill in all the entries that correspond to bit sequences starting
+ * with that code.
+ */
+
+ MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits));
+
+ p = 0;
+ for (l = 1; l <= HUFF_LOOKAHEAD; l++) {
+ for (i = 1; i <= (int) htbl->bits[l]; i++, p++) {
+ /* l = current code's length, p = its index in huffcode[] & huffval[]. */
+ /* Generate left-justified code followed by all possible bit sequences */
+ lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l);
+ for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) {
+ dtbl->look_nbits[lookbits] = l;
+ dtbl->look_sym[lookbits] = htbl->huffval[p];
+ lookbits++;
+ }
+ }
+ }
+
+ /* Validate symbols as being reasonable.
+ * For AC tables, we make no check, but accept all byte values 0..255.
+ * For DC tables, we require the symbols to be in range 0..15.
+ * (Tighter bounds could be applied depending on the data depth and mode,
+ * but this is sufficient to ensure safe decoding.)
+ */
+ if (isDC) {
+ for (i = 0; i < numsymbols; i++) {
+ int sym = htbl->huffval[i];
+ if (sym < 0 || sym > 15)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ }
+ }
+}
+
+
+/*
+ * Out-of-line code for bit fetching (shared with jdphuff.c).
+ * See jdhuff.h for info about usage.
+ * Note: current values of get_buffer and bits_left are passed as parameters,
+ * but are returned in the corresponding fields of the state struct.
+ *
+ * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width
+ * of get_buffer to be used. (On machines with wider words, an even larger
+ * buffer could be used.) However, on some machines 32-bit shifts are
+ * quite slow and take time proportional to the number of places shifted.
+ * (This is true with most PC compilers, for instance.) In this case it may
+ * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the
+ * average shift distance at the cost of more calls to jpeg_fill_bit_buffer.
+ */
+
+#ifdef SLOW_SHIFT_32
+#define MIN_GET_BITS 15 /* minimum allowable value */
+#else
+#define MIN_GET_BITS (BIT_BUF_SIZE-7)
+#endif
+
+
+GLOBAL(boolean)
+jpeg_fill_bit_buffer (bitread_working_state * state,
+ register bit_buf_type get_buffer, register int bits_left,
+ int nbits)
+/* Load up the bit buffer to a depth of at least nbits */
+{
+ /* Copy heavily used state fields into locals (hopefully registers) */
+ register const JOCTET * next_input_byte = state->next_input_byte;
+ register size_t bytes_in_buffer = state->bytes_in_buffer;
+ j_decompress_ptr cinfo = state->cinfo;
+
+ /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */
+ /* (It is assumed that no request will be for more than that many bits.) */
+ /* We fail to do so only if we hit a marker or are forced to suspend. */
+
+ if (cinfo->unread_marker == 0) { /* cannot advance past a marker */
+ while (bits_left < MIN_GET_BITS) {
+ register int c;
+
+ /* Attempt to read a byte */
+ if (bytes_in_buffer == 0) {
+ if (! (*cinfo->src->fill_input_buffer) (cinfo))
+ return FALSE;
+ next_input_byte = cinfo->src->next_input_byte;
+ bytes_in_buffer = cinfo->src->bytes_in_buffer;
+ }
+ bytes_in_buffer--;
+ c = GETJOCTET(*next_input_byte++);
+
+ /* If it's 0xFF, check and discard stuffed zero byte */
+ if (c == 0xFF) {
+ /* Loop here to discard any padding FF's on terminating marker,
+ * so that we can save a valid unread_marker value. NOTE: we will
+ * accept multiple FF's followed by a 0 as meaning a single FF data
+ * byte. This data pattern is not valid according to the standard.
+ */
+ do {
+ if (bytes_in_buffer == 0) {
+ if (! (*cinfo->src->fill_input_buffer) (cinfo))
+ return FALSE;
+ next_input_byte = cinfo->src->next_input_byte;
+ bytes_in_buffer = cinfo->src->bytes_in_buffer;
+ }
+ bytes_in_buffer--;
+ c = GETJOCTET(*next_input_byte++);
+ } while (c == 0xFF);
+
+ if (c == 0) {
+ /* Found FF/00, which represents an FF data byte */
+ c = 0xFF;
+ } else {
+ /* Oops, it's actually a marker indicating end of compressed data.
+ * Save the marker code for later use.
+ * Fine point: it might appear that we should save the marker into
+ * bitread working state, not straight into permanent state. But
+ * once we have hit a marker, we cannot need to suspend within the
+ * current MCU, because we will read no more bytes from the data
+ * source. So it is OK to update permanent state right away.
+ */
+ cinfo->unread_marker = c;
+ /* See if we need to insert some fake zero bits. */
+ goto no_more_bytes;
+ }
+ }
+
+ /* OK, load c into get_buffer */
+ get_buffer = (get_buffer << 8) | c;
+ bits_left += 8;
+ } /* end while */
+ } else {
+ no_more_bytes:
+ /* We get here if we've read the marker that terminates the compressed
+ * data segment. There should be enough bits in the buffer register
+ * to satisfy the request; if so, no problem.
+ */
+ if (nbits > bits_left) {
+ /* Uh-oh. Report corrupted data to user and stuff zeroes into
+ * the data stream, so that we can produce some kind of image.
+ * We use a nonvolatile flag to ensure that only one warning message
+ * appears per data segment.
+ */
+ if (! cinfo->entropy->insufficient_data) {
+ WARNMS(cinfo, JWRN_HIT_MARKER);
+ cinfo->entropy->insufficient_data = TRUE;
+ }
+ /* Fill the buffer with zero bits */
+ get_buffer <<= MIN_GET_BITS - bits_left;
+ bits_left = MIN_GET_BITS;
+ }
+ }
+
+ /* Unload the local registers */
+ state->next_input_byte = next_input_byte;
+ state->bytes_in_buffer = bytes_in_buffer;
+ state->get_buffer = get_buffer;
+ state->bits_left = bits_left;
+
+ return TRUE;
+}
+
+
+/*
+ * Out-of-line code for Huffman code decoding.
+ * See jdhuff.h for info about usage.
+ */
+
+GLOBAL(int)
+jpeg_huff_decode (bitread_working_state * state,
+ register bit_buf_type get_buffer, register int bits_left,
+ d_derived_tbl * htbl, int min_bits)
+{
+ register int l = min_bits;
+ register INT32 code;
+
+ /* HUFF_DECODE has determined that the code is at least min_bits */
+ /* bits long, so fetch that many bits in one swoop. */
+
+ CHECK_BIT_BUFFER(*state, l, return -1);
+ code = GET_BITS(l);
+
+ /* Collect the rest of the Huffman code one bit at a time. */
+ /* This is per Figure F.16 in the JPEG spec. */
+
+ while (code > htbl->maxcode[l]) {
+ code <<= 1;
+ CHECK_BIT_BUFFER(*state, 1, return -1);
+ code |= GET_BITS(1);
+ l++;
+ }
+
+ /* Unload the local registers */
+ state->get_buffer = get_buffer;
+ state->bits_left = bits_left;
+
+ /* With garbage input we may reach the sentinel value l = 17. */
+
+ if (l > 16) {
+ WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE);
+ return 0; /* fake a zero as the safest result */
+ }
+
+ return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ];
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] = /* entry n is 2**(n-1) */
+ { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+ { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+ ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+ ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+ ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int ci;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+
+ /* Advance past the RSTn marker */
+ if (! (*cinfo->marker->read_restart_marker) (cinfo))
+ return FALSE;
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+
+ /* Reset restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+
+ /* Reset out-of-data flag, unless read_restart_marker left us smack up
+ * against a marker. In that case we will end up treating the next data
+ * segment as empty, and we can avoid producing bogus output pixels by
+ * leaving the flag set.
+ */
+ if (cinfo->unread_marker == 0)
+ entropy->pub.insufficient_data = FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Decode and return one MCU's worth of Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER.
+ * (Wholesale zeroing is usually a little faster than retail...)
+ *
+ * Returns FALSE if data source requested suspension. In that case no
+ * changes have been made to permanent state. (Exception: some output
+ * coefficients may already have been assigned. This is harmless for
+ * this module, since we'll just re-assign them on the next call.)
+ */
+
+METHODDEF(boolean)
+decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ int blkn;
+ BITREAD_STATE_VARS;
+ savable_state state;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(state, entropy->saved);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ JBLOCKROW block = MCU_data[blkn];
+ d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn];
+ d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn];
+ register int s, k, r;
+
+ /* Decode a single block's worth of coefficients */
+
+ /* Section F.2.2.1: decode the DC coefficient difference */
+ HUFF_DECODE(s, br_state, dctbl, return FALSE, label1);
+ if (s) {
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ }
+
+ if (entropy->dc_needed[blkn]) {
+ /* Convert DC difference to actual value, update last_dc_val */
+ int ci = cinfo->MCU_membership[blkn];
+ s += state.last_dc_val[ci];
+ state.last_dc_val[ci] = s;
+ /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */
+ (*block)[0] = (JCOEF) s;
+ }
+
+ if (entropy->ac_needed[blkn]) {
+
+ /* Section F.2.2.2: decode the AC coefficients */
+ /* Since zeroes are skipped, output area must be cleared beforehand */
+ for (k = 1; k < DCTSIZE2; k++) {
+ HUFF_DECODE(s, br_state, actbl, return FALSE, label2);
+
+ r = s >> 4;
+ s &= 15;
+
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ /* Output coefficient in natural (dezigzagged) order.
+ * Note: the extra entries in jpeg_natural_order[] will save us
+ * if k >= DCTSIZE2, which could happen if the data is corrupted.
+ */
+ (*block)[jpeg_natural_order[k]] = (JCOEF) s;
+ } else {
+ if (r != 15)
+ break;
+ k += 15;
+ }
+ }
+
+ } else {
+
+ /* Section F.2.2.2: decode the AC coefficients */
+ /* In this path we just discard the values */
+ for (k = 1; k < DCTSIZE2; k++) {
+ HUFF_DECODE(s, br_state, actbl, return FALSE, label3);
+
+ r = s >> 4;
+ s &= 15;
+
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ DROP_BITS(s);
+ } else {
+ if (r != 15)
+ break;
+ k += 15;
+ }
+ }
+
+ }
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(entropy->saved, state);
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * Module initialization routine for Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_huff_decoder (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy;
+ int i;
+
+ entropy = (huff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(huff_entropy_decoder));
+ cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ entropy->pub.start_pass = start_pass_huff_decoder;
+ entropy->pub.decode_mcu = decode_mcu;
+
+ /* Mark tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
new file mode 100644
index 0000000000..46a7efce2e
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdinput.c
@@ -0,0 +1,384 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdinput.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains input control logic for the JPEG decompressor.
+ * These routines are concerned with controlling the decompressor's input
+ * processing (marker reading and coefficient decoding). The actual input
+ * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_input_controller pub; /* public fields */
+
+ boolean inheaders; /* TRUE until first SOS is reached */
+} my_input_controller;
+
+typedef my_input_controller * my_inputctl_ptr;
+
+
+/* Forward declarations */
+METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Routines to calculate various quantities related to the size of the image.
+ */
+
+LOCAL(void)
+initial_setup (j_decompress_ptr cinfo)
+/* Called once, when first SOS marker is reached */
+{
+ int ci;
+ jpeg_component_info *compptr;
+
+ /* Make sure image isn't bigger than I can handle */
+ if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
+ (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Check that number of components won't exceed internal array sizes */
+ if (cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+
+ /* Compute maximum sampling factors; check factor validity */
+ cinfo->max_h_samp_factor = 1;
+ cinfo->max_v_samp_factor = 1;
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
+ compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
+ ERREXIT(cinfo, JERR_BAD_SAMPLING);
+ cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
+ compptr->h_samp_factor);
+ cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
+ compptr->v_samp_factor);
+ }
+
+ /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
+ * In the full decompressor, this will be overridden by jdmaster.c;
+ * but in the transcoder, jdmaster.c is not used, so we must do it here.
+ */
+ cinfo->min_DCT_scaled_size = DCTSIZE;
+
+ /* Compute dimensions of components */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ compptr->DCT_scaled_size = DCTSIZE;
+ /* Size in DCT blocks */
+ compptr->width_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->height_in_blocks = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ /* downsampled_width and downsampled_height will also be overridden by
+ * jdmaster.c if we are doing full decompression. The transcoder library
+ * doesn't use these values, but the calling application might.
+ */
+ /* Size in samples */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
+ (long) cinfo->max_h_samp_factor);
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
+ (long) cinfo->max_v_samp_factor);
+ /* Mark component needed, until color conversion says otherwise */
+ compptr->component_needed = TRUE;
+ /* Mark no quantization table yet saved for component */
+ compptr->quant_table = NULL;
+ }
+
+ /* Compute number of fully interleaved MCU rows. */
+ cinfo->total_iMCU_rows = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ /* Decide whether file contains multiple scans */
+ if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
+ cinfo->inputctl->has_multiple_scans = TRUE;
+ else
+ cinfo->inputctl->has_multiple_scans = FALSE;
+}
+
+
+LOCAL(void)
+per_scan_setup (j_decompress_ptr cinfo)
+/* Do computations that are needed before processing a JPEG scan */
+/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
+{
+ int ci, mcublks, tmp;
+ jpeg_component_info *compptr;
+
+ if (cinfo->comps_in_scan == 1) {
+
+ /* Noninterleaved (single-component) scan */
+ compptr = cinfo->cur_comp_info[0];
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = compptr->width_in_blocks;
+ cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
+
+ /* For noninterleaved scan, always one block per MCU */
+ compptr->MCU_width = 1;
+ compptr->MCU_height = 1;
+ compptr->MCU_blocks = 1;
+ compptr->MCU_sample_width = compptr->DCT_scaled_size;
+ compptr->last_col_width = 1;
+ /* For noninterleaved scans, it is convenient to define last_row_height
+ * as the number of block rows present in the last iMCU row.
+ */
+ tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
+ if (tmp == 0) tmp = compptr->v_samp_factor;
+ compptr->last_row_height = tmp;
+
+ /* Prepare array describing MCU composition */
+ cinfo->blocks_in_MCU = 1;
+ cinfo->MCU_membership[0] = 0;
+
+ } else {
+
+ /* Interleaved (multi-component) scan */
+ if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
+ MAX_COMPS_IN_SCAN);
+
+ /* Overall image size in MCUs */
+ cinfo->MCUs_per_row = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width,
+ (long) (cinfo->max_h_samp_factor*DCTSIZE));
+ cinfo->MCU_rows_in_scan = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height,
+ (long) (cinfo->max_v_samp_factor*DCTSIZE));
+
+ cinfo->blocks_in_MCU = 0;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Sampling factors give # of blocks of component in each MCU */
+ compptr->MCU_width = compptr->h_samp_factor;
+ compptr->MCU_height = compptr->v_samp_factor;
+ compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
+ compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size;
+ /* Figure number of non-dummy blocks in last MCU column & row */
+ tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
+ if (tmp == 0) tmp = compptr->MCU_width;
+ compptr->last_col_width = tmp;
+ tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
+ if (tmp == 0) tmp = compptr->MCU_height;
+ compptr->last_row_height = tmp;
+ /* Prepare array describing MCU composition */
+ mcublks = compptr->MCU_blocks;
+ if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
+ ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
+ while (mcublks-- > 0) {
+ cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
+ }
+ }
+
+ }
+}
+
+
+/*
+ * Save away a copy of the Q-table referenced by each component present
+ * in the current scan, unless already saved during a prior scan.
+ *
+ * In a multiple-scan JPEG file, the encoder could assign different components
+ * the same Q-table slot number, but change table definitions between scans
+ * so that each component uses a different Q-table. (The IJG encoder is not
+ * currently capable of doing this, but other encoders might.) Since we want
+ * to be able to dequantize all the components at the end of the file, this
+ * means that we have to save away the table actually used for each component.
+ * We do this by copying the table at the start of the first scan containing
+ * the component.
+ * The JPEG spec prohibits the encoder from changing the contents of a Q-table
+ * slot between scans of a component using that slot. If the encoder does so
+ * anyway, this decoder will simply use the Q-table values that were current
+ * at the start of the first scan for the component.
+ *
+ * The decompressor output side looks only at the saved quant tables,
+ * not at the current Q-table slots.
+ */
+
+LOCAL(void)
+latch_quant_tables (j_decompress_ptr cinfo)
+{
+ int ci, qtblno;
+ jpeg_component_info *compptr;
+ JQUANT_TBL * qtbl;
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* No work if we already saved Q-table for this component */
+ if (compptr->quant_table != NULL)
+ continue;
+ /* Make sure specified quantization table is present */
+ qtblno = compptr->quant_tbl_no;
+ if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
+ cinfo->quant_tbl_ptrs[qtblno] == NULL)
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
+ /* OK, save away the quantization table */
+ qtbl = (JQUANT_TBL *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(JQUANT_TBL));
+ MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
+ compptr->quant_table = qtbl;
+ }
+}
+
+
+/*
+ * Initialize the input modules to read a scan of compressed data.
+ * The first call to this is done by jdmaster.c after initializing
+ * the entire decompressor (during jpeg_start_decompress).
+ * Subsequent calls come from consume_markers, below.
+ */
+
+METHODDEF(void)
+start_input_pass (j_decompress_ptr cinfo)
+{
+ per_scan_setup(cinfo);
+ latch_quant_tables(cinfo);
+ (*cinfo->entropy->start_pass) (cinfo);
+ (*cinfo->coef->start_input_pass) (cinfo);
+ cinfo->inputctl->consume_input = cinfo->coef->consume_data;
+}
+
+
+/*
+ * Finish up after inputting a compressed-data scan.
+ * This is called by the coefficient controller after it's read all
+ * the expected data of the scan.
+ */
+
+METHODDEF(void)
+finish_input_pass (j_decompress_ptr cinfo)
+{
+ cinfo->inputctl->consume_input = consume_markers;
+}
+
+
+/*
+ * Read JPEG markers before, between, or after compressed-data scans.
+ * Change state as necessary when a new scan is reached.
+ * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ *
+ * The consume_input method pointer points either here or to the
+ * coefficient controller's consume_data routine, depending on whether
+ * we are reading a compressed data segment or inter-segment markers.
+ */
+
+METHODDEF(int)
+consume_markers (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+ int val;
+
+ if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
+ return JPEG_REACHED_EOI;
+
+ val = (*cinfo->marker->read_markers) (cinfo);
+
+ switch (val) {
+ case JPEG_REACHED_SOS: /* Found SOS */
+ if (inputctl->inheaders) { /* 1st SOS */
+ initial_setup(cinfo);
+ inputctl->inheaders = FALSE;
+ /* Note: start_input_pass must be called by jdmaster.c
+ * before any more input can be consumed. jdapimin.c is
+ * responsible for enforcing this sequencing.
+ */
+ } else { /* 2nd or later SOS marker */
+ if (! inputctl->pub.has_multiple_scans)
+ ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
+ start_input_pass(cinfo);
+ }
+ break;
+ case JPEG_REACHED_EOI: /* Found EOI */
+ inputctl->pub.eoi_reached = TRUE;
+ if (inputctl->inheaders) { /* Tables-only datastream, apparently */
+ if (cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOF_NO_SOS);
+ } else {
+ /* Prevent infinite loop in coef ctlr's decompress_data routine
+ * if user set output_scan_number larger than number of scans.
+ */
+ if (cinfo->output_scan_number > cinfo->input_scan_number)
+ cinfo->output_scan_number = cinfo->input_scan_number;
+ }
+ break;
+ case JPEG_SUSPENDED:
+ break;
+ }
+
+ return val;
+}
+
+
+/*
+ * Reset state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_input_controller (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
+
+ inputctl->pub.consume_input = consume_markers;
+ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+ inputctl->pub.eoi_reached = FALSE;
+ inputctl->inheaders = TRUE;
+ /* Reset other modules */
+ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
+ (*cinfo->marker->reset_marker_reader) (cinfo);
+ /* Reset progression state -- would be cleaner if entropy decoder did this */
+ cinfo->coef_bits = NULL;
+}
+
+
+/*
+ * Initialize the input controller module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_input_controller (j_decompress_ptr cinfo)
+{
+ my_inputctl_ptr inputctl;
+
+ /* Create subobject in permanent pool */
+ inputctl = (my_inputctl_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_input_controller));
+ cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
+ /* Initialize method pointers */
+ inputctl->pub.consume_input = consume_markers;
+ inputctl->pub.reset_input_controller = reset_input_controller;
+ inputctl->pub.start_input_pass = start_input_pass;
+ inputctl->pub.finish_input_pass = finish_input_pass;
+ /* Initialize state: can't use reset_input_controller since we don't
+ * want to try to reset other modules yet.
+ */
+ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
+ inputctl->pub.eoi_reached = FALSE;
+ inputctl->inheaders = TRUE;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
new file mode 100644
index 0000000000..0fc77c7c17
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c
@@ -0,0 +1,515 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmainct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the main buffer controller for decompression.
+ * The main buffer lies between the JPEG decompressor proper and the
+ * post-processor; it holds downsampled data in the JPEG colorspace.
+ *
+ * Note that this code is bypassed in raw-data mode, since the application
+ * supplies the equivalent of the main buffer in that case.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * In the current system design, the main buffer need never be a full-image
+ * buffer; any full-height buffers will be found inside the coefficient or
+ * postprocessing controllers. Nonetheless, the main controller is not
+ * trivial. Its responsibility is to provide context rows for upsampling/
+ * rescaling, and doing this in an efficient fashion is a bit tricky.
+ *
+ * Postprocessor input data is counted in "row groups". A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component. (We require DCT_scaled_size values to be
+ * chosen such that these numbers are integers. In practice DCT_scaled_size
+ * values will likely be powers of two, so we actually have the stronger
+ * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
+ * Upsampling will typically produce max_v_samp_factor pixel rows from each
+ * row group (times any additional scale factor that the upsampler is
+ * applying).
+ *
+ * The coefficient controller will deliver data to us one iMCU row at a time;
+ * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
+ * exactly min_DCT_scaled_size row groups. (This amount of data corresponds
+ * to one row of MCUs when the image is fully interleaved.) Note that the
+ * number of sample rows varies across components, but the number of row
+ * groups does not. Some garbage sample rows may be included in the last iMCU
+ * row at the bottom of the image.
+ *
+ * Depending on the vertical scaling algorithm used, the upsampler may need
+ * access to the sample row(s) above and below its current input row group.
+ * The upsampler is required to set need_context_rows TRUE at global selection
+ * time if so. When need_context_rows is FALSE, this controller can simply
+ * obtain one iMCU row at a time from the coefficient controller and dole it
+ * out as row groups to the postprocessor.
+ *
+ * When need_context_rows is TRUE, this controller guarantees that the buffer
+ * passed to postprocessing contains at least one row group's worth of samples
+ * above and below the row group(s) being processed. Note that the context
+ * rows "above" the first passed row group appear at negative row offsets in
+ * the passed buffer. At the top and bottom of the image, the required
+ * context rows are manufactured by duplicating the first or last real sample
+ * row; this avoids having special cases in the upsampling inner loops.
+ *
+ * The amount of context is fixed at one row group just because that's a
+ * convenient number for this controller to work with. The existing
+ * upsamplers really only need one sample row of context. An upsampler
+ * supporting arbitrary output rescaling might wish for more than one row
+ * group of context when shrinking the image; tough, we don't handle that.
+ * (This is justified by the assumption that downsizing will be handled mostly
+ * by adjusting the DCT_scaled_size values, so that the actual scale factor at
+ * the upsample step needn't be much less than one.)
+ *
+ * To provide the desired context, we have to retain the last two row groups
+ * of one iMCU row while reading in the next iMCU row. (The last row group
+ * can't be processed until we have another row group for its below-context,
+ * and so we have to save the next-to-last group too for its above-context.)
+ * We could do this most simply by copying data around in our buffer, but
+ * that'd be very slow. We can avoid copying any data by creating a rather
+ * strange pointer structure. Here's how it works. We allocate a workspace
+ * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
+ * of row groups per iMCU row). We create two sets of redundant pointers to
+ * the workspace. Labeling the physical row groups 0 to M+1, the synthesized
+ * pointer lists look like this:
+ * M+1 M-1
+ * master pointer --> 0 master pointer --> 0
+ * 1 1
+ * ... ...
+ * M-3 M-3
+ * M-2 M
+ * M-1 M+1
+ * M M-2
+ * M+1 M-1
+ * 0 0
+ * We read alternate iMCU rows using each master pointer; thus the last two
+ * row groups of the previous iMCU row remain un-overwritten in the workspace.
+ * The pointer lists are set up so that the required context rows appear to
+ * be adjacent to the proper places when we pass the pointer lists to the
+ * upsampler.
+ *
+ * The above pictures describe the normal state of the pointer lists.
+ * At top and bottom of the image, we diddle the pointer lists to duplicate
+ * the first or last sample row as necessary (this is cheaper than copying
+ * sample rows around).
+ *
+ * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that
+ * situation each iMCU row provides only one row group so the buffering logic
+ * must be different (eg, we must read two iMCU rows before we can emit the
+ * first row group). For now, we simply do not support providing context
+ * rows when min_DCT_scaled_size is 1. That combination seems unlikely to
+ * be worth providing --- if someone wants a 1/8th-size preview, they probably
+ * want it quick and dirty, so a context-free upsampler is sufficient.
+ */
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_main_controller pub; /* public fields */
+
+ /* Pointer to allocated workspace (M or M+2 row groups). */
+ JSAMPARRAY buffer[MAX_COMPONENTS];
+
+ boolean buffer_full; /* Have we gotten an iMCU row from decoder? */
+ JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */
+
+ /* Remaining fields are only used in the context case. */
+
+ /* These are the master pointers to the funny-order pointer lists. */
+ JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */
+
+ int whichptr; /* indicates which pointer set is now in use */
+ int context_state; /* process_data state machine status */
+ JDIMENSION rowgroups_avail; /* row groups available to postprocessor */
+ JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */
+} my_main_controller;
+
+typedef my_main_controller * my_main_ptr;
+
+/* context_state values: */
+#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */
+#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */
+#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */
+
+
+/* Forward declarations */
+METHODDEF(void) process_data_simple_main
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+METHODDEF(void) process_data_context_main
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) process_data_crank_post
+ JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
+#endif
+
+
+LOCAL(void)
+alloc_funny_pointers (j_decompress_ptr cinfo)
+/* Allocate space for the funny pointer lists.
+ * This is done only once, not once per pass.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf;
+
+ /* Get top-level space for component array pointers.
+ * We alloc both arrays with one call to save a few cycles.
+ */
+ main->xbuffer[0] = (JSAMPIMAGE)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
+ main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ /* Get space for pointer lists --- M+4 row groups in each list.
+ * We alloc both pointer lists with one call to save a few cycles.
+ */
+ xbuf = (JSAMPARRAY)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
+ xbuf += rgroup; /* want one row group at negative offsets */
+ main->xbuffer[0][ci] = xbuf;
+ xbuf += rgroup * (M + 4);
+ main->xbuffer[1][ci] = xbuf;
+ }
+}
+
+
+LOCAL(void)
+make_funny_pointers (j_decompress_ptr cinfo)
+/* Create the funny pointer lists discussed in the comments above.
+ * The actual workspace is already allocated (in main->buffer),
+ * and the space for the pointer lists is allocated too.
+ * This routine just fills in the curiously ordered lists.
+ * This will be repeated at the beginning of each pass.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY buf, xbuf0, xbuf1;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ xbuf0 = main->xbuffer[0][ci];
+ xbuf1 = main->xbuffer[1][ci];
+ /* First copy the workspace pointers as-is */
+ buf = main->buffer[ci];
+ for (i = 0; i < rgroup * (M + 2); i++) {
+ xbuf0[i] = xbuf1[i] = buf[i];
+ }
+ /* In the second list, put the last four row groups in swapped order */
+ for (i = 0; i < rgroup * 2; i++) {
+ xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
+ xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
+ }
+ /* The wraparound pointers at top and bottom will be filled later
+ * (see set_wraparound_pointers, below). Initially we want the "above"
+ * pointers to duplicate the first actual data line. This only needs
+ * to happen in xbuffer[0].
+ */
+ for (i = 0; i < rgroup; i++) {
+ xbuf0[i - rgroup] = xbuf0[0];
+ }
+ }
+}
+
+
+LOCAL(void)
+set_wraparound_pointers (j_decompress_ptr cinfo)
+/* Set up the "wraparound" pointers at top and bottom of the pointer lists.
+ * This changes the pointer list state from top-of-image to the normal state.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup;
+ int M = cinfo->min_DCT_scaled_size;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf0, xbuf1;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ xbuf0 = main->xbuffer[0][ci];
+ xbuf1 = main->xbuffer[1][ci];
+ for (i = 0; i < rgroup; i++) {
+ xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
+ xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
+ xbuf0[rgroup*(M+2) + i] = xbuf0[i];
+ xbuf1[rgroup*(M+2) + i] = xbuf1[i];
+ }
+ }
+}
+
+
+LOCAL(void)
+set_bottom_pointers (j_decompress_ptr cinfo)
+/* Change the pointer lists to duplicate the last sample row at the bottom
+ * of the image. whichptr indicates which xbuffer holds the final iMCU row.
+ * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
+ */
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ int ci, i, rgroup, iMCUheight, rows_left;
+ jpeg_component_info *compptr;
+ JSAMPARRAY xbuf;
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Count sample rows in one iMCU row and in one row group */
+ iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
+ rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
+ /* Count nondummy sample rows remaining for this component */
+ rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
+ if (rows_left == 0) rows_left = iMCUheight;
+ /* Count nondummy row groups. Should get same answer for each component,
+ * so we need only do it once.
+ */
+ if (ci == 0) {
+ main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
+ }
+ /* Duplicate the last real sample row rgroup*2 times; this pads out the
+ * last partial rowgroup and ensures at least one full rowgroup of context.
+ */
+ xbuf = main->xbuffer[main->whichptr][ci];
+ for (i = 0; i < rgroup * 2; i++) {
+ xbuf[rows_left + i] = xbuf[rows_left-1];
+ }
+ }
+}
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (cinfo->upsample->need_context_rows) {
+ main->pub.process_data = process_data_context_main;
+ make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
+ main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
+ main->context_state = CTX_PREPARE_FOR_IMCU;
+ main->iMCU_row_ctr = 0;
+ } else {
+ /* Simple case with no context needed */
+ main->pub.process_data = process_data_simple_main;
+ }
+ main->buffer_full = FALSE; /* Mark buffer empty */
+ main->rowgroup_ctr = 0;
+ break;
+#ifdef QUANT_2PASS_SUPPORTED
+ case JBUF_CRANK_DEST:
+ /* For last pass of 2-pass quantization, just crank the postprocessor */
+ main->pub.process_data = process_data_crank_post;
+ break;
+#endif
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This handles the simple case where no context is required.
+ */
+
+METHODDEF(void)
+process_data_simple_main (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+ JDIMENSION rowgroups_avail;
+
+ /* Read input data if we haven't filled the main buffer yet */
+ if (! main->buffer_full) {
+ if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
+ return; /* suspension forced, can do nothing more */
+ main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ }
+
+ /* There are always min_DCT_scaled_size row groups in an iMCU row. */
+ rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
+ /* Note: at the bottom of the image, we may pass extra garbage row groups
+ * to the postprocessor. The postprocessor has to check for bottom
+ * of image anyway (at row resolution), so no point in us doing it too.
+ */
+
+ /* Feed the postprocessor */
+ (*cinfo->post->post_process_data) (cinfo, main->buffer,
+ &main->rowgroup_ctr, rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+
+ /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
+ if (main->rowgroup_ctr >= rowgroups_avail) {
+ main->buffer_full = FALSE;
+ main->rowgroup_ctr = 0;
+ }
+}
+
+
+/*
+ * Process some data.
+ * This handles the case where context rows must be provided.
+ */
+
+METHODDEF(void)
+process_data_context_main (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_main_ptr main = (my_main_ptr) cinfo->main;
+
+ /* Read input data if we haven't filled the main buffer yet */
+ if (! main->buffer_full) {
+ if (! (*cinfo->coef->decompress_data) (cinfo,
+ main->xbuffer[main->whichptr]))
+ return; /* suspension forced, can do nothing more */
+ main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ main->iMCU_row_ctr++; /* count rows received */
+ }
+
+ /* Postprocessor typically will not swallow all the input data it is handed
+ * in one call (due to filling the output buffer first). Must be prepared
+ * to exit and restart. This switch lets us keep track of how far we got.
+ * Note that each case falls through to the next on successful completion.
+ */
+ switch (main->context_state) {
+ case CTX_POSTPONED_ROW:
+ /* Call postprocessor using previously set pointers for postponed row */
+ (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
+ &main->rowgroup_ctr, main->rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+ if (main->rowgroup_ctr < main->rowgroups_avail)
+ return; /* Need to suspend */
+ main->context_state = CTX_PREPARE_FOR_IMCU;
+ if (*out_row_ctr >= out_rows_avail)
+ return; /* Postprocessor exactly filled output buf */
+ /*FALLTHROUGH*/
+ case CTX_PREPARE_FOR_IMCU:
+ /* Prepare to process first M-1 row groups of this iMCU row */
+ main->rowgroup_ctr = 0;
+ main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
+ /* Check for bottom of image: if so, tweak pointers to "duplicate"
+ * the last sample row, and adjust rowgroups_avail to ignore padding rows.
+ */
+ if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
+ set_bottom_pointers(cinfo);
+ main->context_state = CTX_PROCESS_IMCU;
+ /*FALLTHROUGH*/
+ case CTX_PROCESS_IMCU:
+ /* Call postprocessor using previously set pointers */
+ (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
+ &main->rowgroup_ctr, main->rowgroups_avail,
+ output_buf, out_row_ctr, out_rows_avail);
+ if (main->rowgroup_ctr < main->rowgroups_avail)
+ return; /* Need to suspend */
+ /* After the first iMCU, change wraparound pointers to normal state */
+ if (main->iMCU_row_ctr == 1)
+ set_wraparound_pointers(cinfo);
+ /* Prepare to load new iMCU row using other xbuffer list */
+ main->whichptr ^= 1; /* 0=>1 or 1=>0 */
+ main->buffer_full = FALSE;
+ /* Still need to process last row group of this iMCU row, */
+ /* which is saved at index M+1 of the other xbuffer */
+ main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
+ main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
+ main->context_state = CTX_POSTPONED_ROW;
+ }
+}
+
+
+/*
+ * Process some data.
+ * Final pass of two-pass quantization: just call the postprocessor.
+ * Source data will be the postprocessor controller's internal buffer.
+ */
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+METHODDEF(void)
+process_data_crank_post (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
+ (JDIMENSION *) NULL, (JDIMENSION) 0,
+ output_buf, out_row_ctr, out_rows_avail);
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize main buffer controller.
+ */
+
+GLOBAL(void)
+jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_main_ptr main;
+ int ci, rgroup, ngroups;
+ jpeg_component_info *compptr;
+
+ main = (my_main_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_main_controller));
+ cinfo->main = (struct jpeg_d_main_controller *) main;
+ main->pub.start_pass = start_pass_main;
+
+ if (need_full_buffer) /* shouldn't happen */
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+
+ /* Allocate the workspace.
+ * ngroups is the number of row groups we need.
+ */
+ if (cinfo->upsample->need_context_rows) {
+ if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
+ ERREXIT(cinfo, JERR_NOTIMPL);
+ alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
+ ngroups = cinfo->min_DCT_scaled_size + 2;
+ } else {
+ ngroups = cinfo->min_DCT_scaled_size;
+ }
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size; /* height of a row group of component */
+ main->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * compptr->DCT_scaled_size,
+ (JDIMENSION) (rgroup * ngroups));
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
new file mode 100644
index 0000000000..60f2139f58
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c
@@ -0,0 +1,1396 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmarker.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains routines to decode JPEG datastream markers.
+ * Most of the complexity arises from our desire to support input
+ * suspension: if not all of the data for a marker is available,
+ * we must exit back to the application. On resumption, we reprocess
+ * the marker.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+typedef enum { /* JPEG marker codes */
+ M_SOF0 = 0xc0,
+ M_SOF1 = 0xc1,
+ M_SOF2 = 0xc2,
+ M_SOF3 = 0xc3,
+
+ M_SOF5 = 0xc5,
+ M_SOF6 = 0xc6,
+ M_SOF7 = 0xc7,
+
+ M_JPG = 0xc8,
+ M_SOF9 = 0xc9,
+ M_SOF10 = 0xca,
+ M_SOF11 = 0xcb,
+
+ M_SOF13 = 0xcd,
+ M_SOF14 = 0xce,
+ M_SOF15 = 0xcf,
+
+ M_DHT = 0xc4,
+
+ M_DAC = 0xcc,
+
+ M_RST0 = 0xd0,
+ M_RST1 = 0xd1,
+ M_RST2 = 0xd2,
+ M_RST3 = 0xd3,
+ M_RST4 = 0xd4,
+ M_RST5 = 0xd5,
+ M_RST6 = 0xd6,
+ M_RST7 = 0xd7,
+
+ M_SOI = 0xd8,
+ M_EOI = 0xd9,
+ M_SOS = 0xda,
+ M_DQT = 0xdb,
+ M_DNL = 0xdc,
+ M_DRI = 0xdd,
+ M_DHP = 0xde,
+ M_EXP = 0xdf,
+
+ M_APP0 = 0xe0,
+ M_APP1 = 0xe1,
+ M_APP2 = 0xe2,
+ M_APP3 = 0xe3,
+ M_APP4 = 0xe4,
+ M_APP5 = 0xe5,
+ M_APP6 = 0xe6,
+ M_APP7 = 0xe7,
+ M_APP8 = 0xe8,
+ M_APP9 = 0xe9,
+ M_APP10 = 0xea,
+ M_APP11 = 0xeb,
+ M_APP12 = 0xec,
+ M_APP13 = 0xed,
+ M_APP14 = 0xee,
+ M_APP15 = 0xef,
+
+ M_JPG0 = 0xf0,
+ M_JPG13 = 0xfd,
+ M_COM = 0xfe,
+
+ M_TEM = 0x01,
+
+ M_ERROR = 0x100
+} JPEG_MARKER;
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_marker_reader pub; /* public fields */
+
+ /* Application-overridable marker processing methods */
+ jpeg_marker_parser_method process_COM;
+ jpeg_marker_parser_method process_APPn[16];
+
+ /* Limit on marker data length to save for each marker type */
+ unsigned int length_limit_COM;
+ unsigned int length_limit_APPn[16];
+
+ /* Status of COM/APPn marker saving */
+ jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */
+ unsigned int bytes_read; /* data bytes read so far in marker */
+ /* Note: cur_marker is not linked into marker_list until it's all read. */
+} my_marker_reader;
+
+typedef my_marker_reader * my_marker_ptr;
+
+
+/*
+ * Macros for fetching data from the data source module.
+ *
+ * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
+ * the current restart point; we update them only when we have reached a
+ * suitable place to restart if a suspension occurs.
+ */
+
+/* Declare and initialize local copies of input pointer/count */
+#define INPUT_VARS(cinfo) \
+ struct jpeg_source_mgr * datasrc = (cinfo)->src; \
+ const JOCTET * next_input_byte = datasrc->next_input_byte; \
+ size_t bytes_in_buffer = datasrc->bytes_in_buffer
+
+/* Unload the local copies --- do this only at a restart boundary */
+#define INPUT_SYNC(cinfo) \
+ ( datasrc->next_input_byte = next_input_byte, \
+ datasrc->bytes_in_buffer = bytes_in_buffer )
+
+/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
+#define INPUT_RELOAD(cinfo) \
+ ( next_input_byte = datasrc->next_input_byte, \
+ bytes_in_buffer = datasrc->bytes_in_buffer )
+
+/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
+ * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
+ * but we must reload the local copies after a successful fill.
+ */
+#define MAKE_BYTE_AVAIL(cinfo,action) \
+ if (bytes_in_buffer == 0) { \
+ if (! (*datasrc->fill_input_buffer) (cinfo)) \
+ { action; } \
+ INPUT_RELOAD(cinfo); \
+ }
+
+/* Read a byte into variable V.
+ * If must suspend, take the specified action (typically "return FALSE").
+ */
+#define INPUT_BYTE(cinfo,V,action) \
+ MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V = GETJOCTET(*next_input_byte++); )
+
+/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
+ * V should be declared unsigned int or perhaps INT32.
+ */
+#define INPUT_2BYTES(cinfo,V,action) \
+ MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
+ MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
+ V += GETJOCTET(*next_input_byte++); )
+
+
+/*
+ * Routines to process JPEG markers.
+ *
+ * Entry condition: JPEG marker itself has been read and its code saved
+ * in cinfo->unread_marker; input restart point is just after the marker.
+ *
+ * Exit: if return TRUE, have read and processed any parameters, and have
+ * updated the restart point to point after the parameters.
+ * If return FALSE, was forced to suspend before reaching end of
+ * marker parameters; restart point has not been moved. Same routine
+ * will be called again after application supplies more input data.
+ *
+ * This approach to suspension assumes that all of a marker's parameters
+ * can fit into a single input bufferload. This should hold for "normal"
+ * markers. Some COM/APPn markers might have large parameter segments
+ * that might not fit. If we are simply dropping such a marker, we use
+ * skip_input_data to get past it, and thereby put the problem on the
+ * source manager's shoulders. If we are saving the marker's contents
+ * into memory, we use a slightly different convention: when forced to
+ * suspend, the marker processor updates the restart point to the end of
+ * what it's consumed (ie, the end of the buffer) before returning FALSE.
+ * On resumption, cinfo->unread_marker still contains the marker code,
+ * but the data source will point to the next chunk of marker data.
+ * The marker processor must retain internal state to deal with this.
+ *
+ * Note that we don't bother to avoid duplicate trace messages if a
+ * suspension occurs within marker parameters. Other side effects
+ * require more care.
+ */
+
+
+LOCAL(boolean)
+get_soi (j_decompress_ptr cinfo)
+/* Process an SOI marker */
+{
+ int i;
+
+ TRACEMS(cinfo, 1, JTRC_SOI);
+
+ if (cinfo->marker->saw_SOI)
+ ERREXIT(cinfo, JERR_SOI_DUPLICATE);
+
+ /* Reset all parameters that are defined to be reset by SOI */
+
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
+ cinfo->arith_dc_L[i] = 0;
+ cinfo->arith_dc_U[i] = 1;
+ cinfo->arith_ac_K[i] = 5;
+ }
+ cinfo->restart_interval = 0;
+
+ /* Set initial assumptions for colorspace etc */
+
+ cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
+
+ cinfo->saw_JFIF_marker = FALSE;
+ cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
+ cinfo->JFIF_minor_version = 1;
+ cinfo->density_unit = 0;
+ cinfo->X_density = 1;
+ cinfo->Y_density = 1;
+ cinfo->saw_Adobe_marker = FALSE;
+ cinfo->Adobe_transform = 0;
+
+ cinfo->marker->saw_SOI = TRUE;
+
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
+/* Process a SOFn marker */
+{
+ INT32 length;
+ int c, ci;
+ jpeg_component_info * compptr;
+ /* LiuSunliang added 20111209 */
+ JDIMENSION image_width, image_height;
+ INPUT_VARS(cinfo);
+
+ cinfo->progressive_mode = is_prog;
+ cinfo->arith_code = is_arith;
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
+ INPUT_2BYTES(cinfo, image_height, return FALSE);
+ INPUT_2BYTES(cinfo, image_width, return FALSE);
+ INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
+
+ if (image_width <= JPEG_MAX_DIMENSION)
+ cinfo->image_width = image_width;
+
+ if (image_height <= JPEG_MAX_DIMENSION)
+ cinfo->image_height = image_height;
+
+ length -= 8;
+
+ TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
+ (int) cinfo->image_width, (int) cinfo->image_height,
+ cinfo->num_components);
+
+ if (cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOF_DUPLICATE);
+
+ /* We don't support files in which the image height is initially specified */
+ /* as 0 and is later redefined by DNL. As long as we have to check that, */
+ /* might as well have a general sanity check. */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0
+ || cinfo->num_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ if (length != (cinfo->num_components * 3))
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ if (cinfo->comp_info == NULL) /* do only once, even if suspend */
+ cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components * SIZEOF(jpeg_component_info));
+
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ compptr->component_index = ci;
+ INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
+ /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
+ {
+ int i;
+ for (i = 0; i < ci; i ++)
+ if (compptr->component_id == cinfo->comp_info[i].component_id) break;
+ if (i < ci)
+ /* Found the error! We replace the id with something unlikely used elsewhere */
+ compptr->component_id += 0xf0;
+ }
+ /* end of modification */
+ INPUT_BYTE(cinfo, c, return FALSE);
+ compptr->h_samp_factor = (c >> 4) & 15;
+ compptr->v_samp_factor = (c ) & 15;
+ INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
+
+ TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
+ compptr->component_id, compptr->h_samp_factor,
+ compptr->v_samp_factor, compptr->quant_tbl_no);
+ }
+
+ cinfo->marker->saw_SOF = TRUE;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_sos (j_decompress_ptr cinfo)
+/* Process a SOS marker */
+{
+ INT32 length;
+ int i, ci, n, c, cc;
+ jpeg_component_info * compptr;
+ INPUT_VARS(cinfo);
+
+ if (! cinfo->marker->saw_SOF)
+ ERREXIT(cinfo, JERR_SOS_NO_SOF);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
+
+ TRACEMS1(cinfo, 1, JTRC_SOS, n);
+
+ if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ cinfo->comps_in_scan = n;
+
+ /* Collect the component-spec parameters */
+
+ for (i = 0; i < n; i++) {
+ INPUT_BYTE(cinfo, cc, return FALSE);
+ INPUT_BYTE(cinfo, c, return FALSE);
+
+ /* XYQ 2008-03-25: Adobe CMYK JPEG has serious flaw: the K channel has same component id as C channel */
+ {
+ int j;
+ for (j = 0; j < i; j ++)
+ if (cc == cinfo->cur_comp_info[j]->component_id) break;
+ if (j < i)
+ /* found the error! */
+ cc += 0xf0;
+ }
+ /* end of modification */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ if (cc == compptr->component_id)
+ goto id_found;
+ }
+
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+
+ id_found:
+
+ cinfo->cur_comp_info[i] = compptr;
+ compptr->dc_tbl_no = (c >> 4) & 15;
+ compptr->ac_tbl_no = (c ) & 15;
+
+ TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+ compptr->dc_tbl_no, compptr->ac_tbl_no);
+ /* This CSi (cc) should differ from the previous CSi */
+ for (ci = 0; ci < i; ci++) {
+ if (cinfo->cur_comp_info[ci] == compptr)
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+ }
+ }
+
+ /* Collect the additional scan parameters Ss, Se, Ah/Al. */
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Ss = c;
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Se = c;
+ INPUT_BYTE(cinfo, c, return FALSE);
+ cinfo->Ah = (c >> 4) & 15;
+ cinfo->Al = (c ) & 15;
+
+ TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
+ cinfo->Ah, cinfo->Al);
+
+ /* Prepare to scan data & restart markers */
+ cinfo->marker->next_restart_num = 0;
+
+ /* Count another SOS marker */
+ cinfo->input_scan_number++;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+#ifdef D_ARITH_CODING_SUPPORTED
+
+LOCAL(boolean)
+get_dac (j_decompress_ptr cinfo)
+/* Process a DAC marker */
+{
+ INT32 length;
+ int index, val;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 0) {
+ INPUT_BYTE(cinfo, index, return FALSE);
+ INPUT_BYTE(cinfo, val, return FALSE);
+
+ length -= 2;
+
+ TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
+
+ if (index < 0 || index >= (2*NUM_ARITH_TBLS))
+ ERREXIT1(cinfo, JERR_DAC_INDEX, index);
+
+ if (index >= NUM_ARITH_TBLS) { /* define AC table */
+ cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
+ } else { /* define DC table */
+ cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
+ cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
+ if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
+ ERREXIT1(cinfo, JERR_DAC_VALUE, val);
+ }
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+#else /* ! D_ARITH_CODING_SUPPORTED */
+
+#define get_dac(cinfo) skip_variable(cinfo)
+
+#endif /* D_ARITH_CODING_SUPPORTED */
+
+
+LOCAL(boolean)
+get_dht (j_decompress_ptr cinfo)
+/* Process a DHT marker */
+{
+ INT32 length;
+ UINT8 bits[17];
+ UINT8 huffval[256];
+ int i, index, count;
+ JHUFF_TBL **htblptr;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 16) {
+ INPUT_BYTE(cinfo, index, return FALSE);
+
+ TRACEMS1(cinfo, 1, JTRC_DHT, index);
+
+ bits[0] = 0;
+ count = 0;
+ for (i = 1; i <= 16; i++) {
+ INPUT_BYTE(cinfo, bits[i], return FALSE);
+ count += bits[i];
+ }
+
+ length -= 1 + 16;
+
+ TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+ bits[1], bits[2], bits[3], bits[4],
+ bits[5], bits[6], bits[7], bits[8]);
+ TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
+ bits[9], bits[10], bits[11], bits[12],
+ bits[13], bits[14], bits[15], bits[16]);
+
+ /* Here we just do minimal validation of the counts to avoid walking
+ * off the end of our table space. jdhuff.c will check more carefully.
+ */
+ if (count > 256 || ((INT32) count) > length)
+ ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+
+ for (i = 0; i < count; i++)
+ INPUT_BYTE(cinfo, huffval[i], return FALSE);
+
+ length -= count;
+
+ if (index & 0x10) { /* AC table definition */
+ index -= 0x10;
+ htblptr = &cinfo->ac_huff_tbl_ptrs[index];
+ } else { /* DC table definition */
+ htblptr = &cinfo->dc_huff_tbl_ptrs[index];
+ }
+
+ if (index < 0 || index >= NUM_HUFF_TBLS)
+ ERREXIT1(cinfo, JERR_DHT_INDEX, index);
+
+ if (*htblptr == NULL)
+ *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
+
+ MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
+ MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dqt (j_decompress_ptr cinfo)
+/* Process a DQT marker */
+{
+ INT32 length;
+ int n, i, prec;
+ unsigned int tmp;
+ JQUANT_TBL *quant_ptr;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ while (length > 0) {
+ INPUT_BYTE(cinfo, n, return FALSE);
+ prec = n >> 4;
+ n &= 0x0F;
+
+ TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
+
+ if (n >= NUM_QUANT_TBLS)
+ ERREXIT1(cinfo, JERR_DQT_INDEX, n);
+
+ if (cinfo->quant_tbl_ptrs[n] == NULL)
+ cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
+ quant_ptr = cinfo->quant_tbl_ptrs[n];
+
+ for (i = 0; i < DCTSIZE2; i++) {
+ if (prec)
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ else
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ /* We convert the zigzag-order table to natural array order. */
+ quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
+ }
+
+ if (cinfo->err->trace_level >= 2) {
+ for (i = 0; i < DCTSIZE2; i += 8) {
+ TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
+ quant_ptr->quantval[i], quant_ptr->quantval[i+1],
+ quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
+ quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
+ quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
+ }
+ }
+
+ length -= DCTSIZE2+1;
+ if (prec) length -= DCTSIZE2;
+ }
+
+ if (length != 0)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+get_dri (j_decompress_ptr cinfo)
+/* Process a DRI marker */
+{
+ INT32 length;
+ unsigned int tmp;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ if (length != 4)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+
+ TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
+
+ cinfo->restart_interval = tmp;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Routines for processing APPn and COM markers.
+ * These are either saved in memory or discarded, per application request.
+ * APP0 and APP14 are specially checked to see if they are
+ * JFIF and Adobe markers, respectively.
+ */
+
+#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */
+#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */
+#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */
+
+
+LOCAL(void)
+examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
+ unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP0.
+ * Take appropriate action if it is a JFIF marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+ INT32 totallen = (INT32) datalen + remaining;
+
+ if (datalen >= APP0_DATA_LEN &&
+ GETJOCTET(data[0]) == 0x4A &&
+ GETJOCTET(data[1]) == 0x46 &&
+ GETJOCTET(data[2]) == 0x49 &&
+ GETJOCTET(data[3]) == 0x46 &&
+ GETJOCTET(data[4]) == 0) {
+ /* Found JFIF APP0 marker: save info */
+ cinfo->saw_JFIF_marker = TRUE;
+ cinfo->JFIF_major_version = GETJOCTET(data[5]);
+ cinfo->JFIF_minor_version = GETJOCTET(data[6]);
+ cinfo->density_unit = GETJOCTET(data[7]);
+ cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
+ cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
+ /* Check version.
+ * Major version must be 1, anything else signals an incompatible change.
+ * (We used to treat this as an error, but now it's a nonfatal warning,
+ * because some bozo at Hijaak couldn't read the spec.)
+ * Minor version should be 0..2, but process anyway if newer.
+ */
+ if (cinfo->JFIF_major_version != 1)
+ WARNMS2(cinfo, JWRN_JFIF_MAJOR,
+ cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
+ /* Generate trace messages */
+ TRACEMS5(cinfo, 1, JTRC_JFIF,
+ cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
+ cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
+ /* Validate thumbnail dimensions and issue appropriate messages */
+ if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
+ TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
+ GETJOCTET(data[12]), GETJOCTET(data[13]));
+ totallen -= APP0_DATA_LEN;
+ if (totallen !=
+ ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
+ TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
+ } else if (datalen >= 6 &&
+ GETJOCTET(data[0]) == 0x4A &&
+ GETJOCTET(data[1]) == 0x46 &&
+ GETJOCTET(data[2]) == 0x58 &&
+ GETJOCTET(data[3]) == 0x58 &&
+ GETJOCTET(data[4]) == 0) {
+ /* Found JFIF "JFXX" extension APP0 marker */
+ /* The library doesn't actually do anything with these,
+ * but we try to produce a helpful trace message.
+ */
+ switch (GETJOCTET(data[5])) {
+ case 0x10:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
+ break;
+ case 0x11:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
+ break;
+ case 0x13:
+ TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
+ break;
+ default:
+ TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
+ GETJOCTET(data[5]), (int) totallen);
+ break;
+ }
+ } else {
+ /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
+ TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
+ }
+}
+
+
+LOCAL(void)
+examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
+ unsigned int datalen, INT32 remaining)
+/* Examine first few bytes from an APP14.
+ * Take appropriate action if it is an Adobe marker.
+ * datalen is # of bytes at data[], remaining is length of rest of marker data.
+ */
+{
+ unsigned int version, flags0, flags1, transform;
+
+ if (datalen >= APP14_DATA_LEN &&
+ GETJOCTET(data[0]) == 0x41 &&
+ GETJOCTET(data[1]) == 0x64 &&
+ GETJOCTET(data[2]) == 0x6F &&
+ GETJOCTET(data[3]) == 0x62 &&
+ GETJOCTET(data[4]) == 0x65) {
+ /* Found Adobe APP14 marker */
+ version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
+ flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
+ flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
+ transform = GETJOCTET(data[11]);
+ TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
+ cinfo->saw_Adobe_marker = TRUE;
+ cinfo->Adobe_transform = (UINT8) transform;
+ } else {
+ /* Start of APP14 does not match "Adobe", or too short */
+ TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
+ }
+}
+
+
+METHODDEF(boolean)
+get_interesting_appn (j_decompress_ptr cinfo)
+/* Process an APP0 or APP14 marker without saving it */
+{
+ INT32 length;
+ JOCTET b[APPN_DATA_LEN];
+ unsigned int i, numtoread;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ /* get the interesting part of the marker data */
+ if (length >= APPN_DATA_LEN)
+ numtoread = APPN_DATA_LEN;
+ else if (length > 0)
+ numtoread = (unsigned int) length;
+ else
+ numtoread = 0;
+ for (i = 0; i < numtoread; i++)
+ INPUT_BYTE(cinfo, b[i], return FALSE);
+ length -= numtoread;
+
+ /* process it */
+ switch (cinfo->unread_marker) {
+ case M_APP0:
+ examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
+ break;
+ case M_APP14:
+ examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
+ break;
+ default:
+ /* can't get here unless jpeg_save_markers chooses wrong processor */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ break;
+ }
+
+ /* skip any remaining data -- could be lots */
+ INPUT_SYNC(cinfo);
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+METHODDEF(boolean)
+save_marker (j_decompress_ptr cinfo)
+/* Save an APPn or COM marker into the marker list */
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
+ unsigned int bytes_read, data_length;
+ JOCTET FAR * data;
+ INT32 length = 0;
+ INPUT_VARS(cinfo);
+
+ if (cur_marker == NULL) {
+ /* begin reading a marker */
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+ if (length >= 0) { /* watch out for bogus length word */
+ /* figure out how much we want to save */
+ unsigned int limit;
+ if (cinfo->unread_marker == (int) M_COM)
+ limit = marker->length_limit_COM;
+ else
+ limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
+ if ((unsigned int) length < limit)
+ limit = (unsigned int) length;
+ /* allocate and initialize the marker item */
+ cur_marker = (jpeg_saved_marker_ptr)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(struct jpeg_marker_struct) + limit);
+ cur_marker->next = NULL;
+ cur_marker->marker = (UINT8) cinfo->unread_marker;
+ cur_marker->original_length = (unsigned int) length;
+ cur_marker->data_length = limit;
+ /* data area is just beyond the jpeg_marker_struct */
+ data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
+ marker->cur_marker = cur_marker;
+ marker->bytes_read = 0;
+ bytes_read = 0;
+ data_length = limit;
+ } else {
+ /* deal with bogus length word */
+ bytes_read = data_length = 0;
+ data = NULL;
+ }
+ } else {
+ /* resume reading a marker */
+ bytes_read = marker->bytes_read;
+ data_length = cur_marker->data_length;
+ data = cur_marker->data + bytes_read;
+ }
+
+ while (bytes_read < data_length) {
+ INPUT_SYNC(cinfo); /* move the restart point to here */
+ marker->bytes_read = bytes_read;
+ /* If there's not at least one byte in buffer, suspend */
+ MAKE_BYTE_AVAIL(cinfo, return FALSE);
+ /* Copy bytes with reasonable rapidity */
+ while (bytes_read < data_length && bytes_in_buffer > 0) {
+ *data++ = *next_input_byte++;
+ bytes_in_buffer--;
+ bytes_read++;
+ }
+ }
+
+ /* Done reading what we want to read */
+ if (cur_marker != NULL) { /* will be NULL if bogus length word */
+ /* Add new marker to end of list */
+ if (cinfo->marker_list == NULL) {
+ cinfo->marker_list = cur_marker;
+ } else {
+ jpeg_saved_marker_ptr prev = cinfo->marker_list;
+ while (prev->next != NULL)
+ prev = prev->next;
+ prev->next = cur_marker;
+ }
+ /* Reset pointer & calc remaining data length */
+ data = cur_marker->data;
+ length = cur_marker->original_length - data_length;
+ }
+ /* Reset to initial state for next marker */
+ marker->cur_marker = NULL;
+
+ /* Process the marker if interesting; else just make a generic trace msg */
+ switch (cinfo->unread_marker) {
+ case M_APP0:
+ examine_app0(cinfo, data, data_length, length);
+ break;
+ case M_APP14:
+ examine_app14(cinfo, data, data_length, length);
+ break;
+ default:
+ TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
+ (int) (data_length + length));
+ break;
+ }
+
+ /* skip any remaining data -- could be lots */
+ INPUT_SYNC(cinfo); /* do before skip_input_data */
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+METHODDEF(boolean)
+skip_variable (j_decompress_ptr cinfo)
+/* Skip over an unknown or uninteresting variable-length marker */
+{
+ INT32 length;
+ INPUT_VARS(cinfo);
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+ length -= 2;
+
+ TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
+
+ INPUT_SYNC(cinfo); /* do before skip_input_data */
+ if (length > 0)
+ (*cinfo->src->skip_input_data) (cinfo, (long) length);
+
+ return TRUE;
+}
+
+
+/*
+ * Find the next JPEG marker, save it in cinfo->unread_marker.
+ * Returns FALSE if had to suspend before reaching a marker;
+ * in that case cinfo->unread_marker is unchanged.
+ *
+ * Note that the result might not be a valid marker code,
+ * but it will never be 0 or FF.
+ */
+
+LOCAL(boolean)
+next_marker (j_decompress_ptr cinfo)
+{
+ int c;
+ INPUT_VARS(cinfo);
+
+ for (;;) {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ /* Skip any non-FF bytes.
+ * This may look a bit inefficient, but it will not occur in a valid file.
+ * We sync after each discarded byte so that a suspending data source
+ * can discard the byte from its buffer.
+ */
+ while (c != 0xFF) {
+ cinfo->marker->discarded_bytes++;
+ INPUT_SYNC(cinfo);
+ INPUT_BYTE(cinfo, c, return FALSE);
+ }
+ /* This loop swallows any duplicate FF bytes. Extra FFs are legal as
+ * pad bytes, so don't count them in discarded_bytes. We assume there
+ * will not be so many consecutive FF bytes as to overflow a suspending
+ * data source's input buffer.
+ */
+ do {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ } while (c == 0xFF);
+ if (c != 0)
+ break; /* found a valid marker, exit loop */
+ /* Reach here if we found a stuffed-zero data sequence (FF/00).
+ * Discard it and loop back to try again.
+ */
+ cinfo->marker->discarded_bytes += 2;
+ INPUT_SYNC(cinfo);
+ }
+
+ if (cinfo->marker->discarded_bytes != 0) {
+ WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
+ cinfo->marker->discarded_bytes = 0;
+ }
+
+ cinfo->unread_marker = c;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+LOCAL(boolean)
+first_marker (j_decompress_ptr cinfo)
+/* Like next_marker, but used to obtain the initial SOI marker. */
+/* For this marker, we do not allow preceding garbage or fill; otherwise,
+ * we might well scan an entire input file before realizing it ain't JPEG.
+ * If an application wants to process non-JFIF files, it must seek to the
+ * SOI before calling the JPEG library.
+ */
+{
+ int c, c2;
+ INPUT_VARS(cinfo);
+
+ INPUT_BYTE(cinfo, c, return FALSE);
+ INPUT_BYTE(cinfo, c2, return FALSE);
+ if (c != 0xFF || c2 != (int) M_SOI)
+ ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
+
+ cinfo->unread_marker = c2;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
+/*
+ * Read markers until SOS or EOI.
+ *
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+
+METHODDEF(int)
+read_markers (j_decompress_ptr cinfo)
+{
+ /* Outer loop repeats once for each marker. */
+ for (;;) {
+ /* Collect the marker proper, unless we already did. */
+ /* NB: first_marker() enforces the requirement that SOI appear first. */
+ if (cinfo->unread_marker == 0) {
+ if (! cinfo->marker->saw_SOI) {
+ if (! first_marker(cinfo))
+ return JPEG_SUSPENDED;
+ } else {
+ if (! next_marker(cinfo))
+ return JPEG_SUSPENDED;
+ }
+ }
+ /* At this point cinfo->unread_marker contains the marker code and the
+ * input point is just past the marker proper, but before any parameters.
+ * A suspension will cause us to return with this state still true.
+ */
+ switch (cinfo->unread_marker) {
+ case M_SOI:
+ if (! get_soi(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF0: /* Baseline */
+ case M_SOF1: /* Extended sequential, Huffman */
+ if (! get_sof(cinfo, FALSE, FALSE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF2: /* Progressive, Huffman */
+ if (! get_sof(cinfo, TRUE, FALSE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF9: /* Extended sequential, arithmetic */
+ if (! get_sof(cinfo, FALSE, TRUE))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_SOF10: /* Progressive, arithmetic */
+ if (! get_sof(cinfo, TRUE, TRUE))
+ return JPEG_SUSPENDED;
+ break;
+
+ /* Currently unsupported SOFn types */
+ case M_SOF3: /* Lossless, Huffman */
+ case M_SOF5: /* Differential sequential, Huffman */
+ case M_SOF6: /* Differential progressive, Huffman */
+ case M_SOF7: /* Differential lossless, Huffman */
+ case M_JPG: /* Reserved for JPEG extensions */
+ case M_SOF11: /* Lossless, arithmetic */
+ case M_SOF13: /* Differential sequential, arithmetic */
+ case M_SOF14: /* Differential progressive, arithmetic */
+ case M_SOF15: /* Differential lossless, arithmetic */
+ ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
+ break;
+
+ case M_SOS:
+ if (! get_sos(cinfo))
+ return JPEG_SUSPENDED;
+ cinfo->unread_marker = 0; /* processed the marker */
+ return JPEG_REACHED_SOS;
+
+ case M_EOI:
+ TRACEMS(cinfo, 1, JTRC_EOI);
+ cinfo->unread_marker = 0; /* processed the marker */
+ return JPEG_REACHED_EOI;
+
+ case M_DAC:
+ if (! get_dac(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DHT:
+ if (! get_dht(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DQT:
+ if (! get_dqt(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_DRI:
+ if (! get_dri(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_APP0:
+ case M_APP1:
+ case M_APP2:
+ case M_APP3:
+ case M_APP4:
+ case M_APP5:
+ case M_APP6:
+ case M_APP7:
+ case M_APP8:
+ case M_APP9:
+ case M_APP10:
+ case M_APP11:
+ case M_APP12:
+ case M_APP13:
+ case M_APP14:
+ case M_APP15:
+ if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
+ cinfo->unread_marker - (int) M_APP0]) (cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_COM:
+ if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ case M_RST0: /* these are all parameterless */
+ case M_RST1:
+ case M_RST2:
+ case M_RST3:
+ case M_RST4:
+ case M_RST5:
+ case M_RST6:
+ case M_RST7:
+ case M_TEM:
+ TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
+ break;
+
+ case M_DNL: /* Ignore DNL ... perhaps the wrong thing */
+ if (! skip_variable(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
+ default: /* must be DHP, EXP, JPGn, or RESn */
+ /* For now, we treat the reserved markers as fatal errors since they are
+ * likely to be used to signal incompatible JPEG Part 3 extensions.
+ * Once the JPEG 3 version-number marker is well defined, this code
+ * ought to change!
+ */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ break;
+ }
+ /* Successfully processed marker, so reset state variable */
+ cinfo->unread_marker = 0;
+ } /* end loop */
+}
+
+
+/*
+ * Read a restart marker, which is expected to appear next in the datastream;
+ * if the marker is not there, take appropriate recovery action.
+ * Returns FALSE if suspension is required.
+ *
+ * This is called by the entropy decoder after it has read an appropriate
+ * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder
+ * has already read a marker from the data source. Under normal conditions
+ * cinfo->unread_marker will be reset to 0 before returning; if not reset,
+ * it holds a marker which the decoder will be unable to read past.
+ */
+
+METHODDEF(boolean)
+read_restart_marker (j_decompress_ptr cinfo)
+{
+ /* Obtain a marker unless we already did. */
+ /* Note that next_marker will complain if it skips any data. */
+ if (cinfo->unread_marker == 0) {
+ if (! next_marker(cinfo))
+ return FALSE;
+ }
+
+ if (cinfo->unread_marker ==
+ ((int) M_RST0 + cinfo->marker->next_restart_num)) {
+ /* Normal case --- swallow the marker and let entropy decoder continue */
+ TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
+ cinfo->unread_marker = 0;
+ } else {
+ /* Uh-oh, the restart markers have been messed up. */
+ /* Let the data source manager determine how to resync. */
+ if (! (*cinfo->src->resync_to_restart) (cinfo,
+ cinfo->marker->next_restart_num))
+ return FALSE;
+ }
+
+ /* Update next-restart state */
+ cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
+
+ return TRUE;
+}
+
+
+/*
+ * This is the default resync_to_restart method for data source managers
+ * to use if they don't have any better approach. Some data source managers
+ * may be able to back up, or may have additional knowledge about the data
+ * which permits a more intelligent recovery strategy; such managers would
+ * presumably supply their own resync method.
+ *
+ * read_restart_marker calls resync_to_restart if it finds a marker other than
+ * the restart marker it was expecting. (This code is *not* used unless
+ * a nonzero restart interval has been declared.) cinfo->unread_marker is
+ * the marker code actually found (might be anything, except 0 or FF).
+ * The desired restart marker number (0..7) is passed as a parameter.
+ * This routine is supposed to apply whatever error recovery strategy seems
+ * appropriate in order to position the input stream to the next data segment.
+ * Note that cinfo->unread_marker is treated as a marker appearing before
+ * the current data-source input point; usually it should be reset to zero
+ * before returning.
+ * Returns FALSE if suspension is required.
+ *
+ * This implementation is substantially constrained by wanting to treat the
+ * input as a data stream; this means we can't back up. Therefore, we have
+ * only the following actions to work with:
+ * 1. Simply discard the marker and let the entropy decoder resume at next
+ * byte of file.
+ * 2. Read forward until we find another marker, discarding intervening
+ * data. (In theory we could look ahead within the current bufferload,
+ * without having to discard data if we don't find the desired marker.
+ * This idea is not implemented here, in part because it makes behavior
+ * dependent on buffer size and chance buffer-boundary positions.)
+ * 3. Leave the marker unread (by failing to zero cinfo->unread_marker).
+ * This will cause the entropy decoder to process an empty data segment,
+ * inserting dummy zeroes, and then we will reprocess the marker.
+ *
+ * #2 is appropriate if we think the desired marker lies ahead, while #3 is
+ * appropriate if the found marker is a future restart marker (indicating
+ * that we have missed the desired restart marker, probably because it got
+ * corrupted).
+ * We apply #2 or #3 if the found marker is a restart marker no more than
+ * two counts behind or ahead of the expected one. We also apply #2 if the
+ * found marker is not a legal JPEG marker code (it's certainly bogus data).
+ * If the found marker is a restart marker more than 2 counts away, we do #1
+ * (too much risk that the marker is erroneous; with luck we will be able to
+ * resync at some future point).
+ * For any valid non-restart JPEG marker, we apply #3. This keeps us from
+ * overrunning the end of a scan. An implementation limited to single-scan
+ * files might find it better to apply #2 for markers other than EOI, since
+ * any other marker would have to be bogus data in that case.
+ */
+
+GLOBAL(boolean)
+jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
+{
+ int marker = cinfo->unread_marker;
+ int action = 1;
+
+ /* Always put up a warning. */
+ WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
+
+ /* Outer loop handles repeated decision after scanning forward. */
+ for (;;) {
+ if (marker < (int) M_SOF0)
+ action = 2; /* invalid marker */
+ else if (marker < (int) M_RST0 || marker > (int) M_RST7)
+ action = 3; /* valid non-restart marker */
+ else {
+ if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
+ marker == ((int) M_RST0 + ((desired+2) & 7)))
+ action = 3; /* one of the next two expected restarts */
+ else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
+ marker == ((int) M_RST0 + ((desired-2) & 7)))
+ action = 2; /* a prior restart, so advance */
+ else
+ action = 1; /* desired restart or too far away */
+ }
+ TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
+ switch (action) {
+ case 1:
+ /* Discard marker and let entropy decoder resume processing. */
+ cinfo->unread_marker = 0;
+ return TRUE;
+ case 2:
+ /* Scan to the next marker, and repeat the decision loop. */
+ if (! next_marker(cinfo))
+ return FALSE;
+ marker = cinfo->unread_marker;
+ break;
+ case 3:
+ /* Return without advancing past this marker. */
+ /* Entropy decoder will be forced to process an empty segment. */
+ return TRUE;
+ }
+ } /* end loop */
+}
+
+
+/*
+ * Reset marker processing state to begin a fresh datastream.
+ */
+
+METHODDEF(void)
+reset_marker_reader (j_decompress_ptr cinfo)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ cinfo->comp_info = NULL; /* until allocated by get_sof */
+ cinfo->input_scan_number = 0; /* no SOS seen yet */
+ cinfo->unread_marker = 0; /* no pending marker */
+ marker->pub.saw_SOI = FALSE; /* set internal state too */
+ marker->pub.saw_SOF = FALSE;
+ marker->pub.discarded_bytes = 0;
+ marker->cur_marker = NULL;
+}
+
+
+/*
+ * Initialize the marker reader module.
+ * This is called only once, when the decompression object is created.
+ */
+
+GLOBAL(void)
+jinit_marker_reader (j_decompress_ptr cinfo)
+{
+ my_marker_ptr marker;
+ int i;
+
+ /* Create subobject in permanent pool */
+ marker = (my_marker_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ SIZEOF(my_marker_reader));
+ cinfo->marker = (struct jpeg_marker_reader *) marker;
+ /* Initialize public method pointers */
+ marker->pub.reset_marker_reader = reset_marker_reader;
+ marker->pub.read_markers = read_markers;
+ marker->pub.read_restart_marker = read_restart_marker;
+ /* Initialize COM/APPn processing.
+ * By default, we examine and then discard APP0 and APP14,
+ * but simply discard COM and all other APPn.
+ */
+ marker->process_COM = skip_variable;
+ marker->length_limit_COM = 0;
+ for (i = 0; i < 16; i++) {
+ marker->process_APPn[i] = skip_variable;
+ marker->length_limit_APPn[i] = 0;
+ }
+ marker->process_APPn[0] = get_interesting_appn;
+ marker->process_APPn[14] = get_interesting_appn;
+ /* Reset marker processing state */
+ reset_marker_reader(cinfo);
+}
+
+
+/*
+ * Control saving of COM and APPn markers into marker_list.
+ */
+
+#ifdef SAVE_MARKERS_SUPPORTED
+
+GLOBAL(void)
+jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
+ unsigned int length_limit)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+ long maxlength;
+ jpeg_marker_parser_method processor;
+
+ /* Length limit mustn't be larger than what we can allocate
+ * (should only be a concern in a 16-bit environment).
+ */
+ maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
+ if (((long) length_limit) > maxlength)
+ length_limit = (unsigned int) maxlength;
+
+ /* Choose processor routine to use.
+ * APP0/APP14 have special requirements.
+ */
+ if (length_limit) {
+ processor = save_marker;
+ /* If saving APP0/APP14, save at least enough for our internal use. */
+ if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
+ length_limit = APP0_DATA_LEN;
+ else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
+ length_limit = APP14_DATA_LEN;
+ } else {
+ processor = skip_variable;
+ /* If discarding APP0/APP14, use our regular on-the-fly processor. */
+ if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
+ processor = get_interesting_appn;
+ }
+
+ if (marker_code == (int) M_COM) {
+ marker->process_COM = processor;
+ marker->length_limit_COM = length_limit;
+ } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
+ marker->process_APPn[marker_code - (int) M_APP0] = processor;
+ marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
+ } else
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
+
+#endif /* SAVE_MARKERS_SUPPORTED */
+
+
+/*
+ * Install a special processing method for COM or APPn markers.
+ */
+
+GLOBAL(void)
+jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
+ jpeg_marker_parser_method routine)
+{
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
+
+ if (marker_code == (int) M_COM)
+ marker->process_COM = routine;
+ else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
+ marker->process_APPn[marker_code - (int) M_APP0] = routine;
+ else
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
new file mode 100644
index 0000000000..4adfd82375
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c
@@ -0,0 +1,560 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmaster.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains master control logic for the JPEG decompressor.
+ * These routines are concerned with selecting the modules to be executed
+ * and with determining the number of passes and the work to be done in each
+ * pass.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private state */
+
+typedef struct {
+ struct jpeg_decomp_master pub; /* public fields */
+
+ int pass_number; /* # of passes completed */
+
+ boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */
+
+ /* Saved references to initialized quantizer modules,
+ * in case we need to switch modes.
+ */
+ struct jpeg_color_quantizer * quantizer_1pass;
+ struct jpeg_color_quantizer * quantizer_2pass;
+} my_decomp_master;
+
+typedef my_decomp_master * my_master_ptr;
+
+
+/*
+ * Determine whether merged upsample/color conversion should be used.
+ * CRUCIAL: this must match the actual capabilities of jdmerge.c!
+ */
+
+LOCAL(boolean)
+use_merged_upsample (j_decompress_ptr cinfo)
+{
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+ /* Merging is the equivalent of plain box-filter upsampling */
+ if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
+ return FALSE;
+ /* jdmerge.c only supports YCC=>RGB color conversion */
+ if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
+ cinfo->out_color_space != JCS_RGB ||
+ cinfo->out_color_components != RGB_PIXELSIZE)
+ return FALSE;
+ /* and it only handles 2h1v or 2h2v sampling ratios */
+ if (cinfo->comp_info[0].h_samp_factor != 2 ||
+ cinfo->comp_info[1].h_samp_factor != 1 ||
+ cinfo->comp_info[2].h_samp_factor != 1 ||
+ cinfo->comp_info[0].v_samp_factor > 2 ||
+ cinfo->comp_info[1].v_samp_factor != 1 ||
+ cinfo->comp_info[2].v_samp_factor != 1)
+ return FALSE;
+ /* furthermore, it doesn't work if we've scaled the IDCTs differently */
+ if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+ cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size ||
+ cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size)
+ return FALSE;
+ /* ??? also need to test for upsample-time rescaling, when & if supported */
+ return TRUE; /* by golly, it'll work... */
+#else
+ return FALSE;
+#endif
+}
+
+
+/*
+ * Compute output image dimensions and related values.
+ * NOTE: this is exported for possible use by application.
+ * Hence it mustn't do anything that can't be done twice.
+ * Also note that it may be called before the master module is initialized!
+ */
+
+GLOBAL(void)
+jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
+/* Do computations that are needed before master selection phase */
+{
+#ifdef IDCT_SCALING_SUPPORTED
+ int ci;
+ jpeg_component_info *compptr;
+#endif
+
+ /* Prevent application from calling me at wrong times */
+ if (cinfo->global_state != DSTATE_READY)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+ /* Compute actual output image dimensions and DCT scaling choices. */
+ if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
+ /* Provide 1/8 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 8L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 8L);
+ cinfo->min_DCT_scaled_size = 1;
+ } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
+ /* Provide 1/4 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 4L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 4L);
+ cinfo->min_DCT_scaled_size = 2;
+ } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
+ /* Provide 1/2 scaling */
+ cinfo->output_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width, 2L);
+ cinfo->output_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height, 2L);
+ cinfo->min_DCT_scaled_size = 4;
+ } else {
+ /* Provide 1/1 scaling */
+ cinfo->output_width = cinfo->image_width;
+ cinfo->output_height = cinfo->image_height;
+ cinfo->min_DCT_scaled_size = DCTSIZE;
+ }
+ /* In selecting the actual DCT scaling for each component, we try to
+ * scale up the chroma components via IDCT scaling rather than upsampling.
+ * This saves time if the upsampler gets to use 1:1 scaling.
+ * Note this code assumes that the supported DCT scalings are powers of 2.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ int ssize = cinfo->min_DCT_scaled_size;
+ while (ssize < DCTSIZE &&
+ (compptr->h_samp_factor * ssize * 2 <=
+ cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) &&
+ (compptr->v_samp_factor * ssize * 2 <=
+ cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) {
+ ssize = ssize * 2;
+ }
+ compptr->DCT_scaled_size = ssize;
+ }
+
+ /* Recompute downsampled dimensions of components;
+ * application needs to know these if using raw downsampled data.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Size in samples, after IDCT scaling */
+ compptr->downsampled_width = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_width *
+ (long) (compptr->h_samp_factor * compptr->DCT_scaled_size),
+ (long) (cinfo->max_h_samp_factor * DCTSIZE));
+ compptr->downsampled_height = (JDIMENSION)
+ jdiv_round_up((long) cinfo->image_height *
+ (long) (compptr->v_samp_factor * compptr->DCT_scaled_size),
+ (long) (cinfo->max_v_samp_factor * DCTSIZE));
+ }
+
+#else /* !IDCT_SCALING_SUPPORTED */
+
+ /* Hardwire it to "no scaling" */
+ cinfo->output_width = cinfo->image_width;
+ cinfo->output_height = cinfo->image_height;
+ /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
+ * and has computed unscaled downsampled_width and downsampled_height.
+ */
+
+#endif /* IDCT_SCALING_SUPPORTED */
+
+ /* Report number of components in selected colorspace. */
+ /* Probably this should be in the color conversion module... */
+ switch (cinfo->out_color_space) {
+ case JCS_GRAYSCALE:
+ cinfo->out_color_components = 1;
+ break;
+ case JCS_RGB:
+#if RGB_PIXELSIZE != 3
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ break;
+#endif /* else share code with YCbCr */
+ case JCS_YCbCr:
+ cinfo->out_color_components = 3;
+ break;
+ case JCS_CMYK:
+ case JCS_YCCK:
+ cinfo->out_color_components = 4;
+ break;
+ default: /* else must be same colorspace as in file */
+ cinfo->out_color_components = cinfo->num_components;
+ break;
+ }
+ cinfo->output_components = (cinfo->quantize_colors ? 1 :
+ cinfo->out_color_components);
+
+ /* See if upsampler will want to emit more than one row at a time */
+ if (use_merged_upsample(cinfo))
+ cinfo->rec_outbuf_height = cinfo->max_v_samp_factor;
+ else
+ cinfo->rec_outbuf_height = 1;
+}
+
+
+/*
+ * Several decompression processes need to range-limit values to the range
+ * 0..MAXJSAMPLE; the input value may fall somewhat outside this range
+ * due to noise introduced by quantization, roundoff error, etc. These
+ * processes are inner loops and need to be as fast as possible. On most
+ * machines, particularly CPUs with pipelines or instruction prefetch,
+ * a (subscript-check-less) C table lookup
+ * x = sample_range_limit[x];
+ * is faster than explicit tests
+ * if (x < 0) x = 0;
+ * else if (x > MAXJSAMPLE) x = MAXJSAMPLE;
+ * These processes all use a common table prepared by the routine below.
+ *
+ * For most steps we can mathematically guarantee that the initial value
+ * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
+ * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial
+ * limiting step (just after the IDCT), a wildly out-of-range value is
+ * possible if the input data is corrupt. To avoid any chance of indexing
+ * off the end of memory and getting a bad-pointer trap, we perform the
+ * post-IDCT limiting thus:
+ * x = range_limit[x & MASK];
+ * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
+ * samples. Under normal circumstances this is more than enough range and
+ * a correct output will be generated; with bogus input data the mask will
+ * cause wraparound, and we will safely generate a bogus-but-in-range output.
+ * For the post-IDCT step, we want to convert the data from signed to unsigned
+ * representation by adding CENTERJSAMPLE at the same time that we limit it.
+ * So the post-IDCT limiting table ends up looking like this:
+ * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
+ * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
+ * 0,1,...,CENTERJSAMPLE-1
+ * Negative inputs select values from the upper half of the table after
+ * masking.
+ *
+ * We can save some space by overlapping the start of the post-IDCT table
+ * with the simpler range limiting table. The post-IDCT table begins at
+ * sample_range_limit + CENTERJSAMPLE.
+ *
+ * Note that the table is allocated in near data space on PCs; it's small
+ * enough and used often enough to justify this.
+ */
+
+LOCAL(void)
+prepare_range_limit_table (j_decompress_ptr cinfo)
+/* Allocate and fill in the sample_range_limit table */
+{
+ JSAMPLE * table;
+ int i;
+
+ table = (JSAMPLE *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+ table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */
+ cinfo->sample_range_limit = table;
+ /* First segment of "simple" table: limit[x] = 0 for x < 0 */
+ MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+ /* Main part of "simple" table: limit[x] = x */
+ for (i = 0; i <= MAXJSAMPLE; i++)
+ table[i] = (JSAMPLE) i;
+ table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */
+ /* End of simple table, rest of first half of post-IDCT table */
+ for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
+ table[i] = MAXJSAMPLE;
+ /* Second half of post-IDCT table */
+ MEMZERO(table + (2 * (MAXJSAMPLE+1)),
+ (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
+ MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
+ cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
+}
+
+
+/*
+ * Master selection of decompression modules.
+ * This is done once at jpeg_start_decompress time. We determine
+ * which modules will be used and give them appropriate initialization calls.
+ * We also initialize the decompressor input side to begin consuming data.
+ *
+ * Since jpeg_read_header has finished, we know what is in the SOF
+ * and (first) SOS markers. We also have all the application parameter
+ * settings.
+ */
+
+LOCAL(void)
+master_selection (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+ boolean use_c_buffer;
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* Initialize dimensions and other stuff */
+ jpeg_calc_output_dimensions(cinfo);
+ prepare_range_limit_table(cinfo);
+
+ /* Width of an output scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
+ /* Initialize my private state */
+ master->pass_number = 0;
+ master->using_merged_upsample = use_merged_upsample(cinfo);
+
+ /* Color quantizer selection */
+ master->quantizer_1pass = NULL;
+ master->quantizer_2pass = NULL;
+ /* No mode changes if not using buffered-image mode. */
+ if (! cinfo->quantize_colors || ! cinfo->buffered_image) {
+ cinfo->enable_1pass_quant = FALSE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+ }
+ if (cinfo->quantize_colors) {
+ if (cinfo->raw_data_out)
+ ERREXIT(cinfo, JERR_NOTIMPL);
+ /* 2-pass quantizer only works in 3-component color space. */
+ if (cinfo->out_color_components != 3) {
+ cinfo->enable_1pass_quant = TRUE;
+ cinfo->enable_external_quant = FALSE;
+ cinfo->enable_2pass_quant = FALSE;
+ cinfo->colormap = NULL;
+ } else if (cinfo->colormap != NULL) {
+ cinfo->enable_external_quant = TRUE;
+ } else if (cinfo->two_pass_quantize) {
+ cinfo->enable_2pass_quant = TRUE;
+ } else {
+ cinfo->enable_1pass_quant = TRUE;
+ }
+
+ if (cinfo->enable_1pass_quant) {
+#ifdef QUANT_1PASS_SUPPORTED
+ jinit_1pass_quantizer(cinfo);
+ master->quantizer_1pass = cinfo->cquantize;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ }
+
+ /* We use the 2-pass code to map to external colormaps. */
+ if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) {
+#ifdef QUANT_2PASS_SUPPORTED
+ jinit_2pass_quantizer(cinfo);
+ master->quantizer_2pass = cinfo->cquantize;
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ }
+ /* If both quantizers are initialized, the 2-pass one is left active;
+ * this is necessary for starting with quantization to an external map.
+ */
+ }
+
+ /* Post-processing: in particular, color conversion first */
+ if (! cinfo->raw_data_out) {
+ if (master->using_merged_upsample) {
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+ jinit_merged_upsampler(cinfo); /* does color conversion too */
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else {
+ jinit_color_deconverter(cinfo);
+ jinit_upsampler(cinfo);
+ }
+ jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant);
+ }
+ /* Inverse DCT */
+ jinit_inverse_dct(cinfo);
+ /* Entropy decoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+ jinit_phuff_decoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_decoder(cinfo);
+ }
+
+ /* Initialize principal buffer controllers. */
+ use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image;
+ jinit_d_coef_controller(cinfo, use_c_buffer);
+
+ if (! cinfo->raw_data_out)
+ jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Initialize input side of decompressor to consume first scan. */
+ (*cinfo->inputctl->start_input_pass) (cinfo);
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+ /* If jpeg_start_decompress will read the whole file, initialize
+ * progress monitoring appropriately. The input step is counted
+ * as one pass.
+ */
+ if (cinfo->progress != NULL && ! cinfo->buffered_image &&
+ cinfo->inputctl->has_multiple_scans) {
+ int nscans;
+ /* Estimate number of scans to set pass_limit. */
+ if (cinfo->progressive_mode) {
+ /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+ nscans = 2 + 3 * cinfo->num_components;
+ } else {
+ /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+ nscans = cinfo->num_components;
+ }
+ cinfo->progress->pass_counter = 0L;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+ cinfo->progress->completed_passes = 0;
+ cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2);
+ /* Count the input pass as done */
+ master->pass_number++;
+ }
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+}
+
+
+/*
+ * Per-pass setup.
+ * This is called at the beginning of each output pass. We determine which
+ * modules will be active during this pass and give them appropriate
+ * start_pass calls. We also set is_dummy_pass to indicate whether this
+ * is a "real" output pass or a dummy pass for color quantization.
+ * (In the latter case, jdapistd.c will crank the pass to completion.)
+ */
+
+METHODDEF(void)
+prepare_for_output_pass (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ if (master->pub.is_dummy_pass) {
+#ifdef QUANT_2PASS_SUPPORTED
+ /* Final pass of 2-pass quantization */
+ master->pub.is_dummy_pass = FALSE;
+ (*cinfo->cquantize->start_pass) (cinfo, FALSE);
+ (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST);
+ (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif /* QUANT_2PASS_SUPPORTED */
+ } else {
+ if (cinfo->quantize_colors && cinfo->colormap == NULL) {
+ /* Select new quantization method */
+ if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) {
+ cinfo->cquantize = master->quantizer_2pass;
+ master->pub.is_dummy_pass = TRUE;
+ } else if (cinfo->enable_1pass_quant) {
+ cinfo->cquantize = master->quantizer_1pass;
+ } else {
+ ERREXIT(cinfo, JERR_MODE_CHANGE);
+ }
+ }
+ (*cinfo->idct->start_pass) (cinfo);
+ (*cinfo->coef->start_output_pass) (cinfo);
+ if (! cinfo->raw_data_out) {
+ if (! master->using_merged_upsample)
+ (*cinfo->cconvert->start_pass) (cinfo);
+ (*cinfo->upsample->start_pass) (cinfo);
+ if (cinfo->quantize_colors)
+ (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass);
+ (*cinfo->post->start_pass) (cinfo,
+ (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
+ (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
+ }
+ }
+
+ /* Set up progress monitor's pass info if present */
+ if (cinfo->progress != NULL) {
+ cinfo->progress->completed_passes = master->pass_number;
+ cinfo->progress->total_passes = master->pass_number +
+ (master->pub.is_dummy_pass ? 2 : 1);
+ /* In buffered-image mode, we assume one more output pass if EOI not
+ * yet reached, but no more passes if EOI has been reached.
+ */
+ if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) {
+ cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1);
+ }
+ }
+}
+
+
+/*
+ * Finish up at end of an output pass.
+ */
+
+METHODDEF(void)
+finish_output_pass (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ if (cinfo->quantize_colors)
+ (*cinfo->cquantize->finish_pass) (cinfo);
+ master->pass_number++;
+}
+
+
+#ifdef D_MULTISCAN_FILES_SUPPORTED
+
+/*
+ * Switch to a new external colormap between output passes.
+ */
+
+GLOBAL(void)
+jpeg_new_colormap (j_decompress_ptr cinfo)
+{
+ my_master_ptr master = (my_master_ptr) cinfo->master;
+
+ /* Prevent application from calling me at wrong times */
+ if (cinfo->global_state != DSTATE_BUFIMAGE)
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+
+ if (cinfo->quantize_colors && cinfo->enable_external_quant &&
+ cinfo->colormap != NULL) {
+ /* Select 2-pass quantizer for external colormap use */
+ cinfo->cquantize = master->quantizer_2pass;
+ /* Notify quantizer of colormap change */
+ (*cinfo->cquantize->new_color_map) (cinfo);
+ master->pub.is_dummy_pass = FALSE; /* just in case */
+ } else
+ ERREXIT(cinfo, JERR_MODE_CHANGE);
+}
+
+#endif /* D_MULTISCAN_FILES_SUPPORTED */
+
+
+/*
+ * Initialize master decompression control and select active modules.
+ * This is performed at the start of jpeg_start_decompress.
+ */
+
+GLOBAL(void)
+jinit_master_decompress (j_decompress_ptr cinfo)
+{
+ my_master_ptr master;
+
+ master = (my_master_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_decomp_master));
+ cinfo->master = (struct jpeg_decomp_master *) master;
+ master->pub.prepare_for_output_pass = prepare_for_output_pass;
+ master->pub.finish_output_pass = finish_output_pass;
+
+ master->pub.is_dummy_pass = FALSE;
+
+ master_selection(cinfo);
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
new file mode 100644
index 0000000000..29a996c063
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c
@@ -0,0 +1,406 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdmerge.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains code for merged upsampling/color conversion.
+ *
+ * This file combines functions from jdsample.c and jdcolor.c;
+ * read those files first to understand what's going on.
+ *
+ * When the chroma components are to be upsampled by simple replication
+ * (ie, box filtering), we can save some work in color conversion by
+ * calculating all the output pixels corresponding to a pair of chroma
+ * samples at one time. In the conversion equations
+ * R = Y + K1 * Cr
+ * G = Y + K2 * Cb + K3 * Cr
+ * B = Y + K4 * Cb
+ * only the Y term varies among the group of pixels corresponding to a pair
+ * of chroma samples, so the rest of the terms can be calculated just once.
+ * At typical sampling ratios, this eliminates half or three-quarters of the
+ * multiplications needed for color conversion.
+ *
+ * This file currently provides implementations for the following cases:
+ * YCbCr => RGB color conversion only.
+ * Sampling ratios of 2h1v or 2h2v.
+ * No scaling needed at upsample time.
+ * Corner-aligned (non-CCIR601) sampling alignment.
+ * Other special cases could be added, but in most applications these are
+ * the only common cases. (For uncommon cases we fall back on the more
+ * general code in jdsample.c and jdcolor.c.)
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+#ifdef UPSAMPLE_MERGING_SUPPORTED
+
+#ifdef _FX_MANAGED_CODE_
+#define my_upsampler my_upsampler_m
+#endif
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_upsampler pub; /* public fields */
+
+ /* Pointer to routine to do actual upsampling/conversion of one row group */
+ JMETHOD(void, upmethod, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf));
+
+ /* Private state for YCC->RGB conversion */
+ int * Cr_r_tab; /* => table for Cr to R conversion */
+ int * Cb_b_tab; /* => table for Cb to B conversion */
+ INT32 * Cr_g_tab; /* => table for Cr to G conversion */
+ INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+
+ /* For 2:1 vertical sampling, we produce two output rows at a time.
+ * We need a "spare" row buffer to hold the second output row if the
+ * application provides just a one-row buffer; we also use the spare
+ * to discard the dummy last row if the image height is odd.
+ */
+ JSAMPROW spare_row;
+ boolean spare_full; /* T if spare buffer is occupied */
+
+ JDIMENSION out_row_width; /* samples per output row */
+ JDIMENSION rows_to_go; /* counts rows remaining in image */
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+#define SCALEBITS 16 /* speediest right-shift on some machines */
+#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
+#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+
+
+/*
+ * Initialize tables for YCC->RGB colorspace conversion.
+ * This is taken directly from jdcolor.c; see that file for more info.
+ */
+
+LOCAL(void)
+build_ycc_rgb_table (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ upsample->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ upsample->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.40200 * x */
+ upsample->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.77200 * x */
+ upsample->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.71414 * x */
+ upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
+ /* Cb=>G value is scaled-up -0.34414 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ }
+}
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_merged_upsample (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Mark the spare buffer empty */
+ upsample->spare_full = FALSE;
+ /* Initialize total-height counter for detecting bottom of image */
+ upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * The control routine just handles the row buffering considerations.
+ */
+
+METHODDEF(void)
+merged_2v_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+/* 2:1 vertical sampling case: may need a spare row. */
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ JSAMPROW work_ptrs[2];
+ JDIMENSION num_rows; /* number of rows returned to caller */
+
+ if (upsample->spare_full) {
+ /* If we have a spare row saved from a previous cycle, just return it. */
+ jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0,
+ 1, upsample->out_row_width);
+ num_rows = 1;
+ upsample->spare_full = FALSE;
+ } else {
+ /* Figure number of rows to return to caller. */
+ num_rows = 2;
+ /* Not more than the distance to the end of the image. */
+ if (num_rows > upsample->rows_to_go)
+ num_rows = upsample->rows_to_go;
+ /* And not more than what the client can accept: */
+ out_rows_avail -= *out_row_ctr;
+ if (num_rows > out_rows_avail)
+ num_rows = out_rows_avail;
+ /* Create output pointer array for upsampler. */
+ work_ptrs[0] = output_buf[*out_row_ctr];
+ if (num_rows > 1) {
+ work_ptrs[1] = output_buf[*out_row_ctr + 1];
+ } else {
+ work_ptrs[1] = upsample->spare_row;
+ upsample->spare_full = TRUE;
+ }
+ /* Now do the upsampling. */
+ (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs);
+ }
+
+ /* Adjust counts */
+ *out_row_ctr += num_rows;
+ upsample->rows_to_go -= num_rows;
+ /* When the buffer is emptied, declare this input row group consumed */
+ if (! upsample->spare_full)
+ (*in_row_group_ctr)++;
+}
+
+
+METHODDEF(void)
+merged_1v_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+/* 1:1 vertical sampling case: much easier, never need a spare row. */
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Just do the upsampling. */
+ (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr,
+ output_buf + *out_row_ctr);
+ /* Adjust counts */
+ (*out_row_ctr)++;
+ (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by the control routines to do
+ * the actual upsampling/conversion. One row group is processed per call.
+ *
+ * Note: since we may be writing directly into application-supplied buffers,
+ * we have to be honest about the output width; we can't assume the buffer
+ * has been rounded up to an even width.
+ */
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical.
+ */
+
+METHODDEF(void)
+h2v1_merged_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ register int y, cred, cgreen, cblue;
+ int cb, cr;
+ register JSAMPROW outptr;
+ JSAMPROW inptr0, inptr1, inptr2;
+ JDIMENSION col;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ int * Crrtab = upsample->Cr_r_tab;
+ int * Cbbtab = upsample->Cb_b_tab;
+ INT32 * Crgtab = upsample->Cr_g_tab;
+ INT32 * Cbgtab = upsample->Cb_g_tab;
+ SHIFT_TEMPS
+
+ inptr0 = input_buf[0][in_row_group_ctr];
+ inptr1 = input_buf[1][in_row_group_ctr];
+ inptr2 = input_buf[2][in_row_group_ctr];
+ outptr = output_buf[0];
+ /* Loop for each pair of output pixels */
+ for (col = cinfo->output_width >> 1; col > 0; col--) {
+ /* Do the chroma part of the calculation */
+ cb = GETJSAMPLE(*inptr1++);
+ cr = GETJSAMPLE(*inptr2++);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ /* Fetch 2 Y values and emit 2 pixels */
+ y = GETJSAMPLE(*inptr0++);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr0++);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr += RGB_PIXELSIZE;
+ }
+ /* If image width is odd, do the last output column separately */
+ if (cinfo->output_width & 1) {
+ cb = GETJSAMPLE(*inptr1);
+ cr = GETJSAMPLE(*inptr2);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ y = GETJSAMPLE(*inptr0);
+ outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_GREEN] = range_limit[y + cgreen];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
+ }
+}
+
+
+/*
+ * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical.
+ */
+
+METHODDEF(void)
+h2v2_merged_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr,
+ JSAMPARRAY output_buf)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ register int y, cred, cgreen, cblue;
+ int cb, cr;
+ register JSAMPROW outptr0, outptr1;
+ JSAMPROW inptr00, inptr01, inptr1, inptr2;
+ JDIMENSION col;
+ /* copy these pointers into registers if possible */
+ register JSAMPLE * range_limit = cinfo->sample_range_limit;
+ int * Crrtab = upsample->Cr_r_tab;
+ int * Cbbtab = upsample->Cb_b_tab;
+ INT32 * Crgtab = upsample->Cr_g_tab;
+ INT32 * Cbgtab = upsample->Cb_g_tab;
+ SHIFT_TEMPS
+
+ inptr00 = input_buf[0][in_row_group_ctr*2];
+ inptr01 = input_buf[0][in_row_group_ctr*2 + 1];
+ inptr1 = input_buf[1][in_row_group_ctr];
+ inptr2 = input_buf[2][in_row_group_ctr];
+ outptr0 = output_buf[0];
+ outptr1 = output_buf[1];
+ /* Loop for each group of output pixels */
+ for (col = cinfo->output_width >> 1; col > 0; col--) {
+ /* Do the chroma part of the calculation */
+ cb = GETJSAMPLE(*inptr1++);
+ cr = GETJSAMPLE(*inptr2++);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ /* Fetch 4 Y values and emit 4 pixels */
+ y = GETJSAMPLE(*inptr00++);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr00++);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr01++);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1 += RGB_PIXELSIZE;
+ y = GETJSAMPLE(*inptr01++);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1 += RGB_PIXELSIZE;
+ }
+ /* If image width is odd, do the last output column separately */
+ if (cinfo->output_width & 1) {
+ cb = GETJSAMPLE(*inptr1);
+ cr = GETJSAMPLE(*inptr2);
+ cred = Crrtab[cr];
+ cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
+ cblue = Cbbtab[cb];
+ y = GETJSAMPLE(*inptr00);
+ outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_GREEN] = range_limit[y + cgreen];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
+ y = GETJSAMPLE(*inptr01);
+ outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_GREEN] = range_limit[y + cgreen];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
+ }
+}
+
+
+/*
+ * Module initialization routine for merged upsampling/color conversion.
+ *
+ * NB: this is called under the conditions determined by use_merged_upsample()
+ * in jdmaster.c. That routine MUST correspond to the actual capabilities
+ * of this module; no safety checks are made here.
+ */
+
+GLOBAL(void)
+jinit_merged_upsampler (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample;
+
+ upsample = (my_upsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_upsampler));
+ cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ upsample->pub.start_pass = start_pass_merged_upsample;
+ upsample->pub.need_context_rows = FALSE;
+
+ upsample->out_row_width = cinfo->output_width * cinfo->out_color_components;
+
+ if (cinfo->max_v_samp_factor == 2) {
+ upsample->pub.upsample = merged_2v_upsample;
+ upsample->upmethod = h2v2_merged_upsample;
+ /* Allocate a spare row buffer */
+ upsample->spare_row = (JSAMPROW)
+ (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE)));
+ } else {
+ upsample->pub.upsample = merged_1v_upsample;
+ upsample->upmethod = h2v1_merged_upsample;
+ /* No spare row needed */
+ upsample->spare_row = NULL;
+ }
+
+ build_ycc_rgb_table(cinfo);
+}
+
+#endif /* UPSAMPLE_MERGING_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
new file mode 100644
index 0000000000..3c19d0ab24
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c
@@ -0,0 +1,671 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdphuff.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains Huffman entropy decoding routines for progressive JPEG.
+ *
+ * Much of the complexity here has to do with supporting input suspension.
+ * If the data source module demands suspension, we want to be able to back
+ * up to the start of the current MCU. To do this, we copy state variables
+ * into local working storage, and update them back to the permanent
+ * storage only upon successful completion of an MCU.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdhuff.h" /* Declarations shared with jdhuff.c */
+
+
+#ifdef D_PROGRESSIVE_SUPPORTED
+
+/*
+ * Expanded entropy decoder object for progressive Huffman decoding.
+ *
+ * The savable_state subrecord contains fields that change within an MCU,
+ * but must not be updated permanently until we complete the MCU.
+ */
+
+typedef struct {
+ unsigned int EOBRUN; /* remaining EOBs in EOBRUN */
+ int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
+} savable_state;
+
+/* This macro is to work around compilers with missing or broken
+ * structure assignment. You'll need to fix this code if you have
+ * such a compiler and you change MAX_COMPS_IN_SCAN.
+ */
+
+#ifndef NO_STRUCT_ASSIGN
+#define ASSIGN_STATE(dest,src) ((dest) = (src))
+#else
+#if MAX_COMPS_IN_SCAN == 4
+#define ASSIGN_STATE(dest,src) \
+ ((dest).EOBRUN = (src).EOBRUN, \
+ (dest).last_dc_val[0] = (src).last_dc_val[0], \
+ (dest).last_dc_val[1] = (src).last_dc_val[1], \
+ (dest).last_dc_val[2] = (src).last_dc_val[2], \
+ (dest).last_dc_val[3] = (src).last_dc_val[3])
+#endif
+#endif
+
+
+typedef struct {
+ struct jpeg_entropy_decoder pub; /* public fields */
+
+ /* These fields are loaded into local variables at start of each MCU.
+ * In case of suspension, we exit WITHOUT updating them.
+ */
+ bitread_perm_state bitstate; /* Bit buffer at start of MCU */
+ savable_state saved; /* Other state at start of MCU */
+
+ /* These fields are NOT loaded into local working state. */
+ unsigned int restarts_to_go; /* MCUs left in this restart interval */
+
+ /* Pointers to derived tables (these workspaces have image lifespan) */
+ d_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
+
+ d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */
+} phuff_entropy_decoder;
+
+typedef phuff_entropy_decoder * phuff_entropy_ptr;
+
+/* Forward declarations */
+METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+
+/*
+ * Initialize for a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+start_pass_phuff_decoder (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ boolean is_DC_band, bad;
+ int ci, coefi, tbl;
+ int *coef_bit_ptr;
+ jpeg_component_info * compptr;
+
+ is_DC_band = (cinfo->Ss == 0);
+
+ /* Validate scan parameters */
+ bad = FALSE;
+ if (is_DC_band) {
+ if (cinfo->Se != 0)
+ bad = TRUE;
+ } else {
+ /* need not check Ss/Se < 0 since they came from unsigned bytes */
+ if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2)
+ bad = TRUE;
+ /* AC scans may have only one component */
+ if (cinfo->comps_in_scan != 1)
+ bad = TRUE;
+ }
+ if (cinfo->Ah != 0) {
+ /* Successive approximation refinement scan: must have Al = Ah-1. */
+ if (cinfo->Al != cinfo->Ah-1)
+ bad = TRUE;
+ }
+ if (cinfo->Al > 13) /* need not check for < 0 */
+ bad = TRUE;
+ /* Arguably the maximum Al value should be less than 13 for 8-bit precision,
+ * but the spec doesn't say so, and we try to be liberal about what we
+ * accept. Note: large Al values could result in out-of-range DC
+ * coefficients during early scans, leading to bizarre displays due to
+ * overflows in the IDCT math. But we won't crash.
+ */
+ if (bad)
+ ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
+ cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
+ /* Update progression status, and verify that scan order is legal.
+ * Note that inter-scan inconsistencies are treated as warnings
+ * not fatal errors ... not clear if this is right way to behave.
+ */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ int cindex = cinfo->cur_comp_info[ci]->component_index;
+ coef_bit_ptr = & cinfo->coef_bits[cindex][0];
+ if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
+ for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
+ int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
+ if (cinfo->Ah != expected)
+ WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
+ coef_bit_ptr[coefi] = cinfo->Al;
+ }
+ }
+
+ /* Select MCU decoding routine */
+ if (cinfo->Ah == 0) {
+ if (is_DC_band)
+ entropy->pub.decode_mcu = decode_mcu_DC_first;
+ else
+ entropy->pub.decode_mcu = decode_mcu_AC_first;
+ } else {
+ if (is_DC_band)
+ entropy->pub.decode_mcu = decode_mcu_DC_refine;
+ else
+ entropy->pub.decode_mcu = decode_mcu_AC_refine;
+ }
+
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ /* Make sure requested tables are present, and compute derived tables.
+ * We may build same derived table more than once, but it's not expensive.
+ */
+ if (is_DC_band) {
+ if (cinfo->Ah == 0) { /* DC refinement needs no table */
+ tbl = compptr->dc_tbl_no;
+ jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
+ & entropy->derived_tbls[tbl]);
+ }
+ } else {
+ tbl = compptr->ac_tbl_no;
+ jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
+ & entropy->derived_tbls[tbl]);
+ /* remember the single active table */
+ entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
+ }
+ /* Initialize DC predictions to 0 */
+ entropy->saved.last_dc_val[ci] = 0;
+ }
+
+ /* Initialize bitread state variables */
+ entropy->bitstate.bits_left = 0;
+ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
+ entropy->pub.insufficient_data = FALSE;
+
+ /* Initialize private state variables */
+ entropy->saved.EOBRUN = 0;
+
+ /* Initialize restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+}
+
+
+/*
+ * Figure F.12: extend sign bit.
+ * On some machines, a shift and add will be faster than a table lookup.
+ */
+
+#ifdef AVOID_TABLES
+
+#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x))
+
+#else
+
+#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x))
+
+static const int extend_test[16] = /* entry n is 2**(n-1) */
+ { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
+ 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
+
+static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */
+ { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1,
+ ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1,
+ ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1,
+ ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
+
+#endif /* AVOID_TABLES */
+
+
+/*
+ * Check for a restart marker & resynchronize decoder.
+ * Returns FALSE if must suspend.
+ */
+
+LOCAL(boolean)
+process_restart (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int ci;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+
+ /* Advance past the RSTn marker */
+ if (! (*cinfo->marker->read_restart_marker) (cinfo))
+ return FALSE;
+
+ /* Re-initialize DC predictions to 0 */
+ for (ci = 0; ci < cinfo->comps_in_scan; ci++)
+ entropy->saved.last_dc_val[ci] = 0;
+ /* Re-init EOB run count, too */
+ entropy->saved.EOBRUN = 0;
+
+ /* Reset restart counter */
+ entropy->restarts_to_go = cinfo->restart_interval;
+
+ /* Reset out-of-data flag, unless read_restart_marker left us smack up
+ * against a marker. In that case we will end up treating the next data
+ * segment as empty, and we can avoid producing bogus output pixels by
+ * leaving the flag set.
+ */
+ if (cinfo->unread_marker == 0)
+ entropy->pub.insufficient_data = FALSE;
+
+ return TRUE;
+}
+
+
+/*
+ * Huffman MCU decoding.
+ * Each of these routines decodes and returns one MCU's worth of
+ * Huffman-compressed coefficients.
+ * The coefficients are reordered from zigzag order into natural array order,
+ * but are not dequantized.
+ *
+ * The i'th block of the MCU is stored into the block pointed to by
+ * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
+ *
+ * We return FALSE if data source requested suspension. In that case no
+ * changes have been made to permanent state. (Exception: some output
+ * coefficients may already have been assigned. This is harmless for
+ * spectral selection, since we'll just re-assign them on the next call.
+ * Successive approximation AC refinement has to be more careful, however.)
+ */
+
+/*
+ * MCU decoding for DC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Al = cinfo->Al;
+ register int s, r;
+ int blkn, ci;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+ savable_state state;
+ d_derived_tbl * tbl;
+ jpeg_component_info * compptr;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(state, entropy->saved);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+ ci = cinfo->MCU_membership[blkn];
+ compptr = cinfo->cur_comp_info[ci];
+ tbl = entropy->derived_tbls[compptr->dc_tbl_no];
+
+ /* Decode a single block's worth of coefficients */
+
+ /* Section F.2.2.1: decode the DC coefficient difference */
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label1);
+ if (s) {
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ }
+
+ /* Convert DC difference to actual value, update last_dc_val */
+ s += state.last_dc_val[ci];
+ state.last_dc_val[ci] = s;
+ /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */
+ (*block)[0] = (JCOEF) (s << Al);
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ ASSIGN_STATE(entropy->saved, state);
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC initial scan (either spectral selection,
+ * or first pass of successive approximation).
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Se = cinfo->Se;
+ int Al = cinfo->Al;
+ register int s, k, r;
+ unsigned int EOBRUN;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+ d_derived_tbl * tbl;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, just leave the MCU set to zeroes.
+ * This way, we return uniform gray for the remainder of the segment.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state.
+ * We can avoid loading/saving bitread state if in an EOB run.
+ */
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
+
+ /* There is always only one block per MCU */
+
+ if (EOBRUN > 0) /* if it's a band of zeroes... */
+ EOBRUN--; /* ...process it now (we do nothing) */
+ else {
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ block = MCU_data[0];
+ tbl = entropy->ac_derived_tbl;
+
+ for (k = cinfo->Ss; k <= Se; k++) {
+ HUFF_DECODE(s, br_state, tbl, return FALSE, label2);
+ r = s >> 4;
+ s &= 15;
+ if (s) {
+ k += r;
+ CHECK_BIT_BUFFER(br_state, s, return FALSE);
+ r = GET_BITS(s);
+ s = HUFF_EXTEND(r, s);
+ /* Scale and output coefficient in natural (dezigzagged) order */
+ (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al);
+ } else {
+ if (r == 15) { /* ZRL */
+ k += 15; /* skip 15 zeroes in band */
+ } else { /* EOBr, run length is 2^r + appended bits */
+ EOBRUN = 1 << r;
+ if (r) { /* EOBr, r > 0 */
+ CHECK_BIT_BUFFER(br_state, r, return FALSE);
+ r = GET_BITS(r);
+ EOBRUN += r;
+ }
+ EOBRUN--; /* this band is processed at this moment */
+ break; /* force end-of-band */
+ }
+ }
+ }
+
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ }
+
+ /* Completed MCU, so update state */
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component, although the spec
+ * is not very clear on the point.
+ */
+
+METHODDEF(boolean)
+decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+ int blkn;
+ JBLOCKROW block;
+ BITREAD_STATE_VARS;
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* Not worth the cycles to check insufficient_data here,
+ * since we will not change the data anyway if we read zeroes.
+ */
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+
+ /* Outer loop handles each block in the MCU */
+
+ for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
+ block = MCU_data[blkn];
+
+ /* Encoded data is simply the next bit of the two's-complement DC value */
+ CHECK_BIT_BUFFER(br_state, 1, return FALSE);
+ if (GET_BITS(1))
+ (*block)[0] |= p1;
+ /* Note: since we use |=, repeating the assignment later is safe */
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+}
+
+
+/*
+ * MCU decoding for AC successive approximation refinement scan.
+ */
+
+METHODDEF(boolean)
+decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
+{
+ phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy;
+ int Se = cinfo->Se;
+ int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+ int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
+ register int s, k, r;
+ unsigned int EOBRUN;
+ JBLOCKROW block;
+ JCOEFPTR thiscoef;
+ BITREAD_STATE_VARS;
+ d_derived_tbl * tbl;
+ int num_newnz;
+ int newnz_pos[DCTSIZE2];
+
+ /* Process restart marker if needed; may have to suspend */
+ if (cinfo->restart_interval) {
+ if (entropy->restarts_to_go == 0)
+ if (! process_restart(cinfo))
+ return FALSE;
+ }
+
+ /* If we've run out of data, don't modify the MCU.
+ */
+ if (! entropy->pub.insufficient_data) {
+
+ /* Load up working state */
+ BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */
+
+ /* There is always only one block per MCU */
+ block = MCU_data[0];
+ tbl = entropy->ac_derived_tbl;
+
+ /* If we are forced to suspend, we must undo the assignments to any newly
+ * nonzero coefficients in the block, because otherwise we'd get confused
+ * next time about which coefficients were already nonzero.
+ * But we need not undo addition of bits to already-nonzero coefficients;
+ * instead, we can test the current bit to see if we already did it.
+ */
+ num_newnz = 0;
+
+ /* initialize coefficient loop counter to start of band */
+ k = cinfo->Ss;
+
+ if (EOBRUN == 0) {
+ for (; k <= Se; k++) {
+ HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
+ r = s >> 4;
+ s &= 15;
+ if (s) {
+ if (s != 1) /* size of new coef should always be 1 */
+ WARNMS(cinfo, JWRN_HUFF_BAD_CODE);
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1))
+ s = p1; /* newly nonzero coef is positive */
+ else
+ s = m1; /* newly nonzero coef is negative */
+ } else {
+ if (r != 15) {
+ EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */
+ if (r) {
+ CHECK_BIT_BUFFER(br_state, r, goto undoit);
+ r = GET_BITS(r);
+ EOBRUN += r;
+ }
+ break; /* rest of block is handled by EOB logic */
+ }
+ /* note s = 0 for processing ZRL */
+ }
+ /* Advance over already-nonzero coefs and r still-zero coefs,
+ * appending correction bits to the nonzeroes. A correction bit is 1
+ * if the absolute value of the coefficient must be increased.
+ */
+ do {
+ thiscoef = *block + jpeg_natural_order[k];
+ if (*thiscoef != 0) {
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1)) {
+ if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
+ if (*thiscoef >= 0)
+ *thiscoef += p1;
+ else
+ *thiscoef += m1;
+ }
+ }
+ } else {
+ if (--r < 0)
+ break; /* reached target zero coefficient */
+ }
+ k++;
+ } while (k <= Se);
+ if (s) {
+ int pos = jpeg_natural_order[k];
+ /* Output newly nonzero coefficient */
+ (*block)[pos] = (JCOEF) s;
+ /* Remember its position in case we have to suspend */
+ newnz_pos[num_newnz++] = pos;
+ }
+ }
+ }
+
+ if (EOBRUN > 0) {
+ /* Scan any remaining coefficient positions after the end-of-band
+ * (the last newly nonzero coefficient, if any). Append a correction
+ * bit to each already-nonzero coefficient. A correction bit is 1
+ * if the absolute value of the coefficient must be increased.
+ */
+ for (; k <= Se; k++) {
+ thiscoef = *block + jpeg_natural_order[k];
+ if (*thiscoef != 0) {
+ CHECK_BIT_BUFFER(br_state, 1, goto undoit);
+ if (GET_BITS(1)) {
+ if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
+ if (*thiscoef >= 0)
+ *thiscoef += p1;
+ else
+ *thiscoef += m1;
+ }
+ }
+ }
+ }
+ /* Count one block completed in EOB run */
+ EOBRUN--;
+ }
+
+ /* Completed MCU, so update state */
+ BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
+ entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */
+ }
+
+ /* Account for restart interval (no-op if not using restarts) */
+ entropy->restarts_to_go--;
+
+ return TRUE;
+
+undoit:
+ /* Re-zero any output coefficients that we made newly nonzero */
+ while (num_newnz > 0)
+ (*block)[newnz_pos[--num_newnz]] = 0;
+
+ return FALSE;
+}
+
+
+/*
+ * Module initialization routine for progressive Huffman entropy decoding.
+ */
+
+GLOBAL(void)
+jinit_phuff_decoder (j_decompress_ptr cinfo)
+{
+ phuff_entropy_ptr entropy;
+ int *coef_bit_ptr;
+ int ci, i;
+
+ entropy = (phuff_entropy_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(phuff_entropy_decoder));
+ cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ entropy->pub.start_pass = start_pass_phuff_decoder;
+
+ /* Mark derived tables unallocated */
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
+ entropy->derived_tbls[i] = NULL;
+ }
+
+ /* Create progression status table */
+ cinfo->coef_bits = (int (*)[DCTSIZE2])
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->num_components*DCTSIZE2*SIZEOF(int));
+ coef_bit_ptr = & cinfo->coef_bits[0][0];
+ for (ci = 0; ci < cinfo->num_components; ci++)
+ for (i = 0; i < DCTSIZE2; i++)
+ *coef_bit_ptr++ = -1;
+}
+
+#endif /* D_PROGRESSIVE_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
new file mode 100644
index 0000000000..855be5c8aa
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c
@@ -0,0 +1,293 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdpostct.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the decompression postprocessing controller.
+ * This controller manages the upsampling, color conversion, and color
+ * quantization/reduction steps; specifically, it controls the buffering
+ * between upsample/color conversion and color quantization/reduction.
+ *
+ * If no color quantization/reduction is required, then this module has no
+ * work to do, and it just hands off to the upsample/color conversion code.
+ * An integrated upsample/convert/quantize process would replace this module
+ * entirely.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Private buffer controller object */
+
+typedef struct {
+ struct jpeg_d_post_controller pub; /* public fields */
+
+ /* Color quantization source buffer: this holds output data from
+ * the upsample/color conversion step to be passed to the quantizer.
+ * For two-pass color quantization, we need a full-image buffer;
+ * for one-pass operation, a strip buffer is sufficient.
+ */
+ jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */
+ JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */
+ JDIMENSION strip_height; /* buffer size in rows */
+ /* for two-pass mode only: */
+ JDIMENSION starting_row; /* row # of first row in current strip */
+ JDIMENSION next_row; /* index of next row to fill/empty in strip */
+} my_post_controller;
+
+typedef my_post_controller * my_post_ptr;
+
+
+/* Forward declarations */
+METHODDEF(void) post_process_1pass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+#ifdef QUANT_2PASS_SUPPORTED
+METHODDEF(void) post_process_prepass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+METHODDEF(void) post_process_2pass
+ JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+#endif
+
+
+/*
+ * Initialize for a processing pass.
+ */
+
+METHODDEF(void)
+start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+
+ switch (pass_mode) {
+ case JBUF_PASS_THRU:
+ if (cinfo->quantize_colors) {
+ /* Single-pass processing with color quantization. */
+ post->pub.post_process_data = post_process_1pass;
+ /* We could be doing buffered-image output before starting a 2-pass
+ * color quantization; in that case, jinit_d_post_controller did not
+ * allocate a strip buffer. Use the virtual-array buffer as workspace.
+ */
+ if (post->buffer == NULL) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ (JDIMENSION) 0, post->strip_height, TRUE);
+ }
+ } else {
+ /* For single-pass processing without color quantization,
+ * I have no work to do; just call the upsampler directly.
+ */
+ post->pub.post_process_data = cinfo->upsample->upsample;
+ }
+ break;
+#ifdef QUANT_2PASS_SUPPORTED
+ case JBUF_SAVE_AND_PASS:
+ /* First pass of 2-pass quantization */
+ if (post->whole_image == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ post->pub.post_process_data = post_process_prepass;
+ break;
+ case JBUF_CRANK_DEST:
+ /* Second pass of 2-pass quantization */
+ if (post->whole_image == NULL)
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ post->pub.post_process_data = post_process_2pass;
+ break;
+#endif /* QUANT_2PASS_SUPPORTED */
+ default:
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+ break;
+ }
+ post->starting_row = post->next_row = 0;
+}
+
+
+/*
+ * Process some data in the one-pass (strip buffer) case.
+ * This is used for color precision reduction as well as one-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_1pass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION num_rows, max_rows;
+
+ /* Fill the buffer, but not more than what we can dump out in one go. */
+ /* Note we rely on the upsampler to detect bottom of image. */
+ max_rows = out_rows_avail - *out_row_ctr;
+ if (max_rows > post->strip_height)
+ max_rows = post->strip_height;
+ num_rows = 0;
+ (*cinfo->upsample->upsample) (cinfo,
+ input_buf, in_row_group_ctr, in_row_groups_avail,
+ post->buffer, &num_rows, max_rows);
+ /* Quantize and emit data. */
+ (*cinfo->cquantize->color_quantize) (cinfo,
+ post->buffer, output_buf + *out_row_ctr, (int) num_rows);
+ *out_row_ctr += num_rows;
+}
+
+
+#ifdef QUANT_2PASS_SUPPORTED
+
+/*
+ * Process some data in the first pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_prepass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION old_next_row, num_rows;
+
+ /* Reposition virtual buffer if at start of strip. */
+ if (post->next_row == 0) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ post->starting_row, post->strip_height, TRUE);
+ }
+
+ /* Upsample some data (up to a strip height's worth). */
+ old_next_row = post->next_row;
+ (*cinfo->upsample->upsample) (cinfo,
+ input_buf, in_row_group_ctr, in_row_groups_avail,
+ post->buffer, &post->next_row, post->strip_height);
+
+ /* Allow quantizer to scan new data. No data is emitted, */
+ /* but we advance out_row_ctr so outer loop can tell when we're done. */
+ if (post->next_row > old_next_row) {
+ num_rows = post->next_row - old_next_row;
+ (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row,
+ (JSAMPARRAY) NULL, (int) num_rows);
+ *out_row_ctr += num_rows;
+ }
+
+ /* Advance if we filled the strip. */
+ if (post->next_row >= post->strip_height) {
+ post->starting_row += post->strip_height;
+ post->next_row = 0;
+ }
+}
+
+
+/*
+ * Process some data in the second pass of 2-pass quantization.
+ */
+
+METHODDEF(void)
+post_process_2pass (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_post_ptr post = (my_post_ptr) cinfo->post;
+ JDIMENSION num_rows, max_rows;
+
+ /* Reposition virtual buffer if at start of strip. */
+ if (post->next_row == 0) {
+ post->buffer = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, post->whole_image,
+ post->starting_row, post->strip_height, FALSE);
+ }
+
+ /* Determine number of rows to emit. */
+ num_rows = post->strip_height - post->next_row; /* available in strip */
+ max_rows = out_rows_avail - *out_row_ctr; /* available in output area */
+ if (num_rows > max_rows)
+ num_rows = max_rows;
+ /* We have to check bottom of image here, can't depend on upsampler. */
+ max_rows = cinfo->output_height - post->starting_row;
+ if (num_rows > max_rows)
+ num_rows = max_rows;
+
+ /* Quantize and emit data. */
+ (*cinfo->cquantize->color_quantize) (cinfo,
+ post->buffer + post->next_row, output_buf + *out_row_ctr,
+ (int) num_rows);
+ *out_row_ctr += num_rows;
+
+ /* Advance if we filled the strip. */
+ post->next_row += num_rows;
+ if (post->next_row >= post->strip_height) {
+ post->starting_row += post->strip_height;
+ post->next_row = 0;
+ }
+}
+
+#endif /* QUANT_2PASS_SUPPORTED */
+
+
+/*
+ * Initialize postprocessing controller.
+ */
+
+GLOBAL(void)
+jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
+{
+ my_post_ptr post;
+
+ post = (my_post_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_post_controller));
+ cinfo->post = (struct jpeg_d_post_controller *) post;
+ post->pub.start_pass = start_pass_dpost;
+ post->whole_image = NULL; /* flag for no virtual arrays */
+ post->buffer = NULL; /* flag for no strip buffer */
+
+ /* Create the quantization buffer, if needed */
+ if (cinfo->quantize_colors) {
+ /* The buffer strip height is max_v_samp_factor, which is typically
+ * an efficient number of rows for upsampling to return.
+ * (In the presence of output rescaling, we might want to be smarter?)
+ */
+ post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor;
+ if (need_full_buffer) {
+ /* Two-pass color quantization: need full-image storage. */
+ /* We round up the number of rows to a multiple of the strip height. */
+#ifdef QUANT_2PASS_SUPPORTED
+ post->whole_image = (*cinfo->mem->request_virt_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
+ cinfo->output_width * cinfo->out_color_components,
+ (JDIMENSION) jround_up((long) cinfo->output_height,
+ (long) post->strip_height),
+ post->strip_height);
+#else
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
+#endif /* QUANT_2PASS_SUPPORTED */
+ } else {
+ /* One-pass color quantization: just make a strip buffer. */
+ post->buffer = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ cinfo->output_width * cinfo->out_color_components,
+ post->strip_height);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
new file mode 100644
index 0000000000..a2eae954b5
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdsample.c
@@ -0,0 +1,481 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdsample.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains upsampling routines.
+ *
+ * Upsampling input data is counted in "row groups". A row group
+ * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
+ * sample rows of each component. Upsampling will normally produce
+ * max_v_samp_factor pixel rows from each row group (but this could vary
+ * if the upsampler is applying a scale factor of its own).
+ *
+ * An excellent reference for image resampling is
+ * Digital Image Warping, George Wolberg, 1990.
+ * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Pointer to routine to upsample a single component */
+typedef JMETHOD(void, upsample1_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr));
+
+/* Private subobject */
+
+typedef struct {
+ struct jpeg_upsampler pub; /* public fields */
+
+ /* Color conversion buffer. When using separate upsampling and color
+ * conversion steps, this buffer holds one upsampled row group until it
+ * has been color converted and output.
+ * Note: we do not allocate any storage for component(s) which are full-size,
+ * ie do not need rescaling. The corresponding entry of color_buf[] is
+ * simply set to point to the input data array, thereby avoiding copying.
+ */
+ JSAMPARRAY color_buf[MAX_COMPONENTS];
+
+ /* Per-component upsampling method pointers */
+ upsample1_ptr methods[MAX_COMPONENTS];
+
+ int next_row_out; /* counts rows emitted from color_buf */
+ JDIMENSION rows_to_go; /* counts rows remaining in image */
+
+ /* Height of an input row group for each component. */
+ int rowgroup_height[MAX_COMPONENTS];
+
+ /* These arrays save pixel expansion factors so that int_expand need not
+ * recompute them each time. They are unused for other upsampling methods.
+ */
+ UINT8 h_expand[MAX_COMPONENTS];
+ UINT8 v_expand[MAX_COMPONENTS];
+} my_upsampler;
+
+typedef my_upsampler * my_upsample_ptr;
+
+
+/*
+ * Initialize for an upsampling pass.
+ */
+
+METHODDEF(void)
+start_pass_upsample (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+
+ /* Mark the conversion buffer empty */
+ upsample->next_row_out = cinfo->max_v_samp_factor;
+ /* Initialize total-height counter for detecting bottom of image */
+ upsample->rows_to_go = cinfo->output_height;
+}
+
+
+/*
+ * Control routine to do upsampling (and color conversion).
+ *
+ * In this version we upsample each component independently.
+ * We upsample one row group into the conversion buffer, then apply
+ * color conversion a row at a time.
+ */
+
+METHODDEF(void)
+sep_upsample (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ int ci;
+ jpeg_component_info * compptr;
+ JDIMENSION num_rows;
+
+ /* Fill the conversion buffer, if it's empty */
+ if (upsample->next_row_out >= cinfo->max_v_samp_factor) {
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Invoke per-component upsample method. Notice we pass a POINTER
+ * to color_buf[ci], so that fullsize_upsample can change it.
+ */
+ (*upsample->methods[ci]) (cinfo, compptr,
+ input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]),
+ upsample->color_buf + ci);
+ }
+ upsample->next_row_out = 0;
+ }
+
+ /* Color-convert and emit rows */
+
+ /* How many we have in the buffer: */
+ num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out);
+ /* Not more than the distance to the end of the image. Need this test
+ * in case the image height is not a multiple of max_v_samp_factor:
+ */
+ if (num_rows > upsample->rows_to_go)
+ num_rows = upsample->rows_to_go;
+ /* And not more than what the client can accept: */
+ out_rows_avail -= *out_row_ctr;
+ if (num_rows > out_rows_avail)
+ num_rows = out_rows_avail;
+
+ (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf,
+ (JDIMENSION) upsample->next_row_out,
+ output_buf + *out_row_ctr,
+ (int) num_rows);
+
+ /* Adjust counts */
+ *out_row_ctr += num_rows;
+ upsample->rows_to_go -= num_rows;
+ upsample->next_row_out += num_rows;
+ /* When the buffer is emptied, declare this input row group consumed */
+ if (upsample->next_row_out >= cinfo->max_v_samp_factor)
+ (*in_row_group_ctr)++;
+}
+
+
+/*
+ * These are the routines invoked by sep_upsample to upsample pixel values
+ * of a single component. One row group is processed per call.
+ */
+
+
+/*
+ * For full-size components, we just make color_buf[ci] point at the
+ * input buffer, and thus avoid copying any data. Note that this is
+ * safe only because sep_upsample doesn't declare the input row group
+ * "consumed" until we are done color converting and emitting it.
+ */
+
+METHODDEF(void)
+fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ *output_data_ptr = input_data;
+}
+
+
+/*
+ * This is a no-op version used for "uninteresting" components.
+ * These components will not be referenced by color conversion.
+ */
+
+METHODDEF(void)
+noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ *output_data_ptr = NULL; /* safety check */
+}
+
+
+/*
+ * This version handles any integral sampling ratios.
+ * This is not used for typical JPEG files, so it need not be fast.
+ * Nor, for that matter, is it particularly accurate: the algorithm is
+ * simple replication of the input pixel onto the corresponding output
+ * pixels. The hi-falutin sampling literature refers to this as a
+ * "box filter". A box filter tends to introduce visible artifacts,
+ * so if you are actually going to use 3:1 or 4:1 sampling ratios
+ * you would be well advised to improve this code.
+ */
+
+METHODDEF(void)
+int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ register int h;
+ JSAMPROW outend;
+ int h_expand, v_expand;
+ int inrow, outrow;
+
+ h_expand = upsample->h_expand[compptr->component_index];
+ v_expand = upsample->v_expand[compptr->component_index];
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ /* Generate one output row with proper horizontal expansion */
+ inptr = input_data[inrow];
+ outptr = output_data[outrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ for (h = h_expand; h > 0; h--) {
+ *outptr++ = invalue;
+ }
+ }
+ /* Generate any additional output rows by duplicating the first one */
+ if (v_expand > 1) {
+ jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+ v_expand-1, cinfo->output_width);
+ }
+ inrow++;
+ outrow += v_expand;
+ }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 1:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ JSAMPROW outend;
+ int inrow;
+
+ for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+ inptr = input_data[inrow];
+ outptr = output_data[inrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ *outptr++ = invalue;
+ *outptr++ = invalue;
+ }
+ }
+}
+
+
+/*
+ * Fast processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * It's still a box filter.
+ */
+
+METHODDEF(void)
+h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register JSAMPLE invalue;
+ JSAMPROW outend;
+ int inrow, outrow;
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ inptr = input_data[inrow];
+ outptr = output_data[outrow];
+ outend = outptr + cinfo->output_width;
+ while (outptr < outend) {
+ invalue = *inptr++; /* don't need GETJSAMPLE() here */
+ *outptr++ = invalue;
+ *outptr++ = invalue;
+ }
+ jcopy_sample_rows(output_data, outrow, output_data, outrow+1,
+ 1, cinfo->output_width);
+ inrow++;
+ outrow += 2;
+ }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical.
+ *
+ * The upsampling algorithm is linear interpolation between pixel centers,
+ * also known as a "triangle filter". This is a good compromise between
+ * speed and visual quality. The centers of the output pixels are 1/4 and 3/4
+ * of the way between input pixel centers.
+ *
+ * A note about the "bias" calculations: when rounding fractional values to
+ * integer, we do not want to always round 0.5 up to the next integer.
+ * If we did that, we'd introduce a noticeable bias towards larger values.
+ * Instead, this code is arranged so that 0.5 will be rounded up or down at
+ * alternate pixel locations (a simple ordered dither pattern).
+ */
+
+METHODDEF(void)
+h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr, outptr;
+ register int invalue;
+ register JDIMENSION colctr;
+ int inrow;
+
+ for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) {
+ inptr = input_data[inrow];
+ outptr = output_data[inrow];
+ /* Special case for first column */
+ invalue = GETJSAMPLE(*inptr++);
+ *outptr++ = (JSAMPLE) invalue;
+ *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2);
+
+ for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+ /* General case: 3/4 * nearer pixel + 1/4 * further pixel */
+ invalue = GETJSAMPLE(*inptr++) * 3;
+ *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2);
+ *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2);
+ }
+
+ /* Special case for last column */
+ invalue = GETJSAMPLE(*inptr);
+ *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2);
+ *outptr++ = (JSAMPLE) invalue;
+ }
+}
+
+
+/*
+ * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical.
+ * Again a triangle filter; see comments for h2v1 case, above.
+ *
+ * It is OK for us to reference the adjacent input rows because we demanded
+ * context from the main buffer controller (see initialization code).
+ */
+
+METHODDEF(void)
+h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)
+{
+ JSAMPARRAY output_data = *output_data_ptr;
+ register JSAMPROW inptr0, inptr1, outptr;
+#if BITS_IN_JSAMPLE == 8
+ register int thiscolsum, lastcolsum, nextcolsum;
+#else
+ register INT32 thiscolsum, lastcolsum, nextcolsum;
+#endif
+ register JDIMENSION colctr;
+ int inrow, outrow, v;
+
+ inrow = outrow = 0;
+ while (outrow < cinfo->max_v_samp_factor) {
+ for (v = 0; v < 2; v++) {
+ /* inptr0 points to nearest input row, inptr1 points to next nearest */
+ inptr0 = input_data[inrow];
+ if (v == 0) /* next nearest is row above */
+ inptr1 = input_data[inrow-1];
+ else /* next nearest is row below */
+ inptr1 = input_data[inrow+1];
+ outptr = output_data[outrow++];
+
+ /* Special case for first column */
+ thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+ lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+
+ for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) {
+ /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */
+ /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */
+ nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4);
+ lastcolsum = thiscolsum; thiscolsum = nextcolsum;
+ }
+
+ /* Special case for last column */
+ *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4);
+ *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4);
+ }
+ inrow++;
+ }
+}
+
+
+/*
+ * Module initialization routine for upsampling.
+ */
+
+GLOBAL(void)
+jinit_upsampler (j_decompress_ptr cinfo)
+{
+ my_upsample_ptr upsample;
+ int ci;
+ jpeg_component_info * compptr;
+ boolean need_buffer, do_fancy;
+ int h_in_group, v_in_group, h_out_group, v_out_group;
+
+ upsample = (my_upsample_ptr)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(my_upsampler));
+ cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ upsample->pub.start_pass = start_pass_upsample;
+ upsample->pub.upsample = sep_upsample;
+ upsample->pub.need_context_rows = FALSE; /* until we find out differently */
+
+ if (cinfo->CCIR601_sampling) /* this isn't supported */
+ ERREXIT(cinfo, JERR_CCIR601_NOTIMPL);
+
+ /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1,
+ * so don't ask for it.
+ */
+ do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1;
+
+ /* Verify we can handle the sampling factors, select per-component methods,
+ * and create storage as needed.
+ */
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Compute size of an "input group" after IDCT scaling. This many samples
+ * are to be converted to max_h_samp_factor * max_v_samp_factor pixels.
+ */
+ h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size;
+ v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
+ cinfo->min_DCT_scaled_size;
+ h_out_group = cinfo->max_h_samp_factor;
+ v_out_group = cinfo->max_v_samp_factor;
+ upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
+ need_buffer = TRUE;
+ if (! compptr->component_needed) {
+ /* Don't bother to upsample an uninteresting component. */
+ upsample->methods[ci] = noop_upsample;
+ need_buffer = FALSE;
+ } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
+ /* Fullsize components can be processed without any work. */
+ upsample->methods[ci] = fullsize_upsample;
+ need_buffer = FALSE;
+ } else if (h_in_group * 2 == h_out_group &&
+ v_in_group == v_out_group) {
+ /* Special cases for 2h1v upsampling */
+ if (do_fancy && compptr->downsampled_width > 2)
+ upsample->methods[ci] = h2v1_fancy_upsample;
+ else
+ upsample->methods[ci] = h2v1_upsample;
+ } else if (h_in_group * 2 == h_out_group &&
+ v_in_group * 2 == v_out_group) {
+ /* Special cases for 2h2v upsampling */
+ if (do_fancy && compptr->downsampled_width > 2) {
+ upsample->methods[ci] = h2v2_fancy_upsample;
+ upsample->pub.need_context_rows = TRUE;
+ } else
+ upsample->methods[ci] = h2v2_upsample;
+ } else if ((h_out_group % h_in_group) == 0 &&
+ (v_out_group % v_in_group) == 0) {
+ /* Generic integral-factors upsampling method */
+ upsample->methods[ci] = int_upsample;
+ upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group);
+ upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
+ } else
+ ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
+ if (need_buffer) {
+ upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) jround_up((long) cinfo->output_width,
+ (long) cinfo->max_h_samp_factor),
+ (JDIMENSION) cinfo->max_v_samp_factor);
+ }
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
new file mode 100644
index 0000000000..c076a6c2bd
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c
@@ -0,0 +1,146 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jdtrans.c
+ *
+ * Copyright (C) 1995-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains library routines for transcoding decompression,
+ * that is, reading raw DCT coefficient arrays from an input JPEG file.
+ * The routines in jdapimin.c will also be needed by a transcoder.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/* Forward declarations */
+LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo));
+
+
+/*
+ * Read the coefficient arrays from a JPEG file.
+ * jpeg_read_header must be completed before calling this.
+ *
+ * The entire image is read into a set of virtual coefficient-block arrays,
+ * one per component. The return value is a pointer to the array of
+ * virtual-array descriptors. These can be manipulated directly via the
+ * JPEG memory manager, or handed off to jpeg_write_coefficients().
+ * To release the memory occupied by the virtual arrays, call
+ * jpeg_finish_decompress() when done with the data.
+ *
+ * An alternative usage is to simply obtain access to the coefficient arrays
+ * during a buffered-image-mode decompression operation. This is allowed
+ * after any jpeg_finish_output() call. The arrays can be accessed until
+ * jpeg_finish_decompress() is called. (Note that any call to the library
+ * may reposition the arrays, so don't rely on access_virt_barray() results
+ * to stay valid across library calls.)
+ *
+ * Returns NULL if suspended. This case need be checked only if
+ * a suspending data source is used.
+ */
+
+GLOBAL(jvirt_barray_ptr *)
+jpeg_read_coefficients (j_decompress_ptr cinfo)
+{
+ if (cinfo->global_state == DSTATE_READY) {
+ /* First call: initialize active modules */
+ transdecode_master_selection(cinfo);
+ cinfo->global_state = DSTATE_RDCOEFS;
+ }
+ if (cinfo->global_state == DSTATE_RDCOEFS) {
+ /* Absorb whole file into the coef buffer */
+ for (;;) {
+ int retcode;
+ /* Call progress monitor hook if present */
+ if (cinfo->progress != NULL)
+ (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
+ /* Absorb some more input */
+ retcode = (*cinfo->inputctl->consume_input) (cinfo);
+ if (retcode == JPEG_SUSPENDED)
+ return NULL;
+ if (retcode == JPEG_REACHED_EOI)
+ break;
+ /* Advance progress counter if appropriate */
+ if (cinfo->progress != NULL &&
+ (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
+ if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
+ /* startup underestimated number of scans; ratchet up one scan */
+ cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
+ }
+ }
+ }
+ /* Set state so that jpeg_finish_decompress does the right thing */
+ cinfo->global_state = DSTATE_STOPPING;
+ }
+ /* At this point we should be in state DSTATE_STOPPING if being used
+ * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access
+ * to the coefficients during a full buffered-image-mode decompression.
+ */
+ if ((cinfo->global_state == DSTATE_STOPPING ||
+ cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) {
+ return cinfo->coef->coef_arrays;
+ }
+ /* Oops, improper usage */
+ ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
+ return NULL; /* keep compiler happy */
+}
+
+
+/*
+ * Master selection of decompression modules for transcoding.
+ * This substitutes for jdmaster.c's initialization of the full decompressor.
+ */
+
+LOCAL(void)
+transdecode_master_selection (j_decompress_ptr cinfo)
+{
+ /* This is effectively a buffered-image operation. */
+ cinfo->buffered_image = TRUE;
+
+ /* Entropy decoding: either Huffman or arithmetic coding. */
+ if (cinfo->arith_code) {
+ ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
+ } else {
+ if (cinfo->progressive_mode) {
+#ifdef D_PROGRESSIVE_SUPPORTED
+ jinit_phuff_decoder(cinfo);
+#else
+ ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+ } else
+ jinit_huff_decoder(cinfo);
+ }
+
+ /* Always get a full-image coefficient buffer. */
+ jinit_d_coef_controller(cinfo, TRUE);
+
+ /* We can now tell the memory manager to allocate virtual arrays. */
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
+
+ /* Initialize input side of decompressor to consume first scan. */
+ (*cinfo->inputctl->start_input_pass) (cinfo);
+
+ /* Initialize progress monitoring. */
+ if (cinfo->progress != NULL) {
+ int nscans;
+ /* Estimate number of scans to set pass_limit. */
+ if (cinfo->progressive_mode) {
+ /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */
+ nscans = 2 + 3 * cinfo->num_components;
+ } else if (cinfo->inputctl->has_multiple_scans) {
+ /* For a nonprogressive multiscan file, estimate 1 scan per component. */
+ nscans = cinfo->num_components;
+ } else {
+ nscans = 1;
+ }
+ cinfo->progress->pass_counter = 0L;
+ cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans;
+ cinfo->progress->completed_passes = 0;
+ cinfo->progress->total_passes = 1;
+ }
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jerror.c b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
new file mode 100644
index 0000000000..9d673ba845
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jerror.c
@@ -0,0 +1,255 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jerror.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains simple error-reporting and trace-message routines.
+ * These are suitable for Unix-like systems and others where writing to
+ * stderr is the right thing to do. Many applications will want to replace
+ * some or all of these routines.
+ *
+ * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile,
+ * you get a Windows-specific hack to display error messages in a dialog box.
+ * It ain't much, but it beats dropping error messages into the bit bucket,
+ * which is what happens to output to stderr under most Windows C compilers.
+ *
+ * These routines are used by both the compression and decompression code.
+ */
+
+/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jversion.h"
+#include "jerror.h"
+
+#ifndef EXIT_FAILURE /* define exit() codes if not provided */
+#define EXIT_FAILURE 1
+#endif
+
+
+/*
+ * Create the message string table.
+ * We do this from the master message list in jerror.h by re-reading
+ * jerror.h with a suitable definition for macro JMESSAGE.
+ * The message table is made an external symbol just in case any applications
+ * want to refer to it directly.
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_message_table jMsgTable
+#endif
+
+#define JMESSAGE(code,string) string ,
+
+const char * const jpeg_std_message_table[] = {
+#include "jerror.h"
+ NULL
+};
+
+
+/*
+ * Error exit handler: must not return to caller.
+ *
+ * Applications may override this if they want to get control back after
+ * an error. Typically one would longjmp somewhere instead of exiting.
+ * The setjmp buffer can be made a private field within an expanded error
+ * handler object. Note that the info needed to generate an error message
+ * is stored in the error object, so you can generate the message now or
+ * later, at your convenience.
+ * You should make sure that the JPEG object is cleaned up (with jpeg_abort
+ * or jpeg_destroy) at some point.
+ */
+
+METHODDEF(void)
+error_exit (j_common_ptr cinfo)
+{
+ /* Always display the message */
+ (*cinfo->err->output_message) (cinfo);
+
+ /* Let the memory manager delete any temp files before we die */
+ jpeg_destroy(cinfo);
+
+// exit(EXIT_FAILURE);
+}
+
+
+/*
+ * Actual output of an error or trace message.
+ * Applications may override this method to send JPEG messages somewhere
+ * other than stderr.
+ *
+ * On Windows, printing to stderr is generally completely useless,
+ * so we provide optional code to produce an error-dialog popup.
+ * Most Windows applications will still prefer to override this routine,
+ * but if they don't, it'll do something at least marginally useful.
+ *
+ * NOTE: to use the library in an environment that doesn't support the
+ * C stdio library, you may have to delete the call to fprintf() entirely,
+ * not just not use this routine.
+ */
+
+METHODDEF(void)
+output_message (j_common_ptr cinfo)
+{
+ char buffer[JMSG_LENGTH_MAX];
+
+ /* Create the message */
+ (*cinfo->err->format_message) (cinfo, buffer);
+
+#ifdef USE_WINDOWS_MESSAGEBOX
+ /* Display it in a message dialog box */
+ MessageBox(GetActiveWindow(), buffer, "JPEG Library Error",
+ MB_OK | MB_ICONERROR);
+#else
+ /* Send it to stderr, adding a newline */
+#ifndef _FPDFAPI_MINI_
+ FXSYS_fprintf(stderr, "%s\n", buffer);
+#endif
+#endif
+}
+
+
+/*
+ * Decide whether to emit a trace or warning message.
+ * msg_level is one of:
+ * -1: recoverable corrupt-data warning, may want to abort.
+ * 0: important advisory messages (always display to user).
+ * 1: first level of tracing detail.
+ * 2,3,...: successively more detailed tracing messages.
+ * An application might override this method if it wanted to abort on warnings
+ * or change the policy about which messages to display.
+ */
+
+METHODDEF(void)
+emit_message (j_common_ptr cinfo, int msg_level)
+{
+ struct jpeg_error_mgr * err = cinfo->err;
+
+ if (msg_level < 0) {
+ /* It's a warning message. Since corrupt files may generate many warnings,
+ * the policy implemented here is to show only the first warning,
+ * unless trace_level >= 3.
+ */
+ if (err->num_warnings == 0 || err->trace_level >= 3)
+ (*err->output_message) (cinfo);
+ /* Always count warnings in num_warnings. */
+ err->num_warnings++;
+ } else {
+ /* It's a trace message. Show it if trace_level >= msg_level. */
+ if (err->trace_level >= msg_level)
+ (*err->output_message) (cinfo);
+ }
+}
+
+
+/*
+ * Format a message string for the most recent JPEG error or message.
+ * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX
+ * characters. Note that no '\n' character is added to the string.
+ * Few applications should need to override this method.
+ */
+
+METHODDEF(void)
+format_message (j_common_ptr cinfo, char * buffer)
+{
+#if 0 /* XYQ */
+ struct jpeg_error_mgr * err = cinfo->err;
+ int msg_code = err->msg_code;
+ const char * msgtext = NULL;
+ const char * msgptr;
+ char ch;
+ boolean isstring;
+
+ /* Look up message string in proper table */
+ if (msg_code > 0 && msg_code <= err->last_jpeg_message) {
+ msgtext = err->jpeg_message_table[msg_code];
+ } else if (err->addon_message_table != NULL &&
+ msg_code >= err->first_addon_message &&
+ msg_code <= err->last_addon_message) {
+ msgtext = err->addon_message_table[msg_code - err->first_addon_message];
+ }
+
+ /* Defend against bogus message number */
+ if (msgtext == NULL) {
+ err->msg_parm.i[0] = msg_code;
+ msgtext = err->jpeg_message_table[0];
+ }
+
+ /* Check for string parameter, as indicated by %s in the message text */
+ isstring = FALSE;
+ msgptr = msgtext;
+ while ((ch = *msgptr++) != '\0') {
+ if (ch == '%') {
+ if (*msgptr == 's') isstring = TRUE;
+ break;
+ }
+ }
+
+ /* Format the message into the passed buffer */
+ if (isstring)
+ FXSYS_sprintf(buffer, msgtext, err->msg_parm.s);
+ else
+ FXSYS_sprintf(buffer, msgtext,
+ err->msg_parm.i[0], err->msg_parm.i[1],
+ err->msg_parm.i[2], err->msg_parm.i[3],
+ err->msg_parm.i[4], err->msg_parm.i[5],
+ err->msg_parm.i[6], err->msg_parm.i[7]);
+#endif
+}
+
+
+/*
+ * Reset error state variables at start of a new image.
+ * This is called during compression startup to reset trace/error
+ * processing to default state, without losing any application-specific
+ * method pointers. An application might possibly want to override
+ * this method if it has additional error processing state.
+ */
+
+METHODDEF(void)
+reset_error_mgr (j_common_ptr cinfo)
+{
+ cinfo->err->num_warnings = 0;
+ /* trace_level is not reset since it is an application-supplied parameter */
+ cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */
+}
+
+
+/*
+ * Fill in the standard error-handling methods in a jpeg_error_mgr object.
+ * Typical call is:
+ * struct jpeg_compress_struct cinfo;
+ * struct jpeg_error_mgr err;
+ *
+ * cinfo.err = jpeg_std_error(&err);
+ * after which the application may override some of the methods.
+ */
+
+GLOBAL(struct jpeg_error_mgr *)
+jpeg_std_error (struct jpeg_error_mgr * err)
+{
+ err->error_exit = error_exit;
+ err->emit_message = emit_message;
+ err->output_message = output_message;
+ err->format_message = format_message;
+ err->reset_error_mgr = reset_error_mgr;
+
+ err->trace_level = 0; /* default = no tracing */
+ err->num_warnings = 0; /* no warnings emitted yet */
+ err->msg_code = 0; /* may be useful as a flag for "no error" */
+
+ /* Initialize message table pointers */
+ err->jpeg_message_table = jpeg_std_message_table;
+ err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1;
+
+ err->addon_message_table = NULL;
+ err->first_addon_message = 0; /* for safety */
+ err->last_addon_message = 0;
+
+ return err;
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
new file mode 100644
index 0000000000..9cd3dd798e
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c
@@ -0,0 +1,227 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jfdctfst.c
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column. Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README). The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs. These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries. The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values. The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jfdctint.c for more details. However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * Again to save a few shifts, the intermediate results between pass 1 and
+ * pass 2 are not upscaled, but are represented only to integral precision.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13. This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#define CONST_BITS 8
+
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */
+#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */
+#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */
+#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */
+#else
+#define FIX_0_382683433 FIX(0.382683433)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_707106781 FIX(0.707106781)
+#define FIX_1_306562965 FIX(1.306562965)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift. This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n) RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_ifast (DCTELEM * data)
+{
+ DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ DCTELEM tmp10, tmp11, tmp12, tmp13;
+ DCTELEM z1, z2, z3, z4, z5, z11, z13;
+ DCTELEM *dataptr;
+ int ctr;
+ SHIFT_TEMPS
+
+ /* Pass 1: process rows. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[0] + dataptr[7];
+ tmp7 = dataptr[0] - dataptr[7];
+ tmp1 = dataptr[1] + dataptr[6];
+ tmp6 = dataptr[1] - dataptr[6];
+ tmp2 = dataptr[2] + dataptr[5];
+ tmp5 = dataptr[2] - dataptr[5];
+ tmp3 = dataptr[3] + dataptr[4];
+ tmp4 = dataptr[3] - dataptr[4];
+
+ /* Even part */
+
+ tmp10 = tmp0 + tmp3; /* phase 2 */
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[0] = tmp10 + tmp11; /* phase 3 */
+ dataptr[4] = tmp10 - tmp11;
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+ dataptr[2] = tmp13 + z1; /* phase 5 */
+ dataptr[6] = tmp13 - z1;
+
+ /* Odd part */
+
+ tmp10 = tmp4 + tmp5; /* phase 2 */
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ /* The rotator is modified from fig 4-8 to avoid extra negations. */
+ z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+ z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+ z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+ z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+ z11 = tmp7 + z3; /* phase 5 */
+ z13 = tmp7 - z3;
+
+ dataptr[5] = z13 + z2; /* phase 6 */
+ dataptr[3] = z13 - z2;
+ dataptr[1] = z11 + z4;
+ dataptr[7] = z11 - z4;
+
+ dataptr += DCTSIZE; /* advance pointer to next row */
+ }
+
+ /* Pass 2: process columns. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+ tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+ tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+ tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+ tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+ tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+ tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+ tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+ /* Even part */
+
+ tmp10 = tmp0 + tmp3; /* phase 2 */
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */
+ dataptr[DCTSIZE*4] = tmp10 - tmp11;
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
+ dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */
+ dataptr[DCTSIZE*6] = tmp13 - z1;
+
+ /* Odd part */
+
+ tmp10 = tmp4 + tmp5; /* phase 2 */
+ tmp11 = tmp5 + tmp6;
+ tmp12 = tmp6 + tmp7;
+
+ /* The rotator is modified from fig 4-8 to avoid extra negations. */
+ z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
+ z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
+ z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
+ z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
+
+ z11 = tmp7 + z3; /* phase 5 */
+ z13 = tmp7 - z3;
+
+ dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */
+ dataptr[DCTSIZE*3] = z13 - z2;
+ dataptr[DCTSIZE*1] = z11 + z4;
+ dataptr[DCTSIZE*7] = z11 - z4;
+
+ dataptr++; /* advance pointer to next column */
+ }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
new file mode 100644
index 0000000000..88810a7d8e
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c
@@ -0,0 +1,286 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jfdctint.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * forward DCT (Discrete Cosine Transform).
+ *
+ * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
+ * on each column. Direct algorithms are also available, but they are
+ * much more complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D DCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true DCT outputs. The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm. The advantage of
+ * this arrangement is that we save two multiplications per 1-D DCT,
+ * because the y0 and y4 outputs need not be divided by sqrt(N).
+ * In the IJG code, this factor of 8 is removed by the quantization step
+ * (in jcdctmgr.c), NOT in this module.
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic. We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants). After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output. This division can be done
+ * cheaply as a right shift of CONST_BITS bits. We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision. These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling. (For 12-bit sample data, the intermediate
+ * array is INT32 anyway.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
+#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
+#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
+#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
+#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336 FIX(0.298631336)
+#define FIX_0_390180644 FIX(0.390180644)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_175875602 FIX(1.175875602)
+#define FIX_1_501321110 FIX(1.501321110)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_1_961570560 FIX(1.961570560)
+#define FIX_2_053119869 FIX(2.053119869)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_072711026 FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/*
+ * Perform the forward DCT on one block of samples.
+ */
+
+GLOBAL(void)
+jpeg_fdct_islow (DCTELEM * data)
+{
+ INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ INT32 tmp10, tmp11, tmp12, tmp13;
+ INT32 z1, z2, z3, z4, z5;
+ DCTELEM *dataptr;
+ int ctr;
+ SHIFT_TEMPS
+
+ /* Pass 1: process rows. */
+ /* Note results are scaled up by sqrt(8) compared to a true DCT; */
+ /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[0] + dataptr[7];
+ tmp7 = dataptr[0] - dataptr[7];
+ tmp1 = dataptr[1] + dataptr[6];
+ tmp6 = dataptr[1] - dataptr[6];
+ tmp2 = dataptr[2] + dataptr[5];
+ tmp5 = dataptr[2] - dataptr[5];
+ tmp3 = dataptr[3] + dataptr[4];
+ tmp4 = dataptr[3] - dataptr[4];
+
+ /* Even part per LL&M figure 1 --- note that published figure is faulty;
+ * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ */
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
+ dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+ CONST_BITS-PASS1_BITS);
+
+ /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+ * cK represents cos(K*pi/16).
+ * i0..i3 in the paper are tmp4..tmp7 here.
+ */
+
+ z1 = tmp4 + tmp7;
+ z2 = tmp5 + tmp6;
+ z3 = tmp4 + tmp6;
+ z4 = tmp5 + tmp7;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
+ dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
+
+ dataptr += DCTSIZE; /* advance pointer to next row */
+ }
+
+ /* Pass 2: process columns.
+ * We remove the PASS1_BITS scaling, but leave the results scaled up
+ * by an overall factor of 8.
+ */
+
+ dataptr = data;
+ for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
+ tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
+ tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
+ tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
+ tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
+ tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
+ tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
+ tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
+ tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
+
+ /* Even part per LL&M figure 1 --- note that published figure is faulty;
+ * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ */
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
+ dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
+ CONST_BITS+PASS1_BITS);
+
+ /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
+ * cK represents cos(K*pi/16).
+ * i0..i3 in the paper are tmp4..tmp7 here.
+ */
+
+ z1 = tmp4 + tmp7;
+ z2 = tmp5 + tmp6;
+ z3 = tmp4 + tmp6;
+ z4 = tmp5 + tmp7;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
+ CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
+ CONST_BITS+PASS1_BITS);
+
+ dataptr++; /* advance pointer to next column */
+ }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
new file mode 100644
index 0000000000..c0c504c2a6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c
@@ -0,0 +1,371 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctfst.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a fast, not so accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time). Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on Arai, Agui, and Nakajima's algorithm for
+ * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in
+ * Japanese, but the algorithm is described in the Pennebaker & Mitchell
+ * JPEG textbook (see REFERENCES section in file README). The following code
+ * is based directly on figure 4-8 in P&M.
+ * While an 8-point DCT cannot be done in less than 11 multiplies, it is
+ * possible to arrange the computation so that many of the multiplies are
+ * simple scalings of the final outputs. These multiplies can then be
+ * folded into the multiplications or divisions by the JPEG quantization
+ * table entries. The AA&N method leaves only 5 multiplies and 29 adds
+ * to be done in the DCT itself.
+ * The primary disadvantage of this method is that with fixed-point math,
+ * accuracy is lost due to imprecise representation of the scaled
+ * quantization values. The smaller the quantization table entry, the less
+ * precise the scaled value, so this implementation does worse with high-
+ * quality-setting files than with low-quality ones.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_IFAST_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling decisions are generally the same as in the LL&M algorithm;
+ * see jidctint.c for more details. However, we choose to descale
+ * (right shift) multiplication products as soon as they are formed,
+ * rather than carrying additional fractional bits into subsequent additions.
+ * This compromises accuracy slightly, but it lets us save a few shifts.
+ * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
+ * everywhere except in the multiplications proper; this saves a good deal
+ * of work on 16-bit-int machines.
+ *
+ * The dequantized coefficients are not integers because the AA&N scaling
+ * factors have been incorporated. We represent them scaled up by PASS1_BITS,
+ * so that the first and second IDCT rounds have the same input scaling.
+ * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to
+ * avoid a descaling shift; this compromises accuracy rather drastically
+ * for small quantization table entries, but it saves a lot of shifts.
+ * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway,
+ * so we use a much larger scaling factor to preserve accuracy.
+ *
+ * A final compromise is to represent the multiplicative constants to only
+ * 8 fractional bits, rather than 13. This saves some shifting work on some
+ * machines, and may also reduce the cost of multiplication (since there
+ * are fewer one-bits in the constants).
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 8
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 8
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 8
+#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */
+#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */
+#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */
+#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */
+#else
+#define FIX_1_082392200 FIX(1.082392200)
+#define FIX_1_414213562 FIX(1.414213562)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_2_613125930 FIX(2.613125930)
+#endif
+
+
+/* We can gain a little more speed, with a further compromise in accuracy,
+ * by omitting the addition in a descaling shift. This yields an incorrectly
+ * rounded result half the time...
+ */
+
+#ifndef USE_ACCURATE_ROUNDING
+#undef DESCALE
+#define DESCALE(x,n) RIGHT_SHIFT(x, n)
+#endif
+
+
+/* Multiply a DCTELEM variable by an INT32 constant, and immediately
+ * descale to yield a DCTELEM result.
+ */
+
+#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce a DCTELEM result. For 8-bit data a 16x16->16
+ * multiplication will do. For 12-bit data, the multiplier table is
+ * declared INT32, so a 32-bit multiply will be used.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval))
+#else
+#define DEQUANTIZE(coef,quantval) \
+ DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS)
+#endif
+
+
+/* Like DESCALE, but applies to a DCTELEM and produces an int.
+ * We assume that int right shift is unsigned if INT32 right shift is.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS DCTELEM ishift_temp;
+#if BITS_IN_JSAMPLE == 8
+#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */
+#else
+#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */
+#endif
+#define IRIGHT_SHIFT(x,shft) \
+ ((ishift_temp = (x)) < 0 ? \
+ (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
+ (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+#ifdef USE_ACCURATE_ROUNDING
+#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
+#else
+#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n))
+#endif
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
+ DCTELEM tmp10, tmp11, tmp12, tmp13;
+ DCTELEM z5, z10, z11, z12, z13;
+ JCOEFPTR inptr;
+ IFAST_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE2]; /* buffers data between passes */
+ SHIFT_TEMPS /* for DESCALE */
+ ISHIFT_TEMPS /* for IDESCALE */
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (IFAST_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; ctr--) {
+ /* Due to quantization, we will usually find that many of the input
+ * coefficients are zero, especially the AC terms. We can exploit this
+ * by short-circuiting the IDCT calculation for any column in which all
+ * the AC terms are zero. In that case each output is equal to the
+ * DC coefficient (with scale factor as needed).
+ * With typical images and quantization tables, half or more of the
+ * column DCT calculations can be simplified this way.
+ */
+
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+ inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero */
+ int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+ wsptr[DCTSIZE*4] = dcval;
+ wsptr[DCTSIZE*5] = dcval;
+ wsptr[DCTSIZE*6] = dcval;
+ wsptr[DCTSIZE*7] = dcval;
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ continue;
+ }
+
+ /* Even part */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+ tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ tmp10 = tmp0 + tmp2; /* phase 3 */
+ tmp11 = tmp0 - tmp2;
+
+ tmp13 = tmp1 + tmp3; /* phases 5-3 */
+ tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */
+
+ tmp0 = tmp10 + tmp13; /* phase 2 */
+ tmp3 = tmp10 - tmp13;
+ tmp1 = tmp11 + tmp12;
+ tmp2 = tmp11 - tmp12;
+
+ /* Odd part */
+
+ tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+
+ z13 = tmp6 + tmp5; /* phase 6 */
+ z10 = tmp6 - tmp5;
+ z11 = tmp4 + tmp7;
+ z12 = tmp4 - tmp7;
+
+ tmp7 = z11 + z13; /* phase 5 */
+ tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+ z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+ tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+ tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+ tmp6 = tmp12 - tmp7; /* phase 2 */
+ tmp5 = tmp11 - tmp6;
+ tmp4 = tmp10 + tmp5;
+
+ wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
+ wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
+ wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6);
+ wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
+ wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
+ wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
+ wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
+ wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ }
+
+ /* Pass 2: process rows from work array, store into output array. */
+ /* Note that we must descale the results by a factor of 8 == 2**3, */
+ /* and also undo the PASS1_BITS scaling. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < DCTSIZE; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* Rows of zeroes can be exploited in the same way as we did with columns.
+ * However, the column calculation has created many nonzero AC terms, so
+ * the simplification applies less often (typically 5% to 10% of the time).
+ * On machines with very fast multiplication, it's possible that the
+ * test takes more time than it's worth. In that case this section
+ * may be commented out.
+ */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+ outptr[4] = dcval;
+ outptr[5] = dcval;
+ outptr[6] = dcval;
+ outptr[7] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
+ tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
+
+ tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
+ tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
+ - tmp13;
+
+ tmp0 = tmp10 + tmp13;
+ tmp3 = tmp10 - tmp13;
+ tmp1 = tmp11 + tmp12;
+ tmp2 = tmp11 - tmp12;
+
+ /* Odd part */
+
+ z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3];
+ z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3];
+ z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7];
+ z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7];
+
+ tmp7 = z11 + z13; /* phase 5 */
+ tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
+
+ z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
+ tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
+ tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+
+ tmp6 = tmp12 - tmp7; /* phase 2 */
+ tmp5 = tmp11 - tmp6;
+ tmp4 = tmp10 + tmp5;
+
+ /* Final output stage: scale down by a factor of 8 and range-limit */
+
+ outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+#endif /* DCT_IFAST_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
new file mode 100644
index 0000000000..82f5cc742a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctint.c
@@ -0,0 +1,392 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctint.c
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains a slow-but-accurate integer implementation of the
+ * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
+ * must also perform dequantization of the input coefficients.
+ *
+ * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
+ * on each row (or vice versa, but it's more convenient to emit a row at
+ * a time). Direct algorithms are also available, but they are much more
+ * complex and seem not to be any faster when reduced to code.
+ *
+ * This implementation is based on an algorithm described in
+ * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
+ * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
+ * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
+ * The primary algorithm described there uses 11 multiplies and 29 adds.
+ * We use their alternate method with 12 multiplies and 32 adds.
+ * The advantage of this method is that no data path contains more than one
+ * multiplication; this allows a very simple and accurate implementation in
+ * scaled fixed-point arithmetic, with a minimal number of shifts.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef DCT_ISLOW_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/*
+ * The poop on this scaling stuff is as follows:
+ *
+ * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
+ * larger than the true IDCT outputs. The final outputs are therefore
+ * a factor of N larger than desired; since N=8 this can be cured by
+ * a simple right shift at the end of the algorithm. The advantage of
+ * this arrangement is that we save two multiplications per 1-D IDCT,
+ * because the y0 and y4 inputs need not be divided by sqrt(N).
+ *
+ * We have to do addition and subtraction of the integer inputs, which
+ * is no problem, and multiplication by fractional constants, which is
+ * a problem to do in integer arithmetic. We multiply all the constants
+ * by CONST_SCALE and convert them to integer constants (thus retaining
+ * CONST_BITS bits of precision in the constants). After doing a
+ * multiplication we have to divide the product by CONST_SCALE, with proper
+ * rounding, to produce the correct output. This division can be done
+ * cheaply as a right shift of CONST_BITS bits. We postpone shifting
+ * as long as possible so that partial sums can be added together with
+ * full fractional precision.
+ *
+ * The outputs of the first pass are scaled up by PASS1_BITS bits so that
+ * they are represented to better-than-integral precision. These outputs
+ * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
+ * with the recommended scaling. (To scale up 12-bit sample data further, an
+ * intermediate INT32 array would be needed.)
+ *
+ * To avoid overflow of the 32-bit intermediate results in pass 2, we must
+ * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
+ * shows that the values given below are the most effective.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
+#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
+#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
+#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
+#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
+#else
+#define FIX_0_298631336 FIX(0.298631336)
+#define FIX_0_390180644 FIX(0.390180644)
+#define FIX_0_541196100 FIX(0.541196100)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_175875602 FIX(1.175875602)
+#define FIX_1_501321110 FIX(1.501321110)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_1_961570560 FIX(1.961570560)
+#define FIX_2_053119869 FIX(2.053119869)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_072711026 FIX(3.072711026)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result. In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients.
+ */
+
+GLOBAL(void)
+jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp1, tmp2, tmp3;
+ INT32 tmp10, tmp11, tmp12, tmp13;
+ INT32 z1, z2, z3, z4, z5;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE2]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+ /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
+ /* furthermore, we scale the results by 2**PASS1_BITS. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; ctr--) {
+ /* Due to quantization, we will usually find that many of the input
+ * coefficients are zero, especially the AC terms. We can exploit this
+ * by short-circuiting the IDCT calculation for any column in which all
+ * the AC terms are zero. In that case each output is equal to the
+ * DC coefficient (with scale factor as needed).
+ * With typical images and quantization tables, half or more of the
+ * column DCT calculations can be simplified this way.
+ */
+
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
+ inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+ wsptr[DCTSIZE*4] = dcval;
+ wsptr[DCTSIZE*5] = dcval;
+ wsptr[DCTSIZE*6] = dcval;
+ wsptr[DCTSIZE*7] = dcval;
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ continue;
+ }
+
+ /* Even part: reverse the even part of the forward DCT. */
+ /* The rotator is sqrt(2)*c(-6). */
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+ tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+ tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
+
+ tmp0 = (z2 + z3) << CONST_BITS;
+ tmp1 = (z2 - z3) << CONST_BITS;
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ /* Odd part per figure 8; the matrix is unitary and hence its
+ * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
+ */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+ z1 = tmp0 + tmp3;
+ z2 = tmp1 + tmp2;
+ z3 = tmp0 + tmp2;
+ z4 = tmp1 + tmp3;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ tmp0 += z1 + z3;
+ tmp1 += z2 + z4;
+ tmp2 += z2 + z3;
+ tmp3 += z1 + z4;
+
+ /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
+ wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
+
+ inptr++; /* advance pointers to next column */
+ quantptr++;
+ wsptr++;
+ }
+
+ /* Pass 2: process rows from work array, store into output array. */
+ /* Note that we must descale the results by a factor of 8 == 2**3, */
+ /* and also undo the PASS1_BITS scaling. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < DCTSIZE; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* Rows of zeroes can be exploited in the same way as we did with columns.
+ * However, the column calculation has created many nonzero AC terms, so
+ * the simplification applies less often (typically 5% to 10% of the time).
+ * On machines with very fast multiplication, it's possible that the
+ * test takes more time than it's worth. In that case this section
+ * may be commented out.
+ */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+ outptr[4] = dcval;
+ outptr[5] = dcval;
+ outptr[6] = dcval;
+ outptr[7] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part: reverse the even part of the forward DCT. */
+ /* The rotator is sqrt(2)*c(-6). */
+
+ z2 = (INT32) wsptr[2];
+ z3 = (INT32) wsptr[6];
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
+ tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
+ tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
+
+ tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
+ tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
+
+ tmp10 = tmp0 + tmp3;
+ tmp13 = tmp0 - tmp3;
+ tmp11 = tmp1 + tmp2;
+ tmp12 = tmp1 - tmp2;
+
+ /* Odd part per figure 8; the matrix is unitary and hence its
+ * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
+ */
+
+ tmp0 = (INT32) wsptr[7];
+ tmp1 = (INT32) wsptr[5];
+ tmp2 = (INT32) wsptr[3];
+ tmp3 = (INT32) wsptr[1];
+
+ z1 = tmp0 + tmp3;
+ z2 = tmp1 + tmp2;
+ z3 = tmp0 + tmp2;
+ z4 = tmp1 + tmp3;
+ z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
+
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
+ z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
+ z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
+ z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+
+ z3 += z5;
+ z4 += z5;
+
+ tmp0 += z1 + z3;
+ tmp1 += z2 + z4;
+ tmp2 += z2 + z3;
+ tmp3 += z1 + z4;
+
+ /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+ outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
+ CONST_BITS+PASS1_BITS+3)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+#endif /* DCT_ISLOW_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
new file mode 100644
index 0000000000..7eb1d74afa
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jidctred.c
@@ -0,0 +1,401 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jidctred.c
+ *
+ * Copyright (C) 1994-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains inverse-DCT routines that produce reduced-size output:
+ * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block.
+ *
+ * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M)
+ * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step
+ * with an 8-to-4 step that produces the four averages of two adjacent outputs
+ * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output).
+ * These steps were derived by computing the corresponding values at the end
+ * of the normal LL&M code, then simplifying as much as possible.
+ *
+ * 1x1 is trivial: just take the DC coefficient divided by 8.
+ *
+ * See jidctint.c for additional comments.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jdct.h" /* Private declarations for DCT subsystem */
+
+#ifdef IDCT_SCALING_SUPPORTED
+
+
+/*
+ * This module is specialized to the case DCTSIZE = 8.
+ */
+
+#if DCTSIZE != 8
+ Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
+#endif
+
+
+/* Scaling is the same as in jidctint.c. */
+
+#if BITS_IN_JSAMPLE == 8
+#define CONST_BITS 13
+#define PASS1_BITS 2
+#else
+#define CONST_BITS 13
+#define PASS1_BITS 1 /* lose a little precision to avoid overflow */
+#endif
+
+/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
+ * causing a lot of useless floating-point operations at run time.
+ * To get around this we use the following pre-calculated constants.
+ * If you change CONST_BITS you may want to add appropriate values.
+ * (With a reasonable C compiler, you can just rely on the FIX() macro...)
+ */
+
+#if CONST_BITS == 13
+#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */
+#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */
+#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */
+#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */
+#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
+#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */
+#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
+#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */
+#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */
+#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */
+#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
+#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */
+#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
+#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */
+#else
+#define FIX_0_211164243 FIX(0.211164243)
+#define FIX_0_509795579 FIX(0.509795579)
+#define FIX_0_601344887 FIX(0.601344887)
+#define FIX_0_720959822 FIX(0.720959822)
+#define FIX_0_765366865 FIX(0.765366865)
+#define FIX_0_850430095 FIX(0.850430095)
+#define FIX_0_899976223 FIX(0.899976223)
+#define FIX_1_061594337 FIX(1.061594337)
+#define FIX_1_272758580 FIX(1.272758580)
+#define FIX_1_451774981 FIX(1.451774981)
+#define FIX_1_847759065 FIX(1.847759065)
+#define FIX_2_172734803 FIX(2.172734803)
+#define FIX_2_562915447 FIX(2.562915447)
+#define FIX_3_624509785 FIX(3.624509785)
+#endif
+
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * For 8-bit samples with the recommended scaling, all the variable
+ * and constant values involved are no more than 16 bits wide, so a
+ * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
+ * For 12-bit samples, a full 32-bit multiplication will be needed.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MULTIPLY(var,const) MULTIPLY16C16(var,const)
+#else
+#define MULTIPLY(var,const) ((var) * (const))
+#endif
+
+
+/* Dequantize a coefficient by multiplying it by the multiplier-table
+ * entry; produce an int result. In this module, both inputs and result
+ * are 16 bits or less, so either int or short multiply will work.
+ */
+
+#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 4x4 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp2, tmp10, tmp12;
+ INT32 z1, z2, z3, z4;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE*4]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+ /* Don't bother to process column 4, because second pass won't use it */
+ if (ctr == DCTSIZE-4)
+ continue;
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
+ inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 &&
+ inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero; we need not examine term 4 for 4x4 output */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+ wsptr[DCTSIZE*2] = dcval;
+ wsptr[DCTSIZE*3] = dcval;
+
+ continue;
+ }
+
+ /* Even part */
+
+ tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp0 <<= (CONST_BITS+1);
+
+ z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865);
+
+ tmp10 = tmp0 + tmp2;
+ tmp12 = tmp0 - tmp2;
+
+ /* Odd part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+
+ tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+ + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+ + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+ + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+ tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+ + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+ + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+ + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+ /* Final output stage */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1);
+ wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1);
+ }
+
+ /* Pass 2: process 4 rows from work array, store into output array. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < 4; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 &&
+ wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+ outptr[2] = dcval;
+ outptr[3] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1);
+
+ tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065)
+ + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865);
+
+ tmp10 = tmp0 + tmp2;
+ tmp12 = tmp0 - tmp2;
+
+ /* Odd part */
+
+ z1 = (INT32) wsptr[7];
+ z2 = (INT32) wsptr[5];
+ z3 = (INT32) wsptr[3];
+ z4 = (INT32) wsptr[1];
+
+ tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */
+ + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */
+ + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */
+ + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */
+
+ tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */
+ + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */
+ + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */
+ + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */
+
+ /* Final output stage */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+ outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0,
+ CONST_BITS+PASS1_BITS+3+1)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 2x2 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ INT32 tmp0, tmp10, z1;
+ JCOEFPTR inptr;
+ ISLOW_MULT_TYPE * quantptr;
+ int * wsptr;
+ JSAMPROW outptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ int ctr;
+ int workspace[DCTSIZE*2]; /* buffers data between passes */
+ SHIFT_TEMPS
+
+ /* Pass 1: process columns from input, store into work array. */
+
+ inptr = coef_block;
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ wsptr = workspace;
+ for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) {
+ /* Don't bother to process columns 2,4,6 */
+ if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6)
+ continue;
+ if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 &&
+ inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) {
+ /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */
+ int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
+
+ wsptr[DCTSIZE*0] = dcval;
+ wsptr[DCTSIZE*1] = dcval;
+
+ continue;
+ }
+
+ /* Even part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ tmp10 = z1 << (CONST_BITS+2);
+
+ /* Odd part */
+
+ z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
+ tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
+ tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
+ tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */
+ z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+ /* Final output stage */
+
+ wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2);
+ wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2);
+ }
+
+ /* Pass 2: process 2 rows from work array, store into output array. */
+
+ wsptr = workspace;
+ for (ctr = 0; ctr < 2; ctr++) {
+ outptr = output_buf[ctr] + output_col;
+ /* It's not clear whether a zero row test is worthwhile here ... */
+
+#ifndef NO_ZERO_ROW_TEST
+ if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) {
+ /* AC terms all zero */
+ JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ & RANGE_MASK];
+
+ outptr[0] = dcval;
+ outptr[1] = dcval;
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ continue;
+ }
+#endif
+
+ /* Even part */
+
+ tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2);
+
+ /* Odd part */
+
+ tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */
+ + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */
+ + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */
+ + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */
+
+ /* Final output stage */
+
+ outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0,
+ CONST_BITS+PASS1_BITS+3+2)
+ & RANGE_MASK];
+ outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0,
+ CONST_BITS+PASS1_BITS+3+2)
+ & RANGE_MASK];
+
+ wsptr += DCTSIZE; /* advance pointer to next row */
+ }
+}
+
+
+/*
+ * Perform dequantization and inverse DCT on one block of coefficients,
+ * producing a reduced-size 1x1 output block.
+ */
+
+GLOBAL(void)
+jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col)
+{
+ int dcval;
+ ISLOW_MULT_TYPE * quantptr;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
+ SHIFT_TEMPS
+
+ /* We hardly need an inverse DCT routine for this: just take the
+ * average pixel value, which is one-eighth of the DC coefficient.
+ */
+ quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+ dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
+ dcval = (int) DESCALE((INT32) dcval, 3);
+
+ output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
+}
+
+#endif /* IDCT_SCALING_SUPPORTED */
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
new file mode 100644
index 0000000000..19ee66597b
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c
@@ -0,0 +1,1123 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jmemmgr.c
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains the JPEG system-independent memory management
+ * routines. This code is usable across a wide variety of machines; most
+ * of the system dependencies have been isolated in a separate file.
+ * The major functions provided here are:
+ * * pool-based allocation and freeing of memory;
+ * * policy decisions about how to divide available memory among the
+ * virtual arrays;
+ * * control logic for swapping virtual arrays between main memory and
+ * backing storage.
+ * The separate system-dependent file provides the actual backing-storage
+ * access code, and it contains the policy decision about how much total
+ * main memory to use.
+ * This file is system-dependent in the sense that some of its functions
+ * are unnecessary in some systems. For example, if there is enough virtual
+ * memory so that backing storage will never be used, much of the virtual
+ * array control logic could be removed. (Of course, if you have that much
+ * memory then you shouldn't care about a little bit of unused code...)
+ */
+
+#define JPEG_INTERNALS
+#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h" /* import the system-dependent declarations */
+
+#define NO_GETENV /* XYQ: 2007-5-22 Don't use it */
+
+#ifndef NO_GETENV
+#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare getenv() */
+extern char * getenv JPP((const char * name));
+#endif
+#endif
+
+
+/*
+ * Some important notes:
+ * The allocation routines provided here must never return NULL.
+ * They should exit to error_exit if unsuccessful.
+ *
+ * It's not a good idea to try to merge the sarray and barray routines,
+ * even though they are textually almost the same, because samples are
+ * usually stored as bytes while coefficients are shorts or ints. Thus,
+ * in machines where byte pointers have a different representation from
+ * word pointers, the resulting machine code could not be the same.
+ */
+
+
+/*
+ * Many machines require storage alignment: longs must start on 4-byte
+ * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc()
+ * always returns pointers that are multiples of the worst-case alignment
+ * requirement, and we had better do so too.
+ * There isn't any really portable way to determine the worst-case alignment
+ * requirement. This module assumes that the alignment requirement is
+ * multiples of sizeof(ALIGN_TYPE).
+ * By default, we define ALIGN_TYPE as double. This is necessary on some
+ * workstations (where doubles really do need 8-byte alignment) and will work
+ * fine on nearly everything. If your machine has lesser alignment needs,
+ * you can save a few bytes by making ALIGN_TYPE smaller.
+ * The only place I know of where this will NOT work is certain Macintosh
+ * 680x0 compilers that define double as a 10-byte IEEE extended float.
+ * Doing 10-byte alignment is counterproductive because longwords won't be
+ * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have
+ * such a compiler.
+ */
+
+#ifndef ALIGN_TYPE /* so can override from jconfig.h */
+#define ALIGN_TYPE double
+#endif
+
+
+/*
+ * We allocate objects from "pools", where each pool is gotten with a single
+ * request to jpeg_get_small() or jpeg_get_large(). There is no per-object
+ * overhead within a pool, except for alignment padding. Each pool has a
+ * header with a link to the next pool of the same class.
+ * Small and large pool headers are identical except that the latter's
+ * link pointer must be FAR on 80x86 machines.
+ * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE
+ * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple
+ * of the alignment requirement of ALIGN_TYPE.
+ */
+
+typedef union small_pool_struct * small_pool_ptr;
+
+typedef union small_pool_struct {
+ struct {
+ small_pool_ptr next; /* next in list of pools */
+ size_t bytes_used; /* how many bytes already used within pool */
+ size_t bytes_left; /* bytes still available in this pool */
+ } hdr;
+ ALIGN_TYPE dummy; /* included in union to ensure alignment */
+} small_pool_hdr;
+
+typedef union large_pool_struct FAR * large_pool_ptr;
+
+typedef union large_pool_struct {
+ struct {
+ large_pool_ptr next; /* next in list of pools */
+ size_t bytes_used; /* how many bytes already used within pool */
+ size_t bytes_left; /* bytes still available in this pool */
+ } hdr;
+ ALIGN_TYPE dummy; /* included in union to ensure alignment */
+} large_pool_hdr;
+
+
+/*
+ * Here is the full definition of a memory manager object.
+ */
+
+typedef struct {
+ struct jpeg_memory_mgr pub; /* public fields */
+
+ /* Each pool identifier (lifetime class) names a linked list of pools. */
+ small_pool_ptr small_list[JPOOL_NUMPOOLS];
+ large_pool_ptr large_list[JPOOL_NUMPOOLS];
+
+ /* Since we only have one lifetime class of virtual arrays, only one
+ * linked list is necessary (for each datatype). Note that the virtual
+ * array control blocks being linked together are actually stored somewhere
+ * in the small-pool list.
+ */
+ jvirt_sarray_ptr virt_sarray_list;
+ jvirt_barray_ptr virt_barray_list;
+
+ /* This counts total space obtained from jpeg_get_small/large */
+ long total_space_allocated;
+
+ /* alloc_sarray and alloc_barray set this value for use by virtual
+ * array routines.
+ */
+ JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */
+} my_memory_mgr;
+
+typedef my_memory_mgr * my_mem_ptr;
+
+
+/*
+ * The control blocks for virtual arrays.
+ * Note that these blocks are allocated in the "small" pool area.
+ * System-dependent info for the associated backing store (if any) is hidden
+ * inside the backing_store_info struct.
+ */
+
+struct jvirt_sarray_control {
+ JSAMPARRAY mem_buffer; /* => the in-memory buffer */
+ JDIMENSION rows_in_array; /* total virtual array height */
+ JDIMENSION samplesperrow; /* width of array (and of memory buffer) */
+ JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */
+ JDIMENSION rows_in_mem; /* height of memory buffer */
+ JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
+ JDIMENSION cur_start_row; /* first logical row # in the buffer */
+ JDIMENSION first_undef_row; /* row # of first uninitialized row */
+ boolean pre_zero; /* pre-zero mode requested? */
+ boolean dirty; /* do current buffer contents need written? */
+ boolean b_s_open; /* is backing-store data valid? */
+ jvirt_sarray_ptr next; /* link to next virtual sarray control block */
+ backing_store_info b_s_info; /* System-dependent control info */
+};
+
+struct jvirt_barray_control {
+ JBLOCKARRAY mem_buffer; /* => the in-memory buffer */
+ JDIMENSION rows_in_array; /* total virtual array height */
+ JDIMENSION blocksperrow; /* width of array (and of memory buffer) */
+ JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */
+ JDIMENSION rows_in_mem; /* height of memory buffer */
+ JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */
+ JDIMENSION cur_start_row; /* first logical row # in the buffer */
+ JDIMENSION first_undef_row; /* row # of first uninitialized row */
+ boolean pre_zero; /* pre-zero mode requested? */
+ boolean dirty; /* do current buffer contents need written? */
+ boolean b_s_open; /* is backing-store data valid? */
+ jvirt_barray_ptr next; /* link to next virtual barray control block */
+ backing_store_info b_s_info; /* System-dependent control info */
+};
+
+
+#ifdef MEM_STATS /* optional extra stuff for statistics */
+
+LOCAL(void)
+print_mem_stats (j_common_ptr cinfo, int pool_id)
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr shdr_ptr;
+ large_pool_ptr lhdr_ptr;
+
+ /* Since this is only a debugging stub, we can cheat a little by using
+ * fprintf directly rather than going through the trace message code.
+ * This is helpful because message parm array can't handle longs.
+ */
+ FXSYS_fprintf(stderr, "Freeing pool %d, total space = %ld\n",
+ pool_id, mem->total_space_allocated);
+
+ for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL;
+ lhdr_ptr = lhdr_ptr->hdr.next) {
+ FXSYS_fprintf(stderr, " Large chunk used %ld\n",
+ (long) lhdr_ptr->hdr.bytes_used);
+ }
+
+ for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL;
+ shdr_ptr = shdr_ptr->hdr.next) {
+ FXSYS_fprintf(stderr, " Small chunk used %ld free %ld\n",
+ (long) shdr_ptr->hdr.bytes_used,
+ (long) shdr_ptr->hdr.bytes_left);
+ }
+}
+
+#endif /* MEM_STATS */
+
+
+LOCAL(void)
+out_of_memory (j_common_ptr cinfo, int which)
+/* Report an out-of-memory error and stop execution */
+/* If we compiled MEM_STATS support, report alloc requests before dying */
+{
+#ifdef MEM_STATS
+ cinfo->err->trace_level = 2; /* force self_destruct to report stats */
+#endif
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which);
+}
+
+
+/*
+ * Allocation of "small" objects.
+ *
+ * For these, we use pooled storage. When a new pool must be created,
+ * we try to get enough space for the current request plus a "slop" factor,
+ * where the slop will be the amount of leftover space in the new pool.
+ * The speed vs. space tradeoff is largely determined by the slop values.
+ * A different slop value is provided for each pool class (lifetime),
+ * and we also distinguish the first pool of a class from later ones.
+ * NOTE: the values given work fairly well on both 16- and 32-bit-int
+ * machines, but may be too small if longs are 64 bits or more.
+ */
+
+static const size_t first_pool_slop[JPOOL_NUMPOOLS] =
+{
+ 1600, /* first PERMANENT pool */
+ 16000 /* first IMAGE pool */
+};
+
+static const size_t extra_pool_slop[JPOOL_NUMPOOLS] =
+{
+ 0, /* additional PERMANENT pools */
+ 5000 /* additional IMAGE pools */
+};
+
+#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */
+
+
+METHODDEF(void *)
+alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "small" object */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr hdr_ptr, prev_hdr_ptr;
+ char * data_ptr;
+ size_t odd_bytes, min_request, slop;
+
+ /* Check for unsatisfiable request (do now to ensure no overflow below) */
+ if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
+ out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
+
+ /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+ odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+ if (odd_bytes > 0)
+ sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+ /* See if space is available in any existing pool */
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+ prev_hdr_ptr = NULL;
+ hdr_ptr = mem->small_list[pool_id];
+ while (hdr_ptr != NULL) {
+ if (hdr_ptr->hdr.bytes_left >= sizeofobject)
+ break; /* found pool with enough space */
+ prev_hdr_ptr = hdr_ptr;
+ hdr_ptr = hdr_ptr->hdr.next;
+ }
+
+ /* Time to make a new pool? */
+ if (hdr_ptr == NULL) {
+ /* min_request is what we need now, slop is what will be leftover */
+ min_request = sizeofobject + SIZEOF(small_pool_hdr);
+ if (prev_hdr_ptr == NULL) /* first pool in class? */
+ slop = first_pool_slop[pool_id];
+ else
+ slop = extra_pool_slop[pool_id];
+ /* Don't ask for more than MAX_ALLOC_CHUNK */
+ if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
+ slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
+ /* Try to get space, if fail reduce slop and try again */
+ for (;;) {
+ hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
+ if (hdr_ptr != NULL)
+ break;
+ slop /= 2;
+ if (slop < MIN_SLOP) /* give up when it gets real small */
+ out_of_memory(cinfo, 2); /* jpeg_get_small failed */
+ }
+ mem->total_space_allocated += min_request + slop;
+ /* Success, initialize the new pool header and add to end of list */
+ hdr_ptr->hdr.next = NULL;
+ hdr_ptr->hdr.bytes_used = 0;
+ hdr_ptr->hdr.bytes_left = sizeofobject + slop;
+ if (prev_hdr_ptr == NULL) /* first pool in class? */
+ mem->small_list[pool_id] = hdr_ptr;
+ else
+ prev_hdr_ptr->hdr.next = hdr_ptr;
+ }
+
+ /* OK, allocate the object from the current pool */
+ data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */
+ data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */
+ hdr_ptr->hdr.bytes_used += sizeofobject;
+ hdr_ptr->hdr.bytes_left -= sizeofobject;
+
+ return (void *) data_ptr;
+}
+
+
+/*
+ * Allocation of "large" objects.
+ *
+ * The external semantics of these are the same as "small" objects,
+ * except that FAR pointers are used on 80x86. However the pool
+ * management heuristics are quite different. We assume that each
+ * request is large enough that it may as well be passed directly to
+ * jpeg_get_large; the pool management just links everything together
+ * so that we can free it all on demand.
+ * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY
+ * structures. The routines that create these structures (see below)
+ * deliberately bunch rows together to ensure a large request size.
+ */
+
+METHODDEF(void FAR *)
+alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
+/* Allocate a "large" object */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ large_pool_ptr hdr_ptr;
+ size_t odd_bytes;
+
+ /* Check for unsatisfiable request (do now to ensure no overflow below) */
+ if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)))
+ out_of_memory(cinfo, 3); /* request exceeds malloc's ability */
+
+ /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
+ odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
+ if (odd_bytes > 0)
+ sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
+
+ /* Always make a new pool */
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject +
+ SIZEOF(large_pool_hdr));
+ if (hdr_ptr == NULL)
+ out_of_memory(cinfo, 4); /* jpeg_get_large failed */
+ mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
+
+ /* Success, initialize the new pool header and add to list */
+ hdr_ptr->hdr.next = mem->large_list[pool_id];
+ /* We maintain space counts in each pool header for statistical purposes,
+ * even though they are not needed for allocation.
+ */
+ hdr_ptr->hdr.bytes_used = sizeofobject;
+ hdr_ptr->hdr.bytes_left = 0;
+ mem->large_list[pool_id] = hdr_ptr;
+
+ return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
+}
+
+
+/*
+ * Creation of 2-D sample arrays.
+ * The pointers are in near heap, the samples themselves in FAR heap.
+ *
+ * To minimize allocation overhead and to allow I/O of large contiguous
+ * blocks, we allocate the sample rows in groups of as many rows as possible
+ * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request.
+ * NB: the virtual array control routines, later in this file, know about
+ * this chunking of rows. The rowsperchunk value is left in the mem manager
+ * object so that it can be saved away if this sarray is the workspace for
+ * a virtual array.
+ */
+
+METHODDEF(JSAMPARRAY)
+alloc_sarray (j_common_ptr cinfo, int pool_id,
+ JDIMENSION samplesperrow, JDIMENSION numrows)
+/* Allocate a 2-D sample array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ JSAMPARRAY result;
+ JSAMPROW workspace;
+ JDIMENSION rowsperchunk, currow, i;
+ long ltemp;
+
+ /* Calculate max # of rows allowed in one allocation chunk */
+ ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+ ((long) samplesperrow * SIZEOF(JSAMPLE));
+ if (ltemp <= 0)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+ if (ltemp < (long) numrows)
+ rowsperchunk = (JDIMENSION) ltemp;
+ else
+ rowsperchunk = numrows;
+ mem->last_rowsperchunk = rowsperchunk;
+
+ /* Get space for row pointers (small object) */
+ result = (JSAMPARRAY) alloc_small(cinfo, pool_id,
+ (size_t) (numrows * SIZEOF(JSAMPROW)));
+
+ /* Get the rows themselves (large objects) */
+ currow = 0;
+ while (currow < numrows) {
+ rowsperchunk = MIN(rowsperchunk, numrows - currow);
+ workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
+ (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
+ * SIZEOF(JSAMPLE)));
+ for (i = rowsperchunk; i > 0; i--) {
+ result[currow++] = workspace;
+ workspace += samplesperrow;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * Creation of 2-D coefficient-block arrays.
+ * This is essentially the same as the code for sample arrays, above.
+ */
+
+METHODDEF(JBLOCKARRAY)
+alloc_barray (j_common_ptr cinfo, int pool_id,
+ JDIMENSION blocksperrow, JDIMENSION numrows)
+/* Allocate a 2-D coefficient-block array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ JBLOCKARRAY result;
+ JBLOCKROW workspace;
+ JDIMENSION rowsperchunk, currow, i;
+ long ltemp;
+
+ /* Calculate max # of rows allowed in one allocation chunk */
+ ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
+ ((long) blocksperrow * SIZEOF(JBLOCK));
+ if (ltemp <= 0)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+ if (ltemp < (long) numrows)
+ rowsperchunk = (JDIMENSION) ltemp;
+ else
+ rowsperchunk = numrows;
+ mem->last_rowsperchunk = rowsperchunk;
+
+ /* Get space for row pointers (small object) */
+ result = (JBLOCKARRAY) alloc_small(cinfo, pool_id,
+ (size_t) (numrows * SIZEOF(JBLOCKROW)));
+
+ /* Get the rows themselves (large objects) */
+ currow = 0;
+ while (currow < numrows) {
+ rowsperchunk = MIN(rowsperchunk, numrows - currow);
+ workspace = (JBLOCKROW) alloc_large(cinfo, pool_id,
+ (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow
+ * SIZEOF(JBLOCK)));
+ for (i = rowsperchunk; i > 0; i--) {
+ result[currow++] = workspace;
+ workspace += blocksperrow;
+ }
+ }
+
+ return result;
+}
+
+
+/*
+ * About virtual array management:
+ *
+ * The above "normal" array routines are only used to allocate strip buffers
+ * (as wide as the image, but just a few rows high). Full-image-sized buffers
+ * are handled as "virtual" arrays. The array is still accessed a strip at a
+ * time, but the memory manager must save the whole array for repeated
+ * accesses. The intended implementation is that there is a strip buffer in
+ * memory (as high as is possible given the desired memory limit), plus a
+ * backing file that holds the rest of the array.
+ *
+ * The request_virt_array routines are told the total size of the image and
+ * the maximum number of rows that will be accessed at once. The in-memory
+ * buffer must be at least as large as the maxaccess value.
+ *
+ * The request routines create control blocks but not the in-memory buffers.
+ * That is postponed until realize_virt_arrays is called. At that time the
+ * total amount of space needed is known (approximately, anyway), so free
+ * memory can be divided up fairly.
+ *
+ * The access_virt_array routines are responsible for making a specific strip
+ * area accessible (after reading or writing the backing file, if necessary).
+ * Note that the access routines are told whether the caller intends to modify
+ * the accessed strip; during a read-only pass this saves having to rewrite
+ * data to disk. The access routines are also responsible for pre-zeroing
+ * any newly accessed rows, if pre-zeroing was requested.
+ *
+ * In current usage, the access requests are usually for nonoverlapping
+ * strips; that is, successive access start_row numbers differ by exactly
+ * num_rows = maxaccess. This means we can get good performance with simple
+ * buffer dump/reload logic, by making the in-memory buffer be a multiple
+ * of the access height; then there will never be accesses across bufferload
+ * boundaries. The code will still work with overlapping access requests,
+ * but it doesn't handle bufferload overlaps very efficiently.
+ */
+
+
+METHODDEF(jvirt_sarray_ptr)
+request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+ JDIMENSION samplesperrow, JDIMENSION numrows,
+ JDIMENSION maxaccess)
+/* Request a virtual 2-D sample array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ jvirt_sarray_ptr result;
+
+ /* Only IMAGE-lifetime virtual arrays are currently supported */
+ if (pool_id != JPOOL_IMAGE)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ /* get control block */
+ result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id,
+ SIZEOF(struct jvirt_sarray_control));
+
+ result->mem_buffer = NULL; /* marks array not yet realized */
+ result->rows_in_array = numrows;
+ result->samplesperrow = samplesperrow;
+ result->maxaccess = maxaccess;
+ result->pre_zero = pre_zero;
+ result->b_s_open = FALSE; /* no associated backing-store object */
+ result->next = mem->virt_sarray_list; /* add to list of virtual arrays */
+ mem->virt_sarray_list = result;
+
+ return result;
+}
+
+
+METHODDEF(jvirt_barray_ptr)
+request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero,
+ JDIMENSION blocksperrow, JDIMENSION numrows,
+ JDIMENSION maxaccess)
+/* Request a virtual 2-D coefficient-block array */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ jvirt_barray_ptr result;
+
+ /* Only IMAGE-lifetime virtual arrays are currently supported */
+ if (pool_id != JPOOL_IMAGE)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+ /* get control block */
+ result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id,
+ SIZEOF(struct jvirt_barray_control));
+
+ result->mem_buffer = NULL; /* marks array not yet realized */
+ result->rows_in_array = numrows;
+ result->blocksperrow = blocksperrow;
+ result->maxaccess = maxaccess;
+ result->pre_zero = pre_zero;
+ result->b_s_open = FALSE; /* no associated backing-store object */
+ result->next = mem->virt_barray_list; /* add to list of virtual arrays */
+ mem->virt_barray_list = result;
+
+ return result;
+}
+
+
+METHODDEF(void)
+realize_virt_arrays (j_common_ptr cinfo)
+/* Allocate the in-memory buffers for any unrealized virtual arrays */
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ long space_per_minheight, maximum_space, avail_mem;
+ long minheights, max_minheights;
+ jvirt_sarray_ptr sptr;
+ jvirt_barray_ptr bptr;
+
+ /* Compute the minimum space needed (maxaccess rows in each buffer)
+ * and the maximum space needed (full image height in each buffer).
+ * These may be of use to the system-dependent jpeg_mem_available routine.
+ */
+ space_per_minheight = 0;
+ maximum_space = 0;
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->mem_buffer == NULL) { /* if not realized yet */
+ space_per_minheight += (long) sptr->maxaccess *
+ (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+ maximum_space += (long) sptr->rows_in_array *
+ (long) sptr->samplesperrow * SIZEOF(JSAMPLE);
+ }
+ }
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->mem_buffer == NULL) { /* if not realized yet */
+ space_per_minheight += (long) bptr->maxaccess *
+ (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+ maximum_space += (long) bptr->rows_in_array *
+ (long) bptr->blocksperrow * SIZEOF(JBLOCK);
+ }
+ }
+
+ if (space_per_minheight <= 0)
+ return; /* no unrealized arrays, no work */
+
+ /* Determine amount of memory to actually use; this is system-dependent. */
+ avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space,
+ mem->total_space_allocated);
+
+ /* If the maximum space needed is available, make all the buffers full
+ * height; otherwise parcel it out with the same number of minheights
+ * in each buffer.
+ */
+ if (avail_mem >= maximum_space)
+ max_minheights = 1000000000L;
+ else {
+ max_minheights = avail_mem / space_per_minheight;
+ /* If there doesn't seem to be enough space, try to get the minimum
+ * anyway. This allows a "stub" implementation of jpeg_mem_available().
+ */
+ if (max_minheights <= 0)
+ max_minheights = 1;
+ }
+
+ /* Allocate the in-memory buffers and initialize backing store as needed. */
+
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->mem_buffer == NULL) { /* if not realized yet */
+ minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L;
+ if (minheights <= max_minheights) {
+ /* This buffer fits in memory */
+ sptr->rows_in_mem = sptr->rows_in_array;
+ } else {
+ /* It doesn't fit in memory, create backing store. */
+ sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess);
+ jpeg_open_backing_store(cinfo, & sptr->b_s_info,
+ (long) sptr->rows_in_array *
+ (long) sptr->samplesperrow *
+ (long) SIZEOF(JSAMPLE));
+ sptr->b_s_open = TRUE;
+ }
+ sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE,
+ sptr->samplesperrow, sptr->rows_in_mem);
+ sptr->rowsperchunk = mem->last_rowsperchunk;
+ sptr->cur_start_row = 0;
+ sptr->first_undef_row = 0;
+ sptr->dirty = FALSE;
+ }
+ }
+
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->mem_buffer == NULL) { /* if not realized yet */
+ minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L;
+ if (minheights <= max_minheights) {
+ /* This buffer fits in memory */
+ bptr->rows_in_mem = bptr->rows_in_array;
+ } else {
+ /* It doesn't fit in memory, create backing store. */
+ bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess);
+ jpeg_open_backing_store(cinfo, & bptr->b_s_info,
+ (long) bptr->rows_in_array *
+ (long) bptr->blocksperrow *
+ (long) SIZEOF(JBLOCK));
+ bptr->b_s_open = TRUE;
+ }
+ bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE,
+ bptr->blocksperrow, bptr->rows_in_mem);
+ bptr->rowsperchunk = mem->last_rowsperchunk;
+ bptr->cur_start_row = 0;
+ bptr->first_undef_row = 0;
+ bptr->dirty = FALSE;
+ }
+ }
+}
+
+
+LOCAL(void)
+do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual sample array */
+{
+ long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+ bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE);
+ file_offset = ptr->cur_start_row * bytesperrow;
+ /* Loop to read or write each allocation chunk in mem_buffer */
+ for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+ /* One chunk, but check for short chunk at end of buffer */
+ rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+ /* Transfer no more than is currently defined */
+ thisrow = (long) ptr->cur_start_row + i;
+ rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+ /* Transfer no more than fits in file */
+ rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+ if (rows <= 0) /* this chunk might be past end of file! */
+ break;
+ byte_count = rows * bytesperrow;
+ if (writing)
+ (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ else
+ (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ file_offset += byte_count;
+ }
+}
+
+
+LOCAL(void)
+do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing)
+/* Do backing store read or write of a virtual coefficient-block array */
+{
+ long bytesperrow, file_offset, byte_count, rows, thisrow, i;
+
+ bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK);
+ file_offset = ptr->cur_start_row * bytesperrow;
+ /* Loop to read or write each allocation chunk in mem_buffer */
+ for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) {
+ /* One chunk, but check for short chunk at end of buffer */
+ rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i);
+ /* Transfer no more than is currently defined */
+ thisrow = (long) ptr->cur_start_row + i;
+ rows = MIN(rows, (long) ptr->first_undef_row - thisrow);
+ /* Transfer no more than fits in file */
+ rows = MIN(rows, (long) ptr->rows_in_array - thisrow);
+ if (rows <= 0) /* this chunk might be past end of file! */
+ break;
+ byte_count = rows * bytesperrow;
+ if (writing)
+ (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ else
+ (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info,
+ (void FAR *) ptr->mem_buffer[i],
+ file_offset, byte_count);
+ file_offset += byte_count;
+ }
+}
+
+
+METHODDEF(JSAMPARRAY)
+access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
+ JDIMENSION start_row, JDIMENSION num_rows,
+ boolean writable)
+/* Access the part of a virtual sample array starting at start_row */
+/* and extending for num_rows rows. writable is true if */
+/* caller intends to modify the accessed area. */
+{
+ JDIMENSION end_row = start_row + num_rows;
+ JDIMENSION undef_row;
+
+ /* debugging check */
+ if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+ ptr->mem_buffer == NULL)
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+ /* Make the desired part of the virtual array accessible */
+ if (start_row < ptr->cur_start_row ||
+ end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+ if (! ptr->b_s_open)
+ ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+ /* Flush old buffer contents if necessary */
+ if (ptr->dirty) {
+ do_sarray_io(cinfo, ptr, TRUE);
+ ptr->dirty = FALSE;
+ }
+ /* Decide what part of virtual array to access.
+ * Algorithm: if target address > current window, assume forward scan,
+ * load starting at target address. If target address < current window,
+ * assume backward scan, load so that target area is top of window.
+ * Note that when switching from forward write to forward read, will have
+ * start_row = 0, so the limiting case applies and we load from 0 anyway.
+ */
+ if (start_row > ptr->cur_start_row) {
+ ptr->cur_start_row = start_row;
+ } else {
+ /* use long arithmetic here to avoid overflow & unsigned problems */
+ long ltemp;
+
+ ltemp = (long) end_row - (long) ptr->rows_in_mem;
+ if (ltemp < 0)
+ ltemp = 0; /* don't fall off front end of file */
+ ptr->cur_start_row = (JDIMENSION) ltemp;
+ }
+ /* Read in the selected part of the array.
+ * During the initial write pass, we will do no actual read
+ * because the selected part is all undefined.
+ */
+ do_sarray_io(cinfo, ptr, FALSE);
+ }
+ /* Ensure the accessed part of the array is defined; prezero if needed.
+ * To improve locality of access, we only prezero the part of the array
+ * that the caller is about to access, not the entire in-memory array.
+ */
+ if (ptr->first_undef_row < end_row) {
+ if (ptr->first_undef_row < start_row) {
+ if (writable) /* writer skipped over a section of array */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ undef_row = start_row; /* but reader is allowed to read ahead */
+ } else {
+ undef_row = ptr->first_undef_row;
+ }
+ if (writable)
+ ptr->first_undef_row = end_row;
+ if (ptr->pre_zero) {
+ size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE);
+ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+ end_row -= ptr->cur_start_row;
+ while (undef_row < end_row) {
+ jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ undef_row++;
+ }
+ } else {
+ if (! writable) /* reader looking at undefined data */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ }
+ }
+ /* Flag the buffer dirty if caller will write in it */
+ if (writable)
+ ptr->dirty = TRUE;
+ /* Return address of proper part of the buffer */
+ return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+METHODDEF(JBLOCKARRAY)
+access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
+ JDIMENSION start_row, JDIMENSION num_rows,
+ boolean writable)
+/* Access the part of a virtual block array starting at start_row */
+/* and extending for num_rows rows. writable is true if */
+/* caller intends to modify the accessed area. */
+{
+ JDIMENSION end_row = start_row + num_rows;
+ JDIMENSION undef_row;
+
+ /* debugging check */
+ if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess ||
+ ptr->mem_buffer == NULL)
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+
+ /* Make the desired part of the virtual array accessible */
+ if (start_row < ptr->cur_start_row ||
+ end_row > ptr->cur_start_row+ptr->rows_in_mem) {
+ if (! ptr->b_s_open)
+ ERREXIT(cinfo, JERR_VIRTUAL_BUG);
+ /* Flush old buffer contents if necessary */
+ if (ptr->dirty) {
+ do_barray_io(cinfo, ptr, TRUE);
+ ptr->dirty = FALSE;
+ }
+ /* Decide what part of virtual array to access.
+ * Algorithm: if target address > current window, assume forward scan,
+ * load starting at target address. If target address < current window,
+ * assume backward scan, load so that target area is top of window.
+ * Note that when switching from forward write to forward read, will have
+ * start_row = 0, so the limiting case applies and we load from 0 anyway.
+ */
+ if (start_row > ptr->cur_start_row) {
+ ptr->cur_start_row = start_row;
+ } else {
+ /* use long arithmetic here to avoid overflow & unsigned problems */
+ long ltemp;
+
+ ltemp = (long) end_row - (long) ptr->rows_in_mem;
+ if (ltemp < 0)
+ ltemp = 0; /* don't fall off front end of file */
+ ptr->cur_start_row = (JDIMENSION) ltemp;
+ }
+ /* Read in the selected part of the array.
+ * During the initial write pass, we will do no actual read
+ * because the selected part is all undefined.
+ */
+ do_barray_io(cinfo, ptr, FALSE);
+ }
+ /* Ensure the accessed part of the array is defined; prezero if needed.
+ * To improve locality of access, we only prezero the part of the array
+ * that the caller is about to access, not the entire in-memory array.
+ */
+ if (ptr->first_undef_row < end_row) {
+ if (ptr->first_undef_row < start_row) {
+ if (writable) /* writer skipped over a section of array */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ undef_row = start_row; /* but reader is allowed to read ahead */
+ } else {
+ undef_row = ptr->first_undef_row;
+ }
+ if (writable)
+ ptr->first_undef_row = end_row;
+ if (ptr->pre_zero) {
+ size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK);
+ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
+ end_row -= ptr->cur_start_row;
+ while (undef_row < end_row) {
+ jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ undef_row++;
+ }
+ } else {
+ if (! writable) /* reader looking at undefined data */
+ ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS);
+ }
+ }
+ /* Flag the buffer dirty if caller will write in it */
+ if (writable)
+ ptr->dirty = TRUE;
+ /* Return address of proper part of the buffer */
+ return ptr->mem_buffer + (start_row - ptr->cur_start_row);
+}
+
+
+/*
+ * Release all objects belonging to a specified pool.
+ */
+
+METHODDEF(void)
+free_pool (j_common_ptr cinfo, int pool_id)
+{
+ my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
+ small_pool_ptr shdr_ptr;
+ large_pool_ptr lhdr_ptr;
+ size_t space_freed;
+
+ if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
+ ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
+
+#ifdef MEM_STATS
+ if (cinfo->err->trace_level > 1)
+ print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */
+#endif
+
+ /* If freeing IMAGE pool, close any virtual arrays first */
+ if (pool_id == JPOOL_IMAGE) {
+ jvirt_sarray_ptr sptr;
+ jvirt_barray_ptr bptr;
+
+ for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) {
+ if (sptr->b_s_open) { /* there may be no backing store */
+ sptr->b_s_open = FALSE; /* prevent recursive close if error */
+ (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info);
+ }
+ }
+ mem->virt_sarray_list = NULL;
+ for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) {
+ if (bptr->b_s_open) { /* there may be no backing store */
+ bptr->b_s_open = FALSE; /* prevent recursive close if error */
+ (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info);
+ }
+ }
+ mem->virt_barray_list = NULL;
+ }
+
+ /* Release large objects */
+ lhdr_ptr = mem->large_list[pool_id];
+ mem->large_list[pool_id] = NULL;
+
+ while (lhdr_ptr != NULL) {
+ large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next;
+ space_freed = lhdr_ptr->hdr.bytes_used +
+ lhdr_ptr->hdr.bytes_left +
+ SIZEOF(large_pool_hdr);
+ jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed);
+ mem->total_space_allocated -= space_freed;
+ lhdr_ptr = next_lhdr_ptr;
+ }
+
+ /* Release small objects */
+ shdr_ptr = mem->small_list[pool_id];
+ mem->small_list[pool_id] = NULL;
+
+ while (shdr_ptr != NULL) {
+ small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next;
+ space_freed = shdr_ptr->hdr.bytes_used +
+ shdr_ptr->hdr.bytes_left +
+ SIZEOF(small_pool_hdr);
+ jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed);
+ mem->total_space_allocated -= space_freed;
+ shdr_ptr = next_shdr_ptr;
+ }
+}
+
+
+/*
+ * Close up shop entirely.
+ * Note that this cannot be called unless cinfo->mem is non-NULL.
+ */
+
+METHODDEF(void)
+self_destruct (j_common_ptr cinfo)
+{
+ int pool;
+
+ /* Close all backing store, release all memory.
+ * Releasing pools in reverse order might help avoid fragmentation
+ * with some (brain-damaged) malloc libraries.
+ */
+ for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+ free_pool(cinfo, pool);
+ }
+
+ /* Release the memory manager control block too. */
+ jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr));
+ cinfo->mem = NULL; /* ensures I will be called only once */
+
+ jpeg_mem_term(cinfo); /* system-dependent cleanup */
+}
+
+
+/*
+ * Memory manager initialization.
+ * When this is called, only the error manager pointer is valid in cinfo!
+ */
+
+GLOBAL(void)
+jinit_memory_mgr (j_common_ptr cinfo)
+{
+ my_mem_ptr mem;
+ long max_to_use;
+ int pool;
+ size_t test_mac;
+
+ cinfo->mem = NULL; /* for safety if init fails */
+
+ /* Check for configuration errors.
+ * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably
+ * doesn't reflect any real hardware alignment requirement.
+ * The test is a little tricky: for X>0, X and X-1 have no one-bits
+ * in common if and only if X is a power of 2, ie has only one one-bit.
+ * Some compilers may give an "unreachable code" warning here; ignore it.
+ */
+ if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0)
+ ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE);
+ /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be
+ * a multiple of SIZEOF(ALIGN_TYPE).
+ * Again, an "unreachable code" warning may be ignored here.
+ * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK.
+ */
+ test_mac = (size_t) MAX_ALLOC_CHUNK;
+ if ((long) test_mac != MAX_ALLOC_CHUNK ||
+ (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0)
+ ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK);
+
+ max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */
+
+ /* Attempt to allocate memory manager's control block */
+ mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr));
+
+ if (mem == NULL) {
+ jpeg_mem_term(cinfo); /* system-dependent cleanup */
+ ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0);
+ }
+
+ /* OK, fill in the method pointers */
+ mem->pub.alloc_small = alloc_small;
+ mem->pub.alloc_large = alloc_large;
+ mem->pub.alloc_sarray = alloc_sarray;
+ mem->pub.alloc_barray = alloc_barray;
+ mem->pub.request_virt_sarray = request_virt_sarray;
+ mem->pub.request_virt_barray = request_virt_barray;
+ mem->pub.realize_virt_arrays = realize_virt_arrays;
+ mem->pub.access_virt_sarray = access_virt_sarray;
+ mem->pub.access_virt_barray = access_virt_barray;
+ mem->pub.free_pool = free_pool;
+ mem->pub.self_destruct = self_destruct;
+
+ /* Make MAX_ALLOC_CHUNK accessible to other modules */
+ mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK;
+
+ /* Initialize working state */
+ mem->pub.max_memory_to_use = max_to_use;
+
+ for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) {
+ mem->small_list[pool] = NULL;
+ mem->large_list[pool] = NULL;
+ }
+ mem->virt_sarray_list = NULL;
+ mem->virt_barray_list = NULL;
+
+ mem->total_space_allocated = SIZEOF(my_memory_mgr);
+
+ /* Declare ourselves open for business */
+ cinfo->mem = & mem->pub;
+
+ /* Check for an environment variable JPEGMEM; if found, override the
+ * default max_memory setting from jpeg_mem_init. Note that the
+ * surrounding application may again override this value.
+ * If your system doesn't support getenv(), define NO_GETENV to disable
+ * this feature.
+ */
+#ifndef NO_GETENV
+ { char * memenv;
+
+ if ((memenv = getenv("JPEGMEM")) != NULL) {
+ char ch = 'x';
+
+ if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) {
+ if (ch == 'm' || ch == 'M')
+ max_to_use *= 1000L;
+ mem->pub.max_memory_to_use = max_to_use * 1000L;
+ }
+ }
+ }
+#endif
+
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
new file mode 100644
index 0000000000..98aed723a6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c
@@ -0,0 +1,126 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jmemnobs.c
+ *
+ * Copyright (C) 1992-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides a really simple implementation of the system-
+ * dependent portion of the JPEG memory manager. This implementation
+ * assumes that no backing-store files are needed: all required space
+ * can be obtained from malloc().
+ * This is very portable in the sense that it'll compile on almost anything,
+ * but you'd better have lots of main memory (or virtual memory) if you want
+ * to process big images.
+ * Note that the max_memory_to_use option is ignored by this implementation.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+#include "jmemsys.h" /* import the system-dependent declarations */
+
+#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
+extern void * malloc JPP((size_t size));
+extern void free JPP((void *ptr));
+#endif
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+void* FXMEM_DefaultAlloc(int byte_size, int);
+void FXMEM_DefaultFree(void* pointer, int);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+
+/*
+ * Memory allocation and freeing are controlled by the regular library
+ * routines malloc() and free().
+ */
+
+GLOBAL(void *)
+jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
+{
+// return (void *) malloc(sizeofobject);
+ return FXMEM_DefaultAlloc(sizeofobject, 0);
+}
+
+GLOBAL(void)
+jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
+{
+// free(object);
+ FXMEM_DefaultFree(object, 0);
+}
+
+
+/*
+ * "Large" objects are treated the same as "small" ones.
+ * NB: although we include FAR keywords in the routine declarations,
+ * this file won't actually work in 80x86 small/medium model; at least,
+ * you probably won't be able to process useful-size images in only 64KB.
+ */
+
+GLOBAL(void FAR *)
+jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
+{
+// return (void FAR *) malloc(sizeofobject);
+ return FXMEM_DefaultAlloc(sizeofobject, 0);
+}
+
+GLOBAL(void)
+jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
+{
+// free(object);
+ FXMEM_DefaultFree(object, 0);
+}
+
+
+/*
+ * This routine computes the total memory space available for allocation.
+ * Here we always say, "we got all you want bud!"
+ */
+
+GLOBAL(long)
+jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
+ long max_bytes_needed, long already_allocated)
+{
+ return max_bytes_needed;
+}
+
+
+/*
+ * Backing store (temporary file) management.
+ * Since jpeg_mem_available always promised the moon,
+ * this should never be called and we can just error out.
+ */
+
+GLOBAL(void)
+jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
+ long total_bytes_needed)
+{
+ ERREXIT(cinfo, JERR_NO_BACKING_STORE);
+}
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required. Here, there isn't any.
+ */
+
+GLOBAL(long)
+jpeg_mem_init (j_common_ptr cinfo)
+{
+ return 0; /* just set max_memory_to_use to 0 */
+}
+
+GLOBAL(void)
+jpeg_mem_term (j_common_ptr cinfo)
+{
+ /* no work */
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/fpdfapi_jutils.c b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
new file mode 100644
index 0000000000..251fd504e5
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/fpdfapi_jutils.c
@@ -0,0 +1,182 @@
+#if !defined(_FX_JPEG_TURBO_)
+/*
+ * jutils.c
+ *
+ * Copyright (C) 1991-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains tables and miscellaneous utility routines needed
+ * for both compression and decompression.
+ * Note we prefix all global names with "j" to minimize conflicts with
+ * a surrounding application.
+ */
+
+#define JPEG_INTERNALS
+#include "jinclude.h"
+#include "jpeglib.h"
+
+
+/*
+ * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element
+ * of a DCT block read in natural order (left to right, top to bottom).
+ */
+
+#if 0 /* This table is not actually needed in v6a */
+
+const int jpeg_zigzag_order[DCTSIZE2] = {
+ 0, 1, 5, 6, 14, 15, 27, 28,
+ 2, 4, 7, 13, 16, 26, 29, 42,
+ 3, 8, 12, 17, 25, 30, 41, 43,
+ 9, 11, 18, 24, 31, 40, 44, 53,
+ 10, 19, 23, 32, 39, 45, 52, 54,
+ 20, 22, 33, 38, 46, 51, 55, 60,
+ 21, 34, 37, 47, 50, 56, 59, 61,
+ 35, 36, 48, 49, 57, 58, 62, 63
+};
+
+#endif
+
+/*
+ * jpeg_natural_order[i] is the natural-order position of the i'th element
+ * of zigzag order.
+ *
+ * When reading corrupted data, the Huffman decoders could attempt
+ * to reference an entry beyond the end of this array (if the decoded
+ * zero run length reaches past the end of the block). To prevent
+ * wild stores without adding an inner-loop test, we put some extra
+ * "63"s after the real entries. This will cause the extra coefficient
+ * to be stored in location 63 of the block, not somewhere random.
+ * The worst case would be a run-length of 15, which means we need 16
+ * fake entries.
+ */
+
+const int jpeg_natural_order[DCTSIZE2+16] = {
+ 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,
+ 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
+ 63, 63, 63, 63, 63, 63, 63, 63
+};
+
+
+/*
+ * Arithmetic utilities
+ */
+
+GLOBAL(long)
+jdiv_round_up (long a, long b)
+/* Compute a/b rounded up to next integer, ie, ceil(a/b) */
+/* Assumes a >= 0, b > 0 */
+{
+ return (a + b - 1L) / b;
+}
+
+
+GLOBAL(long)
+jround_up (long a, long b)
+/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */
+/* Assumes a >= 0, b > 0 */
+{
+ a += b - 1L;
+ return a - (a % b);
+}
+
+
+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
+ * and coefficient-block arrays. This won't work on 80x86 because the arrays
+ * are FAR and we're assuming a small-pointer memory model. However, some
+ * DOS compilers provide far-pointer versions of memcpy() and memset() even
+ * in the small-model libraries. These will be used if USE_FMEM is defined.
+ * Otherwise, the routines below do it the hard way. (The performance cost
+ * is not all that great, because these routines aren't very heavily used.)
+ */
+
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */
+#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
+#define FMEMZERO(target,size) MEMZERO(target,size)
+#else /* 80x86 case, define if we can */
+#ifdef USE_FMEM
+#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
+#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#endif
+#endif
+
+
+GLOBAL(void)
+jcopy_sample_rows (JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols)
+/* Copy some rows of samples from one place to another.
+ * num_rows rows are copied from input_array[source_row++]
+ * to output_array[dest_row++]; these areas may overlap for duplication.
+ * The source and destination arrays must be at least as wide as num_cols.
+ */
+{
+ register JSAMPROW inptr, outptr;
+#ifdef FMEMCOPY
+ register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE));
+#else
+ register JDIMENSION count;
+#endif
+ register int row;
+
+ input_array += source_row;
+ output_array += dest_row;
+
+ for (row = num_rows; row > 0; row--) {
+ inptr = *input_array++;
+ outptr = *output_array++;
+#ifdef FMEMCOPY
+ FMEMCOPY(outptr, inptr, count);
+#else
+ for (count = num_cols; count > 0; count--)
+ *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */
+#endif
+ }
+}
+
+
+GLOBAL(void)
+jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks)
+/* Copy a row of coefficient blocks from one place to another. */
+{
+#ifdef FMEMCOPY
+ FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF)));
+#else
+ register JCOEFPTR inptr, outptr;
+ register long count;
+
+ inptr = (JCOEFPTR) input_row;
+ outptr = (JCOEFPTR) output_row;
+ for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) {
+ *outptr++ = *inptr++;
+ }
+#endif
+}
+
+
+GLOBAL(void)
+jzero_far (void FAR * target, size_t bytestozero)
+/* Zero out a chunk of FAR memory. */
+/* This might be sample-array data, block-array data, or alloc_large data. */
+{
+#ifdef FMEMZERO
+ FMEMZERO(target, bytestozero);
+#else
+ register char FAR * ptr = (char FAR *) target;
+ register size_t count;
+
+ for (count = bytestozero; count > 0; count--) {
+ *ptr++ = 0;
+ }
+#endif
+}
+
+#endif //_FX_JPEG_TURBO_
diff --git a/core/src/fxcodec/libjpeg/jchuff.h b/core/src/fxcodec/libjpeg/jchuff.h
new file mode 100644
index 0000000000..8c02c09ad0
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jchuff.h
@@ -0,0 +1,47 @@
+/*
+ * jchuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy encoding routines
+ * that are shared between the sequential encoder (jchuff.c) and the
+ * progressive encoder (jcphuff.c). No other modules need to see these.
+ */
+
+/* The legal range of a DCT coefficient is
+ * -1024 .. +1023 for 8-bit data;
+ * -16384 .. +16383 for 12-bit data.
+ * Hence the magnitude should always fit in 10 or 14 bits respectively.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+#define MAX_COEF_BITS 10
+#else
+#define MAX_COEF_BITS 14
+#endif
+
+/* Derived data constructed for each Huffman table */
+
+typedef struct {
+ unsigned int ehufco[256]; /* code for each symbol */
+ char ehufsi[256]; /* length of code for each symbol */
+ /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */
+} c_derived_tbl;
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_c_derived_tbl jMkCDerived
+#define jpeg_gen_optimal_table jGenOptTbl
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_c_derived_tbl
+ JPP((j_compress_ptr cinfo, boolean isDC, int tblno,
+ c_derived_tbl ** pdtbl));
+
+/* Generate an optimal table definition given the specified counts */
+EXTERN(void) jpeg_gen_optimal_table
+ JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]));
diff --git a/core/src/fxcodec/libjpeg/jconfig.h b/core/src/fxcodec/libjpeg/jconfig.h
new file mode 100644
index 0000000000..2f4da14c54
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jconfig.h
@@ -0,0 +1,45 @@
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
+/* see jconfig.doc for explanations */
+
+#define HAVE_PROTOTYPES
+#define HAVE_UNSIGNED_CHAR
+#define HAVE_UNSIGNED_SHORT
+/* #define void char */
+/* #define const */
+#undef CHAR_IS_UNSIGNED
+#define HAVE_STDDEF_H
+#define HAVE_STDLIB_H
+#undef NEED_BSD_STRINGS
+#undef NEED_SYS_TYPES_H
+#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
+#undef NEED_SHORT_EXTERNAL_NAMES
+#undef INCOMPLETE_TYPES_BROKEN
+
+/* Define "boolean" as unsigned char, not int, per Windows custom */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+typedef unsigned char boolean;
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+
+
+#ifdef JPEG_INTERNALS
+
+#undef RIGHT_SHIFT_IS_UNSIGNED
+
+#endif /* JPEG_INTERNALS */
+
+#ifdef JPEG_CJPEG_DJPEG
+
+#define BMP_SUPPORTED /* BMP image file format */
+#define GIF_SUPPORTED /* GIF image file format */
+#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
+#undef RLE_SUPPORTED /* Utah RLE image file format */
+#define TARGA_SUPPORTED /* Targa image file format */
+
+#define TWO_FILE_COMMANDLINE /* optional */
+#define USE_SETMODE /* Microsoft has setmode() */
+#undef NEED_SIGNAL_CATCHER
+#undef DONT_USE_B_MODE
+#undef PROGRESS_REPORT /* optional */
+
+#endif /* JPEG_CJPEG_DJPEG */
diff --git a/core/src/fxcodec/libjpeg/jdct.h b/core/src/fxcodec/libjpeg/jdct.h
new file mode 100644
index 0000000000..b664cab0d2
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jdct.h
@@ -0,0 +1,176 @@
+/*
+ * jdct.h
+ *
+ * Copyright (C) 1994-1996, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file contains common declarations for the forward and
+ * inverse DCT modules. These declarations are private to the DCT managers
+ * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms.
+ * The individual DCT algorithms are kept in separate files to ease
+ * machine-dependent tuning (e.g., assembly coding).
+ */
+
+
+/*
+ * A forward DCT routine is given a pointer to a work area of type DCTELEM[];
+ * the DCT is to be performed in-place in that buffer. Type DCTELEM is int
+ * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT
+ * implementations use an array of type FAST_FLOAT, instead.)
+ * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE).
+ * The DCT outputs are returned scaled up by a factor of 8; they therefore
+ * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This
+ * convention improves accuracy in integer implementations and saves some
+ * work in floating-point ones.
+ * Quantization of the output coefficients is done by jcdctmgr.c.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+typedef int DCTELEM; /* 16 or 32 bits is fine */
+#else
+typedef INT32 DCTELEM; /* must have 32 bits */
+#endif
+
+typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data));
+typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data));
+
+
+/*
+ * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer
+ * to an output sample array. The routine must dequantize the input data as
+ * well as perform the IDCT; for dequantization, it uses the multiplier table
+ * pointed to by compptr->dct_table. The output data is to be placed into the
+ * sample array starting at a specified column. (Any row offset needed will
+ * be applied to the array pointer before it is passed to the IDCT code.)
+ * Note that the number of samples emitted by the IDCT routine is
+ * DCT_scaled_size * DCT_scaled_size.
+ */
+
+/* typedef inverse_DCT_method_ptr is declared in jpegint.h */
+
+/*
+ * Each IDCT routine has its own ideas about the best dct_table element type.
+ */
+
+typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */
+#if BITS_IN_JSAMPLE == 8
+typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */
+#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */
+#else
+typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */
+#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */
+#endif
+typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
+
+
+/*
+ * Each IDCT routine is responsible for range-limiting its results and
+ * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could
+ * be quite far out of range if the input data is corrupt, so a bulletproof
+ * range-limiting step is required. We use a mask-and-table-lookup method
+ * to do the combined operations quickly. See the comments with
+ * prepare_range_limit_table (in jdmaster.c) for more info.
+ */
+
+#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE)
+
+#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_fdct_islow jFDislow
+#define jpeg_fdct_ifast jFDifast
+#define jpeg_fdct_float jFDfloat
+#define jpeg_idct_islow jRDislow
+#define jpeg_idct_ifast jRDifast
+#define jpeg_idct_float jRDfloat
+#define jpeg_idct_4x4 jRD4x4
+#define jpeg_idct_2x2 jRD2x2
+#define jpeg_idct_1x1 jRD1x1
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+/* Extern declarations for the forward and inverse DCT routines. */
+
+EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data));
+EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data));
+
+EXTERN(void) jpeg_idct_islow
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_ifast
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_float
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_4x4
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_2x2
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+EXTERN(void) jpeg_idct_1x1
+ JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col));
+
+
+/*
+ * Macros for handling fixed-point arithmetic; these are used by many
+ * but not all of the DCT/IDCT modules.
+ *
+ * All values are expected to be of type INT32.
+ * Fractional constants are scaled left by CONST_BITS bits.
+ * CONST_BITS is defined within each module using these macros,
+ * and may differ from one module to the next.
+ */
+
+#define ONE ((INT32) 1)
+#define CONST_SCALE (ONE << CONST_BITS)
+
+/* Convert a positive real constant to an integer scaled by CONST_SCALE.
+ * Caution: some C compilers fail to reduce "FIX(constant)" at compile time,
+ * thus causing a lot of useless floating-point operations at run time.
+ */
+
+#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5))
+
+/* Descale and correctly round an INT32 value that's scaled by N bits.
+ * We assume RIGHT_SHIFT rounds towards minus infinity, so adding
+ * the fudge factor is correct for either sign of X.
+ */
+
+#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
+
+/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
+ * This macro is used only when the two inputs will actually be no more than
+ * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a
+ * full 32x32 multiply. This provides a useful speedup on many machines.
+ * Unfortunately there is no way to specify a 16x16->32 multiply portably
+ * in C, but some C compilers will do the right thing if you provide the
+ * correct combination of casts.
+ */
+
+#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
+#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const)))
+#endif
+#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */
+#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const)))
+#endif
+
+#ifndef MULTIPLY16C16 /* default definition */
+#define MULTIPLY16C16(var,const) ((var) * (const))
+#endif
+
+/* Same except both inputs are variables. */
+
+#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */
+#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2)))
+#endif
+
+#ifndef MULTIPLY16V16 /* default definition */
+#define MULTIPLY16V16(var1,var2) ((var1) * (var2))
+#endif
diff --git a/core/src/fxcodec/libjpeg/jdhuff.h b/core/src/fxcodec/libjpeg/jdhuff.h
new file mode 100644
index 0000000000..12c0747709
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jdhuff.h
@@ -0,0 +1,201 @@
+/*
+ * jdhuff.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for Huffman entropy decoding routines
+ * that are shared between the sequential decoder (jdhuff.c) and the
+ * progressive decoder (jdphuff.c). No other modules need to see these.
+ */
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_make_d_derived_tbl jMkDDerived
+#define jpeg_fill_bit_buffer jFilBitBuf
+#define jpeg_huff_decode jHufDecode
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Derived data constructed for each Huffman table */
+
+#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */
+
+typedef struct {
+ /* Basic tables: (element [0] of each array is unused) */
+ INT32 maxcode[18]; /* largest code of length k (-1 if none) */
+ /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */
+ INT32 valoffset[17]; /* huffval[] offset for codes of length k */
+ /* valoffset[k] = huffval[] index of 1st symbol of code length k, less
+ * the smallest code of length k; so given a code of length k, the
+ * corresponding symbol is huffval[code + valoffset[k]]
+ */
+
+ /* Link to public Huffman table (needed only in jpeg_huff_decode) */
+ JHUFF_TBL *pub;
+
+ /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of
+ * the input data stream. If the next Huffman code is no more
+ * than HUFF_LOOKAHEAD bits long, we can obtain its length and
+ * the corresponding symbol directly from these tables.
+ */
+ int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */
+ UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */
+} d_derived_tbl;
+
+/* Expand a Huffman table definition into the derived format */
+EXTERN(void) jpeg_make_d_derived_tbl
+ JPP((j_decompress_ptr cinfo, boolean isDC, int tblno,
+ d_derived_tbl ** pdtbl));
+
+
+/*
+ * Fetching the next N bits from the input stream is a time-critical operation
+ * for the Huffman decoders. We implement it with a combination of inline
+ * macros and out-of-line subroutines. Note that N (the number of bits
+ * demanded at one time) never exceeds 15 for JPEG use.
+ *
+ * We read source bytes into get_buffer and dole out bits as needed.
+ * If get_buffer already contains enough bits, they are fetched in-line
+ * by the macros CHECK_BIT_BUFFER and GET_BITS. When there aren't enough
+ * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer
+ * as full as possible (not just to the number of bits needed; this
+ * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer).
+ * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension.
+ * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains
+ * at least the requested number of bits --- dummy zeroes are inserted if
+ * necessary.
+ */
+
+typedef INT32 bit_buf_type; /* type of bit-extraction buffer */
+#define BIT_BUF_SIZE 32 /* size of buffer in bits */
+
+/* If long is > 32 bits on your machine, and shifting/masking longs is
+ * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE
+ * appropriately should be a win. Unfortunately we can't define the size
+ * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8)
+ * because not all machines measure sizeof in 8-bit bytes.
+ */
+
+typedef struct { /* Bitreading state saved across MCUs */
+ bit_buf_type get_buffer; /* current bit-extraction buffer */
+ int bits_left; /* # of unused bits in it */
+} bitread_perm_state;
+
+typedef struct { /* Bitreading working state within an MCU */
+ /* Current data source location */
+ /* We need a copy, rather than munging the original, in case of suspension */
+ const JOCTET * next_input_byte; /* => next byte to read from source */
+ size_t bytes_in_buffer; /* # of bytes remaining in source buffer */
+ /* Bit input buffer --- note these values are kept in register variables,
+ * not in this struct, inside the inner loops.
+ */
+ bit_buf_type get_buffer; /* current bit-extraction buffer */
+ int bits_left; /* # of unused bits in it */
+ /* Pointer needed by jpeg_fill_bit_buffer. */
+ j_decompress_ptr cinfo; /* back link to decompress master record */
+} bitread_working_state;
+
+/* Macros to declare and load/save bitread local variables. */
+#define BITREAD_STATE_VARS \
+ register bit_buf_type get_buffer; \
+ register int bits_left; \
+ bitread_working_state br_state
+
+#define BITREAD_LOAD_STATE(cinfop,permstate) \
+ br_state.cinfo = cinfop; \
+ br_state.next_input_byte = cinfop->src->next_input_byte; \
+ br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \
+ get_buffer = permstate.get_buffer; \
+ bits_left = permstate.bits_left;
+
+#define BITREAD_SAVE_STATE(cinfop,permstate) \
+ cinfop->src->next_input_byte = br_state.next_input_byte; \
+ cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \
+ permstate.get_buffer = get_buffer; \
+ permstate.bits_left = bits_left
+
+/*
+ * These macros provide the in-line portion of bit fetching.
+ * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer
+ * before using GET_BITS, PEEK_BITS, or DROP_BITS.
+ * The variables get_buffer and bits_left are assumed to be locals,
+ * but the state struct might not be (jpeg_huff_decode needs this).
+ * CHECK_BIT_BUFFER(state,n,action);
+ * Ensure there are N bits in get_buffer; if suspend, take action.
+ * val = GET_BITS(n);
+ * Fetch next N bits.
+ * val = PEEK_BITS(n);
+ * Fetch next N bits without removing them from the buffer.
+ * DROP_BITS(n);
+ * Discard next N bits.
+ * The value N should be a simple variable, not an expression, because it
+ * is evaluated multiple times.
+ */
+
+#define CHECK_BIT_BUFFER(state,nbits,action) \
+ { if (bits_left < (nbits)) { \
+ if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \
+ { action; } \
+ get_buffer = (state).get_buffer; bits_left = (state).bits_left; } }
+
+#define GET_BITS(nbits) \
+ (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1))
+
+#define PEEK_BITS(nbits) \
+ (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1))
+
+#define DROP_BITS(nbits) \
+ (bits_left -= (nbits))
+
+/* Load up the bit buffer to a depth of at least nbits */
+EXTERN(boolean) jpeg_fill_bit_buffer
+ JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+ register int bits_left, int nbits));
+
+
+/*
+ * Code for extracting next Huffman-coded symbol from input bit stream.
+ * Again, this is time-critical and we make the main paths be macros.
+ *
+ * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits
+ * without looping. Usually, more than 95% of the Huffman codes will be 8
+ * or fewer bits long. The few overlength codes are handled with a loop,
+ * which need not be inline code.
+ *
+ * Notes about the HUFF_DECODE macro:
+ * 1. Near the end of the data segment, we may fail to get enough bits
+ * for a lookahead. In that case, we do it the hard way.
+ * 2. If the lookahead table contains no entry, the next code must be
+ * more than HUFF_LOOKAHEAD bits long.
+ * 3. jpeg_huff_decode returns -1 if forced to suspend.
+ */
+
+#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \
+{ register int nb, look; \
+ if (bits_left < HUFF_LOOKAHEAD) { \
+ if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \
+ get_buffer = state.get_buffer; bits_left = state.bits_left; \
+ if (bits_left < HUFF_LOOKAHEAD) { \
+ nb = 1; goto slowlabel; \
+ } \
+ } \
+ look = PEEK_BITS(HUFF_LOOKAHEAD); \
+ if ((nb = htbl->look_nbits[look]) != 0) { \
+ DROP_BITS(nb); \
+ result = htbl->look_sym[look]; \
+ } else { \
+ nb = HUFF_LOOKAHEAD+1; \
+slowlabel: \
+ if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \
+ { failaction; } \
+ get_buffer = state.get_buffer; bits_left = state.bits_left; \
+ } \
+}
+
+/* Out-of-line case for Huffman code fetching */
+EXTERN(int) jpeg_huff_decode
+ JPP((bitread_working_state * state, register bit_buf_type get_buffer,
+ register int bits_left, d_derived_tbl * htbl, int min_bits));
diff --git a/core/src/fxcodec/libjpeg/jerror.h b/core/src/fxcodec/libjpeg/jerror.h
new file mode 100644
index 0000000000..a2b8f96f8f
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jerror.h
@@ -0,0 +1,291 @@
+/*
+ * jerror.h
+ *
+ * Copyright (C) 1994-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the error and message codes for the JPEG library.
+ * Edit this file to add new codes, or to translate the message strings to
+ * some other language.
+ * A set of error-reporting macros are defined too. Some applications using
+ * the JPEG library may wish to include this file to get the error codes
+ * and/or the macros.
+ */
+
+/*
+ * To define the enum list of message codes, include this file without
+ * defining macro JMESSAGE. To create a message string table, include it
+ * again with a suitable JMESSAGE definition (see jerror.c for an example).
+ */
+#ifndef JMESSAGE
+#ifndef JERROR_H
+/* First time through, define the enum list */
+#define JMAKE_ENUM_LIST
+#else
+/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
+#define JMESSAGE(code,string)
+#endif /* JERROR_H */
+#endif /* JMESSAGE */
+
+#ifdef JMAKE_ENUM_LIST
+
+typedef enum {
+
+#define JMESSAGE(code,string) code ,
+
+#endif /* JMAKE_ENUM_LIST */
+
+JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */
+
+/* For maintenance convenience, list is alphabetical by message code name */
+JMESSAGE(JERR_ARITH_NOTIMPL,
+ "Sorry, there are legal restrictions on arithmetic coding")
+JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix")
+JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
+JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
+JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
+JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
+JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
+JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
+JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
+JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
+JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length")
+JMESSAGE(JERR_BAD_LIB_VERSION,
+ "Wrong JPEG library version: library is %d, caller expects %d")
+JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan")
+JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d")
+JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d")
+JMESSAGE(JERR_BAD_PROGRESSION,
+ "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d")
+JMESSAGE(JERR_BAD_PROG_SCRIPT,
+ "Invalid progressive parameters at scan script entry %d")
+JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors")
+JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d")
+JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d")
+JMESSAGE(JERR_BAD_STRUCT_SIZE,
+ "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u")
+JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access")
+JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small")
+JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here")
+JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet")
+JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d")
+JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request")
+JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d")
+JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x")
+JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d")
+JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d")
+JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)")
+JMESSAGE(JERR_EMS_READ, "Read from EMS failed")
+JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed")
+JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan")
+JMESSAGE(JERR_FILE_READ, "Input file read error")
+JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?")
+JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet")
+JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow")
+JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry")
+JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels")
+JMESSAGE(JERR_INPUT_EMPTY, "Empty input file")
+JMESSAGE(JERR_INPUT_EOF, "Premature end of input file")
+JMESSAGE(JERR_MISMATCHED_QUANT_TABLE,
+ "Cannot transcode due to multiple use of quantization table %d")
+JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data")
+JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
+JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
+JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
+JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
+JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
+JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
+JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined")
+JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x")
+JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)")
+JMESSAGE(JERR_QUANT_COMPONENTS,
+ "Cannot quantize more than %d color components")
+JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
+JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
+JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
+JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
+JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
+JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
+JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
+JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
+JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
+JMESSAGE(JERR_TFILE_WRITE,
+ "Write failed on temporary file --- out of disk space?")
+JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines")
+JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x")
+JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up")
+JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation")
+JMESSAGE(JERR_XMS_READ, "Read from XMS failed")
+JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed")
+JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT)
+JMESSAGE(JMSG_VERSION, JVERSION)
+JMESSAGE(JTRC_16BIT_TABLES,
+ "Caution: quantization tables are too coarse for baseline JPEG")
+JMESSAGE(JTRC_ADOBE,
+ "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d")
+JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u")
+JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u")
+JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x")
+JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x")
+JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d")
+JMESSAGE(JTRC_DRI, "Define Restart Interval %u")
+JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u")
+JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u")
+JMESSAGE(JTRC_EOI, "End Of Image")
+JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d")
+JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d")
+JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE,
+ "Warning: thumbnail image size does not match data length %u")
+JMESSAGE(JTRC_JFIF_EXTENSION,
+ "JFIF extension marker: type 0x%02x, length %u")
+JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image")
+JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u")
+JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x")
+JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u")
+JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors")
+JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors")
+JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization")
+JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d")
+JMESSAGE(JTRC_RST, "RST%d")
+JMESSAGE(JTRC_SMOOTH_NOTIMPL,
+ "Smoothing not supported with nonstandard sampling ratios")
+JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d")
+JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d")
+JMESSAGE(JTRC_SOI, "Start of Image")
+JMESSAGE(JTRC_SOS, "Start Of Scan: %d components")
+JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d")
+JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d")
+JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s")
+JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s")
+JMESSAGE(JTRC_THUMB_JPEG,
+ "JFIF extension marker: JPEG-compressed thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_PALETTE,
+ "JFIF extension marker: palette thumbnail image, length %u")
+JMESSAGE(JTRC_THUMB_RGB,
+ "JFIF extension marker: RGB thumbnail image, length %u")
+JMESSAGE(JTRC_UNKNOWN_IDS,
+ "Unrecognized component IDs %d %d %d, assuming YCbCr")
+JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
+JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
+JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
+JMESSAGE(JWRN_BOGUS_PROGRESSION,
+ "Inconsistent progression sequence for component %d coefficient %d")
+JMESSAGE(JWRN_EXTRANEOUS_DATA,
+ "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x")
+JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment")
+JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code")
+JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d")
+JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file")
+JMESSAGE(JWRN_MUST_RESYNC,
+ "Corrupt JPEG data: found marker 0x%02x instead of RST%d")
+JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG")
+JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines")
+
+#ifdef JMAKE_ENUM_LIST
+
+ JMSG_LASTMSGCODE
+} J_MESSAGE_CODE;
+
+#undef JMAKE_ENUM_LIST
+#endif /* JMAKE_ENUM_LIST */
+
+/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
+#undef JMESSAGE
+
+
+#ifndef JERROR_H
+#define JERROR_H
+
+/* Macros to simplify using the error and trace message stuff */
+/* The first parameter is either type of cinfo pointer */
+
+/* Fatal errors (print message and exit) */
+#define ERREXIT(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT3(cinfo,code,p1,p2,p3) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (cinfo)->err->msg_parm.i[2] = (p3), \
+ (cinfo)->err->msg_parm.i[3] = (p4), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+#define ERREXITS(cinfo,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
+
+#define MAKESTMT(stuff) do { stuff } while (0)
+
+/* Nonfatal errors (we can keep going, but the data is probably corrupt) */
+#define WARNMS(cinfo,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS1(cinfo,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+#define WARNMS2(cinfo,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1))
+
+/* Informational/debugging messages */
+#define TRACEMS(cinfo,lvl,code) \
+ ((cinfo)->err->msg_code = (code), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS1(cinfo,lvl,code,p1) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS2(cinfo,lvl,code,p1,p2) \
+ ((cinfo)->err->msg_code = (code), \
+ (cinfo)->err->msg_parm.i[0] = (p1), \
+ (cinfo)->err->msg_parm.i[1] = (p2), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \
+ MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \
+ _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \
+ _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \
+ (cinfo)->err->msg_code = (code); \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); )
+#define TRACEMSS(cinfo,lvl,code,str) \
+ ((cinfo)->err->msg_code = (code), \
+ FXSYS_strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \
+ (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)))
+
+#endif /* JERROR_H */
diff --git a/core/src/fxcodec/libjpeg/jinclude.h b/core/src/fxcodec/libjpeg/jinclude.h
new file mode 100644
index 0000000000..070188a9b6
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jinclude.h
@@ -0,0 +1,102 @@
+/*
+ * jinclude.h
+ *
+ * Copyright (C) 1991-1994, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file exists to provide a single place to fix any problems with
+ * including the wrong system include files. (Common problems are taken
+ * care of by the standard jconfig symbols, but on really weird systems
+ * you may have to edit this file.)
+ *
+ * NOTE: this file is NOT intended to be included by applications using the
+ * JPEG library. Most applications need only include jpeglib.h.
+ */
+
+
+/* Include auto-config file to find out which system include files we need. */
+
+#include "jconfig.h" /* auto configuration options */
+#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */
+
+#include "../../../include/fxcrt/fx_system.h"
+/*
+ * We need the NULL macro and size_t typedef.
+ * On an ANSI-conforming system it is sufficient to include <stddef.h>.
+ * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to
+ * pull in <sys/types.h> as well.
+ * Note that the core JPEG library does not require <stdio.h>;
+ * only the default error handler and data source/destination modules do.
+ * But we must pull it in because of the references to FILE in jpeglib.h.
+ * You can remove those references if you want to compile without <stdio.h>.
+ */
+
+#ifdef _DEBUG
+#define CRTDBG_MAP_ALLOC
+//#include <stdlib.h>
+//#include <crtdbg.h>
+#endif
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+//#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifndef FAR
+#define FAR
+#endif
+
+//#include <stdio.h>
+
+/*
+ * We need memory copying and zeroing functions, plus strncpy().
+ * ANSI and System V implementations declare these in <string.h>.
+ * BSD doesn't have the mem() functions, but it does have bcopy()/bzero().
+ * Some systems may declare memset and memcpy in <memory.h>.
+ *
+ * NOTE: we assume the size parameters to these functions are of type size_t.
+ * Change the casts in these macros if not!
+ */
+
+#ifdef NEED_BSD_STRINGS
+
+//#include <strings.h>
+#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size))
+#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size))
+
+#else /* not BSD, assume ANSI/SysV string lib */
+
+//#include <string.h>
+#define MEMZERO(target,size) FXSYS_memset32((void *)(target), 0, (size_t)(size))
+#define MEMCOPY(dest,src,size) FXSYS_memcpy32((void *)(dest), (const void *)(src), (size_t)(size))
+
+#endif
+
+/*
+ * In ANSI C, and indeed any rational implementation, size_t is also the
+ * type returned by sizeof(). However, it seems there are some irrational
+ * implementations out there, in which sizeof() returns an int even though
+ * size_t is defined as long or unsigned long. To ensure consistent results
+ * we always use this SIZEOF() macro in place of using sizeof() directly.
+ */
+
+#define SIZEOF(object) ((size_t) sizeof(object))
+
+/*
+ * The modules that use fread() and fwrite() always invoke them through
+ * these macros. On some systems you may need to twiddle the argument casts.
+ * CAUTION: argument order is different from underlying functions!
+ */
+
+#define JFREAD(file,buf,sizeofbuf) \
+ ((size_t) FXSYS_fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
+#define JFWRITE(file,buf,sizeofbuf) \
+ ((size_t) FXSYS_fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
diff --git a/core/src/fxcodec/libjpeg/jmemsys.h b/core/src/fxcodec/libjpeg/jmemsys.h
new file mode 100644
index 0000000000..baa7b7f993
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jmemsys.h
@@ -0,0 +1,200 @@
+/*
+ * jmemsys.h
+ *
+ * Copyright (C) 1992-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This include file defines the interface between the system-independent
+ * and system-dependent portions of the JPEG memory manager. No other
+ * modules need include it. (The system-independent portion is jmemmgr.c;
+ * there are several different versions of the system-dependent portion.)
+ *
+ * This file works as-is for the system-dependent memory managers supplied
+ * in the IJG distribution. You may need to modify it if you write a
+ * custom memory manager. If system-dependent changes are needed in
+ * this file, the best method is to #ifdef them based on a configuration
+ * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR
+ * and USE_MAC_MEMMGR.
+ */
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_get_small jGetSmall
+#define jpeg_free_small jFreeSmall
+#define jpeg_get_large jGetLarge
+#define jpeg_free_large jFreeLarge
+#define jpeg_mem_available jMemAvail
+#define jpeg_open_backing_store jOpenBackStore
+#define jpeg_mem_init jMemInit
+#define jpeg_mem_term jMemTerm
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/*
+ * These two functions are used to allocate and release small chunks of
+ * memory. (Typically the total amount requested through jpeg_get_small is
+ * no more than 20K or so; this will be requested in chunks of a few K each.)
+ * Behavior should be the same as for the standard library functions malloc
+ * and free; in particular, jpeg_get_small must return NULL on failure.
+ * On most systems, these ARE malloc and free. jpeg_free_small is passed the
+ * size of the object being freed, just in case it's needed.
+ * On an 80x86 machine using small-data memory model, these manage near heap.
+ */
+
+EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject));
+EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object,
+ size_t sizeofobject));
+
+/*
+ * These two functions are used to allocate and release large chunks of
+ * memory (up to the total free space designated by jpeg_mem_available).
+ * The interface is the same as above, except that on an 80x86 machine,
+ * far pointers are used. On most other machines these are identical to
+ * the jpeg_get/free_small routines; but we keep them separate anyway,
+ * in case a different allocation strategy is desirable for large chunks.
+ */
+
+EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo,
+ size_t sizeofobject));
+EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object,
+ size_t sizeofobject));
+
+/*
+ * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
+ * be requested in a single call to jpeg_get_large (and jpeg_get_small for that
+ * matter, but that case should never come into play). This macro is needed
+ * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
+ * On those machines, we expect that jconfig.h will provide a proper value.
+ * On machines with 32-bit flat address spaces, any large constant may be used.
+ *
+ * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type
+ * size_t and will be a multiple of sizeof(align_type).
+ */
+
+#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */
+#define MAX_ALLOC_CHUNK 1000000000L
+#endif
+
+/*
+ * This routine computes the total space still available for allocation by
+ * jpeg_get_large. If more space than this is needed, backing store will be
+ * used. NOTE: any memory already allocated must not be counted.
+ *
+ * There is a minimum space requirement, corresponding to the minimum
+ * feasible buffer sizes; jmemmgr.c will request that much space even if
+ * jpeg_mem_available returns zero. The maximum space needed, enough to hold
+ * all working storage in memory, is also passed in case it is useful.
+ * Finally, the total space already allocated is passed. If no better
+ * method is available, cinfo->mem->max_memory_to_use - already_allocated
+ * is often a suitable calculation.
+ *
+ * It is OK for jpeg_mem_available to underestimate the space available
+ * (that'll just lead to more backing-store access than is really necessary).
+ * However, an overestimate will lead to failure. Hence it's wise to subtract
+ * a slop factor from the true available space. 5% should be enough.
+ *
+ * On machines with lots of virtual memory, any large constant may be returned.
+ * Conversely, zero may be returned to always use the minimum amount of memory.
+ */
+
+EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo,
+ long min_bytes_needed,
+ long max_bytes_needed,
+ long already_allocated));
+
+
+/*
+ * This structure holds whatever state is needed to access a single
+ * backing-store object. The read/write/close method pointers are called
+ * by jmemmgr.c to manipulate the backing-store object; all other fields
+ * are private to the system-dependent backing store routines.
+ */
+
+#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */
+
+
+#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */
+
+typedef unsigned short XMSH; /* type of extended-memory handles */
+typedef unsigned short EMSH; /* type of expanded-memory handles */
+
+typedef union {
+ short file_handle; /* DOS file handle if it's a temp file */
+ XMSH xms_handle; /* handle if it's a chunk of XMS */
+ EMSH ems_handle; /* handle if it's a chunk of EMS */
+} handle_union;
+
+#endif /* USE_MSDOS_MEMMGR */
+
+#ifdef USE_MAC_MEMMGR /* Mac-specific junk */
+#include <Files.h>
+#endif /* USE_MAC_MEMMGR */
+
+
+typedef struct backing_store_struct * backing_store_ptr;
+
+typedef struct backing_store_struct {
+ /* Methods for reading/writing/closing this backing-store object */
+ JMETHOD(void, read_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info,
+ void FAR * buffer_address,
+ long file_offset, long byte_count));
+ JMETHOD(void, write_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info,
+ void FAR * buffer_address,
+ long file_offset, long byte_count));
+ JMETHOD(void, close_backing_store, (j_common_ptr cinfo,
+ backing_store_ptr info));
+
+ /* Private fields for system-dependent backing-store management */
+#ifdef USE_MSDOS_MEMMGR
+ /* For the MS-DOS manager (jmemdos.c), we need: */
+ handle_union handle; /* reference to backing-store storage object */
+ char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+#ifdef USE_MAC_MEMMGR
+ /* For the Mac manager (jmemmac.c), we need: */
+ short temp_file; /* file reference number to temp file */
+ FSSpec tempSpec; /* the FSSpec for the temp file */
+ char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
+#else
+ /* For a typical implementation with temp files, we need: */
+#ifndef _FPDFAPI_MINI_
+ FXSYS_FILE * temp_file; /* stdio reference to temp file */
+ char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
+#endif
+#endif
+#endif
+} backing_store_info;
+
+
+/*
+ * Initial opening of a backing-store object. This must fill in the
+ * read/write/close pointers in the object. The read/write routines
+ * may take an error exit if the specified maximum file size is exceeded.
+ * (If jpeg_mem_available always returns a large value, this routine can
+ * just take an error exit.)
+ */
+
+EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo,
+ backing_store_ptr info,
+ long total_bytes_needed));
+
+
+/*
+ * These routines take care of any system-dependent initialization and
+ * cleanup required. jpeg_mem_init will be called before anything is
+ * allocated (and, therefore, nothing in cinfo is of use except the error
+ * manager pointer). It should return a suitable default value for
+ * max_memory_to_use; this may subsequently be overridden by the surrounding
+ * application. (Note that max_memory_to_use is only important if
+ * jpeg_mem_available chooses to consult it ... no one else will.)
+ * jpeg_mem_term may assume that all requested memory has been freed and that
+ * all opened backing-store objects have been closed.
+ */
+
+EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo));
diff --git a/core/src/fxcodec/libjpeg/jmorecfg.h b/core/src/fxcodec/libjpeg/jmorecfg.h
new file mode 100644
index 0000000000..3602114a5c
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jmorecfg.h
@@ -0,0 +1,376 @@
+/*
+ * jmorecfg.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains additional configuration options that customize the
+ * JPEG software for special applications or support machine-dependent
+ * optimizations. Most users will not need to touch this file.
+ */
+
+#ifdef _MSC_VER
+#pragma warning (disable : 4142)
+#endif
+
+/*
+ * Define BITS_IN_JSAMPLE as either
+ * 8 for 8-bit sample values (the usual setting)
+ * 12 for 12-bit sample values
+ * Only 8 and 12 are legal data precisions for lossy JPEG according to the
+ * JPEG standard, and the IJG code does not support anything else!
+ * We do not support run-time selection of data precision, sorry.
+ */
+
+#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
+
+
+/*
+ * Maximum number of components (color channels) allowed in JPEG image.
+ * To meet the letter of the JPEG spec, set this to 255. However, darn
+ * few applications need more than 4 channels (maybe 5 for CMYK + alpha
+ * mask). We recommend 10 as a reasonable compromise; use 4 if you are
+ * really short on memory. (Each allowed component costs a hundred or so
+ * bytes of storage, whether actually used in an image or not.)
+ */
+
+#define MAX_COMPONENTS 10 /* maximum number of image components */
+
+
+/*
+ * Basic data types.
+ * You may need to change these if you have a machine with unusual data
+ * type sizes; for example, "char" not 8 bits, "short" not 16 bits,
+ * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits,
+ * but it had better be at least 16.
+ */
+
+/* Representation of a single sample (pixel element value).
+ * We frequently allocate large arrays of these, so it's important to keep
+ * them small. But if you have memory to burn and access to char or short
+ * arrays is very slow on your hardware, you might want to change these.
+ */
+
+#if BITS_IN_JSAMPLE == 8
+/* JSAMPLE should be the smallest type that will hold the values 0..255.
+ * You can use a signed char by having GETJSAMPLE mask it with 0xFF.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JSAMPLE;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJSAMPLE(value) ((int) (value))
+#else
+#define GETJSAMPLE(value) ((int) (value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+#define MAXJSAMPLE 255
+#define CENTERJSAMPLE 128
+
+#endif /* BITS_IN_JSAMPLE == 8 */
+
+
+#if BITS_IN_JSAMPLE == 12
+/* JSAMPLE should be the smallest type that will hold the values 0..4095.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 4095
+#define CENTERJSAMPLE 2048
+
+#endif /* BITS_IN_JSAMPLE == 12 */
+
+
+/* Representation of a DCT frequency coefficient.
+ * This should be a signed value of at least 16 bits; "short" is usually OK.
+ * Again, we allocate large arrays of these, but you can change to int
+ * if you have memory to burn and "short" is really slow.
+ */
+
+typedef short JCOEF;
+
+
+/* Compressed datastreams are represented as arrays of JOCTET.
+ * These must be EXACTLY 8 bits wide, at least once they are written to
+ * external storage. Note that when using the stdio data source/destination
+ * managers, this is also the data type passed to fread/fwrite.
+ */
+
+#ifdef HAVE_UNSIGNED_CHAR
+
+typedef unsigned char JOCTET;
+#define GETJOCTET(value) (value)
+
+#else /* not HAVE_UNSIGNED_CHAR */
+
+typedef char JOCTET;
+#ifdef CHAR_IS_UNSIGNED
+#define GETJOCTET(value) (value)
+#else
+#define GETJOCTET(value) ((value) & 0xFF)
+#endif /* CHAR_IS_UNSIGNED */
+
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* These typedefs are used for various table entries and so forth.
+ * They must be at least as wide as specified; but making them too big
+ * won't cost a huge amount of memory, so we don't provide special
+ * extraction code like we did for JSAMPLE. (In other words, these
+ * typedefs live at a different point on the speed/space tradeoff curve.)
+ */
+
+#if _FX_OS_ != _FX_VXWORKS_
+
+/* UINT8 must hold at least the values 0..255. */
+
+#ifdef HAVE_UNSIGNED_CHAR
+typedef unsigned char UINT8;
+#else /* not HAVE_UNSIGNED_CHAR */
+#ifdef CHAR_IS_UNSIGNED
+typedef char UINT8;
+#else /* not CHAR_IS_UNSIGNED */
+typedef short UINT8;
+#endif /* CHAR_IS_UNSIGNED */
+#endif /* HAVE_UNSIGNED_CHAR */
+
+
+/* UINT16 must hold at least the values 0..65535. */
+
+#ifdef HAVE_UNSIGNED_SHORT
+typedef unsigned short UINT16;
+#else /* not HAVE_UNSIGNED_SHORT */
+typedef unsigned int UINT16;
+#endif /* HAVE_UNSIGNED_SHORT */
+
+/* INT16 must hold at least the values -32768..32767. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */
+typedef short INT16;
+#endif
+
+/* INT32 must hold at least signed 32-bit values. */
+
+#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
+typedef int INT32;
+#endif
+
+#endif
+
+/* Datatype used for image dimensions. The JPEG standard only supports
+ * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
+ * "unsigned int" is sufficient on all machines. However, if you need to
+ * handle larger images and you don't mind deviating from the spec, you
+ * can change this datatype.
+ */
+
+typedef unsigned int JDIMENSION;
+
+#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */
+
+
+/* These macros are used in all function definitions and extern declarations.
+ * You could modify them if you need to change function linkage conventions;
+ * in particular, you'll need to do that to make the library a Windows DLL.
+ * Another application is to make all functions global for use with debuggers
+ * or code profilers that require it.
+ */
+
+/* a function called through method pointers: */
+#define METHODDEF(type) static type
+/* a function used only in its module: */
+#define LOCAL(type) static type
+/* a function referenced thru EXTERNs: */
+#define GLOBAL(type) type
+
+#ifdef _FX_MANAGED_CODE_
+#define EXTERN(type) extern "C" type
+#else
+/* a reference to a GLOBAL function: */
+#define EXTERN(type) extern type
+#endif
+
+
+/* This macro is used to declare a "method", that is, a function pointer.
+ * We want to supply prototype parameters if the compiler can cope.
+ * Note that the arglist parameter must be parenthesized!
+ * Again, you can customize this if you need special linkage keywords.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
+#else
+#define JMETHOD(type,methodname,arglist) type (*methodname) ()
+#endif
+
+
+/* Here is the pseudo-keyword for declaring pointers that must be "far"
+ * on 80x86 machines. Most of the specialized coding for 80x86 is handled
+ * by just saying "FAR *" where such a pointer is needed. In a few places
+ * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol.
+ */
+
+#ifdef NEED_FAR_POINTERS
+#define FAR far
+#else
+//#define FAR
+#endif
+
+
+/*
+ * On a few systems, type boolean and/or its values FALSE, TRUE may appear
+ * in standard header files. Or you may have conflicts with application-
+ * specific header files that you want to include together with these files.
+ * Defining HAVE_BOOLEAN before including jpeglib.h should make it work.
+ */
+
+#ifndef HAVE_BOOLEAN
+typedef int boolean;
+#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+
+/*
+ * The remaining options affect code selection within the JPEG library,
+ * but they don't need to be visible to most applications using the library.
+ * To minimize application namespace pollution, the symbols won't be
+ * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined.
+ */
+
+#ifdef JPEG_INTERNALS
+#define JPEG_INTERNAL_OPTIONS
+#endif
+
+#ifdef JPEG_INTERNAL_OPTIONS
+
+
+/*
+ * These defines indicate whether to include various optional functions.
+ * Undefining some of these symbols will produce a smaller but less capable
+ * library. Note that you can leave certain source files out of the
+ * compilation/linking process if you've #undef'd the corresponding symbols.
+ * (You may HAVE to do that if your compiler doesn't like null source files.)
+ */
+
+/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */
+
+/* Capability options common to encoder and decoder: */
+
+#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */
+#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */
+#undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */
+
+/* Encoder capability options: */
+
+#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
+/* Note: if you selected 12-bit data precision, it is dangerous to turn off
+ * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
+ * precision, so jchuff.c normally uses entropy optimization to compute
+ * usable tables for higher precision. If you don't want to do optimization,
+ * you'll have to supply different default Huffman tables.
+ * The exact same statements apply for progressive JPEG: the default tables
+ * don't work for progressive mode. (This may get fixed, however.)
+ */
+#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */
+
+/* Decoder capability options: */
+
+#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
+#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
+#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
+#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
+#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
+#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
+#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
+#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */
+#undef QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */
+#undef QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */
+
+/* more capability options later, no doubt */
+
+
+/*
+ * Ordering of RGB data in scanlines passed to or from the application.
+ * If your application wants to deal with data in the order B,G,R, just
+ * change these macros. You can also deal with formats such as R,G,B,X
+ * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing
+ * the offsets will also change the order in which colormap data is organized.
+ * RESTRICTIONS:
+ * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
+ * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
+ * useful if you are using JPEG color spaces other than YCbCr or grayscale.
+ * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ * is not 3 (they don't understand about dummy color components!). So you
+ * can't use color quantization if you change that value.
+ */
+
+#define RGB_RED 0 /* Offset of Red in an RGB scanline element */
+#define RGB_GREEN 1 /* Offset of Green */
+#define RGB_BLUE 2 /* Offset of Blue */
+#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */
+
+
+/* Definitions for speed-related optimizations. */
+
+
+/* If your compiler supports inline functions, define INLINE
+ * as the inline keyword; otherwise define it as empty.
+ */
+
+#ifndef INLINE
+#ifdef __GNUC__ /* for instance, GNU C knows about inline */
+#define INLINE __inline__
+#endif
+#ifndef INLINE
+#define INLINE /* default is to define it as empty */
+#endif
+#endif
+
+
+/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying
+ * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER
+ * as short on such a machine. MULTIPLIER must be at least 16 bits wide.
+ */
+
+#ifndef MULTIPLIER
+#define MULTIPLIER int /* type for fastest integer multiply */
+#endif
+
+
+/* FAST_FLOAT should be either float or double, whichever is done faster
+ * by your compiler. (Note that this type is only used in the floating point
+ * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.)
+ * Typically, float is faster in ANSI C compilers, while double is faster in
+ * pre-ANSI compilers (because they insist on converting to double anyway).
+ * The code below therefore chooses float if we have ANSI-style prototypes.
+ */
+
+#ifndef FAST_FLOAT
+#ifdef HAVE_PROTOTYPES
+#define FAST_FLOAT float
+#else
+#define FAST_FLOAT double
+#endif
+#endif
+
+#endif /* JPEG_INTERNAL_OPTIONS */
diff --git a/core/src/fxcodec/libjpeg/jpegint.h b/core/src/fxcodec/libjpeg/jpegint.h
new file mode 100644
index 0000000000..685a3610b2
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jpegint.h
@@ -0,0 +1,392 @@
+/*
+ * jpegint.h
+ *
+ * Copyright (C) 1991-1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file provides common declarations for the various JPEG modules.
+ * These declarations are considered internal to the JPEG library; most
+ * applications using the library shouldn't need to include this file.
+ */
+
+
+/* Declarations for both compression & decompression */
+
+typedef enum { /* Operating modes for buffer controllers */
+ JBUF_PASS_THRU, /* Plain stripwise operation */
+ /* Remaining modes require a full-image buffer to have been created */
+ JBUF_SAVE_SOURCE, /* Run source subobject only, save output */
+ JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */
+ JBUF_SAVE_AND_PASS /* Run both subobjects, save output */
+} J_BUF_MODE;
+
+/* Values of global_state field (jdapi.c has some dependencies on ordering!) */
+#define CSTATE_START 100 /* after create_compress */
+#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */
+#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */
+#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */
+#define DSTATE_START 200 /* after create_decompress */
+#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */
+#define DSTATE_READY 202 /* found SOS, ready for start_decompress */
+#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/
+#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */
+#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */
+#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */
+#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */
+#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */
+#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */
+#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */
+
+
+/* Declarations for compression modules */
+
+/* Master control module */
+struct jpeg_comp_master {
+ JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, pass_startup, (j_compress_ptr cinfo));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean call_pass_startup; /* True if pass_startup must be called */
+ boolean is_last_pass; /* True during last pass */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_c_main_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail));
+};
+
+/* Compression preprocessing (downsampling input buffer control) */
+struct jpeg_c_prep_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, pre_process_data, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf,
+ JDIMENSION *in_row_ctr,
+ JDIMENSION in_rows_avail,
+ JSAMPIMAGE output_buf,
+ JDIMENSION *out_row_group_ctr,
+ JDIMENSION out_row_groups_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_c_coef_controller {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(boolean, compress_data, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf));
+};
+
+/* Colorspace conversion */
+struct jpeg_color_converter {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows));
+};
+
+/* Downsampling */
+struct jpeg_downsampler {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ JMETHOD(void, downsample, (j_compress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION in_row_index,
+ JSAMPIMAGE output_buf,
+ JDIMENSION out_row_group_index));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Forward DCT (also controls coefficient quantization) */
+struct jpeg_forward_dct {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo));
+ /* perhaps this should be an array??? */
+ JMETHOD(void, forward_DCT, (j_compress_ptr cinfo,
+ jpeg_component_info * compptr,
+ JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
+ JDIMENSION start_row, JDIMENSION start_col,
+ JDIMENSION num_blocks));
+};
+
+/* Entropy encoding */
+struct jpeg_entropy_encoder {
+ JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics));
+ JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_compress_ptr cinfo));
+};
+
+/* Marker writing */
+struct jpeg_marker_writer {
+ JMETHOD(void, write_file_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_frame_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_scan_header, (j_compress_ptr cinfo));
+ JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo));
+ JMETHOD(void, write_tables_only, (j_compress_ptr cinfo));
+ /* These routines are exported to allow insertion of extra markers */
+ /* Probably only COM and APPn markers should be written this way */
+ JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker,
+ unsigned int datalen));
+ JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val));
+};
+
+
+/* Declarations for decompression modules */
+
+/* Master control module */
+struct jpeg_decomp_master {
+ JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */
+};
+
+/* Input control module */
+struct jpeg_input_controller {
+ JMETHOD(int, consume_input, (j_decompress_ptr cinfo));
+ JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo));
+
+ /* State variables made visible to other modules */
+ boolean has_multiple_scans; /* True if file has multiple scans */
+ boolean eoi_reached; /* True when EOI has been consumed */
+};
+
+/* Main buffer control (downsampled-data buffer) */
+struct jpeg_d_main_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, process_data, (j_decompress_ptr cinfo,
+ JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Coefficient buffer control */
+struct jpeg_d_coef_controller {
+ JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, consume_data, (j_decompress_ptr cinfo));
+ JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo));
+ JMETHOD(int, decompress_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE output_buf));
+ /* Pointer to array of coefficient virtual arrays, or NULL if none */
+ jvirt_barray_ptr *coef_arrays;
+};
+
+/* Decompression postprocessing (color quantization buffer control) */
+struct jpeg_d_post_controller {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode));
+ JMETHOD(void, post_process_data, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+};
+
+/* Marker reading & parsing */
+struct jpeg_marker_reader {
+ JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo));
+ /* Read markers until SOS or EOI.
+ * Returns same codes as are defined for jpeg_consume_input:
+ * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
+ */
+ JMETHOD(int, read_markers, (j_decompress_ptr cinfo));
+ /* Read a restart marker --- exported for use by entropy decoder only */
+ jpeg_marker_parser_method read_restart_marker;
+
+ /* State of marker reader --- nominally internal, but applications
+ * supplying COM or APPn handlers might like to know the state.
+ */
+ boolean saw_SOI; /* found SOI? */
+ boolean saw_SOF; /* found SOF? */
+ int next_restart_num; /* next restart number expected (0-7) */
+ unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */
+};
+
+/* Entropy decoding */
+struct jpeg_entropy_decoder {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
+ JBLOCKROW *MCU_data));
+
+ /* This is here to share code between baseline and progressive decoders; */
+ /* other modules probably should not use it */
+ boolean insufficient_data; /* set TRUE after emitting warning */
+};
+
+/* Inverse DCT (also performs dequantization) */
+typedef JMETHOD(void, inverse_DCT_method_ptr,
+ (j_decompress_ptr cinfo, jpeg_component_info * compptr,
+ JCOEFPTR coef_block,
+ JSAMPARRAY output_buf, JDIMENSION output_col));
+
+struct jpeg_inverse_dct {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ /* It is useful to allow each component to have a separate IDCT method. */
+ inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS];
+};
+
+/* Upsampling (note that upsampler must also call color converter) */
+struct jpeg_upsampler {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, upsample, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf,
+ JDIMENSION *in_row_group_ctr,
+ JDIMENSION in_row_groups_avail,
+ JSAMPARRAY output_buf,
+ JDIMENSION *out_row_ctr,
+ JDIMENSION out_rows_avail));
+
+ boolean need_context_rows; /* TRUE if need rows above & below */
+};
+
+/* Colorspace conversion */
+struct jpeg_color_deconverter {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, color_convert, (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows));
+};
+
+/* Color quantization or color precision reduction */
+struct jpeg_color_quantizer {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan));
+ JMETHOD(void, color_quantize, (j_decompress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPARRAY output_buf,
+ int num_rows));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
+ JMETHOD(void, new_color_map, (j_decompress_ptr cinfo));
+};
+
+
+/* Miscellaneous useful macros */
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#undef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+
+
+/* We assume that right shift corresponds to signed division by 2 with
+ * rounding towards minus infinity. This is correct for typical "arithmetic
+ * shift" instructions that shift in copies of the sign bit. But some
+ * C compilers implement >> with an unsigned shift. For these machines you
+ * must define RIGHT_SHIFT_IS_UNSIGNED.
+ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity.
+ * It is only applied with constant shift counts. SHIFT_TEMPS must be
+ * included in the variables of any routine using RIGHT_SHIFT.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define SHIFT_TEMPS INT32 shift_temp;
+#define RIGHT_SHIFT(x,shft) \
+ ((shift_temp = (x)) < 0 ? \
+ (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \
+ (shift_temp >> (shft)))
+#else
+#define SHIFT_TEMPS
+#define RIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jinit_compress_master jICompress
+#define jinit_c_master_control jICMaster
+#define jinit_c_main_controller jICMainC
+#define jinit_c_prep_controller jICPrepC
+#define jinit_c_coef_controller jICCoefC
+#define jinit_color_converter jICColor
+#define jinit_downsampler jIDownsampler
+#define jinit_forward_dct jIFDCT
+#define jinit_huff_encoder jIHEncoder
+#define jinit_phuff_encoder jIPHEncoder
+#define jinit_marker_writer jIMWriter
+#define jinit_master_decompress jIDMaster
+#define jinit_d_main_controller jIDMainC
+#define jinit_d_coef_controller jIDCoefC
+#define jinit_d_post_controller jIDPostC
+#define jinit_input_controller jIInCtlr
+#define jinit_marker_reader jIMReader
+#define jinit_huff_decoder jIHDecoder
+#define jinit_phuff_decoder jIPHDecoder
+#define jinit_inverse_dct jIIDCT
+#define jinit_upsampler jIUpsampler
+#define jinit_color_deconverter jIDColor
+#define jinit_1pass_quantizer jI1Quant
+#define jinit_2pass_quantizer jI2Quant
+#define jinit_merged_upsampler jIMUpsampler
+#define jinit_memory_mgr jIMemMgr
+#define jdiv_round_up jDivRound
+#define jround_up jRound
+#define jcopy_sample_rows jCopySamples
+#define jcopy_block_row jCopyBlocks
+#define jzero_far jZeroFar
+#define jpeg_zigzag_order jZIGTable
+#define jpeg_natural_order jZAGTable
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Compression module initialization routines */
+EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
+ boolean transcode_only));
+EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
+EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
+/* Decompression module initialization routines */
+EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo,
+ boolean need_full_buffer));
+EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo));
+EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo));
+/* Memory manager initialization */
+EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo));
+
+/* Utility routines in jutils.c */
+EXTERN(long) jdiv_round_up JPP((long a, long b));
+EXTERN(long) jround_up JPP((long a, long b));
+EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
+ JSAMPARRAY output_array, int dest_row,
+ int num_rows, JDIMENSION num_cols));
+EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
+ JDIMENSION num_blocks));
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+/* Constant tables in jutils.c */
+#if 0 /* This table is not actually needed in v6a */
+extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
+#endif
+extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
+
+/* Suppress undefined-structure complaints if necessary. */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+#endif
+#endif /* INCOMPLETE_TYPES_BROKEN */
diff --git a/core/src/fxcodec/libjpeg/jpeglib.h b/core/src/fxcodec/libjpeg/jpeglib.h
new file mode 100644
index 0000000000..ac2aff90fd
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jpeglib.h
@@ -0,0 +1,1165 @@
+/*
+ * jpeglib.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file defines the application interface for the JPEG library.
+ * Most applications using the library need only include this file,
+ * and perhaps jerror.h if they want to know the exact error codes.
+ */
+
+#ifndef JPEGLIB_H
+#define JPEGLIB_H
+
+#define FOXIT_PREFIX(origName) FPDFAPIJPEG_##origName
+
+#define jcopy_block_row FOXIT_PREFIX(jcopy_block_row)
+#define jcopy_sample_rows FOXIT_PREFIX(jcopy_sample_rows)
+#define jdiv_round_up FOXIT_PREFIX(jdiv_round_up)
+#define jinit_1pass_quantizer FOXIT_PREFIX(jinit_1pass_quantizer)
+#define jinit_2pass_quantizer FOXIT_PREFIX(jinit_2pass_quantizer)
+#define jinit_color_deconverter FOXIT_PREFIX(jinit_color_deconverter)
+#define jinit_d_coef_controller FOXIT_PREFIX(jinit_d_coef_controller)
+#define jinit_d_main_controller FOXIT_PREFIX(jinit_d_main_controller)
+#define jinit_d_post_controller FOXIT_PREFIX(jinit_d_post_controller)
+#define jinit_huff_decoder FOXIT_PREFIX(jinit_huff_decoder)
+#define jinit_input_controller FOXIT_PREFIX(jinit_input_controller)
+#define jinit_inverse_dct FOXIT_PREFIX(jinit_inverse_dct)
+#define jinit_marker_reader FOXIT_PREFIX(jinit_marker_reader)
+#define jinit_master_decompress FOXIT_PREFIX(jinit_master_decompress)
+#define jinit_memory_mgr FOXIT_PREFIX(jinit_memory_mgr)
+#define jinit_merged_upsampler FOXIT_PREFIX(jinit_merged_upsampler)
+#define jinit_phuff_decoder FOXIT_PREFIX(jinit_phuff_decoder)
+#define jinit_upsampler FOXIT_PREFIX(jinit_upsampler)
+#define jpeg_CreateDecompress FOXIT_PREFIX(jpeg_CreateDecompress)
+#define jpeg_abort FOXIT_PREFIX(jpeg_abort)
+#define jpeg_abort_decompress FOXIT_PREFIX(jpeg_abort_decompress)
+#define jpeg_alloc_huff_table FOXIT_PREFIX(jpeg_alloc_huff_table)
+#define jpeg_alloc_quant_table FOXIT_PREFIX(jpeg_alloc_quant_table)
+#define jpeg_calc_output_dimensions FOXIT_PREFIX(jpeg_calc_output_dimensions)
+#define jpeg_consume_input FOXIT_PREFIX(jpeg_consume_input)
+#define jpeg_destroy FOXIT_PREFIX(jpeg_destroy)
+#define jpeg_destroy_decompress FOXIT_PREFIX(jpeg_destroy_decompress)
+#define jpeg_fill_bit_buffer FOXIT_PREFIX(jpeg_fill_bit_buffer)
+#define jpeg_finish_decompress FOXIT_PREFIX(jpeg_finish_decompress)
+#define jpeg_finish_output FOXIT_PREFIX(jpeg_finish_output)
+#define jpeg_free_large FOXIT_PREFIX(jpeg_free_large)
+#define jpeg_free_small FOXIT_PREFIX(jpeg_free_small)
+#define jpeg_get_large FOXIT_PREFIX(jpeg_get_large)
+#define jpeg_get_small FOXIT_PREFIX(jpeg_get_small)
+#define jpeg_has_multiple_scans FOXIT_PREFIX(jpeg_has_multiple_scans)
+#define jpeg_huff_decode FOXIT_PREFIX(jpeg_huff_decode)
+#define jpeg_idct_1x1 FOXIT_PREFIX(jpeg_idct_1x1)
+#define jpeg_idct_2x2 FOXIT_PREFIX(jpeg_idct_2x2)
+#define jpeg_idct_4x4 FOXIT_PREFIX(jpeg_idct_4x4)
+#define jpeg_idct_float FOXIT_PREFIX(jpeg_idct_float)
+#define jpeg_idct_ifast FOXIT_PREFIX(jpeg_idct_ifast)
+#define jpeg_idct_islow FOXIT_PREFIX(jpeg_idct_islow)
+#define jpeg_input_complete FOXIT_PREFIX(jpeg_input_complete)
+#define jpeg_make_d_derived_tbl FOXIT_PREFIX(jpeg_make_d_derived_tbl)
+#define jpeg_mem_available FOXIT_PREFIX(jpeg_mem_available)
+#define jpeg_mem_init FOXIT_PREFIX(jpeg_mem_init)
+#define jpeg_mem_term FOXIT_PREFIX(jpeg_mem_term)
+#define jpeg_natural_order FOXIT_PREFIX(jpeg_natural_order)
+#define jpeg_new_colormap FOXIT_PREFIX(jpeg_new_colormap)
+#define jpeg_open_backing_store FOXIT_PREFIX(jpeg_open_backing_store)
+#define jpeg_read_coefficients FOXIT_PREFIX(jpeg_read_coefficients)
+#define jpeg_read_header FOXIT_PREFIX(jpeg_read_header)
+#define jpeg_read_raw_data FOXIT_PREFIX(jpeg_read_raw_data)
+#define jpeg_read_scanlines FOXIT_PREFIX(jpeg_read_scanlines)
+#define jpeg_resync_to_restart FOXIT_PREFIX(jpeg_resync_to_restart)
+#define jpeg_save_markers FOXIT_PREFIX(jpeg_save_markers)
+#define jpeg_set_marker_processor FOXIT_PREFIX(jpeg_set_marker_processor)
+#define jpeg_start_decompress FOXIT_PREFIX(jpeg_start_decompress)
+#define jpeg_start_output FOXIT_PREFIX(jpeg_start_output)
+#define jpeg_std_error FOXIT_PREFIX(jpeg_std_error)
+#define jpeg_std_message_table FOXIT_PREFIX(jpeg_std_message_table)
+#define jpeg_stdio_src FOXIT_PREFIX(jpeg_stdio_src)
+#define jround_up FOXIT_PREFIX(jround_up)
+#define jzero_far FOXIT_PREFIX(jzero_far)
+
+ /*
+ * First we include the configuration files that record how this
+ * installation of the JPEG library is set up. jconfig.h can be
+ * generated automatically for many systems. jmorecfg.h contains
+ * manual configuration options that most people need not worry about.
+ */
+
+#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */
+#include "jconfig.h" /* widely used configuration options */
+#endif
+#include "jmorecfg.h" /* seldom changed options */
+
+
+/* Version ID for the JPEG library.
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60".
+ */
+
+#define JPEG_LIB_VERSION 62 /* Version 6b */
+
+
+/* Various constants determining the sizes of things.
+ * All of these are specified by the JPEG standard, so don't change them
+ * if you want to be compatible.
+ */
+
+#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
+#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
+#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
+#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
+#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */
+#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */
+#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */
+/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard;
+ * the PostScript DCT filter can emit files with many more than 10 blocks/MCU.
+ * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU
+ * to handle it. We even let you do this from the jconfig.h file. However,
+ * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe
+ * sometimes emits noncompliant files doesn't mean you should too.
+ */
+#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */
+#ifndef D_MAX_BLOCKS_IN_MCU
+#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */
+#endif
+
+
+/* Data structures for images (arrays of samples and of DCT coefficients).
+ * On 80x86 machines, the image arrays are too big for near pointers,
+ * but the pointer arrays can fit in near memory.
+ */
+
+typedef JSAMPLE *JSAMPROW; /* ptr to one image row of pixel samples. */
+typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */
+typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */
+
+typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */
+typedef JBLOCK *JBLOCKROW; /* pointer to one row of coefficient blocks */
+typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */
+typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */
+
+typedef JCOEF *JCOEFPTR; /* useful in a couple of places */
+
+
+/* Types for JPEG compression parameters and working tables. */
+
+
+/* DCT coefficient quantization tables. */
+
+typedef struct {
+ /* This array gives the coefficient quantizers in natural array order
+ * (not the zigzag order in which they are stored in a JPEG DQT marker).
+ * CAUTION: IJG versions prior to v6a kept this array in zigzag order.
+ */
+ UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JQUANT_TBL;
+
+
+/* Huffman coding tables. */
+
+typedef struct {
+ /* These two fields directly represent the contents of a JPEG DHT marker */
+ UINT8 bits[17]; /* bits[k] = # of symbols with codes of */
+ /* length k bits; bits[0] is unused */
+ UINT8 huffval[256]; /* The symbols, in order of incr code length */
+ /* This field is used only during compression. It's initialized FALSE when
+ * the table is created, and set TRUE when it's been output to the file.
+ * You could suppress output of a table by setting this to TRUE.
+ * (See jpeg_suppress_tables for an example.)
+ */
+ boolean sent_table; /* TRUE when table has been output */
+} JHUFF_TBL;
+
+
+/* Basic info about one component (color channel). */
+
+typedef struct {
+ /* These values are fixed over the whole image. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOF marker. */
+ int component_id; /* identifier for this component (0..255) */
+ int component_index; /* its index in SOF or cinfo->comp_info[] */
+ int h_samp_factor; /* horizontal sampling factor (1..4) */
+ int v_samp_factor; /* vertical sampling factor (1..4) */
+ int quant_tbl_no; /* quantization table selector (0..3) */
+ /* These values may vary between scans. */
+ /* For compression, they must be supplied by parameter setup; */
+ /* for decompression, they are read from the SOS marker. */
+ /* The decompressor output side may not use these variables. */
+ int dc_tbl_no; /* DC entropy table selector (0..3) */
+ int ac_tbl_no; /* AC entropy table selector (0..3) */
+
+ /* Remaining fields should be treated as private by applications. */
+
+ /* These values are computed during compression or decompression startup: */
+ /* Component's size in DCT blocks.
+ * Any dummy blocks added to complete an MCU are not counted; therefore
+ * these values do not depend on whether a scan is interleaved or not.
+ */
+ JDIMENSION width_in_blocks;
+ JDIMENSION height_in_blocks;
+ /* Size of a DCT block in samples. Always DCTSIZE for compression.
+ * For decompression this is the size of the output from one DCT block,
+ * reflecting any scaling we choose to apply during the IDCT step.
+ * Values of 1,2,4,8 are likely to be supported. Note that different
+ * components may receive different IDCT scalings.
+ */
+ int DCT_scaled_size;
+ /* The downsampled dimensions are the component's actual, unpadded number
+ * of samples at the main buffer (preprocessing/compression interface), thus
+ * downsampled_width = ceil(image_width * Hi/Hmax)
+ * and similarly for height. For decompression, IDCT scaling is included, so
+ * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE)
+ */
+ JDIMENSION downsampled_width; /* actual width in samples */
+ JDIMENSION downsampled_height; /* actual height in samples */
+ /* This flag is used only for decompression. In cases where some of the
+ * components will be ignored (eg grayscale output from YCbCr image),
+ * we can skip most computations for the unused components.
+ */
+ boolean component_needed; /* do we need the value of this component? */
+
+ /* These values are computed before starting a scan of the component. */
+ /* The decompressor output side may not use these variables. */
+ int MCU_width; /* number of blocks per MCU, horizontally */
+ int MCU_height; /* number of blocks per MCU, vertically */
+ int MCU_blocks; /* MCU_width * MCU_height */
+ int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */
+ int last_col_width; /* # of non-dummy blocks across in last MCU */
+ int last_row_height; /* # of non-dummy blocks down in last MCU */
+
+ /* Saved quantization table for component; NULL if none yet saved.
+ * See jdinput.c comments about the need for this information.
+ * This field is currently used only for decompression.
+ */
+ JQUANT_TBL * quant_table;
+
+ /* Private per-component storage for DCT or IDCT subsystem. */
+ void * dct_table;
+} jpeg_component_info;
+
+
+/* The script for encoding a multiple-scan file is an array of these: */
+
+typedef struct {
+ int comps_in_scan; /* number of components encoded in this scan */
+ int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */
+ int Ss, Se; /* progressive JPEG spectral selection parms */
+ int Ah, Al; /* progressive JPEG successive approx. parms */
+} jpeg_scan_info;
+
+/* The decompressor can save APPn and COM markers in a list of these: */
+
+typedef struct jpeg_marker_struct * jpeg_saved_marker_ptr;
+
+struct jpeg_marker_struct {
+ jpeg_saved_marker_ptr next; /* next in list, or NULL */
+ UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */
+ unsigned int original_length; /* # bytes of data in the file */
+ unsigned int data_length; /* # bytes of data saved at data[] */
+ JOCTET * data; /* the data contained in the marker */
+ /* the marker length word is not counted in data_length or original_length */
+};
+
+/* Known color spaces. */
+
+typedef enum {
+ JCS_UNKNOWN, /* error/unspecified */
+ JCS_GRAYSCALE, /* monochrome */
+ JCS_RGB, /* red/green/blue */
+ JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
+ JCS_CMYK, /* C/M/Y/K */
+ JCS_YCCK /* Y/Cb/Cr/K */
+} J_COLOR_SPACE;
+
+/* DCT/IDCT algorithm options. */
+
+typedef enum {
+ JDCT_ISLOW, /* slow but accurate integer algorithm */
+ JDCT_IFAST, /* faster, less accurate integer method */
+ JDCT_FLOAT /* floating-point: accurate, fast on fast HW */
+} J_DCT_METHOD;
+
+#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */
+#define JDCT_DEFAULT JDCT_ISLOW
+#endif
+#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */
+#define JDCT_FASTEST JDCT_IFAST
+#endif
+
+/* Dithering options for decompression. */
+
+typedef enum {
+ JDITHER_NONE, /* no dithering */
+ JDITHER_ORDERED, /* simple ordered dither */
+ JDITHER_FS /* Floyd-Steinberg error diffusion dither */
+} J_DITHER_MODE;
+
+
+/* Common fields between JPEG compression and decompression master structs. */
+
+#define jpeg_common_fields \
+ struct jpeg_error_mgr * err; /* Error handler module */\
+ struct jpeg_memory_mgr * mem; /* Memory manager module */\
+ struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\
+ void * client_data; /* Available for use by application */\
+ boolean is_decompressor; /* So common code can tell which is which */\
+ int global_state /* For checking call sequence validity */
+
+/* Routines that are to be used by both halves of the library are declared
+ * to receive a pointer to this structure. There are no actual instances of
+ * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct.
+ */
+struct jpeg_common_struct {
+ jpeg_common_fields; /* Fields common to both master struct types */
+ /* Additional fields follow in an actual jpeg_compress_struct or
+ * jpeg_decompress_struct. All three structs must agree on these
+ * initial fields! (This would be a lot cleaner in C++.)
+ */
+};
+
+typedef struct jpeg_common_struct * j_common_ptr;
+typedef struct jpeg_compress_struct * j_compress_ptr;
+typedef struct jpeg_decompress_struct * j_decompress_ptr;
+
+
+/* Master record for a compression instance */
+
+struct jpeg_compress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */
+
+ /* Destination for compressed data */
+ struct jpeg_destination_mgr * dest;
+
+ /* Description of source image --- these fields must be filled in by
+ * outer application before starting compression. in_color_space must
+ * be correct before you can even call jpeg_set_defaults().
+ */
+
+ JDIMENSION image_width; /* input image width */
+ JDIMENSION image_height; /* input image height */
+ int input_components; /* # of color components in input image */
+ J_COLOR_SPACE in_color_space; /* colorspace of input image */
+
+ double input_gamma; /* image gamma of input image */
+
+ /* Compression parameters --- these fields must be set before calling
+ * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to
+ * initialize everything to reasonable defaults, then changing anything
+ * the application specifically wants to change. That way you won't get
+ * burnt when new parameters are added. Also note that there are several
+ * helper routines to simplify changing parameters.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ int num_scans; /* # of entries in scan_info array */
+ const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */
+ /* The default value of scan_info is NULL, which causes a single-scan
+ * sequential JPEG file to be emitted. To create a multi-scan file,
+ * set num_scans and scan_info to point to an array of scan definitions.
+ */
+
+ boolean raw_data_in; /* TRUE=caller supplies downsampled data */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+ boolean optimize_coding; /* TRUE=optimize entropy encoding parms */
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+ int smoothing_factor; /* 1..100, or 0 for no input smoothing */
+ J_DCT_METHOD dct_method; /* DCT algorithm selector */
+
+ /* The restart interval can be specified in absolute MCUs by setting
+ * restart_interval, or in MCU rows by setting restart_in_rows
+ * (in which case the correct restart_interval will be figured
+ * for each scan).
+ */
+ unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */
+ int restart_in_rows; /* if > 0, MCU rows per restart interval */
+
+ /* Parameters controlling emission of special markers. */
+
+ boolean write_JFIF_header; /* should a JFIF marker be written? */
+ UINT8 JFIF_major_version; /* What to write for the JFIF version number */
+ UINT8 JFIF_minor_version;
+ /* These three values are not used by the JPEG code, merely copied */
+ /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */
+ /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */
+ /* ratio is defined by X_density/Y_density even when density_unit=0. */
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean write_Adobe_marker; /* should an Adobe marker be written? */
+
+ /* State variable: index of next scanline to be written to
+ * jpeg_write_scanlines(). Application may use this to control its
+ * processing loop, e.g., "while (next_scanline < image_height)".
+ */
+
+ JDIMENSION next_scanline; /* 0 .. image_height-1 */
+
+ /* Remaining fields are known throughout compressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during compression startup
+ */
+ boolean progressive_mode; /* TRUE if scan script uses progressive mode */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */
+ /* The coefficient controller receives data in units of MCU rows as defined
+ * for fully interleaved scans (whether the JPEG file is interleaved or not).
+ * There are v_samp_factor * DCTSIZE sample rows of each component in an
+ * "iMCU" (interleaved MCU) row.
+ */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[C_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /*
+ * Links to compression subobjects (methods and private variables of modules)
+ */
+ struct jpeg_comp_master * master;
+ struct jpeg_c_main_controller * main;
+ struct jpeg_c_prep_controller * prep;
+ struct jpeg_c_coef_controller * coef;
+ struct jpeg_marker_writer * marker;
+ struct jpeg_color_converter * cconvert;
+ struct jpeg_downsampler * downsample;
+ struct jpeg_forward_dct * fdct;
+ struct jpeg_entropy_encoder * entropy;
+ jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */
+ int script_space_size;
+};
+
+
+/* Master record for a decompression instance */
+
+struct jpeg_decompress_struct {
+ jpeg_common_fields; /* Fields shared with jpeg_compress_struct */
+
+ /* Source of compressed data */
+ struct jpeg_source_mgr * src;
+
+ /* Basic description of image --- filled in by jpeg_read_header(). */
+ /* Application may inspect these values to decide how to process image. */
+
+ JDIMENSION image_width; /* nominal image width (from SOF marker) */
+ JDIMENSION image_height; /* nominal image height */
+ int num_components; /* # of color components in JPEG image */
+ J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */
+
+ /* Decompression processing parameters --- these fields must be set before
+ * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes
+ * them to default values.
+ */
+
+ J_COLOR_SPACE out_color_space; /* colorspace for output */
+
+ unsigned int scale_num, scale_denom; /* fraction by which to scale image */
+
+ double output_gamma; /* image gamma wanted in output */
+
+ boolean buffered_image; /* TRUE=multiple output passes */
+ boolean raw_data_out; /* TRUE=downsampled data wanted */
+
+ J_DCT_METHOD dct_method; /* IDCT algorithm selector */
+ boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */
+ boolean do_block_smoothing; /* TRUE=apply interblock smoothing */
+
+ boolean quantize_colors; /* TRUE=colormapped output wanted */
+ /* the following are ignored if not quantize_colors: */
+ J_DITHER_MODE dither_mode; /* type of color dithering to use */
+ boolean two_pass_quantize; /* TRUE=use two-pass color quantization */
+ int desired_number_of_colors; /* max # colors to use in created colormap */
+ /* these are significant only in buffered-image mode: */
+ boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */
+ boolean enable_external_quant;/* enable future use of external colormap */
+ boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */
+
+ /* Description of actual output image that will be returned to application.
+ * These fields are computed by jpeg_start_decompress().
+ * You can also use jpeg_calc_output_dimensions() to determine these values
+ * in advance of calling jpeg_start_decompress().
+ */
+
+ JDIMENSION output_width; /* scaled image width */
+ JDIMENSION output_height; /* scaled image height */
+ int out_color_components; /* # of color components in out_color_space */
+ int output_components; /* # of color components returned */
+ /* output_components is 1 (a colormap index) when quantizing colors;
+ * otherwise it equals out_color_components.
+ */
+ int rec_outbuf_height; /* min recommended height of scanline buffer */
+ /* If the buffer passed to jpeg_read_scanlines() is less than this many rows
+ * high, space and time will be wasted due to unnecessary data copying.
+ * Usually rec_outbuf_height will be 1 or 2, at most 4.
+ */
+
+ /* When quantizing colors, the output colormap is described by these fields.
+ * The application can supply a colormap by setting colormap non-NULL before
+ * calling jpeg_start_decompress; otherwise a colormap is created during
+ * jpeg_start_decompress or jpeg_start_output.
+ * The map has out_color_components rows and actual_number_of_colors columns.
+ */
+ int actual_number_of_colors; /* number of entries in use */
+ JSAMPARRAY colormap; /* The color map as a 2-D pixel array */
+
+ /* State variables: these variables indicate the progress of decompression.
+ * The application may examine these but must not modify them.
+ */
+
+ /* Row index of next scanline to be read from jpeg_read_scanlines().
+ * Application may use this to control its processing loop, e.g.,
+ * "while (output_scanline < output_height)".
+ */
+ JDIMENSION output_scanline; /* 0 .. output_height-1 */
+
+ /* Current input scan number and number of iMCU rows completed in scan.
+ * These indicate the progress of the decompressor input side.
+ */
+ int input_scan_number; /* Number of SOS markers seen so far */
+ JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */
+
+ /* The "output scan number" is the notional scan being displayed by the
+ * output side. The decompressor will not allow output scan/row number
+ * to get ahead of input scan/row, but it can fall arbitrarily far behind.
+ */
+ int output_scan_number; /* Nominal scan number being displayed */
+ JDIMENSION output_iMCU_row; /* Number of iMCU rows read */
+
+ /* Current progression status. coef_bits[c][i] indicates the precision
+ * with which component c's DCT coefficient i (in zigzag order) is known.
+ * It is -1 when no data has yet been received, otherwise it is the point
+ * transform (shift) value for the most recent scan of the coefficient
+ * (thus, 0 at completion of the progression).
+ * This pointer is NULL when reading a non-progressive file.
+ */
+ int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */
+
+ /* Internal JPEG parameters --- the application usually need not look at
+ * these fields. Note that the decompressor output side may not use
+ * any parameters that can change between scans.
+ */
+
+ /* Quantization and Huffman tables are carried forward across input
+ * datastreams when processing abbreviated JPEG datastreams.
+ */
+
+ JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS];
+ /* ptrs to coefficient quantization tables, or NULL if not defined */
+
+ JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
+ /* ptrs to Huffman coding tables, or NULL if not defined */
+
+ /* These parameters are never carried across datastreams, since they
+ * are given in SOF/SOS markers or defined to be reset by SOI.
+ */
+
+ int data_precision; /* bits of precision in image data */
+
+ jpeg_component_info * comp_info;
+ /* comp_info[i] describes component that appears i'th in SOF */
+
+ boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
+ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
+
+ UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */
+ UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */
+ UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */
+
+ unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */
+
+ /* These fields record data obtained from optional markers recognized by
+ * the JPEG library.
+ */
+ boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */
+ /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */
+ UINT8 JFIF_major_version; /* JFIF version number */
+ UINT8 JFIF_minor_version;
+ UINT8 density_unit; /* JFIF code for pixel size units */
+ UINT16 X_density; /* Horizontal pixel density */
+ UINT16 Y_density; /* Vertical pixel density */
+ boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
+ UINT8 Adobe_transform; /* Color transform code from Adobe marker */
+
+ boolean CCIR601_sampling; /* TRUE=first samples are cosited */
+
+ /* Aside from the specific data retained from APPn markers known to the
+ * library, the uninterpreted contents of any or all APPn and COM markers
+ * can be saved in a list for examination by the application.
+ */
+ jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */
+
+ /* Remaining fields are known throughout decompressor, but generally
+ * should not be touched by a surrounding application.
+ */
+
+ /*
+ * These fields are computed during decompression startup
+ */
+ int max_h_samp_factor; /* largest h_samp_factor */
+ int max_v_samp_factor; /* largest v_samp_factor */
+
+ int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */
+
+ JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */
+ /* The coefficient controller's input and output progress is measured in
+ * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows
+ * in fully interleaved JPEG scans, but are used whether the scan is
+ * interleaved or not. We define an iMCU row as v_samp_factor DCT block
+ * rows of each component. Therefore, the IDCT output contains
+ * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row.
+ */
+
+ JSAMPLE * sample_range_limit; /* table for fast range-limiting */
+
+ /*
+ * These fields are valid during any one scan.
+ * They describe the components and MCUs actually appearing in the scan.
+ * Note that the decompressor output side must not use these fields.
+ */
+ int comps_in_scan; /* # of JPEG components in this scan */
+ jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN];
+ /* *cur_comp_info[i] describes component that appears i'th in SOS */
+
+ JDIMENSION MCUs_per_row; /* # of MCUs across the image */
+ JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */
+
+ int blocks_in_MCU; /* # of DCT blocks per MCU */
+ int MCU_membership[D_MAX_BLOCKS_IN_MCU];
+ /* MCU_membership[i] is index in cur_comp_info of component owning */
+ /* i'th block in an MCU */
+
+ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
+
+ /* This field is shared between entropy decoder and marker parser.
+ * It is either zero or the code of a JPEG marker that has been
+ * read from the data source, but has not yet been processed.
+ */
+ int unread_marker;
+
+ /*
+ * Links to decompression subobjects (methods, private variables of modules)
+ */
+ struct jpeg_decomp_master * master;
+ struct jpeg_d_main_controller * main;
+ struct jpeg_d_coef_controller * coef;
+ struct jpeg_d_post_controller * post;
+ struct jpeg_input_controller * inputctl;
+ struct jpeg_marker_reader * marker;
+ struct jpeg_entropy_decoder * entropy;
+ struct jpeg_inverse_dct * idct;
+ struct jpeg_upsampler * upsample;
+ struct jpeg_color_deconverter * cconvert;
+ struct jpeg_color_quantizer * cquantize;
+};
+
+
+/* "Object" declarations for JPEG modules that may be supplied or called
+ * directly by the surrounding application.
+ * As with all objects in the JPEG library, these structs only define the
+ * publicly visible methods and state variables of a module. Additional
+ * private fields may exist after the public ones.
+ */
+
+
+/* Error handler object */
+
+struct jpeg_error_mgr {
+ /* Error exit handler: does not return to caller */
+ JMETHOD(void, error_exit, (j_common_ptr cinfo));
+ /* Conditionally emit a trace or warning message */
+ JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
+ /* Routine that actually outputs a trace or error message */
+ JMETHOD(void, output_message, (j_common_ptr cinfo));
+ /* Format a message string for the most recent JPEG error or message */
+ JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer));
+#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */
+ /* Reset error state variables at start of a new image */
+ JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo));
+
+ /* The message ID code and any parameters are saved here.
+ * A message can have one string parameter or up to 8 int parameters.
+ */
+ int msg_code;
+#define JMSG_STR_PARM_MAX 80
+ union {
+ int i[8];
+ char s[JMSG_STR_PARM_MAX];
+ } msg_parm;
+
+ /* Standard state variables for error facility */
+
+ int trace_level; /* max msg_level that will be displayed */
+
+ /* For recoverable corrupt-data errors, we emit a warning message,
+ * but keep going unless emit_message chooses to abort. emit_message
+ * should count warnings in num_warnings. The surrounding application
+ * can check for bad data by seeing if num_warnings is nonzero at the
+ * end of processing.
+ */
+ long num_warnings; /* number of corrupt-data warnings */
+
+ /* These fields point to the table(s) of error message strings.
+ * An application can change the table pointer to switch to a different
+ * message list (typically, to change the language in which errors are
+ * reported). Some applications may wish to add additional error codes
+ * that will be handled by the JPEG library error mechanism; the second
+ * table pointer is used for this purpose.
+ *
+ * First table includes all errors generated by JPEG library itself.
+ * Error code 0 is reserved for a "no such error string" message.
+ */
+ const char * const * jpeg_message_table; /* Library errors */
+ int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */
+ /* Second table can be added by application (see cjpeg/djpeg for example).
+ * It contains strings numbered first_addon_message..last_addon_message.
+ */
+ const char * const * addon_message_table; /* Non-library errors */
+ int first_addon_message; /* code for first string in addon table */
+ int last_addon_message; /* code for last string in addon table */
+};
+
+
+/* Progress monitor object */
+
+struct jpeg_progress_mgr {
+ JMETHOD(void, progress_monitor, (j_common_ptr cinfo));
+
+ long pass_counter; /* work units completed in this pass */
+ long pass_limit; /* total number of work units in this pass */
+ int completed_passes; /* passes completed so far */
+ int total_passes; /* total number of passes expected */
+};
+
+
+/* Data destination object for compression */
+
+struct jpeg_destination_mgr {
+ JOCTET * next_output_byte; /* => next byte to write in buffer */
+ size_t free_in_buffer; /* # of byte spaces remaining in buffer */
+
+ JMETHOD(void, init_destination, (j_compress_ptr cinfo));
+ JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo));
+ JMETHOD(void, term_destination, (j_compress_ptr cinfo));
+};
+
+
+/* Data source object for decompression */
+
+struct jpeg_source_mgr {
+ const JOCTET * next_input_byte; /* => next byte to read from buffer */
+ size_t bytes_in_buffer; /* # of bytes remaining in buffer */
+
+ JMETHOD(void, init_source, (j_decompress_ptr cinfo));
+ JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
+ JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
+ JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
+ JMETHOD(void, term_source, (j_decompress_ptr cinfo));
+};
+
+
+/* Memory manager object.
+ * Allocates "small" objects (a few K total), "large" objects (tens of K),
+ * and "really big" objects (virtual arrays with backing store if needed).
+ * The memory manager does not allow individual objects to be freed; rather,
+ * each created object is assigned to a pool, and whole pools can be freed
+ * at once. This is faster and more convenient than remembering exactly what
+ * to free, especially where malloc()/free() are not too speedy.
+ * NB: alloc routines never return NULL. They exit to error_exit if not
+ * successful.
+ */
+
+#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */
+#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */
+#define JPOOL_NUMPOOLS 2
+
+typedef struct jvirt_sarray_control * jvirt_sarray_ptr;
+typedef struct jvirt_barray_control * jvirt_barray_ptr;
+
+
+struct jpeg_memory_mgr {
+ /* Method pointers */
+ JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(void *, alloc_large, (j_common_ptr cinfo, int pool_id,
+ size_t sizeofobject));
+ JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows));
+ JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows));
+ JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION samplesperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo,
+ int pool_id,
+ boolean pre_zero,
+ JDIMENSION blocksperrow,
+ JDIMENSION numrows,
+ JDIMENSION maxaccess));
+ JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo));
+ JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo,
+ jvirt_sarray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo,
+ jvirt_barray_ptr ptr,
+ JDIMENSION start_row,
+ JDIMENSION num_rows,
+ boolean writable));
+ JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id));
+ JMETHOD(void, self_destruct, (j_common_ptr cinfo));
+
+ /* Limit on memory allocation for this JPEG object. (Note that this is
+ * merely advisory, not a guaranteed maximum; it only affects the space
+ * used for virtual-array buffers.) May be changed by outer application
+ * after creating the JPEG object.
+ */
+ long max_memory_to_use;
+
+ /* Maximum allocation request accepted by alloc_large. */
+ long max_alloc_chunk;
+};
+
+
+/* Routine signature for application-supplied marker processing methods.
+ * Need not pass marker code since it is stored in cinfo->unread_marker.
+ */
+typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
+
+
+/* Declarations for routines called by application.
+ * The JPP macro hides prototype parameters from compilers that can't cope.
+ * Note JPP requires double parentheses.
+ */
+
+#ifdef HAVE_PROTOTYPES
+#define JPP(arglist) arglist
+#else
+#define JPP(arglist) ()
+#endif
+
+
+/* Short forms of external names for systems with brain-damaged linkers.
+ * We shorten external names to be unique in the first six letters, which
+ * is good enough for all known systems.
+ * (If your compiler itself needs names to be unique in less than 15
+ * characters, you are out of luck. Get a better compiler.)
+ */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jpeg_std_error jStdError
+#define jpeg_CreateCompress jCreaCompress
+#define jpeg_CreateDecompress jCreaDecompress
+#define jpeg_destroy_compress jDestCompress
+#define jpeg_destroy_decompress jDestDecompress
+#define jpeg_stdio_dest jStdDest
+#define jpeg_stdio_src jStdSrc
+#define jpeg_set_defaults jSetDefaults
+#define jpeg_set_colorspace jSetColorspace
+#define jpeg_default_colorspace jDefColorspace
+#define jpeg_set_quality jSetQuality
+#define jpeg_set_linear_quality jSetLQuality
+#define jpeg_add_quant_table jAddQuantTable
+#define jpeg_quality_scaling jQualityScaling
+#define jpeg_simple_progression jSimProgress
+#define jpeg_suppress_tables jSuppressTables
+#define jpeg_alloc_quant_table jAlcQTable
+#define jpeg_alloc_huff_table jAlcHTable
+#define jpeg_start_compress jStrtCompress
+#define jpeg_write_scanlines jWrtScanlines
+#define jpeg_finish_compress jFinCompress
+#define jpeg_write_raw_data jWrtRawData
+#define jpeg_write_marker jWrtMarker
+#define jpeg_write_m_header jWrtMHeader
+#define jpeg_write_m_byte jWrtMByte
+#define jpeg_write_tables jWrtTables
+#define jpeg_read_header jReadHeader
+#define jpeg_start_decompress jStrtDecompress
+#define jpeg_read_scanlines jReadScanlines
+#define jpeg_finish_decompress jFinDecompress
+#define jpeg_read_raw_data jReadRawData
+#define jpeg_has_multiple_scans jHasMultScn
+#define jpeg_start_output jStrtOutput
+#define jpeg_finish_output jFinOutput
+#define jpeg_input_complete jInComplete
+#define jpeg_new_colormap jNewCMap
+#define jpeg_consume_input jConsumeInput
+#define jpeg_calc_output_dimensions jCalcDimensions
+#define jpeg_save_markers jSaveMarkers
+#define jpeg_set_marker_processor jSetMarker
+#define jpeg_read_coefficients jReadCoefs
+#define jpeg_write_coefficients jWrtCoefs
+#define jpeg_copy_critical_parameters jCopyCrit
+#define jpeg_abort_compress jAbrtCompress
+#define jpeg_abort_decompress jAbrtDecompress
+#define jpeg_abort jAbort
+#define jpeg_destroy jDestroy
+#define jpeg_resync_to_restart jResyncRestart
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/* Default error-management setup */
+EXTERN(struct jpeg_error_mgr *) jpeg_std_error
+ JPP((struct jpeg_error_mgr * err));
+
+/* Initialization of JPEG compression objects.
+ * jpeg_create_compress() and jpeg_create_decompress() are the exported
+ * names that applications should call. These expand to calls on
+ * jpeg_CreateCompress and jpeg_CreateDecompress with additional information
+ * passed for version mismatch checking.
+ * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx.
+ */
+#define jpeg_create_compress(cinfo) \
+ jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_compress_struct))
+#define jpeg_create_decompress(cinfo) \
+ jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \
+ (size_t) sizeof(struct jpeg_decompress_struct))
+EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo,
+ int version, size_t structsize));
+EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo,
+ int version, size_t structsize));
+/* Destruction of JPEG compression objects */
+EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
+
+#if 0
+/* Standard data source and destination managers: stdio streams. */
+/* Caller is responsible for opening the file before and closing after. */
+EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FXSYS_FILE * outfile));
+EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FXSYS_FILE * infile));
+#endif
+
+/* Default parameter setup for compression */
+EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
+/* Compression parameter setup aids */
+EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo,
+ J_COLOR_SPACE colorspace));
+EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality,
+ boolean force_baseline));
+EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl,
+ const unsigned int *basic_table,
+ int scale_factor,
+ boolean force_baseline));
+EXTERN(int) jpeg_quality_scaling JPP((int quality));
+EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo,
+ boolean suppress));
+EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo));
+EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo));
+
+/* Main entry points for compression */
+EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo,
+ boolean write_all_tables));
+EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION num_lines));
+EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo));
+
+/* Replaces jpeg_write_scanlines when writing raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION num_lines));
+
+/* Write a special marker. See libjpeg.doc concerning safe usage. */
+EXTERN(void) jpeg_write_marker
+ JPP((j_compress_ptr cinfo, int marker,
+ const JOCTET * dataptr, unsigned int datalen));
+/* Same, but piecemeal. */
+EXTERN(void) jpeg_write_m_header
+ JPP((j_compress_ptr cinfo, int marker, unsigned int datalen));
+EXTERN(void) jpeg_write_m_byte
+ JPP((j_compress_ptr cinfo, int val));
+
+/* Alternate compression function: just write an abbreviated table file */
+EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo));
+
+/* Decompression startup: read start of JPEG datastream to see what's there */
+EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo,
+ boolean require_image));
+/* Return value is one of: */
+#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */
+#define JPEG_HEADER_OK 1 /* Found valid image datastream */
+#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */
+/* If you pass require_image = TRUE (normal case), you need not check for
+ * a TABLES_ONLY return code; an abbreviated file will cause an error exit.
+ * JPEG_SUSPENDED is only possible if you use a data source module that can
+ * give a suspension return (the stdio source module doesn't).
+ */
+
+/* Main entry points for decompression */
+EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo));
+EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo,
+ JSAMPARRAY scanlines,
+ JDIMENSION max_lines));
+EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo));
+
+/* Replaces jpeg_read_scanlines when reading raw downsampled data. */
+EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo,
+ JSAMPIMAGE data,
+ JDIMENSION max_lines));
+
+/* Additional entry points for buffered-image mode. */
+EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo,
+ int scan_number));
+EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo));
+EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo));
+EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
+/* Return value is one of: */
+/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */
+#define JPEG_REACHED_SOS 1 /* Reached start of new scan */
+#define JPEG_REACHED_EOI 2 /* Reached end of image */
+#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */
+#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
+
+/* Precalculate output dimensions for current decompression parameters. */
+EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
+
+/* Control saving of COM and APPn markers into marker_list. */
+EXTERN(void) jpeg_save_markers
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ unsigned int length_limit));
+
+/* Install a special processing method for COM or APPn markers. */
+EXTERN(void) jpeg_set_marker_processor
+ JPP((j_decompress_ptr cinfo, int marker_code,
+ jpeg_marker_parser_method routine));
+
+/* Read or write raw DCT coefficients --- useful for lossless transcoding. */
+EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo));
+EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo,
+ jvirt_barray_ptr * coef_arrays));
+EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo,
+ j_compress_ptr dstinfo));
+
+/* If you choose to abort compression or decompression before completing
+ * jpeg_finish_(de)compress, then you need to clean up to release memory,
+ * temporary files, etc. You can just call jpeg_destroy_(de)compress
+ * if you're done with the JPEG object, but if you want to clean it up and
+ * reuse it, call this:
+ */
+EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo));
+EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo));
+
+/* Generic versions of jpeg_abort and jpeg_destroy that work on either
+ * flavor of JPEG object. These may be more convenient in some places.
+ */
+EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo));
+EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo));
+
+/* Default restart-marker-resync procedure for use by data source modules */
+EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo,
+ int desired));
+
+
+/* These marker codes are exported since applications and data source modules
+ * are likely to want to use them.
+ */
+
+#define JPEG_RST0 0xD0 /* RST0 marker code */
+#define JPEG_EOI 0xD9 /* EOI marker code */
+#define JPEG_APP0 0xE0 /* APP0 marker code */
+#define JPEG_COM 0xFE /* COM marker code */
+
+
+/* If we have a brain-damaged compiler that emits warnings (or worse, errors)
+ * for structure definitions that are never filled in, keep it quiet by
+ * supplying dummy definitions for the various substructures.
+ */
+
+#ifdef INCOMPLETE_TYPES_BROKEN
+#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */
+struct jvirt_sarray_control { long dummy; };
+struct jvirt_barray_control { long dummy; };
+struct jpeg_comp_master { long dummy; };
+struct jpeg_c_main_controller { long dummy; };
+struct jpeg_c_prep_controller { long dummy; };
+struct jpeg_c_coef_controller { long dummy; };
+struct jpeg_marker_writer { long dummy; };
+struct jpeg_color_converter { long dummy; };
+struct jpeg_downsampler { long dummy; };
+struct jpeg_forward_dct { long dummy; };
+struct jpeg_entropy_encoder { long dummy; };
+struct jpeg_decomp_master { long dummy; };
+struct jpeg_d_main_controller { long dummy; };
+struct jpeg_d_coef_controller { long dummy; };
+struct jpeg_d_post_controller { long dummy; };
+struct jpeg_input_controller { long dummy; };
+struct jpeg_marker_reader { long dummy; };
+struct jpeg_entropy_decoder { long dummy; };
+struct jpeg_inverse_dct { long dummy; };
+struct jpeg_upsampler { long dummy; };
+struct jpeg_color_deconverter { long dummy; };
+struct jpeg_color_quantizer { long dummy; };
+#endif /* JPEG_INTERNALS */
+#endif /* INCOMPLETE_TYPES_BROKEN */
+
+
+/*
+ * The JPEG library modules define JPEG_INTERNALS before including this file.
+ * The internal structure declarations are read only when that is true.
+ * Applications using the library should not include jpegint.h, but may wish
+ * to include jerror.h.
+ */
+
+#ifdef JPEG_INTERNALS
+#include "jpegint.h" /* fetch private declarations */
+#include "jerror.h" /* fetch error codes too */
+#endif
+
+#endif /* JPEGLIB_H */
diff --git a/core/src/fxcodec/libjpeg/jversion.h b/core/src/fxcodec/libjpeg/jversion.h
new file mode 100644
index 0000000000..dadd453a41
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/jversion.h
@@ -0,0 +1,14 @@
+/*
+ * jversion.h
+ *
+ * Copyright (C) 1991-1998, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains software version identification.
+ */
+
+
+#define JVERSION "6b 27-Mar-1998"
+
+#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane"
diff --git a/core/src/fxcodec/libjpeg/makefile b/core/src/fxcodec/libjpeg/makefile
new file mode 100644
index 0000000000..777d83b15a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/makefile
@@ -0,0 +1,8 @@
+sources = fpdfapi_jcapimin.c fpdfapi_jcapistd.c fpdfapi_jccoefct.c fpdfapi_jccolor.c fpdfapi_jcdctmgr.c fpdfapi_jchuff.c fpdfapi_jcinit.c fpdfapi_jcmainct.c fpdfapi_jcmarker.c fpdfapi_jcmaster.c \
+ fpdfapi_jcomapi.c fpdfapi_jcparam.c fpdfapi_jcphuff.c fpdfapi_jcprepct.c fpdfapi_jcsample.c fpdfapi_jctrans.c fpdfapi_jdapimin.c fpdfapi_jdapistd.c fpdfapi_jdcoefct.c \
+ fpdfapi_jdcolor.c fpdfapi_jddctmgr.c fpdfapi_jdhuff.c fpdfapi_jdinput.c fpdfapi_jdmainct.c fpdfapi_jdmarker.c fpdfapi_jdmaster.c fpdfapi_jdmerge.c fpdfapi_jdphuff.c fpdfapi_jdpostct.c fpdfapi_jdsample.c \
+ fpdfapi_jdtrans.c fpdfapi_jerror.c fpdfapi_jfdctfst.c fpdfapi_jfdctint.c fpdfapi_jcapimin.c fpdfapi_jidctfst.c fpdfapi_jidctint.c fpdfapi_jidctred.c fpdfapi_jmemmgr.c \
+ fpdfapi_jmemnobs.c fpdfapi_jutils.c
+armsources=$(sources)
+armsourcesc=$(sources)
+include ../../src/makefile
diff --git a/core/src/fxcodec/libjpeg/transupp.h b/core/src/fxcodec/libjpeg/transupp.h
new file mode 100644
index 0000000000..eb0b05566a
--- /dev/null
+++ b/core/src/fxcodec/libjpeg/transupp.h
@@ -0,0 +1,135 @@
+/*
+ * transupp.h
+ *
+ * Copyright (C) 1997, Thomas G. Lane.
+ * This file is part of the Independent JPEG Group's software.
+ * For conditions of distribution and use, see the accompanying README file.
+ *
+ * This file contains declarations for image transformation routines and
+ * other utility code used by the jpegtran sample application. These are
+ * NOT part of the core JPEG library. But we keep these routines separate
+ * from jpegtran.c to ease the task of maintaining jpegtran-like programs
+ * that have other user interfaces.
+ *
+ * NOTE: all the routines declared here have very specific requirements
+ * about when they are to be executed during the reading and writing of the
+ * source and destination files. See the comments in transupp.c, or see
+ * jpegtran.c for an example of correct usage.
+ */
+
+/* If you happen not to want the image transform support, disable it here */
+#ifndef TRANSFORMS_SUPPORTED
+#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
+#endif
+
+/* Short forms of external names for systems with brain-damaged linkers. */
+
+#ifdef NEED_SHORT_EXTERNAL_NAMES
+#define jtransform_request_workspace jTrRequest
+#define jtransform_adjust_parameters jTrAdjust
+#define jtransform_execute_transformation jTrExec
+#define jcopy_markers_setup jCMrkSetup
+#define jcopy_markers_execute jCMrkExec
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
+
+
+/*
+ * Codes for supported types of image transformations.
+ */
+
+typedef enum {
+ JXFORM_NONE, /* no transformation */
+ JXFORM_FLIP_H, /* horizontal flip */
+ JXFORM_FLIP_V, /* vertical flip */
+ JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
+ JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
+ JXFORM_ROT_90, /* 90-degree clockwise rotation */
+ JXFORM_ROT_180, /* 180-degree rotation */
+ JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
+} JXFORM_CODE;
+
+/*
+ * Although rotating and flipping data expressed as DCT coefficients is not
+ * hard, there is an asymmetry in the JPEG format specification for images
+ * whose dimensions aren't multiples of the iMCU size. The right and bottom
+ * image edges are padded out to the next iMCU boundary with junk data; but
+ * no padding is possible at the top and left edges. If we were to flip
+ * the whole image including the pad data, then pad garbage would become
+ * visible at the top and/or left, and real pixels would disappear into the
+ * pad margins --- perhaps permanently, since encoders & decoders may not
+ * bother to preserve DCT blocks that appear to be completely outside the
+ * nominal image area. So, we have to exclude any partial iMCUs from the
+ * basic transformation.
+ *
+ * Transpose is the only transformation that can handle partial iMCUs at the
+ * right and bottom edges completely cleanly. flip_h can flip partial iMCUs
+ * at the bottom, but leaves any partial iMCUs at the right edge untouched.
+ * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched.
+ * The other transforms are defined as combinations of these basic transforms
+ * and process edge blocks in a way that preserves the equivalence.
+ *
+ * The "trim" option causes untransformable partial iMCUs to be dropped;
+ * this is not strictly lossless, but it usually gives the best-looking
+ * result for odd-size images. Note that when this option is active,
+ * the expected mathematical equivalences between the transforms may not hold.
+ * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
+ * followed by -rot 180 -trim trims both edges.)
+ *
+ * We also offer a "force to grayscale" option, which simply discards the
+ * chrominance channels of a YCbCr image. This is lossless in the sense that
+ * the luminance channel is preserved exactly. It's not the same kind of
+ * thing as the rotate/flip transformations, but it's convenient to handle it
+ * as part of this package, mainly because the transformation routines have to
+ * be aware of the option to know how many components to work on.
+ */
+
+typedef struct {
+ /* Options: set by caller */
+ JXFORM_CODE transform; /* image transform operator */
+ boolean trim; /* if TRUE, trim partial MCUs as needed */
+ boolean force_grayscale; /* if TRUE, convert color image to grayscale */
+
+ /* Internal workspace: caller should not touch these */
+ int num_components; /* # of components in workspace */
+ jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
+} jpeg_transform_info;
+
+
+#if TRANSFORMS_SUPPORTED
+
+/* Request any required workspace */
+EXTERN(void) jtransform_request_workspace
+ JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
+/* Adjust output image parameters */
+EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ jvirt_barray_ptr *src_coef_arrays,
+ jpeg_transform_info *info));
+/* Execute the actual transformation, if any */
+EXTERN(void) jtransform_execute_transformation
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ jvirt_barray_ptr *src_coef_arrays,
+ jpeg_transform_info *info));
+
+#endif /* TRANSFORMS_SUPPORTED */
+
+
+/*
+ * Support for copying optional markers from source to destination file.
+ */
+
+typedef enum {
+ JCOPYOPT_NONE, /* copy no optional markers */
+ JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
+ JCOPYOPT_ALL /* copy all optional markers */
+} JCOPY_OPTION;
+
+#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */
+
+/* Setup decompression object to save desired markers in memory */
+EXTERN(void) jcopy_markers_setup
+ JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option));
+/* Copy markers saved in the given source object to the destination object */
+EXTERN(void) jcopy_markers_execute
+ JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ JCOPY_OPTION option));
diff --git a/core/src/fxcrt/extension.h b/core/src/fxcrt/extension.h
new file mode 100644
index 0000000000..bf5c5ec6ad
--- /dev/null
+++ b/core/src/fxcrt/extension.h
@@ -0,0 +1,413 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_EXTENSION_IMP_
+#define _FXCRT_EXTENSION_IMP_
+class IFXCRT_FileAccess
+{
+public:
+ virtual ~IFXCRT_FileAccess() {}
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode) = 0;
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode) = 0;
+ virtual void Close() = 0;
+ virtual void Release(IFX_Allocator* pAllocator = NULL) = 0;
+ virtual FX_FILESIZE GetSize() const = 0;
+ virtual FX_FILESIZE GetPosition() const = 0;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos) = 0;
+ virtual size_t Read(void* pBuffer, size_t szBuffer) = 0;
+ virtual size_t Write(const void* pBuffer, size_t szBuffer) = 0;
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos) = 0;
+ virtual FX_BOOL Flush() = 0;
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile) = 0;
+};
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator = NULL);
+class CFX_CRTFileStream : public IFX_FileStream, public CFX_Object
+{
+public:
+ CFX_CRTFileStream(IFXCRT_FileAccess* pFA, IFX_Allocator* pAllocator) : m_pAllocator(pAllocator), m_pFile(pFA), m_dwCount(1), m_bUseRange(FALSE), m_nOffset(0), m_nSize(0) {}
+ ~CFX_CRTFileStream()
+ {
+ if (m_pFile) {
+ m_pFile->Release(m_pAllocator);
+ }
+ }
+ virtual IFX_FileStream* Retain()
+ {
+ m_dwCount ++;
+ return this;
+ }
+ virtual void Release()
+ {
+ FX_DWORD nCount = -- m_dwCount;
+ if (!nCount) {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CFX_CRTFileStream);
+ } else {
+ delete this;
+ }
+ }
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_bUseRange ? m_nSize : m_pFile->GetSize();
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return GetPosition() >= GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ FX_FILESIZE pos = m_pFile->GetPosition();
+ if (m_bUseRange) {
+ pos -= m_nOffset;
+ }
+ return pos;
+ }
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ if (offset < 0 || offset + size > m_pFile->GetSize()) {
+ return FALSE;
+ }
+ m_nOffset = offset, m_nSize = size;
+ m_bUseRange = TRUE;
+ m_pFile->SetPosition(m_nOffset);
+ return TRUE;
+ }
+ virtual void ClearRange()
+ {
+ m_bUseRange = FALSE;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (m_bUseRange) {
+ if (offset + size > (size_t)GetSize()) {
+ return FALSE;
+ }
+ offset += m_nOffset;
+ }
+ return (FX_BOOL)m_pFile->ReadPos(buffer, size, offset);
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ if (m_bUseRange) {
+ FX_FILESIZE availSize = m_nOffset + m_nSize - m_pFile->GetPosition();
+ if ((size_t)availSize < size) {
+ size -= size - (size_t)availSize;
+ }
+ }
+ return m_pFile->Read(buffer, size);
+ }
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (m_bUseRange) {
+ offset += m_nOffset;
+ }
+ return (FX_BOOL)m_pFile->WritePos(buffer, size, offset);
+ }
+ virtual FX_BOOL Flush()
+ {
+ return m_pFile->Flush();
+ }
+ IFX_Allocator* m_pAllocator;
+ IFXCRT_FileAccess* m_pFile;
+ FX_DWORD m_dwCount;
+ FX_BOOL m_bUseRange;
+ FX_FILESIZE m_nOffset;
+ FX_FILESIZE m_nSize;
+};
+#define FX_MEMSTREAM_BlockSize (64 * 1024)
+#define FX_MEMSTREAM_Consecutive 0x01
+#define FX_MEMSTREAM_TakeOver 0x02
+class CFX_MemoryStream : public IFX_MemoryStream, public CFX_Object
+{
+public:
+ CFX_MemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
+ : m_Blocks(pAllocator)
+ , m_dwCount(1)
+ , m_nTotalSize(0)
+ , m_nCurSize(0)
+ , m_nCurPos(0)
+ , m_nGrowSize(FX_MEMSTREAM_BlockSize)
+ , m_bUseRange(FALSE)
+ {
+ m_dwFlags = FX_MEMSTREAM_TakeOver | (bConsecutive ? FX_MEMSTREAM_Consecutive : 0);
+ }
+ CFX_MemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
+ : m_Blocks(pAllocator)
+ , m_dwCount(1)
+ , m_nTotalSize(nSize)
+ , m_nCurSize(nSize)
+ , m_nCurPos(0)
+ , m_nGrowSize(FX_MEMSTREAM_BlockSize)
+ , m_bUseRange(FALSE)
+ {
+ m_Blocks.Add(pBuffer);
+ m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+ }
+ ~CFX_MemoryStream()
+ {
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ if (m_dwFlags & FX_MEMSTREAM_TakeOver) {
+ for (FX_INT32 i = 0; i < m_Blocks.GetSize(); i ++) {
+ FX_Allocator_Free(pAllocator, (FX_LPBYTE)m_Blocks[i]);
+ }
+ }
+ m_Blocks.RemoveAll();
+ }
+ virtual IFX_FileStream* Retain()
+ {
+ m_dwCount ++;
+ return this;
+ }
+ virtual void Release()
+ {
+ FX_DWORD nCount = -- m_dwCount;
+ if (nCount) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFX_MemoryStream);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_bUseRange ? (FX_FILESIZE) m_nSize : (FX_FILESIZE)m_nCurSize;
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_nCurPos >= (size_t)GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ FX_FILESIZE pos = (FX_FILESIZE)m_nCurPos;
+ if (m_bUseRange) {
+ pos -= (FX_FILESIZE)m_nOffset;
+ }
+ return pos;
+ }
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ if (offset < 0 || (size_t)(offset + size) > m_nCurSize) {
+ return FALSE;
+ }
+ m_nOffset = (size_t)offset, m_nSize = (size_t)size;
+ m_bUseRange = TRUE;
+ m_nCurPos = m_nOffset;
+ return TRUE;
+ }
+ virtual void ClearRange()
+ {
+ m_bUseRange = FALSE;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (!buffer || !size) {
+ return FALSE;
+ }
+ if (m_bUseRange) {
+ offset += (FX_FILESIZE)m_nOffset;
+ }
+ if ((size_t)offset + size > m_nCurSize) {
+ return FALSE;
+ }
+ m_nCurPos = (size_t)offset + size;
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[0] + (size_t)offset, size);
+ return TRUE;
+ }
+ size_t nStartBlock = (size_t)offset / m_nGrowSize;
+ offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+ while (size) {
+ size_t nRead = m_nGrowSize - (size_t)offset;
+ if (nRead > size) {
+ nRead = size;
+ }
+ FXSYS_memcpy32(buffer, (FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, nRead);
+ buffer = ((FX_LPBYTE)buffer) + nRead;
+ size -= nRead;
+ nStartBlock ++;
+ offset = 0;
+ }
+ return TRUE;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ if (m_nCurPos >= m_nCurSize) {
+ return 0;
+ }
+ if (m_bUseRange) {
+ size_t availSize = m_nOffset + m_nSize - m_nCurPos;
+ if (availSize < size) {
+ size -= size - (size_t)availSize;
+ }
+ }
+ size_t nRead = FX_MIN(size, m_nCurSize - m_nCurPos);
+ if (!ReadBlock(buffer, (FX_INT32)m_nCurPos, nRead)) {
+ return 0;
+ }
+ return nRead;
+ }
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if (!buffer || !size) {
+ return FALSE;
+ }
+ if (m_bUseRange) {
+ offset += (FX_FILESIZE)m_nOffset;
+ }
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ m_nCurPos = (size_t)offset + size;
+ if (m_nCurPos > m_nTotalSize) {
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ m_nTotalSize = (m_nCurPos + m_nGrowSize - 1) / m_nGrowSize * m_nGrowSize;
+ if (m_Blocks.GetSize() < 1) {
+ void* block = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nTotalSize);
+ m_Blocks.Add(block);
+ } else {
+ m_Blocks[0] = FX_Allocator_Realloc(pAllocator, FX_BYTE, m_Blocks[0], m_nTotalSize);
+ }
+ if (!m_Blocks[0]) {
+ m_Blocks.RemoveAll();
+ return FALSE;
+ }
+ }
+ FXSYS_memcpy32((FX_LPBYTE)m_Blocks[0] + (size_t)offset, buffer, size);
+ if (m_nCurSize < m_nCurPos) {
+ m_nCurSize = m_nCurPos;
+ }
+ return TRUE;
+ }
+ if (!ExpandBlocks((size_t)offset + size)) {
+ return FALSE;
+ }
+ m_nCurPos = (size_t)offset + size;
+ size_t nStartBlock = (size_t)offset / m_nGrowSize;
+ offset -= (FX_FILESIZE)(nStartBlock * m_nGrowSize);
+ while (size) {
+ size_t nWrite = m_nGrowSize - (size_t)offset;
+ if (nWrite > size) {
+ nWrite = size;
+ }
+ FXSYS_memcpy32((FX_LPBYTE)m_Blocks[(int)nStartBlock] + (size_t)offset, buffer, nWrite);
+ buffer = ((FX_LPBYTE)buffer) + nWrite;
+ size -= nWrite;
+ nStartBlock ++;
+ offset = 0;
+ }
+ return TRUE;
+ }
+ virtual FX_BOOL Flush()
+ {
+ return TRUE;
+ }
+ virtual FX_BOOL IsConsecutive() const
+ {
+ return m_dwFlags & FX_MEMSTREAM_Consecutive;
+ }
+ virtual void EstimateSize(size_t nInitSize, size_t nGrowSize)
+ {
+ if (m_dwFlags & FX_MEMSTREAM_Consecutive) {
+ if (m_Blocks.GetSize() < 1) {
+ FX_LPBYTE pBlock = FX_Allocator_Alloc(m_Blocks.m_pAllocator, FX_BYTE, FX_MAX(nInitSize, 4096));
+ if (pBlock) {
+ m_Blocks.Add(pBlock);
+ }
+ }
+ m_nGrowSize = FX_MAX(nGrowSize, 4096);
+ } else if (m_Blocks.GetSize() < 1) {
+ m_nGrowSize = FX_MAX(nGrowSize, 4096);
+ }
+ }
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return m_Blocks.GetSize() ? (FX_LPBYTE)m_Blocks[0] : NULL;
+ }
+ virtual void AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE)
+ {
+ if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+ return;
+ }
+ m_Blocks.RemoveAll();
+ m_Blocks.Add(pBuffer);
+ m_nTotalSize = m_nCurSize = nSize;
+ m_nCurPos = 0;
+ m_dwFlags = FX_MEMSTREAM_Consecutive | (bTakeOver ? FX_MEMSTREAM_TakeOver : 0);
+ ClearRange();
+ }
+ virtual void DetachBuffer()
+ {
+ if (!(m_dwFlags & FX_MEMSTREAM_Consecutive)) {
+ return;
+ }
+ m_Blocks.RemoveAll();
+ m_nTotalSize = m_nCurSize = m_nCurPos = 0;
+ m_dwFlags = FX_MEMSTREAM_TakeOver;
+ ClearRange();
+ }
+protected:
+ CFX_PtrArray m_Blocks;
+ FX_DWORD m_dwCount;
+ size_t m_nTotalSize;
+ size_t m_nCurSize;
+ size_t m_nCurPos;
+ size_t m_nGrowSize;
+ FX_DWORD m_dwFlags;
+ FX_BOOL m_bUseRange;
+ size_t m_nOffset;
+ size_t m_nSize;
+ FX_BOOL ExpandBlocks(size_t size)
+ {
+ if (m_nCurSize < size) {
+ m_nCurSize = size;
+ }
+ if (size <= m_nTotalSize) {
+ return TRUE;
+ }
+ FX_INT32 iCount = m_Blocks.GetSize();
+ size = (size - m_nTotalSize + m_nGrowSize - 1) / m_nGrowSize;
+ m_Blocks.SetSize(m_Blocks.GetSize() + (FX_INT32)size, -1);
+ IFX_Allocator* pAllocator = m_Blocks.m_pAllocator;
+ while (size --) {
+ FX_LPBYTE pBlock = FX_Allocator_Alloc(pAllocator, FX_BYTE, m_nGrowSize);
+ if (!pBlock) {
+ return FALSE;
+ }
+ m_Blocks.SetAt(iCount ++, pBlock);
+ m_nTotalSize += m_nGrowSize;
+ }
+ return TRUE;
+ }
+};
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define MT_N 848
+#define MT_M 456
+#define MT_Matrix_A 0x9908b0df
+#define MT_Upper_Mask 0x80000000
+#define MT_Lower_Mask 0x7fffffff
+typedef struct _FX_MTRANDOMCONTEXT {
+ _FX_MTRANDOMCONTEXT()
+ {
+ mti = MT_N + 1;
+ bHaveSeed = FALSE;
+ }
+ FX_DWORD mti;
+ FX_BOOL bHaveSeed;
+ FX_DWORD mt[MT_N];
+} FX_MTRANDOMCONTEXT, * FX_LPMTRANDOMCONTEXT;
+typedef FX_MTRANDOMCONTEXT const * FX_LPCMTRANDOMCONTEXT;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount);
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/src/fxcrt/fx_arabic.cpp b/core/src/fxcrt/fx_arabic.cpp
new file mode 100644
index 0000000000..583ce817cf
--- /dev/null
+++ b/core/src/fxcrt/fx_arabic.cpp
@@ -0,0 +1,86 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fx_arabic.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
+IFX_BidiChar* IFX_BidiChar::Create()
+{
+ return FX_NEW CFX_BidiChar;
+}
+CFX_BidiChar::CFX_BidiChar()
+ : m_bSeparateNeutral(TRUE)
+ , m_iCurStart(0)
+ , m_iCurCount(0)
+ , m_iCurBidi(0)
+ , m_iLastBidi(0)
+ , m_iLastStart(0)
+ , m_iLastCount(0)
+{
+}
+FX_BOOL CFX_BidiChar::AppendChar(FX_WCHAR wch)
+{
+ FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+ FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
+ FX_INT32 iContext = 0;
+ switch (iBidiCls) {
+ case FX_BIDICLASS_L:
+ case FX_BIDICLASS_AN:
+ case FX_BIDICLASS_EN:
+ iContext = 1;
+ break;
+ case FX_BIDICLASS_R:
+ case FX_BIDICLASS_AL:
+ iContext = 2;
+ break;
+ }
+ FX_BOOL bRet = FALSE;
+ if (iContext != m_iCurBidi) {
+ if (m_bSeparateNeutral) {
+ bRet = TRUE;
+ } else {
+ if (m_iCurBidi == 0) {
+ bRet = (m_iCurCount > 0);
+ } else {
+ bRet = (iContext != 0);
+ }
+ }
+ if (bRet) {
+ m_iLastBidi = m_iCurBidi;
+ m_iLastStart = m_iCurStart;
+ m_iCurStart = m_iCurCount;
+ m_iLastCount = m_iCurCount - m_iLastStart;
+ }
+ if (m_bSeparateNeutral || iContext != 0) {
+ m_iCurBidi = iContext;
+ }
+ }
+ m_iCurCount ++;
+ return bRet;
+}
+FX_BOOL CFX_BidiChar::EndChar()
+{
+ m_iLastBidi = m_iCurBidi;
+ m_iLastStart = m_iCurStart;
+ m_iCurStart = m_iCurCount;
+ m_iLastCount = m_iCurCount - m_iLastStart;
+ return m_iLastCount > 0;
+}
+FX_INT32 CFX_BidiChar::GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount)
+{
+ iStart = m_iLastStart;
+ iCount = m_iLastCount;
+ return m_iLastBidi;
+}
+void CFX_BidiChar::Reset()
+{
+ m_iCurStart = 0;
+ m_iCurCount = 0;
+ m_iCurBidi = 0;
+ m_iLastBidi = 0;
+ m_iLastStart = 0;
+ m_iLastCount = 0;
+}
diff --git a/core/src/fxcrt/fx_arabic.h b/core/src/fxcrt/fx_arabic.h
new file mode 100644
index 0000000000..503ec01696
--- /dev/null
+++ b/core/src/fxcrt/fx_arabic.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ARABIC_IMP
+#define _FX_ARABIC_IMP
+class CFX_BidiChar : public IFX_BidiChar, public CFX_Object
+{
+public:
+ CFX_BidiChar();
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual void SetPolicy(FX_BOOL bSeparateNeutral = TRUE)
+ {
+ m_bSeparateNeutral = bSeparateNeutral;
+ }
+ virtual FX_BOOL AppendChar(FX_WCHAR wch);
+ virtual FX_BOOL EndChar();
+ virtual FX_INT32 GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount);
+ virtual void Reset();
+protected:
+ FX_BOOL m_bSeparateNeutral;
+ FX_INT32 m_iCurStart;
+ FX_INT32 m_iCurCount;
+ FX_INT32 m_iCurBidi;
+ FX_INT32 m_iLastBidi;
+ FX_INT32 m_iLastStart;
+ FX_INT32 m_iLastCount;
+};
+#endif
diff --git a/core/src/fxcrt/fx_basic_array.cpp b/core/src/fxcrt/fx_basic_array.cpp
new file mode 100644
index 0000000000..36857ce336
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_array.cpp
@@ -0,0 +1,365 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+CFX_BasicArray::CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ , m_nSize(0)
+ , m_nMaxSize(0)
+ , m_nGrowBy(0)
+{
+ if (unit_size < 0 || unit_size > (1 << 28)) {
+ m_nUnitSize = 4;
+ } else {
+ m_nUnitSize = unit_size;
+ }
+}
+CFX_BasicArray::~CFX_BasicArray()
+{
+ FX_Allocator_Free(m_pAllocator, m_pData);
+}
+FX_BOOL CFX_BasicArray::SetSize(int nNewSize, int nGrowBy)
+{
+ if (nNewSize < 0 || nNewSize > (1 << 28) / m_nUnitSize) {
+ m_pData = NULL;
+ m_nSize = m_nMaxSize = 0;
+ return FALSE;
+ }
+ if (nGrowBy >= 0) {
+ m_nGrowBy = nGrowBy;
+ }
+ if (nNewSize == 0) {
+ if (m_pData != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ m_pData = NULL;
+ }
+ m_nSize = m_nMaxSize = 0;
+ } else if (m_pData == NULL) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, nNewSize * m_nUnitSize);
+ if (!m_pData) {
+ m_nSize = m_nMaxSize = 0;
+ return FALSE;
+ }
+ FXSYS_memset32(m_pData, 0, nNewSize * m_nUnitSize);
+ m_nSize = m_nMaxSize = nNewSize;
+ } else if (nNewSize <= m_nMaxSize) {
+ if (nNewSize > m_nSize) {
+ FXSYS_memset32(m_pData + m_nSize * m_nUnitSize, 0, (nNewSize - m_nSize) * m_nUnitSize);
+ }
+ m_nSize = nNewSize;
+ } else {
+ int nGrowBy = m_nGrowBy;
+ if (nGrowBy == 0) {
+ nGrowBy = m_nSize / 8;
+ nGrowBy = (nGrowBy < 4) ? 4 : ((nGrowBy > 1024) ? 1024 : nGrowBy);
+ }
+ int nNewMax;
+ if (nNewSize < m_nMaxSize + nGrowBy) {
+ nNewMax = m_nMaxSize + nGrowBy;
+ } else {
+ nNewMax = nNewSize;
+ }
+ FX_LPBYTE pNewData = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pData, nNewMax * m_nUnitSize);
+ if (pNewData == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(pNewData + m_nSize * m_nUnitSize, 0, (nNewMax - m_nSize) * m_nUnitSize);
+ m_pData = pNewData;
+ m_nSize = nNewSize;
+ m_nMaxSize = nNewMax;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::Append(const CFX_BasicArray& src)
+{
+ int nOldSize = m_nSize;
+ if (!SetSize(m_nSize + src.m_nSize, -1)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData + nOldSize * m_nUnitSize, src.m_pData, src.m_nSize * m_nUnitSize);
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::Copy(const CFX_BasicArray& src)
+{
+ if (!SetSize(src.m_nSize, -1)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData, src.m_pData, src.m_nSize * m_nUnitSize);
+ return TRUE;
+}
+FX_LPBYTE CFX_BasicArray::InsertSpaceAt(int nIndex, int nCount)
+{
+ if (nIndex < 0 || nCount <= 0) {
+ return NULL;
+ }
+ if (nIndex >= m_nSize) {
+ if (!SetSize(nIndex + nCount, -1)) {
+ return NULL;
+ }
+ } else {
+ int nOldSize = m_nSize;
+ if (!SetSize(m_nSize + nCount, -1)) {
+ return NULL;
+ }
+ FXSYS_memmove32(m_pData + (nIndex + nCount)*m_nUnitSize, m_pData + nIndex * m_nUnitSize,
+ (nOldSize - nIndex) * m_nUnitSize);
+ FXSYS_memset32(m_pData + nIndex * m_nUnitSize, 0, nCount * m_nUnitSize);
+ }
+ return m_pData + nIndex * m_nUnitSize;
+}
+FX_BOOL CFX_BasicArray::RemoveAt(int nIndex, int nCount)
+{
+ if (nIndex < 0 || nCount <= 0 || m_nSize < nIndex + nCount) {
+ return FALSE;
+ }
+ int nMoveCount = m_nSize - (nIndex + nCount);
+ if (nMoveCount) {
+ FXSYS_memmove32(m_pData + nIndex * m_nUnitSize, m_pData + (nIndex + nCount) * m_nUnitSize, nMoveCount * m_nUnitSize);
+ }
+ m_nSize -= nCount;
+ return TRUE;
+}
+FX_BOOL CFX_BasicArray::InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)
+{
+ if (pNewArray == NULL) {
+ return FALSE;
+ }
+ if (pNewArray->m_nSize == 0) {
+ return TRUE;
+ }
+ if (!InsertSpaceAt(nStartIndex, pNewArray->m_nSize)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pData + nStartIndex * m_nUnitSize, pNewArray->m_pData, pNewArray->m_nSize * m_nUnitSize);
+ return TRUE;
+}
+const void* CFX_BasicArray::GetDataPtr(int index) const
+{
+ if (index < 0 || index >= m_nSize || m_pData == NULL) {
+ return NULL;
+ }
+ return m_pData + index * m_nUnitSize;
+}
+CFX_BaseSegmentedArray::CFX_BaseSegmentedArray(int unit_size, int segment_units, int index_size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_UnitSize(unit_size)
+ , m_SegmentSize(segment_units)
+ , m_IndexSize(index_size)
+ , m_IndexDepth(0)
+ , m_DataSize(0)
+ , m_pIndex(NULL)
+{
+}
+void CFX_BaseSegmentedArray::SetUnitSize(int unit_size, int segment_units, int index_size)
+{
+ ASSERT(m_DataSize == 0);
+ m_UnitSize = unit_size;
+ m_SegmentSize = segment_units;
+ m_IndexSize = index_size;
+}
+CFX_BaseSegmentedArray::~CFX_BaseSegmentedArray()
+{
+ RemoveAll();
+}
+static void _ClearIndex(IFX_Allocator* pAllcator, int level, int size, void** pIndex)
+{
+ if (level == 0) {
+ FX_Allocator_Free(pAllcator, pIndex);
+ return;
+ }
+ for (int i = 0; i < size; i ++) {
+ if (pIndex[i] == NULL) {
+ continue;
+ }
+ _ClearIndex(pAllcator, level - 1, size, (void**)pIndex[i]);
+ }
+ FX_Allocator_Free(pAllcator, pIndex);
+}
+void CFX_BaseSegmentedArray::RemoveAll()
+{
+ if (m_pIndex == NULL) {
+ return;
+ }
+ _ClearIndex(m_pAllocator, m_IndexDepth, m_IndexSize, (void**)m_pIndex);
+ m_pIndex = NULL;
+ m_IndexDepth = 0;
+ m_DataSize = 0;
+}
+void* CFX_BaseSegmentedArray::Add()
+{
+ if (m_DataSize % m_SegmentSize) {
+ return GetAt(m_DataSize ++);
+ }
+ void* pSegment = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_UnitSize * m_SegmentSize);
+ if (!pSegment) {
+ return NULL;
+ }
+ if (m_pIndex == NULL) {
+ m_pIndex = pSegment;
+ m_DataSize ++;
+ return pSegment;
+ }
+ if (m_IndexDepth == 0) {
+ void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pIndex == NULL) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ return NULL;
+ }
+ FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
+ pIndex[0] = m_pIndex;
+ pIndex[1] = pSegment;
+ m_pIndex = pIndex;
+ m_DataSize ++;
+ m_IndexDepth ++;
+ return pSegment;
+ }
+ int seg_index = m_DataSize / m_SegmentSize;
+ if (seg_index % m_IndexSize) {
+ void** pIndex = GetIndex(seg_index);
+ pIndex[seg_index % m_IndexSize] = pSegment;
+ m_DataSize ++;
+ return pSegment;
+ }
+ int tree_size = 1;
+ int i;
+ for (i = 0; i < m_IndexDepth; i ++) {
+ tree_size *= m_IndexSize;
+ }
+ if (m_DataSize == tree_size * m_SegmentSize) {
+ void** pIndex = (void**)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pIndex == NULL) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ return NULL;
+ }
+ FXSYS_memset32(pIndex, 0, sizeof(void*) * m_IndexSize);
+ pIndex[0] = m_pIndex;
+ m_pIndex = pIndex;
+ m_IndexDepth ++;
+ } else {
+ tree_size /= m_IndexSize;
+ }
+ void** pSpot = (void**)m_pIndex;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ if (pSpot[seg_index / tree_size] == NULL) {
+ pSpot[seg_index / tree_size] = (void*)FX_Allocator_Alloc(m_pAllocator, void*, m_IndexSize);
+ if (pSpot[seg_index / tree_size] == NULL) {
+ break;
+ }
+ FXSYS_memset32(pSpot[seg_index / tree_size], 0, sizeof(void*) * m_IndexSize);
+ }
+ pSpot = (void**)pSpot[seg_index / tree_size];
+ seg_index = seg_index % tree_size;
+ tree_size /= m_IndexSize;
+ }
+ if (i < m_IndexDepth) {
+ FX_Allocator_Free(m_pAllocator, pSegment);
+ RemoveAll();
+ return NULL;
+ }
+ pSpot[seg_index % m_IndexSize] = pSegment;
+ m_DataSize ++;
+ return pSegment;
+}
+void** CFX_BaseSegmentedArray::GetIndex(int seg_index) const
+{
+ ASSERT(m_IndexDepth != 0);
+ if (m_IndexDepth == 1) {
+ return (void**)m_pIndex;
+ } else if (m_IndexDepth == 2) {
+ return (void**)((void**)m_pIndex)[seg_index / m_IndexSize];
+ }
+ int tree_size = 1;
+ int i;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ tree_size *= m_IndexSize;
+ }
+ void** pSpot = (void**)m_pIndex;
+ for (i = 1; i < m_IndexDepth; i ++) {
+ pSpot = (void**)pSpot[seg_index / tree_size];
+ seg_index = seg_index % tree_size;
+ tree_size /= m_IndexSize;
+ }
+ return pSpot;
+}
+void* CFX_BaseSegmentedArray::IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ for (int i = 0; i < count; i ++) {
+ if (!callback(param, (void*)(pSegment + i * m_UnitSize))) {
+ return (void*)(pSegment + i * m_UnitSize);
+ }
+ }
+ return NULL;
+}
+void* CFX_BaseSegmentedArray::IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ if (level == 0) {
+ int count = m_DataSize - start;
+ if (count > m_SegmentSize) {
+ count = m_SegmentSize;
+ }
+ start += count;
+ return IterateSegment((FX_LPCBYTE)pIndex, count, callback, param);
+ }
+ for (int i = 0; i < m_IndexSize; i ++) {
+ if (pIndex[i] == NULL) {
+ continue;
+ }
+ void* p = IterateIndex(level - 1, start, (void**)pIndex[i], callback, param);
+ if (p) {
+ return p;
+ }
+ }
+ return NULL;
+}
+void* CFX_BaseSegmentedArray::Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const
+{
+ if (m_pIndex == NULL) {
+ return NULL;
+ }
+ int start = 0;
+ return IterateIndex(m_IndexDepth, start, (void**)m_pIndex, callback, param);
+}
+void* CFX_BaseSegmentedArray::GetAt(int index) const
+{
+ if (index < 0 || index >= m_DataSize) {
+ return NULL;
+ }
+ if (m_IndexDepth == 0) {
+ return (FX_LPBYTE)m_pIndex + m_UnitSize * index;
+ }
+ int seg_index = index / m_SegmentSize;
+ return (FX_LPBYTE)GetIndex(seg_index)[seg_index % m_IndexSize] + (index % m_SegmentSize) * m_UnitSize;
+}
+void CFX_BaseSegmentedArray::Delete(int index, int count)
+{
+ if(index < 0 || count < 1 || index + count > m_DataSize) {
+ return;
+ }
+ int i;
+ for (i = index; i < m_DataSize - count; i ++) {
+ FX_BYTE* pSrc = (FX_BYTE*)GetAt(i + count);
+ FX_BYTE* pDest = (FX_BYTE*)GetAt(i);
+ for (int j = 0; j < m_UnitSize; j ++) {
+ pDest[j] = pSrc[j];
+ }
+ }
+ int new_segs = (m_DataSize - count + m_SegmentSize - 1) / m_SegmentSize;
+ int old_segs = (m_DataSize + m_SegmentSize - 1) / m_SegmentSize;
+ if (new_segs < old_segs) {
+ if(m_IndexDepth) {
+ for (i = new_segs; i < old_segs; i ++) {
+ void** pIndex = GetIndex(i);
+ FX_Allocator_Free(m_pAllocator, pIndex[i % m_IndexSize]);
+ pIndex[i % m_IndexSize] = NULL;
+ }
+ } else {
+ FX_Allocator_Free(m_pAllocator, m_pIndex);
+ m_pIndex = NULL;
+ }
+ }
+ m_DataSize -= count;
+}
diff --git a/core/src/fxcrt/fx_basic_bstring.cpp b/core/src/fxcrt/fx_basic_bstring.cpp
new file mode 100644
index 0000000000..f28b069efc
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_bstring.cpp
@@ -0,0 +1,1204 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+static int _Buffer_itoa(char* buf, int i, FX_DWORD flags)
+{
+ if (i == 0) {
+ buf[0] = '0';
+ return 1;
+ }
+ char buf1[32];
+ int buf_pos = 31;
+ FX_DWORD u = i;
+ if ((flags & FXFORMAT_SIGNED) && i < 0) {
+ u = -i;
+ }
+ int base = 10;
+ FX_LPCSTR string = "0123456789abcdef";
+ if (flags & FXFORMAT_HEX) {
+ base = 16;
+ if (flags & FXFORMAT_CAPITAL) {
+ string = "0123456789ABCDEF";
+ }
+ }
+ while (u != 0) {
+ buf1[buf_pos--] = string[u % base];
+ u = u / base;
+ }
+ if ((flags & FXFORMAT_SIGNED) && i < 0) {
+ buf1[buf_pos--] = '-';
+ }
+ int len = 31 - buf_pos;
+ for (int ii = 0; ii < len; ii ++) {
+ buf[ii] = buf1[ii + buf_pos + 1];
+ }
+ return len;
+}
+CFX_ByteString CFX_ByteString::FormatInteger(int i, FX_DWORD flags)
+{
+ char buf[32];
+ return CFX_ByteStringC(buf, _Buffer_itoa(buf, i, flags));
+}
+static CFX_StringData* FX_AllocString(int nLen)
+{
+ if (nLen == 0) {
+ return NULL;
+ }
+ CFX_StringData* pData = (CFX_StringData*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(char));
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_nAllocLength = nLen;
+ pData->m_nDataLength = nLen;
+ pData->m_nRefs = 1;
+ pData->m_String[nLen] = 0;
+ return pData;
+}
+static void FX_ReleaseString(CFX_StringData* pData)
+{
+ if (pData == NULL) {
+ return;
+ }
+ pData->m_nRefs --;
+ if (pData->m_nRefs <= 0) {
+ FX_Free(pData);
+ }
+}
+CFX_ByteString::~CFX_ByteString()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ m_pData->m_nRefs --;
+ if (m_pData->m_nRefs < 1) {
+ FX_Free(m_pData);
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_LPCSTR lpsz, FX_STRSIZE nLen)
+{
+ if (nLen < 0) {
+ nLen = lpsz ? (FX_STRSIZE)FXSYS_strlen(lpsz) : 0;
+ }
+ if (nLen) {
+ m_pData = FX_AllocString(nLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_LPCBYTE lpsz, FX_STRSIZE nLen)
+{
+ if (nLen > 0) {
+ m_pData = FX_AllocString(nLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_ByteString::CFX_ByteString(char ch)
+{
+ m_pData = FX_AllocString(1);
+ if (m_pData) {
+ m_pData->m_String[0] = ch;
+ }
+}
+CFX_ByteString::CFX_ByteString(const CFX_ByteString& stringSrc)
+{
+ if (stringSrc.m_pData == NULL) {
+ m_pData = NULL;
+ return;
+ }
+ if (stringSrc.m_pData->m_nRefs >= 0) {
+ m_pData = stringSrc.m_pData;
+ m_pData->m_nRefs ++;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_BSTR stringSrc)
+{
+ if (stringSrc.IsEmpty()) {
+ m_pData = NULL;
+ return;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_ByteString::CFX_ByteString(FX_BSTR str1, FX_BSTR str2)
+{
+ m_pData = NULL;
+ int nNewLen = str1.GetLength() + str2.GetLength();
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocString(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str1.GetCStr(), str1.GetLength());
+ FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetCStr(), str2.GetLength());
+ }
+}
+const CFX_ByteString& CFX_ByteString::operator=(FX_LPCSTR lpsz)
+{
+ if (lpsz == NULL || lpsz[0] == 0) {
+ Empty();
+ } else {
+ AssignCopy((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(FX_BSTR str)
+{
+ if (str.IsEmpty()) {
+ Empty();
+ } else {
+ AssignCopy(str.GetLength(), str.GetCStr());
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(const CFX_ByteString& stringSrc)
+{
+ if (m_pData == stringSrc.m_pData) {
+ return *this;
+ }
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else if ((m_pData && m_pData->m_nRefs < 0) ||
+ (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
+ AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
+ } else {
+ Empty();
+ m_pData = stringSrc.m_pData;
+ if (m_pData) {
+ m_pData->m_nRefs ++;
+ }
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator=(const CFX_BinaryBuf& buf)
+{
+ Load(buf.GetBuffer(), buf.GetSize());
+ return *this;
+}
+void CFX_ByteString::Load(FX_LPCBYTE buf, FX_STRSIZE len)
+{
+ Empty();
+ if (len) {
+ m_pData = FX_AllocString(len);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, buf, len * sizeof(char));
+ }
+ } else {
+ m_pData = NULL;
+ }
+}
+const CFX_ByteString& CFX_ByteString::operator+=(FX_LPCSTR lpsz)
+{
+ if (lpsz) {
+ ConcatInPlace((FX_STRSIZE)FXSYS_strlen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(char ch)
+{
+ ConcatInPlace(1, &ch);
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteString& string)
+{
+ if (string.m_pData == NULL) {
+ return *this;
+ }
+ ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
+ return *this;
+}
+const CFX_ByteString& CFX_ByteString::operator+=(FX_BSTR string)
+{
+ if (string.IsEmpty()) {
+ return *this;
+ }
+ ConcatInPlace(string.GetLength(), string.GetCStr());
+ return *this;
+}
+bool CFX_ByteString::Equal(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ return m_pData->m_nDataLength == str.GetLength() &&
+ FXSYS_memcmp32(m_pData->m_String, str.GetCStr(), str.GetLength()) == 0;
+}
+bool CFX_ByteString::operator ==(const CFX_ByteString& s2) const
+{
+ if (m_pData == NULL) {
+ return s2.IsEmpty();
+ }
+ if (s2.m_pData == NULL) {
+ return false;
+ }
+ return m_pData->m_nDataLength == s2.m_pData->m_nDataLength &&
+ FXSYS_memcmp32(m_pData->m_String, s2.m_pData->m_String, m_pData->m_nDataLength) == 0;
+}
+void CFX_ByteString::Empty()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_pData->m_nRefs > 1) {
+ m_pData->m_nRefs --;
+ } else {
+ FX_Free(m_pData);
+ }
+ m_pData = NULL;
+}
+bool CFX_ByteString::EqualNoCase(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ FX_STRSIZE len = str.GetLength();
+ if (m_pData->m_nDataLength != len) {
+ return false;
+ }
+ FX_LPCBYTE pThis = (FX_LPCBYTE)m_pData->m_String;
+ FX_LPCBYTE pThat = (FX_LPCBYTE)str;
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ if ((*pThis) != (*pThat)) {
+ FX_BYTE bThis = *pThis;
+ if (bThis >= 'A' && bThis <= 'Z') {
+ bThis += 'a' - 'A';
+ }
+ FX_BYTE bThat = *pThat;
+ if (bThat >= 'A' && bThat <= 'Z') {
+ bThat += 'a' - 'A';
+ }
+ if (bThis != bThat) {
+ return false;
+ }
+ }
+ pThis ++;
+ pThat ++;
+ }
+ return true;
+}
+void CFX_ByteString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
+{
+ AllocBeforeWrite(nSrcLen);
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
+ m_pData->m_nDataLength = nSrcLen;
+ m_pData->m_String[nSrcLen] = 0;
+}
+void CFX_ByteString::CopyBeforeWrite()
+{
+ if (m_pData == NULL || m_pData->m_nRefs <= 1) {
+ return;
+ }
+ CFX_StringData* pData = m_pData;
+ m_pData->m_nRefs --;
+ FX_STRSIZE nDataLength = pData->m_nDataLength;
+ m_pData = FX_AllocString(nDataLength);
+ if (m_pData != NULL) {
+ FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(char));
+ }
+}
+void CFX_ByteString::AllocBeforeWrite(FX_STRSIZE nLen)
+{
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
+ return;
+ }
+ Empty();
+ m_pData = FX_AllocString(nLen);
+}
+void CFX_ByteString::ReleaseBuffer(FX_STRSIZE nNewLength)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (nNewLength == -1) {
+ nNewLength = (FX_STRSIZE)FXSYS_strlen((FX_LPCSTR)m_pData->m_String);
+ }
+ if (nNewLength == 0) {
+ Empty();
+ return;
+ }
+ FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
+ m_pData->m_nDataLength = nNewLength;
+ m_pData->m_String[nNewLength] = 0;
+}
+FX_LPSTR CFX_ByteString::LockBuffer()
+{
+ if (m_pData == NULL) {
+ return NULL;
+ }
+ FX_LPSTR lpsz = GetBuffer(0);
+ m_pData->m_nRefs = -1;
+ return lpsz;
+}
+void CFX_ByteString::Reserve(FX_STRSIZE len)
+{
+ GetBuffer(len);
+ ReleaseBuffer(GetLength());
+}
+FX_LPSTR CFX_ByteString::GetBuffer(FX_STRSIZE nMinBufLength)
+{
+ if (m_pData == NULL && nMinBufLength == 0) {
+ return NULL;
+ }
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
+ return m_pData->m_String;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocString(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ m_pData->m_nDataLength = 0;
+ m_pData->m_String[0] = 0;
+ return m_pData->m_String;
+ }
+ CFX_StringData* pOldData = m_pData;
+ FX_STRSIZE nOldLen = pOldData->m_nDataLength;
+ if (nMinBufLength < nOldLen) {
+ nMinBufLength = nOldLen;
+ }
+ m_pData = FX_AllocString(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(char));
+ m_pData->m_nDataLength = nOldLen;
+ pOldData->m_nRefs --;
+ if (pOldData->m_nRefs <= 0) {
+ FX_Free(pOldData);
+ }
+ return m_pData->m_String;
+}
+FX_STRSIZE CFX_ByteString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ if (nCount > 0 && nIndex < nOldLength) {
+ FX_STRSIZE mLength = nIndex + nCount;
+ if (mLength >= nOldLength) {
+ m_pData->m_nDataLength = nIndex;
+ return m_pData->m_nDataLength;
+ }
+ CopyBeforeWrite();
+ int nBytesToCopy = nOldLength - mLength + 1;
+ FXSYS_memmove32(m_pData->m_String + nIndex,
+ m_pData->m_String + mLength, nBytesToCopy * sizeof(char));
+ m_pData->m_nDataLength = nOldLength - nCount;
+ }
+ return m_pData->m_nDataLength;
+}
+void CFX_ByteString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData)
+{
+ if (nSrcLen == 0 || lpszSrcData == NULL) {
+ return;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocString(nSrcLen);
+ if (!m_pData) {
+ return;
+ }
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(char));
+ return;
+ }
+ if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
+ CFX_StringData* pOldData = m_pData;
+ ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
+ FX_ReleaseString(pOldData);
+ } else {
+ FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(char));
+ m_pData->m_nDataLength += nSrcLen;
+ m_pData->m_String[m_pData->m_nDataLength] = 0;
+ }
+}
+void CFX_ByteString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data,
+ FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data)
+{
+ int nNewLen = nSrc1Len + nSrc2Len;
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocString(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(char));
+ FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(char));
+ }
+}
+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ return Mid(nFirst, m_pData->m_nDataLength - nFirst);
+}
+CFX_ByteString CFX_ByteString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
+{
+ if (nFirst < 0) {
+ nFirst = 0;
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nFirst + nCount > m_pData->m_nDataLength) {
+ nCount = m_pData->m_nDataLength - nFirst;
+ }
+ if (nFirst > m_pData->m_nDataLength) {
+ nCount = 0;
+ }
+ if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, nFirst, 0);
+ return dest;
+}
+void CFX_ByteString::AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
+ FX_STRSIZE nExtraLen) const
+{
+ FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
+ if (nNewLen == 0) {
+ return;
+ }
+ ASSERT(dest.m_pData == NULL);
+ dest.m_pData = FX_AllocString(nNewLen);
+ if (dest.m_pData) {
+ FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(char));
+ }
+}
+#define FORCE_ANSI 0x10000
+#define FORCE_UNICODE 0x20000
+#define FORCE_INT64 0x40000
+void CFX_ByteString::FormatV(FX_LPCSTR lpszFormat, va_list argList)
+{
+ va_list argListSave;
+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
+ va_copy(argListSave, argList);
+#else
+ argListSave = argList;
+#endif
+ int nMaxLen = 0;
+ for (FX_LPCSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
+ if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
+ nMaxLen += (FX_STRSIZE)FXSYS_strlen(lpsz);
+ continue;
+ }
+ int nItemLen = 0;
+ int nWidth = 0;
+ for (; *lpsz != 0; lpsz ++) {
+ if (*lpsz == '#') {
+ nMaxLen += 2;
+ } else if (*lpsz == '*') {
+ nWidth = va_arg(argList, int);
+ } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
+ *lpsz == ' ')
+ ;
+ else {
+ break;
+ }
+ }
+ if (nWidth == 0) {
+ nWidth = FXSYS_atoi(lpsz);
+ for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ if (nWidth < 0 || nWidth > 128 * 1024) {
+ lpszFormat = "Bad width";
+ nMaxLen = 10;
+ break;
+ }
+ int nPrecision = 0;
+ if (*lpsz == '.') {
+ lpsz ++;
+ if (*lpsz == '*') {
+ nPrecision = va_arg(argList, int);
+ lpsz ++;
+ } else {
+ nPrecision = FXSYS_atoi(lpsz);
+ for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ }
+ if (nPrecision < 0 || nPrecision > 128 * 1024) {
+ lpszFormat = "Bad precision";
+ nMaxLen = 14;
+ break;
+ }
+ int nModifier = 0;
+ if (FXSYS_strncmp(lpsz, "I64", 3) == 0) {
+ lpsz += 3;
+ nModifier = FORCE_INT64;
+ } else {
+ switch (*lpsz) {
+ case 'h':
+ nModifier = FORCE_ANSI;
+ lpsz ++;
+ break;
+ case 'l':
+ nModifier = FORCE_UNICODE;
+ lpsz ++;
+ break;
+ case 'F':
+ case 'N':
+ case 'L':
+ lpsz ++;
+ break;
+ }
+ }
+ switch (*lpsz | nModifier) {
+ case 'c':
+ case 'C':
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_ANSI:
+ case 'C'|FORCE_ANSI:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_UNICODE:
+ case 'C'|FORCE_UNICODE:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 's': {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 'S': {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_ANSI:
+ case 'S'|FORCE_ANSI: {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_UNICODE:
+ case 'S'|FORCE_UNICODE: {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ }
+ if (nItemLen != 0) {
+ if (nPrecision != 0 && nItemLen > nPrecision) {
+ nItemLen = nPrecision;
+ }
+ if (nItemLen < nWidth) {
+ nItemLen = nWidth;
+ }
+ } else {
+ switch (*lpsz) {
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'o':
+ if (nModifier & FORCE_INT64) {
+ va_arg(argList, FX_INT64);
+ } else {
+ va_arg(argList, int);
+ }
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'a':
+ case 'A':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ va_arg(argList, double);
+ nItemLen = 128;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'f':
+ if (nWidth + nPrecision > 100) {
+ nItemLen = nPrecision + nWidth + 128;
+ } else {
+ double f;
+ char pszTemp[256];
+ f = va_arg(argList, double);
+ FXSYS_sprintf(pszTemp, "%*.*f", nWidth, nPrecision + 6, f );
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
+ }
+ break;
+ case 'p':
+ va_arg(argList, void*);
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'n':
+ va_arg(argList, int*);
+ break;
+ }
+ }
+ nMaxLen += nItemLen;
+ }
+ GetBuffer(nMaxLen);
+ if (m_pData) {
+ FXSYS_vsprintf(m_pData->m_String, lpszFormat, argListSave);
+ ReleaseBuffer();
+ }
+ va_end(argListSave);
+}
+void CFX_ByteString::Format(FX_LPCSTR lpszFormat, ...)
+{
+ va_list argList;
+ va_start(argList, lpszFormat);
+ FormatV(lpszFormat, argList);
+ va_end(argList);
+}
+FX_STRSIZE CFX_ByteString::Insert(FX_STRSIZE nIndex, FX_CHAR ch)
+{
+ CopyBeforeWrite();
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nNewLength = m_pData ? m_pData->m_nDataLength : 0;
+ if (nIndex > nNewLength) {
+ nIndex = nNewLength;
+ }
+ nNewLength++;
+ if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
+ CFX_StringData* pOldData = m_pData;
+ FX_LPCSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocString(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ if(pOldData != NULL) {
+ FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(char));
+ FX_ReleaseString(pOldData);
+ } else {
+ m_pData->m_String[0] = 0;
+ }
+ }
+ FXSYS_memmove32(m_pData->m_String + nIndex + 1,
+ m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(char));
+ m_pData->m_String[nIndex] = ch;
+ m_pData->m_nDataLength = nNewLength;
+ return nNewLength;
+}
+CFX_ByteString CFX_ByteString::Right(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
+ return dest;
+}
+CFX_ByteString CFX_ByteString::Left(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_ByteString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_ByteString dest;
+ AllocCopy(dest, nCount, 0, 0);
+ return dest;
+}
+FX_STRSIZE CFX_ByteString::Find(FX_CHAR ch, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart >= nLength) {
+ return -1;
+ }
+ FX_LPCSTR lpsz = FXSYS_strchr(m_pData->m_String + nStart, ch);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+FX_STRSIZE CFX_ByteString::ReverseFind(FX_CHAR ch) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ while (nLength) {
+ if (m_pData->m_String[nLength - 1] == ch) {
+ return nLength - 1;
+ }
+ nLength --;
+ }
+ return -1;
+}
+FX_LPCSTR FX_strstr(FX_LPCSTR str1, int len1, FX_LPCSTR str2, int len2)
+{
+ if (len2 > len1 || len2 == 0) {
+ return NULL;
+ }
+ FX_LPCSTR end_ptr = str1 + len1 - len2;
+ while (str1 <= end_ptr) {
+ int i = 0;
+ while (1) {
+ if (str1[i] != str2[i]) {
+ break;
+ }
+ i ++;
+ if (i == len2) {
+ return str1;
+ }
+ }
+ str1 ++;
+ }
+ return NULL;
+}
+FX_STRSIZE CFX_ByteString::Find(FX_BSTR lpszSub, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart > nLength) {
+ return -1;
+ }
+ FX_LPCSTR lpsz = FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,
+ lpszSub.GetCStr(), lpszSub.GetLength());
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+void CFX_ByteString::MakeLower()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_strlwr(m_pData->m_String);
+}
+void CFX_ByteString::MakeUpper()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_strupr(m_pData->m_String);
+}
+FX_STRSIZE CFX_ByteString::Remove(FX_CHAR chRemove)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return 0;
+ }
+ FX_LPSTR pstrSource = m_pData->m_String;
+ FX_LPSTR pstrDest = m_pData->m_String;
+ FX_LPSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (pstrSource < pstrEnd) {
+ if (*pstrSource != chRemove) {
+ *pstrDest = *pstrSource;
+ pstrDest ++;
+ }
+ pstrSource ++;
+ }
+ *pstrDest = 0;
+ FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
+ m_pData->m_nDataLength -= nCount;
+ return nCount;
+}
+FX_STRSIZE CFX_ByteString::Replace(FX_BSTR lpszOld, FX_BSTR lpszNew)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ if (lpszOld.IsEmpty()) {
+ return 0;
+ }
+ FX_STRSIZE nSourceLen = lpszOld.GetLength();
+ FX_STRSIZE nReplacementLen = lpszNew.GetLength();
+ FX_STRSIZE nCount = 0;
+ FX_LPCSTR pStart = m_pData->m_String;
+ FX_LPSTR pEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (1) {
+ FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
+ if (pTarget == NULL) {
+ break;
+ }
+ nCount++;
+ pStart = pTarget + nSourceLen;
+ }
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_STRSIZE nNewLength = m_pData->m_nDataLength + (nReplacementLen - nSourceLen) * nCount;
+ if (nNewLength == 0) {
+ Empty();
+ return nCount;
+ }
+ CFX_StringData* pNewData = FX_AllocString(nNewLength);
+ if (!pNewData) {
+ return 0;
+ }
+ pStart = m_pData->m_String;
+ FX_LPSTR pDest = pNewData->m_String;
+ for (FX_STRSIZE i = 0; i < nCount; i ++) {
+ FX_LPCSTR pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart), lpszOld.GetCStr(), nSourceLen);
+ FXSYS_memcpy32(pDest, pStart, pTarget - pStart);
+ pDest += pTarget - pStart;
+ FXSYS_memcpy32(pDest, lpszNew.GetCStr(), lpszNew.GetLength());
+ pDest += lpszNew.GetLength();
+ pStart = pTarget + nSourceLen;
+ }
+ FXSYS_memcpy32(pDest, pStart, pEnd - pStart);
+ FX_ReleaseString(m_pData);
+ m_pData = pNewData;
+ return nCount;
+}
+void CFX_ByteString::SetAt(FX_STRSIZE nIndex, FX_CHAR ch)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ FXSYS_assert(nIndex >= 0);
+ FXSYS_assert(nIndex < m_pData->m_nDataLength);
+ CopyBeforeWrite();
+ m_pData->m_String[nIndex] = ch;
+}
+CFX_ByteString CFX_ByteString::LoadFromFile(FX_BSTR filename)
+{
+ FXSYS_FILE* file = FXSYS_fopen(CFX_ByteString(filename), "rb");
+ if (file == NULL) {
+ return CFX_ByteString();
+ }
+ FXSYS_fseek(file, 0, FXSYS_SEEK_END);
+ int len = FXSYS_ftell(file);
+ FXSYS_fseek(file, 0, FXSYS_SEEK_SET);
+ CFX_ByteString str;
+ FX_LPSTR buf = str.GetBuffer(len);
+ size_t readCnt = FXSYS_fread(buf, 1, len, file);
+ str.ReleaseBuffer(len);
+ FXSYS_fclose(file);
+ return str;
+}
+CFX_WideString CFX_ByteString::UTF8Decode() const
+{
+ CFX_UTF8Decoder decoder;
+ for (FX_STRSIZE i = 0; i < GetLength(); i ++) {
+ decoder.Input((FX_BYTE)m_pData->m_String[i]);
+ }
+ return decoder.GetResult();
+}
+CFX_ByteString CFX_ByteString::FromUnicode(FX_LPCWSTR str, FX_STRSIZE len)
+{
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(str);
+ }
+ CFX_ByteString bstr;
+ bstr.ConvertFrom(CFX_WideString(str, len));
+ return bstr;
+}
+CFX_ByteString CFX_ByteString::FromUnicode(const CFX_WideString& str)
+{
+ return FromUnicode((FX_LPCWSTR)str, str.GetLength());
+}
+void CFX_ByteString::ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap)
+{
+ if (pCharMap == NULL) {
+ pCharMap = CFX_CharMap::GetDefaultMapper();
+ }
+ *this = (*pCharMap->m_GetByteString)(pCharMap, str);
+}
+int CFX_ByteString::Compare(FX_BSTR str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty() ? 0 : -1;
+ }
+ int this_len = m_pData->m_nDataLength;
+ int that_len = str.GetLength();
+ int min_len = this_len < that_len ? this_len : that_len;
+ for (int i = 0; i < min_len; i ++) {
+ if ((FX_BYTE)m_pData->m_String[i] < str.GetAt(i)) {
+ return -1;
+ } else if ((FX_BYTE)m_pData->m_String[i] > str.GetAt(i)) {
+ return 1;
+ }
+ }
+ if (this_len < that_len) {
+ return -1;
+ } else if (this_len > that_len) {
+ return 1;
+ }
+ return 0;
+}
+void CFX_ByteString::TrimRight(FX_BSTR lpszTargets)
+{
+ if (m_pData == NULL || lpszTargets.IsEmpty()) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE pos = GetLength();
+ if (pos < 1) {
+ return;
+ }
+ while (pos) {
+ FX_STRSIZE i = 0;
+ while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos - 1]) {
+ i ++;
+ }
+ if (i == lpszTargets.GetLength()) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < m_pData->m_nDataLength) {
+ m_pData->m_String[pos] = 0;
+ m_pData->m_nDataLength = pos;
+ }
+}
+void CFX_ByteString::TrimRight(FX_CHAR chTarget)
+{
+ TrimRight(CFX_ByteStringC(chTarget));
+}
+void CFX_ByteString::TrimRight()
+{
+ TrimRight(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
+}
+void CFX_ByteString::TrimLeft(FX_BSTR lpszTargets)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (lpszTargets.IsEmpty()) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE len = GetLength();
+ if (len < 1) {
+ return;
+ }
+ FX_STRSIZE pos = 0;
+ while (pos < len) {
+ FX_STRSIZE i = 0;
+ while (i < lpszTargets.GetLength() && lpszTargets[i] != m_pData->m_String[pos]) {
+ i ++;
+ }
+ if (i == lpszTargets.GetLength()) {
+ break;
+ }
+ pos ++;
+ }
+ if (pos) {
+ FX_STRSIZE nDataLength = len - pos;
+ FXSYS_memmove32(m_pData->m_String, m_pData->m_String + pos, (nDataLength + 1)*sizeof(FX_CHAR));
+ m_pData->m_nDataLength = nDataLength;
+ }
+}
+void CFX_ByteString::TrimLeft(FX_CHAR chTarget)
+{
+ TrimLeft(CFX_ByteStringC(chTarget));
+}
+void CFX_ByteString::TrimLeft()
+{
+ TrimLeft(FX_BSTRC("\x09\x0a\x0b\x0c\x0d\x20"));
+}
+FX_DWORD CFX_ByteString::GetID(FX_STRSIZE start_pos) const
+{
+ return CFX_ByteStringC(*this).GetID(start_pos);
+}
+FX_DWORD CFX_ByteStringC::GetID(FX_STRSIZE start_pos) const
+{
+ if (m_Length == 0) {
+ return 0;
+ }
+ if (start_pos >= m_Length) {
+ return 0;
+ }
+ FX_DWORD strid = 0;
+ if (start_pos + 4 > m_Length) {
+ for (FX_STRSIZE i = 0; i < m_Length - start_pos; i ++) {
+ strid = strid * 256 + m_Ptr[start_pos + i];
+ }
+ strid = strid << ((4 - m_Length + start_pos) * 8);
+ } else {
+ for (int i = 0; i < 4; i ++) {
+ strid = strid * 256 + m_Ptr[start_pos + i];
+ }
+ }
+ return strid;
+}
+FX_STRSIZE FX_ftoa(FX_FLOAT d, FX_LPSTR buf)
+{
+ buf[0] = '0';
+ buf[1] = '\0';
+ if (d == 0.0f) {
+ return 1;
+ }
+ FX_BOOL bNegative = FALSE;
+ if (d < 0) {
+ bNegative = TRUE;
+ d = -d;
+ }
+ int scale = 1;
+ int scaled = FXSYS_round(d);
+ while (scaled < 100000) {
+ if (scale == 1000000) {
+ break;
+ }
+ scale *= 10;
+ scaled = FXSYS_round(d * scale);
+ }
+ if (scaled == 0) {
+ return 1;
+ }
+ char buf2[32];
+ int buf_size = 0;
+ if (bNegative) {
+ buf[buf_size++] = '-';
+ }
+ int i = scaled / scale;
+ FXSYS_itoa(i, buf2, 10);
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf2);
+ FXSYS_memcpy32(buf + buf_size, buf2, len);
+ buf_size += len;
+ int fraction = scaled % scale;
+ if (fraction == 0) {
+ return buf_size;
+ }
+ buf[buf_size++] = '.';
+ scale /= 10;
+ while (fraction) {
+ buf[buf_size++] = '0' + fraction / scale;
+ fraction %= scale;
+ scale /= 10;
+ }
+ return buf_size;
+}
+CFX_ByteString CFX_ByteString::FormatFloat(FX_FLOAT d, int precision)
+{
+ FX_CHAR buf[32];
+ FX_STRSIZE len = FX_ftoa(d, buf);
+ return CFX_ByteString(buf, len);
+}
+void CFX_StringBufBase::Copy(FX_BSTR str)
+{
+ m_Size = str.GetLength();
+ if (m_Size > m_Limit) {
+ m_Size = m_Limit;
+ }
+ FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
+ FXSYS_memcpy32(pBuffer, str.GetPtr(), m_Size);
+}
+void CFX_StringBufBase::Append(FX_BSTR str)
+{
+ int len = str.GetLength();
+ if (len > m_Limit - m_Size) {
+ len = m_Limit - m_Size;
+ }
+ FX_CHAR* pBuffer = (FX_CHAR*)(this + 1);
+ FXSYS_memcpy32(pBuffer + m_Size, str.GetPtr(), len);
+ m_Size += len;
+}
+void CFX_StringBufBase::Append(int i, FX_DWORD flags)
+{
+ char buf[32];
+ int len = _Buffer_itoa(buf, i, flags);
+ Append(CFX_ByteStringC(buf, len));
+}
+void CFX_ByteStringL::Empty(IFX_Allocator* pAllocator)
+{
+ if (m_Ptr) {
+ FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
+ }
+ m_Ptr = NULL, m_Length = 0;
+}
+FX_LPSTR CFX_ByteStringL::AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, length + 1);
+ if (!str) {
+ return NULL;
+ }
+ *(FX_LPSTR*)(&m_Ptr) = str;
+ m_Length = length;
+ return str;
+}
+void CFX_ByteStringL::Set(FX_BSTR src, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ if (src.GetCStr() != NULL && src.GetLength() > 0) {
+ FX_LPSTR str = FX_Allocator_Alloc(pAllocator, FX_CHAR, src.GetLength() + 1);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, src, src.GetLength());
+ str[src.GetLength()] = '\0';
+ *(FX_LPSTR*)(&m_Ptr) = str;
+ m_Length = src.GetLength();
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_buffer.cpp b/core/src/fxcrt/fx_basic_buffer.cpp
new file mode 100644
index 0000000000..ef3cd21350
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_buffer.cpp
@@ -0,0 +1,574 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
+CFX_BinaryBuf::CFX_BinaryBuf(IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_AllocStep(0)
+ , m_pBuffer(NULL)
+ , m_DataSize(0)
+ , m_AllocSize(0)
+{
+}
+CFX_BinaryBuf::CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_AllocStep(0)
+ , m_DataSize(size)
+ , m_AllocSize(size)
+{
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, size);
+}
+CFX_BinaryBuf::~CFX_BinaryBuf()
+{
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+}
+void CFX_BinaryBuf::Delete(int start_index, int count)
+{
+ if (!m_pBuffer || start_index < 0 || start_index + count > m_DataSize) {
+ return;
+ }
+ FXSYS_memmove32(m_pBuffer + start_index, m_pBuffer + start_index + count, m_DataSize - start_index - count);
+ m_DataSize -= count;
+}
+void CFX_BinaryBuf::Clear()
+{
+ m_DataSize = 0;
+}
+void CFX_BinaryBuf::DetachBuffer()
+{
+ m_DataSize = 0;
+ m_pBuffer = NULL;
+ m_AllocSize = 0;
+}
+void CFX_BinaryBuf::AttachData(void* buffer, FX_STRSIZE size)
+{
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+ m_DataSize = size;
+ m_pBuffer = (FX_LPBYTE)buffer;
+ m_AllocSize = size;
+}
+void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other)
+{
+ AttachData(other.GetBuffer(), other.GetSize());
+ other.DetachBuffer();
+}
+void CFX_BinaryBuf::EstimateSize(FX_STRSIZE size, FX_STRSIZE step)
+{
+ m_AllocStep = step;
+ if (m_AllocSize >= size) {
+ return;
+ }
+ ExpandBuf(size - m_DataSize);
+}
+void CFX_BinaryBuf::ExpandBuf(FX_STRSIZE add_size)
+{
+ FX_STRSIZE new_size = add_size + m_DataSize;
+ if (m_AllocSize >= new_size) {
+ return;
+ }
+ int alloc_step;
+ if (m_AllocStep == 0) {
+ alloc_step = m_AllocSize / 4;
+ if (alloc_step < 128 ) {
+ alloc_step = 128;
+ }
+ } else {
+ alloc_step = m_AllocStep;
+ }
+ new_size = (new_size + alloc_step - 1) / alloc_step * alloc_step;
+ FX_LPBYTE pNewBuffer = m_pBuffer;
+ if (pNewBuffer) {
+ pNewBuffer = FX_Allocator_Realloc(m_pAllocator, FX_BYTE, m_pBuffer, new_size);
+ } else {
+ pNewBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, new_size);
+ }
+ if (pNewBuffer) {
+ m_pBuffer = pNewBuffer;
+ m_AllocSize = new_size;
+ }
+}
+void CFX_BinaryBuf::CopyData(const void* pStr, FX_STRSIZE size)
+{
+ if (size == 0) {
+ m_DataSize = 0;
+ return;
+ }
+ if (m_AllocSize < size) {
+ ExpandBuf(size - m_DataSize);
+ }
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memcpy32(m_pBuffer, pStr, size);
+ m_DataSize = size;
+}
+void CFX_BinaryBuf::AppendBlock(const void* pBuf, FX_STRSIZE size)
+{
+ ExpandBuf(size);
+ if (pBuf && m_pBuffer) {
+ FXSYS_memcpy32(m_pBuffer + m_DataSize, pBuf, size);
+ }
+ m_DataSize += size;
+}
+void CFX_BinaryBuf::InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size)
+{
+ ExpandBuf(size);
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memmove32(m_pBuffer + pos + size, m_pBuffer + pos, m_DataSize - pos);
+ if (pBuf) {
+ FXSYS_memcpy32(m_pBuffer + pos, pBuf, size);
+ }
+ m_DataSize += size;
+}
+void CFX_BinaryBuf::AppendFill(FX_BYTE byte, FX_STRSIZE count)
+{
+ ExpandBuf(count);
+ if (!m_pBuffer) {
+ return;
+ }
+ FXSYS_memset8(m_pBuffer + m_DataSize, byte, count);
+ m_DataSize += count;
+}
+CFX_ByteStringC CFX_BinaryBuf::GetByteString() const
+{
+ return CFX_ByteStringC(m_pBuffer, m_DataSize);
+}
+void CFX_BinaryBuf::GetByteStringL(CFX_ByteStringL &str) const
+{
+ str.Set(CFX_ByteStringC(m_pBuffer, m_DataSize), m_pAllocator);
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_BSTR lpsz)
+{
+ AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (int i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (FX_DWORD i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ AppendBlock(buf, (FX_STRSIZE)FXSYS_strlen(buf));
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (double f)
+{
+ char buf[32];
+ FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
+ AppendBlock(buf, len);
+ return *this;
+}
+CFX_ByteTextBuf& CFX_ByteTextBuf::operator << (const CFX_ByteTextBuf& buf)
+{
+ AppendBlock(buf.m_pBuffer, buf.m_DataSize);
+ return *this;
+}
+void CFX_ByteTextBuf::operator =(const CFX_ByteStringC& str)
+{
+ CopyData((FX_LPCBYTE)str, str.GetLength());
+}
+void CFX_WideTextBuf::AppendChar(FX_WCHAR ch)
+{
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)sizeof(FX_WCHAR)) {
+ ExpandBuf(sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ *(FX_WCHAR*)(m_pBuffer + m_DataSize) = ch;
+ m_DataSize += sizeof(FX_WCHAR);
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_WSTR str)
+{
+ AppendBlock(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideString &str)
+{
+ AppendBlock((FX_LPCWSTR)str, str.GetLength() * sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (int i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_strlen(buf);
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
+ ExpandBuf(len * sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
+ for (FX_STRSIZE j = 0; j < len; j ++) {
+ *str ++ = buf[j];
+ }
+ m_DataSize += len * sizeof(FX_WCHAR);
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (double f)
+{
+ char buf[32];
+ FX_STRSIZE len = FX_ftoa((FX_FLOAT)f, buf);
+ if (m_AllocSize < m_DataSize + (FX_STRSIZE)(len * sizeof(FX_WCHAR))) {
+ ExpandBuf(len * sizeof(FX_WCHAR));
+ }
+ ASSERT(m_pBuffer != NULL);
+ FX_LPWSTR str = (FX_WCHAR*)(m_pBuffer + m_DataSize);
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ *str ++ = buf[i];
+ }
+ m_DataSize += len * sizeof(FX_WCHAR);
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (FX_LPCWSTR lpsz)
+{
+ AppendBlock(lpsz, (FX_STRSIZE)FXSYS_wcslen(lpsz)*sizeof(FX_WCHAR));
+ return *this;
+}
+CFX_WideTextBuf& CFX_WideTextBuf::operator << (const CFX_WideTextBuf& buf)
+{
+ AppendBlock(buf.m_pBuffer, buf.m_DataSize);
+ return *this;
+}
+void CFX_WideTextBuf::operator =(FX_WSTR str)
+{
+ CopyData(str.GetPtr(), str.GetLength() * sizeof(FX_WCHAR));
+}
+CFX_WideStringC CFX_WideTextBuf::GetWideString() const
+{
+ return CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR));
+}
+void CFX_WideTextBuf::GetWideStringL(CFX_WideStringL& wideText) const
+{
+ wideText.Set(CFX_WideStringC((FX_LPCWSTR)m_pBuffer, m_DataSize / sizeof(FX_WCHAR)), m_pAllocator);
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BYTE i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, 1);
+ } else {
+ m_SavingBuf.AppendByte(i);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (int i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, sizeof(int));
+ } else {
+ m_SavingBuf.AppendBlock(&i, sizeof(int));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_DWORD i)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&i, sizeof(FX_DWORD));
+ } else {
+ m_SavingBuf.AppendBlock(&i, sizeof(FX_DWORD));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_FLOAT f)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(&f, sizeof(FX_FLOAT));
+ } else {
+ m_SavingBuf.AppendBlock(&f, sizeof(FX_FLOAT));
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_BSTR bstr)
+{
+ int len = bstr.GetLength();
+ if (m_pStream) {
+ m_pStream->WriteBlock(&len, sizeof(int));
+ m_pStream->WriteBlock(bstr, len);
+ } else {
+ m_SavingBuf.AppendBlock(&len, sizeof(int));
+ m_SavingBuf.AppendBlock(bstr, len);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (FX_LPCWSTR wstr)
+{
+ FX_STRSIZE len = (FX_STRSIZE)FXSYS_wcslen(wstr);
+ if (m_pStream) {
+ m_pStream->WriteBlock(&len, sizeof(int));
+ m_pStream->WriteBlock(wstr, len);
+ } else {
+ m_SavingBuf.AppendBlock(&len, sizeof(int));
+ m_SavingBuf.AppendBlock(wstr, len);
+ }
+ return *this;
+}
+CFX_ArchiveSaver& CFX_ArchiveSaver::operator << (const CFX_WideString& wstr)
+{
+ CFX_ByteString encoded = wstr.UTF16LE_Encode();
+ return operator << (encoded);
+}
+void CFX_ArchiveSaver::Write(const void* pData, FX_STRSIZE dwSize)
+{
+ if (m_pStream) {
+ m_pStream->WriteBlock(pData, dwSize);
+ } else {
+ m_SavingBuf.AppendBlock(pData, dwSize);
+ }
+}
+CFX_ArchiveLoader::CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pLoadingBuf = pData;
+ m_LoadingPos = 0;
+ m_LoadingSize = dwSize;
+}
+FX_BOOL CFX_ArchiveLoader::IsEOF()
+{
+ return m_LoadingPos >= m_LoadingSize;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_BYTE& i)
+{
+ if (m_LoadingPos >= m_LoadingSize) {
+ return *this;
+ }
+ i = m_pLoadingBuf[m_LoadingPos++];
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (int& i)
+{
+ Read(&i, sizeof(int));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_DWORD& i)
+{
+ Read(&i, sizeof(FX_DWORD));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (FX_FLOAT& i)
+{
+ Read(&i, sizeof(FX_FLOAT));
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_ByteString& str)
+{
+ if (m_LoadingPos + 4 > m_LoadingSize) {
+ return *this;
+ }
+ int len;
+ operator >> (len);
+ str.Empty();
+ if (len <= 0 || m_LoadingPos + len > m_LoadingSize) {
+ return *this;
+ }
+ FX_LPSTR buffer = str.GetBuffer(len);
+ FXSYS_memcpy32(buffer, m_pLoadingBuf + m_LoadingPos, len);
+ str.ReleaseBuffer(len);
+ m_LoadingPos += len;
+ return *this;
+}
+CFX_ArchiveLoader& CFX_ArchiveLoader::operator >> (CFX_WideString& str)
+{
+ CFX_ByteString encoded;
+ operator >> (encoded);
+ str = CFX_WideString::FromUTF16LE((const unsigned short*)(FX_LPCSTR)encoded, encoded.GetLength());
+ return *this;
+}
+FX_BOOL CFX_ArchiveLoader::Read(void* pBuf, FX_DWORD dwSize)
+{
+ if (m_LoadingPos + dwSize > m_LoadingSize) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(pBuf, m_pLoadingBuf + m_LoadingPos, dwSize);
+ m_LoadingPos += dwSize;
+ return TRUE;
+}
+void CFX_BitStream::Init(FX_LPCBYTE pData, FX_DWORD dwSize)
+{
+ m_pData = pData;
+ m_BitSize = dwSize * 8;
+ m_BitPos = 0;
+}
+void CFX_BitStream::ByteAlign()
+{
+ int mod = m_BitPos % 8;
+ if (mod == 0) {
+ return;
+ }
+ m_BitPos += 8 - mod;
+}
+FX_DWORD CFX_BitStream::GetBits(FX_DWORD nBits)
+{
+ if (nBits > m_BitSize || m_BitPos + nBits > m_BitSize) {
+ return 0;
+ }
+ if (nBits == 1) {
+ int bit = (m_pData[m_BitPos / 8] & (1 << (7 - m_BitPos % 8))) ? 1 : 0;
+ m_BitPos ++;
+ return bit;
+ }
+ FX_DWORD byte_pos = m_BitPos / 8;
+ FX_DWORD bit_pos = m_BitPos % 8, bit_left = nBits;
+ FX_DWORD result = 0;
+ if (bit_pos) {
+ if (8 - bit_pos >= bit_left) {
+ result = (m_pData[byte_pos] & (0xff >> bit_pos)) >> (8 - bit_pos - bit_left);
+ m_BitPos += bit_left;
+ return result;
+ }
+ bit_left -= 8 - bit_pos;
+ result = (m_pData[byte_pos++] & ((1 << (8 - bit_pos)) - 1)) << bit_left;
+ }
+ while (bit_left >= 8) {
+ bit_left -= 8;
+ result |= m_pData[byte_pos++] << bit_left;
+ }
+ if (bit_left) {
+ result |= m_pData[byte_pos] >> (8 - bit_left);
+ }
+ m_BitPos += nBits;
+ return result;
+}
+IFX_BufferArchive::IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_BufSize(size)
+ , m_pBuffer(NULL)
+ , m_Length(0)
+{
+}
+void IFX_BufferArchive::Clear()
+{
+ m_Length = 0;
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ m_pBuffer = NULL;
+ }
+}
+FX_BOOL IFX_BufferArchive::Flush()
+{
+ FX_BOOL bRet = DoWork(m_pBuffer, m_Length);
+ m_Length = 0;
+ return bRet;
+}
+FX_INT32 IFX_BufferArchive::AppendBlock(const void* pBuf, size_t size)
+{
+ if (!pBuf || size < 1) {
+ return 0;
+ }
+ if (!m_pBuffer) {
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_BufSize);
+ if (!m_pBuffer) {
+ return -1;
+ }
+ }
+ FX_LPBYTE buffer = (FX_LPBYTE)pBuf;
+ FX_STRSIZE temp_size = (FX_STRSIZE)size;
+ while (temp_size > 0) {
+ FX_STRSIZE buf_size = FX_MIN(m_BufSize - m_Length, (FX_STRSIZE)temp_size);
+ FXSYS_memcpy32(m_pBuffer + m_Length, buffer, buf_size);
+ m_Length += buf_size;
+ if (m_Length == m_BufSize) {
+ if (!Flush()) {
+ return -1;
+ }
+ }
+ temp_size -= buf_size;
+ buffer += buf_size;
+ }
+ return (FX_INT32)size;
+}
+FX_INT32 IFX_BufferArchive::AppendByte(FX_BYTE byte)
+{
+ return AppendBlock(&byte, 1);
+}
+FX_INT32 IFX_BufferArchive::AppendDWord(FX_DWORD i)
+{
+ char buf[32];
+ FXSYS_itoa(i, buf, 10);
+ return AppendBlock(buf, (size_t)FXSYS_strlen(buf));
+}
+FX_INT32 IFX_BufferArchive::AppendString(FX_BSTR lpsz)
+{
+ return AppendBlock((FX_LPCBYTE)lpsz, lpsz.GetLength());
+}
+CFX_FileBufferArchive::CFX_FileBufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator)
+ : IFX_BufferArchive(size, pAllocator)
+ , m_pFile(NULL)
+ , m_bTakeover(FALSE)
+{
+}
+CFX_FileBufferArchive::~CFX_FileBufferArchive()
+{
+ Clear();
+}
+void CFX_FileBufferArchive::Clear()
+{
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = NULL;
+ m_bTakeover = FALSE;
+ IFX_BufferArchive::Clear();
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover )
+{
+ if (!pFile) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = pFile;
+ m_bTakeover = bTakeover;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCWSTR filename)
+{
+ if (!filename) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = FX_CreateFileWrite(filename);
+ if (!m_pFile) {
+ return FALSE;
+ }
+ m_bTakeover = TRUE;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::AttachFile(FX_LPCSTR filename)
+{
+ if (!filename) {
+ return FALSE;
+ }
+ if (m_pFile && m_bTakeover) {
+ m_pFile->Release();
+ }
+ m_pFile = FX_CreateFileWrite(filename);
+ if (!m_pFile) {
+ return FALSE;
+ }
+ m_bTakeover = TRUE;
+ return TRUE;
+}
+FX_BOOL CFX_FileBufferArchive::DoWork(const void* pBuf, size_t size)
+{
+ if (!m_pFile) {
+ return FALSE;
+ }
+ if (!pBuf || size < 1) {
+ return TRUE;
+ }
+ return m_pFile->WriteBlock(pBuf, size);
+}
diff --git a/core/src/fxcrt/fx_basic_coords.cpp b/core/src/fxcrt/fx_basic_coords.cpp
new file mode 100644
index 0000000000..47204e0aa3
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_coords.cpp
@@ -0,0 +1,556 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+void FX_RECT::Normalize()
+{
+ if (left > right) {
+ int temp = left;
+ left = right;
+ right = temp;
+ }
+ if (top > bottom) {
+ int temp = top;
+ top = bottom;
+ bottom = temp;
+ }
+}
+void FX_RECT::Intersect(const FX_RECT& src)
+{
+ FX_RECT src_n = src;
+ src_n.Normalize();
+ Normalize();
+ left = left > src_n.left ? left : src_n.left;
+ top = top > src_n.top ? top : src_n.top;
+ right = right < src_n.right ? right : src_n.right;
+ bottom = bottom < src_n.bottom ? bottom : src_n.bottom;
+ if (left > right || top > bottom) {
+ left = top = right = bottom = 0;
+ }
+}
+void FX_RECT::Union(const FX_RECT& other_rect)
+{
+ Normalize();
+ FX_RECT other = other_rect;
+ other.Normalize();
+ left = left < other.left ? left : other.left;
+ right = right > other.right ? right : other.right;
+ bottom = bottom > other.bottom ? bottom : other.bottom;
+ top = top < other.top ? top : other.top;
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+ FX_FLOAT& interlow, FX_FLOAT& interhigh)
+{
+ if (low1 >= high2 || low2 >= high1) {
+ return FALSE;
+ }
+ interlow = low1 > low2 ? low1 : low2;
+ interhigh = high1 > high2 ? high2 : high1;
+ return TRUE;
+}
+extern "C" int FXSYS_round(FX_FLOAT d)
+{
+ int iRet = 0;
+ if (d >= 0.0f) {
+ iRet = (int)(d + 0.5f);
+ if (iRet >= 0) {
+ return iRet;
+ }
+ return -iRet;
+ }
+ return (int)(d - 0.5f);
+}
+CFX_FloatRect::CFX_FloatRect(const FX_RECT& rect)
+{
+ left = (FX_FLOAT)(rect.left);
+ right = (FX_FLOAT)(rect.right);
+ bottom = (FX_FLOAT)(rect.top);
+ top = (FX_FLOAT)(rect.bottom);
+}
+void CFX_FloatRect::Normalize()
+{
+ FX_FLOAT temp;
+ if (left > right) {
+ temp = left;
+ left = right;
+ right = temp;
+ }
+ if (bottom > top) {
+ temp = top;
+ top = bottom;
+ bottom = temp;
+ }
+}
+void CFX_FloatRect::Intersect(const CFX_FloatRect& other_rect)
+{
+ Normalize();
+ CFX_FloatRect other = other_rect;
+ other.Normalize();
+ left = left > other.left ? left : other.left;
+ right = right < other.right ? right : other.right;
+ bottom = bottom > other.bottom ? bottom : other.bottom;
+ top = top < other.top ? top : other.top;
+ if (left > right || bottom > top) {
+ left = right = bottom = top = 0;
+ }
+}
+void CFX_FloatRect::Union(const CFX_FloatRect& other_rect)
+{
+ Normalize();
+ CFX_FloatRect other = other_rect;
+ other.Normalize();
+ left = left < other.left ? left : other.left;
+ right = right > other.right ? right : other.right;
+ bottom = bottom < other.bottom ? bottom : other.bottom;
+ top = top > other.top ? top : other.top;
+}
+void CFX_FloatRect::Transform(const CFX_Matrix* pMatrix)
+{
+ pMatrix->TransformRect(left, right, top, bottom);
+}
+int CFX_FloatRect::Substract4(CFX_FloatRect& s, CFX_FloatRect* pRects)
+{
+ Normalize();
+ s.Normalize();
+ int nRects = 0;
+ CFX_FloatRect rects[4];
+ if (left < s.left) {
+ rects[nRects].left = left;
+ rects[nRects].right = s.left;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = top;
+ nRects ++;
+ }
+ if (s.left < right && s.top < top) {
+ rects[nRects].left = s.left;
+ rects[nRects].right = right;
+ rects[nRects].bottom = s.top;
+ rects[nRects].top = top;
+ nRects ++;
+ }
+ if (s.top > bottom && s.right < right) {
+ rects[nRects].left = s.right;
+ rects[nRects].right = right;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = s.top;
+ nRects ++;
+ }
+ if (s.bottom > bottom) {
+ rects[nRects].left = s.left;
+ rects[nRects].right = s.right;
+ rects[nRects].bottom = bottom;
+ rects[nRects].top = s.bottom;
+ nRects ++;
+ }
+ if (nRects == 0) {
+ return 0;
+ }
+ for (int i = 0; i < nRects; i ++) {
+ pRects[i] = rects[i];
+ pRects[i].Intersect(*this);
+ }
+ return nRects;
+}
+FX_RECT CFX_FloatRect::GetOutterRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ rect.left = (int)FXSYS_floor(rect1.left);
+ rect.right = (int)FXSYS_ceil(rect1.right);
+ rect.top = (int)FXSYS_floor(rect1.bottom);
+ rect.bottom = (int)FXSYS_ceil(rect1.top);
+ rect.Normalize();
+ return rect;
+}
+FX_RECT CFX_FloatRect::GetInnerRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ rect.left = (int)FXSYS_ceil(rect1.left);
+ rect.right = (int)FXSYS_floor(rect1.right);
+ rect.top = (int)FXSYS_ceil(rect1.bottom);
+ rect.bottom = (int)FXSYS_floor(rect1.top);
+ rect.Normalize();
+ return rect;
+}
+static void _MatchFloatRange(FX_FLOAT f1, FX_FLOAT f2, int& i1, int& i2)
+{
+ int length = (int)FXSYS_ceil(f2 - f1);
+ int i1_1 = (int)FXSYS_floor(f1);
+ int i1_2 = (int)FXSYS_ceil(f1);
+ FX_FLOAT error1 = f1 - i1_1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_1 - length);
+ FX_FLOAT error2 = i1_2 - f1 + (FX_FLOAT)FXSYS_fabs(f2 - i1_2 - length);
+ i1 = (error1 > error2) ? i1_2 : i1_1;
+ i2 = i1 + length;
+}
+FX_RECT CFX_FloatRect::GetClosestRect() const
+{
+ CFX_FloatRect rect1 = *this;
+ FX_RECT rect;
+ _MatchFloatRange(rect1.left, rect1.right, rect.left, rect.right);
+ _MatchFloatRange(rect1.bottom, rect1.top, rect.top, rect.bottom);
+ rect.Normalize();
+ return rect;
+}
+FX_BOOL CFX_FloatRect::Contains(const CFX_FloatRect& other_rect) const
+{
+ CFX_FloatRect n1 = *this;
+ n1.Normalize();
+ CFX_FloatRect n2 = other_rect;
+ n2.Normalize();
+ if (n2.left >= n1.left && n2.right <= n1.right && n2.bottom >= n1.bottom && n2.top <= n1.top) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CFX_FloatRect::Contains(FX_FLOAT x, FX_FLOAT y) const
+{
+ CFX_FloatRect n1 = *this;
+ n1.Normalize();
+ return x <= n1.right && x >= n1.left && y <= n1.top && y >= n1.bottom;
+}
+void CFX_FloatRect::UpdateRect(FX_FLOAT x, FX_FLOAT y)
+{
+ if (left > x) {
+ left = x;
+ }
+ if (right < x) {
+ right = x;
+ }
+ if (bottom > y) {
+ bottom = y;
+ }
+ if (top < y) {
+ top = y;
+ }
+}
+CFX_FloatRect CFX_FloatRect::GetBBox(const CFX_FloatPoint* pPoints, int nPoints)
+{
+ if (nPoints == 0) {
+ return CFX_FloatRect();
+ }
+ FX_FLOAT min_x = pPoints->x, max_x = pPoints->x, min_y = pPoints->y, max_y = pPoints->y;
+ for (int i = 1; i < nPoints; i ++) {
+ if (min_x > pPoints[i].x) {
+ min_x = pPoints[i].x;
+ }
+ if (max_x < pPoints[i].x) {
+ max_x = pPoints[i].x;
+ }
+ if (min_y > pPoints[i].y) {
+ min_y = pPoints[i].y;
+ }
+ if (max_y < pPoints[i].y) {
+ max_y = pPoints[i].y;
+ }
+ }
+ return CFX_FloatRect(min_x, min_y, max_x, max_y);
+}
+void CFX_Matrix::Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f)
+{
+ this->a = a;
+ this->b = b;
+ this->c = c;
+ this->d = d;
+ this->e = e;
+ this->f = f;
+}
+void CFX_Matrix::Set(const FX_FLOAT n[6])
+{
+ FXSYS_memcpy32((void*)this, &n, sizeof(CFX_Matrix));
+}
+void CFX_Matrix::SetReverse(const CFX_Matrix &m)
+{
+ FX_FLOAT i = m.a * m.d - m.b * m.c;
+ if (FXSYS_fabs(i) == 0) {
+ return;
+ }
+ FX_FLOAT j = -i;
+ a = m.d / i;
+ b = m.b / j;
+ c = m.c / j;
+ d = m.a / i;
+ e = (m.c * m.f - m.d * m.e) / i;
+ f = (m.a * m.f - m.b * m.e) / j;
+}
+static void FXCRT_Matrix_Concat(CFX_Matrix &m, const CFX_Matrix &m1, const CFX_Matrix &m2)
+{
+ FX_FLOAT aa = m1.a * m2.a + m1.b * m2.c;
+ FX_FLOAT bb = m1.a * m2.b + m1.b * m2.d;
+ FX_FLOAT cc = m1.c * m2.a + m1.d * m2.c;
+ FX_FLOAT dd = m1.c * m2.b + m1.d * m2.d;
+ FX_FLOAT ee = m1.e * m2.a + m1.f * m2.c + m2.e;
+ FX_FLOAT ff = m1.e * m2.b + m1.f * m2.d + m2.f;
+ m.a = aa, m.b = bb, m.c = cc, m.d = dd, m.e = ee, m.f = ff;
+}
+void CFX_Matrix::Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.Set(a, b, c, d, e, f);
+ Concat(m, bPrepended);
+}
+void CFX_Matrix::Concat(const CFX_Matrix &m, FX_BOOL bPrepended)
+{
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::ConcatInverse(const CFX_Matrix& src, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.SetReverse(src);
+ Concat(m, bPrepended);
+}
+FX_BOOL CFX_Matrix::IsInvertible() const
+{
+ return FXSYS_fabs(a * d - b * c) >= 0.0001f;
+}
+FX_BOOL CFX_Matrix::Is90Rotated() const
+{
+ return FXSYS_fabs(a * 1000) < FXSYS_fabs(b) && FXSYS_fabs(d * 1000) < FXSYS_fabs(c);
+}
+FX_BOOL CFX_Matrix::IsScaled() const
+{
+ return FXSYS_fabs(b * 1000) < FXSYS_fabs(a) && FXSYS_fabs(c * 1000) < FXSYS_fabs(d);
+}
+void CFX_Matrix::Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended)
+{
+ if (bPrepended) {
+ e += x * a + y * c;
+ f += y * d + x * b;
+ } else {
+ e += x, f += y;
+ }
+}
+void CFX_Matrix::Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended)
+{
+ a *= sx, d *= sy;
+ if (bPrepended) {
+ b *= sx;
+ c *= sy;
+ } else {
+ b *= sy;
+ c *= sx;
+ e *= sx;
+ f *= sy;
+ }
+}
+void CFX_Matrix::Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended)
+{
+ FX_FLOAT cosValue = FXSYS_cos(fRadian);
+ FX_FLOAT sinValue = FXSYS_sin(fRadian);
+ CFX_Matrix m;
+ m.Set(cosValue, sinValue, -sinValue, cosValue, 0, 0);
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::RotateAt(FX_FLOAT fRadian, FX_FLOAT dx, FX_FLOAT dy, FX_BOOL bPrepended)
+{
+ Translate(dx, dy, bPrepended);
+ Rotate(fRadian, bPrepended);
+ Translate(-dx, -dy, bPrepended);
+}
+void CFX_Matrix::Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended)
+{
+ CFX_Matrix m;
+ m.Set(1, FXSYS_tan(fAlphaRadian), FXSYS_tan(fBetaRadian), 1, 0, 0);
+ if (bPrepended) {
+ FXCRT_Matrix_Concat(*this, m, *this);
+ } else {
+ FXCRT_Matrix_Concat(*this, *this, m);
+ }
+}
+void CFX_Matrix::MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src)
+{
+ FX_FLOAT fDiff = src.left - src.right;
+ a = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.left - dest.right) / fDiff;
+ fDiff = src.bottom - src.top;
+ d = FXSYS_fabs(fDiff) < 0.001f ? 1 : (dest.bottom - dest.top) / fDiff;
+ e = dest.left - src.left * a;
+ f = dest.bottom - src.bottom * d;
+ b = 0;
+ c = 0;
+}
+FX_FLOAT CFX_Matrix::GetXUnit() const
+{
+ if (b == 0) {
+ return (a > 0 ? a : -a);
+ }
+ if (a == 0) {
+ return (b > 0 ? b : -b);
+ }
+ return FXSYS_sqrt(a * a + b * b);
+}
+FX_FLOAT CFX_Matrix::GetYUnit() const
+{
+ if (c == 0) {
+ return (d > 0 ? d : -d);
+ }
+ if (d == 0) {
+ return (c > 0 ? c : -c);
+ }
+ return FXSYS_sqrt(c * c + d * d);
+}
+void CFX_Matrix::GetUnitRect(CFX_RectF &rect) const
+{
+ rect.left = rect.top = 0;
+ rect.width = rect.height = 1;
+ TransformRect(rect);
+}
+CFX_FloatRect CFX_Matrix::GetUnitRect() const
+{
+ CFX_FloatRect rect(0, 0, 1, 1);
+ rect.Transform((const CFX_Matrix*)this);
+ return rect;
+}
+FX_FLOAT CFX_Matrix::GetUnitArea() const
+{
+ FX_FLOAT A = FXSYS_sqrt(a * a + b * b);
+ FX_FLOAT B = FXSYS_sqrt(c * c + d * d);
+ FX_FLOAT ac = a + c, bd = b + d;
+ FX_FLOAT C = FXSYS_sqrt(ac * ac + bd * bd);
+ FX_FLOAT P = (A + B + C ) / 2;
+ return FXSYS_sqrt(P * (P - A) * (P - B) * (P - C)) * 2;
+}
+FX_FLOAT CFX_Matrix::TransformXDistance(FX_FLOAT dx) const
+{
+ FX_FLOAT fx = a * dx, fy = b * dx;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformXDistance(FX_INT32 dx) const
+{
+ FX_FLOAT fx = a * dx, fy = b * dx;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformYDistance(FX_FLOAT dy) const
+{
+ FX_FLOAT fx = c * dy, fy = d * dy;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformYDistance(FX_INT32 dy) const
+{
+ FX_FLOAT fx = c * dy, fy = d * dy;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const
+{
+ FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
+ return FXSYS_sqrt(fx * fx + fy * fy);
+}
+FX_INT32 CFX_Matrix::TransformDistance(FX_INT32 dx, FX_INT32 dy) const
+{
+ FX_FLOAT fx = a * dx + c * dy, fy = b * dx + d * dy;
+ return FXSYS_round(FXSYS_sqrt(fx * fx + fy * fy));
+}
+FX_FLOAT CFX_Matrix::TransformDistance(FX_FLOAT distance) const
+{
+ return distance * (GetXUnit() + GetYUnit()) / 2;
+}
+void CFX_Matrix::TransformVector(CFX_VectorF &v) const
+{
+ FX_FLOAT fx = a * v.x + c * v.y;
+ FX_FLOAT fy = b * v.x + d * v.y;
+ v.x = fx, v.y = fy;
+}
+void CFX_Matrix::TransformVector(CFX_Vector &v) const
+{
+ FX_FLOAT fx = a * v.x + c * v.y;
+ FX_FLOAT fy = b * v.x + d * v.y;
+ v.x = FXSYS_round(fx);
+ v.y = FXSYS_round(fy);
+}
+void CFX_Matrix::TransformPoints(CFX_Point *points, FX_INT32 iCount) const
+{
+ FXSYS_assert(iCount > 0);
+ FX_FLOAT fx, fy;
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ fx = a * points->x + c * points->y + e;
+ fy = b * points->x + d * points->y + f;
+ points->x = FXSYS_round(fx);
+ points->y = FXSYS_round(fy);
+ points ++;
+ }
+}
+void CFX_Matrix::TransformPoints(CFX_PointF *points, FX_INT32 iCount) const
+{
+ FXSYS_assert(iCount > 0);
+ FX_FLOAT fx, fy;
+ for (FX_INT32 i = 0; i < iCount; i ++) {
+ fx = a * points->x + c * points->y + e;
+ fy = b * points->x + d * points->y + f;
+ points->x = fx, points->y = fy;
+ points ++;
+ }
+}
+void CFX_Matrix::TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const
+{
+ FX_FLOAT fx = a * x + c * y + e;
+ FX_FLOAT fy = b * x + d * y + f;
+ x = fx, y = fy;
+}
+void CFX_Matrix::TransformPoint(FX_INT32 &x, FX_INT32 &y) const
+{
+ FX_FLOAT fx = a * x + c * y + e;
+ FX_FLOAT fy = b * x + d * y + f;
+ x = FXSYS_round(fx);
+ y = FXSYS_round(fy);
+}
+void CFX_Matrix::TransformRect(CFX_RectF &rect) const
+{
+ FX_FLOAT right = rect.right(), bottom = rect.bottom();
+ TransformRect(rect.left, right, bottom, rect.top);
+ rect.width = right - rect.left;
+ rect.height = bottom - rect.top;
+}
+void CFX_Matrix::TransformRect(CFX_Rect &rect) const
+{
+ FX_FLOAT left = (FX_FLOAT)rect.left;
+ FX_FLOAT top = (FX_FLOAT)rect.bottom();
+ FX_FLOAT right = (FX_FLOAT)rect.right();
+ FX_FLOAT bottom = (FX_FLOAT)rect.top;
+ TransformRect(left, right, top, bottom);
+ rect.left = FXSYS_round(left);
+ rect.top = FXSYS_round(bottom);
+ rect.width = FXSYS_round(right - left);
+ rect.height = FXSYS_round(top - bottom);
+}
+void CFX_Matrix::TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const
+{
+ FX_FLOAT x[4], y[4];
+ x[0] = left;
+ y[0] = top;
+ x[1] = left;
+ y[1] = bottom;
+ x[2] = right;
+ y[2] = top;
+ x[3] = right;
+ y[3] = bottom;
+ int i;
+ for (i = 0; i < 4; i ++) {
+ Transform(x[i], y[i], x[i], y[i]);
+ }
+ right = left = x[0];
+ top = bottom = y[0];
+ for (i = 1; i < 4; i ++) {
+ if (right < x[i]) {
+ right = x[i];
+ }
+ if (left > x[i]) {
+ left = x[i];
+ }
+ if (top < y[i]) {
+ top = y[i];
+ }
+ if (bottom > y[i]) {
+ bottom = y[i];
+ }
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_gcc.cpp b/core/src/fxcrt/fx_basic_gcc.cpp
new file mode 100644
index 0000000000..20a1e58925
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_gcc.cpp
@@ -0,0 +1,232 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+template <class T, class STR_T>
+T FXSYS_StrToInt(STR_T str)
+{
+ FX_BOOL neg = FALSE;
+ if (str == NULL) {
+ return 0;
+ }
+ if (*str == '-') {
+ neg = TRUE;
+ str ++;
+ }
+ T num = 0;
+ while (*str) {
+ if ((*str) < '0' || (*str) > '9') {
+ break;
+ }
+ num = num * 10 + (*str) - '0';
+ str ++;
+ }
+ return neg ? -num : num;
+}
+template <typename T, typename STR_T>
+STR_T FXSYS_IntToStr(T value, STR_T string, int radix)
+{
+ int i = 0;
+ if (value < 0) {
+ string[i++] = '-';
+ value = -value;
+ } else if (value == 0) {
+ string[0] = '0';
+ string[1] = 0;
+ return string;
+ }
+ int digits = 1;
+ T order = value / 10;
+ while(order > 0) {
+ digits++;
+ order = order / 10;
+ }
+ for (int d = digits - 1; d > -1; d--) {
+ string[d + i] = "0123456789abcdef"[value % 10];
+ value /= 10;
+ }
+ string[digits + i] = 0;
+ return string;
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_INT32 FXSYS_atoi(FX_LPCSTR str)
+{
+ return FXSYS_StrToInt<FX_INT32, FX_LPCSTR>(str);
+}
+FX_INT32 FXSYS_wtoi(FX_LPCWSTR str)
+{
+ return FXSYS_StrToInt<FX_INT32, FX_LPCWSTR>(str);
+}
+FX_INT64 FXSYS_atoi64(FX_LPCSTR str)
+{
+ return FXSYS_StrToInt<FX_INT64, FX_LPCSTR>(str);
+}
+FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str)
+{
+ return FXSYS_StrToInt<FX_INT64, FX_LPCWSTR>(str);
+}
+FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix)
+{
+ return FXSYS_IntToStr<FX_INT64, FX_LPSTR>(value, str, radix);
+}
+FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix)
+{
+ return FXSYS_IntToStr<FX_INT64, FX_LPWSTR>(value, str, radix);
+}
+#ifdef __cplusplus
+}
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+int FXSYS_GetACP()
+{
+ return 0;
+}
+FX_DWORD FXSYS_GetFullPathName(FX_LPCSTR filename, FX_DWORD buflen, FX_LPSTR buf, FX_LPSTR* filepart)
+{
+ int srclen = FXSYS_strlen(filename);
+ if (buf == NULL || (int)buflen < srclen + 1) {
+ return srclen + 1;
+ }
+ FXSYS_strcpy(buf, filename);
+ return srclen;
+}
+FX_DWORD FXSYS_GetModuleFileName(FX_LPVOID hModule, char* buf, FX_DWORD bufsize)
+{
+ return (FX_DWORD) - 1;
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode)
+{
+ return FXSYS_fopen(CFX_ByteString::FromUnicode(filename), CFX_ByteString::FromUnicode(mode));
+}
+char* FXSYS_strlwr(char* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ char* s = str;
+ while (*str) {
+ *str = FXSYS_tolower(*str);
+ str ++;
+ }
+ return s;
+}
+char* FXSYS_strupr(char* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ char* s = str;
+ while (*str) {
+ *str = FXSYS_toupper(*str);
+ str ++;
+ }
+ return s;
+}
+FX_WCHAR* FXSYS_wcslwr(FX_WCHAR* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ FX_WCHAR* s = str;
+ while (*str) {
+ *str = FXSYS_tolower(*str);
+ str ++;
+ }
+ return s;
+}
+FX_WCHAR* FXSYS_wcsupr(FX_WCHAR* str)
+{
+ if (str == NULL) {
+ return NULL;
+ }
+ FX_WCHAR* s = str;
+ while (*str) {
+ *str = FXSYS_toupper(*str);
+ str ++;
+ }
+ return s;
+}
+int FXSYS_stricmp(const char*dst, const char*src)
+{
+ int f, l;
+ do {
+ if ( ((f = (unsigned char)(*(dst++))) >= 'A') && (f <= 'Z') ) {
+ f -= ('A' - 'a');
+ }
+ if ( ((l = (unsigned char)(*(src++))) >= 'A') && (l <= 'Z') ) {
+ l -= ('A' - 'a');
+ }
+ } while ( f && (f == l) );
+ return(f - l);
+}
+int FXSYS_wcsicmp(const FX_WCHAR *dst, const FX_WCHAR *src)
+{
+ FX_WCHAR f, l;
+ do {
+ if ( ((f = (FX_WCHAR)(*(dst++))) >= 'A') && (f <= 'Z') ) {
+ f -= ('A' - 'a');
+ }
+ if ( ((l = (FX_WCHAR)(*(src++))) >= 'A') && (l <= 'Z') ) {
+ l -= ('A' - 'a');
+ }
+ } while ( f && (f == l) );
+ return(f - l);
+}
+char* FXSYS_itoa(int value, char* string, int radix)
+{
+ return FXSYS_IntToStr<FX_INT32, FX_LPSTR>(value, string, radix);
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#ifdef __cplusplus
+extern "C" {
+#endif
+int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCWSTR wstr, int wlen,
+ FX_LPSTR buf, int buflen, FX_LPCSTR default_str, FX_BOOL* pUseDefault)
+{
+ int len = 0;
+ for (int i = 0; i < wlen; i ++) {
+ if (wstr[i] < 0x100) {
+ if (buf && len < buflen) {
+ buf[len] = (FX_CHAR)wstr[i];
+ }
+ len ++;
+ }
+ }
+ return len;
+}
+int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, FX_LPCSTR bstr, int blen,
+ FX_LPWSTR buf, int buflen)
+{
+ int wlen = 0;
+ for (int i = 0; i < blen; i ++) {
+ if (buf && wlen < buflen) {
+ buf[wlen] = bstr[i];
+ }
+ wlen ++;
+ }
+ return wlen;
+}
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/src/fxcrt/fx_basic_list.cpp b/core/src/fxcrt/fx_basic_list.cpp
new file mode 100644
index 0000000000..92b3d2c0c4
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_list.cpp
@@ -0,0 +1,141 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "plex.h"
+CFX_PtrList::CFX_PtrList(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pNodeHead(NULL)
+ , m_pNodeTail(NULL)
+ , m_nCount(0)
+ , m_pNodeFree(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+}
+FX_POSITION CFX_PtrList::AddTail(void* newElement)
+{
+ CNode* pNewNode = NewNode(m_pNodeTail, NULL);
+ pNewNode->data = newElement;
+ if (m_pNodeTail != NULL) {
+ m_pNodeTail->pNext = pNewNode;
+ } else {
+ m_pNodeHead = pNewNode;
+ }
+ m_pNodeTail = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+FX_POSITION CFX_PtrList::AddHead(void* newElement)
+{
+ CNode* pNewNode = NewNode(NULL, m_pNodeHead);
+ pNewNode->data = newElement;
+ if (m_pNodeHead != NULL) {
+ m_pNodeHead->pPrev = pNewNode;
+ } else {
+ m_pNodeTail = pNewNode;
+ }
+ m_pNodeHead = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+FX_POSITION CFX_PtrList::InsertAfter(FX_POSITION position, void* newElement)
+{
+ if (position == NULL) {
+ return AddTail(newElement);
+ }
+ CNode* pOldNode = (CNode*) position;
+ CNode* pNewNode = NewNode(pOldNode, pOldNode->pNext);
+ pNewNode->data = newElement;
+ if (pOldNode->pNext != NULL) {
+ pOldNode->pNext->pPrev = pNewNode;
+ } else {
+ m_pNodeTail = pNewNode;
+ }
+ pOldNode->pNext = pNewNode;
+ return (FX_POSITION) pNewNode;
+}
+void CFX_PtrList::RemoveAt(FX_POSITION position)
+{
+ CNode* pOldNode = (CNode*) position;
+ if (pOldNode == m_pNodeHead) {
+ m_pNodeHead = pOldNode->pNext;
+ } else {
+ pOldNode->pPrev->pNext = pOldNode->pNext;
+ }
+ if (pOldNode == m_pNodeTail) {
+ m_pNodeTail = pOldNode->pPrev;
+ } else {
+ pOldNode->pNext->pPrev = pOldNode->pPrev;
+ }
+ FreeNode(pOldNode);
+}
+void CFX_PtrList::FreeNode(CFX_PtrList::CNode* pNode)
+{
+ pNode->pNext = m_pNodeFree;
+ m_pNodeFree = pNode;
+ m_nCount--;
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+void CFX_PtrList::RemoveAll()
+{
+ m_nCount = 0;
+ m_pNodeHead = m_pNodeTail = m_pNodeFree = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_PtrList::CNode*
+CFX_PtrList::NewNode(CFX_PtrList::CNode* pPrev, CFX_PtrList::CNode* pNext)
+{
+ if (m_pNodeFree == NULL) {
+ CFX_Plex* pNewBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CNode));
+ CNode* pNode = (CNode*)pNewBlock->data();
+ pNode += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pNode--) {
+ pNode->pNext = m_pNodeFree;
+ m_pNodeFree = pNode;
+ }
+ }
+ ASSERT(m_pNodeFree != NULL);
+ CFX_PtrList::CNode* pNode = m_pNodeFree;
+ m_pNodeFree = m_pNodeFree->pNext;
+ pNode->pPrev = pPrev;
+ pNode->pNext = pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ pNode->data = 0;
+ return pNode;
+}
+CFX_PtrList::~CFX_PtrList()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+FX_POSITION CFX_PtrList::FindIndex(int nIndex) const
+{
+ if (nIndex >= m_nCount || nIndex < 0) {
+ return NULL;
+ }
+ CNode* pNode = m_pNodeHead;
+ while (nIndex--) {
+ pNode = pNode->pNext;
+ }
+ return (FX_POSITION) pNode;
+}
+FX_POSITION CFX_PtrList::Find(void* searchValue, FX_POSITION startAfter) const
+{
+ CNode* pNode = (CNode*) startAfter;
+ if (pNode == NULL) {
+ pNode = m_pNodeHead;
+ } else {
+ pNode = pNode->pNext;
+ }
+ for (; pNode != NULL; pNode = pNode->pNext)
+ if (pNode->data == searchValue) {
+ return (FX_POSITION) pNode;
+ }
+ return NULL;
+}
diff --git a/core/src/fxcrt/fx_basic_maps.cpp b/core/src/fxcrt/fx_basic_maps.cpp
new file mode 100644
index 0000000000..cb397ee8bd
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_maps.cpp
@@ -0,0 +1,654 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "plex.h"
+static void ConstructElement(CFX_ByteString* pNewData)
+{
+ new (pNewData) CFX_ByteString();
+}
+static void DestructElement(CFX_ByteString* pOldData)
+{
+ pOldData->~CFX_ByteString();
+}
+CFX_MapPtrToPtr::CFX_MapPtrToPtr(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pHashTable(NULL)
+ , m_nHashTableSize(17)
+ , m_nCount(0)
+ , m_pFreeList(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+ ASSERT(m_nBlockSize > 0);
+}
+void CFX_MapPtrToPtr::RemoveAll()
+{
+ if (m_pHashTable) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ m_nCount = 0;
+ m_pFreeList = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_MapPtrToPtr::~CFX_MapPtrToPtr()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+FX_DWORD CFX_MapPtrToPtr::HashKey(void* key) const
+{
+ return ((FX_DWORD)(FX_UINTPTR)key) >> 4;
+}
+void CFX_MapPtrToPtr::GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = (HashKey(pAssocRet->key) % m_nHashTableSize) + 1; nBucket < m_nHashTableSize; nBucket ++) {
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ rKey = pAssocRet->key;
+ rValue = pAssocRet->value;
+}
+FX_BOOL CFX_MapPtrToPtr::Lookup(void* key, void*& rValue) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return FALSE;
+ }
+ rValue = pAssoc->value;
+ return TRUE;
+}
+void* CFX_MapPtrToPtr::GetValueAt(void* key) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return NULL;
+ }
+ return pAssoc->value;
+}
+void*& CFX_MapPtrToPtr::operator[](void* key)
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc;
+ if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
+ if (m_pHashTable == NULL) {
+ InitHashTable(m_nHashTableSize);
+ }
+ pAssoc = NewAssoc();
+ pAssoc->key = key;
+ pAssoc->pNext = m_pHashTable[nHash];
+ m_pHashTable[nHash] = pAssoc;
+ }
+ return pAssoc->value;
+}
+CFX_MapPtrToPtr::CAssoc*
+CFX_MapPtrToPtr::GetAssocAt(void* key, FX_DWORD& nHash) const
+{
+ nHash = HashKey(key) % m_nHashTableSize;
+ if (m_pHashTable == NULL) {
+ return NULL;
+ }
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ return pAssoc;
+ }
+ }
+ return NULL;
+}
+CFX_MapPtrToPtr::CAssoc*
+CFX_MapPtrToPtr::NewAssoc()
+{
+ if (m_pFreeList == NULL) {
+ CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapPtrToPtr::CAssoc));
+ CFX_MapPtrToPtr::CAssoc* pAssoc = (CFX_MapPtrToPtr::CAssoc*)newBlock->data();
+ pAssoc += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ }
+ }
+ ASSERT(m_pFreeList != NULL);
+ CFX_MapPtrToPtr::CAssoc* pAssoc = m_pFreeList;
+ m_pFreeList = m_pFreeList->pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ pAssoc->key = 0;
+ pAssoc->value = 0;
+ return pAssoc;
+}
+void CFX_MapPtrToPtr::InitHashTable(
+ FX_DWORD nHashSize, FX_BOOL bAllocNow)
+{
+ ASSERT(m_nCount == 0);
+ ASSERT(nHashSize > 0);
+ if (m_pHashTable != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ if (bAllocNow) {
+ m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
+ if (m_pHashTable) {
+ FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
+ }
+ }
+ m_nHashTableSize = nHashSize;
+}
+FX_BOOL CFX_MapPtrToPtr::RemoveKey(void* key)
+{
+ if (m_pHashTable == NULL) {
+ return FALSE;
+ }
+ CAssoc** ppAssocPrev;
+ ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
+ CAssoc* pAssoc;
+ for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ *ppAssocPrev = pAssoc->pNext;
+ FreeAssoc(pAssoc);
+ return TRUE;
+ }
+ ppAssocPrev = &pAssoc->pNext;
+ }
+ return FALSE;
+}
+void CFX_MapPtrToPtr::FreeAssoc(CFX_MapPtrToPtr::CAssoc* pAssoc)
+{
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ m_nCount--;
+ ASSERT(m_nCount >= 0);
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+CFX_MapByteStringToPtr::CFX_MapByteStringToPtr(int nBlockSize, IFX_Allocator* pAllocator)
+ : m_pAllocator(pAllocator)
+ , m_pHashTable(NULL)
+ , m_nHashTableSize(17)
+ , m_nCount(0)
+ , m_pFreeList(NULL)
+ , m_pBlocks(NULL)
+ , m_nBlockSize(nBlockSize)
+{
+ ASSERT(m_nBlockSize > 0);
+}
+void CFX_MapByteStringToPtr::RemoveAll()
+{
+ if (m_pHashTable != NULL) {
+ for (FX_DWORD nHash = 0; nHash < m_nHashTableSize; nHash++) {
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL;
+ pAssoc = pAssoc->pNext) {
+ DestructElement(&pAssoc->key);
+ }
+ }
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ m_nCount = 0;
+ m_pFreeList = NULL;
+ m_pBlocks->FreeDataChain(m_pAllocator);
+ m_pBlocks = NULL;
+}
+CFX_MapByteStringToPtr::~CFX_MapByteStringToPtr()
+{
+ RemoveAll();
+ ASSERT(m_nCount == 0);
+}
+void CFX_MapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition,
+ CFX_ByteString& rKey, void*& rValue) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
+ nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ rKey = pAssocRet->key;
+ rValue = pAssocRet->value;
+}
+FX_LPVOID CFX_MapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
+{
+ ASSERT(m_pHashTable != NULL);
+ CAssoc* pAssocRet = (CAssoc*)rNextPosition;
+ ASSERT(pAssocRet != NULL);
+ if (pAssocRet == (CAssoc*) - 1) {
+ for (FX_DWORD nBucket = 0; nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocRet = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ ASSERT(pAssocRet != NULL);
+ }
+ CAssoc* pAssocNext;
+ if ((pAssocNext = pAssocRet->pNext) == NULL) {
+ for (FX_DWORD nBucket = pAssocRet->nHashValue + 1;
+ nBucket < m_nHashTableSize; nBucket++)
+ if ((pAssocNext = m_pHashTable[nBucket]) != NULL) {
+ break;
+ }
+ }
+ rNextPosition = (FX_POSITION) pAssocNext;
+ return pAssocRet->value;
+}
+void*& CFX_MapByteStringToPtr::operator[](FX_BSTR key)
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc;
+ if ((pAssoc = GetAssocAt(key, nHash)) == NULL) {
+ if (m_pHashTable == NULL) {
+ InitHashTable(m_nHashTableSize);
+ }
+ pAssoc = NewAssoc();
+ pAssoc->nHashValue = nHash;
+ pAssoc->key = key;
+ pAssoc->pNext = m_pHashTable[nHash];
+ m_pHashTable[nHash] = pAssoc;
+ }
+ return pAssoc->value;
+}
+CFX_MapByteStringToPtr::CAssoc*
+CFX_MapByteStringToPtr::NewAssoc()
+{
+ if (m_pFreeList == NULL) {
+ CFX_Plex* newBlock = CFX_Plex::Create(m_pAllocator, m_pBlocks, m_nBlockSize, sizeof(CFX_MapByteStringToPtr::CAssoc));
+ CFX_MapByteStringToPtr::CAssoc* pAssoc = (CFX_MapByteStringToPtr::CAssoc*)newBlock->data();
+ pAssoc += m_nBlockSize - 1;
+ for (int i = m_nBlockSize - 1; i >= 0; i--, pAssoc--) {
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ }
+ }
+ ASSERT(m_pFreeList != NULL);
+ CFX_MapByteStringToPtr::CAssoc* pAssoc = m_pFreeList;
+ m_pFreeList = m_pFreeList->pNext;
+ m_nCount++;
+ ASSERT(m_nCount > 0);
+ ConstructElement(&pAssoc->key);
+ pAssoc->value = 0;
+ return pAssoc;
+}
+void CFX_MapByteStringToPtr::FreeAssoc(CFX_MapByteStringToPtr::CAssoc* pAssoc)
+{
+ DestructElement(&pAssoc->key);
+ pAssoc->pNext = m_pFreeList;
+ m_pFreeList = pAssoc;
+ m_nCount--;
+ ASSERT(m_nCount >= 0);
+ if (m_nCount == 0) {
+ RemoveAll();
+ }
+}
+CFX_MapByteStringToPtr::CAssoc*
+CFX_MapByteStringToPtr::GetAssocAt(FX_BSTR key, FX_DWORD& nHash) const
+{
+ nHash = HashKey(key) % m_nHashTableSize;
+ if (m_pHashTable == NULL) {
+ return NULL;
+ }
+ CAssoc* pAssoc;
+ for (pAssoc = m_pHashTable[nHash]; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ return pAssoc;
+ }
+ }
+ return NULL;
+}
+FX_BOOL CFX_MapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
+{
+ FX_DWORD nHash;
+ CAssoc* pAssoc = GetAssocAt(key, nHash);
+ if (pAssoc == NULL) {
+ return FALSE;
+ }
+ rValue = pAssoc->value;
+ return TRUE;
+}
+void CFX_MapByteStringToPtr::InitHashTable(
+ FX_DWORD nHashSize, FX_BOOL bAllocNow)
+{
+ ASSERT(m_nCount == 0);
+ ASSERT(nHashSize > 0);
+ if (m_pHashTable != NULL) {
+ FX_Allocator_Free(m_pAllocator, m_pHashTable);
+ m_pHashTable = NULL;
+ }
+ if (bAllocNow) {
+ m_pHashTable = FX_Allocator_Alloc(m_pAllocator, CAssoc*, nHashSize);
+ if (m_pHashTable) {
+ FXSYS_memset32(m_pHashTable, 0, sizeof(CAssoc*) * nHashSize);
+ }
+ }
+ m_nHashTableSize = nHashSize;
+}
+inline FX_DWORD CFX_MapByteStringToPtr::HashKey(FX_BSTR key) const
+{
+ FX_DWORD nHash = 0;
+ int len = key.GetLength();
+ FX_LPCBYTE buf = key;
+ for (int i = 0; i < len; i ++) {
+ nHash = (nHash << 5) + nHash + buf[i];
+ }
+ return nHash;
+}
+FX_BOOL CFX_MapByteStringToPtr::RemoveKey(FX_BSTR key)
+{
+ if (m_pHashTable == NULL) {
+ return FALSE;
+ }
+ CAssoc** ppAssocPrev;
+ ppAssocPrev = &m_pHashTable[HashKey(key) % m_nHashTableSize];
+ CAssoc* pAssoc;
+ for (pAssoc = *ppAssocPrev; pAssoc != NULL; pAssoc = pAssoc->pNext) {
+ if (pAssoc->key == key) {
+ *ppAssocPrev = pAssoc->pNext;
+ FreeAssoc(pAssoc);
+ return TRUE;
+ }
+ ppAssocPrev = &pAssoc->pNext;
+ }
+ return FALSE;
+}
+struct _CompactString {
+ FX_BYTE m_CompactLen;
+ FX_BYTE m_LenHigh;
+ FX_BYTE m_LenLow;
+ FX_BYTE m_Unused;
+ FX_LPBYTE m_pBuffer;
+};
+static void _CompactStringRelease(IFX_Allocator* pAllocator, _CompactString* pCompact)
+{
+ if (pCompact->m_CompactLen == 0xff) {
+ FX_Allocator_Free(pAllocator, pCompact->m_pBuffer);
+ }
+}
+static FX_BOOL _CompactStringSame(_CompactString* pCompact, FX_LPCBYTE pStr, int len)
+{
+ if (len < sizeof(_CompactString)) {
+ if (pCompact->m_CompactLen != len) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(&pCompact->m_LenHigh, pStr, len) == 0;
+ }
+ if (pCompact->m_CompactLen != 0xff || pCompact->m_LenHigh * 256 + pCompact->m_LenLow != len) {
+ return FALSE;
+ }
+ return FXSYS_memcmp32(pCompact->m_pBuffer, pStr, len) == 0;
+}
+static void _CompactStringStore(IFX_Allocator* pAllocator, _CompactString* pCompact, FX_LPCBYTE pStr, int len)
+{
+ if (len < (int)sizeof(_CompactString)) {
+ pCompact->m_CompactLen = (FX_BYTE)len;
+ FXSYS_memcpy32(&pCompact->m_LenHigh, pStr, len);
+ return;
+ }
+ pCompact->m_CompactLen = 0xff;
+ pCompact->m_LenHigh = len / 256;
+ pCompact->m_LenLow = len % 256;
+ pCompact->m_pBuffer = FX_Allocator_Alloc(pAllocator, FX_BYTE, len);
+ if (pCompact->m_pBuffer) {
+ FXSYS_memcpy32(pCompact->m_pBuffer, pStr, len);
+ }
+}
+static CFX_ByteStringC _CompactStringGet(_CompactString* pCompact)
+{
+ if (pCompact->m_CompactLen == 0xff) {
+ return CFX_ByteStringC(pCompact->m_pBuffer, pCompact->m_LenHigh * 256 + pCompact->m_LenLow);
+ }
+ if (pCompact->m_CompactLen == 0xfe) {
+ return CFX_ByteStringC();
+ }
+ return CFX_ByteStringC(&pCompact->m_LenHigh, pCompact->m_CompactLen);
+}
+#define CMAP_ALLOC_STEP 8
+#define CMAP_INDEX_SIZE 8
+CFX_CMapByteStringToPtr::CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator)
+ : m_Buffer(sizeof(_CompactString) + sizeof(void*), CMAP_ALLOC_STEP, CMAP_INDEX_SIZE, pAllocator)
+{
+}
+CFX_CMapByteStringToPtr::~CFX_CMapByteStringToPtr()
+{
+ RemoveAll();
+}
+void CFX_CMapByteStringToPtr::RemoveAll()
+{
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactStringRelease(pAllocator, (_CompactString*)m_Buffer.GetAt(i));
+ }
+ m_Buffer.RemoveAll();
+}
+FX_POSITION CFX_CMapByteStringToPtr::GetStartPosition() const
+{
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
+ if (pKey->m_CompactLen != 0xfe) {
+ return (FX_POSITION)(FX_UINTPTR)(i + 1);
+ }
+ }
+ return NULL;
+}
+void CFX_CMapByteStringToPtr::GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const
+{
+ if (rNextPosition == NULL) {
+ return;
+ }
+ int index = (int)(FX_UINTPTR)rNextPosition - 1;
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ rKey = _CompactStringGet(pKey);
+ rValue = *(void**)(pKey + 1);
+ index ++;
+ int size = m_Buffer.GetSize();
+ while (index < size) {
+ pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen != 0xfe) {
+ rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
+ return;
+ }
+ index ++;
+ }
+ rNextPosition = NULL;
+}
+FX_LPVOID CFX_CMapByteStringToPtr::GetNextValue(FX_POSITION& rNextPosition) const
+{
+ if (rNextPosition == NULL) {
+ return NULL;
+ }
+ int index = (int)(FX_UINTPTR)rNextPosition - 1;
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ FX_LPVOID rValue = *(void**)(pKey + 1);
+ index ++;
+ int size = m_Buffer.GetSize();
+ while (index < size) {
+ pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen != 0xfe) {
+ rNextPosition = (FX_POSITION)(FX_UINTPTR)(index + 1);
+ return rValue;
+ }
+ index ++;
+ }
+ rNextPosition = NULL;
+ return rValue;
+}
+FX_BOOL _CMapLookupCallback(void* param, void* pData)
+{
+ return !_CompactStringSame((_CompactString*)pData, ((CFX_ByteStringC*)param)->GetPtr(), ((CFX_ByteStringC*)param)->GetLength());
+}
+FX_BOOL CFX_CMapByteStringToPtr::Lookup(FX_BSTR key, void*& rValue) const
+{
+ void* p = m_Buffer.Iterate(_CMapLookupCallback, (void*)&key);
+ if (!p) {
+ return FALSE;
+ }
+ rValue = *(void**)((_CompactString*)p + 1);
+ return TRUE;
+}
+void CFX_CMapByteStringToPtr::SetAt(FX_BSTR key, void* value)
+{
+ ASSERT(value != NULL);
+ int index, key_len = key.GetLength();
+ int size = m_Buffer.GetSize();
+ for (index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
+ continue;
+ }
+ *(void**)(pKey + 1) = value;
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ for (index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (pKey->m_CompactLen) {
+ continue;
+ }
+ _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
+ *(void**)(pKey + 1) = value;
+ return;
+ }
+ _CompactString* pKey = (_CompactString*)m_Buffer.Add();
+ _CompactStringStore(pAllocator, pKey, (FX_LPCBYTE)key, key_len);
+ *(void**)(pKey + 1) = value;
+}
+void CFX_CMapByteStringToPtr::AddValue(FX_BSTR key, void* value)
+{
+ ASSERT(value != NULL);
+ _CompactString* pKey = (_CompactString*)m_Buffer.Add();
+ _CompactStringStore(m_Buffer.m_pAllocator, pKey, (FX_LPCBYTE)key, key.GetLength());
+ *(void**)(pKey + 1) = value;
+}
+void CFX_CMapByteStringToPtr::RemoveKey(FX_BSTR key)
+{
+ int key_len = key.GetLength();
+ IFX_Allocator* pAllocator = m_Buffer.m_pAllocator;
+ int size = m_Buffer.GetSize();
+ for (int index = 0; index < size; index ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(index);
+ if (!_CompactStringSame(pKey, (FX_LPCBYTE)key, key_len)) {
+ continue;
+ }
+ _CompactStringRelease(pAllocator, pKey);
+ pKey->m_CompactLen = 0xfe;
+ return;
+ }
+}
+int CFX_CMapByteStringToPtr::GetCount() const
+{
+ int count = 0;
+ int size = m_Buffer.GetSize();
+ for (int i = 0; i < size; i ++) {
+ _CompactString* pKey = (_CompactString*)m_Buffer.GetAt(i);
+ if (pKey->m_CompactLen != 0xfe) {
+ count ++;
+ }
+ }
+ return count;
+}
+extern "C" {
+ static int _CompareDWord(const void* p1, const void* p2)
+ {
+ return (*(FX_DWORD*)p1) - (*(FX_DWORD*)p2);
+ }
+};
+struct _DWordPair {
+ FX_DWORD key;
+ FX_DWORD value;
+};
+FX_BOOL CFX_CMapDWordToDWord::Lookup(FX_DWORD key, FX_DWORD& value) const
+{
+ FX_LPVOID pResult = FXSYS_bsearch(&key, m_Buffer.GetBuffer(), m_Buffer.GetSize() / sizeof(_DWordPair),
+ sizeof(_DWordPair), _CompareDWord);
+ if (pResult == NULL) {
+ return FALSE;
+ }
+ value = ((FX_DWORD*)pResult)[1];
+ return TRUE;
+}
+FX_POSITION CFX_CMapDWordToDWord::GetStartPosition() const
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ if (count == 0) {
+ return NULL;
+ }
+ return (FX_POSITION)1;
+}
+void CFX_CMapDWordToDWord::GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const
+{
+ if (pos == 0) {
+ return;
+ }
+ FX_DWORD index = ((FX_DWORD)(FX_UINTPTR)pos) - 1;
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
+ key = buf[index].key;
+ value = buf[index].value;
+ if (index == count - 1) {
+ pos = 0;
+ } else {
+ pos = (FX_POSITION)((FX_UINTPTR)pos + 1);
+ }
+}
+void CFX_CMapDWordToDWord::SetAt(FX_DWORD key, FX_DWORD value)
+{
+ FX_DWORD count = m_Buffer.GetSize() / sizeof(_DWordPair);
+ _DWordPair* buf = (_DWordPair*)m_Buffer.GetBuffer();
+ _DWordPair pair = {key, value};
+ if (count == 0 || key > buf[count - 1].key) {
+ m_Buffer.AppendBlock(&pair, sizeof(_DWordPair));
+ return;
+ }
+ int low = 0, high = count - 1;
+ while (low <= high) {
+ int mid = (low + high) / 2;
+ if (buf[mid].key < key) {
+ low = mid + 1;
+ } else if (buf[mid].key > key) {
+ high = mid - 1;
+ } else {
+ buf[mid].value = value;
+ return;
+ }
+ }
+ m_Buffer.InsertBlock(low * sizeof(_DWordPair), &pair, sizeof(_DWordPair));
+}
+void CFX_CMapDWordToDWord::EstimateSize(FX_DWORD size, FX_DWORD grow_by)
+{
+ m_Buffer.EstimateSize(size, grow_by);
+}
diff --git a/core/src/fxcrt/fx_basic_memmgr.cpp b/core/src/fxcrt/fx_basic_memmgr.cpp
new file mode 100644
index 0000000000..34df829060
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_memmgr.cpp
@@ -0,0 +1,306 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "mem_int.h"
+void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr)
+{
+ if (pFoxitMgr == NULL) {
+ return;
+ }
+ CFX_MemoryMgr* p = (CFX_MemoryMgr*)pFoxitMgr;
+ if (p->m_pSystemMgr->CollectAll) {
+ p->m_pSystemMgr->CollectAll(p->m_pSystemMgr);
+ }
+ if (p->m_bReleaseMgr) {
+ p->m_pSystemMgr->Free(p->m_pSystemMgr, p, 0);
+ }
+ if (p->m_pExternalMemory) {
+ free(p->m_pExternalMemory);
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+static void* _DefAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR filename, int line)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->AllocDebug(size, 0, filename, line);
+}
+static void* _DefAlloc(IFX_Allocator* pAllocator, size_t size)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Alloc(size, 0);
+}
+static void* _DefReallocDebug(IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR filename, int line)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->ReallocDebug(p, size, 0, filename, line);
+}
+static void* _DefRealloc(IFX_Allocator* pAllocator, void* p, size_t size)
+{
+ return ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Realloc(p, size, 0);
+}
+static void _DefFree(IFX_Allocator* pAllocator, void* p)
+{
+ ((FX_DefAllocator*)pAllocator)->m_pFoxitMgr->Free(p, 0);
+}
+#ifdef __cplusplus
+}
+#endif
+void CFX_MemoryMgr::Init(FXMEM_SystemMgr* pSystemMgr)
+{
+ m_pSystemMgr = pSystemMgr;
+ IFX_Allocator &ac = m_DefAllocator.m_Allocator;
+ ac.m_Alloc = _DefAlloc;
+ ac.m_AllocDebug = _DefAllocDebug;
+ ac.m_Realloc = _DefRealloc;
+ ac.m_ReallocDebug = _DefReallocDebug;
+ ac.m_Free = _DefFree;
+ m_DefAllocator.m_pFoxitMgr = this;
+ m_pExternalMemory = NULL;
+ m_bReleaseMgr = TRUE;
+}
+void CFX_MemoryMgr::PurgeMgr()
+{
+ if (m_pSystemMgr->Purge) {
+ m_pSystemMgr->Purge(m_pSystemMgr);
+ }
+}
+void* CFX_MemoryMgr::Alloc(size_t size, int flags)
+{
+ void* p = m_pSystemMgr->Alloc(m_pSystemMgr, size, flags);
+ if (p == NULL) {
+ return NULL;
+ }
+ return p;
+}
+void* CFX_MemoryMgr::AllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
+{
+ void* p = m_pSystemMgr->AllocDebug(m_pSystemMgr, size, flags, file, line);
+ if (p == NULL) {
+ return NULL;
+ }
+ return p;
+}
+void* CFX_MemoryMgr::Realloc(void* p, size_t size, int flags)
+{
+ void* p1 = m_pSystemMgr->Realloc(m_pSystemMgr, p, size, flags);
+ if (p1 == NULL) {
+ return NULL;
+ }
+ return p1;
+}
+void* CFX_MemoryMgr::ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ void* p1 = m_pSystemMgr->ReallocDebug(m_pSystemMgr, p, size, flags, file, line);
+ if (p1 == NULL) {
+ return NULL;
+ }
+ return p1;
+}
+void CFX_MemoryMgr::Free(void* p, int flags)
+{
+ if (p == NULL) {
+ return;
+ }
+ m_pSystemMgr->Free(m_pSystemMgr, p, flags);
+}
+CFX_MemoryMgr* g_pDefFoxitMgr = NULL;
+void* FXMEM_DefaultAlloc(size_t size, int flags)
+{
+ return g_pDefFoxitMgr->Alloc(size, flags);
+}
+void* FXMEM_DefaultAlloc2(size_t size, size_t unit, int flags)
+{
+ return g_pDefFoxitMgr->Alloc(size * unit, flags);
+}
+void* FXMEM_DefaultRealloc(void* p, size_t size, int flags)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAlloc(size, flags);
+ }
+ return g_pDefFoxitMgr->Realloc(p, size, flags);
+}
+void* FXMEM_DefaultRealloc2(void* p, size_t size, size_t unit, int flags)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAlloc2(size, unit, flags);
+ }
+ return g_pDefFoxitMgr->Realloc(p, size * unit, flags);
+}
+void* FXMEM_DefaultAllocDebug(size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, flags, file, line);
+}
+void* FXMEM_DefaultAllocDebug2(size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size * unit, flags, file, line);
+}
+void* FXMEM_DefaultReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAllocDebug(size, flags, file, line);
+ }
+ return g_pDefFoxitMgr->ReallocDebug(p, size, flags, file, line);
+}
+void* FXMEM_DefaultReallocDebug2(void* p, size_t size, size_t unit, int flags, FX_LPCSTR file, int line)
+{
+ if (p == NULL) {
+ return FXMEM_DefaultAllocDebug2(size, unit, flags, file, line);
+ }
+ return g_pDefFoxitMgr->ReallocDebug(p, size * unit, flags, file, line);
+}
+void FXMEM_DefaultFree(void* p, int flags)
+{
+ g_pDefFoxitMgr->Free(p, flags);
+}
+IFX_Allocator* FXMEM_GetDefAllocator()
+{
+ return &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+}
+void* CFX_Object::operator new(size_t size)
+{
+ return g_pDefFoxitMgr->Alloc(size, 0);
+}
+void* CFX_Object::operator new[](size_t size)
+{
+ return g_pDefFoxitMgr->Alloc(size, 0);
+}
+void* CFX_Object::operator new[](size_t size, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
+}
+void* CFX_Object::operator new(size_t size, FX_LPCSTR file, int line)
+{
+ return g_pDefFoxitMgr->AllocDebug(size, 0, file, line);
+}
+void CFX_Object::operator delete(void* p)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete[](void* p)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete(void* p, FX_LPCSTR file, int line)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void CFX_Object::operator delete[](void* p, FX_LPCSTR file, int line)
+{
+ g_pDefFoxitMgr->Free(p, 0);
+}
+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
+{
+ void* p = pAllocator ? pAllocator->m_AllocDebug(pAllocator, size, filename, line) :
+ g_pDefFoxitMgr->AllocDebug(size, 0, filename, line);
+ ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
+ return p;
+}
+void CFX_AllocObject::operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR filename, int line)
+{
+ if (pAllocator) {
+ pAllocator->m_Free(pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+void* CFX_AllocObject::operator new(size_t size, IFX_Allocator* pAllocator)
+{
+ void* p = pAllocator ? pAllocator->m_Alloc(pAllocator, size) : g_pDefFoxitMgr->Alloc(size, 0);
+ ((CFX_AllocObject*)p)->m_pAllocator = pAllocator;
+ return p;
+}
+void CFX_AllocObject::operator delete(void* p)
+{
+ if (((CFX_AllocObject*)p)->m_pAllocator) {
+ (((CFX_AllocObject*)p)->m_pAllocator)->m_Free(((CFX_AllocObject*)p)->m_pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+void CFX_AllocObject::operator delete(void* p, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ pAllocator->m_Free(pAllocator, p);
+ } else {
+ g_pDefFoxitMgr->Free(p, 0);
+ }
+}
+extern "C" {
+ static void* _GOPAllocDebug(IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
+ }
+ static void* _GOPAlloc(IFX_Allocator* pAllocator, size_t size)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Alloc(size);
+ }
+ static void* _GOPReallocDebug(IFX_Allocator* pAllocator, void* p, size_t new_size, FX_LPCSTR file, int line)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
+ }
+ static void* _GOPRealloc(IFX_Allocator* pAllocator, void* p, size_t new_size)
+ {
+ return ((CFX_GrowOnlyPool*)pAllocator)->Realloc(p, new_size);
+ }
+ static void _GOPFree(IFX_Allocator* pAllocator, void* p)
+ {
+ }
+};
+CFX_GrowOnlyPool::CFX_GrowOnlyPool(IFX_Allocator* pAllocator, size_t trunk_size)
+{
+ m_TrunkSize = trunk_size;
+ m_pFirstTrunk = NULL;
+ m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+ m_AllocDebug = _GOPAllocDebug;
+ m_Alloc = _GOPAlloc;
+ m_ReallocDebug = _GOPReallocDebug;
+ m_Realloc = _GOPRealloc;
+ m_Free = _GOPFree;
+}
+CFX_GrowOnlyPool::~CFX_GrowOnlyPool()
+{
+ FreeAll();
+}
+void CFX_GrowOnlyPool::SetAllocator(IFX_Allocator* pAllocator)
+{
+ ASSERT(m_pFirstTrunk == NULL);
+ m_pAllocator = pAllocator ? pAllocator : &g_pDefFoxitMgr->m_DefAllocator.m_Allocator;
+}
+struct _FX_GrowOnlyTrunk {
+ size_t m_Size;
+ size_t m_Allocated;
+ _FX_GrowOnlyTrunk* m_pNext;
+};
+void CFX_GrowOnlyPool::FreeAll()
+{
+ _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ while (pTrunk) {
+ _FX_GrowOnlyTrunk* pNext = pTrunk->m_pNext;
+ m_pAllocator->m_Free(m_pAllocator, pTrunk);
+ pTrunk = pNext;
+ }
+ m_pFirstTrunk = NULL;
+}
+void* CFX_GrowOnlyPool::Alloc(size_t size)
+{
+ size = (size + 3) / 4 * 4;
+ _FX_GrowOnlyTrunk* pTrunk = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ while (pTrunk) {
+ if (pTrunk->m_Size - pTrunk->m_Allocated >= size) {
+ void* p = (FX_LPBYTE)(pTrunk + 1) + pTrunk->m_Allocated;
+ pTrunk->m_Allocated += size;
+ return p;
+ }
+ pTrunk = pTrunk->m_pNext;
+ }
+ size_t alloc_size = size > m_TrunkSize ? size : m_TrunkSize;
+ pTrunk = (_FX_GrowOnlyTrunk*)m_pAllocator->m_Alloc(m_pAllocator, sizeof(_FX_GrowOnlyTrunk) + alloc_size);
+ pTrunk->m_Size = alloc_size;
+ pTrunk->m_Allocated = size;
+ pTrunk->m_pNext = (_FX_GrowOnlyTrunk*)m_pFirstTrunk;
+ m_pFirstTrunk = pTrunk;
+ return pTrunk + 1;
+}
diff --git a/core/src/fxcrt/fx_basic_memmgr_mini.cpp b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
new file mode 100644
index 0000000000..f8385e20d2
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_memmgr_mini.cpp
@@ -0,0 +1,822 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "mem_int.h"
+#ifdef _FPDFAPI_MINI_
+static FX_MEMCONFIG g_MemConfig = {
+ 1,
+ 5,
+ 8,
+ 4,
+ 12,
+ 8,
+ 2,
+ 4,
+ 32,
+ 64,
+};
+#else
+static FX_MEMCONFIG g_MemConfig = {
+ 1,
+ 8,
+ 24,
+ 8,
+ 32,
+ 16,
+ 4,
+ 8,
+ 128,
+ 64,
+};
+#endif
+void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig)
+{
+ g_MemConfig = *memConfig;
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+static void* FixedAlloc(FXMEM_SystemMgr* pMgr, size_t size, int flags)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
+}
+static void* FixedAllocDebug(FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Alloc(size);
+}
+static void* FixedRealloc(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
+}
+static void* FixedReallocDebug(FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line)
+{
+ return ((CFXMEM_FixedMgr*)pMgr->user)->Realloc(pointer, size);
+}
+static void FixedFree(FXMEM_SystemMgr* pMgr, void* pointer, int flags)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->Free(pointer);
+}
+static void FixedPurge(FXMEM_SystemMgr* pMgr)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->Purge();
+}
+static void FixedCollectAll(FXMEM_SystemMgr* pMgr)
+{
+ ((CFXMEM_FixedMgr*)pMgr->user)->FreeAll();
+}
+#define FIXEDMEM_MINIMUMSIZE (1024 * 1024 * 8)
+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible)
+{
+ if (size < FIXEDMEM_MINIMUMSIZE) {
+ size = FIXEDMEM_MINIMUMSIZE;
+ }
+ FX_LPVOID pMemory = malloc(size);
+ if (!pMemory) {
+ return NULL;
+ }
+ CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
+ size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
+ FXMEM_FoxitMgr* pFoxitMgr = pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, extensible);
+ if (!pFoxitMgr) {
+ free(pMemory);
+ return NULL;
+ }
+ g_pDefFoxitMgr = (CFX_MemoryMgr*)pFoxitMgr;
+ g_pDefFoxitMgr->m_pExternalMemory = pMemory;
+ return pFoxitMgr;
+}
+FXMEM_FoxitMgr* FXMEM_CreateFixedMgr(void* pMemory, size_t size, FXMEM_SystemMgr2* pSystemMgr)
+{
+ if (pMemory == NULL || size < FX_FIXEDMEM_PAGESIZE) {
+ return NULL;
+ }
+ if (!pSystemMgr && size >= FIXEDMEM_PROXYSIZE_1) {
+ CFixedMgr_Proxy* pProxy = (CFixedMgr_Proxy*)pMemory;
+ size_t offsetSize = (sizeof(CFixedMgr_Proxy) + 15) / 16 * 16;
+ return pProxy->Initialize((FX_LPBYTE)pProxy + offsetSize, size - offsetSize, FALSE);
+ }
+ CFXMEM_FixedMgr* pHeader = (CFXMEM_FixedMgr*)pMemory;
+ pHeader->Initialize(size);
+ pHeader->m_pExtender = pSystemMgr;
+ CFX_MemoryMgr* p = (CFX_MemoryMgr*)pHeader->Alloc(sizeof(CFX_MemoryMgr));
+ if (p == NULL) {
+ return NULL;
+ }
+ p->Init(&pHeader->m_SystemMgr);
+ return (FXMEM_FoxitMgr*)p;
+}
+size_t FXMEM_GetBlockSizeInFixedMgr(FXMEM_FoxitMgr* pFoxitMgr, void* ptr)
+{
+ return pFoxitMgr ? ((CFXMEM_FixedMgr*)((CFX_MemoryMgr*)pFoxitMgr)->m_pSystemMgr->user)->GetSize(ptr) : 0;
+}
+#ifdef __cplusplus
+}
+#endif
+const FX_MEMCONFIG g_ProxyMgr_MemConfigs[6] = {
+ {1, 2, 4, 0, 2, 2, 2, 0, 0, 0},
+ {1, 4, 8, 0, 2, 2, 2, 0, 0, 0},
+ {1, 4, 16, 4, 8, 8, 2, 1, 16, 16},
+ {1, 8, 24, 4, 12, 12, 4, 2, 32, 16},
+ {1, 8, 24, 8, 16, 16, 4, 2, 64, 32},
+ {1, 8, 24, 8, 24, 32, 4, 2, 128, 64},
+};
+const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize)
+{
+ int index = 5;
+ if (nSize <= FIXEDMEM_PROXYSIZE_0) {
+ index = 0;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_1) {
+ index = 1;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_2) {
+ index = 2;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_3) {
+ index = 3;
+ } else if (nSize <= FIXEDMEM_PROXYSIZE_4) {
+ index = 4;
+ }
+ return &g_ProxyMgr_MemConfigs[index];
+}
+FXMEM_FoxitMgr* CFixedMgr_Proxy::Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible)
+{
+ FXSYS_assert(pBuffer != NULL && nSize >= FIXEDMEM_PROXYSIZE_1 - sizeof(CFixedMgr_Proxy));
+ FXMEM_SetConfig(FixedMgr_GetConfig(nSize));
+ m_SystemMgr.More = &CFixedMgr_Proxy::Common_More;
+ m_SystemMgr.Free = &CFixedMgr_Proxy::Common_Free;
+ m_pFixedPage = (CFXMEM_Page*)((FX_LPBYTE)pBuffer + FIXEDMEM_PROXYSIZE_0);
+ m_pFixedPage->Initialize(nSize - FIXEDMEM_PROXYSIZE_0);
+ m_pBuffer = pBuffer;
+ m_nSize = nSize;
+ m_bExtensible = bExtensible;
+ return FXMEM_CreateFixedMgr(pBuffer, FIXEDMEM_PROXYSIZE_0, &m_SystemMgr);
+}
+FX_BOOL CFixedMgr_Proxy::Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size)
+{
+ CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
+ FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
+ *new_size = alloc_size;
+ *new_memory = pProxyMgr->m_pFixedPage->Alloc(alloc_size);
+ if (*new_memory == NULL && pProxyMgr->m_bExtensible) {
+ *new_memory = malloc(alloc_size);
+ }
+ return *new_memory != NULL;
+}
+void CFixedMgr_Proxy::Common_Free(FXMEM_SystemMgr2* pMgr, void* memory)
+{
+ CFixedMgr_Proxy* pProxyMgr = (CFixedMgr_Proxy*)pMgr;
+ FXSYS_assert(pProxyMgr != NULL && pProxyMgr->m_pFixedPage != NULL);
+ if (memory > pProxyMgr->m_pBuffer && memory < (FX_LPBYTE)pProxyMgr->m_pBuffer + pProxyMgr->m_nSize) {
+ pProxyMgr->m_pFixedPage->Free(memory);
+ } else if (pProxyMgr->m_bExtensible) {
+ free(memory);
+ }
+}
+void CFXMEM_Page::Initialize(size_t size)
+{
+ CFXMEM_Block *pFirstBlock = (CFXMEM_Block*)(this + 1);
+ m_nAvailSize = size - sizeof(CFXMEM_Page) - sizeof(CFXMEM_Block);
+ pFirstBlock->m_nBlockSize = m_nAvailSize;
+ pFirstBlock->m_pNextBlock = NULL;
+ m_AvailHead.m_nBlockSize = m_nAvailSize;
+ m_AvailHead.m_pNextBlock = pFirstBlock;
+ m_pLimitPos = (CFXMEM_Block*)((FX_LPBYTE)this + size);
+}
+FX_LPVOID CFXMEM_Page::Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize)
+{
+ size_t gap = pNextBlock->m_nBlockSize - size;
+ if (gap <= 64 + sizeof(CFXMEM_Block)) {
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ m_nAvailSize -= pNextBlock->m_nBlockSize;
+ } else {
+ m_nAvailSize -= size + sizeof(CFXMEM_Block);
+ pNextBlock->m_nBlockSize = size;
+ CFXMEM_Block *pNewBlock = (CFXMEM_Block*)((FX_LPBYTE)(pNextBlock + 1) + size);
+ pNewBlock->m_nBlockSize = gap - sizeof(CFXMEM_Block);
+ pNewBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ pPrevBlock->m_pNextBlock = pNewBlock;
+ }
+ return (FX_LPVOID)(pNextBlock + 1);
+}
+FX_LPVOID CFXMEM_Page::Alloc(size_t size)
+{
+ size_t oldsize = size;
+#if _FX_WORDSIZE_ == _FX_W64_
+ size = (size + 31) / 32 * 32;
+#else
+ size = (size + 7) / 8 * 8;
+#endif
+ if (m_nAvailSize < size) {
+ return NULL;
+ }
+ CFXMEM_Block *pNextBlock;
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (!pNextBlock) {
+ return NULL;
+ }
+ if (pNextBlock->m_nBlockSize >= size) {
+ break;
+ }
+ pPrevBlock = pNextBlock;
+ }
+ return Alloc(pPrevBlock, pNextBlock, size, oldsize);
+}
+FX_LPVOID CFXMEM_Page::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ size_t oldnewSize = newSize;
+#if _FX_WORDSIZE_ == _FX_W64_
+ newSize = (newSize + 31) / 32 * 32;
+#else
+ newSize = (newSize + 7) / 8 * 8;
+#endif
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ CFXMEM_Block *pNextBlock, *pPrevPrev;
+ CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
+ pPrevPrev = NULL;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (pNextBlock == NULL || pNextBlock > pBlock) {
+ break;
+ }
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ } else {
+ pPrevPrev = pPrevBlock;
+ pPrevBlock = pNextBlock;
+ }
+ }
+ if (pNextBlock) {
+ CFXMEM_Block* pCurBlock = pNextBlock->m_pNextBlock;
+ while ((FX_LPBYTE)pCurBlock == (FX_LPBYTE)(pNextBlock + 1) + pNextBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pNextBlock->m_nBlockSize += pCurBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pCurBlock = pCurBlock->m_pNextBlock;
+ pNextBlock->m_pNextBlock = pCurBlock;
+ }
+ }
+ size_t size = 0;
+ FX_DWORD dwFlags = 0;
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ size += pPrevBlock->m_nBlockSize + oldSize + sizeof(CFXMEM_Block);
+ dwFlags |= 0x10;
+ }
+ if (pNextBlock && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)p + oldSize) {
+ size += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ dwFlags |= 0x01;
+ }
+ if (size >= newSize) {
+ m_nAvailSize += pBlock->m_nBlockSize;
+ CFXMEM_Block* pCurBlock = pBlock;
+ if (dwFlags & 0x10) {
+ pCurBlock = pPrevBlock;
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pCurBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock = pPrevPrev;
+ }
+ if (dwFlags & 0x01) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pCurBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pCurBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ }
+ if (pCurBlock != pBlock) {
+ FXSYS_memmove32((FX_LPVOID)(pCurBlock + 1), p, oldSize);
+ }
+ return Alloc(pPrevBlock, pCurBlock, newSize, oldnewSize);
+ }
+ return NULL;
+}
+void CFXMEM_Page::Free(FX_LPVOID p)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Block *pPrevBlock = &m_AvailHead;
+ CFXMEM_Block *pNextBlock;
+ CFXMEM_Block *pBlock = (CFXMEM_Block*)p - 1;
+ m_nAvailSize += pBlock->m_nBlockSize;
+ while (TRUE) {
+ pNextBlock = pPrevBlock->m_pNextBlock;
+ if (pNextBlock == NULL || pNextBlock > pBlock) {
+ break;
+ }
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pNextBlock->m_pNextBlock;
+ } else {
+ pPrevBlock = pNextBlock;
+ }
+ }
+ while ((FX_LPBYTE)pNextBlock == (FX_LPBYTE)(pBlock + 1) + pBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pBlock->m_nBlockSize += pNextBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pNextBlock = pNextBlock->m_pNextBlock;
+ }
+ pBlock->m_pNextBlock = pNextBlock;
+ if (pPrevBlock != &m_AvailHead && (FX_LPBYTE)pBlock == (FX_LPBYTE)(pPrevBlock + 1) + pPrevBlock->m_nBlockSize) {
+ m_nAvailSize += sizeof(CFXMEM_Block);
+ pPrevBlock->m_nBlockSize += pBlock->m_nBlockSize + sizeof(CFXMEM_Block);
+ pPrevBlock->m_pNextBlock = pBlock->m_pNextBlock;
+ } else {
+ FXSYS_assert(pPrevBlock != pBlock);
+ pPrevBlock->m_pNextBlock = pBlock;
+ }
+}
+void CFXMEM_Pages::Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages)
+{
+ m_pStartPage = m_pCurPage = (CFXMEM_Page*)pStart;
+ m_nPageSize = pageSize;
+ for (size_t n = 0; n < pages; n++) {
+ ((CFXMEM_Page*)pStart)->Initialize(pageSize);
+ pStart += pageSize;
+ }
+ m_pLimitPos = (CFXMEM_Page*)pStart;
+}
+FX_BOOL CFXMEM_Pages::IsEmpty() const
+{
+ if (m_pStartPage >= m_pLimitPos) {
+ return TRUE;
+ }
+ FX_LPBYTE pPage = (FX_LPBYTE)m_pStartPage;
+ while (pPage < (FX_LPBYTE)m_pLimitPos) {
+ if (!((CFXMEM_Page*)pPage)->IsEmpty()) {
+ return FALSE;
+ }
+ pPage += m_nPageSize;
+ }
+ return TRUE;
+}
+FX_LPVOID CFXMEM_Pages::Alloc(size_t size)
+{
+ CFXMEM_Page *pCurPage = m_pCurPage;
+ do {
+ FX_LPVOID p = m_pCurPage->Alloc(size);
+ if (p) {
+ return p;
+ }
+ m_pCurPage = (CFXMEM_Page*)((FX_LPBYTE)m_pCurPage + m_nPageSize);
+ if (m_pCurPage == m_pLimitPos) {
+ m_pCurPage = m_pStartPage;
+ }
+ } while (m_pCurPage != pCurPage);
+ return NULL;
+}
+FX_LPVOID CFXMEM_Pages::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
+ return pPage->Realloc(p, oldSize, newSize);
+}
+void CFXMEM_Pages::Free(FX_LPVOID p)
+{
+ FXSYS_assert (p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ CFXMEM_Page* pPage = (CFXMEM_Page*)((FX_LPBYTE)m_pStartPage + ((FX_LPBYTE)p - (FX_LPBYTE)m_pStartPage) / m_nPageSize * m_nPageSize);
+ pPage->Free(p);
+}
+void CFXMEM_Pool::Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid)
+{
+ m_pPrevPool = NULL;
+ m_pNextPool = NULL;
+ m_bAlone = FALSE;
+ FX_LPBYTE pPage = (FX_LPBYTE)this + sizeof(CFXMEM_Pool);
+ size -= sizeof(CFXMEM_Pool);
+ m_8BytesPages.Initialize(pPage, pageNum8Bytes);
+ pPage += pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum8Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_16BytesPages.Initialize(pPage, pageNum16Bytes);
+ pPage += pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum16Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_32BytesPages.Initialize(pPage, pageNum32Bytes);
+ pPage += pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNum32Bytes * FX_FIXEDMEM_PAGESIZE;
+ m_MidPages.Initialize(pPage, pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE, pageNumMid);
+ pPage += pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
+ size -= pageNumMid * pMemConfig->nPageSize_Mid * FX_FIXEDMEM_PAGESIZE;
+ if (size < FX_FIXEDMEM_MIDBLOCKSIZE) {
+ m_pLargePage = NULL;
+ } else {
+ m_pLargePage = (CFXMEM_Page*)pPage;
+ m_pLargePage->Initialize(size);
+ }
+ m_pLimitPos = pPage + size;
+}
+FX_BOOL CFXMEM_Pool::IsEmpty() const
+{
+ if (!m_8BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_16BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_32BytesPages.IsEmpty()) {
+ return FALSE;
+ }
+ if (!m_MidPages.IsEmpty()) {
+ return FALSE;
+ }
+ return !m_pLargePage || m_pLargePage->IsEmpty();
+}
+size_t CFXMEM_Pool::GetSize(FX_LPVOID p) const
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
+ return 8;
+ }
+ if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
+ return 16;
+ }
+ if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ return 32;
+ }
+ return ((CFXMEM_Block*)p - 1)->m_nBlockSize;
+}
+FX_LPVOID CFXMEM_Pool::Realloc(FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p > (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
+ return m_MidPages.Realloc(p, oldSize, newSize);
+ } else if (m_pLargePage) {
+ return m_pLargePage->Realloc(p, oldSize, newSize);
+ }
+ }
+ return NULL;
+}
+void CFXMEM_Pool::Free(FX_LPVOID p)
+{
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)m_pLimitPos);
+ if (p < (FX_LPVOID)m_32BytesPages.m_pLimitPos) {
+ if (p < (FX_LPVOID)m_8BytesPages.m_pLimitPos) {
+ m_8BytesPages.Free(p);
+ } else if (p < (FX_LPVOID)m_16BytesPages.m_pLimitPos) {
+ m_16BytesPages.Free(p);
+ } else {
+ m_32BytesPages.Free(p);
+ }
+ return;
+ } else if (p < (FX_LPVOID)m_MidPages.m_pLimitPos) {
+ m_MidPages.Free(p);
+ } else {
+ m_pLargePage->Free(p);
+ }
+}
+void CFXMEM_FixedMgr::Initialize(size_t size)
+{
+ m_MemConfig = g_MemConfig;
+ FXSYS_memset32(&m_SystemMgr, 0, sizeof m_SystemMgr);
+ m_SystemMgr.Alloc = FixedAlloc;
+ m_SystemMgr.AllocDebug = FixedAllocDebug;
+ m_SystemMgr.Free = FixedFree;
+ m_SystemMgr.Realloc = FixedRealloc;
+ m_SystemMgr.ReallocDebug = FixedReallocDebug;
+ m_SystemMgr.CollectAll = FixedCollectAll;
+ m_SystemMgr.Purge = FixedPurge;
+ m_SystemMgr.user = this;
+ size -= sizeof(CFXMEM_FixedMgr);
+ size_t nMidPages = 0;
+ if (m_MemConfig.nPageSize_Mid) {
+ nMidPages = (size - (m_MemConfig.nPageNum_Init8 + m_MemConfig.nPageNum_Init16 + m_MemConfig.nPageNum_Init32) * FX_FIXEDMEM_PAGESIZE) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_InitMid) {
+ nMidPages = m_MemConfig.nPageNum_InitMid;
+ }
+ }
+ m_FirstPool.Initialize(&m_MemConfig, size, m_MemConfig.nPageNum_Init8, m_MemConfig.nPageNum_Init16, m_MemConfig.nPageNum_Init32, nMidPages);
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc16(CFXMEM_Pool **pp32Pool, size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ CFXMEM_16BytesPages &pages = pPool->m_16BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ if (pp32Pool && pPool->m_32BytesPages.HasFreeBlock()) {
+ *pp32Pool = pPool;
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ return NULL;
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc32(size_t size)
+{
+ if (size <= 8) {
+ CFXMEM_8BytesPages &pages = m_FirstPool.m_8BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ }
+ CFXMEM_Pool *p32BytesPool;
+ if (size <= 16) {
+ p32BytesPool = NULL;
+ FX_LPVOID p = Alloc16(&p32BytesPool, size);
+ if (p) {
+ return p;
+ }
+ } else {
+ p32BytesPool = &m_FirstPool;
+ }
+ while (p32BytesPool) {
+ CFXMEM_32BytesPages &pages = p32BytesPool->m_32BytesPages;
+ if (pages.HasFreeBlock()) {
+ return pages.Alloc(size);
+ }
+ p32BytesPool = p32BytesPool->m_pNextPool;
+ }
+ return NULL;
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocSmall(size_t size)
+{
+ FX_LPVOID p = Alloc32(size);
+ if (p) {
+ return p;
+ }
+ if (!m_pExtender) {
+ return NULL;
+ }
+ size_t requiredSize = (m_MemConfig.nPageNum_More16 + m_MemConfig.nPageNum_More32) * FX_FIXEDMEM_PAGESIZE;
+ if (!requiredSize) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+ requiredSize += sizeof(CFXMEM_Pool);
+ size_t newSize = requiredSize;
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ size_t nMidPages = 0;
+ if (m_MemConfig.nPageSize_Mid) {
+ nMidPages = (newSize - requiredSize) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
+ nMidPages = m_MemConfig.nPageNum_MoreMid;
+ }
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, m_MemConfig.nPageNum_More16, m_MemConfig.nPageNum_More32, nMidPages);
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ CFXMEM_Pool *pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return Alloc32(size);
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocMid(size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ CFXMEM_Pages &pages = pPool->m_MidPages;
+ if (pages.m_pLimitPos > pages.m_pStartPage) {
+ FX_LPVOID p = pages.Alloc(size);
+ if (p) {
+ return p;
+ }
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ if (!m_pExtender) {
+ return NULL;
+ }
+ size_t newSize = m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE * m_MemConfig.nPageNum_MoreMid;
+ if (!newSize) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+ newSize += sizeof(CFXMEM_Pool);
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ size_t nMidPages = (newSize - sizeof(CFXMEM_Pool)) / (m_MemConfig.nPageSize_Mid * FX_FIXEDMEM_PAGESIZE);
+ if (nMidPages > m_MemConfig.nPageNum_MoreMid) {
+ nMidPages = m_MemConfig.nPageNum_MoreMid;
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, nMidPages);
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return pNewPool->m_MidPages.Alloc(size);
+}
+FX_LPVOID CFXMEM_FixedMgr::AllocLarge(size_t size)
+{
+ CFXMEM_Pool *pPool = &m_FirstPool;
+ do {
+ if (!pPool->m_bAlone && pPool->m_pLargePage) {
+ FX_LPVOID p = pPool->m_pLargePage->Alloc(size);
+ if (p) {
+ return p;
+ }
+ }
+ pPool = pPool->m_pNextPool;
+ } while(pPool);
+ if (!m_pExtender || !m_MemConfig.nPageSize_Large) {
+ return NULL;
+ }
+ CFXMEM_Pool *pNewPool = NULL;
+#if _FX_WORDSIZE_ == _FX_W64_
+ size_t newSize = ((size + 31) / 32 * 32 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block) + 4095) / 4096 * 4096;
+#else
+ size_t newSize = (size + 7) / 8 * 8 + sizeof(CFXMEM_Pool) + sizeof(CFXMEM_Page) + sizeof(CFXMEM_Block);
+#endif
+ if (newSize < m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE) {
+ newSize = m_MemConfig.nPageSize_Large * FX_FIXEDMEM_PAGESIZE;
+ }
+ if (!m_pExtender->More(m_pExtender, newSize, (void**)&pNewPool, &newSize)) {
+ return NULL;
+ }
+ pNewPool->Initialize(&m_MemConfig, newSize, 0, 0, 0, 0);
+ pNewPool->m_bAlone = size >= m_MemConfig.nPageSize_Alone * FX_FIXEDMEM_PAGESIZE;
+ pNewPool->m_pPrevPool = &m_FirstPool;
+ pPool = m_FirstPool.m_pNextPool;
+ pNewPool->m_pNextPool = pPool;
+ if (pPool) {
+ pPool->m_pPrevPool = pNewPool;
+ }
+ m_FirstPool.m_pNextPool = pNewPool;
+ return pNewPool->m_pLargePage->Alloc(size);
+}
+size_t CFXMEM_FixedMgr::GetSize(FX_LPVOID p) const
+{
+ const CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ return pFind->GetSize(p);
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+ return 0;
+}
+FX_LPVOID CFXMEM_FixedMgr::Alloc(size_t size)
+{
+ FX_LPVOID p;
+ if (size <= 32) {
+ p = AllocSmall(size);
+ if (p) {
+ return p;
+ }
+ }
+ if (size <= FX_FIXEDMEM_MIDBLOCKSIZE) {
+ p = AllocMid(size);
+ if (p) {
+ return p;
+ }
+ }
+ p = AllocLarge(size);
+ return p;
+}
+FX_LPVOID CFXMEM_FixedMgr::ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize)
+{
+ FX_LPVOID np = AllocSmall(newSize);
+ if (!np) {
+ return NULL;
+ }
+ FXSYS_memcpy32(np, p, oldSize);
+ pPool->Free(p);
+ return np;
+}
+FX_LPVOID CFXMEM_FixedMgr::Realloc(FX_LPVOID p, size_t newSize)
+{
+ if (!p) {
+ return Alloc(newSize);
+ }
+ size_t oldSize = 0;
+ CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ oldSize = pFind->GetSize(p);
+ if (oldSize >= newSize) {
+ return p;
+ }
+ break;
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+ if (!oldSize || !pFind) {
+ return Alloc(newSize);
+ }
+ FX_LPVOID np = NULL;
+ if (newSize <= 32) {
+ np = ReallocSmall(pFind, p, oldSize, newSize);
+ if (np) {
+ return np;
+ }
+ }
+ if (newSize <= FX_FIXEDMEM_MIDBLOCKSIZE) {
+ np = pFind->Realloc(p, oldSize, newSize);
+ if (np) {
+ return np;
+ }
+ }
+ np = Alloc(newSize);
+ if (np) {
+ FXSYS_memcpy32(np, p, oldSize);
+ pFind->Free(p);
+ }
+ if (pFind->m_bAlone && pFind->IsEmpty()) {
+ FreePool(pFind);
+ }
+ return np;
+}
+void CFXMEM_FixedMgr::Free(FX_LPVOID p)
+{
+ CFXMEM_Pool *pFind = &m_FirstPool;
+ do {
+ if (p > (FX_LPVOID)pFind && p < pFind->m_pLimitPos) {
+ pFind->Free(p);
+ if (pFind->m_bAlone && pFind->IsEmpty()) {
+ FreePool(pFind);
+ }
+ return;
+ }
+ pFind = pFind->m_pNextPool;
+ } while (pFind);
+}
+void CFXMEM_FixedMgr::FreePool(CFXMEM_Pool* pPool)
+{
+ FXSYS_assert(pPool->m_bAlone && pPool->IsEmpty());
+ FXSYS_assert(m_pExtender != NULL);
+ CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
+ CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
+ if (pPrevPool) {
+ pPrevPool->m_pNextPool = pNextPool;
+ }
+ if (pNextPool) {
+ pNextPool->m_pPrevPool = pPrevPool;
+ }
+ m_pExtender->Free(m_pExtender, pPool);
+}
+void CFXMEM_FixedMgr::FreeAll()
+{
+ if (!m_pExtender) {
+ return;
+ }
+ CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
+ while (pPool) {
+ CFXMEM_Pool* pPrevPool = pPool;
+ pPool = pPool->m_pNextPool;
+ m_pExtender->Free(m_pExtender, pPrevPool);
+ }
+ m_FirstPool.m_pNextPool = NULL;
+}
+void CFXMEM_FixedMgr::Purge()
+{
+ if (!m_pExtender) {
+ return;
+ }
+ CFXMEM_Pool* pPool = m_FirstPool.m_pNextPool;
+ while (pPool) {
+ CFXMEM_Pool* pNextPool = pPool->m_pNextPool;
+ if (pPool->IsEmpty()) {
+ CFXMEM_Pool* pPrevPool = pPool->m_pPrevPool;
+ pPrevPool->m_pNextPool = pNextPool;
+ if (pNextPool) {
+ pNextPool->m_pPrevPool = pPrevPool;
+ }
+ m_pExtender->Free(m_pExtender, pPool);
+ }
+ pPool = pNextPool;
+ }
+}
+extern const FX_BYTE OneLeadPos[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+extern const FX_BYTE ZeroLeadPos[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,
+};
diff --git a/core/src/fxcrt/fx_basic_plex.cpp b/core/src/fxcrt/fx_basic_plex.cpp
new file mode 100644
index 0000000000..dd3a8ba054
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_plex.cpp
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#include "plex.h"
+CFX_Plex* CFX_Plex::Create(IFX_Allocator* pAllocator, CFX_Plex*& pHead, FX_DWORD nMax, FX_DWORD cbElement)
+{
+ CFX_Plex* p = (CFX_Plex*)FX_Allocator_Alloc(pAllocator, FX_BYTE, sizeof(CFX_Plex) + nMax * cbElement);
+ if (!p) {
+ return NULL;
+ }
+ p->pNext = pHead;
+ pHead = p;
+ return p;
+}
+void CFX_Plex::FreeDataChain(IFX_Allocator* pAllocator)
+{
+ CFX_Plex* p = this;
+ while (p != NULL) {
+ FX_BYTE* bytes = (FX_BYTE*) p;
+ CFX_Plex* pNext = p->pNext;
+ FX_Allocator_Free(pAllocator, bytes);
+ p = pNext;
+ }
+}
diff --git a/core/src/fxcrt/fx_basic_utf.cpp b/core/src/fxcrt/fx_basic_utf.cpp
new file mode 100644
index 0000000000..b94e08df1d
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_utf.cpp
@@ -0,0 +1,102 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+void CFX_UTF8Decoder::Clear()
+{
+ m_Buffer.Clear();
+ m_PendingBytes = 0;
+}
+void CFX_UTF8Decoder::AppendChar(FX_DWORD ch)
+{
+ m_Buffer.AppendChar((FX_WCHAR)ch);
+}
+void CFX_UTF8Decoder::Input(FX_BYTE byte)
+{
+ if (byte < 0x80) {
+ m_PendingBytes = 0;
+ m_Buffer.AppendChar(byte);
+ } else if (byte < 0xc0) {
+ if (m_PendingBytes == 0) {
+ return;
+ }
+ m_PendingBytes --;
+ m_PendingChar |= (byte & 0x3f) << (m_PendingBytes * 6);
+ if (m_PendingBytes == 0) {
+ AppendChar(m_PendingChar);
+ }
+ } else if (byte < 0xe0) {
+ m_PendingBytes = 1;
+ m_PendingChar = (byte & 0x1f) << 6;
+ } else if (byte < 0xf0) {
+ m_PendingBytes = 2;
+ m_PendingChar = (byte & 0x0f) << 12;
+ } else if (byte < 0xf8) {
+ m_PendingBytes = 3;
+ m_PendingChar = (byte & 0x07) << 18;
+ } else if (byte < 0xfc) {
+ m_PendingBytes = 4;
+ m_PendingChar = (byte & 0x03) << 24;
+ } else if (byte < 0xfe) {
+ m_PendingBytes = 5;
+ m_PendingChar = (byte & 0x01) << 30;
+ }
+}
+void CFX_UTF8Encoder::Input(FX_WCHAR unicode)
+{
+ if ((FX_DWORD)unicode < 0x80) {
+ m_Buffer.AppendChar(unicode);
+ } else {
+ if ((FX_DWORD)unicode >= 0x80000000) {
+ return;
+ }
+ int nbytes = 0;
+ if ((FX_DWORD)unicode < 0x800) {
+ nbytes = 2;
+ } else if ((FX_DWORD)unicode < 0x10000) {
+ nbytes = 3;
+ } else if ((FX_DWORD)unicode < 0x200000) {
+ nbytes = 4;
+ } else if ((FX_DWORD)unicode < 0x4000000) {
+ nbytes = 5;
+ } else {
+ nbytes = 6;
+ }
+ static FX_BYTE prefix[] = {0xc0, 0xe0, 0xf0, 0xf8, 0xfc};
+ int order = 1 << ((nbytes - 1) * 6);
+ int code = unicode;
+ m_Buffer.AppendChar(prefix[nbytes - 2] | (code / order));
+ for (int i = 0; i < nbytes - 1; i ++) {
+ code = code % order;
+ order >>= 6;
+ m_Buffer.AppendChar(0x80 | (code / order));
+ }
+ }
+}
+CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
+ }
+ CFX_UTF8Encoder encoder;
+ while (len -- > 0) {
+ encoder.Input(*pwsStr ++);
+ }
+ return encoder.GetResult();
+}
+void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (len < 0) {
+ len = (FX_STRSIZE)FXSYS_wcslen(pwsStr);
+ }
+ CFX_UTF8Encoder encoder(pAllocator);
+ while (len -- > 0) {
+ encoder.Input(*pwsStr ++);
+ }
+ encoder.GetResult(utf8Str);
+}
diff --git a/core/src/fxcrt/fx_basic_util.cpp b/core/src/fxcrt/fx_basic_util.cpp
new file mode 100644
index 0000000000..af4d42c0ae
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_util.cpp
@@ -0,0 +1,444 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+#include <sys/types.h>
+#include <dirent.h>
+#else
+#include <direct.h>
+#endif
+CFX_PrivateData::~CFX_PrivateData()
+{
+ ClearAll();
+}
+void FX_PRIVATEDATA::FreeData()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_bSelfDestruct) {
+ delete (CFX_DestructObject*)m_pData;
+ } else if (m_pCallback) {
+ m_pCallback(m_pData);
+ }
+}
+void CFX_PrivateData::AddData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct)
+{
+ if (pModuleId == NULL) {
+ return;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ pList[i].FreeData();
+ pList[i].m_pData = pData;
+ pList[i].m_pCallback = callback;
+ return;
+ }
+ }
+ FX_PRIVATEDATA data = {pModuleId, pData, callback, bSelfDestruct};
+ m_DataList.Add(data);
+}
+void CFX_PrivateData::SetPrivateData(FX_LPVOID pModuleId, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)
+{
+ AddData(pModuleId, pData, callback, FALSE);
+}
+void CFX_PrivateData::SetPrivateObj(FX_LPVOID pModuleId, CFX_DestructObject* pObj)
+{
+ AddData(pModuleId, pObj, NULL, TRUE);
+}
+FX_BOOL CFX_PrivateData::RemovePrivateData(FX_LPVOID pModuleId)
+{
+ if (pModuleId == NULL) {
+ return FALSE;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ m_DataList.RemoveAt(i);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+FX_LPVOID CFX_PrivateData::GetPrivateData(FX_LPVOID pModuleId)
+{
+ if (pModuleId == NULL) {
+ return NULL;
+ }
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ if (pList[i].m_pModuleId == pModuleId) {
+ return pList[i].m_pData;
+ }
+ }
+ return NULL;
+}
+void CFX_PrivateData::ClearAll()
+{
+ FX_PRIVATEDATA* pList = m_DataList.GetData();
+ int count = m_DataList.GetSize();
+ for (int i = 0; i < count; i ++) {
+ pList[i].FreeData();
+ }
+ m_DataList.RemoveAll();
+}
+void FX_atonum(FX_BSTR strc, FX_BOOL& bInteger, void* pData)
+{
+ if (FXSYS_memchr(strc.GetPtr(), '.', strc.GetLength()) == NULL) {
+ bInteger = TRUE;
+ int cc = 0, integer = 0;
+ FX_LPCSTR str = strc.GetCStr();
+ int len = strc.GetLength();
+ FX_BOOL bNegative = FALSE;
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ while (cc < len) {
+ if (str[cc] < '0' || str[cc] > '9') {
+ break;
+ }
+ integer = integer * 10 + str[cc] - '0';
+ if (integer < 0) {
+ break;
+ }
+ cc ++;
+ }
+ if (bNegative) {
+ integer = -integer;
+ }
+ *(int*)pData = integer;
+ } else {
+ bInteger = FALSE;
+ *(FX_FLOAT*)pData = FX_atof(strc);
+ }
+}
+FX_FLOAT FX_atof(FX_BSTR strc)
+{
+ if (strc.GetLength() == 0) {
+ return 0.0;
+ }
+ int cc = 0;
+ FX_BOOL bNegative = FALSE;
+ FX_LPCSTR str = strc.GetCStr();
+ int len = strc.GetLength();
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ while (cc < len) {
+ if (str[cc] != '+' && str[cc] != '-') {
+ break;
+ }
+ cc ++;
+ }
+ FX_FLOAT value = 0;
+ while (cc < len) {
+ if (str[cc] == '.') {
+ break;
+ }
+ value = value * 10 + str[cc] - '0';
+ cc ++;
+ }
+ static const FX_FLOAT fraction_scales[] = {0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f,
+ 0.0000001f, 0.00000001f, 0.000000001f, 0.0000000001f, 0.00000000001f
+ };
+ int scale = 0;
+ if (cc < len && str[cc] == '.') {
+ cc ++;
+ while (cc < len) {
+ value += fraction_scales[scale] * (str[cc] - '0');
+ scale ++;
+ if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {
+ break;
+ }
+ cc ++;
+ }
+ }
+ return bNegative ? -value : value;
+}
+static FX_BOOL FX_IsDigit(FX_BYTE ch)
+{
+ return (ch >= '0' && ch <= '9') ? TRUE : FALSE;
+}
+static FX_BOOL FX_IsXDigit(FX_BYTE ch)
+{
+ return (FX_IsDigit(ch) || (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) ? TRUE : FALSE;
+}
+static FX_BYTE FX_MakeUpper(FX_BYTE ch)
+{
+ if (ch < 'a' || ch > 'z') {
+ return ch;
+ }
+ return ch - 32;
+}
+static int FX_HexToI(FX_BYTE ch)
+{
+ ch = FX_MakeUpper(ch);
+ return FX_IsDigit(ch) ? (ch - '0') : (ch - 55);
+}
+static const unsigned char url_encodeTable[128] = {
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 1, 1, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 1,
+};
+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl)
+{
+ const char arDigits[] = "0123456789ABCDEF";
+ CFX_ByteString rUrl;
+ int nLength = wsUrl.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ FX_DWORD word = wsUrl.GetAt(i);
+ if (word > 0x7F || url_encodeTable[word] == 1) {
+ CFX_ByteString bsUri = CFX_ByteString::FromUnicode((FX_WORD)word);
+ int nByte = bsUri.GetLength();
+ for (int j = 0; j < nByte; j++) {
+ rUrl += '%';
+ FX_BYTE code = bsUri.GetAt(j);
+ rUrl += arDigits[code >> 4];
+ rUrl += arDigits[code & 0x0F];
+ }
+ } else {
+ rUrl += CFX_ByteString::FromUnicode((FX_WORD)word);
+ }
+ }
+ return rUrl;
+}
+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl)
+{
+ CFX_ByteString rUrl;
+ int nLength = bsUrl.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ if (i < nLength - 2 && bsUrl[i] == '%' && FX_IsXDigit(bsUrl[i + 1]) && FX_IsXDigit(bsUrl[i + 2])) {
+ rUrl += (FX_HexToI(bsUrl[i + 1]) << 4 | FX_HexToI(bsUrl[i + 2]));
+ i += 2;
+ } else {
+ rUrl += bsUrl[i];
+ }
+ }
+ return CFX_WideString::FromLocal(rUrl);
+}
+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI)
+{
+ const char arDigits[] = "0123456789ABCDEF";
+ CFX_ByteString rURI;
+ CFX_ByteString bsUri = wsURI.UTF8Encode();
+ int nLength = bsUri.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ FX_BYTE code = bsUri.GetAt(i);
+ if (code > 0x7F || url_encodeTable[code] == 1) {
+ rURI += '%';
+ rURI += arDigits[code >> 4];
+ rURI += arDigits[code & 0x0F];
+ } else {
+ rURI += code;
+ }
+ }
+ return rURI;
+}
+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI)
+{
+ CFX_ByteString rURI;
+ int nLength = bsURI.GetLength();
+ for (int i = 0; i < nLength; i++) {
+ if (i < nLength - 2 && bsURI[i] == '%' && FX_IsXDigit(bsURI[i + 1]) && FX_IsXDigit(bsURI[i + 2])) {
+ rURI += (FX_HexToI(bsURI[i + 1]) << 4 | FX_HexToI(bsURI[i + 2]));
+ i += 2;
+ } else {
+ rURI += bsURI[i];
+ }
+ }
+ return CFX_WideString::FromUTF8(rURI);
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+class CFindFileData : public CFX_Object
+{
+public:
+ virtual ~CFindFileData() {}
+ HANDLE m_Handle;
+ FX_BOOL m_bEnd;
+};
+class CFindFileDataA : public CFindFileData
+{
+public:
+ virtual ~CFindFileDataA() {}
+ WIN32_FIND_DATAA m_FindData;
+};
+class CFindFileDataW : public CFindFileData
+{
+public:
+ virtual ~CFindFileDataW() {}
+ WIN32_FIND_DATAW m_FindData;
+};
+#endif
+void* FX_OpenFolder(FX_LPCSTR path)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifndef _WIN32_WCE
+ CFindFileDataA* pData = FX_NEW CFindFileDataA;
+ if (!pData) {
+ return NULL;
+ }
+#ifdef _FX_WINAPI_PARTITION_DESKTOP_
+ pData->m_Handle = FindFirstFileA(CFX_ByteString(path) + "/*.*", &pData->m_FindData);
+#else
+ pData->m_Handle = FindFirstFileExA(CFX_ByteString(path) + "/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
+#endif
+#else
+ CFindFileDataW* pData = FX_NEW CFindFileDataW;
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_Handle = FindFirstFileW(CFX_WideString::FromLocal(path) + L"/*.*", &pData->m_FindData);
+#endif
+ if (pData->m_Handle == INVALID_HANDLE_VALUE) {
+ delete pData;
+ return NULL;
+ }
+ pData->m_bEnd = FALSE;
+ return pData;
+#else
+ DIR* dir = opendir(path);
+ return dir;
+#endif
+}
+void* FX_OpenFolder(FX_LPCWSTR path)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileDataW* pData = FX_NEW CFindFileDataW;
+ if (!pData) {
+ return NULL;
+ }
+#ifdef _FX_WINAPI_PARTITION_DESKTOP_
+ pData->m_Handle = FindFirstFileW(CFX_WideString(path) + L"/*.*", &pData->m_FindData);
+#else
+ pData->m_Handle = FindFirstFileExW(CFX_WideString(path) + L"/*.*", FindExInfoStandard, &pData->m_FindData, FindExSearchNameMatch, NULL, 0);
+#endif
+ if (pData->m_Handle == INVALID_HANDLE_VALUE) {
+ delete pData;
+ return NULL;
+ }
+ pData->m_bEnd = FALSE;
+ return pData;
+#else
+ DIR* dir = opendir(CFX_ByteString::FromUnicode(path));
+ return dir;
+#endif
+}
+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder)
+{
+ if (handle == NULL) {
+ return FALSE;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifndef _WIN32_WCE
+ CFindFileDataA* pData = (CFindFileDataA*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = pData->m_FindData.cFileName;
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileA(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#else
+ CFindFileDataW* pData = (CFindFileDataW*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = CFX_ByteString::FromUnicode(pData->m_FindData.cFileName);
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#endif
+#elif defined(__native_client__)
+ abort();
+ return FALSE;
+#else
+ struct dirent *de = readdir((DIR*)handle);
+ if (de == NULL) {
+ return FALSE;
+ }
+ filename = de->d_name;
+ bFolder = de->d_type == DT_DIR;
+ return TRUE;
+#endif
+}
+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder)
+{
+ if (handle == NULL) {
+ return FALSE;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileDataW* pData = (CFindFileDataW*)handle;
+ if (pData->m_bEnd) {
+ return FALSE;
+ }
+ filename = pData->m_FindData.cFileName;
+ bFolder = pData->m_FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
+ if (!FindNextFileW(pData->m_Handle, &pData->m_FindData)) {
+ pData->m_bEnd = TRUE;
+ }
+ return TRUE;
+#elif defined(__native_client__)
+ abort();
+ return FALSE;
+#else
+ struct dirent *de = readdir((DIR*)handle);
+ if (de == NULL) {
+ return FALSE;
+ }
+ filename = CFX_WideString::FromLocal(de->d_name);
+ bFolder = de->d_type == DT_DIR;
+ return TRUE;
+#endif
+}
+void FX_CloseFolder(void* handle)
+{
+ if (handle == NULL) {
+ return;
+ }
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ CFindFileData* pData = (CFindFileData*)handle;
+ FindClose(pData->m_Handle);
+ delete pData;
+#else
+ closedir((DIR*)handle);
+#endif
+}
+FX_WCHAR FX_GetFolderSeparator()
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ return '\\';
+#else
+ return '/';
+#endif
+}
diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
new file mode 100644
index 0000000000..900f05846a
--- /dev/null
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -0,0 +1,1168 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_basic.h"
+static CFX_StringDataW* FX_AllocStringW(int nLen)
+{
+ if (nLen == 0) {
+ return NULL;
+ }
+ CFX_StringDataW* pData = (CFX_StringDataW*)FX_Alloc(FX_BYTE, sizeof(long) * 3 + (nLen + 1) * sizeof(FX_WCHAR));
+ if (!pData) {
+ return NULL;
+ }
+ pData->m_nAllocLength = nLen;
+ pData->m_nDataLength = nLen;
+ pData->m_nRefs = 1;
+ pData->m_String[nLen] = 0;
+ return pData;
+}
+static void FX_ReleaseStringW(CFX_StringDataW* pData)
+{
+ if (pData == NULL) {
+ return;
+ }
+ pData->m_nRefs --;
+ if (pData->m_nRefs <= 0) {
+ FX_Free(pData);
+ }
+}
+CFX_WideString::~CFX_WideString()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ m_pData->m_nRefs --;
+ if (m_pData->m_nRefs < 1) {
+ FX_Free(m_pData);
+ }
+}
+void CFX_WideString::InitStr(FX_LPCWSTR lpsz, FX_STRSIZE nLen)
+{
+ if (nLen < 0) {
+ nLen = lpsz ? (FX_STRSIZE)FXSYS_wcslen(lpsz) : 0;
+ }
+ if (nLen) {
+ m_pData = FX_AllocStringW(nLen);
+ if (!m_pData) {
+ return;
+ }
+ FXSYS_memcpy32(m_pData->m_String, lpsz, nLen * sizeof(FX_WCHAR));
+ } else {
+ m_pData = NULL;
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideString& stringSrc)
+{
+ if (stringSrc.m_pData == NULL) {
+ m_pData = NULL;
+ return;
+ }
+ if (stringSrc.m_pData->m_nRefs >= 0) {
+ m_pData = stringSrc.m_pData;
+ m_pData->m_nRefs ++;
+ } else {
+ m_pData = NULL;
+ *this = stringSrc;
+ }
+}
+CFX_WideString::CFX_WideString(FX_WCHAR ch)
+{
+ m_pData = FX_AllocStringW(1);
+ if (m_pData) {
+ m_pData->m_String[0] = ch;
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideStringC& str)
+{
+ if (str.IsEmpty()) {
+ m_pData = NULL;
+ return;
+ }
+ m_pData = FX_AllocStringW(str.GetLength());
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str.GetPtr(), str.GetLength()*sizeof(FX_WCHAR));
+ }
+}
+CFX_WideString::CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2)
+{
+ m_pData = NULL;
+ int nNewLen = str1.GetLength() + str2.GetLength();
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocStringW(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, str1.GetPtr(), str1.GetLength()*sizeof(FX_WCHAR));
+ FXSYS_memcpy32(m_pData->m_String + str1.GetLength(), str2.GetPtr(), str2.GetLength()*sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::ReleaseBuffer(FX_STRSIZE nNewLength)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (nNewLength == -1) {
+ nNewLength = m_pData ? (FX_STRSIZE)FXSYS_wcslen(m_pData->m_String) : 0;
+ }
+ if (nNewLength == 0) {
+ Empty();
+ return;
+ }
+ FXSYS_assert(nNewLength <= m_pData->m_nAllocLength);
+ m_pData->m_nDataLength = nNewLength;
+ m_pData->m_String[nNewLength] = 0;
+}
+const CFX_WideString& CFX_WideString::operator=(FX_LPCWSTR lpsz)
+{
+ if (lpsz == NULL || lpsz[0] == 0) {
+ Empty();
+ } else {
+ AssignCopy((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator=(const CFX_WideStringC& stringSrc)
+{
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else {
+ AssignCopy(stringSrc.GetLength(), stringSrc.GetPtr());
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator=(const CFX_WideString& stringSrc)
+{
+ if (m_pData == stringSrc.m_pData) {
+ return *this;
+ }
+ if (stringSrc.IsEmpty()) {
+ Empty();
+ } else if ((m_pData && m_pData->m_nRefs < 0) ||
+ (stringSrc.m_pData && stringSrc.m_pData->m_nRefs < 0)) {
+ AssignCopy(stringSrc.m_pData->m_nDataLength, stringSrc.m_pData->m_String);
+ } else {
+ Empty();
+ m_pData = stringSrc.m_pData;
+ if (m_pData) {
+ m_pData->m_nRefs ++;
+ }
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(FX_WCHAR ch)
+{
+ ConcatInPlace(1, &ch);
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(FX_LPCWSTR lpsz)
+{
+ if (lpsz) {
+ ConcatInPlace((FX_STRSIZE)FXSYS_wcslen(lpsz), lpsz);
+ }
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideString& string)
+{
+ if (string.m_pData == NULL) {
+ return *this;
+ }
+ ConcatInPlace(string.m_pData->m_nDataLength, string.m_pData->m_String);
+ return *this;
+}
+const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& string)
+{
+ if (string.IsEmpty()) {
+ return *this;
+ }
+ ConcatInPlace(string.GetLength(), string.GetPtr());
+ return *this;
+}
+bool operator==(const CFX_WideString& s1, FX_LPCWSTR s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2)
+{
+ return s2.Equal(s1);
+}
+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2)
+{
+ return s1.Equal(s2);
+}
+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2)
+{
+ return s2.Equal(s1);
+}
+bool operator != (const CFX_WideString& s1, FX_LPCWSTR s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2)
+{
+ return !s1.Equal(s2);
+}
+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2)
+{
+ return !s2.Equal(s1);
+}
+bool CFX_WideString::Equal(const CFX_WideStringC& str) const
+{
+ if (m_pData == NULL) {
+ return str.IsEmpty();
+ }
+ return str.GetLength() == m_pData->m_nDataLength &&
+ FXSYS_memcmp32(str.GetPtr(), m_pData->m_String, m_pData->m_nDataLength * sizeof(FX_WCHAR)) == 0;
+}
+void CFX_WideString::Empty()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ if (m_pData->m_nRefs > 1) {
+ m_pData->m_nRefs --;
+ } else {
+ FX_Free(m_pData);
+ }
+ m_pData = NULL;
+}
+void CFX_WideString::ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
+{
+ if (nSrcLen == 0 || lpszSrcData == NULL) {
+ return;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocStringW(nSrcLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ }
+ return;
+ }
+ if (m_pData->m_nRefs > 1 || m_pData->m_nDataLength + nSrcLen > m_pData->m_nAllocLength) {
+ CFX_StringDataW* pOldData = m_pData;
+ ConcatCopy(m_pData->m_nDataLength, m_pData->m_String, nSrcLen, lpszSrcData);
+ FX_ReleaseStringW(pOldData);
+ } else {
+ FXSYS_memcpy32(m_pData->m_String + m_pData->m_nDataLength, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength += nSrcLen;
+ m_pData->m_String[m_pData->m_nDataLength] = 0;
+ }
+}
+void CFX_WideString::ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data,
+ FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data)
+{
+ FX_STRSIZE nNewLen = nSrc1Len + nSrc2Len;
+ if (nNewLen == 0) {
+ return;
+ }
+ m_pData = FX_AllocStringW(nNewLen);
+ if (m_pData) {
+ FXSYS_memcpy32(m_pData->m_String, lpszSrc1Data, nSrc1Len * sizeof(FX_WCHAR));
+ FXSYS_memcpy32(m_pData->m_String + nSrc1Len, lpszSrc2Data, nSrc2Len * sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::CopyBeforeWrite()
+{
+ if (m_pData == NULL || m_pData->m_nRefs <= 1) {
+ return;
+ }
+ CFX_StringDataW* pData = m_pData;
+ m_pData->m_nRefs --;
+ FX_STRSIZE nDataLength = pData->m_nDataLength;
+ m_pData = FX_AllocStringW(nDataLength);
+ if (m_pData != NULL) {
+ FXSYS_memcpy32(m_pData->m_String, pData->m_String, (nDataLength + 1) * sizeof(FX_WCHAR));
+ }
+}
+void CFX_WideString::AllocBeforeWrite(FX_STRSIZE nLen)
+{
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nLen) {
+ return;
+ }
+ Empty();
+ m_pData = FX_AllocStringW(nLen);
+}
+void CFX_WideString::AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData)
+{
+ AllocBeforeWrite(nSrcLen);
+ FXSYS_memcpy32(m_pData->m_String, lpszSrcData, nSrcLen * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nSrcLen;
+ m_pData->m_String[nSrcLen] = 0;
+}
+int CFX_WideString::Compare(FX_LPCWSTR lpsz) const
+{
+ if (m_pData == NULL) {
+ return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
+ }
+ return FXSYS_wcscmp(m_pData->m_String, lpsz);
+}
+CFX_ByteString CFX_WideString::UTF8Encode() const
+{
+ return FX_UTF8Encode(*this);
+}
+CFX_ByteString CFX_WideString::UTF16LE_Encode(FX_BOOL bTerminate) const
+{
+ if (m_pData == NULL) {
+ return bTerminate ? CFX_ByteString(FX_BSTRC("\0\0")) : CFX_ByteString();
+ }
+ int len = m_pData->m_nDataLength;
+ CFX_ByteString result;
+ FX_LPSTR buffer = result.GetBuffer(len * 2 + (bTerminate ? 2 : 0));
+ for (int i = 0; i < len; i ++) {
+ buffer[i * 2] = m_pData->m_String[i] & 0xff;
+ buffer[i * 2 + 1] = m_pData->m_String[i] >> 8;
+ }
+ if (bTerminate) {
+ buffer[len * 2] = 0;
+ buffer[len * 2 + 1] = 0;
+ result.ReleaseBuffer(len * 2 + 2);
+ } else {
+ result.ReleaseBuffer(len * 2);
+ }
+ return result;
+}
+void CFX_WideString::ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap)
+{
+ if (pCharMap == NULL) {
+ pCharMap = CFX_CharMap::GetDefaultMapper();
+ }
+ *this = pCharMap->m_GetWideString(pCharMap, str);
+}
+void CFX_WideString::Reserve(FX_STRSIZE len)
+{
+ GetBuffer(len);
+ ReleaseBuffer(GetLength());
+}
+FX_LPWSTR CFX_WideString::GetBuffer(FX_STRSIZE nMinBufLength)
+{
+ if (m_pData == NULL && nMinBufLength == 0) {
+ return NULL;
+ }
+ if (m_pData && m_pData->m_nRefs <= 1 && m_pData->m_nAllocLength >= nMinBufLength) {
+ return m_pData->m_String;
+ }
+ if (m_pData == NULL) {
+ m_pData = FX_AllocStringW(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ m_pData->m_nDataLength = 0;
+ m_pData->m_String[0] = 0;
+ return m_pData->m_String;
+ }
+ CFX_StringDataW* pOldData = m_pData;
+ FX_STRSIZE nOldLen = pOldData->m_nDataLength;
+ if (nMinBufLength < nOldLen) {
+ nMinBufLength = nOldLen;
+ }
+ m_pData = FX_AllocStringW(nMinBufLength);
+ if (!m_pData) {
+ return NULL;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pOldData->m_String, (nOldLen + 1)*sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nOldLen;
+ pOldData->m_nRefs --;
+ if (pOldData->m_nRefs <= 0) {
+ FX_Free(pOldData);
+ }
+ return m_pData->m_String;
+}
+CFX_WideString CFX_WideString::FromLocal(const char* str, FX_STRSIZE len)
+{
+ CFX_WideString result;
+ result.ConvertFrom(CFX_ByteString(str, len));
+ return result;
+}
+CFX_WideString CFX_WideString::FromUTF8(const char* str, FX_STRSIZE len)
+{
+ if (!str) {
+ return CFX_WideString();
+ }
+ if (len < 0) {
+ len = 0;
+ while (str[len]) {
+ len ++;
+ }
+ }
+ CFX_UTF8Decoder decoder;
+ for (FX_STRSIZE i = 0; i < len; i ++) {
+ decoder.Input(str[i]);
+ }
+ return decoder.GetResult();
+}
+CFX_WideString CFX_WideString::FromUTF16LE(const unsigned short* wstr, FX_STRSIZE wlen)
+{
+ if (!wstr || !wlen) {
+ return CFX_WideString();
+ }
+ if (wlen < 0) {
+ wlen = 0;
+ while (wstr[wlen]) {
+ wlen ++;
+ }
+ }
+ CFX_WideString result;
+ FX_WCHAR* buf = result.GetBuffer(wlen);
+ for (int i = 0; i < wlen; i ++) {
+ buf[i] = wstr[i];
+ }
+ result.ReleaseBuffer(wlen);
+ return result;
+}
+void CFX_WideString::AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex,
+ FX_STRSIZE nExtraLen) const
+{
+ FX_STRSIZE nNewLen = nCopyLen + nExtraLen;
+ if (nNewLen == 0) {
+ return;
+ }
+ ASSERT(dest.m_pData == NULL);
+ dest.m_pData = FX_AllocStringW(nNewLen);
+ if (dest.m_pData) {
+ FXSYS_memcpy32(dest.m_pData->m_String, m_pData->m_String + nCopyIndex, nCopyLen * sizeof(FX_WCHAR));
+ }
+}
+CFX_WideString CFX_WideString::Left(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, 0, 0);
+ return dest;
+}
+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst) const
+{
+ return Mid(nFirst, m_pData->m_nDataLength - nFirst);
+}
+CFX_WideString CFX_WideString::Mid(FX_STRSIZE nFirst, FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nFirst < 0) {
+ nFirst = 0;
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nFirst + nCount > m_pData->m_nDataLength) {
+ nCount = m_pData->m_nDataLength - nFirst;
+ }
+ if (nFirst > m_pData->m_nDataLength) {
+ nCount = 0;
+ }
+ if (nFirst == 0 && nFirst + nCount == m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, nFirst, 0);
+ return dest;
+}
+CFX_WideString CFX_WideString::Right(FX_STRSIZE nCount) const
+{
+ if (m_pData == NULL) {
+ return CFX_WideString();
+ }
+ if (nCount < 0) {
+ nCount = 0;
+ }
+ if (nCount >= m_pData->m_nDataLength) {
+ return *this;
+ }
+ CFX_WideString dest;
+ AllocCopy(dest, nCount, m_pData->m_nDataLength - nCount, 0);
+ return dest;
+}
+int CFX_WideString::CompareNoCase(FX_LPCWSTR lpsz) const
+{
+ if (m_pData == NULL) {
+ return (lpsz == NULL || lpsz[0] == 0) ? 0 : -1;
+ }
+ return FXSYS_wcsicmp(m_pData->m_String, lpsz);
+}
+int CFX_WideString::Compare(const CFX_WideString& str) const
+{
+ if (m_pData == NULL) {
+ if (str.m_pData == NULL) {
+ return 0;
+ }
+ return -1;
+ } else if (str.m_pData == NULL) {
+ return 1;
+ }
+ int this_len = m_pData->m_nDataLength;
+ int that_len = str.m_pData->m_nDataLength;
+ int min_len = this_len < that_len ? this_len : that_len;
+ for (int i = 0; i < min_len; i ++) {
+ if (m_pData->m_String[i] < str.m_pData->m_String[i]) {
+ return -1;
+ } else if (m_pData->m_String[i] > str.m_pData->m_String[i]) {
+ return 1;
+ }
+ }
+ if (this_len < that_len) {
+ return -1;
+ } else if (this_len > that_len) {
+ return 1;
+ }
+ return 0;
+}
+FX_LPWSTR CFX_WideString::LockBuffer()
+{
+ if (m_pData == NULL) {
+ return NULL;
+ }
+ FX_LPWSTR lpsz = GetBuffer(0);
+ m_pData->m_nRefs = -1;
+ return lpsz;
+}
+void CFX_WideString::SetAt(FX_STRSIZE nIndex, FX_WCHAR ch)
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ ASSERT(nIndex >= 0);
+ ASSERT(nIndex < m_pData->m_nDataLength);
+ CopyBeforeWrite();
+ m_pData->m_String[nIndex] = ch;
+}
+void CFX_WideString::MakeLower()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_wcslwr(m_pData->m_String);
+}
+void CFX_WideString::MakeUpper()
+{
+ if (m_pData == NULL) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FXSYS_wcsupr(m_pData->m_String);
+}
+FX_STRSIZE CFX_WideString::Find(FX_LPCWSTR lpszSub, FX_STRSIZE nStart) const
+{
+ FX_STRSIZE nLength = GetLength();
+ if (nLength < 1 || nStart > nLength) {
+ return -1;
+ }
+ FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcsstr(m_pData->m_String + nStart, lpszSub);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+FX_STRSIZE CFX_WideString::Find(FX_WCHAR ch, FX_STRSIZE nStart) const
+{
+ if (m_pData == NULL) {
+ return -1;
+ }
+ FX_STRSIZE nLength = m_pData->m_nDataLength;
+ if (nStart >= nLength) {
+ return -1;
+ }
+ FX_LPCWSTR lpsz = (FX_LPCWSTR)FXSYS_wcschr(m_pData->m_String + nStart, ch);
+ return (lpsz == NULL) ? -1 : (int)(lpsz - m_pData->m_String);
+}
+void CFX_WideString::TrimRight(FX_LPCWSTR lpszTargetList)
+{
+ FXSYS_assert(lpszTargetList != NULL);
+ if (m_pData == NULL || *lpszTargetList == 0) {
+ return;
+ }
+ CopyBeforeWrite();
+ FX_STRSIZE len = GetLength();
+ if (len < 1) {
+ return;
+ }
+ FX_STRSIZE pos = len;
+ while (pos) {
+ if (FXSYS_wcschr(lpszTargetList, m_pData->m_String[pos - 1]) == NULL) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < len) {
+ m_pData->m_String[pos] = 0;
+ m_pData->m_nDataLength = pos;
+ }
+}
+void CFX_WideString::TrimRight(FX_WCHAR chTarget)
+{
+ FX_WCHAR str[2] = {chTarget, 0};
+ TrimRight(str);
+}
+void CFX_WideString::TrimRight()
+{
+ TrimRight(L"\x09\x0a\x0b\x0c\x0d\x20");
+}
+void CFX_WideString::TrimLeft(FX_LPCWSTR lpszTargets)
+{
+ FXSYS_assert(lpszTargets != NULL);
+ if (m_pData == NULL || *lpszTargets == 0) {
+ return;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return;
+ }
+ FX_LPCWSTR lpsz = m_pData->m_String;
+ while (*lpsz != 0) {
+ if (FXSYS_wcschr(lpszTargets, *lpsz) == NULL) {
+ break;
+ }
+ lpsz ++;
+ }
+ if (lpsz != m_pData->m_String) {
+ int nDataLength = m_pData->m_nDataLength - (FX_STRSIZE)(lpsz - m_pData->m_String);
+ FXSYS_memmove32(m_pData->m_String, lpsz, (nDataLength + 1)*sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nDataLength;
+ }
+}
+void CFX_WideString::TrimLeft(FX_WCHAR chTarget)
+{
+ FX_WCHAR str[2] = {chTarget, 0};
+ TrimLeft(str);
+}
+void CFX_WideString::TrimLeft()
+{
+ TrimLeft(L"\x09\x0a\x0b\x0c\x0d\x20");
+}
+FX_STRSIZE CFX_WideString::Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew)
+{
+ if (GetLength() < 1) {
+ return 0;
+ }
+ if (lpszOld == NULL) {
+ return 0;
+ }
+ FX_STRSIZE nSourceLen = (FX_STRSIZE)FXSYS_wcslen(lpszOld);
+ if (nSourceLen == 0) {
+ return 0;
+ }
+ FX_STRSIZE nReplacementLen = lpszNew ? (FX_STRSIZE)FXSYS_wcslen(lpszNew) : 0;
+ FX_STRSIZE nCount = 0;
+ FX_LPWSTR lpszStart = m_pData->m_String;
+ FX_LPWSTR lpszEnd = m_pData->m_String + m_pData->m_nDataLength;
+ FX_LPWSTR lpszTarget;
+ {
+ while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
+ nCount++;
+ lpszStart = lpszTarget + nSourceLen;
+ }
+ }
+ if (nCount > 0) {
+ CopyBeforeWrite();
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ FX_STRSIZE nNewLength = nOldLength + (nReplacementLen - nSourceLen) * nCount;
+ if (m_pData->m_nAllocLength < nNewLength || m_pData->m_nRefs > 1) {
+ CFX_StringDataW* pOldData = m_pData;
+ FX_LPCWSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocStringW(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ FXSYS_memcpy32(m_pData->m_String, pstr, pOldData->m_nDataLength * sizeof(FX_WCHAR));
+ FX_ReleaseStringW(pOldData);
+ }
+ lpszStart = m_pData->m_String;
+ lpszEnd = m_pData->m_String + FX_MAX(m_pData->m_nDataLength, nNewLength);
+ {
+ while ((lpszTarget = (FX_LPWSTR)FXSYS_wcsstr(lpszStart, lpszOld)) != NULL && lpszStart < lpszEnd) {
+ FX_STRSIZE nBalance = nOldLength - (FX_STRSIZE)(lpszTarget - m_pData->m_String + nSourceLen);
+ FXSYS_memmove32(lpszTarget + nReplacementLen, lpszTarget + nSourceLen, nBalance * sizeof(FX_WCHAR));
+ FXSYS_memcpy32(lpszTarget, lpszNew, nReplacementLen * sizeof(FX_WCHAR));
+ lpszStart = lpszTarget + nReplacementLen;
+ lpszStart[nBalance] = 0;
+ nOldLength += (nReplacementLen - nSourceLen);
+ }
+ }
+ ASSERT(m_pData->m_String[nNewLength] == 0);
+ m_pData->m_nDataLength = nNewLength;
+ }
+ return nCount;
+}
+FX_STRSIZE CFX_WideString::Insert(FX_STRSIZE nIndex, FX_WCHAR ch)
+{
+ CopyBeforeWrite();
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nNewLength = GetLength();
+ if (nIndex > nNewLength) {
+ nIndex = nNewLength;
+ }
+ nNewLength++;
+ if (m_pData == NULL || m_pData->m_nAllocLength < nNewLength) {
+ CFX_StringDataW* pOldData = m_pData;
+ FX_LPCWSTR pstr = m_pData->m_String;
+ m_pData = FX_AllocStringW(nNewLength);
+ if (!m_pData) {
+ return 0;
+ }
+ if(pOldData != NULL) {
+ FXSYS_memmove32(m_pData->m_String, pstr, (pOldData->m_nDataLength + 1)*sizeof(FX_WCHAR));
+ FX_ReleaseStringW(pOldData);
+ } else {
+ m_pData->m_String[0] = 0;
+ }
+ }
+ FXSYS_memmove32(m_pData->m_String + nIndex + 1,
+ m_pData->m_String + nIndex, (nNewLength - nIndex)*sizeof(FX_WCHAR));
+ m_pData->m_String[nIndex] = ch;
+ m_pData->m_nDataLength = nNewLength;
+ return nNewLength;
+}
+FX_STRSIZE CFX_WideString::Delete(FX_STRSIZE nIndex, FX_STRSIZE nCount)
+{
+ if (GetLength() < 1) {
+ return 0;
+ }
+ if (nIndex < 0) {
+ nIndex = 0;
+ }
+ FX_STRSIZE nOldLength = m_pData->m_nDataLength;
+ if (nCount > 0 && nIndex < nOldLength) {
+ CopyBeforeWrite();
+ int nBytesToCopy = nOldLength - (nIndex + nCount) + 1;
+ FXSYS_memmove32(m_pData->m_String + nIndex,
+ m_pData->m_String + nIndex + nCount, nBytesToCopy * sizeof(FX_WCHAR));
+ m_pData->m_nDataLength = nOldLength - nCount;
+ }
+ return m_pData->m_nDataLength;
+}
+FX_STRSIZE CFX_WideString::Remove(FX_WCHAR chRemove)
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ CopyBeforeWrite();
+ if (GetLength() < 1) {
+ return 0;
+ }
+ FX_LPWSTR pstrSource = m_pData->m_String;
+ FX_LPWSTR pstrDest = m_pData->m_String;
+ FX_LPWSTR pstrEnd = m_pData->m_String + m_pData->m_nDataLength;
+ while (pstrSource < pstrEnd) {
+ if (*pstrSource != chRemove) {
+ *pstrDest = *pstrSource;
+ pstrDest ++;
+ }
+ pstrSource ++;
+ }
+ *pstrDest = 0;
+ FX_STRSIZE nCount = (FX_STRSIZE)(pstrSource - pstrDest);
+ m_pData->m_nDataLength -= nCount;
+ return nCount;
+}
+#define FORCE_ANSI 0x10000
+#define FORCE_UNICODE 0x20000
+#define FORCE_INT64 0x40000
+void CFX_WideString::FormatV(FX_LPCWSTR lpszFormat, va_list argList)
+{
+ va_list argListSave;
+#if defined(__ARMCC_VERSION) || (!defined(_MSC_VER) && (_FX_CPU_ == _FX_X64_ || _FX_CPU_ == _FX_IA64_ || _FX_CPU_ == _FX_ARM64_)) || defined(__native_client__)
+ va_copy(argListSave, argList);
+#else
+ argListSave = argList;
+#endif
+ int nMaxLen = 0;
+ for (FX_LPCWSTR lpsz = lpszFormat; *lpsz != 0; lpsz ++) {
+ if (*lpsz != '%' || *(lpsz = lpsz + 1) == '%') {
+ nMaxLen += (FX_STRSIZE)FXSYS_wcslen(lpsz);
+ continue;
+ }
+ int nItemLen = 0;
+ int nWidth = 0;
+ for (; *lpsz != 0; lpsz ++) {
+ if (*lpsz == '#') {
+ nMaxLen += 2;
+ } else if (*lpsz == '*') {
+ nWidth = va_arg(argList, int);
+ } else if (*lpsz == '-' || *lpsz == '+' || *lpsz == '0' ||
+ *lpsz == ' ')
+ ;
+ else {
+ break;
+ }
+ }
+ if (nWidth == 0) {
+ nWidth = FXSYS_wtoi(lpsz);
+ for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz ++)
+ ;
+ }
+ if (nWidth < 0 || nWidth > 128 * 1024) {
+ lpszFormat = (FX_LPCWSTR)L"Bad width";
+ nMaxLen = 10;
+ break;
+ }
+ int nPrecision = 0;
+ if (*lpsz == '.') {
+ lpsz ++;
+ if (*lpsz == '*') {
+ nPrecision = va_arg(argList, int);
+ lpsz ++;
+ } else {
+ nPrecision = FXSYS_wtoi(lpsz);
+ for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz ++)
+ ;
+ }
+ }
+ if (nPrecision < 0 || nPrecision > 128 * 1024) {
+ lpszFormat = (FX_LPCWSTR)L"Bad precision";
+ nMaxLen = 14;
+ break;
+ }
+ int nModifier = 0;
+ if (*lpsz == L'I' && *(lpsz + 1) == L'6' && *(lpsz + 2) == L'4') {
+ lpsz += 3;
+ nModifier = FORCE_INT64;
+ } else {
+ switch (*lpsz) {
+ case 'h':
+ nModifier = FORCE_ANSI;
+ lpsz ++;
+ break;
+ case 'l':
+ nModifier = FORCE_UNICODE;
+ lpsz ++;
+ break;
+ case 'F':
+ case 'N':
+ case 'L':
+ lpsz ++;
+ break;
+ }
+ }
+ switch (*lpsz | nModifier) {
+ case 'c':
+ case 'C':
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_ANSI:
+ case 'C'|FORCE_ANSI:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 'c'|FORCE_UNICODE:
+ case 'C'|FORCE_UNICODE:
+ nItemLen = 2;
+ va_arg(argList, int);
+ break;
+ case 's': {
+ FX_LPCWSTR pstrNextArg = va_arg(argList, FX_LPCWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 'S': {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_ANSI:
+ case 'S'|FORCE_ANSI: {
+ FX_LPCSTR pstrNextArg = va_arg(argList, FX_LPCSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ case 's'|FORCE_UNICODE:
+ case 'S'|FORCE_UNICODE: {
+ FX_LPWSTR pstrNextArg = va_arg(argList, FX_LPWSTR);
+ if (pstrNextArg == NULL) {
+ nItemLen = 6;
+ } else {
+ nItemLen = (FX_STRSIZE)FXSYS_wcslen(pstrNextArg);
+ if (nItemLen < 1) {
+ nItemLen = 1;
+ }
+ }
+ }
+ break;
+ }
+ if (nItemLen != 0) {
+ if (nPrecision != 0 && nItemLen > nPrecision) {
+ nItemLen = nPrecision;
+ }
+ if (nItemLen < nWidth) {
+ nItemLen = nWidth;
+ }
+ } else {
+ switch (*lpsz) {
+ case 'd':
+ case 'i':
+ case 'u':
+ case 'x':
+ case 'X':
+ case 'o':
+ if (nModifier & FORCE_INT64) {
+ va_arg(argList, FX_INT64);
+ } else {
+ va_arg(argList, int);
+ }
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'a':
+ case 'A':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ va_arg(argList, double);
+ nItemLen = 128;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'f':
+ if (nWidth + nPrecision > 100) {
+ nItemLen = nPrecision + nWidth + 128;
+ } else {
+ double f;
+ char pszTemp[256];
+ f = va_arg(argList, double);
+ FXSYS_snprintf(pszTemp, sizeof(pszTemp), "%*.*f", nWidth, nPrecision + 6, f );
+ nItemLen = (FX_STRSIZE)FXSYS_strlen(pszTemp);
+ }
+ break;
+ case 'p':
+ va_arg(argList, void*);
+ nItemLen = 32;
+ if (nItemLen < nWidth + nPrecision) {
+ nItemLen = nWidth + nPrecision;
+ }
+ break;
+ case 'n':
+ va_arg(argList, int*);
+ break;
+ }
+ }
+ nMaxLen += nItemLen;
+ }
+ GetBuffer(nMaxLen);
+ if (m_pData) {
+ FXSYS_vswprintf((wchar_t*)m_pData->m_String, nMaxLen + 1, (const wchar_t*)lpszFormat, argListSave);
+ ReleaseBuffer();
+ }
+ va_end(argListSave);
+}
+void CFX_WideString::Format(FX_LPCWSTR lpszFormat, ...)
+{
+ va_list argList;
+ va_start(argList, lpszFormat);
+ FormatV(lpszFormat, argList);
+ va_end(argList);
+}
+FX_FLOAT FX_wtof(FX_LPCWSTR str, int len)
+{
+ if (len == 0) {
+ return 0.0;
+ }
+ int cc = 0;
+ FX_BOOL bNegative = FALSE;
+ if (str[0] == '+') {
+ cc++;
+ } else if (str[0] == '-') {
+ bNegative = TRUE;
+ cc++;
+ }
+ int integer = 0;
+ while (cc < len) {
+ if (str[cc] == '.') {
+ break;
+ }
+ integer = integer * 10 + str[cc] - '0';
+ cc ++;
+ }
+ FX_FLOAT fraction = 0;
+ if (str[cc] == '.') {
+ cc ++;
+ FX_FLOAT scale = 0.1f;
+ while (cc < len) {
+ fraction += scale * (str[cc] - '0');
+ scale *= 0.1f;
+ cc ++;
+ }
+ }
+ fraction += (FX_FLOAT)integer;
+ return bNegative ? -fraction : fraction;
+}
+int CFX_WideString::GetInteger() const
+{
+ if (m_pData == NULL) {
+ return 0;
+ }
+ return FXSYS_wtoi(m_pData->m_String);
+}
+FX_FLOAT CFX_WideString::GetFloat() const
+{
+ if (m_pData == NULL) {
+ return 0.0;
+ }
+ return FX_wtof(m_pData->m_String, m_pData->m_nDataLength);
+}
+void CFX_WideStringL::Empty(IFX_Allocator* pAllocator)
+{
+ if (m_Ptr) {
+ FX_Allocator_Free(pAllocator, (FX_LPVOID)m_Ptr);
+ }
+ m_Ptr = NULL, m_Length = 0;
+}
+void CFX_WideStringL::Set(FX_WSTR src, IFX_Allocator* pAllocator)
+{
+ Empty(pAllocator);
+ if (src.GetPtr() != NULL && src.GetLength() > 0) {
+ FX_LPWSTR str = FX_Allocator_Alloc(pAllocator, FX_WCHAR, src.GetLength() + 1);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, src.GetPtr(), src.GetLength()*sizeof(FX_WCHAR));
+ str[src.GetLength()] = '\0';
+ *(FX_LPWSTR*)(&m_Ptr) = str;
+ m_Length = src.GetLength();
+ }
+}
+int CFX_WideStringL::GetInteger() const
+{
+ if (!m_Ptr) {
+ return 0;
+ }
+ return FXSYS_wtoi(m_Ptr);
+}
+FX_FLOAT CFX_WideStringL::GetFloat() const
+{
+ if (!m_Ptr) {
+ return 0.0f;
+ }
+ return FX_wtof(m_Ptr, m_Length);
+}
+void CFX_WideStringL::TrimRight(FX_LPCWSTR lpszTargets)
+{
+ if (!lpszTargets || *lpszTargets == 0 || !m_Ptr || m_Length < 1) {
+ return;
+ }
+ FX_STRSIZE pos = m_Length;
+ while (pos) {
+ if (FXSYS_wcschr(lpszTargets, m_Ptr[pos - 1]) == NULL) {
+ break;
+ }
+ pos --;
+ }
+ if (pos < m_Length) {
+ (*(FX_LPWSTR*)(&m_Ptr))[pos] = 0;
+ m_Length = pos;
+ }
+}
+static CFX_ByteString _DefMap_GetByteString(CFX_CharMap* pCharMap, const CFX_WideString& widestr)
+{
+ int src_len = widestr.GetLength();
+ int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
+ int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, NULL, 0, NULL, NULL);
+ if (dest_len == 0) {
+ return CFX_ByteString();
+ }
+ CFX_ByteString bytestr;
+ FX_LPSTR dest_buf = bytestr.GetBuffer(dest_len);
+ FXSYS_WideCharToMultiByte(codepage, 0, widestr, src_len, dest_buf, dest_len, NULL, NULL);
+ bytestr.ReleaseBuffer(dest_len);
+ return bytestr;
+}
+static CFX_WideString _DefMap_GetWideString(CFX_CharMap* pCharMap, const CFX_ByteString& bytestr)
+{
+ int src_len = bytestr.GetLength();
+ int codepage = pCharMap->m_GetCodePage ? pCharMap->m_GetCodePage() : 0;
+ int dest_len = FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, NULL, 0);
+ if (dest_len == 0) {
+ return CFX_WideString();
+ }
+ CFX_WideString widestr;
+ FX_LPWSTR dest_buf = widestr.GetBuffer(dest_len);
+ FXSYS_MultiByteToWideChar(codepage, 0, bytestr, src_len, dest_buf, dest_len);
+ widestr.ReleaseBuffer(dest_len);
+ return widestr;
+}
+static int _DefMap_GetGBKCodePage()
+{
+ return 936;
+}
+static int _DefMap_GetUHCCodePage()
+{
+ return 949;
+}
+static int _DefMap_GetJISCodePage()
+{
+ return 932;
+}
+static int _DefMap_GetBig5CodePage()
+{
+ return 950;
+}
+static const CFX_CharMap g_DefaultMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, NULL};
+static const CFX_CharMap g_DefaultGBKMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetGBKCodePage};
+static const CFX_CharMap g_DefaultJISMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetJISCodePage};
+static const CFX_CharMap g_DefaultUHCMapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetUHCCodePage};
+static const CFX_CharMap g_DefaultBig5Mapper = {&_DefMap_GetWideString, &_DefMap_GetByteString, &_DefMap_GetBig5CodePage};
+CFX_CharMap* CFX_CharMap::GetDefaultMapper(FX_INT32 codepage)
+{
+ switch (codepage) {
+ case 0:
+ return (CFX_CharMap*)&g_DefaultMapper;
+ case 932:
+ return (CFX_CharMap*)&g_DefaultJISMapper;
+ case 936:
+ return (CFX_CharMap*)&g_DefaultGBKMapper;
+ case 949:
+ return (CFX_CharMap*)&g_DefaultUHCMapper;
+ case 950:
+ return (CFX_CharMap*)&g_DefaultBig5Mapper;
+ }
+ return NULL;
+}
diff --git a/core/src/fxcrt/fx_extension.cpp b/core/src/fxcrt/fx_extension.cpp
new file mode 100644
index 0000000000..79d300668f
--- /dev/null
+++ b/core/src/fxcrt/fx_extension.cpp
@@ -0,0 +1,401 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#include <wincrypt.h>
+#else
+#include <ctime>
+#endif
+FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (pFA && !pFA->Open(fileName, dwMode)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ return (FX_HFILE)pFA;
+}
+FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (pFA && !pFA->Open(fileName, dwMode)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ return (FX_HFILE)pFA;
+}
+void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator)
+{
+ FXSYS_assert(hFile != NULL);
+ ((IFXCRT_FileAccess*)hFile)->Close();
+ ((IFXCRT_FileAccess*)hFile)->Release(pAllocator);
+}
+FX_FILESIZE FX_File_GetSize(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->GetSize();
+}
+FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->GetPosition();
+}
+FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->SetPosition(pos);
+}
+size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Read(pBuffer, szBuffer);
+}
+size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->ReadPos(pBuffer, szBuffer, pos);
+}
+size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Write(pBuffer, szBuffer);
+}
+size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->WritePos(pBuffer, szBuffer, pos);
+}
+FX_BOOL FX_File_Flush(FX_HFILE hFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Flush();
+}
+FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile)
+{
+ FXSYS_assert(hFile != NULL);
+ return ((IFXCRT_FileAccess*)hFile)->Truncate(szFile);
+}
+IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (!pFA) {
+ return NULL;
+ }
+ if (!pFA->Open(filename, dwModes)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
+ } else {
+ return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
+ }
+}
+IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator)
+{
+ IFXCRT_FileAccess* pFA = FXCRT_FileAccess_Create(pAllocator);
+ if (!pFA) {
+ return NULL;
+ }
+ if (!pFA->Open(filename, dwModes)) {
+ pFA->Release(pAllocator);
+ return NULL;
+ }
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFX_CRTFileStream(pFA, pAllocator);
+ } else {
+ return FX_NEW CFX_CRTFileStream(pFA, pAllocator);
+ }
+}
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
+}
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_Truncate, pAllocator);
+}
+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
+}
+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator)
+{
+ return FX_CreateFileStream(filename, FX_FILEMODE_ReadOnly, pAllocator);
+}
+IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t dwSize, FX_BOOL bTakeOver, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(pBuffer, dwSize, bTakeOver, pAllocator);
+ } else {
+ return FX_NEW CFX_MemoryStream(pBuffer, dwSize, bTakeOver, NULL);
+ }
+}
+IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive, IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator)CFX_MemoryStream(bConsecutive, pAllocator);
+ } else {
+ return FX_NEW CFX_MemoryStream(bConsecutive, NULL);
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_FLOAT FXSYS_tan(FX_FLOAT a)
+{
+ return (FX_FLOAT)tan(a);
+}
+FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x)
+{
+ return FXSYS_log(x) / FXSYS_log(b);
+}
+FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
+{
+ FXSYS_assert(pcsStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_strlen(pcsStr);
+ }
+ CFX_WideString ws = CFX_WideString::FromLocal(pcsStr, iLength);
+ return FXSYS_wcstof((FX_LPCWSTR)ws, iLength, pUsedLen);
+}
+FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength, FX_INT32 *pUsedLen)
+{
+ FXSYS_assert(pwsStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_wcslen(pwsStr);
+ }
+ if (iLength == 0) {
+ return 0.0f;
+ }
+ FX_INT32 iUsedLen = 0;
+ FX_BOOL bNegtive = FALSE;
+ switch (pwsStr[iUsedLen]) {
+ case '-':
+ bNegtive = TRUE;
+ case '+':
+ iUsedLen++;
+ break;
+ }
+ FX_FLOAT fValue = 0.0f;
+ while (iUsedLen < iLength) {
+ FX_WCHAR wch = pwsStr[iUsedLen];
+ if (wch >= L'0' && wch <= L'9') {
+ fValue = fValue * 10.0f + (wch - L'0');
+ } else {
+ break;
+ }
+ iUsedLen++;
+ }
+ if (iUsedLen < iLength && pwsStr[iUsedLen] == L'.') {
+ FX_FLOAT fPrecise = 0.1f;
+ while (++iUsedLen < iLength) {
+ FX_WCHAR wch = pwsStr[iUsedLen];
+ if (wch >= L'0' && wch <= L'9') {
+ fValue += (wch - L'0') * fPrecise;
+ fPrecise *= 0.1f;
+ } else {
+ break;
+ }
+ }
+ }
+ if (pUsedLen) {
+ *pUsedLen = iUsedLen;
+ }
+ return bNegtive ? -fValue : fValue;
+}
+FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count)
+{
+ FXSYS_assert(dstStr != NULL && srcStr != NULL && count > 0);
+ for (size_t i = 0; i < count; ++i)
+ if ((dstStr[i] = srcStr[i]) == L'\0') {
+ break;
+ }
+ return dstStr;
+}
+FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count)
+{
+ FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
+ FX_WCHAR wch1 = 0, wch2 = 0;
+ while (count-- > 0) {
+ wch1 = (FX_WCHAR)FXSYS_tolower(*s1++);
+ wch2 = (FX_WCHAR)FXSYS_tolower(*s2++);
+ if (wch1 != wch2) {
+ break;
+ }
+ }
+ return wch1 - wch2;
+}
+FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count)
+{
+ FXSYS_assert(s1 != NULL && s2 != NULL && count > 0);
+ FX_CHAR ch1 = 0, ch2 = 0;
+ while (count-- > 0) {
+ ch1 = (FX_CHAR)FXSYS_tolower(*s1++);
+ ch2 = (FX_CHAR)FXSYS_tolower(*s2++);
+ if (ch1 != ch2) {
+ break;
+ }
+ }
+ return ch1 - ch2;
+}
+FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
+{
+ FXSYS_assert(pStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_strlen(pStr);
+ }
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_DWORD dwHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ dwHashCode = 31 * dwHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ dwHashCode = 31 * dwHashCode + *pStr ++;
+ }
+ }
+ return dwHashCode;
+}
+FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase)
+{
+ FXSYS_assert(pStr != NULL);
+ if (iLength < 0) {
+ iLength = (FX_INT32)FXSYS_wcslen(pStr);
+ }
+ FX_LPCWSTR pStrEnd = pStr + iLength;
+ FX_DWORD dwHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ dwHashCode = 1313 * dwHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ dwHashCode = 1313 * dwHashCode + *pStr ++;
+ }
+ }
+ return dwHashCode;
+}
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed)
+{
+ FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);
+ if (!pContext) {
+ return NULL;
+ }
+ pContext->mt[0] = dwSeed;
+ FX_DWORD &i = pContext->mti;
+ FX_LPDWORD pBuf = pContext->mt;
+ for (i = 1; i < MT_N; i ++) {
+ pBuf[i] = (1812433253UL * (pBuf[i - 1] ^ (pBuf[i - 1] >> 30)) + i);
+ }
+ pContext->bHaveSeed = TRUE;
+ return pContext;
+}
+FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext)
+{
+ FXSYS_assert(pContext != NULL);
+ FX_LPMTRANDOMCONTEXT pMTC = (FX_LPMTRANDOMCONTEXT)pContext;
+ FX_DWORD v;
+ static FX_DWORD mag[2] = {0, MT_Matrix_A};
+ FX_DWORD &mti = pMTC->mti;
+ FX_LPDWORD pBuf = pMTC->mt;
+ if ((int)mti < 0 || mti >= MT_N) {
+ if (mti > MT_N && !pMTC->bHaveSeed) {
+ return 0;
+ }
+ FX_DWORD kk;
+ for (kk = 0; kk < MT_N - MT_M; kk ++) {
+ v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
+ pBuf[kk] = pBuf[kk + MT_M] ^ (v >> 1) ^ mag[v & 1];
+ }
+ for (; kk < MT_N - 1; kk ++) {
+ v = (pBuf[kk] & MT_Upper_Mask) | (pBuf[kk + 1] & MT_Lower_Mask);
+ pBuf[kk] = pBuf[kk + (MT_M - MT_N)] ^ (v >> 1) ^ mag[v & 1];
+ }
+ v = (pBuf[MT_N - 1] & MT_Upper_Mask) | (pBuf[0] & MT_Lower_Mask);
+ pBuf[MT_N - 1] = pBuf[MT_M - 1] ^ (v >> 1) ^ mag[v & 1];
+ mti = 0;
+ }
+ v = pBuf[mti ++];
+ v ^= (v >> 11);
+ v ^= (v << 7) & 0x9d2c5680UL;
+ v ^= (v << 15) & 0xefc60000UL;
+ v ^= (v >> 18);
+ return v;
+}
+void FX_Random_MT_Close(FX_LPVOID pContext)
+{
+ FXSYS_assert(pContext != NULL);
+ FX_Free(pContext);
+}
+void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+ FX_DWORD dwSeed;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ if (!FX_GenerateCryptoRandom(&dwSeed, 1)) {
+ FX_Random_GenerateBase(&dwSeed, 1);
+ }
+#else
+ FX_Random_GenerateBase(&dwSeed, 1);
+#endif
+ FX_LPVOID pContext = FX_Random_MT_Start(dwSeed);
+ while (iCount -- > 0) {
+ *pBuffer ++ = FX_Random_MT_Generate(pContext);
+ }
+ FX_Random_MT_Close(pContext);
+}
+void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ SYSTEMTIME st1, st2;
+ ::GetSystemTime(&st1);
+ do {
+ ::GetSystemTime(&st2);
+ } while (FXSYS_memcmp32(&st1, &st2, sizeof(SYSTEMTIME)) == 0);
+ FX_DWORD dwHash1 = FX_HashCode_String_GetA((FX_LPCSTR)&st1, sizeof(st1), TRUE);
+ FX_DWORD dwHash2 = FX_HashCode_String_GetA((FX_LPCSTR)&st2, sizeof(st2), TRUE);
+ ::srand((dwHash1 << 16) | (FX_DWORD)dwHash2);
+#else
+ time_t tmLast = time(NULL), tmCur;
+ while ((tmCur = time(NULL)) == tmLast);
+ ::srand((tmCur << 16) | (tmLast & 0xFFFF));
+#endif
+ while (iCount -- > 0) {
+ *pBuffer ++ = (FX_DWORD)((::rand() << 16) | (::rand() & 0xFFFF));
+ }
+}
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_GenerateCryptoRandom(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+ HCRYPTPROV hCP = NULL;
+ if (!::CryptAcquireContext(&hCP, NULL, NULL, PROV_RSA_FULL, 0) || hCP == NULL) {
+ return FALSE;
+ }
+ ::CryptGenRandom(hCP, iCount * sizeof(FX_DWORD), (FX_LPBYTE)pBuffer);
+ ::CryptReleaseContext(hCP, 0);
+ return TRUE;
+}
+#endif
+void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount)
+{
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ FX_GenerateCryptoRandom(pBuffer, iCount);
+#else
+ FX_Random_GenerateBase(pBuffer, iCount);
+#endif
+}
+#ifdef __cplusplus
+}
+#endif
diff --git a/core/src/fxcrt/fx_ucddata.cpp b/core/src/fxcrt/fx_ucddata.cpp
new file mode 100644
index 0000000000..8ea343f78d
--- /dev/null
+++ b/core/src/fxcrt/fx_ucddata.cpp
@@ -0,0 +1,4145 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536] = {
+ 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe8ae5, 0xfffe9b5c, 0xfffe9ada, 0xfffe9b1a, 0xfffe9b5b, 0xfffe9a93, 0xfffe9a93,
+ 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9b53, 0xfffe9b53, 0xfffe9b53, 0xfffe9ad3,
+ 0xfffe9323, 0xfffeb005, 0xfffeb002, 0xfffeb24b, 0xfffeb248, 0xfffeb249, 0xfffeb00b, 0xfffeb002, 0x007eb000, 0x00feb001, 0xfffeb00b, 0xfffeb208, 0xfffeb1c7, 0xfffeb20e, 0xfffeb1c7, 0xfffeb1c6,
+ 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffea90a, 0xfffeb1c7, 0xfffeb007, 0x017eb000, 0xfffeb00b, 0x01feb001, 0xfffeb005,
+ 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x027eb000, 0xfffeb008, 0x02feb001, 0xfffeb00b, 0xff80b00b,
+ 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x037eb000, 0xfffeb00f, 0x03feb001, 0xfffeb00b, 0xfffeb293,
+ 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb35d, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,
+ 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293, 0xfffeb293,
+ 0xfffe91c3, 0xfffeb000, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb062, 0x047eb000, 0xfffeb00b, 0xfffeb28f, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb249, 0xfffeb248, 0xfffeb122, 0xfffeb122, 0xfffeb010, 0xfffeb04b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb122, 0xfffeb062, 0x04feb001, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb000,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb010, 0xfffeb022, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb062, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb010,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea183,
+ 0xfffea183, 0xfffea183, 0xfffea183, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb007, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb047, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe80a4, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08f, 0xfffea193,
+ 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffeb085, 0xfffea193, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed0cb, 0xfffed164, 0xfffed164, 0xfffed00b, 0xfffed00b, 0xfffed14b, 0xfffed249, 0xfffed249, 0xfffed149, 0xfffed1c7, 0xfffed147, 0xfffed00b, 0xfffed00b,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed145, 0xfffed164, 0xfffed164, 0xfffed145, 0xfffed145,
+ 0xfffed164, 0xfffed14b, 0xfffeb94b, 0xfffeb94b, 0xfffec14b, 0xfffeb94b, 0xfffec94b, 0xfffeb94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b,
+ 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed164,
+ 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed0ca, 0xfffed249, 0xfffed0ca, 0xfffed0ca, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffea193, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffea14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+ 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b,
+ 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+ 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+ 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffed14b, 0xfffed14b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b, 0xfffec94b,
+ 0xfffec14b, 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffec94b, 0xfffec14b, 0xfffec94b, 0xfffec14b,
+ 0xfffec94b, 0xfffec94b, 0xfffec14b, 0xfffec14b, 0xfffec945, 0xfffec14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed0cb, 0xfffed193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffed14b, 0xfffed14b, 0xfffea193, 0xfffea193, 0xfffed00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffec14b, 0xfffec14b,
+ 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed10a, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffe8164, 0xfffeb28b,
+ 0xfffeb14b, 0xfffea193, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+ 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8164, 0xfffe8164, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+ 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffed14b, 0xfffec14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffec14b, 0xfffec14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b, 0xfffed14b,
+ 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+ 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b,
+ 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffeb14b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffeb14b, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164, 0xfffe8164,
+ 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08a, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffeb08b, 0xfffeb00b, 0xfffeb00b, 0xfffeb007, 0xfffeb005, 0xfffeb08b, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb08b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe80a4, 0xfffe80a4,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4, 0xfffe80a4,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffe8024,
+ 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb04b, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb249, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb049, 0xfffeb04b, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffe8024, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea193,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053,
+ 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb248, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffeb04b, 0xfffeb053, 0xfffea053,
+ 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffea053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb049, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb053,
+ 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb248,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04b,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffeb05e, 0xfffe8024, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb050, 0xfffeb04b, 0xfffeb050, 0xfffeb050, 0xfffeb043, 0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb043, 0xfffeb045, 0xfffeb045, 0xfffeb045,
+ 0xfffeb045, 0xfffeb045, 0xfffeb043, 0xfffeb04b, 0xfffeb045, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffea193, 0x057eb000, 0x05feb001, 0x067eb000, 0x06feb001, 0xfffeb053, 0xfffeb053,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb050, 0xfffeb050, 0xfffeb04f, 0xfffeb050, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e,
+ 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,
+ 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057, 0xfffe3057,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193,
+ 0xfffeb04b, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb30f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0x077eb000, 0x07feb001, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e,
+ 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb04f, 0xfffeb04f, 0xfffeb044, 0xfffeb05e, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb248, 0xfffeb05e, 0xfffea19e, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb010, 0xfffeb00b, 0xfffeb005, 0xfffeb005, 0xfffeb00b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb303, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb005, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb01e, 0xfffeb01e,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024,
+ 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffe8024, 0xfffe8024, 0xfffea193,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb00b, 0xfffe8024,
+ 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb303, 0xfffeb30f, 0xfffeb30f, 0xfffeb30f, 0xfffeb292, 0xfffe9a93, 0xfffe9a93, 0xfffe9853, 0xfffe9893,
+ 0xfffeb00f, 0xfffeb003, 0xfffeb00f, 0xff82b00f, 0xff84b011, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0x0806b000, 0x0888b002, 0xfffeb000, 0xfffeb002, 0x090ab000, 0x098cb001, 0xfffeb000, 0xfffeb002,
+ 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00d, 0xfffeb00d, 0xfffeb00d, 0xfffeb00f, 0xfffe9b1a, 0xfffe9b5a, 0xfffe9c53, 0xfffe9bd3, 0xfffe9c93, 0xfffe9c13, 0xfffe9b93, 0xfffeb1c3,
+ 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb249, 0xfffeb009, 0xfffeb009, 0xfffeb009, 0xfffeb00b, 0x0a7eb000, 0x0afeb001, 0xfffeb022, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb1c7, 0x0b7eb000, 0x0bfeb001, 0xfffeb004, 0xfffeb004, 0xfffeb004, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb00f, 0xfffeb30f,
+ 0xfffeb294, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffeb28b, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe82a4, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93, 0xfffe9a93,
+ 0xfffeb10b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0c7eb000, 0x0cfeb001, 0xfffeb062,
+ 0xfffeb10b, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb122, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb10b, 0xfffeb20b, 0xfffeb20b, 0xfffeb00b, 0x0d7eb000, 0x0dfeb001, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248,
+ 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb248, 0xfffeb249, 0xfffeb248, 0xfffeb248, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193,
+ 0xfffeb193, 0xfffea193, 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb009, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb009, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb062, 0xfffeb00b, 0xfffeb04b, 0xfffeb008, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb24b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,
+ 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb062, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb022, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0x0e7eb022, 0x0efeb00b, 0x0f7eb00b, 0x0ffeb022, 0x107eb00b, 0x10feb00b, 0xfffeb00b, 0xfffeb022,
+ 0xfffeb00b, 0xfffeb022, 0xfffeb208, 0xfffeb248, 0xfffeb00b, 0x117eb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022,
+ 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb022, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x11feb022, 0x127eb022, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x12feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0x137eb022, 0x13feb00b, 0x147eb00b, 0x14feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb022, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x157eb022, 0x15feb022, 0x167eb022, 0x16feb022, 0x177eb00b, 0x17feb00b, 0x187eb022, 0x18feb022, 0xfffeb00b, 0xfffeb00b, 0x197eb022, 0x19feb022,
+ 0x1a7eb00b, 0x1afeb00b, 0x1b7eb00b, 0x1bfeb00b, 0x1c7eb00b, 0x1cfeb00b, 0x1d7eb00b, 0x1dfeb00b, 0x1e7eb00b, 0x1efeb00b, 0x1f7eb00b, 0x1ffeb00b, 0x207eb00b, 0x20feb00b, 0x217eb00b, 0x21feb00b,
+ 0x227eb00b, 0x22feb00b, 0x237eb022, 0x23feb022, 0x247eb00b, 0x24feb00b, 0x257eb022, 0x25feb022, 0x267eb00b, 0x26feb00b, 0x277eb00b, 0x27feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x287eb00b,
+ 0x28feb00b, 0x297eb00b, 0x29feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0x2a7eb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0x2afeb00b, 0x2b7eb00b, 0xfffeb00b, 0xfffeb022, 0x2bfeb00b, 0xfffeb00b, 0x2c7eb00b, 0x2cfeb00b, 0xfffeb00b, 0x2d7eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0x2dfeb00b, 0x2e7eb00b, 0x2efeb00b, 0x2f7eb00b, 0x2ffeb00b, 0x307eb00b, 0x30feb00b, 0x317eb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb022,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x31feb00b, 0x327eb00b, 0x32feb00b, 0x337eb00b, 0x33feb00b, 0xfffeb00b, 0xfffeb00b,
+ 0x347eb00b, 0x34feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x357eb00b, 0x35feb00b, 0x367eb00b, 0x36feb00b, 0x377eb00b, 0x37feb00b, 0x387eb00b, 0x38feb00b, 0x397eb00b, 0x39feb00b,
+ 0x3a7eb00b, 0x3afeb00b, 0x3b7eb00b, 0x3bfeb00b, 0x3c7eb00b, 0x3cfeb00b, 0x3d7eb00b, 0x3dfeb00b, 0x3e7eb00b, 0x3efeb00b, 0x3f7eb00b, 0x3ffeb00b, 0x407eb00b, 0x40feb00b, 0xfffeb00b, 0xfffeb00b,
+ 0x417eb00b, 0x41feb00b, 0x427eb00b, 0x42feb00b, 0x437eb00b, 0xfffeb00b, 0x43feb00b, 0x447eb00b, 0xfffeb00b, 0xfffeb00b, 0x44feb00b, 0x457eb00b, 0x45feb00b, 0x467eb00b, 0x46feb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x477eb00b, 0x47feb00b, 0x487eb00b, 0x48feb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb022, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0x497eb000, 0x49feb001, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122,
+ 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3122, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe304b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe3022, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe3002, 0xfffe0024,
+ 0xfffe0024, 0xfffe300b, 0xfffe3005, 0xfffe3005, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x4a7e3000, 0x4afe3001, 0x4b7e3000, 0x4bfe3001, 0x4c7e3000, 0x4cfe3001, 0x4d7e3000, 0x4dfe3001,
+ 0x4e7e3000, 0x4efe3001, 0x4f7e3000, 0x4ffe3001, 0x507e3000, 0x50fe3001, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022,
+ 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x517e300b, 0x51fe300b, 0x527e3000, 0x52fe3001, 0xfffe300b, 0x537e300b, 0x53fe300b, 0xfffe300b, 0xfffe0024, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x547e300b, 0x54fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x557e300b, 0x55fe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0x567e300b, 0x56fe300b, 0x577e300b, 0x57fe300b, 0x587e3000, 0x58fe3001, 0x597e3000, 0x59fe3001, 0x5a7e3000, 0x5afe3001, 0x5b7e3000, 0x5bfe3001, 0x5c7e3000, 0x5cfe3001,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x5d7e3000, 0x5dfe3001, 0x5e7e3000, 0x5efe3001, 0x5f7e3000, 0x5ffe3001, 0x607e3000, 0x60fe3001, 0x617e3000, 0x61fe3001, 0x627e3000, 0x62fe3001, 0x637e3000,
+ 0x63fe3001, 0x647e3000, 0x64fe3001, 0x657e3000, 0x65fe3001, 0x667e3000, 0x66fe3001, 0x677e3000, 0x67fe3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x687e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0x68fe300b, 0x697e300b, 0xfffe300b, 0xfffe300b, 0x69fe300b, 0x6a7e300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6afe300b,
+ 0x6b7e300b, 0x6bfe300b, 0x6c7e300b, 0xfffe300b, 0x6cfe300b, 0x6d7e300b, 0xfffe300b, 0xfffe300b, 0x6dfe3000, 0x6e7e3001, 0x6efe3000, 0x6f7e3001, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x6ffe300b, 0xfffe300b, 0xfffe300b, 0x707e300b, 0x70fe300b, 0xfffe300b, 0xfffe300b, 0x717e3000, 0x71fe3001, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x727e300b, 0x72fe300b, 0x737e300b, 0x73fe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x747e300b, 0x74fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x757e300b, 0x75fe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x767e300b, 0x76fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x777e300b, 0x77fe300b, 0xfffe300b, 0xfffe300b, 0x787e300b, 0x78fe300b, 0x797e300b,
+ 0x79fe300b, 0x7a7e300b, 0x7afe300b, 0x7b7e300b, 0x7bfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x7c7e300b, 0x7cfe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0x7d7e300b, 0x7dfe300b, 0x7e7e300b, 0x7efe300b, 0x7f7e300b, 0x7ffe300b, 0x807e300b, 0x80fe300b, 0x817e300b, 0x81fe300b, 0x827e300b, 0x82fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0x837e300b, 0x83fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x847e300b, 0x84fe300b, 0x857e300b, 0x85fe300b, 0x867e300b, 0x86fe300b, 0x877e300b, 0x87fe300b, 0xfffe300b, 0x887e300b,
+ 0x88fe300b, 0xfffe300b, 0xfffe300b, 0x897e300b, 0x89fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x8a7e300b, 0x8afe300b, 0x8b7e300b, 0x8bfe300b, 0x8c7e300b,
+ 0x8cfe300b, 0x8d7e300b, 0x8dfe300b, 0x8e7e300b, 0x8efe300b, 0x8f7e300b, 0x8ffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x907e300b, 0x90fe300b, 0x917e300b,
+ 0x91fe300b, 0x927e300b, 0x92fe300b, 0x937e300b, 0x93fe300b, 0x947e300b, 0x94fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x957e300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x95fe300b, 0x967e300b, 0x96fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x977e300b, 0x97fe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0x987e300b, 0x98fe300b, 0x997e300b, 0x99fe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe3022, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb005, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb005, 0xfffeb00f,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffeb001, 0xfffeb001, 0x9a7eb000, 0x9afeb001, 0x9b7eb000, 0x9bfeb001, 0xfffeb002, 0xfffeb002, 0xfffeb002, 0x9c7eb000, 0x9cfeb001, 0xfffeb002, 0x9d7eb000, 0x9dfeb001, 0xfffeb00f, 0xfffeb00f,
+ 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00b, 0xfffeb00f, 0xfffeb000, 0xfffeb00f, 0xfffeb00b, 0xfffeb00b, 0x9e7eb000, 0x9efeb001, 0xfffeb00b, 0xfffeb00b,
+ 0x9f7eb000, 0x9ffeb001, 0xa07eb000, 0xa0feb001, 0xa17eb000, 0xa1feb001, 0xa27eb000, 0xa2feb001, 0xa37eb000, 0xa3feb001, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb00f, 0xfffeb005, 0xfffeb00b,
+ 0xfffeb00f, 0xfffeb00f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe330c, 0xffff3001, 0xffff3001, 0xfffe300c, 0xfffe300c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xa40eb000, 0xa490b001, 0xa512b000, 0xa594b001, 0xa616b000, 0xa698b001, 0xa71ab000, 0xa79cb001,
+ 0xa81eb000, 0xa8a0b001, 0xfffe300c, 0xfffe300c, 0xa922b000, 0xa9a4b001, 0xaa7eb000, 0xaafeb001, 0xab7eb000, 0xabfeb001, 0xac7eb000, 0xacfeb001, 0xfffe3004, 0xfffe3000, 0xfffe3001, 0xfffe3001,
+ 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193, 0xfffe2193,
+ 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe0024, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xffff3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe0024, 0xfffe0024, 0xfffe2193, 0xfffe2193, 0xfffe3004, 0xfffe3004, 0xfffe3044, 0xfffe3044, 0xfffe304c,
+ 0xfffe3004, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3004, 0xfffeb044, 0xfffe3044, 0xfffe3044, 0xfffe304c,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffeb04c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062, 0xfffe3062,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0064, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe3044, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304f, 0xfffe304f,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe300f, 0xfffe3005, 0xfffe300f,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304a, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193,
+ 0xfffeb193, 0xfffeb193, 0xfffeb193, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffea193, 0xfffea193, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b,
+ 0xfffeb00b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb00b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffeb00b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb249, 0xfffeb24b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb010, 0xfffeb010, 0xfffeb005, 0xfffeb005, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb053, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057,
+ 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffeb057, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb053,
+ 0xfffeb053, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffeb04b,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffeb053,
+ 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffea193, 0xfffeb053, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04f, 0xfffeb04f, 0xfffeb04f,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffea19e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffea19e, 0xfffea19e,
+ 0xfffeb05e, 0xfffea19e, 0xfffeb05e, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e, 0xfffeb05e,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffea193, 0xfffeb053, 0xfffeb053, 0xfffeb04f, 0xfffeb053, 0xfffea193, 0xfffe8024, 0xfffe8024,
+ 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffeb04a, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064,
+ 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe3055, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe3056,
+ 0xfffe3056, 0xfffe3056, 0xfffe3056, 0xfffe0064, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058,
+ 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe3058, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059,
+ 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe3059, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f,
+ 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe301f, 0xfffe0024,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061,
+ 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe3061, 0xfffe0064,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe0024,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe0024,
+ 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffeb04b, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffeb08b, 0xfffea193, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb20b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffe80a4,
+ 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffe80a4, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b, 0xfffeb08b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+ 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+ 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed800, 0xfffed801,
+ 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed964, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964, 0xfffed964,
+ 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,
+ 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4, 0xfffedaa4,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed949, 0xfffed80b, 0xfffed964, 0xfffed964,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193,
+ 0xfffe3007, 0xfffe3001, 0xfffe3001, 0xfffe3007, 0xfffe3007, 0xfffe3005, 0xfffe3005, 0xfffe3000, 0xfffe3001, 0xfffe300d, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffea193, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024, 0xfffe8024,
+ 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000,
+ 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe3000, 0xfffe3001, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xffa6300c,
+ 0xfffe31c1, 0xfffe300c, 0xfffe31c1, 0xfffe0024, 0xfffe3004, 0xfffe31c4, 0xfffe3005, 0xfffe3005, 0xfffe300c, 0xad7e3000, 0xadfe3001, 0xae7e3000, 0xaefe3001, 0xaf7e3000, 0xaffe3001, 0xfffe324c,
+ 0xfffe300c, 0xfffe300c, 0xfffe320c, 0xfffe320c, 0xb07e300c, 0xb0fe300c, 0xfffe300c, 0xfffe0024, 0xfffe300c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe0024, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b,
+ 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed94b, 0xfffed964, 0xfffed964, 0xfffe9a94,
+ 0xfffe0024, 0xffff3005, 0xfffe300c, 0xfffe324c, 0xfffe3248, 0xfffe3249, 0xfffe300c, 0xfffe300c, 0xb1283000, 0xb1aa3001, 0xfffe300c, 0xfffe320c, 0xffff31c1, 0xfffeb20c, 0xffff31c1, 0xfffe31cc,
+ 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xfffe310c, 0xffff31c4, 0xffff3004, 0xb27e300c, 0xfffe300c, 0xb2fe300c, 0xffff3005,
+ 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb37eb000, 0xfffe300c, 0xb3feb001, 0xfffe300c, 0xfffeb00c,
+ 0xfffe300c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c,
+ 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xfffe304c, 0xb42c3000, 0xfffe300c, 0xb4ae3001, 0xfffeb00c, 0xb57e3000,
+ 0xb5fe3001, 0xfffeb001, 0xb67eb000, 0xb6feb001, 0xfffeb001, 0xfffe3004, 0xfffe304b, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044, 0xfffe3044,
+ 0xfffe3044, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe3044, 0xfffe3044,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024,
+ 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b,
+ 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe304b, 0xfffe304b, 0xfffe304b, 0xfffe0024, 0xfffe0024, 0xfffe0024,
+ 0xfffe3249, 0xfffe3248, 0xfffe300c, 0xfffe300c, 0xfffe300c, 0xfffe3248, 0xfffe3248, 0xfffe0024, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe300b, 0xfffe0024,
+ 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe02a4, 0xfffe3013, 0xfffe3013, 0xfffe3013, 0xfffe3011, 0xfffe3022, 0xfffe1aa4, 0xfffe1aa4,
+};
+extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64] = {
+ 0xFE33, 0xFE32, 0xFE31, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3F, 0xFE40, 0xFE3D, 0xFE3E, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE3B,
+ 0xFE3C, 0xFE39, 0xFE3A, 0xFE34, 0xFE35, 0xFE36, 0xFE37, 0xFE38, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+};
+extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512] = {
+ 0x0029, 0x0028, 0x003E, 0x003C, 0x005D, 0x005B, 0x007D, 0x007B, 0x00BB, 0x00AB, 0x0F3B, 0x0F3A, 0x0F3D, 0x0F3C, 0x169C, 0x169B,
+ 0x2019, 0x2018, 0x201D, 0x201C, 0x203A, 0x2039, 0x2046, 0x2045, 0x207E, 0x207D, 0x208E, 0x208D, 0x220B, 0x220C, 0x220D, 0x2208,
+ 0x2209, 0x220A, 0x29F5, 0x223D, 0x223C, 0x22CD, 0x2253, 0x2252, 0x2255, 0x2254, 0x2265, 0x2264, 0x2267, 0x2266, 0x2269, 0x2268,
+ 0x226B, 0x226A, 0x226F, 0x226E, 0x2271, 0x2270, 0x2273, 0x2272, 0x2275, 0x2274, 0x2277, 0x2276, 0x2279, 0x2278, 0x227B, 0x227A,
+ 0x227D, 0x227C, 0x227F, 0x227E, 0x2281, 0x2280, 0x2283, 0x2282, 0x2285, 0x2284, 0x2287, 0x2286, 0x2289, 0x2288, 0x228B, 0x228A,
+ 0x2290, 0x228F, 0x2292, 0x2291, 0x29B8, 0x22A3, 0x22A2, 0x2ADE, 0x2AE4, 0x2AE3, 0x2AE5, 0x22B1, 0x22B0, 0x22B3, 0x22B2, 0x22B5,
+ 0x22B4, 0x22B7, 0x22B6, 0x22CA, 0x22C9, 0x22CC, 0x22CB, 0x2243, 0x22D1, 0x22D0, 0x22D7, 0x22D6, 0x22D9, 0x22D8, 0x22DB, 0x22DA,
+ 0x22DD, 0x22DC, 0x22DF, 0x22DE, 0x22E1, 0x22E0, 0x22E3, 0x22E2, 0x22E5, 0x22E4, 0x22E7, 0x22E6, 0x22E9, 0x22E8, 0x22EB, 0x22EA,
+ 0x22ED, 0x22EC, 0x22F1, 0x22F0, 0x22FA, 0x22FB, 0x22FC, 0x22FD, 0x22FE, 0x22F2, 0x22F3, 0x22F4, 0x22F6, 0x22F7, 0x2309, 0x2308,
+ 0x230B, 0x230A, 0x232A, 0x2329, 0x2769, 0x2768, 0x276B, 0x276A, 0x276D, 0x276C, 0x276F, 0x276E, 0x2771, 0x2770, 0x2773, 0x2772,
+ 0x2775, 0x2774, 0x27C4, 0x27C3, 0x27C6, 0x27C5, 0x27C9, 0x27C8, 0x27D6, 0x27D5, 0x27DE, 0x27DD, 0x27E3, 0x27E2, 0x27E5, 0x27E4,
+ 0x27E7, 0x27E6, 0x27E9, 0x27E8, 0x27EB, 0x27EA, 0x27ED, 0x27EC, 0x27EF, 0x27EE, 0x2984, 0x2983, 0x2986, 0x2985, 0x2988, 0x2987,
+ 0x298A, 0x2989, 0x298C, 0x298B, 0x2990, 0x298F, 0x298E, 0x298D, 0x2992, 0x2991, 0x2994, 0x2993, 0x2996, 0x2995, 0x2998, 0x2997,
+ 0x2298, 0x29C1, 0x29C0, 0x29C5, 0x29C4, 0x29D0, 0x29CF, 0x29D2, 0x29D1, 0x29D5, 0x29D4, 0x29D9, 0x29D8, 0x29DB, 0x29DA, 0x2215,
+ 0x29F9, 0x29F8, 0x29FD, 0x29FC, 0x2A2C, 0x2A2B, 0x2A2E, 0x2A2D, 0x2A35, 0x2A34, 0x2A3D, 0x2A3C, 0x2A65, 0x2A64, 0x2A7A, 0x2A79,
+ 0x2A7E, 0x2A7D, 0x2A80, 0x2A7F, 0x2A82, 0x2A81, 0x2A84, 0x2A83, 0x2A8C, 0x2A8B, 0x2A92, 0x2A91, 0x2A94, 0x2A93, 0x2A96, 0x2A95,
+ 0x2A98, 0x2A97, 0x2A9A, 0x2A99, 0x2A9C, 0x2A9B, 0x2AA2, 0x2AA1, 0x2AA7, 0x2AA6, 0x2AA9, 0x2AA8, 0x2AAB, 0x2AAA, 0x2AAD, 0x2AAC,
+ 0x2AB0, 0x2AAF, 0x2AB4, 0x2AB3, 0x2ABC, 0x2ABB, 0x2ABE, 0x2ABD, 0x2AC0, 0x2ABF, 0x2AC2, 0x2AC1, 0x2AC4, 0x2AC3, 0x2AC6, 0x2AC5,
+ 0x2ACE, 0x2ACD, 0x2AD0, 0x2ACF, 0x2AD2, 0x2AD1, 0x2AD4, 0x2AD3, 0x2AD6, 0x2AD5, 0x22A6, 0x22A9, 0x22A8, 0x22AB, 0x2AED, 0x2AEC,
+ 0x2AF8, 0x2AF7, 0x2AFA, 0x2AF9, 0x2E03, 0x2E02, 0x2E05, 0x2E04, 0x2E0A, 0x2E09, 0x2E0D, 0x2E0C, 0x2E1D, 0x2E1C, 0x2E21, 0x2E20,
+ 0x2E23, 0x2E22, 0x2E25, 0x2E24, 0x2E27, 0x2E26, 0x2E29, 0x2E28, 0x3009, 0x3008, 0x300B, 0x300A, 0x300D, 0x300C, 0x300F, 0x300E,
+ 0x3011, 0x3010, 0x3015, 0x3014, 0x3017, 0x3016, 0x3019, 0x3018, 0x301B, 0x301A, 0xFE5A, 0xFE59, 0xFE5C, 0xFE5B, 0xFE5E, 0xFE5D,
+ 0xFE65, 0xFE64, 0xFF09, 0xFF08, 0xFF1E, 0xFF1C, 0xFF3D, 0xFF3B, 0xFF5D, 0xFF5B, 0xFF60, 0xFF5F, 0xFF63, 0xFF62, 0xFFFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+ 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF, 0xFEFF,
+};
diff --git a/core/src/fxcrt/fx_unicode.cpp b/core/src/fxcrt/fx_unicode.cpp
new file mode 100644
index 0000000000..aac6142ce4
--- /dev/null
+++ b/core/src/fxcrt/fx_unicode.cpp
@@ -0,0 +1,65 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536];
+extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64];
+extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512];
+FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch)
+{
+ return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+}
+FX_BOOL FX_IsCtrlCode(FX_WCHAR ch)
+{
+ FX_DWORD dwRet = (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK);
+ return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control;
+}
+FX_BOOL FX_IsRotationCode(FX_WCHAR ch)
+{
+ return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0;
+}
+FX_BOOL FX_IsCombinationChar(FX_WCHAR wch)
+{
+ FX_DWORD dwProps = (gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK);
+ return dwProps == FX_CHARTYPE_Combination;
+}
+FX_BOOL FX_IsBidiChar(FX_WCHAR wch)
+{
+ FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+ FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS;
+ return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls);
+}
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical)
+{
+ FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+ FX_DWORD dwTemp = (dwProps & 0xFF800000);
+ if (bRTL && dwTemp < 0xFF800000) {
+ wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
+ dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+ }
+ if (bVertical) {
+ dwTemp = (dwProps & 0x007E0000);
+ if (dwTemp < 0x007E0000) {
+ wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
+ }
+ }
+ return wch;
+}
+FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical)
+{
+ FX_DWORD dwTemp = (dwProps & 0xFF800000);
+ if (bRTL && dwTemp < 0xFF800000) {
+ wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23];
+ dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch];
+ }
+ if (bVertical) {
+ dwTemp = (dwProps & 0x007E0000);
+ if (dwTemp < 0x007E0000) {
+ wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17];
+ }
+ }
+ return wch;
+}
diff --git a/core/src/fxcrt/fx_xml_composer.cpp b/core/src/fxcrt/fx_xml_composer.cpp
new file mode 100644
index 0000000000..d68dd1ff27
--- /dev/null
+++ b/core/src/fxcrt/fx_xml_composer.cpp
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_xml.h"
+#include "xml_int.h"
+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName)
+{
+ if (bsFullName.IsEmpty()) {
+ return;
+ }
+ FX_INT32 iStart = 0;
+ for (; iStart < bsFullName.GetLength(); iStart ++) {
+ if (bsFullName.GetAt(iStart) == ':') {
+ break;
+ }
+ }
+ if (iStart >= bsFullName.GetLength()) {
+ bsName = bsFullName;
+ } else {
+ bsSpace = CFX_ByteStringC(bsFullName.GetCStr(), iStart);
+ iStart ++;
+ bsName = CFX_ByteStringC(bsFullName.GetCStr() + iStart, bsFullName.GetLength() - iStart);
+ }
+}
+void CXML_Element::SetTag(FX_BSTR qSpace, FX_BSTR tagname)
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ m_QSpaceName.Set(qSpace, pAllocator);
+ m_TagName.Set(tagname, pAllocator);
+}
+void CXML_Element::SetTag(FX_BSTR qTagName)
+{
+ ASSERT(!qTagName.IsEmpty());
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(qTagName, bsSpace, bsName);
+ m_QSpaceName.Set(bsSpace, pAllocator);
+ m_TagName.Set(bsName, pAllocator);
+}
diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp
new file mode 100644
index 0000000000..85e9544342
--- /dev/null
+++ b/core/src/fxcrt/fx_xml_parser.cpp
@@ -0,0 +1,1017 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_xml.h"
+#include "xml_int.h"
+CXML_Parser::~CXML_Parser()
+{
+ if (m_bOwnedStream) {
+ m_pDataAcc->Release();
+ }
+}
+FX_BOOL CXML_Parser::Init(FX_LPBYTE pBuffer, size_t size)
+{
+ if (m_pAllocator) {
+ m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataBufAcc(pBuffer, size, m_pAllocator);
+ } else {
+ m_pDataAcc = FX_NEW CXML_DataBufAcc(pBuffer, size, NULL);
+ }
+ if (!m_pDataAcc) {
+ return FALSE;
+ }
+ return Init(TRUE);
+}
+FX_BOOL CXML_Parser::Init(IFX_FileRead *pFileRead)
+{
+ if (m_pAllocator) {
+ m_pDataAcc = FX_NewAtAllocator(m_pAllocator)CXML_DataStmAcc(pFileRead, m_pAllocator);
+ } else {
+ m_pDataAcc = FX_NEW CXML_DataStmAcc(pFileRead, NULL);
+ }
+ if (!m_pDataAcc) {
+ return FALSE;
+ }
+ return Init(TRUE);
+}
+FX_BOOL CXML_Parser::Init(IFX_BufferRead *pBuffer)
+{
+ if (!pBuffer) {
+ return FALSE;
+ }
+ m_pDataAcc = pBuffer;
+ return Init(FALSE);
+}
+FX_BOOL CXML_Parser::Init(FX_BOOL bOwndedStream)
+{
+ m_bOwnedStream = bOwndedStream;
+ m_nOffset = 0;
+ return ReadNextBlock();
+}
+FX_BOOL CXML_Parser::ReadNextBlock()
+{
+ if (!m_pDataAcc->ReadNextBlock()) {
+ return FALSE;
+ }
+ m_pBuffer = m_pDataAcc->GetBlockBuffer();
+ m_dwBufferSize = m_pDataAcc->GetBlockSize();
+ m_nBufferOffset = m_pDataAcc->GetBlockOffset();
+ m_dwIndex = 0;
+ return m_dwBufferSize > 0;
+}
+FX_BOOL CXML_Parser::IsEOF()
+{
+ if (!m_pDataAcc->IsEOF()) {
+ return FALSE;
+ }
+ return m_dwIndex >= m_dwBufferSize;
+}
+#define FXCRTM_XML_CHARTYPE_Normal 0x00
+#define FXCRTM_XML_CHARTYPE_SpaceChar 0x01
+#define FXCRTM_XML_CHARTYPE_Letter 0x02
+#define FXCRTM_XML_CHARTYPE_Digital 0x04
+#define FXCRTM_XML_CHARTYPE_NameIntro 0x08
+#define FXCRTM_XML_CHARTYPE_NameChar 0x10
+#define FXCRTM_XML_CHARTYPE_HexDigital 0x20
+#define FXCRTM_XML_CHARTYPE_HexLowerLetter 0x40
+#define FXCRTM_XML_CHARTYPE_HexUpperLetter 0x60
+#define FXCRTM_XML_CHARTYPE_HexChar 0x60
+FX_BYTE g_FXCRT_XML_ByteTypes[256] = {
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,
+ 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x7A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A,
+ 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x1A, 0x01, 0x01,
+};
+FX_BOOL g_FXCRT_XML_IsWhiteSpace(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_SpaceChar) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsLetter(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Letter) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsDigital(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_Digital) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsNameIntro(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameIntro) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsNameChar(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_NameChar) != 0;
+}
+FX_BOOL g_FXCRT_XML_IsHexChar(FX_BYTE ch)
+{
+ return (g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar) != 0;
+}
+void CXML_Parser::SkipWhiteSpaces()
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ do {
+ while (m_dwIndex < m_dwBufferSize && g_FXCRT_XML_IsWhiteSpace(m_pBuffer[m_dwIndex])) {
+ m_dwIndex ++;
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+}
+void CXML_Parser::GetName(CFX_ByteStringL &space, CFX_ByteStringL &name)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ CFX_ByteTextBuf buf(m_pAllocator);
+ FX_BYTE ch;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ if (ch == ':') {
+ buf.GetByteStringL(space);
+ buf.Clear();
+ } else if (g_FXCRT_XML_IsNameChar(ch)) {
+ buf.AppendChar(ch);
+ } else {
+ break;
+ }
+ m_dwIndex ++;
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ buf.GetByteStringL(name);
+}
+void CXML_Parser::SkipLiterals(FX_BSTR str)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ FX_INT32 i = 0, iLen = str.GetLength();
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ if (str.GetAt(i) != m_pBuffer[m_dwIndex ++]) {
+ i = 0;
+ } else {
+ i ++;
+ if (i == iLen) {
+ break;
+ }
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (i == iLen) {
+ return;
+ }
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ while (!m_pDataAcc->IsEOF()) {
+ ReadNextBlock();
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwBufferSize;
+ }
+ m_dwIndex = m_dwBufferSize;
+}
+FX_DWORD CXML_Parser::GetCharRef()
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return 0;
+ }
+ FX_BYTE ch;
+ FX_INT32 iState = 0;
+ CFX_ByteTextBuf buf(m_pAllocator);
+ FX_DWORD code = 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ switch (iState) {
+ case 0:
+ if (ch == '#') {
+ m_dwIndex ++;
+ iState = 2;
+ break;
+ }
+ iState = 1;
+ case 1:
+ m_dwIndex ++;
+ if (ch == ';') {
+ CFX_ByteStringC ref = buf.GetByteString();
+ if (ref == FX_BSTRC("gt")) {
+ code = '>';
+ } else if (ref == FX_BSTRC("lt")) {
+ code = '<';
+ } else if (ref == FX_BSTRC("amp")) {
+ code = '&';
+ } else if (ref == FX_BSTRC("apos")) {
+ code = '\'';
+ } else if (ref == FX_BSTRC("quot")) {
+ code = '"';
+ }
+ iState = 10;
+ break;
+ }
+ buf.AppendByte(ch);
+ break;
+ case 2:
+ if (ch == 'x') {
+ m_dwIndex ++;
+ iState = 4;
+ break;
+ }
+ iState = 3;
+ case 3:
+ m_dwIndex ++;
+ if (ch == ';') {
+ iState = 10;
+ break;
+ }
+ if (g_FXCRT_XML_IsDigital(ch)) {
+ code = code * 10 + ch - '0';
+ }
+ break;
+ case 4:
+ m_dwIndex ++;
+ if (ch == ';') {
+ iState = 10;
+ break;
+ }
+ FX_BYTE nHex = g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
+ if (nHex) {
+ if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
+ code = (code << 4) + ch - '0';
+ } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
+ code = (code << 4) + ch - 87;
+ } else {
+ code = (code << 4) + ch - 55;
+ }
+ }
+ break;
+ }
+ if (iState == 10) {
+ break;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ return code;
+}
+void CXML_Parser::GetAttrValue(CFX_WideStringL &value)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ CFX_UTF8Decoder decoder(m_pAllocator);
+ FX_BYTE mark = 0, ch;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ if (mark == 0) {
+ if (ch != '\'' && ch != '"') {
+ return;
+ }
+ mark = ch;
+ m_dwIndex ++;
+ ch = 0;
+ continue;
+ }
+ m_dwIndex ++;
+ if (ch == mark) {
+ break;
+ }
+ if (ch == '&') {
+ decoder.AppendChar(GetCharRef());
+ if (IsEOF()) {
+ decoder.GetResult(value);
+ return;
+ }
+ } else {
+ decoder.Input(ch);
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (ch == mark || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ decoder.GetResult(value);
+}
+void CXML_Parser::GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return;
+ }
+ bEndTag = FALSE;
+ FX_BYTE ch;
+ FX_INT32 iState = bStartTag ? 1 : 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex];
+ switch (iState) {
+ case 0:
+ m_dwIndex ++;
+ if (ch != '<') {
+ break;
+ }
+ iState = 1;
+ break;
+ case 1:
+ if (ch == '?') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("?>"));
+ iState = 0;
+ break;
+ } else if (ch == '!') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("-->"));
+ iState = 0;
+ break;
+ }
+ if (ch == '/') {
+ m_dwIndex ++;
+ GetName(space, name);
+ bEndTag = TRUE;
+ } else {
+ GetName(space, name);
+ bEndTag = FALSE;
+ }
+ return;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+}
+CXML_Element* CXML_Parser::ParseElement(CXML_Element* pParent, FX_BOOL bStartTag)
+{
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (IsEOF()) {
+ return NULL;
+ }
+ CFX_ByteStringL tag_name, tag_space;
+ FX_BOOL bEndTag;
+ GetTagName(tag_space, tag_name, bEndTag, bStartTag);
+ if (tag_name.IsEmpty() || bEndTag) {
+ tag_space.Empty(m_pAllocator);
+ return NULL;
+ }
+ CXML_Element* pElement;
+ if (m_pAllocator) {
+ pElement = FX_NewAtAllocator(m_pAllocator)CXML_Element(m_pAllocator);
+ } else {
+ pElement = FX_NEW CXML_Element;
+ }
+ if (pElement) {
+ pElement->m_pParent = pParent;
+ pElement->SetTag(tag_space, tag_name);
+ }
+ tag_space.Empty(m_pAllocator);
+ tag_name.Empty(m_pAllocator);
+ if (!pElement) {
+ return NULL;
+ }
+ do {
+ CFX_ByteStringL attr_space, attr_name;
+ while (m_dwIndex < m_dwBufferSize) {
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ if (!g_FXCRT_XML_IsNameIntro(m_pBuffer[m_dwIndex])) {
+ break;
+ }
+ attr_space.Empty(m_pAllocator);
+ attr_name.Empty(m_pAllocator);
+ GetName(attr_space, attr_name);
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ if (m_pBuffer[m_dwIndex] != '=') {
+ break;
+ }
+ m_dwIndex ++;
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ break;
+ }
+ CFX_WideStringL attr_value;
+ GetAttrValue(attr_value);
+ pElement->m_AttrMap.SetAt(attr_space, attr_name, attr_value, m_pAllocator);
+ attr_value.Empty(m_pAllocator);
+ }
+ attr_space.Empty(m_pAllocator);
+ attr_name.Empty(m_pAllocator);
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ return pElement;
+ }
+ FX_BYTE ch = m_pBuffer[m_dwIndex ++];
+ if (ch == '/') {
+ m_dwIndex ++;
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ return pElement;
+ }
+ if (ch != '>') {
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(pElement, m_pAllocator, CXML_Element);
+ } else {
+ delete pElement;
+ }
+ return NULL;
+ }
+ SkipWhiteSpaces();
+ if (IsEOF()) {
+ return pElement;
+ }
+ CFX_UTF8Decoder decoder(m_pAllocator);
+ CFX_WideTextBuf content(m_pAllocator);
+ FX_BOOL bCDATA = FALSE;
+ FX_INT32 iState = 0;
+ do {
+ while (m_dwIndex < m_dwBufferSize) {
+ ch = m_pBuffer[m_dwIndex ++];
+ switch (iState) {
+ case 0:
+ if (ch == '<') {
+ iState = 1;
+ } else if (ch == '&') {
+ decoder.ClearStatus();
+ decoder.AppendChar(GetCharRef());
+ } else {
+ decoder.Input(ch);
+ }
+ break;
+ case 1:
+ if (ch == '!') {
+ iState = 2;
+ } else if (ch == '?') {
+ SkipLiterals(FX_BSTRC("?>"));
+ SkipWhiteSpaces();
+ iState = 0;
+ } else if (ch == '/') {
+ CFX_ByteStringL space, name;
+ GetName(space, name);
+ space.Empty(m_pAllocator);
+ name.Empty(m_pAllocator);
+ SkipWhiteSpaces();
+ m_dwIndex ++;
+ iState = 10;
+ } else {
+ content << decoder.GetResult();
+ CFX_WideStringL dataStr;
+ content.GetWideStringL(dataStr);
+ if (!bCDATA && !m_bSaveSpaceChars) {
+ dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
+ }
+ InsertContentSegment(bCDATA, dataStr, pElement);
+ dataStr.Empty(m_pAllocator);
+ content.Clear();
+ decoder.Clear();
+ bCDATA = FALSE;
+ iState = 0;
+ m_dwIndex --;
+ CXML_Element* pSubElement = ParseElement(pElement, TRUE);
+ if (pSubElement == NULL) {
+ break;
+ }
+ pSubElement->m_pParent = pElement;
+ pElement->m_Children.Add((FX_LPVOID)CXML_Element::Element);
+ pElement->m_Children.Add(pSubElement);
+ SkipWhiteSpaces();
+ }
+ break;
+ case 2:
+ if (ch == '[') {
+ SkipLiterals(FX_BSTRC("]]>"));
+ } else if (ch == '-') {
+ m_dwIndex ++;
+ SkipLiterals(FX_BSTRC("-->"));
+ } else {
+ SkipLiterals(FX_BSTRC(">"));
+ }
+ decoder.Clear();
+ SkipWhiteSpaces();
+ iState = 0;
+ break;
+ }
+ if (iState == 10) {
+ break;
+ }
+ }
+ m_nOffset = m_nBufferOffset + (FX_FILESIZE)m_dwIndex;
+ if (iState == 10 || m_dwIndex < m_dwBufferSize || IsEOF()) {
+ break;
+ }
+ } while (ReadNextBlock());
+ content << decoder.GetResult();
+ CFX_WideStringL dataStr;
+ content.GetWideStringL(dataStr);
+ if (!m_bSaveSpaceChars) {
+ dataStr.TrimRight((FX_LPCWSTR)L" \t\r\n");
+ }
+ InsertContentSegment(bCDATA, dataStr, pElement);
+ dataStr.Empty(m_pAllocator);
+ content.Clear();
+ decoder.Clear();
+ bCDATA = FALSE;
+ return pElement;
+}
+void CXML_Parser::InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement)
+{
+ if (content.IsEmpty()) {
+ return;
+ }
+ CXML_Content* pContent;
+ if (m_pAllocator) {
+ pContent = FX_NewAtAllocator(m_pAllocator)CXML_Content;
+ } else {
+ pContent = FX_NEW CXML_Content;
+ }
+ if (!pContent) {
+ return;
+ }
+ pContent->Set(bCDATA, content, m_pAllocator);
+ pElement->m_Children.Add((FX_LPVOID)CXML_Element::Content);
+ pElement->m_Children.Add(pContent);
+}
+static CXML_Element* XML_ContinueParse(CXML_Parser &parser, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize)
+{
+ parser.m_bSaveSpaceChars = bSaveSpaceChars;
+ CXML_Element* pElement = parser.ParseElement(NULL, FALSE);
+ if (pParsedSize) {
+ *pParsedSize = parser.m_nOffset;
+ }
+ return pElement;
+}
+CXML_Element* CXML_Element::Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init((FX_LPBYTE)pBuffer, size)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element* CXML_Element::Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init(pFile)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element* CXML_Element::Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars, FX_FILESIZE* pParsedSize, IFX_Allocator* pAllocator)
+{
+ CXML_Parser parser(pAllocator);
+ if (!parser.Init(pBuffer)) {
+ return NULL;
+ }
+ return XML_ContinueParse(parser, bSaveSpaceChars, pParsedSize);
+}
+CXML_Element::CXML_Element(IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+}
+CXML_Element::CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+ m_QSpaceName.Set(qSpace, pAllocator);
+ m_TagName.Set(tagName, pAllocator);
+}
+CXML_Element::CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator)
+ : m_pParent(NULL)
+ , m_QSpaceName()
+ , m_TagName()
+ , m_AttrMap()
+ , m_Children(pAllocator)
+{
+ SetTag(qTagName);
+}
+CXML_Element::~CXML_Element()
+{
+ Empty();
+}
+void CXML_Element::Empty()
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ m_QSpaceName.Empty(pAllocator);
+ m_TagName.Empty(pAllocator);
+ m_AttrMap.RemoveAll(pAllocator);
+ RemoveChildren();
+}
+void CXML_Element::RemoveChildren()
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type == Content) {
+ CXML_Content* content = (CXML_Content*)m_Children.GetAt(i + 1);
+ if (pAllocator) {
+ FX_DeleteAtAllocator(content, pAllocator, CXML_Content);
+ } else {
+ delete content;
+ }
+ } else if (type == Element) {
+ CXML_Element* child = (CXML_Element*)m_Children.GetAt(i + 1);
+ child->RemoveChildren();
+ if (pAllocator) {
+ FX_DeleteAtAllocator(child, pAllocator, CXML_Element);
+ } else {
+ delete child;
+ }
+ }
+ }
+ m_Children.RemoveAll();
+}
+CFX_ByteString CXML_Element::GetTagName(FX_BOOL bQualified) const
+{
+ if (!bQualified || m_QSpaceName.IsEmpty()) {
+ return m_TagName;
+ }
+ CFX_ByteString bsTag = m_QSpaceName;
+ bsTag += ":";
+ bsTag += m_TagName;
+ return bsTag;
+}
+void CXML_Element::GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ if (!bQualified || m_QSpaceName.IsEmpty()) {
+ tagName.Set(m_TagName, pAllocator);
+ return;
+ }
+ FX_LPSTR str = tagName.AllocBuffer(m_QSpaceName.GetLength() + m_TagName.GetLength() + 2, pAllocator);
+ if (!str) {
+ return;
+ }
+ FXSYS_memcpy32(str, m_QSpaceName.GetCStr(), m_QSpaceName.GetLength());
+ str += m_QSpaceName.GetLength();
+ *str = ':';
+ str ++;
+ FXSYS_memcpy32(str, m_TagName.GetCStr(), m_TagName.GetLength());
+ str += m_TagName.GetLength();
+ *str = '\0';
+}
+CFX_ByteString CXML_Element::GetNamespace(FX_BOOL bQualified) const
+{
+ if (bQualified) {
+ return m_QSpaceName;
+ }
+ return GetNamespaceURI(m_QSpaceName);
+}
+void CXML_Element::GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ if (bQualified) {
+ nameSpace.Set(m_QSpaceName, pAllocator);
+ return;
+ }
+ GetNamespaceURI(m_QSpaceName, nameSpace);
+}
+CFX_ByteString CXML_Element::GetNamespaceURI(FX_BSTR qName) const
+{
+ const CFX_WideStringL* pwsSpace;
+ const CXML_Element *pElement = this;
+ do {
+ if (qName.IsEmpty()) {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
+ } else {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
+ }
+ if (pwsSpace) {
+ break;
+ }
+ pElement = pElement->GetParent();
+ } while(pElement);
+ return pwsSpace ? FX_UTF8Encode(*pwsSpace) : CFX_ByteString();
+}
+void CXML_Element::GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const
+{
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ const CFX_WideStringL* pwsSpace;
+ const CXML_Element *pElement = this;
+ do {
+ if (qName.IsEmpty()) {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC(""), FX_BSTRC("xmlns"));
+ } else {
+ pwsSpace = pElement->m_AttrMap.Lookup(FX_BSTRC("xmlns"), qName);
+ }
+ if (pwsSpace) {
+ break;
+ }
+ pElement = pElement->GetParent();
+ } while(pElement);
+ if (pwsSpace) {
+ FX_UTF8Encode(pwsSpace->GetPtr(), pwsSpace->GetLength(), uri, pAllocator);
+ }
+}
+void CXML_Element::GetAttrByIndex(int index, CFX_ByteString& space, CFX_ByteString& name, CFX_WideString& value) const
+{
+ if (index < 0 || index >= m_AttrMap.GetSize()) {
+ return;
+ }
+ CXML_AttrItem& item = m_AttrMap.GetAt(index);
+ space = item.m_QSpaceName;
+ name = item.m_AttrName;
+ value = item.m_Value;
+}
+void CXML_Element::GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const
+{
+ if (index < 0 || index >= m_AttrMap.GetSize()) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_Children.m_pAllocator;
+ CXML_AttrItem& item = m_AttrMap.GetAt(index);
+ space.Set(item.m_QSpaceName, pAllocator);
+ name.Set(item.m_AttrName, pAllocator);
+ value.Set(item.m_Value, pAllocator);
+}
+FX_BOOL CXML_Element::HasAttr(FX_BSTR name) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return m_AttrMap.Lookup(bsSpace, bsName) != NULL;
+}
+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(bsSpace, bsName);
+ if (pValue) {
+ attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
+ return TRUE;
+ }
+ return FALSE;
+}
+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR name) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return m_AttrMap.Lookup(bsSpace, bsName);
+}
+FX_BOOL CXML_Element::GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const
+{
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
+ if (pValue) {
+ attribute = CFX_WideString(pValue->GetPtr(), pValue->GetLength());
+ return TRUE;
+ }
+ return FALSE;
+}
+const CFX_WideStringL* CXML_Element::GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const
+{
+ return m_AttrMap.Lookup(space, name);
+}
+FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR name, int& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(bsSpace, bsName);
+ if (pwsValue) {
+ attribute = pwsValue->GetInteger();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXML_Element::GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const
+{
+ const CFX_WideStringL* pwsValue = m_AttrMap.Lookup(space, name);
+ if (pwsValue) {
+ attribute = pwsValue->GetInteger();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const
+{
+ CFX_ByteStringC bsSpace, bsName;
+ FX_XML_SplitQualifiedName(name, bsSpace, bsName);
+ return GetAttrFloat(bsSpace, bsName, attribute);
+}
+FX_BOOL CXML_Element::GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const
+{
+ CFX_WideString value;
+ const CFX_WideStringL* pValue = m_AttrMap.Lookup(space, name);
+ if (pValue) {
+ attribute = pValue->GetFloat();
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_DWORD CXML_Element::CountChildren() const
+{
+ return m_Children.GetSize() / 2;
+}
+CXML_Element::ChildType CXML_Element::GetChildType(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize()) {
+ return Invalid;
+ }
+ return (ChildType)(FX_UINTPTR)m_Children.GetAt(index);
+}
+CFX_WideString CXML_Element::GetContent(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
+ return CFX_WideString();
+ }
+ CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
+ if (pContent) {
+ return pContent->m_Content;
+ }
+ return CFX_WideString();
+}
+const CFX_WideStringL* CXML_Element::GetContentPtr(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Content) {
+ return NULL;
+ }
+ CXML_Content* pContent = (CXML_Content*)m_Children.GetAt(index + 1);
+ if (pContent) {
+ return &pContent->m_Content;
+ }
+ return NULL;
+}
+CXML_Element* CXML_Element::GetElement(FX_DWORD index) const
+{
+ index <<= 1;
+ if (index >= (FX_DWORD)m_Children.GetSize() ||
+ (ChildType)(FX_UINTPTR)m_Children.GetAt(index) != Element) {
+ return NULL;
+ }
+ return (CXML_Element*)m_Children.GetAt(index + 1);
+}
+FX_DWORD CXML_Element::CountElements(FX_BSTR space, FX_BSTR tag) const
+{
+ int count = 0;
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type != Element) {
+ continue;
+ }
+ CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
+ if ((space.IsEmpty() || pKid->m_QSpaceName == space) && pKid->m_TagName == tag) {
+ count ++;
+ }
+ }
+ return count;
+}
+CXML_Element* CXML_Element::GetElement(FX_BSTR space, FX_BSTR tag, int index) const
+{
+ if (index < 0) {
+ return NULL;
+ }
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ ChildType type = (ChildType)(FX_UINTPTR)m_Children.GetAt(i);
+ if (type != Element) {
+ continue;
+ }
+ CXML_Element* pKid = (CXML_Element*)m_Children.GetAt(i + 1);
+ if ((!space.IsEmpty() && pKid->m_QSpaceName != space) || pKid->m_TagName != tag) {
+ continue;
+ }
+ if (index -- == 0) {
+ return pKid;
+ }
+ }
+ return NULL;
+}
+FX_DWORD CXML_Element::FindElement(CXML_Element *pChild) const
+{
+ for (int i = 0; i < m_Children.GetSize(); i += 2) {
+ if ((ChildType)(FX_UINTPTR)m_Children.GetAt(i) == Element &&
+ (CXML_Element*)m_Children.GetAt(i + 1) == pChild) {
+ return (FX_DWORD)(i >> 1);
+ }
+ }
+ return (FX_DWORD) - 1;
+}
+const CFX_WideStringL* CXML_AttrMap::Lookup(FX_BSTR space, FX_BSTR name) const
+{
+ if (m_pMap == NULL) {
+ return NULL;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ return &item.m_Value;
+ }
+ }
+ return NULL;
+}
+void CXML_AttrMap::SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator)
+{
+ for (int i = 0; i < GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ item.m_Value.Set(value, pAllocator);
+ return;
+ }
+ }
+ if (!m_pMap) {
+ if (pAllocator) {
+ m_pMap = FX_NewAtAllocator(pAllocator)CFX_ObjectArray<CXML_AttrItem>(pAllocator);
+ } else {
+ m_pMap = FX_NEW CFX_ObjectArray<CXML_AttrItem>;
+ }
+ }
+ if (!m_pMap) {
+ return;
+ }
+ CXML_AttrItem* pItem = (CXML_AttrItem*)m_pMap->AddSpace();
+ if (!pItem) {
+ return;
+ }
+ pItem->m_QSpaceName.Set(space, pAllocator);
+ pItem->m_AttrName.Set(name, pAllocator);
+ pItem->m_Value.Set(value, pAllocator);
+}
+void CXML_AttrMap::RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator)
+{
+ if (m_pMap == NULL) {
+ return;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = GetAt(i);
+ if ((space.IsEmpty() || item.m_QSpaceName == space) && item.m_AttrName == name) {
+ item.Empty(pAllocator);
+ m_pMap->RemoveAt(i);
+ return;
+ }
+ }
+}
+int CXML_AttrMap::GetSize() const
+{
+ return m_pMap == NULL ? 0 : m_pMap->GetSize();
+}
+CXML_AttrItem& CXML_AttrMap::GetAt(int index) const
+{
+ ASSERT(m_pMap != NULL);
+ return (*m_pMap)[index];
+}
+void CXML_AttrMap::RemoveAll(IFX_Allocator* pAllocator)
+{
+ if (!m_pMap) {
+ return;
+ }
+ for (int i = 0; i < m_pMap->GetSize(); i ++) {
+ CXML_AttrItem& item = (*m_pMap)[i];
+ item.Empty(pAllocator);
+ }
+ m_pMap->RemoveAll();
+ if (pAllocator) {
+ FX_DeleteAtAllocator(m_pMap, pAllocator, CFX_ObjectArray<CXML_AttrItem>);
+ } else {
+ delete m_pMap;
+ }
+ m_pMap = NULL;
+}
diff --git a/core/src/fxcrt/fxcrt_platforms.cpp b/core/src/fxcrt/fxcrt_platforms.cpp
new file mode 100644
index 0000000000..1479b7bcf0
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_platforms.cpp
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_platforms.h"
+#if (_FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ && _FXM_PLATFORM_ != _FXM_PLATFORM_LINUX_ && _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ && _FXM_PLATFORM_ != _FXM_PLATFORM_ANDROID_)
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_CRT;
+ } else {
+ return FX_NEW CFXCRT_FileAccess_CRT;
+ }
+}
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode)
+{
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ bsMode = FX_BSTRC("rb");
+ } else if (dwModes & FX_FILEMODE_Truncate) {
+ bsMode = FX_BSTRC("w+b");
+ } else {
+ bsMode = FX_BSTRC("a+b");
+ }
+}
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode)
+{
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ wsMode = FX_WSTRC(L"rb");
+ } else if (dwModes & FX_FILEMODE_Truncate) {
+ wsMode = FX_WSTRC(L"w+b");
+ } else {
+ wsMode = FX_WSTRC(L"a+b");
+ }
+}
+CFXCRT_FileAccess_CRT::CFXCRT_FileAccess_CRT()
+ : m_hFile(NULL)
+{
+}
+CFXCRT_FileAccess_CRT::~CFXCRT_FileAccess_CRT()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ CFX_ByteString strMode;
+ FXCRT_GetFileModeString(dwMode, strMode);
+ m_hFile = FXSYS_fopen(fileName.GetCStr(), (FX_LPCSTR)strMode);
+ return m_hFile != NULL;
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ CFX_WideString strMode;
+ FXCRT_GetFileModeString(dwMode, strMode);
+ m_hFile = FXSYS_wfopen(fileName.GetPtr(), (FX_LPCWSTR)strMode);
+ return m_hFile != NULL;
+}
+void CFXCRT_FileAccess_CRT::Close()
+{
+ if (!m_hFile) {
+ return;
+ }
+ FXSYS_fclose(m_hFile);
+ m_hFile = NULL;
+}
+void CFXCRT_FileAccess_CRT::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_CRT);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::GetSize() const
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ FX_FILESIZE pos = (FX_FILESIZE)FXSYS_ftell(m_hFile);
+ FXSYS_fseek(m_hFile, 0, FXSYS_SEEK_END);
+ FX_FILESIZE size = (FX_FILESIZE)FXSYS_ftell(m_hFile);
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return size;
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::GetPosition() const
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)FXSYS_ftell(m_hFile);
+}
+FX_FILESIZE CFXCRT_FileAccess_CRT::SetPosition(FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return (FX_FILESIZE)FXSYS_ftell(m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::Read(void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return FXSYS_fread(pBuffer, 1, szBuffer, m_hFile);
+}
+size_t CFXCRT_FileAccess_CRT::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ FXSYS_fseek(m_hFile, pos, FXSYS_SEEK_SET);
+ return FXSYS_fwrite(pBuffer, 1, szBuffer, m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Flush()
+{
+ if (!m_hFile) {
+ return FALSE;
+ }
+ return !FXSYS_fflush(m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_CRT::Truncate(FX_FILESIZE szFile)
+{
+ return FALSE;
+}
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ return access(fileName.GetCStr(), F_OK) > -1;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ return FX_File_Exist(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return remove(fileName.GetCStr()) > -1;
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return FX_File_Delete(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ CFXCRT_FileAccess_CRT src, dst;
+ if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
+ return FALSE;
+ }
+ FX_FILESIZE size = src.GetSize();
+ if (!size) {
+ return FALSE;
+ }
+ if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
+ return FALSE;
+ }
+ FX_FILESIZE num = 0;
+ FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
+ if (!pBuffer) {
+ return FALSE;
+ }
+ while (num = src.Read(pBuffer, 32768)) {
+ if (dst.Write(pBuffer, num) != num) {
+ break;
+ }
+ }
+ FX_Free(pBuffer);
+ return TRUE;
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_platforms.h b/core/src/fxcrt/fxcrt_platforms.h
new file mode 100644
index 0000000000..633b888fe7
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_platforms.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_PLATFORMS_
+#define _FXCRT_PLATFORMS_
+#include "extension.h"
+#if _FX_OS_ == _FX_ANDROID_
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_ByteString &bsMode);
+void FXCRT_GetFileModeString(FX_DWORD dwModes, CFX_WideString &wsMode);
+class CFXCRT_FileAccess_CRT : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_CRT();
+ virtual ~CFXCRT_FileAccess_CRT();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FXSYS_FILE* m_hFile;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/fxcrt_posix.cpp b/core/src/fxcrt/fxcrt_posix.cpp
new file mode 100644
index 0000000000..6752e0a117
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_posix.cpp
@@ -0,0 +1,201 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_posix.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Posix();
+ } else {
+ return FX_NEW CFXCRT_FileAccess_Posix;
+ }
+}
+void FXCRT_Posix_GetFileMode(FX_DWORD dwModes, FX_INT32 &nFlags, FX_INT32 &nMasks)
+{
+ nFlags = O_BINARY | O_LARGEFILE;
+ if (dwModes & FX_FILEMODE_ReadOnly) {
+ nFlags |= O_RDONLY;
+ nMasks = 0;
+ } else {
+ nFlags |= O_RDWR | O_CREAT;
+ if (dwModes & FX_FILEMODE_Truncate) {
+ nFlags |= O_TRUNC;
+ }
+ nMasks = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ }
+}
+CFXCRT_FileAccess_Posix::CFXCRT_FileAccess_Posix()
+ : m_nFD(-1)
+{
+}
+CFXCRT_FileAccess_Posix::~CFXCRT_FileAccess_Posix()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_nFD > -1) {
+ return FALSE;
+ }
+ FX_INT32 nFlags, nMasks;
+ FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
+ m_nFD = open(fileName.GetCStr(), nFlags, nMasks);
+ return m_nFD > -1;
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ return Open(FX_UTF8Encode(fileName), dwMode);
+}
+void CFXCRT_FileAccess_Posix::Close()
+{
+ if (m_nFD < 0) {
+ return;
+ }
+ close(m_nFD);
+ m_nFD = -1;
+}
+void CFXCRT_FileAccess_Posix::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Posix);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::GetSize() const
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ struct stat s;
+ FXSYS_memset32(&s, 0, sizeof(s));
+ fstat(m_nFD, &s);
+ return s.st_size;
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::GetPosition() const
+{
+ if (m_nFD < 0) {
+ return (FX_FILESIZE) - 1;
+ }
+ return lseek(m_nFD, 0, SEEK_CUR);
+}
+FX_FILESIZE CFXCRT_FileAccess_Posix::SetPosition(FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return (FX_FILESIZE) - 1;
+ }
+ return lseek(m_nFD, pos, SEEK_SET);
+}
+size_t CFXCRT_FileAccess_Posix::Read(void* pBuffer, size_t szBuffer)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ return read(m_nFD, pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ return write(m_nFD, pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ if (pos >= GetSize()) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Read(pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Posix::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (m_nFD < 0) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Write(pBuffer, szBuffer);
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Flush()
+{
+ if (m_nFD < 0) {
+ return FALSE;
+ }
+ return fsync(m_nFD) > -1;
+}
+FX_BOOL CFXCRT_FileAccess_Posix::Truncate(FX_FILESIZE szFile)
+{
+ if (m_nFD < 0) {
+ return FALSE;
+ }
+ return !ftruncate(m_nFD, szFile);
+}
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ return access(fileName.GetCStr(), F_OK) > -1;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ return FX_File_Exist(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return remove(fileName.GetCStr()) > -1;
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return FX_File_Delete(FX_UTF8Encode(fileName));
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ CFXCRT_FileAccess_Posix src, dst;
+ if (!src.Open(fileNameSrc, FX_FILEMODE_ReadOnly)) {
+ return FALSE;
+ }
+ FX_FILESIZE size = src.GetSize();
+ if (!size) {
+ return FALSE;
+ }
+ if (!dst.Open(fileNameDst, FX_FILEMODE_Truncate)) {
+ return FALSE;
+ }
+ size_t num = 0;
+ FX_LPBYTE pBuffer = FX_Alloc(FX_BYTE, 32768);
+ if (!pBuffer) {
+ return FALSE;
+ }
+ num = src.Read(pBuffer, 32768);
+ while (num) {
+ if (dst.Write(pBuffer, num) != num) {
+ break;
+ }
+ num = src.Read(pBuffer, 32768);
+ }
+ FX_Free(pBuffer);
+ return TRUE;
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Copy(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return rename(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return FX_File_Move(FX_UTF8Encode(fileNameSrc), FX_UTF8Encode(fileNameDst));
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_posix.h b/core/src/fxcrt/fxcrt_posix.h
new file mode 100644
index 0000000000..29c84adb1f
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_posix.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_LINUX_
+#define _FXCRT_LINUX_
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+class CFXCRT_FileAccess_Posix : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_Posix();
+ virtual ~CFXCRT_FileAccess_Posix();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FX_INT32 m_nFD;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/fxcrt_windows.cpp b/core/src/fxcrt/fxcrt_windows.cpp
new file mode 100644
index 0000000000..e03bfda354
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_windows.cpp
@@ -0,0 +1,222 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxcrt/fx_ext.h"
+#include "fxcrt_windows.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+FX_BOOL FX_File_Exist(FX_BSTR fileName)
+{
+ FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());
+ if (dwAttri == -1) {
+ return FALSE;
+ }
+ return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+FX_BOOL FX_File_Exist(FX_WSTR fileName)
+{
+ FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());
+ if (dwAttri == -1) {
+ return FALSE;
+ }
+ return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+IFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;
+ } else {
+ return FX_NEW CFXCRT_FileAccess_Win64;
+ }
+}
+void FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)
+{
+ dwAccess = GENERIC_READ;
+ dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
+ if (!(dwMode & FX_FILEMODE_ReadOnly)) {
+ dwAccess |= GENERIC_WRITE;
+ dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;
+ } else {
+ dwCreation = OPEN_EXISTING;
+ }
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
+WINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
+#ifdef __cplusplus
+}
+#endif
+CFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()
+ : m_hFile(NULL)
+{
+}
+CFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()
+{
+ Close();
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ FX_DWORD dwAccess, dwShare, dwCreation;
+ FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
+ m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (m_hFile == INVALID_HANDLE_VALUE) {
+ m_hFile = NULL;
+ }
+ return m_hFile != NULL;
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)
+{
+ if (m_hFile) {
+ return FALSE;
+ }
+ FX_DWORD dwAccess, dwShare, dwCreation;
+ FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
+ m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
+ if (m_hFile == INVALID_HANDLE_VALUE) {
+ m_hFile = NULL;
+ }
+ return m_hFile != NULL;
+}
+void CFXCRT_FileAccess_Win64::Close()
+{
+ if (!m_hFile) {
+ return;
+ }
+ ::CloseHandle(m_hFile);
+ m_hFile = NULL;
+}
+void CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)
+{
+ if (pAllocator) {
+ FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);
+ } else {
+ delete this;
+ }
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ LARGE_INTEGER size = {0, 0};
+ if (!::GetFileSizeEx(m_hFile, &size)) {
+ return 0;
+ }
+ return (FX_FILESIZE)size.QuadPart;
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ LARGE_INTEGER dist = {0, 0};
+ LARGE_INTEGER newPos = {0, 0};
+ if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)newPos.QuadPart;
+}
+FX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return (FX_FILESIZE) - 1;
+ }
+ LARGE_INTEGER dist;
+ dist.QuadPart = pos;
+ LARGE_INTEGER newPos = {0, 0};
+ if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {
+ return (FX_FILESIZE) - 1;
+ }
+ return (FX_FILESIZE)newPos.QuadPart;
+}
+size_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ size_t szRead = 0;
+ if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {
+ return 0;
+ }
+ return szRead;
+}
+size_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ size_t szWrite = 0;
+ if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {
+ return 0;
+ }
+ return szWrite;
+}
+size_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ if (pos >= GetSize()) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Read(pBuffer, szBuffer);
+}
+size_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
+{
+ if (!m_hFile) {
+ return 0;
+ }
+ if (SetPosition(pos) == (FX_FILESIZE) - 1) {
+ return 0;
+ }
+ return Write(pBuffer, szBuffer);
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Flush()
+{
+ if (!m_hFile) {
+ return FALSE;
+ }
+ return ::FlushFileBuffers(m_hFile);
+}
+FX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)
+{
+ if (SetPosition(szFile) == (FX_FILESIZE) - 1) {
+ return FALSE;
+ }
+ return ::SetEndOfFile(m_hFile);
+}
+FX_BOOL FX_File_Delete(FX_BSTR fileName)
+{
+ return ::DeleteFileA(fileName.GetCStr());
+}
+FX_BOOL FX_File_Delete(FX_WSTR fileName)
+{
+ return ::DeleteFileW((LPCWSTR)fileName.GetPtr());
+}
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);
+}
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);
+}
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
+{
+ return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
+}
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
+{
+ return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());
+}
+#endif
diff --git a/core/src/fxcrt/fxcrt_windows.h b/core/src/fxcrt/fxcrt_windows.h
new file mode 100644
index 0000000000..beb684d067
--- /dev/null
+++ b/core/src/fxcrt/fxcrt_windows.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_WINDOWS_
+#define _FXCRT_WINDOWS_
+#include "extension.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+class CFXCRT_FileAccess_Win64 : public IFXCRT_FileAccess, public CFX_Object
+{
+public:
+ CFXCRT_FileAccess_Win64();
+ virtual ~CFXCRT_FileAccess_Win64();
+ virtual FX_BOOL Open(FX_BSTR fileName, FX_DWORD dwMode);
+ virtual FX_BOOL Open(FX_WSTR fileName, FX_DWORD dwMode);
+ virtual void Close();
+ virtual void Release(IFX_Allocator* pAllocator = NULL);
+ virtual FX_FILESIZE GetSize() const;
+ virtual FX_FILESIZE GetPosition() const;
+ virtual FX_FILESIZE SetPosition(FX_FILESIZE pos);
+ virtual size_t Read(void* pBuffer, size_t szBuffer);
+ virtual size_t Write(const void* pBuffer, size_t szBuffer);
+ virtual size_t ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual size_t WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+ virtual FX_BOOL Flush();
+ virtual FX_BOOL Truncate(FX_FILESIZE szFile);
+protected:
+ FX_LPVOID m_hFile;
+};
+#endif
+#endif
diff --git a/core/src/fxcrt/mem_int.h b/core/src/fxcrt/mem_int.h
new file mode 100644
index 0000000000..da43023bb5
--- /dev/null
+++ b/core/src/fxcrt/mem_int.h
@@ -0,0 +1,232 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXM_MEM_INT_H_
+#define _FXM_MEM_INT_H_
+struct FX_DefAllocator {
+ IFX_Allocator m_Allocator;
+ struct CFX_MemoryMgr* m_pFoxitMgr;
+};
+struct CFX_MemoryMgr {
+public:
+ FXMEM_SystemMgr* m_pSystemMgr;
+ FX_DefAllocator m_DefAllocator;
+ FX_LPVOID m_pExternalMemory;
+ FX_BOOL m_bReleaseMgr;
+ void Init(FXMEM_SystemMgr* pSystemMgr);
+ void* Alloc(size_t size, int flags);
+ void* AllocDebug(size_t size, int flags, FX_LPCSTR file, int line);
+ void* Realloc(void* p, size_t size, int flags);
+ void* ReallocDebug(void* p, size_t size, int flags, FX_LPCSTR file, int line);
+ void Free(void* p, int flags);
+ void PurgeMgr();
+};
+extern CFX_MemoryMgr* g_pDefFoxitMgr;
+#define FIXEDMEM_PAGE_EXTRASPACE sizeof(size_t)
+#define FIXEDMEM_BLOCKNUM(bs) (8 * (FX_FIXEDMEM_PAGESIZE - FIXEDMEM_PAGE_EXTRASPACE) / (8 * bs + 1))
+#define FIXEDMEM_8BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(8)
+#define FIXEDMEM_16BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(16)
+#define FIXEDMEM_32BYTES_BLOCKNUM FIXEDMEM_BLOCKNUM(32)
+extern const FX_BYTE ZeroLeadPos[256];
+extern const FX_BYTE OneLeadPos[256];
+template <size_t blockNum, size_t blockSize>
+class CFXMEM_FixedPage
+{
+public:
+ void Initialize()
+ {
+ m_nAvailCount = blockNum;
+ FXSYS_memset32(m_BusyMap, 0, (blockNum + 7) / 8);
+ }
+ FX_BOOL HasFreeBlock() const
+ {
+ return (FX_BOOL)m_nAvailCount;
+ }
+ FX_LPVOID Alloc(size_t size)
+ {
+ FXSYS_assert(m_nAvailCount);
+ FX_LPDWORD pFind = (FX_LPDWORD)m_BusyMap;
+ size_t i = 0;
+ while (i < (blockNum + 7) / 8 / 4 && pFind[i] == 0xFFFFFFFF) {
+ i ++;
+ }
+ i *= 4;
+ while (m_BusyMap[i] == 0xFF) {
+ i ++;
+ }
+ size_t pos = ZeroLeadPos[m_BusyMap[i]];
+ m_BusyMap[i] |= 1 << (7 - pos);
+ m_nAvailCount --;
+ return (FX_LPBYTE)(this + 1) + (i * 8 + pos) * blockSize;
+ }
+ void Free(FX_LPVOID p)
+ {
+ FXSYS_assert(p > (FX_LPVOID)this && p < (FX_LPVOID)((FX_LPBYTE)this + FX_FIXEDMEM_PAGESIZE));
+ size_t pos = ((FX_LPBYTE)p - (FX_LPBYTE)(this + 1)) / blockSize;
+ m_BusyMap[pos / 8] &= ~(1 << (7 - (pos % 8)));
+ m_nAvailCount ++;
+ }
+ volatile size_t m_nAvailCount;
+ FX_BYTE m_BusyMap[(blockNum + 7) / 8];
+};
+typedef CFXMEM_FixedPage<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPage;
+typedef CFXMEM_FixedPage<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPage;
+typedef CFXMEM_FixedPage<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPage;
+template <size_t blockNum, size_t blockSize>
+class CFXMEM_FixedPages
+{
+public:
+ typedef CFXMEM_FixedPage<blockNum, blockSize> T;
+ FX_LPBYTE m_pStartPage;
+ FX_LPBYTE m_pLimitPos;
+ FX_LPBYTE m_pCurPage;
+ volatile size_t m_nAvailBlocks;
+ void Initialize(FX_LPBYTE pStart, size_t pages)
+ {
+ m_pStartPage = m_pCurPage = pStart;
+ m_nAvailBlocks = pages * blockNum;
+ for (size_t n = 0; n < pages; n ++) {
+ ((T*)pStart)->Initialize();
+ pStart += FX_FIXEDMEM_PAGESIZE;
+ }
+ m_pLimitPos = pStart;
+ }
+ FX_BOOL IsEmpty() const
+ {
+ return m_nAvailBlocks == (m_pLimitPos - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * blockNum;
+ }
+ FX_BOOL HasFreeBlock() const
+ {
+ return (FX_BOOL)m_nAvailBlocks;
+ }
+ FX_LPVOID Alloc(size_t size)
+ {
+ FXSYS_assert(m_nAvailBlocks);
+ do {
+ if (((T*)m_pCurPage)->HasFreeBlock()) {
+ m_nAvailBlocks --;
+ return ((T*)m_pCurPage)->Alloc(size);
+ }
+ m_pCurPage += FX_FIXEDMEM_PAGESIZE;
+ if (m_pCurPage == m_pLimitPos) {
+ m_pCurPage = m_pStartPage;
+ }
+ } while (TRUE);
+ return NULL;
+ }
+ void Free(FX_LPVOID p)
+ {
+ FXSYS_assert(p > (FX_LPVOID)m_pStartPage && p < (FX_LPVOID)m_pLimitPos);
+ ((T*)(m_pStartPage + ((FX_LPBYTE)p - m_pStartPage) / FX_FIXEDMEM_PAGESIZE * FX_FIXEDMEM_PAGESIZE))->Free(p);
+ m_nAvailBlocks ++;
+ }
+};
+typedef CFXMEM_FixedPages<FIXEDMEM_8BYTES_BLOCKNUM, 8> CFXMEM_8BytesPages;
+typedef CFXMEM_FixedPages<FIXEDMEM_16BYTES_BLOCKNUM, 16> CFXMEM_16BytesPages;
+typedef CFXMEM_FixedPages<FIXEDMEM_32BYTES_BLOCKNUM, 32> CFXMEM_32BytesPages;
+class CFXMEM_Block
+{
+public:
+ size_t m_nBlockSize;
+ CFXMEM_Block* m_pNextBlock;
+};
+class CFXMEM_Page
+{
+public:
+ size_t m_nAvailSize;
+ CFXMEM_Block* m_pLimitPos;
+ CFXMEM_Block m_AvailHead;
+ void Initialize(size_t size);
+ FX_BOOL IsEmpty() const
+ {
+ return m_AvailHead.m_pNextBlock && m_AvailHead.m_nBlockSize == m_AvailHead.m_pNextBlock->m_nBlockSize;
+ }
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+protected:
+ FX_LPVOID Alloc(CFXMEM_Block* pPrevBlock, CFXMEM_Block* pNextBlock, size_t size, size_t oldsize);
+};
+class CFXMEM_Pages
+{
+public:
+ CFXMEM_Page* m_pStartPage;
+ CFXMEM_Page* m_pLimitPos;
+ CFXMEM_Page* m_pCurPage;
+ size_t m_nPageSize;
+ void Initialize(FX_LPBYTE pStart, size_t pageSize, size_t pages);
+ FX_BOOL IsEmpty() const;
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+};
+class CFXMEM_Pool
+{
+public:
+ CFXMEM_Pool* m_pPrevPool;
+ CFXMEM_Pool* m_pNextPool;
+ CFXMEM_8BytesPages m_8BytesPages;
+ CFXMEM_16BytesPages m_16BytesPages;
+ CFXMEM_32BytesPages m_32BytesPages;
+ CFXMEM_Pages m_MidPages;
+ FX_BOOL m_bAlone;
+ FX_DWORD m_dwReserved[3];
+ FX_LPVOID m_pLimitPos;
+ CFXMEM_Page* m_pLargePage;
+ void Initialize(const FX_MEMCONFIG* pMemConfig, size_t size, size_t pageNum8Bytes, size_t pageNum16Bytes, size_t pageNum32Bytes, size_t pageNumMid);
+ FX_BOOL IsEmpty() const;
+ size_t GetSize(FX_LPVOID p) const;
+ FX_LPVOID Realloc(FX_LPVOID p, size_t oldSize, size_t newSize);
+ void Free(FX_LPVOID p);
+};
+class CFXMEM_FixedMgr
+{
+public:
+ void Initialize(size_t size);
+ FX_LPVOID Alloc(size_t size);
+ FX_LPVOID Realloc(FX_LPVOID p, size_t newSize);
+ void Free(FX_LPVOID p);
+ void FreeAll();
+ void Purge();
+ CFXMEM_Pool* GetFirstPool()
+ {
+ return &m_FirstPool;
+ }
+ size_t GetSize(FX_LPVOID p) const;
+ FXMEM_SystemMgr m_SystemMgr;
+ FXMEM_SystemMgr2* m_pExtender;
+ FX_LPVOID m_pReserved;
+ FX_MEMCONFIG m_MemConfig;
+protected:
+ FX_LPVOID Alloc16(CFXMEM_Pool **pp32Pool = NULL, size_t size = 0);
+ FX_LPVOID Alloc32(size_t size);
+ FX_LPVOID AllocSmall(size_t size);
+ FX_LPVOID AllocMid(size_t size);
+ FX_LPVOID AllocLarge(size_t size);
+ FX_LPVOID ReallocSmall(CFXMEM_Pool* pPool, FX_LPVOID p, size_t oldSize, size_t newSize);
+ void FreePool(CFXMEM_Pool* pPool);
+ CFXMEM_Pool m_FirstPool;
+};
+#define FIXEDMEM_PROXYSIZE_0 (1024 * 1024 * 8)
+#define FIXEDMEM_PROXYSIZE_1 (1024 * 1024 * 16)
+#define FIXEDMEM_PROXYSIZE_2 (1024 * 1024 * 32)
+#define FIXEDMEM_PROXYSIZE_3 (1024 * 1024 * 64)
+#define FIXEDMEM_PROXYSIZE_4 (1024 * 1024 * 128)
+#define FIXEDMEM_PROXYSIZE_5 (1024 * 1024 * 256)
+const FX_MEMCONFIG* FixedMgr_GetConfig(size_t nSize);
+class CFixedMgr_Proxy
+{
+public:
+ FXMEM_FoxitMgr* Initialize(FX_LPVOID pBuffer, size_t nSize, FX_BOOL bExtensible);
+ static FX_BOOL Common_More(FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
+ static void Common_Free(FXMEM_SystemMgr2* pMgr, void* memory);
+ FXMEM_SystemMgr2 m_SystemMgr;
+ CFXMEM_Page* m_pFixedPage;
+ FX_LPVOID m_pBuffer;
+ size_t m_nSize;
+ FX_BOOL m_bExtensible;
+};
+#endif
diff --git a/core/src/fxcrt/plex.h b/core/src/fxcrt/plex.h
new file mode 100644
index 0000000000..32a27cbf1d
--- /dev/null
+++ b/core/src/fxcrt/plex.h
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct CFX_Plex {
+ CFX_Plex* pNext;
+ void* data()
+ {
+ return this + 1;
+ }
+ static CFX_Plex* Create(IFX_Allocator* pAllocator, CFX_Plex*& head, FX_DWORD nMax, FX_DWORD cbElement);
+ void FreeDataChain(IFX_Allocator* pAllocator);
+};
diff --git a/core/src/fxcrt/xml_int.h b/core/src/fxcrt/xml_int.h
new file mode 100644
index 0000000000..8ad8ef4b88
--- /dev/null
+++ b/core/src/fxcrt/xml_int.h
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_XML_INT_
+#define _FXCRT_XML_INT_
+class CXML_DataBufAcc : public IFX_BufferRead, public CFX_Object
+{
+public:
+ CXML_DataBufAcc(FX_LPCBYTE pBuffer, size_t size, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pBuffer(pBuffer)
+ , m_dwSize(size)
+ , m_dwCurPos(0)
+ {
+ }
+ virtual ~CXML_DataBufAcc() {}
+ virtual void Release()
+ {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataBufAcc);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_dwCurPos >= m_dwSize;
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return (FX_FILESIZE)m_dwCurPos;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
+ {
+ if (bRestart) {
+ m_dwCurPos = 0;
+ }
+ if (m_dwCurPos < m_dwSize) {
+ m_dwCurPos = m_dwSize;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ virtual FX_LPCBYTE GetBlockBuffer()
+ {
+ return m_pBuffer;
+ }
+ virtual size_t GetBlockSize()
+ {
+ return m_dwSize;
+ }
+ virtual FX_FILESIZE GetBlockOffset()
+ {
+ return 0;
+ }
+protected:
+ IFX_Allocator* m_pAllocator;
+ FX_LPCBYTE m_pBuffer;
+ size_t m_dwSize;
+ size_t m_dwCurPos;
+};
+#define FX_XMLDATASTREAM_BufferSize (32 * 1024)
+class CXML_DataStmAcc : public IFX_BufferRead, public CFX_Object
+{
+public:
+ CXML_DataStmAcc(IFX_FileRead *pFileRead, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pFileRead(pFileRead)
+ , m_pBuffer(NULL)
+ , m_nStart(0)
+ , m_dwSize(0)
+ {
+ FXSYS_assert(m_pFileRead != NULL);
+ }
+ virtual ~CXML_DataStmAcc()
+ {
+ if (m_pBuffer) {
+ FX_Allocator_Free(m_pAllocator, m_pBuffer);
+ }
+ }
+ virtual void Release()
+ {
+ if (m_pAllocator) {
+ FX_DeleteAtAllocator(this, m_pAllocator, CXML_DataStmAcc);
+ } else {
+ delete this;
+ }
+ }
+ virtual FX_BOOL IsEOF()
+ {
+ return m_nStart + (FX_FILESIZE)m_dwSize >= m_pFileRead->GetSize();
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return m_nStart + (FX_FILESIZE)m_dwSize;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE)
+ {
+ if (bRestart) {
+ m_nStart = 0;
+ }
+ FX_FILESIZE nLength = m_pFileRead->GetSize();
+ m_nStart += (FX_FILESIZE)m_dwSize;
+ if (m_nStart >= nLength) {
+ return FALSE;
+ }
+ m_dwSize = (size_t)FX_MIN(FX_XMLDATASTREAM_BufferSize, nLength - m_nStart);
+ if (!m_pBuffer) {
+ m_pBuffer = FX_Allocator_Alloc(m_pAllocator, FX_BYTE, m_dwSize);
+ if (!m_pBuffer) {
+ return FALSE;
+ }
+ }
+ return m_pFileRead->ReadBlock(m_pBuffer, m_nStart, m_dwSize);
+ }
+ virtual FX_LPCBYTE GetBlockBuffer()
+ {
+ return (FX_LPCBYTE)m_pBuffer;
+ }
+ virtual size_t GetBlockSize()
+ {
+ return m_dwSize;
+ }
+ virtual FX_FILESIZE GetBlockOffset()
+ {
+ return m_nStart;
+ }
+protected:
+ IFX_Allocator* m_pAllocator;
+ IFX_FileRead *m_pFileRead;
+ FX_LPBYTE m_pBuffer;
+ FX_FILESIZE m_nStart;
+ size_t m_dwSize;
+};
+class CXML_Parser
+{
+public:
+ CXML_Parser(IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator) {}
+ ~CXML_Parser();
+ IFX_Allocator* m_pAllocator;
+ IFX_BufferRead* m_pDataAcc;
+ FX_BOOL m_bOwnedStream;
+ FX_FILESIZE m_nOffset;
+ FX_BOOL m_bSaveSpaceChars;
+ FX_LPCBYTE m_pBuffer;
+ size_t m_dwBufferSize;
+ FX_FILESIZE m_nBufferOffset;
+ size_t m_dwIndex;
+ FX_BOOL Init(FX_LPBYTE pBuffer, size_t size);
+ FX_BOOL Init(IFX_FileRead *pFileRead);
+ FX_BOOL Init(IFX_BufferRead *pBuffer);
+ FX_BOOL Init(FX_BOOL bOwndedStream);
+ FX_BOOL ReadNextBlock();
+ FX_BOOL IsEOF();
+ FX_BOOL HaveAvailData();
+ void SkipWhiteSpaces();
+ void GetName(CFX_ByteStringL &space, CFX_ByteStringL &name);
+ void GetAttrValue(CFX_WideStringL &value);
+ FX_DWORD GetCharRef();
+ void GetTagName(CFX_ByteStringL &space, CFX_ByteStringL &name, FX_BOOL &bEndTag, FX_BOOL bStartTag = FALSE);
+ void SkipLiterals(FX_BSTR str);
+ CXML_Element* ParseElement(CXML_Element* pParent, FX_BOOL bStartTag = FALSE);
+ void InsertContentSegment(FX_BOOL bCDATA, FX_WSTR content, CXML_Element* pElement);
+ void InsertCDATASegment(CFX_UTF8Decoder& decoder, CXML_Element* pElement);
+};
+void FX_XML_SplitQualifiedName(FX_BSTR bsFullName, CFX_ByteStringC &bsSpace, CFX_ByteStringC &bsName);
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/DWrite.h b/core/src/fxge/Microsoft SDK/include/DWrite.h
new file mode 100644
index 0000000000..70f998a437
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/DWrite.h
@@ -0,0 +1,5006 @@
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// DirectX Typography Services public API definitions.
+//
+//----------------------------------------------------------------------------
+
+#ifndef DWRITE_H_INCLUDED
+#define DWRITE_H_INCLUDED
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifndef DWRITE_NO_WINDOWS_H
+
+#include "specstrings.h"
+#include "unknwn.h"
+
+#endif // DWRITE_NO_WINDOWS_H
+
+#include "dcommon.h"
+
+#if _FX_COMPILER_ == _FX_VC6_
+typedef signed char INT8, *PINT8;
+typedef signed short INT16, *PINT16;
+typedef signed int INT32, *PINT32;
+typedef signed __int64 INT64, *PINT64;
+typedef unsigned char UINT8, *PUINT8;
+typedef unsigned short UINT16, *PUINT16;
+typedef unsigned int UINT32, *PUINT32;
+typedef unsigned __int64 UINT64, *PUINT64;
+#endif
+
+#ifndef DWRITE_DECLARE_INTERFACE
+#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
+#endif
+
+#ifndef DWRITE_EXPORT
+#define DWRITE_EXPORT __declspec(dllimport) WINAPI
+#endif
+
+/// <summary>
+/// The type of a font represented by a single font file.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// separate enum values for each of the file type.
+/// </summary>
+enum DWRITE_FONT_FILE_TYPE
+{
+ /// <summary>
+ /// Font type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_UNKNOWN,
+
+ /// <summary>
+ /// OpenType font with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font that contains a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// Type 1 PFM font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
+
+ /// <summary>
+ /// Type 1 PFB font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
+
+ /// <summary>
+ /// Vector .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_VECTOR,
+
+ /// <summary>
+ /// Bitmap .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_BITMAP
+};
+
+/// <summary>
+/// The file format of a complete font face.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// a single enum entry.
+/// </summary>
+enum DWRITE_FONT_FACE_TYPE
+{
+ /// <summary>
+ /// OpenType font face with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font face with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font face that is a part of a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// A Type 1 font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TYPE1,
+
+ /// <summary>
+ /// A vector .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_VECTOR,
+
+ /// <summary>
+ /// A bitmap .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_BITMAP,
+
+ /// <summary>
+ /// Font face type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_UNKNOWN
+};
+
+/// <summary>
+/// Specifies algorithmic style simulations to be applied to the font face.
+/// Bold and oblique simulations can be combined via bitwise OR operation.
+/// </summary>
+enum DWRITE_FONT_SIMULATIONS
+{
+ /// <summary>
+ /// No simulations are performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
+
+ /// <summary>
+ /// Algorithmic emboldening is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
+
+ /// <summary>
+ /// Algorithmic italicization is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
+#endif
+
+/// <summary>
+/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.
+/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_WEIGHT
+{
+ /// <summary>
+ /// Predefined font weight : Thin (100).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_THIN = 100,
+
+ /// <summary>
+ /// Predefined font weight : Extra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Light (300).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_LIGHT = 300,
+
+ /// <summary>
+ /// Predefined font weight : Normal (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_NORMAL = 400,
+
+ /// <summary>
+ /// Predefined font weight : Regular (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_REGULAR = 400,
+
+ /// <summary>
+ /// Predefined font weight : Medium (500).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_MEDIUM = 500,
+
+ /// <summary>
+ /// Predefined font weight : Demi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Semi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Bold (700).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BOLD = 700,
+
+ /// <summary>
+ /// Predefined font weight : Extra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Black (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BLACK = 900,
+
+ /// <summary>
+ /// Predefined font weight : Heavy (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_HEAVY = 900,
+
+ /// <summary>
+ /// Predefined font weight : Extra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
+};
+
+/// <summary>
+/// The font stretch enumeration describes relative change from the normal aspect ratio
+/// as specified by a font designer for the glyphs in a font.
+/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STRETCH
+{
+ /// <summary>
+ /// Predefined font stretch : Not known (0).
+ /// </summary>
+ DWRITE_FONT_STRETCH_UNDEFINED = 0,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-condensed (1).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-condensed (2).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
+
+ /// <summary>
+ /// Predefined font stretch : Condensed (3).
+ /// </summary>
+ DWRITE_FONT_STRETCH_CONDENSED = 3,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-condensed (4).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
+
+ /// <summary>
+ /// Predefined font stretch : Normal (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_NORMAL = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Medium (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_MEDIUM = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-expanded (6).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
+
+ /// <summary>
+ /// Predefined font stretch : Expanded (7).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXPANDED = 7,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-expanded (8).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-expanded (9).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
+};
+
+/// <summary>
+/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.
+/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STYLE
+{
+ /// <summary>
+ /// Font slope style : Normal.
+ /// </summary>
+ DWRITE_FONT_STYLE_NORMAL,
+
+ /// <summary>
+ /// Font slope style : Oblique.
+ /// </summary>
+ DWRITE_FONT_STYLE_OBLIQUE,
+
+ /// <summary>
+ /// Font slope style : Italic.
+ /// </summary>
+ DWRITE_FONT_STYLE_ITALIC
+
+};
+
+/// <summary>
+/// The informational string enumeration identifies a string in a font.
+/// </summary>
+enum DWRITE_INFORMATIONAL_STRING_ID
+{
+ /// <summary>
+ /// Unspecified name ID.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_NONE,
+
+ /// <summary>
+ /// Copyright notice provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
+
+ /// <summary>
+ /// String containing a version number.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
+
+ /// <summary>
+ /// Trademark information provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_TRADEMARK,
+
+ /// <summary>
+ /// Name of the font manufacturer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
+
+ /// <summary>
+ /// Name of the font designer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER,
+
+ /// <summary>
+ /// URL of font designer (with protocol, e.g., http://, ftp://).
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
+
+ /// <summary>
+ /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
+
+ /// <summary>
+ /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
+
+ /// <summary>
+ /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
+
+ /// <summary>
+ /// URL where additional licensing information can be found.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
+
+ /// <summary>
+ /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names
+ /// (e.g., "Arial", "Arial Narrow", "Arial Black").
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
+
+ /// <summary>
+ /// GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with
+ /// GDI. This name is typically only present if it differs from the GDI-compatible family name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
+
+ /// <summary>
+ /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT
+};
+
+
+/// <summary>
+/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that
+/// are applicable to all glyphs within the font face.
+/// </summary>
+struct DWRITE_FONT_METRICS
+{
+ /// <summary>
+ /// The number of font design units per em unit.
+ /// Font files use their own coordinate system of font design units.
+ /// A font design unit is the smallest measurable unit in the em square,
+ /// an imaginary square that is used to size and align glyphs.
+ /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.
+ /// The size of one em square is also commonly used to compute the paragraph identation value.
+ /// </summary>
+ UINT16 designUnitsPerEm;
+
+ /// <summary>
+ /// Ascent value of the font face in font design units.
+ /// Ascent is the distance from the top of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 ascent;
+
+ /// <summary>
+ /// Descent value of the font face in font design units.
+ /// Descent is the distance from the bottom of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 descent;
+
+ /// <summary>
+ /// Line gap in font design units.
+ /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing
+ /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually
+ /// positive or zero but can be negative, in which case the recommended line spacing is less than the height
+ /// of the character alignment box.
+ /// </summary>
+ INT16 lineGap;
+
+ /// <summary>
+ /// Cap height value of the font face in font design units.
+ /// Cap height is the distance from English baseline to the top of a typical English capital.
+ /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.
+ /// </summary>
+ UINT16 capHeight;
+
+ /// <summary>
+ /// x-height value of the font face in font design units.
+ /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.
+ /// </summary>
+ UINT16 xHeight;
+
+ /// <summary>
+ /// The underline position value of the font face in font design units.
+ /// Underline position is the position of underline relative to the English baseline.
+ /// The value is usually made negative in order to place the underline below the baseline.
+ /// </summary>
+ INT16 underlinePosition;
+
+ /// <summary>
+ /// The suggested underline thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 underlineThickness;
+
+ /// <summary>
+ /// The strikethrough position value of the font face in font design units.
+ /// Strikethrough position is the position of strikethrough relative to the English baseline.
+ /// The value is usually made positive in order to place the strikethrough above the baseline.
+ /// </summary>
+ INT16 strikethroughPosition;
+
+ /// <summary>
+ /// The suggested strikethrough thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 strikethroughThickness;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.
+/// The units depend on how the metrics are obtained.
+/// </summary>
+struct DWRITE_GLYPH_METRICS
+{
+ /// <summary>
+ /// Specifies the X offset from the glyph origin to the left edge of the black box.
+ /// The glyph origin is the current horizontal writing position.
+ /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').
+ /// </summary>
+ INT32 leftSideBearing;
+
+ /// <summary>
+ /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.
+ /// </summary>
+ UINT32 advanceWidth;
+
+ /// <summary>
+ /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.
+ /// The value is negative when the right edge of the black box overhangs the layout box.
+ /// </summary>
+ INT32 rightSideBearing;
+
+ /// <summary>
+ /// Specifies the vertical offset from the vertical origin to the top of the black box.
+ /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.
+ /// </summary>
+ INT32 topSideBearing;
+
+ /// <summary>
+ /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.
+ /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.
+ /// Its Y coordinate is specified by verticalOriginY value,
+ /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).
+ /// </summary>
+ UINT32 advanceHeight;
+
+ /// <summary>
+ /// Specifies the vertical distance from the black box's bottom edge to the advance height.
+ /// Positive when the bottom edge of the black box is within the layout box.
+ /// Negative when the bottom edge of black box overhangs the layout box.
+ /// </summary>
+ INT32 bottomSideBearing;
+
+ /// <summary>
+ /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.
+ /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing
+ /// and the top (i.e. yMax) of the glyph's bounding box.
+ /// </summary>
+ INT32 verticalOriginY;
+};
+
+/// <summary>
+/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting
+/// the pen position. Offsets are in logical, pre-transform units.
+/// </summary>
+struct DWRITE_GLYPH_OFFSET
+{
+ /// <summary>
+ /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right
+ /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.
+ /// </summary>
+ FLOAT advanceOffset;
+
+ /// <summary>
+ /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves
+ /// the glyph up (in pre-transform coordinates).
+ /// </summary>
+ FLOAT ascenderOffset;
+};
+
+/// <summary>
+/// Specifies the type of DirectWrite factory object.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </summary>
+enum DWRITE_FACTORY_TYPE
+{
+ /// <summary>
+ /// Shared factory allow for re-use of cached font data across multiple in process components.
+ /// Such factories also take advantage of cross process font caching components for better performance.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_SHARED,
+
+ /// <summary>
+ /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_ISOLATED
+};
+
+// Creates an OpenType tag as a 32bit integer such that
+// the first character in the tag is the lowest byte,
+// (least significant on little endian architectures)
+// which can be used to compare with tags in the font file.
+// This macro is compatible with DWRITE_FONT_FEATURE_TAG.
+//
+// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')
+// Dword: 0x706D6363
+//
+#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
+ (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
+ (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
+ (static_cast<UINT32>(static_cast<UINT8>(b)) << 8) | \
+ static_cast<UINT32>(static_cast<UINT8>(a)))
+
+interface IDWriteFontFileStream;
+
+/// <summary>
+/// Font file loader interface handles loading font file resources of a particular type from a key.
+/// The font file loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file stream object that encapsulates an open file resource.
+ /// The resource is closed when the last reference to fontFileStream is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateStreamFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out IDWriteFontFileStream** fontFileStream
+ ) PURE;
+};
+
+/// <summary>
+/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files
+/// and exposes local font file information from the font file reference key.
+/// Font file references created using CreateFontFileReference use this font file loader.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
+{
+ /// <summary>
+ /// Obtains the length of the absolute file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathLengthFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out UINT32* filePathLength
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the absolute font file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePath">Character array that receives the local file path.</param>
+ /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out_ecount_z(filePathSize) WCHAR* filePath,
+ UINT32 filePathSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last write time of the file from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="lastWriteTime">Last modified time of the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLastWriteTimeFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out FILETIME* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface for loading font file data.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown
+{
+ /// <summary>
+ /// Reads a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>
+ /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>
+ /// <param name="fragmentSize">Size of the fragment in bytes.</param>
+ /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment
+ /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.
+ /// </remarks>
+ STDMETHOD(ReadFileFragment)(
+ __deref_out_bcount(fragmentSize) void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ __out void** fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Releases a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>
+ STDMETHOD_(void, ReleaseFileFragment)(
+ void* fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the total size of a file.
+ /// </summary>
+ /// <param name="fileSize">Receives the total size of the file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Implementing GetFileSize() for asynchronously loaded font files may require
+ /// downloading the complete file contents, therefore this method should only be used for operations that
+ /// either require complete font file to be loaded (e.g., copying a font file) or need to make
+ /// decisions based on the value of the file size (e.g., validation against a persisted file size).
+ /// </remarks>
+ STDMETHOD(GetFileSize)(
+ __out UINT64* fileSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms
+ /// to determine whether one font resource is more up to date than another one.
+ /// </summary>
+ /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents
+ /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>
+ /// <returns>
+ /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of
+ /// GetLastWriteTime should return E_NOTIMPL.
+ /// </returns>
+ STDMETHOD(GetLastWriteTime)(
+ __out UINT64* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface that represents a reference to a font file.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown
+{
+ /// <summary>
+ /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Pointer to the font file reference key.
+ /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetReferenceKey)(
+ __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,
+ __out UINT32* fontFileReferenceKeySize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the file loader associated with a font file object.
+ /// </summary>
+ /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLoader)(
+ __out IDWriteFontFileLoader** fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.
+ /// </summary>
+ /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>
+ /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,
+ /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>
+ /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.
+ /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from
+ /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>
+ /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code if there was a processing error during analysis.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: certain font file types are recognized, but not supported by the font system.
+ /// For example, the font system will recognize a file as a Type 1 font file,
+ /// but will not be able to construct a font face object from it. In such situations, Analyze will set
+ /// isSupportedFontType output parameter to FALSE.
+ /// </remarks>
+ STDMETHOD(Analyze)(
+ __out BOOL* isSupportedFontType,
+ __out DWRITE_FONT_FILE_TYPE* fontFileType,
+ __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,
+ __out UINT32* numberOfFaces
+ ) PURE;
+};
+
+/// <summary>
+/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,
+/// green, and blue color components) that is assumed for purposes of rendering text.
+/// </summary>
+#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED
+enum DWRITE_PIXEL_GEOMETRY
+{
+ /// <summary>
+ /// The red, green, and blue color components of each pixel are assumed to occupy the same point.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_FLAT,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and
+ /// blue on the right. This is the most common pixel geometry for LCD monitors.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_RGB,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and
+ /// red on the right.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_BGR
+};
+#define DWRITE_PIXEL_GEOMETRY_DEFINED
+#endif
+
+/// <summary>
+/// Represents a method of rendering glyphs.
+/// </summary>
+enum DWRITE_RENDERING_MODE
+{
+ /// <summary>
+ /// Specifies that the rendering mode is determined automatically based on the font and size.
+ /// </summary>
+ DWRITE_RENDERING_MODE_DEFAULT,
+
+ /// <summary>
+ /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground
+ /// color of the text or retains the color of the background.
+ /// </summary>
+ DWRITE_RENDERING_MODE_ALIASED,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only
+ /// be positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than
+ /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is
+ /// typically used with small to medium font sizes (up to 16 ppem).
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions.
+ /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at
+ /// the expense of some softness.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,
+
+ /// <summary>
+ /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is
+ /// typically used at very large sizes.
+ /// </summary>
+ DWRITE_RENDERING_MODE_OUTLINE
+};
+
+/// <summary>
+/// The DWRITE_MATRIX structure specifies the graphics transform to be applied
+/// to rendered glyphs.
+/// </summary>
+struct DWRITE_MATRIX
+{
+ /// <summary>
+ /// Horizontal scaling / cosine of rotation
+ /// </summary>
+ FLOAT m11;
+
+ /// <summary>
+ /// Vertical shear / sine of rotation
+ /// </summary>
+ FLOAT m12;
+
+ /// <summary>
+ /// Horizontal shear / negative sine of rotation
+ /// </summary>
+ FLOAT m21;
+
+ /// <summary>
+ /// Vertical scaling / cosine of rotation
+ /// </summary>
+ FLOAT m22;
+
+ /// <summary>
+ /// Horizontal shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dx;
+
+ /// <summary>
+ /// Vertical shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dy;
+};
+
+/// <summary>
+/// The interface that represents text rendering settings for glyph rasterization and filtering.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown
+{
+ /// <summary>
+ /// Gets the gamma value used for gamma correction. Valid values must be
+ /// greater than zero and cannot exceed 256.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetGamma)() PURE;
+
+ /// <summary>
+ /// Gets the amount of contrast enhancement. Valid values are greater than
+ /// or equal to zero.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;
+
+ /// <summary>
+ /// Gets the ClearType level. Valid values range from 0.0f (no ClearType)
+ /// to 1.0f (full ClearType).
+ /// </summary>
+ STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;
+
+ /// <summary>
+ /// Gets the pixel geometry.
+ /// </summary>
+ STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;
+
+ /// <summary>
+ /// Gets the rendering mode.
+ /// </summary>
+ STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;
+};
+
+// Forward declarations of D2D types
+interface ID2D1SimplifiedGeometrySink;
+
+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
+
+/// <summary>
+/// The interface that represents an absolute reference to a font face.
+/// It contains font face type, appropriate file references and face identification data.
+/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown
+{
+ /// <summary>
+ /// Obtains the file format type of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;
+
+ /// <summary>
+ /// Obtains the font files representing a font face.
+ /// </summary>
+ /// <param name="numberOfFiles">The number of files representing the font face.</param>
+ /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.
+ /// This parameter can be NULL if the user is only interested in the number of files representing the font face.
+ /// This API increments reference count of the font file pointers returned according to COM conventions, and the client
+ /// should release them when finished.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFiles)(
+ __inout UINT32* numberOfFiles,
+ __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,
+ /// the return value is zero.
+ /// </summary>
+ STDMETHOD_(UINT32, GetIndex)() PURE;
+
+ /// <summary>
+ /// Obtains the algorithmic style simulation flags of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Determines whether the font is a symbol font.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the number of glyphs in the font face.
+ /// </summary>
+ STDMETHOD_(UINT16, GetGlyphCount)() PURE;
+
+ /// <summary>
+ /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.
+ /// </summary>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetDesignGlyphMetrics)(
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.
+ /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.
+ /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond
+ /// to how a Unicode string will map to glyph indices when rendering using a particular font face.
+ /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.
+ /// This call will always return the default variant.
+ /// </summary>
+ /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>
+ /// <param name="codePointCount">The number of elements in the codePoints array.</param>
+ /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphIndices)(
+ __in_ecount(codePointCount) UINT32 const* codePoints,
+ UINT32 codePointCount,
+ __out_ecount(codePointCount) UINT16* glyphIndices
+ ) PURE;
+
+ /// <summary>
+ /// Finds the specified OpenType font table if it exists and returns a pointer to it.
+ /// The function accesses the underling font data via the IDWriteFontStream interface
+ /// implemented by the font file loader.
+ /// </summary>
+ /// <param name="openTypeTableTag">Four character tag of table to find.
+ /// Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.
+ /// Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>
+ /// <param name="tableData">
+ /// Pointer to base of table in memory.
+ /// The pointer is only valid so long as the FontFace used to get the font table still exists
+ /// (not any other FontFace, even if it actually refers to the same physical font).
+ /// </param>
+ /// <param name="tableSize">Byte size of table.</param>
+ /// <param name="tableContext">
+ /// Opaque context which must be freed by calling ReleaseFontTable.
+ /// The context actually comes from the lower level IDWriteFontFileStream,
+ /// which may be implemented by the application or DWrite itself.
+ /// It is possible for a NULL tableContext to be returned, especially if
+ /// the implementation directly memory maps the whole file.
+ /// Nevertheless, always release it later, and do not use it as a test for function success.
+ /// The same table can be queried multiple times,
+ /// but each returned context can be different, so release each separately.
+ /// </param>
+ /// <param name="exists">True if table exists.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.
+ /// The context does not need to be freed if the table was not found.
+ /// </returns>
+ /// <remarks>
+ /// The context for the same tag may be different for each call,
+ /// so each one must be held and released separately.
+ /// </remarks>
+ STDMETHOD(TryGetFontTable)(
+ __in UINT32 openTypeTableTag,
+ __deref_out_bcount(*tableSize) const void** tableData,
+ __out UINT32* tableSize,
+ __out void** tableContext,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Releases the table obtained earlier from TryGetFontTable.
+ /// </summary>
+ /// <param name="tableContext">Opaque context from TryGetFontTable.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD_(void, ReleaseFontTable)(
+ __in void* tableContext
+ ) PURE;
+
+ /// <summary>
+ /// Computes the outline of a run of glyphs by calling back to the outline sink interface.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="glyphIndices">Array of glyph indices.</param>
+ /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>
+ /// <param name="glyphOffsets">Optional array of glyph offsets.</param>
+ /// <param name="glyphCount">Number of glyphs.</param>
+ /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.
+ /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the
+ /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>
+ /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction
+ /// is left to right.</param>
+ /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphRunOutline)(
+ FLOAT emSize,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,
+ __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,
+ UINT32 glyphCount,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ IDWriteGeometrySink* geometrySink
+ ) PURE;
+
+ /// <summary>
+ /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.
+ /// Renderer implementations may choose different rendering modes for given measuring methods, but
+ /// best results are seen when the corresponding modes match:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters
+ /// object overrides the rendering mode.</param>
+ /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetRecommendedRenderingMode)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ DWRITE_MEASURING_MODE measuringMode,
+ IDWriteRenderingParams* renderingParams,
+ __out DWRITE_RENDERING_MODE* renderingMode
+ ) PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD(GetGdiCompatibleMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+
+ /// <summary>
+ /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.
+ /// Glyphs metrics are used for positioning of individual glyphs.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+};
+
+interface IDWriteFactory;
+interface IDWriteFontFileEnumerator;
+
+/// <summary>
+/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.
+/// The font collection loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file enumerator object that encapsulates a collection of font files.
+ /// The font system calls back to this interface to create a font collection.
+ /// </summary>
+ /// <param name="factory">Factory associated with the loader.</param>
+ /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within
+ /// the scope of the font collection loader being used.</param>
+ /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>
+ /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEnumeratorFromKey)(
+ IDWriteFactory* factory,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontFileEnumerator** fontFileEnumerator
+ ) PURE;
+};
+
+/// <summary>
+/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface
+/// to enumerate font files when building a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown
+{
+ /// <summary>
+ /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned
+ /// before the first element of the collection and the first call to MoveNext advances to the first file.
+ /// </summary>
+ /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if
+ /// the enumerator advanced past the last file in the collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(MoveNext)(
+ __out BOOL* hasCurrentFile
+ ) PURE;
+
+ /// <summary>
+ /// Gets a reference to the current font file.
+ /// </summary>
+ /// <param name="fontFile">Pointer to the newly created font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentFontFile)(
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+};
+
+/// <summary>
+/// Represents a collection of strings indexed by locale name.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of language/string pairs.
+ /// </summary>
+ STDMETHOD_(UINT32, GetCount)() PURE;
+
+ /// <summary>
+ /// Gets the index of the item with the specified locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name to look for.</param>
+ /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>
+ /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK,
+ /// but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindLocaleName)(
+ __in_z WCHAR const* localeName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the locale name with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="localeName">Character array that receives the locale name.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* localeName,
+ UINT32 size
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the string with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStringLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the string with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="stringBuffer">Character array that receives the string.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetString)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* stringBuffer,
+ UINT32 size
+ ) PURE;
+};
+
+interface IDWriteFontFamily;
+interface IDWriteFont;
+
+/// <summary>
+/// The IDWriteFontCollection encapsulates a collection of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of font families in the collection.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;
+
+ /// <summary>
+ /// Creates a font family object given a zero-based font family index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font family.</param>
+ /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ UINT32 index,
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Finds the font family with the specified family name.
+ /// </summary>
+ /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>
+ /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>
+ /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindFamilyName)(
+ __in_z WCHAR const* familyName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong
+ /// to the font collection.
+ /// </summary>
+ /// <param name="fontFace">Font face object that specifies the physical font.</param>
+ /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.
+ /// </returns>
+ STDMETHOD(GetFontFromFontFace)(
+ IDWriteFontFace* fontFace,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontList interface represents a list of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown
+{
+ /// <summary>
+ /// Gets the font collection that contains the fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the font collection object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of fonts in the font list.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontCount)() PURE;
+
+ /// <summary>
+ /// Gets a font given its zero-based index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font in the font list.</param>
+ /// <param name="font">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFont)(
+ UINT32 index,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated
+/// by weight, stretch, and style.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList
+{
+ /// <summary>
+ /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFamilyNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font that best matches the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFirstMatchingFont)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFont** matchingFont
+ ) PURE;
+
+ /// <summary>
+ /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMatchingFonts)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFontList** matchingFonts
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFont interface represents a physical font in a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown
+{
+ /// <summary>
+ /// Gets the font family to which the specified font belongs.
+ /// </summary>
+ /// <param name="fontFamily">Receives a pointer to the font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Gets the weight of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;
+
+ /// <summary>
+ /// Gets the stretch (aka. width) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;
+
+ /// <summary>
+ /// Gets the style (aka. slope) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;
+
+ /// <summary>
+ /// Returns TRUE if the font is a symbol font or FALSE if not.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFaceNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.
+ /// </summary>
+ /// <param name="informationalStringID">Identifies the string to get.</param>
+ /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>
+ /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but
+ /// informationalStrings receives a NULL pointer and exists receives the value FALSE.
+ /// </returns>
+ STDMETHOD(GetInformationalStrings)(
+ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
+ __out IDWriteLocalizedStrings** informationalStrings,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets a value that indicates what simulation are applied to the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Gets the metrics for the font.
+ /// </summary>
+ /// <param name="fontMetrics">Receives the font metrics.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Determines whether the font supports the specified character.
+ /// </summary>
+ /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>
+ /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HasCharacter)(
+ UINT32 unicodeValue,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object for the font.
+ /// </summary>
+ /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+};
+
+/// <summary>
+/// Direction for how reading progresses.
+/// </summary>
+enum DWRITE_READING_DIRECTION
+{
+ /// <summary>
+ /// Reading progresses from left to right.
+ /// </summary>
+ DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
+
+ /// <summary>
+ /// Reading progresses from right to left.
+ /// </summary>
+ DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
+};
+
+/// <summary>
+/// Direction for how lines of text are placed relative to one another.
+/// </summary>
+enum DWRITE_FLOW_DIRECTION
+{
+ /// <summary>
+ /// Text lines are placed from top to bottom.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
+};
+
+/// <summary>
+/// Alignment of paragraph text along the reading direction axis relative to
+/// the leading and trailing edge of the layout box.
+/// </summary>
+enum DWRITE_TEXT_ALIGNMENT
+{
+ /// <summary>
+ /// The leading edge of the paragraph text is aligned to the layout box's leading edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_LEADING,
+
+ /// <summary>
+ /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_TRAILING,
+
+ /// <summary>
+ /// The center of the paragraph text is aligned to the center of the layout box.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Alignment of paragraph text along the flow direction axis relative to the
+/// flow's beginning and ending edge of the layout box.
+/// </summary>
+enum DWRITE_PARAGRAPH_ALIGNMENT
+{
+ /// <summary>
+ /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
+
+ /// <summary>
+ /// The last line of paragraph is aligned to the flow's ending edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_FAR,
+
+ /// <summary>
+ /// The center of the paragraph is aligned to the center of the flow of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Word wrapping in multiline paragraph.
+/// </summary>
+enum DWRITE_WORD_WRAPPING
+{
+ /// <summary>
+ /// Words are broken across lines to avoid text overflowing the layout box.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_WRAP,
+
+ /// <summary>
+ /// Words are kept within the same line even when it overflows the layout box.
+ /// This option is often used with scrolling to reveal overflow text.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_NO_WRAP
+};
+
+/// <summary>
+/// The method used for line spacing in layout.
+/// </summary>
+enum DWRITE_LINE_SPACING_METHOD
+{
+ /// <summary>
+ /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_DEFAULT,
+
+ /// <summary>
+ /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.
+ /// This can be useful to avoid the uneven appearance that can occur from font fallback.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_UNIFORM
+};
+
+/// <summary>
+/// Text granularity used to trim text overflowing the layout box.
+/// </summary>
+enum DWRITE_TRIMMING_GRANULARITY
+{
+ /// <summary>
+ /// No trimming occurs. Text flows beyond the layout width.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_NONE,
+
+ /// <summary>
+ /// Trimming occurs at character cluster boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_CHARACTER,
+
+ /// <summary>
+ /// Trimming occurs at word boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_WORD
+};
+
+/// <summary>
+/// Typographic feature of text supplied by the font.
+/// </summary>
+enum DWRITE_FONT_FEATURE_TAG
+{
+ DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'
+ DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'
+ DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'
+ DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'
+ DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'
+ DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'
+ DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'
+ DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'
+ DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'
+ DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'
+ DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'
+ DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'
+ DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'
+ DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'
+ DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'
+ DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'
+ DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'
+ DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'
+ DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'
+ DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'
+ DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'
+ DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'
+ DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'
+ DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'
+ DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'
+ DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'
+ DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'
+ DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'
+ DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'
+ DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'
+ DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'
+ DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'
+ DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'
+ DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'
+ DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'
+ DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'
+ DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'
+ DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'
+ DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'
+ DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'
+ DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'
+ DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'
+};
+
+/// <summary>
+/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.
+/// </summary>
+struct DWRITE_TEXT_RANGE
+{
+ /// <summary>
+ /// The start text position of the range.
+ /// </summary>
+ UINT32 startPosition;
+
+ /// <summary>
+ /// The number of text positions in the range.
+ /// </summary>
+ UINT32 length;
+};
+
+/// <summary>
+/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.
+/// </summary>
+struct DWRITE_FONT_FEATURE
+{
+ /// <summary>
+ /// The feature OpenType name identifier.
+ /// </summary>
+ DWRITE_FONT_FEATURE_TAG nameTag;
+
+ /// <summary>
+ /// Execution parameter of the feature.
+ /// </summary>
+ /// <remarks>
+ /// The parameter should be non-zero to enable the feature. Once enabled, a feature can't be disabled again within
+ /// the same range. Features requiring a selector use this value to indicate the selector index.
+ /// </remarks>
+ UINT32 parameter;
+};
+
+/// <summary>
+/// Defines a set of typographic features to be applied during shaping.
+/// Notice the character range which this feature list spans is specified
+/// as a separate parameter to GetGlyphs.
+/// </summary>
+struct DWRITE_TYPOGRAPHIC_FEATURES
+{
+ /// <summary>
+ /// Array of font features.
+ /// </summary>
+ __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;
+
+ /// <summary>
+ /// The number of features.
+ /// </summary>
+ UINT32 featureCount;
+};
+
+/// <summary>
+/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.
+/// </summary>
+struct DWRITE_TRIMMING
+{
+ /// <summary>
+ /// Text granularity of which trimming applies.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY granularity;
+
+ /// <summary>
+ /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,
+ /// most useful for path ellipsis, where the delimeter would be a slash.
+ /// </summary>
+ UINT32 delimiter;
+
+ /// <summary>
+ /// How many occurences of the delimiter to step back.
+ /// </summary>
+ UINT32 delimiterCount;
+};
+
+
+interface IDWriteTypography;
+interface IDWriteInlineObject;
+
+/// <summary>
+/// The format of text used for text layout purpose.
+/// </summary>
+/// <remarks>
+/// This object may not be thread-safe and it may carry the state of text format change.
+/// </remarks>
+interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown
+{
+ /// <summary>
+ /// Set alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ /// <param name="textAlignment">Text alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTextAlignment)(
+ DWRITE_TEXT_ALIGNMENT textAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ /// <param name="paragraphAlignment">Paragraph alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetParagraphAlignment)(
+ DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set word wrapping option.
+ /// </summary>
+ /// <param name="wordWrapping">Word wrapping option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetWordWrapping)(
+ DWRITE_WORD_WRAPPING wordWrapping
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph reading direction.
+ /// </summary>
+ /// <param name="readingDirection">Text reading direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetReadingDirection)(
+ DWRITE_READING_DIRECTION readingDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph flow direction.
+ /// </summary>
+ /// <param name="flowDirection">Paragraph flow direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFlowDirection)(
+ DWRITE_FLOW_DIRECTION flowDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set incremental tab stop position.
+ /// </summary>
+ /// <param name="incrementalTabStop">The incremental tab stop value</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetIncrementalTabStop)(
+ FLOAT incrementalTabStop
+ ) PURE;
+
+ /// <summary>
+ /// Set trimming options for any trailing text exceeding the layout width
+ /// or for any far text exceeding the layout height.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>
+ /// <remarks>
+ /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign
+ /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding
+ /// partial lines.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTrimming)(
+ __in DWRITE_TRIMMING const* trimmingOptions,
+ IDWriteInlineObject* trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Set line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How to determine line height.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>
+ /// <remarks>
+ /// For the default method, spacing depends solely on the content.
+ /// For uniform spacing, the given line height will override the content.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLineSpacing)(
+ DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
+ FLOAT lineSpacing,
+ FLOAT baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;
+
+ /// <summary>
+ /// Get alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;
+
+ /// <summary>
+ /// Get word wrapping option.
+ /// </summary>
+ STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get paragraph flow direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;
+
+ /// <summary>
+ /// Get incremental tab stop position.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;
+
+ /// <summary>
+ /// Get trimming options for text overflowing the layout width.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTrimming)(
+ __out DWRITE_TRIMMING* trimmingOptions,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Get line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How line height is determined.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLineSpacing)(
+ __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
+ __out FLOAT* lineSpacing,
+ __out FLOAT* baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The current font collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;
+
+ /// <summary>
+ /// Get the font style.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;
+
+ /// <summary>
+ /// Get the font stretch.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;
+
+ /// <summary>
+ /// Get the font em height.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetFontSize)() PURE;
+
+ /// <summary>
+ /// Get the length of the locale name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the locale name.
+ /// </summary>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize
+ ) PURE;
+};
+
+
+/// <summary>
+/// Font typography setting.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown
+{
+ /// <summary>
+ /// Add font feature.
+ /// </summary>
+ /// <param name="fontFeature">The font feature to add.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AddFontFeature)(
+ DWRITE_FONT_FEATURE fontFeature
+ ) PURE;
+
+ /// <summary>
+ /// Get the number of font features.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;
+
+ /// <summary>
+ /// Get the font feature at the specified index.
+ /// </summary>
+ /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>
+ /// <param name="fontFeature">The font feature.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFeature)(
+ UINT32 fontFeatureIndex,
+ __out DWRITE_FONT_FEATURE* fontFeature
+ ) PURE;
+};
+
+enum DWRITE_SCRIPT_SHAPES
+{
+ /// <summary>
+ /// No additional shaping requirement. Text is shaped with the writing system default behavior.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
+
+ /// <summary>
+ /// Text should leave no visual on display i.e. control or format control characters.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
+#endif
+
+/// <summary>
+/// Association of text and its writing system script as well as some display attributes.
+/// </summary>
+struct DWRITE_SCRIPT_ANALYSIS
+{
+ /// <summary>
+ /// Zero-based index representation of writing system script.
+ /// </summary>
+ UINT16 script;
+
+ /// <summary>
+ /// Additional shaping requirement of text.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES shapes;
+};
+
+/// <summary>
+/// Condition at the edges of inline object or text used to determine
+/// line-breaking behavior.
+/// </summary>
+enum DWRITE_BREAK_CONDITION
+{
+ /// <summary>
+ /// Whether a break is allowed is determined by the condition of the
+ /// neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_NEUTRAL,
+
+ /// <summary>
+ /// A break is allowed, unless overruled by the condition of the
+ /// neighboring text span or inline object, either prohibited by a
+ /// May Not or forced by a Must.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_CAN_BREAK,
+
+ /// <summary>
+ /// There should be no break, unless overruled by a Must condition from
+ /// the neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
+
+ /// <summary>
+ /// The break must happen, regardless of the condition of the adjacent
+ /// text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MUST_BREAK
+};
+
+/// <summary>
+/// Line breakpoint characteristics of a character.
+/// </summary>
+struct DWRITE_LINE_BREAKPOINT
+{
+ /// <summary>
+ /// Breaking condition before the character.
+ /// </summary>
+ UINT8 breakConditionBefore : 2;
+
+ /// <summary>
+ /// Breaking condition after the character.
+ /// </summary>
+ UINT8 breakConditionAfter : 2;
+
+ /// <summary>
+ /// The character is some form of whitespace, which may be meaningful
+ /// for justification.
+ /// </summary>
+ UINT8 isWhitespace : 1;
+
+ /// <summary>
+ /// The character is a soft hyphen, often used to indicate hyphenation
+ /// points inside words.
+ /// </summary>
+ UINT8 isSoftHyphen : 1;
+
+ UINT8 padding : 2;
+};
+
+/// <summary>
+/// How to apply number substitution on digits and related punctuation.
+/// </summary>
+enum DWRITE_NUMBER_SUBSTITUTION_METHOD
+{
+ /// <summary>
+ /// Specifies that the substitution method should be determined based
+ /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
+
+ /// <summary>
+ /// If the culture is Arabic or Farsi, specifies that the number shape
+ /// depend on the context. Either traditional or nominal number shape
+ /// are used depending on the nearest preceding strong character or (if
+ /// there is none) the reading direction of the paragraph.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
+
+ /// <summary>
+ /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral
+ /// shapes (ones of the European number), i.e., no substitution is performed.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
+
+ /// <summary>
+ /// Specifies that number are rendered using the national number shape
+ /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
+
+ /// <summary>
+ /// Specifies that number are rendered using the traditional shape
+ /// for the specified culture. For most cultures, this is the same as
+ /// NativeNational. However, NativeNational results in Latin number
+ /// for some Arabic cultures, whereas this value results in Arabic
+ /// number for all Arabic cultures.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
+};
+
+/// <summary>
+/// Holds the appropriate digits and numeric punctuation for a given locale.
+/// </summary>
+interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown
+{
+};
+
+/// <summary>
+/// Shaping output properties per input character.
+/// </summary>
+struct DWRITE_SHAPING_TEXT_PROPERTIES
+{
+ /// <summary>
+ /// This character can be shaped independently from the others
+ /// (usually set for the space character).
+ /// </summary>
+ UINT16 isShapedAlone : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 15;
+};
+
+/// <summary>
+/// Shaping output properties per output glyph.
+/// </summary>
+struct DWRITE_SHAPING_GLYPH_PROPERTIES
+{
+ /// <summary>
+ /// Justification class, whether to use spacing, kashidas, or
+ /// another method. This exists for backwards compatibility
+ /// with Uniscribe's SCRIPT_JUSTIFY enum.
+ /// </summary>
+ UINT16 justification : 4;
+
+ /// <summary>
+ /// Indicates glyph is the first of a cluster.
+ /// </summary>
+ UINT16 isClusterStart : 1;
+
+ /// <summary>
+ /// Glyph is a diacritic.
+ /// </summary>
+ UINT16 isDiacritic : 1;
+
+ /// <summary>
+ /// Glyph has no width, blank, ZWJ, ZWNJ etc.
+ /// </summary>
+ UINT16 isZeroWidthSpace : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 9;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to provide text to
+/// the analyzer. It allows the separation between the logical view of text as
+/// a continuous stream of characters identifiable by unique text positions,
+/// and the actual memory layout of potentially discrete blocks of text in the
+/// client's backing store.
+///
+/// If any of these callbacks returns an error, the analysis functions will
+/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,
+/// an application should stub the method and return a constant/null and S_OK.
+/// </summary>
+interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown
+{
+ /// <summary>
+ /// Get a block of text starting at the specified text position.
+ /// Returning NULL indicates the end of text - the position is after
+ /// the last character. This function is called iteratively for
+ /// each consecutive block, tying together several fragmented blocks
+ /// in the backing store into a virtual contiguous string.
+ /// </summary>
+ /// <param name="textPosition">First position of the piece to obtain. All
+ /// positions are in UTF16 code-units, not whole characters, which
+ /// matters when supplementary characters are used.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved chunk.
+ /// The returned length is not the length of the block, but the length
+ /// remaining in the block, from the given position until its end.
+ /// So querying for a position that is 75 positions into a 100
+ /// postition block would return 25.</param>
+ /// <returns>Pointer to the first character at the given text position.
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition >= the entire text content length or because the
+ /// queried position is not mapped into the app's backing store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextAtPosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get a block of text immediately preceding the specified position.
+ /// </summary>
+ /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved block.
+ /// The length returned is from the given position to the front of
+ /// the block.</param>
+ /// <returns>Pointer to the first character at (textPosition - textLength).
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition == 0,the textPosition > the entire text content
+ /// length, or the queried position is not mapped into the app's backing
+ /// store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextBeforePosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get locale name on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the locale name of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing locale.</param>
+ /// <param name="localeName">Address that receives a pointer to the locale
+ /// at the specified position.</param>
+ /// <remarks>
+ /// The localeName pointer must remain valid until the next call or until
+ /// the analysis returns.
+ /// </remarks>
+ STDMETHOD(GetLocaleName)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out_z WCHAR const** localeName
+ ) PURE;
+
+ /// <summary>
+ /// Get number substitution on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the number substitution of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing number substitution.</param>
+ /// <param name="numberSubstitution">Address that receives a pointer to the number substitution
+ /// at the specified position.</param>
+ /// <remarks>
+ /// Any implementation should return the number substitution with an
+ /// incremented ref count, and the analysis will release when finished
+ /// with it (either before the next call or before it returns). However,
+ /// the sink callback may hold onto it after that.
+ /// </remarks>
+ STDMETHOD(GetNumberSubstitution)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to receive the
+/// output of a given text analysis. The Text analyzer disregards any current
+/// state of the analysis sink, therefore a Set method call on a range
+/// overwrites the previously set analysis result of the same range.
+/// </summary>
+interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown
+{
+ /// <summary>
+ /// Report script analysis for the text range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="scriptAnalysis">Script analysis of characters in range.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetScriptAnalysis)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis
+ ) PURE;
+
+ /// <summary>
+ /// Repport line-break opportunities for each character, starting from
+ /// the specified position.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="lineBreakpoints">Breaking conditions for each character.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetLineBreakpoints)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints
+ ) PURE;
+
+ /// <summary>
+ /// Set bidirectional level on the range, called once per each
+ /// level run change (either explicit or resolved implicit).
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="explicitLevel">Explicit level from embedded control codes
+ /// RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>
+ /// <param name="resolvedLevel">Final implicit level considering the
+ /// explicit level and characters' natural directionality, after all
+ /// Bidi rules have been applied.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetBidiLevel)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ UINT8 explicitLevel,
+ UINT8 resolvedLevel
+ ) PURE;
+
+ /// <summary>
+ /// Set number substitution on the range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="numberSubstitution">The number substitution applicable to
+ /// the returned range of text. The sink callback may hold onto it by
+ /// incrementing its ref count.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ /// <remark>
+ /// Unlike script and bidi analysis, where every character passed to the
+ /// analyzer has a result, this will only be called for those ranges where
+ /// substitution is applicable. For any other range, you will simply not
+ /// be called.
+ /// </remark>
+ STDMETHOD(SetNumberSubstitution)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __notnull IDWriteNumberSubstitution* numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// Analyzes various text properties for complex script processing.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown
+{
+ /// <summary>
+ /// Analyzes a text range for script boundaries, reading text attributes
+ /// from the source and reporting the Unicode script ID to the sink
+ /// callback SetScript.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AnalyzeScript)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for script directionality, reading attributes
+ /// from the source and reporting levels to the sink callback SetBidiLevel.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs. Otherwise the
+ /// returned levels may be wrong, since the Bidi algorithm is meant to
+ /// apply to the paragraph as a whole.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeBidi)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for spans where number substitution is applicable,
+ /// reading attributes from the source and reporting substitutable ranges
+ /// to the sink callback SetNumberSubstitution.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple ranges of differing number
+ /// substitutions, the text ranges should not arbitrarily split the
+ /// middle of numbers. Otherwise it will treat the numbers separately
+ /// and will not translate any intervening punctuation.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeNumberSubstitution)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for potential breakpoint opportunities, reading
+ /// attributes from the source and reporting breakpoint opportunities to
+ /// the sink callback SetLineBreakpoints.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs, unless the
+ /// given text span is considered a whole unit. Otherwise the
+ /// returned properties for the first and last characters will
+ /// inappropriately allow breaks.
+ /// </remarks>
+ /// <remarks>
+ /// Special cases include the first, last, and surrogate characters. Any
+ /// text span is treated as if adjacent to inline objects on either side.
+ /// So the rules with contingent-break opportunities are used, where the
+ /// edge between text and inline objects is always treated as a potential
+ /// break opportunity, dependent on any overriding rules of the adjacent
+ /// objects to prohibit or force the break (see Unicode TR #14).
+ /// Surrogate pairs never break between.
+ /// </remarks>
+ STDMETHOD(AnalyzeLineBreakpoints)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Parses the input text string and maps it to the set of glyphs and associated glyph data
+ /// according to the font and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The string to convert to glyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="fontFace">The font face to get glyphs from.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="numberSubstitution">Optional number substitution which
+ /// selects the appropriate glyphs for digits and related numeric characters,
+ /// depending on the results obtained from AnalyzeNumberSubstitution. Passing
+ /// null indicates that no substitution is needed and that the digits should
+ /// receive nominal glyphs.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="maxGlyphCount">The maximum number of glyphs that can be
+ /// returned.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges.</param>
+ /// <param name="textProps">Per-character output properties.</param>
+ /// <param name="glyphIndices">Output glyph indices.</param>
+ /// <param name="glyphProps">Per-glyph output properties.</param>
+ /// <param name="actualGlyphCount">The actual number of glyphs returned if
+ /// the call succeeds.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Note that the mapping from characters to glyphs is, in general, many-
+ /// to-many. The recommended estimate for the per-glyph output buffers is
+ /// (3 * textLength / 2 + 16). This is not guaranteed to be sufficient.
+ ///
+ /// The value of the actualGlyphCount parameter is only valid if the call
+ /// succeeds. In the event that maxGlyphCount is not big enough
+ /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// will be returned. The application should allocate a larger buffer and try again.
+ /// </remarks>
+ STDMETHOD(GetGlyphs)(
+ __in_ecount(textLength) WCHAR const* textString,
+ UINT32 textLength,
+ IDWriteFontFace* fontFace,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __maybenull IDWriteNumberSubstitution* numberSubstitution,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ UINT32 maxGlyphCount,
+ __out_ecount(textLength) UINT16* clusterMap,
+ __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ __out_ecount(maxGlyphCount) UINT16* glyphIndices,
+ __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
+ __out UINT32* actualGlyphCount
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers
+/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_GLYPH_RUN
+{
+ /// <summary>
+ /// The physical font face to draw with.
+ /// </summary>
+ __notnull IDWriteFontFace* fontFace;
+
+ /// <summary>
+ /// Logical size of the font in DIPs, not points (equals 1/96 inch).
+ /// </summary>
+ FLOAT fontEmSize;
+
+ /// <summary>
+ /// The number of glyphs.
+ /// </summary>
+ UINT32 glyphCount;
+
+ /// <summary>
+ /// The indices to render.
+ /// </summary>
+ __field_ecount(glyphCount) UINT16 const* glyphIndices;
+
+ /// <summary>
+ /// Glyph advance widths.
+ /// </summary>
+ __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
+
+ /// <summary>
+ /// Glyph offsets.
+ /// </summary>
+ __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
+
+ /// <summary>
+ /// If true, specifies that glyphs are rotated 90 degrees to the left and
+ /// vertical metrics are used. Vertical writing is achieved by specifying
+ /// isSideways = true and rotating the entire run 90 degrees to the right
+ /// via a rotate transform.
+ /// </summary>
+ BOOL isSideways;
+
+ /// <summary>
+ /// The implicit resolved bidi level of the run. Odd levels indicate
+ /// right-to-left languages like Hebrew and Arabic, while even levels
+ /// indicate left-to-right languages like English and Japanese (when
+ /// written horizontally). For right-to-left languages, the text origin
+ /// is on the right, and text should be drawn to the left.
+ /// </summary>
+ UINT32 bidiLevel;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties
+/// related to those in DWRITE_GLYPH_RUN.
+/// </summary>
+struct DWRITE_GLYPH_RUN_DESCRIPTION
+{
+ /// <summary>
+ /// The locale name associated with this run.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The text associated with the glyphs.
+ /// </summary>
+ __field_ecount(stringLength) WCHAR const* string;
+
+ /// <summary>
+ /// The number of characters (UTF16 code-units).
+ /// Note that this may be different than the number of glyphs.
+ /// </summary>
+ UINT32 stringLength;
+
+ /// <summary>
+ /// An array of indices to the glyph indices array, of the first glyphs of
+ /// all the glyph clusters of the glyphs to render.
+ /// </summary>
+ __field_ecount(stringLength) UINT16 const* clusterMap;
+
+ /// <summary>
+ /// Corresponding text position in the original string
+ /// this glyph run came from.
+ /// </summary>
+ UINT32 textPosition;
+};
+
+/// <summary>
+/// The DWRITE_UNDERLINE structure contains about the size and placement of
+/// underlines. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_UNDERLINE
+{
+ /// <summary>
+ /// Width of the underline, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the underline, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the underline from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Height of the tallest run where the underline applies.
+ /// </summary>
+ FLOAT runHeight;
+
+ /// <summary>
+ /// Reading direction of the text associated with the underline. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the underline. This value
+ /// is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the text the underline is being drawn under. Can be
+ /// pertinent where the locale affects how the underline is drawn.
+ /// For example, in vertical text, the underline belongs on the
+ /// left for Chinese but on the right for Japanese.
+ /// This choice is completely left up to higher levels.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of
+/// strickthroughs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_STRIKETHROUGH
+{
+ /// <summary>
+ /// Width of the strikethrough, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the strikethrough, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the stikethrough from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Reading direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the range. Can be pertinent where the locale affects the style.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_LINE_METRICS structure contains information about a formatted
+/// line of text.
+/// </summary>
+struct DWRITE_LINE_METRICS
+{
+ /// <summary>
+ /// The number of total text positions in the line.
+ /// This includes any trailing whitespace and newline characters.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// The number of whitespace positions at the end of the line. Newline
+ /// sequences are considered whitespace.
+ /// </summary>
+ UINT32 trailingWhitespaceLength;
+
+ /// <summary>
+ /// The number of characters in the newline sequence at the end of the line.
+ /// If the count is zero, then the line was either wrapped or it is the
+ /// end of the text.
+ /// </summary>
+ UINT32 newlineLength;
+
+ /// <summary>
+ /// Height of the line as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the line to its baseline.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// The line is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+/// <summary>
+/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.
+/// </summary>
+struct DWRITE_CLUSTER_METRICS
+{
+ /// <summary>
+ /// The total advance width of all glyphs in the cluster.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The number of text positions in the cluster.
+ /// </summary>
+ UINT16 length;
+
+ /// <summary>
+ /// Indicate whether line can be broken right after the cluster.
+ /// </summary>
+ UINT16 canWrapLineAfter : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to whitespace character.
+ /// </summary>
+ UINT16 isWhitespace : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to a newline character.
+ /// </summary>
+ UINT16 isNewline : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to soft hyphen character.
+ /// </summary>
+ UINT16 isSoftHyphen : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster is read from right to left.
+ /// </summary>
+ UINT16 isRightToLeft : 1;
+
+ UINT16 padding : 11;
+};
+
+
+/// <summary>
+/// Overall metrics associated with text after layout.
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_TEXT_METRICS
+{
+ /// <summary>
+ /// Left-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The width of the formatted text ignoring trailing whitespace
+ /// at the end of each line.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The width of the formatted text taking into account the
+ /// trailing whitespace at the end of each line.
+ /// </summary>
+ FLOAT widthIncludingTrailingWhitespace;
+
+ /// <summary>
+ /// The height of the formatted text. The height of an empty string
+ /// is determined by the size of the default font's line height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Initial width given to the layout. Depending on whether the text
+ /// was wrapped or not, it can be either larger or smaller than the
+ /// text content width.
+ /// </summary>
+ FLOAT layoutWidth;
+
+ /// <summary>
+ /// Initial height given to the layout. Depending on the length of the
+ /// text, it may be larger or smaller than the text content height.
+ /// </summary>
+ FLOAT layoutHeight;
+
+ /// <summary>
+ /// The maximum reordering count of any line of text, used
+ /// to calculate the most number of hit-testing boxes needed.
+ /// If the layout has no bidirectional text or no text at all,
+ /// the minimum level is 1.
+ /// </summary>
+ UINT32 maxBidiReorderingDepth;
+
+ /// <summary>
+ /// Total number of lines.
+ /// </summary>
+ UINT32 lineCount;
+};
+
+
+/// <summary>
+/// Properties describing the geometric measurement of an
+/// application-defined inline object.
+/// </summary>
+struct DWRITE_INLINE_OBJECT_METRICS
+{
+ /// <summary>
+ /// Width of the inline object.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Height of the inline object as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.
+ /// If the baseline is at the bottom, baseline simply equals height.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// Flag indicating whether the object is to be placed upright or alongside the text baseline
+ /// for vertical text.
+ /// </summary>
+ BOOL supportsSideways;
+};
+
+
+/// <summary>
+/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels
+/// (in DIPs) overshoot each side of the layout or inline objects.
+/// </summary>
+/// <remarks>
+/// Positive overhangs indicate that the visible area extends outside the layout
+/// box or inline object, while negative values mean there is whitespace inside.
+/// The returned values are unaffected by rendering transforms or pixel snapping.
+/// Additionally, they may not exactly match final target's pixel bounds after
+/// applying grid fitting and hinting.
+/// </remarks>
+struct DWRITE_OVERHANG_METRICS
+{
+ /// <summary>
+ /// The distance from the left-most visible DIP to its left alignment edge.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// The distance from the top-most visible DIP to its top alignment edge.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The distance from the right-most visible DIP to its right alignment edge.
+ /// </summary>
+ FLOAT right;
+
+ /// <summary>
+ /// The distance from the bottom-most visible DIP to its bottom alignment edge.
+ /// </summary>
+ FLOAT bottom;
+};
+
+
+/// <summary>
+/// Geometry enclosing of text positions.
+/// </summary>
+struct DWRITE_HIT_TEST_METRICS
+{
+ /// <summary>
+ /// First text position within the geometry.
+ /// </summary>
+ UINT32 textPosition;
+
+ /// <summary>
+ /// Number of text positions within the geometry.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// Left position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// Geometry's width.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Geometry's height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Bidi level of text positions enclosed within the geometry.
+ /// </summary>
+ UINT32 bidiLevel;
+
+ /// <summary>
+ /// Geometry encloses text?
+ /// </summary>
+ BOOL isText;
+
+ /// <summary>
+ /// Range is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+interface IDWriteTextRenderer;
+
+
+/// <summary>
+/// The IDWriteInlineObject interface wraps an application defined inline graphic,
+/// allowing DWrite to query metrics as if it was a glyph inline with the text.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown
+{
+ /// <summary>
+ /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)
+ /// can use this to draw the inline object without needing to cast or query the object
+ /// type. The text layout does not call this method directly.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the measurement of the inline object.
+ /// </summary>
+ /// <param name="metrics">Returned metrics</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_INLINE_OBJECT_METRICS* metrics
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.
+ /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will
+ /// simply be zeroes.
+ /// </summary>
+ /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The overhangs should be returned relative to the reported size of the object
+ /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline
+ /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it
+ /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would
+ /// return a width/height of 60x60 and four overhangs of 20 DIPs.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Layout uses this to determine the line breaking behavior of the inline object
+ /// amidst the text.
+ /// </summary>
+ /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>
+ /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetBreakConditions)(
+ __out DWRITE_BREAK_CONDITION* breakConditionBefore,
+ __out DWRITE_BREAK_CONDITION* breakConditionAfter
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown
+{
+ /// <summary>
+ /// Determines whether pixel snapping is disabled. The recommended default is FALSE,
+ /// unless doing animation that requires subpixel vertical placement.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(IsPixelSnappingDisabled)(
+ __maybenull void* clientDrawingContext,
+ __out BOOL* isDisabled
+ ) PURE;
+
+ /// <summary>
+ /// Gets the current transform that maps abstract coordinates to DIPs,
+ /// which may disable pixel snapping upon any rotation or shear.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __maybenull void* clientDrawingContext,
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,
+ /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding
+ /// a value of 1 for 96 DPI and 1.25 for 120).
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetPixelsPerDip)(
+ __maybenull void* clientDrawingContext,
+ __out FLOAT* pixelsPerDip
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a set of application-defined
+/// callbacks that perform rendering of text, inline objects, and decorations
+/// such as underlines.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping
+{
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to
+ /// render a run of glyphs.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for given measuring methods,
+ /// but best results are seen when the rendering mode matches the corresponding measuring mode:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="glyphRun">The glyph run to draw.</param>
+ /// <param name="glyphRunDescription">Properties of the characters
+ /// associated with this run.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// an underline.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="underline">Underline logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single underline can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. If font sizes/styles change
+ /// within an underline, the thickness and offset will be averaged
+ /// weighted according to characters.
+ /// To get the correct top coordinate of the underline rect, add underline::offset
+ /// to the baseline's Y. Otherwise the underline will be immediately under the text.
+ /// The x coordinate will always be passed as the left side, regardless
+ /// of text directionality. This simplifies drawing and reduces the
+ /// problem of round-off that could potentially cause gaps or a double
+ /// stamped alpha blend. To avoid alpha overlap, round the end points
+ /// to the nearest device pixel.
+ /// </remarks>
+ STDMETHOD(DrawUnderline)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_UNDERLINE const* underline,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// a strikethrough.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="strikethrough">Strikethrough logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single strikethrough can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. Strikethrough is not averaged
+ /// across font sizes/styles changes.
+ /// To get the correct top coordinate of the strikethrough rect,
+ /// add strikethrough::offset to the baseline's Y.
+ /// Like underlines, the x coordinate will always be passed as the left side,
+ /// regardless of text directionality.
+ /// </remarks>
+ STDMETHOD(DrawStrikethrough)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_STRIKETHROUGH const* strikethrough,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this application callback when it needs to
+ /// draw an inline object.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The right-to-left flag is a hint for those cases where it would look
+ /// strange for the image to be shown normally (like an arrow pointing to
+ /// right to indicate a submenu).
+ /// </remarks>
+ STDMETHOD(DrawInlineObject)(
+ __maybenull void* clientDrawingContext,
+ FLOAT originX,
+ FLOAT originY,
+ IDWriteInlineObject* inlineObject,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a block of text after it has
+/// been fully analyzed and formatted.
+///
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat
+{
+ /// <summary>
+ /// Set layout maximum width
+ /// </summary>
+ /// <param name="maxWidth">Layout maximum width</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxWidth)(
+ FLOAT maxWidth
+ ) PURE;
+
+ /// <summary>
+ /// Set layout maximum height
+ /// </summary>
+ /// <param name="maxHeight">Layout maximum height</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxHeight)(
+ FLOAT maxHeight
+ ) PURE;
+
+ /// <summary>
+ /// Set the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The font collection to set</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontCollection)(
+ IDWriteFontCollection* fontCollection,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set null-terminated font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Font family name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontFamilyName)(
+ __in_z WCHAR const* fontFamilyName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font weight.
+ /// </summary>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontWeight)(
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font style.
+ /// </summary>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStyle)(
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font stretch.
+ /// </summary>
+ /// <param name="fontStretch">font stretch</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStretch)(
+ DWRITE_FONT_STRETCH fontStretch,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font em height.
+ /// </summary>
+ /// <param name="fontSize">Font em height</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontSize)(
+ FLOAT fontSize,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set underline.
+ /// </summary>
+ /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetUnderline)(
+ BOOL hasUnderline,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set strikethrough.
+ /// </summary>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetStrikethrough)(
+ BOOL hasStrikethrough,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set application-defined drawing effect.
+ /// </summary>
+ /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This drawing effect is associated with the specified range and will be passed back
+ /// to the application via the callback when the range is drawn at drawing time.
+ /// </remarks>
+ STDMETHOD(SetDrawingEffect)(
+ IUnknown* drawingEffect,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set inline object.
+ /// </summary>
+ /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This inline object applies to the specified range and will be passed back
+ /// to the application via the DrawInlineObject callback when the range is drawn.
+ /// Any text in that range will be suppressed.
+ /// </remarks>
+ STDMETHOD(SetInlineObject)(
+ IDWriteInlineObject* inlineObject,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font typography features.
+ /// </summary>
+ /// <param name="typography">Pointer to font typography setting.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTypography)(
+ IDWriteTypography* typography,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLocaleName)(
+ __in_z WCHAR const* localeName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Get layout maximum width
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxWidth)() PURE;
+
+ /// <summary>
+ /// Get layout maximum height
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxHeight)() PURE;
+
+ /// <summary>
+ /// Get the font collection where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontCollection">The current font collection</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ UINT32 currentPosition,
+ __out IDWriteFontCollection** fontCollection,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Copy the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontWeight">The current font weight</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontWeight)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_WEIGHT* fontWeight,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font style where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStyle">The current font style</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStyle)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STYLE* fontStyle,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font stretch where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStretch">The current font stretch</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStretch)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STRETCH* fontStretch,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font em height where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontSize">The current font em height</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontSize)(
+ UINT32 currentPosition,
+ __out FLOAT* fontSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the underline presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetUnderline)(
+ UINT32 currentPosition,
+ __out BOOL* hasUnderline,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the strikethrough presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStrikethrough)(
+ UINT32 currentPosition,
+ __out BOOL* hasStrikethrough,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the application-defined drawing effect where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="drawingEffect">The current application-defined drawing effect.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetDrawingEffect)(
+ UINT32 currentPosition,
+ __out IUnknown** drawingEffect,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the inline object at the given position.
+ /// </summary>
+ /// <param name="currentPosition">The given text position.</param>
+ /// <param name="inlineObject">The inline object.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetInlineObject)(
+ UINT32 currentPosition,
+ __out IDWriteInlineObject** inlineObject,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the typography setting where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="typography">The current typography setting.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTypography)(
+ UINT32 currentPosition,
+ __out IDWriteTypography** typography,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Initiate drawing of the text.
+ /// </summary>
+ /// <param name="clientDrawingContext">An application defined value
+ /// included in rendering callbacks.</param>
+ /// <param name="renderer">The set of application-defined callbacks that do
+ /// the actual rendering.</param>
+ /// <param name="originX">X-coordinate of the layout's left side.</param>
+ /// <param name="originY">Y-coordinate of the layout's top side.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY
+ ) PURE;
+
+ /// <summary>
+ /// GetLineMetrics returns properties of each line.
+ /// </summary>
+ /// <param name="lineMetrics">The array to fill with line information.</param>
+ /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>
+ /// <param name="actualLineCount">The actual size of the lineMetrics
+ /// array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualLineCount is set to the number of lines
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetLineMetrics)(
+ __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,
+ UINT32 maxLineCount,
+ __out UINT32* actualLineCount
+ ) PURE;
+
+ /// <summary>
+ /// GetMetrics retrieves overall metrics for the formatted string.
+ /// </summary>
+ /// <param name="textMetrics">The returned metrics.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Drawing effects like underline and strikethrough do not contribute
+ /// to the text size, which is essentially the sum of advance widths and
+ /// line heights. Additionally, visible swashes and other graphic
+ /// adornments may extend outside the returned width and height.
+ /// </remarks>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_TEXT_METRICS* textMetrics
+ ) PURE;
+
+ /// <summary>
+ /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all
+ /// objects contained in it, including text glyphs and inline objects.
+ /// </summary>
+ /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Any underline and strikethrough do not contribute to the black box
+ /// determination, since these are actually drawn by the renderer, which
+ /// is allowed to draw them in any variety of styles.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Retrieve logical properties and measurement of each cluster.
+ /// </summary>
+ /// <param name="clusterMetrics">The array to fill with cluster information.</param>
+ /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>
+ /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualClusterCount is set to the number of clusters
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetClusterMetrics)(
+ __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,
+ UINT32 maxClusterCount,
+ __out UINT32* actualClusterCount
+ ) PURE;
+
+ /// <summary>
+ /// Determines the minimum possible width the layout can be set to without
+ /// emergency breaking between the characters of whole words.
+ /// </summary>
+ /// <param name="minWidth">Minimum width.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DetermineMinWidth)(
+ __out FLOAT* minWidth
+ ) PURE;
+
+ /// <summary>
+ /// Given a coordinate (in DIPs) relative to the top-left of the layout box,
+ /// this returns the corresponding hit-test metrics of the text string where
+ /// the hit-test has occurred. This is useful for mapping mouse clicks to caret
+ /// positions. When the given coordinate is outside the text string, the function
+ /// sets the output value *isInside to false but returns the nearest character
+ /// position.
+ /// </summary>
+ /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing
+ /// side of the character. When the output *isInside value is set to false, this value is set according to the output
+ /// *position value to represent the edge closest to the hit-test location. </param>
+ /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.
+ /// When false, the position nearest the text's edge is returned.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value
+ /// is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HitTestPoint)(
+ FLOAT pointX,
+ FLOAT pointY,
+ __out BOOL* isTrailingHit,
+ __out BOOL* isInside,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Given a text position and whether the caret is on the leading or trailing
+ /// edge of that position, this returns the corresponding coordinate (in DIPs)
+ /// relative to the top-left of the layout box. This is most useful for drawing
+ /// the caret's current position, but it could also be used to anchor an IME to the
+ /// typed text or attach a floating menu near the point of interest. It may also be
+ /// used to programmatically obtain the geometry of a particular text position
+ /// for UI automation.
+ /// </summary>
+ /// <param name="textPosition">Text position to get the coordinate of.</param>
+ /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>
+ /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>
+ /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// When drawing a caret at the returned X,Y, it should should be centered on X
+ /// and drawn from the Y coordinate down. The height will be the size of the
+ /// hit-tested text (which can vary in size within a line).
+ /// Reading direction also affects which side of the character the caret is drawn.
+ /// However, the returned X coordinate will be correct for either case.
+ /// You can get a text length back that is larger than a single character.
+ /// This happens for complex scripts when multiple characters form a single cluster,
+ /// when diacritics join their base character, or when you test a surrogate pair.
+ /// </remarks>
+ STDMETHOD(HitTestTextPosition)(
+ UINT32 textPosition,
+ BOOL isTrailingHit,
+ __out FLOAT* pointX,
+ __out FLOAT* pointY,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// The application calls this function to get a set of hit-test metrics
+ /// corresponding to a range of text positions. The main usage for this
+ /// is to draw highlighted selection of the text string.
+ ///
+ /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to
+ /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of
+ /// hitTestMetrics is too small to hold all the regions calculated by the
+ /// function. In such situation, the function sets the output value
+ /// *actualHitTestMetricsCount to the number of geometries calculated.
+ /// The application is responsible to allocate a new buffer of greater
+ /// size and call the function again.
+ ///
+ /// A good value to use as an initial value for maxHitTestMetricsCount may
+ /// be calculated from the following equation:
+ /// maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth
+ ///
+ /// where lineCount is obtained from the value of the output argument
+ /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,
+ /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS
+ /// structure of the output argument *textMetrics from the function
+ /// IDWriteFactory::CreateTextLayout.
+ /// </summary>
+ /// <param name="textPosition">First text position of the specified range.</param>
+ /// <param name="textLength">Number of positions of the specified range.</param>
+ /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>
+ /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>
+ /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// There are no gaps in the returned metrics. While there could be visual gaps,
+ /// depending on bidi ordering, each range is contiguous and reports all the text,
+ /// including any hidden characters and trimmed text.
+ /// The height of each returned range will be the same within each line, regardless
+ /// of how the font sizes vary.
+ /// </remarks>
+ STDMETHOD(HitTestTextRange)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ FLOAT originX,
+ FLOAT originY,
+ __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,
+ UINT32 maxHitTestMetricsCount,
+ __out UINT32* actualHitTestMetricsCount
+ ) PURE;
+};
+
+/// <summary>
+/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown
+{
+ /// <summary>
+ /// Draws a run of glyphs to the bitmap.
+ /// </summary>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for different measuring methods, for example
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.
+ /// </param>
+ /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>
+ /// <param name="renderingParams">Object that controls rendering behavior.</param>
+ /// <param name="textColor">Specifies the foreground color of the text.</param>
+ /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by
+ /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ IDWriteRenderingParams* renderingParams,
+ COLORREF textColor,
+ __out_opt RECT* blackBoxRect = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Gets a handle to the memory device context.
+ /// </summary>
+ /// <returns>
+ /// Returns the device context handle.
+ /// </returns>
+ /// <remarks>
+ /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle
+ /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including
+ /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit
+ /// top-down DIB.
+ /// </remarks>
+ STDMETHOD_(HDC, GetMemoryDC)() PURE;
+
+ /// <summary>
+ /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <returns>
+ /// Returns the number of bitmap pixels per DIP.
+ /// </returns>
+ STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;
+
+ /// <summary>
+ /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetPixelsPerDip)(
+ FLOAT pixelsPerDip
+ ) PURE;
+
+ /// <summary>
+ /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity
+ /// transform. Note that this is unrelated to the world transform of the underlying device
+ /// context.
+ /// </summary>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world
+ /// transform of the underlying device context.
+ /// </summary>
+ /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which
+ /// case the identity transform is implied.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetCurrentTransform)(
+ __in_opt DWRITE_MATRIX const* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the dimensions of the bitmap.
+ /// </summary>
+ /// <param name="size">Receives the size of the bitmap in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSize)(
+ __out SIZE* size
+ ) PURE;
+
+ /// <summary>
+ /// Resizes the bitmap.
+ /// </summary>
+ /// <param name="width">New bitmap width, in pixels.</param>
+ /// <param name="height">New bitmap height, in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Resize)(
+ UINT32 width,
+ UINT32 height
+ ) PURE;
+};
+
+/// <summary>
+/// The GDI interop interface provides interoperability with GDI.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown
+{
+ /// <summary>
+ /// Creates a font object that matches the properties specified by the LOGFONT structure.
+ /// </summary>
+ /// <param name="logFont">Structure containing a GDI-compatible font description.</param>
+ /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFromLOGFONT)(
+ __in LOGFONTW const* logFont,
+ __out IDWriteFont** font
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font in the system font collection.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection
+ /// or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontToLOGFONT)(
+ IDWriteFont* font,
+ __out LOGFONTW* logFont,
+ __out BOOL* isSystemFont
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font face.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontFaceToLOGFONT)(
+ IDWriteFontFace* font,
+ __out LOGFONTW* logFont
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object that corresponds to the currently selected HFONT.
+ /// </summary>
+ /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client
+ /// has already performed font mapping and that the font selected into the DC is the actual font that would be used
+ /// for rendering glyphs.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFaceFromHdc)(
+ HDC hdc,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.
+ /// </summary>
+ /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>
+ /// <param name="width">Width of the bitmap.</param>
+ /// <param name="height">Height of the bitmap.</param>
+ /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>
+ STDMETHOD(CreateBitmapRenderTarget)(
+ __in_opt HDC hdc,
+ UINT32 width,
+ UINT32 height,
+ __out IDWriteBitmapRenderTarget** renderTarget
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each
+/// representing the darkness (i.e., opacity) of a pixel or subpixel.
+/// </summary>
+enum DWRITE_TEXTURE_TYPE
+{
+ /// <summary>
+ /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),
+ /// with one byte per pixel.
+ /// </summary>
+ DWRITE_TEXTURE_ALIASED_1x1,
+
+ /// <summary>
+ /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and
+ /// one byte per pixel in the vertical dimension.
+ /// </summary>
+ DWRITE_TEXTURE_CLEARTYPE_3x1
+};
+
+/// <summary>
+/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.
+/// </summary>
+#define DWRITE_ALPHA_MAX 255
+
+/// <summary>
+/// Interface that encapsulates information used to render a glyph run.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown
+{
+ /// <summary>
+ /// Gets the bounding rectangle of the physical pixels affected by the glyph run.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased
+ /// glyphs.</param>
+ /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs
+ /// if the specified type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetAlphaTextureBounds)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __out RECT* textureBounds
+ ) PURE;
+
+ /// <summary>
+ /// Creates an alpha texture of the specified type.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>
+ /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than
+ /// the bounding rectangle returned by GetAlphaTextureBounds.</param>
+ /// <param name="alphaValues">Receives the array of alpha values.</param>
+ /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the
+ /// rectangle and the type of texture requested.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateAlphaTexture)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __in RECT const* textureBounds,
+ __out_bcount(bufferSize) BYTE* alphaValues,
+ UINT32 bufferSize
+ ) PURE;
+
+ /// <summary>
+ /// Gets properties required for ClearType blending.
+ /// </summary>
+ /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output
+ /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode
+ /// is specified.</param>
+ /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>
+ /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>
+ /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>
+ STDMETHOD(GetAlphaBlendParams)(
+ IDWriteRenderingParams* renderingParams,
+ __out FLOAT* blendGamma,
+ __out FLOAT* blendEnhancedContrast,
+ __out FLOAT* blendClearTypeLevel
+ ) PURE;
+};
+
+/// <summary>
+/// The root factory interface for all DWrite objects.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
+{
+ /// <summary>
+ /// Gets a font collection representing the set of installed fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of
+ /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but
+ /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to
+ /// be sure the font collection contains that font.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSystemFontCollection)(
+ __out IDWriteFontCollection** fontCollection,
+ BOOL checkForUpdates = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font collection using a custom font collection loader.
+ /// </summary>
+ /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously
+ /// registered using RegisterFontCollectionLoader.</param>
+ /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>
+ /// <param name="collectionKeySize">Size in bytes of the collection key.</param>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomFontCollection)(
+ IDWriteFontCollectionLoader* collectionLoader,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Registers a custom font collection loader with the factory object.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(RegisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(UnregisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// CreateFontFileReference creates a font file reference object from a local font file.
+ /// </summary>
+ /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail
+ /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>
+ /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,
+ /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value
+ /// to avoid extra disk access. Subsequent operations on the constructed object may fail
+ /// if the user provided lastWriteTime doesn't match the file on the disk.</param>
+ /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFileReference)(
+ __in_z WCHAR const* filePath,
+ __in_opt FILETIME const* lastWriteTime,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// CreateCustomFontFileReference creates a reference to an application specific font file resource.
+ /// This function enables an application or a document to use a font without having to install it on the system.
+ /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// during the lifetime of fontFileLoader.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by
+ /// fontFileReferenceKey.</param>
+ /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function is provided for cases when an application or a document needs to use a font
+ /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope
+ /// of the fontFileLoader used in this call.
+ /// </remarks>
+ STDMETHOD(CreateCustomFontFileReference)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ IDWriteFontFileLoader* fontFileLoader,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object.
+ /// </summary>
+ /// <param name="fontFaceType">The file format of the font face.</param>
+ /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>
+ /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references
+ /// to the input font file objects, it's OK to release them after this call.</param>
+ /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.
+ /// If the font files contain a single face, this value should be zero.</param>
+ /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ DWRITE_FONT_FACE_TYPE fontFaceType,
+ UINT32 numberOfFiles,
+ __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,
+ UINT32 faceIndex,
+ DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the primary monitor.
+ /// </summary>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateRenderingParams)(
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the specified monitor.
+ /// </summary>
+ /// <param name="monitor">The monitor to read the default values from.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateMonitorRenderingParams)(
+ HMONITOR monitor,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with the specified properties.
+ /// </summary>
+ /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
+ /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
+ /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
+ /// <param name="pixelGeometry">The geometry of a device pixel.</param>
+ /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomRenderingParams)(
+ FLOAT gamma,
+ FLOAT enhancedContrast,
+ FLOAT clearTypeLevel,
+ DWRITE_PIXEL_GEOMETRY pixelGeometry,
+ DWRITE_RENDERING_MODE renderingMode,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Registers a font file loader with DirectWrite.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function registers a font file loader with DirectWrite.
+ /// Font file loader interface handles loading font file resources of a particular type from a key.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// A given instance can only be registered once.
+ /// Succeeding attempts will return an error that it has already been registered.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(RegisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>
+ /// <returns>
+ /// This function will succeed if the user loader is requested to be removed.
+ /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,
+ /// or a loader that is never registered or has already been unregistered.
+ /// </returns>
+ /// <remarks>
+ /// This function unregisters font file loader callbacks with the DirectWrite font system.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(UnregisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Create a text format object used for text layout.
+ /// </summary>
+ /// <param name="fontFamilyName">Name of the font family</param>
+ /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="fontStretch">Font stretch</param>
+ /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextFormat)(
+ __in_z WCHAR const* fontFamilyName,
+ __maybenull IDWriteFontCollection* fontCollection,
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_FONT_STRETCH fontStretch,
+ FLOAT fontSize,
+ __in_z WCHAR const* localeName,
+ __out IDWriteTextFormat** textFormat
+ ) PURE;
+
+ /// <summary>
+ /// Create a typography object used in conjunction with text format for text layout.
+ /// </summary>
+ /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTypography)(
+ __out IDWriteTypography** typography
+ ) PURE;
+
+ /// <summary>
+ /// Create an object used for interoperability with GDI.
+ /// </summary>
+ /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiInterop)(
+ __out IDWriteGdiInterop** gdiInterop
+ ) PURE;
+
+ /// <summary>
+ /// CreateTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the fully analyzed
+ /// and formatted result.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="maxWidth">Width of the layout box.</param>
+ /// <param name="maxHeight">Height of the layout box.</param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT maxWidth,
+ FLOAT maxHeight,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the result formatted for a particular display resolution
+ /// and measuring method. The resulting text layout should only be used for the intended resolution,
+ /// and for cases where text scalability is desired, CreateTextLayout should be used instead.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="layoutWidth">Width of the layout box.</param>
+ /// <param name="layoutHeight">Height of the layout box.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.
+ /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGdiCompatibleTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT layoutWidth,
+ FLOAT layoutHeight,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.
+ /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.
+ /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.
+ /// </summary>
+ /// <param name="textFormat">Text format used as a template for the omission sign.</param>
+ /// <param name="trimmingSign">Created omission sign.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEllipsisTrimmingSign)(
+ IDWriteTextFormat* textFormat,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Return an interface to perform text analysis with.
+ /// </summary>
+ /// <param name="textAnalyzer">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextAnalyzer)(
+ __out IDWriteTextAnalyzer** textAnalyzer
+ ) PURE;
+
+ /// <summary>
+ /// Creates a number substitution object using a locale name,
+ /// substitution method, and whether to ignore user overrides (uses NLS
+ /// defaults for the given culture instead).
+ /// </summary>
+ /// <param name="substitutionMethod">Method of number substitution to use.</param>
+ /// <param name="localeName">Which locale to obtain the digits from.</param>
+ /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>
+ /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>
+ STDMETHOD(CreateNumberSubstitution)(
+ __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
+ __in_z WCHAR const* localeName,
+ __in BOOL ignoreUserOverride,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+
+ /// <summary>
+ /// Creates a glyph run analysis object, which encapsulates information
+ /// used to render a glyph run.
+ /// </summary>
+ /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the emSize and pixelsPerDip.</param>
+ /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
+ /// and not outline).</param>
+ /// <param name="measuringMode">Specifies the method to measure glyphs.</param>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
+ /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGlyphRunAnalysis)(
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ DWRITE_RENDERING_MODE renderingMode,
+ DWRITE_MEASURING_MODE measuringMode,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __out IDWriteGlyphRunAnalysis** glyphRunAnalysis
+ ) PURE;
+
+}; // interface IDWriteFactory
+
+/// <summary>
+/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.
+/// </summary>
+/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>
+/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>
+/// <param name="factory">Receives the DirectWrite factory object.</param>
+/// <returns>
+/// Standard HRESULT error code.
+/// </returns>
+/// <remarks>
+/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </remarks>
+EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(
+ __in DWRITE_FACTORY_TYPE factoryType,
+ __in REFIID iid,
+ __out IUnknown **factory
+ );
+
+// Macros used to define DirectWrite error codes.
+#define FACILITY_DWRITE 0x898
+#define DWRITE_ERR_BASE 0x5000
+#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
+#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
+
+/// <summary>
+/// Indicates an error in an input file such as a font file.
+/// </summary>
+#define DWRITE_E_FILEFORMAT MAKE_DWRITE_HR_ERR(0x000)
+
+/// <summary>
+/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.
+/// </summary>
+#define DWRITE_E_UNEXPECTED MAKE_DWRITE_HR_ERR(0x001)
+
+/// <summary>
+/// Indicates the specified font does not exist.
+/// </summary>
+#define DWRITE_E_NOFONT MAKE_DWRITE_HR_ERR(0x002)
+
+/// <summary>
+/// A font file could not be opened because the file, directory, network location, drive, or other storage
+/// location does not exist or is unavailable.
+/// </summary>
+#define DWRITE_E_FILENOTFOUND MAKE_DWRITE_HR_ERR(0x003)
+
+/// <summary>
+/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.
+/// </summary>
+#define DWRITE_E_FILEACCESS MAKE_DWRITE_HR_ERR(0x004)
+
+/// <summary>
+/// A font collection is obsolete due to changes in the system.
+/// </summary>
+#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)
+
+/// <summary>
+/// The given interface is already registered.
+/// </summary>
+#define DWRITE_E_ALREADYREGISTERED MAKE_DWRITE_HR_ERR(0x006)
+
+#endif /* DWRITE_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/Dcommon.h b/core/src/fxge/Microsoft SDK/include/Dcommon.h
new file mode 100644
index 0000000000..a6c901aeac
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/Dcommon.h
@@ -0,0 +1,65 @@
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// Public API definitions for DWrite and D2D
+//
+//----------------------------------------------------------------------------
+
+#ifndef DCOMMON_H_INCLUDED
+#define DCOMMON_H_INCLUDED
+
+//
+//These macros are defined in the Windows 7 SDK, however to enable development using the technical preview,
+//they are included here temporarily.
+//
+#ifndef DEFINE_ENUM_FLAG_OPERATORS
+#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
+extern "C++" { \
+inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \
+inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \
+inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \
+inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \
+inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \
+inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \
+inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \
+}
+#endif
+
+#ifndef __field_ecount_opt
+#define __field_ecount_opt(x)
+#endif
+
+#ifndef __range
+#define __range(x,y)
+#endif
+
+#ifndef __field_ecount
+#define __field_ecount(x)
+#endif
+
+/// <summary>
+/// The measuring method used for text layout.
+/// </summary>
+typedef enum DWRITE_MEASURING_MODE
+{
+ /// <summary>
+ /// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_NATURAL,
+
+ /// <summary>
+ /// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Text is measured using the same glyph display metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_NATURAL
+
+} DWRITE_MEASURING_MODE;
+
+#endif /* DCOMMON_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlus.h b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
new file mode 100644
index 0000000000..82393e7050
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
@@ -0,0 +1,156 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_H
+#define _GDIPLUS_H
+
+struct IDirectDrawSurface7;
+
+typedef signed short INT16;
+typedef unsigned short UINT16;
+
+#ifndef DCR_REMOVE_INTERNAL
+
+#ifndef DCR_USE_NEW_105760
+ #define DCR_USE_NEW_105760
+#endif
+#ifndef DCR_USE_NEW_127084
+ #define DCR_USE_NEW_127084
+#endif
+#ifndef DCR_USE_NEW_135429
+ #define DCR_USE_NEW_135429
+#endif
+#ifndef DCR_USE_NEW_140782
+ #define DCR_USE_NEW_140782
+#endif
+#ifndef DCR_USE_NEW_140855
+ #define DCR_USE_NEW_140855
+#endif
+#ifndef DCR_USE_NEW_140857
+ #define DCR_USE_NEW_140857
+#endif
+#ifndef DCR_USE_NEW_140861
+ #define DCR_USE_NEW_140861
+#endif
+#ifndef DCR_USE_NEW_145135
+ #define DCR_USE_NEW_145135
+#endif
+#ifndef DCR_USE_NEW_145138
+ #define DCR_USE_NEW_145138
+#endif
+#ifndef DCR_USE_NEW_145139
+ #define DCR_USE_NEW_145139
+#endif
+#ifndef DCR_USE_NEW_145804
+ #define DCR_USE_NEW_145804
+#endif
+#ifndef DCR_USE_NEW_146933
+ #define DCR_USE_NEW_146933
+#endif
+#ifndef DCR_USE_NEW_152154
+ #define DCR_USE_NEW_152154
+#endif
+#ifndef DCR_USE_NEW_175866
+ #define DCR_USE_NEW_175866
+#endif
+
+#ifndef DCR_USE_NEW_188922
+ #define DCR_USE_NEW_188922
+#endif
+#ifndef DCR_USE_NEW_137252
+ #define DCR_USE_NEW_137252
+#endif
+#ifndef DCR_USE_NEW_202903
+ #define DCR_USE_NEW_202903
+#endif
+#ifndef DCR_USE_NEW_197819
+ #define DCR_USE_NEW_197819
+#endif
+#ifndef DCR_USE_NEW_186091
+ #define DCR_USE_NEW_186091
+#endif
+#ifndef DCR_USE_NEW_125467
+ #define DCR_USE_NEW_125467
+#endif
+#ifndef DCR_USE_NEW_168772
+ #define DCR_USE_NEW_168772
+#endif
+#ifndef DCR_USE_NEW_186764
+ #define DCR_USE_NEW_186764
+#endif
+#ifndef DCR_USE_NEW_174340
+ #define DCR_USE_NEW_174340
+#endif
+#ifndef DCR_USE_NEW_186151
+ #define DCR_USE_NEW_186151
+#endif
+
+#ifndef DCR_USE_NEW_235072
+ #define DCR_USE_NEW_235072
+#endif
+
+#endif // DCR_REMOVE_INTERNAL
+
+namespace Gdiplus
+{
+ namespace DllExports
+ {
+ #include "GdiplusMem.h"
+ };
+
+ #include "GdiplusBase.h"
+
+ // The following headers are used internally as well
+ #include "GdiplusEnums.h"
+ #include "GdiplusTypes.h"
+ #include "GdiplusInit.h"
+ #include "GdiplusPixelFormats.h"
+ #include "GdiplusColor.h"
+ #include "GdiplusMetaHeader.h"
+ #include "GdiplusImaging.h"
+ #include "GdiplusColorMatrix.h"
+
+ // The rest of these are used only by the application
+
+ #include "GdiplusGpStubs.h"
+ #include "GdiplusHeaders.h"
+
+ namespace DllExports
+ {
+ #include "GdiplusFlat.h"
+ };
+
+
+ #include "GdiplusImageAttributes.h"
+ #include "GdiplusMatrix.h"
+ #include "GdiplusBrush.h"
+ #include "GdiplusPen.h"
+ #include "GdiplusStringFormat.h"
+ #include "GdiplusPath.h"
+ #include "GdiplusLineCaps.h"
+ #include "GdiplusMetafile.h"
+ #include "GdiplusGraphics.h"
+ #include "GdiplusCachedBitmap.h"
+ #include "GdiplusRegion.h"
+ #include "GdiplusFontCollection.h"
+ #include "GdiplusFontFamily.h"
+ #include "GdiplusFont.h"
+ #include "GdiplusBitmap.h"
+ #include "GdiplusImageCodec.h"
+
+}; // namespace Gdiplus
+
+
+
+#endif // !_GDIPLUS_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
new file mode 100644
index 0000000000..40a977d1b1
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
@@ -0,0 +1,40 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBase.h
+*
+* Abstract:
+*
+* Represents the base class for GDIPlus memory allocation.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBASE_H
+#define _GDIPLUSBASE_H
+
+class GdiplusBase
+{
+public:
+ void (operator delete)(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new)(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+ void (operator delete[])(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new[])(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
new file mode 100644
index 0000000000..fbe0061d41
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
@@ -0,0 +1,1004 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBitmap.h
+*
+* Abstract:
+*
+* Bitmap related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBITMAP_H
+#define _GDIPLUSBITMAP_H
+
+// NOTE:
+// Our current choice for the public API is to use constructors
+// instead of static load functions to create image objects.
+//
+// I've kept the static load functions here for now so that
+// existing test programs are not broken. But they should
+// eventually be taken out.
+
+#ifndef DCR_USE_NEW_140782
+
+inline
+Image::Image(
+ IN const WCHAR* filename
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
+}
+
+inline
+Image::Image(
+ IN IStream* stream
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename
+ )
+{
+ return new Image(filename);
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream
+ )
+{
+ return new Image(stream);
+}
+
+#else
+
+inline
+Image::Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromFileICM(
+ filename,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromFile(
+ filename,
+ &nativeImage
+ );
+ }
+}
+
+inline
+Image::Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromStreamICM(
+ stream,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromStream(
+ stream,
+ &nativeImage
+ );
+ }
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+#endif
+
+inline
+Image::~Image()
+{
+ DllExports::GdipDisposeImage(nativeImage);
+}
+
+inline Image*
+Image::Clone()
+{
+ GpImage *cloneimage = NULL;
+
+ SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
+
+ return new Image(cloneimage, lastResult);
+}
+
+// Encorder Parameter
+
+inline UINT
+Image::GetEncoderParameterListSize(
+ IN const CLSID* clsidEncoder
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
+ clsidEncoder,
+ &size));
+ return size;
+}
+
+inline Status
+Image::GetEncoderParameterList(
+ IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
+ clsidEncoder,
+ size,
+ buffer));
+}
+
+// Save images
+
+inline Status
+Image::Save(
+ IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
+ filename,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::Save(
+ IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
+ stream,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveAdd(nativeImage,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN Image* newImage,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ if ( newImage == NULL )
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
+ newImage->nativeImage,
+ encoderParams));
+}
+
+// Get size and type information
+inline ImageType
+Image::GetType() const
+{
+ ImageType type = ImageTypeUnknown;
+
+ SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
+
+ return type;
+}
+
+inline Status
+Image::GetPhysicalDimension(
+ OUT SizeF* size
+ )
+{
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ REAL width, height;
+ Status status;
+
+ status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
+ &width, &height));
+
+ size->Width = width;
+ size->Height = height;
+
+ return status;
+}
+
+inline Status
+Image::GetBounds(
+ OUT RectF *srcRect,
+ OUT Unit *srcUnit
+ )
+{
+ return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
+ srcRect, srcUnit));
+}
+
+inline UINT
+Image::GetWidth()
+{
+ UINT width = 0;
+
+ SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
+
+ return width;
+}
+
+inline UINT
+Image::GetHeight()
+{
+ UINT height = 0;
+
+ SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
+
+ return height;
+}
+
+inline REAL
+Image::GetHorizontalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline REAL
+Image::GetVerticalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline UINT
+Image::GetFlags()
+{
+ UINT flags = 0;
+
+ SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
+
+ return flags;
+}
+
+inline Status
+Image::GetRawFormat(OUT GUID *format)
+{
+ return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
+}
+
+inline PixelFormat
+Image::GetPixelFormat()
+{
+ PixelFormat format;
+
+ SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
+
+ return format;
+}
+
+inline INT
+Image::GetPaletteSize()
+{
+ INT size = 0;
+
+ SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPalette(
+ OUT ColorPalette *palette,
+ IN INT size
+)
+{
+ return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
+}
+
+inline Status
+Image::SetPalette(
+ IN const ColorPalette *palette
+ )
+{
+ return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
+}
+
+// Thumbnail support
+
+inline Image*
+Image::GetThumbnailImage(
+ IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback,
+ IN VOID* callbackData
+ )
+{
+ GpImage *thumbimage = NULL;
+
+ SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
+ thumbWidth, thumbHeight,
+ &thumbimage,
+ callback, callbackData));
+
+ Image *newImage = new Image(thumbimage, lastResult);
+
+ if (newImage == NULL)
+ {
+ DllExports::GdipDisposeImage(thumbimage);
+ }
+
+ return newImage;
+}
+
+// Multi-frame support
+inline UINT
+Image::GetFrameDimensionsCount()
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
+ &count));
+
+ return count;
+}
+
+inline Status
+Image::GetFrameDimensionsList(
+ OUT GUID* dimensionIDs,
+ IN UINT count
+ )
+{
+ return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
+ dimensionIDs,
+ count));
+}
+
+inline UINT
+Image::GetFrameCount(
+ IN const GUID* dimensionID
+ )
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
+ dimensionID,
+ &count));
+ return count;
+}
+
+inline Status
+Image::SelectActiveFrame(
+ IN const GUID *dimensionID,
+ IN UINT frameIndex
+ )
+{
+ return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
+ dimensionID,
+ frameIndex));
+}
+
+inline Status
+Image::RotateFlip(
+ IN RotateFlipType rotateFlipType
+ )
+{
+ return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,
+ rotateFlipType));
+}
+
+// Image property related functions
+
+inline UINT
+Image::GetPropertyCount()
+{
+ UINT numProperty = 0;
+
+ SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
+ &numProperty));
+
+ return numProperty;
+}
+
+inline Status
+Image::GetPropertyIdList(
+ IN UINT numOfProperty,
+ OUT PROPID* list
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
+ numOfProperty, list));
+}
+
+inline UINT
+Image::GetPropertyItemSize(
+ IN PROPID propId
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
+ propId,
+ &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPropertyItem(
+ IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
+ propId, propSize, buffer));
+}
+
+inline Status
+Image::GetPropertySize(
+ OUT UINT* totalBufferSize,
+ OUT UINT* numProperties
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
+ totalBufferSize,
+ numProperties));
+}
+
+inline Status
+Image::GetAllPropertyItems(
+ IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems
+ )
+{
+ if (allItems == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
+ totalBufferSize,
+ numProperties,
+ allItems));
+}
+
+inline Status
+Image::RemovePropertyItem(
+ IN PROPID propId
+ )
+{
+ return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
+}
+
+inline Status
+Image::SetPropertyItem(
+ IN const PropertyItem* item
+ )
+{
+ return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
+}
+
+// Get/SetLayout
+// Support for Middle East localization (right-to-left mirroring)
+
+inline ImageLayout
+Image::GetLayout() const
+{
+ ImageLayout layout;
+
+ SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
+
+ return layout;
+}
+
+inline Status
+Image::SetLayout(IN const ImageLayout layout)
+{
+ return SetStatus(
+ DllExports::GdipSetImageLayout(nativeImage, layout)
+ );
+}
+
+inline Status
+Image::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+inline
+Image::Image(GpImage *nativeImage, Status status)
+{
+ SetNativeImage(nativeImage);
+ lastResult = status;
+}
+
+inline VOID
+Image::SetNativeImage(GpImage *nativeImage)
+{
+ this->nativeImage = nativeImage;
+}
+
+inline
+Bitmap::Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN INT stride,
+ IN PixelFormat format,
+ IN BYTE *scan0
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ stride,
+ format,
+ scan0,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ 0,
+ format,
+ NULL,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN Graphics* target)
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
+ height,
+ target->nativeGraphics,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IDirectDrawSurface7 * surface
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
+ gdiBitmapData,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HICON hicon
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
+ bitmapName,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+
+inline Bitmap*
+Bitmap::FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromDirectDrawSurface7(
+ IN IDirectDrawSurface7* surface
+ )
+{
+ return new Bitmap(surface);
+}
+
+inline Bitmap*
+Bitmap::FromBITMAPINFO(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData)
+{
+ return new Bitmap(gdiBitmapInfo, gdiBitmapData);
+}
+
+inline Bitmap*
+Bitmap::FromHBITMAP(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ return new Bitmap(hbm, hpal);
+}
+
+inline Bitmap*
+Bitmap::FromHICON(
+ IN HICON hicon
+ )
+{
+ return new Bitmap(hicon);
+}
+
+inline Bitmap*
+Bitmap::FromResource(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName)
+{
+ return new Bitmap(hInstance, bitmapName);
+}
+
+inline Status
+Bitmap::GetHBITMAP(
+ IN const Color& colorBackground,
+ OUT HBITMAP* hbmReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hbmReturn,
+ colorBackground.GetValue()));
+}
+
+inline Status
+Bitmap::GetHICON(
+ OUT HICON* hiconReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHICONFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hiconReturn));
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const Rect& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ lastResult = DllExports::GdipCloneBitmapAreaI(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap);
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const RectF& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ SetStatus(DllExports::GdipCloneBitmapArea(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap));
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
+{
+ lastResult = Ok;
+
+ SetNativeImage(nativeBitmap);
+}
+
+inline Status
+Bitmap::LockBits(
+ IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData
+)
+{
+ return SetStatus(DllExports::GdipBitmapLockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ &rect,
+ flags,
+ format,
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::UnlockBits(
+ IN BitmapData* lockedBitmapData
+ )
+{
+ return SetStatus(DllExports::GdipBitmapUnlockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::GetPixel(
+ IN INT x,
+ IN INT y,
+ OUT Color *color)
+{
+ ARGB argb;
+
+ Status status = SetStatus(DllExports::GdipBitmapGetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ &argb));
+
+ if (status == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return status;
+}
+
+inline Status
+Bitmap::SetPixel(
+ IN INT x,
+ IN INT y,
+ IN const Color& color)
+{
+ return SetStatus(DllExports::GdipBitmapSetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ color.GetValue()));
+}
+
+inline Status
+Bitmap::SetResolution(
+ IN REAL xdpi,
+ IN REAL ydpi)
+{
+ return SetStatus(DllExports::GdipBitmapSetResolution(
+ static_cast<GpBitmap *>(nativeImage),
+ xdpi, ydpi));
+}
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
new file mode 100644
index 0000000000..a506f87982
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
@@ -0,0 +1,951 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBrush.h
+*
+* Abstract:
+*
+* Brush API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBRUSH_H
+#define _GDIPLUSBRUSH_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for various brush types
+//--------------------------------------------------------------------------
+
+class GraphicsPath;
+
+class Brush : public GdiplusBase
+{
+public:
+ friend class Pen;
+ friend class Graphics;
+
+ virtual ~Brush()
+ {
+ DllExports::GdipDeleteBrush(nativeBrush);
+ }
+
+ virtual Brush* Clone() const
+ {
+ GpBrush *brush = NULL;
+
+ SetStatus(DllExports::GdipCloneBrush(nativeBrush, &brush));
+
+ Brush *newBrush = new Brush(brush, lastResult);
+
+ if (newBrush == NULL)
+ {
+ DllExports::GdipDeleteBrush(brush);
+ }
+
+ return newBrush;
+ }
+
+ BrushType GetType() const
+ {
+ BrushType type = static_cast<BrushType>(-1);
+
+ SetStatus(DllExports::GdipGetBrushType(nativeBrush, &type));
+
+ return type;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Brush()
+ {
+ SetStatus(NotImplemented);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Brush(const Brush& brush);
+ Brush& operator=(const Brush& brush);
+protected:
+
+#else
+
+ Brush(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ }
+
+ Brush& operator=(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Brush(GpBrush* nativeBrush, Status status)
+ {
+ lastResult = status;
+ SetNativeBrush(nativeBrush);
+ }
+
+ VOID SetNativeBrush(GpBrush* nativeBrush)
+ {
+ this->nativeBrush = nativeBrush;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpBrush* nativeBrush;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Represent solid fill brush object
+//--------------------------------------------------------------------------
+
+class SolidBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ SolidBrush(IN const Color& color)
+ {
+ GpSolidFill *brush = NULL;
+
+ lastResult = DllExports::GdipCreateSolidFill(color.GetValue(), &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetSolidFillColor((GpSolidFill*)nativeBrush,
+ &argb));
+
+ *color = Color(argb);
+
+ return lastResult;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetSolidFillColor((GpSolidFill*)nativeBrush,
+ color.GetValue()));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ SolidBrush(const SolidBrush &);
+ SolidBrush& operator=(const SolidBrush &);
+
+#endif
+
+protected:
+
+ SolidBrush()
+ {
+ }
+};
+
+class TextureBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode = WrapModeTile)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture(
+ image->nativeImage,
+ wrapMode, &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN const RectF &dstRect)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(IN Image *image,
+ IN const RectF &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIA(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+
+ #ifdef DCR_USE_NEW_145138
+ TextureBrush(IN Image *image,
+ IN const Rect &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIAI(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+ #endif
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(
+ IN Image* image,
+ IN WrapMode wrapMode,
+
+ #ifdef DCR_USE_NEW_145138
+ const IN Rect &dstRect
+ #else
+ IN Rect &dstRect
+ #endif
+ )
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN REAL dstX,
+ IN REAL dstY,
+ IN REAL dstWidth,
+ IN REAL dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN INT dstX,
+ IN INT dstY,
+ IN INT dstWidth,
+ IN INT dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetTextureTransform((GpTexture*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateTextureTransform((GpTexture*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleTextureTransform((GpTexture*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateTextureTransform((GpTexture*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetTextureWrapMode((GpTexture*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetTextureWrapMode((GpTexture*)nativeBrush,
+ &wrapMode));
+ return wrapMode;
+ }
+
+ // Get texture brush attributes
+
+ Image *GetImage() const
+ {
+ GpImage *image;
+
+ SetStatus(DllExports::GdipGetTextureImage((GpTexture *)nativeBrush,
+ &image));
+
+ Image *retimage = new Image(image, lastResult);
+
+ if (retimage == NULL)
+ {
+ DllExports::GdipDisposeImage(image);
+ }
+
+ return retimage;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ TextureBrush(const TextureBrush &);
+ TextureBrush& operator=(const TextureBrush &);
+
+#endif
+
+protected:
+
+ TextureBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// Represent line gradient brush object
+//--------------------------------------------------------------------------
+
+class LinearGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ LinearGradientBrush(IN const PointF& point1,
+ IN const PointF& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrush(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Point& point1,
+ IN const Point& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushI(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRect(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngle(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngleI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ // Get/set point attributes
+
+ Status SetLinearPoints(IN const PointF& point1,
+ IN const PointF& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePoints((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT PointF* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePoints((GpLineGradient*) nativeBrush,
+ points));
+ }
+
+ Status SetLinearPoints(IN const Point& point1,
+ IN const Point& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePointsI((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT Point* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePointsI((GpLineGradient*) nativeBrush,
+ points));
+ }
+ // Get/set color attributes
+
+ Status SetLinearColors(IN const Color& color1,
+ IN const Color& color2)
+ {
+ return SetStatus(DllExports::GdipSetLineColors((GpLineGradient*)nativeBrush,
+ color1.GetValue(),
+ color2.GetValue()));
+ }
+
+ Status GetLinearColors(OUT Color* colors) const
+ {
+ ARGB argb[2];
+
+ if (colors == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetLineColors((GpLineGradient*) nativeBrush, argb));
+
+ if (lastResult == Ok)
+ {
+ // use bitwise copy operator for Color copy
+ colors[0] = Color(argb[0]);
+ colors[1] = Color(argb[1]);
+ }
+
+ return lastResult;
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRect((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // integer version
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRectI((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction in interporlation.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLineBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetLineBlend((GpLineGradient*)
+ nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetLineBlend((GpLineGradient*)nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLinePresetBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB *argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (argbs)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetLinePresetBlend(
+ (GpLineGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete [] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB* argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetLinePresetBlend((GpLineGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ }
+
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetLineSigmaBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetLineLinearBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetLineTransform((GpLineGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateLineTransform((GpLineGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleLineTransform((GpLineGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateLineTransform((GpLineGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetLineWrapMode((GpLineGradient*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetLineWrapMode((GpLineGradient*)
+ nativeBrush,
+ &wrapMode));
+
+ return wrapMode;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ LinearGradientBrush(const LinearGradientBrush &);
+ LinearGradientBrush& operator=(const LinearGradientBrush &);
+
+#endif
+
+protected:
+
+ LinearGradientBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// PathGradientBrush object is defined
+// in gdipluspath.h.
+//--------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Represent hatch brush object
+//--------------------------------------------------------------------------
+
+class HatchBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ // Constructors
+
+ HatchBrush(IN HatchStyle hatchStyle,
+ IN const Color& foreColor,
+ IN const Color& backColor = Color())
+ {
+ GpHatch *brush = NULL;
+
+ lastResult = DllExports::GdipCreateHatchBrush(hatchStyle,
+ foreColor.GetValue(),
+ backColor.GetValue(),
+ &brush);
+ SetNativeBrush(brush);
+ }
+
+ HatchStyle GetHatchStyle() const
+ {
+ HatchStyle hatchStyle;
+
+ SetStatus(DllExports::GdipGetHatchStyle((GpHatch*)nativeBrush,
+ &hatchStyle));
+
+ return hatchStyle;
+ }
+
+ Status GetForegroundColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchForegroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ Status GetBackgroundColor(OUT Color *color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchBackgroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ HatchBrush(const HatchBrush &);
+ HatchBrush& operator=(const HatchBrush &);
+
+#endif
+
+protected:
+
+ HatchBrush()
+ {
+ }
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
new file mode 100644
index 0000000000..28fd8caea6
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
@@ -0,0 +1,71 @@
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* CachedBitmap class definition
+*
+* Abstract:
+*
+* CachedBitmap is a representation of an accelerated drawing
+* that has restrictions on what operations are allowed in order
+* to accelerate the drawing to the destination.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSCACHEDBITMAP_H
+#define _GDIPLUSCACHEDBITMAP_H
+
+/**************************************************************************
+*
+* Class Name:
+*
+* CachedBitmap
+*
+* Abstract:
+*
+* An object to store a bitmap prepared for rendering on a particular
+* Graphics object. The memory storage for the CachedBitmap is opaque
+* to the other Engine code, so the only operations supported are
+* initializing the data (with a bitmap) and using the graphics to
+* draw it on the screen with an integer offset.
+*
+* Look for the class definition in GdiplusHeaders.h
+*
+* Created:
+*
+* 04/23/2000 asecchia
+* Created it.
+*
+**************************************************************************/
+inline
+CachedBitmap::CachedBitmap(
+ IN Bitmap *bitmap,
+ IN Graphics *graphics)
+{
+ nativeCachedBitmap = NULL;
+
+ lastResult = DllExports::GdipCreateCachedBitmap(
+ (GpBitmap *)bitmap->nativeImage,
+ graphics->nativeGraphics,
+ &nativeCachedBitmap
+ );
+}
+
+inline
+CachedBitmap::~CachedBitmap()
+{
+ DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap);
+}
+
+inline Status
+CachedBitmap::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+ return (lastStatus);
+}
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
new file mode 100644
index 0000000000..72c21c295f
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
@@ -0,0 +1,209 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColor.h
+*
+* Abstract:
+*
+* Represents a GDI+ color.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLOR_H
+#define _GDIPLUSCOLOR_H
+
+//----------------------------------------------------------------------------
+// Color mode
+//----------------------------------------------------------------------------
+
+enum ColorMode
+{
+ ColorModeARGB32 = 0,
+ ColorModeARGB64 = 1
+};
+
+//----------------------------------------------------------------------------
+// Color Channel flags
+//----------------------------------------------------------------------------
+
+enum ColorChannelFlags
+{
+ ColorChannelFlagsC = 0,
+ ColorChannelFlagsM,
+ ColorChannelFlagsY,
+ ColorChannelFlagsK,
+ ColorChannelFlagsLast
+};
+
+//----------------------------------------------------------------------------
+// Color
+//----------------------------------------------------------------------------
+
+class Color
+{
+public:
+
+ Color()
+ {
+ Argb = (ARGB)Color::Black;
+ }
+
+ // Construct an opaque Color object with
+ // the specified R, G, B values.
+
+ Color(IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(255, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified A, R, G, B values.
+ //
+ // NOTE: R, G, B color values are not premultiplied.
+
+ Color(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(a, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified ARGB values.
+ //
+ // NOTE: R, G, B color components are not premultiplied.
+
+ Color(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ // Extract A, R, G, B components
+
+ BYTE GetAlpha() const
+ {
+ return (BYTE) (Argb >> AlphaShift);
+ }
+
+ BYTE GetA() const
+ {
+ return GetAlpha();
+ }
+
+ BYTE GetRed() const
+ {
+ return (BYTE) (Argb >> RedShift);
+ }
+
+ BYTE GetR() const
+ {
+ return GetRed();
+ }
+
+ BYTE GetGreen() const
+ {
+ return (BYTE) (Argb >> GreenShift);
+ }
+
+ BYTE GetG() const
+ {
+ return GetGreen();
+ }
+
+ BYTE GetBlue() const
+ {
+ return (BYTE) (Argb >> BlueShift);
+ }
+
+ BYTE GetB() const
+ {
+ return GetBlue();
+ }
+
+ // Retrieve ARGB values
+
+ ARGB GetValue() const
+ {
+ return Argb;
+ }
+
+ VOID SetValue(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ VOID SetFromCOLORREF(IN COLORREF rgb)
+ {
+ Argb = MakeARGB(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
+ }
+
+ COLORREF ToCOLORREF() const
+ {
+ return RGB(GetRed(), GetGreen(), GetBlue());
+ }
+
+public:
+
+ // Standard color constants
+ enum
+ {
+ Black = 0xff000000,
+ Silver = 0xffc0c0c0,
+ Gray = 0xff808080,
+ White = 0xffffffff,
+ Maroon = 0xff800000,
+ Red = 0xffff0000,
+ Purple = 0xff800080,
+ Fuchsia = 0xffff00ff,
+ Green = 0xff008000,
+ Lime = 0xff00ff00,
+ Olive = 0xff808000,
+ Yellow = 0xffffff00,
+ Navy = 0xff000080,
+ Blue = 0xff0000ff,
+ Teal = 0xff008080,
+ Aqua = 0xff00ffff
+ };
+
+ // Shift count and bit mask for A, R, G, B components
+ enum
+ {
+ AlphaShift = 24,
+ RedShift = 16,
+ GreenShift = 8,
+ BlueShift = 0
+ };
+
+ enum
+ {
+ AlphaMask = 0xff000000,
+ RedMask = 0x00ff0000,
+ GreenMask = 0x0000ff00,
+ BlueMask = 0x000000ff
+ };
+
+ // Assemble A, R, G, B values into a 32-bit integer
+ static ARGB MakeARGB(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ return (((ARGB) (b) << BlueShift) |
+ ((ARGB) (g) << GreenShift) |
+ ((ARGB) (r) << RedShift) |
+ ((ARGB) (a) << AlphaShift));
+ }
+
+protected:
+
+ ARGB Argb;
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
new file mode 100644
index 0000000000..d1d9ebc534
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
@@ -0,0 +1,63 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColorMatrix.h
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLORMATRIX_H
+#define _GDIPLUSCOLORMATRIX_H
+
+//----------------------------------------------------------------------------
+// Color matrix
+//----------------------------------------------------------------------------
+
+struct ColorMatrix
+{
+ REAL m[5][5];
+};
+
+//----------------------------------------------------------------------------
+// Color Matrix flags
+//----------------------------------------------------------------------------
+
+enum ColorMatrixFlags
+{
+ ColorMatrixFlagsDefault = 0,
+ ColorMatrixFlagsSkipGrays = 1,
+ ColorMatrixFlagsAltGray = 2
+};
+
+//----------------------------------------------------------------------------
+// Color Adjust Type
+//----------------------------------------------------------------------------
+
+enum ColorAdjustType
+{
+ ColorAdjustTypeDefault,
+ ColorAdjustTypeBitmap,
+ ColorAdjustTypeBrush,
+ ColorAdjustTypePen,
+ ColorAdjustTypeText,
+ ColorAdjustTypeCount, // must be immediately after all the individual ones
+ ColorAdjustTypeAny // internal use: for querying if any type has recoloring
+};
+
+//----------------------------------------------------------------------------
+// Color Map
+//----------------------------------------------------------------------------
+
+struct ColorMap
+{
+ Color oldColor;
+ Color newColor;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
new file mode 100644
index 0000000000..92a29c7463
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
@@ -0,0 +1,1252 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusEnums.h
+*
+* Abstract:
+*
+* Various enumeration types
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSENUMS_H
+#define _GDIPLUSENUMS_H
+
+
+//--------------------------------------------------------------------------
+// Default bezier flattening tolerance in device pixels.
+//--------------------------------------------------------------------------
+
+const float FlatnessDefault = 1.0f/4.0f;
+
+//--------------------------------------------------------------------------
+// Graphics and Container State cookies
+//--------------------------------------------------------------------------
+
+typedef UINT GraphicsState;
+typedef UINT GraphicsContainer;
+
+//--------------------------------------------------------------------------
+// Fill mode constants
+//--------------------------------------------------------------------------
+
+enum FillMode
+{
+ FillModeAlternate, // 0
+ FillModeWinding // 1
+};
+
+//--------------------------------------------------------------------------
+// Quality mode constants
+//--------------------------------------------------------------------------
+
+enum QualityMode
+{
+ QualityModeInvalid = -1,
+ QualityModeDefault = 0,
+ QualityModeLow = 1, // for apps that need the best performance
+ QualityModeHigh = 2 // for apps that need the best rendering quality
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing mode constants
+//--------------------------------------------------------------------------
+
+enum CompositingMode
+{
+ CompositingModeSourceOver, // 0
+ CompositingModeSourceCopy // 1
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing quality constants
+//--------------------------------------------------------------------------
+
+enum CompositingQuality
+{
+ CompositingQualityInvalid = QualityModeInvalid,
+ CompositingQualityDefault = QualityModeDefault,
+ CompositingQualityHighSpeed = QualityModeLow,
+ CompositingQualityHighQuality = QualityModeHigh,
+ CompositingQualityGammaCorrected,
+ CompositingQualityAssumeLinear
+};
+
+//--------------------------------------------------------------------------
+// Unit constants
+//--------------------------------------------------------------------------
+
+enum Unit
+{
+ UnitWorld, // 0 -- World coordinate (non-physical unit)
+ UnitDisplay, // 1 -- Variable -- for PageTransform only
+ UnitPixel, // 2 -- Each unit is one device pixel.
+ UnitPoint, // 3 -- Each unit is a printer's point, or 1/72 inch.
+ UnitInch, // 4 -- Each unit is 1 inch.
+ UnitDocument, // 5 -- Each unit is 1/300 inch.
+ UnitMillimeter // 6 -- Each unit is 1 millimeter.
+};
+
+//--------------------------------------------------------------------------
+// MetafileFrameUnit
+//
+// The frameRect for creating a metafile can be specified in any of these
+// units. There is an extra frame unit value (MetafileFrameUnitGdi) so
+// that units can be supplied in the same units that GDI expects for
+// frame rects -- these units are in .01 (1/100ths) millimeter units
+// as defined by GDI.
+//--------------------------------------------------------------------------
+enum MetafileFrameUnit
+{
+ MetafileFrameUnitPixel = UnitPixel,
+ MetafileFrameUnitPoint = UnitPoint,
+ MetafileFrameUnitInch = UnitInch,
+ MetafileFrameUnitDocument = UnitDocument,
+ MetafileFrameUnitMillimeter = UnitMillimeter,
+ MetafileFrameUnitGdi // GDI compatible .01 MM units
+};
+
+//--------------------------------------------------------------------------
+// Coordinate space identifiers
+//--------------------------------------------------------------------------
+
+enum CoordinateSpace
+{
+ CoordinateSpaceWorld, // 0
+ CoordinateSpacePage, // 1
+ CoordinateSpaceDevice // 2
+};
+
+//--------------------------------------------------------------------------
+// Various wrap modes for brushes
+//--------------------------------------------------------------------------
+
+enum WrapMode
+{
+ WrapModeTile, // 0
+ WrapModeTileFlipX, // 1
+ WrapModeTileFlipY, // 2
+ WrapModeTileFlipXY, // 3
+ WrapModeClamp // 4
+};
+
+//--------------------------------------------------------------------------
+// Various hatch styles
+//--------------------------------------------------------------------------
+
+enum HatchStyle
+{
+ HatchStyleHorizontal, // 0
+ HatchStyleVertical, // 1
+ HatchStyleForwardDiagonal, // 2
+ HatchStyleBackwardDiagonal, // 3
+ HatchStyleCross, // 4
+ HatchStyleDiagonalCross, // 5
+ HatchStyle05Percent, // 6
+ HatchStyle10Percent, // 7
+ HatchStyle20Percent, // 8
+ HatchStyle25Percent, // 9
+ HatchStyle30Percent, // 10
+ HatchStyle40Percent, // 11
+ HatchStyle50Percent, // 12
+ HatchStyle60Percent, // 13
+ HatchStyle70Percent, // 14
+ HatchStyle75Percent, // 15
+ HatchStyle80Percent, // 16
+ HatchStyle90Percent, // 17
+ HatchStyleLightDownwardDiagonal, // 18
+ HatchStyleLightUpwardDiagonal, // 19
+ HatchStyleDarkDownwardDiagonal, // 20
+ HatchStyleDarkUpwardDiagonal, // 21
+ HatchStyleWideDownwardDiagonal, // 22
+ HatchStyleWideUpwardDiagonal, // 23
+ HatchStyleLightVertical, // 24
+ HatchStyleLightHorizontal, // 25
+ HatchStyleNarrowVertical, // 26
+ HatchStyleNarrowHorizontal, // 27
+ HatchStyleDarkVertical, // 28
+ HatchStyleDarkHorizontal, // 29
+ HatchStyleDashedDownwardDiagonal, // 30
+ HatchStyleDashedUpwardDiagonal, // 31
+ HatchStyleDashedHorizontal, // 32
+ HatchStyleDashedVertical, // 33
+ HatchStyleSmallConfetti, // 34
+ HatchStyleLargeConfetti, // 35
+ HatchStyleZigZag, // 36
+ HatchStyleWave, // 37
+ HatchStyleDiagonalBrick, // 38
+ HatchStyleHorizontalBrick, // 39
+ HatchStyleWeave, // 40
+ HatchStylePlaid, // 41
+ HatchStyleDivot, // 42
+ HatchStyleDottedGrid, // 43
+ HatchStyleDottedDiamond, // 44
+ HatchStyleShingle, // 45
+ HatchStyleTrellis, // 46
+ HatchStyleSphere, // 47
+ HatchStyleSmallGrid, // 48
+ HatchStyleSmallCheckerBoard, // 49
+ HatchStyleLargeCheckerBoard, // 50
+ HatchStyleOutlinedDiamond, // 51
+ HatchStyleSolidDiamond, // 52
+
+ HatchStyleTotal, // must be after all unique hatch styles
+
+ HatchStyleLargeGrid = HatchStyleCross, // 4 an alias for the cross style
+
+ HatchStyleMin = HatchStyleHorizontal,
+ HatchStyleMax = HatchStyleTotal - 1,
+};
+
+//--------------------------------------------------------------------------
+// Dash style constants
+//--------------------------------------------------------------------------
+
+enum DashStyle
+{
+ DashStyleSolid, // 0
+ DashStyleDash, // 1
+ DashStyleDot, // 2
+ DashStyleDashDot, // 3
+ DashStyleDashDotDot, // 4
+ DashStyleCustom // 5
+};
+
+//--------------------------------------------------------------------------
+// Dash cap constants
+//--------------------------------------------------------------------------
+
+enum DashCap
+{
+ DashCapFlat = 0,
+ DashCapRound = 2,
+ DashCapTriangle = 3
+};
+
+//--------------------------------------------------------------------------
+// Line cap constants (only the lowest 8 bits are used).
+//--------------------------------------------------------------------------
+
+enum LineCap
+{
+ LineCapFlat = 0,
+ LineCapSquare = 1,
+ LineCapRound = 2,
+ LineCapTriangle = 3,
+
+ LineCapNoAnchor = 0x10, // corresponds to flat cap
+ LineCapSquareAnchor = 0x11, // corresponds to square cap
+ LineCapRoundAnchor = 0x12, // corresponds to round cap
+ LineCapDiamondAnchor = 0x13, // corresponds to triangle cap
+ LineCapArrowAnchor = 0x14, // no correspondence
+
+ LineCapCustom = 0xff, // custom cap
+
+ LineCapAnchorMask = 0xf0 // mask to check for anchor or not.
+};
+
+//--------------------------------------------------------------------------
+// Custom Line cap type constants
+//--------------------------------------------------------------------------
+
+enum CustomLineCapType
+{
+ CustomLineCapTypeDefault = 0,
+ CustomLineCapTypeAdjustableArrow = 1
+};
+
+//--------------------------------------------------------------------------
+// Line join constants
+//--------------------------------------------------------------------------
+
+enum LineJoin
+{
+ LineJoinMiter = 0,
+ LineJoinBevel = 1,
+ LineJoinRound = 2,
+ LineJoinMiterClipped = 3
+};
+
+//--------------------------------------------------------------------------
+// Path point types (only the lowest 8 bits are used.)
+// The lowest 3 bits are interpreted as point type
+// The higher 5 bits are reserved for flags.
+//--------------------------------------------------------------------------
+
+enum PathPointType
+{
+ PathPointTypeStart = 0, // move
+ PathPointTypeLine = 1, // line
+ PathPointTypeBezier = 3, // default Beizer (= cubic Bezier)
+ PathPointTypePathTypeMask = 0x07, // type mask (lowest 3 bits).
+ PathPointTypeDashMode = 0x10, // currently in dash mode.
+ PathPointTypePathMarker = 0x20, // a marker for the path.
+ PathPointTypeCloseSubpath = 0x80, // closed flag
+
+ // Path types used for advanced path.
+
+ PathPointTypeBezier2 = 2, // quadratic Beizer
+ PathPointTypeBezier3 = 3, // cubic Bezier
+ PathPointTypeBezier4 = 4, // quartic (4th order) Beizer
+ PathPointTypeBezier5 = 5, // quintic (5th order) Bezier
+ PathPointTypeBezier6 = 6 // hexaic (6th order) Bezier
+};
+
+
+//--------------------------------------------------------------------------
+// WarpMode constants
+//--------------------------------------------------------------------------
+
+enum WarpMode
+{
+ WarpModePerspective, // 0
+ WarpModeBilinear // 1
+};
+
+//--------------------------------------------------------------------------
+// LineGradient Mode
+//--------------------------------------------------------------------------
+
+enum LinearGradientMode
+{
+ LinearGradientModeHorizontal, // 0
+ LinearGradientModeVertical, // 1
+ LinearGradientModeForwardDiagonal, // 2
+ LinearGradientModeBackwardDiagonal // 3
+};
+
+//--------------------------------------------------------------------------
+// Region Comine Modes
+//--------------------------------------------------------------------------
+
+enum CombineMode
+{
+ CombineModeReplace, // 0
+ CombineModeIntersect, // 1
+ CombineModeUnion, // 2
+ CombineModeXor, // 3
+ CombineModeExclude, // 4
+ CombineModeComplement // 5 (does exclude from)
+};
+
+//--------------------------------------------------------------------------
+ // Image types
+//--------------------------------------------------------------------------
+
+enum ImageType
+{
+ ImageTypeUnknown, // 0
+ ImageTypeBitmap, // 1
+ ImageTypeMetafile // 2
+};
+
+//--------------------------------------------------------------------------
+// Interpolation modes
+//--------------------------------------------------------------------------
+
+enum InterpolationMode
+{
+ InterpolationModeInvalid = QualityModeInvalid,
+ InterpolationModeDefault = QualityModeDefault,
+ InterpolationModeLowQuality = QualityModeLow,
+ InterpolationModeHighQuality = QualityModeHigh,
+ InterpolationModeBilinear,
+ InterpolationModeBicubic,
+ InterpolationModeNearestNeighbor,
+ InterpolationModeHighQualityBilinear,
+ InterpolationModeHighQualityBicubic
+};
+
+//--------------------------------------------------------------------------
+// Pen types
+//--------------------------------------------------------------------------
+enum PenAlignment
+{
+ PenAlignmentCenter = 0,
+ PenAlignmentInset = 1,
+ PenAlignmentOutset = 2,
+ PenAlignmentLeft = 3,
+ PenAlignmentRight = 4
+};
+
+//--------------------------------------------------------------------------
+// Brush types
+//--------------------------------------------------------------------------
+
+enum BrushType
+{
+ BrushTypeSolidColor = 0,
+ BrushTypeHatchFill = 1,
+ BrushTypeTextureFill = 2,
+ BrushTypePathGradient = 3,
+ BrushTypeLinearGradient = 4
+};
+
+//--------------------------------------------------------------------------
+// Pen's Fill types
+//--------------------------------------------------------------------------
+
+enum PenType
+{
+ PenTypeSolidColor = BrushTypeSolidColor,
+ PenTypeHatchFill = BrushTypeHatchFill,
+ PenTypeTextureFill = BrushTypeTextureFill,
+ PenTypePathGradient = BrushTypePathGradient,
+ PenTypeLinearGradient = BrushTypeLinearGradient,
+ PenTypeUnknown = -1
+};
+
+//--------------------------------------------------------------------------
+// Matrix Order
+//--------------------------------------------------------------------------
+
+enum MatrixOrder
+{
+ MatrixOrderPrepend = 0,
+ MatrixOrderAppend = 1
+};
+
+//--------------------------------------------------------------------------
+// Generic font families
+//--------------------------------------------------------------------------
+
+enum GenericFontFamily
+{
+ GenericFontFamilySerif,
+ GenericFontFamilySansSerif,
+ GenericFontFamilyMonospace
+
+};
+
+//--------------------------------------------------------------------------
+// FontStyle: face types and common styles
+//--------------------------------------------------------------------------
+
+// These should probably be flags
+
+// Must have:
+// Regular = 0
+// Bold = 1
+// Italic = 2
+// BoldItalic = 3
+
+enum FontStyle
+{
+ FontStyleRegular = 0,
+ FontStyleBold = 1,
+ FontStyleItalic = 2,
+ FontStyleBoldItalic = 3,
+ FontStyleUnderline = 4,
+ FontStyleStrikeout = 8
+};
+
+//---------------------------------------------------------------------------
+// Smoothing Mode
+//---------------------------------------------------------------------------
+
+enum SmoothingMode
+{
+ SmoothingModeInvalid = QualityModeInvalid,
+ SmoothingModeDefault = QualityModeDefault,
+ SmoothingModeHighSpeed = QualityModeLow,
+ SmoothingModeHighQuality = QualityModeHigh,
+ SmoothingModeNone,
+ SmoothingModeAntiAlias
+};
+
+//---------------------------------------------------------------------------
+// Pixel Format Mode
+//---------------------------------------------------------------------------
+
+enum PixelOffsetMode
+{
+ PixelOffsetModeInvalid = QualityModeInvalid,
+ PixelOffsetModeDefault = QualityModeDefault,
+ PixelOffsetModeHighSpeed = QualityModeLow,
+ PixelOffsetModeHighQuality = QualityModeHigh,
+ PixelOffsetModeNone, // no pixel offset
+ PixelOffsetModeHalf // offset by -0.5, -0.5 for fast anti-alias perf
+};
+
+//---------------------------------------------------------------------------
+// Text Rendering Hint
+//---------------------------------------------------------------------------
+
+enum TextRenderingHint
+{
+#ifdef DCR_USE_NEW_186764
+ TextRenderingHintSystemDefault = 0, // Glyph with system default rendering hint
+ TextRenderingHintSingleBitPerPixelGridFit, // Glyph bitmap with hinting
+#else
+ TextRenderingHintSingleBitPerPixelGridFit = 0, // Glyph bitmap with hinting
+#endif // DCR_USE_NEW_186764
+ TextRenderingHintSingleBitPerPixel, // Glyph bitmap without hinting
+ TextRenderingHintAntiAliasGridFit, // Glyph anti-alias bitmap with hinting
+ TextRenderingHintAntiAlias, // Glyph anti-alias bitmap without hinting
+ TextRenderingHintClearTypeGridFit // Glyph CT bitmap with hinting
+};
+
+//---------------------------------------------------------------------------
+// Metafile Types
+//---------------------------------------------------------------------------
+enum MetafileType
+{
+ MetafileTypeInvalid, // Invalid metafile
+ MetafileTypeWmf, // Standard WMF
+ MetafileTypeWmfAldus, // Aldus Placeable Metafile format
+ MetafileTypeEmf, // EMF (not EMF+)
+ MetafileTypeEmfPlusOnly, // EMF+ without dual, down-level records
+ MetafileTypeEmfPlusDual // EMF+ with dual, down-level records
+};
+
+// Specifies the type of EMF to record
+enum EmfType
+{
+ EmfTypeEmfOnly = MetafileTypeEmf, // no EMF+, only EMF
+ EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly, // no EMF, only EMF+
+ EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual // both EMF+ and EMF
+};
+
+// All persistent objects must have a type listed here
+enum ObjectType
+{
+ ObjectTypeInvalid,
+ ObjectTypeBrush,
+ ObjectTypePen,
+ ObjectTypePath,
+ ObjectTypeRegion,
+ ObjectTypeImage,
+ ObjectTypeFont,
+ ObjectTypeStringFormat,
+ ObjectTypeImageAttributes,
+ ObjectTypeCustomLineCap,
+
+ ObjectTypeMax = ObjectTypeCustomLineCap,
+ ObjectTypeMin = ObjectTypeBrush
+};
+
+inline BOOL
+ObjectTypeIsValid(
+ ObjectType type
+ )
+{
+ return ((type >= ObjectTypeMin) && (type <= ObjectTypeMax));
+}
+
+//---------------------------------------------------------------------------
+// EMF+ Records
+//---------------------------------------------------------------------------
+
+// We have to change the WMF record numbers so that they don't conflict with
+// the EMF and EMF+ record numbers.
+enum EmfPlusRecordType;
+#define GDIP_EMFPLUS_RECORD_BASE 0x00004000
+#define GDIP_WMF_RECORD_BASE 0x00010000
+#define GDIP_WMF_RECORD_TO_EMFPLUS(n) ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))
+#define GDIP_EMFPLUS_RECORD_TO_WMF(n) ((n) & (~GDIP_WMF_RECORD_BASE))
+#define GDIP_IS_WMF_RECORDTYPE(n) (((n) & GDIP_WMF_RECORD_BASE) != 0)
+
+enum EmfPlusRecordType
+{
+ // Since we have to enumerate GDI records right along with GDI+ records,
+ // we list all the GDI records here so that they can be part of the
+ // same enumeration type which is used in the enumeration callback.
+
+ WmfRecordTypeSetBkColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKCOLOR),
+ WmfRecordTypeSetBkMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKMODE),
+ WmfRecordTypeSetMapMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPMODE),
+ WmfRecordTypeSetROP2 = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETROP2),
+ WmfRecordTypeSetRelAbs = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETRELABS),
+ WmfRecordTypeSetPolyFillMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPOLYFILLMODE),
+ WmfRecordTypeSetStretchBltMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETSTRETCHBLTMODE),
+ WmfRecordTypeSetTextCharExtra = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCHAREXTRA),
+ WmfRecordTypeSetTextColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCOLOR),
+ WmfRecordTypeSetTextJustification = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTJUSTIFICATION),
+ WmfRecordTypeSetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWORG),
+ WmfRecordTypeSetWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWEXT),
+ WmfRecordTypeSetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTORG),
+ WmfRecordTypeSetViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTEXT),
+ WmfRecordTypeOffsetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETWINDOWORG),
+ WmfRecordTypeScaleWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEWINDOWEXT),
+ WmfRecordTypeOffsetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETVIEWPORTORG),
+ WmfRecordTypeScaleViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEVIEWPORTEXT),
+ WmfRecordTypeLineTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_LINETO),
+ WmfRecordTypeMoveTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_MOVETO),
+ WmfRecordTypeExcludeClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXCLUDECLIPRECT),
+ WmfRecordTypeIntersectClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_INTERSECTCLIPRECT),
+ WmfRecordTypeArc = GDIP_WMF_RECORD_TO_EMFPLUS(META_ARC),
+ WmfRecordTypeEllipse = GDIP_WMF_RECORD_TO_EMFPLUS(META_ELLIPSE),
+ WmfRecordTypeFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_FLOODFILL),
+ WmfRecordTypePie = GDIP_WMF_RECORD_TO_EMFPLUS(META_PIE),
+ WmfRecordTypeRectangle = GDIP_WMF_RECORD_TO_EMFPLUS(META_RECTANGLE),
+ WmfRecordTypeRoundRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_ROUNDRECT),
+ WmfRecordTypePatBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_PATBLT),
+ WmfRecordTypeSaveDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_SAVEDC),
+ WmfRecordTypeSetPixel = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPIXEL),
+ WmfRecordTypeOffsetClipRgn = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETCLIPRGN),
+ WmfRecordTypeTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_TEXTOUT),
+ WmfRecordTypeBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_BITBLT),
+ WmfRecordTypeStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHBLT),
+ WmfRecordTypePolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYGON),
+ WmfRecordTypePolyline = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYLINE),
+ WmfRecordTypeEscape = GDIP_WMF_RECORD_TO_EMFPLUS(META_ESCAPE),
+ WmfRecordTypeRestoreDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESTOREDC),
+ WmfRecordTypeFillRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FILLREGION),
+ WmfRecordTypeFrameRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FRAMEREGION),
+ WmfRecordTypeInvertRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_INVERTREGION),
+ WmfRecordTypePaintRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_PAINTREGION),
+ WmfRecordTypeSelectClipRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTCLIPREGION),
+ WmfRecordTypeSelectObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTOBJECT),
+ WmfRecordTypeSetTextAlign = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTALIGN),
+ WmfRecordTypeDrawText = GDIP_WMF_RECORD_TO_EMFPLUS(0x062F), // META_DRAWTEXT
+ WmfRecordTypeChord = GDIP_WMF_RECORD_TO_EMFPLUS(META_CHORD),
+ WmfRecordTypeSetMapperFlags = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPPERFLAGS),
+ WmfRecordTypeExtTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTTEXTOUT),
+ WmfRecordTypeSetDIBToDev = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETDIBTODEV),
+ WmfRecordTypeSelectPalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTPALETTE),
+ WmfRecordTypeRealizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_REALIZEPALETTE),
+ WmfRecordTypeAnimatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_ANIMATEPALETTE),
+ WmfRecordTypeSetPalEntries = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPALENTRIES),
+ WmfRecordTypePolyPolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYPOLYGON),
+ WmfRecordTypeResizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESIZEPALETTE),
+ WmfRecordTypeDIBBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBBITBLT),
+ WmfRecordTypeDIBStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBSTRETCHBLT),
+ WmfRecordTypeDIBCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBCREATEPATTERNBRUSH),
+ WmfRecordTypeStretchDIB = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHDIB),
+ WmfRecordTypeExtFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTFLOODFILL),
+ WmfRecordTypeSetLayout = GDIP_WMF_RECORD_TO_EMFPLUS(0x0149), // META_SETLAYOUT
+ WmfRecordTypeResetDC = GDIP_WMF_RECORD_TO_EMFPLUS(0x014C), // META_RESETDC
+ WmfRecordTypeStartDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x014D), // META_STARTDOC
+ WmfRecordTypeStartPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x004F), // META_STARTPAGE
+ WmfRecordTypeEndPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x0050), // META_ENDPAGE
+ WmfRecordTypeAbortDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x0052), // META_ABORTDOC
+ WmfRecordTypeEndDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x005E), // META_ENDDOC
+ WmfRecordTypeDeleteObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_DELETEOBJECT),
+ WmfRecordTypeCreatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPALETTE),
+ WmfRecordTypeCreateBrush = GDIP_WMF_RECORD_TO_EMFPLUS(0x00F8), // META_CREATEBRUSH
+ WmfRecordTypeCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPATTERNBRUSH),
+ WmfRecordTypeCreatePenIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPENINDIRECT),
+ WmfRecordTypeCreateFontIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEFONTINDIRECT),
+ WmfRecordTypeCreateBrushIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEBRUSHINDIRECT),
+ WmfRecordTypeCreateBitmapIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(0x02FD), // META_CREATEBITMAPINDIRECT
+ WmfRecordTypeCreateBitmap = GDIP_WMF_RECORD_TO_EMFPLUS(0x06FE), // META_CREATEBITMAP
+ WmfRecordTypeCreateRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEREGION),
+
+ EmfRecordTypeHeader = EMR_HEADER,
+ EmfRecordTypePolyBezier = EMR_POLYBEZIER,
+ EmfRecordTypePolygon = EMR_POLYGON,
+ EmfRecordTypePolyline = EMR_POLYLINE,
+ EmfRecordTypePolyBezierTo = EMR_POLYBEZIERTO,
+ EmfRecordTypePolyLineTo = EMR_POLYLINETO,
+ EmfRecordTypePolyPolyline = EMR_POLYPOLYLINE,
+ EmfRecordTypePolyPolygon = EMR_POLYPOLYGON,
+ EmfRecordTypeSetWindowExtEx = EMR_SETWINDOWEXTEX,
+ EmfRecordTypeSetWindowOrgEx = EMR_SETWINDOWORGEX,
+ EmfRecordTypeSetViewportExtEx = EMR_SETVIEWPORTEXTEX,
+ EmfRecordTypeSetViewportOrgEx = EMR_SETVIEWPORTORGEX,
+ EmfRecordTypeSetBrushOrgEx = EMR_SETBRUSHORGEX,
+ EmfRecordTypeEOF = EMR_EOF,
+ EmfRecordTypeSetPixelV = EMR_SETPIXELV,
+ EmfRecordTypeSetMapperFlags = EMR_SETMAPPERFLAGS,
+ EmfRecordTypeSetMapMode = EMR_SETMAPMODE,
+ EmfRecordTypeSetBkMode = EMR_SETBKMODE,
+ EmfRecordTypeSetPolyFillMode = EMR_SETPOLYFILLMODE,
+ EmfRecordTypeSetROP2 = EMR_SETROP2,
+ EmfRecordTypeSetStretchBltMode = EMR_SETSTRETCHBLTMODE,
+ EmfRecordTypeSetTextAlign = EMR_SETTEXTALIGN,
+ EmfRecordTypeSetColorAdjustment = EMR_SETCOLORADJUSTMENT,
+ EmfRecordTypeSetTextColor = EMR_SETTEXTCOLOR,
+ EmfRecordTypeSetBkColor = EMR_SETBKCOLOR,
+ EmfRecordTypeOffsetClipRgn = EMR_OFFSETCLIPRGN,
+ EmfRecordTypeMoveToEx = EMR_MOVETOEX,
+ EmfRecordTypeSetMetaRgn = EMR_SETMETARGN,
+ EmfRecordTypeExcludeClipRect = EMR_EXCLUDECLIPRECT,
+ EmfRecordTypeIntersectClipRect = EMR_INTERSECTCLIPRECT,
+ EmfRecordTypeScaleViewportExtEx = EMR_SCALEVIEWPORTEXTEX,
+ EmfRecordTypeScaleWindowExtEx = EMR_SCALEWINDOWEXTEX,
+ EmfRecordTypeSaveDC = EMR_SAVEDC,
+ EmfRecordTypeRestoreDC = EMR_RESTOREDC,
+ EmfRecordTypeSetWorldTransform = EMR_SETWORLDTRANSFORM,
+ EmfRecordTypeModifyWorldTransform = EMR_MODIFYWORLDTRANSFORM,
+ EmfRecordTypeSelectObject = EMR_SELECTOBJECT,
+ EmfRecordTypeCreatePen = EMR_CREATEPEN,
+ EmfRecordTypeCreateBrushIndirect = EMR_CREATEBRUSHINDIRECT,
+ EmfRecordTypeDeleteObject = EMR_DELETEOBJECT,
+ EmfRecordTypeAngleArc = EMR_ANGLEARC,
+ EmfRecordTypeEllipse = EMR_ELLIPSE,
+ EmfRecordTypeRectangle = EMR_RECTANGLE,
+ EmfRecordTypeRoundRect = EMR_ROUNDRECT,
+ EmfRecordTypeArc = EMR_ARC,
+ EmfRecordTypeChord = EMR_CHORD,
+ EmfRecordTypePie = EMR_PIE,
+ EmfRecordTypeSelectPalette = EMR_SELECTPALETTE,
+ EmfRecordTypeCreatePalette = EMR_CREATEPALETTE,
+ EmfRecordTypeSetPaletteEntries = EMR_SETPALETTEENTRIES,
+ EmfRecordTypeResizePalette = EMR_RESIZEPALETTE,
+ EmfRecordTypeRealizePalette = EMR_REALIZEPALETTE,
+ EmfRecordTypeExtFloodFill = EMR_EXTFLOODFILL,
+ EmfRecordTypeLineTo = EMR_LINETO,
+ EmfRecordTypeArcTo = EMR_ARCTO,
+ EmfRecordTypePolyDraw = EMR_POLYDRAW,
+ EmfRecordTypeSetArcDirection = EMR_SETARCDIRECTION,
+ EmfRecordTypeSetMiterLimit = EMR_SETMITERLIMIT,
+ EmfRecordTypeBeginPath = EMR_BEGINPATH,
+ EmfRecordTypeEndPath = EMR_ENDPATH,
+ EmfRecordTypeCloseFigure = EMR_CLOSEFIGURE,
+ EmfRecordTypeFillPath = EMR_FILLPATH,
+ EmfRecordTypeStrokeAndFillPath = EMR_STROKEANDFILLPATH,
+ EmfRecordTypeStrokePath = EMR_STROKEPATH,
+ EmfRecordTypeFlattenPath = EMR_FLATTENPATH,
+ EmfRecordTypeWidenPath = EMR_WIDENPATH,
+ EmfRecordTypeSelectClipPath = EMR_SELECTCLIPPATH,
+ EmfRecordTypeAbortPath = EMR_ABORTPATH,
+ EmfRecordTypeReserved_069 = 69, // Not Used
+ EmfRecordTypeGdiComment = EMR_GDICOMMENT,
+ EmfRecordTypeFillRgn = EMR_FILLRGN,
+ EmfRecordTypeFrameRgn = EMR_FRAMERGN,
+ EmfRecordTypeInvertRgn = EMR_INVERTRGN,
+ EmfRecordTypePaintRgn = EMR_PAINTRGN,
+ EmfRecordTypeExtSelectClipRgn = EMR_EXTSELECTCLIPRGN,
+ EmfRecordTypeBitBlt = EMR_BITBLT,
+ EmfRecordTypeStretchBlt = EMR_STRETCHBLT,
+ EmfRecordTypeMaskBlt = EMR_MASKBLT,
+ EmfRecordTypePlgBlt = EMR_PLGBLT,
+ EmfRecordTypeSetDIBitsToDevice = EMR_SETDIBITSTODEVICE,
+ EmfRecordTypeStretchDIBits = EMR_STRETCHDIBITS,
+ EmfRecordTypeExtCreateFontIndirect = EMR_EXTCREATEFONTINDIRECTW,
+ EmfRecordTypeExtTextOutA = EMR_EXTTEXTOUTA,
+ EmfRecordTypeExtTextOutW = EMR_EXTTEXTOUTW,
+ EmfRecordTypePolyBezier16 = EMR_POLYBEZIER16,
+ EmfRecordTypePolygon16 = EMR_POLYGON16,
+ EmfRecordTypePolyline16 = EMR_POLYLINE16,
+ EmfRecordTypePolyBezierTo16 = EMR_POLYBEZIERTO16,
+ EmfRecordTypePolylineTo16 = EMR_POLYLINETO16,
+ EmfRecordTypePolyPolyline16 = EMR_POLYPOLYLINE16,
+ EmfRecordTypePolyPolygon16 = EMR_POLYPOLYGON16,
+ EmfRecordTypePolyDraw16 = EMR_POLYDRAW16,
+ EmfRecordTypeCreateMonoBrush = EMR_CREATEMONOBRUSH,
+ EmfRecordTypeCreateDIBPatternBrushPt = EMR_CREATEDIBPATTERNBRUSHPT,
+ EmfRecordTypeExtCreatePen = EMR_EXTCREATEPEN,
+ EmfRecordTypePolyTextOutA = EMR_POLYTEXTOUTA,
+ EmfRecordTypePolyTextOutW = EMR_POLYTEXTOUTW,
+ EmfRecordTypeSetICMMode = 98, // EMR_SETICMMODE,
+ EmfRecordTypeCreateColorSpace = 99, // EMR_CREATECOLORSPACE,
+ EmfRecordTypeSetColorSpace = 100, // EMR_SETCOLORSPACE,
+ EmfRecordTypeDeleteColorSpace = 101, // EMR_DELETECOLORSPACE,
+ EmfRecordTypeGLSRecord = 102, // EMR_GLSRECORD,
+ EmfRecordTypeGLSBoundedRecord = 103, // EMR_GLSBOUNDEDRECORD,
+ EmfRecordTypePixelFormat = 104, // EMR_PIXELFORMAT,
+ EmfRecordTypeDrawEscape = 105, // EMR_RESERVED_105,
+ EmfRecordTypeExtEscape = 106, // EMR_RESERVED_106,
+ EmfRecordTypeStartDoc = 107, // EMR_RESERVED_107,
+ EmfRecordTypeSmallTextOut = 108, // EMR_RESERVED_108,
+ EmfRecordTypeForceUFIMapping = 109, // EMR_RESERVED_109,
+ EmfRecordTypeNamedEscape = 110, // EMR_RESERVED_110,
+ EmfRecordTypeColorCorrectPalette = 111, // EMR_COLORCORRECTPALETTE,
+ EmfRecordTypeSetICMProfileA = 112, // EMR_SETICMPROFILEA,
+ EmfRecordTypeSetICMProfileW = 113, // EMR_SETICMPROFILEW,
+ EmfRecordTypeAlphaBlend = 114, // EMR_ALPHABLEND,
+ EmfRecordTypeSetLayout = 115, // EMR_SETLAYOUT,
+ EmfRecordTypeTransparentBlt = 116, // EMR_TRANSPARENTBLT,
+ EmfRecordTypeReserved_117 = 117, // Not Used
+ EmfRecordTypeGradientFill = 118, // EMR_GRADIENTFILL,
+ EmfRecordTypeSetLinkedUFIs = 119, // EMR_RESERVED_119,
+ EmfRecordTypeSetTextJustification = 120, // EMR_RESERVED_120,
+ EmfRecordTypeColorMatchToTargetW = 121, // EMR_COLORMATCHTOTARGETW,
+ EmfRecordTypeCreateColorSpaceW = 122, // EMR_CREATECOLORSPACEW,
+ EmfRecordTypeMax = 122,
+ EmfRecordTypeMin = 1,
+
+ // That is the END of the GDI EMF records.
+
+ // Now we start the list of EMF+ records. We leave quite
+ // a bit of room here for the addition of any new GDI
+ // records that may be added later.
+
+ EmfPlusRecordTypeInvalid = GDIP_EMFPLUS_RECORD_BASE,
+ EmfPlusRecordTypeHeader,
+ EmfPlusRecordTypeEndOfFile,
+
+ EmfPlusRecordTypeComment,
+
+ EmfPlusRecordTypeGetDC, // the application grabbed the metafile dc
+
+ EmfPlusRecordTypeMultiFormatStart,
+ EmfPlusRecordTypeMultiFormatSection,
+ EmfPlusRecordTypeMultiFormatEnd,
+
+ // For all persistent objects
+ EmfPlusRecordTypeObject, // brush,pen,path,region,image,font,string-format
+
+ // Drawing Records
+ EmfPlusRecordTypeClear,
+ EmfPlusRecordTypeFillRects,
+ EmfPlusRecordTypeDrawRects,
+ EmfPlusRecordTypeFillPolygon,
+ EmfPlusRecordTypeDrawLines,
+ EmfPlusRecordTypeFillEllipse,
+ EmfPlusRecordTypeDrawEllipse,
+ EmfPlusRecordTypeFillPie,
+ EmfPlusRecordTypeDrawPie,
+ EmfPlusRecordTypeDrawArc,
+ EmfPlusRecordTypeFillRegion,
+ EmfPlusRecordTypeFillPath,
+ EmfPlusRecordTypeDrawPath,
+ EmfPlusRecordTypeFillClosedCurve,
+ EmfPlusRecordTypeDrawClosedCurve,
+ EmfPlusRecordTypeDrawCurve,
+ EmfPlusRecordTypeDrawBeziers,
+ EmfPlusRecordTypeDrawImage,
+ EmfPlusRecordTypeDrawImagePoints,
+ EmfPlusRecordTypeDrawString,
+
+ // Graphics State Records
+ EmfPlusRecordTypeSetRenderingOrigin,
+ EmfPlusRecordTypeSetAntiAliasMode,
+ EmfPlusRecordTypeSetTextRenderingHint,
+#ifdef DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetTextContrast,
+#else
+ EmfPlusRecordTypeSetGammaValue,
+#endif // DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetInterpolationMode,
+ EmfPlusRecordTypeSetPixelOffsetMode,
+ EmfPlusRecordTypeSetCompositingMode,
+ EmfPlusRecordTypeSetCompositingQuality,
+ EmfPlusRecordTypeSave,
+ EmfPlusRecordTypeRestore,
+ EmfPlusRecordTypeBeginContainer,
+ EmfPlusRecordTypeBeginContainerNoParams,
+ EmfPlusRecordTypeEndContainer,
+ EmfPlusRecordTypeSetWorldTransform,
+ EmfPlusRecordTypeResetWorldTransform,
+ EmfPlusRecordTypeMultiplyWorldTransform,
+ EmfPlusRecordTypeTranslateWorldTransform,
+ EmfPlusRecordTypeScaleWorldTransform,
+ EmfPlusRecordTypeRotateWorldTransform,
+ EmfPlusRecordTypeSetPageTransform,
+ EmfPlusRecordTypeResetClip,
+ EmfPlusRecordTypeSetClipRect,
+ EmfPlusRecordTypeSetClipPath,
+ EmfPlusRecordTypeSetClipRegion,
+ EmfPlusRecordTypeOffsetClip,
+
+ // New record types must be added here (at the end) -- do not add above,
+ // since that will invalidate previous metafiles!
+ EmfPlusRecordTypeDrawDriverString,
+
+ // Have this here so you don't need to keep changing the value of
+ // EmfPlusRecordTypeMax every time you add a new record.
+
+ EmfPlusRecordTotal,
+
+ EmfPlusRecordTypeMax = EmfPlusRecordTotal-1,
+ EmfPlusRecordTypeMin = EmfPlusRecordTypeHeader,
+};
+
+//---------------------------------------------------------------------------
+// StringFormatFlags
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// String format flags
+//
+// DirectionRightToLeft - For horizontal text, the reading order is
+// right to left. This value is called
+// the base embedding level by the Unicode
+// bidirectional engine.
+// For vertical text, columns are read from
+// right to left.
+// By default, horizontal or vertical text is
+// read from left to right.
+//
+// DirectionVertical - Individual lines of text are vertical. In
+// each line, characters progress from top to
+// bottom.
+// By default, lines of text are horizontal,
+// each new line below the previous line.
+//
+// NoFitBlackBox - Allows parts of glyphs to overhang the
+// bounding rectangle.
+// By default glyphs are first aligned
+// inside the margines, then any glyphs which
+// still overhang the bounding box are
+// repositioned to avoid any overhang.
+// For example when an italic
+// lower case letter f in a font such as
+// Garamond is aligned at the far left of a
+// rectangle, the lower part of the f will
+// reach slightly further left than the left
+// edge of the rectangle. Setting this flag
+// will ensure the character aligns visually
+// with the lines above and below, but may
+// cause some pixels outside the formatting
+// rectangle to be clipped or painted.
+//
+#ifndef DCR_USE_NEW_137252
+// NumberContextArabic - Causes any initial numeric in the string to
+// be analysed for bidirection layout as if
+// it was preceeded by Arabic text.
+//
+// DisableKashidaJustification - Arabic text will not be justified by the
+// insertion of kashidas (i.e. extending the
+// joining line between characters). Instead
+// Arabic script will be justified by the
+// widening of the whitespace between words.
+//
+#endif
+// DisplayFormatControl - Causes control characters such as the
+// left-to-right mark to be shown in the
+// output with a representative glyph.
+//
+#ifndef DCR_USE_NEW_137252
+// DisableKerning - Disables Truetype and OpenType kerning.
+//
+// DisableLigatures - Disables Truetype and OpenType ligatures.
+//
+// LayoutLegacyBidi - Causes the bidirection algorithm to use
+// slightly different classifications for
+// '+', '-' and '/' that make their layout
+// much closer to that expected by files
+// generated in Windows or by Windows
+// applications.
+//
+// NoChanges - A text imager created with this flag set
+// does not support those APIs that change
+// it's contents or formatting, but for most
+// simple text will be significantly faster in
+// performing measurement and drawing
+// functions.
+//
+#endif
+// NoFontFallback - Disables fallback to alternate fonts for
+// characters not supported in the requested
+// font. Any missing characters will be
+// be displayed with the fonts missing glyph,
+// usually an open square.
+//
+// NoWrap - Disables wrapping of text between lines
+// when formatting within a rectangle.
+// NoWrap is implied when a point is passed
+// instead of a rectangle, or when the
+// specified rectangle has a zero line length.
+//
+// NoClip - By default text is clipped to the
+// formatting rectangle. Setting NoClip
+// allows overhanging pixels to affect the
+// device outside the formatting rectangle.
+// Pixels at the end of the line may be
+// affected if the glyphs overhang their
+// cells, and either the NoFitBlackBox flag
+// has been set, or the glyph extends to far
+// to be fitted.
+// Pixels above/before the first line or
+// below/after the last line may be affected
+// if the glyphs extend beyond their cell
+// ascent / descent. This can occur rarely
+// with unusual diacritic mark combinations.
+
+//---------------------------------------------------------------------------
+
+enum StringFormatFlags
+{
+ StringFormatFlagsDirectionRightToLeft = 0x00000001,
+ StringFormatFlagsDirectionVertical = 0x00000002,
+ StringFormatFlagsNoFitBlackBox = 0x00000004,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsNumberContextArabic = 0x00000008,
+ StringFormatFlagsDisableKashidaJustification = 0x00000010,
+#endif
+ StringFormatFlagsDisplayFormatControl = 0x00000020,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsDisableKerning = 0x00000040,
+ StringFormatFlagsDisableLigatures = 0x00000080,
+ StringFormatFlagsLayoutLegacyBidi = 0x00000100,
+ StringFormatFlagsNoChanges = 0x00000200,
+#endif
+ StringFormatFlagsNoFontFallback = 0x00000400,
+ StringFormatFlagsMeasureTrailingSpaces = 0x00000800,
+ StringFormatFlagsNoWrap = 0x00001000,
+ StringFormatFlagsLineLimit = 0x00002000,
+
+ StringFormatFlagsNoClip = 0x00004000
+};
+
+//---------------------------------------------------------------------------
+// StringTrimming
+//---------------------------------------------------------------------------
+
+enum StringTrimming {
+ StringTrimmingNone = 0,
+ StringTrimmingCharacter = 1,
+ StringTrimmingWord = 2,
+ StringTrimmingEllipsisCharacter = 3,
+ StringTrimmingEllipsisWord = 4,
+ StringTrimmingEllipsisPath = 5
+};
+
+#ifndef DCR_USE_NEW_137252
+//---------------------------------------------------------------------------
+// String units
+//
+// String units are like length units in CSS, they may be absolute, or
+// they may be relative to a font size.
+//
+//---------------------------------------------------------------------------
+
+enum StringUnit {
+ StringUnitWorld = UnitWorld,
+ StringUnitDisplay = UnitDisplay,
+ StringUnitPixel = UnitPixel,
+ StringUnitPoint = UnitPoint,
+ StringUnitInch = UnitInch,
+ StringUnitDocument = UnitDocument,
+ StringUnitMillimeter = UnitMillimeter,
+ StringUnitEm = 32
+};
+#endif
+
+#ifndef DCR_USE_NEW_152154
+//---------------------------------------------------------------------------
+// Line spacing flags
+//---------------------------------------------------------------------------
+
+enum LineSpacing {
+ LineSpacingWorld = UnitWorld,
+ LineSpacingDisplay = UnitDisplay,
+ LineSpacingPixel = UnitPixel,
+ LineSpacingPoint = UnitPoint,
+ LineSpacingInch = UnitInch,
+ LineSpacingDocument = UnitDocument,
+ LineSpacingMillimeter = UnitMillimeter,
+
+ LineSpacingRecommended = 32,
+ LineSpacingAtLeast = 33,
+ LineSpacingAtLeastMultiple = 34,
+ LineSpacingCell = 35,
+ LineSpacingCellAtLeast = 36,
+ LineSpacingCellAtLeastMultiple = 37
+};
+
+/// The following methods of linespacing are relative to the font size
+//
+// =========== Method =========== =============== Relative to ===============
+//
+// LineSpacingRecommended recommended line spacing specified by font
+// LineSpacingAtLeast max(recommended, tallest glyph cell)
+// LineSpacingAtLeastMultiple smallest multiple of recommended big enough
+// for all glyph cells on the line
+// LineSpacingCell cell height
+// LineSpacingCellAtLeast max(font cell height, tallest glyph cell)
+// LineSpacingCellAtLeastMultiple smallest multiple of cell height big enough
+// for all glyph cells on the line
+#endif
+
+
+//---------------------------------------------------------------------------
+// National language digit substitution
+//---------------------------------------------------------------------------
+
+enum StringDigitSubstitute
+{
+ StringDigitSubstituteUser = 0, // As NLS setting
+ StringDigitSubstituteNone = 1,
+ StringDigitSubstituteNational = 2,
+ StringDigitSubstituteTraditional = 3
+};
+
+//---------------------------------------------------------------------------
+// Hotkey prefix interpretation
+//---------------------------------------------------------------------------
+
+enum HotkeyPrefix
+{
+ HotkeyPrefixNone = 0,
+ HotkeyPrefixShow = 1,
+ HotkeyPrefixHide = 2
+};
+
+//---------------------------------------------------------------------------
+// Text alignment flags
+//---------------------------------------------------------------------------
+
+enum StringAlignment
+{
+ // Left edge for left-to-right text,
+ // right for right-to-left text,
+ // and top for vertical
+ StringAlignmentNear = 0,
+ StringAlignmentCenter = 1,
+ StringAlignmentFar = 2
+};
+
+//---------------------------------------------------------------------------
+// DriverStringOptions
+//---------------------------------------------------------------------------
+
+enum DriverStringOptions
+{
+ DriverStringOptionsCmapLookup = 1,
+ DriverStringOptionsVertical = 2,
+ DriverStringOptionsRealizedAdvance = 4,
+#ifndef DCR_USE_NEW_137252
+ DriverStringOptionsCompensateResolution = 8
+#endif
+};
+
+//---------------------------------------------------------------------------
+// Flush Intention flags
+//---------------------------------------------------------------------------
+
+enum FlushIntention
+{
+ FlushIntentionFlush = 0, // Flush all batched rendering operations
+ FlushIntentionSync = 1 // Flush all batched rendering operations
+ // and wait for them to complete
+};
+
+#ifndef DCR_USE_NEW_175866
+
+//---------------------------------------------------------------------------
+// Window Change Notification types
+//---------------------------------------------------------------------------
+
+enum WindowNotifyEnum
+{
+ WindowNotifyEnumEnable = 0,
+ WindowNotifyEnumDisable,
+ WindowNotifyEnumPalette,
+ WindowNotifyEnumDisplay,
+ WindowNotifyEnumSysColor
+};
+
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder parameter related types
+//---------------------------------------------------------------------------
+
+#ifdef DCR_USE_NEW_145804
+enum EncoderParameterValueType
+{
+ EncoderParameterValueTypeByte = 1, // 8-bit unsigned int
+ EncoderParameterValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ EncoderParameterValueTypeShort = 3, // 16-bit unsigned int
+ EncoderParameterValueTypeLong = 4, // 32-bit unsigned int
+ EncoderParameterValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ EncoderParameterValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ EncoderParameterValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ EncoderParameterValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#else
+enum ValueType
+{
+ ValueTypeByte = 1, // 8-bit unsigned int
+ ValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ ValueTypeShort = 3, // 16-bit unsigned int
+ ValueTypeLong = 4, // 32-bit unsigned int
+ ValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ ValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ ValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ ValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder value types
+//---------------------------------------------------------------------------
+
+enum EncoderValue
+{
+ EncoderValueColorTypeCMYK,
+ EncoderValueColorTypeYCCK,
+ EncoderValueCompressionLZW,
+ EncoderValueCompressionCCITT3,
+ EncoderValueCompressionCCITT4,
+ EncoderValueCompressionRle,
+ EncoderValueCompressionNone,
+ EncoderValueScanMethodInterlaced,
+ EncoderValueScanMethodNonInterlaced,
+ EncoderValueVersionGif87,
+ EncoderValueVersionGif89,
+ EncoderValueRenderProgressive,
+ EncoderValueRenderNonProgressive,
+ EncoderValueTransformRotate90,
+ EncoderValueTransformRotate180,
+ EncoderValueTransformRotate270,
+ EncoderValueTransformFlipHorizontal,
+ EncoderValueTransformFlipVertical,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueMultiFrame,
+ #else
+ EncodeValueMultiFrame,
+ #endif
+ EncoderValueLastFrame,
+ EncoderValueFlush,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueFrameDimensionTime,
+ EncoderValueFrameDimensionResolution,
+ EncoderValueFrameDimensionPage
+ #else
+ EncodeValueFrameDimensionTime,
+ EncodeValueFrameDimensionResolution,
+ EncodeValueFrameDimensionPage
+ #endif
+};
+
+//---------------------------------------------------------------------------
+// Graphics layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum GraphicsLayout
+{
+ GraphicsLayoutNormal,
+ GraphicsLayoutMirrored,
+ GraphicsLayoutMirroredIgnoreImages,
+ GraphicsLayoutMirroredForceImages
+};
+
+//---------------------------------------------------------------------------
+// Image layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum ImageLayout
+{
+ ImageLayoutNormal,
+ ImageLayoutIgnoreMirrored
+};
+
+enum EmfToWmfBitsFlags
+{
+ EmfToWmfBitsFlagsDefault = 0x00000000,
+ EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
+ EmfToWmfBitsFlagsIncludeAPM = 0x00000002,
+ EmfToWmfBitsFlagsNoXORClip = 0x00000004
+};
+
+#endif // !_GDIPLUSENUMS_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
new file mode 100644
index 0000000000..8b5369e793
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
@@ -0,0 +1,2740 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFlat.h
+*
+* Abstract:
+*
+* Flat GDI+ API wrappers - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _FLATAPI_H
+#define _FLATAPI_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#define GDIPCONST const
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef DCR_USE_NEW_175866
+
+VOID
+WINGDIPAPI
+GdipDisplayPaletteWindowNotify(WindowNotifyEnum notify);
+
+#endif
+
+//----------------------------------------------------------------------------
+// GraphicsPath methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePath(GpFillMode brushMode, GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipClonePath(GpPath* path, GpPath **clonePath);
+
+GpStatus WINGDIPAPI
+GdipDeletePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipResetPath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPointCount(GpPath* path, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathTypes(GpPath* path, BYTE* types, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPoints(GpPath*, GpPointF* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPointsI(GpPath*, GpPoint* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathFillMode(GpPath *path, GpFillMode fillmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathData(GpPath *path, GpPathData* pathData);
+
+GpStatus WINGDIPAPI
+GdipStartPathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigures(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathMarker(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipClearPathMarkers(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipReversePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2,
+ REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width,
+ REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+
+GpStatus WINGDIPAPI
+GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST Rect *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArcI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2,
+ INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipWindingModeOutline(
+ GpPath *path,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+
+#ifdef DCR_USE_NEW_202903
+
+GpStatus WINGDIPAPI
+GdipWidenPath(
+ GpPath *nativePath,
+ GpPen *pen,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+#else
+
+GpStatus WINGDIPAPI
+GdipWidenPathWithMinimumResolutions(GpPath *path, GpPen *pen, REAL minXres,
+ REAL minYres, GpMatrix *matrix, BOOL removeSelftIntersects);
+
+#endif
+
+GpStatus WINGDIPAPI
+GdipWarpPath(GpPath *path, GpMatrix* matrix,
+ GDIPCONST GpPointF *points, INT count,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ WarpMode warpMode, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipTransformPath(GpPath* path, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPointI(GpPath* path, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+
+//----------------------------------------------------------------------------
+// Path Enumeration methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipDeletePathIter(GpPathIterator *iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpath(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpathPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextPathType(GpPathIterator* iterator, INT* resultCount,
+ BYTE* pathType, INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarker(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid);
+
+GpStatus WINGDIPAPI
+GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurve);
+
+GpStatus WINGDIPAPI
+GdipPathIterRewind(GpPathIterator* iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount,
+ GpPointF *points, BYTE *types, INT count);
+
+GpStatus WINGDIPAPI
+GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount,
+ GpPointF* points, BYTE* types, INT startIndex, INT endIndex);
+
+//----------------------------------------------------------------------------
+// Matrix methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix(GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx,
+ REAL dy, GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix);
+
+GpStatus WINGDIPAPI
+GdipDeleteMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22,
+ REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipInvertMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *matrixOut);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result);
+
+//----------------------------------------------------------------------------
+// Region methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateRegion(GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionPath(GpPath *path, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRgnData(GDIPCONST BYTE *regionData, INT size, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionHrgn(HRGN hRgn, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion);
+
+GpStatus WINGDIPAPI
+GdipDeleteRegion(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetInfinite(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetEmpty(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRegion(GpRegion *region, GpRegion *region2,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegionI(GpRegion *region, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipTransformRegion(GpRegion *region, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,
+ GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics,
+ GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hRgn);
+
+GpStatus WINGDIPAPI
+GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsEqualRegion(GpRegion *region, GpRegion *region2,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize);
+
+GpStatus WINGDIPAPI
+GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT * sizeFilled);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPoint(GpRegion *region, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRect(GpRegion *region, REAL x, REAL y, REAL width,
+ REAL height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRectI(GpRegion *region, INT x, INT y, INT width,
+ INT height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansCount(GpRegion *region, UINT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScans(GpRegion *region, GpRectF* rects, INT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansI(GpRegion *region, GpRect* rects, INT* count, GpMatrix* matrix);
+
+//----------------------------------------------------------------------------
+// Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCloneBrush(GpBrush *brush, GpBrush **cloneBrush);
+
+GpStatus WINGDIPAPI
+GdipDeleteBrush(GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetBrushType(GpBrush *brush, GpBrushType *type);
+
+//----------------------------------------------------------------------------
+// Hatch Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateHatchBrush(GpHatchStyle hatchstyle, ARGB forecol,
+ ARGB backcol, GpHatch **brush);
+
+GpStatus WINGDIPAPI
+GdipGetHatchStyle(GpHatch *brush, GpHatchStyle *hatchstyle);
+
+GpStatus WINGDIPAPI
+GdipGetHatchForegroundColor(GpHatch *brush, ARGB* forecol);
+
+GpStatus WINGDIPAPI
+GdipGetHatchBackgroundColor(GpHatch *brush, ARGB* backcol);
+
+//----------------------------------------------------------------------------
+// Texture Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, REAL x,
+ REAL y, REAL width, REAL height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ REAL x, REAL y, REAL width, REAL height,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, INT x,
+ INT y, INT width, INT height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ INT x, INT y, INT width, INT height,
+ GpTexture **texture);
+
+
+GpStatus WINGDIPAPI
+GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetTextureTransform(GpTexture *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetTextureTransform(GpTexture* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyTextureTransform(GpTexture* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateTextureTransform(GpTexture* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleTextureTransform(GpTexture* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateTextureTransform(GpTexture* brush, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureImage(GpTexture *brush, GpImage **image);
+
+//----------------------------------------------------------------------------
+// Solid Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateSolidFill(ARGB color, GpSolidFill **brush);
+
+GpStatus WINGDIPAPI
+GdipSetSolidFillColor(GpSolidFill *brush, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipGetSolidFillColor(GpSolidFill *brush, ARGB *color);
+
+//----------------------------------------------------------------------------
+// LineBrush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrush(GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushI(GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipSetLinePoints(GpLineGradient *brush,
+ GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2);
+
+GpStatus WINGDIPAPI
+GdipSetLinePointsI(GpLineGradient *brush,
+ GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2);
+
+GpStatus WINGDIPAPI
+GdipGetLinePoints(GpLineGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetLinePointsI(GpLineGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2);
+
+GpStatus WINGDIPAPI
+GdipGetLineColors(GpLineGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipGetLineRect(GpLineGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetLineRectI(GpLineGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipSetLineGammaCorrection(GpLineGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineGammaCorrection(GpLineGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlend(GpLineGradient *brush, REAL *blend, REAL* positions,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineBlend(GpLineGradient *brush, GDIPCONST REAL *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlend(GpLineGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineSigmaBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineWrapMode(GpLineGradient *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineTransform(GpLineGradient *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetLineTransform(GpLineGradient *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetLineTransform(GpLineGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyLineTransform(GpLineGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateLineTransform(GpLineGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleLineTransform(GpLineGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateLineTransform(GpLineGradient* brush, REAL angle, GpMatrixOrder order);
+
+//----------------------------------------------------------------------------
+// PathGradient Brush
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradient(GDIPCONST GpPointF* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientI(GDIPCONST GpPoint* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB colors);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush, ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush,
+ GDIPCONST ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPath(GpPathGradient *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPath(GpPathGradient *brush, GDIPCONST GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPoint(
+ GpPathGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPointI(
+ GpPathGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPoint(
+ GpPathGradient *brush, GDIPCONST GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPointI(
+ GpPathGradient *brush, GDIPCONST GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPointCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientGammaCorrection(GpPathGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientGammaCorrection(GpPathGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlendCount(GpPathGradient *brush,
+ INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlend(GpPathGradient *brush,
+ REAL *blend, REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientBlend(GpPathGradient *brush,
+ GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlend(GpPathGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSigmaBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientLinearBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPathGradientTransform(GpPathGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPathGradientTransform(GpPathGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePathGradientTransform(GpPathGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePathGradientTransform(GpPathGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePathGradientTransform(GpPathGradient* brush, REAL angle,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientFocusScales(GpPathGradient *brush, REAL* xScale, REAL* yScale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientFocusScales(GpPathGradient *brush, REAL xScale, REAL yScale);
+
+//----------------------------------------------------------------------------
+// Pen methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePen1(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,
+ GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipClonePen(GpPen *pen, GpPen **clonepen);
+
+GpStatus WINGDIPAPI
+GdipDeletePen(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipSetPenWidth(GpPen *pen, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetPenWidth(GpPen *pen, REAL *width);
+
+GpStatus WINGDIPAPI
+GdipSetPenUnit(GpPen *pen, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipGetPenUnit(GpPen *pen, GpUnit *unit);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenLineCap197819(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenLineCap(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+
+GpStatus WINGDIPAPI
+GdipSetPenStartCap(GpPen *pen, GpLineCap startCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenEndCap(GpPen *pen, GpLineCap endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenDashCap197819(GpPen *pen, GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenDashCap(GpPen *pen, GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipGetPenStartCap(GpPen *pen, GpLineCap *startCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenEndCap(GpPen *pen, GpLineCap *endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipGetPenDashCap197819(GpPen *pen, GpDashCap *dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipGetPenDashCap(GpPen *pen, GpLineCap *dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipSetPenLineJoin(GpPen *pen, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetPenLineJoin(GpPen *pen, GpLineJoin *lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomStartCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomStartCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomEndCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomEndCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenMiterLimit(GpPen *pen, REAL miterLimit);
+
+GpStatus WINGDIPAPI
+GdipGetPenMiterLimit(GpPen *pen, REAL *miterLimit);
+
+GpStatus WINGDIPAPI
+GdipSetPenMode(GpPen *pen, GpPenAlignment penMode);
+
+GpStatus WINGDIPAPI
+GdipGetPenMode(GpPen *pen, GpPenAlignment *penMode);
+
+GpStatus WINGDIPAPI
+GdipSetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPenTransform(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePenTransform(GpPen *pen, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetPenColor(GpPen *pen, ARGB argb);
+
+GpStatus WINGDIPAPI
+GdipGetPenColor(GpPen *pen, ARGB *argb);
+
+GpStatus WINGDIPAPI
+GdipSetPenBrushFill(GpPen *pen, GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenBrushFill(GpPen *pen, GpBrush **brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenFillType(GpPen *pen, GpPenType* type);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashStyle(GpPen *pen, GpDashStyle *dashstyle);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashStyle(GpPen *pen, GpDashStyle dashstyle);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashOffset(GpPen *pen, REAL *offset);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashOffset(GpPen *pen, REAL offset);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashArray(GpPen *pen, REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenCompoundArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundArray(GpPen *pen, REAL *dash, INT count);
+
+//----------------------------------------------------------------------------
+// CustomLineCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath,
+ GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap);
+
+GpStatus WINGDIPAPI
+GdipDeleteCustomLineCap(GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipCloneCustomLineCap(GpCustomLineCap* customCap,
+ GpCustomLineCap** clonedCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapType(GpCustomLineCap* customCap,
+ CustomLineCapType* capType);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap startCap, GpLineCap endCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap* startCap, GpLineCap* endCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap baseCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap* baseCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL inset);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL* inset);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL widthScale);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL* widthScale);
+
+//----------------------------------------------------------------------------
+// AdjustableArrowCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL isFilled,
+ GpAdjustableArrowCap **cap);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middleInset);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middleInset);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fillState);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fillState);
+
+//----------------------------------------------------------------------------
+// Image methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStream(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStreamICM(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipCloneImage(GpImage *image, GpImage **cloneImage);
+
+GpStatus WINGDIPAPI
+GdipDisposeImage(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToStream(GpImage *image, IStream* stream,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAdd(GpImage *image, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAddImage(GpImage *image, GpImage* newImage,
+ GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipGetImageBounds(GpImage *image, GpRectF *srcRect, GpUnit *srcUnit);
+
+GpStatus WINGDIPAPI
+GdipGetImageDimension(GpImage *image, REAL *width, REAL *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageType(GpImage *image, ImageType *type);
+
+GpStatus WINGDIPAPI
+GdipGetImageWidth(GpImage *image, UINT *width);
+
+GpStatus WINGDIPAPI
+GdipGetImageHeight(GpImage *image, UINT *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageHorizontalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageVerticalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageFlags(GpImage *image, UINT *flags);
+
+GpStatus WINGDIPAPI
+GdipGetImageRawFormat(GpImage *image, GUID *format);
+
+GpStatus WINGDIPAPI
+GdipGetImagePixelFormat(GpImage *image, PixelFormat *format);
+
+GpStatus WINGDIPAPI
+GdipGetImageThumbnail(GpImage *image, UINT thumbWidth, UINT thumbHeight,
+ GpImage **thumbImage,
+ GetThumbnailImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT size, EncoderParameters* buffer);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsCount(GpImage* image, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsList(GpImage* image, GUID* dimensionIDs, UINT count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID* dimensionID,
+ UINT frameIndex);
+
+GpStatus WINGDIPAPI
+GdipImageRotateFlip(GpImage *image, RotateFlipType rfType);
+
+GpStatus WINGDIPAPI
+GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size);
+
+GpStatus WINGDIPAPI
+GdipSetImagePalette(GpImage *image, GDIPCONST ColorPalette *palette);
+
+GpStatus WINGDIPAPI
+GdipGetImagePaletteSize(GpImage *image, INT *size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyCount(GpImage *image, UINT* numOfProperty);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyIdList(GpImage *image, UINT numOfProperty, PROPID* list);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItemSize(GpImage *image, PROPID propId, UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItem(GpImage *image, PROPID propId,UINT propSize,
+ PropertyItem* buffer);
+
+GpStatus WINGDIPAPI
+GdipGetPropertySize(GpImage *image, UINT* totalBufferSize, UINT* numProperties);
+
+GpStatus WINGDIPAPI
+GdipGetAllPropertyItems(GpImage *image, UINT totalBufferSize,
+ UINT numProperties, PropertyItem* allItems);
+
+GpStatus WINGDIPAPI
+GdipRemovePropertyItem(GpImage *image, PROPID propId);
+
+GpStatus WINGDIPAPI
+GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem* item);
+
+GpStatus WINGDIPAPI
+GdipImageForceValidation(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipGetImageLayout(GpImage *image, ImageLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetImageLayout(GpImage *image, GDIPCONST ImageLayout layout);
+
+//----------------------------------------------------------------------------
+// Bitmap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStream(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStreamICM(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFileICM(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromScan0(INT width,
+ INT height,
+ INT stride,
+ PixelFormat format,
+ BYTE* scan0,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGraphics(INT width,
+ INT height,
+ GpGraphics* target,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromDirectDrawSurface(IDirectDrawSurface7* surface,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo,
+ VOID* gdiBitmapData,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHBITMAP(HBITMAP hbm,
+ HPALETTE hpal,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
+ HBITMAP* hbmReturn,
+ ARGB background);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHICON(HICON hicon,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHICONFromBitmap(GpBitmap* bitmap,
+ HICON* hbmReturn);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromResource(HINSTANCE hInstance,
+ GDIPCONST WCHAR* lpBitmapName,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapAreaI(INT x,
+ INT y,
+ INT width,
+ INT height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipBitmapLockBits(GpBitmap* bitmap,
+ GDIPCONST GpRect* rect,
+ UINT flags,
+ PixelFormat format,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapUnlockBits(GpBitmap* bitmap,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi);
+
+//----------------------------------------------------------------------------
+// ImageAttributes methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateImageAttributes(GpImageAttributes **imageattr);
+
+GpStatus WINGDIPAPI
+GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,
+ GpImageAttributes **cloneImageattr);
+
+GpStatus WINGDIPAPI
+GdipDisposeImageAttributes(GpImageAttributes *imageattr);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesToIdentity(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+GpStatus WINGDIPAPI
+GdipResetImageAttributes(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST ColorMatrix* colorMatrix,
+ GDIPCONST ColorMatrix* grayMatrix,
+ ColorMatrixFlags flags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesThreshold(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL threshold);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesGamma(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL gamma);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesNoOp(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorKeys(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ARGB colorLow,
+ ARGB colorHigh);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannel(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ColorChannelFlags channelFlags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannelColorProfile(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST WCHAR *colorProfileFilename);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesRemapTable(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ UINT mapSize,
+ GDIPCONST ColorMap *map);
+GpStatus WINGDIPAPI
+GdipSetImageAttributesWrapMode(
+ GpImageAttributes *imageAttr,
+ WrapMode wrap,
+ ARGB argb,
+ BOOL clamp
+);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesICMMode(
+ GpImageAttributes *imageAttr,
+ BOOL on
+);
+
+GpStatus WINGDIPAPI
+GdipGetImageAttributesAdjustedPalette(
+ GpImageAttributes *imageAttr,
+ ColorPalette * colorPalette,
+ ColorAdjustType colorAdjustType
+);
+
+//----------------------------------------------------------------------------
+// Graphics methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipFlush(GpGraphics *graphics, GpFlushIntention intention);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC(HDC hdc, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipDeleteGraphics(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetDC(GpGraphics* graphics, HDC * hdc);
+
+GpStatus WINGDIPAPI
+GdipReleaseDC(GpGraphics* graphics, HDC hdc);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingMode(GpGraphics *graphics, CompositingMode compositingMode);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *compositingMode);
+
+GpStatus WINGDIPAPI
+GdipSetRenderingOrigin(GpGraphics *graphics, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipGetRenderingOrigin(GpGraphics *graphics, INT *x, INT *y);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipSetPixelOffsetMode(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint mode);
+
+GpStatus WINGDIPAPI
+GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *mode);
+
+#ifdef DCR_USE_NEW_188922
+GpStatus WINGDIPAPI
+GdipSetTextContrast(GpGraphics *graphics, UINT contrast);
+
+GpStatus WINGDIPAPI
+GdipGetTextContrast(GpGraphics *graphics, UINT * contrast);
+#else
+GpStatus WINGDIPAPI
+GdipSetTextGammaValue(GpGraphics *graphics, UINT gammaValue);
+
+GpStatus WINGDIPAPI
+GdipGetTextGammaValue(GpGraphics *graphics, UINT * gammaValue);
+#endif // DCR_USE_NEW_188922
+
+
+GpStatus WINGDIPAPI
+GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetWorldTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPageTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetPageScale(GpGraphics *graphics, REAL *scale);
+
+GpStatus WINGDIPAPI
+GdipSetPageUnit(GpGraphics *graphics, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipSetPageScale(GpGraphics *graphics, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetDpiX(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipGetDpiY(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetNearestColor(GpGraphics *graphics, ARGB* argb);
+
+// Create the Win9x Halftone Palette (even on NT) with correct Desktop colors
+HPALETTE WINGDIPAPI
+GdipCreateHalftonePalette();
+
+GpStatus WINGDIPAPI
+GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2, INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygon(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygonI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipGraphicsClear(GpGraphics *graphics, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangles(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillRegion(GpGraphics *graphics, GpBrush *brush,
+ GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRect(GpGraphics *graphics, GpImage *image, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePoints(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image, REAL x,
+ REAL y, REAL srcx, REAL srcy, REAL srcwidth,
+ REAL srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRectI(GpGraphics *graphics, GpImage *image, INT x,
+ INT y, INT srcx, INT srcy, INT srcwidth,
+ INT srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx,
+ REAL dsty, REAL dstwidth, REAL dstheight,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, INT dstx,
+ INT dsty, INT dstwidth, INT dstheight,
+ INT srcx, INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *points, INT count, REAL srcx,
+ REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *points, INT count, INT srcx,
+ INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipPlayMetafileRecord(
+ GDIPCONST GpMetafile * metafile,
+ EmfPlusRecordType recordType,
+ UINT flags,
+ UINT dataSize,
+ GDIPCONST BYTE * data
+ );
+
+GpStatus WINGDIPAPI
+GdipSetClipGraphics(GpGraphics *graphics, GpGraphics *srcgraphics,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipHrgn(GpGraphics *graphics, HRGN hRgn, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipResetClip(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipGetClip(GpGraphics *graphics, GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state);
+
+GpStatus WINGDIPAPI
+GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF* dstrect,
+ GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainerI(GpGraphics *graphics, GDIPCONST GpRect* dstrect,
+ GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer* state);
+
+GpStatus WINGDIPAPI
+GdipEndContainer(GpGraphics *graphics, GraphicsContainer state);
+
+GpStatus
+GdipGetMetafileHeaderFromWmf(
+ HMETAFILE hWmf,
+ GDIPCONST APMFileHeader * apmFileHeader,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromEmf(
+ HENHMETAFILE hEmf,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromFile(
+ GDIPCONST WCHAR* filename,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromStream(
+ IStream * stream,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromMetafile(
+ GpMetafile * metafile,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetHemfFromMetafile(
+ GpMetafile * metafile,
+ HENHMETAFILE * hEmf
+ );
+
+GpStatus WINGDIPAPI
+GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, UINT access, IStream **stream);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmf(HMETAFILE hWmf, BOOL deleteWmf,
+ GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromEmf(HENHMETAFILE hEmf, BOOL deleteEmf,
+ GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromFile(GDIPCONST WCHAR* file, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR* file, GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromStream(IStream * stream, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipRecordMetafile(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileI(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileName(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileNameI(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStream(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStreamI(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipSetMetafileDownLevelRasterizationLimit(
+ GpMetafile * metafile,
+ UINT metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetMetafileDownLevelRasterizationLimit(
+ GDIPCONST GpMetafile * metafile,
+ UINT * metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetImageDecodersSize(UINT *numDecoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageDecoders(UINT numDecoders,
+ UINT size,
+ ImageCodecInfo *decoders);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncodersSize(UINT *numEncoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncoders(UINT numEncoders,
+ UINT size,
+ ImageCodecInfo *encoders);
+
+GpStatus WINGDIPAPI
+GdipAddImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+GpStatus WINGDIPAPI
+GdipRemoveImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+#ifndef DCR_USE_NEW_186091
+GpStatus WINGDIPAPI
+GdipGetGraphicsPixel(GpGraphics* graphics, REAL x, REAL y, ARGB* argb);
+#endif
+
+GpStatus WINGDIPAPI
+GdipComment(GpGraphics* graphics, UINT sizeData, GDIPCONST BYTE * data);
+
+GpStatus WINGDIPAPI
+GdipGetGraphicsLayout(GpGraphics* graphics, GraphicsLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetGraphicsLayout(GpGraphics* graphics, GDIPCONST GraphicsLayout layout);
+
+//----------------------------------------------------------------------------
+// FontFamily
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,
+ GpFontCollection *fontCollection,
+ GpFontFamily **FontFamily);
+
+GpStatus WINGDIPAPI
+GdipDeleteFontFamily(GpFontFamily *FontFamily);
+
+GpStatus WINGDIPAPI
+GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily);
+
+
+GpStatus WINGDIPAPI
+GdipGetFamilyName(
+ GDIPCONST GpFontFamily *family,
+ WCHAR name[LF_FACESIZE],
+ LANGID language
+);
+
+GpStatus WINGDIPAPI
+GdipIsStyleAvailable(GDIPCONST GpFontFamily *family, INT style, BOOL * IsStyleAvailable);
+
+GpStatus WINGDIPAPI
+GdipFontCollectionEnumerable(
+ GpFontCollection* fontCollection,
+ GpGraphics* graphics,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI GdipFontCollectionEnumerate(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound,
+ GpGraphics* graphics
+);
+
+//-----------------------------------
+// New API
+//-----------------------------------
+
+GpStatus WINGDIPAPI
+GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 * EmHeight);
+
+GpStatus WINGDIPAPI
+GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellAscent);
+
+GpStatus WINGDIPAPI
+GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellDescent);
+
+GpStatus WINGDIPAPI
+GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 * LineSpacing);
+
+
+//----------------------------------------------------------------------------
+// Font
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromDC(
+ HDC hdc,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontA(
+ HDC hdc,
+ GDIPCONST LOGFONTA *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontW(
+ HDC hdc,
+ GDIPCONST LOGFONTW *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFont(
+ GDIPCONST GpFontFamily *fontFamily,
+ REAL emSize,
+ INT style,
+ Unit unit,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCloneFont(GpFont* font, GpFont** cloneFont);
+
+GpStatus WINGDIPAPI
+GdipDeleteFont(GpFont* font);
+
+GpStatus WINGDIPAPI
+GdipGetFamily(GpFont *font, GpFontFamily **family);
+
+GpStatus WINGDIPAPI
+GdipGetFontStyle(GpFont *font, INT *style);
+
+GpStatus WINGDIPAPI
+GdipGetFontSize(GpFont *font, REAL *size);
+
+GpStatus WINGDIPAPI
+GdipGetFontUnit(GpFont *font, Unit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height);
+
+#ifdef DCR_USE_NEW_125467
+GpStatus WINGDIPAPI
+GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height);
+#endif
+
+GpStatus WINGDIPAPI
+GdipGetLogFontA(GpFont * font, GpGraphics *graphics, LOGFONTA * logfontA);
+
+GpStatus WINGDIPAPI
+GdipGetLogFontW(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);
+
+// FontCollection
+
+GpStatus WINGDIPAPI
+GdipNewInstalledFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipNewPrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipDeletePrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyCount(
+ GpFontCollection* fontCollection,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyList(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound
+);
+
+#ifndef DCR_USE_NEW_235072
+GpStatus WINGDIPAPI
+GdipInstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipUninstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipPrivateAddFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipPrivateAddMemoryFont(
+ GpFontCollection* fontCollection,
+ GDIPCONST void* memory,
+ INT length
+);
+
+//----------------------------------------------------------------------------
+// Text
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipDrawString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ GDIPCONST GpBrush *brush
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ RectF *boundingBox,
+ INT *codepointsFitted,
+ INT *linesFilled
+);
+
+#ifndef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipMeasureStringRegion(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT firstCharacterIndex,
+ INT characterCount,
+ GpRegion *region
+);
+#endif
+
+#ifdef DCR_USE_NEW_174340
+GpStatus
+WINGDIPAPI
+GdipMeasureCharacterRanges(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT regionCount,
+ GpRegion **regions
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipDrawDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST GpBrush *brush,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix,
+ RectF *boundingBox
+);
+
+#ifndef DCR_USE_NEW_168772
+GpStatus WINGDIPAPI
+GdipDriverStringPointToCodepoint(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GpMatrix *matrix,
+ GDIPCONST PointF *hit,
+ INT *index,
+ BOOL *rightEdge,
+ REAL *distance
+);
+#endif
+
+//----------------------------------------------------------------------------
+// String format APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateStringFormat(
+ INT formatAttributes,
+ LANGID language,
+ GpStringFormat **format
+);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericDefault(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericTypographic(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipDeleteStringFormat(GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatFlags(GpStringFormat *format, INT flags);
+
+GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat *format, INT *flags);
+
+#ifndef DCR_USE_NEW_152154
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineSpacing(GpStringFormat *format, REAL amount,
+ LineSpacing method);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingAmount(GDIPCONST GpStringFormat *format, REAL *amount);
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingMethod(GDIPCONST GpStringFormat *format, LineSpacing *method);
+#endif
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatAlign(GpStringFormat *format, StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatAlign(GDIPCONST GpStringFormat *format, StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineAlign(GpStringFormat *format,
+ StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineAlign(GDIPCONST GpStringFormat *format,
+ StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTrimming(
+ GpStringFormat *format,
+ StringTrimming trimming
+);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTrimming(
+ GDIPCONST GpStringFormat *format,
+ StringTrimming *trimming
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatHotkeyPrefix(GpStringFormat *format, INT hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTabStops(GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format, INT * count);
+
+#ifdef DCR_USE_NEW_146933
+GpStatus WINGDIPAPI
+GdipSetStringFormatDigitSubstitution(GpStringFormat *format, LANGID language,
+ StringDigitSubstitute substitute);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format, LANGID *language,
+ StringDigitSubstitute *substitute);
+#endif // DCR_USE_NEW_146933
+
+#ifdef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipGetStringFormatMeasurableCharacterRangeCount(
+ GDIPCONST GpStringFormat *format,
+ INT *count
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatMeasurableCharacterRanges(
+ GpStringFormat *format,
+ INT rangeCount,
+ GDIPCONST CharacterRange *ranges
+);
+#endif
+
+//----------------------------------------------------------------------------
+// Cached Bitmap APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCachedBitmap(
+ GpBitmap *bitmap,
+ GpGraphics *graphics,
+ GpCachedBitmap **cachedBitmap
+);
+
+GpStatus WINGDIPAPI
+GdipDeleteCachedBitmap(GpCachedBitmap *cachedBitmap);
+
+GpStatus WINGDIPAPI
+GdipDrawCachedBitmap(
+ GpGraphics *graphics,
+ GpCachedBitmap *cachedBitmap,
+ INT x,
+ INT y
+);
+
+UINT WINGDIPAPI
+GdipEmfToWmfBits(
+ HENHMETAFILE hemf,
+ UINT cbData16,
+ LPBYTE pData16,
+ INT iMapMode,
+ INT eFlags
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_FLATAPI_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
new file mode 100644
index 0000000000..c9ff050561
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
@@ -0,0 +1,299 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFont.h
+*
+* Abstract:
+*
+* Font related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONT_H
+#define _GDIPLUSFONT_H
+
+inline
+Font::Font(IN HDC hdc)
+{
+ GpFont *font = NULL;
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+#ifdef DCR_USE_NEW_127084
+inline
+Font::Font(IN HDC hdc,
+ IN const HFONT hfont)
+{
+ GpFont *font = NULL;
+
+ if (hfont)
+ {
+ LOGFONTA lf;
+
+ if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);
+ else
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+#endif
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTW* logfont)
+{
+ GpFont *font = NULL;
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTA* logfont)
+{
+ GpFont *font = NULL;
+
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit
+)
+{
+ GpFont *font = NULL;
+
+ lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL,
+ emSize,
+ style,
+ unit,
+ &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit,
+ IN const FontCollection * fontCollection
+)
+{
+ FontFamily family(familyName, fontCollection);
+
+ GpFont * font = NULL;
+
+ lastResult = family.GetLastStatus();
+
+ if (lastResult == Ok)
+ {
+ lastResult = DllExports::GdipCreateFont(family.nativeFamily,
+ emSize,
+ style,
+ unit,
+ &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline Status
+Font::GetLogFontA(IN const Graphics *g,
+ OUT LOGFONTA *logfontA) const
+{
+ return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA));
+
+}
+
+inline Status
+Font::GetLogFontW(IN const Graphics *g,
+ OUT LOGFONTW *logfontW) const
+{
+ return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW));
+}
+
+
+inline Font*
+Font::Clone() const
+{
+ GpFont *cloneFont = NULL;
+
+ SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont));
+
+ return new Font(cloneFont, lastResult);
+}
+
+inline
+Font::~Font()
+{
+ DllExports::GdipDeleteFont(nativeFont);
+}
+
+// Operations
+
+inline BOOL
+Font::IsAvailable() const
+{
+ return (nativeFont ? TRUE : FALSE);
+}
+
+inline Status
+Font::GetFamily(OUT FontFamily *family) const
+{
+ if (family == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily));
+ family->SetStatus(status);
+
+ return SetStatus(status);
+}
+
+inline INT
+Font::GetStyle() const
+{
+ INT style;
+
+ SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style));
+
+ return style;
+}
+
+inline REAL
+Font::GetSize() const
+{
+ REAL size;
+ SetStatus(DllExports::GdipGetFontSize(nativeFont, &size));
+ return size;
+}
+
+inline Unit
+Font::GetUnit() const
+{
+ Unit unit;
+ SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit));
+ return unit;
+}
+
+inline REAL
+Font::GetHeight(IN const Graphics *graphics) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeight(
+ nativeFont,
+ graphics ? graphics->nativeGraphics : NULL,
+ &height
+ ));
+ return height;
+}
+
+
+#ifdef DCR_USE_NEW_125467
+inline REAL
+Font::GetHeight(IN REAL dpi = 0) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height));
+ return height;
+}
+#endif
+
+
+// protected method
+inline
+Font::Font(IN GpFont* font,
+ IN Status status)
+{
+ lastResult = status;
+ SetNativeFont(font);
+}
+
+// protected method
+inline VOID
+Font::SetNativeFont(GpFont *Font)
+{
+ nativeFont = Font;
+}
+
+inline Status
+Font::GetLastStatus(void) const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+Font::SetStatus(IN Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
new file mode 100644
index 0000000000..d2257ba456
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
@@ -0,0 +1,149 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontCollection.h
+*
+* Abstract:
+*
+* Font collections (Installed and Private)
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONTCOLL_H
+#define _GDIPLUSFONTCOLL_H
+
+inline
+FontCollection::FontCollection()
+{
+ nativeFontCollection = NULL;
+}
+
+inline
+FontCollection::~FontCollection()
+{
+}
+
+inline INT
+FontCollection::GetFamilyCount() const
+{
+ INT numFound = 0;
+
+ lastResult = DllExports::GdipGetFontCollectionFamilyCount(
+ nativeFontCollection, &numFound);
+
+
+
+ return numFound;
+}
+
+inline Status
+FontCollection::GetFamilies(
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+) const
+{
+ if (numSought <= 0 || gpfamilies == NULL || numFound == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ *numFound = 0;
+ GpFontFamily **nativeFamilyList = new GpFontFamily*[numSought];
+
+ if (nativeFamilyList == NULL)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetFontCollectionFamilyList(
+ nativeFontCollection,
+ numSought,
+ nativeFamilyList,
+ numFound
+ ));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < *numFound; i++)
+ {
+ DllExports::GdipCloneFontFamily(nativeFamilyList[i],
+ &gpfamilies[i].nativeFamily);
+ }
+ }
+
+ delete [] nativeFamilyList;
+
+ return status;
+}
+
+inline Status FontCollection::GetLastStatus () const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+FontCollection::SetStatus(IN Status status) const
+{
+ lastResult = status;
+ return lastResult;
+}
+
+inline
+InstalledFontCollection::InstalledFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewInstalledFontCollection(&nativeFontCollection);
+}
+
+inline
+InstalledFontCollection::~InstalledFontCollection()
+{
+}
+
+#ifndef DCR_USE_NEW_235072
+inline Status
+InstalledFontCollection::InstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipInstallFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+InstalledFontCollection::UninstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipUninstallFontFile(nativeFontCollection, filename));
+}
+#endif
+
+inline
+PrivateFontCollection::PrivateFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewPrivateFontCollection(&nativeFontCollection);
+}
+
+inline
+PrivateFontCollection::~PrivateFontCollection()
+{
+ DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
+}
+
+inline Status
+PrivateFontCollection::AddFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipPrivateAddFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+PrivateFontCollection::AddMemoryFont(IN const void* memory,
+ IN INT length)
+{
+ return SetStatus(DllExports::GdipPrivateAddMemoryFont(
+ nativeFontCollection,
+ memory,
+ length));
+}
+
+#endif // _GDIPLUSFONTCOLL_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
new file mode 100644
index 0000000000..ef2f3dde9b
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
@@ -0,0 +1,271 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontFamily.h
+*
+* Abstract:
+*
+* Font family API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_FONT_FAMILY_H
+#define _GDIPLUS_FONT_FAMILY_H
+
+inline
+FontFamily::FontFamily() :
+ nativeFamily (NULL),
+ lastResult (Ok)
+{
+}
+
+inline
+FontFamily::FontFamily(
+ IN const WCHAR* name,
+ IN const FontCollection* fontCollection
+)
+{
+ nativeFamily = NULL;
+ lastResult = DllExports::GdipCreateFontFamilyFromName(
+ name,
+ fontCollection ? fontCollection->nativeFontCollection : NULL,
+ &nativeFamily
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+}
+
+// private method
+inline
+FontFamily::FontFamily(
+ IN GpFontFamily *nativeOrig,
+ IN Status status
+)
+{
+ lastResult = status;
+ nativeFamily = nativeOrig;
+}
+
+// Generic font family access
+
+inline const FontFamily *
+FontFamily::GenericSansSerif()
+{
+ if (GenericSansSerifFontFamily != NULL)
+ {
+ return GenericSansSerifFontFamily;
+ }
+
+ GenericSansSerifFontFamily =
+ (FontFamily*) GenericSansSerifFontFamilyBuffer;
+
+ GenericSansSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySansSerif(
+ &(GenericSansSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSansSerifFontFamily->lastResult >= 10)
+ GenericSansSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSansSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericSerif()
+{
+ if (GenericSerifFontFamily != NULL)
+ {
+ return GenericSerifFontFamily;
+ }
+
+ GenericSerifFontFamily =
+ (FontFamily*) GenericSerifFontFamilyBuffer;
+
+ GenericSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySerif(
+ &(GenericSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSerifFontFamily->lastResult >= 10)
+ GenericSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericMonospace()
+{
+ if (GenericMonospaceFontFamily != NULL)
+ {
+ return GenericMonospaceFontFamily;
+ }
+
+ GenericMonospaceFontFamily =
+ (FontFamily*) GenericMonospaceFontFamilyBuffer;
+
+ GenericMonospaceFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilyMonospace(
+ &(GenericMonospaceFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericMonospaceFontFamily->lastResult >= 10)
+ GenericMonospaceFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericMonospaceFontFamily;
+}
+
+inline FontFamily::~FontFamily()
+{
+ DllExports::GdipDeleteFontFamily (nativeFamily);
+}
+
+inline FontFamily *
+FontFamily::Clone() const
+{
+ GpFontFamily * clonedFamily = NULL;
+
+ SetStatus(DllExports::GdipCloneFontFamily (nativeFamily, &clonedFamily));
+
+ return new FontFamily(clonedFamily, lastResult);
+}
+
+inline Status
+FontFamily::GetFamilyName(
+ IN WCHAR name[LF_FACESIZE],
+ IN LANGID language
+) const
+{
+ return SetStatus(DllExports::GdipGetFamilyName(nativeFamily,
+ name,
+ language));
+}
+
+inline BOOL
+FontFamily::IsStyleAvailable(IN INT style) const
+{
+ BOOL StyleAvailable;
+ Status status;
+
+ status = SetStatus(DllExports::GdipIsStyleAvailable(nativeFamily, style, &StyleAvailable));
+
+ if (status != Ok)
+ StyleAvailable = FALSE;
+
+ return StyleAvailable;
+}
+
+
+inline UINT16
+FontFamily::GetEmHeight(IN INT style) const
+{
+ UINT16 EmHeight;
+
+ SetStatus(DllExports::GdipGetEmHeight(nativeFamily, style, &EmHeight));
+
+ return EmHeight;
+}
+
+inline UINT16
+FontFamily::GetCellAscent(IN INT style) const
+{
+ UINT16 CellAscent;
+
+ SetStatus(DllExports::GdipGetCellAscent(nativeFamily, style, &CellAscent));
+
+ return CellAscent;
+}
+
+inline UINT16
+FontFamily::GetCellDescent(IN INT style) const
+{
+ UINT16 CellDescent;
+
+ SetStatus(DllExports::GdipGetCellDescent(nativeFamily, style, &CellDescent));
+
+ return CellDescent;
+}
+
+
+inline UINT16
+FontFamily::GetLineSpacing(IN INT style) const
+{
+ UINT16 LineSpacing;
+
+ SetStatus(DllExports::GdipGetLineSpacing(nativeFamily, style, &LineSpacing));
+
+ return LineSpacing;
+
+}
+
+#ifdef TEXTV2
+
+// The following APIs return data from the font OS/2 table
+
+inline INT16
+FontFamily::GetTypographicAscent(IN INT style) const
+{
+ INT16 TypographicAscent;
+
+ SetStatus(DllExports::GdipGetTypographicAscent(nativeFamily, style, &TypographicAscent));
+
+ return TypographicAscent;
+}
+
+inline INT16
+FontFamily::GetTypographicDescent(IN INT style) const
+{
+ INT16 TypographicDescent;
+
+ SetStatus(DllExports::GdipGetTypographicDescent(nativeFamily, style, &TypographicDescent));
+
+ return TypographicDescent;
+}
+
+inline INT16
+FontFamily::GetTypographicLineGap(IN INT style) const
+{
+ INT16 TypographicLineGap;
+
+ SetStatus(DllExports::GdipGetTypographicLineGap(nativeFamily, style, &TypographicLineGap));
+
+ return TypographicLineGap;
+}
+
+#endif
+
+///////////////////////////////////////////////////////////
+
+// GetLastStatus - return last error code and clear error code
+
+inline Status
+FontFamily::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+// protected method
+inline Status
+FontFamily::SetStatus(Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
new file mode 100644
index 0000000000..121288de57
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
@@ -0,0 +1,107 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGpStubs.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGPSTUBS_H
+#define _GDIPLUSGPSTUBS_H
+
+//---------------------------------------------------------------------------
+// GDI+ classes for forward reference
+//---------------------------------------------------------------------------
+
+class Graphics;
+class Pen;
+class Brush;
+class Matrix;
+class Bitmap;
+class Metafile;
+class GraphicsPath;
+class PathIterator;
+class Region;
+class Image;
+class TextureBrush;
+class HatchBrush;
+class SolidBrush;
+class LinearGradientBrush;
+class PathGradientBrush;
+class Font;
+class FontFamily;
+class FontCollection;
+class InstalledFontCollection;
+class PrivateFontCollection;
+class ImageAttributes;
+class CachedBitmap;
+
+//---------------------------------------------------------------------------
+// Internal GDI+ classes for internal type checking
+//---------------------------------------------------------------------------
+class GpGraphics {};
+
+class GpBrush {};
+class GpTexture : public GpBrush {};
+class GpSolidFill : public GpBrush {};
+class GpLineGradient : public GpBrush {};
+class GpPathGradient : public GpBrush {};
+class GpHatch : public GpBrush {};
+
+class GpPen {};
+class GpCustomLineCap {};
+class GpAdjustableArrowCap : public GpCustomLineCap {};
+
+class GpImage {};
+class GpBitmap : public GpImage {};
+class GpMetafile : public GpImage {};
+class GpImageAttributes {};
+
+class GpPath {};
+class GpRegion {};
+class GpPathIterator {};
+
+class GpFontFamily {};
+class GpFont {};
+class GpStringFormat {};
+class GpFontCollection {};
+class GpInstalledFontCollection : public GpFontCollection {};
+class GpPrivateFontCollection : public GpFontCollection {};
+
+class GpCachedBitmap;
+
+typedef Status GpStatus;
+typedef FillMode GpFillMode;
+typedef WrapMode GpWrapMode;
+typedef Unit GpUnit;
+typedef CoordinateSpace GpCoordinateSpace;
+typedef PointF GpPointF;
+typedef Point GpPoint;
+typedef RectF GpRectF;
+typedef Rect GpRect;
+typedef SizeF GpSizeF;
+typedef HatchStyle GpHatchStyle;
+typedef DashStyle GpDashStyle;
+typedef LineCap GpLineCap;
+typedef DashCap GpDashCap;
+
+
+typedef PenAlignment GpPenAlignment;
+
+typedef LineJoin GpLineJoin;
+typedef PenType GpPenType;
+
+typedef Matrix GpMatrix;
+typedef BrushType GpBrushType;
+typedef MatrixOrder GpMatrixOrder;
+typedef FlushIntention GpFlushIntention;
+typedef PathData GpPathData;
+
+#endif // !_GDIPLUSGPSTUBS.HPP
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
new file mode 100644
index 0000000000..7b39a6ea71
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
@@ -0,0 +1,2726 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGraphics.h
+*
+* Abstract:
+*
+* Declarations for Graphics class
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGRAPHICS_H
+#define _GDIPLUSGRAPHICS_H
+
+/**
+ * Represent a graphics context
+ */
+class Graphics : public GdiplusBase
+{
+public:
+ friend class Region;
+ friend class GraphicsPath;
+ friend class Image;
+ friend class Bitmap;
+ friend class Metafile;
+ friend class Font;
+ friend class FontFamily;
+ friend class FontCollection;
+ friend class CachedBitmap;
+
+ // Get a graphics context from an existing Win32 HDC or HWND
+ static Graphics* FromHDC(IN HDC hdc)
+ {
+ return new Graphics(hdc);
+ }
+
+ static Graphics* FromHDC(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ return new Graphics(hdc, hdevice);
+ }
+
+ static Graphics* FromHWND(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ return new Graphics(hwnd, icm);
+ }
+
+ static Graphics* FromImage(IN Image *image)
+ {
+ return new Graphics(image);
+ }
+
+ Graphics(IN HDC hdc)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (icm)
+ {
+ lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
+ }
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN Image* image)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (image != NULL)
+ {
+ lastResult = DllExports::GdipGetImageGraphicsContext(
+ image->nativeImage, &graphics);
+ }
+ SetNativeGraphics(graphics);
+ }
+
+ ~Graphics()
+ {
+ DllExports::GdipDeleteGraphics(nativeGraphics);
+ }
+
+ VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
+ {
+ DllExports::GdipFlush(nativeGraphics, intention);
+ }
+
+ //------------------------------------------------------------------------
+ // Interop methods
+ //------------------------------------------------------------------------
+
+ // Locks the graphics until ReleaseDC is called
+ HDC GetHDC()
+ {
+ HDC hdc = NULL;
+
+ SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
+
+ return hdc;
+ }
+
+ VOID ReleaseHDC(IN HDC hdc)
+ {
+ SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
+ }
+
+ //------------------------------------------------------------------------
+ // Rendering modes
+ //------------------------------------------------------------------------
+
+ Status SetRenderingOrigin(IN INT x, IN INT y)
+ {
+ return SetStatus(
+ DllExports::GdipSetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const
+ {
+ return SetStatus(
+ DllExports::GdipGetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status SetCompositingMode(IN CompositingMode compositingMode)
+ {
+ return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
+ compositingMode));
+ }
+
+ CompositingMode GetCompositingMode() const
+ {
+ CompositingMode mode;
+
+ SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetCompositingQuality(IN CompositingQuality compositingQuality)
+ {
+ return SetStatus(DllExports::GdipSetCompositingQuality(
+ nativeGraphics,
+ compositingQuality));
+ }
+
+ CompositingQuality GetCompositingQuality() const
+ {
+ CompositingQuality quality;
+
+ SetStatus(DllExports::GdipGetCompositingQuality(
+ nativeGraphics,
+ &quality));
+
+ return quality;
+ }
+
+ Status SetTextRenderingHint(IN TextRenderingHint newMode)
+ {
+#ifndef DCR_USE_NEW_186764
+ /* temporarly set the high bit to warn that we are using the new definition for the flag */
+ newMode = (TextRenderingHint) (newMode | 0x0f000);
+#endif // DCR_USE_NEW_186764
+ return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
+ newMode));
+ }
+
+ TextRenderingHint GetTextRenderingHint() const
+ {
+ TextRenderingHint hint;
+
+ SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
+ &hint));
+
+ return hint;
+ }
+
+#ifdef DCR_USE_NEW_188922
+ Status SetTextContrast(IN UINT contrast)
+ {
+ return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,
+ contrast));
+ }
+
+ UINT GetTextContrast() const
+ {
+ UINT contrast;
+
+ SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,
+ &contrast));
+
+ return contrast;
+ }
+#else
+ Status SetTextGammaValue(IN UINT gammaValue)
+ {
+ return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
+ gammaValue));
+ }
+
+ UINT GetTextGammaValue() const
+ {
+ UINT gammaValue;
+
+ SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
+ &gammaValue));
+
+ return gammaValue;
+ }
+
+#endif // DCR_USE_NEW_188922
+
+
+ InterpolationMode GetInterpolationMode() const
+ {
+ InterpolationMode mode = InterpolationModeInvalid;
+
+ SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetInterpolationMode(IN InterpolationMode interpolationMode)
+ {
+ return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
+ interpolationMode));
+ }
+
+ SmoothingMode GetSmoothingMode() const
+ {
+ SmoothingMode smoothingMode = SmoothingModeInvalid;
+
+ SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
+ &smoothingMode));
+
+ return smoothingMode;
+ }
+
+ Status SetSmoothingMode(IN SmoothingMode smoothingMode)
+ {
+ return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
+ smoothingMode));
+ }
+
+ PixelOffsetMode GetPixelOffsetMode() const
+ {
+ PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
+
+ SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
+ &pixelOffsetMode));
+
+ return pixelOffsetMode;
+ }
+
+ Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
+ {
+ return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
+ pixelOffsetMode));
+ }
+
+ //------------------------------------------------------------------------
+ // Manipulate the current world transform
+ //------------------------------------------------------------------------
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
+ angle, order));
+ }
+
+ /**
+ * Return the current world transform
+ */
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+
+ /**
+ * Manipulate the current page transform
+ */
+
+ Status SetPageUnit(IN Unit unit)
+ {
+ return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
+ unit));
+ }
+
+ Status SetPageScale(IN REAL scale)
+ {
+ return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
+ scale));
+ }
+
+ /**
+ * Retrieve the current page transform information
+ * notes @ these are atomic
+ */
+ Unit GetPageUnit() const
+ {
+ Unit unit;
+
+ SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
+
+ return unit;
+ }
+
+ REAL GetPageScale() const
+ {
+ REAL scale;
+
+ SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
+
+ return scale;
+ }
+
+ REAL GetDpiX() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ REAL GetDpiY() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ /**
+ * Transform points in the current graphics context
+ */
+ // float version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT PointF* pts,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ // integer version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT Point* pts,
+ IN INT count) const
+ {
+
+ return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ //------------------------------------------------------------------------
+ // GetNearestColor (for <= 8bpp surfaces)
+ // Note: alpha is ignored
+ //------------------------------------------------------------------------
+ Status GetNearestColor(IN OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB argb = color->GetValue();
+
+ Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ /**
+ * Vector drawing methods
+ *
+ * @notes Do we need a set of methods that take
+ * integer coordinate parameters?
+ */
+
+ // float version
+ Status DrawLine(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
+ pen->nativePen, x1, y1, x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ // int version
+ Status DrawLine(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return DrawLine(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawArc(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status DrawArc(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ // int version
+ Status DrawArc(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+
+ Status DrawArc(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ // float version
+ Status DrawBezier(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,
+ pen->nativePen, x1, y1,
+ x2, y2, x3, y3, x4, y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // int version
+ Status DrawBezier(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
+ pen->nativePen, x, y,
+ width, height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
+ pen->nativePen,
+ rects, count));
+ }
+
+ // integer version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawRectangle(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
+ pen->nativePen,
+ rects,
+ count));
+ }
+
+ // float version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawEllipse(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // floating point version
+ Status DrawPie(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // integer point version
+ Status DrawPie(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // integer version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawPath(IN const Pen* pen,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
+ pen ? pen->nativePen : NULL,
+ path ? path->nativePath : NULL));
+ }
+
+ // float version
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
+ pen->nativePen, points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
+ pen->nativePen, points,
+ count, tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
+ pen->nativePen, points,
+ count, offset,
+ numberOfSegments, tension));
+ }
+
+ // integer version
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
+ pen->nativePen,
+ points, count,
+ tension));
+ }
+
+ // integer version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status Clear(IN const Color &color)
+ {
+ return SetStatus(DllExports::GdipGraphicsClear(
+ nativeGraphics,
+ color.GetValue()));
+ }
+
+ // float version
+ Status FillRectangle(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
+ brush->nativeBrush,
+ rects, count));
+ }
+
+ // integer version
+ Status FillRectangle(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillRectangle(brush,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
+ brush->nativeBrush,
+ rects,
+ count));
+ }
+
+ // float version
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
+ brush->nativeBrush,
+ points, count, fillMode));
+ }
+
+ // integer version
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ fillMode));
+ }
+
+ // float version
+ Status FillEllipse(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ // integer version
+ Status FillEllipse(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status FillPie(IN const Brush* brush,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPie(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height, startAngle,
+ sweepAngle));
+ }
+
+ // integer version
+ Status FillPie(IN const Brush* brush,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status FillPath(IN const Brush* brush,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipFillPath(nativeGraphics,
+ brush->nativeBrush,
+ path->nativePath));
+ }
+
+ // float version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
+ brush->nativeBrush,
+ points, count));
+
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // integer version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
+ brush->nativeBrush,
+ points,
+ count));
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // float version
+ Status FillRegion(IN const Brush* brush,
+ IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
+ brush->nativeBrush,
+ region->nativeRegion));
+ }
+
+ // DrawString and MeasureString
+ Status
+ DrawString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN const Brush *brush
+ )
+ {
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const StringFormat *stringFormat,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ codepointsFitted,
+ linesFilled
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const SizeF &layoutRectSize,
+ IN const StringFormat *stringFormat,
+ OUT SizeF *size,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ RectF layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
+ RectF boundingBox;
+ Status status;
+
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ status = SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ size ? &boundingBox : NULL,
+ codepointsFitted,
+ linesFilled
+ ));
+
+ if (size && status == Ok)
+ {
+ size->Width = boundingBox.Width;
+ size->Height = boundingBox.Height;
+ }
+
+ return status;
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+#ifdef DCR_USE_NEW_174340
+ Status
+ MeasureCharacterRanges(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT regionCount,
+ OUT Region *regions
+ ) const
+ {
+ if (!regions || regionCount <= 0)
+ {
+ return InvalidParameter;
+ }
+
+ GpRegion **nativeRegions = new GpRegion* [regionCount];
+
+ if (!nativeRegions)
+ {
+ return OutOfMemory;
+ }
+
+ for (INT i = 0; i < regionCount; i++)
+ {
+ nativeRegions[i] = regions[i].nativeRegion;
+ }
+
+ Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ regionCount,
+ nativeRegions
+ ));
+
+ delete [] nativeRegions;
+
+ return status;
+ }
+#endif
+
+
+#ifndef DCR_USE_NEW_174340
+ Status
+ MeasureStringRegion(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT firstCharacterIndex,
+ IN INT characterCount,
+ OUT Region *region
+ ) const
+ {
+ if (region == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return (SetStatus(DllExports::GdipMeasureStringRegion(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ firstCharacterIndex,
+ characterCount,
+ region->nativeRegion)));
+ }
+#endif
+
+ Status DrawDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const Brush *brush,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix
+ )
+ {
+ return SetStatus(DllExports::GdipDrawDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ brush ? brush->nativeBrush : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL
+ ));
+ }
+
+ Status MeasureDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ boundingBox
+ ));
+ }
+
+#ifndef DCR_USE_NEW_168772
+ Status DriverStringPointToCodepoint(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ IN const PointF &hit,
+ OUT INT *index,
+ OUT BOOL *rightEdge,
+ OUT REAL *distance
+ )
+ {
+ return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ &hit,
+ index,
+ rightEdge,
+ distance
+ ));
+ }
+#endif
+
+ // Draw a cached bitmap on this graphics destination offset by
+ // x, y. Note this will fail with WrongState if the CachedBitmap
+ // native format differs from this Graphics.
+
+ Status DrawCachedBitmap(IN CachedBitmap *cb,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawCachedBitmap(
+ nativeGraphics,
+ cb->nativeCachedBitmap,
+ x, y
+ ));
+ }
+
+ /**
+ * Draw images (both bitmap and vector)
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN const PointF& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y)
+ {
+ return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& rect)
+ {
+ return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN const Point& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& rect)
+ {
+ return DrawImage(image,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) {
+ return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ /**
+ * Affine or perspective blt
+ * destPoints.length = 3: rect => parallelogram
+ * destPoints[0] <=> top-left corner of the source rectangle
+ * destPoints[1] <=> top-right corner
+ * destPoints[2] <=> bottom-left corner
+ * destPoints.length = 4: rect => quad
+ * destPoints[3] <=> bottom-right corner
+ *
+ * @notes Perspective blt only works for bitmap images.
+ */
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count));
+ }
+
+ /**
+ * We need another set of methods similar to the ones above
+ * that take an additional Rect parameter to specify the
+ * portion of the source image to be drawn.
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x, y,
+ srcx, srcy,
+ srcwidth, srcheight, srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& destRect,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx, srcy,
+ srcwidth, srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count,
+ srcx, srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& destRect,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // The following methods are for playing an EMF+ to a graphics
+ // via the enumeration interface. Each record of the EMF+ is
+ // sent to the callback (along with the callbackData). Then
+ // the callback can invoke the Metafile::PlayRecord method
+ // to play the particular record.
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ /**
+ * Clipping region operations
+ *
+ * @notes Simply incredible redundancy here.
+ */
+ Status SetClip(IN const Graphics* g,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
+ g->nativeGraphics,
+ combineMode));
+ }
+
+ Status SetClip(IN const RectF& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const Rect& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const GraphicsPath* path,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
+ path->nativePath,
+ combineMode));
+ }
+
+ Status SetClip(IN const Region* region,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ combineMode));
+ }
+
+ // This is different than the other SetClip methods because it assumes
+ // that the HRGN is already in device units, so it doesn't transform
+ // the coordinates in the HRGN.
+ Status SetClip(IN HRGN hRgn,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
+ combineMode));
+ }
+
+ Status IntersectClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeIntersect));
+ }
+
+ Status ExcludeClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeExclude));
+ }
+
+ Status ResetClip()
+ {
+ return SetStatus(DllExports::GdipResetClip(nativeGraphics));
+ }
+
+ Status TranslateClip(IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
+ }
+
+ Status TranslateClip(IN INT dx,
+ IN INT dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
+ dx, dy));
+ }
+
+ /**
+ * GetClip region from graphics context
+ */
+ Status GetClip(OUT Region* region) const
+ {
+ return SetStatus(DllExports::GdipGetClip(nativeGraphics,
+ region->nativeRegion));
+ }
+
+ /**
+ * Hit testing operations
+ */
+ Status GetClipBounds(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
+ }
+
+ Status GetClipBounds(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
+ }
+
+ BOOL IsClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ Status GetVisibleClipBounds(OUT RectF *rect) const
+ {
+
+ return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
+ rect));
+ }
+
+ Status GetVisibleClipBounds(OUT Rect *rect) const
+ {
+ return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
+ rect));
+ }
+
+ BOOL IsVisibleClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y) const
+ {
+ return IsVisible(Point(x,y));
+ }
+
+ BOOL IsVisible(IN const Point& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) const
+ {
+ return IsVisible(Rect(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const Rect& rect) const
+ {
+
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y) const
+ {
+ return IsVisible(PointF(x, y));
+ }
+
+ BOOL IsVisible(IN const PointF& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height) const
+ {
+ return IsVisible(RectF(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const RectF& rect) const
+ {
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ /**
+ * Save/restore graphics state
+ */
+ GraphicsState Save() const
+ {
+ GraphicsState gstate;
+
+ SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
+
+ return gstate;
+ }
+
+ Status Restore(IN GraphicsState gstate)
+ {
+ return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
+ gstate));
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const RectF &dstrect,
+ IN const RectF &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const Rect &dstrect,
+ IN const Rect &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ GraphicsContainer BeginContainer()
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
+
+ return state;
+ }
+
+ Status EndContainer(IN GraphicsContainer state)
+ {
+ return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
+ }
+
+ // only valid when recording metafiles
+ Status AddMetafileComment(IN const BYTE * data,
+ IN UINT sizeData)
+ {
+ return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
+ }
+
+ /**
+ * Get/SetLayout
+ * Support for Middle East localization (right-to-left mirroring)
+ */
+ GraphicsLayout GetLayout() const
+ {
+ GraphicsLayout layout;
+
+ SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
+
+ return layout;
+ }
+
+ Status SetLayout(IN const GraphicsLayout layout)
+ {
+ return SetStatus(
+ DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)
+ );
+ }
+
+ static HPALETTE GetHalftonePalette()
+ {
+ return DllExports::GdipCreateHalftonePalette();
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Graphics(const Graphics &);
+ Graphics& operator=(const Graphics &);
+protected:
+
+#else
+
+ Graphics(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ }
+
+ Graphics& operator=(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Graphics(GpGraphics* graphics)
+ {
+ lastResult = Ok;
+ SetNativeGraphics(graphics);
+ }
+
+ VOID SetNativeGraphics(GpGraphics *graphics)
+ {
+ this->nativeGraphics = graphics;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ // Methods necessary to subclass Graphics for extension test.
+
+ GpGraphics* GetNativeGraphics() const
+ {
+ return this->nativeGraphics;
+ }
+
+ GpPen* GetNativePen(const Pen* pen)
+ {
+ return pen->nativePen;
+ }
+
+protected:
+ GpGraphics* nativeGraphics;
+ mutable Status lastResult;
+
+};
+
+//----------------------------------------------------------------------------
+// Extra implementation of GraphicsPath methods that use Graphics
+//----------------------------------------------------------------------------
+
+/**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ */
+
+inline Status
+GraphicsPath::GetBounds(
+ OUT RectF* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+// integer version
+inline Status
+GraphicsPath::GetBounds(
+ OUT Rect* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen
+) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+//----------------------------------------------------------------------------
+// Hit testing operations
+//----------------------------------------------------------------------------
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN INT x,
+ IN INT y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
new file mode 100644
index 0000000000..215c4d09ea
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
@@ -0,0 +1,793 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusHeaders.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSHEADERS_H
+#define _GDIPLUSHEADERS_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for regions
+//--------------------------------------------------------------------------
+
+// Include the class declarations here and have inline class implementation
+// in separate file to avoid circular references.
+
+class Region : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Region();
+ Region(IN const RectF& rect);
+ Region(IN const Rect& rect);
+ Region(IN const GraphicsPath* path);
+ Region(IN const BYTE* regionData, IN INT size);
+ Region(IN HRGN hRgn);
+ static Region* FromHRGN(IN HRGN hRgn);
+
+ ~Region();
+ Region* Clone() const;
+
+ Status MakeInfinite();
+ Status MakeEmpty();
+
+ // Get the size of the buffer needed for the GetData method
+ UINT GetDataSize() const;
+
+ // buffer - where to put the data
+ // bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+ // sizeFilled - if not NULL, this is an OUT param that says how many bytes
+ // of data were written to the buffer.
+ Status GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled = NULL) const;
+
+ Status Intersect(IN const Rect& rect);
+ Status Intersect(IN const RectF& rect);
+ Status Intersect(IN const GraphicsPath* path);
+ Status Intersect(IN const Region* region);
+ Status Union(IN const Rect& rect);
+ Status Union(IN const RectF& rect);
+ Status Union(IN const GraphicsPath* path);
+ Status Union(IN const Region* region);
+ Status Xor(IN const Rect& rect);
+ Status Xor(IN const RectF& rect);
+ Status Xor(IN const GraphicsPath* path);
+ Status Xor(IN const Region* region);
+ Status Exclude(IN const Rect& rect);
+ Status Exclude(IN const RectF& rect);
+ Status Exclude(IN const GraphicsPath* path);
+ Status Exclude(IN const Region* region);
+ Status Complement(IN const Rect& rect);
+ Status Complement(IN const RectF& rect);
+ Status Complement(IN const GraphicsPath* path);
+ Status Complement(IN const Region* region);
+ Status Translate(IN REAL dx,
+ IN REAL dy);
+ Status Translate(IN INT dx,
+ IN INT dy);
+ Status Transform(IN const Matrix* matrix);
+
+ Status GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const;
+
+ Status GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const;
+
+ HRGN GetHRGN (IN const Graphics * g) const;
+
+ BOOL IsEmpty(IN const Graphics *g) const;
+ BOOL IsInfinite(IN const Graphics *g) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(Point(x, y), g);
+ }
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(PointF(x, y), g);
+ }
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN const Graphics* g) const
+ {
+ return IsVisible(Rect(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const Rect& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(RectF(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const RectF& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL Equals(IN const Region* region,
+ IN const Graphics* g) const;
+
+ UINT GetRegionScansCount(IN const Matrix* matrix) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT RectF* rects,
+ OUT INT* count) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT Rect* rects,
+ OUT INT* count) const;
+ Status GetLastStatus() const;
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Region(const Region &region);
+ Region& operator=(const Region &region);
+protected:
+
+#else
+ Region(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ }
+
+ Region& operator=(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ return *this;
+ }
+#endif
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ Region(GpRegion* nativeRegion);
+
+ VOID SetNativeRegion(GpRegion* nativeRegion);
+
+protected:
+ GpRegion* nativeRegion;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for FontFamily
+//--------------------------------------------------------------------------
+
+class FontFamily : public GdiplusBase
+{
+public:
+ friend class Font;
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class FontCollection;
+
+ FontFamily();
+
+ FontFamily(
+ IN const WCHAR *name,
+ IN const FontCollection *fontCollection = NULL
+ );
+
+ ~FontFamily();
+
+ static const FontFamily *GenericSansSerif();
+ static const FontFamily *GenericSerif();
+ static const FontFamily *GenericMonospace();
+
+ Status GetFamilyName(
+ OUT WCHAR name[LF_FACESIZE],
+ IN LANGID language = 0
+ ) const;
+
+// Copy operator
+ FontFamily * Clone() const;
+
+ BOOL IsAvailable() const
+ {
+ return (nativeFamily != NULL);
+ };
+
+ BOOL IsStyleAvailable(IN INT style) const;
+
+ UINT16 GetEmHeight (IN INT style) const;
+ UINT16 GetCellAscent (IN INT style) const;
+ UINT16 GetCellDescent (IN INT style) const;
+ UINT16 GetLineSpacing (IN INT style) const;
+
+ ///////////////////////////////////////////////////////////
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontFamily(const FontFamily &);
+ FontFamily& operator=(const FontFamily &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const;
+
+ // private constructor for copy
+ FontFamily(GpFontFamily * nativeFamily, Status status);
+
+///////////////////////////////////////
+// Data members
+protected:
+
+ GpFontFamily *nativeFamily;
+ mutable Status lastResult;
+};
+
+static FontFamily *GenericSansSerifFontFamily = NULL;
+static FontFamily *GenericSerifFontFamily = NULL;
+static FontFamily *GenericMonospaceFontFamily = NULL;
+
+static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0};
+static BYTE GenericSerifFontFamilyBuffer [sizeof(FontFamily)] = {0};
+static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for fonts
+//--------------------------------------------------------------------------
+
+class Font : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Font(IN HDC hdc);
+ Font(IN HDC hdc,
+ IN const LOGFONTA* logfont);
+ Font(IN HDC hdc,
+ IN const LOGFONTW* logfont);
+#ifdef DCR_USE_NEW_127084
+ Font(IN HDC hdc,
+ IN const HFONT hfont);
+#endif
+ Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint
+ );
+
+ Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint,
+ IN const FontCollection * fontCollection = NULL
+ );
+
+ Status GetLogFontA(IN const Graphics* g,
+ OUT LOGFONTA * logfontA) const;
+ Status GetLogFontW(IN const Graphics* g,
+ OUT LOGFONTW * logfontW) const;
+
+ Font* Clone() const;
+ ~Font();
+ BOOL IsAvailable() const;
+ INT GetStyle() const;
+ REAL GetSize() const;
+ Unit GetUnit() const;
+ Status GetLastStatus() const;
+ REAL GetHeight(IN const Graphics *graphics = NULL) const;
+#ifdef DCR_USE_NEW_125467
+ REAL GetHeight(IN REAL dpi) const;
+#endif
+
+ Status GetFamily(OUT FontFamily *family) const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Font(const Font &);
+ Font& operator=(const Font &);
+
+#endif
+
+protected:
+ Font(GpFont* font, Status status);
+ VOID SetNativeFont(GpFont *Font);
+ Status SetStatus(Status status) const;
+
+protected:
+ /*
+ * handle to native line texture object
+ */
+
+ GpFont* nativeFont;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Abstract base classes for font collections
+//--------------------------------------------------------------------------
+
+class FontCollection : public GdiplusBase
+{
+public:
+ friend class FontFamily;
+
+ FontCollection();
+ virtual ~FontCollection();
+
+ INT GetFamilyCount() const; // number of enumerable families in the collection
+
+ Status GetFamilies( // enumerate the fonts in a collection
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+ ) const;
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontCollection(const FontCollection &);
+ FontCollection& operator=(const FontCollection &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const ;
+
+ GpFontCollection *nativeFontCollection;
+ mutable Status lastResult;
+};
+
+
+class InstalledFontCollection : public FontCollection
+{
+public:
+ InstalledFontCollection();
+ ~InstalledFontCollection();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ InstalledFontCollection(const InstalledFontCollection &);
+ InstalledFontCollection& operator=(const InstalledFontCollection &);
+
+#endif
+
+protected:
+#ifndef DCR_USE_NEW_235072
+ Status InstallFontFile(IN const WCHAR* filename);
+ Status UninstallFontFile(IN const WCHAR* filename);
+#endif
+ Status SetStatus(Status status) const ;
+};
+
+
+class PrivateFontCollection : public FontCollection
+{
+public:
+ PrivateFontCollection();
+ ~PrivateFontCollection();
+
+ Status AddFontFile(IN const WCHAR* filename);
+ Status AddMemoryFont(IN const VOID* memory,
+ IN INT length);
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PrivateFontCollection(const PrivateFontCollection &);
+ PrivateFontCollection& operator=(const PrivateFontCollection &);
+
+#endif
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for bitmap image and metafile
+//--------------------------------------------------------------------------
+
+// !!! Note:
+// Include the class declarations here and have the inline class
+// implementation in a separate file. This is done to resolve a
+// circular dependency since one of the Bitmap methods needs to
+// access the private member nativeGraphics of the Graphics object.
+
+class Image : public GdiplusBase
+{
+public:
+ friend class Brush;
+ friend class TextureBrush;
+ friend class Graphics;
+
+#ifndef DCR_USE_NEW_140782
+ Image(
+ IN const WCHAR* filename
+ );
+
+ Image(
+ IN IStream* stream
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename
+ );
+
+ static Image* FromStream(
+ IN IStream* stream
+ );
+#else
+ Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+#endif
+
+ virtual ~Image();
+ virtual Image* Clone();
+
+ Status Save(IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status Save(IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status SaveAdd(IN const EncoderParameters* encoderParams);
+ Status SaveAdd(IN Image* newImage,
+ IN const EncoderParameters* encoderParams);
+
+ ImageType GetType() const;
+ Status GetPhysicalDimension(OUT SizeF* size);
+ Status GetBounds(OUT RectF* srcRect,
+ OUT Unit* srcUnit);
+
+ UINT GetWidth();
+ UINT GetHeight();
+ REAL GetHorizontalResolution();
+ REAL GetVerticalResolution();
+ UINT GetFlags();
+ Status GetRawFormat(OUT GUID *format);
+ PixelFormat GetPixelFormat();
+
+ INT GetPaletteSize();
+ Status GetPalette(OUT ColorPalette* palette,
+ IN INT size);
+ Status SetPalette(IN const ColorPalette* palette);
+
+ Image* GetThumbnailImage(IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback = NULL,
+ IN VOID* callbackData = NULL);
+ UINT GetFrameDimensionsCount();
+ Status GetFrameDimensionsList(OUT GUID* dimensionIDs,
+ IN UINT count);
+ UINT GetFrameCount(IN const GUID* dimensionID);
+ Status SelectActiveFrame(IN const GUID* dimensionID,
+ IN UINT frameIndex);
+ Status RotateFlip(IN RotateFlipType rotateFlipType);
+ UINT GetPropertyCount();
+ Status GetPropertyIdList(IN UINT numOfProperty,
+ OUT PROPID* list);
+ UINT GetPropertyItemSize(IN PROPID propId);
+ Status GetPropertyItem(IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer);
+ Status GetPropertySize(OUT UINT* totalBufferSize,
+ OUT UINT* numProperties);
+ Status GetAllPropertyItems(IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems);
+ Status RemovePropertyItem(IN PROPID propId);
+ Status SetPropertyItem(IN const PropertyItem* item);
+
+ UINT GetEncoderParameterListSize(IN const CLSID* clsidEncoder);
+ Status GetEncoderParameterList(IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer);
+
+ // Support for Middle East localization (right-to-left mirroring)
+ ImageLayout GetLayout() const;
+ Status SetLayout(IN const ImageLayout layout);
+
+ Status GetLastStatus() const;
+
+protected:
+
+ Image() {}
+
+ Image(GpImage *nativeImage, Status status);
+
+ VOID SetNativeImage(GpImage* nativeImage);
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpImage* nativeImage;
+ mutable Status lastResult;
+ mutable Status loadStatus;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+
+#else
+
+protected:
+
+#endif
+
+ // Disable copy constructor and assignment operator
+
+ Image(IN const Image& C);
+ Image& operator=(IN const Image& C);
+};
+
+class Bitmap : public Image
+{
+public:
+ friend class Image;
+ friend class CachedBitmap;
+
+ Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(IN INT width,
+ IN INT height,
+ IN INT stride, PixelFormat format,
+ IN BYTE* scan0);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN PixelFormat format = PixelFormat32bppARGB);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN Graphics* target);
+
+ Bitmap* Clone(IN const Rect& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format);
+ Bitmap* Clone(IN const RectF& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format);
+
+ Status LockBits(IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData);
+ Status UnlockBits(IN BitmapData* lockedBitmapData);
+ Status GetPixel(IN INT x,
+ IN INT y,
+ OUT Color *color);
+ Status SetPixel(IN INT x,
+ IN INT y,
+ IN const Color &color);
+ Status SetResolution(IN REAL xdpi,
+ IN REAL ydpi);
+
+ // GDI interop:
+
+ Bitmap(IN IDirectDrawSurface7* surface);
+ Bitmap(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ Bitmap(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ Bitmap(IN HICON hicon);
+ Bitmap(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+ static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface);
+ static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ static Bitmap* FromHBITMAP(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ static Bitmap* FromHICON(IN HICON hicon);
+ static Bitmap* FromResource(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+
+ Status GetHBITMAP(IN const Color& colorBackground,
+ OUT HBITMAP *hbmReturn);
+ Status GetHICON(HICON *hicon);
+
+#ifdef DCR_USE_NEW_250932
+private:
+ Bitmap(const Bitmap &);
+ Bitmap& operator=(const Bitmap &);
+#endif
+
+protected:
+ Bitmap(GpBitmap *nativeBitmap);
+};
+
+class CustomLineCap : public GdiplusBase
+{
+public:
+ friend class Pen;
+
+ CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap = LineCapFlat,
+ IN REAL baseInset = 0
+ );
+ virtual ~CustomLineCap();
+
+ CustomLineCap* Clone() const;
+
+ Status SetStrokeCap(IN LineCap strokeCap)
+ {
+ // This changes both start and and caps.
+
+ return SetStrokeCaps(strokeCap, strokeCap);
+ }
+
+ Status SetStrokeCaps(IN LineCap startCap,
+ IN LineCap endCap);
+ Status GetStrokeCaps(OUT LineCap* startCap,
+ OUT LineCap* endCap) const;
+ Status SetStrokeJoin(IN LineJoin lineJoin);
+ LineJoin GetStrokeJoin() const;
+ Status SetBaseCap(IN LineCap baseCap);
+ LineCap GetBaseCap() const;
+ Status SetBaseInset(IN REAL inset);
+ REAL GetBaseInset() const;
+ Status SetWidthScale(IN REAL widthScale);
+ REAL GetWidthScale() const;
+
+protected:
+ CustomLineCap();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CustomLineCap(const CustomLineCap &);
+ CustomLineCap& operator=(const CustomLineCap &);
+protected:
+
+#else
+
+ CustomLineCap(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ }
+
+ CustomLineCap& operator=(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ CustomLineCap(GpCustomLineCap* nativeCap, Status status)
+ {
+ lastResult = status;
+ SetNativeCap(nativeCap);
+ }
+
+ VOID SetNativeCap(GpCustomLineCap* nativeCap)
+ {
+ this->nativeCap = nativeCap;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpCustomLineCap* nativeCap;
+ mutable Status lastResult;
+};
+
+class CachedBitmap : public GdiplusBase
+{
+ friend Graphics;
+
+public:
+ CachedBitmap(IN Bitmap *bitmap,
+ IN Graphics *graphics);
+ virtual ~CachedBitmap();
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CachedBitmap(const CachedBitmap &);
+ CachedBitmap& operator=(const CachedBitmap &);
+
+#endif
+
+protected:
+ GpCachedBitmap *nativeCachedBitmap;
+ mutable Status lastResult;
+};
+
+#endif // !_GDIPLUSHEADERS.HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
new file mode 100644
index 0000000000..e9c02deb7e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
@@ -0,0 +1,73 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusImageCodec.h
+*
+* Abstract:
+*
+* APIs for imaging codecs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGECODEC_H
+#define _GDIPLUSIMAGECODEC_H
+
+//--------------------------------------------------------------------------
+// Codec Management APIs
+//--------------------------------------------------------------------------
+
+inline Status
+GetImageDecodersSize(
+ OUT UINT *numDecoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageDecodersSize(numDecoders, size);
+}
+
+
+inline Status
+GetImageDecoders(
+ IN UINT numDecoders,
+ IN UINT size,
+ OUT ImageCodecInfo *decoders)
+{
+ return DllExports::GdipGetImageDecoders(numDecoders, size, decoders);
+}
+
+
+inline Status
+GetImageEncodersSize(
+ OUT UINT *numEncoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageEncodersSize(numEncoders, size);
+}
+
+
+inline Status
+GetImageEncoders(
+ IN UINT numEncoders,
+ IN UINT size,
+ OUT ImageCodecInfo *encoders)
+{
+ return DllExports::GdipGetImageEncoders(numEncoders, size, encoders);
+}
+
+inline Status
+AddImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipAddImageCodec(codec);
+}
+
+inline Status
+RemoveImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipRemoveImageCodec(codec);
+}
+
+#endif // _GDIPLUSIMAGECODEC_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
new file mode 100644
index 0000000000..35dd4d0634
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
@@ -0,0 +1,540 @@
+/**************************************************************************\
+*
+* Copyright (c) 1999-2000 Microsoft Corporation
+*
+* Module Name:
+*
+* GdiplusImaging.h
+*
+* Abstract:
+*
+* GUIDs defined and used by the imaging library
+*
+\**************************************************************************/
+#ifndef _GDIPLUSIMAGING_H
+#define _GDIPLUSIMAGING_H
+
+//---------------------------------------------------------------------------
+// Image file format identifiers
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(ImageFormatUndefined, 0xb96b3ca9,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatMemoryBMP, 0xb96b3caa,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatBMP, 0xb96b3cab,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEMF, 0xb96b3cac,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatWMF, 0xb96b3cad,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatPNG, 0xb96b3caf,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatGIF, 0xb96b3cb0,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatTIFF, 0xb96b3cb1,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEXIF, 0xb96b3cb2,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#ifndef DCR_USE_NEW_140855
+DEFINE_GUID(ImageFormatPhotoCD, 0xb96b3cb3,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatFlashPIX, 0xb96b3cb4,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#endif
+DEFINE_GUID(ImageFormatIcon, 0xb96b3cb5,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+
+//---------------------------------------------------------------------------
+// Predefined multi-frame dimension IDs
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FrameDimensionTime, 0x6aedbd6d,0x3fb5,0x418a,0x83,0xa6,0x7f,0x45,0x22,0x9d,0xc8,0x72);
+DEFINE_GUID(FrameDimensionResolution, 0x84236f7b,0x3bd3,0x428f,0x8d,0xab,0x4e,0xa1,0x43,0x9c,0xa3,0x15);
+DEFINE_GUID(FrameDimensionPage, 0x7462dc86,0x6180,0x4c7e,0x8e,0x3f,0xee,0x73,0x33,0xa7,0xa4,0x83);
+
+//---------------------------------------------------------------------------
+// Property sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FormatIDImageInformation, 0xe5836cbe,0x5eef,0x4f1d,0xac,0xde,0xae,0x4c,0x43,0xb6,0x08,0xce);
+DEFINE_GUID(FormatIDJpegAppHeaders, 0x1c4afdcd,0x6177,0x43cf,0xab,0xc7,0x5f,0x51,0xaf,0x39,0xee,0x85);
+
+#ifndef DCR_USE_NEW_140855
+//---------------------------------------------------------------------------
+// Decoder parameter sets
+//---------------------------------------------------------------------------
+DEFINE_GUID(DecoderTransColor, 0xb7a98c8f,0xdce7,0x457d,0xbf,0xa5,0xce,0xa7,0x1b,0xd1,0x4d,0xd6);
+DEFINE_GUID(DecoderTransRange, 0xabeed189,0xd988,0x4d03,0xb4,0x25,0x57,0x10,0x55,0xc7,0x6a,0xd1);
+DEFINE_GUID(DecoderOutputChannel, 0x2ff8f51e,0x724d,0x45fe,0x86,0xce,0x17,0x77,0xa0,0x56,0xda,0x60);
+DEFINE_GUID(DecoderIconRes, 0x5c656eec,0xe94f,0x45ba,0xa6,0xf6,0x10,0x62,0xe8,0x5f,0x4a,0x7f);
+#endif
+
+//---------------------------------------------------------------------------
+// Encoder parameter sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
+DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);
+DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);
+DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);
+DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);
+DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
+DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);
+DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);
+DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);
+DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);
+
+DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);
+
+MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")
+IImageBytes : public IUnknown
+{
+public:
+ // Return total number of bytes in the IStream
+
+ STDMETHOD(CountBytes)(
+ OUT UINT *pcb
+ ) = 0;
+
+ // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the
+ // pointer to the beginning of the locked memory chunk in "ppvBytes"
+
+ STDMETHOD(LockBytes)(
+ IN UINT cb,
+ IN ULONG ulOffset,
+ OUT const VOID ** ppvBytes
+ ) = 0;
+
+ // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the
+ // stream
+
+ STDMETHOD(UnlockBytes)(
+ IN const VOID *pvBytes,
+ IN UINT cb,
+ IN ULONG ulOffset
+ ) = 0;
+};
+
+//--------------------------------------------------------------------------
+// ImageCodecInfo structure
+//--------------------------------------------------------------------------
+
+class ImageCodecInfo
+{
+public:
+ CLSID Clsid;
+ GUID FormatID;
+ const WCHAR* CodecName;
+ const WCHAR* DllName;
+ const WCHAR* FormatDescription;
+ const WCHAR* FilenameExtension;
+ const WCHAR* MimeType;
+ DWORD Flags;
+ DWORD Version;
+ DWORD SigCount;
+ DWORD SigSize;
+ const BYTE* SigPattern;
+ const BYTE* SigMask;
+};
+
+//--------------------------------------------------------------------------
+// Information flags about image codecs
+//--------------------------------------------------------------------------
+
+enum ImageCodecFlags
+{
+ ImageCodecFlagsEncoder = 0x00000001,
+ ImageCodecFlagsDecoder = 0x00000002,
+ ImageCodecFlagsSupportBitmap = 0x00000004,
+ ImageCodecFlagsSupportVector = 0x00000008,
+ ImageCodecFlagsSeekableEncode = 0x00000010,
+ ImageCodecFlagsBlockingDecode = 0x00000020,
+
+ ImageCodecFlagsBuiltin = 0x00010000,
+ ImageCodecFlagsSystem = 0x00020000,
+ ImageCodecFlagsUser = 0x00040000
+};
+
+//---------------------------------------------------------------------------
+// Access modes used when calling Image::LockBits
+//---------------------------------------------------------------------------
+
+enum ImageLockMode
+{
+ ImageLockModeRead = 0x0001,
+ ImageLockModeWrite = 0x0002,
+ ImageLockModeUserInputBuf= 0x0004
+};
+
+//---------------------------------------------------------------------------
+// Information about image pixel data
+//---------------------------------------------------------------------------
+
+class BitmapData
+{
+public:
+ UINT Width;
+ UINT Height;
+ INT Stride;
+ PixelFormat PixelFormat;
+ VOID* Scan0;
+ UINT_PTR Reserved;
+};
+
+//---------------------------------------------------------------------------
+// Image flags
+//---------------------------------------------------------------------------
+
+enum ImageFlags
+{
+ ImageFlagsNone = 0,
+
+ // Low-word: shared with SINKFLAG_x
+
+ ImageFlagsScalable = 0x0001,
+ ImageFlagsHasAlpha = 0x0002,
+ ImageFlagsHasTranslucent = 0x0004,
+ ImageFlagsPartiallyScalable = 0x0008,
+
+ // Low-word: color space definition
+
+ ImageFlagsColorSpaceRGB = 0x0010,
+ ImageFlagsColorSpaceCMYK = 0x0020,
+ ImageFlagsColorSpaceGRAY = 0x0040,
+ ImageFlagsColorSpaceYCBCR = 0x0080,
+ ImageFlagsColorSpaceYCCK = 0x0100,
+
+ // Low-word: image size info
+
+ ImageFlagsHasRealDPI = 0x1000,
+ ImageFlagsHasRealPixelSize = 0x2000,
+
+ // High-word
+
+ ImageFlagsReadOnly = 0x00010000,
+ ImageFlagsCaching = 0x00020000
+};
+
+enum RotateFlipType
+{
+ RotateNoneFlipNone = 0,
+ Rotate90FlipNone = 1,
+ Rotate180FlipNone = 2,
+ Rotate270FlipNone = 3,
+
+ RotateNoneFlipX = 4,
+ Rotate90FlipX = 5,
+ Rotate180FlipX = 6,
+ Rotate270FlipX = 7,
+
+ RotateNoneFlipY = Rotate180FlipX,
+ Rotate90FlipY = Rotate270FlipX,
+ Rotate180FlipY = RotateNoneFlipX,
+ Rotate270FlipY = Rotate90FlipX,
+
+ RotateNoneFlipXY = Rotate180FlipNone,
+ Rotate90FlipXY = Rotate270FlipNone,
+ Rotate180FlipXY = RotateNoneFlipNone,
+ Rotate270FlipXY = Rotate90FlipNone
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameter structure
+//---------------------------------------------------------------------------
+class EncoderParameter
+{
+public:
+ GUID Guid; // GUID of the parameter
+ ULONG NumberOfValues; // Number of the parameter values
+ ULONG Type; // Value type, like ValueTypeLONG etc.
+ VOID* Value; // A pointer to the parameter values
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameters structure
+//---------------------------------------------------------------------------
+class EncoderParameters
+{
+public:
+ UINT Count; // Number of parameters in this structure
+ EncoderParameter Parameter[1]; // Parameter values
+};
+
+//---------------------------------------------------------------------------
+// Property Item
+//---------------------------------------------------------------------------
+class PropertyItem
+{
+public:
+ PROPID id; // ID of this property
+ ULONG length; // Length of the property value, in bytes
+ WORD type; // Type of the value, as one of TAG_TYPE_XXX
+ // defined above
+ VOID* value; // property value
+};
+
+#ifdef DCR_USE_NEW_140857
+//---------------------------------------------------------------------------
+// Image property types
+//---------------------------------------------------------------------------
+#define PropertyTagTypeByte 1
+#define PropertyTagTypeASCII 2
+#define PropertyTagTypeShort 3
+#define PropertyTagTypeLong 4
+#define PropertyTagTypeRational 5
+#define PropertyTagTypeUndefined 7
+#define PropertyTagTypeSLONG 9
+#define PropertyTagTypeSRational 10
+#endif
+
+//---------------------------------------------------------------------------
+// Image property ID tags
+//---------------------------------------------------------------------------
+
+#define PropertyTagExifIFD 0x8769
+#define PropertyTagGpsIFD 0x8825
+
+#define PropertyTagNewSubfileType 0x00FE
+#define PropertyTagSubfileType 0x00FF
+#define PropertyTagImageWidth 0x0100
+#define PropertyTagImageHeight 0x0101
+#define PropertyTagBitsPerSample 0x0102
+#define PropertyTagCompression 0x0103
+#define PropertyTagPhotometricInterp 0x0106
+#define PropertyTagThreshHolding 0x0107
+#define PropertyTagCellWidth 0x0108
+#define PropertyTagCellHeight 0x0109
+#define PropertyTagFillOrder 0x010A
+#define PropertyTagDocumentName 0x010D
+#define PropertyTagImageDescription 0x010E
+#define PropertyTagEquipMake 0x010F
+#define PropertyTagEquipModel 0x0110
+#define PropertyTagStripOffsets 0x0111
+#define PropertyTagOrientation 0x0112
+#define PropertyTagSamplesPerPixel 0x0115
+#define PropertyTagRowsPerStrip 0x0116
+#define PropertyTagStripBytesCount 0x0117
+#define PropertyTagMinSampleValue 0x0118
+#define PropertyTagMaxSampleValue 0x0119
+#define PropertyTagXResolution 0x011A // Image resolution in width direction
+#define PropertyTagYResolution 0x011B // Image resolution in height direction
+#define PropertyTagPlanarConfig 0x011C // Image data arrangement
+#define PropertyTagPageName 0x011D
+#define PropertyTagXPosition 0x011E
+#define PropertyTagYPosition 0x011F
+#define PropertyTagFreeOffset 0x0120
+#define PropertyTagFreeByteCounts 0x0121
+#define PropertyTagGrayResponseUnit 0x0122
+#define PropertyTagGrayResponseCurve 0x0123
+#define PropertyTagT4Option 0x0124
+#define PropertyTagT6Option 0x0125
+#define PropertyTagResolutionUnit 0x0128 // Unit of X and Y resolution
+#define PropertyTagPageNumber 0x0129
+#define PropertyTagTransferFuncition 0x012D
+#define PropertyTagSoftwareUsed 0x0131
+#define PropertyTagDateTime 0x0132
+#define PropertyTagArtist 0x013B
+#define PropertyTagHostComputer 0x013C
+#define PropertyTagPredictor 0x013D
+#define PropertyTagWhitePoint 0x013E
+#define PropertyTagPrimaryChromaticities 0x013F
+#define PropertyTagColorMap 0x0140
+#define PropertyTagHalftoneHints 0x0141
+#define PropertyTagTileWidth 0x0142
+#define PropertyTagTileLength 0x0143
+#define PropertyTagTileOffset 0x0144
+#define PropertyTagTileByteCounts 0x0145
+#define PropertyTagInkSet 0x014C
+#define PropertyTagInkNames 0x014D
+#define PropertyTagNumberOfInks 0x014E
+#define PropertyTagDotRange 0x0150
+#define PropertyTagTargetPrinter 0x0151
+#define PropertyTagExtraSamples 0x0152
+#define PropertyTagSampleFormat 0x0153
+#define PropertyTagSMinSampleValue 0x0154
+#define PropertyTagSMaxSampleValue 0x0155
+#define PropertyTagTransferRange 0x0156
+
+#define PropertyTagJPEGProc 0x0200
+#define PropertyTagJPEGInterFormat 0x0201
+#define PropertyTagJPEGInterLength 0x0202
+#define PropertyTagJPEGRestartInterval 0x0203
+#define PropertyTagJPEGLosslessPredictors 0x0205
+#define PropertyTagJPEGPointTransforms 0x0206
+#define PropertyTagJPEGQTables 0x0207
+#define PropertyTagJPEGDCTables 0x0208
+#define PropertyTagJPEGACTables 0x0209
+
+#define PropertyTagYCbCrCoefficients 0x0211
+#define PropertyTagYCbCrSubsampling 0x0212
+#define PropertyTagYCbCrPositioning 0x0213
+#define PropertyTagREFBlackWhite 0x0214
+
+#define PropertyTagICCProfile 0x8773 // This TAG is defined by ICC
+ // for embedded ICC in TIFF
+#define PropertyTagGamma 0x0301
+#define PropertyTagICCProfileDescriptor 0x0302
+#define PropertyTagSRGBRenderingIntent 0x0303
+
+#define PropertyTagImageTitle 0x0320
+#define PropertyTagCopyright 0x8298
+
+// Extra TAGs (Like Adobe Image Information tags etc.)
+
+#define PropertyTagResolutionXUnit 0x5001
+#define PropertyTagResolutionYUnit 0x5002
+#define PropertyTagResolutionXLengthUnit 0x5003
+#define PropertyTagResolutionYLengthUnit 0x5004
+#define PropertyTagPrintFlags 0x5005
+#define PropertyTagPrintFlagsVersion 0x5006
+#define PropertyTagPrintFlagsCrop 0x5007
+#define PropertyTagPrintFlagsBleedWidth 0x5008
+#define PropertyTagPrintFlagsBleedWidthScale 0x5009
+#define PropertyTagHalftoneLPI 0x500A
+#define PropertyTagHalftoneLPIUnit 0x500B
+#define PropertyTagHalftoneDegree 0x500C
+#define PropertyTagHalftoneShape 0x500D
+#define PropertyTagHalftoneMisc 0x500E
+#define PropertyTagHalftoneScreen 0x500F
+#define PropertyTagJPEGQuality 0x5010
+#define PropertyTagGridSize 0x5011
+#define PropertyTagThumbnailFormat 0x5012 // 1 = JPEG, 0 = RAW RGB
+#define PropertyTagThumbnailWidth 0x5013
+#define PropertyTagThumbnailHeight 0x5014
+#define PropertyTagThumbnailColorDepth 0x5015
+#define PropertyTagThumbnailPlanes 0x5016
+#define PropertyTagThumbnailRawBytes 0x5017
+#define PropertyTagThumbnailSize 0x5018
+#define PropertyTagThumbnailCompressedSize 0x5019
+#define PropertyTagColorTransferFunction 0x501A
+#define PropertyTagThumbnailData 0x501B// RAW thumbnail bits in
+ // JPEG format or RGB format
+ // depends on
+ // PropertyTagThumbnailFormat
+
+// Thumbnail related TAGs
+
+#define PropertyTagThumbnailImageWidth 0x5020 // Thumbnail width
+#define PropertyTagThumbnailImageHeight 0x5021 // Thumbnail height
+#define PropertyTagThumbnailBitsPerSample 0x5022 // Number of bits per
+ // component
+#define PropertyTagThumbnailCompression 0x5023 // Compression Scheme
+#define PropertyTagThumbnailPhotometricInterp 0x5024 // Pixel composition
+#define PropertyTagThumbnailImageDescription 0x5025 // Image Tile
+#define PropertyTagThumbnailEquipMake 0x5026 // Manufacturer of Image
+ // Input equipment
+#define PropertyTagThumbnailEquipModel 0x5027 // Model of Image input
+ // equipment
+#define PropertyTagThumbnailStripOffsets 0x5028 // Image data location
+#define PropertyTagThumbnailOrientation 0x5029 // Orientation of image
+#define PropertyTagThumbnailSamplesPerPixel 0x502A // Number of components
+#define PropertyTagThumbnailRowsPerStrip 0x502B // Number of rows per strip
+#define PropertyTagThumbnailStripBytesCount 0x502C // Bytes per compressed
+ // strip
+#define PropertyTagThumbnailResolutionX 0x502D // Resolution in width
+ // direction
+#define PropertyTagThumbnailResolutionY 0x502E // Resolution in height
+ // direction
+#define PropertyTagThumbnailPlanarConfig 0x502F // Image data arrangement
+#define PropertyTagThumbnailResolutionUnit 0x5030 // Unit of X and Y
+ // Resolution
+#define PropertyTagThumbnailTransferFunction 0x5031 // Transfer function
+#define PropertyTagThumbnailSoftwareUsed 0x5032 // Software used
+#define PropertyTagThumbnailDateTime 0x5033 // File change date and
+ // time
+#define PropertyTagThumbnailArtist 0x5034 // Person who created the
+ // image
+#define PropertyTagThumbnailWhitePoint 0x5035 // White point chromaticity
+#define PropertyTagThumbnailPrimaryChromaticities 0x5036
+ // Chromaticities of
+ // primaries
+#define PropertyTagThumbnailYCbCrCoefficients 0x5037 // Color space transforma-
+ // tion coefficients
+#define PropertyTagThumbnailYCbCrSubsampling 0x5038 // Subsampling ratio of Y
+ // to C
+#define PropertyTagThumbnailYCbCrPositioning 0x5039 // Y and C position
+#define PropertyTagThumbnailRefBlackWhite 0x503A // Pair of black and white
+ // reference values
+#define PropertyTagThumbnailCopyRight 0x503B // CopyRight holder
+
+#define PropertyTagLuminanceTable 0x5090
+#define PropertyTagChrominanceTable 0x5091
+
+#define PropertyTagFrameDelay 0x5100
+#define PropertyTagLoopCount 0x5101
+
+#define PropertyTagPixelUnit 0x5110 // Unit specifier for pixel/unit
+#define PropertyTagPixelPerUnitX 0x5111 // Pixels per unit in X
+#define PropertyTagPixelPerUnitY 0x5112 // Pixels per unit in Y
+#define PropertyTagPaletteHistogram 0x5113 // Palette histogram
+
+// EXIF specific tag
+
+#define PropertyTagExifExposureTime 0x829A
+#define PropertyTagExifFNumber 0x829D
+
+#define PropertyTagExifExposureProg 0x8822
+#define PropertyTagExifSpectralSense 0x8824
+#define PropertyTagExifISOSpeed 0x8827
+#define PropertyTagExifOECF 0x8828
+
+#define PropertyTagExifVer 0x9000
+#define PropertyTagExifDTOrig 0x9003 // Date & time of original
+#define PropertyTagExifDTDigitized 0x9004 // Date & time of digital data generation
+
+#define PropertyTagExifCompConfig 0x9101
+#define PropertyTagExifCompBPP 0x9102
+
+#define PropertyTagExifShutterSpeed 0x9201
+#define PropertyTagExifAperture 0x9202
+#define PropertyTagExifBrightness 0x9203
+#define PropertyTagExifExposureBias 0x9204
+#define PropertyTagExifMaxAperture 0x9205
+#define PropertyTagExifSubjectDist 0x9206
+#define PropertyTagExifMeteringMode 0x9207
+#define PropertyTagExifLightSource 0x9208
+#define PropertyTagExifFlash 0x9209
+#define PropertyTagExifFocalLength 0x920A
+#define PropertyTagExifMakerNote 0x927C
+#define PropertyTagExifUserComment 0x9286
+#define PropertyTagExifDTSubsec 0x9290 // Date & Time subseconds
+#define PropertyTagExifDTOrigSS 0x9291 // Date & Time original subseconds
+#define PropertyTagExifDTDigSS 0x9292 // Date & TIme digitized subseconds
+
+#define PropertyTagExifFPXVer 0xA000
+#define PropertyTagExifColorSpace 0xA001
+#define PropertyTagExifPixXDim 0xA002
+#define PropertyTagExifPixYDim 0xA003
+#define PropertyTagExifRelatedWav 0xA004 // related sound file
+#define PropertyTagExifInterop 0xA005
+#define PropertyTagExifFlashEnergy 0xA20B
+#define PropertyTagExifSpatialFR 0xA20C // Spatial Frequency Response
+#define PropertyTagExifFocalXRes 0xA20E // Focal Plane X Resolution
+#define PropertyTagExifFocalYRes 0xA20F // Focal Plane Y Resolution
+#define PropertyTagExifFocalResUnit 0xA210 // Focal Plane Resolution Unit
+#define PropertyTagExifSubjectLoc 0xA214
+#define PropertyTagExifExposureIndex 0xA215
+#define PropertyTagExifSensingMethod 0xA217
+#define PropertyTagExifFileSource 0xA300
+#define PropertyTagExifSceneType 0xA301
+#define PropertyTagExifCfaPattern 0xA302
+
+#define PropertyTagGpsVer 0x0000
+#define PropertyTagGpsLatitudeRef 0x0001
+#define PropertyTagGpsLatitude 0x0002
+#define PropertyTagGpsLongitudeRef 0x0003
+#define PropertyTagGpsLongitude 0x0004
+#define PropertyTagGpsAltitudeRef 0x0005
+#define PropertyTagGpsAltitude 0x0006
+#define PropertyTagGpsGpsTime 0x0007
+#define PropertyTagGpsGpsSatellites 0x0008
+#define PropertyTagGpsGpsStatus 0x0009
+#define PropertyTagGpsGpsMeasureMode 0x00A
+#define PropertyTagGpsGpsDop 0x000B // Measurement precision
+#define PropertyTagGpsSpeedRef 0x000C
+#define PropertyTagGpsSpeed 0x000D
+#define PropertyTagGpsTrackRef 0x000E
+#define PropertyTagGpsTrack 0x000F
+#define PropertyTagGpsImgDirRef 0x0010
+#define PropertyTagGpsImgDir 0x0011
+#define PropertyTagGpsMapDatum 0x0012
+#define PropertyTagGpsDestLatRef 0x0013
+#define PropertyTagGpsDestLat 0x0014
+#define PropertyTagGpsDestLongRef 0x0015
+#define PropertyTagGpsDestLong 0x0016
+#define PropertyTagGpsDestBearRef 0x0017
+#define PropertyTagGpsDestBear 0x0018
+#define PropertyTagGpsDestDistRef 0x0019
+#define PropertyTagGpsDestDist 0x001A
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
new file mode 100644
index 0000000000..e8a2951f43
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
@@ -0,0 +1,253 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusLineCaps.h
+*
+* Abstract:
+*
+* APIs for Custom Line Caps
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSLINECAPS_H
+#define _GDIPLUSLINECAPS_H
+
+inline
+CustomLineCap::CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap,
+ IN REAL baseInset
+ )
+{
+ nativeCap = NULL;
+ GpPath* nativeFillPath = NULL;
+ GpPath* nativeStrokePath = NULL;
+
+ if(fillPath)
+ nativeFillPath = fillPath->nativePath;
+ if(strokePath)
+ nativeStrokePath = strokePath->nativePath;
+
+ lastResult = DllExports::GdipCreateCustomLineCap(
+ nativeFillPath, nativeStrokePath,
+ baseCap, baseInset, &nativeCap);
+}
+
+inline
+CustomLineCap::CustomLineCap()
+{
+ // This is used for default constructor for subclasses.
+ // So don't create a nativeCap.
+
+ nativeCap = NULL;
+ lastResult = Ok;
+}
+
+inline
+CustomLineCap::~CustomLineCap()
+{
+ DllExports::GdipDeleteCustomLineCap(nativeCap);
+}
+
+inline Status
+CustomLineCap::SetStrokeCaps(
+ IN LineCap startCap,
+ IN LineCap endCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::GetStrokeCaps(
+ OUT LineCap* startCap,
+ OUT LineCap* endCap) const
+{
+ return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::SetStrokeJoin(
+ IN LineJoin lineJoin)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
+}
+
+inline LineJoin
+CustomLineCap::GetStrokeJoin() const
+{
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
+
+ return lineJoin;
+}
+
+inline Status
+CustomLineCap::SetBaseCap(IN LineCap baseCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
+}
+
+inline LineCap
+CustomLineCap::GetBaseCap() const
+{
+ LineCap baseCap;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
+
+ return baseCap;
+}
+
+inline Status
+CustomLineCap::SetBaseInset(IN REAL inset)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
+}
+
+inline REAL
+CustomLineCap::GetBaseInset() const
+{
+ REAL inset;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
+
+ return inset;
+}
+
+
+inline Status
+CustomLineCap::SetWidthScale(IN REAL widthScale)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
+}
+
+inline REAL
+CustomLineCap::GetWidthScale() const
+{
+ REAL widthScale;
+ SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
+
+ return widthScale;
+}
+
+inline CustomLineCap*
+CustomLineCap::Clone() const
+{
+ GpCustomLineCap *newNativeLineCap = NULL;
+
+ SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));
+
+ if (lastResult == Ok)
+ {
+ CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);
+ if (newLineCap == NULL)
+ {
+ SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));
+ }
+
+ return newLineCap;
+ }
+
+ return NULL;
+}
+
+class AdjustableArrowCap : public CustomLineCap
+{
+public:
+
+ AdjustableArrowCap(
+ IN REAL height,
+ IN REAL width,
+ IN BOOL isFilled = TRUE
+ )
+ {
+ GpAdjustableArrowCap* cap = NULL;
+
+ lastResult = DllExports::GdipCreateAdjustableArrowCap(
+ height, width, isFilled, &cap);
+ SetNativeCap(cap);
+ }
+
+ Status SetHeight(IN REAL height)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(
+ cap, height));
+ }
+
+ REAL GetHeight() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL height;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(
+ cap, &height));
+
+ return height;
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(
+ cap, width));
+ }
+
+ REAL GetWidth() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL width;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(
+ cap, &width));
+
+ return width;
+ }
+
+ Status SetMiddleInset(IN REAL middleInset)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(
+ cap, middleInset));
+ }
+
+ REAL GetMiddleInset() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL middleInset;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(
+ cap, &middleInset));
+
+ return middleInset;
+ }
+
+ Status SetFillState(IN BOOL isFilled)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(
+ cap, isFilled));
+ }
+
+ BOOL IsFilled() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ BOOL isFilled;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(
+ cap, &isFilled));
+
+ return isFilled;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ AdjustableArrowCap(const AdjustableArrowCap &);
+ AdjustableArrowCap& operator=(const AdjustableArrowCap &);
+
+#endif
+
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
new file mode 100644
index 0000000000..7fa3df8cd1
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
@@ -0,0 +1,309 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMatrix.h
+*
+* Abstract:
+*
+* GDI+ Matrix class
+*
+\**************************************************************************/
+
+class Matrix : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class TextureBrush;
+ friend class LinearGradientBrush;
+ friend class PathGradientBrush;
+ friend class Pen;
+ friend class Region;
+
+ // Default constructor - set to identity matrix
+
+ Matrix()
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix(&matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22,
+ dx, dy, &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const RectF& rect,
+ IN const PointF* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const Rect& rect,
+ IN const Point* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3I(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ ~Matrix()
+ {
+ DllExports::GdipDeleteMatrix(nativeMatrix);
+ }
+
+ Matrix *Clone() const
+ {
+ GpMatrix *cloneMatrix = NULL;
+
+ SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,
+ &cloneMatrix));
+
+ if (lastResult != Ok)
+ return NULL;
+
+ return new Matrix(cloneMatrix);
+ }
+
+ Status GetElements(OUT REAL *m) const
+ {
+ return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));
+ }
+
+ Status SetElements(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ m11, m12, m21, m22, dx, dy));
+ }
+
+ REAL OffsetX() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[4];
+ else
+ return 0.0f;
+ }
+
+ REAL OffsetY() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[5];
+ else
+ return 0.0f;
+ }
+
+ Status Reset()
+ {
+ // set identity matrix elements
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0));
+ }
+
+ Status Multiply(IN const Matrix *matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status Translate(IN REAL offsetX,
+ IN REAL offsetY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));
+ }
+
+ Status Scale(IN REAL scaleX,
+ IN REAL scaleY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));
+ }
+
+ Status Rotate(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ }
+
+ Status RotateAt(IN REAL angle,
+ IN const PointF& center,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ if(order == MatrixOrderPrepend)
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ }
+ else
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ }
+ }
+
+ Status Shear(IN REAL shearX,
+ IN REAL shearY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));
+ }
+
+ Status Invert()
+ {
+ return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));
+ }
+
+ // float version
+ Status TransformPoints(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformPoints(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ Status TransformVectors(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformVectors(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ BOOL IsInvertible() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL IsIdentity() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL Equals(IN const Matrix *matrix) const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,
+ matrix->nativeMatrix, &result));
+
+ return result;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Matrix(const Matrix &);
+ Matrix& operator=(const Matrix &);
+protected:
+
+#else
+
+ Matrix(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ SetNativeMatrix(NULL);
+ }
+
+ Matrix& operator=(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Matrix(GpMatrix *nativeMatrix)
+ {
+ lastResult = Ok;
+ SetNativeMatrix(nativeMatrix);
+ }
+
+ VOID SetNativeMatrix(GpMatrix *nativeMatrix)
+ {
+ this->nativeMatrix = nativeMatrix;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpMatrix *nativeMatrix;
+ mutable Status lastResult;
+};
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
new file mode 100644
index 0000000000..5f92c1e141
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
@@ -0,0 +1,49 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMem.h
+*
+* Abstract:
+*
+* Flat GDI+ Memory Allocators - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _GDIPLUSMEM_H
+#define _GDIPLUSMEM_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#ifdef _GDIPLUS_H
+#define GDIPCONST const
+#else
+#define GDIPCONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//----------------------------------------------------------------------------
+// Memory Allocation APIs
+//----------------------------------------------------------------------------
+
+void* WINGDIPAPI
+GdipAlloc(size_t size);
+
+void WINGDIPAPI
+GdipFree(void* ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_GDIPLUSMEM_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
new file mode 100644
index 0000000000..3d07dd64d3
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
@@ -0,0 +1,374 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMetafile.h
+*
+* Abstract:
+*
+* Metafile related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAFILE_H
+#define _GDIPLUSMETAFILE_H
+
+class Metafile : public Image
+{
+public:
+ friend class Image;
+
+ // Read a metafile
+ Metafile()
+ {
+ SetNativeImage(NULL);
+ lastResult = Ok;
+ }
+
+ // Playback a metafile from a HMETAFILE
+ // If deleteWmf is TRUE, then when the metafile is deleted,
+ // the hWmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ IN BOOL deleteWmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a HENHMETAFILE
+ // If deleteEmf is TRUE, then when the metafile is deleted,
+ // the hEmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HENHMETAFILE hEmf,
+ IN BOOL deleteEmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a file
+ Metafile(IN const WCHAR* filename)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a WMF metafile from a file
+ Metafile(IN const WCHAR* filename,
+ IN const APMFileHeader * apmFileHeader
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a stream
+ Metafile(IN IStream* stream)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileI(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Write a metafile to a stream with down-level GDI records
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStreamI(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ static Status GetMetafileHeader(
+ IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN HENHMETAFILE hEmf,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN const WCHAR* filename,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromFile(filename, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN IStream * stream,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromStream(stream, header);
+ }
+
+ Status GetMetafileHeader(
+ OUT MetafileHeader * header
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
+ (GpMetafile *)nativeImage,
+ header));
+ }
+
+ // Once this method is called, the Metafile object is in an invalid state
+ // and can no longer be used. It is the responsiblity of the caller to
+ // invoke DeleteEnhMetaFile to delete this hEmf.
+
+ HENHMETAFILE GetHENHMETAFILE()
+ {
+ HENHMETAFILE hEmf;
+
+ SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));
+
+ return hEmf;
+ }
+
+ // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+
+ // The data must be DWORD aligned if it's an EMF or EMF+. It must be
+ // WORD aligned if it's a WMF.
+ Status
+ PlayRecord(
+ IN EmfPlusRecordType recordType,
+ IN UINT flags,
+ IN UINT dataSize,
+ IN const BYTE * data
+ ) const
+ {
+ return SetStatus(DllExports::GdipPlayMetafileRecord(
+ (GpMetafile *)nativeImage,
+ recordType,
+ flags,
+ dataSize,
+ data));
+ }
+
+ // If you're using a printer HDC for the metafile, but you want the
+ // metafile rasterized at screen resolution, then use this API to set
+ // the rasterization dpi of the metafile to the screen resolution,
+ // e.g. 96 dpi or 120 dpi.
+ Status SetDownLevelRasterizationLimit(
+ IN UINT metafileRasterizationLimitDpi
+ )
+ {
+ return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ metafileRasterizationLimitDpi));
+ }
+
+ UINT GetDownLevelRasterizationLimit() const
+ {
+ UINT metafileRasterizationLimitDpi = 0;
+
+ SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ &metafileRasterizationLimitDpi));
+
+ return metafileRasterizationLimitDpi;
+ }
+
+ static UINT Metafile::EmfToWmfBits(
+ IN HENHMETAFILE hemf,
+ IN UINT cbData16,
+ IN LPBYTE pData16,
+ IN INT iMapMode = MM_ANISOTROPIC,
+ IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault
+ )
+ {
+ return DllExports::GdipEmfToWmfBits(
+ hemf,
+ cbData16,
+ pData16,
+ iMapMode,
+ eFlags);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Metafile(const Metafile &);
+ Metafile& operator=(const Metafile &);
+
+#endif
+};
+
+#endif // !_METAFILE_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
new file mode 100644
index 0000000000..79b5bc9533
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
@@ -0,0 +1,213 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Metafile headers
+*
+* Abstract:
+*
+* Declarations for various metafile header structures.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAHEADER_H
+#define _GDIPLUSMETAHEADER_H
+
+typedef struct
+{
+ DWORD iType; // Record type EMR_HEADER
+ DWORD nSize; // Record size in bytes. This may be greater
+ // than the sizeof(ENHMETAHEADER).
+ RECTL rclBounds; // Inclusive-inclusive bounds in device units
+ RECTL rclFrame; // Inclusive-inclusive Picture Frame of metafile in .01 mm units
+ DWORD dSignature; // Signature. Must be ENHMETA_SIGNATURE.
+ DWORD nVersion; // Version number
+ DWORD nBytes; // Size of the metafile in bytes
+ DWORD nRecords; // Number of records in the metafile
+ WORD nHandles; // Number of handles in the handle table
+ // Handle index zero is reserved.
+ WORD sReserved; // Reserved. Must be zero.
+ DWORD nDescription; // Number of chars in the unicode description string
+ // This is 0 if there is no description string
+ DWORD offDescription; // Offset to the metafile description record.
+ // This is 0 if there is no description string
+ DWORD nPalEntries; // Number of entries in the metafile palette.
+ SIZEL szlDevice; // Size of the reference device in pels
+ SIZEL szlMillimeters; // Size of the reference device in millimeters
+} ENHMETAHEADER3;
+
+// Aldus Placeable Metafiles
+
+// Placeable Metafiles were created by Aldus Corporation as a non-standard
+// way of specifying how a metafile is mapped and scaled on an output device.
+// Placeable metafiles are quite wide-spread, but not directly supported by
+// the Windows API. To playback a placeable metafile using the Windows API,
+// you will first need to strip the placeable metafile header from the file.
+// This is typically performed by copying the metafile to a temporary file
+// starting at file offset 22 (0x16). The contents of the temporary file may
+// then be used as input to the Windows GetMetaFile(), PlayMetaFile(),
+// CopyMetaFile(), etc. GDI functions.
+
+// Each placeable metafile begins with a 22-byte header,
+// followed by a standard metafile:
+
+#include <pshpack2.h> // set structure packing to 2
+
+typedef struct
+{
+ INT16 Left;
+ INT16 Top;
+ INT16 Right;
+ INT16 Bottom;
+} APMRect16;
+
+typedef struct
+{
+ UINT32 Key; // GDIP_WMF_ALDUSKEY
+ INT16 Hmf; // Metafile HANDLE number (always 0)
+ APMRect16 BoundingBox; // Coordinates in metafile units
+ INT16 Inch; // Number of metafile units per inch
+ UINT32 Reserved; // Reserved (always 0)
+ INT16 Checksum; // Checksum value for previous 10 WORDs
+} APMFileHeader;
+
+#include <poppack.h>
+
+// Key contains a special identification value that indicates the presence
+// of a placeable metafile header and is always 0x9AC6CDD7.
+
+// Handle is used to stored the handle of the metafile in memory. When written
+// to disk, this field is not used and will always contains the value 0.
+
+// Left, Top, Right, and Bottom contain the coordinates of the upper-left
+// and lower-right corners of the image on the output device. These are
+// measured in twips.
+
+// A twip (meaning "twentieth of a point") is the logical unit of measurement
+// used in Windows Metafiles. A twip is equal to 1/1440 of an inch. Thus 720
+// twips equal 1/2 inch, while 32,768 twips is 22.75 inches.
+
+// Inch contains the number of twips per inch used to represent the image.
+// Normally, there are 1440 twips per inch; however, this number may be
+// changed to scale the image. A value of 720 indicates that the image is
+// double its normal size, or scaled to a factor of 2:1. A value of 360
+// indicates a scale of 4:1, while a value of 2880 indicates that the image
+// is scaled down in size by a factor of two. A value of 1440 indicates
+// a 1:1 scale ratio.
+
+// Reserved is not used and is always set to 0.
+
+// Checksum contains a checksum value for the previous 10 WORDs in the header.
+// This value can be used in an attempt to detect if the metafile has become
+// corrupted. The checksum is calculated by XORing each WORD value to an
+// initial value of 0.
+
+// If the metafile was recorded with a reference Hdc that was a display.
+#define GDIP_EMFPLUSFLAGS_DISPLAY 0x00000001
+
+class MetafileHeader
+{
+public:
+ MetafileType Type;
+ UINT Size; // Size of the metafile (in bytes)
+ UINT Version; // EMF+, EMF, or WMF version
+ UINT EmfPlusFlags;
+ REAL DpiX;
+ REAL DpiY;
+ INT X; // Bounds in device units
+ INT Y;
+ INT Width;
+ INT Height;
+ union
+ {
+ METAHEADER WmfHeader;
+ ENHMETAHEADER3 EmfHeader;
+ };
+ INT EmfPlusHeaderSize; // size of the EMF+ header in file
+ INT LogicalDpiX; // Logical Dpi of reference Hdc
+ INT LogicalDpiY; // usually valid only for EMF+ files
+
+public:
+ // Get the metafile type
+ MetafileType GetType() const { return Type; }
+
+ // Get the size of the metafile in BYTEs
+ UINT GetMetafileSize() const { return Size; }
+
+ // If IsEmfPlus, this is the EMF+ version; else it is the WMF or EMF version
+ UINT GetVersion() const { return Version; }
+
+ // Get the EMF+ flags associated with the metafile
+ UINT GetEmfPlusFlags() const { return EmfPlusFlags; }
+
+ // Get the X Dpi of the metafile
+ REAL GetDpiX() const { return DpiX; }
+
+ // Get the Y Dpi of the metafile
+ REAL GetDpiY() const { return DpiY; }
+
+ // Get the bounds of the metafile in device units
+ VOID GetBounds (OUT Rect *rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Is it any type of WMF (standard or Aldus Placeable Metafile)?
+ BOOL IsWmf() const
+ {
+ return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfAldus));
+ }
+
+ // Is this an Aldus Placeable Metafile?
+ BOOL IsWmfAldus() const { return (Type == MetafileTypeWmf); }
+
+ // Is this an EMF (not an EMF+)?
+ BOOL IsEmf() const { return (Type == MetafileTypeEmf); }
+
+ // Is this an EMF or EMF+ file?
+ BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }
+
+ // Is this an EMF+ file?
+ BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }
+
+ // Is this an EMF+ dual (has dual, down-level records) file?
+ BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }
+
+ // Is this an EMF+ only (no dual records) file?
+ BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }
+
+ // If it's an EMF+ file, was it recorded against a display Hdc?
+ BOOL IsDisplay() const
+ {
+ return (IsEmfPlus() &&
+ ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0));
+ }
+
+ // Get the WMF header of the metafile (if it is a WMF)
+ const METAHEADER * GetWmfHeader() const
+ {
+ if (IsWmf())
+ {
+ return &WmfHeader;
+ }
+ return NULL;
+ }
+
+ // Get the EMF header of the metafile (if it is an EMF)
+ const ENHMETAHEADER3 * GetEmfHeader() const
+ {
+ if (IsEmfOrEmfPlus())
+ {
+ return &EmfHeader;
+ }
+ return NULL;
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
new file mode 100644
index 0000000000..cff0e1d9ce
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
@@ -0,0 +1,1686 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPath.h
+*
+* Abstract:
+*
+* Path related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPATH_H
+#define _GDIPLUSPATH_H
+
+class GraphicsPath : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class Region;
+ friend class PathGradientBrush;
+ friend class GraphicsPathIterator;
+ friend class CustomLineCap;
+
+ // Path constructors
+
+ GraphicsPath(IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath(fillMode, &nativePath);
+ }
+
+ GraphicsPath(IN const PointF* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ GraphicsPath(IN const Point* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2I(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ ~GraphicsPath()
+ {
+ DllExports::GdipDeletePath(nativePath);
+ }
+
+ /**
+ * Make a copy of the current path object
+ */
+ GraphicsPath* Clone() const
+ {
+ GpPath *clonepath = NULL;
+
+ SetStatus(DllExports::GdipClonePath(nativePath, &clonepath));
+
+ return new GraphicsPath(clonepath);
+ }
+
+ /**
+ * Reset the path object to empty (and fill mode to FillModeAlternate)
+ */
+ Status Reset()
+ {
+ return SetStatus(DllExports::GdipResetPath(nativePath));
+ }
+
+ /**
+ * Get path fill mode information
+ */
+ FillMode GetFillMode() const
+ {
+ FillMode fillmode = FillModeAlternate;
+
+ SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode));
+
+ return fillmode;
+ }
+
+ /**
+ * Set path fill mode information
+ */
+ Status SetFillMode(IN FillMode fillmode)
+ {
+ return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode));
+ }
+
+ /**
+ * Set/get path data
+ */
+ Status GetPathData(OUT PathData* pathData) const
+ {
+ if (pathData == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count = GetPointCount();
+
+ if ((count <= 0) || (pathData->Count>0 && pathData->Count<count))
+ {
+ pathData->Count = 0;
+ if (pathData->Points)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+ }
+
+ if (pathData->Types)
+ {
+ delete pathData->Types;
+ pathData->Types = NULL;
+ }
+
+ if (count <= 0)
+ {
+ return lastResult;
+ }
+ }
+
+ if (pathData->Count == 0)
+ {
+ pathData->Points = new PointF[count];
+ if (pathData->Points == NULL)
+ {
+ return SetStatus(OutOfMemory);
+
+ }
+ pathData->Types = new byte[count];
+ if (pathData->Types == NULL)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+
+ return SetStatus(OutOfMemory);
+ }
+ pathData->Count = count;
+ }
+
+ return SetStatus(DllExports::GdipGetPathData(nativePath, pathData));
+ }
+
+ /**
+ * Start/end a subpath
+ */
+ Status StartFigure()
+ {
+ return SetStatus(DllExports::GdipStartPathFigure(nativePath));
+ }
+
+ Status CloseFigure()
+ {
+ return SetStatus(DllExports::GdipClosePathFigure(nativePath));
+ }
+
+ Status CloseAllFigures()
+ {
+ return SetStatus(DllExports::GdipClosePathFigures(nativePath));
+ }
+
+ Status SetMarker()
+ {
+ return SetStatus(DllExports::GdipSetPathMarker(nativePath));
+ }
+
+ Status ClearMarkers()
+ {
+ return SetStatus(DllExports::GdipClearPathMarkers(nativePath));
+ }
+
+ Status Reverse()
+ {
+ return SetStatus(DllExports::GdipReversePath(nativePath));
+ }
+
+ Status GetLastPoint(OUT PointF* lastPoint) const
+ {
+ return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint));
+ }
+
+ /**
+ * Add lines to the path object
+ */
+ // float version
+ Status AddLine(IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status AddLine(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2));
+ }
+
+ Status AddLines(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddLine(IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return AddLine(pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status AddLine(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLineI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status AddLines(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2I(nativePath,
+ points,
+ count));
+ }
+
+ /**
+ * Add an arc to the path object
+ */
+ // float version
+ Status AddArc(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddArc(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArcI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ /**
+ * Add Bezier curves to the path object
+ */
+ // float version
+ Status AddBezier(IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2,
+ x3, y3, x4, y4));
+ }
+
+ Status AddBeziers(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddBezier(IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezierI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status AddBeziers(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziersI(nativePath,
+ points,
+ count));
+ }
+
+ // float version
+ Status AddCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // integer version
+ Status AddCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurveI(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3I(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ // integer version
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath,
+ points,
+ count));
+ }
+
+
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+
+ /**
+ * Add closed shapes to the path object
+ */
+
+ // float version
+ Status AddRectangle(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangle(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangles(nativePath,
+ rects,
+ count));
+ }
+
+ // integer version
+ Status AddRectangle(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangleI(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const Rect* rects, INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath,
+ rects,
+ count));
+ }
+
+ // float version
+ Status AddEllipse(IN const RectF& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipse(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status AddEllipse(IN const Rect& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipseI(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status AddPie(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddPie(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPieI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status AddPolygon(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddPolygon(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count));
+ }
+
+ Status AddPath(IN const GraphicsPath* addingPath,
+ IN BOOL connect)
+ {
+ GpPath* nativePath2 = NULL;
+ if(addingPath)
+ nativePath2 = addingPath->nativePath;
+
+ return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect));
+ }
+
+ // AddString point version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const PointF &origin,
+ IN const StringFormat *format
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const RectF &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Point &origin,
+ IN const StringFormat *format
+ )
+ {
+ Rect rect(origin.X, origin.Y, 0, 0);
+
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Rect &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ /**
+ * Transforms the path object
+ */
+ Status Transform(IN const Matrix* matrix)
+ {
+ if(matrix)
+ return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix));
+ else
+ return Ok; // No need to transform.
+ }
+
+ /**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ *
+ * Defined in GdiplusGraphics.h.
+ */
+ Status GetBounds(OUT RectF* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ // integer version (defined in GdiplusGraphics.h)
+ Status GetBounds(OUT Rect* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ /**
+ * Flatten the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Flatten(IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipFlattenPath(
+ nativePath,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#ifdef DCR_USE_NEW_202903
+
+ Status Widen(
+ IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPath(
+ nativePath,
+ pen->nativePen,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#else
+
+ /**
+ * Widen the path object
+ * When removeSelfIntersects is TRUE, this returns the widened path
+ * without self intersections.
+ * When it is FALSE, it returns the widened path with selfintersections.
+ * The latter is faster and is usually safficient for filling.
+ */
+ Status Widen(IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ 0, 0, nativeMatrix, removeSelfIntersects));
+ }
+
+ /**
+ * Widen the path object
+ * This is equivalent to Widen() method except that
+ * The widths of the widened path are larger than the given
+ * minimum resolutions in x and y coordinates after the transform.
+ * This is usefull when widening a path with the limited device resolutions.
+ */
+
+ Status Widen(IN const Pen* pen,
+ IN REAL minXres,
+ IN REAL minYres,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ minXres, minYres, nativeMatrix, removeSelfIntersects));
+ }
+
+#endif // DCR_USE_NEW_202903
+
+ Status Outline(
+ IN const Matrix *matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipWindingModeOutline(
+ nativePath, nativeMatrix, flatness
+ ));
+ }
+
+ /**
+ * Warp the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Warp(IN const PointF* destPoints,
+ IN INT count,
+ IN const RectF& srcRect,
+ IN const Matrix* matrix = NULL,
+ IN WarpMode warpMode = WarpModePerspective,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWarpPath(
+ nativePath,
+ nativeMatrix,
+ destPoints,
+ count,
+ srcRect.X,
+ srcRect.Y,
+ srcRect.Width,
+ srcRect.Height,
+ warpMode,
+ flatness));
+ }
+
+ /**
+ * Return the number of points in the current path
+ */
+ INT GetPointCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPointCount(nativePath, &count));
+
+ return count;
+ }
+
+ /**
+ * Return the path point type information
+ */
+ Status GetPathTypes(OUT BYTE* types,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count));
+ }
+
+ /**
+ * Return the path point coordinate information
+ * @notes Should there be PathData that contains types[] and points[]
+ * for get & set purposes.
+ */
+ Status GetPathPoints(OUT PointF* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count));
+ }
+
+ // integer version
+ Status GetPathPoints(OUT Point* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+ /**
+ * Hit testing operations
+ *
+ * inline implementation is in gdiplusgraphics.h.
+ */
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const PointF& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const Point& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+protected:
+
+ GraphicsPath(const GraphicsPath& path)
+ {
+ GpPath *clonepath = NULL;
+ SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath));
+ SetNativePath(clonepath);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPath& operator=(const GraphicsPath &);
+protected:
+
+#else
+
+ GraphicsPath& operator=(const GraphicsPath& path)
+ {
+ path;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ GraphicsPath(GpPath* nativePath)
+ {
+ lastResult = Ok;
+ SetNativePath(nativePath);
+ }
+
+ VOID SetNativePath(GpPath *nativePath)
+ {
+ this->nativePath = nativePath;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPath* nativePath;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// GraphisPathIterator class
+//--------------------------------------------------------------------------
+
+class GraphicsPathIterator : public GdiplusBase
+{
+public:
+
+ GraphicsPathIterator(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+ if(path)
+ nativePath = path->nativePath;
+
+ GpPathIterator *iter = NULL;
+ lastResult = DllExports::GdipCreatePathIter(&iter, nativePath);
+ SetNativeIterator(iter);
+ }
+
+ ~GraphicsPathIterator()
+ {
+ DllExports::GdipDeletePathIter(nativeIterator);
+ }
+
+
+ INT NextSubpath(OUT INT* startIndex,
+ OUT INT* endIndex,
+ OUT BOOL* isClosed)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator,
+ &resultCount, startIndex, endIndex, isClosed));
+
+ return resultCount;
+ }
+
+
+ INT NextSubpath(IN const GraphicsPath* path,
+ OUT BOOL* isClosed)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator,
+ &resultCount, nativePath, isClosed));
+
+ return resultCount;
+ }
+
+ INT NextPathType(OUT BYTE* pathType,
+ OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator,
+ &resultCount, pathType, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ INT NextMarker(OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator,
+ &resultCount, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+
+ INT NextMarker(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator,
+ &resultCount, nativePath));
+
+ return resultCount;
+ }
+
+ INT GetCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ INT GetSubpathCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ BOOL HasCurve() const
+ {
+ BOOL hasCurve;
+
+ SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve));
+
+ return hasCurve;
+ }
+
+ VOID Rewind()
+ {
+ SetStatus(DllExports::GdipPathIterRewind(nativeIterator));
+ }
+
+ INT Enumerate(OUT PointF *points,
+ OUT BYTE *types,
+ IN INT count)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator,
+ &resultCount, points, types, count));
+
+ return resultCount;
+ }
+
+ INT CopyData(OUT PointF* points,
+ OUT BYTE* types,
+ IN INT startIndex,
+ IN INT endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterCopyData(nativeIterator,
+ &resultCount, points, types, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPathIterator(const GraphicsPathIterator &);
+ GraphicsPathIterator& operator=(const GraphicsPathIterator &);
+
+#endif
+
+protected:
+ VOID SetNativeIterator(GpPathIterator *nativeIterator)
+ {
+ this->nativeIterator = nativeIterator;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPathIterator* nativeIterator;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Represent polygon gradient brush object
+//--------------------------------------------------------------------------
+
+class PathGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ PathGradientBrush(
+ IN const PointF* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradient(
+ points, count,
+ wrapMode, &brush);
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const Point* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientI(
+ points, count,
+ wrapMode, &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const GraphicsPath* path
+ )
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientFromPath(
+ path->nativePath, &brush);
+ SetNativeBrush(brush);
+ }
+
+ // Get/set colors
+
+ Status GetCenterColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush, &argb));
+
+ color->SetValue(argb);
+
+ return lastResult;
+ }
+
+ Status SetCenterColor(IN const Color& color)
+ {
+ SetStatus(DllExports::GdipSetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush,
+ color.GetValue()));
+
+ return lastResult;
+ }
+
+ INT GetPointCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientPointCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ INT GetSurroundColorCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetSurroundColors(OUT Color* colors,
+ IN OUT INT* count) const
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count1));
+
+ if(lastResult != Ok)
+ return lastResult;
+
+ if((*count < count1) || (count1 <= 0))
+ return SetStatus(InsufficientBuffer);
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ {
+ for(INT i = 0; i < count1; i++)
+ {
+ colors[i].SetValue(argbs[i]);
+ }
+ *count = count1;
+ }
+
+ delete [] argbs;
+ return lastResult;
+ }
+
+ Status SetSurroundColors(IN const Color* colors,
+ IN OUT INT* count)
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1 = GetPointCount();
+
+ if((*count > count1) || (count1 <= 0))
+ return SetStatus(InvalidParameter);
+
+ count1 = *count;
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ for(INT i = 0; i < count1; i++)
+ {
+ argbs[i] = colors[i].GetValue();
+ }
+
+ SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ *count = count1;
+
+ delete [] argbs;
+
+ return lastResult;
+ }
+
+ Status GetGraphicsPath(OUT GraphicsPath* path) const
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status SetGraphicsPath(IN const GraphicsPath* path)
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipSetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status GetCenterPoint(OUT PointF* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+
+ Status GetCenterPoint(OUT Point* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+ Status SetCenterPoint(IN const PointF& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status SetCenterPoint(IN const Point& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRect(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRectI(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+ if(argbs)
+ {
+ for(INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend(
+ (GpPathGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete[] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend(
+ (GpPathGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+
+ for(INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetPathGradientLinearBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Get/set brush transform
+ */
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Get/set brush focus scales
+ */
+ Status GetFocusScales(OUT REAL* xScale,
+ OUT REAL* yScale) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ Status SetFocusScales(IN REAL xScale,
+ IN REAL yScale)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ /**
+ * Get/set brush wrapping mode
+ */
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, &wrapMode));
+
+ return wrapMode;
+ }
+
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, wrapMode));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathGradientBrush(const PathGradientBrush &);
+ PathGradientBrush& operator=(const PathGradientBrush &);
+
+#endif
+
+protected:
+
+ PathGradientBrush()
+ {
+ }
+};
+
+
+#endif // !_GRAPHICSPATH_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
new file mode 100644
index 0000000000..20653db36e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
@@ -0,0 +1,519 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPen.h
+*
+* Abstract:
+*
+* Pen API related declarations
+*
+\**************************************************************************/
+#ifndef _GDIPLUSPEN_H
+#define _GDIPLUSPEN_H
+
+//--------------------------------------------------------------------------
+// class for various pen types
+//--------------------------------------------------------------------------
+
+class Pen : public GdiplusBase
+{
+public:
+ friend class GraphicsPath;
+ friend class Graphics;
+
+ // abstract Clone() can't be implemented here because it can't
+ // new an object with pure virtual functions
+
+ // Constructors
+
+ Pen(IN const Color& color,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen1(color.GetValue(),
+ width, unit, &nativePen);
+ }
+
+ Pen(IN const Brush* brush,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,
+ width, unit, &nativePen);
+ }
+
+ ~Pen()
+ {
+ DllExports::GdipDeletePen(nativePen);
+ }
+
+ Pen* Clone() const
+ {
+ GpPen *clonePen = NULL;
+
+ lastResult = DllExports::GdipClonePen(nativePen, &clonePen);
+
+ return new Pen(clonePen, lastResult);
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));
+ }
+
+ REAL GetWidth() const
+ {
+ REAL width;
+
+ SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));
+
+ return width;
+ }
+
+ // Set/get line caps: start, end, and dash
+
+ // Line cap and join APIs by using LineCap and LineJoin enums.
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #else
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ Status SetStartCap(IN LineCap startCap)
+ {
+ return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));
+ }
+
+ Status SetEndCap(IN LineCap endCap)
+ {
+ return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetDashCap(IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,
+ dashCap));
+ }
+ #else
+ Status SetDashCap(IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ LineCap GetStartCap() const
+ {
+ LineCap startCap;
+
+ SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));
+
+ return startCap;
+ }
+
+ LineCap GetEndCap() const
+ {
+ LineCap endCap;
+
+ SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));
+
+ return endCap;
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ DashCap GetDashCap() const
+ {
+ DashCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,
+ &dashCap));
+
+ return dashCap;
+ }
+ #else
+ LineCap GetDashCap() const
+ {
+ LineCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));
+
+ return dashCap;
+ }
+ #endif // DCR_USE_NEW_197819
+
+
+ // Set/get line join
+
+ Status SetLineJoin(IN LineJoin lineJoin)
+ {
+ return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));
+ }
+
+ LineJoin GetLineJoin() const
+ {
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));
+
+ return lineJoin;
+ }
+
+ Status SetCustomStartCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomStartCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetCustomEndCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomEndCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetMiterLimit(IN REAL miterLimit)
+ {
+ return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));
+ }
+
+ REAL GetMiterLimit() const
+ {
+ REAL miterLimit;
+
+ SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));
+
+ return miterLimit;
+ }
+
+ // Set/get pen mode
+ Status SetAlignment(IN PenAlignment penAlignment)
+ {
+ return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));
+ }
+
+ PenAlignment GetAlignment() const
+ {
+ PenAlignment penAlignment;
+
+ SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));
+
+ return penAlignment;
+ }
+
+ // Set/get pen transform
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPenTransform(nativePen,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPenTransform(nativePen));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePenTransform(nativePen,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePenTransform(nativePen,
+ angle, order));
+ }
+
+ PenType GetPenType() const
+ {
+ PenType type;
+ SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));
+
+ return type;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetPenColor(nativePen,
+ color.GetValue()));
+ }
+
+ Status SetBrush(IN const Brush* brush)
+ {
+ return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,
+ brush->nativeBrush));
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ PenType type = GetPenType();
+
+ if (type != PenTypeSolidColor)
+ {
+ return WrongState;
+ }
+
+ ARGB argb;
+
+ SetStatus(DllExports::GdipGetPenColor(nativePen,
+ &argb));
+ if (lastResult == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return lastResult;
+ }
+
+ Brush* GetBrush() const
+ {
+ PenType type = GetPenType();
+
+ Brush* brush = NULL;
+
+ switch(type)
+ {
+ case PenTypeSolidColor:
+ brush = new SolidBrush();
+ break;
+
+ case PenTypeHatchFill:
+ brush = new HatchBrush();
+ break;
+
+ case PenTypeTextureFill:
+ brush = new TextureBrush();
+ break;
+
+ case PenTypePathGradient:
+ brush = new Brush();
+ break;
+
+ case PenTypeLinearGradient:
+ brush = new LinearGradientBrush();
+ break;
+
+ default:
+ break;
+ }
+
+ if(brush)
+ {
+ GpBrush* nativeBrush;
+
+ SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));
+ brush->SetNativeBrush(nativeBrush);
+ }
+
+ return brush;
+ }
+
+ DashStyle GetDashStyle() const
+ {
+ DashStyle dashStyle;
+
+ SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));
+
+ return dashStyle;
+ }
+
+ Status SetDashStyle(IN DashStyle dashStyle)
+ {
+ return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));
+ }
+
+ REAL GetDashOffset() const
+ {
+ REAL dashOffset;
+
+ SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));
+
+ return dashOffset;
+ }
+
+ Status SetDashOffset(IN REAL dashOffset)
+ {
+ return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));
+ }
+
+ Status SetDashPattern(IN const REAL* dashArray, IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray,
+ count));
+ }
+
+ INT GetDashPatternCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetDashPattern(OUT REAL* dashArray,
+ IN INT count) const
+ {
+ if (dashArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenDashArray(nativePen,
+ dashArray,
+ count));
+ }
+
+ Status SetCompoundArray(IN const REAL* compoundArray,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray,
+ count));
+ }
+
+ INT GetCompoundArrayCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetCompoundArray(OUT REAL* compoundArray,
+ IN INT count) const
+ {
+ if (compoundArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,
+ compoundArray,
+ count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Pen(const Pen &);
+ Pen& operator=(const Pen &);
+protected:
+
+#else
+
+ Pen(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ SetNativePen(NULL);
+ }
+
+ Pen& operator=(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Pen(GpPen* nativePen, Status status)
+ {
+ lastResult = status;
+ SetNativePen(nativePen);
+ }
+
+ VOID SetNativePen(GpPen* nativePen)
+ {
+ this->nativePen = nativePen;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPen* nativePen;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
new file mode 100644
index 0000000000..f9dc5991d4
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
@@ -0,0 +1,201 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus pixel formats
+*
+* Abstract:
+*
+* Definitions for color types, palettes, pixel format IDs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPIXELFORMATS_H
+#define _GDIPLUSPIXELFORMATS_H
+
+/*
+ * 32-bit and 64-bit ARGB pixel value
+ */
+
+typedef DWORD ARGB;
+typedef DWORDLONG ARGB64;
+
+#define ALPHA_SHIFT 24
+#define RED_SHIFT 16
+#define GREEN_SHIFT 8
+#define BLUE_SHIFT 0
+#define ALPHA_MASK ((ARGB) 0xff << ALPHA_SHIFT)
+
+/*
+ * In-memory pixel data formats:
+ * bits 0-7 = format index
+ * bits 8-15 = pixel size (in bits)
+ * bits 16-23 = flags
+ * bits 24-31 = reserved
+ */
+
+#ifndef DCR_USE_NEW_105760
+
+enum PixelFormat
+{
+ PixelFormatIndexed = 0x00010000, // Indexes into a palette
+ PixelFormatGDI = 0x00020000, // Is a GDI-supported format
+ PixelFormatAlpha = 0x00040000, // Has an alpha component
+ PixelFormatPAlpha = 0x00080000, // Uses pre-multiplied alpha
+ PixelFormatExtended = 0x00100000, // Uses extended color (16 bits per channel)
+ PixelFormatCanonical = 0x00200000, // ?
+
+ PixelFormatUndefined = 0,
+ PixelFormatDontCare = 0,
+
+ PixelFormat1bppIndexed = 1 | ( 1 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat4bppIndexed = 2 | ( 4 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat8bppIndexed = 3 | ( 8 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat16bppGrayScale = 4 | (16 << 8) | PixelFormatExtended,
+ PixelFormat16bppRGB555 = 5 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppRGB565 = 6 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppARGB1555 = 7 | (16 << 8) | PixelFormatAlpha
+ | PixelFormatGDI,
+ PixelFormat24bppRGB = 8 | (24 << 8) | PixelFormatGDI,
+ PixelFormat32bppRGB = 9 | (32 << 8) | PixelFormatGDI,
+ PixelFormat32bppARGB = 10 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatGDI
+ | PixelFormatCanonical,
+ PixelFormat32bppPARGB = 11 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatGDI,
+ PixelFormat48bppRGB = 12 | (48 << 8) | PixelFormatExtended,
+ PixelFormat64bppARGB = 13 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatCanonical
+ | PixelFormatExtended,
+ PixelFormat64bppPARGB = 14 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatExtended,
+ PixelFormat24bppBGR = 15 | (24 << 8) | PixelFormatGDI,
+ PixelFormatMax = 16
+};
+
+#else
+
+typedef INT PixelFormat;
+
+#define PixelFormatIndexed 0x00010000 // Indexes into a palette
+#define PixelFormatGDI 0x00020000 // Is a GDI-supported format
+#define PixelFormatAlpha 0x00040000 // Has an alpha component
+#define PixelFormatPAlpha 0x00080000 // Uses pre-multiplied alpha
+#define PixelFormatExtended 0x00100000 // Uses extended color (16 bits per channel)
+#define PixelFormatCanonical 0x00200000 // ?
+
+#define PixelFormatUndefined 0
+#define PixelFormatDontCare 0
+
+#define PixelFormat1bppIndexed (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat4bppIndexed (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat8bppIndexed (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat16bppGrayScale (4 | (16 << 8) | PixelFormatExtended)
+#define PixelFormat16bppRGB555 (5 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppRGB565 (6 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppARGB1555 (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI)
+#define PixelFormat24bppRGB (8 | (24 << 8) | PixelFormatGDI)
+#define PixelFormat32bppRGB (9 | (32 << 8) | PixelFormatGDI)
+#define PixelFormat32bppARGB (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)
+#define PixelFormat32bppPARGB (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI)
+#define PixelFormat48bppRGB (12 | (48 << 8) | PixelFormatExtended)
+#define PixelFormat64bppARGB (13 | (64 << 8) | PixelFormatAlpha | PixelFormatCanonical | PixelFormatExtended)
+#define PixelFormat64bppPARGB (14 | (64 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatExtended)
+#define PixelFormatMax 15
+
+#endif
+
+
+/*
+ * Return the pixel size for the specified format (in bits)
+ */
+
+inline UINT
+GetPixelFormatSize(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt >> 8) & 0xff;
+}
+
+/*
+ * Determine if the specified pixel format is an indexed color format
+ */
+
+inline BOOL
+IsIndexedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatIndexed) != 0;
+}
+
+/*
+ * Determine if the pixel format can have alpha channel
+ */
+
+inline BOOL
+IsAlphaPixelFormat(
+ PixelFormat pixfmt
+)
+{
+ return (pixfmt & PixelFormatAlpha) != 0;
+}
+
+/*
+ * Determine if the pixel format is an extended format,
+ * i.e. supports 16-bit per channel
+ */
+
+inline BOOL
+IsExtendedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatExtended) != 0;
+}
+
+/*
+ * Determine if the pixel format is canonical format:
+ * PixelFormat32bppARGB
+ * PixelFormat32bppPARGB
+ * PixelFormat64bppARGB
+ * PixelFormat64bppPARGB
+ */
+
+inline BOOL
+IsCanonicalPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatCanonical) != 0;
+}
+
+/*
+ * Color palette
+ * palette entries are limited to 32bpp ARGB pixel format
+ */
+
+enum PaletteFlags
+{
+ PaletteFlagsHasAlpha = 0x0001,
+ PaletteFlagsGrayScale = 0x0002,
+ PaletteFlagsHalftone = 0x0004
+};
+
+struct ColorPalette
+{
+public:
+ UINT Flags; // palette flags
+ UINT Count; // number of color entries
+ ARGB Entries[1]; // palette color entries
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
new file mode 100644
index 0000000000..dd1d20e273
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
@@ -0,0 +1,498 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusRegion.h
+*
+* Abstract:
+*
+* Region API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSREGION_H
+#define _GDIPLUSREGION_H
+
+/**
+ * Construct a new region object
+ */
+
+inline
+Region::Region()
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegion(&region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const RectF& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRect(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const Rect& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRectI(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const GraphicsPath* path)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionPath(path->nativePath, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const BYTE* regionData, IN INT size)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionHrgn(hRgn, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region* Region::FromHRGN(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ if (DllExports::GdipCreateRegionHrgn(hRgn, &region) == Ok)
+ {
+ Region* newRegion = new Region(region);
+
+ if (newRegion == NULL)
+ {
+ DllExports::GdipDeleteRegion(region);
+ }
+
+ return newRegion;
+ }
+ else
+ return NULL;
+}
+
+inline
+Region::~Region()
+{
+ DllExports::GdipDeleteRegion(nativeRegion);
+}
+
+/**
+ * Make a copy of the region object
+ */
+inline Region*
+Region::Clone() const
+{
+ GpRegion *region = NULL;
+
+ SetStatus(DllExports::GdipCloneRegion(nativeRegion, &region));
+
+ return new Region(region);
+}
+
+inline Status
+Region::MakeInfinite()
+{
+ return SetStatus(DllExports::GdipSetInfinite(nativeRegion));
+}
+
+inline Status
+Region::MakeEmpty()
+{
+ return SetStatus(DllExports::GdipSetEmpty(nativeRegion));
+}
+
+/**
+ * Region operations
+ */
+inline Status
+Region::Intersect(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect));
+}
+
+inline Status
+Region::Union(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion));
+}
+
+inline Status
+Region::Xor(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor));
+}
+
+inline Status
+Region::Exclude(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeExclude));
+}
+
+inline Status
+Region::Complement(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion,
+ path->nativePath, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeComplement));
+}
+
+/**
+ * Transform operations
+ */
+inline Status
+Region::Translate(IN REAL dx,
+ IN REAL dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Translate(IN INT dx,
+ IN INT dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Transform(IN const Matrix* matrix)
+{
+ return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix));
+}
+
+/**
+ * Get region attributes
+ */
+inline Status
+Region::GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline Status
+Region::GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline HRGN
+Region::GetHRGN(IN const Graphics* g) const
+{
+ HRGN hrgn;
+
+ SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion,
+ g->nativeGraphics,
+ &hrgn));
+
+ return hrgn;
+}
+
+inline BOOL
+Region::IsEmpty(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::IsInfinite(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::Equals(IN const Region* region,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEqualRegion(nativeRegion,
+ region->nativeRegion,
+ g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+// Get the size of the buffer needed for the GetData method
+inline UINT
+Region::GetDataSize() const
+{
+ UINT bufferSize = 0;
+
+ SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize));
+
+ return bufferSize;
+}
+
+// buffer - where to put the data
+// bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+// sizeFilled - if not NULL, this is an OUT param that says how many bytes
+// of data were written to the buffer.
+inline Status
+Region::GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled) const
+{
+ return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));
+}
+
+/**
+ * Hit testing operations
+ */
+inline BOOL
+Region::IsVisible(IN const PointF& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion,
+ point.X, point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const RectF& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X,
+ rect.Y, rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Point& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+
+ SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion,
+ point.X,
+ point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Rect& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline UINT
+Region::GetRegionScansCount(IN const Matrix* matrix) const
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion,
+ &count,
+ matrix->nativeMatrix));
+ return count;
+}
+
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT RectF* rects,
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScans(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// If rects is NULL, return the count of rects in the region.
+// Otherwise, assume rects is big enough to hold all the region rects
+// and fill them in and return the number of rects filled in.
+// The rects are returned in the units specified by the matrix
+// (which is typically a world-to-device transform).
+// Note that the number of rects returned can vary, depending on the
+// matrix that is used.
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT Rect* rects, // NULL to just get the count
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// protected method
+inline Region::Region(GpRegion* nativeRegion)
+{
+ SetNativeRegion(nativeRegion);
+}
+
+// protected method
+inline VOID Region::SetNativeRegion(GpRegion* nativeRegion)
+{
+ this->nativeRegion = nativeRegion;
+}
+
+inline Status Region::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+#endif // !_GDIPLUSREGION_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
new file mode 100644
index 0000000000..1c9ddb50ec
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
@@ -0,0 +1,381 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusStringFormat.h
+*
+* Abstract:
+*
+* String format specification for DrawString and text APIs
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSSTRINGFORMAT_H
+#define _GDIPLUSSTRINGFORMAT_H
+
+
+class StringFormat : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+
+
+ StringFormat(
+ IN INT formatFlags = 0,
+ IN LANGID language = LANG_NEUTRAL
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCreateStringFormat(
+ formatFlags,
+ language,
+ &nativeFormat
+ );
+ }
+
+ static const StringFormat *GenericDefault();
+ static const StringFormat *GenericTypographic();
+
+ // Constructor based on existing string format
+
+ StringFormat(
+ IN const StringFormat *format
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ format ? format->nativeFormat : NULL,
+ &nativeFormat
+ );
+ }
+
+ StringFormat *Clone() const
+ {
+ GpStringFormat *clonedStringFormat = NULL;
+
+ lastError = DllExports::GdipCloneStringFormat(
+ nativeFormat,
+ &clonedStringFormat
+ );
+
+ if (lastError == Ok)
+ return new StringFormat(clonedStringFormat, lastError);
+ else
+ return NULL;
+ }
+
+ ~StringFormat()
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ }
+
+ Status SetFormatFlags(IN INT flags)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatFlags(
+ nativeFormat,
+ flags
+ ));
+ }
+
+ INT GetFormatFlags() const
+ {
+ INT flags;
+ SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));
+ return flags;
+ }
+
+#ifndef DCR_USE_NEW_152154
+ Status SetLineSpacing(
+ IN REAL amount = 1.0f,
+ IN LineSpacing method = LineSpacingRecommended
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineSpacing(
+ nativeFormat,
+ amount,
+ method
+ ));
+ }
+#endif
+
+ Status SetAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetLineAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetLineAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatLineAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT)hotkeyPrefix
+ ));
+ }
+
+ HotkeyPrefix GetHotkeyPrefix() const
+ {
+ HotkeyPrefix hotkeyPrefix;
+ SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT*)&hotkeyPrefix
+ ));
+ return hotkeyPrefix;
+ }
+
+ Status SetTabStops(
+ IN REAL firstTabOffset,
+ IN INT count,
+ IN const REAL *tabStops
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTabStops(
+ nativeFormat,
+ firstTabOffset,
+ count,
+ tabStops
+ ));
+ }
+
+ INT GetTabStopCount() const
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));
+ return count;
+ }
+
+ Status GetTabStops(
+ IN INT count,
+ OUT REAL *firstTabOffset,
+ OUT REAL *tabStops
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetStringFormatTabStops(
+ nativeFormat,
+ count,
+ firstTabOffset,
+ tabStops
+ ));
+ }
+
+#ifdef DCR_USE_NEW_146933
+ Status SetDigitSubstitution(
+ IN LANGID language,
+ IN StringDigitSubstitute substitute
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(
+ nativeFormat,
+ language,
+ substitute
+ ));
+ }
+
+ LANGID GetDigitSubstitutionLanguage(
+ ) const
+ {
+ LANGID language;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ &language,
+ NULL
+ ));
+ return language;
+ }
+
+ StringDigitSubstitute GetDigitSubstitutionMethod(
+ ) const
+ {
+ StringDigitSubstitute substitute;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ NULL,
+ &substitute
+ ));
+ return substitute;
+ }
+#endif // DCR_USE_NEW_146933
+
+ // String trimming. How to handle more text than can be displayed
+ // in the limits available.
+
+ Status SetTrimming(IN StringTrimming trimming)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTrimming(
+ nativeFormat,
+ trimming
+ ));
+ }
+
+ StringTrimming StringFormat::GetTrimming() const
+ {
+ StringTrimming trimming;
+ SetStatus(DllExports::GdipGetStringFormatTrimming(
+ nativeFormat,
+ &trimming
+ ));
+ return trimming;
+ }
+
+#ifdef DCR_USE_NEW_174340
+ Status SetMeasurableCharacterRanges(
+ IN INT rangeCount,
+ IN const CharacterRange *ranges
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(
+ nativeFormat,
+ rangeCount,
+ ranges
+ ));
+ }
+
+ INT GetMeasurableCharacterRangeCount()
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(
+ nativeFormat,
+ &count
+ ));
+ return count;
+ }
+#endif
+
+ // GetLastStatus - return last error code and clear error code
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastError;
+ lastError = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Status SetStatus(GpStatus newStatus) const
+ {
+ if (newStatus == Ok)
+ {
+ return Ok;
+ }
+ else
+ {
+ return lastError = newStatus;
+ }
+ }
+
+
+// Not allowed and move to private
+ StringFormat(const StringFormat &source)
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ }
+
+ StringFormat& operator=(const StringFormat &source)
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ return *this;
+ }
+
+
+ // private constructor for copy
+ StringFormat(GpStringFormat * clonedStringFormat, Status status)
+ {
+ lastError = status;
+ nativeFormat = clonedStringFormat;
+
+ }
+
+ GpStringFormat *nativeFormat;
+ mutable Status lastError;
+};
+
+// Generic constant string formats.
+
+static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};
+static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};
+
+static StringFormat *GenericTypographicStringFormat = NULL;
+static StringFormat *GenericDefaultStringFormat = NULL;
+
+// Define the generic string formats
+
+
+inline const StringFormat *StringFormat::GenericDefault()
+{
+ if (GenericDefaultStringFormat != NULL)
+ {
+ return GenericDefaultStringFormat;
+ }
+
+ GenericDefaultStringFormat =
+ (StringFormat*)GenericDefaultStringFormatBuffer;
+
+ GenericDefaultStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericDefault(
+ &(GenericDefaultStringFormat->nativeFormat)
+ );
+
+ return GenericDefaultStringFormat;
+}
+
+inline const StringFormat *StringFormat::GenericTypographic()
+{
+ if (GenericTypographicStringFormat != NULL)
+ {
+ return GenericTypographicStringFormat;
+ }
+
+ GenericTypographicStringFormat =
+ (StringFormat*)GenericTypographicStringFormatBuffer;
+
+ GenericTypographicStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericTypographic(
+ &GenericTypographicStringFormat->nativeFormat
+ );
+
+ return GenericTypographicStringFormat;
+}
+
+#endif // !_GDIPLUSSTRINGFORMAT_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
new file mode 100644
index 0000000000..58c584dc1d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
@@ -0,0 +1,826 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusTypes.h
+*
+* Abstract:
+*
+* Basic types used by GDI+
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSTYPES_H
+#define _GDIPLUSTYPES_H
+
+#ifndef DCR_USE_NEW_175866
+
+//--------------------------------------------------------------------------
+// LIB version initialization functions
+//--------------------------------------------------------------------------
+
+typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);
+
+extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);
+extern "C" VOID __stdcall UninitializeGdiplus();
+
+#endif
+
+//--------------------------------------------------------------------------
+// Callback functions
+//--------------------------------------------------------------------------
+
+extern "C" {
+typedef BOOL (CALLBACK * ImageAbort)(VOID *);
+typedef ImageAbort DrawImageAbort;
+typedef ImageAbort GetThumbnailImageAbort;
+}
+
+// Callback for EnumerateMetafile methods. The parameters are:
+
+// recordType WMF, EMF, or EMF+ record type
+// flags (always 0 for WMF/EMF records)
+// dataSize size of the record data (in bytes), or 0 if no data
+// data pointer to the record data, or NULL if no data
+// callbackData pointer to callbackData, if any
+
+// This method can then call Metafile::PlayRecord to play the
+// record that was just enumerated. If this method returns
+// FALSE, the enumeration process is aborted. Otherwise, it continues.
+
+extern "C" {
+typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
+}
+
+//--------------------------------------------------------------------------
+// Primitive data types
+//
+// NOTE:
+// Types already defined in standard header files:
+// INT8
+// UINT8
+// INT16
+// UINT16
+// INT32
+// UINT32
+// INT64
+// UINT64
+//
+// Avoid using the following types:
+// LONG - use INT
+// ULONG - use UINT
+// DWORD - use UINT32
+//--------------------------------------------------------------------------
+
+typedef float REAL;
+
+#define REAL_MAX FLT_MAX
+#define REAL_MIN FLT_MIN
+#define REAL_TOLERANCE (FLT_MIN * 100)
+#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
+
+//--------------------------------------------------------------------------
+// Forward declarations of various internal classes
+//--------------------------------------------------------------------------
+
+class Size;
+class SizeF;
+class Point;
+class PointF;
+class Rect;
+class RectF;
+class CharacterRange;
+
+//--------------------------------------------------------------------------
+// Return values from any GDI+ API
+//--------------------------------------------------------------------------
+
+enum Status
+{
+ Ok = 0,
+ GenericError = 1,
+ InvalidParameter = 2,
+ OutOfMemory = 3,
+ ObjectBusy = 4,
+ InsufficientBuffer = 5,
+ NotImplemented = 6,
+ Win32Error = 7,
+ WrongState = 8,
+ Aborted = 9,
+#ifdef DCR_USE_NEW_135429
+ FileNotFound = 10,
+ ValueOverflow = 11,
+ AccessDenied = 12,
+ UnknownImageFormat = 13,
+ FontFamilyNotFound = 14,
+ FontStyleNotFound = 15,
+ NotTrueTypeFont = 16,
+#else
+ NotFound = 10,
+ ValueOverflow = 11,
+#endif
+ UnsupportedGdiplusVersion = 17,
+ GdiplusNotInitialized
+
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class SizeF
+{
+public:
+
+ // Default constructor
+ SizeF()
+ {
+ Width = Height = 0.0f;
+ }
+
+ SizeF(IN const SizeF& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ SizeF(IN REAL width,
+ IN REAL height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ SizeF operator+(IN const SizeF& sz) const
+ {
+ return SizeF(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ SizeF operator-(IN const SizeF& sz) const
+ {
+ return SizeF(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const SizeF& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0.0f && Height == 0.0f);
+ }
+
+public:
+
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Size
+{
+public:
+
+ // Default constructor
+ Size()
+ {
+ Width = Height = 0;
+ }
+
+ Size(IN const Size& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Size(IN INT width,
+ IN INT height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ Size operator+(IN const Size& sz) const
+ {
+ return Size(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ Size operator-(IN const Size& sz) const
+ {
+ return Size(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const Size& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0 && Height == 0);
+ }
+
+public:
+
+ INT Width;
+ INT Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class PointF
+{
+public:
+ PointF()
+ {
+ X = Y = 0.0f;
+ }
+
+ PointF(IN const PointF &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ PointF(IN const SizeF &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ PointF(IN REAL x,
+ IN REAL y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ PointF operator+(IN const PointF& point) const
+ {
+ return PointF(X + point.X,
+ Y + point.Y);
+ }
+
+ PointF operator-(IN const PointF& point) const
+ {
+ return PointF(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const PointF& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Point
+{
+public:
+ Point()
+ {
+ X = Y = 0;
+ }
+
+ Point(IN const Point &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ Point(IN const Size &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ Point(IN INT x,
+ IN INT y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ Point operator+(IN const Point& point) const
+ {
+ return Point(X + point.X,
+ Y + point.Y);
+ }
+
+ Point operator-(IN const Point& point) const
+ {
+ return Point(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const Point& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ INT X;
+ INT Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class RectF
+{
+public:
+
+ // Default constructor
+
+ RectF()
+ {
+ X = Y = Width = Height = 0.0f;
+ }
+
+ RectF(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ RectF(IN const PointF& location,
+ IN const SizeF& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ RectF* Clone() const
+ {
+ return new RectF(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT PointF* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT SizeF* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT RectF* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ REAL GetLeft() const
+ {
+ return X;
+ }
+
+ REAL GetTop() const
+ {
+ return Y;
+ }
+
+ REAL GetRight() const
+ {
+ return X+Width;
+ }
+
+ REAL GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
+ }
+
+ BOOL Equals(IN const RectF & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN REAL x,
+ IN REAL y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const PointF& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN const RectF& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN REAL dx,
+ IN REAL dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const PointF& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const RectF& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = min(a.GetRight(), b.GetRight());
+ REAL bottom = min(a.GetBottom(), b.GetBottom());
+ REAL left = max(a.GetLeft(), b.GetLeft());
+ REAL top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const RectF& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = max(a.GetRight(), b.GetRight());
+ REAL bottom = max(a.GetBottom(), b.GetBottom());
+ REAL left = min(a.GetLeft(), b.GetLeft());
+ REAL top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const PointF& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN REAL dx,
+ IN REAL dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Rect
+{
+public:
+
+ // Default constructor
+
+ Rect()
+ {
+ X = Y = Width = Height = 0;
+ }
+
+ Rect(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ Rect(IN const Point& location,
+ IN const Size& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Rect* Clone() const
+ {
+ return new Rect(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT Point* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT Size* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT Rect* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ INT GetLeft() const
+ {
+ return X;
+ }
+
+ INT GetTop() const
+ {
+ return Y;
+ }
+
+ INT GetRight() const
+ {
+ return X+Width;
+ }
+
+ INT GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= 0) || (Height <= 0);
+ }
+
+ BOOL Equals(IN const Rect & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN INT x,
+ IN INT y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const Point& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN Rect& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN INT dx,
+ IN INT dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const Point& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const Rect& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = min(a.GetRight(), b.GetRight());
+ INT bottom = min(a.GetBottom(), b.GetBottom());
+ INT left = max(a.GetLeft(), b.GetLeft());
+ INT top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const Rect& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = max(a.GetRight(), b.GetRight());
+ INT bottom = max(a.GetBottom(), b.GetBottom());
+ INT left = min(a.GetLeft(), b.GetLeft());
+ INT top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const Point& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN INT dx,
+ IN INT dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ INT X;
+ INT Y;
+ INT Width;
+ INT Height;
+};
+
+// A user must mange memory for PathData.
+
+class PathData
+{
+public:
+ PathData()
+ {
+ Count = 0;
+ Points = NULL;
+ Types = NULL;
+ }
+
+ ~PathData()
+ {
+ if (Points != NULL)
+ {
+ delete Points;
+ }
+
+ if (Types != NULL)
+ {
+ delete Types;
+ }
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathData(const PathData &);
+ PathData& operator=(const PathData &);
+
+#endif
+
+public:
+ INT Count;
+ PointF* Points;
+ BYTE* Types;
+};
+
+
+//-----------------------------
+// text character range
+//-----------------------------
+
+class CharacterRange
+{
+public:
+ CharacterRange(
+ INT first,
+ INT length
+ ) :
+ First (first),
+ Length (length)
+ {}
+
+ CharacterRange() : First(0), Length(0)
+ {}
+
+ CharacterRange & operator = (const CharacterRange &rhs)
+ {
+ First = rhs.First;
+ Length = rhs.Length;
+ return *this;
+ }
+
+ INT First;
+ INT Length;
+};
+
+#endif // !_GDIPLUSTYPES_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
new file mode 100644
index 0000000000..0a514772bc
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
@@ -0,0 +1,397 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Image Attributes
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGEATTRIBUTES_H
+#define _GDIPLUSIMAGEATTRIBUTES_H
+
+class GpImageAttributes;
+
+// There are 5 possible sets of color adjustments:
+// ColorAdjustDefault,
+// ColorAdjustBitmap,
+// ColorAdjustBrush,
+// ColorAdjustPen,
+// ColorAdjustText,
+
+// Bitmaps, Brushes, Pens, and Text will all use any color adjustments
+// that have been set into the default ImageAttributes until their own
+// color adjustments have been set. So as soon as any "Set" method is
+// called for Bitmaps, Brushes, Pens, or Text, then they start from
+// scratch with only the color adjustments that have been set for them.
+// Calling Reset removes any individual color adjustments for a type
+// and makes it revert back to using all the default color adjustments
+// (if any). The SetToIdentity method is a way to force a type to
+// have no color adjustments at all, regardless of what previous adjustments
+// have been set for the defaults or for that type.
+
+class ImageAttributes : public GdiplusBase
+{
+ friend class Graphics;
+ friend class TextureBrush;
+
+public:
+
+ ImageAttributes()
+ {
+ nativeImageAttr = NULL;
+ lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);
+ }
+
+ ~ImageAttributes()
+ {
+ DllExports::GdipDisposeImageAttributes(nativeImageAttr);
+ }
+
+ ImageAttributes* Clone() const
+ {
+ GpImageAttributes* clone;
+
+ SetStatus(DllExports::GdipCloneImageAttributes(
+ nativeImageAttr,
+ &clone));
+
+ return new ImageAttributes(clone, lastResult);
+ }
+
+ // Set to identity, regardless of what the default color adjustment is.
+ Status
+ SetToIdentity(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesToIdentity(
+ nativeImageAttr,
+ type));
+ }
+
+ // Remove any individual color adjustments, and go back to using the default
+ Status
+ Reset(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipResetImageAttributes(
+ nativeImageAttr,
+ type));
+ }
+
+ Status
+ SetColorMatrix(
+ IN const ColorMatrix *colorMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ NULL,
+ mode));
+ }
+
+ Status ClearColorMatrix(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status
+ SetColorMatrices(
+ IN const ColorMatrix *colorMatrix,
+ IN const ColorMatrix *grayMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ grayMatrix,
+ mode));
+ }
+
+ Status ClearColorMatrices(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status SetThreshold(
+ IN REAL threshold,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ TRUE,
+ threshold));
+ }
+
+ Status ClearThreshold(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetGamma(
+ IN REAL gamma,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ TRUE,
+ gamma));
+ }
+
+ Status ClearGamma(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ TRUE));
+ }
+
+ Status ClearNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ FALSE));
+ }
+
+ Status SetColorKey(
+ IN const Color& colorLow,
+ IN const Color& colorHigh,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorLow.GetValue(),
+ colorHigh.GetValue()));
+ }
+
+ Status ClearColorKey(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL));
+ }
+
+ Status SetOutputChannel(
+ IN ColorChannelFlags channelFlags,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ TRUE,
+ channelFlags));
+ }
+
+ Status ClearOutputChannel(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ FALSE,
+ ColorChannelFlagsLast));
+ }
+
+ Status SetOutputChannelColorProfile(
+ IN const WCHAR *colorProfileFilename,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorProfileFilename));
+ }
+
+ Status ClearOutputChannelColorProfile(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL));
+ }
+
+ Status SetRemapTable(
+ IN UINT mapSize,
+ IN const ColorMap *map,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ TRUE,
+ mapSize,
+ map));
+ }
+
+ Status ClearRemapTable(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0,
+ NULL));
+ }
+
+ Status SetBrushRemapTable(IN UINT mapSize,
+ IN const ColorMap *map)
+ {
+ return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);
+ }
+
+ Status ClearBrushRemapTable()
+ {
+ return this->ClearRemapTable(ColorAdjustTypeBrush);
+ }
+
+ Status SetWrapMode(IN WrapMode wrap,
+ IN const Color& color = Color(),
+ IN BOOL clamp = FALSE)
+ {
+ ARGB argb = color.GetValue();
+
+ return SetStatus(DllExports::GdipSetImageAttributesWrapMode(
+ nativeImageAttr, wrap, argb, clamp));
+ }
+
+ #ifndef DCR_USE_NEW_145139
+ Status SetICMMode(IN BOOL on)
+ {
+ on;
+ // This is not implemented.
+ // The supported method for doing ICM conversion from the embedded
+ // ICC profile is to use the Bitmap constructor from a file or stream
+ // and specify TRUE for the useIcm parameter. This will cause the
+ // image to be ICM converted when it's loaded from the file/stream
+ // if the profile exists.
+ return SetStatus(NotImplemented);
+// DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)
+ }
+ #endif
+
+ // The flags of the palette are ignored.
+ Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,
+ IN ColorAdjustType colorAdjustType) const
+ {
+ return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
+ nativeImageAttr, colorPalette, colorAdjustType));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ ImageAttributes(const ImageAttributes &);
+ ImageAttributes& operator=(const ImageAttributes &);
+
+#endif
+
+protected:
+ ImageAttributes(GpImageAttributes* imageAttr, Status status)
+ {
+ SetNativeImageAttr(imageAttr);
+ lastResult = status;
+ }
+
+ VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)
+ {
+ this->nativeImageAttr = nativeImageAttr;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpImageAttributes* nativeImageAttr;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiplusInit.h b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
new file mode 100644
index 0000000000..3320fa4b7e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
@@ -0,0 +1,104 @@
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* Gdiplus init
+*
+* Abstract:
+*
+* GDI+ startup/shutdown API's
+*
+* Created:
+*
+* 09/02/2000 agodfrey
+* Created it.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSINIT_H
+#define _GDIPLUSINIT_H
+//************************************************************************
+#if _FX_COMPILER_ == _FX_VC6_
+typedef unsigned long ULONG_PTR, *PULONG_PTR; //johnson add here.
+#endif
+//************************************************************************
+
+// Used for debug event notification (debug builds only)
+
+enum DebugEventLevel
+{
+ DebugEventLevelFatal,
+ DebugEventLevelWarning
+};
+
+// Callback function that GDI+ can call, on debug builds, for assertions
+// and warnings.
+
+typedef VOID (WINAPI *DebugEventProc)(DebugEventLevel level, CHAR *message);
+
+// Notification functions which the user must call appropriately if
+// "SuppressBackgroundThread" (below) is set.
+
+typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR *token);
+typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);
+
+// Input structure for GdiplusStartup()
+
+struct GdiplusStartupInput
+{
+ UINT32 GdiplusVersion; // Must be 1
+ DebugEventProc DebugEventCallback; // Ignored on free builds
+ BOOL SuppressBackgroundThread; // FALSE unless you're prepared to call
+ // the hook/unhook functions properly
+ BOOL SuppressExternalCodecs; // FALSE unless you want GDI+ only to use
+ // its internal image codecs.
+
+ GdiplusStartupInput(
+ DebugEventProc debugEventCallback = NULL,
+ BOOL suppressBackgroundThread = FALSE,
+ BOOL suppressExternalCodecs = FALSE)
+ {
+ GdiplusVersion = 1;
+ DebugEventCallback = debugEventCallback;
+ SuppressBackgroundThread = suppressBackgroundThread;
+ SuppressExternalCodecs = suppressExternalCodecs;
+ }
+};
+
+// Output structure for GdiplusStartup()
+
+struct GdiplusStartupOutput
+{
+ // The following 2 fields are NULL if SuppressBackgroundThread is FALSE.
+ // Otherwise, they are functions which must be called appropriately to
+ // replace the background thread.
+ //
+ // These should be called on the application's main message loop - i.e.
+ // a message loop which is active for the lifetime of GDI+.
+ // "NotificationHook" should be called before starting the loop,
+ // and "NotificationUnhook" should be called after the loop ends.
+
+ NotificationHookProc NotificationHook;
+ NotificationUnhookProc NotificationUnhook;
+};
+
+// GDI+ initialization. Must be called before GDI+ API's are used.
+//
+// token - may not be NULL - accepts a token to be passed in the corresponding
+// GdiplusShutdown call.
+// input - may not be NULL
+// output - may be NULL only if input->SuppressBackgroundThread is FALSE.
+
+extern "C" Status WINAPI GdiplusStartup(
+ OUT ULONG_PTR *token,
+ const GdiplusStartupInput *input,
+ OUT GdiplusStartupOutput *output);
+
+// GDI+ termination. Must be called before GDI+ is unloaded. GDI+ API's may not
+// be called after this.
+
+extern "C" VOID WINAPI GdiplusShutdown(ULONG_PTR token);
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/sal.h b/core/src/fxge/Microsoft SDK/include/sal.h
new file mode 100644
index 0000000000..136996974a
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/sal.h
@@ -0,0 +1,729 @@
+/***
+*sal.h - markers for documenting the semantics of APIs
+*
+* Copyright (c) Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* sal.h provides a set of annotations to describe how a function uses its
+* parameters - the assumptions it makes about them, and the guarantees it makes
+* upon finishing.
+*
+* [Public]
+*
+****/
+
+/*
+ -------------------------------------------------------------------------------
+ Introduction
+
+ sal.h provides a set of annotations to describe how a function uses its
+ parameters - the assumptions it makes about them, and the guarantees it makes
+ upon finishing.
+
+ Annotations may be placed before either a function parameter's type or its return
+ type, and describe the function's behavior regarding the parameter or return value.
+ There are two classes of annotations: buffer annotations and advanced annotations.
+ Buffer annotations describe how functions use their pointer parameters, and
+ advanced annotations either describe complex/unusual buffer behavior, or provide
+ additional information about a parameter that is not otherwise expressible.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotations
+
+ The most important annotations in sal.h provide a consistent way to annotate
+ buffer parameters or return values for a function. Each of these annotations describes
+ a single buffer (which could be a string, a fixed-length or variable-length array,
+ or just a pointer) that the function interacts with: where it is, how large it is,
+ how much is initialized, and what the function does with it.
+
+ The appropriate macro for a given buffer can be constructed using the table below.
+ Just pick the appropriate values from each category, and combine them together
+ with a leading underscore. Some combinations of values do not make sense as buffer
+ annotations. Only meaningful annotations can be added to your code; for a list of
+ these, see the buffer annotation definitions section.
+
+ Only a single buffer annotation should be used for each parameter.
+
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | Level | Usage | Size | Output | NullTerm | Optional | Parameters |
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | <> | <> | <> | <> | _z | <> | <> |
+ | _deref | _in | _ecount | _full | _nz | _opt | (size) |
+ | _deref_opt | _out | _bcount | _part | | | (size,length) |
+ | | _inout | | | | | |
+ | | | | | | | |
+ |------------|------------|---------|--------|----------|----------|---------------|
+
+ Level: Describes the buffer pointer's level of indirection from the parameter or
+ return value 'p'.
+
+ <> : p is the buffer pointer.
+ _deref : *p is the buffer pointer. p must not be NULL.
+ _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+ the annotation is ignored.
+
+ Usage: Describes how the function uses the buffer.
+
+ <> : The buffer is not accessed. If used on the return value or with _deref, the
+ function will provide the buffer, and it will be uninitialized at exit.
+ Otherwise, the caller must provide the buffer. This should only be used
+ for alloc and free functions.
+ _in : The function will only read from the buffer. The caller must provide the
+ buffer and initialize it. Cannot be used with _deref.
+ _out : The function will only write to the buffer. If used on the return value or
+ with _deref, the function will provide the buffer and initialize it.
+ Otherwise, the caller must provide the buffer, and the function will
+ initialize it.
+ _inout : The function may freely read from and write to the buffer. The caller must
+ provide the buffer and initialize it. If used with _deref, the buffer may
+ be reallocated by the function.
+
+ Size: Describes the total size of the buffer. This may be less than the space actually
+ allocated for the buffer, in which case it describes the accessible amount.
+
+ <> : No buffer size is given. If the type specifies the buffer size (such as
+ with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+ element long. Must be used with _in, _out, or _inout.
+ _ecount : The buffer size is an explicit element count.
+ _bcount : The buffer size is an explicit byte count.
+
+ Output: Describes how much of the buffer will be initialized by the function. For
+ _inout buffers, this also describes how much is initialized at entry. Omit this
+ category for _in buffers; they must be fully initialized by the caller.
+
+ <> : The type specifies how much is initialized. For instance, a function initializing
+ an LPWSTR must NULL-terminate the string.
+ _full : The function initializes the entire buffer.
+ _part : The function initializes part of the buffer, and explicitly indicates how much.
+
+ NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.
+ _z : A '\0' indicated the end of the buffer
+ _nz : The buffer may not be null terminated and a '\0' does not indicate the end of the
+ buffer.
+ Optional: Describes if the buffer itself is optional.
+
+ <> : The pointer to the buffer must not be NULL.
+ _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+
+ Parameters: Gives explicit counts for the size and length of the buffer.
+
+ <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+ (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+ (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+ and _bcount_part.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotation Examples
+
+ LWSTDAPI_(BOOL) StrToIntExA(
+ LPCSTR pszString, -- No annotation required, const implies __in.
+ DWORD dwFlags,
+ __out int *piRet -- A pointer whose dereference will be filled in.
+ );
+
+ void MyPaintingFunction(
+ __in HWND hwndControl, -- An initialized read-only parameter.
+ __in_opt HDC hdcOptional, -- An initialized read-only parameter that might be NULL.
+ __inout IPropertyStore *ppsStore -- An initialized parameter that may be freely used
+ -- and modified.
+ );
+
+ LWSTDAPI_(BOOL) PathCompactPathExA(
+ __out_ecount(cchMax) LPSTR pszOut, -- A string buffer with cch elements that will
+ -- be NULL terminated on exit.
+ LPCSTR pszSrc, -- No annotation required, const implies __in.
+ UINT cchMax,
+ DWORD dwFlags
+ );
+
+ HRESULT SHLocalAllocBytes(
+ size_t cb,
+ __deref_bcount(cb) T **ppv -- A pointer whose dereference will be set to an
+ -- uninitialized buffer with cb bytes.
+ );
+
+ __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+ entry and exit, and may be written to by this function.
+
+ __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+ partially initialized by this function. The function indicates how much it
+ initialized by setting *countOut.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotations
+
+ Advanced annotations describe behavior that is not expressible with the regular
+ buffer macros. These may be used either to annotate buffer parameters that involve
+ complex or conditional behavior, or to enrich existing annotations with additional
+ information.
+
+ __success(expr) f :
+ <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+ all the function's guarantees (as given by other annotations) must hold. If <expr>
+ is false at exit, the caller should not expect any of the function's guarantees
+ to hold. If not used, the function must always satisfy its guarantees. Added
+ automatically to functions that indicate success in standard ways, such as by
+ returning an HRESULT.
+
+ __nullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ NULL character or pointer. May be used on typedefs, which marks valid (properly
+ initialized) instances of that type as being NULL-terminated.
+
+ __nullnullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ sequence of two NULL characters or pointers. May be used on typedefs, which marks
+ valid instances of that type as being double-NULL terminated.
+
+ __reserved v :
+ Value v must be 0/NULL, reserved for future use.
+
+ __checkReturn v :
+ Return value v must not be ignored by callers of this function.
+
+ __typefix(ctype) v :
+ Value v should be treated as an instance of ctype, rather than its declared type.
+
+ __override f :
+ Specify C#-style 'override' behaviour for overriding virtual methods.
+
+ __callback f :
+ Function f can be used as a function pointer.
+
+ __format_string p :
+ Pointer p is a string that contains % markers in the style of printf.
+
+ __blocksOn(resource) f :
+ Function f blocks on the resource 'resource'.
+
+ __fallthrough :
+ Annotates switch statement labels where fall-through is desired, to distinguish
+ from forgotten break statements.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotation Examples
+
+ __success(return == TRUE) LWSTDAPI_(BOOL)
+ PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+ pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+
+ typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+
+ __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+ a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+
+ -------------------------------------------------------------------------------
+*/
+
+#pragma once
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif /* #ifdef __cplusplus */
+
+/*
+ -------------------------------------------------------------------------------
+ Helper Macro Definitions
+
+ These express behavior common to many of the high-level annotations.
+ DO NOT USE THESE IN YOUR CODE.
+ -------------------------------------------------------------------------------
+*/
+
+/*
+The helper annotations are only understood by the compiler version used by various
+defect detection tools. When the regular compiler is running, they are defined into
+nothing, and do not affect the compiled code.
+*/
+
+#if !defined(__midl) && defined(_PREFAST_)
+
+ /*
+ In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ Annotation Language. These __declspec("SAL_*") annotations are the
+ primitives the compiler understands and all high-level SpecString MACROs
+ will decompose into these primivates.
+ */
+
+ #define SPECSTRINGIZE( x ) #x
+
+ /*
+ __null p
+ __notnull p
+ __maybenull p
+
+ Annotates a pointer p. States that pointer p is null. Commonly used
+ in the negated form __notnull or the possibly null form __maybenull.
+ */
+
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ /*
+ __readonly l
+ __notreadonly l
+ __mabyereadonly l
+
+ Annotates a location l. States that location l is not modified after
+ this point. If the annotation is placed on the precondition state of
+ a function, the restriction only applies until the postcondition state
+ of the function. __maybereadonly states that the annotated location
+ may be modified, whereas __notreadonly states that a location must be
+ modified.
+ */
+
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ /*
+ __valid v
+ __notvalid v
+ __maybevalid v
+
+ Annotates any value v. States that the value satisfies all properties of
+ valid values of its type. For example, for a string buffer, valid means
+ that the buffer pointer is either NULL or points to a NULL-terminated string.
+ */
+
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ /*
+ __readableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be read, extent describes
+ how much of the buffer is readable. For a reader of the buffer, this is
+ an explicit permission to read up to that amount, rather than a restriction to
+ read only up to it.
+ */
+
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ /*
+
+ __elem_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size elements.
+ */
+
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size bytes.
+ */
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __writableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be modified, extent
+ describes how much of the buffer is writable (usually the allocation
+ size). For a writer of the buffer, this is an explicit permission to
+ write up to that amount, rather than a restriction to write only up to it.
+ */
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ /*
+ __elem_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size elements.
+ */
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size bytes.
+ */
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __deref p
+
+ Annotates a pointer p. The next annotation applies one dereference down
+ in the type. If readableTo(p, size) then the next annotation applies to
+ all elements *(p+i) for which i satisfies the size. If p is a pointer
+ to a struct, the next annotation applies to all fields of the struct.
+ */
+ #define __deref __declspec("SAL_deref")
+
+ /*
+ __pre __next_annotation
+
+ The next annotation applies in the precondition state
+ */
+ #define __pre __declspec("SAL_pre")
+
+ /*
+ __post __next_annotation
+
+ The next annotation applies in the postcondition state
+ */
+ #define __post __declspec("SAL_post")
+
+ /*
+ __precond(<expr>)
+
+ When <expr> is true, the next annotation applies in the precondition state
+ (currently not enabled)
+ */
+ #define __precond(expr) __pre
+
+ /*
+ __postcond(<expr>)
+
+ When <expr> is true, the next annotation applies in the postcondition state
+ (currently not enabled)
+ */
+ #define __postcond(expr) __post
+
+ /*
+ __exceptthat
+
+ Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ the except clause is to erase any P or notP annotations (explicit or
+ implied) within Q at the same level of dereferencing that the except
+ clause appears, and to replace it with maybeP.
+
+ Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ pointer may be null, and is otherwise valid, thus overriding
+ the implicit notnull annotation implied by __valid on
+ pointers.
+
+ Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ that p is not null (implied by valid), but the elements
+ pointed to by p could be null, and are otherwise valid.
+ */
+ #define __exceptthat __declspec("SAL_except")
+ #define __execeptthat __exceptthat
+
+ /*
+ _refparam
+
+ Added to all out parameter macros to indicate that they are all reference
+ parameters.
+ */
+ #define __refparam __deref __notreadonly
+
+ /*
+ __inner_*
+
+ Helper macros that directly correspond to certain high-level annotations.
+
+ */
+
+ /*
+ Macros to classify the entrypoints and indicate their category.
+
+ Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+
+ */
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ /*
+ Pre-defined data entry point categories include: Registry, File, Network.
+ */
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+ #define __null
+ #define __notnull
+ #define __maybenull
+ #define __readonly
+ #define __notreadonly
+ #define __maybereadonly
+ #define __valid
+ #define __notvalid
+ #define __maybevalid
+ #define __readableTo(extent)
+ #define __elem_readableTo(size)
+ #define __byte_readableTo(size)
+ #define __writableTo(size)
+ #define __elem_writableTo(size)
+ #define __byte_writableTo(size)
+ #define __deref
+ #define __pre
+ #define __post
+ #define __precond(expr)
+ #define __postcond(expr)
+ #define __exceptthat
+ #define __execeptthat
+ #define __inner_success(expr)
+ #define __inner_checkReturn
+ #define __inner_typefix(ctype)
+ #define __inner_override
+ #define __inner_callback
+ #define __inner_blocksOn(resource)
+ #define __inner_fallthrough_dec
+ #define __inner_fallthrough
+ #define __refparam
+ #define __inner_control_entrypoint(category)
+ #define __inner_data_entrypoint(category)
+#endif /* #if !defined(__midl) && defined(_PREFAST_) */
+
+/*
+-------------------------------------------------------------------------------
+Buffer Annotation Definitions
+
+Any of these may be used to directly annotate functions, but only one should
+be used for each parameter. To determine which annotation to use for a given
+buffer, use the table in the buffer annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __ecount(size) __notnull __elem_writableTo(size)
+#define __bcount(size) __notnull __byte_writableTo(size)
+#define __in __pre __valid __pre __deref __readonly
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#define __in_z __in __pre __nullterminated
+#define __in_ecount_z(size) __in_ecount(size) __pre __nullterminated
+#define __in_bcount_z(size) __in_bcount(size) __pre __nullterminated
+#define __in_nz __in
+#define __in_ecount_nz(size) __in_ecount(size)
+#define __in_bcount_nz(size) __in_bcount(size)
+#define __out __ecount(1) __post __valid __refparam
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#define __out_z __post __valid __refparam __post __nullterminated
+#define __out_z_opt __post __valid __refparam __post __nullterminated __exceptthat __maybenull
+#define __out_ecount_z(size) __ecount(size) __post __valid __refparam __post __nullterminated
+#define __out_bcount_z(size) __bcount(size) __post __valid __refparam __post __nullterminated
+#define __out_ecount_part_z(size,length) __out_ecount_part(size,length) __post __nullterminated
+#define __out_bcount_part_z(size,length) __out_bcount_part(size,length) __post __nullterminated
+#define __out_ecount_full_z(size) __out_ecount_full(size) __post __nullterminated
+#define __out_bcount_full_z(size) __out_bcount_full(size) __post __nullterminated
+#define __out_nz __post __valid __refparam __post
+#define __out_nz_opt __post __valid __refparam __post __exceptthat __maybenull
+#define __out_ecount_nz(size) __ecount(size) __post __valid __refparam
+#define __out_bcount_nz(size) __bcount(size) __post __valid __refparam
+#define __inout __pre __valid __post __valid __refparam
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#define __inout_z __inout __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z(size) __inout_ecount(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z(size) __inout_bcount(size) __pre __nullterminated __post __nullterminated
+#define __inout_nz __inout
+#define __inout_ecount_nz(size) __inout_ecount(size)
+#define __inout_bcount_nz(size) __inout_bcount(size)
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#define __in_opt __in __exceptthat __maybenull
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#define __in_z_opt __in_opt __pre __nullterminated
+#define __in_ecount_z_opt(size) __in_ecount_opt(size) __pre __nullterminated
+#define __in_bcount_z_opt(size) __in_bcount_opt(size) __pre __nullterminated
+#define __in_nz_opt __in_opt
+#define __in_ecount_nz_opt(size) __in_ecount_opt(size)
+#define __in_bcount_nz_opt(size) __in_bcount_opt(size)
+#define __out_opt __out __exceptthat __maybenull
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#define __out_ecount_z_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_z_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __out_ecount_part_z_opt(size,length) __out_ecount_part_opt(size,length) __post __nullterminated
+#define __out_bcount_part_z_opt(size,length) __out_bcount_part_opt(size,length) __post __nullterminated
+#define __out_ecount_full_z_opt(size) __out_ecount_full_opt(size) __post __nullterminated
+#define __out_bcount_full_z_opt(size) __out_bcount_full_opt(size) __post __nullterminated
+#define __out_ecount_nz_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_nz_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __inout_opt __inout __exceptthat __maybenull
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#define __inout_z_opt __inout_opt __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z_opt(size) __inout_bcount_opt(size)
+#define __inout_nz_opt __inout_opt
+#define __inout_ecount_nz_opt(size) __inout_ecount_opt(size)
+#define __inout_bcount_nz_opt(size) __inout_bcount_opt(size)
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#define __deref_out_z __post __deref __valid __refparam __post __deref __nullterminated
+#define __deref_out_ecount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_bcount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_nz __deref_out
+#define __deref_out_ecount_nz(size) __deref_out_ecount(size)
+#define __deref_out_bcount_nz(size) __deref_out_ecount(size)
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz __deref_inout
+#define __deref_inout_ecount_nz(size) __deref_inout_ecount(size)
+#define __deref_inout_bcount_nz(size) __deref_inout_ecount(size)
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_z_opt __post __deref __valid __refparam __execeptthat __maybenull __post __deref __nullterminated
+#define __deref_out_ecount_z_opt(size) __deref_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_out_bcount_z_opt(size) __deref_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_out_nz_opt __deref_out_opt
+#define __deref_out_ecount_nz_opt(size) __deref_out_ecount_opt(size)
+#define __deref_out_bcount_nz_opt(size) __deref_out_bcount_opt(size)
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_z_opt __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z_opt(size) __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z_opt(size) __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz_opt __deref_inout_opt
+#define __deref_inout_ecount_nz_opt(size) __deref_inout_ecount_opt(size)
+#define __deref_inout_bcount_nz_opt(size) __deref_inout_bcount_opt(size)
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#define __deref_opt_out_z __deref_opt_out __post __deref __nullterminated
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_z __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z(size) __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z(size) __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz __deref_opt_inout
+#define __deref_opt_inout_ecount_nz(size) __deref_opt_inout_ecount(size)
+#define __deref_opt_inout_bcount_nz(size) __deref_opt_inout_bcount(size)
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_z_opt __post __deref __valid __refparam __exceptthat __maybenull __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull __post __deref __nullterminated
+#define __deref_opt_out_ecount_z_opt(size) __deref_opt_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_bcount_z_opt(size) __deref_opt_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_nz_opt __deref_opt_out_opt
+#define __deref_opt_out_ecount_nz_opt(size) __deref_opt_out_ecount_opt(size)
+#define __deref_opt_out_bcount_nz_opt(size) __deref_opt_out_bcount_opt(size)
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_z_opt __deref_opt_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z_opt(size) __deref_opt_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z_opt(size) __deref_opt_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz_opt __deref_opt_inout_opt
+#define __deref_opt_inout_ecount_nz_opt(size) __deref_opt_inout_ecount_opt(size)
+#define __deref_opt_inout_bcount_nz_opt(size) __deref_opt_inout_bcount_opt(size)
+
+/*
+-------------------------------------------------------------------------------
+Advanced Annotation Definitions
+
+Any of these may be used to directly annotate functions, and may be used in
+combination with each other or with regular buffer macros. For an explanation
+of each annotation, see the advanced annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __success(expr) __inner_success(expr)
+#define __nullterminated __readableTo(sentinel(0))
+#define __nullnullterminated
+#define __reserved __pre __null
+#define __checkReturn __inner_checkReturn
+#define __typefix(ctype) __inner_typefix(ctype)
+#define __override __inner_override
+#define __callback __inner_callback
+#define __format_string
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+#ifndef __analysis_assume
+#ifdef _PREFAST_
+#define __analysis_assume(expr) __assume(expr)
+#else
+#define __analysis_assume(expr)
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
diff --git a/core/src/fxge/Microsoft SDK/include/specstrings.h b/core/src/fxge/Microsoft SDK/include/specstrings.h
new file mode 100644
index 0000000000..00cdd332ec
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/specstrings.h
@@ -0,0 +1,978 @@
+/***************************************************************\
+* *
+* SpecStrings.h - markers for documenting the semantics of APIs *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) Microsoft Corporation. All rights reserved. *
+* *
+\***************************************************************/
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Introduction
+//
+// SpecStrings.h provides a set of annotations to describe how a function uses its
+// parameters - the assumptions it makes about them, and the guarantees it makes
+// upon finishing.
+//
+// Annotations may be placed before either a function parameter's type or its return
+// type, and describe the function's behavior regarding the parameter or return value.
+// There are two classes of annotations: buffer annotations and advanced annotations.
+// Buffer annotations describe how functions use their pointer parameters, and
+// advanced annotations either describe complex/unusual buffer behavior, or provide
+// additional information about a parameter that is not otherwise expressible.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotations
+//
+// The most important annotations in SpecStrings.h provide a consistent way to annotate
+// buffer parameters or return values for a function. Each of these annotations describes
+// a single buffer (which could be a string, a fixed-length or variable-length array,
+// or just a pointer) that the function interacts with: where it is, how large it is,
+// how much is initialized, and what the function does with it.
+//
+// The appropriate macro for a given buffer can be constructed using the table below.
+// Just pick the appropriate values from each category, and combine them together
+// with a leading underscore. Some combinations of values do not make sense as buffer
+// annotations. Only meaningful annotations can be added to your code; for a list of
+// these, see the buffer annotation definitions section.
+//
+// Only a single buffer annotation should be used for each parameter.
+//
+// |------------|------------|---------|--------|----------|---------------|
+// | Level | Usage | Size | Output | Optional | Parameters |
+// |------------|------------|---------|--------|----------|---------------|
+// | <> | <> | <> | <> | <> | <> |
+// | _deref | _in | _ecount | _full | _opt | (size) |
+// | _deref_opt | _out | _bcount | _part | | (size,length) |
+// | | _inout | | | | |
+// | | | | | | |
+// |------------|------------|---------|--------|----------|---------------|
+//
+// Level: Describes the buffer pointer's level of indirection from the parameter or
+// return value 'p'.
+//
+// <> : p is the buffer pointer.
+// _deref : *p is the buffer pointer. p must not be NULL.
+// _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+// the annotation is ignored.
+//
+// Usage: Describes how the function uses the buffer.
+//
+// <> : The buffer is not accessed. If used on the return value or with _deref, the
+// function will provide the buffer, and it will be uninitialized at exit.
+// Otherwise, the caller must provide the buffer. This should only be used
+// for alloc and free functions.
+// _in : The function will only read from the buffer. The caller must provide the
+// buffer and initialize it.
+// _out : The function will only write to the buffer. If used on the return value or
+// with _deref, the function will provide the buffer and initialize it.
+// Otherwise, the caller must provide the buffer, and the function will
+// initialize it.
+// _inout : The function may freely read from and write to the buffer. The caller must
+// provide the buffer and initialize it. If used with _deref, the buffer may
+// be reallocated by the function.
+//
+// Size: Describes the total size of the buffer. This may be less than the space actually
+// allocated for the buffer, in which case it describes the accessible amount.
+//
+// <> : No buffer size is given. If the type specifies the buffer size (such as
+// with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+// element long. Must be used with _in, _out, or _inout.
+// _ecount : The buffer size is an explicit element count.
+// _bcount : The buffer size is an explicit byte count.
+//
+// Output: Describes how much of the buffer will be initialized by the function. For
+// _inout buffers, this also describes how much is initialized at entry. Omit this
+// category for _in buffers; they must be fully initialized by the caller.
+//
+// <> : The type specifies how much is initialized. For instance, a function initializing
+// an LPWSTR must NULL-terminate the string.
+// _full : The function initializes the entire buffer.
+// _part : The function initializes part of the buffer, and explicitly indicates how much.
+//
+// Optional: Describes if the buffer itself is optional.
+//
+// <> : The pointer to the buffer must not be NULL.
+// _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+//
+// Parameters: Gives explicit counts for the size and length of the buffer.
+//
+// <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+// (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+// (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+// and _bcount_part.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotation Examples
+//
+// LWSTDAPI_(BOOL) StrToIntExA(
+// LPCSTR pszString, // No annotation required, const implies __in.
+// DWORD dwFlags,
+// __out int *piRet // A pointer whose dereference will be filled in.
+// );
+//
+// void MyPaintingFunction(
+// __in HWND hwndControl, // An initialized read-only parameter.
+// __in_opt HDC hdcOptional, // An initialized read-only parameter that might be NULL.
+// __inout IPropertyStore *ppsStore // An initialized parameter that may be freely used
+// // and modified.
+// );
+//
+// LWSTDAPI_(BOOL) PathCompactPathExA(
+// __out_ecount(cchMax) LPSTR pszOut, // A string buffer with cch elements that will
+// // be NULL terminated on exit.
+// LPCSTR pszSrc, // No annotation required, const implies __in.
+// UINT cchMax,
+// DWORD dwFlags
+// );
+//
+// HRESULT SHLocalAllocBytes(
+// size_t cb,
+// __deref_bcount(cb) T **ppv // A pointer whose dereference will be set to an
+// // uninitialized buffer with cb bytes.
+// );
+//
+// __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+// entry and exit, and may be written to by this function.
+//
+// __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+// partially initialized by this function. The function indicates how much it
+// initialized by setting *countOut.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotations
+//
+// Advanced annotations describe behavior that is not expressible with the regular
+// buffer macros. These may be used either to annotate buffer parameters that involve
+// complex or conditional behavior, or to enrich existing annotations with additional
+// information.
+//
+// __success(expr) f :
+// <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+// all the function's guarantees (as given by other annotations) must hold. If <expr>
+// is false at exit, the caller should not expect any of the function's guarantees
+// to hold. If not used, the function must always satisfy its guarantees. Added
+// automatically to functions that indicate success in standard ways, such as by
+// returning an HRESULT.
+//
+// __out_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __out_bcount. If <expr> is false, this acts
+// like __out_ecount. This should only be used to annotate old APIs.
+//
+// __in_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __in_bcount. If <expr> is false, this acts
+// like __in_ecount. This should only be used to annotate old APIs.
+//
+// __nullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// NULL character or pointer. May be used on typedefs, which marks valid (properly
+// initialized) instances of that type as being NULL-terminated.
+//
+// __nullnullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// sequence of two NULL characters or pointers. May be used on typedefs, which marks
+// valid instances of that type as being double-NULL terminated.
+//
+// __reserved v :
+// Value v must be 0/NULL, reserved for future use.
+//
+// __checkReturn v :
+// Return value v must not be ignored by callers of this function.
+//
+// __typefix(ctype) v :
+// Value v should be treated as an instance of ctype, rather than its declared type.
+//
+// __override f :
+// Specify C#-style 'override' behaviour for overriding virtual methods.
+//
+// __callback f :
+// Function f can be used as a function pointer.
+//
+// __format_string p :
+// Pointer p is a string that contains % markers in the style of printf.
+//
+// __blocksOn(resource) f :
+// Function f blocks on the resource 'resource'.
+//
+// __fallthrough :
+// Annotates switch statement labels where fall-through is desired, to distinguish
+// from forgotten break statements.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotation Examples
+//
+// __success(return == TRUE) LWSTDAPI_(BOOL)
+// PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+// pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+//
+// typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+//
+// __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+// a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+//
+// -------------------------------------------------------------------------------
+
+// @@END_DDKSPLIT
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // #if _MSC_VER > 1000
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif // #ifdef __cplusplus
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Helper Macro Definitions
+//
+// These express behavior common to many of the high-level annotations.
+// DO NOT USE THESE IN YOUR CODE.
+// -------------------------------------------------------------------------------
+
+// The helper annotations are only understood by the compiler version used by various
+// defect detection tools. When the regular compiler is running, they are defined into
+// nothing, and do not affect the compiled code.
+#if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+
+ // In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ // Annotation Language. These __declspec("SAL_*") annotations are the
+ // primitives the compiler understands and all high-level SpecString MACROs
+ // will decompose into these primivates.
+
+ #define SPECSTRINGIZE( x ) #x
+
+ //
+ // __null p
+ // __notnull p
+ // __maybenull p
+ //
+ // Annotates a pointer p. States that pointer p is null. Commonly used
+ // in the negated form __notnull or the possibly null form __maybenull.
+ //
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ //
+ // __readonly l
+ // __notreadonly l
+ // __mabyereadonly l
+ //
+ // Annotates a location l. States that location l is not modified after
+ // this point. If the annotation is placed on the precondition state of
+ // a function, the restriction only applies until the postcondition state
+ // of the function. __maybereadonly states that the annotated location
+ // may be modified, whereas __notreadonly states that a location must be
+ // modified.
+ //
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ //
+ // __valid v
+ // __notvalid v
+ // __maybevalid v
+ //
+ // Annotates any value v. States that the value satisfies all properties of
+ // valid values of its type. For example, for a string buffer, valid means
+ // that the buffer pointer is either NULL or points to a NULL-terminated string.
+ //
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ //
+ // __readableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be read, extent describes
+ // how much of the buffer is readable. For a reader of the buffer, this is
+ // an explicit permission to read up to that amount, rather than a restriction to
+ // read only up to it.
+ //
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ //
+ // __elem_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size elements.
+ //
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size bytes.
+ //
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __writableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be modified, extent
+ // describes how much of the buffer is writable (usually the allocation
+ // size). For a writer of the buffer, this is an explicit permission to
+ // write up to that amount, rather than a restriction to write only up to it.
+ //
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ //
+ // __elem_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size elements.
+ //
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size bytes.
+ //
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __deref p
+ //
+ // Annotates a pointer p. The next annotation applies one dereference down
+ // in the type. If readableTo(p, size) then the next annotation applies to
+ // all elements *(p+i) for which i satisfies the size. If p is a pointer
+ // to a struct, the next annotation applies to all fields of the struct.
+ //
+ #define __deref __declspec("SAL_deref")
+
+ //
+ // __pre __next_annotation
+ //
+ // The next annotation applies in the precondition state
+ //
+ #define __pre __declspec("SAL_pre")
+
+ //
+ // __post __next_annotation
+ //
+ // The next annotation applies in the postcondition state
+ //
+ #define __post __declspec("SAL_post")
+
+ //
+ // __precond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the precondition state
+ // (currently not enabled)
+ //
+ #define __precond(expr) __pre
+
+ //
+ // __postcond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the postcondition state
+ // (currently not enabled)
+ //
+ #define __postcond(expr) __post
+
+ //
+ // __exceptthat
+ //
+ // Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ // the except clause is to erase any P or notP annotations (explicit or
+ // implied) within Q at the same level of dereferencing that the except
+ // clause appears, and to replace it with maybeP.
+ //
+ // Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ // pointer may be null, and is otherwise valid, thus overriding
+ // the implicit notnull annotation implied by __valid on
+ // pointers.
+ //
+ // Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ // that p is not null (implied by valid), but the elements
+ // pointed to by p could be null, and are otherwise valid.
+ //
+ #define __exceptthat __declspec("SAL_except")
+
+ //
+ // _refparam
+ //
+ // Added to all out parameter macros to indicate that they are all reference
+ // parameters.
+ //
+ #define __refparam __deref __notreadonly
+
+ //
+ // __inner_*
+ //
+ // Helper macros that directly correspond to certain high-level annotations.
+ //
+ //
+
+ // Macros to classify the entrypoints and indicate their category.
+ //
+ //
+ // Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+ //
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ //
+ // Pre-defined data entry point categories include: Registry, File, Network.
+ //
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+
+// @@END_DDKSPLIT
+
+#ifndef __null
+ #define __null
+#endif
+#ifndef __notnull
+ #define __notnull
+#endif
+#ifndef __maybenull
+ #define __maybenull
+#endif
+#ifndef __readonly
+ #define __readonly
+#endif
+#ifndef __notreadonly
+ #define __notreadonly
+#endif
+#ifndef __maybereadonly
+ #define __maybereadonly
+#endif
+#ifndef __valid
+ #define __valid
+#endif
+#ifndef __notvalid
+ #define __notvalid
+#endif
+#ifndef __maybevalid
+ #define __maybevalid
+#endif
+#ifndef __readableTo
+ #define __readableTo(extent)
+#endif
+#ifndef __elem_readableTo
+ #define __elem_readableTo(size)
+#endif
+#ifndef __byte_readableTo
+ #define __byte_readableTo(size)
+#endif
+#ifndef __writableTo
+ #define __writableTo(size)
+#endif
+#ifndef __elem_writableTo
+ #define __elem_writableTo(size)
+#endif
+#ifndef __byte_writableTo
+ #define __byte_writableTo(size)
+#endif
+#ifndef __deref
+ #define __deref
+#endif
+#ifndef __pre
+ #define __pre
+#endif
+#ifndef __post
+ #define __post
+#endif
+#ifndef __precond
+ #define __precond(expr)
+#endif
+#ifndef __postcond
+ #define __postcond(expr)
+#endif
+#ifndef __exceptthat
+ #define __exceptthat
+#endif
+#ifndef __inner_success
+ #define __inner_success(expr)
+#endif
+#ifndef __inner_checkReturn
+ #define __inner_checkReturn
+#endif
+#ifndef __inner_typefix
+ #define __inner_typefix(ctype)
+#endif
+#ifndef __inner_override
+ #define __inner_override
+#endif
+#ifndef __inner_callback
+ #define __inner_callback
+#endif
+#ifndef __inner_blocksOn
+ #define __inner_blocksOn(resource)
+#endif
+#ifndef __inner_fallthrough_dec
+ #define __inner_fallthrough_dec
+#endif
+#ifndef __inner_fallthrough
+ #define __inner_fallthrough
+#endif
+#ifndef __refparam
+ #define __refparam
+#endif
+#ifndef __inner_control_entrypoint
+ #define __inner_control_entrypoint(category)
+#endif
+#ifndef __inner_data_entrypoint
+ #define __inner_data_entrypoint(category)
+#endif
+// @@BEGIN_DDKSPLIT
+#endif // #if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+// -------------------------------------------------------------------------------
+// Buffer Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, but only one should
+// be used for each parameter. To determine which annotation to use for a given
+// buffer, use the table in the buffer annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __ecount
+#define __ecount(size) __notnull __elem_writableTo(size)
+#endif
+#ifndef __bcount
+#define __bcount(size) __notnull __byte_writableTo(size)
+#endif
+#ifndef __in
+#define __in __pre __valid __pre __deref __readonly
+#endif
+#ifndef __in_ecount
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#endif
+#ifndef __in_bcount
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#endif
+#ifndef __out
+#define __out __ecount(1) __post __valid __refparam
+#endif
+#ifndef __out_ecount
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#endif
+#ifndef __out_bcount
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#endif
+#ifndef __out_ecount_part
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#endif
+#ifndef __out_bcount_part
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#endif
+#ifndef __out_ecount_full
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#endif
+#ifndef __out_bcount_full
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#endif
+#ifndef __inout
+#define __inout __pre __valid __post __valid __refparam
+#endif
+#ifndef __inout_ecount
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#endif
+#ifndef __inout_bcount
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#endif
+#ifndef __inout_ecount_part
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#endif
+#ifndef __inout_bcount_part
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#endif
+#ifndef __inout_ecount_full
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#endif
+#ifndef __inout_bcount_full
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#endif
+
+#ifndef __ecount_opt
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __bcount_opt
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_opt
+#define __in_opt __in __exceptthat __maybenull
+#endif
+#ifndef __in_ecount_opt
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_bcount_opt
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_opt
+#define __out_opt __out __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_opt
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_opt
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_part_opt
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_part_opt
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_full_opt
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_full_opt
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_opt
+#define __inout_opt __inout __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_opt
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_opt
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_part_opt
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_part_opt
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_full_opt
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_full_opt
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_ecount
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_bcount
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_in
+#define __deref_in __in __pre __deref __deref __readonly
+#endif
+#ifndef __deref_in_ecount
+#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size)
+#endif
+#ifndef __deref_in_bcount
+#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size)
+#endif
+#ifndef __deref_out
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_bcount
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount_part
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_out_bcount_part
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_out_ecount_full
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#endif
+#ifndef __deref_out_bcount_full
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#endif
+#ifndef __deref_inout
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#endif
+#ifndef __deref_inout_ecount
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_inout_bcount
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_inout_ecount_part
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_inout_bcount_part
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_inout_ecount_full
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#endif
+#ifndef __deref_inout_bcount_full
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#endif
+
+#ifndef __deref_ecount_opt
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_bcount_opt
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_opt
+#define __deref_in_opt __deref_in __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_ecount_opt
+#define __deref_in_ecount_opt(size) __deref_in_ecount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_bcount_opt
+#define __deref_in_bcount_opt(size) __deref_in_bcount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_opt
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_opt
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_opt
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_part_opt
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_part_opt
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_full_opt
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_full_opt
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_opt
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_opt
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_opt
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_part_opt
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_part_opt
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_full_opt
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_full_opt
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in
+#define __deref_opt_in __deref_in __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount
+#define __deref_opt_in_ecount(size) __deref_in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount
+#define __deref_opt_in_bcount(size) __deref_in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount_opt
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount_opt
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_opt
+#define __deref_opt_in_opt __deref_in_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount_opt
+#define __deref_opt_in_ecount_opt(size) __deref_in_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount_opt
+#define __deref_opt_in_bcount_opt(size) __deref_in_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_opt
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_opt
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_opt
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part_opt
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part_opt
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full_opt
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full_opt
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_opt
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_opt
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_opt
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part_opt
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part_opt
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full_opt
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full_opt
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+
+// @@BEGIN_DDKSPLIT
+// -------------------------------------------------------------------------------
+// Advanced Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, and may be used in
+// combination with each other or with regular buffer macros. For an explanation
+// of each annotation, see the advanced annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __out_awcount
+#define __out_awcount(expr,size) __pre __notnull \
+ __precond(expr) __byte_writableTo(size) \
+ __precond(!(expr)) __byte_writableTo((size)*2) \
+ __post __valid __refparam
+#endif
+#ifndef __in_awcount
+#define __in_awcount(expr,size) __pre __valid \
+ __pre __deref __readonly \
+ __precond(expr) __byte_readableTo(size) \
+ __precond(!(expr)) __elem_readableTo(size)
+#endif
+#ifndef __success
+#define __success(expr) __inner_success(expr)
+#endif
+#ifndef __nullterminated
+#define __nullterminated __readableTo(sentinel(0))
+#endif
+#ifndef __nullnullterminated
+#define __nullnullterminated
+#endif
+#ifndef __reserved
+#define __reserved __pre __null
+#endif
+#ifndef __checkReturn
+#define __checkReturn __inner_checkReturn
+#endif
+#ifndef __typefix
+#define __typefix(ctype) __inner_typefix(ctype)
+#endif
+#ifndef __override
+#define __override __inner_override
+#endif
+#ifndef __callback
+#define __callback __inner_callback
+#endif
+#ifndef __format_string
+#define __format_string
+#endif
+#ifndef __blocksOn
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#endif
+#ifndef __control_entrypoint
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#endif
+#ifndef __data_entrypoint
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+#endif
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+// -------------------------------------------------------------------------------
+// Deprecated Annotation Definitions
+//
+// These should be removed from existing code.
+// -------------------------------------------------------------------------------
+
+// #define __opt __exceptthat __maybenull
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/core/src/fxge/agg/agg23/agg_array.h b/core/src/fxge/agg/agg23/agg_array.h
new file mode 100644
index 0000000000..f5680d90fe
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_array.h
@@ -0,0 +1,510 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_ARRAY_INCLUDED
+#define AGG_ARRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T> class pod_array : public CFX_Object
+{
+public:
+ typedef T value_type;
+ ~pod_array()
+ {
+ FX_Free(m_array);
+ }
+ pod_array() : m_size(0), m_capacity(0), m_array(0) {}
+ pod_array(unsigned cap, unsigned extra_tail = 0);
+ pod_array(const pod_array<T>&);
+ const pod_array<T>& operator = (const pod_array<T>&);
+ void capacity(unsigned cap, unsigned extra_tail = 0);
+ unsigned capacity() const
+ {
+ return m_capacity;
+ }
+ void allocate(unsigned size, unsigned extra_tail = 0);
+ void resize(unsigned new_size);
+ void zero()
+ {
+ FXSYS_memset(m_array, 0, sizeof(T) * m_size);
+ }
+ void add(const T& v)
+ {
+ m_array[m_size++] = v;
+ }
+ void inc_size(unsigned size)
+ {
+ m_size += size;
+ }
+ unsigned size() const
+ {
+ return m_size;
+ }
+ unsigned byte_size() const
+ {
+ return m_size * sizeof(T);
+ }
+ const T& operator [] (unsigned i) const
+ {
+ return m_array[i];
+ }
+ T& operator [] (unsigned i)
+ {
+ return m_array[i];
+ }
+ const T& at(unsigned i) const
+ {
+ return m_array[i];
+ }
+ T& at(unsigned i)
+ {
+ return m_array[i];
+ }
+ T value_at(unsigned i) const
+ {
+ return m_array[i];
+ }
+ const T* data() const
+ {
+ return m_array;
+ }
+ T* data()
+ {
+ return m_array;
+ }
+ void remove_all()
+ {
+ m_size = 0;
+ }
+ void cut_at(unsigned num)
+ {
+ if(num < m_size) {
+ m_size = num;
+ }
+ }
+private:
+ unsigned m_size;
+ unsigned m_capacity;
+ T* m_array;
+};
+template<class T>
+void pod_array<T>::capacity(unsigned cap, unsigned extra_tail)
+{
+ m_size = 0;
+ unsigned full_cap = cap + extra_tail;
+ if(full_cap < cap) {
+ FX_Free(m_array);
+ m_array = 0;
+ m_capacity = 0;
+ } else if(full_cap > m_capacity) {
+ FX_Free(m_array);
+ m_array = 0;
+ m_capacity = 0;
+ m_array = FX_Alloc(T, full_cap);
+ if (m_array) {
+ m_capacity = full_cap;
+ }
+ }
+}
+template<class T>
+void pod_array<T>::allocate(unsigned size, unsigned extra_tail)
+{
+ capacity(size, extra_tail);
+ m_size = size;
+}
+template<class T>
+void pod_array<T>::resize(unsigned new_size)
+{
+ if(new_size > m_size) {
+ if(new_size > m_capacity) {
+ T* data = FX_Alloc(T, new_size);
+ FXSYS_memcpy(data, m_array, m_size * sizeof(T));
+ FX_Free(m_array);
+ m_array = data;
+ }
+ } else {
+ m_size = new_size;
+ }
+}
+template<class T> pod_array<T>::pod_array(unsigned cap, unsigned extra_tail) :
+ m_size(0), m_capacity(cap + extra_tail), m_array(FX_Alloc(T, m_capacity)) {}
+template<class T> pod_array<T>::pod_array(const pod_array<T>& v) :
+ m_size(v.m_size),
+ m_capacity(v.m_capacity),
+ m_array(v.m_capacity ? FX_Alloc(T, v.m_capacity) : 0)
+{
+ FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+}
+template<class T> const pod_array<T>&
+pod_array<T>::operator = (const pod_array<T>&v)
+{
+ allocate(v.m_size);
+ if(v.m_size) {
+ FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+ }
+ return *this;
+}
+template<class T, unsigned S = 6> class pod_deque : public CFX_Object
+{
+public:
+ enum block_scale_e {
+ block_shift = S,
+ block_size = 1 << block_shift,
+ block_mask = block_size - 1
+ };
+ typedef T value_type;
+ ~pod_deque();
+ pod_deque();
+ pod_deque(unsigned block_ptr_inc);
+ pod_deque(const pod_deque<T, S>& v);
+ const pod_deque<T, S>& operator = (const pod_deque<T, S>& v);
+ void remove_all()
+ {
+ m_size = 0;
+ }
+ void free_all()
+ {
+ free_tail(0);
+ }
+ void free_tail(unsigned size);
+ void add(const T& val);
+ void modify_last(const T& val);
+ void remove_last();
+ int allocate_continuous_block(unsigned num_elements);
+ void add_array(const T* ptr, unsigned num_elem)
+ {
+ while(num_elem--) {
+ add(*ptr++);
+ }
+ }
+ template<class DataAccessor> void add_data(DataAccessor& data)
+ {
+ while(data.size()) {
+ add(*data);
+ ++data;
+ }
+ }
+ void cut_at(unsigned size)
+ {
+ if(size < m_size) {
+ m_size = size;
+ }
+ }
+ unsigned size() const
+ {
+ return m_size;
+ }
+ const T& operator [] (unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T& operator [] (unsigned i)
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ const T& at(unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T& at(unsigned i)
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T value_at(unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ const T& curr(unsigned idx) const
+ {
+ return (*this)[idx];
+ }
+ T& curr(unsigned idx)
+ {
+ return (*this)[idx];
+ }
+ const T& prev(unsigned idx) const
+ {
+ return (*this)[(idx + m_size - 1) % m_size];
+ }
+ T& prev(unsigned idx)
+ {
+ return (*this)[(idx + m_size - 1) % m_size];
+ }
+ const T& next(unsigned idx) const
+ {
+ return (*this)[(idx + 1) % m_size];
+ }
+ T& next(unsigned idx)
+ {
+ return (*this)[(idx + 1) % m_size];
+ }
+ const T& last() const
+ {
+ return (*this)[m_size - 1];
+ }
+ T& last()
+ {
+ return (*this)[m_size - 1];
+ }
+ unsigned byte_size() const;
+ const T* block(unsigned nb) const
+ {
+ return m_blocks[nb];
+ }
+public:
+ void allocate_block(unsigned nb);
+ T* data_ptr();
+ unsigned m_size;
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ T** m_blocks;
+ unsigned m_block_ptr_inc;
+};
+template<class T, unsigned S> pod_deque<T, S>::~pod_deque()
+{
+ if(m_num_blocks) {
+ T** blk = m_blocks + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*blk);
+ --blk;
+ }
+ FX_Free(m_blocks);
+ }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::free_tail(unsigned size)
+{
+ if(size < m_size) {
+ unsigned nb = (size + block_mask) >> block_shift;
+ while(m_num_blocks > nb) {
+ FX_Free(m_blocks[--m_num_blocks]);
+ }
+ m_size = size;
+ }
+}
+template<class T, unsigned S> pod_deque<T, S>::pod_deque() :
+ m_size(0),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_block_ptr_inc(block_size)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(unsigned block_ptr_inc) :
+ m_size(0),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_block_ptr_inc(block_ptr_inc)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(const pod_deque<T, S>& v) :
+ m_size(v.m_size),
+ m_num_blocks(v.m_num_blocks),
+ m_max_blocks(v.m_max_blocks),
+ m_blocks(v.m_max_blocks ? FX_Alloc(T*, v.m_max_blocks) : 0),
+ m_block_ptr_inc(v.m_block_ptr_inc)
+{
+ unsigned i;
+ for(i = 0; i < v.m_num_blocks; ++i) {
+ m_blocks[i] = FX_Alloc(T, block_size);
+ FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+ }
+}
+template<class T, unsigned S>
+const pod_deque<T, S>& pod_deque<T, S>::operator = (const pod_deque<T, S>& v)
+{
+ unsigned i;
+ for(i = m_num_blocks; i < v.m_num_blocks; ++i) {
+ allocate_block(i);
+ }
+ for(i = 0; i < v.m_num_blocks; ++i) {
+ FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+ }
+ m_size = v.m_size;
+ return *this;
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::allocate_block(unsigned nb)
+{
+ if(nb >= m_max_blocks) {
+ T** new_blocks = FX_Alloc(T*, m_max_blocks + m_block_ptr_inc);
+ if(m_blocks) {
+ FXSYS_memcpy(new_blocks,
+ m_blocks,
+ m_num_blocks * sizeof(T*));
+ FX_Free(m_blocks);
+ }
+ m_blocks = new_blocks;
+ m_max_blocks += m_block_ptr_inc;
+ }
+ m_blocks[nb] = FX_Alloc(T, block_size);
+ m_num_blocks++;
+}
+template<class T, unsigned S>
+inline T* pod_deque<T, S>::data_ptr()
+{
+ unsigned nb = m_size >> block_shift;
+ if(nb >= m_num_blocks) {
+ allocate_block(nb);
+ }
+ return m_blocks[nb] + (m_size & block_mask);
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::add(const T& val)
+{
+ *data_ptr() = val;
+ ++m_size;
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::remove_last()
+{
+ if(m_size) {
+ --m_size;
+ }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::modify_last(const T& val)
+{
+ remove_last();
+ add(val);
+}
+template<class T, unsigned S>
+int pod_deque<T, S>::allocate_continuous_block(unsigned num_elements)
+{
+ if(num_elements < block_size) {
+ data_ptr();
+ unsigned rest = block_size - (m_size & block_mask);
+ unsigned index;
+ if(num_elements <= rest) {
+ index = m_size;
+ m_size += num_elements;
+ return index;
+ }
+ m_size += rest;
+ data_ptr();
+ index = m_size;
+ m_size += num_elements;
+ return index;
+ }
+ return -1;
+}
+template<class T, unsigned S>
+unsigned pod_deque<T, S>::byte_size() const
+{
+ return m_size * sizeof(T);
+}
+class pod_allocator : public CFX_Object
+{
+public:
+ void remove_all()
+ {
+ if(m_num_blocks) {
+ int8u** blk = m_blocks + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*blk);
+ --blk;
+ }
+ FX_Free(m_blocks);
+ }
+ m_num_blocks = 0;
+ m_max_blocks = 0;
+ m_blocks = 0;
+ m_buf_ptr = 0;
+ m_rest = 0;
+ }
+ ~pod_allocator()
+ {
+ remove_all();
+ }
+ pod_allocator(unsigned block_size, unsigned block_ptr_inc = 256 - 8) :
+ m_block_size(block_size),
+ m_block_ptr_inc(block_ptr_inc),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_buf_ptr(0),
+ m_rest(0)
+ {
+ }
+ int8u* allocate(unsigned size, unsigned alignment = 1)
+ {
+ if(size == 0) {
+ return 0;
+ }
+ if(size <= m_rest) {
+ int8u* ptr = m_buf_ptr;
+ if(alignment > 1) {
+ unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment;
+ size += align;
+ ptr += align;
+ if(size <= m_rest) {
+ m_rest -= size;
+ m_buf_ptr += size;
+ return ptr;
+ }
+ allocate_block(size);
+ return allocate(size - align, alignment);
+ }
+ m_rest -= size;
+ m_buf_ptr += size;
+ return ptr;
+ }
+ allocate_block(size + alignment - 1);
+ return allocate(size, alignment);
+ }
+private:
+ void allocate_block(unsigned size)
+ {
+ if(size < m_block_size) {
+ size = m_block_size;
+ }
+ if(m_num_blocks >= m_max_blocks) {
+ int8u** new_blocks = FX_Alloc(int8u*, m_max_blocks + m_block_ptr_inc);
+ if(m_blocks) {
+ FXSYS_memcpy(new_blocks,
+ m_blocks,
+ m_num_blocks * sizeof(int8u*));
+ FX_Free(m_blocks);
+ }
+ m_blocks = new_blocks;
+ m_max_blocks += m_block_ptr_inc;
+ }
+ m_blocks[m_num_blocks] = m_buf_ptr = FX_Alloc(int8u, size);
+ m_num_blocks++;
+ m_rest = size;
+ }
+ unsigned m_block_size;
+ unsigned m_block_ptr_inc;
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ int8u** m_blocks;
+ int8u* m_buf_ptr;
+ unsigned m_rest;
+};
+enum quick_sort_threshold_e {
+ quick_sort_threshold = 9
+};
+template<class T> inline void swap_elements(T& a, T& b)
+{
+ T temp = a;
+ a = b;
+ b = temp;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_basics.h b/core/src/fxge/agg/agg23/agg_basics.h
new file mode 100644
index 0000000000..a78fed8c23
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_basics.h
@@ -0,0 +1,282 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_BASICS_INCLUDED
+#define AGG_BASICS_INCLUDED
+#ifndef AGG_INT8
+#define AGG_INT8 signed char
+#endif
+#ifndef AGG_INT8U
+#define AGG_INT8U unsigned char
+#endif
+#ifndef AGG_INT16
+#define AGG_INT16 short
+#endif
+#ifndef AGG_INT16U
+#define AGG_INT16U unsigned short
+#endif
+#ifndef AGG_INT32
+#define AGG_INT32 int
+#endif
+#ifndef AGG_INT32U
+#define AGG_INT32U unsigned
+#endif
+#ifndef AGG_INT64
+#define AGG_INT64 signed long long
+#endif
+#ifndef AGG_INT64U
+#define AGG_INT64U unsigned long long
+#endif
+#define AGG_INLINE inline
+namespace agg
+{
+typedef AGG_INT8 int8;
+typedef AGG_INT8U int8u;
+typedef AGG_INT16 int16;
+typedef AGG_INT16U int16u;
+typedef AGG_INT32 int32;
+typedef AGG_INT32U int32u;
+typedef AGG_INT64 int64;
+typedef AGG_INT64U int64u;
+typedef unsigned char cover_type;
+enum cover_scale_e {
+ cover_shift = 8,
+ cover_size = 1 << cover_shift,
+ cover_mask = cover_size - 1,
+ cover_none = 0,
+ cover_full = cover_mask
+};
+template<class T> struct rect_base : public CFX_Object {
+ typedef rect_base<T> self_type;
+ T x1;
+ T y1;
+ T x2;
+ T y2;
+ rect_base() {}
+ rect_base(T x1_, T y1_, T x2_, T y2_) :
+ x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
+ const self_type& normalize()
+ {
+ T t;
+ if(x1 > x2) {
+ t = x1;
+ x1 = x2;
+ x2 = t;
+ }
+ if(y1 > y2) {
+ t = y1;
+ y1 = y2;
+ y2 = t;
+ }
+ return *this;
+ }
+ bool clip(const self_type& r)
+ {
+ if(x2 > r.x2) {
+ x2 = r.x2;
+ }
+ if(y2 > r.y2) {
+ y2 = r.y2;
+ }
+ if(x1 < r.x1) {
+ x1 = r.x1;
+ }
+ if(y1 < r.y1) {
+ y1 = r.y1;
+ }
+ return x1 <= x2 && y1 <= y2;
+ }
+ bool is_valid() const
+ {
+ return x1 <= x2 && y1 <= y2;
+ }
+};
+template<class Rect>
+inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
+{
+ Rect r = r1;
+ if(r.x2 > r2.x2) {
+ r.x2 = r2.x2;
+ }
+ if(r.y2 > r2.y2) {
+ r.y2 = r2.y2;
+ }
+ if(r.x1 < r2.x1) {
+ r.x1 = r2.x1;
+ }
+ if(r.y1 < r2.y1) {
+ r.y1 = r2.y1;
+ }
+ return r;
+}
+template<class Rect>
+inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
+{
+ Rect r = r1;
+ if(r.x2 < r2.x2) {
+ r.x2 = r2.x2;
+ }
+ if(r.y2 < r2.y2) {
+ r.y2 = r2.y2;
+ }
+ if(r.x1 > r2.x1) {
+ r.x1 = r2.x1;
+ }
+ if(r.y1 > r2.y1) {
+ r.y1 = r2.y1;
+ }
+ return r;
+}
+typedef rect_base<int> rect;
+typedef rect_base<FX_FLOAT> rect_d;
+enum path_commands_e {
+ path_cmd_stop = 0,
+ path_cmd_move_to = 1,
+ path_cmd_line_to = 2,
+ path_cmd_curve3 = 3,
+ path_cmd_curve4 = 4,
+ path_cmd_curveN = 5,
+ path_cmd_catrom = 6,
+ path_cmd_ubspline = 7,
+ path_cmd_end_poly = 0x0F,
+ path_cmd_mask = 0x0F
+};
+enum path_flags_e {
+ path_flags_none = 0,
+ path_flags_ccw = 0x10,
+ path_flags_cw = 0x20,
+ path_flags_close = 0x40,
+ path_flags_jr = 0x80,
+ path_flags_mask = 0xF0
+};
+inline bool is_vertex(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c >= path_cmd_move_to && c < path_cmd_end_poly;
+}
+inline bool is_drawing(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c >= path_cmd_line_to && c < path_cmd_end_poly;
+}
+inline bool is_stop(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_stop;
+}
+inline bool is_move_to(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_move_to;
+}
+inline bool is_line_to(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_line_to;
+}
+inline bool is_curve(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve3 || c == path_cmd_curve4;
+}
+inline bool is_curve3(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve3;
+}
+inline bool is_curve4(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve4;
+}
+inline bool is_end_poly(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_cmd_mask) == path_cmd_end_poly;
+}
+inline bool is_close(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & ~(path_flags_cw | path_flags_ccw)) ==
+ (path_cmd_end_poly | path_flags_close);
+}
+inline bool is_next_poly(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return is_stop(c) || is_move_to(c) || is_end_poly(c);
+}
+inline bool is_cw(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_cw) != 0;
+}
+inline bool is_ccw(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_ccw) != 0;
+}
+inline bool is_oriented(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & (path_flags_cw | path_flags_ccw)) != 0;
+}
+inline bool is_closed(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_close) != 0;
+}
+inline unsigned get_close_flag(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & path_flags_close;
+}
+inline unsigned clear_orientation(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & ~(path_flags_cw | path_flags_ccw);
+}
+inline unsigned get_orientation(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & (path_flags_cw | path_flags_ccw);
+}
+inline unsigned set_orientation(unsigned c, unsigned o)
+{
+ c &= ~path_flags_jr;
+ return clear_orientation(c) | o;
+}
+struct point_type : public CFX_Object {
+ FX_FLOAT x, y;
+ unsigned flag;
+ point_type() {}
+ point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}
+};
+struct point_type_flag : public point_type {
+ unsigned flag;
+ point_type_flag()
+ {
+ flag = 0;
+ }
+ point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}
+};
+struct vertex_type : public CFX_Object {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ vertex_type() {}
+ vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+ x(x_), y(y_), cmd(cmd_) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
new file mode 100644
index 0000000000..cfc4c91f60
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
@@ -0,0 +1,125 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Liang-Barsky clipping
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED
+#define AGG_CLIP_LIANG_BARSKY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T>
+inline unsigned clipping_flags(T x, T y, const rect_base<T>& clip_box)
+{
+ return (x > clip_box.x2) |
+ ((y > clip_box.y2) << 1) |
+ ((x < clip_box.x1) << 2) |
+ ((y < clip_box.y1) << 3);
+}
+template<class T>
+inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2,
+ const rect_base<T>& clip_box,
+ T* x, T* y)
+{
+ const FX_FLOAT nearzero = 1e-30f;
+ FX_FLOAT deltax = (FX_FLOAT)(x2 - x1);
+ FX_FLOAT deltay = (FX_FLOAT)(y2 - y1);
+ unsigned np = 0;
+ if(deltax == 0) {
+ deltax = (x1 > clip_box.x1) ? -nearzero : nearzero;
+ }
+ FX_FLOAT xin, xout;
+ if(deltax > 0) {
+ xin = (FX_FLOAT)clip_box.x1;
+ xout = (FX_FLOAT)clip_box.x2;
+ } else {
+ xin = (FX_FLOAT)clip_box.x2;
+ xout = (FX_FLOAT)clip_box.x1;
+ }
+ FX_FLOAT tinx = FXSYS_Div(xin - x1, deltax);
+ if(deltay == 0) {
+ deltay = (y1 > clip_box.y1) ? -nearzero : nearzero;
+ }
+ FX_FLOAT yin, yout;
+ if(deltay > 0) {
+ yin = (FX_FLOAT)clip_box.y1;
+ yout = (FX_FLOAT)clip_box.y2;
+ } else {
+ yin = (FX_FLOAT)clip_box.y2;
+ yout = (FX_FLOAT)clip_box.y1;
+ }
+ FX_FLOAT tiny = FXSYS_Div(yin - y1, deltay);
+ FX_FLOAT tin1, tin2;
+ if (tinx < tiny) {
+ tin1 = tinx;
+ tin2 = tiny;
+ } else {
+ tin1 = tiny;
+ tin2 = tinx;
+ }
+ if(tin1 <= 1.0f) {
+ if(0 < tin1) {
+ *x++ = (T)xin;
+ *y++ = (T)yin;
+ ++np;
+ }
+ if(tin2 <= 1.0f) {
+ FX_FLOAT toutx = FXSYS_Div(xout - x1, deltax);
+ FX_FLOAT touty = FXSYS_Div(yout - y1, deltay);
+ FX_FLOAT tout1 = (toutx < touty) ? toutx : touty;
+ if(tin2 > 0 || tout1 > 0) {
+ if(tin2 <= tout1) {
+ if(tin2 > 0) {
+ if(tinx > tiny) {
+ *x++ = (T)xin;
+ *y++ = (T)(y1 + FXSYS_Mul(deltay, tinx));
+ } else {
+ *x++ = (T)(x1 + FXSYS_Mul(deltax, tiny));
+ *y++ = (T)yin;
+ }
+ ++np;
+ }
+ if(tout1 < 1.0f) {
+ if(toutx < touty) {
+ *x++ = (T)xout;
+ *y++ = (T)(y1 + FXSYS_Mul(deltay, toutx));
+ } else {
+ *x++ = (T)(x1 + FXSYS_Mul(deltax, touty));
+ *y++ = (T)yout;
+ }
+ } else {
+ *x++ = x2;
+ *y++ = y2;
+ }
+ ++np;
+ } else {
+ if(tinx > tiny) {
+ *x++ = (T)xin;
+ *y++ = (T)yout;
+ } else {
+ *x++ = (T)xout;
+ *y++ = (T)yin;
+ }
+ ++np;
+ }
+ }
+ }
+ }
+ return np;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_color_gray.h b/core/src/fxge/agg/agg23/agg_color_gray.h
new file mode 100644
index 0000000000..5db7bcaf28
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_color_gray.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// color types gray8, gray16
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_COLOR_GRAY_INCLUDED
+#define AGG_COLOR_GRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct gray8 {
+ typedef int8u value_type;
+ typedef int32u calc_type;
+ typedef int32 long_type;
+ enum base_scale_e {
+ base_shift = 8,
+ base_size = 1 << base_shift,
+ base_mask = base_size - 1
+ };
+ typedef gray8 self_type;
+ value_type v;
+ value_type a;
+ gray8() {}
+ gray8(unsigned v_, unsigned a_ = base_mask) :
+ v(int8u(v_)), a(int8u(a_)) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
new file mode 100644
index 0000000000..1cf817a1c7
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
@@ -0,0 +1,138 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct null_markers : public CFX_Object {
+ void remove_all() {}
+ void add_vertex(FX_FLOAT, FX_FLOAT, unsigned) {}
+ void prepare_src() {}
+ void rewind(unsigned) {}
+ unsigned vertex(FX_FLOAT*, FX_FLOAT*)
+ {
+ return path_cmd_stop;
+ }
+};
+template<class VertexSource,
+ class Generator,
+ class Markers = null_markers> class conv_adaptor_vcgen : public CFX_Object
+{
+ enum status {
+ initial,
+ accumulate,
+ generate
+ };
+public:
+ conv_adaptor_vcgen(VertexSource& source) :
+ m_source(&source),
+ m_status(initial)
+ {}
+ void set_source(VertexSource& source)
+ {
+ m_source = &source;
+ }
+ Generator& generator()
+ {
+ return m_generator;
+ }
+ const Generator& generator() const
+ {
+ return m_generator;
+ }
+ Markers& markers()
+ {
+ return m_markers;
+ }
+ const Markers& markers() const
+ {
+ return m_markers;
+ }
+ void rewind(unsigned path_id)
+ {
+ m_source->rewind(path_id);
+ m_status = initial;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ conv_adaptor_vcgen(const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+ const conv_adaptor_vcgen<VertexSource, Generator, Markers>&
+ operator = (const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+ VertexSource* m_source;
+ Generator m_generator;
+ Markers m_markers;
+ status m_status;
+ unsigned m_last_cmd;
+ FX_FLOAT m_start_x;
+ FX_FLOAT m_start_y;
+};
+template<class VertexSource, class Generator, class Markers>
+unsigned conv_adaptor_vcgen<VertexSource, Generator, Markers>::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_stop;
+ bool done = false;
+ while(!done) {
+ switch(m_status) {
+ case initial:
+ m_markers.remove_all();
+ m_last_cmd = m_source->vertex(&m_start_x, &m_start_y);
+ m_status = accumulate;
+ case accumulate:
+ if(is_stop(m_last_cmd)) {
+ return path_cmd_stop;
+ }
+ m_generator.remove_all();
+ m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+ m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+ for(;;) {
+ cmd = m_source->vertex(x, y);
+ if(is_vertex(cmd)) {
+ m_last_cmd = cmd;
+ if(is_move_to(cmd)) {
+ m_start_x = *x;
+ m_start_y = *y;
+ break;
+ }
+ m_generator.add_vertex(*x, *y, cmd);
+ m_markers.add_vertex(*x, *y, path_cmd_line_to);
+ } else {
+ if(is_stop(cmd)) {
+ m_last_cmd = path_cmd_stop;
+ break;
+ }
+ if(is_end_poly(cmd)) {
+ m_generator.add_vertex(*x, *y, cmd);
+ break;
+ }
+ }
+ }
+ m_generator.rewind(0);
+ m_status = generate;
+ case generate:
+ cmd = m_generator.vertex(x, y);
+ if(is_stop(cmd)) {
+ m_status = accumulate;
+ break;
+ }
+ done = true;
+ break;
+ }
+ }
+ return cmd;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_dash.h b/core/src/fxge/agg/agg23/agg_conv_dash.h
new file mode 100644
index 0000000000..63b2019dde
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_dash.h
@@ -0,0 +1,61 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_dash
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_DASH_INCLUDED
+#define AGG_CONV_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_dash.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_dash : public conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> {
+ typedef Markers marker_type;
+ typedef conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> base_type;
+ conv_dash(VertexSource& vs) :
+ conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers>(vs)
+ {
+ }
+ void remove_all_dashes()
+ {
+ base_type::generator().remove_all_dashes();
+ }
+ void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+ {
+ base_type::generator().add_dash(dash_len, gap_len);
+ }
+ void dash_start(FX_FLOAT ds)
+ {
+ base_type::generator().dash_start(ds);
+ }
+ void shorten(FX_FLOAT s)
+ {
+ base_type::generator().shorten(s);
+ }
+ double shorten() const
+ {
+ return base_type::generator().shorten();
+ }
+private:
+ conv_dash(const conv_dash<VertexSource, Markers>&);
+ const conv_dash<VertexSource, Markers>&
+ operator = (const conv_dash<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_stroke.h b/core/src/fxge/agg/agg23/agg_conv_stroke.h
new file mode 100644
index 0000000000..5a36bd73bb
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_stroke.h
@@ -0,0 +1,110 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_stroke
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_STROKE_INCLUDED
+#define AGG_CONV_STROKE_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_stroke.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_stroke :
+ public conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> {
+ typedef Markers marker_type;
+ typedef conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> base_type;
+ conv_stroke(VertexSource& vs) :
+ conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers>(vs)
+ {
+ }
+ void line_cap(line_cap_e lc)
+ {
+ base_type::generator().line_cap(lc);
+ }
+ void line_join(line_join_e lj)
+ {
+ base_type::generator().line_join(lj);
+ }
+ void inner_join(inner_join_e ij)
+ {
+ base_type::generator().inner_join(ij);
+ }
+ line_cap_e line_cap() const
+ {
+ return base_type::generator().line_cap();
+ }
+ line_join_e line_join() const
+ {
+ return base_type::generator().line_join();
+ }
+ inner_join_e inner_join() const
+ {
+ return base_type::generator().inner_join();
+ }
+ void width(FX_FLOAT w)
+ {
+ base_type::generator().width(w);
+ }
+ void miter_limit(FX_FLOAT ml)
+ {
+ base_type::generator().miter_limit(ml);
+ }
+ void miter_limit_theta(FX_FLOAT t)
+ {
+ base_type::generator().miter_limit_theta(t);
+ }
+ void inner_miter_limit(FX_FLOAT ml)
+ {
+ base_type::generator().inner_miter_limit(ml);
+ }
+ void approximation_scale(FX_FLOAT as)
+ {
+ base_type::generator().approximation_scale(as);
+ }
+ FX_FLOAT width() const
+ {
+ return base_type::generator().width();
+ }
+ FX_FLOAT miter_limit() const
+ {
+ return base_type::generator().miter_limit();
+ }
+ FX_FLOAT inner_miter_limit() const
+ {
+ return base_type::generator().inner_miter_limit();
+ }
+ FX_FLOAT approximation_scale() const
+ {
+ return base_type::generator().approximation_scale();
+ }
+ void shorten(FX_FLOAT s)
+ {
+ base_type::generator().shorten(s);
+ }
+ FX_FLOAT shorten() const
+ {
+ return base_type::generator().shorten();
+ }
+private:
+ conv_stroke(const conv_stroke<VertexSource, Markers>&);
+ const conv_stroke<VertexSource, Markers>&
+ operator = (const conv_stroke<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_curves.h b/core/src/fxge/agg/agg23/agg_curves.h
new file mode 100644
index 0000000000..5719cbf508
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_curves.h
@@ -0,0 +1,191 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CURVES_INCLUDED
+#define AGG_CURVES_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+struct curve4_points : public CFX_Object {
+ FX_FLOAT cp[8];
+ curve4_points() {}
+ curve4_points(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ cp[0] = x1;
+ cp[1] = y1;
+ cp[2] = x2;
+ cp[3] = y2;
+ cp[4] = x3;
+ cp[5] = y3;
+ cp[6] = x4;
+ cp[7] = y4;
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ cp[0] = x1;
+ cp[1] = y1;
+ cp[2] = x2;
+ cp[3] = y2;
+ cp[4] = x3;
+ cp[5] = y3;
+ cp[6] = x4;
+ cp[7] = y4;
+ }
+ FX_FLOAT operator [] (unsigned i) const
+ {
+ return cp[i];
+ }
+ FX_FLOAT& operator [] (unsigned i)
+ {
+ return cp[i];
+ }
+};
+class curve4_div : public CFX_Object
+{
+public:
+ curve4_div() :
+ m_cusp_limit(0),
+ m_count(0)
+ {}
+ curve4_div(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4) :
+ m_cusp_limit(0),
+ m_count(0)
+ {
+ init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ curve4_div(const curve4_points& cp) :
+ m_count(0)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void reset()
+ {
+ m_points.remove_all();
+ m_count = 0;
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4);
+ void init(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void rewind(unsigned)
+ {
+ m_count = 0;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ if(m_count >= m_points.size()) {
+ return path_cmd_stop;
+ }
+ const point_type& p = m_points[m_count++];
+ *x = p.x;
+ *y = p.y;
+ return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+ }
+ unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+ {
+ if(m_count >= m_points.size()) {
+ return path_cmd_stop;
+ }
+ const point_type& p = m_points[m_count++];
+ *x = p.x;
+ *y = p.y;
+ flag = p.flag;
+ return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+ }
+ int count()
+ {
+ return m_points.size();
+ }
+private:
+ void bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4);
+ void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4,
+ unsigned level);
+ FX_FLOAT m_distance_tolerance_square;
+ FX_FLOAT m_distance_tolerance_manhattan;
+ FX_FLOAT m_cusp_limit;
+ unsigned m_count;
+ pod_deque<point_type> m_points;
+};
+class curve4 : public CFX_Object
+{
+public:
+ curve4() {}
+ curve4(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ curve4(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void reset()
+ {
+ m_curve_div.reset();
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ void init(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void rewind(unsigned path_id)
+ {
+ m_curve_div.rewind(path_id);
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ return m_curve_div.vertex(x, y);
+ }
+ unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+ {
+ return m_curve_div.vertex_flag(x, y, flag);
+ }
+ int count()
+ {
+ return m_curve_div.count();
+ }
+private:
+ curve4_div m_curve_div;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math.h b/core/src/fxge/agg/agg23/agg_math.h
new file mode 100644
index 0000000000..31e0daf3bb
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math.h
@@ -0,0 +1,63 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+// Bessel function (besj) was adapted for use in AGG library by Andy Wilk
+// Contact: castor.vulgaris@gmail.com
+//----------------------------------------------------------------------------
+#ifndef AGG_MATH_INCLUDED
+#define AGG_MATH_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+const FX_FLOAT intersection_epsilon = 1.0e-30f;
+AGG_INLINE FX_FLOAT calc_point_location(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x, FX_FLOAT y)
+{
+ return FXSYS_Mul(x - x2, y2 - y1) - FXSYS_Mul(y - y2, x2 - x1);
+}
+AGG_INLINE FX_FLOAT calc_distance(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+ FX_FLOAT dx = x2 - x1;
+ FX_FLOAT dy = y2 - y1;
+ return FXSYS_sqrt2(dx, dy);
+}
+AGG_INLINE FX_FLOAT calc_line_point_distance(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x, FX_FLOAT y)
+{
+ FX_FLOAT dx = x2 - x1;
+ FX_FLOAT dy = y2 - y1;
+ FX_FLOAT d = FXSYS_sqrt2(dx, dy);
+ if(d < intersection_epsilon) {
+ return calc_distance(x1, y1, x, y);
+ }
+ return FXSYS_MulDiv(x - x2, dy, d) - FXSYS_MulDiv(y - y2, dx, d);
+}
+AGG_INLINE bool calc_intersection(FX_FLOAT ax, FX_FLOAT ay, FX_FLOAT bx, FX_FLOAT by,
+ FX_FLOAT cx, FX_FLOAT cy, FX_FLOAT dx, FX_FLOAT dy,
+ FX_FLOAT* x, FX_FLOAT* y)
+{
+ FX_FLOAT num = FXSYS_Mul(ay - cy, dx - cx) - FXSYS_Mul(ax - cx, dy - cy);
+ FX_FLOAT den = FXSYS_Mul(bx - ax, dy - cy) - FXSYS_Mul(by - ay, dx - cx);
+ if (FXSYS_fabs(den) < intersection_epsilon) {
+ return false;
+ }
+ *x = ax + FXSYS_MulDiv(bx - ax, num, den);
+ *y = ay + FXSYS_MulDiv(by - ay, num, den);
+ return true;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math_stroke.h b/core/src/fxge/agg/agg23/agg_math_stroke.h
new file mode 100644
index 0000000000..620d675312
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math_stroke.h
@@ -0,0 +1,272 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke math
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_STROKE_MATH_INCLUDED
+#define AGG_STROKE_MATH_INCLUDED
+#include "agg_math.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+enum line_cap_e {
+ butt_cap,
+ square_cap,
+ round_cap
+};
+enum line_join_e {
+ miter_join = 0,
+ miter_join_revert = 1,
+ miter_join_round = 4,
+ round_join = 2,
+ bevel_join = 3
+};
+enum inner_join_e {
+ inner_bevel,
+ inner_miter,
+ inner_jag,
+ inner_round
+};
+const FX_FLOAT stroke_theta = 1.0f / 1000.0f;
+template<class VertexConsumer>
+void stroke_calc_arc(VertexConsumer& out_vertices,
+ FX_FLOAT x, FX_FLOAT y,
+ FX_FLOAT dx1, FX_FLOAT dy1,
+ FX_FLOAT dx2, FX_FLOAT dy2,
+ FX_FLOAT width,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT a1 = FXSYS_atan2(dy1, dx1);
+ FX_FLOAT a2 = FXSYS_atan2(dy2, dx2);
+ FX_FLOAT da = a1 - a2;
+ bool ccw = da > 0 && da < FX_PI;
+ if(width < 0) {
+ width = -width;
+ }
+ da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+ out_vertices.add(coord_type(x + dx1, y + dy1));
+ if(!ccw) {
+ if(a1 > a2) {
+ a2 += 2 * FX_PI;
+ }
+ a2 -= da / 4;
+ a1 += da;
+ while(a1 < a2) {
+ out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 += da;
+ }
+ } else {
+ if(a1 < a2) {
+ a2 -= 2 * FX_PI;
+ }
+ a2 += da / 4;
+ a1 -= da;
+ while(a1 > a2) {
+ out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 -= da;
+ }
+ }
+ out_vertices.add(coord_type(x + dx2, y + dy2));
+}
+template<class VertexConsumer>
+void stroke_calc_miter(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ const vertex_dist& v2,
+ FX_FLOAT dx1, FX_FLOAT dy1,
+ FX_FLOAT dx2, FX_FLOAT dy2,
+ FX_FLOAT width,
+ line_join_e line_join,
+ FX_FLOAT miter_limit,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT xi = v1.x;
+ FX_FLOAT yi = v1.y;
+ bool miter_limit_exceeded = true;
+ if(calc_intersection(v0.x + dx1, v0.y - dy1,
+ v1.x + dx1, v1.y - dy1,
+ v1.x + dx2, v1.y - dy2,
+ v2.x + dx2, v2.y - dy2,
+ &xi, &yi)) {
+ FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi);
+ FX_FLOAT lim = FXSYS_Mul(width, miter_limit);
+ if(d1 <= lim) {
+ out_vertices.add(coord_type(xi, yi));
+ miter_limit_exceeded = false;
+ }
+ } else {
+ FX_FLOAT x2 = v1.x + dx1;
+ FX_FLOAT y2 = v1.y - dy1;
+ if((FXSYS_Mul(x2 - v0.x, dy1) - FXSYS_Mul(v0.y - y2, dx1) < 0) !=
+ (FXSYS_Mul(x2 - v2.x, dy1) - FXSYS_Mul(v2.y - y2, dx1) < 0)) {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ miter_limit_exceeded = false;
+ }
+ }
+ if(miter_limit_exceeded) {
+ switch(line_join) {
+ case miter_join_revert:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ case miter_join_round:
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+ width, approximation_scale);
+ break;
+ default:
+ out_vertices.add(coord_type(v1.x + dx1 + FXSYS_Mul(dy1, miter_limit),
+ v1.y - dy1 + FXSYS_Mul(dx1, miter_limit)));
+ out_vertices.add(coord_type(v1.x + dx2 - FXSYS_Mul(dy2, miter_limit),
+ v1.y - dy2 - FXSYS_Mul(dx2, miter_limit)));
+ break;
+ }
+ }
+}
+template<class VertexConsumer>
+void stroke_calc_cap(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ FX_FLOAT len,
+ line_cap_e line_cap,
+ FX_FLOAT width,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ out_vertices.remove_all();
+ FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len);
+ FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len);
+ FX_FLOAT dx2 = 0;
+ FX_FLOAT dy2 = 0;
+ dx1 = FXSYS_Mul(dx1, width);
+ dy1 = FXSYS_Mul(dy1, width);
+ if(line_cap != round_cap) {
+ if(line_cap == square_cap) {
+ dx2 = dy1;
+ dy2 = dx1;
+ }
+ out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2));
+ out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2));
+ } else {
+ FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1);
+ FX_FLOAT a2 = a1 + FX_PI;
+ FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width +
+ FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+ out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1));
+ a1 += da;
+ a2 -= da / 4;
+ while(a1 < a2) {
+ out_vertices.add(coord_type(v0.x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ v0.y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 += da;
+ }
+ out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1));
+ }
+}
+template<class VertexConsumer>
+void stroke_calc_join(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ const vertex_dist& v2,
+ FX_FLOAT len1,
+ FX_FLOAT len2,
+ FX_FLOAT width,
+ line_join_e line_join,
+ inner_join_e inner_join,
+ FX_FLOAT miter_limit,
+ FX_FLOAT inner_miter_limit,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT dx1, dy1, dx2, dy2;
+ dx1 = FXSYS_MulDiv(width, v1.y - v0.y, len1);
+ dy1 = FXSYS_MulDiv(width, v1.x - v0.x, len1);
+ dx2 = FXSYS_MulDiv(width, v2.y - v1.y, len2);
+ dy2 = FXSYS_MulDiv(width, v2.x - v1.x, len2);
+ out_vertices.remove_all();
+ if(calc_point_location(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y) > 0) {
+ switch(inner_join) {
+ default:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ case inner_miter:
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ miter_join_revert,
+ inner_miter_limit,
+ 1.0f);
+ break;
+ case inner_jag:
+ case inner_round: {
+ FX_FLOAT d = (dx1 - dx2) * (dx1 - dx2) + (dy1 - dy2) * (dy1 - dy2);
+ if(d < len1 * len1 && d < len2 * len2) {
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ miter_join_revert,
+ inner_miter_limit,
+ 1.0f);
+ } else {
+ if(inner_join == inner_jag) {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ } else {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx2, -dy2, dx1, -dy1,
+ width, approximation_scale);
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ }
+ }
+ }
+ break;
+ }
+ } else {
+ switch(line_join) {
+ case miter_join:
+ case miter_join_revert:
+ case miter_join_round:
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ line_join,
+ miter_limit,
+ approximation_scale);
+ break;
+ case round_join:
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+ width, approximation_scale);
+ break;
+ default:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ }
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_path_storage.h b/core/src/fxge/agg/agg23/agg_path_storage.h
new file mode 100644
index 0000000000..64ea0b4753
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_path_storage.h
@@ -0,0 +1,172 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_PATH_STORAGE_INCLUDED
+#define AGG_PATH_STORAGE_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class path_storage : public CFX_Object
+{
+ enum block_scale_e {
+ block_shift = 8,
+ block_size = 1 << block_shift,
+ block_mask = block_size - 1,
+ block_pool = 256
+ };
+public:
+ class vertex_source : public CFX_Object
+ {
+ public:
+ vertex_source() {}
+ vertex_source(const path_storage& p) : m_path(&p), m_vertex_idx(0) {}
+ void rewind(unsigned path_id)
+ {
+ m_vertex_idx = path_id;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ return (m_vertex_idx < m_path->total_vertices()) ?
+ m_path->vertex(m_vertex_idx++, x, y) :
+ path_cmd_stop;
+ }
+ private:
+ const path_storage* m_path;
+ unsigned m_vertex_idx;
+ };
+ ~path_storage();
+ path_storage();
+ unsigned last_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+ unsigned prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+ void move_to(FX_FLOAT x, FX_FLOAT y);
+ void line_to(FX_FLOAT x, FX_FLOAT y);
+ void curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+ FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+ FX_FLOAT x_to, FX_FLOAT y_to);
+ template<class VertexSource>
+ void add_path(VertexSource& vs,
+ unsigned path_id = 0,
+ bool solid_path = true)
+ {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ if(is_move_to(cmd) && solid_path && m_total_vertices) {
+ cmd = path_cmd_line_to;
+ }
+ add_vertex(x, y, cmd);
+ }
+ }
+ template<class VertexSource>
+ void add_path_curve(VertexSource& vs,
+ unsigned path_id = 0,
+ bool solid_path = true)
+ {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ int flag;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex_curve_flag(&x, &y, flag))) {
+ if(is_move_to(cmd) && solid_path && m_total_vertices) {
+ cmd = path_cmd_line_to | flag;
+ }
+ add_vertex(x, y, cmd | flag);
+ }
+ }
+ unsigned total_vertices() const
+ {
+ return m_total_vertices;
+ }
+ unsigned vertex(unsigned idx, FX_FLOAT* x, FX_FLOAT* y) const
+ {
+ unsigned nb = idx >> block_shift;
+ const FX_FLOAT* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);
+ *x = *pv++;
+ *y = *pv;
+ return m_cmd_blocks[nb][idx & block_mask];
+ }
+ unsigned command(unsigned idx) const
+ {
+ return m_cmd_blocks[idx >> block_shift][idx & block_mask];
+ }
+ unsigned getflag(unsigned idx) const
+ {
+ return m_cmd_blocks[idx >> block_shift][idx & block_mask] & path_flags_jr;
+ }
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void end_poly();
+private:
+ void allocate_block(unsigned nb);
+ unsigned char* storage_ptrs(FX_FLOAT** xy_ptr);
+private:
+ unsigned m_total_vertices;
+ unsigned m_total_blocks;
+ unsigned m_max_blocks;
+ FX_FLOAT** m_coord_blocks;
+ unsigned char** m_cmd_blocks;
+ unsigned m_iterator;
+};
+inline unsigned path_storage::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ if(m_iterator >= m_total_vertices) {
+ return path_cmd_stop;
+ }
+ return vertex(m_iterator++, x, y);
+}
+inline unsigned path_storage::prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+ if(m_total_vertices > 1) {
+ return vertex(m_total_vertices - 2, x, y);
+ }
+ return path_cmd_stop;
+}
+inline unsigned path_storage::last_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+ if(m_total_vertices) {
+ return vertex(m_total_vertices - 1, x, y);
+ }
+ return path_cmd_stop;
+}
+inline unsigned char* path_storage::storage_ptrs(FX_FLOAT** xy_ptr)
+{
+ unsigned nb = m_total_vertices >> block_shift;
+ if(nb >= m_total_blocks) {
+ allocate_block(nb);
+ }
+ *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1);
+ return m_cmd_blocks[nb] + (m_total_vertices & block_mask);
+}
+inline void path_storage::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ FX_FLOAT* coord_ptr = 0;
+ unsigned char* cmd_ptr = storage_ptrs(&coord_ptr);
+ *cmd_ptr = (unsigned char)cmd;
+ *coord_ptr++ = x;
+ *coord_ptr = y;
+ m_total_vertices++;
+}
+inline void path_storage::move_to(FX_FLOAT x, FX_FLOAT y)
+{
+ add_vertex(x, y, path_cmd_move_to);
+}
+inline void path_storage::line_to(FX_FLOAT x, FX_FLOAT y)
+{
+ add_vertex(x, y, path_cmd_line_to);
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_pixfmt_gray.h b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
new file mode 100644
index 0000000000..052a2e35d8
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
@@ -0,0 +1,177 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_PIXFMT_GRAY_INCLUDED
+#define AGG_PIXFMT_GRAY_INCLUDED
+#include "agg_basics.h"
+#include "agg_color_gray.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class ColorT> struct blender_gray : public CFX_Object {
+ typedef ColorT color_type;
+ typedef typename color_type::value_type value_type;
+ typedef typename color_type::calc_type calc_type;
+ enum base_scale_e { base_shift = color_type::base_shift };
+ static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
+ unsigned alpha, unsigned cover = 0)
+ {
+ *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
+ }
+};
+template<class Blender, unsigned Step = 1, unsigned Offset = 0>
+class pixel_formats_gray : public CFX_Object
+{
+public:
+ typedef rendering_buffer::row_data row_data;
+ typedef rendering_buffer::span_data span_data;
+ typedef typename Blender::color_type color_type;
+ typedef typename color_type::value_type value_type;
+ typedef typename color_type::calc_type calc_type;
+ enum base_scale_e {
+ base_shift = color_type::base_shift,
+ base_size = color_type::base_size,
+ base_mask = color_type::base_mask
+ };
+private:
+ static AGG_INLINE void copy_or_blend_pix(value_type* p,
+ const color_type& c,
+ unsigned cover)
+ {
+ if (c.a) {
+ calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+ if(alpha == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, alpha, cover);
+ }
+ }
+ }
+ static AGG_INLINE void copy_or_blend_pix(value_type* p,
+ const color_type& c)
+ {
+ if (c.a) {
+ if(c.a == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, c.a);
+ }
+ }
+ }
+public:
+ pixel_formats_gray(rendering_buffer& rb) :
+ m_rbuf(&rb)
+ {}
+ AGG_INLINE unsigned width() const
+ {
+ return m_rbuf->width();
+ }
+ AGG_INLINE unsigned height() const
+ {
+ return m_rbuf->height();
+ }
+ AGG_INLINE color_type pixel(int x, int y) const
+ {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ return color_type(*p);
+ }
+ row_data row(int x, int y) const
+ {
+ return row_data(x,
+ width() - 1,
+ m_rbuf->row(y) +
+ x * Step * sizeof(value_type) +
+ Offset * sizeof(value_type));
+ }
+ span_data span(int x, int y, unsigned len)
+ {
+ return span_data(x, len,
+ m_rbuf->row(y) +
+ x * Step * sizeof(value_type) +
+ Offset * sizeof(value_type));
+ }
+ AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
+ {
+ *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v;
+ }
+ AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
+ {
+ copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover);
+ }
+ AGG_INLINE void copy_hline(int x, int y,
+ unsigned len,
+ const color_type& c)
+ {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ do {
+ *p = c.v;
+ p += Step;
+ } while(--len);
+ }
+ void blend_hline(int x, int y,
+ unsigned len,
+ const color_type& c,
+ int8u cover)
+ {
+ if (c.a) {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+ if(alpha == base_mask) {
+ do {
+ *p = c.v;
+ p += Step;
+ } while(--len);
+ } else {
+ do {
+ Blender::blend_pix(p, c.v, alpha, cover);
+ p += Step;
+ } while(--len);
+ }
+ }
+ }
+ void blend_solid_hspan(int x, int y,
+ unsigned len,
+ const color_type& c,
+ const int8u* covers)
+ {
+ if (c.a) {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ do {
+ calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+ if(alpha == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, alpha, *covers);
+ }
+ p += Step;
+ ++covers;
+ } while(--len);
+ }
+ }
+private:
+ rendering_buffer* m_rbuf;
+};
+typedef blender_gray<gray8> blender_gray8;
+typedef pixel_formats_gray<blender_gray8, 1, 0> pixfmt_gray8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000000..e9f0defbe8
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
@@ -0,0 +1,472 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#include "../../../../include/fxge/fx_ge.h"
+#include "agg_basics.h"
+#include "agg_math.h"
+#include "agg_array.h"
+#include "agg_clip_liang_barsky.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+enum poly_base_scale_e {
+ poly_base_shift = 8,
+ poly_base_size = 1 << poly_base_shift,
+ poly_base_mask = poly_base_size - 1
+};
+inline int poly_coord(FX_FLOAT c)
+{
+ return int(c * poly_base_size);
+}
+struct cell_aa : public CFX_Object {
+ int x;
+ int y;
+ int cover;
+ int area;
+ void set(int x, int y, int c, int a);
+ void set_coord(int x, int y);
+ void set_cover(int c, int a);
+ void add_cover(int c, int a);
+};
+class outline_aa : public CFX_Object
+{
+ enum cell_block_scale_e {
+ cell_block_shift = 12,
+ cell_block_size = 1 << cell_block_shift,
+ cell_block_mask = cell_block_size - 1,
+ cell_block_pool = 256,
+ cell_block_limit = 1024
+ };
+ struct sorted_y : public CFX_Object {
+ unsigned start;
+ unsigned num;
+ };
+public:
+ ~outline_aa();
+ outline_aa();
+ void reset();
+ void move_to(int x, int y);
+ void line_to(int x, int y);
+ int min_x() const
+ {
+ return m_min_x;
+ }
+ int min_y() const
+ {
+ return m_min_y;
+ }
+ int max_x() const
+ {
+ return m_max_x;
+ }
+ int max_y() const
+ {
+ return m_max_y;
+ }
+ void sort_cells();
+ unsigned total_cells() const
+ {
+ return m_num_cells;
+ }
+ unsigned scanline_num_cells(unsigned y) const
+ {
+ return m_sorted_y[y - m_min_y].num;
+ }
+ const cell_aa* const* scanline_cells(unsigned y) const
+ {
+ return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;
+ }
+ bool sorted() const
+ {
+ return m_sorted;
+ }
+private:
+ outline_aa(const outline_aa&);
+ const outline_aa& operator = (const outline_aa&);
+ void set_cur_cell(int x, int y);
+ void add_cur_cell();
+ void render_hline(int ey, int x1, int y1, int x2, int y2);
+ void render_line(int x1, int y1, int x2, int y2);
+ void allocate_block();
+private:
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ unsigned m_cur_block;
+ unsigned m_num_cells;
+ cell_aa** m_cells;
+ cell_aa* m_cur_cell_ptr;
+ pod_array<cell_aa*> m_sorted_cells;
+ pod_array<sorted_y> m_sorted_y;
+ cell_aa m_cur_cell;
+ int m_cur_x;
+ int m_cur_y;
+ int m_min_x;
+ int m_min_y;
+ int m_max_x;
+ int m_max_y;
+ bool m_sorted;
+};
+class scanline_hit_test : public CFX_Object
+{
+public:
+ scanline_hit_test(int x) : m_x(x), m_hit(false) {}
+ void reset_spans() {}
+ void finalize(int) {}
+ void add_cell(int x, int)
+ {
+ if(m_x == x) {
+ m_hit = true;
+ }
+ }
+ void add_span(int x, int len, int)
+ {
+ if(m_x >= x && m_x < x + len) {
+ m_hit = true;
+ }
+ }
+ unsigned num_spans() const
+ {
+ return 1;
+ }
+ bool hit() const
+ {
+ return m_hit;
+ }
+private:
+ int m_x;
+ bool m_hit;
+};
+enum filling_rule_e {
+ fill_non_zero,
+ fill_even_odd
+};
+class rasterizer_scanline_aa : public CFX_Object
+{
+ enum status {
+ status_initial,
+ status_line_to,
+ status_closed
+ };
+public:
+ enum aa_scale_e {
+ aa_num = 1 << 8,
+ aa_mask = aa_num - 1,
+ aa_2num = aa_num * 2,
+ aa_2mask = aa_2num - 1
+ };
+ rasterizer_scanline_aa() :
+ m_filling_rule(fill_non_zero),
+ m_clipped_start_x(0),
+ m_clipped_start_y(0),
+ m_status(status_initial),
+ m_clipping(false)
+ {
+ }
+ ~rasterizer_scanline_aa() {}
+ void filling_rule(filling_rule_e filling_rule)
+ {
+ m_filling_rule = filling_rule;
+ }
+ int min_x() const
+ {
+ return m_outline.min_x();
+ }
+ int min_y() const
+ {
+ return m_outline.min_y();
+ }
+ int max_x() const
+ {
+ return m_outline.max_x();
+ }
+ int max_y() const
+ {
+ return m_outline.max_y();
+ }
+ void reset()
+ {
+ m_outline.reset();
+ m_status = status_initial;
+ }
+ void clip_box(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+ {
+ m_clip_box = rect(poly_coord(x1), poly_coord(y1),
+ poly_coord(x2), poly_coord(y2));
+ m_clip_box.normalize();
+ m_clipping = true;
+ }
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+ {
+ if(is_close(cmd)) {
+ close_polygon();
+ } else {
+ if(is_move_to(cmd)) {
+ move_to(poly_coord(x), poly_coord(y));
+ } else {
+ if(is_vertex(cmd)) {
+ line_to(poly_coord(x), poly_coord(y));
+ }
+ }
+ }
+ }
+ void move_to(int x, int y)
+ {
+ if(m_clipping) {
+ if(m_outline.sorted()) {
+ reset();
+ }
+ if(m_status == status_line_to) {
+ close_polygon();
+ }
+ m_prev_x = m_start_x = x;
+ m_prev_y = m_start_y = y;
+ m_status = status_initial;
+ m_prev_flags = clipping_flags(x, y, m_clip_box);
+ if(m_prev_flags == 0) {
+ move_to_no_clip(x, y);
+ }
+ } else {
+ move_to_no_clip(x, y);
+ }
+ }
+ void line_to(int x, int y)
+ {
+ if(m_clipping) {
+ clip_segment(x, y);
+ } else {
+ line_to_no_clip(x, y);
+ }
+ }
+ void close_polygon()
+ {
+ if (m_status != status_line_to) {
+ return;
+ }
+ if(m_clipping) {
+ clip_segment(m_start_x, m_start_y);
+ }
+ close_polygon_no_clip();
+ }
+ AGG_INLINE unsigned calculate_alpha(int area, bool no_smooth) const
+ {
+ int cover = area >> (poly_base_shift * 2 + 1 - 8);
+ if(cover < 0) {
+ cover = -cover;
+ }
+ if(m_filling_rule == fill_even_odd) {
+ cover &= aa_2mask;
+ if(cover > aa_num) {
+ cover = aa_2num - cover;
+ }
+ }
+ if (no_smooth) {
+ cover = cover > aa_mask / 2 ? aa_mask : 0;
+ }
+ if(cover > aa_mask) {
+ cover = aa_mask;
+ }
+ return cover;
+ }
+ AGG_INLINE void sort()
+ {
+ m_outline.sort_cells();
+ }
+ AGG_INLINE bool rewind_scanlines()
+ {
+ close_polygon();
+ m_outline.sort_cells();
+ if(m_outline.total_cells() == 0) {
+ return false;
+ }
+ m_cur_y = m_outline.min_y();
+ return true;
+ }
+ AGG_INLINE bool navigate_scanline(int y)
+ {
+ close_polygon();
+ m_outline.sort_cells();
+ if(m_outline.total_cells() == 0 ||
+ y < m_outline.min_y() ||
+ y > m_outline.max_y()) {
+ return false;
+ }
+ m_cur_y = y;
+ return true;
+ }
+ template<class Scanline> bool sweep_scanline(Scanline& sl, bool no_smooth)
+ {
+ for(;;) {
+ if(m_cur_y > m_outline.max_y()) {
+ return false;
+ }
+ sl.reset_spans();
+ unsigned num_cells = m_outline.scanline_num_cells(m_cur_y);
+ const cell_aa* const* cells = m_outline.scanline_cells(m_cur_y);
+ int cover = 0;
+ while(num_cells) {
+ const cell_aa* cur_cell = *cells;
+ int x = cur_cell->x;
+ int area = cur_cell->area;
+ unsigned alpha;
+ cover += cur_cell->cover;
+ while(--num_cells) {
+ cur_cell = *++cells;
+ if(cur_cell->x != x) {
+ break;
+ }
+ area += cur_cell->area;
+ cover += cur_cell->cover;
+ }
+ if(area) {
+ alpha = calculate_alpha((cover << (poly_base_shift + 1)) - area, no_smooth);
+ if(alpha) {
+ sl.add_cell(x, alpha);
+ }
+ x++;
+ }
+ if(num_cells && cur_cell->x > x) {
+ alpha = calculate_alpha(cover << (poly_base_shift + 1), no_smooth);
+ if(alpha) {
+ sl.add_span(x, cur_cell->x - x, alpha);
+ }
+ }
+ }
+ if(sl.num_spans()) {
+ break;
+ }
+ ++m_cur_y;
+ }
+ sl.finalize(m_cur_y);
+ ++m_cur_y;
+ return true;
+ }
+ template<class VertexSource>
+ void add_path(VertexSource& vs, unsigned path_id = 0)
+ {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ add_vertex(x, y, cmd);
+ }
+ }
+ template<class VertexSource>
+ void add_path_transformed(VertexSource& vs, const CFX_AffineMatrix* pMatrix, unsigned path_id = 0)
+ {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ if (pMatrix) {
+ pMatrix->Transform(x, y);
+ }
+ add_vertex(x, y, cmd);
+ }
+ }
+private:
+ rasterizer_scanline_aa(const rasterizer_scanline_aa&);
+ const rasterizer_scanline_aa&
+ operator = (const rasterizer_scanline_aa&);
+ void move_to_no_clip(int x, int y)
+ {
+ if(m_status == status_line_to) {
+ close_polygon_no_clip();
+ }
+ m_outline.move_to(x * 1, y);
+ m_clipped_start_x = x;
+ m_clipped_start_y = y;
+ m_status = status_line_to;
+ }
+ void line_to_no_clip(int x, int y)
+ {
+ if(m_status != status_initial) {
+ m_outline.line_to(x * 1, y);
+ m_status = status_line_to;
+ }
+ }
+ void close_polygon_no_clip()
+ {
+ if(m_status == status_line_to) {
+ m_outline.line_to(m_clipped_start_x * 1, m_clipped_start_y);
+ m_status = status_closed;
+ }
+ }
+ void clip_segment(int x, int y)
+ {
+ unsigned flags = clipping_flags(x, y, m_clip_box);
+ if(m_prev_flags == flags) {
+ if(flags == 0) {
+ if(m_status == status_initial) {
+ move_to_no_clip(x, y);
+ } else {
+ line_to_no_clip(x, y);
+ }
+ }
+ } else {
+ int cx[4];
+ int cy[4];
+ unsigned n = clip_liang_barsky(m_prev_x, m_prev_y,
+ x, y,
+ m_clip_box,
+ cx, cy);
+ const int* px = cx;
+ const int* py = cy;
+ while(n--) {
+ if(m_status == status_initial) {
+ move_to_no_clip(*px++, *py++);
+ } else {
+ line_to_no_clip(*px++, *py++);
+ }
+ }
+ }
+ m_prev_flags = flags;
+ m_prev_x = x;
+ m_prev_y = y;
+ }
+private:
+ outline_aa m_outline;
+ filling_rule_e m_filling_rule;
+ int m_clipped_start_x;
+ int m_clipped_start_y;
+ int m_start_x;
+ int m_start_y;
+ int m_prev_x;
+ int m_prev_y;
+ unsigned m_prev_flags;
+ unsigned m_status;
+ rect m_clip_box;
+ bool m_clipping;
+ int m_cur_y;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_render_scanlines.h b/core/src/fxge/agg/agg23/agg_render_scanlines.h
new file mode 100644
index 0000000000..0dfd6d259f
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_render_scanlines.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDER_SCANLINES_INCLUDED
+#define AGG_RENDER_SCANLINES_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class Rasterizer, class Scanline, class Renderer>
+void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth)
+{
+ if(ras.rewind_scanlines()) {
+ sl.reset(ras.min_x(), ras.max_x());
+ ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2));
+ while(ras.sweep_scanline(sl, no_smooth)) {
+ ren.render(sl);
+ }
+ }
+}
+template<class Rasterizer, class Scanline, class Renderer,
+ class VertexSource, class ColorStorage, class PathId>
+void render_all_paths(Rasterizer& ras,
+ Scanline& sl,
+ Renderer& r,
+ VertexSource& vs,
+ const ColorStorage& as,
+ const PathId& path_id,
+ unsigned num_paths)
+{
+ for(unsigned i = 0; i < num_paths; i++) {
+ ras.reset();
+ ras.add_path(vs, path_id[i]);
+ r.color(as[i]);
+ render_scanlines(ras, sl, r);
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_base.h b/core/src/fxge/agg/agg23/agg_renderer_base.h
new file mode 100644
index 0000000000..3e20a6d408
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_base.h
@@ -0,0 +1,163 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class renderer_base
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_BASE_INCLUDED
+#define AGG_RENDERER_BASE_INCLUDED
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class PixelFormat> class renderer_base : public CFX_Object
+{
+public:
+ typedef PixelFormat pixfmt_type;
+ typedef typename pixfmt_type::color_type color_type;
+ typedef typename pixfmt_type::row_data row_data;
+ typedef typename pixfmt_type::span_data span_data;
+ renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {}
+ renderer_base(pixfmt_type& ren) :
+ m_ren(&ren),
+ m_clip_box(0, 0, ren.width() - 1, ren.height() - 1)
+ {}
+ void attach(pixfmt_type& ren)
+ {
+ m_ren = &ren;
+ m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1);
+ }
+ const pixfmt_type& ren() const
+ {
+ return *m_ren;
+ }
+ pixfmt_type& ren()
+ {
+ return *m_ren;
+ }
+ unsigned width() const
+ {
+ return m_ren->width();
+ }
+ unsigned height() const
+ {
+ return m_ren->height();
+ }
+ void first_clip_box() {}
+ bool next_clip_box()
+ {
+ return false;
+ }
+ const rect& clip_box() const
+ {
+ return m_clip_box;
+ }
+ int xmin() const
+ {
+ return m_clip_box.x1;
+ }
+ int ymin() const
+ {
+ return m_clip_box.y1;
+ }
+ int xmax() const
+ {
+ return m_clip_box.x2;
+ }
+ int ymax() const
+ {
+ return m_clip_box.y2;
+ }
+ const rect& bounding_clip_box() const
+ {
+ return m_clip_box;
+ }
+ int bounding_xmin() const
+ {
+ return m_clip_box.x1;
+ }
+ int bounding_ymin() const
+ {
+ return m_clip_box.y1;
+ }
+ int bounding_xmax() const
+ {
+ return m_clip_box.x2;
+ }
+ int bounding_ymax() const
+ {
+ return m_clip_box.y2;
+ }
+ void blend_hline(int x1, int y, int x2,
+ const color_type& c, cover_type cover)
+ {
+ if(x1 > x2) {
+ int t = x2;
+ x2 = x1;
+ x1 = t;
+ }
+ if(y > ymax()) {
+ return;
+ }
+ if(y < ymin()) {
+ return;
+ }
+ if(x1 > xmax()) {
+ return;
+ }
+ if(x2 < xmin()) {
+ return;
+ }
+ if(x1 < xmin()) {
+ x1 = xmin();
+ }
+ if(x2 > xmax()) {
+ x2 = xmax();
+ }
+ m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover);
+ }
+ void blend_solid_hspan(int x, int y, int len,
+ const color_type& c,
+ const cover_type* covers)
+ {
+ if(y > ymax()) {
+ return;
+ }
+ if(y < ymin()) {
+ return;
+ }
+ if(x < xmin()) {
+ len -= xmin() - x;
+ if(len <= 0) {
+ return;
+ }
+ covers += xmin() - x;
+ x = xmin();
+ }
+ if(x + len > xmax()) {
+ len = xmax() - x + 1;
+ if(len <= 0) {
+ return;
+ }
+ }
+ m_ren->blend_solid_hspan(x, y, len, c, covers);
+ }
+private:
+ pixfmt_type* m_ren;
+ rect m_clip_box;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_scanline.h b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
new file mode 100644
index 0000000000..b02b6b5f66
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
@@ -0,0 +1,93 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_SCANLINE_INCLUDED
+#define AGG_RENDERER_SCANLINE_INCLUDED
+#include "agg_basics.h"
+#include "agg_renderer_base.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+template<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa : public CFX_Object
+{
+public:
+ typedef BaseRenderer base_ren_type;
+ typedef SpanGenerator span_gen_type;
+ renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}
+ renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :
+ m_ren(&ren),
+ m_span_gen(&span_gen)
+ {}
+ void attach(base_ren_type& ren, span_gen_type& span_gen)
+ {
+ m_ren = &ren;
+ m_span_gen = &span_gen;
+ }
+ void prepare(unsigned max_span_len)
+ {
+ m_span_gen->prepare(max_span_len);
+ }
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ int y = sl.y();
+ m_ren->first_clip_box();
+ do {
+ int xmin = m_ren->xmin();
+ int xmax = m_ren->xmax();
+ if(y >= m_ren->ymin() && y <= m_ren->ymax()) {
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ for(;;) {
+ int x = span->x;
+ int len = span->len;
+ bool solid = false;
+ const typename Scanline::cover_type* covers = span->covers;
+ if(len < 0) {
+ solid = true;
+ len = -len;
+ }
+ if(x < xmin) {
+ len -= xmin - x;
+ if(!solid) {
+ covers += xmin - x;
+ }
+ x = xmin;
+ }
+ if(len > 0) {
+ if(x + len > xmax) {
+ len = xmax - x + 1;
+ }
+ if(len > 0) {
+ m_ren->blend_color_hspan_no_clip(
+ x, y, len,
+ m_span_gen->generate(x, y, len),
+ solid ? 0 : covers,
+ *covers);
+ }
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+ } while(m_ren->next_clip_box());
+ }
+private:
+ base_ren_type* m_ren;
+ SpanGenerator* m_span_gen;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rendering_buffer.h b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
new file mode 100644
index 0000000000..5a8681b537
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
@@ -0,0 +1,145 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class rendering_buffer
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERING_BUFFER_INCLUDED
+#define AGG_RENDERING_BUFFER_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class rendering_buffer : public CFX_Object
+{
+public:
+ struct row_data : public CFX_Object {
+ int x1, x2;
+ const int8u* ptr;
+ row_data() {}
+ row_data(int x1_, int x2_, const int8u* ptr_) :
+ x1(x1_), x2(x2_), ptr(ptr_) {}
+ };
+ struct span_data : public CFX_Object {
+ int x;
+ unsigned len;
+ int8u* ptr;
+ span_data() {}
+ span_data(int) : x(0), len(0), ptr(0) {}
+ span_data(int x_, unsigned len_, int8u* ptr_) :
+ x(x_), len(len_), ptr(ptr_) {}
+ };
+ ~rendering_buffer()
+ {
+ FX_Free(m_rows);
+ }
+ rendering_buffer() :
+ m_buf(0),
+ m_rows(0),
+ m_width(0),
+ m_height(0),
+ m_stride(0),
+ m_max_height(0)
+ {
+ }
+ rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) :
+ m_buf(0),
+ m_rows(0),
+ m_width(0),
+ m_height(0),
+ m_stride(0),
+ m_max_height(0)
+ {
+ attach(buf, width, height, stride);
+ }
+ void attach(int8u* buf, unsigned width, unsigned height, int stride)
+ {
+ m_buf = buf;
+ m_width = width;
+ m_height = height;
+ m_stride = stride;
+ if(height > m_max_height) {
+ FX_Free(m_rows);
+ m_rows = FX_Alloc(int8u*, m_max_height = height);
+ }
+ int8u* row_ptr = m_buf;
+ if(stride < 0) {
+ row_ptr = m_buf - int(height - 1) * stride;
+ }
+ int8u** rows = m_rows;
+ while(height--) {
+ *rows++ = row_ptr;
+ row_ptr += stride;
+ }
+ }
+ int8u* buf()
+ {
+ return m_buf;
+ }
+ const int8u* buf() const
+ {
+ return m_buf;
+ }
+ unsigned width() const
+ {
+ return m_width;
+ }
+ unsigned height() const
+ {
+ return m_height;
+ }
+ int stride() const
+ {
+ return m_stride;
+ }
+ unsigned stride_abs() const
+ {
+ return (m_stride < 0) ?
+ unsigned(-m_stride) :
+ unsigned(m_stride);
+ }
+ int8u* row(unsigned y)
+ {
+ return m_rows[y];
+ }
+ const int8u* row(unsigned y) const
+ {
+ return m_rows[y];
+ }
+ int8u* next_row(void* p)
+ {
+ return (int8u*)p + m_stride;
+ }
+ const int8u* next_row(const void* p) const
+ {
+ return (int8u*)p + m_stride;
+ }
+ int8u const* const* rows() const
+ {
+ return m_rows;
+ }
+private:
+ rendering_buffer(const rendering_buffer&);
+ const rendering_buffer& operator = (const rendering_buffer&);
+private:
+ int8u* m_buf;
+ int8u** m_rows;
+ unsigned m_width;
+ unsigned m_height;
+ int m_stride;
+ unsigned m_max_height;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_scanline_u.h b/core/src/fxge/agg/agg23/agg_scanline_u.h
new file mode 100644
index 0000000000..f99feef91c
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_scanline_u.h
@@ -0,0 +1,150 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_SCANLINE_U_INCLUDED
+#define AGG_SCANLINE_U_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+template<class CoverT> class scanline_u : public CFX_Object
+{
+public:
+ typedef scanline_u<CoverT> self_type;
+ typedef CoverT cover_type;
+ typedef int16 coord_type;
+ struct span : public CFX_Object {
+ coord_type x;
+ coord_type len;
+ cover_type* covers;
+ };
+ typedef span* iterator;
+ typedef const span* const_iterator;
+ ~scanline_u()
+ {
+ FX_Free(m_spans);
+ FX_Free(m_covers);
+ }
+ scanline_u() :
+ m_min_x(0),
+ m_max_len(0),
+ m_last_x(0x7FFFFFF0),
+ m_covers(0),
+ m_spans(0),
+ m_cur_span(0)
+ {}
+ void reset(int min_x, int max_x)
+ {
+ unsigned max_len = max_x - min_x + 2;
+ if(max_len > m_max_len) {
+ FX_Free(m_spans);
+ FX_Free(m_covers);
+ m_covers = FX_Alloc( cover_type , max_len);
+ m_spans = FX_Alloc( span , max_len);
+ m_max_len = max_len;
+ }
+ m_last_x = 0x7FFFFFF0;
+ m_min_x = min_x;
+ m_cur_span = m_spans;
+ }
+ void add_cell(int x, unsigned cover)
+ {
+ x -= m_min_x;
+ m_covers[x] = (cover_type)cover;
+ if(x == m_last_x + 1) {
+ m_cur_span->len++;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = 1;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x;
+ }
+ void add_cells(int x, unsigned len, const CoverT* covers)
+ {
+ x -= m_min_x;
+ FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT));
+ if(x == m_last_x + 1) {
+ m_cur_span->len += (coord_type)len;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = (coord_type)len;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x + len - 1;
+ }
+ void add_span(int x, unsigned len, unsigned cover)
+ {
+ x -= m_min_x;
+ FXSYS_memset8(m_covers + x, cover, len);
+ if(x == m_last_x + 1) {
+ m_cur_span->len += (coord_type)len;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = (coord_type)len;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x + len - 1;
+ }
+ void finalize(int y)
+ {
+ m_y = y;
+ }
+ void reset_spans()
+ {
+ m_last_x = 0x7FFFFFF0;
+ m_cur_span = m_spans;
+ }
+ int y() const
+ {
+ return m_y;
+ }
+ unsigned num_spans() const
+ {
+ return unsigned(m_cur_span - m_spans);
+ }
+ const_iterator begin() const
+ {
+ return m_spans + 1;
+ }
+ iterator begin()
+ {
+ return m_spans + 1;
+ }
+private:
+ scanline_u(const self_type&);
+ const self_type& operator = (const self_type&);
+private:
+ int m_min_x;
+ unsigned m_max_len;
+ int m_last_x;
+ int m_y;
+ cover_type* m_covers;
+ span* m_spans;
+ span* m_cur_span;
+};
+typedef scanline_u<int8u> scanline_u8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_shorten_path.h b/core/src/fxge/agg/agg23/agg_shorten_path.h
new file mode 100644
index 0000000000..d7eb4be018
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_shorten_path.h
@@ -0,0 +1,57 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_SHORTEN_PATH_INCLUDED
+#define AGG_SHORTEN_PATH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+template<class VertexSequence>
+void shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0)
+{
+ typedef typename VertexSequence::value_type vertex_type;
+ if(s > 0 && vs.size() > 1) {
+ FX_FLOAT d;
+ int n = int(vs.size() - 2);
+ while(n) {
+ d = vs[n].dist;
+ if(d > s) {
+ break;
+ }
+ vs.remove_last();
+ s -= d;
+ --n;
+ }
+ if(vs.size() < 2) {
+ vs.remove_all();
+ } else {
+ n = vs.size() - 1;
+ vertex_type& prev = vs[n - 1];
+ vertex_type& last = vs[n];
+ d = (prev.dist - s) / prev.dist;
+ FX_FLOAT x = prev.x + (last.x - prev.x) * d;
+ FX_FLOAT y = prev.y + (last.y - prev.y) * d;
+ last.x = x;
+ last.y = y;
+ if(!prev(last)) {
+ vs.remove_last();
+ }
+ vs.close(closed != 0);
+ }
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_dash.h b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
new file mode 100644
index 0000000000..961da2d718
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
@@ -0,0 +1,75 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_DASH_INCLUDED
+#define AGG_VCGEN_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+class vcgen_dash : public CFX_Object
+{
+ enum max_dashes_e {
+ max_dashes = 32
+ };
+ enum status_e {
+ initial,
+ ready,
+ polyline,
+ stop
+ };
+public:
+ typedef vertex_sequence<vertex_dist, 6> vertex_storage;
+ vcgen_dash();
+ void remove_all_dashes();
+ void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len);
+ void dash_start(FX_FLOAT ds);
+ void shorten(FX_FLOAT s)
+ {
+ m_shorten = s;
+ }
+ double shorten() const
+ {
+ return m_shorten;
+ }
+ void remove_all();
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ vcgen_dash(const vcgen_dash&);
+ const vcgen_dash& operator = (const vcgen_dash&);
+ void calc_dash_start(FX_FLOAT ds);
+ FX_FLOAT m_dashes[max_dashes];
+ FX_FLOAT m_total_dash_len;
+ unsigned m_num_dashes;
+ FX_FLOAT m_dash_start;
+ FX_FLOAT m_shorten;
+ FX_FLOAT m_curr_dash_start;
+ unsigned m_curr_dash;
+ FX_FLOAT m_curr_rest;
+ const vertex_dist* m_v1;
+ const vertex_dist* m_v2;
+ vertex_storage m_src_vertices;
+ unsigned m_closed;
+ status_e m_status;
+ unsigned m_src_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_stroke.h b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
new file mode 100644
index 0000000000..38fe1fc25d
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
@@ -0,0 +1,120 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_STROKE_INCLUDED
+#define AGG_VCGEN_STROKE_INCLUDED
+#include "agg_math_stroke.h"
+namespace agg
+{
+class vcgen_stroke : public CFX_Object
+{
+ enum status_e {
+ initial,
+ ready,
+ cap1,
+ cap2,
+ outline1,
+ close_first,
+ outline2,
+ out_vertices,
+ end_poly1,
+ end_poly2,
+ stop
+ };
+public:
+ typedef vertex_sequence<vertex_dist_cmd, 6> vertex_storage;
+ typedef pod_deque<point_type, 6> coord_storage;
+ vcgen_stroke();
+ void line_cap(line_cap_e lc)
+ {
+ m_line_cap = lc;
+ }
+ void line_join(line_join_e lj)
+ {
+ m_line_join = lj;
+ }
+ void inner_join(inner_join_e ij)
+ {
+ m_inner_join = ij;
+ }
+ line_cap_e line_cap() const
+ {
+ return m_line_cap;
+ }
+ line_join_e line_join() const
+ {
+ return m_line_join;
+ }
+ inner_join_e inner_join() const
+ {
+ return m_inner_join;
+ }
+ void width(FX_FLOAT w)
+ {
+ m_width = w / 2;
+ }
+ void miter_limit(FX_FLOAT ml)
+ {
+ m_miter_limit = ml;
+ }
+ void miter_limit_theta(FX_FLOAT t);
+ void inner_miter_limit(FX_FLOAT ml)
+ {
+ m_inner_miter_limit = ml;
+ }
+ void approximation_scale(FX_FLOAT as)
+ {
+ m_approx_scale = as;
+ }
+ FX_FLOAT width() const
+ {
+ return m_width * 2;
+ }
+ FX_FLOAT miter_limit() const
+ {
+ return m_miter_limit;
+ }
+ FX_FLOAT inner_miter_limit() const
+ {
+ return m_inner_miter_limit;
+ }
+ FX_FLOAT approximation_scale() const
+ {
+ return m_approx_scale;
+ }
+ void remove_all();
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ vcgen_stroke(const vcgen_stroke&);
+ const vcgen_stroke& operator = (const vcgen_stroke&);
+ vertex_storage m_src_vertices;
+ coord_storage m_out_vertices;
+ FX_FLOAT m_width;
+ FX_FLOAT m_miter_limit;
+ FX_FLOAT m_inner_miter_limit;
+ FX_FLOAT m_approx_scale;
+ line_cap_e m_line_cap;
+ line_join_e m_line_join;
+ inner_join_e m_inner_join;
+ unsigned m_closed;
+ status_e m_status;
+ status_e m_prev_status;
+ unsigned m_src_vertex;
+ unsigned m_out_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vertex_sequence.h b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
new file mode 100644
index 0000000000..29486d4787
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
@@ -0,0 +1,100 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// vertex_sequence container and vertex_dist struct
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VERTEX_SEQUENCE_INCLUDED
+#define AGG_VERTEX_SEQUENCE_INCLUDED
+#include "agg_basics.h"
+#include "agg_array.h"
+#include "agg_math.h"
+namespace agg
+{
+template<class T, unsigned S = 6>
+class vertex_sequence : public pod_deque<T, S>
+{
+public:
+ typedef pod_deque<T, S> base_type;
+ void add(const T& val);
+ void modify_last(const T& val);
+ void close(bool remove_flag);
+};
+template<class T, unsigned S>
+void vertex_sequence<T, S>::add(const T& val)
+{
+ if(base_type::size() > 1) {
+ if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+ base_type::remove_last();
+ }
+ }
+ base_type::add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::modify_last(const T& val)
+{
+ base_type::remove_last();
+ add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::close(bool closed)
+{
+ while(base_type::size() > 1) {
+ if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+ break;
+ }
+ T t = (*this)[base_type::size() - 1];
+ base_type::remove_last();
+ modify_last(t);
+ }
+ if(closed) {
+ while(base_type::size() > 1) {
+ if((*this)[base_type::size() - 1]((*this)[0])) {
+ break;
+ }
+ base_type::remove_last();
+ }
+ }
+}
+const FX_FLOAT vertex_dist_epsilon = 1e-14f;
+struct vertex_dist : public CFX_Object {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ FX_FLOAT dist;
+ vertex_dist() {}
+ vertex_dist(FX_FLOAT x_, FX_FLOAT y_) :
+ x(x_),
+ y(y_),
+ dist(0)
+ {
+ }
+ bool operator () (const vertex_dist& val)
+ {
+ bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon;
+ return ret;
+ }
+};
+struct vertex_dist_cmd : public vertex_dist {
+ unsigned cmd;
+ vertex_dist_cmd() {}
+ vertex_dist_cmd(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+ vertex_dist(x_, y_),
+ cmd(cmd_)
+ {
+ }
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/fx_agg_curves.cpp b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
new file mode 100644
index 0000000000..861320ee70
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
@@ -0,0 +1,109 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_curves.h"
+#include "agg_math.h"
+namespace agg
+{
+const FX_FLOAT curve_collinearity_epsilon = 1e-30f;
+enum curve_recursion_limit_e { curve_recursion_limit = 16 };
+void curve4_div::init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+{
+ m_points.remove_all();
+ m_distance_tolerance_square = 1.0f / 4;
+ m_distance_tolerance_manhattan = 1.0f * 4;
+ bezier(x1, y1, x2, y2, x3, y3, x4, y4);
+ m_count = 0;
+}
+void curve4_div::recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4,
+ unsigned level)
+{
+ if(level > curve_recursion_limit) {
+ return;
+ }
+ FX_FLOAT x12 = (x1 + x2) / 2;
+ FX_FLOAT y12 = (y1 + y2) / 2;
+ FX_FLOAT x23 = (x2 + x3) / 2;
+ FX_FLOAT y23 = (y2 + y3) / 2;
+ FX_FLOAT x34 = (x3 + x4) / 2;
+ FX_FLOAT y34 = (y3 + y4) / 2;
+ FX_FLOAT x123 = (x12 + x23) / 2;
+ FX_FLOAT y123 = (y12 + y23) / 2;
+ FX_FLOAT x234 = (x23 + x34) / 2;
+ FX_FLOAT y234 = (y23 + y34) / 2;
+ FX_FLOAT x1234 = (x123 + x234) / 2;
+ FX_FLOAT y1234 = (y123 + y234) / 2;
+ FX_FLOAT dx = x4 - x1;
+ FX_FLOAT dy = y4 - y1;
+ FX_FLOAT d2 = FXSYS_fabs(FXSYS_Mul(x2 - x4, dy) - FXSYS_Mul(y2 - y4, dx));
+ FX_FLOAT d3 = FXSYS_fabs(FXSYS_Mul(x3 - x4, dy) - FXSYS_Mul(y3 - y4, dx));
+ switch((int(d2 > curve_collinearity_epsilon) << 1) +
+ int(d3 > curve_collinearity_epsilon)) {
+ case 0:
+ if(FXSYS_fabs(x1 + x3 - x2 - x2) +
+ FXSYS_fabs(y1 + y3 - y2 - y2) +
+ FXSYS_fabs(x2 + x4 - x3 - x3) +
+ FXSYS_fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan) {
+ m_points.add(point_type(x1234, y1234, path_flags_jr));
+ return;
+ }
+ break;
+ case 1:
+ if(FXSYS_Mul(d3, d3) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ case 2:
+ if(FXSYS_Mul(d2, d2) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ case 3:
+ if(FXSYS_Mul(d2 + d3, d2 + d3) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ }
+ recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);
+ recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);
+}
+void curve4_div::bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+{
+ m_points.add(point_type(x1, y1));
+ recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
+ m_points.add(point_type(x4, y4));
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_driver.cpp b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
new file mode 100644
index 0000000000..557f134205
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
@@ -0,0 +1,1636 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fxge/fx_ge.h"
+#include "../../dib/dib_int.h"
+#include "../../ge/text_int.h"
+#include "../../../../include/fxcodec/fx_codec.h"
+#include "agg_pixfmt_gray.h"
+#include "agg_path_storage.h"
+#include "agg_scanline_u.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_curves.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+using namespace agg;
+#include "../include/fx_agg_driver.h"
+void _HardClip(FX_FLOAT& x, FX_FLOAT& y)
+{
+ if (x > 50000) {
+ x = 50000;
+ }
+ if (x < -50000) {
+ x = -50000;
+ }
+ if (y > 50000) {
+ y = 50000;
+ }
+ if (y < -50000) {
+ y = -50000;
+ }
+}
+void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+ int nPoints = pPathData->GetPointCount();
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ for (int i = 0; i < nPoints; i ++) {
+ FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;
+ if (pObject2Device) {
+ pObject2Device->Transform(x, y);
+ }
+ _HardClip(x, y);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO) {
+ m_PathData.move_to(x, y);
+ } else if (point_type == FXPT_LINETO) {
+ if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+ pPoints[i].m_PointX == pPoints[i - 1].m_PointX && pPoints[i].m_PointY == pPoints[i - 1].m_PointY) {
+ x += 1;
+ }
+ m_PathData.line_to(x, y);
+ } else if (point_type == FXPT_BEZIERTO) {
+ FX_FLOAT x0 = pPoints[i - 1].m_PointX, y0 = pPoints[i - 1].m_PointY;
+ FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;
+ FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;
+ if (pObject2Device) {
+ pObject2Device->Transform(x0, y0);
+ pObject2Device->Transform(x2, y2);
+ pObject2Device->Transform(x3, y3);
+ }
+ curve4 curve(x0, y0, x, y, x2, y2, x3, y3);
+ i += 2;
+ m_PathData.add_path_curve(curve);
+ }
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+ m_PathData.end_poly();
+ }
+ }
+}
+namespace agg
+{
+template<class BaseRenderer> class renderer_scanline_aa_offset
+{
+public:
+ typedef BaseRenderer base_ren_type;
+ typedef typename base_ren_type::color_type color_type;
+ renderer_scanline_aa_offset(base_ren_type& ren, unsigned left, unsigned top) :
+ m_ren(&ren), m_left(left), m_top(top)
+ {}
+ void color(const color_type& c)
+ {
+ m_color = c;
+ }
+ const color_type& color() const
+ {
+ return m_color;
+ }
+ void prepare(unsigned) {}
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ int y = sl.y();
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ for(;;) {
+ int x = span->x;
+ if(span->len > 0) {
+ m_ren->blend_solid_hspan(x - m_left, y - m_top, (unsigned)span->len,
+ m_color,
+ span->covers);
+ } else {
+ m_ren->blend_hline(x - m_left, y - m_top, (unsigned)(x - span->len - 1),
+ m_color,
+ *(span->covers));
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+private:
+ base_ren_type* m_ren;
+ color_type m_color;
+ unsigned m_left, m_top;
+};
+}
+static void RasterizeStroke(rasterizer_scanline_aa& rasterizer, path_storage& path_data,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState, FX_FLOAT scale = 1.0f,
+ FX_BOOL bStrokeAdjust = FALSE, FX_BOOL bTextMode = FALSE)
+{
+ line_cap_e cap;
+ switch (pGraphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapRound:
+ cap = round_cap;
+ break;
+ case CFX_GraphStateData::LineCapSquare:
+ cap = square_cap;
+ break;
+ default:
+ cap = butt_cap;
+ break;
+ }
+ line_join_e join;
+ switch (pGraphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinRound:
+ join = round_join;
+ break;
+ case CFX_GraphStateData::LineJoinBevel:
+ join = bevel_join;
+ break;
+ default:
+ join = miter_join_revert;
+ break;
+ }
+ FX_FLOAT width = pGraphState->m_LineWidth * scale;
+ FX_FLOAT unit = 1.f;
+ if (pObject2Device) {
+ unit = FXSYS_Div(1.0f, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2);
+ }
+ if (width < unit) {
+ width = unit;
+ }
+ if (pGraphState->m_DashArray == NULL) {
+ conv_stroke<path_storage> stroke(path_data);
+ stroke.line_join(join);
+ stroke.line_cap(cap);
+ stroke.miter_limit(pGraphState->m_MiterLimit);
+ stroke.width(width);
+ rasterizer.add_path_transformed(stroke, pObject2Device);
+ } else {
+ typedef conv_dash<path_storage> dash_converter;
+ dash_converter dash(path_data);
+ for (int i = 0; i < (pGraphState->m_DashCount + 1) / 2; i ++) {
+ FX_FLOAT on = pGraphState->m_DashArray[i * 2];
+ if (on <= 0.000001f) {
+ on = 1.0f / 10;
+ }
+ FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount ? on :
+ pGraphState->m_DashArray[i * 2 + 1];
+ if (off < 0) {
+ off = 0;
+ }
+ dash.add_dash(on * scale, off * scale);
+ }
+ dash.dash_start(pGraphState->m_DashPhase * scale);
+ typedef conv_stroke<dash_converter> dash_stroke;
+ dash_stroke stroke(dash);
+ stroke.line_join(join);
+ stroke.line_cap(cap);
+ stroke.miter_limit(pGraphState->m_MiterLimit);
+ stroke.width(width);
+ rasterizer.add_path_transformed(stroke, pObject2Device);
+ }
+}
+IFX_RenderDeviceDriver* IFX_RenderDeviceDriver::CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ return FX_NEW CFX_AggDeviceDriver(pBitmap, 0, bRgbByteOrder, pOriDevice, bGroupKnockout);
+}
+CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ m_pBitmap = pBitmap;
+ m_DitherBits = dither_bits;
+ m_pClipRgn = NULL;
+ m_pPlatformBitmap = NULL;
+ m_pPlatformGraphics = NULL;
+ m_pDwRenderTartget = NULL;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_pOriDevice = pOriDevice;
+ m_bGroupKnockout = bGroupKnockout;
+ m_FillFlags = 0;
+ InitPlatform();
+}
+CFX_AggDeviceDriver::~CFX_AggDeviceDriver()
+{
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ }
+ for (int i = 0; i < m_StateStack.GetSize(); i ++)
+ if (m_StateStack[i]) {
+ delete (CFX_ClipRgn*)m_StateStack[i];
+ }
+ DestroyPlatform();
+}
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ return FALSE;
+}
+#endif
+int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return FXDC_DISPLAY;
+ case FXDC_PIXEL_WIDTH:
+ return m_pBitmap->GetWidth();
+ case FXDC_PIXEL_HEIGHT:
+ return m_pBitmap->GetHeight();
+ case FXDC_BITS_PIXEL:
+ return m_pBitmap->GetBPP();
+ case FXDC_HORZ_SIZE:
+ case FXDC_VERT_SIZE:
+ return 0;
+ case FXDC_RENDER_CAPS: {
+ int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | FXRC_BLEND_MODE | FXRC_SOFT_CLIP;
+ if (m_pBitmap->HasAlpha()) {
+ flags |= FXRC_ALPHA_OUTPUT;
+ } else if (m_pBitmap->IsAlphaMask()) {
+ if (m_pBitmap->GetBPP() == 1) {
+ flags |= FXRC_BITMASK_OUTPUT;
+ } else {
+ flags |= FXRC_BYTEMASK_OUTPUT;
+ }
+ }
+ if (m_pBitmap->IsCmykImage()) {
+ flags |= FXRC_CMYK_OUTPUT;
+ }
+ return flags;
+ }
+ case FXDC_DITHER_BITS:
+ return m_DitherBits;
+ }
+ return 0;
+}
+void CFX_AggDeviceDriver::SaveState()
+{
+ void* pClip = NULL;
+ if (m_pClipRgn) {
+ pClip = FX_NEW CFX_ClipRgn(*m_pClipRgn);
+ if (!pClip) {
+ return;
+ }
+ }
+ m_StateStack.Add(pClip);
+}
+void CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+ if (m_StateStack.GetSize() == 0) {
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ m_pClipRgn = NULL;
+ }
+ return;
+ }
+ CFX_ClipRgn* pSavedClip = (CFX_ClipRgn*)m_StateStack[m_StateStack.GetSize() - 1];
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ m_pClipRgn = NULL;
+ }
+ if (bKeepSaved) {
+ if (pSavedClip) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(*pSavedClip);
+ }
+ } else {
+ m_StateStack.RemoveAt(m_StateStack.GetSize() - 1);
+ m_pClipRgn = pSavedClip;
+ }
+}
+void CFX_AggDeviceDriver::SetClipMask(rasterizer_scanline_aa& rasterizer)
+{
+ FX_RECT path_rect(rasterizer.min_x(), rasterizer.min_y(),
+ rasterizer.max_x() + 1, rasterizer.max_y() + 1);
+ path_rect.Intersect(m_pClipRgn->GetBox());
+ CFX_DIBitmapRef mask;
+ CFX_DIBitmap* pThisLayer = mask.New();
+ if (!pThisLayer) {
+ return;
+ }
+ pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask);
+ pThisLayer->Clear(0);
+ rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(), pThisLayer->GetHeight(), pThisLayer->GetPitch());
+ pixfmt_gray8 pixel_buf(raw_buf);
+ renderer_base<pixfmt_gray8> base_buf(pixel_buf);
+ renderer_scanline_aa_offset<renderer_base<pixfmt_gray8> > final_render(base_buf, path_rect.left, path_rect.top);
+ final_render.color(gray8(255));
+ scanline_u8 scanline;
+ render_scanlines(rasterizer, scanline, final_render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+ m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask);
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ m_FillFlags = fill_mode;
+ if (m_pClipRgn == NULL) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+ if (!m_pClipRgn) {
+ return FALSE;
+ }
+ }
+ if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {
+ CFX_FloatRect rectf;
+ if (pPathData->IsRect(pObject2Device, &rectf)) {
+ rectf.Intersect(CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ FX_RECT rect = rectf.GetOutterRect();
+ m_pClipRgn->IntersectRect(rect);
+ return TRUE;
+ }
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ path_data.m_PathData.end_poly();
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ rasterizer.add_path(path_data.m_PathData);
+ rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+ SetClipMask(rasterizer);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ if (m_pClipRgn == NULL) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+ if (!m_pClipRgn) {
+ return FALSE;
+ }
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, NULL);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, pGraphState);
+ rasterizer.filling_rule(fill_non_zero);
+ SetClipMask(rasterizer);
+ return TRUE;
+}
+class CFX_Renderer : public CFX_Object
+{
+private:
+ int m_Alpha,
+ m_Red,
+ m_Green,
+ m_Blue,
+ m_Gray;
+ FX_DWORD m_Color;
+ FX_BOOL m_bFullCover;
+ FX_BOOL m_bRgbByteOrder;
+ CFX_DIBitmap* m_pOriDevice;
+ FX_RECT m_ClipBox;
+ const CFX_DIBitmap* m_pClipMask;
+ CFX_DIBitmap* m_pDevice;
+ const CFX_ClipRgn* m_pClipRgn;
+ void (CFX_Renderer::*composite_span)(FX_LPBYTE, int, int, int, FX_LPBYTE, int, int, FX_LPBYTE, FX_LPBYTE);
+public:
+ void prepare(unsigned) {}
+ void CompositeSpan(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan, int Bpp, FX_BOOL bDestAlpha,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan)
+ {
+ ASSERT(!m_pDevice->IsCmykImage());
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ if (Bpp) {
+ dest_scan += col_start * Bpp;
+ ori_scan += col_start * Bpp;
+ } else {
+ dest_scan += col_start / 8;
+ ori_scan += col_start / 8;
+ }
+ if (m_bRgbByteOrder) {
+ if (Bpp == 4 && bDestAlpha) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ FX_BYTE dest_alpha = ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (m_bFullCover) {
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+ dest_scan++;
+ ori_scan++;
+ } else {
+ int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+ int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+ ori_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+ dest_scan += 2;
+ }
+ }
+ return;
+ } else if (Bpp == 3 || Bpp == 4) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255 ;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha);
+ ori_scan += Bpp - 2;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+ dest_scan += Bpp - 2;
+ }
+ }
+ return;
+ }
+ if (Bpp == 4 && bDestAlpha) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ int src_alpha_covered = src_alpha * cover_scan[col] / 255;
+ if (src_alpha_covered == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ if (cover_scan[col] == 255) {
+ dest_scan[3] = src_alpha_covered;
+ *dest_scan ++ = m_Blue;
+ *dest_scan ++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ } else {
+ if (dest_scan[3] == 0) {
+ dest_scan[3] = src_alpha_covered;
+ *dest_scan ++ = m_Blue;
+ *dest_scan ++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ }
+ FX_BYTE cover = cover_scan[col];
+ dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover);
+ dest_scan += 2;
+ }
+ }
+ return;
+ } else if (Bpp == 3 || Bpp == 4) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ if (m_bFullCover) {
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+ dest_scan += Bpp - 2;
+ ori_scan += Bpp - 2;
+ continue;
+ }
+ int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+ ori_scan += Bpp - 2;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ return;
+ } else if (Bpp == 1) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ if (m_bFullCover) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+ } else {
+ int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]);
+ dest_scan++;
+ }
+ }
+ } else {
+ int index = 0;
+ if (m_pDevice->GetPalette() == NULL) {
+ index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+ index = i;
+ }
+ }
+ FX_LPBYTE dest_scan1 = dest_scan;
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (!index) {
+ *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+ } else {
+ *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+ }
+ }
+ dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+ }
+ }
+ }
+ void CompositeSpan1bpp(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ ASSERT(!m_pDevice->IsCmykImage());
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start / 8;
+ int index = 0;
+ if (m_pDevice->GetPalette() == NULL) {
+ index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+ index = i;
+ }
+ }
+ FX_LPBYTE dest_scan1 = dest_scan;
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (!index) {
+ *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+ } else {
+ *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+ }
+ }
+ dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+ }
+ }
+ void CompositeSpanGray(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start;
+ Bpp;
+ if (dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan = m_Gray;
+ *dest_extra_alpha_scan = m_Alpha;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan ++;
+ dest_scan ++;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan = m_Gray;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+ }
+ }
+ dest_scan ++;
+ }
+ }
+ }
+ void CompositeSpanARGB(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * Bpp;
+ if (m_bRgbByteOrder) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else {
+ FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan += 2;
+ continue;
+ }
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else {
+ if (dest_scan[3] == 0) {
+ dest_scan[3] = src_alpha;
+ *dest_scan++ = m_Blue;
+ *dest_scan++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ }
+ FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan += 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ }
+ void CompositeSpanRGB(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * Bpp;
+ if (m_bRgbByteOrder) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ if (Bpp == 4) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else if (Bpp == 3) {
+ *dest_scan++ = m_Red;
+ *dest_scan++ = m_Green;
+ *dest_scan++ = m_Blue;
+ continue;
+ }
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ if (Bpp == 3 && dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan++ = (FX_BYTE)m_Blue;
+ *dest_scan++ = (FX_BYTE)m_Green;
+ *dest_scan++ = (FX_BYTE)m_Red;
+ *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;
+ continue;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan++;
+ dest_scan += Bpp;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ if (Bpp == 4) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else if (Bpp == 3) {
+ *dest_scan++ = m_Blue;
+ *dest_scan++ = m_Green;
+ *dest_scan++ = m_Red;
+ continue;
+ }
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ }
+ }
+ void CompositeSpanCMYK(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * 4;
+ Bpp;
+ if (dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_CMYK*)dest_scan = m_Color;
+ *dest_extra_alpha_scan = (FX_BYTE)m_Alpha;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan++;
+ dest_scan += 4;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_CMYK*)dest_scan = m_Color;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_scan += 4;
+ }
+ }
+ }
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ if (m_pOriDevice == NULL && composite_span == NULL) {
+ return;
+ }
+ int y = sl.y();
+ if (y < m_ClipBox.top || y >= m_ClipBox.bottom) {
+ return;
+ }
+ FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y;
+ FX_LPBYTE dest_scan_extra_alpha = NULL;
+ CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask;
+ if (pAlphaMask) {
+ dest_scan_extra_alpha = pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y;
+ }
+ FX_LPBYTE ori_scan = NULL;
+ if (m_pOriDevice) {
+ ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y;
+ }
+ int Bpp = m_pDevice->GetBPP() / 8;
+ FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask();
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ while (1) {
+ int x = span->x;
+ ASSERT(span->len > 0);
+ FX_LPBYTE dest_pos = NULL;
+ FX_LPBYTE dest_extra_alpha_pos = NULL;
+ FX_LPBYTE ori_pos = NULL;
+ if (Bpp) {
+ ori_pos = ori_scan ? ori_scan + x * Bpp : NULL;
+ dest_pos = dest_scan + x * Bpp;
+ dest_extra_alpha_pos = dest_scan_extra_alpha ? dest_scan_extra_alpha + x : NULL;
+ } else {
+ dest_pos = dest_scan + x / 8;
+ ori_pos = ori_scan ? ori_scan + x / 8 : NULL;
+ }
+ FX_LPBYTE clip_pos = NULL;
+ if (m_pClipMask) {
+ clip_pos = m_pClipMask->GetBuffer() + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - m_ClipBox.left;
+ }
+ if (ori_pos) {
+ CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos);
+ } else {
+ (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos, dest_extra_alpha_pos);
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+
+ FX_BOOL Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ m_pDevice = pDevice;
+ m_pClipRgn = pClipRgn;
+ composite_span = NULL;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_pOriDevice = pOriDevice;
+ if (m_pClipRgn) {
+ m_ClipBox = m_pClipRgn->GetBox();
+ } else {
+ m_ClipBox.left = m_ClipBox.top = 0;
+ m_ClipBox.right = m_pDevice->GetWidth();
+ m_ClipBox.bottom = m_pDevice->GetHeight();
+ }
+ m_pClipMask = NULL;
+ if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+ m_pClipMask = m_pClipRgn->GetMask();
+ }
+ m_bFullCover = bFullCover;
+ FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ FX_BOOL bDeviceCMYK = pDevice->IsCmykImage();
+ m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ ICodec_IccModule* pIccModule = NULL;
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ } else {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (m_pDevice->GetBPP() == 8) {
+ ASSERT(!m_bRgbByteOrder);
+ composite_span = &CFX_Renderer::CompositeSpanGray;
+ if (m_pDevice->IsAlphaMask()) {
+ m_Gray = 255;
+ } else {
+ if (pIccTransform) {
+ FX_BYTE gray;
+ color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, &gray, (FX_LPCBYTE)&color, 1);
+ m_Gray = gray;
+ } else {
+ if (bObjectCMYK) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ r, g, b);
+ m_Gray = FXRGB2GRAY(r, g, b);
+ } else {
+ m_Gray = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+ }
+ }
+ }
+ return TRUE;
+ }
+ if (bDeviceCMYK) {
+ ASSERT(!m_bRgbByteOrder);
+ composite_span = &CFX_Renderer::CompositeSpanCMYK;
+ if (bObjectCMYK) {
+ m_Color = FXCMYK_TODIB(color);
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1);
+ }
+ } else {
+ if (!pIccTransform) {
+ return FALSE;
+ }
+ color = FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+ }
+ m_Red = ((FX_LPBYTE)&m_Color)[0];
+ m_Green = ((FX_LPBYTE)&m_Color)[1];
+ m_Blue = ((FX_LPBYTE)&m_Color)[2];
+ m_Gray = ((FX_LPBYTE)&m_Color)[3];
+ } else {
+ composite_span = (pDevice->GetFormat() == FXDIB_Argb) ? &CFX_Renderer::CompositeSpanARGB : &CFX_Renderer::CompositeSpanRGB;
+ if (pIccTransform) {
+ color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+ ((FX_LPBYTE)&m_Color)[3] = m_Alpha;
+ m_Red = ((FX_LPBYTE)&m_Color)[2];
+ m_Green = ((FX_LPBYTE)&m_Color)[1];
+ m_Blue = ((FX_LPBYTE)&m_Color)[0];
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TODIB(m_Color);
+ m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+ }
+ } else {
+ if (bObjectCMYK) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ r, g, b);
+ m_Color = FXARGB_MAKE(m_Alpha, r, g, b);
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+ } else {
+ m_Color = FXARGB_TODIB(m_Color);
+ }
+ m_Red = r;
+ m_Green = g;
+ m_Blue = b;
+ } else {
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TOBGRORDERDIB(color);
+ } else {
+ m_Color = FXARGB_TODIB(color);
+ }
+ ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue);
+ }
+ }
+ }
+ if (m_pDevice->GetBPP() == 1) {
+ composite_span = &CFX_Renderer::CompositeSpan1bpp;
+ }
+ return TRUE;
+ }
+};
+FX_BOOL CFX_AggDeviceDriver::RenderRasterizer(rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+ int alpha_flag, void* pIccTransform)
+{
+ CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : NULL;
+ CFX_Renderer render;
+ if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, m_bRgbByteOrder, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ scanline_u8 scanline;
+ render_scanlines(rasterizer, scanline, render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (GetBuffer() == NULL) {
+ return TRUE;
+ }
+ m_FillFlags = fill_mode;
+ if ((fill_mode & 3) && fill_color) {
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ rasterizer.add_path(path_data.m_PathData);
+ rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+ if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, FALSE, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+ if (pGraphState && stroke_alpha) {
+ if (fill_mode & FX_ZEROAREA_FILL) {
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, NULL, pGraphState, 1, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+ int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+ return FALSE;
+ }
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix1, matrix2;
+ if (pObject2Device) {
+ matrix1.a = FX_MAX(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b));
+ matrix1.d = matrix1.a;
+ matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
+ pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d,
+ 0, 0);
+ CFX_AffineMatrix mtRervese;
+ mtRervese.SetReverse(matrix2);
+ matrix1 = *pObject2Device;
+ matrix1.Concat(mtRervese);
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, &matrix1);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+ int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, FX_DWORD argb)
+{
+ if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) {
+ return;
+ }
+ FX_LPBYTE pos = (FX_BYTE*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + x * pBitmap->GetBPP() / 8;
+ if (pBitmap->GetFormat() == FXDIB_Argb) {
+ FXARGB_SETRGBORDERDIB(pos, ArgbGamma(argb));
+ } else {
+ int alpha = FXARGB_A(argb);
+ pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255;
+ pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255;
+ pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255;
+ }
+}
+void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, int left, int top, int width, int height, FX_ARGB argb)
+{
+ int src_alpha = FXARGB_A(argb);
+ if (src_alpha == 0) {
+ return;
+ }
+ FX_RECT rect(left, top, left + width, top + height);
+ rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ width = rect.Width();
+ int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb);
+ int Bpp = pBitmap->GetBPP() / 8;
+ FX_BOOL bAlpha = pBitmap->HasAlpha();
+ int dib_argb = FXARGB_TOBGRORDERDIB(argb);
+ FX_BYTE* pBuffer = pBitmap->GetBuffer();
+ if (src_alpha == 255) {
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+ if (Bpp == 4) {
+ FX_DWORD* scan = (FX_DWORD*)dest_scan;
+ for (int col = 0; col < width; col ++) {
+ *scan ++ = dib_argb;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan ++ = src_r;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_b;
+ }
+ }
+ }
+ return;
+ }
+ src_r = FX_GAMMA(src_r);
+ src_g = FX_GAMMA(src_g);
+ src_b = FX_GAMMA(src_b);
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+ if (bAlpha) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan += 2;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_r, src_alpha));
+ dest_scan++;
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_g, src_alpha));
+ dest_scan++;
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_b, src_alpha));
+ dest_scan++;
+ if (Bpp == 4) {
+ dest_scan++;
+ }
+ }
+ }
+ }
+}
+void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ if (pBitmap == NULL) {
+ return;
+ }
+ pBitmap->GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return;
+ }
+ int Bpp = pBitmap->GetBPP() / 8;
+ FXDIB_Format dest_format = pBitmap->GetFormat();
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ int pitch = pBitmap->GetPitch();
+ FX_BYTE* buffer = pBitmap->GetBuffer();
+ if (dest_format == src_format) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
+ FX_LPBYTE src_scan = (FX_LPBYTE)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ if (Bpp == 4) {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], src_scan[1], src_scan[2]));
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = src_scan[0];
+ src_scan += 3;
+ }
+ }
+ }
+ return;
+ }
+ int src_pitch = pSrcBitmap->GetPitch();
+ FX_ARGB* src_pal = pSrcBitmap->GetPalette();
+ FX_LPBYTE dest_buf = buffer + dest_top * pitch + dest_left * Bpp;
+ if (dest_format == FXDIB_Rgb) {
+ if (src_format == FXDIB_Rgb32) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * pitch;
+ FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = src_scan[0];
+ src_scan += 4;
+ }
+ }
+ } else {
+ ASSERT(FALSE);
+ }
+ } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) {
+ if (src_format == FXDIB_Rgb) {
+ for (int row = 0; row < height; row ++) {
+ FX_BYTE* dest_scan = (FX_BYTE*)(dest_buf + row * pitch);
+ FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ if (src_format == FXDIB_Argb) {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, FX_GAMMA(src_scan[0]), FX_GAMMA(src_scan[1]), FX_GAMMA(src_scan[2])));
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ }
+ } else if (src_format == FXDIB_Rgb32) {
+ ASSERT(dest_format == FXDIB_Argb);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * pitch;
+ FX_LPBYTE src_scan = (FX_LPBYTE)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4);
+ for (int col = 0; col < width; col++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ src_scan += 4;
+ dest_scan += 4;
+ }
+ }
+ }
+ } else {
+ ASSERT(FALSE);
+ }
+}
+FX_ARGB _DefaultCMYK2ARGB(FX_CMYK cmyk, FX_BYTE alpha)
+{
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ return ArgbEncode(alpha, r, g, b);
+}
+FX_BOOL _DibSetPixel(CFX_DIBitmap* pDevice, int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPBYTE)&color, 1);
+ color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ if (!pDevice->IsCmykImage()) {
+ color = (color & 0xffffff) | (alpha << 24);
+ }
+ } else {
+ if (pDevice->IsCmykImage()) {
+ if (!bObjCMYK) {
+ return FALSE;
+ }
+ } else {
+ if (bObjCMYK) {
+ color = _DefaultCMYK2ARGB(color, alpha);
+ }
+ }
+ }
+ pDevice->SetPixel(x, y, color);
+ if (pDevice->m_pAlphaMask) {
+ pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ if (m_pClipRgn == NULL) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+ } else {
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ } else if (m_pClipRgn->GetBox().Contains(x, y)) {
+ if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+ } else {
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ } else if (m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+ const CFX_DIBitmap* pMask = m_pClipRgn->GetMask();
+ FX_BOOL bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ int new_alpha = bCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ new_alpha = new_alpha * pMask->GetScanline(y)[x] / 255;
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, (color & 0xffffff) | (new_alpha << 24));
+ return TRUE;
+ }
+ if (bCMYK) {
+ FXSETFLAG_ALPHA_FILL(alpha_flag, new_alpha);
+ } else {
+ color = (color & 0xffffff) | (new_alpha << 24);
+ }
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ FX_RECT clip_rect;
+ GetClipBox(&clip_rect);
+ FX_RECT draw_rect = clip_rect;
+ if (pRect) {
+ draw_rect.Intersect(*pRect);
+ }
+ if (draw_rect.IsEmpty()) {
+ return TRUE;
+ }
+ if (m_pClipRgn == NULL || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color);
+ } else {
+ m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color, alpha_flag, pIccTransform);
+ }
+ return TRUE;
+ }
+ m_pBitmap->CompositeMask(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), (const CFX_DIBitmap*)m_pClipRgn->GetMask(),
+ fill_color, draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, FXDIB_BLEND_NORMAL, NULL, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+ if (m_pClipRgn == NULL) {
+ pRect->left = pRect->top = 0;
+ pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH);
+ pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+ return TRUE;
+ }
+ *pRect = m_pClipRgn->GetBox();
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (bDEdge) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderTransferBitmap(pBitmap, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top);
+ } else {
+ return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top, pIccTransform);
+ }
+ return TRUE;
+ }
+ FX_RECT rect(left, top, left + pBitmap->GetWidth(), top + pBitmap->GetHeight());
+ CFX_DIBitmap *pBack = NULL;
+ if (m_pOriDevice) {
+ pBack = m_pOriDevice->Clone(&rect);
+ if (!pBack) {
+ return TRUE;
+ }
+ pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), m_pBitmap, 0, 0);
+ } else {
+ pBack = m_pBitmap->Clone(&rect);
+ }
+ if (!pBack) {
+ return TRUE;
+ }
+ FX_BOOL bRet = TRUE;
+ left = left >= 0 ? 0 : left;
+ top = top >= 0 ? 0 : top;
+ if (m_bRgbByteOrder) {
+ RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), pBack, left, top);
+ } else {
+ bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, left, top, pIccTransform);
+ }
+ delete pBack;
+ return bRet;
+}
+FX_BOOL CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD argb, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (pBitmap->IsAlphaMask())
+ return m_pBitmap->CompositeMask(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,
+ pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ return m_pBitmap->CompositeBitmap(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap,
+ pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, pIccTransform);
+}
+FX_BOOL CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD argb, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (dest_width == pSource->GetWidth() && dest_height == pSource->GetHeight()) {
+ FX_RECT rect(0, 0, dest_width, dest_height);
+ return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type, alpha_flag, pIccTransform);
+ }
+ FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+ dest_rect.Normalize();
+ FX_RECT dest_clip = dest_rect;
+ dest_clip.Intersect(*pClipRect);
+ CFX_BitmapComposer composer;
+ composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, blend_type);
+ dest_clip.Offset(-dest_rect.left, -dest_rect.top);
+ CFX_ImageStretcher stretcher;
+ if (stretcher.Start(&composer, pSource, dest_width, dest_height, dest_clip, flags)) {
+ stretcher.Continue(NULL);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD argb,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ CFX_ImageRenderer* pRenderer = FX_NEW CFX_ImageRenderer;
+ if (!pRenderer) {
+ return FALSE;
+ }
+ pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, render_flags, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ handle = pRenderer;
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::ContinueDIBits(FX_LPVOID pHandle, IFX_Pause* pPause)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ return ((CFX_ImageRenderer*)pHandle)->Continue(pPause);
+}
+void CFX_AggDeviceDriver::CancelDIBits(FX_LPVOID pHandle)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return;
+ }
+ delete (CFX_ImageRenderer*)pHandle;
+}
+CFX_FxgeDevice::CFX_FxgeDevice()
+{
+ m_bOwnedBitmap = FALSE;
+}
+FX_BOOL CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ SetBitmap(pBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_FxgeDevice::Create(int width, int height, FXDIB_Format format, int dither_bits, CFX_DIBitmap* pOriDevice)
+{
+ m_bOwnedBitmap = TRUE;
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return FALSE;
+ }
+ if (!pBitmap->Create(width, height, format)) {
+ delete pBitmap;
+ return FALSE;
+ }
+ SetBitmap(pBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+CFX_FxgeDevice::~CFX_FxgeDevice()
+{
+ if (m_bOwnedBitmap && GetBitmap()) {
+ delete GetBitmap();
+ }
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
new file mode 100644
index 0000000000..8c4b701ebe
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
@@ -0,0 +1,104 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Class path_storage
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_path_storage.h"
+#include "agg_math.h"
+namespace agg
+{
+path_storage::~path_storage()
+{
+ if(m_total_blocks) {
+ FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1;
+ while(m_total_blocks--) {
+ FX_Free(*coord_blk);
+ --coord_blk;
+ }
+ FX_Free(m_coord_blocks);
+ }
+}
+path_storage::path_storage() :
+ m_total_vertices(0),
+ m_total_blocks(0),
+ m_max_blocks(0),
+ m_coord_blocks(0),
+ m_cmd_blocks(0),
+ m_iterator(0)
+{
+}
+void path_storage::allocate_block(unsigned nb)
+{
+ if(nb >= m_max_blocks) {
+ FX_FLOAT** new_coords =
+ FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2);
+ if (!new_coords) {
+ return;
+ }
+ unsigned char** new_cmds =
+ (unsigned char**)(new_coords + m_max_blocks + block_pool);
+ if(m_coord_blocks) {
+ FXSYS_memcpy32(new_coords,
+ m_coord_blocks,
+ m_max_blocks * sizeof(FX_FLOAT*));
+ FXSYS_memcpy32(new_cmds,
+ m_cmd_blocks,
+ m_max_blocks * sizeof(unsigned char*));
+ FX_Free(m_coord_blocks);
+ }
+ m_coord_blocks = new_coords;
+ m_cmd_blocks = new_cmds;
+ m_max_blocks += block_pool;
+ }
+ m_coord_blocks[nb] =
+ FX_Alloc( FX_FLOAT, block_size * 2 +
+ block_size /
+ (sizeof(FX_FLOAT) / sizeof(unsigned char)));
+ if (!m_coord_blocks[nb]) {
+ return;
+ }
+ m_cmd_blocks[nb] =
+ (unsigned char*)(m_coord_blocks[nb] + block_size * 2);
+ m_total_blocks++;
+}
+void path_storage::rewind(unsigned path_id)
+{
+ m_iterator = path_id;
+}
+void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+ FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+ FX_FLOAT x_to, FX_FLOAT y_to)
+{
+ add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
+ add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
+ add_vertex(x_to, y_to, path_cmd_curve4);
+}
+void path_storage::end_poly()
+{
+ if(m_total_vertices) {
+ if(is_vertex(command(m_total_vertices - 1))) {
+ add_vertex(0, 0, path_cmd_end_poly | path_flags_close);
+ }
+ }
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000000..634d10a3be
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,495 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// This file uses only integer data, so it's suitable for all platforms.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// Class outline_aa - implementation.
+//
+// Initially the rendering algorithm was designed by David Turner and the
+// other authors of the FreeType library - see the above notice. I nearly
+// created a similar renderer, but still I was far from David's work.
+// I completely redesigned the original code and adapted it for Anti-Grain
+// ideas. Two functions - render_line and render_hline are the core of
+// the algorithm - they calculate the exact coverage of each pixel cell
+// of the polygon. I left these functions almost as is, because there's
+// no way to improve the perfection - hats off to David and his group!
+//
+// All other code is very different from the original.
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_ext.h"
+#include <limits.h>
+#include "agg_rasterizer_scanline_aa.h"
+namespace agg
+{
+AGG_INLINE void cell_aa::set_cover(int c, int a)
+{
+ cover = c;
+ area = a;
+}
+AGG_INLINE void cell_aa::add_cover(int c, int a)
+{
+ cover += c;
+ area += a;
+}
+AGG_INLINE void cell_aa::set_coord(int cx, int cy)
+{
+ x = cx;
+ y = cy;
+}
+AGG_INLINE void cell_aa::set(int cx, int cy, int c, int a)
+{
+ x = cx;
+ y = cy;
+ cover = c;
+ area = a;
+}
+outline_aa::~outline_aa()
+{
+ if(m_num_blocks) {
+ cell_aa** ptr = m_cells + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*ptr);
+ ptr--;
+ }
+ FX_Free(m_cells);
+ }
+}
+outline_aa::outline_aa() :
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_cur_block(0),
+ m_num_cells(0),
+ m_cells(0),
+ m_cur_cell_ptr(0),
+ m_cur_x(0),
+ m_cur_y(0),
+ m_min_x(0x7FFFFFFF),
+ m_min_y(0x7FFFFFFF),
+ m_max_x(-0x7FFFFFFF),
+ m_max_y(-0x7FFFFFFF),
+ m_sorted(false)
+{
+ m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+}
+void outline_aa::reset()
+{
+ m_num_cells = 0;
+ m_cur_block = 0;
+ m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+ m_sorted = false;
+ m_min_x = 0x7FFFFFFF;
+ m_min_y = 0x7FFFFFFF;
+ m_max_x = -0x7FFFFFFF;
+ m_max_y = -0x7FFFFFFF;
+}
+void outline_aa::allocate_block()
+{
+ if(m_cur_block >= m_num_blocks) {
+ if(m_num_blocks >= m_max_blocks) {
+ cell_aa** new_cells = FX_Alloc( cell_aa*, m_max_blocks + cell_block_pool);
+ if (!new_cells) {
+ return;
+ }
+ if(m_cells) {
+ FXSYS_memcpy32(new_cells, m_cells, m_max_blocks * sizeof(cell_aa*));
+ FX_Free(m_cells);
+ }
+ m_cells = new_cells;
+ m_max_blocks += cell_block_pool;
+ }
+ m_cells[m_num_blocks++] = FX_Alloc(cell_aa, cell_block_size);
+ if (!m_cells[m_num_blocks - 1]) {
+ return;
+ }
+ }
+ m_cur_cell_ptr = m_cells[m_cur_block++];
+}
+AGG_INLINE void outline_aa::add_cur_cell()
+{
+ if(m_cur_cell.area | m_cur_cell.cover) {
+ if((m_num_cells & cell_block_mask) == 0) {
+ if(m_num_blocks >= cell_block_limit) {
+ return;
+ }
+ allocate_block();
+ }
+ *m_cur_cell_ptr++ = m_cur_cell;
+ ++m_num_cells;
+ }
+}
+AGG_INLINE void outline_aa::set_cur_cell(int x, int y)
+{
+ if(m_cur_cell.x != x || m_cur_cell.y != y) {
+ add_cur_cell();
+ m_cur_cell.set(x, y, 0, 0);
+ if(x < m_min_x) {
+ m_min_x = x;
+ }
+ if(x > m_max_x) {
+ m_max_x = x;
+ }
+ if(y < m_min_y) {
+ m_min_y = y;
+ }
+ if(y > m_max_y) {
+ m_max_y = y;
+ }
+ }
+}
+AGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2)
+{
+ int ex1 = x1 >> poly_base_shift;
+ int ex2 = x2 >> poly_base_shift;
+ int fx1 = x1 & poly_base_mask;
+ int fx2 = x2 & poly_base_mask;
+ int delta, p, first, dx;
+ int incr, lift, mod, rem;
+ if(y1 == y2) {
+ set_cur_cell(ex2, ey);
+ return;
+ }
+ if(ex1 == ex2) {
+ delta = y2 - y1;
+ m_cur_cell.add_cover(delta, (fx1 + fx2) * delta);
+ return;
+ }
+ p = (poly_base_size - fx1) * (y2 - y1);
+ first = poly_base_size;
+ incr = 1;
+ dx = x2 - x1;
+ if(dx < 0) {
+ p = fx1 * (y2 - y1);
+ first = 0;
+ incr = -1;
+ dx = -dx;
+ }
+ delta = p / dx;
+ mod = p % dx;
+ if(mod < 0) {
+ delta--;
+ mod += dx;
+ }
+ m_cur_cell.add_cover(delta, (fx1 + first) * delta);
+ ex1 += incr;
+ set_cur_cell(ex1, ey);
+ y1 += delta;
+ if(ex1 != ex2) {
+ p = poly_base_size * (y2 - y1 + delta);
+ lift = p / dx;
+ rem = p % dx;
+ if (rem < 0) {
+ lift--;
+ rem += dx;
+ }
+ mod -= dx;
+ while (ex1 != ex2) {
+ delta = lift;
+ mod += rem;
+ if(mod >= 0) {
+ mod -= dx;
+ delta++;
+ }
+ m_cur_cell.add_cover(delta, (poly_base_size) * delta);
+ y1 += delta;
+ ex1 += incr;
+ set_cur_cell(ex1, ey);
+ }
+ }
+ delta = y2 - y1;
+ m_cur_cell.add_cover(delta, (fx2 + poly_base_size - first) * delta);
+}
+void outline_aa::render_line(int x1, int y1, int x2, int y2)
+{
+ enum dx_limit_e { dx_limit = 16384 << poly_base_shift };
+ int dx = x2 - x1;
+ if(dx >= dx_limit || dx <= -dx_limit) {
+ int cx = (x1 + x2) >> 1;
+ int cy = (y1 + y2) >> 1;
+ render_line(x1, y1, cx, cy);
+ render_line(cx, cy, x2, y2);
+ }
+ int dy = y2 - y1;
+ int ey1 = y1 >> poly_base_shift;
+ int ey2 = y2 >> poly_base_shift;
+ int fy1 = y1 & poly_base_mask;
+ int fy2 = y2 & poly_base_mask;
+ int x_from, x_to;
+ int p, rem, mod, lift, delta, first, incr;
+ if(ey1 == ey2) {
+ render_hline(ey1, x1, fy1, x2, fy2);
+ return;
+ }
+ incr = 1;
+ if(dx == 0) {
+ int ex = x1 >> poly_base_shift;
+ int two_fx = (x1 - (ex << poly_base_shift)) << 1;
+ int area;
+ first = poly_base_size;
+ if(dy < 0) {
+ first = 0;
+ incr = -1;
+ }
+ x_from = x1;
+ delta = first - fy1;
+ m_cur_cell.add_cover(delta, two_fx * delta);
+ ey1 += incr;
+ set_cur_cell(ex, ey1);
+ delta = first + first - poly_base_size;
+ area = two_fx * delta;
+ while(ey1 != ey2) {
+ m_cur_cell.set_cover(delta, area);
+ ey1 += incr;
+ set_cur_cell(ex, ey1);
+ }
+ delta = fy2 - poly_base_size + first;
+ m_cur_cell.add_cover(delta, two_fx * delta);
+ return;
+ }
+ p = (poly_base_size - fy1) * dx;
+ first = poly_base_size;
+ if(dy < 0) {
+ p = fy1 * dx;
+ first = 0;
+ incr = -1;
+ dy = -dy;
+ }
+ delta = p / dy;
+ mod = p % dy;
+ if(mod < 0) {
+ delta--;
+ mod += dy;
+ }
+ x_from = x1 + delta;
+ render_hline(ey1, x1, fy1, x_from, first);
+ ey1 += incr;
+ set_cur_cell(x_from >> poly_base_shift, ey1);
+ if(ey1 != ey2) {
+ p = poly_base_size * dx;
+ lift = p / dy;
+ rem = p % dy;
+ if(rem < 0) {
+ lift--;
+ rem += dy;
+ }
+ mod -= dy;
+ while(ey1 != ey2) {
+ delta = lift;
+ mod += rem;
+ if (mod >= 0) {
+ mod -= dy;
+ delta++;
+ }
+ x_to = x_from + delta;
+ render_hline(ey1, x_from, poly_base_size - first, x_to, first);
+ x_from = x_to;
+ ey1 += incr;
+ set_cur_cell(x_from >> poly_base_shift, ey1);
+ }
+ }
+ render_hline(ey1, x_from, poly_base_size - first, x2, fy2);
+}
+void outline_aa::move_to(int x, int y)
+{
+ if(m_sorted) {
+ reset();
+ }
+ set_cur_cell(x >> poly_base_shift, y >> poly_base_shift);
+ m_cur_x = x;
+ m_cur_y = y;
+}
+void outline_aa::line_to(int x, int y)
+{
+ render_line(m_cur_x, m_cur_y, x, y);
+ m_cur_x = x;
+ m_cur_y = y;
+ m_sorted = false;
+}
+template <class T> static AGG_INLINE void swap_cells(T* a, T* b)
+{
+ T temp = *a;
+ *a = *b;
+ *b = temp;
+}
+enum {
+ qsort_threshold = 9
+};
+static void qsort_cells(cell_aa** start, unsigned num)
+{
+ cell_aa** stack[80];
+ cell_aa*** top;
+ cell_aa** limit;
+ cell_aa** base;
+ limit = start + num;
+ base = start;
+ top = stack;
+ for (;;) {
+ int len = int(limit - base);
+ cell_aa** i;
+ cell_aa** j;
+ cell_aa** pivot;
+ if(len > qsort_threshold) {
+ pivot = base + len / 2;
+ swap_cells(base, pivot);
+ i = base + 1;
+ j = limit - 1;
+ if((*j)->x < (*i)->x) {
+ swap_cells(i, j);
+ }
+ if((*base)->x < (*i)->x) {
+ swap_cells(base, i);
+ }
+ if((*j)->x < (*base)->x) {
+ swap_cells(base, j);
+ }
+ for(;;) {
+ int x = (*base)->x;
+ do {
+ i++;
+ } while( (*i)->x < x );
+ do {
+ j--;
+ } while( x < (*j)->x );
+ if(i > j) {
+ break;
+ }
+ swap_cells(i, j);
+ }
+ swap_cells(base, j);
+ if(j - base > limit - i) {
+ top[0] = base;
+ top[1] = j;
+ base = i;
+ } else {
+ top[0] = i;
+ top[1] = limit;
+ limit = j;
+ }
+ top += 2;
+ } else {
+ j = base;
+ i = j + 1;
+ for(; i < limit; j = i, i++) {
+ for(; j[1]->x < (*j)->x; j--) {
+ swap_cells(j + 1, j);
+ if (j == base) {
+ break;
+ }
+ }
+ }
+ if(top > stack) {
+ top -= 2;
+ base = top[0];
+ limit = top[1];
+ } else {
+ break;
+ }
+ }
+ }
+}
+void outline_aa::sort_cells()
+{
+ if(m_sorted) {
+ return;
+ }
+ add_cur_cell();
+ if(m_num_cells == 0) {
+ return;
+ }
+ m_sorted_cells.allocate(m_num_cells, 16);
+ if (m_max_y > 0 && m_min_y < 0 && -m_min_y > INT_MAX - m_max_y) {
+ return;
+ }
+ unsigned size = m_max_y - m_min_y;
+ if (size + 1 < size) {
+ return;
+ }
+ size++;
+ m_sorted_y.allocate(size, 16);
+ m_sorted_y.zero();
+ cell_aa** block_ptr = m_cells;
+ cell_aa* cell_ptr = NULL;
+ unsigned nb = m_num_cells >> cell_block_shift;
+ unsigned i;
+ while(nb--) {
+ cell_ptr = *block_ptr++;
+ i = cell_block_size;
+ while(i--) {
+ m_sorted_y[cell_ptr->y - m_min_y].start++;
+ ++cell_ptr;
+ }
+ }
+ i = m_num_cells & cell_block_mask;
+ if (i) {
+ cell_ptr = *block_ptr++;
+ }
+ while(i--) {
+ m_sorted_y[cell_ptr->y - m_min_y].start++;
+ ++cell_ptr;
+ }
+ unsigned start = 0;
+ for(i = 0; i < m_sorted_y.size(); i++) {
+ unsigned v = m_sorted_y[i].start;
+ m_sorted_y[i].start = start;
+ start += v;
+ }
+ block_ptr = m_cells;
+ nb = m_num_cells >> cell_block_shift;
+ while(nb--) {
+ cell_ptr = *block_ptr++;
+ i = cell_block_size;
+ while(i--) {
+ sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+ m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+ ++cur_y.num;
+ ++cell_ptr;
+ }
+ }
+ i = m_num_cells & cell_block_mask;
+ if (i) {
+ cell_ptr = *block_ptr++;
+ }
+ while(i--) {
+ sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+ m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+ ++cur_y.num;
+ ++cell_ptr;
+ }
+ for(i = 0; i < m_sorted_y.size(); i++) {
+ const sorted_y& cur_y = m_sorted_y[i];
+ if(cur_y.num) {
+ qsort_cells(m_sorted_cells.data() + cur_y.start, cur_y.num);
+ }
+ }
+ m_sorted = true;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000000..0b6c29051b
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
@@ -0,0 +1,176 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_dash.h"
+#include "agg_shorten_path.h"
+namespace agg
+{
+vcgen_dash::vcgen_dash() :
+ m_total_dash_len(0),
+ m_num_dashes(0),
+ m_dash_start(0),
+ m_shorten(0),
+ m_curr_dash_start(0),
+ m_curr_dash(0),
+ m_src_vertices(),
+ m_closed(0),
+ m_status(initial),
+ m_src_vertex(0)
+{
+}
+void vcgen_dash::remove_all_dashes()
+{
+ m_total_dash_len = 0;
+ m_num_dashes = 0;
+ m_curr_dash_start = 0;
+ m_curr_dash = 0;
+}
+void vcgen_dash::add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+{
+ if(m_num_dashes < max_dashes) {
+ m_total_dash_len += dash_len + gap_len;
+ m_dashes[m_num_dashes++] = dash_len;
+ m_dashes[m_num_dashes++] = gap_len;
+ }
+}
+void vcgen_dash::dash_start(FX_FLOAT ds)
+{
+ m_dash_start = ds;
+ calc_dash_start(FXSYS_fabs(ds));
+}
+void vcgen_dash::calc_dash_start(FX_FLOAT ds)
+{
+ m_curr_dash = 0;
+ m_curr_dash_start = 0;
+ while(ds > 0) {
+ if(ds > m_dashes[m_curr_dash]) {
+ ds -= m_dashes[m_curr_dash];
+ ++m_curr_dash;
+ m_curr_dash_start = 0;
+ if(m_curr_dash >= m_num_dashes) {
+ m_curr_dash = 0;
+ }
+ } else {
+ m_curr_dash_start = ds;
+ ds = 0;
+ }
+ }
+}
+void vcgen_dash::remove_all()
+{
+ m_status = initial;
+ m_src_vertices.remove_all();
+ m_closed = 0;
+}
+void vcgen_dash::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ m_status = initial;
+ if(is_move_to(cmd)) {
+ m_src_vertices.modify_last(vertex_dist(x, y));
+ } else {
+ if(is_vertex(cmd)) {
+ m_src_vertices.add(vertex_dist(x, y));
+ } else {
+ m_closed = get_close_flag(cmd);
+ }
+ }
+}
+void vcgen_dash::rewind(unsigned)
+{
+ if(m_status == initial) {
+ m_src_vertices.close(m_closed != 0);
+ shorten_path(m_src_vertices, m_shorten, m_closed);
+ }
+ m_status = ready;
+ m_src_vertex = 0;
+}
+unsigned vcgen_dash::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_move_to;
+ while(!is_stop(cmd)) {
+ switch(m_status) {
+ case initial:
+ rewind(0);
+ case ready:
+ if(m_num_dashes < 2 || m_src_vertices.size() < 2) {
+ cmd = path_cmd_stop;
+ break;
+ }
+ m_status = polyline;
+ m_src_vertex = 1;
+ m_v1 = &m_src_vertices[0];
+ m_v2 = &m_src_vertices[1];
+ m_curr_rest = m_v1->dist;
+ *x = m_v1->x;
+ *y = m_v1->y;
+ if(m_dash_start >= 0) {
+ calc_dash_start(m_dash_start);
+ }
+ return path_cmd_move_to;
+ case polyline: {
+ FX_FLOAT dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start;
+ unsigned cmd = (m_curr_dash & 1) ?
+ path_cmd_move_to :
+ path_cmd_line_to;
+ if(m_curr_rest > dash_rest) {
+ m_curr_rest -= dash_rest;
+ ++m_curr_dash;
+ if(m_curr_dash >= m_num_dashes) {
+ m_curr_dash = 0;
+ }
+ m_curr_dash_start = 0;
+ *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist;
+ *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist;
+ } else {
+ m_curr_dash_start += m_curr_rest;
+ *x = m_v2->x;
+ *y = m_v2->y;
+ ++m_src_vertex;
+ m_v1 = m_v2;
+ m_curr_rest = m_v1->dist;
+ if(m_closed) {
+ if(m_src_vertex > m_src_vertices.size()) {
+ m_status = stop;
+ } else {
+ m_v2 = &m_src_vertices
+ [
+ (m_src_vertex >= m_src_vertices.size()) ? 0 :
+ m_src_vertex
+ ];
+ }
+ } else {
+ if(m_src_vertex >= m_src_vertices.size()) {
+ m_status = stop;
+ } else {
+ m_v2 = &m_src_vertices[m_src_vertex];
+ }
+ }
+ }
+ return cmd;
+ }
+ break;
+ case stop:
+ cmd = path_cmd_stop;
+ break;
+ }
+ }
+ return path_cmd_stop;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000000..425ac45aca
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
@@ -0,0 +1,214 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_stroke.h"
+namespace agg
+{
+
+vcgen_stroke::vcgen_stroke() :
+ m_src_vertices(),
+ m_out_vertices(),
+ m_width(0.5f),
+ m_miter_limit(4 * 1.0f),
+ m_inner_miter_limit(1.0f + 1.0f / 100),
+ m_approx_scale(1.0f),
+ m_line_cap(butt_cap),
+ m_line_join(miter_join),
+ m_inner_join(inner_miter),
+ m_closed(0),
+ m_status(initial),
+ m_src_vertex(0),
+ m_out_vertex(0)
+{
+}
+void vcgen_stroke::remove_all()
+{
+ m_src_vertices.remove_all();
+ m_closed = 0;
+ m_status = initial;
+}
+void vcgen_stroke::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ m_status = initial;
+ if(is_move_to(cmd)) {
+ m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd));
+ } else {
+ if(is_vertex(cmd)) {
+ m_src_vertices.add(vertex_dist_cmd(x, y, cmd));
+ } else {
+ m_closed = get_close_flag(cmd);
+ }
+ }
+}
+static inline void calc_butt_cap(FX_FLOAT* cap,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ FX_FLOAT len,
+ FX_FLOAT width)
+{
+ FX_FLOAT dx = FXSYS_MulDiv(v1.y - v0.y, width, len);
+ FX_FLOAT dy = FXSYS_MulDiv(v1.x - v0.x, width, len);
+ cap[0] = v0.x - dx;
+ cap[1] = v0.y + dy;
+ cap[2] = v0.x + dx;
+ cap[3] = v0.y - dy;
+}
+void vcgen_stroke::rewind(unsigned)
+{
+ if(m_status == initial) {
+ m_src_vertices.close(m_closed != 0);
+ if(m_src_vertices.size() < 3) {
+ m_closed = 0;
+ }
+ }
+ m_status = ready;
+ m_src_vertex = 0;
+ m_out_vertex = 0;
+}
+unsigned vcgen_stroke::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_line_to;
+ line_join_e curj;
+ while(!is_stop(cmd)) {
+ switch(m_status) {
+ case initial:
+ rewind(0);
+ case ready:
+ if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) {
+ cmd = path_cmd_stop;
+ break;
+ }
+ m_status = m_closed ? outline1 : cap1;
+ cmd = path_cmd_move_to;
+ m_src_vertex = 0;
+ m_out_vertex = 0;
+ break;
+ case cap1:
+ stroke_calc_cap(m_out_vertices,
+ m_src_vertices[0],
+ m_src_vertices[1],
+ m_src_vertices[0].dist,
+ m_line_cap,
+ m_width,
+ m_approx_scale);
+ m_src_vertex = 1;
+ m_prev_status = outline1;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case cap2:
+ stroke_calc_cap(m_out_vertices,
+ m_src_vertices[m_src_vertices.size() - 1],
+ m_src_vertices[m_src_vertices.size() - 2],
+ m_src_vertices[m_src_vertices.size() - 2].dist,
+ m_line_cap,
+ m_width,
+ m_approx_scale);
+ m_prev_status = outline2;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case outline1:
+ if(m_closed) {
+ if(m_src_vertex >= m_src_vertices.size()) {
+ m_prev_status = close_first;
+ m_status = end_poly1;
+ break;
+ }
+ } else {
+ if(m_src_vertex >= m_src_vertices.size() - 1) {
+ m_status = cap2;
+ break;
+ }
+ }
+ curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+ stroke_calc_join(m_out_vertices,
+ m_src_vertices.prev(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex),
+ m_src_vertices.next(m_src_vertex),
+ m_src_vertices.prev(m_src_vertex).dist,
+ m_src_vertices.curr(m_src_vertex).dist,
+ m_width,
+ curj,
+ m_inner_join,
+ m_miter_limit,
+ m_inner_miter_limit,
+ m_approx_scale);
+ ++m_src_vertex;
+ m_prev_status = m_status;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case close_first:
+ m_status = outline2;
+ cmd = path_cmd_move_to;
+ case outline2:
+ if(m_src_vertex <= unsigned(m_closed == 0)) {
+ m_status = end_poly2;
+ m_prev_status = stop;
+ break;
+ }
+ --m_src_vertex;
+ curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+ stroke_calc_join(m_out_vertices,
+ m_src_vertices.next(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex),
+ m_src_vertices.prev(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex).dist,
+ m_src_vertices.prev(m_src_vertex).dist,
+ m_width,
+ curj,
+ m_inner_join,
+ m_miter_limit,
+ m_inner_miter_limit,
+ m_approx_scale);
+ m_prev_status = m_status;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case out_vertices:
+ if(m_out_vertex >= m_out_vertices.size()) {
+ m_status = m_prev_status;
+ } else {
+ const point_type& c = m_out_vertices[m_out_vertex++];
+ *x = c.x;
+ *y = c.y;
+ return cmd;
+ }
+ break;
+ case end_poly1:
+ m_status = m_prev_status;
+ return path_cmd_end_poly | path_flags_close | path_flags_ccw;
+ case end_poly2:
+ m_status = m_prev_status;
+ return path_cmd_end_poly | path_flags_close | path_flags_cw;
+ case stop:
+ cmd = path_cmd_stop;
+ break;
+ }
+ }
+ return cmd;
+}
+}
diff --git a/core/src/fxge/agg/include/fx_agg_driver.h b/core/src/fxge/agg/include/fx_agg_driver.h
new file mode 100644
index 0000000000..c3411905b9
--- /dev/null
+++ b/core/src/fxge/agg/include/fx_agg_driver.h
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_AGG_DEVICE_DRIVER_
+#define _FX_AGG_DEVICE_DRIVER_
+#include "fxfx_agg_path_storage.h"
+#include "fxfx_agg_rasterizer_scanline_aa.h"
+class CAgg_PathData : public CFX_Object
+{
+public:
+ CAgg_PathData() {}
+ ~CAgg_PathData() {}
+ FX_NAMESPACE_DECLARE(agg, path_storage) m_PathData;
+ void BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);
+};
+class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout);
+ virtual ~CFX_AggDeviceDriver();
+ void InitPlatform();
+ void DestroyPlatform();
+
+
+ virtual int GetDeviceCaps(int caps_id);
+
+
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved);
+
+
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+
+
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+
+
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type);
+
+
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type)
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+
+
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return m_pOriDevice;
+ }
+
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);
+ virtual void CancelDIBits(FX_LPVOID handle);
+
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL RenderRasterizer(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+ int alpha_flag, void* pIccTransform);
+
+ void SetClipMask(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer);
+
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return m_pBitmap->GetBuffer();
+ }
+ virtual int GetDriverType()
+ {
+ return 1;
+ }
+
+ CFX_DIBitmap* m_pBitmap;
+ CFX_ClipRgn* m_pClipRgn;
+ CFX_PtrArray m_StateStack;
+ void* m_pPlatformGraphics;
+ void* m_pPlatformBitmap;
+ void* m_pDwRenderTartget;
+ int m_FillFlags;
+ int m_DitherBits;
+ FX_BOOL m_bRgbByteOrder;
+ CFX_DIBitmap* m_pOriDevice;
+ FX_BOOL m_bGroupKnockout;
+};
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_basics.h b/core/src/fxge/agg/include/fxfx_agg_basics.h
new file mode 100644
index 0000000000..57fbd2ebb9
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_basics.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_BASICS_H_
+#define _FXFX_AGG_BASICS_H_
+#include "../agg23/agg_basics.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
new file mode 100644
index 0000000000..948b619355
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#define _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#include "../agg23/agg_clip_liang_barsky.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_dash.h b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
new file mode 100644
index 0000000000..5f80a06e19
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_DASH_H_
+#define _FXFX_AGG_CONV_DASH_H_
+#include "../agg23/agg_conv_dash.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
new file mode 100644
index 0000000000..de38386ea2
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_STROKE_H_
+#define _FXFX_AGG_CONV_STROKE_H_
+#include "../agg23/agg_conv_stroke.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_curves.h b/core/src/fxge/agg/include/fxfx_agg_curves.h
new file mode 100644
index 0000000000..54efaa2b26
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_curves.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CURVERS_H_
+#define _FXFX_AGG_CURVERS_H_
+#include "../agg23/agg_curves.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_path_storage.h b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
new file mode 100644
index 0000000000..9168eb26a8
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_PATH_STORAGE_H_
+#define _FXFX_AGG_PATH_STORAGE_H_
+#include "../agg23/agg_path_storage.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000000..3f61cec51a
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#define _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#include "../agg23/agg_rasterizer_scanline_aa.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
new file mode 100644
index 0000000000..11d8cbb0a8
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDER_SCANLINE_H_
+#define _FXFX_AGG_RENDER_SCANLINE_H_
+#include "../agg23/agg_renderer_scanline.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
new file mode 100644
index 0000000000..eb6886e8de
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDERING_BUFFER_H_
+#define _FXFX_AGG_RENDERING_BUFFER_H_
+#include "../agg23/agg_rendering_buffer.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_scanline_u.h b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
new file mode 100644
index 0000000000..cc7d2e7f75
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_SCANLINE_U_H_
+#define _FXFX_AGG_SCANLINE_U_H_
+#include "../agg23/agg_scanline_u.h"
+#endif
diff --git a/core/src/fxge/agg/src/fxfx_agg_curves.cpp b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
new file mode 100644
index 0000000000..83817f7680
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_curves.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_driver.cpp b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
new file mode 100644
index 0000000000..a4e6a30d44
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_driver.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
new file mode 100644
index 0000000000..fabc526a24
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_path_storage.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000000..229e3ba93a
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_rasterizer_scanline_aa.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000000..4a259c022c
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_dash.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000000..2311e1abd2
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_stroke.cpp"
diff --git a/core/src/fxge/android/fpf_skiafont.cpp b/core/src/fxge/android/fpf_skiafont.cpp
new file mode 100644
index 0000000000..97eeb2f683
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.cpp
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiafont.h"
+#include "fpf_skiafontmgr.h"
+#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a) * 1000 / em)
+CFPF_SkiaFont::CFPF_SkiaFont()
+ : m_pFontMgr(NULL)
+ , m_pFontDes(NULL)
+ , m_Face(NULL)
+ , m_dwStyle(0)
+ , m_uCharset(0)
+ , m_dwRefCount(0)
+{
+}
+CFPF_SkiaFont::~CFPF_SkiaFont()
+{
+ if (m_Face) {
+ FXFT_Done_Face(m_Face);
+ }
+}
+void CFPF_SkiaFont::Release()
+{
+ if (--m_dwRefCount == 0) {
+ delete this;
+ }
+}
+IFPF_Font* CFPF_SkiaFont::Retain()
+{
+ m_dwRefCount++;
+ return (IFPF_Font*)this;
+}
+FPF_HFONT CFPF_SkiaFont::GetHandle()
+{
+ return NULL;
+}
+CFX_ByteString CFPF_SkiaFont::GetFamilyName()
+{
+ if (!m_Face) {
+ return CFX_ByteString();
+ }
+ return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+}
+CFX_WideString CFPF_SkiaFont::GetPsName()
+{
+ if (!m_Face) {
+ return CFX_WideString();
+ }
+ return CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphIndex(FX_WCHAR wUnicode)
+{
+ if (!m_Face) {
+ return wUnicode;
+ }
+ if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE)) {
+ return 0;
+ }
+ return FXFT_Get_Char_Index(m_Face, wUnicode);
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphWidth(FX_INT32 iGlyphIndex)
+{
+ if (!m_Face) {
+ return 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetAscent() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetDescent() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+}
+FX_BOOL CFPF_SkiaFont::GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ if (FXFT_Is_Face_Tricky(m_Face)) {
+ if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) {
+ return FALSE;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return FALSE;
+ }
+ FXFT_Glyph glyph;
+ if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) {
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return FALSE;
+ }
+ FXFT_BBox cbox;
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ FX_INT32 x_ppem = m_Face->size->metrics.x_ppem;
+ FX_INT32 y_ppem = m_Face->size->metrics.y_ppem;
+ rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin);
+ rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax);
+ rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax);
+ rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin);
+ rtBBox.top = FX_MIN(rtBBox.top, GetAscent());
+ rtBBox.bottom = FX_MAX(rtBBox.bottom, GetDescent());
+ FXFT_Done_Glyph(glyph);
+ return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return FALSE;
+ }
+ rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face));
+ rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face));
+ rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face));
+ rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face));
+ return TRUE;
+}
+FX_BOOL CFPF_SkiaFont::GetBBox(FX_RECT &rtBBox)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMin(m_Face));
+ rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMin(m_Face));
+ rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMax(m_Face));
+ rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMax(m_Face));
+ return TRUE;
+}
+FX_INT32 CFPF_SkiaFont::GetHeight() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetItalicAngle() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ TT_Postscript *ttInfo = (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post);
+ if (ttInfo) {
+ return ttInfo->italicAngle;
+ }
+ return 0;
+}
+FX_DWORD CFPF_SkiaFont::GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, (unsigned long*)&dwSize)) {
+ return 0;
+ }
+ return dwSize;
+}
+FX_BOOL CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+ if (!pFontMgr || !pFontDes) {
+ return FALSE;
+ }
+ switch (pFontDes->GetType()) {
+ case FPF_SKIAFONTTYPE_Path: {
+ CFPF_SkiaPathFont *pFont = (CFPF_SkiaPathFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex);
+ }
+ break;
+ case FPF_SKIAFONTTYPE_File: {
+ CFPF_SkiaFileFont *pFont = (CFPF_SkiaFileFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex);
+ }
+ break;
+ case FPF_SKIAFONTTYPE_Buffer: {
+ CFPF_SkiaBufferFont *pFont = (CFPF_SkiaBufferFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace((FX_LPCBYTE)pFont->m_pBuffer, pFont->m_szBuffer, pFont->m_iFaceIndex);
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ if (!m_Face) {
+ return FALSE;
+ }
+ m_dwStyle = dwStyle;
+ m_uCharset = uCharset;
+ m_pFontMgr = pFontMgr;
+ m_pFontDes = pFontDes;
+ m_dwRefCount = 1;
+ return TRUE;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafont.h b/core/src/fxge/android/fpf_skiafont.h
new file mode 100644
index 0000000000..1d1073c1fe
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONT_H_
+#define _FPF_SKIA_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontDescriptor;
+class CFPF_SkiaFontMgr;
+class SkTypeface;
+class CFPF_SkiaFont : public IFPF_Font, public CFX_Object
+{
+public:
+ CFPF_SkiaFont();
+ virtual ~CFPF_SkiaFont();
+ virtual void Release();
+ virtual IFPF_Font* Retain();
+
+ virtual FPF_HFONT GetHandle();
+
+ virtual CFX_ByteString GetFamilyName();
+ virtual CFX_WideString GetPsName();
+
+ virtual FX_DWORD GetFontStyle() const
+ {
+ return m_dwStyle;
+ }
+ virtual FX_BYTE GetCharset() const
+ {
+ return m_uCharset;
+ }
+
+ virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode);
+ virtual FX_INT32 GetGlyphWidth(FX_INT32 iGlyphIndex);
+
+ virtual FX_INT32 GetAscent() const;
+ virtual FX_INT32 GetDescent() const;
+
+ virtual FX_BOOL GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox);
+ virtual FX_BOOL GetBBox(FX_RECT &rtBBox);
+
+ virtual FX_INT32 GetHeight() const;
+ virtual FX_INT32 GetItalicAngle() const;
+ virtual FX_DWORD GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize);
+ FX_BOOL InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset);
+protected:
+ CFPF_SkiaFontMgr *m_pFontMgr;
+ CFPF_SkiaFontDescriptor *m_pFontDes;
+ FXFT_Face m_Face;
+ FX_DWORD m_dwStyle;
+ FX_BYTE m_uCharset;
+ FX_DWORD m_dwRefCount;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.cpp b/core/src/fxge/android/fpf_skiafontmgr.cpp
new file mode 100644
index 0000000000..cf93e5beaf
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.cpp
@@ -0,0 +1,561 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAMATCHWEIGHT_NAME1 62
+#define FPF_SKIAMATCHWEIGHT_NAME2 60
+#define FPF_SKIAMATCHWEIGHT_1 16
+#define FPF_SKIAMATCHWEIGHT_2 8
+#include "fpf_skiafontmgr.h"
+#include "fpf_skiafont.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+static unsigned long FPF_SkiaStream_Read(FXFT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
+{
+ IFX_FileRead *pFileRead = (IFX_FileRead*)stream->descriptor.pointer;
+ if (!pFileRead) {
+ return 0;
+ }
+ if (count > 0) {
+ if (pFileRead->ReadBlock(buffer, (FX_FILESIZE)offset, (size_t)count) != count) {
+ return 0;
+ }
+ }
+ return count;
+}
+static void FPF_SkiaStream_Close(FXFT_Stream stream)
+{
+}
+#ifdef __cplusplus
+};
+#endif
+typedef struct _FPF_SKIAFONTMAP {
+ FX_DWORD dwFamily;
+ FX_DWORD dwSubSt;
+} FPF_SKIAFONTMAP, *FPF_LPSKIAFONTMAP;
+typedef FPF_SKIAFONTMAP const * FPF_LPCSKIAFONTMAP;
+static const FPF_SKIAFONTMAP g_SkiaFontmap[] = {
+ {0x58c5083, 0xc8d2e345},
+ {0x5dfade2, 0xe1633081},
+ {0x684317d, 0xe1633081},
+ {0x14ee2d13, 0xc8d2e345},
+ {0x3918fe2d, 0xbbeeec72},
+ {0x3b98b31c, 0xe1633081},
+ {0x3d49f40e, 0xe1633081},
+ {0x432c41c5, 0xe1633081},
+ {0x491b6ad0, 0xe1633081},
+ {0x5612cab1, 0x59b9f8f1},
+ {0x779ce19d, 0xc8d2e345},
+ {0x7cc9510b, 0x59b9f8f1},
+ {0x83746053, 0xbbeeec72},
+ {0xaaa60c03, 0xbbeeec72},
+ {0xbf85ff26, 0xe1633081},
+ {0xc04fe601, 0xbbeeec72},
+ {0xca3812d5, 0x59b9f8f1},
+ {0xca383e15, 0x59b9f8f1},
+ {0xcad5eaf6, 0x59b9f8f1},
+ {0xcb7a04c8, 0xc8d2e345},
+ {0xfb4ce0de, 0xe1633081},
+};
+FX_DWORD FPF_SkiaGetSubstFont(FX_DWORD dwHash)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(g_SkiaFontmap) / sizeof(FPF_SKIAFONTMAP);
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FPF_LPCSKIAFONTMAP pItem = &g_SkiaFontmap[iMid];
+ if (dwHash < pItem->dwFamily) {
+ iEnd = iMid - 1;
+ } else if (dwHash > pItem->dwFamily) {
+ iStart = iMid + 1;
+ } else {
+ return pItem->dwSubSt;
+ }
+ }
+ return NULL;
+}
+static const FPF_SKIAFONTMAP g_SkiaSansFontMap[] = {
+ {0x58c5083, 0xd5b8d10f},
+ {0x14ee2d13, 0xd5b8d10f},
+ {0x779ce19d, 0xd5b8d10f},
+ {0xcb7a04c8, 0xd5b8d10f},
+ {0xfb4ce0de, 0xd5b8d10f},
+};
+FX_DWORD FPF_SkiaGetSansFont(FX_DWORD dwHash)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(g_SkiaSansFontMap) / sizeof(FPF_SKIAFONTMAP);
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FPF_LPCSKIAFONTMAP pItem = &g_SkiaSansFontMap[iMid];
+ if (dwHash < pItem->dwFamily) {
+ iEnd = iMid - 1;
+ } else if (dwHash > pItem->dwFamily) {
+ iStart = iMid + 1;
+ } else {
+ return pItem->dwSubSt;
+ }
+ }
+ return 0;
+}
+static FX_UINT32 FPF_GetHashCode_StringA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE)
+{
+ if (!pStr) {
+ return 0;
+ }
+ if (iLength < 0) {
+ iLength = FXSYS_strlen(pStr);
+ }
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_UINT32 uHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + *pStr ++;
+ }
+ }
+ return uHashCode;
+}
+enum FPF_SKIACHARSET {
+ FPF_SKIACHARSET_Ansi = 1 << 0,
+ FPF_SKIACHARSET_Default = 1 << 1,
+ FPF_SKIACHARSET_Symbol = 1 << 2,
+ FPF_SKIACHARSET_ShiftJIS = 1 << 3,
+ FPF_SKIACHARSET_Korean = 1 << 4,
+ FPF_SKIACHARSET_Johab = 1 << 5,
+ FPF_SKIACHARSET_GB2312 = 1 << 6,
+ FPF_SKIACHARSET_BIG5 = 1 << 7,
+ FPF_SKIACHARSET_Greek = 1 << 8,
+ FPF_SKIACHARSET_Turkish = 1 << 9,
+ FPF_SKIACHARSET_Vietnamese = 1 << 10,
+ FPF_SKIACHARSET_Hebrew = 1 << 11,
+ FPF_SKIACHARSET_Arabic = 1 << 12,
+ FPF_SKIACHARSET_Baltic = 1 << 13,
+ FPF_SKIACHARSET_Cyrillic = 1 << 14,
+ FPF_SKIACHARSET_Thai = 1 << 15,
+ FPF_SKIACHARSET_EeasternEuropean = 1 << 16,
+ FPF_SKIACHARSET_PC = 1 << 17,
+ FPF_SKIACHARSET_OEM = 1 << 18,
+};
+static FX_DWORD FPF_SkiaGetCharset(FX_BYTE uCharset)
+{
+ switch (uCharset) {
+ case FXFONT_ANSI_CHARSET:
+ return FPF_SKIACHARSET_Ansi;
+ case FXFONT_DEFAULT_CHARSET:
+ return FPF_SKIACHARSET_Default;
+ case FXFONT_SYMBOL_CHARSET:
+ return FPF_SKIACHARSET_Symbol;
+ case FXFONT_SHIFTJIS_CHARSET:
+ return FPF_SKIACHARSET_ShiftJIS;
+ case FXFONT_HANGEUL_CHARSET:
+ return FPF_SKIACHARSET_Korean;
+ case FXFONT_GB2312_CHARSET:
+ return FPF_SKIACHARSET_GB2312;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ return FPF_SKIACHARSET_BIG5;
+ case FXFONT_GREEK_CHARSET:
+ return FPF_SKIACHARSET_Greek;
+ case FXFONT_TURKISH_CHARSET:
+ return FPF_SKIACHARSET_Turkish;
+ case FXFONT_HEBREW_CHARSET:
+ return FPF_SKIACHARSET_Hebrew;
+ case FXFONT_ARABIC_CHARSET:
+ return FPF_SKIACHARSET_Arabic;
+ case FXFONT_BALTIC_CHARSET:
+ return FPF_SKIACHARSET_Baltic;
+ case FXFONT_RUSSIAN_CHARSET:
+ return FPF_SKIACHARSET_Cyrillic;
+ case FXFONT_THAI_CHARSET:
+ return FPF_SKIACHARSET_Thai;
+ case FXFONT_EASTEUROPE_CHARSET:
+ return FPF_SKIACHARSET_EeasternEuropean;
+ }
+ return FPF_SKIACHARSET_Default;
+}
+static FX_DWORD FPF_SKIANormalizeFontName(FX_BSTR bsfamily)
+{
+ FX_DWORD dwHash = 0;
+ FX_INT32 iLength = bsfamily.GetLength();
+ FX_LPCSTR pBuffer = bsfamily.GetCStr();
+ for (FX_INT32 i = 0; i < iLength; i++) {
+ FX_CHAR ch = pBuffer[i];
+ if (ch == ' ' || ch == '-' || ch == ',') {
+ continue;
+ }
+ dwHash = 31 * dwHash + FXSYS_tolower(ch);
+ }
+ return dwHash;
+}
+static FX_DWORD FPF_SKIAGetFamilyHash(FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+ CFX_ByteString bsFont(bsFamily);
+ if (dwStyle & FXFONT_BOLD) {
+ bsFont += "Bold";
+ }
+ if (dwStyle & FXFONT_ITALIC) {
+ bsFont += "Italic";
+ }
+ if (dwStyle & FXFONT_SERIF) {
+ bsFont += "Serif";
+ }
+ bsFont += uCharset;
+ return FPF_GetHashCode_StringA((FX_LPCSTR)bsFont, bsFont.GetLength(), TRUE);
+}
+static FX_BOOL FPF_SkiaIsCJK(FX_BYTE uCharset)
+{
+ return (uCharset == FXFONT_GB2312_CHARSET) || (uCharset == FXFONT_CHINESEBIG5_CHARSET)
+ || (uCharset == FXFONT_HANGEUL_CHARSET) || (uCharset == FXFONT_SHIFTJIS_CHARSET);
+}
+static FX_BOOL FPF_SkiaMaybeSymbol(FX_BSTR bsFacename)
+{
+ CFX_ByteString bsName = bsFacename;
+ bsName.MakeLower();
+ return bsName.Find("symbol") > -1;
+}
+static FX_BOOL FPF_SkiaMaybeArabic(FX_BSTR bsFacename)
+{
+ CFX_ByteString bsName = bsFacename;
+ bsName.MakeLower();
+ return bsName.Find("arabic") > -1;
+}
+CFPF_SkiaFontMgr::CFPF_SkiaFontMgr()
+ : m_bLoaded(FALSE), m_FTLibrary(NULL)
+{
+}
+CFPF_SkiaFontMgr::~CFPF_SkiaFontMgr()
+{
+ void *pkey = NULL;
+ CFPF_SkiaFont *pValue = NULL;
+ FX_POSITION pos = m_FamilyFonts.GetStartPosition();
+ while (pos) {
+ m_FamilyFonts.GetNextAssoc(pos, pkey, (void*&)pValue);
+ if (pValue) {
+ pValue->Release();
+ }
+ }
+ m_FamilyFonts.RemoveAll();
+ for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+ CFPF_SkiaFontDescriptor *pFont = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(i);
+ if (pFont) {
+ delete pFont;
+ }
+ }
+ m_FontFaces.RemoveAll();
+ if (m_FTLibrary) {
+ FXFT_Done_FreeType(m_FTLibrary);
+ }
+}
+FX_BOOL CFPF_SkiaFontMgr::InitFTLibrary()
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ return m_FTLibrary != NULL;
+}
+void CFPF_SkiaFontMgr::LoadSystemFonts()
+{
+ if (m_bLoaded) {
+ return;
+ }
+ ScanPath(FX_BSTRC("/system/fonts"));
+ OutputSystemFonts();
+ m_bLoaded = TRUE;
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(IFX_FileRead* pFontFile)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_BSTR bsFileName)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer)
+{
+}
+IFPF_Font* CFPF_SkiaFontMgr::CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch)
+{
+ FX_DWORD dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset);
+ IFPF_Font *pFont = NULL;
+ if (m_FamilyFonts.Lookup((void*)dwHash, (void*&)pFont)) {
+ if (pFont) {
+ return pFont->Retain();
+ }
+ }
+ FX_DWORD dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname);
+ FX_DWORD dwSubst = FPF_SkiaGetSubstFont(dwFaceName);
+ FX_DWORD dwSubstSans = FPF_SkiaGetSansFont(dwFaceName);
+ FX_BOOL bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname);
+ if (uCharset != FXFONT_ARABIC_CHARSET && FPF_SkiaMaybeArabic(bsFamilyname)) {
+ uCharset = FXFONT_ARABIC_CHARSET;
+ } else if (uCharset == FXFONT_ANSI_CHARSET && (dwMatch & FPF_MATCHFONT_REPLACEANSI)) {
+ uCharset = FXFONT_DEFAULT_CHARSET;
+ }
+ FX_INT32 nExpectVal = FPF_SKIAMATCHWEIGHT_NAME1 + FPF_SKIAMATCHWEIGHT_1 * 3 + FPF_SKIAMATCHWEIGHT_2 * 2;
+ FX_INT32 nItem = -1;
+ FX_INT32 nMax = -1;
+ FX_INT32 nGlyphNum = 0;
+ for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+ CFPF_SkiaPathFont *pFontDes = (CFPF_SkiaPathFont*)m_FontFaces.ElementAt(i);
+ if(!(pFontDes->m_dwCharsets & FPF_SkiaGetCharset(uCharset))) {
+ continue;
+ }
+ FX_INT32 nFind = 0;
+ FX_DWORD dwSysFontName = FPF_SKIANormalizeFontName(pFontDes->m_pFamily);
+ if (dwFaceName == dwSysFontName) {
+ nFind += FPF_SKIAMATCHWEIGHT_NAME1;
+ }
+ FX_BOOL bMatchedName = (nFind == FPF_SKIAMATCHWEIGHT_NAME1);
+ if ((dwStyle & FXFONT_BOLD) == (pFontDes->m_dwStyle & FXFONT_BOLD)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_ITALIC) == (pFontDes->m_dwStyle & FXFONT_ITALIC)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_FIXED_PITCH) == (pFontDes->m_dwStyle & FXFONT_FIXED_PITCH)) {
+ nFind += FPF_SKIAMATCHWEIGHT_2;
+ }
+ if ((dwStyle & FXFONT_SERIF) == (pFontDes->m_dwStyle & FXFONT_SERIF)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_SCRIPT) == (pFontDes->m_dwStyle & FXFONT_SCRIPT)) {
+ nFind += FPF_SKIAMATCHWEIGHT_2;
+ }
+ if (dwSubst == dwSysFontName || dwSubstSans == dwSysFontName) {
+ nFind += FPF_SKIAMATCHWEIGHT_NAME2;
+ bMatchedName = TRUE;
+ }
+ if (uCharset == FXFONT_DEFAULT_CHARSET || bMaybeSymbol) {
+ if (nFind > nMax && bMatchedName) {
+ nMax = nFind;
+ nItem = i;
+ }
+ } else if (FPF_SkiaIsCJK(uCharset)) {
+ if (bMatchedName || pFontDes->m_iGlyphNum > nGlyphNum) {
+ nItem = i;
+ nGlyphNum = pFontDes->m_iGlyphNum;
+ }
+ } else if (nFind > nMax) {
+ nMax = nFind;
+ nItem = i;
+ }
+ if (nExpectVal <= nFind) {
+ nItem = i;
+ break;
+ }
+ }
+ if (nItem > -1) {
+ CFPF_SkiaFontDescriptor *pFontDes = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(nItem);
+ CFPF_SkiaFont *pFont = FX_NEW CFPF_SkiaFont;
+ if (pFont) {
+ if (pFont->InitFont(this, pFontDes, bsFamilyname, dwStyle, uCharset)) {
+ m_FamilyFonts.SetAt((void*)dwHash, (void*)pFont);
+ return pFont->Retain();
+ }
+ pFont->Release();
+ pFont = NULL;
+ }
+ return pFont;
+ }
+ return NULL;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex)
+{
+ if (!pFileRead) {
+ return NULL;
+ }
+ if (pFileRead->GetSize() == 0) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_StreamRec streamRec;
+ FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec));
+ streamRec.size = pFileRead->GetSize();
+ streamRec.descriptor.pointer = pFileRead;
+ streamRec.read = FPF_SkiaStream_Read;
+ streamRec.close = FPF_SkiaStream_Close;
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_STREAM;
+ args.stream = &streamRec;
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return NULL;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex )
+{
+ if (bsFile.IsEmpty()) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (FT_String*)bsFile.GetCStr();
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return FALSE;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex )
+{
+ if (!pBuffer || szBuffer < 1) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_MEMORY;
+ args.memory_base = pBuffer;
+ args.memory_size = szBuffer;
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return FALSE;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+void CFPF_SkiaFontMgr::ScanPath(FX_BSTR path)
+{
+ void *handle = FX_OpenFolder(path.GetCStr());
+ if (!handle) {
+ return;
+ }
+ CFX_ByteString filename;
+ FX_BOOL bFolder = FALSE;
+ while (FX_GetNextFile(handle, filename, bFolder)) {
+ if (bFolder) {
+ if (filename == FX_BSTRC(".") || filename == FX_BSTRC("..")) {
+ continue;
+ }
+ } else {
+ CFX_ByteString ext = filename.Right(4);
+ ext.MakeLower();
+ if (ext != FX_BSTRC(".ttf") && ext != FX_BSTRC(".ttc")) {
+ continue;
+ }
+ }
+ CFX_ByteString fullpath = path;
+ fullpath += "/";
+ fullpath += filename;
+ if (bFolder) {
+ ScanPath(fullpath);
+ } else {
+ ScanFile(fullpath);
+ }
+ }
+ FX_CloseFolder(handle);
+}
+void CFPF_SkiaFontMgr::ScanFile(FX_BSTR file)
+{
+ FXFT_Face face = GetFontFace(file);
+ if (face) {
+ CFPF_SkiaPathFont *pFontDesc = FX_NEW CFPF_SkiaPathFont;
+ if (!pFontDesc) {
+ return;
+ }
+ pFontDesc->SetPath(file.GetCStr());
+ ReportFace(face, pFontDesc);
+ m_FontFaces.Add(pFontDesc);
+ FXFT_Done_Face(face);
+ }
+}
+static const FX_DWORD g_FPFSkiaFontCharsets [] = {
+ FPF_SKIACHARSET_Ansi,
+ FPF_SKIACHARSET_EeasternEuropean,
+ FPF_SKIACHARSET_Cyrillic,
+ FPF_SKIACHARSET_Greek,
+ FPF_SKIACHARSET_Turkish,
+ FPF_SKIACHARSET_Hebrew,
+ FPF_SKIACHARSET_Arabic,
+ FPF_SKIACHARSET_Baltic,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ FPF_SKIACHARSET_Thai,
+ FPF_SKIACHARSET_ShiftJIS,
+ FPF_SKIACHARSET_GB2312,
+ FPF_SKIACHARSET_Korean,
+ FPF_SKIACHARSET_BIG5,
+ FPF_SKIACHARSET_Johab,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ FPF_SKIACHARSET_OEM,
+ FPF_SKIACHARSET_Symbol,
+};
+static FX_DWORD FPF_SkiaGetFaceCharset(TT_OS2 *pOS2)
+{
+ FX_DWORD dwCharset = 0;
+ if (pOS2) {
+ for (FX_INT32 i = 0; i < 32; i++) {
+ if (pOS2->ulCodePageRange1 & (1 << i)) {
+ dwCharset |= g_FPFSkiaFontCharsets[i];
+ }
+ }
+ }
+ dwCharset |= FPF_SKIACHARSET_Default;
+ return dwCharset;
+}
+void CFPF_SkiaFontMgr::ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc)
+{
+ if (!face || !pFontDesc) {
+ return;
+ }
+ pFontDesc->SetFamily(FXFT_Get_Face_Family_Name(face));
+ if (FXFT_Is_Face_Bold(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_BOLD;
+ }
+ if (FXFT_Is_Face_Italic(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_ITALIC;
+ }
+ if (FT_IS_FIXED_WIDTH(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_FIXED_PITCH;
+ }
+ TT_OS2 *pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2);
+ if (pOS2) {
+ if (pOS2->ulCodePageRange1 & (1 << 31)) {
+ pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+ }
+ if (pOS2->panose[0] == 2) {
+ FX_BYTE uSerif = pOS2->panose[1];
+ if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {
+ pFontDesc->m_dwStyle |= FXFONT_SERIF;
+ }
+ }
+ }
+ if (pOS2 && (pOS2->ulCodePageRange1 & (1 << 31))) {
+ pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+ }
+ pFontDesc->m_dwCharsets = FPF_SkiaGetFaceCharset(pOS2);
+ pFontDesc->m_iFaceIndex = face->face_index;
+ pFontDesc->m_iGlyphNum = face->num_glyphs;
+}
+void CFPF_SkiaFontMgr::OutputSystemFonts()
+{
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.h b/core/src/fxge/android/fpf_skiafontmgr.h
new file mode 100644
index 0000000000..472fbbd416
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.h
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONTMGR_H_
+#define _FPF_SKIA_FONTMGR_H_
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAFONTTYPE_Unknown 0
+#define FPF_SKIAFONTTYPE_Path 1
+#define FPF_SKIAFONTTYPE_File 2
+#define FPF_SKIAFONTTYPE_Buffer 3
+class CFPF_SkiaFontDescriptor : public CFX_Object
+{
+public:
+ CFPF_SkiaFontDescriptor() : m_pFamily(NULL), m_dwStyle(0), m_iFaceIndex(0), m_dwCharsets(0), m_iGlyphNum(0) {}
+ virtual ~CFPF_SkiaFontDescriptor()
+ {
+ if (m_pFamily) {
+ FX_Free(m_pFamily);
+ }
+ }
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Unknown;
+ }
+ void SetFamily(FX_LPCSTR pFamily)
+ {
+ if (m_pFamily) {
+ FX_Free(m_pFamily);
+ }
+ FX_INT32 iSize = FXSYS_strlen(pFamily);
+ m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);
+ FXSYS_memcpy32(m_pFamily, pFamily, iSize * sizeof(FX_CHAR));
+ m_pFamily[iSize] = 0;
+ }
+ FX_LPSTR m_pFamily;
+ FX_DWORD m_dwStyle;
+ FX_INT32 m_iFaceIndex;
+ FX_DWORD m_dwCharsets;
+ FX_INT32 m_iGlyphNum;
+};
+class CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaPathFont() : m_pPath(NULL) {}
+ virtual ~CFPF_SkiaPathFont()
+ {
+ if (m_pPath) {
+ FX_Free(m_pPath);
+ }
+ }
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Path;
+ }
+ void SetPath(FX_LPCSTR pPath)
+ {
+ if (m_pPath) {
+ FX_Free(m_pPath);
+ }
+ FX_INT32 iSize = FXSYS_strlen(pPath);
+ m_pPath = FX_Alloc(FX_CHAR, iSize + 1);
+ FXSYS_memcpy32(m_pPath, pPath, iSize * sizeof(FX_CHAR));
+ m_pPath[iSize] = 0;
+ }
+ FX_LPSTR m_pPath;
+};
+class CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaFileFont() : m_pFile(NULL) {}
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_File;
+ }
+ IFX_FileRead *m_pFile;
+};
+class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Buffer;
+ }
+ FX_LPVOID m_pBuffer;
+ size_t m_szBuffer;
+};
+class CFPF_SkiaFontMgr : public IFPF_FontMgr, public CFX_Object
+{
+public:
+ CFPF_SkiaFontMgr();
+ virtual ~CFPF_SkiaFontMgr();
+ FX_BOOL InitFTLibrary();
+ virtual void LoadSystemFonts();
+ virtual void LoadPrivateFont(IFX_FileRead* pFontFile);
+ virtual void LoadPrivateFont(FX_BSTR bsFileName);
+ virtual void LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer);
+
+ virtual IFPF_Font* CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0);
+ FXFT_Face GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex = 0);
+ FXFT_Face GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex = 0);
+ FXFT_Face GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex = 0);
+protected:
+ void ScanPath(FX_BSTR path);
+ void ScanFile(FX_BSTR file);
+ void ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc);
+ void OutputSystemFonts();
+ FX_BOOL m_bLoaded;
+ CFX_PtrArray m_FontFaces;
+ FXFT_Library m_FTLibrary;
+ CFX_MapPtrToPtr m_FamilyFonts;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.cpp b/core/src/fxge/android/fpf_skiamodule.cpp
new file mode 100644
index 0000000000..94e68885fc
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiamodule.h"
+#include "fpf_skiafontmgr.h"
+static IFPF_DeviceModule *gs_pPFModule = NULL;
+IFPF_DeviceModule* FPF_GetDeviceModule()
+{
+ if (!gs_pPFModule) {
+ gs_pPFModule = FX_NEW CFPF_SkiaDeviceModule;
+ }
+ return gs_pPFModule;
+}
+CFPF_SkiaDeviceModule::~CFPF_SkiaDeviceModule()
+{
+ if (m_pFontMgr) {
+ delete m_pFontMgr;
+ }
+}
+void CFPF_SkiaDeviceModule::Destroy()
+{
+ if (gs_pPFModule) {
+ delete (CFPF_SkiaDeviceModule*)gs_pPFModule;
+ gs_pPFModule = NULL;
+ }
+}
+IFPF_FontMgr* CFPF_SkiaDeviceModule::GetFontMgr()
+{
+ if (!m_pFontMgr) {
+ m_pFontMgr = FX_NEW CFPF_SkiaFontMgr;
+ if (!m_pFontMgr) {
+ return NULL;
+ }
+ if (!m_pFontMgr->InitFTLibrary()) {
+ delete m_pFontMgr;
+ return NULL;
+ }
+ }
+ return (IFPF_FontMgr*)m_pFontMgr;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.h b/core/src/fxge/android/fpf_skiamodule.h
new file mode 100644
index 0000000000..c3a78bf658
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_MODULE_H_
+#define _FPF_MODULE_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontMgr;
+class CFPF_SkiaDeviceModule : public IFPF_DeviceModule, public CFX_Object
+{
+public:
+ CFPF_SkiaDeviceModule() : m_pFontMgr(NULL) {}
+ virtual ~CFPF_SkiaDeviceModule();
+ virtual void Destroy();
+ virtual IFPF_FontMgr* GetFontMgr();
+protected:
+ CFPF_SkiaFontMgr *m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_font.cpp b/core/src/fxge/android/fx_android_font.cpp
new file mode 100644
index 0000000000..5f8aafc393
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.cpp
@@ -0,0 +1,87 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+CFX_AndroidFontInfo::CFX_AndroidFontInfo()
+ : m_pFontMgr(NULL)
+{
+}
+FX_BOOL CFX_AndroidFontInfo::Init(IFPF_FontMgr *pFontMgr)
+{
+ if (!pFontMgr) {
+ return FALSE;
+ }
+ pFontMgr->LoadSystemFonts();
+ m_pFontMgr = pFontMgr;
+ return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ return FALSE;
+}
+void* CFX_AndroidFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact)
+{
+ if (!m_pFontMgr) {
+ return NULL;
+ }
+ FX_DWORD dwStyle = 0;
+ if (weight >= 700) {
+ dwStyle |= FXFONT_BOLD;
+ }
+ if (bItalic) {
+ dwStyle |= FXFONT_ITALIC;
+ }
+ if (pitch_family & FXFONT_FF_FIXEDPITCH) {
+ dwStyle |= FXFONT_FIXED_PITCH;
+ }
+ if (pitch_family & FXFONT_FF_SCRIPT) {
+ dwStyle |= FXFONT_SCRIPT;
+ }
+ if (pitch_family & FXFONT_FF_ROMAN) {
+ dwStyle |= FXFONT_SERIF;
+ }
+ return m_pFontMgr->CreateFont(face, charset, dwStyle, FPF_MATCHFONT_REPLACEANSI);
+}
+void* CFX_AndroidFontInfo::GetFont(FX_LPCSTR face)
+{
+ return NULL;
+}
+FX_DWORD CFX_AndroidFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ if (!hFont) {
+ return 0;
+ }
+ return ((IFPF_Font*)hFont)->GetFontData(table, buffer, size);
+}
+FX_BOOL CFX_AndroidFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ if (!hFont) {
+ return FALSE;
+ }
+ name = ((IFPF_Font*)hFont)->GetFamilyName();
+ return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ if (!hFont) {
+ return FALSE;
+ }
+ charset = ((IFPF_Font*)hFont)->GetCharset();
+ return FALSE;
+}
+void CFX_AndroidFontInfo::DeleteFont(void* hFont)
+{
+ if (!hFont) {
+ return;
+ }
+ ((IFPF_Font*)hFont)->Release();
+}
+void* CFX_AndroidFontInfo::RetainFont(void* hFont)
+{
+ return NULL;
+}
+#endif
diff --git a/core/src/fxge/android/fx_android_font.h b/core/src/fxge/android/fx_android_font.h
new file mode 100644
index 0000000000..b6bfdf9396
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ANDROID_FONT_H_
+#define _FX_ANDROID_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class IFPF_FontMgr;
+class CFX_AndroidFontInfo : public IFX_SystemFontInfo
+{
+public:
+ CFX_AndroidFontInfo();
+ virtual void Release()
+ {
+ delete this;
+ }
+
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+
+ virtual void* GetFont(FX_LPCSTR face);
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+
+ virtual void DeleteFont(void* hFont);
+ virtual void* RetainFont(void* hFont);
+ FX_BOOL Init(IFPF_FontMgr *pFontMgr);
+protected:
+ IFPF_FontMgr *m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_imp.cpp b/core/src/fxge/android/fx_android_imp.cpp
new file mode 100644
index 0000000000..528877ef89
--- /dev/null
+++ b/core/src/fxge/android/fx_android_imp.cpp
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+void CFX_GEModule::InitPlatform()
+{
+ IFPF_DeviceModule *pDeviceModule = FPF_GetDeviceModule();
+ if (!pDeviceModule) {
+ return;
+ }
+ IFPF_FontMgr *pFontMgr = pDeviceModule->GetFontMgr();
+ if (pFontMgr) {
+ CFX_AndroidFontInfo *pFontInfo = FX_NEW CFX_AndroidFontInfo;
+ if (!pFontInfo) {
+ return;
+ }
+ pFontInfo->Init(pFontMgr);
+ m_pFontMgr->SetSystemFontInfo(pFontInfo);
+ }
+ m_pPlatformData = pDeviceModule;
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ ((IFPF_DeviceModule*)m_pPlatformData)->Destroy();
+ }
+}
+#endif
diff --git a/core/src/fxge/android/fx_fpf.h b/core/src/fxge/android/fx_fpf.h
new file mode 100644
index 0000000000..1108fffed4
--- /dev/null
+++ b/core/src/fxge/android/fx_fpf.h
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_FPF_H_
+#define _FX_FPF_H_
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxge/fpf.h"
+#include "fx_android_font.h"
+#endif
diff --git a/core/src/fxge/apple/apple_int.h b/core/src/fxge/apple/apple_int.h
new file mode 100644
index 0000000000..5c42f1b1fb
--- /dev/null
+++ b/core/src/fxge/apple/apple_int.h
@@ -0,0 +1,246 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _APPLE_INT_H_
+#define _APPLE_INT_H_
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#if _FX_OS_ == _FX_MACOSX_
+#include <Carbon/Carbon.h>
+#endif
+typedef enum eFXIOSFONTCHARSET {
+ eFXFontCharsetDEFAULT = 0,
+ eFXFontCharsetANSI = 1,
+ eFXFontCharsetSYMBOL = 1 << 1,
+ eFXFontCharsetSHIFTJIS = 1 << 2,
+ eFXFontCharsetHANGEUL = 1 << 3,
+ eFXFontCharsetGB2312 = 1 << 4,
+ eFXFontCharsetCHINESEBIG5 = 1 << 5,
+ eFXFontCharsetTHAI = 1 << 6,
+ eFXFontCharsetEASTEUROPE = 1 << 7,
+ eFXFontCharsetRUSSIAN = 1 << 8,
+ eFXFontCharsetGREEK = 1 << 9,
+ eFXFontCharsetTURKISH = 1 << 10,
+ eFXFontCharsetHEBREW = 1 << 11,
+ eFXFontCharsetARABIC = 1 << 12,
+ eFXFontCharsetBALTIC = 1 << 13,
+} FX_IOSCHARSET;
+FX_IOSCHARSET FX_GetiOSCharset(int charset);
+typedef enum eFXIOSFONTFLAG {
+ eFXFontFlagBold = 1,
+ eFXFontFlagItalic = 1 << 1,
+ eFXFontFlagFixedPitch = 1 << 2,
+ eFXFontFlagSerif = 1 << 3,
+ eFXFontFlagScript = 1 << 4,
+} FX_IOSFONTFLAG;
+typedef struct _IOS_FONTDATA {
+ FX_DWORD nHashCode;
+ const char* psName;
+ FX_DWORD charsets;
+ FX_DWORD styles;
+} IOS_FONTDATA;
+class CQuartz2D
+{
+public:
+ void* createGraphics(CFX_DIBitmap* bitmap);
+ void destroyGraphics(void* graphics);
+
+ void* CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);
+ void DestroyFont(void* pFont);
+ void setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);
+ FX_BOOL drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 chars,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix = NULL);
+ void saveGraphicsState(void* graphics);
+ void restoreGraphicsState(void* graphics);
+};
+class CApplePlatform : public CFX_Object
+{
+public:
+ CApplePlatform()
+ {
+ m_pFontMapper = NULL;
+ }
+ ~CApplePlatform()
+ {
+ if (m_pFontMapper) {
+ delete m_pFontMapper;
+ }
+ }
+ CQuartz2D _quartz2d;
+ IFX_FontMapper* m_pFontMapper;
+};
+class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);
+ virtual ~CFX_QuartzDeviceDriver();
+
+ virtual int GetDeviceCaps(int caps_id);
+ virtual CFX_Matrix GetCTM() const;
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return NULL;
+ }
+ virtual void* GetPlatformSurface()
+ {
+ return NULL;
+ }
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL StartRendering()
+ {
+ return TRUE;
+ }
+ virtual void EndRendering() {}
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL
+ );
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int blend_type,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag = 0, void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+ {
+ return FALSE;
+ }
+ virtual void CancelDIBits(FX_LPVOID handle) {}
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual void ClearDriver();
+protected:
+ void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);
+ void setFillInfo(FX_ARGB argb);
+ void setPathToContext(const CFX_PathData * pathData);
+ FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);
+ FX_BOOL CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform);
+ void CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);
+protected:
+ CGContextRef _context;
+ CGAffineTransform _foxitDevice2User;
+ CGAffineTransform _user2FoxitDevice;
+ FX_INT32 m_saveCount;
+
+ FX_INT32 _width;
+ FX_INT32 _height;
+ FX_INT32 _bitsPerPixel;
+ FX_INT32 _deviceClass;
+ FX_INT32 _renderCaps;
+ FX_INT32 _horzSize;
+ FX_INT32 _vertSize;
+};
+class CFX_FontProvider : public IFX_FileRead
+{
+public:
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return (FX_FILESIZE)_totalSize;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ virtual FX_BOOL IsEOF()
+ {
+ return _offSet == _totalSize;
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return (FX_FILESIZE)_offSet;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size);
+public:
+ CFX_FontProvider(CGFontRef cgFont);
+ ~CFX_FontProvider();
+ void InitTableOffset();
+ unsigned long Read(unsigned long offset, unsigned char *buffer, unsigned long count);
+protected:
+ uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);
+ uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);
+private:
+ CGFontRef m_cgFont;
+ UInt32 m_iTableSize;
+ size_t _offSet;
+ typedef struct FontHeader {
+ int32_t fVersion;
+ uint16_t fNumTables;
+ uint16_t fSearchRange;
+ uint16_t fEntrySelector;
+ uint16_t fRangeShift;
+ } FontHeader;
+ typedef struct TableEntry {
+ uint32_t fTag;
+ uint32_t fCheckSum;
+ uint32_t fOffset;
+ uint32_t fLength;
+ } TableEntry;
+ FontHeader _fontHeader;
+ unsigned char * _tableEntries;
+ size_t * _tableOffsets;
+ int _tableCount;
+ int _totalSize;
+};
+FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);
+FX_DWORD FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);
+FX_UINT32 FX_IOSGetFamilyNamesCount();
+FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_apple_platform.cpp b/core/src/fxge/apple/fx_apple_platform.cpp
new file mode 100644
index 0000000000..229d1785da
--- /dev/null
+++ b/core/src/fxge/apple/fx_apple_platform.cpp
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (m_pPlatformGraphics) {
+ quartz2d.destroyGraphics(m_pPlatformGraphics);
+ m_pPlatformGraphics = NULL;
+ }
+}
+void CFX_FaceCache::InitPlatform() {}
+void CFX_FaceCache::DestroyPlatform() {}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font * pFont,
+ FX_DWORD glyph_index,
+ const CFX_AffineMatrix * pMatrix,
+ int dest_width,
+ int anti_alias)
+{
+ return NULL;
+}
+static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
+ int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CFX_AffineMatrix new_matrix;
+ FX_BOOL bNegSize = font_size < 0;
+ if (bNegSize) {
+ font_size = -font_size;
+ }
+ FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
+ new_matrix.Transform(ori_x, ori_y);
+ if (pObject2Device) {
+ new_matrix.Concat(*pObject2Device);
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ if (bNegSize) {
+ glyph_positions[i].x = -pCharPos[i].m_OriginX;
+ } else {
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ }
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ if (bNegSize) {
+ new_matrix.a = -new_matrix.a;
+ } else {
+ new_matrix.b = -new_matrix.b;
+ new_matrix.d = -new_matrix.d;
+ }
+ quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);
+ return quartz2d.drawGraphicsString(pContext,
+ pFont->m_pPlatformFont,
+ font_size,
+ glyph_indices,
+ glyph_positions,
+ nChars,
+ argb,
+ NULL);
+}
+static void _DoNothing(void *info, const void *data, size_t size) {}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS * pCharPos,
+ CFX_Font * pFont,
+ CFX_FontCache * pCache,
+ const CFX_AffineMatrix * pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ for (int i = 0; i < nChars; i ++) {
+ if (pCharPos[i].m_bGlyphAdjust) {
+ return FALSE;
+ }
+ }
+ CGContextRef ctx = CGContextRef(m_pPlatformGraphics);
+ if (NULL == ctx) {
+ return FALSE;
+ }
+ CGContextSaveGState(ctx);
+ CGContextSetTextDrawingMode(ctx, kCGTextFillClip);
+ CGRect rect_cg;
+ CGImageRef pImageCG = NULL;
+ if (m_pClipRgn) {
+ rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());
+ const CFX_DIBitmap* pClipMask = m_pClipRgn->GetMask();
+ if (pClipMask) {
+ CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,
+ pClipMask->GetBuffer(),
+ pClipMask->GetPitch() * pClipMask->GetHeight(),
+ _DoNothing);
+ CGFloat decode_f[2] = {255.f, 0.f};
+ pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),
+ 8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,
+ decode_f, FALSE);
+ CGDataProviderRelease(pClipMaskDataProvider);
+ }
+ } else {
+ rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+ }
+ rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);
+ if (pImageCG) {
+ CGContextClipToMask(ctx, rect_cg, pImageCG);
+ } else {
+ CGContextClipToRect(ctx, rect_cg);
+ }
+ FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);
+ if (pImageCG) {
+ CGImageRelease(pImageCG);
+ }
+ CGContextRestoreGState(ctx);
+ return ret;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+ if (m_pPlatformFont) {
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ quartz2d.DestroyFont(m_pPlatformFont);
+ m_pPlatformFont = NULL;
+ }
+}
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
new file mode 100644
index 0000000000..9a1218bf0b
--- /dev/null
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "apple_int.h"
+#if _FX_OS_ == _FX_MACOSX_
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+#if !defined(_FPDFAPI_MINI_)
+class CFX_MacFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+};
+#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
+#define JAPAN_MINCHO "Hiragino Mincho Pro W6"
+static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0) {
+ face = JAPAN_GOTHIC;
+ return;
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ face = JAPAN_GOTHIC;
+ } else {
+ face = JAPAN_MINCHO;
+ }
+}
+void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case FXFONT_GB2312_CHARSET:
+ face = "STSong";
+ break;
+ case FXFONT_HANGEUL_CHARSET:
+ face = "AppleMyungjo";
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ face = "LiSong Pro Light";
+ }
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ return NULL;
+}
+#endif
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+#if !defined(_FPDFAPI_MINI_)
+ CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ pInfo->AddPath("~/Library/Fonts");
+ pInfo->AddPath("/Library/Fonts");
+ pInfo->AddPath("/System/Library/Fonts");
+ return pInfo;
+#else
+ return NULL;
+#endif
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pPlatformData = FX_NEW CApplePlatform;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CApplePlatform *) m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+#endif
diff --git a/core/src/fxge/apple/fx_quartz_device.cpp b/core/src/fxge/apple/fx_quartz_device.cpp
new file mode 100644
index 0000000000..bef45163f7
--- /dev/null
+++ b/core/src/fxge/apple/fx_quartz_device.cpp
@@ -0,0 +1,1138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#ifndef CGFLOAT_IS_DOUBLE
+#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers
+#endif
+void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap) {
+ return NULL;
+ }
+ CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb32:
+ bmpInfo |= kCGImageAlphaNoneSkipFirst;
+ break;
+ case FXDIB_Argb:
+ default:
+ return NULL;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bmpInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+void CQuartz2D::destroyGraphics(void* graphics)
+{
+ if (graphics) {
+ CGContextRelease((CGContextRef) graphics);
+ }
+}
+void* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)
+{
+ CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
+ if (NULL == pDataProvider) {
+ return NULL;
+ }
+ CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
+ CGDataProviderRelease(pDataProvider);
+ return pCGFont;
+}
+void CQuartz2D::DestroyFont(void* pFont)
+{
+ CGFontRelease((CGFontRef)pFont);
+}
+void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)
+{
+ if (!graphics || !matrix) {
+ return;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
+ CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ ty));
+}
+FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 charsCount,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix )
+{
+ if (!graphics) {
+ return FALSE;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGContextSetFont(context, (CGFontRef)font);
+ CGContextSetFontSize(context, fontSize);
+ if (matrix) {
+ CGAffineTransform m = CGContextGetTextMatrix(context);
+ m = CGAffineTransformConcat(m,
+ CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ matrix->f));
+ CGContextSetTextMatrix(context, m);
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextSaveGState(context);
+#if CGFLOAT_IS_DOUBLE
+ CGPoint* glyphPositionsCG = new CGPoint[charsCount];
+ if (!glyphPositionsCG) {
+ return FALSE;
+ }
+ for (int index = 0; index < charsCount; ++index) {
+ glyphPositionsCG[index].x = glyphPositions[index].x;
+ glyphPositionsCG[index].y = glyphPositions[index].y;
+ }
+#else
+ CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
+#endif
+ CGContextShowGlyphsAtPositions(context,
+ (CGGlyph *) glyphIndices,
+ glyphPositionsCG,
+ charsCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] glyphPositionsCG;
+#endif
+ CGContextRestoreGState(context);
+ return TRUE;
+}
+void CQuartz2D::saveGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextSaveGState((CGContextRef) graphics);
+ }
+}
+void CQuartz2D::restoreGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextRestoreGState((CGContextRef) graphics);
+ }
+}
+static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
+ return NULL;
+ }
+ CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
+ if (pBitmap->HasAlpha()) {
+ bitmapInfo |= kCGImageAlphaPremultipliedFirst;
+ } else {
+ bitmapInfo |= kCGImageAlphaNoneSkipFirst;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bitmapInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)
+{
+ m_saveCount = 0;
+ _context = context;
+ _deviceClass = deviceClass;
+ CGContextRetain(_context);
+ CGRect r = CGContextGetClipBoundingBox(context);
+ _width = FXSYS_round(r.size.width);
+ _height = FXSYS_round(r.size.height);
+ _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |
+ FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
+ FXRC_BIT_MASK | FXRC_ALPHA_MASK;
+ if (_deviceClass != FXDC_DISPLAY) {
+ } else {
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (image) {
+ _renderCaps |= FXRC_GET_BITS;
+ _width = CGImageGetWidth(image);
+ _height = CGImageGetHeight(image);
+ CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
+ if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
+ kCGImageAlphaPremultipliedLast == alphaInfo ||
+ kCGImageAlphaOnly == alphaInfo) {
+ _renderCaps |= FXRC_ALPHA_OUTPUT;
+ }
+ }
+ CGImageRelease(image);
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGContextSaveGState(_context);
+ m_saveCount++;
+ if (ctm.d >= 0) {
+ CGFloat offset_x, offset_y;
+ offset_x = ctm.tx;
+ offset_y = ctm.ty;
+ CGContextTranslateCTM(_context, -offset_x, -offset_y);
+ CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));
+ }
+ _foxitDevice2User = CGAffineTransformIdentity;
+ _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
+}
+CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()
+{
+ CGContextRestoreGState(_context);
+ m_saveCount--;
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)
+{
+ switch (capsID) {
+ case FXDC_DEVICE_CLASS: {
+ return _deviceClass;
+ }
+ case FXDC_PIXEL_WIDTH: {
+ return _width;
+ }
+ case FXDC_PIXEL_HEIGHT: {
+ return _height;
+ }
+ case FXDC_BITS_PIXEL: {
+ return 32;
+ }
+ case FXDC_RENDER_CAPS: {
+ return _renderCaps;
+ }
+ default: {
+ return 0;
+ }
+ }
+}
+CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const
+{
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
+}
+void CFX_QuartzDeviceDriver::SaveState()
+{
+ CGContextSaveGState(_context);
+ m_saveCount++;
+}
+void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )
+{
+ CGContextRestoreGState(_context);
+ if (isKeepSaved) {
+ CGContextSaveGState(_context);
+ } else {
+ m_saveCount--;
+ }
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ int fillMode )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ setPathToContext(pathData);
+ RestoreState(FALSE);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ CGContextClip(_context);
+ } else {
+ CGContextEOClip(_context);
+ }
+ return TRUE;
+}
+FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)
+{
+ FX_FLOAT lineWidth = graphState->m_LineWidth;
+ if (graphState->m_LineWidth <= 0.f) {
+ CGSize size;
+ size.width = 1;
+ size.height = 1;
+ CGSize temp = CGSizeApplyAffineTransform(size, ctm);
+ CGFloat x = 1 / temp.width;
+ CGFloat y = 1 / temp.height;
+ lineWidth = x > y ? x : y;
+ }
+ return lineWidth;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, 0xFF000000, lineWidth);
+ setPathToContext(pathData);
+ CGContextReplacePathWithStrokedPath(_context);
+ RestoreState(FALSE);
+ CGContextClip(_context);
+ return TRUE;
+}
+static CGBlendMode GetCGBlendMode(int blend_type)
+{
+ CGBlendMode mode = kCGBlendModeNormal;
+ switch (blend_type) {
+ case FXDIB_BLEND_NORMAL:
+ mode = kCGBlendModeNormal;
+ break;
+ case FXDIB_BLEND_MULTIPLY:
+ mode = kCGBlendModeMultiply;
+ break;
+ case FXDIB_BLEND_SCREEN:
+ mode = kCGBlendModeScreen;
+ break;
+ case FXDIB_BLEND_OVERLAY:
+ mode = kCGBlendModeOverlay;
+ break;
+ case FXDIB_BLEND_DARKEN:
+ mode = kCGBlendModeDarken;
+ break;
+ case FXDIB_BLEND_LIGHTEN:
+ mode = kCGBlendModeLighten;
+ break;
+ case FXDIB_BLEND_COLORDODGE:
+ mode = kCGBlendModeColorDodge;
+ break;
+ case FXDIB_BLEND_COLORBURN:
+ mode = kCGBlendModeColorBurn;
+ break;
+ case FXDIB_BLEND_HARDLIGHT:
+ mode = kCGBlendModeHardLight;
+ break;
+ case FXDIB_BLEND_SOFTLIGHT:
+ mode = kCGBlendModeSoftLight;
+ break;
+ case FXDIB_BLEND_DIFFERENCE:
+ mode = kCGBlendModeDifference;
+ break;
+ case FXDIB_BLEND_EXCLUSION:
+ mode = kCGBlendModeExclusion;
+ break;
+ case FXDIB_BLEND_HUE:
+ mode = kCGBlendModeHue;
+ break;
+ case FXDIB_BLEND_SATURATION:
+ mode = kCGBlendModeSaturation;
+ break;
+ case FXDIB_BLEND_COLOR:
+ mode = kCGBlendModeColor;
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ mode = kCGBlendModeLuminosity;
+ break;
+ default:
+ mode = kCGBlendModeNormal;
+ break;
+ }
+ return mode;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState,
+ FX_DWORD fillArgb,
+ FX_DWORD strokeArgb,
+ int fillMode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ SaveState();
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ int pathMode = 0;
+ if (graphState && strokeArgb) {
+ CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, strokeArgb, lineWidth);
+ pathMode |= 4;
+ }
+ if (fillMode && fillArgb) {
+ setFillInfo(fillArgb);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ pathMode |= 1;
+ } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
+ pathMode |= 2;
+ }
+ }
+ setPathToContext(pathData);
+ if (fillMode & FXFILL_FULLCOVER) {
+ CGContextSetShouldAntialias(_context, false);
+ }
+ if (pathMode == 4) {
+ CGContextStrokePath(_context);
+ } else if (pathMode == 1) {
+ CGContextFillPath(_context);
+ } else if (pathMode == 2) {
+ CGContextEOFillPath(_context);
+ } else if (pathMode == 5) {
+ CGContextDrawPath(_context, kCGPathFillStroke);
+ } else if (pathMode == 6) {
+ CGContextDrawPath(_context, kCGPathEOFillStroke);
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
+ FX_ARGB fillArgb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ FX_INT32 a, r, g, b;
+ ArgbDecode(fillArgb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
+ FX_FLOAT y1,
+ FX_FLOAT x2,
+ FX_FLOAT y2,
+ FX_DWORD argb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
+ x1 = pt.x;
+ y1 = pt.y;
+ pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
+ x2 = pt.x;
+ y2 = pt.y;
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextMoveToPoint(_context, x1, y1);
+ CGContextAddLineToPoint(_context, x2, y2);
+ CGContextStrokePath(_context);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)
+{
+ CGRect r = CGContextGetClipBoundingBox(_context);
+ r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
+ rect->left = FXSYS_floor(r.origin.x);
+ rect->top = FXSYS_floor(r.origin.y);
+ rect->right = FXSYS_ceil(r.origin.x + r.size.width);
+ rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
+ FX_INT32 left,
+ FX_INT32 top,
+ void* pIccTransform,
+ FX_BOOL bDEdge)
+{
+ if (FXDC_PRINTER == _deviceClass) {
+ return FALSE;
+ }
+ if (bitmap->GetBPP() < 32) {
+ return FALSE;
+ }
+ if (!(_renderCaps | FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CGPoint pt = CGPointMake(left, top);
+ pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ pt.x *= FXSYS_fabs(ctm.a);
+ pt.y *= FXSYS_fabs(ctm.d);
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (NULL == image) {
+ return FALSE;
+ }
+ CGFloat width = (CGFloat) bitmap->GetWidth();
+ CGFloat height = (CGFloat) bitmap->GetHeight();
+ if (width + pt.x > _width) {
+ width -= (width + pt.x - _width);
+ }
+ if (height + pt.y > _height) {
+ height -= (height + pt.y - _height);
+ }
+ CGImageRef subImage = CGImageCreateWithImageInRect(image,
+ CGRectMake(pt.x,
+ pt.y,
+ width,
+ height));
+ CGContextRef context = createContextWithBitmap(bitmap);
+ CGRect rect = CGContextGetClipBoundingBox(context);
+ CGContextClearRect(context, rect);
+ CGContextDrawImage(context, rect, subImage);
+ CGContextRelease(context);
+ CGImageRelease(subImage);
+ CGImageRelease(image);
+ if (bitmap->HasAlpha()) {
+ for (int row = 0; row < bitmap->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);
+ for (int col = 0; col < bitmap->GetWidth(); col ++) {
+ if (pScanline[3] > 0) {
+ pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
+ pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
+ pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
+ }
+ pScanline += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ const FX_RECT* srcRect,
+ int dest_left,
+ int dest_top,
+ int blendType,
+ int alphaFlag ,
+ void* iccTransform )
+{
+ SaveState();
+ CGFloat src_left, src_top, src_width, src_height;
+ if (srcRect) {
+ src_left = srcRect->left;
+ src_top = srcRect->top;
+ src_width = srcRect->Width();
+ src_height = srcRect->Height();
+ } else {
+ src_left = src_top = 0;
+ src_width = pBitmap->GetWidth();
+ src_height = pBitmap->GetHeight();
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGFloat scale_x = FXSYS_fabs(ctm.a);
+ CGFloat scale_y = FXSYS_fabs(ctm.d);
+ src_left /= scale_x;
+ src_top /= scale_y;
+ src_width /= scale_x;
+ src_height /= scale_y;
+ CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ CGContextBeginPath(_context);
+ CGContextAddRect(_context, rect_usr);
+ CGContextClip(_context);
+ rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
+ rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
+ CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect_usr, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ int blend_mode = blendType;
+ if (FXDIB_BLEND_HARDLIGHT == blendType) {
+ blend_mode = kCGBlendModeSoftLight;
+ } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
+ blend_mode = kCGBlendModeHardLight;
+ } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {
+ blend_mode = blendType - 9;
+ } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
+ blend_mode = kCGBlendModeNormal;
+ }
+ CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
+ CGContextDrawImage(_context, rect_usr, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ int dest_left,
+ int dest_top,
+ int dest_width,
+ int dest_height,
+ const FX_RECT* clipRect,
+ FX_DWORD flags,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type)
+{
+ SaveState();
+ if (clipRect) {
+ CGContextBeginPath(_context);
+ CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());
+ rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
+ CGContextAddRect(_context, rect_clip);
+ CGContextClip(_context);
+ }
+ CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
+ rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
+ if (FXDIB_BICUBIC_INTERPOL == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
+ } else if (FXDIB_DOWNSAMPLE == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
+ } else {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
+ }
+ CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ CGContextDrawImage(_context, rect, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ CFX_AffineMatrix text_matrix;
+ if (pObject2Device) {
+ text_matrix.Concat(*pObject2Device);
+ }
+ CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,
+ text_matrix.b,
+ text_matrix.c,
+ text_matrix.d,
+ text_matrix.e,
+ text_matrix.f);
+ matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
+ CGContextSetTextMatrix(_context, matrix_cg);
+ CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
+ CGContextSetFontSize(_context, FXSYS_fabs(font_size));
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ SaveState();
+ if (pGlyphMatrix) {
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGPoint origin = CGPointMake( glyph_positions[0].x, glyph_positions[0].y);
+ origin = CGPointApplyAffineTransform(origin, matrix_cg);
+ CGContextTranslateCTM(_context, origin.x, origin.y);
+ CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,
+ pGlyphMatrix->b,
+ pGlyphMatrix->c,
+ pGlyphMatrix->d,
+ pGlyphMatrix->e,
+ pGlyphMatrix->f);
+ if (_foxitDevice2User.d < 0) {
+ glyph_matrix = CGAffineTransformInvert(glyph_matrix);
+ }
+ CGContextConcatCTM(_context, glyph_matrix);
+ CGContextTranslateCTM(_context, -origin.x, -origin.y);
+ }
+ CGContextShowGlyphsAtPositions(_context,
+ (CGGlyph*)glyph_indices,
+ glyph_positions,
+ nChars);
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD color,
+ int alpha_flag ,
+ void* pIccTransform)
+{
+ if (NULL == pFont || NULL == _context) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ SaveState();
+ CGContextSetTextDrawingMode(_context, kCGTextFillClip);
+ FX_BOOL ret = FALSE;
+ FX_INT32 i = 0;
+ while (i < nChars) {
+ if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ }
+ const FXTEXT_CHARPOS* char_pos = pCharPos + i;
+ CFX_AffineMatrix glphy_matrix;
+ if (font_size < 0) {
+ glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
+ }
+ if (char_pos->m_bGlyphAdjust) {
+ glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],
+ char_pos->m_AdjustMatrix[1],
+ char_pos->m_AdjustMatrix[2],
+ char_pos->m_AdjustMatrix[3], 0, 0);
+ }
+ ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ i ++;
+ pCharPos += i;
+ nChars -= i;
+ i = 0;
+ } else {
+ i ++;
+ }
+ }
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ }
+ RestoreState(FALSE);
+ return ret;
+}
+void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)
+{
+ if (NULL == graphState) {
+ return;
+ }
+ CGContextSetLineWidth(_context, lineWidth);
+ CGLineCap cap;
+ switch (graphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapRound: {
+ cap = kCGLineCapRound;
+ break;
+ }
+ case CFX_GraphStateData::LineCapSquare: {
+ cap = kCGLineCapSquare;
+ break;
+ }
+ case CFX_GraphStateData::LineCapButt:
+ default: {
+ cap = kCGLineCapButt;
+ }
+ }
+ CGContextSetLineCap(_context, cap);
+ CGLineJoin join;
+ switch (graphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinRound: {
+ join = kCGLineJoinRound;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinBevel: {
+ join = kCGLineJoinBevel;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinMiter:
+ default: {
+ join = kCGLineJoinMiter;
+ }
+ }
+ CGContextSetLineJoin(_context, join);
+ if (graphState->m_DashCount) {
+#if CGFLOAT_IS_DOUBLE
+ CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
+ if (!dashArray) {
+ return;
+ }
+ for (int index = 0; index < graphState->m_DashCount; ++index) {
+ dashArray[index] = graphState->m_DashArray[index];
+ }
+#else
+ CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
+#endif
+ CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] dashArray;
+#endif
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)
+{
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)
+{
+ FX_INT32 count = pathData->GetPointCount();
+ FX_PATHPOINT* points = pathData->GetPoints();
+ CGContextBeginPath(_context);
+ for (FX_INT32 i = 0; i < count; i ++) {
+ switch (points[i].m_Flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_LINETO:
+ CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_BEZIERTO: {
+ CGContextAddCurveToPoint(_context,
+ points[i].m_PointX, points[i].m_PointY,
+ points[i + 1].m_PointX, points[i + 1].m_PointY,
+ points[i + 2].m_PointX, points[i + 2].m_PointY);
+ i += 2;
+ }
+ }
+ if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
+ CGContextClosePath(_context);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,
+ CGRect* rect )
+{
+ int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
+ int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
+ if (flip_y < 0 || flip_x < 0) {
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);
+ CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
+ offset_y = (rt.origin.y) + rt.size.height / 2.f;
+ CGAffineTransform transform = CGAffineTransformIdentity;
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
+ CGContextConcatCTM(_context, transform);
+ if (rect) {
+ *rect = CGRectApplyAffineTransform(*rect, transform);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::ClearDriver()
+{
+ if (NULL == _context) {
+ return;
+ }
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ m_saveCount = 0;
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+CFX_QuartzDevice::CFX_QuartzDevice()
+{
+ m_bOwnedBitmap = FALSE;
+ m_pContext = NULL;
+}
+CFX_QuartzDevice::~CFX_QuartzDevice()
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ if (GetBitmap() && m_bOwnedBitmap) {
+ delete GetBitmap();
+ }
+}
+CGContextRef CFX_QuartzDevice::GetContext()
+{
+ return m_pContext;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ m_pContext = context;
+ CGContextRetain(m_pContext);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)
+{
+ SetBitmap(pBitmap);
+ m_pContext = createContextWithBitmap(pBitmap);
+ if (NULL == m_pContext) {
+ return FALSE;
+ }
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)
+{
+ if ((FX_BYTE)format < 32) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return FALSE;
+ }
+ if (!pBitmap->Create(width, height, format)) {
+ delete pBitmap;
+ return FALSE;
+ }
+ m_bOwnedBitmap = TRUE;
+ return Attach(pBitmap);
+}
+#endif
diff --git a/core/src/fxge/dib/dib_int.h b/core/src/fxge/dib/dib_int.h
new file mode 100644
index 0000000000..a9d0b027c5
--- /dev/null
+++ b/core/src/fxge/dib/dib_int.h
@@ -0,0 +1,88 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+class CPDF_FixedMatrix : public CFX_Object
+{
+public:
+ CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
+ {
+ base = 1 << bits;
+ a = FXSYS_round(src.a * base);
+ b = FXSYS_round(src.b * base);
+ c = FXSYS_round(src.c * base);
+ d = FXSYS_round(src.d * base);
+ e = FXSYS_round(src.e * base);
+ f = FXSYS_round(src.f * base);
+ }
+ inline void Transform(int x, int y, int& x1, int& y1)
+ {
+ x1 = (a * x + c * y + e + base / 2) / base;
+ y1 = (b * x + d * y + f + base / 2) / base;
+ }
+ int a, b, c, d, e, f;
+ int base;
+};
+#define FPDF_HUGE_IMAGE_SIZE 60000000
+struct PixelWeight {
+ int m_SrcStart;
+ int m_SrcEnd;
+ int m_Weights[1];
+};
+class CWeightTable : public CFX_Object
+{
+public:
+ CWeightTable()
+ {
+ m_pWeightTables = NULL;
+ }
+ ~CWeightTable()
+ {
+ if(m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ }
+ m_pWeightTables = NULL;
+ }
+ void Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
+ PixelWeight* GetPixelWeight(int pixel)
+ {
+ return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
+ }
+ int m_DestMin, m_ItemSize;
+ FX_LPBYTE m_pWeightTables;
+};
+class CStretchEngine : public CFX_Object
+{
+public:
+ CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags);
+ ~CStretchEngine();
+ FX_BOOL Continue(IFX_Pause* pPause);
+public:
+ FXDIB_Format m_DestFormat;
+ int m_DestBpp, m_SrcBpp, m_bHasAlpha;
+ IFX_ScanlineComposer* m_pDestBitmap;
+ int m_DestWidth, m_DestHeight;
+ FX_RECT m_DestClip;
+ FX_LPBYTE m_pDestScanline;
+ FX_LPBYTE m_pDestMaskScanline;
+ FX_RECT m_SrcClip;
+ const CFX_DIBSource* m_pSource;
+ FX_DWORD* m_pSrcPalette;
+ int m_SrcWidth, m_SrcHeight;
+ int m_SrcPitch, m_InterPitch;
+ int m_ExtraMaskPitch;
+ unsigned char* m_pInterBuf;
+ unsigned char* m_pExtraAlphaBuf;
+ int m_TransMethod;
+ int m_Flags;
+ CWeightTable m_WeightTable;
+ int m_CurRow;
+ FX_BOOL StartStretchHorz();
+ FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
+ void StretchVert();
+ int m_State;
+};
diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
new file mode 100644
index 0000000000..8e9b4912a8
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_composite.cpp
@@ -0,0 +1,4602 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+const FX_BYTE g_GammaRamp[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13,
+ 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20,
+ 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 29,
+ 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41,
+ 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88,
+ 90, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109,
+ 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,
+ 134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,
+ 161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,
+ 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
+ 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,
+};
+const FX_BYTE g_GammaInverse[256] = {
+ 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66, 69,
+ 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98,
+ 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,
+ 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
+ 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
+ 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
+ 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
+ 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
+ 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
+ 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
+ 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
+ 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
+ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
+ 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
+};
+const FX_BYTE _color_sqrt[256] = {
+ 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,
+ 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,
+ 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,
+ 0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,
+ 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,
+ 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,
+ 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,
+ 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
+ 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,
+ 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,
+ 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
+};
+int _BLEND(int blend_mode, int back_color, int src_color)
+{
+ switch (blend_mode) {
+ case FXDIB_BLEND_NORMAL:
+ return src_color;
+ case FXDIB_BLEND_MULTIPLY:
+ return src_color * back_color / 255;
+ case FXDIB_BLEND_SCREEN:
+ return src_color + back_color - src_color * back_color / 255;
+ case FXDIB_BLEND_OVERLAY:
+ return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
+ case FXDIB_BLEND_DARKEN:
+ return src_color < back_color ? src_color : back_color;
+ case FXDIB_BLEND_LIGHTEN:
+ return src_color > back_color ? src_color : back_color;
+ case FXDIB_BLEND_COLORDODGE: {
+ if (src_color == 255) {
+ return src_color;
+ }
+ int result = back_color * 255 / (255 - src_color);
+ if (result > 255) {
+ return 255;
+ }
+ return result;
+ }
+ case FXDIB_BLEND_COLORBURN: {
+ if (src_color == 0) {
+ return src_color;
+ }
+ int result = (255 - back_color) * 255 / src_color;
+ if (result > 255) {
+ result = 255;
+ }
+ return 255 - result;
+ }
+ case FXDIB_BLEND_HARDLIGHT:
+ if (src_color < 128) {
+ return (src_color * back_color * 2) / 255;
+ }
+ return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
+ case FXDIB_BLEND_SOFTLIGHT: {
+ if (src_color < 128) {
+ return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;
+ }
+ return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;
+ }
+ case FXDIB_BLEND_DIFFERENCE:
+ return back_color < src_color ? src_color - back_color : back_color - src_color;
+ case FXDIB_BLEND_EXCLUSION:
+ return back_color + src_color - 2 * back_color * src_color / 255;
+ }
+ return src_color;
+}
+struct _RGB {
+ int red;
+ int green;
+ int blue;
+};
+static inline int _Lum(_RGB color)
+{
+ return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
+}
+static _RGB _ClipColor(_RGB color)
+{
+ int l = _Lum(color);
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ if (n < 0) {
+ color.red = l + ((color.red - l) * l / (l - n));
+ color.green = l + ((color.green - l) * l / (l - n));
+ color.blue = l + ((color.blue - l) * l / (l - n));
+ }
+ if (x > 255) {
+ color.red = l + ((color.red - l) * (255 - l) / (x - l));
+ color.green = l + ((color.green - l) * (255 - l) / (x - l));
+ color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
+ }
+ return color;
+}
+static _RGB _SetLum(_RGB color, int l)
+{
+ int d = l - _Lum(color);
+ color.red += d;
+ color.green += d;
+ color.blue += d;
+ return _ClipColor(color);
+}
+static int _Sat(_RGB color)
+{
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ return x - n;
+}
+static _RGB _SetSat(_RGB color, int s)
+{
+ int* max = &color.red;
+ int* mid = &color.red;
+ int* min = &color.red;
+ if (color.green > *max) {
+ max = &color.green;
+ }
+ if (color.blue > *max) {
+ max = &color.blue;
+ }
+ if (color.green < *min) {
+ min = &color.green;
+ }
+ if (color.blue < *min) {
+ min = &color.blue;
+ }
+ if (*max == *min) {
+ color.red = 0;
+ color.green = 0;
+ color.blue = 0;
+ return color;
+ }
+ if (max == &color.red) {
+ if (min == &color.green) {
+ mid = &color.blue;
+ } else {
+ mid = &color.green;
+ }
+ } else if (max == &color.green) {
+ if (min == &color.red) {
+ mid = &color.blue;
+ } else {
+ mid = &color.red;
+ }
+ } else {
+ if (min == &color.green) {
+ mid = &color.red;
+ } else {
+ mid = &color.green;
+ }
+ }
+ if (*max > *min) {
+ *mid = (*mid - *min) * s / (*max - *min);
+ *max = s;
+ *min = 0;
+ }
+ return color;
+}
+void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])
+{
+ _RGB src, back, result;
+ src.red = src_scan[2];
+ src.green = src_scan[1];
+ src.blue = src_scan[0];
+ back.red = dest_scan[2];
+ back.green = dest_scan[1];
+ back.blue = dest_scan[0];
+ switch (blend_mode) {
+ case FXDIB_BLEND_HUE:
+ result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
+ break;
+ case FXDIB_BLEND_SATURATION:
+ result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
+ break;
+ case FXDIB_BLEND_COLOR:
+ result = _SetLum(src, _Lum(back));
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ result = _SetLum(back, _Lum(src));
+ break;
+ }
+ results[0] = result.blue;
+ results[1] = result.green;
+ results[2] = result.red;
+}
+inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ src_scan += 3;
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_scan;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)
+{
+ if (clip_scan) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
+ dest_scan ++;
+ clip_scan ++;
+ }
+ } else {
+ FXSYS_memset8(dest_scan, 0xff, width);
+ }
+}
+void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ int blended_color;
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ int back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 255) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ if (dest_alpha_scan == NULL) {
+ if (src_alpha_scan == NULL) {
+ FX_BYTE back_alpha = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
+ } else {
+ FXARGB_COPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = *src_alpha_scan;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 4;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan ++;
+ }
+ }
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ continue;
+ }
+ *dest_alpha_scan++ = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_alpha_scan++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+ } else {
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = blended;
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ if (dest_Bpp == src_Bpp) {
+ FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
+ return;
+ }
+ for (int col = 0; col < width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ } else if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan += dest_Bpp - 2;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ FX_LPBYTE dp = src_cache_scan;
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = *src_alpha_scan++;
+ src_scan += 3;
+ dp += 4;
+ }
+ src_alpha_scan = NULL;
+ } else {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
+ }
+ } else {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = src_scan[3];
+ src_scan += 4;
+ dp += 4;
+ }
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_cache_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_cache_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ }
+ return;
+ }
+ }
+ _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_cache_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_alpha_scan ++;
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ dest_alpha_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ int dest_gap = DestBpp - 3;
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ src_scan ++;
+ FX_BYTE src_alpha = 0;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += DestBpp;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ dest_scan ++;
+ dest_scan += dest_gap;
+ }
+ } else {
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
+ }
+ dest_scan += 4;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan ++ = src_alpha;
+ } else {
+ *dest_alpha_scan ++ = *src_alpha_scan;
+ }
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+}
+void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,
+ FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[0] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[2] = src_r;
+ *dest_alpha_scan = mask_alpha;
+ }
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = mask_alpha;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_r;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_b;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ dest_scan[3] = src_alpha;
+ dest_scan[0] = src_scan[2];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[0];
+ } else {
+ FXARGB_RGBORDERCOPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ } else {
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
+ }
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan++;
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(blended);
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ for (int col = 0; col < width; col ++) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ src_scan += src_gap;
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ } else if (src_alpha) {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (pPalette) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_r = FXARGB_R(argb);
+ src_g = FXARGB_G(argb);
+ src_b = FXARGB_B(argb);
+ } else {
+ src_r = src_g = src_b = *src_scan;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ src_scan ++;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
+ }
+ dest_scan += Bpp;
+ }
+}
+void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETRGBORDERDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int back_color = FX_GAMMA(dest_scan[2]);
+ int blended = _BLEND(blend_type, back_color, src_b);
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[1]);
+ blended = _BLEND(blend_type, back_color, src_g);
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[0]);
+ blended = _BLEND(blend_type, back_color, src_r);
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ } else {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
+ }
+ dest_scan += Bpp;
+ }
+}
+inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
+ int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ if (alpha_flag >> 8) {
+ mask_alpha = alpha_flag & 0xff;
+ mask_red = FXSYS_GetCValue(mask_color);
+ mask_green = FXSYS_GetMValue(mask_color);
+ mask_blue = FXSYS_GetYValue(mask_color);
+ mask_black = FXSYS_GetKValue(mask_color);
+ } else {
+ mask_alpha = FXARGB_A(mask_color);
+ mask_red = FXARGB_R(mask_color);
+ mask_green = FXARGB_G(mask_color);
+ mask_blue = FXARGB_B(mask_color);
+ }
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ if ((dest_format & 0xff) == 8) {
+ if (pIccTransform) {
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
+ pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
+ mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
+ r, g, b);
+ mask_red = FXRGB2GRAY(r, g, b);
+ } else {
+ mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
+ }
+ if (dest_format & 0x0400) {
+ mask_red = FX_CCOLOR(mask_red);
+ }
+ }
+ } else {
+ FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ } else if (alpha_flag >> 8) {
+ AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],
+ mask_color_p[2], mask_color_p[1], mask_color_p[0]);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ }
+ }
+ return TRUE;
+}
+inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,
+ FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
+ FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
+ pDestPalette = NULL;
+ if (pIccTransform) {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ for (int i = 0; i < pal_count; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
+ gray_pal ++;
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ for (int i = 0; i < palsize; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ }
+ }
+ } else {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ if ((dest_format & 0xff) == 8) {
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ pDestPalette = FX_Alloc(FX_DWORD, pal_count);
+ if (!pDestPalette) {
+ FX_Free(gray_pal);
+ return;
+ }
+ for (int i = 0; i < pal_count; i ++) {
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
+ }
+ FX_Free(gray_pal);
+ }
+ }
+ } else {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ if (isSrcCmyk) {
+ for (int i = 0; i < pal_count; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ *gray_pal ++ = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < pal_count; i ++) {
+ FX_ARGB argb = pSrcPalette[i];
+ *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (isDstCmyk == isSrcCmyk) {
+ FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
+ } else {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ } else {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (palsize == 2) {
+ pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
+ pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
+ } else {
+ for (int i = 0; i < palsize; i++) {
+ pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
+ }
+ }
+ if (isSrcCmyk != isDstCmyk) {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pDestPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ }
+ }
+}
+CFX_ScanlineCompositor::CFX_ScanlineCompositor()
+{
+ m_pSrcPalette = NULL;
+ m_pCacheScanline = NULL;
+ m_CacheSize = 0;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
+{
+ if (m_pSrcPalette) {
+ FX_Free(m_pSrcPalette);
+ }
+ if (m_pCacheScanline) {
+ FX_Free(m_pCacheScanline);
+ }
+}
+FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
+ FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ m_SrcFormat = src_format;
+ m_DestFormat = dest_format;
+ m_BlendType = blend_type;
+ m_bRgbByteOrder = bRgbByteOrder;
+ ICodec_IccModule* pIccModule = NULL;
+ if (CFX_GEModule::Get()->GetCodecModule()) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (pIccModule == NULL) {
+ pIccTransform = NULL;
+ }
+ m_pIccTransform = pIccTransform;
+ if ((dest_format & 0xff) == 1) {
+ return FALSE;
+ }
+ if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
+ return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,
+ m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,
+ pIccModule, pIccTransform);
+ }
+ if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {
+ return FALSE;
+ }
+ if ((m_SrcFormat & 0xff) <= 8) {
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,
+ pIccModule, pIccTransform);
+ m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)
+ + (dest_format & 0x0200 ? 2 : 0)
+ + (dest_format & 0x0400 ? 4 : 0)
+ + ((src_format & 0xff) == 1 ? 8 : 0);
+ return TRUE;
+ }
+ m_Transparency = (src_format & 0x0200 ? 0 : 1)
+ + (dest_format & 0x0200 ? 0 : 2)
+ + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)
+ + (bClip ? 8 : 0)
+ + (src_format & 0x0400 ? 16 : 0)
+ + (dest_format & 0x0400 ? 32 : 0)
+ + (pIccTransform ? 64 : 0);
+ return TRUE;
+}
+void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ int src_Bpp = (m_SrcFormat & 0xff) >> 3;
+ int dest_Bpp = (m_DestFormat & 0xff) >> 3;
+ int dest_Size = width * dest_Bpp + 4;
+ if (m_bRgbByteOrder) {
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 12:
+ _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);
+ break;
+ case 2:
+ case 10:
+ _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
+ break;
+ case 3:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 5:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);
+ break;
+ case 6:
+ case 14:
+ _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
+ break;
+ case 7:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 9:
+ _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
+ break;
+ case 11:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 13:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);
+ break;
+ case 15:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ if (m_SrcFormat & 0x0200) {
+ if (m_SrcFormat == FXDIB_Argb) {
+ _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
+ } else {
+ _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
+ }
+ } else {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ }
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ if (m_SrcFormat & 0x0200) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
+ }
+ } else {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);
+ }
+ }
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ } else {
+ if (dest_Size > m_CacheSize) {
+ m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
+ if (!m_pCacheScanline) {
+ return;
+ }
+ m_CacheSize = dest_Size;
+ }
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 4+8: {
+ _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ }
+ break;
+ case 64:
+ case 4+64:
+ case 8+64:
+ case 4+8+64: {
+ _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ }
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+64:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+8:
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+8+64:
+ _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+4+64:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4+8:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+4+8+64:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2:
+ case 2+8:
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+64:
+ case 2+8+64:
+ _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2+4:
+ case 2+4+8:
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+4+64:
+ case 2+4+8+64:
+ _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+64:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+8:
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+8+64:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+4+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4+8:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+4+8+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_bRgbByteOrder) {
+ if (m_SrcFormat == FXDIB_1bppRgb) {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if(m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ } else {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if (m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ return;
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_Transparency & 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
+ }
+ } else {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ else
+ _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ src_extra_alpha);
+ }
+ } else {
+ switch (m_Transparency) {
+ case 1+2:
+ _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,
+ src_extra_alpha);
+ break;
+ case 1+2+8:
+ _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ break;
+ case 0:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+8:
+ _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ break;
+ case 0+2:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+2+8:
+ _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,
+ dst_extra_alpha);
+ break;
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgba)
+ _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan, dst_extra_alpha);
+}
+void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,
+ dst_extra_alpha);
+ else {
+ _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+}
+FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(!pSrcBitmap->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
+ src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,
+ pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {
+ return FALSE;
+ }
+ int dest_Bpp = m_bpp / 8;
+ int src_Bpp = pSrcBitmap->GetBPP() / 8;
+ FX_BOOL bRgb = FALSE;
+ FX_BOOL bCmyk = FALSE;
+ if (src_Bpp > 1) {
+ if (pSrcBitmap->IsCmykImage()) {
+ bCmyk = TRUE;
+ } else {
+ bRgb = TRUE;
+ }
+ }
+ CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
+ FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (bRgb) {
+ compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pMask->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (!pMask->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ int src_bpp = pMask->GetBPP();
+ int Bpp = GetBPP() / 8;
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (src_bpp == 1) {
+ compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ FX_RECT rect(left, top, left + width, top + height);
+ rect.Intersect(0, 0, m_Width, m_Height);
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ width = rect.Width();
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (m_bpp == 8) {
+ FX_BYTE gray = 255;
+ if (!IsAlphaMask()) {
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],
+ r, g, b);
+ gray = FXRGB2GRAY(r, g, b);
+ } else {
+ gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
+ }
+ }
+ if (IsCmykImage()) {
+ gray = ~gray;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
+ if (src_alpha == 255) {
+ FXSYS_memset8(dest_scan, gray, width);
+ } else
+ for (int col = 0; col < width; col ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+ } else if (m_bpp == 1) {
+ ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
+ int left_shift = rect.left % 8;
+ int right_shift = rect.right % 8;
+ int width = rect.right / 8 - rect.left / 8;
+ int index = 0;
+ if (m_pPalette == NULL) {
+ index = ((FX_BYTE)color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (m_pPalette[i] == color) {
+ index = i;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
+ FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
+ FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
+ FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
+ if (width) {
+ FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
+ if (!index) {
+ *dest_scan_top &= left_flag;
+ *dest_scan_top_r &= right_flag;
+ } else {
+ *dest_scan_top |= ~left_flag;
+ *dest_scan_top_r |= ~right_flag;
+ }
+ } else {
+ if (!index) {
+ *dest_scan_top &= left_flag | right_flag;
+ } else {
+ *dest_scan_top |= ~(left_flag | right_flag);
+ }
+ }
+ }
+ return TRUE;
+ }
+ ASSERT(m_bpp >= 24);
+ if (m_bpp < 24) {
+ return FALSE;
+ }
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)src_alpha;
+ }
+ int Bpp = m_bpp / 8;
+ FX_BOOL bAlpha = HasAlpha();
+ FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
+ if (src_alpha == 255) {
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;
+ if (dest_scan_alpha) {
+ FXSYS_memset8(dest_scan_alpha, 0xff, width);
+ }
+ if (Bpp == 4) {
+ FX_DWORD* scan = (FX_DWORD*)dest_scan;
+ for (int col = 0; col < width; col ++) {
+ *scan ++ = dst_color;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan ++ = color_p[0];
+ *dest_scan ++ = color_p[1];
+ *dest_scan ++ = color_p[2];
+ }
+ }
+ }
+ return TRUE;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ if (bAlpha) {
+ if (bArgb) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
+ dest_scan ++;
+ *dest_scan++ = dest_alpha;
+ }
+ } else {
+ FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_scan_alpha;
+ if (back_alpha == 0) {
+ *dest_scan_alpha++ = src_alpha;
+ FXSYS_memcpy32(dest_scan, color_p, Bpp);
+ dest_scan += Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_scan_alpha ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for(int comps = 0; comps < Bpp; comps ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ for(int comps = 0; comps < Bpp; comps ++) {
+ if (comps == 3) {
+ *dest_scan ++ = 255;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
+ dest_scan ++;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_BitmapComposer::CFX_BitmapComposer()
+{
+ m_pScanlineV = NULL;
+ m_pScanlineAlphaV = NULL;
+ m_pClipScanV = NULL;
+ m_pAddClipScan = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_BitmapComposer::~CFX_BitmapComposer()
+{
+ if (m_pScanlineV) {
+ FX_Free(m_pScanlineV);
+ }
+ if (m_pScanlineAlphaV) {
+ FX_Free(m_pScanlineAlphaV);
+ }
+ if (m_pClipScanV) {
+ FX_Free(m_pClipScanV);
+ }
+ if (m_pAddClipScan) {
+ FX_Free(m_pAddClipScan);
+ }
+}
+void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
+ FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
+ FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_pBitmap = pDest;
+ m_pClipRgn = pClipRgn;
+ m_DestLeft = dest_rect.left;
+ m_DestTop = dest_rect.top;
+ m_DestWidth = dest_rect.Width();
+ m_DestHeight = dest_rect.Height();
+ m_BitmapAlpha = bitmap_alpha;
+ m_MaskColor = mask_color;
+ m_pClipMask = NULL;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ m_pClipMask = pClipRgn->GetMask();
+ }
+ m_bVertical = bVertical;
+ m_bFlipX = bFlipX;
+ m_bFlipY = bFlipY;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+}
+FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_SrcFormat = src_format;
+ if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,
+ m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {
+ return FALSE;
+ }
+ if (m_bVertical) {
+ m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
+ if (!m_pScanlineV) {
+ return FALSE;
+ }
+ m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
+ if (!m_pClipScanV) {
+ return FALSE;
+ }
+ if (m_pBitmap->m_pAlphaMask) {
+ m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
+ if (!m_pScanlineAlphaV) {
+ return FALSE;
+ }
+ }
+ }
+ if (m_BitmapAlpha < 255) {
+ m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
+ if (!m_pAddClipScan) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_BitmapAlpha < 255) {
+ if (clip_scan) {
+ for (int i = 0; i < dest_width; i ++) {
+ m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
+ }
+ } else {
+ FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
+ }
+ clip_scan = m_pAddClipScan;
+ }
+ if (m_SrcFormat == FXDIB_8bppMask) {
+ m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
+ } else if ((m_SrcFormat & 0xff) == 8) {
+ m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ } else {
+ m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ }
+}
+void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ if (m_bVertical) {
+ ComposeScanlineV(line, scanline, scan_extra_alpha);
+ return;
+ }
+ FX_LPCBYTE clip_scan = NULL;
+ if (m_pClipMask)
+ clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *
+ m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);
+ FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
+ m_DestLeft * m_pBitmap->GetBPP() / 8;
+ FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;
+ DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);
+}
+void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ int i;
+ int Bpp = m_pBitmap->GetBPP() / 8;
+ int dest_pitch = m_pBitmap->GetPitch();
+ int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
+ int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
+ FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;
+ if (m_bFlipY) {
+ dest_buf += dest_pitch * (m_DestHeight - 1);
+ dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
+ }
+ int y_step = dest_pitch;
+ int y_alpha_step = dest_alpha_pitch;
+ if (m_bFlipY) {
+ y_step = -y_step;
+ y_alpha_step = -y_alpha_step;
+ }
+ FX_LPBYTE src_scan = m_pScanlineV;
+ FX_LPBYTE dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ *src_scan++ = dest_scan[j];
+ }
+ dest_scan += y_step;
+ }
+ FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
+ FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *src_alpha_scan++ = *dest_alpha_scan;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+ FX_LPBYTE clip_scan = NULL;
+ if (m_pClipMask) {
+ clip_scan = m_pClipScanV;
+ int clip_pitch = m_pClipMask->GetPitch();
+ FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *
+ clip_pitch + (dest_x - m_pClipRgn->GetBox().left);
+ if (m_bFlipY) {
+ src_clip += clip_pitch * (m_DestHeight - 1);
+ clip_pitch = -clip_pitch;
+ }
+ for (i = 0; i < m_DestHeight; i ++) {
+ clip_scan[i] = *src_clip;
+ src_clip += clip_pitch;
+ }
+ }
+ DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
+ src_scan = m_pScanlineV;
+ dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ dest_scan[j] = *src_scan++;
+ }
+ dest_scan += y_step;
+ }
+ src_alpha_scan = m_pScanlineAlphaV;
+ dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *dest_alpha_scan = *src_alpha_scan++;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+}
diff --git a/core/src/fxge/dib/fx_dib_convert.cpp b/core/src/fxge/dib/fx_dib_convert.cpp
new file mode 100644
index 0000000000..fe4a7bfd9a
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_convert.cpp
@@ -0,0 +1,1090 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+const FX_DWORD g_dwWinPalette[256] = {
+ 0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,
+ 0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,
+ 0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,
+ 0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,
+ 0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,
+ 0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,
+ 0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,
+ 0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,
+ 0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,
+ 0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,
+ 0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,
+ 0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,
+ 0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,
+ 0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,
+ 0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,
+ 0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,
+ 0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,
+ 0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,
+ 0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,
+ 0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,
+ 0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,
+ 0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,
+ 0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,
+ 0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,
+ 0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,
+ 0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,
+ 0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,
+ 0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,
+ 0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,
+ 0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,
+ 0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,
+ 0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,
+ 0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,
+ 0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,
+ 0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,
+ 0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,
+ 0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,
+ 0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,
+ 0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,
+ 0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,
+ 0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,
+ 0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,
+ 0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF
+};
+const FX_DWORD g_dwMacPalette[256] = {
+ 0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,
+ 0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,
+ 0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,
+ 0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,
+ 0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,
+ 0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,
+ 0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,
+ 0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,
+ 0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,
+ 0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,
+ 0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,
+ 0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,
+ 0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,
+ 0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,
+ 0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,
+ 0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,
+ 0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,
+ 0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,
+ 0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,
+ 0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,
+ 0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,
+ 0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,
+ 0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,
+ 0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,
+ 0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,
+ 0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,
+ 0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,
+ 0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,
+ 0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,
+ 0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,
+ 0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,
+ 0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,
+ 0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,
+ 0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,
+ 0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,
+ 0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,
+ 0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,
+ 0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,
+ 0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,
+ 0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,
+ 0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,
+ 0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,
+ 0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000
+};
+class CFX_Palette : public CFX_Object
+{
+public:
+ CFX_Palette();
+ ~CFX_Palette();
+public:
+ FX_BOOL BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);
+ FX_DWORD* GetPalette() const
+ {
+ return m_pPalette;
+ }
+
+ FX_DWORD* GetColorLut()const
+ {
+ return m_cLut;
+ }
+ FX_DWORD* GetAmountLut()const
+ {
+ return m_aLut;
+ }
+ FX_INT32 Getlut()const
+ {
+ return m_lut;
+ }
+protected:
+ FX_DWORD* m_pPalette;
+ FX_DWORD* m_cLut;
+ FX_DWORD* m_aLut;
+ int m_lut;
+};
+int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ FX_DWORD p_a = alut[l];
+ FX_DWORD p_c = clut[l];
+ while(l < r) {
+ while(l < r && alut[r] >= p_a) {
+ r--;
+ }
+ if (l < r) {
+ alut[l] = alut[r];
+ clut[l++] = clut[r];
+ }
+ while(l < r && alut[l] <= p_a) {
+ l++;
+ }
+ if (l < r) {
+ alut[r] = alut[l];
+ clut[r--] = clut[l];
+ }
+ }
+ alut[l] = p_a;
+ clut[l] = p_c;
+ return l;
+}
+void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ if(l < r) {
+ int pI = _Partition(alut, clut, l, r);
+ _Qsort(alut, clut, l, pI - 1);
+ _Qsort(alut, clut, pI + 1, r);
+ }
+}
+void _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)
+{
+ r = (FX_BYTE)((pal_v & 0xf00) >> 4);
+ g = (FX_BYTE)(pal_v & 0x0f0);
+ b = (FX_BYTE)((pal_v & 0x00f) << 4);
+}
+void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)
+{
+ int row, col;
+ FX_DWORD lut_1 = lut - 1;
+ if (pal_type == FXDIB_PALETTE_LOC) {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_DWORD color = cLut[lut_offset];
+ FX_BYTE r, g, b;
+ _ColorDecode(color, r, g, b);
+ dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;
+ aLut[lut_offset] = row;
+ }
+ } else {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[lut_offset], r, g, b);
+ int error, min_error = 1000000;
+ int c_index = 0;
+ for (col = 0; col < 256; col++) {
+ FX_DWORD p_color = win_mac_pal[col];
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)p_color;
+ error = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (error < min_error) {
+ min_error = error;
+ c_index = col;
+ }
+ }
+ dest_pal[row] = win_mac_pal[c_index];
+ aLut[lut_offset] = row;
+ }
+ }
+}
+CFX_Palette::CFX_Palette()
+{
+ m_pPalette = NULL;
+ m_cLut = NULL;
+ m_aLut = NULL;
+ m_lut = 0;
+}
+CFX_Palette::~CFX_Palette()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ }
+ m_lut = 0;
+}
+FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)
+{
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (m_pPalette != NULL) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pPalette, 0, sizeof(FX_DWORD) * 256);
+ int bpp = pBitmap->GetBPP() / 8;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ m_cLut = NULL;
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ m_aLut = NULL;
+ }
+ m_cLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_cLut) {
+ return FALSE;
+ }
+ m_aLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_aLut) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_aLut, 0, sizeof(FX_DWORD) * 4096);
+ FXSYS_memset32(m_cLut, 0, sizeof(FX_DWORD) * 4096);
+ int row, col;
+ m_lut = 0;
+ for (row = 0; row < height; row++) {
+ FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = scan_line + col * bpp;
+ FX_DWORD b = src_port[0] & 0xf0;
+ FX_DWORD g = src_port[1] & 0xf0;
+ FX_DWORD r = src_port[2] & 0xf0;
+ FX_DWORD index = (r << 4) + g + (b >> 4);
+ m_aLut[index]++;
+ }
+ }
+ for (row = 0; row < 4096; row++) {
+ if (m_aLut[row] != 0) {
+ m_aLut[m_lut] = m_aLut[row];
+ m_cLut[m_lut] = row;
+ m_lut++;
+ }
+ }
+ _Qsort(m_aLut, m_cLut, 0, m_lut - 1);
+ FX_DWORD* win_mac_pal = NULL;
+ if (pal_type == FXDIB_PALETTE_WIN) {
+ win_mac_pal = (FX_DWORD*)g_dwWinPalette;
+ } else if (pal_type == FXDIB_PALETTE_MAC) {
+ win_mac_pal = (FX_DWORD*)g_dwMacPalette;
+ }
+ _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, reset_gray, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = set_gray;
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[2];
+ if (pIccTransform) {
+ FX_DWORD plt[2];
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);
+ } else {
+ FX_BYTE reset_r, reset_g, reset_b,
+ set_r, set_g, set_b;
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ reset_r, reset_g, reset_b);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ set_r, set_g, set_b);
+ } else {
+ reset_r = FXARGB_R(src_plt[0]);
+ reset_g = FXARGB_G(src_plt[0]);
+ reset_b = FXARGB_B(src_plt[0]);
+ set_r = FXARGB_R(src_plt[1]);
+ set_g = FXARGB_G(src_plt[1]);
+ set_b = FXARGB_B(src_plt[1]);
+ }
+ gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);
+ gray[1] = FXRGB2GRAY(set_r, set_g, set_b);
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, gray[0], width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = gray[1];
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[256];
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ for (int i = 0; i < 256; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ FX_BYTE r, g, b;
+ for (int i = 0; i < 256; i ++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ gray[i] = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < 256; i ++) {
+ gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = gray[*src_scan++];
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int Bpp = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan++;
+ src_scan += 4;
+ }
+ }
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),
+ r, g, b);
+ *dest_scan++ = FXRGB2GRAY(r, g, b);
+ src_scan += 4;
+ }
+ }
+ } else
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);
+ src_scan += Bpp;
+ }
+ }
+ }
+ return TRUE;
+}
+inline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ if (pSrcBitmap->GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset32(dest_scan, 0, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = 1;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ }
+}
+FX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ int plt_size = pSrcBitmap->GetPaletteSize();
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ for (int i = 0; i < plt_size; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);
+ for (int i = 0; i < plt_size; i ++) {
+ dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ } else {
+ FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);
+ }
+ }
+ return TRUE;
+}
+inline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)
+{
+ int bpp = pSrcBitmap->GetBPP() / 8;
+ int row, col;
+ CFX_Palette palette;
+ palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);
+ FX_DWORD* cLut = palette.GetColorLut();
+ FX_DWORD* aLut = palette.GetAmountLut();
+ if (cLut == NULL || aLut == NULL) {
+ return FALSE;
+ }
+ int lut = palette.Getlut();
+ FX_DWORD* pPalette = palette.GetPalette();
+ if (lut > 256) {
+ int err, min_err;
+ int lut_256 = lut - 256;
+ for (row = 0; row < lut_256; row++) {
+ min_err = 1000000;
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[row], r, g, b);
+ int clrindex = 0;
+ for (int col = 0; col < 256; col++) {
+ FX_DWORD p_color = *(pPalette + col);
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)(p_color);
+ err = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (err < min_err) {
+ min_err = err;
+ clrindex = col;
+ }
+ }
+ aLut[row] = clrindex;
+ }
+ }
+ FX_INT32 lut_1 = lut - 1;
+ for (row = 0; row < height; row ++) {
+ FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE* dest_scan = dest_buf + row * dest_pitch;
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = src_scan + col * bpp;
+ int r = src_port[2] & 0xf0;
+ int g = src_port[1] & 0xf0;
+ int b = src_port[0] & 0xf0;
+ FX_DWORD clrindex = (r << 4) + g + (b >> 4);
+ for (int i = lut_1; i >= 0; i--)
+ if (clrindex == cLut[i]) {
+ *(dest_scan + col) = (FX_BYTE)(aLut[i]);
+ break;
+ }
+ }
+ }
+ FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);
+ if (ret && pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int i = 0; i < 256; i++) {
+ FX_ARGB* plt = dst_plt + i;
+ FX_ARGB plt_entry = FXARGB_TODIB(*plt);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);
+ *plt = FXARGB_TODIB(plt_entry);
+ }
+ }
+ return ret;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ dest_scan[0] = set_gray;
+ dest_scan[1] = set_gray;
+ dest_scan[2] = set_gray;
+ } else {
+ dest_scan[0] = reset_gray;
+ dest_scan[1] = reset_gray;
+ dest_scan[2] = reset_gray;
+ }
+ dest_scan += comps;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE src_pixel;
+ for (int col = 0; col < width; col ++) {
+ src_pixel = *src_scan++;
+ *dest_scan++ = src_pixel;
+ *dest_scan++ = src_pixel;
+ *dest_scan = src_pixel;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[2];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan++ = bgr_ptr[3];
+ *dest_scan++ = bgr_ptr[4];
+ *dest_scan = bgr_ptr[5];
+ } else {
+ *dest_scan++ = bgr_ptr[0];
+ *dest_scan++ = bgr_ptr[1];
+ *dest_scan = bgr_ptr[2];
+ }
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (!pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ if (pIccTransform) {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);
+ *dest_scan++ = *src_pixel++;
+ *dest_scan++ = *src_pixel++;
+ *dest_scan = *src_pixel++;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ FXSYS_memcpy32(dest_scan, src_scan, width * 3);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan++;
+ }
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += comps;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan++;
+ src_scan += comps - 3;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],
+ dest_scan[2], dest_scan[1], dest_scan[0]);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)
+{
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ switch (dest_format) {
+ case FXDIB_Invalid:
+ case FXDIB_1bppCmyk:
+ case FXDIB_1bppMask:
+ case FXDIB_1bppRgb:
+ ASSERT(FALSE);
+ return FALSE;
+ case FXDIB_8bppMask: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_8bppRgb:
+ case FXDIB_8bppRgba: {
+ if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {
+ return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ d_pal = FX_Alloc(FX_DWORD, 256);
+ if (!d_pal) {
+ return FALSE;
+ }
+ FXSYS_memset32(d_pal, 0, sizeof(FX_DWORD) * 256);
+ if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 24) {
+ return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ } else if ((src_format & 0xff) == 32) {
+ return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Argb:
+ case FXDIB_Rgb32: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ if (src_format & 0x0400) {
+ return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ default:
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const
+{
+ if(dest_format == GetFormat() && pIccTransform == NULL) {
+ return Clone(pClip);
+ }
+ if (pClip) {
+ CFX_DIBitmap* pClone = Clone(pClip);
+ if (pClone == NULL) {
+ return NULL;
+ }
+ if(!pClone->ConvertFormat(dest_format, pIccTransform)) {
+ delete pClone;
+ return NULL;
+ }
+ return pClone;
+ }
+ CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;
+ if (!pClone) {
+ return NULL;
+ }
+ if(!pClone->Create(m_Width, m_Height, dest_format)) {
+ delete pClone;
+ return NULL;
+ }
+ FX_BOOL ret = TRUE;
+ CFX_DIBitmap* pSrcAlpha = NULL;
+ if (m_AlphaFlag & 2) {
+ pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;
+ if (pSrcAlpha == NULL) {
+ delete pClone;
+ return NULL;
+ }
+ }
+ if (dest_format & 0x0200) {
+ if (dest_format == FXDIB_Argb)
+ ret = pSrcAlpha ?
+ pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :
+ pClone->LoadChannel(FXDIB_Alpha, 0xff);
+ else {
+ ret = pClone->CopyAlphaMask(pSrcAlpha);
+ }
+ }
+ if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {
+ delete pSrcAlpha;
+ pSrcAlpha = NULL;
+ }
+ if (!ret) {
+ delete pClone;
+ return NULL;
+ }
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ delete pClone;
+ return NULL;
+ }
+ if (pal_8bpp) {
+ pClone->CopyPalette(pal_8bpp);
+ FX_Free(pal_8bpp);
+ pal_8bpp = NULL;
+ }
+ return pClone;
+}
+FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)
+{
+ FXDIB_Format src_format = GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ return TRUE;
+ }
+ if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {
+ m_AlphaFlag = 1;
+ return TRUE;
+ }
+ if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {
+ m_AlphaFlag = 2;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scanline = 0xff;
+ scanline += 4;
+ }
+ }
+ return TRUE;
+ }
+ int dest_bpp = dest_format & 0xff;
+ int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;
+ FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);
+ if (dest_buf == NULL) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pAlphaMask = NULL;
+ if (dest_format == FXDIB_Argb) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);
+ if (m_pAlphaMask) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;
+ FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ *pDstScanline = *pSrcScanline++;
+ pDstScanline += 4;
+ }
+ }
+ }
+ } else if (dest_format & 0x0200) {
+ if (src_format == FXDIB_Argb) {
+ pAlphaMask = GetAlphaMask();
+ if (pAlphaMask == NULL) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ } else {
+ if (m_pAlphaMask == NULL) {
+ if (!BuildAlphaMask()) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ pAlphaMask = m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ } else {
+ pAlphaMask = m_pAlphaMask;
+ }
+ }
+ }
+ FX_BOOL ret = FALSE;
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ if (pAlphaMask != m_pAlphaMask) {
+ delete pAlphaMask;
+ }
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ return FALSE;
+ }
+ if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pAlphaMask = pAlphaMask;
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = pal_8bpp;
+ if (!m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_bExtBuf = FALSE;
+ m_pBuffer = dest_buf;
+ m_bpp = (FX_BYTE)dest_format;
+ m_AlphaFlag = (FX_BYTE)(dest_format >> 8);
+ m_Pitch = dest_pitch;
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_engine.cpp b/core/src/fxge/dib/fx_dib_engine.cpp
new file mode 100644
index 0000000000..3ddbff6409
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_engine.cpp
@@ -0,0 +1,867 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "dib_int.h"
+#include <limits.h>
+extern int SDP_Table[513];
+void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)
+{
+ if (m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ m_pWeightTables = NULL;
+ }
+ double scale, base;
+ scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));
+ if (dest_len < 0) {
+ base = (FX_FLOAT)(src_len);
+ } else {
+ base = 0;
+ }
+ int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
+ m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));
+ m_DestMin = dest_min;
+ if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {
+ return;
+ }
+ m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);
+ if (m_pWeightTables == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));
+ if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_pos = dest_pixel * scale + scale / 2 + base;
+ if (flags & FXDIB_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = 65536;
+ } else {
+ pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
+ pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
+ }
+ } else if (flags & FXDIB_BICUBIC_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ int start = pixel_weights.m_SrcStart - 1;
+ int end = pixel_weights.m_SrcEnd + 1;
+ if (start < src_min) {
+ start = src_min;
+ }
+ if (end >= src_max) {
+ end = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart < src_min) {
+ src_pos += src_min - pixel_weights.m_SrcStart;
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ int weight;
+ weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
+ if (start == end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||
+ end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else {
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;
+ } else {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ }
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_SrcEnd = end;
+ }
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_SrcStart = start;
+ }
+ } else if (start == pixel_weights.m_SrcStart &&
+ start < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd < end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcEnd = end;
+ } else if (start < pixel_weights.m_SrcStart &&
+ pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd == end) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ pixel_weights.m_SrcStart = start;
+ } else {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcStart = start;
+ pixel_weights.m_SrcEnd = end;
+ }
+ } else {
+ pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ pixel_weights.m_Weights[0] = 65536;
+ }
+ }
+ return;
+ }
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_start = dest_pixel * scale + base;
+ double src_end = src_start + scale;
+ int start_i, end_i;
+ if (src_start < src_end) {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_start);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);
+ } else {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_end);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);
+ }
+ if (start_i < src_min) {
+ start_i = src_min;
+ }
+ if (end_i >= src_max) {
+ end_i = src_max - 1;
+ }
+ if (start_i > end_i) {
+ if (start_i >= src_max) {
+ start_i = src_max - 1;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = start_i;
+ continue;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = end_i;
+ for (int j = start_i; j <= end_i; j ++) {
+ double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);
+ double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);
+ if (dest_start > dest_end) {
+ double temp = dest_start;
+ dest_start = dest_end;
+ dest_end = temp;
+ }
+ double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);
+ double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;
+ double weight = area_start >= area_end ? 0.0f : area_end - area_start;
+ if (weight == 0 && j == end_i) {
+ pixel_weights.m_SrcEnd --;
+ break;
+ }
+ pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));
+ }
+ }
+}
+CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags)
+{
+ m_State = 0;
+ m_DestFormat = dest_format;
+ m_DestBpp = dest_format & 0xff;
+ m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;
+ m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;
+ m_pSrcPalette = pSrcBitmap->GetPalette();
+ m_pDestBitmap = pDestBitmap;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_pInterBuf = NULL;
+ m_pExtraAlphaBuf = NULL;
+ m_pDestMaskScanline = NULL;
+ m_DestClip = clip_rect;
+ FX_DWORD size = clip_rect.Width();
+ if (size && m_DestBpp > (int)(INT_MAX / size)) {
+ return;
+ }
+ size *= m_DestBpp;
+ if (size > INT_MAX - 31) {
+ return;
+ }
+ size += 31;
+ size = size / 32 * 4;
+ m_pDestScanline = FX_AllocNL(FX_BYTE, size);
+ if (m_pDestScanline == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);
+ if (dest_format == FXDIB_Rgb32) {
+ FXSYS_memset8(m_pDestScanline, 255, size);
+ }
+ m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
+ m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pInterBuf = NULL;
+ m_pSource = pSrcBitmap;
+ m_SrcWidth = pSrcBitmap->GetWidth();
+ m_SrcHeight = pSrcBitmap->GetHeight();
+ m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;
+ if ((flags & FXDIB_NOSMOOTH) == 0) {
+ FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;
+ if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {
+ flags = FXDIB_INTERPOL;
+ }
+ m_Flags = flags;
+ } else {
+ m_Flags = FXDIB_NOSMOOTH;
+ if (flags & FXDIB_DOWNSAMPLE) {
+ m_Flags |= FXDIB_DOWNSAMPLE;
+ }
+ }
+ double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));
+ double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));
+ double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);
+ double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);
+ double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);
+ double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);
+ double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);
+ double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);
+ if (src_left > src_right) {
+ double temp = src_left;
+ src_left = src_right;
+ src_right = temp;
+ }
+ if (src_top > src_bottom) {
+ double temp = src_top;
+ src_top = src_bottom;
+ src_bottom = temp;
+ }
+ m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);
+ m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);
+ m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);
+ m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);
+ FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
+ m_SrcClip.Intersect(src_rect);
+ if (m_SrcBpp == 1) {
+ if (m_DestBpp == 8) {
+ m_TransMethod = 1;
+ } else {
+ m_TransMethod = 2;
+ }
+ } else if (m_SrcBpp == 8) {
+ if (m_DestBpp == 8) {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 3;
+ } else {
+ m_TransMethod = 4;
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 5;
+ } else {
+ m_TransMethod = 6;
+ }
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 7;
+ } else {
+ m_TransMethod = 8;
+ }
+ }
+}
+FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)
+{
+ while (m_State == 1) {
+ if (ContinueStretchHorz(pPause)) {
+ return TRUE;
+ }
+ m_State = 2;
+ StretchVert();
+ }
+ return FALSE;
+}
+CStretchEngine::~CStretchEngine()
+{
+ if (m_pDestScanline) {
+ FX_Free(m_pDestScanline);
+ }
+ if (m_pInterBuf) {
+ FX_Free(m_pInterBuf);
+ }
+ if (m_pExtraAlphaBuf) {
+ FX_Free(m_pExtraAlphaBuf);
+ }
+ if (m_pDestMaskScanline) {
+ FX_Free(m_pDestMaskScanline);
+ }
+}
+FX_BOOL CStretchEngine::StartStretchHorz()
+{
+ if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
+ return FALSE;
+ }
+#ifndef _FPDFAPI_MINI_
+ m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#else
+ m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#endif
+ if (m_pInterBuf == NULL) {
+ return FALSE;
+ }
+ if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
+ m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);
+ if (!m_pExtraAlphaBuf) {
+ return FALSE;
+ }
+ FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pDestMaskScanline = FX_AllocNL(unsigned char, size);
+ if (!m_pDestMaskScanline) {
+ return FALSE;
+ }
+ }
+ m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);
+ if (m_WeightTable.m_pWeightTables == NULL) {
+ return FALSE;
+ }
+ m_CurRow = m_SrcClip.top;
+ m_State = 1;
+ return TRUE;
+}
+#define FX_STRECH_PAUSE_ROWS 10
+FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)
+{
+ if (!m_DestWidth) {
+ return 0;
+ }
+ if (m_pSource->SkipToScanline(m_CurRow, pPause)) {
+ return TRUE;
+ }
+ int Bpp = m_DestBpp / 8;
+ int rows_to_go = FX_STRECH_PAUSE_ROWS;
+ for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {
+ if (rows_to_go == 0) {
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ } else {
+ rows_to_go = FX_STRECH_PAUSE_ROWS;
+ }
+ }
+ FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);
+ FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+ FX_LPCBYTE src_scan_mask = NULL;
+ FX_LPBYTE dest_scan_mask = NULL;
+ if (m_pExtraAlphaBuf) {
+ src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
+ dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
+ }
+ switch (m_TransMethod) {
+ case 1:
+ case 2: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ if (src_scan[j / 8] & (1 << (7 - j % 8))) {
+ dest_a += pixel_weight * 255;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[j];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ dest_r += pixel_weight * src_scan[j];
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_r >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 5: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgb) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ }
+ break;
+ }
+ case 6: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgba) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ if (m_DestFormat == FXDIB_Argb) {
+ pixel_weight = pixel_weight * src_pixel[3] / 255;
+ } else {
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ if (m_DestFormat == FXDIB_Argb) {
+ *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ if (dest_scan_mask) {
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ }
+ rows_to_go --;
+ }
+ return FALSE;
+}
+void CStretchEngine::StretchVert()
+{
+ if (m_DestHeight == 0) {
+ return;
+ }
+ CWeightTable table;
+ table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);
+ if (table.m_pWeightTables == NULL) {
+ return;
+ }
+ int DestBpp = m_DestBpp / 8;
+ for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {
+ unsigned char* dest_scan = m_pDestScanline;
+ unsigned char* dest_sacn_mask = m_pDestMaskScanline;
+ PixelWeight* pPixelWeights = table.GetPixelWeight(row);
+ switch(m_TransMethod) {
+ case 1:
+ case 2:
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_a >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ int dest_a = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_k >> 16);
+ dest_scan += DestBpp;
+ *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 5:
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);
+ dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);
+ dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 6:
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = NULL;
+ if (m_DestFormat != FXDIB_Argb) {
+ src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ }
+ int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ int mask_v = 255;
+ if (src_scan_mask) {
+ mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_a += pixel_weight * (*(src_pixel + 1));
+ } else {
+ dest_a += pixel_weight * mask_v;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ if (dest_a) {
+ int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;
+ int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;
+ int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;
+ dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
+ dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
+ dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
+ }
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_scan[3] = (FX_BYTE)((dest_a) >> 16);
+ } else {
+ *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);
+ }
+ dest_scan += DestBpp;
+ if (dest_sacn_mask) {
+ dest_sacn_mask++;
+ }
+ }
+ break;
+ }
+ }
+ m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);
+ }
+}
+CFX_ImageStretcher::CFX_ImageStretcher()
+{
+ m_pScanline = NULL;
+ m_pStretchEngine = NULL;
+ m_pMaskScanline = NULL;
+}
+CFX_ImageStretcher::~CFX_ImageStretcher()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pStretchEngine) {
+ delete m_pStretchEngine;
+ }
+ if (m_pMaskScanline) {
+ FX_Free(m_pMaskScanline);
+ }
+}
+FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)
+{
+ FXDIB_Format format = pSrc->GetFormat();
+ if (format == FXDIB_1bppMask) {
+ format = FXDIB_8bppMask;
+ } else if (format == FXDIB_1bppRgb) {
+ format = FXDIB_8bppRgb;
+ } else if (format == FXDIB_8bppRgb) {
+ if (pSrc->GetPalette()) {
+ format = FXDIB_Rgb;
+ }
+ }
+ return format;
+}
+FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,
+ const CFX_DIBSource* pSource, int dest_width, int dest_height,
+ const FX_RECT& rect, FX_DWORD flags)
+{
+ m_DestFormat = _GetStretchedFormat(pSource);
+ m_DestBPP = m_DestFormat & 0xff;
+ m_pDest = pDest;
+ m_pSource = pSource;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_ClipRect = rect;
+ m_Flags = flags;
+ if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {
+ FX_ARGB pal[256];
+ int a0, r0, g0, b0, a1, r1, g1, b1;
+ ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);
+ ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);
+ for (int i = 0; i < 256; i ++) {
+ int a = a0 + (a1 - a0) * i / 255;
+ int r = r0 + (r1 - r0) * i / 255;
+ int g = g0 + (g1 - g0) * i / 255;
+ int b = b0 + (b1 - b0) * i / 255;
+ pal[i] = ArgbEncode(a, r, g, b);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {
+ FX_CMYK pal[256];
+ int c0, m0, y0, k0, c1, m1, y1, k1;
+ CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);
+ CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);
+ for (int i = 0; i < 256; i ++) {
+ int c = c0 + (c1 - c0) * i / 255;
+ int m = m0 + (m1 - m0) * i / 255;
+ int y = y0 + (y1 - y0) * i / 255;
+ int k = k0 + (k1 - k0) * i / 255;
+ pal[i] = CmykEncode(c, m, y, k);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {
+ return FALSE;
+ }
+ if (flags & FXDIB_DOWNSAMPLE) {
+ return StartQuickStretch();
+ } else {
+ return StartStretch();
+ }
+}
+FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)
+{
+ if (m_Flags & FXDIB_DOWNSAMPLE) {
+ return ContinueQuickStretch(pPause);
+ } else {
+ return ContinueStretch(pPause);
+ }
+}
+#ifndef _FPDFAPI_MINI_
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 1000000
+#else
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 100000
+#endif
+FX_BOOL CFX_ImageStretcher::StartStretch()
+{
+ m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
+ if (!m_pStretchEngine) {
+ return FALSE;
+ }
+ m_pStretchEngine->StartStretchHorz();
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ m_pStretchEngine->Continue(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)
+{
+ if (m_pStretchEngine == NULL) {
+ return FALSE;
+ }
+ return m_pStretchEngine->Continue(pPause);
+}
+FX_BOOL CFX_ImageStretcher::StartQuickStretch()
+{
+#ifdef _FPDFAPI_MINI_
+ m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
+#endif
+ m_bFlipX = FALSE;
+ m_bFlipY = FALSE;
+ if (m_DestWidth < 0) {
+ m_bFlipX = TRUE;
+ m_DestWidth = -m_DestWidth;
+ }
+ if (m_DestHeight < 0) {
+ m_bFlipY = TRUE;
+ m_DestHeight = -m_DestHeight;
+ }
+ m_LineIndex = 0;
+ FX_DWORD size = m_ClipRect.Width();
+ if (size && m_DestBPP > (int)(INT_MAX / size)) {
+ return FALSE;
+ }
+ size *= m_DestBPP;
+ m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);
+ if (!m_pScanline) {
+ return FALSE;
+ }
+ if (m_pSource->m_pAlphaMask) {
+ m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);
+ if (!m_pMaskScanline) {
+ return FALSE;
+ }
+ }
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ ContinueQuickStretch(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)
+{
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();
+ int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();
+ for (; m_LineIndex < result_height; m_LineIndex ++) {
+ int dest_y, src_y;
+ if (m_bFlipY) {
+ dest_y = result_height - m_LineIndex - 1;
+ src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;
+ } else {
+ dest_y = m_LineIndex;
+ src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
+ }
+ if (src_y >= src_height) {
+ src_y = src_height - 1;
+ }
+ if (src_y < 0) {
+ src_y = 0;
+ }
+ if (m_pSource->SkipToScanline(src_y, pPause)) {
+ return TRUE;
+ }
+ m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ FX_LPBYTE scan_extra_alpha = NULL;
+ if (m_pMaskScanline) {
+ m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ }
+ m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);
+ }
+ return FALSE;
+}
diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
new file mode 100644
index 0000000000..0953f2d2e5
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -0,0 +1,1734 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+#include <limits.h>
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);
+void CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)
+{
+ c = FXSYS_GetCValue(cmyk);
+ m = FXSYS_GetMValue(cmyk);
+ y = FXSYS_GetYValue(cmyk);
+ k = FXSYS_GetKValue(cmyk);
+}
+void ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)
+{
+ a = FXARGB_A(argb);
+ r = FXARGB_R(argb);
+ g = FXARGB_G(argb);
+ b = FXARGB_B(argb);
+}
+void ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)
+{
+ a = FXARGB_A(argb);
+ rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+}
+FX_DWORD ArgbEncode(int a, FX_COLORREF rgb)
+{
+ return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));
+}
+CFX_DIBSource::CFX_DIBSource()
+{
+ m_bpp = 0;
+ m_AlphaFlag = 0;
+ m_Width = m_Height = 0;
+ m_Pitch = 0;
+ m_pPalette = NULL;
+ m_pAlphaMask = NULL;
+}
+CFX_DIBSource::~CFX_DIBSource()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+}
+CFX_DIBitmap::CFX_DIBitmap()
+{
+ m_bExtBuf = FALSE;
+ m_pBuffer = NULL;
+ m_pPalette = NULL;
+}
+#define _MAX_OOM_LIMIT_ 12000000
+FX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)
+{
+ m_pBuffer = NULL;
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Width = m_Height = m_Pitch = 0;
+ if (width <= 0 || height <= 0 || pitch < 0) {
+ return FALSE;
+ }
+ if ((INT_MAX - 31) / width < (format & 0xff)) {
+ return FALSE;
+ }
+ if (!pitch) {
+ pitch = (width * (format & 0xff) + 31) / 32 * 4;
+ }
+ if ((1 << 30) / pitch < height) {
+ return FALSE;
+ }
+ if (pBuffer) {
+ m_pBuffer = pBuffer;
+ m_bExtBuf = TRUE;
+ } else {
+ int size = pitch * height + 4;
+ int oomlimit = _MAX_OOM_LIMIT_;
+ if (oomlimit >= 0 && size >= oomlimit) {
+ m_pBuffer = FX_AllocNL(FX_BYTE, size);
+ } else {
+ m_pBuffer = FX_Alloc(FX_BYTE, size);
+ }
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pBuffer, 0, sizeof (FX_BYTE) * size);
+ }
+ m_Width = width;
+ m_Height = height;
+ m_Pitch = pitch;
+ if (HasAlpha() && format != FXDIB_Argb) {
+ FX_BOOL ret = TRUE;
+ ret = BuildAlphaMask();
+ if (!ret) {
+ if (!m_bExtBuf && m_pBuffer) {
+ FX_Free(m_pBuffer);
+ m_pBuffer = NULL;
+ m_Width = m_Height = m_Pitch = 0;
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)
+{
+ if (m_pBuffer) {
+ return FALSE;
+ }
+ if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {
+ return FALSE;
+ }
+ CopyPalette(pSrc->GetPalette());
+ CopyAlphaMask(pSrc->m_pAlphaMask);
+ for (int row = 0; row < pSrc->GetHeight(); row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);
+ }
+ return TRUE;
+}
+CFX_DIBitmap::~CFX_DIBitmap()
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_pBuffer = NULL;
+}
+void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pBuffer = pSrcBitmap->m_pBuffer;
+ m_pPalette = pSrcBitmap->m_pPalette;
+ m_pAlphaMask = pSrcBitmap->m_pAlphaMask;
+ pSrcBitmap->m_pBuffer = NULL;
+ pSrcBitmap->m_pPalette = NULL;
+ pSrcBitmap->m_pAlphaMask = NULL;
+ m_bpp = pSrcBitmap->m_bpp;
+ m_bExtBuf = pSrcBitmap->m_bExtBuf;
+ m_AlphaFlag = pSrcBitmap->m_AlphaFlag;
+ m_Width = pSrcBitmap->m_Width;
+ m_Height = pSrcBitmap->m_Height;
+ m_Pitch = pSrcBitmap->m_Pitch;
+}
+CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const
+{
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;
+ if (!pNewBitmap) {
+ return NULL;
+ }
+ if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {
+ delete pNewBitmap;
+ return NULL;
+ }
+ pNewBitmap->CopyPalette(m_pPalette);
+ pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);
+ if (GetBPP() == 1 && rect.left % 8 != 0) {
+ int left_shift = rect.left % 32;
+ int right_shift = 32 - left_shift;
+ int dword_count = pNewBitmap->m_Pitch / 4;
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;
+ FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);
+ for (int i = 0; i < dword_count; i ++) {
+ dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);
+ }
+ }
+ } else {
+ int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;
+ if (m_Pitch < (FX_DWORD)copy_len) {
+ copy_len = m_Pitch;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);
+ FXSYS_memcpy32(dest_scan, src_scan, copy_len);
+ }
+ }
+ return pNewBitmap;
+}
+void CFX_DIBSource::BuildPalette()
+{
+ if (m_pPalette) {
+ return;
+ }
+ if (GetBPP() == 1) {
+ m_pPalette = FX_Alloc(FX_DWORD, 2);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ m_pPalette[0] = 0xff;
+ m_pPalette[1] = 0;
+ } else {
+ m_pPalette[0] = 0xff000000;
+ m_pPalette[1] = 0xffffffff;
+ }
+ } else if (GetBPP() == 8) {
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff - i;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff000000 | (i * 0x10101);
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBSource::BuildAlphaMask()
+{
+ if (m_pAlphaMask) {
+ return TRUE;
+ }
+ m_pAlphaMask = FX_NEW CFX_DIBitmap;
+ if (!m_pAlphaMask) {
+ return FALSE;
+ }
+ if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ return FALSE;
+ }
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+}
+FX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette) {
+ return m_pPalette[index];
+ }
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return index ? 0 : 0xff;
+ }
+ return 0xff - index;
+ }
+ if (GetBPP() == 1) {
+ return index ? 0xffffffff : 0xff000000;
+ }
+ return index * 0x10101 | 0xff000000;
+}
+void CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ m_pPalette[index] = color;
+}
+int CFX_DIBSource::FindPalette(FX_DWORD color) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 0 : 1;
+ }
+ return 0xff - (FX_BYTE)color;
+ }
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 1 : 0;
+ }
+ return (FX_BYTE)color;
+ }
+ int palsize = (1 << GetBPP());
+ for (int i = 0; i < palsize; i ++)
+ if (m_pPalette[i] == color) {
+ return i;
+ }
+ return -1;
+}
+void CFX_DIBitmap::Clear(FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ case FXDIB_1bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_8bppMask:
+ FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);
+ break;
+ case FXDIB_8bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ int a, r, g, b;
+ ArgbDecode(color, a, r, g, b);
+ if (r == g && g == b) {
+ FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);
+ } else {
+ int byte_pos = 0;
+ for (int col = 0; col < m_Width; col ++) {
+ m_pBuffer[byte_pos++] = b;
+ m_pBuffer[byte_pos++] = g;
+ m_pBuffer[byte_pos++] = r;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ }
+ break;
+ }
+ case FXDIB_Rgb32:
+ case FXDIB_Argb: {
+ color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ for (int i = 0; i < m_Width; i ++) {
+ ((FX_DWORD*)m_pBuffer)[i] = color;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+void CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,
+ int src_width, int src_height, int& src_left, int& src_top,
+ const CFX_ClipRgn* pClipRgn)
+{
+ if (width == 0 || height == 0) {
+ return;
+ }
+ ASSERT(width > 0 && height > 0);
+ if (dest_left > m_Width || dest_top > m_Height) {
+ width = 0;
+ height = 0;
+ return;
+ }
+ int x_offset = dest_left - src_left;
+ int y_offset = dest_top - src_top;
+ FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);
+ FX_RECT src_bound(0, 0, src_width, src_height);
+ src_rect.Intersect(src_bound);
+ FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,
+ src_rect.right + x_offset, src_rect.bottom + y_offset);
+ FX_RECT dest_bound(0, 0, m_Width, m_Height);
+ dest_rect.Intersect(dest_bound);
+ if (pClipRgn) {
+ dest_rect.Intersect(pClipRgn->GetBox());
+ }
+ dest_left = dest_rect.left;
+ dest_top = dest_rect.top;
+ src_left = dest_left - x_offset;
+ src_top = dest_top - y_offset;
+ width = dest_rect.right - dest_rect.left;
+ height = dest_rect.bottom - dest_rect.top;
+}
+FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ FXDIB_Format dest_format = GetFormat();
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ if (GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = 0; col < width; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);
+ } else {
+ dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));
+ }
+ }
+ }
+ } else {
+ int Bpp = GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);
+ }
+ }
+ } else {
+ if (m_pPalette) {
+ return FALSE;
+ }
+ if (m_bpp == 8) {
+ dest_format = FXDIB_8bppMask;
+ }
+ FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;
+ FX_DWORD* d_plt = NULL;
+ if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(HasAlpha() && (m_bpp >= 24));
+ ASSERT(pMask->IsAlphaMask());
+ if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_pitch = pMask->GetPitch();
+ int src_bpp = pMask->GetBPP();
+ int alpha;
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ alpha = alpha_flag & 0xff;
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ alpha = FXARGB_A(color);
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)alpha;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ *dest_pos = dst_color;
+ } else {
+ *dest_pos = 0;
+ }
+ dest_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ dst_color = FXARGB_TODIB(dst_color);
+ dst_color &= 0xffffff;
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));
+ }
+ }
+ }
+ } else {
+ int comps = m_bpp / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;
+ FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ *dest_alpha_pos = 0xff;
+ } else {
+ FXSYS_memset32(dest_color_pos, 0, comps);
+ *dest_alpha_pos = 0;
+ }
+ dest_color_pos += comps;
+ dest_alpha_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ for (int col = 0; col < width; col ++) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ dest_color_pos += comps;
+ *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+#endif
+void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)
+{
+ if (pSrc == NULL || GetBPP() > 8) {
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = NULL;
+ } else {
+ FX_DWORD pal_size = 1 << GetBPP();
+ if (m_pPalette == NULL) {
+ m_pPalette = FX_Alloc(FX_DWORD, pal_size);
+ }
+ if (!m_pPalette) {
+ return;
+ }
+ if (pal_size > size) {
+ pal_size = size;
+ }
+ FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));
+ }
+}
+void CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const
+{
+ ASSERT(GetBPP() <= 8 && !IsCmykImage());
+ if (GetBPP() == 1) {
+ pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);
+ pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);
+ return;
+ }
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (i * 0x10101) | (alpha << 24);
+ }
+ }
+}
+CFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const
+{
+ ASSERT(GetFormat() == FXDIB_Argb);
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return NULL;
+ }
+ if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {
+ delete pMask;
+ return NULL;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);
+ for (int col = rect.left; col < rect.right; col ++) {
+ *dest_scan ++ = *src_scan;
+ src_scan += 4;
+ }
+ }
+ return pMask;
+}
+FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)
+{
+ if (!HasAlpha() || GetFormat() == FXDIB_Argb) {
+ return FALSE;
+ }
+ if (pAlphaMask) {
+ FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {
+ return FALSE;
+ }
+ } else {
+ if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < m_Height; row ++)
+ FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),
+ pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);
+ } else {
+ m_pAlphaMask->Clear(0xff000000);
+ }
+ return TRUE;
+}
+const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;
+ CFX_DIBitmap* pDst = this;
+ int destOffset, srcOffset;
+ if (srcChannel == FXDIB_Alpha) {
+ if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() == 1) {
+ pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if(pSrcBitmap->GetFormat() == FXDIB_Argb) {
+ srcOffset = 3;
+ } else {
+ srcOffset = 0;
+ }
+ } else {
+ if (pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() < 24) {
+ if (pSrcBitmap->IsCmykImage()) {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));
+ } else {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));
+ }
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ srcOffset = g_ChannelOffset[srcChannel];
+ }
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+#endif
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {
+ CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;
+ if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ if (pAlphaMask) {
+ pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);
+ if (pAlphaMask == NULL) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ pSrcClone->m_pAlphaMask = NULL;
+ delete pSrcClone;
+ }
+ pSrcClone = pAlphaMask;
+ srcOffset = 0;
+ } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ if (pSrcMatched == NULL) {
+ return FALSE;
+ }
+ pSrcClone = pSrcMatched;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ pDst = m_pAlphaMask;
+ destOffset = 0;
+ }
+ int srcBytes = pSrcClone->GetBPP() / 8;
+ int destBytes = pDst->GetBPP() / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;
+ FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos = *src_pos;
+ dest_pos += destBytes;
+ src_pos += srcBytes;
+ }
+ }
+ if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int destOffset;
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+ return FALSE;
+ }
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+#endif
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ int Bpp = GetBPP() / 8;
+ if (Bpp == 1) {
+ FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);
+ return TRUE;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = value;
+ scan_line += Bpp;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pSrcBitmap->IsAlphaMask());
+ if (!pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (!IsAlphaMask() && !HasAlpha()) {
+ return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);
+ }
+ CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;
+ if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {
+ pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);
+ ASSERT(pSrcClone != NULL);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ if (pSrcClone->GetBPP() == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {
+ dest_scan[col] = 0;
+ }
+ }
+ } else {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ if(GetFormat() == FXDIB_Argb) {
+ if (pSrcClone->GetBPP() == 1) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan += 4;
+ }
+ }
+ } else {
+ m_pAlphaMask->MultiplyAlpha(pSrcClone);
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[2];
+ for (int i = 0; i < 2; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ if (src_pos[col / 8] & (1 << (7 - col % 8))) {
+ *dest_pos = gray[1];
+ }
+ dest_pos ++;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_8bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[256];
+ for (int i = 0; i < 256; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = gray[*src_pos ++];
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 3;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb32: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 4;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ break;
+ case FXDIB_8bppMask: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ scan_line[col] = scan_line[col] * alpha / 255;
+ }
+ }
+ break;
+ }
+ case FXDIB_Argb: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = (*scan_line) * alpha / 255;
+ scan_line += 4;
+ }
+ }
+ break;
+ }
+ default:
+ if (HasAlpha()) {
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else if (IsCmykImage()) {
+ if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {
+ return FALSE;
+ }
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else {
+ if (!ConvertFormat(FXDIB_Argb)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ }
+ break;
+ }
+ return TRUE;
+}
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const
+{
+ if (m_pBuffer == NULL) {
+ return 0;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return 0xff000000;
+ }
+ return 0;
+ }
+ case FXDIB_1bppRgb: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return m_pPalette ? m_pPalette[1] : 0xffffffff;
+ } else {
+ return m_pPalette ? m_pPalette[0] : 0xff000000;
+ }
+ break;
+ }
+ case FXDIB_8bppMask:
+ return (*pos) << 24;
+ case FXDIB_8bppRgb:
+ return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));
+ case FXDIB_Rgb:
+ case FXDIB_Rgba:
+ case FXDIB_Rgb32:
+ return FXARGB_GETDIB(pos) | 0xff000000;
+ case FXDIB_Argb:
+ return FXARGB_GETDIB(pos);
+ default:
+ break;
+ }
+ return 0;
+}
+#endif
+void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {
+ return;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (color >> 24) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ break;
+ case FXDIB_1bppRgb:
+ if (m_pPalette) {
+ if (color == m_pPalette[1]) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ } else {
+ if (color == 0xffffffff) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ }
+ break;
+ case FXDIB_8bppMask:
+ *pos = (FX_BYTE)(color >> 24);
+ break;
+ case FXDIB_8bppRgb: {
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ if (m_pPalette[i] == color) {
+ *pos = (FX_BYTE)i;
+ return;
+ }
+ }
+ *pos = 0;
+ } else {
+ *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+ }
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgb32: {
+ int alpha = FXARGB_A(color);
+ pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;
+ pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;
+ pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;
+ break;
+ }
+ case FXDIB_Rgba: {
+ pos[0] = FXARGB_B(color);
+ pos[1] = FXARGB_G(color);
+ pos[2] = FXARGB_R(color);
+ break;
+ }
+ case FXDIB_Argb:
+ FXARGB_SETDIB(pos, color);
+ break;
+ default:
+ break;
+ }
+}
+void CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ int src_Bpp = m_bpp / 8;
+ FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;
+ if (src_Bpp == 0) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;
+ }
+ } else if (src_Bpp == 1) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ int dest_pos = i;
+ if (m_pPalette) {
+ if (!IsCmykImage()) {
+ dest_pos *= 3;
+ FX_ARGB argb = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXARGB_B(argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(argb);
+ } else {
+ dest_pos *= 4;
+ FX_CMYK cmyk = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);
+ dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);
+ dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);
+ dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);
+ }
+ } else {
+ dest_scan[dest_pos] = scanline[src_x];
+ }
+ }
+ } else {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width * src_Bpp;
+#endif
+ int dest_pos = i * src_Bpp;
+ for (int b = 0; b < src_Bpp; b ++) {
+ dest_scan[dest_pos + b] = scanline[src_x + b];
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)
+{
+ ASSERT(!IsAlphaMask());
+ if (m_pBuffer == NULL || IsAlphaMask()) {
+ return FALSE;
+ }
+ int fc, fm, fy, fk, bc, bm, by, bk;
+ int fr, fg, fb, br, bg, bb;
+ FX_BOOL isCmykImage = IsCmykImage();
+ if (isCmykImage) {
+ fc = FXSYS_GetCValue(forecolor);
+ fm = FXSYS_GetMValue(forecolor);
+ fy = FXSYS_GetYValue(forecolor);
+ fk = FXSYS_GetKValue(forecolor);
+ bc = FXSYS_GetCValue(backcolor);
+ bm = FXSYS_GetMValue(backcolor);
+ by = FXSYS_GetYValue(backcolor);
+ bk = FXSYS_GetKValue(backcolor);
+ } else {
+ fr = FXSYS_GetRValue(forecolor);
+ fg = FXSYS_GetGValue(forecolor);
+ fb = FXSYS_GetBValue(forecolor);
+ br = FXSYS_GetRValue(backcolor);
+ bg = FXSYS_GetGValue(backcolor);
+ bb = FXSYS_GetBValue(backcolor);
+ }
+ if (m_bpp <= 8) {
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {
+ return TRUE;
+ }
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ int size = 1 << m_bpp;
+ if (isCmykImage) {
+ for (int i = 0; i < size; i ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,
+ by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);
+ }
+ } else
+ for (int i = 0; i < size; i ++) {
+ int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));
+ m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,
+ bb + (fb - bb) * gray / 255);
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0x00) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 255 - FXRGB2GRAY(r, g, b);
+ }
+ }
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = gray;
+ *scanline ++ = gray;
+ *scanline = gray;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ *scanline ++ = bc + (fc - bc) * gray / 255;
+ *scanline ++ = bm + (fm - bm) * gray / 255;
+ *scanline ++ = by + (fy - by) * gray / 255;
+ *scanline ++ = bk + (fk - bk) * gray / 255;
+ }
+ }
+ } else
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = bb + (fb - bb) * gray / 255;
+ *scanline ++ = bg + (fg - bg) * gray / 255;
+ *scanline = br + (fr - br) * gray / 255;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {
+ return FALSE;
+ }
+ if (m_Width < 4 && m_Height < 4) {
+ return FALSE;
+ }
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pRect) {
+ rect.Intersect(*pRect);
+ }
+ FX_BYTE translate[256];
+ for (int i = 0; i < 256; i ++) {
+ int err2 = 65536;
+ for (int j = 0; j < pal_size; j ++) {
+ FX_BYTE entry = (FX_BYTE)pPalette[j];
+ int err = (int)entry - i;
+ if (err * err < err2) {
+ err2 = err * err;
+ translate[i] = entry;
+ }
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE scan = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;
+ for (int col = rect.left; col < rect.right; col ++) {
+ int src_pixel = scan[col];
+ int dest_pixel = translate[src_pixel];
+ scan[col] = (FX_BYTE)dest_pixel;
+ int error = -dest_pixel + src_pixel;
+ if (col < rect.right - 1) {
+ int src = scan[col + 1];
+ src += error * 7 / 16;
+ if (src > 255) {
+ scan[col + 1] = 255;
+ } else if (src < 0) {
+ scan[col + 1] = 0;
+ } else {
+ scan[col + 1] = src;
+ }
+ }
+ if (col < rect.right - 1 && row < rect.bottom - 1) {
+ int src = next_scan[col + 1];
+ src += error * 1 / 16;
+ if (src > 255) {
+ next_scan[col + 1] = 255;
+ } else if (src < 0) {
+ next_scan[col + 1] = 0;
+ } else {
+ next_scan[col + 1] = src;
+ }
+ }
+ if (row < rect.bottom - 1) {
+ int src = next_scan[col];
+ src += error * 5 / 16;
+ if (src > 255) {
+ next_scan[col] = 255;
+ } else if (src < 0) {
+ next_scan[col] = 0;
+ } else {
+ next_scan[col] = src;
+ }
+ }
+ if (col > rect.left && row < rect.bottom - 1) {
+ int src = next_scan[col - 1];
+ src += error * 3 / 16;
+ if (src > 255) {
+ next_scan[col - 1] = 255;
+ } else if (src < 0) {
+ next_scan[col - 1] = 0;
+ } else {
+ next_scan[col - 1] = src;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const
+{
+ CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;
+ if (!pFlipped) {
+ return NULL;
+ }
+ if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {
+ delete pFlipped;
+ return NULL;
+ }
+ pFlipped->CopyPalette(m_pPalette);
+ FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();
+ int Bpp = m_bpp / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);
+ continue;
+ }
+ if (m_bpp == 1) {
+ FXSYS_memset32(dest_scan, 0, m_Pitch);
+ for (int col = 0; col < m_Width; col ++)
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ int dest_col = m_Width - col - 1;
+ dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));
+ }
+ } else {
+ dest_scan += (m_Width - 1) * Bpp;
+ if (Bpp == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ } else if (Bpp == 3) {
+ for (int col = 0; col < m_Width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan -= 3;
+ src_scan += 3;
+ }
+ } else {
+ ASSERT(Bpp == 4);
+ for (int col = 0; col < m_Width; col ++) {
+ *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;
+ dest_scan -= 4;
+ src_scan += 4;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();
+ FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ continue;
+ }
+ dest_scan += (m_Width - 1);
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ }
+ }
+ return pFlipped;
+}
+CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)
+{
+ m_pBitmap = NULL;
+ if (pSrc->GetBuffer() == NULL) {
+ m_pBitmap = pSrc->Clone();
+ } else {
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return;
+ }
+ if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return;
+ }
+ m_pBitmap->CopyPalette(pSrc->GetPalette());
+ m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);
+ }
+}
+CFX_DIBExtractor::~CFX_DIBExtractor()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_FilteredDIB::CFX_FilteredDIB()
+{
+ m_pScanline = NULL;
+ m_pSrc = NULL;
+}
+CFX_FilteredDIB::~CFX_FilteredDIB()
+{
+ if (m_pSrc && m_bAutoDropSrc) {
+ delete m_pSrc;
+ }
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+}
+void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
+{
+ m_pSrc = pSrc;
+ m_bAutoDropSrc = bAutoDropSrc;
+ m_Width = pSrc->GetWidth();
+ m_Height = pSrc->GetHeight();
+ FXDIB_Format format = GetDestFormat();
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;
+ m_pPalette = GetDestPalette();
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+}
+FX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const
+{
+ TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));
+ return m_pScanline;
+}
+void CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);
+ TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);
+}
+CFX_ImageRenderer::CFX_ImageRenderer()
+{
+ m_Status = 0;
+ m_pTransformer = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ImageRenderer::~CFX_ImageRenderer()
+{
+ if (m_pTransformer) {
+ delete m_pTransformer;
+ }
+}
+extern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);
+FX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
+ const CFX_DIBSource* pSource, int bitmap_alpha,
+ FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,
+ FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_Matrix = *pMatrix;
+ CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());
+ m_ClipBox.Intersect(image_rect);
+ if (m_ClipBox.IsEmpty()) {
+ return FALSE;
+ }
+ m_pDevice = pDevice;
+ m_pClipRgn = pClipRgn;
+ m_MaskColor = mask_color;
+ m_BitmapAlpha = bitmap_alpha;
+ m_Matrix = *pMatrix;
+ m_Flags = dib_flags;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+ FX_BOOL ret = TRUE;
+ if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||
+ (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {
+ if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&
+ FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,
+ m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {
+ return FALSE;
+ }
+ m_Status = 1;
+ return TRUE;
+ }
+ m_Status = 2;
+ m_pTransformer = FX_NEW CFX_ImageTransformer;
+ if (!m_pTransformer) {
+ return FALSE;
+ }
+ m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);
+ return TRUE;
+ }
+ int dest_width = image_rect.Width();
+ if (m_Matrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ int dest_height = image_rect.Height();
+ if (m_Matrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ if (dest_width == 0 || dest_height == 0) {
+ return FALSE;
+ }
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,
+ m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ m_Status = 1;
+ ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);
+ return ret;
+}
+FX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status == 2) {
+ if (m_pTransformer->Continue(pPause)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (pBitmap->GetBuffer() == NULL) {
+ delete pBitmap;
+ return FALSE;
+ }
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ if (m_AlphaFlag >> 8) {
+ m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));
+ } else {
+ m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);
+ }
+ }
+ m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,
+ 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);
+ } else {
+ if (m_BitmapAlpha != 255) {
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ }
+ m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);
+ }
+ delete pBitmap;
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_BitmapStorer::CFX_BitmapStorer()
+{
+ m_pBitmap = NULL;
+}
+CFX_BitmapStorer::~CFX_BitmapStorer()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_DIBitmap* CFX_BitmapStorer::Detach()
+{
+ CFX_DIBitmap* pBitmap = m_pBitmap;
+ m_pBitmap = NULL;
+ return pBitmap;
+}
+void CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_pBitmap = pBitmap;
+}
+void CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;
+ if (dest_buf) {
+ FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());
+ }
+ if (dest_alpha_buf) {
+ FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());
+ }
+}
+FX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return FALSE;
+ }
+ if (!m_pBitmap->Create(width, height, src_format)) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return FALSE;
+ }
+ if (pSrcPalette) {
+ m_pBitmap->CopyPalette(pSrcPalette);
+ }
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_transform.cpp b/core/src/fxge/dib/fx_dib_transform.cpp
new file mode 100644
index 0000000000..4d83005161
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_transform.cpp
@@ -0,0 +1,797 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "dib_int.h"
+int SDP_Table[513] = {
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,
+ 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,
+ 246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,
+ 233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,
+ 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,
+ 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,
+ 177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,
+ 154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,
+ 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,
+ 104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,
+ 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,
+ 43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,
+ 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,
+ -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,
+ -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,
+ -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,
+ -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,
+ -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,
+ -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,
+ -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,
+ -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,
+ -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,
+ -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,
+ -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+class CFX_BilinearMatrix : public CPDF_FixedMatrix
+{
+public:
+ CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)
+ {}
+ inline void Transform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)
+ {
+ x1 = a * x + c * y + e + base / 2;
+ y1 = b * x + d * y + f + base / 2;
+ res_x = x1 % base;
+ res_y = y1 % base;
+ if (res_x < 0 && res_x > -base) {
+ res_x = base + res_x;
+ }
+ if (res_y < 0 && res_x > -base) {
+ res_y = base + res_y;
+ }
+ x1 /= base;
+ y1 /= base;
+ }
+};
+CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const
+{
+ FX_RECT dest_clip(0, 0, m_Height, m_Width);
+ if (pDestClip) {
+ dest_clip.Intersect(*pDestClip);
+ }
+ if (dest_clip.IsEmpty()) {
+ return NULL;
+ }
+ CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTransBitmap) {
+ return NULL;
+ }
+ int result_height = dest_clip.Height(), result_width = dest_clip.Width();
+ if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {
+ delete pTransBitmap;
+ return NULL;
+ }
+ pTransBitmap->CopyPalette(m_pPalette);
+ int src_pitch = m_Pitch;
+ int dest_pitch = pTransBitmap->GetPitch();
+ FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();
+ int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;
+ int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;
+ int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;
+ int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;
+ if (GetBPP() == 1) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);
+ for (int row = row_start; row < row_end; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int col = col_start; col < col_end; col ++) {
+ if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {
+ dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));
+ }
+ dest_scan += dest_step;
+ }
+ }
+ } else {
+ int nBytes = GetBPP() / 8;
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ if (nBytes == 3) {
+ dest_step -= 2;
+ }
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ if (nBytes == 4) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *(FX_DWORD*)dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ } else {
+ FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;
+ if (nBytes == 1)
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ else
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ src_pitch = m_pAlphaMask->m_Pitch;
+ dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();
+ dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ return pTransBitmap;
+}
+#define FIX16_005 0.05f
+FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)
+{
+ FX_RECT rect;
+ if (bFlipY) {
+ rect.left = height - clip.top;
+ rect.right = height - clip.bottom;
+ } else {
+ rect.left = clip.top;
+ rect.right = clip.bottom;
+ }
+ if (bFlipX) {
+ rect.top = width - clip.left;
+ rect.bottom = width - clip.right;
+ } else {
+ rect.top = clip.left;
+ rect.bottom = clip.right;
+ }
+ rect.Normalize();
+ return rect;
+}
+CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,
+ FX_DWORD flags, const FX_RECT* pDestClip) const
+{
+ CFX_ImageTransformer transformer;
+ transformer.Start(this, pDestMatrix, flags, pDestClip);
+ transformer.Continue(NULL);
+ result_left = transformer.m_ResultLeft;
+ result_top = transformer.m_ResultTop;
+ CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();
+ return pTransformed;
+}
+CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const
+{
+ FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));
+ if (pClip) {
+ clip_rect.Intersect(*pClip);
+ }
+ if (clip_rect.IsEmpty()) {
+ return NULL;
+ }
+ if (dest_width == m_Width && dest_height == m_Height) {
+ return Clone(&clip_rect);
+ }
+ CFX_ImageStretcher stretcher;
+ CFX_BitmapStorer storer;
+ if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {
+ stretcher.Continue(NULL);
+ }
+ return storer.Detach();
+}
+CFX_ImageTransformer::CFX_ImageTransformer()
+{
+ m_Status = 0;
+ m_pMatrix = NULL;
+}
+CFX_ImageTransformer::~CFX_ImageTransformer()
+{
+}
+FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)
+{
+ m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT result_rect = unit_rect.GetClosestRect();
+ FX_RECT result_clip = result_rect;
+ if (pDestClip) {
+ result_clip.Intersect(*pDestClip);
+ }
+ if (result_clip.IsEmpty()) {
+ return FALSE;
+ }
+ m_ResultLeft = result_clip.left;
+ m_ResultTop = result_clip.top;
+ m_ResultWidth = result_clip.Width();
+ m_ResultHeight = result_clip.Height();
+ m_Flags = flags;
+ if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&
+ FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&
+ FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {
+ int dest_width = result_rect.Width();
+ int dest_height = result_rect.Height();
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);
+ m_Status = 1;
+ return TRUE;
+ }
+ if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {
+ int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);
+ int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);
+ m_Status = 2;
+ return TRUE;
+ }
+ int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));
+ int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));
+ CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));
+ stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,
+ pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);
+ m_dest2stretch.SetReverse(stretch2dest);
+ CFX_FloatRect clip_rect_f(result_clip);
+ clip_rect_f.Transform(&m_dest2stretch);
+ m_StretchClip = clip_rect_f.GetOutterRect();
+ m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);
+ m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);
+ m_Status = 3;
+ return TRUE;
+}
+FX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,
+ int src_col_l, int src_col_r, int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int i_resx = 255 - res_x;
+ int col_bpp_l = src_col_l * bpp;
+ int col_bpp_r = src_col_r * bpp;
+ FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;
+ FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;
+ FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;
+ FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;
+ FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;
+ FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;
+ FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;
+ FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;
+ return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;
+}
+FX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int s_result = 0;
+ for (int i = 0; i < 4; i ++) {
+ int a_result = 0;
+ for (int j = 0; j < 4; j ++) {
+ a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));
+ }
+ s_result += a_result * v_w[i];
+ }
+ s_result >>= 16;
+ return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);
+}
+void _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,
+ int res_x, int res_y, int stretch_width, int stretch_height)
+{
+ pos_pixel[0] = src_col_l - 1;
+ pos_pixel[1] = src_col_l;
+ pos_pixel[2] = src_col_l + 1;
+ pos_pixel[3] = src_col_l + 2;
+ pos_pixel[4] = src_row_l - 1;
+ pos_pixel[5] = src_row_l;
+ pos_pixel[6] = src_row_l + 1;
+ pos_pixel[7] = src_row_l + 2;
+ for (int i = 0 ; i < 4; i ++) {
+ if (pos_pixel[i] < 0) {
+ pos_pixel[i] = 0;
+ }
+ if (pos_pixel[i] >= stretch_width) {
+ pos_pixel[i] = stretch_width - 1;
+ }
+ if (pos_pixel[i + 4] < 0) {
+ pos_pixel[i + 4] = 0;
+ }
+ if (pos_pixel[i + 4] >= stretch_height) {
+ pos_pixel[i + 4] = stretch_height - 1;
+ }
+ }
+ u_w[0] = SDP_Table[256 + res_x];
+ u_w[1] = SDP_Table[res_x];
+ u_w[2] = SDP_Table[256 - res_x];
+ u_w[3] = SDP_Table[512 - res_x];
+ v_w[0] = SDP_Table[256 + res_y];
+ v_w[1] = SDP_Table[res_y];
+ v_w[2] = SDP_Table[256 - res_y];
+ v_w[3] = SDP_Table[512 - res_y];
+}
+FXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)
+{
+ FXDIB_Format format = pDrc->GetFormat();
+ if (pDrc->IsAlphaMask()) {
+ format = FXDIB_8bppMask;
+ } else if (format >= 1025) {
+ format = FXDIB_Cmyka;
+ } else if (format <= 32 || format == FXDIB_Argb) {
+ format = FXDIB_Argb;
+ } else {
+ format = FXDIB_Rgba;
+ }
+ return format;
+}
+FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ if (m_Storer.GetBitmap()) {
+ m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));
+ }
+ return FALSE;
+ } else if (m_Status == 2) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status != 3) {
+ return FALSE;
+ }
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ int stretch_width = m_StretchClip.Width();
+ int stretch_height = m_StretchClip.Height();
+ if (m_Storer.GetBitmap() == NULL) {
+ return FALSE;
+ }
+ FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();
+ FX_LPCBYTE stretch_buf_mask = NULL;
+ if (m_Storer.GetBitmap()->m_pAlphaMask) {
+ stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();
+ }
+ int stretch_pitch = m_Storer.GetBitmap()->GetPitch();
+ CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;
+ if (!pTransformed) {
+ return FALSE;
+ }
+ FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);
+ if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {
+ delete pTransformed;
+ return FALSE;
+ }
+ pTransformed->Clear(0);
+ if (pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0);
+ }
+ CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));
+ result2stretch.Concat(m_dest2stretch);
+ result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);
+ if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0xff000000);
+ } else if (pTransformed->m_pAlphaMask) {
+ int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch_mask;
+ int row_offset_r = src_row_r * stretch_pitch_mask;
+ *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];
+ }
+ dest_pos_mask++;
+ }
+ }
+ }
+ }
+ if (m_Storer.GetBitmap()->IsAlphaMask()) {
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;
+ *dest_scan = *src_pixel;
+ }
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (Bpp == 1) {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ FX_DWORD argb[256];
+ FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
+ if (pPal) {
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = pPal[i];
+ }
+ } else {
+ if (m_Storer.GetBitmap()->IsCmykImage())
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 255 - i;
+ }
+ else
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 0xff000000 | (i * 0x010101);
+ }
+ }
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ } else {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_BYTE r_pos_red_y_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_BYTE r_pos_red_y_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = src_pos[0];
+ dest_pos[1] = src_pos[1];
+ dest_pos[2] = src_pos[2];
+ } else {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ }
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));
+ }
+ } else {
+ if (transformF == FXDIB_Cmyka) {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ }
+ }
+ m_Storer.Replace(pTransformed);
+ return FALSE;
+}
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
new file mode 100644
index 0000000000..b4c2ac132f
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
@@ -0,0 +1,3697 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitDingbatsFontData [29513] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x11,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x44, 0x69, 0x6e,
+ 0x67, 0x62, 0x61, 0x74, 0x73, 0x4f, 0x54, 0x46,
+ 0x0, 0x1, 0x1, 0x1, 0x25, 0xf8, 0x10, 0x0,
+ 0xf8, 0xe4, 0x1, 0xf8, 0xe5, 0x2, 0xf8, 0xe5,
+ 0x3, 0xf8, 0xe6, 0x4, 0x8a, 0xfb, 0x38, 0xfa,
+ 0x69, 0xf9, 0xce, 0x5, 0x1c, 0x4, 0xdc, 0xf,
+ 0x1c, 0x4, 0xe3, 0x11, 0xa7, 0x1c, 0x6e, 0x3f,
+ 0x12, 0x0, 0xcc, 0x2, 0x0, 0x1, 0x0, 0x3,
+ 0x0, 0x6, 0x0, 0xa, 0x0, 0xe, 0x0, 0x12,
+ 0x0, 0x16, 0x0, 0x1a, 0x0, 0x1e, 0x0, 0x22,
+ 0x0, 0x26, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x31,
+ 0x0, 0x35, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x41,
+ 0x0, 0x45, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x50,
+ 0x0, 0x54, 0x0, 0x58, 0x0, 0x5c, 0x0, 0x60,
+ 0x0, 0x64, 0x0, 0x68, 0x0, 0x6c, 0x0, 0x70,
+ 0x0, 0x74, 0x0, 0x77, 0x0, 0x7b, 0x0, 0x7f,
+ 0x0, 0x83, 0x0, 0x87, 0x0, 0x8b, 0x0, 0x8f,
+ 0x0, 0x93, 0x0, 0x97, 0x0, 0x9b, 0x0, 0x9f,
+ 0x0, 0xa2, 0x0, 0xa6, 0x0, 0xaa, 0x0, 0xae,
+ 0x0, 0xb2, 0x0, 0xb6, 0x0, 0xba, 0x0, 0xbe,
+ 0x0, 0xc2, 0x0, 0xc6, 0x0, 0xca, 0x0, 0xcd,
+ 0x0, 0xd1, 0x0, 0xd5, 0x0, 0xd9, 0x0, 0xdd,
+ 0x0, 0xe1, 0x0, 0xe5, 0x0, 0xe9, 0x0, 0xed,
+ 0x0, 0xf1, 0x0, 0xf5, 0x0, 0xf8, 0x0, 0xfc,
+ 0x1, 0x0, 0x1, 0x4, 0x1, 0x8, 0x1, 0xc,
+ 0x1, 0x10, 0x1, 0x14, 0x1, 0x18, 0x1, 0x1c,
+ 0x1, 0x20, 0x1, 0x23, 0x1, 0x27, 0x1, 0x2b,
+ 0x1, 0x2f, 0x1, 0x33, 0x1, 0x37, 0x1, 0x3b,
+ 0x1, 0x3f, 0x1, 0x43, 0x1, 0x47, 0x1, 0x4b,
+ 0x1, 0x4e, 0x1, 0x52, 0x1, 0x56, 0x1, 0x5a,
+ 0x1, 0x5e, 0x1, 0x62, 0x1, 0x66, 0x1, 0x6a,
+ 0x1, 0x6e, 0x1, 0x72, 0x1, 0x76, 0x1, 0x79,
+ 0x1, 0x7d, 0x1, 0x81, 0x1, 0x85, 0x1, 0x89,
+ 0x1, 0x8d, 0x1, 0x91, 0x1, 0x95, 0x1, 0x99,
+ 0x1, 0x9d, 0x1, 0xa1, 0x1, 0xa3, 0x1, 0xa6,
+ 0x1, 0xaa, 0x1, 0xae, 0x1, 0xb2, 0x1, 0xb6,
+ 0x1, 0xba, 0x1, 0xbe, 0x1, 0xc2, 0x1, 0xc5,
+ 0x1, 0xc8, 0x1, 0xcb, 0x1, 0xce, 0x1, 0xd1,
+ 0x1, 0xd4, 0x1, 0xd7, 0x1, 0xda, 0x1, 0xdd,
+ 0x1, 0xdf, 0x1, 0xe2, 0x1, 0xe5, 0x1, 0xe8,
+ 0x1, 0xeb, 0x1, 0xee, 0x1, 0xf1, 0x1, 0xf4,
+ 0x1, 0xf7, 0x1, 0xfa, 0x1, 0xfd, 0x1, 0xff,
+ 0x2, 0x2, 0x2, 0x5, 0x2, 0x8, 0x2, 0xb,
+ 0x2, 0xe, 0x2, 0x11, 0x2, 0x14, 0x2, 0x17,
+ 0x2, 0x1a, 0x2, 0x1d, 0x2, 0x1f, 0x2, 0x22,
+ 0x2, 0x25, 0x2, 0x28, 0x2, 0x2b, 0x2, 0x2e,
+ 0x2, 0x31, 0x2, 0x34, 0x2, 0x37, 0x2, 0x3a,
+ 0x2, 0x3d, 0x2, 0x3f, 0x2, 0x42, 0x2, 0x45,
+ 0x2, 0x48, 0x2, 0x4b, 0x2, 0x4e, 0x2, 0x51,
+ 0x2, 0x54, 0x2, 0x57, 0x2, 0x5a, 0x2, 0x5d,
+ 0x2, 0x5f, 0x2, 0x62, 0x2, 0x65, 0x2, 0x68,
+ 0x2, 0x6b, 0x2, 0x6e, 0x2, 0x71, 0x2, 0x74,
+ 0x2, 0x77, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x7f,
+ 0x2, 0x82, 0x2, 0x85, 0x2, 0x88, 0x2, 0x8b,
+ 0x2, 0x8e, 0x2, 0x91, 0x2, 0x94, 0x2, 0x97,
+ 0x2, 0x9a, 0x2, 0x9c, 0x2, 0x9f, 0x2, 0xa2,
+ 0x2, 0xa5, 0x2, 0xa8, 0x2, 0xab, 0x2, 0xae,
+ 0x2, 0xb1, 0x2, 0xb4, 0x2, 0xb7, 0x2, 0xba,
+ 0x2, 0xe4, 0x2, 0xf6, 0x2, 0xfc, 0x61, 0x31,
+ 0x61, 0x31, 0x30, 0x61, 0x31, 0x30, 0x30, 0x61,
+ 0x31, 0x30, 0x31, 0x61, 0x31, 0x30, 0x32, 0x61,
+ 0x31, 0x30, 0x33, 0x61, 0x31, 0x30, 0x34, 0x61,
+ 0x31, 0x30, 0x35, 0x61, 0x31, 0x30, 0x36, 0x61,
+ 0x31, 0x30, 0x37, 0x61, 0x31, 0x30, 0x38, 0x61,
+ 0x31, 0x30, 0x39, 0x61, 0x31, 0x31, 0x61, 0x31,
+ 0x31, 0x30, 0x61, 0x31, 0x31, 0x31, 0x61, 0x31,
+ 0x31, 0x32, 0x61, 0x31, 0x31, 0x37, 0x61, 0x31,
+ 0x31, 0x38, 0x61, 0x31, 0x31, 0x39, 0x61, 0x31,
+ 0x32, 0x61, 0x31, 0x32, 0x30, 0x61, 0x31, 0x32,
+ 0x31, 0x61, 0x31, 0x32, 0x32, 0x61, 0x31, 0x32,
+ 0x33, 0x61, 0x31, 0x32, 0x34, 0x61, 0x31, 0x32,
+ 0x35, 0x61, 0x31, 0x32, 0x36, 0x61, 0x31, 0x32,
+ 0x37, 0x61, 0x31, 0x32, 0x38, 0x61, 0x31, 0x32,
+ 0x39, 0x61, 0x31, 0x33, 0x61, 0x31, 0x33, 0x30,
+ 0x61, 0x31, 0x33, 0x31, 0x61, 0x31, 0x33, 0x32,
+ 0x61, 0x31, 0x33, 0x33, 0x61, 0x31, 0x33, 0x34,
+ 0x61, 0x31, 0x33, 0x35, 0x61, 0x31, 0x33, 0x36,
+ 0x61, 0x31, 0x33, 0x37, 0x61, 0x31, 0x33, 0x38,
+ 0x61, 0x31, 0x33, 0x39, 0x61, 0x31, 0x34, 0x61,
+ 0x31, 0x34, 0x30, 0x61, 0x31, 0x34, 0x31, 0x61,
+ 0x31, 0x34, 0x32, 0x61, 0x31, 0x34, 0x33, 0x61,
+ 0x31, 0x34, 0x34, 0x61, 0x31, 0x34, 0x35, 0x61,
+ 0x31, 0x34, 0x36, 0x61, 0x31, 0x34, 0x37, 0x61,
+ 0x31, 0x34, 0x38, 0x61, 0x31, 0x34, 0x39, 0x61,
+ 0x31, 0x35, 0x61, 0x31, 0x35, 0x30, 0x61, 0x31,
+ 0x35, 0x31, 0x61, 0x31, 0x35, 0x32, 0x61, 0x31,
+ 0x35, 0x33, 0x61, 0x31, 0x35, 0x34, 0x61, 0x31,
+ 0x35, 0x35, 0x61, 0x31, 0x35, 0x36, 0x61, 0x31,
+ 0x35, 0x37, 0x61, 0x31, 0x35, 0x38, 0x61, 0x31,
+ 0x35, 0x39, 0x61, 0x31, 0x36, 0x61, 0x31, 0x36,
+ 0x30, 0x61, 0x31, 0x36, 0x31, 0x61, 0x31, 0x36,
+ 0x32, 0x61, 0x31, 0x36, 0x33, 0x61, 0x31, 0x36,
+ 0x34, 0x61, 0x31, 0x36, 0x35, 0x61, 0x31, 0x36,
+ 0x36, 0x61, 0x31, 0x36, 0x37, 0x61, 0x31, 0x36,
+ 0x38, 0x61, 0x31, 0x36, 0x39, 0x61, 0x31, 0x37,
+ 0x61, 0x31, 0x37, 0x30, 0x61, 0x31, 0x37, 0x31,
+ 0x61, 0x31, 0x37, 0x32, 0x61, 0x31, 0x37, 0x33,
+ 0x61, 0x31, 0x37, 0x34, 0x61, 0x31, 0x37, 0x35,
+ 0x61, 0x31, 0x37, 0x36, 0x61, 0x31, 0x37, 0x37,
+ 0x61, 0x31, 0x37, 0x38, 0x61, 0x31, 0x37, 0x39,
+ 0x61, 0x31, 0x38, 0x61, 0x31, 0x38, 0x30, 0x61,
+ 0x31, 0x38, 0x31, 0x61, 0x31, 0x38, 0x32, 0x61,
+ 0x31, 0x38, 0x33, 0x61, 0x31, 0x38, 0x34, 0x61,
+ 0x31, 0x38, 0x35, 0x61, 0x31, 0x38, 0x36, 0x61,
+ 0x31, 0x38, 0x37, 0x61, 0x31, 0x38, 0x38, 0x61,
+ 0x31, 0x38, 0x39, 0x61, 0x31, 0x39, 0x61, 0x31,
+ 0x39, 0x30, 0x61, 0x31, 0x39, 0x31, 0x61, 0x31,
+ 0x39, 0x32, 0x61, 0x31, 0x39, 0x33, 0x61, 0x31,
+ 0x39, 0x34, 0x61, 0x31, 0x39, 0x35, 0x61, 0x31,
+ 0x39, 0x36, 0x61, 0x31, 0x39, 0x37, 0x61, 0x31,
+ 0x39, 0x38, 0x61, 0x31, 0x39, 0x39, 0x61, 0x32,
+ 0x61, 0x32, 0x30, 0x61, 0x32, 0x30, 0x30, 0x61,
+ 0x32, 0x30, 0x31, 0x61, 0x32, 0x30, 0x32, 0x61,
+ 0x32, 0x30, 0x33, 0x61, 0x32, 0x30, 0x34, 0x61,
+ 0x32, 0x30, 0x35, 0x61, 0x32, 0x30, 0x36, 0x61,
+ 0x32, 0x31, 0x61, 0x32, 0x32, 0x61, 0x32, 0x33,
+ 0x61, 0x32, 0x34, 0x61, 0x32, 0x35, 0x61, 0x32,
+ 0x36, 0x61, 0x32, 0x37, 0x61, 0x32, 0x38, 0x61,
+ 0x32, 0x39, 0x61, 0x33, 0x61, 0x33, 0x30, 0x61,
+ 0x33, 0x31, 0x61, 0x33, 0x32, 0x61, 0x33, 0x33,
+ 0x61, 0x33, 0x34, 0x61, 0x33, 0x35, 0x61, 0x33,
+ 0x36, 0x61, 0x33, 0x37, 0x61, 0x33, 0x38, 0x61,
+ 0x33, 0x39, 0x61, 0x34, 0x61, 0x34, 0x30, 0x61,
+ 0x34, 0x31, 0x61, 0x34, 0x32, 0x61, 0x34, 0x33,
+ 0x61, 0x34, 0x34, 0x61, 0x34, 0x35, 0x61, 0x34,
+ 0x36, 0x61, 0x34, 0x37, 0x61, 0x34, 0x38, 0x61,
+ 0x34, 0x39, 0x61, 0x35, 0x61, 0x35, 0x30, 0x61,
+ 0x35, 0x31, 0x61, 0x35, 0x32, 0x61, 0x35, 0x33,
+ 0x61, 0x35, 0x34, 0x61, 0x35, 0x35, 0x61, 0x35,
+ 0x36, 0x61, 0x35, 0x37, 0x61, 0x35, 0x38, 0x61,
+ 0x35, 0x39, 0x61, 0x36, 0x61, 0x36, 0x30, 0x61,
+ 0x36, 0x31, 0x61, 0x36, 0x32, 0x61, 0x36, 0x33,
+ 0x61, 0x36, 0x34, 0x61, 0x36, 0x35, 0x61, 0x36,
+ 0x36, 0x61, 0x36, 0x37, 0x61, 0x36, 0x38, 0x61,
+ 0x36, 0x39, 0x61, 0x37, 0x61, 0x37, 0x30, 0x61,
+ 0x37, 0x31, 0x61, 0x37, 0x32, 0x61, 0x37, 0x33,
+ 0x61, 0x37, 0x34, 0x61, 0x37, 0x35, 0x61, 0x37,
+ 0x36, 0x61, 0x37, 0x37, 0x61, 0x37, 0x38, 0x61,
+ 0x37, 0x39, 0x61, 0x38, 0x61, 0x38, 0x31, 0x61,
+ 0x38, 0x32, 0x61, 0x38, 0x33, 0x61, 0x38, 0x34,
+ 0x61, 0x38, 0x35, 0x61, 0x38, 0x36, 0x61, 0x38,
+ 0x37, 0x61, 0x38, 0x38, 0x61, 0x38, 0x39, 0x61,
+ 0x39, 0x61, 0x39, 0x30, 0x61, 0x39, 0x31, 0x61,
+ 0x39, 0x32, 0x61, 0x39, 0x33, 0x61, 0x39, 0x34,
+ 0x61, 0x39, 0x35, 0x61, 0x39, 0x36, 0x61, 0x39,
+ 0x37, 0x61, 0x39, 0x38, 0x61, 0x39, 0x39, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x44,
+ 0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x20,
+ 0x4f, 0x54, 0x46, 0x4e, 0x6f, 0x72, 0x6d, 0x61,
+ 0x6c, 0x0, 0x0, 0x1, 0x1, 0x87, 0xc8, 0x0,
+ 0x1, 0x0, 0x0, 0xcb, 0x2, 0x0, 0x1, 0x0,
+ 0x4, 0x1, 0x3, 0x1, 0x8d, 0x1, 0xfa, 0x2,
+ 0x4a, 0x2, 0x95, 0x2, 0xe3, 0x3, 0x25, 0x3,
+ 0x71, 0x3, 0xc9, 0x4, 0xe0, 0x6, 0x2f, 0x6,
+ 0x9f, 0x7, 0xcc, 0x8, 0x9, 0x8, 0x4e, 0x8,
+ 0xce, 0x9, 0x5d, 0xb, 0x1d, 0xc, 0xf8, 0xe,
+ 0x27, 0xe, 0x74, 0xe, 0xe7, 0xf, 0x55, 0xf,
+ 0xa7, 0x10, 0x36, 0x10, 0x90, 0x10, 0xde, 0x11,
+ 0x71, 0x12, 0x22, 0x12, 0xaa, 0x14, 0x21, 0x14,
+ 0x5e, 0x14, 0xca, 0x15, 0x6f, 0x15, 0xce, 0x16,
+ 0x5e, 0x16, 0xe9, 0x17, 0x2d, 0x17, 0xa2, 0x18,
+ 0x1c, 0x18, 0xaa, 0x1a, 0x1f, 0x1a, 0x45, 0x1a,
+ 0x95, 0x1a, 0xfe, 0x1b, 0x34, 0x1b, 0x91, 0x1c,
+ 0xa, 0x1c, 0x3e, 0x1c, 0xbf, 0x1d, 0x35, 0x1d,
+ 0x97, 0x1d, 0xe3, 0x1e, 0x1, 0x1e, 0x56, 0x1e,
+ 0xbc, 0x1e, 0xfa, 0x1f, 0x45, 0x1f, 0xa3, 0x1f,
+ 0xcd, 0x20, 0x42, 0x20, 0xa9, 0x21, 0x14, 0x21,
+ 0x57, 0x21, 0x87, 0x21, 0xb7, 0x21, 0xcc, 0x22,
+ 0x15, 0x22, 0x5f, 0x22, 0x8f, 0x23, 0x15, 0x23,
+ 0x69, 0x23, 0x8f, 0x23, 0xb6, 0x24, 0x5f, 0x24,
+ 0xa1, 0x24, 0xf7, 0x25, 0x18, 0x25, 0x2b, 0x25,
+ 0x40, 0x25, 0x72, 0x25, 0xa2, 0x25, 0xc4, 0x25,
+ 0xf4, 0x26, 0x38, 0x26, 0xa7, 0x26, 0xfc, 0x27,
+ 0x3c, 0x27, 0x82, 0x27, 0xc8, 0x28, 0x22, 0x28,
+ 0x67, 0x28, 0xca, 0x29, 0x3f, 0x29, 0xa5, 0x29,
+ 0xcb, 0x2a, 0x28, 0x2a, 0x4d, 0x2a, 0x81, 0x2a,
+ 0xb0, 0x2a, 0xf3, 0x2b, 0x4e, 0x2b, 0xbc, 0x2b,
+ 0xec, 0x2c, 0x47, 0x2c, 0xb5, 0x2d, 0xc, 0x2d,
+ 0xcd, 0x2e, 0x37, 0x2e, 0x78, 0x2e, 0xbf, 0x2f,
+ 0x84, 0x2f, 0xb8, 0x2f, 0xdf, 0x30, 0x10, 0x30,
+ 0x2d, 0x30, 0xaf, 0x31, 0x34, 0x31, 0xf2, 0x32,
+ 0xcd, 0x33, 0x1a, 0x33, 0x46, 0x33, 0x7e, 0x33,
+ 0xb6, 0x36, 0x8, 0x36, 0xf2, 0x38, 0x52, 0x39,
+ 0x3f, 0x3b, 0x97, 0x3c, 0x1a, 0x3c, 0x82, 0x3c,
+ 0xb1, 0x3d, 0x6, 0x3d, 0x60, 0x3d, 0xb0, 0x3d,
+ 0xdd, 0x40, 0x4b, 0x40, 0x76, 0x40, 0xb1, 0x41,
+ 0x1b, 0x41, 0x81, 0x41, 0xbf, 0x42, 0x1b, 0x42,
+ 0xa2, 0x43, 0x2, 0x45, 0xaf, 0x45, 0xe5, 0x47,
+ 0xc, 0x47, 0xb8, 0x47, 0xfc, 0x48, 0x55, 0x49,
+ 0x91, 0x4a, 0xda, 0x4b, 0xee, 0x4c, 0xb1, 0x4e,
+ 0x67, 0x4f, 0x36, 0x51, 0x49, 0x51, 0x6f, 0x54,
+ 0xde, 0x55, 0x5e, 0x58, 0xd9, 0x59, 0xc7, 0x5a,
+ 0xb9, 0x5b, 0xa5, 0x5c, 0xb1, 0x5d, 0xb9, 0x5e,
+ 0x95, 0x60, 0xef, 0x61, 0x45, 0x62, 0xd, 0x62,
+ 0x38, 0x62, 0x8b, 0x62, 0x9a, 0x62, 0xcb, 0x62,
+ 0xf5, 0x63, 0x9, 0x63, 0x20, 0x63, 0x36, 0x63,
+ 0x8e, 0x63, 0xf7, 0x64, 0x17, 0x64, 0x24, 0x64,
+ 0x32, 0x64, 0x42, 0x64, 0x72, 0x64, 0x8c, 0x64,
+ 0xaa, 0x64, 0xca, 0x65, 0x2, 0x65, 0x74, 0x65,
+ 0xad, 0x65, 0xc5, 0x65, 0xdb, 0x66, 0xb, 0x66,
+ 0x3b, 0x66, 0x8f, 0x66, 0xe5, 0x67, 0x29, 0x67,
+ 0x6c, 0x67, 0xbf, 0x67, 0xc2, 0xfc, 0xc5, 0xe,
+ 0xf7, 0x1b, 0xf7, 0x18, 0x9f, 0x9d, 0xae, 0xbf,
+ 0xb9, 0x88, 0xa6, 0x71, 0xa6, 0xf7, 0x6a, 0xb3,
+ 0x64, 0xb3, 0x12, 0xf8, 0xfa, 0xac, 0xa2, 0xb1,
+ 0x65, 0xf7, 0x15, 0xfb, 0x13, 0xf7, 0x12, 0x9f,
+ 0xb5, 0x62, 0xb5, 0xbe, 0xbb, 0x5c, 0xbb, 0x13,
+ 0xe5, 0x34, 0xf9, 0x33, 0xf7, 0x95, 0x15, 0xbb,
+ 0x89, 0x9c, 0x83, 0xae, 0x6a, 0x8, 0x73, 0xa4,
+ 0xac, 0x77, 0xaf, 0x1b, 0x13, 0xe5, 0x32, 0xb9,
+ 0xbd, 0xb1, 0xbc, 0x1f, 0x13, 0xcd, 0x34, 0xba,
+ 0x63, 0xa3, 0x60, 0x56, 0x52, 0x78, 0x87, 0x54,
+ 0x1e, 0x64, 0x88, 0x5, 0x13, 0xe5, 0x34, 0xfc,
+ 0x64, 0xfb, 0x3e, 0x15, 0xf8, 0x42, 0x9f, 0xfb,
+ 0x38, 0x6, 0xf7, 0x3d, 0xf5, 0x8f, 0xc2, 0xb5,
+ 0xb2, 0xb2, 0xaf, 0xbc, 0xa1, 0xb5, 0xab, 0x19,
+ 0x13, 0xe5, 0x2c, 0xa1, 0x9c, 0x9d, 0xa3, 0xa8,
+ 0x1a, 0x13, 0xe3, 0x34, 0xb6, 0x65, 0xa7, 0x62,
+ 0x1e, 0x13, 0xe5, 0x94, 0x45, 0x67, 0x4f, 0x4d,
+ 0x85, 0x1f, 0x85, 0x50, 0x6f, 0x71, 0x60, 0x67,
+ 0xfb, 0x76, 0xfb, 0x50, 0x18, 0xfb, 0x31, 0x6,
+ 0xfb, 0x60, 0xcb, 0x15, 0xf8, 0x45, 0x9d, 0xf3,
+ 0xe2, 0x5, 0x8c, 0x7, 0xfc, 0xb0, 0x2c, 0x5,
+ 0xf9, 0x55, 0xf7, 0x95, 0x15, 0x13, 0xe3, 0x34,
+ 0xaa, 0xb0, 0xa7, 0xa8, 0x1e, 0x13, 0xe5, 0x2c,
+ 0xa4, 0x9f, 0x76, 0x72, 0x6c, 0x68, 0x71, 0x6e,
+ 0x1f, 0x13, 0xe5, 0x94, 0x73, 0x74, 0x9e, 0xa4,
+ 0x1f, 0x13, 0xcd, 0x54, 0xe6, 0xfb, 0x80, 0x15,
+ 0xac, 0xac, 0x9f, 0xa9, 0x1e, 0x13, 0xe5, 0x32,
+ 0xa6, 0xa3, 0x7a, 0x6e, 0x6a, 0x6c, 0x7a, 0x6d,
+ 0x1f, 0x13, 0xd5, 0x54, 0x71, 0x70, 0x98, 0xa9,
+ 0x1f, 0xfb, 0x6d, 0xaf, 0x15, 0x93, 0x90, 0x93,
+ 0x94, 0x94, 0x94, 0x84, 0x82, 0x83, 0x82, 0x84,
+ 0x83, 0x82, 0x85, 0x91, 0x94, 0x1e, 0xe, 0xfb,
+ 0x27, 0x92, 0x76, 0xf7, 0x4b, 0xae, 0xf7, 0xb0,
+ 0xaf, 0xf7, 0x49, 0x54, 0xa, 0xf7, 0x3d, 0x15,
+ 0xf7, 0x61, 0x6, 0xf5, 0xfb, 0x4b, 0xf5, 0xf7,
+ 0x4b, 0x5, 0xf7, 0x61, 0x6, 0x25, 0xf7, 0x45,
+ 0xf1, 0xf7, 0x46, 0x5, 0xfb, 0x61, 0x6, 0x21,
+ 0xf7, 0x49, 0x21, 0xfb, 0x49, 0x5, 0xfb, 0x61,
+ 0x6, 0xf0, 0xfb, 0x46, 0x5, 0xf8, 0x23, 0xb2,
+ 0x15, 0x4c, 0xf2, 0x5, 0xf7, 0xe, 0x6, 0xfb,
+ 0xc, 0xfb, 0xb0, 0x15, 0xc8, 0xf3, 0xc5, 0x23,
+ 0x5, 0xfc, 0x86, 0x16, 0xca, 0xf3, 0xc9, 0x23,
+ 0x5, 0x4d, 0xf7, 0x49, 0x15, 0x4f, 0xf2, 0x5,
+ 0xf7, 0xd, 0x6, 0xb6, 0xfb, 0xb0, 0x15, 0x39,
+ 0xf7, 0x22, 0xdd, 0xf7, 0x22, 0x5, 0xf7, 0x3d,
+ 0x6, 0xdd, 0xfb, 0x22, 0x39, 0xfb, 0x22, 0x5,
+ 0xfb, 0x29, 0xf7, 0xd4, 0x15, 0xcb, 0xf7, 0x3,
+ 0xca, 0xfb, 0x3, 0x5, 0xfb, 0xd, 0xfb, 0xf7,
+ 0x15, 0xf7, 0x10, 0x6, 0x49, 0xfb, 0x0, 0x5,
+ 0xe, 0xfb, 0x3f, 0x73, 0xa, 0xf8, 0xee, 0xfc,
+ 0x24, 0xeb, 0xf7, 0x65, 0xea, 0x13, 0xb0, 0xdb,
+ 0xf7, 0x78, 0x15, 0xf7, 0xc, 0x68, 0xa, 0x1e,
+ 0x13, 0xc0, 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4,
+ 0x6a, 0x9f, 0x7f, 0x1f, 0x96, 0x85, 0x9a, 0x87,
+ 0x9c, 0x90, 0x8, 0x90, 0x9c, 0x95, 0x90, 0xa4,
+ 0x1b, 0x13, 0xb0, 0xb1, 0xa3, 0x76, 0x61, 0x59,
+ 0x6a, 0x4a, 0xfb, 0x16, 0x6b, 0x1f, 0x8f, 0x76,
+ 0x5, 0xf7, 0xc5, 0x16, 0xf7, 0xb, 0x68, 0xa,
+ 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4, 0x6a, 0xa0,
+ 0x7f, 0x1e, 0x96, 0x85, 0x99, 0x87, 0x9c, 0x90,
+ 0x8, 0x90, 0x9d, 0x94, 0x90, 0xa5, 0x1b, 0xb0,
+ 0xa4, 0x76, 0x61, 0x59, 0x69, 0x4a, 0xfb, 0x16,
+ 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0x20, 0xfb,
+ 0x38, 0xd6, 0xf9, 0xaa, 0x77, 0xf7, 0x25, 0x77,
+ 0x1, 0xf8, 0x8c, 0xa7, 0x3, 0xf7, 0x94, 0x2f,
+ 0x15, 0x65, 0x9d, 0xab, 0x69, 0xb6, 0x1b, 0xd5,
+ 0xf7, 0x1, 0xbb, 0xf7, 0x8d, 0x1f, 0xf8, 0xcc,
+ 0x7, 0xb7, 0xf7, 0x11, 0x40, 0x7d, 0x86, 0xfb,
+ 0x3, 0x5, 0x72, 0x6, 0xfb, 0x41, 0xfb, 0x22,
+ 0x33, 0xfb, 0x42, 0xfb, 0x4d, 0xf7, 0x3a, 0x3d,
+ 0xf7, 0x15, 0x91, 0x95, 0x8e, 0x99, 0xb0, 0x1f,
+ 0x5f, 0x7, 0xfb, 0x58, 0x34, 0x61, 0x32, 0x7b,
+ 0x6b, 0x90, 0x91, 0x7d, 0x1e, 0xe, 0xfb, 0xbb,
+ 0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xf7, 0xa4,
+ 0xf7, 0xa4, 0x15, 0x9f, 0xd2, 0xaa, 0x96, 0xcc,
+ 0xa8, 0x8, 0xd3, 0xa9, 0xa7, 0xc5, 0xdc, 0x1a,
+ 0xf7, 0x27, 0xfb, 0x1, 0x92, 0xfb, 0x5, 0x25,
+ 0xfb, 0x0, 0x78, 0xfb, 0x15, 0x37, 0xa4, 0x51,
+ 0xd6, 0x6a, 0x1e, 0xcd, 0x6e, 0xa9, 0x80, 0x9f,
+ 0x44, 0x8, 0xfb, 0x10, 0xfb, 0x35, 0x15, 0x47,
+ 0xc4, 0x52, 0xcf, 0xd1, 0xc2, 0xc4, 0xcf, 0xd1,
+ 0x54, 0xc2, 0x45, 0x47, 0x52, 0x54, 0x45, 0x1e,
+ 0xe, 0xfb, 0xbb, 0x3a, 0xa, 0xf7, 0xa3, 0xf7,
+ 0xa8, 0x15, 0xa4, 0xcd, 0xbe, 0xa8, 0xc8, 0xa5,
+ 0x8, 0xcd, 0xa8, 0xad, 0xd8, 0xd6, 0x1a, 0xd1,
+ 0x62, 0xc4, 0x3f, 0x4a, 0x63, 0x55, 0x52, 0x7c,
+ 0x1e, 0xc4, 0x7f, 0x5f, 0xc1, 0x4c, 0x1b, 0x3a,
+ 0x66, 0x4e, 0x42, 0x45, 0xb4, 0x3d, 0xc7, 0x71,
+ 0x1f, 0xc8, 0x70, 0xbe, 0x6f, 0xa3, 0x49, 0x8,
+ 0xfb, 0x12, 0xfb, 0x38, 0x15, 0x46, 0xc3, 0x52,
+ 0xd1, 0xd1, 0xc3, 0xc4, 0xd0, 0xd2, 0x53, 0xc2,
+ 0x45, 0x46, 0x52, 0x54, 0x44, 0x1e, 0xe, 0xd2,
+ 0xc8, 0x76, 0xf8, 0xf7, 0x77, 0x1, 0xf8, 0x5b,
+ 0xb3, 0x15, 0xb0, 0xe2, 0xe3, 0xbe, 0xe0, 0xab,
+ 0x8, 0xf7, 0x2d, 0xc3, 0xc4, 0xdc, 0xec, 0x1a,
+ 0xf7, 0xb, 0x39, 0xe3, 0xfb, 0xd, 0xfb, 0x3,
+ 0x40, 0x2c, 0x25, 0x6c, 0x1e, 0xf1, 0x6f, 0x3a,
+ 0xea, 0xfb, 0x1, 0x1b, 0xfb, 0xd, 0x3a, 0x32,
+ 0xfb, 0xb, 0x2e, 0xc6, 0x35, 0xe2, 0x6c, 0x1f,
+ 0xf7, 0x29, 0x54, 0xe3, 0x59, 0xb0, 0x33, 0x8,
+ 0xe, 0xd3, 0x61, 0x76, 0xcc, 0x76, 0xf8, 0xb4,
+ 0x77, 0xe6, 0x77, 0x1, 0xf8, 0xde, 0x96, 0x3,
+ 0xf7, 0x23, 0xc0, 0x15, 0xa0, 0x75, 0xf8, 0x3a,
+ 0xf8, 0x39, 0x8c, 0x6f, 0xfc, 0x2c, 0xfc, 0x2c,
+ 0x96, 0x81, 0xf8, 0x2a, 0xf8, 0x2a, 0xaf, 0x7d,
+ 0xfc, 0x35, 0xfc, 0x35, 0xbb, 0x5a, 0xf8, 0x43,
+ 0xf8, 0x43, 0xf2, 0xf7, 0x72, 0x80, 0x96, 0xfb,
+ 0x74, 0xfb, 0x10, 0x5, 0xb0, 0x5c, 0x15, 0x88,
+ 0xab, 0xf7, 0x17, 0xd8, 0x95, 0x82, 0x34, 0xfb,
+ 0x1d, 0x80, 0xa0, 0x5, 0xe, 0xfb, 0x40, 0x92,
+ 0x76, 0xf7, 0xea, 0xaf, 0xf7, 0xe9, 0x54, 0xa,
+ 0xf8, 0xea, 0x3, 0xf7, 0x59, 0xf7, 0xe6, 0x15,
+ 0x36, 0x7b, 0x3e, 0x44, 0x32, 0x1a, 0x2b, 0xd8,
+ 0x3b, 0xec, 0xb3, 0xaf, 0x96, 0xa3, 0xab, 0x1e,
+ 0xda, 0xc6, 0x88, 0xf7, 0x4, 0xd2, 0xcf, 0x8,
+ 0xac, 0xae, 0xbc, 0xae, 0xbc, 0x1b, 0xaf, 0x89,
+ 0x5, 0xb3, 0x7, 0x67, 0x89, 0x63, 0x8e, 0x61,
+ 0xa5, 0x69, 0xa4, 0x19, 0x3a, 0xc6, 0x8c, 0xf7,
+ 0x1, 0x4a, 0xcf, 0x8, 0xab, 0x6b, 0x60, 0x9e,
+ 0x5e, 0x1b, 0x28, 0x39, 0x40, 0x27, 0x33, 0xd8,
+ 0x42, 0xe0, 0x7c, 0x1f, 0xe, 0x3c, 0x81, 0xab,
+ 0xee, 0xa4, 0x90, 0xde, 0xf7, 0x4a, 0x94, 0x82,
+ 0xf7, 0x4, 0xf7, 0x0, 0xa2, 0x12, 0x9d, 0xb9,
+ 0xf7, 0x2b, 0xf7, 0x10, 0x60, 0x9d, 0xf7, 0x16,
+ 0xaf, 0x7e, 0xf7, 0x36, 0xd2, 0xb5, 0x13, 0xef,
+ 0x50, 0xf7, 0xce, 0xf7, 0x34, 0x15, 0x8d, 0x6,
+ 0x84, 0x92, 0x94, 0x89, 0x98, 0x1b, 0x9c, 0xe0,
+ 0x95, 0xc6, 0xd7, 0x1f, 0xc2, 0xb6, 0xbe, 0xc6,
+ 0xd9, 0x1a, 0xb2, 0x72, 0xb7, 0x56, 0x60, 0x6b,
+ 0x71, 0x6b, 0x71, 0x1e, 0x87, 0x8d, 0x5, 0x9f,
+ 0xaf, 0x99, 0xa5, 0xb5, 0x1a, 0xb8, 0x71, 0xde,
+ 0xfb, 0x9, 0xfb, 0x50, 0xfb, 0x17, 0xfb, 0x50,
+ 0xfb, 0x44, 0xfb, 0x2d, 0xe2, 0xfb, 0x2c, 0xf7,
+ 0x6b, 0xf7, 0x71, 0xf7, 0x5d, 0xf7, 0x5e, 0xf7,
+ 0x70, 0xf7, 0xa, 0x48, 0xd7, 0x59, 0x7f, 0x7f,
+ 0x84, 0x7e, 0x84, 0x1e, 0x90, 0x88, 0x97, 0x87,
+ 0x96, 0x84, 0x8, 0xb7, 0x6c, 0xad, 0x49, 0x33,
+ 0x1a, 0xfb, 0x5f, 0xfb, 0x27, 0xfb, 0x36, 0xfb,
+ 0x62, 0xfb, 0x45, 0x21, 0xf7, 0x1d, 0xf7, 0x3c,
+ 0x1e, 0x13, 0xf6, 0xb0, 0xf7, 0x22, 0xe3, 0xf7,
+ 0x3b, 0xf7, 0x31, 0xf3, 0xaa, 0x38, 0x5b, 0x1e,
+ 0x8c, 0x75, 0x87, 0x72, 0x85, 0x7a, 0x8, 0x89,
+ 0x6, 0xb0, 0x82, 0x76, 0xbd, 0x4a, 0x1b, 0x40,
+ 0x5b, 0x42, 0x45, 0x64, 0x95, 0x78, 0xa3, 0x6a,
+ 0x1f, 0xb1, 0x57, 0x97, 0x79, 0x88, 0x66, 0x8,
+ 0x69, 0x88, 0x6d, 0x84, 0x84, 0x1b, 0x67, 0x74,
+ 0xb6, 0xa3, 0x8d, 0x1f, 0x8c, 0x96, 0x87, 0x8e,
+ 0x83, 0x81, 0x8, 0x81, 0x7f, 0x87, 0x7f, 0x7c,
+ 0x1a, 0x69, 0xa4, 0x74, 0xaf, 0xb4, 0xa4, 0x9b,
+ 0xa2, 0x98, 0x1e, 0x13, 0xf7, 0x50, 0xa4, 0xf7,
+ 0x23, 0x15, 0xc1, 0xa9, 0xc1, 0xc6, 0x90, 0x1e,
+ 0x96, 0x8c, 0x8b, 0x89, 0x90, 0x85, 0x8, 0x13,
+ 0xf7, 0x30, 0x98, 0x7c, 0x95, 0x74, 0x6f, 0x1a,
+ 0x59, 0x67, 0x5b, 0x59, 0x80, 0x1e, 0x7f, 0x88,
+ 0x8a, 0x8c, 0x84, 0x93, 0x8, 0x7f, 0x99, 0x81,
+ 0xa0, 0xa7, 0x1a, 0xe, 0x3c, 0xcf, 0xf7, 0x37,
+ 0xfb, 0x37, 0xf7, 0x38, 0x4b, 0xca, 0xf7, 0xa,
+ 0xf7, 0x44, 0xca, 0x77, 0x12, 0x96, 0xe0, 0x74,
+ 0xcf, 0xc7, 0xa0, 0x8b, 0xdf, 0x9e, 0xac, 0xf7,
+ 0xed, 0xb3, 0x13, 0x9b, 0xe0, 0xf7, 0xcb, 0xf7,
+ 0xb5, 0x15, 0x85, 0x86, 0x75, 0x7c, 0x80, 0x7b,
+ 0x8, 0x7d, 0x78, 0x86, 0x77, 0x7b, 0x1a, 0x7b,
+ 0x92, 0x65, 0xb3, 0x67, 0x1e, 0x6a, 0xb0, 0xb5,
+ 0x84, 0xa1, 0x1b, 0xba, 0xbf, 0xa6, 0xb1, 0xaa,
+ 0x1f, 0xbb, 0xc5, 0x9a, 0x94, 0xb8, 0x96, 0xad,
+ 0x93, 0xa8, 0x9d, 0x9d, 0x99, 0x8, 0x9a, 0x98,
+ 0x93, 0xa0, 0x98, 0x1a, 0xa2, 0x7f, 0x9c, 0x78,
+ 0x7a, 0x81, 0x7c, 0x83, 0x87, 0x1e, 0x88, 0x84,
+ 0x8e, 0x85, 0x8f, 0x8a, 0x8, 0x93, 0x88, 0x95,
+ 0x84, 0x7f, 0x1a, 0x79, 0x7d, 0x7e, 0x77, 0x79,
+ 0x6a, 0x8e, 0xf2, 0x64, 0x1e, 0x85, 0x9b, 0x85,
+ 0x9b, 0x85, 0x99, 0x8, 0xd5, 0x6d, 0x6d, 0xbe,
+ 0x3b, 0x1b, 0x6f, 0x6a, 0x7e, 0x73, 0x75, 0x1f,
+ 0x77, 0x75, 0x7f, 0x6d, 0x6d, 0x1a, 0x6e, 0x9a,
+ 0x6c, 0x8f, 0x85, 0x1e, 0x8e, 0x85, 0x8b, 0x88,
+ 0x87, 0x88, 0x85, 0x8a, 0x84, 0x8c, 0x85, 0x8c,
+ 0x7e, 0x8c, 0x6a, 0x95, 0x6b, 0xa1, 0x8, 0x9a,
+ 0x82, 0x9c, 0x83, 0x97, 0x1e, 0x83, 0x96, 0x85,
+ 0x8f, 0x73, 0x85, 0x8, 0x78, 0x99, 0x7f, 0x9d,
+ 0xaa, 0x1a, 0xaa, 0x91, 0x99, 0x91, 0x9a, 0x1e,
+ 0x90, 0x95, 0x8e, 0x90, 0x82, 0x96, 0x8, 0x99,
+ 0x81, 0x7e, 0x95, 0x82, 0x1b, 0x70, 0x77, 0x59,
+ 0x75, 0x82, 0x8f, 0x78, 0xab, 0x60, 0x1f, 0xa7,
+ 0x67, 0xad, 0x6b, 0xa9, 0x74, 0x8d, 0x73, 0x85,
+ 0x68, 0x7a, 0x6d, 0x8, 0x74, 0x7e, 0x77, 0x80,
+ 0x78, 0x1b, 0x13, 0x3d, 0xe0, 0x72, 0x84, 0x9f,
+ 0x99, 0x94, 0x8b, 0x89, 0x89, 0x8e, 0x1f, 0x90,
+ 0x84, 0x81, 0x91, 0x7e, 0x1b, 0x6f, 0x72, 0x72,
+ 0x6b, 0x68, 0xab, 0x71, 0xb0, 0xa0, 0xa0, 0x90,
+ 0x9d, 0xa4, 0x1f, 0xb7, 0xab, 0xab, 0xcb, 0x8a,
+ 0xbe, 0x9d, 0x81, 0xbb, 0x77, 0x95, 0x88, 0x98,
+ 0x86, 0x87, 0x84, 0x8f, 0x87, 0x8, 0xbd, 0x8e,
+ 0x15, 0x87, 0x96, 0x8b, 0x8d, 0x91, 0x92, 0x8,
+ 0x9e, 0x9b, 0x9f, 0x9d, 0xb4, 0x1b, 0xbc, 0xaa,
+ 0x61, 0x67, 0x97, 0x1f, 0x8e, 0x83, 0x8a, 0x88,
+ 0x85, 0x87, 0x8, 0x13, 0x5d, 0xe0, 0x7d, 0x7a,
+ 0x6d, 0x81, 0x6b, 0x1b, 0x58, 0x6e, 0xb0, 0xa2,
+ 0x83, 0x1f, 0xe, 0xfb, 0x69, 0xa0, 0x76, 0xf9,
+ 0x7a, 0x77, 0x1, 0xf7, 0xba, 0xb1, 0x3, 0xf7,
+ 0x6e, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, 0x5f,
+ 0xcc, 0x70, 0xf5, 0x86, 0xf7, 0x20, 0x8, 0x93,
+ 0x6, 0x8f, 0x75, 0x5, 0x4b, 0x97, 0xbd, 0x64,
+ 0xbb, 0x1b, 0xbb, 0xcd, 0xa8, 0xe7, 0xb4, 0x74,
+ 0xae, 0x6f, 0xa7, 0x1f, 0x6d, 0xa9, 0x68, 0xa2,
+ 0x79, 0xa0, 0x61, 0xba, 0x57, 0xd8, 0x79, 0xf7,
+ 0xc, 0x82, 0x8d, 0x18, 0x82, 0x89, 0x79, 0xfb,
+ 0xc, 0x57, 0x3e, 0x61, 0x5c, 0x19, 0x78, 0x76,
+ 0x65, 0x72, 0x6d, 0x6b, 0x8, 0x71, 0x6f, 0x76,
+ 0x6b, 0x63, 0x1a, 0x2f, 0xcd, 0x6e, 0xbb, 0xbb,
+ 0xbd, 0xb2, 0xcb, 0x97, 0x1e, 0x8f, 0xa1, 0x5,
+ 0x93, 0x6, 0x86, 0xfb, 0x20, 0x70, 0x21, 0x5f,
+ 0x4a, 0x8, 0xe, 0xf7, 0xd, 0xf7, 0x2e, 0x76,
+ 0xf7, 0xb7, 0xda, 0x43, 0xd3, 0xa9, 0x77, 0x12,
+ 0x13, 0xd0, 0xf8, 0x25, 0xf7, 0xd7, 0x15, 0xf7,
+ 0x6e, 0x42, 0xb5, 0x91, 0xb0, 0xc1, 0x5, 0xad,
+ 0x7, 0x52, 0xd4, 0xb9, 0x8d, 0xb9, 0x8d, 0xb9,
+ 0x8e, 0x19, 0x13, 0xb0, 0xaf, 0x8d, 0xaf, 0x8e,
+ 0xaf, 0x8d, 0x8, 0xa2, 0x8d, 0x9e, 0x95, 0xa4,
+ 0x1a, 0xa5, 0x76, 0x95, 0x73, 0x1e, 0xfc, 0x3,
+ 0x8a, 0xd2, 0x3f, 0x5, 0x8e, 0x88, 0x8d, 0x7b,
+ 0x87, 0x1a, 0x83, 0x89, 0x81, 0x85, 0x85, 0x1e,
+ 0xc2, 0x6f, 0x89, 0x81, 0x3b, 0x93, 0x7b, 0x8d,
+ 0x82, 0x8a, 0x7c, 0x8e, 0x19, 0x74, 0x8f, 0x65,
+ 0x98, 0x73, 0x91, 0x8, 0x74, 0x88, 0x81, 0x79,
+ 0x76, 0x1a, 0x87, 0x8b, 0x87, 0x8c, 0x87, 0x1e,
+ 0x8e, 0x33, 0x15, 0xf7, 0x22, 0x55, 0x9d, 0x8e,
+ 0xaa, 0xc5, 0xfb, 0x5c, 0xce, 0x5, 0x81, 0x86,
+ 0x85, 0x82, 0x80, 0x1a, 0x7a, 0x99, 0x78, 0x96,
+ 0x7e, 0x1e, 0xfb, 0xf4, 0x67, 0x15, 0xf7, 0x22,
+ 0x98, 0x9e, 0x82, 0xd6, 0x67, 0x9a, 0x87, 0x19,
+ 0x91, 0x89, 0xd6, 0x84, 0x96, 0x8a, 0x8, 0x7f,
+ 0x97, 0x7c, 0x9d, 0x9d, 0x1a, 0x98, 0x93, 0x95,
+ 0x96, 0x91, 0x1e, 0x7f, 0x9b, 0x7f, 0x9f, 0xa0,
+ 0x1a, 0x92, 0x8d, 0x92, 0x8e, 0x91, 0x1e, 0x7d,
+ 0x6f, 0x6c, 0x84, 0x6c, 0x1b, 0x7b, 0x7c, 0x8d,
+ 0x8e, 0x7c, 0x1f, 0x8e, 0x9b, 0x5, 0x88, 0x9a,
+ 0x9a, 0x8a, 0x9b, 0x1b, 0xb1, 0xad, 0x95, 0xa0,
+ 0xaa, 0x1f, 0xab, 0x9f, 0xa2, 0xab, 0x8f, 0x1e,
+ 0xdb, 0x75, 0x34, 0xc8, 0x4e, 0x79, 0x87, 0x9a,
+ 0xc4, 0x9c, 0x95, 0xb5, 0x9b, 0x86, 0x81, 0x66,
+ 0xe3, 0x4d, 0x5, 0x89, 0x8d, 0x9a, 0x8a, 0x8f,
+ 0x1b, 0x9d, 0x97, 0x8e, 0x9e, 0x1f, 0x90, 0x8a,
+ 0x90, 0x90, 0x1a, 0x20, 0xf7, 0x1, 0xfb, 0x33,
+ 0x91, 0xfb, 0x17, 0xfb, 0xf, 0xfb, 0x17, 0x8f,
+ 0x5, 0x78, 0x6e, 0x82, 0x68, 0x68, 0x1a, 0x62,
+ 0x97, 0x63, 0xa0, 0x68, 0x1e, 0xf8, 0x4, 0x58,
+ 0x15, 0xbd, 0x7c, 0xa9, 0x9b, 0xa0, 0xa3, 0xfb,
+ 0xe, 0xba, 0x5, 0x83, 0x88, 0x86, 0x84, 0x82,
+ 0x1a, 0x78, 0x9f, 0x75, 0x99, 0x7f, 0x1e, 0xe,
+ 0xfb, 0x25, 0x92, 0x76, 0xf9, 0x4d, 0x77, 0x1,
+ 0xf7, 0xef, 0x7d, 0x15, 0xa8, 0xf3, 0xf2, 0xf7,
+ 0x25, 0xd8, 0xec, 0x8, 0xc2, 0xd0, 0xbb, 0xcb,
+ 0xe8, 0x1a, 0xe0, 0x49, 0xc9, 0x36, 0x3a, 0x4c,
+ 0x3d, 0x3f, 0x7a, 0x1e, 0xda, 0x76, 0x52, 0xd6,
+ 0x33, 0x1b, 0x3a, 0x4a, 0x49, 0x39, 0x33, 0xc4,
+ 0x42, 0xc0, 0x4a, 0x1f, 0xe0, 0x23, 0xe8, 0xfb,
+ 0x1d, 0xa3, 0x23, 0x8, 0xe, 0xfb, 0x88, 0x94,
+ 0x76, 0xf9, 0x86, 0x77, 0x1, 0xcb, 0xf8, 0x66,
+ 0x3, 0xf7, 0xb4, 0x81, 0x15, 0x94, 0x89, 0x94,
+ 0x8d, 0xa5, 0xf7, 0x39, 0xf1, 0xf7, 0x22, 0xe9,
+ 0xc6, 0x19, 0x8d, 0x94, 0x89, 0x94, 0x2d, 0xc6,
+ 0x25, 0xf7, 0x22, 0x71, 0xf7, 0x39, 0x19, 0x82,
+ 0x8d, 0x82, 0x89, 0x71, 0xfb, 0x39, 0x25, 0xfb,
+ 0x22, 0x2d, 0x50, 0x19, 0x89, 0x82, 0x8d, 0x82,
+ 0xe9, 0x50, 0xf1, 0xfb, 0x22, 0xa5, 0xfb, 0x39,
+ 0x19, 0xe, 0x4c, 0xa0, 0x76, 0xf7, 0xd0, 0xad,
+ 0xf7, 0xf2, 0x77, 0x12, 0xf8, 0x5, 0xb1, 0x66,
+ 0xaf, 0x13, 0xf0, 0xf7, 0xb9, 0x16, 0xea, 0x6,
+ 0xea, 0x96, 0x6, 0x5f, 0xcb, 0x71, 0xf3, 0x85,
+ 0xf7, 0x1d, 0x8, 0x9a, 0x6, 0x48, 0x93, 0xc4,
+ 0x58, 0xd0, 0x1b, 0xd6, 0xc7, 0xc7, 0xd6, 0xd6,
+ 0x4f, 0xc7, 0x40, 0x46, 0x52, 0x58, 0x48, 0x83,
+ 0x1f, 0x13, 0xe8, 0x7b, 0x6, 0x94, 0x8b, 0x94,
+ 0x94, 0x1a, 0xc1, 0x7, 0xcd, 0x94, 0xbe, 0xc4,
+ 0xcf, 0x1a, 0xd6, 0x4f, 0xc7, 0x40, 0x40, 0x4f,
+ 0x4f, 0x40, 0x47, 0xbe, 0x52, 0xcd, 0x82, 0x1e,
+ 0x55, 0x7, 0x82, 0x8b, 0x82, 0x82, 0x1a, 0x7b,
+ 0x6, 0xce, 0x83, 0x52, 0xbe, 0x46, 0x1b, 0x40,
+ 0x4f, 0x4f, 0x40, 0x40, 0xc7, 0x4f, 0xd6, 0xd0,
+ 0xc4, 0xbe, 0xce, 0x93, 0x1f, 0x13, 0xf0, 0x9a,
+ 0x6, 0x85, 0xfb, 0x1d, 0x71, 0x23, 0x5f, 0x4b,
+ 0x8, 0xe, 0xfb, 0x29, 0xf7, 0x33, 0x76, 0xb3,
+ 0xf7, 0xe4, 0xfb, 0x8f, 0xf7, 0x39, 0xf7, 0x11,
+ 0x77, 0x12, 0xc1, 0xf8, 0xa, 0xfb, 0x37, 0xf8,
+ 0x1a, 0xfb, 0xcc, 0xf7, 0xcc, 0x13, 0xb2, 0xae,
+ 0xf7, 0x1e, 0x15, 0xf9, 0x0, 0xf8, 0x33, 0xfd,
+ 0x0, 0x6, 0x13, 0xd8, 0xf8, 0x1d, 0xfb, 0x6e,
+ 0x15, 0xa2, 0x7, 0xf7, 0x64, 0xf7, 0x30, 0x5,
+ 0xfb, 0xe4, 0x7, 0xfc, 0xda, 0x76, 0x15, 0x13,
+ 0xb4, 0xf7, 0x67, 0xf7, 0x34, 0x5, 0x68, 0x99,
+ 0xa9, 0x78, 0xb1, 0x1b, 0xaf, 0xa7, 0xa1, 0xab,
+ 0x98, 0x1f, 0xf7, 0x66, 0xfb, 0x34, 0x5, 0x13,
+ 0xb8, 0x13, 0xb4, 0xfc, 0x5, 0xf7, 0x6e, 0x15,
+ 0x13, 0xb8, 0xfb, 0x67, 0xf7, 0x36, 0x5, 0xf8,
+ 0xda, 0x6, 0xfb, 0x69, 0xfb, 0x36, 0x5, 0x13,
+ 0xb2, 0xad, 0x7e, 0x6d, 0x9e, 0x66, 0x1b, 0x13,
+ 0xd4, 0x6a, 0x69, 0x75, 0x6c, 0x80, 0x1f, 0x13,
+ 0xd8, 0xfb, 0x67, 0xfb, 0x59, 0x15, 0xf7, 0xe4,
+ 0x7, 0xf7, 0x63, 0xfb, 0x30, 0x5, 0x74, 0x7,
+ 0xe, 0x5b, 0xf7, 0x23, 0x9f, 0xc3, 0x9f, 0x84,
+ 0x99, 0x8a, 0x9f, 0xa7, 0x9f, 0x95, 0x9f, 0x8f,
+ 0x9f, 0xed, 0xa3, 0xf3, 0x77, 0x12, 0xf7, 0x1f,
+ 0x9f, 0x80, 0x9f, 0xf7, 0x5f, 0x99, 0xab, 0x9f,
+ 0x96, 0xa9, 0xda, 0x9f, 0x93, 0xa5, 0x13, 0xdf,
+ 0xdf, 0x8d, 0xf8, 0x12, 0x15, 0xce, 0x72, 0x5,
+ 0x7b, 0x8c, 0x95, 0x79, 0xa1, 0x1b, 0x99, 0x95,
+ 0x90, 0x91, 0x92, 0x1f, 0x91, 0x8a, 0x5, 0x73,
+ 0x9a, 0x7b, 0xa2, 0x96, 0x94, 0x8e, 0x90, 0x94,
+ 0x1e, 0x8c, 0x8a, 0x77, 0x7d, 0x7f, 0x7a, 0x85,
+ 0x75, 0x19, 0x13, 0xdf, 0xbf, 0x81, 0x7e, 0x80,
+ 0x7b, 0x76, 0x1a, 0x67, 0xa6, 0x79, 0xa4, 0xad,
+ 0xb0, 0x9e, 0xa5, 0xab, 0x1e, 0xd8, 0xcb, 0xb0,
+ 0x92, 0x5, 0x75, 0x8e, 0x9a, 0x79, 0xa7, 0x1b,
+ 0x13, 0xaf, 0xdf, 0xa0, 0x9d, 0x99, 0x98, 0x98,
+ 0x1f, 0xa9, 0xaa, 0x97, 0x8d, 0x5, 0x13, 0xdf,
+ 0xbf, 0x76, 0x8f, 0x9e, 0x7e, 0x9e, 0x1b, 0xa7,
+ 0xa6, 0xaa, 0x9f, 0x9d, 0x1f, 0xaf, 0x91, 0xdd,
+ 0xc2, 0x5, 0x99, 0x7, 0xfb, 0x79, 0x84, 0x34,
+ 0x90, 0x94, 0x9a, 0x94, 0x99, 0x92, 0x9b, 0x19,
+ 0xcf, 0xa6, 0xbc, 0xbc, 0x8a, 0x8f, 0x29, 0x82,
+ 0xab, 0xf5, 0x87, 0x8d, 0x3d, 0x60, 0x66, 0x48,
+ 0x5d, 0x94, 0x59, 0x74, 0x5, 0x88, 0x7, 0xcd,
+ 0x69, 0x78, 0x74, 0x6e, 0x7c, 0x72, 0x7b, 0x19,
+ 0xfb, 0xa1, 0xbe, 0x53, 0x6b, 0x5, 0x86, 0x8b,
+ 0x86, 0x86, 0x1a, 0xf8, 0xd3, 0x31, 0x15, 0x93,
+ 0x8c, 0x5, 0x7f, 0x8f, 0x85, 0x94, 0x93, 0x90,
+ 0x95, 0x97, 0x1e, 0xb3, 0x90, 0x5, 0x7b, 0x7c,
+ 0x76, 0x76, 0x7b, 0x1b, 0x7a, 0x84, 0x97, 0x9a,
+ 0x8d, 0x1f, 0xfb, 0x54, 0x78, 0x15, 0x86, 0xa5,
+ 0xa9, 0xa2, 0xb2, 0xa7, 0xf7, 0x4, 0x85, 0x18,
+ 0xf7, 0x4b, 0x91, 0x5c, 0x6d, 0xfb, 0x9a, 0x67,
+ 0x7e, 0x89, 0x77, 0x86, 0x7a, 0x87, 0x19, 0xad,
+ 0xf7, 0x40, 0x15, 0x61, 0xa1, 0x94, 0x8f, 0xb6,
+ 0x83, 0x5, 0x93, 0xfb, 0x52, 0x15, 0x96, 0x8c,
+ 0x5, 0x7f, 0x89, 0x8f, 0x80, 0x96, 0x1b, 0x97,
+ 0x91, 0x96, 0x9b, 0x8a, 0x1f, 0xbb, 0x92, 0x72,
+ 0x72, 0x5, 0x81, 0x81, 0x7e, 0x80, 0x7c, 0x1b,
+ 0x74, 0x86, 0x9d, 0x9b, 0x8d, 0x1f, 0xfb, 0x8c,
+ 0x6b, 0x15, 0x86, 0x92, 0x96, 0x87, 0x9d, 0x1b,
+ 0xa1, 0x84, 0x94, 0xa4, 0x6d, 0x81, 0x71, 0x95,
+ 0x83, 0x8e, 0x19, 0x97, 0xa8, 0xa6, 0x97, 0xa6,
+ 0x9c, 0xeb, 0xc7, 0x18, 0x9d, 0x96, 0x9c, 0x97,
+ 0x9a, 0x99, 0xa0, 0xa0, 0x95, 0xa3, 0x9a, 0xa5,
+ 0xab, 0xc3, 0x18, 0xae, 0x9e, 0x6f, 0x2f, 0xd9,
+ 0x92, 0x80, 0x80, 0x43, 0x6f, 0x80, 0x70, 0x7b,
+ 0x73, 0x7b, 0x73, 0x19, 0x63, 0x70, 0x66, 0x6d,
+ 0x92, 0x6e, 0x3b, 0x49, 0x18, 0x78, 0x74, 0x68,
+ 0x76, 0x6a, 0x1b, 0x13, 0xaf, 0xdf, 0x7a, 0x7c,
+ 0x98, 0xa0, 0x9e, 0x96, 0x99, 0x95, 0x96, 0x1f,
+ 0xc5, 0xd6, 0x15, 0xfb, 0x6a, 0xd7, 0xa7, 0x9b,
+ 0xf7, 0x93, 0x5b, 0x5, 0xfb, 0x31, 0x73, 0x15,
+ 0xb5, 0x7c, 0x5, 0x86, 0x84, 0x83, 0x88, 0x82,
+ 0x1b, 0x7d, 0x85, 0x96, 0x97, 0x8d, 0x1f, 0x45,
+ 0xa3, 0x15, 0xaa, 0x80, 0x5, 0x87, 0x86, 0x86,
+ 0x89, 0x83, 0x1b, 0x81, 0x88, 0x93, 0x94, 0x1f,
+ 0xe, 0x5a, 0xaf, 0x9f, 0xbd, 0xc5, 0xc0, 0xf5,
+ 0x29, 0xf7, 0x3, 0x61, 0xe7, 0x9d, 0xea, 0x9d,
+ 0x9f, 0x93, 0xcd, 0x84, 0xca, 0x12, 0xc9, 0xa3,
+ 0x80, 0xb6, 0x76, 0xa0, 0xf8, 0xd1, 0x9f, 0x13,
+ 0xe6, 0xd8, 0xcc, 0xf8, 0xa1, 0x15, 0xaf, 0x97,
+ 0xb8, 0xb6, 0xeb, 0x1b, 0xc1, 0xcd, 0x7c, 0x7d,
+ 0xcc, 0x1f, 0x13, 0xe7, 0x58, 0x7c, 0xce, 0xce,
+ 0x7c, 0xbc, 0x1b, 0xc8, 0xbe, 0xa4, 0xa1, 0xa9,
+ 0x1f, 0x78, 0xd3, 0x5, 0x71, 0x6d, 0x61, 0x70,
+ 0x57, 0x1b, 0x54, 0x4f, 0x98, 0x99, 0x4e, 0x1f,
+ 0x13, 0xe6, 0xd8, 0x99, 0x4c, 0x4b, 0x9a, 0x4e,
+ 0x1b, 0xfb, 0x7, 0x5c, 0x50, 0x53, 0x82, 0x8f,
+ 0x82, 0x8d, 0x82, 0x1f, 0xb6, 0xfb, 0x83, 0x15,
+ 0x85, 0x7b, 0x86, 0x80, 0x70, 0x1a, 0x2f, 0xf7,
+ 0x3, 0x23, 0xf7, 0x58, 0xf7, 0x3f, 0xf7, 0x1c,
+ 0xde, 0xf7, 0x9, 0xa2, 0x86, 0x96, 0x85, 0x9b,
+ 0x1e, 0x8b, 0x96, 0xaa, 0xa2, 0x1a, 0xf7, 0x1,
+ 0xfb, 0x18, 0xe3, 0xfb, 0x44, 0x22, 0x3a, 0x6b,
+ 0x66, 0x5c, 0x1e, 0x69, 0x95, 0x62, 0xa2, 0x82,
+ 0xad, 0x8, 0x13, 0xe7, 0x28, 0x85, 0x86, 0x86,
+ 0x7f, 0x80, 0x1a, 0x5e, 0x9e, 0x73, 0xa8, 0x7a,
+ 0x1e, 0x13, 0xe7, 0x58, 0x7a, 0x71, 0x82, 0x78,
+ 0x67, 0x1a, 0x72, 0x8e, 0x7f, 0x93, 0x7a, 0x1e,
+ 0x95, 0xc1, 0x15, 0xed, 0xf7, 0x13, 0xda, 0xf7,
+ 0x32, 0xf7, 0x32, 0xf7, 0x16, 0x3c, 0x29, 0x2a,
+ 0xfb, 0x16, 0x3c, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+ 0x13, 0xda, 0xec, 0x1e, 0x93, 0x48, 0x15, 0x97,
+ 0x77, 0xa4, 0x71, 0x9e, 0x7e, 0x8, 0x79, 0x87,
+ 0x7f, 0x8a, 0x83, 0x1a, 0x6e, 0xd1, 0x4c, 0xa6,
+ 0x94, 0x94, 0x92, 0x96, 0x96, 0x1e, 0x83, 0xa7,
+ 0xc5, 0x7e, 0xc2, 0x1b, 0xc0, 0xc1, 0x9d, 0x97,
+ 0x9f, 0x1f, 0x92, 0x85, 0x9e, 0x77, 0x99, 0x94,
+ 0x9d, 0x96, 0x9c, 0x99, 0x9a, 0x9f, 0x8, 0x99,
+ 0x9e, 0x93, 0x9c, 0x98, 0x1a, 0x90, 0x85, 0x91,
+ 0x83, 0x90, 0x1e, 0x98, 0x95, 0x9c, 0x9f, 0x93,
+ 0x99, 0x8, 0x90, 0x83, 0x8e, 0x7d, 0x78, 0x1a,
+ 0x2b, 0xfb, 0x13, 0x3b, 0xfb, 0x35, 0xfb, 0x33,
+ 0xfb, 0x11, 0xdc, 0xe8, 0x9e, 0x8f, 0x9b, 0x8f,
+ 0x93, 0x1e, 0xf7, 0x82, 0xf7, 0x1c, 0x15, 0x8e,
+ 0x86, 0x94, 0x8a, 0x91, 0x8d, 0x96, 0x8d, 0xa6,
+ 0x8c, 0x9b, 0x87, 0x97, 0x88, 0x8f, 0x8e, 0x8f,
+ 0x90, 0xbf, 0xcf, 0x18, 0x90, 0x92, 0x85, 0x8d,
+ 0x81, 0x8d, 0x55, 0x97, 0x66, 0x8f, 0x44, 0x80,
+ 0x82, 0x8a, 0x85, 0x85, 0x8e, 0x87, 0x8, 0xf7,
+ 0x37, 0xfb, 0x5a, 0x15, 0xdc, 0x54, 0x94, 0x85,
+ 0x91, 0x8d, 0x92, 0x90, 0x19, 0xb1, 0xa5, 0x9e,
+ 0x9f, 0x98, 0xb7, 0x8, 0x91, 0x8d, 0x86, 0x90,
+ 0x82, 0x1b, 0x13, 0xd7, 0x58, 0xfb, 0x10, 0x90,
+ 0x5, 0x81, 0x87, 0x87, 0x87, 0x1f, 0x8a, 0x83,
+ 0x82, 0x7d, 0x7e, 0x82, 0x82, 0x86, 0x8e, 0x87,
+ 0x91, 0x87, 0x8, 0xfb, 0x31, 0xc3, 0x15, 0x13,
+ 0xcf, 0x58, 0x72, 0xad, 0x76, 0xb4, 0xb4, 0xad,
+ 0xa0, 0xa4, 0xa4, 0x69, 0xa0, 0x62, 0x62, 0x69,
+ 0x76, 0x72, 0x1e, 0x2f, 0xfb, 0xc, 0x15, 0x93,
+ 0x87, 0x95, 0x8b, 0x8f, 0x8f, 0xd6, 0xc8, 0x18,
+ 0x91, 0x90, 0x87, 0x8f, 0x85, 0x8e, 0x82, 0x90,
+ 0x7b, 0x98, 0x87, 0x95, 0x88, 0x93, 0x85, 0x8c,
+ 0x82, 0x8a, 0xfb, 0xc, 0x7f, 0x18, 0x7e, 0x8a,
+ 0xe0, 0x31, 0x8d, 0x85, 0x9a, 0x69, 0x46, 0xcb,
+ 0xc1, 0x6d, 0x8, 0xe, 0xef, 0xf7, 0x2c, 0x76,
+ 0xd1, 0xa5, 0xf7, 0x3d, 0xa5, 0x78, 0xa4, 0xbd,
+ 0xa3, 0x90, 0xa4, 0x8f, 0x77, 0x12, 0x9f, 0xa4,
+ 0x13, 0xed, 0xc2, 0xf7, 0x57, 0x15, 0xf7, 0x1f,
+ 0x98, 0xf1, 0x5c, 0xde, 0x84, 0xda, 0x74, 0xad,
+ 0x9b, 0x9e, 0xa4, 0xb6, 0x96, 0xab, 0xc5, 0xc8,
+ 0x93, 0xb2, 0xc6, 0x5, 0xb3, 0x7, 0x5d, 0xc0,
+ 0xf7, 0x7, 0x8f, 0xf7, 0x5, 0x91, 0x5, 0xa4,
+ 0x8c, 0x9f, 0x9f, 0xa2, 0x1a, 0xa3, 0x74, 0x9e,
+ 0x6a, 0x8c, 0x1e, 0xfb, 0xf7, 0x91, 0x73, 0xa3,
+ 0x5, 0x13, 0xeb, 0xfb, 0x46, 0x92, 0xfb, 0xe,
+ 0xfb, 0xa, 0xfb, 0x13, 0x90, 0x5, 0x75, 0x69,
+ 0x82, 0x66, 0x65, 0x1a, 0x8c, 0x62, 0x97, 0x61,
+ 0xa1, 0x67, 0x8, 0xf7, 0xe5, 0xf7, 0x16, 0x15,
+ 0x87, 0xa1, 0x90, 0xa3, 0xa8, 0x90, 0xdb, 0x75,
+ 0x18, 0xf7, 0x5, 0x7f, 0x8d, 0x95, 0x57, 0xa6,
+ 0x95, 0x95, 0x89, 0xa2, 0x86, 0x95, 0x19, 0x56,
+ 0xc5, 0xf7, 0xe5, 0x88, 0x5, 0xa2, 0x97, 0x81,
+ 0x7e, 0x7f, 0x83, 0x81, 0x75, 0x8a, 0x1f, 0x25,
+ 0x86, 0xfb, 0x32, 0x84, 0xcb, 0x3b, 0x5, 0x74,
+ 0x7, 0x6e, 0x5f, 0x4f, 0x83, 0x5, 0xfb, 0x46,
+ 0x74, 0x15, 0x78, 0xa2, 0x78, 0xab, 0xa9, 0x9a,
+ 0xf7, 0x45, 0x51, 0x18, 0x72, 0x5a, 0x6e, 0x85,
+ 0x5, 0xfc, 0x4c, 0xa3, 0x15, 0x7b, 0xa8, 0x83,
+ 0xab, 0xaa, 0x1a, 0xaa, 0x91, 0xa9, 0x98, 0xa3,
+ 0x1e, 0xf7, 0x10, 0x85, 0xf7, 0xe, 0xf7, 0xa,
+ 0xf7, 0x35, 0x83, 0xdf, 0x32, 0x90, 0x83, 0x89,
+ 0x7b, 0x87, 0x89, 0x19, 0x7f, 0x81, 0x7d, 0x8b,
+ 0x78, 0x8f, 0x37, 0xc5, 0x18, 0x95, 0xaf, 0x7c,
+ 0x8f, 0x82, 0x63, 0x55, 0x7c, 0x8f, 0x7c, 0x5,
+ 0x13, 0xdd, 0xc4, 0x9d, 0xdd, 0x50, 0x3f, 0xa0,
+ 0x6d, 0x88, 0x77, 0x73, 0x8c, 0x6f, 0x19, 0x60,
+ 0x6e, 0x5e, 0x84, 0x57, 0x95, 0x89, 0x7c, 0x18,
+ 0xb7, 0x83, 0xb7, 0x8e, 0xb3, 0x9f, 0x81, 0x78,
+ 0x92, 0x6f, 0xa0, 0x72, 0x72, 0x7b, 0x90, 0x75,
+ 0x98, 0x78, 0x46, 0x91, 0x18, 0x23, 0xba, 0x5,
+ 0xf7, 0x59, 0x51, 0x15, 0x7d, 0x99, 0x7a, 0xa7,
+ 0xa4, 0x96, 0xf1, 0x63, 0x18, 0x7a, 0x77, 0x78,
+ 0x81, 0x5, 0xe, 0x7d, 0xae, 0xe5, 0xab, 0xf7,
+ 0xe3, 0x9c, 0xf7, 0x43, 0x4c, 0xa, 0xf7, 0xb2,
+ 0xe7, 0xf7, 0xa3, 0xae, 0x17, 0xae, 0xf7, 0xee,
+ 0x37, 0xa, 0x13, 0x6c, 0x33, 0xa, 0x1f, 0xf7,
+ 0x5e, 0x6b, 0xa, 0xf7, 0x9c, 0xa9, 0x6, 0x57,
+ 0x8f, 0x5, 0x65, 0x8e, 0x8d, 0x97, 0xa7, 0x1a,
+ 0xf8, 0x1d, 0x56, 0x7, 0x67, 0x5a, 0x64, 0x6f,
+ 0x4d, 0x82, 0x8, 0x7a, 0xc5, 0x7, 0xb5, 0x89,
+ 0x89, 0x61, 0x1f, 0xfb, 0x8a, 0x7, 0x74, 0x81,
+ 0x79, 0x72, 0x89, 0x1e, 0x5a, 0x87, 0x5, 0xe,
+ 0x7d, 0xae, 0x68, 0xf7, 0x11, 0xf8, 0x70, 0xf7,
+ 0xa, 0x68, 0x4c, 0xa, 0x68, 0xf7, 0x53, 0xf7,
+ 0xdc, 0xf7, 0x5c, 0xfb, 0x51, 0xf7, 0x51, 0x68,
+ 0xae, 0x13, 0x98, 0x80, 0x22, 0xa, 0x13, 0x66,
+ 0x0, 0xf7, 0x30, 0x6b, 0xa, 0xa2, 0x7, 0xd4,
+ 0xbd, 0xc1, 0xc2, 0xb4, 0x1e, 0xc1, 0xb3, 0xcb,
+ 0xbb, 0xd6, 0x1a, 0xb3, 0x7c, 0xb8, 0x5c, 0x7b,
+ 0x6a, 0x7b, 0x78, 0x1e, 0x7f, 0x91, 0x81, 0x7f,
+ 0x1a, 0x71, 0x76, 0x77, 0x71, 0x6c, 0x78, 0xa3,
+ 0xa9, 0xa7, 0x99, 0xa1, 0xa0, 0x9c, 0x1e, 0xa4,
+ 0xaa, 0xb2, 0x91, 0xb1, 0x1b, 0xd8, 0xe2, 0x68,
+ 0x31, 0xfb, 0x2e, 0xfb, 0x6d, 0x9a, 0x58, 0xfb,
+ 0xf, 0x1f, 0xf7, 0x60, 0x6, 0xba, 0x8e, 0xb1,
+ 0xc1, 0x96, 0x1f, 0x13, 0x65, 0x0, 0x99, 0xfb,
+ 0x49, 0x6, 0xe, 0x7d, 0xae, 0xf9, 0x1a, 0x77,
+ 0x1, 0x22, 0xa, 0xf7, 0x8f, 0x91, 0x15, 0x8c,
+ 0xab, 0x8b, 0x9c, 0xc7, 0xae, 0x68, 0x4f, 0x54,
+ 0x66, 0x46, 0x4f, 0x78, 0x6d, 0x9d, 0xa3, 0x1e,
+ 0x96, 0x91, 0x96, 0x96, 0x1a, 0xa7, 0x79, 0xa1,
+ 0x6c, 0x68, 0x77, 0x77, 0x68, 0x68, 0xa5, 0x71,
+ 0xa7, 0x7b, 0x1e, 0x7a, 0xaa, 0xb0, 0x84, 0xad,
+ 0x1b, 0xe6, 0xf3, 0xb9, 0xf4, 0xf7, 0x2, 0xfb,
+ 0x19, 0x92, 0x88, 0x91, 0x1f, 0x89, 0x8f, 0xf4,
+ 0xb1, 0xcd, 0x1a, 0xdc, 0x3c, 0xa0, 0x48, 0x55,
+ 0x2a, 0x79, 0x45, 0x6f, 0x9f, 0x79, 0xa6, 0xa5,
+ 0x9f, 0xa3, 0xa3, 0x92, 0x8a, 0x92, 0x87, 0x91,
+ 0x1e, 0xa2, 0xa8, 0x9d, 0x9d, 0xbb, 0xa0, 0x5d,
+ 0x60, 0x50, 0x5b, 0x6a, 0x54, 0x1e, 0x75, 0x6,
+ 0xe, 0x7d, 0xae, 0xe5, 0xf7, 0x3d, 0x5a, 0xbc,
+ 0xf8, 0x1a, 0x4c, 0xa, 0xf7, 0xc2, 0xe4, 0xf7,
+ 0x96, 0xae, 0x13, 0xbe, 0x22, 0xa, 0xf7, 0x1,
+ 0xfb, 0x7, 0x15, 0xf7, 0x55, 0x78, 0x6, 0x48,
+ 0x7b, 0x8b, 0x6e, 0x88, 0x1e, 0x77, 0x89, 0x5,
+ 0x13, 0xde, 0x6e, 0xf7, 0x71, 0xa8, 0x7, 0x79,
+ 0x8e, 0x5, 0x54, 0x94, 0x91, 0x89, 0xc9, 0x1a,
+ 0x13, 0xbe, 0x9e, 0xee, 0xbc, 0x28, 0xf7, 0xc1,
+ 0x33, 0x7, 0xfb, 0x56, 0xfb, 0xd4, 0x5, 0xce,
+ 0x9e, 0x15, 0xf7, 0x12, 0xf7, 0x63, 0x5, 0xfb,
+ 0x63, 0x7, 0xe, 0x7e, 0xae, 0xdd, 0xaf, 0xf7,
+ 0x6c, 0xb5, 0xdf, 0xe1, 0xf1, 0x4c, 0xa, 0xf7,
+ 0x43, 0xb4, 0xf7, 0x33, 0xf7, 0x6, 0xf7, 0x34,
+ 0xae, 0x17, 0x23, 0xa, 0xae, 0x16, 0x40, 0xa,
+ 0x41, 0xa, 0x1e, 0x13, 0xf3, 0x80, 0x28, 0xa,
+ 0xfb, 0x24, 0xfb, 0x48, 0x1f, 0x13, 0x77, 0x0,
+ 0xfb, 0x47, 0xfb, 0x25, 0xf7, 0x24, 0xf7, 0x48,
+ 0x1f, 0xf7, 0x43, 0x76, 0x15, 0xb4, 0x7a, 0x5,
+ 0xa4, 0x9d, 0xa7, 0xa2, 0xab, 0x1b, 0xc3, 0xa4,
+ 0x56, 0x5a, 0x57, 0x6a, 0x4d, 0x50, 0x79, 0x6b,
+ 0x93, 0xa2, 0x1f, 0x98, 0x95, 0x94, 0x9b, 0x1a,
+ 0xaa, 0x71, 0x9a, 0x6f, 0x6b, 0x79, 0x72, 0x6d,
+ 0x43, 0xef, 0x73, 0xc4, 0xe8, 0xef, 0xc4, 0xf1,
+ 0xe3, 0x3b, 0xba, 0x3b, 0x66, 0x5d, 0x81, 0x72,
+ 0x6d, 0x1e, 0xf7, 0xd, 0x7, 0xe9, 0x88, 0x5,
+ 0xb1, 0xca, 0x86, 0xa4, 0xab, 0x1f, 0x9d, 0x99,
+ 0x9c, 0xb7, 0x90, 0xa3, 0x8, 0x7f, 0x65, 0x63,
+ 0x88, 0x64, 0x1b, 0x51, 0x44, 0x92, 0x98, 0x4d,
+ 0x1f, 0xe, 0x7d, 0xae, 0xf9, 0x1d, 0xae, 0x1,
+ 0x22, 0xa, 0xf7, 0x75, 0x78, 0x15, 0xb7, 0xa8,
+ 0xc5, 0xa9, 0xc0, 0x1b, 0xda, 0xc7, 0x56, 0x39,
+ 0x28, 0x38, 0x4c, 0x2c, 0xfb, 0x1d, 0x4e, 0xf7,
+ 0x1, 0xf7, 0x11, 0xf7, 0x11, 0xce, 0xf7, 0x11,
+ 0xf7, 0x1c, 0xc1, 0xe6, 0x74, 0x47, 0x6e, 0x7b,
+ 0x71, 0x6c, 0x71, 0x77, 0x9e, 0xa5, 0x1f, 0x96,
+ 0x90, 0x98, 0x95, 0x1a, 0xa3, 0x65, 0x96, 0x78,
+ 0x2c, 0x80, 0xfb, 0x9, 0x41, 0x1e, 0x91, 0xfb,
+ 0xe, 0x15, 0x55, 0xb1, 0x58, 0xc6, 0xc6, 0xa4,
+ 0xc4, 0xbf, 0xba, 0x76, 0xc7, 0x52, 0x4c, 0x63,
+ 0x57, 0x50, 0x1e, 0xe, 0x7d, 0xae, 0xf8, 0x6b,
+ 0xe4, 0xe4, 0x4c, 0xa, 0xf7, 0x72, 0xf7, 0x4,
+ 0xfb, 0x4, 0xf7, 0xc, 0xf7, 0xc7, 0xae, 0x13,
+ 0xf6, 0x22, 0xa, 0xf7, 0x27, 0xcd, 0x15, 0x9f,
+ 0x6, 0xb8, 0x9f, 0x8d, 0xae, 0xb2, 0x1b, 0xf7,
+ 0x50, 0x6, 0x20, 0xfb, 0x24, 0x5, 0x67, 0x5c,
+ 0x58, 0x46, 0x4d, 0x1a, 0x65, 0xa1, 0x6f, 0xb3,
+ 0xae, 0xa2, 0xa2, 0xaf, 0x1e, 0x13, 0xfa, 0xa2,
+ 0x83, 0xa2, 0xa2, 0x1a, 0xce, 0xbb, 0xd0, 0xab,
+ 0xc2, 0x1e, 0xe7, 0xf7, 0x32, 0x5, 0xfb, 0xf6,
+ 0x6, 0xe, 0x7d, 0xae, 0xde, 0xb1, 0xf8, 0x30,
+ 0xad, 0xdd, 0x4c, 0xa, 0xf7, 0x2e, 0xc5, 0x71,
+ 0xd9, 0xf7, 0x1d, 0xbd, 0x60, 0xe3, 0xf7, 0x2d,
+ 0xae, 0x13, 0xfc, 0xc0, 0xf7, 0xd7, 0xf7, 0xfe,
+ 0x15, 0x55, 0x6c, 0x5e, 0x6a, 0x46, 0x1a, 0x2f,
+ 0xde, 0x6a, 0xd9, 0xe3, 0xe8, 0xc0, 0xeb, 0xd5,
+ 0x5c, 0xaf, 0x4e, 0xa9, 0x1e, 0x13, 0xbb, 0x40,
+ 0xb1, 0xa4, 0xa4, 0xa4, 0xbd, 0x1a, 0xd1, 0x49,
+ 0xa4, 0x51, 0x1e, 0x42, 0x47, 0x5d, 0x3c, 0x5a,
+ 0xa8, 0x6e, 0xb1, 0x74, 0x1f, 0xf0, 0xbb, 0x15,
+ 0x5b, 0xa4, 0x61, 0x9d, 0xb4, 0x1a, 0xae, 0xa8,
+ 0xa4, 0xad, 0x1e, 0x13, 0x99, 0x40, 0xb4, 0xac,
+ 0x74, 0x60, 0x69, 0x79, 0x6f, 0x6e, 0x7b, 0x1f,
+ 0x48, 0x48, 0x15, 0x13, 0xdc, 0xc0, 0xa0, 0x7f,
+ 0x9e, 0x81, 0x9a, 0x81, 0x8, 0xb8, 0x6f, 0xa0,
+ 0x76, 0x6a, 0x1a, 0x54, 0x62, 0x6b, 0x57, 0x53,
+ 0x5c, 0xb6, 0xc2, 0xb4, 0xb2, 0xb5, 0xaf, 0x9f,
+ 0x1e, 0xfb, 0xd6, 0x8e, 0x37, 0xa, 0x13, 0x8,
+ 0x0, 0x33, 0xa, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+ 0xac, 0x6a, 0xf7, 0x26, 0xb4, 0xba, 0x98, 0x77,
+ 0xf7, 0x72, 0xae, 0xdd, 0x4c, 0xa, 0xf7, 0x2d,
+ 0xdc, 0x4c, 0xe8, 0xf7, 0x24, 0xf7, 0x1, 0x23,
+ 0xf3, 0x25, 0xf1, 0xf7, 0x18, 0xae, 0x13, 0xcf,
+ 0x94, 0x2e, 0xa, 0xf7, 0x5b, 0xf7, 0x5a, 0x25,
+ 0xa, 0xfb, 0x5a, 0xfb, 0x5b, 0x2a, 0xa, 0xae,
+ 0x16, 0x40, 0xa, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+ 0x47, 0x2f, 0xa, 0xfb, 0x47, 0xfb, 0x48, 0x36,
+ 0xa, 0x1e, 0xf8, 0x31, 0x90, 0x15, 0x13, 0xcf,
+ 0x4c, 0x8d, 0x6, 0x22, 0x8e, 0x7a, 0xfb, 0x1,
+ 0x32, 0x1b, 0x77, 0x69, 0x95, 0xa3, 0x1f, 0x94,
+ 0x91, 0x96, 0x98, 0x1a, 0x13, 0xb7, 0x54, 0xa4,
+ 0x78, 0xa0, 0x72, 0x6d, 0x78, 0x72, 0x6e, 0x48,
+ 0xe2, 0x72, 0xc1, 0xcd, 0xbd, 0x9b, 0xc4, 0xb2,
+ 0x1e, 0xae, 0xbf, 0x9a, 0xce, 0xc9, 0x1a, 0xf7,
+ 0xa, 0x49, 0xf7, 0x4, 0xfb, 0x16, 0x1e, 0x13,
+ 0xd7, 0xa4, 0x2a, 0x44, 0x4f, 0x23, 0x39, 0xbc,
+ 0x58, 0xdb, 0x1f, 0x13, 0xcf, 0x94, 0xbf, 0xbc,
+ 0x9c, 0xb6, 0xa9, 0x1f, 0xfb, 0x47, 0xe6, 0x15,
+ 0xc2, 0xa3, 0xc3, 0xca, 0x1e, 0x13, 0xd7, 0xa4,
+ 0xc1, 0xac, 0x57, 0x5a, 0x53, 0x70, 0x51, 0x4c,
+ 0x50, 0x72, 0xc0, 0xbe, 0x1f, 0xe, 0x7d, 0xae,
+ 0xe4, 0xaf, 0xf7, 0xee, 0x9b, 0xb0, 0xad, 0xe6,
+ 0x4c, 0xa, 0xf7, 0x42, 0xdf, 0xba, 0xeb, 0xf2,
+ 0xeb, 0xbc, 0xae, 0x17, 0xf8, 0xb, 0xf7, 0xea,
+ 0x15, 0x13, 0xff, 0xc0, 0x22, 0x9d, 0xfb, 0x13,
+ 0xf7, 0x15, 0xf7, 0x16, 0x9d, 0xf7, 0x10, 0xf7,
+ 0x0, 0xe9, 0x7a, 0xf7, 0x23, 0xfb, 0x11, 0xfb,
+ 0x1b, 0x79, 0xfb, 0x16, 0x20, 0x1e, 0xeb, 0x16,
+ 0xb3, 0x8a, 0xf7, 0x37, 0xc0, 0xc1, 0x88, 0xfb,
+ 0x38, 0x64, 0x66, 0x8c, 0xfb, 0x33, 0x57, 0x55,
+ 0x8d, 0xf7, 0x32, 0xb1, 0x1e, 0xfc, 0x48, 0x8f,
+ 0x21, 0xa, 0xf7, 0x8, 0x6b, 0xa, 0xf7, 0x5c,
+ 0xad, 0x6, 0x80, 0x8c, 0x5, 0x5a, 0x8f, 0x8d,
+ 0x91, 0x9d, 0x1a, 0xf8, 0x2b, 0x54, 0x7, 0x6f,
+ 0x5b, 0x69, 0x75, 0x58, 0x88, 0x8, 0x7b, 0xa5,
+ 0x7, 0x13, 0x2, 0x0, 0xab, 0xa5, 0x8f, 0x64,
+ 0x1f, 0xfb, 0xaf, 0x7, 0x76, 0x83, 0x86, 0x78,
+ 0x8a, 0x1e, 0x6c, 0x89, 0x5, 0xe, 0xfb, 0xb6,
+ 0x58, 0xa3, 0xb8, 0x76, 0xf7, 0x7c, 0x9a, 0x92,
+ 0x9a, 0xf7, 0xa, 0x9a, 0xb6, 0xa3, 0xf7, 0x57,
+ 0xa4, 0x86, 0xa3, 0x12, 0xf7, 0x1e, 0xa4, 0xc2,
+ 0x99, 0xae, 0x9a, 0x8b, 0x9b, 0xa1, 0x9b, 0xa9,
+ 0xa4, 0xac, 0xa4, 0x80, 0xa3, 0x13, 0xfd, 0xfe,
+ 0xea, 0x88, 0x15, 0x6a, 0xa4, 0xae, 0x7c, 0xaf,
+ 0x1b, 0xab, 0xab, 0x95, 0x9e, 0xa6, 0x1f, 0xbc,
+ 0xf7, 0x1e, 0xb1, 0xb1, 0xb7, 0xd4, 0xbb, 0xa6,
+ 0x90, 0xb2, 0x75, 0xb6, 0x8f, 0xb3, 0x90, 0xc4,
+ 0x6e, 0xaa, 0x6c, 0x8f, 0x74, 0x7f, 0xa1, 0xf7,
+ 0x5b, 0x5, 0xab, 0x8f, 0x76, 0x9d, 0x74, 0x1b,
+ 0x77, 0x76, 0x7f, 0x70, 0x84, 0x1f, 0x5b, 0xfb,
+ 0x56, 0x71, 0xe6, 0x79, 0xdb, 0x5, 0x13, 0xfe,
+ 0xfd, 0xa4, 0x85, 0x82, 0x9d, 0x6d, 0x1b, 0x6b,
+ 0x87, 0x6a, 0x7a, 0x8c, 0x1f, 0x98, 0xfb, 0x8b,
+ 0x74, 0x88, 0x72, 0x74, 0x78, 0xfb, 0x21, 0xba,
+ 0xfb, 0x7, 0x5, 0xf7, 0x68, 0xf7, 0x29, 0x15,
+ 0xba, 0xaa, 0x75, 0x7d, 0xa9, 0x9e, 0xa4, 0x95,
+ 0x18, 0x94, 0x9a, 0x9a, 0x6e, 0x88, 0x78, 0x81,
+ 0x86, 0x65, 0x7e, 0x5b, 0x76, 0x86, 0xa5, 0x19,
+ 0xfb, 0x6b, 0xfb, 0x92, 0x15, 0xa9, 0xf6, 0x5a,
+ 0xf7, 0x8, 0x9c, 0xf7, 0x12, 0x99, 0x97, 0xf7,
+ 0x1a, 0xa0, 0x98, 0x89, 0x93, 0x7d, 0x81, 0x7d,
+ 0x19, 0x79, 0x72, 0x61, 0x7b, 0x6e, 0x80, 0x60,
+ 0xa2, 0x18, 0x85, 0x7d, 0xb3, 0x77, 0xa2, 0x72,
+ 0x94, 0x6c, 0x91, 0x61, 0x19, 0x99, 0x8e, 0x85,
+ 0xb3, 0x85, 0xa8, 0x77, 0xa5, 0x19, 0xaa, 0x96,
+ 0xb3, 0x9b, 0x9e, 0xa5, 0x8, 0x91, 0x93, 0x8d,
+ 0x95, 0x93, 0x1a, 0x9a, 0x80, 0x98, 0x77, 0x8c,
+ 0x1e, 0x29, 0x7c, 0x7e, 0xf7, 0x92, 0x5, 0x9d,
+ 0x8a, 0x91, 0x90, 0x90, 0x1b, 0x97, 0x8f, 0x88,
+ 0x77, 0x8f, 0x1f, 0x9d, 0x3b, 0xb1, 0xfb, 0x19,
+ 0x5, 0xa6, 0x6, 0xc6, 0xf7, 0x80, 0x5, 0x13,
+ 0xfd, 0xfe, 0x98, 0x8e, 0x94, 0x92, 0x94, 0x1b,
+ 0x95, 0x94, 0x83, 0x7c, 0x89, 0x1f, 0x70, 0xfb,
+ 0x8a, 0xc5, 0xaa, 0x99, 0x89, 0x9b, 0x79, 0x86,
+ 0x5d, 0x86, 0x61, 0x7e, 0x76, 0xfb, 0x0, 0x5b,
+ 0x85, 0x8c, 0x85, 0x8e, 0x89, 0x91, 0x19, 0x85,
+ 0x9d, 0xb5, 0xa2, 0x9c, 0x98, 0xb0, 0xcb, 0x18,
+ 0x7f, 0x91, 0x56, 0x5c, 0x9b, 0x7c, 0x5, 0x81,
+ 0x84, 0x5c, 0x71, 0x72, 0x1a, 0x88, 0x8b, 0x88,
+ 0x8c, 0x88, 0x1e, 0x80, 0x8f, 0x99, 0x82, 0x98,
+ 0x1b, 0xa1, 0x93, 0x5, 0x76, 0x8c, 0x98, 0x82,
+ 0x9d, 0x1b, 0x95, 0x97, 0x8d, 0x8f, 0x98, 0x1f,
+ 0x64, 0x49, 0x63, 0x65, 0x5c, 0xfb, 0x1e, 0x5,
+ 0x7f, 0x78, 0x71, 0x83, 0x72, 0x1b, 0x70, 0x71,
+ 0x94, 0x9f, 0x7a, 0x1f, 0xe, 0x7d, 0xef, 0xf8,
+ 0x9c, 0xee, 0x1, 0xf7, 0xf4, 0xf0, 0x26, 0xa,
+ 0xf7, 0x74, 0xfb, 0x98, 0x15, 0xac, 0x7, 0xc1,
+ 0x8e, 0xad, 0x8d, 0x91, 0xad, 0x8a, 0xa6, 0x19,
+ 0xf7, 0x98, 0x7, 0xb7, 0x8c, 0x8e, 0x5e, 0x1e,
+ 0x4a, 0x9f, 0x6, 0xd0, 0x95, 0xa4, 0xa8, 0xb2,
+ 0xc2, 0x8, 0xd8, 0xfc, 0x39, 0x6, 0x4a, 0x9b,
+ 0x90, 0xc9, 0x86, 0x1e, 0x9f, 0x8a, 0x5, 0x6a,
+ 0x7, 0xe, 0x7d, 0xef, 0xf8, 0xa3, 0xe7, 0x12,
+ 0xae, 0xf7, 0x43, 0xfb, 0x43, 0xf7, 0x58, 0xf7,
+ 0xe8, 0xf7, 0x4b, 0xfb, 0x3f, 0xf7, 0x3f, 0x13,
+ 0xe8, 0x23, 0xa, 0xf7, 0x43, 0xfb, 0x98, 0x15,
+ 0x89, 0xf6, 0xc2, 0xc6, 0xc8, 0xb8, 0x8, 0xc7,
+ 0xb8, 0xd1, 0xc0, 0xde, 0x1a, 0xb7, 0x7c, 0xbd,
+ 0x56, 0x7b, 0x65, 0x79, 0x77, 0x1e, 0x7e, 0x92,
+ 0x80, 0x7d, 0x1a, 0x6e, 0x73, 0x74, 0x6e, 0x1e,
+ 0x13, 0xd8, 0x69, 0x76, 0xa6, 0xac, 0xd9, 0xe3,
+ 0xaa, 0xcc, 0xe2, 0xef, 0x67, 0x25, 0x2f, 0x43,
+ 0x63, 0x42, 0x68, 0x1f, 0x54, 0x72, 0x42, 0x63,
+ 0x74, 0x51, 0x8, 0xf7, 0x75, 0x6, 0x9b, 0x8a,
+ 0x9c, 0x8b, 0x92, 0x9c, 0xa4, 0xe0, 0x18, 0x13,
+ 0xe4, 0x9d, 0xfb, 0x5c, 0x6, 0xe, 0x7d, 0xe6,
+ 0xf7, 0xa9, 0x77, 0xba, 0xde, 0x38, 0xf7, 0x55,
+ 0xb2, 0xe7, 0x12, 0xae, 0xf7, 0x3c, 0xfb, 0x3c,
+ 0xf7, 0x53, 0xe7, 0xf7, 0x2e, 0xfb, 0x24, 0xf7,
+ 0xf, 0xf2, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, 0x37,
+ 0x13, 0xdc, 0xc0, 0x23, 0xa, 0xf7, 0xaa, 0x94,
+ 0x15, 0xa5, 0xa3, 0x7, 0xc9, 0xbf, 0xb4, 0xcc,
+ 0xbb, 0x74, 0xb2, 0x55, 0x69, 0x7a, 0x76, 0x82,
+ 0x1f, 0x83, 0x90, 0x8a, 0x78, 0x1a, 0x13, 0xea,
+ 0xc0, 0x70, 0x74, 0x72, 0x70, 0x6c, 0x76, 0xa0,
+ 0xa9, 0xd8, 0xf6, 0xa0, 0xc6, 0xd5, 0xe3, 0x74,
+ 0x31, 0x4a, 0x61, 0x6d, 0x53, 0x7a, 0x1e, 0x88,
+ 0x8a, 0x7e, 0x89, 0x87, 0x1a, 0x85, 0x93, 0x8a,
+ 0x8f, 0x99, 0xb5, 0x7e, 0x85, 0x97, 0x1e, 0x13,
+ 0xdd, 0x20, 0xb8, 0x76, 0xa5, 0x62, 0x5a, 0x1a,
+ 0xfb, 0x5, 0xfb, 0x5, 0x55, 0x28, 0x65, 0x64,
+ 0x91, 0x9c, 0x69, 0x1e, 0x6a, 0x9c, 0x6b, 0xaa,
+ 0xb4, 0x1a, 0xb1, 0xa0, 0xa1, 0xb3, 0xac, 0xa0,
+ 0x74, 0x6b, 0x1e, 0x7e, 0x84, 0x80, 0x7e, 0x1a,
+ 0x71, 0xac, 0x82, 0xa0, 0xcd, 0xb4, 0xcd, 0xc8,
+ 0xcd, 0x65, 0xb2, 0x48, 0x79, 0x79, 0x90, 0x87,
+ 0x79, 0x1e, 0xe, 0x7d, 0xef, 0x8b, 0xd3, 0xf8,
+ 0x54, 0xee, 0x12, 0xae, 0xf8, 0xb3, 0xfb, 0x2,
+ 0xf7, 0xb2, 0x13, 0xf0, 0x29, 0xa, 0x1e, 0x13,
+ 0xe8, 0x24, 0xa, 0x1f, 0x13, 0xf0, 0x27, 0xa,
+ 0x1f, 0xf7, 0xd, 0xfb, 0x13, 0x15, 0xac, 0x7,
+ 0xf7, 0x6d, 0xf7, 0xf6, 0x5, 0x13, 0xe8, 0xea,
+ 0xfb, 0xe1, 0x6, 0x13, 0xf0, 0xf7, 0x2, 0x55,
+ 0x6, 0x13, 0xe8, 0xfb, 0x2, 0x4c, 0x6, 0x78,
+ 0x93, 0x84, 0x9b, 0x88, 0x1e, 0xbe, 0x82, 0x5,
+ 0x6b, 0xfb, 0xa0, 0xab, 0x7, 0xd2, 0x94, 0x5,
+ 0xa0, 0x8e, 0x8e, 0xa0, 0x92, 0x1a, 0xc8, 0x7,
+ 0xfb, 0x2b, 0xc1, 0x15, 0xf7, 0x2b, 0xf7, 0x97,
+ 0x6, 0xe, 0x7b, 0xe7, 0x31, 0xe7, 0xf7, 0xab,
+ 0x77, 0xce, 0xe8, 0xe9, 0xf7, 0x6, 0x12, 0xae,
+ 0xf7, 0x2e, 0xfb, 0x2e, 0xf7, 0x57, 0xd5, 0xf7,
+ 0x26, 0xf7, 0x12, 0xf7, 0x46, 0x13, 0xbd, 0x80,
+ 0x3b, 0xa, 0x13, 0x7d, 0x80, 0x2c, 0xa, 0x13,
+ 0xbb, 0x80, 0xf7, 0x57, 0x74, 0x15, 0x8c, 0xf7,
+ 0xb7, 0x5, 0x7d, 0xcc, 0xda, 0x82, 0xc8, 0x1b,
+ 0xb8, 0xb9, 0x8e, 0x99, 0xb6, 0x1f, 0x85, 0x72,
+ 0x79, 0x58, 0x78, 0x7d, 0x8, 0x6f, 0x66, 0x47,
+ 0x90, 0x5f, 0x1b, 0x23, 0x8f, 0x5, 0xfb, 0x1a,
+ 0x7, 0xa7, 0xac, 0xbf, 0x96, 0xb4, 0x1b, 0xb4,
+ 0xb4, 0x82, 0x72, 0xac, 0x1f, 0xb0, 0x71, 0xa3,
+ 0x61, 0x5d, 0x1a, 0x13, 0x7d, 0x80, 0xfb, 0x7,
+ 0xfb, 0x2, 0x4c, 0x23, 0x4d, 0xfb, 0x3, 0xa6,
+ 0xdb, 0xac, 0x9f, 0xa7, 0xaf, 0xaa, 0xa7, 0x7a,
+ 0x69, 0x1e, 0x78, 0x81, 0x81, 0x7e, 0x1a, 0x71,
+ 0xae, 0x82, 0x9f, 0xcc, 0xaf, 0xd0, 0xc4, 0xc1,
+ 0x70, 0xc6, 0x4d, 0x67, 0x6d, 0x71, 0x70, 0x76,
+ 0x1e, 0xe, 0x7d, 0xe7, 0xf7, 0xa9, 0x77, 0xd3,
+ 0xb9, 0x5d, 0xf7, 0x3f, 0xae, 0xe7, 0x12, 0xae,
+ 0xf7, 0x29, 0xf7, 0x7, 0xf7, 0x55, 0x6a, 0xf2,
+ 0x8b, 0xf7, 0x54, 0xfb, 0x3a, 0xf7, 0x3a, 0x13,
+ 0xee, 0x40, 0x23, 0xa, 0xf7, 0x97, 0x76, 0x15,
+ 0xbc, 0xaa, 0xc3, 0xac, 0xc5, 0x1b, 0xe3, 0xc8,
+ 0x49, 0x31, 0xfb, 0x3, 0x34, 0x4d, 0x22, 0x49,
+ 0x52, 0xa0, 0xc0, 0x63, 0x1f, 0x65, 0xbe, 0x80,
+ 0xcc, 0xca, 0x1a, 0xcb, 0x93, 0xcf, 0xad, 0xc2,
+ 0x1e, 0xcf, 0xb5, 0xc4, 0xa6, 0xda, 0x1b, 0x13,
+ 0xed, 0x80, 0xc7, 0xed, 0x72, 0x40, 0x6b, 0x7a,
+ 0x6f, 0x68, 0x6e, 0x75, 0x9f, 0xa8, 0x1f, 0x98,
+ 0x91, 0x99, 0x96, 0x1a, 0x13, 0xde, 0x40, 0xa5,
+ 0x63, 0x97, 0x76, 0x56, 0x7c, 0x6d, 0x5e, 0x78,
+ 0x1e, 0x7c, 0x5a, 0x8b, 0x45, 0x83, 0x50, 0x8,
+ 0x90, 0x33, 0x15, 0x4e, 0xa6, 0x4f, 0xd1, 0xcd,
+ 0xa9, 0xcb, 0xc5, 0xbf, 0x72, 0xcc, 0x4e, 0x48,
+ 0x63, 0x55, 0x4b, 0x1e, 0xe, 0x7d, 0xe8, 0xf8,
+ 0xa4, 0xed, 0x1, 0xae, 0xf7, 0x38, 0x26, 0xa,
+ 0xf7, 0x38, 0xd5, 0x15, 0x8c, 0xf7, 0x4f, 0x5,
+ 0xf8, 0x1e, 0x6, 0x25, 0xfb, 0x44, 0x5, 0x68,
+ 0x4e, 0x56, 0x3f, 0x42, 0x71, 0x94, 0x6c, 0x77,
+ 0x1a, 0x64, 0x72, 0x71, 0x64, 0x5f, 0x73, 0xaa,
+ 0xb5, 0xcf, 0xc2, 0xd7, 0xb4, 0xbf, 0x1e, 0xf7,
+ 0xa, 0xf7, 0x34, 0x5, 0xfb, 0x6b, 0x6, 0x76,
+ 0x80, 0x84, 0x71, 0x84, 0x1f, 0x79, 0x54, 0x5,
+ 0xe, 0x7d, 0xe7, 0xf8, 0xab, 0xe7, 0x12, 0xae,
+ 0xf7, 0x3f, 0xd7, 0xf7, 0x61, 0xfb, 0x34, 0xf7,
+ 0x2c, 0xf4, 0xf7, 0x3e, 0x13, 0xec, 0x23, 0xa,
+ 0xf7, 0xad, 0x9d, 0x15, 0x60, 0xa5, 0x75, 0xab,
+ 0xc2, 0x1a, 0xe1, 0xcd, 0xbd, 0xdb, 0xcb, 0xd5,
+ 0x6c, 0x3e, 0x53, 0x6f, 0x73, 0x61, 0x70, 0x1e,
+ 0xce, 0x6a, 0xbf, 0x63, 0x3a, 0x1a, 0x20, 0x29,
+ 0x50, 0x2a, 0x35, 0x2a, 0xb0, 0xf1, 0xd7, 0xbc,
+ 0xb0, 0xc8, 0xad, 0x1e, 0xf7, 0x4, 0xbf, 0x15,
+ 0xaa, 0x9e, 0x9f, 0xaa, 0xb0, 0x1a, 0xbb, 0x66,
+ 0xa5, 0x5e, 0x66, 0x6a, 0x66, 0x65, 0x5f, 0xb7,
+ 0x7f, 0xac, 0x7a, 0x1e, 0x58, 0x34, 0x15, 0x13,
+ 0xf4, 0x61, 0x75, 0x6e, 0x5d, 0x5b, 0x1a, 0x50,
+ 0xb5, 0x5c, 0xc7, 0xc4, 0xb9, 0xaf, 0xc7, 0xbc,
+ 0x60, 0xa5, 0x66, 0xa0, 0x1e, 0xe, 0x7d, 0xe7,
+ 0xb0, 0xf7, 0x3e, 0x5e, 0xb8, 0xf7, 0xdc, 0xe7,
+ 0x12, 0xae, 0xf7, 0x36, 0xfb, 0x36, 0xf7, 0x51,
+ 0xd1, 0xf7, 0x55, 0xf7, 0x6, 0xf7, 0x2d, 0x13,
+ 0xbb, 0x23, 0xa, 0xf8, 0x5e, 0x90, 0x15, 0x5e,
+ 0x6a, 0x54, 0x76, 0x54, 0x1b, 0x30, 0x4d, 0xd3,
+ 0xe9, 0xf7, 0x0, 0xe4, 0xc1, 0xf3, 0xf7, 0x27,
+ 0xcb, 0xfb, 0xf, 0xfb, 0x1c, 0x47, 0x82, 0x4a,
+ 0x65, 0x52, 0x1f, 0x49, 0x61, 0x51, 0x77, 0x3f,
+ 0x1b, 0x13, 0xb7, 0x4f, 0x2d, 0xa7, 0xd5, 0xab,
+ 0xa0, 0xa7, 0xad, 0xa6, 0xa0, 0x73, 0x70, 0x1f,
+ 0x7d, 0x85, 0x7f, 0x81, 0x1a, 0x13, 0xdb, 0x70,
+ 0xab, 0x80, 0xa0, 0xee, 0x9f, 0xf7, 0x1b, 0xd7,
+ 0x1e, 0xfb, 0x5b, 0xf7, 0x13, 0x15, 0x52, 0xa7,
+ 0x50, 0xcb, 0xd1, 0xaa, 0xcb, 0xc8, 0xc2, 0x66,
+ 0xc5, 0x4f, 0x45, 0x71, 0x4e, 0x4e, 0x1e, 0xe,
+ 0x7d, 0xe7, 0x2f, 0xef, 0xf8, 0x4c, 0xf7, 0x47,
+ 0x28, 0xee, 0x2f, 0xe7, 0x12, 0xae, 0xf7, 0x55,
+ 0xe8, 0xc4, 0xf1, 0xf7, 0x5, 0xeb, 0xcc, 0x13,
+ 0x67, 0x80, 0x23, 0xa, 0xf7, 0x15, 0xfb, 0x98,
+ 0x15, 0xb0, 0x7, 0xad, 0x8e, 0x5, 0xb0, 0x8d,
+ 0x84, 0xa1, 0xa9, 0x1a, 0xf7, 0xb5, 0x7, 0xb5,
+ 0x72, 0x87, 0x67, 0x1e, 0x6b, 0x9e, 0x6, 0x13,
+ 0x57, 0x80, 0xc4, 0x8e, 0x9b, 0xa3, 0xaa, 0xc0,
+ 0x8, 0xdd, 0xfc, 0x3e, 0x6, 0x56, 0x88, 0x8e,
+ 0xc2, 0x86, 0x1e, 0x98, 0x89, 0x5, 0x66, 0x7,
+ 0x83, 0xf7, 0x93, 0x15, 0x13, 0x8f, 0x80, 0xf7,
+ 0xa, 0x93, 0xf7, 0x2e, 0xf7, 0x2a, 0xf7, 0x1e,
+ 0x9a, 0xfb, 0x3c, 0x23, 0xfb, 0x0, 0x7e, 0xfb,
+ 0x2f, 0xfb, 0x1f, 0xfb, 0x29, 0x81, 0xf7, 0x22,
+ 0xf7, 0xd, 0x1e, 0xf1, 0x16, 0x60, 0x89, 0xfb,
+ 0x48, 0xc6, 0xc4, 0x8a, 0xf7, 0x4b, 0xb3, 0x1e,
+ 0xf7, 0x45, 0x80, 0x81, 0xc4, 0x67, 0x1b, 0x54,
+ 0x8a, 0xfb, 0x57, 0x64, 0x1f, 0xe, 0x9b, 0xae,
+ 0x76, 0xc3, 0xa4, 0x86, 0xa5, 0xab, 0x9a, 0x97,
+ 0xa3, 0x96, 0x9d, 0xf7, 0x6, 0xf7, 0x3d, 0x67,
+ 0xa5, 0x79, 0xa8, 0x70, 0xf7, 0x32, 0x12, 0x9e,
+ 0xa4, 0xf8, 0x3b, 0x9a, 0xf7, 0x7b, 0x9b, 0xb3,
+ 0xa4, 0x13, 0xbc, 0xbc, 0xcf, 0xb5, 0x15, 0xf7,
+ 0x1f, 0xc2, 0x5, 0x13, 0xdc, 0xbc, 0x80, 0xaa,
+ 0xb3, 0x7b, 0xac, 0x1b, 0xb5, 0xb5, 0x9d, 0xa2,
+ 0xb4, 0x1f, 0xd0, 0x70, 0xc9, 0xad, 0xc4, 0x97,
+ 0xa6, 0x67, 0xae, 0x78, 0xb6, 0xa9, 0x19, 0x8c,
+ 0x8e, 0x8e, 0x86, 0xdc, 0x32, 0x94, 0x91, 0x68,
+ 0xf7, 0x5, 0x73, 0xb5, 0x9a, 0x8e, 0x98, 0x94,
+ 0x90, 0x9c, 0x19, 0x86, 0xf7, 0x24, 0xfb, 0xc,
+ 0xf7, 0x18, 0x54, 0x9f, 0x61, 0x8e, 0x5, 0x13,
+ 0xbc, 0x7c, 0x3a, 0xf7, 0x20, 0x5, 0x40, 0x6,
+ 0xda, 0xfb, 0x1b, 0x25, 0x91, 0x58, 0x7a, 0xfb,
+ 0x87, 0xfb, 0x34, 0x58, 0x80, 0x5, 0x73, 0x66,
+ 0x83, 0x53, 0x5f, 0x1a, 0x5c, 0x9f, 0x4b, 0xa8,
+ 0x67, 0x1e, 0x13, 0xbe, 0x3c, 0xf8, 0xec, 0xf7,
+ 0xc0, 0x15, 0x3d, 0xf7, 0x1b, 0xa0, 0x8a, 0xba,
+ 0x79, 0xf7, 0x2, 0xfb, 0xc, 0x8e, 0xfb, 0x16,
+ 0x86, 0x82, 0x83, 0x8a, 0x83, 0x8c, 0x19, 0x69,
+ 0xc5, 0x5, 0x94, 0x95, 0x8f, 0x98, 0x97, 0x1a,
+ 0xa2, 0x78, 0x9f, 0x73, 0x8f, 0x1e, 0x59, 0xfb,
+ 0x4b, 0x15, 0x78, 0xd3, 0xb2, 0x93, 0xc3, 0x29,
+ 0x86, 0x7a, 0x6b, 0x79, 0x74, 0xaa, 0x7b, 0xa1,
+ 0x19, 0xfb, 0x20, 0x8c, 0x15, 0x81, 0x93, 0x87,
+ 0x93, 0x92, 0x1a, 0x99, 0x96, 0x97, 0x9e, 0x94,
+ 0x1e, 0x8b, 0xc7, 0x91, 0xa9, 0x90, 0x1e, 0x9e,
+ 0x44, 0x54, 0x7f, 0x5, 0xfc, 0x7a, 0x44, 0x15,
+ 0x75, 0xaf, 0x7d, 0xb0, 0xb7, 0x1a, 0xb8, 0x8e,
+ 0xaf, 0x9e, 0xac, 0x1e, 0xb9, 0x95, 0x5, 0x13,
+ 0xbd, 0x3c, 0xf7, 0x87, 0xf7, 0x36, 0xb8, 0x98,
+ 0xf7, 0x5, 0x85, 0xd5, 0xfb, 0x14, 0x5a, 0x93,
+ 0x39, 0xad, 0x92, 0xac, 0x79, 0x8e, 0x7b, 0x44,
+ 0xfb, 0x24, 0x7d, 0x8c, 0x7c, 0xf7, 0x6a, 0x9f,
+ 0xf7, 0x4c, 0x70, 0x5, 0x9e, 0x88, 0x95, 0x7b,
+ 0x7b, 0x1a, 0x81, 0x88, 0x81, 0x82, 0x84, 0x1e,
+ 0x77, 0x42, 0x2a, 0x7d, 0x4f, 0x1b, 0x6d, 0x98,
+ 0x65, 0x59, 0x43, 0x69, 0x4a, 0x89, 0x3e, 0x9d,
+ 0x19, 0x88, 0x7c, 0xd7, 0x79, 0xca, 0x8d, 0xd1,
+ 0xa8, 0x19, 0xa6, 0x63, 0x5, 0x13, 0xdc, 0xbc,
+ 0x79, 0x6a, 0x63, 0x78, 0x65, 0x1b, 0x6c, 0x5f,
+ 0x9d, 0x95, 0x6e, 0x1f, 0xf7, 0x7b, 0x99, 0x15,
+ 0x6f, 0xb4, 0x8e, 0x8d, 0xa0, 0xa6, 0xbe, 0x92,
+ 0x5, 0x82, 0x83, 0x82, 0x81, 0x7b, 0x1a, 0x7b,
+ 0x95, 0x7f, 0x98, 0x82, 0x1e, 0xbf, 0x81, 0x64,
+ 0x76, 0x5, 0xe, 0x7d, 0xae, 0xf8, 0x52, 0xa0,
+ 0xf7, 0x4a, 0x74, 0xa, 0xf7, 0xbe, 0xc9, 0xf7,
+ 0xb5, 0xae, 0x3, 0x22, 0xa, 0xf7, 0xbe, 0x6b,
+ 0xa, 0xc9, 0xf8, 0x6a, 0x51, 0x6, 0x7e, 0x4a,
+ 0x71, 0x70, 0x4d, 0x8a, 0x8, 0x76, 0xec, 0x7,
+ 0xe, 0x7d, 0xae, 0xe5, 0xbe, 0xf8, 0xb, 0xbd,
+ 0xde, 0x74, 0xa, 0xf7, 0x3f, 0xc7, 0xf7, 0x47,
+ 0xcc, 0xf7, 0x42, 0xae, 0x3, 0x22, 0xa, 0xf7,
+ 0x46, 0x6b, 0xa, 0xf7, 0xbe, 0xbe, 0xfb, 0x7e,
+ 0x6, 0x9a, 0xae, 0xae, 0xa0, 0xa9, 0x9f, 0x8,
+ 0xd7, 0xbe, 0xd8, 0xbb, 0xf2, 0x1a, 0xe4, 0x44,
+ 0xc5, 0x35, 0x38, 0x4a, 0x4d, 0xfb, 0x1, 0x8c,
+ 0x1e, 0xc7, 0x86, 0x5, 0xd5, 0xa3, 0xbf, 0xc9,
+ 0xc6, 0xad, 0x5e, 0x52, 0x3d, 0x50, 0x66, 0x51,
+ 0x65, 0x1e, 0x54, 0x68, 0x4e, 0x58, 0x45, 0x1a,
+ 0xe, 0x7d, 0xae, 0xde, 0xbf, 0xf8, 0x15, 0xba,
+ 0xdd, 0x4c, 0xa, 0xf8, 0x25, 0xc9, 0x5b, 0xc8,
+ 0xf7, 0x41, 0xae, 0x13, 0xfb, 0x22, 0xa, 0xf7,
+ 0x4b, 0x30, 0x15, 0xfb, 0x3, 0x8a, 0xcf, 0x63,
+ 0xd3, 0x1b, 0xdb, 0xd5, 0xc0, 0xdf, 0xc2, 0x71,
+ 0xb9, 0x54, 0x99, 0x1f, 0x8d, 0x7, 0x13, 0xfd,
+ 0xba, 0x9d, 0xa0, 0xa8, 0xbe, 0x1a, 0xdb, 0x47,
+ 0xbf, 0x40, 0x40, 0x50, 0x5c, 0x3f, 0x8d, 0x1e,
+ 0xc1, 0x85, 0x5, 0xbc, 0x89, 0xa5, 0xac, 0xc0,
+ 0x1b, 0xc1, 0xa7, 0x6b, 0x56, 0x53, 0x5e, 0x71,
+ 0x58, 0x1f, 0x72, 0x8c, 0x5, 0x63, 0x7, 0x13,
+ 0xfb, 0xc8, 0x92, 0xd5, 0x6f, 0x42, 0x1a, 0x52,
+ 0x66, 0x6f, 0x53, 0x56, 0x64, 0xb7, 0xc2, 0x92,
+ 0x1e, 0xe, 0x7d, 0xae, 0xf7, 0x64, 0xc0, 0xf8,
+ 0x18, 0x74, 0xa, 0xf7, 0xe6, 0xc2, 0xf7, 0x94,
+ 0xae, 0x3, 0x22, 0xa, 0xf7, 0x16, 0xfb, 0x9,
+ 0x15, 0xf7, 0x64, 0xfb, 0xa, 0xc2, 0xf7, 0xa,
+ 0xda, 0xc0, 0x3c, 0xf7, 0xc5, 0x6, 0x58, 0x8c,
+ 0xfb, 0x68, 0xfb, 0xc6, 0x5, 0xc3, 0x16, 0xf7,
+ 0x2c, 0xf7, 0x75, 0x5, 0xfb, 0x75, 0x7, 0xe,
+ 0x7d, 0xae, 0xde, 0xbd, 0xf7, 0x70, 0xc2, 0xee,
+ 0xc0, 0xe4, 0x4c, 0xa, 0xf7, 0x54, 0xbf, 0x5e,
+ 0xbe, 0xf7, 0x41, 0xca, 0xf7, 0x37, 0xae, 0x13,
+ 0xfe, 0xc0, 0x22, 0xa, 0xf7, 0x54, 0xfb, 0xe,
+ 0x15, 0x42, 0x8f, 0xc5, 0x5c, 0xd3, 0x1b, 0xf2,
+ 0xc4, 0xd4, 0xec, 0xdc, 0x55, 0xd5, 0x35, 0x1f,
+ 0x13, 0xfd, 0xc0, 0x66, 0x63, 0x82, 0x69, 0x78,
+ 0x1f, 0xf7, 0x22, 0xf7, 0x76, 0xc0, 0xfb, 0xa9,
+ 0xfb, 0xab, 0x7, 0x13, 0xfe, 0xc0, 0xb8, 0x6,
+ 0xb9, 0x93, 0xa9, 0xa5, 0xbd, 0x1b, 0xc9, 0xa8,
+ 0x60, 0x54, 0x48, 0x77, 0x54, 0x3d, 0x5f, 0x64,
+ 0xb0, 0xb8, 0x8d, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+ 0xb9, 0xf7, 0x67, 0xbf, 0xf7, 0x10, 0xbe, 0xdd,
+ 0x4c, 0xa, 0xf7, 0x37, 0xc3, 0x53, 0xcd, 0xf7,
+ 0x45, 0xc3, 0xf7, 0x4f, 0xae, 0x13, 0xfe, 0xc0,
+ 0x22, 0xa, 0xf7, 0x6f, 0x8a, 0x15, 0xe6, 0x9f,
+ 0xf0, 0xe1, 0xbc, 0x9b, 0x70, 0x61, 0x94, 0x1e,
+ 0xbd, 0x98, 0x5, 0xcf, 0x81, 0x5f, 0xb2, 0x46,
+ 0x1b, 0x53, 0x53, 0x65, 0x58, 0x73, 0x1f, 0x75,
+ 0x5b, 0x86, 0x54, 0x57, 0x1a, 0x59, 0x8f, 0x4c,
+ 0xa1, 0x5e, 0x1e, 0x58, 0xa3, 0xbd, 0x6c, 0xc4,
+ 0x1b, 0xe4, 0xc0, 0xda, 0xde, 0xd9, 0x5a, 0xd0,
+ 0x38, 0x73, 0x74, 0x86, 0x7f, 0x78, 0x1f, 0x77,
+ 0x80, 0x7c, 0x7a, 0x81, 0x74, 0x8, 0x13, 0xfd,
+ 0xc0, 0x95, 0x3b, 0x15, 0xbf, 0xac, 0xb7, 0xc2,
+ 0xcb, 0xa4, 0x5d, 0x53, 0x56, 0x76, 0x53, 0x4d,
+ 0x4b, 0x6d, 0xc3, 0xc6, 0x1e, 0xe, 0x7d, 0xae,
+ 0xf8, 0x8e, 0xc1, 0xe4, 0x74, 0xa, 0xf7, 0x3b,
+ 0xf7, 0xcc, 0xf7, 0x3e, 0xae, 0x3, 0x22, 0xa,
+ 0xf7, 0x72, 0x6b, 0xa, 0xce, 0x6, 0xa4, 0xf7,
+ 0x2e, 0xd7, 0xf7, 0x1f, 0xe4, 0xf7, 0x13, 0x8,
+ 0xbd, 0xfb, 0xcc, 0x55, 0xf7, 0x89, 0x7, 0x29,
+ 0xfb, 0xb, 0x48, 0xfb, 0x23, 0x72, 0xfb, 0x2e,
+ 0x8, 0xe, 0x7d, 0xae, 0xe8, 0xbf, 0xf7, 0x37,
+ 0xc1, 0xf7, 0x32, 0xba, 0xdd, 0x4c, 0xa, 0xf7,
+ 0x44, 0xc3, 0x64, 0xc3, 0xf7, 0x35, 0xbf, 0x5e,
+ 0xc3, 0xf7, 0x44, 0xae, 0x13, 0xfe, 0x60, 0xf7,
+ 0xe3, 0xf7, 0xfb, 0x15, 0x55, 0x7c, 0x68, 0x64,
+ 0x50, 0x1a, 0x39, 0xc9, 0x59, 0xdc, 0xdc, 0xd4,
+ 0xb6, 0xe1, 0xc4, 0x6d, 0xb6, 0x54, 0x9b, 0x1e,
+ 0x8d, 0x7, 0x13, 0xfd, 0xa0, 0xbc, 0x9a, 0xa4,
+ 0xae, 0xc0, 0x1a, 0xd5, 0x50, 0xbd, 0x43, 0x43,
+ 0x49, 0x5b, 0x3e, 0x5c, 0xa7, 0x63, 0xb7, 0x7c,
+ 0x1e, 0x7b, 0xf2, 0x15, 0xba, 0xab, 0xa9, 0xba,
+ 0xbd, 0xab, 0x6f, 0x5a, 0x58, 0x6b, 0x6d, 0x58,
+ 0x56, 0x72, 0xaa, 0xbd, 0x1e, 0x13, 0xfe, 0x60,
+ 0x7a, 0xfb, 0x74, 0x15, 0xbe, 0xad, 0xb1, 0xc0,
+ 0xc4, 0xb4, 0x74, 0x4f, 0x52, 0x69, 0x74, 0x51,
+ 0x56, 0x63, 0xa0, 0xc0, 0x1e, 0xfb, 0x9f, 0xf5,
+ 0x21, 0xa, 0xe, 0x7d, 0xae, 0xde, 0xbd, 0xf7,
+ 0x13, 0xbf, 0xf7, 0x67, 0xb7, 0xdd, 0x4c, 0xa,
+ 0xf7, 0x42, 0xc3, 0x67, 0xbc, 0xf7, 0x39, 0xcd,
+ 0x53, 0xc3, 0xf7, 0x43, 0xae, 0x13, 0xfd, 0x60,
+ 0x22, 0xa, 0xf7, 0x56, 0xfb, 0x20, 0x15, 0x4a,
+ 0x93, 0xb6, 0x66, 0xce, 0x1b, 0xc9, 0xc1, 0xb5,
+ 0xc2, 0xa2, 0x1f, 0x9c, 0xb3, 0x91, 0xd1, 0xb7,
+ 0x1a, 0xf1, 0x71, 0xf7, 0x17, 0xfb, 0x14, 0x1e,
+ 0x13, 0xfe, 0x60, 0x32, 0x52, 0x41, 0x36, 0x3b,
+ 0xba, 0x47, 0xe0, 0xbd, 0xb6, 0xa1, 0xb9, 0x9e,
+ 0x1f, 0x43, 0x83, 0xfb, 0xf, 0x29, 0x1e, 0x13,
+ 0xfd, 0xa0, 0x67, 0x70, 0xa7, 0xad, 0x85, 0x1f,
+ 0xd7, 0xf7, 0x9, 0x15, 0x13, 0xfe, 0xa0, 0x4e,
+ 0x6f, 0xb3, 0xc3, 0xc8, 0xa0, 0xc1, 0xd1, 0xc4,
+ 0xa9, 0x53, 0x58, 0x52, 0x70, 0x5c, 0x4d, 0x1f,
+ 0xe, 0x7d, 0xae, 0xdd, 0xb8, 0xf8, 0x1e, 0xb8,
+ 0xde, 0x74, 0xa, 0xf7, 0x3a, 0xc8, 0xbc, 0xc3,
+ 0xf7, 0x44, 0xc3, 0xe0, 0xae, 0x3, 0xf8, 0x26,
+ 0x4d, 0xa, 0xc4, 0x93, 0xf7, 0x1f, 0xdd, 0xe2,
+ 0x8a, 0xfb, 0x1b, 0x4e, 0x53, 0x85, 0xfb, 0x22,
+ 0x3b, 0x35, 0x87, 0xf7, 0x1d, 0xc8, 0x1e, 0x53,
+ 0x16, 0x34, 0xab, 0xfb, 0x30, 0xf7, 0x6, 0xf7,
+ 0x17, 0x96, 0xf7, 0x23, 0xef, 0xeb, 0x79, 0xf7,
+ 0x25, 0xfb, 0x10, 0xfb, 0x18, 0x7d, 0xfb, 0x21,
+ 0x27, 0x1e, 0xfb, 0xcb, 0x16, 0x20, 0xa, 0xf7,
+ 0x3a, 0x6b, 0xa, 0xc8, 0xf8, 0x6a, 0x58, 0x6,
+ 0x85, 0x56, 0x65, 0x69, 0x5b, 0x8c, 0x8, 0x6d,
+ 0xdd, 0x7, 0xe, 0xd3, 0xa0, 0x76, 0xf7, 0x5a,
+ 0x96, 0xf8, 0x51, 0x77, 0x1, 0xf3, 0xf9, 0x2c,
+ 0x3, 0xf8, 0xaa, 0xf2, 0x15, 0xf7, 0x73, 0x24,
+ 0x96, 0x96, 0xfb, 0x10, 0xf7, 0x74, 0xfc, 0x37,
+ 0xf8, 0x37, 0x75, 0x75, 0xf8, 0x39, 0xfc, 0x39,
+ 0x6f, 0x89, 0xfc, 0x2c, 0xf8, 0x2c, 0x80, 0x81,
+ 0xf8, 0x2b, 0xfc, 0x2b, 0x7d, 0x68, 0xfc, 0x36,
+ 0xf8, 0x35, 0x5b, 0x5a, 0x5, 0xf8, 0x5c, 0xfc,
+ 0x17, 0x15, 0xa0, 0x97, 0x9a, 0xb2, 0xac, 0x8e,
+ 0xd8, 0xfb, 0x17, 0x82, 0x82, 0x5, 0xe, 0x7d,
+ 0x72, 0xa, 0x1, 0xf7, 0xf6, 0xe5, 0x26, 0xa,
+ 0xf7, 0xd3, 0x6b, 0xa, 0xf7, 0xf8, 0x2a, 0xae,
+ 0x7, 0xd2, 0x8c, 0xa8, 0xa1, 0x97, 0xd1, 0x8,
+ 0xd6, 0xfc, 0x78, 0x6, 0xe, 0x7d, 0xf7, 0x11,
+ 0xf8, 0x7e, 0xf3, 0x12, 0xae, 0xf7, 0x54, 0xfb,
+ 0x54, 0xf7, 0x5c, 0xdb, 0xf7, 0x2c, 0xe7, 0xf7,
+ 0x57, 0x13, 0xec, 0x23, 0xa, 0x13, 0xdc, 0xf7,
+ 0x5c, 0x6b, 0xa, 0x89, 0xec, 0xce, 0xbf, 0xc5,
+ 0xb0, 0x8, 0xc2, 0xae, 0xc1, 0xaf, 0xd4, 0x1a,
+ 0xbd, 0x72, 0xb1, 0x54, 0x54, 0x79, 0x5e, 0x46,
+ 0x8c, 0x1e, 0x13, 0xec, 0x33, 0x93, 0x5, 0xf7,
+ 0x8, 0xd5, 0xc9, 0xe3, 0xe6, 0xda, 0x4a, 0x2c,
+ 0x22, 0x37, 0x5c, 0x3d, 0x57, 0x1e, 0x74, 0x7c,
+ 0x6a, 0x77, 0x80, 0x71, 0x8, 0xf7, 0x7a, 0x4a,
+ 0x6, 0xe, 0x7d, 0xf7, 0xa, 0xcd, 0xf7, 0x36,
+ 0xc3, 0xf7, 0x25, 0xd0, 0xf2, 0x1, 0xf7, 0xd4,
+ 0xf7, 0x2b, 0xe3, 0xf7, 0x57, 0x26, 0xa, 0xf7,
+ 0x60, 0x40, 0x15, 0xdc, 0x8c, 0x5, 0x4e, 0x8f,
+ 0x61, 0xcf, 0x8c, 0x1e, 0xbf, 0x8c, 0xa6, 0xab,
+ 0xbd, 0x1a, 0xc3, 0x66, 0xa2, 0x58, 0x1e, 0x5c,
+ 0x88, 0x5, 0xc9, 0x7, 0xb2, 0x88, 0x5, 0xbd,
+ 0xac, 0xa4, 0xbf, 0xb3, 0x79, 0xa7, 0x5f, 0x50,
+ 0x7e, 0x6b, 0x59, 0x8d, 0x1f, 0x39, 0x94, 0x5,
+ 0xe8, 0x89, 0xce, 0xbc, 0xe3, 0x1b, 0xd7, 0xd5,
+ 0x56, 0x3a, 0x5c, 0x79, 0x68, 0x60, 0x75, 0x1f,
+ 0xbc, 0x71, 0xa3, 0x6e, 0x4f, 0x1a, 0x30, 0x3e,
+ 0x55, 0x36, 0x3f, 0x39, 0xb4, 0xe1, 0x1e, 0xe,
+ 0x7d, 0xf7, 0x11, 0xf8, 0x80, 0xf1, 0x12, 0xf7,
+ 0x4e, 0xf7, 0xb7, 0xfb, 0x5e, 0xf7, 0xb, 0x13,
+ 0xd0, 0x23, 0xa, 0x13, 0xe0, 0xf7, 0x2b, 0xfb,
+ 0x9, 0x15, 0xc7, 0x7, 0xf7, 0x5f, 0xf7, 0xce,
+ 0x5, 0xe3, 0xfb, 0xc7, 0xdf, 0x48, 0x37, 0xfb,
+ 0xa, 0x6, 0x13, 0xd0, 0x38, 0xf7, 0xa, 0x6,
+ 0x13, 0xe0, 0x13, 0xd0, 0xfb, 0xb, 0xce, 0x15,
+ 0xf7, 0xb, 0xf7, 0x56, 0x6, 0xe, 0x7d, 0xf7,
+ 0xa, 0xf7, 0xf1, 0xd6, 0xce, 0xf7, 0x2, 0x1,
+ 0xf8, 0xce, 0xf7, 0x4c, 0x26, 0xa, 0xf7, 0x69,
+ 0xfb, 0x2, 0x15, 0xda, 0x9d, 0x5, 0x61, 0x87,
+ 0xa5, 0x66, 0xb9, 0x1b, 0xd0, 0x9b, 0xc8, 0xc5,
+ 0xbb, 0x74, 0xb4, 0x54, 0x5a, 0x77, 0x6e, 0x61,
+ 0x84, 0x1f, 0x44, 0xf7, 0xaf, 0xf7, 0xbf, 0x48,
+ 0xfb, 0x70, 0x2d, 0x6, 0x97, 0xa4, 0xa2, 0x92,
+ 0xa7, 0x1b, 0xef, 0xc7, 0x44, 0x2a, 0x27, 0x42,
+ 0x3a, 0x26, 0x3c, 0x49, 0xbd, 0xdd, 0x88, 0x1f,
+ 0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf7, 0x4e, 0xce,
+ 0xf5, 0xd0, 0xf2, 0x1, 0xae, 0xf7, 0x4c, 0xe5,
+ 0xf7, 0x2e, 0x26, 0xa, 0xf7, 0xa0, 0xb9, 0x15,
+ 0xa4, 0xa9, 0xa7, 0x95, 0xb2, 0x1b, 0xe4, 0xc4,
+ 0x47, 0x34, 0x31, 0x4d, 0x3d, 0x2d, 0xfb, 0x20,
+ 0x6c, 0xf7, 0x1a, 0xf7, 0x5, 0xf7, 0x4, 0xb2,
+ 0xf7, 0x1f, 0xf7, 0x1e, 0xd7, 0xbf, 0x61, 0x40,
+ 0x95, 0x1f, 0x3f, 0x76, 0x5, 0xb0, 0x81, 0x86,
+ 0xab, 0x5a, 0x1b, 0x45, 0x78, 0x36, 0x53, 0x89,
+ 0x1f, 0x91, 0xfb, 0xc, 0x15, 0x58, 0xa5, 0x5c,
+ 0xc5, 0xc2, 0x9a, 0xb9, 0xb8, 0xbb, 0x79, 0xba,
+ 0x51, 0x59, 0x6f, 0x5f, 0x5f, 0x1e, 0xe, 0x7d,
+ 0x72, 0xa, 0x1, 0xf7, 0x73, 0xf7, 0xe8, 0x26,
+ 0xa, 0xf7, 0x9a, 0x6b, 0xa, 0xa2, 0xf7, 0x2c,
+ 0xc1, 0xf7, 0x21, 0xed, 0xf7, 0xf, 0x8, 0xfb,
+ 0x8d, 0xcf, 0xf7, 0xe8, 0x4d, 0x6, 0x32, 0xfb,
+ 0x17, 0x3d, 0xfb, 0x18, 0x73, 0xfb, 0x33, 0x8,
+ 0xe, 0x7d, 0xf7, 0xa, 0xd0, 0xf7, 0x2a, 0xda,
+ 0xf7, 0x16, 0xd0, 0xf3, 0x12, 0xae, 0xf7, 0x59,
+ 0xde, 0xf7, 0x33, 0xfb, 0x24, 0xf7, 0x1c, 0xe6,
+ 0xf7, 0x59, 0x13, 0xfb, 0x23, 0xa, 0xf7, 0xab,
+ 0xa0, 0x15, 0x64, 0x9c, 0x72, 0xb5, 0xb4, 0x1a,
+ 0xdf, 0xd4, 0xbd, 0xd9, 0xd7, 0xd0, 0x56, 0x3a,
+ 0x5b, 0x76, 0x6a, 0x5e, 0x78, 0x1e, 0xbe, 0x6f,
+ 0xa5, 0x6d, 0x4d, 0x1a, 0x34, 0x3d, 0x53, 0x38,
+ 0x33, 0x3f, 0xbc, 0xe9, 0xc1, 0xaa, 0xbb, 0xbe,
+ 0x9d, 0x1e, 0x9b, 0xef, 0x15, 0x62, 0xa2, 0x73,
+ 0xb7, 0xb9, 0xa2, 0xa1, 0xb6, 0xb5, 0x75, 0xa2,
+ 0x5e, 0x5b, 0x76, 0x75, 0x60, 0x1e, 0x13, 0xfd,
+ 0x7c, 0xfb, 0x70, 0x15, 0x5c, 0xaa, 0x70, 0xbc,
+ 0xc0, 0xa5, 0xa4, 0xbc, 0xbb, 0x6f, 0xa7, 0x5a,
+ 0x56, 0x6e, 0x72, 0x58, 0x1e, 0xe, 0x7d, 0xf7,
+ 0xa, 0xd1, 0xf6, 0xcf, 0xf7, 0x4d, 0xce, 0xf3,
+ 0x1, 0xae, 0xf7, 0x57, 0xdf, 0xf7, 0x32, 0xe0,
+ 0xf7, 0x59, 0x26, 0xa, 0xf7, 0x6a, 0xfb, 0x14,
+ 0x15, 0xd7, 0x99, 0x5, 0x6c, 0x90, 0x9b, 0x70,
+ 0xaf, 0x1b, 0xd4, 0x99, 0xe0, 0xc2, 0x8e, 0x1f,
+ 0x73, 0x72, 0x67, 0x82, 0x68, 0x1b, 0x30, 0x54,
+ 0xce, 0xe3, 0xe7, 0xcc, 0xd4, 0xea, 0xf7, 0x18,
+ 0xae, 0xfb, 0xe, 0xfb, 0x3, 0x58, 0x86, 0x3b,
+ 0x72, 0x5e, 0x1f, 0x52, 0x6c, 0x54, 0x6c, 0x4b,
+ 0x1b, 0x45, 0x57, 0xb7, 0xd1, 0x85, 0x1f, 0xcc,
+ 0xf7, 0x68, 0x15, 0x5c, 0xa3, 0x69, 0xbe, 0xc3,
+ 0xa1, 0xb4, 0xbc, 0xbc, 0x71, 0xb9, 0x53, 0x4e,
+ 0x81, 0x51, 0x5d, 0x1e, 0xe, 0x7d, 0xf7, 0x9,
+ 0xfb, 0x9, 0x72, 0xa, 0x23, 0xf3, 0x12, 0xae,
+ 0xf7, 0x4f, 0xf7, 0x53, 0xf7, 0x29, 0xdf, 0xf7,
+ 0x0, 0x13, 0x6e, 0xf7, 0x72, 0xf7, 0x3, 0x15,
+ 0xf7, 0xf6, 0x39, 0xad, 0x7, 0xc1, 0x8a, 0xad,
+ 0xb0, 0x90, 0xc7, 0x8, 0xd9, 0xfc, 0x78, 0x6,
+ 0xfb, 0xa8, 0xf7, 0x7f, 0x15, 0x2c, 0xa, 0xf7,
+ 0xbb, 0x97, 0x15, 0x13, 0x9e, 0xf7, 0x2, 0x9d,
+ 0xf7, 0x19, 0xf7, 0x21, 0xf7, 0x1a, 0xa2, 0xfb,
+ 0x1d, 0x21, 0xfb, 0x2, 0x7a, 0xfb, 0x25, 0xfb,
+ 0x20, 0xfb, 0xe, 0x66, 0xf7, 0x33, 0xeb, 0x1e,
+ 0xde, 0x16, 0x59, 0x8e, 0xfb, 0x26, 0xd4, 0xce,
+ 0x91, 0xf7, 0x2a, 0xb9, 0xbf, 0x8c, 0xf7, 0x1c,
+ 0x41, 0x46, 0x84, 0xfb, 0x1f, 0x5a, 0x1e, 0xe,
+ 0xe9, 0xf7, 0x89, 0xd0, 0x49, 0xf7, 0xb, 0x6c,
+ 0xce, 0x7c, 0xaa, 0x1, 0xa2, 0xf7, 0x8c, 0x15,
+ 0xf8, 0xf5, 0x6, 0xf7, 0x7a, 0xe0, 0x5, 0x9a,
+ 0x7, 0xfb, 0x8a, 0xd2, 0x5, 0xfc, 0xe5, 0x6c,
+ 0xf8, 0xe8, 0x6, 0x78, 0x76, 0x5, 0xfc, 0xd5,
+ 0x7c, 0xf8, 0xd3, 0x6, 0x9a, 0x68, 0x5, 0xfc,
+ 0xe2, 0x6, 0xf8, 0xe8, 0x77, 0x15, 0x92, 0xa2,
+ 0x7a, 0xb2, 0xa0, 0xa4, 0xf7, 0x27, 0x65, 0x5,
+ 0x7e, 0x7, 0xe, 0xc2, 0xa3, 0x76, 0xf7, 0xb9,
+ 0xe2, 0xf7, 0xba, 0x77, 0x1, 0xc1, 0xf9, 0xb9,
+ 0x3, 0xc1, 0xf7, 0xb5, 0x15, 0xf7, 0xc4, 0x9a,
+ 0x5, 0xfb, 0xc0, 0x7, 0x8d, 0x8a, 0xf8, 0x87,
+ 0xf7, 0xe4, 0x75, 0xa, 0xfc, 0x87, 0xf7, 0xe4,
+ 0x89, 0x8a, 0x5, 0xfb, 0xc0, 0x7, 0xfb, 0xc4,
+ 0x9a, 0x5, 0xe, 0x8a, 0xf7, 0x41, 0x76, 0xf7,
+ 0x4b, 0xa2, 0xf7, 0x4a, 0x54, 0xa, 0xf7, 0xe3,
+ 0x15, 0xf8, 0xbe, 0x6, 0x61, 0x57, 0x65, 0x4d,
+ 0x8e, 0x46, 0xca, 0xe2, 0xf7, 0x12, 0xd1, 0xf1,
+ 0xb0, 0x25, 0xb0, 0xfb, 0x10, 0xd1, 0x4a, 0xe2,
+ 0x8a, 0x4c, 0xab, 0x3e, 0xb9, 0x61, 0x8, 0xfc,
+ 0xbe, 0x6, 0xe, 0x49, 0xa, 0xf7, 0xba, 0xfb,
+ 0x8c, 0x5, 0xfb, 0x4b, 0xfb, 0x44, 0x15, 0xf7,
+ 0x78, 0xf7, 0x44, 0x5, 0xf8, 0x39, 0x6, 0xe,
+ 0xf7, 0x45, 0xf7, 0x41, 0x76, 0xf7, 0x4b, 0xa2,
+ 0xf7, 0x4a, 0x77, 0x1, 0xad, 0x4d, 0xa, 0xf2,
+ 0x65, 0xed, 0x45, 0xcc, 0x35, 0x8c, 0xca, 0x6b,
+ 0xd6, 0x5d, 0xb8, 0x8, 0xf8, 0xce, 0x6, 0x61,
+ 0x57, 0x64, 0x4d, 0x8f, 0x46, 0xca, 0xe2, 0xf0,
+ 0xd1, 0xf0, 0xb0, 0x25, 0xaf, 0x29, 0xd2, 0x4a,
+ 0xe2, 0x8a, 0x4c, 0xaa, 0x3d, 0xba, 0x62, 0x8,
+ 0xfc, 0xce, 0x6, 0xb5, 0xbd, 0xb1, 0xc9, 0x88,
+ 0xd1, 0x4c, 0x33, 0x26, 0x45, 0x25, 0x67, 0x8,
+ 0xe, 0xfc, 0x11, 0x23, 0x76, 0xfa, 0x45, 0x77,
+ 0x1, 0xf7, 0x6d, 0xa2, 0x3, 0xae, 0xf7, 0x1e,
+ 0x15, 0xe2, 0x4c, 0xd1, 0x28, 0xb0, 0x26, 0xaf,
+ 0xf1, 0xd2, 0xeb, 0xe1, 0xcc, 0x4d, 0x8c, 0x3d,
+ 0x6c, 0x61, 0x5c, 0x8, 0xf8, 0xce, 0x7, 0xbe,
+ 0x61, 0xc9, 0x65, 0xd0, 0x8e, 0x34, 0xca, 0x45,
+ 0xf0, 0x67, 0xf1, 0x65, 0x24, 0x45, 0x29, 0x35,
+ 0x4a, 0xca, 0x8a, 0xd6, 0xab, 0xb7, 0xb9, 0x8,
+ 0xfc, 0xce, 0x7, 0x58, 0xb5, 0x4d, 0xb2, 0x46,
+ 0x87, 0x8, 0xe, 0xe0, 0xcb, 0x76, 0xf7, 0x97,
+ 0xd5, 0xf7, 0x98, 0x77, 0x1, 0xc3, 0xf9, 0xcc,
+ 0x3, 0xc3, 0xf7, 0xbc, 0x15, 0xf8, 0x12, 0x98,
+ 0x5, 0xfb, 0x9d, 0x7, 0x8c, 0x8a, 0xf8, 0x4d,
+ 0xf7, 0xbc, 0x75, 0xa, 0xfc, 0x4d, 0xf7, 0xbb,
+ 0x8a, 0x8a, 0x5, 0xfb, 0x9d, 0x7, 0xfc, 0x12,
+ 0x98, 0x5, 0xe, 0xda, 0xf7, 0xdb, 0xa5, 0x71,
+ 0xa6, 0x7f, 0x94, 0x12, 0x9f, 0xfa, 0x3, 0x13,
+ 0x90, 0xc3, 0xf7, 0xd9, 0x15, 0xf9, 0x1c, 0x8f,
+ 0x3c, 0x7a, 0xfb, 0x0, 0x57, 0x75, 0x58, 0x19,
+ 0x7d, 0x85, 0x8c, 0x82, 0x8f, 0x1b, 0x8d, 0x8f,
+ 0x8e, 0x8e, 0x8d, 0x1f, 0xca, 0xe0, 0xf7, 0x5a,
+ 0xb4, 0xf3, 0x9a, 0x8, 0x8d, 0x8c, 0x8c, 0x8d,
+ 0x8c, 0x1f, 0x13, 0x30, 0x8e, 0x8d, 0x8e, 0x8e,
+ 0x95, 0x1b, 0x92, 0x8c, 0x94, 0x8e, 0x8e, 0x1a,
+ 0x8c, 0x88, 0x8c, 0x88, 0x1e, 0xfb, 0x19, 0x95,
+ 0xfb, 0x2f, 0xb1, 0x46, 0xe6, 0x8, 0x8d, 0x89,
+ 0x89, 0x8e, 0x8a, 0x1b, 0x89, 0x8d, 0x81, 0x80,
+ 0x8f, 0x1f, 0xa2, 0x53, 0xdd, 0x67, 0xd7, 0x6d,
+ 0x8, 0x13, 0x50, 0xfc, 0xf7, 0x8d, 0x5, 0x70,
+ 0x66, 0x94, 0x8d, 0x78, 0x1f, 0x88, 0x8c, 0x87,
+ 0x89, 0x88, 0x1a, 0x88, 0x8e, 0x88, 0x90, 0x86,
+ 0x1e, 0x90, 0x86, 0x95, 0x7e, 0x9a, 0x84, 0x8,
+ 0xe, 0xe3, 0xc0, 0x76, 0xf7, 0x7c, 0xf7, 0x38,
+ 0xf7, 0x7c, 0x77, 0x12, 0xae, 0xf9, 0xed, 0x17,
+ 0xf8, 0xda, 0xf7, 0x9c, 0x15, 0x4d, 0x4d, 0x5,
+ 0x76, 0x74, 0x7d, 0x74, 0x6a, 0x1a, 0x57, 0xb3,
+ 0x64, 0xbe, 0xaf, 0xa4, 0xa3, 0xa4, 0xa0, 0x1e,
+ 0x13, 0x30, 0xf7, 0x7e, 0xf7, 0x9d, 0xfb, 0x81,
+ 0xf7, 0xa1, 0x5, 0xa3, 0x77, 0x72, 0xa0, 0x6a,
+ 0x1b, 0x13, 0x50, 0x56, 0x64, 0x61, 0x56, 0x6f,
+ 0xa1, 0x70, 0x9e, 0x78, 0x1f, 0xc3, 0x4c, 0x5,
+ 0xfc, 0x48, 0x6, 0x51, 0x56, 0x7a, 0x4a, 0x47,
+ 0xbf, 0x7d, 0xc6, 0x1f, 0xe, 0xe4, 0xf7, 0x2a,
+ 0x76, 0xf7, 0x5c, 0xac, 0xf7, 0x5c, 0x54, 0xa,
+ 0xf9, 0xec, 0x3, 0xae, 0xf7, 0xdd, 0x15, 0xf8,
+ 0xff, 0xfb, 0x5c, 0x6, 0xf7, 0x81, 0xf7, 0x6d,
+ 0xfb, 0x81, 0xf7, 0x6c, 0x5, 0xfb, 0x5c, 0xfc,
+ 0xff, 0x7, 0xe, 0xe4, 0xf7, 0x29, 0x76, 0xf7,
+ 0x34, 0xf7, 0x8, 0xf7, 0x33, 0x54, 0xa, 0xf9,
+ 0xee, 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf8, 0xff,
+ 0xfb, 0x34, 0x6, 0xf7, 0x83, 0xf7, 0x6e, 0xfb,
+ 0x83, 0xf7, 0x6d, 0x5, 0xfb, 0x33, 0xfc, 0xff,
+ 0x7, 0xe, 0xf5, 0x43, 0x76, 0xf9, 0xd6, 0x77,
+ 0x1, 0x34, 0xa, 0xfc, 0x7d, 0xfc, 0xc3, 0x15,
+ 0xb5, 0x64, 0xf7, 0xc, 0xd6, 0xf7, 0x25, 0xaf,
+ 0xf7, 0x1f, 0x99, 0x19, 0xbc, 0xf7, 0x58, 0xcb,
+ 0xd9, 0xf7, 0x11, 0xf7, 0x2e, 0x8, 0x8e, 0x94,
+ 0x8d, 0x93, 0x94, 0x1a, 0xb6, 0x61, 0xb8, 0x5d,
+ 0x7b, 0x7b, 0x86, 0x7e, 0x7b, 0x1e, 0xfb, 0x19,
+ 0xfb, 0x1e, 0x21, 0x36, 0xfb, 0x32, 0xfb, 0x0,
+ 0x6a, 0x31, 0x4d, 0xfb, 0x7, 0x4e, 0x41, 0x8,
+ 0xb1, 0x95, 0x15, 0xa3, 0xa9, 0xa7, 0xb3, 0x9b,
+ 0xa8, 0xa7, 0xbd, 0xa4, 0xbe, 0x9e, 0xbf, 0xe0,
+ 0xc5, 0xde, 0xc8, 0xd8, 0xce, 0xbe, 0xb7, 0xba,
+ 0xba, 0xba, 0xbb, 0x8, 0x95, 0x95, 0x8f, 0x90,
+ 0x9b, 0x1b, 0xa9, 0xad, 0x6d, 0x6d, 0x81, 0x87,
+ 0x85, 0x86, 0x84, 0x1f, 0x72, 0x6b, 0x70, 0x6b,
+ 0x73, 0x6a, 0x3d, 0x24, 0x61, 0x38, 0x6a, 0xfb,
+ 0x11, 0xfb, 0x0, 0x7f, 0xfb, 0xa, 0x6e, 0x26,
+ 0x5b, 0x7b, 0x84, 0x78, 0x80, 0x81, 0x84, 0x8a,
+ 0x8c, 0x18, 0xf7, 0x21, 0xf7, 0x2a, 0x5, 0xa8,
+ 0xab, 0xae, 0xa7, 0x92, 0x84, 0x93, 0x83, 0x6e,
+ 0x65, 0x68, 0x6d, 0x90, 0x1f, 0xfb, 0x1d, 0xfb,
+ 0x2c, 0x5, 0xe, 0x86, 0xf7, 0x44, 0x76, 0xf2,
+ 0xf7, 0x44, 0xf2, 0x54, 0xa, 0xa4, 0xcb, 0xba,
+ 0xaf, 0xd9, 0x3, 0xf7, 0xca, 0xf7, 0x96, 0x15,
+ 0xf7, 0x99, 0x24, 0x6, 0xf7, 0x78, 0xf7, 0x53,
+ 0xfb, 0x78, 0xf7, 0x53, 0x5, 0x24, 0xfb, 0x99,
+ 0x7, 0x24, 0xfb, 0x44, 0x15, 0xd9, 0xf7, 0x44,
+ 0x3d, 0x6, 0x38, 0xfb, 0x44, 0x15, 0xba, 0xf7,
+ 0x44, 0x5c, 0x6, 0x32, 0xfb, 0x44, 0x15, 0xa4,
+ 0xf7, 0x44, 0x72, 0x6, 0xe, 0xad, 0xf7, 0x6,
+ 0x76, 0xf8, 0x8e, 0x54, 0xa, 0xa2, 0xd3, 0xab,
+ 0xc6, 0xbe, 0xb1, 0xd5, 0x3, 0xf8, 0x2c, 0xf7,
+ 0x5b, 0x15, 0xf7, 0x3a, 0x21, 0x92, 0x6, 0xb7,
+ 0xf7, 0xb, 0xf4, 0xe3, 0xf7, 0x0, 0xb9, 0xfb,
+ 0x2, 0xba, 0xfb, 0x0, 0xe6, 0x64, 0xf7, 0x7,
+ 0x8, 0x84, 0x21, 0xfb, 0x3a, 0x6, 0x29, 0xfb,
+ 0xba, 0x15, 0xd5, 0xf7, 0xba, 0x41, 0x6, 0x32,
+ 0xfb, 0xba, 0x15, 0xbe, 0xf7, 0xba, 0x58, 0x6,
+ 0x30, 0xfb, 0xba, 0x15, 0xab, 0xf7, 0xba, 0x6b,
+ 0x6, 0x2c, 0xfb, 0xba, 0x15, 0xa2, 0xf7, 0xba,
+ 0x74, 0x6, 0xe, 0x80, 0xf7, 0x11, 0x76, 0xf8,
+ 0x78, 0x54, 0xa, 0xf9, 0x88, 0x3, 0xae, 0xf7,
+ 0x5d, 0x15, 0xf8, 0x8b, 0x2a, 0x6, 0xf7, 0x91,
+ 0xf7, 0x86, 0xfb, 0x91, 0xf7, 0x86, 0x5, 0x2a,
+ 0xfc, 0x8b, 0x7, 0xe, 0x49, 0xa, 0xf7, 0xbc,
+ 0xfb, 0x8c, 0x5, 0xb8, 0x16, 0xfb, 0x70, 0xf7,
+ 0x44, 0xf9, 0x13, 0xfb, 0x44, 0x5, 0xe, 0xd9,
+ 0x3d, 0xa, 0xf9, 0xe3, 0x7a, 0xa, 0xf9, 0xe3,
+ 0xf7, 0xee, 0xfd, 0xe3, 0xf7, 0xee, 0xf7, 0x67,
+ 0xfb, 0xee, 0x5, 0xe, 0xe6, 0xf4, 0x76, 0xf7,
+ 0xaf, 0xd8, 0xf7, 0x38, 0x54, 0xa, 0xb3, 0x3,
+ 0xf8, 0xb5, 0xdf, 0x15, 0x76, 0xa, 0x23, 0xfb,
+ 0xcb, 0x7, 0x25, 0x8a, 0x52, 0xa8, 0xf7, 0x1c,
+ 0x1a, 0x63, 0xfb, 0x85, 0x6, 0x8c, 0x4e, 0x8b,
+ 0x6f, 0xb8, 0x5c, 0x8, 0x62, 0xb1, 0xb9, 0x87,
+ 0xc0, 0x1b, 0xf7, 0xdb, 0x6, 0xe, 0xe7, 0xf4,
+ 0x76, 0xf7, 0x37, 0xf7, 0x97, 0xf1, 0x54, 0xa,
+ 0xb3, 0x3, 0xae, 0xdf, 0x15, 0xb3, 0x6, 0xf7,
+ 0x1c, 0xc5, 0xa7, 0xf1, 0x8a, 0x1e, 0xf7, 0xca,
+ 0x24, 0x6, 0x76, 0xa, 0x25, 0xfb, 0xdb, 0x7,
+ 0x56, 0x5e, 0x86, 0x62, 0x64, 0x1f, 0x5f, 0x5d,
+ 0x8a, 0x6e, 0x8a, 0x4f, 0x8, 0xe, 0xfc, 0xc,
+ 0x3d, 0x76, 0xfa, 0xe, 0x54, 0xa, 0xf8, 0x1e,
+ 0x3, 0xae, 0xc2, 0x15, 0xf7, 0x14, 0xfb, 0x2e,
+ 0x6, 0xf7, 0x9e, 0xf8, 0x51, 0xfb, 0x9e, 0xf8,
+ 0x51, 0x5, 0xfb, 0x2e, 0xfb, 0x14, 0x7, 0xe,
+ 0xb7, 0xe7, 0x76, 0xf8, 0xbc, 0x77, 0x1, 0xf8,
+ 0x42, 0x96, 0x3, 0xae, 0xf7, 0x38, 0x15, 0xf8,
+ 0x1f, 0x2e, 0x96, 0x6, 0xae, 0xd2, 0xf7, 0x7e,
+ 0xf7, 0x71, 0xf7, 0x1e, 0x77, 0x8, 0x94, 0x7,
+ 0xfb, 0x3d, 0x9f, 0xfb, 0x29, 0xf6, 0x32, 0xf7,
+ 0x24, 0x8, 0x80, 0x2d, 0xfc, 0x1f, 0x6, 0xe,
+ 0x88, 0xb7, 0xa0, 0x76, 0x6c, 0xa, 0x76, 0xa0,
+ 0x12, 0xae, 0xa5, 0xf7, 0xe4, 0xa5, 0x13, 0xb7,
+ 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xfe, 0x6, 0x13,
+ 0x4b, 0xfb, 0x31, 0xf7, 0x28, 0x7, 0xf7, 0x95,
+ 0xf7, 0xc2, 0xfb, 0x95, 0xf7, 0xc2, 0x5, 0xfb,
+ 0x28, 0x6, 0x13, 0xb7, 0xfb, 0x31, 0xfb, 0xfe,
+ 0x7, 0xa5, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7,
+ 0xfe, 0xf7, 0x35, 0x7, 0xf7, 0x8e, 0xfb, 0xad,
+ 0xfb, 0x8e, 0x7d, 0xa, 0xf7, 0x1b, 0x50, 0x76,
+ 0xf8, 0x57, 0xf7, 0x47, 0x8b, 0xb3, 0x8b, 0xa0,
+ 0xf7, 0x16, 0x77, 0x1, 0xc6, 0xf9, 0xde, 0x3,
+ 0x34, 0xa, 0xfc, 0x6f, 0xfc, 0xc1, 0x15, 0x96,
+ 0x83, 0xf7, 0x2b, 0xf7, 0x3b, 0x5, 0xa9, 0x86,
+ 0xb1, 0xae, 0xa8, 0x1b, 0x93, 0x92, 0x83, 0x84,
+ 0x6f, 0x6b, 0x68, 0x6e, 0x1f, 0xfb, 0x30, 0xfb,
+ 0x3a, 0x93, 0x83, 0xf7, 0x6, 0xd2, 0xf7, 0x2b,
+ 0xb0, 0xf7, 0x15, 0x99, 0x19, 0xb8, 0xf7, 0x4a,
+ 0xca, 0xdd, 0xf7, 0x9, 0xf7, 0x24, 0x8, 0x89,
+ 0x6, 0xbd, 0x91, 0x6f, 0xbd, 0x52, 0x1b, 0x83,
+ 0x83, 0x89, 0x8a, 0x83, 0x1f, 0x6b, 0x69, 0xfb,
+ 0x1, 0xfb, 0x5, 0xfb, 0x10, 0x2e, 0xfb, 0x15,
+ 0x33, 0x19, 0x6f, 0x3e, 0x4c, 0xfb, 0xf, 0x50,
+ 0x44, 0x8, 0xe, 0xa7, 0x90, 0xf9, 0x4e, 0x1,
+ 0xc5, 0xf9, 0x73, 0x3, 0xf3, 0xf7, 0xbe, 0x15,
+ 0xbc, 0xf7, 0x44, 0xf7, 0x8f, 0x64, 0x5, 0x8b,
+ 0xc8, 0xf7, 0x51, 0x88, 0x1a, 0x88, 0x8a, 0xf7,
+ 0xa7, 0xfb, 0x86, 0x8b, 0x1a, 0x88, 0x7, 0x8e,
+ 0xfc, 0x28, 0xfb, 0x75, 0x8b, 0x1e, 0x8a, 0xb9,
+ 0xf7, 0x48, 0x8b, 0x1e, 0xfb, 0xd5, 0xfb, 0x16,
+ 0x15, 0xf7, 0x92, 0xb4, 0x6b, 0xfb, 0x16, 0x88,
+ 0xfb, 0x0, 0xf8, 0x98, 0xf7, 0xad, 0x5, 0xf5,
+ 0x7, 0xfb, 0xee, 0xf7, 0xcb, 0x44, 0xfb, 0x6e,
+ 0xfb, 0x91, 0xb2, 0x4d, 0xfb, 0x76, 0x5, 0xe,
+ 0xfb, 0x23, 0xcc, 0x76, 0xe4, 0xe4, 0xf7, 0xb8,
+ 0xa8, 0xf4, 0x54, 0xa, 0xa7, 0xf7, 0x78, 0xa5,
+ 0x3, 0xf7, 0xd, 0xf7, 0x19, 0x15, 0xf7, 0x3e,
+ 0x71, 0x6, 0xd7, 0x4c, 0xf7, 0xba, 0xf7, 0xb0,
+ 0xfc, 0x6, 0xf7, 0xd4, 0x5, 0x22, 0xfb, 0x94,
+ 0xfb, 0xe6, 0x7, 0xa7, 0x9c, 0x15, 0xf7, 0xb8,
+ 0xf7, 0x92, 0xd6, 0x7, 0xf7, 0x96, 0xfb, 0x72,
+ 0xfb, 0x96, 0xfb, 0x88, 0x5, 0xee, 0x7, 0xe,
+ 0xae, 0xed, 0x76, 0xeb, 0xcf, 0xf7, 0x99, 0xa5,
+ 0xe6, 0x77, 0x1, 0xf8, 0xb6, 0xa3, 0x3, 0xf3,
+ 0xf7, 0x41, 0x15, 0xf8, 0x4e, 0x66, 0x6, 0xc9,
+ 0x50, 0xf7, 0x7c, 0xf7, 0x8a, 0xfb, 0xba, 0xf7,
+ 0xbc, 0x5, 0x30, 0xfc, 0x91, 0x7, 0xd8, 0xfb,
+ 0x31, 0x3c, 0xfb, 0x16, 0x5, 0xa7, 0x16, 0xd9,
+ 0xf7, 0x16, 0x4b, 0xf7, 0x17, 0x5, 0xf8, 0x81,
+ 0xc7, 0x6, 0xf7, 0x4e, 0xfb, 0x53, 0xfb, 0x4e,
+ 0xfb, 0x4b, 0x5, 0xc0, 0x7, 0xe, 0x3c, 0x9c,
+ 0x76, 0xf9, 0x43, 0x77, 0x1, 0xb6, 0xf7, 0x3c,
+ 0x3, 0xb6, 0xf7, 0xe8, 0x15, 0xfb, 0x52, 0xf7,
+ 0x2b, 0xfb, 0x2e, 0xf7, 0x4e, 0xf7, 0x4e, 0xf7,
+ 0x2b, 0xf7, 0x2e, 0xf7, 0x52, 0xf7, 0x52, 0xfb,
+ 0x2b, 0xf7, 0x2d, 0xfb, 0x4e, 0xfb, 0x4e, 0xfb,
+ 0x2b, 0xfb, 0x2d, 0xfb, 0x52, 0x1e, 0xf7, 0x3c,
+ 0xfb, 0xb4, 0x15, 0xf8, 0xd4, 0x7, 0x8c, 0x8c,
+ 0xf8, 0x87, 0xfb, 0xb4, 0x80, 0xa, 0xfc, 0x87,
+ 0xfb, 0xb4, 0x5, 0xe, 0xf6, 0xf7, 0xb, 0x76,
+ 0xf7, 0xd, 0xad, 0xd2, 0xab, 0xd2, 0xad, 0xf7,
+ 0xd, 0x77, 0x1, 0xf9, 0x3a, 0xac, 0x3, 0xb2,
+ 0xf7, 0x6f, 0x15, 0xf7, 0xed, 0x6, 0xec, 0xf4,
+ 0x5, 0xf7, 0x59, 0xfb, 0x76, 0x6, 0xf7, 0x7d,
+ 0xf7, 0x86, 0xfb, 0x7d, 0xf7, 0x86, 0x5, 0xfb,
+ 0x76, 0xfb, 0x59, 0x7, 0x2a, 0xf4, 0x5, 0xfb,
+ 0xed, 0x6, 0xf7, 0x6, 0xfb, 0xd, 0x5, 0xf8,
+ 0xc2, 0xfb, 0x3b, 0x15, 0xf7, 0xe2, 0x7, 0xf7,
+ 0x32, 0xfb, 0x3b, 0x5, 0xfd, 0x8b, 0x34, 0x15,
+ 0xdf, 0xe2, 0x37, 0xe2, 0x5, 0xf7, 0x9f, 0x6,
+ 0xda, 0x34, 0x3c, 0x34, 0x5, 0xe, 0xa5, 0xf8,
+ 0x87, 0xf7, 0xda, 0x15, 0xf7, 0x2d, 0x6, 0x71,
+ 0x69, 0x8b, 0x5c, 0xaa, 0x6a, 0xb3, 0xc7, 0xce,
+ 0xb4, 0xcd, 0xb2, 0x48, 0xa6, 0x49, 0xb3, 0x63,
+ 0xc8, 0x69, 0x6e, 0x8e, 0x54, 0xa5, 0x6d, 0x8,
+ 0xfb, 0x2d, 0x6, 0xfc, 0x64, 0xfb, 0x33, 0x15,
+ 0xf7, 0xe8, 0x6, 0xf7, 0xb, 0xf7, 0xb, 0x5,
+ 0xfb, 0xe6, 0x6, 0xb3, 0x4, 0xf7, 0xe6, 0x6,
+ 0x90, 0xfb, 0x11, 0xf7, 0x7, 0x8b, 0x1f, 0xfb,
+ 0xe7, 0x6, 0xe, 0xf7, 0x14, 0xf7, 0x25, 0x76,
+ 0xf7, 0x61, 0xad, 0xf7, 0x61, 0x77, 0x1, 0xf7,
+ 0x4a, 0xf8, 0x73, 0x3, 0xae, 0xf7, 0x23, 0x15,
+ 0xf7, 0xe6, 0x6, 0x91, 0xc0, 0xa0, 0xd2, 0xb6,
+ 0xaa, 0x8, 0xa9, 0xb5, 0xd8, 0x8c, 0xbd, 0x1b,
+ 0xe7, 0x6, 0x56, 0x53, 0x88, 0x31, 0x98, 0x50,
+ 0xd5, 0xe6, 0xe2, 0xe2, 0xf7, 0x2, 0xb7, 0xfb,
+ 0x2, 0xb9, 0x30, 0xdd, 0x45, 0xe9, 0x7e, 0x64,
+ 0x90, 0xfb, 0x7, 0xbe, 0x58, 0x8, 0x2f, 0x6,
+ 0x4f, 0x4e, 0x8b, 0xb5, 0x5b, 0x1f, 0x65, 0xab,
+ 0x70, 0xc8, 0x86, 0xbe, 0x8, 0xfb, 0xe6, 0x6,
+ 0x97, 0x30, 0xbb, 0x3d, 0xe2, 0x69, 0x35, 0x6c,
+ 0x56, 0x37, 0x83, 0x33, 0x8, 0xe, 0x83, 0xf7,
+ 0xb, 0x76, 0xf7, 0x64, 0xd3, 0x5b, 0xa1, 0xf7,
+ 0x7c, 0x77, 0x12, 0xa3, 0xf9, 0xa3, 0x13, 0xb8,
+ 0xf9, 0x7e, 0xf7, 0xde, 0x15, 0x60, 0x71, 0xfb,
+ 0x6, 0x45, 0x45, 0x62, 0x8, 0x63, 0x74, 0x83,
+ 0x7b, 0x75, 0x1a, 0x72, 0xa3, 0x82, 0x95, 0x9e,
+ 0x93, 0x94, 0xa7, 0xa5, 0x1e, 0xcd, 0xd1, 0xf4,
+ 0xe9, 0xd9, 0xb6, 0x8, 0x89, 0x7, 0x8d, 0x7,
+ 0x3b, 0xb6, 0x23, 0xe6, 0x49, 0xd2, 0x8, 0xa7,
+ 0x71, 0x82, 0x94, 0x78, 0x1b, 0x81, 0x75, 0x82,
+ 0x72, 0x75, 0x94, 0x7b, 0xb3, 0x74, 0x1f, 0xd1,
+ 0x63, 0xf7, 0x7, 0x44, 0xb4, 0x71, 0x8, 0x13,
+ 0xd8, 0xfb, 0xaf, 0xfb, 0xb5, 0xa5, 0x2f, 0x1b,
+ 0x64, 0x78, 0x7d, 0x74, 0x72, 0xa0, 0x81, 0xb1,
+ 0x1f, 0x13, 0xb8, 0xea, 0xf7, 0xbc, 0xa3, 0xf7,
+ 0xa4, 0x1b, 0xe, 0xad, 0xdc, 0x76, 0xf7, 0x9f,
+ 0xa3, 0xf7, 0xa5, 0x77, 0x1, 0xf9, 0xab, 0xf7,
+ 0xdb, 0x15, 0x5e, 0x71, 0xfb, 0x7, 0x55, 0x35,
+ 0x71, 0x8, 0x4d, 0x78, 0x8e, 0x58, 0x66, 0x1a,
+ 0x62, 0xc1, 0x7e, 0xb4, 0x9c, 0xa9, 0xa1, 0x9d,
+ 0x98, 0x1e, 0xc9, 0xe0, 0xc6, 0xf7, 0x3, 0xdd,
+ 0xb7, 0x38, 0xb8, 0x42, 0xf7, 0xf, 0x4c, 0xe1,
+ 0x8, 0x9c, 0x7f, 0x6f, 0x98, 0x7a, 0x1b, 0x5c,
+ 0x5f, 0x70, 0x62, 0x63, 0xa4, 0x61, 0xb6, 0x7a,
+ 0x1f, 0xde, 0x6c, 0xf7, 0xa, 0x5a, 0xb7, 0x71,
+ 0x8, 0xfb, 0xbb, 0xfb, 0x96, 0xe7, 0x2b, 0x1b,
+ 0x54, 0x52, 0x41, 0x6d, 0x64, 0xc3, 0x4b, 0xc4,
+ 0x1f, 0xee, 0xf7, 0x9f, 0xe6, 0xf7, 0xaf, 0x1b,
+ 0xe, 0xe3, 0xf7, 0x5f, 0xf7, 0xa6, 0x1, 0xa9,
+ 0xf9, 0xf8, 0x3, 0xa9, 0xf7, 0x5f, 0x15, 0xf9,
+ 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x1c, 0x75, 0xa,
+ 0xfb, 0x73, 0xf7, 0x1c, 0x5, 0xfd, 0x19, 0x6,
+ 0xf7, 0x18, 0xfb, 0x1c, 0x80, 0xa, 0xe, 0x37,
+ 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xad, 0xf9,
+ 0x43, 0x3, 0xf8, 0x66, 0xf8, 0xb6, 0x15, 0xfb,
+ 0xf2, 0xfb, 0x7f, 0x7b, 0x74, 0x81, 0x1b, 0x80,
+ 0x82, 0xa7, 0x93, 0x88, 0x1f, 0xca, 0x71, 0x89,
+ 0x9c, 0x77, 0x1b, 0x71, 0x6d, 0x7a, 0x7c, 0x76,
+ 0x1f, 0x7e, 0x82, 0x81, 0x83, 0x7a, 0x1a, 0x59,
+ 0xb2, 0x27, 0xa1, 0x5d, 0x1e, 0x92, 0x7d, 0x90,
+ 0x7d, 0x95, 0x84, 0x8, 0x86, 0x92, 0x9a, 0x8b,
+ 0xab, 0x1b, 0x99, 0xa7, 0x8c, 0x90, 0x92, 0x1f,
+ 0x94, 0x91, 0xf7, 0xf3, 0xf8, 0xd0, 0xf7, 0xb,
+ 0xf7, 0x5, 0xa1, 0xa0, 0x18, 0x55, 0x33, 0x77,
+ 0x63, 0x67, 0x1f, 0xe, 0xf7, 0x17, 0xd4, 0xf8,
+ 0xaa, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xd4,
+ 0x15, 0xf9, 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x9e,
+ 0x75, 0xa, 0xfb, 0x73, 0xf7, 0x9e, 0x5, 0xfd,
+ 0x19, 0x6, 0xf7, 0x18, 0xfb, 0x9e, 0x80, 0xa,
+ 0xe, 0xda, 0x91, 0xf9, 0x30, 0x1, 0xe4, 0xf9,
+ 0xa2, 0x3, 0xe4, 0x91, 0x15, 0xf9, 0xa2, 0xf7,
+ 0xe1, 0x75, 0xa, 0xfd, 0xa2, 0xf7, 0xe1, 0x5,
+ 0x38, 0x7, 0xf8, 0xe7, 0xfb, 0x8e, 0x80, 0xa,
+ 0xfc, 0xe7, 0xfb, 0x8e, 0x5, 0x95, 0xf7, 0x16,
+ 0x15, 0xf7, 0xe1, 0xf7, 0xc, 0x75, 0xa, 0xfb,
+ 0xe1, 0xf7, 0xc, 0x5, 0xe, 0x30, 0xbb, 0x76,
+ 0xf8, 0x87, 0x77, 0x1, 0xd4, 0xf8, 0xef, 0x3,
+ 0xf7, 0x12, 0xdd, 0x15, 0xf7, 0x63, 0xf7, 0x38,
+ 0xf7, 0x2f, 0xfb, 0x6e, 0x8c, 0x8a, 0xf7, 0x4f,
+ 0xf8, 0x87, 0x5, 0x8a, 0x6, 0xfc, 0xa9, 0x81,
+ 0x8c, 0x8a, 0xf7, 0x2d, 0xfb, 0x6e, 0xfb, 0x73,
+ 0xfb, 0x1f, 0x5, 0xe, 0x88, 0xb7, 0x6c, 0xa,
+ 0x12, 0xae, 0xf7, 0x4, 0xf7, 0x81, 0xf7, 0xb,
+ 0x13, 0x6c, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xf1,
+ 0x6, 0x13, 0x9c, 0xfb, 0x31, 0xf7, 0x1a, 0x7,
+ 0xf7, 0xb0, 0xf7, 0xc2, 0xfb, 0xb0, 0xf7, 0xc2,
+ 0x5, 0xfb, 0x1a, 0x6, 0x13, 0xac, 0xfb, 0x31,
+ 0xfb, 0xf1, 0x7, 0xf7, 0x4, 0xfb, 0x9d, 0x15,
+ 0xf7, 0x84, 0xf7, 0xf8, 0xf7, 0x35, 0x7, 0xf7,
+ 0x9c, 0xfb, 0xad, 0xfb, 0x9c, 0x7d, 0xa, 0x47,
+ 0xc5, 0x76, 0xf8, 0x91, 0xea, 0x99, 0x77, 0x12,
+ 0xf8, 0xee, 0xe0, 0x13, 0xb0, 0xf8, 0x7e, 0xf8,
+ 0x3d, 0x15, 0xf7, 0x4, 0xe7, 0x8f, 0x63, 0xb4,
+ 0x6d, 0xb3, 0x80, 0x19, 0x88, 0xe5, 0xaa, 0xcf,
+ 0xa0, 0xc8, 0x8, 0x13, 0xd0, 0x45, 0x77, 0x3b,
+ 0x7c, 0x44, 0xa0, 0x8c, 0x66, 0xa7, 0x56, 0xad,
+ 0x86, 0xfb, 0x4, 0x2f, 0x18, 0xfc, 0x44, 0xfb,
+ 0x63, 0x15, 0xf7, 0x3d, 0x7e, 0xf7, 0x97, 0xf7,
+ 0x6e, 0xfb, 0x3b, 0x99, 0x5, 0x36, 0xfc, 0x41,
+ 0x15, 0xf7, 0x98, 0xf7, 0x6e, 0x5, 0xcd, 0x92,
+ 0xbf, 0x94, 0xbc, 0x1e, 0xfb, 0x98, 0xfb, 0x6e,
+ 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xf7, 0xf1, 0xf7,
+ 0x39, 0xf7, 0x6d, 0x77, 0x12, 0xf9, 0x46, 0xec,
+ 0x13, 0xb0, 0xad, 0xf7, 0xb8, 0x15, 0x5e, 0xba,
+ 0xc7, 0x6e, 0xcd, 0x1b, 0xa3, 0xa3, 0x8f, 0x94,
+ 0xa2, 0x1f, 0x78, 0x68, 0x83, 0x68, 0x64, 0x1a,
+ 0x5a, 0x9d, 0x59, 0xa5, 0x61, 0x1e, 0xf7, 0x97,
+ 0xf7, 0x6d, 0x5, 0x13, 0xd0, 0x72, 0xb2, 0x7d,
+ 0xba, 0xb9, 0x1a, 0xd7, 0xc0, 0xb7, 0xbf, 0xb8,
+ 0x1e, 0xd1, 0xc4, 0x8a, 0x3a, 0xbc, 0x49, 0xbc,
+ 0x66, 0x19, 0xf7, 0x28, 0x9b, 0xee, 0xbd, 0xec,
+ 0x1e, 0xfb, 0x6, 0x68, 0xfb, 0xd, 0x95, 0xfb,
+ 0x8, 0xa0, 0xaa, 0x4f, 0xc4, 0x4e, 0xd9, 0x82,
+ 0x43, 0x51, 0x18, 0x68, 0x62, 0x57, 0x63, 0x53,
+ 0x1b, 0x58, 0x4a, 0xa8, 0xae, 0x65, 0x1f, 0xe,
+ 0x30, 0xed, 0x76, 0xf8, 0x4d, 0x77, 0xd9, 0x77,
+ 0x1, 0xce, 0xf8, 0xf1, 0x3, 0xf7, 0x20, 0xde,
+ 0x15, 0xf8, 0xa8, 0x85, 0x75, 0xa, 0xfb, 0x54,
+ 0xf8, 0x85, 0x80, 0xa, 0xfb, 0x2c, 0xfb, 0x6e,
+ 0xfb, 0x64, 0xf7, 0x36, 0x56, 0x40, 0xf7, 0x75,
+ 0xfb, 0x1f, 0xfb, 0x2c, 0xfb, 0x70, 0x5, 0xe,
+ 0x47, 0xc5, 0x76, 0xa3, 0xdc, 0xf8, 0x95, 0x77,
+ 0x1, 0xf8, 0xe9, 0xe5, 0x3, 0xf8, 0x66, 0xf7,
+ 0x82, 0x15, 0xf6, 0x2b, 0x69, 0x86, 0x74, 0x5a,
+ 0x8a, 0x66, 0x19, 0x93, 0xa4, 0xa7, 0x8d, 0xa6,
+ 0x1b, 0xbb, 0xbd, 0x80, 0x7e, 0xb6, 0x1f, 0x76,
+ 0xc8, 0x6c, 0xcf, 0x8e, 0xe5, 0x63, 0x80, 0x5d,
+ 0x69, 0x87, 0x63, 0x20, 0xeb, 0x18, 0xfb, 0x57,
+ 0x62, 0x15, 0xf7, 0x3b, 0x99, 0xfb, 0x97, 0xf7,
+ 0x6e, 0xfb, 0x3d, 0x7e, 0x5, 0xf7, 0x54, 0xb6,
+ 0x15, 0xf7, 0x98, 0xfb, 0x6e, 0x5, 0x8f, 0x88,
+ 0x77, 0xf7, 0x3e, 0x8b, 0x1a, 0xfb, 0x98, 0xf7,
+ 0x6e, 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xa2, 0xf7,
+ 0x7, 0xf8, 0xe5, 0x77, 0x1, 0xf9, 0x3f, 0xf3,
+ 0x3, 0xf7, 0xb9, 0xf7, 0x4c, 0x15, 0xae, 0xb1,
+ 0xcc, 0xa8, 0xbe, 0x1b, 0xc3, 0xbf, 0x63, 0x68,
+ 0xb4, 0x1f, 0xcc, 0x55, 0x3d, 0x82, 0x57, 0x48,
+ 0x6e, 0x51, 0x19, 0x96, 0xc6, 0xc9, 0x93, 0xc7,
+ 0x1b, 0xc5, 0xc3, 0x85, 0x7a, 0xc3, 0x1f, 0x59,
+ 0xec, 0x7b, 0xee, 0xf7, 0x28, 0x1a, 0x5f, 0x70,
+ 0x4e, 0x43, 0x8c, 0x3a, 0x4c, 0xc0, 0x18, 0x57,
+ 0xb8, 0x56, 0xb7, 0xd7, 0x1a, 0xb9, 0x99, 0xba,
+ 0xa4, 0xb2, 0x1e, 0xfb, 0x97, 0xf7, 0x6d, 0x5,
+ 0x71, 0x61, 0x79, 0x59, 0x5a, 0x1a, 0x64, 0x93,
+ 0x68, 0x9e, 0x68, 0x1e, 0x94, 0x74, 0x73, 0x8f,
+ 0x73, 0x1b, 0x49, 0x4f, 0x6e, 0x5e, 0x5c, 0x1f,
+ 0xe, 0xa7, 0xa4, 0x76, 0xf8, 0x89, 0x77, 0xf7,
+ 0x6d, 0x77, 0x1, 0xbb, 0xf9, 0x9b, 0x3, 0xf7,
+ 0x18, 0xf7, 0x7d, 0x15, 0x63, 0xf7, 0x44, 0xf7,
+ 0xad, 0x69, 0x5, 0x8b, 0x5d, 0xf7, 0x48, 0x8a,
+ 0x8b, 0xf8, 0x1d, 0xfb, 0x75, 0x8e, 0x1a, 0x88,
+ 0x7, 0x8b, 0xfb, 0xaa, 0xfb, 0x86, 0x8e, 0x8a,
+ 0x1e, 0x88, 0x5f, 0xf7, 0x51, 0x8b, 0x1e, 0xfb,
+ 0xc2, 0x32, 0x15, 0xf7, 0xa4, 0xb2, 0xc0, 0xfb,
+ 0x6e, 0xf7, 0xf4, 0xf7, 0xcb, 0xba, 0xec, 0xfc,
+ 0x7a, 0xf7, 0xb6, 0x4d, 0xfb, 0x0, 0xaf, 0xfb,
+ 0x16, 0xfb, 0x5d, 0xb4, 0x4d, 0x2b, 0x5, 0xe,
+ 0xf7, 0xe, 0xee, 0xb3, 0xf0, 0xf7, 0x50, 0x44,
+ 0x77, 0xf7, 0x55, 0xb3, 0x12, 0xf9, 0x96, 0xf7,
+ 0xa, 0x8b, 0xbb, 0x13, 0xdc, 0xf9, 0x39, 0xf7,
+ 0xed, 0x15, 0xb7, 0x9e, 0xbc, 0xa0, 0xc1, 0x93,
+ 0xbd, 0x9f, 0x19, 0xac, 0x98, 0xa8, 0xa4, 0xb2,
+ 0x1a, 0xbc, 0x5d, 0xaa, 0x5d, 0x51, 0x68, 0x5e,
+ 0x59, 0x78, 0x1e, 0x7a, 0x5d, 0x80, 0x7b, 0x5f,
+ 0x73, 0x8, 0xfd, 0x1e, 0xf7, 0x1d, 0x15, 0xf8,
+ 0xf0, 0xfb, 0x85, 0xc1, 0x75, 0xb1, 0x7a, 0xa3,
+ 0x52, 0x19, 0x58, 0xa1, 0xb1, 0x64, 0xc5, 0x1b,
+ 0xb9, 0xb7, 0xaa, 0xbc, 0xb2, 0x6c, 0xa6, 0x69,
+ 0x97, 0x1f, 0x57, 0x9e, 0x54, 0x92, 0x59, 0xa1,
+ 0x55, 0xa3, 0x18, 0x75, 0xc1, 0xfd, 0x8, 0xf7,
+ 0x31, 0x5, 0x93, 0xfc, 0x34, 0x15, 0xf8, 0xb7,
+ 0xf7, 0x31, 0x5, 0x8c, 0x7, 0xfb, 0x6, 0xb8,
+ 0xfc, 0x47, 0xfb, 0x54, 0x5, 0xf9, 0x84, 0xf7,
+ 0xe8, 0x15, 0xab, 0xae, 0xa2, 0xa9, 0xa5, 0xa6,
+ 0x7a, 0x6e, 0x6a, 0x6a, 0x74, 0x6c, 0x70, 0x70,
+ 0x9d, 0xa8, 0x1e, 0x8d, 0xfb, 0xaf, 0x15, 0xa9,
+ 0xa4, 0x9d, 0xa7, 0xa9, 0xaf, 0x78, 0x6a, 0x6e,
+ 0x76, 0x77, 0x6e, 0x6e, 0x63, 0x9f, 0xac, 0x1e,
+ 0xfb, 0x50, 0xf7, 0x28, 0x15, 0x13, 0xbc, 0x94,
+ 0x93, 0x93, 0x94, 0x94, 0x93, 0x83, 0x82, 0x82,
+ 0x83, 0x83, 0x82, 0x82, 0x83, 0x93, 0x94, 0x1e,
+ 0xe, 0x92, 0x3a, 0xa, 0xaf, 0xf9, 0x9b, 0x3,
+ 0xc2, 0xf3, 0x15, 0x87, 0x69, 0xa9, 0x74, 0xa2,
+ 0x78, 0x8, 0x81, 0x98, 0xb4, 0x6b, 0xb0, 0x1b,
+ 0xa5, 0xea, 0xe3, 0xa2, 0xa4, 0x1f, 0xf8, 0x4f,
+ 0xf8, 0x5d, 0x5, 0xa1, 0xa1, 0x90, 0x8b, 0xa8,
+ 0x1a, 0xcc, 0x7, 0xa8, 0x8b, 0x91, 0x6b, 0x79,
+ 0x83, 0x87, 0x81, 0x7e, 0x1e, 0xfb, 0x71, 0xfb,
+ 0x5f, 0x5, 0xfb, 0x71, 0xfb, 0x76, 0x83, 0x83,
+ 0x83, 0x1b, 0x6b, 0x87, 0xac, 0xa3, 0x87, 0x1f,
+ 0x82, 0xc1, 0x5, 0x88, 0x9f, 0x84, 0xad, 0x9f,
+ 0x1a, 0xbe, 0x4d, 0x85, 0x69, 0x7f, 0x1e, 0x76,
+ 0x84, 0x78, 0x72, 0x7e, 0x7b, 0x8, 0x6a, 0x64,
+ 0x8b, 0x92, 0x57, 0x1a, 0x5f, 0x8b, 0x6a, 0x90,
+ 0x60, 0x1e, 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xf4,
+ 0xa8, 0xf7, 0xb8, 0xe4, 0xe4, 0x54, 0xa, 0xa7,
+ 0xf7, 0x78, 0xa5, 0x3, 0xae, 0xf7, 0x29, 0x15,
+ 0xf7, 0x94, 0x22, 0x6, 0xf8, 0x6, 0xf7, 0xd9,
+ 0xfb, 0xb9, 0xf7, 0xab, 0x3e, 0x4c, 0x5, 0x71,
+ 0xfb, 0x3e, 0x7, 0x35, 0x43, 0x5, 0xa7, 0xfb,
+ 0xc9, 0x15, 0xf7, 0xb8, 0xf7, 0x92, 0xee, 0x7,
+ 0xf7, 0x96, 0xfb, 0x88, 0xfb, 0x96, 0xfb, 0x72,
+ 0x5, 0xd6, 0x7, 0xe, 0xae, 0xe9, 0x76, 0xe6,
+ 0xa5, 0xf7, 0x99, 0xcf, 0xeb, 0x77, 0x1, 0xf8,
+ 0xb8, 0xa3, 0x3, 0xb0, 0xf7, 0x38, 0x15, 0xf8,
+ 0x93, 0x30, 0x6, 0xf7, 0xb8, 0xf7, 0xba, 0xfb,
+ 0x7c, 0xf7, 0x8c, 0x4f, 0x56, 0x5, 0x60, 0xfc,
+ 0x50, 0x7, 0x46, 0x47, 0xd0, 0xfb, 0x16, 0x5,
+ 0x70, 0xfb, 0x17, 0x15, 0xc1, 0xf7, 0x17, 0x47,
+ 0xf7, 0x16, 0x5, 0xf8, 0x91, 0xc0, 0x6, 0xf7,
+ 0x4e, 0xfb, 0x4b, 0xfb, 0x4e, 0xfb, 0x53, 0x5,
+ 0xc7, 0x7, 0xe, 0xf7, 0x1b, 0xec, 0xb3, 0xf7,
+ 0x6b, 0xa6, 0xeb, 0xae, 0xb1, 0x77, 0x12, 0xf9,
+ 0x32, 0xb1, 0x65, 0xf7, 0x15, 0x9f, 0xb5, 0xbf,
+ 0xbb, 0x13, 0xf7, 0xf9, 0x36, 0xf8, 0xe, 0x15,
+ 0xb2, 0x88, 0x5, 0x87, 0xc2, 0xc4, 0x78, 0xc0,
+ 0x1b, 0xb6, 0xb3, 0xa3, 0xba, 0xbc, 0x59, 0xb1,
+ 0x5d, 0x67, 0x6a, 0x77, 0x73, 0x72, 0x1f, 0x68,
+ 0x6a, 0x7a, 0x83, 0x5b, 0x89, 0x8, 0xfc, 0x61,
+ 0xf4, 0x15, 0xf7, 0x31, 0x6, 0xf7, 0x76, 0xfb,
+ 0x50, 0xb6, 0x67, 0xa7, 0x71, 0x91, 0x50, 0x19,
+ 0x4d, 0x91, 0xaf, 0x4f, 0xd1, 0x1b, 0xb4, 0xb1,
+ 0xa7, 0xb6, 0xa8, 0x79, 0xa3, 0x75, 0x9c, 0x1f,
+ 0x61, 0xab, 0x5a, 0xa1, 0x64, 0xaf, 0x61, 0xb2,
+ 0x18, 0x87, 0xc2, 0xfb, 0x3d, 0xf5, 0x5, 0xf7,
+ 0x38, 0x9f, 0xfc, 0x42, 0x6, 0xfb, 0x63, 0x2c,
+ 0x15, 0xf8, 0xb0, 0x2c, 0x5, 0x8c, 0x7, 0x23,
+ 0xe2, 0xfc, 0x45, 0x9d, 0x5, 0xf9, 0xad, 0x6b,
+ 0x15, 0xa9, 0xa6, 0x98, 0xa5, 0xa9, 0xaa, 0x7a,
+ 0x6a, 0x6e, 0x73, 0x7a, 0x70, 0x6d, 0x6a, 0x9f,
+ 0xac, 0x1e, 0xfb, 0x6e, 0x67, 0x15, 0x94, 0x92,
+ 0x91, 0x94, 0x93, 0x94, 0x84, 0x83, 0x82, 0x82,
+ 0x84, 0x82, 0x82, 0x85, 0x93, 0x93, 0x1e, 0x13,
+ 0xfb, 0xf7, 0x13, 0xfb, 0x5c, 0x15, 0xa4, 0xa2,
+ 0x9e, 0xa3, 0xa8, 0xae, 0x71, 0x6c, 0x72, 0x77,
+ 0x76, 0x72, 0x6e, 0x66, 0xa7, 0xaa, 0x1e, 0xe,
+ 0x3e, 0x8b, 0xa9, 0xf8, 0xab, 0xa7, 0x6f, 0xf7,
+ 0x13, 0x12, 0xae, 0xa8, 0xf8, 0xa9, 0xa7, 0x6f,
+ 0xf7, 0x16, 0x13, 0xd8, 0xae, 0x16, 0xf8, 0xe2,
+ 0xf5, 0x6, 0x13, 0xb4, 0xf1, 0xf8, 0xde, 0xfc,
+ 0xdb, 0x6, 0x13, 0xd8, 0x28, 0xfb, 0x1, 0x7,
+ 0xa8, 0xfc, 0xc7, 0x15, 0xf8, 0xab, 0xf8, 0xa9,
+ 0xfc, 0xab, 0x7, 0xe, 0x3b, 0x8b, 0xab, 0xf8,
+ 0xad, 0xf7, 0xf, 0x1, 0xae, 0xaa, 0xf8, 0xa8,
+ 0xf7, 0x13, 0x7a, 0xa, 0xf8, 0xcd, 0x6, 0xf7,
+ 0xd, 0xf7, 0xb, 0x5, 0xf8, 0xd1, 0xfc, 0xc6,
+ 0x7, 0xfb, 0x14, 0xfb, 0x7, 0x5, 0xaa, 0xfc,
+ 0xb5, 0x6d, 0xa, 0x66, 0xa, 0xaf, 0xf7, 0xe9,
+ 0x15, 0xe6, 0x54, 0xf7, 0x3f, 0xfb, 0x1f, 0xf7,
+ 0x34, 0xfb, 0x5b, 0x9a, 0x96, 0x18, 0x5f, 0xf7,
+ 0xb, 0x33, 0xf7, 0x3d, 0x47, 0xe9, 0xca, 0xdf,
+ 0xe8, 0xf7, 0x65, 0xad, 0xde, 0x80, 0x98, 0x18,
+ 0xfb, 0x38, 0xfb, 0x56, 0xfb, 0x42, 0xfb, 0x27,
+ 0x3d, 0x5b, 0x8, 0xe, 0xfc, 0x41, 0x38, 0xa,
+ 0xf7, 0x1b, 0x8b, 0x3, 0xf7, 0x1b, 0x16, 0xf7,
+ 0x84, 0x6, 0x27, 0xf7, 0xee, 0xef, 0xf7, 0xee,
+ 0x5, 0xfb, 0x84, 0x6, 0x27, 0xfb, 0xee, 0x5,
+ 0xe, 0x3e, 0x8f, 0xf9, 0x3f, 0x1, 0xab, 0xf9,
+ 0x4e, 0x3, 0xb1, 0x93, 0x15, 0xa4, 0x90, 0xd6,
+ 0xa0, 0x9d, 0x95, 0xa3, 0x97, 0xd4, 0xd0, 0xed,
+ 0xf5, 0x91, 0x91, 0x9d, 0x89, 0x90, 0x85, 0xce,
+ 0x41, 0xda, 0x40, 0xa3, 0x73, 0x8, 0x64, 0xb3,
+ 0xab, 0x7e, 0xa3, 0x1b, 0x94, 0xcb, 0x95, 0x91,
+ 0x93, 0x1f, 0x8e, 0x97, 0x69, 0xa5, 0xfb, 0x42,
+ 0xf7, 0x45, 0x40, 0xe7, 0x19, 0xf7, 0x3c, 0xf7,
+ 0x4c, 0xd8, 0xf7, 0x3, 0x9f, 0xb1, 0x84, 0x99,
+ 0x18, 0x5b, 0x85, 0x38, 0x7d, 0x87, 0x83, 0x63,
+ 0x4e, 0x3f, 0x26, 0x3c, 0x39, 0x59, 0xb3, 0xfb,
+ 0x2f, 0xf7, 0x50, 0x6f, 0xc4, 0x8, 0x80, 0x6,
+ 0x7f, 0x82, 0x68, 0x5e, 0x81, 0x78, 0x84, 0x78,
+ 0x8b, 0x83, 0xa0, 0x65, 0x9d, 0x6c, 0xd9, 0x34,
+ 0xee, 0xfb, 0x2, 0x90, 0x84, 0x8b, 0x80, 0x86,
+ 0x84, 0x67, 0x5e, 0xfb, 0x4d, 0xfb, 0x5c, 0x6d,
+ 0x70, 0x8, 0xe, 0x3d, 0xa5, 0x76, 0xf9, 0x21,
+ 0x99, 0xa5, 0x77, 0x1, 0xa8, 0xf9, 0x53, 0x3,
+ 0xae, 0x94, 0x15, 0xa7, 0x8e, 0xea, 0x9a, 0xaf,
+ 0xa2, 0x9f, 0x97, 0xb2, 0xa6, 0xe0, 0xf6, 0x90,
+ 0x92, 0x9c, 0x89, 0x94, 0x82, 0xba, 0x58, 0xc1,
+ 0x4e, 0xa4, 0x74, 0x8, 0x64, 0xb6, 0xa9, 0x7e,
+ 0xa3, 0x1b, 0x97, 0xf7, 0x8, 0x94, 0x90, 0x95,
+ 0x1f, 0x8d, 0x9a, 0x66, 0xad, 0xfb, 0x32, 0xf7,
+ 0x4f, 0x49, 0xe5, 0x19, 0xe0, 0xe2, 0xf7, 0x31,
+ 0xf7, 0x4d, 0x9b, 0xb4, 0x82, 0x99, 0x18, 0x63,
+ 0x88, 0xfb, 0x13, 0x7a, 0x87, 0x84, 0x6c, 0x5a,
+ 0x42, 0x2a, 0x55, 0x55, 0x46, 0xd0, 0x2e, 0xf7,
+ 0x14, 0x6e, 0xc3, 0x8, 0x7d, 0x6, 0x73, 0x80,
+ 0x3b, 0x38, 0x83, 0x79, 0x84, 0x79, 0x8d, 0x7a,
+ 0xa0, 0x66, 0x9d, 0x6b, 0xc3, 0x47, 0xe6, 0x24,
+ 0x90, 0x85, 0x89, 0x7c, 0x86, 0x86, 0x67, 0x5d,
+ 0xfb, 0x32, 0xfb, 0x50, 0x6d, 0x70, 0x8, 0xe,
+ 0xfb, 0xa0, 0x5c, 0x76, 0xf9, 0x6d, 0x77, 0x1,
+ 0xf7, 0x50, 0xf7, 0x98, 0x3, 0xf7, 0xb4, 0xf7,
+ 0x96, 0x15, 0xfb, 0x34, 0xee, 0x9f, 0x67, 0x98,
+ 0x1b, 0x97, 0x9e, 0x98, 0x97, 0x8d, 0x1f, 0x89,
+ 0x8f, 0x88, 0x91, 0x8f, 0x1a, 0x91, 0x9b, 0x91,
+ 0x8f, 0x8f, 0x1e, 0x93, 0x7, 0x92, 0x8e, 0x8f,
+ 0x8f, 0x8e, 0x92, 0xfb, 0x1, 0xf7, 0x79, 0x18,
+ 0xe3, 0xf7, 0x13, 0xe3, 0xf3, 0x96, 0x95, 0x8,
+ 0x8f, 0x8f, 0x92, 0x91, 0x91, 0x1a, 0x92, 0x7b,
+ 0x96, 0x87, 0x95, 0x1e, 0x8d, 0x8a, 0x89, 0x91,
+ 0x88, 0x1b, 0x88, 0x85, 0x84, 0x88, 0x89, 0x1f,
+ 0x80, 0x81, 0x5, 0x90, 0x85, 0x67, 0x86, 0x85,
+ 0x1b, 0xfb, 0x31, 0xfb, 0x41, 0x3f, 0xf7, 0x2a,
+ 0x5, 0x93, 0x87, 0x88, 0x95, 0x80, 0x1b, 0x80,
+ 0x83, 0x7b, 0x81, 0x82, 0x89, 0x8, 0x8f, 0x86,
+ 0x87, 0x90, 0x84, 0x1b, 0x79, 0x7d, 0x82, 0x82,
+ 0x84, 0x1a, 0x82, 0x93, 0x7a, 0x8e, 0x83, 0x1e,
+ 0xd7, 0xfb, 0x54, 0x49, 0x3c, 0x3d, 0x25, 0x62,
+ 0x43, 0x19, 0x6c, 0x56, 0x7a, 0x73, 0x7e, 0x1a,
+ 0x88, 0x8e, 0x89, 0x8d, 0x89, 0x1e, 0x92, 0x85,
+ 0x87, 0x85, 0x89, 0x83, 0x8, 0x89, 0x85, 0x8a,
+ 0x87, 0x85, 0x1a, 0x80, 0x94, 0x80, 0x91, 0x82,
+ 0x1e, 0x81, 0x91, 0x8d, 0x81, 0x98, 0x1b, 0x99,
+ 0xa5, 0x8e, 0x94, 0x97, 0x1f, 0xe, 0xfb, 0x36,
+ 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x5f,
+ 0xf7, 0x64, 0x3, 0xf3, 0x93, 0x15, 0x9e, 0x76,
+ 0x5, 0x98, 0x6, 0x92, 0x94, 0xf7, 0x26, 0xf7,
+ 0x58, 0xb1, 0x5a, 0xa9, 0x53, 0xb7, 0x5e, 0x19,
+ 0x8e, 0x8e, 0x89, 0x8d, 0x9b, 0xa0, 0xad, 0x90,
+ 0x1b, 0x8e, 0x93, 0x83, 0x8a, 0x8d, 0x1f, 0x88,
+ 0x8f, 0x91, 0x85, 0x90, 0x1b, 0x90, 0x93, 0x94,
+ 0x8e, 0x8e, 0x1f, 0x92, 0x91, 0x94, 0x8e, 0x87,
+ 0x95, 0x8, 0x91, 0x89, 0x96, 0x99, 0x8d, 0x1b,
+ 0x93, 0x6, 0x94, 0x97, 0xa4, 0x91, 0x8e, 0x1f,
+ 0x92, 0x97, 0x8b, 0x8a, 0x8d, 0x98, 0xfb, 0x28,
+ 0xf7, 0x4b, 0x18, 0xf7, 0x4b, 0xf7, 0x70, 0xbb,
+ 0x89, 0xb5, 0x1a, 0x7c, 0xae, 0x86, 0x92, 0x8b,
+ 0x8c, 0x84, 0x89, 0x19, 0x7f, 0x88, 0x87, 0xab,
+ 0x90, 0x1a, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x1e,
+ 0x96, 0x92, 0x59, 0x92, 0x89, 0x1b, 0x7f, 0xfb,
+ 0x5b, 0xfb, 0x65, 0x70, 0x74, 0x1f, 0xfb, 0xa,
+ 0xf7, 0x45, 0x5, 0x92, 0x87, 0x83, 0x96, 0x82,
+ 0x1b, 0x7e, 0x7d, 0x80, 0x7e, 0x8c, 0x1f, 0x82,
+ 0x88, 0x81, 0x80, 0x88, 0x7d, 0x9d, 0x8c, 0x86,
+ 0x1e, 0x7d, 0x7e, 0x7e, 0x7d, 0x82, 0x7a, 0xa6,
+ 0x2f, 0xb7, 0x35, 0xb8, 0x37, 0xfb, 0x3b, 0xfb,
+ 0x5b, 0x18, 0x7e, 0x9b, 0x7b, 0x81, 0x7e, 0x7f,
+ 0x85, 0x84, 0x1a, 0x87, 0x93, 0x82, 0x8d, 0x88,
+ 0x1e, 0x92, 0x7f, 0x93, 0x7a, 0x98, 0x85, 0x8,
+ 0x8e, 0x93, 0x92, 0x90, 0x94, 0x1b, 0x8d, 0x8e,
+ 0x89, 0x88, 0x1f, 0x87, 0x88, 0x85, 0x87, 0x1a,
+ 0xe, 0x3f, 0x86, 0xb0, 0xf7, 0x7a, 0xaf, 0xdc,
+ 0xb0, 0xf7, 0x77, 0xb0, 0x1, 0xbc, 0xb0, 0xf7,
+ 0x6c, 0xae, 0xe3, 0xb0, 0xf7, 0x6b, 0xb0, 0x3,
+ 0xbc, 0xf7, 0x9a, 0x15, 0xf7, 0x91, 0xfb, 0x9f,
+ 0xf7, 0x34, 0xf7, 0x9f, 0xf7, 0x90, 0xf7, 0x2e,
+ 0xfb, 0x91, 0x6, 0x8c, 0xf7, 0x9c, 0x5, 0xfb,
+ 0x35, 0xfb, 0x9c, 0xfb, 0x90, 0x6, 0xb0, 0xfb,
+ 0xa, 0x15, 0xdc, 0xf7, 0x90, 0xf7, 0x9c, 0xe2,
+ 0xfb, 0x9c, 0xf7, 0x90, 0x3a, 0xfb, 0x90, 0xfb,
+ 0x9e, 0x33, 0xf7, 0x9e, 0x7, 0xe, 0x3c, 0xa0,
+ 0x76, 0xf7, 0x7c, 0xf7, 0x7a, 0xf7, 0x7a, 0x77,
+ 0x1, 0xf7, 0x9b, 0xf7, 0x7c, 0x3, 0xae, 0xf7,
+ 0x7c, 0x15, 0xf7, 0x78, 0xfb, 0x7c, 0xf7, 0x7c,
+ 0xf7, 0x7c, 0xf7, 0x7b, 0xf7, 0x7a, 0xfb, 0x7b,
+ 0xf7, 0x7a, 0xfb, 0x7c, 0xfb, 0x7a, 0xfb, 0x78,
+ 0x6, 0xe, 0x3b, 0xa0, 0x76, 0xf7, 0xb2, 0xf7,
+ 0xc, 0xf7, 0xb2, 0x77, 0x1, 0xf7, 0xd5, 0xf7,
+ 0x9, 0x3, 0xae, 0xf7, 0xa8, 0x15, 0xf7, 0xa8,
+ 0xfb, 0xa8, 0xf7, 0x1d, 0xf7, 0xa8, 0xf7, 0xa9,
+ 0xf7, 0x20, 0xfb, 0xa9, 0xf7, 0xa8, 0xfb, 0x1d,
+ 0xfb, 0xa8, 0xfb, 0xa8, 0x6, 0xf7, 0xa8, 0xfb,
+ 0x20, 0x15, 0xf7, 0x20, 0xf7, 0x1d, 0xfb, 0x20,
+ 0x7, 0xe, 0x36, 0xa0, 0x76, 0xf7, 0x7f, 0xf7,
+ 0x6d, 0xf7, 0x84, 0x77, 0x1, 0xf7, 0x9e, 0xf7,
+ 0x70, 0x3, 0xae, 0xf7, 0x7f, 0x15, 0xf7, 0x7b,
+ 0xfb, 0x7f, 0xf7, 0x71, 0xf7, 0x7f, 0xf7, 0x7d,
+ 0xf7, 0x6d, 0xfb, 0x7d, 0xf7, 0x84, 0xfb, 0x71,
+ 0xfb, 0x84, 0xfb, 0x7b, 0x6, 0xf7, 0x7b, 0xfb,
+ 0x6d, 0x15, 0xf7, 0x6d, 0xf7, 0x70, 0xfb, 0x6d,
+ 0x7, 0xe, 0x56, 0x7b, 0x76, 0xf7, 0xb9, 0xac,
+ 0x6a, 0xad, 0xaf, 0xa9, 0xaf, 0xae, 0xf7, 0xb6,
+ 0x77, 0x12, 0xf7, 0xcb, 0xad, 0xa2, 0xa9, 0xb8,
+ 0xaf, 0x69, 0xad, 0x13, 0xdf, 0x80, 0xf8, 0xe,
+ 0xf7, 0xc3, 0x15, 0x86, 0x53, 0x7b, 0x63, 0x7b,
+ 0x69, 0x8, 0x7a, 0x65, 0x7a, 0x6c, 0x64, 0x1a,
+ 0x6c, 0x98, 0x78, 0xa5, 0x79, 0x1e, 0x98, 0x83,
+ 0x9d, 0x81, 0x91, 0x85, 0x8, 0x89, 0x8d, 0x8f,
+ 0x83, 0x8f, 0x1b, 0x8f, 0x8f, 0x93, 0x8d, 0x8d,
+ 0x1f, 0x91, 0x91, 0x9d, 0x95, 0x98, 0x93, 0x8,
+ 0xa5, 0x9d, 0x98, 0x9e, 0xaa, 0x1a, 0xb7, 0x79,
+ 0xab, 0x79, 0xb2, 0x1e, 0x7c, 0xac, 0x7c, 0xb1,
+ 0x86, 0xbf, 0x95, 0x90, 0x93, 0x93, 0x90, 0x96,
+ 0xbe, 0x86, 0xb1, 0x7d, 0xab, 0x7c, 0x8, 0x78,
+ 0xb5, 0xab, 0x77, 0xb5, 0x1b, 0xaa, 0x9e, 0x98,
+ 0xa5, 0x9d, 0x1f, 0x93, 0x98, 0x95, 0x9d, 0x91,
+ 0x91, 0x8, 0x8d, 0x8d, 0x93, 0x8f, 0x8f, 0x1a,
+ 0x8f, 0x83, 0x8f, 0x89, 0x8d, 0x1e, 0x85, 0x91,
+ 0x81, 0x9d, 0x83, 0x98, 0x8, 0xa5, 0x79, 0x75,
+ 0x99, 0x6c, 0x1b, 0x5a, 0x6a, 0x74, 0x77, 0x5d,
+ 0x1f, 0x6e, 0x7e, 0x69, 0x80, 0x5e, 0x87, 0x87,
+ 0x94, 0x83, 0x93, 0x82, 0x8e, 0x8f, 0xbd, 0x98,
+ 0xb0, 0x99, 0xaa, 0x8, 0x9e, 0xb7, 0xa0, 0xac,
+ 0xb7, 0x1a, 0xaa, 0x7e, 0x9e, 0x71, 0x9d, 0x1e,
+ 0x7e, 0x93, 0x79, 0x95, 0x85, 0x91, 0x8, 0x8d,
+ 0x89, 0x87, 0x93, 0x87, 0x1b, 0x87, 0x87, 0x83,
+ 0x89, 0x89, 0x1f, 0x85, 0x85, 0x79, 0x81, 0x7e,
+ 0x83, 0x8, 0x71, 0x79, 0x7e, 0x78, 0x6c, 0x1a,
+ 0x5e, 0x9e, 0x6a, 0x9e, 0x62, 0x1e, 0x99, 0x6b,
+ 0x9a, 0x66, 0x8f, 0x58, 0x81, 0x87, 0x84, 0x84,
+ 0x87, 0x82, 0x53, 0x90, 0x64, 0x9b, 0x69, 0x9a,
+ 0x8, 0x9d, 0x64, 0x6c, 0x9c, 0x63, 0x1b, 0x6c,
+ 0x78, 0x7d, 0x71, 0x79, 0x1f, 0x83, 0x7e, 0x81,
+ 0x79, 0x85, 0x85, 0x8, 0x89, 0x89, 0x83, 0x87,
+ 0x87, 0x1a, 0x87, 0x93, 0x87, 0x8d, 0x89, 0x1e,
+ 0x91, 0x85, 0x95, 0x79, 0x93, 0x7e, 0x8, 0x71,
+ 0x9d, 0x9f, 0x80, 0xa9, 0x1b, 0xb5, 0xab, 0x9b,
+ 0x9c, 0xb0, 0x1f, 0xad, 0x9a, 0xb1, 0x9c, 0xc2,
+ 0x90, 0x8f, 0x81, 0x93, 0x83, 0x95, 0x86, 0x8,
+ 0x96, 0xf7, 0x7f, 0x15, 0x89, 0xa0, 0x7f, 0x96,
+ 0x80, 0x94, 0x8, 0x7f, 0x95, 0x80, 0x93, 0x9b,
+ 0x1a, 0x9c, 0x94, 0x96, 0x9b, 0x96, 0x1e, 0x92,
+ 0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8, 0x8b, 0x8f,
+ 0x93, 0x8c, 0x1e, 0x8d, 0x89, 0x8f, 0x87, 0x8c,
+ 0x8a, 0x8e, 0x87, 0x96, 0x84, 0x91, 0x86, 0x8,
+ 0x9b, 0x80, 0x92, 0x82, 0x7a, 0x1a, 0x77, 0x7b,
+ 0x83, 0x7d, 0x7d, 0x1e, 0x82, 0x82, 0x83, 0x81,
+ 0x89, 0x7a, 0x8, 0xf7, 0x59, 0xfb, 0x59, 0x15,
+ 0x8a, 0x8f, 0x9e, 0x8e, 0x96, 0x94, 0x94, 0x95,
+ 0x19, 0x98, 0x97, 0x93, 0x98, 0x9c, 0x1b, 0x9c,
+ 0x97, 0x83, 0x7b, 0x96, 0x1f, 0x8e, 0x84, 0x93,
+ 0x81, 0x8f, 0x87, 0x8c, 0x8a, 0x8f, 0x87, 0x8d,
+ 0x89, 0x8, 0x8a, 0x85, 0x88, 0x89, 0x8a, 0x1e,
+ 0x87, 0x87, 0x85, 0x7f, 0x86, 0x85, 0x8, 0x13,
+ 0xbf, 0x40, 0x7b, 0x80, 0x83, 0x84, 0x79, 0x1b,
+ 0x79, 0x83, 0x99, 0x98, 0x80, 0x1f, 0x82, 0x96,
+ 0x80, 0x95, 0x77, 0x8d, 0x8, 0xfc, 0x1f, 0x87,
+ 0x15, 0x79, 0x88, 0x81, 0x83, 0x82, 0x82, 0x8,
+ 0x7e, 0x7f, 0x83, 0x7d, 0x79, 0x1b, 0x78, 0x81,
+ 0x93, 0x9b, 0x80, 0x1f, 0x87, 0x92, 0x84, 0x96,
+ 0x87, 0x8f, 0x8, 0x8b, 0x85, 0x8e, 0x8c, 0x8d,
+ 0x1e, 0x8a, 0x8d, 0x91, 0x8e, 0x8b, 0x1a, 0x8f,
+ 0x90, 0x92, 0x95, 0x8f, 0x92, 0x8, 0x13, 0xdf,
+ 0x40, 0x9b, 0x96, 0x94, 0x92, 0x9c, 0x1b, 0x9c,
+ 0x93, 0x7e, 0x7f, 0x96, 0x1f, 0x95, 0x80, 0x97,
+ 0x80, 0xa0, 0x88, 0x8, 0xf7, 0x59, 0xfb, 0x59,
+ 0x15, 0x8f, 0x8d, 0x8e, 0x79, 0x93, 0x80, 0x94,
+ 0x82, 0x19, 0x98, 0x7e, 0x9a, 0x82, 0x8a, 0x79,
+ 0x8, 0x79, 0x83, 0x81, 0x7b, 0x80, 0x1e, 0x84,
+ 0x88, 0x80, 0x82, 0x88, 0x88, 0x8, 0x89, 0x89,
+ 0x88, 0x87, 0x8a, 0x1b, 0x8a, 0x86, 0x91, 0x8b,
+ 0x1f, 0x86, 0x8f, 0x82, 0x93, 0x83, 0x90, 0x8,
+ 0x7c, 0x95, 0x83, 0x93, 0x9c, 0x1a, 0x9d, 0x99,
+ 0x93, 0x98, 0x97, 0x1e, 0x96, 0x94, 0x95, 0x97,
+ 0x8e, 0x9e, 0x8, 0xe, 0xf7, 0x21, 0xee, 0xb3,
+ 0xef, 0xf7, 0x52, 0x42, 0x77, 0xf7, 0x58, 0xb2,
+ 0x12, 0xf9, 0x9b, 0xf7, 0xa, 0x8b, 0xbc, 0x13,
+ 0xdc, 0xf9, 0x3c, 0xf7, 0xef, 0x15, 0xb7, 0x9e,
+ 0xbd, 0xa1, 0xc2, 0x90, 0xbd, 0xa0, 0x19, 0xac,
+ 0x99, 0xa9, 0xa5, 0xb2, 0x1a, 0xbc, 0x5c, 0xa8,
+ 0x5e, 0x51, 0x67, 0x5f, 0x59, 0x78, 0x1e, 0x79,
+ 0x5d, 0x7f, 0x7a, 0x5f, 0x74, 0x8, 0xfd, 0x1c,
+ 0xf7, 0x20, 0x15, 0xf8, 0xf1, 0xfb, 0x8b, 0xc1,
+ 0x75, 0xaf, 0x7a, 0xa4, 0x52, 0x19, 0x58, 0xa1,
+ 0xb0, 0x65, 0xc6, 0x1b, 0xb9, 0xb8, 0xaa, 0xbc,
+ 0xb1, 0x6a, 0xa6, 0x6a, 0x97, 0x1f, 0x57, 0x9d,
+ 0x54, 0x93, 0x59, 0xa1, 0x55, 0xa3, 0x18, 0x76,
+ 0xc1, 0xfd, 0x8, 0xf7, 0x36, 0x5, 0x92, 0xfc,
+ 0x3a, 0x15, 0xf8, 0xb8, 0xf7, 0x33, 0x8a, 0x8c,
+ 0xfb, 0x2, 0xb7, 0xfc, 0x4b, 0xfb, 0x55, 0x5,
+ 0xf9, 0x84, 0xf7, 0xeb, 0x15, 0xab, 0xae, 0xa3,
+ 0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x69, 0x6c, 0x74,
+ 0x6a, 0x71, 0x6f, 0x9d, 0xa8, 0x1e, 0x8e, 0xfb,
+ 0xb1, 0x15, 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, 0xae,
+ 0x78, 0x6a, 0x6e, 0x77, 0x78, 0x6e, 0x6e, 0x63,
+ 0x9d, 0xad, 0x1e, 0xfc, 0xf2, 0xf7, 0xbc, 0x15,
+ 0xf8, 0x5a, 0xfb, 0x10, 0x9d, 0x5b, 0xc1, 0x74,
+ 0x7a, 0x7f, 0x7a, 0x95, 0x79, 0x93, 0x79, 0x92,
+ 0x19, 0xfc, 0x5d, 0xf7, 0x49, 0x5, 0x90, 0xfb,
+ 0xc2, 0x15, 0xf7, 0xb3, 0xf7, 0xe, 0xbd, 0x75,
+ 0xfb, 0xe4, 0x26, 0x5, 0xf8, 0x31, 0xf7, 0x31,
+ 0x15, 0x82, 0x92, 0x84, 0x94, 0x94, 0x92, 0x92,
+ 0x94, 0x1e, 0x13, 0xbc, 0x94, 0x84, 0x92, 0x82,
+ 0x82, 0x84, 0x84, 0x82, 0x1e, 0xe, 0x9e, 0xc2,
+ 0xea, 0xc2, 0x58, 0xf7, 0xa, 0xec, 0xf7, 0x2,
+ 0x5a, 0xc2, 0x54, 0xc3, 0xe9, 0xc2, 0x12, 0xd6,
+ 0xc2, 0x56, 0xc0, 0xeb, 0xc2, 0x58, 0xf7, 0x6,
+ 0xea, 0xf7, 0x8, 0x5a, 0xc3, 0x54, 0xc2, 0xe9,
+ 0xc2, 0x13, 0xd3, 0x52, 0xf7, 0x7e, 0xf7, 0x64,
+ 0x15, 0x95, 0x7a, 0x78, 0x91, 0x77, 0x1b, 0x52,
+ 0x5d, 0x5d, 0x52, 0x52, 0xb9, 0x5e, 0xc4, 0xc4,
+ 0xb9, 0xb9, 0xc4, 0x9f, 0x86, 0x9e, 0x80, 0x9b,
+ 0x1f, 0xd9, 0xd8, 0x94, 0x86, 0x94, 0x87, 0x95,
+ 0x89, 0x19, 0x13, 0xb2, 0xca, 0x98, 0x45, 0x5,
+ 0x9d, 0x6, 0x98, 0xd1, 0x96, 0x8d, 0x95, 0x8f,
+ 0x94, 0x91, 0x19, 0xd9, 0x3d, 0x5, 0x80, 0x7a,
+ 0x85, 0x78, 0x77, 0x1a, 0x53, 0xb8, 0x5d, 0xc4,
+ 0xc4, 0xb9, 0xb9, 0xc4, 0x1e, 0x13, 0xca, 0xd2,
+ 0xc3, 0x5d, 0xb9, 0x53, 0x78, 0x78, 0x85, 0x81,
+ 0x7b, 0x1e, 0x3d, 0xd9, 0x91, 0x94, 0x8e, 0x95,
+ 0x8e, 0x95, 0x19, 0xcd, 0x97, 0x5, 0x9d, 0x7,
+ 0x4b, 0x97, 0x89, 0x96, 0x87, 0x96, 0x85, 0x95,
+ 0x19, 0xd6, 0xd7, 0x5, 0x81, 0x9c, 0x9e, 0x85,
+ 0x9f, 0x1b, 0xc4, 0xb9, 0xb9, 0xc4, 0xc4, 0x5d,
+ 0xb8, 0x52, 0x1f, 0x13, 0xd2, 0xc6, 0x53, 0x5c,
+ 0x5e, 0x52, 0x78, 0x91, 0x78, 0x95, 0x7a, 0x1f,
+ 0x3e, 0x40, 0x81, 0x92, 0x81, 0x90, 0x7f, 0x8d,
+ 0x19, 0x7f, 0xc9, 0x5, 0x79, 0x6, 0x7f, 0x4c,
+ 0x80, 0x88, 0x81, 0x87, 0x81, 0x85, 0x19, 0x41,
+ 0xd6, 0x5, 0x95, 0x9b, 0x90, 0x9e, 0x9e, 0x1a,
+ 0xc4, 0x5d, 0xb9, 0x52, 0x52, 0x5e, 0x5e, 0x52,
+ 0x1e, 0x13, 0xc6, 0xa6, 0x52, 0xb8, 0x5d, 0xc4,
+ 0x9e, 0x9f, 0x91, 0x95, 0x9b, 0x1e, 0xd6, 0x3f,
+ 0x85, 0x81, 0x87, 0x80, 0x89, 0x80, 0x19, 0x48,
+ 0x7f, 0x5, 0x79, 0x7, 0xd0, 0x7e, 0x8e, 0x81,
+ 0x8e, 0x82, 0x91, 0x82, 0x19, 0xf7, 0x8f, 0xf7,
+ 0x9e, 0x15, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0x9f,
+ 0x77, 0x70, 0x70, 0x77, 0x77, 0x70, 0x70, 0x77,
+ 0x9f, 0xa6, 0x1e, 0xfb, 0x6e, 0xfb, 0x68, 0x15,
+ 0x13, 0xb2, 0xb2, 0xa5, 0xa0, 0xa1, 0xa5, 0xa5,
+ 0xa1, 0x75, 0x71, 0x71, 0x75, 0x74, 0x71, 0x71,
+ 0x76, 0xa3, 0xa4, 0x1e, 0xf7, 0x6d, 0xfb, 0x6f,
+ 0x15, 0x13, 0xca, 0xd2, 0xa5, 0xa1, 0xa1, 0xa5,
+ 0xa5, 0xa0, 0x75, 0x71, 0x71, 0x76, 0x76, 0x71,
+ 0x71, 0x75, 0xa0, 0xa5, 0x1e, 0xfc, 0x43, 0xf8,
+ 0x43, 0x15, 0xa5, 0xa1, 0xa0, 0x69, 0xa, 0xa1,
+ 0xa5, 0x1e, 0xfc, 0x43, 0x4, 0xa5, 0xa1, 0xa1,
+ 0x69, 0xa, 0xa0, 0xa5, 0x1e, 0xe, 0x9f, 0xf7,
+ 0x18, 0xfb, 0x4, 0x76, 0xf7, 0x77, 0xc8, 0x6c,
+ 0xf7, 0x15, 0x69, 0xd0, 0x48, 0xce, 0xea, 0xf7,
+ 0x10, 0xfb, 0x10, 0xf7, 0x11, 0x12, 0xd5, 0xf7,
+ 0x13, 0xfb, 0x12, 0xf7, 0x12, 0xea, 0xcd, 0x49,
+ 0xce, 0x6a, 0xf7, 0x14, 0x6b, 0xcb, 0x4d, 0xc9,
+ 0xea, 0xf7, 0x15, 0xfb, 0x15, 0xf7, 0x16, 0x13,
+ 0xa5, 0xa2, 0x80, 0xf7, 0xc4, 0xf7, 0xaa, 0x15,
+ 0x9e, 0x72, 0x6d, 0x95, 0x6c, 0x1b, 0x3c, 0x4a,
+ 0x4b, 0x3c, 0x3c, 0xcc, 0x4a, 0xda, 0xda, 0xcc,
+ 0xc9, 0xdb, 0xaa, 0x80, 0xaa, 0x79, 0xa4, 0x1f,
+ 0x13, 0x51, 0x55, 0x0, 0x9f, 0x9a, 0xa1, 0x92,
+ 0xa3, 0x1b, 0xa6, 0x9c, 0x83, 0x78, 0x9d, 0x1f,
+ 0x78, 0x72, 0x80, 0x6c, 0x6c, 0x1a, 0x3c, 0xce,
+ 0x4b, 0xd9, 0xda, 0xcb, 0xcb, 0xda, 0xda, 0x4a,
+ 0xcc, 0x3c, 0x6d, 0x6d, 0x81, 0x79, 0x73, 0x1e,
+ 0x13, 0xaa, 0x48, 0x80, 0x76, 0x9e, 0x84, 0x99,
+ 0xa8, 0x1a, 0xa4, 0x94, 0x9d, 0x9d, 0x9d, 0x1e,
+ 0x78, 0xa4, 0xaa, 0x80, 0xaa, 0x1b, 0xda, 0xcb,
+ 0xce, 0xd9, 0xda, 0x4b, 0xcb, 0x3c, 0x1f, 0x13,
+ 0x91, 0x52, 0x80, 0x3c, 0x4a, 0x49, 0x3c, 0x6d,
+ 0x95, 0x6d, 0x9d, 0x73, 0x1f, 0x78, 0x79, 0x7a,
+ 0x85, 0x71, 0x1b, 0x73, 0x77, 0x91, 0x9e, 0x7a,
+ 0x1f, 0x9d, 0xa4, 0x96, 0xa9, 0xaa, 0x1a, 0xda,
+ 0x4a, 0xcc, 0x3c, 0x3c, 0x4a, 0x4b, 0x3c, 0x1e,
+ 0x13, 0xa5, 0x48, 0x80, 0x3c, 0xcd, 0x4a, 0xda,
+ 0xa9, 0xa9, 0x95, 0x9d, 0xa3, 0x1e, 0x9d, 0x79,
+ 0x93, 0x7b, 0x71, 0x1a, 0x6f, 0x85, 0x7c, 0x77,
+ 0x77, 0x1e, 0x13, 0xa5, 0x52, 0x80, 0xf7, 0x4e,
+ 0xf7, 0x65, 0x42, 0xa, 0xfb, 0xb5, 0xf7, 0xb4,
+ 0x42, 0xa, 0xe, 0x5a, 0x8b, 0xf7, 0xc, 0x6d,
+ 0xf6, 0x22, 0xa7, 0xbf, 0x93, 0x83, 0x95, 0xb2,
+ 0xe8, 0x30, 0xe9, 0x66, 0xf7, 0xb, 0x39, 0xbd,
+ 0x63, 0xa4, 0x72, 0xf7, 0x17, 0x2f, 0xac, 0x6c,
+ 0xe5, 0xa3, 0xa7, 0x6f, 0xf6, 0x31, 0x96, 0xc0,
+ 0xa3, 0xe7, 0x77, 0x12, 0xf7, 0x24, 0xab, 0x6e,
+ 0xf4, 0x71, 0x95, 0xb4, 0xe8, 0x30, 0xf7, 0x20,
+ 0x38, 0xae, 0x68, 0xf7, 0xb, 0x35, 0xbd, 0x59,
+ 0xf7, 0x26, 0xfb, 0x18, 0xa4, 0x97, 0xe7, 0xa5,
+ 0xf5, 0x2f, 0x98, 0xbe, 0xa9, 0x7e, 0xa, 0xf8,
+ 0x4d, 0xf8, 0x14, 0x79, 0xa, 0x93, 0x9c, 0x86,
+ 0x90, 0x86, 0x92, 0x78, 0x81, 0x7c, 0x7b, 0x7b,
+ 0x7a, 0x83, 0x7a, 0x90, 0x86, 0x8, 0x9e, 0xfb,
+ 0x14, 0x78, 0xa, 0x83, 0x9c, 0x7b, 0x9c, 0x7c,
+ 0x9b, 0x78, 0x94, 0x86, 0x86, 0x86, 0x85, 0x93,
+ 0x7a, 0x9b, 0x7b, 0x8, 0xfb, 0x28, 0xf7, 0x28,
+ 0x78, 0xa, 0x82, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b,
+ 0x78, 0x95, 0x86, 0x84, 0x86, 0x86, 0x94, 0x7a,
+ 0x9b, 0x7b, 0x8, 0xd2, 0xfb, 0x74, 0x15, 0x13,
+ 0x44, 0x54, 0xea, 0xb, 0x94, 0x7f, 0x78, 0x93,
+ 0x7d, 0x1b, 0x6a, 0x71, 0x74, 0x6c, 0x70, 0x9f,
+ 0x71, 0xab, 0x1f, 0x13, 0x34, 0x54, 0xe8, 0x83,
+ 0x90, 0x91, 0x8c, 0x8c, 0x90, 0x1f, 0x8c, 0x8d,
+ 0x8b, 0x8c, 0x1b, 0x87, 0x85, 0x80, 0x80, 0x77,
+ 0x1a, 0x13, 0x94, 0x54, 0xe8, 0x83, 0x6d, 0xa6,
+ 0x72, 0xab, 0xac, 0xa6, 0xa4, 0xa9, 0xa0, 0x83,
+ 0x92, 0x87, 0x93, 0x1e, 0x93, 0x89, 0x5, 0x89,
+ 0x93, 0x92, 0x8b, 0x92, 0x1b, 0x13, 0x44, 0x54,
+ 0xe8, 0x23, 0xa7, 0x99, 0xa7, 0xa8, 0x1f, 0x13,
+ 0x44, 0x54, 0xe8, 0x83, 0xaa, 0x70, 0xa1, 0x6a,
+ 0x1e, 0x13, 0x8a, 0x24, 0xec, 0x1c, 0x7d, 0x74,
+ 0x85, 0x82, 0x81, 0x1f, 0x8c, 0xb5, 0x89, 0xc7,
+ 0xa1, 0xa1, 0xa4, 0xa4, 0xc4, 0x8b, 0xb7, 0x87,
+ 0x8, 0x81, 0x81, 0x84, 0x76, 0x7d, 0x1a, 0x6a,
+ 0xa3, 0x71, 0xaa, 0xa4, 0xa5, 0xa0, 0xa8, 0x91,
+ 0x8a, 0x91, 0x8a, 0x91, 0x1e, 0x8c, 0x8b, 0x8e,
+ 0x8c, 0x1a, 0x13, 0x91, 0x4, 0xec, 0x1b, 0x87,
+ 0x93, 0x95, 0x7f, 0x9d, 0x1b, 0xaa, 0xa4, 0xa7,
+ 0xab, 0xac, 0x72, 0xa5, 0x6c, 0x77, 0x86, 0x83,
+ 0x87, 0x83, 0x1f, 0x8c, 0x94, 0x5, 0x8c, 0x90,
+ 0x8b, 0x90, 0x90, 0x1a, 0x13, 0x94, 0x24, 0xec,
+ 0x1c, 0xac, 0x73, 0x99, 0x6a, 0x6d, 0x75, 0x72,
+ 0x6a, 0x1e, 0x13, 0x94, 0x51, 0xec, 0x1b, 0x7b,
+ 0x90, 0x77, 0x94, 0x7f, 0x1e, 0x54, 0x8a, 0x5e,
+ 0x8b, 0x74, 0xa2, 0x71, 0xa5, 0x91, 0xc8, 0x8a,
+ 0xb1, 0x8, 0x13, 0x94, 0x52, 0x6c, 0x1b, 0x82,
+ 0x95, 0xa0, 0x83, 0x98, 0x1b, 0xac, 0xa6, 0xa2,
+ 0xaa, 0xa6, 0x76, 0xa5, 0x6c, 0x1f, 0x13, 0x94,
+ 0x54, 0xe9, 0x1b, 0x86, 0x86, 0x8a, 0x8a, 0x85,
+ 0x1f, 0x88, 0x8a, 0x8b, 0x8a, 0x1b, 0x8f, 0x92,
+ 0x96, 0x96, 0x9e, 0x1a, 0xa9, 0x71, 0xa4, 0x6a,
+ 0x6b, 0x70, 0x72, 0x6d, 0x76, 0x92, 0x84, 0x8f,
+ 0x83, 0x1e, 0x83, 0x8d, 0x5, 0x8d, 0x84, 0x85,
+ 0x8b, 0x86, 0x1b, 0x7e, 0xa, 0x6d, 0x7d, 0x70,
+ 0x6d, 0x6c, 0xa4, 0x75, 0xac, 0x9b, 0x9f, 0x91,
+ 0x94, 0x97, 0x1f, 0x8a, 0x69, 0x92, 0x4e, 0x6f,
+ 0x6f, 0x7a, 0x7a, 0x45, 0x85, 0x65, 0x8c, 0x8,
+ 0x13, 0x91, 0x4, 0xd4, 0x1b, 0x94, 0x97, 0x92,
+ 0x9e, 0x99, 0x1a, 0xac, 0x74, 0xa5, 0x6d, 0x72,
+ 0x70, 0x79, 0x6f, 0x84, 0x8a, 0x84, 0x8d, 0x83,
+ 0x1e, 0x8a, 0x8b, 0x8a, 0x88, 0x1a, 0x8f, 0x83,
+ 0x83, 0x97, 0x77, 0x1b, 0x6c, 0x72, 0x70, 0x6a,
+ 0x6a, 0xa4, 0x71, 0xaa, 0xa0, 0x91, 0x93, 0x8f,
+ 0x91, 0x1f, 0x7e, 0xa, 0x8a, 0x82, 0x5, 0x8a,
+ 0x86, 0x8b, 0x87, 0x87, 0x1a, 0x69, 0xa2, 0x7c,
+ 0xad, 0x1e, 0x13, 0x92, 0x54, 0xd4, 0x1b, 0xaa,
+ 0xa0, 0xa4, 0xac, 0x9b, 0x86, 0x9f, 0x82, 0x97,
+ 0x1f, 0xb3, 0x8e, 0xc4, 0x8d, 0xa5, 0x71, 0x8,
+ 0xa4, 0x72, 0x88, 0x49, 0x68, 0x1a, 0x30, 0xc3,
+ 0x79, 0xa, 0x94, 0x9c, 0x86, 0x91, 0x86, 0x90,
+ 0x78, 0x82, 0x7c, 0x7b, 0x7b, 0x7a, 0x82, 0x7a,
+ 0x90, 0x86, 0x8, 0xf7, 0xa5, 0xf5, 0x50, 0xa,
+ 0x1e, 0x13, 0x94, 0x8c, 0xe8, 0x4b, 0x51, 0xa,
+ 0xfb, 0x58, 0xf7, 0x56, 0x44, 0xa, 0xfb, 0x56,
+ 0xfb, 0x58, 0x44, 0xa, 0xf7, 0x59, 0xfb, 0x56,
+ 0x44, 0xa, 0xe, 0x5d, 0x9b, 0x76, 0xf7, 0xd1,
+ 0xc3, 0xf7, 0xd1, 0x77, 0x1, 0xf8, 0x6, 0xbf,
+ 0x3, 0xf7, 0x94, 0xf7, 0x57, 0x15, 0xf7, 0x20,
+ 0xfb, 0x5c, 0xf7, 0x20, 0xf7, 0x5c, 0xf7, 0x6f,
+ 0xf7, 0x25, 0xfb, 0x6f, 0xf7, 0x25, 0xfb, 0x20,
+ 0xf7, 0x5c, 0xfb, 0x20, 0xfb, 0x5c, 0xfb, 0x6f,
+ 0xfb, 0x25, 0x5, 0xf8, 0x15, 0xad, 0x15, 0xa3,
+ 0xc2, 0xc8, 0xa4, 0x90, 0x8f, 0x88, 0x86, 0x72,
+ 0x4f, 0x51, 0x73, 0x87, 0x8a, 0x8d, 0x8f, 0x1e,
+ 0x52, 0x85, 0x15, 0x73, 0x4f, 0xc5, 0xa4, 0x90,
+ 0x8f, 0x8e, 0x90, 0xa4, 0xc2, 0x4e, 0x73, 0x87,
+ 0x8a, 0x89, 0x87, 0x1f, 0xc4, 0x4d, 0x15, 0x8f,
+ 0x8c, 0x8d, 0x8f, 0xa3, 0xc7, 0x51, 0x72, 0x86,
+ 0x87, 0x88, 0x86, 0x72, 0x54, 0xc8, 0xa3, 0x1e,
+ 0xfb, 0x21, 0x3e, 0x15, 0xa4, 0xc7, 0xc5, 0xa3,
+ 0x8f, 0x8c, 0x89, 0x87, 0x73, 0x54, 0x4e, 0x72,
+ 0x86, 0x87, 0x8e, 0x90, 0x1e, 0xe, 0x5e, 0x78,
+ 0xf9, 0x54, 0x1, 0xb1, 0xf9, 0x62, 0x3, 0xf7,
+ 0x99, 0xf7, 0x58, 0x15, 0xf7, 0x1c, 0xfb, 0x6b,
+ 0xf7, 0x27, 0xf7, 0x73, 0xf7, 0x68, 0xf7, 0x1c,
+ 0xfb, 0x6e, 0xf7, 0x22, 0xfb, 0x21, 0xf7, 0x5f,
+ 0xfb, 0x1e, 0xfb, 0x5f, 0xfb, 0x71, 0xfb, 0x22,
+ 0x5, 0xf7, 0x7e, 0xfb, 0x1a, 0x15, 0x9e, 0xca,
+ 0xfb, 0x36, 0xbc, 0x92, 0x9d, 0x83, 0x9d, 0xf7,
+ 0x33, 0xc7, 0x79, 0xc6, 0xc4, 0x78, 0xbc, 0xf7,
+ 0x37, 0xa1, 0x7e, 0xa0, 0x99, 0xbf, 0xfb, 0x33,
+ 0xc8, 0x9a, 0x79, 0x52, 0xf7, 0x35, 0x55, 0x84,
+ 0x78, 0x95, 0x7a, 0xfb, 0x33, 0x55, 0x9e, 0x4d,
+ 0x4f, 0xa1, 0x4f, 0xfb, 0x37, 0x77, 0x93, 0x79,
+ 0x82, 0x5c, 0xf7, 0x32, 0x5, 0xe, 0x74, 0x3a,
+ 0xa, 0xf7, 0xd6, 0xf7, 0x78, 0x3, 0xf7, 0x45,
+ 0x7d, 0x15, 0xf7, 0x7b, 0xf7, 0x3d, 0xf7, 0x7c,
+ 0xfb, 0x3d, 0x31, 0xf7, 0xa9, 0xf7, 0x7c, 0xf7,
+ 0x41, 0x5, 0xfb, 0xb5, 0x6, 0x36, 0xf7, 0xa1,
+ 0x35, 0xfb, 0xa1, 0x5, 0xfb, 0xb3, 0x6, 0xf7,
+ 0x7e, 0xfb, 0x41, 0x5, 0xe, 0x7b, 0x92, 0x76,
+ 0xf8, 0x4c, 0xa6, 0xf7, 0x90, 0x54, 0xa, 0xf9,
+ 0x84, 0x3, 0xf7, 0x46, 0x7d, 0x15, 0xf7, 0x7d,
+ 0xf7, 0x2d, 0xf7, 0x7d, 0xfb, 0x2d, 0x45, 0xf7,
+ 0xa3, 0xf7, 0x69, 0xf7, 0x4f, 0xfb, 0xa8, 0x9e,
+ 0x27, 0xf7, 0x86, 0x27, 0xfb, 0x86, 0xfb, 0xa8,
+ 0x78, 0xf7, 0x60, 0xfb, 0x4f, 0x5, 0x63, 0xfb,
+ 0x86, 0x15, 0xe6, 0xf7, 0x8e, 0xfb, 0x71, 0xf7,
+ 0x3b, 0xf7, 0xa1, 0x80, 0xd4, 0xf7, 0x90, 0xd4,
+ 0xfb, 0x90, 0xf7, 0xa1, 0x96, 0xfb, 0x78, 0xfb,
+ 0x3b, 0xec, 0xfb, 0x8e, 0xfb, 0x67, 0xf7, 0x44,
+ 0x5, 0xe, 0x59, 0x92, 0x76, 0xf9, 0x45, 0xa9,
+ 0x8b, 0x54, 0xa, 0xb9, 0xf9, 0xd, 0xb3, 0x3,
+ 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x5b, 0xf7, 0x37,
+ 0xfb, 0x33, 0xf7, 0x59, 0xf7, 0x5b, 0xf7, 0x34,
+ 0xf7, 0x36, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x34,
+ 0xf7, 0x35, 0xfb, 0x5a, 0xfb, 0x5d, 0xfb, 0x34,
+ 0xfb, 0x35, 0xfb, 0x5c, 0x1e, 0xf7, 0x32, 0xfb,
+ 0xa3, 0x15, 0xda, 0xf7, 0x7e, 0xfb, 0x53, 0xf7,
+ 0x24, 0x5, 0xf7, 0x84, 0x6, 0xd6, 0xf7, 0x74,
+ 0xd7, 0xfb, 0x74, 0x5, 0xf7, 0x86, 0x6, 0xfb,
+ 0x59, 0xfb, 0x24, 0xd4, 0xfb, 0x7e, 0xfb, 0x56,
+ 0xf7, 0x25, 0x5, 0xe, 0x8d, 0x92, 0x76, 0xf7,
+ 0x53, 0xad, 0x8b, 0xf7, 0x4f, 0xf7, 0xc7, 0x77,
+ 0x1, 0xf7, 0xb1, 0xac, 0x8b, 0xf7, 0x50, 0x8b,
+ 0xaf, 0x3, 0xf7, 0x49, 0x7d, 0x15, 0xf7, 0x7e,
+ 0xf7, 0x53, 0xf7, 0x84, 0xfb, 0x53, 0xfb, 0x5,
+ 0xf7, 0xb0, 0xf7, 0x9d, 0xf7, 0x26, 0xfb, 0xcc,
+ 0x89, 0x36, 0xf7, 0xb7, 0x3b, 0xfb, 0xb7, 0xfb,
+ 0xbb, 0x8d, 0xf7, 0x8e, 0xfb, 0x26, 0x5, 0xac,
+ 0xb3, 0x15, 0xbf, 0xb6, 0xaf, 0xbf, 0xbd, 0xb6,
+ 0x66, 0x58, 0x59, 0x63, 0x5a, 0x56, 0x58, 0x5f,
+ 0xb9, 0xc0, 0x1e, 0xe, 0x7b, 0xb2, 0x76, 0xf7,
+ 0x7b, 0xf7, 0x4a, 0x86, 0xb0, 0xf7, 0xa7, 0x77,
+ 0x12, 0xf7, 0xd4, 0xf7, 0x4a, 0x13, 0xb8, 0xf7,
+ 0x45, 0x35, 0xa, 0xec, 0x15, 0x13, 0xd8, 0x59,
+ 0xb4, 0x62, 0xbd, 0xbd, 0xb4, 0xb4, 0xbd, 0xbd,
+ 0x62, 0xb4, 0x59, 0x59, 0x62, 0x62, 0x59, 0x1e,
+ 0xe, 0xfb, 0xc, 0xc6, 0xa8, 0xf7, 0x5c, 0xc7,
+ 0x9e, 0xe1, 0xb3, 0xaf, 0x75, 0x77, 0xf7, 0x39,
+ 0x77, 0x12, 0xf8, 0xae, 0xa2, 0xce, 0xa5, 0x13,
+ 0xef, 0xf8, 0xae, 0xf8, 0x6a, 0x15, 0x90, 0x8d,
+ 0x97, 0x90, 0x8e, 0x8f, 0x8f, 0x9a, 0x8b, 0xa1,
+ 0x8a, 0x9c, 0x7b, 0x7b, 0x73, 0x82, 0x7e, 0x88,
+ 0x8, 0x8b, 0x9f, 0x71, 0x95, 0x80, 0x1e, 0xfc,
+ 0xc, 0x97, 0x15, 0x97, 0x96, 0xd0, 0xb5, 0xdb,
+ 0xaf, 0xbb, 0xa1, 0xc7, 0xa2, 0xa6, 0x94, 0x8,
+ 0x9c, 0x91, 0x94, 0x8d, 0x90, 0x1a, 0x94, 0x52,
+ 0x90, 0x7e, 0x7e, 0x4d, 0x73, 0x68, 0x3b, 0x1e,
+ 0x3b, 0x68, 0x34, 0x5f, 0x7f, 0x1a, 0x80, 0xa4,
+ 0x83, 0x99, 0x85, 0x1e, 0x99, 0x85, 0x92, 0x8d,
+ 0x95, 0x94, 0x8, 0xfb, 0xe, 0x4c, 0x15, 0x75,
+ 0x95, 0xaf, 0x6d, 0xaf, 0x1b, 0xaf, 0xbd, 0xaf,
+ 0x96, 0x93, 0x1f, 0x91, 0x98, 0x95, 0xa2, 0x9e,
+ 0x99, 0x9e, 0x98, 0xb2, 0xa1, 0xab, 0x9b, 0xa2,
+ 0x97, 0xb3, 0x9f, 0xb1, 0x8c, 0x9c, 0x8c, 0xa1,
+ 0x85, 0x9c, 0x78, 0xa2, 0x91, 0xb0, 0x9c, 0x8a,
+ 0x95, 0x8, 0xa3, 0x8a, 0x6f, 0xbd, 0x7e, 0x1b,
+ 0x82, 0x26, 0x66, 0x6a, 0x42, 0x1f, 0x42, 0x6a,
+ 0x47, 0x5c, 0x83, 0x86, 0x8, 0x86, 0x83, 0x7b,
+ 0x79, 0x81, 0x1b, 0x81, 0x79, 0x94, 0x90, 0x7e,
+ 0x1f, 0x83, 0x8e, 0x79, 0x97, 0x83, 0x95, 0x7e,
+ 0x7f, 0x81, 0x7d, 0x80, 0x5c, 0x8, 0xf7, 0xf,
+ 0xfb, 0x29, 0x15, 0x8b, 0xf7, 0x7c, 0xfb, 0x4d,
+ 0x97, 0x81, 0x1e, 0x81, 0x97, 0x9a, 0x85, 0x92,
+ 0x1b, 0x92, 0x90, 0x8e, 0x92, 0x96, 0x1f, 0x96,
+ 0x92, 0xf7, 0x2c, 0xf4, 0x96, 0x94, 0x8, 0x96,
+ 0x94, 0x8f, 0x9d, 0x98, 0x98, 0x8c, 0x94, 0x9d,
+ 0x1a, 0x9d, 0x86, 0x9b, 0x7a, 0xa3, 0x1e, 0x7a,
+ 0xa3, 0x29, 0xf7, 0x9, 0x80, 0x98, 0x83, 0x95,
+ 0x7f, 0xa0, 0x7a, 0x94, 0x8, 0x13, 0xf7, 0x83,
+ 0x8f, 0x82, 0x8f, 0x7d, 0x8a, 0x77, 0x8a, 0x66,
+ 0x7e, 0x6d, 0x7b, 0x78, 0x81, 0x61, 0x77, 0x72,
+ 0x78, 0x77, 0x7b, 0x84, 0x72, 0x88, 0x74, 0x84,
+ 0x54, 0x87, 0x79, 0x84, 0x83, 0x80, 0x7e, 0x73,
+ 0x7d, 0x78, 0x87, 0x8, 0xfb, 0x15, 0xf7, 0x11,
+ 0x15, 0x8c, 0x7a, 0x8d, 0x6b, 0x90, 0x75, 0x8,
+ 0x77, 0x97, 0xb3, 0x77, 0xa9, 0x1b, 0xa9, 0xa8,
+ 0x94, 0x9e, 0x9e, 0x1f, 0x92, 0xa1, 0x8f, 0xa9,
+ 0x8e, 0xa2, 0x8, 0x80, 0x81, 0x67, 0x6b, 0x5d,
+ 0x1b, 0x5d, 0x6c, 0xaf, 0x9a, 0x7e, 0x1f, 0xf8,
+ 0x44, 0x8e, 0x15, 0x76, 0xa2, 0xae, 0xa0, 0x9f,
+ 0x74, 0x5, 0x87, 0x54, 0x15, 0x79, 0xa0, 0xac,
+ 0xa0, 0x9c, 0x76, 0x5, 0x88, 0x55, 0x15, 0x79,
+ 0x9e, 0xaa, 0xa1, 0x9d, 0x77, 0x5, 0x53, 0x4,
+ 0x77, 0xa2, 0xa9, 0xa0, 0x9f, 0x77, 0x5, 0xfb,
+ 0x40, 0xb9, 0x15, 0x75, 0xa2, 0xaf, 0xa3, 0xa1,
+ 0x73, 0x5, 0x86, 0x51, 0x15, 0x77, 0xa0, 0xae,
+ 0xa3, 0xa0, 0x75, 0x5, 0x86, 0x50, 0x15, 0x78,
+ 0x9f, 0xaf, 0xa4, 0x9d, 0x78, 0x5, 0x86, 0x50,
+ 0x15, 0x76, 0xa3, 0xad, 0xa4, 0xa0, 0x73, 0x5,
+ 0xfb, 0x91, 0xf1, 0x15, 0x97, 0x93, 0xf7, 0x17,
+ 0xd9, 0x94, 0x90, 0x8, 0x90, 0x94, 0x94, 0x8f,
+ 0x92, 0x1b, 0x92, 0x8c, 0x88, 0x86, 0x86, 0x84,
+ 0x88, 0x7e, 0x83, 0x1f, 0x6e, 0x7a, 0x22, 0x4d,
+ 0x81, 0x85, 0x8, 0x84, 0x80, 0x7e, 0x7e, 0x80,
+ 0x1b, 0x85, 0x88, 0x8b, 0x91, 0x93, 0x90, 0x8e,
+ 0x9d, 0x97, 0x1f, 0xd7, 0x58, 0x15, 0x78, 0xa2,
+ 0xab, 0x9f, 0x9f, 0x74, 0x5, 0x8e, 0x51, 0x15,
+ 0x76, 0xa2, 0xa8, 0xa0, 0xa1, 0x74, 0x5, 0x8c,
+ 0x53, 0x15, 0x79, 0xa0, 0xa8, 0x9e, 0x9d, 0x78,
+ 0x5, 0x8a, 0x54, 0x15, 0x77, 0xa2, 0xa9, 0xa1,
+ 0xa1, 0x72, 0x5, 0x42, 0x48, 0x15, 0x83, 0x95,
+ 0x2f, 0xf4, 0x7c, 0x9c, 0x7c, 0x9c, 0x8c, 0x94,
+ 0x8f, 0x8e, 0x90, 0x8f, 0x9c, 0x7c, 0x93, 0x82,
+ 0x95, 0x80, 0xe6, 0x20, 0x92, 0x84, 0x8, 0x84,
+ 0x92, 0x93, 0x87, 0x8f, 0x1b, 0x8f, 0x95, 0x91,
+ 0x90, 0x92, 0x1f, 0x92, 0x90, 0xf7, 0x6, 0xd8,
+ 0x92, 0x90, 0x8, 0x90, 0x92, 0x94, 0x92, 0x8f,
+ 0x1b, 0x8f, 0x91, 0x88, 0x86, 0x86, 0x82, 0x84,
+ 0x82, 0x86, 0x1f, 0x82, 0x86, 0xfb, 0x16, 0x33,
+ 0x84, 0x86, 0x84, 0x86, 0x89, 0x89, 0x89, 0x85,
+ 0x89, 0x85, 0x8c, 0x70, 0x8a, 0x82, 0x8, 0x78,
+ 0x88, 0x8b, 0x79, 0x86, 0x1b, 0x86, 0x88, 0x95,
+ 0x9b, 0x93, 0x88, 0x9e, 0x8a, 0x9d, 0x1f, 0x8a,
+ 0x95, 0x86, 0x94, 0x83, 0x95, 0x8, 0xe, 0x85,
+ 0xb2, 0x76, 0xf8, 0x2, 0xb5, 0x8b, 0xb0, 0xf7,
+ 0xa7, 0x77, 0x1, 0xf7, 0x4a, 0x35, 0xa, 0x6e,
+ 0x15, 0xe6, 0xd7, 0xe6, 0x3f, 0x5f, 0xf7, 0x3,
+ 0xf0, 0xca, 0xfb, 0xb, 0x83, 0x6e, 0xf7, 0x7,
+ 0x6e, 0xfb, 0x7, 0xfb, 0xb, 0x93, 0xf0, 0x4c,
+ 0x5, 0xe, 0x74, 0xb2, 0x76, 0xf7, 0x75, 0xa9,
+ 0xf7, 0x19, 0xa5, 0x85, 0xb0, 0xf7, 0xa7, 0x77,
+ 0x12, 0x13, 0xe8, 0xf7, 0x42, 0x4f, 0xa, 0x5,
+ 0x13, 0xd8, 0x32, 0xa, 0xfb, 0x10, 0x42, 0x15,
+ 0xf7, 0x10, 0xf2, 0xf7, 0x10, 0x24, 0x4f, 0xf7,
+ 0x29, 0xf7, 0x1c, 0xe1, 0xfb, 0x34, 0x81, 0x63,
+ 0xf7, 0x30, 0x63, 0xfb, 0x30, 0xfb, 0x34, 0x95,
+ 0xf7, 0x1c, 0x35, 0x5, 0xe, 0x83, 0x92, 0x76,
+ 0xf8, 0x3f, 0xa0, 0xf7, 0xa3, 0x77, 0x1, 0xf8,
+ 0x38, 0xd9, 0x3, 0xf7, 0x3f, 0x7d, 0x15, 0xf7,
+ 0x8d, 0xf7, 0x44, 0xf7, 0x95, 0xfb, 0x44, 0x25,
+ 0xf7, 0xae, 0xf7, 0x71, 0xf7, 0x3a, 0x5, 0xfb,
+ 0xad, 0x6, 0x2c, 0xf7, 0xa3, 0x2a, 0xfb, 0xa3,
+ 0x5, 0xfb, 0xb4, 0x6, 0xf7, 0x7d, 0xfb, 0x3a,
+ 0x5, 0xf7, 0x2c, 0xba, 0x15, 0x38, 0xed, 0xde,
+ 0xf7, 0x8d, 0x5, 0xfb, 0xef, 0x4, 0xd9, 0xed,
+ 0x5, 0xf7, 0x92, 0x6, 0xfc, 0x61, 0xfb, 0x1f,
+ 0x15, 0xfb, 0x69, 0xf7, 0x24, 0xf7, 0xea, 0x24,
+ 0x5, 0x8b, 0x4, 0xf7, 0x19, 0x62, 0xf2, 0xfb,
+ 0x9f, 0x5, 0xfc, 0x61, 0x95, 0x15, 0xf7, 0x75,
+ 0xf7, 0xbd, 0x5, 0xfb, 0x16, 0x7, 0xe, 0xdf,
+ 0x92, 0x76, 0xf8, 0x47, 0xa0, 0xf7, 0x9b, 0x77,
+ 0x1, 0xf7, 0xd3, 0xf7, 0xed, 0x3, 0xf7, 0x43,
+ 0x92, 0x15, 0xf7, 0xd, 0x76, 0xf7, 0x47, 0xf7,
+ 0x17, 0xf7, 0x35, 0xfb, 0x12, 0xf7, 0xf, 0x86,
+ 0x2c, 0xf7, 0xa9, 0xf7, 0x74, 0xf7, 0x32, 0x4e,
+ 0xa0, 0x5, 0xfb, 0x73, 0x6, 0x37, 0xf7, 0x89,
+ 0xfb, 0x4, 0x9d, 0x32, 0xfb, 0x9b, 0x5, 0xfb,
+ 0xb0, 0x6, 0xf7, 0x76, 0xfb, 0x41, 0x5, 0x55,
+ 0xfb, 0x7c, 0x15, 0xdb, 0xf7, 0x86, 0xfb, 0x53,
+ 0xf7, 0x22, 0x5, 0xf7, 0x84, 0x6, 0xdc, 0xf7,
+ 0x8b, 0xdd, 0xfb, 0x8b, 0x5, 0xf7, 0x8c, 0x6,
+ 0xfb, 0x5f, 0xfb, 0x22, 0xda, 0xfb, 0x91, 0xfb,
+ 0x62, 0xf7, 0x38, 0x5, 0xe, 0x2c, 0x9d, 0x76,
+ 0xf9, 0x4b, 0x77, 0x1, 0xbf, 0xf9, 0x14, 0x3,
+ 0xd2, 0xf7, 0x3, 0x15, 0xf7, 0x82, 0xf7, 0x9,
+ 0xf7, 0x2d, 0xfb, 0x7b, 0xa0, 0x98, 0x68, 0xf7,
+ 0xa0, 0xf7, 0x88, 0xd6, 0x5, 0xa3, 0x7, 0xfb,
+ 0x8c, 0xb3, 0xa2, 0xf7, 0x9e, 0x70, 0x94, 0xfb,
+ 0x1e, 0xfb, 0x86, 0xfb, 0x7f, 0xf7, 0x14, 0x7c,
+ 0x76, 0xf7, 0x38, 0xfb, 0x71, 0xfb, 0x36, 0xfb,
+ 0x5d, 0x5, 0xe, 0xfb, 0x8, 0x9a, 0x76, 0xf7,
+ 0x99, 0xf7, 0x3f, 0xf7, 0x9b, 0x77, 0x1, 0xf7,
+ 0x85, 0x96, 0x8b, 0xf7, 0x3c, 0x3, 0xc4, 0xf7,
+ 0x3, 0x15, 0xf7, 0x91, 0xf7, 0x20, 0xf7, 0x2f,
+ 0xfb, 0x95, 0x9e, 0x99, 0x4f, 0xf7, 0xac, 0xf7,
+ 0x9b, 0xc9, 0x5, 0xa7, 0x7, 0xfb, 0xa2, 0x9e,
+ 0xb8, 0xf7, 0xab, 0x6f, 0x98, 0xfb, 0x16, 0xfb,
+ 0xa0, 0xfb, 0x8f, 0xf7, 0x2e, 0x7a, 0x76, 0xf7,
+ 0x61, 0xfb, 0x71, 0xfb, 0x5a, 0xfb, 0x5c, 0x5,
+ 0xf7, 0x65, 0xf7, 0x64, 0x15, 0xb9, 0xb0, 0xb2,
+ 0xbb, 0xba, 0xaf, 0x64, 0x5d, 0x5c, 0x67, 0x64,
+ 0x5c, 0x5b, 0x66, 0xb2, 0xba, 0x1e, 0xe, 0x31,
+ 0xa0, 0x76, 0xf9, 0x30, 0x77, 0x1, 0xb3, 0xf9,
+ 0x31, 0x3, 0xf7, 0x4, 0xf7, 0x10, 0x15, 0xf7,
+ 0x83, 0xf7, 0x45, 0xfb, 0x5, 0xfb, 0xa8, 0xb2,
+ 0x8a, 0xa4, 0x85, 0xb1, 0x79, 0x19, 0xb4, 0xf7,
+ 0xb8, 0xf7, 0x9, 0xfb, 0xa5, 0xa7, 0xa5, 0xa2,
+ 0x9b, 0xb1, 0x95, 0x19, 0xfb, 0x48, 0xf7, 0x82,
+ 0xf7, 0xa9, 0xfb, 0x3, 0x88, 0xaa, 0x99, 0xb2,
+ 0x99, 0xa8, 0x19, 0xfb, 0xb9, 0xb5, 0xf7, 0xa6,
+ 0xf7, 0x9, 0x74, 0xa3, 0x76, 0xb0, 0x82, 0xa6,
+ 0x19, 0xfb, 0x82, 0xfb, 0x45, 0xf7, 0x4, 0xf7,
+ 0xa8, 0x6c, 0x8c, 0x62, 0x96, 0x6f, 0x98, 0x19,
+ 0x60, 0xfb, 0xb8, 0xfb, 0x8, 0xf7, 0xa5, 0x77,
+ 0x79, 0x68, 0x76, 0x6a, 0x7e, 0x19, 0x8c, 0x6,
+ 0xf7, 0x45, 0xfb, 0x82, 0xfb, 0xa8, 0xf7, 0x3,
+ 0x5, 0x64, 0x80, 0x70, 0x7c, 0x6a, 0x1e, 0xf7,
+ 0xb9, 0x60, 0xfb, 0xa5, 0xfb, 0x8, 0xa4, 0x6f,
+ 0x98, 0x74, 0x99, 0x66, 0x19, 0xe, 0x5a, 0x9f,
+ 0x76, 0xf8, 0x8f, 0x77, 0xae, 0x77, 0xf7, 0x46,
+ 0x77, 0x12, 0xc2, 0xf9, 0x3c, 0x13, 0xd8, 0xeb,
+ 0xf7, 0x31, 0x15, 0xf7, 0x8b, 0xf7, 0x6, 0x5c,
+ 0xfb, 0xa1, 0x9d, 0x88, 0xe7, 0xf7, 0x93, 0xf7,
+ 0x31, 0xfb, 0x73, 0x99, 0x94, 0xfb, 0x7, 0xf7,
+ 0x8b, 0xf7, 0xa2, 0x5c, 0x8e, 0x9b, 0xfb, 0x93,
+ 0xe9, 0xf7, 0x73, 0xf7, 0x30, 0x5, 0x13, 0xb8,
+ 0x80, 0x9a, 0xfb, 0x89, 0xfb, 0x6, 0xba, 0xf7,
+ 0xa1, 0x79, 0x8e, 0x2d, 0xfb, 0x93, 0xfb, 0x2f,
+ 0xf7, 0x73, 0x7c, 0x82, 0xf7, 0x8, 0xfb, 0x8b,
+ 0xfb, 0xa2, 0xba, 0x88, 0x7b, 0xf7, 0x93, 0x2d,
+ 0xfb, 0x73, 0xfb, 0x30, 0x5, 0xe, 0x5c, 0x78,
+ 0x60, 0xa, 0x8e, 0xbe, 0x7e, 0x67, 0xa, 0x95,
+ 0x77, 0xb8, 0xcf, 0x48, 0xcf, 0xd7, 0xa7, 0x8c,
+ 0x77, 0x12, 0xb0, 0x60, 0xa, 0x95, 0xbe, 0x77,
+ 0x67, 0xa, 0xae, 0xcf, 0x48, 0xcf, 0xd7, 0xa7,
+ 0x13, 0xec, 0x52, 0xb4, 0x55, 0x40, 0xf7, 0x8a,
+ 0xa1, 0x15, 0x73, 0xa6, 0x7f, 0xb9, 0xae, 0x1a,
+ 0xb8, 0x9d, 0xb5, 0xab, 0xab, 0x1e, 0x8d, 0x89,
+ 0x5, 0x81, 0x7a, 0x85, 0x76, 0x78, 0x1a, 0x61,
+ 0xa3, 0x6c, 0xb4, 0x82, 0x1e, 0x49, 0x97, 0xbf,
+ 0x4e, 0xd2, 0x1b, 0xa5, 0xa3, 0x95, 0x9d, 0x9e,
+ 0x1f, 0x79, 0x8c, 0x79, 0x92, 0x7b, 0x93, 0x4f,
+ 0xa9, 0x65, 0xc3, 0x8a, 0xcf, 0x8e, 0x8c, 0x18,
+ 0x64, 0x94, 0xaf, 0x64, 0xb6, 0x1b, 0x9b, 0x9b,
+ 0x91, 0x93, 0x98, 0x1f, 0x78, 0xa7, 0xad, 0x80,
+ 0xad, 0x1b, 0xc9, 0xc0, 0xb2, 0xcc, 0x8e, 0x1f,
+ 0x73, 0x70, 0x5d, 0x7f, 0x68, 0x1b, 0x5e, 0x61,
+ 0x9d, 0xab, 0x6b, 0x7f, 0xa, 0x13, 0xd1, 0x52,
+ 0xb9, 0x21, 0x40, 0x81, 0x9c, 0xa0, 0x85, 0x9e,
+ 0x1b, 0xb5, 0xaa, 0xa3, 0xb4, 0x94, 0x1f, 0xcd,
+ 0x97, 0xc8, 0xbf, 0xd2, 0x1a, 0xa5, 0x81, 0xa3,
+ 0x79, 0x9e, 0x1e, 0x8a, 0x79, 0x84, 0x79, 0x83,
+ 0x7b, 0x6d, 0x4f, 0x53, 0x65, 0x47, 0x8a, 0x8a,
+ 0x8e, 0x18, 0xb2, 0x94, 0xb2, 0xaf, 0xb6, 0x1a,
+ 0x9b, 0x85, 0x9b, 0x83, 0x98, 0x1e, 0x13, 0xe5,
+ 0x52, 0xb9, 0x54, 0xc0, 0x9e, 0xa7, 0x96, 0xad,
+ 0xad, 0x1a, 0x13, 0xe5, 0x52, 0xb9, 0x21, 0x40,
+ 0xc9, 0x64, 0xc0, 0x4a, 0x8e, 0x1e, 0x13, 0xe5,
+ 0x52, 0xb9, 0x54, 0xc0, 0xa3, 0x70, 0x97, 0x5d,
+ 0x68, 0x1a, 0x5e, 0x79, 0x61, 0x6b, 0x6b, 0x1e,
+ 0x89, 0x8d, 0x5, 0x13, 0xe4, 0x82, 0xb9, 0x49,
+ 0x40, 0x95, 0x9c, 0x91, 0xa0, 0x9e, 0x1a, 0xb5,
+ 0x73, 0xaa, 0x62, 0x94, 0x1e, 0x13, 0xe5, 0x46,
+ 0x79, 0x49, 0x40, 0xcd, 0x7f, 0x57, 0xc8, 0x44,
+ 0x1b, 0x71, 0x73, 0x81, 0x79, 0x78, 0x1f, 0x9d,
+ 0x8a, 0x9d, 0x84, 0x9b, 0x83, 0xc7, 0x6d, 0xb1,
+ 0x53, 0x8c, 0x47, 0x88, 0x8a, 0x18, 0xb2, 0x82,
+ 0x67, 0xb2, 0x60, 0x1b, 0x7b, 0x7b, 0x85, 0x83,
+ 0x7e, 0x1f, 0x13, 0xe5, 0x51, 0xb9, 0x55, 0x40,
+ 0x9e, 0x6f, 0x69, 0x96, 0x69, 0x1b, 0x6e, 0xa,
+ 0x4d, 0x56, 0x64, 0x4a, 0x88, 0x1f, 0x13, 0xe5,
+ 0x51, 0xb9, 0x55, 0x40, 0xa3, 0xa6, 0xb9, 0x97,
+ 0xae, 0x1b, 0xb8, 0xb5, 0x79, 0x6b, 0xab, 0x1f,
+ 0x89, 0x89, 0x5, 0x13, 0xe8, 0x22, 0xb9, 0x55,
+ 0x40, 0x95, 0x7a, 0x76, 0x91, 0x78, 0x1b, 0x61,
+ 0x6c, 0x73, 0x62, 0x82, 0x1f, 0x49, 0x7f, 0x4e,
+ 0x57, 0x44, 0x1a, 0x71, 0x95, 0x73, 0x9d, 0x78,
+ 0x1e, 0x8c, 0x9d, 0x92, 0x9d, 0x93, 0x9b, 0xa9,
+ 0xc7, 0xc3, 0xb1, 0xcf, 0x8c, 0x8c, 0x88, 0x18,
+ 0x64, 0x82, 0x64, 0x67, 0x60, 0x1a, 0x7b, 0x91,
+ 0x7b, 0x93, 0x7e, 0x1e, 0x78, 0x6f, 0x80, 0x69,
+ 0x69, 0x1a, 0x4d, 0xb2, 0x56, 0xcc, 0x88, 0x1e,
+ 0xc6, 0xf7, 0x6, 0x15, 0x81, 0x9b, 0x87, 0x9e,
+ 0x9e, 0x1a, 0x13, 0xe3, 0x52, 0xb9, 0x55, 0x40,
+ 0xb6, 0xa1, 0xbc, 0xb4, 0x9d, 0x1e, 0x8a, 0x8d,
+ 0x5, 0x8e, 0x7f, 0x7e, 0x8d, 0x7f, 0x1b, 0x65,
+ 0x4c, 0x79, 0x6e, 0x70, 0x1f, 0x6e, 0xa, 0xbd,
+ 0x98, 0xc2, 0xb1, 0xbd, 0x1b, 0x96, 0x96, 0x89,
+ 0x87, 0x95, 0x1f, 0x8c, 0x8d, 0x73, 0xb6, 0x42,
+ 0xb8, 0x59, 0x8a, 0x19, 0x13, 0xe5, 0x4a, 0xb2,
+ 0x15, 0x40, 0x95, 0x9b, 0x9e, 0x8f, 0x9e, 0x1b,
+ 0x13, 0xe5, 0x52, 0xb8, 0xd5, 0x40, 0xb6, 0xbc,
+ 0x75, 0x62, 0x9d, 0x1f, 0x8d, 0x8c, 0x5, 0x8e,
+ 0x97, 0x8d, 0x98, 0x97, 0x1a, 0xb1, 0x79, 0xca,
+ 0x6e, 0xa6, 0x1e, 0x13, 0xe5, 0x52, 0xb9, 0x21,
+ 0x40, 0xbd, 0x7e, 0xb1, 0x54, 0x59, 0x1a, 0x80,
+ 0x89, 0x80, 0x87, 0x81, 0x1e, 0x8d, 0x8a, 0xb6,
+ 0xa3, 0xb8, 0xd4, 0x8a, 0xbd, 0x19, 0x13, 0xc8,
+ 0x82, 0xb9, 0x53, 0x40, 0x95, 0x7b, 0x8f, 0x78,
+ 0x78, 0x1a, 0x60, 0x75, 0x5a, 0x62, 0x79, 0x1e,
+ 0x8c, 0x89, 0x5, 0x88, 0x97, 0x98, 0x89, 0x97,
+ 0x1b, 0xb1, 0xca, 0x9d, 0xa8, 0xa6, 0x1f, 0x59,
+ 0x7e, 0x54, 0x65, 0x59, 0x1b, 0x80, 0x80, 0x8d,
+ 0x8f, 0x81, 0x1f, 0x8a, 0x89, 0x5, 0x13, 0xe5,
+ 0x52, 0xb9, 0x55, 0x40, 0xa3, 0x60, 0xd4, 0x5e,
+ 0xbd, 0x8c, 0x8, 0x13, 0xe5, 0x52, 0xb2, 0x21,
+ 0x40, 0x81, 0x7b, 0x78, 0x87, 0x78, 0x1b, 0x60,
+ 0x5a, 0xa1, 0xb4, 0x79, 0x1f, 0x89, 0x8a, 0x5,
+ 0x88, 0x7f, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d,
+ 0x4c, 0xa8, 0x70, 0x1e, 0x59, 0x98, 0x65, 0xc2,
+ 0xbd, 0x1a, 0x96, 0x8d, 0x96, 0x8f, 0x95, 0x1e,
+ 0x89, 0x8c, 0x5, 0x13, 0xe5, 0x52, 0xb9, 0x55,
+ 0x40, 0x60, 0x73, 0x5e, 0x42, 0x8c, 0x59, 0x8,
+ 0xd1, 0xf7, 0x39, 0x15, 0xa4, 0x97, 0xa6, 0x86,
+ 0x87, 0xa6, 0x98, 0xa4, 0x70, 0x8f, 0x78, 0x9f,
+ 0x7e, 0x73, 0x5, 0x6e, 0xa, 0x72, 0x7f, 0x9f,
+ 0x77, 0x5, 0xe, 0xfb, 0x24, 0x92, 0x76, 0xf9,
+ 0x64, 0x77, 0x1, 0xb2, 0xf8, 0xfd, 0x3, 0xb2,
+ 0xf7, 0x3e, 0x15, 0xf7, 0x8d, 0xd7, 0xc6, 0xfb,
+ 0x98, 0xc7, 0xf7, 0x98, 0xf7, 0x8d, 0x3e, 0xfb,
+ 0x5a, 0xf7, 0x44, 0xf7, 0x5f, 0xf7, 0x44, 0xfb,
+ 0x92, 0x3c, 0x51, 0xf7, 0x9c, 0x4e, 0xfb, 0x9c,
+ 0xfb, 0x91, 0xda, 0xf7, 0x5e, 0xfb, 0x44, 0x5,
+ 0xe, 0x59, 0x4c, 0xa2, 0xf7, 0x6a, 0xa8, 0xf8,
+ 0x8a, 0x77, 0x1, 0xf7, 0x51, 0xcd, 0x15, 0x81,
+ 0x7c, 0x87, 0x79, 0x79, 0x1a, 0x5b, 0xa4, 0x6d,
+ 0xbc, 0xa7, 0xa8, 0x95, 0x97, 0xa5, 0x1e, 0xc0,
+ 0xa4, 0xba, 0xb1, 0xb5, 0xb3, 0x8, 0xb4, 0xb6,
+ 0xdb, 0xd2, 0xca, 0x1b, 0xa2, 0x9e, 0x82, 0x79,
+ 0x99, 0x1f, 0x8f, 0x9c, 0x9d, 0x8e, 0x5, 0xa3,
+ 0x7a, 0x72, 0x97, 0x6e, 0x1b, 0x4c, 0x46, 0x56,
+ 0x61, 0x5f, 0x1f, 0x5a, 0x58, 0xfb, 0x2, 0x28,
+ 0x40, 0x1b, 0x6e, 0x6d, 0xa1, 0xaa, 0x97, 0x8f,
+ 0x97, 0x90, 0x96, 0x1f, 0x84, 0x92, 0x99, 0x7d,
+ 0x95, 0x1b, 0x90, 0x8e, 0x8d, 0x8f, 0x8e, 0x1f,
+ 0xe8, 0xf7, 0x13, 0x5, 0x8f, 0x91, 0x8c, 0x98,
+ 0x92, 0x1a, 0x94, 0x89, 0x9f, 0x84, 0x91, 0x1e,
+ 0x81, 0x94, 0x77, 0x9b, 0x9a, 0x1a, 0xad, 0xc4,
+ 0xe0, 0x9f, 0xa7, 0x1e, 0xa5, 0x9e, 0xb7, 0xc8,
+ 0xb1, 0xac, 0xa5, 0x71, 0x95, 0x1b, 0x90, 0x8f,
+ 0x8f, 0x8f, 0x8e, 0x1f, 0xe7, 0xf7, 0x13, 0x5,
+ 0x8f, 0x90, 0x8b, 0x97, 0x91, 0x1a, 0x93, 0x8b,
+ 0x9d, 0x84, 0x91, 0x1e, 0xa0, 0x73, 0x54, 0x9b,
+ 0x6c, 0x1b, 0x7c, 0x7d, 0x88, 0x83, 0x7f, 0x1f,
+ 0x4a, 0x60, 0x32, 0xfb, 0x5, 0x5c, 0x4a, 0x59,
+ 0x46, 0x41, 0xfb, 0x0, 0x72, 0x39, 0x8, 0x88,
+ 0x80, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d, 0x67,
+ 0xa2, 0x6e, 0x1e, 0xa8, 0xb3, 0x15, 0x72, 0x9d,
+ 0x74, 0xb1, 0xaa, 0x1a, 0xbb, 0xf7, 0x8, 0xf7,
+ 0x3f, 0xaa, 0xb6, 0x1e, 0xba, 0xcc, 0xd9, 0xf4,
+ 0xcc, 0xb8, 0x8, 0x92, 0x95, 0x97, 0x8d, 0x97,
+ 0x1b, 0xa4, 0xad, 0x80, 0x7c, 0x9f, 0x1f, 0x8e,
+ 0x88, 0x8f, 0x88, 0x86, 0x1a, 0x83, 0x4d, 0x3a,
+ 0x82, 0x7f, 0x1e, 0x88, 0x89, 0x87, 0x87, 0x87,
+ 0x84, 0x79, 0x9d, 0x79, 0x1b, 0x7b, 0x7e, 0x85,
+ 0x82, 0x7e, 0x1f, 0x54, 0x66, 0x37, 0xfb, 0x16,
+ 0x6e, 0x4c, 0x8, 0x87, 0x82, 0x7d, 0x6e, 0x81,
+ 0x7e, 0xb0, 0x73, 0x83, 0x1a, 0x81, 0x4a, 0x37,
+ 0x81, 0x7e, 0x1e, 0x88, 0x89, 0x88, 0x89, 0x87,
+ 0x1b, 0x87, 0x88, 0x8d, 0x8d, 0x88, 0x1f, 0xe,
+ 0x4c, 0x9a, 0x76, 0xf9, 0x55, 0x54, 0xa, 0xf9,
+ 0x56, 0x3, 0xf7, 0xad, 0xf7, 0x86, 0x15, 0x62,
+ 0xfb, 0x7d, 0x5, 0x7e, 0x89, 0x8c, 0x89, 0x8c,
+ 0x1b, 0x91, 0x92, 0x95, 0x8f, 0x8e, 0x1f, 0xf7,
+ 0x16, 0xf7, 0x4c, 0xf7, 0x1b, 0xfb, 0x53, 0x5,
+ 0x85, 0x90, 0x8c, 0x8a, 0x8d, 0x1b, 0x8f, 0x8e,
+ 0x8d, 0x93, 0x89, 0x1f, 0x5e, 0xf7, 0x82, 0xf7,
+ 0x7b, 0x5f, 0x5, 0x9d, 0x88, 0x8e, 0x8c, 0x8d,
+ 0x1a, 0x90, 0x7f, 0x93, 0x89, 0x8c, 0x1e, 0xfb,
+ 0x53, 0xf7, 0x1b, 0xf7, 0x51, 0xf7, 0x17, 0x5,
+ 0x94, 0x91, 0x92, 0x93, 0x8f, 0x1a, 0x90, 0x7c,
+ 0x8b, 0x81, 0x88, 0x1e, 0xfb, 0x77, 0x62, 0xb4,
+ 0xf7, 0x6e, 0x5, 0x9f, 0x8f, 0x8b, 0x8f, 0x89,
+ 0x1b, 0x81, 0x82, 0x7b, 0x8a, 0x8a, 0x1f, 0xfb,
+ 0x12, 0xfb, 0x49, 0xfb, 0x16, 0xf7, 0x4c, 0x5,
+ 0x8d, 0x8a, 0x84, 0x97, 0x87, 0x1b, 0x81, 0x91,
+ 0x7a, 0x87, 0x1f, 0xb4, 0xfb, 0x71, 0xfb, 0x74,
+ 0xb4, 0x5, 0x86, 0x8c, 0x7a, 0x90, 0x82, 0x1a,
+ 0x85, 0x97, 0x85, 0x8d, 0x89, 0x1e, 0xf7, 0x50,
+ 0xfb, 0x1a, 0xfb, 0x4f, 0xfb, 0x12, 0x5, 0x87,
+ 0x88, 0x80, 0x84, 0x87, 0x1a, 0x84, 0x9c, 0x8e,
+ 0x8f, 0x8c, 0x1e, 0xe, 0x44, 0x99, 0x76, 0xf9,
+ 0x56, 0x54, 0xa, 0xf9, 0x4f, 0x3, 0xae, 0xf7,
+ 0x58, 0x15, 0xf7, 0x6c, 0xa8, 0x70, 0xfb, 0x7c,
+ 0xf7, 0x32, 0xf7, 0x3d, 0xf7, 0x32, 0xfb, 0x3d,
+ 0x72, 0xf7, 0x7c, 0xf7, 0x6f, 0x6e, 0xfb, 0x3d,
+ 0xf7, 0x31, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x6b,
+ 0x6e, 0xa4, 0xf7, 0x6e, 0xfb, 0x32, 0xfb, 0x3d,
+ 0xfb, 0x32, 0xf7, 0x3d, 0xa6, 0xfb, 0x6e, 0xfb,
+ 0x6c, 0xa8, 0xf7, 0x3c, 0xfb, 0x31, 0x5, 0xe,
+ 0x5c, 0x3a, 0xa, 0xdf, 0xf9, 0x7, 0x3, 0xdf,
+ 0xf7, 0x35, 0x15, 0xf7, 0x48, 0xbb, 0x5b, 0xfb,
+ 0x41, 0xf7, 0x18, 0xf7, 0x16, 0xc7, 0xfb, 0x48,
+ 0xb5, 0xf7, 0x41, 0xf7, 0x14, 0xfb, 0xf, 0x5b,
+ 0xf7, 0x3f, 0xf7, 0x49, 0x63, 0xfb, 0x14, 0xf7,
+ 0x18, 0xf7, 0x42, 0xb9, 0xfb, 0x41, 0xba, 0xf7,
+ 0x17, 0xf7, 0x10, 0xfb, 0x50, 0x62, 0xb9, 0xf7,
+ 0x47, 0xfb, 0x12, 0xfb, 0x14, 0x5b, 0xf7, 0x47,
+ 0x5a, 0xfb, 0x43, 0xfb, 0x15, 0xf7, 0x12, 0xb8,
+ 0xfb, 0x49, 0xfb, 0x4a, 0xba, 0xf7, 0x19, 0xfb,
+ 0x19, 0xfb, 0x4a, 0x56, 0xf7, 0x44, 0x5c, 0x5,
+ 0xe, 0x3b, 0x9c, 0x76, 0xa3, 0x76, 0xf7, 0xa4,
+ 0x7c, 0xa, 0xe6, 0x77, 0xa0, 0x77, 0xf7, 0x5f,
+ 0x77, 0x12, 0xf7, 0xcb, 0x7c, 0xa, 0x13, 0x6e,
+ 0xd8, 0xf7, 0x7, 0xf7, 0xb, 0x15, 0x99, 0x82,
+ 0xa0, 0x76, 0x94, 0x7d, 0xf7, 0x49, 0xf7, 0x63,
+ 0x18, 0x8c, 0x8a, 0xfb, 0xe, 0xfb, 0x8b, 0x9c,
+ 0x88, 0xa6, 0x81, 0x99, 0x80, 0x19, 0xe3, 0xf7,
+ 0x99, 0x5, 0x8d, 0x6, 0x13, 0xae, 0xd8, 0x79,
+ 0xfb, 0xa7, 0x9c, 0x8f, 0xa7, 0x8b, 0x9c, 0x87,
+ 0x19, 0x79, 0xf7, 0xa7, 0x5, 0x8c, 0x6, 0xe4,
+ 0xfb, 0x99, 0x99, 0x96, 0xa5, 0x95, 0x9c, 0x8e,
+ 0x19, 0xfb, 0xe, 0xf7, 0x8b, 0x8d, 0x8c, 0xf7,
+ 0x49, 0xfb, 0x63, 0x94, 0x99, 0xa0, 0xa0, 0x99,
+ 0x94, 0x19, 0xfb, 0x63, 0xf7, 0x49, 0x8c, 0x8c,
+ 0xf7, 0x8b, 0xfb, 0xe, 0x8e, 0x9c, 0x95, 0xa6,
+ 0x96, 0x99, 0x19, 0xfb, 0x99, 0xe3, 0x75, 0xa,
+ 0xf7, 0xa7, 0x79, 0x87, 0x9c, 0x8b, 0xa7, 0x8f,
+ 0x9c, 0x19, 0xfb, 0xa7, 0x79, 0x5, 0x8c, 0x7,
+ 0xf7, 0x99, 0xe4, 0x80, 0x99, 0x81, 0xa5, 0x88,
+ 0x9c, 0x19, 0xfb, 0x8b, 0xfb, 0xe, 0x8a, 0x8d,
+ 0xf7, 0x63, 0xf7, 0x49, 0x7d, 0x94, 0x76, 0xa0,
+ 0x82, 0x99, 0x19, 0xfb, 0x49, 0xfb, 0x63, 0x8a,
+ 0x8c, 0xf7, 0xe, 0xf7, 0x8b, 0x7a, 0x8e, 0x70,
+ 0x95, 0x7d, 0x96, 0x19, 0x33, 0xfb, 0x99, 0x5,
+ 0x89, 0x6, 0x9d, 0xf7, 0xa7, 0x7a, 0x87, 0x6f,
+ 0x8b, 0x7a, 0x8f, 0x19, 0x9d, 0xfb, 0xa7, 0x5,
+ 0x8a, 0x6, 0x32, 0xf7, 0x99, 0x5, 0x7d, 0x7e,
+ 0x71, 0x81, 0x79, 0x1b, 0xf7, 0xe, 0xfb, 0x8b,
+ 0x89, 0x8a, 0xfb, 0x49, 0xf7, 0x63, 0x82, 0x7d,
+ 0x76, 0x76, 0x7d, 0x82, 0x19, 0xf7, 0x63, 0xfb,
+ 0x49, 0x8a, 0x8a, 0x5, 0x13, 0x75, 0xe8, 0xfb,
+ 0x8b, 0xf7, 0xe, 0x88, 0x7a, 0x81, 0x70, 0x80,
+ 0x7d, 0x19, 0xf7, 0x99, 0x33, 0x80, 0xa, 0xfb,
+ 0xa7, 0x9d, 0x8f, 0x7a, 0x8b, 0x6f, 0x87, 0x7a,
+ 0x19, 0xf7, 0xa7, 0x9d, 0x5, 0x8a, 0x7, 0xfb,
+ 0x99, 0x32, 0x96, 0x7d, 0x95, 0x71, 0x8e, 0x7a,
+ 0x19, 0xf7, 0x8b, 0xf7, 0xe, 0x8c, 0x89, 0x5,
+ 0x8e, 0xb3, 0x15, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9,
+ 0xa4, 0x72, 0x6d, 0x6d, 0x72, 0x72, 0x6d, 0x6d,
+ 0x72, 0xa4, 0xa9, 0x1e, 0xe, 0xfb, 0x18, 0xac,
+ 0x76, 0xf7, 0xc8, 0xa0, 0x89, 0xa0, 0xf7, 0xc8,
+ 0x77, 0x12, 0xf7, 0xe1, 0xa0, 0x89, 0xa0, 0x13,
+ 0xb8, 0xa4, 0xf7, 0x99, 0x15, 0x47, 0xf7, 0x8,
+ 0xaa, 0xaa, 0x99, 0x1e, 0xa3, 0x96, 0xa4, 0x99,
+ 0xa4, 0x99, 0xa4, 0x99, 0xa5, 0x99, 0xa0, 0x97,
+ 0x8, 0x8d, 0x8f, 0x8e, 0x8c, 0x8d, 0x1b, 0x8f,
+ 0x8d, 0x89, 0x87, 0x89, 0x8a, 0x88, 0x89, 0x87,
+ 0x1f, 0x7f, 0x74, 0x7c, 0x71, 0x7c, 0x70, 0x8,
+ 0x71, 0x5e, 0x6d, 0x5a, 0x57, 0x1a, 0x6e, 0x93,
+ 0x61, 0xad, 0xae, 0xa6, 0xbe, 0xa7, 0x92, 0x1e,
+ 0x94, 0xac, 0x8d, 0xb9, 0xb9, 0xa8, 0x8c, 0xa7,
+ 0xa4, 0x1a, 0x93, 0x8e, 0x90, 0x8f, 0x8e, 0x8f,
+ 0x88, 0x86, 0x8e, 0x1e, 0x99, 0x75, 0x9a, 0x71,
+ 0x9b, 0x70, 0xa2, 0x65, 0xa3, 0x64, 0xa1, 0x75,
+ 0xa4, 0x72, 0xc1, 0x6d, 0xa6, 0xa6, 0xa6, 0xa6,
+ 0x6d, 0xc1, 0x72, 0xa4, 0x73, 0xa3, 0x64, 0xa4,
+ 0x63, 0xa2, 0x72, 0x9a, 0x72, 0x9a, 0x76, 0x97,
+ 0x8, 0x86, 0x8e, 0x88, 0x8f, 0x8e, 0x1a, 0x8f,
+ 0x90, 0x8e, 0x93, 0x1e, 0x8c, 0xa5, 0xa9, 0x8b,
+ 0xaa, 0x1b, 0xb8, 0x8c, 0xb7, 0x8d, 0xaa, 0x93,
+ 0x8, 0xa9, 0x93, 0xbc, 0xa4, 0xaf, 0x1a, 0x13,
+ 0xd4, 0x99, 0x83, 0x95, 0x7f, 0x92, 0x1e, 0x67,
+ 0xa1, 0x57, 0x7e, 0x67, 0x7b, 0x73, 0x80, 0x70,
+ 0x7d, 0x71, 0x7c, 0x72, 0x7d, 0x72, 0x7d, 0x75,
+ 0x7f, 0x8, 0x89, 0x87, 0x88, 0x8a, 0x89, 0x1b,
+ 0x87, 0x89, 0x8d, 0x8f, 0x8d, 0x8c, 0x8e, 0x8d,
+ 0x8f, 0x1f, 0x97, 0xa2, 0x9a, 0xa5, 0x9a, 0xa6,
+ 0x9a, 0xa5, 0x99, 0xa6, 0x95, 0xa3, 0x8, 0xaa,
+ 0x99, 0xa4, 0xf7, 0x1, 0x4b, 0x1b, 0x66, 0x74,
+ 0x5a, 0x6d, 0x82, 0x1f, 0x82, 0x6a, 0x89, 0x5d,
+ 0x5d, 0x6e, 0x8a, 0x6f, 0x72, 0x1a, 0x83, 0x88,
+ 0x86, 0x87, 0x88, 0x87, 0x8e, 0x90, 0x88, 0x1e,
+ 0x7d, 0xa1, 0x7c, 0xa5, 0x7b, 0xa6, 0x74, 0xb1,
+ 0x73, 0xb2, 0x75, 0xa1, 0x72, 0xa4, 0x55, 0xa9,
+ 0x70, 0x70, 0x70, 0x70, 0xa9, 0x55, 0xa4, 0x72,
+ 0xa3, 0x73, 0xb2, 0x72, 0xb3, 0x74, 0xa4, 0x7c,
+ 0xa4, 0x7c, 0xa0, 0x7f, 0x8, 0x90, 0x88, 0x8e,
+ 0x87, 0x88, 0x1a, 0x87, 0x86, 0x88, 0x83, 0x1e,
+ 0x8a, 0x71, 0x6d, 0x8b, 0x6c, 0x1b, 0x5e, 0x8a,
+ 0x5f, 0x89, 0x6c, 0x83, 0x8, 0x13, 0xd8, 0x6c,
+ 0x83, 0x5b, 0x71, 0x68, 0x1a, 0xe, 0xfb, 0x17,
+ 0xae, 0x76, 0xf7, 0x64, 0xf7, 0x8, 0x63, 0xb3,
+ 0x94, 0xf7, 0xa, 0xf7, 0x63, 0x77, 0x12, 0xf7,
+ 0x80, 0xf7, 0xa, 0x9d, 0xf7, 0xc, 0x13, 0xde,
+ 0xa4, 0xf7, 0x9a, 0x15, 0x6b, 0xbe, 0x83, 0xa3,
+ 0x1e, 0x13, 0xbe, 0xda, 0xc2, 0xd7, 0xb6, 0x1b,
+ 0x9d, 0x9a, 0x7d, 0x79, 0x1f, 0x6e, 0x3f, 0x45,
+ 0x3c, 0x1a, 0x73, 0x92, 0x59, 0xac, 0xad, 0xa7,
+ 0xbd, 0xa7, 0x93, 0x1e, 0x91, 0x9f, 0x8d, 0xa0,
+ 0xa0, 0xa2, 0x88, 0xa0, 0xa2, 0x1a, 0xa2, 0x8d,
+ 0xa5, 0xaa, 0x97, 0x93, 0x86, 0x81, 0x92, 0x1e,
+ 0xa8, 0x61, 0x95, 0x61, 0xb3, 0x63, 0x8, 0x77,
+ 0x9f, 0xac, 0x79, 0xa7, 0x1b, 0xa1, 0x99, 0x97,
+ 0xa2, 0xa7, 0x77, 0xad, 0x78, 0x9e, 0x1f, 0x64,
+ 0xb2, 0x62, 0x96, 0x5f, 0xa7, 0x8, 0x81, 0x92,
+ 0x84, 0x94, 0x98, 0x1a, 0xa4, 0xa1, 0x91, 0xa0,
+ 0x1e, 0xa2, 0xa2, 0x89, 0xa2, 0x1b, 0xa2, 0xa2,
+ 0x8d, 0x91, 0xa1, 0x1f, 0xa7, 0x93, 0xbd, 0xa7,
+ 0xad, 0x1a, 0xac, 0x59, 0x94, 0x72, 0x1e, 0x3e,
+ 0x44, 0x3c, 0x6c, 0x1b, 0x7a, 0x7d, 0x9a, 0x9c,
+ 0x1f, 0xa9, 0xd9, 0xd6, 0xd6, 0x1a, 0xa3, 0x82,
+ 0xbd, 0x6b, 0x69, 0x6d, 0x59, 0x6f, 0x84, 0x1e,
+ 0x84, 0x71, 0x8a, 0x71, 0x70, 0x74, 0x8d, 0x74,
+ 0x75, 0x1a, 0x79, 0x81, 0x79, 0x77, 0x7e, 0x81,
+ 0x94, 0x95, 0x84, 0x1e, 0x85, 0x95, 0x85, 0x97,
+ 0x86, 0x96, 0x7a, 0xac, 0x79, 0xac, 0x71, 0xa5,
+ 0x8, 0x9e, 0x78, 0x6b, 0x9e, 0x6f, 0x1b, 0x74,
+ 0x7d, 0x7d, 0x74, 0x6f, 0x9e, 0x6b, 0x9e, 0x78,
+ 0x1f, 0xb0, 0x66, 0xb8, 0x7b, 0xb6, 0x71, 0x8,
+ 0x95, 0x85, 0x94, 0x81, 0x7e, 0x1a, 0x76, 0x74,
+ 0x81, 0x79, 0x1e, 0x72, 0x73, 0x8d, 0x72, 0x1b,
+ 0x75, 0x74, 0x8a, 0x85, 0x76, 0x1f, 0x6f, 0x83,
+ 0x57, 0x6e, 0x69, 0x1a, 0xf7, 0xa5, 0xda, 0x15,
+ 0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0xa4, 0x72, 0x6c,
+ 0x6c, 0x72, 0x72, 0x6c, 0x6c, 0x72, 0xa4, 0xaa,
+ 0x1e, 0xe, 0xfb, 0x31, 0x3f, 0xa, 0x12, 0xf7,
+ 0x9d, 0xf7, 0x2f, 0x2f, 0xa3, 0x13, 0xd0, 0xae,
+ 0xf7, 0x49, 0x15, 0xc2, 0x52, 0xd6, 0x96, 0xb2,
+ 0xc4, 0x8, 0x13, 0xe0, 0xae, 0xbb, 0xb0, 0xc1,
+ 0xbf, 0xa9, 0x8, 0x56, 0x7b, 0x5d, 0x7b, 0x63,
+ 0x1e, 0x73, 0x4d, 0x84, 0x76, 0x73, 0x1a, 0x5b,
+ 0xae, 0x6b, 0xb6, 0x7f, 0x1e, 0x13, 0xd0, 0xb7,
+ 0x97, 0xac, 0xac, 0xbe, 0x1a, 0x67, 0xf5, 0x7c,
+ 0xae, 0x79, 0xbc, 0x8c, 0xbf, 0x19, 0xbe, 0x6e,
+ 0xaf, 0x57, 0xad, 0x5d, 0xa7, 0x4a, 0xec, 0x83,
+ 0xbc, 0xc2, 0x8, 0xd3, 0x6d, 0xb1, 0x48, 0x94,
+ 0x1e, 0x20, 0x9a, 0x60, 0x98, 0x64, 0x9f, 0xc0,
+ 0xab, 0xc9, 0x92, 0xc7, 0x94, 0x8, 0xd5, 0x94,
+ 0xb0, 0xb0, 0xe1, 0x1a, 0x4a, 0xb4, 0x4b, 0x7b,
+ 0x5e, 0x53, 0x3b, 0x2b, 0x6f, 0x72, 0x7e, 0x86,
+ 0x89, 0xcb, 0x98, 0xa8, 0xa3, 0xc4, 0x8, 0x94,
+ 0xa0, 0xa2, 0xc4, 0xa2, 0x1a, 0xb5, 0x63, 0xaa,
+ 0x67, 0x97, 0x1e, 0x5f, 0x7f, 0x66, 0x6c, 0x5a,
+ 0x1a, 0x6c, 0x9d, 0x67, 0x96, 0x70, 0x1e, 0x9a,
+ 0x68, 0xa1, 0x53, 0x50, 0x1a, 0x5e, 0xa0, 0x67,
+ 0xbe, 0x6f, 0xb3, 0x61, 0xc7, 0x50, 0xaf, 0x38,
+ 0x59, 0x8, 0xfb, 0xc, 0xd0, 0x84, 0xcc, 0x81,
+ 0x1e, 0xbe, 0x84, 0xbf, 0x81, 0xba, 0x70, 0x67,
+ 0x75, 0x5e, 0x7f, 0x2a, 0x7d, 0x8, 0x45, 0x82,
+ 0x67, 0x79, 0x31, 0x1a, 0xe, 0xfb, 0x1e, 0x95,
+ 0xc3, 0x87, 0xb4, 0xef, 0xa7, 0x7c, 0xcc, 0x57,
+ 0xdb, 0xa0, 0x96, 0x89, 0x96, 0x91, 0x77, 0xaf,
+ 0xda, 0x57, 0xcd, 0x7c, 0xa6, 0xa5, 0x77, 0xea,
+ 0xb3, 0x87, 0xc3, 0x12, 0x90, 0xcc, 0xb0, 0xab,
+ 0xb2, 0xa4, 0xe6, 0xd1, 0x66, 0xb5, 0x65, 0xb5,
+ 0x68, 0xcf, 0xe8, 0xa2, 0xb1, 0xac, 0xb1, 0xcb,
+ 0x13, 0xa4, 0x9b, 0xa7, 0xf7, 0x8, 0x5b, 0xa,
+ 0x62, 0x86, 0x99, 0xfb, 0x12, 0x58, 0xa, 0x13,
+ 0x64, 0x9b, 0x8f, 0x59, 0xa, 0xad, 0x81, 0xae,
+ 0x7f, 0xab, 0x7f, 0xa, 0x13, 0x8c, 0x37, 0x97,
+ 0x43, 0xa, 0x71, 0xa, 0x19, 0x4e, 0xa, 0x13,
+ 0xa4, 0x9b, 0xc7, 0x57, 0xa, 0x69, 0x95, 0x68,
+ 0x3c, 0xa, 0xf7, 0xa9, 0xf7, 0xbf, 0x15, 0x8f,
+ 0x96, 0x8d, 0x97, 0x97, 0x1a, 0x9e, 0x86, 0x7b,
+ 0xa, 0x97, 0x1a, 0x13, 0x8c, 0x37, 0xc7, 0xa5,
+ 0xad, 0x9a, 0xa1, 0xb0, 0xb5, 0x6c, 0x64, 0x68,
+ 0x6a, 0x90, 0x75, 0x80, 0x1e, 0x75, 0x80, 0x78,
+ 0x74, 0x83, 0x74, 0x8, 0xcf, 0x30, 0x15, 0x92,
+ 0x7, 0xb8, 0x94, 0x9d, 0xa6, 0x98, 0xa1, 0x8,
+ 0x9b, 0x95, 0x93, 0x99, 0x9b, 0x1b, 0xae, 0xa2,
+ 0x61, 0x6c, 0x72, 0x7a, 0x60, 0x6d, 0x79, 0x7e,
+ 0xa2, 0x94, 0x7b, 0x1f, 0x13, 0xa1, 0x9b, 0xc7,
+ 0x95, 0x79, 0x76, 0x90, 0x77, 0x1b, 0x86, 0x86,
+ 0x8b, 0x8a, 0x86, 0x1f, 0x96, 0xe5, 0x15, 0x7b,
+ 0x67, 0x76, 0x5f, 0x62, 0x7e, 0x8, 0x13, 0x92,
+ 0x9b, 0xa7, 0x8a, 0x88, 0x87, 0x8a, 0x87, 0x1b,
+ 0x55, 0xa, 0x47, 0xa, 0x13, 0x52, 0x5b, 0x97,
+ 0x61, 0xa, 0xfb, 0x78, 0xf7, 0x23, 0x15, 0xa2,
+ 0x77, 0x6e, 0x99, 0x6d, 0x1b, 0x7e, 0x7f, 0x8b,
+ 0x8d, 0x81, 0x1f, 0x7e, 0x8e, 0x82, 0x94, 0xa2,
+ 0x1a, 0xb6, 0xb3, 0xac, 0xb4, 0x9e, 0xa4, 0x81,
+ 0x74, 0x1e, 0x7d, 0x83, 0x7e, 0x7c, 0x1a, 0x72,
+ 0x94, 0x70, 0x9b, 0x78, 0x1e, 0xf7, 0x1d, 0xfb,
+ 0x4b, 0x15, 0x91, 0x8f, 0x5, 0x74, 0x9f, 0xa8,
+ 0x7d, 0xa9, 0x1b, 0xa9, 0xa6, 0x8e, 0x63, 0x60,
+ 0x63, 0x6a, 0x62, 0x78, 0x72, 0x95, 0xa2, 0x1f,
+ 0x99, 0x93, 0x98, 0x9a, 0x1a, 0xa4, 0x82, 0xa6,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0x71, 0xf7, 0x26, 0x15,
+ 0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xa1,
+ 0x9b, 0xa7, 0xa2, 0xc8, 0x7d, 0x6e, 0x1f, 0x13,
+ 0xa4, 0x9b, 0x97, 0x77, 0xa, 0x1e, 0x48, 0xa,
+ 0x9b, 0xaf, 0xa0, 0xb7, 0xb4, 0x98, 0x8, 0x8c,
+ 0x8e, 0x8f, 0x8c, 0x8f, 0x1b, 0x5d, 0xa, 0x97,
+ 0xdf, 0x15, 0x66, 0x84, 0x79, 0x78, 0x7e, 0x78,
+ 0x8, 0x75, 0x7c, 0x84, 0x76, 0x77, 0x1b, 0x68,
+ 0x74, 0xb6, 0xaa, 0xa4, 0x9c, 0xb5, 0xa9, 0x98,
+ 0x95, 0x7e, 0x7e, 0x9c, 0x1f, 0x80, 0x99, 0x9e,
+ 0x81, 0xaa, 0x1b, 0x91, 0x90, 0x8b, 0x8c, 0x91,
+ 0x1f, 0xd0, 0x2f, 0x15, 0x91, 0x88, 0x5, 0x13,
+ 0xa4, 0x9b, 0x8f, 0x87, 0x7f, 0x89, 0x7e, 0x7f,
+ 0x1a, 0x75, 0x92, 0x7c, 0x92, 0x7e, 0x1e, 0x93,
+ 0x7c, 0x94, 0x80, 0x80, 0x1a, 0x71, 0x69, 0x7c,
+ 0x75, 0x66, 0x61, 0xaa, 0xb2, 0xae, 0xac, 0x85,
+ 0xa1, 0x97, 0x1e, 0xa0, 0x96, 0x9f, 0xa2, 0x93,
+ 0xa2, 0x8, 0xe, 0x7e, 0xaa, 0x76, 0xf7, 0x6f,
+ 0xbf, 0xbc, 0x96, 0x89, 0x96, 0xbc, 0xbf, 0xbf,
+ 0x77, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x1a, 0xb5,
+ 0x65, 0xb5, 0x83, 0xf7, 0x31, 0xfb, 0x12, 0x95,
+ 0x13, 0xef, 0x20, 0xf7, 0x47, 0x5b, 0xa, 0x8a,
+ 0x83, 0x8b, 0x83, 0x83, 0x1a, 0x65, 0x9a, 0x22,
+ 0xbe, 0xb7, 0xc1, 0xbe, 0xac, 0xa4, 0x1e, 0x53,
+ 0xa, 0x8f, 0x9c, 0x8d, 0x9e, 0x63, 0xa, 0xc2,
+ 0x75, 0xb7, 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xad,
+ 0x81, 0xaf, 0x7f, 0xaa, 0x7f, 0xa, 0x5c, 0xa,
+ 0x77, 0x99, 0x77, 0x39, 0xa, 0x5, 0x13, 0xee,
+ 0x40, 0x71, 0xa, 0x8, 0xb3, 0x8f, 0x7f, 0xf7,
+ 0x13, 0x62, 0xa, 0x13, 0xde, 0xa0, 0x52, 0xa,
+ 0x87, 0x7a, 0x89, 0x78, 0x64, 0xa, 0x54, 0xa1,
+ 0x5f, 0x1b, 0x60, 0x81, 0x6c, 0x66, 0x69, 0x95,
+ 0x67, 0x97, 0x6c, 0x4a, 0xa, 0x9f, 0x7d, 0x9f,
+ 0x81, 0x8, 0x65, 0x7a, 0x3b, 0x45, 0xa, 0xf7,
+ 0xfe, 0xf7, 0xbb, 0x15, 0x7a, 0x65, 0x78, 0x63,
+ 0x61, 0x7c, 0x8, 0x8a, 0x87, 0x88, 0x8a, 0x87,
+ 0x1b, 0x13, 0xef, 0x20, 0x55, 0xa, 0x13, 0xee,
+ 0x40, 0x47, 0xa, 0x13, 0xde, 0xa0, 0x61, 0xa,
+ 0xfb, 0xc6, 0xf7, 0x2, 0x15, 0x8d, 0x9a, 0x9b,
+ 0x8d, 0x9a, 0x1b, 0x13, 0xef, 0x20, 0xa2, 0xc8,
+ 0x7d, 0x6e, 0x77, 0xa, 0x1f, 0x48, 0xa, 0x9c,
+ 0xb1, 0x9e, 0xb3, 0xb5, 0x9a, 0x8, 0x8c, 0x8f,
+ 0x8e, 0x8c, 0x8f, 0x1b, 0x13, 0xee, 0xa0, 0x5d,
+ 0xa, 0xe, 0x73, 0x95, 0xb3, 0x97, 0xa9, 0xf7,
+ 0xf, 0xaa, 0x7a, 0x9c, 0xc1, 0xdb, 0x75, 0x77,
+ 0xeb, 0x9c, 0x7a, 0xaa, 0xb1, 0x77, 0xf4, 0xa9,
+ 0x97, 0xb3, 0x12, 0xca, 0xb5, 0xc7, 0xa7, 0xb6,
+ 0xa2, 0xbf, 0xb0, 0x8f, 0x9c, 0x86, 0x9d, 0x7d,
+ 0xdb, 0x7d, 0x9d, 0x86, 0x9c, 0x8f, 0xb0, 0x66,
+ 0xf7, 0x4b, 0x2d, 0xa2, 0xb6, 0xa7, 0xc7, 0xb5,
+ 0x13, 0xda, 0xff, 0x14, 0x80, 0xf7, 0x42, 0x5b,
+ 0xa, 0x63, 0x86, 0x99, 0xfb, 0x13, 0x58, 0xa,
+ 0x59, 0xa, 0xae, 0x81, 0xad, 0x7f, 0xab, 0x7f,
+ 0xa, 0x43, 0xa, 0x5, 0x13, 0xd6, 0xff, 0x2b,
+ 0x80, 0x71, 0xa, 0x8, 0x4e, 0xa, 0x57, 0xa,
+ 0x68, 0x95, 0x69, 0x3c, 0xa, 0xf7, 0xa8, 0xf7,
+ 0xc1, 0x15, 0x8f, 0x96, 0x8d, 0x96, 0x97, 0x1a,
+ 0x9d, 0x87, 0x7b, 0xa, 0x96, 0x1a, 0xab, 0xbd,
+ 0xa5, 0xa7, 0xb1, 0x9e, 0x5e, 0x6a, 0x71, 0x81,
+ 0x84, 0x73, 0x86, 0x1e, 0x6b, 0x84, 0x6f, 0x6e,
+ 0x80, 0x6d, 0x8, 0xd3, 0x2f, 0x15, 0x8a, 0x92,
+ 0xad, 0x90, 0xa5, 0xa1, 0x9a, 0xa9, 0x19, 0x92,
+ 0x99, 0x90, 0x95, 0x9b, 0x8e, 0x8, 0x8c, 0x8e,
+ 0x8d, 0x8b, 0x8e, 0x1b, 0xab, 0xb8, 0x6c, 0x69,
+ 0x6e, 0x66, 0x5f, 0x6d, 0x7f, 0x82, 0x98, 0x97,
+ 0x7c, 0x1f, 0x97, 0x7d, 0x78, 0x96, 0x6a, 0x1b,
+ 0x85, 0x85, 0x8a, 0x8a, 0x85, 0x1f, 0xfb, 0x55,
+ 0xd3, 0x15, 0x13, 0xe9, 0xff, 0x2b, 0x80, 0xa3,
+ 0x78, 0x6c, 0x98, 0x6c, 0x85, 0x86, 0x8b, 0x85,
+ 0x1b, 0x6b, 0x83, 0xa7, 0xa6, 0xb0, 0x9b, 0xaa,
+ 0xb4, 0xa2, 0xb9, 0x7f, 0x6e, 0x1f, 0x7c, 0x83,
+ 0x7c, 0x7b, 0x1a, 0x73, 0x94, 0x71, 0x9b, 0x78,
+ 0x1e, 0xfb, 0x13, 0xfb, 0x90, 0x15, 0xaa, 0xca,
+ 0xa8, 0xc1, 0xcf, 0xaa, 0x8a, 0x8d, 0x18, 0x43,
+ 0x94, 0x5d, 0xb6, 0x5b, 0xbd, 0x8, 0x8c, 0x9d,
+ 0x9e, 0x8c, 0x9d, 0x1b, 0xbe, 0xb7, 0x82, 0x6d,
+ 0xb5, 0x1f, 0x8c, 0x8d, 0x5, 0x80, 0xa4, 0x87,
+ 0xa7, 0xa7, 0x1a, 0xb2, 0x95, 0xb0, 0x96, 0xb1,
+ 0x1e, 0xad, 0x58, 0xaa, 0x5a, 0x4b, 0x1a, 0x84,
+ 0x8b, 0x84, 0x8a, 0x84, 0x1e, 0x8d, 0x6, 0xb7,
+ 0xc5, 0xc8, 0x9e, 0xce, 0x9b, 0x6c, 0x4c, 0x6e,
+ 0x55, 0x47, 0x6c, 0x8c, 0x89, 0x18, 0xd3, 0x82,
+ 0xb9, 0x60, 0xbb, 0x59, 0x8, 0x8a, 0x79, 0x78,
+ 0x8a, 0x79, 0x1b, 0x58, 0x5f, 0x94, 0xa9, 0x61,
+ 0x1f, 0x8a, 0x89, 0x5, 0x96, 0x72, 0x8f, 0x6f,
+ 0x6f, 0x1a, 0x13, 0xea, 0xfe, 0x9b, 0x80, 0x64,
+ 0x81, 0x66, 0x80, 0x65, 0x1e, 0x69, 0xbe, 0x6c,
+ 0xbc, 0xcb, 0x1a, 0x92, 0x8b, 0x92, 0x8c, 0x92,
+ 0x1e, 0x89, 0x6, 0x5f, 0x51, 0x4e, 0x78, 0x48,
+ 0x7b, 0x8, 0xf7, 0xa3, 0xcf, 0x15, 0x90, 0x8f,
+ 0x5, 0x73, 0x9e, 0xaa, 0x7e, 0xaa, 0x91, 0x90,
+ 0x8b, 0x91, 0x1b, 0xab, 0x93, 0x6f, 0x70, 0x66,
+ 0x7b, 0x6c, 0x62, 0x74, 0x5d, 0x97, 0xa8, 0x1f,
+ 0x9a, 0x93, 0x9a, 0x9b, 0x1a, 0xa3, 0x82, 0xa5,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0x4f, 0xd0, 0x15, 0x69,
+ 0x86, 0x71, 0x75, 0x7c, 0x6d, 0x84, 0x7d, 0x86,
+ 0x81, 0x7b, 0x88, 0x8, 0x6a, 0x80, 0x57, 0xb6,
+ 0xab, 0x1a, 0xa8, 0xb0, 0xb7, 0xa9, 0x94, 0x92,
+ 0x84, 0x82, 0x94, 0x1e, 0x7d, 0x9a, 0xa0, 0x79,
+ 0xb4, 0x1b, 0x91, 0x91, 0x8c, 0x8c, 0x91, 0x1f,
+ 0xd3, 0x2f, 0x15, 0x13, 0xda, 0xfe, 0xab, 0x80,
+ 0x91, 0x88, 0x5, 0x87, 0x80, 0x89, 0x80, 0x7f,
+ 0x1a, 0x75, 0x92, 0x7b, 0x92, 0x7d, 0x1e, 0x93,
+ 0x7c, 0x93, 0x80, 0x82, 0x1a, 0x6b, 0x59, 0x71,
+ 0x6f, 0x65, 0x78, 0xb8, 0xac, 0xa5, 0x95, 0x92,
+ 0xa3, 0x90, 0x1e, 0xab, 0x92, 0xa7, 0xa8, 0x96,
+ 0xa9, 0x8, 0x13, 0xda, 0xfe, 0x4b, 0x80, 0x8f,
+ 0xf7, 0x0, 0x15, 0x75, 0x9d, 0x79, 0xa1, 0xa1,
+ 0x9d, 0x9d, 0xa1, 0xa1, 0x79, 0x9d, 0x75, 0x75,
+ 0x79, 0x79, 0x75, 0x1e, 0xe, 0xfb, 0xed, 0xa0,
+ 0x76, 0xf8, 0x36, 0xea, 0xf7, 0x47, 0x77, 0x1,
+ 0xf7, 0x5c, 0xeb, 0x3, 0xf7, 0x5c, 0x16, 0xeb,
+ 0xf8, 0x36, 0xf7, 0x38, 0xea, 0xfb, 0x38, 0xf7,
+ 0x47, 0x2b, 0xfb, 0x47, 0xfb, 0x39, 0x2c, 0xf7,
+ 0x39, 0x6, 0xe, 0x59, 0x83, 0x56, 0xa, 0x8d,
+ 0x77, 0xb4, 0x5e, 0xa, 0x12, 0xb9, 0x56, 0xa,
+ 0xa2, 0x5e, 0xa, 0x13, 0xb2, 0x9a, 0x96, 0x96,
+ 0xa0, 0xb9, 0xf8, 0x19, 0x15, 0x57, 0xb2, 0x70,
+ 0xbb, 0xa3, 0xa3, 0x92, 0x90, 0xa2, 0x1e, 0x90,
+ 0xa6, 0xa7, 0x8f, 0xa6, 0x1b, 0x92, 0xa1, 0x8b,
+ 0x81, 0x1f, 0x13, 0x74, 0x9a, 0x95, 0xa, 0xa0,
+ 0x84, 0x7a, 0x82, 0x85, 0x89, 0x1e, 0x74, 0x81,
+ 0x73, 0x83, 0x72, 0x84, 0x8, 0x56, 0x7d, 0x3f,
+ 0x80, 0x43, 0x1a, 0x61, 0xaf, 0x69, 0xb5, 0xbf,
+ 0xa5, 0xbe, 0xb0, 0xa4, 0x1e, 0x98, 0x9f, 0x9a,
+ 0x9d, 0x9b, 0x9d, 0x8, 0x92, 0x91, 0x99, 0x9b,
+ 0x95, 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, 0x60,
+ 0x8f, 0x8f, 0x88, 0x86, 0x85, 0x87, 0x81, 0x89,
+ 0x85, 0x1f, 0x82, 0x73, 0x80, 0x74, 0x7e, 0x75,
+ 0x8, 0x78, 0x6a, 0x71, 0x6a, 0x63, 0x1a, 0x61,
+ 0xac, 0x6a, 0xb5, 0xbf, 0xa6, 0xb2, 0xbb, 0xa3,
+ 0x84, 0xa3, 0x86, 0xa2, 0x1e, 0x86, 0xa6, 0x87,
+ 0xa7, 0xa6, 0x1a, 0x13, 0xb2, 0x9a, 0x96, 0x56,
+ 0x88, 0x92, 0x8b, 0xa1, 0x95, 0x1e, 0x13, 0xa8,
+ 0x2a, 0x96, 0x56, 0xa0, 0x92, 0x94, 0x7a, 0x85,
+ 0x8d, 0x1f, 0x95, 0x74, 0x93, 0x73, 0x92, 0x72,
+ 0x8, 0x65, 0xa, 0x56, 0x99, 0x96, 0x3f, 0xd3,
+ 0x1b, 0x70, 0xa, 0xb5, 0xad, 0xaf, 0xb5, 0xbf,
+ 0x58, 0xa5, 0x66, 0xa4, 0x1f, 0x77, 0x98, 0x79,
+ 0x9a, 0x79, 0x9b, 0x8, 0x13, 0xb2, 0x9a, 0x96,
+ 0x56, 0x90, 0x86, 0x90, 0x79, 0x9b, 0x93, 0x1a,
+ 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0x8f, 0x8f,
+ 0x90, 0x8f, 0x91, 0x95, 0x87, 0x89, 0x91, 0x1e,
+ 0xa3, 0x82, 0xa2, 0x80, 0xa1, 0x7e, 0x8, 0x78,
+ 0xac, 0xac, 0x71, 0xb3, 0x1b, 0xb5, 0xac, 0xac,
+ 0xb5, 0xbf, 0x64, 0xa6, 0x5b, 0x1f, 0x70, 0xa,
+ 0x73, 0x73, 0x84, 0x86, 0x74, 0x1f, 0x86, 0x70,
+ 0x6f, 0x87, 0x70, 0x1b, 0x13, 0xb2, 0x9a, 0x36,
+ 0x56, 0xa0, 0x84, 0x75, 0x8b, 0x95, 0x1f, 0x13,
+ 0xb2, 0x9a, 0x96, 0x60, 0xa0, 0x92, 0x9c, 0x94,
+ 0x91, 0x8d, 0x1e, 0xa2, 0x95, 0xa3, 0x93, 0xa4,
+ 0x92, 0x8, 0xc0, 0x99, 0xd7, 0x96, 0xd3, 0x1a,
+ 0x6f, 0xa, 0xb5, 0x67, 0xad, 0x61, 0x57, 0x71,
+ 0x58, 0x66, 0x72, 0x1e, 0x7e, 0x77, 0x7c, 0x79,
+ 0x7b, 0x79, 0x8, 0x13, 0xb2, 0x9a, 0x56, 0x56,
+ 0xa0, 0x84, 0x85, 0x7d, 0x7b, 0x81, 0x1b, 0x87,
+ 0x87, 0x8e, 0x90, 0x91, 0x8f, 0x95, 0x8d, 0x91,
+ 0x1f, 0x94, 0xa3, 0x96, 0xa2, 0x98, 0xa1, 0x8,
+ 0x9e, 0xac, 0xa5, 0xac, 0xb3, 0x1a, 0xb5, 0x6a,
+ 0xac, 0x61, 0x57, 0x70, 0x64, 0x5b, 0x1e, 0x6f,
+ 0xa, 0x73, 0x92, 0x73, 0x90, 0x74, 0x1e, 0x90,
+ 0x70, 0x8f, 0x6f, 0x70, 0x1a, 0x84, 0x8b, 0x75,
+ 0x81, 0x1e, 0x13, 0xb3, 0x2, 0x8e, 0x96, 0xa0,
+ 0x84, 0x82, 0x9c, 0x91, 0x89, 0x1f, 0x81, 0xa2,
+ 0x83, 0xa3, 0x84, 0xa4, 0x8, 0xc0, 0x7d, 0x80,
+ 0xd7, 0x43, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x57,
+ 0xbe, 0x71, 0xb0, 0x72, 0x1f, 0x9f, 0x7e, 0x9d,
+ 0x7c, 0x9d, 0x7b, 0x8, 0x91, 0x85, 0x9c, 0x7c,
+ 0x82, 0x1a, 0x86, 0x87, 0x88, 0x87, 0x85, 0x81,
+ 0x8f, 0x8d, 0x85, 0x1e, 0x73, 0x94, 0x74, 0x96,
+ 0x75, 0x98, 0x8, 0x9e, 0x6a, 0x6a, 0xa5, 0x63,
+ 0x1b, 0x61, 0x6a, 0x6a, 0x61, 0x1f, 0xf8, 0x2c,
+ 0x8c, 0x15, 0xa3, 0xa0, 0xa2, 0xa0, 0x9e, 0xa4,
+ 0x8, 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0xa4,
+ 0x9e, 0xa4, 0xb2, 0xaf, 0x1b, 0x13, 0xb2, 0x9a,
+ 0x96, 0x56, 0x90, 0x9e, 0x9c, 0x7a, 0x78, 0x65,
+ 0x51, 0x7a, 0x6e, 0x81, 0x1f, 0x6c, 0x81, 0x6e,
+ 0x7d, 0x6f, 0x7c, 0x8, 0x4f, 0xb0, 0x15, 0x8d,
+ 0xaa, 0x8c, 0xab, 0x87, 0xaa, 0x8, 0x89, 0x9b,
+ 0x88, 0x9c, 0x9b, 0x1a, 0x13, 0xb2, 0x9a, 0x36,
+ 0x56, 0xa0, 0xa5, 0x94, 0xaf, 0xab, 0x1e, 0x70,
+ 0xa, 0xa4, 0x97, 0x7b, 0x73, 0x6d, 0x7e, 0x76,
+ 0x7e, 0x71, 0x1f, 0x7d, 0x6e, 0x7f, 0x6d, 0x82,
+ 0x6c, 0x8, 0xc5, 0x2d, 0x15, 0x8d, 0x96, 0xaa,
+ 0x89, 0xab, 0x8a, 0xaa, 0x8f, 0x19, 0x8d, 0x9b,
+ 0x9c, 0x8e, 0x9b, 0x1b, 0x13, 0xb4, 0x9a, 0x96,
+ 0x56, 0x88, 0xa5, 0xaf, 0x82, 0x6b, 0x72, 0x7b,
+ 0x7f, 0x73, 0x6d, 0x76, 0x98, 0x98, 0x71, 0x1f,
+ 0x6e, 0x99, 0x6d, 0x97, 0x6c, 0x94, 0x8, 0xfb,
+ 0x12, 0xd9, 0x15, 0x76, 0xa3, 0x76, 0xa2, 0x72,
+ 0x9e, 0x8, 0x72, 0x9e, 0x64, 0xa4, 0xaf, 0x1a,
+ 0x13, 0xb2, 0x9a, 0x56, 0x56, 0xa0, 0x9e, 0x9c,
+ 0x9c, 0x9e, 0xb1, 0x9c, 0x51, 0x6e, 0x95, 0x1e,
+ 0x95, 0x6c, 0x99, 0x6e, 0x9a, 0x6f, 0x8, 0x13,
+ 0xb3, 0x2, 0x96, 0x56, 0xa0, 0x89, 0x2a, 0x15,
+ 0x8e, 0xa0, 0x5, 0x65, 0xa, 0x7f, 0x9d, 0x9c,
+ 0x98, 0x5, 0x13, 0xb2, 0x9a, 0x96, 0x60, 0xa0,
+ 0x90, 0xa0, 0xa0, 0x88, 0x9d, 0x97, 0x98, 0x7a,
+ 0x5, 0x13, 0xa8, 0x2a, 0x96, 0x56, 0xa0, 0xa0,
+ 0x86, 0x5, 0x65, 0xa, 0x88, 0x76, 0x97, 0x79,
+ 0x7a, 0x7e, 0x5, 0x13, 0xb2, 0x9a, 0x95, 0xa,
+ 0xa0, 0x86, 0x76, 0x76, 0x8e, 0x79, 0x7f, 0x7e,
+ 0x9c, 0x5, 0x13, 0xb3, 0x2, 0x96, 0x56, 0xa0,
+ 0xca, 0x6b, 0x15, 0x94, 0x92, 0xa0, 0x73, 0xa0,
+ 0x74, 0xa4, 0x78, 0x19, 0x13, 0x72, 0x9a, 0x96,
+ 0x56, 0x60, 0xa4, 0x78, 0xb2, 0x72, 0x67, 0x1a,
+ 0x78, 0x7a, 0x7a, 0x78, 0x65, 0x7a, 0xc5, 0xa8,
+ 0x81, 0x1e, 0x81, 0xaa, 0x7d, 0xa8, 0x7c, 0xa7,
+ 0x8, 0xfb, 0xb, 0xd5, 0x15, 0x65, 0xa, 0x8c,
+ 0x7b, 0x7b, 0x8c, 0x7b, 0x1b, 0x7c, 0x7b, 0x8a,
+ 0x89, 0x7c, 0x1f, 0x89, 0x7b, 0x7a, 0x88, 0x7b,
+ 0x1b, 0x71, 0x67, 0x94, 0xab, 0x1f, 0x6f, 0xa,
+ 0xa4, 0x9b, 0x97, 0xa3, 0xa9, 0xa0, 0x7e, 0x7e,
+ 0xa5, 0x1e, 0xa8, 0x7d, 0xa9, 0x7f, 0xaa, 0x82,
+ 0x8, 0xc5, 0x2d, 0x15, 0x96, 0x89, 0x89, 0x6c,
+ 0x8a, 0x6b, 0x8f, 0x6c, 0x19, 0x8d, 0x7b, 0x8e,
+ 0x7a, 0x7b, 0x1a, 0x13, 0xb2, 0x9a, 0x8e, 0x96,
+ 0xa0, 0x71, 0x82, 0x67, 0x6b, 0x72, 0x7f, 0x9b,
+ 0xa3, 0xa9, 0x98, 0xa0, 0x98, 0xa5, 0x1e, 0x99,
+ 0xa8, 0x97, 0xa9, 0x94, 0xaa, 0x8, 0x5a, 0xae,
+ 0x15, 0x92, 0x82, 0x73, 0x76, 0x74, 0x76, 0x78,
+ 0x72, 0x19, 0x72, 0x78, 0x72, 0x64, 0x67, 0x1b,
+ 0x78, 0x7a, 0x9c, 0x9e, 0xb1, 0xc5, 0x9c, 0xa8,
+ 0x95, 0x1f, 0xaa, 0x95, 0xa8, 0x99, 0xa7, 0x9a,
+ 0x8, 0xe, 0x59, 0x94, 0x76, 0xa9, 0x76, 0xf7,
+ 0x6d, 0x9e, 0xf7, 0x69, 0x9e, 0xf7, 0x7a, 0x77,
+ 0x12, 0xf7, 0xa3, 0x9b, 0xf7, 0x6b, 0x9c, 0x13,
+ 0xbe, 0xf7, 0x2c, 0xdf, 0x15, 0xf7, 0x55, 0xf7,
+ 0x16, 0xb8, 0xfb, 0x76, 0x5, 0x13, 0x7e, 0x9c,
+ 0x94, 0x5, 0x87, 0xb9, 0xf7, 0x6e, 0x8b, 0x1f,
+ 0xf7, 0x50, 0xfb, 0x11, 0x98, 0x91, 0xfb, 0x17,
+ 0xf7, 0x54, 0xf7, 0x75, 0xb9, 0x91, 0x98, 0xfb,
+ 0x7b, 0xb7, 0xf7, 0x11, 0xf7, 0x4f, 0x86, 0x9c,
+ 0xfb, 0x56, 0xfb, 0x16, 0x5d, 0xf7, 0x7a, 0x7e,
+ 0x85, 0x5e, 0xfb, 0x75, 0xfb, 0x4e, 0xf7, 0x10,
+ 0x7c, 0x85, 0xf7, 0x17, 0xfb, 0x54, 0xfb, 0x71,
+ 0x5f, 0x80, 0x7d, 0xf7, 0x7c, 0x5e, 0xfb, 0x10,
+ 0xfb, 0x4b, 0x5, 0xf7, 0x20, 0xf7, 0x80, 0x15,
+ 0xc6, 0xbc, 0xba, 0xc6, 0xc6, 0xbb, 0x5c, 0x50,
+ 0x50, 0x5a, 0x5b, 0x50, 0x50, 0x5b, 0xbb, 0xc6,
+ 0x1e, 0xe, 0xfb, 0x18, 0x97, 0xc3, 0x92, 0xd6,
+ 0xae, 0xac, 0x6a, 0xe6, 0x77, 0x9f, 0x97, 0xc1,
+ 0x64, 0x9f, 0x9a, 0xc1, 0x68, 0x9f, 0xa6, 0x9f,
+ 0x77, 0xe6, 0x6a, 0xac, 0x94, 0x77, 0xb0, 0x77,
+ 0xa8, 0xd6, 0x92, 0xc3, 0x12, 0xa0, 0xd1, 0x8d,
+ 0xb4, 0xc8, 0xa1, 0x85, 0xcd, 0x73, 0x9f, 0xa2,
+ 0xb5, 0x65, 0xa5, 0x80, 0xaa, 0x99, 0xaa, 0x74,
+ 0xb5, 0x6d, 0xa5, 0xa2, 0xcd, 0x4d, 0x9f, 0xaf,
+ 0xa1, 0xc8, 0xb4, 0x8d, 0xd1, 0x13, 0xec, 0xd7,
+ 0xec, 0x33, 0xf8, 0x8, 0xf8, 0x30, 0x15, 0x8e,
+ 0x8f, 0x92, 0x8d, 0x8c, 0x1f, 0x95, 0x9c, 0x98,
+ 0x9a, 0x9a, 0x98, 0x98, 0x97, 0x9a, 0x94, 0x9b,
+ 0x92, 0x8, 0x8d, 0x8c, 0x90, 0x8e, 0x8e, 0x1a,
+ 0x13, 0xea, 0xcb, 0xea, 0x53, 0x8e, 0x85, 0x8b,
+ 0x89, 0x63, 0x56, 0x67, 0x60, 0x89, 0x8b, 0x80,
+ 0x8f, 0x1e, 0xc0, 0x58, 0x15, 0x87, 0x95, 0x8b,
+ 0x8d, 0x9f, 0x9e, 0x87, 0x85, 0x9e, 0x1e, 0x9c,
+ 0x85, 0x9a, 0x83, 0x99, 0x81, 0x8, 0x89, 0x8d,
+ 0x8e, 0x8a, 0x8e, 0x1b, 0x8d, 0x8c, 0x8b, 0x8d,
+ 0x8e, 0x89, 0x8f, 0x89, 0x8d, 0x1f, 0xa5, 0x7a,
+ 0x68, 0x9f, 0x6c, 0x1b, 0x83, 0x6b, 0x85, 0x81,
+ 0x1f, 0xfb, 0x13, 0xa9, 0x15, 0x8d, 0x8b, 0x8c,
+ 0x8d, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x93, 0x8e,
+ 0x89, 0x8f, 0x89, 0x8e, 0x1e, 0x81, 0x9c, 0x85,
+ 0x9f, 0x87, 0x9e, 0x8, 0x89, 0x96, 0x8a, 0x96,
+ 0x97, 0x92, 0x8c, 0x91, 0x92, 0x1a, 0x8d, 0x8b,
+ 0x90, 0x88, 0x80, 0x84, 0x5e, 0x82, 0x70, 0x95,
+ 0x6e, 0xa3, 0x7c, 0x1e, 0x89, 0x8e, 0x90, 0x88,
+ 0x8e, 0x1b, 0x13, 0xec, 0xd7, 0xd4, 0x33, 0xfb,
+ 0xa9, 0xfb, 0x4, 0x15, 0x4c, 0xcf, 0x6c, 0xc1,
+ 0xcb, 0xc2, 0xb0, 0xb7, 0xb6, 0x1e, 0x93, 0x93,
+ 0x95, 0x92, 0x97, 0x1b, 0x9b, 0x94, 0x7e, 0x7c,
+ 0x1f, 0x13, 0xeb, 0x57, 0xec, 0x8f, 0x73, 0x80,
+ 0x6c, 0x7c, 0x79, 0x1e, 0x78, 0x74, 0x72, 0x7e,
+ 0x6e, 0x87, 0x8, 0x69, 0x86, 0x7b, 0x71, 0x6a,
+ 0x1a, 0x63, 0xa9, 0x73, 0xb2, 0xca, 0xbc, 0xcc,
+ 0xc4, 0x95, 0x1e, 0x8e, 0x9a, 0x8c, 0x9a, 0x9b,
+ 0x1a, 0xa7, 0x85, 0xa5, 0x84, 0xa6, 0x1e, 0x8a,
+ 0x90, 0x8a, 0x91, 0x91, 0x1a, 0x9b, 0x94, 0x98,
+ 0x9c, 0x1e, 0x13, 0xeb, 0x27, 0xe9, 0x53, 0x91,
+ 0x8f, 0x8a, 0x88, 0x90, 0x1f, 0xac, 0x76, 0xa3,
+ 0x66, 0x63, 0x6f, 0x7d, 0x78, 0x77, 0x1a, 0x6a,
+ 0xb0, 0x6d, 0xab, 0xb7, 0xa4, 0xbb, 0xb2, 0xb7,
+ 0x74, 0xb8, 0x69, 0xa7, 0x1e, 0x67, 0xaa, 0x69,
+ 0x98, 0x5e, 0x97, 0x8, 0x7d, 0x8f, 0x7a, 0x94,
+ 0x9c, 0x1a, 0xa9, 0xbe, 0x94, 0xa2, 0x1e, 0xda,
+ 0x8e, 0x49, 0xbb, 0x1b, 0xae, 0xaf, 0xa5, 0xb0,
+ 0xca, 0x47, 0xaa, 0x55, 0x4b, 0x54, 0x66, 0x5f,
+ 0x60, 0x1f, 0x13, 0xec, 0xd7, 0xea, 0x93, 0x83,
+ 0x83, 0x81, 0x84, 0x7f, 0x1b, 0x7b, 0x82, 0x98,
+ 0x9a, 0x1f, 0x13, 0xec, 0xd7, 0xe9, 0x93, 0xa3,
+ 0x96, 0xaa, 0x9a, 0x9d, 0x1e, 0x9e, 0xa2, 0xa4,
+ 0x98, 0xa8, 0x8f, 0x8, 0xad, 0x90, 0x9b, 0xa5,
+ 0xac, 0x1a, 0xb3, 0x6d, 0xa3, 0x64, 0x4c, 0x5a,
+ 0x4a, 0x52, 0x81, 0x1e, 0x88, 0x7c, 0x8a, 0x7c,
+ 0x7b, 0x1a, 0x6f, 0x91, 0x71, 0x92, 0x70, 0x1e,
+ 0x8c, 0x86, 0x8c, 0x85, 0x85, 0x1a, 0x7b, 0x82,
+ 0x7e, 0x7a, 0x1e, 0x13, 0xd4, 0xd7, 0xd4, 0x93,
+ 0x85, 0x87, 0x8c, 0x8e, 0x86, 0x1f, 0x6a, 0xa0,
+ 0x73, 0xb0, 0xb3, 0xa7, 0x99, 0x9e, 0x9f, 0x1a,
+ 0xac, 0x66, 0xa9, 0x6b, 0x5f, 0x72, 0x5b, 0x64,
+ 0x5f, 0xa2, 0x5e, 0xad, 0x6f, 0x1e, 0xaf, 0x6c,
+ 0xad, 0x7e, 0xb8, 0x7f, 0x8, 0x99, 0x87, 0x9c,
+ 0x82, 0x7a, 0x1a, 0x6d, 0x58, 0x82, 0x74, 0x56,
+ 0x78, 0xa9, 0x9f, 0x76, 0x1e, 0x94, 0x81, 0x80,
+ 0x92, 0x7b, 0x1b, 0x68, 0x67, 0x71, 0x66, 0x1f,
+ 0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x15, 0x92,
+ 0x15, 0x13, 0xec, 0xd7, 0xec, 0x4f, 0x88, 0x8d,
+ 0x87, 0x8d, 0x88, 0x1e, 0x95, 0x7a, 0x91, 0x77,
+ 0x8f, 0x78, 0x8, 0x8d, 0x80, 0x8c, 0x80, 0x7f,
+ 0x84, 0x8a, 0x85, 0x84, 0x1a, 0x89, 0x8b, 0x86,
+ 0x8e, 0x96, 0x92, 0xb8, 0x94, 0xa6, 0x81, 0xa8,
+ 0x73, 0x9a, 0x1e, 0x8d, 0x88, 0x86, 0x8e, 0x88,
+ 0x1b, 0x13, 0xea, 0xd7, 0xd4, 0x33, 0x89, 0x8b,
+ 0x8a, 0x89, 0x1f, 0xfb, 0x8c, 0xca, 0x15, 0x71,
+ 0x9c, 0xae, 0x77, 0xaa, 0x1b, 0x93, 0xab, 0x91,
+ 0x95, 0x8f, 0x81, 0x8b, 0x89, 0x77, 0x78, 0x8f,
+ 0x91, 0x78, 0x1f, 0x7a, 0x91, 0x7c, 0x93, 0x7d,
+ 0x95, 0x8, 0x8d, 0x89, 0x88, 0x8c, 0x88, 0x1b,
+ 0x89, 0x8a, 0x8b, 0x89, 0x88, 0x8d, 0x87, 0x8d,
+ 0x89, 0x1f, 0xda, 0xfb, 0x3e, 0x15, 0x88, 0x91,
+ 0x8b, 0x8d, 0xb3, 0xc0, 0xaf, 0xb6, 0x8d, 0x8b,
+ 0x96, 0x87, 0x1e, 0x13, 0xeb, 0x57, 0xea, 0x33,
+ 0x88, 0x87, 0x84, 0x89, 0x8a, 0x1f, 0x81, 0x7a,
+ 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7c, 0x82,
+ 0x7b, 0x84, 0x8, 0x89, 0x8a, 0x86, 0x88, 0x88,
+ 0x1a, 0xf7, 0x68, 0xf7, 0x88, 0x15, 0xa6, 0xa8,
+ 0xb3, 0x97, 0xb2, 0x1b, 0xa3, 0xad, 0x81, 0x6d,
+ 0x79, 0x7f, 0x7f, 0x79, 0x82, 0x84, 0x8e, 0x90,
+ 0x84, 0x1f, 0x6d, 0xa3, 0x5e, 0x91, 0x67, 0x7f,
+ 0x8, 0xfb, 0xe, 0xba, 0x15, 0x89, 0x95, 0x8a,
+ 0x94, 0x95, 0x1a, 0xb0, 0xa3, 0xdc, 0xb9, 0x9b,
+ 0x9c, 0x7e, 0x7a, 0x7e, 0x7f, 0x7e, 0x80, 0x86,
+ 0x1e, 0x6a, 0x7e, 0x69, 0x65, 0x86, 0x67, 0x8,
+ 0xf7, 0x1f, 0xfb, 0x3a, 0x15, 0xb4, 0x7e, 0xc5,
+ 0x58, 0x5c, 0x1a, 0x77, 0x7f, 0x7a, 0x76, 0x79,
+ 0x7f, 0x9c, 0x9c, 0x1e, 0x13, 0xec, 0xd7, 0xec,
+ 0x2f, 0x91, 0x8d, 0x91, 0x91, 0x1a, 0xaa, 0x7b,
+ 0xb5, 0x72, 0x9e, 0x1e, 0xfb, 0x81, 0xe3, 0x15,
+ 0x62, 0x98, 0x51, 0xbe, 0xba, 0x1a, 0x9f, 0x97,
+ 0x9c, 0xa0, 0x9d, 0x97, 0x7a, 0x7a, 0x1e, 0x85,
+ 0x89, 0x85, 0x85, 0x1a, 0x6c, 0x9b, 0x61, 0xa4,
+ 0x78, 0x1e, 0xf7, 0x21, 0xfb, 0x3f, 0x15, 0x8d,
+ 0x81, 0x8c, 0x82, 0x81, 0x1a, 0x66, 0x73, 0x3a,
+ 0x5d, 0x1e, 0x13, 0xec, 0xd7, 0xd2, 0x93, 0x7b,
+ 0x7a, 0x98, 0x9c, 0x98, 0x97, 0x98, 0x96, 0x90,
+ 0x1f, 0xac, 0x98, 0xad, 0xb1, 0x90, 0xaf, 0x8,
+ 0xfb, 0x7, 0xb4, 0x15, 0x70, 0x6e, 0x63, 0x7f,
+ 0x64, 0x1b, 0x73, 0x69, 0x95, 0xa9, 0x9d, 0x97,
+ 0x97, 0x9d, 0x94, 0x92, 0x88, 0x86, 0x92, 0x1f,
+ 0x7a, 0xa0, 0xa7, 0x84, 0xa6, 0x1b, 0x97, 0x97,
+ 0x8c, 0x90, 0x96, 0x1f, 0xe, 0xfb, 0x2c, 0x99,
+ 0x76, 0xf9, 0x4a, 0x77, 0x1, 0xf7, 0xda, 0xaf,
+ 0x3, 0xd1, 0xf7, 0xd, 0x15, 0xae, 0x81, 0xa3,
+ 0xdf, 0xc3, 0xab, 0x70, 0x2b, 0xae, 0x81, 0xb0,
+ 0xf7, 0x18, 0xdc, 0xba, 0x9a, 0x82, 0x5, 0x2e,
+ 0x7, 0x2b, 0x29, 0xa5, 0x71, 0xd1, 0xd3, 0x5,
+ 0x4a, 0x7, 0x4e, 0x4c, 0xa5, 0x72, 0xc0, 0xc1,
+ 0xc0, 0x55, 0xa5, 0xa4, 0x4e, 0xca, 0x5, 0xcc,
+ 0x7, 0xd1, 0x43, 0xa5, 0xa5, 0x2b, 0xed, 0x5,
+ 0xe8, 0x7, 0x9a, 0x94, 0xdc, 0x5c, 0xb0, 0xfb,
+ 0x18, 0xae, 0x95, 0x70, 0xeb, 0xc3, 0x6b, 0xa3,
+ 0x37, 0xae, 0x95, 0x77, 0xd4, 0xd4, 0x9d, 0x82,
+ 0xae, 0x36, 0x76, 0x53, 0xac, 0xec, 0xa3, 0x82,
+ 0xaf, 0xfb, 0x19, 0x69, 0x3a, 0xb9, 0x5, 0x9d,
+ 0x7, 0xdc, 0xb9, 0xf7, 0x19, 0x69, 0x94, 0xaf,
+ 0x2a, 0xa3, 0xc3, 0xac, 0xe0, 0x76, 0x94, 0xae,
+ 0x42, 0x9e, 0x9f, 0xd3, 0x68, 0x95, 0x73, 0x37,
+ 0x53, 0x6b, 0xa6, 0xeb, 0x68, 0x95, 0x66, 0xfb,
+ 0x18, 0x3a, 0x5c, 0x7c, 0x94, 0x5, 0xe8, 0x7,
+ 0xeb, 0xed, 0x71, 0xa5, 0x45, 0x43, 0x5, 0xcc,
+ 0x7, 0xc8, 0xca, 0x71, 0xa4, 0x56, 0x55, 0x56,
+ 0xc1, 0x71, 0x72, 0xc8, 0x4c, 0x5, 0x4a, 0x7,
+ 0x45, 0xd3, 0x71, 0x71, 0xeb, 0x29, 0x5, 0x2e,
+ 0x7, 0x7c, 0x82, 0x3a, 0xba, 0x66, 0xf7, 0x18,
+ 0x68, 0x81, 0xa6, 0x2b, 0x53, 0xab, 0x73, 0xdf,
+ 0x68, 0x81, 0x9f, 0x43, 0x42, 0x78, 0x94, 0x68,
+ 0xe0, 0xa0, 0xc3, 0x6a, 0x2a, 0x73, 0x94, 0x67,
+ 0xf7, 0x19, 0xad, 0xdc, 0x5d, 0x5, 0x79, 0x7,
+ 0x3a, 0x5d, 0xfb, 0x19, 0xad, 0x82, 0x67, 0xec,
+ 0x73, 0x53, 0x6a, 0x36, 0xa0, 0x82, 0x68, 0xd4,
+ 0x78, 0x5, 0xe, 0xfb, 0x23, 0x9e, 0x76, 0xf9,
+ 0x40, 0x77, 0x12, 0xf7, 0x71, 0xb0, 0xd0, 0xb3,
+ 0x64, 0xb3, 0xcf, 0xb0, 0x67, 0xb0, 0x13, 0xf2,
+ 0xdb, 0xf7, 0xc, 0x15, 0xb1, 0x7f, 0xa3, 0xe5,
+ 0xdd, 0xba, 0x86, 0x27, 0xa4, 0x7d, 0x5, 0x13,
+ 0xea, 0xdf, 0xc1, 0x5, 0x2d, 0x7, 0x49, 0x49,
+ 0xa8, 0x70, 0xc4, 0xc4, 0xc4, 0x52, 0xa8, 0xa6,
+ 0x49, 0xcd, 0x5, 0xe9, 0x7, 0xdf, 0x55, 0xa4,
+ 0x99, 0x86, 0xef, 0xdd, 0x5c, 0xa3, 0x31, 0xb1,
+ 0x97, 0x76, 0xd9, 0xd9, 0x9f, 0x82, 0xb2, 0x31,
+ 0x73, 0x39, 0xba, 0xe4, 0xb9, 0x5, 0xa7, 0x7,
+ 0x32, 0xb9, 0xdd, 0xba, 0xe5, 0x73, 0x94, 0xb2,
+ 0x3d, 0xa0, 0xa0, 0xd8, 0x65, 0x97, 0x73, 0x31,
+ 0x39, 0x5c, 0x90, 0xef, 0x72, 0x99, 0x37, 0x55,
+ 0x5, 0xe9, 0x7, 0xcd, 0xcd, 0x6e, 0xa6, 0x52,
+ 0x52, 0x52, 0xc4, 0x6e, 0x70, 0xcd, 0x49, 0x5,
+ 0x2d, 0x7, 0x37, 0xc1, 0x72, 0x7d, 0x90, 0x27,
+ 0x39, 0xba, 0x73, 0xe5, 0x65, 0x7f, 0xa0, 0x3e,
+ 0x3d, 0x76, 0x94, 0x64, 0xe5, 0xa3, 0xdd, 0x5c,
+ 0x32, 0x5d, 0x5, 0x6f, 0x7, 0xe4, 0x5d, 0x39,
+ 0x5c, 0x31, 0xa3, 0x82, 0x64, 0xd9, 0x76, 0x5,
+ 0xf7, 0x9f, 0xf7, 0x46, 0x15, 0xd9, 0x7, 0xd2,
+ 0xb7, 0x5, 0x13, 0xf4, 0x88, 0x38, 0x5, 0x13,
+ 0xea, 0x5b, 0x41, 0x15, 0xcf, 0xb2, 0xd5, 0x64,
+ 0x41, 0x64, 0x5, 0xfb, 0x14, 0xd5, 0x15, 0x47,
+ 0xb2, 0x88, 0xde, 0xd2, 0x5f, 0x5, 0xb3, 0xfb,
+ 0x76, 0x15, 0xd9, 0x7, 0x13, 0xf4, 0xcf, 0x64,
+ 0x8e, 0x38, 0x5, 0x13, 0xea, 0xfb, 0x5b, 0xf7,
+ 0xa, 0x15, 0x41, 0xb2, 0xd5, 0xb2, 0xcf, 0x64,
+ 0x5, 0x58, 0xfb, 0x31, 0x15, 0x8e, 0xde, 0xcf,
+ 0xb2, 0x5, 0x3d, 0x7, 0xe, 0xfb, 0x2a, 0x9b,
+ 0x76, 0xf9, 0x46, 0x77, 0x1, 0xf7, 0xd2, 0xbf,
+ 0x3, 0xd3, 0xf7, 0xe, 0x15, 0xbd, 0x7d, 0xa3,
+ 0xe2, 0xac, 0x9e, 0x74, 0x35, 0xbc, 0x7e, 0xb0,
+ 0xf7, 0x1c, 0xd4, 0xb5, 0x8e, 0x8a, 0x5, 0x36,
+ 0x7, 0x28, 0x27, 0xaf, 0x67, 0xca, 0xca, 0x5,
+ 0x65, 0x7, 0x4b, 0x4b, 0xb0, 0x66, 0xc0, 0xbf,
+ 0xc0, 0x57, 0xb0, 0xb0, 0x4b, 0xcb, 0x5, 0xb1,
+ 0x7, 0xca, 0x4c, 0xaf, 0xaf, 0x28, 0xef, 0x5,
+ 0xe0, 0x7, 0x8e, 0x8c, 0xd4, 0x61, 0xb0, 0xfb,
+ 0x1c, 0xbc, 0x98, 0x74, 0xe1, 0xac, 0x78, 0xa3,
+ 0x34, 0xbd, 0x99, 0x79, 0xd3, 0xd2, 0x9e, 0x7e,
+ 0xbe, 0x33, 0x74, 0x6a, 0x9e, 0xe1, 0xa2, 0x7e,
+ 0xbc, 0xfb, 0x1c, 0x67, 0x42, 0xb6, 0x75, 0xa,
+ 0xd4, 0xb6, 0xf7, 0x1c, 0x67, 0x98, 0xbc, 0x35,
+ 0xa2, 0xac, 0x9e, 0xe3, 0x74, 0x98, 0xbe, 0x44,
+ 0x9f, 0x9d, 0xd2, 0x59, 0x99, 0x73, 0x34, 0x6a,
+ 0x78, 0xa2, 0xe1, 0x5a, 0x98, 0x66, 0xfb, 0x1c,
+ 0x42, 0x61, 0x88, 0x8c, 0x5, 0xe0, 0x7, 0xee,
+ 0xef, 0x67, 0xaf, 0x4c, 0x4c, 0x5, 0xb1, 0x7,
+ 0xcb, 0xcb, 0x66, 0xb0, 0x56, 0x57, 0x56, 0xbf,
+ 0x66, 0x66, 0xcb, 0x4b, 0x5, 0x65, 0x7, 0x4c,
+ 0xca, 0x67, 0x67, 0xee, 0x27, 0x5, 0x36, 0x7,
+ 0x88, 0x8a, 0x42, 0xb5, 0x66, 0xf7, 0x1c, 0x5a,
+ 0x7e, 0xa2, 0x35, 0x6a, 0x9e, 0x73, 0xe2, 0x59,
+ 0x7d, 0x9d, 0x44, 0x44, 0x77, 0x98, 0x58, 0xe3,
+ 0xa2, 0xac, 0x78, 0x35, 0x74, 0x98, 0x5a, 0xf7,
+ 0x1c, 0xaf, 0xd4, 0x60, 0x80, 0xa, 0x42, 0x60,
+ 0xfb, 0x1c, 0xaf, 0x7e, 0x5a, 0xe1, 0x74, 0x6a,
+ 0x78, 0x33, 0xa2, 0x7e, 0x58, 0xd2, 0x77, 0x5,
+ 0xe, 0x56, 0x97, 0x76, 0xa5, 0x76, 0xf7, 0xdc,
+ 0xaa, 0xf7, 0xe2, 0x77, 0x12, 0xf8, 0xd, 0xaa,
+ 0x13, 0xb8, 0xf8, 0x30, 0xf8, 0x13, 0x15, 0x94,
+ 0x86, 0xf7, 0x3d, 0xf7, 0x8f, 0x76, 0x8f, 0x81,
+ 0x91, 0x7d, 0x9b, 0x19, 0xfb, 0x1, 0xfb, 0xbc,
+ 0x15, 0xf7, 0xa4, 0xf7, 0x19, 0x7b, 0x99, 0x85,
+ 0x95, 0x87, 0xa0, 0x19, 0xfb, 0x8f, 0xfb, 0x3d,
+ 0x5, 0x60, 0x9e, 0x15, 0x95, 0x6, 0xa0, 0xf7,
+ 0xc2, 0x5, 0x88, 0x82, 0x83, 0x89, 0x83, 0x1b,
+ 0x83, 0x83, 0x8c, 0x8f, 0x80, 0x1f, 0xd4, 0xfb,
+ 0xf6, 0x15, 0xf7, 0xc2, 0x76, 0x5, 0x87, 0x95,
+ 0x8a, 0x93, 0x93, 0x1a, 0x93, 0x8c, 0x93, 0x8f,
+ 0x95, 0x1e, 0xfb, 0xc2, 0x76, 0x5, 0x40, 0xac,
+ 0x15, 0x94, 0x90, 0xfb, 0x19, 0xf7, 0xa4, 0x7d,
+ 0x7b, 0x81, 0x85, 0x76, 0x87, 0x19, 0xf7, 0x7f,
+ 0xfb, 0xd1, 0x15, 0xf7, 0x8f, 0xfb, 0x3d, 0x8f,
+ 0xa0, 0x91, 0x95, 0x9b, 0x99, 0x19, 0xfb, 0xa4,
+ 0xf7, 0x19, 0x5, 0x35, 0xb1, 0x15, 0x90, 0x94,
+ 0xfb, 0x8f, 0xf7, 0x3d, 0x87, 0x76, 0x85, 0x81,
+ 0x7b, 0x7d, 0x19, 0xf7, 0xe2, 0xfb, 0x57, 0x15,
+ 0xf7, 0x19, 0xfb, 0xa4, 0x99, 0x9b, 0x95, 0x91,
+ 0xa0, 0x8f, 0x19, 0xfb, 0x3d, 0xf7, 0x8f, 0x5,
+ 0xfc, 0xd, 0x97, 0x15, 0xf7, 0xc2, 0xa0, 0x5,
+ 0x95, 0x7, 0xfb, 0xc2, 0xa0, 0x5, 0x8f, 0x80,
+ 0x8c, 0x84, 0x82, 0x1a, 0x83, 0x89, 0x83, 0x88,
+ 0x82, 0x1e, 0xf7, 0xd7, 0xfb, 0xd7, 0x15, 0x13,
+ 0x78, 0x8e, 0x95, 0x93, 0x8d, 0x93, 0x1b, 0x13,
+ 0xb8, 0x93, 0x93, 0x89, 0x88, 0x95, 0x1f, 0x76,
+ 0xf7, 0xc2, 0x5, 0x81, 0x6, 0xfb, 0xb0, 0xfb,
+ 0x2a, 0x15, 0xf7, 0x8f, 0xf7, 0x3d, 0x86, 0x94,
+ 0xfb, 0xa4, 0xfb, 0x19, 0x9b, 0x7d, 0x91, 0x81,
+ 0x8f, 0x76, 0x19, 0xe7, 0x2f, 0x15, 0xa0, 0x87,
+ 0x95, 0x85, 0x99, 0x7b, 0xf7, 0x19, 0xf7, 0xa4,
+ 0x18, 0x82, 0x90, 0x5, 0xe, 0x57, 0x97, 0x76,
+ 0xa5, 0x76, 0xf9, 0x49, 0x77, 0x12, 0xb7, 0xf9,
+ 0x4e, 0x13, 0xb0, 0xf8, 0x35, 0xf8, 0x7, 0x15,
+ 0xf7, 0x55, 0xf7, 0x8b, 0x78, 0x8e, 0x55, 0xaa,
+ 0x7f, 0x9a, 0x19, 0xfb, 0x9, 0xfb, 0xb7, 0x5,
+ 0xa0, 0x76, 0x15, 0xf7, 0xb7, 0xf7, 0x9, 0x7c,
+ 0x97, 0x6c, 0xc1, 0x88, 0x9e, 0x19, 0xfb, 0x8b,
+ 0xfb, 0x55, 0x5, 0x67, 0x9a, 0x15, 0x95, 0x6,
+ 0xb7, 0xf7, 0xca, 0x5, 0x87, 0x82, 0x77, 0x8a,
+ 0x77, 0x1b, 0x77, 0x77, 0x8c, 0x8f, 0x82, 0x1f,
+ 0xe3, 0xfb, 0xf6, 0x15, 0xf7, 0xca, 0x5f, 0x5,
+ 0x87, 0x94, 0x8a, 0xa0, 0x9f, 0x1a, 0x9f, 0x8d,
+ 0x9e, 0x8e, 0x94, 0x1e, 0xfb, 0xca, 0x5f, 0x5,
+ 0x4c, 0xa5, 0x15, 0x94, 0x90, 0xfb, 0x9, 0xf7,
+ 0xb7, 0x7f, 0x7c, 0x55, 0x6c, 0x78, 0x88, 0x19,
+ 0xf7, 0x8c, 0xfb, 0xc2, 0x15, 0xf7, 0x8b, 0xfb,
+ 0x55, 0x8e, 0x9e, 0xaa, 0xc1, 0x9a, 0x97, 0x19,
+ 0xfb, 0xb7, 0xf7, 0x9, 0x5, 0x43, 0xa9, 0x15,
+ 0x90, 0x94, 0xfb, 0x8b, 0xf7, 0x55, 0x88, 0x78,
+ 0x6c, 0x55, 0x7c, 0x7f, 0x19, 0xf8, 0x5f, 0xfc,
+ 0x5f, 0x15, 0x97, 0x9a, 0xc1, 0xaa, 0x9e, 0x8e,
+ 0xfb, 0x55, 0xf7, 0x8b, 0x18, 0x82, 0x86, 0x5,
+ 0xfc, 0x0, 0x7e, 0x15, 0xf7, 0xca, 0xb7, 0x5,
+ 0x95, 0x7, 0xfb, 0xca, 0xb7, 0x5, 0x8f, 0x82,
+ 0x8c, 0x76, 0x77, 0x1a, 0x77, 0x89, 0x78, 0x88,
+ 0x82, 0x1e, 0xf7, 0xc0, 0xfb, 0xc0, 0x15, 0x13,
+ 0x70, 0x8e, 0x94, 0x9e, 0x8d, 0x9f, 0x1b, 0x13,
+ 0xb0, 0x9f, 0xa0, 0x8a, 0x87, 0x94, 0x1f, 0x5f,
+ 0xf7, 0xca, 0x5, 0x81, 0x6, 0xfb, 0xa5, 0xfb,
+ 0x46, 0x15, 0xf7, 0x8b, 0xf7, 0x55, 0x86, 0x94,
+ 0xfb, 0xb7, 0xfb, 0x9, 0x9a, 0x7f, 0xaa, 0x55,
+ 0x8e, 0x78, 0x19, 0xc8, 0x4e, 0x15, 0x9e, 0x88,
+ 0xc1, 0x6c, 0x97, 0x7c, 0xf7, 0x9, 0xf7, 0xb7,
+ 0x18, 0x82, 0x90, 0x5, 0xe, 0xfb, 0x12, 0x92,
+ 0x76, 0xf7, 0x1f, 0xf7, 0x43, 0xe6, 0xf7, 0x42,
+ 0xf7, 0x15, 0x77, 0x12, 0xae, 0xf7, 0x45, 0xc5,
+ 0xf7, 0x42, 0x22, 0xae, 0xf7, 0x14, 0xf7, 0x44,
+ 0x13, 0xfb, 0xf7, 0xe7, 0xf7, 0x35, 0x15, 0x66,
+ 0x7f, 0x6b, 0x6b, 0x61, 0x1a, 0x59, 0xaf, 0x64,
+ 0xbe, 0xbd, 0xb0, 0xb3, 0xbc, 0xb6, 0x6b, 0xaa,
+ 0x65, 0x97, 0x1e, 0xf7, 0x30, 0x7, 0xf7, 0x18,
+ 0x3e, 0x5, 0x89, 0x83, 0x89, 0x83, 0x82, 0x1a,
+ 0x5a, 0xb3, 0x62, 0xbc, 0x1e, 0x13, 0xfd, 0xbd,
+ 0xb0, 0xb1, 0xbc, 0xba, 0x65, 0xb4, 0x5a, 0x6f,
+ 0x76, 0x7f, 0x78, 0x77, 0x1f, 0x13, 0xfb, 0xfb,
+ 0x16, 0xd7, 0xf7, 0x16, 0xd7, 0x5, 0x76, 0xa0,
+ 0x9f, 0x82, 0xa9, 0x1b, 0xbc, 0xaf, 0xb6, 0xba,
+ 0xbd, 0x62, 0xad, 0x5b, 0x5e, 0x61, 0x63, 0x5e,
+ 0x81, 0x8c, 0x80, 0x8e, 0x83, 0x1f, 0xfb, 0x18,
+ 0x3d, 0x5, 0xf7, 0x31, 0x7, 0xb1, 0x96, 0xab,
+ 0xab, 0xb5, 0x1a, 0xbd, 0x66, 0xb3, 0x59, 0x59,
+ 0x66, 0x63, 0x59, 0x61, 0xaa, 0x6b, 0xb1, 0x80,
+ 0x1e, 0xfb, 0x31, 0x7, 0xfb, 0x18, 0xd9, 0x5,
+ 0x8e, 0x92, 0x8d, 0x93, 0x95, 0x1a, 0xbc, 0x63,
+ 0xb3, 0x5a, 0x1e, 0x13, 0xfd, 0x59, 0x65, 0x66,
+ 0x59, 0x5c, 0xb2, 0x62, 0xbb, 0xa8, 0xa0, 0x97,
+ 0x9e, 0x9f, 0x1f, 0x13, 0xfb, 0xf7, 0x16, 0x3f,
+ 0xfb, 0x16, 0x3f, 0x5, 0xa1, 0x76, 0x77, 0x94,
+ 0x6c, 0x1b, 0x5a, 0x67, 0x5f, 0x5c, 0x59, 0xb5,
+ 0x69, 0xbb, 0xb7, 0xb6, 0xb3, 0xb8, 0x96, 0x7e,
+ 0x99, 0x93, 0x90, 0x1f, 0xf7, 0x18, 0xd8, 0x5,
+ 0xe, 0x5b, 0x97, 0x76, 0xf7, 0x83, 0xf7, 0xf,
+ 0x71, 0xf7, 0xf, 0xf7, 0x83, 0x77, 0x12, 0xf7,
+ 0xb2, 0xf7, 0xf, 0x71, 0xf7, 0xf, 0x13, 0xd4,
+ 0xf8, 0x39, 0xf7, 0xf1, 0x15, 0xbf, 0xaf, 0xbb,
+ 0x9f, 0xc7, 0x9b, 0xa8, 0x93, 0xa9, 0x92, 0xa4,
+ 0x9d, 0x9a, 0x95, 0x8b, 0x9e, 0x8c, 0x9e, 0x8c,
+ 0x95, 0x8b, 0x96, 0x8f, 0x94, 0x8, 0x8c, 0x8d,
+ 0x8b, 0x8d, 0x8d, 0x1a, 0x93, 0x84, 0x8c, 0x84,
+ 0x81, 0x81, 0x8e, 0x8e, 0x82, 0x1e, 0x8e, 0x81,
+ 0x81, 0x8f, 0x81, 0x1b, 0x6f, 0x67, 0x56, 0x76,
+ 0x7c, 0x1f, 0x6f, 0x63, 0x6e, 0x68, 0x65, 0x6c,
+ 0x82, 0x84, 0x82, 0x85, 0x82, 0x85, 0x8, 0x78,
+ 0x91, 0x15, 0x98, 0x88, 0x96, 0xc9, 0xa0, 0xbb,
+ 0xaa, 0xc1, 0x19, 0x98, 0xa2, 0xa2, 0xb3, 0xa6,
+ 0x1a, 0x98, 0x83, 0x93, 0x83, 0x94, 0x1e, 0x81,
+ 0x96, 0x83, 0x94, 0x84, 0x98, 0x8, 0x8e, 0x8a,
+ 0x88, 0x90, 0x87, 0x1b, 0x86, 0x8b, 0x89, 0x88,
+ 0x87, 0x1f, 0x7f, 0x80, 0x80, 0x87, 0x82, 0x86,
+ 0x8, 0x77, 0x81, 0x7e, 0x85, 0x61, 0x1a, 0x75,
+ 0x8f, 0x76, 0x8f, 0x76, 0x1e, 0x91, 0x6b, 0x8f,
+ 0x6b, 0x6a, 0x1a, 0x71, 0x89, 0x71, 0x86, 0x71,
+ 0x1e, 0xa5, 0x65, 0x15, 0xc9, 0x80, 0xbb, 0x76,
+ 0xc1, 0x6c, 0x8, 0x7e, 0xa2, 0xb3, 0x74, 0xa6,
+ 0x1b, 0x98, 0x94, 0x93, 0x93, 0x93, 0x1f, 0x96,
+ 0x95, 0x94, 0x93, 0x98, 0x92, 0x8, 0x8e, 0x8c,
+ 0x90, 0x8e, 0x8f, 0x1a, 0x90, 0x89, 0x8b, 0x88,
+ 0x8f, 0x1e, 0x82, 0x96, 0x85, 0x94, 0x87, 0x94,
+ 0x8, 0xa1, 0x80, 0x87, 0x99, 0x5f, 0x1b, 0x75,
+ 0x76, 0x87, 0x87, 0x76, 0x1f, 0x85, 0x6b, 0x6b,
+ 0x87, 0x6a, 0x1b, 0x71, 0x71, 0x8d, 0x90, 0x71,
+ 0x1f, 0x5b, 0x9a, 0x15, 0x97, 0x93, 0x67, 0xbf,
+ 0x77, 0xbb, 0x7b, 0xc7, 0x19, 0x83, 0xa8, 0x84,
+ 0xa9, 0x79, 0xa4, 0x82, 0x98, 0x7c, 0x8d, 0x7b,
+ 0x8c, 0x7e, 0x8c, 0x7e, 0x8b, 0x7f, 0x8f, 0x8,
+ 0x8c, 0x89, 0x89, 0x8b, 0x89, 0x1b, 0x83, 0x8a,
+ 0x84, 0x84, 0x80, 0x88, 0x80, 0x87, 0x81, 0x1f,
+ 0x88, 0x82, 0x88, 0x82, 0x82, 0x1a, 0x6f, 0xc0,
+ 0x67, 0xa0, 0x7c, 0x1e, 0xb3, 0x6f, 0xae, 0x6e,
+ 0xaa, 0x65, 0x92, 0x82, 0x91, 0x82, 0x91, 0x82,
+ 0x8, 0xa9, 0x61, 0x15, 0xaf, 0x57, 0x9f, 0x5b,
+ 0x9b, 0x4f, 0x93, 0x6e, 0x92, 0x6d, 0x9d, 0x72,
+ 0x94, 0x7d, 0x9c, 0x8a, 0x9c, 0x8a, 0x97, 0x8a,
+ 0x97, 0x8b, 0x96, 0x87, 0x8, 0x8a, 0x8d, 0x8d,
+ 0x8b, 0x8d, 0x1b, 0x93, 0x8c, 0x92, 0x92, 0x94,
+ 0x8d, 0x93, 0x8e, 0x94, 0x1f, 0x8f, 0x96, 0x8f,
+ 0x96, 0x96, 0x1a, 0xa7, 0x56, 0xaf, 0x76, 0x9a,
+ 0x1e, 0x63, 0xa7, 0x68, 0xa8, 0x6c, 0xb1, 0x84,
+ 0x94, 0x85, 0x94, 0x85, 0x94, 0x8, 0x5b, 0x9a,
+ 0x15, 0x8e, 0x98, 0x4d, 0x96, 0x5b, 0xa0, 0x55,
+ 0xaa, 0x19, 0x13, 0xb8, 0x98, 0x74, 0x63, 0xa2,
+ 0x70, 0x1b, 0x7e, 0x82, 0x83, 0x83, 0x83, 0x1f,
+ 0x80, 0x81, 0x82, 0x83, 0x7e, 0x84, 0x8, 0x88,
+ 0x8a, 0x86, 0x88, 0x87, 0x1a, 0x86, 0x8d, 0x8b,
+ 0x8e, 0x87, 0x1e, 0x95, 0x80, 0x91, 0x80, 0x8f,
+ 0x82, 0x8, 0x76, 0x95, 0x90, 0x7e, 0xb6, 0x1b,
+ 0xa1, 0xa0, 0x8f, 0x8f, 0xa0, 0x1f, 0x91, 0xab,
+ 0xab, 0x8f, 0xac, 0x1b, 0xa5, 0xa5, 0x89, 0x86,
+ 0xa5, 0x1f, 0x9b, 0x75, 0x15, 0x80, 0x4d, 0x76,
+ 0x5b, 0x6c, 0x55, 0x8, 0x7e, 0x74, 0x74, 0x63,
+ 0x70, 0x1a, 0x7e, 0x93, 0x82, 0x93, 0x83, 0x1e,
+ 0x95, 0x80, 0x93, 0x82, 0x92, 0x7e, 0x8, 0x88,
+ 0x8c, 0x8e, 0x86, 0x8f, 0x1b, 0x90, 0x8b, 0x8d,
+ 0x8e, 0x8f, 0x1f, 0x94, 0x93, 0x93, 0x90, 0x93,
+ 0x8f, 0x8, 0xa3, 0x97, 0x9b, 0x8d, 0xba, 0x1a,
+ 0xa1, 0x87, 0xa0, 0x87, 0xa0, 0x1e, 0x85, 0xab,
+ 0x87, 0xab, 0xac, 0x1a, 0xa5, 0x8d, 0xa5, 0x90,
+ 0xa5, 0x1e, 0x78, 0x91, 0x15, 0x83, 0x97, 0x57,
+ 0x67, 0x5b, 0x77, 0x4f, 0x7b, 0x19, 0x6e, 0x83,
+ 0x6d, 0x84, 0x72, 0x79, 0x7e, 0x82, 0x89, 0x7b,
+ 0x8a, 0x7a, 0x8a, 0x7f, 0x8b, 0x7e, 0x87, 0x80,
+ 0x8, 0x8a, 0x89, 0x8b, 0x89, 0x89, 0x1a, 0x83,
+ 0x92, 0x8a, 0x92, 0x95, 0x95, 0x88, 0x88, 0x95,
+ 0x1e, 0x88, 0x95, 0x94, 0x87, 0x95, 0x1b, 0xa7,
+ 0xaf, 0xc0, 0xa0, 0x9a, 0x1f, 0xa7, 0xb3, 0xa8,
+ 0xae, 0xb1, 0xaa, 0x94, 0x92, 0x94, 0x91, 0x94,
+ 0x91, 0x8, 0xe, 0xfb, 0xb3, 0x8b, 0xcd, 0xf7,
+ 0xb6, 0xd1, 0xe7, 0xa4, 0xf7, 0xf, 0xa5, 0x1,
+ 0xae, 0xa4, 0xf7, 0xf, 0xa6, 0xe8, 0xd3, 0xd4,
+ 0xd0, 0x3, 0xf7, 0x4b, 0xc8, 0x15, 0xe4, 0x4e,
+ 0x5, 0xf2, 0xf7, 0xf8, 0xf7, 0x22, 0xf7, 0x9,
+ 0x6, 0x4b, 0xd1, 0x5, 0x3d, 0xd7, 0x6, 0x46,
+ 0xd4, 0x5, 0xfb, 0xf, 0xfb, 0x29, 0xfb, 0x28,
+ 0xfb, 0xd, 0x6, 0xe6, 0x49, 0x5, 0xc4, 0x6,
+ 0xa6, 0xfb, 0xb6, 0x15, 0xf7, 0xfc, 0xfb, 0x2a,
+ 0xe7, 0xf7, 0x2a, 0xf7, 0x28, 0xe8, 0xfb, 0x28,
+ 0xf7, 0x25, 0x2f, 0xfb, 0x25, 0xfb, 0xfc, 0x7,
+ 0xe, 0x55, 0x3a, 0xa, 0xf7, 0xdf, 0xf7, 0xc9,
+ 0x15, 0xfb, 0x33, 0xfb, 0x3, 0x72, 0x7a, 0x7d,
+ 0x7a, 0x86, 0x73, 0x19, 0x69, 0x84, 0xa6, 0x6d,
+ 0xad, 0x1b, 0xa3, 0x9a, 0xa2, 0xaa, 0xa4, 0x1f,
+ 0xf7, 0x2, 0xf7, 0x2e, 0x9e, 0x83, 0x64, 0xfb,
+ 0x66, 0x5, 0x65, 0x84, 0xa1, 0x61, 0xb6, 0x1b,
+ 0xba, 0x9b, 0xb4, 0xb2, 0x83, 0x1f, 0x65, 0xf7,
+ 0x66, 0x9d, 0x93, 0xf7, 0x4, 0xfb, 0x32, 0x5,
+ 0x70, 0x9f, 0x98, 0x74, 0xb1, 0x1b, 0xac, 0xa1,
+ 0xa9, 0xaa, 0xa4, 0x7d, 0x99, 0x77, 0x98, 0x1f,
+ 0xfb, 0x46, 0xf7, 0xc, 0x93, 0x9f, 0xf7, 0x51,
+ 0x6d, 0x5, 0xb4, 0x85, 0xc5, 0x86, 0xc5, 0x1a,
+ 0xca, 0x51, 0x89, 0x60, 0x84, 0x1e, 0xfb, 0x4f,
+ 0x67, 0x83, 0x9f, 0xf7, 0x44, 0xf7, 0xd, 0x5,
+ 0x8b, 0xab, 0xa7, 0xa4, 0x1a, 0xa9, 0x72, 0xa9,
+ 0x6c, 0x6c, 0x7e, 0x7c, 0x74, 0x7b, 0x1e, 0xfb,
+ 0xa, 0xfb, 0x40, 0x79, 0x94, 0xab, 0xf7, 0x4d,
+ 0x5, 0xb5, 0x92, 0x8a, 0xc8, 0x50, 0x1b, 0x5d,
+ 0x78, 0x69, 0x46, 0x97, 0x1f, 0xb1, 0xfb, 0x4d,
+ 0x78, 0x82, 0xfb, 0x2, 0xf7, 0x29, 0x5, 0xa1,
+ 0x7b, 0x79, 0xab, 0x6c, 0x1b, 0x6a, 0x6f, 0x74,
+ 0x69, 0x65, 0xa7, 0x7e, 0xa6, 0x78, 0x1f, 0xf7,
+ 0x30, 0x26, 0x83, 0x78, 0xfb, 0x4e, 0xaf, 0x5,
+ 0x60, 0x93, 0x51, 0x8a, 0x4e, 0x1a, 0x4e, 0xc6,
+ 0x94, 0xb4, 0x91, 0x1e, 0xf7, 0x4f, 0xa7, 0x5,
+ 0xe, 0x5b, 0x3a, 0xa, 0xae, 0xf9, 0x66, 0x3,
+ 0x3b, 0xa, 0xfb, 0x5c, 0xf7, 0x37, 0xfb, 0x34,
+ 0xf7, 0x5b, 0xf7, 0x5a, 0xf7, 0x36, 0xf7, 0x36,
+ 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x36, 0xf7, 0x35,
+ 0xfb, 0x5a, 0xfb, 0x5b, 0xfb, 0x37, 0xfb, 0x33,
+ 0xfb, 0x5c, 0x1e, 0xe, 0xad, 0x7d, 0xae, 0xf9,
+ 0x1c, 0xaf, 0x1, 0xae, 0x9f, 0xf9, 0x1e, 0xf7,
+ 0x19, 0x3, 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x75,
+ 0xf7, 0x49, 0xfb, 0x19, 0xf7, 0x6a, 0xf7, 0x6b,
+ 0xf7, 0x55, 0xf7, 0x13, 0xf7, 0x7b, 0xf7, 0x77,
+ 0xfb, 0x52, 0xf7, 0x1a, 0xfb, 0x69, 0xfb, 0x69,
+ 0xfb, 0x4f, 0xfb, 0x1b, 0xfb, 0x76, 0x1e, 0x9f,
+ 0x16, 0xf7, 0x48, 0xf7, 0x28, 0x41, 0xa, 0xf7,
+ 0x46, 0xf7, 0x25, 0xfb, 0x27, 0xfb, 0x46, 0xfb,
+ 0x46, 0xfb, 0x25, 0x3e, 0xa, 0xfb, 0x49, 0xfb,
+ 0x25, 0xf7, 0x23, 0xf7, 0x48, 0x1e, 0xe, 0x3d,
+ 0x3d, 0xa, 0xf9, 0x47, 0x7a, 0xa, 0xf9, 0x47,
+ 0xf9, 0x48, 0xfd, 0x47, 0x6, 0xe, 0x3e, 0x8b,
+ 0xf7, 0x12, 0x6e, 0xa8, 0xf8, 0xac, 0xa9, 0x12,
+ 0xae, 0xa8, 0xf8, 0xa9, 0xa8, 0x13, 0x78, 0xae,
+ 0xec, 0x15, 0xf7, 0x0, 0x6, 0x13, 0xb8, 0x2a,
+ 0xf8, 0xdc, 0xf8, 0xde, 0x26, 0xf5, 0xfc, 0xe3,
+ 0x7, 0x13, 0x78, 0xa8, 0xfc, 0xca, 0x15, 0xf8,
+ 0xac, 0xf8, 0xa9, 0xfc, 0xac, 0x7, 0xe, 0x3b,
+ 0x8b, 0xf7, 0xf, 0xf8, 0xad, 0xab, 0x1, 0xae,
+ 0xaa, 0xf8, 0xa8, 0xf7, 0x13, 0x3, 0xae, 0xf7,
+ 0x7, 0x15, 0xf7, 0xa, 0xfb, 0x7, 0x5, 0xf8,
+ 0xd0, 0xf8, 0xc7, 0x6, 0xfb, 0xd, 0xf7, 0x15,
+ 0x5, 0xfc, 0xcd, 0x6, 0xaa, 0xfc, 0xcd, 0x6d,
+ 0xa, 0xc0, 0xa0, 0x76, 0xf9, 0x55, 0x54, 0xa,
+ 0xf9, 0xcb, 0x7a, 0xa, 0xf9, 0xcb, 0x6, 0xfc,
+ 0x30, 0xf9, 0x55, 0x5, 0xe, 0xc0, 0x92, 0x76,
+ 0xf9, 0x56, 0x54, 0xa, 0xf9, 0xcb, 0x3, 0xf8,
+ 0x52, 0x7d, 0x15, 0xf8, 0x30, 0xf9, 0x56, 0x5,
+ 0xfd, 0xcb, 0x6, 0xe, 0x3a, 0xa, 0xa3, 0xf9,
+ 0x63, 0x3, 0x3b, 0xa, 0xf7, 0xfb, 0xfb, 0xfc,
+ 0xf7, 0xfc, 0xf7, 0xfc, 0xfb, 0xfc, 0xf7, 0xfb,
+ 0x5, 0xe, 0x54, 0x3f, 0xa, 0x12, 0xaf, 0xf9,
+ 0x5d, 0xfc, 0x8e, 0xf7, 0xc6, 0x13, 0xd0, 0xf8,
+ 0x1c, 0xf8, 0x21, 0x15, 0xf7, 0x2d, 0xf7, 0x2d,
+ 0xfb, 0x2d, 0xf7, 0x2f, 0xfb, 0x2d, 0xfb, 0x2e,
+ 0x5, 0xf7, 0x5f, 0xfb, 0x5f, 0x15, 0xf7, 0x2c,
+ 0xfb, 0x2c, 0x5, 0x13, 0xe0, 0xf7, 0x2f, 0xf7,
+ 0x25, 0xfb, 0x2d, 0xf7, 0x35, 0x5, 0xfb, 0xf9,
+ 0xfb, 0xfb, 0x15, 0xf7, 0x2d, 0xfb, 0x31, 0xf7,
+ 0x30, 0xf7, 0x31, 0xfb, 0x30, 0xf7, 0x2f, 0x5,
+ 0xfb, 0x5f, 0x25, 0x15, 0xf7, 0x2d, 0xf7, 0x2c,
+ 0xfb, 0x2f, 0xf7, 0x2e, 0xfb, 0x2b, 0xfb, 0x2e,
+ 0x5, 0xe, 0xfb, 0xc2, 0x8b, 0xa4, 0xf7, 0xdb,
+ 0xa2, 0xaa, 0xda, 0xaa, 0xa4, 0xf7, 0x12, 0xa4,
+ 0x1, 0xae, 0xa3, 0xf7, 0x6, 0xa4, 0xaa, 0xdc,
+ 0xa9, 0xa3, 0xf7, 0x6, 0xa4, 0x3, 0xf7, 0x41,
+ 0x16, 0xf7, 0x53, 0xf7, 0xf4, 0xf7, 0x1f, 0xf7,
+ 0x51, 0xfb, 0x1f, 0xf7, 0x2b, 0xfb, 0x53, 0xfb,
+ 0x2b, 0xfb, 0x1e, 0xfb, 0x51, 0xf7, 0x1e, 0x6,
+ 0xa4, 0xfb, 0xdb, 0x15, 0xf7, 0xf2, 0xfb, 0x1f,
+ 0xf7, 0x21, 0xf7, 0x1f, 0xf7, 0x2b, 0xf7, 0x22,
+ 0xfb, 0x2b, 0xf7, 0x1e, 0xfb, 0x21, 0xfb, 0x1e,
+ 0xfb, 0xf2, 0x7, 0xfb, 0x3, 0xa9, 0x15, 0xdc,
+ 0xf7, 0xf3, 0xf7, 0x1d, 0xda, 0xfb, 0x1d, 0xf7,
+ 0x2a, 0x3a, 0xfb, 0x2a, 0xfb, 0x1f, 0x3c, 0xf7,
+ 0x1f, 0x6, 0xe, 0xfc, 0x25, 0x3a, 0xa, 0xae,
+ 0xf8, 0x4, 0x3, 0xae, 0x7d, 0x15, 0xf7, 0x66,
+ 0xf7, 0x32, 0xf7, 0x35, 0xf7, 0x5c, 0xf7, 0x5c,
+ 0xfb, 0x37, 0xf7, 0x32, 0xfb, 0x61, 0x1f, 0xfd,
+ 0x63, 0x7, 0xe, 0xfd, 0x51, 0x3d, 0xa, 0xd0,
+ 0x7a, 0xa, 0xd0, 0xf9, 0x48, 0x46, 0x6, 0xe,
+ 0xfc, 0xc6, 0x5a, 0xa, 0xae, 0x16, 0xf7, 0x63,
+ 0xf9, 0x48, 0xfb, 0x63, 0x6, 0xe, 0xfc, 0x3c,
+ 0x3d, 0xa, 0xf7, 0xed, 0x7a, 0xa, 0xf7, 0xed,
+ 0xf9, 0x48, 0xfb, 0xed, 0x6, 0xe, 0x66, 0xa,
+ 0xb9, 0x64, 0x15, 0x96, 0x7e, 0xf7, 0x38, 0xf7,
+ 0x56, 0xf7, 0x42, 0xf7, 0x27, 0xd9, 0xbb, 0x19,
+ 0x30, 0xc2, 0xfb, 0x3f, 0xf7, 0x1f, 0xfb, 0x34,
+ 0xf7, 0x5b, 0x7c, 0x80, 0x18, 0xb7, 0xfb, 0xb,
+ 0xe3, 0xfb, 0x3d, 0xcf, 0x2d, 0x4c, 0x37, 0x2e,
+ 0xfb, 0x65, 0x69, 0x38, 0x8, 0xe, 0xfc, 0x41,
+ 0x3d, 0xa, 0xf7, 0xe8, 0x7a, 0xa, 0xf7, 0x84,
+ 0x6, 0xef, 0xf7, 0xee, 0x27, 0xf7, 0xee, 0x5,
+ 0xfb, 0x84, 0x6, 0xef, 0xfb, 0xee, 0x5, 0xe,
+ 0xfc, 0xf1, 0x3a, 0xa, 0xae, 0xc7, 0x3, 0xae,
+ 0xd3, 0x15, 0xf7, 0x22, 0x35, 0xa1, 0xa0, 0x23,
+ 0xd2, 0x5, 0xf8, 0xaf, 0x7, 0xf3, 0xcf, 0x75,
+ 0x9f, 0xfb, 0x22, 0x33, 0x5, 0xe, 0xfc, 0xf1,
+ 0x3a, 0xa, 0xf7, 0x1e, 0xc8, 0x3, 0xae, 0x93,
+ 0x15, 0xa0, 0x75, 0xf7, 0x23, 0xe1, 0x5, 0xf8,
+ 0xb5, 0x7, 0xfb, 0x23, 0xe3, 0x76, 0x77, 0xf2,
+ 0x47, 0x5, 0xfc, 0xae, 0x7, 0xe, 0xfc, 0x55,
+ 0x3a, 0xa, 0xae, 0xf7, 0x10, 0x3, 0xf7, 0xf2,
+ 0x7d, 0x15, 0x91, 0x96, 0x5, 0xfb, 0x25, 0xbc,
+ 0x57, 0xf7, 0x32, 0xf7, 0x21, 0x1a, 0xf7, 0x1e,
+ 0xc3, 0xf7, 0x38, 0xf7, 0x21, 0xba, 0x1e, 0x83,
+ 0x96, 0x5, 0xfb, 0x52, 0x54, 0xfb, 0xf, 0x20,
+ 0xfb, 0x5a, 0x1a, 0xfb, 0x5b, 0xf7, 0x1a, 0xfb,
+ 0x2, 0xf7, 0x49, 0x59, 0x1e, 0xe, 0xfb, 0x9a,
+ 0xf3, 0xa2, 0xf7, 0x55, 0xb3, 0xf7, 0x69, 0xa2,
+ 0x1, 0xae, 0xa2, 0xf7, 0x66, 0xb4, 0xf7, 0x66,
+ 0xa2, 0x14, 0x1c, 0xf4, 0xf3, 0x15, 0xf8, 0x4,
+ 0x6, 0x81, 0xa2, 0x5, 0x21, 0x5b, 0xe2, 0xf7,
+ 0x4, 0x1f, 0xf7, 0xa, 0xe7, 0x5c, 0x20, 0x1f,
+ 0xa2, 0x81, 0x5, 0xf8, 0x4, 0x7, 0x74, 0x81,
+ 0x8e, 0xfb, 0x5, 0xfb, 0x0, 0x65, 0x22, 0x88,
+ 0x19, 0xf2, 0xb6, 0xf7, 0x2, 0xf7, 0x3, 0x85,
+ 0x1e, 0x95, 0xa2, 0x5, 0xfc, 0x4, 0x6, 0x95,
+ 0x74, 0x5, 0xf6, 0x88, 0xb9, 0x31, 0xfb, 0x6,
+ 0x1a, 0xfb, 0x2, 0x22, 0xbb, 0xf5, 0x90, 0x1f,
+ 0x74, 0x95, 0x5, 0xfc, 0x4, 0x7, 0xa2, 0x95,
+ 0x8c, 0xf6, 0xf7, 0x0, 0xc4, 0xf0, 0x81, 0x19,
+ 0x22, 0x63, 0x29, 0xfb, 0x5, 0x8f, 0x1e, 0xe,
+ 0xfc, 0x55, 0x3a, 0xa, 0xf7, 0x7c, 0xf7, 0xf,
+ 0x3, 0xae, 0x88, 0x15, 0x92, 0x80, 0x5, 0xf7,
+ 0x50, 0xbf, 0xf7, 0x11, 0xf7, 0x0, 0xf7, 0x5b,
+ 0x1a, 0xf7, 0x59, 0xfb, 0xf, 0xf7, 0x0, 0xfb,
+ 0x52, 0xc2, 0x1e, 0x84, 0x80, 0x5, 0xf7, 0x20,
+ 0x5b, 0xc4, 0xfb, 0x37, 0xfb, 0x1e, 0x1a, 0xfb,
+ 0x21, 0x56, 0xfb, 0x32, 0xfb, 0x24, 0x5a, 0x1e,
+ 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xf7, 0x19, 0x16,
+ 0xf7, 0x1, 0x6, 0x26, 0xf7, 0xed, 0xf0, 0xf7,
+ 0xef, 0x5, 0x22, 0x6, 0x25, 0xfb, 0xef, 0x5,
+ 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xae, 0x16, 0xf5,
+ 0x6, 0xf0, 0xf7, 0xed, 0x24, 0xf7, 0xef, 0x5,
+ 0x23, 0x6, 0xef, 0xfb, 0xef, 0x5, 0xe, 0xfc,
+ 0x9e, 0x3d, 0xa, 0xf7, 0x34, 0x3, 0xf7, 0x4c,
+ 0x16, 0xee, 0x6, 0x54, 0xf7, 0x4, 0x6a, 0xf7,
+ 0x4, 0xf7, 0x11, 0x1a, 0xf7, 0x12, 0xa9, 0xed,
+ 0xbd, 0xf7, 0xb, 0x1e, 0x2b, 0x6, 0x3a, 0x29,
+ 0x4c, 0xfb, 0xc, 0xfb, 0x14, 0x1a, 0xfb, 0x12,
+ 0xcc, 0xfb, 0x13, 0xdf, 0x2e, 0x1e, 0xe, 0xfc,
+ 0x9e, 0x38, 0xa, 0xf7, 0xc, 0xf7, 0x37, 0x7a,
+ 0xa, 0xee, 0x6, 0xde, 0xe7, 0xcd, 0xf7, 0x14,
+ 0xf7, 0x11, 0x1a, 0xf7, 0x16, 0x4b, 0xf7, 0x9,
+ 0x3b, 0xef, 0x1e, 0x28, 0x6, 0xc0, 0xfb, 0xc,
+ 0xa6, 0x2a, 0xfb, 0x12, 0x1a, 0xfb, 0x10, 0x6c,
+ 0xfb, 0x5, 0x55, 0xfb, 0x4, 0x1e, 0xe, 0xfc,
+ 0x8d, 0x38, 0xa, 0xe1, 0xf7, 0x1b, 0x3, 0xf7,
+ 0xbf, 0x16, 0x99, 0x7, 0x3d, 0x8b, 0xc1, 0xc1,
+ 0xf7, 0x2e, 0x8f, 0xc0, 0x38, 0x9c, 0x1f, 0xde,
+ 0x9d, 0x87, 0xc6, 0xf7, 0x24, 0x1a, 0xd7, 0x8b,
+ 0xaf, 0xd9, 0x1e, 0x98, 0x61, 0x7, 0x67, 0x39,
+ 0x8b, 0x7c, 0x76, 0x1f, 0x6c, 0x75, 0x87, 0x70,
+ 0x68, 0x1a, 0x91, 0xfb, 0x3e, 0x5, 0x64, 0x7f,
+ 0x6d, 0x61, 0x83, 0x1e, 0xb5, 0x83, 0x97, 0x6f,
+ 0x63, 0x1a, 0x85, 0xfb, 0x3d, 0x5, 0x68, 0x8c,
+ 0x69, 0xaf, 0x79, 0x1e, 0x7f, 0xa3, 0xd2, 0x89,
+ 0xaf, 0x1b, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xf7,
+ 0x5, 0xf7, 0x1b, 0x7a, 0xa, 0xbb, 0x6, 0xaf,
+ 0xdc, 0x8b, 0x99, 0x99, 0x1f, 0xaf, 0x9d, 0x8c,
+ 0xad, 0xae, 0x1a, 0x85, 0xf7, 0x3d, 0x8a, 0xb4,
+ 0x98, 0xa6, 0xb5, 0x93, 0x19, 0x61, 0x93, 0x7d,
+ 0xa0, 0x8d, 0xbb, 0x91, 0xf7, 0x3e, 0x18, 0xae,
+ 0x88, 0xa7, 0x6b, 0xa0, 0x1e, 0x9a, 0x74, 0x3b,
+ 0x8b, 0x67, 0x1b, 0x61, 0x7e, 0x6, 0xd9, 0x8b,
+ 0x54, 0x56, 0x1f, 0x37, 0x7, 0x45, 0x87, 0x56,
+ 0xdd, 0x79, 0x1e, 0x39, 0x7a, 0x8f, 0x56, 0x45,
+ 0x1a, 0x37, 0x7, 0x55, 0x8b, 0x55, 0x3d, 0x1e,
+ 0xe, 0xfc, 0x53, 0x73, 0xa, 0xf0, 0x26, 0xf7,
+ 0xd0, 0x13, 0xa0, 0xf7, 0xcc, 0xf9, 0x3a, 0x15,
+ 0x86, 0xa0, 0x5, 0xfb, 0x13, 0x7a, 0xfb, 0x23,
+ 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc6, 0x21, 0xf2,
+ 0xeb, 0xc5, 0xd4, 0xd2, 0xc3, 0x71, 0xac, 0x75,
+ 0x97, 0x1e, 0x7e, 0x91, 0x7a, 0x8f, 0x7c, 0x86,
+ 0x8, 0x86, 0x78, 0x81, 0x86, 0x70, 0x1b, 0x13,
+ 0xc0, 0x63, 0x71, 0xa0, 0xb5, 0xbd, 0xaf, 0xcc,
+ 0xf7, 0x1e, 0xab, 0x1f, 0xe, 0xfc, 0x53, 0x73,
+ 0xa, 0xf7, 0xd0, 0x26, 0xf0, 0x13, 0xc0, 0xde,
+ 0xf7, 0x78, 0x15, 0xf7, 0x13, 0x9c, 0xf7, 0x23,
+ 0xcb, 0xf7, 0x5b, 0x1a, 0xe0, 0x50, 0xf5, 0x24,
+ 0x2b, 0x51, 0x42, 0x44, 0x53, 0xa5, 0x6a, 0xa1,
+ 0x7f, 0x1e, 0x97, 0x85, 0x9a, 0x87, 0x9d, 0x90,
+ 0x8, 0x90, 0x9e, 0x95, 0x90, 0xa6, 0x1b, 0x13,
+ 0xa0, 0xb3, 0xa5, 0x76, 0x61, 0x59, 0x67, 0x4a,
+ 0xfb, 0x1e, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe,
+ 0xfb, 0x3f, 0xf8, 0xec, 0xf9, 0x3a, 0x15, 0x87,
+ 0xa0, 0x5, 0xfb, 0xc, 0x5f, 0xa, 0x73, 0xac,
+ 0x76, 0x97, 0x1e, 0x80, 0x91, 0x7c, 0x8f, 0x7a,
+ 0x86, 0x8, 0x86, 0x7a, 0x81, 0x86, 0x72, 0x1b,
+ 0x65, 0x73, 0xa0, 0xb5, 0xbd, 0xac, 0xcc, 0xf7,
+ 0x16, 0xab, 0x1f, 0xfb, 0xc4, 0x16, 0x86, 0xa0,
+ 0x5, 0xfb, 0xb, 0x5f, 0xa, 0x72, 0xac, 0x76,
+ 0x97, 0x1e, 0x80, 0x91, 0x7d, 0x8f, 0x7a, 0x86,
+ 0x8, 0x86, 0x79, 0x82, 0x86, 0x71, 0x1b, 0x66,
+ 0x72, 0xa0, 0xb5, 0xbd, 0xad, 0xcc, 0xf7, 0x16,
+ 0xab, 0x1f, 0xe, 0xfc, 0xc5, 0xe, 0x7d, 0x99,
+ 0xf7, 0xee, 0x98, 0xf7, 0xe1, 0x98, 0x6, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+ 0xe5, 0xb, 0xf9, 0xa8, 0x14, 0xf9, 0xdb, 0x15,
+ 0xa7, 0x13, 0x0, 0x61, 0x2, 0x0, 0x1, 0x0,
+ 0x7, 0x0, 0xb, 0x0, 0x11, 0x0, 0x18, 0x0,
+ 0x1f, 0x0, 0x2c, 0x0, 0x30, 0x0, 0x39, 0x0,
+ 0x3e, 0x0, 0x43, 0x0, 0x4b, 0x0, 0x52, 0x0,
+ 0x5a, 0x0, 0x5f, 0x0, 0x64, 0x0, 0x69, 0x0,
+ 0x78, 0x0, 0x7f, 0x0, 0xba, 0x0, 0xbf, 0x1,
+ 0xb, 0x1, 0x11, 0x1, 0x18, 0x1, 0x1d, 0x1,
+ 0x24, 0x1, 0x3e, 0x1, 0x42, 0x1, 0x46, 0x1,
+ 0x55, 0x1, 0x59, 0x1, 0x5e, 0x1, 0x64, 0x1,
+ 0x69, 0x1, 0x6e, 0x1, 0x85, 0x1, 0x8d, 0x1,
+ 0x92, 0x1, 0xa5, 0x1, 0xaa, 0x1, 0xc7, 0x1,
+ 0xe2, 0x1, 0xfc, 0x2, 0xb, 0x2, 0x16, 0x2,
+ 0x1b, 0x2, 0x1f, 0x2, 0x29, 0x2, 0x37, 0x2,
+ 0x41, 0x2, 0x4b, 0x2, 0x58, 0x2, 0x65, 0x2,
+ 0x69, 0x2, 0x7f, 0x2, 0x95, 0x2, 0xa4, 0x2,
+ 0xaf, 0x2, 0xbe, 0x2, 0xc4, 0x2, 0xcf, 0x2,
+ 0xda, 0x2, 0xec, 0x2, 0xfe, 0x3, 0xf, 0x3,
+ 0x20, 0x3, 0x2f, 0x3, 0x38, 0x3, 0x41, 0x3,
+ 0x4a, 0x3, 0x51, 0x3, 0x5e, 0x3, 0x6b, 0x3,
+ 0x77, 0x3, 0x83, 0x3, 0x89, 0x3, 0x8d, 0x3,
+ 0x98, 0x3, 0xa1, 0x3, 0xa8, 0x3, 0xaf, 0x3,
+ 0xb6, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3,
+ 0xd0, 0x3, 0xd4, 0x3, 0xde, 0x3, 0xe8, 0x3,
+ 0xf2, 0x3, 0xfc, 0x4, 0x0, 0x4, 0x9, 0x4,
+ 0x12, 0x4, 0x19, 0x4, 0x1f, 0x4, 0x24, 0x4,
+ 0x28, 0x30, 0xa, 0x33, 0xa, 0x1e, 0xb, 0x15,
+ 0x20, 0xa, 0xb, 0xae, 0xf7, 0xee, 0x21, 0xa,
+ 0xb, 0xae, 0xf7, 0xee, 0x15, 0x2c, 0xa, 0xb,
+ 0xf7, 0x5b, 0x25, 0xa, 0xfb, 0x5b, 0xb, 0xf7,
+ 0x35, 0xf7, 0x35, 0xf7, 0x5b, 0xf7, 0x5a, 0xfb,
+ 0x35, 0xf7, 0x35, 0xb, 0x3, 0x23, 0xa, 0xb,
+ 0xfb, 0x5a, 0xfb, 0x35, 0xfb, 0x35, 0xfb, 0x5a,
+ 0xb, 0xf7, 0x48, 0x2d, 0xa, 0xb, 0x2e, 0xa,
+ 0xf7, 0x5a, 0xb, 0xfb, 0x35, 0xfb, 0x35, 0xfb,
+ 0x5a, 0x1e, 0xb, 0xfb, 0x5b, 0xf7, 0x35, 0xfb,
+ 0x35, 0xb, 0x46, 0xa, 0x24, 0xa, 0x27, 0xa,
+ 0x1e, 0xb, 0xf7, 0x25, 0x31, 0xa, 0xb, 0x3b,
+ 0xa, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0xfb, 0x25,
+ 0xb, 0x2c, 0xa, 0xae, 0x16, 0x40, 0xa, 0x41,
+ 0xa, 0xf7, 0x48, 0x2f, 0xa, 0xfb, 0x48, 0xb,
+ 0x3e, 0xa, 0xfb, 0x48, 0xfb, 0x25, 0xb, 0xf7,
+ 0x7e, 0xf7, 0x3e, 0x5, 0xfb, 0xb5, 0x6, 0x32,
+ 0xf7, 0xa7, 0x32, 0xfb, 0xa7, 0x5, 0xfb, 0xb5,
+ 0x6, 0xf7, 0x7e, 0xfb, 0x3e, 0x5, 0x68, 0xfb,
+ 0x5b, 0x15, 0xe1, 0xf7, 0x6c, 0xfb, 0x58, 0xf7,
+ 0x10, 0xf7, 0x7c, 0x7c, 0xc4, 0xf7, 0x75, 0xc4,
+ 0xfb, 0x75, 0xf7, 0x7c, 0x9a, 0xfb, 0x58, 0xfb,
+ 0x10, 0xe1, 0xfb, 0x6c, 0xfb, 0x47, 0xf7, 0x29,
+ 0x5, 0xb, 0xfb, 0x47, 0x36, 0xa, 0xb, 0xf8,
+ 0xaa, 0xf8, 0x8d, 0x15, 0xaf, 0xae, 0x5, 0xa2,
+ 0x98, 0xa9, 0xa6, 0xac, 0x1b, 0xba, 0xc5, 0x5f,
+ 0x4d, 0x71, 0x75, 0x6b, 0x70, 0x7a, 0x1f, 0x6e,
+ 0x65, 0xc1, 0x8e, 0xb3, 0xbe, 0x93, 0xb6, 0x19,
+ 0xf7, 0x12, 0xe9, 0x71, 0xf7, 0x2e, 0xfb, 0x23,
+ 0xfb, 0x1b, 0x7d, 0x98, 0x7a, 0x95, 0x77, 0x92,
+ 0x19, 0xf7, 0x5, 0xf7, 0x16, 0x5, 0x7a, 0x65,
+ 0x87, 0x83, 0x7d, 0x1f, 0x2f, 0xfb, 0x4, 0x5,
+ 0x52, 0x84, 0x61, 0x50, 0x68, 0x87, 0x8b, 0x88,
+ 0x87, 0x1a, 0xb, 0x4f, 0xa, 0x32, 0xa, 0x30,
+ 0xb, 0xfb, 0x25, 0xf7, 0x25, 0xf7, 0x48, 0xb,
+ 0x15, 0x30, 0xa, 0x1e, 0xb, 0xa0, 0x76, 0xf9,
+ 0x48, 0x77, 0x1, 0xb, 0x95, 0x8, 0xb2, 0x9c,
+ 0xda, 0xc4, 0xba, 0x1a, 0xbd, 0x26, 0xa7, 0x64,
+ 0x90, 0x1e, 0x8a, 0x8e, 0x97, 0x9b, 0x97, 0x9c,
+ 0x95, 0x9c, 0x19, 0x87, 0x8e, 0xb, 0x3f, 0xa,
+ 0x1, 0xb, 0xae, 0x4d, 0xa, 0xb, 0x97, 0x6b,
+ 0x4a, 0xa, 0x9e, 0x7d, 0xa0, 0x81, 0x8, 0x64,
+ 0x7a, 0x3c, 0x45, 0xa, 0xb, 0x38, 0xa, 0xae,
+ 0xb, 0xfb, 0x25, 0xfb, 0x47, 0xb, 0x92, 0x76,
+ 0xf9, 0x63, 0x77, 0xb, 0xf7, 0x47, 0xf7, 0x25,
+ 0xb, 0xf7, 0x25, 0xf7, 0x47, 0xb, 0x15, 0xa6,
+ 0x9f, 0xa0, 0xa6, 0xa6, 0xa0, 0x76, 0x4b, 0xa,
+ 0xfb, 0xb4, 0x4, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6,
+ 0xa0, 0x77, 0x4b, 0xa, 0xb, 0x5c, 0xa, 0x78,
+ 0x99, 0x76, 0x39, 0xa, 0xb, 0x50, 0xa, 0x51,
+ 0xa, 0xb, 0x52, 0x5c, 0x1a, 0x59, 0xf0, 0x6f,
+ 0xb2, 0x86, 0x1e, 0x8c, 0x88, 0x7f, 0x7b, 0x7f,
+ 0x7a, 0x81, 0x7a, 0x19, 0xb, 0x2b, 0xa, 0xf7,
+ 0x5a, 0xb, 0xa1, 0x6e, 0xa1, 0x6d, 0x65, 0x1a,
+ 0x7f, 0x88, 0x73, 0x7b, 0x72, 0x82, 0xc3, 0x9e,
+ 0x9f, 0x90, 0x9e, 0x8f, 0x9e, 0x1e, 0x6a, 0xa,
+ 0x89, 0x7c, 0x7b, 0x89, 0x7c, 0x1b, 0xb, 0x6a,
+ 0xa, 0x75, 0xa8, 0x75, 0xa9, 0xb1, 0x1a, 0x97,
+ 0x8e, 0xa3, 0x9b, 0xa4, 0x94, 0x53, 0x78, 0x77,
+ 0x86, 0x78, 0x87, 0x78, 0x1e, 0xfb, 0x2d, 0xc2,
+ 0x15, 0xb, 0xe0, 0xf7, 0xb, 0x76, 0xf7, 0x8c,
+ 0x77, 0xf7, 0xa0, 0x54, 0xa, 0xf9, 0xea, 0x3,
+ 0xae, 0xed, 0x15, 0xf9, 0xea, 0xf7, 0x8c, 0xfd,
+ 0xea, 0xf7, 0x8c, 0xb, 0x1f, 0x89, 0x89, 0x5,
+ 0x8e, 0x77, 0x76, 0x8c, 0x77, 0x1b, 0x86, 0x7,
+ 0x9c, 0x7c, 0xb, 0x70, 0x70, 0x76, 0x77, 0x70,
+ 0x70, 0x77, 0x9f, 0xa6, 0x1e, 0xb, 0xae, 0x12,
+ 0xae, 0xae, 0xb, 0xf7, 0xee, 0x15, 0xb, 0xb4,
+ 0x8f, 0x7f, 0xf7, 0x12, 0x62, 0xa, 0x52, 0xa,
+ 0xb, 0x9d, 0x15, 0xf7, 0x7e, 0xf7, 0x3e, 0xf7,
+ 0x7e, 0xfb, 0x3e, 0x31, 0xf7, 0xa7, 0xb, 0x15,
+ 0x7d, 0x96, 0x80, 0x99, 0x99, 0x96, 0x96, 0x99,
+ 0xb, 0x99, 0x80, 0x96, 0x7d, 0x7d, 0x80, 0x80,
+ 0x7d, 0x1e, 0xb, 0x88, 0x8c, 0x84, 0x9e, 0x81,
+ 0x9d, 0x81, 0x9c, 0x19, 0x87, 0x89, 0x5, 0xb,
+ 0x8e, 0x8a, 0x92, 0x78, 0x95, 0x79, 0x95, 0x7a,
+ 0x19, 0x8f, 0x8d, 0x5, 0xb, 0x77, 0x1, 0xae,
+ 0xb, 0x83, 0x83, 0x90, 0x94, 0x91, 0x8d, 0x90,
+ 0x8e, 0x90, 0x1f, 0xa2, 0xb3, 0xaf, 0x97, 0xb4,
+ 0x98, 0x8, 0xfb, 0x2d, 0xc2, 0x15, 0xb, 0xcc,
+ 0x77, 0xc8, 0x92, 0xc1, 0xc4, 0xb8, 0x5e, 0xf7,
+ 0x2e, 0xfb, 0x1, 0xb0, 0x70, 0xae, 0x8f, 0xf7,
+ 0x2e, 0xfb, 0x1b, 0x9d, 0xb, 0x87, 0x79, 0x89,
+ 0x79, 0x64, 0xa, 0x55, 0xa1, 0x5e, 0x1b, 0x60,
+ 0x81, 0x6c, 0x66, 0xb, 0xc3, 0x1b, 0xb7, 0xc1,
+ 0xbe, 0xac, 0xa4, 0x1f, 0x53, 0xa, 0xb, 0x8f,
+ 0x9d, 0x8d, 0x9d, 0x63, 0xa, 0xc1, 0x75, 0xb8,
+ 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xb, 0x3d, 0xa,
+ 0xf7, 0x63, 0x3, 0xb, 0xf7, 0x27, 0x15, 0xa1,
+ 0x92, 0xa0, 0x95, 0x9e, 0x98, 0x8, 0xb, 0x88,
+ 0x9f, 0xa0, 0x8a, 0x9f, 0x1b, 0x90, 0x7, 0x7a,
+ 0x9a, 0xb, 0x93, 0x93, 0x86, 0x82, 0x85, 0x89,
+ 0x86, 0x88, 0x86, 0x1f, 0x74, 0x63, 0x67, 0x7f,
+ 0x62, 0x7e, 0x8, 0xb, 0xae, 0x70, 0xb0, 0x8b,
+ 0xb8, 0x62, 0xb8, 0xc0, 0xc1, 0x59, 0xc1, 0x8e,
+ 0xc8, 0x52, 0xc8, 0x77, 0xcc, 0xb, 0x7a, 0xfb,
+ 0x1b, 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc3, 0x21,
+ 0xec, 0xe5, 0xc2, 0xd4, 0xd2, 0xc3, 0xb, 0xa7,
+ 0xd8, 0xcf, 0xaf, 0xb8, 0x5e, 0xf7, 0xa, 0xfb,
+ 0xa, 0xf7, 0x22, 0x38, 0xc6, 0x83, 0x92, 0xb,
+ 0x74, 0x4e, 0x99, 0xa8, 0x98, 0x99, 0x8d, 0x95,
+ 0xbb, 0xa3, 0x72, 0x6e, 0xad, 0x1f, 0xb, 0x52,
+ 0x1b, 0x5f, 0x55, 0x58, 0x6a, 0x72, 0x1f, 0xb,
+ 0x9d, 0x90, 0x8a, 0x90, 0x90, 0x1a, 0x71, 0xaf,
+ 0xb, 0x79, 0x86, 0x8c, 0x86, 0x86, 0x1a, 0xa5,
+ 0x67, 0xb, 0x13, 0xb2, 0x5a, 0x96, 0x56, 0xa0,
+ 0xb, 0xfb, 0xde, 0x6c, 0x76, 0xf9, 0xa2, 0x77,
+ 0x1, 0xaf, 0xf8, 0x49, 0x3, 0xb, 0xf7, 0x22,
+ 0xfb, 0xb, 0xc6, 0x51, 0xf7, 0xa, 0x5d, 0xb8,
+ 0x5f, 0xb8, 0xb, 0x9c, 0xf7, 0x1b, 0xcb, 0xf7,
+ 0x5b, 0x1a, 0xe0, 0x53, 0xf5, 0x2a, 0xb, 0xa5,
+ 0xa5, 0xa1, 0x76, 0x71, 0x71, 0x75, 0x75, 0x71,
+ 0x71, 0x75, 0xb, 0xf7, 0x4a, 0xfb, 0x6b, 0x15,
+ 0xb, 0xfb, 0x7f, 0x15, 0xb, 0xf7, 0x4a, 0x72,
+ 0xa4, 0xf7, 0x84, 0xa4, 0x72, 0xf7, 0x4a, 0xb,
+ 0x15, 0xf8, 0xad, 0xf8, 0xa8, 0xfc, 0xad, 0x7,
+ 0xe, 0x13, 0xe4, 0x82, 0xb9, 0x55, 0x40, 0xb,
+ 0x13, 0xb2, 0x96, 0x96, 0x56, 0xa0, 0xb, 0x13,
+ 0xb2, 0x9a, 0x96, 0x55, 0xa0, 0xb, 0x75, 0x84,
+ 0x76, 0x81, 0x78, 0x7e, 0xb, 0xf7, 0x11, 0xf8,
+ 0x78, 0xf7, 0x2, 0xb, 0xf7, 0x78, 0xf8, 0x6b,
+ 0x12, 0xb0, 0xb, 0xae, 0x1, 0xae, 0xae, 0xb,
+ 0x5, 0x8d, 0x7, 0xb, 0xf7, 0xf3, 0xf7, 0x7c,
+ 0xfb, 0xf3, 0xf7, 0x7c, 0x5, 0xb, 0x7e, 0x7d,
+ 0x89, 0x81, 0x5b, 0x73, 0xa4, 0xa8, 0x69, 0xb,
+ 0x15, 0x9b, 0x7b, 0x9d, 0x82, 0x90, 0x90, 0x90,
+ 0x90, 0xb, 0x15, 0x90, 0x86, 0x9d, 0x94, 0x9b,
+ 0x9b, 0x9b, 0x9b, 0xb, 0x3, 0xae, 0x16, 0xb,
+ 0x9a, 0x85, 0x97, 0x1e, 0x82, 0x9d, 0x80, 0x98,
+ 0xb, 0x99, 0x8b, 0xf7, 0x2, 0x3e, 0xb7, 0xac,
+ 0x99, 0xb, 0xfb, 0xad, 0x5, 0xf7, 0x35, 0x7,
+ 0xe, 0x13, 0x94, 0x54, 0xec, 0x1b, 0xb, 0x1f,
+ 0x8d, 0x8d, 0x5, 0xb, 0x5, 0x89, 0x7, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
new file mode 100644
index 0000000000..8bae0fa82b
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
@@ -0,0 +1,2208 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedFontData [17597] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+ 0x1, 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1,
+ 0xf8, 0x2b, 0x2, 0xf8, 0x2b, 0x3, 0xf8, 0x18,
+ 0x4, 0x6f, 0xfb, 0x8d, 0xf9, 0x8, 0xf9, 0xb7,
+ 0x5, 0xf7, 0x85, 0xf, 0xf9, 0x6c, 0x11, 0xaa,
+ 0x1c, 0x3e, 0x6b, 0x12, 0x0, 0x11, 0x1, 0x1,
+ 0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, 0x34,
+ 0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f,
+ 0x9e, 0x45, 0x75, 0x72, 0x6f, 0x47, 0x63, 0x61,
+ 0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, 0x64, 0x6f,
+ 0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f,
+ 0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61,
+ 0x72, 0x6f, 0x6e, 0x69, 0x6a, 0x6c, 0x69, 0x72,
+ 0x61, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65,
+ 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+ 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+ 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+ 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+ 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+ 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+ 0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+ 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+ 0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+ 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+ 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+ 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+ 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+ 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+ 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+ 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+ 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+ 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+ 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+ 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+ 0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+ 0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+ 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+ 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+ 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+ 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+ 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+ 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+ 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+ 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+ 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+ 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+ 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+ 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+ 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+ 0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+ 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+ 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+ 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+ 0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+ 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+ 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+ 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+ 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+ 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+ 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+ 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+ 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+ 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+ 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+ 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+ 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+ 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+ 0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+ 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+ 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+ 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+ 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+ 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+ 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+ 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+ 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4e,
+ 0x0, 0xa8, 0x0, 0xc5, 0x0, 0xf1, 0x1, 0x22,
+ 0x1, 0x41, 0x1, 0x8a, 0x1, 0xd7, 0x2, 0x3b,
+ 0x2, 0x86, 0x3, 0x4, 0x3, 0x3e, 0x3, 0x79,
+ 0x3, 0x92, 0x3, 0xbf, 0x3, 0xf5, 0x4, 0xa,
+ 0x4, 0x57, 0x4, 0xd4, 0x5, 0xb, 0x5, 0x3c,
+ 0x5, 0x71, 0x5, 0xac, 0x5, 0xc9, 0x6, 0x15,
+ 0x6, 0x32, 0x6, 0x5b, 0x6, 0x78, 0x6, 0xa1,
+ 0x6, 0xbd, 0x6, 0xef, 0x7, 0x39, 0x7, 0x5b,
+ 0x7, 0x95, 0x7, 0xd5, 0x8, 0x7, 0x8, 0x7a,
+ 0x8, 0xc3, 0x9, 0x1c, 0x9, 0x39, 0x9, 0x4b,
+ 0x9, 0x6d, 0x9, 0x88, 0xa, 0x1, 0xa, 0x47,
+ 0xa, 0x8b, 0xb, 0x27, 0xb, 0x83, 0xb, 0xfa,
+ 0xc, 0x80, 0xd, 0x26, 0xd, 0x5f, 0xd, 0xb9,
+ 0xd, 0xf8, 0xe, 0x15, 0xe, 0x25, 0xe, 0x46,
+ 0xe, 0x61, 0xe, 0x92, 0xe, 0xd8, 0xf, 0x1d,
+ 0xf, 0x5a, 0xf, 0x78, 0xf, 0x9e, 0xf, 0xc9,
+ 0x10, 0x10, 0x10, 0x73, 0x10, 0x89, 0x10, 0xab,
+ 0x10, 0xbd, 0x10, 0xf4, 0x11, 0x88, 0x11, 0x9e,
+ 0x12, 0x1d, 0x12, 0x5b, 0x12, 0x79, 0x12, 0xa1,
+ 0x12, 0xae, 0x12, 0xc6, 0x12, 0xec, 0x13, 0x1b,
+ 0x13, 0x5f, 0x13, 0x95, 0x14, 0x31, 0x14, 0x84,
+ 0x14, 0xe3, 0x14, 0xfb, 0x15, 0x10, 0x15, 0x61,
+ 0x15, 0xb3, 0x15, 0xd1, 0x15, 0xed, 0x16, 0x11,
+ 0x16, 0x2e, 0x16, 0x4f, 0x16, 0x96, 0x16, 0xb8,
+ 0x17, 0x37, 0x17, 0x77, 0x17, 0xd2, 0x17, 0xf7,
+ 0x18, 0xb, 0x18, 0x1e, 0x18, 0xa6, 0x19, 0x15,
+ 0x19, 0x73, 0x19, 0x96, 0x19, 0xda, 0x1a, 0x13,
+ 0x1a, 0x35, 0x1a, 0x58, 0x1a, 0xdf, 0x1a, 0xf1,
+ 0x1b, 0x7, 0x1b, 0x5b, 0x1b, 0x71, 0x1b, 0x93,
+ 0x1b, 0xa5, 0x1b, 0xc1, 0x1c, 0x36, 0x1c, 0x82,
+ 0x1c, 0x94, 0x1c, 0xa7, 0x1c, 0xc6, 0x1d, 0x38,
+ 0x1d, 0x70, 0x1d, 0x9f, 0x1d, 0xe4, 0x1e, 0x17,
+ 0x1e, 0x6b, 0x1e, 0x98, 0x1e, 0xf6, 0x1f, 0x2c,
+ 0x1f, 0x41, 0x1f, 0x7b, 0x1f, 0xc1, 0x20, 0x4a,
+ 0x20, 0x5b, 0x20, 0x82, 0x20, 0xb1, 0x20, 0xe2,
+ 0x21, 0x2, 0x21, 0x23, 0x21, 0x67, 0x21, 0x7d,
+ 0x21, 0x90, 0x21, 0xb5, 0x21, 0xcd, 0x21, 0xf6,
+ 0x22, 0x15, 0x22, 0x2d, 0x22, 0x85, 0x22, 0xc6,
+ 0x23, 0xc, 0x23, 0x25, 0x23, 0x4a, 0x23, 0xeb,
+ 0x24, 0x2, 0x24, 0x36, 0x24, 0x91, 0x24, 0xa6,
+ 0x24, 0xb9, 0x25, 0xa, 0x25, 0x36, 0x25, 0x76,
+ 0x25, 0xc8, 0x26, 0x55, 0x26, 0xb1, 0x26, 0xf3,
+ 0x27, 0xc, 0x27, 0x33, 0x27, 0x53, 0x27, 0xd5,
+ 0x28, 0x4, 0x28, 0x1d, 0x28, 0x41, 0x28, 0xac,
+ 0x29, 0xf, 0x29, 0x33, 0x29, 0x8f, 0x29, 0xca,
+ 0x2a, 0x3f, 0x2a, 0x92, 0x2a, 0xe1, 0x2b, 0xb,
+ 0x2b, 0x3e, 0x2b, 0x71, 0x2b, 0xb3, 0x2b, 0xcc,
+ 0x2b, 0xed, 0x2c, 0x52, 0x2c, 0x77, 0x2c, 0xa7,
+ 0x2d, 0x19, 0x2d, 0x66, 0x2d, 0xab, 0x2e, 0x7,
+ 0x2e, 0x1e, 0x2e, 0x26, 0x2e, 0x48, 0x2e, 0x50,
+ 0x2e, 0x5e, 0x2e, 0x6c, 0x2e, 0x7a, 0x2e, 0x90,
+ 0x2e, 0xda, 0x2f, 0x66, 0x2f, 0x9f, 0x30, 0xc,
+ 0x30, 0x94, 0x31, 0x3a, 0x31, 0xe9, 0x32, 0x9,
+ 0x32, 0x27, 0x32, 0x79, 0x32, 0x90, 0x32, 0x91,
+ 0x33, 0x25, 0x33, 0x63, 0x33, 0xbd, 0x34, 0x1f,
+ 0x34, 0xb8, 0x35, 0x15, 0x35, 0x56, 0x35, 0x9a,
+ 0x35, 0xe0, 0x36, 0x1f, 0x36, 0x64, 0x36, 0x7b,
+ 0x36, 0x9b, 0x36, 0xcd, 0x36, 0xe4, 0x36, 0xf4,
+ 0x37, 0x25, 0x37, 0x65, 0x37, 0xb2, 0x37, 0xec,
+ 0x38, 0x36, 0x38, 0x8f, 0x38, 0xe7, 0x39, 0x10,
+ 0x39, 0x5a, 0x39, 0xa7, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x4, 0xc1, 0xf7, 0xb4, 0xc1, 0x1, 0x8e, 0xf7,
+ 0x63, 0xab, 0xee, 0xbf, 0xf7, 0x60, 0x3, 0x8e,
+ 0x16, 0xf7, 0x63, 0xc1, 0x33, 0x6, 0xb6, 0xf7,
+ 0x4, 0x5, 0xf7, 0xaa, 0x6, 0xb7, 0xfb, 0x4,
+ 0x5, 0x2d, 0x55, 0xf7, 0x60, 0xc1, 0x56, 0x6,
+ 0xfb, 0x5f, 0xf8, 0x90, 0x5, 0xfb, 0x81, 0x55,
+ 0xf7, 0x1e, 0x6, 0xfb, 0x46, 0xfc, 0x5a, 0x5,
+ 0x4e, 0x6, 0xf7, 0x4a, 0xf7, 0x3a, 0x15, 0xf7,
+ 0x7, 0xf7, 0xba, 0xf7, 0xf, 0xfb, 0xba, 0x5,
+ 0xe, 0x8b, 0xc2, 0xf7, 0x3, 0xc2, 0xac, 0xc2,
+ 0xf7, 0x5b, 0xc1, 0x1, 0xdc, 0xc4, 0xf7, 0xa,
+ 0xc3, 0x8b, 0xc2, 0xdc, 0xc1, 0x9c, 0xc2, 0x3,
+ 0xa5, 0x16, 0xf7, 0x5a, 0xc2, 0x35, 0x6, 0xb7,
+ 0xf7, 0x3, 0x5, 0xf7, 0x16, 0xfb, 0x3a, 0xf7,
+ 0x9a, 0xf7, 0x2e, 0x54, 0x28, 0xfb, 0x2c, 0xf7,
+ 0x5b, 0xdc, 0x53, 0xc1, 0xf7, 0x3a, 0x55, 0x54,
+ 0x3a, 0xf7, 0x5b, 0xf7, 0x2c, 0x25, 0xc2, 0xf7,
+ 0x30, 0xfc, 0x2c, 0x55, 0xe5, 0x6, 0xfb, 0x43,
+ 0xfc, 0x59, 0x5, 0x54, 0x6, 0xf7, 0x44, 0xf7,
+ 0x3a, 0x15, 0xf7, 0x2, 0xf7, 0xb2, 0x5, 0xfb,
+ 0xb2, 0x7, 0xe, 0x4d, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0x54, 0xa, 0x3, 0x8e, 0x16, 0x24, 0xa,
+ 0xfb, 0x95, 0xf8, 0x18, 0x15, 0xf7, 0xac, 0xf0,
+ 0x6a, 0xd4, 0xfb, 0x96, 0xfb, 0x24, 0x5, 0xe,
+ 0x4d, 0xa, 0xf7, 0x2f, 0xc2, 0x1, 0x54, 0xa,
+ 0x3, 0xf7, 0x2d, 0xf8, 0xf1, 0x15, 0xf7, 0x26,
+ 0xf7, 0x7, 0xf7, 0x22, 0xfb, 0x7, 0xb3, 0x9d,
+ 0xfb, 0x24, 0xf7, 0x2c, 0x5, 0x3d, 0x6, 0xfb,
+ 0x25, 0xfb, 0x2c, 0x5, 0xfb, 0x3, 0xfd, 0x3,
+ 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x11,
+ 0xc1, 0xf7, 0xaa, 0xc1, 0xda, 0xf7, 0x9, 0x12,
+ 0x8e, 0xf7, 0x63, 0x73, 0xdc, 0xca, 0xdc, 0x79,
+ 0xf7, 0x60, 0x13, 0xf6, 0xf7, 0xde, 0xf9, 0x18,
+ 0x72, 0xa, 0xfb, 0x24, 0xfb, 0x9, 0x72, 0xa,
+ 0xfb, 0x4b, 0xfd, 0x8d, 0x15, 0x2d, 0xa, 0x6,
+ 0x13, 0xe9, 0x39, 0xa, 0xe, 0x4d, 0xa, 0x12,
+ 0x54, 0xa, 0x17, 0x8e, 0x16, 0x25, 0xa, 0x13,
+ 0x40, 0xf7, 0x3, 0xf7, 0xbb, 0xf7, 0xb, 0xfb,
+ 0xbb, 0x5, 0xfb, 0x9f, 0xf8, 0x7d, 0x79, 0xa,
+ 0xf7, 0x24, 0x5, 0xe, 0x4d, 0xa, 0xb0, 0xbd,
+ 0xdb, 0xbe, 0x12, 0x8e, 0xf7, 0x63, 0x83, 0xbe,
+ 0xdb, 0xc0, 0x92, 0xf7, 0x60, 0x13, 0xfb, 0x80,
+ 0xf7, 0x5e, 0xf9, 0x47, 0x15, 0x58, 0xb4, 0x65,
+ 0xbe, 0xbe, 0xb4, 0xb1, 0xbe, 0xbe, 0x62, 0xb4,
+ 0x58, 0x58, 0x62, 0x62, 0x58, 0x1e, 0xbe, 0x8c,
+ 0x15, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x9d, 0x79,
+ 0x75, 0x75, 0x79, 0x79, 0x75, 0x75, 0x79, 0x9d,
+ 0xa1, 0x1e, 0x13, 0xfd, 0x80, 0xfb, 0x8e, 0xfd,
+ 0x48, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xb, 0xc1, 0xf7, 0xa7, 0xc1, 0xdd, 0xbc, 0x1,
+ 0x54, 0xa, 0x3, 0xf7, 0x31, 0xf9, 0x17, 0x15,
+ 0x9e, 0x93, 0x9e, 0xb4, 0xbc, 0x1b, 0xa1, 0x9d,
+ 0x7e, 0x7c, 0xa0, 0x1f, 0x79, 0xa4, 0xa7, 0x78,
+ 0xb2, 0x1b, 0xcf, 0xad, 0xca, 0xb1, 0x96, 0x1f,
+ 0x58, 0x94, 0x5, 0x73, 0x83, 0x72, 0x66, 0x65,
+ 0x1b, 0x75, 0x7a, 0x9d, 0x9c, 0x75, 0x1f, 0x9a,
+ 0x77, 0x72, 0x9a, 0x63, 0x1b, 0x52, 0x5b, 0x5d,
+ 0x56, 0x78, 0x1f, 0x23, 0xfd, 0x21, 0x15, 0x24,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+ 0x5c, 0xc1, 0x12, 0xf7, 0xb, 0xc2, 0xf7, 0xb0,
+ 0xc9, 0x74, 0xc8, 0x13, 0xf4, 0xb5, 0x16, 0xf7,
+ 0xbd, 0x6, 0xf7, 0x17, 0xe3, 0xb6, 0xf7, 0x0,
+ 0xd8, 0x4b, 0xb5, 0x4b, 0x97, 0x1f, 0x13, 0xf8,
+ 0xc0, 0x9b, 0xb0, 0xc7, 0xc1, 0x1a, 0xf7, 0xb,
+ 0x34, 0xaa, 0xfb, 0xc, 0x1e, 0xfb, 0xa3, 0x55,
+ 0xd8, 0xfc, 0x5a, 0x3e, 0x6, 0xf7, 0x18, 0xf7,
+ 0x8f, 0x15, 0xf7, 0x5f, 0x7, 0xf7, 0x2d, 0xf7,
+ 0x17, 0x92, 0x24, 0x32, 0x34, 0x79, 0x55, 0x1f,
+ 0xfb, 0x23, 0xfb, 0x8f, 0x15, 0xf7, 0x58, 0x7,
+ 0x13, 0xf4, 0xf7, 0x5d, 0xf7, 0xe, 0x7c, 0x36,
+ 0x37, 0x2e, 0x7f, 0x4a, 0x1f, 0xe, 0x79, 0xc1,
+ 0xf8, 0x7e, 0xc1, 0x1, 0xb9, 0xc3, 0xf8, 0x13,
+ 0xc1, 0x3, 0xf8, 0x9b, 0xf5, 0x15, 0x64, 0x56,
+ 0x39, 0x6c, 0x47, 0x1b, 0xfb, 0x9, 0x2a, 0xe9,
+ 0xf7, 0x32, 0xf7, 0x3f, 0xf7, 0x1f, 0xce, 0xd6,
+ 0xcb, 0xd5, 0x64, 0x59, 0xaa, 0x1f, 0x31, 0xc1,
+ 0xf7, 0x7d, 0x55, 0x4e, 0x7, 0xbd, 0x56, 0x4c,
+ 0x96, 0x56, 0x1b, 0xfb, 0x31, 0xfb, 0x5, 0xfb,
+ 0x1f, 0xfb, 0x2d, 0xfb, 0x39, 0xec, 0xfb, 0x21,
+ 0xf7, 0x41, 0xda, 0xe8, 0xa9, 0xb8, 0xc8, 0x1f,
+ 0xe, 0xfb, 0x16, 0x76, 0xf7, 0x3f, 0xbf, 0xf8,
+ 0x5d, 0xbe, 0x1, 0xbd, 0xc4, 0xf8, 0x15, 0xc4,
+ 0x3, 0xf7, 0x7c, 0xfb, 0xb, 0x15, 0x83, 0x92,
+ 0xa2, 0x73, 0xa7, 0x1b, 0xad, 0xb0, 0xa0, 0xc5,
+ 0xab, 0x7a, 0xa8, 0x6f, 0x94, 0x1f, 0x8d, 0xa1,
+ 0x5, 0xe6, 0xd9, 0xa3, 0xb5, 0xc9, 0x1f, 0x73,
+ 0xbb, 0x5, 0x66, 0x55, 0x47, 0x72, 0x46, 0x1b,
+ 0xfb, 0x15, 0x29, 0xe1, 0xf7, 0x28, 0xf7, 0x43,
+ 0xf7, 0x1f, 0xbb, 0xd7, 0xcc, 0xc7, 0x6e, 0x5f,
+ 0xb8, 0x1f, 0x35, 0xc4, 0xf7, 0x66, 0x52, 0x52,
+ 0x7, 0xbd, 0x43, 0x59, 0x92, 0x54, 0x1b, 0xfb,
+ 0x33, 0x21, 0xfb, 0x11, 0xfb, 0x24, 0xfb, 0x1e,
+ 0xd4, 0xfb, 0xe, 0xf7, 0x28, 0x70, 0x1f, 0x82,
+ 0x42, 0x5, 0x8f, 0x94, 0x94, 0x8b, 0x94, 0x1b,
+ 0x9a, 0x97, 0x7d, 0x7f, 0x76, 0x7d, 0x81, 0x7c,
+ 0x7d, 0x7b, 0x90, 0x9a, 0x82, 0x1f, 0xe, 0x46,
+ 0xa, 0xf7, 0x3, 0xc4, 0xf7, 0xe6, 0xc6, 0x3,
+ 0xad, 0x16, 0xf7, 0x7a, 0x6, 0xf7, 0x21, 0xf7,
+ 0x34, 0xc4, 0xf7, 0x7b, 0xf7, 0x62, 0xfb, 0x1c,
+ 0xcf, 0xfb, 0x39, 0x1f, 0xfb, 0x7a, 0x54, 0xd8,
+ 0xfc, 0x58, 0x3e, 0x6, 0xf7, 0x1a, 0x16, 0xf8,
+ 0x58, 0xeb, 0x7, 0xf7, 0x31, 0xe0, 0x47, 0xfb,
+ 0x2b, 0xfb, 0x35, 0x31, 0x43, 0xfb, 0x2c, 0x1f,
+ 0xe, 0x8b, 0xc0, 0xf7, 0x5c, 0xc1, 0xf7, 0x5d,
+ 0xc1, 0x1, 0xf7, 0x1a, 0xc3, 0xf7, 0x7, 0xc4,
+ 0xef, 0xc3, 0x3, 0xbf, 0x16, 0xf8, 0x66, 0xf7,
+ 0x4f, 0x53, 0xfb, 0x1a, 0xfb, 0xa4, 0xf7, 0x5c,
+ 0xf7, 0x7, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+ 0xfb, 0x7, 0xf7, 0x5d, 0xf7, 0xa4, 0xfb, 0x1a,
+ 0xc3, 0xf7, 0x50, 0xfc, 0x66, 0x55, 0xdd, 0xfc,
+ 0x5b, 0x39, 0x6, 0xe, 0x47, 0xa, 0xf7, 0x58,
+ 0xf8, 0xfe, 0x15, 0xf7, 0xb8, 0xf0, 0x69, 0xd5,
+ 0xfb, 0xa3, 0xfb, 0x25, 0x5, 0xfb, 0x18, 0xfd,
+ 0x1c, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+ 0x7a, 0x77, 0x12, 0x61, 0xa, 0x17, 0xf7, 0x36,
+ 0xf9, 0x5, 0x15, 0x13, 0xfe, 0xf7, 0x2d, 0xf7,
+ 0x7, 0xf7, 0x29, 0xfb, 0x7, 0xb5, 0x9d, 0xfb,
+ 0x2b, 0xf7, 0x2c, 0x5, 0x39, 0x6, 0xfb, 0x2b,
+ 0xfb, 0x2b, 0x5, 0x44, 0xfd, 0x18, 0x15, 0x2f,
+ 0xa, 0xe, 0x4e, 0xa, 0xe5, 0xf7, 0x8, 0x12,
+ 0xf7, 0x1a, 0xc2, 0x93, 0xe0, 0xcb, 0xe1, 0x3c,
+ 0xc4, 0xdd, 0xc3, 0x13, 0xfe, 0x80, 0xf7, 0xee,
+ 0xf9, 0x23, 0x15, 0xe1, 0xf7, 0x8, 0x35, 0x6,
+ 0xfb, 0x29, 0xfb, 0x8, 0x15, 0xe0, 0xf7, 0x8,
+ 0x36, 0x6, 0xfb, 0x26, 0xfd, 0x97, 0x15, 0x40,
+ 0xa, 0x6, 0x13, 0xfd, 0x80, 0x2e, 0xa, 0xe,
+ 0x47, 0xa, 0xbe, 0x16, 0x2f, 0xa, 0xf8, 0x27,
+ 0xf8, 0xc9, 0x15, 0x96, 0xa9, 0xfb, 0xa4, 0xf7,
+ 0x24, 0x69, 0x42, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x56, 0xc0, 0xf7, 0x63, 0xc1, 0x1, 0xf7, 0x1,
+ 0xc3, 0xf7, 0xeb, 0xcb, 0x3, 0xa7, 0x16, 0xf7,
+ 0x8d, 0x6, 0xf7, 0x35, 0xf7, 0x1a, 0xc4, 0xf7,
+ 0x7f, 0xf7, 0x68, 0xfb, 0x33, 0xc5, 0xfb, 0x37,
+ 0x1f, 0xfb, 0x72, 0x55, 0xdc, 0xfb, 0x63, 0x3d,
+ 0x56, 0xd9, 0xfb, 0x56, 0x3a, 0x6, 0xf7, 0x1d,
+ 0x16, 0xf7, 0x56, 0xf7, 0x4d, 0xc0, 0xfb, 0x4d,
+ 0xf7, 0x63, 0xe0, 0x7, 0xf7, 0x37, 0xea, 0x4c,
+ 0xfb, 0x2d, 0xfb, 0x3b, 0x41, 0x44, 0xfb, 0x31,
+ 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0x27, 0xbf, 0xc3,
+ 0xc0, 0xf7, 0x2b, 0xbe, 0x1, 0xd8, 0xc7, 0xf8,
+ 0x25, 0xc6, 0x3, 0x8e, 0xf7, 0x57, 0x15, 0xe0,
+ 0x6, 0xfb, 0x9, 0xaa, 0xe8, 0x3d, 0xf7, 0x30,
+ 0x1b, 0xde, 0xdc, 0xa6, 0xb6, 0xcc, 0x1f, 0x71,
+ 0xb8, 0x5, 0x65, 0x53, 0x44, 0x72, 0x44, 0x1b,
+ 0x20, 0x35, 0xb8, 0xed, 0x6b, 0x1f, 0xf7, 0x83,
+ 0x6, 0xa1, 0xbf, 0x5, 0xfb, 0xa4, 0x6, 0x9b,
+ 0x89, 0xa7, 0x8d, 0x9b, 0x1e, 0xf7, 0xb7, 0x6,
+ 0x9f, 0xc0, 0x5, 0xfb, 0xc1, 0x6, 0xe4, 0xa4,
+ 0xd8, 0xc9, 0xf0, 0x1b, 0xd5, 0xd5, 0x73, 0x64,
+ 0xb3, 0x1f, 0x3e, 0xc6, 0xf7, 0x53, 0x50, 0x5a,
+ 0x7, 0xac, 0x56, 0x54, 0x9b, 0x3e, 0x1b, 0xfb,
+ 0x1f, 0x28, 0x33, 0xfb, 0x6, 0x6e, 0x1f, 0x4e,
+ 0x6, 0x75, 0x56, 0x5, 0xd5, 0x6, 0x70, 0x8c,
+ 0x75, 0x8c, 0x80, 0x1e, 0x55, 0x6, 0xe, 0x8b,
+ 0xc2, 0xf7, 0x5f, 0xc2, 0xf7, 0x56, 0xc2, 0x1,
+ 0xf7, 0x18, 0xc2, 0xf7, 0x35, 0xc2, 0xe3, 0xc2,
+ 0x3, 0xc1, 0x16, 0xf7, 0x9c, 0xc2, 0xfb, 0x17,
+ 0xf7, 0x5f, 0xf7, 0x35, 0x38, 0xc2, 0xf7, 0x72,
+ 0x54, 0x37, 0xfb, 0x35, 0xf7, 0x56, 0xf7, 0xc4,
+ 0xfb, 0x11, 0xc2, 0xf7, 0x48, 0xfc, 0x80, 0x54,
+ 0xd9, 0xfc, 0x58, 0x3d, 0x6, 0xe, 0x79, 0xc2,
+ 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0xad,
+ 0xc5, 0xf8, 0x12, 0xc2, 0x3, 0xf7, 0xcc, 0x7c,
+ 0xa, 0x7b, 0x6a, 0x48, 0x79, 0x54, 0x1b, 0xfb,
+ 0x23, 0x37, 0xf7, 0x8, 0xf7, 0x12, 0xf7, 0x44,
+ 0xf7, 0x2, 0x43, 0xa, 0x23, 0xfb, 0x1d, 0xfb,
+ 0x37, 0xfb, 0x21, 0xdd, 0x53, 0xa, 0xe, 0x79,
+ 0xc2, 0xf7, 0x3b, 0xc2, 0xf7, 0x9e, 0xc2, 0x1,
+ 0xa7, 0xc5, 0xf8, 0x11, 0xc2, 0x3, 0xf7, 0xc5,
+ 0x7c, 0xa, 0x76, 0x4b, 0x67, 0x7e, 0x54, 0x1b,
+ 0xfb, 0x23, 0x38, 0xf7, 0x8, 0xf7, 0x12, 0xf7,
+ 0x44, 0xf7, 0x1, 0x43, 0xa, 0x24, 0xfb, 0x1d,
+ 0xfb, 0x37, 0xfb, 0x21, 0xdc, 0x53, 0xa, 0x68,
+ 0xf8, 0x6, 0x37, 0xa, 0x8b, 0xc2, 0xf7, 0x5a,
+ 0xc2, 0xf7, 0x5b, 0xc2, 0x1, 0xf7, 0x1, 0xc1,
+ 0xf7, 0xa6, 0xc1, 0x3, 0xab, 0x16, 0xf7, 0x70,
+ 0xc2, 0x32, 0xf7, 0x5a, 0xf7, 0xa6, 0xfb, 0x5a,
+ 0x33, 0x54, 0xf7, 0x6f, 0xc2, 0x3e, 0xf8, 0x58,
+ 0xd8, 0xc2, 0xfb, 0x65, 0x54, 0xd9, 0xfb, 0x5b,
+ 0xfb, 0xa6, 0xf7, 0x5b, 0xda, 0xc2, 0xfb, 0x66,
+ 0x54, 0xd8, 0xfc, 0x58, 0x3e, 0x6, 0xe, 0x46,
+ 0xa, 0xf7, 0xa3, 0xc2, 0x3, 0xeb, 0x16, 0xf8,
+ 0x2c, 0xc2, 0xfb, 0x46, 0xf8, 0x58, 0xf7, 0x38,
+ 0xc2, 0xfc, 0x11, 0x54, 0xf7, 0x36, 0xfc, 0x58,
+ 0xfb, 0x43, 0x6, 0xe, 0x79, 0xc3, 0xf8, 0x68,
+ 0xc3, 0x1, 0xec, 0xc5, 0xf7, 0xd, 0xc2, 0xf7,
+ 0x22, 0xc4, 0x3, 0xa3, 0x79, 0x15, 0xf7, 0x62,
+ 0xc3, 0x40, 0xf8, 0x68, 0xd1, 0xc3, 0xfb, 0x5c,
+ 0x53, 0xd3, 0xfc, 0x68, 0x42, 0x6, 0xf7, 0x90,
+ 0xa0, 0x15, 0x85, 0x8c, 0xaa, 0x44, 0xf1, 0x1b,
+ 0xf7, 0xb, 0x8c, 0xf7, 0x24, 0xc2, 0x1f, 0x8c,
+ 0xf7, 0xda, 0x5, 0xb7, 0xc2, 0xfb, 0x4c, 0x54,
+ 0xde, 0x6, 0x8a, 0xfb, 0xd9, 0x5, 0x6f, 0x8e,
+ 0xfb, 0xc, 0x45, 0x71, 0x5a, 0x95, 0x7f, 0xa,
+ 0x6c, 0xa, 0x1, 0xf7, 0xa3, 0xc5, 0x3, 0xf7,
+ 0x48, 0xf8, 0xfe, 0x15, 0xf7, 0xc7, 0xf2, 0x68,
+ 0xd3, 0xfb, 0xb1, 0xfb, 0x25, 0x5, 0x44, 0xfd,
+ 0x1c, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa, 0x1,
+ 0xf7, 0xa3, 0xc5, 0x3, 0xf7, 0x25, 0xf8, 0xfb,
+ 0x15, 0xf7, 0x2e, 0xf7, 0x7, 0xf7, 0x30, 0xfb,
+ 0x7, 0xb7, 0x9d, 0xfb, 0x31, 0xf7, 0x2c, 0x5,
+ 0x35, 0x6, 0xfb, 0x2f, 0xfb, 0x2c, 0x5, 0x86,
+ 0xfd, 0xd, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa,
+ 0xe3, 0xf7, 0x8, 0x1, 0xf7, 0xa3, 0xc5, 0x3,
+ 0xf7, 0xe6, 0xf9, 0x20, 0x76, 0xa, 0xfb, 0x31,
+ 0xfb, 0x8, 0x76, 0xa, 0x36, 0xfd, 0x94, 0x15,
+ 0x32, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5e, 0xc1,
+ 0xcd, 0xf7, 0x8, 0x12, 0xf7, 0x95, 0xe5, 0x3f,
+ 0xc5, 0x13, 0xe8, 0xeb, 0x16, 0xf8, 0x2c, 0xc1,
+ 0xfb, 0x43, 0xf8, 0x5e, 0x42, 0xa, 0xfc, 0x5e,
+ 0xfb, 0x43, 0x6, 0x13, 0xf0, 0xf7, 0x35, 0xf8,
+ 0xd6, 0x76, 0xa, 0xe, 0x6c, 0xa, 0x1, 0x8b,
+ 0xa0, 0xf7, 0x8e, 0xc5, 0x3, 0xeb, 0x16, 0x32,
+ 0xa, 0xb9, 0xf9, 0x2d, 0x15, 0xf7, 0xc8, 0x26,
+ 0x97, 0xa9, 0xfb, 0xaf, 0xf7, 0x25, 0x5, 0xe,
+ 0x79, 0xba, 0xf8, 0x72, 0xc2, 0x1, 0xb7, 0xc2,
+ 0xf7, 0xa2, 0xc0, 0x3, 0xb7, 0xca, 0x15, 0x4c,
+ 0xc8, 0xd7, 0x79, 0xd0, 0x1b, 0xf7, 0x31, 0x9a,
+ 0xf4, 0xe9, 0x1f, 0xf7, 0xda, 0xf7, 0x1a, 0xc2,
+ 0xfc, 0x15, 0x54, 0xf7, 0x5a, 0xfb, 0xd9, 0x7,
+ 0x36, 0x80, 0x47, 0xfb, 0x6, 0x50, 0x35, 0x9a,
+ 0x7f, 0xa, 0x8b, 0xc1, 0xf8, 0x59, 0xc2, 0x1,
+ 0xf6, 0xc0, 0xf7, 0x47, 0xf7, 0x59, 0x3, 0xa7,
+ 0x16, 0xf7, 0x71, 0xc1, 0x32, 0xf7, 0x38, 0x6,
+ 0xdd, 0xdd, 0xe6, 0xfb, 0xa, 0xbd, 0x2d, 0xb6,
+ 0x33, 0x19, 0xf7, 0x26, 0xc1, 0xfb, 0x6, 0x6,
+ 0x5e, 0xea, 0x4c, 0xf0, 0x44, 0xde, 0xf7, 0x4d,
+ 0xf7, 0x42, 0x18, 0xd3, 0xc2, 0xfb, 0x59, 0x54,
+ 0xc5, 0x6, 0xfb, 0x81, 0xfb, 0x73, 0x5, 0xf7,
+ 0x73, 0xd9, 0xc2, 0xfb, 0x66, 0x54, 0xda, 0xfc,
+ 0x59, 0x3c, 0x7, 0xe, 0x46, 0xa, 0xf7, 0x2c,
+ 0xc2, 0xf7, 0xb7, 0xc2, 0x3, 0xb9, 0x16, 0xf8,
+ 0x8f, 0xf7, 0x8b, 0x54, 0xfb, 0x54, 0xfb, 0xb7,
+ 0xf8, 0x58, 0xf7, 0x11, 0xc2, 0xfb, 0xb2, 0x54,
+ 0xf5, 0xfc, 0x58, 0x21, 0x6, 0xe, 0x75, 0xa,
+ 0xf7, 0x2d, 0xc3, 0xf7, 0xb4, 0xc3, 0x3, 0xb9,
+ 0x16, 0xf8, 0x8f, 0xf7, 0x91, 0x53, 0xfb, 0x5b,
+ 0xfb, 0xb4, 0xf7, 0x4e, 0x6, 0xf7, 0x43, 0xd1,
+ 0x5, 0xc2, 0x7, 0xfb, 0x43, 0x44, 0x5, 0xf7,
+ 0x6a, 0xf7, 0x12, 0xc1, 0xfb, 0xb5, 0x55, 0xf6,
+ 0xfb, 0x80, 0x7, 0x37, 0x69, 0x5, 0x55, 0x7,
+ 0xdf, 0xad, 0x5, 0xfb, 0x38, 0x20, 0x7, 0xe,
+ 0x46, 0xa, 0xd1, 0xc3, 0xf7, 0xf2, 0xc3, 0x3,
+ 0xa0, 0x16, 0xf7, 0x3a, 0xc2, 0x4e, 0xf8, 0x58,
+ 0x93, 0x6, 0xf7, 0x26, 0xfc, 0xe, 0x5, 0xb6,
+ 0x6, 0xf7, 0x23, 0xf8, 0xe, 0x5, 0x95, 0xfc,
+ 0x58, 0x52, 0x54, 0xf7, 0x34, 0xc2, 0x5c, 0xf8,
+ 0x58, 0xb9, 0xc2, 0xfb, 0x25, 0x6, 0xfb, 0x16,
+ 0xfb, 0xeb, 0xfb, 0x19, 0xf7, 0xeb, 0x5, 0xfb,
+ 0x29, 0x54, 0xbc, 0xfc, 0x58, 0x5a, 0x6, 0xe,
+ 0x46, 0xa, 0xe4, 0xc4, 0xf7, 0xcd, 0xc3, 0x3,
+ 0x92, 0x16, 0xf7, 0x8d, 0xc2, 0xfb, 0x2, 0xf8,
+ 0x41, 0x6, 0xf7, 0xba, 0xfc, 0x78, 0x5, 0xd6,
+ 0xf8, 0x8f, 0xd9, 0xc2, 0xfb, 0x93, 0x54, 0xf7,
+ 0xd, 0xfc, 0x44, 0x6, 0xfb, 0xb9, 0xf8, 0x7b,
+ 0x5, 0xfb, 0x33, 0x54, 0xdd, 0xfc, 0x58, 0x39,
+ 0x6, 0xe, 0x8c, 0xbf, 0xf8, 0x5b, 0xc0, 0xd7,
+ 0xbf, 0x99, 0xbc, 0x1, 0xe4, 0xc4, 0xf7, 0xcd,
+ 0xc3, 0x3, 0x92, 0x8c, 0x15, 0xf7, 0x8d, 0xbf,
+ 0xfb, 0x2, 0xf8, 0x45, 0x6, 0xf7, 0xba, 0xfc,
+ 0x79, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, 0xc0, 0xfb,
+ 0x88, 0x56, 0xf7, 0x2, 0xfc, 0x47, 0x6, 0xfb,
+ 0xb9, 0xf8, 0x7c, 0x5, 0xfb, 0x33, 0x56, 0xdd,
+ 0xfc, 0x5b, 0x39, 0x6, 0xf7, 0x2e, 0xf8, 0xe0,
+ 0x15, 0x9f, 0x93, 0x9f, 0xb5, 0xbd, 0x1b, 0xa5,
+ 0xa1, 0x78, 0x79, 0xa4, 0x1f, 0x7a, 0xa3, 0xa5,
+ 0x7f, 0xaf, 0x1b, 0xd2, 0xae, 0xca, 0xb3, 0x96,
+ 0x1f, 0x57, 0x94, 0x5, 0x72, 0x81, 0x72, 0x68,
+ 0x64, 0x1b, 0x71, 0x7b, 0x9c, 0x9e, 0x71, 0x1f,
+ 0x99, 0x77, 0x72, 0x98, 0x64, 0x1b, 0x50, 0x59,
+ 0x5d, 0x55, 0x78, 0x1f, 0xe, 0x79, 0xc2, 0xf8,
+ 0x7c, 0xc2, 0x1, 0xb6, 0xc2, 0xf8, 0x22, 0xc8,
+ 0x3, 0xb6, 0xf7, 0xa7, 0x15, 0xfb, 0x38, 0xeb,
+ 0xfb, 0x15, 0xf7, 0x32, 0xf7, 0x36, 0xed, 0xf7,
+ 0x12, 0xf7, 0x3b, 0xf7, 0x16, 0x4b, 0xf7, 0x43,
+ 0xfb, 0x57, 0xfb, 0x45, 0x3d, 0xfb, 0x38, 0xfb,
+ 0x21, 0x1e, 0xc2, 0x16, 0xee, 0xb9, 0xf7, 0x2b,
+ 0xf7, 0x2d, 0xf7, 0x2d, 0xb9, 0xfb, 0x2e, 0x2b,
+ 0xfb, 0x1e, 0x3d, 0x27, 0xfb, 0xd, 0xfb, 0x9,
+ 0x39, 0xec, 0xf7, 0x21, 0x1e, 0xe, 0x87, 0xc1,
+ 0xf7, 0x4f, 0xc2, 0xf7, 0x6c, 0xc1, 0x12, 0x9f,
+ 0xc3, 0xf7, 0x81, 0xc3, 0xd2, 0xc2, 0xa8, 0xc3,
+ 0x17, 0xf8, 0x5, 0xbd, 0x15, 0xf7, 0x60, 0xd2,
+ 0x4a, 0xc2, 0xf7, 0x4c, 0x54, 0x4b, 0x44, 0xf7,
+ 0x5b, 0x7, 0x13, 0xfa, 0xf7, 0x2f, 0x27, 0xc3,
+ 0xf7, 0x2e, 0xfb, 0xac, 0x6, 0xfb, 0x64, 0x43,
+ 0xfb, 0x1a, 0xfb, 0x2b, 0xfb, 0x1d, 0xd3, 0xfb,
+ 0x24, 0xf7, 0x56, 0x1f, 0xf7, 0xba, 0xf7, 0x32,
+ 0x53, 0x23, 0x6, 0xfb, 0x67, 0x16, 0xfb, 0x1a,
+ 0x87, 0x24, 0xd3, 0xf7, 0x34, 0x1a, 0xf7, 0x3e,
+ 0xf2, 0xcd, 0xf7, 0x1a, 0x85, 0x1e, 0xe, 0x64,
+ 0xa, 0xf7, 0x6d, 0x77, 0x57, 0xa, 0xf7, 0x51,
+ 0xf8, 0xfe, 0x15, 0xf7, 0xb0, 0xf0, 0x6a, 0xd5,
+ 0xfb, 0x9b, 0xfb, 0x25, 0x5, 0xfb, 0x1a, 0xfc,
+ 0x5, 0x20, 0xa, 0xe, 0x64, 0xa, 0xd1, 0x76,
+ 0x57, 0xa, 0xf7, 0x32, 0xf9, 0x5, 0x49, 0xa,
+ 0x41, 0xfb, 0xff, 0x20, 0xa, 0xe, 0x64, 0xa,
+ 0xcf, 0xf7, 0x9, 0x1, 0xb6, 0xc1, 0xe9, 0xde,
+ 0xca, 0xde, 0xdc, 0xc3, 0x3, 0xf7, 0xe5, 0xf9,
+ 0x18, 0x62, 0xa, 0xfb, 0x26, 0xfb, 0x9, 0x62,
+ 0xa, 0xfb, 0x28, 0xfc, 0x76, 0x20, 0xa, 0xe,
+ 0x64, 0xa, 0xf7, 0x49, 0x77, 0x57, 0xa, 0xb6,
+ 0xf7, 0xab, 0x20, 0xa, 0xc6, 0xf8, 0x2f, 0x15,
+ 0xf7, 0xb0, 0x45, 0x96, 0xa9, 0xfb, 0x9a, 0xf7,
+ 0x1, 0x5, 0xe, 0x7a, 0x76, 0xa5, 0xc2, 0xf8,
+ 0x7b, 0xc2, 0x9c, 0x77, 0x12, 0xb2, 0xc2, 0xf8,
+ 0x2d, 0xc4, 0x13, 0xdc, 0xc1, 0x85, 0x15, 0xb6,
+ 0x6b, 0xc2, 0xd6, 0x5, 0x6c, 0xb4, 0xbe, 0x79,
+ 0xc5, 0x1b, 0xf7, 0x36, 0xeb, 0xf7, 0x1b, 0xf7,
+ 0x38, 0xbf, 0x7c, 0xe1, 0x5a, 0xcd, 0x1f, 0xc5,
+ 0xd9, 0x60, 0xac, 0x56, 0x44, 0x5, 0x13, 0xec,
+ 0xab, 0x65, 0x59, 0xa1, 0x48, 0x1b, 0xfb, 0x45,
+ 0x34, 0xfb, 0x31, 0xfb, 0x21, 0x38, 0xa5, 0x3f,
+ 0xba, 0x55, 0x1f, 0xd4, 0x93, 0x15, 0xf7, 0xa8,
+ 0xf7, 0xff, 0x5, 0xad, 0x56, 0x93, 0x49, 0x62,
+ 0x1a, 0xfb, 0x13, 0x46, 0xfb, 0x7, 0xfb, 0x17,
+ 0x5d, 0x63, 0x9a, 0xa3, 0x6b, 0x1e, 0x65, 0xb1,
+ 0x15, 0x69, 0xb7, 0x78, 0xc6, 0xc9, 0x1a, 0xe4,
+ 0xc0, 0xf7, 0x30, 0xf7, 0x2e, 0xc0, 0xb3, 0x7a,
+ 0x71, 0xa9, 0x1e, 0xe, 0x64, 0xa, 0xcc, 0xbc,
+ 0x98, 0xbc, 0x57, 0xa, 0xf7, 0x3c, 0xf9, 0x15,
+ 0x15, 0x9f, 0x92, 0x9e, 0xb5, 0xbc, 0x1b, 0xa9,
+ 0x9f, 0x7c, 0x79, 0xa1, 0x1f, 0x7b, 0xa0, 0xa2,
+ 0x7e, 0xb0, 0x1b, 0xcf, 0xad, 0xc6, 0xb2, 0x96,
+ 0x1f, 0x58, 0x94, 0x5, 0x73, 0x82, 0x75, 0x69,
+ 0x65, 0x1b, 0x73, 0x7b, 0x9a, 0x9d, 0x75, 0x1f,
+ 0x9a, 0x78, 0x72, 0x99, 0x61, 0x1b, 0x52, 0x5b,
+ 0x52, 0x55, 0x78, 0x1f, 0x41, 0xfb, 0xfe, 0x20,
+ 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0x1c, 0xc1, 0xf7,
+ 0x9b, 0xc1, 0x1, 0xf7, 0x1e, 0xc2, 0xf7, 0xb7,
+ 0xc2, 0x3, 0xc7, 0x16, 0xf7, 0xb2, 0xc2, 0xfb,
+ 0x2d, 0xf7, 0x1c, 0xf7, 0x1a, 0x6, 0xf7, 0x5,
+ 0xee, 0xca, 0xf7, 0xe, 0xe1, 0x50, 0xef, 0xfb,
+ 0x2c, 0x1f, 0xfb, 0xa0, 0x55, 0xd9, 0xfc, 0x59,
+ 0x3d, 0x6, 0xf7, 0x19, 0xf7, 0x52, 0x15, 0xf7,
+ 0x9b, 0xf7, 0x18, 0x7, 0xdb, 0xda, 0x6a, 0x28,
+ 0x27, 0x37, 0x6c, 0x42, 0x1f, 0xe, 0xfb, 0x9,
+ 0x76, 0xb6, 0xf7, 0x11, 0x56, 0xc0, 0xf8, 0x86,
+ 0xbf, 0x12, 0xb6, 0xc2, 0xf8, 0x26, 0xc4, 0x13,
+ 0xdc, 0xf7, 0x16, 0x31, 0x15, 0xa0, 0x5e, 0x5,
+ 0xa3, 0xb8, 0xaf, 0x9b, 0xb9, 0x1b, 0xaa, 0xa6,
+ 0x7f, 0x80, 0xa4, 0x1f, 0x81, 0xa2, 0xa5, 0x81,
+ 0xb0, 0x1b, 0xae, 0xae, 0x98, 0xa1, 0xa5, 0x1f,
+ 0x76, 0xb8, 0x5, 0x7d, 0x76, 0x71, 0x81, 0x72,
+ 0x1b, 0x72, 0x74, 0x95, 0x95, 0x73, 0x1f, 0x96,
+ 0x72, 0x71, 0x95, 0x6e, 0x1b, 0x7c, 0x7c, 0x86,
+ 0x89, 0x7c, 0x1f, 0x13, 0xbc, 0x99, 0x92, 0x97,
+ 0x92, 0x97, 0x96, 0x8, 0xf7, 0x2a, 0xf7, 0x8,
+ 0xf7, 0xc, 0xf7, 0x42, 0xf7, 0x32, 0x3f, 0xf7,
+ 0x2b, 0xfb, 0x4a, 0xfb, 0x33, 0x2a, 0xfb, 0x2a,
+ 0xfb, 0x33, 0xfb, 0x24, 0xcf, 0xfb, 0x0, 0xf7,
+ 0x10, 0x66, 0x1f, 0x70, 0x70, 0x5f, 0x70, 0x69,
+ 0x79, 0x8, 0x6b, 0xf7, 0xfd, 0x15, 0xf7, 0x16,
+ 0xe0, 0xf7, 0x13, 0xf7, 0x7, 0xf7, 0x13, 0xd6,
+ 0xfb, 0xf, 0xfb, 0x1a, 0xfb, 0x4a, 0xfb, 0x1d,
+ 0x50, 0x49, 0x48, 0xfb, 0x18, 0xc1, 0xf7, 0x4f,
+ 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0x55, 0xc2, 0xf7,
+ 0x60, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xac, 0xc2,
+ 0x3, 0xa4, 0x16, 0xf7, 0x6e, 0xc2, 0x39, 0xf7,
+ 0x55, 0xf7, 0x8, 0x6, 0xb2, 0x5c, 0xe4, 0xfb,
+ 0x19, 0xb2, 0x47, 0x8, 0xf7, 0x17, 0xc2, 0x24,
+ 0x6, 0x6a, 0xc1, 0x4f, 0xe8, 0x63, 0xbb, 0x8,
+ 0xce, 0x90, 0xe5, 0xab, 0xf7, 0xc, 0x1a, 0xdf,
+ 0x5b, 0xd2, 0xfb, 0xe, 0x1e, 0xfb, 0xc1, 0x54,
+ 0xdc, 0xfc, 0x58, 0x3a, 0x6, 0xf7, 0x1c, 0xf7,
+ 0x8c, 0x15, 0xf7, 0x60, 0xf7, 0x26, 0x7, 0xd2,
+ 0xca, 0x74, 0x3c, 0x20, 0x24, 0x90, 0x41, 0x1f,
+ 0x69, 0x68, 0x8b, 0x69, 0x1b, 0xe, 0x77, 0xbf,
+ 0x76, 0x76, 0xf8, 0xae, 0xbf, 0x7e, 0x77, 0x12,
+ 0xd3, 0xc2, 0x6e, 0xc1, 0xf7, 0xc2, 0xc1, 0x67,
+ 0xc2, 0x13, 0x6a, 0xd3, 0x81, 0x15, 0xc2, 0xb3,
+ 0x6, 0x13, 0xa5, 0x60, 0xc9, 0xd8, 0x84, 0xb9,
+ 0x1b, 0xf7, 0x4, 0xf2, 0xc1, 0xf7, 0x9, 0xf7,
+ 0xd, 0xfb, 0x2, 0x9a, 0x28, 0x9a, 0x1f, 0x42,
+ 0x97, 0x2e, 0xaa, 0xd8, 0x1a, 0xcb, 0xcc, 0xb5,
+ 0xe5, 0x1e, 0x13, 0x9a, 0xbf, 0xc6, 0x75, 0x68,
+ 0xaf, 0x1f, 0x32, 0xc1, 0xf7, 0x4d, 0x55, 0x6d,
+ 0x7, 0x13, 0xa5, 0xa7, 0x64, 0x50, 0x9a, 0x57,
+ 0x1b, 0xfb, 0x23, 0x4c, 0x3a, 0x37, 0xfb, 0xe,
+ 0xf7, 0x14, 0x67, 0xdf, 0x80, 0x1f, 0xdd, 0x80,
+ 0xdb, 0x80, 0x3a, 0x1a, 0x4a, 0x4a, 0x5d, 0x23,
+ 0x1e, 0x13, 0x6a, 0x4c, 0x4b, 0x9f, 0xb3, 0x5a,
+ 0x1f, 0xd9, 0x54, 0x7, 0xe, 0x77, 0xc3, 0x73,
+ 0x76, 0xf8, 0xac, 0xc3, 0x7f, 0x77, 0xab, 0xb7,
+ 0xf7, 0x46, 0x77, 0x12, 0xd2, 0xc3, 0x6d, 0xc2,
+ 0xf7, 0xc1, 0xc2, 0x62, 0xc8, 0x13, 0x6e, 0x80,
+ 0xd2, 0x82, 0x15, 0xc3, 0xbe, 0x6, 0x13, 0xad,
+ 0x40, 0x5f, 0xca, 0xd9, 0x79, 0xba, 0x1b, 0xf7,
+ 0x5, 0xef, 0xc2, 0xf7, 0xa, 0xf7, 0x9, 0xfb,
+ 0xe, 0x9b, 0x2e, 0x95, 0x1f, 0x44, 0x93, 0x31,
+ 0x9e, 0xe4, 0x1a, 0xcc, 0xcd, 0xbd, 0xe7, 0x1e,
+ 0x13, 0x9e, 0x80, 0xbf, 0xc1, 0x6f, 0x67, 0xb0,
+ 0x1f, 0x3b, 0xc2, 0xf7, 0x50, 0x54, 0x62, 0x7,
+ 0x13, 0xad, 0x40, 0xa8, 0x63, 0x55, 0xa3, 0x57,
+ 0x1b, 0xfb, 0x26, 0x4b, 0x28, 0x36, 0xfb, 0x11,
+ 0xf7, 0x1c, 0x73, 0xe2, 0x82, 0x1f, 0xd8, 0x83,
+ 0xd1, 0x7e, 0x3f, 0x1a, 0x49, 0x53, 0x61, 0x22,
+ 0x1e, 0x13, 0x6e, 0x80, 0x4b, 0x4a, 0xa7, 0xb4,
+ 0x59, 0x1f, 0xd0, 0x53, 0x7, 0xf7, 0x5d, 0xf8,
+ 0x59, 0x37, 0xa, 0xfb, 0x16, 0x76, 0xf7, 0x47,
+ 0xca, 0xf7, 0x48, 0xc9, 0xf7, 0x49, 0xcd, 0x12,
+ 0xd2, 0xc6, 0x57, 0xc5, 0xf7, 0x1e, 0xef, 0xd1,
+ 0xc6, 0x63, 0xcc, 0x13, 0xfa, 0x80, 0xd2, 0xa7,
+ 0x15, 0xc6, 0xcd, 0x6, 0xb6, 0x73, 0xb5, 0x6e,
+ 0xc8, 0x81, 0x88, 0x3f, 0x18, 0x8e, 0x92, 0x95,
+ 0x8c, 0x94, 0x1b, 0x99, 0x98, 0x7f, 0x7a, 0x77,
+ 0x7a, 0x80, 0x78, 0x7e, 0x7d, 0x90, 0x95, 0x81,
+ 0x1f, 0x7c, 0x60, 0x5, 0x7c, 0x9c, 0xa2, 0x84,
+ 0x9e, 0x1b, 0xb4, 0xaf, 0xb2, 0xbd, 0xb5, 0x72,
+ 0xa2, 0x77, 0x8d, 0x1f, 0xa2, 0x7, 0xf7, 0x9,
+ 0x8d, 0xdd, 0xce, 0xf2, 0x1a, 0xe5, 0x3f, 0xb1,
+ 0x3f, 0x90, 0x1e, 0x13, 0xf7, 0x0, 0x40, 0x92,
+ 0xfb, 0x39, 0x7a, 0xf2, 0x1a, 0xd6, 0xec, 0x98,
+ 0xba, 0xc7, 0xc5, 0x6b, 0x6a, 0xb9, 0x1e, 0x51,
+ 0xc6, 0xf7, 0x51, 0x50, 0x4f, 0x7, 0xac, 0x5a,
+ 0x52, 0xa6, 0x4d, 0x1b, 0xfb, 0xb, 0x3c, 0x4d,
+ 0x24, 0xfb, 0x22, 0xf7, 0x42, 0x8d, 0xe3, 0x87,
+ 0x1f, 0x13, 0xfa, 0x80, 0xbf, 0x89, 0xd2, 0x86,
+ 0x43, 0x1a, 0x33, 0xfb, 0x5, 0x7e, 0x63, 0x46,
+ 0x50, 0xb1, 0xb7, 0x57, 0x1e, 0xc6, 0x50, 0x7,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xf7, 0x50, 0x54,
+ 0xc2, 0x12, 0xb0, 0xc3, 0xf7, 0x46, 0xc3, 0xf7,
+ 0x47, 0xc3, 0x13, 0xbc, 0xf7, 0x26, 0x16, 0xf7,
+ 0xc6, 0xc2, 0xfb, 0x11, 0xf8, 0x58, 0xf7, 0x47,
+ 0x6, 0x13, 0xdc, 0xfb, 0x19, 0xc3, 0xf7, 0x50,
+ 0xfc, 0xa1, 0xfb, 0x50, 0xc3, 0x7, 0x13, 0xbc,
+ 0xf7, 0x19, 0xf7, 0x46, 0xfc, 0x58, 0xfb, 0x11,
+ 0x7, 0xe, 0x8b, 0xc1, 0xf5, 0xc1, 0xf7, 0x42,
+ 0xc1, 0xf7, 0x12, 0xc1, 0x1, 0xf7, 0x40, 0xbc,
+ 0xf7, 0x95, 0xbe, 0x3, 0xf7, 0xf9, 0x16, 0xc1,
+ 0xfb, 0x1c, 0xf5, 0xf7, 0x1a, 0x7, 0xf7, 0x15,
+ 0xb8, 0xc5, 0xde, 0xe6, 0x5f, 0xbd, 0xfb, 0x18,
+ 0x1f, 0xfb, 0x18, 0xf7, 0x12, 0xee, 0xc1, 0xfb,
+ 0x8e, 0x55, 0xf1, 0xfc, 0x96, 0x25, 0x55, 0x6,
+ 0xf7, 0x2b, 0xf8, 0x18, 0x15, 0xf7, 0x18, 0x6,
+ 0xaf, 0xa9, 0x85, 0x80, 0xa2, 0x1f, 0xa3, 0x80,
+ 0x97, 0x73, 0x66, 0x1a, 0x68, 0x7f, 0x74, 0x73,
+ 0x80, 0x1e, 0x80, 0x74, 0x6e, 0x86, 0x68, 0x1b,
+ 0xfb, 0x1a, 0x6, 0xe, 0x79, 0xbe, 0xf8, 0x6e,
+ 0xc2, 0x1, 0xec, 0xbf, 0xf7, 0xc5, 0xbf, 0x3,
+ 0x9c, 0xf8, 0x8f, 0x15, 0xdb, 0xfb, 0xd1, 0x6,
+ 0xfb, 0x17, 0xc1, 0x3e, 0xf7, 0x2c, 0xf7, 0x12,
+ 0xd8, 0xd4, 0xf7, 0x1b, 0x1e, 0xf7, 0xd1, 0xd8,
+ 0xc2, 0xfb, 0x7c, 0x54, 0xf2, 0xfb, 0xd1, 0x7,
+ 0xfb, 0xf, 0x42, 0x69, 0x3c, 0x21, 0x5c, 0xb8,
+ 0xf7, 0x4, 0x1e, 0xf7, 0xd1, 0xf5, 0xc2, 0xfb,
+ 0x82, 0x7, 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77,
+ 0x55, 0xa, 0xf7, 0x52, 0xf8, 0xfe, 0x15, 0xf7,
+ 0xab, 0xf0, 0x6b, 0xd5, 0xfb, 0x97, 0xfb, 0x25,
+ 0x5, 0xfb, 0x35, 0xfb, 0x20, 0x34, 0xa, 0xe,
+ 0x6b, 0xa, 0x5b, 0xa, 0xfb, 0x14, 0xd5, 0x2a,
+ 0x30, 0xa, 0xf7, 0x21, 0xc9, 0x49, 0xa, 0xe,
+ 0x6b, 0xa, 0xf7, 0x10, 0xf7, 0x9, 0x5b, 0xa,
+ 0xfb, 0x1b, 0xcf, 0x31, 0xf7, 0x1f, 0x31, 0xa,
+ 0xbf, 0xf7, 0xc, 0x4f, 0xa, 0xf7, 0xd0, 0xdc,
+ 0x62, 0xa, 0xfb, 0x22, 0xfb, 0x9, 0x62, 0xa,
+ 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xeb,
+ 0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0x9c, 0xf8, 0x90,
+ 0x34, 0xa, 0xf7, 0x1e, 0xf7, 0x30, 0x79, 0xa,
+ 0xf7, 0x25, 0x5, 0xe, 0x93, 0x76, 0xf8, 0x9c,
+ 0xc2, 0x1, 0x87, 0xf7, 0x77, 0xf7, 0x31, 0xf7,
+ 0x74, 0x3, 0xf7, 0x9b, 0x7e, 0x15, 0xd4, 0x6,
+ 0xf7, 0x5c, 0xf8, 0x9c, 0x5, 0xcf, 0xc2, 0xfb,
+ 0x74, 0x54, 0xeb, 0x6, 0xfb, 0x45, 0xfc, 0x61,
+ 0xfb, 0x43, 0xf8, 0x61, 0x5, 0xee, 0xc2, 0xfb,
+ 0x77, 0x54, 0xcb, 0x6, 0xe, 0x96, 0x76, 0xf8,
+ 0x63, 0x77, 0xd5, 0xc2, 0x1, 0x9f, 0xf7, 0x5a,
+ 0xf7, 0x37, 0xf7, 0x5b, 0x3, 0xf7, 0x10, 0x81,
+ 0x15, 0xca, 0x6, 0xf7, 0x5, 0xf7, 0xfd, 0xf7,
+ 0xa, 0xfb, 0xfd, 0x5, 0xc8, 0x6, 0xc4, 0xf8,
+ 0x99, 0x5, 0xb7, 0xc2, 0xfb, 0x5b, 0x54, 0xee,
+ 0x6, 0x63, 0xfc, 0x36, 0xfb, 0xa, 0xf8, 0x0,
+ 0x5, 0x62, 0x6, 0xfb, 0x8, 0xfc, 0x2, 0x5e,
+ 0xf8, 0x38, 0x5, 0xed, 0xc2, 0xfb, 0x5a, 0x54,
+ 0xb9, 0x6, 0xe, 0x46, 0xa, 0xa2, 0x16, 0xf7,
+ 0x7e, 0xc2, 0x22, 0x6, 0xf7, 0x2a, 0xf7, 0x58,
+ 0xf7, 0x26, 0xfb, 0x58, 0x5, 0x2d, 0x54, 0xf7,
+ 0x73, 0xc2, 0x4a, 0x6, 0xfb, 0x46, 0xf7, 0x84,
+ 0xf7, 0x32, 0xf7, 0x68, 0x5, 0xcd, 0xc2, 0xfb,
+ 0x53, 0x54, 0xc8, 0x6, 0xfb, 0x13, 0xfb, 0x3f,
+ 0xfb, 0x14, 0xf7, 0x3f, 0x5, 0xcf, 0xc2, 0xfb,
+ 0x5a, 0x54, 0xce, 0x6, 0xf7, 0x32, 0xfb, 0x68,
+ 0xfb, 0x48, 0xfb, 0x84, 0x5, 0x4a, 0x6, 0xe,
+ 0x75, 0xa, 0xa3, 0xf7, 0x5f, 0xbb, 0xc3, 0xb9,
+ 0xf7, 0x5b, 0x3, 0xf7, 0x27, 0x16, 0xf7, 0xcb,
+ 0xc1, 0xfb, 0x13, 0xf7, 0x43, 0x6, 0xf7, 0x46,
+ 0xf7, 0xab, 0x5, 0xce, 0xc1, 0xfb, 0x5b, 0x55,
+ 0xd2, 0x6, 0xfb, 0x25, 0xfb, 0x76, 0xfb, 0x28,
+ 0xf7, 0x76, 0x5, 0xd3, 0xc1, 0xfb, 0x5f, 0x55,
+ 0xd0, 0x6, 0xf7, 0x4a, 0xfb, 0xab, 0x5, 0xfb,
+ 0x43, 0xfb, 0x14, 0x7, 0xe, 0x8b, 0xc1, 0xf8,
+ 0x5d, 0xc1, 0xf7, 0x78, 0x77, 0x81, 0xa, 0xf7,
+ 0x27, 0x16, 0x36, 0xa, 0xb0, 0xf8, 0xc9, 0x15,
+ 0xf7, 0xba, 0xf0, 0x69, 0xd4, 0xfb, 0xa4, 0xfb,
+ 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1,
+ 0xf7, 0xe, 0xf7, 0x15, 0x81, 0xa, 0xf7, 0xe5,
+ 0xf9, 0x43, 0x15, 0xe1, 0xf7, 0x15, 0x35, 0x6,
+ 0xfb, 0x2b, 0xfb, 0x15, 0x15, 0xe0, 0xf7, 0x15,
+ 0x36, 0x6, 0x64, 0xfd, 0xc4, 0x15, 0x36, 0xa,
+ 0xe, 0x75, 0xa, 0xf7, 0xa, 0xbf, 0xf7, 0xb5,
+ 0xc2, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x5f,
+ 0x54, 0xfb, 0x29, 0xfb, 0xc1, 0x6, 0xf7, 0xf8,
+ 0xf8, 0x5d, 0x5, 0xbe, 0xfc, 0x20, 0xfb, 0x51,
+ 0xbf, 0xf7, 0x1b, 0xf7, 0xa3, 0x7, 0xfb, 0xf7,
+ 0xfc, 0x5b, 0x5, 0xe, 0x8b, 0xc2, 0xf8, 0x63,
+ 0xc2, 0x1, 0xf7, 0xa, 0xbf, 0xf7, 0xb7, 0xc0,
+ 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x78, 0x56,
+ 0xfb, 0x41, 0xfb, 0xc2, 0x6, 0xf7, 0xf7, 0xf8,
+ 0x66, 0x5, 0xbf, 0xfc, 0x20, 0xfb, 0x68, 0xbf,
+ 0xf7, 0x31, 0xf7, 0xa4, 0x7, 0xfb, 0xf8, 0xfc,
+ 0x64, 0x5, 0xf7, 0x52, 0xf8, 0xd2, 0x15, 0xd9,
+ 0x6, 0xf7, 0x21, 0xf7, 0x33, 0x63, 0x9d, 0xfb,
+ 0x20, 0xfb, 0xb, 0xfb, 0x23, 0xf7, 0xb, 0x64,
+ 0x78, 0x5, 0xe, 0x88, 0xc2, 0xf7, 0x33, 0xc1,
+ 0xf7, 0xb, 0xc4, 0x1, 0xba, 0xc4, 0xf7, 0xca,
+ 0xc2, 0x3, 0xf1, 0xf7, 0xe1, 0x15, 0xd2, 0xa9,
+ 0xcf, 0xa1, 0xbc, 0x8a, 0xdf, 0x8a, 0xbb, 0x6b,
+ 0x83, 0x28, 0x8, 0x95, 0x5e, 0x5b, 0x8e, 0x5d,
+ 0x1b, 0xfb, 0xd, 0x20, 0x5c, 0x29, 0x4a, 0xc0,
+ 0x45, 0xf7, 0x8, 0xea, 0xd7, 0xc2, 0xb4, 0xa7,
+ 0x1f, 0x37, 0xf7, 0x1e, 0xc2, 0x37, 0xf7, 0x85,
+ 0x7, 0xf4, 0x49, 0xb6, 0xfb, 0x7, 0x40, 0x3b,
+ 0x6e, 0x71, 0x5c, 0x1e, 0xf7, 0xdc, 0xfb, 0x83,
+ 0x15, 0x4f, 0x58, 0x46, 0x55, 0x39, 0x1b, 0x4c,
+ 0x5e, 0xbb, 0xb1, 0xd2, 0xdd, 0xa0, 0xe3, 0xbc,
+ 0xc0, 0x88, 0x80, 0xb1, 0x1f, 0xe, 0x3e, 0xa,
+ 0xf7, 0x30, 0xf8, 0x83, 0x15, 0xf7, 0xbb, 0xf2,
+ 0x69, 0xd5, 0xfb, 0xa5, 0xfb, 0x26, 0x5, 0x5a,
+ 0xfb, 0x44, 0x23, 0xa, 0x3e, 0xa, 0xf7, 0x16,
+ 0xf8, 0x74, 0x15, 0xf7, 0x2d, 0xf7, 0xa, 0xf7,
+ 0x2a, 0xfb, 0xa, 0xb6, 0x9c, 0xfb, 0x2c, 0xf7,
+ 0x31, 0x5, 0x38, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+ 0x5, 0x92, 0xfb, 0x27, 0x23, 0xa, 0x6e, 0xa,
+ 0xf7, 0x61, 0xf8, 0x85, 0x15, 0xf7, 0x64, 0xf1,
+ 0x5e, 0xd4, 0xfb, 0x4a, 0xfb, 0x24, 0x5, 0xe,
+ 0x7c, 0xc3, 0x6a, 0xc3, 0xf7, 0x2b, 0xc3, 0xf7,
+ 0x7, 0xc3, 0xe3, 0xf7, 0x7, 0x12, 0xba, 0xc5,
+ 0xbf, 0xe2, 0xcc, 0xe1, 0x9e, 0xc3, 0x13, 0x7f,
+ 0x80, 0xf7, 0xc9, 0xf8, 0xa6, 0x15, 0xe1, 0xf7,
+ 0x7, 0x35, 0x6, 0xfb, 0x2c, 0x60, 0xa, 0x4d,
+ 0xfb, 0xbb, 0x28, 0xa, 0x1f, 0x13, 0xbf, 0x80,
+ 0x3d, 0xa, 0x1e, 0x29, 0xa, 0x2a, 0xa, 0x7c,
+ 0xc1, 0xf7, 0x42, 0xc2, 0xf7, 0xa, 0xc2, 0x1,
+ 0xa3, 0xc4, 0xf7, 0x4e, 0xc3, 0x3, 0xf7, 0xba,
+ 0xd7, 0x15, 0x58, 0x9f, 0xbf, 0x63, 0xda, 0x1b,
+ 0xb8, 0xb9, 0x96, 0x96, 0xb2, 0x1f, 0x7f, 0xc1,
+ 0x5, 0x82, 0x6b, 0x65, 0x7e, 0x67, 0x1b, 0x2e,
+ 0x62, 0xda, 0xde, 0x1f, 0x97, 0xf7, 0x8f, 0x7,
+ 0xf4, 0x8c, 0x76, 0xf7, 0xf, 0xfb, 0x13, 0x1b,
+ 0x53, 0x6a, 0x71, 0x62, 0x70, 0x1f, 0x99, 0x85,
+ 0x7d, 0xc0, 0x2b, 0x1b, 0x54, 0x58, 0x7e, 0x7b,
+ 0x5f, 0x1f, 0x96, 0x56, 0x5, 0x98, 0xad, 0xbe,
+ 0x99, 0xb4, 0x1b, 0xd2, 0x99, 0x68, 0x53, 0x1f,
+ 0x70, 0x7, 0xfb, 0x7, 0x8c, 0xfb, 0x14, 0x75,
+ 0xfb, 0x1e, 0x1a, 0x34, 0xcd, 0x66, 0xc9, 0xa5,
+ 0xc4, 0x90, 0xe1, 0xc6, 0x1e, 0xaa, 0xf7, 0x54,
+ 0x15, 0xcb, 0x8f, 0xb3, 0xc1, 0xc9, 0x1b, 0xd6,
+ 0x91, 0x49, 0x57, 0x92, 0x1f, 0xfb, 0x90, 0xfb,
+ 0x21, 0x15, 0x75, 0x7f, 0x64, 0x49, 0x4b, 0x1b,
+ 0x63, 0x6c, 0xa6, 0xb9, 0xf0, 0xf7, 0x0, 0x8b,
+ 0xd9, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x1a, 0xf8,
+ 0xe8, 0x15, 0xf7, 0xbd, 0x24, 0x96, 0xaa, 0xfb,
+ 0xa5, 0xf7, 0x28, 0x5, 0x41, 0xfb, 0xd6, 0x23,
+ 0xa, 0x86, 0xc0, 0x64, 0xc2, 0xf7, 0x3e, 0xc1,
+ 0xf7, 0x5f, 0xbf, 0x1, 0xc9, 0xc2, 0x91, 0xbf,
+ 0x3, 0xf7, 0xf4, 0xbb, 0x15, 0xae, 0x59, 0x5,
+ 0xf7, 0x2a, 0xc2, 0xfb, 0x11, 0x6, 0x72, 0xb0,
+ 0xa6, 0xb0, 0xa1, 0xc0, 0x91, 0xc2, 0x19, 0xd8,
+ 0xc1, 0xfb, 0xd, 0x6, 0x60, 0x7b, 0x43, 0x71,
+ 0x63, 0x1e, 0xfb, 0x22, 0xf7, 0x5e, 0x87, 0x8f,
+ 0x69, 0xb8, 0x8a, 0xb2, 0x19, 0xc0, 0x89, 0xc2,
+ 0x99, 0xb5, 0x1b, 0xb9, 0xa9, 0x74, 0x7a, 0x9a,
+ 0x1f, 0xa9, 0xb7, 0x5, 0xa7, 0x6e, 0x5d, 0x9f,
+ 0x5e, 0x1b, 0x40, 0x42, 0x68, 0x42, 0x5f, 0xa4,
+ 0x5c, 0xa6, 0x64, 0x1f, 0x20, 0x50, 0x85, 0x38,
+ 0x6b, 0x1a, 0x50, 0xb0, 0x34, 0xf6, 0xc3, 0xc0,
+ 0xa2, 0xb3, 0xb0, 0x1e, 0x6e, 0xb7, 0x15, 0x75,
+ 0x73, 0x6e, 0x6b, 0x54, 0x1b, 0x59, 0x5b, 0xa7,
+ 0xd8, 0xc3, 0xbb, 0xbd, 0xb0, 0x9b, 0x1f, 0xe,
+ 0x41, 0xa, 0xc8, 0xf7, 0x38, 0x12, 0xba, 0xc5,
+ 0xe6, 0xf7, 0x46, 0xb3, 0xc3, 0x13, 0xbf, 0xf7,
+ 0x58, 0xf8, 0xe4, 0x15, 0x5d, 0xb2, 0x67, 0xbd,
+ 0xbd, 0xb2, 0xaf, 0xb9, 0xb9, 0x64, 0xaf, 0x59,
+ 0x59, 0x64, 0x67, 0x5d, 0x1e, 0xc1, 0x16, 0x9d,
+ 0x9b, 0x99, 0x9e, 0x9e, 0x9b, 0x7d, 0x79, 0x7a,
+ 0x7b, 0x7c, 0x78, 0x78, 0x7b, 0x9a, 0x9c, 0x1e,
+ 0xfb, 0x2f, 0xfb, 0x86, 0x2c, 0xa, 0xf7, 0xa4,
+ 0xbe, 0x1, 0x6f, 0xf9, 0x24, 0x3, 0xf7, 0x5d,
+ 0x70, 0xa, 0xf8, 0x55, 0x80, 0xa, 0xa7, 0x5e,
+ 0xf7, 0x7a, 0xf7, 0x4b, 0xfb, 0x7a, 0x78, 0xa,
+ 0xfc, 0x59, 0x5d, 0xa, 0x7c, 0xf9, 0x3, 0x1,
+ 0xf7, 0xa8, 0xbe, 0x3, 0xf7, 0x8, 0xf7, 0x66,
+ 0x15, 0xf7, 0x4d, 0xfb, 0x75, 0xf7, 0x4b, 0xf7,
+ 0x7b, 0x5e, 0xa7, 0xfb, 0x4, 0xfb, 0x2e, 0x5,
+ 0xf8, 0x9a, 0x58, 0xfc, 0x9c, 0x7, 0xfb, 0xf,
+ 0xf7, 0x2f, 0x5, 0xe, 0x7d, 0xa, 0xf7, 0x61,
+ 0x70, 0xa, 0xf8, 0xb5, 0xbe, 0xfc, 0xb7, 0x5d,
+ 0xa, 0x7d, 0xa, 0x73, 0xf7, 0xa4, 0x15, 0xf8,
+ 0xb5, 0x80, 0xa, 0xa7, 0x5e, 0xf7, 0x79, 0xf7,
+ 0x4b, 0xfb, 0x79, 0x78, 0xa, 0xfc, 0xb7, 0x6,
+ 0xe, 0xf8, 0x1c, 0xf7, 0x14, 0x1, 0xf7, 0xa8,
+ 0xbe, 0x3, 0xf7, 0xa8, 0x16, 0xbe, 0xf8, 0x9a,
+ 0x6, 0xf7, 0x4, 0xfb, 0x2e, 0xb8, 0xa7, 0xfb,
+ 0x4b, 0xf7, 0x75, 0xfb, 0x4d, 0xfb, 0x75, 0xb0,
+ 0x6f, 0xf7, 0xf, 0xf7, 0x30, 0x5, 0xe, 0xf8,
+ 0xb, 0x76, 0xf7, 0xa0, 0x77, 0x1, 0xe9, 0xf8,
+ 0x30, 0x3, 0xe9, 0xf7, 0xf6, 0x15, 0xd8, 0xa6,
+ 0xd2, 0xc6, 0xc5, 0xc5, 0xc7, 0x4e, 0xd0, 0x53,
+ 0xd8, 0x71, 0x8, 0xba, 0x7, 0x2a, 0xd6, 0x5e,
+ 0xb9, 0x63, 0xee, 0x8, 0x58, 0x6, 0x68, 0x2d,
+ 0x5a, 0x53, 0x2c, 0x44, 0x8, 0xe, 0xf7, 0x5b,
+ 0xbe, 0x9e, 0xbe, 0x12, 0xc8, 0xf8, 0x71, 0x17,
+ 0xf6, 0xf7, 0x59, 0x15, 0xaa, 0xa1, 0xa6, 0xb4,
+ 0xb2, 0x1b, 0xb1, 0xaa, 0x77, 0x78, 0xac, 0x1f,
+ 0x7a, 0xa9, 0xaa, 0x7b, 0xb1, 0x1b, 0xcd, 0xb6,
+ 0xba, 0xb8, 0xac, 0x1f, 0x5f, 0xaa, 0x5, 0x77,
+ 0x7d, 0x5e, 0x57, 0x65, 0x1b, 0x71, 0x73, 0x9b,
+ 0x9b, 0x6f, 0x1f, 0x13, 0xe0, 0x9e, 0x6a, 0x64,
+ 0xa0, 0x53, 0x1b, 0x4c, 0x6b, 0x5e, 0x62, 0x68,
+ 0x1f, 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7,
+ 0xa0, 0xcb, 0x3, 0xf7, 0x37, 0xf7, 0xc0, 0x15,
+ 0xcc, 0x60, 0xd5, 0xf7, 0x16, 0xd5, 0xfb, 0x16,
+ 0xc8, 0xb5, 0x2a, 0xf7, 0x9, 0xf7, 0x24, 0xa6,
+ 0x79, 0xcf, 0xfb, 0x20, 0x57, 0x98, 0xf7, 0x28,
+ 0x5, 0x40, 0x6, 0x94, 0xfb, 0x29, 0xfb, 0x1d,
+ 0xc0, 0x77, 0x47, 0xf7, 0x26, 0x6f, 0x5, 0xe,
+ 0x7c, 0xb1, 0xde, 0xb1, 0xf7, 0x68, 0xb5, 0xf7,
+ 0x1, 0xb2, 0x1, 0xb0, 0xb6, 0xe5, 0xb3, 0xf7,
+ 0x24, 0xb7, 0xf7, 0xd, 0xb7, 0x3, 0xf7, 0xf6,
+ 0xf7, 0x40, 0x15, 0x6e, 0x93, 0xa0, 0x66, 0xb9,
+ 0x1b, 0xdc, 0xc0, 0xe9, 0xf7, 0x0, 0xf7, 0x23,
+ 0xfb, 0x1, 0xea, 0xfb, 0x24, 0xfb, 0x47, 0x2d,
+ 0xfb, 0x15, 0xfb, 0x31, 0xfb, 0x3a, 0xf7, 0x0,
+ 0xfb, 0x1, 0xf7, 0x44, 0xdf, 0xd0, 0xa7, 0xb3,
+ 0xcc, 0x1f, 0x77, 0xb3, 0x5, 0x76, 0x6e, 0x2c,
+ 0x5a, 0x41, 0x1b, 0xfb, 0x11, 0xfb, 0x8, 0xdd,
+ 0xf7, 0x2f, 0xf7, 0xe, 0xd2, 0xf7, 0x11, 0xf7,
+ 0x33, 0xf7, 0xb, 0xe5, 0x36, 0xfb, 0x5, 0x3e,
+ 0x67, 0x33, 0x58, 0x59, 0x91, 0xd9, 0xb6, 0x95,
+ 0x1f, 0xac, 0xf7, 0x1c, 0x5, 0x5f, 0x6, 0x7f,
+ 0x5a, 0x5, 0xb6, 0x76, 0x72, 0x8e, 0x6c, 0x1b,
+ 0x3d, 0x59, 0x2a, 0x2a, 0x5e, 0x99, 0x56, 0xce,
+ 0xb4, 0xb6, 0xac, 0xac, 0x9e, 0x1f, 0xfb, 0x24,
+ 0xa9, 0x15, 0xc1, 0xa6, 0xef, 0xc8, 0xbd, 0x91,
+ 0x67, 0x79, 0x4a, 0x64, 0x30, 0x51, 0x69, 0x7e,
+ 0xad, 0xa1, 0x1e, 0xe, 0x7c, 0xc3, 0x5f, 0xc3,
+ 0xf7, 0x34, 0xc3, 0xf7, 0x1c, 0xc3, 0xc7, 0xbd,
+ 0x9b, 0xbc, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+ 0x13, 0xbf, 0xf7, 0x15, 0xf8, 0xa1, 0x15, 0x99,
+ 0x8f, 0x9f, 0xbb, 0xaf, 0x1b, 0xa7, 0x9d, 0x7d,
+ 0x7c, 0x9f, 0x1f, 0x79, 0xa2, 0xa6, 0x78, 0xb9,
+ 0x1b, 0xcb, 0xbc, 0xb9, 0xc3, 0x9e, 0x1f, 0x58,
+ 0x94, 0x5, 0x72, 0x82, 0x6e, 0x67, 0x66, 0x1b,
+ 0x70, 0x78, 0x9b, 0x9d, 0x74, 0x1f, 0x9b, 0x76,
+ 0x73, 0x9a, 0x65, 0x1b, 0x57, 0x55, 0x67, 0x4a,
+ 0x75, 0x1f, 0x9d, 0xfb, 0x4d, 0x2c, 0xa, 0x7c,
+ 0xc2, 0x60, 0xc3, 0xf7, 0xea, 0xc3, 0x12, 0xf5,
+ 0xc4, 0xf7, 0xf9, 0xc7, 0x13, 0x78, 0x9e, 0x88,
+ 0x15, 0xf7, 0x24, 0xd1, 0x6, 0x13, 0xb8, 0x7b,
+ 0x99, 0xb5, 0x49, 0xf7, 0x18, 0x1b, 0xf7, 0x1e,
+ 0xe6, 0xf7, 0xa, 0xf7, 0x2, 0xf7, 0x2b, 0x27,
+ 0xe2, 0xfb, 0x13, 0xfb, 0x4, 0x4f, 0x4c, 0x72,
+ 0x79, 0x1f, 0xf7, 0x9e, 0xfb, 0x24, 0x54, 0xe2,
+ 0x7, 0x13, 0x78, 0xfc, 0x9d, 0x34, 0x7, 0xf7,
+ 0x25, 0xf7, 0x3d, 0x15, 0xf5, 0xe4, 0xce, 0xe4,
+ 0xf7, 0xc, 0xc6, 0x36, 0x2a, 0x8a, 0x1e, 0x13,
+ 0xb8, 0x24, 0x8a, 0x34, 0x45, 0x31, 0x1b, 0x38,
+ 0x2c, 0xc5, 0xf7, 0x10, 0x1f, 0xe, 0xfb, 0x1d,
+ 0xf9, 0xce, 0x1, 0xcf, 0xf8, 0x64, 0x3, 0xf8,
+ 0x7b, 0xfb, 0x1d, 0x15, 0xb8, 0xa3, 0xfc, 0x37,
+ 0xf9, 0xb6, 0x5e, 0x70, 0x5, 0xe, 0xfb, 0x79,
+ 0x76, 0xfa, 0x7c, 0x77, 0x68, 0xa, 0xbe, 0x3,
+ 0xf7, 0xa6, 0xfb, 0x8e, 0x15, 0xbe, 0xfa, 0x7c,
+ 0x58, 0x6, 0xe, 0xfb, 0x78, 0xbf, 0xf9, 0xf1,
+ 0xc4, 0x1, 0xf7, 0x9f, 0xc5, 0x3, 0xf7, 0x40,
+ 0xf7, 0x82, 0x15, 0xd9, 0x72, 0x9c, 0x75, 0x2b,
+ 0x1a, 0xfb, 0x50, 0x7, 0x49, 0xae, 0x46, 0xf7,
+ 0x11, 0x1e, 0xbf, 0x7, 0x4e, 0x8e, 0x62, 0xae,
+ 0xbb, 0x1a, 0xf7, 0x4d, 0x7, 0xcc, 0x8a, 0xc7,
+ 0x3a, 0xb0, 0x1e, 0xdc, 0xb4, 0x8c, 0xbe, 0xd1,
+ 0x1a, 0xf7, 0x5c, 0x7, 0xbb, 0xb4, 0x9a, 0xc8,
+ 0x8e, 0x1e, 0xc4, 0x7, 0xfb, 0x17, 0x6e, 0x4e,
+ 0x41, 0x1f, 0xfb, 0x50, 0x7, 0x2b, 0x77, 0x75,
+ 0x40, 0x72, 0x1e, 0xe, 0xfb, 0x78, 0xbf, 0xf9,
+ 0xf5, 0xc0, 0x68, 0xa, 0xc5, 0x3, 0xf7, 0x40,
+ 0xfb, 0x44, 0x15, 0x57, 0x7, 0xf7, 0x11, 0xae,
+ 0xd0, 0xcd, 0x1f, 0xf7, 0x50, 0x7, 0xeb, 0x9c,
+ 0xa1, 0xd9, 0xa4, 0x1e, 0xb1, 0x7, 0x40, 0xa4,
+ 0x77, 0xa1, 0xeb, 0x1a, 0xf7, 0x50, 0x7, 0xd5,
+ 0x6e, 0xc8, 0xfb, 0x17, 0x1e, 0x56, 0x7, 0xc8,
+ 0x88, 0xb4, 0x78, 0x5b, 0x1a, 0xfb, 0x5c, 0x7,
+ 0x45, 0x8c, 0x58, 0xdc, 0x62, 0x1e, 0x3a, 0x66,
+ 0x8a, 0x4f, 0x4a, 0x1a, 0xfb, 0x4d, 0x7, 0x5b,
+ 0x62, 0x68, 0x4e, 0x88, 0x1e, 0xe, 0x3d, 0x77,
+ 0x9f, 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0x69,
+ 0xc2, 0x3, 0xf7, 0x69, 0x3d, 0x15, 0xf7, 0x41,
+ 0xc1, 0xfb, 0xa, 0xf9, 0x2, 0xf7, 0xa, 0xc1,
+ 0xfb, 0x41, 0x6, 0xe, 0x3d, 0xc1, 0xf9, 0x2,
+ 0xc1, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, 0x69,
+ 0x73, 0x15, 0x55, 0xf7, 0x41, 0xf9, 0x6e, 0xfb,
+ 0x41, 0x55, 0xf7, 0xa, 0xfd, 0x2, 0x7, 0xe,
+ 0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2d, 0xf8, 0xf5,
+ 0x15, 0x3b, 0xaf, 0xc3, 0x6f, 0xc4, 0x1b, 0xd5,
+ 0xc0, 0xbc, 0xc6, 0x9d, 0x1f, 0x61, 0x6, 0x6d,
+ 0x80, 0x64, 0x64, 0x55, 0x1b, 0x60, 0x63, 0xa5,
+ 0xb6, 0x78, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9,
+ 0xe6, 0x77, 0x68, 0xa, 0xbe, 0x3, 0xf7, 0xa6,
+ 0xf7, 0xaf, 0x15, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+ 0xfd, 0xe6, 0x4, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+ 0xe, 0xf7, 0x16, 0xf7, 0x91, 0x1, 0xf7, 0x40,
+ 0xf7, 0x94, 0x3, 0xf7, 0x40, 0xf7, 0x95, 0x15,
+ 0x45, 0xc4, 0x52, 0xd2, 0xd3, 0xc3, 0xc4, 0xd1,
+ 0xd1, 0x53, 0xc3, 0x43, 0x44, 0x52, 0x53, 0x45,
+ 0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xef, 0xc3, 0x1,
+ 0xcf, 0xc1, 0xf7, 0xe4, 0xc1, 0x3, 0xf8, 0x89,
+ 0xf7, 0x8, 0x15, 0x76, 0x74, 0x34, 0x52, 0x3b,
+ 0x1b, 0xfb, 0x19, 0x53, 0xe7, 0xdf, 0xe4, 0xd4,
+ 0xdd, 0xf7, 0x4, 0xc4, 0xbf, 0x73, 0x67, 0xb5,
+ 0x1f, 0x46, 0xc1, 0xf7, 0x4d, 0x55, 0x5b, 0x7,
+ 0xaa, 0x5e, 0x5c, 0x9c, 0x51, 0x1b, 0xfb, 0x3e,
+ 0x45, 0xfb, 0x19, 0x30, 0xfb, 0x28, 0xec, 0x37,
+ 0xf7, 0x24, 0xeb, 0xcb, 0xab, 0xbb, 0xc9, 0x1f,
+ 0xe, 0xf8, 0x80, 0xc3, 0x1, 0xf7, 0x10, 0xf7,
+ 0xf4, 0x3, 0xf7, 0x9c, 0xf8, 0x80, 0x15, 0xd6,
+ 0x6, 0xf7, 0x1d, 0xf7, 0x31, 0x64, 0x9f, 0xfb,
+ 0x1c, 0xfb, 0xd, 0xfb, 0x1f, 0xf7, 0xc, 0x65,
+ 0x77, 0x5, 0xe, 0xfb, 0x21, 0x76, 0xf7, 0x40,
+ 0xbd, 0xf7, 0xdc, 0xc0, 0x12, 0xcf, 0xc2, 0xf7,
+ 0x2d, 0xe9, 0x5d, 0xb9, 0xea, 0xc2, 0x13, 0xfa,
+ 0xf7, 0xab, 0x95, 0x15, 0x86, 0x44, 0x5, 0x9c,
+ 0x92, 0xac, 0x8b, 0x71, 0x1a, 0x13, 0x72, 0x6d,
+ 0x5d, 0x85, 0x74, 0xa1, 0x1e, 0x7d, 0x65, 0x5,
+ 0x13, 0x76, 0x79, 0xa9, 0x9d, 0x8a, 0x93, 0x1b,
+ 0xb2, 0xad, 0xad, 0xb7, 0xb0, 0x73, 0x9f, 0x78,
+ 0x8d, 0x1f, 0xa3, 0x7, 0xde, 0x8f, 0xcd, 0xa8,
+ 0xc2, 0xb4, 0x75, 0xbf, 0x18, 0x76, 0x72, 0x3c,
+ 0x54, 0x3a, 0x1b, 0xfb, 0x31, 0x56, 0xf5, 0xc8,
+ 0xdf, 0xdd, 0xd8, 0xf7, 0x7, 0xc4, 0xc0, 0x7e,
+ 0x69, 0xb7, 0x1f, 0x41, 0xc2, 0xf7, 0x42, 0x54,
+ 0x7, 0x13, 0x4, 0x5e, 0x7, 0xa8, 0x5c, 0x5b,
+ 0x9b, 0x51, 0x1b, 0xfb, 0x43, 0x46, 0xfb, 0x11,
+ 0x35, 0xfb, 0x14, 0xec, 0x3a, 0xf7, 0x6, 0x80,
+ 0x1f, 0xe, 0xfb, 0x2b, 0xb3, 0xbb, 0xb3, 0x12,
+ 0xf7, 0xa5, 0xbd, 0x87, 0xbd, 0x13, 0xd0, 0xf7,
+ 0x7b, 0xfb, 0x1b, 0x15, 0x80, 0x9c, 0x9d, 0x86,
+ 0x9e, 0x1b, 0xb6, 0xb4, 0xa7, 0xb8, 0x1f, 0x13,
+ 0xe0, 0xae, 0x71, 0x9d, 0x77, 0x8d, 0x1e, 0xac,
+ 0x59, 0x7, 0x83, 0x3d, 0x5, 0x8f, 0x98, 0x94,
+ 0x8c, 0x93, 0x1b, 0x9e, 0x90, 0x7e, 0x80, 0x7a,
+ 0x7c, 0x84, 0x7a, 0x7c, 0x7b, 0x90, 0x93, 0x81,
+ 0x1f, 0xe, 0x6f, 0x76, 0xf7, 0x22, 0xc2, 0xf7,
+ 0x94, 0xc2, 0x1, 0xed, 0xc1, 0xf7, 0x8, 0xc3,
+ 0xf7, 0x1, 0xc1, 0x3, 0xf7, 0xa0, 0x5a, 0x15,
+ 0xc3, 0xf7, 0x22, 0x6, 0xd0, 0x8d, 0xd3, 0xa7,
+ 0xaf, 0xaa, 0x75, 0xbd, 0x18, 0x6b, 0x57, 0x56,
+ 0x73, 0x4b, 0x1b, 0xfb, 0xb, 0x64, 0xd2, 0xbe,
+ 0xd3, 0xc3, 0xc9, 0xed, 0xb8, 0xb3, 0x82, 0x71,
+ 0xb5, 0x1f, 0x55, 0xc1, 0xf7, 0x3c, 0x55, 0x56,
+ 0x7, 0x61, 0xa1, 0x6e, 0x8e, 0x65, 0x8f, 0x8,
+ 0xf7, 0x32, 0x53, 0xfb, 0x32, 0x7, 0x42, 0x84,
+ 0x2a, 0x52, 0xfb, 0xf, 0x1a, 0xfb, 0x8, 0xe1,
+ 0x51, 0xdf, 0x86, 0x1e, 0xe, 0xf8, 0xe9, 0xc4,
+ 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x36,
+ 0xf8, 0x71, 0x15, 0xf7, 0x1e, 0xf7, 0xc, 0xf7,
+ 0x1d, 0xfb, 0xc, 0xb2, 0x9d, 0xfb, 0x1e, 0xf7,
+ 0x33, 0x5, 0x40, 0x6, 0xfb, 0x1f, 0xfb, 0x33,
+ 0x5, 0xe, 0xf4, 0xf7, 0xe, 0xf7, 0x30, 0xf7,
+ 0xe, 0x7a, 0xa, 0xf8, 0x50, 0x15, 0x52, 0xa,
+ 0xfb, 0xaa, 0x4, 0x52, 0xa, 0xe, 0xf7, 0x6e,
+ 0xf7, 0x37, 0x3, 0xf7, 0x6e, 0xfb, 0x4, 0x15,
+ 0xca, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x2e, 0x6,
+ 0xe, 0x79, 0xb9, 0xe2, 0xc0, 0xf7, 0x84, 0xbb,
+ 0xdb, 0xb7, 0x1, 0x8b, 0xb9, 0xf2, 0xba, 0xf7,
+ 0xfb, 0xb8, 0x3, 0xf7, 0xab, 0x4, 0xfb, 0x38,
+ 0xf7, 0x1a, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x35,
+ 0xf7, 0x1e, 0xf7, 0xe, 0xf7, 0x43, 0xf7, 0x4b,
+ 0xfb, 0x21, 0xf7, 0xa, 0xfb, 0x32, 0xfb, 0x2f,
+ 0xfb, 0x26, 0xfb, 0xb, 0xfb, 0x4a, 0x1e, 0xb9,
+ 0x16, 0xf7, 0x18, 0xee, 0xf7, 0x11, 0xf7, 0x30,
+ 0xf7, 0x21, 0xf7, 0x5, 0xfb, 0xc, 0xfb, 0x1d,
+ 0xfb, 0x22, 0xfb, 0x4, 0xfb, 0x1, 0xfb, 0x22,
+ 0xfb, 0x1b, 0xfb, 0xc, 0xf7, 0x1, 0xf7, 0x22,
+ 0x1e, 0xf8, 0x7, 0x43, 0x15, 0x6f, 0x71, 0x64,
+ 0x80, 0x65, 0x1b, 0x4f, 0x51, 0xb6, 0xd2, 0xda,
+ 0xc3, 0xba, 0xc9, 0xa6, 0xb2, 0x81, 0x75, 0x9e,
+ 0x1f, 0xac, 0xac, 0x5, 0xad, 0x6a, 0x5d, 0x98,
+ 0x64, 0x1b, 0x33, 0x3e, 0x3f, 0x29, 0x20, 0xdc,
+ 0x4f, 0xdf, 0xbc, 0xbe, 0x9e, 0xb2, 0xae, 0x1f,
+ 0xe, 0xd7, 0xba, 0xf7, 0xd2, 0xba, 0x1, 0xe9,
+ 0xba, 0xf7, 0xd2, 0xbb, 0x3, 0xd4, 0xe1, 0x15,
+ 0xab, 0x6f, 0xcc, 0xca, 0x5, 0x63, 0xc0, 0xb9,
+ 0x86, 0xaa, 0x1b, 0xbd, 0xba, 0x9b, 0xa8, 0xb1,
+ 0x1f, 0xc9, 0x4c, 0xa9, 0xa8, 0x4b, 0xcb, 0x5,
+ 0xa8, 0xb1, 0x9a, 0xba, 0xbb, 0x1a, 0xba, 0x7d,
+ 0xba, 0x6d, 0xae, 0x1e, 0xcb, 0xcb, 0x6c, 0xa8,
+ 0x4d, 0x4c, 0x5, 0xaa, 0x66, 0x5d, 0x99, 0x5b,
+ 0x1b, 0x59, 0x59, 0x7b, 0x6d, 0x67, 0x1f, 0x4c,
+ 0xcb, 0x6c, 0x6c, 0xcd, 0x4c, 0x5, 0x68, 0x5f,
+ 0x81, 0x5f, 0x63, 0x1a, 0x5b, 0x9a, 0x5b, 0xaa,
+ 0x67, 0x1e, 0x8c, 0xf7, 0x16, 0x15, 0xda, 0xc9,
+ 0xdb, 0xee, 0xe9, 0xca, 0x3e, 0x39, 0x2a, 0x40,
+ 0x4d, 0x38, 0x33, 0x43, 0xd1, 0xe4, 0x1e, 0xe,
+ 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe1, 0xc7, 0xf7,
+ 0x14, 0xc2, 0x12, 0xa6, 0xc4, 0xf7, 0xf3, 0xc3,
+ 0x13, 0x7c, 0xf8, 0x47, 0x89, 0x15, 0xf7, 0x1e,
+ 0xc2, 0x39, 0xf8, 0xd4, 0xfb, 0x4d, 0x54, 0xf7,
+ 0x15, 0xfb, 0x70, 0x6, 0xd7, 0x5e, 0x40, 0x9b,
+ 0x54, 0x1b, 0xfb, 0x1f, 0x2d, 0x27, 0xfb, 0x15,
+ 0x1f, 0x13, 0xbc, 0xfb, 0x8, 0xda, 0xfb, 0x8,
+ 0xf7, 0x2a, 0xd3, 0xce, 0xa8, 0xc5, 0xb3, 0x1e,
+ 0x13, 0x7c, 0xfb, 0xf3, 0xf7, 0x25, 0x15, 0xe7,
+ 0xd1, 0xd8, 0xf2, 0xf7, 0xf, 0xbd, 0x2b, 0x46,
+ 0x1e, 0x13, 0xbc, 0x21, 0x45, 0x40, 0x24, 0xfb,
+ 0x5, 0x4f, 0xe5, 0xe2, 0x1e, 0xe, 0xf7, 0xfc,
+ 0xc2, 0xf7, 0x39, 0x77, 0x1, 0xf7, 0xa5, 0xc2,
+ 0x3, 0xf7, 0xa5, 0x3c, 0x15, 0xc2, 0xf8, 0x4b,
+ 0xf7, 0x17, 0xc2, 0xfb, 0x17, 0xf7, 0x39, 0x54,
+ 0xfb, 0x39, 0xfb, 0x18, 0x54, 0xf7, 0x18, 0x6,
+ 0xe, 0xd0, 0xf7, 0xc9, 0xfb, 0x8e, 0xf7, 0xca,
+ 0x12, 0xf7, 0x21, 0xf7, 0x52, 0x13, 0xa0, 0xf7,
+ 0x21, 0xd0, 0x15, 0xf7, 0x15, 0xfb, 0x27, 0xc8,
+ 0xf7, 0x27, 0xf7, 0x14, 0x6, 0x13, 0x60, 0xc6,
+ 0xfb, 0x14, 0x7, 0x13, 0xa0, 0xf7, 0x8e, 0xf7,
+ 0x14, 0x7, 0x13, 0x60, 0xc7, 0xfb, 0x14, 0xf7,
+ 0x22, 0x4e, 0xfb, 0x22, 0xfb, 0x15, 0x7, 0x13,
+ 0xa0, 0x4f, 0xf7, 0x15, 0x7, 0x13, 0x60, 0xfb,
+ 0x8e, 0xfb, 0x15, 0x7, 0xe, 0xf7, 0xa4, 0xc9,
+ 0xf7, 0x76, 0xc9, 0x1, 0xf7, 0xf, 0xc9, 0xf7,
+ 0x77, 0xcc, 0x3, 0xf7, 0xf, 0xf8, 0x51, 0x15,
+ 0x2c, 0xd6, 0x3a, 0xf1, 0xeb, 0xdc, 0xd3, 0xf6,
+ 0xd8, 0x58, 0xec, 0xfb, 0x10, 0x25, 0x3e, 0x3b,
+ 0x2a, 0x1e, 0xc9, 0x16, 0xbc, 0xb0, 0xcd, 0xdb,
+ 0xe0, 0xa4, 0x3d, 0x66, 0x49, 0x59, 0x5b, 0x4d,
+ 0x46, 0x5d, 0xc5, 0xc3, 0x1e, 0xe, 0xf8, 0x80,
+ 0xf2, 0x1, 0xf7, 0x27, 0xf7, 0x4, 0xdc, 0xf7,
+ 0x4, 0x3, 0xf7, 0x27, 0xf8, 0x80, 0x15, 0xf7,
+ 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xf7, 0x55, 0x24,
+ 0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xe,
+ 0xbb, 0xf3, 0xd5, 0xca, 0xd5, 0xf3, 0x1, 0xf7,
+ 0x8a, 0xf3, 0x14, 0xe0, 0xe2, 0xf7, 0x76, 0x15,
+ 0xf8, 0x3e, 0xca, 0xfc, 0x3e, 0x6, 0xf7, 0x33,
+ 0xf7, 0x12, 0x15, 0x51, 0xa, 0xfb, 0xcf, 0x4,
+ 0x51, 0xa, 0xe, 0x22, 0x76, 0xf7, 0x20, 0xbb,
+ 0xf8, 0x4b, 0xbf, 0x9a, 0x77, 0xf7, 0x4, 0x77,
+ 0x12, 0xf7, 0x0, 0xc0, 0xf7, 0x2, 0xc2, 0xec,
+ 0xc1, 0x62, 0xc3, 0x13, 0xee, 0x80, 0xf6, 0x99,
+ 0x15, 0xc1, 0xbb, 0x6, 0xab, 0x73, 0xa0, 0x7b,
+ 0xc4, 0x83, 0x8, 0xfb, 0x20, 0xc2, 0xf7, 0x20,
+ 0x7, 0xf7, 0x4, 0x94, 0xc1, 0xd3, 0xd8, 0x1a,
+ 0xf7, 0x0, 0xfb, 0x20, 0xa2, 0x48, 0x9f, 0x1e,
+ 0x66, 0x96, 0x34, 0xa9, 0xbf, 0x1a, 0xc7, 0xcb,
+ 0xa4, 0xce, 0x1e, 0x13, 0xdf, 0x0, 0xc0, 0xc1,
+ 0x7c, 0x70, 0xa3, 0x1f, 0x58, 0xc1, 0xf7, 0x34,
+ 0x55, 0x5b, 0x7, 0x13, 0xee, 0x80, 0x74, 0xa0,
+ 0x60, 0x94, 0x6b, 0x8e, 0x8, 0xf6, 0x54, 0x20,
+ 0x7, 0x4b, 0x29, 0x64, 0x24, 0x1f, 0x8b, 0x7,
+ 0x43, 0xcf, 0x62, 0xee, 0x70, 0x1e, 0xd5, 0x76,
+ 0xe2, 0x74, 0x50, 0x1a, 0x47, 0x51, 0x65, 0x45,
+ 0x4f, 0x53, 0xa5, 0xb0, 0x6c, 0x1e, 0xc3, 0x55,
+ 0x7, 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8c,
+ 0xf2, 0x3, 0xf7, 0x8c, 0xf8, 0x71, 0x15, 0xf2,
+ 0xf2, 0x24, 0x6, 0xe, 0x74, 0xa, 0xf7, 0xa6,
+ 0x73, 0xa, 0xc1, 0xfb, 0x44, 0xf8, 0x8, 0xfb,
+ 0x5b, 0x55, 0xf7, 0x24, 0xfb, 0xd2, 0xfb, 0x47,
+ 0x6, 0xe, 0x7f, 0xc1, 0xf7, 0x3c, 0xc2, 0xf7,
+ 0x12, 0xc3, 0x1, 0xca, 0xc4, 0x3, 0xf7, 0xc,
+ 0xf7, 0x66, 0x15, 0xf8, 0x2e, 0x6, 0xf7, 0x12,
+ 0x48, 0xf7, 0x3, 0xfb, 0x35, 0xfb, 0x19, 0x21,
+ 0x2f, 0xfb, 0x1e, 0xfb, 0xa, 0xd0, 0xfb, 0x3,
+ 0xf7, 0x43, 0xdc, 0xdf, 0x99, 0xac, 0xcb, 0x1e,
+ 0x7a, 0xc0, 0x5, 0x64, 0x41, 0x39, 0x84, 0x5c,
+ 0x1b, 0x5c, 0x5e, 0x91, 0xa3, 0x65, 0x1f, 0x67,
+ 0xa2, 0x6d, 0xc1, 0xc0, 0x1a, 0x8d, 0xca, 0x15,
+ 0xc6, 0x93, 0xc6, 0xce, 0xf7, 0x5, 0x1b, 0xf7,
+ 0x1e, 0xaa, 0x26, 0x72, 0x1f, 0xe, 0x5a, 0xa,
+ 0xf7, 0x46, 0xf8, 0x81, 0x15, 0xf7, 0xb9, 0xf2,
+ 0x69, 0xd7, 0xfb, 0xa3, 0xfb, 0x28, 0x5, 0x5a,
+ 0xfb, 0xd9, 0x22, 0xa, 0x5a, 0xa, 0xf7, 0x2c,
+ 0xf8, 0x7d, 0x15, 0xf7, 0x2c, 0xf7, 0xa, 0xf7,
+ 0x29, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, 0x2c, 0xf7,
+ 0x31, 0x5, 0x3a, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+ 0x5, 0x92, 0xfb, 0xc8, 0x22, 0xa, 0x5e, 0xa,
+ 0xdc, 0xf7, 0x7, 0x56, 0xa, 0xf7, 0xde, 0xf8,
+ 0xa6, 0x59, 0xa, 0x4d, 0xfc, 0x52, 0x22, 0xa,
+ 0x7c, 0x82, 0xa, 0xf7, 0x1f, 0xc3, 0x56, 0xa,
+ 0xf7, 0x31, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x24,
+ 0x97, 0xaa, 0xfb, 0xa3, 0xf7, 0x28, 0x5, 0x41,
+ 0xfc, 0x6d, 0x22, 0xa, 0x7c, 0xbd, 0xf7, 0x8a,
+ 0xc2, 0xf7, 0x7e, 0xbf, 0x12, 0xf1, 0xc4, 0x61,
+ 0xc5, 0xf7, 0x8c, 0xc6, 0x61, 0xc5, 0x13, 0xf2,
+ 0xf7, 0x56, 0xf7, 0xcc, 0x15, 0x75, 0x7e, 0x45,
+ 0x5c, 0x2b, 0x1a, 0x30, 0xc7, 0x3b, 0xf7, 0x1c,
+ 0xf7, 0x15, 0xd2, 0xd5, 0xee, 0xea, 0x4b, 0xb7,
+ 0x67, 0x9a, 0x1e, 0x13, 0xec, 0xaa, 0x96, 0xc0,
+ 0xb9, 0xe2, 0x1a, 0xc9, 0x5e, 0xf3, 0xfb, 0x1b,
+ 0x22, 0x3b, 0x49, 0x27, 0x4a, 0xb8, 0x50, 0xab,
+ 0x77, 0x1e, 0x13, 0xf2, 0x68, 0xfb, 0x2e, 0x15,
+ 0xcf, 0xc9, 0xc2, 0xd9, 0xd9, 0xca, 0x54, 0x47,
+ 0x47, 0x4c, 0x54, 0x3d, 0x3d, 0x4d, 0xc2, 0xcf,
+ 0x1e, 0x13, 0xec, 0x9b, 0xf7, 0xbe, 0x15, 0xcd,
+ 0xc3, 0xbb, 0xcf, 0xcf, 0xc3, 0x5b, 0x49, 0x49,
+ 0x53, 0x55, 0x47, 0x47, 0x53, 0xc1, 0xcd, 0x1e,
+ 0xe, 0x7c, 0xf7, 0x12, 0x1, 0xb0, 0xf7, 0x11,
+ 0xd4, 0xf7, 0x14, 0xd4, 0xf7, 0x13, 0x3, 0xf8,
+ 0x48, 0xba, 0x15, 0x6c, 0xa4, 0x6c, 0xb3, 0xa9,
+ 0xab, 0xa5, 0xae, 0xac, 0x72, 0xab, 0x65, 0x67,
+ 0x6f, 0x6e, 0x68, 0x1e, 0xfb, 0x5d, 0x16, 0x6c,
+ 0xa4, 0x6c, 0xb4, 0xaa, 0xaa, 0xa5, 0xae, 0xac,
+ 0x73, 0xab, 0x65, 0x65, 0x6f, 0x6e, 0x68, 0x1e,
+ 0xfb, 0x5a, 0x16, 0x6c, 0xa3, 0x6c, 0xb3, 0xaa,
+ 0xa9, 0xa5, 0xae, 0xac, 0x73, 0xab, 0x65, 0x67,
+ 0x70, 0x6e, 0x68, 0x1e, 0xe, 0xf7, 0x7b, 0xc1,
+ 0x1, 0x8b, 0xf8, 0xec, 0x3, 0xf7, 0x7b, 0x4,
+ 0xf8, 0xec, 0xc1, 0xfc, 0xec, 0x6, 0xe, 0xf7,
+ 0x7b, 0xc1, 0x1, 0xd6, 0xf8, 0x56, 0x3, 0xd6,
+ 0xf7, 0x7b, 0x15, 0xf8, 0x56, 0xc1, 0xfc, 0x56,
+ 0x6, 0xe, 0xf7, 0x1e, 0xc7, 0xf7, 0x8, 0xc8,
+ 0x1, 0xe5, 0xf8, 0x37, 0x3, 0xe5, 0xf7, 0xcf,
+ 0x15, 0xf8, 0x37, 0xc8, 0xfc, 0x37, 0x6, 0xfb,
+ 0x82, 0x4, 0xf8, 0x37, 0xc7, 0xfc, 0x37, 0x6,
+ 0xe, 0x7c, 0xbf, 0xf7, 0xe3, 0xbf, 0x1, 0xc9,
+ 0xc0, 0xf8, 0x0, 0xc6, 0x3, 0xf7, 0x6f, 0xf8,
+ 0x59, 0x15, 0xf4, 0xd1, 0xd5, 0x5c, 0xb1, 0x3a,
+ 0x91, 0x7e, 0x19, 0xa9, 0x67, 0x4f, 0x97, 0x58,
+ 0x1b, 0xfb, 0x36, 0x44, 0xfb, 0xd, 0x28, 0xfb,
+ 0x1b, 0xf1, 0x37, 0xf7, 0x1a, 0xf7, 0x3a, 0xd3,
+ 0xf7, 0x7, 0xf7, 0xd, 0x8d, 0x1f, 0x8e, 0x7,
+ 0xe5, 0x65, 0xf7, 0x2c, 0xfb, 0x11, 0xe6, 0x1e,
+ 0xe1, 0xc5, 0x71, 0xb9, 0xfb, 0x2, 0x42, 0x66,
+ 0x9e, 0x53, 0x96, 0x61, 0x91, 0x19, 0x79, 0x5c,
+ 0xaa, 0x88, 0xb3, 0x82, 0xa9, 0x7e, 0x19, 0x3b,
+ 0x51, 0x5, 0x3d, 0xfb, 0xb6, 0x15, 0xea, 0xcc,
+ 0xd4, 0xf7, 0x2, 0xf7, 0x2c, 0xb0, 0x22, 0x4d,
+ 0x26, 0x3f, 0x48, 0x23, 0xfb, 0x2, 0x41, 0xd6,
+ 0xe7, 0x1e, 0xe, 0x7c, 0xf7, 0x14, 0xf8, 0x64,
+ 0x77, 0x12, 0xf7, 0x80, 0xf7, 0x14, 0x2c, 0xcd,
+ 0x13, 0xd0, 0xf7, 0xaa, 0xf7, 0x49, 0x15, 0xbb,
+ 0x6, 0x9d, 0xf8, 0x18, 0x5, 0x37, 0x6, 0x13,
+ 0xe0, 0x73, 0xfc, 0x9d, 0x15, 0x6c, 0xa4, 0x6b,
+ 0xb2, 0x1e, 0xb3, 0xa3, 0xaa, 0xac, 0xab, 0x6d,
+ 0xab, 0x6b, 0x1f, 0x13, 0x60, 0x60, 0x74, 0x69,
+ 0x6c, 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, 0x67,
+ 0xf7, 0xc, 0x1, 0xf7, 0xa2, 0xc8, 0x3, 0xf7,
+ 0x80, 0xf8, 0x5, 0x15, 0x6b, 0xa7, 0x70, 0xaf,
+ 0xb5, 0xa1, 0xa9, 0xa9, 0xa9, 0x71, 0xa9, 0x64,
+ 0x63, 0x74, 0x6f, 0x6a, 0x1e, 0xa4, 0xfc, 0xa2,
+ 0x15, 0xd9, 0x6, 0x7b, 0xf8, 0x21, 0x5, 0x5f,
+ 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, 0xf7,
+ 0x1f, 0xc2, 0x1, 0xf7, 0x58, 0xc3, 0x3, 0xe6,
+ 0x16, 0xf8, 0xd, 0xc2, 0xfb, 0x6c, 0xf7, 0xd8,
+ 0xf7, 0x62, 0xc2, 0xfb, 0x62, 0x6, 0x8c, 0xf7,
+ 0x11, 0x8a, 0x98, 0xf7, 0x7, 0x8c, 0x8, 0xb1,
+ 0xc9, 0x81, 0x85, 0xaf, 0x1f, 0x90, 0xc3, 0x5,
+ 0x90, 0x6a, 0x45, 0x95, 0x63, 0x1b, 0xfb, 0x20,
+ 0x8c, 0x6f, 0x6a, 0x8a, 0xfb, 0x36, 0x8, 0x22,
+ 0x54, 0xf4, 0xfb, 0xd8, 0x22, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf7, 0xd5, 0xc0, 0xde, 0xf7, 0xd, 0x1,
+ 0xf7, 0x1, 0xc2, 0xf7, 0xa3, 0xc2, 0x3, 0xf8,
+ 0x37, 0xf8, 0x92, 0x15, 0xd2, 0xf7, 0xb, 0x44,
+ 0x6, 0x33, 0xfd, 0x9, 0x15, 0xf7, 0x9e, 0xc0,
+ 0x20, 0xf8, 0xa, 0xfb, 0x1c, 0x56, 0xdc, 0xfb,
+ 0xd5, 0x23, 0x6, 0xfb, 0xdc, 0x56, 0x48, 0xa,
+ 0x4a, 0xa, 0x7c, 0xc3, 0xf7, 0xa5, 0xc9, 0xf7,
+ 0x40, 0xc6, 0x1, 0xf7, 0x14, 0xc9, 0xf7, 0x8d,
+ 0xc9, 0x3, 0xec, 0xa7, 0x15, 0x6c, 0xd2, 0xc5,
+ 0x7f, 0xc2, 0x1b, 0xf7, 0x1c, 0xe0, 0xdc, 0xf7,
+ 0x9, 0x8a, 0x1f, 0xf7, 0xc, 0x8a, 0x38, 0xd4,
+ 0xfb, 0x5, 0x1b, 0x63, 0x6b, 0x80, 0x76, 0x61,
+ 0x1f, 0xf7, 0x60, 0xf7, 0xa8, 0xc6, 0xfb, 0xe6,
+ 0xfb, 0xd5, 0x7, 0xb5, 0x73, 0x5, 0xaf, 0xb6,
+ 0xbb, 0x9b, 0xb6, 0x1b, 0xd6, 0xc7, 0x5b, 0x35,
+ 0x2b, 0x42, 0x61, 0x36, 0x8a, 0x1f, 0x55, 0x8a,
+ 0x51, 0x9a, 0x58, 0xaa, 0x8, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xd3, 0xc0, 0xf7, 0x26, 0xc3, 0x8d, 0x77,
+ 0x12, 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+ 0xec, 0xf7, 0xdf, 0x16, 0xf7, 0x9e, 0xc2, 0x21,
+ 0xf8, 0xd2, 0xfb, 0x25, 0x53, 0xe6, 0xfc, 0x9a,
+ 0x21, 0x6, 0xfb, 0xdc, 0x54, 0x48, 0xa, 0x13,
+ 0xdc, 0x4a, 0xa, 0xfb, 0x23, 0xc6, 0xf8, 0x4b,
+ 0xc4, 0xf7, 0x2d, 0xc4, 0x1, 0xab, 0xf8, 0xab,
+ 0x3, 0xbf, 0x37, 0x15, 0x77, 0x50, 0x5, 0xd0,
+ 0x6, 0xf7, 0x2c, 0x9c, 0xc7, 0xf7, 0x2, 0x9f,
+ 0x1f, 0xc6, 0xf7, 0xdc, 0x5, 0xf6, 0x6, 0x92,
+ 0xc4, 0x5, 0x23, 0x6, 0xf7, 0x7, 0xa2, 0x84,
+ 0xb1, 0xf7, 0x5, 0x1b, 0x9d, 0xa8, 0x88, 0x8a,
+ 0x9d, 0x1f, 0x99, 0xc5, 0x4f, 0x8e, 0x5, 0x54,
+ 0x52, 0x86, 0x64, 0x66, 0x1f, 0x62, 0x61, 0x88,
+ 0x4b, 0x80, 0x4f, 0x8, 0xfb, 0x0, 0x6, 0x85,
+ 0x52, 0x5, 0xf3, 0x6, 0x51, 0xfb, 0xd5, 0x77,
+ 0xfb, 0x6, 0x59, 0x78, 0xfb, 0x5, 0x9a, 0x19,
+ 0xe, 0x95, 0xc3, 0xf7, 0x16, 0xc7, 0xf8, 0x2,
+ 0x77, 0x1, 0xf7, 0xfe, 0xc9, 0x3, 0xe4, 0xf7,
+ 0x4f, 0x15, 0xf7, 0xa5, 0xfb, 0x17, 0xfb, 0x2,
+ 0x53, 0xf7, 0x97, 0xc3, 0x34, 0xf7, 0x17, 0xe2,
+ 0xc7, 0x34, 0xf8, 0xb, 0x34, 0x6, 0xfb, 0x8c,
+ 0xfc, 0x11, 0x5, 0xcc, 0x91, 0x15, 0xf7, 0x64,
+ 0xf7, 0xd1, 0x5, 0xfb, 0xd1, 0x7, 0xe, 0x52,
+ 0xf9, 0x66, 0x1, 0xe6, 0xf8, 0x35, 0x3, 0xe6,
+ 0x66, 0x15, 0xb3, 0x77, 0xf8, 0xd, 0xf9, 0x50,
+ 0x64, 0xa1, 0x5, 0xe, 0xfb, 0x31, 0xbe, 0xf7,
+ 0x37, 0xbf, 0xf7, 0xac, 0xbf, 0x7f, 0x77, 0x12,
+ 0xb2, 0xc0, 0xf7, 0xf5, 0xc0, 0x13, 0xdc, 0xde,
+ 0x3c, 0x15, 0x80, 0x59, 0x50, 0xa, 0x41, 0x7,
+ 0x13, 0xec, 0xbc, 0x70, 0x43, 0xb0, 0x44, 0xa,
+ 0x70, 0x31, 0x48, 0x2c, 0x9b, 0x96, 0x57, 0x1e,
+ 0x94, 0xf7, 0xda, 0x15, 0xe0, 0xde, 0xc4, 0xe9,
+ 0xf7, 0x8, 0xc4, 0x69, 0xa, 0xe, 0xfb, 0x31,
+ 0xbe, 0x8b, 0xf7, 0x37, 0x8b, 0xbf, 0xf7, 0xac,
+ 0xbf, 0x7f, 0x77, 0xab, 0xbd, 0x12, 0xb2, 0xc0,
+ 0xf7, 0xf5, 0xc0, 0x13, 0xef, 0xde, 0x43, 0x15,
+ 0x80, 0x52, 0x50, 0xa, 0x55, 0x7, 0x13, 0xf7,
+ 0xae, 0x6a, 0x49, 0xaa, 0x44, 0xa, 0x6f, 0x31,
+ 0x8c, 0x1e, 0x48, 0x8c, 0x2c, 0x9f, 0x57, 0x96,
+ 0x8, 0x94, 0xf7, 0xd5, 0x15, 0xe0, 0xde, 0xc4,
+ 0xe9, 0xf7, 0x1e, 0xae, 0x69, 0xa, 0xf7, 0x43,
+ 0xf7, 0x88, 0x37, 0xa, 0x7c, 0xc0, 0x63, 0xc3,
+ 0xf7, 0xdf, 0xc2, 0xf7, 0x1a, 0xc2, 0x12, 0xf7,
+ 0x3, 0xc2, 0xd9, 0xc4, 0xf7, 0x17, 0xc2, 0xa7,
+ 0xc2, 0x13, 0x7f, 0xa9, 0x89, 0x15, 0xf7, 0x1c,
+ 0xf8, 0x77, 0x6, 0xde, 0xa1, 0x95, 0xf2, 0xd8,
+ 0xcb, 0x88, 0x56, 0x59, 0x5e, 0x88, 0x55, 0x72,
+ 0x1e, 0x5e, 0x77, 0x5f, 0x72, 0x58, 0x1a, 0x4d,
+ 0xc1, 0x6f, 0xbb, 0x78, 0x1e, 0xf7, 0x17, 0x59,
+ 0xb1, 0x80, 0x5d, 0x1a, 0x13, 0xbf, 0x4f, 0x4f,
+ 0x70, 0x48, 0x88, 0x1e, 0x45, 0x88, 0x41, 0xa7,
+ 0x74, 0xa4, 0x75, 0x54, 0x18, 0x6d, 0xb2, 0xd2,
+ 0x79, 0xd0, 0x1b, 0xec, 0xea, 0xb8, 0xf4, 0xd7,
+ 0x38, 0xaa, 0x40, 0xa4, 0x1f, 0x4f, 0x9f, 0x58,
+ 0x9a, 0xb4, 0x1a, 0xb3, 0xbb, 0x97, 0xbd, 0x9f,
+ 0x1e, 0xc4, 0xa2, 0xaa, 0x9a, 0xce, 0x1a, 0xdf,
+ 0x35, 0xa4, 0x2b, 0xfb, 0x3a, 0x6f, 0x6b, 0xfb,
+ 0x31, 0x1e, 0x3a, 0x54, 0xdc, 0x6, 0x13, 0x7f,
+ 0xfb, 0xdf, 0x3a, 0x7, 0xe, 0x6e, 0xa, 0xf8,
+ 0x20, 0xf8, 0x85, 0x15, 0x9c, 0xa8, 0xfb, 0x49,
+ 0xf7, 0x26, 0x5d, 0x46, 0x5, 0xe, 0xb5, 0xd0,
+ 0xf7, 0xbf, 0xc9, 0x1, 0xf8, 0x44, 0xce, 0x3,
+ 0xf8, 0x87, 0xf7, 0xbd, 0x15, 0xfc, 0x22, 0xf7,
+ 0x43, 0x5, 0x4d, 0x7, 0xf7, 0xdf, 0xfb, 0x2b,
+ 0xfb, 0xdf, 0xfb, 0x28, 0x5, 0x46, 0x7, 0xf8,
+ 0x22, 0xf7, 0x46, 0x5, 0xe, 0x7b, 0xa, 0xf7,
+ 0x95, 0xf7, 0x96, 0x15, 0xf7, 0x7e, 0xfb, 0x50,
+ 0x9c, 0xba, 0xfb, 0x3d, 0xf7, 0x21, 0xf7, 0x3d,
+ 0xf7, 0x21, 0x78, 0xba, 0x5, 0xfc, 0x21, 0xfb,
+ 0x50, 0x15, 0xf7, 0x79, 0xfb, 0x50, 0xa0, 0xba,
+ 0xfb, 0x40, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x1f,
+ 0x75, 0xbc, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x2,
+ 0xd1, 0x15, 0xf7, 0x7d, 0xf7, 0x50, 0xfb, 0x7d,
+ 0xf7, 0x50, 0x79, 0x5c, 0xf7, 0x3d, 0xfb, 0x21,
+ 0xfb, 0x3d, 0xfb, 0x21, 0x5, 0xf7, 0x51, 0x5c,
+ 0x15, 0xf7, 0x77, 0xf7, 0x50, 0xfb, 0x73, 0xf7,
+ 0x50, 0x73, 0x5a, 0xf7, 0x3d, 0xfb, 0x1f, 0xfb,
+ 0x40, 0xfb, 0x21, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+ 0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, 0x2b,
+ 0xf7, 0x96, 0x15, 0xf7, 0xa3, 0xfb, 0x50, 0xa5,
+ 0xb3, 0xfb, 0x66, 0xf7, 0x28, 0xf7, 0x66, 0xf7,
+ 0x27, 0x71, 0xb4, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+ 0x1, 0xf7, 0x2f, 0xf7, 0xba, 0x3, 0xf7, 0x46,
+ 0xd1, 0x15, 0xf7, 0xa3, 0xf7, 0x50, 0xfb, 0xa3,
+ 0xf7, 0x50, 0x70, 0x62, 0xf7, 0x67, 0xfb, 0x27,
+ 0xfb, 0x63, 0xfb, 0x28, 0x5, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xf0, 0xc2, 0xf7, 0x8, 0xc2, 0x1, 0xf5,
+ 0xc3, 0xf7, 0xab, 0xc3, 0x3, 0x9e, 0x16, 0xf7,
+ 0x83, 0xc2, 0x2b, 0xf7, 0x99, 0x6, 0xb6, 0xbb,
+ 0xcb, 0xb7, 0xce, 0x1b, 0xe0, 0x9a, 0x59, 0x54,
+ 0x1f, 0xfb, 0x87, 0x36, 0x54, 0xf7, 0x76, 0xc2,
+ 0x36, 0xf7, 0x9d, 0x7, 0xca, 0x6e, 0xd6, 0xfb,
+ 0x13, 0x4a, 0x4e, 0x66, 0x5e, 0x56, 0x1e, 0xf7,
+ 0x91, 0xfb, 0x24, 0x54, 0xe3, 0xfc, 0x9b, 0x34,
+ 0x7, 0xe, 0xf8, 0x85, 0xf7, 0x43, 0x1, 0xf7,
+ 0x17, 0xf7, 0xe6, 0x3, 0xf7, 0x17, 0xf8, 0x9d,
+ 0x71, 0xa, 0x7d, 0xfb, 0x2b, 0x71, 0xa, 0xe,
+ 0xf7, 0x7b, 0xc1, 0x1, 0xf2, 0xf8, 0x1e, 0x3,
+ 0xf2, 0xf7, 0x7b, 0x15, 0xf8, 0x1e, 0xc1, 0xfc,
+ 0x1e, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, 0xc2,
+ 0xed, 0xf7, 0x10, 0x81, 0xa, 0xf7, 0x95, 0x7e,
+ 0xa, 0xfb, 0x36, 0xfd, 0x25, 0x15, 0xf8, 0x2e,
+ 0xc2, 0xfb, 0x43, 0xf8, 0x10, 0xfb, 0x5d, 0x54,
+ 0xf7, 0x24, 0xfb, 0xd9, 0xfb, 0x46, 0x6, 0xe,
+ 0x6f, 0xa, 0xf7, 0x31, 0xf8, 0x82, 0x15, 0xf7,
+ 0xb7, 0xf1, 0x69, 0xd7, 0xfb, 0xa1, 0xfb, 0x27,
+ 0x5, 0x59, 0xfc, 0xa1, 0x15, 0x35, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf7, 0xdd, 0x82, 0xa, 0x68, 0xa,
+ 0xc3, 0x3, 0xe9, 0xf8, 0x86, 0x15, 0xb4, 0x79,
+ 0xf7, 0x29, 0xf7, 0xa, 0xf7, 0x27, 0xfb, 0xa,
+ 0xb6, 0x9d, 0xfb, 0x29, 0xf7, 0x30, 0x5, 0x3a,
+ 0x6, 0xfb, 0x29, 0xfd, 0x22, 0x15, 0x35, 0xa,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xe8, 0xf7,
+ 0x7, 0x12, 0xf7, 0x3a, 0xe2, 0xa0, 0xc3, 0x7e,
+ 0xe0, 0x13, 0xf8, 0xea, 0x16, 0x35, 0xa, 0x13,
+ 0xf4, 0xf7, 0x72, 0xf8, 0x6f, 0x59, 0xa, 0xe,
+ 0x6f, 0xa, 0xf7, 0x1c, 0xf8, 0xe8, 0x15, 0xf7,
+ 0xb9, 0x25, 0x96, 0xaa, 0xfb, 0xa2, 0xf7, 0x27,
+ 0x5, 0x40, 0xfd, 0x34, 0x15, 0x35, 0xa, 0xe,
+ 0xfb, 0x31, 0xc1, 0xf8, 0x76, 0xc5, 0xee, 0xf7,
+ 0x10, 0x1, 0xf7, 0x18, 0xc4, 0xf7, 0xa9, 0xc7,
+ 0x3, 0xf7, 0x8, 0x7e, 0xa, 0x60, 0xfd, 0x8c,
+ 0x15, 0x55, 0xf7, 0x3f, 0xc1, 0x54, 0xf8, 0xae,
+ 0x25, 0x54, 0xb8, 0xfc, 0x77, 0x7, 0xf7, 0xbc,
+ 0xf9, 0x17, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+ 0xfb, 0x2, 0xfd, 0x7a, 0x15, 0x7c, 0x55, 0x5,
+ 0x85, 0x91, 0xb6, 0x7f, 0xbf, 0x1b, 0xef, 0xa1,
+ 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0x32,
+ 0x51, 0xed, 0xfb, 0xf4, 0x7, 0x32, 0x88, 0x62,
+ 0x50, 0x56, 0x89, 0x93, 0x95, 0x6c, 0x1e, 0xe,
+ 0xfb, 0x31, 0xc1, 0xf8, 0x7b, 0xc0, 0xf2, 0xf7,
+ 0x9, 0x1, 0xf8, 0x28, 0xc7, 0x3, 0xf8, 0x2,
+ 0xf8, 0xb0, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+ 0xfb, 0x70, 0xfd, 0x7a, 0x15, 0x81, 0x53, 0x5,
+ 0x82, 0xb5, 0xbf, 0x84, 0xbf, 0x1b, 0xef, 0xdd,
+ 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0xd2,
+ 0x56, 0xf7, 0x96, 0xfb, 0xf9, 0x7, 0x32, 0x53,
+ 0x62, 0x49, 0x56, 0x5b, 0x96, 0x92, 0x68, 0x1e,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, 0xf7, 0x1e,
+ 0xc2, 0x1, 0xf7, 0xa, 0xc3, 0x3, 0xaa, 0x16,
+ 0xf7, 0x23, 0xf7, 0x5a, 0x6, 0xc5, 0xb5, 0xb4,
+ 0x6a, 0xe0, 0x32, 0xbd, 0x4c, 0x19, 0x52, 0x54,
+ 0xf7, 0x6d, 0xc2, 0x2c, 0x6, 0x4d, 0xda, 0x4b,
+ 0xd3, 0x3f, 0xc9, 0xf7, 0x33, 0xf7, 0x5, 0x18,
+ 0xee, 0xc2, 0xfb, 0x72, 0x54, 0xba, 0x6, 0xfb,
+ 0x48, 0xfb, 0x14, 0x5, 0xf8, 0xc, 0xfb, 0x23,
+ 0x54, 0xe2, 0xfc, 0x9b, 0x34, 0x7, 0xe, 0x8b,
+ 0xc2, 0xf8, 0x9b, 0xc2, 0x68, 0xa, 0x73, 0xa,
+ 0xc2, 0xfb, 0x44, 0xf8, 0xd2, 0xfb, 0x6b, 0x54,
+ 0xf7, 0x34, 0xfc, 0x9b, 0xfb, 0x47, 0x6, 0xe,
+ 0xb5, 0xc9, 0xf7, 0xbf, 0xd0, 0x1, 0xf0, 0xce,
+ 0x3, 0xf0, 0xf7, 0x6d, 0x15, 0xf8, 0x22, 0xfb,
+ 0x43, 0x5, 0xc9, 0x7, 0xfb, 0xdf, 0xf7, 0x2b,
+ 0xf7, 0xdf, 0xf7, 0x28, 0x5, 0xd0, 0x7, 0xfc,
+ 0x22, 0xfb, 0x46, 0x5, 0xe, 0x76, 0xbe, 0xf7,
+ 0x37, 0xc3, 0xd7, 0xc5, 0xf7, 0x3e, 0xc5, 0x1,
+ 0xf7, 0x39, 0xc2, 0x3, 0xd6, 0xaa, 0x15, 0xa5,
+ 0x57, 0xa8, 0x94, 0xd8, 0xac, 0xb0, 0x8a, 0x19,
+ 0xaf, 0x8a, 0x90, 0x8c, 0xad, 0x7a, 0x8, 0x81,
+ 0x9f, 0x9f, 0x7d, 0xbc, 0x1b, 0xb6, 0xb6, 0x9d,
+ 0xa7, 0xaa, 0x1f, 0x76, 0xb8, 0x5, 0x7f, 0x7a,
+ 0x61, 0x6f, 0x68, 0x1b, 0x69, 0x81, 0x93, 0x9f,
+ 0x6c, 0x1f, 0x99, 0x75, 0x73, 0x90, 0x7c, 0x1b,
+ 0x6a, 0x6f, 0x84, 0x7a, 0x67, 0x1f, 0xc3, 0xb7,
+ 0x9b, 0xa9, 0x86, 0xcd, 0x8, 0xf7, 0x19, 0xc3,
+ 0xfb, 0x1d, 0x6, 0x87, 0x97, 0x88, 0xaf, 0x88,
+ 0xa7, 0x8, 0xf7, 0x27, 0xc5, 0x6, 0xfb, 0x2d,
+ 0x8c, 0x5, 0x89, 0xa3, 0x89, 0x97, 0x97, 0x1a,
+ 0xe8, 0xc6, 0xa7, 0xbe, 0xbe, 0xbd, 0x72, 0x59,
+ 0xa4, 0x1e, 0xc0, 0x9e, 0x5, 0xc4, 0x70, 0x50,
+ 0xc4, 0x2f, 0x1b, 0x22, 0x4e, 0x3f, 0x36, 0x7b,
+ 0x8d, 0x78, 0x8e, 0x6c, 0x1f, 0x2e, 0x4f, 0xef,
+ 0x6, 0x8f, 0x6f, 0x8b, 0x69, 0x8f, 0x7e, 0x8,
+ 0xfb, 0x0, 0x53, 0xf7, 0x4, 0x6, 0x96, 0x4c,
+ 0x53, 0x5a, 0x46, 0x59, 0x8, 0xe, 0xf7, 0xc7,
+ 0xc9, 0x1, 0xf8, 0x54, 0xc2, 0x3, 0xf8, 0x54,
+ 0xf7, 0xc7, 0x15, 0xfb, 0x5b, 0xc2, 0xf7, 0x99,
+ 0xfc, 0x3e, 0x4d, 0x7, 0xe, 0x8b, 0xc3, 0xf8,
+ 0x99, 0xc3, 0x1, 0xf7, 0xa5, 0x73, 0xa, 0xc3,
+ 0xfb, 0x45, 0xf7, 0x88, 0x6, 0xf7, 0x18, 0xc0,
+ 0x5, 0xc3, 0x7, 0xfb, 0x18, 0x55, 0x5, 0xf7,
+ 0xa6, 0xfb, 0x78, 0x53, 0xf7, 0x41, 0xfb, 0x84,
+ 0x7, 0xfb, 0x19, 0x55, 0x5, 0x54, 0x7, 0xf7,
+ 0x19, 0xc1, 0x5, 0xfb, 0x72, 0xfb, 0x46, 0x7,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xdf, 0xc2, 0x1, 0xc2,
+ 0xc4, 0xf7, 0x3c, 0xc3, 0xf7, 0x2c, 0xc4, 0x3,
+ 0xc2, 0x16, 0xf7, 0xd, 0xc1, 0x4b, 0xf7, 0xa2,
+ 0x6, 0xa7, 0x9f, 0xa1, 0xad, 0xba, 0x1b, 0xd0,
+ 0x95, 0x40, 0x81, 0x1f, 0xfb, 0xc1, 0xf7, 0xd,
+ 0xc2, 0x4a, 0xf7, 0x96, 0x7, 0x96, 0xa7, 0xca,
+ 0xc4, 0xc9, 0x90, 0x54, 0x75, 0x1e, 0xfb, 0xca,
+ 0xf7, 0x4, 0xc2, 0x54, 0xf7, 0x96, 0x7, 0xcd,
+ 0x6a, 0xc9, 0x3d, 0x56, 0x6e, 0x68, 0x68, 0x6f,
+ 0x1e, 0xaf, 0x7c, 0x62, 0xad, 0x55, 0x1b, 0x5e,
+ 0x6f, 0x6f, 0x6e, 0x6e, 0x1f, 0xb7, 0xfb, 0x4,
+ 0x55, 0xc2, 0x7, 0xe, 0xf8, 0xa1, 0xb3, 0x1,
+ 0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf7, 0xc, 0xf8,
+ 0xa1, 0x15, 0xf7, 0xfc, 0xb3, 0xfb, 0xfc, 0x6,
+ 0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xdb, 0xf8, 0x4c,
+ 0x3, 0xdb, 0xf7, 0x7c, 0x15, 0xf8, 0x4c, 0xbe,
+ 0xfc, 0x4c, 0x6, 0xe, 0xfb, 0x1c, 0x76, 0xf7,
+ 0x2c, 0xbf, 0x62, 0xb4, 0x62, 0xc1, 0xf7, 0xcd,
+ 0xc0, 0x12, 0xf7, 0x3, 0xc2, 0xf7, 0x9f, 0xc2,
+ 0x13, 0xce, 0xf7, 0x3a, 0xae, 0x15, 0x6f, 0xa7,
+ 0xb1, 0x7f, 0xb3, 0x1b, 0xc8, 0xcb, 0xae, 0xc5,
+ 0xaf, 0x1f, 0x13, 0xae, 0x39, 0xf7, 0x1d, 0x7,
+ 0x13, 0x9e, 0xc1, 0x39, 0xf8, 0x2, 0xfb, 0x1d,
+ 0x56, 0xdd, 0xfb, 0x18, 0x7, 0x13, 0xce, 0x5a,
+ 0x68, 0xfb, 0x25, 0xfb, 0x11, 0x49, 0x62, 0xb8,
+ 0xc6, 0x1e, 0xf7, 0xa7, 0xfb, 0x1d, 0x56, 0xdd,
+ 0xfc, 0xa6, 0xc2, 0x7, 0xe, 0xc9, 0x76, 0x1,
+ 0xe1, 0xdb, 0x15, 0xaf, 0x65, 0xf7, 0x45, 0xf7,
+ 0x43, 0xf7, 0x44, 0xfb, 0x42, 0xb2, 0xb2, 0xfb,
+ 0x44, 0xf7, 0x43, 0xf7, 0x44, 0xf7, 0x44, 0x69,
+ 0xb4, 0xfb, 0x49, 0xfb, 0x46, 0xfb, 0x43, 0xf7,
+ 0x42, 0x65, 0x64, 0xf7, 0x43, 0xfb, 0x43, 0x5,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xe0, 0xc2, 0x1, 0xf7,
+ 0x1, 0xc2, 0xf7, 0xa5, 0xc2, 0x3, 0xa4, 0x16,
+ 0xf7, 0x73, 0xc2, 0x37, 0xf7, 0x85, 0x6, 0xb8,
+ 0xb5, 0xd0, 0xb9, 0xc9, 0x1b, 0xb7, 0xc3, 0x7e,
+ 0x47, 0x1f, 0xfb, 0x8f, 0x38, 0x54, 0xf7, 0x70,
+ 0xc2, 0x39, 0xf7, 0x90, 0x7, 0xe1, 0x5a, 0xbc,
+ 0x21, 0x45, 0x45, 0x5e, 0x62, 0x6a, 0x1e, 0xe1,
+ 0xfb, 0x1f, 0x54, 0xdf, 0xfb, 0xe0, 0x37, 0x7,
+ 0xe, 0x7c, 0xc4, 0xf7, 0x4a, 0xc9, 0xf7, 0xa9,
+ 0xc6, 0x1, 0xf5, 0xc7, 0xf7, 0xa2, 0xc5, 0x3,
+ 0xf5, 0x7c, 0x15, 0xf7, 0x8d, 0xf7, 0x1f, 0xf7,
+ 0x5, 0xf7, 0x7c, 0xf7, 0x62, 0x2d, 0xe1, 0xfb,
+ 0x6, 0x23, 0x3f, 0x27, 0x20, 0x28, 0xcb, 0x2f,
+ 0xf7, 0x2, 0xd9, 0xbc, 0xb9, 0xb3, 0xa8, 0x1f,
+ 0xfb, 0x5a, 0xfb, 0x34, 0x3d, 0xfb, 0x3e, 0x93,
+ 0x1e, 0xf7, 0xd9, 0xf7, 0xf2, 0x15, 0x54, 0x70,
+ 0x59, 0x58, 0x4a, 0x1b, 0x43, 0x58, 0xc0, 0xd9,
+ 0xc5, 0xab, 0xe3, 0xe3, 0xe2, 0xc1, 0x2d, 0x3e,
+ 0x8f, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xed, 0xc0,
+ 0x5b, 0xc0, 0xc7, 0xbb, 0x8c, 0xbc, 0x12, 0xa4,
+ 0xf7, 0x20, 0x54, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+ 0xbd, 0xeb, 0xf8, 0xa1, 0x15, 0xbe, 0x81, 0x5,
+ 0x99, 0x8f, 0x9f, 0xae, 0xaf, 0x1b, 0xad, 0xaa,
+ 0x85, 0x7c, 0xa1, 0x1f, 0x7c, 0xa1, 0x9b, 0x7e,
+ 0xb4, 0x1b, 0xc9, 0xb6, 0xb6, 0xc2, 0x9e, 0x1f,
+ 0x59, 0x94, 0x5, 0x72, 0x82, 0x6e, 0x69, 0x67,
+ 0x1b, 0x76, 0x7a, 0x97, 0x98, 0x78, 0x1f, 0x9c,
+ 0x73, 0x71, 0x93, 0x5f, 0x1b, 0x58, 0x56, 0x74,
+ 0x4a, 0x75, 0x1f, 0x44, 0xfc, 0xa1, 0x15, 0xf7,
+ 0x73, 0xbf, 0x38, 0xf7, 0x93, 0x6, 0xb7, 0xb5,
+ 0xd0, 0xbe, 0xc8, 0x1b, 0xb7, 0xc4, 0x7f, 0x49,
+ 0x1f, 0xfb, 0xa4, 0x38, 0x57, 0xf7, 0x6f, 0xbf,
+ 0x39, 0xf7, 0xa5, 0x7, 0xdd, 0x62, 0xbb, 0x2a,
+ 0x45, 0x47, 0x65, 0x5f, 0x58, 0x1e, 0x13, 0xdd,
+ 0xd0, 0xfb, 0x20, 0x56, 0x7, 0x13, 0xdb, 0xe0,
+ 0xfb, 0xe5, 0x6, 0x13, 0xdd, 0x36, 0x6, 0xe,
+ 0xf7, 0x1f, 0xc1, 0xf7, 0x35, 0xc1, 0x1, 0xf7,
+ 0x3b, 0x3d, 0x15, 0xbd, 0x6, 0x95, 0xf7, 0x6d,
+ 0x5, 0xf7, 0x23, 0x6, 0x86, 0xfb, 0x6d, 0x5,
+ 0xbd, 0x6, 0x91, 0xf7, 0x6d, 0x5, 0xef, 0xc1,
+ 0x2b, 0x6, 0x8f, 0xf7, 0x35, 0x5, 0xe7, 0xc1,
+ 0x32, 0x6, 0x90, 0xf7, 0x6f, 0x5, 0x58, 0x6,
+ 0x87, 0xfb, 0x6f, 0x5, 0xfb, 0x25, 0x6, 0x8e,
+ 0xf7, 0x6f, 0x5, 0x57, 0x6, 0x88, 0xfb, 0x6f,
+ 0x5, 0x20, 0x55, 0xf4, 0x6, 0x86, 0xfb, 0x35,
+ 0x5, 0x27, 0x55, 0xec, 0x6, 0xc1, 0xc1, 0x15,
+ 0x90, 0xf7, 0x35, 0x5, 0xf7, 0x24, 0x6, 0x86,
+ 0xfb, 0x35, 0x5, 0xe, 0x7a, 0xc2, 0xf7, 0xf2,
+ 0xc2, 0x1, 0xc7, 0xc1, 0xf8, 0x2, 0xc6, 0x3,
+ 0xc7, 0xf7, 0x67, 0x15, 0xfb, 0x1f, 0xf6, 0x32,
+ 0xf7, 0x18, 0xf7, 0x1e, 0xf1, 0xe6, 0xf7, 0x1e,
+ 0xf7, 0x22, 0x24, 0xe4, 0xfb, 0x1d, 0xfb, 0x1f,
+ 0x27, 0x34, 0xfb, 0x25, 0x1e, 0xc1, 0x16, 0xf7,
+ 0x6, 0xd8, 0xca, 0xf5, 0xf5, 0xd8, 0x4d, 0xfb,
+ 0x6, 0xfb, 0xa, 0x43, 0x53, 0xfb, 0x3, 0x22,
+ 0x3d, 0xc5, 0xf7, 0x7, 0x1e, 0xe, 0x63, 0xa,
+ 0x58, 0xa, 0xf7, 0x4c, 0xf8, 0x95, 0x15, 0xf7,
+ 0xa6, 0xde, 0x6b, 0xd7, 0xfb, 0x92, 0xfb, 0x13,
+ 0x5, 0xfb, 0x2, 0xfb, 0xdd, 0x21, 0xa, 0x63,
+ 0xa, 0xf7, 0x62, 0x77, 0x58, 0xa, 0xf7, 0x32,
+ 0xf8, 0x7d, 0x15, 0xf7, 0x22, 0xf7, 0x3, 0xf7,
+ 0x20, 0xfb, 0x3, 0xb3, 0x9d, 0xfb, 0x22, 0xf7,
+ 0x27, 0x5, 0x3f, 0x6, 0xfb, 0x23, 0xfb, 0x27,
+ 0x5, 0x52, 0xfb, 0xb7, 0x21, 0xa, 0x63, 0xa,
+ 0xd2, 0xf7, 0x8, 0x58, 0xa, 0xf7, 0xf6, 0xf8,
+ 0x9b, 0x15, 0xda, 0xf7, 0x8, 0x3c, 0x6, 0xfb,
+ 0x54, 0xfb, 0x8, 0x15, 0xdd, 0xf7, 0x8, 0x39,
+ 0x6, 0x27, 0xfc, 0x37, 0x21, 0xa, 0x7c, 0xc2,
+ 0xf7, 0x2c, 0xc6, 0xf7, 0x1b, 0xc2, 0x1, 0xa9,
+ 0xc1, 0xf7, 0x59, 0xc0, 0xf7, 0x4b, 0xbf, 0x3,
+ 0xf7, 0xc8, 0xd3, 0x15, 0x58, 0xa4, 0xb2, 0x67,
+ 0xe0, 0x1b, 0xb6, 0xac, 0x96, 0x97, 0xaf, 0x1f,
+ 0x81, 0xc1, 0x5, 0x81, 0x6f, 0x65, 0x7f, 0x68,
+ 0x1b, 0x3f, 0x55, 0xbb, 0xf3, 0x91, 0x1f, 0xf7,
+ 0x7f, 0x6, 0xec, 0x8c, 0x82, 0xf7, 0x2c, 0xfb,
+ 0x14, 0x1b, 0x48, 0x66, 0x5a, 0x6d, 0x7d, 0x1f,
+ 0xb9, 0x76, 0x63, 0xac, 0x4b, 0x1b, 0xfb, 0x1d,
+ 0x74, 0xfb, 0x21, 0xfb, 0x3, 0xfb, 0x51, 0xf7,
+ 0x9, 0x7b, 0xad, 0xe3, 0xa9, 0xcb, 0xa3, 0x94,
+ 0x1f, 0xa6, 0xf7, 0x47, 0x15, 0xcb, 0x81, 0xba,
+ 0xcf, 0xc5, 0x1b, 0xd1, 0x9c, 0x3b, 0x57, 0x1f,
+ 0xfc, 0x45, 0x52, 0x15, 0xe3, 0x9d, 0xf3, 0xdf,
+ 0xd9, 0x9c, 0x35, 0x49, 0x47, 0x90, 0xfb, 0x12,
+ 0x24, 0x31, 0x82, 0xf7, 0x12, 0xa7, 0x1e, 0xe,
+ 0xfb, 0x2b, 0xc1, 0x1, 0xf7, 0x78, 0xcd, 0x3,
+ 0xf7, 0xb9, 0x16, 0x67, 0x7b, 0x6e, 0x6a, 0x67,
+ 0x1a, 0x61, 0xaf, 0x73, 0xb1, 0xa1, 0xa1, 0x93,
+ 0x9a, 0x9c, 0x1e, 0x93, 0xc3, 0x5, 0x7c, 0x82,
+ 0x75, 0x81, 0x79, 0x1b, 0x7b, 0x7f, 0x95, 0x9f,
+ 0xb1, 0xba, 0x9d, 0xa4, 0x96, 0x1f, 0xe, 0x63,
+ 0xa, 0x58, 0xa, 0xf7, 0x36, 0xf8, 0xe7, 0x15,
+ 0xf7, 0xa8, 0x24, 0x96, 0xaa, 0xfb, 0x93, 0xf7,
+ 0x29, 0x5, 0xfb, 0x18, 0xfc, 0x5c, 0x21, 0xa,
+ 0x8b, 0xc2, 0xf8, 0xcb, 0x77, 0x1, 0xf7, 0xa9,
+ 0xc2, 0x3, 0xea, 0x16, 0xf8, 0x2d, 0xc2, 0xfb,
+ 0x40, 0xf8, 0xcb, 0x6, 0xfb, 0x71, 0x58, 0x5,
+ 0x54, 0x7, 0xf7, 0x3a, 0xaf, 0x5, 0xfc, 0x85,
+ 0xfb, 0x4a, 0x7, 0xe, 0x5d, 0xc1, 0x5f, 0x76,
+ 0xf7, 0xd4, 0xc0, 0x7c, 0xc1, 0xf7, 0xca, 0x77,
+ 0x12, 0xf0, 0xc0, 0xf8, 0x3, 0xbe, 0x13, 0x5e,
+ 0xb9, 0x6e, 0x15, 0xb0, 0x6f, 0xf8, 0x9a, 0xf9,
+ 0x46, 0x66, 0xab, 0x5, 0xfc, 0xc8, 0xfc, 0x0,
+ 0x15, 0xf7, 0x94, 0xc1, 0x25, 0xf7, 0xc6, 0x6,
+ 0xfb, 0x25, 0x73, 0x5, 0x55, 0x7, 0xe7, 0x99,
+ 0x5, 0xfb, 0x86, 0x26, 0x7, 0xf7, 0xfa, 0xfb,
+ 0xf2, 0x15, 0x13, 0xae, 0x58, 0xf7, 0x6a, 0xc1,
+ 0xfb, 0x22, 0x7, 0xf1, 0xe5, 0xb3, 0xb0, 0xd2,
+ 0x1a, 0xc3, 0x69, 0xc1, 0x46, 0x65, 0x67, 0x78,
+ 0x69, 0x73, 0x1e, 0x4c, 0xb8, 0x7, 0xb0, 0x84,
+ 0xa9, 0xa5, 0xa9, 0x1b, 0xae, 0x9c, 0x6c, 0x69,
+ 0x59, 0x24, 0x39, 0x4f, 0x4e, 0x1f, 0xe, 0x5e,
+ 0xc1, 0x5e, 0x76, 0xf7, 0xf, 0xc3, 0xf7, 0x47,
+ 0xc1, 0xf7, 0xc6, 0x77, 0x12, 0xef, 0xbc, 0xf7,
+ 0xcc, 0xbd, 0x13, 0xbe, 0xf7, 0xd6, 0xc8, 0x15,
+ 0xf7, 0x1f, 0x57, 0x54, 0x55, 0xf7, 0x2b, 0xc1,
+ 0x5d, 0xbf, 0xb9, 0xc3, 0x5d, 0xf7, 0x55, 0x51,
+ 0x6, 0xfb, 0x17, 0xfb, 0x66, 0x5, 0xca, 0x9c,
+ 0x15, 0xd7, 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7,
+ 0xfc, 0x14, 0xfb, 0x24, 0x15, 0x13, 0x7e, 0xb3,
+ 0x6d, 0xf8, 0x77, 0xf9, 0x47, 0x63, 0x9f, 0x5,
+ 0xfc, 0xc4, 0xfb, 0xf5, 0x15, 0xf7, 0x87, 0xc1,
+ 0x2d, 0xf7, 0xc6, 0x6, 0xfb, 0x19, 0x73, 0x5,
+ 0x55, 0x7, 0xdf, 0x99, 0x5, 0xfb, 0x86, 0x27,
+ 0x7, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0xd1, 0x77,
+ 0x68, 0xa, 0xc1, 0x3, 0xf7, 0x40, 0xf7, 0x8d,
+ 0x15, 0xf7, 0x94, 0xc3, 0x27, 0xf7, 0xd1, 0x6,
+ 0xfb, 0x25, 0x71, 0x5, 0x53, 0x7, 0xe6, 0x9a,
+ 0x5, 0xfb, 0x8e, 0x25, 0x7, 0xe, 0xf7, 0x8d,
+ 0xbf, 0xe7, 0xbe, 0xe4, 0xba, 0x1, 0xf7, 0xf1,
+ 0xb7, 0x3, 0xf7, 0xf2, 0xf7, 0x95, 0x15, 0xe8,
+ 0xc2, 0x59, 0xf7, 0x27, 0x6, 0xd6, 0x75, 0xb9,
+ 0x3e, 0x5f, 0x5b, 0x7a, 0x7c, 0x69, 0x1e, 0x96,
+ 0x5b, 0x5, 0xa8, 0xc0, 0xb0, 0x8f, 0xa8, 0x1b,
+ 0xac, 0x9d, 0x6a, 0x58, 0x1f, 0x7e, 0x7, 0x8f,
+ 0x75, 0x73, 0x8f, 0x73, 0x1b, 0x26, 0x76, 0x4a,
+ 0x69, 0x5c, 0xac, 0x5a, 0xc2, 0xb3, 0xaf, 0xa6,
+ 0xad, 0xa8, 0x1f, 0x8a, 0xcf, 0x15, 0x5f, 0x72,
+ 0x66, 0x6a, 0x64, 0x1b, 0x70, 0x76, 0x9e, 0xa4,
+ 0xa4, 0xa4, 0xa2, 0xba, 0xb1, 0xb2, 0x7c, 0x8b,
+ 0x1f, 0xe, 0xf7, 0x8d, 0xc1, 0xf7, 0x75, 0xbf,
+ 0x1, 0xf7, 0x31, 0xc2, 0xf7, 0x44, 0xc2, 0x3,
+ 0xf7, 0x31, 0xf8, 0x34, 0x15, 0xfb, 0x13, 0xed,
+ 0x63, 0xb8, 0xc3, 0xe2, 0xba, 0xf7, 0xa, 0xe5,
+ 0x55, 0xd7, 0x34, 0x4b, 0x3a, 0x59, 0xfb, 0x6,
+ 0x1e, 0xc2, 0x16, 0xc5, 0xad, 0xc1, 0xc4, 0xd1,
+ 0x9a, 0x3b, 0x6b, 0x45, 0x63, 0x60, 0x5d, 0x5f,
+ 0x5d, 0xb7, 0xd0, 0x1e, 0xe, 0x7f, 0xbd, 0x69,
+ 0x76, 0xf8, 0x33, 0xbd, 0x8e, 0x77, 0x12, 0xc8,
+ 0xbf, 0xf8, 0x0, 0xc2, 0x13, 0x6c, 0xc8, 0xa3,
+ 0x15, 0xaf, 0x62, 0xc0, 0xbe, 0x5, 0x13, 0x9c,
+ 0x69, 0xb7, 0xc1, 0x7f, 0xbe, 0x1b, 0xf7, 0x12,
+ 0xf6, 0xdd, 0xf7, 0x29, 0xbf, 0x7e, 0xbf, 0x6c,
+ 0xb1, 0x1f, 0xbd, 0xbc, 0x67, 0xb4, 0x57, 0x58,
+ 0x5, 0x13, 0xac, 0xac, 0x60, 0x57, 0x9a, 0x54,
+ 0x1b, 0xfb, 0x2d, 0x35, 0x22, 0xfb, 0x11, 0x55,
+ 0x9c, 0x54, 0xac, 0x65, 0x1f, 0xda, 0x8d, 0x15,
+ 0xf7, 0x96, 0xf7, 0x8d, 0x5, 0x98, 0x77, 0x9b,
+ 0x69, 0x4b, 0x1a, 0x50, 0x5a, 0x20, 0xfb, 0x16,
+ 0x64, 0x65, 0x99, 0xa0, 0x6c, 0x1e, 0x63, 0xb0,
+ 0x15, 0x73, 0xa7, 0x7e, 0xb3, 0xb3, 0x1a, 0xf6,
+ 0xdd, 0xd4, 0xf3, 0xa9, 0xb7, 0x7f, 0x72, 0xb0,
+ 0x1e, 0xe, 0x63, 0xa, 0xc9, 0xbd, 0x9c, 0xbc,
+ 0x12, 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x17, 0xf7,
+ 0x0, 0xf8, 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a,
+ 0x8f, 0x9e, 0xbb, 0xad, 0x1b, 0xad, 0x9e, 0x76,
+ 0x79, 0xa3, 0x1f, 0x13, 0xfc, 0x7c, 0x9e, 0xa0,
+ 0x7e, 0xad, 0x1b, 0x13, 0xec, 0xc6, 0xb9, 0xbb,
+ 0xc2, 0x9d, 0x1f, 0x5c, 0x94, 0x5, 0x73, 0x82,
+ 0x70, 0x65, 0x69, 0x1b, 0x77, 0x7c, 0x94, 0x96,
+ 0x7c, 0x1f, 0x13, 0xdc, 0x9e, 0x71, 0x72, 0xa6,
+ 0x61, 0x1b, 0x5b, 0x59, 0x67, 0x4a, 0x76, 0x1f,
+ 0x5d, 0xfb, 0xc9, 0x21, 0xa, 0x66, 0xa, 0xe7,
+ 0xc2, 0xf7, 0xf1, 0xc4, 0x13, 0xdc, 0x92, 0x21,
+ 0x15, 0x58, 0xf7, 0xbd, 0xbe, 0xfb, 0x31, 0xf7,
+ 0x5f, 0x7, 0x67, 0xac, 0xc3, 0x62, 0xea, 0x1b,
+ 0xf7, 0x11, 0xec, 0xe8, 0xf7, 0x12, 0xf7, 0x4,
+ 0x2b, 0xde, 0xfb, 0xe, 0x33, 0x4d, 0x70, 0x60,
+ 0x65, 0x1f, 0x13, 0xec, 0xcc, 0xfb, 0x20, 0x58,
+ 0xe0, 0xfc, 0x78, 0x7, 0xc6, 0xf7, 0xe4, 0x15,
+ 0x13, 0xdc, 0xe4, 0xd8, 0xca, 0xeb, 0xeb, 0xd7,
+ 0x4c, 0x32, 0x32, 0x3f, 0x43, 0x2b, 0x2b, 0x3e,
+ 0xd3, 0xe4, 0x1e, 0xe, 0xf8, 0xa8, 0xa9, 0x1,
+ 0xf7, 0xd1, 0xb7, 0xd9, 0xb6, 0x3, 0xf7, 0xd1,
+ 0x3d, 0x15, 0xb7, 0xf8, 0xf6, 0xd9, 0xfc, 0xf6,
+ 0xb6, 0xf8, 0xf6, 0xbb, 0xa9, 0xfb, 0x6e, 0x6,
+ 0xfb, 0x38, 0x3c, 0x4f, 0xfb, 0xa, 0x4d, 0xc2,
+ 0x2a, 0xf7, 0x55, 0x8a, 0x1f, 0xe, 0xfb, 0x0,
+ 0xf9, 0x6e, 0x1, 0xf7, 0x6a, 0xc2, 0x3, 0xf8,
+ 0x16, 0xf9, 0x2, 0x15, 0x56, 0x6, 0x51, 0x31,
+ 0x4e, 0xfb, 0x29, 0xfb, 0x27, 0x1a, 0x26, 0xbb,
+ 0xfb, 0x1a, 0xd1, 0xfb, 0x1, 0x1e, 0xc1, 0x6,
+ 0x4e, 0xf7, 0x7, 0x53, 0xe5, 0xf7, 0x1f, 0x1a,
+ 0xf7, 0x3a, 0xd1, 0xf7, 0x1c, 0xba, 0xdf, 0x1e,
+ 0xe, 0xfb, 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0xdf,
+ 0xc2, 0x3, 0xf7, 0x6a, 0xfb, 0x0, 0x15, 0xc0,
+ 0x6, 0xc5, 0xe5, 0xc8, 0xf7, 0x29, 0xf7, 0x27,
+ 0x1a, 0xf0, 0x5b, 0xf7, 0x1a, 0x45, 0xf7, 0x1,
+ 0x1e, 0x55, 0x6, 0xc8, 0xfb, 0x7, 0xc3, 0x31,
+ 0xfb, 0x1f, 0x1a, 0xfb, 0x3a, 0x45, 0xfb, 0x1c,
+ 0x5c, 0x37, 0x1e, 0xe, 0x7c, 0xc1, 0xf7, 0x22,
+ 0xc4, 0xf7, 0x20, 0xc1, 0xf7, 0x19, 0xc4, 0x12,
+ 0xf7, 0x1, 0xc3, 0xc3, 0xc3, 0xa9, 0xc2, 0xc4,
+ 0xc2, 0x17, 0xf0, 0xf7, 0x5d, 0x15, 0xf8, 0x35,
+ 0xf7, 0x3c, 0x78, 0xba, 0xfc, 0x36, 0xfb, 0x38,
+ 0x5, 0xf7, 0x58, 0xfb, 0x22, 0x65, 0xa, 0x64,
+ 0x6b, 0xab, 0xb2, 0x1e, 0x4b, 0xa, 0x53, 0xf8,
+ 0x13, 0x65, 0xa, 0x1e, 0x13, 0x3a, 0x64, 0x6b,
+ 0xab, 0xb2, 0x1f, 0x4b, 0xa, 0xe, 0x7c, 0xf7,
+ 0x10, 0x7a, 0xa, 0xb7, 0x15, 0x65, 0xab, 0x76,
+ 0xb1, 0xab, 0xb3, 0xa0, 0xb1, 0xb2, 0x6b, 0xa5,
+ 0x63, 0x65, 0x6b, 0x73, 0x62, 0x1e, 0xe, 0xf7,
+ 0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x72, 0xf7, 0x30,
+ 0x3, 0xf7, 0x72, 0xf7, 0x95, 0x15, 0x69, 0xaa,
+ 0x69, 0xbc, 0xb1, 0xb1, 0xa7, 0xb2, 0xaf, 0x6d,
+ 0xae, 0x5c, 0x5f, 0x68, 0x6c, 0x64, 0x1e, 0xe,
+ 0x7c, 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2,
+ 0xf7, 0x21, 0xc1, 0x12, 0xa4, 0xc3, 0x7d, 0xc3,
+ 0xf2, 0xc1, 0x7f, 0xc1, 0xa0, 0xc3, 0xf7, 0x25,
+ 0xc1, 0x13, 0xfa, 0xc0, 0xa4, 0xf8, 0x84, 0x15,
+ 0x49, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xcf,
+ 0xcd, 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x49,
+ 0x1e, 0xc3, 0x8a, 0x15, 0xb6, 0xa7, 0xa9, 0xb9,
+ 0xb8, 0xa5, 0x6a, 0x64, 0x69, 0x72, 0x68, 0x5d,
+ 0x61, 0x6b, 0xa5, 0xb5, 0x1e, 0xf7, 0x9a, 0xfc,
+ 0x15, 0x3a, 0xa, 0x13, 0xf5, 0xc0, 0xfb, 0xe0,
+ 0x8c, 0x3a, 0xa, 0x27, 0xf2, 0x15, 0x13, 0x0,
+ 0x0, 0xf8, 0x46, 0xf7, 0x47, 0x75, 0xbe, 0xfc,
+ 0x46, 0xfb, 0x47, 0x5, 0xe, 0xcc, 0x76, 0xf7,
+ 0x5a, 0xc1, 0xf7, 0x42, 0x77, 0x68, 0xa, 0xc1,
+ 0x3, 0xdb, 0xf7, 0x86, 0x15, 0xf7, 0x56, 0xfb,
+ 0x5a, 0xc1, 0xf7, 0x5a, 0xf7, 0x54, 0xc1, 0xfb,
+ 0x54, 0xf7, 0x42, 0x55, 0xfb, 0x42, 0xfb, 0x56,
+ 0x6, 0xe, 0xb7, 0xc2, 0xf7, 0x76, 0xc2, 0xf7,
+ 0x46, 0x77, 0x68, 0xa, 0xc2, 0x3, 0xf7, 0xa6,
+ 0xf7, 0x1e, 0x15, 0xc2, 0xf7, 0x4f, 0xf7, 0x4c,
+ 0xc2, 0xfb, 0x4c, 0xf7, 0x46, 0x54, 0xfb, 0x46,
+ 0xfb, 0x4f, 0x54, 0xf7, 0x4f, 0x6, 0xfb, 0x4f,
+ 0xfb, 0xad, 0x15, 0xf8, 0x3e, 0xc2, 0xfc, 0x3e,
+ 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x5c, 0xc2, 0xf7,
+ 0x68, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xab, 0xc2,
+ 0x3, 0xa4, 0x7c, 0x15, 0xf7, 0x6d, 0xc2, 0x3a,
+ 0xf7, 0x5c, 0xf7, 0x8, 0x6, 0xa2, 0x6d, 0xb5,
+ 0x4e, 0xb1, 0x4f, 0x47, 0x47, 0x18, 0xaf, 0x67,
+ 0xc7, 0xc7, 0x98, 0x74, 0x98, 0x77, 0x94, 0x7a,
+ 0x19, 0xf7, 0x18, 0xc2, 0x23, 0x6, 0x83, 0x97,
+ 0x83, 0x9a, 0x81, 0x9a, 0xd5, 0xd5, 0x18, 0x67,
+ 0xaf, 0x4a, 0x4a, 0x70, 0xb5, 0x6d, 0xb7, 0x74,
+ 0xa8, 0x19, 0xcf, 0x90, 0xe4, 0xac, 0xf7, 0xf,
+ 0x1a, 0xe1, 0x5b, 0xd4, 0xfb, 0xe, 0x1e, 0xfb,
+ 0xc0, 0x54, 0xdc, 0xfc, 0x67, 0x3a, 0x6, 0xf7,
+ 0x1c, 0xf7, 0x93, 0x15, 0xf7, 0x68, 0xf7, 0x26,
+ 0x7, 0xd1, 0xca, 0x72, 0x3a, 0xfb, 0x2, 0x24,
+ 0x8f, 0x42, 0x1f, 0xe, 0x66, 0xa, 0xba, 0xc4,
+ 0xf7, 0xf1, 0xc2, 0x13, 0xec, 0xf7, 0xbc, 0x21,
+ 0x15, 0x58, 0xf7, 0xbd, 0xbe, 0x36, 0xf8, 0x78,
+ 0xe0, 0xbe, 0xfb, 0x20, 0x4a, 0x7, 0x13, 0xdc,
+ 0xb6, 0x65, 0x4d, 0xa6, 0x33, 0x1b, 0xfb, 0xe,
+ 0x2b, 0x38, 0xfb, 0x4, 0xfb, 0x12, 0xec, 0x2e,
+ 0xf7, 0x11, 0xea, 0xc3, 0xb4, 0xaf, 0xac, 0x1f,
+ 0xfb, 0x5f, 0x7, 0x87, 0xf7, 0xe4, 0x15, 0x32,
+ 0x3e, 0x43, 0x2b, 0x2b, 0x3f, 0xd3, 0xe4, 0xe4,
+ 0xd7, 0xca, 0xeb, 0xeb, 0xd8, 0x4c, 0x32, 0x1e,
+ 0xe, 0x7c, 0xf7, 0xb, 0xf8, 0x34, 0xbf, 0x1,
+ 0xf7, 0xa, 0xc1, 0xaa, 0xf7, 0x19, 0xe7, 0xc0,
+ 0x3, 0xf7, 0x86, 0xf7, 0x44, 0x15, 0xc2, 0xcd,
+ 0x6, 0xcc, 0x8f, 0xf7, 0xb, 0xb3, 0xf7, 0xc,
+ 0x1a, 0xf7, 0x6, 0x2c, 0xbf, 0x27, 0x4f, 0x4d,
+ 0x79, 0x69, 0x5d, 0x1e, 0x27, 0xc1, 0xc9, 0x7,
+ 0xa7, 0xb0, 0xb4, 0x95, 0xb1, 0x1b, 0xd7, 0xcb,
+ 0x5c, 0x4a, 0x29, 0xfb, 0x5, 0x7c, 0x42, 0x7d,
+ 0x1f, 0x64, 0xfb, 0x81, 0x4c, 0xa, 0xfb, 0x31,
+ 0xc1, 0xf7, 0xb, 0x76, 0xf7, 0xd2, 0xf7, 0x9,
+ 0x1, 0xf7, 0xa, 0xc0, 0xe6, 0xf7, 0x1b, 0xa9,
+ 0xc1, 0x3, 0xf7, 0x9a, 0xf8, 0x9, 0x15, 0x6c,
+ 0xa5, 0x6e, 0xb4, 0xb1, 0xa9, 0xa5, 0xac, 0xa8,
+ 0x70, 0xa8, 0x61, 0x6a, 0x6a, 0x73, 0x6a, 0x1e,
+ 0xb4, 0xfb, 0x52, 0x15, 0x40, 0x77, 0xfb, 0x2,
+ 0x67, 0xfb, 0xb, 0x1a, 0x21, 0xea, 0x50, 0xf1,
+ 0xc6, 0xc7, 0x9b, 0x9c, 0xba, 0x1e, 0xf7, 0xb,
+ 0x55, 0x44, 0x7, 0x7b, 0x68, 0x63, 0x80, 0x63,
+ 0x1b, 0xfb, 0x5, 0x6f, 0xd3, 0xb0, 0xec, 0xf7,
+ 0x6, 0xa0, 0xd4, 0x98, 0x1f, 0xf7, 0x6, 0x54,
+ 0x7, 0xe, 0xf8, 0xc2, 0x77, 0x1, 0xf7, 0x58,
+ 0xca, 0xdc, 0xca, 0x3, 0xf7, 0x62, 0xf7, 0xc7,
+ 0x77, 0xa, 0xf7, 0x37, 0xfb, 0x8f, 0x77, 0xa,
+ 0xe, 0xfb, 0x1a, 0x6d, 0xa, 0xfb, 0x1a, 0x45,
+ 0xa, 0xf7, 0xdc, 0xf7, 0x7e, 0x8b, 0x77, 0x1,
+ 0xf7, 0x1c, 0xf7, 0xdc, 0x3, 0xf8, 0x29, 0xf7,
+ 0xdc, 0x15, 0xc6, 0x6, 0x46, 0xf7, 0x7e, 0x5,
+ 0x2e, 0x6, 0x4a, 0xfb, 0x7e, 0x15, 0xc8, 0x6,
+ 0x45, 0x5c, 0xa, 0xf7, 0xdc, 0x6d, 0xa, 0xf7,
+ 0xdc, 0x45, 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7,
+ 0xd6, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x44, 0x5c,
+ 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7, 0x6e, 0xf7,
+ 0xdc, 0x15, 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xfb,
+ 0x1a, 0x5f, 0xa, 0xf7, 0x6e, 0xfb, 0x1a, 0x15,
+ 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xf8, 0xc6, 0x77,
+ 0x1, 0xf7, 0x97, 0xdd, 0x3, 0xf7, 0xae, 0xf7,
+ 0xc7, 0x15, 0xae, 0x6, 0xa3, 0xf7, 0x93, 0x5,
+ 0x39, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd4, 0xc1,
+ 0x63, 0xc0, 0x12, 0xbd, 0xf7, 0x4a, 0x54, 0xc2,
+ 0x13, 0xb0, 0xbd, 0x16, 0xf8, 0xf, 0xc1, 0xfb,
+ 0x59, 0xf7, 0x51, 0x6, 0xf1, 0xf7, 0x2, 0xc2,
+ 0xb6, 0xb6, 0x1b, 0xa4, 0x9e, 0x85, 0x69, 0x92,
+ 0x1f, 0xc5, 0x90, 0x5, 0xbf, 0x88, 0x6a, 0xaf,
+ 0x54, 0x1b, 0x2c, 0x3f, 0x36, 0x57, 0x54, 0x1f,
+ 0x13, 0xd0, 0xf7, 0x10, 0xfb, 0x4a, 0x55, 0x7,
+ 0x13, 0xc8, 0xf7, 0x13, 0xfb, 0xd4, 0x6, 0x13,
+ 0xd0, 0xfb, 0x13, 0x6, 0xe, 0x79, 0xb9, 0xf8,
+ 0x7, 0xba, 0xe4, 0xb8, 0x1, 0x8b, 0xb9, 0xf7,
+ 0x2f, 0xbb, 0xf7, 0xd, 0xbe, 0xf7, 0x17, 0xbb,
+ 0x3, 0xf7, 0xaa, 0x4, 0xfb, 0x37, 0xf7, 0x1c,
+ 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x36, 0xf7, 0x1b,
+ 0xf7, 0x14, 0xf7, 0x43, 0xf7, 0x3b, 0xfb, 0x1e,
+ 0xf7, 0x14, 0xfb, 0x33, 0xfb, 0x2f, 0xfb, 0x28,
+ 0xfb, 0xc, 0xfb, 0x4a, 0x1e, 0xb9, 0x8d, 0x15,
+ 0xf7, 0x16, 0xf1, 0xf7, 0x11, 0xf7, 0x30, 0xf7,
+ 0x22, 0xf5, 0xfb, 0x8, 0xfb, 0x1d, 0xfb, 0x22,
+ 0xfb, 0x1, 0xfb, 0x4, 0xfb, 0x21, 0xfb, 0x1b,
+ 0xfb, 0xd, 0xf7, 0x2, 0xf7, 0x22, 0x1e, 0xf7,
+ 0x2f, 0xfb, 0x30, 0x15, 0xbb, 0xf7, 0xe, 0xc0,
+ 0x6, 0xd4, 0xfb, 0xe, 0x5, 0xc6, 0x6, 0x3d,
+ 0xf7, 0x1a, 0x5, 0xb1, 0x99, 0xa6, 0xba, 0xae,
+ 0x1a, 0xd1, 0x4f, 0xa1, 0x52, 0x1e, 0x24, 0x6,
+ 0xbb, 0xfb, 0x2d, 0x15, 0xf5, 0xc1, 0x7, 0xb8,
+ 0xa1, 0x71, 0x74, 0x65, 0x67, 0x78, 0x6d, 0x1f,
+ 0xe, 0xf8, 0x63, 0xbd, 0xab, 0x8b, 0xab, 0xbd,
+ 0x1, 0xf7, 0x6e, 0xbd, 0xcb, 0xbd, 0x14, 0xe0,
+ 0xf7, 0x6e, 0xf8, 0xb5, 0x15, 0x5d, 0xaf, 0x67,
+ 0xb9, 0xb9, 0xaf, 0xaf, 0xb9, 0xb9, 0x67, 0xaf,
+ 0x5d, 0x5d, 0x67, 0x67, 0x5d, 0x1e, 0xbd, 0x16,
+ 0x9d, 0x99, 0x99, 0x9d, 0x9d, 0x99, 0x7d, 0x79,
+ 0x79, 0x7d, 0x7d, 0x79, 0x79, 0x7d, 0x99, 0x9d,
+ 0x1e, 0xe, 0x7e, 0xc2, 0xf7, 0x2b, 0xc0, 0xf7,
+ 0x20, 0xc2, 0x12, 0xdf, 0xc2, 0x5a, 0xc1, 0xf7,
+ 0xba, 0xc1, 0x69, 0xc5, 0x13, 0xf4, 0xdf, 0x7f,
+ 0x15, 0xc2, 0xb8, 0x6, 0x74, 0xbc, 0xc5, 0x75,
+ 0xdb, 0x1b, 0x13, 0xea, 0xf7, 0x3, 0xda, 0xc4,
+ 0xe1, 0xf7, 0xb, 0xfb, 0x28, 0x80, 0x32, 0x92,
+ 0x1f, 0x5f, 0x8e, 0x30, 0x99, 0xc1, 0x1a, 0xc9,
+ 0xee, 0x92, 0xb6, 0xc2, 0xc2, 0x7a, 0x70, 0xb5,
+ 0x1e, 0x50, 0xc1, 0xf7, 0x32, 0x55, 0x63, 0x7,
+ 0xa6, 0x5e, 0x55, 0x98, 0x53, 0x1b, 0xfb, 0x2,
+ 0x38, 0x5c, 0x35, 0x33, 0xf7, 0xc, 0x72, 0xce,
+ 0x89, 0x1f, 0xc1, 0x89, 0xf7, 0x13, 0x85, 0x4f,
+ 0x1a, 0x45, 0x20, 0x7f, 0x66, 0x4c, 0x4b, 0x9e,
+ 0xb0, 0x5b, 0x1e, 0xc6, 0x54, 0x7, 0xe, 0x7c,
+ 0xc2, 0x8b, 0xf7, 0x27, 0x8b, 0xc1, 0x8b, 0xf7,
+ 0x2b, 0x8b, 0xc2, 0x8b, 0xb7, 0x12, 0xde, 0xc3,
+ 0xf7, 0xbd, 0xc2, 0x17, 0xf7, 0x96, 0xf8, 0x7f,
+ 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7, 0x32, 0x60,
+ 0x9f, 0xfb, 0x28, 0xfb, 0xe, 0xfb, 0x2d, 0xf7,
+ 0xd, 0x61, 0x77, 0x5, 0x76, 0xfd, 0x2b, 0x15,
+ 0xc3, 0xc2, 0x6, 0x74, 0xbd, 0xbe, 0x6b, 0xdd,
+ 0x1b, 0xf7, 0x5, 0xdc, 0xc4, 0xe2, 0xdf, 0x3f,
+ 0xa2, 0x44, 0x90, 0x1f, 0x44, 0x90, 0xfb, 0x2c,
+ 0x7b, 0xe1, 0x1a, 0xca, 0xe6, 0x98, 0xb7, 0x1e,
+ 0x13, 0xef, 0xc3, 0xc3, 0x70, 0x70, 0xb6, 0x1f,
+ 0x59, 0xc2, 0xf7, 0x33, 0x54, 0x59, 0x7, 0xa6,
+ 0x5d, 0x54, 0xa2, 0x51, 0x1b, 0xfb, 0x4, 0x41,
+ 0x56, 0x34, 0xfb, 0xa, 0xf7, 0x2a, 0x8c, 0xdd,
+ 0x88, 0x1f, 0xbc, 0x89, 0xdf, 0x91, 0x47, 0x1a,
+ 0x40, 0xfb, 0x1, 0x83, 0x65, 0x4b, 0x52, 0xa9,
+ 0xb0, 0x5a, 0x1e, 0xbc, 0x53, 0x7, 0xe, 0xfb,
+ 0x2b, 0xf7, 0x5a, 0x56, 0xc0, 0xf7, 0x22, 0xbd,
+ 0xf7, 0x29, 0xc0, 0x12, 0xde, 0xc3, 0x5a, 0xc2,
+ 0xf7, 0xb6, 0xc3, 0x6c, 0xc3, 0x13, 0x7a, 0xde,
+ 0x85, 0x15, 0xc3, 0xc0, 0x6, 0xb3, 0x78, 0xb3,
+ 0x73, 0xc4, 0x83, 0x89, 0x4a, 0x18, 0x8e, 0x92,
+ 0x95, 0x8c, 0x95, 0x1b, 0x98, 0x96, 0x84, 0x7e,
+ 0x7b, 0x7c, 0x82, 0x7a, 0x7d, 0x7d, 0x8e, 0x94,
+ 0x81, 0x1f, 0x7d, 0x68, 0x5, 0x13, 0xba, 0x7f,
+ 0x9b, 0xa0, 0x85, 0x9e, 0x1b, 0xb1, 0xae, 0xab,
+ 0xb3, 0xad, 0x73, 0x9e, 0x77, 0x8c, 0x1f, 0x13,
+ 0x75, 0x9e, 0x7, 0xf7, 0x3, 0x8c, 0xda, 0xb4,
+ 0xde, 0x1a, 0xdc, 0x4f, 0xae, 0x43, 0x8f, 0x1e,
+ 0x45, 0x90, 0xfb, 0x3d, 0x85, 0xde, 0x1a, 0xc8,
+ 0xe6, 0x91, 0xb7, 0x1e, 0x13, 0xb6, 0xc4, 0xc2,
+ 0x70, 0x70, 0xb6, 0x1f, 0x5c, 0xc3, 0xf7, 0x2e,
+ 0x53, 0x5b, 0x7, 0xa5, 0x5d, 0x55, 0xa1, 0x50,
+ 0x1b, 0xfb, 0x4, 0x41, 0x5d, 0x38, 0xfb, 0x7,
+ 0xf7, 0x2e, 0x86, 0xdd, 0x88, 0x1f, 0x13, 0xb9,
+ 0xbd, 0x89, 0xdf, 0x83, 0x48, 0x1a, 0x44, 0xfb,
+ 0x5, 0x91, 0x65, 0x4a, 0x53, 0xa7, 0xaf, 0x5a,
+ 0x1e, 0xb1, 0x53, 0x7, 0xe, 0x3e, 0xc0, 0xf8,
+ 0xa3, 0xc0, 0x1, 0xf7, 0x16, 0xc0, 0xf7, 0x74,
+ 0xc0, 0x3, 0xf7, 0x16, 0xdd, 0x15, 0xfb, 0x33,
+ 0xf7, 0x53, 0x7, 0xa5, 0xa7, 0x8c, 0x8f, 0xa0,
+ 0x1f, 0xa5, 0x91, 0xac, 0x9e, 0xb7, 0x1a, 0xa7,
+ 0x7a, 0xa7, 0x74, 0x9e, 0x1e, 0x8b, 0x7c, 0x96,
+ 0x84, 0x92, 0x1e, 0xe3, 0x9e, 0x8c, 0xc6, 0xa2,
+ 0x1a, 0x8c, 0x7, 0xad, 0x72, 0xa6, 0x71, 0x9f,
+ 0x1e, 0xfb, 0x67, 0xf7, 0x33, 0x5, 0x74, 0x9d,
+ 0x84, 0x93, 0x96, 0x1a, 0xa9, 0xae, 0x8f, 0x9f,
+ 0x1e, 0xf7, 0x36, 0x21, 0xc0, 0xf7, 0x33, 0xfb,
+ 0x47, 0x6, 0x69, 0x68, 0x8a, 0x81, 0x6e, 0x1f,
+ 0x6e, 0x82, 0x7a, 0x70, 0x6d, 0x1a, 0x6c, 0x9f,
+ 0x76, 0xa1, 0x77, 0x1e, 0x9e, 0x7a, 0x5, 0x6d,
+ 0x83, 0x59, 0x6b, 0x52, 0x1a, 0x69, 0x9e, 0x6d,
+ 0xa3, 0x79, 0x1e, 0xf7, 0x65, 0xfb, 0x32, 0x5,
+ 0xa8, 0x76, 0x8e, 0x7d, 0x80, 0x1a, 0x81, 0x86,
+ 0x76, 0x6a, 0x1e, 0xfb, 0x49, 0xf5, 0x6, 0xf7,
+ 0x3f, 0xbb, 0x15, 0xfb, 0x2c, 0xf7, 0x6, 0x5,
+ 0x7d, 0x96, 0x7a, 0x9b, 0xa0, 0x1a, 0xb0, 0xb5,
+ 0xa2, 0xa5, 0x1e, 0xf7, 0x31, 0xfb, 0x5, 0x5,
+ 0x9b, 0x7e, 0x9f, 0x7a, 0x75, 0x1a, 0x7c, 0x80,
+ 0x61, 0x48, 0x1e, 0xe, 0xa8, 0x76, 0xf7, 0x8e,
+ 0xf7, 0x15, 0x8b, 0xf7, 0xb, 0x1, 0xf7, 0x99,
+ 0xf7, 0x19, 0x3, 0xf7, 0x61, 0x93, 0x15, 0xcb,
+ 0x6, 0xf1, 0xf7, 0x8e, 0x5, 0x2b, 0x6, 0x7d,
+ 0xf7, 0x50, 0x4c, 0xa, 0xa0, 0x76, 0xf8, 0xbb,
+ 0xc3, 0x1, 0xee, 0xc3, 0x3, 0xf7, 0x8a, 0x16,
+ 0xc8, 0x6, 0xf7, 0x55, 0xf8, 0xb8, 0x5, 0xc6,
+ 0xfc, 0x25, 0xfb, 0x28, 0xc3, 0xe7, 0xf7, 0xb3,
+ 0x7, 0xe, 0x7c, 0xc6, 0xf7, 0xa9, 0xc9, 0xf7,
+ 0x4a, 0xc4, 0x1, 0xf1, 0xc5, 0xf7, 0xaa, 0xc7,
+ 0x3, 0xf7, 0x34, 0xf7, 0xbd, 0x15, 0xf7, 0x72,
+ 0xf7, 0x39, 0xb9, 0xf7, 0x37, 0x1e, 0xc4, 0x7,
+ 0xfb, 0x8d, 0xfb, 0x1d, 0x38, 0xfb, 0x9a, 0xfb,
+ 0x62, 0xe8, 0x35, 0xf7, 0x6, 0xf3, 0xe0, 0xef,
+ 0xf6, 0xee, 0x42, 0xe7, 0xfb, 0x2, 0x3d, 0x5b,
+ 0x5d, 0x63, 0x6e, 0x1f, 0x8e, 0x39, 0x15, 0xc2,
+ 0xa6, 0xbe, 0xbe, 0xcc, 0x1b, 0xd3, 0xc7, 0x56,
+ 0x3d, 0x51, 0x62, 0x33, 0x2c, 0x34, 0x5b, 0xe9,
+ 0xd8, 0x87, 0x1f, 0xe, 0x3b, 0xf9, 0x59, 0x1,
+ 0xf7, 0x11, 0xf7, 0xf2, 0x3, 0xf7, 0x11, 0x4d,
+ 0x15, 0xb3, 0x79, 0xf7, 0xca, 0xf9, 0x46, 0x63,
+ 0x9e, 0x5, 0xe, 0xe, 0x76, 0xc5, 0x70, 0xc4,
+ 0xf7, 0x64, 0xc5, 0xf7, 0x71, 0xc4, 0x12, 0xf7,
+ 0x25, 0xc1, 0x89, 0xc0, 0x13, 0xb8, 0xf7, 0xa,
+ 0xaa, 0x15, 0xa3, 0x57, 0x5, 0x13, 0x78, 0xa4,
+ 0xc3, 0xb5, 0x91, 0xad, 0x1b, 0x13, 0xb8, 0xc8,
+ 0xae, 0x6c, 0xae, 0x1b, 0xb6, 0xb2, 0x9d, 0xa6,
+ 0xaa, 0x1f, 0x76, 0xb9, 0x5, 0x7f, 0x7a, 0x6e,
+ 0x76, 0x68, 0x1b, 0x13, 0x74, 0x6e, 0x8a, 0x5f,
+ 0xa9, 0x50, 0x8c, 0x8, 0x6e, 0x69, 0x86, 0x77,
+ 0x66, 0x1f, 0x88, 0x6, 0xb6, 0xc1, 0xa3, 0xb7,
+ 0x8d, 0xb8, 0x8c, 0xa8, 0x88, 0xa8, 0x81, 0xab,
+ 0x8, 0xf7, 0x61, 0xc5, 0xfb, 0x73, 0x6, 0x13,
+ 0xb8, 0x80, 0xa3, 0x81, 0xbb, 0xa2, 0x1a, 0xdd,
+ 0xbf, 0xb7, 0xd8, 0xbe, 0xb9, 0x67, 0x5a, 0xa4,
+ 0x1e, 0xc0, 0xa9, 0x5, 0xc3, 0x70, 0x52, 0xc3,
+ 0x31, 0x1b, 0xfb, 0xb, 0x4a, 0x38, 0x2f, 0x69,
+ 0x93, 0x67, 0x9c, 0x6a, 0x1f, 0x32, 0x51, 0xf4,
+ 0x6, 0x13, 0xb4, 0x93, 0x73, 0x8e, 0x73, 0x74,
+ 0x1a, 0x48, 0x6d, 0x51, 0x5a, 0x5b, 0x1e, 0xe,
+ 0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+ 0x1, 0xf7, 0x2a, 0xc1, 0x3, 0xd9, 0xf8, 0xc,
+ 0x15, 0xd3, 0xfb, 0x98, 0x6, 0xfb, 0x5, 0xf7,
+ 0x0, 0x79, 0xbf, 0xd5, 0xd5, 0xa8, 0xa6, 0xca,
+ 0x1e, 0x85, 0xc1, 0x5, 0x77, 0x57, 0x41, 0x68,
+ 0x47, 0x1b, 0x3f, 0x62, 0x9d, 0xdd, 0x1f, 0xf7,
+ 0x80, 0xf7, 0x8c, 0xc2, 0xfb, 0x8c, 0xf7, 0x16,
+ 0x55, 0xfb, 0x16, 0x43, 0x7, 0xe, 0xfb, 0x31,
+ 0xc0, 0xf7, 0x16, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+ 0x1, 0xc0, 0x1, 0xf6, 0xc3, 0xf7, 0xfb, 0xc5,
+ 0x3, 0x9e, 0x23, 0x15, 0x56, 0xf7, 0xc5, 0xc0,
+ 0xfb, 0x35, 0xf7, 0x65, 0x7, 0x64, 0xab, 0xc6,
+ 0x63, 0xea, 0x1b, 0xf7, 0x14, 0xf2, 0xea, 0xf7,
+ 0x15, 0xf7, 0x14, 0xfb, 0x2, 0xe4, 0xfb, 0x8,
+ 0x31, 0x4b, 0x67, 0x5e, 0x66, 0x1f, 0xf7, 0x87,
+ 0xfb, 0x24, 0x56, 0xe3, 0xfd, 0x3c, 0x7, 0xc6,
+ 0xf7, 0xf4, 0x15, 0xe2, 0xd0, 0xd9, 0xf7, 0x4,
+ 0xf7, 0x1e, 0xb0, 0xfb, 0x1, 0x54, 0x21, 0x45,
+ 0x4c, 0x20, 0x2a, 0x39, 0xcf, 0xef, 0x1e, 0xe,
+ 0x7c, 0xbf, 0xf7, 0x7e, 0xc6, 0xf7, 0x7c, 0xc7,
+ 0x12, 0xf8, 0x2b, 0xc9, 0x6b, 0xc5, 0x13, 0xe8,
+ 0xf3, 0xa6, 0x15, 0x70, 0xbc, 0xcd, 0x7c, 0xca,
+ 0x1b, 0xf7, 0x2, 0xf2, 0xbb, 0xf7, 0x11, 0xf7,
+ 0x1, 0x33, 0xae, 0x65, 0x91, 0x1f, 0x13, 0xf0,
+ 0xb6, 0x9e, 0xc4, 0xc8, 0xd6, 0x1a, 0xf7, 0x3,
+ 0x31, 0xbb, 0x32, 0x4d, 0x4a, 0x70, 0x67, 0x5a,
+ 0x1e, 0xa8, 0x58, 0x5, 0xae, 0xb4, 0xc0, 0x9e,
+ 0xba, 0x1b, 0xcd, 0xc4, 0x74, 0x3d, 0x55, 0x49,
+ 0x3e, 0x30, 0x1f, 0x88, 0x50, 0x6, 0x13, 0xe8,
+ 0xd2, 0x8a, 0xf7, 0xb, 0x79, 0x2f, 0x1a, 0x35,
+ 0x42, 0x66, 0x3a, 0x53, 0x4f, 0x9c, 0xa9, 0x61,
+ 0x1e, 0xe, 0x62, 0xc2, 0x5a, 0x76, 0xf7, 0xd,
+ 0xc1, 0xf7, 0x47, 0xc2, 0xf7, 0x99, 0xbf, 0x12,
+ 0xf7, 0x44, 0xc1, 0x6a, 0xbf, 0xf7, 0x64, 0xbf,
+ 0x13, 0xbd, 0xf7, 0xca, 0xcc, 0x15, 0xf7, 0x27,
+ 0x58, 0x50, 0x54, 0xf7, 0x34, 0xc2, 0x5a, 0xbe,
+ 0xbc, 0xc1, 0x5a, 0xf7, 0x56, 0x4e, 0x6, 0xfb,
+ 0x1e, 0xfb, 0x65, 0x5, 0xce, 0x9a, 0x15, 0xdb,
+ 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7, 0xfc, 0x32,
+ 0xfb, 0x24, 0x15, 0x13, 0x7b, 0xb6, 0x6c, 0xf8,
+ 0x8e, 0xf9, 0x47, 0x60, 0xaa, 0x5, 0xfc, 0xb2,
+ 0xfb, 0xe7, 0x15, 0x7c, 0xa8, 0xbb, 0x7d, 0xb3,
+ 0x1b, 0xca, 0xc9, 0xb3, 0xce, 0xc0, 0x74, 0x9d,
+ 0x6f, 0x99, 0x1f, 0x13, 0xbd, 0xa0, 0x9d, 0x96,
+ 0x9f, 0xad, 0x1a, 0xcb, 0x5d, 0xb3, 0x4e, 0x63,
+ 0x61, 0x7b, 0x75, 0x6d, 0x1e, 0x9f, 0x57, 0x5,
+ 0xa2, 0x9b, 0xb5, 0x9a, 0xae, 0x1b, 0xa7, 0xa3,
+ 0x7b, 0x68, 0x69, 0x72, 0x74, 0x47, 0x8d, 0x1f,
+ 0x56, 0x7, 0x13, 0xbb, 0xbb, 0xcd, 0x8b, 0x59,
+ 0x68, 0x67, 0x7a, 0x63, 0x65, 0x61, 0x94, 0xa0,
+ 0x77, 0x1f, 0xe, 0xf7, 0x84, 0xc2, 0xf7, 0xa3,
+ 0xc3, 0x12, 0xf7, 0xf3, 0xc3, 0x63, 0xc5, 0x13,
+ 0xd0, 0xf7, 0x42, 0xf7, 0xa2, 0x15, 0x7c, 0xaa,
+ 0xbd, 0x7c, 0xb4, 0x1b, 0xcc, 0xcb, 0xb3, 0xd2,
+ 0xc2, 0x73, 0x9d, 0x6f, 0x99, 0x1f, 0x13, 0xe0,
+ 0xa5, 0xa2, 0x93, 0xab, 0xaa, 0x1a, 0xbe, 0x60,
+ 0xba, 0x48, 0x60, 0x5e, 0x7a, 0x73, 0x6b, 0x1e,
+ 0xa2, 0x5d, 0x5, 0xa0, 0xa4, 0xb4, 0x95, 0xa7,
+ 0x1b, 0xaa, 0xa5, 0x7b, 0x67, 0x69, 0x6f, 0x72,
+ 0x45, 0x8d, 0x1f, 0x55, 0x7, 0x13, 0xd0, 0xbd,
+ 0x8c, 0xcb, 0x88, 0x59, 0x1a, 0x63, 0x67, 0x7b,
+ 0x61, 0x66, 0x62, 0x97, 0x9f, 0x75, 0x1e, 0xe,
+ 0xf8, 0x7d, 0xbc, 0x9d, 0xbd, 0x1, 0xf0, 0xf8,
+ 0x8c, 0x15, 0xbe, 0x80, 0x5, 0x99, 0x8f, 0xa4,
+ 0xbc, 0xaf, 0x1b, 0xa9, 0x9d, 0x77, 0x79, 0xa3,
+ 0x1f, 0x7c, 0x9f, 0xa2, 0x7d, 0xb1, 0x1b, 0xc9,
+ 0xbb, 0xba, 0xc3, 0x9e, 0x1f, 0x59, 0x95, 0x82,
+ 0x72, 0x6e, 0x65, 0x62, 0x8a, 0x19, 0x73, 0x7a,
+ 0x97, 0x99, 0x7a, 0x1f, 0x9e, 0x74, 0x74, 0xa2,
+ 0x63, 0x1b, 0x58, 0x57, 0x66, 0x4a, 0x75, 0x1f,
+ 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93, 0xb7, 0x1,
+ 0xf7, 0x10, 0xb8, 0xf7, 0x3, 0xb7, 0xf7, 0x4a,
+ 0xb7, 0x3, 0xf7, 0xac, 0xf7, 0x9b, 0x15, 0xb7,
+ 0xf7, 0x98, 0x6, 0xcb, 0xfb, 0x98, 0x5, 0xc4,
+ 0x6, 0xc8, 0xf7, 0x97, 0x5, 0xfb, 0x97, 0xb7,
+ 0xf7, 0xbf, 0x39, 0x7, 0x56, 0xfb, 0x7c, 0x55,
+ 0xf7, 0x7c, 0x5, 0x3a, 0x6, 0xfb, 0x30, 0xfb,
+ 0xbf, 0x15, 0xb8, 0xf7, 0x93, 0xd7, 0xb7, 0xfb,
+ 0x58, 0x5f, 0xd6, 0x6, 0xe, 0x8b, 0xc2, 0xf8,
+ 0x1f, 0x77, 0xf7, 0x1a, 0xc5, 0x1, 0xf8, 0x4c,
+ 0xc7, 0x3, 0xee, 0x16, 0xf8, 0x25, 0xf7, 0x24,
+ 0x51, 0x32, 0xfb, 0x9d, 0x6, 0xf7, 0x6d, 0xf7,
+ 0x44, 0xf5, 0xde, 0xf7, 0x4, 0x1a, 0xf7, 0x17,
+ 0x3b, 0xcc, 0xfb, 0x1, 0x37, 0x4b, 0x66, 0x3f,
+ 0x61, 0x1e, 0x50, 0xc1, 0x7, 0xd2, 0xc4, 0xb6,
+ 0xd9, 0xdd, 0xbb, 0x5d, 0x2f, 0x3f, 0x2f, 0x3f,
+ 0x6e, 0x72, 0x1e, 0x42, 0x4c, 0x41, 0x46, 0x42,
+ 0x4d, 0x8, 0xe, 0xf7, 0x8d, 0xc2, 0xf7, 0x9c,
+ 0xc1, 0x1, 0xf7, 0x53, 0xbf, 0xf7, 0x14, 0xbf,
+ 0x3, 0xf7, 0x44, 0xf7, 0x8d, 0x15, 0xf7, 0x8b,
+ 0xc2, 0xfb, 0x38, 0x6, 0xf7, 0x9, 0xe8, 0xba,
+ 0xb3, 0xd3, 0x1a, 0xc5, 0x64, 0xc2, 0x3b, 0x60,
+ 0x5c, 0x80, 0x4a, 0x74, 0x1e, 0x55, 0xbf, 0x7,
+ 0xc3, 0x83, 0xb0, 0x9f, 0xab, 0x1b, 0xb5, 0xa4,
+ 0x6b, 0x68, 0x55, 0xfb, 0x1f, 0x26, 0x53, 0x5e,
+ 0x1f, 0xe, 0x7c, 0xc0, 0x62, 0xc1, 0xf7, 0xd5,
+ 0xc1, 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa2, 0xc0,
+ 0x13, 0xb8, 0xa8, 0xf8, 0x8, 0x15, 0xde, 0xfb,
+ 0x8b, 0x6, 0x31, 0xcf, 0x59, 0xe3, 0xb2, 0xbf,
+ 0x9b, 0xd3, 0xd7, 0x1e, 0x13, 0x78, 0x3f, 0xf7,
+ 0x1b, 0xc1, 0x39, 0xf8, 0xb, 0xfb, 0x1c, 0x55,
+ 0xde, 0xfb, 0x71, 0x7, 0x13, 0xb8, 0x5a, 0x62,
+ 0x54, 0x4b, 0x4f, 0x1b, 0x42, 0x62, 0xb5, 0xd3,
+ 0x1f, 0xf7, 0xa6, 0xfb, 0x1c, 0x7, 0xe, 0x3f,
+ 0xa, 0xf7, 0x41, 0xf8, 0x82, 0x15, 0xf7, 0xb3,
+ 0xf3, 0x6a, 0xd5, 0xfb, 0x9e, 0xfb, 0x26, 0x5,
+ 0xfb, 0x18, 0xfb, 0x25, 0x2b, 0xa, 0x3f, 0xa,
+ 0xf7, 0x0, 0xf8, 0x8f, 0x15, 0xb3, 0x79, 0xf7,
+ 0x27, 0xf7, 0xb, 0xf7, 0x26, 0xfb, 0xb, 0xb4,
+ 0x9d, 0xfb, 0x27, 0xf7, 0x31, 0x5, 0x3c, 0x6,
+ 0xfb, 0x77, 0xfb, 0xaf, 0x2b, 0xa, 0x7c, 0xc1,
+ 0x61, 0x67, 0xa, 0xe7, 0xf7, 0x9, 0x12, 0xf7,
+ 0x4, 0xc0, 0x94, 0xe0, 0xca, 0xdc, 0xaa, 0xc0,
+ 0x13, 0xbf, 0xf7, 0xd6, 0xf8, 0xa4, 0x72, 0xa,
+ 0xfb, 0x28, 0xfb, 0x9, 0x15, 0xe0, 0xf7, 0x9,
+ 0x36, 0x6, 0xfb, 0x25, 0xfb, 0x9c, 0x38, 0xa,
+ 0x13, 0x7f, 0x3b, 0xa, 0x13, 0xbf, 0x33, 0xa,
+ 0x3f, 0xa, 0xf7, 0x2c, 0xf8, 0xe8, 0x15, 0xf7,
+ 0xb3, 0x24, 0x96, 0xaa, 0xfb, 0x9c, 0xf7, 0x28,
+ 0x5, 0xfb, 0x31, 0xfb, 0xb7, 0x2b, 0xa, 0xfb,
+ 0x11, 0xbd, 0x1, 0x8b, 0xf8, 0xec, 0x3, 0x40,
+ 0x4, 0x59, 0xf8, 0xec, 0xbd, 0x7, 0xe, 0x96,
+ 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x9a, 0xf7, 0x68,
+ 0xf7, 0x25, 0xf7, 0x69, 0x3, 0xf7, 0x9e, 0x81,
+ 0x15, 0xcc, 0x6, 0xf7, 0x45, 0xf8, 0x11, 0x5,
+ 0xd8, 0xc2, 0xfb, 0x69, 0x54, 0xd5, 0x6, 0xfb,
+ 0x27, 0xfb, 0xd1, 0xfb, 0x28, 0xf7, 0xd1, 0x5,
+ 0xd7, 0xc2, 0xfb, 0x68, 0x54, 0xd4, 0x6, 0xe,
+ 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x98, 0xf7,
+ 0x39, 0xf7, 0x8c, 0xf7, 0x34, 0x3, 0xf7, 0x31,
+ 0x81, 0x15, 0xca, 0x6, 0xdc, 0xf7, 0x9b, 0xdb,
+ 0xfb, 0x9b, 0x5, 0xc9, 0x6, 0xf6, 0xf8, 0x11,
+ 0x5, 0xaf, 0xc2, 0xfb, 0x34, 0x54, 0xce, 0x6,
+ 0x39, 0xfb, 0xc4, 0x34, 0xf7, 0xb0, 0x5, 0x5c,
+ 0x6, 0x35, 0xfb, 0xae, 0x33, 0xf7, 0xc2, 0x5,
+ 0xd6, 0xc2, 0xfb, 0x39, 0x54, 0xad, 0x6, 0xe,
+ 0x74, 0xa, 0xb0, 0xf7, 0x5b, 0xf7, 0x18, 0xf7,
+ 0x50, 0x3, 0x9f, 0x16, 0xf7, 0x6d, 0xc1, 0x43,
+ 0x6, 0xf7, 0x1a, 0xf7, 0x1b, 0xf7, 0x1a, 0xfb,
+ 0x1b, 0x5, 0x43, 0x55, 0xf7, 0x6f, 0xc1, 0x3f,
+ 0x6, 0xfb, 0x40, 0xf7, 0x3e, 0xf7, 0x28, 0xf7,
+ 0x28, 0x5, 0xd7, 0xc1, 0xfb, 0x50, 0x55, 0xb6,
+ 0x6, 0xfb, 0x5, 0xfb, 0x5, 0xfb, 0x4, 0xf7,
+ 0x5, 0x5, 0xbd, 0xc1, 0xfb, 0x5b, 0x55, 0xdb,
+ 0x6, 0xf7, 0x28, 0xfb, 0x27, 0xfb, 0x40, 0xfb,
+ 0x3f, 0x5, 0x42, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+ 0xf8, 0x75, 0xbe, 0x6a, 0xa, 0x13, 0xe8, 0x13,
+ 0xd8, 0xc0, 0x21, 0x15, 0x58, 0xf7, 0x9a, 0xbe,
+ 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x75, 0x5, 0xcc,
+ 0xbe, 0xfb, 0x4b, 0x58, 0xc4, 0x6, 0xfb, 0x3d,
+ 0xfb, 0xa1, 0xfb, 0x34, 0xf7, 0xa1, 0x5, 0xcd,
+ 0xbe, 0xfb, 0x58, 0x58, 0xd0, 0x6, 0xf7, 0x53,
+ 0xfb, 0xd3, 0x25, 0xfb, 0x36, 0x5, 0xe, 0xfb,
+ 0x31, 0xc0, 0xf8, 0x87, 0xc0, 0x6a, 0xa, 0x13,
+ 0xd8, 0xf7, 0x3e, 0xf8, 0x89, 0x15, 0xf7, 0xbc,
+ 0xee, 0x69, 0xd3, 0xfb, 0xa6, 0xfb, 0x21, 0x5,
+ 0x22, 0xfd, 0xf, 0x15, 0x56, 0xf7, 0x9a, 0xc0,
+ 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x87, 0x5, 0xcc,
+ 0xc0, 0xfb, 0x4b, 0x56, 0xc4, 0x6, 0xfb, 0x3c,
+ 0xfb, 0xab, 0xfb, 0x35, 0xf7, 0xab, 0x5, 0x13,
+ 0xe8, 0xcd, 0xc0, 0xfb, 0x58, 0x56, 0xd0, 0x6,
+ 0xf7, 0x54, 0xfb, 0xe0, 0x24, 0xfb, 0x3b, 0x5,
+ 0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x66, 0xbc, 0xd6,
+ 0xf7, 0x4, 0x12, 0x92, 0xf7, 0x58, 0x6b, 0xe2,
+ 0xce, 0xe0, 0x8a, 0xf7, 0x4b, 0x13, 0xec, 0xf7,
+ 0xd9, 0xf8, 0x77, 0x15, 0xe0, 0xf7, 0x4, 0x36,
+ 0x80, 0xa, 0x15, 0xe2, 0xf7, 0x4, 0x34, 0x6,
+ 0x13, 0xd2, 0xfb, 0xa, 0xfd, 0x52, 0x15, 0x59,
+ 0xf7, 0x9a, 0xbd, 0x32, 0x7, 0xf7, 0xc1, 0xf8,
+ 0x66, 0x5, 0xcc, 0xbc, 0xfb, 0x4b, 0x5a, 0xc4,
+ 0x6, 0xfb, 0x3c, 0xfb, 0x99, 0xfb, 0x35, 0xf7,
+ 0x99, 0x5, 0xcd, 0xbc, 0xfb, 0x58, 0x5a, 0xd0,
+ 0x6, 0xf7, 0x54, 0xfb, 0xc9, 0x24, 0xfb, 0x31,
+ 0x5, 0xe, 0x8b, 0xc1, 0xd8, 0xc1, 0xd1, 0xc2,
+ 0xf7, 0x5a, 0xc1, 0x1, 0xa5, 0xf7, 0x60, 0xb9,
+ 0xc1, 0xb4, 0xf7, 0x5f, 0x3, 0xf7, 0x3c, 0x16,
+ 0xf7, 0xa1, 0xc1, 0x20, 0xd8, 0xf7, 0x15, 0xc1,
+ 0xfb, 0x15, 0xd1, 0xf7, 0x15, 0xc2, 0xfb, 0xd,
+ 0x6, 0xf7, 0x47, 0xf7, 0x5a, 0x5, 0xc4, 0xc1,
+ 0xfb, 0x5f, 0x55, 0xce, 0x6, 0xfb, 0x1d, 0xfb,
+ 0x2b, 0xfb, 0x1d, 0xf7, 0x2b, 0x5, 0xcd, 0xc1,
+ 0xfb, 0x60, 0x55, 0xca, 0x6, 0xf7, 0x43, 0xfb,
+ 0x5a, 0x5, 0xfb, 0x9, 0x54, 0xf7, 0x15, 0x45,
+ 0xfb, 0x15, 0x55, 0xf7, 0x15, 0x3e, 0xfb, 0x0,
+ 0x6, 0xe, 0x74, 0xa, 0xf7, 0x4, 0xc1, 0xf7,
+ 0xad, 0xc1, 0x3, 0xed, 0x16, 0xf8, 0x27, 0xf7,
+ 0x2e, 0x55, 0x27, 0xfb, 0xa3, 0x6, 0xf7, 0xd9,
+ 0xf7, 0xd6, 0x5, 0xbd, 0xfc, 0x19, 0xfb, 0x2b,
+ 0xc1, 0xec, 0xf7, 0x94, 0x7, 0xfb, 0xd8, 0xfb,
+ 0xd5, 0x5, 0xe, 0x8b, 0x67, 0xa, 0xbf, 0xc4,
+ 0x1, 0xf7, 0x3, 0xc1, 0xf7, 0xad, 0xc2, 0x3,
+ 0xf7, 0x9e, 0xf8, 0x7f, 0x15, 0xda, 0x6, 0xf7,
+ 0x27, 0xf7, 0x32, 0x62, 0x9f, 0xfb, 0x26, 0xfb,
+ 0xd, 0xfb, 0x28, 0xf7, 0xc, 0x62, 0x77, 0x5,
+ 0x79, 0xfd, 0x1c, 0x15, 0xf8, 0x27, 0xf7, 0x31,
+ 0x54, 0x25, 0xfb, 0xa3, 0x6, 0xf7, 0xda, 0xf7,
+ 0xdd, 0x5, 0xc2, 0xfc, 0x1a, 0xfb, 0x32, 0xc1,
+ 0x7, 0x8c, 0xf2, 0x5, 0xf7, 0x98, 0x6, 0xfb,
+ 0xdc, 0xfb, 0xe0, 0x5, 0xe, 0x7d, 0xc1, 0xf8,
+ 0xa3, 0xc2, 0x1, 0xf5, 0xc4, 0xf7, 0xa5, 0xc5,
+ 0x3, 0xf5, 0xf7, 0xc4, 0x15, 0xfb, 0x29, 0xa2,
+ 0xfb, 0x3d, 0xf7, 0x40, 0xf7, 0x45, 0x9b, 0xf7,
+ 0x40, 0xf7, 0x26, 0xf7, 0x1b, 0x78, 0xf7, 0x4b,
+ 0xfb, 0x41, 0xfb, 0x41, 0x74, 0xfb, 0x49, 0xfb,
+ 0x1d, 0x1e, 0xc4, 0x16, 0xf7, 0xf, 0x9e, 0xf7,
+ 0x20, 0xf7, 0xc, 0xf7, 0x3, 0xa2, 0xfb, 0x1f,
+ 0xfb, 0x10, 0xfb, 0x17, 0x78, 0xfb, 0x19, 0xfb,
+ 0xa, 0xfb, 0x6, 0x75, 0xf7, 0x17, 0xf7, 0x19,
+ 0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x3e, 0x9a, 0xf7,
+ 0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, 0x31, 0x8b,
+ 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9,
+ 0xc2, 0xa, 0xc2, 0xb, 0xf8, 0xec, 0x14, 0xaa,
+ 0x13, 0x0, 0x63, 0x2, 0x0, 0x1, 0x0, 0x3d,
+ 0x0, 0x70, 0x0, 0xae, 0x0, 0xb8, 0x0, 0xbd,
+ 0x0, 0xc2, 0x0, 0xc8, 0x0, 0xe5, 0x0, 0xff,
+ 0x1, 0x18, 0x1, 0x2e, 0x1, 0x38, 0x1, 0x42,
+ 0x1, 0x55, 0x1, 0x71, 0x1, 0x76, 0x1, 0x80,
+ 0x1, 0x9a, 0x1, 0xa9, 0x1, 0xba, 0x1, 0xc6,
+ 0x1, 0xd8, 0x2, 0x7, 0x2, 0x1c, 0x2, 0x2c,
+ 0x2, 0x33, 0x2, 0x5a, 0x2, 0x69, 0x2, 0x73,
+ 0x2, 0x7d, 0x2, 0x88, 0x2, 0x97, 0x2, 0xa3,
+ 0x2, 0xae, 0x2, 0xb7, 0x2, 0xcf, 0x2, 0xe7,
+ 0x2, 0xfd, 0x3, 0x4, 0x3, 0xe, 0x3, 0x24,
+ 0x3, 0x3a, 0x3, 0x4e, 0x3, 0x63, 0x3, 0x76,
+ 0x3, 0x7f, 0x3, 0x88, 0x3, 0x91, 0x3, 0xa5,
+ 0x3, 0xb7, 0x3, 0xc9, 0x3, 0xdb, 0x3, 0xe3,
+ 0x3, 0xeb, 0x3, 0xf3, 0x3, 0xfb, 0x4, 0x3,
+ 0x4, 0xe, 0x4, 0x13, 0x4, 0x1e, 0x4, 0x24,
+ 0x4, 0x31, 0x4, 0x38, 0x4, 0x41, 0x4, 0x4a,
+ 0x4, 0x53, 0x4, 0x5a, 0x4, 0x60, 0x4, 0x66,
+ 0x4, 0x74, 0x4, 0x81, 0x4, 0x86, 0x4, 0x8a,
+ 0x4, 0x96, 0x4, 0xa2, 0x4, 0xa8, 0x4, 0xae,
+ 0x4, 0xb9, 0x4, 0xc4, 0x4, 0xce, 0x4, 0xd9,
+ 0x4, 0xe4, 0x4, 0xeb, 0x4, 0xf2, 0x4, 0xf9,
+ 0x5, 0x0, 0x5, 0x7, 0x5, 0x11, 0x5, 0x1b,
+ 0x5, 0x24, 0x5, 0x2d, 0x5, 0x36, 0x5, 0x3f,
+ 0x5, 0x48, 0x5, 0x51, 0x5, 0x58, 0x5, 0x5e,
+ 0x5, 0x64, 0x5, 0x69, 0x15, 0xfb, 0x37, 0xf3,
+ 0xfb, 0x1a, 0xf7, 0x30, 0xf7, 0x34, 0xe9, 0xf7,
+ 0x1a, 0xf7, 0x37, 0xe9, 0x5a, 0xf7, 0x5f, 0xfb,
+ 0x60, 0xfb, 0x43, 0x35, 0xfb, 0x31, 0xfb, 0x20,
+ 0x1e, 0xc1, 0x89, 0x15, 0xe4, 0xc1, 0xf7, 0x31,
+ 0xf7, 0x2b, 0xf7, 0x2c, 0xba, 0xfb, 0x3d, 0x3e,
+ 0xfb, 0x13, 0x47, 0xfb, 0x7, 0xfb, 0x15, 0xfb,
+ 0x15, 0x3d, 0xf7, 0x7, 0xf7, 0x13, 0x1e, 0xb,
+ 0x15, 0xfb, 0x1b, 0xe2, 0x2b, 0xf7, 0x2a, 0xf7,
+ 0x25, 0xe9, 0xed, 0xf7, 0x19, 0xf7, 0x20, 0x2f,
+ 0xe7, 0xfb, 0x25, 0xfb, 0x1b, 0x23, 0x33, 0xfb,
+ 0x24, 0x1e, 0xc5, 0x8a, 0x15, 0xe9, 0xc9, 0xdd,
+ 0xf7, 0xb, 0xf7, 0xe, 0xc2, 0x38, 0x2e, 0x39,
+ 0x4b, 0x2f, 0xfb, 0x8, 0xfb, 0xa, 0x4f, 0xe7,
+ 0xdd, 0x1e, 0xe, 0x15, 0xf8, 0x36, 0x6, 0xf7,
+ 0x14, 0x45, 0xf7, 0xe, 0xfb, 0x3b, 0xfb, 0x1c,
+ 0x24, 0x24, 0xfb, 0x1f, 0xfb, 0xc, 0xd1, 0x25,
+ 0xf7, 0x47, 0xdd, 0xe0, 0xa6, 0xb0, 0xcd, 0x1e,
+ 0x7a, 0xc0, 0x5, 0x5f, 0x3b, 0x3c, 0x79, 0x5b,
+ 0x1b, 0x2a, 0x24, 0xb8, 0xf7, 0x6, 0x1f, 0x8d,
+ 0xc3, 0x15, 0xc7, 0x93, 0xc2, 0xd9, 0xf7, 0x8,
+ 0x1b, 0xf7, 0x19, 0xa9, 0x2e, 0x5e, 0x96, 0x1f,
+ 0xe, 0x26, 0xa, 0x13, 0x7c, 0x29, 0xa, 0x13,
+ 0xbc, 0x2a, 0xa, 0x25, 0xa, 0x3c, 0xa, 0xb,
+ 0x2d, 0xa, 0x27, 0xa, 0xb, 0x28, 0xa, 0x3d,
+ 0xa, 0x1f, 0xb, 0xf7, 0x60, 0xc1, 0x57, 0x6,
+ 0xfb, 0x60, 0xf8, 0x93, 0x5, 0xfb, 0x82, 0x55,
+ 0xf7, 0x20, 0x6, 0xfb, 0x48, 0xfc, 0x5d, 0x5,
+ 0x4f, 0x6, 0xf7, 0x4e, 0xf7, 0x45, 0x15, 0xb,
+ 0x15, 0x9a, 0xab, 0xe0, 0xa7, 0xd1, 0x1b, 0xd7,
+ 0xc3, 0x8b, 0x21, 0x1f, 0x6b, 0x7, 0x92, 0x5e,
+ 0x59, 0x92, 0x59, 0x1b, 0xfb, 0x3c, 0x55, 0x33,
+ 0x50, 0xb, 0x36, 0xf7, 0x1e, 0xc3, 0x38, 0xf7,
+ 0x88, 0x7, 0xeb, 0x59, 0xc3, 0xfb, 0x14, 0x45,
+ 0x3a, 0x77, 0x73, 0x4f, 0x1e, 0xf7, 0xe1, 0xfb,
+ 0x94, 0x15, 0xb, 0x4e, 0x58, 0x46, 0x5c, 0x38,
+ 0x1b, 0x4c, 0x60, 0xb4, 0xb2, 0xe1, 0xf7, 0x6,
+ 0x91, 0xcb, 0xb8, 0xb6, 0x85, 0x83, 0xb6, 0x1f,
+ 0xe, 0x38, 0xa, 0x13, 0x78, 0x3b, 0xa, 0x13,
+ 0xb8, 0x33, 0xa, 0x26, 0xa, 0x13, 0x7f, 0x29,
+ 0xa, 0x13, 0xbf, 0x2a, 0xa, 0xf7, 0x63, 0xc1,
+ 0x32, 0x6, 0xb9, 0xf7, 0xf, 0x5, 0xf7, 0xa6,
+ 0x6, 0xba, 0xfb, 0xf, 0x5, 0x2c, 0x55, 0xb,
+ 0xf7, 0x38, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+ 0xfb, 0x38, 0xf7, 0x5e, 0xf7, 0xc2, 0xfb, 0x1b,
+ 0xc4, 0xf7, 0x51, 0xfc, 0x85, 0x55, 0xde, 0xfc,
+ 0x5d, 0x38, 0x6, 0xb, 0x40, 0xa, 0x2e, 0xa,
+ 0xb, 0xf7, 0x19, 0x31, 0xa, 0xb7, 0xf7, 0x14,
+ 0x4f, 0xa, 0xb, 0xf7, 0x11, 0xd9, 0xd6, 0xf7,
+ 0x27, 0x1e, 0xf7, 0xc4, 0xd8, 0xc2, 0xfb, 0x7c,
+ 0x54, 0xf2, 0xfb, 0xc3, 0x7, 0xfb, 0xe, 0x42,
+ 0x5d, 0x3c, 0x31, 0x4b, 0xb, 0xf8, 0x2c, 0xc1,
+ 0xfb, 0x43, 0xf8, 0x5c, 0x42, 0xa, 0xfc, 0x5c,
+ 0xfb, 0x43, 0x6, 0xb, 0x58, 0x63, 0x57, 0x54,
+ 0x4b, 0x1b, 0x42, 0x63, 0xb6, 0xd5, 0x1f, 0xf7,
+ 0xac, 0xfb, 0x1c, 0x7, 0xe, 0x15, 0xda, 0xfb,
+ 0xc1, 0x6, 0xfb, 0x1a, 0xd5, 0x30, 0x30, 0xa,
+ 0xb, 0xf8, 0x2e, 0xc2, 0xfb, 0x43, 0xf8, 0x12,
+ 0xfb, 0x5c, 0x54, 0xf7, 0x24, 0xfb, 0xdb, 0xfb,
+ 0x47, 0x6, 0xb, 0xf7, 0xc8, 0xc1, 0xfb, 0x11,
+ 0xf7, 0x43, 0x6, 0xf7, 0x45, 0xf7, 0xae, 0x5,
+ 0xd0, 0xc1, 0xfb, 0x5c, 0x55, 0xd1, 0x6, 0xfb,
+ 0x25, 0xfb, 0x78, 0xfb, 0x27, 0xf7, 0x78, 0x5,
+ 0xd2, 0xc1, 0xfb, 0x5d, 0x55, 0xcf, 0x6, 0xf7,
+ 0x49, 0xfb, 0xae, 0x5, 0xfb, 0x43, 0xfb, 0x12,
+ 0x7, 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7,
+ 0x34, 0x60, 0x9d, 0xfb, 0x27, 0xfb, 0xd, 0xfb,
+ 0x2c, 0xf7, 0xd, 0x62, 0x78, 0x5, 0xe, 0x15,
+ 0xde, 0xfb, 0x90, 0x6, 0x2e, 0xcf, 0x58, 0xe2,
+ 0xb3, 0xbe, 0x9b, 0xd5, 0xd7, 0x1e, 0xb, 0x27,
+ 0xa, 0x13, 0x40, 0x3c, 0xa, 0xb, 0x15, 0x48,
+ 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xd0, 0xcc,
+ 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x4a, 0x1e,
+ 0xc3, 0x8a, 0x15, 0xb5, 0xa6, 0xa9, 0xb9, 0xb8,
+ 0xa6, 0x6a, 0x65, 0x68, 0x71, 0x68, 0x5d, 0x61,
+ 0x6c, 0xa5, 0xb6, 0x1e, 0xb, 0x3d, 0xf7, 0x1c,
+ 0xc2, 0x38, 0xf8, 0x14, 0xfb, 0x1c, 0x54, 0xde,
+ 0xfb, 0x80, 0x7, 0xb, 0xf7, 0x3, 0xf7, 0xbb,
+ 0xf7, 0xb, 0xfb, 0xbb, 0x5, 0xb, 0x49, 0xc5,
+ 0x44, 0xf4, 0xd9, 0xd2, 0xb7, 0xc0, 0xc3, 0xb,
+ 0x41, 0xa, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+ 0x13, 0xbc, 0xb, 0x7c, 0xc1, 0x61, 0x67, 0xa,
+ 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa1, 0xc0, 0x13,
+ 0xb8, 0xb, 0xf8, 0x85, 0xf7, 0x51, 0x53, 0xfb,
+ 0x1b, 0xfb, 0xc3, 0xf7, 0x5d, 0xb, 0x7c, 0xc3,
+ 0x5f, 0xc3, 0xf7, 0x34, 0xc3, 0xf7, 0x10, 0xc3,
+ 0xb, 0xf7, 0x3e, 0xc1, 0xfc, 0x24, 0x55, 0xf7,
+ 0x40, 0xb, 0xd1, 0xee, 0xcf, 0xc8, 0x67, 0x5b,
+ 0xb7, 0x1f, 0x40, 0xc2, 0xf7, 0x6a, 0x54, 0x49,
+ 0x7, 0xae, 0x65, 0x4f, 0xaa, 0x40, 0x1b, 0xfb,
+ 0x37, 0xb, 0x3c, 0x1b, 0xfb, 0x2a, 0x3d, 0x22,
+ 0x32, 0x30, 0xd3, 0x28, 0xf7, 0x2f, 0xcc, 0xd5,
+ 0xa1, 0xba, 0xb3, 0x1f, 0xfb, 0x9, 0x7, 0x33,
+ 0x51, 0xb, 0x15, 0xc3, 0x6, 0xef, 0xf7, 0x7e,
+ 0x5, 0x31, 0x6, 0xe7, 0xfb, 0x7e, 0x15, 0xc6,
+ 0x6, 0xec, 0xf7, 0x7e, 0x5, 0x32, 0x6, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x58, 0xc2, 0x1, 0xb, 0x4e,
+ 0xa, 0xf7, 0x78, 0x77, 0x1, 0x61, 0xa, 0x3,
+ 0xb, 0x15, 0xf7, 0x9f, 0xc0, 0x21, 0xf7, 0xd5,
+ 0xf5, 0xc0, 0x21, 0xcd, 0x6, 0xdb, 0xce, 0x9e,
+ 0xde, 0x74, 0x1e, 0x94, 0xbe, 0x5, 0xb, 0x15,
+ 0xf7, 0x27, 0xe9, 0xf7, 0x24, 0x2d, 0xb4, 0x9c,
+ 0xfb, 0x26, 0xf7, 0x19, 0x5, 0x3b, 0x6, 0xfb,
+ 0x27, 0xfb, 0x19, 0x5, 0xb, 0x92, 0x72, 0x71,
+ 0x8f, 0x74, 0x1b, 0x3c, 0x4e, 0x62, 0x30, 0x1f,
+ 0x43, 0x21, 0x56, 0xf5, 0xfb, 0xd5, 0x21, 0x7,
+ 0xe, 0x53, 0x8c, 0x15, 0x46, 0xc4, 0x52, 0xd0,
+ 0xd0, 0xc5, 0xc4, 0xd0, 0xd0, 0x51, 0xc5, 0x46,
+ 0x46, 0x52, 0x51, 0x46, 0x1e, 0xb, 0x15, 0x6d,
+ 0xa6, 0x6e, 0xb5, 0xab, 0xab, 0xa3, 0xad, 0xaa,
+ 0x72, 0xa9, 0x63, 0x65, 0x6d, 0x70, 0x6a, 0x1e,
+ 0xe, 0x8b, 0xc1, 0xf7, 0xf, 0xc1, 0xf7, 0xac,
+ 0xc1, 0xb, 0x8b, 0xc1, 0xf7, 0x5d, 0xc1, 0xf7,
+ 0x5e, 0xc1, 0xb, 0x1e, 0xf7, 0xbf, 0xf5, 0xc2,
+ 0xfb, 0x81, 0x7, 0xb, 0x5, 0x80, 0xbf, 0xe8,
+ 0x7a, 0xdd, 0x1b, 0xf7, 0xe, 0xd8, 0xc0, 0xf0,
+ 0x1f, 0xf8, 0x11, 0xc9, 0xbe, 0xfb, 0x7, 0xb,
+ 0x6e, 0xa2, 0x74, 0xa8, 0xa8, 0xa2, 0xa2, 0xa8,
+ 0xa8, 0x74, 0xa2, 0x6e, 0x6e, 0x74, 0x74, 0x6e,
+ 0x1e, 0xb, 0x64, 0xab, 0x75, 0xb2, 0xb2, 0xab,
+ 0xa1, 0xb2, 0xb2, 0x6b, 0xa1, 0x64, 0x64, 0x6b,
+ 0x75, 0x64, 0x1e, 0xb, 0xfb, 0x31, 0xf7, 0x60,
+ 0xd4, 0xd4, 0xa0, 0xa5, 0xca, 0x1f, 0xf7, 0x41,
+ 0xbd, 0xc2, 0xfb, 0x9f, 0x7, 0xb, 0x8e, 0xf7,
+ 0x63, 0xf7, 0x4b, 0xf7, 0x60, 0xb, 0x1, 0xeb,
+ 0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0xb, 0x1, 0xc6,
+ 0xc5, 0xf7, 0xf7, 0xca, 0x3, 0xb, 0x1, 0xb6,
+ 0xc1, 0xf8, 0x28, 0xc3, 0x3, 0xb, 0x1, 0xc9,
+ 0xc5, 0xf7, 0xfa, 0xc7, 0x3, 0xb, 0x15, 0xe0,
+ 0xf7, 0x7, 0x36, 0x6, 0xfb, 0x2b, 0x60, 0xa,
+ 0xb, 0x5e, 0xa, 0x56, 0xa, 0xb, 0x55, 0xa,
+ 0x9c, 0xf8, 0x90, 0x15, 0xda, 0xfb, 0xc1, 0x6,
+ 0xb, 0xf7, 0x7e, 0x5, 0x2f, 0x6, 0xe, 0x6,
+ 0xf7, 0x30, 0xf7, 0xf, 0x6f, 0xb0, 0xfb, 0x79,
+ 0xfb, 0x4d, 0x5, 0xe, 0x7c, 0x82, 0xa, 0xf7,
+ 0x1e, 0xc3, 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x6e,
+ 0xf7, 0x37, 0x3, 0xb, 0xfb, 0x7, 0x15, 0xe2,
+ 0xf7, 0x7, 0x34, 0x6, 0xb, 0xf7, 0x1a, 0xc2,
+ 0xf7, 0x38, 0xc4, 0xdd, 0xc3, 0xb, 0x15, 0xde,
+ 0xf7, 0x9, 0x38, 0x6, 0xb, 0x7c, 0xc3, 0xf7,
+ 0xf2, 0xc4, 0xb, 0x79, 0xc0, 0xf8, 0x7c, 0xc0,
+ 0xb, 0x15, 0xb2, 0xab, 0xab, 0xb2, 0xb2, 0xab,
+ 0x6b, 0x64, 0x64, 0x6b, 0x6b, 0x64, 0xb, 0xfb,
+ 0x31, 0xbe, 0xf7, 0x12, 0xbc, 0xf7, 0xc9, 0xbe,
+ 0x5c, 0xbf, 0x12, 0xb, 0xc2, 0xf7, 0xdd, 0xc2,
+ 0xb, 0x1, 0xf7, 0xa6, 0xb, 0x32, 0x58, 0x3a,
+ 0x3e, 0x50, 0x29, 0x27, 0x40, 0xc9, 0xd7, 0x1e,
+ 0xb, 0x12, 0x92, 0xf7, 0x58, 0xfb, 0x2a, 0xf7,
+ 0x9a, 0xe9, 0xf7, 0x4b, 0xb, 0x79, 0xc2, 0xf8,
+ 0x6b, 0xc2, 0xb, 0x8b, 0xc1, 0xf8, 0x5c, 0xc1,
+ 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x23, 0xf7, 0xce,
+ 0x3, 0xf7, 0x23, 0xb, 0xf8, 0x85, 0xf7, 0x43,
+ 0x1, 0xf7, 0x4e, 0xf7, 0x77, 0x3, 0xb, 0x8b,
+ 0xc2, 0xf7, 0xdb, 0xc2, 0x68, 0xa, 0xc3, 0x3,
+ 0xb, 0xf7, 0x7, 0x15, 0xa7, 0xb8, 0xfb, 0x2e,
+ 0xf7, 0x4, 0x5, 0xb, 0x15, 0xa7, 0x73, 0xf7,
+ 0x3e, 0xf7, 0x10, 0x5f, 0xbe, 0x5, 0xb, 0x15,
+ 0xdc, 0xf7, 0x9, 0x3a, 0x6, 0xb, 0xc2, 0x3,
+ 0xea, 0x16, 0xf8, 0x2e, 0xb, 0x8b, 0xc1, 0xf7,
+ 0xd2, 0xc1, 0x1, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+ 0xc1, 0x1, 0xb, 0x15, 0xe5, 0xf7, 0x8, 0x31,
+ 0x6, 0xb, 0x15, 0xb7, 0x6, 0x9d, 0xf7, 0x8f,
+ 0x5, 0x3a, 0x6, 0xb, 0xf7, 0x4d, 0x6f, 0x66,
+ 0xf7, 0x30, 0xfb, 0xf, 0x5, 0xb, 0x15, 0xf7,
+ 0xac, 0x26, 0x96, 0xa9, 0xfb, 0x96, 0xb, 0x1,
+ 0xf7, 0x79, 0xf7, 0x22, 0x3, 0xf7, 0x79, 0xb,
+ 0xd1, 0xf8, 0xc, 0x1, 0xe7, 0xf8, 0x34, 0x3,
+ 0xb, 0xf7, 0x5e, 0x15, 0xf7, 0x36, 0xfb, 0x17,
+ 0x6, 0xb, 0xf7, 0xa4, 0xbe, 0x1, 0x73, 0xf9,
+ 0x1c, 0x3, 0xb, 0xf8, 0xa9, 0x15, 0xd4, 0xf7,
+ 0x10, 0x42, 0x6, 0xb, 0xf7, 0xf, 0x1e, 0xf0,
+ 0x54, 0x7, 0xe, 0x6, 0xfb, 0x2e, 0xfb, 0x4,
+ 0xb, 0x1, 0xf7, 0xa5, 0xc4, 0x3, 0xb, 0xc2,
+ 0xf7, 0x33, 0xc3, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
new file mode 100644
index 0000000000..eb4fb8f5d6
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
@@ -0,0 +1,2265 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldFontData [18055] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8,
+ 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2,
+ 0xf8, 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x5,
+ 0xfb, 0x8d, 0xf9, 0x5d, 0xf9, 0xbf, 0x5, 0xf7,
+ 0xa0, 0xf, 0xf9, 0x6, 0x11, 0xae, 0x1c, 0x40,
+ 0xc8, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, 0x7,
+ 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39,
+ 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa3, 0xb2,
+ 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69, 0x6a,
+ 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+ 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+ 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67, 0x63,
+ 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61,
+ 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68,
+ 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65,
+ 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+ 0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+ 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54,
+ 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0,
+ 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+ 0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64,
+ 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+ 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+ 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5,
+ 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0,
+ 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0,
+ 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73,
+ 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0,
+ 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0,
+ 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3,
+ 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0,
+ 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0,
+ 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1,
+ 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0,
+ 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0,
+ 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb,
+ 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0,
+ 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0,
+ 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d,
+ 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0,
+ 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0,
+ 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce,
+ 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0,
+ 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0,
+ 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8,
+ 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0,
+ 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0,
+ 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2,
+ 0x0, 0x0, 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0,
+ 0x91, 0x0, 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0,
+ 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94,
+ 0x0, 0x1, 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0,
+ 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0,
+ 0x0, 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e,
+ 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+ 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+ 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+ 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+ 0x63, 0x0, 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0,
+ 0x1, 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d,
+ 0x1, 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x3, 0x0, 0x34, 0x0, 0x60, 0x0, 0xc1,
+ 0x1, 0x42, 0x1, 0xcc, 0x2, 0x52, 0x2, 0x68,
+ 0x2, 0x9d, 0x2, 0xd2, 0x3, 0x2, 0x3, 0x26,
+ 0x3, 0x39, 0x3, 0x4e, 0x3, 0x67, 0x3, 0x7e,
+ 0x3, 0xc4, 0x3, 0xe8, 0x4, 0x2f, 0x4, 0x8e,
+ 0x4, 0xc1, 0x5, 0xf, 0x5, 0x77, 0x5, 0x96,
+ 0x6, 0xc, 0x6, 0x73, 0x6, 0x86, 0x6, 0xa9,
+ 0x6, 0xc6, 0x6, 0xe4, 0x7, 0x1, 0x7, 0x5f,
+ 0x7, 0xff, 0x8, 0x3d, 0x8, 0xa0, 0x8, 0xee,
+ 0x9, 0x22, 0x9, 0x69, 0x9, 0xb0, 0x9, 0xd8,
+ 0xa, 0x12, 0xa, 0x26, 0xa, 0x57, 0xa, 0x94,
+ 0xa, 0xb6, 0xa, 0xf8, 0xb, 0x2d, 0xb, 0x76,
+ 0xb, 0xb7, 0xc, 0x32, 0xc, 0x86, 0xc, 0xfa,
+ 0xd, 0x26, 0xd, 0x64, 0xd, 0x94, 0xd, 0xcc,
+ 0xe, 0xf, 0xe, 0x45, 0xe, 0x6f, 0xe, 0x8b,
+ 0xe, 0x9f, 0xe, 0xbb, 0xe, 0xea, 0xe, 0xf6,
+ 0xf, 0xc, 0xf, 0x73, 0xf, 0xd4, 0x10, 0x1d,
+ 0x10, 0x7c, 0x10, 0xc8, 0x11, 0x6, 0x11, 0x43,
+ 0x11, 0x90, 0x11, 0xc3, 0x12, 0x7, 0x12, 0x43,
+ 0x12, 0x56, 0x12, 0xb6, 0x12, 0xfd, 0x13, 0x39,
+ 0x13, 0x97, 0x13, 0xdd, 0x14, 0x1d, 0x14, 0x95,
+ 0x14, 0xd4, 0x15, 0x29, 0x15, 0x51, 0x15, 0x91,
+ 0x15, 0xd0, 0x16, 0x7, 0x16, 0x3f, 0x16, 0xa5,
+ 0x16, 0xb5, 0x17, 0x1b, 0x17, 0x62, 0x17, 0x94,
+ 0x17, 0xe6, 0x18, 0x64, 0x18, 0xd4, 0x19, 0x29,
+ 0x19, 0x41, 0x19, 0xe1, 0x1a, 0x7, 0x1a, 0x90,
+ 0x1a, 0xf6, 0x1b, 0x29, 0x1b, 0x44, 0x1b, 0xd1,
+ 0x1b, 0xe4, 0x1c, 0x1e, 0x1c, 0x4b, 0x1c, 0x95,
+ 0x1c, 0xfe, 0x1d, 0x14, 0x1d, 0x76, 0x1d, 0xa3,
+ 0x1d, 0xbf, 0x1d, 0xf9, 0x1e, 0x25, 0x1e, 0x5f,
+ 0x1e, 0x93, 0x1e, 0xf6, 0x1f, 0x64, 0x1f, 0xff,
+ 0x20, 0x60, 0x20, 0x81, 0x20, 0xa0, 0x20, 0xca,
+ 0x21, 0x23, 0x21, 0x4c, 0x21, 0x8d, 0x21, 0xf8,
+ 0x22, 0x7b, 0x22, 0x8e, 0x22, 0xc1, 0x22, 0xf5,
+ 0x23, 0x31, 0x23, 0x49, 0x23, 0x68, 0x23, 0x93,
+ 0x23, 0xc1, 0x24, 0xc, 0x24, 0x7f, 0x24, 0xa0,
+ 0x24, 0xba, 0x24, 0xdf, 0x25, 0x33, 0x25, 0x5a,
+ 0x25, 0x89, 0x26, 0x6, 0x26, 0x1e, 0x26, 0x35,
+ 0x26, 0x5d, 0x26, 0x92, 0x26, 0xdd, 0x27, 0x26,
+ 0x27, 0xb4, 0x27, 0xd5, 0x27, 0xf6, 0x28, 0x26,
+ 0x28, 0x8b, 0x28, 0xcc, 0x29, 0x8, 0x29, 0xb0,
+ 0x2a, 0x2c, 0x2a, 0x46, 0x2a, 0x5f, 0x2a, 0x83,
+ 0x2a, 0xa2, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xf5,
+ 0x2b, 0x3a, 0x2b, 0xab, 0x2c, 0x35, 0x2c, 0x54,
+ 0x2c, 0x70, 0x2c, 0x95, 0x2c, 0xe7, 0x2d, 0xa,
+ 0x2d, 0x29, 0x2d, 0xbd, 0x2d, 0xd4, 0x2d, 0xea,
+ 0x2e, 0xe, 0x2e, 0x5a, 0x2e, 0x86, 0x2e, 0xe6,
+ 0x2f, 0x21, 0x2f, 0x4b, 0x2f, 0x5c, 0x2f, 0xa1,
+ 0x30, 0x14, 0x30, 0x4e, 0x30, 0x7b, 0x30, 0xe8,
+ 0x31, 0x65, 0x32, 0x14, 0x32, 0xc5, 0x33, 0x60,
+ 0x33, 0xf4, 0x34, 0x57, 0x34, 0xa2, 0x34, 0xf2,
+ 0x35, 0x4f, 0x35, 0x9b, 0x35, 0xeb, 0x36, 0xe,
+ 0x36, 0x1b, 0x36, 0x4a, 0x36, 0x61, 0x36, 0x96,
+ 0x36, 0xca, 0x37, 0x9, 0x37, 0x31, 0x37, 0x44,
+ 0x37, 0x57, 0x37, 0x6e, 0x37, 0x80, 0x37, 0x94,
+ 0x37, 0xa2, 0x37, 0xb7, 0x37, 0xce, 0x37, 0xee,
+ 0x38, 0x22, 0x38, 0x43, 0x38, 0x90, 0x39, 0x34,
+ 0x39, 0x4d, 0x39, 0x6b, 0x39, 0x82, 0x3a, 0x8,
+ 0x3a, 0x89, 0x3a, 0xf0, 0x3b, 0x34, 0x3b, 0x41,
+ 0x3b, 0x63, 0x3b, 0x71, 0x3b, 0x94, 0x3b, 0xa8,
+ 0x3b, 0xb4, 0x3c, 0x11, 0x3c, 0x6a, 0xe, 0xe,
+ 0x7c, 0xf7, 0x31, 0xf8, 0x44, 0x77, 0x1, 0xf7,
+ 0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x89, 0xf7, 0x4b,
+ 0x15, 0xf7, 0x2, 0x6, 0x9f, 0xf8, 0x19, 0x5,
+ 0xfb, 0x2b, 0x6, 0x75, 0xfc, 0x90, 0x15, 0x5f,
+ 0xb7, 0x68, 0xc1, 0xc1, 0xb7, 0xae, 0xb7, 0xb7,
+ 0x5f, 0xad, 0x55, 0x55, 0x5f, 0x69, 0x5f, 0x1e,
+ 0xe, 0xf7, 0xb8, 0x76, 0xf7, 0xb7, 0x77, 0x1,
+ 0xf7, 0x28, 0xf7, 0x6, 0xd6, 0xf7, 0x5, 0x3,
+ 0xf7, 0xe5, 0xf7, 0xa9, 0x15, 0xf7, 0x5, 0x6,
+ 0x9a, 0x59, 0xa, 0xfb, 0x22, 0x6, 0xfb, 0x43,
+ 0xfb, 0xb1, 0x15, 0xf7, 0x6, 0x6, 0x9b, 0x59,
+ 0xa, 0xfb, 0x23, 0x6, 0xe, 0x5e, 0x76, 0xf7,
+ 0x75, 0xe6, 0xf3, 0xe6, 0xf7, 0x54, 0x77, 0x1,
+ 0xf7, 0x24, 0xe3, 0xf3, 0xe7, 0x3, 0xf7, 0x1d,
+ 0x5e, 0x15, 0xe4, 0x6, 0x98, 0xf7, 0x60, 0x5,
+ 0xf4, 0x6, 0x7c, 0xfb, 0x60, 0x5, 0xe8, 0x6,
+ 0x98, 0xf7, 0x60, 0x5, 0xf7, 0x1, 0xe6, 0x24,
+ 0x6, 0x91, 0xf3, 0x5, 0xec, 0xe6, 0x30, 0x6,
+ 0x92, 0xf7, 0x62, 0x5, 0x31, 0x6, 0x83, 0xfb,
+ 0x62, 0x5, 0x24, 0x6, 0x92, 0xf7, 0x62, 0x5,
+ 0x32, 0x6, 0x82, 0xfb, 0x62, 0x5, 0xfb, 0x4,
+ 0x30, 0xf6, 0x6, 0x84, 0x23, 0x5, 0x27, 0x30,
+ 0xea, 0x6, 0xe9, 0xe6, 0x15, 0x93, 0xf3, 0x5,
+ 0xf1, 0x6, 0x85, 0x23, 0x5, 0xe, 0x22, 0x76,
+ 0xf7, 0x13, 0xf7, 0x54, 0xf7, 0x56, 0xf7, 0x53,
+ 0x20, 0xf7, 0x57, 0x12, 0xe0, 0xef, 0xcb, 0xef,
+ 0xbf, 0xee, 0x3a, 0xee, 0x13, 0xdd, 0xdc, 0x8c,
+ 0x15, 0xef, 0xa9, 0x6, 0x84, 0x9f, 0xa6, 0x86,
+ 0xa0, 0x1b, 0xfb, 0x25, 0xef, 0xf7, 0x24, 0x7,
+ 0xb1, 0x92, 0xf7, 0x17, 0xa1, 0xf7, 0x13, 0x1a,
+ 0xf3, 0x37, 0x9e, 0x20, 0xa7, 0x1e, 0x62, 0x97,
+ 0x26, 0x9d, 0xc1, 0x1a, 0xc0, 0xd9, 0x94, 0xaa,
+ 0x1e, 0x13, 0xee, 0xb0, 0xb0, 0x81, 0x7c, 0xac,
+ 0x1f, 0x50, 0xee, 0xf7, 0x53, 0x28, 0x6c, 0x7,
+ 0x7b, 0x93, 0x7a, 0x91, 0x78, 0x8e, 0x8, 0x13,
+ 0xdd, 0xf1, 0x27, 0x26, 0x7, 0x46, 0x82, 0x2c,
+ 0x67, 0xfb, 0x7, 0x1a, 0x21, 0xde, 0x76, 0xf7,
+ 0xe, 0x69, 0x1e, 0xb6, 0x80, 0xe1, 0x83, 0x56,
+ 0x1a, 0x55, 0x25, 0x87, 0x6f, 0x66, 0x67, 0x91,
+ 0x9a, 0x68, 0x1e, 0xc5, 0x27, 0x7, 0xe, 0x91,
+ 0x76, 0xf7, 0x5f, 0xd1, 0xdd, 0xd0, 0xf7, 0x1c,
+ 0xd2, 0x12, 0xc7, 0xd2, 0xf7, 0x9, 0xd2, 0x64,
+ 0xd1, 0xf7, 0xa, 0xd2, 0x13, 0xfb, 0xc7, 0xf8,
+ 0x71, 0x15, 0x42, 0xc3, 0x4c, 0xe3, 0x8a, 0x1e,
+ 0xdb, 0xcd, 0xc5, 0xdb, 0xd1, 0x52, 0xcf, 0x34,
+ 0x36, 0x4e, 0x48, 0x43, 0x1f, 0xd2, 0x8c, 0x15,
+ 0xae, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0xeb, 0xba,
+ 0xa8, 0x6c, 0x67, 0x5d, 0x64, 0x74, 0x65, 0x5e,
+ 0x70, 0xac, 0xaf, 0x1f, 0x13, 0xfd, 0xf7, 0x9,
+ 0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xe3, 0x8a,
+ 0x1e, 0x13, 0x45, 0xda, 0xcd, 0xc5, 0xdc, 0xd2,
+ 0x52, 0xce, 0x35, 0x36, 0x4c, 0x49, 0x42, 0x1f,
+ 0xd2, 0x8c, 0x15, 0xad, 0xa6, 0xad, 0xbb, 0x1e,
+ 0x13, 0x5, 0xb9, 0xa7, 0x6a, 0x68, 0x5c, 0x66,
+ 0x76, 0x65, 0x5d, 0x6f, 0xab, 0xaf, 0x1f, 0xfb,
+ 0x6b, 0xb3, 0x15, 0x13, 0x0, 0xf8, 0x46, 0xf7,
+ 0x63, 0x6f, 0xcf, 0xfc, 0x47, 0xfb, 0x6a, 0x5,
+ 0xe, 0x7c, 0xe7, 0x3b, 0xe8, 0xf7, 0xa, 0xe8,
+ 0xf7, 0x28, 0xe9, 0x12, 0xb8, 0xec, 0x68, 0xec,
+ 0x13, 0xb8, 0xf7, 0x2f, 0xf7, 0xc4, 0x15, 0x4d,
+ 0x6d, 0x5b, 0x4f, 0x45, 0x1a, 0x46, 0xbd, 0x31,
+ 0xf7, 0xb, 0xdb, 0xad, 0xad, 0x9d, 0xa3, 0x1e,
+ 0x13, 0x74, 0xb3, 0x63, 0x5, 0xf7, 0x37, 0xe8,
+ 0xfb, 0xc, 0x6, 0x6f, 0xa4, 0x9f, 0xa8, 0x97,
+ 0xac, 0x98, 0xaa, 0x19, 0xde, 0xe8, 0xfb, 0x27,
+ 0x6, 0x86, 0x73, 0x77, 0x52, 0x7c, 0x71, 0x30,
+ 0xf7, 0xd, 0x18, 0x7c, 0x9f, 0x65, 0xbd, 0xa2,
+ 0x1a, 0xaa, 0xa8, 0x95, 0xae, 0xb5, 0xbe, 0x73,
+ 0x79, 0x98, 0x1e, 0xc2, 0xd0, 0x5, 0xb3, 0x66,
+ 0x4b, 0xa6, 0x4f, 0x1b, 0x38, 0x3d, 0x63, 0x2e,
+ 0x5a, 0xb2, 0x64, 0x93, 0x7b, 0x1f, 0xbe, 0x43,
+ 0x15, 0xe7, 0x6a, 0xa, 0x13, 0xb8, 0x74, 0x77,
+ 0x6d, 0x7d, 0x6c, 0x1b, 0x54, 0x78, 0xb5, 0xa9,
+ 0xb8, 0xb1, 0xa4, 0xa4, 0x9a, 0x1f, 0xe, 0x4c,
+ 0xa, 0xf7, 0x7d, 0xf7, 0x19, 0x3, 0xf7, 0x84,
+ 0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0x99, 0x59,
+ 0xa, 0xfb, 0x26, 0x6, 0xe, 0x3a, 0x76, 0xf9,
+ 0x62, 0x77, 0x1, 0xf7, 0x47, 0xf7, 0x1, 0x3,
+ 0xf7, 0xd3, 0x25, 0x15, 0xf1, 0x6, 0x53, 0xe2,
+ 0x3e, 0xf7, 0xf, 0xf7, 0x52, 0x1a, 0xf7, 0x2b,
+ 0xc4, 0xc0, 0xd7, 0xf7, 0x6, 0x1e, 0x29, 0x6,
+ 0x32, 0x27, 0x54, 0x27, 0xfb, 0xb, 0x1a, 0xfb,
+ 0x17, 0xa0, 0xfb, 0x0, 0xf7, 0xb, 0xfb, 0x34,
+ 0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xf7, 0xcc, 0xf7, 0x1, 0x3, 0xf7, 0x47, 0x25,
+ 0x15, 0xf1, 0x6, 0xf7, 0xb, 0xf7, 0x34, 0xa0,
+ 0xf7, 0x0, 0xf7, 0x17, 0x1a, 0xf7, 0xb, 0x54,
+ 0xef, 0x32, 0xef, 0x1e, 0x29, 0x6, 0xd7, 0xfb,
+ 0x6, 0xc4, 0x56, 0xfb, 0x2b, 0x1a, 0xfb, 0x52,
+ 0x3e, 0xfb, 0xf, 0x53, 0x34, 0x1e, 0xe, 0xf7,
+ 0x8e, 0xf1, 0x3, 0xf7, 0x22, 0xf7, 0xac, 0x15,
+ 0xdf, 0x4e, 0xd6, 0xf7, 0xc, 0xd6, 0xfb, 0xb,
+ 0xdf, 0xc8, 0x33, 0xf2, 0xf7, 0x1d, 0xad, 0x69,
+ 0xed, 0xfb, 0x14, 0x59, 0x95, 0xf7, 0x1b, 0x5,
+ 0x6b, 0xa, 0x93, 0xfb, 0x19, 0xfb, 0x13, 0xbb,
+ 0x67, 0x28, 0xf7, 0x20, 0x6a, 0x5, 0xe, 0xc7,
+ 0x76, 0xf7, 0x41, 0xe9, 0xf7, 0x40, 0x67, 0xa,
+ 0xed, 0x3, 0xd2, 0xf7, 0x68, 0x15, 0xf7, 0x48,
+ 0xfb, 0x41, 0xed, 0xf7, 0x41, 0xf7, 0x48, 0xe9,
+ 0xfb, 0x48, 0xf7, 0x40, 0x29, 0xfb, 0x40, 0xfb,
+ 0x48, 0x6, 0xe, 0x31, 0x45, 0xa, 0xf7, 0x39,
+ 0xfb, 0x3, 0x15, 0xf7, 0x14, 0x6, 0xf7, 0x22,
+ 0x59, 0xa, 0xfb, 0x3d, 0x6, 0xe, 0xf7, 0x5f,
+ 0xf7, 0x2, 0x1, 0xef, 0xf8, 0x24, 0x3, 0xef,
+ 0xf7, 0x5f, 0x15, 0xf8, 0x24, 0xf7, 0x2, 0xfc,
+ 0x24, 0x6, 0xe, 0x7c, 0xf7, 0x4e, 0x6d, 0xa,
+ 0xd9, 0x15, 0x58, 0xbc, 0x61, 0xc6, 0xc6, 0xbc,
+ 0xb5, 0xbe, 0xbe, 0x5a, 0xb5, 0x50, 0x50, 0x5a,
+ 0x61, 0x58, 0x1e, 0xe, 0x53, 0x76, 0xf9, 0x53,
+ 0x77, 0x1, 0xed, 0xf8, 0x28, 0x3, 0xed, 0x5d,
+ 0x15, 0xd0, 0x6c, 0xf7, 0xe3, 0xf9, 0x34, 0x45,
+ 0xaa, 0x5, 0xe, 0x7c, 0xe8, 0xf8, 0x51, 0xe8,
+ 0x1, 0xe2, 0xed, 0xf7, 0x7c, 0xeb, 0x3, 0xe2,
+ 0xf7, 0xbe, 0x15, 0x42, 0x99, 0xfb, 0x84, 0xf7,
+ 0x5c, 0xf7, 0x60, 0x93, 0xf7, 0x84, 0xd5, 0xd4,
+ 0x78, 0xf7, 0x88, 0xfb, 0x53, 0xfb, 0x66, 0x85,
+ 0xfb, 0x86, 0x3f, 0x1e, 0xed, 0x8c, 0x15, 0xc6,
+ 0x8d, 0x90, 0xf7, 0x39, 0xf7, 0x1, 0x1b, 0xf7,
+ 0x3, 0x90, 0xfb, 0x3c, 0x50, 0x3b, 0x7c, 0xfb,
+ 0x1e, 0x28, 0x20, 0x80, 0xf7, 0x1f, 0xdd, 0x1f,
+ 0xe, 0x8b, 0xe8, 0xf8, 0x9f, 0x77, 0x1, 0xf7,
+ 0x91, 0xec, 0x3, 0xd2, 0x16, 0xf8, 0x5e, 0xe8,
+ 0xfb, 0x47, 0xf8, 0x9f, 0x6, 0xfb, 0x9e, 0x56,
+ 0x5, 0x30, 0x7, 0xf7, 0x3d, 0xad, 0x5, 0xfc,
+ 0x31, 0xfb, 0x4a, 0x7, 0xe, 0x8b, 0xea, 0x2c,
+ 0xf7, 0x34, 0xf7, 0xfe, 0xe9, 0x12, 0xf2, 0xed,
+ 0xf7, 0x6f, 0xee, 0x13, 0x78, 0xdc, 0x16, 0xf8,
+ 0x4a, 0xf7, 0x34, 0x2c, 0x6, 0x13, 0xb8, 0x4a,
+ 0xfb, 0x4c, 0x7, 0xf7, 0x1, 0xe8, 0xf7, 0x3e,
+ 0xf7, 0x17, 0xef, 0x1a, 0xef, 0x42, 0xec, 0xfb,
+ 0x1d, 0x39, 0x43, 0x69, 0x4d, 0x57, 0x1e, 0x34,
+ 0xed, 0x7, 0xdf, 0xe1, 0x90, 0xa6, 0xca, 0xb6,
+ 0x68, 0x48, 0x58, 0xfb, 0xb, 0x28, 0xfb, 0x70,
+ 0xfb, 0x45, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x50,
+ 0xe8, 0xf7, 0x37, 0xe9, 0x12, 0xf8, 0x1b, 0xf2,
+ 0x44, 0xeb, 0x13, 0xe8, 0xdc, 0xb3, 0x15, 0x79,
+ 0xbe, 0xcc, 0x66, 0xed, 0x1b, 0xdb, 0xf7, 0x24,
+ 0xb7, 0xf7, 0x23, 0xe1, 0x5e, 0xaa, 0x5b, 0xac,
+ 0x1f, 0x13, 0xf0, 0xba, 0xa1, 0xa1, 0xc4, 0xc1,
+ 0x1a, 0xf7, 0x6, 0x8a, 0x2a, 0xba, 0x23, 0x1b,
+ 0x40, 0x6a, 0x6f, 0x66, 0x4f, 0x1f, 0xad, 0x42,
+ 0x5, 0xb2, 0xd3, 0x9f, 0x90, 0xb6, 0x1b, 0xc8,
+ 0xb0, 0x77, 0x50, 0x3e, 0x33, 0x84, 0x4e, 0x1f,
+ 0x2e, 0x7, 0x13, 0xe8, 0xe6, 0xe4, 0x7f, 0x39,
+ 0x4d, 0x4f, 0x6b, 0x46, 0x57, 0x56, 0x9b, 0xaf,
+ 0x40, 0x1f, 0xe, 0x8b, 0xe9, 0xdf, 0xe9, 0xf7,
+ 0xec, 0x77, 0x1, 0xf7, 0xe3, 0xeb, 0x3, 0xd4,
+ 0xf7, 0x46, 0x15, 0xf7, 0x9a, 0x37, 0x23, 0x2d,
+ 0xf7, 0xbc, 0xe9, 0x2b, 0xdf, 0xe8, 0xe9, 0x2e,
+ 0xf7, 0xec, 0x24, 0x6, 0xfb, 0x93, 0xfb, 0xf9,
+ 0x5, 0xf7, 0x2, 0x98, 0x15, 0xf7, 0x2c, 0xf7,
+ 0x73, 0x5, 0xfb, 0x73, 0x7, 0xe, 0x7c, 0xe7,
+ 0xf7, 0x75, 0xe5, 0xf7, 0x8, 0xe8, 0x1, 0xf7,
+ 0x9, 0xeb, 0xf7, 0x6c, 0xeb, 0x3, 0xd5, 0xaf,
+ 0x15, 0x7b, 0xb1, 0xeb, 0x68, 0xe1, 0x1b, 0xf7,
+ 0x31, 0xd5, 0xee, 0xf6, 0xf7, 0x7, 0x3f, 0xe1,
+ 0xfb, 0xa, 0x67, 0x63, 0x89, 0x7e, 0x61, 0x1f,
+ 0xf7, 0x17, 0xf7, 0xb2, 0xe8, 0xfc, 0x12, 0xfb,
+ 0xaf, 0x7, 0xbc, 0x52, 0xb3, 0xa8, 0xbd, 0x98,
+ 0xb8, 0x8a, 0x19, 0xd0, 0x8a, 0xc6, 0x64, 0x41,
+ 0x1a, 0x4c, 0x5b, 0x5b, 0x36, 0x48, 0x4d, 0xa3,
+ 0xa1, 0x51, 0x1e, 0xe, 0x7c, 0xe4, 0xf7, 0x69,
+ 0xe9, 0xf7, 0x1c, 0xe6, 0x1, 0xdf, 0xf7, 0x2,
+ 0xf7, 0x6a, 0xec, 0x3, 0xf7, 0x51, 0xf7, 0xee,
+ 0x15, 0xf7, 0x19, 0xa5, 0xf7, 0x1, 0xb1, 0xf7,
+ 0xd, 0x1b, 0xa0, 0xa0, 0x8f, 0x87, 0xa0, 0x1f,
+ 0x92, 0xe9, 0x5, 0x8e, 0x73, 0x73, 0x85, 0x75,
+ 0x1b, 0xfb, 0xf, 0x31, 0x6c, 0x40, 0x46, 0x1f,
+ 0x5f, 0x59, 0x68, 0x32, 0x30, 0x1a, 0xfb, 0x21,
+ 0xce, 0xfb, 0x26, 0xf7, 0x30, 0xf6, 0xe6, 0xde,
+ 0xf7, 0x3, 0xf7, 0x12, 0x45, 0xd7, 0xfb, 0x16,
+ 0x56, 0x75, 0x7f, 0x74, 0x62, 0x1e, 0x90, 0xfb,
+ 0x17, 0x15, 0x8b, 0xa2, 0xd3, 0xdf, 0xdc, 0xa5,
+ 0x5a, 0x53, 0x48, 0x5e, 0x62, 0x51, 0x43, 0x64,
+ 0xd6, 0xcd, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x90,
+ 0xe8, 0x1, 0xe5, 0xed, 0x3, 0xf7, 0x5d, 0x16,
+ 0xf6, 0x6, 0xf7, 0x5c, 0xf8, 0x8e, 0x8c, 0xea,
+ 0x5, 0xfc, 0x37, 0xfb, 0x48, 0xed, 0xe2, 0xf7,
+ 0x6e, 0x6, 0xe, 0x7c, 0xe8, 0xf7, 0x53, 0xe9,
+ 0xf7, 0x22, 0xe9, 0x12, 0xde, 0xee, 0x32, 0xee,
+ 0xf7, 0x6c, 0xec, 0x36, 0xec, 0x13, 0xf2, 0xf7,
+ 0x3d, 0xf7, 0xd5, 0x15, 0x58, 0x69, 0x68, 0x57,
+ 0x4d, 0x1a, 0xfb, 0x13, 0xf7, 0x9, 0x4e, 0xef,
+ 0xf7, 0x10, 0xe8, 0xc7, 0xf7, 0x12, 0xcc, 0x6c,
+ 0xbc, 0x55, 0xb0, 0x1e, 0x13, 0xec, 0xb7, 0xac,
+ 0xa8, 0xb8, 0xc9, 0x1a, 0xf0, 0x34, 0xc5, 0xfb,
+ 0xa, 0xfb, 0x16, 0x3e, 0x43, 0x31, 0x54, 0xa7,
+ 0x5c, 0xbb, 0x67, 0x1e, 0xa2, 0xf7, 0x19, 0x15,
+ 0xbb, 0xb7, 0xaa, 0xcb, 0xe0, 0xa2, 0x6b, 0x5d,
+ 0x51, 0x54, 0x6c, 0x56, 0x50, 0x5a, 0xae, 0xc0,
+ 0x1e, 0x13, 0xf2, 0x81, 0xfb, 0xaf, 0x15, 0xc0,
+ 0xc2, 0xb8, 0xca, 0xde, 0xb0, 0x57, 0x5d, 0x4f,
+ 0x69, 0x6d, 0x37, 0x3e, 0x60, 0xb6, 0xba, 0x1e,
+ 0xe, 0x7c, 0xe8, 0xf7, 0x1a, 0xed, 0xf7, 0x68,
+ 0xe9, 0x1, 0xe5, 0xf1, 0xf7, 0x6d, 0xf5, 0x3,
+ 0xdf, 0x81, 0x15, 0x88, 0xa6, 0xa5, 0x89, 0xa4,
+ 0x1b, 0xf7, 0x3c, 0xf7, 0xf, 0xcd, 0xf7, 0x28,
+ 0xb7, 0x1f, 0x97, 0xb3, 0x91, 0xb8, 0xbf, 0x1a,
+ 0xf7, 0x3, 0x6d, 0xf7, 0x42, 0xfb, 0x4e, 0xfb,
+ 0xb, 0x31, 0x2d, 0x26, 0xfb, 0x0, 0xd8, 0x23,
+ 0xf7, 0x13, 0xb6, 0xac, 0x9c, 0x9a, 0xa4, 0x1e,
+ 0xfb, 0xd, 0x6f, 0x3b, 0x5c, 0xfb, 0x14, 0x1b,
+ 0x75, 0x74, 0x8d, 0x8d, 0x73, 0x1f, 0xf7, 0xd3,
+ 0xf7, 0xcd, 0x15, 0x87, 0x8c, 0x6f, 0x3c, 0x37,
+ 0x1b, 0x50, 0x5c, 0xb8, 0xd1, 0xd4, 0xca, 0xa6,
+ 0xb9, 0xe1, 0x97, 0x42, 0x50, 0x95, 0x1f, 0xe,
+ 0x7c, 0xf7, 0x44, 0xe1, 0xf7, 0x44, 0x6d, 0xa,
+ 0xf7, 0xe5, 0x15, 0x37, 0xa, 0xfb, 0x9c, 0x4,
+ 0x37, 0xa, 0xe, 0x31, 0x76, 0xf8, 0x7, 0xf7,
+ 0x44, 0x1, 0xf7, 0x76, 0xf7, 0x6c, 0x3, 0xf7,
+ 0x31, 0xfb, 0x3, 0x15, 0xf7, 0x1c, 0x6, 0xf7,
+ 0x29, 0xf7, 0xad, 0x5, 0xfb, 0x46, 0x6, 0x65,
+ 0xf7, 0x3b, 0x15, 0x37, 0xa, 0xe, 0x5e, 0xa,
+ 0xf7, 0x5c, 0x15, 0xf8, 0x5d, 0xfb, 0x4d, 0x5,
+ 0xe9, 0x7, 0xfb, 0xf6, 0xf7, 0x2a, 0xf7, 0xf6,
+ 0xf7, 0x28, 0x5, 0xe9, 0x7, 0xfc, 0x5d, 0xfb,
+ 0x4c, 0x5, 0xe, 0xf7, 0xa, 0xf1, 0xd7, 0xf1,
+ 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0xd2, 0xf7, 0xbc,
+ 0x15, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6, 0xfb,
+ 0xac, 0x4, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6,
+ 0xe, 0x5e, 0xa, 0x9a, 0x15, 0xf8, 0x5d, 0xf7,
+ 0x4d, 0x5, 0xf7, 0x9, 0x7, 0xfc, 0x5d, 0xf7,
+ 0x4c, 0x5, 0x2d, 0x7, 0xf7, 0xf9, 0xfb, 0x28,
+ 0xfb, 0xf9, 0xfb, 0x2a, 0x5, 0xe, 0x80, 0xf7,
+ 0x2a, 0xf7, 0xf1, 0xe7, 0x12, 0xed, 0xec, 0x7e,
+ 0xf7, 0x41, 0xbd, 0xeb, 0x13, 0xe8, 0xf7, 0x70,
+ 0xf7, 0x45, 0x15, 0xec, 0xc8, 0x6, 0xc0, 0x97,
+ 0xf7, 0x17, 0xb0, 0xf7, 0x10, 0x1a, 0xf7, 0x1,
+ 0x2b, 0xc7, 0xfb, 0xd, 0x53, 0x3e, 0x7d, 0x77,
+ 0x56, 0x1e, 0xfb, 0x23, 0xec, 0xd6, 0x7, 0xa8,
+ 0x92, 0xae, 0x8f, 0xad, 0x8a, 0x8, 0xc6, 0x8a,
+ 0xc0, 0x76, 0x54, 0x1a, 0x13, 0x90, 0x40, 0x2b,
+ 0x7a, 0x32, 0x7d, 0x1e, 0x13, 0xd8, 0x65, 0xfb,
+ 0x88, 0x15, 0x62, 0xb1, 0x69, 0xbb, 0xbb, 0xb2,
+ 0xad, 0xb4, 0xb4, 0x64, 0xad, 0x5b, 0x5b, 0x65,
+ 0x69, 0x62, 0x1e, 0xe, 0x79, 0xd3, 0xd2, 0xd4,
+ 0xf7, 0x85, 0x77, 0xe6, 0xd0, 0x1, 0x9e, 0xdf,
+ 0xcc, 0xd0, 0xf7, 0x9b, 0xdb, 0x3, 0xf7, 0xea,
+ 0xf7, 0x3b, 0x15, 0x6a, 0xa1, 0xaf, 0x82, 0x9d,
+ 0x1b, 0xc8, 0xf0, 0xc0, 0xf7, 0x26, 0xbd, 0x81,
+ 0xbc, 0x72, 0xb3, 0x1f, 0xde, 0x57, 0x2f, 0xac,
+ 0x30, 0x1b, 0xfb, 0x2d, 0xfb, 0x1e, 0x23, 0xfb,
+ 0x5d, 0xfb, 0x1, 0xbf, 0xfb, 0x4b, 0xf7, 0x78,
+ 0xf7, 0x13, 0xd4, 0xc4, 0xa4, 0xb1, 0x1f, 0x6f,
+ 0xcf, 0x5, 0x54, 0x3d, 0x4c, 0x74, 0x3f, 0x1b,
+ 0xfb, 0x2d, 0x67, 0xf7, 0x1b, 0xe3, 0xc9, 0xa2,
+ 0xf7, 0x3f, 0xf7, 0x4c, 0xf7, 0xb, 0xd2, 0x44,
+ 0x23, 0x3c, 0x69, 0x51, 0x63, 0x7d, 0x77, 0x91,
+ 0xa3, 0x90, 0x8b, 0x8f, 0x8d, 0x91, 0x1f, 0xbe,
+ 0xf7, 0x52, 0x5, 0x46, 0x6, 0x85, 0x79, 0x5,
+ 0xa3, 0x74, 0x7e, 0x8b, 0x7d, 0x1b, 0xfb, 0x4,
+ 0x63, 0xfb, 0xe, 0x3a, 0x35, 0xbe, 0x72, 0xad,
+ 0xac, 0xab, 0x9c, 0xa4, 0xa3, 0x1f, 0x22, 0xd0,
+ 0x15, 0xc3, 0xa5, 0xd4, 0xbc, 0xa3, 0x8d, 0x74,
+ 0x82, 0x70, 0x77, 0xfb, 0x0, 0x4f, 0x7b, 0x86,
+ 0x9d, 0x9f, 0x1e, 0xe, 0x8b, 0xe6, 0xd8, 0xe6,
+ 0xf7, 0x68, 0xe6, 0x1, 0x82, 0x16, 0xf7, 0x8d,
+ 0xe6, 0x31, 0x6, 0xab, 0xd8, 0x5, 0xf7, 0x80,
+ 0x6, 0xae, 0x3e, 0x5, 0x35, 0x30, 0xf7, 0x86,
+ 0xe6, 0x52, 0x6, 0xfb, 0x62, 0xf8, 0x6b, 0x5,
+ 0xfb, 0x90, 0x30, 0xf7, 0x15, 0x6, 0xfb, 0x3f,
+ 0xfc, 0x10, 0x5, 0x4e, 0x6, 0xf7, 0x7c, 0xf7,
+ 0x3c, 0x15, 0xdb, 0xf7, 0x40, 0xd7, 0xfb, 0x40,
+ 0x5, 0xe, 0x8b, 0xe6, 0xf7, 0x2e, 0xe6, 0xf7,
+ 0x1b, 0xe6, 0x12, 0xf7, 0x2, 0xeb, 0xf7, 0x7f,
+ 0xea, 0x4e, 0xeb, 0x13, 0xf4, 0xa7, 0x16, 0xf7,
+ 0xc4, 0x6, 0xf7, 0x49, 0xc5, 0xcf, 0xeb, 0xb8,
+ 0x78, 0xb5, 0x3f, 0xb7, 0x1f, 0x13, 0xf8, 0xb2,
+ 0xa8, 0xa0, 0xb4, 0xb7, 0x1a, 0xcd, 0x5a, 0xe2,
+ 0xfb, 0x2d, 0x1e, 0xfb, 0xc6, 0x30, 0xdd, 0xfc,
+ 0x10, 0x39, 0x6, 0xf7, 0x46, 0xf7, 0x89, 0x15,
+ 0xf7, 0x1b, 0xf7, 0x12, 0x7, 0xe6, 0x9d, 0x67,
+ 0x6e, 0x4d, 0x3e, 0x83, 0x6b, 0x1f, 0xfb, 0x12,
+ 0xfb, 0x89, 0x15, 0xf7, 0x2e, 0xf7, 0x12, 0x7,
+ 0x13, 0xf4, 0xa4, 0xf7, 0xa, 0x8a, 0x3b, 0x4a,
+ 0x55, 0x83, 0x32, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+ 0x33, 0xe6, 0x1, 0xaa, 0xec, 0xf7, 0xed, 0xeb,
+ 0x3, 0xf8, 0x95, 0xf7, 0x20, 0x15, 0x74, 0x6a,
+ 0x40, 0x60, 0x37, 0x1b, 0xfb, 0x1c, 0x52, 0xf3,
+ 0xf5, 0xf7, 0x2e, 0xf7, 0x8, 0xbe, 0xd6, 0xc1,
+ 0xc1, 0x77, 0x70, 0xb9, 0x1f, 0x22, 0xeb, 0xf7,
+ 0x87, 0x2b, 0x61, 0x7, 0x95, 0x7d, 0x55, 0xab,
+ 0x34, 0x1b, 0xfb, 0x3a, 0xfb, 0xd, 0xfb, 0x10,
+ 0xfb, 0x3f, 0xfb, 0x8, 0xcf, 0xfb, 0x4f, 0xf7,
+ 0x75, 0xda, 0xe0, 0x90, 0xd1, 0xdb, 0x1f, 0x8c,
+ 0x8a, 0x5, 0xe, 0x32, 0xa, 0xf0, 0xeb, 0xf7,
+ 0xaf, 0xf1, 0x3, 0x9d, 0x16, 0xf7, 0x87, 0x6,
+ 0xf7, 0x30, 0xf7, 0x39, 0xce, 0xf7, 0x75, 0xf7,
+ 0x47, 0xfb, 0x9, 0xe6, 0xfb, 0x45, 0x1f, 0xfb,
+ 0xa2, 0x7a, 0xa, 0x6, 0xf7, 0x47, 0x16, 0xf8,
+ 0x10, 0x7, 0xf7, 0x90, 0xaa, 0x39, 0x26, 0xfb,
+ 0x1d, 0x41, 0x4f, 0xfb, 0x65, 0x1f, 0xe, 0x8b,
+ 0xe6, 0x30, 0xf7, 0x58, 0xb8, 0xe5, 0xac, 0xf7,
+ 0x5a, 0x30, 0xe6, 0x12, 0xf7, 0x7, 0xef, 0xf7,
+ 0x3, 0xee, 0xb6, 0xee, 0x13, 0x77, 0xb1, 0x16,
+ 0xf8, 0xa5, 0xf7, 0x58, 0x28, 0x6, 0x13, 0xaf,
+ 0x22, 0xfb, 0x91, 0xf7, 0x2a, 0xf7, 0x3, 0x4a,
+ 0xee, 0xf7, 0x70, 0x28, 0x4a, 0xfb, 0x3, 0xf7,
+ 0x20, 0xf7, 0x91, 0x7, 0x13, 0xb7, 0x20, 0xee,
+ 0xf7, 0x5a, 0xfc, 0xa5, 0x7, 0x13, 0xaf, 0x30,
+ 0xd8, 0xfc, 0x10, 0x3e, 0x7, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x28, 0xe6, 0xae, 0xf7, 0x58, 0x31, 0xe5,
+ 0x90, 0x77, 0x12, 0xf7, 0x6, 0xed, 0xf7, 0x8,
+ 0xed, 0xb2, 0xef, 0x13, 0xd7, 0xad, 0x16, 0xf7,
+ 0xd5, 0xe6, 0xfb, 0x23, 0xf7, 0x28, 0xf7, 0x8,
+ 0x4b, 0xed, 0xf7, 0x70, 0x29, 0x4a, 0xfb, 0x8,
+ 0xf7, 0x21, 0xf7, 0x91, 0x6, 0x13, 0xe7, 0x21,
+ 0xef, 0x7, 0x13, 0xcf, 0xf7, 0x5d, 0x7, 0x13,
+ 0xd7, 0xfc, 0xa7, 0x2b, 0x6, 0xdb, 0x8c, 0x5,
+ 0xfc, 0x10, 0x3b, 0x7, 0xe, 0x79, 0xe9, 0xf1,
+ 0xea, 0xf7, 0x6c, 0xe6, 0x1, 0x99, 0xed, 0xf7,
+ 0xc7, 0xed, 0x3, 0x46, 0xa, 0xda, 0xf7, 0x17,
+ 0xf7, 0x21, 0xe6, 0xc9, 0xed, 0x41, 0xa, 0xfb,
+ 0x5, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x2d,
+ 0xf7, 0x36, 0x58, 0xa, 0xe, 0x8b, 0xe6, 0xf7,
+ 0x23, 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xec, 0xe8,
+ 0xf7, 0x70, 0xe8, 0x3, 0x9f, 0x16, 0xf7, 0x8c,
+ 0xe6, 0x3d, 0xf7, 0x23, 0xf7, 0x70, 0xfb, 0x23,
+ 0x3e, 0x30, 0xf7, 0x8b, 0xe6, 0x3e, 0xf8, 0x10,
+ 0xd8, 0xe6, 0xfb, 0x88, 0x30, 0xd5, 0xfb, 0x26,
+ 0xfb, 0x70, 0xf7, 0x26, 0xd7, 0xe6, 0xfb, 0x8a,
+ 0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x6, 0xe, 0x32,
+ 0xa, 0xf7, 0x8f, 0xf0, 0x60, 0xa, 0xe6, 0xfb,
+ 0x3f, 0xf8, 0x10, 0x74, 0xa, 0xfc, 0x10, 0xfb,
+ 0x42, 0x6, 0xe, 0x79, 0xe5, 0xf8, 0x22, 0xe7,
+ 0x1, 0x9d, 0xed, 0xf7, 0x85, 0xeb, 0x3, 0x9d,
+ 0xbd, 0x15, 0x7a, 0xab, 0xef, 0x58, 0xf5, 0x1b,
+ 0xf7, 0x12, 0xd2, 0xd5, 0xf7, 0x1f, 0x1f, 0xf7,
+ 0xa7, 0xf7, 0x15, 0xe7, 0xfc, 0x24, 0x2f, 0xf7,
+ 0x43, 0xfb, 0xa8, 0x7, 0x49, 0x80, 0x53, 0x2e,
+ 0x3d, 0x50, 0x78, 0xa, 0x32, 0xa, 0xe9, 0xee,
+ 0x3, 0x96, 0x16, 0xf7, 0x9c, 0xe6, 0x39, 0xf7,
+ 0x2, 0x6, 0xc6, 0xc0, 0xcf, 0x34, 0xc5, 0x2a,
+ 0xbe, 0x45, 0x19, 0xf7, 0x34, 0xe6, 0x20, 0x6,
+ 0x5d, 0xce, 0x4c, 0xe1, 0x54, 0xcf, 0xf7, 0x44,
+ 0xf7, 0x33, 0x18, 0xcf, 0xe6, 0xfb, 0x86, 0x30,
+ 0xb6, 0x6, 0xfb, 0x3e, 0xfb, 0x2d, 0x5, 0xf7,
+ 0x2d, 0xda, 0xe6, 0xfb, 0x99, 0x7a, 0xa, 0x7,
+ 0xe, 0x32, 0xa, 0xf7, 0x17, 0xec, 0xf7, 0x86,
+ 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x92,
+ 0x28, 0xfb, 0x37, 0xfb, 0x86, 0xf8, 0x10, 0xf7,
+ 0x14, 0xe6, 0xfb, 0xda, 0x30, 0xf0, 0xfc, 0x10,
+ 0x26, 0x6, 0xe, 0x32, 0xa, 0xd2, 0xe7, 0xf7,
+ 0xab, 0xe7, 0x3, 0x89, 0x16, 0xf7, 0x90, 0xe6,
+ 0x2c, 0x6, 0x9b, 0xf7, 0xce, 0xf1, 0xfb, 0xa2,
+ 0x5, 0xc6, 0x6, 0xf4, 0xf7, 0x9f, 0x96, 0xfb,
+ 0xcb, 0x5, 0x32, 0x30, 0xf7, 0x86, 0xe6, 0x4d,
+ 0x6, 0x81, 0xf8, 0x10, 0x5, 0xd4, 0xe6, 0xfb,
+ 0x52, 0x6, 0x20, 0xfb, 0xac, 0x25, 0xf7, 0xac,
+ 0x5, 0xfb, 0x5f, 0x30, 0xda, 0x6, 0x7b, 0xfc,
+ 0x10, 0x5, 0x4a, 0x6, 0xe, 0x7f, 0xe8, 0xf8,
+ 0x18, 0xe8, 0x1, 0xd8, 0xe8, 0xf7, 0x9a, 0xe5,
+ 0x3, 0x8a, 0x7f, 0x15, 0xf7, 0x8e, 0xe8, 0x3c,
+ 0xf7, 0xd1, 0x6, 0xf7, 0x9a, 0xfc, 0x2e, 0x5,
+ 0xe5, 0xf8, 0x75, 0xda, 0xe8, 0xfb, 0x96, 0x2e,
+ 0xe0, 0xfb, 0xc5, 0x6, 0xfb, 0x8b, 0xf8, 0x22,
+ 0x5, 0xfb, 0x4a, 0x2e, 0xd9, 0xfc, 0x18, 0x3d,
+ 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x30, 0xe9, 0x1,
+ 0xa1, 0xee, 0xf7, 0xfd, 0xeb, 0x3, 0xa1, 0xf7,
+ 0xab, 0x15, 0xfb, 0x5c, 0xf7, 0x25, 0x2a, 0xf7,
+ 0x1a, 0xf2, 0xf7, 0x42, 0xd5, 0xf7, 0x76, 0xf7,
+ 0x21, 0x2f, 0xf7, 0x31, 0xfb, 0x4d, 0xfb, 0x42,
+ 0x22, 0xfb, 0x25, 0xfb, 0x30, 0x1e, 0xeb, 0x8e,
+ 0x15, 0xe9, 0xca, 0xf7, 0x2, 0xf7, 0xc, 0xf7,
+ 0x1d, 0xb9, 0xfb, 0x16, 0x44, 0x38, 0x5a, 0xfb,
+ 0x14, 0xfb, 0x1a, 0xfb, 0xd, 0x4d, 0xf7, 0x0,
+ 0xef, 0x1e, 0xe, 0x8b, 0xe6, 0xef, 0xe7, 0xf7,
+ 0x50, 0xe6, 0x1, 0xf7, 0x13, 0xed, 0xf7, 0x7d,
+ 0xec, 0x3, 0xb7, 0x16, 0xf7, 0xca, 0xe6, 0xfb,
+ 0x15, 0xef, 0x6, 0xf7, 0x8d, 0xdc, 0xbd, 0xf7,
+ 0x17, 0xf7, 0x5f, 0xfb, 0x36, 0x78, 0xfb, 0xf1,
+ 0x91, 0x1f, 0x7a, 0xa, 0x7, 0xf7, 0x49, 0xf7,
+ 0x54, 0x15, 0xf7, 0x50, 0x7, 0xf7, 0x20, 0x84,
+ 0xe8, 0x99, 0x24, 0x1a, 0x26, 0x25, 0x9b, 0xfb,
+ 0x17, 0x84, 0x1e, 0xe, 0xfb, 0x9, 0x76, 0xb8,
+ 0xf7, 0x49, 0xf8, 0x24, 0xe7, 0x12, 0xa6, 0xeb,
+ 0xf7, 0xf7, 0xea, 0x17, 0xf7, 0xa, 0x46, 0x15,
+ 0xb6, 0x46, 0x5, 0xab, 0xc7, 0xa5, 0x98, 0xaf,
+ 0x1b, 0xa9, 0xa4, 0x80, 0x81, 0xa4, 0x1f, 0x81,
+ 0xa3, 0xa4, 0x82, 0xa8, 0x1b, 0xc2, 0xaa, 0xa6,
+ 0xb8, 0xb9, 0x1f, 0x51, 0xca, 0x5, 0x68, 0x66,
+ 0x7e, 0x83, 0x79, 0x1b, 0x73, 0x70, 0x9b, 0xa1,
+ 0x6b, 0x1f, 0xf7, 0x26, 0xb1, 0xca, 0xf7, 0xf,
+ 0xf7, 0x10, 0x1a, 0xde, 0x5a, 0xf7, 0x6b, 0xfb,
+ 0x75, 0xfb, 0x1f, 0xfb, 0x19, 0x27, 0xfb, 0x56,
+ 0xfb, 0x20, 0xd1, 0x2f, 0xf0, 0x62, 0x1e, 0x40,
+ 0xf7, 0xa6, 0x15, 0xf7, 0x2e, 0xf6, 0xba, 0xd0,
+ 0x1e, 0x13, 0x58, 0xf7, 0xb, 0xc7, 0x24, 0x25,
+ 0x1f, 0x13, 0x50, 0xfb, 0x2c, 0x21, 0x60, 0x41,
+ 0x3b, 0x2c, 0xbc, 0xf7, 0x2a, 0x1e, 0xe, 0x8b,
+ 0xe6, 0xf7, 0x18, 0xe6, 0xf7, 0x31, 0xe6, 0x1,
+ 0xec, 0xef, 0xf7, 0x7a, 0xee, 0x3, 0x97, 0x16,
+ 0xf7, 0x9d, 0xe6, 0x3b, 0xf7, 0x18, 0xde, 0x6,
+ 0xe4, 0xfb, 0x9, 0xb6, 0x4d, 0xa9, 0x5f, 0x8,
+ 0xf7, 0x25, 0xe6, 0x33, 0x6, 0xfb, 0x4, 0xf7,
+ 0x2a, 0x5, 0xf6, 0x9d, 0xab, 0xcf, 0xd1, 0x1a,
+ 0xf7, 0x8, 0x27, 0xbc, 0xfb, 0x8, 0x1e, 0xfb,
+ 0xba, 0x30, 0xdc, 0xfc, 0x10, 0x36, 0x6, 0xf7,
+ 0x4d, 0xf7, 0x73, 0x15, 0xf7, 0x31, 0x7, 0xf7,
+ 0x49, 0xbc, 0x92, 0x39, 0x31, 0x39, 0x93, 0xfb,
+ 0x28, 0x1f, 0xe, 0x8b, 0xe3, 0xf8, 0x17, 0xe3,
+ 0x94, 0x77, 0x12, 0xd3, 0xe6, 0x41, 0xe7, 0xf7,
+ 0x80, 0xe6, 0x45, 0xe5, 0x13, 0xd2, 0xd3, 0x16,
+ 0xe6, 0xae, 0x6, 0x81, 0x9f, 0xb9, 0x72, 0xd5,
+ 0x1b, 0xf7, 0xe, 0xf2, 0xcc, 0xf5, 0xf7, 0x24,
+ 0xfb, 0x2a, 0x87, 0x21, 0x9a, 0x1f, 0x13, 0xcc,
+ 0x72, 0x8f, 0x49, 0x95, 0xc5, 0x1a, 0xb5, 0xb9,
+ 0xae, 0xdc, 0xb2, 0xb0, 0x88, 0x7d, 0xac, 0x1e,
+ 0x2e, 0xe6, 0x7, 0x13, 0xb4, 0xf7, 0x63, 0x30,
+ 0x76, 0x7, 0x13, 0xca, 0x99, 0x6a, 0x64, 0x89,
+ 0x62, 0x1b, 0xfb, 0x22, 0x42, 0x32, 0x3d, 0xfb,
+ 0x22, 0xf7, 0x1d, 0x81, 0xf7, 0x6, 0x82, 0x1f,
+ 0xbd, 0x87, 0xbb, 0x78, 0x62, 0x1a, 0x5b, 0x64,
+ 0x68, 0x2b, 0x1e, 0x13, 0xd4, 0x58, 0x5c, 0x9b,
+ 0xa3, 0x61, 0x1f, 0xd3, 0x30, 0x7, 0xe, 0x32,
+ 0xa, 0xb4, 0xee, 0xf7, 0x3, 0xed, 0xf7, 0x3,
+ 0xee, 0x14, 0x38, 0xf7, 0xe, 0x16, 0xf7, 0xe6,
+ 0xe6, 0xfb, 0x3, 0xf8, 0x10, 0xf7, 0x3, 0xfb,
+ 0x5, 0xee, 0xf7, 0x60, 0xfc, 0x9a, 0xfb, 0x60,
+ 0xee, 0xf7, 0x5, 0xf7, 0x3, 0xfc, 0x10, 0xfb,
+ 0x15, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x20, 0xe7,
+ 0x1, 0xde, 0xe9, 0xf7, 0x8b, 0xe9, 0x3, 0x8f,
+ 0xf8, 0x6a, 0x15, 0xda, 0xfb, 0xa2, 0x6, 0xfb,
+ 0x28, 0xd2, 0x45, 0xf7, 0x25, 0xf7, 0x13, 0xe7,
+ 0xc4, 0xf7, 0x21, 0x1e, 0xf7, 0xb6, 0xd9, 0xe7,
+ 0xfb, 0x96, 0x2f, 0xe1, 0xfb, 0x9a, 0x7, 0x35,
+ 0x73, 0x5b, 0x24, 0xfb, 0x4, 0x83, 0xcb, 0xc0,
+ 0x1e, 0xf7, 0xab, 0xdf, 0xe7, 0xfb, 0x95, 0x7,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0x7e,
+ 0xf7, 0x8a, 0xf7, 0x1a, 0xf7, 0x8a, 0x3, 0xf7,
+ 0x90, 0x16, 0xeb, 0x6, 0xf7, 0x58, 0xf8, 0x6b,
+ 0x5, 0xd0, 0xe6, 0xfb, 0x8a, 0x30, 0xde, 0x6,
+ 0xfb, 0x28, 0xfb, 0xf4, 0xfb, 0x1f, 0xf7, 0xf4,
+ 0x5, 0xd1, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0x6,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0xed,
+ 0x16, 0xde, 0x6, 0xf7, 0xa, 0xf7, 0xbc, 0xf7,
+ 0xc, 0xfb, 0xbc, 0x5, 0xdd, 0x6, 0xcf, 0xf8,
+ 0x6b, 0x5, 0xbc, 0xe6, 0xfb, 0x78, 0x30, 0xe1,
+ 0x6, 0x69, 0xfb, 0xab, 0x21, 0xf7, 0x94, 0x5,
+ 0x45, 0x6, 0x23, 0xfb, 0x96, 0x67, 0xf7, 0xad,
+ 0x5, 0xe0, 0xe6, 0xfb, 0x79, 0x30, 0xbc, 0x6,
+ 0xe, 0x32, 0xa, 0x97, 0x16, 0xf7, 0x8c, 0xe6,
+ 0x45, 0x6, 0xf7, 0x1, 0xf7, 0x1b, 0xf7, 0x1,
+ 0xfb, 0x1b, 0x5, 0x4d, 0x30, 0xf7, 0x86, 0xe6,
+ 0x47, 0x6, 0xfb, 0x37, 0xf7, 0x5f, 0xf7, 0x23,
+ 0xf7, 0x45, 0x5, 0xd1, 0xe6, 0xfb, 0x77, 0x30,
+ 0xbb, 0x6, 0x34, 0xfb, 0x0, 0x32, 0xf7, 0x0,
+ 0x5, 0xb7, 0xe6, 0xfb, 0x7a, 0x30, 0xd2, 0x6,
+ 0xf7, 0x25, 0xfb, 0x45, 0xfb, 0x39, 0xfb, 0x5f,
+ 0x5, 0x47, 0x6, 0xe, 0x32, 0xa, 0xf7, 0x8e,
+ 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xec, 0xe6,
+ 0xfb, 0xf, 0xf7, 0x1c, 0x6, 0xf7, 0x35, 0xf7,
+ 0x88, 0x5, 0xdb, 0xe6, 0xfb, 0x81, 0x30, 0xc2,
+ 0x6, 0x22, 0xfb, 0x31, 0x22, 0xf7, 0x31, 0x5,
+ 0xc0, 0xe6, 0xfb, 0x82, 0x30, 0xda, 0x6, 0xf7,
+ 0x34, 0xfb, 0x88, 0x5, 0xfb, 0x1c, 0xfb, 0x10,
+ 0x7, 0xe, 0x32, 0xa, 0xcc, 0xed, 0xf7, 0xaa,
+ 0xec, 0x3, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x70,
+ 0x2a, 0xfb, 0x15, 0xfb, 0x8d, 0x6, 0xf7, 0xd6,
+ 0xf8, 0x2a, 0x5, 0xcc, 0xfc, 0x55, 0xfb, 0x61,
+ 0xed, 0xf7, 0x6, 0xf7, 0x6c, 0x7, 0xfb, 0xd2,
+ 0xfc, 0x25, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+ 0xe7, 0x1, 0xf7, 0x4d, 0xed, 0x3, 0xf7, 0x4d,
+ 0x25, 0x15, 0xf7, 0x7a, 0xe7, 0xfb, 0x18, 0xf8,
+ 0xaa, 0xf7, 0x18, 0xe7, 0xfb, 0x7a, 0x6, 0xe,
+ 0x53, 0x76, 0xf9, 0x53, 0x77, 0x1, 0xf8, 0x43,
+ 0x3e, 0x15, 0xd2, 0xa8, 0xfb, 0xe1, 0xf9, 0x36,
+ 0x44, 0x6e, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+ 0xe7, 0x1, 0xf7, 0xd2, 0xec, 0x3, 0xf7, 0x4d,
+ 0x81, 0x15, 0x2f, 0xf7, 0x7a, 0xf9, 0x62, 0xfb,
+ 0x7a, 0x2f, 0xf7, 0x19, 0xfc, 0xaa, 0x7, 0xe,
+ 0xf7, 0xa3, 0x76, 0xf8, 0x2, 0x77, 0x1, 0xf7,
+ 0x0, 0xf7, 0x8e, 0x15, 0xd3, 0xb1, 0xce, 0xcc,
+ 0xc1, 0xd8, 0xc2, 0x3a, 0xcb, 0x4e, 0xd3, 0x66,
+ 0x8, 0xcb, 0x7, 0x30, 0xf7, 0x2, 0x6c, 0xc2,
+ 0x66, 0xf7, 0x1c, 0x8, 0x47, 0x6, 0x6b, 0xfb,
+ 0x14, 0x68, 0x45, 0x31, 0x23, 0x8, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xec,
+ 0xbd, 0x7, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+ 0x77, 0x1, 0xf7, 0x3c, 0xf8, 0xcd, 0x15, 0xf7,
+ 0x89, 0x4e, 0x9d, 0xbb, 0xfb, 0x7b, 0xf4, 0x5,
+ 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf1, 0xed, 0xd0,
+ 0xe8, 0x34, 0xa, 0x13, 0xbc, 0xf4, 0xf7, 0xcf,
+ 0x15, 0x9a, 0xa8, 0xe6, 0xaa, 0xd3, 0x1b, 0xbe,
+ 0xb4, 0x75, 0x5c, 0x1f, 0x7f, 0x7, 0x92, 0x67,
+ 0x68, 0x90, 0x6c, 0x1b, 0xfb, 0x33, 0x2b, 0x48,
+ 0x2d, 0x2d, 0xeb, 0x57, 0xed, 0xc8, 0xc9, 0x9e,
+ 0xb4, 0xb3, 0x1f, 0x13, 0x7a, 0x5c, 0xf7, 0x46,
+ 0xe9, 0x7, 0x13, 0x7c, 0x38, 0xf7, 0x3a, 0x6,
+ 0xf7, 0x11, 0x6e, 0xd2, 0xfb, 0x29, 0x31, 0x28,
+ 0x67, 0x75, 0x58, 0x1e, 0xf7, 0xd7, 0xfb, 0x83,
+ 0x15, 0x13, 0xbc, 0x60, 0x5b, 0x4f, 0x68, 0x47,
+ 0x1b, 0x60, 0x62, 0x9e, 0xab, 0xb8, 0xd7, 0x9e,
+ 0xc6, 0xc6, 0xb6, 0x86, 0x89, 0xa2, 0x1f, 0xe,
+ 0x7c, 0xe8, 0x3b, 0xe9, 0xf7, 0x9d, 0xe7, 0xde,
+ 0xe9, 0x12, 0x93, 0xf7, 0x4c, 0x28, 0xee, 0xf7,
+ 0xbf, 0xf0, 0x13, 0x7a, 0x94, 0x89, 0x15, 0xf7,
+ 0x4b, 0xb1, 0x6, 0x13, 0xba, 0x68, 0xbb, 0xc2,
+ 0x7b, 0xc0, 0x1b, 0xf7, 0x12, 0xf7, 0xa, 0xea,
+ 0xf7, 0x1f, 0xf7, 0x1b, 0xfb, 0x7, 0xea, 0xfb,
+ 0x12, 0x55, 0x53, 0x7d, 0x67, 0x5a, 0x1f, 0xf7,
+ 0x77, 0xfb, 0x4c, 0x2d, 0x7, 0x13, 0x76, 0xe0,
+ 0xfc, 0x4c, 0x37, 0x6, 0xf7, 0x48, 0xf7, 0x10,
+ 0x15, 0xd6, 0xb8, 0xcd, 0xf7, 0x0, 0xf7, 0x0,
+ 0xb4, 0x34, 0x59, 0x1e, 0x13, 0xba, 0x3e, 0x4b,
+ 0x4a, 0x34, 0x5d, 0x22, 0xa6, 0xf7, 0x3, 0x1e,
+ 0xe, 0x7c, 0xe9, 0xf7, 0xb2, 0xe9, 0x1, 0xba,
+ 0xeb, 0xf7, 0xab, 0xeb, 0x3, 0xf8, 0x3a, 0xf7,
+ 0x8b, 0x15, 0xeb, 0xf7, 0x68, 0x2b, 0x78, 0x6,
+ 0x98, 0x68, 0x65, 0x91, 0x65, 0x1b, 0xfb, 0x49,
+ 0x38, 0xfb, 0x11, 0xfb, 0x4, 0xfb, 0x2b, 0xf7,
+ 0x11, 0x35, 0xf7, 0x12, 0xeb, 0xe4, 0xb4, 0xc2,
+ 0xd0, 0x1f, 0x55, 0xd5, 0x5, 0x62, 0x52, 0x54,
+ 0x68, 0x3c, 0x1b, 0x39, 0x39, 0xbb, 0xe9, 0xdc,
+ 0xcb, 0xca, 0xf3, 0xb2, 0xb3, 0x81, 0x7a, 0xab,
+ 0x1f, 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf7, 0x9d,
+ 0xe9, 0xdc, 0xe9, 0x12, 0x99, 0xec, 0xf7, 0xbe,
+ 0xec, 0x2a, 0xf7, 0x44, 0x13, 0x7a, 0xf8, 0x2f,
+ 0x89, 0x15, 0xf7, 0x42, 0xe9, 0x3c, 0x6, 0x13,
+ 0x7c, 0xf8, 0xaa, 0xfb, 0x72, 0x2d, 0xf7, 0x11,
+ 0xfb, 0x17, 0x7, 0xad, 0x65, 0x52, 0x9b, 0x53,
+ 0x1b, 0xfb, 0x24, 0x27, 0xfb, 0x3, 0xfb, 0xe,
+ 0xfb, 0x11, 0xf4, 0xfb, 0x0, 0xf7, 0x23, 0x1f,
+ 0x13, 0xbc, 0xc2, 0xc1, 0x9c, 0xab, 0xb3, 0x1f,
+ 0xfb, 0xc0, 0xf7, 0x4e, 0x15, 0xd9, 0xcd, 0xc6,
+ 0xe2, 0xe6, 0xc1, 0x4c, 0x3e, 0xfb, 0xd, 0xfb,
+ 0x7, 0x7a, 0x69, 0x3a, 0x47, 0xc8, 0xdb, 0x1e,
+ 0xe, 0x7c, 0xe8, 0xee, 0xea, 0xe3, 0xe9, 0x1,
+ 0xf7, 0x22, 0xf7, 0x45, 0x15, 0xf8, 0x22, 0x6,
+ 0xf7, 0x3a, 0x9f, 0x29, 0xf7, 0x3, 0xfb, 0x37,
+ 0x1b, 0xfb, 0xe, 0xfb, 0x1f, 0x3c, 0xfb, 0x32,
+ 0xfb, 0xe, 0xe4, 0xfb, 0x2, 0xf7, 0x41, 0xe8,
+ 0xe7, 0xaa, 0xb6, 0xd7, 0x1f, 0x5f, 0xda, 0x5,
+ 0x6c, 0x4a, 0x44, 0x6e, 0x3d, 0x1b, 0xfb, 0x10,
+ 0x6b, 0xcc, 0xad, 0x86, 0x1f, 0x8d, 0xea, 0x15,
+ 0xc5, 0xa0, 0xce, 0xa9, 0xc9, 0x1b, 0xc9, 0xc9,
+ 0x78, 0x46, 0x9e, 0x1f, 0xe, 0x7c, 0xa, 0xe8,
+ 0xeb, 0xe7, 0x1, 0xf7, 0x44, 0xf5, 0x3, 0xcf,
+ 0x16, 0xf8, 0x50, 0xe9, 0xfb, 0x7a, 0xf7, 0x8f,
+ 0xf7, 0x7a, 0xe8, 0xfb, 0x7a, 0xae, 0x6, 0xb1,
+ 0x8d, 0xa2, 0xdb, 0xbd, 0xa9, 0x84, 0x80, 0xb9,
+ 0x1e, 0xb5, 0xe7, 0x5, 0x96, 0x35, 0x4d, 0x92,
+ 0x5a, 0x1b, 0x24, 0x53, 0x51, 0x24, 0x1f, 0x70,
+ 0xfb, 0x0, 0x2e, 0xf7, 0x0, 0xfb, 0x8f, 0xfb,
+ 0x0, 0x7, 0xe, 0xfb, 0x26, 0xe4, 0xf1, 0xe3,
+ 0xf7, 0x71, 0xe4, 0x3e, 0xe3, 0x69, 0xa, 0x13,
+ 0xec, 0x50, 0xa, 0xe9, 0xf2, 0x1f, 0xf7, 0xc3,
+ 0x7, 0x13, 0xea, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e,
+ 0x6, 0x13, 0xdc, 0x5a, 0xa, 0xfb, 0x9, 0xee,
+ 0x36, 0xf7, 0x21, 0xc0, 0xbe, 0x94, 0xa7, 0xb1,
+ 0x1f, 0x67, 0x7, 0x51, 0x88, 0x5e, 0x42, 0xa,
+ 0x63, 0x33, 0x43, 0x44, 0xb7, 0xd2, 0x1e, 0xe,
+ 0x8b, 0xe9, 0xf7, 0x8b, 0xe8, 0xed, 0xe9, 0x12,
+ 0x91, 0xf7, 0x48, 0x2a, 0xec, 0xf7, 0x77, 0xec,
+ 0x13, 0xf4, 0x91, 0x16, 0xf7, 0x96, 0xe9, 0x3d,
+ 0xf7, 0x61, 0x6, 0xbd, 0xd5, 0xc2, 0x94, 0xa8,
+ 0x1b, 0xc3, 0x98, 0x6a, 0x69, 0x1f, 0xfb, 0x59,
+ 0x3d, 0x2d, 0xf7, 0x96, 0xe9, 0x38, 0xf7, 0x52,
+ 0x7, 0xd8, 0x71, 0xe5, 0xfb, 0x1f, 0x4e, 0x5b,
+ 0x75, 0x71, 0x59, 0x1e, 0xf7, 0x73, 0xfb, 0x48,
+ 0x2d, 0x7, 0x13, 0xec, 0xde, 0xfc, 0x4a, 0x6,
+ 0x13, 0xf4, 0x38, 0x6, 0xe, 0x8b, 0xea, 0xf7,
+ 0x92, 0xeb, 0xd1, 0xf7, 0x23, 0x12, 0xf7, 0x83,
+ 0xf7, 0x3, 0x29, 0xed, 0x13, 0xf0, 0xf7, 0x83,
+ 0xf8, 0x97, 0x79, 0xa, 0x6b, 0xa, 0xfb, 0x36,
+ 0xfd, 0x26, 0x15, 0xf8, 0x52, 0xea, 0xfb, 0x41,
+ 0xf7, 0xf2, 0xfb, 0x7f, 0x2b, 0x6, 0x13, 0xe8,
+ 0xf7, 0x1d, 0xfb, 0x92, 0xfb, 0x43, 0x6, 0xe,
+ 0xfb, 0x26, 0xe7, 0xf8, 0x37, 0xe6, 0xc5, 0xf7,
+ 0x24, 0x12, 0xf7, 0xf4, 0xf7, 0xa, 0x35, 0xf3,
+ 0x13, 0xf0, 0xf7, 0xf4, 0xf8, 0x96, 0x73, 0xa,
+ 0xfb, 0x6d, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5,
+ 0x81, 0xc2, 0xc4, 0x81, 0xc4, 0x1b, 0x13, 0xe8,
+ 0xf7, 0x63, 0x8c, 0xf7, 0x1b, 0xc6, 0x1f, 0xf8,
+ 0x2c, 0xfc, 0x2, 0x30, 0xf7, 0x9a, 0xfb, 0xcd,
+ 0x7, 0x46, 0x81, 0x66, 0x31, 0x55, 0x4d, 0x98,
+ 0x91, 0x6a, 0x1e, 0xe, 0x7c, 0xa, 0xe9, 0xe8,
+ 0xe9, 0x1, 0xec, 0xed, 0x3, 0x9c, 0x16, 0xf7,
+ 0x46, 0xf7, 0x3e, 0x6, 0xaf, 0xa2, 0xf7, 0xe,
+ 0x28, 0x5, 0x70, 0x2d, 0xf7, 0x94, 0xe9, 0xfb,
+ 0x0, 0x6, 0xfb, 0x41, 0xf7, 0x25, 0xf7, 0x37,
+ 0xf5, 0x5, 0xda, 0xe9, 0xfb, 0xb1, 0x2d, 0xd2,
+ 0x6, 0xfb, 0x1a, 0x39, 0x5, 0xf7, 0xff, 0xfb,
+ 0x46, 0x2d, 0xdb, 0xfc, 0x4a, 0x3b, 0x7, 0xe,
+ 0x8b, 0xe9, 0xf8, 0x4a, 0x40, 0xa, 0xf8, 0xa8,
+ 0xfb, 0x92, 0x2d, 0xf7, 0x2f, 0xfc, 0x4a, 0xfb,
+ 0x41, 0x6, 0xe, 0x90, 0xe9, 0xf7, 0x99, 0xe9,
+ 0x1, 0xc1, 0xe9, 0xf7, 0x3, 0xe6, 0xf7, 0x5,
+ 0xe7, 0x3, 0x73, 0x16, 0xf7, 0x8e, 0xe9, 0x3d,
+ 0xf7, 0x7b, 0x6, 0x9e, 0x9d, 0xa2, 0x9b, 0xa3,
+ 0x1b, 0xb1, 0x93, 0x6a, 0x77, 0x1f, 0xfb, 0xc7,
+ 0xf7, 0x38, 0xe9, 0x42, 0xf7, 0x73, 0x7, 0xad,
+ 0xa4, 0xa6, 0x94, 0x9c, 0x1b, 0xac, 0x96, 0x6d,
+ 0x81, 0x1f, 0xfb, 0xd4, 0xf7, 0x35, 0xe9, 0x46,
+ 0xf7, 0x72, 0x7, 0xd7, 0x5a, 0xc9, 0x38, 0x62,
+ 0x61, 0x79, 0x6c, 0x71, 0x1e, 0xb5, 0x72, 0x66,
+ 0x92, 0x73, 0x1b, 0x6c, 0x6d, 0x7f, 0x74, 0x78,
+ 0x1f, 0xa1, 0xfb, 0x40, 0x2d, 0xd9, 0xfb, 0x91,
+ 0x3d, 0x7, 0xe, 0x8b, 0xe9, 0xf7, 0x91, 0xe9,
+ 0x3b, 0xe8, 0x12, 0x98, 0xf7, 0x48, 0xf7, 0x75,
+ 0xea, 0x13, 0xb8, 0x9a, 0x16, 0xf7, 0x97, 0xe9,
+ 0x3a, 0xf7, 0x67, 0x6, 0xb7, 0xbd, 0xcf, 0x97,
+ 0xa9, 0x1b, 0xd1, 0x92, 0x55, 0x64, 0x1f, 0xfb,
+ 0x42, 0x46, 0x2d, 0xf7, 0x82, 0xe9, 0x41, 0xf7,
+ 0x42, 0x7, 0xf7, 0x12, 0x60, 0xc7, 0xfb, 0xc,
+ 0x52, 0x51, 0x79, 0x6f, 0x61, 0x1e, 0x13, 0xd0,
+ 0xac, 0xfb, 0x48, 0x2d, 0xde, 0xfb, 0x91, 0x3a,
+ 0x7, 0xe, 0x7c, 0xe9, 0xf7, 0xad, 0xe9, 0x4b,
+ 0xa, 0xa9, 0xf7, 0x6d, 0x15, 0xfb, 0x40, 0xf7,
+ 0x2f, 0x4f, 0xf7, 0x6, 0xf7, 0xe, 0xf7, 0x29,
+ 0xce, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x18, 0xdb,
+ 0xfb, 0x1f, 0xfb, 0x1d, 0xfb, 0x18, 0x3b, 0xfb,
+ 0x31, 0x1e, 0xef, 0x16, 0xe2, 0xd6, 0xc3, 0xe9,
+ 0xe7, 0xdb, 0x50, 0x37, 0x28, 0x36, 0x64, 0x34,
+ 0x3c, 0x31, 0xb2, 0xee, 0x1e, 0xe, 0xfb, 0x22,
+ 0xe3, 0xd6, 0xe2, 0xf7, 0x89, 0xe3, 0x40, 0xe3,
+ 0x12, 0x9c, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0xbd,
+ 0xeb, 0x13, 0xda, 0x9c, 0x55, 0x15, 0x33, 0xf7,
+ 0xcc, 0xe3, 0xfb, 0x1d, 0xf7, 0xe, 0x7, 0x7d,
+ 0xa1, 0xc1, 0x6a, 0xd9, 0x1b, 0xf7, 0x1f, 0xef,
+ 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xfb, 0x21, 0xcd,
+ 0x25, 0x56, 0x52, 0x7b, 0x6d, 0x63, 0x1f, 0x13,
+ 0xe6, 0xac, 0xfb, 0x46, 0x33, 0xde, 0xfc, 0x2b,
+ 0x7, 0x13, 0xda, 0xe6, 0xf7, 0xb8, 0x15, 0xf7,
+ 0x1, 0xf7, 0x4, 0x9e, 0xb4, 0xd9, 0xd1, 0x5e,
+ 0x38, 0x3c, 0x43, 0x58, 0x3e, 0x5f, 0xfb, 0x0,
+ 0xa4, 0xf4, 0x1e, 0xe, 0xf8, 0xda, 0x55, 0x15,
+ 0x33, 0xfb, 0xcc, 0xe3, 0xf7, 0x1d, 0xf7, 0xe,
+ 0x7, 0x7d, 0x75, 0x55, 0x6a, 0x3d, 0x1b, 0xfb,
+ 0x1f, 0x27, 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xf7,
+ 0x21, 0xcd, 0xf1, 0xc0, 0xc4, 0x7b, 0x6d, 0xb3,
+ 0x1f, 0xac, 0xf7, 0x46, 0x33, 0x38, 0xfc, 0x2b,
+ 0x7, 0x30, 0xf7, 0xb8, 0x15, 0xf7, 0x1, 0xfb,
+ 0x4, 0x9e, 0x62, 0x3d, 0x45, 0x5e, 0x38, 0x3c,
+ 0xd3, 0x58, 0xd8, 0xb7, 0xf7, 0x0, 0xa4, 0xf4,
+ 0x1e, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe9, 0x3b,
+ 0xe9, 0x12, 0xf7, 0x28, 0xee, 0x13, 0xb0, 0xac,
+ 0x16, 0xf8, 0x21, 0xe9, 0xfb, 0x4b, 0xf7, 0x35,
+ 0x6, 0xae, 0xba, 0xd1, 0xd1, 0xd6, 0x1b, 0xa5,
+ 0x8f, 0x81, 0x71, 0x8e, 0x1f, 0xe9, 0x99, 0x5,
+ 0xb3, 0x89, 0x77, 0xd7, 0x22, 0x1b, 0x41, 0x4b,
+ 0x5e, 0x63, 0x55, 0x1f, 0x13, 0xd0, 0xd2, 0xfb,
+ 0x6a, 0x2d, 0xf7, 0x7, 0xfb, 0x90, 0xfb, 0x7,
+ 0x7, 0xe, 0x7a, 0xeb, 0xeb, 0xe3, 0x9b, 0xf7,
+ 0x48, 0x2b, 0xeb, 0x12, 0xcd, 0xed, 0x36, 0xe0,
+ 0x36, 0xea, 0xf7, 0x84, 0xee, 0x40, 0xea, 0x13,
+ 0xe8, 0x80, 0xcd, 0x7a, 0x15, 0xed, 0xad, 0x6,
+ 0x72, 0xb9, 0xc1, 0x82, 0xc2, 0x1b, 0xf7, 0xb,
+ 0xea, 0xc4, 0xe6, 0xf5, 0x21, 0x9f, 0x35, 0x91,
+ 0x1f, 0x13, 0xd3, 0x0, 0x2b, 0x93, 0x44, 0x91,
+ 0xb2, 0x1a, 0xb5, 0xe5, 0x90, 0xa2, 0xb7, 0xc2,
+ 0x80, 0x72, 0xa7, 0x1e, 0x13, 0xe5, 0x0, 0x5b,
+ 0xee, 0xf7, 0x48, 0x28, 0x69, 0x7, 0xa0, 0x6e,
+ 0x50, 0x98, 0x5c, 0x1b, 0x2e, 0x20, 0x64, 0x25,
+ 0xfb, 0x12, 0xf7, 0x2a, 0x81, 0xd6, 0x84, 0x1f,
+ 0x13, 0xe8, 0x80, 0xaf, 0x88, 0xed, 0x8a, 0x63,
+ 0x1a, 0x69, 0x47, 0x79, 0x53, 0x44, 0x54, 0x96,
+ 0x9e, 0x73, 0x1e, 0x13, 0xe9, 0x0, 0xd0, 0x29,
+ 0x7, 0xe, 0x7c, 0xe6, 0xf7, 0x99, 0xe8, 0xf7,
+ 0x18, 0x77, 0x1, 0xf7, 0x11, 0xee, 0x3, 0xc4,
+ 0xf7, 0xe5, 0x15, 0xcf, 0xfb, 0x57, 0x6, 0xfb,
+ 0x1d, 0xf7, 0x0, 0x77, 0xd7, 0xdc, 0xdd, 0xab,
+ 0xa6, 0xd1, 0x1e, 0x7a, 0xe8, 0x5, 0x7a, 0x65,
+ 0xfb, 0x0, 0x5f, 0x47, 0x1b, 0x39, 0x86, 0xb7,
+ 0xb6, 0x1f, 0xf7, 0x42, 0xf7, 0x9e, 0xe8, 0xfb,
+ 0x9e, 0xf7, 0x18, 0x28, 0xfb, 0x18, 0x47, 0x7,
+ 0xe, 0x7c, 0xe7, 0x3c, 0xe9, 0xf7, 0x91, 0xe9,
+ 0x12, 0x9a, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0x22,
+ 0xf7, 0x42, 0x2b, 0xeb, 0x2b, 0xf7, 0x43, 0x13,
+ 0xb4, 0x9a, 0xf7, 0xed, 0x15, 0x13, 0xaa, 0xdb,
+ 0xfb, 0x4e, 0x6, 0xfb, 0x5, 0xd0, 0x4e, 0xf7,
+ 0x1, 0xc0, 0xc2, 0xa6, 0xa7, 0xa8, 0x1e, 0x13,
+ 0x71, 0x61, 0xf7, 0x43, 0xe9, 0x7, 0x13, 0x74,
+ 0x3c, 0xf7, 0xef, 0xfb, 0x42, 0x2d, 0x6, 0x13,
+ 0xb2, 0xd9, 0xfb, 0x56, 0x6, 0x6c, 0x69, 0x65,
+ 0x60, 0x4d, 0x1b, 0x38, 0x88, 0xc4, 0xa2, 0x1f,
+ 0xf7, 0xae, 0xfb, 0x43, 0x7, 0xe, 0xa0, 0x76,
+ 0xf7, 0xed, 0xe9, 0x1, 0xf7, 0x98, 0x16, 0xe3,
+ 0x6, 0xf7, 0x3c, 0xf7, 0xed, 0x5, 0xe0, 0xe9,
+ 0xfb, 0x86, 0x2d, 0xc8, 0x6, 0xfb, 0x7, 0xfb,
+ 0x82, 0xfb, 0x8, 0xf7, 0x82, 0x5, 0xcf, 0xe9,
+ 0xfb, 0x96, 0x2d, 0xe0, 0x6, 0xe, 0xa0, 0x76,
+ 0xf7, 0xed, 0xe9, 0x1, 0x79, 0xf7, 0x6d, 0xf7,
+ 0x64, 0xf7, 0x67, 0x3, 0xf7, 0x24, 0x16, 0xda,
+ 0x6, 0xd5, 0xf7, 0x68, 0xe1, 0xfb, 0x68, 0x5,
+ 0xd7, 0x6, 0xf7, 0x2, 0xf7, 0xed, 0x5, 0xbc,
+ 0xe9, 0xfb, 0x67, 0x2d, 0xd3, 0x6, 0x4f, 0xfb,
+ 0x57, 0x36, 0xf7, 0x6f, 0x5, 0x49, 0x6, 0x3d,
+ 0xfb, 0x6f, 0x4e, 0xf7, 0x57, 0x5, 0xd1, 0xe9,
+ 0xfb, 0x6d, 0x2d, 0xbc, 0x6, 0xe, 0x7c, 0xa,
+ 0xe9, 0x1, 0x91, 0x16, 0xf7, 0x91, 0xe9, 0x62,
+ 0x6, 0xda, 0xd8, 0xdd, 0x3e, 0x5, 0x64, 0x2d,
+ 0xf7, 0x92, 0xe9, 0x37, 0x6, 0xfb, 0x28, 0xf7,
+ 0x1c, 0xf7, 0x10, 0xf7, 0x7, 0x5, 0xdc, 0xe9,
+ 0xfb, 0x75, 0x2d, 0x9e, 0x6, 0x4f, 0x52, 0x49,
+ 0xc4, 0x5, 0xa1, 0xe9, 0xfb, 0x82, 0x2d, 0xe1,
+ 0x6, 0xf7, 0x14, 0xfb, 0x9, 0xfb, 0x22, 0xfb,
+ 0x1a, 0x5, 0x36, 0x6, 0xe, 0xfb, 0x22, 0xe3,
+ 0xf8, 0x29, 0xe3, 0x12, 0x13, 0xc0, 0xb4, 0x55,
+ 0x15, 0x33, 0xf7, 0xb4, 0xe3, 0x48, 0x7, 0xf7,
+ 0x9e, 0xf8, 0x29, 0x5, 0xd6, 0xe3, 0xfb, 0x80,
+ 0x33, 0xc3, 0x6, 0xfb, 0x14, 0xfb, 0x55, 0xfb,
+ 0x6, 0xf7, 0x55, 0x5, 0xc6, 0xe3, 0xfb, 0x86,
+ 0x33, 0xd7, 0x6, 0xf7, 0x3b, 0xfb, 0xa8, 0x35,
+ 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe9, 0x2d, 0xf7,
+ 0x51, 0xd4, 0xf7, 0x45, 0x2e, 0xe8, 0x12, 0xea,
+ 0xec, 0xf7, 0x7a, 0xec, 0x13, 0x6c, 0xdb, 0x16,
+ 0xf8, 0x4b, 0xf7, 0x51, 0x2a, 0x6, 0x13, 0xac,
+ 0x2c, 0xfb, 0x51, 0x7, 0xf7, 0xb2, 0xf7, 0xa9,
+ 0x5, 0xcf, 0xfc, 0x3c, 0xfb, 0x45, 0xec, 0x7,
+ 0x13, 0x9c, 0xdf, 0xf7, 0x41, 0x7, 0xfb, 0xb1,
+ 0xfb, 0xa6, 0x5, 0xe, 0xf7, 0x86, 0xe4, 0x3,
+ 0xf8, 0x6b, 0xfb, 0x88, 0x15, 0xe8, 0x7, 0x65,
+ 0x64, 0x8b, 0x95, 0x69, 0x1f, 0x75, 0x92, 0x84,
+ 0xa5, 0xa1, 0x1a, 0xf7, 0x28, 0x7, 0xd4, 0x6a,
+ 0xde, 0x4d, 0xae, 0x1e, 0xc9, 0xae, 0xac, 0xdc,
+ 0xd4, 0x1a, 0xf7, 0x28, 0x7, 0xa1, 0x92, 0xa5,
+ 0xa1, 0x92, 0x1e, 0x95, 0xad, 0xb2, 0x8b, 0xb1,
+ 0x1b, 0xe8, 0x7, 0x5b, 0x4f, 0x8b, 0x79, 0x5d,
+ 0x1f, 0x56, 0x76, 0x75, 0x52, 0x5c, 0x1a, 0xfb,
+ 0x9, 0x7, 0xfb, 0x0, 0x82, 0x49, 0x22, 0x7c,
+ 0x1e, 0x2d, 0x7, 0xf4, 0x7c, 0x94, 0x49, 0xfb,
+ 0x0, 0x1a, 0xfb, 0x9, 0x7, 0x5c, 0xa1, 0x52,
+ 0xc0, 0x76, 0x1e, 0x79, 0xb9, 0xc7, 0x8b, 0xbb,
+ 0x1b, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x6e,
+ 0xa, 0xfb, 0x8e, 0x15, 0xe5, 0xfa, 0x7c, 0x31,
+ 0x6, 0xe, 0xf7, 0xa0, 0xe4, 0x3, 0xf7, 0x14,
+ 0xfb, 0x2c, 0x15, 0x2f, 0x7, 0xbb, 0xc6, 0x8b,
+ 0x9d, 0xba, 0x1f, 0xbf, 0x9f, 0xa2, 0xc5, 0xba,
+ 0x1a, 0xf7, 0x9, 0x7, 0xf7, 0x0, 0x94, 0xcc,
+ 0xf4, 0x9b, 0x1e, 0xe9, 0x7, 0x22, 0x9b, 0x82,
+ 0xcc, 0xf7, 0x0, 0x1a, 0xf7, 0x9, 0x7, 0xba,
+ 0x75, 0xc5, 0x56, 0x9f, 0x1e, 0x9d, 0x5c, 0x50,
+ 0x8b, 0x5b, 0x1b, 0x2e, 0x7, 0xb2, 0xb0, 0x8b,
+ 0x81, 0xae, 0x1f, 0xa2, 0x84, 0x91, 0x72, 0x74,
+ 0x1a, 0xfb, 0x28, 0x7, 0x43, 0xac, 0x39, 0xc9,
+ 0x68, 0x1e, 0x4d, 0x68, 0x6a, 0x38, 0x42, 0x1a,
+ 0xfb, 0x28, 0x7, 0x74, 0x85, 0x72, 0x74, 0x84,
+ 0x1e, 0x80, 0x67, 0x67, 0x8b, 0x64, 0x1b, 0xe,
+ 0xf7, 0x45, 0xef, 0x62, 0xf0, 0x12, 0x13, 0x40,
+ 0xd1, 0xf7, 0x67, 0x15, 0xcc, 0x51, 0x5, 0xab,
+ 0xa0, 0x9d, 0xbe, 0xb3, 0x1b, 0xa8, 0xb2, 0x75,
+ 0x7a, 0xb2, 0x1f, 0x13, 0x80, 0x80, 0xa4, 0xa5,
+ 0x82, 0xa3, 0x1b, 0xb4, 0xc3, 0xaf, 0xe0, 0xaf,
+ 0x1f, 0x4e, 0xc5, 0x5, 0x75, 0x7d, 0x6b, 0x52,
+ 0x71, 0x1b, 0x73, 0x74, 0x97, 0x99, 0x71, 0x1f,
+ 0x13, 0x40, 0x9b, 0x6b, 0x67, 0x9d, 0x5d, 0x1b,
+ 0x47, 0x65, 0x45, 0x53, 0x6a, 0x1f, 0xe, 0xfb,
+ 0x11, 0x76, 0xf8, 0x4a, 0xf7, 0x31, 0x1, 0xf7,
+ 0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x74, 0xfb, 0x26,
+ 0x15, 0xf7, 0x2b, 0x6, 0x77, 0xf8, 0x22, 0x5,
+ 0xfb, 0x2, 0x6, 0x60, 0xf7, 0xa, 0x15, 0x5f,
+ 0xb7, 0x69, 0xc1, 0xc1, 0xb7, 0xad, 0xb7, 0xb7,
+ 0x5f, 0xae, 0x55, 0x55, 0x5f, 0x68, 0x5f, 0x1e,
+ 0xe, 0x6f, 0x76, 0x1, 0xd5, 0xec, 0xd9, 0xec,
+ 0xc8, 0xe9, 0x3, 0xf7, 0x8d, 0x5a, 0x15, 0xec,
+ 0xf7, 0x14, 0x6, 0xce, 0x95, 0xc5, 0xaf, 0xc2,
+ 0xb2, 0x5e, 0xd2, 0x18, 0x61, 0x41, 0x60, 0x73,
+ 0x4a, 0x1b, 0xfb, 0x6, 0x7d, 0xe7, 0xa2, 0xc9,
+ 0xc0, 0xca, 0xda, 0xaf, 0xb1, 0x7c, 0x7a, 0xa9,
+ 0x1f, 0x54, 0xe9, 0xf7, 0x44, 0x2d, 0x6c, 0x7,
+ 0x7b, 0x97, 0x72, 0x94, 0x77, 0x8e, 0x8, 0xf2,
+ 0x2a, 0x25, 0x7, 0xfb, 0xb, 0x72, 0x53, 0x2e,
+ 0x31, 0x1a, 0xfb, 0x24, 0xf7, 0x12, 0x5c, 0xbc,
+ 0x7e, 0x1e, 0xe, 0x84, 0x76, 0xf7, 0xb9, 0xe8,
+ 0xf7, 0x34, 0xe8, 0x12, 0xf7, 0xf, 0xe9, 0x5d,
+ 0xec, 0x13, 0xe8, 0xdf, 0xaf, 0x15, 0xbe, 0x4b,
+ 0x5, 0x93, 0x97, 0xce, 0xb0, 0xbb, 0x1b, 0xa1,
+ 0xac, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, 0xa3,
+ 0x85, 0x9f, 0x1b, 0xd3, 0xb2, 0xb6, 0x71, 0xa,
+ 0x70, 0x79, 0x64, 0xa, 0x75, 0x94, 0x7c, 0x1b,
+ 0x78, 0x61, 0x84, 0x85, 0x7f, 0x1f, 0x9f, 0xac,
+ 0x9b, 0xab, 0xae, 0x1a, 0xa1, 0x8b, 0xa3, 0x84,
+ 0xa5, 0x1e, 0xf7, 0x5f, 0xd8, 0xfb, 0x74, 0x6,
+ 0x13, 0xf0, 0x7f, 0xa4, 0x86, 0xb4, 0xa2, 0x6c,
+ 0xa, 0xbd, 0x7c, 0x5e, 0xa0, 0x1f, 0xd5, 0xb9,
+ 0x5, 0xb9, 0x70, 0x5d, 0xc8, 0x63, 0xa, 0x76,
+ 0x8f, 0x66, 0x93, 0x77, 0x1e, 0x3d, 0x3e, 0xef,
+ 0x6, 0x13, 0xe8, 0x92, 0x76, 0x8c, 0x76, 0x75,
+ 0x1a, 0x8a, 0x49, 0x66, 0x49, 0x60, 0x6a, 0x8,
+ 0xe, 0xcf, 0xe3, 0xf7, 0x92, 0xe3, 0x1, 0xdc,
+ 0xe5, 0xf7, 0x97, 0xe5, 0x3, 0xc1, 0xf5, 0x15,
+ 0xc8, 0x52, 0xc8, 0xc4, 0x5, 0x71, 0xae, 0xb8,
+ 0x7f, 0xb9, 0x1b, 0xb8, 0xb7, 0x98, 0xa5, 0xad,
+ 0x1f, 0xc9, 0x51, 0xc6, 0xc6, 0x4c, 0xc5, 0x5,
+ 0xa3, 0xaa, 0x98, 0xb5, 0xb5, 0x1a, 0xb7, 0x7f,
+ 0xb7, 0x72, 0xac, 0x1e, 0xca, 0xc5, 0x51, 0xc4,
+ 0x4e, 0x50, 0x68, 0xa7, 0x5a, 0x98, 0x5b, 0x8a,
+ 0x19, 0x5f, 0x8a, 0x60, 0x7f, 0x6a, 0x72, 0x4e,
+ 0xc4, 0x18, 0x4f, 0x50, 0xca, 0x51, 0x5, 0x73,
+ 0x6a, 0x7f, 0x60, 0x61, 0x1a, 0x61, 0x97, 0x60,
+ 0xa4, 0x6b, 0x1e, 0xc0, 0xf7, 0xa, 0x15, 0xd0,
+ 0xc4, 0xc5, 0xd3, 0xd3, 0xc5, 0x51, 0x46, 0x45,
+ 0x51, 0x52, 0x43, 0x43, 0x52, 0xc4, 0xd1, 0x1e,
+ 0xe, 0x8b, 0xe2, 0xc4, 0xc1, 0xb5, 0xc0, 0xf7,
+ 0x4a, 0xe2, 0x1, 0x95, 0xf7, 0x84, 0xf3, 0xf7,
+ 0x80, 0x3, 0xf7, 0x22, 0x16, 0xf7, 0xd3, 0xe2,
+ 0xfb, 0x5, 0xc3, 0xf7, 0x25, 0xc1, 0xfb, 0x25,
+ 0xb6, 0xf7, 0x25, 0xc0, 0xfb, 0x20, 0x6, 0xf7,
+ 0x34, 0xf7, 0x4a, 0x5, 0xd8, 0xe2, 0xfb, 0x80,
+ 0x34, 0xb7, 0x6, 0x2b, 0xfb, 0x7, 0x2a, 0xf7,
+ 0x7, 0x5, 0xb8, 0xe2, 0xfb, 0x84, 0x34, 0xdc,
+ 0x6, 0xf7, 0x36, 0xfb, 0x4a, 0x5, 0xfb, 0x24,
+ 0x56, 0xf7, 0x26, 0x60, 0xfb, 0x26, 0x55, 0xf7,
+ 0x26, 0x53, 0xfb, 0x5, 0x6, 0xe, 0xfb, 0x2e,
+ 0x76, 0xf9, 0xe6, 0x6e, 0xa, 0xf7, 0xb1, 0x15,
+ 0xe5, 0xf8, 0x1a, 0x31, 0x6, 0xfd, 0xe6, 0x4,
+ 0xe5, 0xf8, 0x1b, 0x31, 0x6, 0xe, 0x45, 0xe8,
+ 0x2e, 0xf7, 0x40, 0xf7, 0xd5, 0xf7, 0x40, 0xfb,
+ 0x1, 0xe9, 0x12, 0xe3, 0xf1, 0xf7, 0x60, 0xf1,
+ 0x13, 0x9c, 0xe3, 0x45, 0x15, 0xf7, 0x84, 0x6,
+ 0xe8, 0xcd, 0xa4, 0xd4, 0xb1, 0x7d, 0x9f, 0x75,
+ 0x9f, 0x1f, 0xa5, 0x96, 0xb3, 0xaa, 0xc1, 0x1a,
+ 0xaf, 0x74, 0xab, 0x6b, 0xa2, 0x1e, 0xfb, 0x91,
+ 0xf7, 0x41, 0x5, 0x8b, 0x86, 0x8e, 0x90, 0x1a,
+ 0x96, 0x98, 0x8c, 0xa2, 0x1e, 0xf7, 0x2e, 0x4c,
+ 0x6, 0x13, 0xac, 0xf1, 0xf7, 0x40, 0xfb, 0x88,
+ 0x6, 0x49, 0x36, 0x78, 0x26, 0x6e, 0xa0, 0x74,
+ 0xa1, 0x78, 0x1f, 0x73, 0x7b, 0x66, 0x72, 0x50,
+ 0x1a, 0x59, 0xa7, 0x71, 0xbb, 0x6b, 0x1e, 0xf7,
+ 0x5e, 0xfb, 0x1d, 0x5, 0xa1, 0x7d, 0x8e, 0x88,
+ 0x82, 0x1a, 0x82, 0x7e, 0x8a, 0x7a, 0x1e, 0xfb,
+ 0x3a, 0xda, 0x6, 0x13, 0x6c, 0x25, 0x6, 0xf7,
+ 0xac, 0xcc, 0x15, 0xfb, 0x37, 0xf7, 0x1, 0x5,
+ 0x80, 0x92, 0x82, 0x97, 0x97, 0x1a, 0xa0, 0xa5,
+ 0x95, 0x98, 0x92, 0x1e, 0xf7, 0x48, 0xfb, 0xd,
+ 0x5, 0x94, 0x86, 0x92, 0x83, 0x82, 0x1a, 0x71,
+ 0x68, 0x84, 0x7a, 0x89, 0x1e, 0xe, 0xf8, 0x79,
+ 0xf7, 0x20, 0x1, 0xf7, 0x14, 0xf7, 0x17, 0xde,
+ 0xf7, 0x16, 0x3, 0xf7, 0xea, 0xf8, 0x79, 0x15,
+ 0xf7, 0x16, 0xf7, 0x20, 0xfb, 0x16, 0x6, 0xfb,
+ 0x6a, 0xfb, 0x20, 0x15, 0xf7, 0x17, 0xf7, 0x20,
+ 0xfb, 0x17, 0x6, 0xe, 0x79, 0xb8, 0xe7, 0xb9,
+ 0xf7, 0x8d, 0xba, 0xd5, 0xb8, 0x1, 0x8b, 0xb8,
+ 0xf3, 0xb9, 0xf7, 0xfc, 0xb8, 0x3, 0xf7, 0xad,
+ 0x4, 0xfb, 0x39, 0xf7, 0x1a, 0xfb, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x3a, 0xf7, 0x1b, 0xf7, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x39, 0xfb, 0x1b, 0xf7, 0x1a, 0xfb,
+ 0x3a, 0xfb, 0x39, 0xfb, 0x1a, 0xfb, 0x1a, 0xfb,
+ 0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x21, 0xf7, 0x5,
+ 0xf7, 0x5, 0xf7, 0x21, 0xf7, 0x21, 0xf7, 0x7,
+ 0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x7,
+ 0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x5,
+ 0xf7, 0x5, 0xf7, 0x21, 0x1e, 0xf8, 0x9, 0x49,
+ 0x15, 0x71, 0x73, 0x61, 0x73, 0x64, 0x1b, 0x46,
+ 0x5a, 0xc7, 0xcc, 0xcd, 0xc0, 0xc5, 0xcb, 0xae,
+ 0xa7, 0x79, 0x75, 0xa1, 0x1f, 0xb1, 0xb2, 0x5,
+ 0xa8, 0x6a, 0x5f, 0x9e, 0x5e, 0x1b, 0x37, 0x3b,
+ 0x43, 0x29, 0x35, 0xcd, 0x35, 0xf2, 0xc4, 0xc9,
+ 0xb7, 0xa0, 0x9b, 0x1f, 0xe, 0xf7, 0x58, 0xde,
+ 0xf7, 0x71, 0xdb, 0x12, 0xf7, 0x27, 0xcf, 0xf7,
+ 0xd, 0xce, 0x48, 0xf7, 0x9, 0x13, 0xe8, 0xf7,
+ 0xe4, 0xf7, 0x60, 0x15, 0xf7, 0x9, 0xdd, 0x59,
+ 0x6, 0x13, 0xf0, 0xf7, 0x23, 0x7, 0xde, 0x86,
+ 0xcf, 0xfb, 0x8, 0x5c, 0x59, 0x7c, 0x77, 0x6d,
+ 0x1e, 0x9f, 0x47, 0x5, 0x99, 0xa5, 0xc6, 0x94,
+ 0xa2, 0x1b, 0xad, 0x9e, 0x7e, 0x62, 0x1f, 0x94,
+ 0x77, 0x75, 0x8e, 0x76, 0x1b, 0x24, 0x74, 0x3d,
+ 0x5b, 0x44, 0xb8, 0x4a, 0xce, 0xa7, 0xa7, 0xa0,
+ 0xa8, 0xa0, 0x1f, 0xf7, 0x12, 0x4, 0x63, 0x80,
+ 0x6b, 0x56, 0x67, 0x1b, 0x6d, 0x7f, 0xa4, 0x9d,
+ 0xb8, 0xb6, 0x95, 0xb1, 0x9a, 0x9a, 0x88, 0x89,
+ 0x95, 0x1f, 0xe, 0x7b, 0xa, 0xba, 0xf8, 0x8b,
+ 0x3, 0xf7, 0xa3, 0xf7, 0x98, 0x15, 0xf7, 0x77,
+ 0xfb, 0x52, 0xc1, 0xc9, 0xfb, 0x2d, 0xf7, 0x13,
+ 0xf7, 0x2b, 0xf7, 0x10, 0x54, 0xca, 0x5, 0xfc,
+ 0x54, 0xfb, 0x4e, 0x15, 0xf7, 0x6c, 0xfb, 0x52,
+ 0xc2, 0xc9, 0xfb, 0x28, 0xf7, 0x13, 0xf7, 0x26,
+ 0xf7, 0x10, 0x53, 0xca, 0x5, 0xe, 0xf7, 0x10,
+ 0x76, 0xf7, 0x5d, 0xf7, 0x1, 0x1, 0xf8, 0x45,
+ 0xeb, 0x3, 0xd2, 0xf7, 0xc4, 0x15, 0xf7, 0xfe,
+ 0xfb, 0x5d, 0xeb, 0xf7, 0xca, 0xfc, 0x5e, 0x6,
+ 0xe, 0x79, 0xb8, 0xf7, 0xf6, 0xb9, 0xf7, 0x0,
+ 0xb8, 0x1, 0x8b, 0xb8, 0xf7, 0x2f, 0xbb, 0xf7,
+ 0x5, 0xbd, 0xf7, 0x24, 0xb8, 0x3, 0xf7, 0xad,
+ 0x4, 0xfb, 0x39, 0xf7, 0x1b, 0xfb, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x3a, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x39, 0xfb, 0x1a, 0xf7, 0x1a, 0xfb,
+ 0x3a, 0xfb, 0x39, 0xfb, 0x1b, 0xfb, 0x1a, 0xfb,
+ 0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x20, 0xf7, 0x7,
+ 0xf7, 0x6, 0xf7, 0x20, 0xf7, 0x22, 0xf7, 0x5,
+ 0xfb, 0x6, 0xfb, 0x20, 0xfb, 0x20, 0xfb, 0x5,
+ 0xfb, 0x6, 0xfb, 0x22, 0xfb, 0x20, 0xfb, 0x7,
+ 0xf7, 0x6, 0xf7, 0x20, 0x1e, 0xf7, 0x2f, 0xfb,
+ 0x27, 0x15, 0xbb, 0xf7, 0x8, 0xc1, 0x6, 0xbe,
+ 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x54, 0xf7, 0x13,
+ 0x5, 0x9e, 0x91, 0xaf, 0xa4, 0xc7, 0x1a, 0xed,
+ 0x42, 0x86, 0xfb, 0x1e, 0x8d, 0x1e, 0xbb, 0xfb,
+ 0x29, 0x15, 0xf2, 0x7, 0xde, 0xa9, 0x83, 0x5f,
+ 0x5f, 0x64, 0x84, 0x41, 0x1f, 0xe, 0xf8, 0x8d,
+ 0xdb, 0x1, 0xe3, 0xf8, 0x3c, 0x3, 0xe3, 0xf8,
+ 0x8d, 0x15, 0xf8, 0x3c, 0xdb, 0xfc, 0x3c, 0x6,
+ 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1,
+ 0xf5, 0xea, 0xf7, 0x5b, 0xe9, 0x3, 0xf5, 0xf8,
+ 0x41, 0x15, 0x24, 0xe1, 0x38, 0xf7, 0x0, 0xf7,
+ 0x1, 0xe0, 0xde, 0xf2, 0xf3, 0x36, 0xde, 0xfb,
+ 0x1, 0xfb, 0x0, 0x35, 0x38, 0x23, 0x1e, 0xea,
+ 0x16, 0xc1, 0xb6, 0xb5, 0xc3, 0xc4, 0xb6, 0x61,
+ 0x55, 0x56, 0x60, 0x61, 0x52, 0x53, 0x60, 0xb5,
+ 0xc0, 0x1e, 0xe, 0xa3, 0xdc, 0xf7, 0x4a, 0xe3,
+ 0xf7, 0x20, 0x67, 0xa, 0xeb, 0x3, 0xd2, 0xf7,
+ 0xb3, 0x15, 0xf7, 0x48, 0xfb, 0x27, 0xeb, 0xf7,
+ 0x27, 0xf7, 0x4a, 0xe3, 0xfb, 0x4a, 0xf7, 0x20,
+ 0x2b, 0xfb, 0x20, 0xfb, 0x48, 0x6, 0xfb, 0xf3,
+ 0x4, 0xf8, 0x5e, 0xdc, 0xfc, 0x5e, 0x6, 0xe,
+ 0xf7, 0x7a, 0xd6, 0xf7, 0x39, 0xf7, 0x26, 0x3e,
+ 0xd8, 0x12, 0xf8, 0x0, 0xdd, 0x13, 0xb0, 0xf7,
+ 0x2d, 0xf7, 0x7a, 0x15, 0xf7, 0xb9, 0xd6, 0xfb,
+ 0x38, 0x6, 0xf7, 0x1, 0xe0, 0x5, 0xa7, 0xa0,
+ 0xa5, 0xb0, 0xb7, 0x1a, 0xae, 0x6e, 0xe4, 0xfb,
+ 0x5, 0x54, 0x57, 0x73, 0x56, 0x6c, 0x1e, 0x13,
+ 0xd0, 0x46, 0xde, 0x7, 0x13, 0xb0, 0xa1, 0x87,
+ 0xba, 0xc6, 0xa4, 0xaf, 0x82, 0x64, 0x78, 0x82,
+ 0x7c, 0x79, 0x7c, 0x1e, 0xfb, 0x4c, 0xfb, 0x27,
+ 0x5, 0xe, 0xf7, 0x72, 0xd6, 0xee, 0xd4, 0xf7,
+ 0x27, 0x77, 0x12, 0xf7, 0x83, 0xf7, 0x50, 0x3b,
+ 0xdb, 0x4e, 0xdc, 0x13, 0xe4, 0xf7, 0x2c, 0xf7,
+ 0x96, 0x15, 0x71, 0xcb, 0xb2, 0x81, 0xb3, 0x1b,
+ 0xe9, 0xc5, 0xc6, 0xce, 0xae, 0x7a, 0xae, 0x6d,
+ 0xa2, 0x1f, 0x13, 0xe8, 0x97, 0x97, 0x9a, 0xa1,
+ 0xab, 0x1a, 0xd7, 0x50, 0xac, 0x4a, 0x57, 0x54,
+ 0x78, 0x6a, 0x69, 0x1e, 0xb5, 0x4b, 0x5, 0x9d,
+ 0xaa, 0xaf, 0xa1, 0xaf, 0x1b, 0x9c, 0xa2, 0x84,
+ 0x70, 0x70, 0x75, 0x80, 0x70, 0x1f, 0x13, 0xf0,
+ 0x88, 0x7b, 0x8c, 0x63, 0x1b, 0x42, 0xce, 0x7,
+ 0x13, 0xe4, 0xb6, 0x9c, 0x74, 0x72, 0x6e, 0x73,
+ 0x75, 0x64, 0x1f, 0x5e, 0x8c, 0x66, 0x99, 0x67,
+ 0x9d, 0x8, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+ 0x77, 0x1, 0xf7, 0x4e, 0xf8, 0x90, 0x15, 0xf7,
+ 0x89, 0xcc, 0x6b, 0xe3, 0xfb, 0x7b, 0x24, 0x5,
+ 0xe, 0xfb, 0xd, 0x76, 0xf7, 0x36, 0xd9, 0x3d,
+ 0xe5, 0xf7, 0x83, 0xe5, 0x12, 0x9a, 0xf7, 0x45,
+ 0x2a, 0xec, 0xf7, 0x1c, 0xf7, 0x46, 0x2a, 0xec,
+ 0x2a, 0xf7, 0x44, 0x13, 0xd9, 0x0, 0xea, 0xfb,
+ 0x22, 0x15, 0xec, 0xf7, 0x51, 0x6, 0x77, 0x9e,
+ 0xaa, 0x83, 0xab, 0x1b, 0xc0, 0xc6, 0xa1, 0xa9,
+ 0xa2, 0x1f, 0x58, 0x7, 0x13, 0xb8, 0x80, 0xf7,
+ 0x44, 0xe5, 0x6, 0x13, 0xba, 0x0, 0x3c, 0xf7,
+ 0xdd, 0xfb, 0x46, 0x31, 0x6, 0x13, 0xd9, 0x0,
+ 0xdc, 0xfb, 0x56, 0x6, 0x6b, 0x71, 0x55, 0x72,
+ 0x5c, 0x1b, 0x5b, 0x61, 0xa0, 0xca, 0x1f, 0xf7,
+ 0x95, 0xfb, 0x45, 0x31, 0x7, 0x13, 0xd6, 0x0,
+ 0xdb, 0x6, 0xe, 0x5a, 0x76, 0xf9, 0x0, 0xa9,
+ 0x1, 0xf7, 0xd4, 0xc2, 0xeb, 0xc0, 0x3, 0xf7,
+ 0xd4, 0x45, 0x15, 0xc2, 0xf9, 0x0, 0xeb, 0xfd,
+ 0x0, 0xc0, 0xf9, 0x0, 0xc8, 0xa9, 0xfb, 0x98,
+ 0x6, 0xfb, 0x60, 0x21, 0x4f, 0xfb, 0xc, 0xfb,
+ 0x2, 0xf5, 0x57, 0xf7, 0x5b, 0x8a, 0x1f, 0xe,
+ 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7, 0x58, 0xf7,
+ 0x96, 0x15, 0x58, 0xba, 0x61, 0xc4, 0xc4, 0xba,
+ 0xb5, 0xbe, 0xbe, 0x5c, 0xb5, 0x52, 0x52, 0x5c,
+ 0x61, 0x58, 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7,
+ 0x62, 0x77, 0x12, 0xf7, 0x91, 0x16, 0x80, 0x2d,
+ 0x5, 0x8f, 0x92, 0x9a, 0x8d, 0x99, 0x1b, 0x9d,
+ 0x9b, 0x85, 0x77, 0x7d, 0x7e, 0x83, 0x7b, 0x1f,
+ 0x13, 0xc0, 0x7c, 0x74, 0x90, 0x94, 0x82, 0x1f,
+ 0x70, 0x53, 0x5, 0x79, 0xa4, 0xa6, 0x81, 0xa9,
+ 0x1b, 0xc9, 0xb1, 0xb8, 0xc2, 0xc8, 0x60, 0x9a,
+ 0x7b, 0x8f, 0x1f, 0xa5, 0x7, 0xe, 0xf7, 0x7a,
+ 0xd8, 0xf7, 0xc9, 0x77, 0x12, 0xf7, 0x3a, 0xf7,
+ 0x45, 0x3b, 0xdb, 0x13, 0xe0, 0xf7, 0x2d, 0xf7,
+ 0x7a, 0x15, 0xf7, 0xba, 0xd8, 0x23, 0xf7, 0xc9,
+ 0x6, 0xfb, 0x45, 0x75, 0x5, 0x3f, 0x7, 0x13,
+ 0xd0, 0xec, 0x91, 0x5, 0xfb, 0x6d, 0xfb, 0x2,
+ 0x7, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+ 0x1, 0xf7, 0x27, 0xcf, 0xf7, 0x3f, 0xce, 0x3,
+ 0xf7, 0x27, 0xf8, 0x18, 0x15, 0x21, 0xca, 0x35,
+ 0xe7, 0xda, 0xd3, 0xd6, 0xf7, 0x9, 0xe9, 0x53,
+ 0xed, 0x29, 0x2a, 0x54, 0x24, 0x32, 0x1e, 0xcf,
+ 0x89, 0x15, 0xbe, 0xa7, 0xc7, 0xc5, 0xc5, 0xa6,
+ 0x4c, 0x5d, 0x49, 0x66, 0x60, 0x5b, 0x53, 0x6d,
+ 0xbe, 0xc3, 0x1e, 0xe, 0x7b, 0xa, 0xbc, 0xf8,
+ 0x8b, 0x3, 0xf0, 0xd1, 0x15, 0xf7, 0x77, 0xf7,
+ 0x52, 0xfb, 0x74, 0xf7, 0x4e, 0x54, 0x4c, 0xf7,
+ 0x2b, 0xfb, 0x10, 0xfb, 0x2d, 0xfb, 0x13, 0x5,
+ 0xf7, 0xb5, 0x4d, 0x15, 0xf7, 0x6c, 0xf7, 0x52,
+ 0xfb, 0x69, 0xf7, 0x4e, 0x53, 0x4c, 0xf7, 0x26,
+ 0xfb, 0x10, 0xfb, 0x28, 0xfb, 0x13, 0x5, 0xe,
+ 0x64, 0x76, 0xa2, 0xc4, 0x5a, 0x76, 0xf7, 0x6,
+ 0xca, 0xf7, 0x43, 0xd0, 0x8b, 0xf7, 0x4f, 0xe1,
+ 0x77, 0x12, 0xbf, 0xd5, 0xf8, 0x8, 0xd7, 0x13,
+ 0xdf, 0x80, 0xf7, 0xf0, 0xcb, 0x15, 0xf7, 0x2a,
+ 0x5f, 0x3f, 0x52, 0xf7, 0x59, 0xc4, 0x5e, 0xb7,
+ 0xb8, 0xca, 0x5e, 0xf7, 0x41, 0x42, 0x6, 0xfb,
+ 0x2d, 0xfb, 0x52, 0x5, 0xe3, 0x9c, 0x15, 0xc9,
+ 0xd7, 0x5, 0x3f, 0x7, 0xfc, 0x71, 0xfb, 0x10,
+ 0x15, 0x13, 0x3f, 0x80, 0x65, 0xa, 0x50, 0xc6,
+ 0x5, 0xfd, 0x12, 0xfb, 0xea, 0x15, 0xf7, 0xa0,
+ 0xd0, 0x2d, 0xf7, 0xa4, 0x6, 0xfb, 0x37, 0x78,
+ 0x5, 0x47, 0x7, 0xe4, 0x90, 0x5, 0xfb, 0x52,
+ 0x27, 0x7, 0xe, 0x51, 0xce, 0xf7, 0x33, 0xf7,
+ 0x16, 0x47, 0xcf, 0x8a, 0xd1, 0x8b, 0xf7, 0x52,
+ 0xe2, 0x77, 0xb0, 0x77, 0x12, 0xbc, 0xd1, 0x13,
+ 0xcb, 0xf8, 0x20, 0x97, 0x15, 0x51, 0xf7, 0x90,
+ 0xce, 0xfb, 0x22, 0x7, 0xf7, 0xa, 0xeb, 0xa2,
+ 0xaa, 0xb3, 0x1a, 0xa9, 0x71, 0xdb, 0x29, 0x5d,
+ 0x62, 0x75, 0x67, 0x6d, 0x1e, 0x43, 0xd2, 0x7,
+ 0x13, 0xab, 0x9e, 0x87, 0xb6, 0xbd, 0xa1, 0xac,
+ 0x82, 0x69, 0x79, 0x82, 0x7e, 0xfb, 0x41, 0xfb,
+ 0x24, 0x1e, 0x13, 0x9b, 0xfc, 0x4f, 0xf7, 0xb1,
+ 0x15, 0xf7, 0x91, 0xd1, 0x34, 0xf7, 0xa8, 0x6,
+ 0x13, 0x9d, 0xfb, 0x2e, 0x78, 0x5, 0x46, 0x7,
+ 0xdf, 0x90, 0x5, 0xfb, 0x55, 0x2b, 0x7, 0xc7,
+ 0xfc, 0x0, 0x15, 0x65, 0xa, 0x50, 0xc6, 0x5,
+ 0xe, 0x5e, 0xc4, 0x58, 0x76, 0xaa, 0x76, 0xf5,
+ 0xcb, 0xf7, 0x3c, 0xd0, 0xe5, 0xcb, 0xc8, 0xcd,
+ 0x91, 0x77, 0xb0, 0x77, 0x12, 0x13, 0x5e, 0x80,
+ 0xf7, 0xe7, 0xc3, 0x15, 0xf7, 0x29, 0x6, 0x13,
+ 0x9e, 0x80, 0x5f, 0x41, 0x52, 0xf7, 0x56, 0xc4,
+ 0x5d, 0xb7, 0xb9, 0xcb, 0x5d, 0xf7, 0x46, 0x45,
+ 0x7, 0xfb, 0x2d, 0xfb, 0x56, 0x5, 0xe3, 0x9b,
+ 0x15, 0xc8, 0xd9, 0x5, 0x3d, 0x7, 0xfc, 0xa8,
+ 0xf7, 0x5f, 0x15, 0x71, 0xc7, 0xaf, 0x82, 0xb3,
+ 0x1b, 0xe1, 0xbe, 0xc1, 0xc9, 0xaa, 0x7c, 0xaa,
+ 0x70, 0x9f, 0x1f, 0x96, 0x95, 0x98, 0xa0, 0xa9,
+ 0x1a, 0xc9, 0x56, 0xa8, 0x4f, 0x5b, 0x57, 0x7b,
+ 0x6d, 0x6b, 0x1e, 0xb4, 0x56, 0x5, 0x9d, 0x99,
+ 0xad, 0x9a, 0xb0, 0x1b, 0xa4, 0x9f, 0x83, 0x79,
+ 0x71, 0x76, 0x82, 0x73, 0x1f, 0x55, 0x4b, 0xca,
+ 0x6, 0xb2, 0x9a, 0x76, 0x75, 0x71, 0x75, 0x76,
+ 0x69, 0x1f, 0x89, 0x6, 0x61, 0x8c, 0x69, 0x98,
+ 0x69, 0x9a, 0x8, 0xa8, 0xfc, 0x13, 0x15, 0x13,
+ 0x3e, 0x80, 0x65, 0xa, 0x5, 0x13, 0x5d, 0x0,
+ 0x50, 0xc6, 0x5, 0xe, 0xfb, 0x26, 0xe7, 0xf7,
+ 0xf1, 0xf7, 0x2e, 0x12, 0xed, 0xec, 0xba, 0xf7,
+ 0x44, 0x7c, 0xed, 0x13, 0xe8, 0xf7, 0xad, 0xf7,
+ 0x59, 0x15, 0x57, 0x7f, 0xfb, 0x17, 0x66, 0xfb,
+ 0xf, 0x1a, 0xfb, 0x2, 0xeb, 0x4e, 0xf7, 0xd,
+ 0xc2, 0xd9, 0x9a, 0x9f, 0xc0, 0x1e, 0xf7, 0x24,
+ 0x29, 0x3f, 0x7, 0x85, 0x6f, 0x6d, 0x86, 0x6e,
+ 0x1b, 0x48, 0x55, 0xa3, 0xc2, 0xd5, 0xe9, 0x9c,
+ 0xe4, 0x99, 0x1f, 0xf7, 0x13, 0x7, 0x13, 0x50,
+ 0x2a, 0x6, 0x13, 0xf0, 0x64, 0xf7, 0x7, 0x15,
+ 0x60, 0xb2, 0x69, 0xbc, 0x1e, 0x13, 0x50, 0xbc,
+ 0xb2, 0xad, 0xb6, 0xb6, 0x64, 0xad, 0x5a, 0x5a,
+ 0x64, 0x69, 0x60, 0x1f, 0xe, 0x8b, 0xe5, 0xcc,
+ 0xe5, 0xf7, 0x7a, 0xe5, 0xf7, 0x6f, 0x77, 0x44,
+ 0xa, 0xf7, 0x19, 0xf9, 0x3c, 0x15, 0xf7, 0xcf,
+ 0x40, 0xa5, 0xc5, 0xfb, 0xbe, 0xf7, 0xd, 0x5,
+ 0xfb, 0x4d, 0xfd, 0xa4, 0x22, 0xa, 0x8b, 0xe5,
+ 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xf7, 0x7c, 0x77,
+ 0x44, 0xa, 0x82, 0x16, 0x20, 0xa, 0xfb, 0x60,
+ 0xf7, 0xfc, 0x15, 0xf7, 0xd2, 0xd5, 0x62, 0xf4,
+ 0xfb, 0xbd, 0x6a, 0xa, 0xe, 0x8b, 0xe4, 0xcd,
+ 0xe4, 0xf7, 0x6d, 0xe4, 0xf7, 0x7a, 0x77, 0x44,
+ 0xa, 0xf7, 0x20, 0xf8, 0xef, 0x15, 0xf7, 0x2c,
+ 0xf1, 0xf7, 0x2b, 0x25, 0xc7, 0xaf, 0xfb, 0x36,
+ 0xf7, 0x21, 0x5, 0x2a, 0x6, 0xfb, 0x39, 0xfb,
+ 0x20, 0x5, 0x33, 0xfd, 0x14, 0x22, 0xa, 0x8b,
+ 0xe5, 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xc7, 0xde,
+ 0x74, 0xde, 0x8f, 0x77, 0x12, 0x82, 0xf7, 0x97,
+ 0xf4, 0xf7, 0x92, 0x13, 0xeb, 0xde, 0xf9, 0x10,
+ 0x15, 0xe3, 0x71, 0x5, 0xaf, 0x99, 0x98, 0xa5,
+ 0xa7, 0x1b, 0xaf, 0x9f, 0x78, 0x7b, 0xa4, 0x1f,
+ 0x13, 0xf7, 0x7e, 0x9f, 0xa1, 0x7f, 0xae, 0x1b,
+ 0xd9, 0xbd, 0xc6, 0xca, 0x9a, 0x1f, 0x35, 0xa4,
+ 0x5, 0x75, 0x84, 0x7d, 0x61, 0x66, 0x1b, 0x6d,
+ 0x76, 0x99, 0x9a, 0x75, 0x1f, 0x13, 0xeb, 0x9a,
+ 0x74, 0x73, 0x9b, 0x66, 0x1b, 0x38, 0x5e, 0x49,
+ 0x56, 0x7c, 0x1f, 0x2f, 0xfd, 0x10, 0x22, 0xa,
+ 0x8b, 0xe3, 0xcc, 0xe3, 0xf7, 0x69, 0xe3, 0xdf,
+ 0xf7, 0xe, 0x44, 0xa, 0xf7, 0xda, 0xf9, 0x10,
+ 0x15, 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb,
+ 0x4b, 0xfb, 0xe, 0x15, 0xf7, 0x5, 0xf7, 0xe,
+ 0xfb, 0x5, 0x6, 0xfb, 0x2c, 0xfd, 0x8a, 0x22,
+ 0xa, 0x8b, 0xe8, 0xcf, 0xe9, 0xf7, 0x7e, 0xe8,
+ 0x9e, 0xc9, 0xd7, 0xc9, 0x1, 0xf7, 0x4d, 0xcc,
+ 0xdb, 0xcb, 0x3, 0xf7, 0x4d, 0xf9, 0x51, 0x15,
+ 0x54, 0xba, 0x5e, 0xc5, 0xc4, 0xba, 0xb8, 0xc2,
+ 0xc2, 0x5c, 0xb8, 0x52, 0x51, 0x5c, 0x5e, 0x54,
+ 0x1e, 0xcd, 0x16, 0xa0, 0x9c, 0x9c, 0xa1, 0xa1,
+ 0x9d, 0x7a, 0x76, 0x76, 0x79, 0x7a, 0x75, 0x75,
+ 0x7a, 0x9c, 0xa0, 0x1e, 0xfb, 0x98, 0xfd, 0x51,
+ 0x22, 0xa, 0x8b, 0xe5, 0x31, 0xf7, 0x40, 0x7e,
+ 0xe6, 0x48, 0xf7, 0x50, 0x9d, 0xf7, 0x41, 0x31,
+ 0xe5, 0x12, 0xf7, 0xbe, 0xed, 0xb5, 0xda, 0x9d,
+ 0xdc, 0x13, 0xab, 0x80, 0x7c, 0x16, 0xf7, 0x89,
+ 0xe5, 0x3e, 0x6, 0xa9, 0xd0, 0x5, 0xf7, 0x7,
+ 0xfb, 0x33, 0xf7, 0xd2, 0x6, 0x13, 0x5b, 0x80,
+ 0xf7, 0x40, 0x3a, 0x7, 0x13, 0x97, 0x80, 0x39,
+ 0xfb, 0x1f, 0xf7, 0x22, 0xb5, 0x5a, 0xda, 0xf7,
+ 0x50, 0x3c, 0x5a, 0x61, 0xf7, 0x2a, 0xf7, 0x1f,
+ 0x7, 0x13, 0xab, 0x80, 0x38, 0xdc, 0xf7, 0x41,
+ 0xfc, 0x7b, 0x7, 0x13, 0xa7, 0x80, 0x31, 0xea,
+ 0x7, 0xfb, 0x40, 0xfc, 0x12, 0x5, 0x48, 0x6,
+ 0xf7, 0x83, 0xf7, 0x34, 0x15, 0xd5, 0xf7, 0x39,
+ 0x5, 0xfb, 0x39, 0x7, 0xe, 0xfb, 0x4d, 0x76,
+ 0xf7, 0x54, 0xe7, 0xf8, 0x2e, 0xe7, 0x1, 0xaa,
+ 0xec, 0xf7, 0x16, 0xf7, 0x22, 0xcb, 0xec, 0x3,
+ 0xf7, 0x9b, 0x82, 0x15, 0x82, 0x2e, 0x5, 0x8e,
+ 0x98, 0x9f, 0x8e, 0x97, 0x1b, 0x94, 0x99, 0x84,
+ 0x7f, 0x7c, 0x80, 0x84, 0x7d, 0x7d, 0x79, 0x91,
+ 0x95, 0x7d, 0x1f, 0x6f, 0x52, 0x5, 0x71, 0xac,
+ 0xa0, 0x89, 0xa1, 0x1b, 0xc2, 0xb9, 0xac, 0xca,
+ 0x98, 0x8b, 0xc3, 0x4f, 0x99, 0x1f, 0x8c, 0x98,
+ 0xe3, 0x8f, 0xcf, 0xb2, 0xd3, 0xb9, 0x19, 0x52,
+ 0xcf, 0x5, 0x72, 0x60, 0x4a, 0x63, 0x36, 0x1b,
+ 0xfb, 0x21, 0x59, 0xf7, 0x15, 0xd7, 0xf7, 0x2f,
+ 0xf7, 0x6, 0xbd, 0xd7, 0xc1, 0xbd, 0x78, 0x71,
+ 0xb5, 0x1f, 0x21, 0xec, 0xf7, 0x87, 0x2a, 0x60,
+ 0x7, 0xa4, 0x6a, 0x55, 0x9d, 0x4e, 0x1b, 0xfb,
+ 0x1e, 0xfb, 0x27, 0x2a, 0xfb, 0x5e, 0xfb, 0x21,
+ 0xea, 0xfb, 0x13, 0xf7, 0x1d, 0x75, 0x1f, 0xe,
+ 0x48, 0xa, 0xc1, 0xed, 0x3, 0xb1, 0x16, 0x35,
+ 0xa, 0xf6, 0xf8, 0xe2, 0x15, 0xf7, 0xd2, 0x40,
+ 0xa6, 0x77, 0xa, 0x48, 0xa, 0xbf, 0xee, 0x3,
+ 0xb1, 0x16, 0xf8, 0xa5, 0x6, 0x8a, 0xf7, 0x5e,
+ 0x5, 0x28, 0xfb, 0x4, 0xfb, 0x91, 0x38, 0xa,
+ 0xf7, 0x91, 0xfb, 0x6, 0xee, 0xf7, 0x60, 0xfc,
+ 0xa1, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xf7,
+ 0x2b, 0xf8, 0x97, 0x15, 0xf7, 0xd8, 0xd5, 0x61,
+ 0xf4, 0xfb, 0xc3, 0x6a, 0xa, 0xe, 0x8b, 0xe4,
+ 0xf7, 0x26, 0xe4, 0xf7, 0x1d, 0xe4, 0xf7, 0x7a,
+ 0x77, 0x1, 0xf7, 0x9, 0xec, 0xf1, 0xee, 0xc0,
+ 0xee, 0x3, 0xf7, 0x2b, 0xf8, 0xef, 0x15, 0xf7,
+ 0x2d, 0xf1, 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb,
+ 0x37, 0xf7, 0x21, 0x5, 0x27, 0x6, 0xfb, 0x3b,
+ 0xfb, 0x20, 0x5, 0x59, 0xfd, 0x14, 0x15, 0x35,
+ 0xa, 0xe, 0x8b, 0xe3, 0xf7, 0x24, 0xe2, 0xf7,
+ 0x1b, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, 0x9,
+ 0xec, 0x4f, 0xf7, 0x6, 0xbb, 0xee, 0x40, 0xf7,
+ 0x4, 0x9c, 0xed, 0x13, 0xf5, 0x80, 0xf7, 0xe8,
+ 0xf9, 0x10, 0x15, 0xf7, 0x4, 0xf7, 0xe, 0xfb,
+ 0x4, 0x56, 0xa, 0xfb, 0x8, 0xfd, 0x8a, 0x15,
+ 0xf8, 0xa5, 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x6,
+ 0x13, 0xfa, 0x80, 0x2d, 0xa, 0xe, 0x8b, 0xe5,
+ 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+ 0xd8, 0x16, 0x31, 0xa, 0xcd, 0xf8, 0xe2, 0x15,
+ 0xf7, 0xd4, 0x40, 0xa5, 0x77, 0xa, 0x8b, 0xe5,
+ 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+ 0xf7, 0x50, 0xf8, 0xf1, 0x15, 0xf7, 0xd9, 0xd5,
+ 0x60, 0xf4, 0xfb, 0xc2, 0x6a, 0xa, 0x30, 0xfd,
+ 0x2c, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xe4, 0xf8,
+ 0x8, 0xe4, 0xf7, 0x7a, 0x67, 0xa, 0xef, 0x3,
+ 0xf7, 0x29, 0xf8, 0xef, 0x15, 0xf7, 0x2e, 0xf1,
+ 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x38, 0xf7,
+ 0x21, 0x5, 0x28, 0x6, 0xfb, 0x3c, 0xfb, 0x20,
+ 0x5, 0x82, 0xfd, 0x14, 0x15, 0x31, 0xa, 0xe,
+ 0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xdf, 0xf7, 0xe,
+ 0x12, 0xf7, 0x2d, 0xf7, 0x6, 0x7c, 0xef, 0x7e,
+ 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xe7, 0xf9, 0x10,
+ 0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x56,
+ 0xa, 0x3f, 0xfd, 0x8a, 0x15, 0xf8, 0x52, 0xe5,
+ 0x6, 0x13, 0xe8, 0x30, 0xa, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf0,
+ 0xeb, 0xf7, 0xb5, 0xeb, 0x3, 0x9d, 0x16, 0xf7,
+ 0xa1, 0x6, 0xf7, 0x2f, 0xf7, 0x20, 0xce, 0xf7,
+ 0x75, 0xf7, 0x39, 0x39, 0xf4, 0xfb, 0x4e, 0x1f,
+ 0xfb, 0xbc, 0x30, 0xde, 0xfb, 0x31, 0x43, 0x48,
+ 0xd3, 0xfb, 0x30, 0x38, 0x6, 0xf7, 0x47, 0x16,
+ 0xf7, 0x30, 0xf7, 0x12, 0xce, 0xfb, 0x12, 0xf7,
+ 0x31, 0xf7, 0xb, 0x7, 0xf7, 0xf, 0xba, 0x38,
+ 0x27, 0xfb, 0x12, 0x46, 0x44, 0xfb, 0x1a, 0x1f,
+ 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe7, 0xc1, 0xdf,
+ 0x12, 0xd9, 0xe8, 0xf7, 0x97, 0xe8, 0x17, 0x8a,
+ 0x7f, 0x15, 0xf7, 0x99, 0xe7, 0x32, 0xf7, 0xd6,
+ 0x6, 0xf7, 0x9b, 0xfc, 0x32, 0x5, 0xe4, 0xf8,
+ 0x79, 0xd9, 0xe7, 0xfb, 0x9e, 0x2f, 0xea, 0xfb,
+ 0xcb, 0x6, 0xfb, 0x8b, 0xf8, 0x27, 0x5, 0xfb,
+ 0x4c, 0x2f, 0xda, 0xfc, 0x1d, 0x3c, 0x6, 0xe8,
+ 0xf8, 0xc7, 0x15, 0xe0, 0x71, 0x5, 0xaf, 0x9a,
+ 0x97, 0xa6, 0xa7, 0x1b, 0xb2, 0x9f, 0x79, 0x7a,
+ 0xa2, 0x1f, 0x13, 0x60, 0x7d, 0x9e, 0x9f, 0x7f,
+ 0xac, 0x1b, 0xd7, 0xbb, 0xc7, 0xcb, 0x9a, 0x1f,
+ 0x38, 0xa5, 0x5, 0x75, 0x84, 0x7c, 0x5f, 0x68,
+ 0x1b, 0x6f, 0x7b, 0x99, 0x99, 0x79, 0x1f, 0x9b,
+ 0x77, 0x73, 0x9c, 0x5c, 0x1b, 0x3a, 0x5f, 0x48,
+ 0x55, 0x7c, 0x1f, 0xe, 0x61, 0xa, 0xf7, 0x72,
+ 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x2f, 0xa, 0xf7,
+ 0x2b, 0x2e, 0xf7, 0x1f, 0x26, 0xa, 0xa3, 0xf8,
+ 0x2a, 0x15, 0xf7, 0xd0, 0x40, 0xa5, 0xc5, 0xfb,
+ 0xbf, 0xf7, 0xe, 0x5, 0xe, 0x61, 0xa, 0xf7,
+ 0x72, 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x25, 0xa,
+ 0xd0, 0xf7, 0xdf, 0x15, 0xf7, 0xd4, 0xd5, 0x61,
+ 0xf5, 0xfb, 0xbe, 0xfb, 0xd, 0x5, 0xe, 0x61,
+ 0xa, 0xf7, 0x6e, 0x54, 0xa, 0xf7, 0x2b, 0xf8,
+ 0xee, 0x15, 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, 0x24,
+ 0xc6, 0xaf, 0xfb, 0x35, 0xf7, 0x22, 0x5, 0x29,
+ 0x6, 0xfb, 0x3a, 0xfb, 0x21, 0x5, 0x48, 0xfc,
+ 0x5, 0x25, 0xa, 0xe, 0x61, 0xa, 0xbb, 0xdf,
+ 0x73, 0xdf, 0x90, 0x77, 0x12, 0xa1, 0xed, 0xf7,
+ 0xff, 0xea, 0x13, 0xd6, 0xe7, 0xf9, 0xe, 0x15,
+ 0xe3, 0x71, 0x5, 0xae, 0x99, 0x99, 0xa6, 0xa6,
+ 0x1b, 0xac, 0x9e, 0x7d, 0x7d, 0xa0, 0x1f, 0x13,
+ 0xee, 0x7d, 0xa0, 0xa2, 0x79, 0xb6, 0x1b, 0xd9,
+ 0xbe, 0xc6, 0xcb, 0x9a, 0x1f, 0x36, 0xa5, 0x5,
+ 0x75, 0x83, 0x7c, 0x60, 0x66, 0x1b, 0x6a, 0x7c,
+ 0x9d, 0x9b, 0x74, 0x1f, 0x13, 0xd6, 0x98, 0x78,
+ 0x72, 0x98, 0x5f, 0x1b, 0x39, 0x5e, 0x49, 0x55,
+ 0x7b, 0x1f, 0x45, 0xfc, 0x0, 0x25, 0xa, 0xe,
+ 0x79, 0xe4, 0xf8, 0x15, 0xe6, 0xd8, 0xf7, 0x10,
+ 0x1, 0xa1, 0xed, 0xae, 0xf7, 0x5, 0xd1, 0xf7,
+ 0x5, 0xab, 0xea, 0x3, 0xf7, 0xe6, 0xf9, 0xe,
+ 0x53, 0xa, 0xfb, 0x4b, 0xfb, 0x10, 0x53, 0xa,
+ 0xfb, 0x19, 0xfc, 0x7c, 0x25, 0xa, 0xe, 0xc7,
+ 0x76, 0xf8, 0x4b, 0x77, 0x1, 0xdc, 0xef, 0x15,
+ 0xc8, 0x4e, 0xf7, 0x32, 0xf7, 0x33, 0xf7, 0x32,
+ 0xfb, 0x33, 0xc8, 0xc8, 0xfb, 0x31, 0xf7, 0x32,
+ 0xf7, 0x30, 0xf7, 0x30, 0x4f, 0xc8, 0xfb, 0x33,
+ 0xfb, 0x30, 0xfb, 0x32, 0xf7, 0x33, 0x4e, 0x4f,
+ 0xf7, 0x33, 0xfb, 0x33, 0x5, 0xe, 0x7c, 0xe6,
+ 0x3e, 0x76, 0xf8, 0x93, 0xe8, 0x8d, 0x77, 0x12,
+ 0xa1, 0xee, 0xf8, 0x2, 0xe6, 0x13, 0x6c, 0xad,
+ 0xa3, 0x15, 0xcc, 0x5d, 0xba, 0xbf, 0x5, 0x13,
+ 0x9c, 0x6d, 0xbb, 0xc1, 0x7c, 0xc2, 0x1b, 0xf2,
+ 0xf7, 0x40, 0xd1, 0xf7, 0x76, 0xce, 0x78, 0xd3,
+ 0x61, 0xc4, 0x1f, 0xbc, 0xc6, 0x4b, 0xbb, 0x62,
+ 0x58, 0x5, 0x13, 0xac, 0xa9, 0x61, 0x56, 0x9e,
+ 0x4c, 0x1b, 0xfb, 0x44, 0x8a, 0x22, 0xfb, 0x24,
+ 0xfb, 0x30, 0x1a, 0x38, 0xa3, 0x4b, 0xb2, 0x5a,
+ 0x1e, 0xcd, 0xda, 0x15, 0x77, 0xa9, 0x81, 0xb9,
+ 0xb4, 0x1a, 0xe9, 0xc7, 0xf7, 0x6, 0xf7, 0xe,
+ 0xb2, 0xab, 0x80, 0x7a, 0xa4, 0x1e, 0xfb, 0x54,
+ 0xfb, 0xfa, 0x15, 0xf7, 0x8a, 0xf7, 0xbd, 0x5,
+ 0xa1, 0x6a, 0x97, 0x54, 0x6c, 0x1a, 0x38, 0x58,
+ 0xfb, 0xe, 0xfb, 0x19, 0x65, 0x6a, 0x95, 0x9c,
+ 0x72, 0x1e, 0xe, 0x4f, 0xa, 0xf7, 0x20, 0xf9,
+ 0x3b, 0x15, 0xf7, 0xca, 0x41, 0xa5, 0xc5, 0xfb,
+ 0xb9, 0xf7, 0xd, 0x5, 0xfb, 0x47, 0xfb, 0xd8,
+ 0x15, 0x27, 0xa, 0x4f, 0xa, 0xf7, 0x4d, 0xf8,
+ 0xf1, 0x15, 0xf7, 0xcd, 0xd4, 0x62, 0xf5, 0xfb,
+ 0xb9, 0x6a, 0xa, 0xfb, 0x34, 0xfb, 0x60, 0x15,
+ 0x27, 0xa, 0x79, 0xe6, 0xf8, 0x16, 0xe5, 0xf7,
+ 0x7b, 0x52, 0xa, 0xf7, 0x26, 0xf8, 0xef, 0x15,
+ 0xf7, 0x2a, 0xf1, 0xf7, 0x28, 0x25, 0xc5, 0xae,
+ 0xfb, 0x32, 0xf7, 0x22, 0x5, 0x2c, 0x6, 0xfb,
+ 0x37, 0xfb, 0x21, 0x5, 0x39, 0xfb, 0x47, 0x15,
+ 0x27, 0xa, 0x79, 0xe4, 0xf8, 0x11, 0xe3, 0xe1,
+ 0xf7, 0xe, 0x12, 0xdf, 0xea, 0x6d, 0xf7, 0x3,
+ 0xd0, 0xf7, 0x2, 0x7c, 0xea, 0x13, 0xec, 0xf7,
+ 0xdd, 0xf9, 0x10, 0x15, 0xf7, 0x2, 0xf7, 0xe,
+ 0xfb, 0x2, 0x6, 0xfb, 0x48, 0xfb, 0xe, 0x15,
+ 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb, 0x25,
+ 0xfb, 0xbe, 0x15, 0x13, 0xf2, 0x27, 0xa, 0x8b,
+ 0xe5, 0xf8, 0x9, 0xe5, 0xf7, 0x7b, 0x77, 0x1,
+ 0xf7, 0x8e, 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7,
+ 0xeb, 0xe5, 0xfb, 0xe, 0xf7, 0x6, 0x6, 0xf7,
+ 0x34, 0xf7, 0x97, 0x5, 0xdc, 0xe5, 0xfb, 0x82,
+ 0x31, 0xc2, 0x6, 0x21, 0xfb, 0x41, 0x24, 0xf7,
+ 0x41, 0x5, 0xc0, 0xe5, 0xfb, 0x82, 0x31, 0xda,
+ 0x6, 0xf7, 0x34, 0xfb, 0x97, 0x5, 0xfb, 0x6,
+ 0xfb, 0x10, 0x7, 0xc9, 0xf8, 0x98, 0x15, 0xf7,
+ 0xce, 0xd4, 0x62, 0xf4, 0xfb, 0xbb, 0xfb, 0xb,
+ 0x5, 0xe, 0x8b, 0xe6, 0xbe, 0xdb, 0xf7, 0x9,
+ 0xdb, 0xbf, 0xe6, 0x1, 0xf7, 0x2a, 0xde, 0xf7,
+ 0x81, 0xdf, 0x3, 0xb8, 0x16, 0xf7, 0xc5, 0xe6,
+ 0xfb, 0x9, 0xbe, 0xf7, 0xf, 0x6, 0xee, 0xee,
+ 0x9c, 0xf7, 0x13, 0xf7, 0x29, 0xfb, 0x1d, 0x7b,
+ 0x28, 0x1f, 0x36, 0xbf, 0xf7, 0xb, 0xe6, 0xfb,
+ 0xc5, 0x30, 0xf2, 0xfc, 0x10, 0x22, 0x6, 0xf7,
+ 0x50, 0xf7, 0x17, 0x15, 0xf7, 0x9, 0xf7, 0x16,
+ 0x7, 0xb1, 0xd0, 0x8c, 0x50, 0x48, 0x47, 0x93,
+ 0x6a, 0x1f, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7,
+ 0x90, 0xe9, 0xea, 0xe9, 0x12, 0x98, 0xf7, 0x46,
+ 0x2b, 0xeb, 0xf7, 0x78, 0xeb, 0x72, 0xec, 0x13,
+ 0x7a, 0x98, 0x88, 0x15, 0xf7, 0x46, 0xf8, 0x56,
+ 0x6, 0xdc, 0xab, 0x8f, 0xcf, 0xd7, 0xbf, 0x87,
+ 0x70, 0x6e, 0x55, 0x7d, 0x62, 0x75, 0x1e, 0x66,
+ 0x77, 0x63, 0x6e, 0x5a, 0x1a, 0x38, 0xd4, 0x71,
+ 0xd9, 0x6f, 0x1e, 0x13, 0xb9, 0xab, 0x80, 0xc7,
+ 0x7f, 0x62, 0x1a, 0x69, 0x5a, 0x73, 0x4e, 0x66,
+ 0x42, 0x97, 0xa5, 0x73, 0x1e, 0x6e, 0x34, 0x5,
+ 0x67, 0xc8, 0xb3, 0x82, 0xc1, 0x1b, 0xf7, 0x18,
+ 0xde, 0xd4, 0xe0, 0xe5, 0x3d, 0xa2, 0x42, 0xa3,
+ 0x1f, 0x5b, 0x9b, 0x5f, 0x9b, 0xa4, 0x1a, 0xa1,
+ 0xaf, 0x9b, 0xb0, 0x9c, 0x1e, 0x13, 0xb6, 0xc6,
+ 0xa6, 0xb2, 0x9f, 0xcb, 0x1a, 0xd5, 0x51, 0xbc,
+ 0xfb, 0x40, 0xfb, 0x3a, 0x73, 0x4a, 0xfb, 0x10,
+ 0x1e, 0x13, 0xba, 0x39, 0x2d, 0x6, 0x13, 0x76,
+ 0xdd, 0xfb, 0x90, 0x6, 0x13, 0x7a, 0x39, 0x6,
+ 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa,
+ 0xf7, 0x13, 0xf8, 0xc1, 0x15, 0xf7, 0xd5, 0x3f,
+ 0xa2, 0xc5, 0xfb, 0xc2, 0xf7, 0xe, 0x5, 0x42,
+ 0xfb, 0xf8, 0x51, 0xa, 0xaa, 0x70, 0x5b, 0x8a,
+ 0x21, 0xa, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b,
+ 0xa, 0xf7, 0x42, 0xf8, 0x75, 0x15, 0xf7, 0xd5,
+ 0xd7, 0x61, 0xf3, 0xfb, 0xc2, 0xfb, 0xe, 0x5,
+ 0x54, 0xfb, 0x7e, 0x51, 0xa, 0xab, 0x70, 0x5b,
+ 0x89, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x74, 0x77,
+ 0x3b, 0xa, 0xf7, 0x1a, 0xf8, 0x72, 0x15, 0xf7,
+ 0x2c, 0xf3, 0xf7, 0x2d, 0x23, 0xc7, 0xae, 0xfb,
+ 0x36, 0xf7, 0x24, 0x5, 0x27, 0x6, 0xfb, 0x3a,
+ 0xfb, 0x23, 0x5, 0xa4, 0xfb, 0x65, 0x15, 0x9b,
+ 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0xbf, 0xa9, 0x70,
+ 0x5b, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x7, 0xe0,
+ 0x8e, 0x77, 0x34, 0xa, 0x13, 0xbb, 0x0, 0xf7,
+ 0x32, 0xf8, 0x7a, 0x15, 0xa3, 0x98, 0x94, 0xb1,
+ 0xb1, 0x1b, 0xa0, 0xa8, 0x7a, 0x7b, 0xa9, 0x1f,
+ 0x7d, 0xa5, 0xa6, 0x7f, 0xa4, 0x1b, 0xf2, 0xac,
+ 0xe3, 0xad, 0x96, 0x1f, 0x13, 0xb7, 0x0, 0x35,
+ 0xa4, 0x5, 0x61, 0x78, 0x80, 0x76, 0x6e, 0x1b,
+ 0x77, 0x74, 0x96, 0x98, 0x74, 0x1f, 0x13, 0xbb,
+ 0x0, 0x9c, 0x6d, 0x6b, 0x9e, 0x6c, 0x1b, 0x28,
+ 0x6c, 0x3d, 0x5f, 0x79, 0x1f, 0xa4, 0xfb, 0x62,
+ 0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0x3d,
+ 0xa, 0x13, 0x7a, 0x80, 0x4d, 0xa, 0x13, 0x7b,
+ 0x0, 0x2b, 0xa, 0x13, 0xbb, 0x0, 0x29, 0xa,
+ 0x39, 0xa, 0xcf, 0xf7, 0x10, 0x12, 0xab, 0xec,
+ 0x90, 0xf7, 0x5, 0xd4, 0xf7, 0x4, 0x60, 0xea,
+ 0x2c, 0xf7, 0x46, 0x13, 0xbf, 0x0, 0xf7, 0xd4,
+ 0xf8, 0x89, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0xfb,
+ 0x4, 0x6, 0xfb, 0x4e, 0xfb, 0x10, 0x53, 0xa,
+ 0x65, 0xfb, 0xd4, 0x3f, 0xa, 0x13, 0xbe, 0x80,
+ 0x3d, 0xa, 0x13, 0x7e, 0x40, 0x4d, 0xa, 0x13,
+ 0x7e, 0x80, 0x2b, 0xa, 0x13, 0xbe, 0x80, 0x29,
+ 0xa, 0x39, 0xa, 0xba, 0xf7, 0x5a, 0x3b, 0xa,
+ 0xf7, 0x46, 0xf8, 0xe0, 0x15, 0x55, 0xbc, 0x62,
+ 0xc8, 0xc8, 0xbc, 0xb4, 0xc1, 0xc1, 0x5a, 0xaf,
+ 0x4e, 0x4e, 0x5a, 0x67, 0x55, 0x1e, 0xcc, 0x16,
+ 0xa0, 0xa0, 0x95, 0xa3, 0xa4, 0x9e, 0x81, 0x76,
+ 0x75, 0x78, 0x7e, 0x72, 0x73, 0x76, 0x98, 0xa1,
+ 0x1e, 0xfb, 0x27, 0xfb, 0xaf, 0x51, 0xa, 0xa6,
+ 0x70, 0x5b, 0x8e, 0x21, 0xa, 0x7c, 0xed, 0x3f,
+ 0x76, 0xf7, 0x53, 0xe8, 0x40, 0xe6, 0xd5, 0xe9,
+ 0x12, 0x89, 0xec, 0xf7, 0x29, 0xee, 0x13, 0xae,
+ 0xf7, 0xb9, 0xc5, 0x15, 0x52, 0xa6, 0xc6, 0x7b,
+ 0xcc, 0x1b, 0xc0, 0xc6, 0x99, 0xa0, 0xba, 0x1f,
+ 0x6b, 0xe7, 0x5, 0x73, 0x4d, 0x62, 0x86, 0x74,
+ 0x1b, 0x37, 0x7d, 0xd1, 0xa0, 0x1f, 0x8e, 0xf7,
+ 0x89, 0x7, 0x8d, 0x9f, 0x8c, 0x9e, 0x9e, 0x1a,
+ 0xf7, 0x11, 0x5d, 0xe9, 0xfb, 0xa, 0x5f, 0x5b,
+ 0x78, 0x68, 0x6e, 0x1e, 0x7f, 0xb0, 0x5b, 0x9a,
+ 0x54, 0x8c, 0x48, 0x8c, 0x3e, 0x78, 0x6e, 0x74,
+ 0xa5, 0x39, 0x18, 0x9b, 0xb5, 0xc0, 0x99, 0xb6,
+ 0x1b, 0xbb, 0x97, 0x7a, 0x4d, 0x89, 0x1f, 0x13,
+ 0x5e, 0x8d, 0x73, 0x78, 0x8e, 0x66, 0x1b, 0xfb,
+ 0xb, 0x5c, 0x31, 0x44, 0x3d, 0xc4, 0x4e, 0xe1,
+ 0xd3, 0xbb, 0xb9, 0xa5, 0xab, 0x1f, 0x13, 0xae,
+ 0xbd, 0xf7, 0x68, 0x15, 0xc8, 0x8f, 0xb3, 0xa8,
+ 0xb5, 0x1b, 0xc4, 0x96, 0x47, 0x75, 0x8d, 0x1f,
+ 0xfb, 0x93, 0xfb, 0x1d, 0x15, 0x6e, 0x6f, 0x69,
+ 0x73, 0x62, 0x1b, 0x79, 0x6f, 0x98, 0xad, 0x1f,
+ 0x13, 0x9e, 0xb0, 0xa3, 0xaa, 0xc3, 0x9e, 0xa2,
+ 0x88, 0x84, 0xa6, 0x1e, 0xe, 0xfb, 0x4d, 0x76,
+ 0xf7, 0x5b, 0xe7, 0xf7, 0xa2, 0xe9, 0x12, 0xba,
+ 0xec, 0xf7, 0x13, 0xf7, 0x21, 0x95, 0xeb, 0x17,
+ 0xf7, 0x80, 0xfb, 0x45, 0x15, 0x7a, 0xa0, 0xa6,
+ 0x7f, 0xaa, 0x1b, 0xcc, 0xab, 0xbe, 0xbd, 0xa6,
+ 0x82, 0xb7, 0x5a, 0x97, 0x1f, 0x9d, 0x7, 0xd5,
+ 0x97, 0xd0, 0xad, 0xc2, 0xb7, 0x55, 0xd4, 0x18,
+ 0x62, 0x51, 0x55, 0x6a, 0x3c, 0x1b, 0x39, 0x3a,
+ 0xb8, 0xe9, 0xdb, 0xca, 0xbe, 0xf3, 0xb2, 0xb3,
+ 0x8b, 0x7c, 0xab, 0x1f, 0x30, 0xeb, 0xf7, 0x5c,
+ 0x2b, 0x82, 0x7, 0x95, 0x68, 0x65, 0x8a, 0x65,
+ 0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x4, 0xfb, 0x3,
+ 0xfb, 0x21, 0xf7, 0x3, 0x39, 0xf7, 0x9, 0x81,
+ 0x1f, 0x84, 0x2e, 0x5, 0x8c, 0x95, 0xa0, 0x91,
+ 0x9b, 0x1b, 0x97, 0x94, 0x85, 0x7c, 0x7d, 0x80,
+ 0x84, 0x7d, 0x7a, 0x77, 0x8f, 0x94, 0x82, 0x1f,
+ 0xe, 0x55, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7,
+ 0x1e, 0xf8, 0xc3, 0x15, 0xf7, 0xd2, 0x3f, 0xa1,
+ 0xc6, 0xfb, 0xbd, 0xf7, 0xb, 0x5, 0x5e, 0xfc,
+ 0x7f, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x4d, 0xf8, 0x76, 0x15, 0xf7, 0xd3,
+ 0xd7, 0x60, 0xf2, 0xfb, 0xbf, 0x6a, 0xa, 0x71,
+ 0xfc, 0x7, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x73,
+ 0x77, 0x1, 0xf7, 0x23, 0xf8, 0x73, 0x15, 0xf7,
+ 0x2c, 0xf2, 0xf7, 0x2c, 0x24, 0xc7, 0xad, 0xfb,
+ 0x36, 0xf7, 0x24, 0x5, 0x28, 0x6, 0xfb, 0x39,
+ 0xfb, 0x23, 0x5, 0xc2, 0xfb, 0xec, 0x24, 0xa,
+ 0x55, 0xa, 0xcc, 0xf7, 0x12, 0x1, 0xf7, 0x24,
+ 0xf7, 0x4, 0xd2, 0xf7, 0x4, 0x3, 0xf7, 0xdb,
+ 0xf8, 0x87, 0x72, 0xa, 0xfb, 0x4b, 0xfb, 0x12,
+ 0x72, 0xa, 0x83, 0xfc, 0x5b, 0x24, 0xa, 0x57,
+ 0xa, 0xf7, 0x17, 0xf8, 0xc2, 0x15, 0xf7, 0xd4,
+ 0x40, 0xa3, 0xc5, 0xfb, 0xc1, 0xf7, 0xc, 0x5,
+ 0x2a, 0xfd, 0x29, 0x33, 0xa, 0x57, 0xa, 0xf7,
+ 0x48, 0xf8, 0x77, 0x15, 0xf7, 0xd2, 0xd6, 0x61,
+ 0xf2, 0xfb, 0xc0, 0x6a, 0xa, 0x3c, 0xfc, 0xb1,
+ 0x33, 0xa, 0x8b, 0xe5, 0xf7, 0x84, 0xe6, 0xf7,
+ 0x80, 0x77, 0x1, 0xf7, 0x8d, 0xf1, 0x3, 0xd1,
+ 0xf8, 0x98, 0x15, 0xcb, 0x67, 0xf7, 0x31, 0xf1,
+ 0xf7, 0x31, 0x25, 0xc9, 0xae, 0xfb, 0x3b, 0xf7,
+ 0x22, 0x5, 0x24, 0x6, 0xfb, 0x30, 0xfd, 0x25,
+ 0x33, 0xa, 0x8b, 0xe6, 0xf7, 0x86, 0xe6, 0xd7,
+ 0xf7, 0x11, 0x12, 0xf7, 0x20, 0xf7, 0x4, 0x8a,
+ 0xec, 0x72, 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xd7,
+ 0xf8, 0x88, 0x15, 0xf7, 0x5, 0xf7, 0x11, 0xfb,
+ 0x5, 0x6, 0xfb, 0x4b, 0xfb, 0x11, 0x15, 0xf7,
+ 0x4, 0xf7, 0x11, 0xfb, 0x4, 0x6, 0x4c, 0xfd,
+ 0x5, 0x15, 0xf8, 0x52, 0xe6, 0x6, 0x13, 0xe8,
+ 0xfb, 0x43, 0xf7, 0xe1, 0xfb, 0x7e, 0x30, 0xf7,
+ 0x1d, 0xfb, 0x86, 0xfb, 0x42, 0x6, 0xe, 0x70,
+ 0xe3, 0xf7, 0x96, 0xe4, 0xf7, 0x6e, 0x77, 0x1,
+ 0xc4, 0xe8, 0xf7, 0xc1, 0xe6, 0x3, 0xf7, 0x51,
+ 0xf8, 0x48, 0x15, 0xf7, 0x5, 0xc2, 0xd1, 0x62,
+ 0xb7, 0x47, 0x8c, 0x87, 0x19, 0x9d, 0x6d, 0x77,
+ 0x97, 0x4c, 0x1b, 0xfb, 0x39, 0x39, 0xfb, 0x0,
+ 0xfb, 0x3, 0xfb, 0x0, 0xdd, 0xfb, 0x0, 0xf7,
+ 0x37, 0xf7, 0x3a, 0xd5, 0xf7, 0x3, 0xf7, 0x17,
+ 0xf7, 0x44, 0xfb, 0xa, 0xf6, 0x59, 0xaa, 0x1f,
+ 0xea, 0xb5, 0x6c, 0xc1, 0xfb, 0x15, 0x4e, 0x6f,
+ 0x9d, 0x3c, 0xb0, 0x63, 0x92, 0x19, 0x70, 0x4f,
+ 0xad, 0x83, 0xad, 0x7b, 0xab, 0x7d, 0x19, 0x3b,
+ 0x65, 0x5, 0x86, 0xfb, 0xc2, 0x15, 0xe7, 0xdb,
+ 0xb2, 0xd1, 0xf5, 0xb8, 0x49, 0x4c, 0x30, 0x3d,
+ 0x65, 0x45, 0x40, 0x3d, 0xb0, 0xe5, 0x1e, 0xe,
+ 0x8b, 0xe7, 0xf7, 0x97, 0xe5, 0x31, 0xe7, 0xf7,
+ 0x55, 0x77, 0x12, 0x98, 0xf7, 0x46, 0x2b, 0xeb,
+ 0xf7, 0x72, 0xeb, 0x13, 0xda, 0xe8, 0xf8, 0x95,
+ 0x15, 0xe1, 0x71, 0x96, 0x9f, 0x93, 0xad, 0xa1,
+ 0x8d, 0x19, 0xa1, 0x8d, 0xa4, 0x82, 0xb1, 0x77,
+ 0x8, 0x7e, 0xa4, 0xa8, 0x7e, 0xac, 0x1b, 0xf0,
+ 0xab, 0xe3, 0xad, 0x97, 0x1f, 0x35, 0xa3, 0x5,
+ 0x62, 0x79, 0x81, 0x76, 0x6e, 0x1b, 0x79, 0x77,
+ 0x94, 0x96, 0x77, 0x1f, 0x9c, 0x6b, 0x6a, 0xa2,
+ 0x6a, 0x1b, 0x2a, 0x6d, 0x3d, 0x60, 0x79, 0x1f,
+ 0x3c, 0xfc, 0x95, 0x15, 0xf7, 0x95, 0xe7, 0x3b,
+ 0xf7, 0x56, 0x6, 0xb6, 0xbd, 0xce, 0xa1, 0xa9,
+ 0x1b, 0xd0, 0x91, 0x6c, 0x64, 0x1f, 0xfb, 0x51,
+ 0x3d, 0x2f, 0xf7, 0x90, 0xe7, 0x3d, 0xf7, 0x66,
+ 0x7, 0xe6, 0x43, 0xbb, 0x31, 0x53, 0x51, 0x70,
+ 0x70, 0x61, 0x1e, 0x13, 0xba, 0xc3, 0xfb, 0x46,
+ 0x2f, 0x7, 0x13, 0xb6, 0xdd, 0xfb, 0x97, 0x3a,
+ 0x6, 0xe, 0x7b, 0xe7, 0xf7, 0xa0, 0xe7, 0xf7,
+ 0x75, 0x77, 0x4b, 0xa, 0xf7, 0x24, 0xf8, 0xc1,
+ 0x15, 0xf7, 0xda, 0x40, 0xa2, 0xc5, 0xfb, 0xc7,
+ 0xf7, 0xd, 0x5, 0xfb, 0x30, 0xfc, 0x5a, 0x23,
+ 0xa, 0x62, 0xa, 0xf7, 0x75, 0x77, 0x4b, 0xa,
+ 0xf7, 0x53, 0xf8, 0x76, 0x15, 0xf7, 0xda, 0xd6,
+ 0x61, 0xf3, 0xfb, 0xc7, 0xfb, 0xd, 0x5, 0xfb,
+ 0x1e, 0xfb, 0xe1, 0x23, 0xa, 0x62, 0xa, 0xf7,
+ 0x71, 0x77, 0x4b, 0xa, 0xf7, 0x2a, 0xf8, 0x72,
+ 0x15, 0xf7, 0x30, 0xf3, 0xf7, 0x2f, 0x23, 0xc7,
+ 0xad, 0xfb, 0x38, 0xf7, 0x25, 0x5, 0x24, 0x6,
+ 0xfb, 0x3b, 0xfb, 0x23, 0x5, 0x52, 0xfb, 0xc7,
+ 0x23, 0xa, 0x62, 0xa, 0xf7, 0x5, 0xe0, 0x8d,
+ 0x77, 0x12, 0xa9, 0xef, 0xf7, 0xe9, 0xee, 0x13,
+ 0xec, 0xe3, 0xf8, 0x94, 0x15, 0xe4, 0x71, 0x5,
+ 0xa5, 0x96, 0x98, 0xb0, 0xae, 0x1b, 0x9f, 0xa0,
+ 0x7e, 0x7d, 0xa3, 0x1f, 0x7b, 0xa7, 0xa9, 0x7a,
+ 0xb0, 0x1b, 0xf5, 0xac, 0xe4, 0xad, 0x95, 0x1f,
+ 0x13, 0xdc, 0x33, 0xa3, 0x5, 0x62, 0x79, 0x81,
+ 0x76, 0x6d, 0x1b, 0x74, 0x71, 0x99, 0x9a, 0x70,
+ 0x1f, 0x13, 0xec, 0x9a, 0x6f, 0x6e, 0x9b, 0x6f,
+ 0x1b, 0x26, 0x6b, 0x3d, 0x5f, 0x7a, 0x1f, 0x51,
+ 0xfb, 0xc5, 0x23, 0xa, 0x62, 0xa, 0xca, 0xf7,
+ 0x12, 0x1, 0xa9, 0xef, 0xa0, 0xf7, 0x6, 0xd5,
+ 0xf7, 0x6, 0x9d, 0xee, 0x3, 0xf7, 0xe7, 0xf8,
+ 0x87, 0x70, 0xa, 0xfb, 0x50, 0xfb, 0x12, 0x70,
+ 0xa, 0xfb, 0xd, 0xfc, 0x36, 0x23, 0xa, 0x9b,
+ 0xf7, 0x1d, 0xbd, 0xf7, 0x2, 0xbd, 0xf7, 0x1d,
+ 0x1, 0xf7, 0x79, 0xf7, 0x28, 0x14, 0xe0, 0x5c,
+ 0xa, 0xf7, 0x32, 0xf7, 0xa, 0x15, 0x49, 0xa,
+ 0xfb, 0xef, 0x4, 0x49, 0xa, 0xe, 0x7a, 0xe9,
+ 0x3b, 0x76, 0xf8, 0x1c, 0xea, 0x12, 0xa9, 0xed,
+ 0xf7, 0xed, 0xec, 0x13, 0x78, 0xb2, 0xa9, 0x15,
+ 0x8d, 0xc1, 0x56, 0x8a, 0x8d, 0x1f, 0x8b, 0xa1,
+ 0x9e, 0xaa, 0xa7, 0x1e, 0x13, 0xb8, 0x72, 0xb6,
+ 0xbe, 0x7c, 0xc3, 0x1b, 0xf7, 0x29, 0xf7, 0xd,
+ 0xf6, 0xf7, 0x18, 0xc0, 0x77, 0xbd, 0x69, 0xb3,
+ 0x1f, 0xa7, 0xa6, 0x9b, 0x9c, 0x8b, 0x8b, 0x53,
+ 0xbf, 0x8a, 0x1a, 0x8b, 0x77, 0x7f, 0x6c, 0x6e,
+ 0x1e, 0xa6, 0x60, 0x56, 0x9c, 0x52, 0x1b, 0xfb,
+ 0x29, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0x18, 0x53,
+ 0xa0, 0x59, 0xaf, 0x62, 0x1f, 0x6d, 0x6f, 0x79,
+ 0x7a, 0x8b, 0x1a, 0xf7, 0xa, 0xf7, 0x3, 0x15,
+ 0x78, 0xa2, 0x81, 0xa6, 0xa9, 0x1a, 0xdb, 0xd8,
+ 0xce, 0xea, 0xa7, 0xa7, 0x83, 0x81, 0xa3, 0x1e,
+ 0x45, 0x4a, 0x36, 0x3b, 0x47, 0x4b, 0x8, 0xcd,
+ 0x5a, 0x15, 0xd0, 0xcb, 0xe1, 0xdb, 0xce, 0xca,
+ 0x8, 0x9d, 0x75, 0x95, 0x70, 0x6e, 0x1a, 0x3b,
+ 0x3d, 0x4b, 0x2c, 0x6f, 0x71, 0x90, 0x95, 0x74,
+ 0x1e, 0xe, 0x3c, 0xa, 0xf7, 0x17, 0xf8, 0xc3,
+ 0x15, 0xf7, 0xcc, 0x3d, 0xa2, 0xc7, 0xfb, 0xbc,
+ 0xf7, 0xc, 0x5, 0xfb, 0x2f, 0xfb, 0xde, 0x28,
+ 0xa, 0x3c, 0xa, 0xf7, 0x43, 0xf8, 0x76, 0x15,
+ 0xf7, 0xcf, 0xd7, 0x62, 0xf2, 0xfb, 0xbd, 0x6a,
+ 0xa, 0xfb, 0x1d, 0xfb, 0x66, 0x28, 0xa, 0x4a,
+ 0xa, 0xf7, 0x7f, 0x36, 0xa, 0xf7, 0x1d, 0xf8,
+ 0x71, 0x15, 0xf7, 0x2a, 0xf4, 0xf7, 0x29, 0x22,
+ 0xc6, 0xae, 0xfb, 0x34, 0xf7, 0x25, 0x5, 0x2b,
+ 0x6, 0xfb, 0x37, 0xfb, 0x24, 0x5, 0x4e, 0xfb,
+ 0x4a, 0x28, 0xa, 0x4a, 0xa, 0xd9, 0xf7, 0x11,
+ 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0x5a, 0xf7,
+ 0x2, 0xd0, 0xf7, 0x2, 0x29, 0xf7, 0x41, 0x2d,
+ 0xe9, 0x2d, 0xf7, 0x43, 0x13, 0xb3, 0x0, 0xf7,
+ 0xd3, 0xf8, 0x88, 0x6f, 0xa, 0xfb, 0x47, 0xfb,
+ 0x11, 0x6f, 0xa, 0x13, 0xb9, 0x0, 0xfb, 0x11,
+ 0xfb, 0xba, 0x15, 0x13, 0xb4, 0x40, 0x2e, 0xa,
+ 0x13, 0x78, 0x20, 0x64, 0xf7, 0x43, 0xe6, 0x7,
+ 0x13, 0x78, 0x80, 0x3a, 0xf7, 0xe1, 0xfb, 0x41,
+ 0x30, 0x6, 0x13, 0xb8, 0x40, 0x2c, 0xa, 0xfb,
+ 0x22, 0xe2, 0xf8, 0x26, 0xe2, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x59, 0xf8, 0x7f, 0x15, 0xf7, 0xcf,
+ 0xd2, 0x62, 0xee, 0xfb, 0xbe, 0xfb, 0x7, 0x5,
+ 0xfb, 0x19, 0xfc, 0xed, 0x15, 0x34, 0xf7, 0xc9,
+ 0xe2, 0x33, 0x3a, 0xa, 0xfb, 0xa7, 0x35, 0xfb,
+ 0x13, 0x5, 0xe, 0xfb, 0x22, 0xe4, 0xe0, 0xe3,
+ 0xf7, 0x9a, 0xe4, 0xcd, 0xe4, 0x12, 0x93, 0xf7,
+ 0x49, 0x29, 0xed, 0xf7, 0xc4, 0xee, 0x13, 0xfa,
+ 0x93, 0x56, 0x15, 0x32, 0xf7, 0xe1, 0xe4, 0xfb,
+ 0x2c, 0xf7, 0x18, 0x7, 0x7d, 0xa1, 0xc3, 0x6a,
+ 0xde, 0x1b, 0xf7, 0x21, 0xf0, 0xee, 0xf7, 0x10,
+ 0xf7, 0x2b, 0xfb, 0x23, 0xcc, 0x24, 0x51, 0x51,
+ 0x7b, 0x6d, 0x62, 0x1f, 0xf7, 0x5d, 0xfb, 0x49,
+ 0x32, 0x7, 0x13, 0xf6, 0xde, 0xfc, 0xe2, 0x6,
+ 0x13, 0xfa, 0xe9, 0xf7, 0xc6, 0x15, 0xf7, 0x2,
+ 0xf7, 0x9, 0x9e, 0xb4, 0xdb, 0xd1, 0x5d, 0x38,
+ 0x3b, 0x43, 0x56, 0x3c, 0x5c, 0xfb, 0x2, 0xa5,
+ 0xf6, 0x1e, 0xe, 0xfb, 0x22, 0xe1, 0xf8, 0x26,
+ 0xe2, 0xd3, 0xf7, 0xc, 0x1, 0xf7, 0x31, 0xf7,
+ 0x3, 0xd2, 0xf7, 0x3, 0x3, 0xf7, 0xe7, 0xf8,
+ 0x8d, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, 0xa,
+ 0xfb, 0x4a, 0xfb, 0xc, 0x15, 0xf7, 0x3, 0xf7,
+ 0xc, 0x6b, 0xa, 0xfb, 0x9, 0xfd, 0x3d, 0x15,
+ 0x35, 0xf7, 0xbf, 0xe1, 0x3d, 0x3a, 0xa, 0xfb,
+ 0xa5, 0x35, 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe6,
+ 0xf7, 0xf2, 0xe6, 0x4e, 0xe6, 0xb6, 0xf7, 0x23,
+ 0x12, 0xf7, 0x8f, 0xf0, 0x13, 0xb8, 0x66, 0xa,
+ 0xe6, 0xfb, 0x3f, 0x6, 0x13, 0xd8, 0xf7, 0xf2,
+ 0x74, 0xa, 0xfb, 0xf2, 0xfb, 0x42, 0x7, 0xf7,
+ 0x3d, 0xf8, 0x96, 0x79, 0xa, 0x6b, 0xa, 0xe,
+ 0x7c, 0xa, 0x40, 0xa, 0xf7, 0xed, 0xfb, 0x7f,
+ 0x2d, 0xf7, 0x1c, 0xfb, 0x8f, 0xfb, 0x41, 0x6,
+ 0xe, 0x79, 0xe6, 0xf8, 0x22, 0xe6, 0x1, 0xcb,
+ 0xf0, 0xf3, 0xed, 0xf0, 0xeb, 0x3, 0x7c, 0x79,
+ 0x15, 0xf7, 0x99, 0xe6, 0x3a, 0xf8, 0x22, 0xd9,
+ 0xe6, 0xfb, 0x95, 0x30, 0xd9, 0xfc, 0x22, 0x3c,
+ 0x6, 0xf7, 0xb0, 0x74, 0x15, 0x78, 0x9e, 0xa2,
+ 0x5a, 0xf5, 0x1b, 0xf7, 0x12, 0xa0, 0xd5, 0xf7,
+ 0x1f, 0x1f, 0xf7, 0xa7, 0xbe, 0xe7, 0xfb, 0x9a,
+ 0x2f, 0xf7, 0x7, 0xfb, 0xa8, 0x7, 0x49, 0x8a,
+ 0x53, 0x56, 0x5b, 0x8c, 0x78, 0xa, 0xfb, 0x23,
+ 0xe4, 0x32, 0xea, 0xf8, 0x31, 0xe6, 0x80, 0x77,
+ 0xe4, 0xf7, 0x24, 0x12, 0xae, 0xf7, 0x25, 0xfb,
+ 0x3, 0xf7, 0x3, 0x29, 0xed, 0xf7, 0x9f, 0xf7,
+ 0xa, 0x13, 0xac, 0x80, 0xd0, 0xf8, 0x97, 0x79,
+ 0xa, 0x6, 0x13, 0x5a, 0x80, 0x6b, 0xa, 0x56,
+ 0xfd, 0x56, 0x15, 0x2c, 0xf7, 0x77, 0xea, 0x4c,
+ 0xf8, 0x81, 0x7, 0x13, 0x9c, 0x80, 0xfb, 0x25,
+ 0x2b, 0x6, 0x13, 0x69, 0x80, 0xba, 0xfc, 0x21,
+ 0x6, 0xf8, 0x1, 0xf8, 0xc6, 0x73, 0xa, 0xfb,
+ 0x24, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, 0x87,
+ 0xa9, 0x9a, 0x7b, 0xc8, 0x1b, 0xf7, 0x63, 0x82,
+ 0xf7, 0x1b, 0xc6, 0x1f, 0xf8, 0x2c, 0xfb, 0x80,
+ 0x30, 0xf7, 0x18, 0xfb, 0xcd, 0x7, 0x46, 0x81,
+ 0x66, 0x3b, 0x64, 0x7d, 0x94, 0x95, 0x6a, 0x1e,
+ 0xe, 0x32, 0xa, 0xf7, 0x17, 0xed, 0xf7, 0x85,
+ 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x9c,
+ 0x28, 0xfb, 0x41, 0xfb, 0x85, 0xf7, 0x2e, 0x6,
+ 0xf7, 0x36, 0xbb, 0x5, 0xc9, 0x7, 0xfb, 0x36,
+ 0x5d, 0x5, 0xf7, 0x36, 0xf7, 0x13, 0xe6, 0xfb,
+ 0xda, 0x30, 0xf0, 0xfb, 0x50, 0x7, 0x36, 0x73,
+ 0x5, 0x4c, 0x7, 0xe0, 0xa1, 0x5, 0xfb, 0x13,
+ 0x26, 0x7, 0xe, 0x8b, 0xe9, 0xf8, 0x4a, 0x40,
+ 0xa, 0xf7, 0x68, 0x6, 0xf7, 0x12, 0xaf, 0x5,
+ 0xcd, 0x7, 0xfb, 0x12, 0x67, 0x5, 0xf7, 0x92,
+ 0xfb, 0x9e, 0x2d, 0xf7, 0x3b, 0xfb, 0x4f, 0x7,
+ 0xfb, 0x9, 0x69, 0x5, 0x4b, 0x7, 0xf7, 0x9,
+ 0xab, 0x5, 0xfb, 0x4d, 0xfb, 0x41, 0x7, 0xe,
+ 0x8b, 0xe6, 0x30, 0xf7, 0x3e, 0xa0, 0xf7, 0x4f,
+ 0x94, 0xf7, 0x43, 0x30, 0xe6, 0x12, 0x81, 0xe9,
+ 0xf7, 0x6f, 0xea, 0xaf, 0xd6, 0xa5, 0xd6, 0x13,
+ 0xaf, 0x80, 0xf8, 0x22, 0xe6, 0x15, 0xf7, 0x2b,
+ 0xaf, 0x58, 0xd6, 0xf7, 0x4f, 0x40, 0x5d, 0x67,
+ 0xf7, 0x1f, 0xf7, 0x1d, 0x7, 0x13, 0xb7, 0x80,
+ 0x37, 0xd6, 0xf7, 0x43, 0xfc, 0x16, 0x7, 0xfb,
+ 0xe, 0xfb, 0x4, 0xfb, 0x7, 0xfb, 0x43, 0xfb,
+ 0x43, 0xf7, 0x5, 0x2a, 0xf2, 0x1f, 0xf8, 0x28,
+ 0x6, 0x13, 0x77, 0x80, 0xf7, 0x3e, 0x40, 0x7,
+ 0x13, 0xaf, 0x80, 0x3c, 0x7, 0xfb, 0x7c, 0xbc,
+ 0x15, 0x5c, 0x5d, 0x89, 0x79, 0x23, 0x58, 0xd3,
+ 0xf7, 0x1, 0xf7, 0xf, 0xd2, 0xd7, 0xe8, 0x9b,
+ 0xb2, 0x8a, 0x66, 0x1e, 0xe, 0x7c, 0xe9, 0xec,
+ 0xea, 0xe3, 0xea, 0x1, 0x7d, 0xed, 0xf7, 0x3a,
+ 0xed, 0x3, 0xf7, 0xf5, 0xf7, 0x44, 0x15, 0xf7,
+ 0x8f, 0x6, 0xf7, 0xf, 0x9d, 0x61, 0xf7, 0x2f,
+ 0xfb, 0x23, 0x1b, 0x5c, 0x60, 0x78, 0x68, 0x6a,
+ 0x1f, 0xb1, 0x6a, 0x58, 0x9b, 0x57, 0x1b, 0xfb,
+ 0x18, 0x4f, 0x22, 0xfb, 0x1c, 0x49, 0x9b, 0xfb,
+ 0x36, 0xf7, 0x39, 0xd1, 0xba, 0xb8, 0xa2, 0x9d,
+ 0x1f, 0x6a, 0xaa, 0xa8, 0x68, 0xe5, 0x1b, 0xc4,
+ 0xbe, 0x9a, 0xa0, 0xc2, 0x1f, 0x73, 0xe6, 0x5,
+ 0x73, 0x4d, 0x53, 0x82, 0x74, 0x1b, 0x38, 0x7d,
+ 0xd6, 0x9f, 0x1f, 0x86, 0xec, 0x15, 0xb3, 0x8f,
+ 0xa7, 0xbb, 0xc1, 0x1b, 0xcf, 0x93, 0x48, 0x76,
+ 0x8c, 0x1f, 0xfc, 0x3f, 0x51, 0x15, 0xab, 0x8b,
+ 0xf7, 0x6, 0xe6, 0xd3, 0x8e, 0xfb, 0x2, 0x67,
+ 0x67, 0x87, 0x29, 0x3a, 0x47, 0x7e, 0xef, 0xad,
+ 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x7d, 0xf4,
+ 0xf7, 0xc, 0xf1, 0xf7, 0xa, 0xf7, 0x2, 0x12,
+ 0xba, 0xf7, 0x0, 0x30, 0xf1, 0xd9, 0xf7, 0x2e,
+ 0xa5, 0xf6, 0x39, 0xf3, 0x13, 0xfa, 0x80, 0xba,
+ 0xa6, 0x15, 0xf7, 0x0, 0xb9, 0x6, 0xa6, 0x80,
+ 0xa9, 0x7e, 0xab, 0x82, 0x8, 0xfb, 0x13, 0x7,
+ 0x8d, 0x95, 0x9c, 0x92, 0x9d, 0x1b, 0x9d, 0x95,
+ 0x81, 0x78, 0x7c, 0x7e, 0x7e, 0x7d, 0x8a, 0x1f,
+ 0x74, 0x89, 0x78, 0x93, 0x81, 0x94, 0x6e, 0x55,
+ 0x18, 0x79, 0xa1, 0xa9, 0x7e, 0xac, 0x1b, 0xd0,
+ 0xae, 0xc2, 0xc0, 0xa8, 0x81, 0xbb, 0x57, 0x97,
+ 0x1f, 0x8c, 0xaf, 0x5, 0xf7, 0xc, 0x90, 0xeb,
+ 0xcd, 0xf2, 0x1a, 0xf7, 0x11, 0xfb, 0xc, 0xaa,
+ 0x2f, 0x88, 0x1e, 0x13, 0xf7, 0x0, 0x28, 0x92,
+ 0x3f, 0x93, 0xb7, 0x1a, 0xbf, 0xed, 0x92, 0xa3,
+ 0xb9, 0xbf, 0x73, 0x75, 0xb1, 0x1e, 0x54, 0xf6,
+ 0xf7, 0x67, 0x20, 0x63, 0x7, 0x9b, 0x62, 0x55,
+ 0xa3, 0x59, 0x1b, 0x27, 0xfb, 0x7, 0x5d, 0xfb,
+ 0xd, 0xfb, 0x25, 0xf7, 0x35, 0x7f, 0xdb, 0x85,
+ 0x1f, 0x13, 0xfa, 0x80, 0xb3, 0x88, 0xf3, 0x98,
+ 0x4e, 0x1a, 0x62, 0x43, 0x6f, 0x4f, 0x3e, 0x52,
+ 0xb3, 0x96, 0x6f, 0x1e, 0xd2, 0xfb, 0x0, 0x7,
+ 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x59, 0xe3, 0xf1,
+ 0xe1, 0x99, 0xf7, 0x46, 0x2e, 0xe8, 0x12, 0xcd,
+ 0xef, 0x35, 0xe1, 0x35, 0xea, 0xd3, 0xf7, 0x23,
+ 0xa3, 0xee, 0x3f, 0xeb, 0x13, 0xf4, 0xa0, 0xcd,
+ 0x82, 0x15, 0xef, 0xb1, 0x6, 0xa4, 0x82, 0xa6,
+ 0x80, 0xa8, 0x84, 0x8, 0xfb, 0x0, 0x7, 0x8d,
+ 0x95, 0x9a, 0x91, 0x9b, 0x1b, 0x9d, 0x93, 0x82,
+ 0x7c, 0x7e, 0x80, 0x80, 0x7d, 0x8a, 0x1f, 0x76,
+ 0x89, 0x7a, 0x92, 0x81, 0x93, 0x71, 0x5d, 0x18,
+ 0x7c, 0x9f, 0xa7, 0x80, 0xa9, 0x1b, 0xcc, 0xab,
+ 0xb9, 0xb8, 0xa3, 0x82, 0xb4, 0x5b, 0x95, 0x1f,
+ 0x8c, 0xaa, 0x5, 0xf7, 0x2, 0x90, 0xe4, 0xc2,
+ 0xe1, 0x1a, 0xf5, 0xfb, 0x3, 0xa6, 0x36, 0x88,
+ 0x1e, 0x13, 0xe9, 0xc0, 0x2f, 0x91, 0x45, 0x92,
+ 0xaf, 0x1a, 0xb8, 0xe5, 0x90, 0xa2, 0xb6, 0xbb,
+ 0x77, 0x79, 0xae, 0x1e, 0x13, 0xf2, 0xc0, 0x5c,
+ 0xee, 0xf7, 0x46, 0x28, 0x69, 0x7, 0x99, 0x65,
+ 0x59, 0x9f, 0x5d, 0x1b, 0x2e, 0x20, 0x64, 0x24,
+ 0xfb, 0xe, 0xf7, 0x2a, 0x82, 0xd5, 0x86, 0x1f,
+ 0x13, 0xf4, 0xa0, 0xaf, 0x88, 0xec, 0x95, 0x58,
+ 0x1a, 0x69, 0x48, 0x73, 0x53, 0x44, 0x58, 0xae,
+ 0x94, 0x71, 0x1e, 0x13, 0xf4, 0xc0, 0xc7, 0x27,
+ 0x7, 0xe, 0x75, 0xe6, 0x8b, 0xf7, 0x27, 0xf7,
+ 0x97, 0xe6, 0x8b, 0xb6, 0x6d, 0xb6, 0xf7, 0x3c,
+ 0x77, 0x12, 0xba, 0xf1, 0x36, 0xe0, 0x36, 0xf2,
+ 0xf7, 0x99, 0xf1, 0x3d, 0xf0, 0x13, 0xed, 0x20,
+ 0xba, 0x75, 0x15, 0xf1, 0xae, 0x6, 0x82, 0xa1,
+ 0xbc, 0x71, 0xdc, 0x1b, 0xf7, 0x1d, 0xf7, 0x7,
+ 0xcc, 0xf7, 0x0, 0xe7, 0x3e, 0xb5, 0x3a, 0x98,
+ 0x1f, 0x13, 0xf4, 0xc0, 0x53, 0x93, 0xfb, 0x40,
+ 0x7e, 0xe7, 0x1a, 0xb5, 0xbc, 0xbb, 0xe6, 0xb6,
+ 0xb5, 0x7f, 0x7c, 0xaf, 0x1e, 0x22, 0xf1, 0xf7,
+ 0x73, 0x25, 0x73, 0x7, 0x9a, 0x67, 0x5f, 0x94,
+ 0x5e, 0x1b, 0xfb, 0x32, 0x3a, 0x26, 0x3b, 0xfb,
+ 0x2e, 0xf7, 0x48, 0x85, 0xf7, 0xa, 0x82, 0x1f,
+ 0x13, 0xed, 0x20, 0xc3, 0x87, 0xad, 0x79, 0x60,
+ 0x1a, 0x5b, 0x60, 0x69, 0xfb, 0x0, 0x54, 0x57,
+ 0x9a, 0xa4, 0x5e, 0x1e, 0xde, 0x7, 0x13, 0xee,
+ 0x40, 0x25, 0x6, 0x13, 0xf5, 0x40, 0xf7, 0x62,
+ 0xf8, 0x35, 0x15, 0xf5, 0x6, 0xf7, 0x3e, 0xf7,
+ 0x24, 0x4c, 0xaf, 0xfb, 0x35, 0x24, 0xfb, 0x31,
+ 0xf3, 0x49, 0x69, 0x5, 0xe, 0x7a, 0xe1, 0xed,
+ 0xdf, 0x8b, 0xeb, 0x3a, 0xf7, 0x41, 0x2f, 0xe7,
+ 0x7d, 0xb9, 0x12, 0xcd, 0xed, 0x37, 0xdf, 0x37,
+ 0xea, 0xf7, 0x83, 0xee, 0x40, 0xea, 0x13, 0xe6,
+ 0x20, 0xf7, 0x99, 0xf8, 0x79, 0x15, 0xf0, 0x6,
+ 0xf7, 0x38, 0xf7, 0x25, 0x4d, 0xb0, 0xfb, 0x2e,
+ 0x22, 0xfb, 0x2e, 0xf4, 0x4c, 0x67, 0x5, 0x70,
+ 0xfd, 0x1c, 0x15, 0xed, 0xb1, 0x6, 0x7b, 0xb9,
+ 0xc3, 0x75, 0xc0, 0x1b, 0xf7, 0xb, 0xea, 0xc2,
+ 0xe2, 0xf2, 0xfb, 0x3, 0xa5, 0x36, 0x88, 0x1f,
+ 0x13, 0xe4, 0xc0, 0x30, 0x92, 0x44, 0x91, 0xaf,
+ 0x1a, 0x13, 0xea, 0x40, 0xb5, 0xe6, 0x90, 0xa1,
+ 0xb6, 0xba, 0x78, 0x7a, 0xaf, 0x1e, 0x13, 0xd1,
+ 0x40, 0x5e, 0xee, 0xf7, 0x41, 0x28, 0x6a, 0x7,
+ 0x99, 0x64, 0x5a, 0x9e, 0x5d, 0x1b, 0x2e, 0x20,
+ 0x65, 0x28, 0xfb, 0xc, 0xf7, 0x2a, 0x82, 0xd5,
+ 0x85, 0x1f, 0x13, 0xe6, 0x20, 0xaf, 0x88, 0xed,
+ 0x96, 0x59, 0x1a, 0x6a, 0x47, 0x74, 0x53, 0x45,
+ 0x56, 0xab, 0x94, 0x70, 0x1e, 0xc6, 0x29, 0x7,
+ 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, 0xf7,
+ 0x15, 0x12, 0x99, 0xf7, 0x80, 0x2b, 0xf7, 0x4,
+ 0xd1, 0xf7, 0x4, 0x28, 0xf7, 0x80, 0x13, 0xec,
+ 0xf7, 0x13, 0x16, 0xf7, 0xe9, 0xe8, 0xfb, 0xe,
+ 0xf7, 0x14, 0x6, 0xf7, 0x34, 0xf7, 0x96, 0x5,
+ 0x13, 0xea, 0xda, 0xe8, 0xfb, 0x80, 0x2e, 0xc3,
+ 0x6, 0x22, 0xfb, 0x3d, 0x23, 0xf7, 0x3d, 0x5,
+ 0x13, 0xf4, 0xc1, 0xe8, 0xfb, 0x80, 0x2e, 0xd8,
+ 0x6, 0xf7, 0x34, 0xfb, 0x96, 0x5, 0xfb, 0x14,
+ 0xfb, 0x10, 0x7, 0xf7, 0x62, 0xf8, 0xcb, 0x15,
+ 0xf7, 0x1, 0xf7, 0x15, 0xfb, 0x1, 0x6, 0xfb,
+ 0x48, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0xf7, 0x15,
+ 0xfb, 0x2, 0x6, 0xe, 0x8b, 0xe6, 0xf8, 0xc,
+ 0xe5, 0x8b, 0xc1, 0xf7, 0x47, 0x77, 0x12, 0xcd,
+ 0xed, 0xf7, 0xa8, 0xed, 0x17, 0xc8, 0x16, 0xf8,
+ 0x71, 0xf7, 0x6e, 0x29, 0xfb, 0x13, 0xfb, 0x8a,
+ 0x6, 0xf7, 0xd5, 0xf8, 0x26, 0x5, 0x13, 0x78,
+ 0xcb, 0xfc, 0x55, 0xfb, 0x5f, 0xed, 0xf7, 0x5,
+ 0xf7, 0x6d, 0x7, 0xfb, 0xd4, 0xfc, 0x22, 0x5,
+ 0xf7, 0x4f, 0xf8, 0xb2, 0x15, 0xf0, 0x6, 0xf7,
+ 0x36, 0xf7, 0x22, 0x51, 0xaf, 0xfb, 0x30, 0x25,
+ 0xfb, 0x2b, 0xf2, 0x4d, 0x69, 0x5, 0xe, 0x8b,
+ 0xe7, 0xf7, 0x2f, 0xf7, 0x43, 0x30, 0xe6, 0x8b,
+ 0xc8, 0xf7, 0x4c, 0x77, 0x12, 0xe9, 0xee, 0xf7,
+ 0x79, 0xec, 0x13, 0xde, 0xf7, 0x94, 0xf8, 0x77,
+ 0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x26, 0x4e,
+ 0xb1, 0xfb, 0x2c, 0x21, 0xfb, 0x2e, 0xf5, 0x4c,
+ 0x66, 0x5, 0x82, 0xfd, 0xa, 0x15, 0xf8, 0x4b,
+ 0xf7, 0x4e, 0x2a, 0x2d, 0xfb, 0x51, 0x6, 0xf7,
+ 0xb2, 0xf7, 0x9c, 0x5, 0xcd, 0xfc, 0x3d, 0xfb,
+ 0x43, 0xee, 0x7, 0x13, 0xbe, 0xdf, 0xf7, 0x40,
+ 0x7, 0xfb, 0xb1, 0xfb, 0x98, 0x5, 0xe, 0xfb,
+ 0x17, 0xe9, 0xf8, 0x9, 0xe8, 0xeb, 0xe6, 0x1,
+ 0xa4, 0x6c, 0x15, 0x71, 0x2f, 0x5, 0x87, 0xb1,
+ 0xab, 0x87, 0xb7, 0x1b, 0xdd, 0xde, 0xa9, 0xf2,
+ 0x9f, 0x1f, 0xd1, 0xf7, 0xe2, 0x5, 0xf6, 0x6,
+ 0x9d, 0xe8, 0x5, 0xfb, 0x1, 0x6, 0xe5, 0x93,
+ 0xad, 0x91, 0xd7, 0x1b, 0xab, 0xaa, 0x87, 0x89,
+ 0x9f, 0x1f, 0x9b, 0xe5, 0x5, 0x8d, 0x68, 0x67,
+ 0x90, 0x66, 0x1b, 0xfb, 0x10, 0x8a, 0x4b, 0x5f,
+ 0x7b, 0xfb, 0x22, 0x8, 0x25, 0x6, 0x78, 0x2e,
+ 0x5, 0xf3, 0x6, 0x4f, 0xfb, 0xae, 0x5, 0x3d,
+ 0x7d, 0x79, 0x7e, 0x51, 0x1b, 0x73, 0x5a, 0x8f,
+ 0x8d, 0x73, 0x1f, 0xe, 0x79, 0xe9, 0x8b, 0xf1,
+ 0x8b, 0xea, 0x8b, 0xd1, 0xf7, 0x26, 0xe6, 0x8b,
+ 0xaf, 0xf7, 0x42, 0x77, 0x12, 0x99, 0xed, 0xf7,
+ 0xdd, 0xea, 0x35, 0xed, 0x13, 0xff, 0x80, 0x46,
+ 0xa, 0xd0, 0xf7, 0x17, 0xf7, 0x21, 0xe6, 0xd3,
+ 0xed, 0x1f, 0x13, 0xff, 0x40, 0x41, 0xa, 0xfb,
+ 0xf, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x37,
+ 0xf7, 0x36, 0x1f, 0x13, 0xff, 0x80, 0x58, 0xa,
+ 0x64, 0xf7, 0xeb, 0x15, 0xe7, 0x6, 0xf7, 0x29,
+ 0xf7, 0x1e, 0x5, 0x13, 0xff, 0x40, 0x3e, 0xa,
+ 0xfb, 0x26, 0xe4, 0xed, 0xe3, 0x3d, 0xe3, 0xf7,
+ 0x6b, 0xe4, 0x3e, 0xe3, 0x8b, 0xb2, 0xf7, 0x42,
+ 0x77, 0x69, 0xa, 0x13, 0xd7, 0x80, 0x50, 0xa,
+ 0xf3, 0xf2, 0x1f, 0xf7, 0xb9, 0x7, 0x13, 0xd7,
+ 0x40, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, 0x13,
+ 0xcf, 0x80, 0x5a, 0xa, 0x1f, 0x13, 0xaf, 0x80,
+ 0xfb, 0x9, 0xee, 0x3c, 0xf7, 0x21, 0xc0, 0xbe,
+ 0x98, 0xa7, 0xb1, 0x1e, 0x67, 0x7, 0x51, 0x88,
+ 0x54, 0x42, 0xa, 0x69, 0x33, 0x43, 0x44, 0xb1,
+ 0xd2, 0x1e, 0xf7, 0x1d, 0xf7, 0x89, 0x43, 0xa,
+ 0xf8, 0x8c, 0x76, 0xf7, 0x42, 0x77, 0x1, 0xf7,
+ 0x35, 0xf8, 0x77, 0x15, 0xf7, 0x20, 0xf7, 0x2,
+ 0xf7, 0x20, 0xfb, 0x2, 0xc3, 0xac, 0xfb, 0x29,
+ 0xf7, 0x21, 0x5, 0x2e, 0x6, 0xfb, 0x2c, 0xfb,
+ 0x20, 0x5, 0xe, 0xf8, 0x96, 0x76, 0xf7, 0x42,
+ 0x77, 0x1, 0xf7, 0x94, 0xf8, 0x81, 0x43, 0xa,
+ 0xf8, 0x68, 0xde, 0x38, 0xf7, 0x37, 0x12, 0x13,
+ 0x40, 0xde, 0xf9, 0xb, 0x15, 0x43, 0x98, 0xcb,
+ 0x30, 0xf7, 0x21, 0x1b, 0xf7, 0x32, 0xbd, 0xf7,
+ 0x4, 0xbe, 0x93, 0x1f, 0x2e, 0x6, 0x13, 0x80,
+ 0x63, 0x7a, 0x70, 0x63, 0x3c, 0x1b, 0x13, 0x40,
+ 0x3d, 0x66, 0xb6, 0xb0, 0x83, 0x1f, 0xe, 0xf8,
+ 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x7a, 0xf7, 0x20,
+ 0x3, 0xf7, 0x7a, 0xf8, 0x79, 0x15, 0xf7, 0x20,
+ 0xf7, 0x20, 0xfb, 0x20, 0x6, 0xe, 0xf8, 0x75,
+ 0xf7, 0x59, 0x1, 0xf7, 0x5a, 0xc8, 0xdd, 0xc8,
+ 0x3, 0xf7, 0x5a, 0xf8, 0xd7, 0x15, 0x56, 0xb9,
+ 0x5e, 0xc2, 0xc4, 0xb9, 0xb8, 0xc0, 0xc1, 0x5d,
+ 0xb8, 0x52, 0x54, 0x5d, 0x5e, 0x55, 0x1e, 0xc8,
+ 0x16, 0xa2, 0x9d, 0x9d, 0xa1, 0xa3, 0x9d, 0x79,
+ 0x74, 0x75, 0x79, 0x79, 0x73, 0x75, 0x79, 0x9d,
+ 0xa1, 0x1e, 0xe, 0xfb, 0x5b, 0xf7, 0x5b, 0x12,
+ 0xf7, 0x5d, 0xe4, 0x32, 0xf7, 0x51, 0x13, 0xc0,
+ 0xf7, 0xbe, 0x16, 0x7d, 0x88, 0x38, 0x68, 0x42,
+ 0x1a, 0x5d, 0xaf, 0x61, 0xc0, 0x1e, 0x13, 0xa0,
+ 0xab, 0xb9, 0x9e, 0xa0, 0xa1, 0x1f, 0xd7, 0x7,
+ 0x13, 0xc0, 0x79, 0x73, 0x39, 0x60, 0xc5, 0x1a,
+ 0xb6, 0xde, 0xad, 0xa5, 0x9a, 0x1e, 0xe, 0xe3,
+ 0xf8, 0x3b, 0x3, 0xe3, 0xf8, 0x9a, 0x15, 0xdc,
+ 0x72, 0x5, 0xa3, 0x98, 0x95, 0xae, 0xac, 0x1b,
+ 0x9e, 0xa0, 0x7e, 0x7d, 0xa2, 0x1f, 0x7d, 0xa4,
+ 0xa7, 0x7c, 0xab, 0x1b, 0xec, 0xaa, 0xdf, 0xab,
+ 0x95, 0x1f, 0x3a, 0xa3, 0x5, 0x64, 0x78, 0x83,
+ 0x76, 0x6e, 0x1b, 0x78, 0x76, 0x96, 0x97, 0x75,
+ 0x1f, 0x9b, 0x6f, 0x6e, 0x9d, 0x6e, 0x1b, 0x2d,
+ 0x6f, 0x41, 0x62, 0x7b, 0x1f, 0xe, 0xf8, 0x8f,
+ 0x76, 0xf7, 0x43, 0x77, 0x1, 0xb3, 0xf8, 0x9c,
+ 0x3, 0xf7, 0x93, 0xf8, 0x8f, 0x15, 0xc8, 0x76,
+ 0xf7, 0x88, 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xfc,
+ 0x39, 0xfb, 0x2e, 0x15, 0xc8, 0x76, 0xf7, 0x8a,
+ 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xe, 0xf7, 0x5f,
+ 0xef, 0x1, 0xcc, 0xf8, 0x6a, 0x3, 0xcc, 0xf7,
+ 0x5f, 0x15, 0xf8, 0x6a, 0xef, 0xfc, 0x6a, 0x6,
+ 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x81, 0xf9, 0x0,
+ 0x3, 0x81, 0xf7, 0x5f, 0x15, 0xf9, 0x0, 0xef,
+ 0xfd, 0x0, 0x6, 0xe, 0xf7, 0xbe, 0x76, 0xf7,
+ 0xb5, 0x77, 0x1, 0xf7, 0xc7, 0xf7, 0xa9, 0x15,
+ 0xf7, 0xa, 0x6, 0x2b, 0xf7, 0xb5, 0x5, 0xfb,
+ 0x2e, 0x6, 0xe, 0x4c, 0xa, 0xf7, 0x42, 0xf7,
+ 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x1a, 0x59,
+ 0xa, 0xfb, 0x30, 0x6, 0xe, 0xfb, 0xd, 0x45,
+ 0xa, 0xf7, 0x42, 0xfb, 0x22, 0x15, 0xf7, 0xd,
+ 0x6, 0xf7, 0x17, 0x59, 0xa, 0xfb, 0x2f, 0x6,
+ 0xe, 0x4c, 0xa, 0xf8, 0x33, 0xf7, 0xa9, 0x5d,
+ 0xa, 0x36, 0xfb, 0xb1, 0x5d, 0xa, 0xe, 0x4c,
+ 0xa, 0xf7, 0xad, 0xf7, 0xa9, 0x15, 0xf7, 0xb,
+ 0x6, 0xf7, 0x18, 0x59, 0xa, 0xfb, 0x2d, 0x6,
+ 0xfb, 0xcb, 0x4e, 0xa, 0xfb, 0xd, 0x45, 0xa,
+ 0xf7, 0xad, 0xfb, 0x22, 0x15, 0xf7, 0xa, 0x6,
+ 0xf7, 0x19, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xfb,
+ 0xca, 0x4e, 0xa, 0xf7, 0xdc, 0xed, 0x1, 0xf7,
+ 0x8e, 0xef, 0x3, 0xf7, 0x8e, 0x45, 0x15, 0xef,
+ 0xf8, 0x29, 0xf7, 0x24, 0xed, 0xfb, 0x24, 0xf7,
+ 0x1d, 0x27, 0xfb, 0x1d, 0xfb, 0x24, 0x29, 0xf7,
+ 0x24, 0x6, 0xe, 0x5a, 0x76, 0xf7, 0x53, 0xed,
+ 0xf6, 0xed, 0xf7, 0x30, 0x77, 0x1, 0xf7, 0x90,
+ 0xee, 0x3, 0xf5, 0xf7, 0xd, 0x15, 0xf7, 0x26,
+ 0xfb, 0x53, 0xee, 0xf7, 0x53, 0xf7, 0x23, 0xed,
+ 0xfb, 0x23, 0xf6, 0xf7, 0x23, 0xed, 0xfb, 0x23,
+ 0xf7, 0x30, 0x28, 0xfb, 0x30, 0xfb, 0x26, 0x29,
+ 0xf7, 0x26, 0x20, 0xfb, 0x26, 0x6, 0xe, 0xf7,
+ 0xc, 0xf7, 0xfe, 0x1, 0xf7, 0xc, 0xf7, 0xfc,
+ 0x3, 0xf8, 0x74, 0xf7, 0xc1, 0x15, 0xef, 0x3b,
+ 0xdc, 0x27, 0x27, 0x3b, 0x3a, 0x27, 0x27, 0xdb,
+ 0x3a, 0xef, 0xef, 0xdb, 0xdc, 0xef, 0x1e, 0xe,
+ 0x7c, 0xf7, 0x17, 0x1, 0xa5, 0xf7, 0x1c, 0xd1,
+ 0xf7, 0x1c, 0xd1, 0xf7, 0x1c, 0x14, 0x70, 0xf8,
+ 0x4a, 0xbd, 0x15, 0x6c, 0xa3, 0x69, 0xb9, 0xb6,
+ 0xa2, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, 0x5a,
+ 0x77, 0x66, 0x6e, 0x1e, 0xfb, 0x62, 0x16, 0x6c,
+ 0xa3, 0x69, 0xb9, 0xb7, 0xa1, 0xad, 0xab, 0xad,
+ 0x75, 0xaa, 0x5e, 0x5b, 0x76, 0x66, 0x6e, 0x1e,
+ 0xfb, 0x62, 0x16, 0x6c, 0xa4, 0x69, 0xb8, 0xb7,
+ 0xa1, 0xad, 0xab, 0xad, 0x76, 0xaa, 0x5d, 0x5b,
+ 0x76, 0x66, 0x6e, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+ 0x1d, 0xd1, 0xd9, 0xd1, 0xf7, 0x1c, 0xd1, 0x12,
+ 0xfb, 0x5, 0xd8, 0xf3, 0xd7, 0x74, 0xd7, 0xf3,
+ 0xd8, 0xa3, 0xd7, 0xf7, 0x32, 0xd8, 0x13, 0xfb,
+ 0xc0, 0xf8, 0x26, 0xf7, 0xf, 0x15, 0x43, 0xc6,
+ 0x4a, 0xeb, 0x8a, 0x1e, 0xe1, 0xd1, 0xc6, 0xdb,
+ 0xd2, 0x4f, 0xce, 0x2d, 0x2f, 0x4a, 0x68, 0xa,
+ 0xc0, 0xbd, 0xa8, 0x6b, 0x67, 0x5c, 0x63, 0x75,
+ 0x63, 0x58, 0x70, 0xac, 0xaf, 0x1e, 0xfc, 0xe3,
+ 0xf7, 0xf5, 0x15, 0x43, 0xc6, 0x4b, 0xea, 0x8a,
+ 0x1e, 0xe2, 0xd0, 0xc6, 0xda, 0xd2, 0x50, 0xce,
+ 0x2c, 0x2f, 0x4b, 0x49, 0x42, 0x1f, 0xd8, 0x8c,
+ 0x15, 0xae, 0xa4, 0xac, 0xbf, 0xbe, 0xa8, 0x6b,
+ 0x67, 0x5d, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xab,
+ 0xaf, 0x1e, 0x13, 0xfd, 0xc0, 0xf3, 0xfb, 0xf7,
+ 0x15, 0x43, 0xc5, 0x4a, 0xea, 0x8a, 0x1e, 0xe2,
+ 0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2c, 0x2f,
+ 0x4c, 0x68, 0xa, 0xbe, 0xbe, 0xa8, 0x6b, 0x67,
+ 0x5c, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xac, 0xaf,
+ 0x1e, 0xfb, 0x5b, 0xc0, 0x15, 0xf8, 0x55, 0xf7,
+ 0x52, 0x6c, 0xca, 0xfc, 0x56, 0xfb, 0x51, 0x5,
+ 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0x96, 0x15,
+ 0xf7, 0x9f, 0xfb, 0x50, 0xbc, 0xca, 0xfb, 0x4b,
+ 0xf7, 0x15, 0xf7, 0x4b, 0xf7, 0xd, 0x5a, 0xca,
+ 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0xd0,
+ 0x3, 0xf7, 0x52, 0xf8, 0x52, 0x15, 0x5a, 0x4c,
+ 0xf7, 0x4b, 0xfb, 0xd, 0xfb, 0x4b, 0xfb, 0x15,
+ 0xbc, 0x4c, 0xf7, 0x9f, 0xf7, 0x50, 0x5, 0xe,
+ 0x64, 0x76, 0xf9, 0x65, 0x77, 0x1, 0xa3, 0xf8,
+ 0xbb, 0x3, 0xa3, 0x83, 0x15, 0xd1, 0x57, 0xf8,
+ 0x75, 0xf9, 0x34, 0x44, 0xbc, 0x5, 0xe, 0x84,
+ 0x76, 0xf7, 0x5f, 0xd4, 0xba, 0xd4, 0xf7, 0x2b,
+ 0xe8, 0x1, 0xf7, 0xf, 0xe9, 0x3, 0xc7, 0xaf,
+ 0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, 0xec, 0xb0,
+ 0xbb, 0x1b, 0xa1, 0xa6, 0x82, 0x83, 0xa6, 0x1f,
+ 0x84, 0xa2, 0xad, 0x85, 0x9f, 0x1b, 0xd3, 0xa8,
+ 0xbd, 0x71, 0xa, 0x7a, 0x72, 0x64, 0xa, 0x6b,
+ 0x94, 0x7c, 0x1b, 0x7a, 0x50, 0x86, 0x85, 0x7c,
+ 0x1f, 0xa6, 0x9a, 0x93, 0xb7, 0x89, 0xa0, 0x8,
+ 0xf7, 0x45, 0xd4, 0xfb, 0x50, 0x6, 0x88, 0x93,
+ 0x87, 0xa3, 0x8a, 0x9a, 0x8, 0xf7, 0x58, 0xd4,
+ 0xfb, 0x5a, 0x6, 0x89, 0xa8, 0x8a, 0xa4, 0x94,
+ 0x6c, 0xa, 0xba, 0x72, 0x5e, 0xa0, 0x1f, 0xde,
+ 0xaf, 0x5, 0xb9, 0x70, 0x57, 0xdc, 0x63, 0xa,
+ 0x83, 0x8b, 0x77, 0x8d, 0x73, 0x1e, 0x47, 0x42,
+ 0xd0, 0x6, 0x8e, 0x75, 0x8b, 0x79, 0x8d, 0x84,
+ 0x8, 0x41, 0x42, 0xe1, 0x6, 0x91, 0x59, 0x63,
+ 0x4d, 0x5a, 0x70, 0x8, 0xe, 0x8b, 0xde, 0xe5,
+ 0xd5, 0xc1, 0xd4, 0xf4, 0xde, 0x1, 0xd8, 0xee,
+ 0xf7, 0xdd, 0xed, 0x3, 0x82, 0xf7, 0x4c, 0x15,
+ 0xef, 0x6, 0xfb, 0xe, 0xae, 0xf7, 0x8, 0x4d,
+ 0xf7, 0xd, 0x1b, 0xe3, 0xe1, 0xaa, 0xbc, 0xd3,
+ 0x1f, 0x53, 0xc3, 0x5, 0x63, 0x65, 0x3a, 0x79,
+ 0x48, 0x1b, 0x46, 0x8c, 0x44, 0xb3, 0x6d, 0xcc,
+ 0x8, 0xf7, 0x40, 0x6, 0xa5, 0xd5, 0x5, 0xfb,
+ 0x6e, 0x6, 0x8a, 0x91, 0x8b, 0x94, 0x91, 0x92,
+ 0x8c, 0x93, 0x92, 0x1a, 0xf7, 0x7b, 0x6, 0xa6,
+ 0xd4, 0x5, 0xfb, 0x83, 0x6, 0xd5, 0xa3, 0xd5,
+ 0xaa, 0xd3, 0x1b, 0xbf, 0x8a, 0xbf, 0x79, 0xae,
+ 0x63, 0x8, 0x47, 0xed, 0xf7, 0x66, 0x29, 0x5c,
+ 0x7, 0xaa, 0x5e, 0x56, 0x9b, 0x54, 0x1b, 0xfb,
+ 0xa, 0xfb, 0x3, 0x43, 0xfb, 0x8, 0x6a, 0x1f,
+ 0x43, 0x6, 0x70, 0x42, 0x5, 0xe1, 0x79, 0x6,
+ 0x8c, 0x72, 0x5, 0x4f, 0x6, 0xe, 0x7c, 0xe8,
+ 0xf7, 0x1c, 0xe8, 0xf7, 0x36, 0xe8, 0x1, 0xec,
+ 0xee, 0xf7, 0x7b, 0xed, 0x3, 0x97, 0x7c, 0x15,
+ 0xf7, 0x9c, 0xe8, 0x3b, 0xf7, 0x1c, 0xde, 0x6,
+ 0xad, 0x5d, 0xb0, 0x5d, 0xa1, 0x6b, 0x5b, 0x55,
+ 0x18, 0xd1, 0x58, 0xaa, 0xa9, 0x95, 0x7c, 0x8d,
+ 0x88, 0x93, 0x7f, 0x19, 0xf7, 0x22, 0xe8, 0x32,
+ 0x6, 0x7f, 0x9f, 0xcc, 0xe4, 0x44, 0xbc, 0x5c,
+ 0x4a, 0x5d, 0xc8, 0x5, 0xf5, 0x9e, 0xab, 0xd1,
+ 0xd3, 0x1a, 0xf7, 0xb, 0x28, 0xbd, 0xfb, 0x8,
+ 0x1e, 0xfb, 0xba, 0x2e, 0xdc, 0xfc, 0x1b, 0x36,
+ 0x6, 0xf7, 0x4c, 0xf7, 0x79, 0x15, 0xf7, 0x36,
+ 0x7, 0xf7, 0x4a, 0xbc, 0x92, 0x37, 0x2e, 0x39,
+ 0x93, 0xfb, 0x29, 0x1f, 0xe, 0xf7, 0x8f, 0x76,
+ 0xf7, 0xae, 0xbc, 0x1, 0xf7, 0x4, 0xbb, 0xf7,
+ 0xb, 0xba, 0xf7, 0x58, 0xbb, 0x3, 0xf7, 0xab,
+ 0xf7, 0x7a, 0x15, 0xba, 0xf7, 0xb5, 0x6, 0xd1,
+ 0xfb, 0xb5, 0x5, 0xc7, 0x6, 0xcd, 0xf7, 0xb4,
+ 0x5, 0xfb, 0xb4, 0xbb, 0xf7, 0xe0, 0x32, 0x7,
+ 0x52, 0xfb, 0x97, 0x51, 0xf7, 0x97, 0x5, 0x34,
+ 0x6, 0xfb, 0x3b, 0xfb, 0xe0, 0x15, 0xbb, 0xf7,
+ 0xae, 0xdd, 0xbc, 0xfb, 0x69, 0x5a, 0xde, 0x6,
+ 0xe, 0x75, 0xa, 0xf7, 0x33, 0x76, 0xa, 0xf8,
+ 0x7e, 0xe1, 0xfc, 0x79, 0x5b, 0xa, 0x8e, 0xf9,
+ 0x3, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x92,
+ 0x8e, 0x15, 0xe1, 0xf8, 0x5b, 0x6, 0xbf, 0x45,
+ 0xcb, 0xbd, 0xfb, 0x31, 0xf7, 0x50, 0xfb, 0x2f,
+ 0xfb, 0x4d, 0xca, 0x58, 0xba, 0xca, 0x5, 0xe,
+ 0x75, 0xa, 0x6e, 0xf7, 0x96, 0x15, 0xf8, 0x7e,
+ 0x47, 0xa, 0xfc, 0x79, 0x6, 0xe, 0x91, 0x76,
+ 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x24, 0xf7,
+ 0x3e, 0x15, 0xf7, 0x2f, 0xfb, 0x4d, 0xf7, 0x31,
+ 0xf7, 0x50, 0x4b, 0xbd, 0x57, 0x45, 0x5, 0xf8,
+ 0x5b, 0x35, 0xfc, 0x56, 0x7, 0x5c, 0xca, 0x5,
+ 0xe, 0xf7, 0x96, 0xe1, 0x1, 0x73, 0xf9, 0x1c,
+ 0x3, 0xf7, 0x38, 0x76, 0xa, 0xf7, 0xcc, 0x47,
+ 0xa, 0xfb, 0xc2, 0x5b, 0xa, 0xf7, 0x5f, 0xf7,
+ 0x2, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0x5c, 0xa,
+ 0xe, 0x8b, 0xe5, 0xf7, 0x87, 0xe5, 0xd7, 0xf7,
+ 0x13, 0x73, 0x77, 0x12, 0xf4, 0xe5, 0xf7, 0x12,
+ 0xf7, 0x42, 0x2f, 0xe7, 0x13, 0xea, 0xf8, 0x27,
+ 0xf8, 0x87, 0x15, 0xe7, 0xf7, 0x13, 0x2f, 0x6,
+ 0x2f, 0xfd, 0x6, 0x15, 0xf7, 0xab, 0xe5, 0x2c,
+ 0xf7, 0xe1, 0x6, 0x13, 0xec, 0xfb, 0x42, 0x31,
+ 0x6, 0x13, 0xda, 0xdd, 0xfb, 0x87, 0x2f, 0x6,
+ 0xfb, 0xc2, 0x31, 0x15, 0xf7, 0xae, 0xe5, 0x2b,
+ 0xf7, 0x87, 0xeb, 0xe5, 0x2b, 0xbf, 0x6, 0xb4,
+ 0xdf, 0x87, 0xa4, 0x1e, 0x8e, 0xe5, 0x5, 0x21,
+ 0x2b, 0x8c, 0xfb, 0x1d, 0x1f, 0x60, 0x2b, 0x31,
+ 0xeb, 0xfb, 0x87, 0x2b, 0x7, 0xe, 0x8b, 0xe8,
+ 0xf7, 0x90, 0xe8, 0xea, 0xe5, 0x8e, 0x77, 0x12,
+ 0xf4, 0xe5, 0xf7, 0x3d, 0xf7, 0x17, 0x31, 0xe5,
+ 0x13, 0xdc, 0xf7, 0xcc, 0x16, 0xf7, 0xaa, 0xe8,
+ 0x2c, 0xf8, 0xa9, 0xfb, 0x17, 0x6, 0x13, 0xec,
+ 0x2e, 0x7, 0x13, 0xea, 0xb4, 0xfc, 0x4c, 0x2e,
+ 0x6, 0xfb, 0xc3, 0x2e, 0x15, 0xf7, 0xac, 0xe8,
+ 0x2d, 0xf7, 0x90, 0xe9, 0xe8, 0x2d, 0xbe, 0x6,
+ 0xab, 0xb6, 0x96, 0xb1, 0x8c, 0x1e, 0xa5, 0x8c,
+ 0xa3, 0x8b, 0x91, 0x89, 0x8c, 0xe6, 0x18, 0x20,
+ 0xfb, 0xd, 0x8b, 0xfb, 0x20, 0x1f, 0x5e, 0x2b,
+ 0x2e, 0xeb, 0xfb, 0x90, 0x2b, 0x7, 0xe, 0x79,
+ 0x9d, 0xf8, 0x4b, 0x9f, 0xf2, 0x9d, 0x9f, 0x95,
+ 0x95, 0x95, 0x6, 0xfb, 0x26, 0x8f, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe8, 0xa,
+ 0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, 0x14,
+ 0xae, 0x13, 0x0, 0x5d, 0x2, 0x0, 0x1, 0x0,
+ 0x35, 0x0, 0x43, 0x0, 0x47, 0x0, 0x7a, 0x0,
+ 0xba, 0x0, 0xc4, 0x0, 0xe9, 0x1, 0x17, 0x1,
+ 0x34, 0x1, 0x4c, 0x1, 0x65, 0x1, 0x7d, 0x1,
+ 0x94, 0x1, 0xa8, 0x1, 0xbb, 0x1, 0xca, 0x1,
+ 0xdc, 0x1, 0xe2, 0x1, 0xe9, 0x1, 0xfc, 0x2,
+ 0x6, 0x2, 0x10, 0x2, 0x24, 0x2, 0x36, 0x2,
+ 0x43, 0x2, 0x4c, 0x2, 0x6c, 0x2, 0x71, 0x2,
+ 0x78, 0x2, 0x7f, 0x2, 0x8d, 0x2, 0x95, 0x2,
+ 0xa0, 0x2, 0xb8, 0x2, 0xcf, 0x2, 0xd8, 0x2,
+ 0xe1, 0x2, 0xe7, 0x2, 0xfa, 0x3, 0xd, 0x3,
+ 0x1c, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3,
+ 0x43, 0x3, 0x49, 0x3, 0x57, 0x3, 0x61, 0x3,
+ 0x71, 0x3, 0x75, 0x3, 0x7e, 0x3, 0x87, 0x3,
+ 0x90, 0x3, 0x97, 0x3, 0xa5, 0x3, 0xb1, 0x3,
+ 0xbf, 0x3, 0xc3, 0x3, 0xd0, 0x3, 0xdb, 0x3,
+ 0xe7, 0x3, 0xf2, 0x3, 0xfe, 0x4, 0x4, 0x4,
+ 0x8, 0x4, 0xe, 0x4, 0x14, 0x4, 0x1f, 0x4,
+ 0x2a, 0x4, 0x31, 0x4, 0x36, 0x4, 0x3b, 0x4,
+ 0x45, 0x4, 0x4f, 0x4, 0x53, 0x4, 0x57, 0x4,
+ 0x60, 0x4, 0x69, 0x4, 0x72, 0x4, 0x7b, 0x4,
+ 0x84, 0x4, 0x8d, 0x4, 0x96, 0x4, 0x9f, 0x4,
+ 0xa8, 0x4, 0xb1, 0x4, 0xba, 0x4, 0xc1, 0x4,
+ 0xc8, 0x4, 0xce, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+ 0xde, 0xf7, 0x97, 0xe5, 0x27, 0x6, 0xa9, 0xcc,
+ 0x5, 0xf7, 0x86, 0x6, 0xa9, 0x4a, 0x5, 0x2a,
+ 0x31, 0xf7, 0x92, 0xe5, 0x51, 0x6, 0xfb, 0x62,
+ 0xf8, 0x62, 0x5, 0xfb, 0x8f, 0x31, 0xf7, 0x15,
+ 0x6, 0xfb, 0x3f, 0xfc, 0x8, 0x5, 0x4e, 0x6,
+ 0xf7, 0x7a, 0xf7, 0x2f, 0x15, 0xdc, 0xf7, 0x47,
+ 0xdc, 0xfb, 0x47, 0x5, 0xb, 0x2a, 0xa, 0x13,
+ 0x7d, 0x4d, 0xa, 0x13, 0x7e, 0x2b, 0xa, 0x13,
+ 0xbe, 0x29, 0xa, 0x15, 0x20, 0xa, 0xe, 0x15,
+ 0xfb, 0x39, 0xf7, 0x2a, 0x51, 0xf7, 0xa, 0xf7,
+ 0xf, 0xf7, 0x29, 0xcb, 0xf7, 0x33, 0xf7, 0x24,
+ 0xfb, 0x6, 0xe0, 0xfb, 0x32, 0xfb, 0x21, 0xfb,
+ 0x13, 0x3d, 0xfb, 0x2b, 0x1e, 0xef, 0x16, 0xdf,
+ 0xd4, 0xc0, 0xea, 0xf7, 0x7, 0xc5, 0x52, 0x3b,
+ 0x34, 0x28, 0x5b, 0x41, 0x47, 0x27, 0xb7, 0xe6,
+ 0x1e, 0xe, 0x15, 0xf8, 0x23, 0x6, 0xf7, 0x1c,
+ 0xa5, 0x32, 0xf7, 0x14, 0xfb, 0x43, 0x1b, 0xfb,
+ 0xc, 0xfb, 0x1f, 0x3f, 0xfb, 0x2b, 0xfb, 0x8,
+ 0xe3, 0x21, 0xf7, 0x41, 0xe5, 0xeb, 0xa9, 0xb4,
+ 0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6d, 0x4b, 0x3b,
+ 0x6d, 0x41, 0x1b, 0xfb, 0x10, 0x69, 0xc7, 0xae,
+ 0x86, 0x1f, 0x92, 0xe6, 0x15, 0xc3, 0xa0, 0xce,
+ 0xa4, 0xc8, 0x1b, 0xc7, 0xca, 0x7a, 0x4b, 0x9e,
+ 0x1f, 0xe, 0x2f, 0xa, 0xf7, 0x2e, 0x2e, 0xf7,
+ 0x1c, 0x26, 0xa, 0xb, 0xfb, 0x4c, 0xfb, 0x42,
+ 0x22, 0xfb, 0x21, 0xfb, 0x2b, 0x1e, 0xed, 0x8e,
+ 0x15, 0xe6, 0xc8, 0xf6, 0xf7, 0xc, 0xf7, 0x1c,
+ 0xb9, 0xfb, 0x13, 0x47, 0x3a, 0x5a, 0xfb, 0x10,
+ 0xfb, 0x19, 0xfb, 0xd, 0x4f, 0xf3, 0xed, 0x1e,
+ 0xb, 0xdb, 0xfb, 0xa2, 0x6, 0xfb, 0x11, 0xd3,
+ 0x38, 0xf7, 0x25, 0xf7, 0x11, 0xe8, 0xdc, 0xf7,
+ 0x12, 0x1e, 0xf7, 0xa3, 0xd8, 0xe6, 0xfb, 0x96,
+ 0x30, 0xe1, 0xfb, 0x8d, 0x7, 0x35, 0x74, 0x57,
+ 0x25, 0xfb, 0x4, 0x83, 0xe2, 0xc0, 0x1e, 0xf7,
+ 0x8b, 0xdf, 0xe6, 0xfb, 0x97, 0x7, 0xe, 0x15,
+ 0x13, 0xb5, 0x0, 0x2e, 0xa, 0x13, 0x78, 0x80,
+ 0x64, 0xf7, 0x43, 0xe6, 0x7, 0x13, 0x7a, 0x0,
+ 0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, 0x13,
+ 0xb9, 0x0, 0x2c, 0xa, 0x61, 0x5b, 0x4f, 0x69,
+ 0x47, 0x1b, 0x60, 0x62, 0x9c, 0xab, 0xb7, 0xbf,
+ 0x9d, 0xc6, 0x8c, 0x1f, 0xc7, 0x8c, 0xcd, 0x85,
+ 0xa2, 0x89, 0x8, 0xe, 0x1f, 0x8f, 0x67, 0x63,
+ 0x8e, 0x66, 0x1b, 0xfb, 0x7f, 0x82, 0xfb, 0x19,
+ 0x78, 0x4b, 0xcb, 0x3e, 0xf7, 0xa, 0xda, 0xb0,
+ 0xa1, 0xae, 0xc6, 0x1f, 0xb, 0x38, 0xf7, 0x37,
+ 0x6, 0xf7, 0xe, 0x5d, 0xc8, 0xfb, 0x10, 0xfb,
+ 0x0, 0xfb, 0xe, 0x66, 0x7f, 0x7a, 0x1e, 0xf7,
+ 0xd6, 0xfb, 0x7c, 0x15, 0xb, 0xda, 0xfb, 0x4f,
+ 0x6, 0x75, 0x63, 0x52, 0x71, 0x59, 0x8a, 0x8,
+ 0x5a, 0x8a, 0x60, 0xa0, 0xbf, 0x1a, 0xf7, 0xa5,
+ 0xfb, 0x42, 0x7, 0xe, 0xfb, 0x93, 0x38, 0xa,
+ 0xf7, 0x93, 0xfb, 0x6, 0xed, 0xf7, 0x60, 0xfc,
+ 0xa2, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xb,
+ 0xdc, 0xfb, 0x48, 0x6, 0xfb, 0x2, 0xc7, 0x54,
+ 0xf7, 0xa, 0x8a, 0x1e, 0xbf, 0xbe, 0xa1, 0xa9,
+ 0xac, 0x1f, 0xb, 0x15, 0xfb, 0x56, 0xf7, 0x25,
+ 0x2d, 0xf7, 0x1a, 0xf3, 0xf7, 0x41, 0xd2, 0xf7,
+ 0x6f, 0xb, 0xfb, 0x3f, 0xf8, 0x8, 0xf7, 0x36,
+ 0xe5, 0xfc, 0x3f, 0x31, 0xf7, 0x39, 0xfc, 0x8,
+ 0xfb, 0x43, 0x6, 0xb, 0xf8, 0x52, 0xe5, 0x30,
+ 0xa, 0xb, 0x8b, 0xe6, 0xf8, 0x10, 0xe6, 0x1,
+ 0xb, 0x15, 0xf8, 0x52, 0xe6, 0xfb, 0x43, 0xf7,
+ 0xe0, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x85,
+ 0xfb, 0x42, 0x6, 0xe, 0x12, 0xab, 0xec, 0xf7,
+ 0x98, 0xea, 0x2c, 0xf7, 0x46, 0xb, 0xf8, 0xa5,
+ 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x2d, 0xa, 0xb,
+ 0x77, 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0xf7,
+ 0x22, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, 0x43,
+ 0x13, 0xba, 0x0, 0xb, 0x5a, 0xbb, 0x64, 0xc7,
+ 0xc7, 0xbb, 0xb2, 0xbc, 0xbc, 0x5b, 0xb2, 0x4f,
+ 0x4f, 0x5b, 0x64, 0x5a, 0x1e, 0xb, 0xf7, 0x27,
+ 0xf1, 0x4b, 0xee, 0xf7, 0x6c, 0x28, 0x4b, 0x25,
+ 0xf7, 0x1d, 0xb, 0x7c, 0xe6, 0x3c, 0xe5, 0xf0,
+ 0xe5, 0xcf, 0xe2, 0xb, 0x7, 0xf7, 0x9e, 0xf8,
+ 0x26, 0x5, 0xd7, 0xe2, 0xfb, 0x76, 0x34, 0xb8,
+ 0x6, 0xfb, 0x14, 0xfb, 0x54, 0xfb, 0x6, 0xf7,
+ 0x54, 0x5, 0xbc, 0xe2, 0xfb, 0x7b, 0x34, 0xd7,
+ 0x6, 0xf7, 0x3a, 0xb, 0x34, 0xa, 0x13, 0xbe,
+ 0xb, 0x4a, 0xa, 0xf7, 0x83, 0x36, 0xa, 0xb,
+ 0xbf, 0xa9, 0x70, 0x5b, 0x2a, 0xa, 0xb, 0x53,
+ 0xaf, 0xfb, 0x20, 0xfb, 0x1, 0xfb, 0x20, 0xf7,
+ 0x1, 0x51, 0x68, 0x5, 0xe, 0x15, 0x9b, 0xa9,
+ 0xf4, 0xa4, 0xd7, 0x1b, 0xb, 0xe9, 0x1, 0xf7,
+ 0x8e, 0xee, 0x60, 0xa, 0xe9, 0xfb, 0x42, 0xb,
+ 0xc9, 0xaf, 0x75, 0x6d, 0xbe, 0x1f, 0x2d, 0xed,
+ 0xf7, 0x81, 0x29, 0x5c, 0x7, 0xa5, 0x62, 0x66,
+ 0xa0, 0x41, 0x1b, 0xfb, 0x32, 0xfb, 0x12, 0xb,
+ 0xfb, 0xa, 0x42, 0x39, 0xa3, 0x95, 0x64, 0x1e,
+ 0xa7, 0xf7, 0xa3, 0x15, 0xd2, 0xcd, 0xba, 0xd9,
+ 0xdf, 0xc6, 0x5f, 0x3f, 0x42, 0x53, 0xb, 0x15,
+ 0xe7, 0x6, 0xf7, 0x29, 0xf7, 0x1e, 0x3e, 0xa,
+ 0x1, 0x82, 0xf7, 0x97, 0xf4, 0xf7, 0x92, 0x3,
+ 0xb, 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb, 0xf7,
+ 0xc4, 0xf7, 0x46, 0x15, 0xf7, 0x1d, 0x32, 0x6,
+ 0x81, 0x62, 0x64, 0x88, 0x67, 0x1b, 0xfb, 0x14,
+ 0x36, 0xb, 0x6, 0x45, 0x57, 0xbd, 0x4c, 0xf7,
+ 0x50, 0xf7, 0x30, 0xfb, 0x4d, 0xf7, 0x30, 0x58,
+ 0x4c, 0xca, 0x5b, 0x5, 0xb, 0x8b, 0xe5, 0xf7,
+ 0x27, 0xe3, 0xf7, 0x1d, 0x5f, 0xa, 0xf7, 0x9,
+ 0xec, 0xf1, 0xee, 0xb, 0x66, 0xac, 0x6c, 0xb4,
+ 0xb4, 0xac, 0xaa, 0xb0, 0xb2, 0x6a, 0xa9, 0x62,
+ 0x62, 0x6a, 0x6d, 0x64, 0x1e, 0xb, 0x7c, 0xe7,
+ 0x3c, 0xe6, 0xf7, 0x86, 0xe6, 0xb, 0x1, 0xa9,
+ 0xef, 0xf7, 0xe9, 0xee, 0x3, 0xb, 0xf7, 0xbe,
+ 0x45, 0xa, 0xb, 0x5e, 0xf7, 0x46, 0xe5, 0x7,
+ 0xb, 0xfb, 0xb1, 0x15, 0xf7, 0x9, 0x6, 0xf7,
+ 0x1a, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xe, 0x79,
+ 0xe6, 0xf8, 0x17, 0xe6, 0xf7, 0x7d, 0x52, 0xa,
+ 0xb, 0xe7, 0x74, 0x15, 0x75, 0x32, 0x5, 0x79,
+ 0xdf, 0xc8, 0x7b, 0xd5, 0x1b, 0xf7, 0x50, 0xa1,
+ 0xb, 0x3f, 0xa, 0xbf, 0xb, 0x77, 0x1, 0xdf,
+ 0xea, 0xf7, 0x89, 0xea, 0x3, 0xb, 0x15, 0xf7,
+ 0x5, 0xf7, 0x10, 0xfb, 0x5, 0x6, 0xb, 0x77,
+ 0x1, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x3, 0xb,
+ 0x7c, 0xe5, 0xea, 0xe6, 0xdc, 0xe7, 0xb, 0x6,
+ 0xfb, 0x4e, 0xfb, 0xe, 0x15, 0xf7, 0x6, 0xf7,
+ 0xe, 0xfb, 0x6, 0x6, 0xb, 0x8b, 0xe6, 0xf7,
+ 0x85, 0xe6, 0xf7, 0x82, 0x67, 0xa, 0xec, 0x3,
+ 0xb, 0xd2, 0xd2, 0x9c, 0xaa, 0xc6, 0x1f, 0xf7,
+ 0x28, 0xbd, 0xea, 0xfb, 0xae, 0x7, 0xb, 0xf7,
+ 0xb1, 0x5, 0xb, 0xa7, 0x66, 0x5a, 0x97, 0x56,
+ 0x1b, 0xfb, 0x23, 0x27, 0x30, 0xfb, 0x8, 0xb,
+ 0x6, 0xca, 0xbb, 0x58, 0xca, 0xfb, 0x4d, 0xfb,
+ 0x30, 0x5, 0xe, 0xd2, 0xf7, 0x5f, 0x15, 0xf8,
+ 0x5e, 0xf7, 0x2, 0xfc, 0x5e, 0x6, 0xb, 0x15,
+ 0xf7, 0x9, 0x6, 0x2b, 0x59, 0xa, 0xfb, 0x2c,
+ 0x6, 0xb, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+ 0xd2, 0xf8, 0x5d, 0x3, 0xd2, 0xb, 0xe5, 0xf7,
+ 0x7c, 0x77, 0x1, 0xb, 0x3, 0x66, 0xa, 0xb,
+ 0x79, 0xe4, 0xf8, 0x24, 0xe6, 0xb, 0x7c, 0xe7,
+ 0xf7, 0x9f, 0xe7, 0xb, 0xfb, 0x12, 0x1b, 0xfb,
+ 0x1b, 0x45, 0x2b, 0x2c, 0x8c, 0x1f, 0xb, 0x67,
+ 0x1b, 0x81, 0x7c, 0x8f, 0x91, 0x7b, 0x1f, 0x92,
+ 0x76, 0xb, 0xc3, 0x56, 0xf8, 0xd0, 0xf9, 0xf,
+ 0xb, 0xd8, 0x16, 0xf8, 0x52, 0xb, 0x77, 0x1,
+ 0xf7, 0x8f, 0xb, 0x49, 0x42, 0x1f, 0xd7, 0x8c,
+ 0x15, 0xae, 0xa5, 0xac, 0xb, 0x12, 0xa4, 0xea,
+ 0xf7, 0xb3, 0xe7, 0x2f, 0xf7, 0x3c, 0xb, 0xfb,
+ 0xc, 0x5, 0xb, 0xfb, 0x3, 0x6, 0xb, 0x1a,
+ 0xbc, 0x8a, 0xb2, 0xb1, 0xd5, 0x1b, 0xbf, 0xb,
+ 0x1, 0xf7, 0x54, 0xf7, 0x6c, 0x3, 0xf7, 0x54,
+ 0xb, 0x77, 0x1, 0xf7, 0x93, 0xe5, 0x3, 0xf7,
+ 0x93, 0xb, 0x15, 0xf7, 0x2, 0xf7, 0x11, 0xfb,
+ 0x2, 0x6, 0xb, 0x15, 0xf7, 0x6, 0xf7, 0x12,
+ 0xfb, 0x6, 0x6, 0xb, 0xa4, 0xa0, 0x1f, 0x53,
+ 0xca, 0x5, 0x77, 0x71, 0xb, 0x15, 0xf7, 0x4,
+ 0xf7, 0x12, 0xfb, 0x4, 0x6, 0xb, 0x15, 0xf7,
+ 0xa, 0xf7, 0x24, 0xfb, 0xa, 0x6, 0xb, 0xf7,
+ 0x3c, 0xe6, 0xfc, 0x4c, 0x30, 0xf7, 0x3f, 0xb,
+ 0xf7, 0x96, 0xe1, 0x1, 0x6e, 0xf9, 0x26, 0x3,
+ 0xb, 0xf7, 0x23, 0x15, 0xbd, 0xca, 0x45, 0xbf,
+ 0x5, 0xb, 0xc5, 0xfb, 0xc3, 0xf7, 0xd, 0x5,
+ 0xe, 0xa1, 0xd8, 0x1e, 0xf6, 0x29, 0x7, 0xe,
+ 0x15, 0xf7, 0x3, 0xf7, 0x23, 0xb, 0x30, 0xde,
+ 0xfc, 0x10, 0x38, 0xb, 0xd1, 0xf8, 0xc, 0x1,
+ 0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
new file mode 100644
index 0000000000..45847f671c
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
@@ -0,0 +1,2402 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldItalicFontData [19151] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0,
+ 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c,
+ 0x3, 0xf8, 0x14, 0x4, 0xfb, 0xa, 0xfb, 0x8d,
+ 0xf9, 0x49, 0xf9, 0xbf, 0x5, 0xf7, 0xad, 0xf,
+ 0xf9, 0x94, 0x11, 0xac, 0x1c, 0x44, 0x2e, 0x12,
+ 0x0, 0x12, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11,
+ 0x19, 0x22, 0x2b, 0x34, 0x3e, 0x45, 0x4b, 0x4d,
+ 0x51, 0x5d, 0x65, 0x8f, 0xaa, 0xb9, 0x45, 0x75,
+ 0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+ 0x49, 0x4a, 0x49, 0x64, 0x6f, 0x74, 0x53, 0x63,
+ 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61,
+ 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+ 0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c,
+ 0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20,
+ 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64,
+ 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43,
+ 0x68, 0x72, 0x6F, 0x68, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+ 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+ 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+ 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+ 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+ 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+ 0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+ 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+ 0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+ 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+ 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+ 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+ 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+ 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+ 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+ 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+ 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+ 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+ 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+ 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+ 0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+ 0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+ 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+ 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+ 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+ 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+ 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+ 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+ 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+ 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+ 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+ 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+ 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+ 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+ 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+ 0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+ 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+ 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+ 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+ 0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+ 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+ 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+ 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+ 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+ 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+ 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+ 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+ 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+ 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+ 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+ 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+ 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+ 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+ 0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+ 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+ 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+ 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+ 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+ 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+ 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+ 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+ 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x44,
+ 0x0, 0xc1, 0x0, 0xdc, 0x1, 0x2, 0x1, 0x26,
+ 0x1, 0x40, 0x1, 0x76, 0x1, 0xbf, 0x2, 0x29,
+ 0x2, 0x78, 0x2, 0xfe, 0x3, 0x37, 0x3, 0x84,
+ 0x3, 0xa1, 0x3, 0xc9, 0x3, 0xed, 0x4, 0x13,
+ 0x4, 0x6e, 0x4, 0xf0, 0x5, 0x3a, 0x5, 0x9a,
+ 0x6, 0x8, 0x6, 0x5e, 0x6, 0x83, 0x6, 0xdb,
+ 0x6, 0xf4, 0x7, 0x1d, 0x7, 0x38, 0x7, 0x6e,
+ 0x7, 0x84, 0x7, 0xc1, 0x8, 0x19, 0x8, 0x45,
+ 0x8, 0x85, 0x8, 0xc9, 0x8, 0xf8, 0x9, 0x6e,
+ 0x9, 0xb6, 0xa, 0x36, 0xa, 0x52, 0xa, 0x75,
+ 0xa, 0x9a, 0xa, 0xbb, 0xb, 0x3c, 0xb, 0x86,
+ 0xb, 0xd0, 0xc, 0x48, 0xc, 0xa7, 0xd, 0x1b,
+ 0xd, 0x8b, 0xe, 0x2b, 0xe, 0x5c, 0xe, 0xba,
+ 0xf, 0x17, 0xf, 0x33, 0xf, 0x59, 0xf, 0x81,
+ 0xf, 0x9a, 0xf, 0xcb, 0x10, 0xd, 0x10, 0x56,
+ 0x10, 0x8f, 0x10, 0xe0, 0x11, 0x4b, 0x11, 0x7d,
+ 0x11, 0xce, 0x12, 0x48, 0x12, 0x67, 0x12, 0x9b,
+ 0x12, 0xaf, 0x12, 0xdd, 0x13, 0x88, 0x13, 0xa6,
+ 0x14, 0x29, 0x14, 0x62, 0x14, 0x83, 0x14, 0xa5,
+ 0x14, 0xc3, 0x14, 0xdc, 0x15, 0x0, 0x15, 0x32,
+ 0x15, 0x7e, 0x15, 0xad, 0x16, 0x4c, 0x16, 0xaa,
+ 0x17, 0x8, 0x17, 0x21, 0x17, 0x3b, 0x17, 0xb4,
+ 0x18, 0x2c, 0x18, 0x4c, 0x18, 0x70, 0x18, 0x94,
+ 0x18, 0xbd, 0x18, 0xde, 0x19, 0x29, 0x19, 0x44,
+ 0x19, 0xc2, 0x19, 0xfe, 0x1a, 0x5d, 0x1a, 0x7a,
+ 0x1a, 0xb5, 0x1a, 0xd3, 0x1b, 0x5a, 0x1b, 0xd7,
+ 0x1c, 0x39, 0x1c, 0x6a, 0x1c, 0xaf, 0x1c, 0xeb,
+ 0x1d, 0x15, 0x1d, 0x3f, 0x1d, 0xd5, 0x1d, 0xee,
+ 0x1e, 0xd, 0x1e, 0x5d, 0x1e, 0x73, 0x1e, 0x9e,
+ 0x1e, 0xc0, 0x1e, 0xe9, 0x1f, 0x63, 0x1f, 0x88,
+ 0x1f, 0x9e, 0x1f, 0xb4, 0x1f, 0xd9, 0x20, 0x4c,
+ 0x20, 0x7d, 0x20, 0xad, 0x20, 0xff, 0x21, 0x5c,
+ 0x21, 0xa9, 0x22, 0x9, 0x22, 0x6d, 0x22, 0xae,
+ 0x22, 0xbf, 0x23, 0x2f, 0x23, 0xa9, 0x24, 0x38,
+ 0x24, 0x4c, 0x24, 0x6c, 0x24, 0x85, 0x24, 0xbe,
+ 0x24, 0xde, 0x24, 0xf9, 0x25, 0x4d, 0x25, 0x75,
+ 0x25, 0x8d, 0x25, 0xc1, 0x25, 0xda, 0x25, 0xff,
+ 0x26, 0x27, 0x26, 0x40, 0x26, 0xb0, 0x26, 0xf8,
+ 0x27, 0x45, 0x27, 0x67, 0x27, 0x87, 0x27, 0xec,
+ 0x28, 0xa, 0x28, 0x44, 0x28, 0xc6, 0x28, 0xdc,
+ 0x28, 0xeb, 0x29, 0x3d, 0x29, 0x6a, 0x29, 0xc9,
+ 0x2a, 0x25, 0x2a, 0xc0, 0x2b, 0x2d, 0x2b, 0x6f,
+ 0x2b, 0x86, 0x2b, 0xb0, 0x2b, 0xc9, 0x2c, 0x4a,
+ 0x2c, 0x78, 0x2c, 0x8f, 0x2c, 0xb2, 0x2d, 0x2e,
+ 0x2d, 0x9e, 0x2d, 0xc6, 0x2e, 0x2f, 0x2e, 0x6d,
+ 0x2e, 0xe8, 0x2f, 0x32, 0x2f, 0x92, 0x2f, 0xcc,
+ 0x2f, 0xff, 0x30, 0x32, 0x30, 0x60, 0x30, 0x7f,
+ 0x30, 0xa0, 0x30, 0xed, 0x31, 0x1c, 0x31, 0x5e,
+ 0x31, 0xca, 0x32, 0x26, 0x32, 0x81, 0x32, 0xdd,
+ 0x33, 0x4, 0x33, 0x25, 0x33, 0x46, 0x33, 0x70,
+ 0x33, 0x82, 0x33, 0x9e, 0x33, 0xb7, 0x33, 0xd1,
+ 0x34, 0xd, 0x34, 0x97, 0x34, 0xce, 0x35, 0x41,
+ 0x35, 0xca, 0x36, 0x73, 0x37, 0xe, 0x37, 0x41,
+ 0x37, 0x65, 0x37, 0xc8, 0x37, 0xdd, 0x37, 0xde,
+ 0x38, 0x2f, 0x38, 0x7d, 0x38, 0xe4, 0x39, 0x44,
+ 0x39, 0xf0, 0x3a, 0x51, 0x3a, 0x94, 0x3a, 0xe9,
+ 0x3b, 0x3a, 0x3b, 0x88, 0x3b, 0xde, 0x3b, 0xff,
+ 0x3c, 0x26, 0x3c, 0x4a, 0x3c, 0x61, 0x3c, 0x72,
+ 0x3c, 0xa1, 0x3c, 0xe1, 0x3d, 0x2c, 0x3d, 0x78,
+ 0x3d, 0xba, 0x3e, 0xe, 0x3e, 0x76, 0x3e, 0xac,
+ 0x3f, 0x0, 0x3f, 0x42, 0xe, 0x8b, 0xe6, 0xd8,
+ 0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x63, 0x16, 0xf7,
+ 0x8d, 0x34, 0xa, 0x31, 0x6, 0xba, 0xd8, 0x5,
+ 0xf7, 0x82, 0x6, 0x9e, 0x3e, 0x5, 0x34, 0x36,
+ 0xa, 0xf7, 0x8a, 0x42, 0xa, 0x50, 0x6, 0xfb,
+ 0x0, 0xf8, 0x6b, 0x5, 0xfb, 0x92, 0x4b, 0xa,
+ 0xf7, 0x15, 0x6, 0xfb, 0x8d, 0x7d, 0xa, 0x4c,
+ 0x6, 0xf7, 0x9e, 0xf7, 0x3c, 0x15, 0xf7, 0x9,
+ 0xf7, 0x41, 0xb5, 0xfb, 0x41, 0x5, 0xe, 0x8b,
+ 0xe5, 0x31, 0xf7, 0x40, 0x7e, 0xe6, 0x52, 0xf7,
+ 0x50, 0x93, 0xf7, 0x41, 0x31, 0xe5, 0x12, 0x13,
+ 0xa8, 0xfb, 0xa, 0x16, 0xf7, 0x85, 0x6, 0x9f,
+ 0xe5, 0x5, 0x3d, 0x6, 0xb8, 0xd0, 0x5, 0xf7,
+ 0x4, 0x6, 0x6a, 0xfb, 0x33, 0x5, 0xf7, 0xcc,
+ 0x6, 0x13, 0x58, 0xaf, 0xf7, 0x40, 0x5, 0x3c,
+ 0x6, 0x13, 0x94, 0x7a, 0x39, 0x5, 0xfb, 0x1e,
+ 0x6, 0xab, 0xf7, 0x2c, 0x5, 0xb1, 0x6, 0x81,
+ 0x5a, 0x5c, 0xa, 0xb3, 0xf7, 0x50, 0x5, 0x3c,
+ 0x6, 0x82, 0x5a, 0x5, 0x64, 0x6, 0xa8, 0x97,
+ 0xa, 0xf7, 0x1e, 0x6, 0x13, 0xa8, 0x7a, 0x38,
+ 0x5c, 0xa, 0xaf, 0xf7, 0x41, 0x5, 0xfc, 0x6f,
+ 0x6, 0x13, 0xa4, 0x77, 0x31, 0x5, 0xe8, 0x6,
+ 0xfb, 0x8e, 0xfc, 0x12, 0x5, 0x4a, 0x6, 0xf7,
+ 0xa0, 0xf7, 0x34, 0x15, 0xf5, 0xf7, 0x39, 0x69,
+ 0xfb, 0x39, 0x5, 0xe, 0x40, 0xa, 0xf7, 0x7a,
+ 0x77, 0x1, 0xf7, 0xb6, 0xf8, 0xf3, 0x15, 0xf7,
+ 0xef, 0xd5, 0x77, 0xf2, 0xfb, 0xe4, 0xfb, 0xa,
+ 0x5, 0xfb, 0xc2, 0xfd, 0x2e, 0x23, 0xa, 0x40,
+ 0xa, 0xf7, 0x76, 0x77, 0x1, 0xf7, 0x91, 0xf8,
+ 0xee, 0x15, 0xf7, 0x42, 0xf7, 0x4, 0xf7, 0x13,
+ 0xfb, 0x4, 0xcd, 0xae, 0xfb, 0x16, 0xf7, 0x23,
+ 0x66, 0xa, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0xfb,
+ 0x71, 0xfd, 0x12, 0x23, 0xa, 0x40, 0xa, 0xd3,
+ 0xf7, 0xe, 0x1, 0xf8, 0x57, 0xf9, 0x6, 0x6d,
+ 0xa, 0xa5, 0xf7, 0xe, 0x5, 0xfb, 0x4, 0x6,
+ 0xfb, 0x66, 0xfb, 0xe, 0x5a, 0xa, 0xa5, 0xf7,
+ 0xe, 0x4c, 0xa, 0xfb, 0xd0, 0xfd, 0x80, 0x23,
+ 0xa, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0x76,
+ 0x16, 0x20, 0xa, 0xfb, 0x31, 0xf8, 0x44, 0x15,
+ 0xf7, 0xc2, 0x3a, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7,
+ 0xb, 0x5, 0xe, 0x40, 0xa, 0xba, 0xf7, 0x5c,
+ 0x1, 0xf7, 0xd1, 0xf9, 0x3f, 0x15, 0x5d, 0xae,
+ 0x67, 0xbf, 0xce, 0xc7, 0xc1, 0xc9, 0xba, 0x69,
+ 0xb0, 0x57, 0x4d, 0x49, 0x58, 0x48, 0x1e, 0xce,
+ 0x95, 0x15, 0xa5, 0x9e, 0x9f, 0xa8, 0x9e, 0x9a,
+ 0x7d, 0x79, 0x73, 0x70, 0x77, 0x75, 0x79, 0x7c,
+ 0x99, 0x9b, 0x1e, 0xfc, 0x29, 0xfd, 0x49, 0x23,
+ 0xa, 0x40, 0xa, 0xc5, 0x77, 0xf7, 0x3b, 0x77,
+ 0x1, 0xf7, 0x50, 0xf9, 0x10, 0x15, 0xd6, 0x72,
+ 0x5, 0xae, 0xa1, 0x9c, 0xa5, 0xa6, 0x1b, 0xa2,
+ 0x9d, 0x7d, 0x7d, 0x9f, 0x1f, 0x7b, 0xa1, 0xa2,
+ 0x7b, 0xaa, 0x1b, 0xd3, 0xc6, 0xc6, 0xca, 0xa6,
+ 0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x75, 0x61,
+ 0x69, 0x1b, 0x7a, 0x7b, 0x93, 0x96, 0x7b, 0x1f,
+ 0x9c, 0x70, 0x70, 0xa2, 0x69, 0x1b, 0x3d, 0x55,
+ 0x49, 0x56, 0x73, 0x1f, 0xfb, 0x65, 0xfd, 0x10,
+ 0x23, 0xa, 0x8b, 0xe6, 0xf7, 0x36, 0xe6, 0xf7,
+ 0x13, 0xe6, 0x12, 0xf8, 0x64, 0xed, 0x3c, 0xeb,
+ 0x13, 0xf0, 0x77, 0x16, 0xf7, 0xee, 0x6, 0xf7,
+ 0x17, 0xf4, 0xdc, 0xed, 0x1f, 0x8c, 0xb1, 0x77,
+ 0xaf, 0x6a, 0xa1, 0x6e, 0x9e, 0x18, 0x13, 0xe8,
+ 0xc8, 0xab, 0xb0, 0xb1, 0xce, 0x1a, 0xc9, 0x66,
+ 0xd0, 0xfb, 0x1f, 0x1e, 0xfb, 0xc6, 0x36, 0xa,
+ 0xdd, 0x74, 0xa, 0x39, 0x6, 0xf7, 0x79, 0xf7,
+ 0x91, 0x15, 0xa8, 0xf7, 0x13, 0x5, 0xf7, 0x20,
+ 0x6, 0xc8, 0xa3, 0x70, 0x71, 0x8c, 0x1f, 0x44,
+ 0x23, 0x88, 0x71, 0x1e, 0xfb, 0x43, 0xfb, 0x91,
+ 0x15, 0xaa, 0xf7, 0x36, 0x5, 0xf6, 0x6, 0x13,
+ 0xf0, 0xb3, 0xf7, 0x0, 0x80, 0x4d, 0x4f, 0x38,
+ 0x6e, 0x6d, 0x1f, 0xe, 0x79, 0xe8, 0xf8, 0x1d,
+ 0xe7, 0x1, 0xa9, 0xec, 0x3, 0xf8, 0x7a, 0xf7,
+ 0x1e, 0x15, 0x76, 0x65, 0x38, 0x61, 0x39, 0x1b,
+ 0xfb, 0x0, 0x5b, 0xcb, 0xdb, 0xf7, 0x41, 0xf7,
+ 0x24, 0xd7, 0xe7, 0xc2, 0xbc, 0x77, 0x6f, 0xb2,
+ 0x1f, 0x76, 0x22, 0x5, 0xea, 0x6, 0xbc, 0xf7,
+ 0x89, 0x7a, 0xa, 0x83, 0x60, 0x5, 0x96, 0x80,
+ 0x5c, 0xab, 0x34, 0x1b, 0xfb, 0x4d, 0xfb, 0x39,
+ 0xfb, 0x25, 0xfb, 0x59, 0xfb, 0x2, 0xc0, 0xfb,
+ 0x12, 0xf7, 0x4c, 0xb4, 0xf7, 0x16, 0x9d, 0xd1,
+ 0xe7, 0x1f, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x56,
+ 0xe5, 0xf8, 0x19, 0xe7, 0x8c, 0x77, 0x12, 0x8b,
+ 0xee, 0x13, 0xe8, 0xf7, 0x0, 0xfb, 0x46, 0x15,
+ 0x71, 0xa7, 0xa0, 0x89, 0xa0, 0x1b, 0xc9, 0xca,
+ 0xb5, 0xd5, 0xa1, 0x84, 0xad, 0x64, 0x94, 0x1f,
+ 0x8f, 0x98, 0x5, 0xe8, 0xd7, 0xba, 0xb3, 0xd7,
+ 0x1f, 0x60, 0xcf, 0x5, 0x72, 0x5b, 0x42, 0x63,
+ 0x37, 0x1b, 0xfb, 0x1d, 0x75, 0xed, 0xd7, 0xf7,
+ 0x2b, 0xf7, 0x2e, 0xcb, 0xe0, 0xc1, 0xba, 0x79,
+ 0x70, 0xb0, 0x1f, 0x76, 0x24, 0x5, 0xeb, 0x6,
+ 0x13, 0xd8, 0xbc, 0xf7, 0x85, 0x7a, 0xa, 0x83,
+ 0x60, 0x5, 0x13, 0xe8, 0xa4, 0x6f, 0x58, 0x9c,
+ 0x4e, 0x1b, 0xfb, 0x42, 0xfb, 0x4a, 0x25, 0xfb,
+ 0x84, 0xfb, 0x8, 0xd6, 0x2e, 0xf7, 0x1, 0x7a,
+ 0x1f, 0x70, 0x2e, 0x5, 0x8e, 0x95, 0x9e, 0x8e,
+ 0x9b, 0x1b, 0x94, 0x95, 0x85, 0x80, 0x7f, 0x7e,
+ 0x81, 0x7c, 0x80, 0x7d, 0x8f, 0x95, 0x7c, 0x1f,
+ 0xe, 0x3a, 0xa, 0xf8, 0x78, 0xeb, 0x3, 0x55,
+ 0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x57, 0xf7, 0x3d,
+ 0xf4, 0xf7, 0x91, 0xf7, 0xc, 0x40, 0xdf, 0xfb,
+ 0x27, 0x1f, 0xfb, 0xbc, 0x36, 0xa, 0xdf, 0x74,
+ 0xa, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xda, 0xf8,
+ 0x10, 0x5, 0xf7, 0xb, 0x6, 0xea, 0xb9, 0x59,
+ 0x46, 0xfb, 0x28, 0x2d, 0xfb, 0x5, 0xfb, 0x1d,
+ 0x1f, 0xe, 0x8b, 0xe6, 0xd6, 0xf7, 0x39, 0x31,
+ 0xe5, 0xf7, 0x20, 0xe6, 0x12, 0x13, 0xb0, 0x75,
+ 0x16, 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x59, 0x66,
+ 0xa, 0x73, 0x21, 0x5, 0xfb, 0x9a, 0x6, 0xa9,
+ 0xf7, 0x2a, 0x5, 0xf7, 0x10, 0x6, 0x13, 0xd0,
+ 0x7b, 0x40, 0x56, 0xa, 0xbc, 0xf7, 0x84, 0x4e,
+ 0xa, 0x7c, 0x40, 0x5, 0xfb, 0xe, 0x6, 0xa8,
+ 0x97, 0xa, 0xf7, 0x9a, 0x6, 0x76, 0x25, 0x96,
+ 0xa, 0xb3, 0xf7, 0x55, 0x5, 0xfc, 0xa2, 0x4b,
+ 0xa, 0xd1, 0x74, 0xa, 0x43, 0x6, 0xe, 0x54,
+ 0xa, 0xf7, 0x7a, 0x77, 0x12, 0x13, 0xb8, 0xf7,
+ 0x99, 0xf8, 0xf3, 0x15, 0xf7, 0xe4, 0xd5, 0x77,
+ 0xf2, 0xfb, 0xd9, 0xfb, 0xa, 0x5, 0xfb, 0xa6,
+ 0xfd, 0x2e, 0x28, 0xa, 0x54, 0xa, 0xf7, 0x76,
+ 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x73, 0xf8, 0xee,
+ 0x15, 0xf7, 0x44, 0xf7, 0x4, 0xf7, 0x13, 0xfb,
+ 0x4, 0xcf, 0xae, 0xfb, 0x18, 0xf7, 0x23, 0x4e,
+ 0xa, 0xfb, 0x58, 0xfb, 0x22, 0x5, 0xfb, 0x52,
+ 0xfd, 0x12, 0x28, 0xa, 0x54, 0xa, 0xd4, 0xf7,
+ 0xd, 0x12, 0x13, 0xb8, 0xf8, 0x34, 0xf9, 0x7,
+ 0x92, 0xa, 0xa5, 0xf7, 0xd, 0x4c, 0xa, 0xfb,
+ 0x66, 0xfb, 0xd, 0x6d, 0xa, 0xa5, 0xf7, 0xd,
+ 0x65, 0xa, 0xfb, 0xac, 0xfd, 0x80, 0x28, 0xa,
+ 0x8b, 0xe5, 0xf7, 0x27, 0xe4, 0xa1, 0x8b, 0x1,
+ 0xdc, 0xea, 0xf7, 0x14, 0xed, 0xbd, 0xeb, 0x3,
+ 0x75, 0x16, 0x33, 0xa, 0x2a, 0xa, 0xf7, 0x7f,
+ 0xf8, 0xe4, 0x15, 0xf7, 0xc0, 0x40, 0xb1, 0xc5,
+ 0xfb, 0xa5, 0xf7, 0xb, 0x5, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf8,
+ 0x86, 0xee, 0x3, 0x70, 0x16, 0xf7, 0xa2, 0x6,
+ 0xf7, 0x36, 0xf7, 0x54, 0xf3, 0xf7, 0x8f, 0xf7,
+ 0xd, 0x4c, 0xe1, 0xfb, 0x28, 0x1f, 0xfb, 0xbc,
+ 0x36, 0xa, 0xde, 0x6, 0x6a, 0xfb, 0x31, 0x5,
+ 0x4d, 0x6, 0x7e, 0x48, 0x5, 0xc8, 0x6, 0x6b,
+ 0xfb, 0x30, 0x5, 0x38, 0x6, 0xf7, 0x48, 0x16,
+ 0xac, 0xf7, 0x30, 0x5, 0xf7, 0x12, 0x6, 0x99,
+ 0xce, 0x5, 0xfb, 0x12, 0x6, 0xaa, 0xf7, 0x31,
+ 0x5, 0xf7, 0xc, 0x6, 0xec, 0xaa, 0x57, 0x44,
+ 0xfb, 0x28, 0x39, 0xfb, 0x1, 0xfb, 0x33, 0x1f,
+ 0xe, 0x8b, 0xdd, 0xe9, 0xd3, 0xc1, 0xd3, 0xf5,
+ 0xdd, 0x1, 0xf8, 0x7b, 0xe4, 0x3, 0x77, 0xf7,
+ 0x44, 0x15, 0xe7, 0x6, 0x23, 0x91, 0xca, 0x43,
+ 0xf7, 0x25, 0x1b, 0xb2, 0xf7, 0x5, 0x9e, 0xc9,
+ 0xe2, 0x1f, 0x61, 0xc8, 0x5, 0x77, 0x68, 0x47,
+ 0x63, 0x3d, 0x1b, 0x45, 0x5a, 0xa9, 0xcb, 0x7d,
+ 0x1f, 0xf7, 0x32, 0x6, 0xb2, 0xd3, 0x5, 0xfb,
+ 0x5d, 0x6, 0x8c, 0x9b, 0x8f, 0xa3, 0x90, 0x99,
+ 0x8, 0xf7, 0x6a, 0x6, 0xb3, 0xd3, 0x5, 0xfb,
+ 0x71, 0x6, 0xcd, 0xae, 0xc7, 0xb3, 0xdd, 0x1b,
+ 0xbe, 0xbe, 0x6f, 0x6a, 0x98, 0x1f, 0x7e, 0x48,
+ 0x5, 0xe4, 0x6, 0xb7, 0xf7, 0x66, 0x5, 0x31,
+ 0x6, 0x81, 0x5c, 0x5, 0xaa, 0x6c, 0x59, 0x9b,
+ 0x5e, 0x1b, 0xfb, 0x10, 0x22, 0x40, 0xfb, 0x5,
+ 0x55, 0x1f, 0x48, 0x6, 0x63, 0x43, 0x5, 0xda,
+ 0x6, 0x85, 0x71, 0x89, 0x79, 0x8a, 0x81, 0x8,
+ 0x54, 0x6, 0xe, 0x8b, 0xe6, 0xdf, 0xf7, 0x2f,
+ 0xf7, 0x21, 0xe6, 0x1, 0xd8, 0xec, 0xf7, 0x18,
+ 0xed, 0xd5, 0xed, 0x3, 0x75, 0x16, 0xf7, 0xc7,
+ 0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x17, 0x6, 0xaa,
+ 0xf7, 0x28, 0x5, 0xf7, 0x6, 0x6, 0x7e, 0x4b,
+ 0x56, 0xa, 0xb9, 0xf7, 0x70, 0x4e, 0xa, 0x7c,
+ 0x4a, 0x65, 0xa, 0xa9, 0xf7, 0x21, 0x88, 0xa,
+ 0x70, 0xfb, 0x12, 0x56, 0xa, 0xb9, 0xf7, 0x6d,
+ 0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xda, 0x6, 0x3b,
+ 0x7d, 0xa, 0x3b, 0x6, 0xe, 0x79, 0xe8, 0xf5,
+ 0xe9, 0xf7, 0x56, 0xe5, 0x1, 0x9f, 0xee, 0x3,
+ 0xf7, 0xa7, 0xf7, 0x49, 0x15, 0xf7, 0x32, 0x6,
+ 0x7c, 0x3f, 0x5, 0x78, 0x65, 0x56, 0x80, 0x58,
+ 0x1b, 0x3a, 0x3f, 0xb1, 0xeb, 0xf7, 0x33, 0xf7,
+ 0xc, 0xf4, 0xf7, 0x9, 0xc9, 0xaa, 0x87, 0x6d,
+ 0xb9, 0x1f, 0x77, 0x2d, 0x96, 0xa, 0xba, 0xf7,
+ 0x6e, 0x66, 0xa, 0x82, 0x65, 0x5, 0xa1, 0x71,
+ 0x62, 0x9b, 0x41, 0x1b, 0xfb, 0x38, 0xfb, 0x50,
+ 0xfb, 0x23, 0xfb, 0x64, 0xfb, 0x2b, 0xf7, 0x1,
+ 0x3c, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb6, 0x94,
+ 0xa3, 0x1f, 0xa7, 0xf7, 0x27, 0x5, 0xba, 0x55,
+ 0xa, 0xfb, 0xc1, 0x6, 0xe, 0x79, 0xe2, 0x8b,
+ 0xee, 0xa6, 0xe3, 0x70, 0xcd, 0xf7, 0x70, 0xcd,
+ 0x12, 0x8b, 0xee, 0x13, 0xec, 0xf7, 0x93, 0xf7,
+ 0x3c, 0x15, 0xf7, 0x32, 0x6, 0x7c, 0x44, 0x5,
+ 0x7a, 0x67, 0x59, 0x80, 0x5a, 0x1b, 0x37, 0x3b,
+ 0xac, 0xe8, 0xf7, 0x29, 0xf7, 0xc, 0xf7, 0x4,
+ 0xf7, 0x9, 0xc9, 0xaa, 0x78, 0x6f, 0xb9, 0x1f,
+ 0x13, 0xdc, 0x77, 0x34, 0x96, 0xa, 0xba, 0xf7,
+ 0x70, 0x66, 0xa, 0x82, 0x60, 0x5, 0xa2, 0x67,
+ 0x6c, 0x9f, 0x41, 0x1b, 0xfb, 0x42, 0xfb, 0x46,
+ 0xfb, 0x2a, 0xfb, 0x57, 0xfb, 0x21, 0xf7, 0x1,
+ 0x41, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb3, 0x94,
+ 0xa3, 0x1f, 0xa7, 0xf7, 0x1d, 0x5, 0xba, 0x6,
+ 0x9f, 0xe3, 0x5, 0xfb, 0xc1, 0x6, 0xab, 0xf7,
+ 0xf4, 0x48, 0xa, 0x8b, 0xe6, 0xf7, 0x23, 0xe6,
+ 0xf7, 0x26, 0xe6, 0x1, 0xc4, 0xe9, 0xf7, 0x72,
+ 0xea, 0x3, 0x64, 0x16, 0xf7, 0x90, 0x34, 0xa,
+ 0x3a, 0x6, 0xa8, 0xf7, 0x23, 0x5, 0xf7, 0x72,
+ 0x6, 0x6e, 0xfb, 0x23, 0x5, 0x3b, 0x6, 0x79,
+ 0x30, 0x5, 0xf7, 0x8f, 0x34, 0xa, 0x3e, 0x6,
+ 0xd7, 0xf8, 0x10, 0x5, 0xd9, 0x42, 0xa, 0xfb,
+ 0x8f, 0x36, 0xa, 0xdb, 0x6, 0x6d, 0xfb, 0x26,
+ 0x5, 0xfb, 0x72, 0x6, 0xa9, 0xf7, 0x26, 0x5,
+ 0xdc, 0x6, 0x9d, 0xe6, 0x5, 0xfb, 0x90, 0x36,
+ 0xa, 0xd8, 0x6, 0x3f, 0x7d, 0xa, 0x3d, 0x6,
+ 0xe, 0x3a, 0xa, 0xf7, 0x67, 0xf0, 0x3, 0x9c,
+ 0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe6, 0x5, 0xfb,
+ 0x41, 0x6, 0xdb, 0xf8, 0x10, 0x5, 0xf7, 0x3f,
+ 0x34, 0xa, 0xfc, 0x51, 0x36, 0xa, 0xf7, 0x41,
+ 0x6, 0x3b, 0xfc, 0x10, 0x43, 0xa, 0x79, 0xe6,
+ 0xf8, 0x22, 0xe6, 0x1, 0x41, 0x79, 0x15, 0xf7,
+ 0xaa, 0x6, 0x9f, 0xe6, 0x5, 0x2e, 0x6, 0xdb,
+ 0xf8, 0x22, 0x5, 0xe6, 0x34, 0xa, 0xfb, 0xa7,
+ 0x36, 0xa, 0xde, 0x6, 0x3b, 0xfc, 0x22, 0x5,
+ 0x36, 0x6, 0xf7, 0xd3, 0x72, 0x15, 0x76, 0xa2,
+ 0xa4, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0x87, 0x8c,
+ 0xa, 0xac, 0x5b, 0xa, 0xfb, 0xa6, 0x6, 0x79,
+ 0x2f, 0x5, 0xf7, 0x25, 0x6, 0x53, 0xfb, 0xa8,
+ 0x5, 0x40, 0x7c, 0x84, 0x5c, 0x5e, 0x1b, 0x73,
+ 0x83, 0x97, 0x9e, 0x9d, 0x91, 0xa3, 0x91, 0xa4,
+ 0x1f, 0xa1, 0xec, 0x4e, 0xa, 0xe, 0x68, 0xa,
+ 0xf7, 0x90, 0xf8, 0xf3, 0x15, 0xf7, 0xde, 0xd5,
+ 0x78, 0xf2, 0xfb, 0xd3, 0xfb, 0xa, 0x5, 0xfb,
+ 0x77, 0xfd, 0x2e, 0x15, 0x2b, 0xa, 0xe, 0x75,
+ 0xa, 0xf7, 0x76, 0x77, 0x62, 0xa, 0xf7, 0x6b,
+ 0xf8, 0xf0, 0x15, 0xf7, 0x49, 0xf7, 0x2, 0xf7,
+ 0xa, 0xfb, 0x2, 0xcf, 0xae, 0xfb, 0x16, 0xf7,
+ 0x21, 0x66, 0xa, 0xfb, 0x56, 0xfb, 0x20, 0x5,
+ 0xfb, 0x24, 0xfd, 0x14, 0x15, 0x2b, 0xa, 0xe,
+ 0x75, 0xa, 0xd2, 0xf7, 0xf, 0x62, 0xa, 0xf8,
+ 0x34, 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0x69, 0xfb,
+ 0xf, 0x4a, 0xa, 0xfb, 0x84, 0xfd, 0x80, 0x15,
+ 0x2b, 0xa, 0xe, 0x8b, 0xe3, 0xf8, 0x2, 0xe3,
+ 0xde, 0xf7, 0xf, 0x62, 0xa, 0xf7, 0xca, 0xf9,
+ 0x5, 0x4a, 0xa, 0xfb, 0xd4, 0xfd, 0x80, 0x15,
+ 0xf8, 0x55, 0x6, 0x9e, 0xe3, 0x5, 0xfb, 0x40,
+ 0x6, 0xdb, 0xf8, 0x2, 0x5, 0xf7, 0x3e, 0x6,
+ 0x9e, 0xe3, 0x5, 0xfc, 0x51, 0x6, 0x78, 0x33,
+ 0x5, 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0x2, 0x43,
+ 0xa, 0x68, 0xa, 0x9c, 0x16, 0x2b, 0xa, 0xf7,
+ 0x56, 0xf8, 0xe6, 0x15, 0xf7, 0xc5, 0x3e, 0xb3,
+ 0xc5, 0xfb, 0xac, 0xf7, 0xb, 0x5, 0xe, 0x79,
+ 0xe5, 0xf8, 0x22, 0xe7, 0x1, 0x9a, 0xed, 0xf7,
+ 0x73, 0xe8, 0x3, 0x6d, 0xbb, 0x15, 0x76, 0xa2,
+ 0xf7, 0xa, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0xc8,
+ 0x8c, 0xa, 0xf7, 0x11, 0x5b, 0xa, 0xfc, 0x29,
+ 0x6, 0x79, 0x2f, 0x5, 0xf7, 0x4c, 0x6, 0x53,
+ 0xfb, 0xa8, 0x5, 0x40, 0x7c, 0x67, 0x5c, 0x3a,
+ 0x1b, 0x45, 0x50, 0xa1, 0xd7, 0x9b, 0x1f, 0xa1,
+ 0xec, 0x4e, 0xa, 0xe, 0x3a, 0xa, 0xcf, 0xed,
+ 0xf7, 0x8e, 0xf7, 0x17, 0x3, 0x68, 0x16, 0xf7,
+ 0x9d, 0x34, 0xa, 0x38, 0x6, 0xa0, 0xf0, 0xd1,
+ 0xc0, 0x9f, 0x70, 0xa1, 0x66, 0x9a, 0x71, 0x19,
+ 0xa6, 0x56, 0xa6, 0x58, 0x9b, 0x58, 0x8, 0xf7,
+ 0x34, 0x34, 0xa, 0x20, 0x6, 0x7b, 0xb7, 0x76,
+ 0xa6, 0x75, 0xb5, 0x7e, 0xa8, 0x66, 0xc0, 0x80,
+ 0x9c, 0xf7, 0x67, 0xf7, 0x3c, 0x18, 0xd0, 0x34,
+ 0xa, 0xfb, 0x87, 0x6e, 0xa, 0xb7, 0x6, 0xfb,
+ 0x61, 0xfb, 0x36, 0xae, 0xf7, 0x36, 0x5, 0xdd,
+ 0x34, 0xa, 0xfb, 0x9c, 0x6e, 0xa, 0xdf, 0x74,
+ 0xa, 0x37, 0x6, 0xe, 0x3a, 0xa, 0xf7, 0xf,
+ 0xed, 0x3, 0x8d, 0x16, 0xf8, 0xb4, 0x6, 0xbf,
+ 0xf7, 0x92, 0x5, 0x27, 0x6, 0x6b, 0xfb, 0x37,
+ 0x5, 0xfb, 0x89, 0x6, 0xdd, 0xf8, 0x10, 0x5,
+ 0xf7, 0x14, 0x34, 0xa, 0xfb, 0xdd, 0x36, 0xa,
+ 0xf0, 0x6, 0x3b, 0x7d, 0xa, 0x26, 0x6, 0xe,
+ 0x3a, 0xa, 0xf7, 0xe, 0xed, 0x3, 0x8d, 0x16,
+ 0xf8, 0xb1, 0x6, 0xc2, 0xf7, 0x9c, 0x7b, 0xa,
+ 0x66, 0xfb, 0x41, 0x5, 0xfb, 0x86, 0x6, 0xae,
+ 0xf7, 0x37, 0xf7, 0x34, 0xb4, 0x9a, 0xc9, 0xfb,
+ 0x36, 0x63, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x14,
+ 0x34, 0xa, 0xfb, 0xdc, 0x36, 0xa, 0xf0, 0x6,
+ 0x66, 0xfb, 0x47, 0x30, 0x74, 0x7f, 0x4b, 0xe4,
+ 0xa2, 0x6e, 0xfb, 0x1d, 0x5, 0x26, 0x6, 0xe,
+ 0x3a, 0xa, 0x4e, 0x16, 0xf7, 0x77, 0x34, 0xa,
+ 0x3e, 0x6, 0xda, 0xf7, 0xce, 0xc5, 0xfb, 0xac,
+ 0x5, 0xc7, 0x6, 0xf7, 0x2b, 0xf7, 0xa4, 0x5b,
+ 0xfb, 0xc6, 0x5, 0x41, 0x6, 0x7a, 0x30, 0x5,
+ 0xf7, 0x71, 0x42, 0xa, 0x55, 0x6, 0xc9, 0xf8,
+ 0x10, 0x5, 0xdb, 0x42, 0xa, 0xfb, 0x61, 0x6,
+ 0xfb, 0x32, 0xfb, 0xb6, 0x5b, 0xf7, 0xb6, 0x5,
+ 0xfb, 0x5f, 0x4b, 0xa, 0xd7, 0x6, 0x2e, 0x7d,
+ 0xa, 0x53, 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18,
+ 0xe8, 0x1, 0x4f, 0x7f, 0x15, 0xf7, 0xa4, 0x94,
+ 0xa, 0x28, 0x6, 0xc9, 0xf7, 0xd1, 0xf7, 0x4a,
+ 0xfc, 0x2e, 0x5, 0xe7, 0x6, 0xeb, 0xf8, 0x75,
+ 0x6c, 0xa, 0xea, 0x6, 0x4e, 0xfb, 0xd0, 0xfb,
+ 0x3e, 0xf8, 0x2d, 0x7e, 0xa, 0xfc, 0x18, 0x5,
+ 0x3c, 0x6, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe8,
+ 0xc1, 0xe0, 0x73, 0xdf, 0x8f, 0x77, 0x12, 0x13,
+ 0xd0, 0x4f, 0x7f, 0x15, 0xf7, 0xa5, 0x5b, 0xa,
+ 0x27, 0x6, 0xca, 0xf7, 0xcd, 0xf7, 0x4c, 0xfc,
+ 0x29, 0x5, 0xe5, 0x6, 0xea, 0xf8, 0x6f, 0x6c,
+ 0xa, 0xeb, 0x6, 0x4e, 0xfb, 0xc6, 0xfb, 0x3e,
+ 0xf8, 0x23, 0x7e, 0xa, 0xfc, 0x13, 0x5, 0x3b,
+ 0x6, 0xf7, 0x62, 0xf8, 0xbe, 0x15, 0xdb, 0x72,
+ 0x5, 0xae, 0xa0, 0x9e, 0xa6, 0xa7, 0x1b, 0xa6,
+ 0xa0, 0x79, 0x7b, 0xa3, 0x1f, 0x13, 0xe8, 0x7d,
+ 0xa0, 0xa1, 0x7e, 0xa8, 0x1b, 0xd6, 0xca, 0xc7,
+ 0xcb, 0xa6, 0x1f, 0x3c, 0xa4, 0x5, 0x76, 0x7f,
+ 0x74, 0x60, 0x67, 0x1b, 0x77, 0x79, 0x95, 0x98,
+ 0x78, 0x1f, 0x13, 0xd0, 0x9c, 0x72, 0x70, 0x9f,
+ 0x6a, 0x1b, 0x39, 0x52, 0x48, 0x55, 0x71, 0x1f,
+ 0xe, 0x79, 0xe7, 0xf8, 0x1f, 0xe9, 0x1, 0xa2,
+ 0xf1, 0xf7, 0xff, 0xec, 0x3, 0xa2, 0xf7, 0x57,
+ 0x15, 0xfb, 0x24, 0xf3, 0x46, 0xf7, 0x6, 0xf7,
+ 0x4f, 0xf7, 0x31, 0xf7, 0xe, 0xf7, 0x8d, 0xf7,
+ 0xb, 0x45, 0xe6, 0xfb, 0x2d, 0xfb, 0x5d, 0xfb,
+ 0x1e, 0xfb, 0x49, 0xfb, 0x4f, 0x1e, 0xf1, 0x9a,
+ 0x15, 0xf7, 0xc, 0xd4, 0xf7, 0x1f, 0xf7, 0x24,
+ 0xf7, 0x0, 0xb1, 0x4d, 0x46, 0x23, 0x3e, 0xfb,
+ 0x34, 0xfb, 0x2c, 0x2f, 0x61, 0xc9, 0xd5, 0x1e,
+ 0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3d, 0xa4, 0xf7,
+ 0x4f, 0x92, 0xf7, 0x42, 0x30, 0xe6, 0x12, 0x66,
+ 0xea, 0x13, 0xac, 0xf7, 0xe2, 0xe6, 0x15, 0xaa,
+ 0xf7, 0x2b, 0x5, 0xaf, 0x6, 0x81, 0x58, 0x5,
+ 0xd4, 0x6, 0xb1, 0xf7, 0x4f, 0x5, 0x41, 0x6,
+ 0x83, 0x5d, 0x5, 0x65, 0x6, 0xa7, 0xf7, 0x1f,
+ 0x5, 0xf7, 0x1a, 0x6, 0x13, 0xb4, 0x7b, 0x38,
+ 0x5, 0xd5, 0x6, 0xae, 0xf7, 0x42, 0x5, 0xfc,
+ 0x10, 0x6, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, 0xf,
+ 0xfb, 0x7a, 0xfb, 0x1c, 0xe2, 0x42, 0xe4, 0x1f,
+ 0xf8, 0x16, 0x6, 0x13, 0x74, 0xae, 0xf7, 0x3d,
+ 0x5, 0x40, 0x6, 0x13, 0xac, 0x7a, 0x3d, 0x5,
+ 0xfc, 0x2e, 0xf7, 0x25, 0x15, 0xf7, 0x8, 0xed,
+ 0xf7, 0xb, 0xf6, 0x99, 0xb2, 0x8a, 0x66, 0x84,
+ 0x1e, 0x50, 0xfb, 0xb9, 0x5, 0x5c, 0x82, 0x67,
+ 0x89, 0x7a, 0x1b, 0x30, 0x64, 0xc3, 0xe4, 0x1f,
+ 0xe, 0x77, 0xa, 0xf7, 0x71, 0x77, 0x58, 0xa,
+ 0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xf7, 0xe4, 0xd8,
+ 0x76, 0xf2, 0xfb, 0xd7, 0xfb, 0xd, 0x5, 0xfb,
+ 0x72, 0xfc, 0x61, 0x24, 0xa, 0x77, 0xa, 0xf7,
+ 0x6d, 0x77, 0x58, 0xa, 0xf7, 0x3f, 0xf9, 0x13,
+ 0x15, 0xc0, 0x66, 0xf7, 0x46, 0xf3, 0xf7, 0xa,
+ 0x22, 0xcc, 0xaf, 0xfb, 0x14, 0xf7, 0x23, 0x5,
+ 0x2c, 0x6, 0xfb, 0xeb, 0xfc, 0xd6, 0x24, 0xa,
+ 0x77, 0xa, 0xc9, 0xf7, 0xf, 0x58, 0xa, 0xf8,
+ 0x38, 0xf9, 0x5, 0x5a, 0xa, 0xa4, 0xf7, 0xf,
+ 0x4c, 0xa, 0xfb, 0x65, 0xfb, 0xf, 0x5a, 0xa,
+ 0xa5, 0xf7, 0xf, 0x5, 0xfb, 0x4, 0x6, 0xfb,
+ 0x88, 0xfc, 0xb6, 0x24, 0xa, 0x79, 0xe4, 0xf8,
+ 0x21, 0xe6, 0x1, 0x9e, 0xf1, 0xf7, 0xee, 0xed,
+ 0x3, 0xf7, 0x81, 0xf9, 0x3d, 0x15, 0xf7, 0xc2,
+ 0x40, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7, 0xc, 0x5,
+ 0xfb, 0xb0, 0xfc, 0xda, 0x24, 0xa, 0x7c, 0xe6,
+ 0x3e, 0x76, 0xf8, 0x93, 0xe6, 0x8f, 0x77, 0x12,
+ 0x97, 0xf2, 0xf8, 0x5, 0xeb, 0x13, 0x6c, 0x7f,
+ 0xa7, 0x15, 0xbf, 0x59, 0xc1, 0xbf, 0x5, 0x13,
+ 0x9c, 0x6d, 0xb5, 0xbe, 0x7c, 0xbf, 0x1b, 0xf7,
+ 0x62, 0xf7, 0x1c, 0xf7, 0x2c, 0xf7, 0x7b, 0x8a,
+ 0x1f, 0xb2, 0x81, 0xb0, 0x7a, 0xac, 0x1e, 0xc6,
+ 0xc6, 0x57, 0xbb, 0x56, 0x58, 0x5, 0x13, 0xac,
+ 0xa9, 0x68, 0x59, 0x9c, 0x4c, 0x1b, 0xfb, 0x92,
+ 0x2e, 0xfb, 0x6e, 0xfb, 0x2f, 0x5b, 0x97, 0x62,
+ 0x9e, 0x6a, 0x1f, 0xdd, 0xda, 0x15, 0x83, 0x9e,
+ 0x88, 0xa5, 0x8c, 0xa5, 0x8, 0xf7, 0x3, 0xe4,
+ 0xf7, 0x23, 0xf7, 0x1b, 0xb3, 0xaa, 0x80, 0x7a,
+ 0xa1, 0x1e, 0xfb, 0x9b, 0xfb, 0xfa, 0x15, 0xf7,
+ 0xc4, 0xf7, 0xbd, 0x5, 0x93, 0x78, 0x8e, 0x74,
+ 0x74, 0x1a, 0x27, 0x41, 0xfb, 0x33, 0xfb, 0x2d,
+ 0x67, 0x6c, 0x95, 0x9c, 0x76, 0x1e, 0xe, 0x77,
+ 0xa, 0xbb, 0xdf, 0xcb, 0x77, 0x58, 0xa, 0xf7,
+ 0x2c, 0xf9, 0xf, 0x15, 0xd9, 0x71, 0xa0, 0xaf,
+ 0x9d, 0xa6, 0xa6, 0x8a, 0x19, 0xa4, 0x8a, 0x9e,
+ 0x80, 0x9b, 0x80, 0x8, 0x7a, 0xa3, 0xa0, 0x77,
+ 0xaf, 0x1b, 0xd5, 0xc6, 0xc6, 0xcb, 0xa6, 0x1f,
+ 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x73, 0x60, 0x69,
+ 0x1b, 0x74, 0x7a, 0x9a, 0x9a, 0x76, 0x1f, 0x9a,
+ 0x77, 0x73, 0x9a, 0x68, 0x1b, 0x3c, 0x53, 0x48,
+ 0x56, 0x72, 0x1f, 0xfb, 0x19, 0xfc, 0x45, 0x24,
+ 0xa, 0x8b, 0xe7, 0xe5, 0xe6, 0xf7, 0x59, 0xe7,
+ 0x1, 0xf8, 0x7d, 0xed, 0x3, 0x84, 0x16, 0xf7,
+ 0xca, 0x5b, 0xa, 0xfb, 0x15, 0x46, 0xa, 0xf7,
+ 0x11, 0x6, 0xf7, 0x3b, 0xdf, 0xe6, 0xf7, 0x16,
+ 0x1f, 0xf3, 0x8a, 0x3a, 0xc2, 0xfb, 0xa, 0x1b,
+ 0xfb, 0xa8, 0x6, 0x78, 0x2f, 0x5, 0xde, 0x6,
+ 0x3b, 0xfc, 0xe, 0x5, 0x38, 0x6, 0xf7, 0x6f,
+ 0xf7, 0x49, 0x15, 0xb3, 0xf7, 0x59, 0x5, 0xeb,
+ 0x6, 0xc5, 0xcb, 0x73, 0x51, 0x20, 0x2b, 0x83,
+ 0x3d, 0x1f, 0xe, 0xfb, 0x9, 0x76, 0xc1, 0xf7,
+ 0x40, 0xf8, 0x11, 0xe6, 0x1, 0xba, 0xec, 0xf7,
+ 0xfd, 0xe9, 0x3, 0xd7, 0x45, 0x15, 0xa8, 0x47,
+ 0x5, 0xab, 0xcb, 0xa8, 0xa1, 0xaf, 0x1b, 0xa7,
+ 0xa1, 0x7e, 0x7e, 0xa2, 0x1f, 0x7f, 0xa1, 0xa1,
+ 0x80, 0xa7, 0x1b, 0xc3, 0xac, 0xa6, 0xb8, 0xc3,
+ 0x1f, 0x5f, 0xca, 0x5, 0x67, 0x60, 0x7c, 0x83,
+ 0x78, 0x1b, 0x73, 0x76, 0x9b, 0xa2, 0x6f, 0x1f,
+ 0xf7, 0x3f, 0xb5, 0xed, 0xf7, 0x28, 0xf7, 0x27,
+ 0x1a, 0xeb, 0x5e, 0xf7, 0x16, 0xfb, 0x3d, 0xfb,
+ 0x37, 0xfb, 0x43, 0xfb, 0x11, 0xfb, 0x6c, 0xfb,
+ 0x7, 0xbd, 0x48, 0xd4, 0x73, 0x1e, 0x69, 0x62,
+ 0x5, 0x93, 0xf7, 0x95, 0x15, 0xf7, 0x3b, 0xf7,
+ 0x22, 0xd4, 0xdb, 0xec, 0xb5, 0x40, 0x3a, 0xfb,
+ 0x13, 0xfb, 0x1c, 0x29, 0x37, 0x47, 0x42, 0xb0,
+ 0xf3, 0x1e, 0xe, 0x8b, 0xe7, 0xf7, 0xe, 0xe7,
+ 0xf7, 0x38, 0xe7, 0x1, 0xf5, 0xed, 0xf7, 0xb8,
+ 0xee, 0x3, 0x8e, 0x16, 0xf7, 0x98, 0x5b, 0xa,
+ 0x3d, 0x6, 0xa4, 0xf7, 0xe, 0x5, 0xdd, 0x6,
+ 0xd2, 0xfb, 0x2, 0x9d, 0x6a, 0x9b, 0x67, 0x95,
+ 0x68, 0x19, 0xf7, 0x22, 0x5b, 0xa, 0x3c, 0x6,
+ 0x2e, 0x97, 0xa, 0xf7, 0xa, 0x9d, 0xc9, 0xdf,
+ 0xe6, 0x1a, 0xe9, 0x3b, 0xb6, 0x26, 0x1e, 0xfb,
+ 0xb5, 0x6, 0x78, 0x2f, 0x8a, 0xa, 0x3b, 0xfc,
+ 0xe, 0x5, 0x37, 0x6, 0xf7, 0x77, 0xf7, 0x6a,
+ 0x15, 0xad, 0xf7, 0x38, 0x5, 0xf7, 0x18, 0x6,
+ 0xa2, 0xc5, 0x83, 0x5b, 0x2c, 0x25, 0x7e, 0x59,
+ 0x1f, 0xe, 0x75, 0xe9, 0xf8, 0x34, 0xe9, 0x12,
+ 0xeb, 0xf6, 0xf7, 0x81, 0xf4, 0x13, 0xe0, 0x82,
+ 0x75, 0x15, 0xf2, 0x6, 0x95, 0xba, 0x5, 0x80,
+ 0x9a, 0xdb, 0x67, 0xd2, 0x1b, 0x13, 0x70, 0xf7,
+ 0x41, 0xf1, 0xc3, 0xf7, 0x1e, 0xf7, 0x3, 0xfb,
+ 0x1c, 0x99, 0x33, 0x9d, 0x1f, 0x4c, 0x98, 0x54,
+ 0xac, 0xb4, 0x1a, 0xc7, 0xca, 0xa5, 0xee, 0xb6,
+ 0xb1, 0x76, 0x7b, 0xac, 0x1e, 0x13, 0xe0, 0x79,
+ 0x33, 0x5, 0xf2, 0x6, 0xb8, 0xf7, 0x6f, 0x5,
+ 0x24, 0x6, 0x85, 0x69, 0x5, 0x9b, 0x69, 0x55,
+ 0x9d, 0x5f, 0x1b, 0xfb, 0x45, 0x2c, 0x41, 0xfb,
+ 0xc, 0x34, 0xf0, 0x4d, 0xea, 0x81, 0x1f, 0xc1,
+ 0x84, 0xe9, 0x81, 0x55, 0x1a, 0x58, 0x4c, 0x68,
+ 0xfb, 0x0, 0x54, 0x5b, 0xa5, 0xa4, 0x61, 0x1e,
+ 0x9a, 0xcf, 0x5, 0x24, 0x6, 0xe, 0x75, 0xe6,
+ 0xf8, 0x2b, 0xe6, 0x1, 0xe4, 0xef, 0xf7, 0x6e,
+ 0xee, 0x3, 0x82, 0x75, 0x15, 0xec, 0x6, 0x95,
+ 0xb9, 0x5, 0x79, 0x9f, 0xbc, 0x6f, 0xd8, 0x1b,
+ 0xf7, 0x3a, 0xeb, 0xcb, 0xf7, 0x3, 0xf7, 0x2,
+ 0x41, 0xa5, 0x31, 0x98, 0x1f, 0x62, 0x90, 0xfb,
+ 0x4, 0x95, 0xcd, 0x1a, 0xb5, 0xcd, 0xbe, 0xe1,
+ 0xb2, 0xae, 0x75, 0x7c, 0xaa, 0x1e, 0x7c, 0x36,
+ 0x96, 0xa, 0xb5, 0xf7, 0x69, 0x7a, 0xa, 0x84,
+ 0x69, 0x5, 0x9a, 0x6b, 0x66, 0x9e, 0x61, 0x1b,
+ 0xfb, 0x36, 0x22, 0x3c, 0xfb, 0x13, 0x31, 0xdb,
+ 0x65, 0xdb, 0x82, 0x1f, 0xbf, 0x86, 0xf5, 0x83,
+ 0x51, 0x1a, 0x59, 0x45, 0x69, 0x35, 0x56, 0x64,
+ 0x99, 0xb0, 0x62, 0x1e, 0x97, 0xcb, 0x7a, 0xa,
+ 0xf7, 0xb1, 0xf8, 0x3c, 0x48, 0xa, 0xa1, 0xf7,
+ 0x57, 0xf7, 0xaa, 0xe2, 0x1, 0xea, 0xf6, 0xf7,
+ 0x7d, 0xf4, 0x3, 0xf7, 0x42, 0x2f, 0x15, 0x8e,
+ 0x96, 0xa0, 0x8f, 0x9e, 0x1b, 0x94, 0x96, 0x84,
+ 0x7f, 0x7e, 0x7c, 0x80, 0x7b, 0x7f, 0x7b, 0x8f,
+ 0x96, 0x7a, 0x1f, 0x59, 0x4c, 0x5, 0x6f, 0xab,
+ 0xa2, 0x89, 0xa2, 0x1b, 0xd1, 0xd1, 0xb9, 0xdc,
+ 0xa4, 0x83, 0xb0, 0x60, 0x95, 0x1f, 0x95, 0xa8,
+ 0x5, 0xf7, 0x30, 0x93, 0xe3, 0xc6, 0xee, 0x1a,
+ 0xf4, 0x3c, 0xa4, 0x2b, 0x97, 0x1e, 0x5f, 0x90,
+ 0xfb, 0xb, 0x94, 0xca, 0x1a, 0xb4, 0xd3, 0xba,
+ 0xe6, 0xb4, 0xb1, 0x76, 0x7d, 0xac, 0x1e, 0x7a,
+ 0x3b, 0x5, 0xf2, 0x6, 0xb9, 0xf7, 0x5e, 0x5,
+ 0x25, 0x6, 0x84, 0x6b, 0x5, 0x99, 0x68, 0x64,
+ 0x9d, 0x5e, 0x1b, 0xfb, 0x40, 0xfb, 0x6, 0x40,
+ 0xfb, 0xc, 0x35, 0xe0, 0x67, 0xe1, 0x82, 0x1f,
+ 0xc2, 0x86, 0xf7, 0x6, 0x83, 0x54, 0x1a, 0x5b,
+ 0x40, 0x6b, 0x2f, 0x53, 0x61, 0x98, 0xae, 0x60,
+ 0x1e, 0x97, 0xc8, 0x5, 0x25, 0x6, 0x5d, 0xfb,
+ 0x58, 0x5, 0xf2, 0x6, 0x96, 0xb6, 0x9c, 0x7e,
+ 0xad, 0x78, 0xc0, 0x83, 0x19, 0xe, 0x3a, 0xa,
+ 0xc6, 0x16, 0xf7, 0xf3, 0x34, 0xa, 0xfb, 0x12,
+ 0x6, 0xd9, 0xf8, 0x10, 0x5, 0xf7, 0x14, 0x6,
+ 0x75, 0xfb, 0x5, 0x56, 0xa, 0xb4, 0xf7, 0x60,
+ 0x5, 0xfc, 0xbb, 0x6, 0x62, 0xfb, 0x60, 0x96,
+ 0xa, 0xa3, 0xf7, 0x5, 0x5, 0xf7, 0x15, 0x6,
+ 0x3d, 0x7d, 0xa, 0xfb, 0x15, 0x6, 0xe, 0x8b,
+ 0xe6, 0xb4, 0xe5, 0xf7, 0x9, 0xe5, 0xb5, 0xe6,
+ 0x1, 0xf7, 0x26, 0xe0, 0xf7, 0xa0, 0xe1, 0x3,
+ 0x99, 0x16, 0xf7, 0xd4, 0x6, 0x9c, 0xe6, 0x5,
+ 0xfb, 0xc, 0x6, 0x92, 0xb4, 0x5, 0xf7, 0x9,
+ 0x6, 0xf7, 0x14, 0xf1, 0xaf, 0xf7, 0x28, 0xe6,
+ 0x45, 0xa1, 0x36, 0x1f, 0xfb, 0x1e, 0x6, 0x92,
+ 0xb5, 0x5, 0xf7, 0xf, 0x6, 0x9b, 0xe6, 0x5,
+ 0xfb, 0xd4, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x6,
+ 0x6, 0x46, 0x7d, 0xa, 0xfb, 0x7, 0x6, 0xf7,
+ 0x73, 0xf7, 0x17, 0x15, 0xa1, 0xf7, 0x9, 0x5,
+ 0xf7, 0x10, 0x6, 0xaa, 0xcf, 0x8a, 0x60, 0x3c,
+ 0x38, 0x91, 0x6c, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+ 0x20, 0xe7, 0x1, 0xd6, 0xea, 0xf7, 0x8a, 0xea,
+ 0x3, 0x84, 0xf8, 0x6a, 0x15, 0xdd, 0x6, 0x54,
+ 0xfb, 0xa3, 0x5, 0x87, 0x77, 0x88, 0x79, 0x7a,
+ 0x1a, 0xfb, 0x1, 0x8c, 0xc2, 0x56, 0xf7, 0x12,
+ 0x1b, 0xf7, 0x15, 0xf1, 0xc3, 0xf7, 0x2e, 0xab,
+ 0x1f, 0xc0, 0xf7, 0xaa, 0x5c, 0xa, 0x9d, 0xe7,
+ 0x5, 0xfb, 0xa0, 0x6, 0x78, 0x2f, 0x5, 0xeb,
+ 0x6, 0x57, 0xfb, 0x9b, 0x5, 0x35, 0x7a, 0x6a,
+ 0x5c, 0x25, 0x1b, 0x35, 0x7a, 0xaf, 0xb4, 0x8a,
+ 0x1f, 0x98, 0x8e, 0x98, 0x8d, 0x98, 0x1e, 0xc4,
+ 0xf7, 0xac, 0x5, 0xe9, 0x5b, 0xa, 0xfb, 0xa4,
+ 0x6, 0xe, 0x79, 0xa, 0xf7, 0x7e, 0x77, 0x59,
+ 0xa, 0xf7, 0x61, 0xf8, 0xf0, 0x15, 0xf7, 0xdc,
+ 0xd7, 0x77, 0xf3, 0xfb, 0xd0, 0xfb, 0xd, 0x8f,
+ 0xa, 0xfb, 0x5f, 0x25, 0xa, 0xe, 0x79, 0xa,
+ 0xf7, 0x7a, 0x77, 0x59, 0xa, 0xf7, 0x3a, 0xf8,
+ 0xed, 0x15, 0xf7, 0x41, 0xf5, 0xf7, 0x11, 0x21,
+ 0xcd, 0xaf, 0xfb, 0x15, 0xf7, 0x23, 0x5, 0x2c,
+ 0x6, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0x31, 0xfb,
+ 0x46, 0x25, 0xa, 0xe, 0x79, 0xa, 0xd6, 0xf7,
+ 0xf, 0x59, 0xa, 0xf7, 0xf8, 0xf9, 0x5, 0x15,
+ 0xf7, 0x1, 0x6, 0xa5, 0xf7, 0xf, 0x86, 0xa,
+ 0xfb, 0x62, 0xfb, 0xf, 0x15, 0xf7, 0x2, 0x6,
+ 0xa6, 0xf7, 0xf, 0x86, 0xa, 0xfb, 0x47, 0xfb,
+ 0xb4, 0x25, 0xa, 0xe, 0x79, 0xa, 0x59, 0xa,
+ 0xa2, 0xf8, 0x60, 0x25, 0xa, 0xf7, 0x1a, 0xf7,
+ 0x17, 0x15, 0xf7, 0xbb, 0x3e, 0xb0, 0xc5, 0xfb,
+ 0xa0, 0xf7, 0xe, 0x5, 0xe, 0xf8, 0x6b, 0xe6,
+ 0x1, 0xf7, 0x2b, 0xec, 0xf7, 0x55, 0xe9, 0x3,
+ 0xf7, 0x2b, 0x89, 0x15, 0xec, 0x6, 0xf7, 0xb3,
+ 0xf8, 0x6d, 0x5, 0xd1, 0x34, 0xa, 0xfb, 0x96,
+ 0x36, 0xa, 0xe9, 0x6, 0xfb, 0x6a, 0xfc, 0x0,
+ 0x40, 0xf8, 0x0, 0x5, 0xdc, 0x34, 0xa, 0xfb,
+ 0x95, 0x36, 0xa, 0xd8, 0x6, 0xe, 0xa0, 0x76,
+ 0xf8, 0x5e, 0x77, 0xac, 0xe6, 0x1, 0x93, 0xed,
+ 0x3, 0x84, 0x16, 0xdd, 0x6, 0xf7, 0x49, 0xf7,
+ 0xc6, 0xc3, 0xfb, 0xc6, 0x5, 0xdd, 0x6, 0xf7,
+ 0x39, 0xf8, 0x6b, 0x5, 0xbc, 0x34, 0xa, 0xfb,
+ 0x82, 0x36, 0xa, 0xec, 0x6, 0x2e, 0xfb, 0xab,
+ 0x59, 0xf7, 0x9e, 0x5, 0x47, 0x6, 0xfb, 0x34,
+ 0xfb, 0xa0, 0xa0, 0xf7, 0xad, 0x5, 0xeb, 0x34,
+ 0xa, 0xfb, 0x83, 0x36, 0xa, 0xbd, 0x6, 0xe,
+ 0x3a, 0xa, 0x65, 0x16, 0xf7, 0x97, 0x34, 0xa,
+ 0x3b, 0x6, 0xf7, 0x1b, 0xf7, 0x11, 0xdf, 0xfb,
+ 0x11, 0x5, 0x4c, 0x6e, 0xa, 0xf7, 0x89, 0x34,
+ 0xa, 0x47, 0x6, 0xfb, 0x11, 0xf7, 0x55, 0xf7,
+ 0x4b, 0xf7, 0x4f, 0x5, 0xd1, 0x34, 0xa, 0xfb,
+ 0x76, 0x6e, 0xa, 0xba, 0x6, 0xfb, 0x5, 0xfb,
+ 0xa, 0x4b, 0xf7, 0xa, 0x5, 0xc2, 0x34, 0xa,
+ 0xfb, 0x84, 0x36, 0xa, 0xd2, 0x6, 0xf5, 0xfb,
+ 0x4f, 0xfb, 0x62, 0xfb, 0x55, 0x5, 0x47, 0x6,
+ 0xe, 0x3a, 0xa, 0x9d, 0x16, 0xf7, 0xf0, 0x42,
+ 0xa, 0xfb, 0x10, 0x6, 0xa7, 0xf7, 0x1c, 0xf7,
+ 0x68, 0xf7, 0x88, 0x5, 0xdc, 0x42, 0xa, 0xfb,
+ 0x83, 0x36, 0xa, 0xc3, 0x6, 0xfb, 0x1e, 0xfb,
+ 0x31, 0x41, 0xf7, 0x31, 0x5, 0xc2, 0x34, 0xa,
+ 0xfb, 0x85, 0x4b, 0xa, 0xda, 0x6, 0xf7, 0x3,
+ 0xfb, 0x88, 0x70, 0xfb, 0x1c, 0x5, 0xfb, 0x11,
+ 0x6, 0xe, 0x8b, 0xe5, 0xf8, 0x8, 0xe5, 0x1,
+ 0x9c, 0x16, 0xf7, 0xef, 0x6, 0x9f, 0xe5, 0x5,
+ 0xfb, 0x11, 0x6, 0xa7, 0xf7, 0x19, 0xf7, 0x69,
+ 0xf7, 0x83, 0x5, 0xdc, 0x46, 0xa, 0xfb, 0x84,
+ 0x6, 0x79, 0x31, 0x5, 0xc2, 0x6, 0xfb, 0x1f,
+ 0xfb, 0x2d, 0x43, 0xf7, 0x2d, 0x5, 0xc1, 0x46,
+ 0xa, 0xfb, 0x83, 0x6, 0x79, 0x31, 0x5c, 0xa,
+ 0xf7, 0x5, 0xfb, 0x83, 0x6d, 0xfb, 0x19, 0x5,
+ 0xfb, 0x10, 0x6, 0xf7, 0x3e, 0xf8, 0x97, 0x15,
+ 0xf7, 0xe1, 0xd8, 0x77, 0xf1, 0xfb, 0xd5, 0xfb,
+ 0xc, 0x5, 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8,
+ 0xe3, 0xf7, 0x15, 0x12, 0xf7, 0x38, 0xeb, 0x3b,
+ 0xf7, 0x2, 0xd1, 0xf7, 0x3, 0x13, 0xf4, 0xa0,
+ 0x16, 0xf7, 0xec, 0x6, 0x9d, 0xe8, 0x5, 0xfb,
+ 0xf, 0x6, 0xa5, 0xf7, 0x14, 0xf7, 0x69, 0xf7,
+ 0x96, 0x5, 0xda, 0x94, 0xa, 0xfb, 0x82, 0x6,
+ 0x79, 0x2e, 0x5, 0xc3, 0x6, 0xfb, 0x20, 0xfb,
+ 0x3d, 0x45, 0xf7, 0x3d, 0x5, 0xc1, 0x6, 0x9d,
+ 0xe8, 0x5, 0xfb, 0x81, 0x82, 0xa, 0xd9, 0x6,
+ 0xf7, 0x1, 0xfb, 0x96, 0x71, 0xfb, 0x14, 0x5,
+ 0xfb, 0x11, 0x6, 0xf7, 0xd5, 0xf8, 0xcb, 0x92,
+ 0xa, 0xa5, 0xf7, 0x15, 0x4c, 0xa, 0x13, 0xec,
+ 0xfb, 0x62, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0x6,
+ 0xa5, 0xf7, 0x15, 0x86, 0xa, 0xe, 0x3a, 0xa,
+ 0xe4, 0xec, 0x3, 0x98, 0x16, 0xf8, 0x74, 0x6,
+ 0xbc, 0xf7, 0x70, 0x66, 0xa, 0x6c, 0xfb, 0x15,
+ 0x5, 0xfb, 0x8e, 0x6, 0xf8, 0x2e, 0xf8, 0x2a,
+ 0x98, 0xcc, 0x5, 0xfc, 0x58, 0x6, 0x5d, 0xfb,
+ 0x61, 0x96, 0xa, 0xa7, 0xf7, 0x6, 0x5, 0xf7,
+ 0x6e, 0x6, 0xfc, 0x28, 0xfc, 0x25, 0x5, 0xe,
+ 0x8b, 0xe4, 0xf8, 0xd, 0xe5, 0x1, 0xd7, 0xea,
+ 0xf7, 0x8d, 0xea, 0x3, 0x8c, 0x16, 0xf8, 0x68,
+ 0x6, 0xb9, 0xf7, 0x6d, 0x5, 0x2c, 0x6, 0x71,
+ 0xfb, 0x14, 0x5, 0xfb, 0x89, 0x6, 0xf8, 0x23,
+ 0xf8, 0x27, 0x99, 0xcb, 0x5, 0xfc, 0x4d, 0x6,
+ 0x5e, 0xfb, 0x5f, 0x5, 0xea, 0x6, 0xa5, 0xf7,
+ 0x5, 0x5, 0xf7, 0x6a, 0x6, 0xfc, 0x20, 0xfc,
+ 0x23, 0x5, 0xf7, 0xbd, 0xf8, 0xb3, 0x15, 0xed,
+ 0x6, 0xf7, 0x50, 0xf7, 0x23, 0x58, 0xaf, 0xfb,
+ 0x42, 0x21, 0xfb, 0x11, 0xf6, 0x46, 0x69, 0x5,
+ 0xe, 0x7c, 0xea, 0x35, 0xea, 0xf5, 0xe9, 0xd0,
+ 0xeb, 0x12, 0xaf, 0xed, 0xf7, 0xbd, 0xed, 0x13,
+ 0x7c, 0xf8, 0x6, 0x85, 0x15, 0xf7, 0x44, 0x6,
+ 0x9e, 0xea, 0x5, 0x3a, 0x6, 0xad, 0xf7, 0x3f,
+ 0x92, 0xa7, 0x90, 0xaa, 0x8a, 0xa7, 0x19, 0xee,
+ 0xfb, 0x1e, 0x93, 0x6f, 0x3d, 0x2c, 0x71, 0x6e,
+ 0x42, 0x1e, 0xa0, 0x3a, 0x5, 0xa2, 0xcb, 0xd6,
+ 0x9c, 0xc9, 0x1b, 0xa2, 0xd0, 0x8a, 0x61, 0x80,
+ 0x89, 0x80, 0x8a, 0x80, 0x1f, 0x8f, 0x67, 0x64,
+ 0x8e, 0x65, 0x1b, 0xfb, 0x8c, 0x6c, 0xfb, 0x25,
+ 0x68, 0x1f, 0x13, 0xbc, 0x4e, 0xbc, 0x4c, 0xf5,
+ 0xdc, 0xb5, 0xa2, 0xae, 0xcc, 0x1e, 0x13, 0x7c,
+ 0xa3, 0xf7, 0x5, 0x15, 0x13, 0xbc, 0x5f, 0x51,
+ 0x48, 0x6b, 0x47, 0x1b, 0x66, 0x64, 0x96, 0xa4,
+ 0xc7, 0xed, 0x9e, 0xbc, 0xc6, 0xb1, 0x85, 0x89,
+ 0xab, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+ 0x12, 0xa6, 0xeb, 0x13, 0x7c, 0xf7, 0x87, 0xf8,
+ 0x77, 0x15, 0xf7, 0xde, 0xd7, 0x77, 0xf1, 0xfb,
+ 0xd4, 0xfb, 0xd, 0x5, 0xf7, 0xe, 0xfc, 0xb3,
+ 0x21, 0xa, 0x8b, 0xe5, 0xee, 0xe4, 0xcc, 0xe6,
+ 0x1, 0xae, 0xe9, 0xf7, 0x7e, 0xef, 0x3, 0xf7,
+ 0x61, 0xf8, 0x73, 0x15, 0xf7, 0x3f, 0xf4, 0xf7,
+ 0x10, 0x22, 0xcc, 0xae, 0xfb, 0x14, 0xf7, 0x23,
+ 0x66, 0xa, 0xfb, 0x50, 0xfb, 0x22, 0x5, 0xf7,
+ 0x67, 0xfc, 0x9a, 0x22, 0xa, 0x3b, 0xa, 0x1f,
+ 0xa1, 0xf7, 0x1, 0x15, 0x2c, 0xa, 0xf7, 0x35,
+ 0xf7, 0xb2, 0x3, 0xf7, 0x35, 0xf8, 0x90, 0x15,
+ 0xf7, 0xb2, 0xca, 0x7a, 0xe5, 0xfb, 0xaa, 0x23,
+ 0x5, 0xe, 0x41, 0xa, 0xca, 0xf7, 0x12, 0x12,
+ 0xb3, 0xeb, 0x13, 0x7c, 0xf8, 0x35, 0xf8, 0x87,
+ 0x15, 0xf7, 0x8, 0x6, 0xa4, 0xf7, 0x12, 0x5,
+ 0xfb, 0x8, 0x6, 0xfb, 0x6a, 0xfb, 0x12, 0x15,
+ 0xf7, 0x6, 0x6, 0xa6, 0xf7, 0x12, 0x5, 0xfb,
+ 0x9, 0x6, 0xf7, 0x8, 0xfd, 0x8, 0x21, 0xa,
+ 0x7c, 0xea, 0xe0, 0xeb, 0x39, 0xec, 0xde, 0xea,
+ 0x12, 0x13, 0xd0, 0xf7, 0xa4, 0xc5, 0x15, 0x71,
+ 0x97, 0xad, 0x5c, 0xe6, 0x1b, 0xc3, 0xbc, 0x99,
+ 0xa0, 0xc7, 0x1f, 0x7d, 0xe7, 0x5, 0x74, 0x47,
+ 0x64, 0x82, 0x73, 0x1b, 0x36, 0x8b, 0xcb, 0x9e,
+ 0x8e, 0x1f, 0x8c, 0x8d, 0x5, 0xf7, 0x89, 0x6,
+ 0x98, 0xb2, 0x94, 0xb3, 0xb4, 0x1a, 0xde, 0x6c,
+ 0xe1, 0x2b, 0x60, 0x56, 0x78, 0x68, 0x67, 0x1e,
+ 0xb1, 0x77, 0x72, 0x9b, 0x47, 0x1b, 0x42, 0x2d,
+ 0x66, 0x89, 0x86, 0x1f, 0x94, 0x2d, 0x5, 0x9c,
+ 0xba, 0xc0, 0xa0, 0xb7, 0x1b, 0xac, 0x9b, 0x7f,
+ 0x6c, 0x81, 0x8a, 0x80, 0x88, 0x7d, 0x1f, 0x89,
+ 0x81, 0x5, 0x13, 0xb0, 0x8d, 0x72, 0x79, 0x8e,
+ 0x67, 0x1b, 0xfb, 0x14, 0x40, 0x2c, 0x34, 0x1f,
+ 0x4d, 0x8c, 0xb7, 0x5c, 0xd6, 0x1b, 0xd3, 0xc4,
+ 0xba, 0xa5, 0xb1, 0x1f, 0x13, 0xd0, 0xe7, 0xf7,
+ 0x5f, 0x15, 0xc6, 0x9a, 0xba, 0xb2, 0xb4, 0x1b,
+ 0xc5, 0x87, 0x3e, 0x76, 0x89, 0x1f, 0xfb, 0xae,
+ 0xfb, 0x1e, 0x15, 0x6e, 0x6a, 0x63, 0x7d, 0x63,
+ 0x1b, 0x79, 0x78, 0x95, 0xae, 0x1f, 0x13, 0xb0,
+ 0x95, 0x9a, 0xb7, 0xe3, 0x96, 0xab, 0x8a, 0x87,
+ 0x9a, 0x1e, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+ 0x12, 0xae, 0xeb, 0x13, 0x7c, 0xf7, 0x74, 0xf8,
+ 0xc6, 0x15, 0xf7, 0xc4, 0x3b, 0xb0, 0xc5, 0xfb,
+ 0xa9, 0xf7, 0xd, 0x5, 0xd6, 0xfd, 0x2c, 0x21,
+ 0xa, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x17, 0xe9,
+ 0xf7, 0x18, 0xea, 0x12, 0xad, 0xf2, 0x9b, 0xed,
+ 0x13, 0x7c, 0xf7, 0xda, 0xb0, 0x15, 0xa0, 0x63,
+ 0x5, 0xf7, 0x45, 0x3f, 0xa, 0xfb, 0x19, 0x6,
+ 0x7f, 0xa1, 0xa5, 0xa8, 0x9d, 0xbc, 0xa0, 0xaa,
+ 0x19, 0xdf, 0x3f, 0xa, 0xfb, 0x2a, 0x6, 0x81,
+ 0x74, 0x6c, 0x44, 0x76, 0x71, 0x8, 0x3c, 0xf7,
+ 0x22, 0x73, 0xb3, 0xab, 0x1a, 0xa7, 0xab, 0x94,
+ 0xa9, 0x8c, 0x1e, 0xb9, 0x8c, 0xc3, 0x74, 0x9c,
+ 0x76, 0xd2, 0xd0, 0x18, 0xb1, 0x64, 0x4b, 0xaa,
+ 0x4d, 0x1b, 0x2c, 0x31, 0x4c, 0x34, 0x64, 0xa3,
+ 0x6c, 0x8f, 0x7d, 0x1f, 0x89, 0x7, 0x39, 0x69,
+ 0x4a, 0x3e, 0x34, 0x1a, 0x13, 0xbc, 0x4e, 0xb4,
+ 0x4c, 0xf1, 0xda, 0xb5, 0xad, 0x9d, 0xa7, 0x1e,
+ 0x62, 0xd9, 0x15, 0x74, 0x72, 0x6b, 0x7e, 0x6c,
+ 0x1b, 0x5f, 0x7b, 0xa5, 0xa4, 0xbf, 0xbd, 0xb2,
+ 0xaa, 0x9a, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x4b,
+ 0x77, 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf7, 0xb1,
+ 0xf8, 0xc4, 0x15, 0x5e, 0xb0, 0x68, 0xc0, 0xcd,
+ 0xd0, 0xc0, 0xca, 0xb9, 0x65, 0xaf, 0x55, 0x49,
+ 0x48, 0x54, 0x4c, 0x1e, 0xcf, 0x91, 0x15, 0xa7,
+ 0xa6, 0xa4, 0xa5, 0xa0, 0x9b, 0x7d, 0x79, 0x72,
+ 0x70, 0x75, 0x70, 0x77, 0x7b, 0x96, 0x9a, 0x1e,
+ 0x9a, 0xfc, 0xcd, 0x21, 0xa, 0xf7, 0xa2, 0xcf,
+ 0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x3, 0xf7,
+ 0x23, 0x15, 0xc9, 0xbf, 0x48, 0xd7, 0xf8, 0x1,
+ 0x8a, 0x2c, 0x4b, 0x6a, 0xa, 0x4a, 0x5, 0xfb,
+ 0xeb, 0x6, 0xdd, 0xc1, 0x8e, 0xa, 0x9b, 0x76,
+ 0xf8, 0xef, 0x77, 0x1, 0xf7, 0x95, 0x86, 0x15,
+ 0xf7, 0x5f, 0xf7, 0x36, 0x58, 0xc0, 0x38, 0x40,
+ 0xf7, 0xe, 0xf8, 0x5a, 0x44, 0x94, 0xfb, 0xe,
+ 0xfc, 0x5f, 0x5a, 0xd4, 0x49, 0x5c, 0x5, 0xe,
+ 0xf7, 0x99, 0xd1, 0x1, 0x69, 0xf9, 0x26, 0x3,
+ 0xf0, 0xf7, 0x23, 0x15, 0xc9, 0xbf, 0x51, 0xcd,
+ 0x5, 0xf8, 0x9b, 0x6, 0x95, 0xd1, 0x5, 0xfc,
+ 0x96, 0x6, 0xe9, 0xc8, 0x8e, 0xa, 0xf7, 0x9f,
+ 0xd1, 0x1, 0x69, 0xf9, 0x30, 0x3, 0x69, 0xf7,
+ 0x9f, 0x15, 0xf8, 0x96, 0x6, 0x2d, 0x4e, 0x6a,
+ 0xa, 0x49, 0x5, 0xfc, 0x9b, 0x6, 0xe, 0xa1,
+ 0xf8, 0x3b, 0x1, 0xf7, 0x2d, 0xd1, 0x3, 0xf7,
+ 0x2d, 0xa1, 0x15, 0xd1, 0x82, 0xf7, 0xe, 0xf8,
+ 0x5e, 0xbc, 0x42, 0xcd, 0xba, 0xfb, 0x9, 0xf7,
+ 0x3f, 0xfb, 0x5f, 0xfb, 0x37, 0xbe, 0x56, 0xde,
+ 0xd6, 0x5, 0xe, 0xf7, 0x8f, 0xf8, 0x1, 0x1,
+ 0xf7, 0x0, 0xf8, 0xc, 0x3, 0xf7, 0x0, 0xf7,
+ 0x8e, 0x15, 0xd7, 0xb1, 0xd9, 0xdb, 0xca, 0xd8,
+ 0xb5, 0x3a, 0xbf, 0x3f, 0xcc, 0x66, 0x93, 0xcb,
+ 0x18, 0x41, 0xf7, 0x2, 0x6a, 0xc2, 0x78, 0xf7,
+ 0x1c, 0x8, 0x5c, 0x6, 0x5b, 0xfb, 0x15, 0x56,
+ 0x46, 0x25, 0x23, 0x8, 0xe, 0xf7, 0x3a, 0xf2,
+ 0x2c, 0x76, 0xde, 0xf3, 0x9b, 0x77, 0x12, 0xcc,
+ 0xf8, 0x69, 0x13, 0x68, 0xf7, 0xc, 0xf7, 0x2d,
+ 0x15, 0xab, 0xa3, 0xa7, 0xbe, 0xb4, 0x1b, 0x9a,
+ 0xaa, 0x76, 0x7a, 0xae, 0x1f, 0x7f, 0xa3, 0xa5,
+ 0x81, 0xa4, 0x1b, 0xb6, 0xd2, 0xad, 0xdf, 0xbe,
+ 0x1f, 0x13, 0x98, 0x58, 0xc9, 0x5, 0x75, 0x7c,
+ 0x65, 0x54, 0x61, 0x1b, 0x74, 0x73, 0x96, 0x98,
+ 0x73, 0x1f, 0x13, 0x68, 0x9c, 0x6b, 0x6c, 0x9f,
+ 0x71, 0x1b, 0x44, 0x59, 0x48, 0x55, 0x61, 0x1f,
+ 0xe, 0xf7, 0x4e, 0xf0, 0x3, 0xf7, 0x4e, 0xf7,
+ 0x6f, 0x15, 0xf0, 0xf7, 0x7, 0xbd, 0xfb, 0x6,
+ 0xec, 0xc7, 0x52, 0xf3, 0xf7, 0x18, 0xad, 0x7c,
+ 0xee, 0xfb, 0x1d, 0x56, 0xb0, 0xf7, 0x1d, 0x4c,
+ 0xa, 0x78, 0xfb, 0x19, 0xfb, 0xb, 0xbc, 0x55,
+ 0x27, 0xf7, 0x16, 0x6a, 0x20, 0x22, 0x5, 0xe,
+ 0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x3b, 0xd5, 0xd2,
+ 0xd0, 0x1, 0x91, 0xe1, 0xc6, 0xd2, 0xf7, 0xb4,
+ 0xdb, 0x3, 0xf7, 0xcf, 0xf7, 0x3b, 0x15, 0x6a,
+ 0x9b, 0xad, 0x82, 0x9d, 0x1b, 0xf7, 0x0, 0xee,
+ 0xf7, 0x1c, 0xf7, 0xe, 0xf7, 0x16, 0x25, 0xcd,
+ 0xfb, 0x10, 0xfb, 0x3b, 0xfb, 0x53, 0xfb, 0x22,
+ 0xfb, 0x75, 0x22, 0xb6, 0xfb, 0x11, 0xf7, 0x50,
+ 0xf7, 0x13, 0xdf, 0xc4, 0xa4, 0xb5, 0x1f, 0x7d,
+ 0xcf, 0x5, 0x54, 0x32, 0x47, 0x74, 0x3f, 0x1b,
+ 0xfb, 0xb, 0x6b, 0xdd, 0xd8, 0xe5, 0xd6, 0xf7,
+ 0x63, 0xf7, 0x4b, 0xf2, 0xc4, 0x55, 0x39, 0x3a,
+ 0x54, 0x2c, 0x59, 0x7d, 0x79, 0x91, 0xa3, 0x8f,
+ 0x1f, 0x8c, 0x90, 0x8c, 0x8f, 0x8e, 0x91, 0xe2,
+ 0xf7, 0x48, 0x18, 0x46, 0x6, 0x82, 0x79, 0x5,
+ 0xa3, 0x78, 0x7e, 0x8b, 0x7d, 0x1b, 0x25, 0x2f,
+ 0xfb, 0x1d, 0x30, 0x51, 0xb1, 0x79, 0xa8, 0xac,
+ 0xaf, 0x9c, 0xa4, 0xa7, 0x1f, 0xa8, 0xf7, 0x3a,
+ 0x15, 0x70, 0x85, 0x62, 0xfb, 0x0, 0x4f, 0x1b,
+ 0x80, 0x87, 0x93, 0x97, 0xc5, 0xd1, 0xe4, 0xab,
+ 0xa3, 0x88, 0x74, 0x82, 0x8a, 0x1f, 0xe, 0x41,
+ 0xa, 0xf7, 0x1e, 0x77, 0xdd, 0x77, 0x12, 0x95,
+ 0xeb, 0x13, 0x7e, 0xf7, 0x12, 0xf8, 0x95, 0x15,
+ 0xdb, 0x71, 0x9a, 0x9f, 0x94, 0xa2, 0xa3, 0x98,
+ 0x19, 0xa3, 0x98, 0xa9, 0x7a, 0xaa, 0x79, 0x8,
+ 0x7c, 0xa6, 0xa7, 0x7b, 0xa4, 0x1b, 0xf0, 0xbf,
+ 0xe3, 0xad, 0x9d, 0x1f, 0x39, 0xa3, 0x5, 0x62,
+ 0x70, 0x7d, 0x76, 0x6f, 0x1b, 0x79, 0x79, 0x94,
+ 0x97, 0x78, 0x1f, 0x9c, 0x6f, 0x6f, 0xa1, 0x6b,
+ 0x1b, 0x29, 0x5c, 0x3d, 0x60, 0x72, 0x1f, 0xf7,
+ 0x68, 0xfc, 0x98, 0x22, 0xa, 0x1f, 0x13, 0xbe,
+ 0x3b, 0xa, 0x1e, 0x13, 0x7e, 0xa1, 0xf7, 0x1,
+ 0x15, 0x13, 0xbe, 0x2c, 0xa, 0x7c, 0xe8, 0x3a,
+ 0xe9, 0xf7, 0x9d, 0xe9, 0xdd, 0xe9, 0x12, 0xf8,
+ 0x94, 0xef, 0x13, 0x78, 0x80, 0x88, 0x15, 0xf7,
+ 0x47, 0x6, 0x94, 0xbb, 0x5, 0x13, 0xb8, 0x70,
+ 0xad, 0xb2, 0x6a, 0xd7, 0x1b, 0xf7, 0x5a, 0xe3,
+ 0xf7, 0x18, 0xf7, 0x1e, 0xf3, 0x42, 0xe6, 0xfb,
+ 0x14, 0x53, 0x54, 0x84, 0x69, 0x5b, 0x1f, 0xb8,
+ 0xf7, 0x6d, 0x5, 0xfb, 0x49, 0x44, 0xa, 0xdd,
+ 0x6, 0x13, 0x78, 0x32, 0xfc, 0x4d, 0x5, 0x3a,
+ 0x6, 0xf7, 0x5b, 0xef, 0x15, 0xe6, 0xc7, 0xd5,
+ 0xf7, 0xd, 0xe8, 0xa9, 0x48, 0x58, 0x1e, 0x13,
+ 0xb8, 0x35, 0x2d, 0x41, 0x34, 0x63, 0x38, 0xa5,
+ 0xe2, 0x1e, 0xe, 0xfb, 0x1d, 0xf9, 0x8f, 0x1,
+ 0xf7, 0x37, 0xf7, 0xa5, 0x3, 0xf7, 0xfe, 0xfb,
+ 0x1d, 0x15, 0xd5, 0xa8, 0xfb, 0x5b, 0xf9, 0x72,
+ 0x41, 0x6e, 0x5, 0xe, 0xfb, 0x73, 0x76, 0xfa,
+ 0x7c, 0x77, 0x1, 0xf7, 0x1a, 0xe3, 0x3, 0xf7,
+ 0x1a, 0xfb, 0x88, 0x15, 0xe3, 0x6, 0xf7, 0x88,
+ 0xfa, 0x7c, 0x5, 0x33, 0x6, 0xe, 0xf7, 0x34,
+ 0xdc, 0x3, 0xd5, 0xf7, 0x71, 0x15, 0xdc, 0x7f,
+ 0x95, 0x60, 0x61, 0x1a, 0x85, 0x80, 0x45, 0x74,
+ 0xfb, 0x19, 0x1e, 0x83, 0x5c, 0x97, 0x52, 0xbd,
+ 0x76, 0x8, 0x79, 0xb6, 0xc7, 0x8b, 0xbc, 0x1b,
+ 0x9d, 0xe8, 0x5, 0x64, 0x63, 0x8b, 0x95, 0x6b,
+ 0x1f, 0x76, 0x92, 0x89, 0xa4, 0x8f, 0xa2, 0x9e,
+ 0xf7, 0x9, 0x95, 0xcb, 0x8c, 0x96, 0x8, 0x8c,
+ 0x97, 0x8b, 0x93, 0x90, 0x1a, 0xb3, 0x74, 0xc3,
+ 0x63, 0xa5, 0x1e, 0xd0, 0xae, 0xbd, 0xdd, 0x98,
+ 0xd3, 0xa7, 0xf7, 0x28, 0x18, 0x8f, 0xa2, 0x96,
+ 0xa5, 0xa3, 0x91, 0x8, 0x95, 0xb2, 0xaf, 0x8b,
+ 0xb2, 0x1b, 0x9e, 0xe8, 0x5, 0x5a, 0x51, 0x8b,
+ 0x79, 0x57, 0x1f, 0x52, 0x77, 0x67, 0x51, 0x83,
+ 0x5c, 0x75, 0xfb, 0x9, 0x18, 0x76, 0xfb, 0x0,
+ 0x77, 0x4a, 0xfb, 0x3, 0x7b, 0x8, 0xe, 0xf8,
+ 0x2, 0xda, 0x3, 0xd5, 0xfb, 0x78, 0x15, 0xbc,
+ 0xc5, 0x8b, 0x9d, 0xbf, 0x1f, 0xc4, 0x9f, 0xaf,
+ 0xc5, 0x93, 0xba, 0xa1, 0xf7, 0x9, 0x18, 0xa0,
+ 0xf7, 0x0, 0x9f, 0xcc, 0xf7, 0x3, 0x9b, 0x9c,
+ 0xe9, 0x18, 0x3a, 0x97, 0x81, 0xb6, 0xb5, 0x1a,
+ 0x91, 0x96, 0xd1, 0xa2, 0xf7, 0x19, 0x1e, 0x93,
+ 0xba, 0x7f, 0xc4, 0x59, 0xa0, 0x8, 0x9d, 0x60,
+ 0x4f, 0x8b, 0x5a, 0x1b, 0x79, 0x2e, 0x5, 0xb2,
+ 0xb3, 0x8b, 0x81, 0xab, 0x1f, 0xa0, 0x84, 0x8d,
+ 0x72, 0x87, 0x74, 0x78, 0xfb, 0x9, 0x81, 0x4b,
+ 0x8a, 0x7f, 0x8, 0x8a, 0x80, 0x8b, 0x83, 0x86,
+ 0x1a, 0x63, 0xa2, 0x53, 0xb3, 0x71, 0x1e, 0x46,
+ 0x68, 0x59, 0x39, 0x7e, 0x43, 0x6f, 0xfb, 0x28,
+ 0x18, 0x87, 0x74, 0x80, 0x71, 0x73, 0x85, 0x8,
+ 0x81, 0x64, 0x67, 0x8b, 0x64, 0x1b, 0xe, 0x25,
+ 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x0, 0x25,
+ 0x15, 0xf7, 0x7c, 0x6, 0x9f, 0xe7, 0x5, 0xfb,
+ 0x1b, 0x6, 0xf7, 0x5, 0xf8, 0xaa, 0x5, 0xf7,
+ 0x1a, 0x5b, 0xa, 0xfb, 0x7c, 0x6, 0xe, 0x25,
+ 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x13, 0x81,
+ 0x15, 0x78, 0x2f, 0x5, 0xf7, 0x7b, 0x6, 0xf7,
+ 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x7c, 0x6, 0x77,
+ 0x2f, 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x6, 0xfc,
+ 0xaa, 0x5, 0xe, 0xf8, 0x68, 0xd5, 0x1, 0xdf,
+ 0xf9, 0xb, 0x15, 0x44, 0xb7, 0x2f, 0xf7, 0x22,
+ 0xf7, 0x31, 0xd3, 0xf7, 0x5, 0xbd, 0x9d, 0x1e,
+ 0x2f, 0x6, 0x3d, 0x64, 0x41, 0x80, 0x70, 0x1b,
+ 0x3c, 0x71, 0xc0, 0xaf, 0x8a, 0x1f, 0xe, 0xfb,
+ 0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xf7, 0x39,
+ 0xc6, 0xf7, 0x2c, 0xc6, 0x3, 0xf7, 0xac, 0xf7,
+ 0xb0, 0x15, 0xc6, 0x6, 0xeb, 0xf8, 0x1b, 0x5,
+ 0x50, 0x6, 0xfb, 0x67, 0xfd, 0xe6, 0x15, 0xc6,
+ 0x6, 0xed, 0xf8, 0x1a, 0x5, 0x50, 0x6, 0xe,
+ 0xf7, 0x18, 0xf7, 0xbe, 0x1, 0xf7, 0x1d, 0xf7,
+ 0xd9, 0x3, 0xf7, 0x1d, 0xf7, 0x8c, 0x15, 0x48,
+ 0xbf, 0x5a, 0xd8, 0xed, 0xed, 0xdb, 0xeb, 0xd1,
+ 0x57, 0xbf, 0x3c, 0x23, 0x31, 0x38, 0x28, 0x1e,
+ 0xe, 0x7c, 0xea, 0xf7, 0xb0, 0xea, 0x1, 0xae,
+ 0xf2, 0x3, 0xf8, 0x89, 0xf7, 0x2e, 0x15, 0x62,
+ 0x46, 0x4c, 0x6a, 0x38, 0x1b, 0x3e, 0x44, 0xb0,
+ 0xd5, 0xee, 0xe5, 0xd5, 0xf7, 0xd, 0xb3, 0xb3,
+ 0x80, 0x7c, 0xab, 0x1f, 0x77, 0x30, 0x5, 0xef,
+ 0x6, 0xb7, 0xf7, 0x68, 0x7b, 0xa, 0x86, 0x78,
+ 0x5, 0x98, 0x69, 0x65, 0x91, 0x62, 0x1b, 0xfb,
+ 0x64, 0xfb, 0x11, 0xfb, 0x27, 0xfb, 0x20, 0xfb,
+ 0xc, 0xf4, 0x48, 0xf7, 0xa, 0xf0, 0xf0, 0xb3,
+ 0xc3, 0xdf, 0x1f, 0xe, 0xf7, 0x79, 0xe6, 0x3,
+ 0xf7, 0x79, 0xf8, 0x81, 0x15, 0xe6, 0x6, 0xf7,
+ 0x45, 0xf7, 0x1e, 0x5b, 0xaf, 0xfb, 0x36, 0x25,
+ 0xfb, 0xc, 0xf1, 0x4b, 0x68, 0x5, 0xe, 0xfb,
+ 0x4d, 0x76, 0xf7, 0x58, 0xe8, 0xf7, 0xae, 0xe9,
+ 0x1, 0xa4, 0xf1, 0x3, 0xf7, 0x23, 0xfb, 0x46,
+ 0x15, 0x7b, 0x9e, 0xa6, 0x7f, 0xac, 0x1b, 0xd3,
+ 0xc0, 0xc2, 0xc5, 0xa5, 0x85, 0xac, 0x62, 0x95,
+ 0x1f, 0x8f, 0x9c, 0xdd, 0x98, 0xda, 0xad, 0xcf,
+ 0xb7, 0x19, 0x60, 0xd4, 0x5, 0x61, 0x46, 0x4c,
+ 0x6b, 0x38, 0x1b, 0x3f, 0x43, 0xaf, 0xd2, 0xee,
+ 0xe4, 0xd7, 0xf7, 0xe, 0xb5, 0xb2, 0x81, 0x7b,
+ 0xaa, 0x1f, 0x77, 0x31, 0x5, 0xef, 0x6, 0xb8,
+ 0xf7, 0x66, 0x5, 0x27, 0x6, 0x87, 0x78, 0x5,
+ 0x98, 0x69, 0x64, 0x91, 0x62, 0x1b, 0xfb, 0x62,
+ 0xfb, 0x12, 0xfb, 0x26, 0xfb, 0x1d, 0xfb, 0x4,
+ 0xe4, 0x4a, 0xf6, 0x82, 0x1f, 0x70, 0x31, 0x5,
+ 0x8c, 0x95, 0x9f, 0x91, 0x9c, 0x1b, 0x96, 0x95,
+ 0x87, 0x7d, 0x7c, 0x79, 0x83, 0x79, 0x7b, 0x7b,
+ 0x91, 0x93, 0x83, 0x1f, 0xe, 0xfb, 0x62, 0xd1,
+ 0xb4, 0xea, 0x1, 0xf7, 0xae, 0xd9, 0x3, 0xf7,
+ 0x5d, 0xfb, 0x46, 0x15, 0x79, 0xa1, 0xa3, 0x81,
+ 0xa9, 0x1b, 0xce, 0xc2, 0xc0, 0xca, 0xb8, 0x6b,
+ 0x9a, 0x80, 0x8f, 0x1f, 0x8f, 0xa5, 0x5, 0x3d,
+ 0x6, 0x6b, 0x24, 0x5, 0x8d, 0x94, 0xa4, 0x91,
+ 0x9c, 0x1b, 0x95, 0x92, 0x86, 0x81, 0x78, 0x78,
+ 0x84, 0x75, 0x7e, 0x7f, 0x91, 0x93, 0x84, 0x1f,
+ 0xe, 0x6f, 0x76, 0xf7, 0xfd, 0xf7, 0x4e, 0xf7,
+ 0x8, 0x77, 0x1, 0xc5, 0xf0, 0x3, 0xf7, 0x43,
+ 0x5a, 0x15, 0xed, 0x6, 0xa5, 0xf7, 0x1d, 0xd1,
+ 0x95, 0xcc, 0xa4, 0xca, 0xb2, 0x19, 0x6c, 0xd3,
+ 0x5, 0x60, 0x37, 0x5b, 0x72, 0x49, 0x1b, 0x33,
+ 0x76, 0xc1, 0xb0, 0xd6, 0xd2, 0xd3, 0xe6, 0xaf,
+ 0xae, 0x80, 0x7c, 0xa8, 0x1f, 0x7c, 0x49, 0x96,
+ 0xa, 0xb1, 0xf7, 0x4e, 0x7a, 0xa, 0x85, 0x6c,
+ 0x78, 0x91, 0x76, 0x90, 0x78, 0x8e, 0x19, 0xa6,
+ 0xf7, 0x19, 0x66, 0xa, 0x70, 0xfb, 0x18, 0x5,
+ 0xfb, 0x23, 0x6c, 0x39, 0x2b, 0xfb, 0x9, 0x1a,
+ 0xfb, 0x0, 0xf2, 0x6e, 0xb5, 0x7f, 0x1e, 0xe,
+ 0xf7, 0xaf, 0xe7, 0x3, 0xf7, 0x2d, 0xf8, 0x77,
+ 0x15, 0xf7, 0x37, 0xf2, 0xf7, 0xa, 0x24, 0xca,
+ 0xad, 0xfb, 0xe, 0x97, 0xa, 0x2f, 0x6, 0xfb,
+ 0x48, 0xfb, 0x1f, 0x5, 0xe, 0x7c, 0xf7, 0x41,
+ 0xe9, 0xf7, 0x41, 0x1, 0xf7, 0x6f, 0xf7, 0xd4,
+ 0x15, 0x6e, 0xa3, 0x64, 0xd0, 0xcf, 0xc3, 0xbc,
+ 0xc8, 0xac, 0x6c, 0xa9, 0x51, 0x48, 0x4e, 0x56,
+ 0x57, 0x1e, 0x53, 0xfb, 0x9e, 0x15, 0x6e, 0xa4,
+ 0x63, 0xd0, 0xc8, 0xbf, 0xb3, 0xb9, 0x96, 0x1e,
+ 0x8c, 0x90, 0x8b, 0x91, 0x90, 0x1a, 0xaf, 0x70,
+ 0xae, 0x4c, 0x4a, 0x4b, 0x58, 0x56, 0x1e, 0xe,
+ 0xfb, 0x3, 0xf7, 0xb5, 0x1, 0xf7, 0x1a, 0xf7,
+ 0x13, 0xac, 0xf7, 0x3f, 0x3, 0xf7, 0x1a, 0xfb,
+ 0x3, 0x15, 0xf7, 0x13, 0x6, 0xf7, 0x60, 0xf7,
+ 0xb5, 0x5, 0xfb, 0x3f, 0x6, 0xe, 0x79, 0xb8,
+ 0xe9, 0xb9, 0xf7, 0x8c, 0xb9, 0xd5, 0xb8, 0x1,
+ 0x84, 0xb9, 0xf7, 0x2, 0xb9, 0xf8, 0x1, 0xba,
+ 0x3, 0x84, 0xf7, 0x6d, 0x15, 0xfb, 0x18, 0xf6,
+ 0x24, 0xf7, 0x21, 0xf7, 0x78, 0xf7, 0x1e, 0xf7,
+ 0x44, 0xf7, 0x48, 0xf7, 0x1d, 0x25, 0xf4, 0xfb,
+ 0x24, 0xfb, 0x4d, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+ 0x77, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x35, 0xf7,
+ 0x2f, 0xf7, 0x20, 0xf7, 0x30, 0xf7, 0x13, 0xde,
+ 0x30, 0xfb, 0xc, 0xfb, 0x32, 0xfb, 0x28, 0xfb,
+ 0x1f, 0xfb, 0x35, 0xfb, 0x11, 0x34, 0xe5, 0xf7,
+ 0x9, 0x1e, 0xf7, 0xfd, 0x77, 0x15, 0x72, 0x6f,
+ 0x62, 0x75, 0x63, 0x1b, 0x4e, 0x69, 0xb8, 0xc3,
+ 0x8a, 0x1f, 0xd6, 0xd4, 0xd3, 0xd2, 0xae, 0xaf,
+ 0x7a, 0x76, 0x9d, 0x1e, 0xae, 0xab, 0x5, 0xa9,
+ 0x72, 0x61, 0xa1, 0x5d, 0x1b, 0x2b, 0x22, 0x36,
+ 0xfb, 0x9, 0x42, 0xbb, 0x4a, 0xe4, 0xcc, 0xc7,
+ 0xaf, 0x9e, 0x9f, 0x1f, 0xe, 0xce, 0xe4, 0x35,
+ 0x76, 0xf7, 0xfd, 0xe3, 0x9e, 0x77, 0x12, 0xd7,
+ 0xe7, 0xf7, 0x9e, 0xe7, 0x13, 0x6c, 0x9c, 0xf5,
+ 0x15, 0xbe, 0x52, 0xd2, 0xc4, 0x5, 0x13, 0xac,
+ 0x6f, 0xac, 0xb7, 0x80, 0xb9, 0x1b, 0xb8, 0xba,
+ 0x9a, 0xa4, 0xaf, 0x1f, 0x13, 0x5c, 0xbe, 0x51,
+ 0xd2, 0xc6, 0x58, 0xc5, 0x5, 0xb2, 0xb2, 0xa5,
+ 0xc7, 0xc4, 0x1a, 0xa7, 0x86, 0xa7, 0x7f, 0xa3,
+ 0x1e, 0xd5, 0xc5, 0x5e, 0xc4, 0x40, 0x50, 0x5,
+ 0x13, 0xac, 0xa7, 0x6b, 0x5f, 0x97, 0x5e, 0x1b,
+ 0x5c, 0x5a, 0x7d, 0x73, 0x67, 0x1f, 0x13, 0x9c,
+ 0x5a, 0xc4, 0x43, 0x50, 0xbd, 0x51, 0x5, 0x67,
+ 0x63, 0x70, 0x51, 0x53, 0x1a, 0x6e, 0x8f, 0x70,
+ 0x98, 0x72, 0x1e, 0xd6, 0xec, 0x15, 0x13, 0xac,
+ 0xda, 0xdc, 0xd0, 0xd8, 0xcb, 0xb7, 0x5d, 0x50,
+ 0x3b, 0x3a, 0x46, 0x3d, 0x4b, 0x60, 0xb9, 0xc7,
+ 0x1e, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x7f,
+ 0xe9, 0xf7, 0x4, 0xe9, 0x12, 0x9d, 0xef, 0x13,
+ 0x78, 0xf8, 0xe, 0x88, 0x15, 0xf7, 0x46, 0x3f,
+ 0xa, 0x3c, 0x6, 0xf4, 0xf8, 0xab, 0x5, 0xfb,
+ 0x73, 0x87, 0xa, 0xf7, 0x11, 0x6, 0x70, 0xfb,
+ 0x1c, 0x5, 0xac, 0x6a, 0x53, 0x91, 0x53, 0x1b,
+ 0xfb, 0x32, 0xfb, 0x1d, 0xfb, 0x16, 0xfb, 0x24,
+ 0x1f, 0x13, 0xb8, 0x24, 0xde, 0x42, 0xf7, 0x13,
+ 0xc1, 0xc6, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0x78,
+ 0xfb, 0xa2, 0xf7, 0x20, 0x15, 0xe6, 0xe3, 0xce,
+ 0xea, 0xd9, 0xba, 0x68, 0x52, 0x1e, 0x13, 0xb8,
+ 0xfb, 0x18, 0xfb, 0x1e, 0x65, 0x5f, 0x44, 0x54,
+ 0xb1, 0xcd, 0x1e, 0xe, 0xf7, 0xcf, 0xed, 0xf7,
+ 0x3b, 0x77, 0x1, 0xf7, 0x3a, 0xee, 0x3, 0xf7,
+ 0x3a, 0x45, 0x15, 0xee, 0x6, 0xd6, 0xf8, 0x15,
+ 0x5, 0xf7, 0x26, 0x6, 0x9e, 0xed, 0x5, 0xfb,
+ 0x26, 0x6, 0xad, 0xf7, 0x3b, 0x7b, 0xa, 0x69,
+ 0xfb, 0x3b, 0x5, 0xfb, 0x26, 0x6, 0x78, 0x29,
+ 0x5, 0xf7, 0x25, 0x6, 0xe, 0xf7, 0x4, 0xee,
+ 0xf7, 0x9, 0xec, 0xf7, 0x2f, 0x77, 0x1, 0xf7,
+ 0x4b, 0xf0, 0x3, 0xcf, 0xf7, 0xe, 0x15, 0xf7,
+ 0x2e, 0x6, 0x64, 0xfb, 0x54, 0x5, 0xf0, 0x6,
+ 0xaf, 0xf7, 0x54, 0x70, 0xa, 0x9f, 0xee, 0x85,
+ 0xa, 0xa3, 0xf6, 0x70, 0xa, 0x9f, 0xec, 0x85,
+ 0xa, 0xa9, 0xf7, 0x2f, 0x66, 0xa, 0x68, 0xfb,
+ 0x2f, 0x5, 0xfb, 0x2a, 0x6, 0x77, 0x2a, 0x5,
+ 0xf7, 0x2a, 0x6, 0x77, 0x20, 0x5, 0xfb, 0x2e,
+ 0x6, 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6,
+ 0x1, 0xf1, 0xed, 0xf7, 0x5e, 0xeb, 0x3, 0xf1,
+ 0xf8, 0x15, 0x15, 0x39, 0xcf, 0x4f, 0xe8, 0xf7,
+ 0x21, 0xe9, 0xf4, 0xf7, 0xd, 0xe2, 0x4a, 0xc7,
+ 0x2d, 0xfb, 0xa, 0xfb, 0xb, 0x2d, 0xfb, 0x1d,
+ 0x1e, 0xed, 0xa1, 0x15, 0xcc, 0xc1, 0xc0, 0xcd,
+ 0xbf, 0xa9, 0x6a, 0x5e, 0x4e, 0x51, 0x57, 0x4d,
+ 0x5a, 0x6a, 0xab, 0xb4, 0x1e, 0xe, 0xf8, 0x79,
+ 0xf7, 0x20, 0x1, 0xf7, 0x12, 0xf7, 0xe, 0xd8,
+ 0xf7, 0xf, 0x3, 0xf7, 0xd9, 0xf8, 0x79, 0x15,
+ 0xf7, 0xf, 0x6, 0xa5, 0x97, 0xa, 0xfb, 0xe,
+ 0x6, 0xfb, 0x76, 0xfb, 0x20, 0x15, 0xf7, 0xe,
+ 0x6, 0xa6, 0x97, 0xa, 0xfb, 0xf, 0x6, 0xe,
+ 0x9b, 0xf7, 0x2b, 0xaf, 0xf7, 0x2, 0xaf, 0xf7,
+ 0x2b, 0x12, 0xf7, 0x57, 0xf7, 0x23, 0x4d, 0xf7,
+ 0x23, 0x14, 0xe0, 0x13, 0xe8, 0xf7, 0xa8, 0xf8,
+ 0x29, 0x4f, 0xa, 0xfb, 0x6d, 0xfb, 0x5e, 0x73,
+ 0xa, 0x13, 0xf0, 0xf7, 0x9, 0xfb, 0x85, 0x4f,
+ 0xa, 0xe, 0x22, 0x76, 0xf7, 0x8, 0xf7, 0x4a,
+ 0xf7, 0x75, 0xf7, 0x49, 0x20, 0xe9, 0x2d, 0xf7,
+ 0x57, 0x12, 0xf7, 0x4, 0xf5, 0xf7, 0x4e, 0xf0,
+ 0x13, 0xce, 0xa8, 0x81, 0x15, 0xf0, 0x6, 0x93,
+ 0xbe, 0x5, 0x7b, 0x9c, 0xa4, 0x85, 0xa0, 0x1b,
+ 0x6e, 0xfb, 0x25, 0x5, 0xf0, 0x6, 0xa9, 0xf7,
+ 0x24, 0x5, 0xd5, 0x8c, 0xf7, 0x14, 0xbb, 0xf7,
+ 0x1f, 0x1a, 0xda, 0x31, 0xa1, 0x31, 0xa5, 0x1e,
+ 0x68, 0x94, 0x43, 0x9f, 0xb1, 0x1a, 0xcf, 0xe0,
+ 0x8e, 0xb1, 0xb0, 0xa5, 0x82, 0x71, 0xb1, 0x1e,
+ 0x13, 0xe6, 0x83, 0x64, 0x5, 0xee, 0x6, 0xb1,
+ 0xf7, 0x49, 0x5, 0x27, 0x6, 0x83, 0x62, 0x80,
+ 0x9e, 0x79, 0x90, 0x79, 0x8e, 0x19, 0x13, 0xce,
+ 0xa1, 0xf1, 0x5, 0x24, 0x6, 0x13, 0xd6, 0x77,
+ 0x26, 0x5, 0x3c, 0x8a, 0xfb, 0x10, 0x54, 0xfb,
+ 0x11, 0x1a, 0x8a, 0x3c, 0xd7, 0x6c, 0xf3, 0x6d,
+ 0x8, 0xb1, 0x81, 0xd6, 0x82, 0x56, 0x1a, 0x56,
+ 0xfb, 0x6, 0x86, 0x6f, 0x65, 0x69, 0x93, 0xa2,
+ 0x6c, 0x1e, 0x93, 0xa6, 0x5, 0x26, 0x6, 0xe,
+ 0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x78, 0xf7,
+ 0x9, 0x3, 0xf7, 0x78, 0xf8, 0x79, 0x15, 0xf7,
+ 0x9, 0x6, 0xa6, 0x97, 0xa, 0xfb, 0x9, 0x6,
+ 0xe, 0x7f, 0xa, 0xcd, 0xf8, 0x55, 0x3, 0xcd,
+ 0x16, 0xf8, 0x55, 0x6, 0x9e, 0xe9, 0x3e, 0xa,
+ 0xd1, 0xf7, 0xed, 0x5, 0xfb, 0x80, 0x6f, 0xa,
+ 0xf7, 0x1e, 0x6, 0x58, 0xfb, 0x8f, 0x43, 0xa,
+ 0x7c, 0xea, 0xe0, 0xeb, 0xec, 0xeb, 0x1, 0xf8,
+ 0x65, 0xea, 0x3, 0xf7, 0x26, 0xf7, 0x48, 0x15,
+ 0xf8, 0x23, 0x6, 0x91, 0xa0, 0x94, 0xb5, 0xa8,
+ 0x1a, 0xf4, 0x34, 0xd8, 0xfb, 0xc, 0xfb, 0x1a,
+ 0xfb, 0x49, 0x35, 0xfb, 0x5c, 0x26, 0xdb, 0x39,
+ 0xf7, 0x30, 0xe7, 0xe7, 0xab, 0xb2, 0xda, 0x1e,
+ 0x6d, 0xda, 0x5, 0x66, 0x44, 0x49, 0x79, 0x3e,
+ 0x1b, 0xfb, 0x11, 0x74, 0xbd, 0xae, 0x8c, 0x1f,
+ 0xa7, 0xeb, 0x15, 0xd1, 0xaa, 0xd9, 0xa6, 0xc7,
+ 0x1b, 0xcb, 0xc4, 0x6c, 0x49, 0x8c, 0x1f, 0xe,
+ 0x5f, 0xa, 0xf7, 0x82, 0xf8, 0x76, 0x15, 0xf7,
+ 0xd9, 0xd9, 0x77, 0xf0, 0xfb, 0xcf, 0xfb, 0xc,
+ 0x5, 0x34, 0xfc, 0x13, 0x32, 0xa, 0x61, 0xa,
+ 0xf7, 0x73, 0x77, 0x76, 0xa, 0xf7, 0x5c, 0xf8,
+ 0x73, 0x15, 0xf7, 0x40, 0xf4, 0xf7, 0x11, 0x22,
+ 0xcc, 0xad, 0xfb, 0x14, 0xf7, 0x24, 0x66, 0xa,
+ 0xfb, 0x52, 0xfb, 0x23, 0x5, 0x85, 0xfb, 0xf8,
+ 0x35, 0xa, 0xfb, 0x49, 0x93, 0xa, 0xd2, 0x31,
+ 0xa, 0x61, 0xa, 0xce, 0xf7, 0x10, 0x76, 0xa,
+ 0xf8, 0x25, 0xf8, 0x89, 0x6d, 0xa, 0xa5, 0xf7,
+ 0x10, 0x83, 0xa, 0xfb, 0x66, 0xfb, 0x10, 0x5a,
+ 0xa, 0xa4, 0xf7, 0x10, 0x65, 0xa, 0x28, 0xfc,
+ 0x67, 0x32, 0xa, 0x5f, 0xa, 0xf7, 0x6e, 0xf8,
+ 0xc3, 0x15, 0xf7, 0xc3, 0x3e, 0xaf, 0xc5, 0xfb,
+ 0xa7, 0xf7, 0xd, 0x5, 0xfb, 0x21, 0xfc, 0x8b,
+ 0x35, 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x3c,
+ 0xf7, 0x2a, 0xea, 0xd9, 0xa0, 0xb5, 0xdd, 0x1f,
+ 0x81, 0xdc, 0x2f, 0xa, 0x7c, 0xe7, 0xf7, 0x49,
+ 0xea, 0xf7, 0x3e, 0xe8, 0x12, 0xc2, 0xf0, 0x6e,
+ 0xed, 0xf7, 0x45, 0xeb, 0x56, 0xee, 0x13, 0xf4,
+ 0xf7, 0x47, 0xf7, 0xc9, 0x15, 0x46, 0x62, 0x54,
+ 0x49, 0x3d, 0x1a, 0x2c, 0xf0, 0x5f, 0xe3, 0xf7,
+ 0x3d, 0xdf, 0xf7, 0x6, 0xe3, 0x8c, 0x1e, 0x8c,
+ 0xbe, 0x7b, 0xb3, 0x60, 0xab, 0x8, 0x13, 0xea,
+ 0xc9, 0xb0, 0xb5, 0xc7, 0xd4, 0x1a, 0xdb, 0x45,
+ 0xc3, 0x23, 0xfb, 0x1c, 0x20, 0x29, 0x25, 0x61,
+ 0x9c, 0x67, 0xae, 0x6e, 0x1e, 0xb9, 0xf7, 0x0,
+ 0x15, 0xc5, 0xc1, 0xbb, 0xd2, 0xd5, 0xa1, 0x67,
+ 0x6a, 0x8a, 0x1e, 0x4b, 0x47, 0x66, 0x51, 0x58,
+ 0x60, 0xa3, 0xb3, 0x1e, 0x13, 0xf4, 0x46, 0xfb,
+ 0x9b, 0x15, 0xc8, 0xd4, 0xb6, 0xcf, 0xd2, 0xaa,
+ 0x6c, 0x67, 0x8e, 0x1e, 0x46, 0x42, 0x5e, 0x4e,
+ 0x48, 0x5e, 0xaf, 0xb4, 0x1e, 0xe, 0x7c, 0xf7,
+ 0x17, 0x1, 0xa3, 0xf7, 0x21, 0xca, 0xf7, 0x21,
+ 0xcc, 0xf7, 0x21, 0x3, 0xa3, 0xaf, 0x15, 0x60,
+ 0xa, 0xa7, 0x7a, 0xa5, 0x63, 0x54, 0x6e, 0x5f,
+ 0x67, 0x1e, 0xf8, 0x2e, 0x50, 0xa, 0xfb, 0x62,
+ 0x50, 0xa, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x75,
+ 0xf9, 0x5, 0x3, 0x75, 0xf7, 0x5f, 0x15, 0xf9,
+ 0x5, 0x6, 0x9e, 0xef, 0x5, 0xfd, 0x5, 0x6,
+ 0xe, 0xf7, 0x5f, 0xef, 0x1, 0xc0, 0xf8, 0x6f,
+ 0x3, 0xc0, 0xf7, 0x5f, 0x15, 0xf8, 0x6f, 0x6,
+ 0x9e, 0xef, 0x5, 0xfc, 0x6f, 0x6, 0xe, 0xf7,
+ 0xa, 0xf2, 0xd5, 0xf2, 0x1, 0xb4, 0xf8, 0x64,
+ 0x3, 0xd6, 0xf7, 0xbb, 0x15, 0xf8, 0x65, 0x6,
+ 0x9e, 0xf2, 0x5, 0xfc, 0x64, 0x6, 0x55, 0xfb,
+ 0xac, 0x15, 0xf8, 0x64, 0x6, 0x9f, 0xf2, 0x5,
+ 0xfc, 0x65, 0x6, 0xe, 0x70, 0xe2, 0xf7, 0x95,
+ 0xe1, 0x91, 0xa, 0x9b, 0xf7, 0x0, 0xf7, 0xed,
+ 0xf7, 0x7, 0x3, 0xf7, 0x80, 0xf8, 0x42, 0x15,
+ 0xf7, 0x1d, 0xc1, 0xd0, 0x62, 0xa8, 0x4a, 0x8c,
+ 0x87, 0x19, 0x9d, 0x6d, 0x78, 0x96, 0x44, 0x1b,
+ 0xfb, 0x5c, 0xfb, 0x1c, 0xfb, 0x1, 0xfb, 0x2c,
+ 0x31, 0xd5, 0x3c, 0xf7, 0x35, 0xf7, 0x80, 0xec,
+ 0xf7, 0x2c, 0xf7, 0x41, 0xf7, 0x10, 0x39, 0xd4,
+ 0x63, 0xa5, 0x1f, 0xf7, 0xb, 0xbf, 0x74, 0xc0,
+ 0xfb, 0x2d, 0x46, 0x6c, 0x9d, 0x3f, 0xa7, 0x60,
+ 0x93, 0x19, 0x4f, 0x58, 0xb1, 0x84, 0xbc, 0x77,
+ 0xac, 0x7d, 0x19, 0x22, 0x5d, 0x5, 0x35, 0xfb,
+ 0xd0, 0x15, 0xf7, 0x0, 0xf7, 0x7, 0xbf, 0xe4,
+ 0xf2, 0xb1, 0x58, 0x55, 0x23, 0xfb, 0x7, 0x5b,
+ 0x39, 0x3e, 0x44, 0xa8, 0xcf, 0x1e, 0xe, 0x7c,
+ 0xf7, 0x2e, 0xf8, 0x45, 0x77, 0x1, 0xf7, 0x34,
+ 0xf7, 0x5d, 0x3, 0xf7, 0x80, 0xf7, 0x48, 0x15,
+ 0xee, 0x6, 0xf3, 0xf8, 0x1c, 0x5, 0xfb, 0x1e,
+ 0x6, 0xfb, 0x21, 0xfc, 0xa1, 0x15, 0x5f, 0xbf,
+ 0x79, 0xac, 0xc9, 0xc1, 0xb2, 0xc3, 0xab, 0x6b,
+ 0xa6, 0x56, 0x43, 0x5f, 0x5b, 0x5f, 0x1e, 0xe,
+ 0xfb, 0x11, 0x76, 0xf8, 0x4b, 0xf7, 0x30, 0x1,
+ 0xf7, 0x83, 0xf7, 0x5d, 0x3, 0xf7, 0x83, 0xf7,
+ 0xf9, 0x15, 0x69, 0xa9, 0x6d, 0xc0, 0xd4, 0xb8,
+ 0xb1, 0xc0, 0xbb, 0x57, 0x9c, 0x6a, 0x4e, 0x54,
+ 0x66, 0x54, 0x1e, 0x3c, 0xfc, 0x8b, 0x15, 0xf7,
+ 0x1f, 0x6, 0xcb, 0xf8, 0x22, 0x7b, 0xa, 0xe,
+ 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0xea, 0xe6, 0x1,
+ 0xf7, 0x87, 0xf3, 0x3, 0xb6, 0x16, 0xf8, 0x49,
+ 0x55, 0xa, 0xfb, 0x77, 0x6, 0xc0, 0xf7, 0x90,
+ 0x5, 0xf7, 0x78, 0x89, 0xa, 0xfb, 0x77, 0x6,
+ 0xd5, 0x9c, 0x93, 0xa0, 0xdb, 0x1b, 0xbc, 0xc0,
+ 0x82, 0x83, 0xb8, 0x1f, 0xb1, 0xe8, 0x3e, 0x95,
+ 0x52, 0x91, 0x5c, 0x8a, 0x19, 0x58, 0x8a, 0x65,
+ 0x83, 0x66, 0x78, 0x55, 0x6d, 0x7c, 0x5a, 0x80,
+ 0x58, 0x84, 0x6f, 0x18, 0x21, 0x6, 0x77, 0x2e,
+ 0x5, 0xf5, 0x6, 0x55, 0xfb, 0x90, 0x5, 0x21,
+ 0x6, 0xe, 0xf8, 0x75, 0xf8, 0x74, 0x15, 0xf5,
+ 0x6, 0xa8, 0xf7, 0x26, 0x5, 0x21, 0x6, 0xfb,
+ 0x68, 0xfd, 0x6, 0x15, 0xf7, 0xb4, 0x37, 0xa,
+ 0x29, 0x6, 0xcc, 0xf7, 0xd8, 0x5, 0xfb, 0x48,
+ 0x3c, 0xa, 0xe1, 0x6, 0x5e, 0xfb, 0x7e, 0x66,
+ 0xa, 0xfb, 0xe0, 0x31, 0x15, 0xf7, 0xb6, 0x37,
+ 0xa, 0x28, 0x6, 0xb9, 0xf7, 0x7e, 0x5, 0xee,
+ 0x37, 0xa, 0x28, 0x6, 0x99, 0xc9, 0x99, 0xc2,
+ 0xe1, 0x7c, 0xad, 0x88, 0x19, 0xab, 0xe5, 0xfb,
+ 0x2, 0x90, 0xfb, 0xe, 0x88, 0x6d, 0xfb, 0x1e,
+ 0x19, 0x7f, 0x56, 0x5, 0x29, 0x3c, 0xa, 0xed,
+ 0x6, 0x5e, 0xfb, 0x7e, 0x4e, 0xa, 0xe, 0x7c,
+ 0xe7, 0xf7, 0x7e, 0xe7, 0xf4, 0xe8, 0x1, 0xf8,
+ 0x37, 0xef, 0x3, 0xa7, 0xaf, 0x15, 0x7d, 0xad,
+ 0xe6, 0x66, 0xe3, 0x1b, 0xf7, 0x43, 0xf2, 0xf7,
+ 0xe, 0xf7, 0x17, 0xde, 0x55, 0xdd, 0xfb, 0x10,
+ 0x6a, 0x5c, 0x85, 0x77, 0x75, 0x1f, 0xa6, 0xf7,
+ 0x17, 0x5, 0xf7, 0xb3, 0x94, 0xa, 0xfc, 0x15,
+ 0x6, 0x4b, 0xfb, 0xd8, 0xcd, 0x71, 0x5, 0xc7,
+ 0xbb, 0xb4, 0x8b, 0xa6, 0x1b, 0xcb, 0xbd, 0x61,
+ 0x52, 0x3f, 0x4b, 0x50, 0x2d, 0x49, 0x4f, 0x9d,
+ 0xa1, 0x53, 0x1f, 0xe, 0x8b, 0xe8, 0xf7, 0x86,
+ 0xe9, 0xef, 0xe8, 0x8f, 0x77, 0x12, 0x13, 0xd0,
+ 0xf7, 0xbf, 0x16, 0xf7, 0xb8, 0x94, 0xa, 0x27,
+ 0x6, 0xf5, 0xf8, 0xa9, 0x5, 0xfb, 0x1b, 0x82,
+ 0xa, 0xb5, 0x6, 0x34, 0xfc, 0x4c, 0x7b, 0xa,
+ 0xfb, 0xe1, 0x2e, 0x15, 0xf7, 0xb9, 0x6, 0x9d,
+ 0xe8, 0x5, 0x27, 0x6, 0xbc, 0xf7, 0x86, 0x5,
+ 0xee, 0x6, 0x9d, 0xe9, 0x5, 0x27, 0x6, 0x9a,
+ 0xc2, 0x5, 0x13, 0xe0, 0x97, 0xc3, 0xe9, 0x7e,
+ 0xad, 0x8d, 0xaa, 0xe8, 0x18, 0xfb, 0x16, 0x8e,
+ 0xfb, 0x0, 0x8a, 0x6e, 0xfb, 0x22, 0x80, 0x56,
+ 0x18, 0x27, 0x44, 0xa, 0xef, 0x6, 0x5b, 0xfb,
+ 0x86, 0x7b, 0xa, 0xe, 0xfb, 0x17, 0xea, 0xf8,
+ 0x6, 0xea, 0xe8, 0xe9, 0x1, 0xf7, 0xc3, 0xee,
+ 0x3, 0x8d, 0x6d, 0x15, 0x3b, 0x2e, 0x5, 0x88,
+ 0xa7, 0xc0, 0x86, 0xbd, 0x1b, 0xdc, 0xe8, 0xa8,
+ 0xf1, 0xb3, 0x1f, 0xf7, 0x1b, 0xf7, 0xe2, 0x5,
+ 0xf7, 0x3, 0x6, 0xb1, 0xea, 0x65, 0xa, 0xd0,
+ 0xaa, 0xa3, 0xa3, 0xc2, 0x1b, 0xa4, 0xaa, 0x87,
+ 0x88, 0xa0, 0x1f, 0xc1, 0xe9, 0x5, 0x90, 0x5e,
+ 0x8b, 0x8d, 0x65, 0x1b, 0xfb, 0x10, 0x43, 0x5c,
+ 0x22, 0x5f, 0x1f, 0x7b, 0x68, 0x5, 0x20, 0x6,
+ 0x64, 0x2c, 0x5, 0xf7, 0x1, 0x6, 0xfb, 0x5,
+ 0xfb, 0xae, 0x5, 0x3e, 0x6d, 0x74, 0x80, 0x50,
+ 0x1b, 0x71, 0x70, 0x8f, 0x8d, 0x74, 0x1f, 0xe,
+ 0x8b, 0xe8, 0xd6, 0xe8, 0xf7, 0xf7, 0x77, 0x1,
+ 0xf7, 0xd0, 0xef, 0x3, 0xc9, 0xf7, 0x3c, 0x15,
+ 0xf7, 0xa4, 0x6, 0x79, 0x40, 0x5, 0xfb, 0x0,
+ 0x82, 0xa, 0xf7, 0xbd, 0x89, 0xa, 0x31, 0x6,
+ 0x9c, 0xd6, 0x5, 0xe0, 0x89, 0xa, 0x35, 0x6,
+ 0xd4, 0xf7, 0xf7, 0x5, 0xfb, 0x0, 0x6, 0xfb,
+ 0xe5, 0xfc, 0x4, 0x5, 0xf7, 0x6, 0x98, 0x15,
+ 0xf7, 0x62, 0xf7, 0x7d, 0x5b, 0xfb, 0x7d, 0x5,
+ 0xe, 0x61, 0xf9, 0x41, 0x3, 0x61, 0x83, 0x15,
+ 0xc8, 0x57, 0xf9, 0x4, 0xf9, 0x34, 0x4b, 0xbc,
+ 0x5, 0xe, 0xfb, 0x26, 0xe5, 0xea, 0xe3, 0xf7,
+ 0x6f, 0xe4, 0x45, 0xe4, 0x12, 0xb1, 0xed, 0x13,
+ 0xe8, 0xb8, 0x73, 0x15, 0x62, 0x31, 0x5, 0x79,
+ 0xdb, 0xd0, 0x7d, 0xd5, 0x1b, 0xf7, 0x50, 0xb4,
+ 0xe7, 0xf2, 0xa0, 0x1f, 0xc9, 0xf7, 0xbd, 0x5c,
+ 0xa, 0x9e, 0xe4, 0x5, 0xfb, 0x3d, 0x6, 0x83,
+ 0x6b, 0x5, 0x13, 0xd8, 0xa8, 0x6a, 0x5f, 0xa1,
+ 0x58, 0x1b, 0xfb, 0x2e, 0xfb, 0x1f, 0xfb, 0x0,
+ 0xfb, 0x1b, 0x27, 0xd6, 0x43, 0xf7, 0x14, 0xbe,
+ 0xc0, 0x8e, 0xa9, 0xb8, 0x1f, 0x2c, 0x77, 0x81,
+ 0x6a, 0xfb, 0x9, 0x1b, 0x41, 0x33, 0xa0, 0x96,
+ 0x67, 0x1f, 0xe6, 0xf7, 0x8e, 0x15, 0xdb, 0xe1,
+ 0xc6, 0xe1, 0xd4, 0xb9, 0x60, 0x4e, 0x8a, 0x1e,
+ 0x33, 0x41, 0x5d, 0x2c, 0x4a, 0x53, 0xb2, 0xc7,
+ 0x1e, 0xe, 0xfb, 0x26, 0xde, 0xe3, 0xdc, 0xf7,
+ 0x70, 0xdd, 0x1, 0x9d, 0xed, 0x3, 0xa4, 0x6a,
+ 0x15, 0x62, 0x38, 0x5, 0x7a, 0xdb, 0xd0, 0x7e,
+ 0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe0, 0xea, 0xa0,
+ 0x1f, 0xc9, 0xf7, 0xae, 0x5c, 0xa, 0x9e, 0xdd,
+ 0x5, 0xfb, 0x3d, 0x6, 0x83, 0x66, 0x5, 0xa6,
+ 0x6a, 0x5f, 0x9f, 0x58, 0x1b, 0xfb, 0x2e, 0xfb,
+ 0x1f, 0x27, 0xfb, 0x10, 0x2e, 0xd6, 0x49, 0xf7,
+ 0x14, 0xbe, 0xc0, 0x8e, 0xa6, 0xb8, 0x1f, 0x34,
+ 0x77, 0x81, 0x6c, 0xfb, 0x9, 0x1b, 0x41, 0x33,
+ 0x9e, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x7a, 0x15,
+ 0xd5, 0xe1, 0xc2, 0xe1, 0xd4, 0xb9, 0x63, 0x53,
+ 0x8a, 0x1e, 0x39, 0x41, 0x61, 0x2c, 0x4a, 0x53,
+ 0xaf, 0xc2, 0x1e, 0xf7, 0x65, 0xf7, 0xb5, 0x15,
+ 0xee, 0x6, 0xf7, 0x54, 0xf7, 0x24, 0x57, 0xaf,
+ 0xfb, 0x46, 0x5e, 0xa, 0x7c, 0xe9, 0x39, 0xe9,
+ 0xf7, 0x90, 0xe9, 0xf5, 0xde, 0x12, 0xf7, 0xb1,
+ 0xed, 0xf7, 0xe, 0xed, 0x13, 0x7c, 0x88, 0x88,
+ 0x15, 0xf7, 0x45, 0x6, 0xe6, 0xf8, 0x56, 0x5,
+ 0xdf, 0x9b, 0xad, 0x97, 0xdd, 0x1b, 0xbe, 0xb7,
+ 0x82, 0x6a, 0x6b, 0x40, 0x77, 0x74, 0x86, 0x1f,
+ 0x4d, 0x7d, 0x5c, 0x56, 0x46, 0x1a, 0x4f, 0xc9,
+ 0x74, 0xcb, 0x73, 0x1e, 0xaa, 0x80, 0xca, 0x81,
+ 0x6f, 0x1a, 0x13, 0xbc, 0x69, 0x4d, 0x64, 0x4d,
+ 0x66, 0x62, 0x9d, 0x97, 0x70, 0x1e, 0x46, 0x46,
+ 0x5, 0x67, 0xc2, 0xb0, 0x78, 0xc2, 0x1b, 0xf7,
+ 0x1f, 0xf7, 0x2, 0xda, 0xf6, 0xca, 0x46, 0xa4,
+ 0x4c, 0xa0, 0x1f, 0x71, 0x93, 0x4d, 0x99, 0xad,
+ 0x1a, 0xa3, 0xbc, 0x9e, 0xa7, 0x94, 0x1e, 0xcd,
+ 0xa0, 0xc9, 0xa1, 0xd3, 0x1a, 0xd6, 0x77, 0xbb,
+ 0xfb, 0x3f, 0xfb, 0x2f, 0x5c, 0x55, 0xfb, 0x5,
+ 0x74, 0x1e, 0x86, 0x75, 0x5, 0x3b, 0x6f, 0xa,
+ 0xdd, 0x6, 0x13, 0x7c, 0x59, 0xfb, 0x90, 0x5,
+ 0x38, 0x6, 0xe, 0xf7, 0x4c, 0xf7, 0x7b, 0x3,
+ 0xf7, 0x4c, 0xf8, 0xcf, 0x15, 0xf7, 0x63, 0x4c,
+ 0xa3, 0xbc, 0xfb, 0x50, 0xf3, 0x5, 0xe, 0xaf,
+ 0x76, 0xf8, 0x7a, 0x77, 0x1, 0xc1, 0x9a, 0x15,
+ 0xf8, 0x6b, 0xf7, 0x4b, 0xa0, 0xf7, 0xa, 0xfc,
+ 0x25, 0xf7, 0x4d, 0x7a, 0x2d, 0xf7, 0xd1, 0xfb,
+ 0x2a, 0xfc, 0xa, 0xfb, 0x28, 0x5, 0xe, 0xd1,
+ 0xc5, 0xf7, 0x96, 0xc7, 0x1, 0xc5, 0xf7, 0x5,
+ 0xf7, 0x2, 0xf7, 0x5, 0x3, 0xc5, 0xf7, 0x9b,
+ 0x51, 0xa, 0x9c, 0xfb, 0x4b, 0x51, 0xa, 0xe,
+ 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0xf7, 0x86,
+ 0xf7, 0xa, 0xd0, 0xf7, 0x5, 0x3, 0xc5, 0xf7,
+ 0x19, 0x15, 0xaf, 0x4c, 0xf7, 0x9e, 0xf7, 0x4e,
+ 0xfb, 0x5e, 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x20,
+ 0xfb, 0x13, 0x5, 0x9a, 0xfb, 0x10, 0x15, 0xae,
+ 0x4c, 0xf7, 0x8e, 0xf7, 0x4e, 0xfb, 0x4c, 0xf7,
+ 0x52, 0x53, 0x4d, 0xf7, 0x13, 0xfb, 0x13, 0x5,
+ 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+ 0xbd, 0x3, 0xf7, 0x12, 0xf7, 0x97, 0x15, 0xf7,
+ 0x7f, 0xfb, 0x51, 0xc9, 0xbf, 0xfb, 0x3f, 0xf7,
+ 0x1c, 0xf7, 0x72, 0xf7, 0x11, 0x65, 0xca, 0x5,
+ 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+ 0x18, 0x15, 0xb2, 0x4d, 0xf7, 0xc9, 0xf7, 0x51,
+ 0xfb, 0x7a, 0xf7, 0x4f, 0x4b, 0x56, 0xf7, 0x3d,
+ 0xfb, 0x12, 0x5, 0xe, 0x81, 0xa, 0xf1, 0xec,
+ 0x3, 0x8d, 0x16, 0xf7, 0x94, 0x55, 0xa, 0x3c,
+ 0x6, 0xb2, 0xf7, 0x57, 0x5, 0xbc, 0xdc, 0xc4,
+ 0x94, 0xa7, 0x1b, 0xb1, 0x9f, 0x7b, 0x76, 0x82,
+ 0x89, 0x81, 0x89, 0x81, 0x1f, 0x66, 0xfb, 0x4f,
+ 0x5, 0x3b, 0x6f, 0xa, 0xf7, 0x96, 0x3f, 0xa,
+ 0x3a, 0x6, 0xaf, 0xf7, 0x48, 0x5, 0x8f, 0x9c,
+ 0x8f, 0x9d, 0x9d, 0x1a, 0xc5, 0x77, 0xc2, 0xfb,
+ 0x8, 0x4f, 0x57, 0x76, 0x71, 0x55, 0x1e, 0xbb,
+ 0xf7, 0x7d, 0x5, 0xfb, 0x46, 0x44, 0xa, 0xdd,
+ 0x6, 0x31, 0xfc, 0x4a, 0x5, 0x3a, 0x6, 0xe,
+ 0xf8, 0x7c, 0xf7, 0x41, 0x1, 0xba, 0xc2, 0xf7,
+ 0x34, 0xc2, 0x3, 0xf7, 0x9a, 0xf8, 0x8f, 0x15,
+ 0xc2, 0x78, 0xf7, 0x80, 0xf7, 0x23, 0x31, 0xa9,
+ 0x5, 0xfc, 0x34, 0xfb, 0x2e, 0x15, 0xc2, 0x78,
+ 0xf7, 0x82, 0xf7, 0x23, 0x31, 0xa9, 0x5, 0xe,
+ 0xf7, 0x5f, 0xf7, 0x2, 0x1, 0xe3, 0xf8, 0x25,
+ 0x3, 0xe3, 0xf7, 0x5f, 0x15, 0xf8, 0x25, 0x6,
+ 0xa2, 0xf7, 0x2, 0x5, 0xfc, 0x25, 0x6, 0xe,
+ 0x8b, 0xea, 0xf7, 0x93, 0xea, 0xc9, 0xf7, 0x2b,
+ 0x1, 0xf7, 0xf3, 0xf7, 0x4, 0x3, 0xf7, 0xd4,
+ 0x69, 0xa, 0xfb, 0xbb, 0xfd, 0x26, 0x15, 0xf8,
+ 0x54, 0x6, 0x9f, 0xea, 0x8f, 0xa, 0x6, 0xd1,
+ 0xf7, 0xf2, 0x5, 0xfb, 0x7f, 0x6, 0x77, 0x2c,
+ 0x5, 0xf7, 0x1d, 0x6, 0x59, 0xfb, 0x93, 0x5,
+ 0xfb, 0x44, 0x6, 0xe, 0x78, 0xa, 0x91, 0xa,
+ 0xf7, 0x7e, 0xf8, 0x77, 0x15, 0xf7, 0xdf, 0xd8,
+ 0x78, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, 0xfb,
+ 0x48, 0xfc, 0xb1, 0x2e, 0xa, 0x78, 0xa, 0xf7,
+ 0x6f, 0x77, 0x1, 0xf7, 0x5f, 0xf8, 0x74, 0x15,
+ 0xf7, 0x37, 0xf3, 0xf7, 0x9, 0x23, 0xc8, 0xae,
+ 0xfb, 0xc, 0xf7, 0x22, 0x5, 0x30, 0x6, 0xfb,
+ 0x48, 0xfb, 0x21, 0x5, 0xfb, 0x1, 0xfc, 0x98,
+ 0x2e, 0xa, 0x78, 0xa, 0xc9, 0xf7, 0x11, 0x1,
+ 0xf8, 0x27, 0xf8, 0x89, 0x15, 0xf7, 0x1, 0x89,
+ 0xa4, 0xf7, 0x12, 0x86, 0xa, 0xfb, 0x5e, 0xfb,
+ 0x10, 0x15, 0xf7, 0x0, 0x6, 0xa4, 0xf7, 0x10,
+ 0x5, 0xfb, 0x1, 0x6, 0xfb, 0x61, 0xfd, 0x5,
+ 0x2e, 0xa, 0x78, 0xa, 0x91, 0xa, 0xf7, 0x73,
+ 0xf8, 0xc4, 0x15, 0xf7, 0xaa, 0x3e, 0xac, 0xc5,
+ 0xfb, 0x90, 0xf7, 0xc, 0x5, 0xfb, 0x82, 0xfd,
+ 0x29, 0x2e, 0xa, 0xfb, 0x26, 0xea, 0xf8, 0x35,
+ 0xe6, 0xbd, 0xf7, 0x2b, 0xfb, 0x25, 0xf7, 0x25,
+ 0x12, 0x13, 0xe0, 0xf7, 0x20, 0x69, 0xa, 0xfb,
+ 0x61, 0xfd, 0x59, 0x15, 0x77, 0x2c, 0x5, 0xf7,
+ 0x82, 0x6, 0x9f, 0xea, 0x5, 0x41, 0x6, 0xf7,
+ 0x2, 0xf8, 0x84, 0x5, 0xfb, 0x39, 0x6, 0x77,
+ 0x2c, 0x5, 0xce, 0x6, 0x31, 0xfc, 0x25, 0x5,
+ 0x13, 0xd0, 0xf8, 0x69, 0xf8, 0xc8, 0x15, 0xf7,
+ 0xc, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xd,
+ 0x6, 0xfb, 0xa1, 0xfd, 0x4a, 0x15, 0x5e, 0x30,
+ 0x5, 0x86, 0x9a, 0xa4, 0x7d, 0xc5, 0x1b, 0xf7,
+ 0x4b, 0x9e, 0x8b, 0xa, 0xfb, 0x67, 0x6e, 0xa,
+ 0xf4, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+ 0x6c, 0x66, 0x61, 0x1b, 0x57, 0x7f, 0x9a, 0x8f,
+ 0x81, 0x1f, 0xe, 0xfb, 0x26, 0xe6, 0xf8, 0x39,
+ 0xe6, 0xc3, 0xf7, 0x25, 0x1, 0xf7, 0xc5, 0xf4,
+ 0x3, 0xf8, 0xf, 0xf8, 0x95, 0x15, 0xf7, 0xb,
+ 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xc, 0x6,
+ 0xfc, 0xe, 0xfd, 0x4a, 0x15, 0x5e, 0x30, 0x5,
+ 0x82, 0xc1, 0xc2, 0x81, 0xc5, 0x1b, 0xf7, 0x66,
+ 0xab, 0x8b, 0xa, 0xfc, 0x7, 0x6e, 0xa, 0xf7,
+ 0x9d, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+ 0x6a, 0x66, 0x3b, 0x1b, 0x57, 0x5d, 0x93, 0x96,
+ 0x5e, 0x1f, 0xe, 0x8b, 0xe9, 0x1, 0xe9, 0xd9,
+ 0xf7, 0x15, 0xf7, 0x91, 0x3, 0x87, 0x16, 0xf7,
+ 0x44, 0x6, 0xae, 0xf7, 0x3d, 0xb2, 0xa3, 0xb1,
+ 0x72, 0xae, 0x68, 0xa7, 0x64, 0x19, 0x6f, 0x87,
+ 0xa, 0xf7, 0x91, 0x6, 0x9d, 0xe9, 0x5, 0x21,
+ 0x6, 0x6a, 0xbd, 0x44, 0xcc, 0x68, 0xac, 0xf7,
+ 0x2a, 0xf2, 0x18, 0xf7, 0x0, 0x55, 0xa, 0xfb,
+ 0xa3, 0x6f, 0xa, 0x9f, 0x6, 0x20, 0x43, 0xd3,
+ 0xf7, 0xf5, 0x5, 0xfb, 0x44, 0x6f, 0xa, 0xdb,
+ 0x6, 0x32, 0xfc, 0x4a, 0x5, 0x3c, 0x6, 0xe,
+ 0x81, 0xa, 0xf7, 0x98, 0xee, 0x3, 0xcd, 0x16,
+ 0xf8, 0x54, 0x6, 0x9f, 0xe9, 0x3e, 0xa, 0xf7,
+ 0x1, 0xf8, 0xa8, 0x5, 0xfb, 0x94, 0x87, 0xa,
+ 0xf7, 0x30, 0x6, 0x31, 0xfc, 0x4a, 0x8f, 0xa,
+ 0x6, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+ 0xc1, 0xf7, 0x5c, 0x15, 0xf8, 0x25, 0xfb, 0x4d,
+ 0x9c, 0xe9, 0xfb, 0xd1, 0xf7, 0x2a, 0xf8, 0x9,
+ 0xf7, 0x28, 0x9c, 0xe9, 0xfc, 0x6a, 0xfb, 0x4b,
+ 0x5, 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0x46,
+ 0xde, 0xce, 0xde, 0xf7, 0xb, 0xe8, 0x12, 0xf7,
+ 0x3f, 0xea, 0x13, 0xbc, 0x52, 0xa, 0x13, 0x7c,
+ 0x3d, 0xa, 0x7c, 0x7f, 0x88, 0x83, 0x7f, 0x1f,
+ 0x9c, 0x9a, 0xa8, 0xbe, 0x89, 0x8e, 0x8, 0xf7,
+ 0x47, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3e, 0x6,
+ 0x89, 0x92, 0x91, 0xa8, 0x8a, 0xaa, 0x8, 0xf7,
+ 0x27, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3a, 0x92,
+ 0x6, 0xcb, 0xab, 0x47, 0xa, 0x3f, 0x3e, 0xfb,
+ 0x10, 0x1f, 0x80, 0x3b, 0x7, 0x78, 0x38, 0x5,
+ 0xeb, 0x6, 0x6c, 0x83, 0x6e, 0x8c, 0x84, 0x1e,
+ 0x27, 0x6, 0x78, 0x38, 0x5, 0xe8, 0x6, 0x8c,
+ 0x6f, 0x67, 0x56, 0x43, 0x5a, 0x8, 0xe, 0xf7,
+ 0xc0, 0xf7, 0x5, 0x1, 0xf8, 0x18, 0xee, 0x3,
+ 0xc6, 0xf7, 0xc0, 0x15, 0xf7, 0xff, 0x6, 0x69,
+ 0xfb, 0x59, 0x5, 0xee, 0x6, 0xc1, 0xf7, 0xca,
+ 0x5, 0xfc, 0x63, 0x6, 0xe, 0x81, 0xa, 0xf7,
+ 0x91, 0xf4, 0x3, 0xbc, 0x16, 0xf8, 0x6d, 0x55,
+ 0xa, 0xfb, 0x4c, 0x6, 0xbb, 0xf7, 0x73, 0xf7,
+ 0x16, 0xaa, 0x99, 0xcd, 0xfb, 0x15, 0x6b, 0xc0,
+ 0xf7, 0x88, 0x5, 0xfb, 0xae, 0x6, 0x76, 0x2d,
+ 0x5, 0xf7, 0x46, 0x6, 0x64, 0xfb, 0x45, 0xfb,
+ 0x18, 0x6a, 0x7e, 0x4a, 0xf7, 0x17, 0xab, 0x60,
+ 0xfb, 0x57, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0x8b,
+ 0xea, 0xf7, 0x90, 0xea, 0x1, 0xd4, 0xdd, 0xf5,
+ 0xee, 0x3, 0x76, 0x16, 0xf7, 0x8a, 0x6, 0x9c,
+ 0xea, 0x5, 0x34, 0x6, 0xb6, 0xf7, 0x7b, 0x5,
+ 0x9c, 0xa0, 0xb0, 0x9b, 0xa1, 0x1b, 0xaa, 0x96,
+ 0x77, 0x78, 0x86, 0x8b, 0x87, 0x8a, 0x87, 0x1f,
+ 0x51, 0xfb, 0xc7, 0x5, 0xf7, 0x35, 0x6, 0x9b,
+ 0xea, 0x5, 0x3d, 0x6, 0xb6, 0xf7, 0x73, 0x5,
+ 0xab, 0xa7, 0xae, 0x94, 0x9b, 0x1b, 0xad, 0x97,
+ 0x6f, 0x81, 0x89, 0x1f, 0x4f, 0xfb, 0xd5, 0x5,
+ 0xf7, 0x1f, 0x6, 0x9b, 0xea, 0x5, 0x53, 0x6,
+ 0xb7, 0xf7, 0x72, 0x5, 0x8d, 0x95, 0x8c, 0x96,
+ 0x94, 0x1a, 0xc9, 0x65, 0xb8, 0x46, 0x62, 0x5f,
+ 0x79, 0x6c, 0x6a, 0x1e, 0xb5, 0x7b, 0x66, 0x92,
+ 0x75, 0x1b, 0x6c, 0x6c, 0x7f, 0x73, 0x73, 0x1f,
+ 0x8e, 0xa3, 0x5, 0xfb, 0x3b, 0x6, 0x79, 0x2c,
+ 0x5c, 0xa, 0x5a, 0xfb, 0x90, 0x5, 0x3d, 0x6,
+ 0xe, 0xf8, 0x8d, 0xdb, 0x1, 0xda, 0xf8, 0x3b,
+ 0x3, 0xda, 0xf8, 0x8d, 0x15, 0xf8, 0x3b, 0x6,
+ 0x9d, 0xdb, 0x5, 0xfc, 0x3b, 0x6, 0xe, 0xf7,
+ 0x5f, 0xf7, 0x2, 0x1, 0xc6, 0xf8, 0x63, 0x3,
+ 0xc6, 0xf7, 0x5f, 0x73, 0xa, 0xe, 0xfb, 0xd,
+ 0x76, 0xf7, 0x2a, 0xe0, 0x42, 0xe4, 0xf7, 0x85,
+ 0xe4, 0x12, 0x13, 0xd0, 0xa8, 0xfb, 0x22, 0x15,
+ 0xeb, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0x7d, 0x98,
+ 0x9d, 0x7b, 0xb2, 0x1b, 0xcc, 0xb8, 0xab, 0xab,
+ 0xb7, 0x1f, 0x13, 0xb0, 0x7f, 0x57, 0x5, 0xf7,
+ 0x44, 0x6, 0x9e, 0xe4, 0x5, 0x3b, 0x6, 0xcf,
+ 0xf7, 0xde, 0x8d, 0xa, 0x63, 0xfb, 0x57, 0x5,
+ 0x13, 0xd0, 0x68, 0x5c, 0x62, 0x70, 0x50, 0x1b,
+ 0x5f, 0x74, 0xa1, 0xad, 0x92, 0x8b, 0x94, 0x8d,
+ 0x93, 0x1f, 0xc1, 0xf7, 0x9e, 0x8d, 0xa, 0xe,
+ 0xbc, 0xf8, 0x4e, 0x3, 0xbc, 0xef, 0x15, 0xbc,
+ 0x4e, 0xf7, 0x52, 0xf7, 0x35, 0xf7, 0x15, 0xfb,
+ 0x35, 0xd5, 0xc8, 0xfb, 0x15, 0xf7, 0x33, 0xf7,
+ 0x50, 0xf7, 0x30, 0x5b, 0xc7, 0xfb, 0x53, 0xfb,
+ 0x31, 0xfb, 0x13, 0xf7, 0x34, 0x41, 0x4f, 0xf7,
+ 0x16, 0xfb, 0x33, 0x5, 0xe, 0x8b, 0xe9, 0xf7,
+ 0x90, 0xea, 0x3b, 0xe8, 0x12, 0x13, 0xa0, 0x8d,
+ 0x16, 0xf7, 0x96, 0x3f, 0xa, 0x39, 0x6, 0xb4,
+ 0xf7, 0x5d, 0x5, 0xb6, 0xc6, 0xd3, 0xa2, 0xaa,
+ 0x1b, 0xbd, 0x9a, 0x7a, 0x72, 0x82, 0x89, 0x81,
+ 0x89, 0x80, 0x1f, 0x64, 0xfb, 0x57, 0x5, 0x3c,
+ 0x44, 0xa, 0xf7, 0x93, 0x3f, 0xa, 0x3b, 0x6,
+ 0xb7, 0xf7, 0x6d, 0x5, 0x13, 0xc0, 0x8e, 0x98,
+ 0x8d, 0x96, 0x96, 0x1a, 0x13, 0xa0, 0xd0, 0x4d,
+ 0xb2, 0x3e, 0x52, 0x4b, 0x6f, 0x6f, 0x5a, 0x1e,
+ 0x13, 0xc0, 0x93, 0xb6, 0x5, 0xfb, 0x46, 0x6,
+ 0x78, 0x2c, 0x5, 0xde, 0x6, 0x58, 0xfb, 0x90,
+ 0x5, 0x3b, 0x6, 0xe, 0x7c, 0xe4, 0xf7, 0x1b,
+ 0xe8, 0xf7, 0x70, 0xe9, 0x1, 0xf7, 0x1d, 0xf1,
+ 0xf7, 0x77, 0xe7, 0x3, 0xb5, 0x82, 0x15, 0x87,
+ 0xaa, 0xb5, 0x89, 0xbd, 0x1b, 0xf7, 0x5a, 0xf7,
+ 0x57, 0xf7, 0x28, 0xf7, 0xb0, 0xf2, 0x62, 0xeb,
+ 0xfb, 0x1a, 0xfb, 0x15, 0xfb, 0x9, 0xfb, 0x5,
+ 0xfb, 0xa, 0x1f, 0x2e, 0x89, 0xce, 0x38, 0xf1,
+ 0x1b, 0xb6, 0xb5, 0x9d, 0x9b, 0xa8, 0x1f, 0xfb,
+ 0xc, 0x6a, 0xfb, 0x1e, 0x5a, 0xfb, 0x48, 0x1b,
+ 0xf8, 0x23, 0xf7, 0xc6, 0x15, 0x86, 0x53, 0x42,
+ 0x37, 0x56, 0x69, 0xb1, 0xc4, 0xdf, 0xdb, 0xb4,
+ 0xbe, 0xe3, 0x97, 0x3d, 0x4b, 0x87, 0x1e, 0xe,
+ 0x8b, 0xe7, 0xf7, 0x89, 0xe7, 0xf7, 0xc, 0xe0,
+ 0x1, 0xf7, 0x38, 0xf8, 0x95, 0x15, 0xda, 0x71,
+ 0x5, 0xa4, 0x9a, 0x9c, 0xb0, 0xaf, 0x1b, 0xa1,
+ 0xa1, 0x7a, 0x7b, 0xa3, 0x1f, 0x7d, 0xa1, 0xa1,
+ 0x7e, 0xa4, 0x1b, 0xed, 0xbc, 0xe3, 0xaf, 0x9c,
+ 0x1f, 0x3d, 0xa2, 0x5, 0x62, 0x71, 0x7e, 0x75,
+ 0x6e, 0x1b, 0x78, 0x77, 0x98, 0x98, 0x77, 0x1f,
+ 0x9c, 0x72, 0x72, 0x9d, 0x6f, 0x1b, 0x2d, 0x5d,
+ 0x3d, 0x60, 0x72, 0x1f, 0xfb, 0x44, 0xfc, 0x95,
+ 0x15, 0xf7, 0x8c, 0x6, 0x9c, 0xe7, 0x5, 0x3d,
+ 0x6, 0xb1, 0xf7, 0x56, 0x5, 0xb6, 0xc4, 0xd1,
+ 0xa1, 0xa7, 0x1b, 0xba, 0x9b, 0x7c, 0x75, 0x81,
+ 0x8a, 0x80, 0x89, 0x7f, 0x1f, 0x66, 0xfb, 0x51,
+ 0x5, 0x3f, 0x6, 0x78, 0x2f, 0x5, 0xf7, 0x88,
+ 0x6, 0x9d, 0xe7, 0x5, 0x40, 0x6, 0xb4, 0xf7,
+ 0x66, 0x5, 0x8e, 0x98, 0x8c, 0x97, 0x97, 0x1a,
+ 0xcd, 0x50, 0xb0, 0x42, 0x55, 0x4b, 0x6f, 0x70,
+ 0x5e, 0x1e, 0x94, 0xb5, 0x5, 0xfb, 0x40, 0x6,
+ 0x79, 0x2f, 0x8a, 0xa, 0x5a, 0xfb, 0x89, 0x5,
+ 0x3e, 0x6, 0xe, 0xf7, 0x29, 0xe6, 0xf7, 0x6,
+ 0xe6, 0x12, 0xf7, 0x4, 0xe9, 0x84, 0xe5, 0x9f,
+ 0xe7, 0x81, 0xe9, 0x13, 0xe8, 0xce, 0x5e, 0x15,
+ 0xe2, 0x6, 0xbf, 0xf7, 0x56, 0x5, 0xf2, 0x6,
+ 0x56, 0x98, 0xa, 0xea, 0x6, 0xbd, 0xf7, 0x56,
+ 0x5, 0xf7, 0x5, 0x34, 0xa, 0x21, 0x6, 0xab,
+ 0xf7, 0x6, 0x5, 0xed, 0x34, 0xa, 0x13, 0xd4,
+ 0x30, 0x6, 0xc1, 0xf7, 0x62, 0x5, 0x30, 0x6,
+ 0x52, 0xfb, 0x62, 0x5, 0x25, 0x6, 0xc2, 0xf7,
+ 0x62, 0x5, 0x32, 0x6, 0x53, 0xfb, 0x62, 0x5,
+ 0xfb, 0x5, 0x36, 0xa, 0xf6, 0x6, 0x6b, 0xfb,
+ 0x6, 0x5, 0x28, 0x36, 0xa, 0x13, 0xe8, 0xe3,
+ 0x6, 0xf7, 0xb, 0xe6, 0x15, 0xab, 0xf7, 0x6,
+ 0x5, 0xf3, 0x6, 0x6b, 0xfb, 0x6, 0x5, 0xe,
+ 0x7c, 0xeb, 0xf7, 0xa9, 0xeb, 0x1, 0xa4, 0xf1,
+ 0xf7, 0xef, 0xf0, 0x3, 0xa4, 0xf7, 0x3c, 0x15,
+ 0xfb, 0x1b, 0xf7, 0x17, 0x5b, 0xf4, 0xf7, 0x31,
+ 0xf7, 0x31, 0xe5, 0xf7, 0x4d, 0xee, 0x4b, 0xea,
+ 0xfb, 0x35, 0xfb, 0x2e, 0xfb, 0x3f, 0x22, 0xfb,
+ 0x49, 0x1e, 0xf1, 0x9b, 0x15, 0xf3, 0xe8, 0xd1,
+ 0xf6, 0xf7, 0x3, 0xaf, 0x51, 0x54, 0xfb, 0x5,
+ 0xfb, 0x1, 0x58, 0x33, 0x54, 0x2c, 0x9e, 0xdf,
+ 0x1e, 0xe, 0x5d, 0xa, 0xf7, 0x88, 0xf8, 0x77,
+ 0x15, 0xf7, 0xdf, 0xd8, 0x77, 0xf0, 0xfb, 0xd6,
+ 0xfb, 0xc, 0x5, 0xfb, 0x65, 0xfc, 0x12, 0x29,
+ 0xa, 0x63, 0xa, 0xf7, 0x71, 0x77, 0x45, 0xa,
+ 0xf7, 0x2b, 0xf8, 0x95, 0x15, 0xc0, 0x67, 0xf7,
+ 0x45, 0xf7, 0x0, 0xf7, 0x13, 0xfb, 0x0, 0xce,
+ 0xae, 0xfb, 0x18, 0xf7, 0x25, 0x4e, 0xa, 0xfb,
+ 0xd5, 0xfc, 0x86, 0x30, 0xa, 0xfb, 0x3, 0xfb,
+ 0x3a, 0x2d, 0xa, 0x63, 0xa, 0xcc, 0xf7, 0x10,
+ 0x45, 0xa, 0xf8, 0x21, 0xf8, 0x89, 0x72, 0xa,
+ 0xfb, 0x68, 0xfb, 0x10, 0x72, 0xa, 0xfb, 0x69,
+ 0xfc, 0x66, 0x29, 0xa, 0x7c, 0xea, 0xe0, 0xea,
+ 0xed, 0xeb, 0x1, 0x76, 0xef, 0x3, 0xf7, 0xab,
+ 0xc1, 0x15, 0x69, 0xa3, 0xa1, 0x68, 0xe7, 0x1b,
+ 0xc3, 0xbc, 0x99, 0xa0, 0xc6, 0x1f, 0x7e, 0xe7,
+ 0x5, 0x74, 0x46, 0x62, 0x82, 0x73, 0x1b, 0x4a,
+ 0x77, 0xb0, 0xa6, 0x94, 0x8c, 0x92, 0x8e, 0x90,
+ 0x1f, 0xf7, 0x8a, 0x6, 0x97, 0xad, 0x95, 0xb9,
+ 0xb8, 0x1a, 0xde, 0x6c, 0xdc, 0x2c, 0x5c, 0x5a,
+ 0x78, 0x68, 0x63, 0x1e, 0xb1, 0x71, 0x5c, 0x9b,
+ 0x58, 0x1b, 0xfb, 0x32, 0x29, 0xfb, 0x32, 0xfb,
+ 0x32, 0x44, 0xa8, 0x39, 0xf7, 0xe, 0xd2, 0xc1,
+ 0xb8, 0xa3, 0xa3, 0x1f, 0xe1, 0xf7, 0x62, 0x15,
+ 0xb3, 0x97, 0xb6, 0xc5, 0xbf, 0x1b, 0xd0, 0x7d,
+ 0x3f, 0x75, 0x88, 0x1f, 0xfc, 0x51, 0xfb, 0xc,
+ 0x15, 0xc2, 0xb1, 0xf7, 0x37, 0xea, 0xbb, 0x96,
+ 0x66, 0x6b, 0x41, 0x60, 0xfb, 0x1b, 0x38, 0x60,
+ 0x74, 0xa1, 0xb1, 0x1e, 0xe, 0xfb, 0x5b, 0xd4,
+ 0x1, 0xf7, 0x59, 0xe2, 0x3, 0xf7, 0xc9, 0x8a,
+ 0x15, 0x78, 0x2e, 0x56, 0x40, 0x64, 0xa5, 0x6c,
+ 0xb7, 0xa9, 0xa9, 0x97, 0xa0, 0xa5, 0x1f, 0xa7,
+ 0xdd, 0x5, 0x7b, 0x80, 0x64, 0x71, 0x72, 0x1b,
+ 0x7e, 0x82, 0x91, 0x9e, 0xb1, 0xe7, 0xba, 0xa6,
+ 0x9a, 0x1f, 0xe, 0x5d, 0xa, 0xf7, 0x6d, 0xf8,
+ 0xc3, 0x15, 0xf7, 0xc9, 0x3e, 0xae, 0xc6, 0xfb,
+ 0xab, 0xf7, 0xc, 0x5, 0xfb, 0x96, 0xfc, 0x8a,
+ 0x29, 0xa, 0x8b, 0xe8, 0x1, 0xf7, 0x9c, 0xeb,
+ 0x3, 0xcd, 0x16, 0xf8, 0x55, 0x94, 0xa, 0xfb,
+ 0x42, 0x6, 0xf5, 0xf8, 0x9f, 0xfb, 0xa3, 0x56,
+ 0x78, 0x30, 0xf7, 0x3f, 0xad, 0x38, 0xfc, 0x31,
+ 0x5, 0xfb, 0x47, 0x6, 0xe, 0x5d, 0xce, 0x4f,
+ 0x76, 0xf7, 0xb7, 0xcf, 0x8a, 0xd0, 0xf7, 0xba,
+ 0x77, 0x12, 0xc4, 0xcf, 0xf7, 0x7d, 0xce, 0xeb,
+ 0xcf, 0x13, 0xaf, 0xf7, 0xc6, 0x5d, 0x15, 0xf7,
+ 0x82, 0x6, 0x98, 0xce, 0x5, 0xfb, 0x1a, 0x6,
+ 0xf1, 0xd8, 0x5, 0xac, 0xa0, 0xaa, 0xb4, 0xb9,
+ 0x1a, 0xaf, 0x7b, 0xc4, 0x3b, 0x5f, 0x5e, 0x75,
+ 0x68, 0x68, 0x1e, 0x80, 0x4c, 0x5, 0xce, 0x6,
+ 0xa4, 0x90, 0x91, 0xa6, 0xb6, 0x1b, 0x9f, 0xa1,
+ 0x81, 0x75, 0x79, 0x7e, 0x73, 0x79, 0x7e, 0x1f,
+ 0xfb, 0x41, 0xfb, 0x19, 0x5, 0xfb, 0xfe, 0x77,
+ 0x15, 0x13, 0x5f, 0xc5, 0x58, 0xf9, 0xd, 0xf9,
+ 0x35, 0x4d, 0xbb, 0x5, 0xfd, 0xa, 0xfb, 0xff,
+ 0x15, 0xf7, 0x83, 0x6, 0x99, 0xd0, 0x5, 0x39,
+ 0x6, 0xbf, 0xf7, 0xa9, 0xfb, 0x22, 0x6e, 0x7e,
+ 0x46, 0xd4, 0x9a, 0x65, 0x98, 0xa, 0x32, 0x6,
+ 0xe, 0x5c, 0xc4, 0x5a, 0x76, 0xf7, 0x6, 0xca,
+ 0xf7, 0x48, 0xd0, 0xf7, 0xbb, 0x77, 0x12, 0x13,
+ 0xb8, 0xf7, 0x96, 0xc1, 0x15, 0xf7, 0x19, 0x6,
+ 0x84, 0x5f, 0x5, 0x52, 0x6, 0x80, 0x52, 0x5,
+ 0xf7, 0x37, 0x6, 0x96, 0xc4, 0x5, 0x63, 0x6,
+ 0x93, 0xb7, 0x5, 0xb3, 0x6, 0x98, 0xca, 0x5,
+ 0x63, 0x6, 0xac, 0xf7, 0x46, 0x5, 0x4c, 0x6,
+ 0xfb, 0x41, 0x98, 0xa, 0xdd, 0x9b, 0x15, 0xd0,
+ 0xdc, 0x7c, 0x3a, 0x5, 0xfc, 0x52, 0xfb, 0x12,
+ 0x15, 0x13, 0x78, 0xc6, 0x58, 0xf9, 0x9, 0xf9,
+ 0x34, 0x4c, 0xbc, 0x5, 0xfd, 0x9, 0xfc, 0x0,
+ 0x15, 0xf7, 0x82, 0x6, 0x99, 0xd0, 0x5, 0x38,
+ 0x6, 0xbf, 0xf7, 0xa8, 0xfb, 0x1f, 0x6e, 0x7e,
+ 0x47, 0xd2, 0x9a, 0x66, 0x98, 0xa, 0x32, 0x6,
+ 0xe, 0xf7, 0x70, 0xd7, 0xf7, 0xd4, 0x77, 0x1,
+ 0xf7, 0xa4, 0xda, 0x3, 0xf7, 0x29, 0xf7, 0x70,
+ 0x15, 0xf7, 0xb0, 0x6, 0x9c, 0xd7, 0x7b, 0xa,
+ 0xc9, 0xf7, 0xd4, 0xfb, 0x3b, 0x6a, 0x7b, 0x3f,
+ 0xe0, 0x9c, 0x60, 0xfb, 0x78, 0x5, 0x21, 0x6,
+ 0xe, 0xf7, 0x58, 0xde, 0xed, 0xda, 0xb4, 0xde,
+ 0x1, 0xf7, 0x17, 0xd8, 0x3, 0xf7, 0xd6, 0xf7,
+ 0x60, 0x15, 0xf7, 0x17, 0x6, 0x9a, 0xdd, 0x5,
+ 0x53, 0x6, 0xa4, 0xf7, 0x22, 0x5, 0x8f, 0xa1,
+ 0x8d, 0xa5, 0xa1, 0x1a, 0xc9, 0x51, 0x9f, 0x53,
+ 0x55, 0x4e, 0x7b, 0x7d, 0x67, 0x1e, 0x9a, 0x3c,
+ 0x5, 0x99, 0xb2, 0xc3, 0x97, 0xb1, 0x1b, 0xaa,
+ 0x98, 0x77, 0x6c, 0x87, 0x1f, 0x92, 0x75, 0x74,
+ 0x8e, 0x73, 0x1b, 0xfb, 0x13, 0x64, 0x32, 0x4b,
+ 0x51, 0xb2, 0x5a, 0xcb, 0xab, 0xae, 0xa0, 0xa7,
+ 0xa7, 0x1f, 0xa2, 0xf7, 0x12, 0x15, 0x63, 0x76,
+ 0x60, 0x57, 0x63, 0x1b, 0x69, 0x85, 0xa0, 0x9e,
+ 0xb3, 0xbd, 0x9d, 0xb2, 0xa1, 0xac, 0x85, 0x8b,
+ 0x1f, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+ 0x1, 0xf7, 0x10, 0xd9, 0xf7, 0x58, 0xd9, 0x3,
+ 0xf7, 0x10, 0xf8, 0x3, 0x15, 0x35, 0xbf, 0x36,
+ 0xe6, 0xf7, 0x3, 0xed, 0xf7, 0xa, 0xf7, 0x14,
+ 0xdc, 0x5e, 0xe9, 0x2b, 0xfb, 0x16, 0x3a, 0xfb,
+ 0x26, 0x23, 0x1e, 0xd9, 0x99, 0x15, 0xc5, 0xb3,
+ 0xea, 0xd7, 0xc4, 0xa2, 0x4b, 0x61, 0x41, 0x54,
+ 0x40, 0x4c, 0x56, 0x72, 0xc4, 0xb8, 0x1e, 0xe,
+ 0x7d, 0xea, 0x37, 0x76, 0xf8, 0x18, 0xea, 0x8f,
+ 0x77, 0x12, 0xac, 0xf0, 0xf7, 0xe4, 0xec, 0x13,
+ 0x6c, 0x94, 0xa7, 0x15, 0xba, 0x57, 0xc6, 0xbb,
+ 0x5, 0x13, 0x9c, 0x70, 0xb7, 0xc1, 0x80, 0xbb,
+ 0x1b, 0xf7, 0x14, 0xf7, 0x46, 0xea, 0xf7, 0x4e,
+ 0x1f, 0x8c, 0xaf, 0x83, 0xae, 0x78, 0xaa, 0xbd,
+ 0xb4, 0x18, 0x5d, 0xc0, 0x56, 0x60, 0x5, 0x13,
+ 0xac, 0xa3, 0x68, 0x5c, 0x9a, 0x4d, 0x1b, 0xfb,
+ 0x29, 0xfb, 0x3a, 0x20, 0xfb, 0x48, 0x63, 0x96,
+ 0x6a, 0x9d, 0x70, 0x1f, 0xf7, 0x20, 0xa1, 0x15,
+ 0xf7, 0x93, 0xf7, 0x64, 0x5, 0x93, 0x7d, 0x90,
+ 0x7b, 0x7b, 0x1a, 0xfb, 0x5, 0xfb, 0x3, 0x4d,
+ 0x39, 0x76, 0x6e, 0x8e, 0x95, 0x72, 0x1e, 0x53,
+ 0xb8, 0x15, 0x7e, 0xa0, 0x8c, 0xa5, 0x9f, 0x1a,
+ 0xe9, 0xf0, 0xcb, 0xe7, 0xab, 0xa4, 0x86, 0x82,
+ 0x9f, 0x1e, 0xe, 0x63, 0xa, 0xf7, 0x1e, 0x77,
+ 0xdd, 0x77, 0x45, 0xa, 0xf7, 0x1b, 0xf8, 0x95,
+ 0x15, 0xd9, 0x71, 0x5, 0xa0, 0x9c, 0x99, 0xb4,
+ 0xad, 0x1b, 0x9e, 0x9f, 0x81, 0x7e, 0x9f, 0x1f,
+ 0x7a, 0xa5, 0xa6, 0x78, 0xa9, 0x1b, 0xee, 0xbc,
+ 0xe3, 0xad, 0x9c, 0x1f, 0x3d, 0xa3, 0x5, 0x62,
+ 0x70, 0x7e, 0x76, 0x6e, 0x1b, 0x76, 0x77, 0x98,
+ 0x99, 0x76, 0x1f, 0x9b, 0x73, 0x72, 0x9c, 0x70,
+ 0x1b, 0x2c, 0x5d, 0x3d, 0x60, 0x73, 0x1f, 0xfb,
+ 0x3, 0xfb, 0xf6, 0x29, 0xa, 0xfb, 0x22, 0xe3,
+ 0xea, 0x76, 0xf7, 0xe1, 0xe3, 0x40, 0xe3, 0x12,
+ 0xb7, 0xe9, 0xf7, 0xf6, 0xee, 0x13, 0xdc, 0x67,
+ 0x90, 0xa, 0x9e, 0xe3, 0x85, 0xa, 0xa2, 0xf7,
+ 0x3, 0x5, 0x7d, 0x9d, 0xbd, 0x74, 0xdb, 0x1b,
+ 0xf7, 0x39, 0xf7, 0xf, 0xf7, 0x7, 0xf7, 0x24,
+ 0xf7, 0x7, 0x3b, 0xc7, 0xfb, 0x1, 0x54, 0x44,
+ 0x72, 0x6c, 0x5b, 0x1f, 0x13, 0xec, 0x94, 0xb6,
+ 0x3e, 0xa, 0x79, 0x33, 0x8a, 0xa, 0x35, 0xfc,
+ 0x2b, 0x5, 0xf7, 0x29, 0xf7, 0x8f, 0x15, 0x13,
+ 0xdc, 0xf7, 0xe, 0xf7, 0x18, 0xae, 0xc0, 0xce,
+ 0xba, 0x6a, 0x56, 0x39, 0x2f, 0x3a, 0x3d, 0x63,
+ 0x32, 0x99, 0xd9, 0x1e, 0xe, 0xf8, 0xba, 0xa9,
+ 0x1, 0xf7, 0xb, 0xbf, 0xea, 0xc0, 0x3, 0xf7,
+ 0xb, 0x45, 0x15, 0xbf, 0x6, 0xf7, 0x7a, 0xf9,
+ 0x0, 0x5, 0xea, 0x6, 0xfb, 0x7a, 0xfd, 0x0,
+ 0x5, 0xc0, 0x6, 0xf7, 0x78, 0xf9, 0x0, 0x5,
+ 0xc8, 0x6, 0x96, 0xa9, 0x5, 0xfb, 0x97, 0x6,
+ 0xfb, 0x4e, 0xfb, 0x55, 0x59, 0xfb, 0x2a, 0x47,
+ 0xce, 0x49, 0xf7, 0x4a, 0x81, 0x1f, 0xe, 0x3a,
+ 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x1d, 0xf2,
+ 0x3, 0xf7, 0x5b, 0x25, 0x15, 0xec, 0x6, 0x6e,
+ 0xd1, 0x70, 0xec, 0xf6, 0x1a, 0xf7, 0x46, 0xf7,
+ 0xe, 0xf7, 0x23, 0xf0, 0xf7, 0xf, 0x1e, 0x2b,
+ 0x6, 0xfb, 0x1a, 0xfb, 0x23, 0x2b, 0xfb, 0x26,
+ 0xfb, 0x46, 0x1a, 0x48, 0x98, 0x32, 0xbc, 0x2c,
+ 0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xf7, 0xfc, 0xf2, 0x3, 0xf7, 0x1c, 0x25, 0x15,
+ 0xeb, 0x6, 0xf7, 0x1a, 0xf7, 0x23, 0xec, 0xf7,
+ 0x26, 0xf7, 0x46, 0x1a, 0xce, 0x7e, 0xe4, 0x5a,
+ 0xea, 0x1e, 0x2a, 0x6, 0xa8, 0x45, 0xa6, 0x2a,
+ 0x20, 0x1a, 0xfb, 0x46, 0xfb, 0xf, 0xfb, 0x23,
+ 0x26, 0xfb, 0xf, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+ 0x1c, 0xd1, 0xda, 0xd1, 0xf7, 0x1c, 0xd1, 0x1,
+ 0xc3, 0xdc, 0xd5, 0xdc, 0x9b, 0xdc, 0xd5, 0xdc,
+ 0x3, 0xc3, 0xf8, 0x5a, 0x39, 0xa, 0xd5, 0xfb,
+ 0xfd, 0x39, 0xa, 0xfb, 0x69, 0xce, 0x15, 0xf8,
+ 0x5e, 0xf7, 0x4a, 0x7a, 0xcb, 0xfc, 0x5f, 0xfb,
+ 0x4c, 0x5, 0xe, 0x7c, 0xf7, 0x4e, 0x1, 0xf7,
+ 0x52, 0xf7, 0x6f, 0x3, 0xf7, 0x52, 0xcb, 0x15,
+ 0x68, 0xa3, 0x5f, 0xd1, 0xc7, 0xcc, 0xb2, 0xcf,
+ 0xb3, 0x6d, 0xb2, 0x4d, 0x4b, 0x4c, 0x60, 0x4b,
+ 0x1e, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7,
+ 0x56, 0xf7, 0x68, 0x3, 0xf7, 0x56, 0xf7, 0x87,
+ 0x15, 0x6c, 0x9f, 0x5c, 0xd3, 0xc9, 0xc5, 0xbc,
+ 0xc5, 0xb3, 0x72, 0xb2, 0x4c, 0x49, 0x51, 0x55,
+ 0x55, 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1b, 0xd1,
+ 0xdb, 0xd1, 0xf7, 0x1c, 0xd1, 0x1, 0x3f, 0xd9,
+ 0xab, 0xd9, 0xc2, 0xd7, 0xad, 0xd7, 0xa0, 0xd9,
+ 0xf7, 0x39, 0xd7, 0x3, 0x3f, 0xf8, 0x57, 0x49,
+ 0xa, 0xc0, 0x3a, 0xfb, 0xa, 0x42, 0x3c, 0x35,
+ 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb4, 0xc8,
+ 0xb5, 0xa5, 0x72, 0x53, 0xa, 0x3f, 0xfb, 0xaa,
+ 0x15, 0xf8, 0x77, 0xf7, 0x4f, 0x7a, 0xc9, 0xfc,
+ 0x79, 0xfb, 0x50, 0x5, 0xf8, 0x67, 0xfb, 0x28,
+ 0x38, 0xa, 0xfc, 0x36, 0x81, 0x38, 0xa, 0xe,
+ 0xf7, 0x68, 0xe9, 0xf7, 0x40, 0x77, 0x1, 0xf7,
+ 0x62, 0xed, 0x3, 0xc6, 0xf7, 0x68, 0x15, 0xf7,
+ 0x4a, 0x6, 0x68, 0xfb, 0x3d, 0x56, 0xa, 0xae,
+ 0xf7, 0x3d, 0x5, 0xf7, 0x4b, 0x3f, 0xa, 0xfb,
+ 0x4a, 0x6, 0xae, 0xf7, 0x40, 0x4e, 0xa, 0x68,
+ 0xfb, 0x40, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0xa9,
+ 0xdc, 0xf7, 0x43, 0xdc, 0xf7, 0x28, 0x77, 0x1,
+ 0xf7, 0x82, 0xed, 0x3, 0xf7, 0x82, 0xf7, 0x1e,
+ 0x15, 0xed, 0x6, 0xad, 0xf7, 0x28, 0x5, 0xf7,
+ 0x48, 0x6, 0x9e, 0xdc, 0x5, 0xfb, 0x48, 0x6,
+ 0xae, 0xf7, 0x28, 0x4e, 0xa, 0x69, 0xfb, 0x28,
+ 0x5, 0xfb, 0x47, 0x6, 0x78, 0x3a, 0x5, 0xf7,
+ 0x47, 0x6, 0xfb, 0x86, 0xfb, 0x9a, 0x15, 0xf8,
+ 0x5c, 0x6, 0x9e, 0xdc, 0x5, 0xfc, 0x5c, 0x6,
+ 0xe, 0x7c, 0xe9, 0xf7, 0x12, 0xe9, 0xf7, 0x3d,
+ 0xe9, 0x1, 0xf8, 0x89, 0xf1, 0x3, 0xf7, 0xdc,
+ 0xb0, 0x15, 0xc8, 0x57, 0xb5, 0xb7, 0x96, 0x7c,
+ 0x95, 0x7d, 0x90, 0x7c, 0x19, 0xf7, 0xa, 0x55,
+ 0xa, 0x3a, 0x6, 0x7d, 0xa0, 0xdb, 0xdd, 0x54,
+ 0xbf, 0x46, 0x46, 0x65, 0xc5, 0x5, 0xf7, 0xd,
+ 0x9e, 0xcb, 0xe1, 0xe8, 0x1a, 0xec, 0x39, 0xb7,
+ 0x23, 0x1e, 0xfb, 0xbc, 0x44, 0xa, 0xdd, 0x6,
+ 0x39, 0xfc, 0x19, 0x5, 0x34, 0x44, 0xa, 0xf7,
+ 0x9f, 0x3f, 0xa, 0x3b, 0x6, 0xa5, 0xf7, 0x12,
+ 0x5, 0xdf, 0x6, 0xd3, 0xfb, 0x4, 0x5, 0xfb,
+ 0x1c, 0xf7, 0x62, 0x15, 0xae, 0xf7, 0x3d, 0x5,
+ 0xf7, 0x1b, 0x6, 0xa3, 0xc6, 0x82, 0x5a, 0x2a,
+ 0x23, 0x7d, 0x58, 0x1f, 0xe, 0xfb, 0x22, 0xe3,
+ 0xd6, 0xe1, 0xf7, 0x8c, 0xe3, 0x3f, 0xe2, 0x12,
+ 0x81, 0xf1, 0x13, 0xe8, 0xf7, 0x4a, 0x90, 0xa,
+ 0xa0, 0xe3, 0x5, 0x3b, 0x6, 0xe3, 0xf8, 0x2d,
+ 0x5c, 0xa, 0x9f, 0xe3, 0x3e, 0xa, 0x7f, 0x5e,
+ 0x5, 0x13, 0xd8, 0xad, 0x69, 0x5c, 0xa1, 0x53,
+ 0x1b, 0xfb, 0x31, 0xfb, 0x21, 0xfb, 0xf, 0xfb,
+ 0x18, 0x29, 0xd7, 0x3b, 0xf7, 0x14, 0xc1, 0xc2,
+ 0x90, 0xa9, 0xbb, 0x1f, 0x75, 0xfb, 0x2, 0x5,
+ 0xfb, 0x81, 0xf7, 0x9c, 0x15, 0xe1, 0xdc, 0xd2,
+ 0xf0, 0xed, 0xa0, 0x49, 0x56, 0xfb, 0x11, 0xfb,
+ 0x1a, 0x7b, 0x5e, 0x46, 0x56, 0xb4, 0xc9, 0x1e,
+ 0xe, 0x7d, 0xf7, 0x2c, 0xf7, 0xf2, 0xe7, 0x1,
+ 0xeb, 0xf7, 0x54, 0xf7, 0x8, 0xef, 0x3, 0xf7,
+ 0x3d, 0xf7, 0x4a, 0x15, 0xed, 0x6, 0x98, 0xc5,
+ 0x5, 0xe3, 0x9a, 0xf7, 0x1c, 0xc2, 0xf7, 0x1a,
+ 0x1a, 0xe4, 0x3c, 0xba, 0xfb, 0x0, 0x53, 0x3c,
+ 0x7d, 0x77, 0x52, 0x1e, 0x6e, 0xfb, 0x24, 0x5,
+ 0xee, 0x6, 0x99, 0xd7, 0x5, 0x91, 0xa7, 0xa9,
+ 0x8f, 0xa7, 0x1b, 0xc6, 0xbd, 0x7a, 0x62, 0x30,
+ 0xfb, 0x2, 0x79, 0x28, 0x7c, 0x1f, 0x28, 0xfb,
+ 0x9e, 0x15, 0x6a, 0xae, 0x76, 0xba, 0xd8, 0xac,
+ 0xbd, 0xb6, 0xa2, 0x7b, 0xaf, 0x4c, 0x4a, 0x5b,
+ 0x5c, 0x58, 0x1e, 0xe, 0xfb, 0x26, 0xe8, 0xf7,
+ 0xf2, 0xf7, 0x2c, 0x1, 0xeb, 0xed, 0xf7, 0xc,
+ 0xf7, 0x52, 0x3, 0xf7, 0xce, 0xf8, 0x2, 0x15,
+ 0x78, 0x8a, 0x90, 0x59, 0xd6, 0x1b, 0xce, 0xb7,
+ 0xb8, 0xbb, 0xaf, 0x6a, 0xa2, 0x5b, 0x44, 0x65,
+ 0x5d, 0x66, 0x1f, 0x8e, 0xfb, 0x3e, 0x15, 0x4b,
+ 0x85, 0xfb, 0x31, 0x4a, 0xfb, 0x1b, 0x1a, 0x33,
+ 0xd9, 0x5b, 0xf6, 0xc1, 0xdf, 0x99, 0x9f, 0xc4,
+ 0x1e, 0xa7, 0xf7, 0x1a, 0x66, 0xa, 0x7d, 0x49,
+ 0x5, 0x86, 0x6e, 0x68, 0x87, 0x6e, 0x1b, 0x51,
+ 0x5b, 0x9c, 0xb4, 0xe7, 0xf7, 0x2, 0x9d, 0xec,
+ 0x9a, 0x1f, 0xa4, 0xf7, 0x13, 0x66, 0xa, 0xe,
+ 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x6, 0xf7, 0x4,
+ 0xd5, 0xf7, 0x2, 0x3, 0xf7, 0xc0, 0xf7, 0xa9,
+ 0x15, 0xf7, 0x2, 0x6, 0xd7, 0x71, 0xa, 0xfb,
+ 0x20, 0x6, 0xfb, 0x7c, 0xfb, 0xb1, 0x5a, 0xa,
+ 0xd7, 0x71, 0xa, 0xfb, 0x20, 0x6, 0xe, 0xfb,
+ 0x22, 0xf7, 0xb1, 0x1, 0xf7, 0x90, 0xfb, 0x22,
+ 0x15, 0xf7, 0x9, 0x80, 0xa, 0xfb, 0x31, 0x6,
+ 0xfc, 0x3, 0xfb, 0xb1, 0x15, 0xf7, 0x7, 0x6,
+ 0xf7, 0x57, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xe,
+ 0xf7, 0x46, 0xf7, 0x5, 0xed, 0xf7, 0x5, 0x3,
+ 0xf8, 0x19, 0xf7, 0xa9, 0x6d, 0xa, 0x63, 0x71,
+ 0xa, 0xfb, 0x2d, 0x6, 0xfb, 0x17, 0xfb, 0xb1,
+ 0x6d, 0xa, 0x64, 0x71, 0xa, 0xfb, 0x2e, 0x6,
+ 0xe, 0xf7, 0xbe, 0x76, 0xf7, 0xb1, 0x77, 0x1,
+ 0xb1, 0xf7, 0x8, 0xee, 0xf7, 0xa, 0x3, 0xf7,
+ 0x91, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7,
+ 0x53, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xfc, 0x2,
+ 0xfb, 0xb1, 0x15, 0xf7, 0x8, 0x80, 0xa, 0xfb,
+ 0x33, 0x6, 0xe, 0xf7, 0xa9, 0xf7, 0xb1, 0x1,
+ 0xf7, 0xaf, 0xf7, 0xa9, 0x5a, 0xa, 0x65, 0x71,
+ 0xa, 0xfb, 0x2c, 0x6, 0xe, 0xf7, 0xbe, 0x76,
+ 0xf7, 0xb1, 0x77, 0x1, 0xf7, 0x24, 0xf7, 0xa,
+ 0x3, 0xf7, 0x24, 0xf7, 0xa9, 0x15, 0xf7, 0xa,
+ 0x6, 0xf7, 0x56, 0x71, 0xa, 0xfb, 0x35, 0x6,
+ 0xe, 0xfb, 0xd, 0x76, 0xf7, 0xae, 0x77, 0x1,
+ 0xf7, 0x24, 0xf7, 0xb, 0x3, 0xf7, 0x24, 0xfb,
+ 0x22, 0x15, 0xf7, 0xb, 0x80, 0xa, 0xfb, 0x34,
+ 0x6, 0xe, 0xf7, 0xbb, 0x76, 0xf7, 0xb4, 0x77,
+ 0x1, 0xf7, 0x62, 0xf7, 0x5, 0x3, 0xf7, 0x62,
+ 0xf7, 0xa6, 0x6d, 0xa, 0xd6, 0xf7, 0xb4, 0x5,
+ 0xfb, 0x20, 0x6, 0xe, 0x7f, 0xa, 0xf7, 0x2b,
+ 0xee, 0x3, 0x9c, 0x16, 0xf8, 0x2c, 0x3f, 0xa,
+ 0xfb, 0x56, 0x6, 0xac, 0xf7, 0x2b, 0x5, 0xc2,
+ 0xcd, 0xcc, 0xc7, 0xdf, 0x1b, 0xa4, 0x8d, 0x81,
+ 0x72, 0x8a, 0x1f, 0xed, 0x99, 0x5, 0xcb, 0x8b,
+ 0xbe, 0x22, 0x41, 0x40, 0x53, 0x63, 0x4e, 0x1e,
+ 0x98, 0xdc, 0x5, 0xfb, 0x6b, 0x87, 0xa, 0xf7,
+ 0x7, 0x6, 0x58, 0xfb, 0x8f, 0x83, 0xa, 0xe,
+ 0x79, 0xb8, 0xf6, 0xf7, 0x37, 0xf2, 0xba, 0xe3,
+ 0xb8, 0x1, 0x84, 0xba, 0xf7, 0xe5, 0xba, 0xf7,
+ 0x1d, 0xb9, 0x3, 0x84, 0xf7, 0x6e, 0x15, 0xfb,
+ 0x1a, 0xf5, 0x25, 0xf7, 0x24, 0xf7, 0x4c, 0xf7,
+ 0x48, 0xf7, 0x3b, 0xf7, 0x51, 0xf7, 0x1d, 0x25,
+ 0xf4, 0xfb, 0x25, 0xfb, 0x4f, 0xfb, 0x48, 0xfb,
+ 0x3f, 0xfb, 0x53, 0x1e, 0xba, 0x9e, 0x15, 0xf7,
+ 0x32, 0xf7, 0x34, 0xf7, 0x20, 0xf7, 0x2b, 0xf7,
+ 0x13, 0xde, 0x2e, 0xfb, 0xc, 0xfb, 0x31, 0xfb,
+ 0x34, 0xfb, 0x1e, 0xfb, 0x2a, 0xfb, 0x12, 0x36,
+ 0xe6, 0xf7, 0xb, 0x1e, 0xf7, 0x18, 0x24, 0x15,
+ 0xbb, 0x6, 0xa5, 0xf7, 0x8, 0x5, 0xbf, 0x6,
+ 0xa6, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x6e, 0xf7,
+ 0x13, 0x5, 0xb6, 0x95, 0xa6, 0xb4, 0xc4, 0x1a,
+ 0xcf, 0x53, 0x95, 0x4e, 0x1e, 0x41, 0x6, 0xa1,
+ 0xfb, 0x2a, 0x15, 0x9b, 0xf2, 0x5, 0xbb, 0x6,
+ 0xa8, 0xa8, 0x83, 0x6f, 0x55, 0x61, 0x7e, 0x6c,
+ 0x1f, 0xe, 0xf8, 0x75, 0xc6, 0xda, 0xc6, 0x1,
+ 0xf7, 0x57, 0xc9, 0xdf, 0xca, 0x3, 0xf7, 0x57,
+ 0xf8, 0xc5, 0x15, 0x5e, 0xad, 0x68, 0xbd, 0xcf,
+ 0xc4, 0xc4, 0xcb, 0xb6, 0x69, 0xac, 0x5a, 0x49,
+ 0x4f, 0x54, 0x4d, 0x1e, 0xc9, 0x96, 0x15, 0xa5,
+ 0xa3, 0xa0, 0xa6, 0x9f, 0x98, 0x7f, 0x7a, 0x71,
+ 0x76, 0x73, 0x6f, 0x76, 0x7d, 0x99, 0x9d, 0x1e,
+ 0xe, 0x7a, 0xe6, 0xf4, 0xd9, 0xa0, 0xf7, 0x49,
+ 0x2b, 0xeb, 0x12, 0xf7, 0x2, 0xe9, 0xf7, 0x76,
+ 0xed, 0x13, 0xdc, 0xa9, 0x7a, 0x15, 0xed, 0x6,
+ 0x93, 0xb2, 0x5, 0x76, 0xb5, 0xbe, 0x79, 0xc0,
+ 0x1b, 0xf7, 0x1e, 0xf7, 0x0, 0xab, 0xf7, 0x1,
+ 0xe8, 0x33, 0xab, 0x40, 0x93, 0x1f, 0xfb, 0x5,
+ 0x96, 0x5b, 0x97, 0xac, 0x1a, 0xb6, 0xef, 0x92,
+ 0xa2, 0xb6, 0xb7, 0x7c, 0x75, 0xab, 0x1e, 0x13,
+ 0xec, 0x81, 0x5b, 0x56, 0xa, 0xaf, 0xf7, 0x49,
+ 0x4e, 0xa, 0x85, 0x69, 0x5, 0x9a, 0x66, 0x5f,
+ 0x9e, 0x5c, 0x1b, 0xfb, 0x13, 0x26, 0x5b, 0x24,
+ 0x2b, 0xf7, 0xf, 0x70, 0xd4, 0x85, 0x1f, 0xad,
+ 0x88, 0xe5, 0x83, 0x57, 0x1a, 0x67, 0x3e, 0x85,
+ 0x52, 0x45, 0x5d, 0xa3, 0x9c, 0x71, 0x1e, 0x98,
+ 0xc8, 0x7b, 0xa, 0xe, 0x7a, 0xe0, 0xf7, 0x57,
+ 0xf7, 0x40, 0x1, 0xe8, 0xe4, 0xf7, 0x6c, 0xe6,
+ 0x3, 0xf7, 0xc1, 0xf8, 0x79, 0x15, 0xeb, 0x6,
+ 0xf7, 0x4d, 0xf7, 0x25, 0x58, 0xb0, 0xfb, 0x3d,
+ 0xfb, 0x0, 0xfb, 0x10, 0xf7, 0x0, 0x48, 0x67,
+ 0x5, 0xfb, 0x2e, 0xfd, 0x1c, 0x15, 0xe8, 0x6,
+ 0x93, 0xb1, 0x5, 0x7b, 0xb4, 0xc2, 0x75, 0xbf,
+ 0x1b, 0xf7, 0x24, 0xda, 0xc1, 0xe3, 0xdd, 0x4c,
+ 0xaf, 0x38, 0x92, 0x1f, 0x26, 0x93, 0x4f, 0x91,
+ 0xaf, 0x1a, 0xbf, 0xe5, 0x8b, 0xa2, 0xb4, 0xb9,
+ 0x73, 0x7a, 0xa9, 0x1e, 0x82, 0x5e, 0x5, 0xe9,
+ 0x6, 0xad, 0xf7, 0x40, 0x5, 0x2e, 0x6, 0x84,
+ 0x6b, 0x5, 0x98, 0x68, 0x5d, 0x9e, 0x5e, 0x1b,
+ 0x28, 0xfb, 0x4, 0x72, 0xfb, 0x3, 0x8a, 0x1f,
+ 0x2a, 0xf7, 0x9, 0x6b, 0xd0, 0x85, 0x1e, 0xac,
+ 0x88, 0xe1, 0x8f, 0x60, 0x1a, 0x6a, 0x4a, 0x73,
+ 0x55, 0x48, 0x57, 0xac, 0x94, 0x74, 0x1e, 0x95,
+ 0xc6, 0x5, 0x2d, 0x6, 0xe, 0xfb, 0x62, 0xce,
+ 0xf7, 0xe, 0xf7, 0x57, 0x81, 0xe2, 0xa4, 0xf7,
+ 0x47, 0x12, 0xf7, 0x2, 0xe8, 0x9f, 0xcd, 0xf7,
+ 0x26, 0xed, 0x13, 0xde, 0xa9, 0x7a, 0x15, 0xed,
+ 0x6, 0x93, 0xb3, 0xa4, 0x81, 0xa9, 0x7e, 0xab,
+ 0x84, 0x19, 0x6b, 0x26, 0x5, 0x8e, 0x94, 0x9d,
+ 0x8e, 0x9a, 0x1b, 0x93, 0x94, 0x85, 0x81, 0x80,
+ 0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x8f, 0x94, 0x7c,
+ 0x1f, 0x62, 0x55, 0x5, 0x73, 0xa6, 0x9e, 0x89,
+ 0x9d, 0x1b, 0xc6, 0xc5, 0xb3, 0xd0, 0xa1, 0x85,
+ 0xab, 0x67, 0x93, 0x1f, 0x90, 0x9d, 0x5, 0xf7,
+ 0x2b, 0x8a, 0xe0, 0xc4, 0xe8, 0x1a, 0x13, 0xbe,
+ 0xe1, 0x49, 0xb1, 0x34, 0x92, 0x1e, 0x21, 0x93,
+ 0x4c, 0x92, 0xb0, 0x1a, 0xc2, 0xea, 0x8a, 0xa3,
+ 0xb6, 0xbb, 0x73, 0x79, 0xaa, 0x1e, 0x82, 0x5c,
+ 0x56, 0xa, 0xb0, 0xf7, 0x47, 0x4e, 0xa, 0x84,
+ 0x69, 0x5, 0x99, 0x66, 0x5b, 0x9f, 0x5c, 0x1b,
+ 0x23, 0xfb, 0xa, 0x72, 0xfb, 0x9, 0x8a, 0x1f,
+ 0x26, 0xf7, 0xe, 0x69, 0xd4, 0x85, 0x1e, 0xad,
+ 0x88, 0xe5, 0x8f, 0x5e, 0x1a, 0x68, 0x47, 0x72,
+ 0x53, 0x44, 0x55, 0xae, 0x94, 0x73, 0x1e, 0x13,
+ 0xde, 0x95, 0xc9, 0x4e, 0xa, 0xe, 0x45, 0xe9,
+ 0xf8, 0x62, 0xe8, 0x1, 0xcc, 0xf2, 0xf7, 0x9b,
+ 0xf1, 0x3, 0xa6, 0x45, 0x15, 0xf7, 0x82, 0x6,
+ 0xe6, 0xe7, 0xa7, 0xdf, 0xa8, 0x85, 0x9d, 0x7c,
+ 0x9c, 0x1f, 0xad, 0x95, 0xc1, 0xbe, 0xc5, 0x1a,
+ 0x8a, 0xa6, 0x7d, 0xa3, 0x74, 0x9d, 0xfb, 0x6c,
+ 0xf7, 0x41, 0x18, 0x8b, 0x88, 0x8e, 0x8f, 0x1a,
+ 0x96, 0x9c, 0x8c, 0x91, 0x1e, 0xf7, 0x3c, 0x6,
+ 0x79, 0x35, 0x5, 0xf1, 0x6, 0xb2, 0xf7, 0x48,
+ 0xfb, 0x88, 0x8a, 0x5, 0x32, 0x37, 0x76, 0x38,
+ 0x6f, 0x96, 0x75, 0x9d, 0x78, 0x1f, 0x56, 0x76,
+ 0x68, 0x60, 0x5c, 0x1a, 0x6b, 0x9d, 0x68, 0xb2,
+ 0x6c, 0x1e, 0xf7, 0x42, 0xfb, 0x1e, 0x5, 0x9c,
+ 0x7d, 0x8d, 0x88, 0x83, 0x1a, 0x82, 0x7b, 0x8a,
+ 0x87, 0x1e, 0xfb, 0x45, 0x6, 0x9e, 0xe3, 0x5,
+ 0x24, 0x6, 0xf7, 0xb7, 0xc3, 0x15, 0xfb, 0x1f,
+ 0xf7, 0x1, 0x5, 0x82, 0x92, 0x87, 0x97, 0x97,
+ 0x1a, 0xa0, 0xab, 0x95, 0x99, 0x92, 0x1e, 0xf7,
+ 0x30, 0xfb, 0xd, 0x5, 0x92, 0x86, 0x8d, 0x83,
+ 0x82, 0x1a, 0x71, 0x61, 0x84, 0x7a, 0x89, 0x1e,
+ 0xe, 0x31, 0x76, 0xf7, 0xfc, 0xf7, 0x44, 0x1,
+ 0xf7, 0xa5, 0xf7, 0x6d, 0x3, 0xf7, 0xa5, 0xf7,
+ 0xd6, 0x15, 0x6e, 0x9f, 0x5f, 0xd3, 0xce, 0xc5,
+ 0xbc, 0xc6, 0xae, 0x6e, 0xac, 0x4e, 0x45, 0x52,
+ 0x58, 0x57, 0x1e, 0xfb, 0x38, 0xfc, 0x45, 0x15,
+ 0xf7, 0x12, 0x6, 0xf7, 0x5d, 0xf7, 0xac, 0x5,
+ 0xfb, 0x3b, 0x6, 0xe, 0xa0, 0x76, 0xf8, 0x39,
+ 0xf7, 0x48, 0x1, 0xf4, 0xf5, 0x3, 0xf4, 0x16,
+ 0xf5, 0x6, 0xf7, 0xcc, 0xf8, 0xa9, 0x99, 0xcf,
+ 0x5, 0xfc, 0x4a, 0x6, 0x66, 0xfb, 0x48, 0x56,
+ 0xa, 0x9d, 0xe2, 0x5, 0xf7, 0x80, 0x6, 0xe,
+ 0x7c, 0xe6, 0xf7, 0x74, 0xe8, 0xf7, 0x1e, 0xdf,
+ 0x8a, 0x77, 0x12, 0xf8, 0x3, 0xed, 0x13, 0xe8,
+ 0xf7, 0x48, 0xf7, 0xfb, 0x15, 0xf7, 0x19, 0xda,
+ 0xf7, 0x6, 0xb2, 0xf7, 0x33, 0x1b, 0x13, 0xd8,
+ 0xa5, 0xde, 0x5, 0x13, 0xe8, 0x75, 0x69, 0x8c,
+ 0x5b, 0x1b, 0xfb, 0x5d, 0x8c, 0xfb, 0x67, 0xfb,
+ 0x50, 0xfb, 0x89, 0x1a, 0x20, 0xd3, 0x30, 0xf7,
+ 0xc, 0xf7, 0x7, 0xf7, 0x8, 0xf7, 0x7, 0xf7,
+ 0x8, 0xe3, 0x5b, 0xe4, 0xfb, 0x6, 0x56, 0x73,
+ 0x7f, 0x75, 0x5d, 0x1e, 0x65, 0xfb, 0x1c, 0x15,
+ 0x8b, 0xc0, 0xd8, 0xdf, 0xd3, 0x9b, 0x53, 0x60,
+ 0x40, 0x46, 0x59, 0x51, 0x41, 0x65, 0xe0, 0xc9,
+ 0x99, 0x1e, 0xe, 0xf9, 0x6, 0x77, 0x1, 0xab,
+ 0xf8, 0x69, 0x3, 0xab, 0x5d, 0x15, 0xcb, 0x6c,
+ 0xf8, 0x6b, 0xf9, 0x32, 0x49, 0xac, 0x5, 0xe,
+ 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0xaa, 0xe8,
+ 0xf7, 0x33, 0xe8, 0x12, 0xf7, 0x21, 0xea, 0x36,
+ 0xed, 0x13, 0xb8, 0x52, 0xa, 0x13, 0x74, 0x3d,
+ 0xa, 0x7b, 0x7d, 0x87, 0x81, 0x7e, 0x1f, 0xb6,
+ 0xc1, 0xa0, 0xbb, 0xd1, 0x1a, 0xf7, 0x69, 0x89,
+ 0xa, 0xfb, 0x84, 0x6, 0x13, 0xb8, 0x86, 0x9b,
+ 0x8a, 0x9b, 0x9a, 0x1a, 0xcb, 0xc9, 0x47, 0xa,
+ 0x21, 0x3e, 0xfb, 0x10, 0x7a, 0x89, 0x7a, 0x8d,
+ 0x7a, 0x1f, 0x3b, 0x82, 0xa, 0x13, 0xb4, 0xf7,
+ 0x1, 0x6, 0x8a, 0x2e, 0x59, 0x33, 0x43, 0x5a,
+ 0x8, 0xe, 0x7c, 0xe7, 0xf7, 0x96, 0xe8, 0xf7,
+ 0x1a, 0x77, 0x1, 0xf4, 0xf7, 0xe3, 0x15, 0xd1,
+ 0x6, 0x62, 0x98, 0xa, 0x88, 0x7b, 0x89, 0x7e,
+ 0x7e, 0x1a, 0x29, 0xe9, 0x7b, 0xcf, 0xe0, 0xe6,
+ 0xab, 0xa6, 0xda, 0x1e, 0x8e, 0xe7, 0x5, 0x7c,
+ 0x5f, 0xfb, 0xc, 0x5f, 0x43, 0x1b, 0x53, 0x76,
+ 0x9f, 0xa4, 0x98, 0x8d, 0x99, 0x8e, 0x99, 0x1f,
+ 0xb2, 0xf7, 0x40, 0x5, 0xf7, 0x91, 0x89, 0xa,
+ 0xfb, 0x93, 0x6, 0xa9, 0xf7, 0x1a, 0x5, 0x23,
+ 0x6, 0x6f, 0xfb, 0x1a, 0x5, 0x44, 0x6, 0xe,
+ 0xfb, 0x22, 0xe4, 0xd5, 0xe4, 0xf7, 0xa6, 0xe5,
+ 0xca, 0xe4, 0x1, 0xd5, 0xe9, 0xf7, 0xfd, 0xed,
+ 0x3, 0x85, 0x56, 0x15, 0x77, 0x32, 0x5, 0xf7,
+ 0xd7, 0x6, 0x9e, 0xe4, 0x85, 0xa, 0xa9, 0xf7,
+ 0x18, 0x5, 0x7c, 0x9c, 0xb7, 0x60, 0xdb, 0x1b,
+ 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x13, 0xf7, 0x24,
+ 0xf7, 0xa, 0xfb, 0x1, 0xbf, 0x30, 0x55, 0x52,
+ 0x84, 0x6c, 0x5c, 0x1f, 0xb6, 0xf7, 0x5e, 0x5,
+ 0xfb, 0x45, 0x6, 0x78, 0x32, 0x5, 0xdd, 0x6,
+ 0xfb, 0x10, 0xfc, 0xe2, 0x5, 0xf7, 0x2e, 0xf7,
+ 0xa3, 0x15, 0xf7, 0x13, 0xf7, 0x10, 0xa6, 0xc3,
+ 0xce, 0xc1, 0x67, 0x49, 0x2f, 0x2e, 0x47, 0x36,
+ 0x64, 0x38, 0xa6, 0xdc, 0x8a, 0x1e, 0xe, 0x7c,
+ 0xe8, 0xf7, 0x2b, 0xe9, 0xf7, 0x5b, 0xe9, 0x12,
+ 0xf8, 0x3c, 0xef, 0x3f, 0xf0, 0x13, 0xf0, 0xbd,
+ 0xb3, 0x15, 0x79, 0xba, 0xd0, 0x66, 0xee, 0x1b,
+ 0xf7, 0x0, 0xf7, 0x2b, 0xc6, 0xf7, 0x31, 0xcb,
+ 0x6b, 0xa7, 0x66, 0xa9, 0x1f, 0x13, 0xe8, 0xb2,
+ 0x9f, 0xc2, 0xc8, 0xd4, 0x1a, 0xe0, 0x44, 0xc1,
+ 0x2b, 0x3f, 0x47, 0x68, 0x65, 0x47, 0x1e, 0xac,
+ 0x42, 0x5, 0xb2, 0xdb, 0xb1, 0x98, 0xb6, 0x1b,
+ 0xaf, 0xbb, 0x7c, 0x60, 0x29, 0xfb, 0xc, 0x5f,
+ 0x50, 0x8c, 0x1f, 0x78, 0x2d, 0x5, 0x13, 0xf0,
+ 0xdd, 0xe7, 0xaa, 0x50, 0x3f, 0x3b, 0x5c, 0x44,
+ 0x57, 0x6d, 0x95, 0xab, 0x34, 0x1f, 0xe, 0x5e,
+ 0xc4, 0x58, 0x76, 0xf7, 0x9, 0xca, 0xf7, 0x3d,
+ 0xce, 0xe6, 0xcb, 0x4b, 0xf7, 0x57, 0x49, 0x77,
+ 0xf4, 0x77, 0x12, 0x13, 0xbb, 0xf7, 0x98, 0xc4,
+ 0x15, 0xf7, 0x19, 0x6, 0x82, 0x5e, 0x5, 0x52,
+ 0x6, 0x80, 0x52, 0x5, 0xf7, 0x39, 0x6, 0x96,
+ 0xc4, 0x5, 0x62, 0x6, 0x93, 0xb8, 0x5, 0xb5,
+ 0x6, 0x97, 0xca, 0x5, 0x62, 0x6, 0xae, 0xf7,
+ 0x46, 0x5, 0x4a, 0x6, 0xfb, 0x41, 0x98, 0xa,
+ 0xdc, 0x9b, 0x15, 0xd0, 0xda, 0x7d, 0x3c, 0x5,
+ 0xfc, 0x56, 0xfb, 0x12, 0x15, 0x13, 0x7b, 0xc6,
+ 0x55, 0xf9, 0xb, 0xf9, 0x34, 0x4d, 0xbc, 0x5,
+ 0xfc, 0xfd, 0xfb, 0xe6, 0x15, 0x71, 0xbc, 0xaa,
+ 0x83, 0xad, 0x1b, 0xdf, 0xce, 0xc7, 0xd2, 0x1f,
+ 0x8c, 0xa4, 0x82, 0xa3, 0x79, 0x9c, 0x8, 0x9b,
+ 0x95, 0xa0, 0xaf, 0xa9, 0x1a, 0x13, 0xb4, 0xba,
+ 0x6b, 0xac, 0x51, 0x5f, 0x61, 0x77, 0x72, 0x64,
+ 0x1e, 0xa5, 0x51, 0x5, 0x13, 0xbb, 0x9b, 0xa7,
+ 0xad, 0xa0, 0xa9, 0x1b, 0x98, 0x9a, 0x86, 0x78,
+ 0x6e, 0x71, 0x7f, 0x73, 0x1f, 0x5c, 0x8c, 0x7e,
+ 0x4a, 0x5, 0xc3, 0x6, 0xac, 0x96, 0x7a, 0x78,
+ 0x6d, 0x70, 0x72, 0x67, 0x65, 0x70, 0x9a, 0x9a,
+ 0x6e, 0x1f, 0xe, 0xf7, 0x72, 0xd6, 0xf0, 0xd4,
+ 0xf7, 0x25, 0x77, 0x1, 0xf8, 0x5, 0xdd, 0x3,
+ 0xf7, 0x1a, 0xf7, 0x98, 0x15, 0x6f, 0xc5, 0xb0,
+ 0x81, 0xb4, 0x1b, 0xe8, 0xe3, 0xcc, 0xd8, 0x1f,
+ 0x8d, 0xa9, 0x81, 0xa7, 0x74, 0x9e, 0x8, 0x9f,
+ 0x97, 0xa5, 0xb3, 0xae, 0x1a, 0xbe, 0x62, 0xb0,
+ 0x46, 0x57, 0x5a, 0x74, 0x6f, 0x5a, 0x1e, 0xaa,
+ 0x4b, 0x5, 0x9d, 0xad, 0xb3, 0xa2, 0xb0, 0x1b,
+ 0x99, 0x9e, 0x84, 0x79, 0x8c, 0x1f, 0x69, 0x69,
+ 0x7f, 0x6b, 0x1e, 0x58, 0x6, 0x7c, 0x42, 0x5,
+ 0xcd, 0x6, 0xb2, 0x99, 0x79, 0x76, 0x68, 0x69,
+ 0x70, 0x62, 0x1f, 0x89, 0x6, 0x60, 0x69, 0x9c,
+ 0x9b, 0x69, 0x1f, 0xe, 0xf8, 0x84, 0xdb, 0x1,
+ 0xda, 0xf8, 0x4e, 0x3, 0xda, 0xf8, 0x99, 0x15,
+ 0xd8, 0x73, 0x5, 0xa1, 0x9d, 0x9e, 0xb5, 0xae,
+ 0x1b, 0xa0, 0x9f, 0x7d, 0x7b, 0xa0, 0x1f, 0x7c,
+ 0xa0, 0xa2, 0x7b, 0xa4, 0x1b, 0xec, 0xbb, 0xdf,
+ 0xad, 0x9c, 0x1f, 0x3e, 0xa1, 0x5, 0x63, 0x71,
+ 0x7f, 0x77, 0x6f, 0x1b, 0x78, 0x78, 0x96, 0x98,
+ 0x77, 0x1f, 0x9b, 0x72, 0x71, 0x9d, 0x6f, 0x1b,
+ 0x2e, 0x5f, 0x40, 0x61, 0x72, 0x1f, 0xe, 0xf8,
+ 0x95, 0xbc, 0x12, 0xad, 0xbf, 0xf7, 0x14, 0xbe,
+ 0xf7, 0x43, 0xcb, 0x6e, 0xbe, 0x13, 0xf0, 0xf7,
+ 0x6a, 0xf7, 0x7a, 0x15, 0xbe, 0x6, 0xc8, 0xf7,
+ 0xc0, 0x98, 0xfb, 0xc0, 0x5, 0xcd, 0x6, 0xf7,
+ 0x16, 0xf7, 0xbf, 0x5, 0x13, 0xe8, 0x4f, 0xfb,
+ 0xbf, 0x5, 0xbe, 0x6, 0xcf, 0xf7, 0xe0, 0x7a,
+ 0xa, 0xfb, 0x5, 0xfb, 0xa1, 0x82, 0xf7, 0xa1,
+ 0x5, 0x2e, 0x6, 0xfb, 0x8d, 0xfb, 0xe0, 0x15,
+ 0xbf, 0x6, 0xc4, 0xf7, 0xaf, 0x5, 0xe3, 0x6,
+ 0x96, 0xbc, 0x5, 0xfb, 0x77, 0x6, 0x81, 0x5a,
+ 0x5, 0xe2, 0x6, 0xe, 0xe9, 0x77, 0xf8, 0x55,
+ 0xe8, 0x1, 0xf7, 0x1e, 0xee, 0xf7, 0x7a, 0xee,
+ 0x3, 0xad, 0x16, 0xf8, 0x49, 0x6, 0xad, 0xf7,
+ 0x35, 0x5, 0x2d, 0x6, 0x7d, 0x48, 0x5, 0xfb,
+ 0x4e, 0x6, 0xf7, 0x2e, 0xf7, 0x5, 0x5, 0xf7,
+ 0x0, 0xda, 0xe8, 0xc9, 0xf7, 0xe, 0x1a, 0xdb,
+ 0x51, 0xcd, 0xfb, 0xd, 0x39, 0x45, 0x77, 0x36,
+ 0x3c, 0x1e, 0x79, 0x33, 0x5, 0xee, 0x6, 0xf1,
+ 0x9b, 0xf6, 0x89, 0x91, 0x1b, 0xc1, 0xba, 0x6f,
+ 0x57, 0x53, 0x6c, 0x6a, 0x45, 0x57, 0x1f, 0xfb,
+ 0xd1, 0xfb, 0x74, 0x5, 0xe, 0xf7, 0x70, 0xd6,
+ 0xf7, 0x88, 0xd8, 0x1, 0xf7, 0x50, 0xde, 0xf7,
+ 0xc, 0xde, 0x3, 0xf7, 0x11, 0xf7, 0x70, 0x15,
+ 0xf7, 0xb8, 0x6, 0x9b, 0xd6, 0x5, 0xfb, 0x38,
+ 0x6, 0xf7, 0x14, 0xea, 0x5, 0xae, 0xa3, 0xb5,
+ 0xba, 0xbe, 0x1a, 0xb4, 0x75, 0xca, 0x2b, 0x55,
+ 0x55, 0x72, 0x62, 0x5f, 0x1e, 0x7b, 0x3b, 0x5,
+ 0xde, 0x6, 0x8e, 0x96, 0x5, 0x9c, 0x8f, 0x94,
+ 0xb4, 0xc0, 0x1b, 0xa1, 0xa8, 0x85, 0x6f, 0x71,
+ 0x80, 0x78, 0x71, 0x79, 0x1f, 0xfb, 0x6c, 0xfb,
+ 0x27, 0x5, 0xe, 0x7c, 0xe8, 0x3a, 0xea, 0xf7,
+ 0x90, 0xea, 0x12, 0x13, 0xa0, 0xb2, 0xf7, 0xec,
+ 0x15, 0xdc, 0x6, 0x67, 0xfb, 0x4d, 0x5, 0x85,
+ 0x74, 0x89, 0x76, 0x79, 0x1a, 0x37, 0xd0, 0x6f,
+ 0xde, 0xbe, 0xc0, 0xa7, 0xa5, 0xb7, 0x1e, 0x13,
+ 0x60, 0x81, 0x61, 0x5, 0xf7, 0x43, 0x6, 0x9e,
+ 0xea, 0x5, 0x3b, 0x6, 0xd0, 0xf7, 0xef, 0x8f,
+ 0xa, 0x6, 0x78, 0x2c, 0x5, 0xda, 0x6, 0x65,
+ 0x98, 0xa, 0x13, 0xa0, 0x6b, 0x63, 0x5b, 0x63,
+ 0x4d, 0x1b, 0x54, 0x7a, 0xa4, 0xa2, 0x97, 0x8c,
+ 0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xae, 0x43,
+ 0xa, 0x67, 0xa, 0xf7, 0x78, 0xf8, 0x75, 0x15,
+ 0xf7, 0xe9, 0xd9, 0x76, 0xf1, 0xfb, 0xde, 0xfb,
+ 0xb, 0x5, 0xfb, 0x47, 0xfb, 0x53, 0x15, 0xdc,
+ 0x6, 0x67, 0xfb, 0x5b, 0x5, 0x8a, 0x78, 0x84,
+ 0x26, 0xa, 0x57, 0xa, 0xf7, 0x6b, 0x77, 0x12,
+ 0x13, 0xb0, 0xf7, 0x52, 0xf8, 0x70, 0x15, 0xf7,
+ 0x44, 0xf7, 0x0, 0xf7, 0x14, 0xfb, 0x0, 0xcc,
+ 0xb0, 0xfb, 0x16, 0xf7, 0x24, 0x4e, 0xa, 0xfb,
+ 0x57, 0xfb, 0x23, 0x5, 0x2a, 0xfb, 0x37, 0x27,
+ 0xa, 0x57, 0xa, 0xc6, 0xf7, 0x10, 0x12, 0x13,
+ 0xb0, 0xf8, 0xe, 0xf8, 0x89, 0x92, 0xa, 0xa3,
+ 0xf7, 0x10, 0x86, 0xa, 0xfb, 0x62, 0xfb, 0x10,
+ 0x92, 0xa, 0xa4, 0xf7, 0x10, 0x4c, 0xa, 0xfb,
+ 0x4b, 0xfb, 0xa6, 0x27, 0xa, 0x67, 0xa, 0xf7,
+ 0x5d, 0xf8, 0xc6, 0x15, 0xf7, 0xbf, 0x3b, 0xae,
+ 0xc6, 0xfb, 0xa3, 0xf7, 0xc, 0x5, 0xfb, 0x75,
+ 0xfb, 0xca, 0x27, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+ 0x90, 0x40, 0x15, 0x81, 0x59, 0x5, 0xf8, 0xed,
+ 0x6, 0x95, 0xbd, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+ 0xed, 0xe9, 0x1, 0xf7, 0x4d, 0xdb, 0x3, 0xf7,
+ 0x4d, 0x16, 0xdb, 0x6, 0xf7, 0x87, 0xf7, 0xed,
+ 0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x87, 0x87, 0xa,
+ 0xc7, 0x6, 0xfb, 0x34, 0xfb, 0x82, 0x44, 0xf7,
+ 0x82, 0x5, 0xce, 0x55, 0xa, 0xfb, 0x98, 0x44,
+ 0xa, 0xe1, 0x6, 0xe, 0xa0, 0x76, 0xf7, 0xed,
+ 0xe9, 0x1, 0xf7, 0x24, 0x16, 0xf7, 0x9, 0xf7,
+ 0x67, 0xb8, 0xfb, 0x67, 0x5, 0xd7, 0x6, 0xf7,
+ 0x47, 0xf7, 0xed, 0x5, 0xbc, 0x3f, 0xa, 0xfb,
+ 0x67, 0x44, 0xa, 0xd2, 0x6, 0x2b, 0xfb, 0x4d,
+ 0x5f, 0xf7, 0x65, 0x5, 0x48, 0x6, 0xfb, 0xc,
+ 0xfb, 0x65, 0x72, 0xf7, 0x4d, 0x5, 0xd1, 0x55,
+ 0xa, 0xfb, 0x6e, 0x44, 0xa, 0xbc, 0x6, 0xb8,
+ 0xfb, 0xed, 0x5, 0xe, 0x7f, 0xa, 0xd6, 0xf7,
+ 0x15, 0xf7, 0x39, 0xf7, 0x1a, 0x3, 0x6b, 0x16,
+ 0xf7, 0x8b, 0x55, 0xa, 0x6c, 0x6, 0xe7, 0xce,
+ 0xd4, 0x48, 0x5, 0x6f, 0x6f, 0xa, 0xf7, 0x8c,
+ 0x3f, 0xa, 0x36, 0x6, 0xfb, 0x17, 0xf7, 0x11,
+ 0xf7, 0x30, 0xf7, 0x12, 0x5, 0xe0, 0x3f, 0xa,
+ 0xfb, 0x79, 0x44, 0xa, 0x9d, 0x6, 0x3a, 0x48,
+ 0x5c, 0xce, 0x5, 0xa0, 0x3f, 0xa, 0xfb, 0x85,
+ 0x44, 0xa, 0xe2, 0x6, 0xef, 0xfb, 0x14, 0xfb,
+ 0x3a, 0xfb, 0xf, 0x5, 0x33, 0x6, 0xe, 0xfb,
+ 0x22, 0xe3, 0xf8, 0x29, 0xe3, 0x1, 0xe3, 0xf7,
+ 0x3, 0xf7, 0x8f, 0xf7, 0x1, 0x3, 0x67, 0x55,
+ 0x15, 0x76, 0x33, 0x5, 0xf7, 0xc0, 0x6, 0xa0,
+ 0xe3, 0x5, 0x45, 0x6, 0xf8, 0x1, 0xf8, 0x29,
+ 0x5c, 0xa, 0x9f, 0xe3, 0x5, 0xfb, 0x7f, 0x6,
+ 0x77, 0x33, 0x5, 0xbb, 0x6, 0xfb, 0x3c, 0xfb,
+ 0x4d, 0x38, 0xf7, 0x4d, 0x5, 0xbd, 0x6, 0x9f,
+ 0xe3, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x33, 0x5c,
+ 0xa, 0xf7, 0xb, 0xfb, 0xa0, 0xfb, 0x11, 0xfb,
+ 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2, 0xf8, 0x25,
+ 0xe3, 0x1, 0xe2, 0xf7, 0x4, 0xf7, 0x8e, 0xf7,
+ 0x2, 0x3, 0xf7, 0x8c, 0xf8, 0x7f, 0x15, 0xf7,
+ 0xec, 0xd4, 0x76, 0xec, 0xfb, 0xe2, 0xfb, 0x6,
+ 0x5, 0xfb, 0xa5, 0xfc, 0xee, 0x6b, 0xa, 0xf8,
+ 0x1, 0xf8, 0x25, 0x5, 0xd9, 0x84, 0xa, 0xfb,
+ 0x80, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb,
+ 0x40, 0xfb, 0x4a, 0x4d, 0xa, 0xfb, 0x9d, 0xfb,
+ 0xe, 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2,
+ 0xf8, 0x26, 0xe2, 0xd4, 0xf7, 0xa, 0x1, 0xe2,
+ 0xf7, 0x4, 0xf7, 0x8f, 0xf7, 0x2, 0x3, 0xf8,
+ 0x24, 0xf8, 0x8f, 0x15, 0xf7, 0x9, 0x6, 0xa4,
+ 0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6b,
+ 0xfb, 0xa, 0x15, 0xf7, 0x8, 0x6, 0xa5, 0xf7,
+ 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0xa5, 0xfd,
+ 0x3c, 0x6b, 0xa, 0xf8, 0x2, 0xf8, 0x26, 0x5,
+ 0xd8, 0x84, 0xa, 0xfb, 0x7f, 0x6, 0x77, 0x34,
+ 0x5, 0xbb, 0x6, 0xfb, 0x41, 0xfb, 0x4b, 0x4d,
+ 0xa, 0xfb, 0x9e, 0xfb, 0xe, 0xfb, 0x1c, 0x5,
+ 0xe, 0x8b, 0xe2, 0xbe, 0xbd, 0xc3, 0xbc, 0xf7,
+ 0x4a, 0xe2, 0x1, 0xa3, 0x16, 0xf7, 0xdb, 0x6,
+ 0x9e, 0xe2, 0x5, 0xfb, 0xa, 0x6, 0x97, 0xbe,
+ 0x70, 0xa, 0x95, 0xbd, 0x5, 0xfb, 0x29, 0x6,
+ 0x9a, 0xc3, 0x70, 0xa, 0x97, 0xbc, 0x5, 0xfb,
+ 0x22, 0x6, 0xf7, 0x5f, 0xf7, 0x4a, 0x5c, 0xa,
+ 0x9e, 0xe2, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x34,
+ 0x5, 0xb8, 0x6, 0xfb, 0x11, 0xfb, 0x8, 0x41,
+ 0xf7, 0x8, 0x5, 0xb9, 0x6, 0x9e, 0xe2, 0x5,
+ 0xfb, 0x88, 0x6, 0x78, 0x34, 0x5, 0xdd, 0x6,
+ 0xf7, 0x10, 0xfb, 0x4a, 0x5, 0xfb, 0x26, 0x6,
+ 0x81, 0x5a, 0x70, 0xa, 0x7c, 0x53, 0x85, 0xa,
+ 0x82, 0x59, 0x70, 0xa, 0x7f, 0x58, 0x83, 0xa,
+ 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0x1, 0xf2,
+ 0xed, 0xf7, 0x6c, 0xed, 0x3, 0xad, 0x16, 0xf8,
+ 0x4e, 0x6, 0xb2, 0xf7, 0x50, 0x5, 0x29, 0x44,
+ 0xa, 0xfb, 0x55, 0x6, 0xf7, 0xef, 0xf7, 0xa9,
+ 0x99, 0xcf, 0x5, 0xfc, 0x3f, 0x6, 0x67, 0xfb,
+ 0x46, 0x56, 0xa, 0x9c, 0xe0, 0x5, 0xf7, 0x43,
+ 0x6, 0xfb, 0xec, 0xfb, 0xa6, 0x5, 0xe, 0x8b,
+ 0xe6, 0xf7, 0x89, 0xe5, 0xc7, 0xd5, 0x1, 0xe8,
+ 0xea, 0xf7, 0x5d, 0xe9, 0x3, 0xf7, 0xb9, 0xf8,
+ 0x7a, 0x15, 0xec, 0x6, 0xf7, 0x4d, 0xf7, 0x24,
+ 0x58, 0xb0, 0xfb, 0x3f, 0x20, 0xfb, 0xf, 0xf6,
+ 0x46, 0x67, 0x5, 0xfb, 0x1d, 0xfd, 0xb, 0x15,
+ 0xf8, 0x3d, 0x6, 0xad, 0xf7, 0x3c, 0x5, 0x2d,
+ 0x6, 0x7a, 0x3e, 0x5, 0xfb, 0x49, 0x6, 0xf7,
+ 0xde, 0xf7, 0xa2, 0x98, 0xcc, 0x5, 0xfc, 0x2d,
+ 0x6, 0x6b, 0xfb, 0x2d, 0x5, 0xea, 0x6, 0x98,
+ 0xca, 0x5, 0xf7, 0x3a, 0x6, 0xfb, 0xdd, 0xfb,
+ 0x9e, 0x5, 0xe, 0x7c, 0xe9, 0xf8, 0x4f, 0xe9,
+ 0x1, 0xd3, 0xec, 0xf7, 0x9b, 0xeb, 0x3, 0xd3,
+ 0xf7, 0x50, 0x15, 0x2b, 0xa9, 0x20, 0xf7, 0x1b,
+ 0xf7, 0x91, 0xb1, 0xf7, 0xe3, 0xf7, 0xd, 0xe5,
+ 0x61, 0xe0, 0xfb, 0xc, 0xfb, 0x88, 0x59, 0xfb,
+ 0xd2, 0xfb, 0x2, 0x1e, 0xec, 0x9d, 0x15, 0xf7,
+ 0x10, 0xd1, 0xf7, 0x54, 0xf5, 0xee, 0x7f, 0x31,
+ 0x56, 0x3e, 0x58, 0xfb, 0x73, 0xfb, 0xe, 0x3b,
+ 0x81, 0xca, 0xcb, 0x1e, 0xe, 0x79, 0x9d, 0xf8,
+ 0x4b, 0x9f, 0xf6, 0x99, 0x9f, 0x9f, 0x6, 0xfb,
+ 0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+ 0xc, 0x9, 0xe8, 0xa, 0xe8, 0xb, 0x8c, 0xc,
+ 0xe, 0xf8, 0xec, 0x14, 0xac, 0x13, 0x0, 0x79,
+ 0x2, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x4d, 0x0,
+ 0x89, 0x0, 0x8d, 0x0, 0xcb, 0x1, 0x15, 0x1,
+ 0x51, 0x1, 0x5d, 0x1, 0x65, 0x1, 0x6c, 0x1,
+ 0x94, 0x1, 0xb0, 0x1, 0xc5, 0x1, 0xdd, 0x1,
+ 0xf8, 0x2, 0x16, 0x2, 0x2e, 0x2, 0x3b, 0x2,
+ 0x44, 0x2, 0x59, 0x2, 0x5e, 0x2, 0x72, 0x2,
+ 0x77, 0x2, 0x7c, 0x2, 0x93, 0x2, 0xba, 0x2,
+ 0xc1, 0x2, 0xcb, 0x2, 0xd0, 0x2, 0xf2, 0x2,
+ 0xf7, 0x2, 0xfc, 0x3, 0x4, 0x3, 0xd, 0x3,
+ 0x12, 0x3, 0x15, 0x3, 0x1a, 0x3, 0x22, 0x3,
+ 0x27, 0x3, 0x3c, 0x3, 0x49, 0x3, 0x55, 0x3,
+ 0x5c, 0x3, 0x61, 0x3, 0x66, 0x3, 0x77, 0x3,
+ 0x7b, 0x3, 0x8e, 0x3, 0x9b, 0x3, 0xae, 0x3,
+ 0xc1, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xdc, 0x3,
+ 0xe0, 0x3, 0xe8, 0x3, 0xf0, 0x3, 0xf8, 0x3,
+ 0xfd, 0x4, 0x2, 0x4, 0x6, 0x4, 0xe, 0x4,
+ 0x16, 0x4, 0x1e, 0x4, 0x27, 0x4, 0x2e, 0x4,
+ 0x34, 0x4, 0x3a, 0x4, 0x40, 0x4, 0x45, 0x4,
+ 0x49, 0x4, 0x52, 0x4, 0x5a, 0x4, 0x66, 0x4,
+ 0x74, 0x4, 0x7f, 0x4, 0x8a, 0x4, 0x8f, 0x4,
+ 0x94, 0x4, 0x99, 0x4, 0x9e, 0x4, 0xa2, 0x4,
+ 0xa9, 0x4, 0xb5, 0x4, 0xba, 0x4, 0xc0, 0x4,
+ 0xc6, 0x4, 0xcc, 0x4, 0xd2, 0x4, 0xd8, 0x4,
+ 0xdc, 0x4, 0xe0, 0x4, 0xe4, 0x4, 0xe8, 0x4,
+ 0xf3, 0x4, 0xfa, 0x5, 0x0, 0x5, 0x7, 0x5,
+ 0xc, 0x5, 0x11, 0x5, 0x16, 0x5, 0x1b, 0x5,
+ 0x20, 0x5, 0x25, 0x5, 0x2a, 0x5, 0x2f, 0x5,
+ 0x33, 0x5, 0x3d, 0x5, 0x47, 0x5, 0x50, 0x5,
+ 0x58, 0x5, 0x5c, 0x5, 0x65, 0x5, 0x6a, 0x5,
+ 0x6f, 0x5, 0x74, 0x5, 0x79, 0x5, 0x7e, 0x5,
+ 0x82, 0x5, 0x86, 0x5, 0x8a, 0xf7, 0x8d, 0x6,
+ 0x9f, 0xe5, 0x5, 0x30, 0x6, 0xb9, 0xd7, 0x5,
+ 0xf7, 0x84, 0x6, 0x9f, 0x3f, 0x5, 0x33, 0x3c,
+ 0xa, 0xf7, 0x88, 0x37, 0xa, 0x51, 0x6, 0xfb,
+ 0x1, 0xf8, 0x64, 0x5, 0xfb, 0x91, 0x3c, 0xa,
+ 0xf7, 0x15, 0x6, 0xfb, 0x8e, 0x7c, 0xa, 0x4e,
+ 0x6, 0xf7, 0x9d, 0xf7, 0x3a, 0x15, 0xf7, 0xa,
+ 0xf7, 0x3d, 0xb6, 0xfb, 0x3d, 0x5, 0xb, 0x22,
+ 0xa, 0x1f, 0x13, 0xbc, 0x3b, 0xa, 0x1e, 0x13,
+ 0x7c, 0xa1, 0xf7, 0x1, 0x15, 0x13, 0xbc, 0x2c,
+ 0xa, 0x15, 0xf7, 0x41, 0x42, 0xa, 0x3c, 0x6,
+ 0xac, 0xf7, 0x36, 0x5, 0x91, 0xa8, 0x90, 0xaa,
+ 0xa7, 0x1a, 0xcf, 0x46, 0xa9, 0x46, 0x2e, 0xfb,
+ 0x6, 0x6f, 0x74, 0x51, 0x1e, 0x9f, 0x3c, 0x5,
+ 0x9c, 0xa6, 0xef, 0xa1, 0xd6, 0x1b, 0xbc, 0xb0,
+ 0x7b, 0x69, 0x84, 0x8a, 0x83, 0x88, 0x83, 0x1f,
+ 0x8f, 0x68, 0x64, 0x8e, 0x67, 0x1b, 0xfb, 0x8a,
+ 0x6e, 0xfb, 0x20, 0x64, 0xb, 0x15, 0x20, 0xa,
+ 0xe, 0x15, 0xfb, 0x28, 0xf7, 0x1, 0x43, 0xf7,
+ 0x8, 0xf7, 0x44, 0xf7, 0x34, 0xf7, 0x9, 0xf7,
+ 0x89, 0xf7, 0x6, 0x48, 0xf4, 0xfb, 0x29, 0xfb,
+ 0x57, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x62, 0x1e,
+ 0xef, 0x9e, 0x15, 0xf7, 0x4, 0x8a, 0xe4, 0xf7,
+ 0x1f, 0xf7, 0x1e, 0x1b, 0xf7, 0x5, 0xa6, 0x33,
+ 0x46, 0x8a, 0x1f, 0x2a, 0x3d, 0xfb, 0x27, 0xfb,
+ 0x23, 0x29, 0x5d, 0xd2, 0xda, 0x1e, 0xe, 0x15,
+ 0xdc, 0x6, 0x54, 0xfb, 0x9c, 0x5, 0x86, 0x73,
+ 0x89, 0x75, 0x77, 0x1a, 0x2d, 0xc8, 0x55, 0xf7,
+ 0xd, 0xf7, 0x15, 0xe9, 0xac, 0xf7, 0x48, 0xb0,
+ 0x1e, 0xc2, 0xf7, 0x9d, 0x5, 0xdb, 0x46, 0xa,
+ 0xfb, 0xa2, 0x6, 0x79, 0x31, 0x5, 0xeb, 0x6,
+ 0x57, 0xfb, 0x95, 0x5, 0x36, 0x79, 0x6b, 0x5e,
+ 0x24, 0x1b, 0x3b, 0x75, 0xab, 0xb0, 0x8a, 0x1f,
+ 0x9a, 0x8d, 0x9a, 0x8e, 0x9a, 0x1e, 0xc3, 0xf7,
+ 0xa5, 0x5, 0xea, 0x46, 0xa, 0xfb, 0xa2, 0x6,
+ 0xb, 0x7a, 0x7b, 0x1a, 0x43, 0xd0, 0x60, 0xdd,
+ 0xbf, 0xc0, 0xa6, 0xa5, 0xb7, 0x1e, 0x13, 0x70,
+ 0x81, 0x62, 0x5, 0xf7, 0x43, 0x37, 0xa, 0x3b,
+ 0x6, 0xd0, 0xf7, 0xf7, 0x8f, 0xa, 0x36, 0xa,
+ 0xda, 0x6, 0x65, 0xfb, 0x63, 0x5, 0x13, 0xb0,
+ 0x6c, 0x63, 0x5b, 0x64, 0x4d, 0x1b, 0x54, 0x7a,
+ 0xa2, 0xa1, 0x97, 0x8c, 0x96, 0x8c, 0x93, 0x1f,
+ 0xc3, 0xf7, 0xb8, 0x43, 0xa, 0x15, 0xdc, 0x6,
+ 0x67, 0xfb, 0x5b, 0x5, 0x85, 0x78, 0x89, 0x26,
+ 0xa, 0x15, 0x33, 0xa, 0x13, 0xd8, 0x2a, 0xa,
+ 0xe, 0x30, 0xa, 0x26, 0xfb, 0x44, 0x2d, 0xa,
+ 0x7b, 0x42, 0x56, 0xa, 0xbc, 0xf7, 0x80, 0x4e,
+ 0xa, 0x7c, 0x41, 0x4c, 0xa, 0xa7, 0xf7, 0x1e,
+ 0x88, 0xa, 0x72, 0xfb, 0x8, 0x56, 0xa, 0xb6,
+ 0xf7, 0x62, 0x5, 0xfc, 0xa1, 0x6, 0x79, 0x31,
+ 0x8a, 0xa, 0x3d, 0x7c, 0xa, 0x37, 0x6, 0xb,
+ 0xf8, 0x55, 0x37, 0xa, 0xfb, 0x40, 0x6, 0xdb,
+ 0xf8, 0xa, 0x5, 0xf7, 0x3e, 0x37, 0xa, 0xfc,
+ 0x51, 0x3c, 0xa, 0xf7, 0x41, 0x6, 0x3b, 0xfc,
+ 0xa, 0x3e, 0xa, 0xb, 0x61, 0x53, 0x49, 0x6a,
+ 0x48, 0x1b, 0x66, 0x65, 0x98, 0xa4, 0xc3, 0xe4,
+ 0x9d, 0xc3, 0xc5, 0xb1, 0x84, 0x89, 0xa8, 0x1f,
+ 0xe, 0x1e, 0xf1, 0xa2, 0x15, 0xef, 0xea, 0xca,
+ 0xf5, 0xf7, 0x3, 0xb0, 0x54, 0x56, 0x20, 0xfb,
+ 0x5, 0x55, 0x35, 0x53, 0x2d, 0xa3, 0xdd, 0x1e,
+ 0xe, 0x15, 0x9d, 0xe6, 0x5, 0xf7, 0x33, 0x6,
+ 0xdb, 0xf7, 0x94, 0x5, 0xfb, 0x35, 0x34, 0xa,
+ 0xf7, 0x98, 0x6, 0x25, 0xfb, 0xef, 0x5, 0xf7,
+ 0x4d, 0x4b, 0xa, 0xe, 0x5, 0x6d, 0x44, 0x3c,
+ 0x74, 0x3f, 0x1b, 0xfb, 0xf, 0x82, 0xb9, 0xaf,
+ 0x87, 0x1f, 0x9b, 0xe6, 0x15, 0xc4, 0xac, 0xd5,
+ 0xb0, 0xc8, 0x1b, 0xca, 0xd8, 0x6e, 0x4a, 0x8c,
+ 0x1f, 0xe, 0x15, 0xfb, 0x12, 0xf7, 0x18, 0x5b,
+ 0xf3, 0xf7, 0x1a, 0xf7, 0x49, 0xe6, 0xf7, 0x49,
+ 0xe9, 0x48, 0xe0, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+ 0x3c, 0xb, 0x3c, 0xf7, 0x2a, 0xea, 0xe0, 0xa1,
+ 0xb5, 0xdd, 0x1f, 0x7a, 0xdb, 0x2f, 0xa, 0x35,
+ 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x31, 0xa,
+ 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x5e, 0x7a, 0xa,
+ 0x73, 0xfb, 0x4, 0x95, 0xa, 0xab, 0xf7, 0x27,
+ 0x5, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, 0xe6,
+ 0x5, 0xb, 0x15, 0xf8, 0x21, 0x6, 0x94, 0xa3,
+ 0x97, 0xc0, 0xa9, 0x1a, 0xee, 0x89, 0x30, 0xd1,
+ 0xfb, 0x9, 0x1b, 0xfb, 0x17, 0xb, 0x6, 0x78,
+ 0x30, 0x5, 0xb, 0x6, 0x9e, 0xe5, 0x5, 0xb,
+ 0x49, 0xa, 0xbf, 0x3a, 0xfb, 0xa, 0x42, 0x3d,
+ 0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb3,
+ 0xc8, 0xb5, 0xa5, 0x73, 0x53, 0xa, 0xb, 0x15,
+ 0x4d, 0xba, 0x57, 0xe3, 0xed, 0xef, 0xd2, 0xe9,
+ 0xc7, 0x58, 0xbe, 0x37, 0x27, 0x29, 0x3f, 0x35,
+ 0x1e, 0xdc, 0x91, 0x15, 0xba, 0xb2, 0xb2, 0xc7,
+ 0xba, 0xa4, 0x72, 0x6c, 0x56, 0x52, 0x70, 0x5e,
+ 0x62, 0x6f, 0xa3, 0xa5, 0x1e, 0xb, 0x8b, 0xe6,
+ 0xf8, 0x10, 0xe6, 0x1, 0xb, 0x52, 0xbf, 0x51,
+ 0xf0, 0xda, 0xb6, 0xa2, 0xae, 0xca, 0xb, 0x6,
+ 0x78, 0x31, 0x5, 0xb, 0x84, 0xa3, 0xa3, 0x83,
+ 0xa1, 0x1b, 0xd5, 0xc5, 0xbd, 0xa4, 0xa6, 0x1f,
+ 0x5f, 0xca, 0x5, 0x77, 0x6e, 0x69, 0x72, 0x67,
+ 0x1b, 0x7a, 0x76, 0x91, 0x92, 0x76, 0x1f, 0x92,
+ 0x75, 0x75, 0x92, 0x76, 0x1b, 0xb, 0x5, 0xfb,
+ 0x43, 0x6, 0xb, 0x6, 0x9e, 0xe9, 0x5, 0xb,
+ 0x8b, 0xe5, 0xd7, 0xe5, 0xf7, 0x64, 0xe5, 0xb,
+ 0x7c, 0xe7, 0x3b, 0xe6, 0xf0, 0xe5, 0xcd, 0xe6,
+ 0xb, 0x6, 0x9d, 0xe6, 0x5, 0xb, 0x3e, 0xa,
+ 0xe, 0x6, 0x78, 0x2d, 0x5, 0xb, 0x1, 0xa3,
+ 0xf1, 0xf7, 0xf1, 0xef, 0x3, 0xb, 0x6, 0x9d,
+ 0xe5, 0x5, 0xb, 0xbb, 0xd5, 0xbf, 0xb5, 0x73,
+ 0x5c, 0x99, 0x1e, 0xe6, 0xb0, 0x5, 0xb9, 0x78,
+ 0x69, 0xdc, 0xfb, 0x15, 0x1b, 0xfb, 0x22, 0xb,
+ 0x15, 0xee, 0x6, 0xf7, 0x53, 0xf7, 0x25, 0x57,
+ 0xaf, 0xfb, 0x45, 0x5e, 0xa, 0x15, 0x4f, 0xbb,
+ 0x58, 0xde, 0xf1, 0xe1, 0xd2, 0xe7, 0xc7, 0x5c,
+ 0xb, 0x64, 0xa, 0xf7, 0xf, 0x65, 0xa, 0xb,
+ 0x6, 0x79, 0x30, 0x5, 0xb, 0x5, 0xfb, 0x3,
+ 0x6, 0xb, 0x3d, 0xf7, 0x4b, 0x5, 0xbd, 0x84,
+ 0xa, 0xfb, 0x84, 0x6, 0x77, 0x34, 0x5c, 0xa,
+ 0xf7, 0x8, 0xb, 0x5, 0x29, 0x6, 0xb, 0x15,
+ 0x6b, 0xa2, 0x73, 0xad, 0xb7, 0xb5, 0xb5, 0xba,
+ 0xbb, 0x72, 0x99, 0x6a, 0x5a, 0x67, 0x5e, 0x59,
+ 0x1e, 0xb, 0x16, 0x60, 0xa, 0xa8, 0x7a, 0xa4,
+ 0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xb, 0x15,
+ 0xf7, 0x62, 0xfb, 0x55, 0xc0, 0xc5, 0xfb, 0x26,
+ 0xf7, 0x1b, 0xf7, 0x26, 0xf7, 0xf, 0x56, 0xc7,
+ 0x5, 0xb, 0xa7, 0xaf, 0x15, 0xb2, 0x4b, 0x5,
+ 0x93, 0x99, 0xcd, 0xb1, 0xbc, 0x1b, 0xa0, 0xa3,
+ 0x84, 0x83, 0xa4, 0x1f, 0xb, 0x6d, 0x55, 0x56,
+ 0x70, 0x5d, 0x61, 0x73, 0xa2, 0xa7, 0x1e, 0xb,
+ 0x8b, 0xe5, 0xd5, 0xf7, 0x36, 0x32, 0xe4, 0xf7,
+ 0x1e, 0xe5, 0xb, 0x6, 0x9f, 0xe9, 0x5, 0xb,
+ 0x5, 0xed, 0x6, 0xb, 0x7c, 0xe4, 0x3e, 0xe5,
+ 0xf7, 0x9c, 0xe6, 0xb, 0x1, 0x9e, 0xef, 0xf8,
+ 0x1, 0xeb, 0x3, 0xb, 0x1, 0xf3, 0xe9, 0xf7,
+ 0x8b, 0xe9, 0x3, 0xb, 0x15, 0xf7, 0x4, 0x6,
+ 0xb, 0x6, 0x9e, 0xe7, 0x5, 0xb, 0x5, 0xd9,
+ 0x6, 0xb, 0x63, 0xa, 0xf7, 0x75, 0x77, 0x45,
+ 0xa, 0xb, 0x22, 0xfb, 0x10, 0xf5, 0x45, 0x69,
+ 0x5, 0xe, 0x61, 0xa, 0xf7, 0x77, 0x77, 0x76,
+ 0xa, 0xb, 0x71, 0xa2, 0x72, 0xb1, 0xba, 0xac,
+ 0xb3, 0xb0, 0xb, 0x7c, 0xe6, 0xdd, 0xe6, 0xe9,
+ 0xe6, 0xb, 0x1, 0xf7, 0x67, 0xf1, 0x3, 0xb,
+ 0x7c, 0xe6, 0xf7, 0xa1, 0xe6, 0xb, 0x15, 0xf7,
+ 0x6, 0x6, 0xa5, 0xb, 0x5, 0xfb, 0x5, 0x6,
+ 0xb, 0x5, 0x2a, 0x6, 0xb, 0x57, 0xa, 0xf7,
+ 0x6f, 0x77, 0x12, 0x13, 0xb0, 0xb, 0x75, 0xa,
+ 0xf7, 0x7a, 0x77, 0x62, 0xa, 0xb, 0xf8, 0x8f,
+ 0x5a, 0xa, 0xaa, 0xf7, 0x2b, 0x5, 0xfb, 0x4,
+ 0x6, 0xb, 0xb1, 0x4c, 0xf7, 0x66, 0xf7, 0x2e,
+ 0xfb, 0x1b, 0xf7, 0x32, 0x4d, 0x57, 0xc5, 0xb,
+ 0x15, 0x76, 0x34, 0x5, 0xf7, 0xc0, 0x84, 0xa,
+ 0x46, 0x6, 0xb, 0x5, 0xda, 0x6, 0x9d, 0xe8,
+ 0x5, 0xfb, 0xa0, 0x82, 0xa, 0xb, 0x15, 0xf7,
+ 0x5, 0x6, 0xb, 0x6, 0x77, 0x30, 0x5, 0xb,
+ 0x6, 0x77, 0x2d, 0x5, 0xb, 0x5, 0xf7, 0x28,
+ 0x6, 0xb, 0xf7, 0xb1, 0x5, 0xb, 0x64, 0xa,
+ 0xf7, 0x10, 0x83, 0xa, 0xb, 0x15, 0xf8, 0x63,
+ 0x6, 0x9e, 0xf7, 0x2, 0x5, 0xfc, 0x63, 0x6,
+ 0xb, 0x6, 0x3c, 0x7d, 0xa, 0xb, 0x8b, 0xe5,
+ 0xf8, 0xa, 0xe5, 0xb, 0x1, 0xf8, 0x66, 0xe8,
+ 0x3, 0xb, 0x79, 0xe4, 0xf8, 0x25, 0xe6, 0xb,
+ 0x8b, 0xe6, 0xf7, 0x94, 0xe6, 0xb, 0x79, 0xe6,
+ 0xf8, 0x17, 0xe5, 0xb, 0x5, 0x2b, 0x6, 0xb,
+ 0x5, 0x28, 0x6, 0xb, 0xfc, 0xa, 0x5, 0xb,
+ 0xfc, 0x10, 0x5, 0xb, 0x5, 0xfb, 0x4c, 0x6,
+ 0x79, 0x2e, 0x5, 0xd8, 0x6, 0x3f, 0xb, 0x8b,
+ 0xe9, 0xf7, 0x8f, 0xe9, 0x1, 0xb, 0x6, 0xf7,
+ 0x55, 0x71, 0xa, 0xb, 0x8b, 0xe9, 0xf8, 0x4a,
+ 0xe9, 0x1, 0xb, 0x6, 0x78, 0x2e, 0x5, 0xb,
+ 0x5, 0xfb, 0x6, 0x6, 0xb, 0x6, 0x9f, 0xe2,
+ 0x5, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0x5,
+ 0xfb, 0x2, 0x6, 0xb, 0x6, 0x79, 0x2d, 0x5,
+ 0xb, 0x5, 0xf7, 0x8f, 0x6, 0xb, 0x6, 0x9f,
+ 0xe8, 0x5, 0xb, 0x5, 0xdb, 0x6, 0xb, 0xf7,
+ 0x1b, 0xc5, 0x98, 0x1f, 0xe7, 0xf8, 0x2e, 0x5,
+ 0xb, 0xda, 0xf7, 0xb, 0xa4, 0x1f, 0xc5, 0xf7,
+ 0xb6, 0x5, 0xb, 0x5, 0xfb, 0x45, 0x6, 0x79,
+ 0x32, 0x8a, 0xa, 0xb, 0x65, 0xca, 0xfb, 0x66,
+ 0xfb, 0x2e, 0x5, 0xe, 0x5, 0xfb, 0x42, 0xb,
+ 0x55, 0x15, 0x77, 0x33, 0x5, 0xf7, 0xd7, 0x6,
+ 0xb, 0xf7, 0x73, 0x77, 0x1, 0xb, 0x15, 0xf7,
+ 0x3, 0x6, 0xb, 0x28, 0xfb, 0x42, 0x2a, 0xb,
+ 0x6, 0x9e, 0xe8, 0x5, 0xb, 0x5, 0xfb, 0x90,
+ 0x6, 0xb, 0x5, 0xec, 0x6, 0xb, 0xf7, 0x20,
+ 0x5, 0xb, 0xfb, 0x56, 0x5, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
new file mode 100644
index 0000000000..d8409bab29
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
@@ -0,0 +1,2352 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedItalicFontData [18746] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+ 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+ 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8,
+ 0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x18, 0x4,
+ 0x5b, 0xfb, 0x8d, 0xf9, 0x2b, 0xf9, 0xb7, 0x5,
+ 0xf7, 0xa3, 0xf, 0xf9, 0xc, 0x11, 0xaa, 0x1c,
+ 0x42, 0x78, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5,
+ 0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d,
+ 0x39, 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa5,
+ 0xb4, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69,
+ 0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67,
+ 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72,
+ 0x61, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65,
+ 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75,
+ 0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49,
+ 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72,
+ 0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64,
+ 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc9, 0x0, 0x0, 0xc8, 0x0,
+ 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+ 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+ 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+ 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+ 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+ 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+ 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+ 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+ 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0, 0x91, 0x0,
+ 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, 0x92,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x1,
+ 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0,
+ 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65,
+ 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e, 0x0, 0x0,
+ 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+ 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+ 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+ 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+ 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+ 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+ 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+ 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, 0x91,
+ 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3,
+ 0x0, 0x2f, 0x0, 0x62, 0x0, 0xd0, 0x1, 0x55,
+ 0x1, 0xb1, 0x2, 0x3c, 0x2, 0x50, 0x2, 0x87,
+ 0x2, 0xbe, 0x2, 0xf5, 0x3, 0x21, 0x3, 0x2f,
+ 0x3, 0x43, 0x3, 0x52, 0x3, 0x67, 0x3, 0xab,
+ 0x3, 0xd2, 0x4, 0x22, 0x4, 0x80, 0x4, 0xc1,
+ 0x5, 0x11, 0x5, 0x67, 0x5, 0x8f, 0x6, 0x0,
+ 0x6, 0x57, 0x6, 0x6f, 0x6, 0x8f, 0x6, 0xb2,
+ 0x6, 0xd4, 0x6, 0xf7, 0x7, 0x5b, 0x7, 0xf8,
+ 0x8, 0x32, 0x8, 0x9f, 0x8, 0xf3, 0x9, 0x2e,
+ 0x9, 0x77, 0x9, 0xc3, 0x9, 0xd7, 0xa, 0x28,
+ 0xa, 0x48, 0xa, 0x84, 0xa, 0xd7, 0xb, 0x1,
+ 0xb, 0x48, 0xb, 0x83, 0xb, 0xcd, 0xc, 0x1a,
+ 0xc, 0xb7, 0xd, 0x19, 0xd, 0x88, 0xd, 0xbc,
+ 0xe, 0x12, 0xe, 0x3d, 0xe, 0x7f, 0xe, 0xd2,
+ 0xf, 0x7, 0xf, 0x3e, 0xf, 0x5e, 0xf, 0x81,
+ 0xf, 0xa4, 0xf, 0xd4, 0xf, 0xe5, 0xf, 0xf5,
+ 0x10, 0x45, 0x10, 0xaa, 0x10, 0xfe, 0x11, 0x65,
+ 0x11, 0xb9, 0x12, 0xa, 0x12, 0x1f, 0x12, 0x6b,
+ 0x12, 0xa0, 0x12, 0xe2, 0x13, 0x30, 0x13, 0x53,
+ 0x13, 0xca, 0x14, 0x29, 0x14, 0x70, 0x14, 0xd7,
+ 0x15, 0x3f, 0x15, 0x84, 0x15, 0xed, 0x16, 0x39,
+ 0x16, 0x8f, 0x16, 0xbb, 0x16, 0xff, 0x17, 0x52,
+ 0x17, 0x92, 0x17, 0xc4, 0x18, 0x2b, 0x18, 0x45,
+ 0x18, 0xac, 0x18, 0xea, 0x19, 0x19, 0x19, 0x77,
+ 0x19, 0xe6, 0x1a, 0x67, 0x1a, 0xca, 0x1a, 0xe9,
+ 0x1b, 0x82, 0x1b, 0x9e, 0x1c, 0x23, 0x1c, 0x8a,
+ 0x1c, 0xbd, 0x1c, 0xd8, 0x1d, 0x60, 0x1d, 0x73,
+ 0x1d, 0xb0, 0x1d, 0xee, 0x1e, 0x31, 0x1e, 0x97,
+ 0x1e, 0xa9, 0x1e, 0xee, 0x1f, 0x27, 0x1f, 0x48,
+ 0x1f, 0x84, 0x1f, 0xa8, 0x1f, 0xe7, 0x20, 0x1c,
+ 0x20, 0x89, 0x20, 0xfc, 0x21, 0xaa, 0x22, 0x9,
+ 0x22, 0x27, 0x22, 0x4e, 0x22, 0x7b, 0x22, 0xc6,
+ 0x22, 0xe9, 0x23, 0x2f, 0x23, 0x9f, 0x24, 0x22,
+ 0x24, 0x40, 0x24, 0x63, 0x24, 0x89, 0x24, 0xb7,
+ 0x24, 0xd4, 0x25, 0x14, 0x25, 0x3e, 0x25, 0x6d,
+ 0x25, 0xc8, 0x26, 0x49, 0x26, 0x67, 0x26, 0x88,
+ 0x26, 0xae, 0x26, 0xff, 0x27, 0x31, 0x27, 0x60,
+ 0x27, 0xe8, 0x27, 0xfd, 0x28, 0x16, 0x28, 0x3f,
+ 0x28, 0x61, 0x28, 0x80, 0x28, 0xd1, 0x29, 0x5b,
+ 0x29, 0x71, 0x29, 0x97, 0x29, 0xad, 0x2a, 0x13,
+ 0x2a, 0x36, 0x2a, 0x7f, 0x2b, 0x2d, 0x2b, 0xaf,
+ 0x2b, 0xcd, 0x2b, 0xea, 0x2c, 0x19, 0x2c, 0x4a,
+ 0x2c, 0x65, 0x2c, 0x96, 0x2c, 0xba, 0x2c, 0xda,
+ 0x2d, 0x51, 0x2d, 0xf4, 0x2e, 0xc, 0x2e, 0x23,
+ 0x2e, 0x49, 0x2e, 0x92, 0x2e, 0xb9, 0x2e, 0xeb,
+ 0x2f, 0x6a, 0x2f, 0x89, 0x2f, 0xa8, 0x2f, 0xd0,
+ 0x2f, 0xf8, 0x30, 0x4b, 0x30, 0xb6, 0x31, 0x1b,
+ 0x31, 0x40, 0x31, 0x66, 0x31, 0xc3, 0x32, 0x29,
+ 0x32, 0x65, 0x32, 0x9f, 0x33, 0x0, 0x33, 0x8c,
+ 0x34, 0x39, 0x34, 0xe5, 0x35, 0x70, 0x36, 0x2,
+ 0x36, 0x2d, 0x36, 0x71, 0x36, 0xb3, 0x37, 0xa,
+ 0x37, 0x28, 0x37, 0x49, 0x37, 0x6b, 0x37, 0x8d,
+ 0x37, 0xb6, 0x37, 0xc6, 0x37, 0xfd, 0x38, 0x2e,
+ 0x38, 0x6f, 0x38, 0x8e, 0x38, 0x9e, 0x38, 0xae,
+ 0x38, 0xbf, 0x38, 0xd5, 0x38, 0xe4, 0x39, 0x7,
+ 0x39, 0x24, 0x39, 0x40, 0x39, 0x70, 0x39, 0xb6,
+ 0x39, 0xd4, 0x39, 0xf4, 0x3a, 0x2f, 0x3a, 0x4e,
+ 0x3a, 0x6e, 0x3a, 0x81, 0x3b, 0x1, 0x3b, 0x88,
+ 0x3c, 0x0, 0x3c, 0x53, 0x3c, 0x74, 0x3c, 0x9e,
+ 0x3c, 0xbe, 0x3c, 0xe3, 0x3d, 0x1d, 0x3d, 0x2c,
+ 0x3d, 0xa7, 0x3e, 0x14, 0xe, 0xe, 0x7c, 0xf7,
+ 0xc, 0x1, 0xf7, 0x9f, 0xb7, 0x3, 0xf7, 0x9f,
+ 0xf7, 0x49, 0x15, 0xb7, 0x6, 0xee, 0xf8, 0x1b,
+ 0x5, 0x3d, 0x6, 0xfb, 0x22, 0xfc, 0xab, 0x15,
+ 0x6e, 0x9d, 0x74, 0xb0, 0xb3, 0xb3, 0xa8, 0xb3,
+ 0xaa, 0x72, 0x9f, 0x68, 0x66, 0x65, 0x69, 0x69,
+ 0x1e, 0xe, 0xf7, 0xdc, 0xf7, 0x7e, 0x12, 0xf7,
+ 0x3e, 0xb6, 0x7d, 0xdb, 0xb5, 0xb5, 0x7e, 0xda,
+ 0x13, 0xd0, 0xf7, 0xd5, 0xf7, 0xdc, 0x15, 0x13,
+ 0xc8, 0xa8, 0x64, 0xa, 0xda, 0x6, 0x13, 0xd0,
+ 0x49, 0xfb, 0x7e, 0x5, 0xfb, 0x55, 0x16, 0x13,
+ 0xb0, 0xa8, 0x64, 0xa, 0xdb, 0x6, 0x13, 0xd0,
+ 0x49, 0xfb, 0x7e, 0x5, 0xe, 0xf7, 0x5e, 0xf7,
+ 0x34, 0xbf, 0xf7, 0x75, 0x1, 0xf7, 0x2a, 0xf7,
+ 0x1a, 0xbb, 0xf7, 0x39, 0x3, 0xf2, 0x4c, 0x15,
+ 0xba, 0x6, 0xc1, 0xf7, 0x69, 0x5, 0xf7, 0x16,
+ 0x6, 0x59, 0xfb, 0x69, 0x5, 0xbb, 0x6, 0xbf,
+ 0xf7, 0x69, 0x5, 0xf2, 0x6, 0x95, 0xbf, 0x5,
+ 0x27, 0x6, 0xb4, 0xf7, 0x34, 0x5, 0xe3, 0x6,
+ 0x95, 0xbf, 0x5, 0x33, 0x6, 0xc1, 0xf7, 0x75,
+ 0x5, 0x5b, 0x6, 0x54, 0xfb, 0x75, 0x83, 0xa,
+ 0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, 0x51, 0xfb,
+ 0x75, 0x5, 0x25, 0x6, 0x81, 0x57, 0x5, 0xf1,
+ 0x6, 0x64, 0xfb, 0x34, 0x5, 0x2f, 0x6, 0x81,
+ 0x57, 0x5, 0xe5, 0x6, 0xca, 0xbf, 0x15, 0xb1,
+ 0xf7, 0x34, 0x5, 0xf7, 0x17, 0x6, 0x66, 0xfb,
+ 0x34, 0x5, 0xe, 0x22, 0x76, 0xf7, 0x2b, 0xc0,
+ 0xf8, 0x40, 0xbf, 0x1, 0xc3, 0xc0, 0xf7, 0xb,
+ 0xc3, 0xf7, 0x28, 0xc5, 0x3, 0xc3, 0x9c, 0x15,
+ 0xc0, 0x6, 0x96, 0xbe, 0xab, 0x77, 0xa9, 0x7d,
+ 0xb9, 0x81, 0x19, 0x6d, 0xfb, 0x2a, 0x51, 0xa,
+ 0xa9, 0xf7, 0x2b, 0x5, 0xf7, 0x0, 0xec, 0xbd,
+ 0xee, 0x8c, 0x1f, 0xd4, 0x45, 0xb1, 0x47, 0xa6,
+ 0x1e, 0x52, 0xa0, 0x2f, 0xa4, 0x89, 0xbc, 0x8,
+ 0xcd, 0xd9, 0xac, 0xcc, 0xba, 0xb6, 0x72, 0x75,
+ 0xad, 0x1e, 0x83, 0x66, 0x6a, 0xa, 0xa8, 0xf7,
+ 0x29, 0x5, 0x55, 0x6, 0x80, 0x54, 0x70, 0x9a,
+ 0x6e, 0x9d, 0x69, 0x8f, 0x19, 0x9f, 0xf7, 0x1,
+ 0x71, 0xa, 0x77, 0x23, 0x5, 0x57, 0x8a, 0xfb,
+ 0x21, 0x71, 0xfb, 0x1d, 0x1a, 0x45, 0xe6, 0x6c,
+ 0xd1, 0x72, 0x1e, 0xcb, 0x74, 0xce, 0x6c, 0x59,
+ 0x1a, 0x51, 0x3e, 0x6f, 0x29, 0x59, 0x5e, 0xa0,
+ 0xaa, 0x6d, 0x1e, 0x94, 0xb9, 0x52, 0xa, 0xe,
+ 0x7c, 0xc4, 0xf7, 0x28, 0xc2, 0xf7, 0x12, 0xc4,
+ 0xf7, 0x1f, 0xc2, 0x12, 0xf7, 0x13, 0xc4, 0xac,
+ 0xc4, 0xc3, 0xc5, 0xab, 0xc5, 0x17, 0xf7, 0x13,
+ 0xf8, 0x6b, 0x6d, 0xa, 0xba, 0x42, 0x35, 0x47,
+ 0x44, 0x3b, 0x1e, 0xc4, 0x94, 0x15, 0xbc, 0xae,
+ 0xb1, 0xc1, 0xad, 0xa2, 0x70, 0x72, 0xa, 0xfb,
+ 0x5, 0xfb, 0xb3, 0x15, 0xf8, 0x61, 0xf7, 0x43,
+ 0x5, 0x13, 0xc5, 0x86, 0xc1, 0xfc, 0x60, 0xfb,
+ 0x45, 0x5, 0xf7, 0x2a, 0xfb, 0x34, 0x6d, 0xa,
+ 0xc3, 0x42, 0x35, 0x47, 0x3b, 0x3b, 0x1e, 0xc4,
+ 0x94, 0x15, 0xbc, 0xae, 0xba, 0xc1, 0xad, 0xa2,
+ 0x67, 0x72, 0xa, 0xe, 0x7c, 0xbd, 0x67, 0xc3,
+ 0xf7, 0x38, 0xc3, 0xf7, 0x6d, 0xbe, 0x12, 0xc0,
+ 0xc0, 0xce, 0xc1, 0x13, 0x7c, 0xf7, 0xe1, 0xbd,
+ 0x15, 0xa6, 0x58, 0x5, 0xf7, 0x2b, 0x6, 0x95,
+ 0xc3, 0x5, 0xfb, 0x11, 0x6, 0x78, 0xae, 0xaf,
+ 0xaf, 0xa5, 0xbd, 0x9b, 0xb6, 0x19, 0xdc, 0x6,
+ 0x95, 0xc3, 0x5, 0xfb, 0xf, 0x6, 0x83, 0x60,
+ 0x72, 0x54, 0x67, 0x63, 0x21, 0xf7, 0x62, 0x18,
+ 0x88, 0x8f, 0x7a, 0xac, 0x8a, 0xab, 0x8, 0xc0,
+ 0xc1, 0xa6, 0xcf, 0xaf, 0xb2, 0x7d, 0x72, 0x9d,
+ 0x1e, 0xa7, 0xbb, 0x5, 0xab, 0x6d, 0x5d, 0x95,
+ 0x5d, 0x1b, 0x39, 0x2e, 0x60, 0x3d, 0x1f, 0x88,
+ 0x65, 0x9c, 0x67, 0x9b, 0x67, 0x8, 0xfb, 0x18,
+ 0x39, 0x79, 0x4b, 0x45, 0x1a, 0x13, 0xbc, 0x57,
+ 0xab, 0x50, 0xe2, 0xc2, 0xc7, 0xa3, 0xb4, 0xb9,
+ 0x1e, 0x76, 0xb9, 0x15, 0x75, 0x6e, 0x60, 0x64,
+ 0x54, 0x1b, 0x60, 0x68, 0xa2, 0xbe, 0x8a, 0x1f,
+ 0xd8, 0xd4, 0xc2, 0xbb, 0xa3, 0x1e, 0xe, 0xf7,
+ 0xee, 0x76, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x86,
+ 0xf7, 0xd9, 0x15, 0xb9, 0x6, 0xd0, 0xf7, 0x81,
+ 0x7b, 0xa, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77,
+ 0x1, 0xf7, 0x3e, 0xbe, 0x3, 0xf7, 0x6e, 0xfb,
+ 0x0, 0x15, 0xbe, 0x6, 0x75, 0xc6, 0x71, 0xe2,
+ 0xeb, 0x1a, 0xf7, 0x4f, 0xee, 0xf7, 0x33, 0xf7,
+ 0x1, 0xf7, 0x22, 0x1e, 0x7a, 0x79, 0x8b, 0x7a,
+ 0x1b, 0xfb, 0x18, 0xfb, 0x37, 0x40, 0xfb, 0x29,
+ 0xfb, 0x46, 0x1a, 0x2c, 0xa1, 0x36, 0xa5, 0x4f,
+ 0x1e, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77, 0x1,
+ 0xf8, 0xd, 0xbf, 0x3, 0xf7, 0x3e, 0xfb, 0x0,
+ 0x15, 0x9c, 0x9d, 0x8b, 0x9c, 0x1b, 0xf7, 0x18,
+ 0xf7, 0x37, 0xd6, 0xf7, 0x29, 0xf7, 0x46, 0x1a,
+ 0xea, 0x74, 0xe0, 0x71, 0xc7, 0x1e, 0x58, 0x6,
+ 0xa1, 0x50, 0xa5, 0x34, 0x2b, 0x1a, 0xfb, 0x4f,
+ 0x29, 0xfb, 0x33, 0xfb, 0x1, 0xfb, 0x22, 0x1e,
+ 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0x8,
+ 0xf8, 0x4, 0x3, 0xf7, 0x1d, 0xf7, 0xb5, 0x15,
+ 0xc0, 0x6b, 0xee, 0xf7, 0xe, 0xbb, 0xfb, 0xe,
+ 0xca, 0xab, 0x4a, 0xf7, 0x12, 0xf7, 0x29, 0xa7,
+ 0x82, 0xcd, 0xfb, 0x24, 0x5e, 0xae, 0xf7, 0x23,
+ 0x5, 0x46, 0x6, 0x74, 0xfb, 0x1d, 0xfb, 0x16,
+ 0xb2, 0x6f, 0x49, 0xf7, 0x17, 0x6e, 0x5, 0xe,
+ 0xf7, 0x79, 0xc1, 0x1, 0xf7, 0x79, 0xc3, 0x3,
+ 0xd5, 0xf7, 0x79, 0x15, 0xf7, 0x55, 0x6, 0x65,
+ 0xfb, 0x4d, 0x51, 0xa, 0xb1, 0xf7, 0x4d, 0x5,
+ 0xf7, 0x54, 0x4d, 0xa, 0xfb, 0x54, 0x6, 0xb1,
+ 0xf7, 0x4f, 0x71, 0xa, 0x65, 0xfb, 0x4f, 0x5,
+ 0xfb, 0x55, 0x6, 0xe, 0x30, 0x76, 0xf7, 0x7e,
+ 0x77, 0x1, 0xf7, 0x55, 0xfb, 0x4, 0x15, 0xcb,
+ 0x75, 0xa, 0xf7, 0x7b, 0xc1, 0x1, 0xec, 0xf8,
+ 0x2a, 0x3, 0xec, 0xf7, 0x7b, 0x15, 0xf8, 0x1e,
+ 0x47, 0xa, 0xfc, 0x1e, 0x6, 0xe, 0x7c, 0xf7,
+ 0x10, 0x1, 0xf7, 0x78, 0xf7, 0x24, 0x3, 0xf7,
+ 0x78, 0xae, 0x35, 0xa, 0xe, 0x3b, 0xf9, 0x59,
+ 0x1, 0xc1, 0xf8, 0x80, 0x3, 0xc1, 0x4f, 0x15,
+ 0xb6, 0x77, 0xf8, 0x55, 0xf9, 0x44, 0x63, 0xa0,
+ 0x5, 0xe, 0x7c, 0xc5, 0xf8, 0x77, 0xc1, 0x1,
+ 0xe5, 0xc0, 0xf7, 0xc8, 0xc6, 0x3, 0xe5, 0xf7,
+ 0x46, 0x15, 0x2f, 0xa8, 0x26, 0xf7, 0xe, 0xf7,
+ 0x78, 0xb4, 0xf7, 0xbe, 0xf7, 0xb, 0xe4, 0x67,
+ 0xe4, 0xfb, 0x3, 0xfb, 0x5a, 0x40, 0xfb, 0x8f,
+ 0xfb, 0x2b, 0x1e, 0xc0, 0x8e, 0x15, 0xf7, 0x13,
+ 0xd0, 0xf7, 0x6e, 0xf7, 0x1d, 0xdf, 0x9d, 0x41,
+ 0x4f, 0xfb, 0x46, 0x3b, 0xfb, 0x43, 0xfb, 0xd,
+ 0x39, 0x72, 0xd3, 0xd1, 0x1e, 0xe, 0x8b, 0xc2,
+ 0x54, 0xc6, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0xad,
+ 0xc2, 0x3, 0xe6, 0x16, 0xf8, 0x2a, 0x36, 0xa,
+ 0xfb, 0x40, 0x6, 0xf2, 0xf8, 0xa3, 0xfb, 0x7c,
+ 0x58, 0x80, 0x53, 0xf7, 0x42, 0xb0, 0x32, 0x7a,
+ 0xa, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc2, 0x54,
+ 0xc6, 0xf8, 0x6b, 0xc0, 0x12, 0xf7, 0x34, 0xc3,
+ 0xf7, 0xaa, 0xc2, 0x13, 0xb8, 0xbe, 0x16, 0xf8,
+ 0x31, 0x6, 0xa3, 0xf7, 0x13, 0x52, 0xa, 0x7e,
+ 0x43, 0x5, 0xfb, 0xa9, 0x6, 0xf7, 0xff, 0xf7,
+ 0x7a, 0xb6, 0xb8, 0xf7, 0x9, 0x1a, 0xd3, 0x39,
+ 0xc8, 0x37, 0x3e, 0x4a, 0x7f, 0x43, 0x49, 0x1e,
+ 0x7c, 0x43, 0x51, 0xa, 0xe5, 0x99, 0xdb, 0x98,
+ 0xc4, 0x1b, 0xd3, 0xc2, 0x65, 0x53, 0x1f, 0x13,
+ 0x78, 0xfb, 0x7, 0xfb, 0x8b, 0xfb, 0xd, 0xfb,
+ 0x4d, 0xfb, 0x1e, 0x1e, 0xe, 0x7c, 0xc2, 0xf7,
+ 0x63, 0xc7, 0xf7, 0x96, 0xc4, 0x1, 0xf8, 0x31,
+ 0xc3, 0x3, 0xd3, 0xa2, 0x15, 0x71, 0xcc, 0xd0,
+ 0x7f, 0xce, 0x1b, 0xf7, 0x10, 0xf7, 0x0, 0xd0,
+ 0xf7, 0x17, 0xd5, 0x4d, 0xa3, 0x6d, 0x92, 0x1f,
+ 0xbd, 0xa4, 0xcc, 0xbb, 0xec, 0x1a, 0xda, 0x38,
+ 0xb3, 0x33, 0x8c, 0x1e, 0x4b, 0x49, 0x79, 0x6a,
+ 0x61, 0x1f, 0x9a, 0x58, 0x5, 0xa4, 0xa8, 0xcb,
+ 0xa3, 0xc9, 0x1b, 0xc6, 0xc2, 0x76, 0x53, 0x4a,
+ 0x39, 0x41, 0x20, 0x1f, 0x88, 0x6, 0x80, 0x4b,
+ 0x5, 0xc8, 0x8e, 0xf7, 0xb, 0x88, 0x43, 0x1a,
+ 0x32, 0x32, 0x59, 0x26, 0x50, 0x57, 0x97, 0xa3,
+ 0x5a, 0x1e, 0xe, 0x8b, 0xc7, 0xf3, 0xc6, 0xf7,
+ 0xa8, 0xcc, 0x1, 0xf7, 0xe8, 0xcd, 0x3, 0xde,
+ 0xf7, 0x38, 0x15, 0xf7, 0xa9, 0x6, 0x77, 0xfb,
+ 0x0, 0x5, 0x20, 0x60, 0xa, 0xf7, 0x91, 0x3c,
+ 0xa, 0x3b, 0x6, 0x9e, 0xf7, 0x0, 0x5, 0xdb,
+ 0x6, 0x96, 0xc6, 0x89, 0xa, 0xcf, 0xf7, 0xe9,
+ 0x5, 0x30, 0x6, 0xfb, 0xd4, 0xfb, 0xf0, 0x5,
+ 0xd8, 0x92, 0x15, 0xf7, 0x96, 0xf7, 0xa8, 0x51,
+ 0xfb, 0xa8, 0x5, 0xe, 0x7c, 0xc6, 0xf7, 0x9f,
+ 0xc6, 0xf7, 0x1e, 0xc3, 0x1, 0xf7, 0x1e, 0xcb,
+ 0xf7, 0x5d, 0xca, 0x3, 0xc2, 0xa5, 0x15, 0x6f,
+ 0xc4, 0xc7, 0x7e, 0xc3, 0x1b, 0xf7, 0x27, 0xf7,
+ 0x12, 0xd6, 0xf7, 0x22, 0xde, 0x45, 0xc8, 0x3a,
+ 0x5c, 0x54, 0x87, 0x72, 0x5d, 0x1f, 0xb2, 0xf7,
+ 0x53, 0x5, 0xf7, 0xb9, 0x3c, 0xa, 0xfb, 0xf1,
+ 0x6, 0x51, 0xfb, 0xc1, 0xb0, 0x81, 0x5, 0x9e,
+ 0xb5, 0xcb, 0x9d, 0xba, 0x1b, 0xd0, 0xb4, 0x63,
+ 0x54, 0x2d, 0x23, 0x50, 0x20, 0x55, 0x54, 0x96,
+ 0xa8, 0x62, 0x1f, 0xe, 0x7c, 0xc6, 0xf7, 0x99,
+ 0x76, 0xf7, 0x84, 0xc3, 0x1, 0xca, 0xc6, 0xf7,
+ 0x9f, 0xc9, 0x3, 0xf7, 0x16, 0xf7, 0x9c, 0x15,
+ 0xf7, 0x25, 0xa5, 0xf7, 0x4e, 0xf7, 0x7, 0xf7,
+ 0x4a, 0x1b, 0x98, 0xc3, 0x5, 0xfb, 0xa5, 0xfb,
+ 0x5d, 0xfb, 0x2f, 0xfb, 0x7c, 0xfb, 0x28, 0xd8,
+ 0x4f, 0xe8, 0xf7, 0x1d, 0xdc, 0xec, 0xf7, 0xc,
+ 0xe6, 0x34, 0xbb, 0x38, 0x4e, 0x50, 0x67, 0x62,
+ 0x6c, 0x1f, 0x83, 0x46, 0x15, 0xbc, 0xa0, 0xc9,
+ 0xb3, 0xca, 0x1b, 0xce, 0xc1, 0x6e, 0x44, 0x45,
+ 0x4e, 0x41, 0x2f, 0x36, 0x63, 0xd9, 0xd8, 0x96,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x91, 0xc2, 0x1,
+ 0xe0, 0xc0, 0xf7, 0xc8, 0xc5, 0x3, 0xf7, 0x32,
+ 0x16, 0xc6, 0x6, 0xf7, 0xb3, 0xf8, 0x8d, 0x96,
+ 0xc6, 0x5, 0xfc, 0x1d, 0x6, 0x66, 0xfb, 0x29,
+ 0x5, 0xc0, 0x6, 0xa6, 0xe9, 0x5, 0xf7, 0xad,
+ 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x6d, 0xc8, 0xf7,
+ 0x5f, 0xc6, 0x1, 0xd3, 0xcb, 0xf7, 0x9b, 0xc9,
+ 0x3, 0xf7, 0x60, 0xf7, 0xb9, 0x15, 0x64, 0x85,
+ 0x2e, 0x4a, 0x31, 0x1a, 0x2b, 0xcf, 0x58, 0xf6,
+ 0xf7, 0x25, 0xea, 0xd8, 0xf7, 0xb, 0xd0, 0x5a,
+ 0xa8, 0x6d, 0x99, 0x1e, 0xc0, 0x93, 0xce, 0xc9,
+ 0xea, 0x1a, 0xc3, 0x54, 0xcd, 0x23, 0xfb, 0x8,
+ 0xfb, 0x3, 0x44, 0xfb, 0xc, 0x1e, 0x8c, 0x5f,
+ 0xa4, 0x6b, 0xaf, 0x77, 0x8, 0x89, 0xec, 0x15,
+ 0xf7, 0x5, 0xf7, 0x6, 0xa1, 0xb0, 0xcf, 0xb9,
+ 0x63, 0x62, 0x41, 0x42, 0x57, 0x39, 0x6d, 0x3b,
+ 0x95, 0xc9, 0x1e, 0x49, 0xfb, 0xa1, 0x15, 0xf7,
+ 0x6, 0xf7, 0xa, 0xa5, 0xba, 0xcb, 0xc7, 0x61,
+ 0x5b, 0x2e, 0x28, 0x62, 0x47, 0x62, 0x3a, 0xa4,
+ 0xc6, 0x1e, 0xe, 0x7d, 0xc7, 0xf7, 0x41, 0xc4,
+ 0xf7, 0x8e, 0xc1, 0x1, 0xf7, 0x25, 0xc4, 0xf7,
+ 0xab, 0xc6, 0x3, 0xc6, 0x7d, 0x15, 0xf8, 0x9,
+ 0xf7, 0x0, 0xf7, 0x55, 0xf7, 0x78, 0xe9, 0x58,
+ 0xda, 0xfb, 0x5, 0xfb, 0x18, 0x28, 0x20, 0xfb,
+ 0x4, 0x1f, 0x42, 0x8c, 0xbf, 0x46, 0xf3, 0x1b,
+ 0xc6, 0xca, 0x93, 0xb6, 0xb4, 0x1f, 0x66, 0xfb,
+ 0xe, 0x26, 0xfb, 0x0, 0xfb, 0x94, 0x8d, 0x8,
+ 0xf8, 0x2e, 0xf7, 0xce, 0x15, 0x64, 0x71, 0x4c,
+ 0x62, 0x42, 0x1b, 0x43, 0x5e, 0xb4, 0xbf, 0xe2,
+ 0xd9, 0xd1, 0xe7, 0xe9, 0xa5, 0x30, 0x3c, 0x80,
+ 0x1f, 0xe, 0x7c, 0xf7, 0x10, 0xf7, 0x2c, 0xf7,
+ 0x10, 0x1, 0xf7, 0x5a, 0xf7, 0x24, 0x3, 0xf7,
+ 0x5a, 0xae, 0x35, 0xa, 0xc6, 0xf7, 0xa8, 0x35,
+ 0xa, 0xe, 0xf7, 0x99, 0xf7, 0x10, 0x1, 0xf7,
+ 0x32, 0xcb, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x32,
+ 0xfb, 0x4, 0x15, 0xcb, 0x6, 0xf7, 0x2a, 0xf7,
+ 0x8f, 0x5, 0x2e, 0x6, 0x9e, 0xf7, 0x40, 0x35,
+ 0xa, 0xe, 0xca, 0x76, 0xf7, 0xfe, 0xcf, 0x1,
+ 0xd4, 0xd5, 0x3, 0xd4, 0xf7, 0x6c, 0x15, 0xf7,
+ 0xfa, 0xfb, 0x42, 0x9c, 0xc9, 0xfb, 0xc1, 0xf7,
+ 0x2d, 0xf8, 0x3, 0xf7, 0x27, 0x98, 0xcf, 0xfc,
+ 0x48, 0xfb, 0x42, 0x5, 0xe, 0xf7, 0x1e, 0xc8,
+ 0xf7, 0x7, 0xc9, 0x1, 0xe0, 0xf7, 0xce, 0x15,
+ 0xf8, 0x56, 0x6, 0x95, 0xc9, 0x5, 0xfc, 0x55,
+ 0x6, 0x61, 0xfb, 0x82, 0x15, 0xf8, 0x54, 0x6,
+ 0x97, 0xc8, 0x5, 0xfc, 0x55, 0x6, 0xe, 0xb5,
+ 0xcf, 0xf7, 0xc0, 0xc9, 0x1, 0xf8, 0x59, 0xd5,
+ 0x3, 0xd4, 0xb5, 0x15, 0xf8, 0x48, 0xf7, 0x42,
+ 0x9d, 0xdd, 0xfb, 0xfa, 0xf7, 0x42, 0x7a, 0x4d,
+ 0xf7, 0xc1, 0xfb, 0x2d, 0xfc, 0x3, 0xfb, 0x27,
+ 0x5, 0xe, 0x7c, 0xf7, 0xa, 0xf7, 0x44, 0xf7,
+ 0x23, 0xeb, 0xc1, 0x12, 0xf7, 0xb, 0xc1, 0x9c,
+ 0xc3, 0xf7, 0x48, 0xc1, 0x17, 0xf7, 0x52, 0xf7,
+ 0x44, 0x15, 0xc3, 0x6, 0x96, 0xc5, 0x5, 0xda,
+ 0x9b, 0xf7, 0x24, 0xc6, 0xf7, 0x17, 0x1a, 0xe0,
+ 0x43, 0xba, 0x2c, 0x50, 0x4b, 0x73, 0x7a, 0x59,
+ 0x1e, 0x13, 0xf4, 0x76, 0xfb, 0x1, 0x5, 0xc1,
+ 0x6, 0x97, 0xc9, 0x5, 0x9a, 0xb1, 0xb5, 0x9e,
+ 0xb3, 0x1b, 0xe7, 0xa8, 0x5e, 0x65, 0x2d, 0xfb,
+ 0x17, 0x5a, 0x36, 0x7e, 0x1f, 0x36, 0xfb, 0x8f,
+ 0x15, 0x70, 0x8c, 0x9f, 0x7b, 0xad, 0x1b, 0xae,
+ 0xb9, 0xa9, 0xb3, 0xa3, 0x75, 0xa3, 0x69, 0x62,
+ 0x63, 0x67, 0x64, 0x8c, 0x1f, 0xe, 0x7d, 0xb0,
+ 0xdf, 0xaf, 0xf7, 0x6e, 0xb0, 0xf7, 0x0, 0xb0,
+ 0x1, 0xb1, 0xb0, 0xeb, 0xb0, 0xf7, 0xe6, 0xb1,
+ 0x3, 0xf7, 0xe4, 0xf7, 0x3e, 0x15, 0x6e, 0x8a,
+ 0xa3, 0x69, 0xba, 0x1b, 0xf0, 0xd8, 0xf7, 0x18,
+ 0xf7, 0xb, 0xf7, 0xb, 0x2c, 0xcd, 0xfb, 0x6,
+ 0xfb, 0x58, 0xfb, 0x21, 0xfb, 0x34, 0xfb, 0x4d,
+ 0x21, 0xbd, 0x21, 0xf7, 0x32, 0xdf, 0xe7, 0xa9,
+ 0xb2, 0xd4, 0x1f, 0x83, 0xaf, 0x5, 0x58, 0x29,
+ 0x42, 0x7a, 0x49, 0x1b, 0x20, 0x47, 0xd1, 0xf5,
+ 0xf7, 0x1c, 0xe4, 0xf7, 0x3f, 0xf7, 0x5a, 0xf0,
+ 0xde, 0x5a, 0x20, 0x2d, 0x4b, 0xfb, 0x5, 0x49,
+ 0x71, 0x74, 0x9f, 0xae, 0x91, 0x1f, 0x90, 0xa2,
+ 0x99, 0xa3, 0x95, 0xa0, 0xc6, 0xf7, 0x12, 0x18,
+ 0x66, 0x6, 0x73, 0x59, 0x5, 0xc2, 0x85, 0x6b,
+ 0x8c, 0x7e, 0x1b, 0x2d, 0x37, 0x23, 0xfb, 0x11,
+ 0x6a, 0x9e, 0x6e, 0xb1, 0xb4, 0xb5, 0xa9, 0xac,
+ 0xa4, 0x1f, 0xad, 0xf7, 0x19, 0x15, 0x4a, 0x7e,
+ 0x50, 0x2c, 0x51, 0x1b, 0x71, 0x85, 0xa1, 0x9f,
+ 0xd8, 0xcd, 0xee, 0xca, 0xb0, 0x8a, 0x62, 0x7a,
+ 0x88, 0x1f, 0xe, 0x8b, 0xc1, 0xf6, 0xc1, 0xf7,
+ 0xb4, 0xc1, 0x1, 0x89, 0xf7, 0x65, 0xf7, 0x48,
+ 0xf7, 0x60, 0x3, 0x89, 0x16, 0xf7, 0x65, 0x2a,
+ 0xa, 0x32, 0x6, 0xca, 0xf7, 0x4, 0x5, 0xf7,
+ 0xab, 0x6, 0xa2, 0xfb, 0x4, 0x2c, 0xa, 0xf8,
+ 0x90, 0x32, 0xa, 0x58, 0xa, 0x4f, 0x6, 0xf7,
+ 0x6c, 0xf7, 0x3a, 0x15, 0xf7, 0x3f, 0xf7, 0xba,
+ 0xcb, 0xfb, 0xba, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x50, 0xc2, 0xf7, 0x67, 0xc1, 0x12, 0xf5, 0xc3,
+ 0xf7, 0xec, 0xc8, 0x62, 0xc7, 0x13, 0xe8, 0x13,
+ 0xe4, 0x98, 0x16, 0xf7, 0xc8, 0x6, 0xf7, 0x1a,
+ 0xf7, 0x5, 0xbd, 0xf7, 0x18, 0x8a, 0x1f, 0xbe,
+ 0x58, 0xae, 0x58, 0x95, 0x1e, 0x13, 0xe8, 0xd2,
+ 0x9e, 0xbd, 0xbb, 0xe9, 0x1a, 0xe8, 0x2c, 0xa9,
+ 0x2a, 0x1e, 0xfb, 0x9e, 0x45, 0xa, 0xdd, 0x6,
+ 0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xf7, 0x51, 0xf7,
+ 0x87, 0x15, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x1d,
+ 0xf7, 0x1a, 0x89, 0x40, 0x2e, 0x24, 0x62, 0x37,
+ 0x1f, 0xfb, 0x45, 0xfb, 0x87, 0x15, 0xb3, 0xf7,
+ 0x50, 0x5, 0xf7, 0x1e, 0x6, 0x13, 0xf8, 0xc7,
+ 0xf5, 0x83, 0x4c, 0x30, 0xfb, 0x3, 0x71, 0x41,
+ 0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7d, 0xc1, 0x8a,
+ 0x77, 0x12, 0xbc, 0xc5, 0x13, 0xd0, 0xf8, 0x6e,
+ 0xf2, 0x15, 0x64, 0x4d, 0x42, 0x70, 0x46, 0x1b,
+ 0x22, 0x51, 0xc9, 0xf7, 0x2, 0xf7, 0x5a, 0xf7,
+ 0x12, 0xf7, 0xb, 0xf7, 0xe, 0xcc, 0xc1, 0x6b,
+ 0x5c, 0xaf, 0x1f, 0x78, 0x30, 0x6a, 0xa, 0x13,
+ 0xb0, 0xb8, 0xf7, 0x73, 0x52, 0xa, 0x7f, 0x4e,
+ 0x5, 0x13, 0xd0, 0xb9, 0x4a, 0x5d, 0x9b, 0x55,
+ 0x1b, 0xfb, 0x54, 0xfb, 0xa, 0xfb, 0x38, 0xfb,
+ 0x61, 0xfb, 0x15, 0xbd, 0x27, 0xf7, 0x2f, 0xdb,
+ 0xdf, 0xa8, 0xb8, 0xd2, 0x1f, 0xe, 0x3e, 0xa,
+ 0xf8, 0xab, 0xc3, 0x3, 0x80, 0x16, 0xf7, 0x87,
+ 0x6, 0xf7, 0x48, 0xf7, 0x47, 0xd7, 0xf7, 0xb6,
+ 0xf7, 0x37, 0xfb, 0x0, 0xac, 0xfb, 0x18, 0x1f,
+ 0xfb, 0x8b, 0x45, 0xa, 0xdb, 0x5e, 0xa, 0x3a,
+ 0x6, 0xf7, 0x1c, 0x16, 0xe6, 0x87, 0xa, 0xf7,
+ 0x5a, 0x85, 0xf7, 0x2, 0x9f, 0xfb, 0x3e, 0x1a,
+ 0xfb, 0x42, 0x23, 0xfb, 0x10, 0xfb, 0x4a, 0x1e,
+ 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa, 0x1,
+ 0x88, 0x16, 0xf8, 0x87, 0x6, 0xb1, 0xf7, 0x4f,
+ 0x62, 0xa, 0x70, 0xfb, 0x19, 0x5, 0xfb, 0xc4,
+ 0x6, 0xb3, 0xf7, 0x5b, 0x5, 0xf7, 0x39, 0x6,
+ 0x7a, 0x3a, 0x51, 0xa, 0xba, 0xf7, 0x6d, 0x62,
+ 0xa, 0x79, 0x39, 0x5, 0xfb, 0x39, 0x6, 0xb4,
+ 0xf7, 0x5d, 0x81, 0xa, 0x70, 0xfb, 0x1a, 0x5,
+ 0xc4, 0x6, 0xb1, 0xf7, 0x50, 0x5, 0xfc, 0x82,
+ 0x45, 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5a, 0x6b,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa,
+ 0x1, 0xe3, 0xc4, 0xf7, 0x54, 0xc3, 0xf7, 0x6,
+ 0xc4, 0x3, 0x88, 0x16, 0xf7, 0xa3, 0x6, 0x97,
+ 0xc1, 0x55, 0xa, 0xb3, 0xf7, 0x5b, 0x5, 0xf7,
+ 0x3a, 0x6, 0x7d, 0x43, 0x51, 0xa, 0xb4, 0xf7,
+ 0x5b, 0x62, 0xa, 0x7c, 0x42, 0x5, 0xfb, 0x3a,
+ 0x6, 0xb3, 0xf7, 0x5d, 0x5, 0xf7, 0xc0, 0x6,
+ 0x6e, 0xfb, 0x23, 0x5, 0xc4, 0x6, 0xb3, 0xf7,
+ 0x59, 0x5, 0xfc, 0x80, 0x45, 0xa, 0xdb, 0x6,
+ 0x2f, 0xfc, 0x5a, 0x89, 0xa, 0xe, 0x79, 0xc2,
+ 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0x9e,
+ 0xc4, 0xf8, 0x2b, 0xc3, 0x3, 0x34, 0xa, 0x3d,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x60, 0xc1, 0xf7,
+ 0x58, 0xc1, 0x1, 0xcb, 0xc1, 0xf7, 0xa8, 0xc1,
+ 0x3, 0x70, 0x16, 0xf7, 0x6a, 0x2a, 0xa, 0x3b,
+ 0x6, 0xb4, 0xf7, 0x60, 0x5, 0xf7, 0xa7, 0x6,
+ 0x63, 0xfb, 0x60, 0x5, 0x3c, 0x2d, 0xa, 0xf7,
+ 0x68, 0x2a, 0xa, 0x3c, 0x6, 0xe5, 0x87, 0xa,
+ 0xda, 0x2a, 0xa, 0xfb, 0x68, 0x2d, 0xa, 0xda,
+ 0x6, 0x64, 0xfb, 0x58, 0x5, 0xfb, 0xa7, 0x6,
+ 0xb1, 0xf7, 0x58, 0x5, 0xdb, 0x2a, 0xa, 0xfb,
+ 0x6a, 0x2d, 0xa, 0xdb, 0x6, 0x31, 0xfc, 0x5a,
+ 0x89, 0xa, 0xe, 0x3e, 0xa, 0xaf, 0x16, 0xf8,
+ 0x2e, 0x47, 0xa, 0xfb, 0x44, 0x6, 0xec, 0x87,
+ 0xa, 0xf7, 0x40, 0x47, 0xa, 0xfc, 0x2a, 0x45,
+ 0xa, 0xf7, 0x43, 0x6, 0x2a, 0x58, 0xa, 0xfb,
+ 0x43, 0x6, 0xe, 0x79, 0xc1, 0xf8, 0x6b, 0xc2,
+ 0x1, 0xa2, 0xc3, 0xf7, 0xec, 0xc1, 0x3, 0x7b,
+ 0xb4, 0x15, 0x65, 0xe2, 0xca, 0x76, 0xce, 0x1b,
+ 0xf7, 0x22, 0xbb, 0x7c, 0xa, 0xf7, 0x15, 0x36,
+ 0xa, 0xfc, 0x12, 0x38, 0xa, 0xf7, 0x5b, 0x6,
+ 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x5f, 0x4d,
+ 0x2d, 0x1b, 0x71, 0xfb, 0x1f, 0x91, 0xf7, 0xe,
+ 0xa3, 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0x3e,
+ 0xa, 0xd7, 0xc1, 0xf7, 0xec, 0xcf, 0x3, 0x7b,
+ 0x16, 0xf7, 0x6d, 0x2a, 0xa, 0x39, 0x6, 0xab,
+ 0xf7, 0x2d, 0xef, 0xdd, 0xa5, 0x5f, 0xb6, 0x41,
+ 0xae, 0x38, 0xa4, 0x33, 0x19, 0xf7, 0x2a, 0x2a,
+ 0xa, 0xfb, 0x9, 0x6, 0x76, 0xd2, 0x65, 0xdd,
+ 0x62, 0xcc, 0x8, 0x8b, 0x76, 0xad, 0x82, 0x9a,
+ 0x1e, 0xf7, 0x81, 0xf7, 0x4f, 0x5, 0xcb, 0x43,
+ 0xa, 0xd2, 0x6, 0xfb, 0xbf, 0xfb, 0x7f, 0xc3,
+ 0xf7, 0x7f, 0x5, 0xd0, 0x2a, 0xa, 0xfb, 0x6b,
+ 0x2d, 0xa, 0xe7, 0x6, 0x26, 0x58, 0xa, 0x3a,
+ 0x6, 0xe, 0x3e, 0xa, 0xf7, 0xb, 0xc3, 0x3,
+ 0x8b, 0x4, 0xf8, 0x96, 0x6, 0xb9, 0xf7, 0x87,
+ 0x71, 0xa, 0x68, 0xfb, 0x51, 0x5, 0xfb, 0xba,
+ 0x6, 0xe7, 0x87, 0xa, 0xf7, 0x14, 0x2a, 0xa,
+ 0xfb, 0xb9, 0x2d, 0xa, 0xf7, 0x0, 0x5e, 0xa,
+ 0xfb, 0x0, 0x6, 0xe, 0x3e, 0xa, 0x9f, 0xc3,
+ 0xf7, 0xfc, 0xc3, 0x3, 0x63, 0x16, 0xf7, 0x3c,
+ 0x47, 0xa, 0x4b, 0x6, 0xe6, 0x87, 0xa, 0x94,
+ 0x6, 0xd4, 0xfc, 0xf, 0x5, 0xb7, 0x6, 0xf7,
+ 0x73, 0xf8, 0xf, 0x5, 0x96, 0x5e, 0xa, 0x4f,
+ 0x5f, 0xa, 0xf7, 0x36, 0x2a, 0xa, 0x5c, 0x6,
+ 0xe6, 0x87, 0xa, 0xb9, 0x47, 0xa, 0xfb, 0x28,
+ 0x6, 0xfb, 0x5e, 0xfb, 0xec, 0x48, 0xf7, 0xec,
+ 0x5, 0xfb, 0x2b, 0x5f, 0xa, 0xbb, 0x5e, 0xa,
+ 0x5b, 0x6, 0xe, 0x8a, 0xc2, 0xf8, 0x59, 0xc2,
+ 0x1, 0x5e, 0x8a, 0x15, 0xf7, 0x80, 0x36, 0xa,
+ 0x28, 0x6, 0xe1, 0xf8, 0x41, 0xf7, 0x54, 0xfc,
+ 0x78, 0x5, 0xd6, 0x6, 0xf0, 0xf8, 0x90, 0x5,
+ 0xd8, 0x36, 0xa, 0xfb, 0x7b, 0x38, 0xa, 0xed,
+ 0x6, 0x35, 0xfc, 0x44, 0xfb, 0x53, 0xf8, 0x7b,
+ 0x5, 0xfb, 0x31, 0x56, 0xa, 0xdd, 0x6, 0x31,
+ 0xfc, 0x59, 0x5, 0x3a, 0x6, 0xe, 0x79, 0xc2,
+ 0xf8, 0x7c, 0xc2, 0x1, 0xad, 0xc2, 0xf8, 0x38,
+ 0xc3, 0x3, 0xad, 0xf7, 0x6c, 0x15, 0xfb, 0x19,
+ 0xd5, 0x26, 0xf7, 0x1c, 0xf7, 0x4b, 0xf7, 0x1e,
+ 0xf7, 0x4f, 0xf7, 0x50, 0xee, 0x5c, 0xf7, 0x10,
+ 0xfb, 0x33, 0xfb, 0x5a, 0xfb, 0x13, 0xfb, 0x5c,
+ 0xfb, 0x38, 0x1e, 0xc2, 0x89, 0x15, 0xf7, 0x3,
+ 0xdd, 0xf7, 0x5c, 0xf7, 0x43, 0xf7, 0x10, 0xb2,
+ 0x2e, 0x3c, 0xfb, 0x24, 0xfb, 0xb, 0xfb, 0x40,
+ 0xfb, 0x1b, 0x20, 0x50, 0xd9, 0xee, 0x1e, 0xe,
+ 0x8b, 0xc1, 0xf7, 0x31, 0xc1, 0xf7, 0x87, 0xc1,
+ 0x1, 0xf6, 0xc5, 0xf7, 0xfa, 0xc6, 0x3, 0x9c,
+ 0x16, 0xf7, 0xba, 0x2a, 0xa, 0xfb, 0x31, 0x6,
+ 0xab, 0xf7, 0x31, 0x5, 0xf7, 0x1a, 0x6, 0xf7,
+ 0x31, 0xe9, 0xcf, 0xf7, 0x27, 0xd2, 0x5c, 0xcc,
+ 0xfb, 0x15, 0x1f, 0xfb, 0xa7, 0x2d, 0xa, 0xdb,
+ 0x6, 0x2e, 0x58, 0xa, 0x3c, 0x6, 0xf7, 0x47,
+ 0xf7, 0x67, 0x15, 0xbc, 0xf7, 0x87, 0x5, 0xf7,
+ 0x1b, 0x6, 0xd0, 0xca, 0x6b, 0x52, 0xfb, 0x11,
+ 0x20, 0x6e, 0x4a, 0x1f, 0xe, 0xfb, 0x1e, 0xf7,
+ 0x41, 0xfb, 0x15, 0xf7, 0x15, 0x54, 0xc2, 0xf8,
+ 0x7e, 0xc2, 0x12, 0xae, 0xc7, 0xf8, 0x2f, 0xc6,
+ 0x13, 0x5c, 0xd9, 0x3f, 0x15, 0x91, 0x54, 0x5,
+ 0xaa, 0xb4, 0xb2, 0x91, 0xb2, 0x1b, 0xaa, 0xaa,
+ 0x7c, 0x80, 0xab, 0x1f, 0x13, 0x9c, 0x82, 0xa6,
+ 0xa6, 0x82, 0xa6, 0x1b, 0xae, 0xaf, 0x9b, 0x9f,
+ 0xa7, 0x1f, 0x7b, 0xba, 0x5, 0x7f, 0x73, 0x6f,
+ 0x7d, 0x70, 0x1b, 0x75, 0x75, 0x94, 0x94, 0x75,
+ 0x1f, 0x94, 0x74, 0x74, 0x98, 0x70, 0x1b, 0x7c,
+ 0x7a, 0x8c, 0x86, 0x7a, 0x1f, 0x13, 0x3c, 0xa9,
+ 0x9a, 0x8d, 0x8b, 0x95, 0x95, 0x8, 0xf7, 0x5f,
+ 0x8a, 0xf7, 0x12, 0xf7, 0x4a, 0xf7, 0x64, 0x1a,
+ 0xf7, 0x1, 0x5e, 0xf1, 0xfb, 0x33, 0xfb, 0x4f,
+ 0xfb, 0x1f, 0xfb, 0x5d, 0xfb, 0x4c, 0x23, 0xbd,
+ 0x3e, 0xeb, 0x6e, 0x1e, 0x6a, 0x70, 0x6a, 0x7a,
+ 0x66, 0x7a, 0x8, 0x9c, 0xf7, 0xa3, 0x15, 0xf7,
+ 0x2b, 0xf7, 0x1, 0xf7, 0x47, 0xf7, 0x25, 0xf1,
+ 0xc2, 0x4c, 0x36, 0xfb, 0x60, 0xfb, 0x26, 0xfb,
+ 0x1e, 0xfb, 0x0, 0x40, 0x39, 0xb0, 0xf7, 0xf,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x45, 0xbf, 0xf7,
+ 0x75, 0xc1, 0x1, 0xf7, 0x4, 0xc2, 0xf7, 0xf9,
+ 0xc3, 0x3, 0x9f, 0x16, 0xf7, 0x6c, 0x2a, 0xa,
+ 0x3b, 0x6, 0xae, 0xf7, 0x43, 0x5, 0xf7, 0x7,
+ 0x6, 0xa8, 0x5c, 0xcc, 0xfb, 0x6, 0xa4, 0x47,
+ 0x8, 0xf7, 0x18, 0x2a, 0xa, 0x24, 0x6, 0x73,
+ 0xc1, 0x60, 0xd6, 0x6d, 0xbb, 0x8, 0xe5, 0x8e,
+ 0xf7, 0x3, 0xb6, 0xf7, 0x33, 0x1a, 0xcb, 0x59,
+ 0xc9, 0x29, 0x1e, 0xfb, 0xbf, 0x2d, 0xa, 0xdc,
+ 0x5e, 0xa, 0x3a, 0x6, 0xf7, 0x4a, 0xf7, 0x79,
+ 0x15, 0xb8, 0xf7, 0x75, 0x5, 0xf7, 0x24, 0x6,
+ 0xd6, 0xba, 0x6c, 0x60, 0xfb, 0x26, 0xfb, 0x1c,
+ 0x86, 0x42, 0x1f, 0xe, 0x77, 0xc5, 0xf8, 0x7b,
+ 0xc2, 0x1, 0xf7, 0xc, 0xc7, 0xf7, 0xbc, 0xc7,
+ 0x3, 0x98, 0x7f, 0x15, 0xc5, 0x6, 0x95, 0xbf,
+ 0x5, 0x65, 0xc1, 0xd6, 0x75, 0xd5, 0x1b, 0xf7,
+ 0x8, 0xf7, 0x1c, 0xbe, 0xf7, 0x5, 0xf7, 0x5,
+ 0x2d, 0x9f, 0x31, 0x95, 0x1f, 0x3d, 0x93, 0x2d,
+ 0xaa, 0xcf, 0x1a, 0xdf, 0xe3, 0xba, 0xf2, 0xc3,
+ 0xbc, 0x6f, 0x68, 0xab, 0x1e, 0x7a, 0x3b, 0x5,
+ 0xc5, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x82,
+ 0x63, 0x5, 0xa6, 0x68, 0x58, 0xa3, 0x54, 0x1b,
+ 0xfb, 0x3a, 0x2d, 0x3a, 0x20, 0xfb, 0x6, 0xf7,
+ 0xd, 0x6d, 0xe5, 0x7d, 0x1f, 0xc8, 0x80, 0xdf,
+ 0x82, 0x43, 0x1a, 0x47, 0x24, 0x67, 0x2f, 0x42,
+ 0x41, 0xa1, 0xb5, 0x63, 0x1e, 0x9a, 0xd0, 0x5,
+ 0x50, 0x6, 0xe, 0x3e, 0xa, 0xf7, 0x54, 0xc2,
+ 0x3, 0xc5, 0x16, 0xf7, 0xc2, 0x2a, 0xa, 0xfb,
+ 0x10, 0x6, 0xe5, 0x87, 0xa, 0xf7, 0x43, 0x6,
+ 0x6d, 0xfb, 0x2d, 0x6a, 0xa, 0xb4, 0xf7, 0x63,
+ 0x5, 0xfc, 0x98, 0x6, 0x62, 0xfb, 0x63, 0x6a,
+ 0xa, 0xa9, 0xf7, 0x2d, 0x5, 0xf7, 0x43, 0x6,
+ 0x32, 0x58, 0xa, 0xfb, 0xf, 0x6, 0xe, 0x79,
+ 0xbf, 0xf8, 0x6d, 0xc2, 0x1, 0xd2, 0xc0, 0x3,
+ 0xbf, 0xf8, 0x8f, 0x85, 0xa, 0x56, 0xfb, 0x8c,
+ 0x81, 0x46, 0x68, 0x1a, 0x22, 0xb3, 0x47, 0xf7,
+ 0x16, 0xf7, 0x11, 0xe2, 0xc4, 0xf7, 0x2d, 0xa8,
+ 0x1e, 0x9f, 0xf4, 0x9e, 0xf4, 0x9f, 0xf4, 0x8,
+ 0xd8, 0x36, 0xa, 0xfb, 0x7c, 0x67, 0xa, 0xad,
+ 0xae, 0x8b, 0xad, 0x1b, 0x77, 0x22, 0x78, 0x23,
+ 0x77, 0x22, 0x8, 0xfb, 0xe, 0x73, 0x3c, 0x66,
+ 0x3d, 0x1b, 0x32, 0x66, 0xb7, 0xdb, 0xbf, 0xb4,
+ 0xf7, 0x49, 0x9f, 0xf7, 0x8, 0x1f, 0xf5, 0x36,
+ 0xa, 0xfb, 0x83, 0x6, 0xe, 0x93, 0x76, 0xf8,
+ 0x9c, 0xc2, 0x1, 0xf7, 0x31, 0x7e, 0x85, 0xa,
+ 0xf7, 0xbb, 0xf8, 0x9c, 0x5, 0xcb, 0x36, 0xa,
+ 0xfb, 0x70, 0x38, 0xa, 0xe5, 0x6, 0xfb, 0x99,
+ 0xfc, 0x64, 0x3a, 0xf8, 0x64, 0x5, 0xe6, 0x46,
+ 0xa, 0xfb, 0x77, 0x38, 0xa, 0xd3, 0x6, 0xe,
+ 0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0xb1, 0xc5,
+ 0x3, 0x9c, 0x7e, 0x15, 0xcb, 0x6, 0xf7, 0x4b,
+ 0xf8, 0x0, 0xbe, 0xfc, 0x0, 0x5, 0xc6, 0x6,
+ 0xf7, 0x32, 0xf8, 0x9c, 0x5, 0xb7, 0x46, 0xa,
+ 0xfb, 0x5d, 0x56, 0xa, 0xf2, 0x6, 0xfb, 0xe,
+ 0xfc, 0x36, 0x58, 0xf8, 0x0, 0x5, 0x63, 0x6,
+ 0xfb, 0x4f, 0xfc, 0x2, 0xaf, 0xf8, 0x38, 0x5,
+ 0xef, 0x36, 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xba,
+ 0x6, 0xe, 0x3e, 0xa, 0x71, 0xf7, 0x76, 0xf7,
+ 0x9, 0xf7, 0x6a, 0x3, 0x71, 0x16, 0xf7, 0x76,
+ 0x2a, 0xa, 0x2b, 0x6, 0xf7, 0x53, 0xf7, 0x50,
+ 0xf7, 0x0, 0xfb, 0x50, 0x5, 0x35, 0x2d, 0xa,
+ 0xf7, 0x6a, 0x2a, 0xa, 0x4a, 0x6, 0xfb, 0x18,
+ 0xf7, 0x7b, 0xf7, 0x5f, 0xf7, 0x73, 0x5, 0xce,
+ 0x2a, 0xa, 0xfb, 0x55, 0x2d, 0xa, 0xca, 0x6,
+ 0xfb, 0x37, 0xfb, 0x49, 0x2c, 0xf7, 0x49, 0x5,
+ 0xd8, 0x2a, 0xa, 0xfb, 0x64, 0x45, 0xa, 0xcf,
+ 0x6, 0xf7, 0x9, 0xfb, 0x73, 0xfb, 0x79, 0xfb,
+ 0x7b, 0x5, 0x49, 0x6, 0xe, 0x3e, 0xa, 0xb4,
+ 0x16, 0xf7, 0xc8, 0x2a, 0xa, 0xfb, 0x11, 0x6,
+ 0xab, 0xf7, 0x42, 0xf7, 0x7f, 0xf7, 0xac, 0x5,
+ 0xcf, 0x2a, 0xa, 0xfb, 0x5b, 0x2d, 0xa, 0xd2,
+ 0x6, 0xfb, 0x54, 0xfb, 0x77, 0x27, 0xf7, 0x77,
+ 0x5, 0xd3, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0xe,
+ 0xfb, 0xac, 0x6b, 0xfb, 0x42, 0x5, 0xfb, 0x12,
+ 0x6, 0xe, 0x3e, 0xa, 0xba, 0xd3, 0xf7, 0xda,
+ 0xc0, 0x3, 0xb1, 0x16, 0xf8, 0x38, 0x6, 0xb3,
+ 0xf7, 0x5f, 0x5, 0x56, 0x6, 0x6e, 0xfb, 0x29,
+ 0x5, 0xfb, 0xbd, 0x6, 0xf8, 0x46, 0xf8, 0x5d,
+ 0x94, 0xbe, 0x5, 0xfc, 0x19, 0x6, 0x66, 0xfb,
+ 0x50, 0x5, 0xbe, 0x6, 0xa5, 0xf7, 0x1a, 0x5,
+ 0xf7, 0xa0, 0x6, 0xfc, 0x46, 0xfc, 0x5b, 0x5,
+ 0xe, 0xfb, 0x0, 0xc1, 0xf9, 0x2, 0xc1, 0x1,
+ 0xf7, 0x1c, 0xfb, 0x0, 0x15, 0xf7, 0x4e, 0x2a,
+ 0xa, 0xfb, 0x19, 0x6, 0xf7, 0xc, 0xf9, 0x2,
+ 0x5, 0xf7, 0x19, 0x2a, 0xa, 0xfb, 0x4e, 0x6,
+ 0xe, 0x23, 0xf9, 0x60, 0xfd, 0x33, 0x76, 0xf9,
+ 0x59, 0x77, 0x12, 0x13, 0x60, 0xf8, 0xb, 0xfb,
+ 0xd, 0x15, 0x13, 0x80, 0xba, 0x9c, 0x5, 0x13,
+ 0x60, 0xfb, 0x5a, 0xf9, 0x71, 0x5, 0x13, 0x80,
+ 0x5c, 0x7a, 0x5, 0xe, 0xfb, 0x0, 0xc1, 0xf9,
+ 0x2, 0xc1, 0x1, 0xf7, 0x27, 0x55, 0x15, 0x80,
+ 0x55, 0x5, 0xf7, 0x4e, 0x6, 0xf7, 0x22, 0xf9,
+ 0x6e, 0x5, 0xfb, 0x4e, 0x2d, 0xa, 0xf7, 0x19,
+ 0x6, 0xfb, 0xc, 0xfd, 0x2, 0x5, 0xe, 0xf7,
+ 0xf7, 0xf7, 0x9f, 0x12, 0xf2, 0xf8, 0x27, 0x17,
+ 0xe9, 0xf7, 0xf6, 0x15, 0xdc, 0xa6, 0xe1, 0xc6,
+ 0xce, 0xc4, 0xb9, 0x4f, 0xc1, 0x53, 0xd0, 0x71,
+ 0x94, 0xba, 0x18, 0x3b, 0xd7, 0x7c, 0xb8, 0x78,
+ 0xee, 0x8, 0x58, 0x6, 0x13, 0x40, 0x58, 0x2d,
+ 0x3c, 0x54, 0xfb, 0x0, 0x43, 0x8, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, 0x59,
+ 0x5, 0xf8, 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe,
+ 0x65, 0xa, 0xf7, 0x61, 0xf8, 0xeb, 0x15, 0xf7,
+ 0x46, 0x25, 0x97, 0xaa, 0xfb, 0x31, 0x79, 0xa,
+ 0xf8, 0x20, 0x87, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+ 0x36, 0x6, 0xbf, 0xf7, 0x97, 0x8b, 0x9e, 0x9b,
+ 0x1a, 0xc7, 0x5a, 0xaf, 0x25, 0x46, 0x36, 0x77,
+ 0x73, 0x4b, 0x1e, 0x39, 0xa, 0xc8, 0xc1, 0x8c,
+ 0x54, 0x77, 0x87, 0x5c, 0x85, 0x73, 0x1f, 0x92,
+ 0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x45, 0x41,
+ 0x38, 0x3f, 0x52, 0xb9, 0x56, 0xe6, 0xd8, 0xda,
+ 0xaf, 0xc0, 0xcd, 0x1f, 0x98, 0xd2, 0x15, 0x50,
+ 0x4b, 0x3e, 0x5d, 0x38, 0x1b, 0x56, 0x66, 0xa8,
+ 0xab, 0xdb, 0xf7, 0x7, 0x9c, 0xdb, 0x40, 0xa,
+ 0x7c, 0xc2, 0x5f, 0xc3, 0xf7, 0xe8, 0xc3, 0xf7,
+ 0x12, 0xc2, 0x12, 0xf8, 0xb0, 0xc5, 0x13, 0x78,
+ 0x8d, 0x87, 0x15, 0xf7, 0x21, 0x6, 0x9a, 0xdb,
+ 0x5, 0x13, 0xb8, 0x7b, 0x96, 0xa8, 0x40, 0xf7,
+ 0x14, 0x1b, 0xf7, 0x33, 0xf7, 0x5, 0xf7, 0x18,
+ 0xf7, 0x2f, 0xf7, 0x7, 0x32, 0xc8, 0x30, 0xfb,
+ 0x1, 0x46, 0x56, 0x72, 0x75, 0x1f, 0xbe, 0xf7,
+ 0x97, 0x66, 0xa, 0xe0, 0x6, 0x13, 0x78, 0x24,
+ 0xfc, 0x9e, 0x5, 0x35, 0x6, 0xf7, 0x48, 0xf7,
+ 0x45, 0x15, 0xf5, 0xa0, 0xed, 0xc4, 0xe4, 0x1b,
+ 0xea, 0xb7, 0x4c, 0x48, 0x1f, 0x13, 0xb8, 0xfb,
+ 0xe, 0xfb, 0x1, 0x27, 0x26, 0x3a, 0x3a, 0xcb,
+ 0xf7, 0x11, 0xa4, 0x1e, 0xe, 0x7c, 0xc0, 0xf7,
+ 0xf0, 0xc2, 0x12, 0xbc, 0xc5, 0xf7, 0xf5, 0xc2,
+ 0x17, 0xf8, 0x71, 0xf7, 0x9, 0x15, 0x76, 0x6d,
+ 0x31, 0x51, 0x3a, 0x1b, 0xfb, 0xe, 0x5c, 0xcd,
+ 0xc8, 0x1f, 0x13, 0x50, 0xf7, 0x5, 0xe8, 0xf7,
+ 0x0, 0xf7, 0x17, 0xc4, 0xbe, 0x7c, 0x67, 0xaf,
+ 0x1e, 0x7c, 0x3c, 0x6a, 0xa, 0x13, 0xe0, 0xaf,
+ 0xf7, 0x4d, 0x52, 0xa, 0x82, 0x5c, 0x5, 0xa9,
+ 0x63, 0x5d, 0x9c, 0x51, 0x1b, 0xfb, 0x5b, 0x2c,
+ 0xfb, 0x29, 0xfb, 0x15, 0xfb, 0x5, 0xe5, 0x4a,
+ 0xf7, 0x2, 0xe8, 0xd8, 0xab, 0xb9, 0xd0, 0x1f,
+ 0xe, 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe7, 0xc2,
+ 0xf7, 0x13, 0xc2, 0x12, 0xa1, 0xc5, 0x13, 0x78,
+ 0xf8, 0x1f, 0x89, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+ 0x39, 0x6, 0xf7, 0x6, 0xf8, 0xd4, 0x5, 0xfb,
+ 0x58, 0x38, 0xa, 0xf7, 0x20, 0x6, 0x65, 0xfb,
+ 0x57, 0x5, 0xc9, 0x64, 0x46, 0x91, 0x54, 0x1b,
+ 0xfb, 0x33, 0xfb, 0x14, 0xfb, 0x16, 0xfb, 0x2c,
+ 0x1f, 0x13, 0xb8, 0x2a, 0xca, 0x38, 0xf7, 0x14,
+ 0xd4, 0xd8, 0xac, 0xc9, 0xbb, 0x1e, 0x13, 0x78,
+ 0xfb, 0xdf, 0xf7, 0x0, 0x15, 0xf4, 0xf3, 0xee,
+ 0xf7, 0x3, 0xf7, 0x0, 0xb2, 0x53, 0x52, 0x1e,
+ 0x13, 0xb8, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0xa,
+ 0xfb, 0x0, 0x26, 0x5f, 0xd1, 0xd9, 0x1e, 0xe,
+ 0x7c, 0xc0, 0xf7, 0x31, 0xc2, 0xf7, 0x21, 0xbd,
+ 0x1, 0xe4, 0xf7, 0x57, 0x15, 0xf8, 0x3b, 0x6,
+ 0x90, 0xa4, 0x8d, 0xa4, 0x8a, 0xa3, 0x8, 0xea,
+ 0x88, 0x51, 0xd8, 0xfb, 0x17, 0x1b, 0xfb, 0x35,
+ 0xfb, 0x1e, 0xfb, 0x19, 0xfb, 0x3d, 0x35, 0xd3,
+ 0x47, 0xf7, 0x21, 0xde, 0xe5, 0xa5, 0xaf, 0xd4,
+ 0x1f, 0x84, 0xbf, 0x5, 0x60, 0x32, 0x38, 0x79,
+ 0x5c, 0x1b, 0xfb, 0x7, 0x30, 0xc0, 0xf3, 0xae,
+ 0x1f, 0x9c, 0xc3, 0x15, 0xc6, 0x9f, 0xda, 0xdc,
+ 0xf7, 0x7, 0x1b, 0xf7, 0x21, 0x92, 0xfb, 0x8,
+ 0x72, 0x86, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0xd9,
+ 0xc3, 0xf7, 0x1e, 0xc2, 0x1, 0xf7, 0x26, 0xc5,
+ 0x3, 0xa5, 0x16, 0xf8, 0x18, 0x36, 0xa, 0xfb,
+ 0x71, 0x6, 0xcb, 0xf7, 0xd9, 0x5, 0xf7, 0x71,
+ 0x3c, 0xa, 0xfb, 0x71, 0x6, 0xf7, 0x11, 0xab,
+ 0x87, 0x98, 0xf7, 0x9, 0x1b, 0xb2, 0xc3, 0x85,
+ 0x85, 0xaf, 0x1f, 0x9e, 0xc1, 0x5, 0x90, 0x6a,
+ 0x49, 0x93, 0x61, 0x1b, 0x3d, 0x31, 0x82, 0x3f,
+ 0x79, 0x1f, 0x71, 0xfb, 0x0, 0x5, 0xfb, 0x1,
+ 0x6, 0x81, 0x53, 0x5, 0xf7, 0x1, 0x6, 0x4a,
+ 0xfb, 0xd9, 0x57, 0xa, 0xe, 0xfb, 0x31, 0xbd,
+ 0xf7, 0x38, 0xbe, 0xf7, 0xae, 0xbe, 0x1, 0xab,
+ 0xc3, 0xf7, 0xca, 0xbf, 0x3, 0x3f, 0xa, 0x30,
+ 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xca, 0xc2, 0xf7,
+ 0x2e, 0xc2, 0x1, 0x9f, 0x16, 0xf7, 0x72, 0x36,
+ 0xa, 0x38, 0x6, 0xbf, 0xf7, 0x99, 0x5, 0xb6,
+ 0xc3, 0xd2, 0xb7, 0xcc, 0x1b, 0xdf, 0x90, 0x59,
+ 0x54, 0x81, 0x1f, 0x5a, 0xfb, 0x87, 0x5, 0x37,
+ 0x38, 0xa, 0xf7, 0x6f, 0x36, 0xa, 0x3a, 0x6,
+ 0xc0, 0xf7, 0x9d, 0x5, 0xca, 0x97, 0x85, 0xd6,
+ 0xfb, 0xa, 0x1b, 0x45, 0x40, 0x66, 0x5e, 0x4f,
+ 0x1f, 0xba, 0xf7, 0x91, 0x66, 0xa, 0xe2, 0x6,
+ 0x25, 0xfc, 0x9b, 0x7b, 0xa, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xda, 0xc2, 0xed, 0xf7, 0xf, 0x1, 0xf7,
+ 0xe6, 0xf8, 0xaa, 0x15, 0xd1, 0x6, 0xa4, 0xf7,
+ 0xf, 0x5, 0x44, 0x6, 0xfb, 0xb8, 0xfd, 0x25,
+ 0x15, 0xf8, 0x2d, 0x36, 0xa, 0xfb, 0x42, 0x6,
+ 0xd4, 0xf8, 0x11, 0x5, 0xfb, 0x5b, 0x38, 0xa,
+ 0xf7, 0x25, 0x6, 0x4b, 0xfb, 0xda, 0x5, 0xfb,
+ 0x47, 0x6, 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x84,
+ 0xbf, 0xe9, 0xf7, 0xa, 0x1, 0xf8, 0x50, 0xf8,
+ 0xaf, 0x54, 0xa, 0xfc, 0x23, 0xfd, 0x80, 0x15,
+ 0x76, 0x59, 0x5, 0x82, 0xbe, 0xbe, 0x84, 0xbb,
+ 0x1b, 0xf6, 0xe0, 0xb6, 0xf7, 0x12, 0xaf, 0x1f,
+ 0xea, 0xf8, 0x45, 0x5, 0xfb, 0xe2, 0x82, 0xa,
+ 0xf7, 0xa5, 0x6, 0x39, 0xfc, 0x3, 0x5, 0xfb,
+ 0x9, 0x61, 0x46, 0x7f, 0x5c, 0x1b, 0x51, 0x5c,
+ 0x91, 0x91, 0x68, 0x1f, 0xe, 0x8b, 0xc2, 0xf7,
+ 0xd9, 0xc2, 0xf7, 0x1f, 0xc2, 0x1, 0x97, 0x16,
+ 0xf7, 0x20, 0x6, 0xb1, 0xf7, 0x5a, 0xcd, 0xb5,
+ 0xad, 0x6a, 0xcd, 0x31, 0xb0, 0x4d, 0x19, 0x53,
+ 0x38, 0xa, 0xf7, 0x6a, 0x46, 0xa, 0x2b, 0x6,
+ 0x6d, 0xba, 0x6d, 0xc5, 0x67, 0xb3, 0x4f, 0xcf,
+ 0x18, 0xf7, 0x47, 0xf7, 0x4, 0x5, 0xed, 0x77,
+ 0xa, 0xfb, 0x70, 0x6, 0x82, 0x54, 0x5, 0xb9,
+ 0x6, 0xfb, 0x5f, 0xfb, 0x13, 0xd5, 0xf8, 0xc,
+ 0x66, 0xa, 0xe1, 0x6, 0x26, 0xfc, 0x9b, 0x5,
+ 0x36, 0x6, 0xe, 0x8b, 0xc2, 0xf8, 0x9b, 0xc2,
+ 0x1, 0xe5, 0x16, 0xf8, 0x2d, 0x36, 0xa, 0xfb,
+ 0x43, 0x6, 0xf7, 0x1, 0xf8, 0xd2, 0x5, 0xfb,
+ 0x6b, 0x38, 0xa, 0xf7, 0x34, 0x6, 0x29, 0xfc,
+ 0x9b, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc1,
+ 0xf7, 0xe0, 0xc2, 0x7e, 0x77, 0x12, 0x13, 0xc0,
+ 0x91, 0x16, 0xf7, 0x11, 0x47, 0xa, 0x49, 0x6,
+ 0xc5, 0xf7, 0xa2, 0x5, 0xa7, 0xa6, 0xac, 0xad,
+ 0xbb, 0x1b, 0xbc, 0x96, 0x6d, 0x72, 0x7d, 0x88,
+ 0x7f, 0x8a, 0x87, 0x1f, 0x4c, 0xfb, 0xc1, 0x5,
+ 0xf7, 0x12, 0x2a, 0xa, 0x49, 0x6, 0xc2, 0xf7,
+ 0x97, 0x5, 0x96, 0x8d, 0xca, 0xcb, 0xc0, 0x1b,
+ 0xb3, 0x97, 0x77, 0x72, 0x78, 0x86, 0x74, 0x87,
+ 0x78, 0x1f, 0x50, 0xfb, 0xae, 0x5, 0xf7, 0x7,
+ 0x2a, 0xa, 0x53, 0x6, 0xc5, 0xf7, 0xa5, 0x8d,
+ 0x9b, 0x99, 0x1a, 0xba, 0x6d, 0xb0, 0x4c, 0x55,
+ 0x5a, 0x69, 0x67, 0x66, 0x1e, 0xb0, 0x83, 0x6e,
+ 0xac, 0x55, 0x1b, 0x5b, 0x64, 0x69, 0x74, 0x68,
+ 0x1f, 0x13, 0xa0, 0x93, 0xb7, 0x5, 0xfb, 0x7,
+ 0x5f, 0xa, 0xc3, 0x6, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xc8, 0xc2, 0x6d, 0xc1, 0x12, 0xf7, 0x7, 0xc1,
+ 0xf7, 0xa5, 0xc1, 0x13, 0xd8, 0x9f, 0x16, 0xf7,
+ 0x72, 0x2a, 0xa, 0x37, 0x6, 0xbb, 0xf7, 0x86,
+ 0x5, 0x13, 0xb8, 0xbf, 0xc9, 0xe1, 0xb2, 0xd6,
+ 0x1b, 0xb5, 0x97, 0x79, 0x6a, 0x82, 0x8a, 0x81,
+ 0x89, 0x80, 0x1f, 0x5a, 0xfb, 0x90, 0x5, 0x38,
+ 0x2d, 0xa, 0xf7, 0x70, 0x2a, 0xa, 0x38, 0x6,
+ 0xbd, 0xf7, 0x91, 0x5, 0x8f, 0x9e, 0x8c, 0x9c,
+ 0x9b, 0x1a, 0xbf, 0x62, 0xa9, 0x40, 0x45, 0x3f,
+ 0x63, 0x5e, 0x4f, 0x1e, 0x99, 0xd3, 0x5, 0xfb,
+ 0x1e, 0x38, 0xa, 0xde, 0x6, 0x4d, 0xfb, 0xd3,
+ 0x5, 0x37, 0x6, 0xe, 0x7c, 0xc1, 0xf7, 0xf0,
+ 0xc1, 0x1, 0xc4, 0xc2, 0xf8, 0xb, 0xc3, 0x3,
+ 0xc4, 0xf7, 0x3b, 0x15, 0xfb, 0x0, 0xd5, 0x41,
+ 0xf7, 0x17, 0xf7, 0x39, 0xf7, 0x8, 0xf7, 0x13,
+ 0xf7, 0x2c, 0xde, 0x5d, 0xe9, 0xfb, 0x2b, 0xfb,
+ 0x28, 0xfb, 0x21, 0xfb, 0x2, 0xfb, 0x38, 0x1e,
+ 0xc2, 0x92, 0x15, 0xf7, 0x1, 0xea, 0xf3, 0xf7,
+ 0x14, 0xf7, 0xd, 0xaa, 0x40, 0x51, 0xfb, 0x9,
+ 0x2b, 0x29, 0xfb, 0xc, 0xfb, 0x1, 0x59, 0xcd,
+ 0xd0, 0x1e, 0xe, 0xfb, 0x31, 0xbe, 0xf7, 0xa,
+ 0xbf, 0xf7, 0xc5, 0xbf, 0x6a, 0xc0, 0x12, 0xf8,
+ 0x90, 0xc4, 0x13, 0xd8, 0x6a, 0x21, 0x15, 0x80,
+ 0x58, 0x5, 0xf7, 0xbb, 0x78, 0xa, 0xfb, 0x30,
+ 0x6, 0xb2, 0xf7, 0x4d, 0x5, 0x65, 0xa3, 0xbd,
+ 0x6e, 0xe7, 0x1b, 0xf7, 0x20, 0xf7, 0x6, 0xf7,
+ 0xa, 0xf7, 0x27, 0xe7, 0x4d, 0xd3, 0x21, 0x33,
+ 0x50, 0x60, 0x5f, 0x5d, 0x1f, 0x13, 0xe8, 0x9a,
+ 0xce, 0x5, 0xfb, 0x1f, 0x6, 0x81, 0x57, 0x5,
+ 0xdf, 0x6, 0x25, 0xfc, 0x6f, 0x5, 0xf7, 0xb,
+ 0xf7, 0xb2, 0x15, 0x13, 0xd8, 0xed, 0xe5, 0xf7,
+ 0x2, 0xf7, 0xe, 0xf3, 0xa0, 0x4d, 0x55, 0xfb,
+ 0xe, 0x2b, 0x35, 0x2d, 0x37, 0x4c, 0xb2, 0xd8,
+ 0x1e, 0xe, 0xfb, 0x31, 0xbf, 0xf7, 0xb, 0xbe,
+ 0xf7, 0xcd, 0xbe, 0x63, 0xbf, 0x12, 0xb4, 0xc4,
+ 0x13, 0xe8, 0xf7, 0x6b, 0x22, 0x15, 0x80, 0x57,
+ 0x5, 0xf7, 0xbf, 0x6, 0x96, 0xbf, 0x5, 0x35,
+ 0x6, 0xf4, 0xf8, 0x77, 0x5, 0xe0, 0x6, 0x95,
+ 0xbe, 0x5, 0xfb, 0x20, 0x6, 0x78, 0x42, 0x5,
+ 0x13, 0xd8, 0xb2, 0x75, 0x53, 0xb9, 0x36, 0x1b,
+ 0xfb, 0x1b, 0xfb, 0x16, 0xfb, 0x6, 0xfb, 0x24,
+ 0x27, 0xcc, 0x46, 0xf7, 0x2, 0xcb, 0xd2, 0x98,
+ 0xc1, 0xc7, 0x1f, 0x65, 0xfb, 0x4e, 0x5, 0xfb,
+ 0xa7, 0xf7, 0xbf, 0x15, 0xd3, 0xbc, 0xf7, 0xf,
+ 0xf7, 0x2a, 0xef, 0xba, 0x49, 0x3f, 0xfb, 0xb,
+ 0xfb, 0x12, 0x4c, 0x32, 0x40, 0x53, 0xbb, 0xdc,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0xe2, 0xc1, 0x1,
+ 0xf7, 0x32, 0xc4, 0x3, 0x9f, 0x16, 0xf7, 0xfe,
+ 0x2a, 0xa, 0xfb, 0x46, 0x6, 0xb4, 0xf7, 0x64,
+ 0x5, 0xf2, 0xf7, 0x18, 0xbc, 0xa2, 0xc1, 0x1b,
+ 0xa4, 0xa0, 0x85, 0x69, 0x8c, 0x1f, 0xc4, 0x90,
+ 0x5, 0xbe, 0x8c, 0x79, 0xb0, 0x51, 0x1b, 0x2a,
+ 0x3e, 0x4c, 0x54, 0x3f, 0x1f, 0x9f, 0xf4, 0x5,
+ 0xfb, 0x4c, 0x5f, 0xa, 0xf7, 0x13, 0x6, 0x4a,
+ 0xfb, 0xd4, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x7c,
+ 0xc1, 0xf7, 0xf0, 0xc1, 0x1, 0xf7, 0xa, 0xca,
+ 0xf7, 0xaa, 0xc5, 0x3, 0xba, 0x7c, 0x15, 0xc4,
+ 0x3c, 0xa, 0x72, 0xb2, 0xbe, 0x6c, 0xdd, 0x1b,
+ 0xf7, 0x10, 0xf5, 0xba, 0xf3, 0xcc, 0x52, 0xa5,
+ 0x53, 0x94, 0x1f, 0x54, 0x94, 0xfb, 0x3c, 0x9c,
+ 0xbf, 0x1a, 0xd8, 0xea, 0x87, 0xbf, 0xc4, 0xbf,
+ 0x71, 0x70, 0xb1, 0x1e, 0x81, 0x5a, 0x51, 0xa,
+ 0xab, 0xf7, 0x30, 0x71, 0xa, 0x80, 0x5b, 0x5,
+ 0xa5, 0x62, 0x58, 0xa1, 0x51, 0x1b, 0xfb, 0x19,
+ 0x36, 0x67, 0x2a, 0x42, 0xf7, 0x21, 0x60, 0xd6,
+ 0x85, 0x1f, 0xb9, 0x87, 0xda, 0x83, 0x5b, 0x1a,
+ 0x30, 0xfb, 0x19, 0x8f, 0x62, 0x4a, 0x50, 0xa8,
+ 0xb2, 0x6a, 0x1e, 0x95, 0xbb, 0x62, 0xa, 0xe,
+ 0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+ 0x1, 0xf7, 0x17, 0xc6, 0x3, 0xf7, 0x5, 0xf8,
+ 0xc, 0x15, 0xd4, 0x6, 0x54, 0xfb, 0xa7, 0x8b,
+ 0x7f, 0x7f, 0x1a, 0x3d, 0x8c, 0xe9, 0x7d, 0xb9,
+ 0x1b, 0xd8, 0xdd, 0xa8, 0xa6, 0xd2, 0x1f, 0x8f,
+ 0xc1, 0x5, 0x77, 0x51, 0x37, 0x68, 0x45, 0x1b,
+ 0x51, 0x5d, 0x92, 0xc7, 0x1f, 0xbf, 0xf7, 0xa1,
+ 0x5, 0xf7, 0x93, 0x77, 0xa, 0xfb, 0x93, 0x6,
+ 0xa5, 0xf7, 0x16, 0x71, 0xa, 0x71, 0xfb, 0x16,
+ 0x5, 0x42, 0x6, 0xe, 0x7c, 0xc0, 0x63, 0xc1,
+ 0xf7, 0xd4, 0xc1, 0x12, 0x13, 0xa0, 0xcb, 0xf8,
+ 0x8, 0x85, 0xa, 0x58, 0xfb, 0x96, 0x8a, 0x80,
+ 0x81, 0x1a, 0x45, 0xc2, 0x65, 0xd7, 0xb2, 0xc0,
+ 0x9c, 0xd2, 0xe3, 0x1e, 0x13, 0x60, 0x7c, 0x40,
+ 0x5, 0xf7, 0x1a, 0x2a, 0xa, 0x3a, 0x6, 0xd3,
+ 0xf8, 0xa, 0x55, 0xa, 0x82, 0x55, 0x5, 0xdc,
+ 0x6, 0x5e, 0xfb, 0x7a, 0x5, 0x13, 0xa0, 0x59,
+ 0x5b, 0x4d, 0x55, 0x4d, 0x1b, 0x56, 0x62, 0xa1,
+ 0xb2, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1f, 0x9e,
+ 0xf3, 0x9d, 0xf3, 0x9e, 0xf3, 0x8, 0xfb, 0x1b,
+ 0x6, 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1,
+ 0xf7, 0x52, 0x81, 0x15, 0xcc, 0x6, 0xf7, 0x8d,
+ 0xf8, 0x11, 0x5, 0xdc, 0x77, 0xa, 0xfb, 0x6a,
+ 0x67, 0xa, 0xd5, 0x6, 0xfb, 0x68, 0xfb, 0xd7,
+ 0x38, 0xf7, 0xd7, 0x5, 0xd7, 0x77, 0xa, 0xfb,
+ 0x72, 0x67, 0xa, 0xe2, 0x6, 0xe, 0x96, 0x76,
+ 0xf8, 0x11, 0xc2, 0x1, 0xcb, 0xc0, 0x3, 0xdc,
+ 0x81, 0x15, 0xcb, 0x6, 0xf7, 0x11, 0xf7, 0x9b,
+ 0xaa, 0xfb, 0x9b, 0x5, 0xc8, 0x6, 0xf7, 0x44,
+ 0xf8, 0x11, 0x5, 0xb0, 0x77, 0xa, 0xfb, 0x32,
+ 0x38, 0xa, 0xd3, 0x6, 0xfb, 0x23, 0xfb, 0xc5,
+ 0x6b, 0xf7, 0xb2, 0x5, 0x5b, 0x6, 0xfb, 0x1b,
+ 0xfb, 0xb0, 0x71, 0xf7, 0xc3, 0x5, 0xd4, 0x6,
+ 0x94, 0xc2, 0x5, 0xfb, 0x36, 0x67, 0xa, 0xac,
+ 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd3, 0xc0, 0x1,
+ 0x7a, 0x16, 0xf7, 0x68, 0x47, 0xa, 0x48, 0x6,
+ 0xf7, 0x3b, 0xf7, 0x16, 0xf7, 0x2, 0xfb, 0x16,
+ 0x5, 0x4c, 0x2d, 0xa, 0xf7, 0x69, 0x47, 0xa,
+ 0x3b, 0x6, 0xfb, 0x21, 0xf7, 0x38, 0xf7, 0x48,
+ 0xf7, 0x2f, 0x5, 0xdc, 0x6, 0x95, 0xc0, 0x5,
+ 0xfb, 0x55, 0x68, 0xa, 0xb6, 0x6, 0xfb, 0x1f,
+ 0xfb, 0xc, 0x30, 0xf7, 0xc, 0x5, 0xbf, 0x6,
+ 0x95, 0xc0, 0x5, 0xfb, 0x5e, 0x68, 0xa, 0xdb,
+ 0x6, 0xf7, 0xd, 0xfb, 0x2e, 0xfb, 0x64, 0xfb,
+ 0x39, 0x5, 0x3e, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+ 0xf8, 0x75, 0xbe, 0x1, 0x6c, 0x21, 0x15, 0x7f,
+ 0x58, 0x5, 0xf7, 0xa2, 0x78, 0xa, 0x32, 0x6,
+ 0xf8, 0x35, 0xf8, 0x75, 0x5, 0xce, 0x78, 0xa,
+ 0xfb, 0x53, 0x6, 0x80, 0x58, 0x5, 0xc7, 0x6,
+ 0xfb, 0x7c, 0xfb, 0xa1, 0x21, 0xf7, 0xa1, 0x5,
+ 0xce, 0x78, 0xa, 0xfb, 0x5f, 0x6, 0x80, 0x58,
+ 0x5, 0xd3, 0x6, 0xf7, 0x13, 0xfb, 0xd2, 0xfb,
+ 0x22, 0xfb, 0x37, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xd2, 0xc1, 0x1, 0xc0, 0x16, 0xf8, 0x2d, 0x6,
+ 0xaa, 0xf7, 0x1a, 0x52, 0xa, 0x76, 0x3b, 0x5,
+ 0xfb, 0xa7, 0x6, 0xf8, 0x1f, 0xf7, 0xd6, 0x95,
+ 0xbd, 0x5, 0xfc, 0x1f, 0x6, 0x6b, 0xfb, 0x18,
+ 0x5, 0xc1, 0x6, 0xa2, 0xd9, 0x5, 0xf7, 0x98,
+ 0x6, 0xfc, 0x1e, 0xfb, 0xd5, 0x5, 0xe, 0xfb,
+ 0x70, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7, 0x53,
+ 0xba, 0x3, 0xf7, 0xa, 0xf7, 0x81, 0x15, 0xbe,
+ 0x73, 0x9e, 0x78, 0x8a, 0x53, 0x8, 0x74, 0x86,
+ 0x6d, 0x82, 0x65, 0x1e, 0x7a, 0x3b, 0x84, 0x55,
+ 0x65, 0x1a, 0x4c, 0xb1, 0x7b, 0xe4, 0x7b, 0x1e,
+ 0x95, 0xc0, 0x5, 0x59, 0x93, 0x67, 0x96, 0xad,
+ 0x1a, 0xa9, 0x92, 0xbb, 0xa0, 0xde, 0x1e, 0x91,
+ 0xa4, 0x8f, 0xb9, 0xb5, 0x1a, 0xb5, 0x7e, 0xb4,
+ 0x6e, 0xa1, 0x1e, 0xe6, 0xc2, 0xa1, 0xf7, 0x0,
+ 0x92, 0xb9, 0x8, 0xf7, 0x5f, 0xb0, 0xab, 0x9c,
+ 0xdf, 0x1b, 0x97, 0xc0, 0x5, 0xfb, 0x23, 0x74,
+ 0x5d, 0xfb, 0x71, 0x59, 0x1f, 0x6f, 0xfb, 0x14,
+ 0x72, 0x6e, 0x38, 0x6a, 0x8, 0xe, 0xfb, 0x79,
+ 0x76, 0xfa, 0x7c, 0x77, 0x1, 0xf7, 0x3c, 0xbe,
+ 0x3, 0xf7, 0x3c, 0xfb, 0x8e, 0x15, 0xbe, 0x6,
+ 0xf7, 0x68, 0xfa, 0x7c, 0x5, 0x58, 0x6, 0xe,
+ 0xfb, 0x71, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7,
+ 0xaf, 0xbe, 0x3, 0xf8, 0x75, 0xf7, 0xb5, 0x15,
+ 0x58, 0xa3, 0x78, 0x9e, 0x8c, 0xc3, 0x8, 0xa2,
+ 0x8f, 0xa9, 0x94, 0xb1, 0x1e, 0x9c, 0xdb, 0x93,
+ 0xc1, 0xb1, 0x1a, 0xca, 0x65, 0x9b, 0x32, 0x9b,
+ 0x1e, 0x81, 0x56, 0x5, 0xbd, 0x83, 0xaf, 0x80,
+ 0x69, 0x1a, 0x6d, 0x81, 0x59, 0x7c, 0x3a, 0x1e,
+ 0x86, 0x72, 0x83, 0x5d, 0x61, 0x1a, 0x61, 0x98,
+ 0x62, 0xa8, 0x75, 0x1e, 0x30, 0x54, 0x75, 0xfb,
+ 0x0, 0x84, 0x5d, 0x8, 0xfb, 0x5f, 0x66, 0x6b,
+ 0x7a, 0x37, 0x1b, 0x7f, 0x56, 0x5, 0xf7, 0x23,
+ 0xa2, 0xb9, 0xf7, 0x71, 0xbd, 0x1f, 0xa7, 0xf7,
+ 0x14, 0xa4, 0xa8, 0xde, 0xac, 0x8, 0xe, 0xf7,
+ 0x59, 0xc8, 0x91, 0xc3, 0x12, 0xf0, 0xf7, 0x59,
+ 0x15, 0xaa, 0xa7, 0xaf, 0xaf, 0xb1, 0x1b, 0xb0,
+ 0xa6, 0x78, 0x7a, 0xa7, 0x1f, 0x7b, 0xa4, 0xa5,
+ 0x7c, 0xae, 0x1b, 0xcd, 0xbf, 0xaf, 0xb7, 0xb6,
+ 0x1f, 0x64, 0xb6, 0x5, 0x77, 0x78, 0x4f, 0x61,
+ 0x66, 0x1b, 0x6e, 0x77, 0x97, 0x99, 0x75, 0x1f,
+ 0x9c, 0x70, 0x6e, 0x9e, 0x53, 0x1b, 0x4b, 0x62,
+ 0x5e, 0x67, 0x62, 0x1f, 0xe, 0xfb, 0x1c, 0x76,
+ 0xf8, 0x67, 0xf7, 0xc, 0x1, 0xf7, 0x9f, 0xf7,
+ 0x23, 0x3, 0xf7, 0x9f, 0xf7, 0xf8, 0x15, 0x71,
+ 0xa7, 0x77, 0xa8, 0xba, 0xb2, 0xae, 0xaf, 0xa5,
+ 0x74, 0xa2, 0x66, 0x5b, 0x68, 0x69, 0x63, 0x1e,
+ 0x3e, 0xfc, 0x95, 0x85, 0xa, 0xc9, 0xf8, 0x1e,
+ 0x5, 0x5d, 0x6, 0xe, 0xe9, 0xc2, 0xf7, 0xa1,
+ 0xc2, 0x1, 0xdc, 0xc4, 0xf7, 0x4f, 0xc2, 0x3,
+ 0xf7, 0x56, 0x5a, 0x15, 0xc2, 0x6, 0xa6, 0xf7,
+ 0x23, 0xd3, 0x8f, 0xc7, 0xa7, 0xc7, 0xad, 0x19,
+ 0x85, 0xb9, 0x5, 0x6b, 0x50, 0x4b, 0x72, 0x49,
+ 0x1b, 0x29, 0x66, 0xc2, 0xbb, 0xe1, 0xdd, 0xdb,
+ 0xf3, 0xb8, 0xc1, 0x7b, 0x6c, 0x9d, 0x1f, 0x81,
+ 0x59, 0x6a, 0xa, 0xab, 0xf7, 0x36, 0x5, 0x55,
+ 0x6, 0x81, 0x58, 0x6c, 0xa3, 0x6a, 0x99, 0x66,
+ 0x8f, 0x19, 0xa6, 0xf7, 0x20, 0x52, 0xa, 0x70,
+ 0xfb, 0x21, 0x5, 0x34, 0x8a, 0xfb, 0x16, 0x2c,
+ 0xfb, 0x18, 0x1a, 0x2e, 0xcf, 0x58, 0xd3, 0x84,
+ 0x1e, 0xe, 0x76, 0xc5, 0xf7, 0x82, 0xc4, 0xf7,
+ 0x71, 0xc5, 0x12, 0xf7, 0x33, 0xc1, 0x61, 0xbf,
+ 0x13, 0xe8, 0xbe, 0xaa, 0x15, 0x9b, 0x57, 0x5,
+ 0xa1, 0xc0, 0xe0, 0x93, 0x9b, 0x1b, 0xa1, 0x9d,
+ 0x82, 0x83, 0xa0, 0x1f, 0x84, 0x9d, 0x9f, 0x85,
+ 0xa4, 0x53, 0xa, 0x74, 0x7b, 0x91, 0x92, 0x7b,
+ 0x1f, 0x94, 0x77, 0x79, 0x94, 0x70, 0x1b, 0x69,
+ 0x67, 0x81, 0x7c, 0x69, 0x1f, 0x8e, 0x6, 0xea,
+ 0xe0, 0x8c, 0xc8, 0x8c, 0xe1, 0x8, 0xf7, 0x6e,
+ 0x6, 0x96, 0xc4, 0x5, 0xfb, 0x7f, 0x6, 0x13,
+ 0xf0, 0x89, 0xa3, 0x88, 0xa5, 0x8c, 0xa5, 0x8,
+ 0x42, 0xa, 0x6c, 0x8f, 0x6d, 0x8d, 0x6e, 0x8,
+ 0x2c, 0x6, 0x80, 0x52, 0x5, 0x13, 0xe8, 0xf7,
+ 0x5, 0x6, 0x23, 0x64, 0x3f, 0x3a, 0x4b, 0x1e,
+ 0xe, 0xd7, 0xb9, 0x60, 0x76, 0xf8, 0x14, 0xb9,
+ 0x9d, 0x77, 0x12, 0xe1, 0xbb, 0xf7, 0xdf, 0xbc,
+ 0x13, 0x6c, 0xac, 0xeb, 0x15, 0xa9, 0x65, 0xda,
+ 0xc5, 0x5, 0x13, 0xac, 0x64, 0xb9, 0xb0, 0x8a,
+ 0xac, 0x1b, 0xbd, 0xbe, 0x9b, 0xa7, 0xb7, 0x1f,
+ 0x13, 0x5c, 0xbe, 0x4d, 0xae, 0xa8, 0x58, 0xcb,
+ 0x5, 0xbe, 0xb3, 0xa4, 0xd6, 0xc1, 0x1a, 0x8c,
+ 0xaf, 0x86, 0xa4, 0x7a, 0xa5, 0xd5, 0xc9, 0x18,
+ 0x6c, 0xb0, 0x42, 0x50, 0x5, 0x13, 0xac, 0xa9,
+ 0x6c, 0x62, 0x96, 0x5a, 0x1b, 0x59, 0x55, 0x7b,
+ 0x6e, 0x61, 0x1f, 0x13, 0x9c, 0x57, 0xca, 0x66,
+ 0x6c, 0xc0, 0x4c, 0x5, 0x57, 0x51, 0x75, 0x5d,
+ 0x4c, 0x1a, 0x8a, 0x68, 0x92, 0x6e, 0x9c, 0x71,
+ 0x8, 0xa4, 0xe4, 0x15, 0x13, 0xac, 0xea, 0xe2,
+ 0xf2, 0xf7, 0x3, 0xdb, 0xc0, 0x52, 0x48, 0xfb,
+ 0x4, 0x21, 0x37, 0x30, 0x3f, 0x51, 0xbe, 0xd2,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xd9, 0xc1, 0xcf, 0xc2,
+ 0xf7, 0x5b, 0xc1, 0x1, 0xc3, 0x16, 0xf7, 0xa9,
+ 0x2a, 0xa, 0xfb, 0x2, 0x6, 0x9a, 0xd9, 0x5,
+ 0xf7, 0x18, 0x47, 0xa, 0xfb, 0x19, 0x6, 0x98,
+ 0xcf, 0x5, 0xf7, 0x19, 0x46, 0xa, 0xfb, 0x12,
+ 0x6, 0xf7, 0x5f, 0xf7, 0x5b, 0x5, 0xdb, 0x2a,
+ 0xa, 0xfb, 0x64, 0x2d, 0xa, 0xd0, 0x6, 0xfb,
+ 0x45, 0xfb, 0x40, 0x22, 0xf7, 0x40, 0x5, 0xcf,
+ 0x2a, 0xa, 0xfb, 0x65, 0x2d, 0xa, 0xdc, 0x6,
+ 0xf7, 0xe, 0xfb, 0x5b, 0x5, 0xfb, 0xb, 0x38,
+ 0xa, 0xf7, 0x17, 0x6, 0x7e, 0x47, 0x5, 0xfb,
+ 0x17, 0x45, 0xa, 0xf7, 0x18, 0x6, 0x7b, 0x3d,
+ 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf7, 0x4c, 0xbc,
+ 0x3, 0xf7, 0xad, 0xf7, 0xaf, 0x15, 0xbd, 0x6,
+ 0xdf, 0xf8, 0x1c, 0x5, 0x59, 0x6, 0xfb, 0x49,
+ 0xfd, 0xe6, 0x15, 0xbc, 0x6, 0xe0, 0xf8, 0x1d,
+ 0x5, 0x59, 0x6, 0xe, 0x3d, 0xc2, 0xf7, 0xb,
+ 0xb4, 0xf8, 0x18, 0xc2, 0x1, 0xe3, 0xc4, 0xf7,
+ 0x71, 0xc4, 0x3, 0xc4, 0x3d, 0x15, 0xf7, 0x87,
+ 0x6, 0xcd, 0xc4, 0xac, 0xbc, 0xa6, 0x7e, 0xaa,
+ 0x68, 0xad, 0x1f, 0xe3, 0x8a, 0xa7, 0xde, 0xb0,
+ 0x1a, 0xa8, 0x7a, 0xa3, 0x75, 0x9d, 0x1e, 0xfb,
+ 0x65, 0xf7, 0x4c, 0x87, 0x93, 0x96, 0x1a, 0xaf,
+ 0x8c, 0xb7, 0x8b, 0xa0, 0x1b, 0xf7, 0x3f, 0x6,
+ 0x75, 0x26, 0x5, 0xc4, 0x6, 0xab, 0xf7, 0x30,
+ 0x5, 0xfb, 0x50, 0x6, 0x48, 0x24, 0x85, 0x35,
+ 0x70, 0x9a, 0x76, 0xab, 0x6a, 0x1f, 0x5a, 0x4a,
+ 0x56, 0x52, 0x73, 0x9d, 0x6a, 0xa0, 0x79, 0x1f,
+ 0xf7, 0x4e, 0xfb, 0x39, 0x5, 0x99, 0x7f, 0x94,
+ 0x77, 0x7b, 0x1a, 0x79, 0x7d, 0x7d, 0x6d, 0x1e,
+ 0xfb, 0x5a, 0x6, 0xa0, 0xf0, 0x62, 0xa, 0xf7,
+ 0x93, 0xc6, 0x15, 0xfb, 0x1d, 0xf7, 0xb, 0x5,
+ 0x7c, 0x99, 0x85, 0x9a, 0x9a, 0x1a, 0xaf, 0xb6,
+ 0xab, 0xb2, 0x8c, 0x1e, 0xf7, 0x22, 0xfb, 0x9,
+ 0x5, 0x9a, 0x7d, 0x96, 0x7f, 0x74, 0x1a, 0x7c,
+ 0x75, 0x58, 0x45, 0x1e, 0xe, 0xf8, 0x80, 0xf2,
+ 0x1, 0xf7, 0xd9, 0xf8, 0x80, 0x15, 0xef, 0x6,
+ 0xa8, 0xf2, 0x5, 0x27, 0x6, 0xfb, 0x64, 0x24,
+ 0x15, 0xf2, 0x6, 0xa8, 0xf2, 0x5, 0x24, 0x6,
+ 0xe, 0x79, 0xb9, 0xe6, 0xb8, 0xf7, 0x8f, 0xb8,
+ 0xd7, 0xb7, 0x1, 0x84, 0xb9, 0xf7, 0x0, 0xba,
+ 0xf8, 0x3, 0xb9, 0x3, 0x84, 0xf7, 0x66, 0x15,
+ 0xfb, 0x18, 0xf5, 0x2b, 0xf7, 0x23, 0xf7, 0x59,
+ 0xf7, 0x3c, 0xf7, 0x38, 0xf7, 0x5d, 0xf7, 0x1d,
+ 0x20, 0xeb, 0xfb, 0x1f, 0xfb, 0x41, 0xfb, 0x57,
+ 0xfb, 0x35, 0xfb, 0x65, 0x1e, 0xb9, 0x9c, 0x15,
+ 0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x2e, 0xf7, 0x43,
+ 0xf7, 0x11, 0xdd, 0x39, 0xfb, 0x8, 0xfb, 0x37,
+ 0xfb, 0x2e, 0xfb, 0x27, 0xfb, 0x31, 0xfb, 0xa,
+ 0x2e, 0xde, 0xf7, 0x8, 0x1e, 0xf7, 0xfc, 0x7d,
+ 0x15, 0x6b, 0x69, 0x63, 0x7a, 0x68, 0x1b, 0x51,
+ 0x65, 0xb5, 0xc0, 0xe3, 0xd7, 0xcf, 0xd3, 0xaa,
+ 0xb1, 0x7c, 0x77, 0x9f, 0x1f, 0xad, 0xae, 0x5,
+ 0xab, 0x66, 0x6e, 0x98, 0x5d, 0x1b, 0xfb, 0x7,
+ 0x30, 0x27, 0x20, 0x39, 0xca, 0x57, 0xd2, 0xbd,
+ 0xc5, 0xa3, 0xab, 0xb2, 0x1f, 0xe, 0xf7, 0x8d,
+ 0xc7, 0xda, 0xc5, 0xda, 0xc2, 0x1, 0xf7, 0xeb,
+ 0xf7, 0x95, 0x15, 0xee, 0x6, 0x94, 0xc6, 0x5,
+ 0x56, 0x6, 0xa0, 0xf7, 0x25, 0x5, 0x8d, 0x9a,
+ 0x8d, 0x99, 0x95, 0x1a, 0xc8, 0x5c, 0x9e, 0x58,
+ 0x5b, 0x54, 0x7a, 0x7c, 0x6d, 0x1e, 0x8e, 0x50,
+ 0x5, 0x9d, 0xa6, 0xc1, 0x9d, 0xb4, 0x1b, 0xac,
+ 0xa2, 0x84, 0x61, 0x80, 0x89, 0x7f, 0x87, 0x7b,
+ 0x1f, 0x90, 0x75, 0x71, 0x8f, 0x71, 0x1b, 0xfb,
+ 0x8, 0x6e, 0x43, 0x5d, 0x62, 0xa8, 0x65, 0xbd,
+ 0xb6, 0xb9, 0xa7, 0xac, 0xae, 0x1f, 0x93, 0xd1,
+ 0x15, 0x5f, 0x6a, 0x5e, 0x70, 0x62, 0x1b, 0x71,
+ 0x78, 0x94, 0x9f, 0xab, 0xa7, 0x9d, 0xc1, 0xb4,
+ 0xb4, 0x83, 0x8b, 0x1f, 0xe, 0xda, 0x76, 0xf8,
+ 0x18, 0x77, 0x1, 0xf7, 0x86, 0xf7, 0x93, 0x15,
+ 0xf7, 0x4b, 0xfb, 0x4d, 0xab, 0xba, 0xfb, 0x15,
+ 0xf7, 0x1e, 0xf7, 0x59, 0xf7, 0x24, 0x6e, 0xba,
+ 0x5, 0xfc, 0x39, 0xfb, 0x53, 0x15, 0xf7, 0x3e,
+ 0xfb, 0x4d, 0xb1, 0xbc, 0xfb, 0x14, 0xf7, 0x1c,
+ 0xf7, 0x52, 0xf7, 0x24, 0x6c, 0xba, 0x5, 0xe,
+ 0xf7, 0x15, 0x76, 0xf7, 0x5b, 0xc9, 0x1, 0xdd,
+ 0xf7, 0xc7, 0x15, 0xf8, 0x7, 0x6, 0x68, 0xfb,
+ 0x5b, 0x6a, 0xa, 0xb8, 0xf7, 0x99, 0x5, 0xfc,
+ 0x3e, 0x6, 0xe, 0x79, 0xb9, 0xf7, 0x7, 0xf7,
+ 0x37, 0xe8, 0xbb, 0xe4, 0xb7, 0x1, 0x84, 0xbb,
+ 0xf7, 0xde, 0xbd, 0xf7, 0x1f, 0xba, 0x3, 0x84,
+ 0xf7, 0x74, 0x15, 0xfb, 0x1e, 0xf1, 0x23, 0xf7,
+ 0x27, 0xf7, 0x48, 0xf7, 0x4d, 0xf7, 0x35, 0xf7,
+ 0x5d, 0xf7, 0x1e, 0x21, 0xed, 0xfb, 0x20, 0xfb,
+ 0x3a, 0xfb, 0x5e, 0xfb, 0x2a, 0xfb, 0x62, 0x1e,
+ 0xbb, 0x93, 0x15, 0xf7, 0x1d, 0xf7, 0x22, 0xf7,
+ 0x3b, 0xf7, 0x3f, 0xf7, 0xe, 0xdf, 0x33, 0xfb,
+ 0x4, 0xfb, 0x30, 0xfb, 0x33, 0xfb, 0x2c, 0xfb,
+ 0x2b, 0xfb, 0xc, 0x32, 0xe0, 0xf7, 0xb, 0x1e,
+ 0xf7, 0x17, 0x32, 0x15, 0xba, 0x6, 0xa1, 0xf5,
+ 0x5, 0xbf, 0x6, 0xa9, 0x21, 0x5, 0xc6, 0x6,
+ 0x6d, 0xf7, 0x9, 0x5, 0xbf, 0x9d, 0x9c, 0xba,
+ 0xbc, 0x1a, 0xb8, 0x63, 0xa7, 0x5e, 0x1e, 0x23,
+ 0x6, 0x9d, 0xfb, 0x21, 0x15, 0x9f, 0xe8, 0x6a,
+ 0xa, 0xa8, 0x9c, 0x79, 0x7b, 0x59, 0x71, 0x82,
+ 0x65, 0x1f, 0xe, 0xf8, 0xa1, 0xb3, 0x1, 0xf7,
+ 0x8, 0xf8, 0xa1, 0x15, 0xf7, 0xfc, 0x6, 0x93,
+ 0xb3, 0x5, 0xfb, 0xfc, 0x6, 0xe, 0xf7, 0x9e,
+ 0xc9, 0xf7, 0x7c, 0xc9, 0x1, 0xf7, 0xb, 0xca,
+ 0xf7, 0x80, 0xca, 0x3, 0xf7, 0xb, 0xf8, 0x28,
+ 0x15, 0x3f, 0xc6, 0x4d, 0xe2, 0xf7, 0x1, 0xf6,
+ 0xf2, 0xf7, 0x11, 0xca, 0x5f, 0xcc, 0x28, 0xfb,
+ 0xb, 0x27, 0x23, 0xfb, 0x6, 0x1e, 0xca, 0x9a,
+ 0x15, 0xbf, 0xc1, 0xe4, 0xe4, 0xd0, 0xa3, 0x5d,
+ 0x67, 0x4f, 0x46, 0x31, 0x43, 0x4f, 0x68, 0xb6,
+ 0xbb, 0x1e, 0xe, 0xb7, 0xc0, 0xf7, 0x79, 0xc0,
+ 0xf7, 0x47, 0x77, 0x1, 0xf7, 0x97, 0xc2, 0x3,
+ 0xf7, 0x97, 0xf7, 0x26, 0x15, 0xc2, 0x6, 0xb0,
+ 0xf7, 0x48, 0x5, 0xf7, 0x4f, 0x80, 0xa, 0xfb,
+ 0x4f, 0x6, 0xaf, 0xf7, 0x47, 0x52, 0xa, 0x67,
+ 0xfb, 0x47, 0x5, 0xfb, 0x4f, 0x6, 0x80, 0x56,
+ 0x5, 0xf7, 0x4f, 0x6, 0xfb, 0x89, 0xfb, 0xae,
+ 0x15, 0xf8, 0x41, 0x80, 0xa, 0xfc, 0x41, 0x6,
+ 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0x9b, 0xc1, 0x1,
+ 0xf8, 0x1f, 0xc4, 0x3, 0xf7, 0x27, 0xf7, 0x8d,
+ 0x15, 0xf7, 0x91, 0x3c, 0xa, 0xfb, 0x3d, 0x6,
+ 0xf7, 0x17, 0xdf, 0xda, 0xbb, 0xef, 0x1a, 0xb9,
+ 0x68, 0xb2, 0x48, 0x5f, 0x4a, 0x74, 0x58, 0x73,
+ 0x1e, 0x82, 0x52, 0x5, 0xc0, 0x6, 0xb2, 0x8a,
+ 0xba, 0xb1, 0xaa, 0x1b, 0xae, 0xa1, 0x75, 0x71,
+ 0x5c, 0x62, 0x63, 0x68, 0x74, 0x1f, 0xfb, 0x36,
+ 0xfb, 0x1, 0x5, 0xe, 0xf7, 0x84, 0xc3, 0xf5,
+ 0xc2, 0xf7, 0x2, 0xc2, 0x12, 0xf8, 0xa, 0xc5,
+ 0x5e, 0xc4, 0x13, 0xf0, 0xf7, 0x30, 0xf7, 0xa3,
+ 0x15, 0x7c, 0xa8, 0xbb, 0x7b, 0xb6, 0x1b, 0xd7,
+ 0xdb, 0xc0, 0xde, 0xae, 0x79, 0x9a, 0x75, 0x97,
+ 0x1f, 0x13, 0xe8, 0xae, 0xa1, 0x9c, 0xb2, 0xb4,
+ 0x1a, 0xbc, 0x65, 0xac, 0x54, 0x60, 0x5c, 0x77,
+ 0x75, 0x64, 0x1e, 0x96, 0x57, 0x5, 0x9d, 0xab,
+ 0xac, 0xa0, 0xad, 0x1b, 0xa6, 0xa7, 0x7d, 0x71,
+ 0x5e, 0x5a, 0x72, 0x4b, 0x1f, 0x87, 0x79, 0x87,
+ 0x78, 0x87, 0x79, 0x8, 0x99, 0x9f, 0x8b, 0x9f,
+ 0x1b, 0x13, 0xf0, 0xa9, 0xa7, 0x81, 0x6e, 0x6a,
+ 0x71, 0x69, 0x4b, 0x66, 0x67, 0x99, 0x9d, 0x6f,
+ 0x1f, 0xe, 0x65, 0xa, 0xf7, 0x42, 0xf8, 0x85,
+ 0x15, 0xf7, 0x96, 0xf0, 0x7b, 0xd5, 0xfb, 0x8c,
+ 0xfb, 0x24, 0x5, 0xe, 0xf7, 0x22, 0xac, 0x15,
+ 0x75, 0x9a, 0xa9, 0x78, 0xbb, 0x1b, 0xbe, 0xdf,
+ 0xab, 0xca, 0xbc, 0x1f, 0x7b, 0x39, 0x5, 0xf7,
+ 0x1c, 0x2a, 0xa, 0x39, 0x6, 0xd3, 0xf8, 0x3,
+ 0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x70,
+ 0xfb, 0x18, 0x5, 0x35, 0x7b, 0x51, 0xfb, 0x2,
+ 0xfb, 0x11, 0x1b, 0x4b, 0x6a, 0xb9, 0xc6, 0x96,
+ 0x1f, 0xc2, 0xf7, 0xa8, 0x5, 0xfb, 0x1d, 0x68,
+ 0xa, 0xdd, 0x6, 0x23, 0xfc, 0xa6, 0x6a, 0xa,
+ 0xe, 0xf8, 0xa9, 0xa8, 0x1, 0xf7, 0x28, 0xba,
+ 0xda, 0xb6, 0x3, 0xf7, 0x28, 0x3d, 0x15, 0xba,
+ 0x6, 0xf7, 0x52, 0xf8, 0xf7, 0x5, 0xda, 0x6,
+ 0xfb, 0x52, 0xfc, 0xf7, 0x5, 0xb6, 0x6, 0xf7,
+ 0x52, 0xf8, 0xf7, 0x5, 0xbc, 0x6, 0x94, 0xa8,
+ 0x5, 0xfb, 0x6f, 0x6, 0xfb, 0x34, 0xfb, 0x2b,
+ 0x4c, 0xfb, 0x21, 0x53, 0xb9, 0x3e, 0xf7, 0x35,
+ 0x1f, 0xe, 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7,
+ 0x70, 0xf7, 0x33, 0x3, 0xf7, 0x70, 0xf7, 0x87,
+ 0x15, 0x6e, 0xa6, 0x72, 0xb4, 0xb7, 0xba, 0xaf,
+ 0xb9, 0xa9, 0x73, 0xa5, 0x63, 0x58, 0x5f, 0x65,
+ 0x5d, 0x1e, 0xe, 0xfb, 0x2, 0xb9, 0x1, 0xf7,
+ 0xbf, 0xba, 0x3, 0xf7, 0x76, 0xfb, 0x1a, 0x15,
+ 0x88, 0x90, 0xa3, 0x7d, 0xa4, 0x1b, 0xbc, 0xb7,
+ 0xb0, 0xba, 0xa4, 0x78, 0x9c, 0x7c, 0x8d, 0x1f,
+ 0x92, 0xac, 0x5, 0x5c, 0x6, 0x73, 0x41, 0x5,
+ 0x8c, 0x93, 0x91, 0x8b, 0x91, 0x1b, 0x9d, 0x93,
+ 0x83, 0x83, 0x8c, 0x1f, 0x78, 0x79, 0x7f, 0x7b,
+ 0x7d, 0x7c, 0x8e, 0x94, 0x81, 0x1e, 0xe, 0xf7,
+ 0x8d, 0xc3, 0x1, 0xf7, 0xab, 0xc0, 0x3, 0xf7,
+ 0x3e, 0xf7, 0x8d, 0x15, 0xf7, 0x8d, 0x3c, 0xa,
+ 0x29, 0x6, 0xc5, 0xf7, 0xd1, 0xfb, 0x26, 0x72,
+ 0x80, 0x53, 0xe6, 0x9a, 0x5e, 0xfb, 0x8f, 0x5,
+ 0x29, 0x6, 0xe, 0xf7, 0x8d, 0xc6, 0xf7, 0x69,
+ 0xc6, 0x1, 0xf7, 0x1d, 0xc1, 0xf7, 0x6d, 0xc1,
+ 0x3, 0xf7, 0x1d, 0xf8, 0xc, 0x15, 0x2c, 0xe5,
+ 0x6b, 0xb6, 0xd4, 0xf7, 0xb, 0xd2, 0xf7, 0x17,
+ 0xd4, 0x5a, 0xc3, 0x39, 0x36, 0xfb, 0x1, 0x40,
+ 0xfb, 0x15, 0x1e, 0xc1, 0x9a, 0x15, 0xd1, 0xbf,
+ 0xc7, 0xd9, 0xcf, 0x9d, 0x5d, 0x68, 0x8c, 0x1e,
+ 0x3c, 0x4a, 0x56, 0x4e, 0x5c, 0x5f, 0xa9, 0xc0,
+ 0x1e, 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1,
+ 0x8c, 0xf8, 0xc4, 0x3, 0xf3, 0xd1, 0x15, 0xf7,
+ 0x92, 0xf7, 0x53, 0xfb, 0x4b, 0xf7, 0x4d, 0x6b,
+ 0x5c, 0xf7, 0x15, 0xfb, 0x1e, 0xfb, 0x59, 0xfb,
+ 0x24, 0x5, 0xf7, 0x48, 0x16, 0xaa, 0x5c, 0xf7,
+ 0x83, 0xf7, 0x53, 0xfb, 0x3e, 0xf7, 0x4d, 0x65,
+ 0x5a, 0xf7, 0x14, 0xfb, 0x1c, 0x5, 0xe, 0x60,
+ 0xc1, 0x5c, 0x76, 0xf3, 0xc2, 0xf7, 0x5d, 0xc0,
+ 0xf7, 0xc9, 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x8d,
+ 0xba, 0x15, 0xf7, 0x14, 0x6, 0x82, 0x67, 0x5,
+ 0x5a, 0x5f, 0xa, 0xf7, 0x20, 0x76, 0xa, 0x61,
+ 0x6, 0x93, 0xaf, 0x5, 0xb6, 0x6, 0x94, 0xc2,
+ 0x5, 0x60, 0x6, 0xac, 0xf7, 0x65, 0x52, 0xa,
+ 0xfb, 0x30, 0xfb, 0x65, 0x5, 0xc9, 0x16, 0xe4,
+ 0xf7, 0x19, 0x76, 0xfb, 0x19, 0x5, 0xfc, 0x19,
+ 0xfb, 0x14, 0x15, 0x13, 0x78, 0xac, 0x6c, 0xf8,
+ 0xd4, 0xf9, 0x47, 0x69, 0xaa, 0x5, 0xfc, 0xd3,
+ 0xfb, 0xfe, 0x15, 0xf7, 0x6e, 0x6, 0x94, 0xc0,
+ 0x5, 0x36, 0x6, 0xbe, 0xf7, 0xc6, 0xfb, 0x14,
+ 0x73, 0x82, 0x55, 0xdb, 0x99, 0x62, 0xfb, 0x86,
+ 0x5, 0x35, 0x6, 0xe, 0x5f, 0xc1, 0x5d, 0x76,
+ 0xf7, 0xd5, 0xc0, 0x7c, 0xc1, 0xf7, 0xc9, 0x77,
+ 0x12, 0xf8, 0x65, 0xbb, 0x13, 0x5c, 0x89, 0x71,
+ 0x15, 0xad, 0x6c, 0xf8, 0xce, 0xf9, 0x47, 0x67,
+ 0xaa, 0x5, 0xfc, 0xb5, 0xfb, 0xff, 0x15, 0xf7,
+ 0x70, 0x76, 0xa, 0x34, 0x6, 0xbe, 0xf7, 0xc4,
+ 0xfb, 0x13, 0x74, 0x82, 0x55, 0xda, 0x99, 0x64,
+ 0xfb, 0x85, 0x5, 0x34, 0x6, 0x13, 0xac, 0xf7,
+ 0x73, 0xfc, 0x24, 0x15, 0xf7, 0x6b, 0x76, 0xa,
+ 0xfb, 0x23, 0x6, 0xf7, 0xb, 0xee, 0xc6, 0xa8,
+ 0xe1, 0x1a, 0xbc, 0x72, 0xb7, 0x4d, 0x65, 0x63,
+ 0x78, 0x69, 0x6c, 0x1e, 0x81, 0x4c, 0x5, 0xb9,
+ 0x6, 0xb0, 0x89, 0xae, 0xa5, 0xaa, 0x1b, 0xaa,
+ 0x9c, 0x73, 0x6e, 0x62, 0x68, 0x6a, 0x6d, 0x74,
+ 0x1f, 0xfb, 0x1e, 0xfb, 0x0, 0x5, 0xe, 0x61,
+ 0xc1, 0x5c, 0x76, 0xf7, 0xb, 0xc2, 0xf7, 0x42,
+ 0xc2, 0xf7, 0xb3, 0x76, 0xc0, 0x77, 0x12, 0xf7,
+ 0x67, 0xba, 0x65, 0xbb, 0x13, 0xbe, 0xf7, 0x90,
+ 0xca, 0x15, 0xf7, 0x11, 0x6, 0x83, 0x58, 0x5,
+ 0x59, 0x6, 0x82, 0x55, 0x5, 0xf7, 0x1c, 0x76,
+ 0xa, 0x62, 0x6, 0x92, 0xbe, 0x5, 0xb6, 0x6,
+ 0x94, 0xc2, 0x5, 0x61, 0x6, 0xab, 0xf7, 0x57,
+ 0x5, 0x56, 0x6, 0xfb, 0x2c, 0xfb, 0x66, 0x5,
+ 0xc7, 0x9a, 0x15, 0xe3, 0xf7, 0x8, 0x78, 0xfb,
+ 0x8, 0x5, 0xfc, 0x10, 0xfb, 0x25, 0x15, 0x13,
+ 0x7e, 0xab, 0x6e, 0xf8, 0xbe, 0xf9, 0x47, 0x6a,
+ 0xaa, 0x5, 0xfc, 0xa1, 0xfb, 0xe8, 0x15, 0x7d,
+ 0xa2, 0xb1, 0x77, 0xae, 0x1b, 0xc4, 0xd1, 0xc2,
+ 0xd5, 0x1f, 0x8e, 0xb3, 0x7a, 0x9a, 0x78, 0x97,
+ 0x8, 0x13, 0xbd, 0xa6, 0xa0, 0x9b, 0xb1, 0xb1,
+ 0x1a, 0xbc, 0x6c, 0xab, 0x5d, 0x69, 0x66, 0x79,
+ 0x75, 0x6b, 0x1e, 0x94, 0x58, 0x5, 0x9d, 0xa5,
+ 0xa5, 0x9f, 0xa7, 0x1b, 0xa0, 0x9f, 0x7d, 0x72,
+ 0x8d, 0x1f, 0x64, 0x69, 0x6f, 0x57, 0x1e, 0x85,
+ 0x6, 0x82, 0x56, 0x5, 0x13, 0xbe, 0xb2, 0xc0,
+ 0x87, 0x6a, 0x6d, 0x73, 0x63, 0x59, 0x6d, 0x6e,
+ 0x9c, 0x9c, 0x76, 0x1f, 0xe, 0xfb, 0x31, 0xc1,
+ 0xf8, 0x33, 0xf7, 0xa, 0x12, 0xf7, 0xc, 0xc2,
+ 0xf7, 0x45, 0xc2, 0x9e, 0xc1, 0x17, 0xf7, 0xe5,
+ 0xf7, 0xf7, 0x15, 0x73, 0xa1, 0x78, 0xac, 0xb8,
+ 0xad, 0xad, 0xb3, 0xa2, 0x75, 0xa0, 0x68, 0x68,
+ 0x61, 0x69, 0x62, 0x1e, 0x8e, 0xfb, 0x41, 0x15,
+ 0x38, 0x7a, 0xfb, 0x1d, 0x5e, 0xfb, 0x22, 0x1a,
+ 0x31, 0xd6, 0x5e, 0xe5, 0xc6, 0xc9, 0x9a, 0x9c,
+ 0xbe, 0x1e, 0x13, 0xb8, 0xa2, 0xf7, 0xb, 0x5,
+ 0x55, 0x6, 0x7d, 0x44, 0x5, 0x7b, 0x66, 0x61,
+ 0x81, 0x63, 0x1b, 0x2f, 0x71, 0xba, 0xb1, 0xf7,
+ 0x2, 0xf7, 0x1f, 0xac, 0xd3, 0x96, 0x1f, 0xa0,
+ 0xf3, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x10,
+ 0xc1, 0xf7, 0xb1, 0xc1, 0x1, 0x89, 0x4f, 0xa,
+ 0x89, 0x16, 0x20, 0xa, 0xfb, 0x43, 0xf8, 0x7d,
+ 0x15, 0xf7, 0x9a, 0x26, 0x9b, 0xa9, 0xfb, 0x7b,
+ 0x79, 0xa, 0x8b, 0xc1, 0xf7, 0xf, 0xc2, 0xf7,
+ 0xab, 0xc1, 0x84, 0xa, 0x72, 0xf7, 0x74, 0xf7,
+ 0x5a, 0xf7, 0x71, 0x3, 0xf7, 0xc2, 0xf8, 0xff,
+ 0x15, 0xf7, 0xd7, 0xf0, 0x77, 0xd4, 0xfb, 0xc9,
+ 0xfb, 0x24, 0x5, 0xfb, 0xd5, 0xfd, 0x1d, 0x23,
+ 0xa, 0x8b, 0xc0, 0xf7, 0xc, 0xc0, 0xf7, 0xb1,
+ 0xc1, 0xf7, 0x66, 0x77, 0x1, 0x89, 0x4f, 0xa,
+ 0xf7, 0x7a, 0xf9, 0x3, 0x15, 0xb0, 0x79, 0xf7,
+ 0x3b, 0xf7, 0x7, 0xf7, 0xd, 0xfb, 0x7, 0xb5,
+ 0x9d, 0xfb, 0x5, 0xf7, 0x2c, 0x5, 0x3c, 0x6,
+ 0xfc, 0x2b, 0xfd, 0x9b, 0x23, 0xa, 0x7e, 0xa,
+ 0xd3, 0xbc, 0x9c, 0xbc, 0x1, 0x71, 0x4f, 0xa,
+ 0xf7, 0x6c, 0xf9, 0x20, 0x15, 0xbc, 0x81, 0x5,
+ 0x9e, 0x97, 0xa6, 0xb5, 0xbc, 0x1b, 0xa4, 0x9b,
+ 0x7b, 0x7b, 0x9e, 0x1f, 0x7a, 0x9f, 0xa1, 0x7a,
+ 0xb1, 0x1b, 0xd0, 0xb9, 0xca, 0xb1, 0x9e, 0x1f,
+ 0x5b, 0x94, 0x5, 0x73, 0x7d, 0x69, 0x66, 0x66,
+ 0x1b, 0x76, 0x7e, 0x99, 0x9b, 0x7a, 0x1f, 0x9c,
+ 0x79, 0x75, 0x9e, 0x61, 0x1b, 0x52, 0x51, 0x5c,
+ 0x56, 0x6d, 0x1f, 0xfb, 0x86, 0xfd, 0x20, 0x23,
+ 0xa, 0x7e, 0xa, 0xdb, 0xf7, 0x8, 0x1, 0x89,
+ 0x4f, 0xa, 0xf8, 0x55, 0xf9, 0x19, 0x15, 0xdd,
+ 0x5c, 0xa, 0x38, 0x6, 0xfb, 0x3c, 0xfb, 0x8,
+ 0x15, 0xdd, 0x5c, 0xa, 0x39, 0x6, 0xfb, 0xe0,
+ 0xfd, 0x8d, 0x23, 0xa, 0x8b, 0xbf, 0xf7, 0x20,
+ 0xc1, 0xf7, 0xaa, 0xc1, 0xaa, 0xc4, 0xd2, 0xc3,
+ 0x1, 0x89, 0xf7, 0x63, 0xf7, 0x11, 0xc6, 0xd4,
+ 0xc7, 0x3, 0xf7, 0xde, 0xf9, 0x3d, 0x15, 0x5d,
+ 0xb1, 0x71, 0xb7, 0xc8, 0xbc, 0xbf, 0xc5, 0xab,
+ 0x7f, 0xb5, 0x4a, 0x4c, 0x57, 0x58, 0x4e, 0x1e,
+ 0xc6, 0x93, 0x15, 0xa3, 0x97, 0xa3, 0xac, 0xad,
+ 0x85, 0x6f, 0x86, 0x75, 0x77, 0x7b, 0x76, 0x85,
+ 0x71, 0x8b, 0xa2, 0x1e, 0xfc, 0x1b, 0xfd, 0x45,
+ 0x23, 0xa, 0x8b, 0xc1, 0xeb, 0xc1, 0xbc, 0x61,
+ 0xa, 0x1, 0x71, 0xf7, 0x56, 0xe2, 0xcd, 0xf6,
+ 0xc1, 0x93, 0xc2, 0x3, 0x71, 0x16, 0xf7, 0x56,
+ 0x2a, 0xa, 0x35, 0x6, 0xc8, 0xf7, 0x3, 0x5,
+ 0xf7, 0x19, 0x6, 0x6b, 0xfb, 0x39, 0x5, 0xf7,
+ 0x97, 0x6, 0xaa, 0xf7, 0x2d, 0x52, 0xa, 0x78,
+ 0x28, 0x5, 0xfb, 0x2a, 0x6, 0xb1, 0xf7, 0x5c,
+ 0x5, 0xdb, 0x6, 0x80, 0x52, 0x5, 0xc1, 0x6,
+ 0xab, 0xf7, 0x3b, 0x5, 0x57, 0x60, 0xa, 0x39,
+ 0x6, 0xb3, 0xf7, 0x5c, 0x5, 0xf7, 0x2b, 0x6,
+ 0x78, 0x26, 0x6a, 0xa, 0xa9, 0xf7, 0x2f, 0x5,
+ 0xfc, 0x2a, 0x2d, 0xa, 0xe4, 0x6, 0xfb, 0x99,
+ 0x58, 0xa, 0x57, 0x6, 0xf7, 0x5b, 0xf7, 0x39,
+ 0x15, 0xf7, 0x3e, 0xf7, 0xb4, 0x52, 0xfb, 0xb4,
+ 0x5, 0xe, 0xfb, 0x2b, 0xc2, 0xe7, 0xbe, 0xf8,
+ 0x76, 0xbe, 0x1, 0x9c, 0xc5, 0xf7, 0x3, 0xbb,
+ 0xf7, 0x8b, 0xc3, 0x3, 0xf7, 0x5, 0xfb, 0x13,
+ 0x15, 0x84, 0x90, 0xa3, 0x7a, 0xa7, 0x1b, 0xb3,
+ 0xc2, 0xa2, 0xcb, 0xab, 0x7c, 0xa2, 0x77, 0x93,
+ 0x1f, 0x8f, 0x88, 0x5, 0xe7, 0xdc, 0xbe, 0xb5,
+ 0xd3, 0x1f, 0x7b, 0xb7, 0x5, 0x66, 0x4d, 0x45,
+ 0x5a, 0x44, 0x1b, 0xfb, 0x5, 0x43, 0xe5, 0xf7,
+ 0x9, 0xf7, 0x43, 0xf7, 0x44, 0xef, 0xeb, 0xcc,
+ 0xc5, 0x6d, 0x60, 0xaa, 0x1f, 0x77, 0x36, 0x51,
+ 0xa, 0xb8, 0xf7, 0x65, 0x52, 0xa, 0x7e, 0x51,
+ 0x5, 0xb7, 0x49, 0x60, 0x99, 0x55, 0x1b, 0xfb,
+ 0x54, 0xfb, 0x22, 0xfb, 0x3d, 0xfb, 0x44, 0x22,
+ 0xd1, 0x30, 0xee, 0x7c, 0x1f, 0x78, 0x42, 0x5,
+ 0x8f, 0x92, 0x94, 0x8b, 0x92, 0x1b, 0x98, 0x96,
+ 0x83, 0x81, 0x80, 0x85, 0x75, 0x6e, 0x7d, 0x7e,
+ 0x93, 0x92, 0x81, 0x1f, 0xe, 0x5b, 0xa, 0x1,
+ 0xe4, 0xc2, 0xf7, 0x52, 0xc3, 0xc6, 0xb8, 0x3,
+ 0x88, 0x16, 0x28, 0xa, 0xf8, 0x9d, 0xf8, 0xc9,
+ 0x15, 0x9a, 0xa9, 0xfb, 0xc9, 0xf7, 0x24, 0x6f,
+ 0x42, 0x5, 0xe, 0x5b, 0xa, 0x84, 0xa, 0xe5,
+ 0xc3, 0xf7, 0x55, 0xc4, 0xc7, 0xb9, 0x3, 0xf7,
+ 0xa0, 0xf8, 0xff, 0x15, 0xf7, 0xd5, 0xf0, 0x78,
+ 0xd4, 0xfb, 0xc9, 0xfb, 0x24, 0x5, 0xfb, 0x9c,
+ 0xfd, 0x1d, 0x15, 0x28, 0xa, 0xe, 0x5b, 0xa,
+ 0x1, 0xe4, 0xc2, 0x3, 0xf7, 0x54, 0xf9, 0xd,
+ 0x15, 0xb2, 0x79, 0xf7, 0x45, 0xf7, 0x7, 0xf7,
+ 0x14, 0xfb, 0x7, 0xb9, 0x9d, 0xfb, 0xb, 0xf7,
+ 0x2c, 0x5, 0x36, 0x6, 0xfc, 0x11, 0xfd, 0xa5,
+ 0x15, 0x28, 0xa, 0xe, 0x8b, 0xbe, 0xf7, 0x75,
+ 0x76, 0xf7, 0xca, 0x77, 0xf7, 0x2, 0xf7, 0x8,
+ 0x1, 0xe4, 0xc2, 0x3, 0xf8, 0x3d, 0xf9, 0x23,
+ 0x15, 0xe2, 0x5c, 0xa, 0x34, 0x6, 0xfb, 0x46,
+ 0xfb, 0x8, 0x15, 0xe2, 0x6, 0xa5, 0x88, 0xa,
+ 0x34, 0x6, 0xfb, 0xc1, 0xfd, 0x97, 0x15, 0x28,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5c, 0xc2, 0x84,
+ 0xa, 0xf7, 0x74, 0xc6, 0x3, 0xaf, 0x16, 0x2f,
+ 0xa, 0xf7, 0x50, 0xf9, 0x2e, 0x15, 0xf7, 0xb5,
+ 0x26, 0x9e, 0xa9, 0xfb, 0x94, 0x79, 0xa, 0x8b,
+ 0xc1, 0xf8, 0x5d, 0xc2, 0xf7, 0x77, 0x77, 0x1,
+ 0xf7, 0x6c, 0xc5, 0x3, 0xf7, 0x88, 0xf9, 0x0,
+ 0x15, 0xf7, 0xdb, 0xef, 0x78, 0xd4, 0xfb, 0xcf,
+ 0xfb, 0x23, 0x5, 0xfb, 0x64, 0xfd, 0x1e, 0x15,
+ 0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xeb,
+ 0xf8, 0x5d, 0x5, 0xf7, 0x40, 0x46, 0xa, 0xfc,
+ 0x29, 0x6, 0x7e, 0x54, 0x5, 0xf7, 0x42, 0x6,
+ 0x2d, 0x7a, 0xa, 0xfb, 0x44, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf8, 0x5d, 0xc2, 0x1, 0xf7, 0x74, 0xc6,
+ 0x3, 0xf7, 0x3f, 0xf9, 0xb, 0x15, 0xb2, 0x7a,
+ 0xf7, 0x47, 0xf7, 0x8, 0xf7, 0x14, 0xfb, 0x8,
+ 0xb9, 0x9c, 0xfb, 0xd, 0xf7, 0x2e, 0x5, 0x36,
+ 0x6, 0xfb, 0xd5, 0xfd, 0xa5, 0x15, 0x2f, 0xa,
+ 0xe, 0x8b, 0xbe, 0xf8, 0x5f, 0xc2, 0xf7, 0x62,
+ 0x77, 0x1, 0xf7, 0x74, 0xc6, 0x3, 0xf8, 0x35,
+ 0xf9, 0x22, 0x15, 0xe7, 0x6, 0xa5, 0xf7, 0x9,
+ 0x5, 0x31, 0x6, 0xfb, 0x4e, 0xfb, 0x9, 0x15,
+ 0xe5, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x31, 0x6,
+ 0xfb, 0x8e, 0xfd, 0x97, 0x15, 0x2f, 0xa, 0xe,
+ 0x8b, 0xc1, 0xf7, 0x57, 0xbf, 0xf7, 0x63, 0xc1,
+ 0x1, 0xf8, 0xad, 0xcb, 0x3, 0x8a, 0x16, 0xf7,
+ 0x6f, 0x6, 0xf7, 0x56, 0xf7, 0x49, 0xe1, 0xf7,
+ 0xaf, 0xf7, 0x22, 0x28, 0xbe, 0xfb, 0x1a, 0x1f,
+ 0xfb, 0x8c, 0x2d, 0xa, 0xda, 0x6, 0x63, 0xfb,
+ 0x63, 0x5, 0x3f, 0x6, 0x7f, 0x57, 0x5, 0xd8,
+ 0x6, 0x64, 0xfb, 0x57, 0x89, 0xa, 0xf7, 0x1b,
+ 0x16, 0xb1, 0xf7, 0x57, 0x5, 0xf7, 0x55, 0x6,
+ 0x96, 0xbf, 0x5, 0xfb, 0x54, 0x6, 0xb4, 0xf7,
+ 0x63, 0x5, 0xf0, 0x6, 0xf7, 0x2a, 0xb5, 0x60,
+ 0xfb, 0x16, 0xfb, 0x1a, 0x21, 0xfb, 0x27, 0xfb,
+ 0x3a, 0x1f, 0xe, 0x7e, 0xbf, 0xf8, 0x4e, 0xbf,
+ 0xdf, 0xbc, 0x9b, 0xbd, 0x1, 0x61, 0x7e, 0x15,
+ 0xf7, 0x8f, 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x3,
+ 0x6, 0xe2, 0xf8, 0x37, 0xf7, 0x5a, 0xfc, 0x6b,
+ 0x5, 0xd7, 0x6, 0xf1, 0xf8, 0x82, 0x5, 0xdb,
+ 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x8b, 0x82, 0xa,
+ 0xf7, 0x2, 0x6, 0x34, 0xfc, 0x3b, 0xfb, 0x58,
+ 0xf8, 0x6f, 0x5, 0xfb, 0x34, 0x6, 0x7f, 0x57,
+ 0x5, 0xde, 0x6, 0x30, 0xfc, 0x4e, 0x7b, 0xa,
+ 0xf7, 0x6c, 0xf8, 0xe5, 0x15, 0xbe, 0x80, 0x5,
+ 0x9f, 0x97, 0xa8, 0xb4, 0xbe, 0x1b, 0xac, 0x9e,
+ 0x78, 0x7a, 0xa1, 0x1f, 0x7c, 0x9e, 0x9f, 0x7d,
+ 0xac, 0x1b, 0xd2, 0xbb, 0xcb, 0xb2, 0x9f, 0x1f,
+ 0x58, 0x94, 0x5, 0x73, 0x7d, 0x6d, 0x64, 0x64,
+ 0x1b, 0x70, 0x7c, 0x99, 0x9a, 0x7b, 0x1f, 0x9d,
+ 0x78, 0x76, 0x9e, 0x5e, 0x1b, 0x50, 0x4e, 0x5d,
+ 0x55, 0x6c, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7b,
+ 0xc1, 0xf7, 0x6c, 0x7d, 0xa, 0xf7, 0x82, 0xf9,
+ 0x64, 0x15, 0xf7, 0xa0, 0x27, 0x9b, 0xa9, 0xfb,
+ 0x7f, 0xf7, 0x23, 0x5, 0xfb, 0x91, 0xfc, 0xd9,
+ 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7a, 0xc1, 0x1,
+ 0xaa, 0xc2, 0xf8, 0x45, 0xc3, 0x3, 0xf7, 0x97,
+ 0xf8, 0xff, 0x15, 0xf7, 0xbb, 0xef, 0x78, 0xd5,
+ 0xfb, 0xb5, 0xfb, 0x25, 0x5, 0xfb, 0x68, 0xfc,
+ 0x48, 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7b, 0xc1,
+ 0xf7, 0x5a, 0x7d, 0xa, 0xf7, 0x4b, 0xf9, 0x2,
+ 0x15, 0xb1, 0x7a, 0xf7, 0x40, 0xf7, 0x7, 0xf7,
+ 0xf, 0xfb, 0x7, 0xb6, 0x9c, 0xfb, 0x8, 0xf7,
+ 0x2d, 0x89, 0xa, 0xfb, 0xdd, 0xfc, 0xc7, 0x25,
+ 0xa, 0x79, 0xbf, 0xf8, 0x7d, 0xc1, 0xd1, 0xbc,
+ 0x9c, 0xbc, 0x1, 0x9e, 0xc6, 0xf8, 0x36, 0xc1,
+ 0x3, 0xf7, 0x2e, 0xf9, 0x2a, 0x15, 0xbd, 0x80,
+ 0x5, 0x9f, 0x97, 0xa7, 0xb5, 0xbb, 0x1b, 0xae,
+ 0x9c, 0x7a, 0x7a, 0x9d, 0x1f, 0x7b, 0x9c, 0x9e,
+ 0x7b, 0xb0, 0x1b, 0xd1, 0xbb, 0xca, 0xb2, 0x9e,
+ 0x1f, 0x58, 0x94, 0x5, 0x73, 0x7e, 0x6b, 0x65,
+ 0x66, 0x1b, 0x73, 0x7e, 0x97, 0x99, 0x7d, 0x1f,
+ 0x9d, 0x79, 0x76, 0xa1, 0x5b, 0x1b, 0x52, 0x4f,
+ 0x5d, 0x55, 0x6d, 0x1f, 0xfb, 0xc, 0xfc, 0x56,
+ 0x25, 0xa, 0x79, 0xbe, 0xf8, 0x7e, 0xc1, 0xce,
+ 0xf7, 0x9, 0x1, 0xad, 0xc2, 0xf7, 0x40, 0xdf,
+ 0xc9, 0xde, 0x9e, 0xc3, 0x3, 0xf8, 0x2b, 0xf9,
+ 0x18, 0x15, 0xde, 0x6, 0xa5, 0xf7, 0x9, 0x5,
+ 0x37, 0x6, 0xfb, 0x3f, 0xfb, 0x9, 0x15, 0xdf,
+ 0x6, 0xa4, 0xf7, 0x9, 0x7b, 0xa, 0xfb, 0x91,
+ 0xfc, 0xb9, 0x25, 0xa, 0xcb, 0x76, 0xf8, 0x3f,
+ 0x77, 0x1, 0xbb, 0xe4, 0x15, 0xb9, 0x5d, 0xf7,
+ 0x5b, 0xf7, 0x3d, 0xf7, 0x1e, 0xfb, 0x3d, 0xbb,
+ 0xb2, 0xfb, 0x20, 0xf7, 0x3e, 0xf7, 0x69, 0xf7,
+ 0x41, 0x63, 0xb8, 0xfb, 0x67, 0xfb, 0x41, 0xfb,
+ 0x1f, 0xf7, 0x40, 0x5d, 0x64, 0xf7, 0x1e, 0xfb,
+ 0x3d, 0x5, 0xe, 0x82, 0xbf, 0x5d, 0x76, 0xf8,
+ 0xae, 0xc0, 0x12, 0x13, 0x60, 0xf8, 0xbd, 0xf7,
+ 0xab, 0x15, 0x95, 0xbe, 0x8d, 0xde, 0x67, 0xca,
+ 0xc3, 0xc6, 0x18, 0x68, 0xab, 0x59, 0x57, 0x5,
+ 0xaa, 0x6c, 0x5f, 0xa0, 0x4a, 0x1b, 0xfb, 0x3f,
+ 0xfb, 0x7, 0xfb, 0x2b, 0xfb, 0x1d, 0x71, 0x1f,
+ 0x7b, 0x3b, 0x96, 0x41, 0xae, 0x58, 0x4c, 0x48,
+ 0x18, 0xaf, 0x6c, 0xc6, 0xc9, 0x5, 0x13, 0xa0,
+ 0x6d, 0xad, 0xb9, 0x7a, 0xc4, 0x1b, 0xf7, 0x31,
+ 0xf7, 0xa, 0xf7, 0x16, 0xf7, 0x32, 0xaa, 0x1f,
+ 0x55, 0x89, 0x15, 0xfb, 0xe, 0x73, 0x30, 0xfb,
+ 0x4, 0xfb, 0x13, 0x1b, 0x5f, 0x67, 0x9a, 0xa3,
+ 0x71, 0x1f, 0xf7, 0xe3, 0xf7, 0xf2, 0xa2, 0x57,
+ 0x88, 0x4c, 0x84, 0x63, 0x19, 0x63, 0xf7, 0x57,
+ 0x15, 0xfb, 0xe6, 0xfb, 0xf6, 0x72, 0xb6, 0x84,
+ 0xc3, 0x96, 0xc7, 0x19, 0xe1, 0x9d, 0xdb, 0xf7,
+ 0x2b, 0xf7, 0x29, 0x1b, 0xbf, 0xaf, 0x7b, 0x71,
+ 0xa3, 0x1f, 0xe, 0x59, 0xa, 0x96, 0xf8, 0x91,
+ 0x26, 0xa, 0xf7, 0x3c, 0xf7, 0x2f, 0x15, 0xf7,
+ 0x99, 0x26, 0x9c, 0xa9, 0xfb, 0x7b, 0x79, 0xa,
+ 0x59, 0xa, 0xf7, 0x6c, 0xf8, 0xfa, 0x15, 0xf7,
+ 0xb3, 0xf7, 0x0, 0x7a, 0xd2, 0xfb, 0xb2, 0xfb,
+ 0x25, 0x5, 0xfb, 0x51, 0xfb, 0x1f, 0x26, 0xa,
+ 0xe, 0x70, 0xa, 0xf7, 0x4d, 0xc2, 0x50, 0xa,
+ 0xf7, 0x42, 0xf9, 0xe, 0x15, 0xf7, 0x3d, 0xf7,
+ 0x8, 0xf7, 0xa, 0xfb, 0x8, 0xb5, 0x9c, 0xfb,
+ 0x4, 0xf7, 0x2e, 0x5, 0x3c, 0x6, 0xfb, 0x43,
+ 0xfb, 0x2e, 0x5, 0xfb, 0x12, 0xfb, 0x22, 0x26,
+ 0xa, 0xe, 0x70, 0xa, 0x50, 0xa, 0xf7, 0xf8,
+ 0xf9, 0x21, 0x15, 0xdc, 0x6, 0xa4, 0xf7, 0xa,
+ 0x6b, 0xa, 0xfb, 0x3b, 0xfb, 0xa, 0x85, 0xa,
+ 0xa3, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x76, 0xfb,
+ 0x9a, 0x26, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5d,
+ 0xc1, 0x84, 0xa, 0xf7, 0x47, 0xc3, 0x3, 0xb4,
+ 0x16, 0x31, 0xa, 0xf7, 0x34, 0xf8, 0xc7, 0x15,
+ 0xf7, 0xc3, 0xf1, 0x79, 0xd5, 0xfb, 0xc1, 0xfb,
+ 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xd1, 0x61, 0xa,
+ 0xd6, 0xc1, 0x1, 0xf8, 0x92, 0xc0, 0x3, 0xaf,
+ 0x16, 0xf7, 0xba, 0x4d, 0xa, 0xfb, 0x21, 0x6,
+ 0x98, 0xd1, 0x5, 0xf7, 0x15, 0x6, 0xf7, 0x1,
+ 0xf7, 0x5, 0xb5, 0xf7, 0x32, 0xd3, 0x46, 0xb0,
+ 0x37, 0x1f, 0xfb, 0x24, 0x6, 0x99, 0xd6, 0x5,
+ 0xf3, 0x76, 0xa, 0xfb, 0x95, 0x5f, 0xa, 0xf4,
+ 0x6, 0x3a, 0x58, 0xa, 0x23, 0x6, 0xf7, 0x44,
+ 0xf7, 0x10, 0x15, 0xae, 0xf7, 0x5d, 0x5, 0xf7,
+ 0x1a, 0x6, 0xc0, 0xcd, 0x7d, 0x5a, 0x28, 0x41,
+ 0x64, 0x38, 0x1f, 0xe, 0x7c, 0xc2, 0x60, 0xc3,
+ 0xf7, 0xda, 0xc3, 0xf7, 0x1f, 0xc2, 0x12, 0xf7,
+ 0xc4, 0xc0, 0xf7, 0x34, 0xc1, 0x5f, 0xc4, 0x13,
+ 0x7c, 0x9a, 0x88, 0x15, 0xf7, 0x1c, 0x6, 0xe8,
+ 0xf8, 0x76, 0x5, 0xd1, 0x99, 0xa5, 0xa4, 0xf2,
+ 0x1b, 0xd8, 0xc0, 0x8a, 0x54, 0x1f, 0x28, 0xfb,
+ 0x69, 0xb9, 0xfb, 0x23, 0x1a, 0x41, 0xf7, 0x17,
+ 0x73, 0xad, 0x7c, 0x1e, 0x13, 0xba, 0xb8, 0x76,
+ 0x98, 0x74, 0x74, 0x1a, 0x43, 0xfb, 0x26, 0x6d,
+ 0x6d, 0x59, 0x5f, 0xa4, 0xab, 0x69, 0x1e, 0x6b,
+ 0x53, 0x5, 0x6d, 0xb4, 0xc0, 0x71, 0xc4, 0x1b,
+ 0xde, 0xf7, 0x33, 0xb3, 0xf7, 0x1a, 0xb9, 0x5c,
+ 0xac, 0x5c, 0x9f, 0x1f, 0x53, 0xa5, 0x3e, 0x95,
+ 0xae, 0x1a, 0x13, 0x7c, 0xe2, 0xf7, 0x6a, 0x5d,
+ 0xf7, 0x25, 0x1a, 0xe8, 0x48, 0xa0, 0xfb, 0x9,
+ 0x2b, 0x35, 0x6f, 0xfb, 0x1f, 0x79, 0x1e, 0x85,
+ 0x70, 0x7b, 0xa, 0x81, 0x53, 0x5, 0xde, 0x6,
+ 0x4c, 0xfb, 0xda, 0x6b, 0xa, 0xe, 0x4b, 0xa,
+ 0xf7, 0x80, 0xf8, 0xe7, 0x15, 0xf7, 0xa5, 0x24,
+ 0x9d, 0xaa, 0xfb, 0x85, 0xf7, 0x29, 0x5, 0xf4,
+ 0xfd, 0x37, 0x21, 0xa, 0x3b, 0xa, 0xf7, 0x61,
+ 0x77, 0x4a, 0xa, 0x13, 0x7e, 0xf7, 0x3c, 0xf8,
+ 0x85, 0x15, 0xb1, 0x79, 0xf7, 0x43, 0xf7, 0xb,
+ 0xf7, 0x10, 0xfb, 0xb, 0xba, 0x9d, 0xfb, 0xc,
+ 0xf7, 0x31, 0x5, 0x3a, 0x6, 0xb3, 0xfd, 0x25,
+ 0x21, 0xa, 0x4b, 0xa, 0xf8, 0xa0, 0xf8, 0xe7,
+ 0x15, 0x72, 0xd8, 0xfb, 0x9e, 0xfb, 0x29, 0x9d,
+ 0x6c, 0x5, 0xf7, 0x20, 0xfc, 0x83, 0x21, 0xa,
+ 0x3b, 0xa, 0xc6, 0xbd, 0x9e, 0xbc, 0x90, 0x76,
+ 0x4a, 0xa, 0x13, 0xbd, 0x80, 0xf7, 0x21, 0xf8,
+ 0x9e, 0x15, 0xbd, 0x81, 0x5, 0x9a, 0x92, 0xba,
+ 0xbd, 0xb0, 0x1b, 0xb1, 0x9e, 0x71, 0x77, 0xa5,
+ 0x1f, 0x7e, 0x9b, 0x9e, 0x81, 0xa7, 0x1b, 0x13,
+ 0xbb, 0x80, 0xcc, 0xbe, 0xba, 0xc2, 0xab, 0x1f,
+ 0x8a, 0x6, 0x5a, 0x94, 0x5, 0x73, 0x7c, 0x68,
+ 0x66, 0x65, 0x1b, 0x72, 0x7d, 0x94, 0x97, 0x7e,
+ 0x1f, 0x13, 0x7d, 0x80, 0x9f, 0x75, 0x7a, 0xa6,
+ 0x55, 0x1b, 0x56, 0x4c, 0x64, 0x4a, 0x67, 0x1f,
+ 0xf7, 0x8e, 0xfc, 0xa1, 0x22, 0xa, 0x13, 0xbd,
+ 0x80, 0x3a, 0xa, 0x13, 0x7d, 0x80, 0x98, 0xce,
+ 0x15, 0x13, 0xbd, 0x80, 0x2b, 0xa, 0x3b, 0xa,
+ 0xd1, 0xf7, 0x8, 0x4a, 0xa, 0x13, 0x7e, 0xf8,
+ 0x1f, 0xf8, 0x9b, 0x15, 0xdf, 0x5c, 0xa, 0x36,
+ 0x6, 0xfb, 0x42, 0xfb, 0x8, 0x15, 0xe0, 0x5c,
+ 0xa, 0x36, 0x6, 0xf7, 0xd, 0xfd, 0x12, 0x21,
+ 0xa, 0x3b, 0xa, 0xb1, 0xf7, 0x48, 0x6a, 0x76,
+ 0x4a, 0xa, 0x13, 0xbb, 0xf7, 0xb2, 0xf8, 0xc1,
+ 0x15, 0x63, 0xae, 0x6d, 0xba, 0xc6, 0xc7, 0xbc,
+ 0xc5, 0xb5, 0x6a, 0xaa, 0x5b, 0x4d, 0x51, 0x59,
+ 0x4f, 0x1e, 0xc9, 0x95, 0x15, 0x13, 0x77, 0xa4,
+ 0xa1, 0xa0, 0xa3, 0x9c, 0x9a, 0x81, 0x7d, 0x72,
+ 0x74, 0x75, 0x73, 0x7b, 0x7c, 0x97, 0x98, 0x1e,
+ 0xb6, 0xfc, 0xce, 0x22, 0xa, 0x13, 0xbb, 0x3a,
+ 0xa, 0x13, 0x7b, 0x98, 0xce, 0x15, 0x13, 0xbb,
+ 0x2b, 0xa, 0x7c, 0xc1, 0xf7, 0x39, 0xc2, 0xf7,
+ 0x13, 0xc2, 0x1, 0x93, 0xc6, 0x3, 0xf7, 0xa5,
+ 0xd7, 0x15, 0x58, 0x93, 0xb7, 0x63, 0xda, 0x1b,
+ 0xb8, 0xbb, 0x96, 0x96, 0xb3, 0x1f, 0x8a, 0xc1,
+ 0x5, 0x82, 0x6a, 0x62, 0x7e, 0x67, 0x1b, 0x3e,
+ 0x6c, 0xbc, 0xcc, 0x8d, 0x1f, 0x97, 0x8f, 0x98,
+ 0x8c, 0x98, 0x1e, 0x8c, 0x98, 0x5, 0xf7, 0x91,
+ 0x6, 0x93, 0xad, 0x90, 0xa4, 0xaf, 0x1a, 0xd4,
+ 0x6f, 0xd0, 0x33, 0x54, 0x65, 0x71, 0x62, 0x68,
+ 0x1e, 0x99, 0x88, 0x88, 0xc0, 0x2b, 0x1b, 0x55,
+ 0x5f, 0x7e, 0x7b, 0x5c, 0x1f, 0x56, 0x7, 0x98,
+ 0xb0, 0xb6, 0x99, 0xb4, 0x1b, 0xbf, 0x9c, 0x78,
+ 0x6a, 0x8c, 0x1f, 0x80, 0x8b, 0x73, 0x87, 0x7c,
+ 0x1e, 0x85, 0x72, 0x5, 0x8f, 0x76, 0x75, 0x83,
+ 0x76, 0x1b, 0x2c, 0x8a, 0xfb, 0x7, 0x59, 0xfb,
+ 0xe, 0x1a, 0x48, 0xbe, 0x6d, 0xc1, 0xa5, 0xe0,
+ 0x90, 0xe1, 0xbc, 0x1e, 0xce, 0xf7, 0x4b, 0x15,
+ 0xcb, 0x9b, 0xbe, 0xca, 0xc9, 0x1b, 0xd5, 0x87,
+ 0x3e, 0x59, 0x87, 0x1f, 0xfb, 0xad, 0xfb, 0x18,
+ 0x15, 0x75, 0x7b, 0x58, 0x49, 0x4b, 0x1b, 0x68,
+ 0x76, 0xa0, 0xaf, 0xd7, 0xd7, 0xa7, 0xc5, 0x8c,
+ 0x1f, 0xa7, 0xaa, 0x92, 0x87, 0x96, 0x1f, 0xe,
+ 0xfb, 0x1c, 0x76, 0xf7, 0x3a, 0xbe, 0xf7, 0xdc,
+ 0xc0, 0x8a, 0x77, 0x12, 0xb9, 0xc5, 0x13, 0xe8,
+ 0xf7, 0x26, 0xfb, 0x1e, 0x15, 0x7c, 0xa1, 0x9f,
+ 0x87, 0x9d, 0x1b, 0xbe, 0xb3, 0xaa, 0xbf, 0xa3,
+ 0x78, 0xa9, 0x7d, 0x90, 0x1f, 0x90, 0xa3, 0xe1,
+ 0x8f, 0xd3, 0xa9, 0xcb, 0xb3, 0x19, 0x80, 0xbf,
+ 0x5, 0x76, 0x6c, 0x31, 0x55, 0x38, 0x1b, 0xfb,
+ 0x1c, 0x67, 0xda, 0xc8, 0xe3, 0xf2, 0xef, 0xf7,
+ 0x10, 0xc5, 0xbe, 0x7f, 0x69, 0xb0, 0x1f, 0x7b,
+ 0x40, 0x51, 0xa, 0x13, 0xd8, 0xb0, 0xf7, 0x41,
+ 0x71, 0xa, 0x82, 0x60, 0x5, 0x13, 0xe8, 0xa8,
+ 0x62, 0x5d, 0x9a, 0x50, 0x1b, 0xfb, 0x58, 0x26,
+ 0xfb, 0x1b, 0xfb, 0x10, 0x26, 0xd7, 0x4d, 0xee,
+ 0x81, 0x1f, 0x77, 0x44, 0x5, 0x8d, 0x90, 0x92,
+ 0x8c, 0x93, 0x1b, 0x98, 0x98, 0x7e, 0x80, 0x77,
+ 0x79, 0x7d, 0x77, 0x7f, 0x77, 0x91, 0x96, 0x82,
+ 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, 0x7f,
+ 0xa, 0xc5, 0x3, 0xf7, 0x7d, 0xf8, 0xe9, 0x15,
+ 0xf7, 0xa8, 0x25, 0x9d, 0xa9, 0xfb, 0x88, 0xf7,
+ 0x27, 0x5, 0xfb, 0x39, 0xfc, 0x6b, 0x27, 0xa,
+ 0x7c, 0xc2, 0xf7, 0x33, 0xc5, 0x7f, 0xa, 0xc7,
+ 0x3, 0xf7, 0x78, 0xf8, 0x82, 0x15, 0xf7, 0xd0,
+ 0xf2, 0x77, 0xd6, 0xfb, 0xc2, 0xfb, 0x26, 0x5,
+ 0x23, 0xfb, 0xd9, 0x27, 0xa, 0x7c, 0xc2, 0xf7,
+ 0x34, 0xc4, 0xf7, 0x2c, 0xc4, 0xf7, 0x18, 0xc3,
+ 0x1, 0xc1, 0xc5, 0xf8, 0xb, 0xc6, 0x3, 0xf7,
+ 0x3b, 0xf8, 0x86, 0x15, 0xb1, 0x79, 0xf7, 0x41,
+ 0xf7, 0xa, 0xf7, 0xf, 0xfb, 0xa, 0xb8, 0x9d,
+ 0xfb, 0x9, 0xf7, 0x30, 0x89, 0xa, 0xfb, 0x7b,
+ 0xfc, 0x59, 0x27, 0xa, 0x7c, 0xbd, 0xf7, 0x38,
+ 0xc5, 0xf7, 0x32, 0x76, 0xf7, 0x1c, 0xf7, 0x7,
+ 0x1, 0xc1, 0xc5, 0xf7, 0x16, 0xe3, 0xcc, 0xe2,
+ 0x90, 0xc6, 0x3, 0xf8, 0x1f, 0xf8, 0xa6, 0x15,
+ 0xe2, 0x6e, 0xa, 0x33, 0x6, 0xfb, 0x45, 0xfb,
+ 0x7, 0x15, 0xe3, 0x6e, 0xa, 0x33, 0x6, 0xfb,
+ 0x29, 0xfc, 0x50, 0x27, 0xa, 0x6f, 0xa, 0xf7,
+ 0x7f, 0x77, 0x1, 0xf7, 0x82, 0xf8, 0xe8, 0x15,
+ 0xf7, 0x93, 0x25, 0x9c, 0xab, 0xfb, 0x75, 0xf7,
+ 0x26, 0x5, 0xfb, 0x61, 0xfd, 0x34, 0x33, 0xa,
+ 0x6f, 0xa, 0xf7, 0x7f, 0x77, 0x1, 0xdb, 0x16,
+ 0xf8, 0x13, 0x46, 0xa, 0xfb, 0x3a, 0x6, 0xd2,
+ 0xf8, 0x12, 0x5, 0xfb, 0x4f, 0x67, 0xa, 0xf7,
+ 0x1b, 0x6, 0x4e, 0xfb, 0xdb, 0x5, 0xfb, 0x3b,
+ 0x6, 0xf7, 0x2f, 0xf8, 0x4b, 0x15, 0xf7, 0xa7,
+ 0xf1, 0x70, 0xd7, 0xfb, 0x9d, 0xfb, 0x26, 0x5,
+ 0xe, 0x6f, 0xa, 0xf7, 0x6d, 0x77, 0x1, 0xf7,
+ 0x36, 0xf8, 0x86, 0x15, 0xaf, 0x79, 0xf7, 0x3c,
+ 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0xb8, 0x9d,
+ 0xfb, 0x5, 0xf7, 0x30, 0x5, 0x3e, 0x6, 0xfb,
+ 0x96, 0xfd, 0x22, 0x33, 0xa, 0x6f, 0xa, 0xde,
+ 0xf7, 0x7, 0x1, 0xf8, 0x2c, 0xf8, 0x9c, 0x15,
+ 0xe4, 0x6e, 0xa, 0x32, 0x6, 0xfb, 0x4b, 0xfb,
+ 0x7, 0x15, 0xe6, 0x6e, 0xa, 0x31, 0x6, 0xfb,
+ 0x58, 0xfd, 0xf, 0x33, 0xa, 0x7c, 0xbe, 0xf7,
+ 0xc6, 0xbf, 0xf7, 0x7f, 0x77, 0x1, 0xaa, 0xc6,
+ 0xf8, 0x2f, 0xce, 0x3, 0xf7, 0x9b, 0xf8, 0x50,
+ 0x15, 0xf7, 0x13, 0xc6, 0xd2, 0x5d, 0xad, 0x28,
+ 0x8e, 0x7d, 0x19, 0xaa, 0x69, 0x4c, 0x9e, 0x53,
+ 0x1b, 0xfb, 0x66, 0x23, 0xfb, 0x11, 0xfb, 0x11,
+ 0x22, 0xe5, 0x55, 0xf7, 0x15, 0xf7, 0x6e, 0xef,
+ 0xf7, 0x26, 0xf7, 0x35, 0xd9, 0x6c, 0xef, 0x37,
+ 0xcb, 0x1f, 0xf2, 0xbd, 0x78, 0xb8, 0xfb, 0x18,
+ 0x4b, 0x66, 0x9d, 0x62, 0xa2, 0x5d, 0x90, 0x19,
+ 0x5e, 0x5d, 0xac, 0x88, 0xaf, 0x79, 0xa9, 0x7f,
+ 0x19, 0x31, 0x5f, 0x5, 0xfb, 0x2f, 0xfb, 0xe7,
+ 0x15, 0xf7, 0x7, 0xf7, 0x1, 0xd9, 0xf7, 0x11,
+ 0x1e, 0x92, 0x6, 0xf7, 0x18, 0xb1, 0x5c, 0x52,
+ 0x22, 0xfb, 0xa, 0x2a, 0xfb, 0xe, 0x27, 0x44,
+ 0xb6, 0xd1, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xc5,
+ 0xc0, 0xdb, 0xbb, 0x9b, 0xbf, 0x1, 0xea, 0xc3,
+ 0xf7, 0xa9, 0xc3, 0x3, 0xf7, 0x45, 0xf8, 0x96,
+ 0x15, 0xbb, 0x7d, 0x5, 0x9a, 0x92, 0xb9, 0xbc,
+ 0xaf, 0x1b, 0xaa, 0x9b, 0x79, 0x7a, 0x9d, 0x1f,
+ 0x7c, 0x9b, 0x9e, 0x7d, 0xae, 0x1b, 0xcb, 0xc6,
+ 0xb9, 0xc2, 0xa9, 0x1f, 0x59, 0x97, 0x5, 0x73,
+ 0x7d, 0x5e, 0x62, 0x65, 0x1b, 0x73, 0x7e, 0x9a,
+ 0x9a, 0x7c, 0x1f, 0x9d, 0x7a, 0x78, 0x9f, 0x62,
+ 0x1b, 0x56, 0x4e, 0x65, 0x4b, 0x68, 0x1f, 0xfb,
+ 0x46, 0xfc, 0x96, 0x15, 0xf7, 0x76, 0x6, 0x97,
+ 0xbf, 0x5, 0x35, 0x6, 0xbb, 0xf7, 0x7c, 0x5,
+ 0xb6, 0xc0, 0xda, 0xb7, 0xca, 0x1b, 0xb1, 0xbc,
+ 0x82, 0x5f, 0x84, 0x8b, 0x82, 0x89, 0x82, 0x1f,
+ 0x58, 0xfb, 0x85, 0x5, 0x37, 0x82, 0xa, 0xf7,
+ 0x73, 0x6, 0x97, 0xbf, 0x5, 0x37, 0x6, 0xbd,
+ 0xf7, 0x86, 0x5, 0x8e, 0x98, 0x8d, 0x97, 0x96,
+ 0x1a, 0xc5, 0x8c, 0x67, 0xae, 0x38, 0x1b, 0x44,
+ 0x3e, 0x65, 0x5f, 0x4d, 0x1f, 0x9a, 0xd0, 0x5,
+ 0xfb, 0x21, 0x6, 0x80, 0x56, 0x5, 0xe0, 0x6,
+ 0x4b, 0xfb, 0xc5, 0x5, 0x36, 0x6, 0xe, 0x5a,
+ 0xa, 0xf7, 0x7d, 0xf8, 0xe7, 0x15, 0xf7, 0x93,
+ 0x23, 0x9a, 0xaa, 0xfb, 0x73, 0xf7, 0x2a, 0x5,
+ 0xfb, 0x73, 0xfc, 0x90, 0x29, 0xa, 0xe, 0x5a,
+ 0xa, 0xc4, 0xf7, 0x38, 0x29, 0xa, 0xf7, 0x15,
+ 0xf7, 0xcc, 0x15, 0xf7, 0xba, 0xea, 0x7b, 0xe1,
+ 0xfb, 0xb9, 0xfb, 0x2a, 0x5, 0xe, 0x5d, 0xa,
+ 0xf7, 0x62, 0x77, 0x49, 0xa, 0xf7, 0x43, 0xf8,
+ 0x85, 0x15, 0xae, 0x79, 0xf7, 0x38, 0xf7, 0xb,
+ 0xf7, 0x8, 0xfb, 0xb, 0xb7, 0x9d, 0xfb, 0x4,
+ 0xf7, 0x31, 0x5, 0x3f, 0x6, 0xfb, 0xb5, 0xfc,
+ 0x7e, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xc9, 0xbd,
+ 0x9c, 0xbc, 0x49, 0xa, 0xf7, 0x2c, 0xf8, 0xa1,
+ 0x15, 0xbb, 0x80, 0x5, 0x9a, 0x91, 0xb6, 0xbb,
+ 0xaf, 0x1b, 0xa3, 0x9c, 0x7c, 0x7b, 0x9d, 0x1f,
+ 0x7a, 0x9f, 0x9f, 0x78, 0xaa, 0x1b, 0xc8, 0xc5,
+ 0xbb, 0xc2, 0xa8, 0x1f, 0x5b, 0x94, 0x5, 0x73,
+ 0x7d, 0x63, 0x65, 0x67, 0x1b, 0x75, 0x7b, 0x99,
+ 0x98, 0x7c, 0x1f, 0x9e, 0x75, 0x76, 0x9f, 0x69,
+ 0x1b, 0x59, 0x50, 0x67, 0x4a, 0x69, 0x1f, 0x2c,
+ 0xfb, 0xfd, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xd3,
+ 0xf7, 0x7, 0x49, 0xa, 0xf8, 0x11, 0xf8, 0x9c,
+ 0x15, 0xda, 0x6, 0xa3, 0xf7, 0x7, 0x89, 0xa,
+ 0xfb, 0x38, 0xfb, 0x7, 0x15, 0xdc, 0x6, 0xa2,
+ 0xf7, 0x7, 0x5, 0x3a, 0x6, 0xfb, 0x62, 0xfc,
+ 0x6b, 0x29, 0xa, 0xe, 0xc6, 0x76, 0xf7, 0x55,
+ 0xc6, 0xf7, 0x45, 0x77, 0x1, 0xf7, 0xad, 0xf8,
+ 0x2e, 0x6c, 0xa, 0x9f, 0x75, 0x71, 0x6f, 0x70,
+ 0x6d, 0x1e, 0xfb, 0x5c, 0xfb, 0x47, 0x15, 0xf8,
+ 0x3e, 0x6, 0x96, 0xc6, 0x5, 0xfc, 0x3e, 0x6,
+ 0xf7, 0x1b, 0xfb, 0x64, 0x6c, 0xa, 0x9d, 0x75,
+ 0x71, 0x6f, 0x72, 0x6d, 0x1e, 0xe, 0x7f, 0xc3,
+ 0x63, 0x76, 0xf8, 0x2e, 0xc2, 0x8e, 0x77, 0x12,
+ 0x13, 0x60, 0xa3, 0xa3, 0x15, 0xa7, 0x62, 0xcb,
+ 0xbe, 0x5, 0x13, 0x90, 0x69, 0xb1, 0xc0, 0x7f,
+ 0xbd, 0x1b, 0xf7, 0x14, 0xf7, 0xf, 0xdd, 0xf7,
+ 0x29, 0xa6, 0x1f, 0x95, 0xbf, 0x86, 0xbf, 0x72,
+ 0xb1, 0xc8, 0xbc, 0x18, 0x6f, 0xb4, 0x4c, 0x58,
+ 0x5, 0x13, 0xa0, 0xac, 0x65, 0x5a, 0x9a, 0x53,
+ 0x1b, 0xfb, 0x2d, 0x21, 0x22, 0xfb, 0x11, 0x73,
+ 0x1f, 0x82, 0x55, 0x91, 0x54, 0xa6, 0x65, 0x8,
+ 0xdb, 0x8d, 0x15, 0xf7, 0xc6, 0xf7, 0x8d, 0x9c,
+ 0x6e, 0x8f, 0x66, 0x83, 0x65, 0x19, 0x7e, 0x5d,
+ 0x5, 0x68, 0x7d, 0x52, 0x2e, 0xfb, 0x18, 0x1b,
+ 0x65, 0x66, 0x93, 0xa0, 0x6f, 0x1f, 0x69, 0xb0,
+ 0x15, 0x78, 0xa7, 0x86, 0xb3, 0x92, 0xb3, 0x8,
+ 0xf6, 0x9f, 0xea, 0xcf, 0xf3, 0x1b, 0xaa, 0xb6,
+ 0x84, 0x72, 0xab, 0x1f, 0xe, 0x4e, 0xa, 0xf7,
+ 0x80, 0x77, 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7,
+ 0x75, 0xf8, 0xea, 0x15, 0xf7, 0x9c, 0x21, 0x9b,
+ 0xad, 0xfb, 0x7c, 0xf7, 0x26, 0x5, 0xfb, 0x65,
+ 0xfb, 0xb8, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x80,
+ 0x77, 0x12, 0xdd, 0xc6, 0x13, 0xb8, 0xf7, 0x77,
+ 0xf8, 0x81, 0x15, 0xf7, 0xd4, 0xf3, 0x77, 0xd6,
+ 0xfb, 0xc7, 0xfb, 0x20, 0x5, 0xfb, 0x3b, 0xfb,
+ 0x2c, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x82, 0x77,
+ 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7, 0x39, 0xf8,
+ 0x98, 0x15, 0xaf, 0x7a, 0xf7, 0x3d, 0xf7, 0xb,
+ 0xf7, 0xc, 0xfb, 0xb, 0xb8, 0x9c, 0xfb, 0x7,
+ 0xf7, 0x32, 0x5, 0x3d, 0x6, 0xfb, 0xaa, 0xfb,
+ 0xba, 0x24, 0xa, 0x4e, 0xa, 0xe8, 0xf7, 0x8,
+ 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf8, 0x10, 0xf8,
+ 0xa5, 0x15, 0xdc, 0x6, 0xa3, 0xf7, 0x8, 0x6b,
+ 0xa, 0xfb, 0x3d, 0xfb, 0x8, 0x15, 0xdf, 0x6,
+ 0xa2, 0xf7, 0x8, 0x7b, 0xa, 0xfb, 0x56, 0xfb,
+ 0x9d, 0x24, 0xa, 0xfb, 0x31, 0xc1, 0xf8, 0x72,
+ 0xc1, 0x1, 0xe0, 0xcb, 0xf7, 0xf6, 0xcb, 0x3,
+ 0xf7, 0x70, 0xf8, 0x89, 0x15, 0xf7, 0xdb, 0xef,
+ 0x76, 0xd2, 0xfb, 0xcc, 0xfb, 0x20, 0x5, 0xfb,
+ 0x89, 0xfd, 0xf, 0x15, 0x7f, 0x55, 0x5, 0xf7,
+ 0xa3, 0x2a, 0xa, 0x31, 0x6, 0xf8, 0x36, 0xf8,
+ 0x72, 0x5, 0xce, 0x4d, 0xa, 0xfb, 0x52, 0x5f,
+ 0xa, 0xc6, 0x6, 0xfb, 0x82, 0xfb, 0xa1, 0x26,
+ 0xf7, 0xa1, 0x5, 0xcf, 0x4d, 0xa, 0xfb, 0x5f,
+ 0x2d, 0xa, 0xd3, 0x6, 0xf7, 0xf, 0xfb, 0xd6,
+ 0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0xfb, 0x31,
+ 0xc0, 0xf7, 0xc, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+ 0xb, 0xc0, 0x1, 0xdc, 0xc2, 0xf8, 0x3a, 0xc4,
+ 0x3, 0x88, 0x23, 0x15, 0x80, 0x56, 0x5, 0xf7,
+ 0xba, 0x80, 0xa, 0xfb, 0x2f, 0x6, 0xb6, 0xf7,
+ 0x64, 0x5, 0x65, 0xa3, 0xb9, 0x59, 0xe7, 0x1b,
+ 0xf7, 0x22, 0xf7, 0x18, 0xf7, 0x11, 0xf7, 0x2a,
+ 0xf3, 0x37, 0xc9, 0x2c, 0x34, 0x49, 0x71, 0x5e,
+ 0x5e, 0x1f, 0xbc, 0xf7, 0x87, 0x5, 0xfb, 0x1e,
+ 0x6, 0x7f, 0x56, 0x5, 0xdf, 0x6, 0xfb, 0x20,
+ 0xfd, 0x3c, 0x5, 0xf7, 0x17, 0xf7, 0xf3, 0x15,
+ 0xe2, 0x9d, 0xdb, 0xd0, 0xf7, 0x1, 0x1b, 0xf7,
+ 0x5, 0xa5, 0x3c, 0x52, 0xfb, 0xa, 0xfb, 0xf,
+ 0x3c, 0x34, 0x2d, 0x4c, 0xd8, 0xef, 0xa0, 0x1f,
+ 0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x64, 0xbc, 0xd8,
+ 0xf7, 0x4, 0x1, 0xf8, 0x15, 0xf8, 0x81, 0x15,
+ 0xe3, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x33, 0x6,
+ 0xfb, 0x4b, 0xfb, 0x4, 0x15, 0xe6, 0x6, 0xa4,
+ 0xf7, 0x4, 0x5, 0x31, 0x6, 0xfb, 0xb0, 0xfd,
+ 0x5c, 0x15, 0x7f, 0x59, 0x5, 0xf7, 0xa2, 0x6,
+ 0x97, 0xbd, 0x5, 0x30, 0x6, 0xf8, 0x36, 0xf8,
+ 0x64, 0x5, 0xce, 0x6, 0x96, 0xbc, 0x5, 0xfb,
+ 0x51, 0x6, 0x7f, 0x5a, 0x5, 0xc6, 0x6, 0xfb,
+ 0x80, 0xfb, 0x97, 0x24, 0xf7, 0x97, 0x5, 0xd0,
+ 0x6, 0x95, 0xbc, 0x5, 0xfb, 0x5f, 0x6, 0x81,
+ 0x5a, 0x5, 0xd2, 0x6, 0xf7, 0xf, 0xfb, 0xc8,
+ 0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0x8b, 0xc1,
+ 0xf8, 0x3e, 0xc2, 0xcf, 0xf7, 0x5, 0x1, 0xaf,
+ 0x16, 0x44, 0xa, 0xf8, 0x3e, 0x37, 0xa, 0xfc,
+ 0x3e, 0x5, 0xfb, 0x45, 0x6, 0xf7, 0xa8, 0xf8,
+ 0xb9, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x5, 0x5,
+ 0x31, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1,
+ 0x1, 0xf7, 0xab, 0xc3, 0x3, 0xe5, 0x16, 0xf8,
+ 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xd4, 0xf8,
+ 0x8, 0x5, 0xfb, 0x5b, 0x5f, 0xa, 0xf7, 0x24,
+ 0x6, 0x4b, 0xfb, 0xd2, 0x5, 0xfb, 0x46, 0x6,
+ 0xe, 0x7a, 0xc1, 0x69, 0x76, 0xf8, 0xa2, 0xc1,
+ 0x12, 0xf7, 0x23, 0xc6, 0xf7, 0xd5, 0xc1, 0x13,
+ 0xb8, 0x68, 0x7a, 0x15, 0xf7, 0x56, 0x47, 0xa,
+ 0x49, 0x6, 0xec, 0xf8, 0x6b, 0x5, 0xc9, 0x47,
+ 0xa, 0xfb, 0x4e, 0x45, 0xa, 0xcc, 0x6, 0x2a,
+ 0xfc, 0x6b, 0x5, 0x46, 0x6, 0xf7, 0x92, 0xa0,
+ 0x15, 0x13, 0x78, 0x67, 0xa3, 0xa8, 0x63, 0xce,
+ 0x1b, 0xf7, 0x13, 0x98, 0x7c, 0xa, 0xba, 0x36,
+ 0xa, 0xfb, 0x66, 0x38, 0xa, 0xf7, 0x1, 0x6,
+ 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x88, 0x4d,
+ 0x36, 0x1b, 0x71, 0x5b, 0x91, 0xf7, 0xe, 0xa2,
+ 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0xfb, 0x31,
+ 0xc1, 0xf8, 0x84, 0xc4, 0xe4, 0xf7, 0xa, 0x1,
+ 0xf8, 0x7f, 0xf8, 0xaf, 0x54, 0xa, 0xfb, 0xa2,
+ 0xfd, 0xb2, 0x15, 0x81, 0xa8, 0xa1, 0x85, 0xa8,
+ 0x1b, 0xf6, 0x92, 0xb6, 0xf7, 0x12, 0xad, 0x1f,
+ 0xea, 0xf8, 0x45, 0x5, 0xfb, 0x25, 0x82, 0xa,
+ 0xdf, 0x6, 0x39, 0xfc, 0x3, 0x74, 0x2e, 0x83,
+ 0x69, 0x5c, 0x89, 0x19, 0x6c, 0x8a, 0x7c, 0x91,
+ 0x73, 0x92, 0x8, 0xfb, 0x93, 0x81, 0x15, 0x80,
+ 0x55, 0x5, 0xf7, 0x3c, 0x6, 0x98, 0xc1, 0x5,
+ 0x4e, 0x6, 0xf7, 0x1, 0xf8, 0x84, 0x5, 0xc3,
+ 0x46, 0xa, 0xfb, 0x3e, 0x38, 0xa, 0xc1, 0x6,
+ 0xfb, 0x1, 0xfc, 0x84, 0x5, 0xf7, 0x17, 0xf9,
+ 0x14, 0x54, 0xa, 0xe, 0x3e, 0xa, 0x9f, 0x16,
+ 0xf8, 0x91, 0x6, 0xbe, 0xf7, 0x91, 0x71, 0xa,
+ 0x5f, 0xfb, 0x5b, 0x5, 0xfb, 0xb2, 0x6, 0xb0,
+ 0xf7, 0x4e, 0xf7, 0x53, 0xd1, 0x96, 0xc2, 0xfb,
+ 0x53, 0x44, 0xb6, 0xf7, 0x6a, 0x5, 0xf7, 0x13,
+ 0x2a, 0xa, 0xfb, 0xb6, 0x45, 0xa, 0xf7, 0x0,
+ 0x6, 0x5c, 0xfb, 0x80, 0x30, 0x69, 0x80, 0x55,
+ 0xe6, 0xad, 0x6b, 0xfb, 0x38, 0x57, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x1, 0xc3, 0x16,
+ 0xf8, 0x57, 0x6, 0x98, 0xc2, 0x5, 0xfb, 0x56,
+ 0x6, 0xbf, 0xf7, 0x89, 0xf7, 0x2e, 0xc0, 0x97,
+ 0xc2, 0xfb, 0x2d, 0x56, 0xc5, 0xf7, 0xa6, 0x5,
+ 0xfb, 0x90, 0x56, 0xa, 0xf7, 0x53, 0x6, 0x58,
+ 0xfb, 0x85, 0xfb, 0x33, 0x55, 0x80, 0x55, 0xf7,
+ 0x32, 0xc0, 0x59, 0xfb, 0x73, 0x5, 0xfb, 0x57,
+ 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+ 0x5c, 0xc1, 0x1, 0x85, 0xc3, 0x3, 0xf7, 0xc2,
+ 0xc1, 0x15, 0xb2, 0xf7, 0x5b, 0x5, 0xda, 0x60,
+ 0xa, 0xc1, 0x6, 0xac, 0xf7, 0x3a, 0x5, 0x55,
+ 0x38, 0xa, 0x3c, 0x6, 0xb2, 0xf7, 0x5c, 0x5,
+ 0xf7, 0x2a, 0x6, 0x78, 0x27, 0x6a, 0xa, 0xa9,
+ 0xf7, 0x2e, 0x5, 0xfb, 0xa5, 0x6, 0xfb, 0x3f,
+ 0xfb, 0x3d, 0xfb, 0x21, 0xfb, 0x6a, 0xfb, 0x3,
+ 0xc3, 0x2b, 0xf7, 0x32, 0x1f, 0xf7, 0xb5, 0x6,
+ 0xaa, 0xf7, 0x2c, 0x52, 0xa, 0x77, 0x29, 0x5,
+ 0xfb, 0x62, 0x16, 0xfb, 0x25, 0x57, 0xc9, 0xf2,
+ 0xf7, 0x3e, 0xf7, 0x2c, 0xf7, 0xc, 0xf7, 0x1a,
+ 0x8a, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x38, 0xc1,
+ 0xf7, 0x14, 0xc2, 0x1, 0x9e, 0xc2, 0xf7, 0x65,
+ 0xba, 0xf7, 0x57, 0xc2, 0x3, 0xf7, 0xad, 0xd3,
+ 0x15, 0x57, 0x9b, 0xaa, 0x68, 0xd5, 0x1b, 0xb6,
+ 0xba, 0x97, 0x96, 0xb2, 0x1f, 0xc2, 0x7, 0x82,
+ 0x6d, 0x62, 0x7d, 0x68, 0x1b, 0x4c, 0x64, 0xad,
+ 0xd6, 0x99, 0x8e, 0xa5, 0x8f, 0x9a, 0x1f, 0xf7,
+ 0x80, 0x6, 0x94, 0xaa, 0x90, 0xa2, 0xae, 0x1a,
+ 0xd6, 0x78, 0xd4, 0x36, 0x46, 0x5f, 0x5a, 0x6d,
+ 0x76, 0x1e, 0xba, 0x80, 0x69, 0xab, 0x4b, 0x1b,
+ 0xfb, 0x2f, 0x50, 0xfb, 0x5c, 0xfb, 0x11, 0xfb,
+ 0xc, 0xe3, 0x80, 0xa8, 0xe3, 0xb7, 0xcb, 0xa2,
+ 0x98, 0x1f, 0xc7, 0xf7, 0x4e, 0x15, 0xcb, 0x9b,
+ 0xbe, 0xcb, 0xc7, 0x1b, 0xd1, 0x82, 0x3d, 0x59,
+ 0x87, 0x1f, 0xfc, 0x57, 0xfb, 0xf, 0x15, 0xe9,
+ 0xbe, 0xf7, 0x31, 0xec, 0xe2, 0x7e, 0x29, 0x4c,
+ 0x7e, 0x1e, 0x47, 0x7f, 0x75, 0xfb, 0x9, 0x23,
+ 0x1b, 0x4d, 0x82, 0xbc, 0xb9, 0x1f, 0xe, 0xfb,
+ 0x16, 0x76, 0xf7, 0x70, 0xc6, 0xf7, 0x36, 0xc4,
+ 0xf7, 0x3a, 0xc8, 0x91, 0x77, 0x12, 0xeb, 0xce,
+ 0xf7, 0xd0, 0xcf, 0x13, 0xf6, 0x98, 0xcf, 0x15,
+ 0xcc, 0x6, 0x97, 0xc7, 0xba, 0x75, 0xb8, 0x6c,
+ 0xd8, 0x85, 0x19, 0x78, 0x38, 0x5, 0x90, 0x94,
+ 0x95, 0x8c, 0x94, 0x1b, 0x9b, 0x98, 0x80, 0x7d,
+ 0x7d, 0x84, 0x6d, 0x68, 0x7a, 0x79, 0x8f, 0x94,
+ 0x7f, 0x1f, 0x6c, 0x50, 0x5, 0x82, 0x91, 0xa6,
+ 0x78, 0xad, 0x1b, 0xbb, 0xc9, 0xb5, 0xe1, 0xa6,
+ 0x7e, 0xaf, 0x73, 0x96, 0x1f, 0x8e, 0x9d, 0x5,
+ 0xf7, 0x20, 0x91, 0xe2, 0xba, 0xf6, 0x1a, 0xcf,
+ 0x3c, 0xb8, 0x34, 0x90, 0x1e, 0x3c, 0x8f, 0xfb,
+ 0x1f, 0x7f, 0xe5, 0x1a, 0xc7, 0xf7, 0xc, 0xa3,
+ 0xbc, 0xcc, 0xc8, 0x73, 0x6e, 0xb7, 0x1e, 0x7e,
+ 0x52, 0x5, 0xc9, 0x6, 0x13, 0xee, 0xaf, 0xf7,
+ 0x45, 0x5, 0x4d, 0x6, 0x82, 0x54, 0x5, 0x13,
+ 0xf6, 0xa8, 0x5b, 0x4e, 0x9f, 0x4a, 0x1b, 0xfb,
+ 0x16, 0xfb, 0x8, 0x50, 0x30, 0xfb, 0x16, 0xf7,
+ 0x1f, 0x8b, 0xf3, 0x87, 0x1f, 0xdf, 0x88, 0xc3,
+ 0x75, 0x5a, 0x1a, 0x35, 0xfb, 0x22, 0x89, 0x56,
+ 0x40, 0x53, 0xad, 0xb4, 0x5b, 0x1e, 0x96, 0xc0,
+ 0x5, 0x4b, 0x6, 0xe, 0xfb, 0x16, 0x76, 0xf7,
+ 0x47, 0xba, 0xf7, 0x17, 0xb9, 0xf7, 0x1b, 0xbd,
+ 0x8f, 0x77, 0x12, 0xf7, 0xa, 0xc8, 0xf7, 0xac,
+ 0xc7, 0x13, 0xf6, 0xba, 0xa6, 0x15, 0xc2, 0x6,
+ 0x96, 0xbb, 0xb5, 0x7a, 0xb5, 0x76, 0xcd, 0x82,
+ 0x19, 0x7b, 0x47, 0x5, 0x8e, 0x92, 0x92, 0x8d,
+ 0x92, 0x1b, 0x9a, 0x99, 0x82, 0x7f, 0x80, 0x85,
+ 0x73, 0x6c, 0x7c, 0x7b, 0x8e, 0x92, 0x80, 0x1f,
+ 0x70, 0x5c, 0x5, 0x83, 0x90, 0xa3, 0x7c, 0xa9,
+ 0x1b, 0xb5, 0xc2, 0xac, 0xd0, 0x1f, 0x8a, 0xa1,
+ 0x81, 0xaa, 0x76, 0x94, 0x8d, 0x9a, 0x18, 0xf7,
+ 0x11, 0x90, 0xd8, 0xb0, 0xe2, 0x1a, 0x8c, 0xc2,
+ 0x44, 0xaf, 0x3d, 0x8f, 0x8, 0x45, 0x8e, 0xfb,
+ 0xe, 0x82, 0xd4, 0x1a, 0xbc, 0xf5, 0x9e, 0xb6,
+ 0xc4, 0xc2, 0x78, 0x73, 0xb2, 0x1e, 0x80, 0x5d,
+ 0x5, 0xc1, 0x6, 0x13, 0xee, 0xaa, 0xf7, 0x23,
+ 0x5, 0x55, 0x6, 0x83, 0x5f, 0x5, 0x13, 0xf6,
+ 0xa2, 0x61, 0x54, 0x9c, 0x52, 0x1b, 0xfb, 0x7,
+ 0x23, 0x5b, 0x41, 0x21, 0xf7, 0x10, 0x8b, 0xe7,
+ 0x88, 0x1f, 0xd5, 0x89, 0xbe, 0x79, 0x63, 0x1a,
+ 0x46, 0xfb, 0x13, 0x89, 0x5c, 0x49, 0x59, 0xa7,
+ 0xac, 0x60, 0x1e, 0x95, 0xb6, 0x62, 0xa, 0xe,
+ 0x77, 0xc2, 0xf8, 0x7d, 0xc2, 0x8b, 0xb9, 0xf7,
+ 0x48, 0x77, 0x12, 0xf4, 0xc7, 0xf7, 0xa7, 0xc8,
+ 0x17, 0x8c, 0x81, 0x15, 0xc4, 0x78, 0xa, 0x5f,
+ 0xc1, 0xe9, 0x7a, 0xb9, 0x1b, 0xf7, 0x9, 0xf7,
+ 0xd, 0xae, 0xf7, 0x21, 0xe6, 0x38, 0xa8, 0x3a,
+ 0x9f, 0x1f, 0x45, 0x9c, 0x25, 0x98, 0xde, 0x1a,
+ 0xd7, 0xcd, 0xb2, 0xee, 0xc1, 0xcf, 0x71, 0x68,
+ 0xab, 0x1e, 0x7a, 0x3a, 0x5, 0xc6, 0x6, 0xad,
+ 0xf7, 0x50, 0x71, 0xa, 0x83, 0x63, 0x5, 0x13,
+ 0xfc, 0xa7, 0x69, 0x45, 0xa0, 0x56, 0x1b, 0xfb,
+ 0x33, 0x40, 0x4c, 0xfb, 0x3, 0xfb, 0xf, 0xf7,
+ 0x10, 0x74, 0xdc, 0x79, 0x1f, 0xce, 0x7d, 0xca,
+ 0x6c, 0x61, 0x1a, 0x49, 0x4e, 0x56, 0xfb, 0x6,
+ 0x4a, 0x3e, 0xa7, 0xb3, 0x60, 0x1e, 0x99, 0xd1,
+ 0x62, 0xa, 0xf7, 0xbb, 0xf8, 0x58, 0x15, 0xde,
+ 0x6, 0xf7, 0x4b, 0xf7, 0x36, 0x62, 0x9d, 0xfb,
+ 0x3c, 0xfb, 0xd, 0xfb, 0x1b, 0xf7, 0xd, 0x5d,
+ 0x78, 0x5, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, 0x25,
+ 0x8b, 0xbf, 0x8b, 0xf7, 0x2a, 0x8b, 0xc2, 0x8b,
+ 0xbc, 0xf7, 0x46, 0x77, 0x1, 0xf3, 0xc4, 0xf7,
+ 0xa5, 0xc6, 0x3, 0xf7, 0xc5, 0xf8, 0x7f, 0x85,
+ 0xa, 0xf7, 0x49, 0xf7, 0x32, 0x64, 0x9f, 0xfb,
+ 0x3d, 0xfb, 0x4, 0xfb, 0x17, 0xf7, 0x3, 0x5e,
+ 0x77, 0x5, 0xfb, 0x2c, 0xfd, 0x2b, 0x15, 0xc3,
+ 0x36, 0xa, 0x74, 0xb8, 0xb5, 0x6b, 0xdd, 0x1b,
+ 0xf7, 0x1e, 0xe2, 0xb5, 0xf2, 0x1f, 0x8c, 0xc8,
+ 0x46, 0xb5, 0x40, 0x8f, 0x8, 0x47, 0x8f, 0xfb,
+ 0xd, 0x80, 0xdc, 0x1a, 0xc1, 0xf3, 0xa1, 0xb6,
+ 0xc3, 0xbf, 0x75, 0x70, 0xb1, 0x1e, 0x80, 0x58,
+ 0x5, 0xc1, 0x6, 0xab, 0xf7, 0x34, 0x5, 0x55,
+ 0x6, 0x82, 0x59, 0x5, 0xa6, 0x62, 0x57, 0x9d,
+ 0x52, 0x1b, 0xfb, 0x4, 0x27, 0x56, 0x38, 0xfb,
+ 0x9, 0xf7, 0xc, 0x8b, 0xe5, 0x87, 0x1f, 0xd4,
+ 0x88, 0xba, 0x78, 0x5f, 0x1a, 0x3e, 0xfb, 0xe,
+ 0x89, 0x5d, 0x4a, 0x5b, 0xa8, 0xb1, 0x62, 0x1e,
+ 0x94, 0xbc, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf8,
+ 0x5d, 0xc1, 0xee, 0xf7, 0x9, 0x1, 0xf7, 0xfb,
+ 0xf9, 0x2c, 0x15, 0xe2, 0x6, 0xa4, 0xf7, 0x9,
+ 0x5, 0x35, 0x6, 0xfb, 0x44, 0xfb, 0x9, 0x15,
+ 0xe0, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x34, 0x6,
+ 0xfb, 0x55, 0xfd, 0xa1, 0x15, 0x31, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x8b, 0xc1, 0x8b,
+ 0xc5, 0x1, 0xf7, 0x6, 0xc3, 0xf7, 0xa1, 0xc0,
+ 0x3, 0xa0, 0x16, 0xf8, 0x41, 0x6, 0xb5, 0xf7,
+ 0x63, 0x5, 0x56, 0x6, 0x6b, 0xfb, 0x2c, 0x5,
+ 0xfb, 0xc4, 0x6, 0xf8, 0x4f, 0xf8, 0x66, 0x95,
+ 0xbf, 0x5, 0xfc, 0x26, 0x6, 0x63, 0xfb, 0x55,
+ 0x51, 0xa, 0xa9, 0xf7, 0x1e, 0x5, 0xf7, 0xa5,
+ 0x6, 0xfc, 0x4e, 0xfc, 0x64, 0x5, 0xf7, 0xbd,
+ 0xf8, 0xd1, 0x48, 0xa, 0x8b, 0xc2, 0xf7, 0xd8,
+ 0xc2, 0x8b, 0xc3, 0xf7, 0x47, 0x77, 0x12, 0xf7,
+ 0xc4, 0xf8, 0x7e, 0x4c, 0xa, 0xfb, 0x28, 0xfd,
+ 0x1c, 0x15, 0xf8, 0x2b, 0x6, 0xaa, 0xf7, 0x31,
+ 0x52, 0xa, 0x77, 0x25, 0x5, 0xfb, 0xa7, 0x6,
+ 0xf8, 0x1d, 0xf7, 0xdc, 0x95, 0xbe, 0x5, 0x13,
+ 0x60, 0xfc, 0x1a, 0x6, 0x6d, 0xfb, 0x2e, 0x5,
+ 0xc1, 0x6, 0x9f, 0xee, 0x5, 0xf7, 0x95, 0x6,
+ 0xfc, 0x1c, 0xfb, 0xdb, 0x5, 0xe, 0xfb, 0x23,
+ 0xc6, 0xf8, 0x4f, 0xc5, 0xf7, 0x2d, 0xbf, 0x1,
+ 0x7f, 0x37, 0x15, 0x67, 0x50, 0x5, 0xf7, 0x75,
+ 0x9f, 0xb3, 0xf7, 0x19, 0xbd, 0x1f, 0xf7, 0x11,
+ 0xf7, 0xdd, 0x5, 0xf7, 0x2, 0x6, 0x9e, 0xc5,
+ 0x57, 0xa, 0xf7, 0x8, 0xba, 0x97, 0xb0, 0xf2,
+ 0x1b, 0x9e, 0x9f, 0x88, 0x8a, 0x9e, 0x1f, 0xaf,
+ 0xc3, 0x5, 0x61, 0x65, 0x8b, 0x6e, 0x1b, 0xfb,
+ 0x1f, 0x80, 0x4b, 0xfb, 0x21, 0x55, 0x1f, 0xfb,
+ 0x5, 0x6, 0x7a, 0x51, 0x5, 0xf7, 0x0, 0x6,
+ 0xfb, 0xf, 0xfb, 0xd7, 0x5, 0x20, 0x63, 0x55,
+ 0x7e, 0xfb, 0x1, 0x1b, 0xe, 0x79, 0xc2, 0x8b,
+ 0xf7, 0x39, 0x8b, 0xc2, 0xf7, 0xa0, 0xc2, 0x8b,
+ 0xba, 0xf7, 0x46, 0x77, 0x12, 0x9e, 0xc4, 0x17,
+ 0x34, 0xa, 0x13, 0xfe, 0x3d, 0xa, 0xa8, 0xf8,
+ 0x6, 0x48, 0xa, 0xfb, 0x31, 0xbd, 0x8b, 0xf7,
+ 0x38, 0x8b, 0xbe, 0xf7, 0xae, 0xbe, 0x8b, 0xbc,
+ 0xf7, 0x47, 0x77, 0x12, 0xab, 0xc3, 0x17, 0x3f,
+ 0xa, 0x13, 0xfe, 0x30, 0xa, 0xf7, 0x6f, 0xf7,
+ 0xa0, 0x4c, 0xa, 0xe, 0xf8, 0xe2, 0xcb, 0x1,
+ 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x10, 0xf8,
+ 0x83, 0x15, 0xad, 0x79, 0xf7, 0x36, 0xf7, 0x5,
+ 0xf7, 0x5, 0xfb, 0x5, 0xb6, 0x9d, 0xfb, 0x1,
+ 0xf7, 0x33, 0x5, 0x40, 0x6, 0xe, 0xf8, 0x80,
+ 0xc9, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7,
+ 0x7f, 0xf8, 0x80, 0x15, 0xd5, 0x6, 0xf7, 0x3b,
+ 0xf7, 0x31, 0x67, 0x9f, 0xfb, 0x32, 0xfb, 0x7,
+ 0xfb, 0x9, 0xf7, 0x6, 0x62, 0x77, 0x5, 0xe,
+ 0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2b, 0xf7, 0xbd,
+ 0x3, 0xf7, 0x2b, 0xf8, 0xf5, 0x15, 0x3c, 0xa1,
+ 0xbf, 0x6e, 0xc4, 0x1b, 0xd7, 0xc8, 0xbc, 0xc6,
+ 0xa8, 0x1f, 0x60, 0x6, 0x6d, 0x7b, 0x5c, 0x64,
+ 0x55, 0x1b, 0x60, 0x64, 0xa5, 0xb6, 0x80, 0x1f,
+ 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8b, 0xf8,
+ 0x71, 0x15, 0xde, 0x6, 0xa2, 0xf2, 0x7b, 0xa,
+ 0xe, 0xf8, 0x63, 0xbe, 0xca, 0xbd, 0x1, 0xf7,
+ 0x6c, 0xbe, 0xcd, 0xbe, 0x3, 0xf7, 0x6c, 0xf8,
+ 0xa3, 0x15, 0x67, 0xa6, 0x6f, 0xb4, 0xbf, 0xbb,
+ 0xb9, 0xbf, 0xb1, 0x6f, 0xa7, 0x62, 0x57, 0x5c,
+ 0x5c, 0x56, 0x1e, 0xbe, 0x96, 0x15, 0xa0, 0x9d,
+ 0x9d, 0x9f, 0x9b, 0x97, 0x81, 0x7d, 0x77, 0x79,
+ 0x78, 0x76, 0x7b, 0x80, 0x96, 0x98, 0x1e, 0xe,
+ 0xfb, 0x28, 0xbf, 0xeb, 0x77, 0x1, 0xf7, 0x79,
+ 0xcc, 0x3, 0xf7, 0xc4, 0x16, 0x64, 0x78, 0x67,
+ 0x65, 0x61, 0x1a, 0x6f, 0x9d, 0x76, 0xae, 0xa0,
+ 0xa1, 0x92, 0x99, 0x9f, 0x1e, 0x9b, 0xc2, 0x5,
+ 0x7d, 0x83, 0x73, 0x81, 0x7a, 0x1b, 0x81, 0x83,
+ 0x90, 0x96, 0xb2, 0xbd, 0xa5, 0xa5, 0x9a, 0x1f,
+ 0xe, 0xf8, 0x7d, 0xbd, 0x9d, 0xbc, 0x1, 0xe6,
+ 0xf8, 0x8c, 0x15, 0xbc, 0x80, 0x5, 0x9a, 0x92,
+ 0xae, 0xbc, 0xae, 0x1b, 0xa5, 0x9f, 0x78, 0x79,
+ 0xa2, 0x1f, 0x7b, 0x9f, 0xa1, 0x7c, 0xa9, 0x1b,
+ 0xc9, 0xc5, 0xbb, 0xc3, 0xa9, 0x1f, 0x5a, 0x95,
+ 0x5, 0x71, 0x7d, 0x5d, 0x65, 0x67, 0x1b, 0x75,
+ 0x7b, 0x99, 0x9b, 0x78, 0x1f, 0x9d, 0x76, 0x73,
+ 0x9e, 0x6a, 0x1b, 0x58, 0x58, 0x67, 0x49, 0x68,
+ 0x1f, 0xe, 0x65, 0xa, 0xf7, 0xa5, 0xf8, 0x99,
+ 0x15, 0xad, 0x77, 0xf7, 0x52, 0xf7, 0x22, 0x55,
+ 0xac, 0x5, 0xfb, 0xe8, 0xfb, 0x2f, 0x15, 0xad,
+ 0x77, 0xf7, 0x56, 0xf7, 0x22, 0x52, 0xac, 0x5,
+ 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd0, 0xf7, 0x7b,
+ 0x15, 0xf8, 0x57, 0x2a, 0xa, 0xfc, 0x57, 0x6,
+ 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0x85, 0xf7, 0x7b,
+ 0x15, 0xf8, 0xed, 0x2a, 0xa, 0xfc, 0xed, 0x6,
+ 0xe, 0xf7, 0xbb, 0xc9, 0x3, 0xf7, 0xbb, 0xf7,
+ 0xdc, 0x15, 0xc9, 0x6, 0x72, 0x64, 0xa, 0x32,
+ 0x6, 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x56,
+ 0xc9, 0x3, 0xf7, 0x56, 0xf7, 0xdc, 0x15, 0xc9,
+ 0x6, 0xf7, 0x2a, 0x64, 0xa, 0x30, 0x6, 0xe,
+ 0xef, 0x77, 0x1, 0xf7, 0x56, 0xca, 0x3, 0xf7,
+ 0x56, 0xfb, 0x1a, 0x15, 0xca, 0x75, 0xa, 0xf8,
+ 0xc6, 0x77, 0x1, 0xf7, 0x68, 0xc9, 0xf4, 0xc7,
+ 0x3, 0xf8, 0xf, 0xf7, 0xdc, 0x15, 0xc7, 0x6,
+ 0x72, 0x64, 0xa, 0x32, 0x6, 0xfb, 0x5, 0xfb,
+ 0x7e, 0x15, 0xc9, 0x6, 0x73, 0x64, 0xa, 0x31,
+ 0x6, 0xe, 0xf8, 0xc6, 0x74, 0xa, 0xf7, 0xdc,
+ 0x15, 0xc7, 0x6, 0xf7, 0x21, 0x64, 0xa, 0x35,
+ 0x6, 0xfb, 0xa9, 0xfb, 0x7e, 0x15, 0xc6, 0x6,
+ 0xf7, 0x23, 0x64, 0xa, 0x35, 0x6, 0xe, 0xef,
+ 0x74, 0xa, 0xfb, 0x1a, 0x15, 0xc7, 0x6, 0xf7,
+ 0x21, 0x64, 0xa, 0x34, 0x6, 0xfb, 0xa8, 0xfb,
+ 0x7e, 0x15, 0xc6, 0x6, 0xf7, 0x22, 0x64, 0xa,
+ 0x34, 0x6, 0xe, 0xf7, 0xfb, 0xc6, 0xf7, 0x36,
+ 0x77, 0x1, 0xf7, 0x40, 0xc6, 0x3, 0xf7, 0x40,
+ 0x3d, 0x15, 0xc6, 0x6, 0xe5, 0xf8, 0x4f, 0x5,
+ 0xf7, 0x17, 0x6, 0x97, 0xc0, 0x83, 0xa, 0xae,
+ 0xf7, 0x36, 0x5, 0x50, 0x6, 0x69, 0xfb, 0x36,
+ 0x5, 0xfb, 0x14, 0x6, 0x80, 0x56, 0x5, 0xf7,
+ 0x14, 0x6, 0xe, 0xf2, 0xc6, 0xf7, 0x64, 0xc5,
+ 0xf7, 0x2c, 0x77, 0x1, 0xec, 0xf2, 0x15, 0xf7,
+ 0x18, 0x6, 0x64, 0xfb, 0x49, 0x5, 0xcb, 0x6,
+ 0xb2, 0xf7, 0x49, 0x5, 0xf7, 0x18, 0x6, 0x97,
+ 0xc6, 0x5, 0xfb, 0x17, 0x6, 0xb6, 0xf7, 0x64,
+ 0x5, 0xf7, 0x16, 0x6, 0x97, 0xc5, 0x5, 0xfb,
+ 0x16, 0x6, 0xab, 0xf7, 0x2c, 0x5, 0x4b, 0x6,
+ 0x6b, 0xfb, 0x2c, 0x83, 0xa, 0x81, 0x51, 0x5,
+ 0xf7, 0x17, 0x6, 0x5f, 0xfb, 0x64, 0x83, 0xa,
+ 0xe, 0xf7, 0x2b, 0x76, 0xf7, 0x91, 0x77, 0x1,
+ 0xf7, 0x3d, 0xf7, 0x7c, 0x15, 0x52, 0xb5, 0x5e,
+ 0xc9, 0xd7, 0xdc, 0xd2, 0xd9, 0xc6, 0x5f, 0xb8,
+ 0x4c, 0x3c, 0x40, 0x45, 0x3a, 0x1e, 0xe, 0x7c,
+ 0xf7, 0x12, 0x1, 0xae, 0xf7, 0x15, 0xd2, 0xf7,
+ 0x15, 0xd2, 0xf7, 0x15, 0x14, 0x70, 0xf7, 0x7f,
+ 0xb1, 0x15, 0x41, 0xa, 0xfb, 0x5c, 0x16, 0x41,
+ 0xa, 0xf8, 0x24, 0x16, 0x41, 0xa, 0xe, 0x7c,
+ 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7,
+ 0x21, 0xc1, 0x12, 0xaa, 0xc4, 0xf7, 0x57, 0xc4,
+ 0x77, 0xc4, 0xf7, 0x2a, 0xc4, 0x13, 0xfd, 0xd7,
+ 0xf8, 0x6e, 0x2e, 0xa, 0xfb, 0x5, 0xfb, 0x94,
+ 0x15, 0xf8, 0x6c, 0xf7, 0x38, 0x87, 0xc0, 0xfc,
+ 0x6c, 0xfb, 0x3a, 0x5, 0x13, 0xfb, 0xf7, 0xc4,
+ 0xfb, 0x51, 0x2e, 0xa, 0xfb, 0xee, 0x84, 0x2e,
+ 0xa, 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf7, 0x18,
+ 0xe8, 0x3, 0xf7, 0x18, 0xf7, 0x95, 0x15, 0xf7,
+ 0x84, 0xfb, 0x4f, 0xa9, 0xba, 0xfb, 0x45, 0xf7,
+ 0x1d, 0xf7, 0x87, 0xf7, 0x1c, 0x82, 0xc3, 0x5,
+ 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf8, 0x6, 0xed,
+ 0x3, 0xf7, 0x21, 0xd1, 0x15, 0xf7, 0xdb, 0xf7,
+ 0x4f, 0xfb, 0x84, 0xf7, 0x51, 0x6c, 0x5c, 0xf7,
+ 0x41, 0xfb, 0x1a, 0xfb, 0x82, 0xfb, 0x20, 0x5,
+ 0xe, 0x67, 0x76, 0xf9, 0x66, 0x77, 0x1, 0x9e,
+ 0x6e, 0x15, 0xab, 0x6f, 0xf8, 0xa6, 0xf9, 0x4a,
+ 0x6b, 0xa7, 0x5, 0xe, 0x76, 0xc5, 0xf7, 0x28,
+ 0xc4, 0xdb, 0xc3, 0xf7, 0x43, 0xc5, 0x1, 0xf7,
+ 0x36, 0xc1, 0x3, 0xbb, 0xaa, 0x15, 0x9b, 0x57,
+ 0x5, 0xa1, 0xc0, 0xe6, 0x93, 0x9b, 0x1b, 0x9f,
+ 0x9d, 0x87, 0x84, 0x9e, 0x1f, 0x83, 0x9e, 0xa0,
+ 0x80, 0xa6, 0x53, 0xa, 0x71, 0x79, 0x97, 0x93,
+ 0x79, 0x1f, 0x93, 0x7a, 0x7a, 0x8e, 0x73, 0x1b,
+ 0x6e, 0x6d, 0x84, 0x80, 0x6e, 0x1f, 0xc8, 0xb0,
+ 0x9f, 0xc2, 0x8e, 0xb6, 0x8, 0xf7, 0x48, 0x6,
+ 0x99, 0xc4, 0x5, 0xfb, 0x5c, 0x6, 0x8a, 0x96,
+ 0x8a, 0xae, 0x8a, 0xad, 0x8, 0xf7, 0x66, 0x6,
+ 0x9b, 0xc3, 0x5, 0xfb, 0x77, 0xa9, 0x6, 0x42,
+ 0xa, 0x82, 0x8b, 0x7b, 0x8c, 0x78, 0x8, 0x4a,
+ 0x6, 0x7d, 0x53, 0x5, 0xdb, 0x6, 0x8c, 0x6a,
+ 0x8d, 0x69, 0x8c, 0x7e, 0x8, 0x29, 0x6, 0x7b,
+ 0x52, 0x5, 0xf7, 0x8, 0x6, 0x55, 0x63, 0x67,
+ 0x3a, 0x4b, 0x1e, 0xe, 0x8b, 0xbf, 0xf7, 0x22,
+ 0xbf, 0xc8, 0xbf, 0xf7, 0x2b, 0xbf, 0x1, 0xe0,
+ 0xc2, 0xf8, 0x8, 0xbe, 0x3, 0x89, 0xf7, 0x56,
+ 0x15, 0xd7, 0x6, 0xfb, 0x7, 0x90, 0xcf, 0x3c,
+ 0xf7, 0x1f, 0x1b, 0xd6, 0xda, 0xa7, 0xb5, 0xcd,
+ 0x1f, 0x7d, 0xb7, 0x5, 0x67, 0x52, 0x45, 0x71,
+ 0x4a, 0x1b, 0x2c, 0x49, 0xb9, 0xeb, 0x81, 0x1f,
+ 0xf7, 0x6b, 0x6, 0xa7, 0xbf, 0x5, 0xfb, 0x87,
+ 0x6, 0x8e, 0x9f, 0x8e, 0xa2, 0x90, 0x9d, 0x8,
+ 0xf7, 0x98, 0x6, 0xa9, 0xbf, 0x5, 0xfb, 0xa4,
+ 0x6, 0xe5, 0xb4, 0xdc, 0xc8, 0xe5, 0x1b, 0xcf,
+ 0xc8, 0x73, 0x66, 0xa8, 0x1f, 0x7b, 0x3d, 0x5,
+ 0xbe, 0x6, 0xb2, 0xf7, 0x53, 0x5, 0x58, 0x6,
+ 0x80, 0x59, 0x5, 0xac, 0x63, 0x5b, 0x9c, 0x47,
+ 0x1b, 0xfb, 0x12, 0xfb, 0x0, 0x32, 0xfb, 0x6,
+ 0x5c, 0x1f, 0x54, 0x6, 0x6d, 0x57, 0x5, 0xce,
+ 0x6, 0x86, 0x73, 0x89, 0x76, 0x89, 0x7b, 0x8,
+ 0x5a, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x49, 0xc1,
+ 0xf7, 0x7c, 0xc2, 0x1, 0xf8, 0xac, 0xc6, 0x3,
+ 0x90, 0x7c, 0x15, 0xf7, 0x79, 0x36, 0xa, 0x37,
+ 0x6, 0xb1, 0xf7, 0x48, 0x5, 0xf7, 0xc, 0x6,
+ 0x9d, 0x6e, 0xaa, 0x57, 0xa7, 0x56, 0x40, 0x44,
+ 0x18, 0xba, 0x6d, 0xc1, 0xbd, 0x94, 0x79, 0x92,
+ 0x7a, 0x91, 0x7c, 0x19, 0xf7, 0x1f, 0x6, 0x96,
+ 0xc2, 0x57, 0xa, 0x78, 0xb1, 0xda, 0xd5, 0x5c,
+ 0xa9, 0x51, 0x54, 0x77, 0xae, 0x77, 0xac, 0x7a,
+ 0xa5, 0x19, 0xea, 0x8e, 0xf7, 0x8, 0xb8, 0xf7,
+ 0x37, 0x1a, 0xcd, 0x57, 0xcb, 0x23, 0x1e, 0xfb,
+ 0xce, 0x38, 0xa, 0xe1, 0x6, 0x2a, 0xfc, 0x67,
+ 0x5, 0x34, 0x6, 0xf7, 0x56, 0xf7, 0x7f, 0x15,
+ 0xba, 0xf7, 0x7c, 0x5, 0xf7, 0x2c, 0x6, 0xd9,
+ 0xbc, 0x6b, 0x5f, 0xfb, 0x2b, 0xfb, 0x23, 0x86,
+ 0x3f, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93,
+ 0xb7, 0x1, 0xb6, 0xbe, 0xf7, 0x10, 0xbb, 0xf7,
+ 0x60, 0xbd, 0x3, 0xf7, 0x6e, 0xf7, 0x9b, 0x15,
+ 0xbb, 0x6, 0xc7, 0xf7, 0xa2, 0x97, 0xfb, 0xa2,
+ 0x5, 0xcb, 0x6, 0xf7, 0x14, 0xf7, 0xa1, 0x4f,
+ 0xfb, 0xa1, 0x5, 0xbd, 0x6, 0xcd, 0xf7, 0xbf,
+ 0x5, 0x30, 0x6, 0xfb, 0x6, 0xfb, 0x87, 0x84,
+ 0xf7, 0x87, 0x5, 0x31, 0x6, 0xfb, 0x85, 0xfb,
+ 0xbf, 0x15, 0xbe, 0x6, 0xc2, 0xf7, 0x93, 0x5,
+ 0xe1, 0x6, 0x95, 0xb7, 0x5, 0xfb, 0x71, 0x6,
+ 0x81, 0x5f, 0x5, 0xe0, 0x6, 0xe, 0x73, 0xa,
+ 0xf7, 0x11, 0xf7, 0x7, 0x15, 0xa9, 0xba, 0x2f,
+ 0xf7, 0x3, 0x5, 0xf8, 0xbd, 0x6, 0x96, 0xbd,
+ 0x5, 0xfc, 0xae, 0x6, 0xf7, 0x18, 0xf3, 0x82,
+ 0xc3, 0xfb, 0x82, 0xfb, 0x4e, 0x5, 0xe, 0xa0,
+ 0x76, 0xf9, 0x3, 0x77, 0x1, 0xf7, 0x88, 0xbd,
+ 0x3, 0xf7, 0x38, 0x9c, 0x15, 0xf7, 0x18, 0xf8,
+ 0x80, 0xfb, 0x1a, 0x26, 0x58, 0xa2, 0xf7, 0x84,
+ 0xf7, 0x49, 0xf7, 0x1e, 0xfb, 0x54, 0x55, 0x7a,
+ 0x37, 0xf7, 0xa, 0xfb, 0x1b, 0xfc, 0x8e, 0x5,
+ 0xe, 0x73, 0xa, 0x70, 0xf7, 0xa7, 0x15, 0x96,
+ 0xbd, 0x5, 0xf8, 0xbf, 0x6, 0x2f, 0xf7, 0x3,
+ 0xa9, 0xba, 0xf7, 0x2a, 0xfb, 0x4a, 0xfb, 0x81,
+ 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x18, 0xf3, 0x5,
+ 0xe, 0x9a, 0x76, 0xf8, 0xea, 0x77, 0x1, 0xf7,
+ 0x3, 0xf7, 0x4f, 0x15, 0xc0, 0x9c, 0xdd, 0xfb,
+ 0x9, 0xf7, 0x1c, 0xf8, 0x8d, 0xbe, 0x88, 0xfb,
+ 0x18, 0xfc, 0x7e, 0xf7, 0x1c, 0xef, 0xbf, 0x74,
+ 0xfb, 0x86, 0xfb, 0x4a, 0x5, 0xe, 0xf7, 0x1c,
+ 0x76, 0xf7, 0x32, 0xbf, 0xf7, 0x32, 0x77, 0x1,
+ 0xf7, 0x10, 0xf7, 0x7, 0x15, 0xfb, 0x2c, 0xf7,
+ 0x4a, 0xf7, 0x83, 0xf7, 0x4e, 0x94, 0x53, 0xfb,
+ 0x18, 0x25, 0x5, 0xf8, 0x58, 0x6, 0x31, 0xf7,
+ 0x3, 0xa9, 0xba, 0xf7, 0x28, 0xfb, 0x4a, 0xfb,
+ 0x7f, 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x16, 0xf2,
+ 0xfc, 0x58, 0x8a, 0xe7, 0xfb, 0x3, 0x5, 0xe,
+ 0xf7, 0x7c, 0xbe, 0x1, 0xd5, 0xf7, 0x7c, 0x15,
+ 0xf8, 0x57, 0xbe, 0xfc, 0x57, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf7, 0xc1, 0xc0, 0xf1, 0xf7, 0xc, 0x1,
+ 0xf7, 0x0, 0xc1, 0xf7, 0xa7, 0xc1, 0x3, 0xf8,
+ 0x96, 0xf8, 0x91, 0x15, 0xd2, 0x6, 0xa2, 0xf7,
+ 0xc, 0x5, 0x44, 0x6, 0xfb, 0x6d, 0xfd, 0x9,
+ 0x15, 0xf7, 0xa1, 0x80, 0xa, 0xfb, 0x1, 0x6,
+ 0xd3, 0xf7, 0xf6, 0x5, 0xfb, 0x1c, 0x68, 0xa,
+ 0xdd, 0x6, 0x4d, 0xfb, 0xc1, 0x5, 0x21, 0x6,
+ 0xfb, 0xe7, 0x56, 0x15, 0xf7, 0x9e, 0x6, 0x97,
+ 0xc0, 0x57, 0xa, 0xc9, 0xf7, 0xc1, 0x5, 0xf6,
+ 0x6, 0x96, 0xc0, 0x57, 0xa, 0xa6, 0xed, 0x5,
+ 0x9f, 0x90, 0x96, 0xa2, 0xd4, 0x1b, 0xa1, 0xa1,
+ 0x87, 0x87, 0x9e, 0x1f, 0xa0, 0xbf, 0x5, 0x8f,
+ 0x71, 0x5e, 0x90, 0x78, 0x1b, 0x5a, 0x43, 0x7e,
+ 0x38, 0x77, 0x1f, 0x73, 0x29, 0x5, 0x20, 0x68,
+ 0xa, 0xf6, 0x6, 0x4e, 0xfb, 0xc1, 0x5, 0x22,
+ 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xcf, 0xc2, 0xf7,
+ 0x29, 0xc2, 0x1, 0xf7, 0x2, 0xc1, 0xf7, 0xa8,
+ 0xc3, 0x3, 0xf7, 0xd5, 0x16, 0xf7, 0xa2, 0x36,
+ 0xa, 0x21, 0x6, 0xf7, 0x4, 0xf8, 0xd2, 0x5,
+ 0xfb, 0x27, 0x56, 0xa, 0xe8, 0x6, 0x25, 0xfc,
+ 0x9b, 0x57, 0xa, 0xfb, 0xe8, 0x54, 0x15, 0xf7,
+ 0xa0, 0x6, 0x97, 0xc2, 0x57, 0xa, 0xc9, 0xf7,
+ 0xcf, 0x5, 0xf6, 0x6, 0x96, 0xc2, 0x57, 0xa,
+ 0x9c, 0xe0, 0x5, 0xa1, 0x8f, 0x97, 0xb5, 0xde,
+ 0x1b, 0xa2, 0xa0, 0x86, 0x86, 0xa0, 0x1f, 0x9f,
+ 0xc1, 0x5, 0x90, 0x71, 0x6f, 0x91, 0x6f, 0x1b,
+ 0x30, 0x58, 0x5a, 0x45, 0x7e, 0x1f, 0x79, 0x36,
+ 0x5, 0xfb, 0x1, 0x67, 0xa, 0xf7, 0x1, 0x6,
+ 0x4d, 0xfb, 0xcf, 0x5, 0x20, 0x6, 0xe, 0x79,
+ 0x9d, 0xf8, 0x3e, 0x9a, 0xf7, 0xd, 0x9d, 0xa9,
+ 0x97, 0x6, 0xfb, 0x31, 0x8b, 0x7, 0x1e, 0xa0,
+ 0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, 0xc2,
+ 0xb, 0xf8, 0xec, 0x14, 0xaa, 0x13, 0x0, 0x6a,
+ 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x38, 0x0,
+ 0x69, 0x0, 0x6d, 0x0, 0xb9, 0x0, 0xf5, 0x1,
+ 0x3b, 0x1, 0x83, 0x1, 0xc3, 0x1, 0xf8, 0x1,
+ 0xfd, 0x2, 0xe, 0x2, 0x1a, 0x2, 0x1f, 0x2,
+ 0x46, 0x2, 0x53, 0x2, 0x93, 0x2, 0xc4, 0x2,
+ 0xce, 0x2, 0xe8, 0x3, 0x19, 0x3, 0x2c, 0x3,
+ 0x31, 0x3, 0x3f, 0x3, 0x44, 0x3, 0x4e, 0x3,
+ 0x59, 0x3, 0x64, 0x3, 0x69, 0x3, 0x8e, 0x3,
+ 0x95, 0x3, 0xb8, 0x3, 0xbf, 0x3, 0xd1, 0x3,
+ 0xed, 0x3, 0xf4, 0x3, 0xff, 0x4, 0x4, 0x4,
+ 0x9, 0x4, 0xe, 0x4, 0x23, 0x4, 0x2b, 0x4,
+ 0x32, 0x4, 0x3c, 0x4, 0x51, 0x4, 0x56, 0x4,
+ 0x5e, 0x4, 0x66, 0x4, 0x6e, 0x4, 0x72, 0x4,
+ 0x76, 0x4, 0x87, 0x4, 0x91, 0x4, 0x96, 0x4,
+ 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xab, 0x4,
+ 0xb3, 0x4, 0xba, 0x4, 0xbf, 0x4, 0xc5, 0x4,
+ 0xca, 0x4, 0xcf, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+ 0xdd, 0x4, 0xe1, 0x4, 0xe5, 0x4, 0xed, 0x4,
+ 0xf3, 0x4, 0xf8, 0x4, 0xfd, 0x5, 0x1, 0x5,
+ 0x5, 0x5, 0x9, 0x5, 0x15, 0x5, 0x21, 0x5,
+ 0x27, 0x5, 0x2d, 0x5, 0x33, 0x5, 0x37, 0x5,
+ 0x42, 0x5, 0x4d, 0x5, 0x58, 0x5, 0x60, 0x5,
+ 0x65, 0x5, 0x69, 0x5, 0x6e, 0x5, 0x72, 0x5,
+ 0x76, 0x5, 0x7a, 0x5, 0x83, 0x5, 0x8c, 0x5,
+ 0x95, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xa8, 0x5,
+ 0xad, 0x5, 0xb2, 0x5, 0xb7, 0x5, 0xbb, 0x5,
+ 0xbf, 0x5, 0xc3, 0x5, 0xc7, 0x5, 0xcb, 0xf7,
+ 0x63, 0x4d, 0xa, 0x33, 0x6, 0xcc, 0xf7, 0xf,
+ 0x5, 0xf7, 0xaa, 0x6, 0xa3, 0xfb, 0xf, 0x2c,
+ 0xa, 0xf8, 0x93, 0x32, 0xa, 0x7a, 0xa, 0x4f,
+ 0x6, 0xf7, 0x6b, 0xf7, 0x45, 0x15, 0xf7, 0x40,
+ 0xf7, 0xbb, 0xca, 0xfb, 0xbb, 0x5, 0xb, 0x22,
+ 0xa, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0x98,
+ 0xce, 0x15, 0x13, 0xbe, 0x2b, 0xa, 0x15, 0xf7,
+ 0x1e, 0x3c, 0xa, 0x37, 0x6, 0xbe, 0xf7, 0x9a,
+ 0x8c, 0x9b, 0x9a, 0x1a, 0xcb, 0x8a, 0x5e, 0xb2,
+ 0x22, 0x1b, 0x46, 0x36, 0x77, 0x72, 0x4b, 0x1f,
+ 0x39, 0xa, 0xa8, 0xe1, 0x9c, 0x33, 0x1f, 0x81,
+ 0x49, 0x5, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b,
+ 0xfb, 0x51, 0x4c, 0x2c, 0x3f, 0x1f, 0xb, 0x15,
+ 0x20, 0xa, 0xe, 0x15, 0xdb, 0x6, 0x5a, 0xfb,
+ 0x91, 0x5, 0x88, 0x7e, 0x8c, 0x7f, 0x80, 0x1a,
+ 0x45, 0xc3, 0x67, 0xd6, 0xb2, 0xc1, 0x9a, 0xd5,
+ 0xe3, 0x1e, 0x13, 0x78, 0x7c, 0x3d, 0x5, 0xf7,
+ 0x1a, 0x36, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0x15,
+ 0x55, 0xa, 0x82, 0x53, 0x5, 0xdc, 0x6, 0x5e,
+ 0xfb, 0x77, 0x5, 0x13, 0xb8, 0x59, 0x5b, 0x4d,
+ 0x4b, 0x4c, 0x1b, 0x4e, 0x6c, 0xa8, 0xbe, 0x8a,
+ 0x1f, 0x96, 0x8c, 0x96, 0x8d, 0x98, 0x1e, 0xc0,
+ 0xf7, 0xae, 0x5, 0xfb, 0x1a, 0x6, 0xe, 0x15,
+ 0xfb, 0x15, 0xd7, 0x26, 0xf7, 0x1a, 0xf7, 0x4d,
+ 0xf7, 0x1c, 0xf7, 0x4d, 0xf7, 0x4f, 0xed, 0x5f,
+ 0xf7, 0x11, 0xfb, 0x35, 0xfb, 0x60, 0xfb, 0xe,
+ 0xfb, 0x5c, 0xfb, 0x39, 0x1e, 0xc2, 0x93, 0x15,
+ 0xf7, 0x2, 0xea, 0xf7, 0x55, 0xf7, 0x3c, 0xf7,
+ 0x1a, 0xa4, 0x20, 0x3a, 0xfb, 0x13, 0xfb, 0xf,
+ 0xfb, 0x40, 0xfb, 0x19, 0xfb, 0x1, 0x52, 0xdf,
+ 0xef, 0x1e, 0xe, 0x15, 0xdc, 0x6, 0x55, 0xfb,
+ 0xb5, 0x5, 0x85, 0x6b, 0x88, 0x6d, 0x70, 0x1a,
+ 0x30, 0xbd, 0x51, 0xf7, 0xc, 0xf7, 0x12, 0xe2,
+ 0xc1, 0xf7, 0x30, 0xa7, 0x1e, 0xc7, 0xf7, 0xd1,
+ 0x5, 0xd8, 0x3c, 0xa, 0xfb, 0x7b, 0x60, 0xa,
+ 0xf1, 0x6, 0x50, 0xfb, 0xca, 0x63, 0xa, 0x76,
+ 0x53, 0x54, 0x23, 0x1b, 0x32, 0x65, 0xb4, 0xdc,
+ 0x9d, 0x8e, 0x9e, 0x8f, 0xa0, 0x1f, 0xc3, 0xf7,
+ 0xb9, 0x5, 0xf4, 0x3c, 0xa, 0xfb, 0x82, 0x6,
+ 0xb, 0x15, 0xf8, 0x38, 0x89, 0x5, 0x8f, 0xa1,
+ 0x8f, 0xaa, 0xa0, 0x1a, 0xe8, 0x51, 0xe0, 0xfb,
+ 0x1c, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x9, 0xfb,
+ 0x48, 0x2c, 0xc5, 0x41, 0xf7, 0x2c, 0xe0, 0xe5,
+ 0xa8, 0xb0, 0xd5, 0x1e, 0x84, 0xc1, 0x5, 0x5e,
+ 0x32, 0x37, 0x77, 0x5a, 0x1b, 0x44, 0x26, 0xa1,
+ 0xe3, 0x9b, 0x8b, 0x9c, 0x91, 0x9d, 0x1f, 0x9b,
+ 0xc3, 0x15, 0xc6, 0xa0, 0xd0, 0xd9, 0xf7, 0x9,
+ 0x1b, 0xf7, 0x22, 0x8f, 0xfb, 0x4, 0x72, 0x1f,
+ 0xe, 0xf8, 0x85, 0x6, 0xb1, 0xf7, 0x51, 0x71,
+ 0xa, 0x70, 0xfb, 0x1b, 0x5, 0xfb, 0xc5, 0x6,
+ 0xb4, 0xf7, 0x5d, 0x5, 0xf7, 0x39, 0x6, 0x7b,
+ 0x39, 0x51, 0xa, 0xb8, 0xf7, 0x6f, 0x62, 0xa,
+ 0x7a, 0x38, 0x5, 0xfb, 0x38, 0x6, 0xb3, 0xf7,
+ 0x5e, 0x81, 0xa, 0x71, 0xfb, 0x1b, 0x5, 0xc4,
+ 0x6, 0xb1, 0xf7, 0x51, 0x5, 0xfc, 0x83, 0x45,
+ 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5d, 0x6b, 0xa,
+ 0xb, 0x15, 0x20, 0xd7, 0x43, 0xf7, 0x15, 0xf7,
+ 0x38, 0xf7, 0x9, 0xf7, 0x14, 0xf7, 0x2e, 0xdf,
+ 0x5b, 0xec, 0xfb, 0x2a, 0xfb, 0x2b, 0xfb, 0x1d,
+ 0xfb, 0x9, 0xfb, 0x3b, 0x1e, 0xc9, 0x9a, 0x15,
+ 0xf5, 0xe8, 0xf6, 0xf7, 0xe, 0xf7, 0x16, 0x9d,
+ 0x34, 0x4f, 0x28, 0x2c, 0x21, 0xfb, 0x9, 0xfb,
+ 0x7, 0x67, 0xcc, 0xd5, 0x1e, 0xb, 0x6, 0x96,
+ 0xc1, 0x5, 0xb, 0x4e, 0x4b, 0x3e, 0x5c, 0x38,
+ 0x1b, 0x57, 0x64, 0xa8, 0xab, 0xed, 0xf7, 0x1d,
+ 0x97, 0xc6, 0x40, 0xa, 0x5, 0x2b, 0x2d, 0xa,
+ 0xf7, 0x60, 0x2a, 0xa, 0x57, 0x6, 0x21, 0xb,
+ 0x6, 0x80, 0x55, 0x5, 0xb, 0x15, 0x52, 0xb2,
+ 0x5e, 0xcf, 0xdf, 0xd4, 0xd3, 0xdb, 0xc1, 0x6c,
+ 0xb7, 0x3d, 0x38, 0x43, 0x42, 0x40, 0x1e, 0xc4,
+ 0x92, 0x15, 0xbc, 0xb3, 0xb1, 0xbe, 0xb3, 0x9e,
+ 0x73, 0x6c, 0x61, 0x6a, 0x5f, 0x55, 0x66, 0x71,
+ 0x9f, 0xad, 0x1e, 0xb, 0x44, 0xa, 0xf8, 0x5c,
+ 0x37, 0xa, 0xfc, 0x5c, 0x5, 0xfb, 0x45, 0x6,
+ 0xb, 0xad, 0x71, 0x53, 0xb4, 0x3c, 0x1b, 0xfb,
+ 0x33, 0xfb, 0x9, 0xfb, 0x9, 0x22, 0x39, 0xc1,
+ 0x3b, 0xf7, 0x21, 0xcc, 0xd6, 0x98, 0xb8, 0xbd,
+ 0x1f, 0x78, 0x20, 0x5, 0x34, 0x79, 0x52, 0x6f,
+ 0xfb, 0xb, 0x1b, 0x48, 0x4b, 0x9c, 0x96, 0x59,
+ 0x1f, 0xcc, 0xf7, 0xc1, 0x15, 0xee, 0xf7, 0x1,
+ 0xd0, 0xf0, 0xf7, 0x6, 0xab, 0x4c, 0x4b, 0x2c,
+ 0x25, 0x4f, 0x23, 0x31, 0x4f, 0xbd, 0xcb, 0x1e,
+ 0xb, 0xf7, 0xc9, 0x2a, 0xa, 0xfb, 0x12, 0x6,
+ 0xad, 0xf7, 0x43, 0xf7, 0x7e, 0xf7, 0xae, 0x5,
+ 0xce, 0x2a, 0xa, 0xfb, 0x5a, 0x2d, 0xa, 0xd1,
+ 0x6, 0xfb, 0x52, 0xfb, 0x78, 0x26, 0xf7, 0x78,
+ 0x5, 0xd2, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0x10,
+ 0xfb, 0xae, 0x69, 0xfb, 0x43, 0x5, 0xfb, 0x12,
+ 0x6, 0xb, 0x5, 0xfb, 0x82, 0x2d, 0xa, 0x86,
+ 0xa, 0xfb, 0x9d, 0xb, 0x15, 0x69, 0xa, 0xf7,
+ 0x3b, 0x6, 0xc8, 0xf7, 0xdb, 0x5, 0xfb, 0x1b,
+ 0x77, 0xa, 0xf7, 0x4f, 0x6, 0x44, 0xfc, 0x12,
+ 0x5, 0xf7, 0x3a, 0x56, 0xa, 0xe, 0xf7, 0xb5,
+ 0xf7, 0x5e, 0x15, 0xf7, 0x37, 0x6, 0x72, 0xfb,
+ 0x18, 0x5, 0x76, 0x46, 0x64, 0x7f, 0x54, 0x1b,
+ 0xfb, 0x18, 0x53, 0xd8, 0xeb, 0xf7, 0x74, 0xf7,
+ 0x2a, 0xe6, 0xf7, 0x7, 0xd0, 0xc0, 0x68, 0x5b,
+ 0xae, 0x1f, 0x7c, 0x3f, 0x51, 0xa, 0xb5, 0xf7,
+ 0x6a, 0x52, 0xa, 0x7e, 0x49, 0x5, 0xb, 0x15,
+ 0x71, 0xa3, 0x73, 0xb1, 0xb2, 0xb6, 0xa9, 0xb3,
+ 0xa8, 0x75, 0xa4, 0x67, 0x60, 0x60, 0x69, 0x63,
+ 0x1e, 0xb, 0x6, 0x96, 0xc2, 0x5, 0xb, 0x5,
+ 0xf7, 0x41, 0x46, 0xa, 0xfc, 0x2b, 0x38, 0xa,
+ 0xf7, 0x42, 0x6, 0x2c, 0xb, 0x6, 0x80, 0x54,
+ 0x5, 0xb, 0x8f, 0x55, 0x5, 0x9a, 0xae, 0xe4,
+ 0xa6, 0xd0, 0x1b, 0xb, 0x51, 0xb9, 0x54, 0xe7,
+ 0xd8, 0xda, 0xb6, 0xc1, 0xcd, 0x1e, 0xb, 0x7c,
+ 0xc3, 0x5f, 0xc3, 0xf7, 0x33, 0xc4, 0xf7, 0xf,
+ 0xc4, 0xb, 0x6, 0x96, 0xc3, 0x5, 0xb, 0xb4,
+ 0x62, 0x4d, 0xa4, 0x46, 0x1b, 0xfb, 0x3f, 0xfb,
+ 0x2b, 0xfb, 0x24, 0xfb, 0x7c, 0xfb, 0x8, 0xce,
+ 0x21, 0xf7, 0x3d, 0xd4, 0xd9, 0x9f, 0xa5, 0xcf,
+ 0x1f, 0xac, 0xf7, 0x42, 0x5, 0xbf, 0x36, 0xa,
+ 0xfb, 0xa2, 0x6, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+ 0xc1, 0x1, 0xb, 0xa2, 0x3c, 0x15, 0x76, 0x59,
+ 0x5, 0x80, 0xbd, 0xdc, 0x7a, 0xdd, 0x1b, 0xf7,
+ 0x10, 0xe3, 0xbf, 0xf0, 0xa2, 0x1f, 0xd9, 0xf8,
+ 0x12, 0x5, 0xc7, 0x6, 0x95, 0xbe, 0x5, 0xfb,
+ 0x6, 0x6, 0x7c, 0x4c, 0x5, 0xb, 0xb8, 0xb5,
+ 0x85, 0x84, 0xb5, 0x1f, 0xe, 0x70, 0xa0, 0x71,
+ 0xae, 0xb0, 0xaf, 0xab, 0xb4, 0xaa, 0x73, 0xa1,
+ 0x6c, 0x65, 0x67, 0x68, 0x65, 0x1e, 0xb, 0xf3,
+ 0xef, 0xb4, 0xc8, 0xc0, 0xbd, 0x75, 0x59, 0x9b,
+ 0x1e, 0xc2, 0x9c, 0x5, 0xc3, 0x79, 0x6d, 0xc4,
+ 0xfb, 0x9, 0x1b, 0xfb, 0xc, 0x23, 0x32, 0x27,
+ 0x1f, 0x8a, 0xb, 0x2a, 0xa, 0xfb, 0x5f, 0x2d,
+ 0xa, 0xb, 0xf8, 0x2f, 0x6, 0x98, 0xc1, 0x5,
+ 0xfb, 0x45, 0x6, 0xea, 0xb, 0x6, 0x7f, 0x55,
+ 0x5, 0xb, 0x6, 0x97, 0xc2, 0x5, 0xb, 0x6,
+ 0x97, 0xc1, 0x5, 0xb, 0x15, 0xd9, 0x6, 0xf7,
+ 0x40, 0xf7, 0x33, 0x65, 0x9d, 0xfb, 0x33, 0xfb,
+ 0xb, 0xfb, 0x11, 0xf7, 0xc, 0x5f, 0x78, 0x5,
+ 0xe, 0x1, 0xc4, 0xc9, 0xf7, 0xff, 0xc8, 0x3,
+ 0xb, 0x12, 0xba, 0xc5, 0xf7, 0xee, 0xc4, 0xb,
+ 0x3b, 0xa, 0xf7, 0x73, 0x77, 0x4a, 0xa, 0x13,
+ 0x7e, 0xb, 0x15, 0xdb, 0x6, 0xf7, 0x46, 0xf7,
+ 0x33, 0x65, 0x9f, 0xfb, 0x3d, 0xfb, 0xf, 0xfb,
+ 0x12, 0xf7, 0xe, 0x5f, 0x77, 0x5, 0xb, 0x6,
+ 0x95, 0xc1, 0x5, 0xb, 0x7c, 0xc1, 0x60, 0xc2,
+ 0xf7, 0xdd, 0xc3, 0xb, 0xf7, 0x63, 0xf7, 0x4a,
+ 0xf7, 0x60, 0x3, 0xb, 0x1, 0xe7, 0xbf, 0xf7,
+ 0xc4, 0xbf, 0x3, 0xb, 0x5, 0xc3, 0x6, 0xb,
+ 0x5, 0x54, 0x6, 0xb, 0x1b, 0xb7, 0xb9, 0x9d,
+ 0xa7, 0xb1, 0x1f, 0x7d, 0xb8, 0x5, 0x7f, 0x77,
+ 0x53, 0x76, 0x67, 0x1b, 0xb, 0x15, 0xda, 0x6,
+ 0xa5, 0xf7, 0xa, 0x5, 0x3d, 0x6, 0xb, 0x5,
+ 0xfb, 0x1b, 0x6, 0xb, 0x6, 0x7f, 0x54, 0x5,
+ 0xb, 0x63, 0xa, 0x6, 0xb, 0xfc, 0x5a, 0x5,
+ 0xb, 0x70, 0xa, 0xf7, 0x78, 0x77, 0x50, 0xa,
+ 0xb, 0x5d, 0xa, 0xf7, 0x74, 0x77, 0x49, 0xa,
+ 0xb, 0x8b, 0x61, 0xa, 0xf7, 0x5e, 0xc1, 0xb,
+ 0x6, 0xa4, 0x88, 0xa, 0xb, 0x7c, 0xc2, 0xf7,
+ 0xf4, 0xc3, 0xb, 0x6, 0x30, 0x58, 0xa, 0xb,
+ 0x6, 0x81, 0x55, 0x5, 0xb, 0x6, 0x80, 0x53,
+ 0x5, 0xb, 0xc1, 0xf7, 0x5d, 0xc1, 0xb, 0x5,
+ 0x52, 0x6, 0xb, 0x5, 0xfb, 0x0, 0xb, 0xf7,
+ 0x7e, 0x5, 0xb, 0xf8, 0x9a, 0x76, 0xf7, 0x43,
+ 0x77, 0x1, 0xb, 0x5, 0xfb, 0x21, 0x38, 0xa,
+ 0xb, 0x6, 0x81, 0x54, 0x5, 0xb, 0x6, 0x81,
+ 0x56, 0x5, 0xb, 0x95, 0xc2, 0x5, 0xb, 0x5,
+ 0xc2, 0x6, 0xb, 0x5, 0x39, 0x6, 0xb, 0x15,
+ 0x74, 0x97, 0x76, 0xa4, 0xa6, 0xa5, 0xa8, 0xa9,
+ 0xa1, 0x7d, 0xb, 0x15, 0x57, 0xb4, 0x5b, 0xcd,
+ 0xdf, 0xd1, 0xd3, 0xdd, 0xbd, 0x69, 0xb, 0x6,
+ 0xa4, 0xf7, 0x7, 0x5, 0xb, 0x8b, 0xc2, 0xf7,
+ 0xdb, 0xc2, 0xb, 0x79, 0xc1, 0xf8, 0x6d, 0xc3,
+ 0xb, 0x5, 0x53, 0x6, 0xb, 0x71, 0x5f, 0x6c,
+ 0x61, 0x55, 0x68, 0x71, 0xa1, 0xa9, 0x1e, 0xb,
+ 0xf7, 0x1c, 0x76, 0xf7, 0x32, 0xbd, 0xf7, 0x34,
+ 0x77, 0x1, 0xb, 0x77, 0x1, 0xf7, 0xa, 0xc6,
+ 0xf2, 0xc7, 0x3, 0xf7, 0xac, 0xb, 0x6, 0xf7,
+ 0x29, 0x64, 0xa, 0x2f, 0x6, 0xe, 0x6, 0x94,
+ 0xc1, 0x5, 0xb, 0x6, 0x69, 0xa, 0xb, 0x6,
+ 0x96, 0xbe, 0x5, 0xb, 0xf7, 0x24, 0x5, 0xe,
+ 0xfc, 0x5d, 0x5, 0xb, 0x5, 0x38, 0x6, 0xb,
+ 0xe2, 0xdd, 0x9b, 0x1f, 0xd1, 0xf7, 0xf8, 0x5,
+ 0xb, 0x77, 0x1, 0xad, 0xc1, 0xf8, 0x3a, 0xc2,
+ 0x3, 0xb, 0x8b, 0xbe, 0xf7, 0x12, 0xc1, 0xf7,
+ 0xac, 0xc1, 0xb, 0xf7, 0x1d, 0xc4, 0xf7, 0x71,
+ 0x77, 0x1, 0xc1, 0xb, 0x6, 0x96, 0xc0, 0x5,
+ 0xb, 0x5, 0xf7, 0xbe, 0x6, 0xb, 0x6, 0x80,
+ 0x57, 0x5, 0xb, 0x5, 0xfb, 0x18, 0x6, 0xb,
+ 0xf7, 0x78, 0x77, 0x1, 0xb, 0x15, 0xdd, 0x6,
+ 0xb, 0xf7, 0x1f, 0x6, 0xb, 0xf8, 0x5a, 0x5,
+ 0xb, 0xf7, 0x8, 0x5, 0xb, 0x5, 0x3b, 0x6,
+ 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSans.c b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
new file mode 100644
index 0000000000..cd87d2b5ba
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
@@ -0,0 +1,1886 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansFontData [15025] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xd,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1, 0x1,
+ 0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+ 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18, 0x4,
+ 0xfb, 0x3a, 0xfb, 0x75, 0xfa, 0x7c, 0xfa, 0x45,
+ 0x5, 0xf7, 0x16, 0xf, 0xf8, 0xe1, 0x11, 0xab,
+ 0x1c, 0x34, 0xa2, 0x12, 0x0, 0x3, 0x1, 0x1,
+ 0x5, 0x2f, 0x3d, 0x45, 0x75, 0x72, 0x6f, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53,
+ 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+ 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+ 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+ 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+ 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+ 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+ 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+ 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+ 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+ 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+ 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+ 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+ 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+ 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+ 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+ 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+ 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+ 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+ 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+ 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+ 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+ 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+ 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+ 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+ 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+ 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+ 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+ 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+ 0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+ 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+ 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+ 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+ 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+ 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+ 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+ 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+ 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+ 0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+ 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+ 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+ 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+ 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+ 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+ 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+ 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+ 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+ 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+ 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+ 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+ 0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x4, 0x0, 0x36, 0x0, 0x75, 0x0,
+ 0x8a, 0x0, 0xa2, 0x0, 0xc2, 0x0, 0xd3, 0x1,
+ 0x4, 0x1, 0x32, 0x1, 0x92, 0x1, 0xe1, 0x2,
+ 0x5b, 0x2, 0x9d, 0x2, 0xc0, 0x2, 0xcd, 0x2,
+ 0xd9, 0x2, 0xeb, 0x2, 0xfc, 0x3, 0x47, 0x3,
+ 0xc2, 0x3, 0xe1, 0x4, 0x42, 0x4, 0x68, 0x4,
+ 0x77, 0x4, 0x87, 0x4, 0xa4, 0x4, 0xbf, 0x4,
+ 0xd0, 0x5, 0x1, 0x5, 0x2f, 0x5, 0x44, 0x5,
+ 0x71, 0x5, 0xa7, 0x5, 0xcc, 0x6, 0x16, 0x6,
+ 0x68, 0x6, 0xd7, 0x6, 0xe8, 0x6, 0xf9, 0x7,
+ 0x8, 0x7, 0x21, 0x7, 0xa4, 0x7, 0xdf, 0x8,
+ 0x1c, 0x8, 0x98, 0x8, 0xf0, 0x9, 0x58, 0x9,
+ 0xc6, 0x9, 0xe1, 0xa, 0x25, 0xa, 0x58, 0xa,
+ 0x60, 0xa, 0x67, 0xa, 0x74, 0xa, 0x7b, 0xa,
+ 0x96, 0xa, 0xcf, 0xb, 0x3, 0xb, 0x2a, 0xb,
+ 0x4e, 0xb, 0x76, 0xb, 0x90, 0xb, 0xb2, 0xc,
+ 0x31, 0xc, 0x40, 0xc, 0x4e, 0xc, 0x5c, 0xc,
+ 0x6a, 0xd, 0x12, 0xd, 0x37, 0xd, 0xcd, 0xe,
+ 0xa, 0xe, 0x2c, 0xe, 0x74, 0xe, 0xc8, 0xf,
+ 0x7c, 0xf, 0xb4, 0x10, 0xb, 0x10, 0x21, 0x10,
+ 0x37, 0x10, 0x85, 0x10, 0xd3, 0x10, 0xf1, 0x11,
+ 0xe, 0x11, 0x32, 0x11, 0x4f, 0x11, 0x70, 0x11,
+ 0xba, 0x11, 0xd1, 0x12, 0x42, 0x12, 0x76, 0x12,
+ 0xed, 0x13, 0x3, 0x13, 0x1c, 0x13, 0x40, 0x13,
+ 0xd1, 0x14, 0x41, 0x14, 0x90, 0x14, 0xb4, 0x14,
+ 0xe5, 0x15, 0x1d, 0x15, 0x39, 0x15, 0x62, 0x15,
+ 0xe9, 0x15, 0xfd, 0x16, 0xb, 0x16, 0x5c, 0x16,
+ 0x6f, 0x16, 0x81, 0x16, 0xcb, 0x16, 0xe6, 0x17,
+ 0x5a, 0x17, 0x81, 0x17, 0x91, 0x17, 0x9f, 0x17,
+ 0xbb, 0x18, 0x2e, 0x18, 0x56, 0x18, 0x7e, 0x18,
+ 0xae, 0x18, 0xc2, 0x19, 0x15, 0x19, 0x25, 0x19,
+ 0x87, 0x19, 0xb7, 0x19, 0xcf, 0x1a, 0x40, 0x1a,
+ 0xa3, 0x1a, 0xba, 0x1a, 0xd6, 0x1b, 0x8, 0x1b,
+ 0x3a, 0x1b, 0x54, 0x1b, 0x6e, 0x1b, 0xa4, 0x1b,
+ 0xb8, 0x1b, 0xc9, 0x1b, 0xe0, 0x1b, 0xf1, 0x1c,
+ 0xe, 0x1c, 0x29, 0x1c, 0x3a, 0x1c, 0x6b, 0x1c,
+ 0x92, 0x1c, 0x9a, 0x1c, 0xb7, 0x1c, 0xcb, 0x1c,
+ 0xe9, 0x1d, 0x3b, 0x1d, 0x4c, 0x1d, 0x58, 0x1d,
+ 0x9b, 0x1d, 0xd1, 0x1e, 0x1, 0x1e, 0x62, 0x1e,
+ 0xd1, 0x1f, 0x38, 0x1f, 0x7d, 0x1f, 0x8f, 0x1f,
+ 0xa1, 0x1f, 0xb5, 0x20, 0x40, 0x20, 0x73, 0x20,
+ 0x8c, 0x20, 0xb0, 0x21, 0x2d, 0x21, 0x85, 0x21,
+ 0xad, 0x22, 0x24, 0x22, 0x66, 0x22, 0xdf, 0x23,
+ 0x25, 0x23, 0x6e, 0x23, 0x9e, 0x23, 0xd2, 0x24,
+ 0x8, 0x24, 0x9d, 0x24, 0xac, 0x24, 0xc3, 0x25,
+ 0x37, 0x25, 0x59, 0x25, 0x89, 0x25, 0xd3, 0x26,
+ 0x29, 0x26, 0x7f, 0x26, 0x9a, 0x26, 0xb5, 0x26,
+ 0xd1, 0x26, 0xf2, 0x27, 0x16, 0x27, 0x38, 0x27,
+ 0x5a, 0x27, 0x77, 0x27, 0xa8, 0x28, 0x45, 0x28,
+ 0x7d, 0x28, 0xd4, 0x29, 0x32, 0x29, 0xcd, 0x29,
+ 0xf8, 0x2a, 0x24, 0x2a, 0x87, 0x2a, 0x9d, 0x2a,
+ 0xa0, 0x2b, 0x31, 0x2b, 0x6b, 0x2b, 0xc2, 0x2c,
+ 0x21, 0x2c, 0xba, 0x2d, 0x14, 0x2d, 0x50, 0x2d,
+ 0x9d, 0x2d, 0xeb, 0x2e, 0x36, 0x2e, 0x6b, 0x2e,
+ 0x7a, 0x2e, 0x88, 0x2e, 0xbc, 0x2e, 0xd8, 0x2e,
+ 0xe4, 0x2f, 0x0, 0x2f, 0x33, 0x2f, 0x62, 0x2f,
+ 0xa0, 0x2f, 0xb3, 0x2f, 0xcb, 0x30, 0x12, 0x30,
+ 0x23, 0x30, 0x3c, 0x30, 0x85, 0xfc, 0x31, 0xe,
+ 0x5f, 0xa, 0xf7, 0x70, 0xd6, 0xf8, 0x3b, 0x77,
+ 0x1, 0x99, 0x16, 0xea, 0x6, 0xd8, 0xf7, 0x70,
+ 0x5, 0xf7, 0xb2, 0x6, 0xdb, 0xfb, 0x70, 0x5,
+ 0xf1, 0x6, 0xfb, 0xaa, 0xf9, 0x62, 0x5, 0x28,
+ 0x6, 0x49, 0xfc, 0x3b, 0x15, 0xf7, 0x4, 0xf7,
+ 0xef, 0x5, 0x8d, 0x6, 0xf7, 0xb, 0xfb, 0xef,
+ 0x5, 0xe, 0xf7, 0xc9, 0x8b, 0xdf, 0xf7, 0xf,
+ 0xdf, 0xaf, 0xdf, 0xf7, 0x72, 0xe0, 0x1, 0xf8,
+ 0x78, 0xea, 0x3, 0x93, 0x16, 0xf2, 0x6, 0xec,
+ 0xf7, 0x63, 0x5, 0xf7, 0xa8, 0xfb, 0x63, 0xf8,
+ 0x67, 0xdf, 0xfc, 0x8, 0xf7, 0x87, 0xf7, 0xdf,
+ 0xdf, 0xfb, 0xdf, 0xf7, 0x72, 0xf8, 0x7, 0xe0,
+ 0xfc, 0xea, 0x6, 0x23, 0xfc, 0x3f, 0x15, 0xf7,
+ 0x39, 0xf7, 0xea, 0x5, 0xd2, 0xfb, 0xea, 0x6,
+ 0xe, 0x46, 0xa, 0xf8, 0x7f, 0xf7, 0x19, 0x1,
+ 0x27, 0xa, 0xfb, 0x44, 0xf8, 0x7f, 0x4c, 0xa,
+ 0xf7, 0x0, 0xf7, 0x19, 0x59, 0xa, 0x35, 0xa,
+ 0xfb, 0x9d, 0xf8, 0x7f, 0x15, 0xef, 0x6, 0xc3,
+ 0xda, 0xc0, 0x3c, 0x5, 0xef, 0x6, 0xfb, 0x2,
+ 0xf7, 0x19, 0x5, 0x2e, 0x6, 0xe, 0x46, 0xa,
+ 0xf8, 0x86, 0xed, 0x1, 0xf7, 0x5a, 0xe5, 0xe6,
+ 0xe5, 0x3, 0x27, 0xa, 0xfb, 0x8a, 0xf8, 0x86,
+ 0x15, 0xe5, 0xed, 0x31, 0x6, 0xf7, 0x49, 0x29,
+ 0x15, 0xe5, 0xed, 0x31, 0x6, 0xe, 0x35, 0xa,
+ 0xfb, 0x11, 0xf8, 0x7a, 0x15, 0xd0, 0x6, 0x4c,
+ 0xf7, 0x1e, 0x5, 0xfb, 0x1, 0x6, 0xe, 0x46,
+ 0xa, 0xf8, 0x65, 0xaf, 0xf2, 0xaf, 0x1, 0xf7,
+ 0x85, 0xaf, 0xf3, 0xaf, 0x3, 0x27, 0xa, 0xfb,
+ 0x5f, 0xf8, 0xbe, 0x64, 0xa, 0xaf, 0x5a, 0x5a,
+ 0x65, 0x67, 0x5a, 0x1e, 0xaf, 0x16, 0xa5, 0xa1,
+ 0xa3, 0xa9, 0xa9, 0xa1, 0x75, 0x6f, 0x6e, 0x74,
+ 0x73, 0x6e, 0x70, 0x72, 0xa0, 0xab, 0x1e, 0xe,
+ 0x46, 0xa, 0xf8, 0x87, 0x75, 0xa, 0x13, 0xe0,
+ 0x27, 0xa, 0xfb, 0xa6, 0xf8, 0x87, 0x6b, 0xa,
+ 0xa3, 0xa2, 0x80, 0x7f, 0xa1, 0x1f, 0x80, 0xa0,
+ 0x9f, 0x7f, 0x53, 0xa, 0x7e, 0x7b, 0x92, 0x93,
+ 0x79, 0x1f, 0x13, 0xd0, 0x97, 0x72, 0x70, 0x99,
+ 0x6d, 0x1b, 0x13, 0xe0, 0x73, 0xa, 0x73, 0x8b,
+ 0xe0, 0xf7, 0x8a, 0xe0, 0xf7, 0x6d, 0xe0, 0x1,
+ 0xd5, 0xea, 0xf7, 0xd2, 0xe8, 0x3, 0xd5, 0x16,
+ 0xf7, 0x82, 0x6, 0xf7, 0x18, 0xf7, 0x4b, 0xa5,
+ 0xf7, 0x4a, 0xc3, 0x67, 0xdf, 0xfb, 0x2, 0xac,
+ 0x1f, 0xe8, 0xba, 0x91, 0xce, 0xa5, 0x1a, 0xf7,
+ 0x32, 0xfb, 0x26, 0xb2, 0xfb, 0xe, 0x1e, 0xfb,
+ 0x82, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf7, 0x8a,
+ 0xf7, 0x23, 0x7, 0xc5, 0xf7, 0x33, 0x8b, 0xfb,
+ 0xf, 0xfb, 0x10, 0xfb, 0x3b, 0x8c, 0x59, 0x1f,
+ 0xfb, 0x23, 0xf7, 0xdf, 0x15, 0xf7, 0x6d, 0xf7,
+ 0x23, 0x7, 0xda, 0xeb, 0x89, 0xfb, 0x2, 0x21,
+ 0xfb, 0x4, 0x8c, 0x4c, 0x1f, 0xe, 0xaa, 0x78,
+ 0xde, 0xf8, 0xe2, 0xde, 0x1, 0xc3, 0xee, 0x3,
+ 0xf8, 0xde, 0xf7, 0x8d, 0x15, 0x32, 0x78, 0x53,
+ 0x2b, 0xfb, 0x1d, 0x1b, 0xfb, 0x40, 0x50, 0xf7,
+ 0x47, 0xf7, 0xc, 0xf7, 0xa, 0xab, 0xf7, 0x41,
+ 0xf7, 0x5b, 0xf7, 0x19, 0xbc, 0x2c, 0x50, 0x9e,
+ 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2b, 0x60, 0xfb,
+ 0xf, 0xcb, 0xfb, 0x15, 0x1b, 0xfb, 0x45, 0xfb,
+ 0x2d, 0xfb, 0x8, 0xfb, 0x96, 0xfb, 0x57, 0xe1,
+ 0xfb, 0x4f, 0xf7, 0x88, 0xd9, 0xf7, 0x41, 0xa2,
+ 0xf7, 0x70, 0xc3, 0x1f, 0xe, 0xaa, 0xfb, 0x60,
+ 0x76, 0xf7, 0x67, 0xda, 0xf8, 0xe1, 0xde, 0x1,
+ 0xb7, 0xee, 0xf7, 0x85, 0xe1, 0x3, 0xf7, 0xda,
+ 0x7d, 0x15, 0x72, 0x3f, 0x5, 0xbf, 0x8a, 0xaa,
+ 0x80, 0x70, 0x1a, 0x65, 0xfb, 0x7, 0x91, 0x78,
+ 0x8a, 0x1e, 0x87, 0x4c, 0x5, 0xf7, 0x2d, 0xd2,
+ 0x9e, 0xd8, 0xae, 0x75, 0xb0, 0x4e, 0x92, 0x1f,
+ 0x91, 0xac, 0x5, 0xf7, 0x1e, 0xf7, 0x0, 0xd8,
+ 0xf7, 0x3a, 0xb5, 0x1f, 0x2b, 0xa4, 0x5, 0x2f,
+ 0x75, 0x59, 0x2d, 0xfb, 0x1e, 0x1b, 0xfb, 0x42,
+ 0x51, 0xf7, 0x2d, 0xf7, 0x21, 0xf7, 0x1a, 0xbc,
+ 0xf7, 0x35, 0xf7, 0x52, 0xf7, 0x19, 0xb4, 0x2e,
+ 0x50, 0x9d, 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2c,
+ 0x60, 0xfb, 0x7, 0xc8, 0xfb, 0x13, 0x1b, 0xfb,
+ 0x31, 0xfb, 0x4a, 0x28, 0xfb, 0xab, 0xfb, 0x38,
+ 0xd0, 0xfb, 0x65, 0xf7, 0x69, 0x1f, 0xe, 0xaa,
+ 0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x12, 0xdc, 0xea,
+ 0xf8, 0x24, 0xed, 0x17, 0xdc, 0x16, 0xf7, 0x8a,
+ 0x6, 0xf7, 0x6e, 0xf7, 0x15, 0xf7, 0x10, 0xf7,
+ 0x82, 0x1f, 0x13, 0xe0, 0xf7, 0x9a, 0xfb, 0x24,
+ 0xe9, 0xfb, 0x5f, 0x1e, 0xfb, 0x8a, 0x6, 0xea,
+ 0xfd, 0xd, 0x15, 0xf8, 0xb8, 0x7, 0x13, 0xd0,
+ 0xf7, 0x2b, 0x6, 0xf7, 0x2e, 0xea, 0x21, 0xfb,
+ 0x39, 0xfb, 0xac, 0xfb, 0x39, 0x8e, 0x37, 0x1f,
+ 0xe, 0x73, 0x8b, 0xe0, 0xf7, 0x86, 0xe0, 0xf7,
+ 0x71, 0xe0, 0x6e, 0xa, 0x3, 0xe1, 0x16, 0xf9,
+ 0x62, 0xf8, 0x85, 0x36, 0xfc, 0x26, 0xfb, 0x71,
+ 0xf8, 0x15, 0x36, 0xfc, 0x15, 0xfb, 0x86, 0xf8,
+ 0x26, 0x36, 0x7, 0xe, 0x43, 0xa, 0xc3, 0xf7,
+ 0x1d, 0x36, 0xa, 0xf7, 0x54, 0xc3, 0x2f, 0xa,
+ 0xe, 0x43, 0xa, 0xf7, 0x55, 0x77, 0x36, 0xa,
+ 0xf2, 0xc3, 0x2c, 0xa, 0xe, 0x43, 0xa, 0xcc,
+ 0xef, 0x6e, 0xa, 0xa6, 0xe5, 0xe6, 0xe5, 0x30,
+ 0xa, 0xf7, 0xe, 0xcc, 0x2e, 0xa, 0xe, 0x43,
+ 0xa, 0xc7, 0xf7, 0x19, 0x36, 0xa, 0xf7, 0x8f,
+ 0xc7, 0x4c, 0xa, 0x4a, 0xf7, 0x19, 0x59, 0xa,
+ 0xaa, 0x8b, 0xe0, 0xf7, 0x7b, 0xe0, 0xf7, 0x7c,
+ 0xe0, 0x1, 0xdb, 0xea, 0xf8, 0x25, 0xed, 0x3,
+ 0xdb, 0x16, 0xf7, 0x89, 0x6, 0xf7, 0x5a, 0xf7,
+ 0x2b, 0xf7, 0xc, 0xf7, 0x86, 0xf7, 0x9a, 0xfb,
+ 0x26, 0xe9, 0xfb, 0x5f, 0x1f, 0xfb, 0x89, 0xfb,
+ 0xd1, 0x3b, 0x36, 0xdb, 0x6, 0xea, 0xfb, 0x7b,
+ 0x15, 0xf7, 0x7b, 0xf7, 0x57, 0xe0, 0xfb, 0x57,
+ 0xf7, 0x7c, 0xf7, 0x2a, 0x7, 0xf7, 0x34, 0xe6,
+ 0x46, 0xfb, 0x5e, 0xfb, 0xab, 0xfb, 0x3b, 0x8d,
+ 0x37, 0x1f, 0xe, 0x73, 0x8b, 0xda, 0xf7, 0x43,
+ 0xcb, 0xdf, 0xcb, 0xf7, 0x41, 0xda, 0x1, 0x99,
+ 0xf7, 0x93, 0x15, 0xf4, 0x6, 0xfb, 0x40, 0xb7,
+ 0xe4, 0x38, 0xf7, 0x6b, 0x1b, 0xc1, 0xc9, 0x94,
+ 0x9d, 0xbb, 0x1f, 0xed, 0x7, 0x68, 0x5e, 0x50,
+ 0x80, 0x4f, 0x1b, 0xfb, 0x20, 0x31, 0xcb, 0xf7,
+ 0x4, 0x73, 0x1f, 0xf7, 0xe4, 0x6, 0x9a, 0xcb,
+ 0x5, 0xfb, 0xff, 0x6, 0x8a, 0x99, 0x8b, 0xae,
+ 0x8c, 0xac, 0x8, 0xf8, 0xf, 0x6, 0x9a, 0xcb,
+ 0x5, 0xfc, 0x15, 0x6, 0xf7, 0x6, 0xa2, 0xf7,
+ 0x2, 0xc7, 0xf7, 0x19, 0x1b, 0xc5, 0xbf, 0x7b,
+ 0x6c, 0xb8, 0x1f, 0xa2, 0xe2, 0x5, 0xa7, 0x56,
+ 0x4b, 0x96, 0x4e, 0x1b, 0xfb, 0x5b, 0xfb, 0x12,
+ 0x32, 0xfb, 0x38, 0x66, 0x1f, 0x37, 0x6, 0x7b,
+ 0x4b, 0x5, 0xe7, 0x6, 0x8a, 0x77, 0x8c, 0x61,
+ 0x8c, 0x77, 0x8, 0x3e, 0x6, 0xe, 0x3b, 0xa0,
+ 0x76, 0xf7, 0xd8, 0xe0, 0xf7, 0x74, 0xe0, 0x6e,
+ 0xa, 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xd8, 0xf7,
+ 0xdb, 0xe0, 0xfb, 0xdb, 0xf7, 0x74, 0xf8, 0x26,
+ 0xe0, 0xfc, 0x85, 0x6, 0xe, 0xe2, 0x78, 0xe2,
+ 0xf7, 0x66, 0xe2, 0xf7, 0xb5, 0xde, 0x12, 0xbb,
+ 0xea, 0xf8, 0x6a, 0xe6, 0x17, 0xf8, 0x29, 0xf7,
+ 0xaa, 0x15, 0xf7, 0x64, 0xfb, 0x1c, 0x6, 0x7d,
+ 0x7a, 0x39, 0x4f, 0x20, 0x1b, 0x13, 0x30, 0xfb,
+ 0x3c, 0x2b, 0xf7, 0xc, 0xf7, 0x3b, 0xd2, 0xa2,
+ 0xf7, 0x78, 0xf7, 0x83, 0x1f, 0x13, 0xf8, 0xf7,
+ 0x35, 0xa9, 0xfb, 0x5, 0x5d, 0x98, 0x1f, 0xdf,
+ 0xa3, 0x5, 0xc0, 0x7e, 0x64, 0xf7, 0x39, 0xfb,
+ 0x80, 0x1b, 0xfb, 0xb4, 0x46, 0xfb, 0x82, 0xfb,
+ 0x24, 0xfb, 0x7b, 0xf7, 0x24, 0xfb, 0x23, 0xf7,
+ 0x6b, 0xf7, 0x2d, 0xf5, 0xdd, 0xaa, 0xb1, 0x1f,
+ 0xf7, 0xa3, 0xfb, 0xbf, 0x7, 0xe, 0xaa, 0xa0,
+ 0x76, 0xf7, 0xe5, 0xe0, 0xf7, 0xbc, 0x77, 0x1,
+ 0xd8, 0xea, 0xf8, 0xf, 0xea, 0x3, 0xd8, 0x16,
+ 0xea, 0xf7, 0xe5, 0xf8, 0xf, 0xfb, 0xe5, 0xea,
+ 0xf9, 0x62, 0x2c, 0xfb, 0xbc, 0xfc, 0xf, 0xf7,
+ 0xbc, 0x2c, 0x6, 0xe, 0xfc, 0x31, 0x39, 0xa,
+ 0xe6, 0xec, 0x3, 0xe6, 0x16, 0xec, 0xf9, 0x62,
+ 0x2a, 0x6, 0xe, 0x61, 0xa, 0xd2, 0xf9, 0xab,
+ 0x4c, 0xa, 0xf7, 0x15, 0xf7, 0x1e, 0x38, 0xa,
+ 0x48, 0x51, 0xa, 0x4b, 0xa, 0xf9, 0xac, 0xf7,
+ 0x1d, 0x1, 0xe5, 0xea, 0x3, 0x85, 0xf9, 0xac,
+ 0x15, 0xef, 0x6, 0xba, 0xde, 0xb8, 0x38, 0x5,
+ 0xee, 0x6, 0x26, 0x42, 0xa, 0x8a, 0x51, 0xa,
+ 0x4b, 0xa, 0xf9, 0xb5, 0xef, 0x12, 0x98, 0xe5,
+ 0x7e, 0xea, 0x82, 0xe5, 0x13, 0xd0, 0xe5, 0x16,
+ 0xea, 0xf9, 0x60, 0x2c, 0x6, 0x13, 0xe8, 0x3e,
+ 0xe0, 0x58, 0xa, 0x61, 0xa, 0xf7, 0x1e, 0xf9,
+ 0xaa, 0x15, 0xd1, 0x6, 0x35, 0xf7, 0x1f, 0x38,
+ 0xa, 0xde, 0x51, 0xa, 0xfb, 0x53, 0x78, 0xe0,
+ 0xf9, 0x20, 0x77, 0x1, 0x9c, 0xe1, 0xf7, 0x7a,
+ 0xea, 0x3, 0x9c, 0xf7, 0x5b, 0x15, 0xfb, 0x4c,
+ 0xf7, 0x19, 0x69, 0xd2, 0xf7, 0x49, 0xa5, 0xf7,
+ 0x13, 0xf7, 0x3, 0x1e, 0xf8, 0x87, 0x2c, 0xfc,
+ 0x87, 0x7, 0x50, 0x86, 0x2d, 0x20, 0x27, 0x7b,
+ 0xeb, 0xbc, 0x89, 0x1e, 0xe, 0x73, 0x39, 0xa,
+ 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xea, 0xf7, 0x8c,
+ 0x6, 0xf7, 0xa, 0xf7, 0x6, 0xf7, 0x8d, 0xfb,
+ 0xfe, 0x5, 0xf7, 0x11, 0x6, 0xfb, 0xc8, 0xf8,
+ 0x3e, 0xf7, 0xbf, 0xf7, 0xb8, 0x5, 0xfb, 0x14,
+ 0x6, 0xfb, 0xf7, 0xfb, 0xf9, 0x5, 0xf7, 0xf9,
+ 0x2c, 0x7, 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77,
+ 0x1, 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xf8, 0x61,
+ 0xe0, 0xfc, 0x2, 0xf9, 0xd, 0x2c, 0x6, 0xe,
+ 0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd6, 0xea,
+ 0x3, 0xd6, 0x16, 0xf8, 0x62, 0xe0, 0xfc, 0x3,
+ 0xf7, 0xa4, 0x6, 0xf7, 0x35, 0x5a, 0xa, 0xdd,
+ 0x7, 0xfb, 0x35, 0xfb, 0x1e, 0x5, 0xf7, 0xac,
+ 0x2c, 0xfb, 0xfc, 0x7, 0x2c, 0x38, 0x5, 0x3a,
+ 0x7, 0xea, 0xdd, 0x5, 0xe, 0xf7, 0x22, 0x39,
+ 0xa, 0xd4, 0xe5, 0xf8, 0x90, 0xe5, 0x3, 0xd4,
+ 0x16, 0xe5, 0xf8, 0xf7, 0x8e, 0x6, 0xf7, 0x64,
+ 0xfc, 0xf7, 0x5, 0xe0, 0x6, 0xf7, 0x66, 0xf8,
+ 0xed, 0x5, 0x8d, 0xfc, 0xed, 0xe5, 0xf9, 0x62,
+ 0xfb, 0x16, 0x6, 0xfb, 0x65, 0xfc, 0xfb, 0x5,
+ 0x89, 0x6, 0xfb, 0x5e, 0xf8, 0xfb, 0x5, 0xfb,
+ 0x25, 0x6, 0xe, 0xaa, 0x39, 0xa, 0xd7, 0xe5,
+ 0xf8, 0x1a, 0xe5, 0x3, 0xd7, 0x16, 0xe5, 0xf8,
+ 0xc8, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc8, 0x5,
+ 0xec, 0xf9, 0x62, 0x31, 0xfc, 0xc8, 0x89, 0x6,
+ 0xfc, 0x11, 0xf8, 0xc8, 0x5, 0x2a, 0x6, 0xe,
+ 0xaa, 0xa0, 0x76, 0xf8, 0xd7, 0xf7, 0x2e, 0xf7,
+ 0x22, 0xb5, 0x1, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5,
+ 0x3, 0xd7, 0x16, 0xe5, 0xf8, 0xc6, 0x8d, 0x6,
+ 0xf8, 0x11, 0xfc, 0xc6, 0x5, 0xec, 0xf9, 0x60,
+ 0x31, 0xfc, 0xc6, 0x6, 0xfc, 0x13, 0xf8, 0xc6,
+ 0x5, 0x2a, 0x6, 0xf7, 0x18, 0xe3, 0x6b, 0xa,
+ 0xa1, 0xa1, 0x7f, 0x80, 0xa1, 0x1f, 0x7f, 0xa1,
+ 0xa1, 0x80, 0x53, 0xa, 0x87, 0x78, 0x94, 0x95,
+ 0x73, 0x1f, 0x96, 0x72, 0x6c, 0x96, 0x71, 0x1b,
+ 0x73, 0xa, 0xe2, 0x78, 0xde, 0xf8, 0xe2, 0xde,
+ 0x1, 0xc7, 0xef, 0xf8, 0x5f, 0xef, 0x3, 0xb2,
+ 0xf7, 0xf8, 0x15, 0xfb, 0x4f, 0xf7, 0xd, 0xfb,
+ 0x50, 0xf7, 0x78, 0xf7, 0x57, 0xf7, 0x30, 0xf7,
+ 0x1f, 0xf7, 0x80, 0xf7, 0x7f, 0xfb, 0x2c, 0xf7,
+ 0x26, 0xfb, 0x5b, 0xfb, 0x4c, 0xfb, 0x39, 0xfb,
+ 0xe, 0xfb, 0x97, 0x1e, 0xef, 0x16, 0xf7, 0x18,
+ 0xcf, 0xf7, 0x3a, 0xf7, 0x49, 0xf7, 0x10, 0xf7,
+ 0x13, 0x32, 0xfb, 0x65, 0xfb, 0x5c, 0xfb, 0xa,
+ 0x2f, 0xfb, 0x19, 0xfb, 0x28, 0x26, 0xf7, 0xd,
+ 0xf7, 0x3f, 0x1e, 0xe, 0xf7, 0xc9, 0x78, 0xd7,
+ 0x4c, 0xe0, 0xf7, 0x8d, 0xe0, 0xf7, 0x79, 0xe0,
+ 0x49, 0xd7, 0x12, 0xcd, 0xed, 0xf8, 0x2, 0xe3,
+ 0x13, 0x76, 0xf8, 0xa6, 0x85, 0x15, 0xf8, 0x47,
+ 0xe0, 0xfb, 0xef, 0xf7, 0x8d, 0xf7, 0xc7, 0xe0,
+ 0xfb, 0xc7, 0xf7, 0x79, 0xf7, 0xe0, 0xe0, 0xfc,
+ 0x39, 0x2a, 0x89, 0x6, 0x13, 0x8e, 0xe2, 0x59,
+ 0x39, 0x9f, 0x43, 0x1b, 0xfb, 0x66, 0x3e, 0xfb,
+ 0x48, 0xfb, 0x57, 0xfb, 0x3b, 0xca, 0xfb, 0x6a,
+ 0xf7, 0x74, 0xb5, 0xf1, 0x92, 0xf7, 0x1, 0xc8,
+ 0x1f, 0x8d, 0x6, 0xfc, 0x20, 0xf7, 0x9d, 0x15,
+ 0xf7, 0xf, 0xac, 0xf7, 0x44, 0xf7, 0x30, 0xf7,
+ 0x2f, 0xb9, 0xfb, 0x5d, 0x29, 0xfb, 0xe, 0x58,
+ 0xfb, 0x4b, 0xfb, 0x2a, 0x25, 0x34, 0xf2, 0xf7,
+ 0x5e, 0x1e, 0xe, 0x4f, 0xa, 0xbd, 0xf7, 0x1d,
+ 0x45, 0xa, 0xf7, 0xe2, 0xf9, 0xac, 0x2f, 0xa,
+ 0xfb, 0xf2, 0x26, 0xa, 0x4f, 0xa, 0xf7, 0x4f,
+ 0x77, 0x45, 0xa, 0xf7, 0x7f, 0xf9, 0xac, 0x2c,
+ 0xa, 0xfb, 0xb8, 0x26, 0xa, 0x4f, 0xa, 0x45,
+ 0xa, 0xbc, 0xf7, 0xf9, 0x21, 0xa, 0xf4, 0xf8,
+ 0x50, 0x2e, 0xa, 0xe, 0x4f, 0xa, 0xb9, 0xf7,
+ 0x21, 0x45, 0xa, 0xf8, 0x12, 0xf9, 0xa8, 0x15,
+ 0xd5, 0x6, 0x49, 0xf7, 0x21, 0x5, 0xfb, 0xa,
+ 0x6, 0xfb, 0x73, 0x26, 0xa, 0xe2, 0x87, 0xda,
+ 0x42, 0x76, 0xf9, 0x28, 0xda, 0x9c, 0x77, 0x12,
+ 0xb8, 0xed, 0xf8, 0x7c, 0xed, 0x13, 0x6c, 0xb2,
+ 0xa0, 0x15, 0xbc, 0x63, 0xdc, 0xe5, 0x5, 0x13,
+ 0x9c, 0x6c, 0xb6, 0xc4, 0x5f, 0xf7, 0xb, 0x1b,
+ 0xf7, 0x48, 0xf7, 0x35, 0xf7, 0x10, 0xf7, 0x80,
+ 0xf7, 0x17, 0x60, 0xcd, 0x6a, 0xbb, 0x1f, 0xe2,
+ 0xeb, 0x5a, 0xb3, 0x39, 0x30, 0x5, 0x13, 0xac,
+ 0xab, 0x60, 0x4e, 0xb5, 0xfb, 0x9, 0x1b, 0xfb,
+ 0x65, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x6d, 0xfb,
+ 0xf, 0xb2, 0x52, 0xb4, 0x4d, 0x1f, 0xc8, 0xce,
+ 0x15, 0x76, 0xb3, 0x75, 0xb3, 0xea, 0x1a, 0xf7,
+ 0x75, 0xf7, 0x21, 0xc5, 0xf3, 0xdd, 0xb3, 0x6f,
+ 0x6c, 0xb3, 0x1e, 0xfb, 0xd7, 0xfc, 0x53, 0x15,
+ 0xf8, 0x0, 0xf8, 0x21, 0x5, 0xa4, 0x5d, 0x9a,
+ 0x52, 0x42, 0x1a, 0xfb, 0x48, 0x24, 0x26, 0xfb,
+ 0x20, 0x34, 0x5c, 0xb2, 0xa0, 0x70, 0x1e, 0xe,
+ 0x4f, 0xa, 0x45, 0xa, 0xf7, 0x76, 0xf9, 0xb8,
+ 0x15, 0xcc, 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9e,
+ 0xa2, 0x82, 0x80, 0xa3, 0x1e, 0x7f, 0xa7, 0xa3,
+ 0x7d, 0x96, 0x1b, 0xa0, 0xd6, 0x86, 0xf7, 0x9,
+ 0x56, 0xa, 0x87, 0x78, 0x94, 0x96, 0x73, 0x1f,
+ 0x72, 0x96, 0x6d, 0x96, 0x70, 0x8a, 0x8, 0x5a,
+ 0x59, 0x67, 0x3f, 0x1f, 0xfb, 0x45, 0xfc, 0x53,
+ 0x21, 0xa, 0xe, 0x5f, 0xa, 0xf7, 0xb6, 0xe0,
+ 0xf7, 0x96, 0xe0, 0x6e, 0xa, 0xf7, 0xda, 0xed,
+ 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xb6, 0xf7, 0x44,
+ 0x6, 0xf7, 0x18, 0xf7, 0x19, 0xbb, 0xf7, 0x3c,
+ 0xf7, 0x39, 0xfb, 0x15, 0xba, 0xfb, 0x1c, 0x1f,
+ 0xfb, 0xa3, 0x6, 0xea, 0xfb, 0xeb, 0x15, 0xf7,
+ 0x96, 0xf7, 0x44, 0x7, 0xeb, 0xd2, 0x71, 0x26,
+ 0xfb, 0x12, 0xfb, 0x7, 0x86, 0x57, 0x1f, 0xe,
+ 0xe2, 0x68, 0x76, 0xb7, 0xdd, 0xf8, 0xdd, 0xdd,
+ 0x1, 0xc3, 0xed, 0xf8, 0x6f, 0xed, 0x3, 0xf8,
+ 0xc2, 0xab, 0x15, 0x6c, 0x53, 0x50, 0x7e, 0x4e,
+ 0x1b, 0xfb, 0x5c, 0xfb, 0x23, 0xf7, 0x2e, 0xf7,
+ 0x70, 0xf7, 0x68, 0xf7, 0x13, 0xf7, 0x37, 0xf7,
+ 0x6c, 0xf7, 0x5a, 0xf7, 0x27, 0xfb, 0x27, 0xfb,
+ 0x78, 0x37, 0x77, 0xfb, 0x7, 0x33, 0x36, 0x1f,
+ 0xb0, 0x70, 0xb3, 0x74, 0xb6, 0x7a, 0x70, 0x48,
+ 0x18, 0x58, 0x9e, 0x58, 0xa8, 0x57, 0xb3, 0x8,
+ 0xfb, 0x29, 0xf7, 0x3c, 0x15, 0xd7, 0x76, 0xae,
+ 0x71, 0xa3, 0x74, 0x8, 0xd3, 0xcb, 0x98, 0xef,
+ 0xcf, 0x1a, 0xf7, 0x60, 0xfb, 0xe, 0xe4, 0xfb,
+ 0x11, 0x26, 0xfb, 0x24, 0x50, 0xfb, 0x7e, 0xfb,
+ 0x6b, 0xf7, 0x13, 0x3e, 0xf7, 0xa, 0xbe, 0xaf,
+ 0x99, 0x90, 0x96, 0x1e, 0x6c, 0x9e, 0x6f, 0x99,
+ 0x68, 0x93, 0x8, 0xe, 0xaa, 0xa0, 0x76, 0xf7,
+ 0xd0, 0xe0, 0xf7, 0x82, 0xda, 0x1, 0xe3, 0xea,
+ 0xf7, 0xec, 0xed, 0x3, 0xe3, 0x16, 0xea, 0xf7,
+ 0xd0, 0xcb, 0x6, 0xda, 0xb6, 0x84, 0xfb, 0x35,
+ 0xf1, 0x1f, 0xe9, 0xfb, 0x28, 0x5, 0xf7, 0xb,
+ 0x6, 0xfb, 0xd, 0xf7, 0x43, 0x53, 0xe2, 0x5c,
+ 0xb9, 0x67, 0x9c, 0x19, 0x8d, 0x7, 0xf7, 0xe,
+ 0x9b, 0xda, 0xcb, 0xf7, 0x7, 0x1a, 0xf7, 0x2c,
+ 0xfb, 0x25, 0xb7, 0xfb, 0x15, 0x1e, 0xfb, 0x9b,
+ 0x6, 0xea, 0xfb, 0xd1, 0x15, 0xf7, 0x82, 0xf7,
+ 0x3c, 0x7, 0xd5, 0xf1, 0x72, 0x2f, 0x24, 0x2a,
+ 0x79, 0x3c, 0x1f, 0xe, 0x73, 0x78, 0xe2, 0xf8,
+ 0xda, 0xe2, 0x1, 0xd7, 0xe6, 0xf7, 0xf5, 0xe6,
+ 0x3, 0xbc, 0xf7, 0x79, 0x15, 0xfb, 0x27, 0x9b,
+ 0xd2, 0x26, 0xf7, 0x6b, 0x1b, 0xf7, 0x37, 0xf5,
+ 0xe6, 0xf7, 0xd, 0xf7, 0x35, 0xfb, 0x2a, 0xb5,
+ 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x18, 0xa9, 0x63,
+ 0x9c, 0xcb, 0x1a, 0xe6, 0xee, 0xa2, 0xc9, 0xf7,
+ 0x29, 0xa4, 0x35, 0x56, 0x90, 0x1e, 0xe7, 0x92,
+ 0x5, 0xf7, 0x24, 0x86, 0xfb, 0x3, 0xd6, 0xfb,
+ 0x2f, 0x1b, 0xfb, 0x33, 0x2e, 0x33, 0xfb, 0x5,
+ 0xfb, 0x26, 0xf7, 0x22, 0x69, 0xe8, 0x74, 0x1f,
+ 0xf7, 0x26, 0x68, 0xd3, 0x78, 0x35, 0x1a, 0x3a,
+ 0x3c, 0x5f, 0x28, 0x41, 0xfb, 0xe, 0xab, 0xf7,
+ 0x1d, 0x7b, 0x1e, 0xe, 0x73, 0x78, 0xe0, 0xf8,
+ 0xcc, 0xe0, 0x1, 0xd9, 0xe5, 0xf7, 0xef, 0xe6,
+ 0x3, 0xbc, 0xf7, 0x74, 0x15, 0xfb, 0x10, 0xa1,
+ 0xcd, 0xfb, 0xb, 0xf7, 0x6a, 0x1b, 0xf7, 0x37,
+ 0xf5, 0xe4, 0xf7, 0xb, 0xf7, 0x31, 0xfb, 0x2a,
+ 0xb4, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x17, 0xa8,
+ 0x63, 0x9c, 0xc9, 0x1a, 0xe4, 0xee, 0xa3, 0xc9,
+ 0xf7, 0x28, 0xa4, 0x36, 0x57, 0x90, 0x1e, 0xe6,
+ 0x92, 0x5, 0xf7, 0x21, 0x86, 0xfb, 0x2, 0xd5,
+ 0xfb, 0x2e, 0x1b, 0xfb, 0x33, 0x2f, 0x34, 0xfb,
+ 0x3, 0xfb, 0x23, 0xf7, 0x21, 0x6a, 0xe8, 0x75,
+ 0x1f, 0xf7, 0x25, 0x68, 0xd3, 0x79, 0x37, 0x1a,
+ 0x3b, 0x3c, 0x60, 0x28, 0x42, 0xfb, 0x6, 0xad,
+ 0xf7, 0x18, 0x72, 0x1e, 0xf7, 0x2a, 0xf8, 0xc4,
+ 0x37, 0xa, 0x3b, 0xa0, 0x76, 0xf9, 0xd, 0xe0,
+ 0x1, 0xf7, 0x95, 0xea, 0x3, 0xf7, 0x95, 0x16,
+ 0xea, 0xf9, 0xd, 0xf7, 0x89, 0xe0, 0xfc, 0xdb,
+ 0x36, 0xf7, 0x87, 0x6, 0xe, 0x5f, 0xa, 0xf7,
+ 0x25, 0xe0, 0xf7, 0x94, 0xe0, 0xf7, 0x27, 0x77,
+ 0x6e, 0xa, 0xf7, 0xeb, 0xed, 0x3, 0xe1, 0x16,
+ 0xea, 0xf7, 0x25, 0xf7, 0x39, 0x6, 0xf7, 0x18,
+ 0xf7, 0x24, 0xb9, 0xf7, 0x3d, 0xf7, 0x35, 0xfb,
+ 0x1b, 0xbd, 0xfb, 0x21, 0x1f, 0xfb, 0x39, 0xf7,
+ 0x27, 0x2c, 0x6, 0xea, 0xfc, 0x7c, 0x15, 0xf7,
+ 0x94, 0xf7, 0x39, 0x7, 0xe5, 0xe3, 0x79, 0xfb,
+ 0x0, 0xfb, 0x13, 0xfb, 0x15, 0x88, 0x5a, 0x1f,
+ 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x20, 0x77, 0x41,
+ 0xa, 0xf9, 0x62, 0x15, 0xfc, 0x3a, 0x7, 0xfb,
+ 0x13, 0x91, 0xfb, 0x50, 0xf7, 0xa3, 0xf7, 0xac,
+ 0x93, 0xf7, 0x70, 0xea, 0x1e, 0xf8, 0x3a, 0x2c,
+ 0xfc, 0x3a, 0x7, 0xfb, 0x15, 0x7a, 0x26, 0xfb,
+ 0x44, 0xfb, 0x48, 0x89, 0xf7, 0x23, 0xe2, 0x1e,
+ 0xf8, 0x3a, 0x7, 0xe, 0x2b, 0xa, 0xf7, 0x18,
+ 0xda, 0x2f, 0xa, 0xe, 0x2b, 0xa, 0xac, 0xda,
+ 0x2c, 0xa, 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x6e,
+ 0xef, 0x2a, 0xa, 0xbf, 0xe3, 0x2e, 0xa, 0xe,
+ 0x2b, 0xa, 0xf7, 0x3f, 0xda, 0x5e, 0xa, 0x73,
+ 0x39, 0xa, 0xf7, 0xb5, 0x16, 0xe8, 0x6, 0xf7,
+ 0x9d, 0xf9, 0x62, 0x5, 0x30, 0x6, 0xfb, 0x71,
+ 0xfd, 0x13, 0xfb, 0x6e, 0xf9, 0x13, 0x5, 0x2a,
+ 0x6, 0xe, 0xf7, 0x91, 0x39, 0xa, 0xf7, 0x62,
+ 0x16, 0xea, 0x6, 0xf7, 0x3c, 0xf9, 0xc, 0x5,
+ 0x8c, 0x6, 0xf7, 0x40, 0xfd, 0xc, 0x5, 0xe5,
+ 0x6, 0xf7, 0x58, 0xf9, 0x62, 0x5, 0x2d, 0x6,
+ 0xfb, 0x27, 0xfc, 0xfe, 0xfb, 0x32, 0xf8, 0xfe,
+ 0x5, 0xfb, 0x2, 0x6, 0xfb, 0x3a, 0xfc, 0xfe,
+ 0x5, 0x89, 0x6, 0xfb, 0x1f, 0xf8, 0xfe, 0x5,
+ 0x2b, 0x6, 0xe, 0x73, 0x39, 0xa, 0x9e, 0x16,
+ 0xf7, 0x1, 0x6, 0xf7, 0x61, 0xf7, 0xc4, 0x5,
+ 0x8c, 0x6, 0xf7, 0x5e, 0xfb, 0xc4, 0x5, 0xf7,
+ 0x4, 0x6, 0xfb, 0x98, 0xf8, 0x10, 0xf7, 0x85,
+ 0xf7, 0xe6, 0x5, 0x32, 0x6, 0xfb, 0x5f, 0xfb,
+ 0xa5, 0xfb, 0x47, 0xf7, 0xa5, 0x5, 0xfb, 0x0,
+ 0x6, 0xf7, 0x7f, 0xfb, 0xec, 0x5, 0xe, 0x73,
+ 0x39, 0xa, 0xf7, 0xaf, 0xe8, 0x3, 0xf7, 0xaf,
+ 0x16, 0xe8, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+ 0x33, 0x5, 0x20, 0x6, 0xfb, 0x67, 0xfb, 0xe7,
+ 0xfb, 0x65, 0xf7, 0xe7, 0x5, 0xfb, 0x4, 0x6,
+ 0xf7, 0xa1, 0xfc, 0x33, 0x5, 0xe, 0x5f, 0xa,
+ 0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xf7, 0xad, 0xea,
+ 0x3, 0x57, 0xa, 0xfb, 0x65, 0xfb, 0xe2, 0xfb,
+ 0x60, 0xf7, 0xe2, 0x5, 0xfb, 0x8, 0x6, 0xf7,
+ 0x9f, 0xfc, 0x2e, 0x5, 0x88, 0xf8, 0x7d, 0x2f,
+ 0xa, 0xe, 0x5f, 0xa, 0xf9, 0xb5, 0xef, 0x12,
+ 0xf7, 0x5a, 0xe5, 0x84, 0xea, 0x8e, 0xe5, 0x13,
+ 0xd8, 0x57, 0xa, 0xfb, 0x6a, 0xfb, 0xe2, 0xfb,
+ 0x5c, 0xf7, 0xe2, 0x38, 0xa, 0xf7, 0x9f, 0xfc,
+ 0x2e, 0x5, 0x13, 0xe8, 0x38, 0xf8, 0x86, 0x2e,
+ 0xa, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0,
+ 0x6a, 0xa, 0xf8, 0x4f, 0xf8, 0xb8, 0x5, 0xe0,
+ 0xfc, 0x93, 0x36, 0xf8, 0x22, 0x7, 0xfc, 0x4b,
+ 0xfc, 0xb4, 0x5, 0xe, 0x3b, 0x8b, 0xe0, 0xf8,
+ 0xb3, 0xe0, 0xf7, 0x6c, 0x77, 0x6a, 0xa, 0xf8,
+ 0x51, 0xf8, 0xb3, 0x5, 0xe0, 0xfc, 0x95, 0x36,
+ 0xf8, 0x24, 0x7, 0xfc, 0x4d, 0xfc, 0xaf, 0x5,
+ 0xf7, 0x82, 0xf9, 0x53, 0x37, 0xa, 0x7c, 0xd0,
+ 0xf8, 0x30, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, 0xa0,
+ 0xe3, 0x3, 0xbe, 0xf8, 0xd, 0x15, 0xe1, 0x80,
+ 0x5, 0xb6, 0x96, 0x9b, 0xc4, 0xf7, 0x2, 0x1b,
+ 0xf7, 0x15, 0x88, 0x3a, 0x53, 0x89, 0x1f, 0x59,
+ 0x79, 0x2e, 0x81, 0x7e, 0x89, 0x8, 0x52, 0x84,
+ 0xfb, 0x29, 0x7a, 0xfb, 0x1e, 0x1a, 0x35, 0xcc,
+ 0x49, 0xf7, 0x6, 0xc3, 0xc6, 0x98, 0xca, 0xd5,
+ 0x1e, 0x8d, 0x7e, 0x9d, 0x73, 0x99, 0x70, 0x8,
+ 0xe7, 0x6, 0x6f, 0xbd, 0x7b, 0x92, 0xf7, 0x19,
+ 0x1a, 0xf7, 0x28, 0x7, 0xe5, 0x80, 0xf7, 0x5,
+ 0xfb, 0x5d, 0xfb, 0x5c, 0x7e, 0xfb, 0x7, 0x5d,
+ 0x81, 0x1e, 0xf7, 0xef, 0xfb, 0x9, 0x15, 0x40,
+ 0x87, 0x5f, 0x68, 0x65, 0x1e, 0x5f, 0x62, 0x3d,
+ 0x86, 0x72, 0x1b, 0x3c, 0x85, 0xbb, 0xb0, 0xd1,
+ 0xc5, 0x95, 0xc1, 0x93, 0x1f, 0xb9, 0x92, 0xd7,
+ 0x98, 0xad, 0x98, 0x8, 0xe, 0x40, 0xa, 0xce,
+ 0xf7, 0x1d, 0x49, 0xa, 0x3f, 0xa, 0xfb, 0x1f,
+ 0xfc, 0xb, 0x20, 0xa, 0x40, 0xa, 0xf7, 0x60,
+ 0x77, 0x49, 0xa, 0x3a, 0xa, 0x3a, 0xfc, 0xb,
+ 0x20, 0xa, 0x54, 0xa, 0xf7, 0xe, 0xf8, 0xe5,
+ 0x4c, 0xa, 0xf7, 0x11, 0xf7, 0x21, 0x59, 0xa,
+ 0x40, 0xa, 0xd7, 0xef, 0x49, 0xa, 0x3e, 0xa,
+ 0xfb, 0x43, 0xfb, 0xef, 0x20, 0xa, 0xf7, 0x5a,
+ 0x7c, 0xd4, 0xf7, 0x47, 0xd3, 0xf7, 0x31, 0xd3,
+ 0x1, 0xaf, 0xe9, 0xf7, 0x94, 0xe4, 0x3, 0xbc,
+ 0xf8, 0x4, 0x15, 0xe1, 0x81, 0x5, 0xba, 0x95,
+ 0xb0, 0xc8, 0xe6, 0x1b, 0xf6, 0x95, 0x50, 0x3b,
+ 0x87, 0x1f, 0x64, 0x7f, 0x58, 0x88, 0x50, 0x83,
+ 0x8, 0x25, 0x7d, 0x28, 0x3f, 0x3e, 0x1a, 0x63,
+ 0xa4, 0xfb, 0x4, 0xf7, 0x2d, 0xed, 0xcc, 0xbd,
+ 0xbd, 0xbd, 0x1e, 0x3d, 0xc7, 0xcc, 0x75, 0xce,
+ 0x1b, 0xf7, 0x1e, 0xcb, 0xe2, 0xe2, 0xa4, 0x1f,
+ 0x30, 0x97, 0x5, 0x65, 0x82, 0x69, 0x40, 0x2e,
+ 0x1b, 0x2b, 0x50, 0xdd, 0xec, 0x96, 0x1f, 0xf8,
+ 0x8, 0x6, 0xf7, 0x38, 0x51, 0xf7, 0x1d, 0xfb,
+ 0x3e, 0x25, 0x5f, 0x5a, 0x76, 0x77, 0x1e, 0xa1,
+ 0x7e, 0x6d, 0xbb, 0xfb, 0x1d, 0x1b, 0xfb, 0x4e,
+ 0x71, 0xfb, 0xc, 0x59, 0x7f, 0x1f, 0xf7, 0xe7,
+ 0xfb, 0x0, 0x15, 0xfb, 0x12, 0xa2, 0x3e, 0x3c,
+ 0xfb, 0xc, 0x1b, 0x33, 0x8f, 0xc8, 0xa3, 0xb6,
+ 0xd2, 0xb0, 0xaf, 0x91, 0x1f, 0xbf, 0x93, 0xc8,
+ 0x94, 0xb1, 0x9c, 0x8, 0xe2, 0xbc, 0x15, 0xd5,
+ 0x90, 0xb4, 0xde, 0xed, 0x1b, 0xf7, 0x14, 0x93,
+ 0xfb, 0x11, 0x6b, 0x8e, 0x1f, 0xe, 0x40, 0xa,
+ 0xcf, 0xf7, 0x1c, 0x12, 0xba, 0xe9, 0xf7, 0x8d,
+ 0xe3, 0x13, 0xbc, 0xf7, 0x9a, 0xf8, 0xea, 0x4c,
+ 0xa, 0x4a, 0xf7, 0x1c, 0x38, 0xa, 0x86, 0xfc,
+ 0xb, 0x24, 0xa, 0x13, 0x7c, 0x25, 0xa, 0x13,
+ 0xbc, 0x28, 0xa, 0x73, 0x7c, 0xda, 0xf8, 0xda,
+ 0xd3, 0x12, 0xb7, 0xe8, 0x87, 0xe5, 0xf7, 0x38,
+ 0xe5, 0x13, 0xe8, 0xf7, 0x69, 0xf8, 0x2b, 0x15,
+ 0xfb, 0x12, 0x4e, 0x60, 0x42, 0x3b, 0x1a, 0x2f,
+ 0xd4, 0xfb, 0x8, 0xf7, 0x2d, 0xde, 0xcd, 0xab,
+ 0xca, 0xc3, 0x1e, 0x99, 0x7c, 0xb7, 0x5f, 0xc0,
+ 0x68, 0xc6, 0xce, 0x18, 0x64, 0xa7, 0x62, 0xaf,
+ 0x6a, 0xb5, 0xa8, 0xb7, 0x9e, 0xbb, 0x9b, 0xca,
+ 0x30, 0x9e, 0x18, 0x88, 0x7f, 0x81, 0x5e, 0x76,
+ 0x60, 0xfb, 0x15, 0xf7, 0x38, 0x18, 0xea, 0xbd,
+ 0xb3, 0xbe, 0xcd, 0x1a, 0xdd, 0x44, 0xd3, 0x27,
+ 0x1e, 0x13, 0xd8, 0x22, 0x47, 0x45, 0x37, 0x5f,
+ 0x9d, 0x62, 0xc9, 0x43, 0x1f, 0xb9, 0x52, 0x15,
+ 0xf7, 0x35, 0xfb, 0x5c, 0x5, 0x5c, 0x6c, 0x4f,
+ 0x64, 0x51, 0x1b, 0x13, 0xe8, 0x2d, 0x63, 0xe1,
+ 0xba, 0xcf, 0xc7, 0xba, 0xc9, 0xb1, 0x1f, 0xb1,
+ 0xf2, 0x15, 0x13, 0xd8, 0x47, 0xdb, 0x85, 0x97,
+ 0x9e, 0x1a, 0xbe, 0xb7, 0xaa, 0xb2, 0xb2, 0xb5,
+ 0x70, 0x54, 0x4d, 0x5d, 0x74, 0x5f, 0x71, 0x1e,
+ 0xe, 0x40, 0xa, 0xbb, 0xaf, 0xf5, 0xaf, 0x12,
+ 0xba, 0xe9, 0xbd, 0xaf, 0xf3, 0xaf, 0xa2, 0xe3,
+ 0x13, 0x7f, 0x80, 0xf7, 0x53, 0xf9, 0x2f, 0x64,
+ 0xa, 0xb3, 0x5a, 0x5a, 0x65, 0x63, 0x5a, 0x1e,
+ 0xaf, 0x8c, 0x15, 0xa6, 0xa0, 0xa4, 0xaa, 0xaa,
+ 0xa0, 0x72, 0x6f, 0x6e, 0x74, 0x73, 0x6e, 0x70,
+ 0x72, 0xa1, 0xab, 0x1e, 0x3d, 0xfb, 0xc9, 0x22,
+ 0xa, 0x13, 0xbf, 0x80, 0x28, 0xa, 0xfb, 0x72,
+ 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0x7d,
+ 0xf7, 0x9c, 0x15, 0xe5, 0x6, 0xf7, 0x32, 0xf7,
+ 0xd9, 0xf7, 0x34, 0xfb, 0xd9, 0x5, 0xe4, 0x6,
+ 0xfb, 0x69, 0xf8, 0x3c, 0x5, 0x44, 0x6, 0xe,
+ 0x20, 0xf7, 0x49, 0xe1, 0x49, 0x76, 0xc6, 0xe1,
+ 0x8c, 0x77, 0x12, 0x13, 0x60, 0xc8, 0xf7, 0x48,
+ 0x15, 0xa6, 0xa8, 0xae, 0xab, 0xc1, 0x1b, 0xbc,
+ 0xaf, 0x7a, 0x7b, 0xb0, 0x1f, 0x13, 0x90, 0x7e,
+ 0xa9, 0xa9, 0x7f, 0xb1, 0x1b, 0xc9, 0xae, 0xa5,
+ 0xa3, 0xa6, 0x1f, 0xea, 0x7, 0x82, 0x83, 0x59,
+ 0x59, 0x51, 0x1b, 0x6e, 0x69, 0x96, 0x97, 0x69,
+ 0x1f, 0x13, 0x60, 0x9b, 0x5e, 0x5e, 0x9e, 0x69,
+ 0x1b, 0x64, 0x59, 0x7f, 0x63, 0x67, 0x1f, 0xe,
+ 0xfb, 0xc2, 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77,
+ 0x1, 0xf7, 0x16, 0xf8, 0x43, 0x15, 0x9f, 0xa5,
+ 0x99, 0xa0, 0xa7, 0xbf, 0xa3, 0x63, 0x98, 0x74,
+ 0xa6, 0x67, 0xc4, 0xb3, 0x18, 0x86, 0x8f, 0x54,
+ 0xcb, 0x75, 0x9e, 0xaf, 0x8f, 0xbf, 0x97, 0xa9,
+ 0x94, 0x75, 0xcd, 0x18, 0x72, 0x83, 0x59, 0x79,
+ 0x67, 0x79, 0x8, 0x93, 0xbf, 0x8d, 0xb3, 0xa0,
+ 0x1a, 0x48, 0x6, 0x6c, 0x8d, 0x79, 0x93, 0x4a,
+ 0x1e, 0x83, 0x84, 0x3d, 0xb7, 0x75, 0x93, 0x75,
+ 0x49, 0x18, 0xb3, 0x81, 0xaf, 0x83, 0xb1, 0x84,
+ 0x3d, 0x34, 0x18, 0xe, 0xf7, 0xd8, 0x5c, 0xc8,
+ 0x4e, 0xf7, 0x4e, 0x82, 0xcc, 0xf7, 0xdb, 0xca,
+ 0xf7, 0x1, 0xc7, 0x12, 0xf7, 0x1c, 0xc6, 0xe8,
+ 0xd6, 0xf8, 0x5e, 0xc6, 0x13, 0xbf, 0xf8, 0xc3,
+ 0xf7, 0x5c, 0x15, 0x71, 0x8e, 0x90, 0x5f, 0xd1,
+ 0x1b, 0xf7, 0xc, 0xf7, 0xf, 0xf7, 0x1c, 0xf7,
+ 0x38, 0xf7, 0x33, 0xfb, 0xb, 0xf7, 0x39, 0xfb,
+ 0x7a, 0xfb, 0xc5, 0x31, 0xfb, 0x99, 0xfb, 0x3a,
+ 0xfb, 0x5a, 0xf7, 0x7, 0xfb, 0x44, 0xf7, 0xb8,
+ 0x1f, 0x13, 0x5f, 0xf7, 0x97, 0xe3, 0xf7, 0x39,
+ 0xa0, 0x95, 0x1f, 0x42, 0x6, 0x13, 0xbf, 0x62,
+ 0x6d, 0x3e, 0x37, 0xfb, 0x45, 0x1b, 0xfb, 0x3d,
+ 0xfb, 0x47, 0xd0, 0xf7, 0x88, 0xf7, 0x54, 0xf7,
+ 0x15, 0xf7, 0x43, 0xf7, 0x63, 0xf7, 0x35, 0xf7,
+ 0x15, 0x20, 0xfb, 0x31, 0xfb, 0x24, 0xfb, 0x4,
+ 0x34, 0x5f, 0x7f, 0x7a, 0x94, 0x9e, 0x1f, 0xd1,
+ 0xf7, 0xed, 0x5, 0x43, 0x6, 0x7d, 0x4a, 0x5,
+ 0xd3, 0x60, 0x53, 0x91, 0x74, 0x1b, 0xfb, 0x4,
+ 0x29, 0xfb, 0x28, 0xfb, 0x10, 0x22, 0xcb, 0x3e,
+ 0xde, 0xc7, 0xb6, 0xb8, 0xa3, 0xa0, 0x1f, 0xfb,
+ 0x58, 0xf7, 0x5, 0x15, 0xd4, 0xb3, 0xf7, 0x1c,
+ 0xea, 0xbc, 0xba, 0x64, 0x3b, 0xfb, 0x6, 0x32,
+ 0x2d, 0x45, 0x63, 0x6b, 0xad, 0xdf, 0x1e, 0xe,
+ 0x40, 0xa, 0xda, 0xf7, 0x5, 0x49, 0xa, 0xf7,
+ 0x48, 0xf8, 0xf5, 0x15, 0xbb, 0xab, 0x8a, 0x90,
+ 0xa7, 0xa0, 0x80, 0x80, 0x9e, 0x1e, 0x7f, 0x9f,
+ 0x9d, 0x7f, 0xa2, 0x1b, 0xa0, 0xd6, 0x92, 0xf4,
+ 0x56, 0xa, 0x8f, 0x79, 0x94, 0x96, 0x70, 0x1f,
+ 0x96, 0x6f, 0x66, 0x96, 0x74, 0x1b, 0x5a, 0x59,
+ 0x66, 0x3f, 0x1f, 0xad, 0xfb, 0x8e, 0x20, 0xa,
+ 0x7c, 0xd3, 0xf8, 0x25, 0xd3, 0xf7, 0x50, 0x77,
+ 0x12, 0xc5, 0xdc, 0x3a, 0xe3, 0xf7, 0xa5, 0xe5,
+ 0x13, 0xec, 0xc5, 0x16, 0xdd, 0xcc, 0x8d, 0x6,
+ 0x41, 0xbb, 0xd5, 0x85, 0xa1, 0x1b, 0xde, 0xf7,
+ 0x28, 0xc3, 0xf7, 0x6f, 0xf7, 0x29, 0x30, 0xf7,
+ 0xd, 0xfb, 0x20, 0x35, 0x63, 0x57, 0x79, 0x7f,
+ 0x1f, 0x89, 0xf7, 0x96, 0x33, 0x6, 0x13, 0xf4,
+ 0xdc, 0xfc, 0x5e, 0x15, 0xf4, 0xc3, 0xe8, 0xe6,
+ 0xe6, 0xbd, 0x37, 0xfb, 0x6, 0xfb, 0x22, 0x44,
+ 0x4e, 0x45, 0x5a, 0x5e, 0xaa, 0xb3, 0x70, 0x1e,
+ 0x7f, 0x9d, 0x7d, 0xa5, 0xe3, 0x1a, 0xe, 0xfc,
+ 0x31, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7,
+ 0x74, 0x78, 0x15, 0xd2, 0x6, 0xfb, 0x85, 0xf9,
+ 0x88, 0x5, 0x44, 0x6, 0xe, 0xfc, 0x43, 0xfb,
+ 0x50, 0x76, 0xfa, 0x46, 0x77, 0x1, 0xe9, 0xd4,
+ 0x3, 0xe9, 0xfb, 0x65, 0x15, 0xd4, 0xfa, 0x46,
+ 0x42, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5,
+ 0xf7, 0xee, 0xda, 0xf7, 0xed, 0xd5, 0x1, 0xf7,
+ 0x18, 0xd3, 0x3, 0xb5, 0xf7, 0x74, 0x15, 0xe4,
+ 0x89, 0x8b, 0x33, 0x8c, 0x2d, 0x8, 0xfb, 0x4c,
+ 0x8a, 0x9e, 0x57, 0xf7, 0x22, 0x1b, 0xd5, 0x7,
+ 0x33, 0x8d, 0x93, 0xf7, 0x2e, 0xf7, 0x6, 0x7a,
+ 0xd5, 0x40, 0xae, 0x1f, 0xe5, 0xbb, 0x8d, 0x8b,
+ 0xf7, 0x44, 0x1a, 0xe2, 0x89, 0xd5, 0xe3, 0x1e,
+ 0xd5, 0x7, 0xfb, 0x22, 0x79, 0x31, 0xfb, 0x25,
+ 0x1f, 0x8a, 0x2c, 0x8b, 0x34, 0x32, 0x89, 0x8,
+ 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5, 0xf7, 0xed,
+ 0xda, 0xf7, 0xee, 0xd5, 0x1, 0xf7, 0x15, 0xd3,
+ 0x3, 0xb5, 0xfb, 0xe, 0x15, 0x41, 0x7, 0xde,
+ 0xd7, 0x99, 0xf7, 0x33, 0x1f, 0x8c, 0xeb, 0x8d,
+ 0xf7, 0x28, 0xe3, 0x8d, 0x8, 0xda, 0x7, 0x33,
+ 0x8d, 0x88, 0xdb, 0xea, 0x1a, 0xf7, 0x29, 0x86,
+ 0xe9, 0xfb, 0x2e, 0x1e, 0x41, 0x7, 0xe2, 0x8b,
+ 0x73, 0xfb, 0x25, 0xfb, 0x7, 0x9a, 0x49, 0xd6,
+ 0x68, 0x1f, 0x31, 0x5b, 0x8b, 0x4d, 0xfb, 0x44,
+ 0x1a, 0x34, 0x79, 0x7f, 0x46, 0x1e, 0xe, 0x69,
+ 0xa, 0xca, 0xe3, 0x33, 0xf7, 0x4f, 0x13, 0xe0,
+ 0xf7, 0x2b, 0xfb, 0xf, 0x15, 0xf9, 0x98, 0x7,
+ 0x13, 0xd0, 0xee, 0xd4, 0xfb, 0x4f, 0xfe, 0x2a,
+ 0xf7, 0x4f, 0xd4, 0x6, 0xe, 0x69, 0xa, 0xa7,
+ 0xf7, 0x4f, 0x33, 0xe3, 0x13, 0xe0, 0xa7, 0xfb,
+ 0xf, 0x15, 0x42, 0xf7, 0x4f, 0xfa, 0x2a, 0xfb,
+ 0x4f, 0x42, 0x7, 0x13, 0xd0, 0xee, 0xfd, 0x98,
+ 0x6, 0xe, 0xfb, 0xfa, 0xf8, 0xe7, 0xcc, 0xd2,
+ 0x77, 0x1, 0x98, 0xf9, 0x6f, 0x15, 0x2c, 0xe3,
+ 0x62, 0xcd, 0xce, 0xe2, 0xb6, 0xe8, 0x1e, 0x4b,
+ 0x6, 0x6a, 0x84, 0x7e, 0x65, 0x45, 0x1b, 0x43,
+ 0x7d, 0xbf, 0x9e, 0x87, 0x1f, 0xe, 0xfc, 0x43,
+ 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xe9, 0xd4,
+ 0x3, 0xe9, 0xf8, 0x3f, 0x15, 0xd4, 0xf7, 0xca,
+ 0x42, 0x6, 0xfd, 0x88, 0x4, 0xd4, 0xf7, 0xc9,
+ 0x42, 0x6, 0xe, 0xfb, 0xe9, 0xf7, 0x5e, 0xf7,
+ 0xcf, 0x1, 0x9d, 0xf7, 0xcf, 0x3, 0x9d, 0xf7,
+ 0xfb, 0x15, 0x33, 0xd2, 0x46, 0xe1, 0xe1, 0xd3,
+ 0xd0, 0xe3, 0xe4, 0x43, 0xd0, 0x35, 0x35, 0x44,
+ 0x46, 0x32, 0x1e, 0xe, 0xfb, 0x53, 0x7c, 0xd3,
+ 0xf8, 0x29, 0xd7, 0x1, 0xbb, 0xe5, 0xf7, 0x9b,
+ 0xe0, 0x3, 0xf8, 0x24, 0xf7, 0x52, 0x15, 0x71,
+ 0x88, 0x7a, 0x20, 0xfb, 0x4, 0x1b, 0xfb, 0xf,
+ 0x7c, 0xf7, 0x18, 0xd0, 0xc8, 0x93, 0xf7, 0x23,
+ 0xf7, 0x1d, 0xc1, 0xc1, 0x6f, 0x40, 0x9d, 0x1f,
+ 0xe0, 0x98, 0x5, 0xf4, 0xfb, 0x8, 0xc8, 0x2c,
+ 0x24, 0xfb, 0x18, 0x4b, 0xfb, 0x6c, 0xfb, 0x1e,
+ 0xc4, 0xfb, 0x1b, 0xf7, 0x3f, 0xb7, 0xf7, 0x27,
+ 0x9e, 0xf7, 0x43, 0xa7, 0x1e, 0xe, 0x54, 0xa,
+ 0xf7, 0xc, 0xf8, 0xe5, 0x15, 0xeb, 0x6, 0xeb,
+ 0xf7, 0x21, 0x5, 0x31, 0x6, 0x57, 0x34, 0x50,
+ 0xe2, 0x5, 0x31, 0x6, 0xe, 0xfb, 0x53, 0xfb,
+ 0x60, 0x76, 0xf7, 0x5b, 0xd6, 0xf8, 0x32, 0xd6,
+ 0x1, 0xa9, 0xe4, 0x3, 0xf7, 0x67, 0x76, 0x15,
+ 0x7b, 0x3d, 0x5, 0x9b, 0xc0, 0x86, 0x69, 0x8d,
+ 0x1f, 0x78, 0x8c, 0x48, 0x84, 0x60, 0x1b, 0x89,
+ 0x4e, 0x5, 0xf7, 0x13, 0xcb, 0xb2, 0xbb, 0xc2,
+ 0x5d, 0xa0, 0x6a, 0x1f, 0x91, 0xaf, 0xda, 0x91,
+ 0xf1, 0xb6, 0xa2, 0xf7, 0x2a, 0x19, 0x36, 0x96,
+ 0x5, 0x71, 0x87, 0x7a, 0xfb, 0x1, 0xfb, 0x2,
+ 0x1b, 0xfb, 0x23, 0x8c, 0xf7, 0x3d, 0xad, 0xd9,
+ 0x9c, 0xf7, 0x19, 0xf7, 0x13, 0xc2, 0xba, 0x6d,
+ 0x3c, 0x9c, 0x1f, 0xe0, 0x9a, 0x5, 0xf7, 0x7,
+ 0x7c, 0x3a, 0xc1, 0xfb, 0x0, 0x1b, 0xfb, 0x43,
+ 0x51, 0xfb, 0x21, 0xfb, 0x25, 0xfb, 0x2c, 0xd0,
+ 0x27, 0xf7, 0x4, 0x76, 0x1f, 0xe, 0xfb, 0xfa,
+ 0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xeb,
+ 0xf2, 0x3, 0xf7, 0x1a, 0x16, 0x6a, 0x2c, 0x5,
+ 0xa5, 0xbe, 0x85, 0x6b, 0x58, 0x2c, 0x9a, 0x6a,
+ 0x91, 0x1f, 0x86, 0x52, 0x5, 0x87, 0xa1, 0x92,
+ 0x8a, 0xa1, 0x1b, 0xf7, 0x5, 0xbd, 0xb8, 0xba,
+ 0xb6, 0x64, 0xa3, 0x5f, 0x90, 0x1f, 0xa2, 0xc8,
+ 0x5, 0xe, 0x2d, 0x76, 0xf1, 0xd2, 0xf8, 0x25,
+ 0xd3, 0xe7, 0x77, 0x1, 0xbe, 0xe5, 0x3, 0xf7,
+ 0x4a, 0x95, 0x15, 0x69, 0xfb, 0x1, 0xc2, 0x7b,
+ 0xae, 0xf7, 0x0, 0x5, 0x88, 0x98, 0x98, 0x88,
+ 0xa2, 0x1b, 0xcd, 0xf7, 0x18, 0xad, 0xf7, 0x33,
+ 0xa7, 0x1f, 0x37, 0x95, 0x5, 0x2f, 0x7e, 0x45,
+ 0x63, 0x50, 0x1b, 0x7d, 0x84, 0x8d, 0x8d, 0x82,
+ 0x1f, 0xf7, 0x1, 0xf8, 0xa, 0xad, 0x6f, 0x93,
+ 0x68, 0x8f, 0x77, 0x19, 0xe1, 0x98, 0x84, 0xac,
+ 0x7d, 0xd4, 0x32, 0xb2, 0x19, 0xa5, 0xeb, 0x56,
+ 0x9b, 0x6f, 0x2b, 0x5, 0x8f, 0x6c, 0x7f, 0x8b,
+ 0x85, 0x1b, 0x52, 0xfb, 0x44, 0x6f, 0xfb, 0x8b,
+ 0xfb, 0x12, 0xc3, 0x37, 0xd6, 0x67, 0x1f, 0xa2,
+ 0xd7, 0x15, 0x56, 0xac, 0x80, 0xea, 0xb5, 0x1a,
+ 0xd5, 0xa1, 0xf7, 0x22, 0xf7, 0x2b, 0x7e, 0x1e,
+ 0xe, 0x54, 0xa, 0xa0, 0xf8, 0xe5, 0x15, 0xe9,
+ 0x6, 0xc1, 0xe2, 0xbc, 0x34, 0x5, 0xe9, 0x6,
+ 0x24, 0xf7, 0x21, 0x5, 0x34, 0x6, 0xe, 0xfc,
+ 0x31, 0x8b, 0xee, 0xf7, 0xd2, 0xee, 0x1, 0xe2,
+ 0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xee, 0x23, 0x6,
+ 0xf7, 0xd2, 0x4, 0xf3, 0xee, 0x23, 0x6, 0xe,
+ 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf7, 0x91, 0x77,
+ 0x1, 0xe3, 0xf1, 0x3, 0xe3, 0x8d, 0x15, 0xbe,
+ 0x6, 0x61, 0x85, 0x5a, 0x5d, 0x76, 0x1e, 0xa2,
+ 0x66, 0x5, 0xce, 0xa1, 0x98, 0xe8, 0xad, 0x1a,
+ 0xf3, 0x25, 0x7, 0xe, 0xb9, 0x78, 0xca, 0xed,
+ 0xc7, 0xf7, 0xce, 0xc3, 0xf1, 0xca, 0x1, 0x7d,
+ 0xcb, 0xf7, 0xa, 0xd1, 0xf8, 0x57, 0xca, 0x3,
+ 0xf8, 0x80, 0xf7, 0xbe, 0x15, 0x35, 0x75, 0x3e,
+ 0x81, 0x70, 0x1b, 0x46, 0x50, 0xbb, 0xf5, 0xd7,
+ 0xa9, 0xdf, 0xed, 0x9c, 0xd4, 0x8a, 0x40, 0xa9,
+ 0x1f, 0xc8, 0x99, 0x5, 0xdd, 0x72, 0x3e, 0xaf,
+ 0x3c, 0x1b, 0xfb, 0x14, 0x45, 0x37, 0xfb, 0x18,
+ 0xfb, 0x1c, 0xdc, 0x3d, 0xf7, 0x9, 0xdb, 0xe0,
+ 0xb6, 0xea, 0xa2, 0x1f, 0xfc, 0xcc, 0xd7, 0x15,
+ 0xfb, 0x65, 0xf7, 0x3c, 0xfb, 0x3a, 0xf7, 0x68,
+ 0xf7, 0x68, 0xf7, 0x42, 0xf7, 0x3b, 0xf7, 0x64,
+ 0xf7, 0x67, 0xfb, 0x44, 0xf7, 0x3e, 0xfb, 0x66,
+ 0xfb, 0x66, 0xfb, 0x3e, 0xfb, 0x3d, 0xfb, 0x68,
+ 0x1e, 0xcb, 0x16, 0xf7, 0x44, 0xf7, 0x1f, 0xf7,
+ 0x22, 0xf7, 0x45, 0xf7, 0x45, 0xf7, 0x26, 0xfb,
+ 0x22, 0xfb, 0x44, 0xfb, 0x42, 0xfb, 0x26, 0xfb,
+ 0x1e, 0xfb, 0x45, 0xfb, 0x45, 0xfb, 0x1f, 0xf7,
+ 0x1e, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76,
+ 0xae, 0xdf, 0xf7, 0x9e, 0xdf, 0xae, 0x77, 0x1,
+ 0xe1, 0xee, 0x15, 0xd2, 0xd2, 0x5, 0x71, 0xb2,
+ 0xb6, 0x81, 0xb2, 0x1b, 0xb1, 0xb7, 0x95, 0xa5,
+ 0xb2, 0x1f, 0xd2, 0x44, 0xc5, 0xc8, 0x44, 0xd0,
+ 0x5, 0xaa, 0xbd, 0x91, 0xb9, 0xa5, 0x1a, 0xa6,
+ 0x85, 0xb8, 0x6c, 0xbc, 0x1e, 0xd2, 0xd1, 0x51,
+ 0xc8, 0x44, 0x44, 0x5, 0xa5, 0x64, 0x5f, 0x95,
+ 0x65, 0x1b, 0x64, 0x60, 0x81, 0x71, 0x64, 0x1f,
+ 0x44, 0xd2, 0x51, 0x4e, 0xd2, 0x45, 0x5, 0x6c,
+ 0x5a, 0x85, 0x5e, 0x70, 0x1a, 0x71, 0x91, 0x5d,
+ 0xaa, 0x59, 0x1e, 0x44, 0x46, 0x5, 0xf7, 0xa,
+ 0xf7, 0x53, 0x15, 0xd4, 0xc5, 0xc7, 0xd5, 0xce,
+ 0xcc, 0x52, 0x3f, 0x41, 0x50, 0x50, 0x42, 0x41,
+ 0x51, 0xc6, 0xd5, 0x1e, 0xe, 0x7c, 0xd3, 0xf8,
+ 0x23, 0xd5, 0xf7, 0x50, 0x77, 0x1, 0xae, 0xe5,
+ 0xf7, 0xa7, 0xe3, 0x3, 0xf8, 0x35, 0x16, 0xdd,
+ 0xf9, 0x62, 0x33, 0xfb, 0x97, 0x89, 0x6, 0xb4,
+ 0x70, 0x4d, 0xa9, 0x4a, 0x1b, 0xfb, 0x16, 0x31,
+ 0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x3a, 0xec, 0x27,
+ 0xf7, 0xf, 0x9e, 0xe9, 0x8e, 0xd9, 0xbc, 0x1f,
+ 0xfb, 0xb8, 0xf7, 0x4d, 0x15, 0xb1, 0x89, 0xf7,
+ 0x3b, 0xf7, 0x18, 0xf6, 0xc4, 0x23, 0x26, 0xfb,
+ 0x46, 0xfb, 0x1c, 0x7b, 0x6f, 0x58, 0x3c, 0xaa,
+ 0xf7, 0x37, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+ 0xe0, 0xd9, 0xf7, 0x67, 0x77, 0x1, 0xf7, 0x7e,
+ 0xe3, 0x3, 0xf7, 0x7e, 0xfb, 0x33, 0x15, 0xe3,
+ 0xf8, 0xe0, 0x78, 0xa, 0xf7, 0x67, 0x33, 0xfb,
+ 0x67, 0xfb, 0x53, 0x3d, 0xf7, 0x53, 0x6, 0xe,
+ 0xfb, 0x1e, 0x76, 0xf7, 0x4c, 0xd9, 0xf7, 0xf5,
+ 0xd9, 0xf7, 0x4c, 0x77, 0x1, 0xf7, 0x7e, 0xe3,
+ 0x3, 0xb6, 0xa4, 0x15, 0xf7, 0x53, 0xfb, 0x4c,
+ 0xe3, 0xf7, 0x4c, 0x78, 0xa, 0xf7, 0xf5, 0x78,
+ 0xa, 0xf7, 0x4c, 0x33, 0xfb, 0x4c, 0xfb, 0x53,
+ 0x3d, 0xf7, 0x53, 0xfb, 0xf5, 0xfb, 0x53, 0x6,
+ 0xe, 0xfb, 0xb7, 0xf8, 0x2f, 0xc4, 0xf7, 0x46,
+ 0xc4, 0x1, 0xc1, 0xc5, 0xf7, 0x44, 0xc5, 0x3,
+ 0xc1, 0xf8, 0xc2, 0x15, 0x39, 0xcc, 0x4a, 0xdb,
+ 0xdc, 0xcd, 0xcc, 0xdd, 0xda, 0x4a, 0xcd, 0x39,
+ 0x3a, 0x4b, 0x4a, 0x3b, 0x1e, 0xc5, 0x16, 0xbb,
+ 0xb1, 0xb3, 0xbc, 0xbd, 0xb2, 0x63, 0x5b, 0x59,
+ 0x63, 0x63, 0x5a, 0x5b, 0x64, 0xb3, 0xbd, 0x1e,
+ 0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xb3,
+ 0xe5, 0xd4, 0xe5, 0x3, 0xb3, 0xf8, 0xf0, 0x15,
+ 0xe5, 0xf1, 0x31, 0x6, 0xf7, 0x37, 0x25, 0x15,
+ 0xe5, 0xf1, 0x31, 0x6, 0xe, 0x20, 0x78, 0xed,
+ 0xf7, 0x1e, 0xdd, 0xf7, 0x14, 0xec, 0x1, 0xf7,
+ 0x86, 0xef, 0x3, 0xb2, 0xf7, 0x6c, 0x15, 0xf8,
+ 0x8e, 0xdd, 0xfc, 0x8e, 0x6, 0xf7, 0x5f, 0xf7,
+ 0x15, 0x15, 0xef, 0xec, 0x27, 0x6, 0xfc, 0xb3,
+ 0x4, 0xef, 0xed, 0x27, 0x6, 0xe, 0x2d, 0x76,
+ 0xfa, 0xe, 0x77, 0x1, 0xbb, 0xe6, 0xf7, 0x5,
+ 0xc0, 0xf7, 0xf, 0xe7, 0x3, 0xab, 0xf7, 0x52,
+ 0x15, 0x98, 0xfb, 0x52, 0xf7, 0x2b, 0x7a, 0xc3,
+ 0x83, 0x8, 0x31, 0xc0, 0xe6, 0x7, 0xf7, 0x22,
+ 0x90, 0xd4, 0xee, 0xf5, 0x1a, 0xf7, 0x39, 0xfb,
+ 0x23, 0xb0, 0x43, 0x9b, 0x1e, 0xf7, 0x93, 0x7,
+ 0xa7, 0x85, 0xc6, 0x7e, 0x9b, 0x2a, 0xe9, 0x98,
+ 0x18, 0x78, 0xf7, 0x8, 0x3d, 0xc1, 0x27, 0x93,
+ 0x8, 0xb4, 0x56, 0x62, 0x7, 0x22, 0x86, 0x2d,
+ 0x4f, 0x86, 0xfb, 0x17, 0x88, 0x42, 0xda, 0xfb,
+ 0x13, 0xf7, 0x14, 0x83, 0x8, 0xfb, 0xad, 0x7,
+ 0x20, 0x96, 0x71, 0xf7, 0x9, 0x88, 0xa8, 0x8,
+ 0xf7, 0x1c, 0xf7, 0x65, 0x15, 0x26, 0xa8, 0x7f,
+ 0xc1, 0xb5, 0x1a, 0xbf, 0xac, 0xc2, 0xdb, 0x98,
+ 0x1e, 0xc0, 0xfc, 0xf7, 0x15, 0xf7, 0xa1, 0x7,
+ 0xcd, 0x76, 0xc4, 0x73, 0x36, 0x1a, 0x2d, 0x40,
+ 0x63, 0x5b, 0x86, 0x1e, 0xe, 0xfb, 0xfa, 0xf8,
+ 0xf0, 0xf1, 0x1, 0xf7, 0xd, 0xe6, 0x3, 0xf7,
+ 0xd, 0xf8, 0xf0, 0x15, 0xe6, 0xf1, 0x30, 0x6,
+ 0xe, 0xfc, 0x31, 0x68, 0xa, 0xea, 0xe3, 0x3,
+ 0xea, 0x16, 0xe3, 0xf8, 0x9f, 0x7a, 0xa, 0x7c,
+ 0xd3, 0xf7, 0x48, 0xd3, 0xf7, 0x2e, 0xd6, 0x1,
+ 0xc3, 0xe5, 0xf7, 0x91, 0xe5, 0x3, 0xf7, 0x16,
+ 0xf7, 0x81, 0x15, 0xf8, 0x16, 0x6, 0xf7, 0x9c,
+ 0xfb, 0x34, 0xb0, 0x41, 0xfb, 0x32, 0x37, 0xfb,
+ 0x11, 0xfb, 0x32, 0xfb, 0x34, 0xdc, 0xfb, 0x2,
+ 0xf7, 0x35, 0xf7, 0x14, 0xd8, 0xd4, 0xed, 0xa5,
+ 0x1e, 0x31, 0x96, 0x5, 0x6d, 0x80, 0x6c, 0x3b,
+ 0x28, 0x1b, 0x3d, 0x48, 0xc3, 0xf7, 0x10, 0x84,
+ 0x1f, 0x90, 0xd3, 0x15, 0xcf, 0x90, 0xb7, 0xe1,
+ 0xed, 0x1b, 0xe7, 0xbf, 0x3d, 0x3f, 0x1f, 0xe,
+ 0x4a, 0xa, 0xce, 0xf7, 0x1d, 0x1, 0xf8, 0x34,
+ 0xe5, 0x3, 0x3f, 0xa, 0xfb, 0x28, 0xfc, 0x85,
+ 0x29, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0x60, 0x77,
+ 0x1, 0xf8, 0x34, 0xe5, 0x3, 0x3a, 0xa, 0x31,
+ 0xfc, 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, 0xd7,
+ 0xef, 0x1, 0xf7, 0xae, 0x8b, 0xf7, 0x1a, 0xe5,
+ 0x3, 0x3e, 0xa, 0xfb, 0x4c, 0xfc, 0x69, 0x15,
+ 0xf8, 0x2, 0x6, 0xf7, 0x1c, 0x65, 0xd8, 0x56,
+ 0xb0, 0x1e, 0xb0, 0x56, 0x52, 0x91, 0x74, 0x1b,
+ 0xfb, 0x38, 0x4c, 0xfb, 0xa, 0xfb, 0x31, 0x86,
+ 0x1f, 0x2d, 0xa, 0x7b, 0x7c, 0x3a, 0x23, 0x1b,
+ 0x37, 0x5e, 0xc2, 0xf7, 0x11, 0x7e, 0x1f, 0x90,
+ 0xd3, 0x15, 0xcf, 0x96, 0xa2, 0xdc, 0xf2, 0x1b,
+ 0xec, 0xab, 0x42, 0x3f, 0x90, 0x1f, 0xe, 0x4a,
+ 0xa, 0xcf, 0xf7, 0x1c, 0x1, 0xf8, 0x34, 0xe5,
+ 0x3, 0xf7, 0x20, 0xf7, 0x81, 0x29, 0xa, 0xfb,
+ 0x2e, 0xf7, 0xb5, 0x4c, 0xa, 0x4a, 0xf7, 0x1c,
+ 0x59, 0xa, 0x78, 0xd2, 0xf7, 0xb2, 0xaf, 0x67,
+ 0xd1, 0xf7, 0x74, 0xd2, 0x12, 0xc1, 0xe7, 0xf7,
+ 0x9d, 0xe7, 0x13, 0xdc, 0xf7, 0x45, 0xf8, 0xa,
+ 0x15, 0x31, 0x5a, 0xfb, 0x10, 0x56, 0xfb, 0xc,
+ 0xe6, 0x2b, 0xf7, 0x28, 0xf7, 0x27, 0xe8, 0xeb,
+ 0xf7, 0x9, 0xed, 0x52, 0xc5, 0x3b, 0xa3, 0x1f,
+ 0x8d, 0x7, 0xab, 0x96, 0xd6, 0xb0, 0xec, 0x1a,
+ 0xe9, 0x3f, 0xe3, 0xfb, 0x1c, 0xfb, 0x18, 0x40,
+ 0x39, 0x29, 0x21, 0xd9, 0x6c, 0xaa, 0x81, 0x1e,
+ 0x7a, 0xf7, 0x2a, 0x15, 0xc2, 0xb6, 0xbe, 0xd4,
+ 0xcf, 0xbe, 0x5c, 0x4b, 0x1e, 0x13, 0xbc, 0x4c,
+ 0x58, 0x59, 0x48, 0x51, 0x50, 0xb3, 0xd9, 0x1e,
+ 0x6d, 0xfb, 0xde, 0x15, 0xd3, 0xbe, 0xd1, 0xe9,
+ 0xdb, 0xd1, 0x53, 0x33, 0x33, 0x48, 0x55, 0x3a,
+ 0x31, 0x52, 0xcc, 0xda, 0x1e, 0xe, 0xf7, 0xc9,
+ 0x8b, 0xf5, 0x1, 0xf7, 0x7, 0xef, 0xf7, 0x7d,
+ 0xef, 0xf7, 0x81, 0xef, 0x3, 0xf7, 0x7, 0x16,
+ 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe1, 0x21, 0x15,
+ 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe5, 0x21, 0x15,
+ 0xef, 0xf5, 0x27, 0x6, 0xe, 0xf7, 0xc9, 0xf7,
+ 0x84, 0xd4, 0x1, 0xf7, 0x84, 0x4, 0xfa, 0x7c,
+ 0xd4, 0xfe, 0x7c, 0x6, 0xe, 0xf7, 0x84, 0xd4,
+ 0x1, 0xf7, 0x84, 0x4, 0xf8, 0xc0, 0xd4, 0xfc,
+ 0xc0, 0x6, 0xe, 0x20, 0xf7, 0x7, 0xdb, 0xf7,
+ 0x7, 0xdb, 0x1, 0xb2, 0xf7, 0xca, 0x15, 0xf8,
+ 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xfb, 0xa7, 0x4,
+ 0xf8, 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xe, 0x7c,
+ 0xd5, 0xf8, 0x1d, 0xda, 0xf7, 0x62, 0x77, 0x1,
+ 0xae, 0xe6, 0xf7, 0xc5, 0xe6, 0x3, 0xf7, 0x41,
+ 0xf8, 0xc0, 0x15, 0xf7, 0xc, 0xc4, 0xb0, 0x61,
+ 0x97, 0x76, 0xa1, 0x5f, 0x19, 0x98, 0x6f, 0x6b,
+ 0x97, 0x59, 0x1b, 0x30, 0xfb, 0x14, 0x50, 0xfb,
+ 0x6c, 0xfb, 0x71, 0xf7, 0x15, 0x59, 0xea, 0xf7,
+ 0x27, 0xf7, 0x8, 0xf4, 0xf7, 0x3a, 0xf7, 0x27,
+ 0x4e, 0xf7, 0x12, 0x29, 0xf7, 0x8, 0x1f, 0xe4,
+ 0xb6, 0x72, 0xbc, 0x21, 0x58, 0x75, 0xa0, 0x83,
+ 0x90, 0x6b, 0xa4, 0x19, 0xfb, 0x0, 0x6, 0xb6,
+ 0x6d, 0x9d, 0x7f, 0xb5, 0x62, 0x20, 0x5a, 0x18,
+ 0x76, 0xfb, 0xf1, 0x15, 0xf7, 0x21, 0xd3, 0xc2,
+ 0xc9, 0xea, 0xd7, 0x64, 0xfb, 0x31, 0xfb, 0x30,
+ 0x22, 0x62, 0x48, 0x6b, 0x26, 0x99, 0xf7, 0x4b,
+ 0x1e, 0xe, 0xfc, 0x31, 0x8b, 0xef, 0xf7, 0x88,
+ 0xef, 0xf7, 0xa6, 0x77, 0xb7, 0x77, 0x1, 0xe5,
+ 0xec, 0x35, 0xd7, 0x3, 0xe5, 0x16, 0xec, 0xef,
+ 0x2a, 0x6, 0xa2, 0xdb, 0x15, 0xc1, 0x6, 0x9f,
+ 0xf8, 0xf, 0x5, 0xf7, 0x33, 0x2a, 0xfb, 0x33,
+ 0x7, 0xe, 0xfb, 0xfa, 0xfb, 0x42, 0x76, 0xf8,
+ 0xfe, 0xef, 0x1, 0xf7, 0xa, 0xec, 0x33, 0xd8,
+ 0x3, 0xf7, 0xa, 0xf8, 0x3b, 0x15, 0xec, 0xef,
+ 0x2a, 0x6, 0xfc, 0xc6, 0x4, 0xfb, 0x30, 0xec,
+ 0xf7, 0x30, 0x7, 0x75, 0xf8, 0xf, 0x5, 0x53,
+ 0x6, 0xe, 0x4b, 0xa, 0xf8, 0x56, 0xcf, 0xf7,
+ 0x66, 0x77, 0x1, 0xd7, 0xe3, 0x3, 0xd7, 0x16,
+ 0xe3, 0xf8, 0x56, 0xed, 0xcf, 0x29, 0xbc, 0x6,
+ 0xc2, 0xa7, 0xb4, 0xc3, 0x76, 0x1e, 0x98, 0xd8,
+ 0x5, 0x8b, 0x72, 0x94, 0x7a, 0xfb, 0x23, 0x8b,
+ 0xfb, 0x3, 0x59, 0x1e, 0x5a, 0x4d, 0x47, 0xc9,
+ 0x7, 0xe, 0x5b, 0xa, 0xf7, 0x3d, 0x3b, 0xa,
+ 0xf7, 0x95, 0xfc, 0x56, 0x15, 0xe3, 0xf8, 0x9a,
+ 0x33, 0x6, 0xed, 0x4, 0x6d, 0xa, 0x78, 0xd2,
+ 0xf7, 0xe0, 0xd8, 0xf7, 0x3f, 0xdf, 0x12, 0xf8,
+ 0x2a, 0xeb, 0x17, 0xab, 0xf7, 0x46, 0x15, 0xfb,
+ 0x2e, 0x99, 0xf7, 0x16, 0x60, 0xe5, 0x1b, 0xf7,
+ 0x36, 0xe1, 0xf7, 0x9, 0xf7, 0x13, 0xf7, 0x2f,
+ 0xfb, 0x25, 0xdc, 0x23, 0x59, 0x61, 0x78, 0x72,
+ 0x74, 0x1f, 0xb3, 0xf7, 0x4f, 0x5, 0xf7, 0xb6,
+ 0xdf, 0xfb, 0xfd, 0x6, 0x43, 0xfb, 0xfe, 0xe0,
+ 0x81, 0x5, 0xb1, 0xa3, 0xba, 0xa9, 0xc8, 0x1b,
+ 0xdf, 0xd1, 0x56, 0x21, 0x30, 0x54, 0x39, 0x2a,
+ 0x1f, 0x6f, 0x2f, 0x92, 0xf7, 0x12, 0x77, 0x1f,
+ 0xe, 0x5b, 0xa, 0xf7, 0x3b, 0x3b, 0xa, 0xf7,
+ 0x93, 0xfc, 0x56, 0x15, 0xe3, 0xf9, 0x58, 0x7a,
+ 0xa, 0xfb, 0x4e, 0x76, 0xf9, 0x22, 0xcf, 0xf7,
+ 0x20, 0xdd, 0x1, 0x90, 0xfb, 0xb, 0x15, 0x7b,
+ 0x3f, 0x5, 0x7f, 0xca, 0xa0, 0x8b, 0x92, 0x1b,
+ 0xda, 0xbe, 0xb3, 0xe2, 0x9a, 0x1f, 0xe9, 0xf8,
+ 0xa3, 0x5, 0xef, 0x6, 0x97, 0xcf, 0x5, 0x27,
+ 0x6, 0x98, 0xc8, 0x5, 0xbf, 0x95, 0x94, 0xa6,
+ 0xba, 0x1b, 0xa0, 0x9c, 0x87, 0x83, 0xaf, 0x1f,
+ 0x9c, 0xd6, 0x5, 0x95, 0x68, 0x7a, 0x94, 0x64,
+ 0x1b, 0xfb, 0x4, 0x6c, 0x27, 0x4e, 0x7e, 0x1f,
+ 0x7f, 0x4e, 0x5, 0x28, 0x6, 0x80, 0x47, 0x5,
+ 0xed, 0x6, 0x33, 0xfc, 0x8a, 0x5, 0x5f, 0x84,
+ 0x73, 0x6c, 0x6c, 0x1b, 0x7b, 0x76, 0x8e, 0x93,
+ 0x65, 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x3d, 0xda,
+ 0xf8, 0x5b, 0x77, 0x1, 0xf7, 0xb3, 0xe3, 0x3,
+ 0xa4, 0xf7, 0x3d, 0x15, 0xf7, 0xcd, 0xfb, 0x3d,
+ 0xe3, 0xf7, 0x3d, 0xec, 0xda, 0x2a, 0xf8, 0x5b,
+ 0x43, 0x6, 0xfb, 0xdd, 0xfc, 0x5b, 0x5, 0xe2,
+ 0x16, 0xf7, 0x73, 0xf7, 0xd3, 0x5, 0x8e, 0xfb,
+ 0xd3, 0x6, 0xe, 0xfc, 0xa0, 0x8d, 0x76, 0xf9,
+ 0x66, 0x77, 0x1, 0x32, 0x78, 0x15, 0xf8, 0x3a,
+ 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xfc, 0x3b, 0xfd,
+ 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd4, 0xf7, 0x1c,
+ 0xd3, 0xf8, 0x29, 0xd3, 0x12, 0xcb, 0xe5, 0xf7,
+ 0x94, 0xe4, 0x39, 0xdd, 0x13, 0xf8, 0xc9, 0x55,
+ 0x15, 0xfb, 0x28, 0x87, 0xf7, 0x23, 0x79, 0xcc,
+ 0x1b, 0xf7, 0x47, 0xc1, 0xf7, 0x2, 0xf7, 0x3d,
+ 0x1f, 0xf8, 0x66, 0x3a, 0x4d, 0x89, 0x7, 0xd2,
+ 0x54, 0x49, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x4b,
+ 0xfb, 0x34, 0xfb, 0x12, 0xfb, 0x20, 0xdc, 0xfb,
+ 0xf, 0xf7, 0x25, 0x1f, 0x13, 0xb8, 0xb4, 0xc1,
+ 0x95, 0xc5, 0xbc, 0x1f, 0x24, 0x8e, 0x26, 0xfb,
+ 0x27, 0x24, 0x7f, 0xc0, 0xa6, 0x87, 0x1e, 0x7a,
+ 0xf7, 0xd3, 0x15, 0xf7, 0x11, 0xc5, 0xe4, 0xd9,
+ 0x1e, 0x13, 0xf4, 0xc8, 0xe5, 0x49, 0xfb, 0x28,
+ 0x2c, 0x67, 0x2b, 0xfb, 0x7, 0x26, 0x68, 0xf7,
+ 0x15, 0xc9, 0x1f, 0xe, 0x3b, 0x7c, 0xd3, 0xf8,
+ 0xeb, 0xd3, 0x12, 0xce, 0xe3, 0xf7, 0x22, 0xe5,
+ 0x80, 0xe0, 0x9f, 0xe5, 0x13, 0xec, 0xce, 0x16,
+ 0xe3, 0xf8, 0x7e, 0x6, 0xce, 0x93, 0xee, 0xf7,
+ 0x7, 0xc3, 0xb5, 0x6a, 0x5f, 0x1e, 0x13, 0xf4,
+ 0x57, 0x3c, 0x30, 0x4e, 0x44, 0xf7, 0x4c, 0x38,
+ 0x3c, 0x1a, 0x5d, 0x62, 0x64, 0x5a, 0x6e, 0x69,
+ 0x97, 0xd0, 0x66, 0x1e, 0x3f, 0x67, 0x5, 0x67,
+ 0x9c, 0xbf, 0x3a, 0xf7, 0x1, 0x1b, 0xf7, 0x0,
+ 0xd1, 0xd2, 0xe1, 0x1f, 0xf7, 0x14, 0xfb, 0x4c,
+ 0xc0, 0xbf, 0x1a, 0x13, 0xec, 0xc2, 0xd5, 0xe9,
+ 0xc2, 0x1a, 0xd2, 0x4b, 0xd9, 0xfb, 0x9, 0xfb,
+ 0x21, 0x43, 0x35, 0xfb, 0x2c, 0x1e, 0xe, 0xfb,
+ 0xfa, 0xf8, 0xf8, 0x76, 0xf7, 0x25, 0x77, 0x1,
+ 0xf7, 0x29, 0xf8, 0xe5, 0x15, 0xc9, 0x6, 0x2f,
+ 0xf7, 0x21, 0x5, 0x22, 0x6, 0xe, 0x71, 0xa,
+ 0x96, 0x15, 0xf8, 0x7c, 0xf7, 0x5c, 0x5, 0xdd,
+ 0x7, 0xfc, 0x7c, 0xf7, 0x5e, 0x5, 0x34, 0x7,
+ 0xf8, 0x1a, 0xfb, 0x30, 0xfc, 0x1a, 0xfb, 0x2e,
+ 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0x93, 0xf7,
+ 0x16, 0x15, 0xd9, 0x6, 0xfb, 0xc, 0xf7, 0x5e,
+ 0xf7, 0xc, 0xf7, 0x5f, 0x5, 0x3d, 0x6, 0xfb,
+ 0x27, 0xfb, 0x5f, 0x5, 0xf7, 0xd1, 0xfb, 0x5e,
+ 0x15, 0xdb, 0x6, 0xfb, 0xe, 0xf7, 0x5e, 0xf7,
+ 0xe, 0xf7, 0x5f, 0x5, 0x3b, 0x6, 0xfb, 0x27,
+ 0xfb, 0x5f, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7,
+ 0xa9, 0xf7, 0x16, 0x15, 0xdc, 0x6, 0xf7, 0x27,
+ 0xf7, 0x5e, 0xfb, 0x27, 0xf7, 0x5f, 0x5, 0x3a,
+ 0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xfb, 0xb7,
+ 0xfb, 0x5e, 0x15, 0xda, 0x6, 0xf7, 0x28, 0xf7,
+ 0x5e, 0xfb, 0x28, 0xf7, 0x5f, 0x5, 0x3c, 0x6,
+ 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xfa,
+ 0x52, 0xa, 0xf7, 0x6b, 0xf7, 0x16, 0x15, 0xc1,
+ 0x6, 0x36, 0xf7, 0x5e, 0xe0, 0xf7, 0x5f, 0x5,
+ 0x55, 0x6, 0xfb, 0xa, 0xfb, 0x5f, 0x5, 0xe,
+ 0xfb, 0xd9, 0x52, 0xa, 0xec, 0xf7, 0x16, 0x15,
+ 0xc3, 0x6, 0xf7, 0x8, 0xf7, 0x60, 0xfb, 0x8,
+ 0xf7, 0x5d, 0x5, 0x53, 0x6, 0xe2, 0xfb, 0x5d,
+ 0x5, 0xe, 0xa0, 0x76, 0xf8, 0x5a, 0xd7, 0xf7,
+ 0x50, 0x77, 0x1, 0xcc, 0xe3, 0xf7, 0x8e, 0xe3,
+ 0x3, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xdd,
+ 0xb2, 0xe4, 0xf4, 0xf7, 0x1, 0x88, 0x2a, 0x6d,
+ 0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xdb, 0x7, 0xf7,
+ 0x8, 0x49, 0xe2, 0xfb, 0x14, 0x66, 0x59, 0x85,
+ 0x4a, 0x52, 0x1e, 0xf7, 0x97, 0x33, 0x7, 0xe,
+ 0xfb, 0xfa, 0xf8, 0xe5, 0xf7, 0x21, 0x1, 0xf7,
+ 0x58, 0xf8, 0xe5, 0x60, 0xa, 0xfb, 0x9b, 0xfb,
+ 0x21, 0x60, 0xa, 0xe, 0xfb, 0xfa, 0xf7, 0x7c,
+ 0xe5, 0x1, 0xb7, 0xf7, 0x7c, 0x15, 0xf7, 0x89,
+ 0xe5, 0xfb, 0x89, 0x6, 0xe, 0xfc, 0x69, 0xa0,
+ 0x76, 0xf9, 0x1, 0xec, 0x1, 0xf7, 0x24, 0xe3,
+ 0x3, 0xce, 0x16, 0xe3, 0xf8, 0x98, 0x33, 0x6,
+ 0xf4, 0x4, 0x6d, 0xa, 0x62, 0xa, 0xcc, 0xf8,
+ 0xe3, 0x15, 0xd2, 0x6, 0xf7, 0x12, 0xf7, 0x23,
+ 0x38, 0xa, 0x57, 0x50, 0xa, 0x4b, 0xa, 0xf8,
+ 0xe9, 0xf7, 0x1d, 0x1, 0xea, 0xe3, 0x3, 0x85,
+ 0xf8, 0xe9, 0x15, 0xee, 0x6, 0xbb, 0xde, 0xb6,
+ 0x38, 0x5, 0xf0, 0x6, 0x26, 0x42, 0xa, 0x8f,
+ 0x50, 0xa, 0x4b, 0xa, 0xf8, 0xf2, 0xef, 0x12,
+ 0x98, 0xe5, 0x83, 0xe3, 0x84, 0xe5, 0x13, 0xd0,
+ 0xea, 0x16, 0xe3, 0xf8, 0x99, 0x33, 0x6, 0x13,
+ 0xe8, 0x39, 0xe4, 0x58, 0xa, 0x62, 0xa, 0xf7,
+ 0x17, 0xf8, 0xea, 0x15, 0xd4, 0x6, 0x39, 0xf7,
+ 0x1c, 0x38, 0xa, 0xe3, 0x50, 0xa, 0xfc, 0x69,
+ 0xfb, 0x51, 0x76, 0xf9, 0xd3, 0xec, 0x1, 0xce,
+ 0xe3, 0x3, 0x8c, 0xfb, 0x12, 0x15, 0x7a, 0x40,
+ 0x5, 0x85, 0xa2, 0x9e, 0x88, 0x9c, 0x1b, 0xdc,
+ 0xaa, 0xc7, 0xf7, 0xe, 0x1f, 0xf8, 0xb5, 0x33,
+ 0xfc, 0xb5, 0x7, 0x2d, 0x72, 0x7d, 0x62, 0x95,
+ 0x1e, 0xcd, 0xf9, 0x7f, 0x15, 0x6d, 0xa, 0xfb,
+ 0x53, 0x44, 0xa, 0xf7, 0x62, 0x6, 0xca, 0xc6,
+ 0xf7, 0x43, 0xfb, 0x9d, 0x5, 0xf7, 0x0, 0x6,
+ 0xfb, 0x71, 0xf7, 0xda, 0xf7, 0x5a, 0xf7, 0x54,
+ 0x5, 0xfb, 0x6, 0x6, 0xfb, 0x65, 0xfb, 0x66,
+ 0x5, 0xf8, 0x2e, 0x33, 0x7, 0xe, 0xfc, 0x69,
+ 0x44, 0xa, 0xf9, 0x62, 0x7a, 0xa, 0x71, 0xa,
+ 0xf7, 0x69, 0x15, 0xf8, 0x7c, 0xfb, 0x5e, 0x5,
+ 0xe2, 0x7, 0xfc, 0x1a, 0xf7, 0x30, 0xf8, 0x1a,
+ 0xf7, 0x2e, 0x5, 0xe2, 0x7, 0xfc, 0x7c, 0xfb,
+ 0x5c, 0x5, 0xe, 0x20, 0xf7, 0x15, 0x76, 0x1,
+ 0xb2, 0xf7, 0xc8, 0x15, 0xf8, 0x27, 0xfb, 0x5c,
+ 0xde, 0xf7, 0xae, 0xfc, 0x7a, 0x6, 0xe, 0xfc,
+ 0x69, 0x44, 0xa, 0xf7, 0xf9, 0x6, 0xe2, 0xd6,
+ 0x5, 0xd8, 0x7, 0x34, 0x40, 0x5, 0xf7, 0xb0,
+ 0x33, 0xfb, 0xfb, 0x7, 0x34, 0x43, 0x5, 0x3e,
+ 0x7, 0xe2, 0xd3, 0x5, 0xe, 0xf7, 0x22, 0x6f,
+ 0xa, 0xf7, 0x70, 0xe3, 0xf7, 0x70, 0xe3, 0x17,
+ 0xcc, 0x16, 0xe3, 0xf7, 0xa1, 0x6, 0xcc, 0x9c,
+ 0xf7, 0x14, 0xf7, 0x2, 0xe1, 0x92, 0x3f, 0x5a,
+ 0x1e, 0xfb, 0xe5, 0xe3, 0xf7, 0xc1, 0x7, 0xdc,
+ 0xb2, 0xdb, 0xe3, 0xe8, 0x8b, 0x36, 0x59, 0x1e,
+ 0xfb, 0xdb, 0xe3, 0xf7, 0xf3, 0x7, 0xb0, 0x76,
+ 0xf7, 0x2a, 0xfb, 0x34, 0x2a, 0x72, 0x4c, 0x6f,
+ 0x79, 0x1e, 0xc7, 0x76, 0x42, 0xaa, 0x41, 0x1b,
+ 0x40, 0x6c, 0x5e, 0x5d, 0x6f, 0x1f, 0x13, 0xf8,
+ 0x89, 0x8a, 0x5, 0xd3, 0x3c, 0x7, 0xe, 0xfb,
+ 0xfa, 0xf9, 0x7, 0xc4, 0x1, 0x95, 0xf9, 0x7,
+ 0x15, 0xf7, 0xcd, 0xc4, 0xfb, 0xcd, 0x6, 0xe,
+ 0x20, 0xb2, 0xf7, 0x6c, 0x15, 0xf8, 0x8e, 0xd4,
+ 0xfc, 0x8e, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x57, 0xda, 0x48, 0xce, 0xf8, 0x5c, 0x77, 0x4e,
+ 0xa, 0x13, 0xdc, 0xf7, 0x33, 0xbf, 0x15, 0x6f,
+ 0x9f, 0xa8, 0x67, 0xd4, 0x1b, 0xdd, 0xa9, 0xb9,
+ 0xa6, 0x9b, 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4e,
+ 0xd9, 0xf8, 0x9f, 0x33, 0xfb, 0x75, 0x7, 0xfb,
+ 0x10, 0x8a, 0x20, 0xfb, 0xb, 0xfb, 0x11, 0x8b,
+ 0xf7, 0xf, 0xf7, 0x1, 0x1e, 0xf7, 0x74, 0x33,
+ 0xfd, 0x6e, 0xe4, 0xf7, 0x97, 0x7, 0xe, 0x20,
+ 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1, 0xb3, 0xd1,
+ 0xf8, 0x1, 0xd0, 0x3, 0xb2, 0xd1, 0x15, 0xd1,
+ 0x45, 0xf7, 0x4c, 0xf7, 0x4b, 0xf7, 0x4a, 0xfb,
+ 0x4b, 0xd1, 0xd2, 0xfb, 0x49, 0xf7, 0x4a, 0xf7,
+ 0x48, 0xf7, 0x49, 0x46, 0xd2, 0xfb, 0x49, 0xfb,
+ 0x4c, 0xfb, 0x4c, 0xf7, 0x4d, 0x45, 0x43, 0xf7,
+ 0x4a, 0xfb, 0x4a, 0x5, 0xe, 0x6f, 0xa, 0xf7,
+ 0x8e, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xaf,
+ 0x6, 0xe0, 0xac, 0xe9, 0xf7, 0x0, 0xf7, 0x0,
+ 0x8c, 0x25, 0x5e, 0x1e, 0xfb, 0xcf, 0xe3, 0xf7,
+ 0xcf, 0x7, 0xf7, 0xe, 0x4a, 0xf0, 0xfb, 0x18,
+ 0x68, 0x4d, 0x7c, 0x3d, 0x58, 0x1e, 0x13, 0xf0,
+ 0x89, 0xd4, 0x3c, 0x6, 0xe, 0x78, 0xd2, 0xf7,
+ 0x47, 0xd7, 0xf7, 0xdd, 0xd4, 0x1, 0xc6, 0xe5,
+ 0xf7, 0x9d, 0xec, 0x3, 0xc2, 0xf7, 0x30, 0x15,
+ 0xfb, 0x3b, 0xa0, 0xf7, 0x30, 0x83, 0xb2, 0x1b,
+ 0xf7, 0x86, 0x8c, 0xf7, 0xc0, 0xd9, 0xf7, 0x61,
+ 0x4e, 0xf7, 0x1f, 0xfb, 0x4a, 0xfb, 0x18, 0x2a,
+ 0x23, 0xfb, 0x20, 0xfb, 0x27, 0xf7, 0xb, 0x3a,
+ 0xf7, 0x2, 0xe0, 0xb8, 0xc0, 0xb3, 0xa3, 0x1f,
+ 0x8d, 0x6, 0x47, 0x8c, 0x88, 0xfb, 0x60, 0xfb,
+ 0x2e, 0x1b, 0x29, 0x6e, 0xdf, 0xa6, 0x86, 0x1f,
+ 0x84, 0xf7, 0xbc, 0x15, 0xe7, 0xc2, 0xda, 0xdf,
+ 0xde, 0xca, 0x39, 0x32, 0x38, 0x56, 0x46, 0x2e,
+ 0x3d, 0x4e, 0xc6, 0xe8, 0x1e, 0xe, 0xa0, 0x76,
+ 0xf8, 0x5a, 0xd7, 0xdc, 0x75, 0xa, 0xcc, 0xe3,
+ 0xf7, 0x8e, 0xe3, 0x13, 0xec, 0xcc, 0x16, 0xe3,
+ 0xf7, 0xc2, 0x6, 0xdf, 0xac, 0xcf, 0xf7, 0x0,
+ 0xf7, 0x0, 0x8c, 0x20, 0x5e, 0x1e, 0xfb, 0xc2,
+ 0xe3, 0xf7, 0xc2, 0x7, 0xf7, 0x19, 0x52, 0xea,
+ 0xfb, 0x20, 0x68, 0x4d, 0x83, 0x3e, 0x58, 0x1e,
+ 0x89, 0xd4, 0x3c, 0x6, 0xbd, 0xe8, 0x15, 0xcc,
+ 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9f, 0xa4, 0x7f,
+ 0x7f, 0xa3, 0x1e, 0x80, 0xa2, 0x9f, 0x80, 0x9c,
+ 0x1b, 0xa1, 0xd0, 0x90, 0xf6, 0x90, 0x1f, 0x4b,
+ 0x6, 0x13, 0xdc, 0x68, 0x87, 0x80, 0x84, 0x77,
+ 0x1b, 0x86, 0x78, 0x95, 0x96, 0x70, 0x1f, 0x13,
+ 0xec, 0x96, 0x72, 0x6d, 0x94, 0x74, 0x1b, 0x5a,
+ 0x59, 0x68, 0x3e, 0x1f, 0xe, 0xa0, 0x76, 0xf7,
+ 0x55, 0xcb, 0xf7, 0x3a, 0xce, 0xf7, 0x5a, 0x77,
+ 0x1, 0xa7, 0xf8, 0x89, 0x3, 0xcb, 0x16, 0xd0,
+ 0x6, 0xb3, 0xf7, 0x55, 0x5, 0xf7, 0x25, 0x6,
+ 0x62, 0xfb, 0x55, 0x5, 0xd1, 0x6, 0xb3, 0xf7,
+ 0x55, 0x5, 0xf7, 0x22, 0xcb, 0xfb, 0x14, 0x6,
+ 0xad, 0xf7, 0x3a, 0x5, 0xe9, 0xce, 0x3b, 0x6,
+ 0xb2, 0xf7, 0x5a, 0x5, 0x47, 0x6, 0x62, 0xfb,
+ 0x5a, 0x5, 0xfb, 0x24, 0x6, 0xb3, 0xf7, 0x5a,
+ 0x5, 0x46, 0x6, 0x62, 0xfb, 0x5a, 0x5, 0xfb,
+ 0x1d, 0x48, 0xf7, 0x10, 0x6, 0x68, 0xfb, 0x3a,
+ 0x5, 0x32, 0x4b, 0xd7, 0x6, 0xd9, 0xcb, 0x15,
+ 0xae, 0xf7, 0x3b, 0x5, 0xf7, 0x2e, 0x6, 0x67,
+ 0xfb, 0x3b, 0x5, 0xe, 0x7d, 0xd3, 0xf8, 0x2c,
+ 0xd3, 0x1, 0xbb, 0xe5, 0xf7, 0xa8, 0xe5, 0x3,
+ 0xae, 0xf7, 0xa0, 0x15, 0xfb, 0x2e, 0xd1, 0xfb,
+ 0x14, 0xf7, 0x41, 0xf7, 0x30, 0xe2, 0xf1, 0xf7,
+ 0x48, 0xf7, 0x5a, 0xfb, 0x1a, 0xd3, 0xfb, 0x1,
+ 0xfb, 0x3c, 0x40, 0xfb, 0x13, 0xfb, 0x23, 0x1e,
+ 0xe5, 0x16, 0xf7, 0x3c, 0xed, 0xa9, 0xc2, 0xda,
+ 0xd5, 0x4f, 0xfb, 0x1e, 0x39, 0x6f, 0xfb, 0x14,
+ 0xfb, 0x11, 0x57, 0x26, 0xb4, 0xf7, 0x3d, 0x1e,
+ 0xe, 0x76, 0xa, 0xc8, 0xf7, 0x1d, 0x1, 0x77,
+ 0xa, 0x3, 0x3f, 0xa, 0xfb, 0x87, 0xfc, 0x6a,
+ 0x23, 0xa, 0xe, 0x76, 0xa, 0xf7, 0x5a, 0x77,
+ 0x1, 0x77, 0xa, 0x3, 0x3a, 0xa, 0xfb, 0x4d,
+ 0xfc, 0x6a, 0x23, 0xa, 0xe, 0x7d, 0xd3, 0xf8,
+ 0x34, 0xd3, 0xc7, 0xef, 0x1, 0x77, 0xa, 0x3,
+ 0x3e, 0xa, 0xfb, 0xab, 0xfc, 0x4e, 0x23, 0xa,
+ 0xe, 0xf7, 0x91, 0x7c, 0xd4, 0xf7, 0x46, 0xd3,
+ 0xf7, 0x32, 0xd3, 0x1, 0xae, 0xe5, 0xf7, 0xc8,
+ 0xe7, 0xf7, 0xb1, 0xe7, 0x3, 0xf8, 0x6f, 0xde,
+ 0x15, 0x3d, 0xbf, 0xd4, 0x77, 0xca, 0x1b, 0xc8,
+ 0xf7, 0x18, 0x9f, 0xf7, 0x2b, 0xb3, 0x1f, 0x3c,
+ 0x98, 0x5, 0x77, 0x85, 0x5e, 0x30, 0x24, 0x1b,
+ 0x2e, 0x5c, 0xd8, 0xf0, 0x8a, 0x1f, 0xf8, 0x10,
+ 0x6, 0xf7, 0xaa, 0xfb, 0x41, 0xa3, 0x49, 0x3d,
+ 0x49, 0x68, 0x4b, 0x5f, 0x1e, 0xc8, 0x61, 0x5a,
+ 0xb1, 0x21, 0x1b, 0xfb, 0xd, 0xfb, 0xe, 0x2c,
+ 0xfb, 0x49, 0xfb, 0x47, 0xf7, 0x1, 0x29, 0xf7,
+ 0x1a, 0xa9, 0xea, 0x8e, 0xea, 0xd3, 0x1f, 0xfb,
+ 0xf2, 0xf7, 0x47, 0x15, 0xf6, 0xc7, 0xec, 0xe8,
+ 0xe0, 0xd1, 0x3c, 0xfb, 0x11, 0xfb, 0x1d, 0x3e,
+ 0x48, 0x3d, 0x63, 0xfb, 0x5, 0xa2, 0xf7, 0x49,
+ 0x1e, 0xf8, 0x24, 0xb9, 0x15, 0xf7, 0x4, 0x94,
+ 0xcf, 0xb5, 0xc8, 0x1b, 0xd7, 0xc8, 0x61, 0xfb,
+ 0x4, 0x95, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, 0x75,
+ 0xc7, 0xf7, 0x39, 0x77, 0x1, 0xd4, 0xc9, 0xc9,
+ 0xe5, 0x3, 0xe8, 0x16, 0x7a, 0x4f, 0x88, 0x6e,
+ 0x76, 0x1a, 0x3d, 0xc1, 0x66, 0xc6, 0xae, 0xb0,
+ 0x97, 0x9d, 0xa8, 0x1e, 0xc2, 0x7, 0x78, 0x6d,
+ 0x6a, 0x85, 0x70, 0x1b, 0x67, 0x71, 0xa1, 0xba,
+ 0x91, 0x88, 0xb9, 0x9e, 0xb7, 0x1f, 0xe, 0x76,
+ 0xa, 0xca, 0xf7, 0x1b, 0x1, 0x77, 0xa, 0x3,
+ 0xb8, 0xf7, 0x9c, 0x23, 0xa, 0xf7, 0x13, 0xf7,
+ 0xe3, 0x4c, 0xa, 0x4a, 0xf7, 0x1b, 0x59, 0xa,
+ 0xa0, 0x76, 0xf8, 0xbe, 0xf7, 0x33, 0x1, 0xf7,
+ 0xa3, 0xe3, 0x3, 0xf7, 0xa3, 0x16, 0xe3, 0xf9,
+ 0x53, 0x48, 0x6, 0x67, 0x42, 0x44, 0x47, 0x37,
+ 0x64, 0x8, 0x36, 0x7, 0xab, 0x97, 0xdd, 0xb3,
+ 0xc3, 0xc1, 0x8, 0xe, 0xf7, 0x23, 0x81, 0xc3,
+ 0x5f, 0x76, 0xf7, 0xc6, 0xc3, 0xf7, 0xfb, 0x77,
+ 0xa0, 0x77, 0x12, 0xf7, 0x2a, 0xd1, 0xf8, 0x6f,
+ 0xd7, 0x13, 0x76, 0xf7, 0x2a, 0xf7, 0xf1, 0x15,
+ 0xd1, 0xf7, 0xf5, 0x57, 0x6, 0x68, 0x60, 0x53,
+ 0x69, 0x69, 0x80, 0x8, 0x51, 0x7, 0xb0, 0x94,
+ 0xb4, 0xa0, 0xa8, 0xa3, 0x8, 0x50, 0xfd, 0x9,
+ 0x15, 0xd7, 0x6, 0x13, 0x6e, 0xf8, 0xa3, 0xf9,
+ 0x66, 0x5, 0x40, 0x6, 0x13, 0xb6, 0xfb, 0x24,
+ 0xfd, 0x5d, 0x15, 0xf7, 0xbe, 0xc3, 0xfb, 0x4d,
+ 0x6, 0xd3, 0xc3, 0x5, 0xcf, 0xba, 0xb6, 0xa4,
+ 0xc8, 0x1a, 0xe9, 0xfb, 0xc, 0x99, 0x76, 0xfb,
+ 0xb, 0x79, 0x46, 0x6a, 0x83, 0x1e, 0xd3, 0x84,
+ 0x5, 0xa6, 0x94, 0x95, 0xa5, 0xc1, 0x1b, 0xb3,
+ 0xa4, 0x79, 0x69, 0x6b, 0x74, 0x7a, 0x41, 0x57,
+ 0x1f, 0x4c, 0x5e, 0x55, 0x5c, 0x85, 0x57, 0x8,
+ 0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, 0xf8,
+ 0xe2, 0x77, 0x1, 0xf7, 0x43, 0xce, 0xf8, 0x24,
+ 0xcd, 0x3, 0xf8, 0x67, 0xc9, 0x15, 0xf7, 0x43,
+ 0x44, 0xcd, 0xd2, 0xbb, 0xbe, 0x5b, 0xf7, 0x78,
+ 0x53, 0x6, 0xfb, 0x4d, 0xfb, 0x71, 0x5, 0xd1,
+ 0x84, 0x15, 0xf4, 0xf7, 0xf, 0x5, 0xfb, 0xf,
+ 0x7, 0xfc, 0x67, 0xf7, 0x83, 0x15, 0xce, 0xf7,
+ 0xf3, 0x59, 0x6, 0x6a, 0x60, 0x56, 0x69, 0x6a,
+ 0x81, 0x8, 0x51, 0x7, 0xaf, 0x94, 0xb1, 0x9f,
+ 0xa7, 0xa3, 0x8, 0x5d, 0xfd, 0xa, 0x15, 0xd4,
+ 0x6, 0xf8, 0x8d, 0xf9, 0x63, 0x5, 0x44, 0x6,
+ 0xe, 0xfb, 0xfa, 0xf7, 0xe0, 0x76, 0xf8, 0x3a,
+ 0x77, 0x1, 0xf7, 0x2b, 0xd2, 0x3, 0xf7, 0x2b,
+ 0xf7, 0xcb, 0x15, 0xd2, 0xf8, 0x3a, 0x56, 0x6,
+ 0x68, 0x5e, 0x53, 0x68, 0x68, 0x80, 0x8, 0x4e,
+ 0x7, 0xb1, 0x95, 0xb3, 0xa0, 0xa9, 0xa4, 0x8,
+ 0xe, 0xfb, 0xd5, 0xf7, 0xc4, 0xd1, 0xf7, 0xbe,
+ 0xcc, 0x1, 0xa3, 0xd3, 0xf7, 0x38, 0xce, 0x3,
+ 0xf7, 0xa6, 0xf7, 0xcf, 0x4c, 0xa, 0x78, 0xa7,
+ 0x8b, 0xb3, 0xd6, 0x1a, 0xf7, 0x1e, 0x7, 0xf7,
+ 0x11, 0x3d, 0x9b, 0x48, 0xfb, 0x9, 0x74, 0x3b,
+ 0x62, 0x86, 0x1e, 0xcc, 0x77, 0x5, 0xc9, 0x93,
+ 0xb1, 0x99, 0xad, 0x1b, 0xd6, 0x8e, 0x56, 0x64,
+ 0x1f, 0x82, 0x85, 0x3b, 0x7f, 0x7b, 0x87, 0x8,
+ 0x5a, 0x84, 0x39, 0x7d, 0x22, 0x1a, 0x27, 0xd2,
+ 0x6f, 0xb8, 0xbe, 0xb7, 0xab, 0xa9, 0xa8, 0x1e,
+ 0x75, 0x8f, 0x7d, 0x91, 0x7c, 0x1e, 0x7c, 0xf7,
+ 0x5b, 0x15, 0x5b, 0x8a, 0x7d, 0x81, 0x77, 0x1e,
+ 0x65, 0x79, 0x64, 0x77, 0x68, 0x1b, 0x6a, 0x70,
+ 0x9f, 0xb1, 0xb9, 0xa6, 0x93, 0xcb, 0x97, 0x1f,
+ 0xb7, 0x94, 0x96, 0x8c, 0x9c, 0x91, 0x8, 0xe,
+ 0xfb, 0xda, 0xf7, 0xc4, 0xd0, 0xf7, 0xbb, 0xd0,
+ 0x1, 0xa4, 0xcb, 0xf7, 0x50, 0xcb, 0x3, 0xa4,
+ 0xf8, 0x9e, 0x15, 0xfb, 0x9, 0xc0, 0x26, 0xf4,
+ 0xf7, 0xe, 0xaf, 0xf7, 0x15, 0xe4, 0xe2, 0x68,
+ 0xf7, 0x14, 0xfb, 0xf, 0xfb, 0xd, 0x66, 0xfb,
+ 0xc, 0x2c, 0x1e, 0xcb, 0x16, 0xb2, 0x97, 0xf6,
+ 0xdd, 0xe1, 0x93, 0xfb, 0x12, 0x77, 0x68, 0x83,
+ 0xfb, 0x6, 0x35, 0x35, 0x83, 0xf7, 0x13, 0xa1,
+ 0x1e, 0xe, 0x3b, 0x8a, 0x76, 0xa6, 0xd0, 0xf8,
+ 0x10, 0xd0, 0xa1, 0x77, 0x1, 0xa7, 0xd3, 0xf7,
+ 0xf8, 0xdc, 0x3, 0xb0, 0x97, 0x15, 0xbb, 0x69,
+ 0xc1, 0xcc, 0x5, 0x7d, 0xa3, 0xaf, 0x73, 0xdc,
+ 0x1b, 0xf7, 0x39, 0xe7, 0xf7, 0x3, 0xf7, 0x27,
+ 0xf7, 0x1, 0x69, 0xb7, 0x71, 0xab, 0x1f, 0xc2,
+ 0xcb, 0x5a, 0xac, 0x58, 0x4f, 0x5, 0x9b, 0x6e,
+ 0x5c, 0xa1, 0x3f, 0x1b, 0xfb, 0x3a, 0x35, 0xfb,
+ 0x8, 0xfb, 0x24, 0x2e, 0xaa, 0x53, 0xad, 0x68,
+ 0x1f, 0xba, 0xc6, 0x15, 0x6e, 0xa6, 0x80, 0xb8,
+ 0xbe, 0x1a, 0xf7, 0x3a, 0xf7, 0x17, 0xa6, 0xbc,
+ 0xbe, 0xad, 0x78, 0x7e, 0x9e, 0x1e, 0xfb, 0x60,
+ 0xfb, 0xdc, 0x15, 0xf7, 0x86, 0xf7, 0xaf, 0x5,
+ 0xa1, 0x6f, 0x97, 0x72, 0x4e, 0x1a, 0xfb, 0x34,
+ 0xfb, 0x8, 0x6e, 0x4f, 0x59, 0x6c, 0x91, 0x99,
+ 0x78, 0x1e, 0xe, 0x7d, 0xd3, 0xf8, 0x34, 0xd3,
+ 0xca, 0x75, 0xa, 0x77, 0xa, 0x13, 0xec, 0xf7,
+ 0x7, 0xf8, 0xf5, 0x15, 0xcc, 0x6, 0xbb, 0xac,
+ 0x8a, 0x8f, 0xa2, 0xa4, 0x7f, 0x7f, 0xa2, 0x1e,
+ 0x80, 0xa2, 0x9f, 0x80, 0x9a, 0x1b, 0xa0, 0xd6,
+ 0x8d, 0xf7, 0x2, 0x56, 0xa, 0x87, 0x79, 0x92,
+ 0x96, 0x74, 0x1f, 0x13, 0xdc, 0x70, 0x96, 0x6b,
+ 0x98, 0x72, 0x8a, 0x8, 0x13, 0xec, 0x5a, 0x59,
+ 0x66, 0x40, 0x1f, 0x45, 0xfb, 0xed, 0x23, 0xa,
+ 0xe, 0x66, 0xa, 0xc7, 0xe3, 0xf7, 0x98, 0xe5,
+ 0x3, 0xf7, 0x28, 0xc8, 0x15, 0x68, 0xa5, 0xb3,
+ 0x6c, 0xc9, 0x1b, 0xf7, 0x6, 0xf7, 0x13, 0xe0,
+ 0xf7, 0x4c, 0xf7, 0x25, 0x2d, 0xf7, 0x15, 0xfb,
+ 0x27, 0x2d, 0x70, 0x54, 0x73, 0x7c, 0x1f, 0x89,
+ 0xce, 0x3b, 0xfd, 0x71, 0xe3, 0xf7, 0xa0, 0x6,
+ 0x82, 0xf7, 0x5e, 0x15, 0xf7, 0xd, 0xc2, 0xe0,
+ 0xdf, 0xcd, 0xe0, 0x50, 0xfb, 0x26, 0xfb, 0x3e,
+ 0x28, 0x70, 0x57, 0x4f, 0x3c, 0xb3, 0xf7, 0x30,
+ 0x1e, 0xe, 0xfb, 0x2e, 0xfb, 0x2c, 0x76, 0xf9,
+ 0xba, 0xe0, 0x1, 0x9d, 0xf7, 0xa2, 0xdd, 0xd0,
+ 0x3, 0xf7, 0x6c, 0xfb, 0x41, 0x15, 0xd3, 0xf9,
+ 0xba, 0xdd, 0xfd, 0xba, 0xd0, 0xf9, 0xba, 0xc5,
+ 0xe0, 0xfb, 0x8b, 0x6, 0xfb, 0xf, 0xfb, 0x1,
+ 0x48, 0xfb, 0x1d, 0x27, 0xca, 0x2d, 0xf7, 0x1b,
+ 0x1f, 0xe, 0x70, 0xa, 0x1, 0xcf, 0xe6, 0x3,
+ 0xf7, 0x88, 0xfb, 0x63, 0x15, 0xc2, 0x6, 0x21,
+ 0xf7, 0x3e, 0x69, 0xf7, 0x30, 0xf7, 0x23, 0x1a,
+ 0xf7, 0x6d, 0xd4, 0xf7, 0x1f, 0xce, 0xf7, 0x7,
+ 0x1e, 0x4a, 0x6, 0x21, 0xfb, 0x1f, 0x4f, 0xfb,
+ 0x37, 0xfb, 0x3d, 0x1a, 0xfb, 0x7f, 0xf7, 0x1d,
+ 0xfb, 0x4d, 0xb2, 0x5a, 0x1e, 0xe, 0x70, 0xa,
+ 0x12, 0xf7, 0x42, 0xe6, 0x17, 0xad, 0xfb, 0x61,
+ 0x15, 0xc6, 0x89, 0x5, 0xf5, 0xf7, 0x1f, 0xcd,
+ 0xf7, 0x35, 0xf7, 0x3d, 0x1a, 0xf7, 0x7f, 0xfb,
+ 0x16, 0xf7, 0x4f, 0x64, 0xbc, 0x1e, 0x4d, 0x6,
+ 0x13, 0x20, 0xf5, 0xfb, 0x3e, 0xad, 0xfb, 0x32,
+ 0xfb, 0x23, 0x1a, 0xfb, 0x6d, 0x3d, 0xfb, 0x26,
+ 0x4d, 0x23, 0x1e, 0xe, 0xf7, 0x5a, 0x79, 0xc5,
+ 0x65, 0x76, 0xf7, 0xc5, 0xc4, 0x89, 0xc5, 0xf7,
+ 0x8a, 0xc4, 0x8c, 0x77, 0x12, 0xb2, 0xde, 0xf7,
+ 0x3a, 0xdd, 0xf7, 0x29, 0xdd, 0xf7, 0x3b, 0xdd,
+ 0x13, 0x9b, 0xc0, 0xb2, 0xf8, 0x9d, 0x15, 0xfb,
+ 0x37, 0xf7, 0x2, 0x7a, 0xc0, 0xce, 0xf0, 0xb2,
+ 0xf7, 0x21, 0xf7, 0x27, 0x26, 0xad, 0x48, 0x1e,
+ 0xfb, 0xa, 0x5e, 0x29, 0x38, 0x1f, 0xde, 0x16,
+ 0xae, 0x89, 0xe4, 0xdd, 0xdf, 0x8d, 0x28, 0x72,
+ 0x68, 0x89, 0x34, 0x37, 0x1e, 0x13, 0xa6, 0xc0,
+ 0x39, 0x8d, 0xed, 0xa3, 0x1f, 0xf8, 0x21, 0xfb,
+ 0xfa, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x79, 0xc0,
+ 0xce, 0xf0, 0xb3, 0xf7, 0x21, 0x1e, 0x13, 0xab,
+ 0xc0, 0xf7, 0x26, 0x26, 0xad, 0x48, 0xfb, 0xb,
+ 0x5f, 0x2a, 0x38, 0x1e, 0xdd, 0x16, 0xae, 0x89,
+ 0xe3, 0xde, 0xdf, 0x8d, 0x29, 0x72, 0x68, 0x89,
+ 0x33, 0x37, 0x38, 0x8d, 0xee, 0xa3, 0x1e, 0x13,
+ 0x67, 0xc0, 0xfc, 0x2b, 0xfb, 0x4a, 0x15, 0xda,
+ 0x6, 0xf8, 0x3b, 0xf9, 0x66, 0x5, 0x3e, 0x6,
+ 0xe, 0xfc, 0x31, 0x8b, 0xf5, 0x1, 0xe2, 0xf3,
+ 0x3, 0xe2, 0x16, 0xf3, 0xf5, 0x23, 0x6, 0xe,
+ 0xfc, 0x31, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xd8,
+ 0xf7, 0x11, 0x3, 0xd8, 0xf7, 0x52, 0x15, 0xf7,
+ 0x11, 0xf7, 0x11, 0xfb, 0x11, 0x6, 0xe, 0xf7,
+ 0xc9, 0x78, 0xc5, 0xf7, 0x86, 0xc5, 0x88, 0xc6,
+ 0xf7, 0x85, 0xc4, 0x95, 0x77, 0x12, 0x92, 0xd5,
+ 0xf7, 0x1f, 0xd4, 0xd9, 0xd4, 0xf7, 0x1f, 0xd5,
+ 0xbe, 0xd4, 0xf7, 0x1f, 0xd5, 0x13, 0xb7, 0xe0,
+ 0x92, 0xf8, 0x98, 0x15, 0x52, 0x97, 0xfb, 0xf,
+ 0xf7, 0x16, 0xf7, 0x23, 0x8c, 0xf7, 0x1b, 0xb8,
+ 0xb2, 0x86, 0xf7, 0x1e, 0xfb, 0x1f, 0xfb, 0x1a,
+ 0x83, 0xfb, 0x16, 0x5c, 0x1e, 0xd5, 0x16, 0xb1,
+ 0x8a, 0xdd, 0xd0, 0xc4, 0x99, 0x53, 0x4b, 0x5d,
+ 0x83, 0x40, 0x4c, 0x48, 0x8a, 0xd7, 0xb8, 0x1e,
+ 0xf7, 0xb6, 0xfb, 0xf8, 0x15, 0x5d, 0xa, 0x1e,
+ 0x13, 0xcf, 0xe0, 0x3c, 0xa, 0xf7, 0x9c, 0x16,
+ 0x5d, 0xa, 0x3c, 0xa, 0xfd, 0xb, 0xfb, 0x45,
+ 0x15, 0xcd, 0x6, 0xf7, 0xbf, 0xf9, 0x64, 0x5,
+ 0x49, 0x6, 0xe, 0x20, 0xf7, 0x82, 0xe4, 0x1,
+ 0xf7, 0x8d, 0xe4, 0x3, 0xb2, 0xf7, 0x82, 0x15,
+ 0xf7, 0x66, 0xfb, 0x64, 0xe4, 0xf7, 0x64, 0xf7,
+ 0x63, 0xe4, 0xfb, 0x63, 0xf7, 0x64, 0x32, 0xfb,
+ 0x64, 0xfb, 0x66, 0x6, 0xe, 0x20, 0x8b, 0xd9,
+ 0xf7, 0x57, 0xd8, 0xf7, 0x30, 0x77, 0x1, 0xf7,
+ 0x8b, 0xe4, 0x3, 0xb2, 0xf7, 0xa5, 0x15, 0xf7,
+ 0x64, 0xfb, 0x2e, 0xe4, 0xf7, 0x2e, 0xf7, 0x65,
+ 0xd8, 0xfb, 0x65, 0xf7, 0x30, 0x32, 0xfb, 0x30,
+ 0xfb, 0x64, 0x6, 0xfb, 0xf2, 0x4, 0xf8, 0x8e,
+ 0xd9, 0xfc, 0x8e, 0x6, 0xe, 0x66, 0xa, 0xbe,
+ 0xe5, 0xf7, 0xa6, 0xda, 0x3, 0xf8, 0x28, 0xc8,
+ 0x15, 0x8d, 0xfb, 0xa0, 0xe3, 0xf9, 0x71, 0x3b,
+ 0x48, 0x89, 0x6, 0xa3, 0x7c, 0x5b, 0xc2, 0x2d,
+ 0x1b, 0xfb, 0x27, 0x42, 0xfb, 0x10, 0xfb, 0x25,
+ 0xfb, 0x4c, 0xf5, 0x31, 0xf7, 0x6, 0xc9, 0xc8,
+ 0xaa, 0xae, 0xa5, 0x1f, 0xfb, 0xab, 0xf7, 0x64,
+ 0x15, 0xf7, 0x26, 0xcb, 0xc1, 0xcd, 0xdf, 0xd7,
+ 0x3c, 0xfb, 0xd, 0xfb, 0x30, 0x27, 0x5d, 0x4f,
+ 0x57, 0x3d, 0xab, 0xf7, 0x3e, 0x1e, 0xe, 0x8b,
+ 0xef, 0xf8, 0xbf, 0xd3, 0x12, 0xf7, 0x71, 0xeb,
+ 0x31, 0xdc, 0xec, 0xe2, 0x13, 0xd8, 0xf7, 0x77,
+ 0xf7, 0x44, 0x15, 0xdc, 0x6, 0x8d, 0xed, 0x97,
+ 0x9a, 0xce, 0xc8, 0x8, 0xc6, 0xc2, 0xb7, 0xb4,
+ 0xdc, 0x1a, 0xf7, 0x4, 0x30, 0xe3, 0xfb, 0x16,
+ 0x26, 0xfb, 0x6, 0x33, 0xfb, 0xa, 0x1e, 0xd8,
+ 0x81, 0x5, 0xe0, 0x99, 0xb4, 0xc6, 0xdf, 0x1b,
+ 0xd8, 0xc3, 0x4d, 0x49, 0x59, 0x6f, 0x6e, 0x62,
+ 0x66, 0x1f, 0x38, 0x40, 0x6c, 0x67, 0x90, 0xfb,
+ 0x10, 0x8, 0x13, 0xe8, 0x85, 0xfb, 0x44, 0x15,
+ 0xeb, 0xef, 0x2b, 0x6, 0xe, 0x3b, 0xfb, 0x5d,
+ 0xd3, 0xf8, 0xbf, 0xee, 0x12, 0xe6, 0xe5, 0xe0,
+ 0xef, 0x31, 0xdf, 0xe0, 0xdd, 0x13, 0xec, 0xf7,
+ 0xa8, 0xf7, 0xea, 0x15, 0x89, 0x29, 0x85, 0x86,
+ 0x46, 0x4e, 0x8, 0x4d, 0x54, 0x5d, 0x5c, 0x3a,
+ 0x1a, 0xfb, 0x4, 0xea, 0x37, 0xf7, 0x1b, 0xcc,
+ 0xf7, 0x21, 0xb8, 0xf7, 0x37, 0x1e, 0x39, 0x95,
+ 0x5, 0x3f, 0x8c, 0x63, 0x45, 0x35, 0x1b, 0x3b,
+ 0x50, 0xc5, 0xcd, 0xbd, 0xa9, 0xae, 0xb5, 0xb0,
+ 0x1f, 0xe1, 0xd6, 0xa5, 0xa5, 0x86, 0xf7, 0x10,
+ 0x8, 0x13, 0xf4, 0x2d, 0xdf, 0x15, 0xef, 0xee,
+ 0x27, 0x6, 0xe, 0xfb, 0xe4, 0xf8, 0x78, 0x76,
+ 0xf7, 0x93, 0x77, 0x1, 0xd1, 0xd8, 0xc8, 0xd8,
+ 0x3, 0xf7, 0x74, 0xf8, 0x63, 0x5c, 0xa, 0xfb,
+ 0xe, 0xfb, 0x1e, 0x5c, 0xa, 0xe, 0xfb, 0xfa,
+ 0xfb, 0x14, 0x76, 0xf7, 0x22, 0xf7, 0x5, 0x1,
+ 0xdb, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xad, 0x84,
+ 0x48, 0xa, 0xf7, 0x3b, 0xfb, 0x5, 0x48, 0xa,
+ 0xe, 0xfb, 0xfa, 0xf8, 0x6a, 0xf7, 0x6, 0xf7,
+ 0x21, 0x77, 0x1, 0xb1, 0xbb, 0xf7, 0xb, 0xbb,
+ 0x3, 0xf7, 0x61, 0xf8, 0x6a, 0x47, 0xa, 0xfb,
+ 0x3b, 0x2f, 0x47, 0xa, 0xe, 0xfb, 0xfa, 0xf8,
+ 0x78, 0x76, 0xf7, 0x21, 0xf7, 0x6, 0x12, 0xdb,
+ 0xbb, 0xf7, 0xb, 0xbb, 0x17, 0xbb, 0xf8, 0x63,
+ 0x15, 0x13, 0xf0, 0x4d, 0xa, 0xf7, 0x51, 0x69,
+ 0x15, 0x13, 0x50, 0x4d, 0xa, 0xe, 0xfc, 0x69,
+ 0xf8, 0x6a, 0xef, 0xf7, 0x2f, 0x77, 0x1, 0xcc,
+ 0xba, 0x3, 0xcc, 0xf8, 0x6a, 0x15, 0xe8, 0xef,
+ 0x5d, 0x6, 0x8c, 0xa7, 0x90, 0xd3, 0xbe, 0xa0,
+ 0x75, 0xad, 0x18, 0x3b, 0x67, 0x89, 0x2f, 0x5a,
+ 0x1a, 0xe, 0xfc, 0x69, 0xf8, 0x78, 0x76, 0x1,
+ 0xf7, 0x2, 0xba, 0x3, 0xd6, 0xf8, 0x63, 0x15,
+ 0xdb, 0xaf, 0x8d, 0xd6, 0xbc, 0x1a, 0xea, 0x2e,
+ 0xfb, 0x9, 0xb9, 0x7, 0x8a, 0x6f, 0x86, 0x54,
+ 0x58, 0x76, 0x8, 0xe, 0xfc, 0x69, 0x85, 0xf7,
+ 0x4, 0x1, 0xf7, 0x1, 0xbb, 0x3, 0xca, 0x85,
+ 0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x87, 0x4f, 0x58,
+ 0x76, 0xa1, 0x69, 0x18, 0xdb, 0xaf, 0x8d, 0xdb,
+ 0xbc, 0x1a, 0xe5, 0x2d, 0x7, 0xe, 0xfc, 0x88,
+ 0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xc6,
+ 0xd4, 0x3, 0xdb, 0xf8, 0x63, 0x15, 0xa9, 0x6,
+ 0xa1, 0xf7, 0x1e, 0x5, 0xf7, 0x9, 0x42, 0xfb,
+ 0x9, 0x7, 0xe, 0xfb, 0xfa, 0xa0, 0x76, 0xf8,
+ 0x55, 0xe4, 0x12, 0x85, 0xe3, 0x17, 0xd8, 0x16,
+ 0xe3, 0xf7, 0xac, 0x6, 0xd7, 0x9b, 0xe8, 0xc3,
+ 0xa2, 0xa0, 0x8a, 0x78, 0xa0, 0x1e, 0xa9, 0xdd,
+ 0x5, 0x92, 0x82, 0x78, 0x9f, 0x5e, 0x1b, 0x4c,
+ 0x7a, 0x5f, 0x63, 0x77, 0x1f, 0x13, 0xe0, 0x89,
+ 0xd4, 0x3b, 0x6, 0xe, 0xb9, 0x78, 0xca, 0xf7,
+ 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+ 0x1, 0x7d, 0xca, 0xf7, 0x2e, 0xcd, 0xf7, 0x49,
+ 0xd2, 0xf7, 0x3c, 0xca, 0x3, 0xf7, 0x5f, 0xf7,
+ 0x2a, 0x15, 0xcd, 0xf7, 0x41, 0xb3, 0x6, 0xc0,
+ 0x9e, 0x76, 0x33, 0xbd, 0x1f, 0xb0, 0x4b, 0x5,
+ 0xdc, 0x6, 0x59, 0xda, 0x58, 0xdc, 0x7a, 0x97,
+ 0x73, 0x95, 0x19, 0x9d, 0xeb, 0x94, 0xef, 0xec,
+ 0x2a, 0x9d, 0x3c, 0x1f, 0xfb, 0x22, 0x6, 0xcd,
+ 0xfb, 0x45, 0x15, 0xf7, 0xe, 0xd7, 0x7, 0xb4,
+ 0xcb, 0x8b, 0x4f, 0x4d, 0x41, 0x8b, 0x6c, 0x1f,
+ 0xfb, 0xfb, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x41,
+ 0xfb, 0x3d, 0xf7, 0x68, 0xf7, 0x68, 0xf7, 0x3d,
+ 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3f,
+ 0xf7, 0x3c, 0xfb, 0x66, 0xfb, 0x66, 0xfb, 0x43,
+ 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xca, 0x16, 0xf7,
+ 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x44, 0xf7,
+ 0x44, 0xf7, 0x23, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+ 0x43, 0xfb, 0x23, 0xfb, 0x21, 0xfb, 0x44, 0xfb,
+ 0x44, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+ 0xe, 0xfb, 0xfa, 0xf8, 0xd0, 0xb1, 0xf7, 0x0,
+ 0xb1, 0x1, 0xd6, 0xb1, 0xf7, 0x0, 0xb1, 0x3,
+ 0xd6, 0xf9, 0x2e, 0x15, 0x57, 0xb3, 0x61, 0xbe,
+ 0xbf, 0xb4, 0xb5, 0xbf, 0xbe, 0x62, 0xb2, 0x57,
+ 0x58, 0x63, 0x64, 0x58, 0x1e, 0xb1, 0x16, 0xa6,
+ 0xa1, 0xa4, 0xaa, 0xab, 0xa2, 0x74, 0x6e, 0x6c,
+ 0x73, 0x72, 0x6c, 0x6f, 0x72, 0xa1, 0xad, 0x1e,
+ 0xe, 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x2d, 0xd3,
+ 0x1, 0xc8, 0xe0, 0xf7, 0x78, 0xe5, 0x3, 0xab,
+ 0xf7, 0x2f, 0x15, 0x57, 0x94, 0xa3, 0xfb, 0xa,
+ 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd3, 0xe1,
+ 0xf6, 0x3f, 0xa9, 0xfb, 0x1c, 0xae, 0x1f, 0x36,
+ 0xa1, 0x66, 0x91, 0xb7, 0x1a, 0xc6, 0xd2, 0x9f,
+ 0xae, 0xae, 0xd5, 0x83, 0x6c, 0xa, 0xf6, 0xfb,
+ 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x44, 0x3b, 0xfb,
+ 0x0, 0xf1, 0x73, 0xda, 0x78, 0x1f, 0xf7, 0x2,
+ 0x70, 0xb1, 0x73, 0x61, 0x1a, 0x68, 0x6c, 0x58,
+ 0x30, 0x38, 0x62, 0xb5, 0xd0, 0x82, 0x1e, 0xe,
+ 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x22, 0xd3, 0xf7,
+ 0x63, 0x77, 0x1, 0xb9, 0xe0, 0xf7, 0x87, 0xe5,
+ 0x3, 0xab, 0xf7, 0x2c, 0x15, 0x57, 0x94, 0xa3,
+ 0xfb, 0x7, 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7,
+ 0xd0, 0xe1, 0xf6, 0x40, 0x9c, 0xfb, 0x1c, 0xae,
+ 0x1f, 0x36, 0xa1, 0x66, 0xa2, 0xb7, 0x1a, 0xc6,
+ 0xd2, 0x93, 0xae, 0xae, 0xd5, 0x85, 0x6c, 0xa,
+ 0xf4, 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x46,
+ 0x3b, 0xfb, 0x0, 0xf1, 0x70, 0xda, 0x78, 0x1f,
+ 0xf7, 0x2, 0x70, 0xb0, 0x7c, 0x61, 0x1a, 0x68,
+ 0x6d, 0x5b, 0x30, 0x38, 0x61, 0xb2, 0xd0, 0x82,
+ 0x1e, 0xe2, 0xf8, 0x44, 0x37, 0xa, 0xfb, 0x53,
+ 0xd4, 0xf9, 0xa4, 0xd2, 0x1, 0xd4, 0x7a, 0x15,
+ 0xfb, 0x10, 0x9b, 0xe6, 0x59, 0xf4, 0x1b, 0xf7,
+ 0x9, 0xd7, 0xd0, 0xe4, 0xd8, 0x4f, 0xb8, 0x79,
+ 0x99, 0x1f, 0xb5, 0x9c, 0xd1, 0x98, 0xe7, 0x1a,
+ 0xe7, 0x3f, 0xc6, 0x27, 0xc6, 0x1e, 0x49, 0xb3,
+ 0x2d, 0xbf, 0xc4, 0x1a, 0xb2, 0xaa, 0xb6, 0xc8,
+ 0xe0, 0x9e, 0x46, 0x66, 0x92, 0x1e, 0xe6, 0x95,
+ 0x5, 0xf7, 0x8, 0xfb, 0x15, 0xbe, 0x47, 0xfb,
+ 0x14, 0x52, 0x32, 0x4b, 0x50, 0xb0, 0x68, 0xa7,
+ 0x73, 0x1e, 0x3f, 0x74, 0x69, 0x4f, 0x54, 0x1a,
+ 0x2a, 0xe2, 0x55, 0xda, 0x5c, 0x1e, 0xda, 0x5a,
+ 0xb0, 0x6f, 0xa2, 0x79, 0x8, 0xaf, 0x6f, 0x91,
+ 0x76, 0x77, 0x1a, 0x6d, 0x73, 0x55, 0x3a, 0x28,
+ 0x7b, 0xd5, 0xb2, 0x82, 0x1e, 0xf7, 0x57, 0xf7,
+ 0x20, 0x15, 0x78, 0x99, 0x6f, 0x9c, 0x4b, 0xb0,
+ 0x8, 0x3b, 0xba, 0x60, 0xa5, 0xbf, 0x1a, 0xbf,
+ 0xba, 0xb0, 0xa6, 0x9a, 0x1e, 0xa3, 0x77, 0xab,
+ 0x76, 0xb5, 0x71, 0x8, 0xd9, 0x5b, 0xc3, 0x62,
+ 0x58, 0x1a, 0x70, 0x79, 0x67, 0x55, 0x70, 0x1e,
+ 0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf8, 0xc8,
+ 0xee, 0x1, 0xe3, 0xf2, 0x3, 0xe3, 0x85, 0x15,
+ 0xc8, 0x6, 0x8a, 0x61, 0x7d, 0x62, 0x5c, 0x76,
+ 0xa3, 0x66, 0x18, 0xd2, 0xa4, 0x94, 0xdd, 0xad,
+ 0x1a, 0xee, 0x24, 0x7, 0xf7, 0xd8, 0x4, 0xf2,
+ 0xee, 0x24, 0x6, 0xe, 0xa0, 0x76, 0xf9, 0xa,
+ 0xdc, 0x1, 0xf7, 0x23, 0xe9, 0x3, 0xf7, 0x23,
+ 0x16, 0xe9, 0x6, 0xa2, 0xf7, 0xcc, 0xf7, 0x54,
+ 0xf7, 0x85, 0xd2, 0xd2, 0x8, 0xcb, 0xfc, 0x7a,
+ 0x3a, 0xf8, 0x3, 0x7, 0xfb, 0x3b, 0xfb, 0x46,
+ 0x2f, 0xfb, 0x9e, 0x89, 0xfb, 0x37, 0x8, 0xe,
+ 0x78, 0xd2, 0xf7, 0xd8, 0xd7, 0xf7, 0x48, 0xd2,
+ 0x1, 0xc4, 0xf3, 0xf7, 0x9d, 0xe7, 0x3, 0xf7,
+ 0x14, 0xf7, 0xfa, 0x15, 0xf7, 0x4, 0xb3, 0xf7,
+ 0x36, 0xf7, 0xd, 0xed, 0xa3, 0x36, 0x70, 0x91,
+ 0x1e, 0xe5, 0x93, 0x5, 0xf7, 0x1b, 0x78, 0xfb,
+ 0x6, 0xb3, 0x36, 0x1b, 0xfb, 0x88, 0x84, 0xfb,
+ 0xb4, 0x30, 0xfb, 0x43, 0xb6, 0xfb, 0x3c, 0xf7,
+ 0x64, 0xf7, 0x2d, 0xd7, 0xf7, 0xa, 0xf7, 0xa,
+ 0xf7, 0x20, 0xfb, 0x6, 0xea, 0xfb, 0x7, 0x40,
+ 0x5d, 0x69, 0x4f, 0x65, 0x1f, 0x97, 0xfb, 0x1c,
+ 0x15, 0xf1, 0xd8, 0xbf, 0xd1, 0xe3, 0xbc, 0x45,
+ 0x32, 0x38, 0x5b, 0x39, 0x32, 0x31, 0x52, 0xdc,
+ 0xe4, 0x1e, 0xe, 0xfc, 0x31, 0x8d, 0x76, 0x1,
+ 0x7a, 0xf7, 0xcc, 0x3, 0x7a, 0x78, 0x15, 0xd2,
+ 0x6, 0xf7, 0x85, 0xf9, 0x88, 0x5, 0x4c, 0x6,
+ 0xe, 0xfc, 0x31, 0xe, 0x7b, 0xda, 0x6a, 0xd3,
+ 0xf7, 0x6c, 0xd2, 0xf7, 0x96, 0xd2, 0x12, 0xe8,
+ 0xe3, 0x67, 0xe7, 0x13, 0x78, 0xac, 0xd0, 0x15,
+ 0xac, 0x37, 0x5, 0xa7, 0xb5, 0xc4, 0x9c, 0xbb,
+ 0x1b, 0x13, 0xb8, 0xca, 0xe3, 0x5d, 0xc7, 0x1b,
+ 0xb5, 0xab, 0x98, 0x9c, 0xb4, 0x1f, 0x6f, 0xdb,
+ 0x5, 0x83, 0x7a, 0x64, 0x74, 0x68, 0x1b, 0x13,
+ 0x74, 0x43, 0x54, 0xb2, 0x41, 0x1b, 0x6d, 0x73,
+ 0x85, 0x86, 0x7e, 0x1f, 0x89, 0x8d, 0x5, 0xbb,
+ 0xbc, 0xb2, 0xca, 0xd1, 0x1a, 0xa0, 0x86, 0x95,
+ 0x86, 0x97, 0x1e, 0xf7, 0x1b, 0xd2, 0xfb, 0x2a,
+ 0x6, 0x13, 0xb8, 0x7e, 0xb1, 0x79, 0xbf, 0xb0,
+ 0x1a, 0xc6, 0xbd, 0xd3, 0xd8, 0xc9, 0xc2, 0x60,
+ 0x39, 0x95, 0x1e, 0xe1, 0x98, 0x5, 0xf7, 0x4,
+ 0x84, 0x26, 0xd2, 0x22, 0x1b, 0x20, 0xfb, 0x0,
+ 0x4c, 0xfb, 0x1f, 0x67, 0x92, 0x6d, 0x9c, 0x4e,
+ 0x1f, 0x42, 0x44, 0xe8, 0x6, 0x13, 0xb4, 0x8f,
+ 0x7b, 0x8f, 0x7c, 0x6e, 0x1a, 0xfb, 0xc, 0x34,
+ 0x54, 0x72, 0x7d, 0x1e, 0xe, 0xfc, 0x31, 0x99,
+ 0x76, 0xf8, 0x52, 0xcf, 0xf7, 0x36, 0x77, 0x1,
+ 0xdc, 0xe3, 0x3, 0xf7, 0x95, 0x8c, 0x15, 0x7f,
+ 0xd9, 0x5, 0x54, 0x7e, 0x76, 0x93, 0xd4, 0x1a,
+ 0xf7, 0xb8, 0xe3, 0xcf, 0x33, 0xf7, 0x36, 0x7,
+ 0x33, 0x56, 0x5, 0xfb, 0x1, 0x48, 0x47, 0xce,
+ 0xfb, 0xb8, 0x7, 0x35, 0x90, 0x47, 0xf7, 0x6,
+ 0xa8, 0x98, 0x90, 0x8e, 0x9a, 0x1e, 0xe, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x57, 0xd4, 0xf8, 0x20, 0xd4,
+ 0xf7, 0x50, 0x77, 0x12, 0xc5, 0xda, 0x3c, 0xe3,
+ 0xf7, 0xad, 0xe5, 0x13, 0xf6, 0xf7, 0x26, 0xc1,
+ 0x15, 0x6c, 0xa8, 0xaf, 0x68, 0xd6, 0x1b, 0xf7,
+ 0x2, 0xf7, 0xd, 0xdd, 0xf7, 0x4e, 0xf7, 0x25,
+ 0x37, 0xf7, 0x15, 0xfb, 0x27, 0x3c, 0x6d, 0x6a,
+ 0x6a, 0x6c, 0x1f, 0xf7, 0x92, 0x33, 0xfe, 0x31,
+ 0xe3, 0x7, 0x13, 0xfa, 0x82, 0xf8, 0x63, 0x15,
+ 0xf7, 0xd, 0xcc, 0xdb, 0xdf, 0xcd, 0xd6, 0x53,
+ 0xfb, 0x25, 0xfb, 0x3e, 0x32, 0x72, 0x57, 0x4f,
+ 0x32, 0xb2, 0xf7, 0x30, 0x1e, 0xe, 0x78, 0xd2,
+ 0xf8, 0xd8, 0xd2, 0x1, 0xf8, 0x29, 0xe9, 0x3,
+ 0xad, 0xf7, 0x47, 0x15, 0x28, 0x95, 0xd8, 0x28,
+ 0xf7, 0x2b, 0x1b, 0xf7, 0x13, 0xf7, 0xf, 0xdd,
+ 0xf7, 0x1e, 0xd2, 0x4f, 0xf0, 0x3b, 0x1f, 0x8d,
+ 0x7, 0xe4, 0xb0, 0x99, 0xd2, 0xb0, 0x1a, 0xf1,
+ 0x30, 0xdc, 0xfb, 0x12, 0x3d, 0xfb, 0xa, 0x6a,
+ 0xfb, 0x2a, 0x6e, 0x1e, 0xe7, 0x7b, 0x5, 0xd1,
+ 0x96, 0xb3, 0xc5, 0xdf, 0x1b, 0xc5, 0xca, 0x66,
+ 0x40, 0x24, 0xfb, 0x6, 0x77, 0x57, 0x90, 0x1f,
+ 0x80, 0x3f, 0x5, 0xf4, 0xad, 0xf4, 0x51, 0x24,
+ 0x1a, 0x38, 0x48, 0x4b, 0x36, 0xfb, 0x9, 0x75,
+ 0xf3, 0xae, 0x84, 0x1e, 0xe, 0xf7, 0x23, 0x8d,
+ 0x76, 0xdc, 0xbe, 0xf7, 0x77, 0xc2, 0xf7, 0x6,
+ 0xf7, 0x56, 0x56, 0xc0, 0x12, 0xf7, 0x8f, 0xd7,
+ 0x50, 0xd7, 0xf7, 0xec, 0xd1, 0x13, 0xf3, 0xf8,
+ 0x89, 0xc9, 0x15, 0xf7, 0x4f, 0x43, 0xd1, 0xd3,
+ 0xbf, 0xbe, 0x57, 0xf7, 0x78, 0x4f, 0x6, 0xfb,
+ 0x59, 0xfb, 0x71, 0x5, 0xd6, 0x84, 0x15, 0xf7,
+ 0x4, 0xf7, 0x10, 0x5, 0xfb, 0x10, 0x7, 0xfd,
+ 0x17, 0xf7, 0xdc, 0x15, 0x51, 0x97, 0xae, 0x60,
+ 0xee, 0x1b, 0xef, 0xc0, 0xc1, 0xc2, 0xbd, 0x68,
+ 0xa7, 0x5a, 0x96, 0x1f, 0x8d, 0x7, 0x13, 0xed,
+ 0xbb, 0x97, 0x9e, 0xa3, 0xab, 0x1a, 0xe3, 0xfb,
+ 0x8, 0x92, 0x78, 0x31, 0x70, 0x68, 0x54, 0x75,
+ 0x1e, 0xd1, 0x80, 0x5, 0xa7, 0x96, 0x99, 0x9f,
+ 0xb7, 0x1b, 0xb5, 0x9c, 0x77, 0x75, 0x63, 0x59,
+ 0x83, 0x70, 0x1f, 0x13, 0xf3, 0x81, 0x58, 0x5,
+ 0xc1, 0x8d, 0xbd, 0x7d, 0x5b, 0x1a, 0x65, 0x69,
+ 0x7b, 0x60, 0x53, 0x7e, 0xae, 0x9d, 0x85, 0x1e,
+ 0xa5, 0xfc, 0x67, 0x15, 0xd8, 0x6, 0xf8, 0xaf,
+ 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xe, 0xfb, 0xfa,
+ 0xf7, 0xa2, 0xcd, 0xf7, 0xc4, 0xca, 0x1, 0xf7,
+ 0x76, 0xdc, 0x3, 0x90, 0xf8, 0x1c, 0x15, 0x46,
+ 0x98, 0xb1, 0x56, 0xf5, 0x1b, 0xf5, 0xc4, 0xcc,
+ 0xcd, 0xc7, 0x66, 0xac, 0x56, 0x98, 0x1f, 0x8d,
+ 0x7, 0xbf, 0x9a, 0x9f, 0xa8, 0xb0, 0x1a, 0xf4,
+ 0xfb, 0x11, 0x93, 0x77, 0x2b, 0x6f, 0x62, 0x49,
+ 0x74, 0x1e, 0xd5, 0x7f, 0x5, 0xab, 0x97, 0x99,
+ 0xa3, 0xba, 0x1b, 0xb8, 0x9e, 0x73, 0x71, 0x5b,
+ 0x55, 0x82, 0x6f, 0x1f, 0x80, 0x4e, 0x5, 0xc5,
+ 0x8c, 0xc0, 0x7c, 0x52, 0x1a, 0x5e, 0x67, 0x77,
+ 0x5d, 0x4f, 0x7c, 0xb6, 0xa0, 0x85, 0x1e, 0xe,
+ 0xfb, 0xfa, 0xf9, 0x37, 0xba, 0x1, 0x87, 0xf8,
+ 0xf2, 0x15, 0xce, 0x6, 0xbb, 0xad, 0x8b, 0x8f,
+ 0xa0, 0x9f, 0x81, 0x80, 0x9f, 0x1e, 0x7f, 0xa2,
+ 0xa2, 0x7d, 0xa2, 0x1b, 0xa1, 0xdf, 0x91, 0xf7,
+ 0x1, 0x1f, 0x49, 0x6, 0x68, 0x87, 0x7c, 0x7f,
+ 0x76, 0x1b, 0x78, 0x7b, 0x92, 0x94, 0x7c, 0x1f,
+ 0x98, 0x73, 0x74, 0x9c, 0x6a, 0x1b, 0x59, 0x54,
+ 0x66, 0x3d, 0x1f, 0xe, 0xf7, 0xc9, 0xf7, 0xdb,
+ 0x76, 0xf7, 0xf5, 0xc6, 0x1, 0xf7, 0x5b, 0xcd,
+ 0xf7, 0x8b, 0xc8, 0xf7, 0xa1, 0xc8, 0x3, 0xf7,
+ 0x5b, 0xf7, 0xc6, 0x15, 0xcd, 0xf7, 0xf5, 0xf7,
+ 0x2f, 0xc6, 0xfc, 0xa, 0x50, 0xf7, 0x2d, 0x6,
+ 0xf7, 0xcd, 0xfb, 0xf5, 0x15, 0xc8, 0xf7, 0xf5,
+ 0x8d, 0x6, 0xf4, 0xfb, 0xf5, 0x5, 0xc7, 0x6,
+ 0xef, 0xf7, 0xf0, 0x5, 0x8d, 0xfb, 0xf0, 0xc8,
+ 0xf8, 0x30, 0x2b, 0x6, 0x2b, 0xfb, 0xe0, 0x5,
+ 0x89, 0x6, 0x28, 0xf7, 0xe0, 0x5, 0x29, 0x6,
+ 0xe, 0x8b, 0xde, 0xf8, 0xbc, 0xd4, 0x1, 0xf8,
+ 0x32, 0xe6, 0x3, 0xa5, 0x16, 0xf8, 0x75, 0xde,
+ 0xfb, 0xfa, 0x6, 0x97, 0x9e, 0x97, 0xa3, 0xdb,
+ 0xc9, 0x8, 0xf7, 0x25, 0xf7, 0x4, 0xf6, 0xf5,
+ 0xf1, 0x1a, 0xe1, 0x4c, 0xf7, 0x1, 0xfb, 0x38,
+ 0xfb, 0xe, 0x2b, 0x49, 0xfb, 0x1c, 0x7d, 0x1e,
+ 0xe6, 0x81, 0x5, 0xf7, 0x20, 0x8c, 0xf7, 0x11,
+ 0x8a, 0x9a, 0x1b, 0xda, 0xc4, 0x5a, 0x44, 0x37,
+ 0xfb, 0x0, 0x2d, 0x3d, 0x4f, 0x1f, 0x38, 0x4a,
+ 0xfb, 0xb, 0x2d, 0xfb, 0x5, 0x1a, 0xe, 0xfb,
+ 0xfa, 0xf7, 0xa0, 0xcd, 0xf7, 0xc7, 0xc9, 0x1,
+ 0xf7, 0x84, 0xdb, 0x3, 0x8f, 0xf7, 0xad, 0x15,
+ 0xf7, 0xd3, 0xcd, 0xfb, 0x5d, 0x6, 0x95, 0x96,
+ 0x95, 0x95, 0xc5, 0xbb, 0x8, 0xd3, 0xc4, 0xbb,
+ 0xa8, 0xd3, 0x1a, 0xf7, 0x4, 0x2b, 0x9c, 0x54,
+ 0xfb, 0x11, 0x77, 0x38, 0x64, 0x81, 0x1e, 0xd5,
+ 0x83, 0x5, 0xab, 0x95, 0x95, 0xaf, 0xc4, 0x1b,
+ 0xb6, 0xab, 0x70, 0x63, 0x65, 0x72, 0x78, 0x3d,
+ 0x4b, 0x1f, 0x47, 0x55, 0x50, 0x53, 0x85, 0x4d,
+ 0x8, 0xe, 0x7c, 0xd7, 0x63, 0x76, 0xf8, 0x9f,
+ 0x77, 0x4e, 0xa, 0x13, 0x78, 0xf8, 0x2e, 0x16,
+ 0xda, 0xf8, 0x9f, 0x33, 0xfb, 0xb8, 0x6, 0x13,
+ 0xb8, 0x33, 0x5b, 0x39, 0x30, 0x36, 0x76, 0xd9,
+ 0xe3, 0x1e, 0xf7, 0xbc, 0x33, 0xfb, 0xda, 0x7,
+ 0xfb, 0x8, 0xca, 0x2b, 0xf7, 0x17, 0xa4, 0xcc,
+ 0x91, 0xe0, 0xc3, 0x1e, 0x8d, 0x6, 0xe, 0x79,
+ 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x34, 0xa, 0xfb,
+ 0x4f, 0xf8, 0xa0, 0x2f, 0xa, 0xe, 0x79, 0xa,
+ 0xf9, 0x75, 0x77, 0x34, 0xa, 0xfb, 0xb2, 0xf8,
+ 0xa0, 0x2c, 0xa, 0xe, 0x79, 0xa, 0xf8, 0xf5,
+ 0xef, 0x12, 0xcf, 0xe3, 0x7e, 0xe5, 0xe6, 0xe5,
+ 0x7e, 0xe3, 0x3c, 0xda, 0x13, 0x71, 0xf8, 0x2e,
+ 0x88, 0x15, 0xda, 0xf8, 0x9c, 0x6, 0x13, 0xb2,
+ 0x33, 0xfb, 0xa8, 0x6, 0x32, 0xa, 0x1e, 0x13,
+ 0x69, 0x65, 0xa, 0x1f, 0xfb, 0x9f, 0xf8, 0xa9,
+ 0x31, 0xa, 0x13, 0xb4, 0xf7, 0x49, 0x72, 0xa,
+ 0x79, 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x3d, 0xa,
+ 0x33, 0x6, 0x13, 0xb8, 0xfb, 0xa8, 0x7, 0x32,
+ 0xa, 0x65, 0xa, 0x1e, 0x13, 0xb4, 0xfb, 0x28,
+ 0xf8, 0xa0, 0x5e, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+ 0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, 0xe,
+ 0xfb, 0x53, 0x68, 0xa, 0xf7, 0x64, 0x16, 0xdd,
+ 0x6, 0xf7, 0x5e, 0xf8, 0x9f, 0x5, 0x31, 0x6,
+ 0xfb, 0x2d, 0xfc, 0x38, 0xfb, 0x28, 0xf8, 0x38,
+ 0x5, 0x2e, 0x6, 0xe, 0xaa, 0x68, 0xa, 0xf7,
+ 0x41, 0x16, 0xe7, 0x6, 0xe9, 0xf8, 0x28, 0x5,
+ 0x8d, 0x6, 0xf1, 0xfc, 0x28, 0x5, 0xe6, 0x6,
+ 0xf7, 0x2f, 0xf8, 0x9f, 0x5, 0x35, 0x6, 0xfb,
+ 0x2, 0xfc, 0x28, 0x5, 0x89, 0x6, 0x25, 0xf8,
+ 0x28, 0x5, 0x31, 0x6, 0x26, 0xfc, 0x33, 0xfb,
+ 0x5, 0xf8, 0x33, 0x5, 0x30, 0x6, 0xe, 0xfb,
+ 0x53, 0x68, 0xa, 0x96, 0x16, 0xf4, 0x6, 0xf7,
+ 0x1b, 0xf7, 0x60, 0xf7, 0x18, 0xfb, 0x60, 0x5,
+ 0xf6, 0x6, 0xfb, 0x52, 0xf7, 0xa6, 0xf7, 0x44,
+ 0xf7, 0x8d, 0x5, 0x23, 0x6, 0xfb, 0x10, 0xfb,
+ 0x4d, 0xfb, 0x7, 0xf7, 0x4d, 0x5, 0x20, 0x6,
+ 0xf7, 0x3f, 0xfb, 0x92, 0x5, 0xe, 0xfb, 0x53,
+ 0xfb, 0x6a, 0xdd, 0xf9, 0x23, 0x77, 0x1, 0xba,
+ 0xfb, 0x10, 0x15, 0x94, 0x3b, 0x55, 0xa, 0xa4,
+ 0xf7, 0x0, 0xf2, 0xbe, 0x1f, 0xf7, 0x5d, 0xf8,
+ 0xa2, 0x5, 0x32, 0x6, 0xfb, 0x28, 0xfc, 0x37,
+ 0x5, 0x89, 0x6, 0xfb, 0x24, 0xf8, 0x37, 0x5,
+ 0x2c, 0x6, 0xf7, 0x58, 0xfc, 0x9a, 0x5, 0x43,
+ 0x71, 0x81, 0x4a, 0x41, 0x1b, 0x76, 0x7b, 0x8f,
+ 0x8f, 0x7e, 0x1f, 0xe, 0xfb, 0x53, 0xfb, 0x6a,
+ 0xda, 0xf9, 0x70, 0xf7, 0x1d, 0x1, 0x33, 0xa,
+ 0xf7, 0x27, 0xf9, 0x62, 0x2f, 0xa, 0xe, 0xfb,
+ 0x53, 0xfb, 0x6a, 0xda, 0xf9, 0x79, 0xef, 0x1,
+ 0x96, 0xea, 0x94, 0xe5, 0xe6, 0xe5, 0x3, 0x33,
+ 0xa, 0xce, 0xf9, 0x6b, 0x2e, 0xa, 0xe, 0xa0,
+ 0x76, 0xf7, 0x39, 0xcf, 0xe3, 0xcf, 0xf7, 0xbf,
+ 0x77, 0x1, 0xf7, 0x7f, 0xe3, 0x3, 0xab, 0xf7,
+ 0x39, 0x15, 0xf7, 0x5f, 0xfb, 0x39, 0xe3, 0xf7,
+ 0x39, 0xf7, 0x5d, 0xcf, 0xfb, 0x5d, 0xe3, 0xf7,
+ 0x5d, 0xcf, 0xfb, 0x2f, 0x6, 0xf7, 0x4c, 0xf7,
+ 0xbf, 0x5, 0x23, 0x6, 0xfb, 0x40, 0xfb, 0xbf,
+ 0xfb, 0x44, 0xf7, 0xbf, 0x5, 0x29, 0x6, 0xf7,
+ 0x4d, 0xfb, 0xbf, 0x5, 0xfb, 0x30, 0x47, 0xf7,
+ 0x5f, 0x33, 0xfb, 0x5f, 0x6, 0xe, 0xfb, 0x53,
+ 0x8b, 0xd7, 0xf8, 0xb, 0xd3, 0x63, 0xa, 0xf8,
+ 0x1a, 0x67, 0xa, 0xfc, 0x10, 0x5, 0xe, 0xfb,
+ 0x53, 0x8b, 0xd7, 0xf8, 0x6, 0xd3, 0xf7, 0x6c,
+ 0x77, 0x63, 0xa, 0xf8, 0x15, 0x67, 0xa, 0xfc,
+ 0xb, 0x5, 0xf7, 0x43, 0xf8, 0xa2, 0x37, 0xa,
+ 0x78, 0xd2, 0xf8, 0xd8, 0xd2, 0x1, 0xbe, 0xe8,
+ 0xf7, 0xa6, 0xe8, 0x3, 0xb1, 0xf7, 0xec, 0x15,
+ 0x37, 0x92, 0xfb, 0xab, 0xf7, 0x7e, 0xf7, 0x7d,
+ 0x91, 0xf7, 0xb3, 0xd7, 0xd9, 0x88, 0xf7, 0xad,
+ 0xfb, 0x81, 0xfb, 0x71, 0x78, 0xfb, 0xaf, 0x3f,
+ 0x1e, 0xe7, 0x16, 0xf7, 0x21, 0xa1, 0xf7, 0x27,
+ 0xf7, 0x12, 0xf7, 0x1c, 0x96, 0xfb, 0x38, 0xfb,
+ 0x10, 0xfb, 0xd, 0x7e, 0xfb, 0x3f, 0xfb, 0x19,
+ 0xfb, 0x1c, 0x7e, 0xf7, 0x42, 0xf7, 0xa, 0x1e,
+ 0xe, 0x76, 0xa0, 0xf8, 0x9f, 0x9a, 0xf7, 0x48,
+ 0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, 0x1e, 0xa0,
+ 0x39, 0x63, 0xff, 0xc, 0x9, 0xd2, 0xa, 0xe2,
+ 0xb, 0xf8, 0xc0, 0x14, 0xf9, 0x47, 0x15, 0xab,
+ 0x13, 0x0, 0x5b, 0x2, 0x0, 0x1, 0x0, 0x7,
+ 0x0, 0x68, 0x0, 0x6d, 0x0, 0xbc, 0x0, 0xf0,
+ 0x1, 0x1e, 0x1, 0x23, 0x1, 0x4c, 0x1, 0x72,
+ 0x1, 0xac, 0x1, 0xd9, 0x1, 0xdf, 0x1, 0xee,
+ 0x2, 0xb, 0x2, 0x13, 0x2, 0x1c, 0x2, 0x34,
+ 0x2, 0x3a, 0x2, 0x50, 0x2, 0x84, 0x2, 0x96,
+ 0x2, 0x9f, 0x2, 0xa4, 0x2, 0xb4, 0x2, 0xb9,
+ 0x2, 0xc0, 0x2, 0xc7, 0x2, 0xee, 0x3, 0xf,
+ 0x3, 0x1d, 0x3, 0x24, 0x3, 0x2b, 0x3, 0x33,
+ 0x3, 0x3c, 0x3, 0x41, 0x3, 0x4b, 0x3, 0x54,
+ 0x3, 0x5c, 0x3, 0x62, 0x3, 0x78, 0x3, 0x8e,
+ 0x3, 0x97, 0x3, 0xa0, 0x3, 0xa5, 0x3, 0xa9,
+ 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, 0xd3,
+ 0x3, 0xdc, 0x3, 0xe4, 0x3, 0xf5, 0x3, 0xff,
+ 0x4, 0x9, 0x4, 0x13, 0x4, 0x23, 0x4, 0x29,
+ 0x4, 0x2c, 0x4, 0x30, 0x4, 0x3e, 0x4, 0x4c,
+ 0x4, 0x59, 0x4, 0x5e, 0x4, 0x62, 0x4, 0x6c,
+ 0x4, 0x76, 0x4, 0x80, 0x4, 0x8c, 0x4, 0x98,
+ 0x4, 0x9e, 0x4, 0xa9, 0x4, 0xb4, 0x4, 0xbb,
+ 0x4, 0xc5, 0x4, 0xcf, 0x4, 0xd9, 0x4, 0xe3,
+ 0x4, 0xe7, 0x4, 0xeb, 0x4, 0xf4, 0x4, 0xfd,
+ 0x5, 0x6, 0x5, 0xa, 0x5, 0x11, 0x5, 0x15,
+ 0x5, 0x1b, 0x5, 0x21, 0x5, 0x27, 0x5, 0x2d,
+ 0x5, 0x32, 0x5, 0x35, 0x22, 0xa, 0x13, 0xbc,
+ 0x28, 0xa, 0x15, 0x2b, 0xa9, 0x2e, 0xc6, 0x44,
+ 0x1e, 0x46, 0xc6, 0xd7, 0x5c, 0xf7, 0x7, 0x1b,
+ 0xf7, 0x4f, 0xf7, 0x2b, 0xf7, 0x1a, 0xf7, 0x86,
+ 0x8e, 0x1f, 0xf6, 0x64, 0xf1, 0x52, 0xcf, 0x1e,
+ 0xd0, 0x53, 0x32, 0xb2, 0x27, 0x1b, 0x2c, 0x32,
+ 0x6a, 0x4a, 0x52, 0x1f, 0x53, 0x4a, 0x61, 0x24,
+ 0xfb, 0xb, 0x1a, 0xef, 0x16, 0xc0, 0x9c, 0xdd,
+ 0xb3, 0xc7, 0x1e, 0xc8, 0xb3, 0xbe, 0xb7, 0xe6,
+ 0x1b, 0xca, 0xcb, 0x73, 0x58, 0xb3, 0x1f, 0xb4,
+ 0x58, 0xac, 0x3a, 0x2e, 0x1a, 0x85, 0xfb, 0x61,
+ 0x2b, 0x35, 0xfb, 0x1f, 0x8a, 0x8, 0x40, 0x58,
+ 0xa9, 0xbe, 0x5f, 0x1f, 0x5f, 0xbf, 0x72, 0xd3,
+ 0xe2, 0x1a, 0xb, 0x24, 0xa, 0x25, 0xa, 0xb,
+ 0x15, 0x47, 0x9c, 0x45, 0xb2, 0x57, 0x1e, 0x57,
+ 0xb2, 0xbb, 0x67, 0xde, 0x1b, 0xf7, 0x24, 0xeb,
+ 0xec, 0xf7, 0x49, 0xee, 0x68, 0xcd, 0x5a, 0xb3,
+ 0x1f, 0xb4, 0x5a, 0x57, 0x9c, 0x54, 0x1b, 0x3c,
+ 0x5b, 0x6d, 0x5b, 0x63, 0x1f, 0x64, 0x5b, 0x77,
+ 0x4a, 0x43, 0x1a, 0xe5, 0x16, 0xf7, 0x27, 0x90,
+ 0xd2, 0xb7, 0xc7, 0x1b, 0xd2, 0xd7, 0x56, 0xfb,
+ 0x1e, 0x8e, 0x1f, 0x62, 0x82, 0x57, 0x73, 0x62,
+ 0x1e, 0x62, 0x73, 0x6d, 0x6c, 0x4c, 0x1b, 0x51,
+ 0x43, 0xc2, 0xf7, 0x2b, 0x85, 0x1f, 0xb, 0x15,
+ 0x90, 0xa0, 0x91, 0xa4, 0x9e, 0x9e, 0x8, 0x9f,
+ 0x9e, 0xa0, 0x99, 0xc2, 0x1b, 0xcb, 0xa1, 0x78,
+ 0x72, 0x9b, 0x1f, 0x9b, 0x73, 0x8a, 0x6a, 0x8a,
+ 0x6f, 0x54, 0x77, 0x40, 0x85, 0x79, 0x87, 0x8,
+ 0x60, 0x85, 0xfb, 0x2d, 0x78, 0xfb, 0x1d, 0x1a,
+ 0x33, 0xd9, 0x4b, 0xe8, 0xc3, 0xbb, 0x9b, 0xca,
+ 0xd6, 0x1e, 0xb, 0x8e, 0x7e, 0x99, 0x73, 0x9a,
+ 0x70, 0x8, 0xe7, 0x6, 0x6e, 0xbd, 0x7e, 0xad,
+ 0xf7, 0x19, 0x1a, 0xf7, 0xa, 0x7, 0x90, 0xe5,
+ 0x6e, 0xf3, 0xfb, 0x48, 0x8c, 0x8, 0x2b, 0x60,
+ 0x6f, 0x68, 0x6a, 0x1f, 0x6e, 0x68, 0x87, 0x64,
+ 0x85, 0x74, 0x8, 0xf7, 0xdb, 0xfb, 0x22, 0x15,
+ 0xb, 0xfc, 0xd0, 0x21, 0xa, 0xe, 0x99, 0x16,
+ 0xeb, 0x6, 0xd7, 0xf7, 0x77, 0x5, 0xf7, 0xb2,
+ 0x6, 0xdb, 0xfb, 0x77, 0x5, 0xf1, 0x6, 0xfb,
+ 0xab, 0xf9, 0x7c, 0x5, 0x2a, 0x6, 0x49, 0xfc,
+ 0x4b, 0x15, 0xf7, 0x4, 0xf7, 0xfd, 0x5, 0x8c,
+ 0x6, 0xf7, 0xb, 0xfb, 0xfd, 0x5, 0xb, 0x27,
+ 0x85, 0x45, 0x4c, 0x2a, 0x1b, 0x78, 0x7a, 0x92,
+ 0x9a, 0x7a, 0x1f, 0x7b, 0x9b, 0x84, 0x9c, 0x9e,
+ 0x1a, 0xae, 0x99, 0x9f, 0xa0, 0x97, 0x1e, 0xa0,
+ 0x97, 0x9d, 0x90, 0xa6, 0x8f, 0xbd, 0x94, 0xc7,
+ 0x94, 0xb1, 0x9a, 0x8, 0xe, 0x15, 0xf8, 0x2,
+ 0x6, 0xf7, 0x1c, 0x66, 0xd8, 0x55, 0xb0, 0x1e,
+ 0xb1, 0x55, 0x53, 0x90, 0x74, 0x1b, 0xfb, 0x38,
+ 0x8a, 0x4c, 0xfb, 0x8, 0x86, 0xfb, 0x32, 0x8,
+ 0x2d, 0xa, 0x7a, 0x7e, 0x3a, 0x22, 0x1b, 0x38,
+ 0x5d, 0xc3, 0xf7, 0x10, 0x7e, 0x1f, 0x90, 0xd3,
+ 0x15, 0x96, 0xce, 0xa2, 0xde, 0xf2, 0x8a, 0xec,
+ 0x8c, 0xab, 0x40, 0x90, 0x40, 0x8, 0xb, 0x41,
+ 0xa, 0xf9, 0x5d, 0x15, 0xfc, 0x2f, 0x7, 0xfb,
+ 0x13, 0x8f, 0xfb, 0x56, 0xf7, 0xa3, 0xf7, 0xac,
+ 0x95, 0xf7, 0x76, 0xea, 0x1e, 0xf8, 0x2f, 0x2c,
+ 0xfc, 0x2f, 0x7, 0xfb, 0x15, 0x78, 0x20, 0xfb,
+ 0x44, 0xfb, 0x48, 0x8b, 0xf7, 0x29, 0xe2, 0x1e,
+ 0xf8, 0x2f, 0x7, 0xb, 0xaa, 0x78, 0xe0, 0x2a,
+ 0xa, 0xb, 0x15, 0xef, 0x6, 0xc3, 0xde, 0xc0,
+ 0x38, 0x5, 0xef, 0x6, 0xfb, 0x2, 0x42, 0xa,
+ 0xb, 0x3b, 0x9f, 0x48, 0xb3, 0x5b, 0x1e, 0x5b,
+ 0xb4, 0xbe, 0x70, 0xdb, 0x1b, 0xcb, 0xb5, 0x9d,
+ 0xaa, 0xb0, 0x1f, 0xb2, 0xaa, 0xa4, 0xb5, 0x98,
+ 0xbc, 0x36, 0x96, 0x18, 0x6e, 0xb, 0x31, 0xa,
+ 0xf7, 0x49, 0x27, 0x31, 0xa, 0xb, 0x4c, 0xa,
+ 0xf7, 0x0, 0xf7, 0x1d, 0x38, 0xa, 0xb, 0x3,
+ 0xe1, 0x16, 0xf8, 0xa6, 0xe0, 0xfc, 0x47, 0xf7,
+ 0x90, 0xf8, 0x13, 0xe0, 0xfc, 0x13, 0xf7, 0x79,
+ 0xf8, 0x38, 0xe0, 0xfc, 0x97, 0x6, 0xb, 0x15,
+ 0xe5, 0xef, 0x31, 0x6, 0xb, 0x33, 0x6d, 0x2f,
+ 0x20, 0x24, 0x86, 0xdd, 0xe3, 0x1e, 0xf7, 0xb2,
+ 0x33, 0xfb, 0xd4, 0x7, 0xfb, 0x8, 0xcc, 0x2b,
+ 0xf7, 0x17, 0xb, 0xbb, 0xfb, 0xd, 0x15, 0x94,
+ 0x38, 0x55, 0xa, 0xa5, 0xec, 0xf2, 0xbe, 0x1f,
+ 0xf7, 0x5b, 0xf8, 0xa2, 0x5, 0x32, 0x6, 0xfb,
+ 0x27, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x25,
+ 0xf8, 0x37, 0x5, 0x2c, 0x6, 0xf7, 0x59, 0xfc,
+ 0x9a, 0x5, 0x43, 0x71, 0x80, 0x52, 0x41, 0x1b,
+ 0x76, 0x7c, 0x95, 0x8f, 0x7e, 0x1f, 0xb, 0x3d,
+ 0xa, 0x6, 0x13, 0xb8, 0x33, 0xfb, 0xa8, 0x6,
+ 0x32, 0xa, 0x1e, 0x13, 0x74, 0x65, 0xa, 0x1f,
+ 0xb, 0x46, 0xa, 0xf9, 0x4, 0x77, 0x1, 0x27,
+ 0xa, 0xb, 0x6e, 0xa, 0x30, 0xa, 0xb, 0x15,
+ 0xe8, 0x6, 0xf5, 0x5a, 0xa, 0x27, 0x6, 0x53,
+ 0x38, 0x56, 0xde, 0x5, 0x27, 0x6, 0xe, 0x5,
+ 0xfb, 0x7, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x62,
+ 0x77, 0x1, 0xb, 0xf7, 0x10, 0xf8, 0xe9, 0x2c,
+ 0xa, 0xb, 0xe3, 0x3, 0xe4, 0x16, 0xe3, 0xf8,
+ 0x56, 0xf0, 0xcf, 0x26, 0xc0, 0x6, 0xc7, 0xb4,
+ 0xa5, 0xe0, 0x7c, 0x1e, 0x99, 0xd5, 0x5, 0x94,
+ 0x6f, 0x74, 0x8d, 0x74, 0x1b, 0xfb, 0x3, 0x60,
+ 0x2a, 0x4e, 0x1f, 0x58, 0x40, 0x47, 0xd6, 0x7,
+ 0xb, 0xb2, 0x86, 0xf7, 0x20, 0xfb, 0x1f, 0xfb,
+ 0x1a, 0x83, 0xfb, 0x19, 0x5d, 0x1e, 0xd4, 0x16,
+ 0xb1, 0x8a, 0xde, 0xd1, 0xc4, 0x98, 0x52, 0x4b,
+ 0x5d, 0x84, 0x40, 0x4c, 0x47, 0x8a, 0xd7, 0xb8,
+ 0x1e, 0xb, 0x4e, 0xa, 0x3c, 0xda, 0x13, 0x74,
+ 0xf8, 0x2e, 0x88, 0x15, 0xda, 0xf8, 0x9c, 0xb,
+ 0xf7, 0x23, 0xf8, 0xf2, 0x2e, 0xa, 0xb, 0xf7,
+ 0x73, 0xf8, 0xe9, 0x2f, 0xa, 0xb, 0x7d, 0xda,
+ 0x5f, 0x76, 0xf8, 0x5e, 0xd3, 0xb, 0x1, 0xda,
+ 0xea, 0xf8, 0xb, 0xea, 0x3, 0xda, 0xb, 0x5a,
+ 0xa, 0x2e, 0x6, 0xb, 0x73, 0x8b, 0xe0, 0xf7,
+ 0x90, 0xe0, 0xf7, 0x79, 0xe0, 0xb, 0x39, 0xa,
+ 0xce, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xb, 0x1,
+ 0xbc, 0xef, 0xf8, 0x74, 0xef, 0x3, 0xb, 0x5f,
+ 0xa, 0xf7, 0x77, 0xd9, 0xb, 0x15, 0xe9, 0xf7,
+ 0x6, 0x5d, 0x6, 0x8c, 0xa7, 0x8d, 0xc5, 0xbe,
+ 0xa0, 0x75, 0xad, 0x18, 0x3b, 0x67, 0x8b, 0x3d,
+ 0x5a, 0x1a, 0xb, 0x15, 0xb9, 0x6, 0x8a, 0x6f,
+ 0x89, 0x50, 0x58, 0x76, 0xa1, 0x69, 0x18, 0xdb,
+ 0xaf, 0x8b, 0xda, 0xbc, 0x1a, 0xe6, 0x2d, 0x7,
+ 0xb, 0x12, 0xba, 0xe9, 0xf7, 0x8d, 0xe3, 0x13,
+ 0x7c, 0xb, 0x7c, 0xd3, 0xf7, 0x48, 0xd3, 0xf7,
+ 0x29, 0xd3, 0xb, 0xfc, 0x31, 0xa0, 0x76, 0xb,
+ 0x15, 0xd3, 0x6, 0xb, 0xdb, 0xaf, 0x8b, 0xd9,
+ 0xbc, 0x1a, 0xe7, 0x2d, 0xfb, 0x6, 0xb9, 0x7,
+ 0x8a, 0x6f, 0x89, 0x51, 0x58, 0x76, 0x8, 0xb,
+ 0x12, 0xcf, 0xe3, 0xf7, 0x89, 0xe3, 0xb, 0xe2,
+ 0x78, 0xdf, 0xf8, 0xe4, 0xe0, 0xb, 0xfd, 0x72,
+ 0x15, 0xe3, 0xf8, 0x99, 0x7a, 0xa, 0xfe, 0x35,
+ 0x15, 0xea, 0xf9, 0x60, 0x2c, 0x6, 0xe, 0xf7,
+ 0x2b, 0x76, 0xf8, 0x29, 0x77, 0x1, 0xb, 0x9e,
+ 0x1b, 0xa0, 0xd2, 0x91, 0xf5, 0x8f, 0x1f, 0x4b,
+ 0x6, 0x69, 0x87, 0x80, 0x83, 0x77, 0x1b, 0xb,
+ 0xfb, 0xfa, 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77,
+ 0x1, 0xb, 0x5, 0x87, 0x99, 0x8d, 0x85, 0xa4,
+ 0x1b, 0xf7, 0x7, 0xb, 0x1f, 0x4b, 0x6, 0x68,
+ 0x87, 0x80, 0x84, 0x77, 0x1b, 0xb, 0xf7, 0xad,
+ 0x16, 0xea, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+ 0x2e, 0x5, 0xfb, 0x2, 0x6, 0xb, 0x31, 0xa,
+ 0xf7, 0x37, 0x72, 0xa, 0x38, 0xa, 0xe, 0xf7,
+ 0x1d, 0x5, 0xb, 0xfb, 0x53, 0xa0, 0x76, 0xf8,
+ 0x56, 0xcf, 0xf7, 0x10, 0xd5, 0x1, 0xe4, 0xe3,
+ 0xb, 0x15, 0xb7, 0x6, 0x9c, 0xf7, 0x1e, 0x5,
+ 0xf7, 0x9, 0x3e, 0xfb, 0x9, 0x7, 0xb, 0x69,
+ 0x8a, 0xfb, 0x25, 0xf7, 0x23, 0xf7, 0x23, 0x8c,
+ 0xf7, 0x1a, 0xb8, 0xb, 0x4c, 0xa, 0x4a, 0x74,
+ 0xa, 0x73, 0xa0, 0x76, 0xb, 0x15, 0xc9, 0x6,
+ 0xf7, 0x2b, 0xf7, 0x21, 0x38, 0xa, 0xb, 0x4b,
+ 0xa, 0xfa, 0x35, 0x77, 0x1, 0xe5, 0xea, 0x3,
+ 0xb, 0x4b, 0xa, 0xf9, 0x72, 0x77, 0x1, 0xea,
+ 0xe3, 0x3, 0xb, 0x1, 0xaa, 0x16, 0xf8, 0x4a,
+ 0xd7, 0xfb, 0xde, 0x6, 0xf7, 0xce, 0xb, 0x15,
+ 0x5a, 0xb1, 0x63, 0xbc, 0xbc, 0xb3, 0xb3, 0xbc,
+ 0xbc, 0x63, 0xb, 0xa6, 0xc7, 0x8e, 0xe0, 0xc6,
+ 0xb, 0xfb, 0x4e, 0x76, 0xf7, 0x5e, 0xd3, 0xf8,
+ 0x26, 0xd0, 0x1, 0xb, 0x5, 0xc4, 0xfc, 0x28,
+ 0x43, 0xf7, 0xb7, 0x7, 0xfb, 0xc9, 0xb, 0xa0,
+ 0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0xfc, 0x31,
+ 0xfb, 0x58, 0xd4, 0xf9, 0x98, 0xd4, 0x12, 0xb,
+ 0x1, 0xa2, 0x16, 0xf8, 0xc9, 0xe0, 0xfc, 0x5c,
+ 0x6, 0xb, 0x15, 0xcc, 0x6, 0xba, 0x8a, 0xad,
+ 0x8b, 0x8f, 0x1b, 0xb, 0x3c, 0x96, 0x1e, 0xe1,
+ 0x97, 0x5, 0xb3, 0x84, 0x7a, 0xb, 0xe3, 0xec,
+ 0x7a, 0xa, 0x1, 0xe1, 0xea, 0xb, 0xa0, 0x76,
+ 0xf8, 0x62, 0xd7, 0x12, 0xcc, 0xe3, 0xb, 0xfb,
+ 0xfa, 0xfb, 0x4e, 0x76, 0xfa, 0x40, 0x77, 0xb,
+ 0x20, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xbb,
+ 0xb, 0x27, 0x31, 0xa, 0xe, 0x5a, 0x58, 0x68,
+ 0x3e, 0x8c, 0x1f, 0xe, 0xf7, 0x1d, 0x59, 0xa,
+ 0xf7, 0x5, 0x8a, 0x77, 0x12, 0xb, 0x7d, 0xd3,
+ 0xf8, 0x2a, 0xd3, 0xb, 0xb8, 0xe5, 0xf7, 0xb2,
+ 0xe5, 0xb, 0xf7, 0x54, 0xd9, 0xfb, 0x54, 0xb,
+ 0x7c, 0xd7, 0x60, 0x76, 0xb, 0x33, 0x6, 0xe
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
new file mode 100644
index 0000000000..594b37fe93
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldFontData [16344] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x12,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f, 0x6c,
+ 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10,
+ 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8,
+ 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3e, 0xfb,
+ 0x78, 0xfa, 0x7e, 0xfa, 0x56, 0x5, 0xf7, 0x2f,
+ 0xf, 0xf8, 0x8f, 0x11, 0xb5, 0x1c, 0x39, 0x77,
+ 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x42,
+ 0x50, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+ 0x73, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+ 0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+ 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46,
+ 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x81,
+ 0x1, 0x0, 0x84, 0x0, 0x0, 0x86, 0x2, 0x0,
+ 0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1,
+ 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0xc7,
+ 0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, 0x5, 0x0,
+ 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+ 0x0, 0x42, 0x1d, 0x1, 0x87, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x65, 0x0, 0x0, 0x76, 0x0, 0x0,
+ 0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0,
+ 0x0, 0x7a, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6b,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, 0x0, 0x0,
+ 0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x74, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0,
+ 0x0, 0xc6, 0x0, 0x0, 0x60, 0x2, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, 0x0, 0x0,
+ 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0,
+ 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d,
+ 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0,
+ 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0,
+ 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e,
+ 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0,
+ 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1,
+ 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf,
+ 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0,
+ 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0,
+ 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba,
+ 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0,
+ 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0,
+ 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1,
+ 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0,
+ 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1,
+ 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+ 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+ 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+ 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+ 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+ 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+ 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+ 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+ 0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0,
+ 0x4, 0x0, 0x7, 0x0, 0x2c, 0x0, 0x41, 0x0,
+ 0x75, 0x0, 0x84, 0x0, 0xb3, 0x0, 0xce, 0x0,
+ 0xd9, 0x0, 0xf1, 0x1, 0x30, 0x1, 0x6b, 0x1,
+ 0x9a, 0x1, 0xc3, 0x1, 0xf1, 0x2, 0x32, 0x2,
+ 0x5e, 0x2, 0x8a, 0x2, 0xed, 0x3, 0x76, 0x4,
+ 0x7, 0x4, 0xa5, 0x4, 0xc4, 0x4, 0xfb, 0x5,
+ 0x33, 0x5, 0x66, 0x5, 0x8c, 0x5, 0xbb, 0x5,
+ 0xcc, 0x5, 0xdf, 0x5, 0xf5, 0x6, 0x3f, 0x6,
+ 0x69, 0x6, 0xbc, 0x7, 0x1e, 0x7, 0x55, 0x7,
+ 0xa7, 0x8, 0xa, 0x8, 0x3e, 0x8, 0xaf, 0x9,
+ 0x14, 0x9, 0x34, 0x9, 0x6d, 0x9, 0x8c, 0x9,
+ 0xab, 0x9, 0xc9, 0xa, 0x2e, 0xa, 0xda, 0xb,
+ 0xd, 0xb, 0x6c, 0xb, 0xbc, 0xb, 0xfb, 0xc,
+ 0x24, 0xc, 0x48, 0xc, 0xc3, 0xc, 0xef, 0xd,
+ 0x2, 0xd, 0x33, 0xd, 0x64, 0xd, 0x78, 0xd,
+ 0xb8, 0xd, 0xdb, 0xe, 0x52, 0xe, 0x88, 0xf,
+ 0x1a, 0xf, 0x73, 0xf, 0xdc, 0xf, 0xfb, 0x10,
+ 0x32, 0x10, 0x50, 0x10, 0x93, 0x10, 0xc5, 0x10,
+ 0xdf, 0x10, 0xf9, 0x11, 0x13, 0x11, 0x2a, 0x11,
+ 0x44, 0x11, 0x65, 0x11, 0x72, 0x11, 0x88, 0x11,
+ 0xed, 0x12, 0x48, 0x12, 0x92, 0x12, 0xed, 0x13,
+ 0x43, 0x13, 0x79, 0x13, 0xe7, 0x14, 0x23, 0x14,
+ 0x3c, 0x14, 0x80, 0x14, 0xaf, 0x14, 0xba, 0x15,
+ 0x19, 0x15, 0x58, 0x15, 0xa2, 0x15, 0xef, 0x16,
+ 0x43, 0x16, 0x82, 0x16, 0xe4, 0x17, 0x1e, 0x17,
+ 0x60, 0x17, 0x85, 0x17, 0xc1, 0x17, 0xf3, 0x18,
+ 0x22, 0x18, 0x48, 0x18, 0x8c, 0x18, 0xa4, 0x18,
+ 0xea, 0x19, 0x2c, 0x19, 0xa7, 0x19, 0xcf, 0x1a,
+ 0x33, 0x1a, 0x70, 0x1a, 0xa3, 0x1a, 0xcd, 0x1b,
+ 0x5, 0x1b, 0x19, 0x1b, 0xcf, 0x1c, 0x49, 0x1c,
+ 0x5f, 0x1c, 0xda, 0x1d, 0x5, 0x1d, 0x2e, 0x1d,
+ 0x7f, 0x1d, 0xb8, 0x1d, 0xdb, 0x1d, 0xea, 0x1d,
+ 0xfa, 0x1e, 0x3e, 0x1e, 0x8c, 0x1f, 0x4, 0x1f,
+ 0x19, 0x1f, 0xaf, 0x1f, 0xda, 0x20, 0xa, 0x20,
+ 0x88, 0x21, 0x14, 0x21, 0x8e, 0x21, 0xd3, 0x21,
+ 0xf2, 0x22, 0x9b, 0x22, 0xab, 0x23, 0x1b, 0x23,
+ 0x95, 0x23, 0xa3, 0x23, 0xbd, 0x23, 0xcf, 0x24,
+ 0x4d, 0x24, 0x60, 0x24, 0x99, 0x24, 0xc7, 0x25,
+ 0x9, 0x25, 0x61, 0x25, 0x74, 0x25, 0xba, 0x25,
+ 0xec, 0x26, 0x4, 0x26, 0x3b, 0x26, 0x61, 0x26,
+ 0xa4, 0x26, 0xb1, 0x27, 0x19, 0x27, 0x96, 0x28,
+ 0x2f, 0x28, 0x85, 0x28, 0x9d, 0x28, 0xb6, 0x28,
+ 0xd5, 0x29, 0x1b, 0x29, 0x3d, 0x29, 0x71, 0x29,
+ 0xb8, 0x2a, 0x49, 0x2a, 0x59, 0x2a, 0x6a, 0x2a,
+ 0x91, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xe1, 0x2a,
+ 0xfc, 0x2b, 0x15, 0x2b, 0x63, 0x2b, 0xbb, 0x2b,
+ 0xe9, 0x2c, 0xd, 0x2c, 0x3a, 0x2c, 0x87, 0x2c,
+ 0xaf, 0x2c, 0xdf, 0x2d, 0x5f, 0x2d, 0x7c, 0x2d,
+ 0x98, 0x2d, 0xbf, 0x2d, 0xea, 0x2e, 0x1a, 0x2e,
+ 0x5d, 0x2e, 0xcc, 0x2e, 0xe3, 0x2e, 0xfa, 0x2f,
+ 0x1b, 0x2f, 0x77, 0x2f, 0x9f, 0x2f, 0xe5, 0x30,
+ 0x8f, 0x31, 0x1c, 0x31, 0x36, 0x31, 0x51, 0x31,
+ 0x73, 0x31, 0x97, 0x31, 0xae, 0x31, 0xc5, 0x31,
+ 0xe4, 0x32, 0x3, 0x32, 0x7c, 0x32, 0xf4, 0x33,
+ 0x11, 0x33, 0x24, 0x33, 0x42, 0x33, 0x80, 0x33,
+ 0xa8, 0x33, 0xd7, 0x34, 0x55, 0x34, 0x6b, 0x34,
+ 0x81, 0x34, 0xa8, 0x34, 0xd6, 0x35, 0x13, 0x35,
+ 0x67, 0x35, 0xac, 0xfc, 0x15, 0xe, 0xfc, 0x15,
+ 0xe, 0xf8, 0xf0, 0xcb, 0xdd, 0x77, 0x1, 0x89,
+ 0xf9, 0x82, 0x15, 0x22, 0x95, 0xd9, 0x62, 0xdb,
+ 0x1b, 0xda, 0xdb, 0xb3, 0xf5, 0x95, 0x1f, 0x4b,
+ 0x6, 0x78, 0x8a, 0x7b, 0x4c, 0x33, 0x1b, 0x4a,
+ 0x6a, 0xb2, 0xb6, 0x85, 0x1f, 0xe, 0xf8, 0xfa,
+ 0xf7, 0x7, 0x1, 0xf3, 0xf7, 0x12, 0x3, 0xf3,
+ 0xf8, 0xfa, 0x15, 0xf7, 0x12, 0xf7, 0x7, 0xfb,
+ 0x12, 0x6, 0xe, 0xf8, 0xcc, 0xc4, 0xe9, 0xc4,
+ 0x1, 0xc6, 0xc6, 0xed, 0xc6, 0x3, 0xc6, 0xf9,
+ 0x35, 0x15, 0x51, 0xbc, 0x5c, 0xc7, 0xc4, 0xbd,
+ 0xb8, 0xc7, 0xc6, 0x5a, 0xb7, 0x51, 0x4d, 0x5c,
+ 0x5e, 0x51, 0x1e, 0xc6, 0x16, 0xa5, 0xa0, 0x9f,
+ 0xa8, 0xa5, 0xa1, 0x78, 0x70, 0x70, 0x75, 0x76,
+ 0x71, 0x6f, 0x75, 0xa0, 0xa6, 0x1e, 0xe, 0xf8,
+ 0xf0, 0x84, 0xa, 0x94, 0xf8, 0xf0, 0x6b, 0xa,
+ 0xef, 0xfb, 0x26, 0x6b, 0xa, 0xe, 0xfb, 0x78,
+ 0xd8, 0xf7, 0x2b, 0x77, 0x1, 0xd2, 0xe2, 0x3,
+ 0xe5, 0x16, 0x80, 0x61, 0x83, 0x6a, 0x67, 0x1a,
+ 0x35, 0xdd, 0x6c, 0xcc, 0x9c, 0xa5, 0x8e, 0x9c,
+ 0xb6, 0x1e, 0xd0, 0x7, 0x87, 0x80, 0x61, 0x83,
+ 0x6a, 0x1b, 0x53, 0x87, 0xac, 0xb8, 0xa3, 0x8e,
+ 0xa7, 0x93, 0xa0, 0x1f, 0xe, 0xf8, 0xf0, 0xd1,
+ 0x1, 0xed, 0xf8, 0xf0, 0x15, 0xf7, 0x1b, 0x6,
+ 0xf7, 0x2, 0x83, 0xa, 0xfb, 0xa, 0x6, 0x52,
+ 0x3f, 0x4e, 0xd7, 0x5, 0xfb, 0x9, 0x6, 0xe,
+ 0xfc, 0x15, 0x73, 0xa, 0xd3, 0x63, 0xa, 0xf8,
+ 0xa8, 0x6d, 0xa, 0xfc, 0x84, 0x8d, 0x76, 0xf9,
+ 0x6d, 0x77, 0x1, 0x2f, 0x78, 0x15, 0xf8, 0x40,
+ 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0x40, 0xfd,
+ 0x6d, 0x5, 0xe, 0x57, 0x76, 0xa, 0xd2, 0xf7,
+ 0x13, 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x43, 0x7d,
+ 0xa, 0xe2, 0x16, 0xf7, 0x20, 0xf8, 0x2c, 0xf4,
+ 0xf7, 0x1, 0x22, 0x6, 0xf4, 0xc5, 0x96, 0xca,
+ 0x78, 0x1e, 0x9f, 0xeb, 0x5, 0x98, 0x5f, 0x73,
+ 0x8f, 0x6f, 0x1b, 0xfb, 0x37, 0x6f, 0xa, 0xf7,
+ 0xcf, 0xfc, 0x2c, 0x15, 0xf7, 0x20, 0xf8, 0x99,
+ 0x68, 0xa, 0xd2, 0x4, 0xf7, 0x20, 0xf7, 0x13,
+ 0x6d, 0xa, 0x57, 0x76, 0xa, 0xf7, 0x66, 0x77,
+ 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x44, 0xf7, 0x1f,
+ 0x3, 0xf8, 0x27, 0x16, 0xf7, 0x1f, 0xf9, 0x5f,
+ 0xfb, 0x1f, 0x6, 0xfb, 0xd0, 0xfd, 0x5f, 0x15,
+ 0xf7, 0x20, 0xf8, 0x2c, 0xf3, 0xf7, 0x1, 0x23,
+ 0x6, 0xdf, 0xb1, 0xab, 0xde, 0x78, 0x1e, 0x9e,
+ 0xeb, 0x5, 0x98, 0x5f, 0x74, 0x8f, 0x6e, 0x1b,
+ 0xfb, 0x36, 0x6f, 0xa, 0xe, 0x86, 0xa, 0xa7,
+ 0xf7, 0x16, 0x3, 0xc6, 0x16, 0xf8, 0xa0, 0xf7,
+ 0xe, 0xfc, 0x1e, 0xf7, 0x7c, 0x6, 0xf7, 0x3b,
+ 0xf7, 0x1a, 0x5, 0xf7, 0xc, 0x7, 0xfb, 0x3b,
+ 0xfb, 0x1c, 0x5, 0xf7, 0x8a, 0xfb, 0x16, 0xfb,
+ 0xf9, 0x7, 0x3c, 0x4a, 0x5, 0xfb, 0x9, 0x7,
+ 0xda, 0xcb, 0x5, 0xe, 0xfc, 0x15, 0x3f, 0xa,
+ 0xd1, 0xf7, 0xa, 0x3, 0xd1, 0x16, 0xf7, 0xa,
+ 0xf7, 0xfa, 0x6, 0xf7, 0x0, 0xd8, 0x5, 0xe9,
+ 0x7, 0xfb, 0x0, 0x3d, 0x5, 0xf7, 0x9f, 0xfb,
+ 0xa, 0xfb, 0xf6, 0x7, 0x33, 0x48, 0x5, 0x2d,
+ 0x7, 0xe3, 0xcf, 0x5, 0xe, 0x57, 0x8b, 0xf7,
+ 0xd, 0xf8, 0x6e, 0x82, 0xa, 0xa4, 0x16, 0xf8,
+ 0xc5, 0xf7, 0xd, 0x87, 0xa, 0xf7, 0x5, 0xfc,
+ 0x8e, 0xfb, 0xd, 0x8c, 0xa, 0xf7, 0x6e, 0xf9,
+ 0x2d, 0x15, 0xf7, 0xf, 0x6, 0xee, 0xf7, 0x21,
+ 0x5, 0x20, 0x6, 0x58, 0x42, 0x54, 0xd4, 0x5,
+ 0x21, 0x6, 0xe, 0xfb, 0x37, 0x8b, 0xf7, 0xd,
+ 0xf7, 0xaf, 0xf7, 0x6, 0xe5, 0xf7, 0x22, 0x1,
+ 0x9f, 0x16, 0xf8, 0x60, 0xf7, 0xd, 0xfb, 0xad,
+ 0x6, 0xf7, 0x9d, 0xf7, 0xc0, 0x5, 0xec, 0xfc,
+ 0x3d, 0xfb, 0x6, 0x7, 0xf7, 0x88, 0x8c, 0xfb,
+ 0x9b, 0xfb, 0xbe, 0x5, 0xf7, 0x3b, 0xf8, 0x89,
+ 0x15, 0xf7, 0x12, 0x6, 0xf1, 0xf7, 0x22, 0x5,
+ 0xfb, 0x2, 0x6, 0x56, 0x42, 0x53, 0xd4, 0x5,
+ 0xfb, 0x1, 0x6, 0xe, 0x8b, 0xf7, 0x1d, 0xf8,
+ 0xd9, 0x77, 0x12, 0xe5, 0xf7, 0x28, 0xfb, 0x28,
+ 0xf7, 0x2e, 0x13, 0xe0, 0xe8, 0x16, 0xf7, 0x25,
+ 0xf7, 0x1d, 0xfb, 0x25, 0x6, 0xab, 0xbc, 0x15,
+ 0xdd, 0x6, 0x13, 0xd0, 0xb0, 0xf8, 0x0, 0x5,
+ 0xf7, 0x3c, 0xfb, 0x2e, 0xfb, 0x3c, 0x7, 0xe,
+ 0xfb, 0x51, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+ 0x1, 0xf7, 0xb3, 0xf8, 0x53, 0x15, 0xd3, 0x6,
+ 0x9c, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x1, 0xfb,
+ 0x14, 0x7, 0xfb, 0x2a, 0xfb, 0x23, 0x15, 0xd4,
+ 0x6, 0x9b, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x0,
+ 0xfb, 0x14, 0x7, 0xe, 0x20, 0xa0, 0x76, 0xf7,
+ 0x47, 0xf2, 0xf7, 0x1c, 0xf2, 0xf7, 0x45, 0x77,
+ 0x1, 0xb8, 0x16, 0xf6, 0x6, 0xb0, 0xf7, 0x47,
+ 0x5, 0xf4, 0x6, 0x67, 0xfb, 0x47, 0x5, 0xf4,
+ 0x6, 0xb1, 0xf7, 0x47, 0x5, 0xf7, 0x1d, 0xf2,
+ 0xfb, 0x7, 0x6, 0xa7, 0xf7, 0x1c, 0x5, 0xe2,
+ 0xf2, 0x49, 0x6, 0xb1, 0xf7, 0x45, 0x5, 0xfb,
+ 0x2, 0x6, 0x66, 0xfb, 0x45, 0x5, 0x24, 0x6,
+ 0xaf, 0xf7, 0x45, 0x5, 0x22, 0x6, 0x65, 0xfb,
+ 0x45, 0x5, 0xfb, 0x1b, 0x24, 0xf7, 0x6, 0x6,
+ 0x6e, 0xfb, 0x1c, 0x5, 0x36, 0x24, 0xcb, 0x6,
+ 0xf7, 0x14, 0xf2, 0x15, 0xa7, 0xf7, 0x1c, 0x5,
+ 0xf4, 0x6, 0x6f, 0xfb, 0x1c, 0x5, 0xe, 0x20,
+ 0x2d, 0x76, 0xfa, 0xe, 0x77, 0x12, 0xf7, 0x85,
+ 0xd4, 0xdf, 0xf7, 0x11, 0x17, 0xa9, 0xf7, 0x54,
+ 0x15, 0x9b, 0x24, 0xc2, 0x2a, 0xf7, 0x20, 0x7b,
+ 0x8, 0x30, 0xd4, 0xe8, 0x7, 0xf7, 0x44, 0xa4,
+ 0xac, 0xf7, 0x7, 0xd0, 0x1a, 0xf7, 0x34, 0xfb,
+ 0x19, 0xc0, 0x3f, 0xa0, 0x1e, 0xf7, 0x56, 0x7,
+ 0xbb, 0x77, 0x94, 0x62, 0x8e, 0x79, 0xf7, 0x13,
+ 0x9b, 0x18, 0x71, 0xf7, 0x2e, 0xfb, 0x13, 0x9a,
+ 0x69, 0x8f, 0x8, 0x13, 0x70, 0xbd, 0x7, 0x42,
+ 0x59, 0x6, 0x24, 0x81, 0x34, 0x46, 0xfb, 0xe,
+ 0x1a, 0xfb, 0x32, 0xf7, 0x17, 0x5c, 0xc6, 0x7b,
+ 0x1e, 0xfb, 0x64, 0x7, 0x74, 0x96, 0x60, 0xab,
+ 0x7e, 0xcf, 0x8, 0xf7, 0x2c, 0xfb, 0xa, 0x15,
+ 0xf7, 0x56, 0x7, 0xa1, 0x85, 0xc9, 0x79, 0x44,
+ 0x1a, 0x60, 0x6f, 0x5d, 0x53, 0x81, 0x1e, 0x42,
+ 0xf7, 0xf9, 0x15, 0x4a, 0xa7, 0x8a, 0xb5, 0x94,
+ 0x1a, 0xad, 0xa1, 0xb7, 0xb7, 0x99, 0x1e, 0xe,
+ 0xf7, 0x76, 0x78, 0xd5, 0xf7, 0x69, 0xd5, 0x90,
+ 0xd5, 0xf7, 0x69, 0xd5, 0x8d, 0x77, 0x12, 0xa7,
+ 0xf7, 0x4, 0xf3, 0xf7, 0x4, 0xf7, 0x45, 0xf7,
+ 0x4, 0xf3, 0xf7, 0x4, 0x13, 0xf7, 0x80, 0xf7,
+ 0x20, 0xf8, 0xa4, 0x15, 0xd2, 0x98, 0xae, 0xb2,
+ 0xb3, 0x97, 0x67, 0x45, 0x42, 0x7f, 0x69, 0x63,
+ 0x63, 0x7f, 0xaf, 0xd2, 0x1e, 0xfb, 0x4, 0x16,
+ 0x2d, 0xaf, 0x34, 0xf7, 0x14, 0xf7, 0x29, 0x9a,
+ 0xf7, 0xd, 0xc7, 0xf6, 0x5e, 0xd4, 0xfb, 0xb,
+ 0xfb, 0x28, 0x7b, 0xfb, 0xd, 0x50, 0x1e, 0xf7,
+ 0x3b, 0xfc, 0xb7, 0x15, 0xf6, 0x6, 0x13, 0xef,
+ 0x80, 0xf8, 0x1f, 0xf9, 0x6d, 0x5, 0x24, 0x6,
+ 0x4e, 0xfc, 0xba, 0x15, 0x2d, 0xb0, 0x36, 0xf7,
+ 0x15, 0xf7, 0x27, 0x9a, 0xf7, 0xb, 0xc9, 0xf6,
+ 0x5e, 0xd4, 0xfb, 0xa, 0xfb, 0x2a, 0x7c, 0xfb,
+ 0xd, 0x4e, 0x1e, 0xf7, 0x4, 0x8e, 0x15, 0xd3,
+ 0x97, 0xac, 0xb3, 0xb3, 0x97, 0x68, 0x45, 0x43,
+ 0x7f, 0x67, 0x63, 0x63, 0x7f, 0xb0, 0xd2, 0x1e,
+ 0xe, 0xc6, 0x7e, 0xf7, 0x4, 0x2a, 0x76, 0xf9,
+ 0x15, 0xeb, 0x12, 0xc1, 0xf7, 0x1e, 0x59, 0xf7,
+ 0x17, 0x13, 0x68, 0xf8, 0x8e, 0xca, 0x15, 0xa5,
+ 0x72, 0xb5, 0x69, 0xb9, 0x74, 0xdc, 0xf5, 0x18,
+ 0x75, 0x94, 0x52, 0xb3, 0x6c, 0xa9, 0x9c, 0xa1,
+ 0x9c, 0xa7, 0xa5, 0xeb, 0xfb, 0xd, 0xa6, 0x18,
+ 0x87, 0x7a, 0x81, 0x69, 0x7c, 0x6d, 0x29, 0xf7,
+ 0x16, 0x18, 0xda, 0xbe, 0xbc, 0xb8, 0xd4, 0x1a,
+ 0xe5, 0x42, 0xd2, 0xfb, 0xd, 0xfb, 0xe, 0x42,
+ 0x40, 0x35, 0x57, 0xa7, 0x5e, 0xb7, 0x59, 0x1e,
+ 0x13, 0xb0, 0x68, 0x79, 0xfb, 0x11, 0x4c, 0xfb,
+ 0x1c, 0x1a, 0x54, 0xa6, 0xfb, 0x2b, 0xf7, 0x6b,
+ 0xf7, 0x4, 0xc7, 0xb4, 0xae, 0xb1, 0x1e, 0x36,
+ 0xe5, 0x15, 0x76, 0x71, 0x64, 0x6a, 0x4f, 0x1b,
+ 0x43, 0x6b, 0xb8, 0xbc, 0xb5, 0xa3, 0xc0, 0xcf,
+ 0xae, 0x1f, 0xbd, 0xf7, 0x29, 0x15, 0x6c, 0xaf,
+ 0x5, 0x13, 0xa8, 0x89, 0x8e, 0x6f, 0x8f, 0xb5,
+ 0x1a, 0xa5, 0x9e, 0xb2, 0xb8, 0xbf, 0xa3, 0x66,
+ 0x6f, 0x74, 0x7c, 0x7e, 0x7a, 0x7d, 0x1e, 0x7a,
+ 0x7c, 0x77, 0x7e, 0x81, 0x84, 0x8, 0xe, 0xfc,
+ 0x3d, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1,
+ 0x7e, 0x85, 0xa, 0xc3, 0xf8, 0x53, 0x15, 0xf7,
+ 0x8, 0x6, 0x9b, 0xf7, 0x22, 0x5, 0xf7, 0x15,
+ 0xfb, 0x28, 0xfb, 0x15, 0x7, 0xe, 0xfb, 0x4f,
+ 0x76, 0xfa, 0x42, 0x77, 0x1, 0xae, 0x85, 0xa,
+ 0xf7, 0x63, 0xfb, 0x64, 0x15, 0xf5, 0x6, 0x61,
+ 0xdb, 0x33, 0xf7, 0x39, 0xf7, 0x73, 0x1a, 0xf7,
+ 0x52, 0xc0, 0xf7, 0x16, 0xd9, 0xf7, 0x2e, 0x1e,
+ 0x22, 0x6, 0x34, 0xfb, 0x4, 0x34, 0xfb, 0x39,
+ 0xfb, 0x59, 0x1a, 0xfb, 0x3b, 0xd0, 0xfb, 0x35,
+ 0xf2, 0xfb, 0x20, 0x1e, 0xe, 0xfb, 0x4f, 0x76,
+ 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x29, 0xf7, 0x29,
+ 0x3, 0x9e, 0xfb, 0x64, 0x15, 0xf4, 0x6, 0xe2,
+ 0xf7, 0x4, 0xe2, 0xf7, 0x35, 0xf7, 0x59, 0x1a,
+ 0xf7, 0x3b, 0x46, 0xf7, 0x39, 0x24, 0xf7, 0x20,
+ 0x1e, 0x21, 0x6, 0xb5, 0x3b, 0xe2, 0xfb, 0x3d,
+ 0xfb, 0x73, 0x1a, 0xfb, 0x52, 0x57, 0xfb, 0x12,
+ 0x3d, 0xfb, 0x2e, 0x1e, 0xe, 0xfb, 0xa6, 0x4d,
+ 0xa, 0xf7, 0x30, 0xd2, 0x3, 0xf7, 0x13, 0xf8,
+ 0x17, 0x15, 0xcc, 0xf7, 0x1, 0xc9, 0x21, 0xd1,
+ 0xbb, 0x3a, 0xeb, 0xf7, 0xb, 0xa2, 0x72, 0xe1,
+ 0xfb, 0x8, 0x57, 0x97, 0xf7, 0x13, 0x5, 0x39,
+ 0x6, 0x96, 0xfb, 0x12, 0xfb, 0x1, 0xc2, 0x71,
+ 0x38, 0xf7, 0x9, 0x6d, 0x34, 0x2f, 0x5, 0xe,
+ 0x3c, 0xa0, 0x76, 0xf7, 0x52, 0xf7, 0x15, 0xf7,
+ 0x4f, 0x90, 0xa, 0xf7, 0x52, 0x15, 0xf7, 0x50,
+ 0xfb, 0x52, 0xf7, 0x13, 0xf7, 0x52, 0xf7, 0x51,
+ 0xf7, 0x15, 0xfb, 0x51, 0xf7, 0x4f, 0xfb, 0x13,
+ 0xfb, 0x4f, 0xfb, 0x50, 0x6, 0xe, 0xfc, 0x15,
+ 0xfb, 0x27, 0x76, 0xf7, 0x51, 0x76, 0xf7, 0x26,
+ 0x77, 0x12, 0xd7, 0xf7, 0x1e, 0x44, 0xd2, 0x13,
+ 0xf0, 0xd7, 0x16, 0x13, 0xe8, 0xce, 0x6, 0x89,
+ 0x38, 0x58, 0x7c, 0x71, 0x82, 0xa6, 0x4e, 0x18,
+ 0xf7, 0xf, 0xba, 0x8b, 0xec, 0xcd, 0x1a, 0xf3,
+ 0x7, 0x13, 0xf0, 0x81, 0xa, 0xf7, 0x6b, 0xf7,
+ 0x16, 0x1, 0xa6, 0xf7, 0x6b, 0x15, 0xf7, 0xab,
+ 0xf7, 0x16, 0xfb, 0xab, 0x6, 0xe, 0xfc, 0x15,
+ 0x8b, 0x84, 0xa, 0xcb, 0xf7, 0x2a, 0x3, 0xcb,
+ 0x16, 0xf7, 0x2a, 0xf7, 0x26, 0xfb, 0x2a, 0x6,
+ 0xe, 0xfc, 0x15, 0x86, 0x76, 0xf9, 0x8f, 0x77,
+ 0x1, 0x76, 0xf7, 0x11, 0x3, 0x6a, 0x78, 0x15,
+ 0xf7, 0x11, 0x6, 0xf7, 0x6f, 0x93, 0xa, 0x79,
+ 0xa, 0xf8, 0x89, 0xf7, 0x6, 0x1, 0xab, 0xf7,
+ 0x2c, 0xf7, 0x50, 0xf7, 0x2c, 0x3, 0xab, 0xf7,
+ 0xf5, 0x15, 0xfb, 0x21, 0xa2, 0xfb, 0x7b, 0xf7,
+ 0x74, 0xf7, 0x6d, 0xa7, 0xf7, 0x7d, 0xf7, 0x1d,
+ 0xf7, 0x20, 0x72, 0xf7, 0x6f, 0xfb, 0x72, 0xfb,
+ 0x70, 0x72, 0xfb, 0x6f, 0xfb, 0x1e, 0x1e, 0xf7,
+ 0x2c, 0x89, 0x15, 0xf7, 0x53, 0xa4, 0xc1, 0xcf,
+ 0xd1, 0xa4, 0x54, 0xfb, 0x52, 0xfb, 0x52, 0x72,
+ 0x49, 0x45, 0x47, 0x72, 0xcc, 0xf7, 0x53, 0x1e,
+ 0xe, 0x20, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1,
+ 0xf7, 0x87, 0xf7, 0x1b, 0x3, 0xf7, 0x87, 0x16,
+ 0xf7, 0x1b, 0xf9, 0x5a, 0xfb, 0x2, 0x6, 0x61,
+ 0xfb, 0xc, 0xfb, 0x23, 0x56, 0x7d, 0x86, 0x8,
+ 0xfb, 0xe, 0x7, 0xe1, 0xa7, 0xc5, 0xba, 0xa9,
+ 0xa7, 0x8, 0xe, 0x20, 0x8b, 0xf7, 0x12, 0xf8,
+ 0x6b, 0xf7, 0x5, 0x1, 0xb5, 0xf7, 0x1e, 0xf7,
+ 0x55, 0xf7, 0x1e, 0x3, 0xa5, 0x16, 0xf8, 0x79,
+ 0xf7, 0x12, 0xfb, 0xa7, 0x6, 0x9e, 0xab, 0xa2,
+ 0xa0, 0xd2, 0xcb, 0x8, 0xd1, 0xca, 0xe7, 0xd5,
+ 0xf7, 0x10, 0x1a, 0xe3, 0x4a, 0xf7, 0xa, 0xfb,
+ 0x3b, 0xfb, 0x17, 0x21, 0x2d, 0xfb, 0x7, 0x1e,
+ 0xf7, 0x1e, 0x7d, 0x5, 0xd3, 0x90, 0xa9, 0xb1,
+ 0xcb, 0x1b, 0xc8, 0xac, 0x63, 0x56, 0x43, 0x5b,
+ 0x64, 0x2b, 0x33, 0x1f, 0xfb, 0x1e, 0xfb, 0x12,
+ 0x55, 0x41, 0x80, 0x22, 0x8, 0xe, 0x79, 0xa,
+ 0xf8, 0x83, 0xf7, 0x6, 0x1, 0xf7, 0xe6, 0xf7,
+ 0x25, 0x3, 0xa6, 0xf7, 0x4a, 0x15, 0x25, 0x97,
+ 0xda, 0x28, 0xf7, 0x2a, 0x1b, 0xf7, 0x1d, 0xf7,
+ 0x3, 0xeb, 0xf7, 0x16, 0xe1, 0x56, 0xcd, 0x35,
+ 0x9c, 0x1f, 0x8d, 0x7, 0xa5, 0x97, 0xda, 0xae,
+ 0xe9, 0x1a, 0xdf, 0x3b, 0xf6, 0xfb, 0x22, 0xfb,
+ 0x4f, 0x72, 0xfb, 0x22, 0x5f, 0x80, 0x1e, 0xf7,
+ 0x17, 0x75, 0x5, 0xd4, 0x94, 0xb9, 0xa0, 0xb0,
+ 0x1b, 0xbd, 0xaa, 0x6c, 0x5d, 0x43, 0x4c, 0x75,
+ 0x55, 0x8c, 0x1f, 0x7c, 0xfb, 0x3, 0x5, 0xdd,
+ 0xad, 0xdb, 0x56, 0x32, 0x1a, 0x55, 0x6c, 0x51,
+ 0x43, 0x48, 0x6c, 0xc0, 0xbd, 0x85, 0x1e, 0xe,
+ 0x20, 0xa0, 0x76, 0xf7, 0x23, 0xf7, 0xc, 0xf8,
+ 0x53, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x14, 0x3,
+ 0xa6, 0xf7, 0x23, 0x15, 0xf7, 0xb1, 0xfb, 0x23,
+ 0xf7, 0x14, 0xf7, 0x23, 0xe1, 0xf7, 0xc, 0x35,
+ 0xf8, 0x53, 0x7c, 0xa, 0xfb, 0xc1, 0xfc, 0x54,
+ 0x5, 0xf7, 0x11, 0x8c, 0x15, 0xf7, 0x32, 0xf7,
+ 0x86, 0x5, 0x8d, 0xfb, 0x86, 0x6, 0xe, 0x79,
+ 0xa, 0xf8, 0x7f, 0xf7, 0x11, 0x1, 0xf8, 0x3f,
+ 0xf7, 0x23, 0x3, 0xa6, 0xf7, 0x48, 0x15, 0xfb,
+ 0x11, 0x9b, 0xec, 0x41, 0xf7, 0x13, 0x1b, 0xf7,
+ 0x3e, 0xda, 0xf7, 0x1e, 0xf7, 0x7, 0x1f, 0x8a,
+ 0xf7, 0x5e, 0xfb, 0x38, 0xe8, 0xfb, 0x2c, 0x46,
+ 0xa1, 0xf7, 0x19, 0x18, 0xf7, 0x9b, 0xf7, 0x11,
+ 0xfc, 0x5, 0x6, 0x44, 0xfc, 0x11, 0xf7, 0x5,
+ 0x7b, 0xbb, 0xbf, 0xc1, 0x96, 0xb4, 0x7a, 0x19,
+ 0xb6, 0x7a, 0xa9, 0x53, 0x4f, 0x1a, 0x23, 0x54,
+ 0x68, 0x58, 0x5c, 0x60, 0xa6, 0xd3, 0x80, 0x1e,
+ 0xe, 0x79, 0xa, 0xf7, 0x99, 0xef, 0xf7, 0x20,
+ 0xf7, 0x6, 0x1, 0xaa, 0xf7, 0x31, 0x3, 0xf7,
+ 0x44, 0xf8, 0x23, 0x15, 0xd5, 0x90, 0x96, 0xf7,
+ 0xf, 0xee, 0x1b, 0xd2, 0x92, 0x4d, 0x7b, 0x8d,
+ 0x1f, 0xf7, 0x1b, 0x99, 0x5, 0xf6, 0x77, 0x3f,
+ 0xd2, 0xfb, 0xb, 0x1b, 0xfb, 0x8a, 0x7d, 0xfb,
+ 0xc4, 0x4a, 0xfb, 0x4d, 0xe6, 0xfb, 0x43, 0xf7,
+ 0x3d, 0xf7, 0x20, 0xe4, 0xee, 0xf7, 0x22, 0xf7,
+ 0x22, 0xfb, 0x6, 0xe7, 0xfb, 0x7, 0x52, 0x5e,
+ 0x6f, 0x6e, 0x7e, 0x1f, 0x97, 0xfb, 0x45, 0x15,
+ 0xf7, 0x7, 0xdf, 0x9e, 0x9e, 0xec, 0x85, 0xfb,
+ 0x9, 0x7a, 0x77, 0x8a, 0x20, 0x31, 0x48, 0x67,
+ 0xc4, 0xd1, 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf8,
+ 0xe1, 0xf7, 0x10, 0x12, 0xf7, 0x14, 0xf7, 0x22,
+ 0x17, 0xf7, 0x14, 0x16, 0xf7, 0x22, 0x6, 0x13,
+ 0xe0, 0xf7, 0x6e, 0xf7, 0x12, 0xf7, 0x9c, 0xf7,
+ 0x18, 0xf7, 0xd, 0x1e, 0xea, 0xfc, 0x8b, 0xfb,
+ 0x10, 0xf7, 0xe3, 0x7, 0xfb, 0xb, 0xfb, 0x1d,
+ 0xfb, 0x5, 0xfb, 0x6f, 0xfb, 0x6e, 0x1a, 0xe,
+ 0x20, 0x78, 0xf7, 0x2, 0xf8, 0x8d, 0xf7, 0x2,
+ 0x1, 0xab, 0xf7, 0x23, 0xf7, 0x62, 0xf7, 0x23,
+ 0x3, 0xf7, 0x31, 0xf8, 0xe, 0x15, 0x3b, 0x6a,
+ 0x5e, 0x57, 0x36, 0x1a, 0xfb, 0x21, 0xf7, 0x4,
+ 0x35, 0xf7, 0x18, 0xf7, 0x1e, 0xf7, 0x2, 0xe3,
+ 0xf7, 0x1f, 0xc7, 0x72, 0xd1, 0x25, 0xb3, 0x1e,
+ 0xd1, 0xa9, 0xab, 0xc0, 0xc9, 0x1a, 0xe6, 0x4a,
+ 0xeb, 0xfb, 0x32, 0xfb, 0x34, 0x4c, 0x2b, 0x30,
+ 0x36, 0xc0, 0x64, 0xbe, 0x76, 0x1e, 0xa8, 0xf7,
+ 0x25, 0x15, 0xb3, 0xa4, 0xb0, 0xcc, 0xbc, 0xb4,
+ 0x74, 0x55, 0x3c, 0x47, 0x7c, 0x75, 0x77, 0x45,
+ 0x99, 0xdb, 0x1e, 0x80, 0xfb, 0xcf, 0x15, 0xa9,
+ 0x9a, 0xdc, 0xe1, 0xd4, 0xab, 0x51, 0x56, 0x2c,
+ 0x48, 0x75, 0x65, 0x59, 0x58, 0xac, 0xdf, 0x1e,
+ 0xe, 0x79, 0xa, 0xf7, 0x20, 0xef, 0xf7, 0x99,
+ 0xf7, 0x6, 0x1, 0xa9, 0xf7, 0x1f, 0xf7, 0x41,
+ 0xf7, 0x33, 0x3, 0xb7, 0xf7, 0x33, 0x15, 0x25,
+ 0x8e, 0xdd, 0x3f, 0xf7, 0x10, 0x1b, 0xf7, 0xa1,
+ 0x8b, 0xf7, 0xc4, 0xcc, 0xf7, 0x4e, 0x46, 0xf7,
+ 0x42, 0xfb, 0x55, 0xfb, 0x21, 0x32, 0x28, 0xfb,
+ 0x22, 0xfb, 0x22, 0xf7, 0x2, 0x2f, 0xf7, 0x8,
+ 0xa6, 0xb8, 0x90, 0xc1, 0xb9, 0x1f, 0x8d, 0x89,
+ 0x5, 0x41, 0x86, 0x78, 0xfb, 0xf, 0x28, 0x1b,
+ 0x44, 0x8b, 0xc9, 0x9b, 0x89, 0x1f, 0x80, 0xf7,
+ 0xbc, 0x15, 0x9f, 0x8b, 0xf6, 0xe6, 0xce, 0xaf,
+ 0x47, 0x44, 0xfb, 0x7, 0x33, 0x84, 0x78, 0x2a,
+ 0x95, 0xf7, 0x9, 0x9c, 0x1e, 0xe, 0x8b, 0xf7,
+ 0x19, 0xf7, 0x89, 0xf7, 0x1a, 0x1, 0xe7, 0xf7,
+ 0x2a, 0x3, 0xe7, 0x16, 0xf7, 0x2a, 0xf7, 0x19,
+ 0xfb, 0x2a, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x2a,
+ 0xf7, 0x1a, 0xfb, 0x2a, 0x6, 0xe, 0xfb, 0x27,
+ 0x76, 0xf7, 0x4a, 0x76, 0xf8, 0x12, 0xf7, 0x1d,
+ 0x12, 0xf3, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0,
+ 0xf3, 0x84, 0x15, 0x13, 0xe8, 0xce, 0x6, 0x2c,
+ 0x56, 0x8b, 0x71, 0x82, 0x1e, 0xa6, 0x52, 0x5,
+ 0xf7, 0xf, 0xb7, 0x8b, 0xe9, 0xc9, 0x1a, 0xed,
+ 0x7, 0x13, 0xf0, 0xfb, 0x1e, 0x6, 0xf7, 0x89,
+ 0x4, 0xf7, 0x1e, 0xf7, 0x1d, 0x81, 0xa, 0x91,
+ 0xa, 0xf7, 0x58, 0x15, 0xf8, 0x90, 0xfb, 0x60,
+ 0x5, 0xf7, 0x18, 0x7, 0xfb, 0xf6, 0xf7, 0x14,
+ 0xf7, 0xf6, 0xf7, 0x15, 0x5, 0xf7, 0x19, 0x7,
+ 0xfc, 0x90, 0xfb, 0x62, 0x5, 0xe, 0x3c, 0xe2,
+ 0xf7, 0xe, 0xe4, 0x82, 0xa, 0xb3, 0xf8, 0x8c,
+ 0x3, 0xb3, 0xe2, 0x15, 0xf8, 0x8c, 0xf7, 0xe,
+ 0xfc, 0x8c, 0x6, 0xe4, 0x4, 0xf8, 0x8c, 0xf7,
+ 0xd, 0xfc, 0x8c, 0x6, 0xe, 0x91, 0xa, 0x83,
+ 0x15, 0xf8, 0x90, 0xf7, 0x62, 0x5, 0xf7, 0x4,
+ 0x7, 0xfc, 0x90, 0xf7, 0x60, 0x5, 0xfb, 0x18,
+ 0x7, 0xf7, 0xf5, 0xfb, 0x14, 0xfb, 0xf5, 0xfb,
+ 0x15, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0x1e, 0xf8,
+ 0x77, 0xf5, 0x12, 0xf7, 0x87, 0xf7, 0xc, 0xfb,
+ 0xc, 0xf7, 0x19, 0xbe, 0xf7, 0x15, 0x13, 0xe8,
+ 0xf7, 0x87, 0xf7, 0x4e, 0x15, 0xf7, 0xd, 0x6,
+ 0x8a, 0x92, 0x8b, 0x93, 0x8f, 0x1a, 0xbf, 0x91,
+ 0x9e, 0xc3, 0xba, 0x1e, 0xe8, 0xdb, 0xb1, 0xba,
+ 0xd2, 0x1a, 0xf7, 0x5, 0x25, 0xe8, 0xfb, 0x27,
+ 0xfb, 0x37, 0x3d, 0xfb, 0x4, 0x29, 0x85, 0x1e,
+ 0xf7, 0xe, 0x7b, 0x5, 0xd7, 0x9a, 0xb1, 0xb7,
+ 0xd3, 0x1b, 0xc4, 0xca, 0x6b, 0x4a, 0x60, 0x75,
+ 0x79, 0x49, 0x52, 0x1f, 0x2d, 0x3d, 0x87, 0x5e,
+ 0x8d, 0x2a, 0x8, 0xfb, 0x4e, 0x4, 0x13, 0xd8,
+ 0xf7, 0x19, 0xf7, 0x1e, 0xfb, 0x19, 0x6, 0xe,
+ 0xf8, 0x2d, 0x46, 0xda, 0xf7, 0x0, 0xda, 0xf7,
+ 0xca, 0xdb, 0xec, 0xda, 0x1, 0xf7, 0x16, 0xd8,
+ 0xdc, 0xf7, 0x1, 0xf8, 0x53, 0xd7, 0x3, 0xf8,
+ 0xc8, 0xf7, 0x3b, 0x15, 0x79, 0x90, 0x93, 0x6c,
+ 0xcb, 0x1b, 0xf7, 0x40, 0xf6, 0xf7, 0x37, 0xf7,
+ 0x28, 0xf7, 0x4c, 0xfb, 0x17, 0xf7, 0x2a, 0xfb,
+ 0x79, 0xfb, 0xc8, 0xfb, 0xe, 0xfb, 0x89, 0xfb,
+ 0x5b, 0xfb, 0x9e, 0xf7, 0x7d, 0xfb, 0xe, 0xf7,
+ 0x5c, 0xf7, 0x18, 0xf7, 0x41, 0xb4, 0xf7, 0x2e,
+ 0xd5, 0x1f, 0x32, 0x6, 0x66, 0x6f, 0x47, 0x3c,
+ 0xfb, 0x56, 0x1b, 0xfb, 0xa9, 0x3c, 0xf7, 0x41,
+ 0xf7, 0x1c, 0xf7, 0x11, 0xc7, 0xf7, 0x84, 0xf7,
+ 0xb9, 0xf7, 0x72, 0xc9, 0xfb, 0x30, 0x28, 0xfb,
+ 0x1d, 0x20, 0x35, 0x62, 0x75, 0x91, 0xa9, 0xa8,
+ 0x90, 0x1f, 0xca, 0xf7, 0xcb, 0x5, 0xfb, 0x2,
+ 0x6, 0x81, 0x5b, 0x5, 0xc0, 0x6a, 0x56, 0x91,
+ 0x72, 0x1b, 0xfb, 0x2b, 0x3d, 0xfb, 0x3a, 0xfb,
+ 0xd, 0x27, 0xc8, 0x39, 0xf0, 0xcd, 0xb0, 0xb1,
+ 0x96, 0x96, 0x1f, 0xfb, 0x3b, 0xf7, 0x19, 0x15,
+ 0xc8, 0xa0, 0xf7, 0x26, 0xee, 0xd0, 0x9d, 0x43,
+ 0x6f, 0x51, 0x6b, 0xfb, 0x2c, 0x28, 0x50, 0x7a,
+ 0xc0, 0xbd, 0x1e, 0xe, 0x69, 0xa, 0xf7, 0x37,
+ 0xf7, 0xe, 0xf8, 0x45, 0x77, 0x1, 0x9f, 0xf9,
+ 0x3e, 0x3, 0x9f, 0x16, 0xf7, 0x26, 0x6, 0xc3,
+ 0xf7, 0x37, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb,
+ 0x37, 0x5, 0xf7, 0x2a, 0x6, 0xfb, 0xa4, 0xf9,
+ 0x62, 0x40, 0xa, 0x76, 0xfc, 0x45, 0x15, 0xe7,
+ 0xf7, 0x9e, 0xe9, 0xfb, 0x9e, 0x5, 0xe, 0xc6,
+ 0x8c, 0xf7, 0xd, 0xf7, 0x51, 0xf7, 0xe, 0xf7,
+ 0x38, 0x7b, 0xa, 0xf7, 0x22, 0xf7, 0xa9, 0xf7,
+ 0x1f, 0x3, 0xd7, 0x8d, 0x15, 0xf7, 0xa7, 0x6,
+ 0xf7, 0x30, 0xf7, 0x36, 0x89, 0xf7, 0x5f, 0xb4,
+ 0x7e, 0xf0, 0xfb, 0xd, 0xb1, 0x1f, 0xcd, 0xa8,
+ 0xac, 0xba, 0xca, 0x1a, 0xf7, 0x33, 0xfb, 0x22,
+ 0xb0, 0xfb, 0x21, 0x1e, 0xfb, 0xa7, 0x6, 0xf7,
+ 0x22, 0xfb, 0xb1, 0x15, 0xf7, 0x38, 0xf7, 0x19,
+ 0x7, 0xc8, 0xde, 0x8c, 0x3f, 0x3f, 0x2a, 0x7e,
+ 0x5c, 0x1f, 0xfb, 0x19, 0xfb, 0xcb, 0x15, 0xf7,
+ 0x51, 0xf7, 0x19, 0x7, 0xef, 0xd2, 0x82, 0x28,
+ 0x47, 0x3d, 0x7e, 0x2e, 0x1f, 0xe, 0xc6, 0x78,
+ 0xf7, 0x13, 0xf8, 0x8a, 0xf7, 0x13, 0x1, 0xb7,
+ 0xf7, 0x2d, 0x3, 0xf8, 0xb0, 0xf7, 0x9a, 0x15,
+ 0x3b, 0x79, 0x5d, 0x41, 0x29, 0x1b, 0xfb, 0x2b,
+ 0x6d, 0xf7, 0xc, 0xf7, 0x11, 0xba, 0x89, 0xf7,
+ 0x66, 0xf7, 0x4b, 0xd7, 0xca, 0x60, 0x3c, 0x9d,
+ 0x1f, 0xf7, 0x27, 0xad, 0x5, 0xf7, 0xa, 0x71,
+ 0xfb, 0x17, 0xec, 0xfb, 0x27, 0x1b, 0xfb, 0x83,
+ 0x2c, 0xfb, 0x49, 0xfb, 0x5f, 0xfb, 0x78, 0xf7,
+ 0x1b, 0xfb, 0x24, 0xf7, 0x5b, 0xf7, 0x84, 0xbe,
+ 0xf7, 0x47, 0xc4, 0x9a, 0x1f, 0xe, 0xc6, 0x8b,
+ 0xf7, 0xd, 0xf8, 0x70, 0x7b, 0xa, 0xf7, 0x26,
+ 0xf7, 0xcc, 0xf7, 0x2b, 0x3, 0xd7, 0x16, 0xf7,
+ 0x7c, 0x6, 0xf7, 0x9e, 0xf7, 0x3, 0xf7, 0x23,
+ 0xf7, 0x65, 0xf7, 0xb0, 0xfb, 0x36, 0xdd, 0xfb,
+ 0x6b, 0x1f, 0xfb, 0x7c, 0x6, 0xf7, 0x26, 0xfc,
+ 0xe9, 0x15, 0xf8, 0x70, 0xe1, 0x7, 0xf7, 0xe,
+ 0xf3, 0x85, 0xfb, 0x83, 0xfb, 0x7b, 0xfb, 0x5,
+ 0x8b, 0xfb, 0x5, 0x1f, 0xe, 0x8f, 0x8b, 0xf7,
+ 0xd, 0xf7, 0x57, 0xf7, 0xd, 0xf7, 0x34, 0x7b,
+ 0xa, 0xf7, 0x24, 0x3, 0xd7, 0x16, 0xf8, 0xb5,
+ 0xf7, 0xd, 0xfc, 0x25, 0xf7, 0x57, 0xf7, 0xf3,
+ 0xf7, 0xd, 0xfb, 0xf3, 0xf7, 0x34, 0xf8, 0x18,
+ 0xf7, 0xd, 0xfc, 0xa8, 0x6, 0xe, 0x57, 0xa0,
+ 0x76, 0xf7, 0xc5, 0xf7, 0xd, 0xf7, 0x3f, 0x7b,
+ 0xa, 0xf7, 0x2a, 0x3, 0xd7, 0x16, 0xf7, 0x2a,
+ 0xf7, 0xc5, 0xf7, 0xc2, 0xf7, 0xd, 0xfb, 0xc2,
+ 0xf7, 0x3f, 0xf7, 0xfd, 0xf7, 0xd, 0xfc, 0x93,
+ 0x6, 0xe, 0xf7, 0x7, 0x78, 0xf7, 0x13, 0xf7,
+ 0x2e, 0xf7, 0x10, 0xf7, 0x60, 0xf7, 0x13, 0x1,
+ 0xc5, 0xf7, 0x29, 0xf7, 0xfc, 0xf7, 0x26, 0x3,
+ 0xf8, 0x22, 0xf7, 0x9a, 0x15, 0xf7, 0x3d, 0x2f,
+ 0x6, 0x7d, 0x78, 0x49, 0x5b, 0x37, 0x1b, 0xfb,
+ 0x3c, 0x66, 0xf7, 0x25, 0xf7, 0x0, 0xa0, 0x8f,
+ 0xa4, 0x94, 0xa9, 0x1f, 0x94, 0xaa, 0x97, 0xa5,
+ 0x9c, 0xa1, 0x8, 0xb8, 0xae, 0xbe, 0xa8, 0xcf,
+ 0x1b, 0xb6, 0xe5, 0x7c, 0x27, 0xa8, 0x1f, 0xf7,
+ 0x24, 0xa6, 0x5, 0xf7, 0x48, 0x63, 0xfb, 0x29,
+ 0xae, 0xfb, 0x9, 0x1b, 0xfb, 0x15, 0x32, 0x5a,
+ 0x43, 0x53, 0x1f, 0x6f, 0x67, 0x77, 0x63, 0x7e,
+ 0x5e, 0x8, 0x7e, 0x5e, 0x85, 0x65, 0x6c, 0x1a,
+ 0xfb, 0x54, 0xea, 0xfb, 0x50, 0xf7, 0x97, 0xf7,
+ 0x26, 0xf7, 0x12, 0xd4, 0xb3, 0xb6, 0x1e, 0xf7,
+ 0xb8, 0xfb, 0xcf, 0x7, 0xe, 0x69, 0xa, 0xf7,
+ 0xcf, 0xf7, 0xe, 0xf7, 0xad, 0x77, 0x1, 0xd2,
+ 0xf7, 0x26, 0xf7, 0xb4, 0xf7, 0x26, 0x3, 0xd2,
+ 0x16, 0xf7, 0x26, 0xf7, 0xcf, 0xf7, 0xb4, 0xfb,
+ 0xcf, 0xf7, 0x26, 0xf9, 0x62, 0xfb, 0x26, 0xfb,
+ 0xad, 0xfb, 0xb4, 0xf7, 0xad, 0xfb, 0x26, 0x6,
+ 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xf7, 0x10, 0xf7,
+ 0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf9, 0x62,
+ 0xfb, 0x2a, 0x6, 0xe, 0x20, 0x79, 0xf7, 0x12,
+ 0xf8, 0xf6, 0x77, 0x1, 0xf7, 0xe7, 0xf7, 0x25,
+ 0x3, 0xa1, 0xf7, 0x70, 0x15, 0xfb, 0x38, 0xdb,
+ 0x41, 0xf7, 0x23, 0xf7, 0x41, 0xcd, 0xf7, 0xb,
+ 0xf7, 0x2b, 0x1e, 0xf8, 0x66, 0xfb, 0x25, 0xfc,
+ 0x66, 0x7, 0x44, 0x86, 0x42, 0x32, 0x36, 0x8f,
+ 0xdf, 0xb9, 0x87, 0x1e, 0xe, 0xc6, 0x3f, 0xa,
+ 0xe2, 0xf7, 0x22, 0x3, 0xe2, 0x16, 0xf7, 0x22,
+ 0xf7, 0x6e, 0x6, 0xf7, 0x8, 0xf7, 0xc, 0xf7,
+ 0x55, 0xfb, 0xe6, 0x5, 0xf7, 0x4c, 0x6, 0xfb,
+ 0xab, 0xf8, 0x4c, 0xf7, 0x9c, 0xf7, 0xaa, 0x5,
+ 0xfb, 0x52, 0x6, 0xfb, 0xb4, 0xfb, 0xd1, 0x5,
+ 0xf7, 0xd1, 0xfb, 0x22, 0x7, 0xe, 0x86, 0xa,
+ 0xd7, 0xf7, 0x25, 0x3, 0xd7, 0x16, 0xf8, 0x8f,
+ 0xf7, 0xe, 0xfb, 0xfe, 0xf8, 0xe8, 0xfb, 0x25,
+ 0x6, 0xe, 0xf7, 0x3e, 0xa0, 0x76, 0xf8, 0xc9,
+ 0xf7, 0x2d, 0x1, 0xd0, 0xf7, 0x1b, 0xf8, 0x3e,
+ 0xf7, 0x1b, 0x3, 0xd0, 0x16, 0xf7, 0x1b, 0xf8,
+ 0xc9, 0x8d, 0x6, 0xf7, 0x22, 0xfc, 0xc9, 0x5,
+ 0xf7, 0x20, 0x6, 0xf7, 0x20, 0xf8, 0xc9, 0x5,
+ 0x8d, 0xfc, 0xc9, 0xf7, 0x1b, 0xf9, 0x62, 0xfb,
+ 0x6f, 0x6, 0xfb, 0x13, 0xfc, 0x7c, 0x5, 0x88,
+ 0x6, 0xfb, 0x15, 0xf8, 0x7c, 0x5, 0xfb, 0x6e,
+ 0x6, 0xe, 0xc6, 0xa0, 0x76, 0xf9, 0x62, 0x5c,
+ 0xa, 0xf8, 0x67, 0x8d, 0x6, 0xf7, 0xbb, 0xfc,
+ 0x67, 0x5, 0xf7, 0x2a, 0xf9, 0x62, 0xfb, 0x1e,
+ 0xfc, 0x72, 0x89, 0x6, 0xfb, 0xc1, 0xf8, 0x72,
+ 0x5, 0xfb, 0x24, 0x6, 0xe, 0xf7, 0x7, 0x78,
+ 0xf7, 0x13, 0xf8, 0x76, 0xf7, 0x13, 0x1, 0xd0,
+ 0xf7, 0x28, 0xf7, 0xf8, 0x85, 0xa, 0xb7, 0xf7,
+ 0xea, 0x15, 0x7c, 0x8d, 0x75, 0x90, 0x6d, 0x1e,
+ 0x94, 0x4f, 0xa0, 0x53, 0xae, 0x58, 0x8, 0x40,
+ 0xbe, 0xe5, 0x57, 0xf7, 0x18, 0x1b, 0xf7, 0x10,
+ 0xe2, 0xba, 0xd2, 0xc2, 0x1f, 0xa6, 0xaf, 0x9f,
+ 0xb4, 0x98, 0xb8, 0x8, 0x98, 0xb9, 0x91, 0xb3,
+ 0xae, 0x1a, 0xf7, 0x69, 0x3d, 0xa, 0xfb, 0x20,
+ 0xfb, 0x7f, 0x1e, 0xf7, 0x28, 0x16, 0xf7, 0x0,
+ 0xac, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x44, 0xa0,
+ 0xfb, 0x39, 0x38, 0x76, 0x87, 0x72, 0x84, 0x6c,
+ 0x1e, 0x84, 0x6c, 0x80, 0x70, 0x7c, 0x74, 0x8,
+ 0x5c, 0x6c, 0x59, 0x6e, 0x43, 0x1b, 0x3f, 0x5a,
+ 0xa9, 0x89, 0xa, 0xaa, 0x8, 0x85, 0xaa, 0x88,
+ 0xa5, 0xa0, 0x1a, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+ 0xac, 0xf7, 0xd, 0xf7, 0x58, 0xf7, 0xd, 0x60,
+ 0xa, 0xf7, 0xac, 0xdb, 0x6, 0xf7, 0x31, 0xf7,
+ 0x3d, 0x7e, 0xf7, 0x7a, 0xf7, 0x6c, 0xfb, 0x26,
+ 0x90, 0xfb, 0x48, 0x1f, 0xfb, 0x75, 0x6, 0xf7,
+ 0x25, 0xfb, 0xd1, 0x15, 0xf7, 0x58, 0xdb, 0x7,
+ 0xf4, 0xd2, 0x89, 0x27, 0x24, 0x26, 0x94, 0x40,
+ 0x1f, 0xe, 0xf7, 0x7, 0x6c, 0x76, 0xc6, 0xf7,
+ 0xf, 0xf8, 0x6f, 0xf7, 0xe, 0x1, 0xd1, 0xf7,
+ 0x23, 0xf7, 0xe7, 0xf7, 0x23, 0x3, 0xf8, 0xa8,
+ 0xb0, 0x15, 0xc4, 0x64, 0xb5, 0x68, 0xc2, 0x7c,
+ 0xbe, 0xf0, 0x18, 0x4f, 0xa2, 0x68, 0xa5, 0x7b,
+ 0x96, 0x8, 0xa6, 0xa7, 0xc5, 0xe2, 0xf7, 0x20,
+ 0x1a, 0xf7, 0x67, 0xfb, 0x3, 0xf7, 0x2c, 0xfb,
+ 0x73, 0xfb, 0x6b, 0xfb, 0xa, 0xfb, 0x20, 0xfb,
+ 0x73, 0x38, 0xa0, 0x2c, 0xbf, 0x47, 0x1e, 0x48,
+ 0xc0, 0xde, 0x5f, 0xf7, 0x10, 0x1b, 0xd3, 0xc7,
+ 0x9e, 0x96, 0xa2, 0x1f, 0xfb, 0x50, 0xf7, 0x23,
+ 0x15, 0xab, 0x7f, 0xb2, 0x76, 0x9a, 0x80, 0x8,
+ 0x88, 0x80, 0x80, 0x88, 0x6c, 0x1b, 0x44, 0x5c,
+ 0xa8, 0x89, 0xa, 0xac, 0x8, 0x85, 0xac, 0x88,
+ 0xa4, 0x9e, 0x1a, 0xf7, 0x7, 0xac, 0xf7, 0x12,
+ 0xf7, 0x31, 0xf7, 0x32, 0xac, 0xfb, 0x21, 0x27,
+ 0x6a, 0x81, 0x50, 0x7f, 0x6e, 0x1e, 0x80, 0x6f,
+ 0x7e, 0x7a, 0x84, 0x82, 0x6a, 0xa4, 0x5d, 0xa8,
+ 0x56, 0x9e, 0x8, 0xe, 0x69, 0xa, 0xf7, 0xc0,
+ 0xf7, 0x6, 0xf7, 0x4b, 0x7b, 0xa, 0xf7, 0x1b,
+ 0xf7, 0xa5, 0xf7, 0x1f, 0x3, 0xd7, 0x16, 0xf7,
+ 0x1b, 0xf7, 0xc0, 0xa6, 0x6, 0xe5, 0xa1, 0x81,
+ 0xfb, 0x16, 0xdc, 0x1f, 0xdf, 0xfb, 0x34, 0x5,
+ 0xf7, 0x36, 0x6, 0x3a, 0xf7, 0x20, 0x47, 0xf7,
+ 0x8, 0x71, 0xa5, 0x53, 0xad, 0x19, 0x8d, 0x7,
+ 0xf0, 0x92, 0xd7, 0xdb, 0xf7, 0x3, 0x1a, 0xf7,
+ 0x52, 0xfb, 0x1b, 0x97, 0xfb, 0x45, 0x1e, 0xfb,
+ 0x7f, 0x6, 0xf7, 0x1b, 0xfb, 0xc4, 0x15, 0xf7,
+ 0x4b, 0xef, 0x7, 0xf5, 0xce, 0x94, 0x28, 0x2c,
+ 0x30, 0x8d, 0x39, 0x1f, 0xe, 0x8f, 0x78, 0xf7,
+ 0x10, 0xf7, 0x64, 0xf7, 0x1b, 0xf7, 0x3b, 0xf7,
+ 0xe, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0x96, 0xf7,
+ 0x26, 0x3, 0xb2, 0xf7, 0x7b, 0x15, 0xfb, 0x87,
+ 0x72, 0xa, 0xbe, 0xf7, 0x42, 0xf7, 0x48, 0xfb,
+ 0x2a, 0xae, 0xfb, 0x3, 0xa6, 0x1f, 0xfb, 0x9,
+ 0xa6, 0x5e, 0x96, 0xba, 0x1a, 0xc6, 0xda, 0xa2,
+ 0xb6, 0xf7, 0x8, 0x96, 0x47, 0x65, 0x91, 0x1e,
+ 0xf7, 0x28, 0x91, 0x5, 0xf7, 0x3a, 0x85, 0xfb,
+ 0x18, 0xc3, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+ 0xfb, 0x11, 0x3c, 0xfb, 0x36, 0xf7, 0x35, 0x63,
+ 0xd3, 0x79, 0x1f, 0xf7, 0x1a, 0x6a, 0xbe, 0x7e,
+ 0x4e, 0x1a, 0x5c, 0x61, 0x55, 0x25, 0xfb, 0x18,
+ 0x78, 0xf1, 0xb1, 0x84, 0x1e, 0xe, 0x57, 0xa0,
+ 0x76, 0xf8, 0xe8, 0xf7, 0xe, 0x1, 0xf7, 0x7c,
+ 0x85, 0xa, 0xf7, 0x7c, 0x16, 0xf7, 0x28, 0xf8,
+ 0xe8, 0xf7, 0x6e, 0xf7, 0xe, 0xfc, 0xdc, 0xfb,
+ 0xe, 0xf7, 0x6e, 0x6, 0xe, 0xc6, 0x78, 0xf7,
+ 0x12, 0xf8, 0xf7, 0x77, 0x42, 0xa, 0xd3, 0xf9,
+ 0x62, 0x15, 0xfc, 0x22, 0x7, 0xfb, 0x3c, 0xb7,
+ 0xfb, 0x3f, 0xf7, 0x8d, 0xf7, 0x6d, 0xd0, 0xf7,
+ 0x1, 0xf7, 0x7a, 0x1e, 0xf8, 0x22, 0xfb, 0x26,
+ 0xfc, 0x22, 0x7, 0xfb, 0x11, 0x8b, 0x33, 0xfb,
+ 0x20, 0xfb, 0x16, 0x7a, 0xdc, 0xf7, 0x18, 0x1e,
+ 0xf8, 0x22, 0x7, 0xe, 0x8f, 0x3f, 0xa, 0xf7,
+ 0x98, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x86, 0xf9,
+ 0x62, 0x40, 0xa, 0xfb, 0x39, 0xfc, 0xa7, 0x6e,
+ 0xa, 0xfb, 0x3d, 0xf8, 0xa7, 0x5, 0xfb, 0x28,
+ 0x6, 0xe, 0xf7, 0xad, 0xa0, 0x76, 0xf8, 0xaf,
+ 0x77, 0xf7, 0x5b, 0x77, 0x1, 0xf7, 0x4a, 0x16,
+ 0xf7, 0x2d, 0x6, 0xf7, 0x1d, 0xf8, 0xaf, 0x5,
+ 0x8c, 0x6, 0xf7, 0x1d, 0xfc, 0xaf, 0x5, 0xf7,
+ 0x2a, 0x6, 0xf7, 0x3d, 0xf9, 0x62, 0x5, 0xfb,
+ 0x22, 0x6, 0x22, 0xfc, 0x88, 0x6e, 0xa, 0xfb,
+ 0xd, 0xf8, 0x88, 0x5, 0xfb, 0x3b, 0x6, 0xfb,
+ 0x12, 0xfc, 0x80, 0x6e, 0xa, 0x23, 0xf8, 0x80,
+ 0x5, 0xfb, 0x24, 0x6, 0xe, 0x8f, 0x3f, 0xa,
+ 0x99, 0x16, 0xf7, 0x3b, 0x6, 0xf7, 0x2c, 0xf7,
+ 0x8d, 0xf7, 0x2d, 0xfb, 0x8d, 0x5, 0xf7, 0x3b,
+ 0x6, 0xfb, 0x7f, 0xf8, 0x7, 0xf7, 0x6a, 0xf7,
+ 0xef, 0x5, 0xfb, 0x35, 0x6, 0xfb, 0x1b, 0xfb,
+ 0x7c, 0xfb, 0x1e, 0xf7, 0x7c, 0x5, 0xfb, 0x36,
+ 0x6, 0xf7, 0x69, 0xfb, 0xe9, 0x5, 0xe, 0x8f,
+ 0x3f, 0xa, 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0xf7,
+ 0x9d, 0x16, 0xf7, 0x1d, 0xf7, 0xc2, 0x6, 0xf7,
+ 0x8f, 0xf8, 0x34, 0x4f, 0xa, 0xfc, 0x33, 0x5,
+ 0xe, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0x6e, 0xf7,
+ 0xe, 0x1, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, 0xe,
+ 0x87, 0xa, 0xf7, 0x6, 0xfc, 0x8e, 0xfb, 0xe,
+ 0x8c, 0xa, 0xe, 0x7f, 0xa, 0xca, 0xf7, 0x19,
+ 0x3, 0xf7, 0x58, 0x33, 0x15, 0xf9, 0x52, 0xf7,
+ 0x5, 0xf7, 0x0, 0xfb, 0x8a, 0xfe, 0x2a, 0xf7,
+ 0x8a, 0xf7, 0x0, 0x7, 0xe, 0xfc, 0x15, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0x4e, 0xf7, 0xec,
+ 0x3, 0xf7, 0x4e, 0x78, 0x15, 0xf7, 0x11, 0x6,
+ 0xfb, 0x6d, 0x93, 0xa, 0x7f, 0xa, 0xf7, 0x1d,
+ 0xf7, 0x19, 0x3, 0xa3, 0x33, 0x15, 0xfb, 0x0,
+ 0xf7, 0x8a, 0xfa, 0x2a, 0xfb, 0x8a, 0xfb, 0x0,
+ 0xf7, 0x5, 0xfd, 0x52, 0x7, 0xe, 0x3c, 0xf7,
+ 0xec, 0x76, 0xf7, 0x79, 0x84, 0xa, 0xc9, 0xf7,
+ 0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79,
+ 0xea, 0xfb, 0x79, 0x5, 0xf7, 0x1b, 0x6, 0xfb,
+ 0x42, 0xf8, 0xb, 0x5, 0x20, 0x6, 0xe, 0x20,
+ 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+ 0xc0, 0xbd, 0x7, 0xe, 0xf8, 0xf0, 0x84, 0xa,
+ 0x74, 0xf7, 0x8c, 0x3, 0xf7, 0x13, 0xf8, 0xf0,
+ 0x15, 0xed, 0x6, 0x3f, 0x83, 0xa, 0xfb, 0x40,
+ 0x6, 0xe, 0x20, 0x7d, 0xef, 0x48, 0x76, 0xf8,
+ 0x4c, 0xf7, 0x0, 0x12, 0xa8, 0xf7, 0x1a, 0xf7,
+ 0x58, 0xf7, 0x1d, 0x13, 0x78, 0xf8, 0x6, 0xc4,
+ 0x30, 0xa, 0x77, 0xb8, 0x83, 0xa3, 0x38, 0xa,
+ 0xad, 0x1a, 0xeb, 0x8a, 0xf4, 0xfb, 0x73, 0xfb,
+ 0x32, 0x5b, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13,
+ 0x73, 0x5, 0xa6, 0x2d, 0xa, 0x7f, 0x6e, 0x83,
+ 0x3c, 0x7d, 0x8, 0x41, 0x7c, 0xfb, 0xc, 0x73,
+ 0xfb, 0x17, 0x1a, 0x13, 0xb8, 0x2e, 0xd1, 0x4a,
+ 0x37, 0xa, 0xf7, 0x5b, 0x15, 0x6f, 0x7, 0x3c,
+ 0x97, 0x5d, 0x4c, 0x3d, 0x1b, 0x55, 0x6d, 0xa7,
+ 0xa9, 0xbd, 0xca, 0xa9, 0xa4, 0x90, 0x1f, 0xa9,
+ 0x92, 0xc8, 0x95, 0x9c, 0x95, 0x8, 0xe, 0x57,
+ 0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x41, 0xf5,
+ 0xf7, 0x4d, 0x77, 0x12, 0xde, 0xf7, 0x20, 0xf7,
+ 0x5a, 0xf7, 0x24, 0x13, 0x7c, 0xc8, 0x89, 0x15,
+ 0xf7, 0x17, 0xd8, 0x8d, 0x6, 0x13, 0xbc, 0x3d,
+ 0xc1, 0xd8, 0x80, 0xaa, 0x1b, 0xf7, 0x7, 0xf6,
+ 0xe0, 0xf7, 0x50, 0xf7, 0x4c, 0x22, 0xe5, 0xfb,
+ 0xa, 0x35, 0x5b, 0x5a, 0x74, 0x77, 0x1f, 0xf7,
+ 0x95, 0xfb, 0x20, 0x7, 0x13, 0x7c, 0xf7, 0x1f,
+ 0xfc, 0x52, 0x15, 0xf5, 0xbf, 0xbc, 0xcc, 0xf3,
+ 0x98, 0xfb, 0x2, 0x51, 0x1e, 0x13, 0xbc, 0xfb,
+ 0x16, 0x4c, 0x6a, 0x5b, 0x31, 0x6a, 0xda, 0xec,
+ 0x1e, 0xe, 0x20, 0x7d, 0xf7, 0x8, 0xf7, 0xe1,
+ 0xf7, 0x3, 0x1, 0xb9, 0xf7, 0x21, 0x3, 0xf8,
+ 0x1a, 0xf7, 0x5e, 0x15, 0x6c, 0x85, 0x76, 0x46,
+ 0x3b, 0x1b, 0x3c, 0x6e, 0xc6, 0xf7, 0x5, 0xac,
+ 0x86, 0xf7, 0x14, 0xf7, 0x5, 0xce, 0xa4, 0x5c,
+ 0x66, 0x92, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd2,
+ 0x77, 0x5a, 0xee, 0xfb, 0x39, 0x1b, 0xfb, 0x59,
+ 0x57, 0xfb, 0x28, 0xfb, 0x10, 0x31, 0xae, 0xfb,
+ 0x5a, 0xf7, 0x6a, 0xf7, 0x17, 0xdc, 0xc9, 0xf7,
+ 0x18, 0xa8, 0x1f, 0xe, 0x57, 0x7d, 0xf7, 0x2,
+ 0x3e, 0x76, 0xf8, 0x3f, 0xf5, 0xf7, 0x4f, 0x77,
+ 0x12, 0xad, 0xf7, 0x24, 0xf7, 0x6d, 0xf7, 0x20,
+ 0x13, 0x7c, 0xf8, 0x38, 0x89, 0x15, 0xf7, 0x17,
+ 0xf9, 0x64, 0xfb, 0x20, 0xfb, 0x97, 0x6, 0xa2,
+ 0x77, 0x5b, 0xbc, 0x35, 0x1b, 0xfb, 0xa, 0x22,
+ 0x36, 0xfb, 0x4c, 0x1f, 0x13, 0xbc, 0xfb, 0x50,
+ 0xf6, 0x33, 0xf7, 0x7, 0xe9, 0xae, 0xb7, 0xb7,
+ 0xae, 0x1e, 0x13, 0x7c, 0xfb, 0x86, 0xf7, 0x50,
+ 0x15, 0xc5, 0x98, 0xf4, 0xf3, 0xcc, 0xbf, 0x51,
+ 0x22, 0x1e, 0x13, 0xbc, 0x2a, 0x6a, 0x46, 0x31,
+ 0x5b, 0x4c, 0xb0, 0xf7, 0x15, 0x1e, 0xe, 0x20,
+ 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe1, 0xf7, 0x2b,
+ 0xf7, 0x0, 0x1, 0xa9, 0xf7, 0x28, 0xf7, 0x64,
+ 0xf7, 0x22, 0x3, 0xf7, 0x3c, 0xf7, 0x76, 0x15,
+ 0xf7, 0xfc, 0x6, 0xf7, 0x33, 0x57, 0xf7, 0x35,
+ 0xfb, 0x5e, 0xfb, 0x3e, 0x3a, 0xfb, 0x1e, 0xfb,
+ 0x25, 0xfb, 0x3b, 0xf1, 0xfb, 0x2, 0xf7, 0x29,
+ 0xf7, 0x46, 0xc3, 0xf7, 0x12, 0xac, 0x97, 0x1e,
+ 0xfb, 0x22, 0xa3, 0x5, 0x72, 0x83, 0x6d, 0x59,
+ 0x49, 0x1b, 0x3a, 0x74, 0xcf, 0xcb, 0x89, 0x1f,
+ 0x8e, 0xe1, 0x15, 0xce, 0xaf, 0xc6, 0xce, 0xd3,
+ 0xb3, 0x4d, 0x4b, 0x1e, 0xe, 0x76, 0xa, 0xf4,
+ 0xf4, 0x1, 0xd8, 0xf7, 0x14, 0x3, 0xd8, 0x16,
+ 0xf7, 0x14, 0xf8, 0x2c, 0xde, 0xf7, 0x1, 0x38,
+ 0xb0, 0x6, 0xa9, 0x8b, 0xb1, 0xbd, 0x93, 0x9c,
+ 0x89, 0x85, 0xa1, 0x1e, 0x9b, 0xeb, 0x5, 0x98,
+ 0x65, 0x76, 0x8f, 0x73, 0x1b, 0xfb, 0x21, 0x7a,
+ 0xfb, 0x1, 0x4e, 0x1f, 0x63, 0x48, 0xfb, 0x1,
+ 0xce, 0x7, 0xe, 0x57, 0xfb, 0x6d, 0xf7, 0x0,
+ 0xf7, 0x1, 0xf7, 0x7, 0xf7, 0xd7, 0xf7, 0x0,
+ 0x1, 0xb3, 0xf7, 0x23, 0xf7, 0x7b, 0xf7, 0x1f,
+ 0x3, 0xc5, 0x67, 0x15, 0xfb, 0x40, 0xf7, 0x10,
+ 0x82, 0xf7, 0xe, 0xf7, 0x79, 0x9f, 0xf7, 0xf,
+ 0xf7, 0x28, 0x1e, 0xf8, 0x74, 0xfb, 0x16, 0x40,
+ 0x89, 0x7, 0xa3, 0x7c, 0x5c, 0xca, 0x2a, 0x1b,
+ 0x35, 0xfb, 0x1c, 0x55, 0xfb, 0x70, 0xfb, 0x2c,
+ 0xde, 0xfb, 0xc, 0xf7, 0x1a, 0xca, 0xc4, 0xae,
+ 0xbe, 0xae, 0x1f, 0x8d, 0x3d, 0x6, 0x4d, 0x8b,
+ 0x54, 0xfb, 0x7, 0x50, 0x7d, 0x9c, 0xb0, 0x82,
+ 0x1e, 0x69, 0xf7, 0xdb, 0x15, 0xb3, 0x94, 0xf7,
+ 0x12, 0xf5, 0xea, 0xa1, 0x29, 0x47, 0xfb, 0x1f,
+ 0x38, 0x79, 0x66, 0x32, 0x74, 0xdf, 0xd4, 0x1e,
+ 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x3e, 0xf4, 0xf7,
+ 0x4f, 0x77, 0x1, 0xcc, 0xf7, 0x20, 0xf7, 0x5d,
+ 0x7d, 0xa, 0xcc, 0x16, 0xf7, 0x20, 0xf7, 0x99,
+ 0x6, 0xc4, 0x8b, 0xf7, 0x0, 0xf7, 0x6, 0xe2,
+ 0x8b, 0x3e, 0x33, 0x1e, 0xfb, 0x99, 0xf7, 0x20,
+ 0xf7, 0x99, 0x7, 0xf7, 0x44, 0x4f, 0xe9, 0xfb,
+ 0xc, 0x6e, 0x47, 0x88, 0x40, 0x4b, 0x1e, 0xf7,
+ 0x9d, 0xfb, 0x20, 0x7, 0xe, 0x4c, 0xa, 0xf8,
+ 0xa1, 0x77, 0xe9, 0xf7, 0x12, 0x1, 0xf7, 0x22,
+ 0x63, 0xa, 0xf8, 0xa1, 0x68, 0xa, 0xd5, 0x4,
+ 0xf7, 0x20, 0xf7, 0x12, 0x6d, 0xa, 0xfc, 0x15,
+ 0xfb, 0x6a, 0xf7, 0x16, 0xf8, 0xf5, 0x77, 0xe9,
+ 0xf7, 0x12, 0x1, 0xf7, 0x8, 0xf7, 0x1b, 0x3,
+ 0xa7, 0x3b, 0x15, 0x73, 0xfb, 0xb, 0x5, 0x88,
+ 0x97, 0xb4, 0x7f, 0xb3, 0x1b, 0xf7, 0x22, 0x97,
+ 0xf7, 0x9, 0xf7, 0x5, 0x1f, 0xf8, 0x91, 0xfb,
+ 0x1b, 0xfc, 0x89, 0x7, 0x42, 0x8c, 0x68, 0x52,
+ 0x7c, 0x7f, 0x8e, 0x8c, 0x86, 0x1e, 0xe3, 0xf9,
+ 0x3b, 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0xfb, 0x1b,
+ 0x6, 0xe, 0x20, 0x3f, 0xa, 0xd0, 0xf7, 0x21,
+ 0x3, 0xd0, 0x16, 0xf7, 0x21, 0xf7, 0x3b, 0x6,
+ 0xcd, 0xcf, 0xf7, 0x1a, 0xfb, 0x7f, 0x5, 0xf7,
+ 0x2c, 0x6, 0xfb, 0x57, 0xf7, 0xdf, 0xf7, 0x4b,
+ 0xf7, 0x53, 0x5, 0xfb, 0x42, 0x6, 0xfb, 0x3a,
+ 0xfb, 0x4c, 0x5, 0xf8, 0x10, 0xfb, 0x21, 0x7,
+ 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd0, 0x63, 0xa,
+ 0xf9, 0x62, 0x6d, 0xa, 0xf7, 0x76, 0xa0, 0x76,
+ 0xf8, 0x4a, 0xf7, 0x0, 0x7f, 0x77, 0x12, 0xdc,
+ 0xf7, 0x1d, 0xf7, 0x33, 0xf7, 0x1c, 0xf7, 0x44,
+ 0xf7, 0x1d, 0x13, 0xdc, 0xcb, 0x16, 0xf7, 0x1d,
+ 0xf7, 0xb1, 0x6, 0xe6, 0x9f, 0xc9, 0xe0, 0xd3,
+ 0x8a, 0x4f, 0x30, 0x1e, 0xfb, 0xb3, 0xf7, 0x1c,
+ 0xf7, 0xb3, 0x7, 0xd8, 0xa3, 0xd5, 0xda, 0xd4,
+ 0x8b, 0x33, 0x4c, 0x1e, 0xfb, 0xb3, 0xf7, 0x1d,
+ 0xf7, 0xb7, 0x7, 0xc5, 0x8b, 0xf7, 0x59, 0xfb,
+ 0x3e, 0x36, 0x59, 0x53, 0x6f, 0x74, 0x1e, 0xa1,
+ 0x7e, 0x69, 0xc9, 0x28, 0x1b, 0x66, 0x4d, 0x85,
+ 0x3d, 0x4f, 0x1f, 0x13, 0xbc, 0x89, 0xd3, 0xfb,
+ 0x13, 0x6, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x4a,
+ 0xeb, 0x2b, 0xf7, 0x0, 0x12, 0x7a, 0xf7, 0x20,
+ 0xf7, 0xaf, 0xf7, 0x20, 0x13, 0xb8, 0xcc, 0x16,
+ 0xf7, 0x20, 0xf7, 0x8f, 0x6, 0xe3, 0x94, 0xee,
+ 0xf6, 0xe0, 0x8b, 0x28, 0x33, 0x1e, 0xfb, 0x8f,
+ 0xf7, 0x20, 0xf7, 0x8f, 0x7, 0xf7, 0x18, 0x72,
+ 0xf7, 0x37, 0xfb, 0x2b, 0x55, 0x48, 0x78, 0x43,
+ 0x57, 0x1e, 0x13, 0xd8, 0x89, 0xda, 0xfb, 0x16,
+ 0x6, 0xe, 0x57, 0x7d, 0xf7, 0x8, 0xf7, 0xdc,
+ 0xf7, 0x8, 0x1, 0xac, 0xf7, 0x23, 0xf7, 0x95,
+ 0xf7, 0x23, 0x3, 0xad, 0xf7, 0xa1, 0x15, 0xfb,
+ 0x8e, 0xf7, 0x50, 0x6a, 0xde, 0xf7, 0x3e, 0xf2,
+ 0xf7, 0x1a, 0xf7, 0x29, 0xf7, 0x1c, 0x32, 0xf7,
+ 0x21, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x2a,
+ 0xfb, 0x13, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x5,
+ 0xc8, 0xbb, 0xce, 0xd3, 0xc5, 0x56, 0xfb, 0x0,
+ 0xfb, 0xc, 0x49, 0x5c, 0x4b, 0x49, 0x4d, 0xbf,
+ 0xf7, 0x7, 0x1e, 0xe, 0x5a, 0xa, 0xe5, 0xf7,
+ 0x17, 0xf7, 0x60, 0xf7, 0x24, 0x13, 0xec, 0xf7,
+ 0x5e, 0xc6, 0x15, 0x73, 0x9f, 0xbb, 0x59, 0xe1,
+ 0x1b, 0xf7, 0x9, 0xf4, 0xdf, 0xf7, 0x51, 0xf7,
+ 0x55, 0x20, 0xea, 0xfb, 0x6, 0x6b, 0x3f, 0x80,
+ 0x3b, 0x55, 0x1f, 0x89, 0x6, 0x13, 0xdc, 0xda,
+ 0xfb, 0x17, 0xfd, 0x79, 0xf7, 0x20, 0x7, 0x8a,
+ 0xf8, 0x65, 0x15, 0x13, 0xec, 0xee, 0xab, 0xd7,
+ 0xe5, 0xbb, 0xca, 0x61, 0xfb, 0x19, 0x4f, 0x7e,
+ 0x22, 0x24, 0x4a, 0x57, 0xc3, 0xf7, 0x1, 0x1e,
+ 0xe, 0x5a, 0xa, 0xad, 0xf7, 0x24, 0xf7, 0x7e,
+ 0xf7, 0x20, 0xfb, 0x17, 0xf7, 0x17, 0x13, 0xdc,
+ 0xf8, 0x30, 0xc6, 0x15, 0xfb, 0x9e, 0xf7, 0x20,
+ 0xf9, 0x79, 0x7, 0x13, 0xda, 0xfb, 0x17, 0x3c,
+ 0x89, 0x6, 0x13, 0xec, 0xdb, 0x55, 0x3e, 0x96,
+ 0x6b, 0x1b, 0xfb, 0x7, 0x20, 0x2c, 0xfb, 0x55,
+ 0xfb, 0x51, 0xf4, 0x37, 0xf7, 0xa, 0xe1, 0xbb,
+ 0xbd, 0xa3, 0xa0, 0x1f, 0xfb, 0x7e, 0xf7, 0x5b,
+ 0x15, 0xf7, 0x19, 0xcb, 0xb5, 0xbb, 0xe5, 0xac,
+ 0x3f, 0x28, 0xfb, 0x1, 0x57, 0x53, 0x49, 0x24,
+ 0x7d, 0xf4, 0xc7, 0x1e, 0xe, 0xfb, 0xa6, 0xa0,
+ 0x76, 0xf8, 0x37, 0xf7, 0x7, 0xfb, 0x7, 0xf7,
+ 0x13, 0x12, 0xb9, 0xf7, 0x12, 0xf7, 0x35, 0xb3,
+ 0x13, 0xb8, 0xcb, 0x16, 0xf7, 0x12, 0xf7, 0x39,
+ 0x6, 0xf7, 0x28, 0x96, 0xf5, 0xdd, 0xa3, 0x9b,
+ 0x7c, 0x84, 0x95, 0x1e, 0xb3, 0xf7, 0xc, 0x5,
+ 0x9a, 0x75, 0x62, 0x99, 0x70, 0x1b, 0x55, 0x64,
+ 0x66, 0x58, 0x84, 0x1f, 0x13, 0xd0, 0x89, 0xd7,
+ 0xfb, 0x9, 0x6, 0xe, 0x20, 0x7d, 0xf0, 0xf7,
+ 0xfa, 0xf0, 0x1, 0xcb, 0xf7, 0x14, 0xf7, 0x51,
+ 0xf7, 0x1e, 0x3, 0xa9, 0xf7, 0x2b, 0x15, 0xfb,
+ 0x2a, 0x9e, 0xf7, 0x32, 0x7c, 0xd4, 0x1b, 0xf7,
+ 0x40, 0xce, 0xd7, 0xdf, 0xf7, 0xa, 0x20, 0xba,
+ 0x2f, 0xa2, 0x1f, 0x66, 0x94, 0x21, 0x99, 0xb6,
+ 0x1a, 0xb7, 0xcf, 0x8c, 0xa2, 0xa4, 0xc6, 0x89,
+ 0x4c, 0x9c, 0x1e, 0xf7, 0x17, 0xa3, 0x5, 0xf6,
+ 0x6d, 0x3d, 0xae, 0xfb, 0x10, 0x1b, 0xfb, 0x1,
+ 0xfb, 0x2, 0x62, 0xfb, 0xf, 0xfb, 0x13, 0xf6,
+ 0x77, 0xf7, 0x32, 0x68, 0x1f, 0xab, 0x84, 0xae,
+ 0x7b, 0x6c, 0x1a, 0x51, 0x32, 0x8a, 0x7f, 0x5e,
+ 0x58, 0x9a, 0xd2, 0x7b, 0x1e, 0xe, 0x9a, 0x76,
+ 0xf8, 0x26, 0xf3, 0xf7, 0x44, 0x77, 0x1, 0xe4,
+ 0xf7, 0x1a, 0x3, 0xf7, 0xc9, 0x99, 0x15, 0x7f,
+ 0xf0, 0x5, 0x46, 0x71, 0x75, 0x8c, 0xe5, 0x1a,
+ 0xf7, 0x6c, 0xe6, 0xf3, 0x30, 0xf7, 0x44, 0x7,
+ 0xfb, 0x1a, 0x3e, 0x5, 0x28, 0x4d, 0x23, 0xc9,
+ 0xfb, 0x6c, 0x7, 0xfb, 0x7, 0x95, 0x44, 0xf7,
+ 0xd, 0x99, 0xbb, 0x8d, 0x9d, 0xb7, 0x1e, 0xe,
+ 0x57, 0x7d, 0xf7, 0x0, 0x2b, 0xeb, 0xf8, 0x4a,
+ 0x77, 0x12, 0xd5, 0xf7, 0x1f, 0xf7, 0x55, 0xf7,
+ 0x1f, 0x13, 0x78, 0xf8, 0x34, 0x89, 0x15, 0xf7,
+ 0x15, 0xf8, 0xaa, 0xfb, 0x1f, 0xfb, 0xbb, 0x6,
+ 0x5c, 0x8d, 0x2b, 0xfb, 0x7, 0x2f, 0x8f, 0xde,
+ 0xc7, 0x1e, 0xf7, 0xbb, 0xfb, 0x1f, 0xfb, 0xbb,
+ 0x7, 0x13, 0xb8, 0xfb, 0x37, 0xba, 0x33, 0xf7,
+ 0x14, 0xcf, 0xce, 0xad, 0xc6, 0xb1, 0x1e, 0x8d,
+ 0x6, 0xe, 0x20, 0x73, 0xa, 0x98, 0xf8, 0xa6,
+ 0x3, 0xf7, 0x6f, 0x16, 0xf7, 0xd, 0x6, 0xf7,
+ 0x5f, 0xf8, 0xa8, 0x5, 0xfb, 0x1f, 0x6, 0xfb,
+ 0x11, 0xfb, 0xfd, 0x5, 0x8a, 0x6, 0xfb, 0xf,
+ 0xf7, 0xfd, 0x5, 0xfb, 0x22, 0x6, 0xe, 0xf7,
+ 0x7, 0x73, 0xa, 0x95, 0xf9, 0x8b, 0x3, 0xf7,
+ 0x40, 0x16, 0xf7, 0x17, 0x6, 0xe0, 0xf7, 0xec,
+ 0x5, 0x8d, 0x6, 0xe1, 0xfb, 0xec, 0x5, 0xf7,
+ 0x16, 0x6, 0xf7, 0x37, 0xf8, 0xa8, 0x5, 0xfb,
+ 0x19, 0x6, 0x2b, 0xfb, 0xf0, 0x6e, 0xa, 0x38,
+ 0xf7, 0xf0, 0x5, 0xfb, 0x17, 0x6, 0x35, 0xfb,
+ 0xf0, 0x6e, 0xa, 0x2d, 0xf7, 0xf0, 0x5, 0xfb,
+ 0x18, 0x6, 0xe, 0x20, 0x73, 0xa, 0x9a, 0xf8,
+ 0xa2, 0x3, 0x9a, 0x16, 0xf7, 0x30, 0x6, 0xf3,
+ 0xf7, 0x3a, 0xf2, 0xfb, 0x3a, 0x5, 0xf7, 0x37,
+ 0x6, 0xfb, 0x4f, 0xf7, 0xad, 0xf7, 0x3f, 0xf7,
+ 0x8f, 0x5, 0xfb, 0x30, 0x6, 0x2d, 0xfb, 0x25,
+ 0x32, 0xf7, 0x25, 0x5, 0xfb, 0x37, 0x6, 0xf7,
+ 0x42, 0xfb, 0x95, 0x5, 0xe, 0x20, 0xfb, 0x55,
+ 0x76, 0xf9, 0x7e, 0x77, 0x1, 0xb6, 0x2b, 0x15,
+ 0x97, 0xfb, 0x2, 0x52, 0xa, 0xf7, 0x1, 0xf7,
+ 0x12, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8, 0x93, 0x78,
+ 0xa, 0xfc, 0xd, 0x6e, 0xa, 0xfb, 0xe, 0xf8,
+ 0xd, 0x40, 0xa, 0xf7, 0x58, 0xfc, 0xa8, 0x5,
+ 0x29, 0x48, 0xa, 0xe, 0xfb, 0x37, 0x8b, 0xf7,
+ 0x10, 0xf7, 0xb7, 0xf7, 0x9, 0x1, 0x9f, 0x16,
+ 0xf8, 0x60, 0xf7, 0x10, 0xfb, 0xae, 0x6, 0xf7,
+ 0x9e, 0xf7, 0xc8, 0x5, 0xef, 0xfc, 0x3d, 0xfb,
+ 0x9, 0xf7, 0x88, 0x7, 0xfb, 0x9b, 0xfb, 0xc5,
+ 0x5, 0xe, 0x5b, 0xa, 0xf7, 0x2a, 0xf7, 0xc,
+ 0x14, 0xe0, 0xbb, 0xf7, 0x61, 0x15, 0xe8, 0x94,
+ 0x3f, 0xfb, 0x4, 0xfb, 0x2f, 0xbd, 0x51, 0xf7,
+ 0x20, 0x1f, 0xa4, 0xf7, 0x7, 0x6, 0x47, 0x70,
+ 0x8e, 0xcc, 0xf7, 0x4f, 0x78, 0xbc, 0x48, 0xb3,
+ 0x1f, 0xca, 0xb5, 0xa2, 0xab, 0xf7, 0x5d, 0x1a,
+ 0xcb, 0x9e, 0x90, 0xd7, 0x1e, 0xf7, 0x7, 0x72,
+ 0x7, 0xfb, 0x52, 0x8b, 0x32, 0xfb, 0x23, 0xfb,
+ 0x8, 0x7d, 0x56, 0x33, 0x1f, 0xe, 0xfc, 0x13,
+ 0xfb, 0x5a, 0x76, 0xfa, 0x50, 0x77, 0x1, 0xdf,
+ 0xf7, 0x4, 0x3, 0xdf, 0xfb, 0x6f, 0x15, 0xf7,
+ 0x4, 0xfa, 0x50, 0x7c, 0xa, 0xe, 0x5b, 0xa,
+ 0xf7, 0xb, 0xf7, 0xc, 0x14, 0xe0, 0xa3, 0x3a,
+ 0x15, 0xfb, 0x7, 0xa4, 0x7, 0xf7, 0x52, 0x8b,
+ 0xe4, 0xf7, 0x23, 0xf7, 0x8, 0x92, 0xc0, 0xea,
+ 0x1f, 0xf7, 0x8, 0x7, 0x29, 0x87, 0xd7, 0xf7,
+ 0x4, 0xf7, 0x2f, 0x59, 0xc5, 0xfb, 0x20, 0x1f,
+ 0x72, 0xfb, 0x7, 0x6, 0xcf, 0xa6, 0x88, 0x4a,
+ 0xfb, 0x4f, 0x9e, 0x5a, 0xce, 0x63, 0x1f, 0x4c,
+ 0x61, 0x74, 0x6b, 0xfb, 0x5d, 0x1a, 0x4b, 0x78,
+ 0x86, 0x3f, 0x1e, 0xe, 0x3c, 0xf7, 0x73, 0xf7,
+ 0xc, 0x1, 0xce, 0xf8, 0x62, 0x3, 0xc8, 0xf7,
+ 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, 0x1b,
+ 0xb4, 0xae, 0x7b, 0x7b, 0xae, 0x1f, 0x7d, 0xac,
+ 0xab, 0x7d, 0xb0, 0x1b, 0xd0, 0xbf, 0xbc, 0x95,
+ 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, 0x56,
+ 0x89, 0x81, 0x1b, 0x72, 0x6b, 0x99, 0x98, 0x69,
+ 0x1f, 0x9b, 0x64, 0x61, 0x9c, 0x60, 0x1b, 0x76,
+ 0x56, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xc6, 0x8b,
+ 0xf7, 0xb, 0xf7, 0xa4, 0xd5, 0xf7, 0x19, 0xf7,
+ 0xc, 0x1, 0x9f, 0xf7, 0x93, 0x15, 0xf7, 0x1,
+ 0x6, 0xfb, 0x2e, 0xae, 0xf7, 0x2b, 0x26, 0xf7,
+ 0x53, 0x1b, 0xcd, 0xc6, 0x95, 0xa0, 0xbc, 0x1f,
+ 0xf7, 0x25, 0x7, 0x66, 0x5f, 0x51, 0x77, 0x40,
+ 0x1b, 0x28, 0xfb, 0xa, 0xc2, 0xdc, 0x7a, 0x1f,
+ 0xf8, 0xf, 0x6, 0x9e, 0xd5, 0x5, 0xfc, 0x30,
+ 0x6, 0x9e, 0x89, 0xa5, 0x8d, 0x9c, 0x1e, 0xf8,
+ 0x3f, 0x6, 0x9f, 0xd5, 0x5, 0xfc, 0x46, 0x6,
+ 0xdb, 0x9f, 0xf7, 0xb, 0xc0, 0xef, 0x1b, 0xca,
+ 0xba, 0x7e, 0x70, 0xac, 0x1f, 0xae, 0xf7, 0x17,
+ 0x5, 0x9e, 0x5b, 0x4a, 0x95, 0x4a, 0x1b, 0xfb,
+ 0x58, 0xfb, 0x21, 0x29, 0xfb, 0x2f, 0x64, 0x1f,
+ 0x2e, 0x6, 0x79, 0x41, 0x5, 0xee, 0x6, 0x8a,
+ 0x7b, 0x8a, 0x6e, 0x8d, 0x7a, 0x8, 0x3a, 0x6,
+ 0xe, 0xfc, 0x15, 0xfb, 0x11, 0x76, 0x12, 0xdb,
+ 0xf7, 0x15, 0x48, 0xce, 0x13, 0xc0, 0xdb, 0x8a,
+ 0x15, 0x13, 0xa0, 0xc9, 0x6, 0x89, 0x43, 0x5c,
+ 0x7f, 0x73, 0x83, 0xa4, 0x56, 0x18, 0xf7, 0x7,
+ 0x45, 0xa, 0x7, 0x13, 0xc0, 0xfb, 0x15, 0x6,
+ 0xe, 0x20, 0xfb, 0x66, 0xf7, 0xa, 0xf8, 0x91,
+ 0xf4, 0xdc, 0xf7, 0x5, 0x1, 0x9b, 0x3b, 0x15,
+ 0x71, 0xfb, 0x3, 0x5, 0x7d, 0xb5, 0xa8, 0x86,
+ 0xa9, 0x1b, 0xf7, 0xb, 0xb6, 0xd4, 0xd9, 0x98,
+ 0x1f, 0xd9, 0xf8, 0x70, 0x5, 0xe7, 0x6, 0x9c,
+ 0xf4, 0x5, 0x2d, 0x6, 0x90, 0xa7, 0x5, 0xb1,
+ 0x92, 0x90, 0xa8, 0xb7, 0x1b, 0xa7, 0xa9, 0x81,
+ 0x87, 0x98, 0x1f, 0xa4, 0xf7, 0x5, 0x5, 0x9e,
+ 0x52, 0x6f, 0x8d, 0x80, 0x1b, 0xfb, 0x14, 0x67,
+ 0x48, 0xfb, 0x28, 0x73, 0x1f, 0x30, 0x6, 0x7a,
+ 0x22, 0x5, 0xe6, 0x6, 0x47, 0xfc, 0x3c, 0x5,
+ 0x4f, 0x82, 0x87, 0x72, 0x60, 0x1b, 0x77, 0x7b,
+ 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x37, 0xfb,
+ 0x11, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x12, 0xd7,
+ 0xf7, 0x1a, 0x46, 0xd0, 0xe7, 0xf7, 0x1a, 0x45,
+ 0xd1, 0x13, 0xe8, 0xf7, 0xc2, 0x16, 0x13, 0xe4,
+ 0xcb, 0x6, 0x98, 0xa, 0x72, 0x83, 0xa5, 0x56,
+ 0x18, 0xf7, 0xc, 0x61, 0xa, 0xfb, 0x76, 0xfb,
+ 0x13, 0x15, 0x13, 0xd8, 0xcc, 0x6, 0x98, 0xa,
+ 0x71, 0x83, 0xa6, 0x56, 0x18, 0xf7, 0xb, 0x61,
+ 0xa, 0xe, 0xf7, 0xe5, 0x8b, 0x84, 0xa, 0xe7,
+ 0xf7, 0x1f, 0xf7, 0x5b, 0xf7, 0x20, 0xf7, 0x5b,
+ 0xf7, 0x1f, 0x14, 0x70, 0xf9, 0x95, 0x16, 0xf7,
+ 0x1f, 0xf7, 0x26, 0xfb, 0x1f, 0x6, 0xfd, 0x39,
+ 0xfb, 0x26, 0x15, 0xf7, 0x1f, 0xf7, 0x26, 0xfb,
+ 0x1f, 0x6, 0xf7, 0xe6, 0xfb, 0x26, 0x15, 0xf7,
+ 0x20, 0xf7, 0x26, 0x6d, 0xa, 0x20, 0xfb, 0x2a,
+ 0x76, 0xf8, 0xda, 0xf7, 0x7, 0xf7, 0x54, 0x77,
+ 0x1, 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xf7, 0x6b,
+ 0xfb, 0x3f, 0x15, 0xf7, 0x15, 0xf8, 0xda, 0x74,
+ 0xa, 0xf7, 0x54, 0xfb, 0x15, 0xfb, 0x54, 0xfb,
+ 0x47, 0xfb, 0x7, 0xf7, 0x47, 0x6, 0xe, 0x20,
+ 0xfb, 0x2a, 0x76, 0xf7, 0x3e, 0xf7, 0x7, 0xf7,
+ 0xd3, 0xf7, 0x7, 0xf7, 0x3e, 0x77, 0x1, 0xf7,
+ 0x6b, 0xf7, 0x15, 0x3, 0xaf, 0x8a, 0x15, 0xf7,
+ 0x47, 0xfb, 0x3e, 0xf7, 0x15, 0xf7, 0x3e, 0x74,
+ 0xa, 0xf7, 0xd3, 0x74, 0xa, 0xf7, 0x3e, 0xfb,
+ 0x15, 0xfb, 0x3e, 0xfb, 0x47, 0xfb, 0x7, 0xf7,
+ 0x47, 0xfb, 0xd3, 0xfb, 0x47, 0x6, 0xe, 0xf9,
+ 0x39, 0xd4, 0x1, 0x81, 0xf8, 0xf0, 0x95, 0xa,
+ 0xd4, 0xc8, 0x42, 0x77, 0xa, 0x83, 0xa, 0xfb,
+ 0x1b, 0x6, 0xe, 0xf7, 0xe5, 0x78, 0xd4, 0x5a,
+ 0x76, 0xf7, 0xab, 0xd4, 0x99, 0xd4, 0xf7, 0x64,
+ 0xd4, 0x91, 0x77, 0x12, 0x88, 0xeb, 0xe6, 0xeb,
+ 0xf7, 0x1, 0xeb, 0xe7, 0xea, 0xba, 0xeb, 0xe6,
+ 0xeb, 0x13, 0x7b, 0xf0, 0xe8, 0xf8, 0xa8, 0x15,
+ 0xcc, 0x93, 0xad, 0xb0, 0xaf, 0x96, 0x6b, 0x48,
+ 0x8a, 0x1e, 0x48, 0x8a, 0x82, 0x61, 0x67, 0x1b,
+ 0x66, 0x83, 0xb7, 0xcc, 0x1f, 0x2b, 0x16, 0x51,
+ 0x92, 0xfb, 0x10, 0xf7, 0x1a, 0xf7, 0x18, 0x95,
+ 0xf7, 0x10, 0xc5, 0xd1, 0x72, 0xf1, 0xfb, 0x9,
+ 0xfb, 0x10, 0x7a, 0xfb, 0x5, 0x50, 0x1e, 0xf7,
+ 0x1d, 0xfc, 0xb8, 0x15, 0xec, 0x6, 0x13, 0x77,
+ 0xf0, 0xf7, 0xc1, 0xf9, 0x6a, 0x5, 0x2a, 0x6,
+ 0x5d, 0xfc, 0xb2, 0x15, 0x13, 0xbb, 0xf0, 0x50,
+ 0x91, 0xfb, 0x14, 0xf7, 0x1b, 0xf7, 0x1c, 0x91,
+ 0xf7, 0x1f, 0xbb, 0xd0, 0x72, 0xee, 0xfb, 0x9,
+ 0x71, 0xa, 0x94, 0xa9, 0xaf, 0xb2, 0x93, 0x6d,
+ 0x4a, 0x48, 0x83, 0x5d, 0x64, 0x67, 0x82, 0xb9,
+ 0xce, 0x1e, 0xf7, 0x7e, 0x16, 0x50, 0x92, 0xfb,
+ 0x14, 0xf7, 0x1a, 0xf7, 0x1b, 0x92, 0xf7, 0x1f,
+ 0xbb, 0xd0, 0x73, 0xee, 0xfb, 0xa, 0x71, 0xa,
+ 0x93, 0xa9, 0xb0, 0xaf, 0x95, 0x6d, 0x4a, 0x4e,
+ 0x85, 0x56, 0x63, 0x5e, 0x8b, 0xc9, 0xbf, 0x1e,
+ 0xe, 0x8f, 0x78, 0xf7, 0xe, 0xf8, 0x8c, 0xf7,
+ 0xb, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0xa9, 0xf7,
+ 0x26, 0x3, 0xb2, 0xf7, 0x78, 0x15, 0xfb, 0x84,
+ 0x72, 0xa, 0xbd, 0xf7, 0x40, 0xf7, 0x45, 0xfb,
+ 0x2a, 0xae, 0xfb, 0x3, 0xa5, 0x1f, 0xfb, 0x9,
+ 0xa7, 0x5e, 0x95, 0xb9, 0x1a, 0xc5, 0xda, 0xa3,
+ 0xb6, 0xf7, 0x8, 0x96, 0x47, 0x66, 0x91, 0x1e,
+ 0xf7, 0x28, 0x91, 0x5, 0xf7, 0x37, 0x85, 0xfb,
+ 0x18, 0xc2, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+ 0xfb, 0xe, 0x3c, 0xfb, 0x33, 0xf7, 0x35, 0x64,
+ 0xd3, 0x78, 0x1f, 0xf7, 0x1a, 0x6b, 0xbe, 0x7e,
+ 0x4f, 0x1a, 0x5c, 0x61, 0x56, 0x25, 0xfb, 0x18,
+ 0x78, 0xf0, 0xb0, 0x84, 0x1e, 0xe3, 0xf8, 0xbd,
+ 0x15, 0xf7, 0x14, 0x6, 0xf4, 0xf7, 0x22, 0x5,
+ 0xfb, 0x5, 0x6, 0x56, 0x41, 0x51, 0xd5, 0x5,
+ 0x7c, 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x49, 0xd7,
+ 0x15, 0xd0, 0x6, 0x39, 0xf7, 0x64, 0xdd, 0xf7,
+ 0x5c, 0x5, 0x46, 0x6, 0x29, 0xfb, 0x5c, 0x5,
+ 0xe, 0xf7, 0xe5, 0x78, 0xf7, 0x13, 0xfb, 0x7,
+ 0xf7, 0x10, 0xf7, 0x59, 0xf7, 0x10, 0xf7, 0x37,
+ 0xf7, 0x10, 0xfb, 0x7, 0xf7, 0x13, 0x12, 0xb0,
+ 0xf7, 0x27, 0xf7, 0xcd, 0xf7, 0x19, 0x13, 0x76,
+ 0xf8, 0x8e, 0x84, 0x15, 0xf8, 0x5b, 0xf7, 0x10,
+ 0xfb, 0xdf, 0xf7, 0x59, 0xf7, 0xad, 0xf7, 0x10,
+ 0xfb, 0xad, 0xf7, 0x37, 0xf7, 0xd1, 0xf7, 0x10,
+ 0xfc, 0x4d, 0x3a, 0x89, 0x6, 0x13, 0xae, 0xc2,
+ 0x64, 0x5e, 0xb1, 0x37, 0x1b, 0xfb, 0x48, 0xfb,
+ 0xb, 0xfb, 0x26, 0xfb, 0x71, 0xfb, 0x7c, 0xeb,
+ 0xfb, 0x31, 0xf7, 0x55, 0xc0, 0xdb, 0x99, 0xdf,
+ 0xba, 0x1f, 0x13, 0x6e, 0xfb, 0xd6, 0xf7, 0xb7,
+ 0x15, 0xf7, 0x21, 0xaf, 0xee, 0xf7, 0x8, 0xf7,
+ 0x0, 0xc0, 0x3c, 0xfb, 0x35, 0x1e, 0x13, 0xb6,
+ 0xfb, 0x5b, 0x3d, 0x4c, 0x2e, 0x29, 0x5f, 0xcf,
+ 0xf7, 0x56, 0x1e, 0xe, 0xfc, 0x15, 0xf8, 0x6f,
+ 0x76, 0xf7, 0xa5, 0x77, 0x12, 0xd0, 0xf7, 0x15,
+ 0x17, 0xd0, 0xf8, 0x5a, 0x15, 0xf7, 0x15, 0xf7,
+ 0x10, 0x6, 0x13, 0xe0, 0x4d, 0x6, 0x8d, 0xd4,
+ 0xba, 0x9a, 0xa3, 0x93, 0x72, 0xc0, 0x18, 0xfb,
+ 0x7, 0x62, 0x8b, 0x35, 0x51, 0x1a, 0xe, 0xfc,
+ 0x15, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x12,
+ 0xdb, 0xf7, 0x15, 0x48, 0xce, 0x13, 0xe0, 0xe9,
+ 0xf8, 0x51, 0x15, 0xf7, 0x7, 0x45, 0xa, 0xfb,
+ 0x15, 0xfb, 0x13, 0x7, 0x13, 0xd0, 0xc9, 0x6,
+ 0x89, 0x42, 0x5c, 0x7f, 0x73, 0x83, 0x8, 0xe,
+ 0xfb, 0x37, 0xf8, 0x5a, 0xf7, 0x10, 0xf7, 0x29,
+ 0x77, 0x12, 0xcb, 0xd1, 0x45, 0xf7, 0x1a, 0xe7,
+ 0xd0, 0x46, 0xf7, 0x1a, 0x13, 0xd8, 0xcb, 0xf8,
+ 0x5a, 0x15, 0xf7, 0x1a, 0xf7, 0x10, 0x6, 0x13,
+ 0xd4, 0x4b, 0x6, 0x8d, 0xd4, 0xbc, 0x9a, 0xa4,
+ 0x93, 0x71, 0xc0, 0x18, 0xfb, 0xc, 0x62, 0x8b,
+ 0x34, 0x52, 0x1a, 0xf7, 0x76, 0x33, 0x15, 0xf7,
+ 0x1a, 0xf7, 0x10, 0x6, 0x13, 0xe4, 0x4a, 0x6,
+ 0x8d, 0xd4, 0xbc, 0x9a, 0xa5, 0x93, 0x70, 0xc0,
+ 0x18, 0xfb, 0xb, 0x62, 0x8b, 0x34, 0x52, 0x1a,
+ 0xe, 0xfb, 0x37, 0xf8, 0x66, 0x76, 0xf7, 0x26,
+ 0xf7, 0x13, 0x1, 0xd7, 0xf7, 0x1a, 0xe7, 0xf7,
+ 0x1a, 0x3, 0xf7, 0xd0, 0xf8, 0x51, 0x15, 0xf7,
+ 0xc, 0x45, 0xa, 0xfb, 0x1a, 0xfb, 0x13, 0xcb,
+ 0x7, 0x98, 0xa, 0x72, 0x83, 0x8, 0xfb, 0x5b,
+ 0x56, 0x15, 0xf7, 0xb, 0x45, 0xa, 0xfb, 0x1a,
+ 0xfb, 0x13, 0xcc, 0x7, 0x98, 0xa, 0x71, 0x83,
+ 0x8, 0xe, 0xfb, 0xcd, 0xf7, 0x6b, 0x76, 0xf7,
+ 0xde, 0x77, 0x1, 0x95, 0xf7, 0xde, 0x3, 0x95,
+ 0xf7, 0xfb, 0x15, 0x30, 0xd5, 0x41, 0xe5, 0xe6,
+ 0xd6, 0xd4, 0xe7, 0xe8, 0x40, 0xd3, 0x30, 0x30,
+ 0x42, 0x42, 0x2f, 0x1e, 0xe, 0x20, 0xf7, 0x77,
+ 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xf8, 0xc0, 0xf5,
+ 0xfc, 0xc0, 0x6, 0xe, 0xf7, 0xe5, 0xf7, 0x77,
+ 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xfa, 0x7c, 0xf5,
+ 0xfe, 0x7c, 0x6, 0xe, 0xf8, 0xf8, 0xf7, 0x11,
+ 0x21, 0x76, 0xb7, 0xde, 0x8a, 0x77, 0x12, 0x13,
+ 0x60, 0x7a, 0xf8, 0xf6, 0x15, 0xcf, 0x65, 0xa,
+ 0xab, 0xaf, 0x1b, 0xab, 0xa6, 0x81, 0x80, 0xa6,
+ 0x1f, 0x13, 0x80, 0x81, 0xa6, 0xa5, 0x80, 0xa8,
+ 0x1b, 0xe9, 0x8b, 0xee, 0xa5, 0x1f, 0x46, 0x7a,
+ 0xa, 0x6d, 0x66, 0x1b, 0x7f, 0x71, 0x95, 0x96,
+ 0x6d, 0x1f, 0x13, 0x50, 0x96, 0x6d, 0x69, 0x96,
+ 0x71, 0x1b, 0x44, 0x71, 0x59, 0x3f, 0x1f, 0xe,
+ 0xf7, 0xe5, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4,
+ 0x1, 0xf7, 0x5b, 0xe3, 0xf7, 0x54, 0xdf, 0xf7,
+ 0xca, 0xde, 0x3, 0xf7, 0x5b, 0xf7, 0xc6, 0x15,
+ 0xe3, 0xf7, 0xe7, 0xf7, 0x2b, 0xd4, 0xfc, 0x1e,
+ 0x42, 0xf7, 0x2f, 0x6, 0xf7, 0xac, 0xfb, 0xe7,
+ 0x15, 0xdf, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x5,
+ 0xfb, 0xdc, 0x5, 0xda, 0x6, 0xf7, 0x5, 0xf7,
+ 0xdc, 0x5, 0x8e, 0xfb, 0xdc, 0xde, 0xf8, 0x30,
+ 0xfb, 0x1e, 0x6, 0x28, 0xfb, 0xaf, 0x6e, 0xa,
+ 0x27, 0xf7, 0xaf, 0x5, 0x81, 0xa, 0x20, 0x7d,
+ 0xed, 0xf8, 0xa1, 0xf7, 0x21, 0x1, 0xbc, 0xf7,
+ 0x15, 0xf7, 0x5f, 0xf7, 0x1e, 0x3, 0xa9, 0xf7,
+ 0x26, 0x15, 0xfb, 0x1c, 0x9e, 0xf7, 0x33, 0x73,
+ 0xd4, 0x1b, 0xf7, 0x40, 0xcd, 0xe8, 0xdc, 0xf7,
+ 0x6, 0x22, 0xa6, 0x2e, 0xa1, 0x1f, 0x66, 0x94,
+ 0x21, 0x98, 0xb5, 0x1a, 0xb5, 0xd2, 0x8c, 0xa2,
+ 0xa4, 0xc3, 0x89, 0x4e, 0x9c, 0x1e, 0xf7, 0x18,
+ 0xa3, 0x5, 0xf2, 0x6d, 0x3d, 0xad, 0xfb, 0x11,
+ 0x1b, 0xfb, 0x2, 0xfb, 0x2, 0x63, 0xfb, 0xb,
+ 0xfb, 0xf, 0xf2, 0x75, 0xf7, 0x33, 0x69, 0x1f,
+ 0xab, 0x84, 0xb1, 0x7f, 0x6d, 0x1a, 0x53, 0x33,
+ 0x8a, 0x7f, 0x5e, 0x58, 0x99, 0xd0, 0x7a, 0x1e,
+ 0xb5, 0xf8, 0x4e, 0x15, 0xf7, 0x14, 0x6, 0xf3,
+ 0xf7, 0x21, 0x5, 0x7c, 0xa, 0x56, 0x42, 0x51,
+ 0xd4, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x5d, 0xa,
+ 0xde, 0xd7, 0x15, 0xcf, 0x6, 0xee, 0xf7, 0x5f,
+ 0x28, 0xf7, 0x61, 0x5, 0x47, 0x6, 0xdc, 0xfb,
+ 0x61, 0x5, 0xe, 0xf7, 0xad, 0x7d, 0xf7, 0x0,
+ 0xfb, 0x0, 0xf7, 0x8, 0xf7, 0xf, 0xe4, 0xf7,
+ 0x8, 0xf7, 0x8, 0x24, 0xf2, 0x12, 0xad, 0xf7,
+ 0x24, 0xf7, 0x8b, 0xf7, 0x1f, 0x13, 0xb6, 0xf8,
+ 0x7c, 0xc7, 0x15, 0x41, 0xd4, 0xe3, 0x8b, 0x9c,
+ 0x1b, 0xe4, 0xf7, 0x3, 0xb1, 0xf7, 0x10, 0xb2,
+ 0x1f, 0xfb, 0x1c, 0xa2, 0x5, 0x6f, 0x81, 0x70,
+ 0x5a, 0x49, 0x1b, 0x4b, 0x6a, 0xbb, 0xde, 0x86,
+ 0x1f, 0xf7, 0xf0, 0x6, 0xf7, 0x82, 0x29, 0xde,
+ 0xfb, 0x28, 0xfb, 0x0, 0x57, 0x52, 0x7a, 0x7a,
+ 0x1e, 0xd0, 0x46, 0x35, 0x90, 0x6c, 0x1b, 0xfb,
+ 0x4c, 0x36, 0xfb, 0x18, 0xfb, 0x24, 0xfb, 0x20,
+ 0xe7, 0xfb, 0x24, 0xf7, 0x45, 0xef, 0xc5, 0xbc,
+ 0xa4, 0xa6, 0x1f, 0xfb, 0xca, 0xf7, 0x66, 0x15,
+ 0xf7, 0xc, 0xc0, 0xb3, 0xd3, 0xce, 0xc2, 0x53,
+ 0x23, 0x1e, 0x13, 0x6e, 0xfb, 0x2c, 0x2e, 0x7b,
+ 0x6e, 0x2c, 0x6d, 0xf7, 0x8, 0xbf, 0x1e, 0xf8,
+ 0x17, 0xb7, 0x15, 0xa6, 0x8d, 0x91, 0xf1, 0xe8,
+ 0x1b, 0xf0, 0x94, 0xfb, 0x0, 0x76, 0x8c, 0x1f,
+ 0xe, 0x8f, 0xa0, 0x76, 0xf9, 0xb2, 0xf7, 0x9,
+ 0x12, 0xf7, 0x45, 0xf7, 0x5, 0x72, 0xf7, 0x1d,
+ 0x73, 0xf7, 0x5, 0x13, 0xd0, 0x70, 0xa, 0xf8,
+ 0x33, 0x4f, 0xa, 0xfc, 0x32, 0x5, 0x13, 0xe8,
+ 0x33, 0xf8, 0x85, 0x8b, 0xa, 0xf7, 0x5d, 0xfb,
+ 0x9, 0x8b, 0xa, 0xe, 0xfb, 0x39, 0x76, 0xf8,
+ 0xd9, 0xf7, 0x1d, 0x12, 0xe5, 0xf7, 0x2e, 0xfb,
+ 0x28, 0xf7, 0x22, 0x13, 0xd0, 0xeb, 0xf8, 0x1f,
+ 0x15, 0xf7, 0x22, 0xf7, 0x1d, 0xfb, 0x22, 0x6,
+ 0x13, 0xe0, 0x85, 0xfc, 0xba, 0x15, 0xfb, 0x3c,
+ 0xf7, 0x2e, 0xf7, 0x3c, 0x7, 0x65, 0xf8, 0x0,
+ 0x5, 0x38, 0x6, 0xe, 0x20, 0x2a, 0x76, 0xf3,
+ 0xf7, 0x1, 0xf7, 0xcf, 0xf5, 0xf7, 0x4, 0x77,
+ 0x1, 0xad, 0xf7, 0x1a, 0x3, 0xf7, 0x42, 0x90,
+ 0x15, 0x6c, 0x21, 0xc6, 0x7a, 0xab, 0xf7, 0x0,
+ 0x5, 0x89, 0x94, 0x9b, 0x89, 0xa4, 0x1b, 0xf7,
+ 0x18, 0xdb, 0xc8, 0xf7, 0xe, 0xa7, 0x1f, 0xfb,
+ 0x1b, 0xa2, 0x5, 0x6e, 0x86, 0x77, 0x47, 0x3b,
+ 0x1b, 0x7f, 0x8a, 0x8c, 0x8c, 0x87, 0x1f, 0xe5,
+ 0xf7, 0xb4, 0x9d, 0x78, 0x90, 0x74, 0x8d, 0x7f,
+ 0x19, 0xf7, 0x1b, 0xa2, 0x70, 0xe8, 0x58, 0xad,
+ 0x5c, 0x9d, 0x19, 0xb2, 0xf7, 0x4, 0x4f, 0x9c,
+ 0x64, 0xfb, 0x7, 0x5, 0x8c, 0x81, 0x7d, 0x8d,
+ 0x75, 0x1b, 0xfb, 0x62, 0x5d, 0xfb, 0x35, 0x25,
+ 0x3a, 0xb7, 0xfb, 0x25, 0xeb, 0x75, 0x1f, 0xb1,
+ 0xf7, 0xc, 0x15, 0x67, 0xb4, 0x83, 0xce, 0x9f,
+ 0x1a, 0xab, 0x92, 0xf7, 0x1c, 0xf7, 0x11, 0x80,
+ 0x1e, 0xe, 0x20, 0x7b, 0xf7, 0xf, 0xf7, 0x50,
+ 0xf7, 0x1, 0xf7, 0x62, 0xf7, 0x0, 0x1, 0xdd,
+ 0xf7, 0x14, 0x3, 0xd9, 0x7b, 0x15, 0x9b, 0xa2,
+ 0xb0, 0xa5, 0xc3, 0x1b, 0xab, 0xb8, 0x82, 0x81,
+ 0xb4, 0x1f, 0x80, 0xb9, 0xb4, 0x7f, 0x97, 0x1b,
+ 0xbc, 0xbd, 0x9d, 0x9c, 0xaa, 0x1f, 0x58, 0xf7,
+ 0x7, 0x5, 0x81, 0x74, 0x67, 0x7a, 0x66, 0x1b,
+ 0x72, 0x79, 0x92, 0x92, 0x75, 0x1f, 0x91, 0x77,
+ 0x73, 0x91, 0x67, 0x1b, 0x83, 0x6c, 0x8b, 0x7d,
+ 0x73, 0x1f, 0x89, 0x8d, 0xb1, 0xb4, 0xb4, 0xbd,
+ 0x83, 0xde, 0x19, 0xf7, 0x11, 0xf7, 0x1, 0xfb,
+ 0x27, 0x6, 0x82, 0xa4, 0x7d, 0xc2, 0xae, 0x1a,
+ 0xb2, 0xa5, 0xbf, 0xc8, 0xd4, 0x98, 0x42, 0x73,
+ 0x90, 0x1e, 0xf7, 0x13, 0x9e, 0x5, 0xf7, 0x3f,
+ 0x73, 0xfb, 0x1b, 0x9a, 0x50, 0x1b, 0xfb, 0x1c,
+ 0x3c, 0x2e, 0x22, 0x7e, 0x8c, 0x5a, 0x9d, 0x55,
+ 0x1f, 0x42, 0xfb, 0x1, 0xec, 0x6, 0x98, 0x3d,
+ 0x5b, 0x45, 0x4d, 0x5d, 0x8, 0xe, 0x20, 0xec,
+ 0x76, 0xb5, 0xf7, 0x16, 0xf7, 0x6c, 0xf7, 0x16,
+ 0xb5, 0x77, 0x1, 0xb2, 0xf7, 0x17, 0xf7, 0x6e,
+ 0xf7, 0x16, 0x3, 0xe6, 0xd8, 0x15, 0xd2, 0xd2,
+ 0x5, 0x78, 0xae, 0xb3, 0x80, 0xb4, 0x1b, 0xb7,
+ 0xb5, 0x97, 0x9e, 0xaa, 0x1f, 0xd5, 0x42, 0xe5,
+ 0xe6, 0x43, 0xd3, 0x5, 0x9e, 0xae, 0x97, 0xb3,
+ 0xb5, 0x1a, 0xab, 0x83, 0xb5, 0x74, 0xb6, 0x1e,
+ 0xd3, 0xd3, 0x30, 0xe6, 0x42, 0x42, 0x5, 0x95,
+ 0x78, 0x66, 0xa0, 0x4e, 0x1b, 0x4e, 0x63, 0x76,
+ 0x81, 0x7a, 0x1f, 0x42, 0xd4, 0x31, 0x2b, 0xd2,
+ 0x46, 0x5, 0x78, 0x68, 0x81, 0x64, 0x62, 0x1a,
+ 0x71, 0x8f, 0x60, 0xa6, 0x5b, 0x1e, 0x44, 0x45,
+ 0x5, 0xf7, 0x3f, 0xf7, 0x4f, 0x15, 0xc7, 0xbb,
+ 0xbb, 0xc7, 0xc7, 0xbd, 0x5b, 0x4f, 0x4f, 0x59,
+ 0x5b, 0x4f, 0x4f, 0x5b, 0xbb, 0xc7, 0x1e, 0xe,
+ 0x20, 0xa0, 0x76, 0xf9, 0x4e, 0x77, 0x1, 0xf7,
+ 0x61, 0xf7, 0x23, 0x3, 0x9b, 0xf7, 0x2a, 0x15,
+ 0xf7, 0x51, 0xfb, 0x2a, 0xf7, 0x23, 0xf7, 0x2a,
+ 0xf7, 0x54, 0xf5, 0xfb, 0x54, 0xd0, 0xf7, 0x54,
+ 0xf5, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xf7, 0x9f,
+ 0x96, 0xa, 0xfb, 0x16, 0xfb, 0xa0, 0x6e, 0xa,
+ 0xfb, 0x14, 0xf7, 0xa0, 0x96, 0xa, 0xf7, 0x22,
+ 0xfb, 0x9f, 0x5, 0xfb, 0x9, 0x21, 0xf7, 0x51,
+ 0x46, 0xfb, 0x51, 0x6, 0xe, 0xfc, 0x13, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0xdf, 0xf7, 0x4,
+ 0x3, 0xdf, 0x78, 0x15, 0xf7, 0x4, 0xf7, 0xcb,
+ 0x7c, 0xa, 0xf7, 0x1b, 0x4, 0xf7, 0x4, 0xf7,
+ 0xca, 0x7c, 0xa, 0xe, 0x20, 0xfb, 0x4c, 0xf1,
+ 0xf9, 0x57, 0xf1, 0x12, 0xad, 0xf7, 0x10, 0x38,
+ 0xf7, 0x1c, 0xf7, 0x27, 0xf7, 0x1a, 0x32, 0xf7,
+ 0xb, 0x13, 0xe8, 0xc8, 0x7f, 0x15, 0xfb, 0x7,
+ 0x9b, 0xe6, 0x52, 0xf7, 0x8, 0x1b, 0xf7, 0x2d,
+ 0xc2, 0xe3, 0xd7, 0xaf, 0x7e, 0xb7, 0x5e, 0xb5,
+ 0x1f, 0x13, 0xd4, 0xa9, 0x9e, 0xc5, 0xb7, 0xe0,
+ 0x1a, 0xd0, 0x67, 0xc0, 0x23, 0xcd, 0x1e, 0x57,
+ 0xab, 0xfb, 0xb, 0xcb, 0xba, 0x1a, 0x9f, 0x95,
+ 0xa3, 0xbb, 0xba, 0xaa, 0x71, 0x5d, 0x8d, 0x1e,
+ 0xf7, 0x19, 0x9a, 0x5, 0xc5, 0x83, 0x60, 0xf0,
+ 0xfb, 0x36, 0x1b, 0xfb, 0xe, 0x43, 0x49, 0x35,
+ 0x53, 0xad, 0x67, 0x99, 0x7c, 0x1f, 0x13, 0xe8,
+ 0x44, 0x61, 0x79, 0x48, 0x60, 0x1a, 0x24, 0xb6,
+ 0x6d, 0xf7, 0x1e, 0x36, 0x1e, 0xbd, 0x6c, 0xe8,
+ 0x5f, 0x59, 0x1a, 0x65, 0x63, 0x7a, 0x69, 0x4c,
+ 0x77, 0xb8, 0xb3, 0x83, 0x1e, 0xf7, 0x3c, 0xf7,
+ 0x30, 0x15, 0xfb, 0x1f, 0xe7, 0x5, 0x61, 0xa8,
+ 0x75, 0xa8, 0xac, 0x1a, 0xaf, 0xa9, 0xa3, 0x96,
+ 0x90, 0x1e, 0xf7, 0x18, 0x2d, 0x5, 0x13, 0xe4,
+ 0xb8, 0x6a, 0xa6, 0x78, 0x6b, 0x1a, 0x72, 0x7a,
+ 0x75, 0x72, 0x74, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+ 0x7, 0x1, 0x91, 0xf7, 0x7, 0xe6, 0xf7, 0x7,
+ 0x3, 0x91, 0x44, 0xa, 0xe, 0xd5, 0x78, 0xd6,
+ 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8, 0xd6, 0x1,
+ 0x80, 0xd6, 0xf7, 0xb, 0xe2, 0xf8, 0x28, 0xd6,
+ 0x3, 0xcb, 0xf7, 0xfb, 0x15, 0xf7, 0x3c, 0xf7,
+ 0x1d, 0xf7, 0x1b, 0xf7, 0x3d, 0x58, 0xa, 0xfb,
+ 0x3d, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e,
+ 0xf8, 0x22, 0x53, 0x15, 0x76, 0x84, 0x78, 0x4c,
+ 0x45, 0x1b, 0x5e, 0x58, 0xad, 0xf5, 0xbd, 0x99,
+ 0xe4, 0xe4, 0xc9, 0x9e, 0x5b, 0x77, 0x92, 0x1f,
+ 0xdb, 0x9e, 0x5, 0xaf, 0x7e, 0x66, 0xdf, 0xfb,
+ 0xa, 0x1b, 0xfb, 0x10, 0x49, 0x36, 0xfb, 0x11,
+ 0xfb, 0x2f, 0xeb, 0x53, 0xe2, 0xcc, 0xdc, 0xa9,
+ 0xed, 0xa8, 0x1f, 0xfc, 0xbc, 0xde, 0x15, 0xfb,
+ 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7, 0x67, 0x57,
+ 0xa, 0xfb, 0x67, 0x80, 0xa, 0xfb, 0xb9, 0xf7,
+ 0xa8, 0xe7, 0xf7, 0xa5, 0xeb, 0x1, 0xa1, 0xef,
+ 0xf7, 0x4, 0xed, 0x3, 0xf7, 0x93, 0xf7, 0xb3,
+ 0x15, 0xe7, 0x6, 0x7c, 0xaf, 0x8b, 0xa0, 0xd3,
+ 0x1a, 0xf7, 0x27, 0x7, 0xf0, 0x8b, 0xd4, 0xfb,
+ 0x29, 0x3a, 0x5a, 0x6b, 0x2f, 0x7a, 0x1e, 0xe6,
+ 0x73, 0x5, 0x8c, 0x8d, 0x8f, 0x8c, 0x8e, 0x1e,
+ 0xa5, 0x93, 0x93, 0x9d, 0xb1, 0x1b, 0xba, 0x8c,
+ 0x79, 0x5a, 0x8d, 0x1f, 0x78, 0x83, 0x73, 0x85,
+ 0x79, 0x86, 0x8, 0x35, 0x74, 0x4a, 0x7f, 0xfb,
+ 0x0, 0x1a, 0x41, 0xb5, 0x4d, 0xd6, 0xc1, 0xaf,
+ 0xae, 0x9e, 0x9a, 0x1e, 0x8d, 0x80, 0x8e, 0x7b,
+ 0x91, 0x7b, 0x8, 0x76, 0xf7, 0x62, 0x15, 0x72,
+ 0x7, 0x30, 0x5a, 0x82, 0x7c, 0x69, 0x7d, 0xa4,
+ 0x9e, 0xb3, 0xaa, 0x9a, 0xbd, 0x97, 0x1e, 0x9f,
+ 0x90, 0x8f, 0x8f, 0x92, 0x90, 0x8, 0xe, 0x20,
+ 0x5d, 0xa, 0xf8, 0x10, 0xd7, 0x53, 0xa, 0x61,
+ 0xfb, 0x64, 0x53, 0xa, 0xe, 0x3c, 0xf7, 0x15,
+ 0x76, 0x1, 0xf8, 0x20, 0xf7, 0x13, 0x3, 0xb3,
+ 0xf7, 0xc6, 0x15, 0xf7, 0xf9, 0xfb, 0x5a, 0xf7,
+ 0x13, 0xf7, 0xcb, 0xfc, 0x78, 0x6, 0xe, 0x3c,
+ 0xf7, 0x59, 0xf7, 0x4, 0x1, 0xb3, 0xf7, 0x59,
+ 0x15, 0xf8, 0x8c, 0xf7, 0x4, 0xfc, 0x8c, 0x6,
+ 0xe, 0xd5, 0x78, 0xd6, 0xf7, 0x9e, 0xca, 0xf7,
+ 0x1, 0xcb, 0xf3, 0xd6, 0x1, 0x80, 0xd6, 0xf7,
+ 0x19, 0xdc, 0xf7, 0x32, 0xe2, 0xf7, 0x2a, 0xd6,
+ 0x3, 0xf7, 0x59, 0xf7, 0x31, 0x15, 0xdc, 0xf7,
+ 0x39, 0xab, 0x6, 0xb4, 0x9e, 0x85, 0x2e, 0xbb,
+ 0x1f, 0xa7, 0x49, 0x5, 0xf0, 0x6, 0x5c, 0xdc,
+ 0x67, 0xc7, 0x7f, 0x9f, 0x66, 0x99, 0x19, 0x8d,
+ 0x7, 0xdd, 0x96, 0xa5, 0xc3, 0xb8, 0x1a, 0xf0,
+ 0x34, 0x96, 0xfb, 0x13, 0x1e, 0x7c, 0xa, 0xdc,
+ 0xfb, 0x41, 0x15, 0xf7, 0x1, 0xac, 0x7, 0xd2,
+ 0xc1, 0x8b, 0x56, 0x53, 0x57, 0x8b, 0x42, 0x1f,
+ 0xfb, 0x8b, 0x71, 0x15, 0xf7, 0x3c, 0xf7, 0x1d,
+ 0xf7, 0x1b, 0xf7, 0x3c, 0x58, 0xa, 0xfb, 0x3c,
+ 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e, 0x40,
+ 0x16, 0xfb, 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7,
+ 0x66, 0x57, 0xa, 0xfb, 0x66, 0x80, 0xa, 0xf8,
+ 0xf0, 0xd5, 0x1, 0x85, 0xf7, 0xed, 0x3, 0x85,
+ 0xf8, 0xf0, 0x15, 0xf7, 0xed, 0xd5, 0xfb, 0xed,
+ 0x6, 0xe, 0xfb, 0x9b, 0xf8, 0x3e, 0xd6, 0xf7,
+ 0x1c, 0xd6, 0x1, 0xc4, 0xd5, 0xf7, 0x1e, 0xd5,
+ 0x3, 0xc4, 0xf8, 0xcf, 0x15, 0x3b, 0xca, 0x4a,
+ 0xda, 0xda, 0xcc, 0xcc, 0xdb, 0xdb, 0x4a, 0xc8,
+ 0x3c, 0x3c, 0x4c, 0x4e, 0x3b, 0x1e, 0xd5, 0x8a,
+ 0x15, 0xb1, 0xaa, 0xa8, 0xb1, 0xb1, 0xaa, 0x6f,
+ 0x64, 0x65, 0x6c, 0x6c, 0x65, 0x65, 0x6c, 0xaa,
+ 0xb1, 0x1e, 0xe, 0x3c, 0x8b, 0xe6, 0xf7, 0x42,
+ 0xf7, 0x6, 0xf7, 0x13, 0x90, 0xa, 0x16, 0xf8,
+ 0x8c, 0xe6, 0xfc, 0x8c, 0x6, 0xf7, 0x50, 0xb7,
+ 0x15, 0xf7, 0x13, 0xf7, 0x16, 0xf7, 0x51, 0xf7,
+ 0x6, 0xfb, 0x51, 0xf7, 0x13, 0xfb, 0x13, 0xfb,
+ 0x13, 0xfb, 0x50, 0xfb, 0x6, 0xf7, 0x50, 0x6,
+ 0xe, 0xf7, 0xaf, 0xdc, 0xf7, 0x9d, 0xdc, 0x1,
+ 0xf7, 0x76, 0xed, 0x3, 0x94, 0xf7, 0xaf, 0x15,
+ 0xf7, 0xcf, 0xdc, 0xfb, 0x46, 0x6, 0xf7, 0x9,
+ 0xe4, 0xc8, 0xbc, 0xdc, 0x1a, 0xbd, 0x64, 0xd8,
+ 0xfb, 0x4, 0xfb, 0x21, 0x83, 0x27, 0x67, 0x87,
+ 0x1e, 0xed, 0x82, 0x5, 0xa7, 0x8d, 0x90, 0xaf,
+ 0xbb, 0x1b, 0x92, 0xb9, 0x8b, 0x5d, 0x67, 0x73,
+ 0x78, 0x4b, 0x54, 0x1f, 0x28, 0x36, 0x6d, 0x69,
+ 0x44, 0x1a, 0xe, 0xf7, 0xa3, 0xdd, 0xf7, 0xa7,
+ 0xdd, 0x1, 0xf7, 0x61, 0xee, 0x3, 0x93, 0xf8,
+ 0x27, 0x15, 0xfb, 0xf, 0x9a, 0xf7, 0x2, 0x82,
+ 0xab, 0x1b, 0xe9, 0xce, 0xca, 0xd6, 0xbd, 0x70,
+ 0xae, 0x5e, 0x9d, 0x1f, 0xad, 0xa1, 0x9b, 0xa6,
+ 0xa9, 0x1a, 0xc8, 0x53, 0xc5, 0x34, 0xfb, 0xe,
+ 0x7b, 0x37, 0x63, 0x82, 0x1e, 0xea, 0x7d, 0x5,
+ 0xa0, 0x8d, 0x8f, 0xae, 0xb9, 0x1b, 0x9e, 0xa4,
+ 0x83, 0x6e, 0x5c, 0x50, 0x8c, 0x7d, 0x1f, 0x7f,
+ 0x38, 0x5, 0xb8, 0x9f, 0xc5, 0x79, 0x54, 0x1a,
+ 0x6f, 0x7a, 0x6f, 0x62, 0x57, 0x87, 0xb5, 0x9d,
+ 0x87, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, 0xf7,
+ 0x0, 0xf8, 0xf0, 0x15, 0xed, 0x6, 0xf7, 0x2a,
+ 0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x57, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x53, 0xf7, 0x5, 0x27, 0xef,
+ 0xf8, 0x47, 0x77, 0x49, 0xa, 0x13, 0xdc, 0xf7,
+ 0x61, 0xc9, 0x15, 0x8d, 0x6, 0x68, 0x9c, 0x9e,
+ 0x60, 0xcb, 0x1b, 0xbc, 0xb1, 0xaf, 0xb5, 0xa0,
+ 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4a, 0xf7, 0x14,
+ 0xf8, 0xab, 0xfb, 0x1f, 0xfb, 0x87, 0x7, 0x3e,
+ 0x87, 0xfb, 0x7, 0x2c, 0x2c, 0x84, 0xf7, 0x8,
+ 0xd9, 0x1e, 0xf7, 0x85, 0xfb, 0x1f, 0xfd, 0x77,
+ 0xf7, 0x1f, 0x7, 0xe, 0x20, 0xfb, 0x3e, 0x76,
+ 0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf8, 0x6, 0xf7,
+ 0x6, 0x3, 0xf7, 0x4a, 0xfb, 0x53, 0x15, 0xf7,
+ 0x7, 0xf9, 0x92, 0xd4, 0xfd, 0x92, 0xf7, 0x6,
+ 0xf9, 0x92, 0xc2, 0xf7, 0x11, 0xfb, 0xb4, 0x6,
+ 0xfb, 0x2e, 0x22, 0x5f, 0xfb, 0x2d, 0x5a, 0xa1,
+ 0xfb, 0x27, 0xf7, 0x3c, 0x1f, 0xe, 0xfc, 0x15,
+ 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x8, 0xf7,
+ 0x36, 0x3, 0xc5, 0xf7, 0x40, 0x15, 0xf7, 0x36,
+ 0xf7, 0x36, 0xfb, 0x36, 0x6, 0xe, 0xfb, 0x78,
+ 0xd0, 0xee, 0xc7, 0x1, 0xc6, 0x7c, 0x15, 0x7f,
+ 0x54, 0x5, 0x90, 0x99, 0xa3, 0x90, 0x9f, 0x1b,
+ 0xba, 0x94, 0x6e, 0x79, 0x69, 0x6e, 0x79, 0x60,
+ 0x67, 0x71, 0x8e, 0x8f, 0x76, 0x1f, 0x48, 0x7,
+ 0x84, 0xa1, 0xb7, 0x89, 0x9e, 0x1b, 0xd5, 0xdb,
+ 0xac, 0xe5, 0xd2, 0x57, 0xad, 0x4f, 0x7a, 0x69,
+ 0x86, 0x81, 0x74, 0x1f, 0xe, 0xf7, 0xc4, 0x76,
+ 0xf8, 0x3f, 0x77, 0x1, 0xf7, 0x1e, 0xee, 0x3,
+ 0xf7, 0x1e, 0xf7, 0xaf, 0x15, 0xee, 0xf8, 0x3f,
+ 0x3b, 0x6, 0x6f, 0x42, 0x31, 0x6f, 0x7e, 0x88,
+ 0x8, 0x34, 0x7, 0xa5, 0x92, 0xa5, 0x90, 0xc7,
+ 0xb5, 0x8, 0xe, 0xfb, 0xbe, 0xf7, 0xa8, 0xf4,
+ 0xf7, 0x92, 0xf1, 0x1, 0x91, 0xf7, 0x0, 0xf7,
+ 0x1e, 0xf7, 0x0, 0x3, 0x91, 0xf8, 0x94, 0x15,
+ 0xfb, 0x1a, 0xc7, 0x25, 0xf7, 0x7, 0xf7, 0x8,
+ 0xca, 0xf0, 0xf7, 0x1b, 0xf7, 0x12, 0x51, 0xee,
+ 0xfb, 0xd, 0xfb, 0x6, 0x4e, 0x30, 0xfb, 0x1a,
+ 0x1e, 0xf7, 0x0, 0x16, 0xbb, 0x93, 0xd6, 0xc6,
+ 0xc6, 0x97, 0x4f, 0x4c, 0x54, 0x80, 0x3f, 0x4f,
+ 0x51, 0x82, 0xda, 0xbf, 0x1e, 0xe, 0x20, 0x5d,
+ 0xa, 0xe3, 0xd7, 0x50, 0xa, 0xcb, 0xfb, 0x5f,
+ 0x50, 0xa, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa7,
+ 0x76, 0xd0, 0xcf, 0xf8, 0xdc, 0x77, 0xa0, 0x77,
+ 0x12, 0xa5, 0xf7, 0x57, 0xf8, 0x2c, 0xe1, 0x13,
+ 0x6e, 0xf8, 0x5b, 0xc4, 0x15, 0xf7, 0x42, 0x46,
+ 0xe1, 0xd0, 0xbe, 0xcf, 0x58, 0xf7, 0x71, 0x3f,
+ 0x6, 0xfb, 0x4c, 0xfb, 0x72, 0x5, 0xe1, 0x8c,
+ 0x15, 0xe1, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+ 0xae, 0xfc, 0x77, 0xfb, 0x24, 0x15, 0xd7, 0x6,
+ 0xf8, 0x38, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+ 0x48, 0xfb, 0xfa, 0x15, 0xe6, 0x6, 0x13, 0x76,
+ 0xf7, 0xf9, 0x41, 0x7, 0x72, 0x4e, 0x37, 0x74,
+ 0x7f, 0x88, 0x8, 0x42, 0x7, 0x8f, 0x8c, 0x91,
+ 0x8c, 0x8d, 0x8c, 0x96, 0x8e, 0xae, 0x94, 0xb9,
+ 0xa9, 0x8, 0xe, 0xf7, 0x3f, 0x7d, 0xd6, 0x50,
+ 0x76, 0xf7, 0x8a, 0xf7, 0xb, 0xf8, 0x0, 0x77,
+ 0x12, 0xa5, 0xf7, 0x5b, 0xf8, 0x71, 0xe7, 0x13,
+ 0x7c, 0xf7, 0x29, 0x78, 0x15, 0xd8, 0x6, 0xf8,
+ 0x3f, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, 0x50,
+ 0xfb, 0xfb, 0x15, 0xe8, 0xf7, 0xf8, 0x40, 0x6,
+ 0x71, 0x4e, 0x35, 0x76, 0x7f, 0x88, 0x8, 0x42,
+ 0x7, 0xa3, 0x91, 0xa4, 0x90, 0xc4, 0xae, 0x8,
+ 0x13, 0xbc, 0xf8, 0x0, 0xfc, 0xf5, 0x15, 0xf7,
+ 0xbe, 0xd6, 0xfb, 0x2e, 0x6, 0x94, 0x94, 0x91,
+ 0x91, 0x94, 0x90, 0x8, 0xf5, 0xd4, 0xa3, 0xb0,
+ 0xba, 0x1a, 0xb5, 0x69, 0xcd, 0x21, 0xfb, 0x18,
+ 0x80, 0x37, 0x6c, 0x87, 0x1e, 0xe7, 0x84, 0x5,
+ 0xa3, 0x8d, 0x90, 0xa9, 0xb8, 0x1b, 0x92, 0xb7,
+ 0x8a, 0x64, 0x6d, 0x73, 0x7b, 0x4f, 0x5e, 0x1f,
+ 0x2f, 0x41, 0x75, 0x6c, 0x83, 0x53, 0x8, 0xe,
+ 0xf7, 0x3f, 0x8d, 0x76, 0xa5, 0x76, 0xd0, 0xcf,
+ 0xf7, 0x71, 0xcf, 0xf7, 0x79, 0xcf, 0x8c, 0x77,
+ 0x12, 0xf7, 0x5c, 0xe8, 0xf8, 0x2, 0xe2, 0x13,
+ 0x7b, 0xf8, 0x75, 0xc2, 0x15, 0xf7, 0x46, 0x46,
+ 0xe2, 0xd0, 0xc0, 0xcf, 0x56, 0xf7, 0x71, 0x3e,
+ 0x6, 0xfb, 0x50, 0xfb, 0x72, 0x5, 0xe3, 0x8c,
+ 0x15, 0xe3, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+ 0xb7, 0xfc, 0x77, 0xfb, 0x22, 0x15, 0xd9, 0x6,
+ 0xf8, 0x42, 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc,
+ 0xe2, 0xfb, 0x94, 0x15, 0x25, 0x99, 0xf2, 0x83,
+ 0xa8, 0x1b, 0xe3, 0xca, 0xbf, 0xca, 0xb4, 0x72,
+ 0xa8, 0x60, 0x9a, 0x1f, 0xac, 0x9d, 0x9a, 0xa4,
+ 0xa4, 0x1a, 0x13, 0x7b, 0xbd, 0x56, 0xba, 0x39,
+ 0xfb, 0x5, 0x7c, 0x45, 0x6a, 0x83, 0x1e, 0xe3,
+ 0x7f, 0x5, 0x9d, 0x8d, 0x8f, 0xa8, 0xb5, 0x1b,
+ 0x9e, 0xa2, 0x86, 0x73, 0x64, 0x54, 0x8a, 0x7e,
+ 0x1f, 0x80, 0x46, 0x5, 0x90, 0x9e, 0x96, 0x8d,
+ 0x9a, 0x1b, 0xac, 0x9d, 0x71, 0x72, 0x73, 0x7b,
+ 0x74, 0x64, 0x5b, 0x87, 0xae, 0x9a, 0x88, 0x1f,
+ 0xe, 0x57, 0xfb, 0x57, 0xf5, 0xf8, 0x48, 0x77,
+ 0x1, 0xc2, 0xf7, 0x15, 0xbe, 0xf7, 0x19, 0x3,
+ 0xf7, 0x8b, 0xf7, 0xef, 0x15, 0x8e, 0x4b, 0x8a,
+ 0x76, 0x4c, 0x57, 0x8, 0x2e, 0x3a, 0x65, 0x5c,
+ 0x44, 0x1a, 0xfb, 0x5, 0xec, 0x2e, 0xf7, 0x27,
+ 0xf7, 0x37, 0xde, 0xf7, 0x4, 0xed, 0x91, 0x1e,
+ 0xfb, 0xc, 0x9c, 0x5, 0x3e, 0x7c, 0x5f, 0x5f,
+ 0x42, 0x1b, 0x52, 0x51, 0xab, 0xcc, 0xb7, 0xa1,
+ 0x9d, 0xcd, 0xc3, 0x1f, 0xe9, 0xda, 0x8f, 0xb8,
+ 0x89, 0xec, 0x8, 0xfb, 0x19, 0xbb, 0x15, 0xf7,
+ 0x19, 0xf7, 0x1d, 0xfb, 0x19, 0x6, 0xe, 0x35,
+ 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xf2, 0xf9,
+ 0xa8, 0x15, 0xde, 0x6, 0x4a, 0xf7, 0x28, 0x40,
+ 0xa, 0xfb, 0x5f, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+ 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xb7, 0xf9,
+ 0xa8, 0x15, 0xde, 0x6, 0xf7, 0x13, 0xf7, 0x28,
+ 0x40, 0xa, 0xfb, 0xe4, 0xfe, 0x3c, 0x28, 0xa,
+ 0x35, 0xa, 0xd5, 0x84, 0xa, 0xf7, 0x61, 0xf9,
+ 0xaa, 0x15, 0xf4, 0x6, 0xbe, 0xd4, 0xc1, 0x42,
+ 0x5, 0xf3, 0x6, 0x2b, 0x83, 0xa, 0xfb, 0xc,
+ 0x6, 0xfb, 0xaf, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+ 0xa, 0xf7, 0xf, 0xdf, 0x8a, 0x77, 0x12, 0x13,
+ 0xf0, 0xf7, 0x5e, 0xf9, 0xaf, 0x15, 0xc6, 0x65,
+ 0xa, 0xab, 0xaa, 0x1b, 0xa6, 0xa1, 0x82, 0x82,
+ 0x9f, 0x1f, 0x80, 0xa6, 0xa3, 0x7e, 0xa6, 0x1b,
+ 0xdd, 0x8b, 0xef, 0xa5, 0x1f, 0x4f, 0x7a, 0xa,
+ 0x6d, 0x6b, 0x1b, 0x81, 0x78, 0x95, 0x95, 0x73,
+ 0x1f, 0x13, 0xe8, 0x97, 0x72, 0x6d, 0x96, 0x6e,
+ 0x1b, 0x4d, 0x71, 0x5a, 0x3d, 0x8e, 0x1f, 0xfb,
+ 0x4a, 0xfd, 0xaf, 0x28, 0xa, 0x35, 0xa, 0xda,
+ 0xf7, 0xc, 0x1, 0xf7, 0x62, 0xf9, 0xaf, 0x15,
+ 0xf7, 0x4, 0xf7, 0xc, 0x7c, 0xa, 0xf7, 0x5c,
+ 0xfb, 0xc, 0x15, 0xf7, 0x4, 0xf7, 0xc, 0x7c,
+ 0xa, 0xfc, 0x16, 0xfe, 0x27, 0x28, 0xa, 0x35,
+ 0xa, 0xc0, 0xf7, 0x55, 0x1, 0x9f, 0x16, 0x27,
+ 0xa, 0xfb, 0x47, 0xf8, 0xd3, 0x15, 0x56, 0xb4,
+ 0x5f, 0xbd, 0xbc, 0xb5, 0xb5, 0xc2, 0xc3, 0x62,
+ 0xb3, 0x59, 0x58, 0x63, 0x62, 0x54, 0x1e, 0xbd,
+ 0x16, 0xa4, 0x9d, 0x9d, 0xa2, 0xa1, 0x9e, 0x7a,
+ 0x71, 0x73, 0x78, 0x77, 0x75, 0x75, 0x78, 0x9f,
+ 0xa3, 0x1e, 0xe, 0xf7, 0xe5, 0x8b, 0xf7, 0xe,
+ 0xba, 0xf7, 0x12, 0xa0, 0xf7, 0xe, 0xf7, 0x35,
+ 0xf7, 0xb, 0x1, 0xf8, 0x66, 0xf7, 0x1d, 0x3,
+ 0x90, 0x16, 0xf7, 0x2d, 0x6, 0xd1, 0xf7, 0x3d,
+ 0x5, 0xf7, 0x81, 0xfb, 0x3d, 0xf8, 0x7d, 0xf7,
+ 0xe, 0xfb, 0xf3, 0xf7, 0x56, 0xf7, 0xc2, 0xf7,
+ 0xe, 0xfb, 0xc2, 0xf7, 0x35, 0xf7, 0xe7, 0xf7,
+ 0xb, 0xfc, 0xfe, 0x6, 0x5e, 0xfc, 0x3b, 0x15,
+ 0xf7, 0x1a, 0xf7, 0xd0, 0x5, 0xc0, 0xfb, 0xd0,
+ 0x6, 0xe, 0xc6, 0xfb, 0x78, 0xc9, 0xe4, 0xbe,
+ 0x8d, 0xf7, 0x13, 0xf8, 0x8e, 0xf7, 0x14, 0x1,
+ 0xb7, 0xf7, 0x2d, 0xf7, 0x68, 0xea, 0x3, 0xf7,
+ 0x7c, 0xfb, 0x35, 0x15, 0x4f, 0x7, 0x85, 0xa7,
+ 0xbd, 0x8a, 0x8f, 0x1b, 0xf6, 0xde, 0xb1, 0xd2,
+ 0xb0, 0x78, 0xba, 0x30, 0x94, 0x1f, 0x8d, 0x7,
+ 0xf7, 0x65, 0xca, 0xf7, 0x40, 0xcc, 0x9d, 0x1f,
+ 0xfb, 0x24, 0xb9, 0x5, 0x3a, 0x79, 0x5d, 0x40,
+ 0x29, 0x1b, 0xfb, 0x26, 0x68, 0xf7, 0x11, 0xf7,
+ 0xe, 0xbb, 0x8b, 0xf7, 0x67, 0xf7, 0x4b, 0xd7,
+ 0xc8, 0x60, 0x3b, 0x9d, 0x1f, 0xf7, 0x27, 0xae,
+ 0x5, 0xf7, 0x40, 0x4d, 0xfb, 0x1b, 0xb7, 0x22,
+ 0x1b, 0xfb, 0x83, 0x2a, 0xfb, 0x4a, 0xfb, 0x61,
+ 0xfb, 0x7a, 0xf7, 0x20, 0xfb, 0x24, 0xf7, 0x45,
+ 0x1f, 0x89, 0x7, 0x8c, 0x7, 0x75, 0x8a, 0x76,
+ 0x88, 0x72, 0x82, 0x7d, 0x5a, 0x18, 0x8f, 0x9b,
+ 0xa6, 0x91, 0xa2, 0x1b, 0xc0, 0x96, 0x6f, 0x7d,
+ 0x61, 0x54, 0x86, 0x63, 0x6d, 0x86, 0x8b, 0x90,
+ 0x5c, 0x1f, 0xe, 0x33, 0xa, 0xf7, 0x8a, 0xbb,
+ 0x15, 0xe3, 0x6, 0x46, 0xf7, 0x28, 0x5, 0xfb,
+ 0x2d, 0x6, 0xe, 0x33, 0xa, 0xf7, 0x4c, 0xbb,
+ 0x15, 0xe2, 0x6, 0xf7, 0x1b, 0xf7, 0x28, 0x5,
+ 0xfb, 0x2e, 0x6, 0xe, 0x3a, 0xa, 0xbd, 0x84,
+ 0xa, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x3d, 0xf9,
+ 0xaa, 0x15, 0xf7, 0x3, 0x6, 0xc0, 0xd4, 0xc5,
+ 0x42, 0x5, 0xf7, 0x2, 0x6, 0x26, 0x83, 0xa,
+ 0xfb, 0x14, 0x6, 0xfb, 0x58, 0xfe, 0x3c, 0x15,
+ 0x2e, 0xa, 0xe, 0x3a, 0xa, 0xc3, 0xf7, 0xb,
+ 0x12, 0xd7, 0xf7, 0x24, 0x59, 0xf7, 0xa, 0xe9,
+ 0xf7, 0xa, 0x13, 0xf6, 0xf7, 0x3e, 0xf9, 0xb0,
+ 0x8e, 0xa, 0xf7, 0x68, 0xfb, 0xb, 0x8e, 0xa,
+ 0x13, 0xfa, 0xfb, 0xc6, 0xfe, 0x27, 0x15, 0x2e,
+ 0xa, 0xe, 0x4c, 0xa, 0xf9, 0xad, 0xf7, 0x23,
+ 0x94, 0xa, 0xe9, 0xf9, 0xad, 0x15, 0xe2, 0x6,
+ 0x3d, 0x75, 0xa, 0xf7, 0xb, 0x46, 0xa, 0x4c,
+ 0xa, 0xfa, 0x3c, 0x77, 0x94, 0xa, 0xcb, 0xf9,
+ 0xad, 0x15, 0xe2, 0x6, 0xf7, 0x46, 0x75, 0xa,
+ 0x20, 0x46, 0xa, 0x4c, 0xa, 0xf9, 0xaf, 0xf7,
+ 0x21, 0x94, 0xa, 0x66, 0xf9, 0xaf, 0x95, 0xa,
+ 0xd1, 0xc8, 0x45, 0x77, 0xa, 0xf7, 0x21, 0x5,
+ 0xfb, 0x1b, 0x6, 0x87, 0x46, 0xa, 0x4c, 0xa,
+ 0xf9, 0xb3, 0xf7, 0x8, 0x1, 0xd0, 0x63, 0xa,
+ 0xf9, 0x60, 0x68, 0xa, 0x31, 0xde, 0x92, 0xa,
+ 0xf7, 0x62, 0xfb, 0x8, 0x92, 0xa, 0xe, 0xc6,
+ 0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x82, 0xa, 0xd2,
+ 0xf7, 0x27, 0xf7, 0xcc, 0xf7, 0x2f, 0x3, 0xf7,
+ 0x6e, 0xf7, 0xd, 0x15, 0xf7, 0x4f, 0xf7, 0x31,
+ 0xef, 0xfb, 0x31, 0xf7, 0x51, 0xf7, 0x0, 0x7,
+ 0xf7, 0x24, 0xc7, 0x8b, 0xfb, 0x86, 0xfb, 0x7a,
+ 0x2e, 0x87, 0xfb, 0x0, 0x1f, 0xfb, 0x96, 0xfb,
+ 0xd, 0x15, 0xf7, 0x96, 0x6, 0xf7, 0x8e, 0xf5,
+ 0xf7, 0x46, 0xf7, 0x42, 0xf7, 0x9d, 0xfb, 0x1,
+ 0xf0, 0xfb, 0x8e, 0x1f, 0xfb, 0x93, 0xfb, 0xca,
+ 0x3f, 0x27, 0xd7, 0x6, 0xe, 0x69, 0xa, 0xf9,
+ 0x74, 0x77, 0xf7, 0x62, 0x5c, 0xa, 0xf8, 0x74,
+ 0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x74, 0x5, 0xf7,
+ 0x2a, 0xf9, 0x74, 0xfb, 0x1e, 0xfc, 0x7f, 0x89,
+ 0x6, 0xfb, 0xc1, 0xf8, 0x7f, 0x5, 0xfb, 0x24,
+ 0x6, 0xf7, 0xb, 0xc6, 0x15, 0xcb, 0x65, 0xa,
+ 0xab, 0xad, 0x1b, 0xaa, 0xa2, 0x80, 0x81, 0xa3,
+ 0x1f, 0x81, 0xa4, 0xa4, 0x80, 0xab, 0x1b, 0xe3,
+ 0x8b, 0xef, 0xa5, 0x1f, 0x4a, 0x7a, 0xa, 0x6d,
+ 0x68, 0x1b, 0x80, 0x77, 0x95, 0x95, 0x71, 0x1f,
+ 0x97, 0x71, 0x69, 0x96, 0x6a, 0x1b, 0x48, 0x70,
+ 0x5a, 0x3d, 0x8e, 0x1f, 0xe, 0x59, 0xa, 0xd1,
+ 0xf7, 0x23, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x0,
+ 0x85, 0xa, 0xb7, 0xf7, 0xf4, 0x29, 0xa, 0xfb,
+ 0x22, 0x51, 0x22, 0xfb, 0x1f, 0xfb, 0x2c, 0x5e,
+ 0xf7, 0x4, 0xf7, 0x1b, 0x1e, 0xf7, 0x4d, 0xf8,
+ 0x4d, 0x15, 0xe1, 0x6, 0x47, 0x67, 0xa, 0xfb,
+ 0x2c, 0x6, 0xe, 0x5f, 0xa, 0xf8, 0x82, 0xf7,
+ 0x10, 0xd1, 0xf7, 0x23, 0x7e, 0xa, 0xf7, 0xcf,
+ 0xf9, 0xad, 0x15, 0xe1, 0x6, 0xf7, 0x1a, 0x67,
+ 0xa, 0xfb, 0x2c, 0x6, 0xfb, 0xe7, 0x31, 0xa,
+ 0x54, 0xfb, 0xb, 0xfb, 0x22, 0x41, 0xa, 0x5f,
+ 0xa, 0xf8, 0x82, 0xf7, 0x10, 0xd3, 0xf7, 0x21,
+ 0x7e, 0xa, 0xf7, 0x74, 0xf9, 0xaf, 0x15, 0xf7,
+ 0x3, 0x6, 0xc0, 0xd1, 0xc3, 0x45, 0x5, 0xf7,
+ 0x2, 0x6, 0x26, 0xf7, 0x21, 0x5, 0xfb, 0x12,
+ 0x6, 0xfb, 0xaf, 0x31, 0xa, 0x4f, 0xfb, 0xb,
+ 0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, 0xd8, 0x64,
+ 0xa, 0xd1, 0xf7, 0x28, 0xf7, 0xf1, 0xf7, 0x28,
+ 0x13, 0xd6, 0xf7, 0x71, 0xf9, 0xb2, 0x15, 0xc9,
+ 0x6a, 0xa, 0x9f, 0x1f, 0x13, 0xe6, 0x80, 0xa3,
+ 0xa1, 0x80, 0xad, 0x1b, 0xe1, 0x8b, 0xed, 0xa4,
+ 0x1f, 0x4c, 0x7a, 0xa, 0x6e, 0x69, 0x1b, 0x81,
+ 0x79, 0x93, 0x94, 0x75, 0x1f, 0x13, 0xce, 0x97,
+ 0x70, 0x67, 0x98, 0x6c, 0x1b, 0x4a, 0x70, 0x5b,
+ 0x3f, 0x8e, 0x1f, 0xfb, 0x45, 0xfc, 0x52, 0x29,
+ 0xa, 0xfb, 0x2c, 0x4f, 0x2c, 0xfb, 0x1d, 0x41,
+ 0xa, 0x59, 0xa, 0xd6, 0xf7, 0x9, 0x1, 0xc6,
+ 0xf7, 0x28, 0xf8, 0x1, 0x85, 0xa, 0xf7, 0x75,
+ 0xf9, 0xb2, 0x8d, 0xa, 0xf7, 0x66, 0xfb, 0x9,
+ 0x8d, 0xa, 0xfc, 0x1b, 0xfc, 0xc7, 0x29, 0xa,
+ 0xfb, 0x11, 0x54, 0xfb, 0xe, 0xfb, 0x22, 0x41,
+ 0xa, 0x3c, 0xa1, 0x76, 0xf8, 0x8c, 0x77, 0x1,
+ 0xb4, 0xec, 0x15, 0xe9, 0x2c, 0xf7, 0x30, 0xf7,
+ 0x31, 0xf7, 0x32, 0xfb, 0x32, 0xeb, 0xec, 0xfb,
+ 0x32, 0xf7, 0x31, 0xf7, 0x30, 0xf7, 0x2f, 0x2e,
+ 0xea, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x31, 0xf7,
+ 0x31, 0x2b, 0x2b, 0xf7, 0x32, 0xfb, 0x30, 0x5,
+ 0xe, 0xf7, 0x7, 0x85, 0x76, 0xa6, 0xf7, 0xe,
+ 0xf8, 0x74, 0xf7, 0xe, 0xa0, 0x77, 0x1, 0xbc,
+ 0xf7, 0x27, 0xf8, 0x7, 0xf7, 0x27, 0x3, 0xac,
+ 0xab, 0x15, 0xcf, 0x50, 0xd9, 0xe2, 0x5, 0x5a,
+ 0xce, 0xd5, 0x80, 0xcd, 0x1b, 0xf7, 0x8a, 0xed,
+ 0xf7, 0x56, 0xf7, 0x43, 0xab, 0x89, 0xf7, 0x2,
+ 0x4a, 0xe1, 0x1f, 0xdc, 0xe4, 0x48, 0xc6, 0x3f,
+ 0x36, 0x5, 0x9f, 0x71, 0x4c, 0xb7, 0xfb, 0x12,
+ 0x1b, 0xfb, 0x88, 0x2a, 0xfb, 0x40, 0xfb, 0x4b,
+ 0xfb, 0x18, 0xb1, 0x44, 0xab, 0x60, 0x1f, 0xee,
+ 0xf7, 0x2, 0x15, 0x7d, 0xad, 0x83, 0xbc, 0xc0,
+ 0x1a, 0xf7, 0x12, 0xc6, 0xf6, 0xf7, 0x1b, 0xb8,
+ 0xba, 0x80, 0x6e, 0xad, 0x1e, 0xfb, 0x87, 0xfc,
+ 0x25, 0x15, 0xf7, 0xbb, 0xf7, 0xda, 0x5, 0x95,
+ 0x72, 0x94, 0x64, 0x55, 0x1a, 0xfb, 0x47, 0x2a,
+ 0x47, 0x27, 0x6e, 0x63, 0x8e, 0xaf, 0x5b, 0x1e,
+ 0xe, 0x54, 0xa, 0xd3, 0xf9, 0x5e, 0x5e, 0xa,
+ 0xb5, 0xfb, 0x48, 0xf7, 0x8f, 0xf7, 0x7a, 0xc3,
+ 0x2b, 0xa, 0xf7, 0x18, 0xd9, 0x15, 0xe4, 0x6,
+ 0x45, 0xf7, 0x24, 0x97, 0xa, 0xe, 0x54, 0xa,
+ 0xf7, 0xb3, 0xf9, 0xac, 0x15, 0xe3, 0x6, 0xf7,
+ 0x1c, 0xf7, 0x24, 0x97, 0xa, 0xfb, 0xb0, 0xfb,
+ 0x72, 0x5e, 0xa, 0xa1, 0xfb, 0x48, 0xf7, 0xa3,
+ 0x2f, 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x44,
+ 0xf7, 0x22, 0x42, 0xa, 0xf7, 0x57, 0xf9, 0xae,
+ 0x15, 0xf7, 0x4, 0x6, 0xc1, 0xd1, 0xc5, 0x45,
+ 0x5, 0xf7, 0x3, 0x6, 0x25, 0xf7, 0x22, 0x5,
+ 0xfb, 0x15, 0x6, 0xfb, 0x77, 0xfb, 0x72, 0x34,
+ 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x48, 0xf7,
+ 0x9, 0x12, 0xd3, 0xf7, 0x26, 0x75, 0xf7, 0xb,
+ 0xea, 0xf7, 0xb, 0x73, 0xf7, 0x26, 0x13, 0xd8,
+ 0xf7, 0x58, 0xf9, 0xb2, 0x8f, 0xa, 0xf7, 0x6a,
+ 0xfb, 0x9, 0x8f, 0xa, 0x13, 0xe4, 0xfb, 0xe6,
+ 0xfb, 0x5d, 0x34, 0xa, 0x8f, 0xa0, 0x76, 0x1,
+ 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0x70, 0xa, 0xf8,
+ 0x34, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, 0xfb,
+ 0xaf, 0xfb, 0x34, 0xf7, 0xaf, 0x5, 0xfb, 0x35,
+ 0x6, 0xf7, 0x8e, 0xfc, 0x33, 0x5, 0x89, 0xf8,
+ 0x80, 0x15, 0xde, 0x6, 0xf7, 0x14, 0x67, 0xa,
+ 0xfb, 0x26, 0x6, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+ 0x1b, 0xf7, 0xe, 0xf7, 0x60, 0xf7, 0xe, 0xf7,
+ 0x1b, 0x77, 0x60, 0xa, 0xf7, 0x1b, 0xd1, 0x6,
+ 0xcc, 0xf1, 0x8c, 0xa3, 0xbe, 0x1f, 0xb9, 0xa1,
+ 0xd3, 0xbf, 0xf7, 0x12, 0x1a, 0xf7, 0x73, 0xfb,
+ 0x2f, 0x8b, 0xfb, 0x49, 0x1e, 0x45, 0xf7, 0x1b,
+ 0xfb, 0x25, 0x6, 0xf7, 0x25, 0xfc, 0x61, 0x15,
+ 0xf7, 0x60, 0xd1, 0x7, 0xf4, 0xdc, 0x88, 0x29,
+ 0x24, 0xfb, 0x3, 0x8b, 0x40, 0x1f, 0xe, 0x57,
+ 0x92, 0x76, 0xf9, 0x11, 0xf7, 0x0, 0x1, 0xd0,
+ 0xf7, 0x1e, 0xf7, 0x7e, 0xf7, 0x1e, 0x3, 0xd0,
+ 0x84, 0x15, 0xf7, 0x1e, 0xf8, 0x6b, 0x6, 0xe3,
+ 0x8b, 0xd2, 0xd6, 0xe6, 0x68, 0x36, 0x4c, 0x6d,
+ 0x1e, 0x75, 0x5e, 0x81, 0x6d, 0x72, 0x1a, 0x64,
+ 0xa6, 0x6e, 0xc3, 0x56, 0x1e, 0xcf, 0x49, 0x99,
+ 0x7d, 0x6d, 0x1a, 0x6a, 0x73, 0x79, 0x72, 0x76,
+ 0x76, 0x97, 0xa6, 0x83, 0x1e, 0x2b, 0x53, 0x5,
+ 0x4e, 0xa8, 0xcd, 0x6e, 0xcc, 0x1b, 0xe3, 0xe0,
+ 0xc3, 0xf7, 0x0, 0xc0, 0x76, 0xb5, 0x4a, 0xcd,
+ 0x1f, 0x57, 0xc0, 0x75, 0x9c, 0xa3, 0x1a, 0x9c,
+ 0x97, 0x9f, 0xa1, 0xb4, 0x1e, 0xf7, 0x2, 0xc6,
+ 0x7a, 0xf7, 0x1e, 0xfb, 0x67, 0x1b, 0xfb, 0x59,
+ 0x79, 0xfb, 0x3d, 0x29, 0x1f, 0xe, 0x39, 0xa,
+ 0xc4, 0xf7, 0x29, 0x51, 0xa, 0xf7, 0x9b, 0xf8,
+ 0xed, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x29, 0x96,
+ 0xa, 0xf7, 0x89, 0x22, 0xa, 0x39, 0xa, 0xc5,
+ 0xf7, 0x28, 0x51, 0xa, 0xf7, 0x5b, 0xf8, 0xee,
+ 0x15, 0xe4, 0x6, 0xf7, 0x1e, 0xf7, 0x28, 0x96,
+ 0xa, 0xf0, 0x22, 0xa, 0x39, 0xa, 0xc6, 0xf7,
+ 0x27, 0x51, 0xa, 0xf5, 0xf8, 0xef, 0x15, 0xf7,
+ 0x6, 0x6, 0xc1, 0xd4, 0xc5, 0x42, 0x5, 0xf7,
+ 0x5, 0x6, 0x24, 0xf7, 0x27, 0x5, 0xfb, 0x17,
+ 0x6, 0xf7, 0x33, 0x22, 0xa, 0x39, 0xa, 0xcd,
+ 0xf7, 0x13, 0x37, 0xdf, 0x8a, 0x77, 0x66, 0xa,
+ 0x49, 0xcd, 0xf7, 0x52, 0xf7, 0x1d, 0x13, 0xa9,
+ 0x80, 0xf2, 0xf8, 0xf4, 0x15, 0xca, 0x6, 0x98,
+ 0x8c, 0x8b, 0xab, 0xad, 0x1b, 0xb0, 0xa4, 0x7e,
+ 0x80, 0xa3, 0x1f, 0x13, 0xb2, 0x80, 0x82, 0xa1,
+ 0xa0, 0x81, 0xa9, 0x1b, 0xe3, 0x8b, 0xf0, 0xa5,
+ 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6d, 0x69,
+ 0x1b, 0x80, 0x78, 0x94, 0x95, 0x73, 0x1f, 0x13,
+ 0x65, 0x80, 0x97, 0x70, 0x68, 0x97, 0x6a, 0x1b,
+ 0x48, 0x70, 0x5a, 0x3c, 0x8e, 0x1f, 0xf7, 0x9f,
+ 0xfc, 0xbb, 0x21, 0xa, 0x13, 0xb2, 0x80, 0x32,
+ 0xa, 0x39, 0xa, 0xce, 0xf7, 0xa, 0x66, 0xa,
+ 0x4d, 0xf7, 0xd, 0xea, 0xf7, 0xd, 0x36, 0xf7,
+ 0x1d, 0x13, 0x76, 0xf6, 0xf8, 0xf7, 0x8a, 0xa,
+ 0xf7, 0x6c, 0xfb, 0xa, 0x8a, 0xa, 0xba, 0xfd,
+ 0x34, 0x30, 0xa, 0x13, 0xb9, 0x20, 0xa, 0x32,
+ 0xa, 0x39, 0xa, 0xb1, 0xf7, 0x56, 0x56, 0x77,
+ 0x66, 0xa, 0x9e, 0xf7, 0x58, 0x72, 0xf7, 0x1d,
+ 0x13, 0xb6, 0xf7, 0x50, 0xf9, 0x3b, 0x15, 0x56,
+ 0xb7, 0x5f, 0xc1, 0xbf, 0xb9, 0xb5, 0xc2, 0xc3,
+ 0x5e, 0xb4, 0x56, 0x54, 0x60, 0x61, 0x54, 0x1e,
+ 0xc0, 0x16, 0x13, 0x6d, 0xa4, 0x9f, 0x9e, 0xa4,
+ 0xa3, 0x9f, 0x79, 0x71, 0x73, 0x77, 0x77, 0x73,
+ 0x73, 0x76, 0x9f, 0xa3, 0x1e, 0xf7, 0x15, 0xfd,
+ 0x2, 0x24, 0xa, 0x13, 0xb5, 0x26, 0xa, 0xf7,
+ 0x76, 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe4, 0xf7,
+ 0x10, 0xf7, 0x0, 0x1, 0xa8, 0xf7, 0x22, 0xf7,
+ 0x50, 0xf7, 0x21, 0xf7, 0x6c, 0xf7, 0x22, 0x3,
+ 0xf8, 0x39, 0xc7, 0x15, 0x52, 0xc8, 0xca, 0x7a,
+ 0xc8, 0x1b, 0xf7, 0x47, 0xbf, 0xf7, 0xc, 0xb2,
+ 0x99, 0x1f, 0xfb, 0x1f, 0xa3, 0x5, 0x7a, 0x84,
+ 0x72, 0x51, 0x41, 0x1b, 0x2b, 0x84, 0xf2, 0xa7,
+ 0x88, 0x1f, 0xf7, 0xfa, 0x6, 0xf4, 0x77, 0xf7,
+ 0x6c, 0xfb, 0x7c, 0x4c, 0x5a, 0x78, 0x6c, 0x63,
+ 0x1e, 0x9a, 0x7b, 0x4f, 0xae, 0x21, 0x1b, 0xfb,
+ 0x2d, 0x61, 0x59, 0x26, 0x6a, 0x1f, 0xf7, 0x15,
+ 0x73, 0x5, 0x9d, 0x90, 0x9a, 0xbc, 0xda, 0x1b,
+ 0xe3, 0x8b, 0x53, 0x75, 0x1f, 0x7e, 0x7, 0x7a,
+ 0x85, 0x78, 0x89, 0x59, 0x7d, 0x8, 0x24, 0x6e,
+ 0xfb, 0x22, 0x88, 0xfb, 0x29, 0x1a, 0x43, 0xbb,
+ 0x35, 0xf7, 0x1a, 0xf0, 0xd9, 0xb9, 0xa7, 0xaa,
+ 0x1e, 0x4d, 0xf7, 0x57, 0x15, 0x42, 0x8b, 0x63,
+ 0x6c, 0x71, 0x1e, 0x56, 0x5f, 0x23, 0x93, 0xd7,
+ 0x1a, 0xb9, 0xb5, 0x99, 0xb8, 0x97, 0x1e, 0xf7,
+ 0x88, 0xe1, 0x15, 0x9b, 0x8a, 0x92, 0xf7, 0x0,
+ 0xed, 0x1b, 0xf0, 0x92, 0x2f, 0x6b, 0x8d, 0x1f,
+ 0xe, 0x20, 0xfb, 0x78, 0xc2, 0xe4, 0xf7, 0x40,
+ 0xfb, 0xa, 0xf7, 0xa, 0xf7, 0xec, 0xf7, 0x6,
+ 0x12, 0xad, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0x13,
+ 0xdc, 0xf7, 0x5a, 0x2f, 0x15, 0x92, 0xaa, 0x9c,
+ 0x8c, 0x92, 0x1b, 0xc4, 0x93, 0x6d, 0x7e, 0x5d,
+ 0x45, 0x8b, 0x6c, 0x6a, 0x79, 0x8e, 0x8c, 0x83,
+ 0x1f, 0x56, 0x7, 0x85, 0xb2, 0x9d, 0x8b, 0x8d,
+ 0x1b, 0xf7, 0x11, 0xc5, 0xc7, 0xb9, 0xc1, 0x5b,
+ 0xaa, 0x5f, 0x90, 0x1f, 0x13, 0xbc, 0x8d, 0x7,
+ 0xf7, 0x3f, 0x91, 0xaf, 0xf7, 0x2b, 0x94, 0xb5,
+ 0xfb, 0x1b, 0xa3, 0x18, 0x69, 0x85, 0x7e, 0x44,
+ 0x3a, 0x1b, 0x36, 0x6e, 0xcd, 0xf3, 0xad, 0x89,
+ 0xf7, 0x20, 0xf7, 0x5, 0xda, 0x99, 0x47, 0x78,
+ 0x8e, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd4, 0x77,
+ 0x5e, 0xf2, 0xfb, 0x3a, 0x1b, 0xfb, 0x5e, 0x59,
+ 0xfb, 0x3b, 0xfb, 0xd, 0x3a, 0xa5, 0xfb, 0x56,
+ 0xf7, 0x5f, 0x7e, 0x1f, 0x89, 0x7, 0x7c, 0x8a,
+ 0x7e, 0x8a, 0x75, 0x85, 0x8, 0xe, 0x3c, 0xa,
+ 0xc8, 0xf7, 0x28, 0x43, 0xa, 0xf7, 0x9d, 0xf8,
+ 0xee, 0x15, 0xe6, 0x6, 0x44, 0xf7, 0x28, 0x5,
+ 0xfb, 0x33, 0x6, 0xb6, 0xfc, 0xa2, 0x25, 0xa,
+ 0x3c, 0xa, 0xc7, 0xf7, 0x29, 0x43, 0xa, 0xf7,
+ 0x5c, 0xf8, 0xed, 0x15, 0xe6, 0x6, 0xf7, 0x20,
+ 0xf7, 0x29, 0x5, 0xfb, 0x34, 0x6, 0x25, 0xfc,
+ 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xc9, 0xf7, 0x27,
+ 0x43, 0xa, 0xf4, 0xf8, 0xef, 0x15, 0xf7, 0x8,
+ 0x6, 0xc3, 0xd4, 0xc6, 0x42, 0x5, 0xf7, 0x7,
+ 0x6, 0x21, 0xf7, 0x27, 0x5, 0xfb, 0x18, 0x6,
+ 0x5f, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xd1,
+ 0xf7, 0xa, 0x43, 0xa, 0xf5, 0xf8, 0xf7, 0x15,
+ 0xf7, 0x10, 0xf7, 0xa, 0xfb, 0x10, 0x6, 0xf7,
+ 0x71, 0xfb, 0xa, 0x15, 0xf7, 0xf, 0xf7, 0xa,
+ 0xfb, 0xf, 0x6, 0xfb, 0x32, 0xfc, 0x8d, 0x25,
+ 0xa, 0x62, 0xa, 0xf7, 0x23, 0xf8, 0xf2, 0x15,
+ 0xe1, 0x6, 0x20, 0xf7, 0x24, 0x5, 0xfb, 0x2c,
+ 0x6, 0xf5, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe,
+ 0x62, 0xa, 0xbc, 0xf8, 0xf1, 0x15, 0xe2, 0x6,
+ 0xf7, 0x41, 0xf7, 0x25, 0x5, 0xfb, 0x2c, 0x6,
+ 0x3a, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x4c,
+ 0xa, 0xf8, 0xf3, 0xf7, 0x23, 0x1, 0xd7, 0xf7,
+ 0x13, 0x3, 0xd7, 0x16, 0x55, 0xa, 0xfb, 0x5,
+ 0xe1, 0x95, 0xa, 0xd3, 0xc8, 0x43, 0x77, 0xa,
+ 0x67, 0xa, 0xfb, 0x1b, 0x6, 0xe, 0x4c, 0xa,
+ 0xf8, 0xfa, 0xf7, 0x7, 0x12, 0x76, 0xf7, 0x7,
+ 0x79, 0xf7, 0x13, 0x79, 0xf7, 0x7, 0x13, 0xe8,
+ 0x76, 0x44, 0xa, 0x13, 0xd0, 0xfb, 0x1, 0xfd,
+ 0x6d, 0x15, 0x55, 0xa, 0xe, 0x57, 0x7d, 0xf7,
+ 0x8, 0xf7, 0xd4, 0xf7, 0x3, 0xf7, 0x60, 0x77,
+ 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x90, 0xf7, 0x26,
+ 0x3, 0xf7, 0x65, 0xf8, 0xc7, 0x15, 0xeb, 0xb8,
+ 0xb0, 0x5b, 0x95, 0x7b, 0xa4, 0x60, 0x19, 0x89,
+ 0x89, 0x5, 0x9b, 0x70, 0x6b, 0x9d, 0x5a, 0x1b,
+ 0xfb, 0x1, 0xfb, 0x10, 0x22, 0xfb, 0x3b, 0xfb,
+ 0x26, 0xec, 0xfb, 0x15, 0xf7, 0x40, 0xf7, 0x31,
+ 0xf7, 0xa, 0xea, 0xf7, 0x48, 0xf7, 0x26, 0x3e,
+ 0xf7, 0x23, 0x26, 0xf2, 0x1f, 0xd2, 0xad, 0x75,
+ 0xbd, 0x30, 0x60, 0x75, 0x9d, 0x85, 0x8f, 0x72,
+ 0xa0, 0x19, 0xfb, 0x26, 0x6, 0xbe, 0x66, 0x9a,
+ 0x81, 0xb5, 0x63, 0x3a, 0x65, 0x18, 0x85, 0xfb,
+ 0xf3, 0x15, 0xf7, 0x4, 0xcc, 0xbc, 0xc5, 0xce,
+ 0xc9, 0x54, 0x21, 0x27, 0x52, 0x50, 0x44, 0x52,
+ 0x48, 0xb2, 0xf7, 0xc, 0x1e, 0xe, 0x57, 0xa0,
+ 0x76, 0xf8, 0xfa, 0x64, 0xa, 0xcc, 0xf7, 0x16,
+ 0x58, 0xc8, 0xf7, 0x5d, 0xf7, 0x20, 0x13, 0xca,
+ 0xcc, 0x16, 0x13, 0xc6, 0xf7, 0x20, 0xf7, 0x7f,
+ 0x6, 0xe2, 0x90, 0xf2, 0xf7, 0x3, 0xe0, 0x8b,
+ 0x22, 0x36, 0x1e, 0xfb, 0x7f, 0xf7, 0x20, 0xf7,
+ 0xd6, 0x7, 0xf7, 0x6, 0x3e, 0xe9, 0x28, 0x55,
+ 0x48, 0x79, 0x45, 0x57, 0x1e, 0x13, 0xca, 0x89,
+ 0xd7, 0xfb, 0x16, 0x6, 0x13, 0xa6, 0xda, 0xe9,
+ 0x15, 0xca, 0x65, 0xa, 0xaa, 0xad, 0x1b, 0xa9,
+ 0xa1, 0x82, 0x82, 0xa0, 0x1f, 0x13, 0xca, 0x80,
+ 0xa5, 0xa3, 0x7f, 0xae, 0x1b, 0xdf, 0x8f, 0xed,
+ 0xa4, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6e,
+ 0x69, 0x1b, 0x13, 0x96, 0x80, 0x73, 0x96, 0x96,
+ 0x70, 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x6c, 0x1b,
+ 0x49, 0x72, 0x6a, 0x30, 0x1f, 0xe, 0x3e, 0xa,
+ 0xd7, 0xf7, 0x25, 0x1, 0x56, 0xa, 0x3, 0xf7,
+ 0xb9, 0xf8, 0xf1, 0x15, 0xe4, 0x6, 0x46, 0xf7,
+ 0x25, 0x5, 0xfb, 0x30, 0x6, 0xfb, 0xf, 0xfc,
+ 0x7a, 0x23, 0xa, 0x47, 0xa, 0xf7, 0x77, 0xf8,
+ 0xf3, 0x15, 0xe2, 0x6, 0xf7, 0x1a, 0x75, 0xa,
+ 0xfb, 0x99, 0xfc, 0x7a, 0x23, 0xa, 0x47, 0xa,
+ 0xf7, 0x1e, 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6,
+ 0xc0, 0xd2, 0xc5, 0x44, 0x5, 0xf7, 0x4, 0x6,
+ 0x25, 0x67, 0xa, 0xfb, 0x16, 0x6, 0xfb, 0x64,
+ 0xfc, 0x7a, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0x64,
+ 0xa, 0x56, 0xa, 0x13, 0xd6, 0xf7, 0x1b, 0xf8,
+ 0xf8, 0x15, 0xca, 0x6a, 0xa, 0xa3, 0x1f, 0x13,
+ 0xe6, 0x80, 0xa4, 0xa3, 0x80, 0xaa, 0x1b, 0xe2,
+ 0x8b, 0xed, 0xa4, 0x1f, 0x4b, 0x7a, 0xa, 0x6e,
+ 0x69, 0x1b, 0x13, 0xce, 0x7f, 0x75, 0x96, 0x96,
+ 0x71, 0x1f, 0x95, 0x71, 0x6d, 0x95, 0x6b, 0x1b,
+ 0x49, 0x73, 0x5a, 0x40, 0x1f, 0x26, 0xfb, 0xf0,
+ 0x23, 0xa, 0x3e, 0xa, 0xe0, 0xf7, 0x7, 0x12,
+ 0xad, 0xf7, 0x23, 0x65, 0xf7, 0xc, 0xe9, 0xf7,
+ 0xc, 0x65, 0xf7, 0x23, 0x13, 0xec, 0xf7, 0x1f,
+ 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6a, 0xfb, 0x7,
+ 0x4a, 0xa, 0x13, 0xf2, 0xfb, 0xd3, 0xfc, 0x65,
+ 0x23, 0xa, 0x3c, 0x61, 0xf7, 0x1f, 0xe9, 0xf7,
+ 0x13, 0xe9, 0xf7, 0x1c, 0x1, 0xf7, 0x73, 0xf7,
+ 0x1e, 0x3, 0xb3, 0xf7, 0x53, 0x15, 0xf8, 0x8c,
+ 0xf7, 0x13, 0xfc, 0x8c, 0x6, 0xf7, 0x4b, 0xe9,
+ 0x15, 0xf7, 0x1e, 0xf7, 0x1c, 0xfb, 0x1e, 0x6,
+ 0xfc, 0xe2, 0x4, 0xf7, 0x1e, 0xf7, 0x1f, 0x81,
+ 0xa, 0x57, 0x83, 0x76, 0xa3, 0xf7, 0x6, 0xf7,
+ 0xd5, 0xf7, 0x6, 0x9b, 0x77, 0x12, 0xb2, 0xf7,
+ 0x26, 0xf7, 0x89, 0xf7, 0x24, 0x13, 0xdc, 0xab,
+ 0x9e, 0x15, 0xc4, 0x5b, 0xc4, 0xcb, 0x5, 0x71,
+ 0xbb, 0xc8, 0x7d, 0xbd, 0x1b, 0xf7, 0x41, 0xf7,
+ 0x3, 0xf7, 0x13, 0xf7, 0x28, 0xd4, 0x6d, 0xd0,
+ 0x68, 0xb4, 0x1f, 0xc5, 0xc9, 0x50, 0xb8, 0x54,
+ 0x4f, 0x5, 0x13, 0xec, 0x95, 0x7a, 0x55, 0xad,
+ 0x2f, 0x1b, 0xfb, 0x47, 0x23, 0xfb, 0x15, 0xfb,
+ 0x25, 0x41, 0x9e, 0x4e, 0xbc, 0x56, 0x1f, 0xeb,
+ 0xf7, 0x0, 0x15, 0x7b, 0xb1, 0x89, 0xac, 0x94,
+ 0x1a, 0xf7, 0x7, 0xd2, 0xb8, 0xcd, 0xb6, 0xa2,
+ 0x7c, 0x82, 0x96, 0x1e, 0xfb, 0x29, 0xfb, 0xa7,
+ 0x15, 0xf7, 0x56, 0xf7, 0x69, 0x5, 0x91, 0x7b,
+ 0x97, 0x6c, 0x70, 0x1a, 0x37, 0x5d, 0x3e, 0x2d,
+ 0x60, 0x7b, 0x99, 0x93, 0x7e, 0x1e, 0xe, 0x4e,
+ 0xa, 0xf8, 0x34, 0x89, 0x2a, 0xa, 0x13, 0x78,
+ 0xfb, 0xf, 0xf8, 0xa4, 0x15, 0xe3, 0x6, 0x46,
+ 0xf7, 0x25, 0x97, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+ 0x7a, 0xf8, 0xf1, 0x15, 0xe3, 0x6, 0xf7, 0x1c,
+ 0xf7, 0x25, 0x97, 0xa, 0xf7, 0x9, 0xfd, 0x84,
+ 0x2a, 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x97, 0xf7,
+ 0x23, 0x49, 0xa, 0x13, 0x78, 0xf7, 0x1d, 0xf8,
+ 0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc1, 0xd2, 0xc5,
+ 0x44, 0x5, 0xf7, 0x4, 0x6, 0x24, 0x67, 0xa,
+ 0xfb, 0x15, 0x6, 0xf7, 0x42, 0xfd, 0x84, 0x2a,
+ 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x9e, 0xf7, 0x7,
+ 0x12, 0xcd, 0xf7, 0x1f, 0x48, 0xf7, 0xc, 0xea,
+ 0xf7, 0xc, 0x48, 0xf7, 0x1f, 0x13, 0x6c, 0xf7,
+ 0x1e, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6b, 0xfb,
+ 0x7, 0x4a, 0xa, 0xca, 0xfd, 0x6f, 0x15, 0x13,
+ 0x72, 0x2c, 0xa, 0x13, 0xac, 0x36, 0xa, 0xe,
+ 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xc8, 0xf7, 0x24,
+ 0x1, 0xb6, 0x28, 0x15, 0x97, 0x20, 0x52, 0xa,
+ 0xf5, 0xf7, 0xf, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+ 0x89, 0x78, 0xa, 0xfc, 0x5, 0x6e, 0xa, 0xfb,
+ 0xe, 0xf8, 0x5, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+ 0x9d, 0x5, 0x2b, 0x48, 0xa, 0xf7, 0x35, 0xf9,
+ 0x55, 0x15, 0xe1, 0x6, 0xf7, 0x19, 0xf7, 0x24,
+ 0x5, 0xfb, 0x2c, 0x6, 0xe, 0x57, 0xfb, 0x4f,
+ 0x76, 0xf7, 0x50, 0xf7, 0x3, 0xf7, 0xe2, 0xf6,
+ 0xf7, 0x4e, 0x77, 0x1, 0xc9, 0xf7, 0x20, 0xf7,
+ 0x7c, 0xf7, 0x24, 0x3, 0xf7, 0x5e, 0xc5, 0x15,
+ 0x6c, 0xa7, 0xb8, 0x5c, 0xdd, 0x1b, 0xf7, 0x10,
+ 0xec, 0xef, 0xf7, 0x43, 0xf7, 0x49, 0x21, 0xeb,
+ 0xfb, 0x7, 0x39, 0x64, 0x64, 0x69, 0x69, 0x1f,
+ 0xf7, 0x97, 0xfb, 0x20, 0xfe, 0x32, 0xf7, 0x20,
+ 0x7, 0x8a, 0xf8, 0x63, 0x15, 0xf6, 0xbf, 0xca,
+ 0xcc, 0xf2, 0x98, 0xfb, 0x3, 0x50, 0xfb, 0x16,
+ 0x4c, 0x69, 0x5b, 0x36, 0x66, 0xd1, 0xe9, 0x1e,
+ 0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xcf, 0xf7,
+ 0x8, 0x1, 0xf7, 0x6, 0xf7, 0x9, 0xe8, 0xf7,
+ 0x9, 0x3, 0xf7, 0x6, 0xf8, 0xf9, 0x88, 0xa,
+ 0xf7, 0x66, 0xfb, 0x8, 0x88, 0xa, 0xfb, 0xad,
+ 0xfd, 0xcf, 0x15, 0x97, 0xfb, 0x0, 0x52, 0xa,
+ 0xf6, 0xf7, 0x10, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+ 0x8d, 0x78, 0xa, 0xfc, 0x8, 0x6e, 0xa, 0xfb,
+ 0xe, 0xf8, 0x8, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+ 0xa1, 0x5, 0x2a, 0x48, 0xa, 0xe, 0x76, 0xa0,
+ 0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb,
+ 0x70, 0x98, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+ 0xc, 0x9, 0xf7, 0x11, 0xa, 0xf7, 0x20, 0xb,
+ 0xf7, 0x0, 0x9c, 0xc, 0xc, 0x8c, 0xc, 0xe,
+ 0xf7, 0xe1, 0x14, 0xf9, 0x2b, 0x15, 0xb5, 0x13,
+ 0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x23, 0x0,
+ 0x28, 0x0, 0x30, 0x0, 0x65, 0x0, 0x6a, 0x0,
+ 0xaa, 0x0, 0xca, 0x0, 0xed, 0x0, 0xf1, 0x1,
+ 0x19, 0x1, 0x21, 0x1, 0x3e, 0x1, 0x5b, 0x1,
+ 0x69, 0x1, 0x81, 0x1, 0x87, 0x1, 0x93, 0x1,
+ 0xc7, 0x1, 0xcb, 0x1, 0xda, 0x1, 0xe3, 0x1,
+ 0xed, 0x1, 0xfc, 0x2, 0x5, 0x2, 0xe, 0x2,
+ 0x18, 0x2, 0x25, 0x2, 0x2e, 0x2, 0x39, 0x2,
+ 0x44, 0x2, 0x4d, 0x2, 0x52, 0x2, 0x57, 0x2,
+ 0x60, 0x2, 0x6a, 0x2, 0x74, 0x2, 0x7f, 0x2,
+ 0x86, 0x2, 0x8f, 0x2, 0x99, 0x2, 0xa5, 0x2,
+ 0xae, 0x2, 0xb7, 0x2, 0xc0, 0x2, 0xc5, 0x2,
+ 0xca, 0x2, 0xd5, 0x2, 0xe8, 0x2, 0xfb, 0x3,
+ 0x4, 0x3, 0xf, 0x3, 0x21, 0x3, 0x2c, 0x3,
+ 0x34, 0x3, 0x3c, 0x3, 0x4d, 0x3, 0x5e, 0x3,
+ 0x65, 0x3, 0x75, 0x3, 0x85, 0x3, 0x94, 0x3,
+ 0x9b, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xb6, 0x3,
+ 0xbf, 0x3, 0xca, 0x3, 0xd1, 0x3, 0xd9, 0x3,
+ 0xde, 0x3, 0xe3, 0x3, 0xe7, 0x3, 0xeb, 0x3,
+ 0xef, 0x3, 0xf9, 0x4, 0x4, 0x4, 0xa, 0x4,
+ 0xd, 0x4, 0x11, 0x4, 0x1c, 0x4, 0x27, 0x4,
+ 0x32, 0x4, 0x3d, 0x4, 0x44, 0x4, 0x4b, 0x4,
+ 0x51, 0x4, 0x58, 0x4, 0x5f, 0x4, 0x66, 0x4,
+ 0x6b, 0x4, 0x70, 0x4, 0x74, 0x4, 0x78, 0x4,
+ 0x7c, 0x4, 0x85, 0x4, 0x8f, 0x4, 0x97, 0x4,
+ 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xa7, 0x4,
+ 0xab, 0x4, 0xb4, 0x4, 0xbd, 0x4, 0xc6, 0x4,
+ 0xcf, 0x4, 0xd8, 0x4, 0xe1, 0x4, 0xea, 0x4,
+ 0xf3, 0x4, 0xfc, 0x5, 0x5, 0x5, 0xe, 0x5,
+ 0x17, 0x5, 0x20, 0x5, 0x27, 0x5, 0x2c, 0x5,
+ 0x32, 0x5, 0x37, 0x5, 0x3c, 0x5, 0x41, 0x77,
+ 0xb8, 0x83, 0xa2, 0x38, 0xa, 0xac, 0x1a, 0xeb,
+ 0x80, 0xf4, 0xfb, 0x73, 0xfb, 0x32, 0x65, 0x49,
+ 0x35, 0x73, 0x1e, 0xf7, 0x13, 0x74, 0x5, 0xa5,
+ 0x2d, 0xa, 0x80, 0x6e, 0x82, 0x3c, 0x7d, 0x8,
+ 0xb, 0x30, 0xa, 0x20, 0xa, 0xb, 0xfd, 0x49,
+ 0x24, 0xa, 0x13, 0xbc, 0x26, 0xa, 0x15, 0xfb,
+ 0x84, 0xf7, 0x50, 0x65, 0xde, 0xf7, 0x3e, 0xf2,
+ 0xf7, 0x1b, 0xf7, 0x23, 0xf7, 0x18, 0x32, 0xf7,
+ 0x19, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x21,
+ 0xfb, 0x10, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x2,
+ 0xc8, 0xb6, 0xce, 0xd3, 0xc5, 0x5b, 0x22, 0xfb,
+ 0x7, 0x49, 0x58, 0x4b, 0x49, 0x4d, 0xc3, 0xf7,
+ 0x2, 0x1e, 0xe, 0x21, 0xa, 0x3b, 0xa, 0xb,
+ 0x15, 0xf7, 0xfb, 0x6, 0xf7, 0x34, 0x5a, 0xf7,
+ 0x31, 0xfb, 0x60, 0xfb, 0x3f, 0x3a, 0xfb, 0x1d,
+ 0xfb, 0x23, 0xfb, 0x42, 0xf7, 0x20, 0x26, 0xf7,
+ 0xe, 0xf7, 0x47, 0xb8, 0xf7, 0x11, 0xac, 0x97,
+ 0x1e, 0xfb, 0x23, 0xa2, 0x5, 0x73, 0x83, 0x79,
+ 0x5a, 0x48, 0x1b, 0x3a, 0x6a, 0xcd, 0xcb, 0x89,
+ 0x1f, 0x8e, 0xe1, 0x15, 0xd1, 0x8a, 0xb0, 0xc1,
+ 0xce, 0x1b, 0xda, 0xab, 0x55, 0x45, 0x1f, 0xe,
+ 0x2e, 0xd1, 0x45, 0x37, 0xa, 0xf7, 0x59, 0x15,
+ 0x70, 0x7, 0x3d, 0x72, 0x4c, 0x34, 0x55, 0x73,
+ 0xac, 0xa9, 0xbc, 0xc4, 0xa4, 0xa4, 0x90, 0x1e,
+ 0xa9, 0x92, 0xc8, 0x95, 0x9c, 0x94, 0x8, 0xe,
+ 0xf7, 0x26, 0x6, 0xc3, 0xf7, 0x3b, 0x5, 0xf7,
+ 0xa3, 0x6, 0xc6, 0xfb, 0x3b, 0x5, 0xf7, 0x2a,
+ 0x6, 0xfb, 0xa4, 0xf9, 0x74, 0x40, 0xa, 0x76,
+ 0xfc, 0x51, 0x15, 0xe7, 0xf7, 0xa5, 0xe9, 0xfb,
+ 0xa5, 0x5, 0xb, 0x15, 0x27, 0xa, 0xe, 0x15,
+ 0xfb, 0x3a, 0xd8, 0xfb, 0x61, 0xf7, 0xa0, 0xf7,
+ 0x8d, 0xeb, 0xf7, 0x4b, 0xf7, 0x50, 0xf7, 0x65,
+ 0x3d, 0xa, 0xfb, 0x22, 0xfb, 0x79, 0x1e, 0xf7,
+ 0x28, 0x16, 0xf4, 0xac, 0xf7, 0x21, 0xf7, 0x38,
+ 0xf7, 0x43, 0xa1, 0xfb, 0x39, 0x3a, 0xb, 0x15,
+ 0x2c, 0xa, 0x13, 0xb8, 0x36, 0xa, 0xb, 0xf7,
+ 0x3, 0xf7, 0x80, 0x1e, 0xf8, 0x16, 0xfb, 0x26,
+ 0xfc, 0x16, 0x7, 0xfb, 0xf, 0x8b, 0x28, 0xfb,
+ 0x20, 0xfb, 0x1a, 0x7e, 0xe4, 0xf7, 0x19, 0x1e,
+ 0xf8, 0x16, 0x7, 0xb, 0xf7, 0x15, 0xf8, 0x9e,
+ 0xfb, 0x1f, 0xfb, 0x67, 0x6, 0xfb, 0x15, 0x8d,
+ 0x33, 0xfb, 0x7, 0x2a, 0x94, 0xe1, 0xf7, 0x17,
+ 0x1e, 0xf7, 0x67, 0xfb, 0x1f, 0xfb, 0xdd, 0x7,
+ 0xb, 0x95, 0x99, 0xb4, 0xd0, 0x1b, 0xeb, 0x8b,
+ 0x5d, 0x68, 0x1f, 0x82, 0x7, 0x6f, 0xb, 0xf8,
+ 0xb5, 0xf7, 0x11, 0xfc, 0x25, 0xf7, 0x5c, 0xf7,
+ 0xfd, 0xf7, 0x11, 0xfb, 0xfd, 0xf7, 0x39, 0xf8,
+ 0x18, 0xf7, 0x11, 0xfc, 0xa8, 0x6, 0xb, 0xf7,
+ 0x79, 0xc4, 0x2b, 0xa, 0xe, 0x15, 0x98, 0x5f,
+ 0x8e, 0x84, 0x8e, 0x83, 0x8, 0xf7, 0x1e, 0x6,
+ 0xb, 0xfc, 0xdc, 0x15, 0xfb, 0x39, 0xd8, 0xfb,
+ 0x62, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, 0x4c,
+ 0xf7, 0x4f, 0xf7, 0x66, 0xfb, 0x5, 0xf7, 0x35,
+ 0xfb, 0x7c, 0xfb, 0x72, 0xfb, 0xf, 0xfb, 0x21,
+ 0xfb, 0x7a, 0x1e, 0xf7, 0x28, 0x16, 0xf4, 0xac,
+ 0xf7, 0x22, 0xf7, 0x38, 0xf7, 0x43, 0xa1, 0xfb,
+ 0x3a, 0x3a, 0xfb, 0x14, 0xb, 0x3b, 0xa, 0x26,
+ 0xa, 0x3a, 0xa, 0xbb, 0xf7, 0x28, 0x1, 0xd7,
+ 0xf7, 0x24, 0x3, 0xd7, 0x16, 0x2e, 0xa, 0xb,
+ 0x5e, 0xa, 0xa4, 0xfb, 0x48, 0xf7, 0xa0, 0x2f,
+ 0xa, 0x69, 0xa, 0xf7, 0x3b, 0xf7, 0x10, 0xf8,
+ 0x51, 0x77, 0xb, 0xfb, 0x8, 0xba, 0x32, 0xf7,
+ 0x14, 0xcf, 0xce, 0xac, 0xc5, 0xb1, 0x1e, 0x8d,
+ 0x6, 0xb, 0xf5, 0xe1, 0xbf, 0xb6, 0xa7, 0xa6,
+ 0x1e, 0x80, 0xb, 0x88, 0xd1, 0x8, 0x8a, 0xa9,
+ 0x8d, 0xf7, 0x24, 0xb, 0x20, 0x7d, 0xef, 0x48,
+ 0x76, 0xf8, 0x4a, 0xf7, 0x0, 0xb, 0x8f, 0x8b,
+ 0xf7, 0x11, 0xf7, 0x5c, 0xf7, 0x11, 0xf7, 0x39,
+ 0xf7, 0x11, 0xb, 0x41, 0x7d, 0xfb, 0xc, 0x78,
+ 0xfb, 0x16, 0x1a, 0xb, 0x20, 0x7d, 0xf7, 0x0,
+ 0xf7, 0x16, 0xe1, 0xf7, 0x10, 0xf6, 0xb, 0xfb,
+ 0x5, 0xf7, 0x36, 0xfb, 0x7c, 0xfb, 0x72, 0xfb,
+ 0xf, 0xb, 0x57, 0x7d, 0xf7, 0x4, 0xf7, 0xd3,
+ 0xf7, 0x4, 0xb, 0xa0, 0x76, 0x4d, 0xa, 0xb,
+ 0x5, 0xfb, 0x25, 0x6, 0xb, 0xfb, 0x2c, 0x5e,
+ 0xf7, 0x5, 0xf7, 0x1a, 0x1e, 0xe, 0x1, 0xd3,
+ 0xf7, 0x26, 0xf7, 0xb3, 0xf7, 0x26, 0x3, 0xb,
+ 0x1, 0xa2, 0xf7, 0x29, 0xf7, 0x6a, 0xf7, 0x22,
+ 0x3, 0xb, 0xf8, 0xfa, 0x4b, 0xa, 0xf7, 0x62,
+ 0xfb, 0x7, 0x4b, 0xa, 0xb, 0xb4, 0x8b, 0xde,
+ 0xc5, 0x1a, 0xe6, 0xb, 0xfe, 0x3c, 0x15, 0xf7,
+ 0x20, 0xf9, 0x60, 0x6d, 0xa, 0x3e, 0xa, 0xd9,
+ 0xf7, 0x23, 0x1, 0x56, 0xa, 0x3, 0xb, 0x70,
+ 0x5b, 0x87, 0x6c, 0x1b, 0x76, 0x7f, 0x8c, 0x90,
+ 0x73, 0x1f, 0xb, 0x12, 0xcd, 0xf7, 0x1f, 0xf7,
+ 0x5d, 0xf7, 0x1f, 0xb, 0x15, 0xf7, 0xc, 0xf7,
+ 0x7, 0xfb, 0xc, 0x6, 0xb, 0x15, 0xf7, 0x7,
+ 0xf7, 0x7, 0xfb, 0x7, 0x6, 0xb, 0xfc, 0x15,
+ 0xa0, 0x76, 0xb, 0xf9, 0x62, 0x77, 0x1, 0xb,
+ 0x6c, 0xa, 0xf8, 0x95, 0xf7, 0x25, 0x49, 0xa,
+ 0x13, 0x78, 0xb, 0x5, 0xfb, 0x32, 0x6, 0xfb,
+ 0x33, 0xfb, 0xae, 0xfb, 0x34, 0xf7, 0xae, 0x5,
+ 0xfb, 0x35, 0x6, 0xf7, 0x8e, 0xb, 0x15, 0xe3,
+ 0x6, 0xf7, 0x11, 0xf7, 0x5f, 0xfb, 0x11, 0xf7,
+ 0x61, 0x5, 0x33, 0x6, 0xf2, 0xfb, 0x61, 0x5,
+ 0xb, 0x66, 0xa, 0xf7, 0x52, 0xf7, 0x1d, 0x13,
+ 0x7c, 0xb, 0x5, 0x87, 0x9e, 0x82, 0x87, 0xae,
+ 0x1b, 0xf7, 0x41, 0xa2, 0xb, 0x15, 0xe3, 0x6,
+ 0x24, 0xf7, 0x64, 0xf2, 0xf7, 0x5c, 0x5, 0x33,
+ 0x6, 0xfb, 0x11, 0xfb, 0x5c, 0x5, 0xb, 0xc6,
+ 0x78, 0xf7, 0x11, 0xf9, 0x42, 0xf7, 0x24, 0x42,
+ 0xa, 0xb, 0xf7, 0x13, 0xf8, 0x9d, 0xfb, 0x13,
+ 0x6, 0xb, 0xad, 0xf7, 0x23, 0xf7, 0x96, 0xf7,
+ 0x23, 0xb, 0xf7, 0x66, 0xf7, 0x3d, 0xf7, 0x3d,
+ 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3d, 0xf7, 0x3d,
+ 0xfb, 0x66, 0xb, 0xf7, 0x3c, 0xf7, 0x1c, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1c, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xb, 0x5f, 0xa, 0xf8, 0x81,
+ 0xf7, 0x11, 0xb, 0x57, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x54, 0xf7, 0x0, 0xf7, 0xe8, 0xf7, 0x5, 0x7f,
+ 0x77, 0x12, 0xb, 0xfb, 0xa6, 0xfb, 0x58, 0xf7,
+ 0x7, 0xf7, 0xb2, 0xf7, 0x8, 0xf7, 0xb2, 0xf7,
+ 0x7, 0x1, 0xb, 0x77, 0x1, 0xd0, 0xf7, 0x1e,
+ 0xf7, 0xc9, 0xf7, 0x1e, 0x3, 0xd0, 0x16, 0xf7,
+ 0x1e, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+ 0xb, 0x15, 0xfc, 0x16, 0x7, 0xfb, 0x3b, 0xb,
+ 0xf7, 0x7, 0x78, 0xf7, 0x10, 0xb, 0x1, 0xd7,
+ 0xf7, 0x25, 0xf7, 0x94, 0xf7, 0x2a, 0x3, 0xd7,
+ 0x16, 0xf7, 0x25, 0xb, 0x45, 0xa, 0x7, 0x13,
+ 0xe8, 0xfb, 0x1a, 0x6, 0xb, 0x4c, 0xa, 0xf9,
+ 0x82, 0x77, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xb,
+ 0x7d, 0xa, 0xd0, 0x16, 0xf7, 0x20, 0xb, 0xf7,
+ 0xf, 0x39, 0xdd, 0x8a, 0x77, 0x12, 0xb, 0x6,
+ 0x97, 0x8c, 0x8b, 0xb, 0x12, 0xa8, 0xf7, 0x20,
+ 0xb, 0xf7, 0x23, 0x5, 0xb, 0xfb, 0x20, 0x6,
+ 0xb, 0xc6, 0xa0, 0x76, 0xb, 0x65, 0xa, 0xaa,
+ 0xac, 0x1b, 0xaa, 0xa2, 0x82, 0x81, 0xb, 0x15,
+ 0xe9, 0x6, 0xf7, 0x45, 0x83, 0xa, 0xfb, 0x39,
+ 0x6, 0xb, 0x57, 0x7d, 0xf5, 0x2d, 0xe9, 0xb,
+ 0x68, 0xa, 0xe, 0x5, 0x89, 0x6, 0xb, 0x75,
+ 0xfb, 0x1, 0x26, 0x1f, 0x3e, 0xfb, 0x1, 0xd8,
+ 0x6, 0xb, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, 0xf7,
+ 0xc0, 0x6, 0xf7, 0x8f, 0xb, 0xfb, 0x10, 0x7a,
+ 0xfb, 0x3, 0x52, 0x1e, 0xeb, 0x16, 0xcc, 0xb,
+ 0xa7, 0xf7, 0x55, 0x84, 0xda, 0x1b, 0xf7, 0xd,
+ 0xf7, 0x3d, 0xb, 0xa0, 0x76, 0xf8, 0xa8, 0x77,
+ 0x1, 0xb, 0xf7, 0x44, 0xf7, 0x7, 0xfb, 0x44,
+ 0xb, 0x67, 0xa, 0xfb, 0x2d, 0x6, 0xb, 0xa0,
+ 0x76, 0xf8, 0x2c, 0xf7, 0x1, 0xb, 0x5, 0xf7,
+ 0x9, 0x6, 0xfb, 0x0, 0xb, 0x5, 0xfb, 0x21,
+ 0x6, 0xfb, 0xb, 0xb, 0x20, 0x78, 0xf7, 0x6,
+ 0xb, 0x6, 0x7d, 0x89, 0x87, 0xb, 0x82, 0xa,
+ 0xd7, 0xb, 0xfb, 0x4, 0x6, 0xb, 0xf7, 0x20,
+ 0x3, 0xb, 0x1, 0xcb, 0xf7, 0x28, 0xf7, 0xfc,
+ 0x85, 0xa, 0xb, 0xfb, 0x58, 0xf7, 0x0, 0xf9,
+ 0x52, 0xf7, 0x0, 0x1, 0xb, 0xfb, 0x3e, 0xfb,
+ 0x3d, 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x1e, 0x6,
+ 0xe, 0xf7, 0xd, 0x1, 0xb, 0xf7, 0x26, 0x5,
+ 0xb, 0xf7, 0x26, 0x1, 0xb, 0xf7, 0x28, 0x3,
+ 0xb, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0xe8, 0x77,
+ 0x1, 0xb, 0xfc, 0x1d, 0x6, 0xf8, 0xf, 0xf8,
+ 0x76, 0x5, 0xb, 0x15, 0xf7, 0x9, 0xf7, 0x8,
+ 0xfb, 0x9, 0x6, 0xb, 0xb8, 0x6c, 0x1f, 0x7c,
+ 0xa2, 0x81, 0xa6, 0x84, 0xb, 0x15, 0xf7, 0xd,
+ 0xf7, 0xa, 0xfb, 0xd, 0x6, 0xb, 0x15, 0xf7,
+ 0x5, 0xf7, 0x9, 0xfb, 0x5, 0x6, 0xb, 0xf7,
+ 0xd6, 0x7, 0xfb, 0xff, 0xfc, 0x65, 0x5, 0xb,
+ 0x15, 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0x6,
+ 0xb, 0x15, 0xf7, 0xa, 0xf7, 0xb, 0xfb, 0xa,
+ 0x6, 0xb, 0x15, 0xf7, 0xb, 0xf7, 0x9, 0xfb,
+ 0xb, 0x6, 0xb, 0x77, 0x1, 0xf7, 0x78, 0xf7,
+ 0x13, 0x3, 0xb3, 0xb, 0x3c, 0x98, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xb1, 0xb, 0x15, 0xf7, 0x7,
+ 0xf7, 0x8, 0xfb, 0x7, 0x6, 0xb, 0xf9, 0x88,
+ 0x5, 0xfb, 0x13, 0x6, 0xe, 0x1, 0xd0, 0x7d,
+ 0xa, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xc4, 0xb,
+ 0x5, 0xfb, 0x31, 0x6, 0xb, 0x5, 0xfb, 0x2f,
+ 0x6, 0xb, 0x89, 0x42, 0x5a, 0x7f, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
new file mode 100644
index 0000000000..0555165be3
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
@@ -0,0 +1,2061 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldItalicFontData [16418] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x17,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x50, 0x53, 0x2d, 0x42, 0x6f, 0x6c, 0x64,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1,
+ 0x1, 0x1, 0x27, 0xf8, 0x10, 0x0, 0xf8, 0x1c,
+ 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8,
+ 0x14, 0x4, 0x7f, 0xc, 0x2, 0xfb, 0x42, 0xfb,
+ 0x78, 0xfa, 0xee, 0xfa, 0x56, 0x5, 0xf7, 0x3c,
+ 0xf, 0xf8, 0x9c, 0x11, 0xb1, 0x1c, 0x39, 0xfc,
+ 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x48,
+ 0x55, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+ 0x73, 0x20, 0x50, 0x53, 0x20, 0x42, 0x6f, 0x6c,
+ 0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x61,
+ 0x6e, 0x73, 0x20, 0x50, 0x53, 0x0, 0x0, 0x1,
+ 0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x86, 0x2, 0x0, 0x91, 0x0, 0x0,
+ 0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, 0x0,
+ 0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4,
+ 0x0, 0x0, 0x2, 0x5, 0x0, 0x68, 0x0, 0x0,
+ 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x1d,
+ 0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65,
+ 0x0, 0x0, 0x76, 0x0, 0x0, 0x79, 0x0, 0x0,
+ 0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, 0x0,
+ 0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, 0x0,
+ 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f,
+ 0x0, 0x0, 0x99, 0x0, 0x0, 0xdd, 0x0, 0x0,
+ 0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x0,
+ 0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64,
+ 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+ 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+ 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7,
+ 0x0, 0x37, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x89,
+ 0x0, 0xb9, 0x0, 0xcf, 0x0, 0xde, 0x0, 0xf6,
+ 0x1, 0x48, 0x1, 0x94, 0x1, 0xbc, 0x1, 0xe0,
+ 0x2, 0x2b, 0x2, 0x70, 0x2, 0x99, 0x2, 0xd3,
+ 0x3, 0x39, 0x3, 0xc9, 0x4, 0x5a, 0x5, 0x4,
+ 0x5, 0x21, 0x5, 0x5f, 0x5, 0x97, 0x5, 0xcc,
+ 0x5, 0xf3, 0x6, 0x1a, 0x6, 0x2e, 0x6, 0x40,
+ 0x6, 0x55, 0x6, 0x9e, 0x6, 0xca, 0x7, 0x1f,
+ 0x7, 0x83, 0x7, 0xc5, 0x8, 0x25, 0x8, 0x90,
+ 0x8, 0xc1, 0x9, 0x35, 0x9, 0x9f, 0x9, 0xc2,
+ 0x9, 0xfa, 0xa, 0x1f, 0xa, 0x3f, 0xa, 0x62,
+ 0xa, 0xb7, 0xb, 0x65, 0xb, 0x96, 0xb, 0xef,
+ 0xc, 0x39, 0xc, 0x6b, 0xc, 0x97, 0xc, 0xba,
+ 0xd, 0x1a, 0xd, 0x48, 0xd, 0x58, 0xd, 0x89,
+ 0xd, 0xb7, 0xd, 0xc9, 0xe, 0x7, 0xe, 0x2d,
+ 0xe, 0x7c, 0xe, 0xb8, 0xf, 0x2d, 0xf, 0x8a,
+ 0xf, 0xe6, 0x10, 0xa, 0x10, 0x59, 0x10, 0x74,
+ 0x10, 0xb2, 0x10, 0xe1, 0x11, 0x3, 0x11, 0x31,
+ 0x11, 0x53, 0x11, 0x6c, 0x11, 0x8d, 0x11, 0xae,
+ 0x11, 0xbc, 0x11, 0xcb, 0x12, 0x1d, 0x12, 0x7d,
+ 0x12, 0xc7, 0x13, 0x21, 0x13, 0x73, 0x13, 0xb1,
+ 0x14, 0x1c, 0x14, 0x64, 0x14, 0x82, 0x14, 0xc6,
+ 0x14, 0xf2, 0x14, 0xfe, 0x15, 0x65, 0x15, 0xaf,
+ 0x15, 0xc9, 0x16, 0x24, 0x16, 0x80, 0x16, 0xbf,
+ 0x17, 0x16, 0x17, 0x5a, 0x17, 0xa8, 0x17, 0xc5,
+ 0x18, 0x1, 0x18, 0x2f, 0x18, 0x6b, 0x18, 0x98,
+ 0x18, 0xeb, 0x19, 0x4, 0x19, 0x5b, 0x19, 0xa1,
+ 0x1a, 0x1c, 0x1a, 0x3e, 0x1a, 0x9e, 0x1a, 0xbd,
+ 0x1a, 0xd7, 0x1b, 0xe, 0x1b, 0x58, 0x1b, 0x6c,
+ 0x1c, 0xa, 0x1c, 0x8f, 0x1c, 0xa7, 0x1d, 0x32,
+ 0x1d, 0x5a, 0x1d, 0x7d, 0x1d, 0xc5, 0x1d, 0xe8,
+ 0x1e, 0x7, 0x1e, 0x11, 0x1e, 0x1c, 0x1e, 0x68,
+ 0x1e, 0xb8, 0x1f, 0x2e, 0x1f, 0x44, 0x1f, 0xdc,
+ 0x20, 0x1b, 0x20, 0x48, 0x20, 0xbc, 0x21, 0x52,
+ 0x21, 0xd7, 0x22, 0x2d, 0x22, 0x4d, 0x22, 0xf6,
+ 0x23, 0x8, 0x23, 0x98, 0x24, 0x2, 0x24, 0x10,
+ 0x24, 0x25, 0x24, 0x37, 0x24, 0xd9, 0x24, 0xf1,
+ 0x25, 0x25, 0x25, 0x56, 0x25, 0x9c, 0x25, 0xf2,
+ 0x26, 0x2, 0x26, 0x4a, 0x26, 0x78, 0x26, 0x8a,
+ 0x26, 0xbd, 0x26, 0xe2, 0x27, 0x26, 0x27, 0x33,
+ 0x27, 0x93, 0x28, 0x10, 0x28, 0xaa, 0x29, 0x0,
+ 0x29, 0x18, 0x29, 0x33, 0x29, 0x53, 0x29, 0x9e,
+ 0x29, 0xc2, 0x29, 0xf9, 0x2a, 0x49, 0x2a, 0xd8,
+ 0x2a, 0xed, 0x2b, 0x4, 0x2b, 0x24, 0x2b, 0x49,
+ 0x2b, 0x6d, 0x2b, 0x84, 0x2b, 0xa5, 0x2b, 0xbf,
+ 0x2c, 0xc, 0x2c, 0x66, 0x2c, 0x72, 0x2c, 0x8e,
+ 0x2c, 0xa8, 0x2c, 0xed, 0x2d, 0x13, 0x2d, 0x46,
+ 0x2d, 0xbd, 0x2d, 0xca, 0x2d, 0xd0, 0x2d, 0xde,
+ 0x2d, 0xee, 0x2e, 0x1e, 0x2e, 0x6a, 0x2e, 0xe8,
+ 0x2f, 0x5, 0x2f, 0x2a, 0x2f, 0x4f, 0x2f, 0xa2,
+ 0x2f, 0xc2, 0x30, 0x5b, 0x31, 0x8, 0x31, 0x8e,
+ 0x31, 0xb1, 0x31, 0xd6, 0x31, 0xfb, 0x32, 0x29,
+ 0x32, 0x3f, 0x32, 0x5b, 0x32, 0x7d, 0x32, 0x9e,
+ 0x33, 0x1a, 0x33, 0xac, 0x33, 0xbf, 0x33, 0xe4,
+ 0x34, 0x1, 0x34, 0x52, 0x34, 0x77, 0x34, 0xa3,
+ 0x35, 0x1d, 0x35, 0x2b, 0x35, 0x37, 0x35, 0x45,
+ 0x35, 0x58, 0x35, 0x94, 0x35, 0xed, 0x36, 0x24,
+ 0xfb, 0xf9, 0xe, 0xfb, 0xf9, 0xe, 0xf8, 0xf0,
+ 0xd4, 0x42, 0xf7, 0x26, 0x12, 0x13, 0x40, 0xf7,
+ 0x30, 0xf9, 0x82, 0x15, 0x49, 0x94, 0xae, 0x3b,
+ 0xf7, 0x4, 0x1b, 0xf7, 0x11, 0xb9, 0xf7, 0x4,
+ 0xad, 0x96, 0x1f, 0x43, 0x6, 0x13, 0x80, 0x75,
+ 0x80, 0x6c, 0x58, 0x4b, 0x1b, 0x13, 0x40, 0x55,
+ 0x76, 0xad, 0xb2, 0x81, 0x1f, 0xe, 0xf8, 0xfa,
+ 0xf7, 0x7, 0x1, 0xf7, 0x7f, 0xf8, 0xfa, 0x15,
+ 0xf7, 0x10, 0x6, 0xa5, 0xf7, 0x7, 0x5, 0xfb,
+ 0x10, 0x6, 0xe, 0xf7, 0x5c, 0xf9, 0x36, 0x15,
+ 0x51, 0xbd, 0x5b, 0xc8, 0xc5, 0xbe, 0xb9, 0xc7,
+ 0xc7, 0x59, 0xb5, 0x50, 0x4c, 0x5b, 0x60, 0x50,
+ 0x1e, 0xc7, 0x16, 0xa5, 0xa1, 0x9d, 0xa8, 0xa5,
+ 0xa2, 0x7a, 0x70, 0x70, 0x74, 0x76, 0x71, 0x6f,
+ 0x74, 0xa0, 0xa6, 0x1e, 0xe, 0x72, 0xa, 0xf7,
+ 0x1d, 0xf8, 0xf0, 0x15, 0xf3, 0x52, 0xa, 0xf7,
+ 0x6, 0xfb, 0x26, 0x15, 0xf3, 0x52, 0xa, 0xe,
+ 0xfb, 0x78, 0xd9, 0xf7, 0x2a, 0x77, 0x1, 0xb4,
+ 0xdc, 0x3, 0xd6, 0x16, 0x83, 0x7a, 0x71, 0x4f,
+ 0x54, 0x1a, 0x46, 0xb1, 0x70, 0xc3, 0xaf, 0xbe,
+ 0x9b, 0x9b, 0xa6, 0x1e, 0x9a, 0xcd, 0x5, 0x89,
+ 0x86, 0x55, 0x79, 0x6a, 0x1b, 0x76, 0x6e, 0x95,
+ 0xb2, 0x9b, 0x8f, 0xaa, 0xa2, 0xc1, 0x1f, 0xe,
+ 0x72, 0xa, 0xf7, 0x68, 0xf8, 0xf0, 0x8e, 0xa,
+ 0xf7, 0x2c, 0xf7, 0x26, 0x7a, 0xa, 0x32, 0x34,
+ 0x63, 0xe2, 0x5, 0x25, 0x6, 0xe, 0x48, 0xa,
+ 0x1, 0xd0, 0x16, 0xf7, 0x23, 0x6, 0xf7, 0x2,
+ 0xf8, 0xa8, 0x47, 0xa, 0xe, 0xfc, 0x68, 0x8d,
+ 0x76, 0xf9, 0x6d, 0x77, 0x1, 0x29, 0x78, 0x15,
+ 0xf8, 0xdd, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+ 0xdd, 0xfd, 0x6d, 0x5, 0xe, 0x84, 0xa, 0xf9,
+ 0x6b, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x21, 0x6,
+ 0xe3, 0xf8, 0x33, 0x5, 0xef, 0x6, 0xa1, 0xf1,
+ 0x5, 0x27, 0x6, 0xda, 0x9a, 0x9d, 0xa4, 0xb2,
+ 0x1b, 0x99, 0x9d, 0x87, 0x7d, 0xb1, 0x1f, 0xa6,
+ 0xf0, 0x5, 0x9c, 0x55, 0x59, 0x91, 0x6b, 0x1b,
+ 0xfb, 0x17, 0x81, 0x28, 0xfb, 0x3, 0x6a, 0x1f,
+ 0x3b, 0x6, 0x76, 0x25, 0x5, 0xda, 0x6, 0xf7,
+ 0x79, 0xfc, 0x33, 0x15, 0x9b, 0xa, 0xf7, 0x1,
+ 0xf8, 0x99, 0x3d, 0xa, 0x9a, 0xd2, 0x15, 0xf7,
+ 0x21, 0x6, 0xa5, 0xf7, 0x13, 0x65, 0xa, 0x84,
+ 0xa, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, 0x1,
+ 0xf8, 0x28, 0x16, 0xf7, 0x20, 0x6, 0xf7, 0x2b,
+ 0xf9, 0x5f, 0x3d, 0xa, 0xfc, 0x67, 0xfd, 0x5f,
+ 0x15, 0x9b, 0xa, 0xe2, 0xf8, 0x33, 0x5, 0xef,
+ 0x6, 0xa0, 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9c,
+ 0x9a, 0xa4, 0xb2, 0x1b, 0x99, 0x9f, 0x86, 0x7e,
+ 0xb0, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, 0x5a,
+ 0x91, 0x6a, 0x1b, 0xfb, 0x15, 0x80, 0x28, 0xfb,
+ 0x3, 0x6a, 0x1f, 0x3c, 0x6, 0x75, 0x25, 0x5,
+ 0xda, 0x6, 0xe, 0x87, 0xa, 0xcf, 0x16, 0xf8,
+ 0x9a, 0x50, 0xa, 0xfc, 0x4, 0x6, 0xbe, 0xf7,
+ 0x84, 0xf7, 0x4c, 0xee, 0xa3, 0xf7, 0x7, 0xfb,
+ 0x4c, 0x28, 0xbd, 0xf7, 0x86, 0x94, 0xa, 0x44,
+ 0xfb, 0xe0, 0x30, 0x59, 0x73, 0xfb, 0x8, 0xe6,
+ 0xbd, 0x5, 0xe, 0xfb, 0xf9, 0x37, 0xa, 0xdc,
+ 0x16, 0xf7, 0x20, 0x6, 0xd6, 0xf8, 0x0, 0xe7,
+ 0xcc, 0x9e, 0xe9, 0x2e, 0x4a, 0xc2, 0xf7, 0x98,
+ 0x5, 0xfb, 0x20, 0x6, 0x44, 0xfb, 0xe8, 0x29,
+ 0x48, 0x77, 0x2d, 0xef, 0xcd, 0x5, 0xe, 0x73,
+ 0x8b, 0xf7, 0xd, 0xf8, 0x7f, 0xf7, 0x10, 0xbe,
+ 0x95, 0xa, 0xa4, 0x16, 0xf8, 0xcb, 0x40, 0xa,
+ 0x8c, 0x8a, 0x2c, 0x8b, 0x2b, 0x1b, 0x52, 0x4c,
+ 0x8b, 0x8a, 0x44, 0x1f, 0xf8, 0x3e, 0xf8, 0x88,
+ 0xa0, 0xf7, 0x8, 0x5, 0xfc, 0xa2, 0x6, 0x71,
+ 0xfb, 0x10, 0x5, 0xf7, 0xe8, 0x6, 0xfc, 0x37,
+ 0xfc, 0x84, 0x5, 0xf7, 0xc7, 0xf9, 0x33, 0x15,
+ 0xf7, 0x19, 0x6, 0xf7, 0x28, 0x67, 0xa, 0xfb,
+ 0xa, 0x6, 0x34, 0x31, 0x65, 0xe5, 0x5, 0x27,
+ 0x6, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0x9, 0xf7,
+ 0xc0, 0xf7, 0x5, 0xd0, 0x95, 0xa, 0x9f, 0x16,
+ 0xf8, 0x69, 0x6, 0xa5, 0xf7, 0x9, 0x5, 0xfb,
+ 0xa8, 0x6, 0xf7, 0xd1, 0xf7, 0xdb, 0x9e, 0xe1,
+ 0x5, 0xfc, 0x56, 0x6, 0x72, 0xfb, 0x5, 0x5,
+ 0xf7, 0x94, 0x6, 0xfb, 0xce, 0xfb, 0xd3, 0x5,
+ 0xf7, 0x83, 0xf8, 0x89, 0x15, 0xf7, 0x25, 0x6,
+ 0xf7, 0x34, 0x67, 0xa, 0xfb, 0x14, 0x6, 0x2d,
+ 0x31, 0x61, 0xe5, 0x5, 0x20, 0x6, 0xe, 0x8b,
+ 0xf7, 0x1b, 0xf8, 0xdb, 0x77, 0x1, 0xe9, 0xf7,
+ 0xc3, 0x3, 0xe9, 0x16, 0x7c, 0xa, 0xa8, 0xf7,
+ 0x1b, 0x47, 0xa, 0xb1, 0xbb, 0x15, 0xdb, 0x6,
+ 0xf7, 0x8, 0xf7, 0xf5, 0xb2, 0xf7, 0x4a, 0x5,
+ 0xfb, 0x2d, 0x6, 0x67, 0xfb, 0x4a, 0x5, 0xe,
+ 0xfb, 0x35, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+ 0x1, 0xf7, 0x55, 0xf7, 0x25, 0xb9, 0xf7, 0x25,
+ 0x3, 0xf8, 0x14, 0xf8, 0x53, 0x15, 0xdd, 0x6,
+ 0xb5, 0xf7, 0x22, 0xa0, 0xf7, 0x15, 0x7a, 0xa,
+ 0x78, 0xfb, 0x15, 0x5, 0xfb, 0x57, 0xfb, 0x22,
+ 0x15, 0xdd, 0x6, 0xb7, 0xf7, 0x22, 0x9e, 0xf7,
+ 0x15, 0x5, 0xfb, 0xd, 0x6, 0x77, 0xfb, 0x15,
+ 0x5, 0xe, 0x3c, 0xa0, 0x76, 0xf8, 0x35, 0xf2,
+ 0xf7, 0x46, 0x77, 0x1, 0xe6, 0x16, 0xf7, 0xb,
+ 0x6, 0xb5, 0xf7, 0x47, 0x5, 0xf7, 0xb, 0x6,
+ 0x61, 0xfb, 0x47, 0x5, 0xf7, 0xb, 0x6, 0xb5,
+ 0xf7, 0x47, 0x5, 0xf7, 0x2e, 0xf1, 0xfb, 0x16,
+ 0x6, 0xab, 0xf7, 0x1c, 0x5, 0xed, 0xf2, 0x41,
+ 0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xf, 0x6,
+ 0x62, 0xfb, 0x46, 0x5, 0xfb, 0x9, 0x6, 0xb5,
+ 0xf7, 0x46, 0x5, 0xfb, 0xb, 0x6, 0x60, 0xfb,
+ 0x46, 0x5, 0xfb, 0x2b, 0x24, 0xf7, 0x13, 0x6,
+ 0x6c, 0xfb, 0x1c, 0x5, 0x2b, 0x25, 0xd3, 0x6,
+ 0xf7, 0x24, 0xf1, 0x15, 0xaa, 0xf7, 0x1c, 0x5,
+ 0xf7, 0xa, 0x6, 0x6b, 0xfb, 0x1c, 0x5, 0xe,
+ 0x3c, 0x2d, 0x76, 0xe3, 0xf7, 0x3, 0xf9, 0x47,
+ 0x77, 0x1, 0xf7, 0x2e, 0xf7, 0xe, 0xf7, 0x46,
+ 0xf7, 0xc, 0x3, 0xce, 0xf7, 0x5b, 0x15, 0x93,
+ 0xfb, 0x7, 0xcf, 0x3c, 0xec, 0x73, 0x76, 0x2b,
+ 0x18, 0xd4, 0x6, 0x9e, 0xe3, 0x5, 0xf7, 0x41,
+ 0xe5, 0xf4, 0xf7, 0x5, 0xf7, 0x26, 0xfb, 0x12,
+ 0xc9, 0x5f, 0x9c, 0x1f, 0xb6, 0xf7, 0x5b, 0x97,
+ 0x85, 0xa7, 0x7b, 0x94, 0x53, 0x19, 0xf7, 0x12,
+ 0x93, 0x80, 0xf7, 0x6, 0x42, 0xba, 0x47, 0x9d,
+ 0x19, 0x95, 0xbe, 0x5, 0x44, 0x6, 0x81, 0x61,
+ 0x5, 0xfb, 0xb, 0xfb, 0x12, 0x4e, 0xfb, 0x1d,
+ 0x5b, 0x9f, 0xfb, 0x5, 0xf7, 0x1d, 0x50, 0x1f,
+ 0x5c, 0xfb, 0x71, 0x50, 0xa5, 0x84, 0xcd, 0x89,
+ 0xa0, 0x19, 0xf7, 0x22, 0xf7, 0x82, 0x15, 0x66,
+ 0xa0, 0x72, 0xa7, 0xb4, 0x1a, 0xba, 0xb2, 0xb9,
+ 0xc8, 0x89, 0x1e, 0x61, 0xfc, 0xb2, 0x15, 0xb5,
+ 0xf7, 0x5c, 0x5, 0xb4, 0x77, 0xb0, 0x76, 0x57,
+ 0x1a, 0x63, 0x70, 0x4f, 0x2e, 0x84, 0x1e, 0xe,
+ 0xf7, 0x92, 0x7a, 0xdb, 0x4e, 0x76, 0xf7, 0xaf,
+ 0xdc, 0x8f, 0xdb, 0xf7, 0x5d, 0xdb, 0x8a, 0x77,
+ 0x12, 0xf7, 0xfa, 0xf0, 0xf7, 0xe9, 0xf0, 0x13,
+ 0x7b, 0xf7, 0x81, 0xf8, 0x6e, 0x15, 0x90, 0x99,
+ 0xf7, 0x2b, 0xce, 0x9d, 0xa1, 0x82, 0x68, 0x76,
+ 0x7e, 0xfb, 0x1c, 0x47, 0x63, 0x8b, 0xaa, 0x99,
+ 0x1e, 0x47, 0xfc, 0x81, 0x15, 0xf7, 0x2, 0x6,
+ 0x13, 0x77, 0xf8, 0xe2, 0xf9, 0x6c, 0x5, 0xfb,
+ 0x3, 0x6, 0xfd, 0x2, 0xfb, 0x75, 0x15, 0x4b,
+ 0xb0, 0x44, 0xeb, 0xf7, 0x30, 0xad, 0xf7, 0x2f,
+ 0xcb, 0x1e, 0x13, 0xbb, 0xc4, 0x71, 0xe0, 0xfb,
+ 0x1, 0xfb, 0x1f, 0x5a, 0xfb, 0x1a, 0x2f, 0x1e,
+ 0xf8, 0x4e, 0xfc, 0x1, 0x15, 0x4a, 0xb0, 0x44,
+ 0xeb, 0xf7, 0x2f, 0xae, 0xf7, 0x30, 0xcb, 0xc4,
+ 0x70, 0xe0, 0x20, 0xfb, 0x20, 0x5a, 0xfb, 0x1b,
+ 0x30, 0x1e, 0xf0, 0x81, 0x15, 0x91, 0x98, 0xf7,
+ 0x29, 0xd0, 0x9b, 0xa2, 0x83, 0x68, 0x76, 0x7d,
+ 0xfb, 0x1d, 0x48, 0x63, 0x8b, 0xab, 0x99, 0x1e,
+ 0xe, 0xe2, 0x7d, 0xf7, 0x5, 0x2a, 0x76, 0xf9,
+ 0x19, 0xe5, 0x12, 0xe4, 0xf7, 0x23, 0x9a, 0xf7,
+ 0x19, 0x13, 0x98, 0xf7, 0xac, 0xf8, 0x3b, 0x15,
+ 0x4b, 0x6b, 0xfb, 0x13, 0x4e, 0xfb, 0x1f, 0x1a,
+ 0x32, 0xcd, 0xfb, 0x8, 0xf7, 0x49, 0xec, 0xd4,
+ 0xad, 0xa9, 0xb2, 0x1e, 0x13, 0x58, 0x9f, 0x77,
+ 0xb4, 0x69, 0xa6, 0x7c, 0xe7, 0xe6, 0x18, 0x8a,
+ 0x8c, 0x86, 0x8f, 0x8c, 0x1a, 0x6d, 0xa2, 0x7d,
+ 0x98, 0x72, 0xa2, 0xa7, 0xa5, 0xae, 0xbb, 0x9e,
+ 0xae, 0x23, 0xc6, 0x18, 0x68, 0x56, 0x7b, 0x7c,
+ 0x81, 0x81, 0x76, 0xa1, 0x58, 0xd1, 0x62, 0xcf,
+ 0x8, 0x13, 0x8, 0xf7, 0x2f, 0xd6, 0x9c, 0xe3,
+ 0xab, 0x1a, 0x13, 0x28, 0xc7, 0x56, 0xd7, 0xfb,
+ 0xc, 0x23, 0x25, 0x54, 0xfb, 0x9, 0x5e, 0x99,
+ 0x62, 0x9e, 0x66, 0x1e, 0xbf, 0x2a, 0x15, 0xac,
+ 0x52, 0xbf, 0x40, 0xbb, 0x53, 0x8, 0x13, 0x98,
+ 0x7c, 0x73, 0x63, 0x73, 0x4f, 0x1b, 0x3e, 0x6b,
+ 0xb7, 0xbb, 0xd9, 0xd5, 0xb7, 0xa5, 0x98, 0x1f,
+ 0xd1, 0xf7, 0x2f, 0x15, 0x84, 0x98, 0x7c, 0x9f,
+ 0xab, 0x1a, 0x13, 0x0, 0xb6, 0xaa, 0xb2, 0xb2,
+ 0xac, 0x9f, 0x77, 0x71, 0x5f, 0x50, 0x66, 0x61,
+ 0x77, 0x1e, 0xe, 0xfc, 0x21, 0xf8, 0x68, 0x76,
+ 0xf7, 0xa3, 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x53,
+ 0x15, 0xe4, 0x6, 0xb7, 0xf7, 0x22, 0xa2, 0xf7,
+ 0x15, 0x66, 0xa, 0x77, 0xfb, 0x15, 0x5, 0xe,
+ 0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, 0xd7,
+ 0xf7, 0x19, 0x3, 0xf7, 0x33, 0xfb, 0x64, 0x15,
+ 0xf1, 0x6, 0x8c, 0x89, 0x92, 0x8a, 0x8d, 0x1e,
+ 0x6d, 0xed, 0x78, 0xf7, 0x2c, 0xf4, 0x1a, 0xf7,
+ 0x9a, 0xf7, 0x2a, 0xf7, 0x76, 0xf7, 0x3, 0xe4,
+ 0x1e, 0xfb, 0x5, 0x6, 0x32, 0x2d, 0xfb, 0x54,
+ 0xfb, 0x62, 0xfb, 0xa9, 0x1a, 0x50, 0x94, 0xfb,
+ 0x22, 0xd5, 0xfb, 0x38, 0x1e, 0xe, 0xfb, 0x4f,
+ 0x76, 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x80, 0xf7,
+ 0x19, 0x3, 0x72, 0xfb, 0x64, 0x15, 0xf7, 0x5,
+ 0x6, 0xe4, 0xe9, 0xf7, 0x54, 0xf7, 0x62, 0xf7,
+ 0xa9, 0x1a, 0xc6, 0x82, 0xf7, 0x22, 0x41, 0xf7,
+ 0x38, 0x1e, 0x25, 0x6, 0xab, 0x26, 0x9f, 0xfb,
+ 0x2d, 0xfb, 0x1, 0x1a, 0xfb, 0xd1, 0xfb, 0x5e,
+ 0xfb, 0x6e, 0x50, 0x5f, 0x1e, 0xe, 0xfb, 0x8a,
+ 0xf8, 0x2c, 0x76, 0xf7, 0xdf, 0x77, 0x1, 0xf7,
+ 0x8c, 0xf8, 0x17, 0x15, 0xcc, 0xf7, 0x2, 0xca,
+ 0xfb, 0x2, 0xd0, 0xc1, 0x39, 0xe8, 0xf7, 0xa,
+ 0xa4, 0x71, 0xe0, 0xfb, 0x6, 0x57, 0x97, 0xf7,
+ 0x12, 0x5, 0x37, 0x6, 0x98, 0xfb, 0x12, 0xfb,
+ 0x0, 0xc2, 0x6f, 0x36, 0xf7, 0xa, 0x6f, 0x32,
+ 0x2d, 0x5, 0xe, 0x58, 0xf7, 0x52, 0xf7, 0x14,
+ 0x1, 0xf7, 0xab, 0xf7, 0x19, 0x3, 0xdd, 0xf7,
+ 0x52, 0x15, 0xf7, 0x59, 0xfb, 0x52, 0xf7, 0x19,
+ 0xf7, 0x52, 0xf7, 0x5a, 0xf7, 0x14, 0xfb, 0x5a,
+ 0xf7, 0x50, 0xfb, 0x19, 0xfb, 0x50, 0xfb, 0x59,
+ 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x27, 0x76, 0xf7,
+ 0xce, 0x77, 0x1, 0xc9, 0x8d, 0x15, 0xd0, 0x6,
+ 0x7d, 0x4a, 0x70, 0x74, 0x5b, 0x80, 0x7d, 0x44,
+ 0x18, 0xf7, 0x2d, 0x8e, 0xa4, 0xf7, 0x16, 0x98,
+ 0xca, 0xa5, 0xf7, 0xa, 0x18, 0xfb, 0x2d, 0x6,
+ 0xe, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xd4, 0xf7,
+ 0x6b, 0x15, 0xf7, 0xa9, 0x6, 0xa8, 0xf7, 0x16,
+ 0x5, 0xfb, 0xa9, 0x6, 0xe, 0xfb, 0xf9, 0x8b,
+ 0xf7, 0x26, 0x1, 0xcb, 0x16, 0xf7, 0x2b, 0x6,
+ 0xa9, 0xf7, 0x26, 0x5, 0x97, 0xa, 0xe, 0xfb,
+ 0xf9, 0x78, 0xa, 0x76, 0xf8, 0x8d, 0x3, 0x66,
+ 0x78, 0x15, 0xef, 0x6, 0xf8, 0x29, 0xf9, 0x88,
+ 0x5, 0x25, 0x6, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xf8, 0x8d, 0xf7, 0x4, 0x1, 0xe1, 0xf7, 0xf,
+ 0xf7, 0xb0, 0xf7, 0x10, 0x3, 0xe1, 0xf7, 0x63,
+ 0x15, 0xfb, 0x3b, 0xea, 0x50, 0xf7, 0x6, 0xf7,
+ 0x81, 0xe0, 0xf7, 0xe6, 0xf7, 0x30, 0xf7, 0x3e,
+ 0x2d, 0xcc, 0xfb, 0x5, 0xfb, 0x7a, 0x2d, 0xfb,
+ 0xe3, 0xfb, 0x3c, 0x1e, 0xf7, 0xf, 0x16, 0xb6,
+ 0xc6, 0xf7, 0xf0, 0xf7, 0x1b, 0xc5, 0xab, 0x3c,
+ 0x5f, 0x44, 0x52, 0xfb, 0xcb, 0xfb, 0x1b, 0x45,
+ 0x75, 0xe6, 0xa2, 0x1e, 0xe, 0x3c, 0xa0, 0x76,
+ 0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0xf8,
+ 0x3, 0xf7, 0x9c, 0x16, 0xf7, 0x14, 0x6, 0xf7,
+ 0x1d, 0xf9, 0x5a, 0x5, 0x3e, 0x6, 0x39, 0x2c,
+ 0xfb, 0x1, 0x56, 0x4b, 0x6c, 0x73, 0xfb, 0x10,
+ 0x18, 0xb3, 0x95, 0xdb, 0xa7, 0xcd, 0xba, 0x8,
+ 0xe, 0x3c, 0x8b, 0xf7, 0x12, 0xf8, 0x6f, 0xf7,
+ 0x1, 0x1, 0xf8, 0x54, 0xf7, 0x20, 0x3, 0xa4,
+ 0x16, 0xf8, 0x74, 0x6, 0xa9, 0xf7, 0x12, 0x5,
+ 0xfb, 0xa6, 0x6, 0xb0, 0xb5, 0x9b, 0x99, 0xf7,
+ 0x10, 0xf2, 0x8, 0xf7, 0x0, 0xe4, 0xb5, 0xd1,
+ 0xd7, 0x1a, 0xdf, 0x4f, 0xf5, 0xfb, 0x45, 0xfb,
+ 0x15, 0x28, 0x45, 0xfb, 0x19, 0x73, 0x1e, 0xf7,
+ 0x21, 0x77, 0x5, 0xbf, 0x96, 0xae, 0xc9, 0xd1,
+ 0x1b, 0xc3, 0xaf, 0x61, 0x65, 0x38, 0xfb, 0x14,
+ 0x35, 0x40, 0x48, 0x1f, 0xfb, 0x2, 0x2f, 0x2d,
+ 0x3f, 0x7b, 0xfb, 0x9, 0x8, 0xe, 0x3c, 0x78,
+ 0xf7, 0x6, 0xf7, 0x63, 0xf7, 0x9, 0xf7, 0x46,
+ 0xf7, 0x5, 0x1, 0xf8, 0x60, 0xf7, 0x28, 0x3,
+ 0xcc, 0xf7, 0x47, 0x15, 0xfb, 0x2b, 0xa0, 0xf7,
+ 0x4, 0x5c, 0xf2, 0x1b, 0xf7, 0x3b, 0xf3, 0xf7,
+ 0xb, 0xf7, 0x1, 0xc9, 0x68, 0xc5, 0x50, 0xa8,
+ 0x1f, 0xcc, 0xa1, 0xcc, 0xc3, 0xe3, 0x1a, 0xe0,
+ 0x45, 0xf0, 0xfb, 0x2f, 0xfb, 0x4c, 0x65, 0xfb,
+ 0x25, 0x64, 0x7e, 0x1e, 0xf7, 0x1d, 0x71, 0x5,
+ 0xc1, 0x9a, 0xa7, 0xb6, 0xc2, 0x1b, 0xaa, 0xb9,
+ 0x7c, 0x51, 0x49, 0x4f, 0x64, 0x3d, 0x1f, 0x71,
+ 0xfb, 0x9, 0x5, 0xd0, 0xc2, 0x72, 0x47, 0x4e,
+ 0x5e, 0x56, 0x42, 0x4b, 0x77, 0xb5, 0xc5, 0x81,
+ 0x1f, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x25, 0xf7,
+ 0xa, 0xf8, 0x38, 0x77, 0x1, 0xc7, 0xf8, 0xae,
+ 0x3, 0xc7, 0xf7, 0x25, 0x15, 0xf7, 0xb1, 0x6,
+ 0x6b, 0xfb, 0x25, 0x5, 0xf7, 0x1a, 0x6, 0xaa,
+ 0xf7, 0x25, 0x5, 0xe3, 0x6, 0xa4, 0xf7, 0xa,
+ 0x5, 0x33, 0x6, 0xea, 0xf8, 0x53, 0x7a, 0xa,
+ 0xfc, 0x1b, 0xfc, 0x55, 0x5, 0xf7, 0x22, 0x8d,
+ 0x15, 0xf7, 0x50, 0xf7, 0x72, 0x8d, 0x89, 0x5c,
+ 0xfb, 0x70, 0x5, 0xe, 0x20, 0x78, 0xf7, 0x7,
+ 0xf7, 0xab, 0xf2, 0xf7, 0x2, 0xf7, 0x14, 0x1,
+ 0xc8, 0xf7, 0x24, 0xf7, 0x73, 0xf7, 0x27, 0x3,
+ 0xc8, 0xf7, 0x5a, 0x15, 0xfb, 0x22, 0x8d, 0xf1,
+ 0x40, 0xf7, 0x9, 0x1b, 0xf7, 0x44, 0xf7, 0x9,
+ 0xf7, 0x27, 0xf7, 0x28, 0xf7, 0x9, 0x3d, 0xe0,
+ 0xfb, 0xd, 0x60, 0x73, 0x81, 0x83, 0x78, 0x1f,
+ 0xae, 0xf7, 0x2, 0x5, 0xf7, 0x8f, 0x6, 0xa7,
+ 0xf7, 0x14, 0x5, 0xfc, 0x11, 0x6, 0xfb, 0x6,
+ 0xfc, 0x1, 0xf7, 0xe, 0x82, 0x5, 0xbe, 0xbc,
+ 0xbd, 0x8b, 0x94, 0x1b, 0xb7, 0xb8, 0x73, 0x3f,
+ 0xfb, 0x9, 0x42, 0x4d, 0x49, 0x4a, 0x75, 0xbc,
+ 0xcc, 0x8e, 0x1f, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xf7, 0xb0, 0xe7, 0xf7, 0x15, 0xf7, 0x4, 0x1,
+ 0xe0, 0xf7, 0x26, 0xf7, 0x5e, 0xf7, 0x27, 0x3,
+ 0xf7, 0xa3, 0xf8, 0x4c, 0x15, 0xb7, 0x98, 0xaf,
+ 0xf7, 0x6, 0xe3, 0x1b, 0xc9, 0x90, 0x59, 0x72,
+ 0x8d, 0x1f, 0xf7, 0x22, 0x94, 0x5, 0xf7, 0xd,
+ 0x7c, 0x45, 0xc4, 0xfb, 0x7, 0x1b, 0xfb, 0x6b,
+ 0xfb, 0xb, 0xfb, 0x8f, 0xfb, 0x81, 0xfb, 0x10,
+ 0xd7, 0xfb, 0x9, 0xf7, 0x2a, 0xf7, 0x43, 0xe9,
+ 0xf7, 0x2a, 0xf7, 0x14, 0xf7, 0x11, 0x3a, 0xe0,
+ 0xfb, 0x10, 0x64, 0x6a, 0x82, 0x77, 0x6b, 0x1f,
+ 0x63, 0xfb, 0x6e, 0x15, 0xe3, 0xb8, 0xce, 0xd7,
+ 0xb0, 0xb7, 0x6d, 0x33, 0xfb, 0x0, 0x54, 0x51,
+ 0x4c, 0x47, 0x7b, 0xde, 0xb9, 0x1e, 0xe, 0x3c,
+ 0xa0, 0x76, 0xf8, 0xdd, 0xf7, 0x11, 0x1, 0xf7,
+ 0x27, 0x16, 0xf7, 0x27, 0x6, 0xa7, 0xf7, 0x1c,
+ 0xf7, 0x2d, 0xf7, 0xe7, 0xf7, 0x47, 0xf7, 0x13,
+ 0xa1, 0xeb, 0x18, 0xfc, 0x9c, 0x6, 0x6c, 0xfb,
+ 0x11, 0x5, 0xf7, 0xe7, 0x6, 0xfb, 0x8e, 0xfb,
+ 0x9c, 0x4b, 0xfb, 0xb3, 0x88, 0x75, 0x8, 0xe,
+ 0x3c, 0x78, 0xf6, 0xf7, 0x80, 0xf6, 0xf7, 0x38,
+ 0xf6, 0x1, 0xd0, 0xf7, 0x2d, 0xf7, 0x65, 0xf7,
+ 0x29, 0x3, 0xf7, 0x7c, 0xf8, 0x16, 0x15, 0xfb,
+ 0x21, 0x5f, 0x75, 0xfb, 0xd, 0x5d, 0x1a, 0x22,
+ 0xdc, 0x32, 0xf7, 0x28, 0xf7, 0x48, 0xf1, 0xf7,
+ 0x13, 0xf7, 0x6, 0xee, 0x47, 0xb1, 0x6f, 0x9b,
+ 0x1e, 0xac, 0x98, 0xee, 0xa9, 0xf7, 0x0, 0x1a,
+ 0xf0, 0x37, 0xde, 0xfb, 0x1e, 0xfb, 0x3e, 0x41,
+ 0xfb, 0xd, 0x38, 0x3b, 0xc6, 0x71, 0xa2, 0x7d,
+ 0x1e, 0x81, 0xfb, 0x67, 0x15, 0xcf, 0xb3, 0xdc,
+ 0xdd, 0xbe, 0xaf, 0x55, 0x5b, 0x60, 0x72, 0x30,
+ 0x29, 0x62, 0x5e, 0xa4, 0xc9, 0x1e, 0xcf, 0xf7,
+ 0xdf, 0x15, 0xc4, 0xbd, 0xb3, 0xbf, 0xc1, 0xa7,
+ 0x65, 0x64, 0x59, 0x5b, 0x5e, 0x53, 0x5b, 0x6b,
+ 0xab, 0xb6, 0x1e, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xfb, 0x4, 0xf7, 0x4a, 0xc6, 0xe7, 0xf7, 0xb0,
+ 0xf7, 0x4, 0x1, 0xf7, 0x9, 0xf7, 0x28, 0xf7,
+ 0x5e, 0xf7, 0x28, 0x3, 0xd9, 0xf7, 0x33, 0x15,
+ 0xfb, 0xd, 0x9a, 0xd2, 0x52, 0xf7, 0x7, 0x1b,
+ 0xf7, 0x6c, 0xf7, 0xc, 0xf7, 0x90, 0xf7, 0x81,
+ 0xf7, 0x10, 0x3f, 0xf7, 0x8, 0xfb, 0x2b, 0xfb,
+ 0x44, 0x2c, 0xfb, 0x2f, 0xfb, 0x14, 0xfb, 0x11,
+ 0xdd, 0x3b, 0xf7, 0x11, 0xb2, 0xab, 0x94, 0x9f,
+ 0xac, 0x1f, 0x5f, 0x7e, 0x67, 0xfb, 0x6, 0x32,
+ 0x1b, 0x4d, 0x86, 0xbd, 0xa4, 0x88, 0x1f, 0xb8,
+ 0xf7, 0x97, 0x15, 0xf7, 0x0, 0xc2, 0xca, 0xca,
+ 0xd0, 0x9a, 0x3a, 0x5d, 0x33, 0x5f, 0x46, 0x3e,
+ 0x67, 0x5e, 0xa4, 0xe3, 0x1e, 0xe, 0x8b, 0xf7,
+ 0x17, 0xf7, 0x8f, 0xf7, 0x16, 0x1, 0xf7, 0x44,
+ 0xf8, 0x12, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7,
+ 0x16, 0x93, 0xa, 0xfb, 0x5, 0xfc, 0x94, 0x15,
+ 0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x17, 0x93, 0xa,
+ 0xe, 0xfb, 0x27, 0x76, 0xf7, 0x47, 0x76, 0xf8,
+ 0x19, 0xf7, 0x19, 0x1, 0xc3, 0xf7, 0xbb, 0x3,
+ 0xe5, 0x81, 0x15, 0xcf, 0x6, 0x7d, 0x4f, 0x70,
+ 0x75, 0x5c, 0x81, 0x7d, 0x49, 0x18, 0xf7, 0x2a,
+ 0x8e, 0xa5, 0xf7, 0xd, 0x97, 0xc5, 0xa5, 0xf7,
+ 0x2, 0x18, 0x97, 0xa, 0xc2, 0xf7, 0x93, 0x15,
+ 0xf7, 0x27, 0x6, 0xa9, 0xf7, 0x19, 0x7b, 0xa,
+ 0xe, 0x58, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1,
+ 0xdd, 0xf7, 0x58, 0x15, 0xf8, 0x8b, 0xfb, 0x60,
+ 0x5, 0xf7, 0x17, 0x7, 0xfb, 0xdd, 0xf7, 0x17,
+ 0xf7, 0xdd, 0xf7, 0x13, 0x5, 0xf7, 0x19, 0x7,
+ 0xfc, 0x8b, 0xfb, 0x60, 0x5, 0xe, 0x58, 0xe2,
+ 0xf7, 0xb, 0xe9, 0xf7, 0xb, 0x1, 0xc5, 0xf8,
+ 0xd3, 0x3, 0xc5, 0xe2, 0x15, 0xf8, 0xd3, 0xf7,
+ 0xb, 0xfc, 0xd3, 0x6, 0xe9, 0x4, 0xf8, 0xd3,
+ 0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe, 0x58, 0x98,
+ 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf5, 0x83, 0x15,
+ 0xf8, 0x8b, 0xf7, 0x60, 0x5, 0xf7, 0x6, 0x7,
+ 0xfc, 0x8b, 0xf7, 0x60, 0x98, 0xa, 0x7, 0xf7,
+ 0xdc, 0xfb, 0x17, 0xfb, 0xdc, 0xfb, 0x13, 0x5,
+ 0xe, 0x73, 0x8b, 0xf7, 0x1b, 0xf8, 0x7d, 0xf2,
+ 0x1, 0xf7, 0x98, 0xf7, 0x47, 0x15, 0xf7, 0x15,
+ 0x6, 0x96, 0xca, 0x9f, 0x9b, 0xdd, 0xce, 0x8,
+ 0xf7, 0xa, 0xea, 0xbe, 0xbc, 0xda, 0x1a, 0xdf,
+ 0x45, 0xea, 0xfb, 0x35, 0xfb, 0x50, 0x46, 0xfb,
+ 0x1b, 0x45, 0x79, 0x1e, 0xf7, 0x17, 0x74, 0x5,
+ 0xf7, 0x9, 0xa6, 0xd3, 0x93, 0xb6, 0x1b, 0xd8,
+ 0xa1, 0x5f, 0x6b, 0x66, 0x75, 0x79, 0x35, 0x42,
+ 0x1f, 0xfb, 0x4, 0x2d, 0x61, 0x5b, 0x7c, 0x28,
+ 0x8, 0x5f, 0xfb, 0x47, 0x15, 0xf7, 0x21, 0x6,
+ 0xa9, 0xf7, 0x1b, 0x92, 0xa, 0xe, 0xf8, 0x49,
+ 0x4d, 0xda, 0xf7, 0x0, 0xda, 0xf7, 0xca, 0xda,
+ 0xed, 0xda, 0x1, 0xf7, 0x61, 0xdb, 0xe0, 0xf7,
+ 0x5, 0xf8, 0x64, 0xdb, 0x3, 0xf9, 0x25, 0xf7,
+ 0x42, 0x15, 0x79, 0x8f, 0x94, 0x6c, 0xce, 0x1b,
+ 0xf7, 0x46, 0xf7, 0x4, 0xf7, 0x37, 0xf7, 0x28,
+ 0xf7, 0x4c, 0xfb, 0x1b, 0xf7, 0x2a, 0xfb, 0x83,
+ 0xfb, 0xd4, 0xfb, 0x14, 0xfb, 0x87, 0xfb, 0x5b,
+ 0xfb, 0xa5, 0xf7, 0x7f, 0xfb, 0x9, 0xf7, 0x6c,
+ 0xf7, 0x1d, 0xf7, 0x47, 0xb4, 0xf7, 0x2e, 0xd8,
+ 0x1f, 0x2f, 0x6, 0x68, 0x6d, 0x46, 0x3a, 0xfb,
+ 0x5e, 0x1b, 0xfb, 0xb5, 0x39, 0xf7, 0x41, 0xf7,
+ 0x1e, 0xf7, 0xf, 0xca, 0xf7, 0x84, 0xf7, 0xc4,
+ 0xf7, 0x7a, 0xcc, 0xfb, 0x2b, 0x28, 0xfb, 0x1d,
+ 0xfb, 0x3, 0x30, 0x61, 0x73, 0x91, 0xa9, 0xa8,
+ 0x92, 0x1f, 0xcc, 0xf7, 0xcb, 0x5, 0xfb, 0x6,
+ 0x6, 0x80, 0x5b, 0x5, 0xc0, 0x67, 0x56, 0x90,
+ 0x6f, 0x1b, 0xfb, 0x30, 0x3b, 0xfb, 0x39, 0xfb,
+ 0xd, 0x28, 0xc8, 0x38, 0xf5, 0xd0, 0xb3, 0xb1,
+ 0x96, 0x96, 0x1f, 0xfb, 0x42, 0xf7, 0x19, 0x15,
+ 0xc8, 0xab, 0xf7, 0x26, 0xf0, 0xd2, 0x95, 0x42,
+ 0x70, 0x51, 0x6a, 0xfb, 0x2c, 0x24, 0x4f, 0x79,
+ 0xbf, 0xbe, 0x1e, 0xe, 0x68, 0xa, 0xf7, 0x33,
+ 0xf7, 0xc, 0xf8, 0x4b, 0x77, 0x1, 0x9f, 0x16,
+ 0x5e, 0xa, 0xe1, 0xf7, 0x33, 0x5, 0xf7, 0xaf,
+ 0x6, 0xa3, 0xfb, 0x33, 0x5, 0xf7, 0x1f, 0x6,
+ 0xfb, 0x8, 0xf9, 0x62, 0x43, 0xa, 0x27, 0xfc,
+ 0x4b, 0x15, 0xf7, 0x30, 0xf7, 0xb5, 0x5c, 0xa,
+ 0xb3, 0xfb, 0xb5, 0x5, 0xe, 0xe2, 0x8b, 0xf7,
+ 0xc, 0xf7, 0x50, 0xf7, 0xc, 0xf7, 0x3e, 0x8b,
+ 0xa, 0xf7, 0xef, 0x6, 0xf7, 0x27, 0xf7, 0x42,
+ 0xb5, 0xf7, 0x4c, 0xc0, 0x6c, 0xd1, 0x32, 0xa3,
+ 0x1f, 0x8d, 0x7, 0xa9, 0x93, 0xf7, 0x2, 0x9c,
+ 0xf7, 0x12, 0x1a, 0xf7, 0x23, 0x24, 0xbc, 0xfb,
+ 0x47, 0x1e, 0xfb, 0x90, 0x6, 0xa2, 0xfc, 0xea,
+ 0x15, 0xb3, 0xf7, 0x50, 0x5, 0xf7, 0x48, 0x6,
+ 0xa2, 0xe9, 0x8b, 0x39, 0x25, 0x24, 0x87, 0x32,
+ 0x1f, 0x3c, 0xf7, 0xc8, 0x15, 0xaf, 0xf7, 0x3e,
+ 0x5, 0xf7, 0x9, 0x6, 0xd5, 0xcf, 0x8b, 0x43,
+ 0x2d, 0x2b, 0x87, 0x37, 0x1f, 0xe, 0xe2, 0x78,
+ 0xf7, 0x12, 0xf8, 0x8c, 0xf7, 0x12, 0x1, 0xf6,
+ 0xf7, 0x2c, 0x3, 0xf8, 0xe6, 0xf7, 0x95, 0x15,
+ 0xfb, 0xb, 0x64, 0x34, 0x6c, 0x51, 0x1b, 0x27,
+ 0x58, 0xe3, 0xef, 0xf7, 0xa, 0x80, 0xa, 0x69,
+ 0x92, 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3d,
+ 0x77, 0xfb, 0x16, 0xcd, 0xfb, 0x1c, 0x1b, 0xfb,
+ 0x7f, 0xfb, 0x35, 0xfb, 0x54, 0xfb, 0x8e, 0xfb,
+ 0x31, 0xce, 0xfb, 0x31, 0xf7, 0x75, 0xf7, 0x62,
+ 0xf0, 0xf7, 0x1b, 0xf7, 0x9, 0xb6, 0x1f, 0xe,
+ 0x57, 0xa, 0xd7, 0x16, 0xf7, 0x98, 0x6, 0xf7,
+ 0x7c, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0xa7, 0xf7,
+ 0x71, 0xfb, 0x3, 0xd9, 0xfb, 0x81, 0x1f, 0xfb,
+ 0x58, 0x6, 0xa0, 0xfc, 0xec, 0x15, 0xf3, 0xf8,
+ 0x76, 0x5, 0xe1, 0x6, 0xd8, 0xf4, 0x86, 0xfb,
+ 0x44, 0xfb, 0x8a, 0xfb, 0x38, 0x54, 0xfb, 0x17,
+ 0x1f, 0xe, 0xab, 0x8b, 0xf7, 0xc, 0xf7, 0x56,
+ 0xf7, 0xc, 0xf7, 0x38, 0x8b, 0xa, 0xf8, 0xc4,
+ 0x6, 0xa5, 0x83, 0xa, 0xfc, 0x31, 0x6, 0xb3,
+ 0xf7, 0x56, 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfb,
+ 0xfe, 0x6, 0xad, 0xf7, 0x38, 0x5, 0xf8, 0x14,
+ 0x40, 0xa, 0xfc, 0xa7, 0x6, 0xe, 0x84, 0xa,
+ 0xf7, 0xc5, 0xf7, 0xc, 0xf7, 0x41, 0x8b, 0xa,
+ 0x5e, 0xa, 0xcc, 0xf7, 0xc5, 0x5, 0xf7, 0xeb,
+ 0x40, 0xa, 0xfb, 0xea, 0x6, 0xaf, 0xf7, 0x41,
+ 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfc, 0x93, 0x6,
+ 0xe, 0x8c, 0xa, 0xf7, 0x2e, 0xf7, 0xf, 0xf7,
+ 0x77, 0xf7, 0x12, 0x1, 0xf7, 0x0, 0xf7, 0x25,
+ 0x3, 0xf8, 0x4c, 0xf7, 0x99, 0x15, 0xf7, 0x4e,
+ 0x6, 0x74, 0xfb, 0x0, 0x5, 0x81, 0x78, 0x3d,
+ 0x67, 0x32, 0x1b, 0x4d, 0x25, 0x98, 0xf7, 0x3b,
+ 0xf7, 0x28, 0xd1, 0xf7, 0x44, 0xf7, 0x55, 0xd3,
+ 0xc9, 0x6d, 0x2f, 0xa7, 0x1f, 0xf7, 0x1f, 0x9a,
+ 0x5, 0xf7, 0x3a, 0x71, 0xfb, 0x15, 0xce, 0xfb,
+ 0x28, 0x1b, 0xfb, 0xb2, 0xfb, 0xc, 0xfb, 0x97,
+ 0xfb, 0x55, 0xfb, 0x49, 0xee, 0xfb, 0xf, 0xf7,
+ 0x63, 0xf7, 0x26, 0xf7, 0x9, 0xc4, 0xab, 0xbb,
+ 0x1f, 0xcd, 0xf7, 0xce, 0x5, 0xfb, 0xda, 0x6,
+ 0xe, 0x68, 0xa, 0xf7, 0xd4, 0xf7, 0xd, 0xf7,
+ 0xa9, 0x77, 0x1, 0xd2, 0x16, 0x5e, 0xa, 0xcf,
+ 0xf7, 0xd4, 0x5, 0xf7, 0xad, 0x6, 0x47, 0xfb,
+ 0xd4, 0x5, 0x5e, 0xa, 0xf7, 0x2c, 0xf9, 0x62,
+ 0x53, 0xa, 0x50, 0xfb, 0xa9, 0x5, 0xfb, 0xad,
+ 0x6, 0xc5, 0xf7, 0xa9, 0x5a, 0xa, 0xe, 0xfb,
+ 0xf9, 0x37, 0xa, 0xcb, 0x16, 0x5e, 0xa, 0xf7,
+ 0x2d, 0xf9, 0x62, 0x5, 0x97, 0xa, 0xe, 0x3c,
+ 0x79, 0xf7, 0x11, 0xf8, 0xf7, 0x77, 0x1, 0xc7,
+ 0xf7, 0x5b, 0x15, 0xfb, 0x20, 0xbb, 0x3e, 0xf7,
+ 0x32, 0xf7, 0x5b, 0xb7, 0xf7, 0xd, 0xf7, 0x45,
+ 0xb0, 0x1e, 0xe6, 0xf8, 0x4a, 0x7b, 0xa, 0x30,
+ 0xfc, 0x4a, 0x85, 0xa, 0x6f, 0x6a, 0x66, 0x4c,
+ 0x1b, 0x2f, 0x98, 0xcf, 0xb1, 0x8d, 0x1f, 0xe,
+ 0xe2, 0x37, 0xa, 0xe2, 0x16, 0x5e, 0xa, 0xb9,
+ 0xf7, 0x70, 0xf7, 0x20, 0xf7, 0xe, 0xf7, 0x48,
+ 0xfb, 0xea, 0x5, 0xf7, 0x3d, 0x6, 0xfb, 0x83,
+ 0xf8, 0x49, 0xf7, 0xd9, 0xf7, 0xad, 0x5, 0xfb,
+ 0x5c, 0x6, 0xfb, 0xe1, 0xfb, 0xc4, 0x89, 0x8d,
+ 0xcb, 0xf7, 0xc2, 0x53, 0xa, 0xe, 0x87, 0xa,
+ 0xd7, 0x16, 0xf8, 0x92, 0x50, 0xa, 0xfb, 0xff,
+ 0x6, 0xf7, 0x10, 0xf8, 0xe9, 0x7b, 0xa, 0xe,
+ 0xf7, 0x5a, 0x37, 0xa, 0xf7, 0xe1, 0xf7, 0x3,
+ 0x3, 0xd0, 0x16, 0x82, 0xa, 0xf7, 0x6, 0xf8,
+ 0xec, 0x5c, 0xa, 0xa6, 0xfc, 0xec, 0x5, 0xf7,
+ 0x20, 0x6, 0xf7, 0xb0, 0xf8, 0xe7, 0x8d, 0x89,
+ 0xfb, 0x23, 0xfc, 0xe5, 0x5, 0xf7, 0x1c, 0x6,
+ 0xf7, 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x6b, 0x6,
+ 0xfb, 0x8a, 0xfc, 0x8b, 0x51, 0xa, 0x76, 0xf8,
+ 0x8b, 0x5, 0xfb, 0x69, 0x6, 0xe, 0xe2, 0x37,
+ 0xa, 0xd0, 0xf9, 0x76, 0x3, 0x8a, 0xa, 0xf2,
+ 0xf8, 0x77, 0x5c, 0xa, 0xf7, 0x59, 0xfc, 0x77,
+ 0x5, 0x9b, 0xa, 0xf7, 0x2d, 0xf9, 0x62, 0x3d,
+ 0xa, 0x25, 0xfc, 0x74, 0x51, 0xa, 0xfb, 0x5a,
+ 0xf8, 0x74, 0x65, 0xa, 0x8c, 0xa, 0xf8, 0x8c,
+ 0xf7, 0x12, 0x1, 0xf7, 0x17, 0xf7, 0x2a, 0xf8,
+ 0xf, 0xf7, 0x2a, 0x3, 0xf6, 0xf7, 0xb1, 0x15,
+ 0xfb, 0x22, 0xe3, 0xfb, 0x36, 0xf7, 0x69, 0xf7,
+ 0xb1, 0xf7, 0x16, 0xf7, 0x93, 0xf7, 0x55, 0xf7,
+ 0x48, 0xfb, 0x6, 0xf7, 0x14, 0xfb, 0x53, 0xfb,
+ 0xc9, 0x25, 0xfb, 0xaf, 0xfb, 0x3d, 0x1e, 0xf7,
+ 0x2a, 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x37, 0xf7,
+ 0x29, 0xf7, 0x3, 0xc2, 0x33, 0x2b, 0xfb, 0x9,
+ 0x3b, 0xfb, 0x5f, 0xfb, 0x3c, 0x2a, 0x44, 0xd5,
+ 0xf3, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf7, 0xa6,
+ 0xf7, 0xc, 0xf7, 0x60, 0x8b, 0xa, 0xf7, 0x27,
+ 0x6, 0xc4, 0xf7, 0xa6, 0x5, 0xea, 0x6, 0xf7,
+ 0x51, 0xf7, 0x42, 0xba, 0xf7, 0x60, 0xf7, 0x49,
+ 0xfb, 0x3c, 0x97, 0x57, 0x1f, 0xfb, 0xb9, 0x6,
+ 0xdb, 0xfb, 0xd8, 0x15, 0xb6, 0xf7, 0x60, 0x5,
+ 0xf6, 0x6, 0xd6, 0xc9, 0x8d, 0x40, 0xfb, 0xb,
+ 0xfb, 0x19, 0x7f, 0xfb, 0x1, 0x1f, 0xe, 0xf7,
+ 0x23, 0x6c, 0x76, 0xdb, 0xf7, 0xa, 0xf8, 0x6d,
+ 0xf7, 0xa, 0x36, 0xa, 0xf8, 0xc4, 0xc0, 0x15,
+ 0xa4, 0x6b, 0xb3, 0x5e, 0xca, 0x6f, 0xd3, 0xe3,
+ 0x18, 0x67, 0x9e, 0x67, 0xa5, 0x6d, 0xa6, 0x8,
+ 0xf7, 0x4, 0xe1, 0xc0, 0xf7, 0x1b, 0xf7, 0xb,
+ 0x1a, 0xf7, 0x3f, 0xfb, 0x7, 0xf7, 0xa, 0xfb,
+ 0x50, 0xfb, 0xd0, 0x2a, 0xfb, 0xa8, 0xfb, 0x29,
+ 0xfb, 0x1f, 0xe6, 0xfb, 0x25, 0xf7, 0x66, 0xc1,
+ 0xba, 0x92, 0x9d, 0xbe, 0x1e, 0xfb, 0x35, 0xf7,
+ 0x35, 0x15, 0xb8, 0x7b, 0xb0, 0x67, 0x85, 0x1a,
+ 0x81, 0x5a, 0x8b, 0x86, 0x32, 0x3a, 0xbd, 0xf7,
+ 0x8, 0xf7, 0x15, 0xe6, 0xf7, 0x46, 0xf7, 0x33,
+ 0xf7, 0x2, 0xc3, 0x3d, 0x2e, 0x5a, 0x75, 0xfb,
+ 0x9, 0x3c, 0x3f, 0x1e, 0x62, 0xb8, 0x65, 0xa3,
+ 0x65, 0x9d, 0x8, 0xe, 0x68, 0xa, 0xf7, 0xbb,
+ 0xf7, 0x4, 0xf7, 0x53, 0x96, 0xa, 0xf9, 0x25,
+ 0xf7, 0x27, 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6,
+ 0xca, 0xf7, 0xbb, 0x5, 0xc7, 0x6, 0xb7, 0xa8,
+ 0x8b, 0x5d, 0xab, 0x1f, 0xb5, 0x50, 0xce, 0xfb,
+ 0x50, 0x89, 0x1a, 0xf7, 0x34, 0x6, 0x60, 0xf7,
+ 0x1, 0x51, 0xf7, 0x1f, 0x4b, 0xc4, 0x8, 0xf7,
+ 0x0, 0x9a, 0xf7, 0x5, 0xbe, 0xf7, 0x32, 0x1a,
+ 0xf7, 0x51, 0xfb, 0x36, 0x8b, 0x47, 0x1e, 0xfb,
+ 0xd5, 0x6, 0xde, 0xfb, 0xcb, 0x15, 0xb3, 0xf7,
+ 0x53, 0x5, 0xf7, 0x38, 0x6, 0xbc, 0xcf, 0x8b,
+ 0x44, 0xfb, 0x4, 0xfb, 0x1c, 0x83, 0x21, 0x1f,
+ 0xe, 0xab, 0x78, 0xf7, 0x12, 0xf8, 0x92, 0x96,
+ 0xa, 0xdc, 0xf7, 0x7a, 0x15, 0xfb, 0x53, 0xf7,
+ 0x28, 0x51, 0xf7, 0x24, 0xf7, 0x67, 0xdf, 0xf7,
+ 0x0, 0xf7, 0x0, 0xf7, 0x10, 0x34, 0xc3, 0xfb,
+ 0x14, 0xc2, 0x1e, 0x35, 0xae, 0x59, 0x8e, 0xbf,
+ 0x1a, 0xd8, 0xe7, 0x9d, 0xa5, 0xd1, 0xcd, 0x70,
+ 0x3a, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x2d,
+ 0xfb, 0x1f, 0xcf, 0xfb, 0x23, 0xfb, 0x65, 0x53,
+ 0xfb, 0x13, 0x33, 0xfb, 0x12, 0xe5, 0x64, 0xf7,
+ 0x15, 0x54, 0x1e, 0xdc, 0x68, 0xb8, 0x79, 0x57,
+ 0x1a, 0x3e, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88,
+ 0xce, 0xca, 0x89, 0x1e, 0xe, 0x84, 0xa, 0xf8,
+ 0xe9, 0xf7, 0xd, 0x1, 0xf7, 0x77, 0x16, 0xf7,
+ 0x2d, 0x6, 0xf7, 0x15, 0xf8, 0xe9, 0x5, 0xf7,
+ 0x6c, 0x6, 0xa5, 0xf7, 0xd, 0x5, 0xfc, 0xdd,
+ 0x6, 0x71, 0xfb, 0xd, 0x5, 0xf7, 0x6c, 0x6,
+ 0xe, 0xe2, 0x78, 0xf7, 0x11, 0xf8, 0xf8, 0x77,
+ 0x1, 0xf7, 0x8, 0xf7, 0x2b, 0x3, 0xf7, 0x66,
+ 0xf9, 0x62, 0x15, 0x39, 0xfc, 0x20, 0x5, 0x84,
+ 0x67, 0x86, 0x67, 0x65, 0x1a, 0xfb, 0xd, 0x8c,
+ 0xc1, 0xfb, 0x2, 0xf7, 0x5f, 0x1b, 0xf7, 0xa5,
+ 0xb6, 0xf7, 0x60, 0xf7, 0x1d, 0xa8, 0x1f, 0xe0,
+ 0xf8, 0x20, 0x5, 0xfb, 0x2c, 0x6, 0x36, 0xfc,
+ 0x20, 0x5, 0xfb, 0x11, 0x71, 0x49, 0x30, 0x2d,
+ 0x1b, 0x36, 0x6e, 0xba, 0xc8, 0xb0, 0x8f, 0xb1,
+ 0x92, 0xac, 0x1f, 0xdf, 0xf8, 0x20, 0x5, 0xe,
+ 0xab, 0x37, 0xa, 0xf7, 0xb6, 0x16, 0xf7, 0x26,
+ 0x6, 0xf8, 0x1, 0xf9, 0x62, 0x91, 0xa, 0xfb,
+ 0xa6, 0xfc, 0xb3, 0x51, 0xa, 0x39, 0xf8, 0xb3,
+ 0x5b, 0xa, 0xe, 0xf7, 0xc9, 0x37, 0xa, 0xf7,
+ 0x4a, 0xf7, 0x14, 0xf7, 0xb5, 0xf7, 0x3, 0x3,
+ 0xf7, 0x57, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x8d,
+ 0xf8, 0xa0, 0x5c, 0xa, 0x9a, 0xfc, 0xa0, 0x8d,
+ 0xa, 0xf7, 0xe0, 0xf9, 0x62, 0x5, 0xfb, 0x1d,
+ 0x6, 0xfb, 0x75, 0xfc, 0x85, 0x51, 0xa, 0x7c,
+ 0xf8, 0x85, 0x5, 0xfb, 0x2e, 0x6, 0xfb, 0x7e,
+ 0xfc, 0x8a, 0x51, 0xa, 0x85, 0xf8, 0x8a, 0x81,
+ 0xa, 0xab, 0x37, 0xa, 0x99, 0x16, 0xf7, 0x49,
+ 0x6, 0xf7, 0x50, 0xf7, 0x7b, 0xf3, 0xfb, 0x7b,
+ 0x5, 0xf7, 0x33, 0x6, 0xfb, 0x3b, 0xf7, 0xe8,
+ 0xf7, 0xcc, 0xf8, 0xe, 0x5, 0xfb, 0x45, 0x6,
+ 0xfb, 0x5f, 0xfb, 0x8b, 0xfb, 0xa, 0xf7, 0x8b,
+ 0x7b, 0xa, 0xf7, 0x3e, 0xfb, 0xf6, 0x5, 0xe,
+ 0xab, 0x37, 0xa, 0xf7, 0x3c, 0xf9, 0x12, 0x3,
+ 0x64, 0xa, 0xf7, 0x9e, 0xf7, 0xcc, 0xf8, 0x58,
+ 0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xc7, 0xfb, 0x10,
+ 0xf7, 0xc7, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x4a,
+ 0x5, 0xe, 0x84, 0xa, 0xf8, 0xe9, 0xf7, 0xd,
+ 0x1, 0xa4, 0x16, 0xf8, 0xfb, 0x6, 0xa6, 0xf7,
+ 0x9, 0x5, 0x8a, 0xfc, 0x33, 0x8c, 0x8b, 0x1e,
+ 0xf8, 0x62, 0xf8, 0x7d, 0xa2, 0xf7, 0x4, 0x5,
+ 0xfc, 0xcf, 0x6, 0x6f, 0xfb, 0xd, 0x5, 0xf8,
+ 0x5, 0x6, 0xfc, 0x5b, 0xfc, 0x78, 0x5, 0xe,
+ 0x7f, 0xa, 0xf7, 0x48, 0x35, 0x15, 0xf7, 0x29,
+ 0xf9, 0x4e, 0x5, 0xf7, 0x1, 0x6, 0xa3, 0xf7,
+ 0x2, 0x5, 0xfb, 0x89, 0x6, 0xfb, 0x58, 0xfe,
+ 0x2a, 0x5, 0xf7, 0x89, 0x6, 0xa3, 0xf7, 0x2,
+ 0x5, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0xf7, 0x10,
+ 0xf7, 0x87, 0x3, 0xf7, 0x85, 0x78, 0x15, 0xf7,
+ 0x12, 0x6, 0xfb, 0x7, 0xf9, 0x88, 0x5, 0xfb,
+ 0x14, 0x6, 0xe, 0x7f, 0xa, 0x91, 0x35, 0x15,
+ 0x73, 0xfb, 0x2, 0x5, 0xf7, 0x89, 0x6, 0xf7,
+ 0x58, 0xfa, 0x2a, 0x5, 0xfb, 0x89, 0x6, 0x73,
+ 0xfb, 0x2, 0x5, 0xf7, 0x2, 0x6, 0xfb, 0x29,
+ 0xfd, 0x4e, 0x5, 0xe, 0x58, 0xf7, 0xec, 0x76,
+ 0xf8, 0xb, 0x77, 0x1, 0xf7, 0x17, 0xf7, 0xd7,
+ 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, 0xea,
+ 0xfb, 0x79, 0x5, 0x82, 0xa, 0xfb, 0x42, 0xf8,
+ 0xb, 0x5, 0x20, 0x6, 0xe, 0x3c, 0xfb, 0x11,
+ 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+ 0xbd, 0x7, 0xe, 0x72, 0xa, 0xf7, 0x8c, 0xf8,
+ 0xf0, 0x15, 0xf4, 0x6, 0x47, 0xf7, 0x26, 0x53,
+ 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf2, 0x76,
+ 0xa, 0xf8, 0x1a, 0x89, 0x2f, 0xa, 0x13, 0xb0,
+ 0x99, 0xa, 0xaa, 0xb2, 0x1a, 0xab, 0x7c, 0xf7,
+ 0x3, 0x33, 0xa, 0x80, 0x5, 0xb8, 0x98, 0xb1,
+ 0x9b, 0xb8, 0x1b, 0xce, 0xa8, 0x5a, 0x55, 0x70,
+ 0x1f, 0x6c, 0x80, 0x54, 0x86, 0x50, 0x86, 0x8,
+ 0x42, 0x86, 0xfb, 0x2f, 0x81, 0xfb, 0x34, 0x1a,
+ 0x28, 0xd6, 0x50, 0xe1, 0x1e, 0x30, 0xa, 0x99,
+ 0xf7, 0x8a, 0x15, 0x60, 0x81, 0x77, 0x20, 0x20,
+ 0x1b, 0x5a, 0x77, 0xa1, 0xa7, 0xca, 0xdc, 0xa2,
+ 0xe7, 0x97, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x41,
+ 0x76, 0xf8, 0x45, 0xf0, 0xf7, 0x4e, 0x77, 0x12,
+ 0xf7, 0x67, 0xf7, 0x18, 0xf7, 0x36, 0xf7, 0x20,
+ 0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x18, 0x6,
+ 0x9d, 0xe1, 0x5c, 0xa, 0x13, 0xb4, 0x73, 0x96,
+ 0xb4, 0x41, 0xf7, 0x7, 0x1b, 0xf7, 0x25, 0xf7,
+ 0xc, 0xf7, 0x23, 0xf7, 0x4f, 0xf7, 0x5, 0x57,
+ 0xf2, 0xfb, 0x1b, 0x42, 0x5f, 0x6c, 0x73, 0x6b,
+ 0x1f, 0xbe, 0xf7, 0x85, 0x44, 0xa, 0x13, 0x74,
+ 0xb3, 0xfc, 0x90, 0x15, 0xf7, 0x3, 0xc4, 0xf7,
+ 0x2, 0xe6, 0xc1, 0xba, 0x60, 0x3f, 0x1e, 0x13,
+ 0xb4, 0x38, 0x5e, 0xfb, 0x1c, 0x25, 0x4c, 0x64,
+ 0xc5, 0xc6, 0x1e, 0xe, 0x3c, 0x7d, 0xf7, 0x5,
+ 0xf7, 0xe8, 0xf6, 0x1, 0xda, 0xf7, 0x23, 0x3,
+ 0xf8, 0x38, 0xf7, 0x5b, 0x15, 0x36, 0x6d, 0x4f,
+ 0x7c, 0x70, 0x1b, 0x63, 0x62, 0xb2, 0xd0, 0xe0,
+ 0xb3, 0xf7, 0x27, 0xf7, 0x5, 0xd7, 0x93, 0x48,
+ 0x77, 0x8d, 0x1f, 0xf7, 0x1e, 0x9a, 0x5, 0xe3,
+ 0x83, 0x4d, 0xe6, 0xfb, 0x25, 0x1b, 0xfb, 0x4b,
+ 0xfb, 0xe, 0xfb, 0x2f, 0xfb, 0x4c, 0xfb, 0x4,
+ 0xc6, 0xfb, 0x1, 0xf7, 0x36, 0xf7, 0x16, 0xe3,
+ 0xd6, 0xf7, 0x8, 0xb6, 0x1f, 0xe, 0x73, 0x7d,
+ 0xf6, 0x2c, 0xea, 0xf7, 0xde, 0xf7, 0x1, 0xf7,
+ 0x4e, 0x77, 0x12, 0x13, 0x70, 0xf8, 0x38, 0x89,
+ 0x15, 0xf7, 0x17, 0x6, 0xf7, 0x2d, 0xf9, 0x64,
+ 0x47, 0xa, 0x52, 0xfb, 0xa1, 0x5, 0x9e, 0x7e,
+ 0x62, 0xcb, 0x20, 0x1b, 0xfb, 0x32, 0x24, 0xfb,
+ 0x34, 0xfb, 0x3c, 0x1f, 0x13, 0xb0, 0xfb, 0x20,
+ 0xd1, 0x3d, 0xf7, 0x6, 0xe1, 0xbe, 0xb3, 0xa7,
+ 0xa6, 0x1e, 0x8d, 0x89, 0x5, 0x13, 0x70, 0xfb,
+ 0x67, 0xf7, 0x2c, 0x15, 0xe7, 0xbe, 0xf7, 0x13,
+ 0xe7, 0xc8, 0xb4, 0x54, 0x49, 0x3f, 0x62, 0xfb,
+ 0x19, 0x22, 0x4b, 0x68, 0xba, 0xcb, 0x1e, 0xe,
+ 0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0x1a, 0xf2, 0x7d,
+ 0xa, 0xf7, 0x68, 0xf7, 0x71, 0x15, 0xf8, 0x8,
+ 0x6, 0x93, 0xae, 0x8c, 0xb8, 0x99, 0x1a, 0xf0,
+ 0x5e, 0xf7, 0x16, 0xfb, 0x41, 0xfb, 0x6d, 0x33,
+ 0xfb, 0x53, 0xfb, 0x1a, 0xfb, 0x24, 0xeb, 0x30,
+ 0xf7, 0x2c, 0xd7, 0xf7, 0x0, 0xa6, 0xf7, 0x15,
+ 0xcc, 0x1e, 0xfb, 0x19, 0xa0, 0x5, 0x7b, 0x82,
+ 0x6b, 0x51, 0x41, 0x1b, 0x4e, 0x59, 0xbc, 0xde,
+ 0x8f, 0x1f, 0x9a, 0xe3, 0x15, 0xbd, 0x96, 0xaf,
+ 0xdf, 0xe0, 0x1b, 0xd8, 0xa5, 0x4c, 0x44, 0x88,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x33, 0xf1, 0xf7,
+ 0x66, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x15, 0x6,
+ 0xda, 0xf8, 0x33, 0x5, 0xe6, 0x6, 0x9f, 0xf1,
+ 0x5, 0x30, 0x6, 0xda, 0x99, 0x91, 0xa4, 0xae,
+ 0x1b, 0x98, 0xa6, 0x86, 0x7e, 0xad, 0x1f, 0xa4,
+ 0xf0, 0x5, 0x9c, 0x5a, 0x5e, 0x91, 0x6d, 0x1b,
+ 0xfb, 0xa, 0x80, 0x28, 0xfb, 0x3, 0x6d, 0x1f,
+ 0x44, 0x6, 0x76, 0x25, 0x5, 0xd4, 0x6, 0xe,
+ 0x73, 0xfb, 0x6d, 0xf2, 0xf7, 0x3, 0xf6, 0xf7,
+ 0xe7, 0xf2, 0x7e, 0x77, 0x12, 0x13, 0xd0, 0xb1,
+ 0x6e, 0x15, 0xfb, 0x46, 0xf7, 0x40, 0x81, 0xca,
+ 0xf7, 0x7b, 0xa3, 0xf6, 0xf7, 0x5a, 0xb5, 0x1e,
+ 0xeb, 0xf8, 0x51, 0x3d, 0xa, 0x78, 0x2d, 0x51,
+ 0xa, 0x13, 0xe0, 0xd3, 0x68, 0x48, 0xae, 0x46,
+ 0x1b, 0xfb, 0x1d, 0xfb, 0x14, 0x20, 0xfb, 0x65,
+ 0xfb, 0x3d, 0xf2, 0x4b, 0xdd, 0xde, 0xc2, 0xb7,
+ 0x9e, 0x9f, 0x1f, 0x8d, 0x89, 0x5, 0xfb, 0x8,
+ 0x74, 0x80, 0x53, 0x24, 0x1b, 0x44, 0x80, 0xae,
+ 0xa7, 0x8d, 0x1f, 0x9d, 0xf7, 0xac, 0x15, 0xc5,
+ 0xb3, 0xf7, 0x30, 0xf4, 0xcb, 0xb4, 0x4d, 0x4a,
+ 0x2b, 0x53, 0xfb, 0x8, 0x2c, 0x51, 0x62, 0xb9,
+ 0xda, 0x1e, 0xe, 0x84, 0xa, 0xf8, 0x44, 0xef,
+ 0xf7, 0x4e, 0x77, 0x1, 0xf8, 0x76, 0xf7, 0x27,
+ 0x3, 0xcc, 0x16, 0x7c, 0xa, 0xb7, 0xf7, 0x62,
+ 0x5, 0xf4, 0xa2, 0xb2, 0xf7, 0xd, 0xf6, 0x1b,
+ 0xba, 0x98, 0x6f, 0x69, 0x76, 0x87, 0x74, 0x86,
+ 0x75, 0x1f, 0x49, 0xfb, 0xc4, 0x5, 0x7c, 0xa,
+ 0xcc, 0xf7, 0xc4, 0x5, 0x91, 0xa7, 0x92, 0xaf,
+ 0xae, 0x1a, 0xcd, 0x6f, 0xca, 0xfb, 0x3, 0x30,
+ 0x51, 0x5d, 0x73, 0x6b, 0x1e, 0xc1, 0xf7, 0x94,
+ 0x44, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xa1, 0x77,
+ 0xe7, 0xf7, 0x14, 0x1, 0xd0, 0x16, 0x9b, 0xa,
+ 0xf7, 0x1, 0xf8, 0xa1, 0x92, 0xa, 0x9b, 0xd3,
+ 0x15, 0x9b, 0xa, 0xa6, 0xf7, 0x14, 0x92, 0xa,
+ 0xe, 0xfb, 0xf9, 0xfb, 0x55, 0x76, 0x1, 0x75,
+ 0x3a, 0x15, 0x77, 0xfb, 0xa, 0x5, 0x7c, 0xb6,
+ 0xb8, 0x8b, 0x94, 0x1b, 0xf7, 0xe, 0xb1, 0xf7,
+ 0x31, 0xf7, 0x1d, 0xa5, 0x1f, 0xdf, 0xf8, 0x51,
+ 0x5, 0xfb, 0x16, 0x6, 0x3a, 0xfc, 0x51, 0x5,
+ 0xfb, 0x30, 0x6c, 0x7e, 0x7e, 0x63, 0x1b, 0x80,
+ 0x7a, 0x8c, 0x92, 0x73, 0x1f, 0xf7, 0x7b, 0xf9,
+ 0x3a, 0x15, 0xf7, 0x16, 0x6, 0xa3, 0xf7, 0x14,
+ 0x5, 0xfb, 0x16, 0x6, 0xe, 0x3c, 0x37, 0xa,
+ 0xd0, 0x16, 0xf7, 0x26, 0x6, 0xae, 0xf7, 0x31,
+ 0xed, 0xdf, 0xd6, 0xfb, 0x85, 0x5, 0xf7, 0x26,
+ 0x6, 0xfb, 0x8, 0xf7, 0xdf, 0xf7, 0x6d, 0xf7,
+ 0x51, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0x50, 0xfb,
+ 0x44, 0x89, 0x8d, 0xdd, 0xf8, 0x8, 0x93, 0xa,
+ 0xe, 0xfb, 0xf9, 0x37, 0xa, 0x8a, 0xa, 0xf7,
+ 0x2c, 0xf9, 0x62, 0x65, 0xa, 0xf7, 0x92, 0xa0,
+ 0x76, 0xf8, 0x4f, 0xf2, 0x1, 0xcb, 0x16, 0xf7,
+ 0x23, 0x6, 0xbe, 0xf7, 0x89, 0x5, 0xdf, 0x9d,
+ 0xa1, 0xf7, 0x6, 0xf2, 0x1b, 0xb5, 0x96, 0x75,
+ 0x6e, 0x78, 0x87, 0x75, 0x87, 0x77, 0x1f, 0x45,
+ 0xfb, 0xdf, 0x5, 0x7c, 0xa, 0xbe, 0xf7, 0x86,
+ 0x5, 0xd2, 0x98, 0xaf, 0xf7, 0x16, 0xed, 0x1b,
+ 0xae, 0x94, 0x68, 0x68, 0x7a, 0x89, 0x7a, 0x88,
+ 0x7e, 0x1f, 0x47, 0xfb, 0xda, 0x8d, 0xa, 0xd0,
+ 0xf7, 0xda, 0x5, 0x8f, 0xa5, 0x8f, 0xa6, 0xa5,
+ 0x1a, 0xd5, 0x72, 0xce, 0x23, 0x3a, 0x44, 0x5e,
+ 0x59, 0x6a, 0x1e, 0xe1, 0x7b, 0x40, 0x94, 0x60,
+ 0x1b, 0x38, 0x61, 0x77, 0x54, 0x63, 0x1f, 0x99,
+ 0xc9, 0x91, 0xa, 0xe, 0x84, 0xa, 0xf8, 0x4f,
+ 0xe5, 0x31, 0xf2, 0x12, 0x13, 0xa0, 0xcc, 0x16,
+ 0x7c, 0xa, 0xba, 0xf7, 0x6f, 0x5, 0xf3, 0xa1,
+ 0xa7, 0xf7, 0xc, 0xf7, 0x9, 0x1b, 0xb7, 0x9b,
+ 0x6a, 0x76, 0x6d, 0x84, 0x6d, 0x86, 0x71, 0x1f,
+ 0x4b, 0xfb, 0xc3, 0x5, 0xf7, 0x25, 0x6, 0xcb,
+ 0xf7, 0xc2, 0x5, 0x92, 0xad, 0x91, 0xb3, 0xb0,
+ 0x1a, 0xd2, 0x6c, 0xc9, 0xfb, 0x0, 0x34, 0x4f,
+ 0x5f, 0x65, 0x61, 0x1e, 0x89, 0x8d, 0x5, 0x13,
+ 0xc0, 0x99, 0xce, 0x5b, 0xa, 0xe, 0x73, 0x7d,
+ 0xf7, 0x2, 0xf7, 0xe8, 0xf7, 0x2, 0x3f, 0xa,
+ 0xdd, 0xf7, 0x71, 0x15, 0xfb, 0x11, 0xde, 0xfb,
+ 0x2, 0x38, 0xa, 0xf7, 0x37, 0x26, 0xa, 0xe,
+ 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf7, 0x4,
+ 0xf7, 0xe8, 0xeb, 0x2b, 0xf7, 0x1, 0x12, 0xf8,
+ 0x8d, 0xf7, 0x20, 0x13, 0xd8, 0x9d, 0xfb, 0x63,
+ 0x15, 0x7c, 0xa, 0xc5, 0xf7, 0xaa, 0x5, 0x77,
+ 0x98, 0xb4, 0x49, 0xf6, 0x1b, 0xf7, 0x34, 0xf3,
+ 0xf7, 0x32, 0xf7, 0x41, 0xf7, 0x23, 0x44, 0xe2,
+ 0xfb, 0x6, 0x34, 0x58, 0x62, 0x6e, 0x6f, 0x1f,
+ 0x89, 0x8d, 0x5, 0x13, 0xe8, 0x96, 0xc2, 0x5,
+ 0xfb, 0x18, 0x6, 0xe2, 0xfb, 0xcb, 0x15, 0xd8,
+ 0xb4, 0xf7, 0x1e, 0xf5, 0xcc, 0xae, 0x54, 0x49,
+ 0x2d, 0x58, 0xfb, 0x11, 0x2e, 0x4d, 0x62, 0xc3,
+ 0xd0, 0x1e, 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x54, 0xf2, 0xf7, 0xf1, 0xf7, 0x1, 0x7e, 0x77,
+ 0x12, 0xdb, 0xf7, 0x21, 0x13, 0xd8, 0xf8, 0x2,
+ 0xfb, 0x63, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x2e,
+ 0xf9, 0x78, 0x66, 0xa, 0x79, 0x34, 0x51, 0xa,
+ 0x13, 0xe8, 0xa3, 0x7f, 0x62, 0xd7, 0xfb, 0x7,
+ 0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x27, 0xfb,
+ 0x54, 0xfb, 0x9, 0xbf, 0x22, 0xf7, 0x1b, 0xd5,
+ 0xb7, 0xab, 0xa4, 0xac, 0x1f, 0xfb, 0x59, 0xf7,
+ 0x39, 0x15, 0xe0, 0xb7, 0xf7, 0x25, 0xf2, 0xca,
+ 0xb2, 0x4f, 0x4e, 0xfb, 0x6, 0x52, 0xfb, 0x6,
+ 0x30, 0x54, 0x5d, 0xb4, 0xd9, 0x1e, 0xe, 0xfb,
+ 0x8a, 0xa0, 0x76, 0xf8, 0x30, 0xf7, 0xd, 0xfb,
+ 0xd, 0xf7, 0x1a, 0x12, 0xd7, 0xf8, 0x3d, 0x13,
+ 0xb0, 0xcb, 0x16, 0x82, 0xa, 0xab, 0xf7, 0x3c,
+ 0xa6, 0xf7, 0x17, 0xa2, 0xf7, 0x13, 0xf7, 0x30,
+ 0x7d, 0x19, 0xbf, 0xf7, 0xb, 0x5, 0x91, 0x7e,
+ 0x76, 0x94, 0x6e, 0x1b, 0x49, 0x59, 0x51, 0x51,
+ 0x69, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xc0, 0x9f,
+ 0xf0, 0x5, 0xfb, 0x12, 0x6, 0xe, 0x3c, 0x7d,
+ 0xef, 0xf7, 0xfc, 0xef, 0x1, 0xca, 0xf7, 0x28,
+ 0x15, 0xfb, 0x7, 0xab, 0xe5, 0x5c, 0xf7, 0x17,
+ 0x1b, 0xf7, 0x48, 0xc0, 0xf7, 0x8, 0xd3, 0xf4,
+ 0x20, 0xab, 0x3f, 0xa3, 0x1f, 0x44, 0xa0, 0x71,
+ 0x93, 0xab, 0x1a, 0xa5, 0xa3, 0xa3, 0xc4, 0x9b,
+ 0xd0, 0x8b, 0x4b, 0xa0, 0x1e, 0xf7, 0x14, 0xa3,
+ 0x5, 0xf7, 0x11, 0x70, 0xfb, 0x6, 0x9a, 0x44,
+ 0x1b, 0xfb, 0x32, 0x42, 0x46, 0x38, 0x35, 0xd7,
+ 0x4f, 0xe2, 0x6c, 0x1f, 0xe9, 0x69, 0x95, 0x85,
+ 0x6e, 0x1a, 0x67, 0x5d, 0x71, 0x5a, 0x41, 0x71,
+ 0xb3, 0xb8, 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8,
+ 0x2c, 0xee, 0xf7, 0x43, 0x77, 0x1, 0xf7, 0xda,
+ 0x85, 0x15, 0xa2, 0xf1, 0x5, 0x87, 0x25, 0x76,
+ 0x9b, 0xc7, 0x1f, 0x70, 0x6f, 0x91, 0xa8, 0x91,
+ 0x1f, 0xc5, 0xf7, 0xa8, 0x5, 0xe3, 0x6, 0xa1,
+ 0xee, 0x5, 0x33, 0x6, 0xb1, 0xf7, 0x43, 0xfb,
+ 0x37, 0x2c, 0x7a, 0x3b, 0x5, 0x45, 0x6, 0x75,
+ 0x28, 0x5, 0xd0, 0x6, 0x8b, 0x4c, 0xfb, 0xb2,
+ 0x73, 0x1a, 0x2e, 0xf7, 0x1b, 0x86, 0xe0, 0x1e,
+ 0xe, 0x59, 0xa, 0xf8, 0x4f, 0x77, 0x12, 0xed,
+ 0xf7, 0x27, 0x13, 0x70, 0xf8, 0x31, 0x89, 0x15,
+ 0xf7, 0x1a, 0x6, 0xf7, 0x3, 0xf8, 0xaa, 0x44,
+ 0xa, 0x57, 0xfb, 0x91, 0x5, 0x46, 0x72, 0x82,
+ 0xfb, 0xd, 0xfb, 0xe, 0x1b, 0x5d, 0x7c, 0xb0,
+ 0xb4, 0x9c, 0x8f, 0x9c, 0x8f, 0x9a, 0x1f, 0xcd,
+ 0xf7, 0xd0, 0x47, 0xa, 0x4a, 0xfb, 0xd0, 0x5,
+ 0x85, 0x6f, 0x84, 0x67, 0x67, 0x1a, 0x13, 0xb0,
+ 0x47, 0xa5, 0x4d, 0xf7, 0x5, 0xcf, 0xce, 0xa9,
+ 0xc1, 0xc2, 0x1e, 0x8c, 0x89, 0x5, 0xe, 0x3c,
+ 0x79, 0xa, 0xf7, 0x78, 0x16, 0xf7, 0x9, 0x6,
+ 0xf7, 0xcb, 0xf8, 0xa8, 0x7b, 0xa, 0xfb, 0x57,
+ 0xfb, 0xf8, 0x51, 0xa, 0x57, 0xf7, 0xf8, 0x5,
+ 0xfb, 0x1a, 0x6, 0xe, 0xf7, 0x23, 0x79, 0xa,
+ 0xf8, 0x79, 0xe5, 0x3, 0xf7, 0x4f, 0x16, 0xf7,
+ 0x15, 0x6, 0xf7, 0x2f, 0xf7, 0xea, 0x5c, 0xa,
+ 0xa3, 0xfb, 0xea, 0x5, 0xf7, 0x16, 0x6, 0xf7,
+ 0x93, 0xf8, 0xa8, 0x54, 0xa, 0xfb, 0x32, 0xfb,
+ 0xf7, 0x51, 0xa, 0x7a, 0xf7, 0xf7, 0x5, 0xfb,
+ 0x12, 0x6, 0xfb, 0x33, 0xfb, 0xf7, 0x51, 0xa,
+ 0x69, 0xf7, 0xf7, 0x5, 0xfb, 0xf, 0x6, 0xe,
+ 0x3c, 0x79, 0xa, 0x9a, 0x16, 0xf7, 0x3f, 0x6,
+ 0xf7, 0x16, 0xf7, 0x2b, 0xd4, 0xfb, 0x2b, 0x5,
+ 0xf7, 0x29, 0x6, 0xfb, 0x17, 0xf7, 0x97, 0xf7,
+ 0x85, 0xf7, 0xa5, 0x5, 0xfb, 0x3e, 0x6, 0xfb,
+ 0x18, 0xfb, 0x28, 0x41, 0xf7, 0x28, 0x53, 0xa,
+ 0xf7, 0x18, 0xfb, 0x96, 0x5, 0xe, 0x3c, 0xfb,
+ 0x6a, 0xf7, 0x9, 0xf9, 0x9, 0x77, 0x1, 0xc2,
+ 0x34, 0x15, 0x7e, 0xfb, 0x0, 0x5, 0x7e, 0xad,
+ 0xaa, 0x85, 0xa6, 0x1b, 0xe2, 0xc5, 0xcd, 0xf0,
+ 0xc3, 0x1f, 0xf7, 0xd1, 0xf8, 0xd7, 0x77, 0xa,
+ 0xfc, 0x27, 0x51, 0xa, 0x59, 0xf8, 0x27, 0x54,
+ 0xa, 0xe5, 0xfc, 0xa3, 0x5, 0x4c, 0x6f, 0x6c,
+ 0x64, 0x5c, 0x1b, 0x7d, 0x7b, 0x8e, 0x92, 0x79,
+ 0x1f, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0xa, 0xf7,
+ 0xc1, 0xf7, 0x5, 0x1, 0x9f, 0x16, 0xf8, 0x70,
+ 0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0xac, 0x6,
+ 0xf7, 0xd6, 0xf7, 0xdc, 0x9e, 0xe1, 0x5, 0xfc,
+ 0x5c, 0x6, 0x71, 0xfb, 0x5, 0x5, 0xf7, 0x98,
+ 0x6, 0xfb, 0xd3, 0xfb, 0xd5, 0x5, 0xe, 0x73,
+ 0xa, 0xf7, 0xb2, 0xf7, 0x7, 0x1, 0x14, 0xe0,
+ 0xe9, 0xf7, 0x61, 0x15, 0xef, 0x79, 0x3f, 0xfb,
+ 0x4, 0x74, 0x1f, 0xfb, 0x2f, 0x69, 0xb1, 0x51,
+ 0xf7, 0x1e, 0x1b, 0xa3, 0x6, 0xa3, 0xf7, 0x7,
+ 0x5, 0x49, 0x72, 0x8e, 0xcc, 0x98, 0x1f, 0xb4,
+ 0xf7, 0x4e, 0x82, 0xbd, 0x52, 0xb3, 0xd3, 0xb5,
+ 0xa8, 0xac, 0xb7, 0xf7, 0x5c, 0x8, 0xcb, 0x98,
+ 0xa0, 0x90, 0xd6, 0x1b, 0xa3, 0xf7, 0x7, 0x5,
+ 0x73, 0x6, 0xfb, 0x50, 0x77, 0x32, 0xfb, 0x23,
+ 0x6c, 0x1f, 0xfb, 0x9, 0x72, 0x7f, 0x57, 0x27,
+ 0x1b, 0xe, 0xfb, 0xf7, 0xfb, 0x50, 0x76, 0xfa,
+ 0x46, 0x77, 0x1, 0xbd, 0xfb, 0x65, 0x15, 0xf7,
+ 0x3, 0x6, 0xf7, 0x5e, 0xfa, 0x46, 0x5, 0xfb,
+ 0x3, 0x6, 0xe, 0x73, 0xa, 0xf8, 0x25, 0x77,
+ 0x1, 0x93, 0x3a, 0x15, 0x71, 0xfb, 0x7, 0x5,
+ 0xf7, 0x66, 0x9f, 0xe4, 0xf7, 0x23, 0xac, 0x1f,
+ 0xf7, 0x9, 0xa5, 0xa8, 0xbf, 0xdd, 0x1b, 0xa4,
+ 0xf7, 0x8, 0x5, 0x29, 0x9c, 0xd7, 0xf7, 0x4,
+ 0xa4, 0x1f, 0x94, 0xae, 0x8e, 0xa9, 0xa5, 0x1a,
+ 0xe3, 0x59, 0xad, 0xfb, 0x10, 0x1e, 0x71, 0xfb,
+ 0x7, 0x5, 0xc0, 0xa6, 0x89, 0x67, 0x83, 0x8a,
+ 0x82, 0x88, 0x7e, 0x1f, 0x61, 0xfb, 0x4e, 0x94,
+ 0x59, 0xc4, 0x63, 0x41, 0x61, 0x6e, 0x6a, 0x5f,
+ 0xfb, 0x5c, 0x8, 0x4b, 0x7c, 0x77, 0x86, 0x42,
+ 0x1b, 0xe, 0x58, 0xf7, 0x4d, 0x76, 0xf7, 0x47,
+ 0x77, 0x1, 0xf7, 0x7, 0xf8, 0x62, 0x3, 0xf7,
+ 0x7, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91,
+ 0xa6, 0x1b, 0xbc, 0xab, 0x7d, 0x7c, 0xa9, 0x1f,
+ 0x7b, 0xaa, 0xa9, 0x7c, 0xb4, 0x1b, 0xd0, 0xbf,
+ 0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d,
+ 0x53, 0x56, 0x89, 0x81, 0x1b, 0x69, 0x6d, 0x97,
+ 0x98, 0x6e, 0x1f, 0x9b, 0x64, 0x66, 0x9e, 0x5d,
+ 0x1b, 0x75, 0x57, 0x8b, 0x4e, 0x55, 0x1f, 0xe,
+ 0xe2, 0x8b, 0xf7, 0xc, 0xf8, 0x6f, 0xf7, 0xf,
+ 0x1, 0xf7, 0x8, 0xf7, 0x1f, 0x3, 0x9f, 0xf7,
+ 0x94, 0x15, 0xeb, 0x6, 0xfb, 0x32, 0x9a, 0xec,
+ 0x29, 0xf7, 0x4b, 0x1b, 0xbb, 0xba, 0x93, 0x9a,
+ 0xb9, 0x1f, 0xaf, 0xf7, 0x25, 0x5, 0x6b, 0x5c,
+ 0x53, 0x7b, 0x4c, 0x1b, 0x38, 0x3a, 0xca, 0xd4,
+ 0x88, 0x1f, 0xf7, 0xda, 0x6, 0x9b, 0xd4, 0x5,
+ 0xfb, 0xe7, 0x6, 0x8f, 0xaa, 0x90, 0xa1, 0x8d,
+ 0x94, 0x8, 0xf7, 0xe9, 0x6, 0x9b, 0xd4, 0x5,
+ 0xfb, 0xdf, 0x6, 0xe2, 0xb9, 0xdb, 0xb7, 0xeb,
+ 0x1b, 0xc4, 0xb5, 0x81, 0x6a, 0xa6, 0x1f, 0xc6,
+ 0x55, 0xa, 0xa8, 0x5a, 0x4e, 0x9a, 0x43, 0x1b,
+ 0xfb, 0x49, 0xfb, 0x20, 0x23, 0xfb, 0x2a, 0x54,
+ 0x1f, 0xfb, 0x0, 0x6, 0x7b, 0x42, 0x5, 0xf4,
+ 0x6, 0x87, 0x71, 0x89, 0x76, 0x8a, 0x7c, 0x8,
+ 0x39, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x11, 0x76,
+ 0xf7, 0x3a, 0x76, 0xf7, 0x14, 0x77, 0x1, 0xd3,
+ 0x8a, 0x15, 0xc9, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+ 0x60, 0x82, 0x7e, 0x4d, 0x18, 0xf7, 0x1d, 0x3e,
+ 0xa, 0xfb, 0x1d, 0x6, 0xe, 0x3c, 0xfb, 0x51,
+ 0x76, 0xf9, 0xcf, 0x96, 0xa, 0x88, 0x3b, 0x15,
+ 0x5c, 0xfb, 0x3, 0x5, 0x7d, 0xb6, 0xc5, 0x86,
+ 0xaa, 0x1b, 0xf7, 0x15, 0xbb, 0xf7, 0xf, 0xd9,
+ 0xa6, 0x1f, 0xf7, 0x27, 0xf8, 0x3e, 0x5, 0xef,
+ 0x6, 0xae, 0xf4, 0x5, 0x27, 0x6, 0xcd, 0xa2,
+ 0x96, 0xa8, 0xba, 0x1b, 0xa9, 0xa9, 0x81, 0x87,
+ 0x98, 0x1f, 0xba, 0xf7, 0x5, 0x5, 0x9e, 0x50,
+ 0x52, 0x8d, 0x80, 0x1b, 0xfb, 0x1e, 0x7b, 0x35,
+ 0xfb, 0x15, 0x51, 0x1f, 0x2a, 0x6, 0x67, 0x22,
+ 0x5, 0xed, 0x6, 0xfb, 0x26, 0xfc, 0x3c, 0x5,
+ 0x4f, 0x77, 0x75, 0x72, 0x6b, 0x1b, 0x77, 0x78,
+ 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x1b, 0xfb,
+ 0x11, 0x76, 0xf7, 0x25, 0xf7, 0x14, 0x1, 0xf7,
+ 0xbd, 0x8a, 0x61, 0xa, 0xf7, 0x1f, 0x3e, 0xa,
+ 0xfb, 0x1e, 0x6, 0xfb, 0x96, 0xfb, 0x14, 0x61,
+ 0xa, 0x56, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xf7,
+ 0x26, 0x1, 0xf9, 0x92, 0x16, 0x4b, 0xa, 0xfd,
+ 0x53, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xf7, 0xc8,
+ 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xe, 0x3c, 0xfb,
+ 0x2a, 0x76, 0xf8, 0xdb, 0xf7, 0x3, 0xf7, 0x57,
+ 0x77, 0x1, 0xf7, 0x45, 0xfb, 0x3f, 0x15, 0xf7,
+ 0x18, 0x6, 0xf7, 0xc, 0xf8, 0xdb, 0x5, 0xf7,
+ 0x42, 0x6, 0xa2, 0xf7, 0x3, 0x5, 0xfb, 0x43,
+ 0x6, 0xb4, 0xf7, 0x57, 0x66, 0xa, 0x62, 0xfb,
+ 0x57, 0x5, 0xfb, 0x48, 0x6, 0x75, 0xfb, 0x3,
+ 0x5, 0xf7, 0x48, 0x6, 0xe, 0x3c, 0xfb, 0x2a,
+ 0x76, 0xf7, 0x42, 0xf7, 0x3, 0xf7, 0xd7, 0xf7,
+ 0x3, 0xf7, 0x3e, 0x77, 0x1, 0xb9, 0x8e, 0x15,
+ 0xf7, 0x43, 0x6, 0x69, 0xfb, 0x42, 0x5, 0xf7,
+ 0x14, 0x6, 0xad, 0xf7, 0x42, 0x5, 0xf7, 0x3d,
+ 0x89, 0xa, 0xcc, 0xf7, 0xd7, 0x5, 0xf7, 0x3e,
+ 0x89, 0xa, 0xac, 0xf7, 0x3e, 0x5, 0xfb, 0x13,
+ 0x6, 0x69, 0xfb, 0x3e, 0x5, 0xfb, 0x44, 0x6,
+ 0x75, 0xfb, 0x3, 0x5, 0xf7, 0x43, 0x6, 0x4b,
+ 0xfb, 0xd7, 0x5, 0xfb, 0x44, 0x6, 0xe, 0x72,
+ 0xa, 0xf7, 0xa, 0xf8, 0xf0, 0x8f, 0xa, 0xe4,
+ 0xe1, 0xb3, 0x35, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+ 0x26, 0x81, 0xa, 0xf8, 0x1, 0x7a, 0xdb, 0x4e,
+ 0x76, 0xf9, 0x1d, 0xdb, 0x12, 0x13, 0x60, 0xf7,
+ 0x3e, 0xf8, 0x6f, 0x15, 0x9b, 0xa1, 0xf7, 0x1f,
+ 0xc3, 0x9b, 0x9e, 0x76, 0x6e, 0x75, 0x77, 0xfb,
+ 0x17, 0x4f, 0x6a, 0x8b, 0xaa, 0x9c, 0x1e, 0x47,
+ 0xfc, 0x82, 0x15, 0xed, 0x6, 0xf8, 0x6a, 0xf9,
+ 0x6d, 0x5, 0x26, 0x6, 0xfc, 0x81, 0xfb, 0x7f,
+ 0x15, 0xfb, 0x1, 0xd3, 0x79, 0xba, 0xf7, 0x1c,
+ 0xb8, 0xf7, 0x36, 0xd1, 0xb5, 0x79, 0xe3, 0x21,
+ 0xfb, 0x2f, 0x76, 0xfb, 0x6b, 0x77, 0x1e, 0xf7,
+ 0xd7, 0xfc, 0x1, 0x15, 0x13, 0xa0, 0xfb, 0x1,
+ 0xd1, 0x79, 0xbb, 0xf7, 0x1c, 0xb8, 0xf7, 0x3e,
+ 0xd0, 0xb5, 0x79, 0xdc, 0x21, 0x74, 0xa, 0xa1,
+ 0xf7, 0x1f, 0xc3, 0x9a, 0x9e, 0x7e, 0x6d, 0x76,
+ 0x77, 0xfb, 0x1e, 0x51, 0x69, 0x8b, 0xaa, 0x9b,
+ 0x1e, 0xf7, 0x8b, 0x16, 0xfb, 0x1, 0xd1, 0x79,
+ 0xba, 0xf7, 0x1e, 0xb7, 0xf7, 0x3d, 0xcf, 0xb2,
+ 0x7b, 0xe1, 0xfb, 0x0, 0x74, 0xa, 0xa0, 0xf7,
+ 0x1f, 0xc4, 0x9a, 0x9e, 0x7c, 0x6d, 0x76, 0x77,
+ 0xfb, 0x1c, 0x50, 0x6a, 0x8b, 0xaa, 0x9b, 0x1e,
+ 0xe, 0xab, 0x78, 0xf7, 0x14, 0x12, 0xdc, 0xf7,
+ 0x26, 0x53, 0xf7, 0x26, 0xf7, 0x5b, 0xf7, 0x2c,
+ 0x2a, 0xf7, 0x27, 0x13, 0xd0, 0xdc, 0xf7, 0x7e,
+ 0x15, 0xfb, 0x46, 0xf7, 0x28, 0x40, 0xf7, 0x24,
+ 0xf7, 0x67, 0xdf, 0xf7, 0x2, 0xf7, 0x1, 0xf7,
+ 0x12, 0x34, 0xc4, 0xfb, 0x14, 0xc2, 0x1e, 0x13,
+ 0xa8, 0x35, 0xb0, 0x59, 0x8e, 0xc0, 0x1a, 0xd8,
+ 0xe7, 0x9e, 0xa5, 0xd1, 0xc5, 0x73, 0x35, 0x93,
+ 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x37, 0x80,
+ 0xfb, 0x14, 0xc8, 0xfb, 0x23, 0x1b, 0xfb, 0x65,
+ 0x53, 0xfb, 0x14, 0x32, 0xfb, 0x15, 0xe5, 0x6e,
+ 0xf7, 0x15, 0x53, 0x1f, 0x13, 0xd0, 0xdc, 0x68,
+ 0xb8, 0x6e, 0x56, 0x1a, 0x3d, 0x32, 0x7e, 0x57,
+ 0xfb, 0x23, 0x88, 0xcf, 0xcb, 0x89, 0x1e, 0xf7,
+ 0x3e, 0xf8, 0xb3, 0x15, 0xf7, 0x1d, 0x6, 0xf7,
+ 0x2b, 0x5d, 0xa, 0xfb, 0xd, 0x6, 0x32, 0x31,
+ 0x64, 0xe5, 0x5, 0x26, 0x6, 0xe, 0x58, 0xa,
+ 0xf7, 0x62, 0xd7, 0x15, 0xd0, 0x6, 0x5e, 0xf7,
+ 0x65, 0xf7, 0xf, 0xf7, 0x5b, 0x5, 0x39, 0x6,
+ 0xfb, 0x21, 0xfb, 0x5b, 0x5, 0xe, 0xf8, 0x1,
+ 0x78, 0xf7, 0xd, 0xfb, 0x1, 0xf7, 0x1, 0xfb,
+ 0x1, 0xf7, 0xf, 0xf7, 0x5c, 0xf7, 0xf, 0xf7,
+ 0x37, 0xf7, 0xf, 0xfb, 0x1, 0xf7, 0xd, 0x12,
+ 0xee, 0xf7, 0x19, 0x13, 0x3a, 0xf8, 0x84, 0x84,
+ 0x15, 0xf8, 0x88, 0x71, 0xa, 0xfb, 0xfc, 0x6,
+ 0xb4, 0xf7, 0x5c, 0x5, 0xf7, 0xc7, 0x71, 0xa,
+ 0xfb, 0xc8, 0x6, 0xac, 0xf7, 0x37, 0x5, 0xf7,
+ 0xdc, 0x6, 0xa4, 0xf7, 0xf, 0x5, 0xfc, 0x68,
+ 0x6, 0x7a, 0x39, 0x5, 0x13, 0x96, 0xd6, 0x62,
+ 0x3c, 0x9e, 0x57, 0x1b, 0xfb, 0x52, 0xfb, 0x3c,
+ 0xfb, 0x57, 0xfb, 0xab, 0xfb, 0x61, 0xf7, 0x12,
+ 0x3e, 0xf7, 0x12, 0xe3, 0xb4, 0xb1, 0xad, 0xa5,
+ 0x1f, 0x8d, 0x88, 0x5, 0x13, 0x56, 0xfb, 0xa8,
+ 0xf7, 0x69, 0x15, 0xf7, 0x12, 0xc5, 0xf7, 0x77,
+ 0xf7, 0x38, 0xe1, 0xb7, 0x4a, 0x3e, 0x4e, 0x76,
+ 0xfb, 0x9, 0x6f, 0x42, 0x1e, 0x6f, 0x80, 0x63,
+ 0x2e, 0x20, 0x1b, 0x38, 0x4d, 0xc5, 0xf2, 0x1f,
+ 0xe, 0xfb, 0xf9, 0xf8, 0x6f, 0x76, 0xf7, 0xa5,
+ 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x5a, 0x8e, 0xa,
+ 0xa6, 0xf7, 0x15, 0x5, 0x4d, 0x6, 0x97, 0xc4,
+ 0xa4, 0x9a, 0xb6, 0x95, 0x98, 0xc9, 0x18, 0xfb,
+ 0x1e, 0x88, 0x74, 0xfb, 0x1, 0x7f, 0x54, 0x8,
+ 0xe, 0xfb, 0xf9, 0xf8, 0x66, 0x76, 0xf7, 0xa5,
+ 0x77, 0x1, 0xf7, 0x3b, 0xf8, 0x51, 0x15, 0xf7,
+ 0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0x70, 0xfb,
+ 0x15, 0x5, 0xc9, 0x6, 0x7e, 0x53, 0x73, 0x7b,
+ 0x60, 0x81, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x5a,
+ 0xf7, 0x14, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x34,
+ 0xf8, 0x5a, 0x15, 0xf7, 0x1f, 0x6, 0xa6, 0xf7,
+ 0x14, 0x5, 0x4d, 0x6, 0x97, 0xc3, 0xa4, 0x9d,
+ 0xb7, 0x94, 0x97, 0xc9, 0x18, 0xfb, 0x1e, 0x88,
+ 0x73, 0xfb, 0x3, 0x7f, 0x55, 0x8, 0xf7, 0x64,
+ 0x22, 0x8e, 0xa, 0xa7, 0xf7, 0x14, 0x5, 0x4c,
+ 0x6, 0x98, 0xc3, 0xa3, 0x9d, 0xb7, 0x94, 0x98,
+ 0xc9, 0x18, 0xfb, 0x1f, 0x88, 0x74, 0xfb, 0x3,
+ 0x7f, 0x55, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x66,
+ 0x76, 0xf7, 0x24, 0xf7, 0x15, 0x1, 0xf8, 0x1c,
+ 0xf8, 0x51, 0x15, 0xf7, 0x1f, 0x3e, 0xa, 0xfb,
+ 0x1e, 0x6, 0x6f, 0x62, 0xa, 0xfb, 0x87, 0x4d,
+ 0x15, 0x56, 0xa, 0x70, 0x62, 0xa, 0xe, 0xfb,
+ 0xb1, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1,
+ 0xde, 0xf7, 0xfd, 0x15, 0x2f, 0xd7, 0x40, 0xe7,
+ 0xe7, 0xd8, 0xd5, 0xe8, 0xe9, 0x3e, 0xd0, 0x2f,
+ 0x2e, 0x40, 0x44, 0x2f, 0x1e, 0xe, 0x3c, 0x88,
+ 0xa, 0xf8, 0xd7, 0xf5, 0xfc, 0xd7, 0x6, 0xe,
+ 0xf8, 0x1, 0x88, 0xa, 0xfa, 0x93, 0xf5, 0xfe,
+ 0x93, 0x6, 0xe, 0xf8, 0xf6, 0xf7, 0x13, 0x38,
+ 0xde, 0x89, 0x77, 0x12, 0x13, 0x80, 0xf7, 0x5,
+ 0xf8, 0xf6, 0x15, 0xd4, 0x6, 0x13, 0x40, 0x8f,
+ 0x9a, 0x96, 0xa7, 0xae, 0x8c, 0x8, 0xaa, 0xa2,
+ 0x81, 0x81, 0xa3, 0x1f, 0x81, 0xa2, 0xa2, 0x80,
+ 0xaa, 0x1b, 0xc1, 0xbb, 0xb5, 0xdd, 0x99, 0x1f,
+ 0x41, 0x6, 0x72, 0x83, 0x83, 0x7a, 0x74, 0x1b,
+ 0x75, 0x75, 0x93, 0x93, 0x72, 0x1f, 0x13, 0x20,
+ 0x96, 0x6c, 0x6a, 0x98, 0x69, 0x1b, 0x13, 0x80,
+ 0x3d, 0x72, 0x42, 0x57, 0x80, 0x1f, 0xe, 0xf8,
+ 0x1, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4, 0x1,
+ 0xf7, 0x68, 0xe5, 0xf7, 0x58, 0xe0, 0xf7, 0xd0,
+ 0xe0, 0x3, 0xf7, 0x68, 0xf7, 0xc6, 0x15, 0xe5,
+ 0xf7, 0xe7, 0xf7, 0x2e, 0xd4, 0xfc, 0x26, 0x42,
+ 0xf7, 0x32, 0x6, 0xf7, 0xb2, 0xfb, 0xe7, 0x15,
+ 0xe0, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x8, 0xfb,
+ 0xdc, 0x5, 0xdb, 0x6, 0xf7, 0x7, 0xf7, 0xdc,
+ 0x5, 0x8e, 0xfb, 0xdc, 0xe0, 0xf8, 0x30, 0xfb,
+ 0x21, 0x6, 0x26, 0xfb, 0xaf, 0x51, 0xa, 0x25,
+ 0xf7, 0xaf, 0x5, 0xfb, 0x20, 0x6, 0xe, 0x3c,
+ 0x7d, 0xef, 0xf8, 0x94, 0xf7, 0x2c, 0x1, 0xf7,
+ 0x24, 0xf7, 0x1c, 0xf7, 0x26, 0xf7, 0x28, 0x3,
+ 0xca, 0xf7, 0x28, 0x15, 0xfb, 0x7, 0xad, 0xe9,
+ 0x5c, 0xf7, 0x1e, 0x1b, 0xf7, 0x51, 0xc3, 0xe5,
+ 0xd3, 0xf4, 0xfb, 0x4, 0xc5, 0x3a, 0xa3, 0x1f,
+ 0x41, 0xa1, 0x70, 0x8b, 0xab, 0x1a, 0xa4, 0xa4,
+ 0xab, 0xc7, 0x9b, 0xd4, 0x8b, 0x4b, 0xa2, 0x1e,
+ 0xf7, 0x1a, 0xa3, 0x5, 0xf7, 0x11, 0x6f, 0xfb,
+ 0xc, 0x9b, 0x40, 0x1b, 0xfb, 0x3a, 0x3d, 0x46,
+ 0x32, 0x27, 0xdc, 0x69, 0xe6, 0x6c, 0x1f, 0xef,
+ 0x69, 0x95, 0x7e, 0x6e, 0x1a, 0x67, 0x5a, 0x71,
+ 0x58, 0x3d, 0x70, 0xb3, 0xb8, 0x7a, 0x1e, 0xf7,
+ 0x11, 0xf8, 0x3f, 0x15, 0x82, 0xa, 0xf7, 0x2a,
+ 0x5d, 0xa, 0xfb, 0xc, 0x6, 0x33, 0x31, 0x64,
+ 0xe5, 0x5, 0x27, 0x6, 0xe, 0x58, 0xa, 0xee,
+ 0xd7, 0x15, 0xdd, 0x6, 0xf7, 0x21, 0xf7, 0x55,
+ 0x3f, 0xf7, 0x6b, 0x5, 0x46, 0x6, 0xb8, 0xfb,
+ 0x6b, 0x5, 0xe, 0xf7, 0xc9, 0x7d, 0xf1, 0x25,
+ 0xf7, 0x2, 0xf7, 0x10, 0xe3, 0xf7, 0x15, 0xf7,
+ 0x1, 0x24, 0xf2, 0x12, 0xdd, 0xf7, 0x21, 0xf7,
+ 0x98, 0xf7, 0x15, 0x13, 0xb6, 0xf8, 0xa5, 0xcc,
+ 0x15, 0x56, 0xb8, 0xd0, 0x71, 0xd0, 0x1b, 0xf7,
+ 0x2a, 0xca, 0xf7, 0x1, 0xb9, 0xa5, 0x1f, 0xfb,
+ 0x13, 0xa2, 0x5, 0x69, 0x7b, 0x6a, 0x61, 0x4d,
+ 0x1b, 0x68, 0x47, 0xa4, 0xf6, 0x8d, 0x1f, 0xf7,
+ 0xf6, 0x6, 0x94, 0xae, 0x8d, 0xb0, 0xaf, 0x1a,
+ 0xec, 0x4c, 0xf7, 0xd, 0xfb, 0x2b, 0x74, 0x33,
+ 0x89, 0x42, 0x39, 0x1e, 0xca, 0x51, 0x45, 0x97,
+ 0x53, 0x1b, 0xfb, 0xaa, 0x71, 0xfb, 0xa5, 0x4a,
+ 0xfb, 0xa, 0xcf, 0x23, 0xf7, 0x45, 0xd6, 0xd5,
+ 0xa5, 0xc0, 0xc0, 0x1f, 0xec, 0xf7, 0x87, 0x15,
+ 0x13, 0xae, 0xa8, 0x92, 0xa4, 0xf5, 0xe9, 0x1b,
+ 0xf0, 0x86, 0xfb, 0x4, 0x74, 0x8a, 0x1f, 0xfd,
+ 0x4, 0x27, 0x15, 0x13, 0x76, 0xf7, 0x5, 0xc0,
+ 0xf7, 0x8, 0xf0, 0xb7, 0xc9, 0x6f, 0x29, 0x43,
+ 0x65, 0xfb, 0x23, 0xfb, 0x9, 0x47, 0x66, 0xc1,
+ 0xc5, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf9, 0x6d,
+ 0x77, 0xdf, 0xf7, 0xe, 0x1, 0x64, 0xa, 0xf7,
+ 0xa2, 0xf7, 0xcc, 0xf8, 0x5f, 0x43, 0xa, 0xfb,
+ 0x5d, 0xfb, 0xcc, 0xfb, 0x10, 0xf7, 0xcc, 0x5a,
+ 0xa, 0xf7, 0x51, 0xfc, 0x50, 0x5, 0x8a, 0xf8,
+ 0x90, 0x15, 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa,
+ 0xfb, 0x7, 0x6, 0xf7, 0x40, 0xfb, 0xe, 0x15,
+ 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x6,
+ 0x6, 0xe, 0xfb, 0x39, 0x76, 0xf8, 0xab, 0x77,
+ 0xcf, 0xf7, 0x1b, 0x1, 0xf7, 0x46, 0xf8, 0x21,
+ 0x15, 0xf7, 0x25, 0x6, 0xa9, 0xf7, 0x1b, 0x93,
+ 0xa, 0xfb, 0xb, 0xfc, 0xb9, 0x15, 0x65, 0xfb,
+ 0x3d, 0x5, 0xf7, 0x2b, 0x6, 0xb0, 0xf7, 0x3d,
+ 0xb9, 0xf8, 0x2, 0x5, 0x3a, 0x6, 0xe, 0x3c,
+ 0x2a, 0x76, 0xf6, 0xf5, 0xf7, 0xed, 0xe9, 0xe9,
+ 0x77, 0x1, 0xda, 0xf7, 0x1b, 0x3, 0xf7, 0x24,
+ 0x2c, 0x15, 0xc9, 0x74, 0xbe, 0xf7, 0x3, 0x5,
+ 0x89, 0x95, 0x9b, 0x89, 0xa1, 0x1b, 0xf7, 0x2f,
+ 0xd5, 0xf7, 0x3, 0xd8, 0xa6, 0x1f, 0xfb, 0x19,
+ 0x9f, 0x73, 0x50, 0x64, 0x5c, 0x4b, 0x8f, 0x19,
+ 0xf7, 0x1c, 0xf7, 0xd8, 0xa0, 0x79, 0x96, 0x72,
+ 0x8d, 0x6d, 0x19, 0xf7, 0x14, 0x99, 0x85, 0xe3,
+ 0x4f, 0xbb, 0x54, 0xa0, 0x19, 0xb0, 0xe2, 0x4f,
+ 0xa3, 0x61, 0x2b, 0x5, 0x8c, 0x85, 0x81, 0x8c,
+ 0x7b, 0x1b, 0xfb, 0x39, 0xfb, 0x1d, 0xfb, 0x20,
+ 0xfb, 0x57, 0x2a, 0xb6, 0x4f, 0xd3, 0x6b, 0x1f,
+ 0xb9, 0xf7, 0x2, 0x15, 0x82, 0x93, 0x7a, 0x9e,
+ 0xbf, 0x1a, 0xd2, 0xab, 0xf7, 0x35, 0xf7, 0x14,
+ 0x94, 0x1e, 0xe, 0x3c, 0x90, 0x76, 0xa6, 0x76,
+ 0xf7, 0xc8, 0xf7, 0x0, 0xf7, 0x61, 0xf6, 0x12,
+ 0xf7, 0x4b, 0xf7, 0x14, 0x13, 0xb8, 0xcb, 0x7b,
+ 0x15, 0x9c, 0xaa, 0xc2, 0xa3, 0xc4, 0x1b, 0xbb,
+ 0xa9, 0x82, 0x82, 0xaa, 0x1f, 0x13, 0x78, 0x82,
+ 0xa9, 0xab, 0x83, 0xbc, 0x1b, 0xc5, 0xaf, 0x9a,
+ 0x98, 0xaf, 0x1f, 0x61, 0xf7, 0xb, 0x5, 0x71,
+ 0x53, 0x68, 0x8b, 0x78, 0x1b, 0x7e, 0x41, 0x97,
+ 0x84, 0xad, 0x1f, 0x86, 0xa4, 0x3e, 0x97, 0x74,
+ 0x1b, 0x75, 0x78, 0x87, 0x81, 0x7e, 0x1f, 0x89,
+ 0x8d, 0xca, 0xc2, 0xad, 0xbd, 0x90, 0xdd, 0x19,
+ 0xe9, 0x6, 0xa2, 0xf7, 0x0, 0x7a, 0xa, 0x87,
+ 0xa1, 0x88, 0xa1, 0xa3, 0x1a, 0xe9, 0xc2, 0xb6,
+ 0xc0, 0xd7, 0x96, 0x44, 0x72, 0x8f, 0x1e, 0xf7,
+ 0x11, 0x98, 0x5, 0xea, 0x84, 0x4f, 0xea, 0xfb,
+ 0x23, 0x1b, 0xfb, 0x28, 0x2d, 0xfb, 0x8, 0xfb,
+ 0x14, 0x85, 0x8b, 0x75, 0x93, 0x63, 0x1f, 0x3d,
+ 0x6, 0x75, 0xfb, 0x0, 0x5, 0xf7, 0x3, 0x6,
+ 0x7e, 0xfb, 0x9, 0x23, 0x52, 0x68, 0x7c, 0x8,
+ 0xe, 0x3c, 0xec, 0x76, 0xb5, 0xf7, 0x16, 0xf7,
+ 0x69, 0xf7, 0x16, 0xb8, 0x77, 0x1, 0xdc, 0xd8,
+ 0x15, 0xe6, 0xd2, 0x5, 0x78, 0xa6, 0xad, 0x80,
+ 0xb1, 0x1b, 0xb5, 0xb7, 0x97, 0x9e, 0xae, 0x1f,
+ 0xb8, 0x42, 0xf7, 0x7, 0xe6, 0x5f, 0xd3, 0xaa,
+ 0xae, 0xa4, 0xb4, 0x99, 0xb5, 0x19, 0x92, 0xa0,
+ 0x91, 0xa6, 0xa7, 0x1a, 0x98, 0x8b, 0x98, 0x88,
+ 0x99, 0x1e, 0xe7, 0xd3, 0x55, 0xe6, 0x2e, 0x42,
+ 0x5, 0x95, 0x7d, 0x6e, 0x9d, 0x52, 0x1b, 0x51,
+ 0x60, 0x79, 0x81, 0x77, 0x1f, 0x5e, 0xd4, 0xfb,
+ 0x8, 0x2b, 0xb5, 0x46, 0x6e, 0x69, 0x74, 0x62,
+ 0x7e, 0x62, 0x19, 0x82, 0x71, 0x80, 0x60, 0x93,
+ 0x5c, 0x32, 0x44, 0x18, 0xf7, 0x74, 0xf7, 0x51,
+ 0x15, 0xc6, 0x9e, 0xc9, 0xb8, 0xc3, 0x1b, 0xb7,
+ 0xa8, 0x6f, 0x62, 0x80, 0x89, 0x7f, 0x87, 0x7f,
+ 0x1f, 0x4f, 0x77, 0x4b, 0x5a, 0x53, 0x1b, 0x53,
+ 0x6e, 0xbc, 0xc7, 0xa0, 0x1f, 0xe, 0x3c, 0xa0,
+ 0x76, 0xf7, 0x21, 0xe6, 0xf8, 0x66, 0x77, 0x1,
+ 0xc7, 0xf7, 0x21, 0x15, 0xf7, 0x4d, 0x6, 0x6d,
+ 0xfb, 0x21, 0x5, 0xf7, 0x20, 0x6, 0xab, 0xf7,
+ 0x21, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe6, 0x5,
+ 0xfb, 0x4c, 0x6, 0x9c, 0xd7, 0x5, 0xf7, 0x4b,
+ 0x6, 0x9f, 0xe7, 0x5, 0xfb, 0x13, 0x6, 0xf7,
+ 0x6a, 0xf7, 0xbe, 0x43, 0xa, 0xfb, 0x4b, 0xfb,
+ 0xbe, 0x51, 0xa, 0x40, 0xf7, 0xbe, 0x44, 0xa,
+ 0xe8, 0xfb, 0xbe, 0x5, 0xfb, 0xf, 0x6, 0x78,
+ 0x2f, 0x5, 0xf7, 0x4d, 0x6, 0x7b, 0x3f, 0x5,
+ 0xfb, 0x4e, 0x6, 0xe, 0xfb, 0xf7, 0x78, 0xa,
+ 0xdb, 0x78, 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7,
+ 0xc9, 0x5, 0xfb, 0x0, 0x6, 0xaa, 0xf7, 0x1d,
+ 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7, 0xca, 0x5,
+ 0xfb, 0x0, 0x6, 0xe, 0x3c, 0xfb, 0x4c, 0xe9,
+ 0xf9, 0x1e, 0xf7, 0x3b, 0x12, 0xf6, 0xf7, 0xd,
+ 0x78, 0xf7, 0x11, 0xa1, 0xf7, 0x16, 0x6b, 0xf7,
+ 0xa, 0x13, 0xe8, 0xc8, 0x77, 0x15, 0x35, 0x9c,
+ 0xd6, 0x3d, 0xf7, 0x1a, 0x1b, 0xf7, 0x1b, 0xcb,
+ 0xd6, 0xd5, 0xbd, 0x6f, 0xb7, 0x7d, 0x9e, 0x1f,
+ 0x13, 0xd4, 0xd5, 0xae, 0xc1, 0xc6, 0xd3, 0x1a,
+ 0xc6, 0x6e, 0xbe, 0x2f, 0xdb, 0x1e, 0x27, 0xe3,
+ 0x7a, 0x92, 0xb1, 0x1a, 0xa5, 0x9c, 0xb3, 0xba,
+ 0xcf, 0x8f, 0x4f, 0x78, 0x8d, 0x1e, 0xf7, 0x12,
+ 0x97, 0x5, 0xc4, 0x84, 0x72, 0xf3, 0xfb, 0x36,
+ 0x1b, 0xfb, 0x28, 0x5c, 0x30, 0x46, 0x75, 0x90,
+ 0x6d, 0xa3, 0x65, 0x1f, 0x13, 0xe8, 0x67, 0x79,
+ 0x2c, 0x63, 0x22, 0x1a, 0x76, 0x89, 0x4a, 0xe1,
+ 0x3e, 0x1e, 0xc8, 0x55, 0xf3, 0x48, 0x4a, 0x1a,
+ 0x83, 0x87, 0x5c, 0x4d, 0x60, 0x64, 0x9f, 0xd9,
+ 0x77, 0x1e, 0xf7, 0x57, 0xf7, 0x1c, 0x15, 0xfb,
+ 0x9, 0xf7, 0x2, 0x5, 0x65, 0xaf, 0x8b, 0x98,
+ 0x96, 0x1a, 0xb9, 0xad, 0xaa, 0xab, 0x9d, 0x1e,
+ 0x86, 0xe2, 0x40, 0x82, 0x8f, 0x1f, 0x13, 0xe4,
+ 0xb6, 0x64, 0xaa, 0x6e, 0x66, 0x1a, 0x5d, 0x51,
+ 0x71, 0x7e, 0x87, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+ 0x7, 0x1, 0xf7, 0x1d, 0xf8, 0xfa, 0x69, 0xa,
+ 0xf7, 0x45, 0xfb, 0x7, 0x69, 0xa, 0xe, 0xf1,
+ 0x78, 0xd6, 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8,
+ 0xd6, 0x1, 0xc3, 0xd8, 0xf9, 0x5, 0xd8, 0x3,
+ 0xf7, 0x19, 0xf7, 0xf8, 0x15, 0xf7, 0x3c, 0xf7,
+ 0x1d, 0xf7, 0x1e, 0xf7, 0x41, 0xf7, 0x41, 0xf7,
+ 0x22, 0xfb, 0x1e, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb,
+ 0x22, 0xfb, 0x18, 0xfb, 0x41, 0xfb, 0x41, 0xfb,
+ 0x1d, 0xf7, 0x18, 0xf7, 0x3c, 0x1e, 0xf8, 0x2c,
+ 0x56, 0x15, 0x76, 0x83, 0x79, 0x4c, 0x43, 0x1b,
+ 0x5c, 0x57, 0xaa, 0xf5, 0xbc, 0x93, 0xe8, 0xe6,
+ 0xcb, 0xa4, 0x5b, 0x77, 0x93, 0x1f, 0xdd, 0x9e,
+ 0x5, 0xaf, 0x7d, 0x60, 0xdf, 0xfb, 0xe, 0x1b,
+ 0xfb, 0x13, 0x4e, 0x33, 0xfb, 0x11, 0xfb, 0x2f,
+ 0xed, 0x56, 0xe5, 0xcd, 0xde, 0xa9, 0xed, 0xa9,
+ 0x1f, 0xfc, 0xca, 0xdb, 0x15, 0xfb, 0x65, 0xf7,
+ 0x40, 0xfb, 0x3a, 0xf7, 0x6b, 0xf7, 0x6b, 0xf7,
+ 0x45, 0xf7, 0x3a, 0xf7, 0x65, 0xf7, 0x65, 0xfb,
+ 0x45, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb,
+ 0x40, 0xfb, 0x40, 0xfb, 0x65, 0x1e, 0xe, 0xfb,
+ 0x9d, 0xf7, 0xa8, 0xe3, 0xf8, 0x9, 0x77, 0x1,
+ 0xf7, 0xd9, 0xf7, 0xb2, 0x15, 0xf5, 0x6, 0x81,
+ 0xa6, 0x89, 0xa1, 0x9b, 0xe9, 0xb9, 0xe0, 0xdf,
+ 0x1a, 0xf7, 0xf, 0xfb, 0x15, 0x8b, 0x76, 0x6b,
+ 0x21, 0x8a, 0xfb, 0x16, 0x5b, 0x1e, 0xf4, 0x7b,
+ 0x5, 0xbe, 0xa4, 0xb3, 0x8b, 0x95, 0x1b, 0xaf,
+ 0xab, 0x6d, 0x53, 0x70, 0x1f, 0xfb, 0x3, 0x7e,
+ 0x78, 0x89, 0x65, 0x80, 0x8, 0x54, 0x7a, 0x68,
+ 0x4a, 0x4f, 0x1a, 0x51, 0xad, 0x56, 0xe0, 0xaf,
+ 0xb2, 0x98, 0xa4, 0xac, 0x1e, 0x8c, 0x7d, 0x8c,
+ 0x87, 0x8f, 0x81, 0x8, 0x8c, 0xf7, 0x4a, 0x15,
+ 0x61, 0x82, 0x7e, 0x4d, 0x4e, 0x1b, 0x73, 0x6d,
+ 0x9c, 0xa4, 0xb5, 0xbf, 0x94, 0xe0, 0x96, 0x1f,
+ 0xe, 0x3c, 0x58, 0xa, 0xf8, 0x23, 0xd7, 0x4a,
+ 0xa, 0x35, 0xfb, 0x6d, 0x4a, 0xa, 0xe, 0x58,
+ 0xf7, 0x15, 0x76, 0x1, 0xf4, 0xf7, 0xc6, 0x15,
+ 0xf8, 0x1, 0xfb, 0x5a, 0xf7, 0x19, 0xf7, 0xcb,
+ 0xfc, 0x86, 0x6, 0xe, 0x58, 0xf7, 0x59, 0xf7,
+ 0x4, 0x1, 0xdd, 0xf7, 0x59, 0x15, 0xf7, 0x4,
+ 0xf8, 0xa4, 0xfb, 0x4, 0x7, 0xe, 0xf1, 0x78,
+ 0xd6, 0xf7, 0xa0, 0xca, 0xf7, 0xa7, 0xd6, 0x1,
+ 0xc2, 0xd8, 0xf8, 0x32, 0xe4, 0xf7, 0xe, 0xd8,
+ 0x3, 0xf7, 0x94, 0xf7, 0x33, 0x15, 0xde, 0x6,
+ 0xa4, 0xf7, 0x39, 0x5, 0xa1, 0x6, 0xb5, 0xa4,
+ 0x85, 0x2e, 0xae, 0x1f, 0xa3, 0x49, 0x5, 0xf3,
+ 0x6, 0x66, 0xdc, 0x71, 0xc7, 0x81, 0x9f, 0x67,
+ 0x99, 0x19, 0x8d, 0x7, 0xe1, 0x96, 0xb5, 0xbd,
+ 0xb9, 0x1a, 0xf7, 0x15, 0xfb, 0x6, 0x7f, 0xfb,
+ 0xc, 0x1e, 0x38, 0x6, 0xc3, 0xfb, 0x41, 0x15,
+ 0x9c, 0xf7, 0x1, 0x5, 0xae, 0x6, 0xd4, 0xba,
+ 0x8f, 0x52, 0x52, 0x4d, 0x8c, 0x40, 0x1f, 0xfb,
+ 0xa9, 0x6f, 0x15, 0xf7, 0x3c, 0xf7, 0x20, 0xf7,
+ 0x1b, 0xf7, 0x41, 0xf7, 0x41, 0xf7, 0x1f, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1f, 0xfb,
+ 0x1b, 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x20, 0xf7,
+ 0x1b, 0xf7, 0x3c, 0x1e, 0x3e, 0x16, 0xfb, 0x65,
+ 0xf7, 0x43, 0xfb, 0x3d, 0xf7, 0x6b, 0xf7, 0x6b,
+ 0xf7, 0x42, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65,
+ 0xfb, 0x42, 0xf7, 0x3d, 0xfb, 0x6b, 0xfb, 0x6b,
+ 0xfb, 0x43, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, 0xe,
+ 0xf8, 0xf0, 0xd5, 0x1, 0xf7, 0xe, 0xf7, 0xfd,
+ 0x3, 0xf7, 0xe, 0xf8, 0xf0, 0x15, 0xf7, 0xe7,
+ 0x6, 0xa1, 0xd5, 0x5, 0xfb, 0xe8, 0x6, 0xe,
+ 0xfb, 0x7f, 0xf7, 0x43, 0xd7, 0xf7, 0x20, 0xd7,
+ 0x3, 0xf7, 0x43, 0xf8, 0xcf, 0x15, 0x3b, 0xcc,
+ 0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdb, 0xdb, 0x49,
+ 0xc8, 0x3a, 0x3b, 0x4a, 0x4e, 0x3b, 0x1e, 0xd7,
+ 0x8a, 0x15, 0xb2, 0xab, 0xa7, 0xb1, 0xb1, 0xab,
+ 0x70, 0x63, 0x65, 0x6b, 0x6c, 0x65, 0x65, 0x6b,
+ 0xaa, 0xb1, 0x1e, 0xe, 0x58, 0x8b, 0xe7, 0xf7,
+ 0x4c, 0xe9, 0xf7, 0x1c, 0x77, 0x1, 0xf7, 0xaa,
+ 0xf7, 0x0, 0x3, 0xb3, 0x16, 0xf8, 0xdd, 0xe7,
+ 0xfc, 0xdd, 0x6, 0xf7, 0x4c, 0x4, 0xf7, 0x82,
+ 0xfb, 0x1f, 0xf7, 0x0, 0xf7, 0x1f, 0xf7, 0x83,
+ 0xe9, 0xfb, 0x83, 0xf7, 0x1c, 0xfb, 0x0, 0xfb,
+ 0x1c, 0xfb, 0x82, 0x6, 0xe, 0xf7, 0xaf, 0xe4,
+ 0xf7, 0x95, 0xdc, 0x1, 0xd0, 0xf7, 0xaf, 0x15,
+ 0xf7, 0xd8, 0x6, 0xa2, 0xe4, 0x5, 0xfb, 0x3c,
+ 0x6, 0xa0, 0x9c, 0xc4, 0xb1, 0x97, 0x96, 0x8,
+ 0xdc, 0xd3, 0xa9, 0xb3, 0xb5, 0x1a, 0xc5, 0x5d,
+ 0xc7, 0xfb, 0x7, 0xfb, 0x25, 0x75, 0x22, 0x6f,
+ 0x86, 0x1e, 0xf7, 0x4, 0x7d, 0x5, 0xa7, 0x92,
+ 0x94, 0xb1, 0xb9, 0x1b, 0xef, 0x30, 0xfb, 0x1,
+ 0x52, 0x30, 0x1f, 0x2a, 0x4e, 0x6c, 0x5d, 0x80,
+ 0x42, 0x8, 0xe, 0xf7, 0xa3, 0xdd, 0x39, 0xf7,
+ 0x1c, 0xf7, 0xc3, 0x77, 0x1, 0xe6, 0xf8, 0x26,
+ 0x15, 0x71, 0x8e, 0x9b, 0x22, 0xf7, 0x1b, 0x1b,
+ 0xf7, 0x2, 0xca, 0xda, 0xc8, 0x1f, 0xb9, 0x61,
+ 0x9e, 0x9f, 0x9c, 0xcc, 0xa6, 0xc0, 0x1a, 0xb8,
+ 0x6a, 0xd3, 0x21, 0xfb, 0xa, 0x6c, 0x33, 0x6a,
+ 0x7f, 0x1e, 0xed, 0x79, 0x5, 0xb0, 0x95, 0x9c,
+ 0x9f, 0xa8, 0x1b, 0x92, 0xad, 0x8a, 0x69, 0x4f,
+ 0x46, 0x92, 0x7d, 0x8d, 0x1f, 0x77, 0x34, 0x5,
+ 0xab, 0x95, 0xba, 0x83, 0x5d, 0x1a, 0x6d, 0x72,
+ 0x6f, 0x61, 0x60, 0x86, 0xaa, 0xa7, 0x86, 0x1e,
+ 0xe, 0xf9, 0x5, 0x76, 0xf7, 0x26, 0x77, 0x1,
+ 0xf7, 0x80, 0xf8, 0xf0, 0x15, 0xf2, 0x52, 0xa,
+ 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x62, 0xeb,
+ 0x33, 0x76, 0xf8, 0xb6, 0x77, 0x12, 0x13, 0xb0,
+ 0xf7, 0x70, 0xc3, 0x15, 0x70, 0x9a, 0xa4, 0x60,
+ 0xc8, 0x1b, 0xb7, 0xa3, 0xa0, 0xb4, 0xb1, 0x1f,
+ 0x13, 0xd0, 0x82, 0x5a, 0x5, 0xf7, 0x14, 0x6,
+ 0xf7, 0x4, 0xf8, 0xa9, 0x3d, 0xa, 0x4f, 0xfb,
+ 0xa9, 0x5, 0x54, 0x80, 0x74, 0x22, 0x33, 0x1b,
+ 0x68, 0x5c, 0xa6, 0xcb, 0x1f, 0xce, 0xf7, 0xee,
+ 0x92, 0xa, 0xfb, 0x30, 0xfd, 0x77, 0x8d, 0xa,
+ 0xe, 0x3c, 0xfb, 0x3e, 0x76, 0xf9, 0x92, 0xf7,
+ 0x11, 0x1, 0xf7, 0xc3, 0xfb, 0x53, 0x15, 0xf7,
+ 0x10, 0xf9, 0x92, 0xd9, 0xfd, 0x92, 0xf7, 0xc,
+ 0xf9, 0x92, 0xca, 0xf7, 0x11, 0xfb, 0xcb, 0x6,
+ 0xfb, 0x29, 0xfb, 0x16, 0x5f, 0xfb, 0x2d, 0x5a,
+ 0xa4, 0xfb, 0x26, 0xf7, 0x48, 0x1f, 0xe, 0xfb,
+ 0xf9, 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x2,
+ 0xf7, 0x40, 0x8e, 0xa, 0xa7, 0xf7, 0x36, 0x81,
+ 0xa, 0xfb, 0x78, 0xce, 0xf7, 0x35, 0x77, 0x1,
+ 0xf7, 0x18, 0xe3, 0x3, 0xbc, 0x80, 0x15, 0x7b,
+ 0x53, 0x5, 0x8e, 0x9d, 0x9b, 0x8e, 0x95, 0x1b,
+ 0x99, 0xb4, 0x87, 0x66, 0x5c, 0x48, 0x7f, 0x3c,
+ 0x1f, 0x74, 0x48, 0x5, 0xf7, 0x2f, 0xf1, 0xae,
+ 0xe6, 0xbc, 0x69, 0xc0, 0x41, 0x70, 0x76, 0x86,
+ 0x85, 0x7c, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8,
+ 0x3f, 0x77, 0x1, 0xf7, 0x62, 0xf7, 0xaf, 0x15,
+ 0xe7, 0x6, 0xe5, 0xf8, 0x3f, 0x5, 0x51, 0x6,
+ 0x71, 0x6f, 0x55, 0x5f, 0x3f, 0x6b, 0x71, 0x31,
+ 0x18, 0xaf, 0x93, 0xb2, 0x98, 0xb4, 0xa2, 0x8,
+ 0xe, 0xfb, 0xa2, 0xf7, 0xa8, 0xf2, 0xf7, 0x93,
+ 0xf2, 0x1, 0xe7, 0xf7, 0x6, 0xf7, 0x39, 0xf7,
+ 0x6, 0x3, 0xe7, 0xf8, 0x57, 0x15, 0x30, 0xbe,
+ 0x37, 0xf7, 0xf, 0xf7, 0x3f, 0xbb, 0xf7, 0x60,
+ 0xd8, 0xe9, 0x50, 0xe1, 0xfb, 0xa, 0xfb, 0x2b,
+ 0x4a, 0xfb, 0x43, 0xfb, 0x3, 0x1e, 0xf7, 0x6,
+ 0x16, 0xc2, 0xa6, 0xf7, 0x14, 0xd8, 0xa8, 0xab,
+ 0x74, 0x55, 0x5a, 0x6f, 0xfb, 0x15, 0x3f, 0x62,
+ 0x77, 0xad, 0xb1, 0x1e, 0xe, 0x3c, 0x58, 0xa,
+ 0xf3, 0xd7, 0x4d, 0xa, 0xaa, 0xfb, 0x59, 0x4d,
+ 0xa, 0xe, 0xf7, 0x5b, 0x92, 0x76, 0xf9, 0x68,
+ 0x77, 0x1, 0xf8, 0x69, 0xc3, 0x15, 0xf7, 0x31,
+ 0x6, 0x7b, 0x45, 0x5, 0xd7, 0x6, 0x9c, 0xd1,
+ 0x5, 0xba, 0x6, 0x9b, 0xcd, 0x5, 0x5d, 0x6,
+ 0xbd, 0xf7, 0x70, 0x5, 0x41, 0x6, 0xfb, 0x67,
+ 0xfb, 0x70, 0x5, 0xdf, 0x16, 0xee, 0xf6, 0x8d,
+ 0x89, 0x70, 0x22, 0x5, 0xfc, 0x93, 0xfb, 0x21,
+ 0x15, 0xd8, 0x6, 0xf8, 0xe9, 0xf9, 0x6d, 0x5,
+ 0x3e, 0x6, 0xfc, 0xa5, 0xfb, 0xfd, 0x15, 0xe2,
+ 0x6, 0xdf, 0xf7, 0xfb, 0x5, 0x55, 0x6, 0x72,
+ 0x74, 0x58, 0x66, 0x44, 0x70, 0x84, 0x89, 0x18,
+ 0x7a, 0x41, 0xac, 0x92, 0xb0, 0x96, 0xb2, 0x9e,
+ 0x19, 0xe, 0xf7, 0x5b, 0x7d, 0xd5, 0x51, 0x76,
+ 0xf7, 0xbe, 0xcd, 0xf8, 0x1, 0x77, 0x12, 0x13,
+ 0x70, 0xf7, 0x18, 0x78, 0x15, 0xdd, 0x6, 0xf9,
+ 0xe, 0xf9, 0x6d, 0x5, 0x39, 0x6, 0xfc, 0xb8,
+ 0xfb, 0xfd, 0x15, 0xe7, 0x6, 0xe5, 0xf7, 0xfb,
+ 0x5, 0x51, 0x6, 0x71, 0x74, 0x55, 0x66, 0x3f,
+ 0x70, 0x83, 0x89, 0x18, 0x79, 0x41, 0xaf, 0x92,
+ 0xb2, 0x96, 0xb4, 0x9e, 0x19, 0x13, 0xb0, 0xf7,
+ 0xaa, 0xfc, 0xe8, 0x15, 0xf7, 0x97, 0x6, 0x9e,
+ 0xd5, 0x91, 0xa, 0x9c, 0x9a, 0x94, 0x95, 0x96,
+ 0x92, 0x8, 0xf7, 0x1, 0xd9, 0x9a, 0xb3, 0xaf,
+ 0x1a, 0xbb, 0x66, 0xbe, 0x2f, 0xfb, 0x8, 0x7a,
+ 0x32, 0x74, 0x87, 0x1e, 0xe4, 0x7f, 0x5, 0xa3,
+ 0x91, 0x92, 0xad, 0xb0, 0x1b, 0xa5, 0x97, 0x79,
+ 0x7c, 0x70, 0x70, 0x76, 0x3e, 0x4e, 0x1f, 0x43,
+ 0x51, 0x6d, 0x6b, 0x82, 0x4e, 0x8, 0xe, 0xf7,
+ 0x5b, 0x92, 0x76, 0xf7, 0xfa, 0xce, 0xf7, 0xbf,
+ 0x77, 0x12, 0xf7, 0xb4, 0xe6, 0x45, 0xe5, 0x13,
+ 0xf0, 0xf8, 0x6f, 0xc3, 0x15, 0xf7, 0x38, 0x6,
+ 0x7a, 0x45, 0x5, 0xdb, 0x6, 0x9e, 0xd1, 0x5,
+ 0xbb, 0x6, 0x9c, 0xcd, 0x5, 0x5b, 0x6, 0xbf,
+ 0xf7, 0x70, 0x5, 0x3e, 0x6, 0xfb, 0x72, 0xfb,
+ 0x70, 0x5, 0xe3, 0x16, 0xf3, 0xf6, 0x8d, 0x89,
+ 0x70, 0x22, 0x5, 0xfc, 0xa2, 0xfb, 0x21, 0x15,
+ 0xdd, 0x6, 0xf9, 0x5, 0xf9, 0x6d, 0x5, 0x3b,
+ 0x6, 0xfd, 0x28, 0xfb, 0x96, 0x15, 0x76, 0x8e,
+ 0x98, 0x34, 0xf7, 0x8, 0x1b, 0xe9, 0xc1, 0xcc,
+ 0xbe, 0x1f, 0xb3, 0x67, 0x99, 0x9c, 0x1a, 0x13,
+ 0xe8, 0x98, 0xc3, 0x93, 0xc8, 0x1a, 0xb0, 0x6e,
+ 0xc5, 0x30, 0x26, 0x71, 0x42, 0x6f, 0x81, 0x1e,
+ 0xdf, 0x7d, 0x5, 0xaa, 0x94, 0x99, 0x9b, 0xa4,
+ 0x1b, 0x90, 0xa9, 0x8a, 0x6f, 0x59, 0x50, 0x91,
+ 0x7e, 0x8c, 0x1f, 0x7a, 0x44, 0x5, 0x13, 0xf0,
+ 0xa7, 0x92, 0xb3, 0x85, 0x65, 0x1a, 0x72, 0x76,
+ 0x73, 0x67, 0x66, 0x87, 0xa6, 0xa2, 0x87, 0x1e,
+ 0xe, 0x73, 0xfb, 0x57, 0xf2, 0xf8, 0x54, 0x77,
+ 0xcb, 0xf7, 0x18, 0x1, 0xc0, 0xf7, 0x1a, 0x3,
+ 0xf8, 0x40, 0xad, 0x15, 0xfb, 0xa, 0x70, 0x43,
+ 0x83, 0x60, 0x1b, 0x3e, 0x75, 0xb3, 0xab, 0xb0,
+ 0xa1, 0xa2, 0xe1, 0xd4, 0x1f, 0xf7, 0x4, 0xeb,
+ 0xb5, 0xbb, 0x9a, 0xee, 0x8, 0xfb, 0x15, 0x6,
+ 0x80, 0x4c, 0x77, 0x7b, 0x39, 0x48, 0x8, 0xfb,
+ 0xa, 0x2a, 0x58, 0x55, 0x3c, 0x1a, 0x36, 0xd1,
+ 0x31, 0xf7, 0x35, 0xf7, 0x50, 0xd0, 0xf7, 0x1c,
+ 0xd1, 0x9d, 0x1e, 0xfb, 0x72, 0xf8, 0x19, 0x15,
+ 0x9b, 0xa, 0xa8, 0xf7, 0x18, 0x65, 0xa, 0x34,
+ 0xa, 0xd7, 0xf7, 0x27, 0x1, 0xf8, 0x7d, 0xf9,
+ 0xa9, 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x27, 0x91,
+ 0xa, 0xfc, 0x3, 0xfe, 0x3c, 0x27, 0xa, 0x34,
+ 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x51, 0xf9,
+ 0xa8, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0xf7, 0x28,
+ 0x5, 0xfb, 0x33, 0x6, 0xfc, 0xaa, 0xfe, 0x3c,
+ 0x27, 0xa, 0x34, 0xa, 0xd6, 0xf7, 0x28, 0x1,
+ 0xf7, 0xd5, 0xf9, 0xa8, 0x15, 0xf7, 0x9, 0x6,
+ 0xe0, 0xe1, 0xb1, 0x35, 0x5, 0xec, 0x6, 0x4f,
+ 0xf7, 0x28, 0x66, 0xa, 0xfc, 0x53, 0xfe, 0x3c,
+ 0x27, 0xa, 0x34, 0xa, 0xe3, 0xf7, 0xe, 0x39,
+ 0xdd, 0x12, 0x13, 0xe8, 0xf7, 0xed, 0xf9, 0xb2,
+ 0x15, 0xcc, 0x6, 0x98, 0x90, 0x94, 0xa9, 0xab,
+ 0x1b, 0xaa, 0xa0, 0x82, 0x80, 0x9e, 0x1f, 0x13,
+ 0xf0, 0x80, 0xa0, 0x9e, 0x82, 0xa7, 0x1b, 0xbb,
+ 0xb6, 0xb4, 0xdc, 0x98, 0x1f, 0x49, 0x6, 0x72,
+ 0x83, 0x84, 0x7b, 0x77, 0x1b, 0x74, 0x78, 0x94,
+ 0x94, 0x74, 0x1f, 0x96, 0x73, 0x71, 0x95, 0x67,
+ 0x1b, 0x46, 0x75, 0x43, 0x58, 0x80, 0x1f, 0xfb,
+ 0xd9, 0xfd, 0xb2, 0x27, 0xa, 0x34, 0xa, 0xde,
+ 0xf7, 0xb, 0x1, 0xf7, 0xed, 0xf9, 0xb0, 0x8f,
+ 0xa, 0xa4, 0xf7, 0xb, 0x5, 0xfb, 0xd, 0x6,
+ 0xf7, 0x4a, 0xfb, 0xb, 0x8f, 0xa, 0xa5, 0xf7,
+ 0xb, 0x7a, 0xa, 0xfc, 0xc3, 0xfe, 0x27, 0x27,
+ 0xa, 0x34, 0xa, 0xf7, 0x58, 0xc0, 0x1, 0x9f,
+ 0xf9, 0x3e, 0x3, 0x9f, 0x16, 0x25, 0xa, 0x29,
+ 0xf8, 0xdb, 0x15, 0x56, 0xb6, 0x5f, 0xc0, 0xbe,
+ 0xb6, 0xb5, 0xc2, 0xc3, 0x61, 0xb1, 0x57, 0x54,
+ 0x62, 0x64, 0x54, 0x1e, 0xbf, 0x16, 0xa3, 0x9e,
+ 0x9c, 0xa4, 0xa2, 0x9f, 0x7b, 0x72, 0x72, 0x77,
+ 0x78, 0x74, 0x73, 0x77, 0x9e, 0xa4, 0x1e, 0xe,
+ 0xf8, 0x1, 0x8b, 0xf7, 0xd, 0xc6, 0xf7, 0xc,
+ 0x98, 0xf7, 0xd, 0xf7, 0x39, 0xf7, 0xb, 0x1,
+ 0x90, 0x16, 0xf7, 0x2c, 0x6, 0xf1, 0xf7, 0x48,
+ 0x5, 0xf7, 0x83, 0x6, 0x66, 0xfb, 0x48, 0x5,
+ 0xf8, 0x99, 0x50, 0xa, 0xfc, 0x10, 0x6, 0xb3,
+ 0xf7, 0x54, 0x5, 0xf7, 0xdd, 0x50, 0xa, 0xfb,
+ 0xdd, 0x6, 0xaf, 0xf7, 0x39, 0x5, 0xf7, 0xf3,
+ 0x6, 0xa4, 0xf7, 0xb, 0x5, 0xfd, 0x39, 0x6,
+ 0x2c, 0xfc, 0x36, 0x15, 0xf7, 0x3e, 0xf7, 0xbf,
+ 0x5, 0xe2, 0x6, 0x4d, 0xfb, 0xbf, 0x5, 0xe,
+ 0xe2, 0xfb, 0x63, 0x76, 0xf7, 0x27, 0xf7, 0x4b,
+ 0xfb, 0x11, 0xf7, 0x11, 0xf8, 0x90, 0xf7, 0x13,
+ 0x12, 0xf6, 0xf7, 0x2c, 0xf7, 0x38, 0xed, 0x13,
+ 0xbc, 0xf7, 0x88, 0xfb, 0x36, 0x15, 0x70, 0x51,
+ 0x5, 0x83, 0xbe, 0xc7, 0x8b, 0x93, 0x1b, 0xf1,
+ 0xde, 0xaa, 0xd9, 0xc6, 0x5b, 0xa7, 0x51, 0x91,
+ 0x1f, 0x8d, 0x7, 0xf7, 0x61, 0x92, 0xe6, 0xf7,
+ 0x23, 0xb1, 0xf3, 0xfb, 0x2f, 0xa2, 0x18, 0xfb,
+ 0x9, 0x64, 0x37, 0x69, 0x4e, 0x1b, 0x27, 0x58,
+ 0xe6, 0xef, 0xf7, 0xb, 0x80, 0xa, 0x68, 0x92,
+ 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3e, 0x76,
+ 0xfb, 0x15, 0xce, 0xfb, 0x1c, 0x1b, 0xfb, 0x84,
+ 0xfb, 0x30, 0xfb, 0x5e, 0xfb, 0x86, 0xfb, 0x31,
+ 0xcd, 0xfb, 0x33, 0xf7, 0x67, 0x1f, 0x8c, 0x87,
+ 0x89, 0x87, 0x1b, 0x5b, 0x82, 0x73, 0x56, 0x5,
+ 0x13, 0xdc, 0x8e, 0x99, 0x9d, 0x8e, 0xa0, 0x1b,
+ 0xbd, 0x9a, 0x77, 0x79, 0x5c, 0x2e, 0x8b, 0x7c,
+ 0x7e, 0x5c, 0x8e, 0x8c, 0x80, 0x1f, 0xe, 0x41,
+ 0xa, 0xbb, 0x95, 0xa, 0xd7, 0x16, 0x2c, 0xa,
+ 0xf7, 0xa2, 0xbb, 0x15, 0xea, 0x6, 0x4d, 0xf7,
+ 0x2b, 0x5b, 0xa, 0xe, 0x41, 0xa, 0xf7, 0x5b,
+ 0x77, 0x1, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0x4f,
+ 0xbb, 0x15, 0xe9, 0x6, 0xf7, 0x32, 0xf7, 0x2b,
+ 0x53, 0xa, 0xe, 0x41, 0xa, 0xbb, 0x95, 0xa,
+ 0xd7, 0xf9, 0x3d, 0x3, 0xd7, 0x16, 0x2c, 0xa,
+ 0xe4, 0xbb, 0x15, 0xf7, 0x9, 0x6, 0xe0, 0xe4,
+ 0xb1, 0x32, 0x5, 0xec, 0x6, 0x4f, 0xf7, 0x2b,
+ 0x66, 0xa, 0xe, 0xab, 0x8b, 0xf7, 0xe, 0xf7,
+ 0x5c, 0xf7, 0x10, 0xf7, 0x3c, 0xf7, 0xf, 0x1,
+ 0xf7, 0xec, 0xf9, 0xad, 0x15, 0xf7, 0xd, 0x5f,
+ 0xa, 0xf7, 0xc, 0x4f, 0xa, 0xfb, 0xc, 0x6,
+ 0xfc, 0x87, 0xfe, 0x27, 0x15, 0x2c, 0xa, 0xe,
+ 0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xbd, 0xf9,
+ 0xa5, 0x15, 0xe5, 0x6, 0x50, 0x67, 0xa, 0xfb,
+ 0x14, 0x6, 0xfb, 0x1c, 0xfe, 0x3c, 0x15, 0xf7,
+ 0x3f, 0xf9, 0x74, 0x5, 0x5e, 0xa, 0xfb, 0x40,
+ 0xfd, 0x74, 0x5, 0xe, 0x4e, 0xa, 0xf7, 0x70,
+ 0x77, 0x1, 0xcb, 0x16, 0x46, 0xa, 0x90, 0xbc,
+ 0x15, 0xf6, 0x6, 0xf7, 0x49, 0x67, 0xa, 0xfb,
+ 0x3f, 0x6, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa,
+ 0xf7, 0xf, 0xf9, 0xa5, 0x15, 0xf7, 0x11, 0x6,
+ 0xe6, 0xe4, 0xb4, 0x32, 0x5, 0xf3, 0x6, 0x4b,
+ 0xf7, 0x2b, 0x3d, 0xa, 0xfb, 0x6b, 0xfe, 0x3c,
+ 0x15, 0x46, 0xa, 0xe, 0x4e, 0xa, 0xd8, 0xf7,
+ 0xe, 0x1, 0xf7, 0x1f, 0xf9, 0xad, 0x6a, 0xa,
+ 0xf7, 0x4b, 0xfb, 0xe, 0x6a, 0xa, 0xfb, 0xc8,
+ 0xfe, 0x27, 0x15, 0x46, 0xa, 0xe, 0x57, 0xa,
+ 0xd3, 0x16, 0xf7, 0x99, 0x6, 0xf7, 0x7e, 0xf7,
+ 0x66, 0xf7, 0x22, 0xf7, 0xa7, 0xf7, 0x71, 0xfb,
+ 0x1a, 0xdb, 0xfb, 0x6c, 0x1f, 0xfb, 0x59, 0x6,
+ 0x49, 0xfb, 0xc3, 0x5, 0x3d, 0x6, 0x73, 0xfb,
+ 0x4, 0x5, 0xd8, 0x6, 0xf7, 0x5, 0xfb, 0x4d,
+ 0x15, 0xb2, 0xf7, 0x4d, 0x5, 0xf7, 0x32, 0x6,
+ 0xa3, 0xf7, 0x4, 0x5, 0xfb, 0x31, 0x6, 0xb3,
+ 0xf7, 0x4d, 0x5, 0xe1, 0x6, 0xd9, 0xf5, 0x84,
+ 0xfb, 0x44, 0xfb, 0x8a, 0xfb, 0x15, 0x56, 0xfb,
+ 0x3d, 0x1f, 0xe, 0x68, 0xa, 0xf9, 0x73, 0x77,
+ 0x1, 0x8a, 0xa, 0xf2, 0xf8, 0x82, 0x5c, 0xa,
+ 0xf7, 0x59, 0xfc, 0x82, 0x5, 0x9b, 0xa, 0xf7,
+ 0x2d, 0xf9, 0x73, 0x3d, 0xa, 0x25, 0xfc, 0x80,
+ 0x51, 0xa, 0xfb, 0x5a, 0xf8, 0x80, 0x3d, 0xa,
+ 0xf7, 0x12, 0xca, 0x15, 0xca, 0x6, 0x8f, 0x99,
+ 0x95, 0xaa, 0xaa, 0x89, 0xab, 0x89, 0x9e, 0x81,
+ 0x9c, 0x81, 0x9e, 0x81, 0x9b, 0x81, 0xab, 0x8d,
+ 0xba, 0x8d, 0xb6, 0xb2, 0x97, 0xdc, 0x8, 0x4a,
+ 0x63, 0xa, 0x77, 0x78, 0x93, 0x94, 0x76, 0x1f,
+ 0x96, 0x73, 0x70, 0x96, 0x67, 0x1b, 0x47, 0x75,
+ 0x43, 0x58, 0x82, 0x1f, 0xe, 0x49, 0xa, 0xf8,
+ 0x9e, 0xf9, 0xa4, 0x75, 0xa, 0xfb, 0xca, 0x2b,
+ 0xa, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0xcf,
+ 0x77, 0x36, 0xa, 0xf8, 0x54, 0xf9, 0xa4, 0x15,
+ 0xea, 0x6, 0xf7, 0x37, 0x5d, 0xa, 0xfb, 0x2e,
+ 0x6, 0xfc, 0x51, 0x2b, 0xa, 0x49, 0xa, 0xf7,
+ 0xef, 0xf9, 0xa4, 0x15, 0xf7, 0xb, 0x6, 0xe2,
+ 0xe5, 0xb3, 0x31, 0x5, 0xee, 0x6, 0x4e, 0xf7,
+ 0x2c, 0x91, 0xa, 0xfc, 0x19, 0x2b, 0xa, 0xf7,
+ 0x23, 0x78, 0xf7, 0x13, 0xf9, 0x70, 0xde, 0x36,
+ 0xa, 0xf8, 0xa, 0xf9, 0xb1, 0x15, 0xcb, 0x6,
+ 0x99, 0x8f, 0x95, 0xa8, 0xa9, 0x1b, 0xac, 0xa0,
+ 0x82, 0x81, 0x9f, 0x1f, 0x80, 0x9e, 0x9d, 0x81,
+ 0xa4, 0x1b, 0xbb, 0xb5, 0xb4, 0xdd, 0x97, 0x1f,
+ 0x4a, 0x63, 0xa, 0x76, 0x79, 0x94, 0x94, 0x76,
+ 0x1f, 0x96, 0x74, 0x70, 0x95, 0x66, 0x1b, 0x47,
+ 0x75, 0x43, 0x57, 0x81, 0x1f, 0xfb, 0x9f, 0xfc,
+ 0x97, 0x21, 0xa, 0xe, 0x8c, 0xa, 0xf8, 0x8f,
+ 0xf7, 0x12, 0x36, 0xa, 0xf6, 0xf7, 0xae, 0x21,
+ 0xa, 0xf7, 0xc, 0xf8, 0x92, 0x15, 0xf7, 0xf,
+ 0x71, 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x4d, 0xfb,
+ 0xf, 0x15, 0xf7, 0x10, 0x71, 0xa, 0xfb, 0x10,
+ 0x6, 0xe, 0x58, 0xa1, 0x76, 0xf8, 0x8c, 0x77,
+ 0x1, 0xc5, 0xec, 0x15, 0xf7, 0x0, 0x2c, 0xf7,
+ 0x46, 0xf7, 0x31, 0xf7, 0x49, 0xfb, 0x32, 0xf7,
+ 0x2, 0xec, 0xfb, 0x49, 0xf7, 0x31, 0xf7, 0x47,
+ 0xf7, 0x2f, 0x20, 0xea, 0xfb, 0x47, 0xfb, 0x31,
+ 0xfb, 0x48, 0xf7, 0x31, 0xfb, 0x2, 0x2b, 0xf7,
+ 0x49, 0xfb, 0x30, 0x5, 0xe, 0xf7, 0x23, 0x85,
+ 0x76, 0xf9, 0x98, 0x77, 0x1, 0xe0, 0xf7, 0xb,
+ 0xf8, 0x21, 0xf7, 0x3, 0x3, 0xf8, 0xea, 0xf8,
+ 0x9c, 0x15, 0x98, 0x76, 0x94, 0x55, 0x65, 0x1a,
+ 0xfb, 0xf, 0x23, 0xfb, 0x2b, 0xfb, 0x32, 0x5a,
+ 0x65, 0x8b, 0x94, 0x7b, 0x1e, 0x4f, 0xca, 0x15,
+ 0x80, 0x97, 0x82, 0xb2, 0xb6, 0x1a, 0xf7, 0x14,
+ 0xf3, 0xf7, 0x3b, 0xf7, 0x31, 0xc3, 0xb4, 0x89,
+ 0x84, 0x93, 0x1e, 0xfc, 0x93, 0xfc, 0xc4, 0x15,
+ 0xd1, 0x57, 0xd7, 0xde, 0x5, 0x6c, 0xc0, 0xc5,
+ 0x84, 0xc0, 0x1b, 0xf7, 0xac, 0xf7, 0x3, 0xf7,
+ 0x62, 0xf7, 0x4b, 0xc4, 0x87, 0xe7, 0x64, 0xc7,
+ 0x1f, 0xd3, 0xd8, 0x46, 0xbf, 0x44, 0x3e, 0x5,
+ 0xa8, 0x58, 0x4e, 0x97, 0x4e, 0x1b, 0xfb, 0xc1,
+ 0x31, 0xfb, 0x8c, 0xfb, 0x36, 0x59, 0x95, 0x3b,
+ 0xb4, 0x4f, 0x1f, 0xe, 0x2d, 0xa, 0xf7, 0x30,
+ 0xbc, 0x15, 0xed, 0x6, 0x4a, 0xf7, 0x2c, 0x81,
+ 0xa, 0x2d, 0xa, 0xb6, 0xc1, 0x60, 0xa, 0xe2,
+ 0x78, 0xf7, 0x14, 0xf9, 0x3c, 0xf7, 0x27, 0x24,
+ 0xa, 0x68, 0xc1, 0x45, 0xa, 0xe2, 0x78, 0xf7,
+ 0x14, 0xf9, 0x6, 0x77, 0xdb, 0xf7, 0xc, 0x24,
+ 0xa, 0x85, 0xc7, 0x3a, 0xa, 0xab, 0xa0, 0x76,
+ 0xf9, 0x74, 0x77, 0xf7, 0x70, 0x77, 0x1, 0x64,
+ 0xa, 0xf7, 0xa5, 0xf7, 0xcc, 0xf8, 0x63, 0x43,
+ 0xa, 0xfb, 0x5d, 0xfb, 0xcf, 0xfb, 0x10, 0xf7,
+ 0xcf, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x55, 0x5,
+ 0xcb, 0xf8, 0x86, 0x15, 0xe4, 0x6, 0xf7, 0x2a,
+ 0xf7, 0x2b, 0x92, 0xa, 0xe, 0xab, 0xa0, 0x76,
+ 0xf7, 0x1d, 0xf7, 0xc, 0xf7, 0x60, 0xf7, 0xc,
+ 0xf7, 0x1d, 0x77, 0x1, 0xf8, 0xcc, 0xf7, 0x28,
+ 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xa8, 0xf7,
+ 0x1d, 0x5, 0xeb, 0x6, 0xf7, 0x52, 0xf7, 0x44,
+ 0xba, 0xf7, 0x61, 0xf7, 0x48, 0xfb, 0x3e, 0x97,
+ 0x57, 0x1f, 0xfb, 0x27, 0x6, 0xa8, 0xf7, 0x1d,
+ 0x53, 0xa, 0xbf, 0xfc, 0x61, 0x15, 0xb7, 0xf7,
+ 0x60, 0x5, 0xf6, 0x6, 0xd7, 0xc9, 0x8d, 0x41,
+ 0xfb, 0xc, 0xfb, 0x1a, 0x7f, 0xfb, 0x1, 0x1f,
+ 0xe, 0x73, 0x7d, 0xf7, 0x8, 0x38, 0x76, 0xf9,
+ 0x7, 0xf5, 0x12, 0xf8, 0x94, 0xf7, 0x25, 0x13,
+ 0x70, 0xd0, 0x89, 0x15, 0xf7, 0x2e, 0x6, 0xf2,
+ 0xf8, 0x56, 0x5, 0xe1, 0x9e, 0xa0, 0xe6, 0xe2,
+ 0x1b, 0xb4, 0x97, 0x7b, 0x74, 0x73, 0x77, 0x6d,
+ 0x79, 0x77, 0x1f, 0x61, 0x5b, 0x79, 0x61, 0x63,
+ 0x1a, 0x5e, 0xa4, 0x5e, 0xb2, 0x55, 0x1e, 0x9c,
+ 0x72, 0xa2, 0x65, 0x6e, 0x1a, 0x13, 0xb0, 0x72,
+ 0x7c, 0x78, 0x5c, 0x65, 0x7c, 0x9f, 0x9b, 0x7e,
+ 0x1e, 0xfb, 0x1, 0x53, 0x5, 0x66, 0xa7, 0xcf,
+ 0x50, 0xef, 0x1b, 0xf7, 0x1c, 0xbd, 0xd1, 0xdc,
+ 0xc1, 0x73, 0xc7, 0x68, 0xb6, 0x1f, 0x6a, 0xb2,
+ 0x7b, 0xa0, 0xa3, 0x1a, 0xa2, 0x98, 0x9b, 0xa0,
+ 0xaa, 0x1e, 0xac, 0xbb, 0xaf, 0xcf, 0xc4, 0x1a,
+ 0xc4, 0x5c, 0xc0, 0xfb, 0x1a, 0xfb, 0x63, 0x5a,
+ 0xfb, 0x0, 0xfb, 0x43, 0x61, 0x1e, 0xe, 0x42,
+ 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76, 0xa, 0xf8,
+ 0x1a, 0x89, 0x20, 0xa, 0x13, 0xb0, 0x2a, 0xa,
+ 0x70, 0xf7, 0xf2, 0x15, 0xf2, 0x6, 0x48, 0xf7,
+ 0x2c, 0x93, 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1,
+ 0xf3, 0xf7, 0x5f, 0x77, 0x12, 0xc2, 0xf7, 0x2b,
+ 0x13, 0x78, 0xf7, 0xe8, 0xf8, 0xea, 0x15, 0xf5,
+ 0x6, 0xf7, 0x49, 0x5d, 0xa, 0xfb, 0x3e, 0x6,
+ 0x48, 0xfd, 0x84, 0x20, 0xa, 0x13, 0xb8, 0x2e,
+ 0xa, 0x42, 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76,
+ 0xa, 0xf7, 0x62, 0xf8, 0xea, 0x15, 0xf7, 0x11,
+ 0x6, 0xe7, 0xe5, 0xb4, 0x31, 0x5, 0xf3, 0x6,
+ 0x4b, 0xf7, 0x2c, 0x92, 0xa, 0xa7, 0xfd, 0x84,
+ 0x20, 0xa, 0x13, 0xb0, 0x2e, 0xa, 0x42, 0xa,
+ 0xf8, 0xc5, 0xdd, 0x89, 0x77, 0x12, 0xc2, 0xf7,
+ 0x2b, 0x13, 0xa8, 0xf7, 0x7f, 0xf8, 0xf7, 0x15,
+ 0xd2, 0x6, 0x90, 0x9a, 0x95, 0xa7, 0xad, 0x8c,
+ 0xaa, 0x8c, 0xa6, 0x7f, 0xa6, 0x80, 0x8, 0x82,
+ 0xa2, 0xa0, 0x82, 0xa1, 0x1b, 0xbf, 0xba, 0xb4,
+ 0xdc, 0x99, 0x1f, 0x43, 0x6, 0x72, 0x83, 0x83,
+ 0x7b, 0x75, 0x1b, 0x77, 0x79, 0x91, 0x93, 0x76,
+ 0x1f, 0x13, 0x58, 0x97, 0x70, 0x6b, 0x98, 0x5e,
+ 0x1b, 0x40, 0x72, 0x43, 0x57, 0x80, 0x1f, 0xf7,
+ 0x2f, 0xfc, 0xf9, 0x20, 0xa, 0x13, 0xa8, 0x2e,
+ 0xa, 0x3c, 0x7d, 0xf6, 0x2c, 0xea, 0x12, 0xc2,
+ 0xf7, 0x22, 0x13, 0x60, 0xf7, 0x6d, 0xf8, 0xf3,
+ 0x6d, 0xa, 0xf7, 0x56, 0xfb, 0xe, 0x6d, 0xa,
+ 0x40, 0xfd, 0x6f, 0x20, 0xa, 0x13, 0xa0, 0x2e,
+ 0xa, 0x42, 0xa, 0xf7, 0xba, 0xf7, 0x33, 0x23,
+ 0xf3, 0xad, 0xf7, 0x57, 0x56, 0x77, 0x12, 0xc2,
+ 0xf7, 0x23, 0x13, 0xaa, 0xf7, 0xb3, 0xf9, 0x3a,
+ 0x15, 0x56, 0xba, 0x5f, 0xc4, 0xc3, 0xb9, 0xb5,
+ 0xc2, 0xc2, 0x5d, 0xb6, 0x53, 0x4f, 0x5f, 0x60,
+ 0x54, 0x1e, 0xc3, 0x16, 0x13, 0x56, 0xa4, 0xa0,
+ 0x9f, 0xa6, 0xa4, 0xa0, 0x79, 0x70, 0x73, 0x76,
+ 0x77, 0x72, 0x70, 0x76, 0x9f, 0xa3, 0x1e, 0xba,
+ 0xfd, 0x3c, 0x32, 0xa, 0x99, 0xca, 0x9a, 0xc0,
+ 0x1e, 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7b,
+ 0xf7, 0x4, 0xfb, 0x59, 0x27, 0xfb, 0x4, 0x6b,
+ 0xfb, 0xd, 0x60, 0x1e, 0xf7, 0x28, 0x7f, 0x5,
+ 0xba, 0x98, 0xb1, 0x99, 0xb8, 0x1b, 0xcf, 0xa6,
+ 0x5b, 0x54, 0x71, 0x1f, 0x6c, 0x80, 0x55, 0x88,
+ 0x4f, 0x84, 0x8, 0x42, 0x87, 0xfb, 0x2f, 0x7d,
+ 0xfb, 0x33, 0x1a, 0x28, 0xd6, 0x52, 0xe1, 0x1e,
+ 0x13, 0xaa, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f,
+ 0x8e, 0x70, 0x8b, 0x82, 0x93, 0x72, 0x8, 0x99,
+ 0xf7, 0x7b, 0x15, 0x31, 0xa, 0x91, 0xe6, 0x98,
+ 0x1f, 0xe, 0xf7, 0x92, 0x7d, 0xf7, 0x1, 0xf7,
+ 0x11, 0xe3, 0xf7, 0x1b, 0xf2, 0x1, 0xc3, 0xf7,
+ 0x17, 0xf8, 0xef, 0xf7, 0x19, 0x3, 0xf7, 0x7,
+ 0xf8, 0x1e, 0x15, 0xf7, 0x1f, 0x7d, 0x5, 0xa4,
+ 0x94, 0x99, 0xb1, 0xd0, 0x1b, 0xce, 0xa2, 0x60,
+ 0x50, 0x7f, 0x1f, 0x7b, 0x86, 0x7c, 0x84, 0xfb,
+ 0x0, 0x82, 0x8, 0x35, 0x83, 0xfb, 0x23, 0x86,
+ 0xfb, 0x31, 0x1a, 0x28, 0xd3, 0x4a, 0xec, 0xf7,
+ 0x15, 0xd0, 0xe7, 0xac, 0xa3, 0x1e, 0x6e, 0x99,
+ 0xb8, 0x2b, 0xf7, 0x22, 0x1b, 0xf7, 0x36, 0xcf,
+ 0xf7, 0x11, 0xab, 0x9e, 0x1f, 0xfb, 0x17, 0x9f,
+ 0x5, 0x46, 0x64, 0x50, 0x8b, 0x7d, 0x1b, 0x4f,
+ 0x5a, 0xbb, 0xd9, 0x88, 0x1f, 0xf8, 0x7, 0x6,
+ 0x94, 0xb4, 0x8c, 0xb0, 0x9a, 0x1a, 0xf7, 0x1f,
+ 0x37, 0xe9, 0xfb, 0x1b, 0x64, 0x3f, 0x85, 0x4e,
+ 0x4b, 0x1e, 0x9f, 0x7f, 0x6d, 0xba, 0xfb, 0x12,
+ 0x1b, 0xfb, 0x1b, 0x39, 0x4d, 0x31, 0x72, 0x1f,
+ 0xf8, 0x4a, 0x35, 0x15, 0xf7, 0x5, 0xa4, 0xd7,
+ 0xa1, 0xb1, 0x1b, 0xcb, 0xb3, 0x5b, 0x34, 0x85,
+ 0x1f, 0xfc, 0x15, 0x52, 0x15, 0x43, 0x7c, 0x56,
+ 0x37, 0x3a, 0x1b, 0x55, 0x7c, 0xab, 0xa2, 0xbb,
+ 0xbf, 0xad, 0xf7, 0x3a, 0x9e, 0x1f, 0xe, 0x3c,
+ 0xfb, 0x63, 0x76, 0xf9, 0x2c, 0xf7, 0x2, 0x1,
+ 0xda, 0xf7, 0x23, 0xe4, 0xe2, 0x3, 0xf7, 0x8a,
+ 0x67, 0x15, 0x72, 0x55, 0x5, 0xa0, 0x8e, 0xd0,
+ 0x9b, 0x5d, 0x1a, 0x56, 0x2c, 0x8d, 0x61, 0x8c,
+ 0x1e, 0x71, 0x52, 0x5, 0x88, 0x9e, 0xa4, 0x8a,
+ 0x9e, 0x1b, 0xa6, 0xf7, 0x34, 0x8b, 0xf7, 0x3,
+ 0x97, 0x89, 0xc7, 0x3c, 0x98, 0x1f, 0x8d, 0x7,
+ 0xa7, 0x8c, 0xbc, 0x90, 0xbd, 0xad, 0xa3, 0x9a,
+ 0xc5, 0xb6, 0xae, 0xed, 0xfb, 0x20, 0xa3, 0x18,
+ 0x33, 0x6c, 0x50, 0x7c, 0x6f, 0x1b, 0x64, 0x61,
+ 0xb1, 0xd2, 0xe3, 0xb4, 0xf7, 0x2c, 0xf7, 0x4,
+ 0xd7, 0x93, 0x46, 0x77, 0x8e, 0x1f, 0xf7, 0x1d,
+ 0x9a, 0x5, 0xe3, 0x84, 0x4f, 0xeb, 0xfb, 0x28,
+ 0x1b, 0xfb, 0x3f, 0xfb, 0x1a, 0xfb, 0x1e, 0xfb,
+ 0x68, 0x22, 0xc9, 0x2d, 0xdd, 0x7a, 0x1f, 0x89,
+ 0x96, 0xb2, 0x83, 0x88, 0x1b, 0x89, 0x8a, 0x7f,
+ 0x89, 0x81, 0x88, 0x8, 0xe, 0x3c, 0xf7, 0x71,
+ 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x1, 0xd1, 0xf7,
+ 0x21, 0xf7, 0x8c, 0xf7, 0x1a, 0x3, 0xf7, 0x67,
+ 0xf7, 0x71, 0x23, 0xa, 0x35, 0xf7, 0xb5, 0x15,
+ 0xef, 0x6, 0x4a, 0xf7, 0x2c, 0x47, 0xa, 0xe,
+ 0x3c, 0xf7, 0x71, 0xe3, 0xf8, 0x4d, 0x77, 0x1,
+ 0xce, 0xf7, 0x2c, 0xf7, 0x7e, 0xf7, 0x23, 0x3,
+ 0xf7, 0xd8, 0xf8, 0xea, 0x15, 0xf3, 0x6, 0xf7,
+ 0x46, 0x5d, 0xa, 0xfb, 0x3c, 0x6, 0xfb, 0x77,
+ 0xfc, 0xa5, 0x23, 0xa, 0xe, 0x3c, 0x7d, 0xf2,
+ 0xf7, 0x18, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x7d,
+ 0xa, 0xf7, 0x4c, 0xf8, 0xea, 0x8f, 0xa, 0xe5,
+ 0xe5, 0xb3, 0x31, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+ 0x2c, 0x54, 0xa, 0xfb, 0x12, 0xfc, 0xa5, 0x23,
+ 0xa, 0xe, 0x3c, 0x7d, 0xf1, 0xf7, 0x17, 0xe1,
+ 0x1, 0xd1, 0xf7, 0x23, 0xf7, 0x8b, 0xf7, 0x1a,
+ 0x3, 0xf7, 0x6b, 0xf8, 0xf3, 0x15, 0xf7, 0x13,
+ 0x6e, 0xa, 0xfb, 0x13, 0x6, 0xf7, 0x52, 0xfb,
+ 0xe, 0x15, 0xf7, 0x13, 0x6e, 0xa, 0xfb, 0x12,
+ 0x6, 0xfb, 0x8b, 0xfc, 0x90, 0x23, 0xa, 0xe,
+ 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xd0, 0x16,
+ 0x3c, 0xa, 0xc7, 0xd0, 0x15, 0xe7, 0x6, 0x4f,
+ 0x67, 0xa, 0xfb, 0x18, 0x6, 0xe, 0x48, 0xa,
+ 0xf9, 0x82, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0xeb,
+ 0x15, 0xf5, 0x6, 0xf7, 0x48, 0x67, 0xa, 0xfb,
+ 0x3e, 0x6, 0xfb, 0x79, 0xfd, 0x82, 0x15, 0x3c,
+ 0xa, 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa,
+ 0xc9, 0xf8, 0xeb, 0x15, 0xf7, 0x15, 0x6, 0xe9,
+ 0xe4, 0xb5, 0x32, 0x5, 0xf6, 0x6, 0x49, 0x67,
+ 0xa, 0xfb, 0x25, 0x6, 0xfb, 0x2e, 0xfd, 0x82,
+ 0x15, 0x3c, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xf3,
+ 0xf7, 0xe, 0x1, 0xe6, 0xf8, 0xf3, 0x15, 0xf7,
+ 0xe, 0x5f, 0xa, 0xf7, 0xe, 0x6, 0xa4, 0xf7,
+ 0xe, 0x5, 0xfb, 0xd, 0x6, 0xfb, 0x93, 0xfd,
+ 0x6d, 0x15, 0x3c, 0xa, 0xe, 0x73, 0x7d, 0xf7,
+ 0x3, 0xf7, 0xd8, 0xf7, 0x4, 0xf7, 0x60, 0x77,
+ 0x1, 0xdd, 0xf7, 0x28, 0xf7, 0xae, 0xf7, 0x2f,
+ 0x3, 0xf7, 0xe7, 0xf8, 0xcf, 0x15, 0xf7, 0x13,
+ 0xb6, 0xac, 0x52, 0x98, 0x5a, 0x93, 0x68, 0x19,
+ 0x88, 0x89, 0x5, 0xa4, 0x76, 0x67, 0xb0, 0x32,
+ 0x1b, 0xfb, 0x42, 0xfb, 0x7, 0xfb, 0x26, 0xfb,
+ 0x36, 0x26, 0xc2, 0xfb, 0x1e, 0xf7, 0x68, 0xf7,
+ 0x87, 0xd6, 0xf7, 0x4e, 0xf7, 0x18, 0xf7, 0x1e,
+ 0x68, 0xf7, 0x6, 0x53, 0xed, 0x1f, 0xe9, 0xad,
+ 0x7a, 0xbc, 0x20, 0x65, 0x81, 0x9b, 0x87, 0x91,
+ 0x7f, 0x9b, 0x19, 0x9a, 0xa, 0xae, 0x64, 0x93,
+ 0x82, 0x9c, 0x6f, 0xfb, 0x9, 0x63, 0x18, 0x30,
+ 0xfc, 0x20, 0x15, 0xdd, 0xc2, 0xf7, 0x6, 0xf7,
+ 0x6, 0xbe, 0xc9, 0x6c, 0x35, 0x57, 0x5f, 0xfb,
+ 0x2f, 0xfb, 0x10, 0x3c, 0x68, 0xd1, 0xc5, 0x1e,
+ 0xe, 0x84, 0xa, 0xf8, 0xf8, 0xf7, 0x11, 0x39,
+ 0xdd, 0x89, 0x77, 0x12, 0xf8, 0x84, 0xf7, 0x2a,
+ 0x13, 0xc8, 0xcc, 0x16, 0xf7, 0x29, 0x6, 0xbb,
+ 0xf7, 0x6f, 0x9d, 0xdc, 0x91, 0xad, 0xa7, 0xb0,
+ 0x19, 0xad, 0xa7, 0xb9, 0xb0, 0xb9, 0x1b, 0xba,
+ 0x9a, 0x71, 0x6a, 0x70, 0x85, 0x6c, 0x85, 0x75,
+ 0x1f, 0x49, 0xfb, 0xc3, 0x5, 0xf7, 0x29, 0x6,
+ 0xcd, 0xf7, 0xc2, 0x5, 0x94, 0xb2, 0x8f, 0xb8,
+ 0xb4, 0x1a, 0xc1, 0x65, 0xcb, 0x22, 0x32, 0x4d,
+ 0x5f, 0x65, 0x60, 0x1e, 0x89, 0x8d, 0x99, 0xce,
+ 0x5, 0xfb, 0x20, 0x6, 0xe3, 0xdb, 0x15, 0xcd,
+ 0x6, 0x13, 0xa8, 0x90, 0x99, 0x94, 0xa7, 0xab,
+ 0x8c, 0xa6, 0x8c, 0xa0, 0x80, 0xa1, 0x7f, 0xa1,
+ 0x81, 0xa0, 0x82, 0xa6, 0x8c, 0xbc, 0x8e, 0xb7,
+ 0xb1, 0x98, 0xdc, 0x8, 0x48, 0x6, 0x72, 0x83,
+ 0x84, 0x7b, 0x77, 0x1b, 0x78, 0x78, 0x91, 0x93,
+ 0x78, 0x1f, 0x13, 0x98, 0x97, 0x70, 0x6d, 0x98,
+ 0x65, 0x1b, 0x13, 0xc8, 0x44, 0x74, 0x43, 0x58,
+ 0x81, 0x1f, 0xe, 0x4c, 0xa, 0xdd, 0xf7, 0x70,
+ 0x22, 0xa, 0xf7, 0x4c, 0xf8, 0xe, 0x15, 0xee,
+ 0x6, 0x4b, 0xf7, 0x2c, 0x65, 0xa, 0x73, 0x7d,
+ 0xf7, 0x1, 0xf9, 0x23, 0x77, 0x1, 0xdd, 0xf7,
+ 0x28, 0xf7, 0x9d, 0xf7, 0x28, 0x3, 0xf7, 0xfe,
+ 0xf8, 0xea, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0x5d,
+ 0xa, 0xfb, 0x33, 0x6, 0xfc, 0x19, 0xfc, 0xa6,
+ 0x22, 0xa, 0xe, 0x4c, 0xa, 0xf7, 0x73, 0xf8,
+ 0xea, 0x15, 0xf7, 0xd, 0x6, 0xe4, 0xe5, 0xb3,
+ 0x31, 0x5, 0xf0, 0x6, 0x4c, 0xf7, 0x2c, 0x5b,
+ 0xa, 0xfb, 0xb9, 0xfc, 0xa6, 0x22, 0xa, 0xe,
+ 0x73, 0x7d, 0xf7, 0x1, 0xf8, 0xc4, 0xdd, 0x89,
+ 0x77, 0x12, 0xdd, 0xf7, 0x26, 0xf7, 0xa4, 0xf7,
+ 0x26, 0x13, 0xd8, 0xf7, 0x9b, 0xf8, 0xf7, 0x15,
+ 0xcc, 0x6, 0x8f, 0x9a, 0x94, 0xa7, 0xab, 0x8c,
+ 0xa4, 0x8c, 0xa5, 0x7c, 0xa7, 0x80, 0x9f, 0x82,
+ 0xa0, 0x84, 0x9e, 0x8c, 0xbb, 0x8e, 0xb6, 0xb1,
+ 0x98, 0xdc, 0x8, 0x48, 0x63, 0xa, 0x77, 0x78,
+ 0x92, 0x93, 0x76, 0x1f, 0x13, 0xb8, 0x97, 0x70,
+ 0x6d, 0x97, 0x6a, 0x1b, 0x45, 0x74, 0x43, 0x57,
+ 0x82, 0x1f, 0xfb, 0x49, 0xfc, 0x1b, 0x22, 0xa,
+ 0xe, 0x73, 0x7d, 0xf7, 0x0, 0x3f, 0xa, 0xf7,
+ 0x91, 0xf8, 0xf3, 0x15, 0xf7, 0x12, 0x6e, 0xa,
+ 0xfb, 0x12, 0x6, 0xf7, 0x50, 0xfb, 0xe, 0x15,
+ 0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x11, 0x6, 0xfc,
+ 0x30, 0xfc, 0x91, 0x22, 0xa, 0xe, 0x58, 0xf7,
+ 0x4d, 0xf7, 0x1d, 0x1, 0xf7, 0xa6, 0xf7, 0x24,
+ 0x3, 0xdd, 0xf7, 0x4d, 0x15, 0xf8, 0xa4, 0xf7,
+ 0x1d, 0xfc, 0xa4, 0x6, 0xf7, 0x54, 0xda, 0x15,
+ 0xf7, 0x24, 0xf7, 0x27, 0xfb, 0x24, 0x6, 0xfc,
+ 0xe2, 0x4, 0xf7, 0x24, 0xf7, 0x25, 0xfb, 0x24,
+ 0x6, 0xe, 0xfb, 0x8, 0x83, 0x76, 0xb1, 0xeb,
+ 0xf7, 0xd5, 0xeb, 0xb1, 0x77, 0x1, 0xd3, 0xf7,
+ 0xb, 0xf7, 0x68, 0xf7, 0xc, 0x3, 0x9e, 0x9a,
+ 0x15, 0xc2, 0x5f, 0xcb, 0xce, 0x5, 0x70, 0xc3,
+ 0xc0, 0x89, 0xac, 0x1b, 0xf7, 0x59, 0xeb, 0xf7,
+ 0x24, 0xf7, 0x28, 0xbf, 0x7b, 0xd0, 0x73, 0xa8,
+ 0x1f, 0xca, 0xcd, 0x52, 0xb6, 0x4b, 0x49, 0x5,
+ 0xa6, 0x56, 0x4d, 0x8c, 0x72, 0x1b, 0xfb, 0x97,
+ 0x69, 0xfb, 0x6c, 0x32, 0x48, 0x9b, 0x59, 0xa2,
+ 0x78, 0x1f, 0xe3, 0xe7, 0x15, 0x88, 0x93, 0x86,
+ 0x98, 0xa2, 0x1a, 0xd7, 0xc2, 0xf7, 0x19, 0xf7,
+ 0x7, 0xb0, 0x9e, 0x80, 0x87, 0x94, 0x1e, 0xfb,
+ 0x47, 0xfb, 0xb8, 0x15, 0xf7, 0x76, 0xf7, 0x82,
+ 0x5, 0x8e, 0x80, 0x92, 0x73, 0x76, 0x1a, 0x49,
+ 0x5d, 0xfb, 0x16, 0xfb, 0x13, 0x67, 0x7b, 0x94,
+ 0x90, 0x80, 0x1e, 0xe, 0x59, 0xa, 0xf8, 0x91,
+ 0xf7, 0x2c, 0x29, 0xa, 0x79, 0xf8, 0xa5, 0x75,
+ 0xa, 0xe, 0x59, 0xa, 0xf9, 0x29, 0x77, 0x29,
+ 0xa, 0x21, 0xf8, 0xaa, 0x60, 0xa, 0x59, 0xa,
+ 0xf8, 0x96, 0xf7, 0x27, 0x29, 0xa, 0xfb, 0x74,
+ 0xf8, 0xaa, 0x45, 0xa, 0x59, 0xa, 0x12, 0x13,
+ 0x40, 0x28, 0xa, 0x13, 0x80, 0x35, 0xa, 0x13,
+ 0x40, 0xfb, 0x2f, 0xf8, 0xb0, 0x3a, 0xa, 0x3c,
+ 0xfb, 0x55, 0x76, 0xfa, 0x58, 0x77, 0x1, 0xcb,
+ 0xf8, 0xf6, 0x3, 0xc2, 0x30, 0x15, 0x7e, 0xfb,
+ 0x0, 0x7e, 0xa, 0xcb, 0xee, 0xc2, 0x1f, 0xf7,
+ 0xd1, 0xf8, 0xd9, 0x77, 0xa, 0xfc, 0x28, 0x51,
+ 0xa, 0x59, 0xf8, 0x28, 0x54, 0xa, 0xe5, 0xfc,
+ 0xa4, 0x5, 0x4e, 0x6c, 0xa, 0xf7, 0xa5, 0xf9,
+ 0x46, 0x15, 0xe7, 0x6, 0xf7, 0x31, 0xf7, 0x2b,
+ 0x94, 0xa, 0xe, 0x73, 0xfb, 0x4f, 0x76, 0xf7,
+ 0x51, 0xf6, 0xf7, 0xea, 0xf0, 0xf7, 0x4f, 0x77,
+ 0x1, 0x9d, 0xf7, 0x23, 0xf7, 0xec, 0xf7, 0x20,
+ 0x3, 0xf7, 0x70, 0xcc, 0x15, 0x3d, 0xbd, 0xd8,
+ 0x85, 0xac, 0x1b, 0xf7, 0x2d, 0xf7, 0x4, 0xf7,
+ 0x2d, 0xf7, 0x3e, 0xe9, 0x69, 0xf7, 0x19, 0xfb,
+ 0x2b, 0x40, 0x58, 0x66, 0x79, 0x73, 0x1f, 0xbd,
+ 0xf7, 0x86, 0x47, 0xa, 0xfb, 0x5b, 0xfe, 0x32,
+ 0x8d, 0xa, 0xed, 0xf8, 0x3d, 0x15, 0xc0, 0xab,
+ 0xf7, 0x34, 0xf7, 0x5, 0xc1, 0xba, 0x60, 0x38,
+ 0x4a, 0x67, 0xfb, 0x2b, 0xfb, 0x1, 0x6a, 0x47,
+ 0xa2, 0xf5, 0x1e, 0xe, 0x3c, 0xfb, 0x55, 0x76,
+ 0xf9, 0xca, 0xf7, 0xd, 0x1, 0xc2, 0x2f, 0x15,
+ 0x7e, 0x20, 0x7e, 0xa, 0xca, 0xee, 0xc2, 0x1f,
+ 0xf7, 0xd1, 0xf8, 0xd8, 0x77, 0xa, 0xfc, 0x29,
+ 0x51, 0xa, 0x59, 0xf8, 0x29, 0x54, 0xa, 0xe5,
+ 0xfc, 0xa4, 0x5, 0x4f, 0x6c, 0xa, 0xf7, 0x42,
+ 0xf9, 0x50, 0x6b, 0xa, 0xf7, 0x47, 0xfb, 0xd,
+ 0x6b, 0xa, 0xe, 0x78, 0x9e, 0xf8, 0xa8, 0x99,
+ 0xf7, 0x40, 0x9e, 0x6, 0xfb, 0x6d, 0x95, 0x7,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf2,
+ 0xa, 0xf7, 0x2a, 0xb, 0xf2, 0x9c, 0x93, 0xc,
+ 0xc, 0xf7, 0xe1, 0x14, 0xf9, 0xf, 0x15, 0xb1,
+ 0x13, 0x0, 0x7c, 0x2, 0x0, 0x1, 0x0, 0x31,
+ 0x0, 0x6d, 0x0, 0x7a, 0x0, 0xc0, 0x1, 0x5,
+ 0x1, 0x2a, 0x1, 0x51, 0x1, 0x55, 0x1, 0x87,
+ 0x1, 0x93, 0x1, 0xa3, 0x1, 0xa8, 0x1, 0xc7,
+ 0x1, 0xd1, 0x1, 0xd4, 0x1, 0xdc, 0x1, 0xea,
+ 0x1, 0xf8, 0x2, 0x4, 0x2, 0x11, 0x2, 0x1b,
+ 0x2, 0x2a, 0x2, 0x34, 0x2, 0x3b, 0x2, 0x44,
+ 0x2, 0x4d, 0x2, 0x56, 0x2, 0x5e, 0x2, 0x67,
+ 0x2, 0x6c, 0x2, 0x71, 0x2, 0x7b, 0x2, 0x80,
+ 0x2, 0x8d, 0x2, 0x94, 0x2, 0x99, 0x2, 0x9e,
+ 0x2, 0xaf, 0x2, 0xb9, 0x2, 0xbe, 0x2, 0xc3,
+ 0x2, 0xcf, 0x2, 0xe2, 0x2, 0xea, 0x2, 0xf5,
+ 0x3, 0x7, 0x3, 0xd, 0x3, 0x12, 0x3, 0x18,
+ 0x3, 0x1c, 0x3, 0x26, 0x3, 0x2b, 0x3, 0x30,
+ 0x3, 0x34, 0x3, 0x3e, 0x3, 0x4d, 0x3, 0x54,
+ 0x3, 0x5a, 0x3, 0x5f, 0x3, 0x63, 0x3, 0x67,
+ 0x3, 0x6b, 0x3, 0x6f, 0x3, 0x7a, 0x3, 0x84,
+ 0x3, 0x91, 0x3, 0x9e, 0x3, 0xa6, 0x3, 0xae,
+ 0x3, 0xb1, 0x3, 0xb5, 0x3, 0xb9, 0x3, 0xbd,
+ 0x3, 0xc9, 0x3, 0xcf, 0x3, 0xd8, 0x3, 0xe4,
+ 0x3, 0xef, 0x3, 0xf4, 0x3, 0xfa, 0x4, 0x0,
+ 0x4, 0x6, 0x4, 0xc, 0x4, 0x17, 0x4, 0x22,
+ 0x4, 0x2c, 0x4, 0x33, 0x4, 0x38, 0x4, 0x3f,
+ 0x4, 0x46, 0x4, 0x4b, 0x4, 0x50, 0x4, 0x54,
+ 0x4, 0x5e, 0x4, 0x68, 0x4, 0x72, 0x4, 0x7c,
+ 0x4, 0x7f, 0x4, 0x83, 0x4, 0x87, 0x4, 0x8b,
+ 0x4, 0x8f, 0x4, 0x95, 0x4, 0x9e, 0x4, 0xa7,
+ 0x4, 0xb0, 0x4, 0xb6, 0x4, 0xbb, 0x4, 0xc1,
+ 0x4, 0xc6, 0x4, 0xcb, 0x4, 0xd0, 0x4, 0xd5,
+ 0x4, 0xda, 0x4, 0xde, 0x4, 0xe3, 0x4, 0xe8,
+ 0x4, 0xec, 0x4, 0xf0, 0x4, 0xf4, 0x4, 0xf8,
+ 0x4, 0xfc, 0x5, 0x0, 0x5, 0x4, 0x2f, 0xa,
+ 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7c, 0xf7,
+ 0x4, 0x33, 0xa, 0x7f, 0x5, 0xb9, 0x98, 0xb1,
+ 0x9a, 0xb8, 0x1b, 0xce, 0xa8, 0x5b, 0x54, 0x70,
+ 0x1f, 0x6c, 0x81, 0x54, 0x86, 0x50, 0x85, 0x8,
+ 0x42, 0x86, 0xfb, 0x2f, 0x7f, 0xfb, 0x34, 0x1a,
+ 0x28, 0xd6, 0x52, 0xe1, 0x1e, 0xb, 0x15, 0xfb,
+ 0x23, 0xe3, 0xfb, 0x32, 0xf7, 0x69, 0xf7, 0xb1,
+ 0xf7, 0x16, 0xf7, 0x95, 0xf7, 0x56, 0xf7, 0x49,
+ 0xfb, 0x6, 0xf7, 0x13, 0xfb, 0x53, 0xfb, 0xc9,
+ 0x25, 0xfb, 0xb4, 0xfb, 0x3e, 0x1e, 0xf7, 0x2a,
+ 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x3d, 0xf7, 0x29,
+ 0xf7, 0x3, 0xc2, 0x34, 0x2a, 0xfb, 0xa, 0x3b,
+ 0xfb, 0x61, 0xfb, 0x3c, 0x2a, 0x44, 0xd1, 0xf4,
+ 0x1e, 0xb, 0x15, 0xfb, 0x11, 0xde, 0xfb, 0x1,
+ 0x38, 0xa, 0xf7, 0x36, 0x26, 0xa, 0xb, 0x15,
+ 0xf8, 0x8, 0x6, 0x94, 0xae, 0x8c, 0xb3, 0x99,
+ 0x1a, 0xf0, 0x5d, 0xf7, 0x1c, 0xfb, 0x41, 0xfb,
+ 0x6e, 0x35, 0xfb, 0x33, 0xfb, 0x1b, 0xfb, 0x24,
+ 0xe9, 0xfb, 0xf, 0xf7, 0x2d, 0xd7, 0xf7, 0x1,
+ 0xa6, 0xf7, 0x15, 0xcc, 0x1e, 0xfb, 0x1a, 0xa1,
+ 0x5, 0x7a, 0x83, 0x6a, 0x51, 0x41, 0x1b, 0x4d,
+ 0x5a, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, 0x15,
+ 0xbe, 0x95, 0xaf, 0xde, 0xe1, 0x1b, 0xd8, 0xa6,
+ 0x4c, 0x44, 0x88, 0x1f, 0xb, 0x1, 0xf7, 0x8,
+ 0xf7, 0x28, 0x3, 0xf7, 0x6b, 0xf9, 0x73, 0x15,
+ 0x3a, 0xfc, 0x2a, 0x5, 0x81, 0x5f, 0x83, 0x59,
+ 0x5b, 0x1a, 0xfb, 0x1, 0xc2, 0x2a, 0xf7, 0x62,
+ 0xf7, 0xa3, 0xb6, 0xf7, 0x64, 0xf7, 0x20, 0xa8,
+ 0x1e, 0xdf, 0xf8, 0x2a, 0x5, 0x97, 0xa, 0x37,
+ 0xfc, 0x2a, 0x5, 0xfb, 0x13, 0x71, 0x78, 0x2e,
+ 0xfb, 0x20, 0x1b, 0x2b, 0x73, 0xb4, 0xc5, 0xaf,
+ 0x94, 0xb5, 0x94, 0xb6, 0x1f, 0xdf, 0xf8, 0x2a,
+ 0x5, 0xb, 0x5e, 0xa, 0xe1, 0xf7, 0x36, 0x5,
+ 0xf7, 0xaf, 0x6, 0xa3, 0xfb, 0x36, 0x5, 0xf7,
+ 0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x71, 0x43, 0xa,
+ 0x27, 0xfc, 0x54, 0x15, 0xf7, 0x30, 0xf7, 0xba,
+ 0x5c, 0xa, 0xb3, 0xfb, 0xba, 0x5, 0xb, 0xf7,
+ 0xe, 0x48, 0xf7, 0xa, 0xfb, 0x4f, 0xfb, 0x7d,
+ 0x41, 0xfb, 0x4c, 0xfb, 0x21, 0x1e, 0xf7, 0x25,
+ 0x16, 0xcb, 0xb0, 0xf7, 0x2b, 0xf7, 0x11, 0xdb,
+ 0xa8, 0x3d, 0x57, 0x29, 0x56, 0xfb, 0x4, 0x21,
+ 0x3f, 0x67, 0xcb, 0xc8, 0x1e, 0xb, 0x15, 0x25,
+ 0xa, 0xe, 0xf8, 0x31, 0x89, 0x15, 0x82, 0xa,
+ 0xf7, 0x2, 0xf8, 0xa7, 0x47, 0xa, 0x57, 0xfb,
+ 0x8e, 0x5, 0x46, 0x71, 0x7f, 0xfb, 0xd, 0xfb,
+ 0xe, 0x1b, 0x5e, 0x7d, 0xa4, 0xad, 0xa1, 0x90,
+ 0xa4, 0x91, 0xa0, 0x1f, 0xcc, 0xf7, 0xcd, 0x44,
+ 0xa, 0x4d, 0xfb, 0xba, 0x5, 0x85, 0x6a, 0x81,
+ 0x60, 0x62, 0x1a, 0xb, 0x12, 0x13, 0x60, 0x28,
+ 0xa, 0x13, 0xa0, 0x35, 0xa, 0x13, 0x60, 0xb,
+ 0x30, 0xa, 0x9c, 0xf7, 0x8e, 0x15, 0x88, 0x78,
+ 0x5, 0x31, 0xa, 0x90, 0xe6, 0x99, 0x1f, 0xb,
+ 0xfd, 0x22, 0x21, 0xa, 0xe, 0xf8, 0xc4, 0x6,
+ 0xa5, 0xf7, 0x10, 0x5, 0xfc, 0x31, 0x6, 0xb3,
+ 0xf7, 0x5a, 0x70, 0xa, 0xf7, 0x10, 0x5, 0xfb,
+ 0xfe, 0x6, 0xad, 0xf7, 0x3c, 0x6f, 0xa, 0xf7,
+ 0xf, 0x90, 0xa, 0xb, 0xe2, 0x78, 0xf7, 0x14,
+ 0xf9, 0x6, 0x77, 0x24, 0xa, 0xb, 0x2a, 0xa,
+ 0xe, 0x32, 0xa, 0x9a, 0xca, 0x99, 0xc0, 0x1e,
+ 0xb, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f, 0x8d,
+ 0x70, 0x8c, 0x82, 0x93, 0x72, 0x8, 0xb, 0x5f,
+ 0x81, 0x77, 0x30, 0x20, 0x1b, 0x5a, 0x77, 0xab,
+ 0xa7, 0xd6, 0xf7, 0xa, 0xb, 0x15, 0xf7, 0x27,
+ 0x6, 0x83, 0xa6, 0x87, 0x9e, 0xaa, 0x1a, 0xbc,
+ 0xb, 0xfb, 0x5a, 0x27, 0xfb, 0x3, 0x6b, 0xfb,
+ 0xd, 0x5f, 0x1e, 0xf7, 0x28, 0xb, 0x68, 0xa,
+ 0xf7, 0x36, 0xf7, 0xf, 0xf8, 0x54, 0x77, 0xb,
+ 0x46, 0xa6, 0x4c, 0xf7, 0x6, 0xcd, 0xce, 0xa9,
+ 0xc2, 0xc2, 0x1e, 0x8d, 0x89, 0x5, 0xb, 0x1,
+ 0xf6, 0xf7, 0x2a, 0xf8, 0x34, 0xf7, 0x2a, 0x3,
+ 0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb,
+ 0xf7, 0x3d, 0xf7, 0x59, 0xf7, 0x4, 0xf7, 0x31,
+ 0xb, 0x15, 0xf7, 0xc, 0x40, 0xa, 0xfb, 0xc,
+ 0x6, 0xb, 0x39, 0xa, 0xf7, 0x48, 0xfb, 0xc,
+ 0x39, 0xa, 0xe, 0xf7, 0x2, 0x97, 0xc1, 0xa2,
+ 0xf5, 0x18, 0xb, 0xf7, 0x1c, 0x6, 0xf4, 0xf8,
+ 0xa6, 0x5b, 0xa, 0xb, 0x5, 0xfb, 0x21, 0x6,
+ 0xb, 0x8e, 0xa2, 0x3b, 0xa, 0xb, 0x1, 0xdd,
+ 0xf7, 0x25, 0xf7, 0xa3, 0xf7, 0x25, 0x3, 0xb,
+ 0x6, 0xa4, 0x83, 0xa, 0xb, 0xab, 0x8b, 0xf7,
+ 0x10, 0xf7, 0x5a, 0xf7, 0x10, 0xf7, 0x3c, 0xf7,
+ 0xf, 0xb, 0x3c, 0x7d, 0xf7, 0x0, 0x2b, 0xeb,
+ 0xb, 0x5, 0xfb, 0x37, 0x6, 0xb, 0x5, 0xfb,
+ 0x24, 0x6, 0xb, 0x15, 0xf7, 0x8, 0x6, 0xe0,
+ 0xe2, 0xb1, 0x34, 0x5, 0xec, 0x6, 0x4f, 0xf7,
+ 0x27, 0x66, 0xa, 0xe, 0xf7, 0x29, 0x6, 0xf7,
+ 0x40, 0xf9, 0x74, 0x5a, 0xa, 0xb, 0x5, 0xfb,
+ 0x23, 0x6, 0xb, 0xfb, 0xf9, 0xa0, 0x76, 0xb,
+ 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0x37, 0xf7,
+ 0x2c, 0x36, 0xa, 0xb, 0x15, 0xdb, 0x6, 0x57,
+ 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0x5b, 0x5, 0x2b,
+ 0x6, 0xfb, 0x39, 0xfb, 0x53, 0x5, 0xb, 0x7c,
+ 0xa, 0xa8, 0xf7, 0x26, 0x44, 0xa, 0xb, 0x73,
+ 0x7d, 0xf7, 0x1, 0xf8, 0x8b, 0xf7, 0x2c, 0x3f,
+ 0xa, 0xb, 0x15, 0xeb, 0x6, 0xf7, 0x39, 0xf7,
+ 0x59, 0x32, 0xf7, 0x67, 0x5, 0x3b, 0x6, 0xbf,
+ 0xfb, 0x67, 0x5, 0xb, 0x48, 0xa, 0xf9, 0x74,
+ 0x77, 0xb, 0x6, 0xa4, 0x55, 0xa, 0xb, 0x6,
+ 0xa4, 0xf7, 0xd, 0x5, 0xb, 0x5, 0x89, 0x6,
+ 0xb, 0x6, 0xf7, 0x44, 0xf7, 0x26, 0x5, 0xfb,
+ 0x3a, 0x6, 0xb, 0x5, 0xfb, 0x29, 0x6, 0xb,
+ 0x5, 0xfb, 0x1e, 0x6, 0xb, 0xf7, 0xe, 0x5,
+ 0xb, 0xf7, 0x1e, 0x8e, 0xa3, 0x3b, 0xa, 0xfb,
+ 0x1f, 0x6, 0xb, 0xe2, 0x8b, 0xf7, 0xa, 0xf8,
+ 0x76, 0xf7, 0xa, 0x1, 0xf9, 0x6, 0xf7, 0x2b,
+ 0x3, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+ 0xb, 0x73, 0x7d, 0xf2, 0x30, 0xe6, 0xb, 0x5,
+ 0xfb, 0x2a, 0x6, 0xb, 0x85, 0xa, 0x6, 0xb,
+ 0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x5, 0xb,
+ 0xf7, 0x2a, 0x6, 0xb, 0x4f, 0xa, 0xfb, 0xd,
+ 0x6, 0xf7, 0x49, 0xfb, 0xe, 0x15, 0xb, 0x15,
+ 0xe8, 0x6, 0xf7, 0x32, 0xf7, 0x27, 0x53, 0xa,
+ 0xe, 0x15, 0xca, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+ 0x5f, 0x82, 0x7e, 0x4d, 0x18, 0xb, 0xfb, 0x15,
+ 0x5, 0xca, 0x6, 0x7e, 0x53, 0x73, 0x7b, 0x5f,
+ 0x81, 0x8, 0xb, 0x6, 0x72, 0x84, 0x84, 0x7b,
+ 0x77, 0x1b, 0xb, 0xf7, 0xc0, 0x16, 0xf7, 0x20,
+ 0x6, 0xc1, 0xb, 0x3d, 0xa, 0xe, 0x98, 0xa,
+ 0x6, 0xb, 0xf7, 0x2b, 0x5, 0xb, 0xe2, 0xa0,
+ 0x76, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xa4, 0xf7,
+ 0x7, 0x5, 0xfb, 0xa, 0x6, 0xb, 0x86, 0xa,
+ 0xfb, 0xe, 0x6, 0xb, 0x15, 0xf7, 0xb, 0x50,
+ 0xa, 0xfb, 0xb, 0x6, 0xb, 0x72, 0x69, 0x63,
+ 0x5c, 0x1b, 0x86, 0x79, 0x8b, 0x93, 0x72, 0x1f,
+ 0xb, 0x15, 0xf7, 0x15, 0x6, 0xa6, 0x55, 0xa,
+ 0xfb, 0x15, 0x6, 0xb, 0x6, 0xa5, 0x55, 0xa,
+ 0xb, 0x5, 0xf8, 0x14, 0x6, 0xa4, 0xb, 0x5,
+ 0xf7, 0xfe, 0x6, 0xa4, 0xb, 0x6, 0xa5, 0xf7,
+ 0xf, 0x5, 0xb, 0xf8, 0xf0, 0xf7, 0x26, 0x1,
+ 0xb, 0xfb, 0x8a, 0xfb, 0x58, 0xf7, 0x7, 0xf7,
+ 0xb2, 0xf7, 0x8, 0xb, 0xfb, 0x11, 0x59, 0xfb,
+ 0x2f, 0x3b, 0x1e, 0xe8, 0x16, 0x9b, 0xb, 0x15,
+ 0xec, 0x6, 0x4c, 0x5d, 0xa, 0xfb, 0x1f, 0x6,
+ 0xb, 0x12, 0xc2, 0xf7, 0x23, 0x13, 0x70, 0xb,
+ 0x94, 0xa, 0xfb, 0x57, 0xb, 0x8d, 0x76, 0xf9,
+ 0x88, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0xa8,
+ 0x77, 0x1, 0xb, 0x5, 0xfb, 0xe, 0x6, 0xb,
+ 0x5, 0xfb, 0x27, 0x6, 0xb, 0xf7, 0x24, 0x6,
+ 0xb, 0x1, 0xd1, 0xf7, 0x22, 0xf7, 0x8b, 0xf7,
+ 0x1a, 0x3, 0xb, 0x5, 0x87, 0x9b, 0xb8, 0x80,
+ 0xb2, 0x1b, 0xf2, 0xae, 0xb, 0xfb, 0x58, 0xf7,
+ 0x2, 0xf9, 0x4e, 0xf7, 0x2, 0x1, 0xb, 0xcc,
+ 0xf7, 0x5a, 0xf7, 0x44, 0xf7, 0x9, 0x9c, 0x32,
+ 0xb, 0x54, 0xa, 0xe, 0xf7, 0x1b, 0x6, 0xb,
+ 0xf7, 0xc, 0x5, 0xb, 0x73, 0xa0, 0x76, 0xb,
+ 0x5, 0xfb, 0x1c, 0xb, 0x15, 0xf7, 0xe, 0x4f,
+ 0xa, 0xb, 0x73, 0x8b, 0xf7, 0xd, 0xf8, 0xe9,
+ 0x77, 0x1, 0xb, 0xf7, 0x77, 0xf5, 0x1, 0xbb,
+ 0xf7, 0x77, 0x15, 0xb, 0x6, 0xa1, 0xf7, 0x3,
+ 0x5, 0xfb, 0x3d, 0x6, 0xb, 0xd0, 0x16, 0xf7,
+ 0x21, 0x6, 0xb, 0x96, 0xa, 0xd7, 0x16, 0xb,
+ 0xf7, 0x23, 0x78, 0xf7, 0x12, 0xb, 0x5, 0xf7,
+ 0x23, 0x6, 0xb, 0x15, 0xf7, 0x1e, 0x6, 0xb,
+ 0x15, 0xf7, 0xe, 0x6, 0xb, 0x5, 0xfc, 0xa7,
+ 0x6, 0xb, 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x5,
+ 0x9a, 0xa, 0xb, 0x5, 0xfb, 0x26, 0x6, 0xb,
+ 0x5, 0xfb, 0x28, 0x6, 0xb, 0xf7, 0x2b, 0x1,
+ 0xb, 0xf7, 0xc, 0x1, 0xb, 0xfb, 0x2b, 0x6,
+ 0xb, 0x5, 0xfb, 0x17, 0xb, 0xa0, 0xe8, 0x93,
+ 0xb, 0xfb, 0x22, 0x6, 0xb, 0xf7, 0x22, 0x6,
+ 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
new file mode 100644
index 0000000000..9ac2edec66
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansItalicFontData [16339] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x14,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74, 0x61,
+ 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27,
+ 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d,
+ 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4, 0x7f,
+ 0xc, 0x2, 0xfb, 0x3e, 0xfb, 0x75, 0xfa, 0xf0,
+ 0xfa, 0x4b, 0x5, 0xf7, 0x36, 0xf, 0xf9, 0x1,
+ 0x11, 0xc3, 0x1c, 0x3a, 0xfc, 0x12, 0x0, 0x4,
+ 0x1, 0x1, 0x5, 0x2f, 0x44, 0x52, 0x45, 0x75,
+ 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f,
+ 0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69,
+ 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53,
+ 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+ 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+ 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+ 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+ 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+ 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+ 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+ 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+ 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+ 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+ 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+ 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+ 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+ 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+ 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+ 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+ 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+ 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+ 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+ 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+ 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+ 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+ 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+ 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+ 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+ 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+ 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+ 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+ 0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+ 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+ 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+ 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+ 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+ 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+ 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+ 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+ 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+ 0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+ 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+ 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+ 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+ 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+ 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+ 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+ 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+ 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+ 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+ 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+ 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+ 0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x3, 0x0, 0x36, 0x0, 0x82, 0x0,
+ 0x94, 0x0, 0xa7, 0x0, 0xb9, 0x0, 0xd1, 0x1,
+ 0x10, 0x1, 0x54, 0x1, 0xb3, 0x2, 0x5, 0x2,
+ 0x89, 0x2, 0xc9, 0x2, 0xf6, 0x3, 0x3, 0x3,
+ 0x10, 0x3, 0x1c, 0x3, 0x2f, 0x3, 0x87, 0x4,
+ 0x6, 0x4, 0x2e, 0x4, 0x8d, 0x4, 0xbc, 0x4,
+ 0xca, 0x4, 0xe6, 0x5, 0x6, 0x5, 0x29, 0x5,
+ 0x3e, 0x5, 0x72, 0x5, 0xa5, 0x5, 0xbb, 0x5,
+ 0xe6, 0x6, 0x17, 0x6, 0x3f, 0x6, 0xa1, 0x6,
+ 0xf1, 0x7, 0x77, 0x7, 0x9a, 0x7, 0xc3, 0x7,
+ 0xe8, 0x8, 0x5, 0x8, 0x84, 0x8, 0xd2, 0x9,
+ 0x12, 0x9, 0x91, 0x9, 0xec, 0xa, 0x59, 0xa,
+ 0xdf, 0xa, 0xff, 0xb, 0x47, 0xb, 0x84, 0xb,
+ 0xd6, 0xb, 0xf7, 0xc, 0x1f, 0xc, 0x71, 0xc,
+ 0x8c, 0xc, 0xc9, 0xc, 0xfa, 0xd, 0x22, 0xd,
+ 0x51, 0xd, 0x89, 0xd, 0xb1, 0xd, 0xee, 0xe,
+ 0x7c, 0xe, 0x9e, 0xe, 0xc3, 0xe, 0xda, 0xf,
+ 0x9, 0xf, 0xbb, 0xf, 0xda, 0x10, 0x79, 0x10,
+ 0xc2, 0x10, 0xe4, 0x11, 0x2e, 0x11, 0x63, 0x12,
+ 0x19, 0x12, 0x70, 0x12, 0xca, 0x12, 0xe2, 0x12,
+ 0xfc, 0x13, 0x4f, 0x13, 0xa6, 0x13, 0xca, 0x13,
+ 0xec, 0x14, 0x16, 0x14, 0x38, 0x14, 0x56, 0x14,
+ 0xa0, 0x14, 0xb7, 0x15, 0x2a, 0x15, 0x63, 0x15,
+ 0xce, 0x15, 0xee, 0x16, 0x6, 0x16, 0x26, 0x16,
+ 0xbd, 0x17, 0x35, 0x17, 0x90, 0x17, 0xc8, 0x18,
+ 0x16, 0x18, 0x50, 0x18, 0x61, 0x18, 0x92, 0x19,
+ 0x1f, 0x19, 0x31, 0x19, 0x42, 0x19, 0x99, 0x19,
+ 0xbc, 0x19, 0xe6, 0x1a, 0x4, 0x1a, 0x25, 0x1a,
+ 0x96, 0x1a, 0xad, 0x1a, 0xb8, 0x1a, 0xc1, 0x1a,
+ 0xe2, 0x1b, 0x51, 0x1b, 0x75, 0x1b, 0xa3, 0x1b,
+ 0xde, 0x1c, 0x22, 0x1c, 0x7a, 0x1c, 0xb7, 0x1d,
+ 0x16, 0x1d, 0x53, 0x1d, 0x70, 0x1d, 0xdd, 0x1e,
+ 0x52, 0x1e, 0x60, 0x1e, 0x89, 0x1e, 0xb7, 0x1e,
+ 0xe3, 0x1e, 0xfd, 0x1f, 0x1b, 0x1f, 0x5d, 0x1f,
+ 0x6b, 0x1f, 0x82, 0x1f, 0x9f, 0x1f, 0xbb, 0x1f,
+ 0xdd, 0x1f, 0xfd, 0x20, 0x13, 0x20, 0x51, 0x20,
+ 0x7c, 0x20, 0x8b, 0x20, 0xaf, 0x20, 0xcd, 0x20,
+ 0xee, 0x21, 0x52, 0x21, 0x66, 0x21, 0x7a, 0x21,
+ 0xcc, 0x21, 0xfd, 0x22, 0x3c, 0x22, 0xa1, 0x23,
+ 0x1b, 0x23, 0x72, 0x23, 0xb9, 0x23, 0xd7, 0x23,
+ 0xfb, 0x24, 0x23, 0x24, 0xba, 0x24, 0xeb, 0x25,
+ 0x3, 0x25, 0x2f, 0x25, 0xb0, 0x26, 0x16, 0x26,
+ 0x3c, 0x26, 0xc6, 0x27, 0x6, 0x27, 0x7c, 0x27,
+ 0xd3, 0x28, 0x29, 0x28, 0x52, 0x28, 0x88, 0x28,
+ 0xbd, 0x29, 0x5d, 0x29, 0x6b, 0x29, 0x7f, 0x2a,
+ 0x39, 0x2a, 0x5c, 0x2a, 0x9d, 0x2a, 0xf8, 0x2b,
+ 0x4b, 0x2b, 0xa1, 0x2b, 0xd2, 0x2b, 0xfa, 0x2c,
+ 0x12, 0x2c, 0x3e, 0x2c, 0x54, 0x2c, 0x6b, 0x2c,
+ 0x86, 0x2c, 0x9f, 0x2c, 0xd7, 0x2d, 0x7d, 0x2d,
+ 0xb7, 0x2e, 0x17, 0x2e, 0x8e, 0x2f, 0x26, 0x2f,
+ 0x55, 0x2f, 0x84, 0x2f, 0xe7, 0x2f, 0xfc, 0x2f,
+ 0xfe, 0x30, 0x8c, 0x30, 0xde, 0x31, 0x35, 0x31,
+ 0x95, 0x32, 0x30, 0x32, 0x8e, 0x32, 0xe2, 0x33,
+ 0x3e, 0x33, 0x8c, 0x33, 0xdc, 0x34, 0x27, 0x34,
+ 0x34, 0x34, 0x42, 0x34, 0x4e, 0x34, 0x62, 0x34,
+ 0x6f, 0x34, 0x8b, 0x34, 0xc1, 0x34, 0xf0, 0x35,
+ 0x27, 0x35, 0x75, 0x35, 0xc2, 0x36, 0x1b, 0x36,
+ 0x41, 0x36, 0x7a, 0x36, 0xbf, 0x77, 0xe, 0x35,
+ 0xa, 0xf7, 0x62, 0xd5, 0xf8, 0x4a, 0x77, 0x1,
+ 0x99, 0x16, 0xf4, 0x6, 0xf7, 0x7, 0xf7, 0x62,
+ 0x5, 0xf7, 0xb8, 0x6, 0xae, 0xfb, 0x62, 0x5,
+ 0xe8, 0x6, 0xfb, 0xa, 0xf9, 0x62, 0x5, 0xfb,
+ 0x5, 0x6, 0xfb, 0x28, 0xfc, 0x4a, 0x15, 0xf7,
+ 0x53, 0xf7, 0xfc, 0x48, 0xa, 0xb9, 0xfb, 0xfc,
+ 0x5, 0xe, 0xf9, 0x52, 0x8b, 0xdc, 0xf7, 0x10,
+ 0xdc, 0xb9, 0xdc, 0xf7, 0x74, 0xdc, 0x1, 0x93,
+ 0x16, 0xf7, 0x0, 0x6, 0xf7, 0x10, 0xf7, 0x61,
+ 0x5, 0xf7, 0xaa, 0x6, 0x60, 0xfb, 0x61, 0x5,
+ 0xf8, 0x98, 0x55, 0xa, 0xfc, 0x33, 0x6, 0xbf,
+ 0xf7, 0x8f, 0x5, 0xf8, 0x3, 0x55, 0xa, 0xfc,
+ 0x3, 0x6, 0xba, 0xf7, 0x74, 0x5, 0xf8, 0x7,
+ 0x55, 0xa, 0xfd, 0x1a, 0x6, 0xfb, 0x35, 0xfc,
+ 0x44, 0x15, 0xf7, 0x6b, 0xf7, 0xf3, 0x5, 0xf2,
+ 0x6, 0x42, 0xfb, 0xf3, 0x5, 0xe, 0x31, 0xa,
+ 0xf9, 0x13, 0x77, 0x1, 0xf8, 0x74, 0xf9, 0xae,
+ 0x36, 0xa, 0xfc, 0xc1, 0xfe, 0x35, 0x26, 0xa,
+ 0x31, 0xa, 0xf8, 0x8c, 0xf7, 0x1b, 0x1, 0xf7,
+ 0xc7, 0xf9, 0xae, 0x30, 0xa, 0xfc, 0x3b, 0xfe,
+ 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x93, 0xef,
+ 0x1, 0xf8, 0xb1, 0xf9, 0xb5, 0x2e, 0xa, 0xfc,
+ 0x4, 0xfe, 0x19, 0x26, 0xa, 0x31, 0xa, 0xf8,
+ 0x87, 0xf7, 0x20, 0x1, 0xf8, 0x78, 0xf9, 0xa9,
+ 0x56, 0xa, 0xf7, 0x20, 0x5, 0x20, 0x6, 0xfc,
+ 0xb, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8,
+ 0x77, 0xb0, 0xf7, 0x36, 0x76, 0x1, 0xf8, 0x28,
+ 0xb0, 0xf3, 0xb0, 0x3, 0xf8, 0x28, 0xf9, 0xf2,
+ 0x15, 0x59, 0xb4, 0x64, 0xbb, 0xbb, 0xb4, 0xb2,
+ 0xbd, 0xbd, 0x63, 0xb2, 0x5a, 0x5a, 0x63, 0x64,
+ 0x59, 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa2, 0xa3,
+ 0xa8, 0xa8, 0xa2, 0x74, 0x6d, 0x6e, 0x74, 0x75,
+ 0x6e, 0x6f, 0x73, 0xa1, 0xa8, 0x1e, 0xfc, 0x3f,
+ 0xfd, 0xf1, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x9a,
+ 0xf5, 0x8e, 0x77, 0x12, 0x13, 0xe0, 0xf8, 0x5,
+ 0xf9, 0xbc, 0x15, 0xc8, 0x66, 0xa, 0xa3, 0x1b,
+ 0xa7, 0xa1, 0x82, 0x82, 0x9e, 0x1f, 0x80, 0xa2,
+ 0x9f, 0x7e, 0xa0, 0x1b, 0xc5, 0xac, 0xc1, 0xc0,
+ 0x90, 0x1f, 0x50, 0x6, 0x7d, 0x87, 0x85, 0x73,
+ 0x5e, 0xa, 0x13, 0xd0, 0x95, 0x73, 0x70, 0x96,
+ 0x6e, 0x1b, 0x13, 0xe0, 0x48, 0x7a, 0x58, 0x51,
+ 0x7c, 0x1f, 0xfb, 0xf7, 0xfd, 0xbc, 0x26, 0xa,
+ 0xf8, 0x5, 0x8b, 0xdc, 0xf7, 0x8d, 0xdd, 0xf7,
+ 0x75, 0xdc, 0x1, 0xf8, 0xd4, 0xf1, 0x3, 0xd5,
+ 0x16, 0xf7, 0xfd, 0x6, 0xf7, 0x37, 0xec, 0xf7,
+ 0xd, 0xf5, 0xe5, 0x4b, 0xb3, 0x52, 0x9e, 0x1f,
+ 0xb6, 0x99, 0xea, 0xac, 0xf7, 0xa, 0x1a, 0xf7,
+ 0x22, 0xfb, 0x18, 0xae, 0xfb, 0xb, 0x1e, 0xfb,
+ 0x7b, 0x6, 0x64, 0xfd, 0x11, 0x15, 0xc1, 0xf7,
+ 0x8d, 0x5, 0xf7, 0x52, 0x6, 0xc9, 0xeb, 0x8a,
+ 0x25, 0xfb, 0x11, 0xfb, 0x13, 0x76, 0x22, 0x1f,
+ 0x29, 0xf7, 0xdf, 0x15, 0xbc, 0xf7, 0x75, 0x5,
+ 0xf7, 0x29, 0x6, 0xc7, 0xec, 0x8a, 0x2c, 0xfb,
+ 0x3, 0xfb, 0x6, 0x79, 0x31, 0x1f, 0xe, 0xf8,
+ 0x3c, 0x78, 0xdc, 0xf8, 0xe6, 0xdc, 0x1, 0xf7,
+ 0x14, 0xef, 0x3, 0xf9, 0x1b, 0xf7, 0x8f, 0x15,
+ 0x51, 0x79, 0x4a, 0xfb, 0x17, 0xfb, 0x2b, 0x1b,
+ 0x3c, 0xfb, 0x12, 0xb4, 0xf7, 0x53, 0xf7, 0x47,
+ 0xf2, 0xf7, 0x4b, 0xf7, 0x52, 0xf7, 0x28, 0xaa,
+ 0xfb, 0x8, 0x62, 0x92, 0x1f, 0xea, 0x93, 0x5,
+ 0xf7, 0x52, 0x75, 0xfb, 0x3a, 0xb3, 0x2e, 0x1b,
+ 0xfb, 0x7e, 0xfb, 0x33, 0xfb, 0x5d, 0xfb, 0x86,
+ 0xfb, 0x74, 0xf7, 0x1c, 0x32, 0xf7, 0x36, 0xf7,
+ 0x3b, 0xf7, 0x8, 0xf2, 0xf7, 0x2d, 0xc5, 0x1f,
+ 0xe, 0xf8, 0x3c, 0xfb, 0x75, 0xc6, 0xf7, 0x24,
+ 0xdc, 0xf8, 0xe9, 0xdc, 0x1, 0xf7, 0x0, 0xf0,
+ 0x3, 0xf7, 0x79, 0xfb, 0x37, 0x15, 0x72, 0x52,
+ 0x5, 0x87, 0xa6, 0xad, 0x8a, 0xa6, 0x1b, 0xf7,
+ 0x46, 0x9e, 0xd5, 0xa8, 0xc6, 0x53, 0x93, 0x77,
+ 0x8e, 0x1f, 0x99, 0xa9, 0xc8, 0x8e, 0xf7, 0x43,
+ 0xa6, 0xe0, 0xf7, 0x78, 0x19, 0x27, 0x98, 0x5,
+ 0x50, 0x78, 0x4c, 0xfb, 0x17, 0xfb, 0x2c, 0x1b,
+ 0x38, 0xfb, 0xe, 0xbe, 0xf7, 0x54, 0xf7, 0x48,
+ 0xf0, 0xf7, 0x42, 0xf7, 0x54, 0xf7, 0x28, 0xa8,
+ 0xfb, 0x9, 0x62, 0x93, 0x1f, 0xea, 0x93, 0x5,
+ 0xf7, 0x54, 0x76, 0xfb, 0x3b, 0xb2, 0x2f, 0x1b,
+ 0xfb, 0x7f, 0xfb, 0x33, 0xfb, 0x53, 0xfb, 0x88,
+ 0xfb, 0x35, 0xd0, 0xfb, 0x1c, 0xf7, 0x48, 0x73,
+ 0x1f, 0x6a, 0x47, 0x5, 0xc4, 0x8a, 0x9d, 0x7b,
+ 0x78, 0x1a, 0x5f, 0x43, 0x8c, 0x57, 0x82, 0x87,
+ 0x8d, 0x8c, 0x6a, 0x1e, 0xe, 0xf8, 0x3c, 0x8b,
+ 0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0xf9, 0x2c, 0xef,
+ 0x3, 0xdc, 0x16, 0xf7, 0x9b, 0x6, 0xf7, 0x6a,
+ 0xf7, 0x62, 0xf7, 0x12, 0xf7, 0xc0, 0xf7, 0x42,
+ 0xfb, 0xb, 0xf7, 0xa, 0xfb, 0x52, 0x1f, 0xfb,
+ 0x72, 0x6, 0x66, 0xfd, 0x11, 0x15, 0xf7, 0xa,
+ 0xf8, 0xc0, 0x5, 0xf7, 0x17, 0x6, 0xe0, 0xf7,
+ 0x1a, 0x87, 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x30,
+ 0x39, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b,
+ 0xdc, 0xf7, 0x8e, 0xdd, 0xf7, 0x74, 0xdc, 0x1,
+ 0xe1, 0x16, 0xf8, 0xbe, 0x6b, 0xa, 0xfc, 0x5d,
+ 0x6, 0xc2, 0xf7, 0x8e, 0x5, 0xf8, 0x2a, 0x6,
+ 0x9c, 0xdd, 0x5, 0xfc, 0x29, 0x6, 0xb7, 0xf7,
+ 0x74, 0x5, 0xf8, 0x3e, 0x6b, 0xa, 0xfc, 0xa0,
+ 0x6, 0xe, 0x32, 0xa, 0xf7, 0x53, 0x77, 0x2a,
+ 0xa, 0xf7, 0x1e, 0xc3, 0x36, 0xa, 0xe, 0x32,
+ 0xa, 0xc3, 0xf7, 0x1b, 0x2a, 0xa, 0xf7, 0x1,
+ 0xc3, 0x30, 0xa, 0xe, 0x32, 0xa, 0xca, 0xef,
+ 0x2a, 0xa, 0xf7, 0xa7, 0xca, 0x2e, 0xa, 0xe,
+ 0x32, 0xa, 0xbe, 0xf7, 0x20, 0x2a, 0xa, 0xf7,
+ 0x95, 0xbe, 0x56, 0xa, 0xf7, 0x20, 0x5, 0xfb,
+ 0x0, 0x6, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf7,
+ 0x8e, 0xdc, 0xf7, 0x75, 0xdc, 0x1, 0xf9, 0x2c,
+ 0xef, 0x3, 0xd8, 0x16, 0xf7, 0x9c, 0x6, 0xf7,
+ 0x6a, 0xf7, 0x65, 0xf7, 0x12, 0xf7, 0xbf, 0xf7,
+ 0x44, 0xfb, 0xb, 0xf7, 0x9, 0xfb, 0x55, 0x1f,
+ 0xfb, 0x6f, 0x6, 0x49, 0xfb, 0xc6, 0x5, 0x3a,
+ 0x6, 0x7a, 0x3a, 0x5, 0xdb, 0x6, 0xb6, 0xfb,
+ 0x8e, 0x15, 0xc2, 0xf7, 0x8e, 0x5, 0xf7, 0x64,
+ 0x6b, 0xa, 0xfb, 0x65, 0x6, 0xbd, 0xf7, 0x75,
+ 0x5, 0xf7, 0x14, 0x6, 0xe1, 0xf7, 0x1c, 0x86,
+ 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x33, 0x3a, 0xfb,
+ 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b, 0xd8, 0xf7,
+ 0x50, 0xcb, 0xc9, 0xcb, 0xf7, 0x4e, 0xd8, 0x1,
+ 0xd0, 0xf0, 0x3, 0x99, 0xf7, 0x9d, 0x15, 0xc2,
+ 0x6, 0xfb, 0x38, 0x97, 0xf2, 0x26, 0xf7, 0x4b,
+ 0x1b, 0xb8, 0xb6, 0x92, 0x9a, 0xb2, 0x1f, 0xa3,
+ 0xf0, 0x5, 0x6c, 0x62, 0x5b, 0x7c, 0x55, 0x1b,
+ 0xfb, 0x12, 0x44, 0xda, 0xf7, 0x1, 0x83, 0x1f,
+ 0xf7, 0xcb, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xda,
+ 0x6, 0x8e, 0x9f, 0x8c, 0xa1, 0x90, 0x9f, 0x8,
+ 0xf7, 0xdf, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xd9,
+ 0x6, 0xf6, 0xb8, 0xdf, 0xda, 0xf7, 0x17, 0x1b,
+ 0xc6, 0xc4, 0x7b, 0x5f, 0xae, 0x1f, 0xb6, 0xdc,
+ 0x5, 0xb3, 0x54, 0x45, 0x9b, 0x46, 0x1b, 0xfb,
+ 0x46, 0xfb, 0x1c, 0xfb, 0x3, 0xfb, 0x2c, 0x56,
+ 0x1f, 0x4a, 0x6, 0x7d, 0x4b, 0x5, 0xc9, 0x6,
+ 0x87, 0x77, 0x89, 0x75, 0x8a, 0x77, 0x8, 0x62,
+ 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf7, 0xd9,
+ 0xdd, 0xf7, 0x7a, 0xdc, 0x1, 0xe1, 0x16, 0xf0,
+ 0x6, 0xd3, 0xf7, 0xd9, 0x5, 0xf8, 0x19, 0x6,
+ 0x9d, 0xdd, 0x5, 0xfc, 0x19, 0x6, 0xbd, 0xf7,
+ 0x7a, 0x5, 0xf8, 0x1b, 0x6b, 0xa, 0xfc, 0x81,
+ 0x6, 0xe, 0x6c, 0xa, 0xf7, 0x70, 0xdd, 0xf7,
+ 0xb8, 0xdc, 0x1, 0xf7, 0x3, 0xef, 0x3, 0xf8,
+ 0x43, 0xf7, 0xae, 0x15, 0xf7, 0x75, 0x6, 0x6a,
+ 0xfb, 0x31, 0x5, 0x78, 0x67, 0x37, 0x5f, 0x33,
+ 0x1b, 0xfb, 0x15, 0x40, 0xf7, 0x1, 0xf7, 0x6,
+ 0xf7, 0x69, 0xf7, 0xc, 0xf7, 0x32, 0xf7, 0x49,
+ 0xe5, 0xd8, 0x5f, 0xfb, 0x4, 0xa2, 0x1f, 0xec,
+ 0x95, 0x5, 0xf7, 0x26, 0x81, 0xfb, 0x20, 0xdc,
+ 0xfb, 0x1a, 0x1b, 0xfb, 0xa6, 0xfb, 0x16, 0xfb,
+ 0x87, 0xfb, 0x65, 0x26, 0xb0, 0xfb, 0x5f, 0xf7,
+ 0xa0, 0xf7, 0xe, 0xf7, 0x2, 0xbc, 0xb2, 0xc9,
+ 0x1f, 0xc9, 0xf7, 0xbb, 0x5, 0xfb, 0xd8, 0x6,
+ 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xe5, 0xdc,
+ 0xf7, 0xc0, 0x77, 0x1, 0xd8, 0x16, 0xed, 0x6,
+ 0xd1, 0xf7, 0xe5, 0x5, 0xf8, 0xb, 0x6, 0x45,
+ 0xfb, 0xe5, 0x5, 0xeb, 0x6, 0xf7, 0x2d, 0xf9,
+ 0x62, 0x57, 0xa, 0x4b, 0xfb, 0xc0, 0x5, 0xfc,
+ 0xc, 0x6, 0xcb, 0xf7, 0xc0, 0x4d, 0xa, 0xe,
+ 0x77, 0x2d, 0xa, 0xe6, 0x16, 0xeb, 0x6, 0xf7,
+ 0x2e, 0xf9, 0x62, 0x4d, 0xa, 0xe, 0x54, 0xa,
+ 0xf7, 0x6a, 0x77, 0x1, 0xf7, 0x85, 0xf9, 0xa8,
+ 0x15, 0xd6, 0x6, 0xf7, 0x23, 0x6d, 0xa, 0xfb,
+ 0x8, 0x6, 0xfb, 0x90, 0xfe, 0x35, 0x15, 0x34,
+ 0xa, 0xe, 0x54, 0xa, 0xd6, 0xf7, 0x1f, 0x1,
+ 0xf7, 0x2f, 0xf9, 0xaa, 0x6e, 0xa, 0xda, 0xe4,
+ 0xb2, 0x32, 0x5, 0xd9, 0x6, 0x4e, 0x6f, 0xa,
+ 0x2a, 0x6, 0xfb, 0x55, 0xfe, 0x35, 0x15, 0x34,
+ 0xa, 0xe, 0x5c, 0xa, 0xf9, 0x6d, 0x77, 0x1,
+ 0xf7, 0xed, 0xf9, 0xb4, 0x15, 0xe7, 0x6, 0xa0,
+ 0xf0, 0x3d, 0xa, 0xfb, 0x5e, 0x26, 0x15, 0xe7,
+ 0x6, 0xa1, 0xf0, 0x5, 0x2e, 0x6, 0x2d, 0xfe,
+ 0x19, 0x15, 0x34, 0xa, 0xe, 0x54, 0xa, 0xf7,
+ 0x6a, 0x77, 0x1, 0xe6, 0x16, 0x34, 0xa, 0xb9,
+ 0xc0, 0x15, 0xce, 0x6, 0x54, 0x6d, 0xa, 0x23,
+ 0x6, 0xe, 0xf7, 0x5e, 0x78, 0xdb, 0xf9, 0x25,
+ 0x77, 0x1, 0xba, 0xea, 0x3, 0xba, 0xf7, 0x60,
+ 0x15, 0xfb, 0x2c, 0xc3, 0x44, 0xf7, 0x15, 0xf7,
+ 0x31, 0xbe, 0xf5, 0xf1, 0xa2, 0x1e, 0xf7, 0xa,
+ 0xf8, 0xa5, 0x5, 0x24, 0x6, 0xfb, 0x8, 0xfc,
+ 0xa5, 0x5, 0x49, 0x7d, 0x61, 0x4d, 0x42, 0x1b,
+ 0x5b, 0x60, 0xbe, 0xee, 0x1f, 0xe, 0xf8, 0x5,
+ 0x2d, 0xa, 0xf9, 0x1f, 0xf7, 0x21, 0x3, 0xd7,
+ 0x16, 0xf0, 0x6, 0xbe, 0xf7, 0x7e, 0xf7, 0x31,
+ 0xf7, 0x17, 0xf7, 0x6d, 0xfc, 0x1, 0x5, 0xf7,
+ 0x4, 0x6, 0xfb, 0x93, 0xf8, 0x3f, 0xf7, 0xf1,
+ 0xf7, 0xb7, 0x5, 0xfb, 0x21, 0x6, 0xfc, 0x30,
+ 0xfb, 0xf1, 0xdb, 0xf7, 0xf1, 0x5, 0x26, 0x6,
+ 0xe, 0x8b, 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd7,
+ 0x16, 0xf8, 0x62, 0x55, 0xa, 0xfc, 0x2, 0x6,
+ 0xf7, 0x19, 0xf9, 0x11, 0x50, 0xa, 0xe, 0x8b,
+ 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd1, 0x16, 0xf8,
+ 0x68, 0x55, 0xa, 0xfc, 0x7, 0x6, 0xc4, 0xf7,
+ 0xa7, 0xf7, 0x54, 0xf7, 0x0, 0x9c, 0xdc, 0xfb,
+ 0x54, 0x21, 0xc6, 0xf7, 0xab, 0x50, 0xa, 0x43,
+ 0xfb, 0xe8, 0x30, 0x59, 0x7a, 0x37, 0xe6, 0xbf,
+ 0x5, 0xe, 0xf8, 0xab, 0x2d, 0xa, 0xd4, 0x16,
+ 0xe9, 0x6, 0xf7, 0xd, 0xf8, 0xf4, 0xe2, 0xfc,
+ 0xf4, 0x5, 0xe8, 0x6, 0xf7, 0xf0, 0xf8, 0xf9,
+ 0xfb, 0x28, 0xfc, 0xf9, 0x5, 0xea, 0x6, 0xf7,
+ 0x2b, 0xf9, 0x62, 0x5, 0xfb, 0xc, 0x6, 0xfb,
+ 0xfc, 0xfd, 0x15, 0x30, 0xf9, 0x15, 0x5, 0xfb,
+ 0xa, 0x6, 0xe, 0xf8, 0x3c, 0x2d, 0xa, 0xcb,
+ 0xf9, 0x67, 0x3, 0xd7, 0x16, 0xea, 0x6, 0xf7,
+ 0xb, 0xf8, 0xf4, 0xf7, 0x99, 0xfc, 0xf4, 0x5,
+ 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x4d, 0xa,
+ 0xfb, 0xf, 0xfc, 0xf5, 0xfb, 0x97, 0xf8, 0xf5,
+ 0x4d, 0xa, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf9,
+ 0x6d, 0x77, 0xf7, 0xa, 0x76, 0xf7, 0x3, 0x77,
+ 0x12, 0xd7, 0x16, 0xea, 0x6, 0xf7, 0xd, 0xf8,
+ 0xfc, 0x48, 0xa, 0xf7, 0x95, 0xfc, 0xfc, 0x5,
+ 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x6d, 0x4d, 0xa,
+ 0xfb, 0xf, 0xfc, 0xfe, 0x4e, 0xa, 0xfb, 0x94,
+ 0xf8, 0xfe, 0x4d, 0xa, 0xf7, 0x19, 0xd8, 0x15,
+ 0xca, 0x66, 0xa, 0xa4, 0x1b, 0x13, 0x10, 0xa5,
+ 0xa0, 0x83, 0x82, 0x9e, 0x1f, 0x7f, 0xa3, 0xa0,
+ 0x7e, 0xa4, 0x1b, 0xc6, 0xad, 0xc2, 0xc1, 0x90,
+ 0x1f, 0x4e, 0x69, 0xa, 0x5e, 0xa, 0x13, 0x30,
+ 0x96, 0x72, 0x6f, 0x96, 0x6d, 0x1b, 0x46, 0x7a,
+ 0x57, 0x50, 0x7b, 0x1f, 0xe, 0x6c, 0xa, 0xf8,
+ 0xe6, 0xdc, 0x1, 0xf7, 0x18, 0xef, 0xf8, 0x59,
+ 0xef, 0x3, 0xf7, 0x21, 0xf7, 0xbb, 0x15, 0xfb,
+ 0x40, 0xf5, 0xfb, 0x22, 0xf7, 0x47, 0xf7, 0x60,
+ 0xf7, 0x34, 0xf7, 0x54, 0xf7, 0x80, 0xf7, 0x52,
+ 0xfb, 0x1, 0xf7, 0x1e, 0xfb, 0x47, 0xfb, 0x55,
+ 0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0xa3, 0x1e, 0xe5,
+ 0x16, 0xf7, 0x89, 0xf7, 0x28, 0xf7, 0x8, 0xf7,
+ 0xf, 0xf0, 0xec, 0x30, 0xfb, 0x30, 0xfb, 0x46,
+ 0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x31, 0x27, 0x25,
+ 0xdc, 0xf7, 0x2c, 0x1e, 0xe, 0xf9, 0x52, 0x78,
+ 0xdc, 0x46, 0xd0, 0x46, 0xde, 0xf7, 0x8f, 0xde,
+ 0xf7, 0x7b, 0xdf, 0x46, 0xdc, 0x12, 0xed, 0xe8,
+ 0x13, 0x3a, 0xf8, 0xa6, 0x84, 0x15, 0xf8, 0x67,
+ 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x3, 0x6, 0xc2,
+ 0xf7, 0x8f, 0x5, 0xf7, 0xd4, 0x6, 0x9d, 0xde,
+ 0x5, 0xfb, 0xd4, 0x6, 0xbd, 0xf7, 0x7b, 0x5,
+ 0xf7, 0xdb, 0x6, 0x9d, 0xdf, 0x5, 0xfc, 0x41,
+ 0x6, 0x78, 0x34, 0x5, 0x13, 0x96, 0xdb, 0x51,
+ 0x3c, 0x9e, 0x52, 0x1b, 0xfb, 0x66, 0xfb, 0x3a,
+ 0xfb, 0x4b, 0xfb, 0x93, 0xfb, 0x69, 0xf7, 0xe,
+ 0x22, 0xf7, 0x26, 0xf2, 0xba, 0xb6, 0xa0, 0xa5,
+ 0x1f, 0x13, 0x56, 0xfb, 0xf3, 0xf7, 0x92, 0x15,
+ 0xf7, 0x2c, 0xf7, 0x3, 0xf7, 0x61, 0xf7, 0x39,
+ 0xde, 0xdc, 0x4f, 0x25, 0x59, 0x6c, 0xfb, 0x32,
+ 0x74, 0x50, 0x1e, 0x6d, 0x80, 0x59, 0xfb, 0x1b,
+ 0xfb, 0x21, 0x1b, 0xfb, 0x23, 0x62, 0xef, 0xf7,
+ 0x1d, 0x1f, 0xe, 0xf8, 0x74, 0x78, 0xdd, 0xf9,
+ 0x7e, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf4, 0xf0,
+ 0xf8, 0x9b, 0xf0, 0x3, 0xf8, 0x51, 0xf9, 0xa8,
+ 0x15, 0xda, 0x6, 0xf7, 0x1d, 0x6d, 0xa, 0xfb,
+ 0xa, 0x6, 0xfc, 0x4a, 0x28, 0xa, 0xf8, 0x74,
+ 0x78, 0xdd, 0xf9, 0xc4, 0xbd, 0x1, 0xf4, 0xf0,
+ 0xf7, 0xc4, 0xf2, 0xf7, 0x4, 0xf0, 0x3, 0xf8,
+ 0x8, 0xf9, 0xa9, 0x15, 0xec, 0x6, 0xe0, 0xe5,
+ 0xb4, 0x31, 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x20,
+ 0x5, 0x24, 0x6, 0xfc, 0x29, 0x28, 0xa, 0x6c,
+ 0xa, 0xf9, 0x74, 0xf2, 0x1, 0x68, 0xa, 0x3,
+ 0xf4, 0xf7, 0xc1, 0x21, 0xa, 0xf8, 0x1, 0xf8,
+ 0x8a, 0x15, 0xec, 0x6, 0xa2, 0xf2, 0x57, 0xa,
+ 0xfb, 0x68, 0x24, 0x15, 0xec, 0x6, 0xa1, 0xf2,
+ 0x5, 0x2a, 0x6, 0xe, 0xf8, 0x74, 0x78, 0xdd,
+ 0xf8, 0xef, 0xdd, 0x1, 0x68, 0xa, 0x3, 0xf8,
+ 0x94, 0xf9, 0xa9, 0x15, 0xd4, 0x6, 0x4f, 0xf7,
+ 0x20, 0x5, 0xfb, 0x5, 0x6, 0xfb, 0xc7, 0x28,
+ 0xa, 0xf8, 0x74, 0x8d, 0x76, 0xae, 0xdf, 0xf8,
+ 0x9b, 0xdf, 0xad, 0x77, 0x1, 0xbb, 0xe0, 0xf8,
+ 0x97, 0xe5, 0x3, 0xa6, 0x9b, 0x15, 0xba, 0x68,
+ 0xdd, 0xe3, 0x5, 0x67, 0xc3, 0xcd, 0x7a, 0xcf,
+ 0x1b, 0xf7, 0x77, 0xf7, 0x39, 0xf7, 0x43, 0xf7,
+ 0x65, 0xce, 0x81, 0xdd, 0x4e, 0xcb, 0x1f, 0xdf,
+ 0xe3, 0x5c, 0xaf, 0x3a, 0x34, 0x5, 0xbe, 0x3b,
+ 0x33, 0x8d, 0x6f, 0x1b, 0xfb, 0x84, 0xfb, 0x1f,
+ 0xfb, 0x54, 0xfb, 0x5c, 0x4e, 0x92, 0x3e, 0xc3,
+ 0x49, 0x1f, 0xc8, 0xc8, 0x15, 0x6c, 0xb2, 0x83,
+ 0xc6, 0xba, 0x1a, 0xf7, 0x3b, 0xf7, 0x1a, 0xf7,
+ 0x1f, 0xf7, 0x35, 0xc0, 0xc3, 0x81, 0x74, 0xa6,
+ 0x1e, 0xfb, 0xf3, 0xfc, 0x5c, 0x15, 0xf8, 0x1b,
+ 0xf8, 0x35, 0x5, 0x9e, 0x6e, 0xa4, 0x55, 0x49,
+ 0x1a, 0xfb, 0x2c, 0xfb, 0x13, 0xfb, 0x26, 0xfb,
+ 0x39, 0x5a, 0x52, 0x8e, 0xa6, 0x66, 0x1e, 0xe,
+ 0x6c, 0xa, 0xf9, 0x7b, 0xf7, 0x1, 0x8e, 0x77,
+ 0x12, 0x68, 0xa, 0x13, 0xd8, 0xf7, 0xf9, 0xf9,
+ 0xb9, 0x15, 0xcb, 0x6, 0xa4, 0x90, 0x97, 0x9c,
+ 0xa4, 0x1b, 0xa7, 0xa0, 0x83, 0x82, 0x9e, 0x1f,
+ 0x7f, 0xa4, 0xa0, 0x7d, 0xa6, 0x1b, 0xc8, 0xae,
+ 0xc2, 0xc2, 0x90, 0x1f, 0x4d, 0x69, 0xa, 0x70,
+ 0x1b, 0x13, 0xb8, 0x7b, 0x75, 0x96, 0x96, 0x71,
+ 0x1f, 0x95, 0x73, 0x6f, 0x95, 0x6e, 0x1b, 0x13,
+ 0xd8, 0x44, 0x79, 0x57, 0x4f, 0x7c, 0x1f, 0xfb,
+ 0x90, 0xfc, 0x8c, 0x21, 0xa, 0xe, 0x35, 0xa,
+ 0xf7, 0xb6, 0xdc, 0xf7, 0xa0, 0xda, 0x1, 0xf9,
+ 0x16, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xc7,
+ 0xf7, 0xb6, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x32,
+ 0xf7, 0x32, 0xd7, 0xf7, 0x40, 0xf7, 0x1b, 0x33,
+ 0xb8, 0xfb, 0x7, 0x1f, 0xfb, 0xbf, 0x6, 0xa3,
+ 0xfb, 0xef, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7,
+ 0x4c, 0x6, 0xd1, 0xd5, 0x8a, 0x27, 0xfb, 0x1c,
+ 0xfb, 0x18, 0x6c, 0x2d, 0x1f, 0xe, 0xf8, 0x74,
+ 0x68, 0x76, 0xcf, 0xd8, 0xf8, 0xcf, 0xd8, 0x1,
+ 0xf7, 0x1c, 0xf0, 0xf8, 0x7c, 0xf0, 0x3, 0xf8,
+ 0xcd, 0xb7, 0x15, 0xb0, 0x5f, 0xb0, 0x6c, 0xb1,
+ 0x72, 0xb3, 0xc3, 0x18, 0x7d, 0x95, 0x5e, 0xa6,
+ 0x69, 0xb5, 0x8, 0xef, 0xd8, 0xc9, 0xf7, 0xf,
+ 0xf7, 0x23, 0x1a, 0xf7, 0x4a, 0xfb, 0x1, 0xf7,
+ 0x19, 0xfb, 0x49, 0xfb, 0x75, 0xfb, 0x1a, 0xfb,
+ 0x67, 0xfb, 0x60, 0xfb, 0xb9, 0xf7, 0x7b, 0x7a,
+ 0xcb, 0xb6, 0xb9, 0x95, 0xa1, 0xb7, 0x1e, 0xfb,
+ 0x24, 0xf7, 0x10, 0x15, 0xac, 0x7a, 0x9f, 0x7c,
+ 0xad, 0x6c, 0x8, 0x80, 0x6d, 0x6c, 0x86, 0x6c,
+ 0x1b, 0x53, 0xfb, 0x18, 0xbb, 0xf7, 0x4d, 0xf7,
+ 0x52, 0xf7, 0xa, 0xf7, 0x28, 0xf7, 0x2d, 0xe5,
+ 0xf5, 0x3d, 0xfb, 0x34, 0x26, 0x60, 0xfb, 0x7,
+ 0x37, 0x49, 0x1f, 0x83, 0x94, 0x76, 0x9f, 0x6c,
+ 0xad, 0x55, 0xa3, 0x19, 0xe, 0xf8, 0x3c, 0xa0,
+ 0x76, 0xf7, 0xd2, 0xd8, 0xf7, 0x88, 0xda, 0x1,
+ 0xf9, 0x3d, 0xe7, 0x3, 0xe3, 0x16, 0xeb, 0x6,
+ 0xcd, 0xf7, 0xd2, 0x5, 0xf7, 0x2, 0x6, 0xf7,
+ 0x10, 0xaf, 0x2f, 0x2e, 0xaf, 0x1f, 0xbf, 0xfb,
+ 0x19, 0x5, 0xf6, 0x6, 0x54, 0xf7, 0x19, 0x6d,
+ 0xd3, 0x64, 0xd2, 0x4d, 0xb9, 0x19, 0xbe, 0x92,
+ 0xf7, 0x55, 0xa4, 0xf7, 0x4f, 0x1a, 0xf7, 0x43,
+ 0xfb, 0x25, 0x8d, 0x30, 0x1e, 0xfb, 0xbf, 0x6,
+ 0xa8, 0xfb, 0xd7, 0x15, 0xbd, 0xf7, 0x88, 0x5,
+ 0xf7, 0x70, 0x6, 0xbe, 0xe8, 0x87, 0x2d, 0xfb,
+ 0x27, 0xfb, 0x2a, 0x8c, 0xfb, 0x19, 0x1f, 0xe,
+ 0xf8, 0x5, 0x78, 0xdb, 0xf8, 0xe8, 0xdb, 0x12,
+ 0xe5, 0xeb, 0x86, 0xea, 0xf7, 0xaf, 0xee, 0x62,
+ 0xeb, 0x13, 0xe8, 0xe5, 0xf7, 0x7a, 0x15, 0xfb,
+ 0x48, 0xf7, 0x1c, 0x46, 0xf7, 0x28, 0xf7, 0x43,
+ 0xf7, 0x1, 0xe6, 0xf7, 0x9, 0xf7, 0xb, 0x36,
+ 0xb7, 0xfb, 0x21, 0xc8, 0x1e, 0x13, 0xd4, 0xfb,
+ 0x0, 0xba, 0x5b, 0x9d, 0xca, 0x1a, 0xe8, 0xf7,
+ 0x4, 0xa2, 0xba, 0xe1, 0xeb, 0x53, 0x2f, 0x1e,
+ 0xeb, 0x92, 0x5, 0xe0, 0x49, 0xf7, 0x1c, 0xfb,
+ 0x64, 0xfb, 0x2a, 0xfb, 0x0, 0x41, 0xfb, 0xe,
+ 0xfb, 0xe, 0xf7, 0x0, 0x5e, 0xf7, 0x0, 0x5c,
+ 0x1e, 0x13, 0xe8, 0xf5, 0x5d, 0xc3, 0x70, 0x4a,
+ 0x1a, 0x4a, 0x4e, 0x4c, 0xfb, 0xd, 0xfb, 0x40,
+ 0x78, 0xe6, 0xe1, 0x1e, 0xe, 0xf8, 0x5, 0x78,
+ 0xdd, 0xf8, 0xf1, 0xdd, 0xb2, 0xf7, 0x20, 0x12,
+ 0xe5, 0xec, 0x86, 0xeb, 0xf7, 0xb1, 0xef, 0x13,
+ 0xf4, 0xe5, 0xf7, 0x7f, 0x15, 0xfb, 0x4c, 0xf7,
+ 0x1d, 0x45, 0xf7, 0x29, 0xf7, 0x45, 0xf7, 0x2,
+ 0xe6, 0xf7, 0xc, 0xf7, 0xf, 0x35, 0xb6, 0xfb,
+ 0x22, 0xcb, 0x1e, 0x13, 0xec, 0xfb, 0x1, 0xbb,
+ 0x5b, 0x9c, 0xcc, 0x1a, 0xea, 0xf7, 0x3, 0xa0,
+ 0xbc, 0xe1, 0xe7, 0x62, 0xfb, 0x0, 0x1e, 0xec,
+ 0x93, 0x5, 0xeb, 0x4e, 0xf7, 0x13, 0xfb, 0x66,
+ 0xfb, 0x2b, 0xfb, 0x1, 0x41, 0xfb, 0x10, 0xfb,
+ 0x11, 0xf7, 0x1, 0x5d, 0xf7, 0x0, 0x5b, 0x1e,
+ 0xf6, 0x5e, 0xc4, 0x6e, 0x48, 0x1a, 0x4a, 0x4e,
+ 0x4b, 0xfb, 0xf, 0x1e, 0x13, 0xf4, 0xfb, 0x20,
+ 0x5a, 0xe0, 0xea, 0x88, 0x1f, 0xf7, 0x70, 0xf8,
+ 0xb6, 0x15, 0xef, 0x6, 0xf7, 0x1b, 0xf7, 0x20,
+ 0x5, 0x2d, 0x6, 0x38, 0x31, 0x63, 0xe5, 0x5,
+ 0x39, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf9,
+ 0x11, 0xdc, 0x1, 0xf7, 0x94, 0x16, 0xee, 0x6,
+ 0xf7, 0x1c, 0xf9, 0x11, 0x5, 0xf7, 0x85, 0x6b,
+ 0xa, 0xfc, 0xdc, 0x6, 0x79, 0x3a, 0x5, 0xf7,
+ 0x89, 0x6, 0xe, 0x35, 0xa, 0xf7, 0x26, 0xdc,
+ 0xf7, 0xa0, 0xda, 0xf7, 0x24, 0x77, 0x1, 0xf8,
+ 0xfd, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xaa,
+ 0xf7, 0x26, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x33,
+ 0xf7, 0x35, 0xcd, 0xf7, 0x41, 0xf7, 0x1c, 0x30,
+ 0xc0, 0xfb, 0x7, 0x1f, 0xfb, 0x61, 0x6, 0xaa,
+ 0xf7, 0x24, 0x50, 0xa, 0x85, 0xfc, 0x7f, 0x15,
+ 0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4d, 0x6, 0xd1,
+ 0xd8, 0x82, 0x26, 0xfb, 0x1d, 0xfb, 0x1b, 0x76,
+ 0x2c, 0x1f, 0xe, 0xf8, 0x3c, 0x78, 0xdd, 0xf9,
+ 0x23, 0x42, 0xa, 0xf7, 0x77, 0xf9, 0x62, 0x15,
+ 0x8f, 0xfb, 0x0, 0xfc, 0x7b, 0x65, 0xfb, 0x22,
+ 0xf7, 0x9, 0x45, 0xf7, 0x27, 0xf7, 0x91, 0xbb,
+ 0xf7, 0x7a, 0xde, 0x9d, 0x1f, 0xe6, 0xf8, 0x3c,
+ 0x57, 0xa, 0x30, 0xfc, 0x3c, 0x5, 0xfb, 0x10,
+ 0x72, 0x5c, 0x20, 0xfb, 0x2e, 0x1b, 0x39, 0x3b,
+ 0xb7, 0xe1, 0x1f, 0xf4, 0xf8, 0xa1, 0x5, 0xe,
+ 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x31, 0x77, 0xe9,
+ 0x76, 0xf7, 0x22, 0x42, 0xa, 0xf8, 0x49, 0xf9,
+ 0xa7, 0x15, 0xd5, 0x6, 0xf7, 0x19, 0xf7, 0x22,
+ 0x5, 0xfb, 0x7, 0x6, 0xfb, 0xc1, 0xfb, 0x57,
+ 0x15, 0x8b, 0x22, 0xfc, 0x85, 0x64, 0x1a, 0xfb,
+ 0x25, 0xf7, 0xa, 0x43, 0xf7, 0x28, 0xf7, 0x90,
+ 0xbb, 0xf7, 0x7f, 0xe1, 0x9c, 0x1e, 0xe6, 0xf8,
+ 0x44, 0x57, 0xa, 0x32, 0xfc, 0x44, 0x5, 0xfb,
+ 0xb, 0x75, 0x48, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+ 0x3a, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xac,
+ 0x5, 0xe, 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x32,
+ 0x42, 0xa, 0xf8, 0x2, 0xf9, 0xa8, 0x15, 0xe8,
+ 0x6, 0xdd, 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6,
+ 0x4d, 0xf7, 0x21, 0x47, 0xa, 0xfb, 0xa3, 0xfb,
+ 0x56, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xde, 0xf9,
+ 0x2b, 0x77, 0xf7, 0x56, 0x42, 0xa, 0xf8, 0xcb,
+ 0xf9, 0xb2, 0x15, 0xe9, 0x6, 0xa0, 0xf2, 0x5,
+ 0x2d, 0x6, 0xfb, 0x62, 0x24, 0x15, 0xe9, 0x6,
+ 0xa1, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x44, 0xfb,
+ 0x3a, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xdf, 0xf9,
+ 0x33, 0x77, 0xd4, 0xf7, 0x20, 0x1, 0xf7, 0xf,
+ 0xeb, 0x3, 0xf7, 0x77, 0xf9, 0x74, 0x15, 0x8b,
+ 0x23, 0xfc, 0x87, 0x64, 0x1a, 0xfb, 0x25, 0xf7,
+ 0x9, 0x43, 0xf7, 0x27, 0xf7, 0x92, 0xbb, 0xf7,
+ 0x80, 0xe0, 0x9d, 0x1e, 0xe5, 0xf8, 0x46, 0x57,
+ 0xa, 0x33, 0xfc, 0x46, 0x5, 0xfb, 0xb, 0x74,
+ 0x48, 0xfb, 0xa, 0xfb, 0x1f, 0x1b, 0x39, 0x3a,
+ 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xae, 0x5, 0xf7,
+ 0x4e, 0xc0, 0x15, 0xd2, 0x6, 0x50, 0xf7, 0x20,
+ 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, 0x2d,
+ 0xa, 0xf7, 0xcc, 0x16, 0xf1, 0x6, 0xf8, 0x16,
+ 0xf9, 0x62, 0x5, 0x28, 0x6, 0xfb, 0xd5, 0xfc,
+ 0xfd, 0xfb, 0x7, 0xf8, 0xfd, 0x3d, 0xa, 0xe,
+ 0xf9, 0x1a, 0x2d, 0xa, 0xf7, 0x52, 0xdf, 0xf7,
+ 0xe6, 0xd9, 0xf7, 0xbc, 0xea, 0x3, 0xf7, 0x68,
+ 0x16, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0xd0, 0x48,
+ 0xa, 0xa7, 0xfc, 0xd0, 0x5, 0xf0, 0x6, 0xf7,
+ 0xf6, 0xf9, 0x62, 0x4d, 0xa, 0xfb, 0xac, 0xfc,
+ 0xe5, 0x4e, 0xa, 0x70, 0xf8, 0xe5, 0x5, 0x2a,
+ 0x6, 0xfb, 0xb9, 0xfc, 0xde, 0x89, 0x8d, 0x76,
+ 0xf8, 0xdc, 0x4d, 0xa, 0xe, 0xf8, 0x5, 0x2d,
+ 0xa, 0x9e, 0x16, 0xf7, 0xe, 0x6, 0xf7, 0x92,
+ 0xf7, 0xb4, 0xf7, 0x2b, 0xfb, 0xb4, 0x5, 0xef,
+ 0x6, 0xfb, 0x51, 0xf7, 0xee, 0xf7, 0xe1, 0xf8,
+ 0x8, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x98, 0xfb,
+ 0xbc, 0xfb, 0x30, 0xf7, 0xbc, 0x5, 0x26, 0x6,
+ 0xf7, 0x57, 0xfb, 0xf8, 0x5, 0xe, 0xf8, 0x5,
+ 0x2d, 0xa, 0xf7, 0x3b, 0xef, 0xf8, 0x40, 0xf7,
+ 0x3, 0x3, 0xf7, 0xda, 0x16, 0xe8, 0x6, 0xc2,
+ 0xf7, 0xa1, 0xf7, 0xe0, 0xf8, 0x55, 0x51, 0xa,
+ 0xfb, 0xf9, 0xfb, 0x3d, 0xf7, 0xf9, 0x47, 0xa,
+ 0xf7, 0x6b, 0xfc, 0x4d, 0x5, 0xe, 0x35, 0xa,
+ 0xfa, 0x35, 0x77, 0x1, 0xf7, 0xda, 0x16, 0xe7,
+ 0x6, 0xc3, 0xf7, 0xaa, 0xf7, 0xe0, 0xf8, 0x5f,
+ 0x51, 0xa, 0xfc, 0x0, 0xfb, 0x3d, 0xf8, 0x0,
+ 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x57, 0x5, 0xb1,
+ 0xf8, 0x8c, 0x15, 0xd2, 0x6, 0xf7, 0x13, 0x6f,
+ 0xa, 0xfb, 0x1, 0x6, 0xe, 0x35, 0xa, 0xf9,
+ 0x6d, 0x77, 0xe5, 0xf1, 0x1, 0xf7, 0xda, 0x16,
+ 0xe7, 0x6, 0xc3, 0xf7, 0xa6, 0xf7, 0xe0, 0xf8,
+ 0x5b, 0x51, 0xa, 0xfb, 0xfd, 0xfb, 0x3d, 0xf7,
+ 0xfd, 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x5b, 0x5,
+ 0xf7, 0x36, 0xf8, 0xa1, 0x15, 0xe5, 0x6, 0x9f,
+ 0xf1, 0x3f, 0xa, 0xfb, 0x57, 0x25, 0x15, 0xe4,
+ 0x6, 0xa0, 0xf1, 0x3e, 0xa, 0xf7, 0xcd, 0x8b,
+ 0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0x84, 0x16, 0xf9,
+ 0x2, 0x6, 0x9f, 0xdc, 0x5, 0xfc, 0x7f, 0x6,
+ 0xf8, 0xe0, 0xf8, 0xc6, 0x94, 0xd6, 0x5, 0xfc,
+ 0xd8, 0x6, 0x77, 0x3a, 0xf8, 0x5d, 0x8c, 0xfc,
+ 0xe6, 0xfc, 0xca, 0x5, 0xe, 0xf7, 0xcd, 0x8b,
+ 0xdf, 0xf9, 0x56, 0xf7, 0x1f, 0x1, 0x84, 0x16,
+ 0xf8, 0xf8, 0x6, 0x9f, 0xdf, 0x5, 0xfc, 0x75,
+ 0x6, 0xf8, 0xe0, 0xf8, 0xd6, 0x94, 0xd8, 0x5,
+ 0xfc, 0xd8, 0x6, 0x77, 0x37, 0xf8, 0x57, 0x8a,
+ 0xfc, 0xe0, 0xfc, 0xd8, 0x5, 0xf8, 0x24, 0xf9,
+ 0x60, 0x15, 0xf7, 0x6, 0x6, 0xf7, 0x2d, 0x6f,
+ 0xa, 0x20, 0x6, 0x2d, 0x31, 0x5d, 0xe5, 0x45,
+ 0xa, 0xe, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8b,
+ 0xcd, 0xf7, 0x2e, 0xd5, 0x12, 0xc8, 0xe7, 0x13,
+ 0x78, 0xf8, 0x3c, 0x88, 0x15, 0xe8, 0x6, 0x85,
+ 0xa7, 0x87, 0x9f, 0xa3, 0x1a, 0xae, 0x91, 0xad,
+ 0x92, 0xad, 0x1e, 0xaa, 0xf7, 0x17, 0x5, 0x91,
+ 0xa4, 0x8d, 0xa4, 0xa2, 0x1a, 0xe7, 0x51, 0xd1,
+ 0xfb, 0x25, 0x40, 0xfb, 0x25, 0x60, 0xfb, 0xb,
+ 0x73, 0x1e, 0xe9, 0x83, 0x5, 0xd8, 0xa7, 0xc6,
+ 0x9e, 0xc6, 0x1b, 0x13, 0xb8, 0xc1, 0xe3, 0x7b,
+ 0xfb, 0xb, 0x6a, 0x1f, 0x65, 0x7d, 0x64, 0x89,
+ 0x3d, 0x88, 0x8, 0x4d, 0x89, 0xfb, 0x4b, 0x83,
+ 0xfb, 0x36, 0x1a, 0x29, 0xd6, 0x54, 0xe6, 0x1e,
+ 0xe8, 0xca, 0xc0, 0xa5, 0xa9, 0x1f, 0x8c, 0x7f,
+ 0x8d, 0x6e, 0x93, 0x71, 0x8, 0xa2, 0xf7, 0xa1,
+ 0x15, 0x82, 0x56, 0x80, 0x5f, 0x71, 0x66, 0x8,
+ 0x5a, 0x69, 0x53, 0x6f, 0x53, 0x1b, 0x3c, 0x74,
+ 0xb7, 0xb2, 0xe0, 0xe8, 0x9a, 0xc7, 0x91, 0x1f,
+ 0xdd, 0x92, 0xa4, 0x8d, 0xad, 0x98, 0x8, 0xe,
+ 0x4a, 0xa, 0xf8, 0x39, 0x77, 0x12, 0xc8, 0xea,
+ 0xf7, 0xe1, 0xed, 0x13, 0x7c, 0xf7, 0xcf, 0xf8,
+ 0xe9, 0x15, 0xda, 0x6, 0xf7, 0x21, 0xf7, 0x1d,
+ 0x5, 0xfb, 0xd, 0x6, 0x90, 0xfd, 0x75, 0x22,
+ 0xa, 0xe, 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d,
+ 0x12, 0x13, 0x70, 0xf7, 0x7b, 0xf8, 0xe9, 0x15,
+ 0xe8, 0x6, 0xdd, 0xe2, 0xb3, 0x34, 0x5, 0xdb,
+ 0x6, 0x4d, 0xf7, 0x1d, 0x47, 0xa, 0xc2, 0xfd,
+ 0x75, 0x20, 0xa, 0x13, 0xb0, 0x2b, 0xa, 0xae,
+ 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf7,
+ 0x8c, 0xf8, 0xe5, 0x15, 0xdd, 0x6, 0xf7, 0x25,
+ 0x6d, 0xa, 0xfb, 0x11, 0x6, 0xe, 0x7c, 0xd0,
+ 0x67, 0x76, 0xf7, 0x8a, 0xcd, 0xf7, 0xbe, 0xee,
+ 0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, 0x13, 0x7c,
+ 0xf8, 0x44, 0xf8, 0xf3, 0x15, 0xe9, 0x6, 0xa1,
+ 0xee, 0x4d, 0xa, 0xfb, 0x62, 0x28, 0x15, 0xea,
+ 0x6, 0xa0, 0xee, 0x5, 0x2d, 0x6, 0xf7, 0x2a,
+ 0xfd, 0x59, 0x22, 0xa, 0xe, 0xf8, 0xe3, 0x7c,
+ 0xd1, 0xf7, 0x4c, 0xcf, 0xf7, 0x35, 0xd0, 0x8c,
+ 0x77, 0x12, 0xc8, 0xe6, 0x13, 0xe8, 0xf8, 0x47,
+ 0xf1, 0x15, 0x44, 0xa8, 0xe3, 0x5d, 0xd6, 0x1b,
+ 0xf7, 0x39, 0xcc, 0xf7, 0x1b, 0xbb, 0xa2, 0x1f,
+ 0x2f, 0x93, 0x5, 0x33, 0x5f, 0x4c, 0x6e, 0x57,
+ 0x1b, 0x44, 0x50, 0xcd, 0xf7, 0x6, 0x99, 0x1f,
+ 0xf8, 0x19, 0x6, 0x8d, 0x9a, 0x90, 0xad, 0xa9,
+ 0x1a, 0xf7, 0x7, 0x46, 0xf3, 0xfb, 0x20, 0x49,
+ 0x4b, 0x72, 0x5c, 0x5d, 0x1e, 0x13, 0xd8, 0x9f,
+ 0x7c, 0x5f, 0xc0, 0xfb, 0x0, 0x1b, 0xfb, 0x2,
+ 0x2c, 0x5c, 0xfb, 0x7, 0x65, 0x1f, 0xe4, 0x84,
+ 0x5, 0x13, 0xe8, 0xa6, 0x97, 0xa7, 0xd3, 0xf7,
+ 0x4, 0x1b, 0xd7, 0xb9, 0x51, 0x38, 0x65, 0x1f,
+ 0x30, 0x76, 0xfb, 0xe, 0x89, 0x58, 0x7c, 0x8,
+ 0x2f, 0x6f, 0x75, 0x45, 0x57, 0x1a, 0x48, 0xb2,
+ 0x34, 0xf7, 0x16, 0xf6, 0xc0, 0xc4, 0xc7, 0xb8,
+ 0x1e, 0x81, 0xf7, 0x30, 0x15, 0x54, 0x82, 0x67,
+ 0xfb, 0x28, 0xfb, 0x14, 0x1b, 0x42, 0x70, 0xb6,
+ 0xb4, 0xde, 0xdc, 0x96, 0xc9, 0x91, 0x1f, 0xd8,
+ 0x92, 0xa3, 0x91, 0xa8, 0x91, 0x8, 0xf4, 0xbc,
+ 0x15, 0xec, 0xa6, 0xc8, 0xcb, 0xe1, 0x1b, 0xc8,
+ 0xd8, 0x60, 0xfb, 0xa, 0x78, 0x1f, 0xe, 0x4a,
+ 0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0xc8, 0xe5,
+ 0xf7, 0xcf, 0xe8, 0x13, 0x7c, 0xf8, 0x37, 0x88,
+ 0x22, 0xa, 0x4a, 0xf7, 0xdc, 0x56, 0xa, 0xf7,
+ 0x1d, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5,
+ 0x7e, 0xd9, 0x50, 0x76, 0xf9, 0x2b, 0xd1, 0x12,
+ 0xd8, 0xe2, 0xcb, 0xe3, 0xf7, 0x30, 0xe4, 0x13,
+ 0xbc, 0xf7, 0x9e, 0xf8, 0x34, 0x15, 0x47, 0x6e,
+ 0xfb, 0xd, 0x52, 0xfb, 0x26, 0x1a, 0xfb, 0x7,
+ 0xe3, 0x39, 0xf7, 0x14, 0xea, 0xbf, 0xb4, 0xb6,
+ 0xbf, 0x1e, 0x13, 0x7c, 0xa9, 0x63, 0xaf, 0x6b,
+ 0x9c, 0x7d, 0xcd, 0xbf, 0x18, 0x74, 0xa5, 0x6c,
+ 0xac, 0x6f, 0xb0, 0xa6, 0xaa, 0xaf, 0xbb, 0xa4,
+ 0xbf, 0x40, 0xae, 0x18, 0x6a, 0x51, 0x76, 0x76,
+ 0x7b, 0x79, 0x57, 0xcc, 0x56, 0xea, 0x7c, 0xa6,
+ 0x8, 0xdc, 0xb5, 0xed, 0xc3, 0xeb, 0x1a, 0xca,
+ 0x58, 0xd3, 0x23, 0xfb, 0x6, 0x4b, 0x2d, 0x3e,
+ 0x58, 0x9b, 0x6d, 0x9b, 0x67, 0x1e, 0xf7, 0x4a,
+ 0xfb, 0xb9, 0x15, 0x13, 0xbc, 0x55, 0x57, 0x59,
+ 0x79, 0x60, 0x1b, 0x46, 0x4b, 0xb6, 0xd7, 0xe7,
+ 0xe1, 0xbb, 0xbe, 0xa3, 0x1f, 0xb1, 0x44, 0xcc,
+ 0x31, 0xb1, 0x59, 0x8, 0x2e, 0xf7, 0xd2, 0x15,
+ 0x6d, 0xc4, 0x88, 0xa6, 0x93, 0x1a, 0xb9, 0xb2,
+ 0xc2, 0xbd, 0xb1, 0xa8, 0x6d, 0x66, 0x4a, 0x2d,
+ 0x5c, 0x6e, 0x7d, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+ 0x76, 0xf7, 0x88, 0xcc, 0xf7, 0xa3, 0xb1, 0xf3,
+ 0xb0, 0x12, 0xc8, 0xe5, 0xf7, 0x22, 0xb0, 0xf6,
+ 0xb1, 0x13, 0x7f, 0xf7, 0xb9, 0xf9, 0x2f, 0x15,
+ 0x59, 0xb5, 0x63, 0xbc, 0xbc, 0xb5, 0xb3, 0xbd,
+ 0xbe, 0x62, 0xb1, 0x59, 0x59, 0x62, 0x65, 0x58,
+ 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa3, 0xa3, 0xa9,
+ 0xa8, 0xa3, 0x74, 0x6d, 0x6e, 0x73, 0x75, 0x6e,
+ 0x6e, 0x72, 0xa1, 0xa8, 0x1e, 0xe4, 0xfd, 0x31,
+ 0x20, 0xa, 0x13, 0xbf, 0x2b, 0xa, 0xf7, 0x3f,
+ 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0xb5,
+ 0xf7, 0x9c, 0x15, 0xec, 0x6, 0xf7, 0x2a, 0xf7,
+ 0xda, 0xf7, 0x2e, 0xfb, 0xda, 0x5, 0xeb, 0x6,
+ 0xfb, 0x63, 0xf8, 0x3c, 0x5, 0x37, 0x6, 0xe,
+ 0xf7, 0xb2, 0xf7, 0x49, 0xdf, 0x4b, 0x76, 0xc7,
+ 0xe0, 0x8c, 0x77, 0x12, 0x13, 0x60, 0xf7, 0x3,
+ 0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xaf, 0xac, 0xc2,
+ 0x1b, 0xb6, 0xac, 0x80, 0x7f, 0xa9, 0x1f, 0x13,
+ 0x90, 0x7a, 0xb3, 0xae, 0x78, 0xb4, 0x1b, 0xca,
+ 0xb0, 0xa5, 0xa4, 0xa6, 0x1f, 0xe9, 0x7, 0x82,
+ 0x82, 0x59, 0x57, 0x4f, 0x1b, 0x60, 0x65, 0x9d,
+ 0x9c, 0x63, 0x1f, 0x13, 0x60, 0x98, 0x6b, 0x6a,
+ 0x97, 0x66, 0x1b, 0x64, 0x58, 0x7e, 0x62, 0x66,
+ 0x1f, 0xe, 0xe6, 0xf8, 0x58, 0x76, 0xf7, 0xb3,
+ 0x77, 0x1, 0xf7, 0xb6, 0xc5, 0x3, 0xf7, 0x96,
+ 0xf8, 0x43, 0x15, 0xc8, 0xee, 0xcb, 0x28, 0xc3,
+ 0xb3, 0x3a, 0xe2, 0xf7, 0x9, 0xa4, 0x75, 0xcd,
+ 0xfb, 0x2, 0x5f, 0x95, 0xf7, 0x5, 0x47, 0x8a,
+ 0x95, 0xfb, 0x5, 0xfb, 0x1, 0xb7, 0x76, 0x49,
+ 0xf7, 0x7, 0x73, 0x3d, 0x33, 0x5, 0xe, 0xf9,
+ 0xc6, 0x61, 0xcb, 0x4b, 0xf7, 0x56, 0x81, 0xcc,
+ 0xf7, 0xe9, 0xca, 0xeb, 0xcb, 0x12, 0xf7, 0x81,
+ 0xca, 0xf2, 0xdb, 0xf8, 0x7f, 0xcb, 0x13, 0xbf,
+ 0xf9, 0x49, 0xf7, 0x6a, 0x15, 0x70, 0x8e, 0x90,
+ 0x5e, 0xd8, 0x1b, 0xf7, 0x12, 0xf7, 0x1a, 0xf7,
+ 0x23, 0xf7, 0x3a, 0xf7, 0x3c, 0xfb, 0x12, 0xf7,
+ 0x3f, 0xfb, 0x87, 0xfb, 0xdf, 0x26, 0xfb, 0xa6,
+ 0xfb, 0x3e, 0xfb, 0x66, 0xf7, 0x19, 0xfb, 0x46,
+ 0xf7, 0xc6, 0x1f, 0x13, 0x5f, 0xf7, 0xaa, 0xea,
+ 0xf7, 0x3d, 0xa4, 0x97, 0x1f, 0x3d, 0x6, 0x13,
+ 0xbf, 0x5f, 0x6d, 0x30, 0x35, 0xfb, 0x4c, 0x1b,
+ 0xfb, 0x5e, 0xfb, 0x44, 0xe0, 0xf7, 0x83, 0xf7,
+ 0x63, 0xf7, 0x27, 0xf7, 0x41, 0xf7, 0x6d, 0xf7,
+ 0x3e, 0xf7, 0x20, 0xfb, 0x4, 0xfb, 0x37, 0xfb,
+ 0x2a, 0xfb, 0xd, 0x33, 0x5d, 0x1f, 0x67, 0x83,
+ 0x94, 0xca, 0x94, 0xb4, 0xc9, 0xf7, 0xb6, 0x18,
+ 0x3e, 0x6, 0x7c, 0x48, 0x5, 0xd5, 0x5e, 0x4c,
+ 0x90, 0x73, 0x1b, 0xfb, 0xc, 0x23, 0xfb, 0x26,
+ 0xfb, 0x1a, 0x26, 0xca, 0x33, 0xe9, 0xc8, 0xbe,
+ 0xbb, 0xa3, 0xa0, 0x1f, 0xfb, 0x66, 0xf7, 0x9,
+ 0x15, 0xd9, 0xbf, 0xf7, 0x1f, 0xec, 0xbb, 0xc1,
+ 0x6b, 0x2d, 0xfb, 0x6, 0x39, 0x26, 0x40, 0x5d,
+ 0x5b, 0xb3, 0xdf, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+ 0x76, 0xf7, 0x89, 0xcd, 0xf0, 0xd5, 0xf7, 0x83,
+ 0x77, 0x12, 0xc8, 0xea, 0xf7, 0xe1, 0xee, 0x13,
+ 0x7e, 0xf7, 0x7e, 0xf8, 0xf7, 0x15, 0xcd, 0x6,
+ 0xa4, 0x91, 0x97, 0x9c, 0xa5, 0x1b, 0xa5, 0xa4,
+ 0x82, 0x81, 0xa2, 0x1f, 0x7f, 0xa6, 0xa3, 0x7f,
+ 0x9e, 0x1b, 0xca, 0xaf, 0xc2, 0xc1, 0x90, 0x1f,
+ 0x4b, 0x6, 0x7d, 0x87, 0x84, 0x72, 0x70, 0x1b,
+ 0x7c, 0x77, 0x95, 0x95, 0x74, 0x1f, 0x96, 0x72,
+ 0x6e, 0x96, 0x67, 0x1b, 0x42, 0x79, 0x57, 0x50,
+ 0x7a, 0x1f, 0xf7, 0x4d, 0xfc, 0xfa, 0x20, 0xa,
+ 0x13, 0xae, 0x2b, 0xa, 0x7c, 0xd3, 0x64, 0x76,
+ 0xf8, 0x61, 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xf8,
+ 0x80, 0xe7, 0x13, 0x78, 0xc5, 0x88, 0x15, 0xdd,
+ 0x6, 0x9f, 0xee, 0x48, 0xa, 0x13, 0xb8, 0x4a,
+ 0x9e, 0xce, 0x5d, 0xd3, 0x1b, 0xf7, 0x13, 0xf7,
+ 0x1d, 0xf7, 0x19, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb,
+ 0x20, 0x9c, 0x66, 0x4c, 0x5d, 0x6e, 0x63, 0x5d,
+ 0x1f, 0xc2, 0xf7, 0x94, 0x3d, 0xa, 0x13, 0x78,
+ 0x77, 0xfc, 0x8e, 0x15, 0xdd, 0xcd, 0xf7, 0x38,
+ 0xf7, 0xa, 0xea, 0x9d, 0x29, 0x5f, 0x1e, 0x13,
+ 0xb8, 0x42, 0x60, 0xfb, 0x4e, 0xfb, 0x1d, 0x6a,
+ 0x37, 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x77, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x20, 0xf7,
+ 0x5e, 0x3, 0xf7, 0x90, 0x78, 0x15, 0xe5, 0x6,
+ 0xfb, 0x4, 0xf9, 0x88, 0x3e, 0xa, 0x65, 0xfb,
+ 0x64, 0x76, 0xfa, 0x5a, 0x77, 0x1, 0xd5, 0xf7,
+ 0x74, 0x3, 0xd5, 0xfb, 0x79, 0x15, 0xd7, 0x6,
+ 0xf7, 0x28, 0xfa, 0x5a, 0x5, 0x3f, 0x6, 0xe,
+ 0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, 0xf7,
+ 0xed, 0xd5, 0x1, 0xe7, 0xf7, 0xf5, 0x3, 0xe7,
+ 0xf7, 0x74, 0x15, 0xeb, 0x82, 0x31, 0x2c, 0x7e,
+ 0x1f, 0xfb, 0x26, 0x76, 0x89, 0x32, 0xf7, 0x3c,
+ 0x1b, 0x96, 0xd5, 0x5, 0x29, 0x8b, 0x94, 0xf7,
+ 0x2c, 0xa3, 0x1f, 0x9b, 0xf7, 0x6, 0x85, 0xd7,
+ 0x3c, 0xad, 0xf6, 0xbb, 0x90, 0x9f, 0xa3, 0xf7,
+ 0x44, 0x8, 0xe3, 0x98, 0xa3, 0xbf, 0xdd, 0x1b,
+ 0x96, 0xd5, 0x5, 0xfb, 0x36, 0x72, 0x45, 0xfb,
+ 0x24, 0x73, 0x1f, 0x2b, 0x7b, 0x79, 0xfb, 0x1,
+ 0x2a, 0x1b, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7,
+ 0xee, 0xd9, 0xf8, 0x7, 0xd5, 0x1, 0x8b, 0xf7,
+ 0xf6, 0x3, 0x96, 0xfb, 0xe, 0x15, 0x80, 0x41,
+ 0x5, 0xf7, 0x24, 0xb9, 0xd7, 0xf7, 0x13, 0x9f,
+ 0x1f, 0xea, 0x9a, 0xa2, 0xf7, 0xe, 0xe9, 0x1b,
+ 0x97, 0xd9, 0x5, 0x2d, 0x91, 0xdd, 0xea, 0x99,
+ 0x1f, 0xf7, 0x28, 0xa1, 0x89, 0xea, 0xfb, 0x38,
+ 0x1b, 0x80, 0x41, 0x5, 0xee, 0x89, 0x7c, 0xfb,
+ 0x2e, 0x74, 0x1f, 0x7a, 0xfb, 0x6, 0x92, 0x48,
+ 0xd9, 0x68, 0xfb, 0x0, 0x5b, 0x86, 0x6b, 0x71,
+ 0xfb, 0x44, 0x8, 0x33, 0x7e, 0x71, 0x62, 0x3d,
+ 0x1b, 0xe, 0x5f, 0xa, 0xa0, 0xf8, 0x12, 0x3,
+ 0xf7, 0xf, 0xfb, 0x14, 0x15, 0xf7, 0x33, 0xf9,
+ 0xa2, 0x5, 0xf6, 0x6, 0x99, 0xcf, 0x5, 0xfb,
+ 0x59, 0x6, 0xfb, 0x4d, 0xfe, 0x2a, 0x5, 0xf7,
+ 0x57, 0x6, 0x9a, 0xcf, 0x5, 0xe, 0x5f, 0xa,
+ 0x7d, 0xf8, 0x12, 0x3, 0xfb, 0x14, 0x4, 0x7d,
+ 0x47, 0x5, 0xf7, 0x56, 0x6, 0xf7, 0x50, 0xfa,
+ 0x2a, 0x5, 0xfb, 0x54, 0x6, 0x7c, 0x47, 0x5,
+ 0xf5, 0x6, 0xfb, 0x36, 0xfd, 0xa2, 0x5, 0xe,
+ 0xae, 0xf8, 0xe7, 0xca, 0x1, 0xf7, 0x3b, 0xc8,
+ 0x3, 0xf7, 0x3b, 0xf9, 0x6f, 0x15, 0x42, 0x8e,
+ 0xb9, 0x4c, 0xe5, 0x1b, 0xf7, 0x2, 0xb9, 0xe2,
+ 0xbc, 0x99, 0x1f, 0x4e, 0x6, 0x73, 0x81, 0x6f,
+ 0x5a, 0x47, 0x1b, 0x53, 0x78, 0xa9, 0xb6, 0x85,
+ 0x1f, 0xe, 0x65, 0x8d, 0x76, 0xf9, 0x88, 0x77,
+ 0x1, 0xf7, 0x4b, 0xf8, 0x3f, 0x15, 0xd8, 0x6,
+ 0xcb, 0xf7, 0xca, 0x5, 0x3e, 0x6, 0xfb, 0x31,
+ 0xfd, 0x88, 0x15, 0xd8, 0x6, 0xcb, 0xf7, 0xc9,
+ 0x5, 0x3e, 0x6, 0xe, 0xbf, 0xf7, 0x73, 0x76,
+ 0xf7, 0xcf, 0x77, 0x1, 0xe6, 0xf7, 0xfd, 0x15,
+ 0x34, 0xd3, 0x43, 0xe4, 0xe3, 0xd4, 0xd3, 0xe2,
+ 0xe1, 0x42, 0xd1, 0x33, 0x32, 0x43, 0x45, 0x35,
+ 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf7, 0xc5,
+ 0xf7, 0x46, 0x41, 0xd5, 0x1, 0xd5, 0xea, 0xf7,
+ 0xb8, 0xe7, 0x3, 0xf8, 0x3e, 0xf7, 0x52, 0x15,
+ 0x54, 0x78, 0x5c, 0x3b, 0x36, 0x1b, 0x72, 0x3a,
+ 0x98, 0xf7, 0x12, 0xbf, 0xa0, 0xf7, 0x6e, 0xf7,
+ 0x36, 0xa6, 0xdd, 0x84, 0x28, 0x1f, 0xe7, 0x90,
+ 0x5, 0xf7, 0x1d, 0xfb, 0x4, 0xb1, 0x3b, 0xfb,
+ 0x6d, 0x45, 0xfb, 0x66, 0xfb, 0x1a, 0xfb, 0x26,
+ 0xe7, 0x4c, 0xf7, 0x0, 0xf3, 0xe8, 0xc6, 0xf7,
+ 0x1d, 0xbb, 0x1e, 0xe, 0x53, 0xa, 0xf7, 0x83,
+ 0xf8, 0xe5, 0x15, 0xed, 0x6, 0xf7, 0x17, 0xf7,
+ 0x21, 0x3d, 0xa, 0x3a, 0x31, 0x64, 0xe5, 0x5,
+ 0x3c, 0x6, 0xe, 0xf7, 0x5e, 0xfb, 0x60, 0x76,
+ 0xf7, 0x58, 0xd1, 0xf7, 0xce, 0xf7, 0x4b, 0x40,
+ 0xd6, 0x1, 0xd5, 0xea, 0xf7, 0x3, 0xdd, 0xee,
+ 0xe6, 0x3, 0xf7, 0x63, 0x2d, 0x15, 0xa7, 0xb8,
+ 0x8e, 0x68, 0x5c, 0x3c, 0x91, 0x5b, 0x1f, 0x78,
+ 0x53, 0x5, 0x8a, 0x9e, 0xa1, 0x8a, 0x9e, 0x1b,
+ 0xb2, 0xf7, 0x15, 0x98, 0xe3, 0x9d, 0x83, 0xbb,
+ 0x41, 0x1f, 0x97, 0xa8, 0x5, 0xf7, 0x1, 0xd9,
+ 0xe1, 0xf7, 0x6, 0xb3, 0x1f, 0x2f, 0x95, 0x5,
+ 0x53, 0x78, 0x5b, 0x37, 0x36, 0x1b, 0x63, 0x49,
+ 0xb3, 0xf5, 0xdc, 0xa8, 0xf7, 0x57, 0xf7, 0x2f,
+ 0xa6, 0xdc, 0x74, 0x33, 0x1f, 0xe6, 0x91, 0x5,
+ 0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x3b, 0xfb, 0x68,
+ 0x40, 0xfb, 0x61, 0xfb, 0x26, 0xfb, 0x44, 0xf7,
+ 0x11, 0x62, 0xae, 0x8e, 0x1e, 0xe, 0xae, 0xfb,
+ 0x60, 0x76, 0xf7, 0x75, 0x77, 0x12, 0xf7, 0x2e,
+ 0xd9, 0x17, 0xee, 0x16, 0x78, 0x38, 0x5, 0xb8,
+ 0xa8, 0x79, 0x6f, 0x67, 0x4b, 0x8d, 0x7d, 0x66,
+ 0x7f, 0x8d, 0x8c, 0x7b, 0x1f, 0x13, 0xe0, 0x82,
+ 0x4f, 0x5, 0x87, 0xa2, 0xa9, 0x8a, 0xa2, 0x1b,
+ 0xa7, 0xf7, 0x12, 0x90, 0xe6, 0x96, 0x88, 0xc6,
+ 0x3d, 0x98, 0x1f, 0x95, 0xb9, 0x5, 0xe, 0xad,
+ 0xc1, 0xf7, 0xd8, 0xc5, 0x1, 0xf6, 0x2a, 0x15,
+ 0xc4, 0x79, 0xe0, 0xf7, 0x2d, 0x5, 0x89, 0x94,
+ 0x9b, 0x89, 0xa4, 0x1b, 0xf2, 0xed, 0xb7, 0xf7,
+ 0x1, 0xbd, 0x1f, 0x40, 0x92, 0x5, 0x61, 0x78,
+ 0x46, 0x4b, 0x34, 0x1b, 0x82, 0x83, 0x8d, 0x8c,
+ 0x87, 0x1f, 0xf7, 0x40, 0xf7, 0xca, 0xb4, 0x75,
+ 0x9e, 0x68, 0x8c, 0x78, 0x19, 0xd3, 0x8f, 0x5,
+ 0x9f, 0x7d, 0xd7, 0x32, 0xa7, 0x1e, 0xdf, 0xf7,
+ 0x2c, 0x53, 0x9d, 0x34, 0xfb, 0x33, 0x5, 0x8c,
+ 0x83, 0x82, 0x8c, 0x7a, 0x1b, 0xfb, 0x71, 0x43,
+ 0xfb, 0x3a, 0x23, 0x5d, 0x9a, 0x4e, 0xdd, 0x68,
+ 0x1f, 0xac, 0xc7, 0x15, 0x79, 0x95, 0x66, 0x9d,
+ 0xc1, 0x1a, 0xb7, 0xa9, 0xf7, 0x3c, 0xf7, 0x51,
+ 0x1e, 0xe, 0xae, 0xf8, 0xe5, 0xe5, 0x31, 0xf7,
+ 0x21, 0x12, 0x13, 0x80, 0xf7, 0x27, 0xf8, 0xe5,
+ 0x15, 0xe7, 0x6, 0xdc, 0xe5, 0xb2, 0x31, 0x5,
+ 0xda, 0x6, 0x13, 0x40, 0x4d, 0xf7, 0x21, 0x57,
+ 0xa, 0xe, 0x77, 0x8b, 0xeb, 0xf7, 0xd8, 0xeb,
+ 0x1, 0xe2, 0xf7, 0x6a, 0x3, 0xf7, 0x43, 0xf8,
+ 0x38, 0x40, 0xa, 0xfb, 0x2, 0xfc, 0x98, 0x40,
+ 0xa, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x91,
+ 0x77, 0x1, 0xe2, 0x8e, 0x15, 0xc4, 0x6, 0x78,
+ 0x2d, 0x5f, 0x81, 0x7a, 0x87, 0x83, 0x61, 0x18,
+ 0x67, 0xa, 0x92, 0xaf, 0x9e, 0xe5, 0x18, 0x22,
+ 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xc9, 0xee, 0xc6,
+ 0xf7, 0xce, 0xc2, 0xf4, 0xc9, 0x1, 0xc1, 0xcc,
+ 0xf9, 0x21, 0xcc, 0x3, 0xf8, 0xcb, 0xf7, 0xbe,
+ 0x15, 0x34, 0x6b, 0x41, 0x81, 0x6f, 0x1b, 0x44,
+ 0x4f, 0xbb, 0xf6, 0x98, 0x1f, 0xd6, 0x94, 0xb9,
+ 0xdf, 0xef, 0x1b, 0x9d, 0xd0, 0x8a, 0x3f, 0xa1,
+ 0x1f, 0xcb, 0x99, 0x5, 0xdd, 0x7b, 0x46, 0xaf,
+ 0x3a, 0x1b, 0xfb, 0x17, 0x35, 0x37, 0xfb, 0x16,
+ 0x7b, 0x1f, 0xfb, 0x1c, 0x7b, 0xd9, 0x3d, 0xf7,
+ 0xc, 0x1b, 0xdd, 0xe2, 0xb6, 0xe9, 0xad, 0x1f,
+ 0xfc, 0xd3, 0xd8, 0x15, 0xfb, 0x65, 0xf7, 0x45,
+ 0xfb, 0x3a, 0xf7, 0x6d, 0xf7, 0x6d, 0xf7, 0x40,
+ 0xf7, 0x3b, 0xf7, 0x64, 0xf7, 0x65, 0xfb, 0x42,
+ 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6a, 0xfb, 0x48,
+ 0xfb, 0x3f, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+ 0x42, 0xf7, 0x29, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+ 0x49, 0xf7, 0x23, 0xfb, 0x25, 0xfb, 0x42, 0xfb,
+ 0x42, 0xfb, 0x23, 0xfb, 0x1f, 0xfb, 0x49, 0xfb,
+ 0x48, 0xfb, 0x29, 0xf7, 0x1f, 0xf7, 0x42, 0x1e,
+ 0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, 0x9e,
+ 0xdf, 0xae, 0x77, 0x1, 0xee, 0xee, 0x15, 0xe3,
+ 0xd3, 0x5, 0x70, 0xa9, 0xb0, 0x81, 0xb0, 0x1b,
+ 0xb0, 0xbb, 0x95, 0xa6, 0xb7, 0x1f, 0xbb, 0x43,
+ 0xd4, 0xc8, 0x5a, 0xd0, 0xb6, 0xbd, 0x9c, 0xb8,
+ 0x92, 0xa5, 0x19, 0x92, 0xa7, 0x94, 0xb8, 0x7a,
+ 0xbb, 0xe3, 0xd2, 0x18, 0x63, 0xc8, 0x33, 0x43,
+ 0x5, 0xa6, 0x6e, 0x63, 0x95, 0x66, 0x1b, 0x66,
+ 0x5e, 0x81, 0x70, 0x5e, 0x1f, 0x5b, 0xd3, 0x43,
+ 0x4e, 0xbb, 0x44, 0x60, 0x5b, 0x79, 0x5e, 0x84,
+ 0x6f, 0x19, 0x84, 0x71, 0x83, 0x5e, 0x9c, 0x59,
+ 0x34, 0x46, 0x18, 0xf7, 0x39, 0xf7, 0x52, 0x15,
+ 0xd6, 0xa0, 0xd3, 0xc6, 0xd1, 0x1b, 0xd1, 0xb5,
+ 0x4f, 0x41, 0x76, 0x1f, 0x42, 0x77, 0x42, 0x50,
+ 0x44, 0x1b, 0x46, 0x62, 0xc6, 0xd4, 0x9f, 0x1f,
+ 0xe, 0x7c, 0xd3, 0x4f, 0xc7, 0xf8, 0x25, 0xd4,
+ 0xf7, 0x4f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0x78,
+ 0xf8, 0x30, 0x88, 0x15, 0xe0, 0x6, 0xf7, 0x2f,
+ 0xf9, 0x65, 0x3d, 0xa, 0x50, 0xfb, 0xad, 0x4e,
+ 0xa, 0xd5, 0x64, 0x51, 0x9f, 0x55, 0x1b, 0xfb,
+ 0x20, 0xfb, 0x10, 0xfb, 0x1c, 0xfb, 0x4a, 0x1f,
+ 0x13, 0xb8, 0xfb, 0x3c, 0xf3, 0x4f, 0xd6, 0xd0,
+ 0xc0, 0xb2, 0xba, 0xb6, 0x1e, 0x13, 0x78, 0xfb,
+ 0x90, 0xf7, 0x22, 0x15, 0xc4, 0xb5, 0xf7, 0x50,
+ 0xf7, 0x16, 0xc2, 0xcf, 0x67, 0x2a, 0xfb, 0x1e,
+ 0x3a, 0xfb, 0x16, 0x27, 0xfb, 0x6, 0x8b, 0xf7,
+ 0x11, 0xaa, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+ 0xe6, 0xd5, 0xf7, 0x65, 0x77, 0x1, 0xf7, 0x1b,
+ 0xf8, 0x7b, 0x3, 0xf7, 0x61, 0xfb, 0x33, 0x15,
+ 0xe2, 0x6, 0xf7, 0xf, 0xf8, 0xe6, 0x5, 0xf7,
+ 0x54, 0x6, 0x9a, 0xd5, 0x5, 0xfb, 0x53, 0x6,
+ 0xb6, 0xf7, 0x65, 0x5, 0x33, 0x6, 0x60, 0xfb,
+ 0x65, 0x5, 0xfb, 0x55, 0x6, 0x7c, 0x41, 0x5,
+ 0xf7, 0x55, 0x6, 0xe, 0xfb, 0x1e, 0x76, 0xf7,
+ 0x50, 0xd5, 0xf7, 0xf6, 0xd8, 0xf7, 0x4c, 0x77,
+ 0x1, 0xbf, 0xa8, 0x15, 0xf7, 0x53, 0x6, 0x66,
+ 0xfb, 0x50, 0x5, 0xe1, 0x6, 0xb0, 0xf7, 0x50,
+ 0x5, 0xf7, 0x50, 0x6, 0x9b, 0xd5, 0x5, 0xfb,
+ 0x51, 0x6, 0xd5, 0xf7, 0xf6, 0x5, 0xf7, 0x4f,
+ 0x6, 0x9d, 0xd8, 0x5, 0xfb, 0x52, 0x6, 0xb0,
+ 0xf7, 0x4c, 0x5, 0x35, 0x6, 0x65, 0xfb, 0x4c,
+ 0x5, 0xfb, 0x52, 0x6, 0x7b, 0x3e, 0x5, 0xf7,
+ 0x53, 0x6, 0x42, 0xfb, 0xf6, 0x5, 0xfb, 0x52,
+ 0x6, 0xe, 0xf1, 0xf8, 0x2f, 0xc2, 0xf7, 0x4c,
+ 0xc0, 0x1, 0xf7, 0x3d, 0xc1, 0xf7, 0x51, 0xc3,
+ 0x3, 0xf7, 0x3d, 0xf8, 0xc3, 0x15, 0x38, 0xcf,
+ 0x4a, 0xdc, 0xdd, 0xcf, 0xcc, 0xde, 0xdc, 0x49,
+ 0xca, 0x37, 0x38, 0x49, 0x4d, 0x39, 0x1e, 0xc1,
+ 0x8c, 0x15, 0xbe, 0xb5, 0xb2, 0xbf, 0xc0, 0xb5,
+ 0x64, 0x58, 0x57, 0x60, 0x61, 0x57, 0x58, 0x60,
+ 0xb5, 0xbf, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1,
+ 0x1, 0xf7, 0xf9, 0xf9, 0x56, 0x5d, 0xa, 0xfb,
+ 0x27, 0xf1, 0x5d, 0xa, 0xe, 0xf7, 0xb2, 0x78,
+ 0xec, 0xf7, 0x18, 0xdd, 0xf7, 0x1a, 0xed, 0x1,
+ 0xe0, 0xf7, 0x66, 0x15, 0xf8, 0x76, 0x6, 0xb2,
+ 0xdd, 0x5, 0xfc, 0x76, 0x6, 0xf7, 0x7c, 0xf7,
+ 0x1a, 0x15, 0xf0, 0x6, 0xb9, 0xed, 0x5, 0x25,
+ 0x6, 0xfb, 0x61, 0xfc, 0xb3, 0x15, 0xf1, 0x6,
+ 0xb8, 0xec, 0x5, 0x26, 0x6, 0xe, 0x2d, 0x76,
+ 0xf7, 0x12, 0x76, 0xf9, 0x35, 0xd4, 0xb2, 0x77,
+ 0x1, 0xf7, 0x1a, 0xe6, 0xf7, 0xc3, 0xde, 0x3,
+ 0xf7, 0x8c, 0x81, 0x15, 0x74, 0x22, 0x5, 0xbf,
+ 0x6, 0xa0, 0xee, 0x5, 0xf7, 0x5e, 0xd0, 0xf7,
+ 0xb, 0xe5, 0xf7, 0x12, 0xfb, 0xe, 0xc9, 0x50,
+ 0xa3, 0x1f, 0xc1, 0xf7, 0x8e, 0x5, 0xc6, 0xa8,
+ 0x38, 0x6f, 0x8f, 0x1f, 0xde, 0x91, 0x5, 0xb2,
+ 0x4e, 0xf7, 0x1f, 0x29, 0x1e, 0x95, 0xba, 0x5,
+ 0x59, 0x6, 0x81, 0x64, 0x5, 0xfb, 0x55, 0x52,
+ 0xfb, 0x8, 0x3a, 0xfb, 0x13, 0xf7, 0x5, 0x58,
+ 0xbf, 0x76, 0x1f, 0x50, 0xfb, 0xa9, 0x5, 0x65,
+ 0x53, 0xb6, 0xf4, 0x83, 0x1f, 0x2e, 0x86, 0x5,
+ 0x25, 0x91, 0xca, 0xfb, 0x6, 0xf7, 0x2, 0x1b,
+ 0xe9, 0xf8, 0x46, 0x15, 0x62, 0x9e, 0x57, 0xa1,
+ 0xd5, 0x1a, 0xda, 0xd9, 0xb8, 0xcd, 0x1e, 0x3c,
+ 0xfc, 0xf5, 0x15, 0xc2, 0xf7, 0x9d, 0x5, 0xba,
+ 0x77, 0xc8, 0x6e, 0x3e, 0x1a, 0x44, 0x4a, 0x47,
+ 0x29, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1,
+ 0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xe7, 0x6, 0xa0,
+ 0xf1, 0x5, 0x2e, 0x6, 0xe, 0x77, 0x43, 0xa,
+ 0xea, 0xf7, 0x5b, 0x3, 0xea, 0x16, 0xe4, 0x6,
+ 0xf7, 0x2, 0xf8, 0x9f, 0x3e, 0xa, 0x7c, 0xd5,
+ 0xf7, 0x49, 0xd0, 0xf7, 0x33, 0xd1, 0x1, 0xdf,
+ 0xe7, 0xf7, 0xcf, 0xe2, 0x3, 0xf7, 0x44, 0xf7,
+ 0x84, 0x15, 0xf8, 0x1f, 0x6, 0x8e, 0x9f, 0x8f,
+ 0x9f, 0xb3, 0x1a, 0xe6, 0x5c, 0xf7, 0x13, 0xfb,
+ 0x38, 0xfb, 0x5a, 0x36, 0xfb, 0x55, 0xfb, 0x1b,
+ 0xfb, 0x27, 0xe8, 0x3d, 0xf7, 0x8, 0xf7, 0x1f,
+ 0xe6, 0xf7, 0x2, 0xd4, 0xa1, 0x1e, 0x32, 0x94,
+ 0x5, 0x2a, 0x61, 0x39, 0x76, 0x64, 0x1b, 0x43,
+ 0x4f, 0xd5, 0xf6, 0x9a, 0x1f, 0x99, 0xd0, 0x15,
+ 0xce, 0xa0, 0xc0, 0xe7, 0xf4, 0x1b, 0xd3, 0xc6,
+ 0x4c, 0x2b, 0x82, 0x1f, 0xe, 0x7c, 0xd5, 0x41,
+ 0xf7, 0x50, 0xcf, 0xd1, 0xf8, 0x3b, 0x77, 0x1,
+ 0xdf, 0xe7, 0x3, 0xf7, 0xd7, 0xf8, 0xe7, 0x15,
+ 0xd8, 0x6, 0xf7, 0x1d, 0x6f, 0xa, 0xfb, 0xa,
+ 0x6, 0xfb, 0x86, 0xfc, 0x81, 0x25, 0xa, 0xe,
+ 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb0, 0xf7,
+ 0x1f, 0x1, 0xdf, 0xe6, 0xf7, 0xd0, 0xe2, 0x3,
+ 0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe9, 0x6, 0xdd,
+ 0xe5, 0xb4, 0x31, 0x5, 0xdb, 0x6, 0x4c, 0xf7,
+ 0x1f, 0x47, 0xa, 0xfb, 0x61, 0xfc, 0x81, 0x25,
+ 0xa, 0xe, 0x7c, 0xd4, 0xf7, 0x48, 0xcf, 0xf7,
+ 0xbf, 0xf0, 0x1, 0xdf, 0xe6, 0x3, 0xf8, 0x56,
+ 0xf8, 0xf1, 0x63, 0xa, 0xfb, 0x64, 0x26, 0x63,
+ 0xa, 0xfb, 0x1, 0xfc, 0x65, 0x25, 0xa, 0xe,
+ 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb1, 0xf7,
+ 0x1e, 0x1, 0xdf, 0xe6, 0x3, 0xf7, 0x45, 0xf7,
+ 0x85, 0x25, 0xa, 0x29, 0xf7, 0xb1, 0x15, 0xd3,
+ 0x6, 0x50, 0xf7, 0x1e, 0x5, 0xfb, 0x3, 0x6,
+ 0xe, 0x78, 0xd0, 0xf7, 0xbb, 0xcb, 0xf7, 0x75,
+ 0xd0, 0x1, 0xd5, 0xeb, 0xf7, 0xee, 0xe6, 0x3,
+ 0xf7, 0x83, 0xf8, 0x15, 0x15, 0xfb, 0x31, 0x63,
+ 0x83, 0xfb, 0x2a, 0x6c, 0x1a, 0x23, 0xe0, 0x3c,
+ 0xf7, 0x1f, 0xf7, 0x3e, 0xf2, 0xf7, 0xb, 0xf7,
+ 0xe, 0xe9, 0x4d, 0xb4, 0x6b, 0x9d, 0x1e, 0xd0,
+ 0x9c, 0xc8, 0xcc, 0xd3, 0x1a, 0xca, 0x5c, 0xf7,
+ 0x3, 0xfb, 0x3f, 0xfb, 0x39, 0x44, 0xfb, 0xb,
+ 0x40, 0x78, 0x8d, 0x4c, 0xdf, 0x61, 0x1e, 0x46,
+ 0xfb, 0x71, 0x15, 0xe7, 0xcf, 0xe4, 0xf6, 0xd3,
+ 0xc5, 0x55, 0x46, 0x40, 0x4f, 0x2a, 0x20, 0x39,
+ 0x53, 0xbc, 0xcc, 0x1e, 0xd8, 0xf7, 0xed, 0x15,
+ 0xc2, 0xb2, 0xd1, 0xf2, 0xd4, 0xc1, 0x5d, 0x50,
+ 0x54, 0x5f, 0x4a, 0x23, 0x43, 0x5a, 0xb0, 0xca,
+ 0x1e, 0xe, 0xf9, 0x52, 0x8b, 0xf5, 0x1, 0xf8,
+ 0x57, 0x16, 0x4b, 0xa, 0xf7, 0xcf, 0x21, 0x15,
+ 0x4b, 0xa, 0xfd, 0x49, 0x21, 0x15, 0x4b, 0xa,
+ 0xe, 0xf9, 0x52, 0x64, 0xa, 0xfa, 0x8c, 0xd4,
+ 0xfe, 0x8c, 0x6, 0xe, 0x64, 0xa, 0xf8, 0xd0,
+ 0xd4, 0xfc, 0xd0, 0x6, 0xe, 0xf7, 0xb2, 0xf7,
+ 0x7, 0xdc, 0xf7, 0x8, 0xd9, 0x1, 0xb5, 0xf8,
+ 0xc9, 0x3, 0xca, 0xf7, 0xce, 0x15, 0xf8, 0xc9,
+ 0xd7, 0xfc, 0xc9, 0x6, 0xfb, 0xa7, 0x4, 0xf8,
+ 0xc9, 0xda, 0xfc, 0xc9, 0x6, 0xe, 0x81, 0xd5,
+ 0x1, 0xf8, 0x8e, 0xf0, 0x3, 0xf7, 0xf0, 0xf8,
+ 0xd1, 0x15, 0xf7, 0x0, 0xb9, 0xa5, 0x5e, 0xa0,
+ 0x5b, 0x94, 0x59, 0x19, 0x89, 0x89, 0x5, 0xa2,
+ 0x72, 0x61, 0xae, 0x36, 0x1b, 0xfb, 0x2a, 0xfb,
+ 0x13, 0xfb, 0x29, 0xfb, 0x47, 0xfb, 0x7, 0xd2,
+ 0x23, 0xf7, 0x32, 0xf7, 0x8c, 0xc6, 0xf7, 0x90,
+ 0xf7, 0x8, 0xf7, 0x38, 0x53, 0xe4, 0x6d, 0xb9,
+ 0x1f, 0xdd, 0xae, 0x73, 0xbd, 0x2e, 0x65, 0x88,
+ 0x90, 0x78, 0x9e, 0x7a, 0x99, 0x19, 0x28, 0x6,
+ 0xa5, 0x73, 0x90, 0x85, 0xad, 0x62, 0x28, 0x60,
+ 0x18, 0xfb, 0x26, 0xfc, 0x37, 0x15, 0xea, 0xc3,
+ 0xf7, 0x33, 0xf7, 0x26, 0xcb, 0xd3, 0x68, 0x21,
+ 0x34, 0x4f, 0xfb, 0x3f, 0xfb, 0x24, 0xfb, 0x3,
+ 0x74, 0xdf, 0xc8, 0x1e, 0xe, 0x77, 0x8b, 0xef,
+ 0xe0, 0x77, 0xf8, 0xbd, 0x77, 0x1, 0xe5, 0x16,
+ 0xef, 0x6, 0xa0, 0xef, 0x47, 0xa, 0xb0, 0xe0,
+ 0x15, 0xc2, 0x6, 0xf3, 0xf8, 0x4, 0xac, 0xf7,
+ 0x39, 0x5, 0x20, 0x6, 0x6c, 0xfb, 0x39, 0x5,
+ 0xe, 0xae, 0xfb, 0x42, 0x76, 0xf8, 0xaf, 0x77,
+ 0xf0, 0xed, 0x1, 0xd8, 0xf7, 0x8d, 0x3, 0xf7,
+ 0x61, 0xf8, 0x3d, 0x15, 0xef, 0x6, 0xa0, 0xed,
+ 0x47, 0xa, 0xfb, 0x8, 0xfc, 0xc0, 0x15, 0x6a,
+ 0xfb, 0x36, 0x5, 0xf6, 0x6, 0xab, 0xf7, 0x36,
+ 0xc1, 0xf8, 0xd, 0x5, 0x54, 0x6, 0xe, 0x77,
+ 0x3a, 0xa, 0xf5, 0xf7, 0xde, 0x3, 0xe1, 0x16,
+ 0xdb, 0x6, 0xe0, 0xf8, 0x56, 0x5, 0xe5, 0x6,
+ 0x98, 0xcf, 0x3f, 0xa, 0xf0, 0x9f, 0x91, 0xa9,
+ 0xb5, 0x1b, 0xa7, 0xa8, 0x82, 0x88, 0x98, 0x1f,
+ 0x99, 0xd8, 0x5, 0x8f, 0x79, 0x62, 0x95, 0x6c,
+ 0x1b, 0x25, 0x80, 0x36, 0x46, 0x7a, 0x1f, 0x7f,
+ 0x53, 0x5, 0x43, 0x6, 0x7f, 0x47, 0x5, 0xd2,
+ 0x6, 0xe, 0xf7, 0x5e, 0x3a, 0xa, 0xe1, 0x16,
+ 0xe5, 0x46, 0xa, 0xa1, 0x8f, 0xa9, 0xba, 0x1b,
+ 0xaa, 0xae, 0x82, 0x88, 0x99, 0x1f, 0x9b, 0xd8,
+ 0x5, 0x8f, 0x77, 0x62, 0x95, 0x68, 0x1b, 0xfb,
+ 0x6, 0x7a, 0x36, 0x46, 0x78, 0x1f, 0x7e, 0x53,
+ 0x5, 0x3b, 0x6, 0x7c, 0x47, 0x5, 0xdc, 0x6,
+ 0xf7, 0x36, 0xfc, 0x56, 0x15, 0xe5, 0x6, 0xf7,
+ 0x3, 0xf8, 0x9a, 0x3f, 0xa, 0x9f, 0xe9, 0x15,
+ 0xe5, 0x6, 0xa1, 0xf3, 0x3e, 0xa, 0x78, 0xd0,
+ 0xf7, 0xef, 0xd9, 0xf7, 0x2d, 0xdb, 0x1, 0xcf,
+ 0xee, 0xf7, 0xb7, 0xeb, 0x3, 0xce, 0xf7, 0x57,
+ 0x15, 0x23, 0xd4, 0xfb, 0x2, 0xf7, 0x2e, 0xf7,
+ 0x41, 0xf7, 0x10, 0xf7, 0xd, 0xf7, 0x37, 0xf7,
+ 0x2c, 0xfb, 0xa, 0xc5, 0x34, 0x41, 0x61, 0x6e,
+ 0x7e, 0x73, 0x1e, 0xc6, 0xf7, 0x47, 0x5, 0xf7,
+ 0xbd, 0x6, 0x9e, 0xdb, 0x5, 0xfc, 0x12, 0x6,
+ 0xfb, 0x9, 0xfb, 0xfe, 0xdf, 0x84, 0x5, 0x9e,
+ 0x9b, 0xbc, 0xc2, 0xdf, 0x1b, 0xe7, 0xbb, 0x4c,
+ 0x46, 0x23, 0x34, 0xfb, 0x3, 0x20, 0x50, 0x38,
+ 0xb8, 0xf7, 0x1, 0x93, 0x1f, 0xe, 0xf7, 0x5e,
+ 0x3a, 0xa, 0xe1, 0x16, 0xe4, 0x46, 0xa, 0xa2,
+ 0x8f, 0xa9, 0xba, 0x1b, 0xaa, 0xac, 0x82, 0x88,
+ 0x9a, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, 0x63,
+ 0x95, 0x68, 0x1b, 0xfb, 0x5, 0x78, 0x37, 0x46,
+ 0x79, 0x1f, 0x7e, 0x52, 0x5, 0x3a, 0x6, 0x7d,
+ 0x47, 0x5, 0xdc, 0x6, 0xf7, 0x35, 0xfc, 0x56,
+ 0x15, 0xe5, 0x6, 0xf7, 0x2c, 0xf9, 0x60, 0x5,
+ 0x32, 0x6, 0xe, 0xfb, 0x63, 0xd9, 0xf8, 0xda,
+ 0xd1, 0xf7, 0x17, 0xde, 0x1, 0x77, 0xfb, 0xa,
+ 0x15, 0x6b, 0x3e, 0x5, 0x7f, 0xc7, 0xb2, 0x8b,
+ 0x92, 0x1b, 0xdb, 0xca, 0xdc, 0xe4, 0xae, 0x1f,
+ 0xf7, 0x4d, 0xf8, 0x7e, 0x5, 0xf0, 0x6, 0xa7,
+ 0xd1, 0x5, 0x25, 0x6, 0xf3, 0xb6, 0x98, 0xa6,
+ 0xbb, 0x1b, 0xa0, 0x9c, 0x87, 0x82, 0xae, 0x1f,
+ 0xac, 0xd8, 0x5, 0x95, 0x6a, 0x6d, 0x94, 0x64,
+ 0x1b, 0xfb, 0x6, 0x67, 0x27, 0xfb, 0x6, 0x5b,
+ 0x1f, 0x27, 0x6, 0x71, 0x45, 0x5, 0xee, 0x6,
+ 0xfb, 0x48, 0xfc, 0x7d, 0x5, 0x64, 0x7b, 0x68,
+ 0x55, 0x60, 0x1b, 0x7b, 0x76, 0x8e, 0x93, 0x67,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x48, 0xd9, 0xf7,
+ 0xc0, 0xf7, 0x2e, 0x1, 0xcb, 0xf7, 0x48, 0x15,
+ 0xf7, 0xd0, 0x6, 0x62, 0xfb, 0x48, 0x5, 0xeb,
+ 0x6, 0xb5, 0xf7, 0x48, 0x5, 0xf7, 0x1, 0x6,
+ 0x9e, 0xd9, 0x5, 0xfb, 0x2, 0x6, 0xf1, 0xf8,
+ 0x51, 0x5, 0x3d, 0x6, 0xfc, 0x46, 0xfc, 0x49,
+ 0x5, 0xe8, 0x83, 0x15, 0xf7, 0xb2, 0xf7, 0xb9,
+ 0x8d, 0x89, 0x48, 0xfb, 0xb7, 0x5, 0xe, 0xfb,
+ 0x17, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, 0xfb,
+ 0x3b, 0xf9, 0x20, 0x3, 0x23, 0x78, 0x15, 0xf8,
+ 0xde, 0xf9, 0x66, 0x5, 0x43, 0x6, 0xfc, 0xd8,
+ 0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd5, 0xf7,
+ 0x1f, 0xd5, 0xf8, 0x21, 0xd5, 0x7f, 0x77, 0x12,
+ 0x13, 0xd0, 0xb5, 0x54, 0x15, 0xfb, 0x30, 0xf7,
+ 0x36, 0x82, 0xc0, 0xf7, 0x57, 0xac, 0xf7, 0x2f,
+ 0xd6, 0x9b, 0x1e, 0xf7, 0x1, 0xf8, 0x98, 0x5,
+ 0x37, 0x6, 0x7b, 0x33, 0x4e, 0xa, 0x13, 0xe0,
+ 0xe0, 0x5c, 0x47, 0x9a, 0x5c, 0x1b, 0xfb, 0x28,
+ 0xfb, 0xe, 0xfb, 0x26, 0xfb, 0x33, 0xfb, 0x2b,
+ 0xe2, 0x32, 0xf4, 0xb5, 0xbf, 0x98, 0xc4, 0xc5,
+ 0x1f, 0x82, 0x56, 0x5, 0x2e, 0x7a, 0x61, 0x4c,
+ 0x22, 0x1b, 0x25, 0x81, 0xb9, 0xaf, 0x1f, 0xae,
+ 0xf7, 0xbd, 0x15, 0xd2, 0xc2, 0xf7, 0x34, 0xf7,
+ 0xf, 0xd9, 0xbd, 0x4b, 0x3d, 0x27, 0x4b, 0xfb,
+ 0x2f, 0xfb, 0x12, 0x31, 0x71, 0xe6, 0xd6, 0x1e,
+ 0xe, 0xf7, 0xcd, 0x7c, 0xd3, 0x64, 0x76, 0xf9,
+ 0x2b, 0xcf, 0x12, 0xf8, 0xb8, 0xef, 0x13, 0x70,
+ 0xce, 0x88, 0x15, 0xee, 0x6, 0xf7, 0x6, 0xf8,
+ 0x84, 0x5, 0xe5, 0xa0, 0xbb, 0xd8, 0xf6, 0x1b,
+ 0xe0, 0x81, 0x2a, 0x5a, 0x61, 0x1f, 0x53, 0x4b,
+ 0x6b, 0x62, 0x65, 0x1a, 0x66, 0xa7, 0x68, 0xc6,
+ 0x59, 0x1e, 0xc0, 0x5c, 0x9c, 0x79, 0x6f, 0x1a,
+ 0x13, 0xb0, 0x5d, 0x56, 0x56, 0x4b, 0x4e, 0x6b,
+ 0xc4, 0xa6, 0x7c, 0x1e, 0x38, 0x62, 0x5, 0x23,
+ 0xd0, 0xd7, 0x80, 0xba, 0x1b, 0xf7, 0x8, 0xef,
+ 0xda, 0xe7, 0xc1, 0x6e, 0xa5, 0x4a, 0xc8, 0x1f,
+ 0x5f, 0xb4, 0x79, 0xa2, 0xa2, 0x1a, 0xa2, 0xa2,
+ 0xa5, 0xb3, 0xb9, 0x1e, 0xec, 0xdf, 0x7f, 0xf7,
+ 0x2c, 0xfb, 0x46, 0x1b, 0xfb, 0x3d, 0x3b, 0xfb,
+ 0x1, 0xfb, 0x12, 0x6d, 0x1f, 0xe, 0x53, 0xa,
+ 0xf7, 0x9f, 0xf8, 0xe5, 0x56, 0xa, 0x6d, 0xa,
+ 0xfb, 0x1, 0x6, 0xe, 0xf7, 0xb2, 0xbc, 0x76,
+ 0xf8, 0x60, 0x77, 0x1, 0xf7, 0x16, 0xf8, 0x71,
+ 0x3, 0xf7, 0xc, 0x96, 0x15, 0xf8, 0x71, 0xf7,
+ 0x5c, 0x5, 0xde, 0x7, 0xfc, 0x71, 0xf7, 0x5d,
+ 0x5, 0x34, 0x7, 0xf8, 0x0, 0xfb, 0x2f, 0xfc,
+ 0x0, 0xfb, 0x2f, 0x5, 0xe, 0x49, 0xa, 0xf8,
+ 0x2c, 0xf7, 0x17, 0x15, 0xc6, 0x6, 0x45, 0xf7,
+ 0x64, 0xf7, 0x31, 0xf7, 0x5d, 0x5, 0x4a, 0x6,
+ 0xfb, 0x3f, 0xfb, 0x5d, 0x5, 0x39, 0xfb, 0x64,
+ 0x15, 0xc7, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x30,
+ 0xf7, 0x5d, 0x5, 0x4b, 0x6, 0xfb, 0x40, 0xfb,
+ 0x5d, 0x5, 0xe, 0x49, 0xa, 0xf7, 0xc, 0xf7,
+ 0x17, 0x15, 0xcc, 0x6, 0xf7, 0x3f, 0xf7, 0x5d,
+ 0x31, 0xf7, 0x64, 0x5, 0x51, 0x6, 0xd0, 0xfb,
+ 0x64, 0x5, 0x9a, 0xfb, 0x5d, 0x15, 0xcb, 0x6,
+ 0xf7, 0x40, 0xf7, 0x5d, 0x31, 0xf7, 0x64, 0x5,
+ 0x50, 0x6, 0xd0, 0xfb, 0x64, 0x5, 0xe, 0xbf,
+ 0x49, 0xa, 0xf7, 0x75, 0xf7, 0x17, 0x15, 0xc0,
+ 0x6, 0x4c, 0xf7, 0x60, 0xf7, 0x22, 0xf7, 0x61,
+ 0x5, 0x51, 0x6, 0xfb, 0x2f, 0xfb, 0x61, 0x5,
+ 0xe, 0xae, 0xf7, 0x2b, 0x76, 0xf8, 0x29, 0x77,
+ 0x1, 0xf7, 0x9, 0xf7, 0x16, 0x15, 0xc5, 0x6,
+ 0xf7, 0x2f, 0xf7, 0x55, 0x39, 0xf7, 0x68, 0x5,
+ 0x57, 0x6, 0xc8, 0xfb, 0x68, 0x5, 0xe, 0xa0,
+ 0x76, 0xf8, 0x5f, 0xd3, 0xf7, 0x4f, 0x77, 0x1,
+ 0xcc, 0x16, 0xe7, 0x6, 0xba, 0xf7, 0x73, 0x94,
+ 0xb5, 0x9c, 0xd6, 0xad, 0xb8, 0x19, 0xb4, 0xac,
+ 0xc0, 0xac, 0xcc, 0x1b, 0xeb, 0x71, 0x2f, 0x4f,
+ 0x7d, 0x1f, 0x47, 0xfb, 0xc7, 0x5, 0xe7, 0x6,
+ 0xcd, 0xf7, 0xc7, 0x5, 0x91, 0xac, 0x91, 0xaf,
+ 0xad, 0x1a, 0xcc, 0x6c, 0xc3, 0x22, 0x34, 0x4f,
+ 0x56, 0x69, 0x65, 0x1e, 0xc5, 0xf7, 0xa6, 0x3e,
+ 0xa, 0x53, 0xa, 0xf7, 0x31, 0xf8, 0xe5, 0x4f,
+ 0xa, 0xdd, 0xfb, 0x21, 0x4f, 0xa, 0xe, 0xae,
+ 0xf7, 0x7c, 0xe5, 0x1, 0xe8, 0xf7, 0x9c, 0x3,
+ 0xe8, 0xf7, 0x7c, 0x15, 0xf7, 0x8b, 0x6, 0x9c,
+ 0xe5, 0x5, 0xfb, 0x8b, 0x6, 0xe, 0x3f, 0xa0,
+ 0x76, 0xf8, 0x99, 0x77, 0xf7, 0xe, 0xee, 0x1,
+ 0xce, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, 0x99,
+ 0x3f, 0xa, 0xa0, 0xf1, 0x15, 0xe5, 0x6, 0xa0,
+ 0xee, 0x3e, 0xa, 0x52, 0xa, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x45, 0xf8, 0xe8, 0x6e, 0xa, 0xf7,
+ 0x34, 0xf7, 0x1e, 0x5, 0xfb, 0x1e, 0x6, 0xfb,
+ 0x57, 0xfd, 0x72, 0x15, 0x38, 0xa, 0xe, 0x52,
+ 0xa, 0xe4, 0xf7, 0x1e, 0x1, 0xf7, 0x2, 0xf8,
+ 0xe8, 0x15, 0xea, 0x6, 0xdf, 0xe4, 0xb3, 0x32,
+ 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x1e, 0x5, 0x26,
+ 0x6, 0xfb, 0x2b, 0xfd, 0x72, 0x15, 0x38, 0xa,
+ 0xe, 0x5c, 0xa, 0xf8, 0xf1, 0xf0, 0x1, 0xf7,
+ 0xc4, 0xf8, 0xf1, 0x6e, 0xa, 0xa0, 0xf0, 0x45,
+ 0xa, 0xfb, 0x5c, 0x26, 0x6e, 0xa, 0xa0, 0xf0,
+ 0x45, 0xa, 0x58, 0xfd, 0x56, 0x15, 0x38, 0xa,
+ 0xe, 0x52, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xea,
+ 0x16, 0x38, 0xa, 0xb8, 0xd0, 0x15, 0xcd, 0x6,
+ 0x54, 0xf7, 0x1e, 0x5, 0x25, 0x6, 0xe, 0x3f,
+ 0xfb, 0x51, 0x76, 0xf9, 0x6b, 0x77, 0xf7, 0xe,
+ 0xee, 0x1, 0x5d, 0xfb, 0xd, 0x15, 0x7d, 0x3f,
+ 0x5, 0x7e, 0xba, 0xa5, 0x8b, 0x92, 0x1b, 0xe7,
+ 0xab, 0xf7, 0x10, 0xdf, 0x9c, 0x1f, 0xf7, 0x0,
+ 0xf8, 0x9b, 0x5, 0x36, 0x6, 0x24, 0xfc, 0x9b,
+ 0x72, 0xfb, 0x11, 0x78, 0x7a, 0x38, 0xa2, 0x19,
+ 0xf7, 0x8d, 0xf9, 0x78, 0x15, 0xe0, 0x6, 0x9f,
+ 0xee, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x2d,
+ 0xa, 0xce, 0x16, 0xe5, 0x6, 0xb1, 0xf7, 0x42,
+ 0xf7, 0x2, 0xe9, 0xf4, 0xfb, 0xa0, 0x5, 0xef,
+ 0x6, 0xfb, 0x1e, 0xf7, 0xdb, 0xf7, 0x78, 0xf7,
+ 0x57, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x9a, 0xfb,
+ 0x8c, 0x89, 0x8d, 0xea, 0xf8, 0x4e, 0x3e, 0xa,
+ 0x3f, 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, 0xf7,
+ 0x2b, 0xf9, 0x62, 0x5, 0x32, 0x6, 0xe, 0xf7,
+ 0xb2, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xe9,
+ 0xf7, 0x68, 0x15, 0xf8, 0x71, 0xfb, 0x5d, 0x5,
+ 0xe2, 0x7, 0xfc, 0x0, 0xf7, 0x2f, 0xf8, 0x0,
+ 0xf7, 0x2f, 0x5, 0xe2, 0x7, 0xfc, 0x71, 0xfb,
+ 0x5d, 0x5, 0xe, 0xf7, 0xb2, 0xf7, 0x15, 0x76,
+ 0xf7, 0x60, 0xd9, 0x1, 0xf5, 0xf7, 0xcc, 0x15,
+ 0xf8, 0x3b, 0x6, 0x5b, 0xfb, 0x60, 0x5, 0xdd,
+ 0x6, 0xcc, 0xf7, 0xae, 0x5, 0xfc, 0x8d, 0x6,
+ 0xe, 0x3f, 0x2d, 0xa, 0xc0, 0x16, 0xf1, 0x6,
+ 0xe0, 0xf7, 0xfb, 0xe4, 0xb4, 0x9d, 0xd8, 0x32,
+ 0x61, 0xcf, 0xf7, 0xaf, 0x5, 0x26, 0x6, 0x3b,
+ 0xfb, 0xe4, 0x34, 0x64, 0x7a, 0x3e, 0xe0, 0xb3,
+ 0x5, 0xe, 0xf8, 0xab, 0x60, 0xa, 0x13, 0xc0,
+ 0xcc, 0x16, 0xe5, 0x6, 0xbf, 0xf7, 0x8d, 0x5,
+ 0xe1, 0x9e, 0xbc, 0xf7, 0x16, 0xf7, 0xe, 0x1b,
+ 0xd2, 0x83, 0x42, 0x56, 0x7f, 0x1f, 0x41, 0xfb,
+ 0xe7, 0x5, 0xe4, 0x6, 0xc1, 0xf7, 0x94, 0x5,
+ 0xc9, 0x98, 0xb6, 0xf7, 0x27, 0xf7, 0x16, 0x1b,
+ 0xca, 0x91, 0x52, 0x46, 0x7d, 0x1f, 0x41, 0xfb,
+ 0xe7, 0x5, 0xe4, 0x6, 0xd3, 0xf7, 0xe7, 0x5,
+ 0x90, 0xa3, 0x8d, 0xa0, 0x9f, 0x1a, 0x13, 0xa0,
+ 0xdb, 0x5d, 0xc1, 0x38, 0x6c, 0x42, 0x83, 0x31,
+ 0x42, 0x1e, 0xdf, 0x78, 0x49, 0x99, 0x62, 0x1b,
+ 0x37, 0x59, 0x55, 0x61, 0x63, 0x1f, 0x13, 0xc0,
+ 0x9d, 0xdf, 0x5, 0x32, 0x6, 0xe, 0xae, 0xf9,
+ 0x7, 0xc4, 0x1, 0xf7, 0x23, 0xf9, 0x7, 0x15,
+ 0xf7, 0xca, 0x6, 0x9a, 0xc4, 0x5, 0xfb, 0xcb,
+ 0x6, 0xe, 0xf7, 0xb2, 0xf7, 0x6c, 0xd4, 0x1,
+ 0xe0, 0xf7, 0x6c, 0x15, 0xf8, 0x6e, 0x6, 0xba,
+ 0xd4, 0x5, 0xfc, 0x6e, 0x6, 0xe, 0xfb, 0x4e,
+ 0x76, 0xf7, 0x5f, 0xcb, 0x54, 0x76, 0xf8, 0xaf,
+ 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x39, 0xb9, 0x15,
+ 0x76, 0x9d, 0xac, 0x62, 0xce, 0x1b, 0xcc, 0xb5,
+ 0xac, 0xa0, 0xa2, 0x1f, 0x8d, 0x89, 0x5, 0x13,
+ 0xd0, 0x83, 0x63, 0x5, 0xde, 0x6, 0xf7, 0x2,
+ 0xf8, 0xa3, 0x5, 0x32, 0x6, 0x4f, 0xfb, 0xae,
+ 0x5, 0x37, 0x78, 0x68, 0x2a, 0x23, 0x1b, 0xfb,
+ 0x0, 0x8d, 0xe3, 0xe8, 0xa0, 0x1f, 0x8c, 0x91,
+ 0x90, 0xa4, 0xc0, 0xf7, 0x8f, 0x8, 0x31, 0x6,
+ 0xfb, 0x2d, 0xfd, 0x6e, 0x5, 0xe2, 0x6, 0xe,
+ 0xf7, 0xb2, 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1,
+ 0xbd, 0xd2, 0x15, 0xc2, 0x44, 0xf7, 0x81, 0xf7,
+ 0x52, 0xf7, 0x22, 0xfb, 0x52, 0xd8, 0xce, 0xfb,
+ 0x22, 0xf7, 0x51, 0xf7, 0x73, 0xf7, 0x47, 0x55,
+ 0xd1, 0xfb, 0x74, 0xfb, 0x46, 0xfb, 0x23, 0xf7,
+ 0x47, 0x3e, 0x4e, 0xf7, 0x23, 0xfb, 0x48, 0x5,
+ 0xe, 0x60, 0xa, 0x13, 0xa0, 0xcc, 0x16, 0xe7,
+ 0x6, 0xbf, 0xf7, 0x89, 0x5, 0xd5, 0x9a, 0xc6,
+ 0xf7, 0x26, 0xf7, 0x18, 0x1b, 0xd9, 0x8b, 0x3d,
+ 0x47, 0x7b, 0x1f, 0x43, 0xfb, 0xd3, 0x5, 0xe7,
+ 0x6, 0xcf, 0xf7, 0xd3, 0x5, 0x90, 0xa1, 0x8e,
+ 0xa0, 0x9e, 0x1a, 0xe4, 0x5e, 0xcf, 0x31, 0x2e,
+ 0x44, 0x44, 0x6a, 0x6c, 0x1e, 0x89, 0x8d, 0x5,
+ 0x13, 0xc0, 0x9f, 0xe5, 0x5, 0x38, 0x6, 0xe,
+ 0x78, 0xd4, 0x42, 0xf7, 0x47, 0xf8, 0x6e, 0xd0,
+ 0x1, 0xf7, 0x9, 0xe6, 0xf7, 0xa9, 0xec, 0x3,
+ 0xdd, 0xf7, 0x30, 0x15, 0x35, 0x93, 0xbc, 0x32,
+ 0xf7, 0x17, 0x1b, 0xf7, 0x97, 0xdb, 0xf7, 0xf3,
+ 0xf7, 0x24, 0xf7, 0x4e, 0xfb, 0x12, 0xb4, 0x26,
+ 0xfb, 0x30, 0xfb, 0x1, 0xfb, 0x1a, 0xfb, 0x25,
+ 0xfb, 0x1b, 0xeb, 0x48, 0xf7, 0x0, 0xd9, 0xc2,
+ 0xb3, 0x9f, 0xa3, 0x1f, 0x8d, 0x89, 0x5, 0x69,
+ 0x82, 0x4c, 0xfb, 0x54, 0xfb, 0x18, 0x1b, 0x46,
+ 0x70, 0xbc, 0xc8, 0x82, 0x1f, 0xb0, 0xf7, 0x98,
+ 0x15, 0xee, 0xdf, 0xf7, 0x3, 0xe3, 0xf4, 0xa6,
+ 0x34, 0x45, 0xfb, 0xe, 0x33, 0x4b, 0x37, 0x3d,
+ 0x55, 0xc0, 0xdb, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+ 0x21, 0xcd, 0x8e, 0x77, 0x12, 0xcc, 0xf8, 0xa3,
+ 0x13, 0xd0, 0xcc, 0x16, 0xe8, 0x6, 0xbf, 0xf7,
+ 0x88, 0x5, 0xf7, 0xf, 0xa7, 0xe3, 0xeb, 0xe8,
+ 0x1b, 0xd3, 0x90, 0x3d, 0x48, 0x7c, 0x1f, 0x42,
+ 0xfb, 0xd2, 0x5, 0xe9, 0x6, 0xcf, 0xf7, 0xd2,
+ 0x5, 0x91, 0xa5, 0x8d, 0xa4, 0xa2, 0x1a, 0xe0,
+ 0x5a, 0xc6, 0x34, 0x2d, 0x44, 0x44, 0x6b, 0x6b,
+ 0x1e, 0x89, 0x8d, 0x9f, 0xe4, 0x5, 0x37, 0x6,
+ 0xce, 0xe3, 0x15, 0xcb, 0x66, 0xa, 0xa5, 0x1b,
+ 0xa8, 0xa2, 0x80, 0x80, 0xa1, 0x1f, 0x81, 0xa0,
+ 0x9f, 0x81, 0xa3, 0x1b, 0xc8, 0xae, 0xc1, 0xc1,
+ 0x90, 0x1f, 0x4d, 0x6, 0x7d, 0x86, 0x85, 0x73,
+ 0x71, 0x1b, 0x7d, 0x75, 0x94, 0x95, 0x73, 0x1f,
+ 0x13, 0xa0, 0x96, 0x70, 0x6e, 0x96, 0x70, 0x1b,
+ 0x45, 0x79, 0x57, 0x51, 0x7b, 0x1f, 0xe, 0x8c,
+ 0x76, 0xf7, 0x69, 0xd5, 0xf7, 0x55, 0xd4, 0xf7,
+ 0x60, 0x77, 0x1, 0xf7, 0x7, 0x66, 0x15, 0xd8,
+ 0x6, 0xb7, 0xf7, 0x69, 0x5, 0xf7, 0x34, 0x6,
+ 0x5f, 0xfb, 0x69, 0x5, 0xd8, 0x6, 0xb7, 0xf7,
+ 0x69, 0x5, 0xf7, 0x32, 0xd5, 0xfb, 0x23, 0x6,
+ 0xb1, 0xf7, 0x55, 0x5, 0xf4, 0xd4, 0x31, 0x6,
+ 0xb7, 0x58, 0xa, 0xfb, 0x33, 0x6, 0xb6, 0x58,
+ 0xa, 0xfb, 0x2e, 0x42, 0xf7, 0x20, 0x6, 0x64,
+ 0xfb, 0x55, 0x5, 0x26, 0x41, 0xe2, 0x6, 0xe6,
+ 0xd5, 0x15, 0xb1, 0xf7, 0x55, 0x5, 0xf7, 0x35,
+ 0x6, 0x64, 0xfb, 0x55, 0x5, 0xe, 0x7d, 0xd1,
+ 0xf8, 0x30, 0xd1, 0x1, 0xed, 0xe5, 0xf7, 0xb6,
+ 0xe5, 0x3, 0xde, 0xf7, 0x67, 0x15, 0xfb, 0x24,
+ 0xf1, 0x3a, 0xf7, 0x6, 0xf7, 0x30, 0xf7, 0x16,
+ 0xf7, 0x1b, 0xf7, 0x5a, 0xf7, 0x1f, 0x33, 0xdb,
+ 0xfb, 0x12, 0xfb, 0x4c, 0x23, 0xfb, 0x26, 0xfb,
+ 0x49, 0x1e, 0xe5, 0x16, 0xf7, 0x5, 0xcb, 0xf7,
+ 0x24, 0xf7, 0x17, 0xe1, 0xb4, 0x48, 0x3a, 0xfb,
+ 0x5, 0x43, 0xfb, 0x2b, 0xfb, 0xf, 0x6e, 0x29,
+ 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x7d, 0xd1, 0xf9,
+ 0x3a, 0x77, 0x1, 0xe8, 0xe5, 0xf7, 0xc2, 0xe5,
+ 0x3, 0xf7, 0xd3, 0xf8, 0xe7, 0x15, 0xd6, 0x6,
+ 0xf7, 0x19, 0x6f, 0xa, 0xfb, 0x7, 0x6, 0xfb,
+ 0xdd, 0x29, 0xa, 0x7d, 0xd1, 0xf8, 0xaf, 0xf7,
+ 0x1f, 0x1, 0xe8, 0xe5, 0xf7, 0xbd, 0xe5, 0x3,
+ 0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe8, 0x6, 0xdc,
+ 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6, 0x4d, 0x6f,
+ 0xa, 0x28, 0x6, 0xfb, 0xbe, 0x29, 0xa, 0x7d,
+ 0xd0, 0xf8, 0xba, 0xf0, 0x1, 0xe8, 0xe5, 0xf7,
+ 0xb8, 0xe5, 0x3, 0xde, 0xf7, 0x64, 0x24, 0xa,
+ 0xf7, 0xa7, 0xf8, 0x21, 0x15, 0xe9, 0x6, 0xa1,
+ 0xf0, 0x4d, 0xa, 0xfb, 0x61, 0x26, 0x15, 0xe9,
+ 0x6, 0xa0, 0xf0, 0x5, 0x2d, 0x6, 0xe, 0xf9,
+ 0x1a, 0x7c, 0xd4, 0x42, 0xf7, 0x4f, 0xcd, 0xd0,
+ 0xf7, 0x36, 0xd0, 0x1, 0xde, 0xe4, 0xf9, 0x53,
+ 0xe4, 0x3, 0xf8, 0x8b, 0xe3, 0x15, 0x40, 0xb3,
+ 0xd0, 0x6f, 0xd3, 0x1b, 0xf7, 0x11, 0xe1, 0xed,
+ 0xe0, 0xb0, 0x1f, 0x2d, 0x94, 0x5, 0x61, 0x79,
+ 0x54, 0x3e, 0x3b, 0x1b, 0xfb, 0x2, 0x7d, 0xf7,
+ 0xe, 0xc5, 0x93, 0x1f, 0xf8, 0x16, 0x6, 0x8f,
+ 0x9e, 0x90, 0xb1, 0xa4, 0x1a, 0xf7, 0x13, 0x3a,
+ 0xe6, 0xfb, 0x14, 0xfb, 0x0, 0x53, 0x52, 0x61,
+ 0x63, 0x1e, 0xee, 0x53, 0xfb, 0x0, 0x8b, 0x75,
+ 0x1b, 0xfb, 0x52, 0x2f, 0xfb, 0x43, 0xfb, 0x32,
+ 0xfb, 0x32, 0xf1, 0x4d, 0xf7, 0x0, 0xf7, 0xc,
+ 0xc8, 0xd1, 0xac, 0xa8, 0x1f, 0xfb, 0xdf, 0xf7,
+ 0x9, 0x15, 0xdd, 0xbb, 0xf7, 0x4a, 0xf7, 0x26,
+ 0xea, 0xa7, 0x32, 0x56, 0xfb, 0x1, 0x4b, 0xfb,
+ 0x38, 0xfb, 0x17, 0xfb, 0xe, 0x8b, 0xf7, 0xf,
+ 0xa7, 0x1e, 0xf8, 0x2f, 0xf1, 0x15, 0xf7, 0x17,
+ 0xb7, 0xdb, 0xaa, 0xbc, 0x1b, 0xa0, 0xf7, 0x4,
+ 0x87, 0xfb, 0x32, 0x7d, 0x1f, 0xe, 0xae, 0xfb,
+ 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xb6, 0xc9,
+ 0x3, 0xda, 0x16, 0x75, 0x5d, 0x7d, 0x5a, 0x64,
+ 0x1a, 0x6e, 0x93, 0x4d, 0xdb, 0xbb, 0xb2, 0x9c,
+ 0x96, 0x9e, 0x1e, 0x97, 0xc7, 0x5, 0x7c, 0x66,
+ 0x70, 0x83, 0x74, 0x1b, 0x81, 0x5c, 0x91, 0xc1,
+ 0xae, 0xa1, 0xbd, 0x91, 0x9a, 0x1f, 0xe, 0x7d,
+ 0xd1, 0x1, 0xf2, 0xe5, 0xf7, 0xb8, 0xe5, 0x3,
+ 0xf8, 0x1c, 0xf8, 0xe7, 0x56, 0xa, 0x6f, 0xa,
+ 0xfb, 0x1, 0x6, 0xfb, 0x68, 0x29, 0xa, 0xa0,
+ 0x76, 0xf8, 0xa4, 0xf7, 0x43, 0x1, 0xf7, 0x63,
+ 0xf7, 0xc1, 0x3, 0xf7, 0xb7, 0x16, 0xdb, 0x6,
+ 0xf7, 0x1d, 0xf9, 0x53, 0x5, 0x5c, 0x6, 0x5a,
+ 0x35, 0xfb, 0x18, 0x40, 0x51, 0x72, 0x7c, 0x3d,
+ 0x18, 0xbd, 0x99, 0xdd, 0xa9, 0xbf, 0xba, 0x8d,
+ 0x89, 0x18, 0xe, 0xf8, 0xac, 0x80, 0xc4, 0x5f,
+ 0x76, 0xf7, 0xc5, 0xc3, 0xf7, 0xfc, 0x77, 0xa0,
+ 0x77, 0x12, 0xf9, 0x92, 0xd1, 0x13, 0x6c, 0xf7,
+ 0x6, 0x78, 0x15, 0xd5, 0x6, 0xf9, 0x1f, 0xf9,
+ 0x66, 0x5, 0x3a, 0x6, 0x13, 0xb4, 0xfb, 0x7d,
+ 0xfd, 0x5e, 0x15, 0xf7, 0xa7, 0x6, 0x96, 0xc4,
+ 0x5, 0xfb, 0x43, 0x6, 0x9d, 0xa2, 0xa0, 0x97,
+ 0xca, 0xb2, 0x8, 0xc1, 0xac, 0xb7, 0xa9, 0xc5,
+ 0x1a, 0xba, 0x6b, 0xc1, 0x2a, 0x3c, 0x5a, 0x6a,
+ 0x44, 0x78, 0x1e, 0xd1, 0x85, 0x5, 0xb3, 0x98,
+ 0xa4, 0x99, 0xb4, 0x1b, 0xb3, 0x9c, 0x74, 0x75,
+ 0x6b, 0x72, 0x7d, 0x5a, 0x6e, 0x1f, 0xfb, 0xf,
+ 0x44, 0x6f, 0x55, 0x7b, 0x57, 0x8, 0xfb, 0xaa,
+ 0xf7, 0xfd, 0x15, 0xd1, 0x6, 0xd4, 0xf7, 0xf4,
+ 0x5, 0x57, 0x6, 0x5d, 0x53, 0x3c, 0x6f, 0x79,
+ 0x85, 0x7e, 0x50, 0x18, 0xa8, 0x90, 0xb7, 0x96,
+ 0xb7, 0xab, 0x8, 0xe, 0x65, 0xa, 0xf8, 0xe0,
+ 0x77, 0xa0, 0x77, 0x12, 0x13, 0x68, 0xf8, 0x6a,
+ 0xc7, 0x15, 0xf7, 0x36, 0x6, 0x7e, 0x44, 0x5,
+ 0xc6, 0x6, 0x99, 0xd2, 0x5, 0xb4, 0x6, 0x13,
+ 0xa8, 0x96, 0xc1, 0x5, 0x61, 0x6, 0xb5, 0xf7,
+ 0x77, 0x5, 0x59, 0x6, 0xfb, 0x6a, 0xfb, 0x74,
+ 0x5, 0xd0, 0x88, 0x15, 0xf7, 0xb, 0xf7, 0xf,
+ 0x70, 0xfb, 0xf, 0x5, 0xfc, 0x7f, 0xfb, 0x19,
+ 0x15, 0xce, 0x6, 0xf8, 0xdd, 0xf9, 0x66, 0x5,
+ 0x42, 0x6, 0xfc, 0x74, 0xfb, 0xf5, 0x15, 0xcb,
+ 0x6, 0x13, 0x70, 0xcc, 0xf7, 0xf4, 0x5, 0x5c,
+ 0x6, 0x64, 0x55, 0x41, 0x6c, 0x7b, 0x86, 0x80,
+ 0x4f, 0x18, 0xa5, 0x91, 0xb2, 0x95, 0xb3, 0xab,
+ 0x8, 0xe, 0xae, 0xf7, 0xc2, 0x76, 0xf8, 0x3a,
+ 0x77, 0x1, 0xf7, 0x7a, 0xf7, 0xad, 0x15, 0xd1,
+ 0x6, 0xd2, 0xf8, 0x3a, 0x5, 0x58, 0x6, 0x5d,
+ 0x48, 0x3d, 0x6b, 0x79, 0x84, 0x7f, 0x43, 0x18,
+ 0xa7, 0x92, 0xb6, 0x98, 0xb8, 0xb1, 0x8, 0xe,
+ 0xd3, 0xf7, 0xd1, 0x77, 0xa7, 0x76, 0xf7, 0x4d,
+ 0xd0, 0xf7, 0x47, 0x77, 0x12, 0xef, 0xd6, 0x13,
+ 0xb8, 0xf7, 0xee, 0xf7, 0xd1, 0x15, 0xd3, 0x6,
+ 0x84, 0x97, 0x88, 0x95, 0xac, 0x1a, 0x99, 0x89,
+ 0x9d, 0xa0, 0xda, 0x1e, 0x96, 0xb4, 0x95, 0xb5,
+ 0xb2, 0x1a, 0xd6, 0x6d, 0xc4, 0xfb, 0x4, 0xfb,
+ 0xa, 0x63, 0x30, 0x69, 0x7e, 0x1e, 0xd6, 0x7d,
+ 0x5, 0xd0, 0xa6, 0xc4, 0x8c, 0x96, 0x1b, 0xad,
+ 0xb1, 0x76, 0x63, 0x81, 0x89, 0x7f, 0x86, 0x7c,
+ 0x1f, 0x6b, 0x84, 0x7b, 0x87, 0x5f, 0x8a, 0x8,
+ 0x53, 0x88, 0xfb, 0xe, 0x82, 0xfb, 0x11, 0x1a,
+ 0x13, 0x78, 0x63, 0xa4, 0x3e, 0xe7, 0xc2, 0xbc,
+ 0xab, 0x9d, 0x9d, 0x1e, 0x13, 0xb8, 0x8f, 0x74,
+ 0x8b, 0x88, 0x8e, 0x80, 0x8, 0x95, 0xf7, 0x50,
+ 0x15, 0xfb, 0x16, 0x71, 0x3a, 0x89, 0x7a, 0x1b,
+ 0x79, 0x64, 0x97, 0xb6, 0xb9, 0xbb, 0x95, 0xab,
+ 0x90, 0x1f, 0xc9, 0x90, 0x94, 0x8e, 0xa9, 0x93,
+ 0x8, 0xe, 0xce, 0xf7, 0xc4, 0xd7, 0xf7, 0xad,
+ 0xd7, 0x1, 0xef, 0xd8, 0xf7, 0x6a, 0xd8, 0x3,
+ 0xef, 0xf8, 0x84, 0x15, 0x27, 0xa9, 0x2f, 0xf7,
+ 0x18, 0xf7, 0x10, 0xdd, 0xf7, 0x22, 0xf7, 0x6,
+ 0xe7, 0x53, 0xe0, 0xfb, 0x1, 0xfb, 0x23, 0x4f,
+ 0xfb, 0x2f, 0x35, 0x1e, 0xd8, 0x8d, 0x15, 0xbe,
+ 0xb4, 0xf7, 0x4, 0xe0, 0xbe, 0xb0, 0x61, 0x50,
+ 0x3c, 0x5b, 0x26, 0x3a, 0x4e, 0x73, 0xbe, 0xce,
+ 0x1e, 0xe, 0xf7, 0xcd, 0x9b, 0xca, 0xf8, 0x2,
+ 0xca, 0x1, 0xbc, 0xd6, 0xf7, 0xf0, 0xd8, 0x3,
+ 0xb8, 0x94, 0x15, 0xb8, 0x6c, 0xc4, 0xcb, 0x5,
+ 0x80, 0x9f, 0xb5, 0x79, 0xca, 0x1b, 0xf7, 0x37,
+ 0xf7, 0xb, 0xf7, 0x13, 0xf7, 0x3d, 0xc4, 0x80,
+ 0xb9, 0x6e, 0xae, 0x1f, 0xc6, 0xcd, 0x5e, 0xab,
+ 0x51, 0x4b, 0x5, 0x93, 0x7e, 0x63, 0xa2, 0x43,
+ 0x1b, 0xfb, 0x63, 0x41, 0xfb, 0x3d, 0xfb, 0x18,
+ 0x40, 0xa2, 0x67, 0x9b, 0x71, 0x1f, 0xc5, 0xca,
+ 0x15, 0x7e, 0xa2, 0x82, 0xa2, 0xa8, 0x1a, 0xec,
+ 0xcc, 0xf7, 0x20, 0xf7, 0x1d, 0xba, 0xa2, 0x7a,
+ 0x84, 0x93, 0x1e, 0xfb, 0x72, 0xfb, 0xdc, 0x15,
+ 0xf7, 0x97, 0xf7, 0xb1, 0x5, 0x90, 0x7c, 0x9b,
+ 0x78, 0x64, 0x1a, 0x24, 0x3b, 0xfb, 0x16, 0xfb,
+ 0x11, 0x6e, 0x72, 0x93, 0x98, 0x76, 0x1e, 0xe,
+ 0x7d, 0xd0, 0xf8, 0x15, 0xcf, 0xf2, 0xf7, 0x0,
+ 0x49, 0xcd, 0x8e, 0x77, 0x12, 0xe5, 0xe8, 0xf7,
+ 0xb8, 0xe8, 0x13, 0xe6, 0xf7, 0x8b, 0xf8, 0xf7,
+ 0x15, 0xcb, 0x6, 0x13, 0xd6, 0xa4, 0x91, 0x96,
+ 0x9c, 0xa5, 0x1b, 0xad, 0xa1, 0x7d, 0x7f, 0xa3,
+ 0x1f, 0x82, 0x9d, 0x9e, 0x83, 0xa2, 0x1b, 0xc8,
+ 0xae, 0xc2, 0xc1, 0x91, 0x1f, 0x4c, 0x69, 0xa,
+ 0x70, 0x1b, 0x7c, 0x78, 0x96, 0x95, 0x73, 0x1f,
+ 0x13, 0xce, 0x96, 0x73, 0x6e, 0x95, 0x69, 0x1b,
+ 0x13, 0xe6, 0x45, 0x79, 0x57, 0x50, 0x7b, 0x1f,
+ 0xfb, 0x38, 0xfc, 0x27, 0x24, 0xa, 0xe, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x53, 0xd5, 0xf8, 0x2a, 0xc9,
+ 0x4d, 0xd5, 0x12, 0xf8, 0x80, 0xe7, 0x13, 0xd8,
+ 0xf7, 0x3b, 0xdd, 0x15, 0x4b, 0xad, 0xbb, 0x69,
+ 0xd0, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x25,
+ 0xf7, 0x53, 0xf7, 0x21, 0x3c, 0xd8, 0x26, 0x45,
+ 0x5c, 0x65, 0x5d, 0x5c, 0x1f, 0x13, 0xe8, 0x9b,
+ 0xd3, 0x5, 0x35, 0x6, 0xfb, 0x30, 0xfd, 0x71,
+ 0x5, 0xe7, 0x6, 0xe5, 0xf8, 0x38, 0x15, 0xe0,
+ 0xcb, 0xf7, 0x3a, 0xf7, 0x9, 0xda, 0xaf, 0x43,
+ 0x43, 0x3e, 0x5c, 0xfb, 0x4d, 0xfb, 0x17, 0x31,
+ 0x6f, 0xda, 0xd7, 0x1e, 0xe, 0xf7, 0x83, 0xfb,
+ 0x2c, 0x76, 0xf9, 0xc0, 0xda, 0x1, 0xf7, 0xd2,
+ 0xfb, 0x41, 0x15, 0xd9, 0xf9, 0xc0, 0xf6, 0xfd,
+ 0xc0, 0xda, 0xf9, 0xc0, 0xcf, 0xda, 0xfb, 0xc0,
+ 0x6, 0xfb, 0xb, 0x22, 0x47, 0xfb, 0x19, 0x29,
+ 0xd5, 0x2d, 0xf7, 0xa, 0x1f, 0xe, 0x61, 0xa,
+ 0xf7, 0x0, 0xe2, 0x3, 0xf7, 0x4d, 0xfb, 0x63,
+ 0x15, 0xcd, 0x6, 0x68, 0xf7, 0x0, 0x76, 0xf7,
+ 0x6, 0xf7, 0x5, 0x1a, 0xf7, 0xda, 0xf7, 0x74,
+ 0xf7, 0x85, 0xae, 0xb1, 0x1e, 0x46, 0x6, 0xfb,
+ 0x0, 0xfb, 0x12, 0xfb, 0x3d, 0xfb, 0x4b, 0xfb,
+ 0xbc, 0x1a, 0xfb, 0x5, 0xa6, 0xfb, 0x5, 0xbd,
+ 0xfb, 0x1, 0x1e, 0xe, 0x61, 0xa, 0xf7, 0x8e,
+ 0xe2, 0x3, 0x82, 0xfb, 0x63, 0x15, 0xd0, 0x6,
+ 0xf7, 0x0, 0xf7, 0x12, 0xf7, 0x3d, 0xf7, 0x42,
+ 0xf7, 0xbc, 0x1a, 0xf7, 0x5, 0x70, 0xf7, 0xe,
+ 0x59, 0xf7, 0x1, 0x1e, 0x49, 0x6, 0xae, 0xfb,
+ 0x0, 0xa0, 0xfb, 0xf, 0xfb, 0x5, 0x1a, 0xfb,
+ 0xda, 0xfb, 0x74, 0xfb, 0x7c, 0x68, 0x65, 0x1e,
+ 0xe, 0xf8, 0xe3, 0x78, 0xc3, 0xf7, 0x89, 0xc7,
+ 0x86, 0xc4, 0xf7, 0x8a, 0xc4, 0x91, 0x77, 0x12,
+ 0xf7, 0x27, 0xd8, 0xf7, 0x3d, 0xd7, 0xee, 0xd7,
+ 0xf7, 0x3c, 0xd8, 0x13, 0xd7, 0x80, 0xf8, 0xcc,
+ 0xf7, 0x2, 0x15, 0x68, 0x8b, 0x2d, 0xf7, 0x18,
+ 0xf7, 0x4f, 0x8d, 0xf7, 0x74, 0x91, 0xf7, 0x1,
+ 0x3f, 0xa1, 0x4b, 0x1e, 0xfb, 0x18, 0x5a, 0xfb,
+ 0x3c, 0x4b, 0x1f, 0xd7, 0x16, 0xae, 0x9f, 0xf7,
+ 0x1d, 0xe3, 0x96, 0xbc, 0x84, 0x4b, 0x7c, 0x80,
+ 0xfb, 0x33, 0x28, 0x1e, 0x13, 0x37, 0x0, 0x53,
+ 0x89, 0xbe, 0xa1, 0x1f, 0xfc, 0x85, 0xf7, 0xfd,
+ 0x15, 0x13, 0xb7, 0x80, 0x68, 0x8b, 0x28, 0xf7,
+ 0x18, 0xf7, 0x4f, 0x8e, 0xf7, 0x72, 0x92, 0xf7,
+ 0x1, 0x3f, 0xa1, 0x49, 0x1e, 0x13, 0x36, 0x0,
+ 0xfb, 0x16, 0x59, 0xfb, 0x36, 0x4b, 0x1f, 0xd8,
+ 0x16, 0xad, 0x9f, 0xf7, 0x1b, 0xe2, 0x9f, 0xb5,
+ 0x7a, 0x52, 0x7d, 0x80, 0xfb, 0x32, 0x26, 0x1e,
+ 0x13, 0x8c, 0x0, 0x54, 0x89, 0xc3, 0xa0, 0x1f,
+ 0x5f, 0xfc, 0x7e, 0x15, 0xde, 0x6, 0x13, 0xcf,
+ 0x80, 0xf8, 0xe7, 0xf9, 0x66, 0x5, 0x3a, 0x6,
+ 0xe, 0x77, 0x8b, 0xf5, 0x1, 0xe2, 0x16, 0xf4,
+ 0x6, 0xa1, 0xf5, 0x5, 0x22, 0x6, 0xe, 0x77,
+ 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xf7, 0x15, 0xf7,
+ 0x52, 0x15, 0xf5, 0x6, 0xa1, 0xf7, 0x11, 0x5,
+ 0x21, 0x6, 0xe, 0xf9, 0x52, 0x78, 0xc3, 0xf7,
+ 0x8c, 0xc4, 0x8b, 0xc3, 0xf7, 0x8b, 0xc3, 0x8d,
+ 0x77, 0x12, 0xe3, 0xd3, 0xf7, 0x31, 0xd3, 0x8e,
+ 0xd3, 0x13, 0xf7, 0xf7, 0x34, 0xf8, 0x6b, 0x15,
+ 0x95, 0x9a, 0xf7, 0x38, 0xe4, 0xc0, 0x8b, 0x52,
+ 0x82, 0x67, 0x75, 0xfb, 0x25, 0x39, 0x56, 0x8b,
+ 0xbd, 0xa2, 0x1e, 0x64, 0xfc, 0x7e, 0x15, 0xd4,
+ 0x6, 0x13, 0xe8, 0xf8, 0x67, 0xf9, 0x66, 0x5,
+ 0x41, 0x6, 0xfc, 0x87, 0xfb, 0x7c, 0x5b, 0xa,
+ 0xf7, 0x53, 0xb9, 0x1e, 0x13, 0xf0, 0xd5, 0x5e,
+ 0xbb, 0x3d, 0xfb, 0x1a, 0x5f, 0xfb, 0x26, 0x37,
+ 0x1e, 0xf7, 0xc4, 0xfb, 0xfd, 0x5b, 0xa, 0xf7,
+ 0x51, 0xb9, 0xd6, 0x5e, 0xbb, 0x3d, 0xfb, 0x1a,
+ 0x5f, 0xfb, 0x25, 0x37, 0x1e, 0xd3, 0x16, 0x96,
+ 0x9a, 0xf7, 0x35, 0xe4, 0xc0, 0x8b, 0x53, 0x81,
+ 0x68, 0x75, 0xfb, 0x24, 0x39, 0x1e, 0x13, 0x81,
+ 0x56, 0x8b, 0xbd, 0xa2, 0x1f, 0xf7, 0x9d, 0x16,
+ 0x74, 0x8b, 0x21, 0xf7, 0x10, 0x1e, 0x13, 0x0,
+ 0xf7, 0x2e, 0xa1, 0xf7, 0x53, 0xb7, 0xd7, 0x5d,
+ 0xba, 0x3f, 0x1f, 0x13, 0x80, 0xfb, 0xe, 0x53,
+ 0xfb, 0x2b, 0x3d, 0x1f, 0xd3, 0x16, 0x96, 0x9a,
+ 0xf7, 0x35, 0xe4, 0xbf, 0x8b, 0x53, 0x81, 0x68,
+ 0x75, 0xfb, 0x24, 0x3a, 0x1e, 0x13, 0x0, 0x56,
+ 0x8b, 0xbd, 0xa2, 0x1f, 0xe, 0xf7, 0xb2, 0xf7,
+ 0x64, 0xe2, 0x1, 0xf7, 0xc0, 0xe6, 0x3, 0xe0,
+ 0xf7, 0x64, 0x15, 0xf7, 0x6b, 0xfb, 0x64, 0xe6,
+ 0xf7, 0x64, 0xf7, 0x6b, 0xe2, 0xfb, 0x6b, 0xf7,
+ 0x66, 0x30, 0xfb, 0x66, 0xfb, 0x6b, 0x6, 0xe,
+ 0xf7, 0xb2, 0x8b, 0xcf, 0xf7, 0x64, 0xcf, 0xf7,
+ 0x36, 0x77, 0x1, 0xf7, 0xa0, 0xf7, 0x6, 0x15,
+ 0xdd, 0x6, 0xbf, 0xf7, 0x36, 0x5, 0xf7, 0x55,
+ 0x6, 0xa2, 0xcf, 0x5, 0xfb, 0x55, 0x6, 0xbf,
+ 0xf7, 0x36, 0x5, 0x3a, 0x6, 0x57, 0xfb, 0x36,
+ 0x5, 0xfb, 0x56, 0x6, 0x75, 0x47, 0x5, 0xf7,
+ 0x55, 0x6, 0xfb, 0xae, 0xfb, 0xa8, 0x15, 0xf8,
+ 0x67, 0x6, 0xa1, 0xcf, 0x5, 0xfc, 0x66, 0x6,
+ 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd4, 0xf8,
+ 0x2c, 0xd4, 0x7f, 0x77, 0x12, 0xdf, 0xe7, 0x13,
+ 0xd8, 0xf8, 0x31, 0xc1, 0x15, 0x52, 0xfb, 0x99,
+ 0x5, 0xe8, 0x6, 0xf7, 0x30, 0xf9, 0x71, 0x5,
+ 0x3b, 0x6, 0x77, 0x2a, 0x5, 0x13, 0xe8, 0xf5,
+ 0x5b, 0x37, 0x8e, 0x74, 0x1b, 0xfb, 0x26, 0xfb,
+ 0xc, 0xfb, 0x1d, 0xfb, 0x52, 0xfb, 0x3c, 0xf4,
+ 0x50, 0xd4, 0xb3, 0xba, 0x99, 0xc3, 0xcb, 0x1f,
+ 0xfb, 0x81, 0xf7, 0x31, 0x15, 0xd1, 0xb7, 0xf7,
+ 0x4c, 0xf7, 0x16, 0xd2, 0xbd, 0x4f, 0x3c, 0xfb,
+ 0x4, 0x44, 0xfb, 0x31, 0xfb, 0x3, 0x43, 0x62,
+ 0xc1, 0xef, 0x1e, 0xe, 0x8b, 0xef, 0xf8, 0xbf,
+ 0xd3, 0x1, 0xf7, 0x86, 0xf3, 0x3, 0xf7, 0x89,
+ 0xf7, 0x47, 0x15, 0xe1, 0x6, 0x96, 0xc7, 0x95,
+ 0xa4, 0xea, 0xd4, 0x8, 0xe7, 0xd3, 0xd2, 0xc1,
+ 0xe5, 0x1a, 0xeb, 0x35, 0xd9, 0xfb, 0x14, 0xfb,
+ 0x28, 0x34, 0xfb, 0x9, 0x31, 0x1e, 0xe8, 0x7c,
+ 0x5, 0xb0, 0x90, 0x9a, 0xf7, 0x5, 0xf7, 0x10,
+ 0x1b, 0xd1, 0xbe, 0x5a, 0x56, 0x4c, 0x49, 0x5c,
+ 0x56, 0x61, 0x1f, 0x39, 0x4b, 0x4f, 0x5b, 0x7e,
+ 0xfb, 0x2, 0x8, 0x5d, 0xfb, 0x47, 0x15, 0xf3,
+ 0x6, 0xa1, 0xef, 0x5, 0x23, 0x6, 0xe, 0xf7,
+ 0xcd, 0xfb, 0x5d, 0xd3, 0xf8, 0x73, 0x77, 0xee,
+ 0xeb, 0x1, 0xe0, 0xe8, 0x3, 0xf8, 0x56, 0xa2,
+ 0x15, 0x86, 0x66, 0x61, 0xfb, 0x6, 0x24, 0x8a,
+ 0x8, 0x44, 0x8a, 0x58, 0xb8, 0xc0, 0x1a, 0xcb,
+ 0xcd, 0xc0, 0xc0, 0xb5, 0x1e, 0xde, 0xcb, 0xc8,
+ 0xbb, 0x98, 0xf7, 0x3, 0x8, 0x34, 0x6, 0x80,
+ 0x4e, 0x81, 0x72, 0x2b, 0x42, 0x8, 0x2e, 0x43,
+ 0x43, 0x4f, 0x30, 0x1a, 0x2b, 0xe2, 0x42, 0xf7,
+ 0x16, 0xf7, 0xd, 0xf7, 0x3, 0xf5, 0xf2, 0x1e,
+ 0xfb, 0x35, 0xf8, 0x39, 0x15, 0xf4, 0x6, 0xa1,
+ 0xeb, 0x5, 0x22, 0x6, 0xe, 0xc4, 0xf8, 0x78,
+ 0x44, 0xa, 0xf7, 0x3c, 0xf7, 0xa2, 0x3, 0xf7,
+ 0xd5, 0xf8, 0x63, 0x15, 0xbc, 0x6, 0xb8, 0xf7,
+ 0x1f, 0xa2, 0xf7, 0x8, 0x3f, 0xa, 0x74, 0xfb,
+ 0x8, 0x5, 0xfb, 0x31, 0xfb, 0x1f, 0x15, 0xbc,
+ 0x6, 0xb9, 0xf7, 0x1f, 0xa1, 0xf7, 0x8, 0x3f,
+ 0xa, 0x75, 0xfb, 0x8, 0x5, 0xe, 0xae, 0xfb,
+ 0x14, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xa4, 0x8c,
+ 0x15, 0x37, 0xa, 0x83, 0x62, 0x18, 0x67, 0xa,
+ 0x93, 0xb0, 0x9d, 0xe6, 0x18, 0x22, 0x6, 0xf7,
+ 0x24, 0x22, 0x15, 0x62, 0xa, 0x83, 0x62, 0x18,
+ 0xf6, 0x3c, 0xa, 0x22, 0x6, 0xe, 0xae, 0xf8,
+ 0x6a, 0xf4, 0xf7, 0x2a, 0x77, 0x1, 0xf7, 0x1e,
+ 0xf4, 0x3, 0xf7, 0xc3, 0xf8, 0x6a, 0x33, 0xa,
+ 0xfb, 0x4c, 0x30, 0x33, 0xa, 0xe, 0xae, 0xf8,
+ 0x78, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xf7, 0x10,
+ 0xf8, 0x63, 0x15, 0x67, 0xa, 0x93, 0xb0, 0x9d,
+ 0xe6, 0x18, 0x22, 0x6, 0x75, 0x22, 0x5, 0x37,
+ 0xa, 0x8, 0xf7, 0x32, 0x62, 0x15, 0xf6, 0x3c,
+ 0xa, 0x22, 0x6, 0x75, 0x22, 0x5, 0x62, 0xa,
+ 0x8, 0xe, 0x3f, 0xf8, 0x7f, 0x44, 0xa, 0xf7,
+ 0x39, 0xf8, 0x6a, 0x3b, 0xa, 0xea, 0xb7, 0x95,
+ 0x41, 0xa, 0xfb, 0x4, 0x84, 0x66, 0x8, 0xe,
+ 0x3f, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x2b, 0xf8,
+ 0x63, 0x15, 0xf7, 0x0, 0x3c, 0xa, 0x21, 0x6,
+ 0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xe, 0x3f,
+ 0xfb, 0x14, 0x44, 0xa, 0xbf, 0x8c, 0x15, 0x37,
+ 0xa, 0x83, 0x62, 0x18, 0xf7, 0x0, 0x99, 0xa3,
+ 0xf7, 0x5, 0x93, 0xb0, 0x9e, 0xe6, 0x18, 0x21,
+ 0x6, 0xe, 0x20, 0xf8, 0x78, 0x44, 0xa, 0xf7,
+ 0x31, 0xf8, 0x63, 0x15, 0xc1, 0x6, 0xbc, 0xf7,
+ 0x1f, 0xa4, 0xf7, 0x8, 0x57, 0xa, 0x72, 0xfb,
+ 0x8, 0x5, 0xe, 0xae, 0xa0, 0x76, 0xf8, 0x59,
+ 0xd4, 0x42, 0xe0, 0x12, 0x13, 0xa0, 0xd8, 0x16,
+ 0xdb, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x3,
+ 0xa1, 0xc0, 0xf7, 0x17, 0xe4, 0x1b, 0x9c, 0x9b,
+ 0x86, 0x7e, 0x9a, 0x1f, 0xae, 0xdf, 0x5, 0x96,
+ 0x76, 0x78, 0x93, 0x74, 0x1b, 0x41, 0x56, 0x37,
+ 0x68, 0x77, 0x1f, 0x13, 0xc0, 0x9e, 0xf6, 0x5,
+ 0x41, 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xca, 0xf7,
+ 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+ 0x1, 0xc1, 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf7,
+ 0x93, 0xf7, 0x2a, 0x15, 0xd0, 0x6, 0xad, 0xf7,
+ 0x41, 0x5, 0xb3, 0x6, 0xc1, 0x9c, 0x76, 0x33,
+ 0xad, 0x1f, 0xa3, 0x4b, 0x5, 0xde, 0x6, 0x68,
+ 0xda, 0x65, 0xdc, 0x7a, 0x98, 0x73, 0x93, 0x19,
+ 0x8c, 0x8d, 0xe3, 0x90, 0xb8, 0xc4, 0x94, 0xb9,
+ 0x19, 0xec, 0x9d, 0x2d, 0x9d, 0x3a, 0x1b, 0xfb,
+ 0x27, 0x6, 0xad, 0xfb, 0x45, 0x15, 0xa4, 0xf7,
+ 0xe, 0x5, 0xd9, 0x6, 0xb4, 0xcd, 0x8b, 0x4f,
+ 0x7f, 0x1f, 0x4d, 0x7e, 0x45, 0x8b, 0x6b, 0x1b,
+ 0xfc, 0x22, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x44,
+ 0xfb, 0x3d, 0xf7, 0x6c, 0xf7, 0x6d, 0xf7, 0x42,
+ 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x45,
+ 0xf7, 0x3c, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0x46,
+ 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+ 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x48, 0xf7,
+ 0x4a, 0xf7, 0x26, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+ 0x43, 0xfb, 0x26, 0xfb, 0x21, 0xfb, 0x4a, 0xfb,
+ 0x48, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+ 0xe, 0xae, 0xf8, 0xd0, 0xb1, 0xf7, 0x0, 0xb1,
+ 0x1, 0xf7, 0x6a, 0xb2, 0xf7, 0x2, 0xb2, 0x3,
+ 0xf7, 0x6a, 0xf9, 0x2d, 0x15, 0x57, 0xb6, 0x62,
+ 0xbe, 0xbe, 0xb6, 0xb4, 0xbf, 0xbe, 0x61, 0xb3,
+ 0x57, 0x57, 0x61, 0x63, 0x58, 0x1e, 0xb2, 0x89,
+ 0x15, 0xaa, 0xa3, 0xa3, 0xaa, 0xaa, 0xa3, 0x74,
+ 0x6b, 0x6d, 0x73, 0x74, 0x6c, 0x6d, 0x72, 0xa2,
+ 0xa9, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd0, 0xf8,
+ 0x33, 0xd0, 0x12, 0xf7, 0x1d, 0xde, 0xf7, 0x49,
+ 0xe6, 0x57, 0xe4, 0x13, 0xf0, 0xca, 0xf7, 0x46,
+ 0x15, 0xfb, 0x49, 0xf7, 0x39, 0x7f, 0xbd, 0xf7,
+ 0x27, 0xce, 0xd4, 0xd8, 0xeb, 0x3f, 0xb7, 0x2a,
+ 0xb5, 0x1e, 0x49, 0xa7, 0x6a, 0x94, 0xb5, 0x1a,
+ 0xaa, 0xac, 0xb5, 0xcc, 0x1e, 0x13, 0xe8, 0x9b,
+ 0xf5, 0x81, 0x2e, 0x1f, 0xe4, 0x90, 0x5, 0xf7,
+ 0x1c, 0xfb, 0x14, 0xaa, 0x3e, 0xfb, 0x1f, 0x5b,
+ 0x3c, 0x4c, 0x34, 0xcd, 0x66, 0xe5, 0x63, 0x1e,
+ 0x13, 0xf0, 0xca, 0x6f, 0xb8, 0x75, 0x5c, 0x1a,
+ 0x58, 0x56, 0x6d, 0x4a, 0xfb, 0x14, 0x89, 0xf0,
+ 0xa8, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf8,
+ 0x36, 0xd1, 0x12, 0xf7, 0x20, 0xe2, 0x9f, 0xde,
+ 0xe2, 0xe9, 0x55, 0xe8, 0x13, 0xf8, 0xca, 0xf7,
+ 0x47, 0x15, 0xfb, 0x4b, 0xf7, 0x40, 0x80, 0xbf,
+ 0xf7, 0x2e, 0xd1, 0xd6, 0xd7, 0xec, 0x3b, 0xb6,
+ 0x27, 0xb6, 0x1e, 0x46, 0xa8, 0x68, 0x8a, 0xb5,
+ 0x1a, 0xaa, 0xae, 0xc0, 0xcf, 0x1e, 0x13, 0xf4,
+ 0x9b, 0xf7, 0x3, 0x8f, 0xfb, 0x0, 0x1f, 0xe8,
+ 0x90, 0x5, 0xf7, 0x1e, 0xfb, 0x19, 0xaa, 0x3a,
+ 0xfb, 0x27, 0x5a, 0x31, 0x4b, 0x34, 0xd0, 0x6f,
+ 0xe9, 0x63, 0x1e, 0x13, 0xf8, 0xce, 0x6e, 0xba,
+ 0x77, 0x5a, 0x1a, 0x58, 0x52, 0x6d, 0x48, 0xfb,
+ 0x19, 0x88, 0xf1, 0xa8, 0x1e, 0xf7, 0x2f, 0xf8,
+ 0x2d, 0x15, 0xf1, 0x6, 0xf7, 0x1e, 0xf7, 0x1f,
+ 0x50, 0xa, 0x36, 0x31, 0x62, 0xe5, 0x5, 0x38,
+ 0x6, 0xe, 0xfb, 0x53, 0xce, 0xf9, 0xaa, 0xd2,
+ 0x1, 0xd7, 0x71, 0x15, 0xfb, 0xb, 0xa4, 0xe7,
+ 0x5d, 0xe8, 0x1b, 0xf7, 0xb, 0xd0, 0xdc, 0xd9,
+ 0xae, 0x7d, 0xae, 0x6a, 0xb1, 0x1f, 0xed, 0xbb,
+ 0xad, 0xbe, 0xc2, 0x1a, 0xc9, 0x68, 0xba, 0x29,
+ 0xdb, 0x1e, 0x3b, 0xcd, 0x5a, 0xb4, 0xc2, 0x1a,
+ 0xb9, 0xb3, 0xb2, 0xc5, 0x9d, 0xe0, 0x88, 0x27,
+ 0x1e, 0xe1, 0x96, 0x5, 0xbd, 0x83, 0x7a, 0xf7,
+ 0x5, 0xfb, 0x34, 0x1b, 0xfb, 0xd, 0x4e, 0x40,
+ 0x38, 0x66, 0x99, 0x69, 0xa2, 0x70, 0x1f, 0x53,
+ 0x6f, 0x3c, 0x5f, 0x29, 0x1a, 0x41, 0xbc, 0x63,
+ 0xc8, 0x57, 0x1e, 0xf7, 0x1f, 0xfb, 0x7, 0xa3,
+ 0x7a, 0x5e, 0x1a, 0x5d, 0x5f, 0x5d, 0x4d, 0x73,
+ 0x39, 0x90, 0xf7, 0x5, 0x73, 0x1e, 0xf7, 0x78,
+ 0xf7, 0x14, 0x15, 0x75, 0xa0, 0x5f, 0xae, 0x64,
+ 0xaa, 0x8, 0x55, 0xb7, 0x6e, 0x9d, 0xb3, 0x1a,
+ 0xcb, 0xcd, 0xbb, 0xa5, 0x9a, 0x1e, 0xac, 0x67,
+ 0xbd, 0x5f, 0xbf, 0x60, 0x8, 0xb6, 0x66, 0x98,
+ 0x79, 0x6d, 0x1a, 0x73, 0x7c, 0x5d, 0x3b, 0x65,
+ 0x1e, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x3b,
+ 0x76, 0xf8, 0x39, 0xeb, 0x1, 0xc3, 0xf7, 0x89,
+ 0x3, 0xe2, 0x8a, 0x15, 0xc5, 0x6, 0x77, 0x30,
+ 0x5f, 0x7f, 0x7b, 0x87, 0x82, 0x64, 0x18, 0xf6,
+ 0x98, 0xa4, 0xf7, 0x3, 0x92, 0xae, 0x9d, 0xe2,
+ 0x18, 0x23, 0x6, 0xcd, 0xf7, 0xd5, 0x40, 0xa,
+ 0xe, 0xa0, 0x76, 0xf9, 0x9, 0xda, 0x1, 0xf7,
+ 0x3a, 0x16, 0xf1, 0x6, 0xb9, 0xf7, 0x52, 0xf7,
+ 0x1b, 0xf7, 0x94, 0xf7, 0x5d, 0xf7, 0x3b, 0x9e,
+ 0xda, 0x18, 0xfc, 0x95, 0x6, 0x78, 0x3c, 0x5,
+ 0xf8, 0x24, 0x6, 0xfb, 0x63, 0xfb, 0x51, 0xfb,
+ 0x1d, 0xfb, 0xa1, 0x70, 0xfb, 0x2f, 0x8, 0xe,
+ 0x78, 0xd0, 0xf7, 0xec, 0xd0, 0xf7, 0x44, 0xd4,
+ 0x1, 0xe6, 0xe9, 0xf7, 0xb8, 0xe5, 0x3, 0xf7,
+ 0x6f, 0xf8, 0x29, 0x15, 0xac, 0x93, 0xcb, 0xf7,
+ 0x54, 0xf7, 0x17, 0x1b, 0xd0, 0xa7, 0x58, 0x50,
+ 0x93, 0x1f, 0xe3, 0x93, 0x5, 0xe0, 0x83, 0x5a,
+ 0xe5, 0xfb, 0x16, 0x1b, 0xfb, 0x95, 0x3b, 0xfb,
+ 0xf2, 0xfb, 0x24, 0xfb, 0x4d, 0xf7, 0x11, 0x60,
+ 0xef, 0xf7, 0x30, 0xf7, 0x0, 0xf7, 0x13, 0xf7,
+ 0x25, 0xf7, 0x19, 0x2c, 0xd8, 0x20, 0x3d, 0x52,
+ 0x64, 0x78, 0x73, 0x1f, 0x69, 0xfb, 0x58, 0x15,
+ 0xf7, 0xd, 0xe5, 0xcb, 0xde, 0xd9, 0xc1, 0x4d,
+ 0x3c, 0x28, 0x37, 0x23, 0x33, 0x3e, 0x53, 0xe4,
+ 0xd1, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0x1, 0x88,
+ 0xf8, 0x6d, 0x3, 0x76, 0x78, 0x15, 0xd2, 0x6,
+ 0xf8, 0x26, 0xf9, 0x88, 0x5, 0x44, 0x6, 0xe,
+ 0x77, 0xe, 0x90, 0x76, 0xf7, 0xdc, 0xd3, 0xf7,
+ 0x9c, 0xd1, 0x1, 0xf7, 0x4c, 0xe6, 0x3, 0xc6,
+ 0x7b, 0x15, 0xaf, 0xae, 0xb5, 0x95, 0xb8, 0x8a,
+ 0xb6, 0x8a, 0xb8, 0x7f, 0xb6, 0x80, 0x8, 0x81,
+ 0xb3, 0xb0, 0x81, 0xab, 0x1b, 0x95, 0xb9, 0x8b,
+ 0xaf, 0xd7, 0x1f, 0x6f, 0xd9, 0x5, 0x6d, 0x57,
+ 0x5d, 0x8b, 0x81, 0x1b, 0x6b, 0x69, 0x96, 0x94,
+ 0x65, 0x1f, 0x65, 0x94, 0x61, 0x93, 0x5c, 0x84,
+ 0x88, 0x8c, 0x18, 0xc0, 0xb1, 0xc2, 0xc4, 0x88,
+ 0xf7, 0xa, 0x8, 0xf7, 0x11, 0x6, 0x9a, 0xd3,
+ 0x5, 0xfb, 0x23, 0x6, 0x81, 0xbe, 0x8a, 0xb0,
+ 0x98, 0x1a, 0xf7, 0x18, 0xea, 0xaa, 0xc0, 0x9e,
+ 0xeb, 0x88, 0xfb, 0x10, 0x9a, 0x1e, 0xdc, 0x93,
+ 0x5, 0xf7, 0x30, 0x7a, 0xfb, 0xd, 0xac, 0x43,
+ 0x1b, 0xfb, 0x14, 0xfb, 0x4, 0x28, 0xfb, 0x1a,
+ 0x5f, 0x8d, 0x7e, 0x92, 0x5f, 0x1f, 0x35, 0x6,
+ 0x7c, 0x43, 0x5, 0xf7, 0x1, 0x6, 0x9f, 0xfb,
+ 0xa, 0xfb, 0x11, 0x29, 0x5c, 0x70, 0x8, 0xe,
+ 0x77, 0x84, 0xd2, 0xf7, 0xfd, 0xcb, 0xf7, 0x48,
+ 0x77, 0x1, 0xf7, 0x3, 0xf7, 0x9d, 0x3, 0xf7,
+ 0xa2, 0x8d, 0x15, 0x9a, 0xcf, 0x5, 0x87, 0x79,
+ 0x79, 0x89, 0x79, 0x1b, 0x65, 0x8b, 0xb2, 0xbd,
+ 0x96, 0x1f, 0xc7, 0xf7, 0xa4, 0x5, 0xe4, 0x6,
+ 0x9a, 0xcb, 0x5, 0x32, 0x6, 0xb4, 0xf7, 0x48,
+ 0x23, 0x51, 0x70, 0xfb, 0xe, 0x5, 0x43, 0x6,
+ 0x7d, 0x4b, 0x5, 0xd2, 0x6, 0x4b, 0xfb, 0xa4,
+ 0x5, 0x86, 0x72, 0x88, 0x75, 0x77, 0x1a, 0x51,
+ 0xa8, 0x68, 0xd6, 0x93, 0xa7, 0x8c, 0x93, 0xa7,
+ 0x1e, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x51, 0xd4,
+ 0xf8, 0x26, 0xd4, 0xf7, 0x50, 0x77, 0x1, 0xb1,
+ 0xe7, 0xf7, 0xfe, 0xe7, 0x3, 0xf7, 0x3c, 0xd9,
+ 0x15, 0x4d, 0xad, 0xb9, 0x69, 0xd1, 0x1b, 0xf7,
+ 0x1c, 0xf7, 0x16, 0xf7, 0x23, 0xf7, 0x52, 0xf7,
+ 0x1e, 0x3d, 0xd8, 0x25, 0x57, 0x5d, 0x77, 0x56,
+ 0x52, 0x1f, 0xc5, 0xf7, 0x99, 0x5, 0x2e, 0x6,
+ 0xfb, 0x5c, 0xfe, 0x31, 0x5, 0xe7, 0x6, 0xe5,
+ 0xf8, 0x32, 0x15, 0xdf, 0xca, 0xf7, 0x3a, 0xf7,
+ 0xa, 0xd9, 0xb0, 0x45, 0x43, 0x3e, 0x5b, 0xfb,
+ 0x4b, 0xfb, 0x16, 0x31, 0x6f, 0xd9, 0xd5, 0x1e,
+ 0xe, 0x78, 0xd0, 0xf7, 0xa3, 0xd4, 0xf7, 0x84,
+ 0xd0, 0x1, 0xf8, 0x71, 0xeb, 0x3, 0xd6, 0xf7,
+ 0x45, 0x15, 0xfb, 0x20, 0x96, 0xf7, 0x8, 0x53,
+ 0xf7, 0x3, 0x1b, 0xf7, 0x20, 0xf7, 0xc, 0xe6,
+ 0xf7, 0x15, 0xe5, 0x48, 0xbf, 0x75, 0x97, 0x1f,
+ 0xe6, 0xb2, 0xae, 0xc3, 0xcf, 0x1a, 0xeb, 0x38,
+ 0xe4, 0xfb, 0x19, 0x6f, 0xfb, 0x34, 0x87, 0xfb,
+ 0x46, 0x5b, 0x1e, 0xe8, 0x79, 0x5, 0xe8, 0x9d,
+ 0xce, 0xb1, 0xc5, 0x1b, 0xd0, 0xc0, 0x58, 0x4a,
+ 0x52, 0x46, 0x48, 0xfb, 0x10, 0x1f, 0x7b, 0x42,
+ 0x5, 0xe8, 0xd8, 0x61, 0x3d, 0x43, 0x44, 0x3c,
+ 0x27, 0xfb, 0xc, 0x7d, 0xf0, 0xb0, 0x86, 0x1f,
+ 0xe, 0x65, 0xa, 0xf7, 0x77, 0xc4, 0xf7, 0x92,
+ 0xbe, 0x12, 0xf7, 0xe7, 0xd3, 0x55, 0xd1, 0x13,
+ 0x7c, 0xf8, 0x79, 0xc7, 0x15, 0xf7, 0x45, 0x6,
+ 0x7d, 0x44, 0x5, 0xcb, 0x6, 0x9a, 0xd2, 0x5,
+ 0xb8, 0x6, 0x97, 0xc1, 0x5, 0x5e, 0x6, 0xb8,
+ 0xf7, 0x77, 0x5, 0x55, 0x6, 0xfb, 0x7e, 0xfb,
+ 0x74, 0x5, 0xd6, 0x88, 0x15, 0xf7, 0x14, 0xf7,
+ 0x11, 0x8d, 0x89, 0x6e, 0xfb, 0xf, 0x5, 0xfc,
+ 0xb2, 0xf7, 0xdc, 0x15, 0x50, 0x9b, 0xbe, 0x61,
+ 0xd6, 0x1b, 0xde, 0xc3, 0xbd, 0xc4, 0xc1, 0x66,
+ 0x9a, 0x74, 0x95, 0x1f, 0x8d, 0x7, 0x13, 0x7a,
+ 0xb7, 0x94, 0xab, 0xa1, 0xbb, 0x1a, 0xc7, 0x51,
+ 0xae, 0x47, 0x48, 0x57, 0x6c, 0x50, 0x7b, 0x1e,
+ 0xce, 0x82, 0x5, 0x9e, 0x92, 0x97, 0xa8, 0xbc,
+ 0x1b, 0xa8, 0xa6, 0x7d, 0x6d, 0x5d, 0x5c, 0x85,
+ 0x60, 0x8a, 0x1f, 0x81, 0x58, 0x5, 0x13, 0xbc,
+ 0xae, 0xba, 0x82, 0x5c, 0x79, 0x80, 0x6b, 0x51,
+ 0x55, 0x7c, 0xb0, 0x9a, 0x85, 0x1f, 0x5d, 0xfc,
+ 0x69, 0x15, 0xd4, 0x6, 0xf9, 0x13, 0xf9, 0x66,
+ 0x5, 0x3c, 0x6, 0xe, 0xae, 0xf7, 0xa2, 0xcf,
+ 0xf7, 0xc4, 0xc8, 0x12, 0xf7, 0xe2, 0xdf, 0x4b,
+ 0xdd, 0x13, 0xe0, 0xe5, 0xf8, 0x1b, 0x15, 0x45,
+ 0x9d, 0xc5, 0x58, 0xe2, 0x1b, 0xec, 0xcf, 0xc7,
+ 0xcf, 0xcb, 0x5f, 0x9d, 0x70, 0x98, 0x1f, 0x8d,
+ 0x7, 0x13, 0xd0, 0xbe, 0x97, 0xb1, 0xa7, 0xc5,
+ 0x1a, 0xd3, 0x48, 0xb1, 0x3b, 0x3d, 0x4f, 0x66,
+ 0x44, 0x77, 0x1e, 0xda, 0x81, 0x5, 0xa2, 0x93,
+ 0x98, 0xad, 0xc5, 0x1b, 0xad, 0xaa, 0x7a, 0x67,
+ 0x55, 0x55, 0x83, 0x59, 0x8a, 0x1f, 0x7f, 0x4d,
+ 0x5, 0x13, 0xe0, 0xb3, 0xc3, 0x8b, 0x53, 0x75,
+ 0x7e, 0x5b, 0x47, 0x4c, 0x7a, 0xb8, 0x9c, 0x84,
+ 0x1f, 0xe, 0xae, 0xf8, 0xf3, 0xf7, 0x4, 0x2f,
+ 0x76, 0xb7, 0xd0, 0x8e, 0x77, 0x12, 0xf7, 0x11,
+ 0xce, 0xf7, 0x7d, 0xcc, 0x13, 0x8c, 0xf7, 0x11,
+ 0xf8, 0xf3, 0x15, 0xce, 0x6, 0x13, 0x6c, 0xa4,
+ 0x91, 0x97, 0x9d, 0xa6, 0x1b, 0xae, 0xa6, 0x7e,
+ 0x7f, 0xa3, 0x1f, 0x81, 0x9f, 0x9e, 0x82, 0xa1,
+ 0x1b, 0xcb, 0xaf, 0xc4, 0xc3, 0x91, 0x1f, 0x4a,
+ 0x6, 0x7c, 0x86, 0x85, 0x72, 0x6f, 0x1b, 0x7a,
+ 0x78, 0x91, 0x92, 0x78, 0x1f, 0x13, 0x5c, 0x98,
+ 0x6a, 0x69, 0x9c, 0x6d, 0x1b, 0x13, 0x8c, 0x41,
+ 0x79, 0x55, 0x4e, 0x7a, 0x1f, 0xe, 0xf9, 0x52,
+ 0xf7, 0xdb, 0x76, 0xf7, 0xf3, 0xc8, 0x1, 0xf9,
+ 0x33, 0xc8, 0x3, 0xf7, 0x5c, 0xf7, 0xc6, 0x15,
+ 0xd2, 0x6, 0xf7, 0x13, 0xf7, 0xf3, 0x5, 0xf7,
+ 0x21, 0x6, 0xa0, 0xc8, 0x5, 0xfb, 0xf4, 0x6,
+ 0x75, 0x4e, 0x5, 0xf7, 0x21, 0x6, 0xf7, 0x31,
+ 0xfb, 0xf3, 0x15, 0xcd, 0x6, 0xf7, 0x12, 0xf7,
+ 0xf3, 0x48, 0xa, 0x7e, 0xfb, 0xf3, 0x5, 0xcd,
+ 0x6, 0xf7, 0x7d, 0xf7, 0xed, 0x48, 0xa, 0xfb,
+ 0x10, 0xfb, 0xed, 0x5, 0xcd, 0x6, 0xf7, 0x28,
+ 0xf8, 0x30, 0x5, 0x23, 0x6, 0xfb, 0x73, 0xfb,
+ 0xdd, 0x4e, 0xa, 0x96, 0xf7, 0xdd, 0x5, 0x21,
+ 0x6, 0xe, 0x8b, 0xda, 0xf8, 0xbd, 0xd7, 0x1,
+ 0xf8, 0x63, 0xe9, 0x3, 0xa2, 0x16, 0xf8, 0x58,
+ 0x6, 0x9d, 0xda, 0x5, 0xfb, 0xe8, 0x6, 0xe1,
+ 0xf7, 0xa, 0xf7, 0x11, 0xc2, 0xcf, 0xc7, 0x8,
+ 0xa9, 0xa3, 0xea, 0xe1, 0xe8, 0x1a, 0xee, 0x3d,
+ 0xe4, 0xfb, 0x26, 0xfb, 0x31, 0x49, 0x23, 0x29,
+ 0x7b, 0x1e, 0xe6, 0x80, 0x5, 0xce, 0x98, 0xb6,
+ 0xd1, 0xe7, 0x1b, 0xd3, 0xc5, 0x5e, 0x48, 0x38,
+ 0x37, 0x53, 0x36, 0x4b, 0x1f, 0xfb, 0x4a, 0xfb,
+ 0x1b, 0x4d, 0x5f, 0x70, 0xfb, 0x19, 0x8, 0xe,
+ 0xae, 0xf7, 0xad, 0xcf, 0xf7, 0x76, 0xf7, 0x14,
+ 0x47, 0xcf, 0x1, 0xf7, 0xfe, 0xe2, 0x3, 0xcb,
+ 0xf7, 0xad, 0x15, 0xf7, 0xe8, 0x6, 0x99, 0xcf,
+ 0x5, 0xfb, 0x6d, 0x6, 0xa2, 0xa6, 0xa4, 0x9a,
+ 0xda, 0xb9, 0x8, 0xce, 0xb2, 0xc1, 0xb1, 0xd0,
+ 0x1a, 0xc2, 0x63, 0xcc, 0xfb, 0xc, 0x2a, 0x4e,
+ 0x63, 0x37, 0x73, 0x1e, 0xe2, 0x83, 0x5, 0xbb,
+ 0x9c, 0xa7, 0x9b, 0xbd, 0x1b, 0xbd, 0xa2, 0x71,
+ 0x71, 0x64, 0x6d, 0x78, 0x4e, 0x6a, 0x1f, 0xfb,
+ 0x2c, 0x36, 0x67, 0x4b, 0x78, 0x4d, 0x8, 0xe,
+ 0x7c, 0xd5, 0x62, 0x76, 0xf8, 0xa2, 0x77, 0x12,
+ 0x13, 0x60, 0xf8, 0x2e, 0x88, 0x15, 0xdd, 0x6,
+ 0xf7, 0x0, 0xf8, 0xa2, 0x5, 0x33, 0x6, 0x5c,
+ 0xfb, 0x75, 0x7d, 0x44, 0x7d, 0x4c, 0x55, 0x57,
+ 0x19, 0x13, 0xa0, 0x62, 0x60, 0x62, 0x7f, 0x69,
+ 0x1b, 0x4e, 0x5d, 0x97, 0xf7, 0xa, 0xa9, 0x1f,
+ 0xcc, 0xf7, 0xe2, 0x5, 0x38, 0x6, 0x49, 0xfb,
+ 0xe2, 0x5, 0x85, 0x6b, 0x87, 0x6b, 0x70, 0x1a,
+ 0x4c, 0xb5, 0x59, 0xf2, 0xd9, 0xca, 0xbd, 0xc3,
+ 0xbd, 0x1e, 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77,
+ 0x27, 0xa, 0x31, 0xf8, 0x8f, 0x36, 0xa, 0xe,
+ 0x39, 0xa, 0xe8, 0xf7, 0x1b, 0x27, 0xa, 0xfb,
+ 0x40, 0xf8, 0x8f, 0x30, 0xa, 0xe, 0x39, 0xa,
+ 0xef, 0xef, 0x27, 0xa, 0x8d, 0xf8, 0x96, 0x2e,
+ 0xa, 0xe, 0x39, 0xa, 0xe4, 0xf7, 0x1f, 0x27,
+ 0xa, 0x65, 0xf8, 0x8b, 0x15, 0xd3, 0x6, 0x50,
+ 0x6f, 0xa, 0xfb, 0x3, 0x6, 0xe, 0xfb, 0x11,
+ 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+ 0xbd, 0x7, 0xe, 0xf7, 0x5e, 0x43, 0xa, 0xf7,
+ 0x61, 0x16, 0xee, 0x6, 0xf7, 0xbf, 0xf8, 0x9f,
+ 0x4d, 0xa, 0xfb, 0x83, 0xfc, 0x4e, 0x4e, 0xa,
+ 0x4e, 0xf8, 0x4e, 0x5, 0x34, 0x6, 0xe, 0xf8,
+ 0x3c, 0x43, 0xa, 0xf8, 0x65, 0xcd, 0x3, 0xf7,
+ 0x47, 0x16, 0xe7, 0x6, 0xf7, 0x4a, 0xf8, 0x36,
+ 0xa3, 0xfc, 0x36, 0x5, 0xe6, 0x6, 0xf7, 0x90,
+ 0xf8, 0x9f, 0x5, 0x34, 0x6, 0xfb, 0x51, 0xfc,
+ 0x38, 0x4e, 0xa, 0x76, 0xf8, 0x38, 0x50, 0xa,
+ 0xfb, 0x48, 0xfc, 0x3d, 0x4e, 0xa, 0x6a, 0xf8,
+ 0x3d, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x43,
+ 0xa, 0x96, 0x16, 0xf7, 0xc, 0x6, 0xf7, 0x3a,
+ 0xf7, 0x54, 0xec, 0xfb, 0x54, 0x5, 0xf4, 0x6,
+ 0xfb, 0x20, 0xf7, 0x98, 0xf7, 0x7f, 0xf7, 0x9b,
+ 0x5, 0xfb, 0x9, 0x6, 0xfb, 0x36, 0xfb, 0x52,
+ 0x2c, 0xf7, 0x52, 0x5, 0x22, 0x6, 0xf7, 0x20,
+ 0xfb, 0x93, 0x5, 0xe, 0xf7, 0x5e, 0xfb, 0x55,
+ 0x76, 0xf9, 0x75, 0x77, 0x1, 0x9f, 0xfb, 0xe,
+ 0x15, 0x86, 0x36, 0x5, 0x86, 0x9f, 0x9d, 0x89,
+ 0x9c, 0x1b, 0xe8, 0xc0, 0xd1, 0xd3, 0xb3, 0x1f,
+ 0xf7, 0xec, 0xf8, 0xe7, 0x50, 0xa, 0xfb, 0x86,
+ 0xfc, 0x3a, 0x4e, 0xf8, 0x3a, 0x3f, 0xa, 0xe4,
+ 0xfc, 0xa3, 0x41, 0xfb, 0x15, 0x74, 0x7e, 0x38,
+ 0xa3, 0x19, 0xe, 0xf7, 0x5e, 0xfb, 0x55, 0x76,
+ 0xf9, 0x7d, 0x77, 0xf7, 0x73, 0x77, 0x1, 0xf8,
+ 0x74, 0xeb, 0x3, 0x9f, 0xfb, 0xb, 0x15, 0x86,
+ 0x36, 0x59, 0xa, 0xd8, 0xce, 0xb2, 0x1f, 0xf7,
+ 0xec, 0xf8, 0xed, 0x50, 0xa, 0xfb, 0x85, 0xfc,
+ 0x3f, 0x4e, 0xa, 0x4f, 0xf8, 0x3f, 0x45, 0xa,
+ 0xe5, 0xfc, 0xa8, 0x5, 0xfb, 0x15, 0x53, 0x59,
+ 0x8e, 0x78, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e,
+ 0x1f, 0xf7, 0x97, 0xf9, 0x5f, 0x15, 0xd7, 0x6,
+ 0xf7, 0x1c, 0xf7, 0x1e, 0x5, 0xfb, 0x9, 0x6,
+ 0xe, 0xf7, 0x5e, 0xfb, 0x6a, 0xe1, 0xf9, 0x71,
+ 0xf0, 0x1, 0x9f, 0xfb, 0xc, 0x15, 0x86, 0x37,
+ 0x59, 0xa, 0xd7, 0xce, 0xb2, 0x1f, 0xf7, 0xec,
+ 0xf8, 0xe6, 0x50, 0xa, 0xfb, 0x85, 0xfc, 0x3a,
+ 0x4e, 0xa, 0x4f, 0xf8, 0x3a, 0x45, 0xa, 0xe5,
+ 0xfc, 0xa2, 0x5, 0xfb, 0x16, 0x3f, 0x7f, 0x90,
+ 0x66, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f,
+ 0xf8, 0x1b, 0xf9, 0x69, 0x15, 0xeb, 0x6, 0xa1,
+ 0xf0, 0x50, 0xa, 0xfb, 0x65, 0x26, 0x15, 0xea,
+ 0x6, 0xa1, 0xf0, 0x50, 0xa, 0xe, 0xa0, 0x76,
+ 0xf7, 0xbf, 0xcb, 0xf7, 0xd9, 0x77, 0x1, 0xdc,
+ 0xf7, 0x2e, 0x15, 0xf7, 0x58, 0x6, 0x6b, 0xfb,
+ 0x2e, 0x5, 0xe1, 0x6, 0xac, 0xf7, 0x2e, 0x5,
+ 0xf7, 0x56, 0x6, 0x99, 0xcc, 0x5, 0xfb, 0x56,
+ 0x6, 0x9b, 0xdb, 0x5, 0xf7, 0x54, 0x6, 0x99,
+ 0xcb, 0x5, 0xfb, 0x2c, 0x6, 0xf7, 0x8f, 0xf7,
+ 0xd9, 0x5, 0xfb, 0x0, 0x6, 0xfb, 0x77, 0xfb,
+ 0xd9, 0x4e, 0xa, 0xfb, 0x9, 0xf7, 0xd9, 0x5,
+ 0x33, 0x6, 0xf7, 0x13, 0xfb, 0xd9, 0x5, 0xfb,
+ 0x35, 0x6, 0x7e, 0x4b, 0x5, 0xf7, 0x59, 0x6,
+ 0x7b, 0x3b, 0x5, 0xfb, 0x58, 0x6, 0xe, 0xf7,
+ 0x5e, 0x8b, 0xda, 0xf8, 0x6, 0xd5, 0x1, 0xaa,
+ 0xf8, 0xb0, 0x3, 0xaa, 0x16, 0xf8, 0x5e, 0x6,
+ 0x9c, 0xda, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18,
+ 0xf8, 0x18, 0x5a, 0xa, 0xf7, 0xca, 0x6, 0xfc,
+ 0xe, 0xfc, 0x10, 0x5, 0xe, 0xf7, 0x5e, 0x8b,
+ 0xdb, 0xf8, 0x98, 0xf7, 0x1e, 0x1, 0xaa, 0x16,
+ 0xf8, 0x5e, 0x6, 0x9c, 0xdb, 0x5, 0xfb, 0xe3,
+ 0x6, 0xf8, 0x18, 0xf8, 0x1c, 0x5a, 0xa, 0xf7,
+ 0xc8, 0x6, 0x8d, 0x89, 0xfc, 0xe, 0xfc, 0x12,
+ 0x5, 0xf7, 0x9b, 0xf8, 0xa2, 0x15, 0xf5, 0x6,
+ 0xf7, 0x23, 0xf7, 0x1e, 0x47, 0xa, 0x33, 0x32,
+ 0x60, 0xe4, 0x5, 0x36, 0x6, 0xe, 0x78, 0xd0,
+ 0xf8, 0xdc, 0xd0, 0x1, 0xf7, 0x2, 0xe3, 0xf7,
+ 0xd0, 0xe3, 0x3, 0xe8, 0xf7, 0x63, 0x15, 0xfb,
+ 0x44, 0xf0, 0x59, 0xec, 0xf7, 0x73, 0xe9, 0xf7,
+ 0xbc, 0xf7, 0x50, 0xf7, 0x4f, 0xfb, 0xd, 0xbe,
+ 0x3b, 0xfb, 0x6c, 0x29, 0xfb, 0xd7, 0xfb, 0x41,
+ 0x1e, 0xe3, 0x16, 0xa2, 0xac, 0xf8, 0x28, 0xf7,
+ 0x56, 0xf7, 0x3, 0x8c, 0xfb, 0x1d, 0x6b, 0x38,
+ 0x5a, 0xfb, 0xe0, 0xfb, 0x43, 0x49, 0x5a, 0xbd,
+ 0xf6, 0x1e, 0xe, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+ 0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0xf8,
+ 0xc0, 0x94, 0x7, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+ 0xf7, 0x48, 0x9e, 0x8, 0xfb, 0x70, 0x98, 0x9,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xdc,
+ 0xa, 0xe5, 0xb, 0xd5, 0x92, 0xc, 0xc, 0xe5,
+ 0x95, 0xc, 0xd, 0xf8, 0xc0, 0x14, 0xf7, 0xbe,
+ 0x15, 0xc3, 0x13, 0x0, 0x50, 0x2, 0x0, 0x1,
+ 0x0, 0x4e, 0x0, 0x92, 0x0, 0x99, 0x0, 0xc9,
+ 0x1, 0x1, 0x1, 0x49, 0x1, 0x72, 0x1, 0xb1,
+ 0x1, 0xb6, 0x1, 0xbb, 0x1, 0xde, 0x1, 0xe1,
+ 0x2, 0x13, 0x2, 0x1a, 0x2, 0x22, 0x2, 0x2a,
+ 0x2, 0x3a, 0x2, 0x40, 0x2, 0x4b, 0x2, 0x58,
+ 0x2, 0x61, 0x2, 0x66, 0x2, 0x72, 0x2, 0x7b,
+ 0x2, 0x84, 0x2, 0x8c, 0x2, 0x96, 0x2, 0xa0,
+ 0x2, 0xa8, 0x2, 0xac, 0x2, 0xaf, 0x2, 0xb3,
+ 0x2, 0xbc, 0x2, 0xc5, 0x2, 0xcc, 0x2, 0xd3,
+ 0x2, 0xd9, 0x2, 0xdd, 0x2, 0xeb, 0x2, 0xef,
+ 0x2, 0xf3, 0x2, 0xfb, 0x3, 0x3, 0x3, 0xa,
+ 0x3, 0xf, 0x3, 0x13, 0x3, 0x17, 0x3, 0x22,
+ 0x3, 0x26, 0x3, 0x2d, 0x3, 0x33, 0x3, 0x3a,
+ 0x3, 0x40, 0x3, 0x45, 0x3, 0x4a, 0x3, 0x4e,
+ 0x3, 0x58, 0x3, 0x62, 0x3, 0x6c, 0x3, 0x76,
+ 0x3, 0x7a, 0x3, 0x83, 0x3, 0x8c, 0x3, 0x95,
+ 0x3, 0x9e, 0x3, 0xa7, 0x3, 0xb0, 0x3, 0xb8,
+ 0x3, 0xc1, 0x3, 0xca, 0x3, 0xd0, 0x3, 0xd4,
+ 0x3, 0xda, 0x3, 0xe0, 0x3, 0xe5, 0x3, 0xea,
+ 0x3, 0xef, 0x3, 0xf3, 0x3, 0xf7, 0x3, 0xfb,
+ 0x6e, 0xa, 0x85, 0xa7, 0x87, 0x9f, 0xa4, 0x1a,
+ 0xae, 0x91, 0xae, 0x92, 0xad, 0x1e, 0xa9, 0xf7,
+ 0x18, 0x5, 0x97, 0xc4, 0x8f, 0xa5, 0x91, 0x1a,
+ 0xe3, 0x2d, 0xc8, 0xfb, 0x2, 0x30, 0xfb, 0x11,
+ 0x5f, 0xfb, 0xc, 0x73, 0x1e, 0xe1, 0x83, 0x5,
+ 0xd8, 0xa6, 0xcc, 0xa0, 0xc5, 0x1b, 0xa4, 0xe5,
+ 0x87, 0x44, 0x80, 0x87, 0x6f, 0x83, 0x74, 0x1f,
+ 0x67, 0x7c, 0x65, 0x89, 0x3d, 0x88, 0x8, 0x4e,
+ 0x89, 0xfb, 0x48, 0x83, 0xfb, 0x37, 0x1a, 0x28,
+ 0xd6, 0x53, 0xe4, 0x1e, 0xb, 0x15, 0xfb, 0x41,
+ 0xf7, 0xb, 0xfb, 0x27, 0xf7, 0x5b, 0xf7, 0x76,
+ 0xf7, 0x45, 0xf7, 0x54, 0xf7, 0x82, 0xf7, 0x54,
+ 0xfb, 0xb, 0xf7, 0x1c, 0xfb, 0x5c, 0xfb, 0x6a,
+ 0xfb, 0x50, 0xfb, 0x38, 0xfb, 0xa6, 0x1e, 0xef,
+ 0x86, 0x15, 0xf7, 0x8b, 0xf7, 0x39, 0xf7, 0x7,
+ 0xf7, 0x1d, 0xf7, 0x4, 0xf6, 0x32, 0xfb, 0x32,
+ 0xfb, 0x47, 0xfb, 0xd, 0xfb, 0x3e, 0xfb, 0x42,
+ 0xfb, 0x4, 0xfb, 0x6, 0xdd, 0xf7, 0x2c, 0x1e,
+ 0xb, 0x20, 0xa, 0x13, 0xbc, 0x23, 0xa, 0xb,
+ 0xe7, 0xc9, 0xc1, 0xa4, 0xa7, 0x1f, 0x8c, 0x80,
+ 0x8d, 0x6d, 0x94, 0x71, 0x8, 0xa1, 0xf7, 0xa4,
+ 0x15, 0x82, 0x55, 0x81, 0x5f, 0x71, 0x66, 0x8,
+ 0x59, 0x69, 0x54, 0x6e, 0x54, 0x1b, 0x3e, 0x73,
+ 0xbd, 0xb2, 0xe1, 0xe7, 0x96, 0xc6, 0x90, 0x1f,
+ 0xdd, 0x92, 0xa2, 0x8d, 0xad, 0x99, 0x8, 0xb,
+ 0x15, 0xfb, 0x22, 0xf1, 0x3b, 0xf7, 0x7, 0xf7,
+ 0x30, 0xf7, 0x15, 0xf7, 0x1a, 0xf7, 0x57, 0xf7,
+ 0x1d, 0x34, 0xde, 0xfb, 0x13, 0xfb, 0x4c, 0x23,
+ 0xfb, 0x28, 0xfb, 0x47, 0x1e, 0xe5, 0x16, 0xf7,
+ 0x3, 0xcb, 0xf7, 0x27, 0xf7, 0x17, 0xe2, 0xb3,
+ 0x43, 0x3c, 0xfb, 0x4, 0x43, 0xfb, 0x28, 0xfb,
+ 0xe, 0x6d, 0x29, 0x98, 0xf7, 0x20, 0x1e, 0xb,
+ 0x15, 0xf8, 0x1e, 0x6, 0x8e, 0x9f, 0x8f, 0xa0,
+ 0xb3, 0x1a, 0xe7, 0x5d, 0xf7, 0x15, 0xfb, 0x38,
+ 0xfb, 0x5a, 0x35, 0xfb, 0x58, 0xfb, 0x1c, 0xfb,
+ 0x29, 0xe9, 0x3e, 0xf7, 0x7, 0xf7, 0x20, 0xe5,
+ 0xf7, 0x2, 0xd5, 0xa1, 0x1e, 0x32, 0x94, 0x5,
+ 0x29, 0x61, 0x3a, 0x76, 0x63, 0x1b, 0x4c, 0x54,
+ 0xbe, 0xf2, 0x96, 0x8c, 0x92, 0x8c, 0x95, 0x1f,
+ 0x99, 0xd1, 0x15, 0xcf, 0xa0, 0xbf, 0xe9, 0xf5,
+ 0x1b, 0xd2, 0xcd, 0x4b, 0x29, 0x7b, 0x1f, 0xb,
+ 0x15, 0xf4, 0x6, 0xf7, 0x8, 0xf7, 0x69, 0x5,
+ 0xf7, 0xb6, 0x6, 0xaf, 0xfb, 0x69, 0x5, 0xe8,
+ 0x6, 0xfb, 0xb, 0xf9, 0x76, 0x5, 0xfb, 0x5,
+ 0x6, 0xfb, 0x26, 0xfc, 0x54, 0x15, 0xf7, 0x51,
+ 0xf8, 0x4, 0x48, 0xa, 0xb9, 0xfc, 0x4, 0x5,
+ 0xe, 0x12, 0x13, 0x70, 0xf8, 0x27, 0x88, 0x15,
+ 0xe0, 0x6, 0xf7, 0x4, 0xf8, 0xa5, 0x45, 0xa,
+ 0x5a, 0xfb, 0x76, 0x5, 0x21, 0x75, 0x50, 0xfb,
+ 0x1b, 0xfb, 0x12, 0x1b, 0x4b, 0x7a, 0xc5, 0xd4,
+ 0x9a, 0x1f, 0xd4, 0xf7, 0xe4, 0x45, 0xa, 0x46,
+ 0xfb, 0xe2, 0x5, 0x87, 0x74, 0x89, 0x76, 0x76,
+ 0x1a, 0x13, 0xb0, 0x3a, 0xae, 0x4e, 0xec, 0xdc,
+ 0xcc, 0xbd, 0xc4, 0xbf, 0x1e, 0x13, 0x70, 0xb,
+ 0xfd, 0x8, 0x21, 0xa, 0xe, 0xfc, 0xa2, 0x24,
+ 0xa, 0xe, 0x1, 0xe1, 0x16, 0xf8, 0xbe, 0x6a,
+ 0xa, 0xfc, 0x5c, 0x6, 0xbf, 0xf7, 0x94, 0x5,
+ 0xf8, 0x29, 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x29,
+ 0x6, 0xb9, 0xf7, 0x7b, 0x5, 0xf8, 0x40, 0x6a,
+ 0xa, 0xfc, 0xa0, 0x6, 0xb, 0x23, 0xa, 0xe,
+ 0x15, 0x8b, 0x22, 0xfc, 0x86, 0x64, 0x1a, 0xfb,
+ 0x25, 0xf7, 0xb, 0x43, 0xf7, 0x27, 0xf7, 0x91,
+ 0xbb, 0xf7, 0x80, 0xe0, 0x9c, 0x1e, 0xe5, 0xf8,
+ 0x45, 0x57, 0xa, 0x33, 0xfc, 0x45, 0x5, 0xfb,
+ 0xb, 0x74, 0x49, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+ 0x39, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xad,
+ 0x5, 0xe, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xb, 0x2f, 0xa, 0xfb, 0x5d, 0x27, 0x2f, 0xa,
+ 0xb, 0x15, 0xe7, 0x6, 0xa0, 0xef, 0x3d, 0xa,
+ 0xb, 0x6e, 0xa, 0xdb, 0xe2, 0xb2, 0x34, 0x5,
+ 0xd9, 0x6, 0x4e, 0xf7, 0x1b, 0x5, 0x2a, 0x6,
+ 0xb, 0x35, 0xa, 0xf7, 0x69, 0xd8, 0xb, 0xf8,
+ 0x5, 0x8b, 0xdf, 0xf7, 0x94, 0xde, 0xf7, 0x7b,
+ 0xdf, 0xb, 0x3b, 0xa, 0xe9, 0xb7, 0x96, 0x41,
+ 0xa, 0xfb, 0x5, 0x84, 0x66, 0x8, 0xb, 0xe9,
+ 0x6, 0xf7, 0x25, 0xf9, 0x73, 0x3d, 0xa, 0xb,
+ 0xf8, 0x5, 0xa0, 0x76, 0xb, 0x15, 0xd4, 0x6,
+ 0xf7, 0x16, 0xf7, 0x1b, 0x5, 0xfb, 0x4, 0x6,
+ 0xb, 0xc5, 0x6, 0x77, 0x2d, 0x5f, 0x80, 0x7a,
+ 0x87, 0xb, 0xdf, 0x6, 0xf4, 0xf8, 0xa3, 0x5,
+ 0x36, 0x6, 0xb, 0x7c, 0xd5, 0x4d, 0xc9, 0xf8,
+ 0x67, 0x77, 0xb, 0xa0, 0x76, 0xf8, 0x56, 0xcf,
+ 0xf7, 0x17, 0xda, 0x1, 0xb, 0x15, 0xf4, 0x6,
+ 0xa1, 0xf4, 0x5, 0x52, 0x6, 0x9e, 0xb, 0x4c,
+ 0xa, 0x92, 0xb0, 0x9e, 0xe6, 0x18, 0xb, 0x5,
+ 0x2f, 0x6, 0xb, 0x3f, 0xa, 0xe, 0x5, 0x31,
+ 0x6, 0xb, 0x15, 0xf3, 0x6, 0xa1, 0xeb, 0x5,
+ 0x23, 0x6, 0xb, 0x9c, 0x8f, 0x93, 0xb4, 0x18,
+ 0x20, 0x7d, 0x72, 0xb, 0x77, 0x1, 0xf7, 0xf,
+ 0xec, 0x3, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77,
+ 0x1, 0xb, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xb,
+ 0x5, 0x30, 0x6, 0xb, 0x6, 0xeb, 0xf8, 0x56,
+ 0x5, 0xf0, 0x6, 0x99, 0xcf, 0x5, 0x26, 0x6,
+ 0xf0, 0xb, 0x5, 0x27, 0x6, 0xb, 0x5, 0x8d,
+ 0x6, 0xb, 0xf7, 0x2c, 0x76, 0xf8, 0x2d, 0x77,
+ 0x1, 0xb, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8d,
+ 0xce, 0xb, 0xef, 0x6, 0xa0, 0xf5, 0x47, 0xa,
+ 0xb, 0x99, 0xa4, 0xf7, 0x5, 0xb, 0x5, 0x2c,
+ 0x6, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15, 0xdc,
+ 0x6, 0xf7, 0x24, 0x6d, 0xa, 0xfb, 0x10, 0x6,
+ 0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0xfb, 0x3,
+ 0x6, 0xfb, 0x97, 0xb, 0x5c, 0xa, 0xf8, 0xa3,
+ 0x77, 0xb, 0xae, 0xf8, 0xe5, 0xf7, 0x21, 0x1,
+ 0xb, 0x5c, 0xa, 0xf9, 0x73, 0x77, 0xb, 0x6,
+ 0x9c, 0xdc, 0x5, 0xb, 0x15, 0xd1, 0x6, 0x51,
+ 0xb, 0x5, 0x29, 0x6, 0xb, 0xf7, 0x60, 0x5,
+ 0x3f, 0x6, 0x5e, 0xfb, 0x60, 0x5, 0xb, 0x5,
+ 0x82, 0xa5, 0xa1, 0x8a, 0x9a, 0x1b, 0xe9, 0xb8,
+ 0xb, 0x97, 0xc3, 0x5, 0xfc, 0x4c, 0x6, 0x7a,
+ 0x41, 0x5, 0xb, 0x15, 0x74, 0x8b, 0x21, 0xf7,
+ 0x10, 0xf7, 0x2d, 0xa3, 0xb, 0x77, 0xa0, 0x76,
+ 0xb, 0x15, 0xe1, 0x6, 0x76, 0x25, 0x5, 0x35,
+ 0x6, 0xb, 0x72, 0x1b, 0x7c, 0x78, 0x95, 0x95,
+ 0x74, 0x1f, 0xb, 0x77, 0xfb, 0x58, 0xcf, 0xf9,
+ 0xa2, 0xcf, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0x65,
+ 0xc8, 0x4e, 0xd4, 0x12, 0xb, 0xae, 0xfb, 0x4e,
+ 0x76, 0xfa, 0x40, 0x77, 0x1, 0xb, 0xc4, 0x6,
+ 0x77, 0x2d, 0x60, 0x80, 0x7a, 0x87, 0xb, 0x15,
+ 0xea, 0x6, 0xa1, 0xf0, 0x4d, 0xa, 0xb, 0xf7,
+ 0x84, 0xd4, 0x1, 0xbe, 0xf7, 0x84, 0x15, 0xb,
+ 0xf8, 0xac, 0x8d, 0x76, 0xa8, 0x76, 0xd2, 0xc1,
+ 0xb, 0x6, 0xa3, 0x90, 0x96, 0x9c, 0xb, 0xf6,
+ 0x4c, 0xa, 0xb, 0xf4, 0xef, 0xf8, 0x9d, 0xef,
+ 0xb, 0x6, 0x7d, 0x87, 0x85, 0x72, 0xb, 0x6,
+ 0x9c, 0xdf, 0x5, 0xb, 0x6, 0x9d, 0xdc, 0x5,
+ 0xb, 0xf8, 0x74, 0x78, 0xdc, 0xb, 0xf7, 0x21,
+ 0x5, 0xb, 0x15, 0xe6, 0x6, 0xb, 0xf7, 0x1f,
+ 0x5, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
new file mode 100644
index 0000000000..05b0a16372
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
@@ -0,0 +1,4191 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansMMFontData [66919] = {
+ 0x80, 0x01, 0xD2, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+ 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+ 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25, 0x25,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x46, 0x72,
+ 0x69, 0x20, 0x53, 0x65, 0x70, 0x20, 0x32, 0x39, 0x20, 0x31, 0x36, 0x3A, 0x30, 0x32, 0x3A, 0x35,
+ 0x33, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67, 0x65,
+ 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x0D,
+ 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46,
+ 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69, 0x63,
+ 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+ 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79,
+ 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73,
+ 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74,
+ 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E,
+ 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20,
+ 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C,
+ 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C,
+ 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73, 0x69, 0x74,
+ 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30,
+ 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E,
+ 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x34,
+ 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B,
+ 0x31, 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B,
+ 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x5D,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C,
+ 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63,
+ 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x33, 0x31, 0x35, 0x38, 0x20, 0x30, 0x2E, 0x31, 0x33,
+ 0x34, 0x39, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34,
+ 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65,
+ 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20,
+ 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x2E, 0x6E, 0x6F,
+ 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20,
+ 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61, 0x72, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65,
+ 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x20, 0x2F, 0x61,
+ 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, 0x70, 0x61, 0x72,
+ 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+ 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69,
+ 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33, 0x20, 0x2F, 0x70,
+ 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F,
+ 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35,
+ 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, 0x2F, 0x66, 0x69,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34, 0x20, 0x2F, 0x73,
+ 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73,
+ 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x20,
+ 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35,
+ 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x71, 0x75,
+ 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32, 0x20, 0x2F, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+ 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+ 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x20,
+ 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, 0x46, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37,
+ 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20,
+ 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x20, 0x2F, 0x4D,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F, 0x4E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38,
+ 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x20,
+ 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35, 0x20, 0x2F, 0x55,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39,
+ 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73,
+ 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x20,
+ 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63,
+ 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35,
+ 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+ 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34,
+ 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x20,
+ 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F,
+ 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x20, 0x2F, 0x6B,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20, 0x2F, 0x6C, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31,
+ 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30,
+ 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x20,
+ 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F,
+ 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x20, 0x2F, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36, 0x20, 0x2F, 0x61,
+ 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69,
+ 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62,
+ 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33,
+ 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67,
+ 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74,
+ 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E,
+ 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34,
+ 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, 0x71, 0x75, 0x6F,
+ 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, 0x6E, 0x64, 0x61,
+ 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x31, 0x20, 0x2F,
+ 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63,
+ 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35,
+ 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, 0x2F, 0x59, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, 0x63, 0x65, 0x6E,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33, 0x20, 0x2F, 0x73,
+ 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B,
+ 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36,
+ 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, 0x2F, 0x63, 0x6F,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, 0x2F, 0x67, 0x75,
+ 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C,
+ 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x20,
+ 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, 0x64, 0x65, 0x67,
+ 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x20,
+ 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72,
+ 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x20,
+ 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, 0x63, 0x75, 0x74,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31, 0x20, 0x2F, 0x6D,
+ 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70,
+ 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74,
+ 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34,
+ 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69,
+ 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F,
+ 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65,
+ 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+ 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+ 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20, 0x2F, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F,
+ 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69,
+ 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F, 0x45, 0x67, 0x72,
+ 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20,
+ 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, 0x49, 0x63, 0x69,
+ 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, 0x45, 0x74, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20, 0x2F, 0x4E, 0x74,
+ 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30,
+ 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75,
+ 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+ 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, 0x2F, 0x6D, 0x75,
+ 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F,
+ 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+ 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F,
+ 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C,
+ 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x20, 0x2F, 0x61,
+ 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+ 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x37, 0x20, 0x2F,
+ 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72, 0x69, 0x6E, 0x67,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, 0x2F, 0x63, 0x63,
+ 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65, 0x63, 0x69, 0x72,
+ 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69, 0x67, 0x72, 0x61,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F,
+ 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69,
+ 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F, 0x6F, 0x61, 0x63,
+ 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20,
+ 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69, 0x6C, 0x64, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, 0x75, 0x67, 0x72,
+ 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x20,
+ 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20, 0x2F, 0x75, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65,
+ 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E,
+ 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+ 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+ 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20,
+ 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x20,
+ 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F,
+ 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x31, 0x39, 0x20, 0x2D, 0x32, 0x35,
+ 0x37, 0x20, 0x31, 0x31, 0x35, 0x30, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+ 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+ 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B, 0x20, 0x2D, 0x35,
+ 0x35, 0x20, 0x2D, 0x31, 0x31, 0x32, 0x20, 0x2D, 0x31, 0x36, 0x32, 0x20, 0x2D, 0x31, 0x34, 0x35,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D,
+ 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x34, 0x32, 0x34,
+ 0x20, 0x31, 0x31, 0x35, 0x36, 0x20, 0x31, 0x33, 0x38, 0x39, 0x20, 0x31, 0x39, 0x38, 0x31, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+ 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x72, 0x69, 0x76,
+ 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D,
+ 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30, 0x2D, 0x31, 0x39, 0x39,
+ 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20,
+ 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0D, 0x25, 0x20, 0x41,
+ 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76,
+ 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x63, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x73, 0x65, 0x74, 0x73,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+ 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D,
+ 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C,
+ 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61,
+ 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+ 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, 0x7B, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D,
+ 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62,
+ 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x74, 0x72,
+ 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D,
+ 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63,
+ 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x72, 0x61,
+ 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65,
+ 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49,
+ 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+ 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69,
+ 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50,
+ 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+ 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B,
+ 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20,
+ 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x24, 0x42, 0x6C,
+ 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x2D, 0x31, 0x20, 0x31,
+ 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x71,
+ 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B,
+ 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20,
+ 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, 0x6F, 0x70, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C,
+ 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+ 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F,
+ 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x31, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D,
+ 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7B,
+ 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20,
+ 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F,
+ 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+ 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73,
+ 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65,
+ 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F,
+ 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x35,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73,
+ 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F,
+ 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+ 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61,
+ 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6F, 0x72,
+ 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20,
+ 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+ 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x78,
+ 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+ 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72,
+ 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+ 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E,
+ 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x53, 0x74, 0x65,
+ 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69,
+ 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F,
+ 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x70, 0x75,
+ 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x0D,
+ 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20,
+ 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x31, 0x20, 0x61, 0x64,
+ 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+ 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x64,
+ 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x36, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+ 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F,
+ 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x63,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64,
+ 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20,
+ 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B,
+ 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63,
+ 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33, 0x20, 0x61, 0x64, 0x64,
+ 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+ 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x5D, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67,
+ 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E,
+ 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F,
+ 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+ 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65,
+ 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20,
+ 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x31, 0x34, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69,
+ 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x32, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D,
+ 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66,
+ 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x7B,
+ 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
+ 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F,
+ 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+ 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+ 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64,
+ 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66,
+ 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+ 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+ 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73,
+ 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24,
+ 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x61, 0x64,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66,
+ 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F,
+ 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+ 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33,
+ 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+ 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x0D,
+ 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B,
+ 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,
+ 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x74, 0x72,
+ 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, 0x29, 0x20, 0x70, 0x75,
+ 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+ 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x7B,
+ 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65,
+ 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61,
+ 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72,
+ 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+ 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x28, 0x5F,
+ 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x72,
+ 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x77, 0x68, 0x65,
+ 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66,
+ 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65,
+ 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+ 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E,
+ 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x71,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44,
+ 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, 0x43, 0x6F, 0x6E, 0x76,
+ 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+ 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+ 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D,
+ 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D,
+ 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x69, 0x6C,
+ 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x6D, 0xD9, 0x00, 0x00, 0xE8, 0xDC,
+ 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96,
+ 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, 0xFF, 0x7D, 0x2F, 0xBF,
+ 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24, 0x4E, 0x73, 0x41, 0xB8,
+ 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F,
+ 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, 0xE9, 0xDB, 0xE0, 0x38,
+ 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B, 0x6C, 0xDC, 0xAC, 0x58,
+ 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8,
+ 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, 0xF9, 0x21, 0x6D, 0x42,
+ 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62, 0xE1, 0xB2, 0x04, 0x04,
+ 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1,
+ 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, 0x8F, 0xC1, 0xE7, 0x37,
+ 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6, 0x91, 0xE6, 0xE9, 0xE2,
+ 0x79, 0x11, 0x12, 0x36, 0xFF, 0xD7, 0xC7, 0x69, 0xE2, 0x5A, 0x86, 0xDA, 0xFA, 0x47, 0x58, 0x69,
+ 0x73, 0xB5, 0x49, 0xF3, 0xB4, 0x9B, 0x15, 0x16, 0x9C, 0x35, 0xF5, 0xDD, 0x2F, 0xD1, 0x4A, 0x95,
+ 0x2A, 0x95, 0x04, 0x43, 0x8B, 0xF2, 0x75, 0x99, 0xA4, 0x90, 0xA6, 0xA1, 0x0A, 0x87, 0x35, 0x71,
+ 0xEB, 0x17, 0x1A, 0x46, 0x59, 0x3E, 0xC6, 0xF8, 0x99, 0xF7, 0x60, 0x2C, 0x66, 0x27, 0x4A, 0x48,
+ 0x63, 0x35, 0xAD, 0xC1, 0xDF, 0x19, 0x26, 0x81, 0x68, 0x9C, 0x17, 0xD4, 0x71, 0x79, 0xEF, 0x5B,
+ 0xE3, 0xB5, 0xBE, 0xA9, 0xE5, 0xD2, 0x6C, 0xA2, 0x64, 0x0A, 0x14, 0x44, 0xFE, 0x73, 0x6B, 0x69,
+ 0xEF, 0x3D, 0xF3, 0x0A, 0x79, 0x68, 0x5B, 0x61, 0x86, 0xAE, 0x9B, 0x42, 0x80, 0x6E, 0xBF, 0x24,
+ 0x85, 0xA9, 0x87, 0x98, 0x59, 0xBB, 0x30, 0x36, 0x38, 0x81, 0x2A, 0x82, 0xB6, 0x05, 0x19, 0x94,
+ 0x0A, 0x88, 0x24, 0x8A, 0x57, 0x0C, 0x51, 0x58, 0xE4, 0xAE, 0x1B, 0xE4, 0xDF, 0xD3, 0x2F, 0x92,
+ 0xBE, 0xB5, 0xDB, 0x51, 0x5E, 0xA2, 0xC4, 0x58, 0xF0, 0x64, 0xF7, 0x57, 0xFB, 0x61, 0x3E, 0xAA,
+ 0x46, 0xE6, 0x33, 0x46, 0x6E, 0x45, 0x4D, 0x33, 0x17, 0x66, 0xE7, 0xD7, 0xCE, 0x92, 0xF0, 0xF6,
+ 0xB2, 0xFB, 0x62, 0x7B, 0xAD, 0x7C, 0x68, 0x0A, 0x8E, 0x14, 0x8F, 0xB7, 0x48, 0x3D, 0x84, 0xEF,
+ 0x49, 0xDC, 0x52, 0xE3, 0xAA, 0x04, 0xC9, 0xF3, 0x0B, 0x21, 0x41, 0x96, 0x4D, 0x36, 0xC3, 0x3D,
+ 0x54, 0xE8, 0x82, 0x69, 0xFF, 0xB1, 0xA8, 0xE3, 0x8A, 0x39, 0xDC, 0xC8, 0x14, 0x0A, 0x49, 0xAC,
+ 0x96, 0x33, 0x1E, 0x09, 0xE8, 0x62, 0x64, 0x57, 0x82, 0x68, 0x46, 0xAB, 0xE0, 0xBB, 0xCF, 0xCF,
+ 0x8F, 0xCF, 0x9E, 0x08, 0xB0, 0xAD, 0x98, 0x71, 0x33, 0x08, 0xE4, 0x5C, 0xCC, 0x7F, 0x17, 0x09,
+ 0x98, 0x65, 0xEE, 0xED, 0x93, 0x84, 0xC9, 0xFD, 0x46, 0x57, 0xB4, 0xF1, 0x98, 0x3A, 0xB5, 0xC2,
+ 0x7F, 0xF8, 0xFB, 0x60, 0x78, 0xD7, 0x47, 0xD7, 0x63, 0x58, 0x51, 0xE9, 0xDC, 0xF1, 0x0E, 0xB8,
+ 0x59, 0x3B, 0x72, 0x81, 0x31, 0xAF, 0xC8, 0x5B, 0x35, 0x47, 0xF1, 0xBC, 0xCD, 0xED, 0x45, 0xF1,
+ 0xFC, 0x6D, 0xFF, 0x2E, 0xAA, 0x6C, 0xC2, 0x65, 0x5F, 0x8F, 0x8F, 0x95, 0x20, 0xBA, 0xCA, 0xF9,
+ 0x68, 0xA5, 0x47, 0x7F, 0xCC, 0xD0, 0xA6, 0x3B, 0xAE, 0xA2, 0xE5, 0x11, 0x0D, 0x4E, 0x20, 0x44,
+ 0x6B, 0x64, 0xDB, 0x75, 0x68, 0x9D, 0xA4, 0xEC, 0xB2, 0x1D, 0xDF, 0x66, 0xC5, 0x89, 0x4F, 0x94,
+ 0x0B, 0x06, 0xD9, 0x11, 0x9C, 0x83, 0x3F, 0x55, 0x21, 0xA0, 0x65, 0x2E, 0x6D, 0x39, 0x6F, 0xCA,
+ 0x08, 0xDE, 0x60, 0x7F, 0x47, 0xE8, 0x9D, 0xC2, 0x9E, 0x5F, 0x81, 0x9C, 0xAA, 0xB7, 0x46, 0x0A,
+ 0xAC, 0xA0, 0xFD, 0x22, 0x59, 0xE6, 0xCB, 0x78, 0xF6, 0x37, 0x7A, 0xD8, 0x6C, 0x8D, 0x61, 0xF1,
+ 0x10, 0xE9, 0x60, 0x74, 0x4C, 0x43, 0xB0, 0x4B, 0x3C, 0x0A, 0x77, 0x6A, 0xF3, 0xF5, 0xAE, 0x16,
+ 0x1C, 0xBB, 0x75, 0xDB, 0x81, 0x97, 0xA2, 0xDA, 0x6A, 0x8C, 0xE4, 0xBA, 0xB4, 0xBE, 0x6C, 0xAD,
+ 0x24, 0x18, 0x37, 0x3F, 0x05, 0x8A, 0x96, 0x9C, 0x75, 0xD0, 0x97, 0xC5, 0x3B, 0xDB, 0x23, 0xBF,
+ 0x62, 0x76, 0xC8, 0xD3, 0xFD, 0x09, 0x57, 0xD7, 0x8B, 0x85, 0x1B, 0x9F, 0x65, 0x79, 0x83, 0x16,
+ 0x10, 0x92, 0xE4, 0x10, 0xB3, 0x65, 0xED, 0x7B, 0x42, 0x3B, 0xC6, 0x05, 0x03, 0xF7, 0xFE, 0xEE,
+ 0x4B, 0x1E, 0x87, 0x05, 0x65, 0x4E, 0x00, 0xE2, 0x30, 0x67, 0x0A, 0xDB, 0xAB, 0x57, 0x04, 0xB6,
+ 0x19, 0x39, 0x24, 0xFA, 0x7F, 0xB8, 0xD9, 0x08, 0x64, 0x38, 0xFA, 0x16, 0xE1, 0xF2, 0x19, 0xB2,
+ 0x12, 0xBB, 0x5F, 0xDB, 0xEE, 0x81, 0xDA, 0x96, 0x41, 0x88, 0xE0, 0x9B, 0x41, 0x27, 0x2C, 0x9B,
+ 0xB8, 0x27, 0x41, 0x72, 0xC1, 0xE5, 0xD9, 0xE7, 0x8D, 0x1F, 0x94, 0xF9, 0xCD, 0x0F, 0x68, 0x0D,
+ 0xD3, 0x24, 0x6B, 0xBB, 0xD5, 0x65, 0x71, 0x8B, 0xE9, 0x10, 0x4F, 0xED, 0x59, 0xCD, 0xEF, 0x1D,
+ 0x0E, 0xA7, 0x70, 0xB5, 0x1C, 0x62, 0xE5, 0x05, 0x88, 0x0C, 0xF3, 0x26, 0x5D, 0xD8, 0x78, 0xA1,
+ 0xF9, 0x79, 0x06, 0x9C, 0x7A, 0x5A, 0xEA, 0x30, 0xCA, 0x16, 0x0F, 0x4E, 0xBE, 0x5F, 0x97, 0x58,
+ 0xAA, 0x3F, 0x9B, 0xB0, 0x32, 0xBE, 0xC8, 0x2C, 0x32, 0x70, 0xA1, 0xC3, 0xD9, 0x4A, 0xEB, 0x00,
+ 0xAF, 0xB2, 0x4E, 0x57, 0x7A, 0x2E, 0xE9, 0x68, 0xBD, 0x27, 0x09, 0x91, 0xD6, 0xDC, 0xB5, 0x01,
+ 0x5C, 0x6D, 0x1F, 0x98, 0x7C, 0x2E, 0x73, 0x41, 0x8A, 0x09, 0x1D, 0x00, 0xE6, 0x5A, 0x9C, 0x4A,
+ 0x6C, 0xEF, 0x59, 0x75, 0x30, 0x70, 0x4C, 0xCF, 0xF1, 0x7F, 0x7B, 0x3F, 0xFA, 0x01, 0x0F, 0xED,
+ 0x29, 0x31, 0x5A, 0x5E, 0x62, 0x0D, 0x37, 0x52, 0xAB, 0x92, 0x04, 0x28, 0xA6, 0xA8, 0x88, 0x63,
+ 0x24, 0x0A, 0x38, 0x7F, 0x32, 0xCF, 0xC5, 0xC6, 0xC0, 0x7C, 0x00, 0x77, 0x6C, 0x4F, 0x36, 0x82,
+ 0xEF, 0x69, 0xF0, 0xEB, 0xCC, 0x8C, 0x6D, 0x08, 0xFF, 0xCB, 0x03, 0x29, 0x8B, 0xEF, 0x0F, 0x45,
+ 0x81, 0xA3, 0xDF, 0x22, 0xEE, 0xB4, 0x72, 0x53, 0x20, 0xDC, 0x19, 0x6F, 0x21, 0xEA, 0xF1, 0xF1,
+ 0x51, 0x98, 0x3C, 0xA8, 0x48, 0x2E, 0x4C, 0xF9, 0xEB, 0x10, 0x71, 0xFA, 0xF8, 0x87, 0x64, 0xE1,
+ 0xBB, 0xAD, 0xD8, 0x12, 0xE2, 0x8A, 0x1E, 0xFE, 0x48, 0x1C, 0x0C, 0xA6, 0x3D, 0xBD, 0x33, 0x54,
+ 0x8E, 0xD9, 0x88, 0x53, 0x55, 0x0D, 0x55, 0x62, 0x4F, 0x2D, 0x36, 0xE6, 0xDF, 0x7C, 0x0F, 0xAE,
+ 0x0E, 0x78, 0x11, 0xA3, 0x70, 0x65, 0x41, 0xE8, 0x91, 0x36, 0xEE, 0xB6, 0xDD, 0xAB, 0xBA, 0x1F,
+ 0x0D, 0x06, 0x48, 0x1F, 0xE0, 0x4C, 0x12, 0xF6, 0xD2, 0x37, 0xC0, 0xBD, 0x5D, 0x34, 0x25, 0xE2,
+ 0xAB, 0x93, 0x4B, 0xD6, 0x17, 0x7B, 0x95, 0xD9, 0x2B, 0xFE, 0x60, 0xB0, 0x32, 0xCD, 0x5F, 0x0F,
+ 0x0B, 0x81, 0x58, 0xBC, 0x95, 0x9C, 0x4B, 0x81, 0xBF, 0xD2, 0xA0, 0x64, 0xDB, 0xE8, 0xE0, 0x6A,
+ 0x49, 0xFB, 0xC4, 0x99, 0x59, 0x2F, 0x2B, 0xED, 0x21, 0x8D, 0xD7, 0xA7, 0x56, 0x04, 0x67, 0xC6,
+ 0x0C, 0x89, 0x58, 0x12, 0x5A, 0x5C, 0x27, 0x62, 0x79, 0x0C, 0x5E, 0xC3, 0xCC, 0x99, 0x5A, 0xCF,
+ 0x71, 0x99, 0x75, 0x2E, 0xBA, 0x1C, 0x28, 0xAA, 0x64, 0x62, 0x17, 0xF9, 0xCD, 0x38, 0x1A, 0x0B,
+ 0xE3, 0xF7, 0xF7, 0x98, 0x4F, 0x0D, 0xB5, 0xF0, 0x03, 0x37, 0x68, 0x5F, 0x3D, 0xE8, 0x13, 0x01,
+ 0xE2, 0x36, 0xF9, 0xB6, 0x25, 0x41, 0xDE, 0x4C, 0x53, 0xD2, 0xD5, 0xB1, 0xA1, 0x77, 0x1B, 0x9D,
+ 0x3A, 0x67, 0x93, 0xCB, 0x00, 0xB9, 0xA0, 0x50, 0x56, 0x00, 0xFF, 0xA6, 0xCC, 0x17, 0x5A, 0x4A,
+ 0x5C, 0x98, 0xFA, 0x98, 0x1E, 0x12, 0x60, 0x50, 0x4B, 0xA9, 0x91, 0x7E, 0x25, 0x9C, 0x30, 0x91,
+ 0xA9, 0x39, 0x22, 0xC3, 0xF8, 0x6D, 0xDC, 0xC7, 0xE7, 0x09, 0x4A, 0x56, 0xCA, 0xD8, 0x3B, 0x4F,
+ 0x4D, 0x2F, 0xC2, 0x2B, 0x93, 0x32, 0xE5, 0x47, 0xEC, 0x14, 0x03, 0xC8, 0xB7, 0xE2, 0xA0, 0x84,
+ 0xF7, 0x99, 0x51, 0x86, 0x68, 0x08, 0x98, 0x02, 0x41, 0x29, 0x07, 0x56, 0x55, 0xE6, 0x6C, 0x74,
+ 0xC5, 0x61, 0x7B, 0xDB, 0x33, 0x01, 0xF8, 0xF0, 0xA9, 0x18, 0xFE, 0xC5, 0x35, 0x8C, 0xB2, 0x80,
+ 0xDA, 0xD0, 0x84, 0x8A, 0xFC, 0x4C, 0x3C, 0x3A, 0x1F, 0x71, 0xF4, 0x46, 0x63, 0x60, 0x13, 0xF4,
+ 0x1D, 0x82, 0xD7, 0xB0, 0x48, 0x4F, 0x2E, 0x79, 0xF7, 0xEC, 0x06, 0x12, 0x7A, 0xD2, 0x94, 0x74,
+ 0x91, 0xC9, 0x68, 0x8A, 0xF0, 0x63, 0xD9, 0x18, 0x3C, 0x8B, 0x54, 0x94, 0x12, 0x4F, 0xFE, 0x9F,
+ 0x9D, 0x12, 0xFA, 0xAD, 0xEE, 0xD1, 0xFD, 0x56, 0x31, 0x17, 0x5A, 0xC3, 0x09, 0xC1, 0x35, 0x53,
+ 0x41, 0xEF, 0xF9, 0x9B, 0x7E, 0xBE, 0xFC, 0xA8, 0x96, 0x6E, 0x8D, 0xFD, 0xB8, 0x42, 0xC3, 0xA7,
+ 0x78, 0xCB, 0xF9, 0x9B, 0xFB, 0x01, 0xCB, 0x9F, 0xA4, 0xA2, 0x0C, 0x80, 0xB7, 0x4D, 0x01, 0x50,
+ 0x2F, 0xD3, 0xC1, 0xD5, 0x4B, 0x01, 0xEE, 0xDF, 0x08, 0x6A, 0xB2, 0xC6, 0x08, 0x49, 0x71, 0x89,
+ 0xB3, 0xF0, 0xC1, 0x50, 0x74, 0xAC, 0xFE, 0x7E, 0x82, 0xE7, 0xA6, 0x10, 0xF2, 0x0C, 0x5A, 0xEC,
+ 0xC2, 0xE8, 0x55, 0x40, 0xB0, 0x1E, 0x7F, 0x95, 0xF7, 0x39, 0x1C, 0xA7, 0xEC, 0xEB, 0x81, 0xF4,
+ 0xCB, 0x82, 0x1D, 0x94, 0x8C, 0xBF, 0xDA, 0xB7, 0x65, 0x51, 0x05, 0x22, 0x92, 0x3C, 0x7A, 0x38,
+ 0xB1, 0xBB, 0x14, 0xAF, 0xB1, 0xFF, 0x8A, 0x98, 0x24, 0x1B, 0xE0, 0x51, 0x0B, 0x72, 0xD1, 0x2E,
+ 0x97, 0xE0, 0x4D, 0xA2, 0xFF, 0x0F, 0x30, 0xAC, 0x7A, 0xD2, 0x88, 0x6C, 0xB4, 0xCE, 0x67, 0xC2,
+ 0xF7, 0x18, 0x91, 0x1E, 0x1C, 0xF4, 0xFA, 0x0D, 0xDC, 0x42, 0x3B, 0xA4, 0xB8, 0x48, 0xF3, 0x98,
+ 0x94, 0x5C, 0x57, 0x98, 0xA9, 0x71, 0x14, 0x5B, 0x79, 0xCF, 0x33, 0xAA, 0xE1, 0x19, 0x49, 0xFC,
+ 0x2E, 0x66, 0x2C, 0x6C, 0xEB, 0xB8, 0x71, 0x3B, 0x9C, 0x19, 0x14, 0x5C, 0x95, 0xDB, 0x7D, 0x47,
+ 0xB8, 0x54, 0x14, 0xC9, 0xA8, 0x38, 0xA3, 0x3A, 0xF8, 0x40, 0xD6, 0x4F, 0x3E, 0x52, 0x48, 0x66,
+ 0xED, 0xE9, 0xB8, 0xB7, 0x03, 0x0E, 0x4B, 0x8F, 0x84, 0xDF, 0xA3, 0xE4, 0x7A, 0x97, 0xA6, 0xB8,
+ 0x9C, 0x97, 0xBF, 0x70, 0xDA, 0xAC, 0x71, 0x01, 0xAA, 0xDE, 0x0E, 0xFB, 0xFA, 0xF1, 0xCF, 0x0D,
+ 0x9C, 0x93, 0xEB, 0xE4, 0xF4, 0xAF, 0xB6, 0x1D, 0x10, 0xB0, 0x0C, 0xDB, 0x80, 0xF2, 0x9A, 0x8C,
+ 0xB5, 0x5F, 0x2C, 0xB1, 0x67, 0xE9, 0x3A, 0xD7, 0xE4, 0xCF, 0x20, 0xE7, 0x06, 0x86, 0xFA, 0x23,
+ 0x8E, 0xBF, 0x85, 0x45, 0x2A, 0x4B, 0x53, 0x45, 0xF1, 0xA2, 0x6C, 0x2A, 0x4F, 0x4D, 0x67, 0xED,
+ 0x78, 0x15, 0x06, 0x43, 0x94, 0x44, 0xFB, 0x1C, 0xD5, 0xDB, 0x88, 0x95, 0xD5, 0x53, 0x90, 0xBD,
+ 0xF8, 0x7A, 0xD8, 0xED, 0xE0, 0x3E, 0x86, 0xC9, 0x9D, 0xFC, 0xA7, 0x29, 0x94, 0x82, 0xC3, 0x71,
+ 0xB4, 0xE7, 0x77, 0x35, 0x48, 0x7A, 0xA0, 0x79, 0x8A, 0x68, 0x7F, 0xA2, 0xDF, 0xDA, 0x34, 0x4D,
+ 0x72, 0xD2, 0xB3, 0x51, 0xA6, 0x64, 0x84, 0xF5, 0x01, 0x74, 0x87, 0x57, 0xA3, 0x3F, 0x25, 0x28,
+ 0xAA, 0x88, 0x75, 0xFC, 0xE6, 0x79, 0x62, 0xBF, 0xF8, 0xD7, 0xBE, 0x22, 0x13, 0xD2, 0xAD, 0x08,
+ 0x7D, 0x15, 0xF3, 0x9D, 0x74, 0xB6, 0x49, 0x53, 0xE7, 0x4C, 0xE9, 0x57, 0x80, 0x5A, 0x8F, 0x5D,
+ 0x75, 0xDE, 0x04, 0x59, 0x0B, 0x8C, 0xC6, 0x1B, 0x7A, 0xFC, 0xF0, 0x42, 0xC2, 0x6A, 0x17, 0x3A,
+ 0x19, 0x92, 0x66, 0xE3, 0x04, 0x28, 0x85, 0x02, 0xA3, 0x2F, 0xA8, 0x3D, 0x92, 0x9F, 0xD4, 0xDF,
+ 0x24, 0x57, 0xF9, 0x61, 0x10, 0xD6, 0x6B, 0x32, 0x5F, 0x7F, 0xC6, 0xDD, 0x58, 0x4D, 0x83, 0xF9,
+ 0x27, 0x0E, 0xF9, 0x6D, 0x4F, 0x30, 0x32, 0x12, 0x5A, 0xC5, 0xEA, 0x83, 0x35, 0x14, 0x23, 0x58,
+ 0x66, 0x79, 0x5B, 0x44, 0x44, 0x9E, 0xBE, 0xBF, 0x2D, 0x02, 0x76, 0x4A, 0x59, 0x2A, 0x1F, 0xC8,
+ 0xF6, 0x84, 0xD1, 0x87, 0x55, 0xE5, 0x3D, 0xF2, 0xCC, 0x63, 0xE0, 0x47, 0x1F, 0x14, 0x00, 0x56,
+ 0xF1, 0xF1, 0x7B, 0x45, 0xD2, 0xE6, 0xC9, 0x38, 0x1C, 0xE1, 0x29, 0x3D, 0xF4, 0x1D, 0x2B, 0x3E,
+ 0x67, 0x9C, 0x67, 0xE4, 0x82, 0x40, 0x29, 0x55, 0xC4, 0x46, 0xBE, 0x6B, 0xA5, 0x2A, 0xDD, 0xFF,
+ 0xCA, 0xD0, 0xC9, 0x05, 0x03, 0xA0, 0x4F, 0x0D, 0xA0, 0xA5, 0x04, 0x26, 0x02, 0x92, 0x16, 0x5C,
+ 0x2D, 0x68, 0xDF, 0x06, 0x87, 0x79, 0x71, 0xA3, 0x40, 0xB5, 0xCC, 0x1E, 0x71, 0x3C, 0x7F, 0x16,
+ 0xFA, 0xA0, 0xA5, 0x58, 0xD9, 0x53, 0x93, 0x31, 0x03, 0x28, 0x0A, 0x94, 0x41, 0xC1, 0xEE, 0x61,
+ 0x47, 0xE0, 0x02, 0x8E, 0x39, 0xEF, 0x6D, 0xA9, 0xD3, 0x00, 0xA0, 0x30, 0x95, 0xF5, 0xFC, 0xBF,
+ 0xC7, 0x6B, 0x8A, 0x32, 0x16, 0x9E, 0x50, 0xB0, 0xEF, 0x0C, 0xF3, 0x55, 0x61, 0xD0, 0x21, 0xF7,
+ 0x6B, 0xA0, 0xB9, 0xC9, 0x69, 0xE7, 0x85, 0xF8, 0xE7, 0x69, 0xC4, 0xB5, 0x27, 0x01, 0x1B, 0xB1,
+ 0xAD, 0x09, 0x5A, 0xD0, 0x40, 0xC0, 0x1C, 0x34, 0x51, 0x23, 0x3F, 0xD2, 0xD4, 0x94, 0xBA, 0x42,
+ 0xA8, 0xC9, 0x4B, 0x84, 0x2B, 0x82, 0xDD, 0xDA, 0x22, 0x14, 0xE0, 0x24, 0x53, 0x12, 0xD0, 0x67,
+ 0x62, 0xC2, 0x4E, 0xF6, 0x7A, 0xBA, 0xCB, 0xF1, 0xF0, 0xE4, 0x51, 0x2A, 0xA5, 0x48, 0x4C, 0xC6,
+ 0xC2, 0x30, 0x00, 0xEC, 0xEE, 0xEB, 0xBC, 0xE9, 0x76, 0x4E, 0x23, 0xB1, 0xCE, 0x05, 0x40, 0x1F,
+ 0x2D, 0x0E, 0xEB, 0x84, 0x96, 0x38, 0x16, 0x5B, 0xCF, 0x4D, 0xFB, 0x1A, 0xB4, 0x74, 0x61, 0x7C,
+ 0x4D, 0x67, 0x95, 0x79, 0xB5, 0x81, 0x88, 0x32, 0xDA, 0x84, 0x9D, 0xC1, 0x53, 0x21, 0xDD, 0x0A,
+ 0xDE, 0x3C, 0xB3, 0xB5, 0xB8, 0x1A, 0xFC, 0x72, 0x7A, 0xB8, 0xEB, 0xC8, 0xF6, 0x7A, 0x00, 0xDD,
+ 0x2E, 0x7E, 0x52, 0x06, 0x66, 0x0C, 0xFF, 0x3F, 0x8B, 0x16, 0x4B, 0x1A, 0x9B, 0x3C, 0x17, 0x5B,
+ 0xD8, 0xCB, 0xA0, 0xCA, 0xF9, 0x41, 0x36, 0xD6, 0xA6, 0x08, 0x6D, 0xFC, 0xD3, 0x77, 0x14, 0x58,
+ 0xF1, 0xB5, 0x3E, 0x54, 0xDB, 0xAC, 0x03, 0xAC, 0x11, 0x5C, 0x4D, 0xC6, 0xB5, 0x03, 0x5A, 0xFF,
+ 0x52, 0xA8, 0xDF, 0xDC, 0x39, 0xF3, 0x6A, 0xC8, 0xB4, 0x23, 0x0B, 0x0B, 0x67, 0x1B, 0x02, 0xBA,
+ 0x79, 0x03, 0x16, 0xB2, 0xA9, 0xC3, 0xA1, 0x62, 0x6B, 0x96, 0x23, 0x14, 0x6D, 0x8F, 0x94, 0xF1,
+ 0xD2, 0xEA, 0x5B, 0x3A, 0x48, 0x79, 0x1E, 0x02, 0xCE, 0xE8, 0xF5, 0x2C, 0x6A, 0xB2, 0x08, 0x62,
+ 0xC6, 0x85, 0x09, 0x9E, 0x5A, 0xD0, 0xE5, 0x34, 0x75, 0x81, 0xF5, 0xA7, 0x55, 0x6A, 0x31, 0x6E,
+ 0x30, 0x08, 0x1B, 0xF9, 0xF1, 0x5A, 0x33, 0x36, 0x3C, 0x7D, 0xA9, 0xB5, 0x91, 0x80, 0x06, 0x34,
+ 0x57, 0xD7, 0xC5, 0xA8, 0x74, 0x0F, 0x01, 0x27, 0x4C, 0x82, 0x98, 0xC6, 0x6B, 0x4F, 0xC5, 0x7F,
+ 0xFF, 0xAC, 0x13, 0x4A, 0xDA, 0x73, 0x97, 0xBF, 0xEA, 0xA3, 0xF2, 0xBB, 0xE9, 0x51, 0x7D, 0x7E,
+ 0xE6, 0xE9, 0x15, 0x85, 0x1D, 0x72, 0x4A, 0xB8, 0xB7, 0x99, 0x3E, 0x9F, 0x71, 0x8F, 0x18, 0x56,
+ 0x9C, 0xBF, 0x45, 0x54, 0xB8, 0x14, 0x5C, 0x39, 0x7B, 0x93, 0xD8, 0x41, 0xA7, 0x00, 0x1B, 0x74,
+ 0x47, 0x29, 0x29, 0xB4, 0x42, 0xCF, 0x17, 0x69, 0x43, 0xB2, 0x2E, 0x38, 0x1E, 0x11, 0xA7, 0x97,
+ 0x6A, 0xB4, 0xB5, 0xDF, 0x40, 0xE6, 0x75, 0x5B, 0xC0, 0xF0, 0x80, 0xC6, 0xFF, 0x73, 0xD5, 0x45,
+ 0x03, 0x04, 0x83, 0x17, 0xF4, 0x62, 0xBE, 0xF6, 0x4D, 0x25, 0x84, 0xD6, 0xB2, 0xE3, 0x34, 0x49,
+ 0xDE, 0x3D, 0x67, 0xF8, 0x7A, 0x7F, 0xFB, 0xF9, 0xE5, 0x5E, 0xD1, 0x39, 0x8B, 0x9D, 0xFE, 0x7F,
+ 0xE3, 0x0B, 0x8B, 0x48, 0xA0, 0x9E, 0x15, 0x82, 0x57, 0xAF, 0xBA, 0xFE, 0x65, 0xFE, 0x07, 0x7A,
+ 0x3B, 0x46, 0xDE, 0x94, 0x7B, 0x69, 0x9C, 0xB0, 0x48, 0x68, 0x14, 0x45, 0xF6, 0x85, 0xBB, 0x95,
+ 0x94, 0x5E, 0x2D, 0x6C, 0x38, 0x2C, 0xF8, 0x65, 0x13, 0x88, 0xA7, 0xEA, 0x05, 0xE7, 0x25, 0xAF,
+ 0x13, 0xC8, 0x0F, 0xA3, 0xDB, 0x1E, 0x58, 0x28, 0x95, 0xBD, 0x34, 0x50, 0x06, 0xEF, 0xBB, 0xC9,
+ 0x93, 0xA3, 0xD4, 0x2D, 0x4F, 0x07, 0x4F, 0x1D, 0xB8, 0xAF, 0x42, 0x59, 0x34, 0x8A, 0x33, 0xB0,
+ 0xD5, 0x4E, 0x55, 0x79, 0x0E, 0x53, 0xCD, 0xA4, 0xE0, 0x96, 0x23, 0x8B, 0x1A, 0x04, 0xB0, 0x48,
+ 0x82, 0xE8, 0xEC, 0xA8, 0xB8, 0x52, 0xAF, 0xD0, 0xFB, 0xD1, 0xF1, 0xD0, 0x50, 0xFC, 0x7B, 0x27,
+ 0x38, 0xFC, 0x7A, 0xDE, 0x83, 0x50, 0x7E, 0xD3, 0xE6, 0xF5, 0x45, 0x76, 0xC5, 0x2D, 0x50, 0xB4,
+ 0x69, 0xF5, 0x10, 0x91, 0xBD, 0x18, 0xB1, 0x49, 0xE4, 0x6A, 0x17, 0x45, 0xB1, 0xF1, 0x20, 0xC7,
+ 0xE0, 0xC2, 0x02, 0x2D, 0x3C, 0x91, 0x16, 0x26, 0x25, 0xDE, 0x49, 0x88, 0xB3, 0xD7, 0x91, 0x7D,
+ 0x21, 0xC1, 0x08, 0xDC, 0xEF, 0x52, 0x15, 0xD8, 0xE5, 0x3B, 0x58, 0xC6, 0xD9, 0x97, 0x0E, 0x7E,
+ 0xD8, 0x94, 0x4F, 0xCE, 0xCA, 0xD7, 0xC7, 0x3C, 0xEF, 0xD1, 0x34, 0x3D, 0x78, 0xB6, 0x67, 0xA7,
+ 0x6A, 0x13, 0x9D, 0x1E, 0x0A, 0x50, 0x67, 0xA0, 0xBF, 0x88, 0xAA, 0x34, 0xB4, 0xAA, 0x47, 0x71,
+ 0x48, 0x78, 0x34, 0x42, 0xC8, 0x13, 0x1A, 0x96, 0x3E, 0x29, 0xF9, 0x9B, 0xD3, 0x87, 0xC0, 0x64,
+ 0xD6, 0x5C, 0x76, 0xBF, 0xD4, 0xF2, 0x85, 0xE7, 0xB6, 0x64, 0x68, 0x47, 0x54, 0xE8, 0x1C, 0x3A,
+ 0x06, 0x06, 0x83, 0xE6, 0xF2, 0x43, 0x53, 0x2A, 0x8F, 0xFE, 0x8C, 0x04, 0xB0, 0xAB, 0x70, 0xE0,
+ 0xC7, 0xE3, 0x72, 0x4E, 0xB8, 0x2E, 0xA5, 0x8F, 0x1E, 0xDB, 0x80, 0xE6, 0x46, 0xDD, 0xE5, 0x55,
+ 0xAB, 0xBB, 0x1C, 0xB4, 0x98, 0xD3, 0x79, 0xAF, 0xBE, 0x10, 0x9E, 0xB1, 0x33, 0x47, 0xDE, 0xF3,
+ 0x46, 0x10, 0xAB, 0xBB, 0xF1, 0xDD, 0x24, 0x4E, 0x91, 0xBF, 0x6E, 0xDD, 0xE5, 0x88, 0x46, 0xDB,
+ 0x44, 0x07, 0x69, 0x38, 0x2A, 0x8D, 0x48, 0xEE, 0xF3, 0xF0, 0xBE, 0xEE, 0xA4, 0x67, 0x07, 0x25,
+ 0x4D, 0x39, 0x76, 0x74, 0x17, 0xBB, 0x59, 0xA7, 0x99, 0x49, 0xE7, 0x22, 0x73, 0xCD, 0x83, 0x4E,
+ 0xA5, 0xDD, 0x65, 0xB7, 0x36, 0x3D, 0xDF, 0x77, 0xF9, 0xB2, 0x5C, 0xD8, 0xC7, 0x0C, 0xCF, 0x7C,
+ 0x33, 0x7E, 0x28, 0x32, 0xDD, 0xAB, 0x5C, 0x27, 0x80, 0x54, 0x4C, 0xCF, 0xF4, 0x92, 0xD5, 0xFC,
+ 0x28, 0x15, 0x91, 0x7B, 0x77, 0x28, 0x0E, 0x85, 0x63, 0xE2, 0x38, 0x6C, 0x10, 0xAE, 0x55, 0xB1,
+ 0x76, 0x69, 0xCA, 0x0E, 0x1E, 0x86, 0x76, 0x6B, 0x40, 0xC3, 0xA9, 0xD5, 0xDC, 0xB3, 0x2E, 0xBE,
+ 0x1F, 0xE9, 0x3A, 0x2C, 0xB8, 0x0B, 0xEC, 0xB4, 0xCA, 0x9E, 0x47, 0xCD, 0x0D, 0x49, 0xC3, 0xB9,
+ 0x28, 0xD9, 0xBF, 0xCD, 0xB9, 0xFA, 0x66, 0xC5, 0x89, 0xD3, 0xDF, 0x04, 0xC1, 0x06, 0x31, 0xAF,
+ 0xA4, 0xBC, 0xEE, 0xEB, 0x33, 0xF6, 0x2B, 0x8B, 0xCB, 0xC4, 0x51, 0x84, 0x8D, 0x94, 0xFD, 0xDC,
+ 0xA8, 0xBC, 0x23, 0xDE, 0x48, 0xF1, 0xE6, 0x20, 0x20, 0x6E, 0x88, 0x6C, 0x69, 0xA0, 0x3D, 0x3B,
+ 0x7F, 0xE1, 0x35, 0x16, 0x79, 0x23, 0x8E, 0x23, 0xED, 0x54, 0x7A, 0x1C, 0x90, 0x6C, 0x35, 0xD9,
+ 0x31, 0xD6, 0x9B, 0xE6, 0x18, 0x41, 0x07, 0x4C, 0x0A, 0xDC, 0x57, 0x8F, 0xEB, 0x04, 0xA2, 0xB9,
+ 0xDD, 0xC1, 0xBD, 0xEF, 0xD2, 0x51, 0x3D, 0x9D, 0x8B, 0x3F, 0xEC, 0x34, 0xF3, 0x0D, 0xB3, 0xAD,
+ 0xBC, 0xAD, 0x62, 0xAA, 0x02, 0xF8, 0x7C, 0x21, 0xD9, 0x8F, 0x65, 0x08, 0xA1, 0x0E, 0x5F, 0x5D,
+ 0xA5, 0x24, 0x5E, 0xF4, 0x9C, 0x8A, 0x24, 0xA8, 0xF7, 0xF6, 0x0A, 0xAD, 0x28, 0xAE, 0x21, 0x50,
+ 0xA2, 0x2B, 0x1B, 0x6C, 0xAF, 0xDC, 0x63, 0xC4, 0x88, 0x54, 0xB6, 0x77, 0xE0, 0xC5, 0x27, 0xD6,
+ 0xF3, 0x92, 0xE1, 0x81, 0x19, 0x99, 0x0E, 0x83, 0x3A, 0x17, 0x10, 0xF2, 0xB5, 0x74, 0x95, 0xB2,
+ 0x87, 0x98, 0xBC, 0x75, 0xFA, 0x54, 0x2C, 0x8B, 0x26, 0xAD, 0xE9, 0xA7, 0xCA, 0x28, 0x89, 0xB9,
+ 0x77, 0x5B, 0xF7, 0xC2, 0x75, 0x42, 0x73, 0x76, 0x83, 0xCA, 0x26, 0xF5, 0xB9, 0x70, 0x23, 0x6F,
+ 0x5F, 0x35, 0x91, 0xCE, 0x6A, 0x5D, 0x57, 0xB8, 0xE0, 0x3C, 0x91, 0x6F, 0xC4, 0xB7, 0x30, 0x6F,
+ 0xDD, 0xBD, 0xD7, 0x5F, 0x1A, 0xD2, 0xE4, 0xE7, 0x0D, 0x2B, 0x02, 0x2F, 0x61, 0x9E, 0x22, 0x4C,
+ 0xFE, 0xBD, 0x1A, 0xDD, 0xE5, 0x67, 0xA2, 0x6F, 0x90, 0x4C, 0x31, 0x5E, 0x6A, 0x9F, 0x8E, 0xE8,
+ 0xC1, 0xB2, 0x4E, 0xE4, 0xCA, 0x2B, 0xB8, 0x4A, 0xE8, 0xFF, 0x06, 0x91, 0x76, 0x2E, 0x51, 0x3F,
+ 0x1B, 0xA5, 0x2A, 0x1C, 0xEB, 0xD4, 0x07, 0x00, 0x03, 0x40, 0x33, 0x6A, 0xD8, 0xB7, 0x5A, 0xF0,
+ 0xF8, 0xF7, 0xCD, 0xCB, 0x3D, 0xB8, 0x98, 0xB4, 0x56, 0xE9, 0x20, 0xCC, 0x45, 0x0F, 0xA3, 0x76,
+ 0xB1, 0x2D, 0x41, 0x9A, 0x89, 0x24, 0x7C, 0xAC, 0x62, 0xCC, 0xCF, 0xE5, 0xA1, 0xEB, 0x7E, 0x41,
+ 0x64, 0x7D, 0x6D, 0xF1, 0x05, 0xC2, 0x65, 0xE9, 0xF8, 0xE8, 0xDB, 0xA0, 0xB8, 0x1A, 0x87, 0x32,
+ 0x9C, 0xF7, 0x48, 0xA4, 0x83, 0x66, 0x12, 0xAC, 0x9D, 0x9D, 0xE4, 0x7B, 0xF4, 0x7A, 0x2B, 0x28,
+ 0xB7, 0x12, 0x3B, 0xAC, 0x7D, 0xF4, 0xB6, 0x72, 0x87, 0x4C, 0xFC, 0x5F, 0x75, 0x4C, 0xE5, 0xE1,
+ 0x6D, 0x10, 0xF8, 0xD5, 0xA2, 0x3F, 0x04, 0xB2, 0x33, 0x6A, 0x0A, 0x3C, 0x45, 0x95, 0x77, 0x5F,
+ 0x20, 0x9E, 0x78, 0x91, 0xEB, 0x72, 0x6B, 0x90, 0x78, 0x9C, 0x5D, 0x47, 0xE4, 0x9A, 0xC5, 0x10,
+ 0xB8, 0xE1, 0x1D, 0x5A, 0x7D, 0xF3, 0x55, 0x8F, 0x66, 0x54, 0x1D, 0x97, 0x05, 0x3F, 0xFC, 0xDA,
+ 0x29, 0x04, 0x57, 0x3F, 0xD0, 0x52, 0x12, 0x3C, 0xBA, 0xF5, 0x52, 0x02, 0xE6, 0x37, 0x3A, 0xF9,
+ 0xAD, 0xB7, 0x2F, 0x81, 0x8D, 0x14, 0xCC, 0x1C, 0x8C, 0x3A, 0x9D, 0x54, 0x5D, 0x75, 0xEC, 0x15,
+ 0x29, 0xB4, 0xCE, 0x44, 0xDA, 0x71, 0x8B, 0xD1, 0xB6, 0x77, 0x08, 0x2E, 0x80, 0x43, 0x57, 0xF5,
+ 0x94, 0x37, 0xFC, 0x11, 0x1C, 0x75, 0x62, 0xA1, 0x17, 0xB2, 0x5E, 0x54, 0xA6, 0xBD, 0xAF, 0x0B,
+ 0xB4, 0x38, 0x77, 0xE8, 0x08, 0xC7, 0x93, 0xDD, 0x96, 0x83, 0x91, 0x1D, 0x4B, 0x5F, 0xE5, 0xB3,
+ 0xC8, 0x28, 0xA9, 0x51, 0x5D, 0xCB, 0xCE, 0x6F, 0x7E, 0xCF, 0xBE, 0x4D, 0x5D, 0x46, 0xB0, 0x02,
+ 0xFA, 0xAF, 0x6E, 0x0A, 0x5B, 0xA4, 0x6D, 0x35, 0xEB, 0x78, 0x31, 0xB3, 0x36, 0x05, 0xD2, 0x84,
+ 0xBD, 0xB7, 0x38, 0x47, 0xCA, 0x47, 0x07, 0xA5, 0x9B, 0x67, 0x45, 0x3E, 0x10, 0x82, 0x05, 0xE7,
+ 0x7B, 0x80, 0xA9, 0x55, 0x34, 0x44, 0x6A, 0xC7, 0x84, 0x24, 0x4F, 0xAA, 0xD5, 0x7D, 0x78, 0xF7,
+ 0x16, 0x43, 0xC1, 0xD5, 0x20, 0x83, 0xD7, 0xB0, 0x51, 0x14, 0xC6, 0xF4, 0xD5, 0xCB, 0x62, 0xDE,
+ 0xE4, 0xAD, 0x47, 0xB5, 0xE5, 0x57, 0xCA, 0x9D, 0x76, 0x10, 0x35, 0xDE, 0x8F, 0xDA, 0x2B, 0x0A,
+ 0xF8, 0x65, 0x90, 0xDB, 0xF5, 0x3D, 0x2E, 0xDE, 0x1F, 0xF5, 0x6C, 0xF4, 0x2B, 0x2E, 0x18, 0x1C,
+ 0xD5, 0x97, 0xC2, 0xDE, 0xC2, 0xD8, 0xE1, 0x79, 0x43, 0xC8, 0xFC, 0x9A, 0x2A, 0xF3, 0x14, 0x28,
+ 0x0E, 0xB6, 0x08, 0xE1, 0xE8, 0xF1, 0x76, 0xB9, 0xA5, 0x57, 0x5C, 0x81, 0x19, 0x27, 0xA5, 0x80,
+ 0x16, 0x0A, 0x5E, 0xDC, 0xCC, 0xE1, 0xBD, 0x8B, 0xC5, 0xEC, 0x07, 0xFF, 0x53, 0x3B, 0xB1, 0x1D,
+ 0xAD, 0x02, 0xAB, 0xB6, 0x04, 0x7B, 0xA1, 0x2E, 0x3F, 0x07, 0x19, 0xD5, 0x82, 0xDA, 0x77, 0x22,
+ 0x80, 0x31, 0x20, 0xDA, 0x83, 0xDB, 0x56, 0x22, 0x88, 0x89, 0x44, 0x53, 0x87, 0x67, 0xAE, 0x30,
+ 0x50, 0x4C, 0xD0, 0x90, 0x8B, 0x45, 0x23, 0xCE, 0x41, 0x39, 0x03, 0xDE, 0xE6, 0xD3, 0xFC, 0x28,
+ 0x19, 0x3E, 0x0B, 0xD2, 0x2E, 0x96, 0xAC, 0x8D, 0xD0, 0x8E, 0x29, 0x48, 0x58, 0xA2, 0xD4, 0x17,
+ 0x65, 0x4B, 0x75, 0x4C, 0x48, 0x43, 0x34, 0x43, 0x3A, 0xDD, 0xCE, 0xC5, 0xF0, 0xF4, 0x6C, 0xB8,
+ 0xDD, 0xF3, 0x3E, 0x34, 0x50, 0x2A, 0x8C, 0x6C, 0x90, 0x96, 0x1E, 0x21, 0x61, 0x13, 0x42, 0xA5,
+ 0x12, 0x0F, 0x73, 0x02, 0xBA, 0x9E, 0xFF, 0x47, 0x83, 0xDB, 0xE4, 0x16, 0x90, 0xD9, 0x0A, 0x40,
+ 0x84, 0xCA, 0xD2, 0x03, 0x05, 0xD8, 0x64, 0xB2, 0x3D, 0x8A, 0x42, 0x02, 0x8C, 0x88, 0xDF, 0xEE,
+ 0x5A, 0x47, 0xF1, 0xF4, 0x82, 0x6E, 0x61, 0xD5, 0xF5, 0xA3, 0x58, 0x21, 0x6B, 0xEE, 0x8F, 0xE2,
+ 0xEB, 0x07, 0x39, 0xA9, 0x71, 0xFC, 0x55, 0x39, 0x37, 0x4D, 0xD2, 0x41, 0xC5, 0x33, 0xF7, 0xF5,
+ 0xED, 0x67, 0xA7, 0x42, 0xAD, 0x61, 0xEC, 0xE2, 0x9D, 0xB9, 0x13, 0x4B, 0xF5, 0x14, 0xB0, 0xE1,
+ 0x47, 0x06, 0x2B, 0x65, 0xCD, 0x09, 0x31, 0x46, 0x47, 0xFE, 0x1B, 0xB5, 0xD8, 0x53, 0x04, 0x28,
+ 0x5C, 0x3F, 0x46, 0x28, 0xCD, 0xB9, 0x87, 0x9A, 0xB0, 0xE2, 0x49, 0xA6, 0xCF, 0x56, 0x8D, 0x52,
+ 0xD5, 0x05, 0xCD, 0x0C, 0x3D, 0x45, 0x11, 0x18, 0x84, 0x38, 0x98, 0xD4, 0xD3, 0x2D, 0xD0, 0x2A,
+ 0xAD, 0xF4, 0x7A, 0xAB, 0xBF, 0xF4, 0xA8, 0x9F, 0x7A, 0xB7, 0x73, 0xC0, 0xEC, 0xF5, 0x3E, 0x87,
+ 0x9F, 0x12, 0xEF, 0xB8, 0xAC, 0x19, 0x34, 0xB9, 0x72, 0xB9, 0x6B, 0xF3, 0xBB, 0x08, 0x8E, 0x7F,
+ 0xEC, 0x24, 0x1A, 0xF4, 0x00, 0xC0, 0xD4, 0x27, 0xB1, 0x3B, 0x05, 0x68, 0xD4, 0x30, 0xD2, 0x21,
+ 0x63, 0xD8, 0x33, 0x6C, 0xDC, 0xA9, 0x3E, 0x7C, 0xA4, 0xE0, 0x43, 0xC9, 0x80, 0xA3, 0xCA, 0x35,
+ 0x72, 0x10, 0xF1, 0xEA, 0xCD, 0xA2, 0xDB, 0x02, 0x5A, 0xEE, 0x52, 0x5E, 0x31, 0x33, 0x2C, 0x68,
+ 0x3A, 0xBE, 0x34, 0x5E, 0xCE, 0xF2, 0x23, 0xE7, 0x4D, 0xCF, 0x71, 0xD4, 0x3E, 0x8C, 0x4E, 0x08,
+ 0x82, 0xF5, 0x01, 0xE9, 0xF8, 0x35, 0xFC, 0x88, 0xFE, 0xC1, 0x1E, 0x67, 0x95, 0x44, 0x45, 0xF8,
+ 0x67, 0xB8, 0x91, 0xF0, 0x8E, 0x6C, 0xE4, 0x57, 0xA6, 0xDB, 0x56, 0xE3, 0x6C, 0x18, 0x37, 0x0C,
+ 0x48, 0x49, 0xB5, 0x7E, 0x51, 0x7A, 0x46, 0x0E, 0xD4, 0x8E, 0x2B, 0x93, 0x63, 0x6B, 0xEC, 0xE5,
+ 0x5B, 0x72, 0x49, 0xB2, 0x3D, 0x24, 0xAA, 0x59, 0xAF, 0x1B, 0x0A, 0x82, 0xE8, 0x56, 0xC1, 0x56,
+ 0x46, 0x9F, 0xB2, 0x5B, 0x8D, 0x4E, 0x45, 0x34, 0x49, 0xE6, 0xDA, 0xEF, 0x43, 0x53, 0x11, 0x41,
+ 0x12, 0x82, 0xB9, 0xA8, 0xCC, 0x95, 0x8E, 0x5F, 0xD3, 0xB9, 0xA0, 0x53, 0xC5, 0x6E, 0x75, 0xC0,
+ 0x50, 0xF8, 0xC8, 0xA8, 0x19, 0xEE, 0x17, 0x6F, 0xD0, 0xB1, 0xA6, 0xD3, 0xC5, 0x39, 0x5E, 0x68,
+ 0xCA, 0x7D, 0x17, 0x17, 0x46, 0x83, 0xF3, 0x84, 0x05, 0x36, 0xB8, 0xE2, 0xD4, 0x20, 0xC0, 0x86,
+ 0xCE, 0xB3, 0xC2, 0x4D, 0xE8, 0xE8, 0x1A, 0x7E, 0x06, 0x1C, 0xE1, 0xA9, 0x55, 0xCB, 0x2A, 0x88,
+ 0xC5, 0x5A, 0xE1, 0x15, 0x74, 0x1E, 0x31, 0x0E, 0xCE, 0xA9, 0x7D, 0xA4, 0xCB, 0xF1, 0x7B, 0xCD,
+ 0x56, 0x54, 0xF2, 0xDC, 0xD7, 0xE8, 0x59, 0x5C, 0xC1, 0x47, 0x6D, 0xB5, 0x3A, 0xB7, 0x4F, 0x30,
+ 0x90, 0x10, 0x7F, 0xD7, 0x16, 0xC2, 0xD5, 0xA2, 0x36, 0x10, 0x1A, 0x71, 0x19, 0x4A, 0x6F, 0xFF,
+ 0x5E, 0x4E, 0xC1, 0x2B, 0xC1, 0x96, 0xE4, 0x2A, 0x2A, 0xEB, 0x60, 0x9C, 0x4B, 0x11, 0x97, 0xED,
+ 0xEA, 0x6E, 0x83, 0xA3, 0x8B, 0x17, 0xEB, 0x42, 0xC8, 0x18, 0x40, 0x61, 0xB0, 0x26, 0x72, 0xAC,
+ 0xA2, 0x49, 0xA4, 0x9C, 0xD1, 0x32, 0x8E, 0xCF, 0x80, 0x71, 0xF1, 0x20, 0x47, 0xA5, 0x28, 0xD4,
+ 0xC8, 0x1E, 0xF1, 0xB0, 0xD2, 0x15, 0x21, 0xBF, 0x9C, 0x57, 0x88, 0xED, 0x30, 0x6F, 0x69, 0x3A,
+ 0xB4, 0x14, 0x16, 0x98, 0x17, 0xC1, 0xC2, 0x36, 0x16, 0x54, 0x02, 0xB7, 0x42, 0x0C, 0x88, 0x45,
+ 0x5E, 0x90, 0x89, 0xD6, 0xE3, 0xDB, 0x0F, 0xF6, 0x07, 0xC8, 0x5B, 0x89, 0x8E, 0x24, 0xA0, 0x9D,
+ 0xB7, 0xC6, 0xEC, 0x7E, 0xDB, 0xC1, 0xAC, 0x38, 0xB3, 0x26, 0xD9, 0xFE, 0x8A, 0xC2, 0x76, 0xDD,
+ 0x01, 0x41, 0x30, 0x2D, 0x75, 0xDC, 0xE8, 0x60, 0x0B, 0xEF, 0xCC, 0xBA, 0x41, 0x85, 0xFC, 0x34,
+ 0x59, 0x4C, 0xA4, 0x13, 0x10, 0x7D, 0xF6, 0xE0, 0x00, 0x14, 0x86, 0x95, 0xF0, 0x00, 0x41, 0xDF,
+ 0xBD, 0xB5, 0x00, 0xDB, 0xDC, 0x8F, 0x5B, 0x75, 0xDE, 0x5F, 0x75, 0xFC, 0x11, 0x7A, 0xC0, 0x0D,
+ 0xA2, 0xDB, 0xB8, 0x53, 0x59, 0x0B, 0xFE, 0xAF, 0x45, 0xDD, 0xB7, 0x72, 0x87, 0x2C, 0x4B, 0x04,
+ 0xCE, 0xC3, 0x37, 0x54, 0x9D, 0x62, 0xC3, 0x6A, 0x4D, 0x71, 0xAB, 0xF4, 0x85, 0xA5, 0x89, 0xD1,
+ 0xC9, 0xFB, 0x8C, 0x23, 0x70, 0x36, 0x75, 0x74, 0x5A, 0x6C, 0xD4, 0x50, 0x5C, 0xD0, 0x49, 0xCC,
+ 0x9B, 0x27, 0x8C, 0x99, 0xC9, 0x55, 0x9C, 0x48, 0xD1, 0x40, 0x91, 0xD9, 0x1F, 0xA2, 0x4F, 0xBB,
+ 0x87, 0x42, 0xA5, 0xDA, 0xC5, 0xCB, 0x13, 0xA4, 0x9C, 0xFB, 0xD1, 0xD7, 0xB9, 0x90, 0xEF, 0xF5,
+ 0x03, 0x92, 0xCD, 0x7B, 0xF9, 0x76, 0xF4, 0xF8, 0x76, 0x2E, 0x99, 0x13, 0x33, 0x61, 0xE1, 0x72,
+ 0x92, 0x4A, 0x9E, 0x8F, 0x20, 0xCE, 0x37, 0xC7, 0x17, 0x0F, 0xFF, 0x25, 0xDF, 0x16, 0xD4, 0xAF,
+ 0xD2, 0x47, 0x65, 0x4E, 0x2B, 0x0E, 0xBE, 0x45, 0x58, 0x8D, 0xFA, 0x7D, 0x59, 0x9D, 0xAE, 0x4E,
+ 0x7D, 0x9F, 0x8B, 0x40, 0x5E, 0x1D, 0x0C, 0x23, 0xAE, 0xC9, 0xFD, 0x9E, 0x61, 0x38, 0xF8, 0x81,
+ 0xC5, 0x71, 0xD4, 0x6B, 0x24, 0xB6, 0x96, 0xDC, 0xC9, 0x1B, 0xD1, 0x7C, 0x84, 0xFD, 0x79, 0xEE,
+ 0x7B, 0x34, 0x82, 0xA9, 0x01, 0xB1, 0x76, 0x61, 0x65, 0xDA, 0x74, 0x94, 0x93, 0x38, 0x1D, 0x23,
+ 0x3E, 0x69, 0x24, 0x4C, 0xA4, 0x9F, 0x4D, 0x04, 0xDA, 0x99, 0x32, 0x56, 0x81, 0x8D, 0x75, 0xDE,
+ 0x53, 0x09, 0x51, 0x6E, 0x31, 0x81, 0x0B, 0x1B, 0x18, 0xA3, 0xFF, 0xDF, 0x76, 0x7D, 0x57, 0x97,
+ 0x62, 0x8C, 0x48, 0x3B, 0x99, 0x1C, 0xA2, 0x8A, 0x16, 0xDA, 0x2D, 0x07, 0xEB, 0xE8, 0x2F, 0xAE,
+ 0x4E, 0xCF, 0xB4, 0xA1, 0xAD, 0xB2, 0xC5, 0xEB, 0x2C, 0x69, 0x8B, 0x3F, 0x02, 0xD8, 0x8E, 0x17,
+ 0x5E, 0xED, 0x51, 0xD9, 0x2A, 0x95, 0xAA, 0x3C, 0x61, 0x18, 0x67, 0x69, 0x8B, 0x1B, 0x5D, 0x60,
+ 0x88, 0xCF, 0x6C, 0x61, 0x96, 0xD5, 0x2C, 0xCD, 0xF2, 0x8A, 0xA5, 0x8E, 0x66, 0xC2, 0x18, 0x27,
+ 0x51, 0xA6, 0x4E, 0xDE, 0x95, 0x18, 0xBD, 0xC7, 0xDC, 0x52, 0x9F, 0xC0, 0x74, 0xBA, 0xD8, 0xF2,
+ 0x1C, 0x2B, 0x5C, 0x01, 0x29, 0xE4, 0x9D, 0xEE, 0xD5, 0xF6, 0xFF, 0x0E, 0x7C, 0x0D, 0x9E, 0x07,
+ 0x29, 0xF5, 0xED, 0xD7, 0x37, 0xA0, 0x57, 0x1A, 0x54, 0x3E, 0x15, 0xB6, 0xEC, 0x97, 0x27, 0x32,
+ 0xEA, 0x32, 0xC6, 0xB6, 0xBB, 0xF6, 0x2F, 0x0C, 0x12, 0x74, 0x0E, 0xFA, 0x75, 0x94, 0xD0, 0x11,
+ 0x79, 0xEE, 0xE4, 0xBD, 0x9C, 0x0E, 0x34, 0xFA, 0xA9, 0x66, 0x14, 0x89, 0xDA, 0x0E, 0x20, 0x65,
+ 0x4A, 0x68, 0x5B, 0xE8, 0xAE, 0x51, 0x4F, 0x9E, 0x18, 0x5D, 0x6F, 0x7C, 0x16, 0xD3, 0x76, 0x6C,
+ 0xBE, 0x5E, 0x2D, 0x95, 0x95, 0x0B, 0x08, 0x07, 0x35, 0xD3, 0x09, 0xCB, 0x68, 0x31, 0x13, 0x0C,
+ 0x5B, 0xED, 0x4A, 0xE2, 0x0F, 0x8B, 0x5B, 0x68, 0xDC, 0x33, 0xA6, 0x83, 0x98, 0x6B, 0x85, 0x06,
+ 0x16, 0xF3, 0xFE, 0xED, 0x60, 0x4E, 0x52, 0x6D, 0x71, 0x91, 0x88, 0x43, 0xBE, 0xEF, 0xC4, 0xAD,
+ 0x13, 0x42, 0x18, 0x50, 0x71, 0x34, 0x1A, 0x18, 0xE0, 0x83, 0x5F, 0xD0, 0xE3, 0x68, 0xAD, 0x85,
+ 0xFB, 0x81, 0x9A, 0xCE, 0x38, 0x25, 0xFE, 0xDF, 0xE8, 0xE9, 0xE4, 0x89, 0xE9, 0x38, 0x6D, 0x99,
+ 0xA4, 0x7C, 0x05, 0xB6, 0xB6, 0x5C, 0x96, 0x70, 0xDE, 0x62, 0xE5, 0x6F, 0x91, 0x19, 0xFF, 0x84,
+ 0x14, 0x5E, 0xD4, 0xCC, 0xE9, 0x99, 0x89, 0xF5, 0x72, 0x72, 0x83, 0x9D, 0xEF, 0x8B, 0xA3, 0x63,
+ 0xEA, 0x76, 0x7A, 0xF2, 0xD5, 0x1D, 0x50, 0xC9, 0x1B, 0xBC, 0x4D, 0x77, 0xB3, 0xDA, 0x1E, 0x8B,
+ 0x1B, 0x39, 0x04, 0xB5, 0x1A, 0x42, 0xDD, 0x18, 0xE5, 0xE3, 0x5F, 0xFD, 0x05, 0x9B, 0xBE, 0x01,
+ 0xA5, 0xAD, 0x0A, 0x9A, 0x62, 0xBB, 0xE2, 0x43, 0xAB, 0x14, 0x96, 0xD2, 0xCC, 0xBE, 0xA9, 0x0C,
+ 0xE8, 0xBF, 0x40, 0x04, 0x01, 0xD5, 0x34, 0x5F, 0x25, 0x25, 0x2B, 0xD2, 0x76, 0xA4, 0x60, 0x6F,
+ 0xF2, 0xE6, 0x5C, 0x35, 0x44, 0x06, 0x36, 0x8D, 0xBA, 0xD5, 0xD7, 0x9F, 0x13, 0xC8, 0xF1, 0x0B,
+ 0x0A, 0x40, 0xED, 0xD2, 0x40, 0x93, 0xCE, 0x4E, 0x15, 0x78, 0xF1, 0x92, 0x59, 0xDB, 0xE9, 0x1B,
+ 0x1E, 0x91, 0xF3, 0xCA, 0x22, 0x00, 0x28, 0xE6, 0xCE, 0xF1, 0x4E, 0x77, 0x2B, 0xF5, 0xFC, 0x2E,
+ 0x90, 0xAA, 0xFA, 0x47, 0x00, 0xEC, 0x42, 0x45, 0x8B, 0xD0, 0xD8, 0xAA, 0x06, 0x0A, 0x79, 0xD3,
+ 0xBB, 0xAE, 0xDA, 0xE6, 0xF2, 0x7E, 0x15, 0x34, 0xA7, 0x10, 0xB9, 0xAD, 0xC7, 0x24, 0x25, 0xFF,
+ 0xF1, 0xDD, 0x12, 0x68, 0xFA, 0x93, 0xAF, 0x55, 0xEB, 0xEC, 0xA0, 0xAB, 0x48, 0x66, 0xBB, 0x2C,
+ 0x15, 0x9A, 0x36, 0xD9, 0xC4, 0x6C, 0x6B, 0x9E, 0x8B, 0x55, 0x67, 0x03, 0xE4, 0xAE, 0x23, 0xB0,
+ 0x89, 0x92, 0xDD, 0x04, 0x3A, 0xEB, 0xFA, 0x43, 0x00, 0xA5, 0x03, 0x32, 0x25, 0x86, 0x02, 0x37,
+ 0xCD, 0xCA, 0xF2, 0x88, 0x22, 0x41, 0x93, 0x31, 0x75, 0x6C, 0xA1, 0x66, 0xD5, 0xC8, 0x26, 0x2C,
+ 0x30, 0x4F, 0xED, 0xF2, 0x07, 0xA6, 0x4F, 0x85, 0x0C, 0xBC, 0xEC, 0xA6, 0xE5, 0x8A, 0xBA, 0x1C,
+ 0xCA, 0xF6, 0x22, 0x65, 0xDD, 0x7A, 0x65, 0x85, 0x2C, 0x5A, 0xF3, 0xDC, 0xAD, 0xB6, 0xC3, 0xF8,
+ 0x03, 0x2A, 0x0B, 0x01, 0xB2, 0x38, 0x96, 0xF7, 0x2F, 0xFA, 0xD6, 0x6B, 0xD9, 0x5C, 0x0C, 0xCD,
+ 0x3F, 0xE4, 0xB9, 0x8B, 0xA7, 0x51, 0x23, 0x8A, 0xCE, 0x08, 0xD5, 0xDB, 0x19, 0xF6, 0xF4, 0x92,
+ 0xF8, 0xE2, 0x6B, 0xB0, 0xC6, 0x3D, 0x2E, 0xE7, 0xF1, 0x84, 0xA1, 0x12, 0x07, 0x14, 0x50, 0xBB,
+ 0x86, 0x8D, 0x59, 0xBD, 0x6C, 0xE3, 0x3B, 0xA6, 0xEF, 0xF9, 0xD4, 0x3B, 0x1F, 0x1D, 0x39, 0xBF,
+ 0xB6, 0xFD, 0xF2, 0x22, 0x00, 0xBC, 0xF5, 0xA8, 0x48, 0xFF, 0x65, 0xF4, 0xD0, 0xD5, 0x5E, 0x47,
+ 0x47, 0x82, 0xF6, 0xC5, 0x88, 0x95, 0xE7, 0x65, 0xA7, 0x89, 0x2D, 0x6C, 0x1C, 0xCA, 0x2D, 0x30,
+ 0xE7, 0xD5, 0x77, 0xBA, 0xA4, 0x08, 0x03, 0x8B, 0x2D, 0x2D, 0x5A, 0xA3, 0xA5, 0x1D, 0x00, 0x62,
+ 0x61, 0xC8, 0x6D, 0x9B, 0xF9, 0x61, 0xF1, 0x0A, 0x8C, 0x2B, 0x48, 0x10, 0x66, 0x9D, 0x41, 0xC8,
+ 0x5A, 0xE3, 0x7C, 0xC1, 0x24, 0x09, 0x93, 0xE3, 0x71, 0x53, 0x2D, 0x44, 0xA5, 0x9A, 0xE1, 0xCF,
+ 0xBE, 0x89, 0x35, 0x1E, 0x7A, 0x22, 0x71, 0xD4, 0x68, 0x4D, 0x7F, 0xBD, 0x4D, 0x67, 0x76, 0x03,
+ 0xA8, 0x56, 0x12, 0xC7, 0x6B, 0x84, 0x81, 0xBB, 0x0B, 0x3A, 0x6A, 0xE2, 0x0F, 0x9D, 0xA0, 0xD6,
+ 0x2E, 0x88, 0xA9, 0x64, 0xE7, 0xF0, 0x28, 0x78, 0xCD, 0x26, 0xBB, 0x4B, 0xE5, 0xFB, 0xB8, 0xD1,
+ 0x63, 0xA2, 0x99, 0x76, 0x50, 0xCE, 0xF6, 0xC1, 0x96, 0xE0, 0x1A, 0x4E, 0x1B, 0xC6, 0x09, 0x58,
+ 0x3B, 0xE6, 0xFF, 0x75, 0x96, 0x80, 0x8D, 0x85, 0x2B, 0x90, 0x01, 0x06, 0x8D, 0xB0, 0x42, 0x7E,
+ 0xF5, 0x25, 0xAD, 0x24, 0xB1, 0x88, 0x9C, 0x1A, 0x24, 0x8A, 0x68, 0x5A, 0xD5, 0x24, 0x94, 0x78,
+ 0xB2, 0x1A, 0xB9, 0xC3, 0xA2, 0x19, 0x92, 0x91, 0x1A, 0x77, 0x66, 0xD6, 0x6B, 0xF5, 0x5A, 0x49,
+ 0xC7, 0xAA, 0x44, 0x41, 0x43, 0xF3, 0xE9, 0xC3, 0x5F, 0x16, 0x43, 0x7D, 0x15, 0xF5, 0x0A, 0xC2,
+ 0x8A, 0x50, 0x64, 0x01, 0x7B, 0x8C, 0x09, 0x85, 0xDD, 0x22, 0xE3, 0x9E, 0xA9, 0x46, 0x1E, 0x02,
+ 0xE4, 0x01, 0xB0, 0x5D, 0xB8, 0xE8, 0x14, 0xEB, 0x4E, 0x29, 0x23, 0xDE, 0xAE, 0x62, 0x45, 0x01,
+ 0xC8, 0x25, 0x87, 0x18, 0xB3, 0xF9, 0xAD, 0x03, 0x3E, 0x59, 0x49, 0x71, 0xA9, 0xC7, 0x27, 0xD7,
+ 0xBA, 0x65, 0xCD, 0x27, 0x1E, 0x50, 0xE0, 0xD8, 0x8F, 0x84, 0x6B, 0x0F, 0x6C, 0x12, 0x36, 0x04,
+ 0x6B, 0x5D, 0xE3, 0x7D, 0xD5, 0x53, 0xAF, 0xBC, 0xB0, 0x82, 0x21, 0x58, 0xC9, 0xFF, 0xDF, 0x87,
+ 0x18, 0x09, 0x4B, 0x79, 0x50, 0xB4, 0x5F, 0x9B, 0xF7, 0x94, 0xAA, 0x7F, 0xB5, 0x03, 0x29, 0x58,
+ 0x60, 0xD4, 0xC9, 0x39, 0xC1, 0x58, 0x21, 0xE8, 0xF5, 0x2D, 0x49, 0x58, 0xB1, 0x25, 0xE9, 0x82,
+ 0x15, 0xB7, 0xDD, 0x8E, 0x3D, 0x28, 0x1F, 0x97, 0xE5, 0xDA, 0x2B, 0x33, 0xB9, 0x2F, 0x08, 0x29,
+ 0x80, 0x87, 0xA2, 0xB7, 0x80, 0x33, 0x2A, 0xE5, 0xD5, 0x49, 0x7B, 0x84, 0x13, 0x66, 0x7D, 0xE3,
+ 0x1B, 0x92, 0x9F, 0x90, 0xCE, 0x74, 0x67, 0x4C, 0xC3, 0x74, 0xC0, 0x75, 0x86, 0x63, 0x4C, 0x5E,
+ 0xA1, 0x42, 0xAC, 0xC7, 0x9B, 0x65, 0x17, 0x23, 0x6D, 0x50, 0x19, 0xF9, 0x99, 0x15, 0xA8, 0x73,
+ 0x0E, 0x28, 0xBA, 0x2C, 0x9A, 0xC0, 0x35, 0x13, 0x16, 0xBC, 0x12, 0x09, 0x0F, 0xF3, 0x0C, 0xE3,
+ 0xE1, 0x27, 0x63, 0x75, 0x60, 0xD3, 0xA8, 0xB9, 0xAD, 0x10, 0x18, 0xC3, 0x52, 0x36, 0xED, 0xF4,
+ 0xA4, 0x22, 0x4C, 0xC0, 0x24, 0x36, 0xD5, 0xBC, 0xDF, 0xD5, 0x5A, 0xC2, 0xA1, 0x23, 0x6F, 0x2F,
+ 0x1A, 0xA2, 0x31, 0x97, 0x24, 0xB8, 0x67, 0xD7, 0x4B, 0x53, 0x50, 0x19, 0x6A, 0xDF, 0x40, 0x21,
+ 0xCB, 0x2F, 0x43, 0xD1, 0xD2, 0x68, 0x6B, 0x76, 0x07, 0x8B, 0xA4, 0xC8, 0xD0, 0x5E, 0xAF, 0x22,
+ 0x51, 0x13, 0x34, 0x1F, 0x26, 0xAC, 0x7D, 0xC2, 0x6E, 0x6D, 0x21, 0x98, 0xFC, 0x3B, 0xC2, 0x95,
+ 0xAD, 0x74, 0xCB, 0xF0, 0xC0, 0xB7, 0xD0, 0xAE, 0x86, 0x46, 0x5D, 0x84, 0xED, 0xEB, 0xB8, 0x64,
+ 0x66, 0x2A, 0xA7, 0xA1, 0xE3, 0xCB, 0x48, 0x7D, 0xD8, 0x2E, 0xCE, 0x7B, 0x37, 0xD2, 0x24, 0xB5,
+ 0x80, 0x31, 0x0C, 0x77, 0x24, 0x4E, 0x96, 0x59, 0x99, 0x05, 0x80, 0xCF, 0x13, 0x15, 0x4A, 0x97,
+ 0x43, 0x6F, 0x45, 0xB9, 0xE8, 0x45, 0x46, 0x90, 0x98, 0x49, 0xC1, 0x83, 0x85, 0x4B, 0x67, 0x7E,
+ 0x58, 0x78, 0x9E, 0x69, 0x9C, 0xDF, 0x1F, 0xEC, 0xC5, 0x01, 0xB3, 0x5D, 0x51, 0xF9, 0xCE, 0x84,
+ 0x19, 0x5C, 0x67, 0xC1, 0xCE, 0x26, 0x4A, 0xAD, 0xBF, 0x23, 0x00, 0x43, 0x78, 0x3C, 0x2A, 0x0C,
+ 0xAE, 0xFC, 0x0A, 0x9A, 0x46, 0x2D, 0x37, 0x80, 0xCB, 0xB2, 0xBE, 0x8B, 0x5D, 0xAE, 0x21, 0x11,
+ 0xAC, 0xDE, 0x6F, 0xC1, 0x8D, 0xFB, 0xA1, 0xCF, 0xBA, 0x72, 0xCF, 0x81, 0xD7, 0x74, 0x1A, 0x10,
+ 0x82, 0x2A, 0x5F, 0xFB, 0xE0, 0x22, 0xD5, 0x7B, 0x5A, 0x62, 0xB3, 0x4B, 0x5D, 0x94, 0x9C, 0xFE,
+ 0xFE, 0x7E, 0xFE, 0xC9, 0x1F, 0xA7, 0x9B, 0xBB, 0x8F, 0x42, 0x26, 0x8E, 0x96, 0x70, 0x2C, 0xD0,
+ 0x20, 0xE3, 0xC7, 0xC0, 0x29, 0x4C, 0xCE, 0x37, 0x67, 0x77, 0x51, 0x22, 0x43, 0x83, 0xEA, 0x36,
+ 0x85, 0xEA, 0xCD, 0x08, 0x28, 0xC7, 0x36, 0x8E, 0xF6, 0x5F, 0x34, 0x65, 0x02, 0x61, 0xAC, 0xB5,
+ 0x42, 0xE3, 0xD6, 0x8D, 0x9B, 0xFC, 0x2F, 0x5A, 0xBA, 0xC4, 0x84, 0x10, 0x42, 0xCE, 0xBB, 0x8C,
+ 0x48, 0xF6, 0xD1, 0x0A, 0xDA, 0x45, 0x8D, 0x47, 0x6C, 0x18, 0xBB, 0x87, 0xB6, 0x35, 0xDB, 0xDE,
+ 0x01, 0x79, 0x5E, 0x0C, 0x94, 0xFC, 0xF0, 0x9B, 0x61, 0x77, 0xEF, 0x6C, 0x36, 0xE9, 0x85, 0x54,
+ 0xC8, 0x37, 0x1F, 0x35, 0x85, 0x8B, 0x22, 0x53, 0x02, 0xF4, 0xBA, 0x09, 0x5E, 0xD9, 0x4A, 0x74,
+ 0xE5, 0x62, 0x7C, 0xE0, 0x41, 0xC9, 0x02, 0xA2, 0xAB, 0x9E, 0x0B, 0x53, 0xB7, 0x04, 0xAF, 0xBF,
+ 0x4A, 0xC3, 0x88, 0x53, 0x13, 0xE5, 0xED, 0xC7, 0x2D, 0x35, 0x4E, 0x7F, 0xA5, 0x34, 0xA7, 0xB3,
+ 0x3B, 0xEB, 0x7B, 0x60, 0xB1, 0x0B, 0xB3, 0xA0, 0x32, 0x02, 0xBB, 0x31, 0x34, 0x7B, 0xE5, 0x91,
+ 0x1F, 0x48, 0xE0, 0x7F, 0x94, 0x95, 0x3C, 0xA4, 0x36, 0x86, 0x31, 0x3A, 0x77, 0xA0, 0xDA, 0x50,
+ 0x15, 0xB9, 0x13, 0xA0, 0x35, 0x27, 0x70, 0xCC, 0x19, 0xF3, 0x89, 0x22, 0x7C, 0x35, 0xF1, 0xF0,
+ 0xCE, 0xCF, 0x3B, 0x15, 0x39, 0xB7, 0xE1, 0x11, 0xB4, 0xFC, 0x4E, 0x02, 0x60, 0x05, 0xBB, 0x7E,
+ 0x08, 0x01, 0x8B, 0xB5, 0x77, 0x87, 0x70, 0x60, 0xDB, 0x38, 0x52, 0x31, 0x6B, 0x11, 0x41, 0xBF,
+ 0x1B, 0xCB, 0x67, 0x84, 0xC9, 0x7B, 0xA1, 0xBA, 0xA3, 0x2F, 0x21, 0xEC, 0x0D, 0x89, 0x5A, 0x75,
+ 0x36, 0x20, 0x82, 0xC6, 0xC1, 0x93, 0x12, 0xD6, 0x11, 0x22, 0xBF, 0x9F, 0x0E, 0x59, 0xFC, 0xFB,
+ 0xA0, 0x20, 0x47, 0xC7, 0x9A, 0x98, 0xB8, 0x1F, 0x95, 0x1D, 0x4C, 0x5B, 0x97, 0xEF, 0x92, 0x40,
+ 0xAB, 0xB7, 0x21, 0x60, 0xE4, 0x65, 0xCF, 0xAC, 0xD8, 0x34, 0x91, 0x83, 0xD2, 0x71, 0xAA, 0xFC,
+ 0xAB, 0xA8, 0xF5, 0x6A, 0x05, 0x86, 0x01, 0x56, 0x72, 0x8F, 0x5B, 0xAA, 0x51, 0x6B, 0x3F, 0xA3,
+ 0x32, 0xA3, 0xE4, 0x99, 0xED, 0x38, 0x43, 0x46, 0x8D, 0x61, 0x80, 0x88, 0xC3, 0xEF, 0xAA, 0xF6,
+ 0xAA, 0x6F, 0x34, 0xA1, 0xD7, 0x81, 0x4C, 0x9C, 0xD7, 0xEC, 0xE0, 0x9E, 0x26, 0x6B, 0x2C, 0xF8,
+ 0xC0, 0xD5, 0x0B, 0xA1, 0x73, 0xA7, 0xBD, 0x4B, 0x68, 0xD0, 0xFB, 0x75, 0xF3, 0x1C, 0x9C, 0x26,
+ 0xC3, 0x60, 0xB2, 0x11, 0x81, 0xFE, 0x12, 0x13, 0xC4, 0x6B, 0xE5, 0x52, 0x72, 0x00, 0x26, 0x4E,
+ 0x7A, 0xFF, 0x2C, 0x20, 0xCB, 0x32, 0xAA, 0xE4, 0xEE, 0x6B, 0x89, 0x52, 0xC5, 0x2B, 0xDC, 0xFA,
+ 0x1B, 0x52, 0x4D, 0x8E, 0x02, 0xDB, 0x84, 0x4E, 0x7C, 0x37, 0xBA, 0xFF, 0xDC, 0x8D, 0x3F, 0xC6,
+ 0xBE, 0x5C, 0x1D, 0x85, 0xF3, 0xE3, 0x4A, 0x83, 0x28, 0x61, 0xB3, 0xC0, 0xF6, 0x05, 0x8B, 0x8A,
+ 0xE8, 0xED, 0x3E, 0x92, 0x70, 0x9A, 0xFB, 0xF3, 0x5B, 0x39, 0x3A, 0x3B, 0x3E, 0x33, 0x25, 0x01,
+ 0x15, 0x86, 0x5B, 0x17, 0x14, 0x42, 0xBD, 0x83, 0xD5, 0x8B, 0x7E, 0xA8, 0xFC, 0xF9, 0x26, 0x1D,
+ 0xEC, 0xD9, 0xE4, 0x25, 0xCC, 0x3A, 0x3A, 0xD7, 0x07, 0x7C, 0x59, 0x87, 0xC2, 0x4F, 0x7C, 0x7E,
+ 0xDD, 0x4F, 0x02, 0x4B, 0x46, 0xBA, 0xFD, 0x1A, 0x26, 0x46, 0x01, 0x3C, 0x26, 0xDF, 0x38, 0x03,
+ 0xA5, 0x0E, 0xF0, 0x8B, 0xC8, 0xDD, 0xE1, 0x37, 0xD5, 0xDB, 0x51, 0x1B, 0x9C, 0x7B, 0x81, 0x12,
+ 0x15, 0xCA, 0x6D, 0x85, 0xDB, 0x02, 0x2A, 0xA3, 0x2B, 0x52, 0xAA, 0x05, 0xE9, 0xCA, 0x42, 0xCA,
+ 0x01, 0x4B, 0xBF, 0x2C, 0x82, 0x5F, 0x4E, 0x9E, 0xE2, 0xCB, 0x2D, 0xAD, 0x64, 0xC4, 0xA6, 0xC1,
+ 0xFB, 0xA8, 0xA7, 0x7F, 0x46, 0xC3, 0xA9, 0xF5, 0xC1, 0x68, 0x5F, 0x54, 0x18, 0x2F, 0xD4, 0x5A,
+ 0xD1, 0x94, 0x71, 0x52, 0x90, 0x33, 0xD0, 0xD9, 0xF2, 0x05, 0x83, 0x08, 0x42, 0x77, 0xE5, 0x57,
+ 0x6D, 0x78, 0xB9, 0x20, 0x92, 0x1C, 0xB0, 0x64, 0x39, 0xE1, 0xC8, 0x27, 0x33, 0xB6, 0x24, 0x3D,
+ 0x8E, 0xE3, 0x6D, 0x41, 0x9A, 0x4C, 0x36, 0x11, 0xB2, 0x7D, 0x5C, 0xD3, 0x4B, 0x56, 0x42, 0x1E,
+ 0xB3, 0xD4, 0x1E, 0x55, 0xFE, 0x0C, 0x1B, 0x91, 0x30, 0x74, 0x3C, 0x2C, 0x98, 0x58, 0xD7, 0x0D,
+ 0xA3, 0xCD, 0x17, 0x07, 0xBD, 0xDC, 0x31, 0x7C, 0xCE, 0x89, 0x9E, 0xDB, 0xDF, 0x39, 0x52, 0x9B,
+ 0x8B, 0x02, 0x78, 0xAD, 0xD8, 0xA7, 0xB3, 0xE4, 0x81, 0xE4, 0xFB, 0x41, 0xE6, 0x64, 0x56, 0x8F,
+ 0x86, 0x80, 0xF4, 0x67, 0x20, 0x40, 0x72, 0xFD, 0xCC, 0x36, 0x15, 0xDA, 0xB7, 0x2E, 0xD8, 0x4F,
+ 0x25, 0x54, 0x50, 0xA9, 0xD0, 0x5B, 0x1A, 0x7D, 0xB0, 0xA6, 0xDF, 0x5D, 0xB4, 0x1B, 0x13, 0x3A,
+ 0xA2, 0x46, 0xEF, 0xE7, 0x53, 0x60, 0xF4, 0x20, 0xF1, 0x51, 0x31, 0x5A, 0x36, 0xB1, 0xA6, 0xA7,
+ 0xDA, 0x9E, 0x26, 0x73, 0xEC, 0x8B, 0x65, 0xD8, 0x64, 0x85, 0x27, 0x51, 0x27, 0xB1, 0xEB, 0x4B,
+ 0xBB, 0x78, 0x0C, 0xD0, 0xF5, 0xE4, 0xEC, 0x52, 0xEB, 0x0E, 0xEB, 0x13, 0x3C, 0x1E, 0xD7, 0x35,
+ 0x88, 0x5D, 0x98, 0x11, 0x9D, 0x0B, 0x75, 0xEC, 0xEC, 0x67, 0x42, 0xB5, 0x4C, 0xF6, 0xF0, 0x4C,
+ 0xA2, 0xE1, 0x38, 0xF4, 0x55, 0x95, 0xCB, 0x54, 0x0F, 0xD3, 0xE8, 0x3C, 0xF2, 0x39, 0x9E, 0xD6,
+ 0x34, 0x46, 0x21, 0x85, 0xD5, 0x63, 0xE8, 0x4B, 0x34, 0xAA, 0x31, 0x6E, 0xA7, 0xD0, 0xA9, 0xC7,
+ 0x54, 0x54, 0x62, 0x00, 0x9B, 0xB5, 0x89, 0x94, 0x8F, 0x6C, 0x0C, 0xD5, 0x6C, 0x23, 0x13, 0xCD,
+ 0x58, 0x6E, 0xCA, 0x9A, 0xF1, 0x08, 0x24, 0x94, 0xA3, 0x80, 0xD9, 0x2F, 0xA9, 0x32, 0x1D, 0x3A,
+ 0x3F, 0x67, 0xCB, 0xD5, 0x7D, 0x4D, 0x89, 0x56, 0x5C, 0xE5, 0xDC, 0x37, 0x99, 0x27, 0x3E, 0x66,
+ 0x82, 0x59, 0x3F, 0xF2, 0x68, 0xE2, 0xC4, 0xA9, 0xE9, 0xD8, 0xFB, 0x5E, 0x8E, 0x22, 0x0E, 0x77,
+ 0x5F, 0x65, 0x9B, 0x91, 0xDC, 0x59, 0xC4, 0x91, 0x30, 0x44, 0x24, 0x7A, 0x74, 0x49, 0xA3, 0xA1,
+ 0x4C, 0x2A, 0xBF, 0xC3, 0xD7, 0x21, 0x21, 0x2A, 0xA9, 0x8C, 0x5F, 0x45, 0xDA, 0x78, 0x5E, 0x55,
+ 0x7F, 0x7C, 0x41, 0xD3, 0x6D, 0x0B, 0xBE, 0x83, 0xA8, 0x5E, 0x08, 0xF5, 0xEC, 0xCC, 0xFD, 0x21,
+ 0xB3, 0x1D, 0x6A, 0xCC, 0xF9, 0x52, 0xF3, 0x89, 0x96, 0x2A, 0x70, 0xAB, 0x63, 0x62, 0xA3, 0xB4,
+ 0xE7, 0x70, 0xE9, 0xDF, 0x4C, 0xED, 0x52, 0xA0, 0x24, 0x38, 0x58, 0xF1, 0xC6, 0x5B, 0x28, 0xA0,
+ 0x8F, 0x84, 0x36, 0x60, 0xFB, 0x17, 0xAA, 0x27, 0xB1, 0xA5, 0x71, 0xE8, 0x1E, 0xDF, 0xB9, 0x0A,
+ 0x0D, 0x15, 0x83, 0xF6, 0xE1, 0xF2, 0x51, 0x8F, 0x92, 0x67, 0x63, 0xAB, 0xD1, 0x2A, 0x29, 0x77,
+ 0x2D, 0xF0, 0x1E, 0x0E, 0x19, 0xCC, 0x4E, 0x9D, 0x8F, 0xAA, 0xDE, 0xC1, 0x15, 0x1A, 0xBD, 0x19,
+ 0x79, 0xD0, 0x61, 0x51, 0x2D, 0x23, 0x82, 0x8E, 0x2C, 0xA3, 0x00, 0x9E, 0x91, 0x83, 0xD4, 0x61,
+ 0x6E, 0x53, 0x1B, 0x81, 0xBD, 0x07, 0x69, 0x24, 0xE7, 0xF7, 0xD4, 0x5B, 0x65, 0x72, 0xE2, 0x0F,
+ 0x05, 0x41, 0xD5, 0xD6, 0x5E, 0x9D, 0xF3, 0xF0, 0xA0, 0xF5, 0x7C, 0xC9, 0x2F, 0x0C, 0x87, 0xEC,
+ 0x13, 0xDB, 0x79, 0x70, 0x89, 0x0C, 0x67, 0x40, 0xC9, 0xCA, 0xF3, 0xE0, 0xEA, 0x12, 0xF1, 0x92,
+ 0xD4, 0x02, 0x71, 0x79, 0xE6, 0xF7, 0xC6, 0xC5, 0x27, 0x4A, 0x9D, 0xAC, 0x32, 0x6A, 0x44, 0xD9,
+ 0x01, 0x8D, 0x01, 0x1F, 0x2A, 0xD7, 0xE5, 0x7F, 0x32, 0x51, 0x9F, 0xB6, 0x36, 0x8A, 0x98, 0x4E,
+ 0xA1, 0x0D, 0xA3, 0xCD, 0x3C, 0xF7, 0xDF, 0x30, 0x0A, 0xD9, 0x2A, 0x6A, 0xD6, 0x97, 0x14, 0x34,
+ 0x0C, 0xA1, 0xC5, 0x87, 0x1B, 0x63, 0x4D, 0xBA, 0x23, 0x9E, 0x3D, 0x6E, 0x4F, 0x80, 0x3D, 0x32,
+ 0x28, 0x1D, 0x51, 0x8F, 0x63, 0xCA, 0xA6, 0x5A, 0x77, 0xB8, 0xB9, 0xA2, 0xE5, 0x05, 0x8C, 0xE9,
+ 0xE3, 0xC7, 0xC8, 0xF0, 0x43, 0x14, 0x29, 0x7E, 0x70, 0x23, 0x77, 0x18, 0x2D, 0x3A, 0x20, 0x14,
+ 0x1F, 0x26, 0x0F, 0x46, 0x33, 0x0A, 0x6A, 0x6B, 0xCA, 0x62, 0xB0, 0xF0, 0xCB, 0xB4, 0x48, 0xFA,
+ 0xB2, 0x84, 0x55, 0x0B, 0x45, 0x35, 0xC2, 0x47, 0x65, 0x72, 0x4B, 0x78, 0x54, 0x29, 0xD3, 0xD6,
+ 0x44, 0xF9, 0xA5, 0x83, 0xA7, 0xA7, 0x04, 0x31, 0x34, 0xA8, 0x3B, 0x8B, 0xCD, 0x13, 0xA2, 0x00,
+ 0xCB, 0x61, 0x9D, 0x9E, 0x40, 0xE1, 0xDB, 0x75, 0x47, 0x12, 0xE8, 0x89, 0x4C, 0x31, 0xA5, 0x4D,
+ 0xDC, 0xA5, 0x6D, 0x79, 0x47, 0x3E, 0x58, 0xB5, 0x91, 0x9B, 0x02, 0xEC, 0x82, 0x28, 0xCF, 0x11,
+ 0x5C, 0x12, 0xFA, 0x88, 0xDE, 0x9C, 0x15, 0x4D, 0xCF, 0xD4, 0x24, 0xAD, 0x5F, 0x16, 0xF0, 0xD0,
+ 0x88, 0xC0, 0xF9, 0x77, 0x97, 0xE0, 0xC5, 0x69, 0x20, 0x18, 0x4E, 0x9C, 0x2A, 0x19, 0x66, 0x42,
+ 0xD5, 0x5C, 0xD3, 0x87, 0x6B, 0xB2, 0xB0, 0xDE, 0x78, 0xB3, 0x8C, 0x5D, 0x90, 0xC3, 0x25, 0x3D,
+ 0xA3, 0xCC, 0xB0, 0x4C, 0x97, 0x0F, 0x6D, 0x29, 0x11, 0x42, 0xB3, 0x86, 0x99, 0x87, 0x37, 0x5A,
+ 0x45, 0x93, 0xE0, 0x88, 0xC9, 0x35, 0x05, 0x48, 0xCA, 0x84, 0xAB, 0x13, 0xF8, 0x06, 0xA4, 0x0B,
+ 0x72, 0x2A, 0x8D, 0xEB, 0xA0, 0x89, 0x3D, 0x0B, 0x00, 0x1A, 0x17, 0x87, 0xCD, 0x95, 0x30, 0x2E,
+ 0xC5, 0xF3, 0xA6, 0x42, 0x5C, 0x63, 0x7A, 0xF6, 0xD0, 0xE3, 0x6D, 0x9C, 0xC8, 0xF7, 0x83, 0xC3,
+ 0xED, 0x9F, 0xFA, 0xF0, 0xC6, 0xE0, 0xFE, 0xCD, 0xFB, 0xC8, 0x18, 0x83, 0x77, 0xAA, 0xDA, 0x58,
+ 0x17, 0xD2, 0x7B, 0x73, 0x62, 0x2D, 0xC0, 0xE1, 0xF8, 0xA9, 0x3E, 0x06, 0x97, 0x3F, 0x9B, 0xF4,
+ 0xBB, 0x16, 0x25, 0x31, 0x69, 0x7C, 0xD6, 0xD6, 0xB3, 0x01, 0x35, 0x41, 0x77, 0x25, 0x71, 0xDE,
+ 0x2D, 0x2C, 0xEF, 0x9E, 0x9A, 0xD6, 0x4C, 0xD9, 0x8C, 0x0C, 0xD1, 0xD8, 0xA2, 0x48, 0x59, 0x6D,
+ 0x41, 0x15, 0xED, 0xAC, 0x98, 0xA8, 0x47, 0x3D, 0x4B, 0x7D, 0xE7, 0x14, 0xB7, 0xAB, 0x7F, 0xA9,
+ 0xCD, 0xAA, 0x49, 0x65, 0x48, 0x34, 0x8C, 0x65, 0xD6, 0x38, 0x5D, 0xE1, 0x14, 0xFC, 0x4F, 0xE6,
+ 0xE4, 0x87, 0x21, 0xE2, 0x54, 0x08, 0x91, 0x22, 0xED, 0x3E, 0x87, 0xEE, 0x31, 0x9A, 0xC4, 0x40,
+ 0x78, 0x46, 0x2E, 0xF9, 0xDB, 0xED, 0x64, 0xD7, 0x10, 0xA4, 0x99, 0x3E, 0x43, 0x43, 0xB2, 0x54,
+ 0x20, 0x20, 0x7D, 0x93, 0x34, 0x0D, 0x0C, 0x86, 0x52, 0x1A, 0x9D, 0x19, 0x12, 0x88, 0xDD, 0x14,
+ 0xAE, 0x57, 0x72, 0x75, 0x26, 0xDF, 0xC4, 0xA1, 0x90, 0x49, 0xC7, 0x0C, 0xE1, 0xA6, 0x11, 0x2C,
+ 0x00, 0xBF, 0xB6, 0xF5, 0xF2, 0x21, 0x4B, 0x14, 0xB4, 0x07, 0xBE, 0x04, 0x72, 0xCB, 0xBE, 0xB6,
+ 0x24, 0x27, 0xCF, 0x7D, 0x75, 0x2B, 0x31, 0xD6, 0xA6, 0x84, 0x55, 0x11, 0xD7, 0x91, 0x5A, 0x15,
+ 0x9C, 0xB0, 0x9D, 0x7E, 0xB1, 0xC6, 0xB7, 0xA5, 0xE0, 0xB2, 0x88, 0x98, 0x9C, 0x2F, 0x67, 0x29,
+ 0xDA, 0x88, 0xC9, 0xA5, 0x27, 0x53, 0x4D, 0x8F, 0x0B, 0xF8, 0x08, 0x2C, 0xE7, 0x88, 0x26, 0x9C,
+ 0xD9, 0x10, 0xD9, 0xE4, 0xDB, 0xA4, 0xF7, 0xAD, 0x9F, 0x4E, 0x65, 0x3E, 0xF4, 0xA4, 0x57, 0x18,
+ 0x2C, 0xDD, 0x0E, 0x6D, 0x26, 0xA3, 0xC2, 0x66, 0x0D, 0x71, 0x79, 0x22, 0x8E, 0xD5, 0x6A, 0xFC,
+ 0xF4, 0x71, 0x83, 0x27, 0xEF, 0x24, 0x50, 0xBA, 0x54, 0x1A, 0xE4, 0x98, 0x84, 0x3F, 0x27, 0xE3,
+ 0x29, 0x3E, 0x45, 0xC1, 0xB1, 0x00, 0x88, 0x54, 0x4D, 0xF0, 0x87, 0x7B, 0x30, 0x7B, 0xA1, 0xC7,
+ 0x6C, 0xD7, 0x48, 0xA0, 0xFF, 0xCB, 0x89, 0x92, 0x6D, 0x0E, 0x05, 0x3A, 0xCE, 0x95, 0x30, 0x23,
+ 0xD7, 0x42, 0x77, 0xA9, 0x5E, 0xF5, 0xD9, 0xEB, 0x5A, 0xB7, 0x83, 0xB9, 0x91, 0x14, 0x51, 0x13,
+ 0x96, 0x1E, 0x13, 0x5B, 0x28, 0x56, 0xFB, 0x4C, 0x6C, 0x7B, 0x87, 0x4A, 0xF5, 0x44, 0xD3, 0xC6,
+ 0xC0, 0x17, 0x77, 0x45, 0x61, 0x60, 0x5E, 0x1D, 0xA6, 0x0C, 0x19, 0x70, 0x95, 0x46, 0x7D, 0xD2,
+ 0x3B, 0x94, 0xD5, 0x9E, 0xD9, 0xB9, 0x1C, 0x02, 0x2D, 0xF5, 0x52, 0xEF, 0x77, 0x84, 0x1A, 0xA0,
+ 0x65, 0x7A, 0x61, 0xFF, 0x5A, 0xDD, 0x1E, 0xB6, 0xD5, 0xE7, 0xEC, 0xF6, 0x33, 0x54, 0xB7, 0xE7,
+ 0x33, 0x30, 0xB0, 0xB4, 0x61, 0x0F, 0xAA, 0xFE, 0xAC, 0xDB, 0x9D, 0x3A, 0x2B, 0x78, 0x82, 0x93,
+ 0x8B, 0x74, 0x86, 0x6A, 0x07, 0xDF, 0x82, 0x1F, 0x35, 0xFA, 0xFD, 0x65, 0x39, 0x52, 0x87, 0xD9,
+ 0x20, 0x05, 0xF5, 0x56, 0x85, 0x70, 0xFA, 0x46, 0x54, 0x59, 0xE5, 0xA0, 0xF3, 0x14, 0x09, 0x95,
+ 0x5F, 0x9B, 0x56, 0x45, 0xA5, 0x32, 0x64, 0x88, 0x98, 0x4A, 0x1D, 0x91, 0xDF, 0x32, 0x22, 0xAF,
+ 0xCD, 0x3D, 0x8B, 0x5E, 0x77, 0x59, 0x41, 0x25, 0xA0, 0xCC, 0x7F, 0xC6, 0x6B, 0x61, 0x60, 0x0F,
+ 0xCD, 0x0A, 0xC9, 0x55, 0x6E, 0x0E, 0xB7, 0x6B, 0x85, 0xC8, 0xD9, 0xD6, 0x26, 0x93, 0x0C, 0x3D,
+ 0x1C, 0xEE, 0xEB, 0x19, 0x8F, 0x98, 0xF0, 0x90, 0x88, 0x06, 0x05, 0xF0, 0x0D, 0xE7, 0xC9, 0x5B,
+ 0x86, 0xE2, 0x7E, 0x2C, 0x4A, 0xD3, 0x80, 0xB6, 0x74, 0x54, 0x7F, 0x03, 0x12, 0x38, 0xB3, 0xA2,
+ 0xBB, 0x43, 0x24, 0xDA, 0x41, 0x6D, 0xEE, 0x99, 0x4D, 0xD1, 0xEC, 0x69, 0x37, 0xE7, 0x41, 0xF3,
+ 0x9D, 0xAA, 0xD8, 0xC1, 0xA5, 0xE0, 0x11, 0x3F, 0x47, 0xB4, 0x2E, 0xAD, 0x09, 0x84, 0x56, 0x0F,
+ 0x4E, 0x0C, 0xB1, 0x78, 0xE6, 0xE0, 0x33, 0xA0, 0x32, 0xDA, 0xF6, 0x67, 0x80, 0xF0, 0xB3, 0xE9,
+ 0x2F, 0x41, 0x23, 0xF2, 0x79, 0xE3, 0xD2, 0x59, 0x7A, 0x0D, 0x4A, 0x58, 0x29, 0x90, 0x92, 0xCA,
+ 0x6C, 0x70, 0x15, 0x41, 0xCB, 0x72, 0xF4, 0x09, 0x47, 0xB9, 0xE2, 0x98, 0xAB, 0x15, 0xCE, 0x3D,
+ 0xA9, 0x9D, 0x0E, 0x44, 0xDD, 0xA9, 0x23, 0x8E, 0x0E, 0x1D, 0x78, 0xBC, 0xEC, 0x5F, 0x48, 0x92,
+ 0x22, 0xEC, 0x2A, 0xED, 0x9A, 0x41, 0x8D, 0x14, 0xC8, 0x77, 0x44, 0x36, 0xCE, 0xE6, 0xF5, 0x70,
+ 0xF4, 0xC1, 0x50, 0x41, 0xAB, 0x7B, 0x28, 0xFD, 0xB9, 0x00, 0x39, 0x63, 0x8D, 0x20, 0x73, 0x8E,
+ 0x42, 0x7E, 0xB8, 0x40, 0x7A, 0xAD, 0x8D, 0x8D, 0x6E, 0xFA, 0x93, 0x24, 0xA5, 0xF6, 0xF7, 0x61,
+ 0x72, 0x75, 0xFC, 0xBB, 0xF5, 0xD1, 0xBE, 0xA0, 0x36, 0x91, 0x61, 0x87, 0x7F, 0x7F, 0xFD, 0x2A,
+ 0x9B, 0xC8, 0x12, 0xE9, 0xB2, 0xE9, 0xFC, 0xBB, 0x05, 0xA3, 0xA8, 0x21, 0x97, 0x9B, 0x96, 0x3C,
+ 0x40, 0x64, 0x7F, 0xA3, 0x51, 0x27, 0x3D, 0x6A, 0xB7, 0x67, 0x15, 0x57, 0x68, 0x4E, 0x87, 0x7D,
+ 0xB5, 0x2F, 0x45, 0x8F, 0x77, 0x3E, 0x92, 0x98, 0x10, 0xB7, 0x77, 0xA3, 0x27, 0x20, 0x3C, 0x82,
+ 0x42, 0x37, 0xF2, 0xD7, 0xD6, 0xE7, 0xBF, 0x8D, 0xD6, 0xEF, 0x4B, 0x53, 0xEC, 0x0F, 0xCC, 0xA7,
+ 0xB0, 0x91, 0x03, 0x27, 0xAC, 0xE1, 0x9A, 0xA6, 0x38, 0x6E, 0x64, 0xF6, 0x4E, 0xE9, 0xD1, 0x78,
+ 0x7C, 0x7A, 0xD6, 0xF9, 0x0E, 0xEB, 0x24, 0x2C, 0x01, 0xF3, 0xB1, 0x38, 0x22, 0x22, 0xBF, 0x91,
+ 0x19, 0x44, 0xCB, 0xEC, 0x8B, 0xEF, 0x59, 0xF0, 0xA8, 0x3D, 0x5D, 0x66, 0x43, 0xEF, 0x56, 0x6C,
+ 0x1A, 0x88, 0x0A, 0xA7, 0x74, 0x48, 0x0B, 0x1A, 0x9E, 0x2D, 0xD5, 0x0B, 0xCC, 0x43, 0xA3, 0x09,
+ 0xB9, 0xCD, 0xD7, 0x82, 0x0C, 0x73, 0x29, 0x4F, 0xE7, 0x0B, 0x69, 0x68, 0x82, 0x00, 0x65, 0x4D,
+ 0x5F, 0xF8, 0xE6, 0xD7, 0x02, 0x2A, 0x8F, 0x22, 0x99, 0x5E, 0xAA, 0x08, 0x4D, 0xBD, 0x9A, 0xC4,
+ 0xEC, 0x32, 0x0E, 0x15, 0x3F, 0xB4, 0x94, 0xBF, 0x01, 0x3A, 0xB1, 0x0C, 0x78, 0x77, 0xDF, 0x72,
+ 0x5B, 0x77, 0x0D, 0x33, 0x7A, 0x0B, 0xC1, 0x1E, 0xED, 0x9A, 0xE8, 0x72, 0x68, 0x8D, 0x24, 0xEE,
+ 0x97, 0x24, 0xF6, 0xCA, 0x6D, 0xE8, 0x3B, 0x9D, 0xDA, 0x93, 0x40, 0x85, 0xA1, 0x9D, 0x1F, 0xB8,
+ 0xC9, 0xE5, 0xEA, 0x59, 0xA0, 0xD4, 0x6D, 0xCB, 0x71, 0x52, 0x75, 0x9D, 0xA2, 0xAF, 0x91, 0x6A,
+ 0x4E, 0x0A, 0x6B, 0xB5, 0x67, 0x7B, 0x6C, 0xAC, 0x5E, 0x9B, 0x02, 0x27, 0x4B, 0x3E, 0xCF, 0x19,
+ 0x57, 0xCC, 0x74, 0x4B, 0x33, 0xA4, 0x6B, 0x1E, 0x56, 0x6D, 0x0B, 0xA4, 0x84, 0xA3, 0x81, 0xC9,
+ 0x89, 0xF7, 0x9E, 0x3F, 0xFE, 0x57, 0x60, 0x4F, 0x79, 0x84, 0x53, 0xEB, 0x80, 0x8F, 0xB9, 0x63,
+ 0x29, 0x4F, 0xBD, 0xA0, 0x0C, 0xF0, 0x7F, 0x35, 0xEC, 0x18, 0xC1, 0x22, 0xA3, 0x6D, 0x7F, 0x2E,
+ 0xCC, 0x4D, 0x51, 0xFD, 0x76, 0x74, 0x18, 0x19, 0x67, 0x6B, 0x81, 0x07, 0x07, 0x5B, 0x5D, 0xB3,
+ 0x98, 0x4D, 0x23, 0xB8, 0x77, 0xD1, 0xEC, 0x3C, 0x0E, 0x10, 0xD0, 0x65, 0x99, 0x29, 0xF1, 0x42,
+ 0x83, 0x51, 0x26, 0x18, 0x8C, 0x8E, 0x4F, 0x8D, 0x2A, 0x14, 0x34, 0x6A, 0xC5, 0x71, 0x2F, 0x4C,
+ 0xFF, 0xBA, 0x11, 0xD7, 0x76, 0x16, 0x00, 0xEE, 0xBA, 0x26, 0xD9, 0xC2, 0x51, 0xBD, 0xC6, 0x67,
+ 0x85, 0x56, 0x98, 0x36, 0x12, 0xC3, 0xF1, 0xCC, 0xFA, 0xFB, 0xF6, 0x5A, 0xD2, 0x7A, 0xFF, 0x1B,
+ 0x33, 0xD3, 0x72, 0x05, 0x01, 0x67, 0xA2, 0x42, 0x45, 0x0C, 0x5E, 0x46, 0xAD, 0x26, 0xA7, 0xCE,
+ 0x38, 0x30, 0xFB, 0x9B, 0x39, 0x8D, 0x40, 0x61, 0xDF, 0xE5, 0xC5, 0x8A, 0x26, 0xA6, 0x31, 0xFC,
+ 0x8B, 0x0B, 0x2E, 0xAD, 0xD8, 0xA5, 0x12, 0x92, 0xD2, 0xCA, 0x86, 0x73, 0x52, 0xA6, 0x19, 0xE7,
+ 0x70, 0xD2, 0x31, 0x14, 0x1C, 0xDA, 0x27, 0xC9, 0xB7, 0x6C, 0x98, 0xE9, 0xD9, 0x59, 0x8B, 0x5F,
+ 0x27, 0xA6, 0xB3, 0xAC, 0x89, 0xFC, 0x99, 0xF5, 0x6A, 0x56, 0xC1, 0x99, 0xFE, 0x05, 0x3A, 0x0A,
+ 0x27, 0x1E, 0xE4, 0xD2, 0x75, 0x98, 0x7C, 0x00, 0x23, 0xD0, 0x19, 0x0B, 0x49, 0xC6, 0x52, 0x48,
+ 0x03, 0xB5, 0x24, 0x40, 0x03, 0xA2, 0x18, 0xA2, 0x0A, 0x5D, 0x84, 0xF2, 0xDA, 0xF2, 0x01, 0xF5,
+ 0xE7, 0xDD, 0x54, 0x1F, 0x6C, 0x04, 0xBA, 0x74, 0x46, 0x29, 0xA3, 0x08, 0x18, 0xA1, 0xA9, 0x80,
+ 0xA3, 0x85, 0x42, 0x49, 0x33, 0x30, 0x79, 0x08, 0x7B, 0x72, 0x32, 0xB7, 0x59, 0x85, 0xA1, 0xB5,
+ 0x29, 0xDF, 0x69, 0xDF, 0x2C, 0xC3, 0x5F, 0xD7, 0xA7, 0xE9, 0x97, 0x6A, 0xA4, 0x38, 0x8B, 0x8C,
+ 0xDE, 0xB2, 0xA8, 0x27, 0xFE, 0x6E, 0xD5, 0xFF, 0xF6, 0x00, 0x64, 0xB7, 0xBD, 0x14, 0x3C, 0xEC,
+ 0x0E, 0x86, 0x83, 0x7A, 0x16, 0xEF, 0x50, 0xBB, 0x3D, 0xBA, 0xA2, 0x43, 0x14, 0x61, 0x06, 0x8B,
+ 0x85, 0xCF, 0x86, 0xE6, 0xC9, 0x77, 0xC6, 0x9F, 0x84, 0xF2, 0x1E, 0xD8, 0x51, 0x9F, 0xB6, 0xC8,
+ 0x11, 0x56, 0x9A, 0x4B, 0x8B, 0xEA, 0x58, 0x68, 0x18, 0x78, 0x44, 0x8C, 0x36, 0x0B, 0xA0, 0x4C,
+ 0x74, 0x2E, 0x14, 0xBD, 0xE8, 0x57, 0xA9, 0x1D, 0x4A, 0x9F, 0xD5, 0x44, 0xB3, 0x15, 0xD6, 0xED,
+ 0xAE, 0x7A, 0x4E, 0x7D, 0xA7, 0x3C, 0x30, 0xFF, 0x6F, 0x0C, 0x23, 0xCC, 0x1B, 0x92, 0xC1, 0x48,
+ 0xF9, 0x8C, 0x97, 0x47, 0x3E, 0x5E, 0x66, 0x83, 0xE8, 0xB9, 0xF0, 0xD0, 0x1B, 0x79, 0x68, 0x1D,
+ 0xA2, 0x35, 0xC7, 0x34, 0x07, 0x8A, 0xCE, 0x68, 0xBD, 0x9B, 0x7C, 0x76, 0x38, 0x7A, 0x23, 0x9B,
+ 0x39, 0xD7, 0x04, 0x4A, 0x82, 0xB9, 0x4B, 0xCF, 0xB1, 0x9A, 0xBA, 0x75, 0x6B, 0x04, 0xF5, 0x23,
+ 0x8D, 0x36, 0x4F, 0x9A, 0x3E, 0x60, 0xD3, 0xAA, 0xF9, 0x0F, 0x05, 0x5C, 0xA7, 0x28, 0x7E, 0xB4,
+ 0xCA, 0x77, 0x92, 0x9B, 0x21, 0x0C, 0x99, 0x84, 0xB0, 0xB1, 0xD2, 0x1C, 0xF7, 0x9A, 0x24, 0x0A,
+ 0xD7, 0x8A, 0xE3, 0x08, 0x3F, 0xE1, 0x5A, 0xC6, 0x32, 0xCF, 0xD8, 0xBB, 0x6F, 0x86, 0x62, 0x28,
+ 0xDC, 0xC6, 0xF5, 0x00, 0x8C, 0xBE, 0x15, 0x25, 0x53, 0x87, 0x81, 0xAF, 0xDE, 0xAC, 0x6D, 0x59,
+ 0x0D, 0x51, 0x1F, 0xF9, 0x76, 0xEA, 0x44, 0x95, 0xFB, 0x1C, 0xC5, 0xB0, 0x0A, 0x29, 0xF2, 0xAE,
+ 0x8F, 0x03, 0xE7, 0x41, 0xD1, 0x54, 0x9D, 0xD3, 0xD2, 0xB4, 0x7D, 0x9A, 0xC1, 0x09, 0xDA, 0xC5,
+ 0xD8, 0x26, 0x59, 0xC4, 0x35, 0x66, 0xD7, 0xD1, 0xE5, 0xA6, 0xED, 0xBB, 0x82, 0xAD, 0x50, 0x4C,
+ 0xE0, 0x01, 0xC9, 0x57, 0x78, 0x66, 0x8E, 0x0E, 0x69, 0xFD, 0x8C, 0xE9, 0x63, 0xA3, 0x21, 0xDA,
+ 0xC8, 0x58, 0x1D, 0x6B, 0x76, 0x6F, 0xA4, 0x8F, 0x46, 0xC8, 0x00, 0xB2, 0x1E, 0xEF, 0x93, 0x54,
+ 0x89, 0xAB, 0xD9, 0x18, 0x23, 0x95, 0xE6, 0x2A, 0xF8, 0xCC, 0xF2, 0x74, 0xE5, 0x71, 0x60, 0x8C,
+ 0xA1, 0x0E, 0x67, 0x14, 0xBA, 0xEF, 0x69, 0xC4, 0x01, 0xFE, 0x93, 0x54, 0x26, 0x0A, 0xE1, 0xC2,
+ 0xC1, 0x47, 0xC9, 0x6A, 0xF6, 0x6A, 0xD8, 0xB6, 0xDD, 0xEE, 0x67, 0xB5, 0xA0, 0xD8, 0x5F, 0x58,
+ 0x7B, 0x42, 0xFE, 0xD3, 0xD0, 0xCB, 0xFD, 0x5E, 0x22, 0x4F, 0x31, 0xF7, 0xBA, 0x12, 0x6C, 0xEF,
+ 0x4A, 0x78, 0x23, 0x85, 0xA3, 0xB1, 0x35, 0x59, 0x13, 0x5D, 0x35, 0xA2, 0x32, 0xF4, 0x6C, 0x07,
+ 0x33, 0x56, 0x53, 0xD9, 0xB5, 0x4B, 0x6F, 0xC7, 0x73, 0x01, 0x69, 0x54, 0x7F, 0x95, 0x8C, 0x10,
+ 0xD7, 0x11, 0xF1, 0xF5, 0x0C, 0x21, 0x17, 0xE5, 0x23, 0x34, 0xDB, 0x4D, 0xC5, 0xA9, 0x18, 0x54,
+ 0xD0, 0x76, 0xB2, 0x74, 0x68, 0x61, 0x00, 0x8D, 0xCA, 0x3A, 0x70, 0xE4, 0x36, 0xDE, 0x2D, 0x9B,
+ 0x5F, 0xB0, 0x4E, 0x66, 0x15, 0x7B, 0x92, 0x04, 0x38, 0xBD, 0xC1, 0x61, 0xF2, 0x19, 0xB9, 0xD9,
+ 0x71, 0xCF, 0xFB, 0x4D, 0x19, 0x99, 0xE5, 0x2A, 0x50, 0x27, 0x20, 0xC2, 0x18, 0x7B, 0xE9, 0xFA,
+ 0x02, 0x13, 0x66, 0x89, 0xE7, 0x72, 0x2A, 0xDC, 0x27, 0x72, 0x91, 0xE7, 0xCF, 0x3A, 0x76, 0x6B,
+ 0xFD, 0xAF, 0x6C, 0x68, 0x57, 0x38, 0xEE, 0x97, 0x55, 0x0C, 0xBF, 0xA6, 0xBA, 0xDD, 0xC3, 0x2F,
+ 0xDE, 0xD5, 0x39, 0x91, 0x8E, 0xFA, 0xE8, 0xFC, 0x52, 0x87, 0x94, 0x85, 0x24, 0x3A, 0xDE, 0x03,
+ 0xBE, 0x02, 0x1B, 0x81, 0xE8, 0x1F, 0xE6, 0x96, 0xAA, 0x38, 0x42, 0x42, 0x2F, 0xDF, 0x4F, 0x13,
+ 0x50, 0xD3, 0x77, 0xE4, 0x2C, 0x8E, 0x96, 0x3C, 0x4A, 0x6E, 0x37, 0xAF, 0xE5, 0x03, 0x27, 0x5F,
+ 0x71, 0xE1, 0x79, 0xEA, 0xF7, 0xC5, 0x71, 0x4F, 0xAC, 0xFE, 0x36, 0x45, 0x0A, 0x96, 0x60, 0x59,
+ 0xD9, 0x52, 0x9F, 0x31, 0xDF, 0x20, 0x6F, 0x33, 0x03, 0x3D, 0x51, 0x57, 0x18, 0xC1, 0xD0, 0xA4,
+ 0x7C, 0x33, 0x2E, 0x59, 0x04, 0xF8, 0x3C, 0xF3, 0x58, 0xBB, 0x2F, 0x12, 0xB1, 0x35, 0xC4, 0xF6,
+ 0xC4, 0x95, 0x3D, 0xDF, 0x13, 0x09, 0xFC, 0xFB, 0x30, 0xA2, 0xF6, 0x9B, 0xAE, 0xC4, 0xA3, 0xB3,
+ 0x2E, 0xFE, 0x29, 0x8D, 0x56, 0x24, 0x37, 0xA4, 0xA4, 0x1E, 0xC3, 0x13, 0x6F, 0x99, 0x3D, 0x35,
+ 0xF8, 0xA0, 0x08, 0x7E, 0x4C, 0x7C, 0x59, 0x81, 0xC0, 0xD8, 0x8F, 0xF7, 0x33, 0x8E, 0x67, 0x2F,
+ 0xD2, 0x04, 0xE7, 0x4D, 0xB4, 0x90, 0x07, 0xD3, 0xF7, 0x73, 0x18, 0x1D, 0x69, 0x89, 0x49, 0x13,
+ 0x08, 0x65, 0x6F, 0xCA, 0xDC, 0x8A, 0x32, 0xBC, 0xCF, 0x5C, 0x6E, 0xDE, 0x23, 0x83, 0x22, 0x94,
+ 0xEE, 0x02, 0xC6, 0x44, 0xE8, 0xDE, 0xBD, 0xB4, 0x79, 0xD2, 0xF0, 0x9E, 0x46, 0xCB, 0xF6, 0x5B,
+ 0x2B, 0xA3, 0x97, 0x98, 0x05, 0x60, 0x83, 0xE3, 0x74, 0xFA, 0xA5, 0x0A, 0x04, 0xE0, 0x76, 0xB5,
+ 0x2B, 0x16, 0xA2, 0x00, 0xE1, 0x0D, 0xAF, 0x5C, 0x8E, 0xB3, 0x5E, 0x24, 0xC4, 0xA3, 0xB5, 0x8B,
+ 0xAC, 0x56, 0x13, 0x09, 0x8D, 0xDE, 0xE5, 0xA1, 0x85, 0x49, 0x65, 0xB2, 0xFF, 0xE4, 0xF2, 0x61,
+ 0x12, 0xE2, 0x45, 0x48, 0x8D, 0x8A, 0x02, 0x60, 0xBB, 0x2F, 0xF3, 0xFF, 0x10, 0xCD, 0xE3, 0xA7,
+ 0xE8, 0xF0, 0xC1, 0x14, 0xB5, 0x0D, 0x65, 0xDE, 0x37, 0x33, 0xFC, 0x2F, 0x22, 0xB9, 0xBF, 0xE0,
+ 0x56, 0x0C, 0x44, 0x18, 0xFC, 0xAA, 0xBA, 0xBE, 0x24, 0x0E, 0xA1, 0x31, 0x17, 0x7D, 0x2C, 0x2A,
+ 0xA2, 0xAA, 0xF4, 0x65, 0x81, 0x12, 0xB4, 0x7E, 0x0D, 0x13, 0xE3, 0x9B, 0x3F, 0xAD, 0xA1, 0x20,
+ 0x19, 0x91, 0x34, 0x92, 0xAD, 0x15, 0x5A, 0x93, 0x65, 0xC1, 0xDD, 0x10, 0xCD, 0x6D, 0xAD, 0x94,
+ 0x15, 0xA4, 0x88, 0x30, 0x4A, 0x8B, 0x8C, 0xB0, 0xEB, 0xA9, 0x04, 0x8E, 0xEA, 0x4A, 0xBA, 0x28,
+ 0x1F, 0x28, 0xD4, 0x65, 0x85, 0x49, 0xF4, 0x7C, 0x69, 0x13, 0xB4, 0x3E, 0x84, 0x36, 0x77, 0x9E,
+ 0x70, 0x36, 0x12, 0x53, 0x1B, 0xD4, 0xD0, 0x2A, 0x17, 0xDC, 0x84, 0x93, 0xC1, 0xDF, 0xB9, 0x44,
+ 0x68, 0x0B, 0xF5, 0xEE, 0x3B, 0xB2, 0xA2, 0x8C, 0xCB, 0xB6, 0xA6, 0xD8, 0x97, 0xA8, 0x2C, 0x61,
+ 0x7C, 0xB7, 0x21, 0x58, 0x07, 0xC9, 0xD4, 0x5D, 0x54, 0x3A, 0x70, 0xC9, 0xF4, 0x51, 0x00, 0xC6,
+ 0x25, 0xFF, 0x1E, 0x1D, 0x94, 0xBA, 0x48, 0xDE, 0x5E, 0x69, 0xB4, 0x87, 0x4F, 0x87, 0x83, 0x64,
+ 0x9A, 0xDF, 0x83, 0x93, 0x59, 0x2A, 0x43, 0xD7, 0xCE, 0x35, 0xE7, 0xD5, 0x77, 0x72, 0x23, 0xB5,
+ 0xFF, 0x52, 0xA6, 0x11, 0x2A, 0x29, 0x0A, 0xCA, 0x3B, 0xB8, 0xBC, 0xF3, 0xFE, 0x3A, 0x6B, 0x1B,
+ 0x13, 0xC9, 0x5D, 0xD1, 0xF5, 0xEE, 0x6A, 0xC4, 0x05, 0x03, 0xAE, 0x04, 0xC5, 0x36, 0x03, 0x56,
+ 0x3C, 0x5D, 0xE1, 0x3E, 0x32, 0x45, 0x18, 0x3C, 0x90, 0x46, 0xF3, 0xB0, 0xDA, 0xD4, 0xCC, 0xE0,
+ 0xE1, 0xCD, 0x40, 0xAD, 0xC3, 0xFA, 0x6B, 0x2B, 0x74, 0xC5, 0x20, 0xCA, 0xF6, 0xA2, 0xA7, 0xC6,
+ 0xD3, 0xA2, 0x38, 0x1E, 0x5C, 0x03, 0xE5, 0xCC, 0x3F, 0x21, 0xED, 0x8E, 0xAE, 0x6B, 0xDE, 0x75,
+ 0xF9, 0x67, 0x63, 0xEA, 0x8B, 0x18, 0x06, 0x7A, 0xBD, 0x67, 0x32, 0xA3, 0x89, 0x6D, 0x71, 0x0A,
+ 0x43, 0x00, 0x74, 0x6B, 0x19, 0x42, 0x8D, 0x0C, 0x93, 0xAC, 0x4F, 0x69, 0x3B, 0x5C, 0xB0, 0x35,
+ 0xAE, 0x7F, 0x54, 0x48, 0x1A, 0x48, 0x36, 0x4A, 0xD4, 0x60, 0x32, 0x16, 0x21, 0x75, 0xF6, 0xAA,
+ 0x3A, 0x34, 0x14, 0xC3, 0xC7, 0x0D, 0xB6, 0x3E, 0xF8, 0x7D, 0xDE, 0x17, 0x46, 0xBD, 0xA7, 0x87,
+ 0x08, 0xF5, 0x1B, 0x6B, 0x13, 0x0B, 0xCD, 0xA9, 0x4D, 0x9A, 0xD2, 0x39, 0x83, 0xCA, 0xE9, 0x47,
+ 0xE1, 0xCF, 0xD6, 0x73, 0xF1, 0x15, 0xCC, 0x50, 0x87, 0xE2, 0xB2, 0x56, 0x04, 0xCC, 0x20, 0x06,
+ 0x87, 0x3F, 0x19, 0x8D, 0xE6, 0x45, 0x70, 0xF1, 0x13, 0xB1, 0x32, 0x1C, 0xC2, 0xFF, 0xB9, 0x2F,
+ 0xC9, 0x76, 0x2C, 0x0E, 0x81, 0x18, 0xEF, 0x34, 0xA7, 0xD0, 0x85, 0xD1, 0x37, 0xC3, 0x83, 0x44,
+ 0xFB, 0x35, 0x2B, 0xB8, 0x38, 0x4A, 0xB8, 0x44, 0x61, 0xE0, 0x65, 0x97, 0x90, 0x2A, 0xFB, 0x09,
+ 0x68, 0x1A, 0x8A, 0xF0, 0x56, 0xF7, 0xF7, 0xE4, 0xF5, 0x01, 0x35, 0xD2, 0x92, 0xB5, 0xE0, 0x82,
+ 0x2D, 0x39, 0x03, 0x1B, 0x0C, 0xDC, 0x30, 0x8D, 0x7E, 0x55, 0xB4, 0x38, 0x29, 0x93, 0xA0, 0x99,
+ 0x85, 0x6E, 0x8B, 0x6B, 0x82, 0x6F, 0x5A, 0x57, 0xC0, 0x04, 0x68, 0xE3, 0x41, 0xB6, 0xF9, 0x5B,
+ 0xC7, 0xE9, 0xCF, 0x96, 0x06, 0x86, 0x63, 0x93, 0x12, 0xC1, 0xEC, 0xF3, 0xBB, 0x25, 0x39, 0x8F,
+ 0x1F, 0x06, 0x70, 0x08, 0xC6, 0x60, 0x4C, 0xD1, 0x67, 0x89, 0x8A, 0x13, 0x97, 0x67, 0x13, 0x6E,
+ 0x08, 0x2B, 0xE5, 0x59, 0x5C, 0xAA, 0xFF, 0x4B, 0xE7, 0x49, 0x81, 0x6E, 0x46, 0x5E, 0x9E, 0x13,
+ 0x5C, 0x69, 0xEB, 0x95, 0x36, 0x2A, 0x77, 0xBF, 0xD2, 0xB5, 0xDC, 0x49, 0x33, 0x5F, 0x17, 0x5D,
+ 0x1F, 0x1C, 0x78, 0x8B, 0x38, 0x4D, 0x5D, 0xC4, 0x03, 0xF2, 0x58, 0xF4, 0x0A, 0xFD, 0xE4, 0xEF,
+ 0x18, 0xF0, 0x8F, 0x31, 0x29, 0x5D, 0x69, 0xEE, 0xA1, 0x31, 0x37, 0xE2, 0x31, 0x5F, 0xF6, 0x92,
+ 0x33, 0xDC, 0x70, 0x28, 0xD2, 0x6D, 0xC7, 0x88, 0xC5, 0x86, 0x61, 0x0D, 0xA9, 0x7B, 0x15, 0xA4,
+ 0xE5, 0x35, 0x7C, 0xF3, 0xBD, 0xE1, 0x80, 0xDE, 0x9D, 0x7A, 0x7D, 0x98, 0x06, 0xFF, 0x20, 0x6A,
+ 0xF4, 0xCD, 0xC8, 0x99, 0x25, 0x64, 0x81, 0xEA, 0xC8, 0x7E, 0x3C, 0x5B, 0x28, 0x06, 0xBD, 0xA5,
+ 0xA8, 0xF8, 0x9C, 0xF3, 0x3D, 0x4F, 0xB1, 0xB5, 0x15, 0x1D, 0x50, 0x0C, 0x45, 0x55, 0x48, 0xEA,
+ 0x4C, 0x62, 0x5C, 0x11, 0xF3, 0xAE, 0x7E, 0x13, 0xA0, 0x9E, 0x6A, 0xB4, 0x99, 0x88, 0x03, 0x8F,
+ 0xC7, 0xAE, 0x20, 0x67, 0x2D, 0x4D, 0x88, 0x11, 0xB5, 0x41, 0x0D, 0x37, 0xA3, 0xAB, 0xD8, 0xE4,
+ 0x7C, 0x59, 0xC5, 0x71, 0x74, 0x5E, 0x95, 0xB8, 0x38, 0x95, 0x40, 0xAC, 0x15, 0xD3, 0x7D, 0x21,
+ 0xD0, 0xB3, 0x82, 0x40, 0x55, 0x92, 0x43, 0x90, 0xDE, 0x83, 0x62, 0xE7, 0xD4, 0x56, 0x32, 0x72,
+ 0x52, 0x0B, 0x2E, 0x09, 0x30, 0x64, 0x4A, 0xAC, 0x5A, 0x67, 0x01, 0x0A, 0xBD, 0x22, 0xF4, 0x58,
+ 0xB0, 0xE5, 0x6B, 0x92, 0x69, 0x89, 0x72, 0xE2, 0x91, 0x50, 0x3E, 0x47, 0xBB, 0xE0, 0x23, 0x57,
+ 0xBC, 0xA5, 0x5D, 0xEF, 0xA7, 0x39, 0x96, 0x00, 0x99, 0xE4, 0x30, 0x89, 0xCF, 0x0C, 0xA5, 0x22,
+ 0x8F, 0x78, 0x5F, 0xAA, 0x69, 0x50, 0xF6, 0xB9, 0x61, 0xA1, 0x3E, 0x1C, 0x65, 0x15, 0xD1, 0x50,
+ 0x4B, 0xDF, 0xD0, 0xA0, 0x87, 0xC2, 0xF8, 0xB2, 0xAA, 0x00, 0xB6, 0xFD, 0x7A, 0x4E, 0xA6, 0xEA,
+ 0xD8, 0xCE, 0x22, 0x3C, 0x41, 0xFA, 0x6A, 0x05, 0xCA, 0x5F, 0xEC, 0x98, 0x4E, 0xFC, 0xF1, 0x06,
+ 0x5E, 0x07, 0xF3, 0x98, 0x73, 0xCF, 0xBD, 0x17, 0xF5, 0xB5, 0x5B, 0x52, 0x29, 0xEF, 0xCC, 0xAE,
+ 0x8C, 0x8F, 0x6C, 0xB0, 0x82, 0x9D, 0x1C, 0x15, 0x62, 0x4C, 0xFC, 0x99, 0xFD, 0x3D, 0xD1, 0x7F,
+ 0x13, 0xFD, 0x8A, 0xD1, 0x96, 0x50, 0x98, 0x2D, 0x30, 0xE8, 0x57, 0x07, 0xFC, 0xD0, 0x06, 0x24,
+ 0xB5, 0x7A, 0xC6, 0xBE, 0xAA, 0x1E, 0xBF, 0xFF, 0xC6, 0x6C, 0x24, 0x70, 0xB7, 0x59, 0xC3, 0xDB,
+ 0xC1, 0x3A, 0x79, 0x6F, 0x83, 0xCB, 0x55, 0x84, 0x7E, 0x04, 0xF8, 0xDB, 0x7D, 0x41, 0xAF, 0x5D,
+ 0xDB, 0x5A, 0xE6, 0xCE, 0x9B, 0x66, 0x6F, 0x38, 0xF4, 0xEA, 0x20, 0x09, 0x75, 0x75, 0xCD, 0xF8,
+ 0x62, 0x74, 0x7E, 0x4A, 0x3E, 0x2E, 0xAE, 0xCC, 0x8D, 0x49, 0xBC, 0xCC, 0x34, 0xE9, 0x9B, 0xC7,
+ 0x05, 0x81, 0x9C, 0xBA, 0x00, 0xF2, 0x83, 0xC5, 0xE4, 0x78, 0x85, 0xD0, 0xC5, 0xF3, 0x0F, 0xB0,
+ 0x18, 0x30, 0x9B, 0xA3, 0x62, 0x92, 0x72, 0xD5, 0xEA, 0xE1, 0xC0, 0x5B, 0xDA, 0x0C, 0xBC, 0x19,
+ 0x46, 0x7F, 0x03, 0xC8, 0x7B, 0x31, 0x13, 0x1B, 0xA0, 0x91, 0xB4, 0x99, 0xC1, 0x9D, 0xB8, 0xE5,
+ 0x33, 0xD9, 0x41, 0x53, 0x19, 0x97, 0x99, 0x27, 0x8C, 0x8E, 0x5B, 0xAA, 0x17, 0x85, 0x42, 0xA9,
+ 0x47, 0x1C, 0x19, 0x33, 0xCB, 0x88, 0xBE, 0xF4, 0x48, 0x43, 0x66, 0xEB, 0x9F, 0xF6, 0x94, 0x2C,
+ 0xC2, 0x74, 0xF8, 0xD7, 0x9B, 0xEB, 0x2F, 0x2F, 0xF3, 0x52, 0x1F, 0x45, 0x9D, 0x9E, 0xB4, 0x86,
+ 0x76, 0xAB, 0x43, 0xB9, 0x52, 0x0C, 0x0A, 0x06, 0xD7, 0xF2, 0xA5, 0xFE, 0x9C, 0x0D, 0x8A, 0xE0,
+ 0xA4, 0xEA, 0x65, 0x3F, 0x2B, 0x7C, 0x03, 0x31, 0x3A, 0x40, 0x97, 0xA8, 0x56, 0xA2, 0xAD, 0x63,
+ 0x7A, 0xE5, 0xDC, 0xFD, 0x8D, 0xA9, 0xF3, 0x55, 0xB5, 0x14, 0xB7, 0x51, 0xBA, 0x00, 0x32, 0x43,
+ 0x25, 0xEB, 0x61, 0x78, 0xA6, 0x2A, 0xEA, 0x9D, 0x15, 0x72, 0x5D, 0xD0, 0x0E, 0x0C, 0xB4, 0xC1,
+ 0x4B, 0x10, 0x9A, 0xFB, 0x1B, 0x54, 0x33, 0x8D, 0x3A, 0x0B, 0x43, 0x51, 0x6C, 0x22, 0xB8, 0x29,
+ 0xC5, 0x11, 0x1F, 0x28, 0xF5, 0x82, 0x5F, 0xCF, 0x0A, 0xB0, 0xBF, 0xDA, 0x90, 0x13, 0xCE, 0x69,
+ 0xFF, 0x05, 0x85, 0x9D, 0x80, 0xF3, 0x3D, 0x4B, 0x21, 0xAB, 0xED, 0x73, 0xB9, 0xC4, 0xAD, 0x70,
+ 0xEA, 0x17, 0x20, 0x78, 0xCA, 0xCC, 0x4E, 0x47, 0xCA, 0x30, 0xA8, 0xDB, 0x1C, 0x7B, 0x46, 0x3C,
+ 0xC0, 0xE2, 0x96, 0xF8, 0x60, 0xDD, 0x43, 0xFE, 0x41, 0x7C, 0xD2, 0x7B, 0xB9, 0x90, 0x97, 0xF6,
+ 0x86, 0x62, 0xD5, 0xF3, 0x49, 0x78, 0x81, 0xCF, 0x0C, 0xF1, 0x30, 0xC7, 0x37, 0x16, 0xDE, 0xB4,
+ 0x93, 0x6A, 0xE0, 0x9F, 0x5B, 0x17, 0x43, 0x69, 0x7E, 0x54, 0xBB, 0x83, 0x4F, 0x1B, 0xA9, 0x70,
+ 0x41, 0x97, 0x5A, 0x5D, 0x6E, 0x51, 0x1F, 0xEA, 0xDF, 0x44, 0xFB, 0x2D, 0x1E, 0xB9, 0xF9, 0xA4,
+ 0xCE, 0x11, 0xD5, 0x6C, 0x43, 0xF5, 0xD1, 0x23, 0x7B, 0x7E, 0x30, 0x4B, 0x82, 0xF4, 0x3F, 0x9C,
+ 0x53, 0xF5, 0xC8, 0xF6, 0xA1, 0xAB, 0x39, 0xD2, 0x01, 0xD5, 0xEA, 0x01, 0xFF, 0x75, 0xFD, 0x23,
+ 0x63, 0xBE, 0x4C, 0x70, 0xC0, 0xF6, 0x78, 0xED, 0x83, 0x79, 0x19, 0x33, 0x58, 0xEA, 0x73, 0xC4,
+ 0xE9, 0x0E, 0xF6, 0x89, 0x3C, 0xD4, 0x0C, 0xF6, 0xBE, 0xAC, 0x81, 0x32, 0x70, 0x24, 0x7D, 0xEA,
+ 0x70, 0xBF, 0xC4, 0x45, 0x56, 0x8C, 0x49, 0x91, 0xA4, 0x04, 0x76, 0x84, 0x5B, 0x43, 0x11, 0x72,
+ 0x74, 0x1C, 0xF5, 0xEB, 0x93, 0x42, 0x87, 0x1D, 0x6B, 0x16, 0x9F, 0xAD, 0xCA, 0x9B, 0xD3, 0x1F,
+ 0x78, 0x1A, 0x0A, 0xC5, 0x7D, 0x44, 0xD2, 0xDE, 0x91, 0x0C, 0x3E, 0x12, 0x74, 0xDF, 0x92, 0xF7,
+ 0x96, 0xD3, 0x6E, 0x76, 0xD6, 0x98, 0x48, 0x78, 0x77, 0x92, 0xC9, 0x45, 0xD8, 0x75, 0xB3, 0x84,
+ 0xDC, 0x1A, 0x2A, 0x0E, 0xAF, 0xD8, 0xB2, 0x6D, 0x88, 0x60, 0xEE, 0x77, 0x4A, 0xFE, 0x4B, 0xC1,
+ 0x2E, 0x27, 0x4C, 0x4F, 0x31, 0x51, 0x5B, 0x92, 0x75, 0xC2, 0x41, 0x7F, 0xB0, 0x43, 0x09, 0xC7,
+ 0xBA, 0xB0, 0xB3, 0x9B, 0x27, 0x3D, 0xD4, 0x10, 0x59, 0xD3, 0x4F, 0xB8, 0x7C, 0xFF, 0xC8, 0x4C,
+ 0x06, 0xCA, 0xB4, 0x5C, 0x37, 0xA4, 0xCD, 0x12, 0x60, 0x5C, 0x15, 0xB2, 0xA2, 0xAA, 0x81, 0x1A,
+ 0x17, 0x7D, 0xD9, 0xF6, 0x31, 0xD6, 0xEB, 0xE7, 0xE7, 0x16, 0x85, 0x36, 0x3C, 0xE3, 0x57, 0x76,
+ 0xAC, 0x35, 0xE3, 0xEC, 0x0F, 0xB7, 0x9B, 0xD5, 0xD1, 0x8E, 0x63, 0x7F, 0x1A, 0xB8, 0x23, 0x02,
+ 0x50, 0x62, 0x06, 0xBF, 0xE5, 0x14, 0x2D, 0xED, 0xF0, 0x68, 0xEF, 0x8B, 0x82, 0x35, 0x29, 0x8A,
+ 0xE1, 0x64, 0x14, 0xFB, 0xAA, 0x4B, 0xE3, 0x2B, 0x91, 0x6A, 0x1D, 0x8E, 0xB2, 0x60, 0xC1, 0xC4,
+ 0x5A, 0x0B, 0xA5, 0xD6, 0xA1, 0xE8, 0x91, 0x97, 0xA1, 0x51, 0xBD, 0x81, 0xD0, 0xB5, 0x7F, 0x69,
+ 0x4A, 0xA8, 0x5D, 0xB5, 0x36, 0x55, 0x22, 0xE2, 0x7E, 0x1C, 0x53, 0xE2, 0x5B, 0x57, 0x17, 0x62,
+ 0x96, 0xC8, 0x7E, 0x31, 0xCB, 0xE0, 0xC6, 0x71, 0x5E, 0xC1, 0xB9, 0xD6, 0x54, 0x22, 0x49, 0xEF,
+ 0xDD, 0x50, 0xB0, 0x88, 0xC0, 0x0F, 0x16, 0xE7, 0xD6, 0xBA, 0x9A, 0x08, 0xAC, 0xD6, 0x78, 0xDA,
+ 0x80, 0xDF, 0x7D, 0x69, 0x97, 0xD4, 0xA7, 0x97, 0xFA, 0xDF, 0x76, 0x54, 0xE4, 0x3B, 0x1D, 0xF1,
+ 0x98, 0xC4, 0x68, 0xA6, 0xE8, 0x0B, 0x27, 0xE1, 0x0C, 0x2C, 0xC2, 0x8F, 0x88, 0xB3, 0x31, 0xFF,
+ 0x3A, 0xDB, 0x90, 0x1C, 0x59, 0x2A, 0x88, 0x54, 0x26, 0x7E, 0xCB, 0xFF, 0x73, 0x99, 0xE5, 0xCF,
+ 0x31, 0x8B, 0x69, 0xDB, 0x8F, 0x28, 0x4D, 0x3B, 0x2F, 0x63, 0xC8, 0xEB, 0x61, 0x3E, 0x95, 0xBC,
+ 0x8B, 0x5C, 0x1C, 0xCA, 0xED, 0x43, 0xDF, 0x1A, 0x94, 0xF4, 0xF1, 0xF2, 0x7D, 0x37, 0x71, 0xC2,
+ 0x28, 0xE7, 0xFE, 0x69, 0x69, 0x3B, 0x6D, 0x31, 0x3A, 0xE7, 0x0F, 0x26, 0xCE, 0xCD, 0x19, 0xA5,
+ 0xE0, 0x66, 0x29, 0x54, 0x65, 0x43, 0x43, 0xB9, 0x22, 0x86, 0x0E, 0x2E, 0xD5, 0x63, 0x55, 0xA8,
+ 0x78, 0x05, 0x54, 0xE3, 0x1E, 0xEC, 0x01, 0x67, 0xB4, 0x22, 0xFC, 0x18, 0xDB, 0x53, 0x6F, 0x97,
+ 0xC0, 0xEB, 0x58, 0x57, 0x49, 0xDC, 0xBD, 0x76, 0xCA, 0x00, 0x46, 0xE3, 0x7F, 0x4D, 0x53, 0xAC,
+ 0xDC, 0x77, 0xF3, 0xAF, 0x4F, 0x5A, 0x85, 0xC8, 0x37, 0x2B, 0x41, 0x63, 0x6F, 0xD7, 0x25, 0x61,
+ 0x6D, 0x09, 0x9C, 0xEB, 0x43, 0xE2, 0xE8, 0x49, 0x72, 0xCD, 0x8E, 0x1C, 0xD0, 0x8E, 0xD3, 0x96,
+ 0x1F, 0x98, 0xAA, 0x2B, 0xF6, 0x47, 0x4D, 0x92, 0x2A, 0xAA, 0x41, 0xA5, 0xA9, 0x71, 0xFE, 0x6C,
+ 0x43, 0x7E, 0xB8, 0x21, 0x4A, 0x58, 0xA4, 0xF7, 0x5D, 0xF8, 0x44, 0xC4, 0xE8, 0x9A, 0xA7, 0xB9,
+ 0xAC, 0x97, 0xD4, 0x8D, 0xA6, 0xC4, 0x04, 0x43, 0x30, 0x21, 0x54, 0x16, 0x92, 0x49, 0x77, 0x7D,
+ 0xEA, 0xD1, 0x1F, 0xB4, 0x75, 0xF4, 0x1F, 0x73, 0xD0, 0xEA, 0x0F, 0xA6, 0x60, 0x4B, 0xE9, 0xDE,
+ 0x79, 0x4C, 0xFF, 0xD9, 0xAB, 0x9D, 0xA6, 0x92, 0xE8, 0x64, 0x25, 0x2F, 0x75, 0x97, 0x5C, 0x7A,
+ 0x7E, 0xF1, 0x5A, 0xE1, 0x6D, 0xD7, 0x16, 0x5A, 0x42, 0x83, 0x43, 0xDD, 0x8D, 0x22, 0xEB, 0xEE,
+ 0x63, 0xB0, 0x73, 0x67, 0x83, 0x1E, 0xF8, 0x7C, 0xB6, 0x5B, 0xA5, 0xF9, 0xD1, 0xFF, 0x8A, 0xAD,
+ 0x9A, 0x75, 0x4A, 0x3D, 0x37, 0x67, 0x40, 0x78, 0xD5, 0x2A, 0xB3, 0xBE, 0xF3, 0x66, 0x3F, 0x51,
+ 0x94, 0x79, 0x2D, 0x98, 0xB7, 0x29, 0x81, 0x9B, 0xC3, 0xC4, 0x28, 0x38, 0xB3, 0x99, 0x84, 0xBA,
+ 0x50, 0x15, 0x66, 0x68, 0x40, 0x3D, 0xCD, 0xAF, 0x3B, 0xF3, 0x1F, 0xD1, 0xE4, 0x17, 0x80, 0x74,
+ 0xE3, 0x14, 0xBF, 0xB3, 0x3D, 0xC3, 0xC2, 0x07, 0x1E, 0x74, 0x57, 0x96, 0xDF, 0xE4, 0x62, 0xBA,
+ 0x4C, 0x57, 0x47, 0x0A, 0x09, 0xC2, 0x46, 0x81, 0xF5, 0xBB, 0x77, 0x34, 0x49, 0x3B, 0xBB, 0x02,
+ 0xDC, 0xF1, 0x15, 0x99, 0x15, 0xB8, 0xF0, 0xD2, 0x28, 0xD5, 0xC8, 0x79, 0xAB, 0xAF, 0xF8, 0x83,
+ 0xE3, 0x57, 0x9A, 0x5E, 0xC0, 0x0C, 0x72, 0x2E, 0xD8, 0xB7, 0xDE, 0xAB, 0x27, 0x49, 0xEC, 0x4E,
+ 0x8E, 0xB0, 0x49, 0x65, 0xDD, 0x2F, 0x56, 0xA4, 0xBE, 0x04, 0x90, 0x9C, 0xCA, 0x76, 0x5F, 0x59,
+ 0x94, 0x99, 0x5F, 0x97, 0xFD, 0xA7, 0x38, 0xD2, 0x7F, 0x53, 0xBC, 0x7B, 0x0F, 0x6F, 0xC9, 0xE5,
+ 0x3A, 0x0F, 0x94, 0x2C, 0xBA, 0x85, 0x6D, 0xAE, 0xF7, 0x21, 0x6A, 0x64, 0xFD, 0xAA, 0x65, 0xD8,
+ 0x30, 0xB3, 0x0A, 0x6C, 0x91, 0xC6, 0xB6, 0x29, 0x8D, 0x68, 0xC7, 0x1A, 0x06, 0x9C, 0x58, 0x30,
+ 0x3C, 0xF2, 0xC6, 0x15, 0xD3, 0x8A, 0xC9, 0xA0, 0x4D, 0x56, 0x88, 0xC7, 0xC2, 0x4E, 0x47, 0x87,
+ 0x9F, 0x20, 0x13, 0x6C, 0xEF, 0xC4, 0x6D, 0x31, 0x47, 0xB3, 0xEB, 0xBC, 0x61, 0x11, 0xE1, 0xA1,
+ 0xD8, 0x6E, 0x2B, 0x5C, 0xC1, 0xFD, 0xC3, 0x75, 0xBF, 0x70, 0xBC, 0x77, 0x4E, 0x47, 0x65, 0xE5,
+ 0xEC, 0xDD, 0x70, 0x24, 0x63, 0xA9, 0xD6, 0x9C, 0xA9, 0x0C, 0x86, 0xDB, 0xC0, 0x3D, 0x96, 0x65,
+ 0xA4, 0x9D, 0x89, 0xF1, 0xB1, 0x65, 0x16, 0x29, 0x3E, 0x8C, 0x97, 0xC0, 0x73, 0xED, 0xD1, 0x96,
+ 0x84, 0x17, 0x8D, 0x66, 0x8E, 0x7F, 0x47, 0xD1, 0x64, 0x7F, 0x83, 0x54, 0xE6, 0xD3, 0xA0, 0x6E,
+ 0xB7, 0xB0, 0xA5, 0x7E, 0x8E, 0xFE, 0xBD, 0xA9, 0xDE, 0x0B, 0x7E, 0xE9, 0x68, 0x82, 0x2B, 0x59,
+ 0xF2, 0xA2, 0x45, 0x86, 0x84, 0xEF, 0x04, 0x18, 0x6E, 0x5F, 0x5D, 0x21, 0xED, 0x8B, 0xAE, 0x65,
+ 0x0A, 0xC4, 0xD0, 0xD8, 0x2A, 0x9E, 0x81, 0x85, 0x78, 0x2B, 0x4E, 0x11, 0x47, 0xC6, 0x60, 0x31,
+ 0x63, 0xB1, 0x9A, 0xEB, 0x55, 0x34, 0x98, 0x27, 0x9E, 0xCC, 0x7D, 0x28, 0x1B, 0xF9, 0xFF, 0x4D,
+ 0x14, 0xF1, 0x48, 0x88, 0x8C, 0x26, 0xDE, 0x1F, 0xF3, 0xE0, 0xCB, 0xD1, 0x4A, 0x06, 0x0C, 0xE0,
+ 0x79, 0x07, 0x6F, 0x01, 0xF6, 0x0F, 0x7B, 0x6E, 0x9E, 0x21, 0x0A, 0x7C, 0x8D, 0xDC, 0xAB, 0xE9,
+ 0xDB, 0xCB, 0xC8, 0x68, 0x4F, 0x20, 0xBB, 0xDB, 0xF6, 0x3A, 0xEC, 0xD4, 0x52, 0x6F, 0xDF, 0xFF,
+ 0x39, 0xAB, 0x30, 0xF9, 0xBF, 0xCB, 0xC6, 0xC6, 0x63, 0x6B, 0xFE, 0x38, 0xF8, 0x50, 0x56, 0x00,
+ 0x23, 0xF9, 0xB7, 0x33, 0xE2, 0x93, 0x0A, 0x4A, 0xA1, 0x20, 0x85, 0xEC, 0x88, 0x0E, 0x83, 0x57,
+ 0x25, 0x38, 0x91, 0x48, 0x99, 0x0D, 0xAA, 0x28, 0xEA, 0xBF, 0x66, 0x01, 0xC5, 0x08, 0xFF, 0xC6,
+ 0x78, 0x37, 0x36, 0x51, 0x0B, 0xF0, 0x63, 0x74, 0xC5, 0x3E, 0x14, 0x9C, 0xE4, 0x4B, 0x3A, 0x71,
+ 0x02, 0x96, 0x3F, 0x56, 0xF0, 0x9C, 0xCA, 0x9C, 0xAB, 0xA7, 0x86, 0x7E, 0xB0, 0x9E, 0xFB, 0x58,
+ 0xDE, 0xE5, 0x6E, 0x47, 0xEE, 0x80, 0x39, 0x52, 0xD9, 0xCA, 0xE6, 0xC9, 0xA7, 0x9C, 0x89, 0xB0,
+ 0x52, 0x68, 0xAB, 0x4B, 0x3F, 0x86, 0xD3, 0x11, 0xE6, 0xFC, 0x2C, 0x77, 0x8C, 0x5C, 0x6E, 0x19,
+ 0xD8, 0x53, 0x95, 0xA4, 0x46, 0x08, 0xAC, 0x7D, 0x5D, 0xFB, 0xDE, 0x6C, 0x4D, 0x45, 0xA3, 0x41,
+ 0x9D, 0xCE, 0xC5, 0xB1, 0x49, 0xBD, 0x06, 0xF6, 0x74, 0x2F, 0x82, 0xF6, 0x91, 0x4D, 0xDE, 0x8A,
+ 0x2D, 0xD8, 0xAF, 0x17, 0xFB, 0xC8, 0x85, 0xE2, 0x19, 0x39, 0xDD, 0x1B, 0x58, 0x2B, 0x4F, 0xB6,
+ 0xED, 0x32, 0x35, 0xF6, 0xEB, 0x12, 0xCE, 0x7F, 0xD1, 0x3C, 0xF1, 0x6E, 0xC4, 0xE5, 0xBA, 0x6E,
+ 0x92, 0xF7, 0x36, 0xF0, 0x84, 0xB3, 0x36, 0xFE, 0x89, 0x4C, 0xFE, 0xA7, 0x9D, 0x73, 0x98, 0x28,
+ 0xBB, 0x01, 0x5A, 0x9B, 0x76, 0x6C, 0x82, 0x81, 0x55, 0x3B, 0xA9, 0x42, 0xD7, 0x7A, 0x37, 0x0C,
+ 0x3E, 0x1D, 0x6D, 0xB6, 0xF8, 0xD7, 0xA5, 0xAC, 0x5A, 0xBF, 0x83, 0x16, 0x10, 0x2B, 0x2F, 0x25,
+ 0x2D, 0x28, 0x7F, 0xD3, 0xB4, 0xC3, 0x54, 0x1D, 0x7E, 0x36, 0xF1, 0x00, 0x80, 0xD5, 0x50, 0xA0,
+ 0xB7, 0x81, 0xAB, 0x6E, 0xA9, 0xEF, 0x7F, 0xB2, 0x1E, 0xA5, 0xE4, 0x62, 0x06, 0x49, 0xB3, 0xA8,
+ 0x61, 0xD2, 0x6C, 0xED, 0x4B, 0xF7, 0xAD, 0xD3, 0x4C, 0x1F, 0x23, 0xB1, 0x5B, 0x54, 0x1B, 0xA5,
+ 0xAA, 0x5F, 0x92, 0x6D, 0x6D, 0x23, 0xB2, 0x5F, 0x73, 0xC5, 0x1A, 0x1E, 0xD9, 0x17, 0xE5, 0x19,
+ 0xAF, 0x30, 0x9B, 0x77, 0x0D, 0xF5, 0xC4, 0xAF, 0xDF, 0x57, 0x72, 0x25, 0xAE, 0xA6, 0x63, 0xFD,
+ 0xB3, 0xAF, 0x73, 0x1B, 0x37, 0x12, 0x1F, 0x4C, 0x62, 0x93, 0xC3, 0x3B, 0x07, 0x59, 0xEA, 0x82,
+ 0xB5, 0x4D, 0xCF, 0x90, 0xC7, 0x36, 0x08, 0xA4, 0xE7, 0x69, 0xE5, 0xF9, 0x6E, 0x84, 0x68, 0x6D,
+ 0x2A, 0x00, 0x27, 0x3B, 0x7E, 0xD4, 0x34, 0x6B, 0x1B, 0xFB, 0x0C, 0x8F, 0xF4, 0x03, 0x31, 0x39,
+ 0x79, 0x07, 0x53, 0x04, 0x54, 0xFA, 0x6E, 0x23, 0x0D, 0x95, 0x6D, 0xF9, 0x7D, 0xCA, 0x1B, 0x08,
+ 0xDE, 0xD9, 0xC0, 0xFE, 0x99, 0x76, 0x8A, 0xE4, 0x41, 0x33, 0x6F, 0x83, 0xC1, 0x55, 0xDA, 0xE7,
+ 0x23, 0xA4, 0x56, 0x0A, 0xC5, 0x06, 0x1E, 0x0D, 0xB1, 0x7F, 0x5B, 0xDB, 0x9A, 0xE5, 0x39, 0x28,
+ 0x3B, 0x41, 0xC6, 0x22, 0xAC, 0x23, 0x09, 0x43, 0x3B, 0x16, 0xFF, 0x02, 0xC9, 0x3D, 0xC3, 0x53,
+ 0x0E, 0xF9, 0xDB, 0x8A, 0x3B, 0xA0, 0xF5, 0xCC, 0x89, 0x2D, 0x59, 0xFF, 0xB1, 0x39, 0xB1, 0xB4,
+ 0x0E, 0x9C, 0x98, 0x8F, 0x27, 0xF7, 0x6F, 0x91, 0x8B, 0x53, 0x67, 0x8B, 0xA2, 0x5E, 0xC0, 0x17,
+ 0x84, 0x3C, 0x76, 0xD2, 0xB8, 0x9A, 0x10, 0x8D, 0x0B, 0xAE, 0x3E, 0xA9, 0x51, 0x50, 0xC1, 0x94,
+ 0x05, 0xB2, 0x8B, 0x88, 0x67, 0xFE, 0x76, 0x0F, 0xAF, 0xD6, 0x88, 0xFD, 0x38, 0x9F, 0xF8, 0xA9,
+ 0x27, 0xB8, 0xB3, 0x99, 0x97, 0x1A, 0xD6, 0x82, 0x8E, 0x92, 0x8E, 0x85, 0x7B, 0x85, 0xD4, 0x94,
+ 0xF8, 0x4F, 0x9A, 0xF1, 0xC8, 0xE6, 0x9A, 0x1F, 0xC8, 0xA3, 0xD7, 0x87, 0xAD, 0x0C, 0xF8, 0x34,
+ 0x00, 0x7E, 0x30, 0xCC, 0xBE, 0x8E, 0xD9, 0x44, 0xF3, 0xBF, 0x98, 0xCF, 0xBF, 0x0F, 0x78, 0xBA,
+ 0x39, 0xD7, 0x20, 0x94, 0x46, 0x4A, 0xE2, 0x8A, 0xB0, 0x22, 0x5C, 0x8E, 0x43, 0xF8, 0xC3, 0x1D,
+ 0x4F, 0x6B, 0x4A, 0x14, 0x26, 0x9A, 0xD3, 0x10, 0xD4, 0xD3, 0x99, 0xB6, 0xD4, 0xC8, 0x6A, 0x8E,
+ 0x5D, 0x45, 0x09, 0x14, 0x30, 0x28, 0xE6, 0x75, 0xCB, 0x4C, 0x28, 0xB7, 0x27, 0x36, 0x6D, 0x4F,
+ 0xFE, 0x25, 0xCB, 0xD5, 0xAF, 0x0B, 0xA1, 0x61, 0x77, 0x7C, 0x64, 0x28, 0xDB, 0x74, 0x65, 0x2C,
+ 0xA7, 0x88, 0x3F, 0xF8, 0xA0, 0xFC, 0xD3, 0xCF, 0x99, 0x4B, 0xE8, 0xDE, 0xB7, 0x16, 0xA2, 0x80,
+ 0x16, 0x8F, 0xBB, 0x53, 0x27, 0x72, 0x6B, 0x53, 0xAB, 0x80, 0xAB, 0x37, 0xE8, 0x7C, 0x16, 0x31,
+ 0xA9, 0x81, 0xDF, 0x36, 0xD3, 0x69, 0xD9, 0xA1, 0xA9, 0x4B, 0x8F, 0x1F, 0x85, 0x64, 0x6E, 0x4D,
+ 0x39, 0x79, 0x47, 0x87, 0xF3, 0x0B, 0xB9, 0xF9, 0xE1, 0xF7, 0x6E, 0x5F, 0x29, 0x0B, 0x32, 0xEE,
+ 0xBA, 0x79, 0x01, 0x34, 0x1F, 0x1C, 0xF0, 0x03, 0xEE, 0x96, 0x2F, 0x76, 0x4E, 0x2E, 0x0F, 0xD1,
+ 0x8B, 0x94, 0x61, 0x9B, 0x33, 0x16, 0xFD, 0xA7, 0x37, 0x6F, 0x6D, 0x6C, 0x5B, 0xCA, 0xA4, 0x9F,
+ 0x19, 0x69, 0x4E, 0x17, 0xEC, 0x02, 0xE6, 0x49, 0xAA, 0x7E, 0x8E, 0xC0, 0xE9, 0x15, 0x54, 0x2F,
+ 0xA6, 0x01, 0xE9, 0x27, 0x9F, 0x2E, 0x9D, 0x85, 0x4D, 0xFF, 0x3E, 0x78, 0x0B, 0x14, 0xAC, 0x19,
+ 0x78, 0x30, 0xCF, 0xA0, 0x24, 0x01, 0x7B, 0x1D, 0x82, 0x43, 0x02, 0xAC, 0xF7, 0x6C, 0x0C, 0xA9,
+ 0xC7, 0x74, 0xE3, 0x8E, 0x15, 0xC1, 0xF2, 0xAD, 0x9D, 0x58, 0xDA, 0x50, 0x93, 0x69, 0x4F, 0x74,
+ 0x5A, 0xD2, 0xB5, 0xA0, 0x06, 0x08, 0x9D, 0xC0, 0x0F, 0x27, 0x2B, 0x19, 0x82, 0x41, 0x27, 0x32,
+ 0x66, 0xBC, 0xAA, 0x4E, 0x90, 0x44, 0x88, 0x33, 0x6E, 0x60, 0xBC, 0x7C, 0xDA, 0x29, 0x04, 0x94,
+ 0x19, 0xF7, 0xD8, 0x5E, 0x99, 0x7F, 0xEF, 0xA8, 0xBD, 0x3A, 0xE0, 0x6A, 0xB6, 0xA8, 0x00, 0x15,
+ 0x29, 0x04, 0xF1, 0x41, 0x3F, 0x2B, 0xF7, 0x59, 0x3E, 0x8E, 0xAB, 0x8D, 0x84, 0x26, 0x2D, 0xC2,
+ 0xAD, 0xA7, 0x33, 0x6C, 0x08, 0xCA, 0xB4, 0x8A, 0xF8, 0x5E, 0xD7, 0x6A, 0x5B, 0x92, 0xCE, 0x70,
+ 0x23, 0x01, 0x54, 0x88, 0xDB, 0xD7, 0xF5, 0x24, 0xED, 0xA8, 0x49, 0xDB, 0x5C, 0x4C, 0x25, 0xE1,
+ 0xBB, 0xC7, 0x5E, 0x0D, 0x05, 0x0B, 0xD0, 0x26, 0x4F, 0x1D, 0xE4, 0xD6, 0xEB, 0x38, 0x30, 0xC5,
+ 0x3F, 0x50, 0xB1, 0x46, 0x91, 0x01, 0x7A, 0xE3, 0x01, 0xD1, 0x17, 0x29, 0x4B, 0x56, 0x34, 0xAC,
+ 0x72, 0xA0, 0xA5, 0x0C, 0xBB, 0x69, 0x93, 0x3D, 0x39, 0xE4, 0x8A, 0x94, 0x2C, 0xD9, 0xD0, 0x24,
+ 0x24, 0x1C, 0x60, 0xA9, 0x79, 0xD6, 0xF2, 0x33, 0xBD, 0xB3, 0x7A, 0x61, 0x55, 0x7F, 0x66, 0xEF,
+ 0xC5, 0xC8, 0xE7, 0x60, 0xFC, 0xA5, 0xAF, 0x44, 0x34, 0x7E, 0x30, 0x17, 0xC5, 0xB1, 0xC4, 0x35,
+ 0xC7, 0x62, 0xBF, 0xA4, 0x6C, 0xD9, 0xD2, 0x86, 0xD7, 0xD7, 0x48, 0x5C, 0x8A, 0x67, 0x76, 0xFF,
+ 0xBE, 0x34, 0x5B, 0x4E, 0x20, 0xD9, 0x9F, 0xB9, 0xD4, 0x94, 0x30, 0x22, 0x6B, 0xA9, 0x01, 0xBC,
+ 0x7B, 0xEF, 0x35, 0xBD, 0x7D, 0x18, 0x68, 0x5B, 0x1D, 0x4A, 0xF5, 0x11, 0x57, 0x1D, 0xE3, 0x66,
+ 0x8C, 0xA8, 0x40, 0xD9, 0xFA, 0x55, 0xB8, 0x83, 0xE9, 0x2C, 0xDE, 0x0E, 0xBA, 0xE2, 0x16, 0xEF,
+ 0xA6, 0xE3, 0x5E, 0xA6, 0xD9, 0x1F, 0x17, 0x97, 0xCE, 0x78, 0xAC, 0x8A, 0xA0, 0x5C, 0x51, 0x2D,
+ 0xF4, 0xDE, 0xCE, 0x14, 0x57, 0xA0, 0x3A, 0x36, 0x0C, 0xAB, 0xF9, 0xEB, 0xC0, 0x91, 0x57, 0xED,
+ 0x21, 0x3D, 0x39, 0x87, 0x61, 0x93, 0x8E, 0x3E, 0x55, 0x3A, 0x7A, 0x2F, 0x1B, 0xA1, 0x00, 0x89,
+ 0xB5, 0xF7, 0x1C, 0xE0, 0x08, 0x74, 0x00, 0xD8, 0x9B, 0x4A, 0x74, 0x37, 0xE6, 0x24, 0xDB, 0x7B,
+ 0xAE, 0xA9, 0xF8, 0x92, 0x35, 0x44, 0x3A, 0x0B, 0xDB, 0xB7, 0xED, 0x65, 0xAA, 0x5F, 0x7F, 0xE3,
+ 0x35, 0xD5, 0x2D, 0x24, 0x74, 0x53, 0xA6, 0x1D, 0x55, 0x60, 0x1F, 0xB6, 0x22, 0x9C, 0x14, 0xBA,
+ 0x63, 0x52, 0x7F, 0x88, 0xF9, 0x90, 0xBC, 0xE9, 0xDB, 0x80, 0xB5, 0x00, 0x2B, 0x12, 0x50, 0xE4,
+ 0x10, 0xC9, 0xBB, 0x18, 0x76, 0x06, 0x8A, 0x93, 0xD3, 0x0B, 0xE4, 0xCB, 0x2E, 0x5C, 0xA3, 0x42,
+ 0xC5, 0xFF, 0xCF, 0x9D, 0x53, 0xD1, 0x6B, 0xE7, 0x10, 0x7D, 0x9F, 0x3C, 0xC3, 0xF9, 0xB1, 0x5B,
+ 0x8A, 0x15, 0x56, 0x63, 0xD5, 0x27, 0x40, 0x1E, 0x01, 0x1A, 0xDC, 0x0C, 0x6B, 0x7D, 0x42, 0x91,
+ 0xDD, 0x63, 0x9D, 0x1A, 0xA9, 0xA8, 0xB0, 0xC5, 0xE4, 0x4A, 0x79, 0x4B, 0x04, 0x29, 0xDF, 0x22,
+ 0x59, 0xC1, 0xF3, 0xAB, 0x09, 0x00, 0x51, 0xEE, 0x3A, 0x96, 0xE1, 0x7B, 0xDB, 0xC2, 0x36, 0x41,
+ 0x60, 0xB1, 0x84, 0x74, 0x76, 0xB4, 0xA0, 0xD2, 0x2F, 0x95, 0x5A, 0x89, 0x42, 0xB7, 0x57, 0xCD,
+ 0xFB, 0x3E, 0x5B, 0x33, 0xDC, 0x0A, 0x62, 0x18, 0x0F, 0x98, 0x71, 0x9B, 0xE6, 0x74, 0x19, 0x39,
+ 0xF6, 0xFF, 0x69, 0x4B, 0x5C, 0x24, 0x18, 0xF9, 0x3A, 0xD5, 0x70, 0x1F, 0x7B, 0x5D, 0xAC, 0x01,
+ 0xE9, 0xFE, 0xC2, 0x9E, 0xB5, 0x28, 0xB2, 0xFF, 0x5A, 0xCB, 0xA2, 0x1A, 0xF2, 0xEA, 0x7D, 0xA0,
+ 0x7A, 0xCC, 0x89, 0xEB, 0x0A, 0x1C, 0x81, 0x2B, 0x8F, 0xF3, 0x2D, 0xF5, 0x67, 0x58, 0xF9, 0x10,
+ 0x3A, 0x8F, 0x9E, 0x0A, 0x04, 0xAD, 0x7F, 0xB2, 0x2D, 0xCB, 0xCC, 0x3D, 0x84, 0x38, 0x46, 0x1B,
+ 0x9A, 0xE1, 0xAA, 0xB2, 0x7E, 0xA7, 0xF3, 0x5E, 0x43, 0x7B, 0x67, 0x7F, 0xC8, 0x0F, 0x45, 0xC0,
+ 0xB8, 0xEE, 0xE6, 0x68, 0x16, 0x1E, 0xBF, 0x14, 0xA5, 0xD1, 0xDA, 0x12, 0x7F, 0x42, 0x3B, 0x18,
+ 0xD3, 0x85, 0x8A, 0xEB, 0x2A, 0x47, 0xCF, 0xEB, 0x85, 0xFB, 0xA5, 0x10, 0x98, 0x4C, 0x56, 0x4B,
+ 0x63, 0x8A, 0x86, 0xD9, 0x98, 0x36, 0xB5, 0x2B, 0x4A, 0xA1, 0xC9, 0x2B, 0x7F, 0xF9, 0xC9, 0x29,
+ 0x9C, 0x90, 0xFE, 0x58, 0x2B, 0x85, 0xD8, 0x01, 0x93, 0x0E, 0x2A, 0x5B, 0x0E, 0xCA, 0xD6, 0xB6,
+ 0x8F, 0xE1, 0x49, 0x9C, 0x49, 0xEE, 0x83, 0xAD, 0x28, 0x33, 0x94, 0xFB, 0xA9, 0x2B, 0x47, 0x35,
+ 0xCF, 0xBD, 0x1F, 0x06, 0xFB, 0x9E, 0x70, 0xA4, 0xEC, 0x26, 0x79, 0x36, 0x3F, 0x67, 0xCF, 0x71,
+ 0x61, 0x00, 0x35, 0xD8, 0xB2, 0x3B, 0x03, 0x02, 0xD7, 0x80, 0x69, 0xE3, 0x22, 0x5F, 0x57, 0xD6,
+ 0x0A, 0x12, 0x77, 0xBB, 0x51, 0x93, 0xAC, 0xBF, 0x8A, 0xDC, 0x88, 0x48, 0x77, 0x5F, 0xD9, 0x40,
+ 0x01, 0x93, 0x83, 0xAD, 0x71, 0x32, 0xFA, 0xF8, 0xF7, 0x1D, 0x81, 0xE2, 0x6B, 0xB9, 0x39, 0xE3,
+ 0xB7, 0x4C, 0x22, 0xEA, 0x38, 0x1B, 0xF5, 0x03, 0x9D, 0xBC, 0x5A, 0x81, 0xA5, 0x87, 0xB8, 0x8D,
+ 0x91, 0x59, 0xA8, 0xBE, 0xB0, 0x47, 0x68, 0x14, 0x70, 0xC2, 0xE0, 0x65, 0xBA, 0x4B, 0xF4, 0x18,
+ 0x7E, 0xDD, 0xDD, 0x6B, 0xE2, 0xE1, 0x95, 0x14, 0xA0, 0x3E, 0x26, 0xA5, 0x43, 0x54, 0x51, 0xFE,
+ 0x26, 0x24, 0x90, 0xA3, 0x32, 0xB3, 0xE6, 0xB4, 0x8D, 0xF0, 0x7A, 0x77, 0x76, 0x2E, 0xE1, 0x0B,
+ 0x32, 0x44, 0x7B, 0x5F, 0x6B, 0x3F, 0x3C, 0x1E, 0x03, 0x0C, 0x49, 0x6E, 0x22, 0x5B, 0x18, 0x5F,
+ 0x49, 0x72, 0xDA, 0x3E, 0xB4, 0xB8, 0xA4, 0xE4, 0xB9, 0xED, 0xAA, 0xC6, 0xAB, 0xB1, 0x69, 0x80,
+ 0x55, 0xCD, 0x9C, 0xDF, 0x03, 0xC1, 0x24, 0xEC, 0xA7, 0xA1, 0x8C, 0x15, 0x6C, 0x1B, 0x3B, 0xBA,
+ 0xA5, 0xCF, 0xDF, 0x7B, 0x38, 0x81, 0xDF, 0x40, 0xF1, 0xA4, 0x03, 0x7B, 0x57, 0xAD, 0x75, 0x96,
+ 0xE9, 0xC2, 0xEE, 0x76, 0x90, 0x81, 0x3E, 0xE8, 0xD3, 0x23, 0x9B, 0x96, 0x3E, 0xF6, 0xF8, 0xFE,
+ 0xC5, 0x52, 0xA3, 0xBB, 0x68, 0x98, 0xFF, 0x92, 0xE7, 0xED, 0xC1, 0xDD, 0xF8, 0x6C, 0xC5, 0xBC,
+ 0xC4, 0x6A, 0x50, 0x53, 0x95, 0x28, 0x1D, 0x8D, 0x84, 0x90, 0xEE, 0xB0, 0x27, 0x4C, 0xE9, 0x7C,
+ 0x2E, 0x46, 0x94, 0xF5, 0xE3, 0xBB, 0xEB, 0x9F, 0x6E, 0xD1, 0x6B, 0x6F, 0x83, 0xCB, 0x2A, 0x5A,
+ 0x22, 0xAC, 0x67, 0xE4, 0x5C, 0xF9, 0x57, 0x20, 0x42, 0xA7, 0xA6, 0x89, 0x22, 0x08, 0x68, 0x92,
+ 0x64, 0x1B, 0x4B, 0x82, 0xD3, 0x62, 0xE6, 0x80, 0xAC, 0x84, 0x36, 0x19, 0x24, 0x55, 0x02, 0x4C,
+ 0x79, 0x32, 0xAD, 0x22, 0xF4, 0xE0, 0x46, 0x7B, 0x8B, 0x96, 0x9A, 0xEC, 0xC7, 0x67, 0xA1, 0x21,
+ 0x8F, 0x5C, 0x48, 0xFC, 0x52, 0xC7, 0x33, 0xA8, 0x22, 0xA0, 0x3D, 0x72, 0x44, 0x7E, 0xEB, 0x8F,
+ 0x19, 0xBE, 0x54, 0x98, 0x96, 0x91, 0xA2, 0xCA, 0x72, 0xA6, 0xAE, 0x5E, 0xA8, 0xA6, 0xC9, 0x14,
+ 0xB3, 0x09, 0xA4, 0x2B, 0x3B, 0xF8, 0x13, 0x13, 0x1D, 0x51, 0xDC, 0x93, 0x37, 0x1B, 0xFC, 0x18,
+ 0xF9, 0xA4, 0xFA, 0x57, 0x3E, 0x8D, 0xF7, 0xF0, 0xD8, 0xBF, 0x8D, 0x83, 0x3F, 0x9B, 0x5A, 0x73,
+ 0x63, 0x82, 0x56, 0x94, 0x2E, 0x02, 0x62, 0x61, 0x01, 0x3C, 0x20, 0x86, 0x44, 0xCA, 0xF8, 0xB7,
+ 0x2D, 0xDA, 0x99, 0x25, 0xD7, 0x16, 0xE1, 0xEB, 0x71, 0xEB, 0x16, 0xBC, 0xEB, 0x2F, 0x93, 0x6D,
+ 0x9F, 0xD2, 0xD0, 0xE8, 0xD4, 0xDD, 0x70, 0x8A, 0x2E, 0x82, 0xF6, 0x23, 0xF3, 0x11, 0x53, 0xC5,
+ 0xE3, 0x87, 0x06, 0xF9, 0xE6, 0x0A, 0xEE, 0xBA, 0x7B, 0x2C, 0x03, 0xBB, 0x59, 0x60, 0x1E, 0xD2,
+ 0x55, 0x43, 0xE6, 0xC1, 0x0C, 0x9E, 0x8A, 0x3A, 0x69, 0xEB, 0x0F, 0x9E, 0x34, 0x3D, 0x48, 0x5D,
+ 0xB4, 0xC1, 0xC0, 0xEF, 0x50, 0x0E, 0xC6, 0x4A, 0xFB, 0xAC, 0x5F, 0x05, 0x03, 0x39, 0xDE, 0x3C,
+ 0x09, 0xF4, 0x29, 0xC9, 0x62, 0x90, 0xFB, 0x0F, 0x78, 0x66, 0x31, 0x06, 0x2D, 0xE4, 0x1D, 0x4A,
+ 0x80, 0xF0, 0x9E, 0x33, 0xBE, 0x89, 0x35, 0x8F, 0x5D, 0xC0, 0x86, 0x0B, 0xCF, 0x4B, 0xE0, 0xF8,
+ 0xEF, 0x43, 0x69, 0x3D, 0x0D, 0xF7, 0x74, 0xC0, 0x42, 0x3A, 0x87, 0x44, 0x1D, 0xE4, 0x15, 0x82,
+ 0x54, 0x13, 0xCB, 0x05, 0xFD, 0x1D, 0xE1, 0x34, 0x97, 0x91, 0xFB, 0x4B, 0x9F, 0xB8, 0x42, 0xAC,
+ 0x9C, 0x97, 0x01, 0x26, 0x38, 0x76, 0xC5, 0x94, 0xCF, 0xA0, 0xA3, 0x18, 0x1D, 0x4C, 0x10, 0x63,
+ 0xEE, 0x20, 0x6A, 0xAD, 0xFD, 0x85, 0xCF, 0x00, 0x9E, 0x3D, 0x63, 0xE9, 0x7F, 0x73, 0x30, 0x65,
+ 0x39, 0xF4, 0x5C, 0x25, 0xE5, 0x64, 0x80, 0xE3, 0x42, 0x04, 0xCE, 0x25, 0xCB, 0x4B, 0x7C, 0x47,
+ 0x09, 0x76, 0x1B, 0x92, 0xFA, 0x1E, 0x50, 0x66, 0x87, 0x24, 0x9B, 0x12, 0x77, 0x9B, 0xC0, 0x6E,
+ 0x26, 0xC8, 0x29, 0x11, 0x29, 0x6E, 0xEC, 0x13, 0x83, 0x7B, 0xD4, 0x73, 0xDE, 0x86, 0x00, 0x08,
+ 0xD0, 0xD5, 0xA1, 0xD0, 0xCB, 0xBF, 0x05, 0x1C, 0xBC, 0xBD, 0x6F, 0x65, 0x69, 0x45, 0x22, 0xFF,
+ 0xBD, 0x0F, 0x02, 0xC0, 0xFC, 0x9B, 0x68, 0x4A, 0xC0, 0x60, 0xA4, 0x9E, 0x40, 0x50, 0xC5, 0xD2,
+ 0x76, 0x08, 0x7E, 0x58, 0xB7, 0xE2, 0x4F, 0xA2, 0xCB, 0x0B, 0xA2, 0x56, 0x10, 0xAF, 0x40, 0xA9,
+ 0xF1, 0x89, 0x77, 0xD6, 0xE8, 0xD5, 0x07, 0x9A, 0x77, 0x4D, 0x44, 0xFE, 0x18, 0x71, 0xCC, 0x4D,
+ 0x1A, 0x20, 0x5C, 0x1B, 0x44, 0x7B, 0x1E, 0xB4, 0x25, 0x2C, 0xDF, 0xE5, 0x47, 0xD4, 0xA0, 0xC7,
+ 0xB1, 0x2E, 0xDA, 0xFA, 0xB1, 0x76, 0xBB, 0xFD, 0xA0, 0x02, 0xEB, 0x4D, 0x04, 0x00, 0xCA, 0xAF,
+ 0x45, 0x83, 0x58, 0xC6, 0x52, 0x71, 0x5A, 0x3D, 0x3C, 0xF7, 0xF2, 0x29, 0xA6, 0xA2, 0xA4, 0xF3,
+ 0xC0, 0x30, 0xE0, 0x61, 0xB2, 0x55, 0x78, 0x2C, 0x57, 0x84, 0xB4, 0x33, 0xB3, 0xF8, 0xD9, 0x57,
+ 0x81, 0x37, 0xA7, 0xC1, 0x14, 0x3F, 0x1C, 0x9B, 0x0B, 0x44, 0x99, 0xDB, 0x7C, 0x0E, 0x87, 0xF2,
+ 0xAC, 0xA6, 0x71, 0xFD, 0xC9, 0x29, 0x2E, 0x3C, 0x67, 0x2C, 0x7F, 0xB2, 0xF7, 0xCB, 0x07, 0x82,
+ 0x54, 0xC8, 0x92, 0x1A, 0x94, 0xEB, 0x46, 0x96, 0x7D, 0xBB, 0x08, 0x70, 0x8C, 0x8E, 0x5F, 0x7F,
+ 0x2F, 0xAF, 0xAA, 0xF3, 0x6A, 0x2B, 0xA9, 0xF8, 0xDC, 0x92, 0x20, 0x9F, 0xC5, 0xFC, 0x18, 0xED,
+ 0x03, 0x85, 0xB1, 0x86, 0xF2, 0x74, 0x93, 0x81, 0x5D, 0x07, 0x48, 0xE4, 0xED, 0xDC, 0x67, 0x4F,
+ 0x12, 0xA0, 0x3B, 0x2A, 0x85, 0x4C, 0x04, 0xC7, 0xFA, 0x87, 0xC1, 0x25, 0x20, 0x96, 0x17, 0x5D,
+ 0x89, 0xC4, 0x0E, 0x36, 0x9B, 0xA6, 0x92, 0x70, 0xFC, 0xF5, 0x1A, 0x5C, 0xAD, 0xED, 0xD8, 0xFD,
+ 0xDD, 0x67, 0xC6, 0x3A, 0xF0, 0x5B, 0x16, 0xDF, 0x4E, 0x3F, 0xBF, 0xF9, 0x47, 0x9F, 0x01, 0x47,
+ 0x73, 0xE1, 0x5A, 0x38, 0x7E, 0xC0, 0xA9, 0x18, 0x70, 0x00, 0x88, 0xFF, 0x21, 0x2B, 0x12, 0xF4,
+ 0xC5, 0x4E, 0xC6, 0x80, 0x7D, 0xC4, 0x11, 0xB9, 0xC3, 0xF9, 0x5C, 0x69, 0x2A, 0x60, 0x6F, 0xE0,
+ 0xC6, 0x79, 0x3D, 0x15, 0xC2, 0xE7, 0x23, 0xDA, 0xFB, 0x9B, 0xAB, 0x13, 0x1D, 0x6D, 0xBD, 0xC2,
+ 0x6F, 0x3D, 0xF7, 0x44, 0xBD, 0x51, 0xF8, 0xA6, 0xD1, 0x47, 0x7D, 0x8C, 0xA8, 0x52, 0x56, 0xF7,
+ 0x01, 0x04, 0xD5, 0x22, 0xE8, 0x16, 0x21, 0x61, 0x27, 0xC8, 0xE2, 0xF9, 0xA1, 0x55, 0x44, 0x5F,
+ 0x8F, 0xC3, 0x22, 0x22, 0x3A, 0xCA, 0x2B, 0x05, 0x31, 0xCF, 0x88, 0x8E, 0x3B, 0xB0, 0x99, 0x1C,
+ 0xAA, 0x96, 0xF9, 0xDB, 0x41, 0x91, 0x64, 0x0E, 0xE1, 0xF1, 0xE0, 0xB0, 0x50, 0x62, 0x5D, 0x6B,
+ 0x36, 0xA7, 0x59, 0xD9, 0x2B, 0x77, 0x36, 0xA2, 0x18, 0xF4, 0x67, 0x74, 0xB8, 0x09, 0x88, 0x91,
+ 0x38, 0x9A, 0x01, 0x7D, 0xDE, 0xDF, 0xC3, 0xBB, 0x08, 0x59, 0xE9, 0xAD, 0xA0, 0xEE, 0xC0, 0x4B,
+ 0xC2, 0xBC, 0xB0, 0xAB, 0x4C, 0x32, 0xCB, 0x92, 0xC9, 0x97, 0x0D, 0xCF, 0x43, 0x83, 0x9D, 0xED,
+ 0x40, 0x98, 0x8E, 0x1B, 0x2D, 0x67, 0x68, 0x7C, 0x68, 0x8A, 0x38, 0x71, 0xC8, 0xCB, 0x81, 0x32,
+ 0x95, 0x86, 0x9E, 0x77, 0x5F, 0x9E, 0x85, 0xEE, 0x63, 0xC6, 0x41, 0x49, 0xD2, 0x98, 0xB0, 0x52,
+ 0x41, 0xDE, 0x59, 0x54, 0x41, 0x64, 0x6F, 0xE5, 0x1E, 0x73, 0x15, 0xA6, 0x21, 0x51, 0x4A, 0x66,
+ 0xAC, 0xB3, 0x0B, 0x69, 0x4C, 0xA3, 0xE5, 0xFA, 0xE5, 0xE3, 0xA9, 0xF5, 0x9A, 0x3A, 0x54, 0x04,
+ 0x82, 0x89, 0xF0, 0x33, 0x8F, 0x5C, 0x0E, 0x1E, 0x80, 0x17, 0x8A, 0x0E, 0x2F, 0xF8, 0x2D, 0xF3,
+ 0x84, 0xDE, 0xA7, 0x76, 0x1F, 0x4A, 0x39, 0xCA, 0x6C, 0x8E, 0xA6, 0x27, 0x4B, 0x8C, 0xC8, 0xE3,
+ 0xFF, 0x60, 0xD9, 0xE0, 0xC2, 0x90, 0xD7, 0x8E, 0x28, 0xA4, 0xD4, 0xC9, 0xA9, 0x05, 0x27, 0xD1,
+ 0x7D, 0x0C, 0xEA, 0x9F, 0x4B, 0x45, 0xC5, 0x34, 0xDA, 0xE4, 0xAC, 0x51, 0x23, 0xCC, 0xB0, 0x76,
+ 0x41, 0x91, 0x92, 0x6B, 0x7E, 0x19, 0xDD, 0x7C, 0x8D, 0x3D, 0xB9, 0xA1, 0xB3, 0x77, 0xEB, 0xD5,
+ 0x62, 0xAF, 0x45, 0x9C, 0xBD, 0x3B, 0xD4, 0x84, 0xAE, 0xA7, 0x8D, 0x3E, 0x47, 0xE1, 0xFB, 0x6C,
+ 0xD5, 0x27, 0xC6, 0x39, 0x1F, 0x74, 0x5C, 0x4D, 0x95, 0xE4, 0x7A, 0x79, 0xA9, 0x9D, 0x29, 0x02,
+ 0xC0, 0xC8, 0xA1, 0x33, 0xB8, 0xDF, 0x2A, 0x2E, 0xDC, 0x6F, 0x99, 0x9C, 0x49, 0xA3, 0x4C, 0x2A,
+ 0x2A, 0xFA, 0x4B, 0x56, 0xE8, 0x84, 0x21, 0xBE, 0x6A, 0xDA, 0x6B, 0x71, 0x98, 0x20, 0x52, 0x32,
+ 0xF3, 0xA9, 0xFA, 0x36, 0xC1, 0x42, 0x58, 0x3B, 0xDD, 0x5F, 0x05, 0x73, 0x5F, 0x3A, 0xEB, 0xC9,
+ 0x7A, 0x8A, 0x84, 0xC1, 0xDE, 0x50, 0x67, 0x1C, 0x7B, 0x98, 0xCE, 0xD9, 0x9C, 0x12, 0x81, 0x99,
+ 0xA5, 0x6B, 0x27, 0x8E, 0x32, 0x43, 0x12, 0xC9, 0xE1, 0x7A, 0x9A, 0x4D, 0xF6, 0x36, 0xAE, 0xF8,
+ 0x99, 0x4A, 0xC2, 0x90, 0x77, 0x79, 0xEF, 0x10, 0x1A, 0x4D, 0xD6, 0x71, 0x6F, 0xFB, 0xB8, 0x83,
+ 0x4E, 0x3F, 0xF3, 0xF9, 0xE5, 0xEB, 0xEB, 0xF9, 0x6E, 0x1C, 0x89, 0x47, 0x52, 0xED, 0x3F, 0x4D,
+ 0xEF, 0x26, 0xA7, 0x3C, 0x4B, 0x46, 0x9A, 0x32, 0x1E, 0x80, 0x70, 0xBC, 0x5C, 0xF2, 0x80, 0x6E,
+ 0x62, 0x7C, 0xAE, 0x80, 0xBB, 0x81, 0x82, 0x27, 0xCD, 0xA0, 0x86, 0x34, 0xD0, 0x80, 0x1E, 0x42,
+ 0xFE, 0x1B, 0xA4, 0x42, 0xC0, 0x67, 0x4D, 0xBB, 0xFC, 0x08, 0x20, 0x03, 0x6D, 0x62, 0x2F, 0xF2,
+ 0x0C, 0x57, 0x77, 0x6A, 0xC1, 0x51, 0x66, 0x74, 0x8D, 0x94, 0xE1, 0xF9, 0xF6, 0xC5, 0x78, 0xCD,
+ 0xCC, 0x68, 0xC6, 0x59, 0x2E, 0x3C, 0x94, 0x49, 0x76, 0x74, 0xD8, 0x67, 0x41, 0xF6, 0x30, 0xF2,
+ 0x83, 0xF1, 0xA8, 0x31, 0x7B, 0x86, 0x65, 0xED, 0x5F, 0xD3, 0xF3, 0x9A, 0xF3, 0x7C, 0x57, 0x13,
+ 0x57, 0x2C, 0x00, 0x49, 0xB6, 0x96, 0xB5, 0x0B, 0x13, 0xE6, 0x2B, 0x17, 0xFA, 0x66, 0xFF, 0x40,
+ 0xF9, 0x55, 0xF3, 0x61, 0xB2, 0x85, 0xA6, 0xA7, 0xC3, 0x95, 0xFC, 0x69, 0x48, 0x16, 0x8E, 0x61,
+ 0x84, 0x61, 0xCB, 0xF5, 0x5C, 0x51, 0x8E, 0x22, 0xC1, 0x26, 0x3F, 0x65, 0x59, 0xD2, 0x05, 0x23,
+ 0xAB, 0xFB, 0x18, 0x09, 0xFF, 0x91, 0x15, 0x21, 0x3E, 0xFD, 0xA3, 0x74, 0x33, 0xB4, 0x32, 0x49,
+ 0xA9, 0x3D, 0x73, 0x46, 0xA6, 0xF2, 0x20, 0x4F, 0x93, 0xD8, 0x83, 0xC0, 0xA1, 0x90, 0x28, 0xBD,
+ 0x58, 0x94, 0x53, 0x5A, 0xF1, 0x1F, 0xC7, 0x74, 0x9E, 0x6A, 0x6A, 0xD3, 0x11, 0x7A, 0x02, 0x06,
+ 0x1F, 0x9C, 0x84, 0x43, 0xAE, 0xE0, 0x92, 0x36, 0xD1, 0x93, 0x81, 0x26, 0xDC, 0x31, 0x6C, 0x0A,
+ 0xD7, 0x5B, 0x39, 0xF2, 0x8B, 0xD3, 0xAF, 0xD9, 0x9D, 0xB2, 0xBB, 0x2B, 0xFC, 0x0D, 0x0B, 0x7A,
+ 0x71, 0xEA, 0x5E, 0xC9, 0xC5, 0x78, 0xDF, 0xB4, 0x66, 0xAA, 0xB8, 0x49, 0x3E, 0x3C, 0x9D, 0x69,
+ 0xA1, 0xC2, 0xED, 0x24, 0xCE, 0xCB, 0x1D, 0x66, 0x05, 0x6B, 0xAF, 0x38, 0x0E, 0xE2, 0x52, 0x26,
+ 0x36, 0x9A, 0x78, 0xCC, 0xB1, 0xF5, 0x67, 0xC9, 0xA0, 0x4C, 0x47, 0x82, 0xC0, 0x94, 0xD5, 0x57,
+ 0x63, 0xD5, 0xA6, 0x7E, 0x7A, 0x68, 0xCA, 0x62, 0xA1, 0x5D, 0xD5, 0x21, 0x7D, 0x84, 0x1E, 0xA1,
+ 0xB5, 0x3A, 0xE3, 0xD4, 0x06, 0x9B, 0xEC, 0xED, 0x19, 0xE3, 0xD3, 0xCA, 0x90, 0x8C, 0xB7, 0x6E,
+ 0xDC, 0x1B, 0x58, 0xED, 0x3B, 0x1B, 0x55, 0xE9, 0xAA, 0xED, 0xB9, 0x36, 0x74, 0x46, 0x24, 0xA8,
+ 0x30, 0x32, 0xE9, 0x1C, 0x56, 0xFE, 0x80, 0xF6, 0x62, 0x44, 0x99, 0x22, 0x8C, 0xEB, 0x33, 0x8D,
+ 0x6F, 0xB2, 0xF9, 0xAA, 0x4D, 0x85, 0x64, 0x9F, 0xCE, 0x9A, 0x02, 0x98, 0x30, 0x94, 0x5F, 0x95,
+ 0xD4, 0xD9, 0xDE, 0xC1, 0x3B, 0xC2, 0x74, 0x84, 0xE4, 0x0C, 0x3F, 0xB6, 0xFC, 0x5E, 0xCA, 0x22,
+ 0xFE, 0xED, 0xAC, 0x59, 0x08, 0xCD, 0x90, 0x5A, 0xCB, 0x12, 0x8E, 0xE4, 0xD6, 0x87, 0x3B, 0x75,
+ 0xB8, 0xB8, 0x8F, 0xFC, 0x20, 0x5F, 0x1B, 0x90, 0xCF, 0x60, 0xF3, 0xF2, 0xBE, 0x86, 0xF4, 0x47,
+ 0x50, 0x13, 0xCE, 0xF7, 0xBD, 0x1B, 0x51, 0xE5, 0x75, 0x2A, 0xDB, 0x27, 0xA4, 0x30, 0xF4, 0xE5,
+ 0x75, 0xC2, 0x2F, 0x65, 0xC8, 0xAF, 0x65, 0xFE, 0x83, 0x82, 0x1D, 0x3B, 0xA6, 0xA3, 0x62, 0xE7,
+ 0x76, 0xD1, 0x03, 0x82, 0x60, 0xB6, 0x50, 0xE5, 0xE0, 0xF1, 0xB6, 0x1F, 0x1C, 0xFE, 0x03, 0x5F,
+ 0x33, 0x13, 0xFA, 0x01, 0xF4, 0x56, 0x45, 0xB1, 0xD9, 0x58, 0x8D, 0xC4, 0xE4, 0xAE, 0x68, 0xD1,
+ 0x5D, 0xA0, 0x47, 0x4B, 0x3B, 0xCF, 0x60, 0x94, 0xBE, 0x8B, 0xFC, 0xC8, 0x8E, 0x2A, 0x1C, 0xDF,
+ 0x09, 0x10, 0x26, 0x92, 0x30, 0x9D, 0x15, 0x67, 0x35, 0xD1, 0xD9, 0xAD, 0x09, 0x50, 0x02, 0xA9,
+ 0xC7, 0xD5, 0xCA, 0x8E, 0x88, 0xD7, 0x17, 0x50, 0x0B, 0x76, 0xA4, 0x21, 0xCD, 0xE2, 0x6C, 0xBA,
+ 0x36, 0x39, 0x6D, 0xB4, 0xD0, 0xFA, 0x8A, 0x67, 0x68, 0x3D, 0xF1, 0x8D, 0x3A, 0xB7, 0x61, 0x06,
+ 0x2A, 0x9D, 0x3B, 0xB0, 0x9B, 0xD1, 0xA1, 0x0A, 0x5A, 0xBD, 0x45, 0xD9, 0x06, 0x17, 0xFD, 0x24,
+ 0x63, 0x7E, 0x21, 0x76, 0x85, 0x9B, 0x56, 0x4E, 0x5A, 0xDA, 0x98, 0x2C, 0x63, 0x4C, 0x01, 0xC3,
+ 0x1E, 0xE9, 0xA7, 0xEB, 0xB8, 0x8E, 0xE2, 0x2B, 0xB4, 0xFF, 0x6B, 0x09, 0x61, 0xFB, 0xE9, 0xCC,
+ 0xDA, 0xE9, 0xEC, 0xA5, 0xFF, 0x43, 0x68, 0x7E, 0xFE, 0x4D, 0x69, 0x49, 0xF7, 0xF2, 0x99, 0xBD,
+ 0x56, 0x18, 0xB6, 0x79, 0x98, 0x40, 0x6D, 0xC1, 0x60, 0xF8, 0x09, 0x14, 0x4C, 0xBD, 0xD3, 0xB8,
+ 0xF3, 0x0A, 0x7C, 0xF2, 0x98, 0x58, 0x61, 0xA6, 0x30, 0x95, 0xEA, 0xB8, 0x91, 0xF2, 0xD0, 0x30,
+ 0x68, 0x62, 0x25, 0xEF, 0xFC, 0x4F, 0xC3, 0x5A, 0x40, 0x3C, 0xC9, 0xCE, 0xD9, 0x31, 0xA4, 0xBB,
+ 0x27, 0x59, 0xAA, 0x30, 0xD8, 0x71, 0xD2, 0x95, 0xDC, 0x76, 0x57, 0xCE, 0x35, 0x1B, 0x51, 0x04,
+ 0x7F, 0x42, 0x3C, 0xF5, 0x3A, 0xC8, 0xE7, 0x15, 0x36, 0x8E, 0x69, 0x1F, 0x5E, 0x08, 0x40, 0x0E,
+ 0x63, 0x12, 0x92, 0x1E, 0x78, 0xF4, 0x49, 0xD0, 0x0A, 0x90, 0xBE, 0x41, 0x3B, 0xBC, 0x8B, 0x50,
+ 0x89, 0xFC, 0x88, 0x6C, 0x3C, 0x00, 0xFC, 0xC0, 0x3A, 0x52, 0x59, 0x42, 0xA9, 0xC4, 0x35, 0x71,
+ 0x7E, 0x5D, 0x73, 0x53, 0x28, 0xD7, 0xA4, 0x58, 0x09, 0x52, 0x0F, 0xF1, 0xD5, 0xCB, 0xD6, 0x3C,
+ 0x6C, 0x5E, 0xF6, 0xF3, 0x0F, 0xE6, 0x07, 0xF0, 0x25, 0xB0, 0x76, 0x5A, 0xF0, 0x53, 0x70, 0xFB,
+ 0xF3, 0x3A, 0xDE, 0x52, 0x97, 0x4C, 0x1F, 0x34, 0x7B, 0xEE, 0xD9, 0x4C, 0xFF, 0xAD, 0x53, 0xC6,
+ 0xBA, 0x74, 0x82, 0x21, 0x81, 0x2E, 0x00, 0x19, 0x32, 0xAA, 0x3E, 0x52, 0x0E, 0x53, 0x40, 0x1A,
+ 0x63, 0xC4, 0x74, 0xF5, 0xA2, 0x33, 0x2D, 0xAB, 0x3F, 0xE4, 0x56, 0xFE, 0x1D, 0x91, 0xF3, 0x8F,
+ 0x46, 0x21, 0x10, 0x1D, 0x38, 0x3D, 0x71, 0x85, 0x6C, 0xD3, 0x44, 0xDA, 0x3D, 0x7C, 0x69, 0xEB,
+ 0x92, 0xDF, 0xE1, 0x6C, 0x82, 0x88, 0xF5, 0x15, 0x2D, 0xB2, 0x0F, 0x2D, 0xBF, 0x56, 0x6E, 0x8A,
+ 0xC8, 0x87, 0x20, 0xA2, 0xA7, 0xBC, 0xFF, 0x2A, 0x4A, 0x1F, 0x2C, 0x5B, 0x0A, 0x84, 0x41, 0x82,
+ 0xDE, 0xE2, 0x64, 0x0B, 0x42, 0xA6, 0x76, 0x44, 0x93, 0xDC, 0xD6, 0xDF, 0x26, 0x95, 0x89, 0xEF,
+ 0x76, 0x74, 0x34, 0x93, 0x45, 0x49, 0xB1, 0xB4, 0x0B, 0x2F, 0xF6, 0x6F, 0xE0, 0xC9, 0x99, 0x47,
+ 0xB1, 0x76, 0x1A, 0xBD, 0x7E, 0xCD, 0x04, 0x7E, 0xBA, 0x50, 0xA6, 0xB7, 0xC8, 0x31, 0x2C, 0x16,
+ 0x0E, 0xB9, 0x8A, 0x96, 0xC4, 0x45, 0xB4, 0x06, 0xCE, 0xFF, 0x73, 0x80, 0xED, 0x24, 0xD0, 0x9E,
+ 0xA9, 0x24, 0x1B, 0x79, 0x25, 0xA9, 0x3D, 0x86, 0x19, 0x68, 0xBF, 0x31, 0x83, 0x3C, 0x12, 0xB0,
+ 0x5B, 0x23, 0x3B, 0x07, 0x23, 0x81, 0xAF, 0xDD, 0x62, 0xE8, 0x55, 0x2D, 0x36, 0xA5, 0x16, 0xB1,
+ 0xA4, 0xFB, 0x20, 0x1A, 0x10, 0x3A, 0x0E, 0x7E, 0x97, 0xFC, 0x29, 0x06, 0x78, 0xC1, 0x63, 0xB3,
+ 0x6F, 0x64, 0xBE, 0x70, 0x8B, 0x43, 0x70, 0xEB, 0xEB, 0xE9, 0xEF, 0x7C, 0xC3, 0x59, 0x1B, 0xCC,
+ 0xAB, 0x5B, 0xE0, 0xBF, 0xF4, 0xC6, 0xD4, 0xE5, 0x07, 0xCF, 0xAB, 0x5E, 0xE8, 0x2F, 0x68, 0xD9,
+ 0xF6, 0x3A, 0x36, 0x08, 0xE3, 0xF6, 0xAE, 0x7B, 0xC5, 0x7A, 0xF1, 0x16, 0xC8, 0x46, 0x59, 0xEA,
+ 0xD9, 0xAD, 0x65, 0x74, 0xE7, 0x63, 0xA8, 0xF4, 0x5E, 0x01, 0x91, 0xE7, 0xEB, 0xA2, 0x0B, 0x92,
+ 0x3C, 0x28, 0x50, 0x9A, 0x54, 0x76, 0x4A, 0xEC, 0x38, 0x0E, 0x52, 0x02, 0xF4, 0xC8, 0x82, 0xC5,
+ 0x7D, 0x2D, 0x39, 0x6B, 0x30, 0xB3, 0x68, 0x87, 0x7B, 0x0A, 0x5C, 0x14, 0xDF, 0x5D, 0xF9, 0xF8,
+ 0x7E, 0x81, 0x6D, 0x76, 0x27, 0x78, 0x33, 0xBC, 0x9B, 0x9E, 0xEE, 0xDD, 0xFB, 0x24, 0x1B, 0xBD,
+ 0x49, 0x4B, 0x5E, 0xEA, 0xC9, 0xDD, 0x2A, 0x04, 0x2D, 0xEB, 0xB3, 0xBD, 0x22, 0xDC, 0x61, 0xC3,
+ 0x95, 0xB7, 0x95, 0x92, 0xDC, 0x32, 0x39, 0xC0, 0x18, 0xC1, 0x43, 0x3B, 0x20, 0x20, 0x32, 0x0A,
+ 0xB0, 0x51, 0x70, 0x21, 0x59, 0x64, 0x8E, 0x35, 0xFA, 0xD6, 0xF8, 0x75, 0x56, 0x59, 0x96, 0xA8,
+ 0xEE, 0x3F, 0xF1, 0x49, 0x64, 0xF1, 0x8F, 0x7C, 0x2B, 0xB9, 0x74, 0xC0, 0x03, 0x55, 0xBF, 0x95,
+ 0x9C, 0x31, 0x80, 0xDA, 0x37, 0x61, 0x99, 0x28, 0x8A, 0x45, 0x38, 0xF4, 0x23, 0xC7, 0x55, 0x13,
+ 0x79, 0x01, 0xE2, 0x1D, 0xFC, 0x76, 0x64, 0x20, 0x4B, 0x63, 0x74, 0x0B, 0x40, 0x8C, 0x11, 0x52,
+ 0xBF, 0xD1, 0x1C, 0xAF, 0x32, 0xAD, 0x92, 0x11, 0x50, 0x61, 0x57, 0x1A, 0xDD, 0x7A, 0x4B, 0x54,
+ 0xC3, 0x57, 0x2A, 0xC3, 0xF6, 0x4C, 0xDF, 0x82, 0x6B, 0x5E, 0xD9, 0x7F, 0x06, 0x52, 0x1D, 0xE3,
+ 0x78, 0x4E, 0x6C, 0xC3, 0x14, 0x73, 0xF1, 0x10, 0x7D, 0xDC, 0xBE, 0xE0, 0x30, 0x75, 0xCF, 0x24,
+ 0x18, 0x44, 0xA2, 0x61, 0xC5, 0x36, 0xD8, 0x44, 0x5E, 0x57, 0x3A, 0x2C, 0xFA, 0xDF, 0x6F, 0x0B,
+ 0x75, 0x69, 0xB7, 0x82, 0x53, 0x78, 0x23, 0x8A, 0x46, 0x65, 0xFF, 0x04, 0xC8, 0xBF, 0x7D, 0xF0,
+ 0x79, 0xDE, 0x36, 0x78, 0x2B, 0xDF, 0x30, 0x16, 0x25, 0x71, 0xDC, 0xE3, 0x02, 0xD7, 0x49, 0xF7,
+ 0x08, 0xB4, 0x9B, 0xC1, 0xEE, 0x73, 0xA5, 0x35, 0x43, 0x9E, 0xB0, 0xEA, 0x11, 0x82, 0xC4, 0xC0,
+ 0x14, 0x1D, 0x00, 0xDC, 0xB4, 0x43, 0x41, 0xC2, 0x22, 0xA3, 0xBD, 0x1B, 0x41, 0xEF, 0x9E, 0x3F,
+ 0x3A, 0x50, 0x8E, 0x0E, 0xEB, 0x08, 0x5C, 0xAC, 0x66, 0x05, 0x19, 0xF0, 0xCD, 0x3D, 0x84, 0xB8,
+ 0x04, 0x0A, 0x22, 0x69, 0xD2, 0xE1, 0x41, 0x9A, 0x9B, 0xFA, 0xAD, 0xB9, 0x84, 0x08, 0xFF, 0xEC,
+ 0x50, 0x9B, 0xD2, 0x55, 0xF6, 0x21, 0xA8, 0x4A, 0xF7, 0x19, 0xC4, 0xE9, 0x1B, 0xE7, 0xD6, 0x97,
+ 0x0F, 0xCB, 0xA3, 0xE1, 0xF5, 0xEB, 0x48, 0x38, 0x8D, 0xCD, 0x6C, 0x14, 0xC8, 0x30, 0xDD, 0xC6,
+ 0x3D, 0xA0, 0xDB, 0x46, 0xB1, 0x07, 0x89, 0x38, 0xF7, 0x2E, 0x30, 0x7F, 0xD8, 0x93, 0x92, 0x32,
+ 0x0B, 0xD8, 0x8B, 0xC8, 0x5A, 0x1A, 0x60, 0xAC, 0xD1, 0x41, 0xEC, 0xB5, 0xB5, 0xE3, 0x7B, 0xDE,
+ 0x3A, 0x33, 0x24, 0x5E, 0x06, 0x85, 0x2B, 0x65, 0x74, 0xBA, 0x40, 0x7D, 0x60, 0x87, 0xD3, 0xBE,
+ 0xD9, 0x88, 0xF8, 0x36, 0xA5, 0x83, 0xB8, 0x83, 0x62, 0x44, 0x20, 0x2F, 0xCB, 0xC7, 0xA1, 0x57,
+ 0xA8, 0x32, 0x60, 0xAB, 0x97, 0x6F, 0x70, 0x07, 0x2B, 0x41, 0x71, 0xF8, 0xCE, 0xCD, 0x73, 0x4C,
+ 0xB9, 0x04, 0x14, 0x9E, 0xC2, 0x5A, 0x6F, 0x14, 0xD0, 0x83, 0x10, 0xAE, 0x2F, 0x67, 0x10, 0x46,
+ 0x5F, 0x6D, 0x40, 0xF5, 0x2F, 0x77, 0x50, 0x82, 0x65, 0x16, 0xAB, 0x82, 0x3F, 0xBA, 0xF1, 0xBC,
+ 0x53, 0x2D, 0x86, 0xAA, 0x96, 0x40, 0x14, 0x6D, 0x38, 0x4D, 0x37, 0xD0, 0x0E, 0xFF, 0x2D, 0xBE,
+ 0x31, 0x04, 0xC3, 0x78, 0x56, 0x28, 0x7A, 0x92, 0xB6, 0xFD, 0x9D, 0x2D, 0x65, 0x1E, 0x90, 0xFE,
+ 0x30, 0x0E, 0xC6, 0x7B, 0x08, 0x27, 0x2E, 0xDC, 0x3A, 0xED, 0x07, 0x74, 0xF0, 0xF2, 0x09, 0xE9,
+ 0x1D, 0x96, 0x5B, 0xB2, 0x4D, 0x37, 0x41, 0xA9, 0xB4, 0xA3, 0x71, 0x2A, 0xAB, 0x15, 0x4F, 0x31,
+ 0x85, 0xC2, 0xD9, 0x10, 0x22, 0x10, 0xFF, 0xAF, 0xD1, 0x08, 0x36, 0x0F, 0x05, 0x2A, 0xA9, 0xE2,
+ 0xBA, 0x0E, 0x07, 0xAB, 0xAC, 0x01, 0xCF, 0xC6, 0xB8, 0xE9, 0x61, 0x45, 0xFB, 0x3F, 0x94, 0x5A,
+ 0x0C, 0x6D, 0x7B, 0x0E, 0x57, 0x5D, 0x9D, 0xEB, 0x96, 0x0C, 0x1D, 0xC1, 0x13, 0x24, 0x49, 0xB8,
+ 0xA7, 0xE9, 0x5C, 0x9E, 0xED, 0xAD, 0xF3, 0x56, 0xED, 0x91, 0xA0, 0xA1, 0x72, 0x51, 0xDE, 0xCD,
+ 0xCC, 0x05, 0x89, 0xD4, 0x01, 0xA4, 0x80, 0x0D, 0x4E, 0x5A, 0xA9, 0x5F, 0xEA, 0x71, 0x27, 0x84,
+ 0xE6, 0x70, 0x1D, 0xA2, 0xC9, 0x4C, 0x4C, 0x08, 0xAB, 0xD1, 0x73, 0x9B, 0x5D, 0xE0, 0xB7, 0x5D,
+ 0xDE, 0x1F, 0x49, 0x75, 0xD1, 0x92, 0x5B, 0x52, 0x58, 0x3A, 0xCE, 0xA0, 0x25, 0x1F, 0xA7, 0xB1,
+ 0xF7, 0xDD, 0x68, 0xD5, 0xA7, 0xB6, 0xAA, 0xEC, 0x57, 0x93, 0x61, 0xF5, 0x67, 0x9E, 0x5B, 0x9C,
+ 0xB8, 0xE0, 0x0A, 0xC5, 0x34, 0x35, 0x25, 0xDC, 0x4B, 0xC5, 0xCF, 0x20, 0x47, 0x84, 0x53, 0xDD,
+ 0x0B, 0x83, 0x70, 0xD6, 0xF7, 0x2C, 0xF3, 0x55, 0x3A, 0x52, 0xBC, 0x48, 0x0F, 0xCA, 0xFD, 0x4F,
+ 0x91, 0x79, 0x57, 0xDD, 0x46, 0xB5, 0xF2, 0xA8, 0x16, 0xC0, 0x06, 0x9B, 0xAF, 0x02, 0x12, 0x15,
+ 0xB6, 0xB0, 0x48, 0x1E, 0x95, 0xA4, 0x36, 0xBB, 0xD6, 0xF8, 0xBA, 0x1D, 0x70, 0x50, 0x23, 0xA8,
+ 0xF6, 0xBB, 0x61, 0x46, 0x91, 0x24, 0x16, 0x4E, 0x02, 0xD8, 0x73, 0x01, 0x78, 0xDD, 0x42, 0x7A,
+ 0xA6, 0x4F, 0xFE, 0x94, 0xF6, 0xEA, 0x1E, 0x62, 0xB0, 0xAC, 0xE4, 0x94, 0x09, 0x0D, 0x43, 0xF4,
+ 0xA0, 0xA8, 0x7A, 0xAA, 0x1C, 0x28, 0x49, 0xD7, 0xCC, 0x8B, 0x55, 0xF3, 0xD3, 0x99, 0x9B, 0xEC,
+ 0x41, 0x6B, 0x86, 0x85, 0x65, 0x1B, 0xC2, 0x2E, 0xD2, 0xF6, 0x46, 0x9F, 0x46, 0xFF, 0x9A, 0x5F,
+ 0xAF, 0x6F, 0x22, 0x29, 0x59, 0x40, 0xE4, 0x2D, 0xBE, 0x4A, 0x8E, 0xF0, 0x2B, 0x48, 0x5F, 0xC1,
+ 0x76, 0xA5, 0x2F, 0xEE, 0x03, 0xEB, 0xCF, 0xA7, 0x2E, 0xB0, 0x27, 0xD7, 0x49, 0xB1, 0xB4, 0x01,
+ 0x46, 0x00, 0x72, 0xCC, 0x98, 0xD7, 0xA3, 0xBC, 0x4E, 0xF1, 0x32, 0x3D, 0xF1, 0x29, 0x98, 0xA4,
+ 0x39, 0xD0, 0xD9, 0xD9, 0x2A, 0x99, 0x14, 0x69, 0xE1, 0x99, 0x70, 0xC8, 0xEE, 0x5D, 0xC9, 0xC3,
+ 0x92, 0xF3, 0xB6, 0xE7, 0xA7, 0x14, 0xC3, 0xC4, 0xBB, 0x05, 0x44, 0xDD, 0xDC, 0x77, 0xDB, 0x00,
+ 0x73, 0xC9, 0x0B, 0x17, 0x38, 0xAF, 0xCB, 0x7E, 0x5F, 0x4D, 0x3F, 0x79, 0x16, 0x10, 0x75, 0x79,
+ 0x69, 0x16, 0xAC, 0x7E, 0xAA, 0x73, 0xC7, 0x71, 0xF6, 0x01, 0x45, 0xC2, 0xA9, 0xB8, 0xC2, 0x77,
+ 0x88, 0x45, 0x3A, 0xCC, 0x9E, 0x02, 0xF5, 0xCC, 0x58, 0x4B, 0x98, 0x9B, 0xA4, 0x7F, 0x9F, 0xB2,
+ 0xE9, 0x8F, 0x0F, 0x21, 0xA2, 0xA3, 0x30, 0x24, 0x96, 0x8E, 0x45, 0xCA, 0x7E, 0x88, 0x92, 0x8A,
+ 0x81, 0xC5, 0xB5, 0x84, 0x99, 0x98, 0x2D, 0x97, 0xAF, 0x75, 0x7D, 0x0E, 0xCB, 0x28, 0x96, 0xD5,
+ 0x4D, 0xFE, 0xDD, 0x30, 0xE1, 0xC3, 0x19, 0x3D, 0x04, 0x5A, 0xEA, 0x09, 0x82, 0x66, 0x51, 0xE2,
+ 0xE9, 0x03, 0xA3, 0xC2, 0xF7, 0x72, 0x7F, 0xE0, 0x13, 0xF6, 0x29, 0x15, 0xE9, 0x51, 0xF3, 0x12,
+ 0xE1, 0xB1, 0xC8, 0xC9, 0x4F, 0xE0, 0x44, 0xA7, 0xE8, 0x80, 0x42, 0x82, 0x98, 0x1D, 0xA9, 0x0F,
+ 0x17, 0x29, 0xEF, 0xD6, 0xAB, 0x6D, 0x5F, 0x9D, 0xD3, 0x63, 0x61, 0xF3, 0x63, 0x02, 0xC0, 0xF5,
+ 0xB5, 0x75, 0x52, 0x9F, 0x0B, 0xED, 0x8E, 0x37, 0x1C, 0xC4, 0x33, 0x02, 0xD8, 0xF5, 0xE4, 0x57,
+ 0x0F, 0xD4, 0x7F, 0x07, 0xFB, 0x7B, 0x98, 0x92, 0x71, 0x17, 0x45, 0xB0, 0x03, 0xD3, 0x62, 0xFF,
+ 0x65, 0xDC, 0x5B, 0xA4, 0xA1, 0x8A, 0x3F, 0xF8, 0x0F, 0x34, 0xF8, 0xDF, 0x59, 0x60, 0xE4, 0xC1,
+ 0x16, 0xC7, 0xAE, 0x46, 0x88, 0x33, 0x9E, 0xE0, 0xD0, 0xB6, 0x21, 0xB6, 0x4B, 0x77, 0xB0, 0x12,
+ 0x3A, 0x15, 0x15, 0x21, 0x5E, 0xC7, 0xC5, 0xE3, 0x90, 0x4E, 0x79, 0x96, 0x1C, 0xCA, 0xEA, 0xC3,
+ 0x2D, 0x0B, 0x8C, 0xCE, 0x3E, 0x54, 0x7A, 0x44, 0xBA, 0xE4, 0xCC, 0x23, 0x14, 0xEA, 0x73, 0x96,
+ 0x88, 0x54, 0x99, 0xD8, 0x7B, 0x10, 0xB8, 0xB9, 0xD2, 0xA4, 0x57, 0x63, 0x35, 0xDB, 0x8A, 0xFB,
+ 0xBE, 0x57, 0xA3, 0x9B, 0x0B, 0x39, 0x35, 0x08, 0x03, 0x9A, 0x22, 0x55, 0x04, 0xE2, 0x14, 0xBF,
+ 0xA1, 0xCA, 0x15, 0xAC, 0xA6, 0x6E, 0xF7, 0xEC, 0x7B, 0xE4, 0xE7, 0x9C, 0x22, 0x4C, 0x25, 0x77,
+ 0x77, 0x23, 0xEF, 0xF8, 0xB3, 0x52, 0x88, 0xB2, 0x85, 0x65, 0xFC, 0xAE, 0xCA, 0xAB, 0x44, 0x77,
+ 0x5B, 0x09, 0xC0, 0xC3, 0xB1, 0x46, 0xAF, 0xEB, 0xEF, 0x50, 0xC4, 0x47, 0x0E, 0xAC, 0xEF, 0x22,
+ 0xAF, 0x24, 0x53, 0x51, 0x52, 0xB9, 0x55, 0xD7, 0xA8, 0x1A, 0x1A, 0xC5, 0xDC, 0x64, 0xD4, 0x0C,
+ 0x15, 0x37, 0x23, 0xC5, 0xD9, 0x2C, 0x02, 0xC5, 0x53, 0x9D, 0xB4, 0x0C, 0x27, 0xB8, 0x00, 0xA3,
+ 0x2E, 0x38, 0xAD, 0xE8, 0xD0, 0x52, 0xB0, 0x37, 0x9A, 0xC8, 0x81, 0x33, 0x87, 0x37, 0x0C, 0xB8,
+ 0x17, 0x45, 0x8A, 0xAC, 0xB1, 0xEF, 0xA4, 0xA1, 0x10, 0x4E, 0x88, 0x13, 0x10, 0x28, 0xF0, 0x22,
+ 0x55, 0x18, 0x96, 0xB1, 0xDC, 0x54, 0x7B, 0xC3, 0x7A, 0xA1, 0x8C, 0x58, 0x14, 0x9D, 0xB4, 0xC5,
+ 0x98, 0xA9, 0xBF, 0xB6, 0x27, 0x4F, 0x7A, 0x1C, 0xF4, 0x03, 0x6B, 0x60, 0x91, 0xB0, 0x1E, 0x9A,
+ 0x3B, 0x2B, 0x40, 0x30, 0x22, 0x3F, 0x61, 0x16, 0x8E, 0x4D, 0xC0, 0x8F, 0xED, 0xA5, 0x4F, 0x73,
+ 0x10, 0x4A, 0xD2, 0x73, 0xC5, 0xF8, 0x95, 0x25, 0xB0, 0xBC, 0x01, 0x14, 0x37, 0x0D, 0x74, 0x45,
+ 0xAA, 0xD6, 0x21, 0x4B, 0x7D, 0x55, 0x93, 0x16, 0x02, 0xBB, 0xBD, 0x77, 0x4F, 0xEE, 0xEA, 0x29,
+ 0x3C, 0xDF, 0x45, 0x9A, 0x9B, 0x73, 0xBC, 0x01, 0xF7, 0x18, 0x53, 0x1A, 0x73, 0x2B, 0x3F, 0x78,
+ 0x69, 0xB8, 0x45, 0x16, 0x9F, 0x76, 0x09, 0x91, 0x04, 0x21, 0x6B, 0x82, 0xCF, 0xFB, 0x0C, 0xF2,
+ 0x15, 0x6A, 0xDD, 0x67, 0x2C, 0x21, 0x39, 0x06, 0x13, 0x6C, 0xD7, 0x58, 0x54, 0xBA, 0xAC, 0x8D,
+ 0x1A, 0x13, 0x8F, 0x4F, 0xC3, 0xE8, 0x0A, 0xCC, 0xA0, 0x25, 0xC5, 0xBD, 0x49, 0x95, 0x6D, 0x95,
+ 0xA8, 0x6F, 0xCA, 0x85, 0x4F, 0xA1, 0x94, 0x45, 0x86, 0xE2, 0xBA, 0xD6, 0xE3, 0xFA, 0x91, 0xF5,
+ 0x03, 0xA2, 0x2C, 0xCD, 0x54, 0x37, 0x61, 0xA6, 0x34, 0xE0, 0x8D, 0x1C, 0xD4, 0xC9, 0x31, 0x4B,
+ 0x13, 0x04, 0xA6, 0x52, 0xFC, 0x8F, 0x4F, 0x81, 0x0A, 0x15, 0xB0, 0xB0, 0x33, 0x2F, 0x2A, 0xFC,
+ 0xFF, 0x95, 0x87, 0x66, 0xFD, 0x19, 0xDE, 0x77, 0x4C, 0xF9, 0x3A, 0x5D, 0x34, 0x5D, 0x47, 0x0B,
+ 0x33, 0x55, 0x9B, 0x90, 0x13, 0x2C, 0xE3, 0xD8, 0xA9, 0xDB, 0xAA, 0xA0, 0x4F, 0x7F, 0x20, 0xF6,
+ 0x8C, 0x5A, 0x48, 0x8F, 0x88, 0x95, 0x51, 0x11, 0x95, 0x88, 0x13, 0x31, 0x4D, 0x6F, 0xA2, 0x5A,
+ 0x1B, 0xE5, 0x16, 0x6E, 0x9C, 0x24, 0xA2, 0x82, 0x69, 0xAC, 0x0A, 0x54, 0x8B, 0x12, 0x64, 0x4D,
+ 0xC4, 0x51, 0x7F, 0xEA, 0x4C, 0x44, 0x58, 0xF2, 0xA1, 0x1E, 0xBF, 0x02, 0x15, 0x75, 0x4C, 0x4A,
+ 0xEB, 0x4F, 0x77, 0xE5, 0xB1, 0x3C, 0x26, 0x4F, 0x21, 0xB9, 0xAD, 0x70, 0x36, 0x4C, 0x02, 0x10,
+ 0x55, 0x29, 0x7C, 0xA1, 0x01, 0x9F, 0xD9, 0x67, 0xAB, 0xEE, 0x93, 0xD5, 0x91, 0xDF, 0xC5, 0x18,
+ 0x48, 0x9B, 0x9D, 0x3C, 0xCB, 0xCF, 0x06, 0x21, 0xA7, 0x5B, 0xE5, 0x83, 0x3B, 0x54, 0xCC, 0x04,
+ 0x43, 0x63, 0x60, 0x66, 0x60, 0x0F, 0xA2, 0x23, 0xAE, 0xE1, 0x55, 0x78, 0x09, 0x62, 0x51, 0x0F,
+ 0xAE, 0xF1, 0xE5, 0xBE, 0xCB, 0x4E, 0x83, 0xB1, 0xB8, 0x45, 0x0E, 0x85, 0x54, 0x69, 0xCC, 0xFD,
+ 0x7C, 0x5C, 0x95, 0xBB, 0x46, 0xF5, 0x21, 0xB9, 0x86, 0x8C, 0x71, 0x10, 0xF3, 0x6C, 0x1E, 0xE5,
+ 0xBB, 0x5B, 0xCA, 0x38, 0xAE, 0xF1, 0xB8, 0x73, 0xDB, 0x16, 0x30, 0x28, 0xB6, 0x18, 0xB4, 0xF4,
+ 0x01, 0x0A, 0x99, 0xCC, 0x01, 0x14, 0x80, 0xC1, 0xC1, 0xED, 0xC4, 0xE3, 0xE6, 0x92, 0x61, 0x7E,
+ 0x18, 0x44, 0xB2, 0x41, 0xE6, 0x41, 0xC5, 0xFB, 0x07, 0x75, 0xD3, 0xFB, 0xA7, 0xA9, 0xE7, 0x3B,
+ 0xAA, 0xFE, 0xB8, 0x16, 0x34, 0x9B, 0xA9, 0xEB, 0x75, 0xBA, 0xE6, 0x19, 0x21, 0x4B, 0x3E, 0xF9,
+ 0xFF, 0xC7, 0x03, 0x22, 0x42, 0xC4, 0x03, 0x38, 0x83, 0xA9, 0xB0, 0xCE, 0xB7, 0x32, 0x8E, 0x99,
+ 0x18, 0x8A, 0x3E, 0xC9, 0x38, 0x23, 0x7E, 0x21, 0x0A, 0xBD, 0x2A, 0x07, 0x3C, 0x05, 0xA6, 0x1E,
+ 0x5A, 0x56, 0xD8, 0xC8, 0xE7, 0x5F, 0x5D, 0x6D, 0x4F, 0xA6, 0x6F, 0xB6, 0xE1, 0xEE, 0x65, 0x6A,
+ 0x9F, 0xA1, 0xD8, 0x69, 0xC0, 0x9E, 0x6D, 0x4F, 0x64, 0x78, 0x34, 0x21, 0x56, 0x46, 0x98, 0xC4,
+ 0x23, 0xE7, 0x4D, 0x25, 0x24, 0x50, 0x86, 0xFC, 0xED, 0xB9, 0x32, 0x1D, 0x81, 0x0E, 0xE1, 0xFD,
+ 0x01, 0x67, 0x07, 0xD8, 0xF0, 0x15, 0xFC, 0x67, 0x62, 0x24, 0xD7, 0xB3, 0xAE, 0x48, 0x26, 0xE2,
+ 0xBD, 0x98, 0x51, 0xE2, 0x28, 0xC7, 0x54, 0x30, 0xC0, 0x7C, 0xFF, 0xA7, 0x8A, 0x43, 0x19, 0xE0,
+ 0xEF, 0x17, 0x1D, 0xF2, 0x15, 0xD5, 0x8E, 0x55, 0xAA, 0x8B, 0x98, 0x13, 0xF8, 0xAA, 0xCB, 0xB8,
+ 0x44, 0x74, 0x8E, 0x54, 0x38, 0xA9, 0xB7, 0x2E, 0xCE, 0x69, 0xEE, 0x12, 0x13, 0xEB, 0xA4, 0x73,
+ 0xE0, 0x22, 0x0D, 0x1D, 0x38, 0xA5, 0x51, 0x68, 0xFC, 0x8D, 0x1F, 0xF8, 0x97, 0xE9, 0xD9, 0xF6,
+ 0xC4, 0x0E, 0x19, 0x8C, 0xB8, 0xB4, 0xE0, 0xB7, 0x9C, 0x88, 0x97, 0x45, 0xA5, 0x09, 0xEC, 0x28,
+ 0x6C, 0x84, 0xE6, 0xA2, 0x79, 0xD2, 0x82, 0x08, 0x3E, 0xA4, 0xD5, 0x27, 0x6E, 0x2C, 0x00, 0x3B,
+ 0x2C, 0x69, 0x5C, 0x9F, 0x23, 0x98, 0x14, 0x44, 0x73, 0x1C, 0x2B, 0x42, 0x69, 0xAE, 0x77, 0xF3,
+ 0xA8, 0x8D, 0xC5, 0xA0, 0x75, 0xD6, 0xDF, 0xDA, 0xC1, 0x72, 0x77, 0x5F, 0x25, 0x7A, 0x76, 0x80,
+ 0x8C, 0x78, 0x5D, 0xD4, 0x13, 0xA7, 0x4C, 0x72, 0xB8, 0x8C, 0x0F, 0xE1, 0x10, 0xE2, 0x00, 0xBA,
+ 0xE9, 0x7A, 0x50, 0x81, 0xDB, 0x60, 0x98, 0x39, 0x90, 0x58, 0x5B, 0x8E, 0xA7, 0x96, 0x56, 0xB5,
+ 0x0A, 0xC7, 0x72, 0x5A, 0x26, 0x53, 0x23, 0x99, 0x52, 0xCB, 0xD5, 0xFE, 0xC9, 0xF8, 0xE3, 0x78,
+ 0x16, 0x80, 0xFE, 0xCC, 0x6A, 0x4F, 0x4B, 0x0C, 0xCA, 0x72, 0xCC, 0xF7, 0x23, 0xCA, 0x0E, 0x0E,
+ 0x5C, 0xD7, 0xA2, 0xA5, 0xA9, 0x8D, 0xC1, 0xE9, 0x73, 0x7B, 0x84, 0xD6, 0x86, 0x49, 0x45, 0xD2,
+ 0xD4, 0x05, 0xEB, 0xA8, 0xD2, 0x5A, 0x69, 0x0F, 0xCB, 0x99, 0x39, 0x26, 0xDD, 0x4F, 0xDC, 0x42,
+ 0xFD, 0x8F, 0xC8, 0x0B, 0x29, 0xB8, 0x83, 0x3D, 0xB8, 0x96, 0x6C, 0x8A, 0x5E, 0xC5, 0x28, 0x60,
+ 0xE3, 0xC8, 0x9F, 0xFA, 0x0C, 0xC7, 0xAB, 0x67, 0x8D, 0x23, 0x0F, 0x35, 0xAB, 0xCF, 0xBF, 0x7D,
+ 0xC2, 0xF6, 0x33, 0xC8, 0xED, 0x53, 0x86, 0x77, 0x28, 0x0B, 0xD5, 0x47, 0x3E, 0x17, 0x54, 0x9F,
+ 0x49, 0xD7, 0x29, 0x69, 0x57, 0xC0, 0x70, 0xC9, 0x0E, 0xC1, 0x3A, 0x77, 0x4A, 0x91, 0x2E, 0x23,
+ 0xF1, 0x13, 0xD0, 0x61, 0x8F, 0xA3, 0x6A, 0xDE, 0x01, 0x6A, 0xC2, 0x4B, 0x8F, 0xCD, 0x5D, 0x98,
+ 0x70, 0x6D, 0xAC, 0xE3, 0xFD, 0x17, 0x77, 0x37, 0x81, 0x4C, 0x31, 0xC0, 0x93, 0x74, 0x27, 0x79,
+ 0xA3, 0x65, 0x7F, 0x35, 0x31, 0x9F, 0x4E, 0x21, 0x13, 0xCE, 0x7E, 0xAB, 0x01, 0x85, 0x1D, 0x66,
+ 0x95, 0xF5, 0x0C, 0x19, 0x8B, 0x06, 0x3D, 0xB3, 0x14, 0xD9, 0x64, 0x2B, 0x46, 0xB5, 0x8A, 0x47,
+ 0x0A, 0x98, 0x6D, 0x4E, 0x7C, 0xE6, 0x26, 0xC8, 0xFA, 0xAB, 0x90, 0xFB, 0x4F, 0x04, 0xCC, 0xB2,
+ 0x0C, 0x9D, 0x62, 0x45, 0x55, 0x89, 0x4A, 0x55, 0x9B, 0x76, 0x71, 0x1D, 0x90, 0xE4, 0xCF, 0x46,
+ 0xFC, 0x2F, 0x92, 0x88, 0x9B, 0xFA, 0xF0, 0xCE, 0xB1, 0x56, 0xB5, 0xD7, 0x65, 0xBF, 0x8A, 0x63,
+ 0x5E, 0x0E, 0x05, 0xDA, 0xD9, 0xFF, 0x26, 0xFD, 0x2A, 0xA0, 0x98, 0x70, 0x32, 0xBC, 0xBC, 0x93,
+ 0x22, 0x8C, 0x6E, 0xB1, 0x36, 0xE8, 0x9D, 0x7F, 0xBC, 0xDE, 0xDD, 0x0A, 0x3F, 0x6D, 0xEA, 0xA2,
+ 0xDA, 0xAC, 0x7B, 0x77, 0x4E, 0x6D, 0x7A, 0x71, 0xEF, 0x49, 0x6E, 0x31, 0xD1, 0xD6, 0xC9, 0x15,
+ 0xBA, 0x1E, 0x18, 0x98, 0x92, 0xF1, 0x21, 0x23, 0xC0, 0xB5, 0x9C, 0x37, 0x15, 0x97, 0xA6, 0x48,
+ 0x09, 0x6D, 0x46, 0x6C, 0x45, 0x06, 0xC5, 0x27, 0x64, 0x54, 0x78, 0xF5, 0xFF, 0xD3, 0xD3, 0xAE,
+ 0xC8, 0x6E, 0xFC, 0x59, 0xB1, 0xD9, 0x26, 0xE8, 0xEE, 0x3C, 0x1D, 0xC7, 0xCF, 0xC0, 0xE0, 0xAB,
+ 0xDC, 0x10, 0x74, 0x48, 0xBA, 0xC2, 0xCA, 0xA1, 0x9C, 0xFB, 0x87, 0x99, 0x7A, 0x6B, 0x37, 0x5C,
+ 0x6F, 0x9F, 0x97, 0xCB, 0x90, 0x4F, 0xBC, 0x26, 0x15, 0xAC, 0x0D, 0xC6, 0x72, 0xF6, 0x29, 0xF8,
+ 0xDD, 0x57, 0x68, 0x46, 0x35, 0x60, 0xD8, 0x16, 0xE7, 0x3F, 0xC7, 0xEC, 0xDE, 0x6B, 0x8C, 0xF0,
+ 0x3D, 0x4A, 0x17, 0x58, 0x55, 0xD5, 0xE8, 0xA8, 0x4A, 0x62, 0x48, 0x8B, 0x52, 0xBD, 0x13, 0x00,
+ 0xF7, 0x44, 0xD1, 0x78, 0x3C, 0x1D, 0xAC, 0x34, 0xEE, 0xA5, 0x9B, 0xCC, 0x6D, 0xAD, 0x30, 0x31,
+ 0xFC, 0x81, 0x91, 0x50, 0x26, 0x2A, 0x48, 0x30, 0x20, 0xB7, 0xAA, 0x87, 0x02, 0x99, 0xB2, 0xE4,
+ 0xAC, 0x83, 0x71, 0x59, 0xDC, 0xD9, 0x5D, 0x6C, 0xB1, 0x03, 0x32, 0x97, 0x97, 0xEE, 0xFD, 0xCC,
+ 0xC4, 0xF3, 0xDD, 0x94, 0xC6, 0x43, 0xB9, 0xB7, 0x1D, 0x2F, 0x9C, 0x9D, 0x7F, 0x91, 0x51, 0x1A,
+ 0x35, 0xAF, 0xD8, 0x50, 0xFB, 0xBF, 0xD0, 0xA0, 0x28, 0x39, 0x6F, 0x47, 0x96, 0x57, 0x7D, 0x52,
+ 0x5C, 0xCD, 0xC9, 0x7F, 0xBB, 0x2C, 0x15, 0xFE, 0x2A, 0x3A, 0xFD, 0x23, 0xB2, 0x91, 0x6F, 0xC7,
+ 0x3C, 0xB2, 0x91, 0xB9, 0x59, 0xAA, 0x2E, 0x96, 0x45, 0xC5, 0x30, 0xAC, 0x03, 0x42, 0x78, 0xFD,
+ 0x46, 0xD2, 0x2F, 0x7A, 0x46, 0x55, 0x26, 0x49, 0x38, 0x4C, 0xA1, 0xD2, 0x78, 0x17, 0xD6, 0x3D,
+ 0x00, 0xCB, 0xF7, 0xB2, 0x68, 0x7D, 0x4A, 0xDA, 0x2E, 0x54, 0xF6, 0x6C, 0xCF, 0xDE, 0x8F, 0xF7,
+ 0xFA, 0xF8, 0x87, 0x38, 0xCA, 0xEA, 0xD2, 0x1F, 0xED, 0x04, 0xD0, 0xE9, 0x12, 0xCF, 0x11, 0x18,
+ 0xAF, 0xF3, 0x4E, 0x13, 0x3D, 0xBC, 0x30, 0xB4, 0x15, 0x71, 0x8B, 0x2D, 0x63, 0xCA, 0x53, 0x8C,
+ 0x20, 0x6D, 0x0C, 0x4E, 0xF8, 0x10, 0xD2, 0x1A, 0xC1, 0x0C, 0xE8, 0xCF, 0xE1, 0xA8, 0x93, 0x7E,
+ 0x8B, 0x32, 0x9D, 0x47, 0x03, 0x2B, 0x92, 0x27, 0x73, 0xE9, 0x39, 0xBD, 0x9F, 0x7B, 0x76, 0x8B,
+ 0x3C, 0x66, 0xA1, 0x3E, 0x4B, 0x69, 0x36, 0x71, 0x93, 0x02, 0x47, 0x5E, 0x3D, 0x8F, 0x28, 0x72,
+ 0x15, 0x85, 0x64, 0x1C, 0x8F, 0x2F, 0x58, 0x8F, 0xDD, 0x25, 0x84, 0x70, 0x0A, 0xD4, 0x8A, 0x3A,
+ 0x02, 0x08, 0xC6, 0x91, 0xBD, 0xE9, 0xA9, 0x66, 0xD0, 0x9F, 0xE5, 0x2F, 0xCF, 0xA2, 0x94, 0x7E,
+ 0xB8, 0x91, 0x31, 0x90, 0xC8, 0x06, 0x9B, 0x91, 0xCD, 0xE7, 0xDD, 0x1D, 0x6F, 0x57, 0x40, 0x59,
+ 0x64, 0x95, 0x49, 0xAA, 0xA6, 0x48, 0x2F, 0x09, 0x78, 0xE8, 0xA5, 0xCF, 0x41, 0x8C, 0x23, 0x38,
+ 0xEB, 0xA6, 0x93, 0x7F, 0x33, 0xE1, 0x38, 0x02, 0x64, 0x8C, 0x6A, 0x40, 0x93, 0xD0, 0x4D, 0xA9,
+ 0x9A, 0x4C, 0xE4, 0x2F, 0x8C, 0xC4, 0xFE, 0x00, 0xB6, 0x6C, 0xD2, 0x55, 0xA8, 0xB6, 0xF1, 0x44,
+ 0x43, 0x07, 0x53, 0x38, 0x12, 0xD3, 0xA3, 0x25, 0x76, 0x13, 0x7E, 0x81, 0x39, 0xAB, 0x87, 0x90,
+ 0x15, 0xEC, 0x81, 0xC4, 0x37, 0x08, 0x18, 0xDC, 0xED, 0xE5, 0xF0, 0xA5, 0x68, 0x41, 0x52, 0x92,
+ 0xFA, 0x53, 0x70, 0xF6, 0xA0, 0xDC, 0xEF, 0xCF, 0x6C, 0x3F, 0xDE, 0x72, 0x33, 0x3F, 0x43, 0x84,
+ 0xB0, 0xA0, 0xC5, 0xEF, 0x1B, 0x45, 0x63, 0x00, 0x6B, 0xDA, 0x3E, 0xCD, 0x84, 0x19, 0xD4, 0xD9,
+ 0x0D, 0x8C, 0x27, 0xF0, 0x6E, 0xA2, 0x03, 0xD5, 0xFD, 0xD7, 0x8F, 0x43, 0x46, 0x5E, 0x38, 0x91,
+ 0x7B, 0x2E, 0xB8, 0x65, 0xCD, 0x16, 0xC2, 0xB9, 0x50, 0x97, 0x1C, 0xAF, 0x3A, 0xE0, 0xA9, 0x44,
+ 0xE7, 0xF6, 0x5E, 0x40, 0x41, 0x55, 0xDD, 0x05, 0xD9, 0xFC, 0x50, 0xB1, 0x1D, 0x51, 0xEE, 0xB0,
+ 0x8A, 0x52, 0x38, 0x77, 0x59, 0x36, 0xDE, 0xB2, 0xB9, 0x28, 0x07, 0xE0, 0xC8, 0x44, 0x80, 0x6D,
+ 0x91, 0x72, 0x65, 0xD8, 0xC6, 0xA2, 0xFF, 0xF6, 0x61, 0x37, 0x22, 0x1B, 0x98, 0x65, 0xF9, 0x96,
+ 0xDB, 0xF9, 0x33, 0xE7, 0xAE, 0x25, 0x07, 0xC2, 0x01, 0x54, 0xF3, 0xA3, 0xFD, 0xC8, 0x25, 0x8E,
+ 0x7B, 0x7F, 0x49, 0xD1, 0x55, 0xA3, 0x17, 0x58, 0x53, 0xF0, 0x0F, 0xCA, 0x1F, 0x6D, 0xEF, 0x28,
+ 0x46, 0x0B, 0x35, 0x21, 0x66, 0x6C, 0x4F, 0x01, 0x79, 0x92, 0xD2, 0x16, 0x3C, 0x2C, 0xBE, 0x88,
+ 0x2E, 0x09, 0xC3, 0x8E, 0x8E, 0x62, 0x0F, 0x5E, 0x4D, 0x3C, 0x0C, 0xFE, 0x02, 0x1A, 0x02, 0xB1,
+ 0xF4, 0x86, 0xCA, 0x17, 0x0E, 0x57, 0x00, 0x35, 0x6C, 0xA6, 0xBF, 0x29, 0x35, 0x24, 0x78, 0x30,
+ 0x90, 0xF3, 0xBE, 0x0B, 0x9D, 0x88, 0x79, 0x14, 0x92, 0x32, 0x8F, 0xA0, 0xC1, 0xF7, 0x98, 0xFA,
+ 0x9B, 0x62, 0x70, 0x84, 0xA6, 0x5A, 0xA6, 0x03, 0xD0, 0x9F, 0xE9, 0x6A, 0x9F, 0x3A, 0xD4, 0xB7,
+ 0xE2, 0x83, 0x6A, 0x5B, 0x94, 0x44, 0x01, 0x99, 0x2F, 0x7F, 0x59, 0xA9, 0xF2, 0xAD, 0x74, 0x15,
+ 0xC7, 0x31, 0x22, 0x13, 0x76, 0xF4, 0x3D, 0x4A, 0x07, 0xA7, 0xC0, 0x89, 0xFC, 0x7A, 0x83, 0x6D,
+ 0xB1, 0xF8, 0xA3, 0x1F, 0xB9, 0x3B, 0xCC, 0x81, 0x32, 0x37, 0x65, 0x46, 0x2D, 0xAF, 0x9A, 0x4E,
+ 0x96, 0x14, 0x3D, 0x57, 0x9C, 0xF1, 0x92, 0xB3, 0x0E, 0x54, 0x4F, 0xF0, 0xA0, 0x70, 0x66, 0x65,
+ 0x36, 0x8D, 0x11, 0xD0, 0xBD, 0xD6, 0xEB, 0x49, 0x76, 0x79, 0xB4, 0xB7, 0x91, 0xAA, 0x21, 0x2D,
+ 0xBA, 0x19, 0x1C, 0xDC, 0x90, 0x16, 0xEC, 0xB7, 0x09, 0xFF, 0x1F, 0xC8, 0xE5, 0x75, 0xDB, 0x42,
+ 0x35, 0x53, 0x07, 0x77, 0x1F, 0x0C, 0xA3, 0x77, 0xD0, 0xCA, 0xDE, 0xC5, 0xB8, 0x15, 0xA6, 0xAB,
+ 0x5E, 0x2B, 0xC9, 0x3A, 0x1B, 0xDC, 0xDB, 0x4F, 0x1C, 0xA7, 0xF7, 0xD7, 0xBF, 0x27, 0x07, 0x0C,
+ 0xF7, 0xFD, 0x64, 0xF1, 0xA1, 0x89, 0x50, 0xE8, 0xA5, 0x94, 0x12, 0xBC, 0x0B, 0x82, 0x3A, 0xDB,
+ 0xE4, 0xCC, 0x8C, 0x61, 0x5D, 0xB6, 0xD0, 0x38, 0xC6, 0xF2, 0xE3, 0xE8, 0x6E, 0xDE, 0xA8, 0x5E,
+ 0x13, 0x05, 0x08, 0x17, 0x1F, 0xE5, 0x04, 0x51, 0x7E, 0xB8, 0x67, 0x55, 0xEA, 0x3F, 0x09, 0x53,
+ 0xE0, 0x02, 0xD4, 0xD7, 0xE5, 0x4B, 0x71, 0x0C, 0x28, 0xF0, 0x84, 0x9A, 0x3C, 0x5E, 0x3D, 0xA2,
+ 0x79, 0xDE, 0x75, 0x8B, 0xCF, 0xA6, 0x69, 0xDC, 0xAB, 0x13, 0x92, 0xFE, 0xDA, 0xEC, 0x89, 0x7C,
+ 0x88, 0x66, 0x94, 0x14, 0xD2, 0xDB, 0xCC, 0x5E, 0x5D, 0x5D, 0xD6, 0x64, 0x85, 0x17, 0x9A, 0x48,
+ 0xD3, 0xCC, 0xD7, 0x4C, 0x43, 0x40, 0x13, 0x56, 0x3C, 0x27, 0x28, 0xDB, 0xDF, 0xF9, 0x7D, 0x10,
+ 0xE5, 0xB4, 0xAB, 0x62, 0x79, 0x08, 0xFA, 0x9E, 0xCE, 0xB2, 0x92, 0x27, 0x05, 0x8F, 0x6C, 0x7B,
+ 0xCD, 0xC6, 0xAD, 0x7A, 0xBD, 0x89, 0x04, 0x21, 0x32, 0x52, 0xF8, 0x5B, 0xB1, 0x53, 0x5C, 0x0B,
+ 0x43, 0x0E, 0xD2, 0x2D, 0x13, 0xC9, 0xFD, 0x33, 0xB7, 0x5D, 0x91, 0xC5, 0xC8, 0x33, 0xB8, 0xDD,
+ 0x29, 0x9D, 0x5D, 0xC4, 0x5A, 0xF9, 0x4A, 0x1A, 0xAF, 0x3F, 0x40, 0x0D, 0x53, 0x64, 0x85, 0x51,
+ 0xC4, 0xCD, 0xA3, 0x2E, 0x68, 0x57, 0xFD, 0x4E, 0xF6, 0x43, 0x8F, 0x7D, 0x2E, 0x3D, 0x44, 0x14,
+ 0xB0, 0xF1, 0xB3, 0x65, 0x95, 0x3E, 0x20, 0xE1, 0x19, 0xCC, 0xFB, 0x54, 0xA7, 0x89, 0x7F, 0xF4,
+ 0xD7, 0x4D, 0x61, 0x00, 0xA0, 0x9C, 0x97, 0x03, 0xA0, 0x0E, 0x95, 0xCD, 0xF4, 0xF5, 0xF9, 0xCA,
+ 0x2E, 0x3F, 0x23, 0x86, 0xFE, 0xCF, 0xAA, 0x70, 0x26, 0x8E, 0x80, 0x7F, 0xBC, 0x71, 0x16, 0x40,
+ 0x92, 0x4D, 0xB3, 0xF7, 0x82, 0x55, 0x60, 0x20, 0xA2, 0x79, 0x88, 0x55, 0x52, 0xD2, 0xD8, 0x62,
+ 0x1B, 0x4B, 0xBD, 0x3D, 0x95, 0x35, 0x3B, 0x90, 0x98, 0xE5, 0x90, 0x83, 0xB9, 0x68, 0xF0, 0xD3,
+ 0xFF, 0x20, 0xB9, 0x19, 0xCB, 0xE1, 0xD6, 0x30, 0x69, 0xDF, 0xEB, 0x59, 0xDF, 0x89, 0x77, 0xD1,
+ 0x49, 0x8C, 0x5A, 0x4E, 0x8D, 0xD9, 0x63, 0xAF, 0xAA, 0x2E, 0xF1, 0x93, 0x9C, 0xAA, 0xB2, 0x7D,
+ 0x6C, 0x2C, 0x69, 0x1E, 0xDA, 0x9C, 0x24, 0xAA, 0x56, 0x66, 0x19, 0x03, 0xBE, 0x21, 0x9D, 0xF4,
+ 0x36, 0x65, 0x5A, 0x02, 0x6B, 0x91, 0x41, 0xF7, 0x07, 0x68, 0x26, 0xEA, 0x33, 0x1A, 0x79, 0x9D,
+ 0xEF, 0x7A, 0xAF, 0x9B, 0x66, 0x8B, 0xA2, 0xA7, 0x8C, 0x17, 0x33, 0xA0, 0x64, 0x2D, 0x3E, 0x84,
+ 0xBC, 0x13, 0x74, 0x52, 0xF9, 0x25, 0x22, 0x67, 0x9A, 0xC3, 0x8C, 0x04, 0x56, 0x66, 0xD6, 0x55,
+ 0xB7, 0xF5, 0x50, 0xDC, 0x22, 0xB6, 0x0D, 0x80, 0x49, 0xD9, 0xC8, 0x48, 0x3C, 0xEB, 0x37, 0x42,
+ 0x9E, 0x2F, 0xE4, 0xD5, 0xA3, 0xD5, 0xBF, 0xD9, 0xBC, 0x3D, 0x99, 0x03, 0xBE, 0x0C, 0x53, 0x18,
+ 0x93, 0x0D, 0xCE, 0x59, 0xB4, 0x08, 0xFA, 0x93, 0x93, 0xAD, 0xEC, 0x24, 0xC1, 0x76, 0x07, 0x06,
+ 0xFB, 0x78, 0x93, 0x40, 0xB0, 0x40, 0x7C, 0xBA, 0x4E, 0xBE, 0x93, 0x04, 0xD5, 0xF6, 0x6D, 0x72,
+ 0x84, 0x09, 0x2D, 0x8A, 0x5C, 0x86, 0xF3, 0xC0, 0x6B, 0x53, 0xE6, 0xDD, 0xA0, 0x34, 0x41, 0x2B,
+ 0x46, 0x7C, 0xE3, 0x76, 0x32, 0xD3, 0x3A, 0x8C, 0x46, 0x9C, 0x98, 0xFF, 0x3D, 0x5F, 0xD5, 0xB0,
+ 0xA1, 0xF2, 0x0A, 0xAE, 0x52, 0x3D, 0xD1, 0x71, 0xBA, 0x5B, 0x09, 0xB4, 0x52, 0x65, 0xE8, 0x15,
+ 0x80, 0xD5, 0x59, 0x68, 0x68, 0xEC, 0x2B, 0x80, 0x72, 0xDA, 0xCB, 0xEB, 0x68, 0xBC, 0x68, 0xD0,
+ 0x19, 0xBC, 0x5E, 0xED, 0x1F, 0x80, 0x8F, 0xD1, 0x76, 0x44, 0x46, 0x6E, 0xD9, 0x78, 0x91, 0xED,
+ 0x71, 0x9B, 0x4A, 0xCF, 0x1B, 0x1D, 0xDE, 0xC2, 0x4A, 0xEC, 0xF1, 0x2E, 0xC0, 0xC3, 0xEA, 0x7E,
+ 0x76, 0x1F, 0x74, 0xCE, 0x9D, 0xF1, 0x6B, 0x94, 0x21, 0x06, 0x00, 0x58, 0x1E, 0x37, 0x6B, 0xFB,
+ 0xB6, 0x45, 0xB4, 0x71, 0x35, 0x74, 0x20, 0x83, 0xA1, 0xD8, 0x3A, 0x1F, 0xA4, 0x17, 0x71, 0xEB,
+ 0x10, 0x93, 0xD0, 0xD7, 0x6C, 0xD2, 0x43, 0xF2, 0xF3, 0x66, 0xC1, 0x55, 0x07, 0x00, 0x54, 0xA1,
+ 0x4A, 0x4E, 0x55, 0xD9, 0x9D, 0x1D, 0xB0, 0x3F, 0x2E, 0x60, 0xF1, 0x5F, 0x30, 0x1E, 0x66, 0xD8,
+ 0xE9, 0xCD, 0x99, 0x0B, 0x72, 0x35, 0x99, 0x55, 0x1E, 0x4A, 0xD7, 0xA3, 0x02, 0x87, 0x27, 0x76,
+ 0x5A, 0x8D, 0xBC, 0x3D, 0xAA, 0xD6, 0xDA, 0xFA, 0x43, 0xE7, 0xD4, 0xCD, 0x92, 0xF0, 0xAB, 0xEB,
+ 0x9F, 0xD2, 0xC8, 0xA4, 0x3A, 0xF6, 0x1F, 0xAE, 0xBC, 0x79, 0xDD, 0xDD, 0x98, 0xE6, 0xA5, 0x11,
+ 0x53, 0x35, 0x24, 0xEE, 0x55, 0xC6, 0x86, 0x17, 0x55, 0x57, 0x8A, 0xCB, 0xAC, 0x9B, 0xA3, 0xBA,
+ 0x25, 0x24, 0xB6, 0x14, 0xC2, 0x42, 0xB2, 0xDE, 0x42, 0x0A, 0x23, 0x58, 0xCE, 0xBF, 0x21, 0x2A,
+ 0xDB, 0xF1, 0xBD, 0x78, 0xD4, 0x18, 0xCC, 0xFE, 0x49, 0xAE, 0x04, 0xD7, 0x94, 0x58, 0x71, 0x6E,
+ 0x8F, 0x3B, 0xE1, 0xBF, 0x6A, 0x9C, 0x73, 0x88, 0x9D, 0xD7, 0xAB, 0x7C, 0xE6, 0xAC, 0x31, 0xFB,
+ 0xB0, 0x80, 0xD7, 0x47, 0x8E, 0x32, 0x81, 0x61, 0xCF, 0xCF, 0x41, 0x2B, 0xA8, 0x84, 0x2D, 0x4F,
+ 0x64, 0x89, 0xC3, 0xC8, 0xEE, 0xFA, 0xF5, 0x6E, 0xB9, 0x62, 0x38, 0xBC, 0xBA, 0xFF, 0x26, 0x75,
+ 0xB4, 0xF3, 0x34, 0xB4, 0x94, 0xD1, 0x31, 0x57, 0x87, 0xDF, 0x93, 0xBC, 0x27, 0xE5, 0x34, 0xEF,
+ 0xF5, 0x50, 0xD1, 0x52, 0x53, 0x36, 0xAD, 0x7F, 0xF1, 0x7A, 0x0C, 0xAB, 0x29, 0x17, 0x0A, 0xD4,
+ 0xD1, 0x18, 0xA0, 0xC5, 0xD9, 0xC9, 0xFB, 0xC6, 0x08, 0x47, 0xD8, 0x2D, 0x8B, 0xA6, 0x06, 0xA0,
+ 0xC1, 0xF3, 0xF4, 0x50, 0x65, 0x0F, 0xF2, 0x1B, 0x04, 0x48, 0x3E, 0x9B, 0xC4, 0x70, 0x6A, 0xCC,
+ 0xE6, 0x7C, 0x6D, 0x1F, 0x3F, 0x3B, 0x5B, 0xBE, 0x87, 0x60, 0x31, 0x09, 0x3F, 0xF6, 0x37, 0xF3,
+ 0xD9, 0xB8, 0x13, 0x20, 0x38, 0x41, 0xF1, 0xF5, 0xE1, 0x2A, 0xDB, 0x33, 0xE4, 0xFA, 0xCE, 0x15,
+ 0xA0, 0x9D, 0x59, 0x2C, 0x05, 0x92, 0xC0, 0x87, 0xBE, 0x3C, 0x21, 0x53, 0xEF, 0xF8, 0x63, 0xB5,
+ 0x7F, 0x67, 0x7A, 0xA3, 0x5E, 0x76, 0x75, 0x79, 0x90, 0x15, 0xA8, 0x8B, 0x06, 0xB4, 0x91, 0x6B,
+ 0xDE, 0x37, 0x0D, 0x31, 0x40, 0xE1, 0x7E, 0xC4, 0x1F, 0x00, 0xDD, 0xBA, 0x62, 0x00, 0xEA, 0x90,
+ 0xE5, 0xF2, 0xEE, 0x71, 0x2E, 0x1C, 0xA3, 0xFA, 0xBA, 0x9C, 0x64, 0xFF, 0x11, 0x07, 0xD2, 0xE7,
+ 0x00, 0xF1, 0x08, 0xAA, 0x8E, 0x1A, 0x55, 0x29, 0xFB, 0xFB, 0x17, 0x11, 0xC7, 0xA3, 0xA0, 0x7D,
+ 0x10, 0x4E, 0x02, 0xFA, 0xBB, 0x12, 0x3D, 0x74, 0xA2, 0x84, 0xE7, 0xBD, 0x78, 0x77, 0x1E, 0x97,
+ 0xC9, 0x33, 0x2B, 0x19, 0x5B, 0x5D, 0xDD, 0xF2, 0xE1, 0xD6, 0xB3, 0x08, 0x0D, 0xE0, 0x56, 0x71,
+ 0x9D, 0xE2, 0x0C, 0xB9, 0x60, 0xC4, 0x0C, 0x90, 0x54, 0x07, 0xDC, 0x03, 0x92, 0xC6, 0x20, 0x38,
+ 0x3D, 0x3D, 0xC5, 0xC9, 0xF6, 0x02, 0x84, 0x7D, 0x84, 0x5C, 0x6A, 0x60, 0xE5, 0xEF, 0xBC, 0x54,
+ 0x71, 0x0C, 0xD3, 0xF7, 0xED, 0x3D, 0x76, 0x0F, 0x19, 0x15, 0x50, 0x53, 0xB4, 0x81, 0x8D, 0x0E,
+ 0xCF, 0xA1, 0x59, 0x8D, 0xEF, 0xF2, 0x29, 0x21, 0xF2, 0x64, 0xCE, 0x9C, 0xE2, 0x96, 0x4A, 0x0C,
+ 0x1B, 0x71, 0x7A, 0x72, 0x45, 0x24, 0x68, 0xC7, 0xD0, 0x6B, 0xD2, 0x3B, 0x5B, 0x16, 0xEC, 0xFE,
+ 0x40, 0x84, 0x72, 0xD7, 0x35, 0x7C, 0xA8, 0x80, 0x8C, 0xBA, 0xDA, 0x56, 0xA3, 0xA9, 0xC1, 0xCC,
+ 0x98, 0x6C, 0x20, 0x42, 0xBB, 0xB7, 0x1B, 0x0C, 0xCF, 0x98, 0x77, 0x71, 0x07, 0x1D, 0xDA, 0x66,
+ 0xA3, 0xD7, 0xE1, 0x2F, 0xB0, 0x70, 0x7B, 0x53, 0xA9, 0x80, 0x76, 0x16, 0x4E, 0xB3, 0x82, 0x0A,
+ 0x33, 0xD0, 0x30, 0x2F, 0x76, 0x89, 0x80, 0x76, 0x25, 0x85, 0xA1, 0x29, 0x97, 0xFA, 0xE3, 0xAE,
+ 0x6E, 0x44, 0xBD, 0xA2, 0x6A, 0xA5, 0xCA, 0x9C, 0x13, 0x7A, 0xAE, 0x51, 0x8D, 0x7C, 0xC8, 0xE1,
+ 0xE6, 0xA8, 0x36, 0x01, 0x34, 0x1D, 0xA6, 0x40, 0x93, 0xF2, 0x2F, 0x7F, 0xCD, 0x29, 0xB5, 0x5B,
+ 0x15, 0xEE, 0x59, 0x63, 0xE6, 0xD7, 0x77, 0xBB, 0x77, 0x0A, 0x25, 0x4D, 0xF3, 0x9D, 0x23, 0x0C,
+ 0xD4, 0x6D, 0xBB, 0x11, 0x96, 0x4E, 0x96, 0x15, 0xDE, 0xFE, 0xE6, 0x1A, 0xD2, 0x10, 0xE2, 0xA4,
+ 0x6B, 0x2F, 0x99, 0xB5, 0xFA, 0xAC, 0xC5, 0xB6, 0x90, 0xFA, 0x6C, 0x90, 0x16, 0x45, 0xB6, 0x93,
+ 0x71, 0x6B, 0x80, 0xE1, 0x9C, 0x65, 0x0D, 0x05, 0x84, 0xB0, 0x1B, 0xAC, 0x4E, 0xAE, 0x6A, 0x42,
+ 0x80, 0xF5, 0xD7, 0xAA, 0x43, 0x93, 0xE1, 0x3E, 0x51, 0x71, 0x5B, 0x6E, 0xA7, 0x9F, 0x56, 0x9A,
+ 0xFC, 0xFD, 0x3B, 0xA5, 0x07, 0x7C, 0xF6, 0x65, 0x22, 0xEA, 0x8E, 0x52, 0xAA, 0x51, 0x5A, 0x41,
+ 0x4A, 0x19, 0x7F, 0x92, 0x18, 0x0C, 0x04, 0x6A, 0xFB, 0x23, 0x30, 0xEC, 0xF5, 0x5B, 0x4E, 0xEA,
+ 0xE8, 0x4D, 0x3D, 0x87, 0xAE, 0xE7, 0x7C, 0x9A, 0x9F, 0xC0, 0xAC, 0xB8, 0x28, 0xC2, 0xC8, 0x9D,
+ 0xB9, 0x45, 0x9E, 0x4C, 0xC6, 0x7F, 0x34, 0x15, 0x2F, 0x58, 0xE5, 0x10, 0x75, 0x5A, 0x44, 0xB2,
+ 0xB6, 0x2B, 0xF5, 0x1D, 0x8F, 0xF7, 0xD8, 0xF5, 0xB2, 0xF5, 0xAA, 0x88, 0x16, 0xD0, 0x26, 0xF4,
+ 0x32, 0xFC, 0x8E, 0x60, 0xE7, 0x41, 0x6F, 0x9A, 0xCA, 0x51, 0x8E, 0x45, 0xF6, 0x39, 0xFF, 0x8C,
+ 0x48, 0x61, 0x40, 0xE1, 0xC9, 0x45, 0x82, 0x04, 0xEF, 0xB2, 0x59, 0x30, 0xA4, 0x2C, 0x62, 0xD9,
+ 0x2D, 0xDD, 0xAB, 0xAD, 0x18, 0x81, 0x19, 0x81, 0xCA, 0xCA, 0x75, 0xB3, 0xD0, 0x37, 0x0F, 0xE9,
+ 0x5D, 0x54, 0x8E, 0x0B, 0xB2, 0x55, 0x2A, 0x98, 0xC0, 0x75, 0x5A, 0xEB, 0x9D, 0x11, 0x3F, 0x20,
+ 0xE2, 0x3E, 0xB0, 0xB7, 0xCA, 0xB1, 0xD8, 0x30, 0x66, 0x4C, 0xBC, 0xEA, 0x8F, 0x76, 0x30, 0xC4,
+ 0x9D, 0x03, 0x21, 0x93, 0xEF, 0x54, 0x06, 0xEC, 0x93, 0xFA, 0x89, 0x48, 0xC7, 0x9C, 0x06, 0x22,
+ 0x77, 0xBD, 0xD1, 0x5E, 0xCF, 0x60, 0xD6, 0xA5, 0x17, 0x9A, 0x75, 0x50, 0xF3, 0x97, 0xD4, 0x8E,
+ 0xE3, 0x17, 0x41, 0xFD, 0xC0, 0x3B, 0xBB, 0x8A, 0xA7, 0x2B, 0x98, 0xF6, 0xBD, 0xE7, 0x14, 0x2D,
+ 0xE9, 0xEF, 0xC9, 0x0B, 0x6E, 0xCC, 0xE3, 0x17, 0xF3, 0xB8, 0xDF, 0x06, 0x3A, 0xE1, 0xB3, 0x58,
+ 0x22, 0x3D, 0xEF, 0xEA, 0xBA, 0xF1, 0x9D, 0x4F, 0xDB, 0xCC, 0x0C, 0xED, 0x57, 0x39, 0x80, 0x3A,
+ 0x3B, 0xBC, 0xEE, 0x29, 0x04, 0x34, 0xA5, 0x08, 0xE9, 0xDF, 0x96, 0xD3, 0x53, 0xC5, 0x4E, 0xF6,
+ 0x38, 0xAD, 0xCA, 0x53, 0x77, 0x59, 0xF1, 0x80, 0x9F, 0xA8, 0xB6, 0xDA, 0x5A, 0x56, 0xAA, 0x84,
+ 0x6C, 0x0E, 0xA8, 0xB2, 0x10, 0x37, 0xC8, 0x6A, 0xD8, 0x4D, 0x78, 0xAE, 0x36, 0xD0, 0xDC, 0xE7,
+ 0x1D, 0x8E, 0x57, 0xAC, 0xDD, 0x15, 0xAB, 0xB5, 0x30, 0x3C, 0xE7, 0xE6, 0x51, 0xD3, 0x26, 0xF6,
+ 0x13, 0x1D, 0xC8, 0xFC, 0x28, 0x83, 0x5E, 0x64, 0xA6, 0xCA, 0xA7, 0x67, 0xE6, 0x34, 0x19, 0x66,
+ 0xC8, 0x07, 0xB6, 0x74, 0xB2, 0x59, 0xAE, 0xDA, 0x36, 0x3F, 0x1F, 0xF6, 0x81, 0xEB, 0xC7, 0xB3,
+ 0x6D, 0x1F, 0x87, 0xA8, 0x90, 0x37, 0xD5, 0x85, 0xC3, 0x17, 0xC5, 0xE5, 0xE8, 0xCE, 0x83, 0xB5,
+ 0x73, 0x49, 0xA7, 0x2B, 0x91, 0x28, 0x2D, 0x2A, 0xC2, 0x22, 0xA7, 0x31, 0x18, 0xA6, 0xA4, 0x8C,
+ 0x45, 0x68, 0xA5, 0x95, 0xA4, 0x91, 0xA3, 0xEE, 0x4E, 0x2D, 0xE7, 0xEB, 0x20, 0x8E, 0xE5, 0xF6,
+ 0x9E, 0x53, 0x15, 0xCE, 0xA9, 0x21, 0x18, 0xE3, 0x9B, 0x75, 0x32, 0x02, 0x3D, 0xFC, 0x2C, 0x9D,
+ 0x85, 0x6A, 0xB2, 0xB9, 0x5D, 0x3A, 0xD1, 0x85, 0xFB, 0xD8, 0xB8, 0x8B, 0x48, 0x09, 0xD3, 0xFD,
+ 0xED, 0x11, 0xAA, 0x90, 0xB5, 0x25, 0xC8, 0xB9, 0xA5, 0x49, 0xE9, 0x1E, 0xD0, 0x43, 0xBA, 0x7A,
+ 0x49, 0xB7, 0xE3, 0x87, 0xBE, 0xE0, 0xF4, 0x83, 0xDA, 0x82, 0x4F, 0x9E, 0xC1, 0x55, 0x57, 0xF2,
+ 0x58, 0x20, 0x63, 0xCF, 0x2C, 0x34, 0x61, 0x6C, 0x15, 0xEF, 0x11, 0xB3, 0x7E, 0xA6, 0x13, 0xD9,
+ 0x2F, 0xD1, 0xAD, 0x61, 0xDE, 0x69, 0xB9, 0x9D, 0x1A, 0x24, 0x72, 0x5D, 0x4E, 0xA0, 0xB4, 0x7E,
+ 0xE9, 0x14, 0x77, 0x4C, 0xD6, 0xAE, 0xF6, 0x35, 0x69, 0x2D, 0x28, 0x98, 0x29, 0x73, 0xDE, 0x1D,
+ 0x3D, 0x10, 0x50, 0x8C, 0x55, 0x3D, 0x27, 0x89, 0x57, 0x1F, 0x7B, 0x62, 0xD9, 0x12, 0xF7, 0x8D,
+ 0xD3, 0x0F, 0x6B, 0x98, 0x6A, 0x64, 0xF7, 0x62, 0xFB, 0x69, 0x6D, 0x14, 0xF1, 0xF5, 0x6D, 0x5E,
+ 0xC1, 0x79, 0x3C, 0x1D, 0xDE, 0x45, 0x95, 0xE4, 0x10, 0x70, 0x68, 0x78, 0x0F, 0x70, 0xBE, 0xAC,
+ 0xFE, 0xD3, 0x6E, 0x5B, 0x9F, 0x7E, 0x2C, 0xD3, 0x0E, 0xC2, 0x6A, 0x96, 0x4D, 0x11, 0xEA, 0x62,
+ 0x6F, 0xAC, 0xAB, 0xE7, 0x8E, 0x0F, 0xC4, 0xFB, 0x23, 0x06, 0x7E, 0x0A, 0x87, 0x8E, 0x8D, 0xA8,
+ 0xE9, 0x90, 0x2D, 0xA2, 0xBF, 0x0B, 0x4C, 0x4C, 0x91, 0xE1, 0x7F, 0x55, 0x7C, 0x01, 0x94, 0xE3,
+ 0xA1, 0x08, 0xA0, 0x52, 0x8A, 0x2B, 0x0F, 0x5D, 0xD5, 0x70, 0x5F, 0x65, 0x1C, 0xB9, 0x9B, 0x0C,
+ 0x2B, 0xD6, 0x8E, 0x95, 0x29, 0x6C, 0x69, 0x63, 0xEA, 0x50, 0xB1, 0x2F, 0xAE, 0x06, 0x14, 0xDD,
+ 0x44, 0x38, 0x59, 0xF4, 0x35, 0xC6, 0x5B, 0xE9, 0xA8, 0x42, 0x10, 0xB1, 0x3C, 0x56, 0x76, 0x33,
+ 0x81, 0x88, 0x9D, 0x5B, 0x71, 0xEB, 0xA8, 0x78, 0xA2, 0xC6, 0x37, 0x3E, 0x75, 0xDB, 0x4F, 0xB5,
+ 0xE6, 0x9E, 0x53, 0x6C, 0x66, 0x65, 0x4C, 0x9F, 0xF7, 0x52, 0x7A, 0x24, 0x5B, 0x1C, 0xD1, 0x6B,
+ 0xFE, 0xD4, 0x05, 0x22, 0x5D, 0x4A, 0x85, 0x88, 0x82, 0xF6, 0xF7, 0x25, 0xF5, 0xED, 0xF0, 0xCC,
+ 0x47, 0xDE, 0x79, 0x9A, 0x88, 0xBE, 0xA1, 0x94, 0xF1, 0x4E, 0x2C, 0xFA, 0x8C, 0xE5, 0xE0, 0x8C,
+ 0xA1, 0x86, 0xFF, 0x2B, 0x0A, 0x84, 0x1C, 0xBB, 0x38, 0x49, 0x94, 0x33, 0xBD, 0xBA, 0xAB, 0x8B,
+ 0x66, 0x6D, 0x2C, 0x08, 0x78, 0x21, 0xB7, 0xDF, 0xAD, 0x17, 0x23, 0xCF, 0x42, 0x4E, 0xBD, 0x4F,
+ 0x1B, 0x50, 0x9A, 0x55, 0x60, 0x1D, 0x1D, 0x52, 0xAC, 0x3A, 0x70, 0x8E, 0x20, 0x4C, 0x74, 0x7F,
+ 0xBE, 0xC1, 0xFB, 0xF7, 0x0E, 0x03, 0x90, 0x36, 0x25, 0x08, 0x10, 0xAD, 0x02, 0xAB, 0x0E, 0xD0,
+ 0x3E, 0xA3, 0xF8, 0x8D, 0x06, 0x73, 0x09, 0x07, 0x81, 0x1B, 0x07, 0x15, 0x56, 0x13, 0xB4, 0x5A,
+ 0xBD, 0x88, 0xB5, 0xA8, 0x64, 0xC2, 0x8C, 0x20, 0xDD, 0xA5, 0xD1, 0x3F, 0x43, 0xEA, 0xD1, 0x64,
+ 0x70, 0x78, 0x66, 0x0F, 0x14, 0xC8, 0x13, 0x30, 0x74, 0xEE, 0x2D, 0x8C, 0xD3, 0x39, 0x3B, 0xDA,
+ 0x21, 0x64, 0x66, 0x0E, 0xC0, 0xC2, 0xCF, 0xF9, 0x27, 0xDD, 0x95, 0xDC, 0xA7, 0x2A, 0x72, 0xE2,
+ 0x2C, 0x60, 0x6F, 0x93, 0x45, 0x36, 0x58, 0x7B, 0xD2, 0x47, 0x88, 0xDF, 0xCD, 0xD7, 0x76, 0xEC,
+ 0xA6, 0x2C, 0xE4, 0x5E, 0xD9, 0x74, 0xBD, 0x06, 0xC7, 0xBD, 0xBB, 0x09, 0x87, 0x97, 0x2E, 0x2B,
+ 0x55, 0x48, 0xC1, 0xCD, 0x58, 0xB0, 0x33, 0x31, 0xD8, 0x19, 0x56, 0x4A, 0x57, 0x33, 0xEA, 0x86,
+ 0xA7, 0x68, 0x2A, 0xBB, 0x15, 0xC9, 0xB5, 0x9C, 0xCE, 0x77, 0x82, 0xD5, 0x56, 0xE2, 0x8C, 0xA0,
+ 0xC3, 0x86, 0x0A, 0x61, 0xE4, 0xF8, 0xF6, 0x1F, 0xA6, 0xE1, 0xD7, 0x96, 0xC9, 0xD7, 0xD7, 0x12,
+ 0xB8, 0x2E, 0xFB, 0x31, 0x8D, 0xFA, 0x13, 0x4C, 0xE7, 0x82, 0x90, 0xBC, 0x41, 0xA5, 0x9B, 0x55,
+ 0x24, 0xF5, 0xCE, 0xA6, 0x3D, 0x24, 0xCF, 0xB1, 0x66, 0xF9, 0x51, 0x2C, 0x86, 0xCD, 0x67, 0x82,
+ 0x3F, 0xA9, 0x29, 0x6B, 0x33, 0x00, 0xD2, 0xBB, 0x75, 0x12, 0xEC, 0x8F, 0x0E, 0x45, 0x2A, 0x5C,
+ 0x2D, 0x79, 0xC8, 0xFD, 0x84, 0xE8, 0x29, 0x61, 0x73, 0xFF, 0x9F, 0xB3, 0x23, 0x9C, 0xD5, 0x56,
+ 0x47, 0x72, 0x71, 0xF3, 0x69, 0xC5, 0xD5, 0x48, 0x6B, 0x12, 0xBF, 0x93, 0xB0, 0x2F, 0x6F, 0x31,
+ 0xF6, 0xCD, 0x53, 0xAB, 0x9F, 0xA3, 0x61, 0x60, 0x09, 0x44, 0x27, 0x18, 0x75, 0x90, 0xFA, 0x72,
+ 0x77, 0xC9, 0xC7, 0xFC, 0x2F, 0x37, 0x9A, 0xC2, 0x94, 0xE9, 0xE0, 0x55, 0x44, 0x15, 0x8A, 0xFC,
+ 0xE2, 0x68, 0x93, 0x69, 0x68, 0x79, 0xC3, 0x49, 0xF7, 0x6B, 0xCA, 0xE3, 0xF4, 0x51, 0xDB, 0x05,
+ 0x66, 0xBF, 0x95, 0x80, 0x9B, 0xEA, 0xED, 0xE7, 0x9A, 0xB6, 0xFF, 0xA1, 0xBB, 0x2D, 0x4B, 0xF9,
+ 0xD1, 0xAC, 0x8C, 0x1B, 0x8A, 0xF5, 0xEE, 0x37, 0xDF, 0xC8, 0xEA, 0x73, 0x23, 0x74, 0xAE, 0xCE,
+ 0x5F, 0x9B, 0x08, 0x3D, 0xD9, 0x40, 0xF2, 0x0B, 0x0D, 0x0D, 0x8D, 0x6D, 0x5C, 0xAB, 0x7B, 0xB3,
+ 0x12, 0x7E, 0xA1, 0xD5, 0xEA, 0xD5, 0xA8, 0x13, 0xF9, 0x71, 0xE2, 0x3A, 0x5B, 0x35, 0x8C, 0x7A,
+ 0x6F, 0x52, 0xB0, 0xB8, 0x0F, 0x78, 0x30, 0xF3, 0xD5, 0x8A, 0x93, 0xF6, 0x24, 0x75, 0xBE, 0x18,
+ 0xB1, 0x81, 0x6A, 0xC3, 0xCC, 0x5B, 0x23, 0x55, 0x9D, 0xEB, 0x5F, 0x25, 0x76, 0x5C, 0xCD, 0x9E,
+ 0x58, 0x12, 0xFD, 0x49, 0xC5, 0x46, 0xD3, 0x5D, 0x45, 0xAD, 0xCD, 0xC1, 0x4A, 0xA2, 0x7B, 0xF7,
+ 0x5D, 0x13, 0x97, 0xCF, 0xB4, 0x94, 0xAA, 0xCD, 0xC9, 0xDC, 0x9C, 0xE4, 0xB1, 0x67, 0xE1, 0x7D,
+ 0x11, 0x64, 0x2E, 0x13, 0x59, 0x70, 0xB9, 0x27, 0x33, 0x77, 0xB7, 0xC1, 0xA6, 0x54, 0xAA, 0x43,
+ 0x94, 0xA1, 0x06, 0xA4, 0xDE, 0x8F, 0x0A, 0x9B, 0xD5, 0x40, 0xBF, 0x7E, 0x69, 0xAA, 0x5C, 0x0A,
+ 0xDC, 0x93, 0xFD, 0x05, 0x04, 0x6F, 0x9D, 0x1F, 0x42, 0x7D, 0x2A, 0x60, 0x77, 0x87, 0xF4, 0x52,
+ 0xAB, 0xC3, 0xD5, 0x88, 0xF5, 0x89, 0xA0, 0xC7, 0x6A, 0x48, 0xB9, 0x75, 0xE5, 0x39, 0x7A, 0x39,
+ 0xC1, 0x25, 0xC6, 0xF8, 0xF6, 0x96, 0x7B, 0x0F, 0x4B, 0xBC, 0x37, 0x46, 0x9D, 0xA7, 0xA5, 0xDD,
+ 0x71, 0x99, 0xDA, 0x12, 0x88, 0x18, 0x80, 0x04, 0xF9, 0x5B, 0xDE, 0x01, 0x2C, 0xA2, 0x97, 0xDF,
+ 0xC9, 0xC3, 0xC8, 0xAB, 0x18, 0x80, 0x3D, 0xDA, 0xD0, 0xD6, 0x9C, 0xDC, 0xE6, 0xA1, 0x08, 0xD8,
+ 0x63, 0xC0, 0x28, 0x6E, 0x61, 0x33, 0x3F, 0x44, 0xD0, 0x8B, 0xB9, 0x4D, 0xB5, 0x99, 0x53, 0xE9,
+ 0x20, 0x02, 0x2F, 0x40, 0xD6, 0x16, 0x32, 0x1E, 0xE7, 0x6D, 0x20, 0xCA, 0x73, 0xC7, 0xCA, 0x3A,
+ 0x3C, 0x0C, 0xFE, 0xBB, 0xE8, 0xB4, 0x5F, 0x85, 0xA6, 0x33, 0x9C, 0x3D, 0x4B, 0xD9, 0x94, 0xAA,
+ 0x5D, 0x23, 0xDE, 0xC7, 0x8F, 0xDE, 0xF3, 0x94, 0x54, 0x56, 0x36, 0x9A, 0x52, 0x18, 0x6A, 0x91,
+ 0x0E, 0x00, 0xD4, 0x2F, 0xBB, 0x2A, 0x2E, 0xEB, 0x11, 0x05, 0xA5, 0xB3, 0xA9, 0x9A, 0xB1, 0x96,
+ 0xAB, 0xBB, 0x5F, 0x55, 0x9F, 0x9E, 0xDB, 0x44, 0x44, 0xE7, 0x19, 0x2F, 0x42, 0xAA, 0x66, 0xA1,
+ 0x8E, 0xFC, 0x4F, 0xD5, 0xBC, 0x6C, 0x70, 0x65, 0x05, 0x4F, 0x0A, 0xD4, 0xD1, 0x11, 0xA8, 0x24,
+ 0x4A, 0xDD, 0x6C, 0x70, 0xA4, 0x62, 0xC6, 0x17, 0xB1, 0x55, 0xF1, 0x2D, 0x7B, 0x3D, 0x8F, 0xF9,
+ 0xB6, 0x86, 0xEF, 0xD7, 0xF2, 0x70, 0x2C, 0xF0, 0x82, 0x3F, 0x2E, 0x05, 0xC6, 0xFE, 0xD6, 0x14,
+ 0xFA, 0x43, 0xCE, 0x3A, 0xD9, 0xC3, 0x18, 0x42, 0xF8, 0xE3, 0x92, 0x59, 0x90, 0x5C, 0xE1, 0xBE,
+ 0x30, 0x36, 0xEF, 0x15, 0x9E, 0xFB, 0x1F, 0xD0, 0x82, 0xCF, 0x34, 0xB8, 0x44, 0xF3, 0x6C, 0x98,
+ 0x13, 0x9A, 0x25, 0xEC, 0xD7, 0x8C, 0x1B, 0x7D, 0x92, 0x91, 0xBB, 0x39, 0xD9, 0x5C, 0x76, 0xBA,
+ 0x5D, 0x8B, 0xA3, 0xF3, 0x48, 0x72, 0x7D, 0xAE, 0x6E, 0x2B, 0x41, 0x6D, 0xCA, 0xDC, 0xBA, 0xD4,
+ 0x01, 0x47, 0x5E, 0x92, 0xDA, 0x8F, 0x06, 0xAF, 0xB5, 0x76, 0xDE, 0xA2, 0xC0, 0x64, 0x1A, 0xB3,
+ 0x5F, 0xA1, 0x16, 0xCF, 0x77, 0x48, 0x1E, 0x5C, 0x7F, 0xCD, 0x03, 0xA1, 0x2F, 0x83, 0x8C, 0x1B,
+ 0x6B, 0xFD, 0x9B, 0x67, 0x32, 0x7E, 0xBE, 0x9E, 0xE0, 0x82, 0x75, 0x7E, 0xAC, 0xD7, 0x3F, 0x26,
+ 0x53, 0xB8, 0x83, 0x15, 0x16, 0x49, 0x70, 0x01, 0x6F, 0x22, 0x3D, 0x9B, 0x56, 0x61, 0x96, 0x59,
+ 0x05, 0x98, 0x0F, 0xA5, 0x76, 0x26, 0x5D, 0xFE, 0x92, 0x0E, 0xF4, 0xAC, 0x73, 0x40, 0xEF, 0xEB,
+ 0x56, 0x14, 0xCD, 0x8D, 0x94, 0x8E, 0x34, 0xBF, 0x5B, 0xA0, 0xD0, 0xE3, 0xBA, 0xF3, 0x1F, 0x0D,
+ 0x40, 0xD0, 0xE4, 0x53, 0x00, 0xCB, 0x30, 0x4A, 0x8C, 0xA2, 0x95, 0xCC, 0xB0, 0x36, 0xE3, 0x51,
+ 0x19, 0x00, 0xBE, 0x86, 0x91, 0x7F, 0x15, 0x1B, 0xF1, 0x9D, 0x37, 0x9C, 0x24, 0xCB, 0x7F, 0xFB,
+ 0x96, 0x22, 0x49, 0xC0, 0x5F, 0x12, 0xE8, 0x97, 0x00, 0xCB, 0x09, 0x2B, 0x10, 0x82, 0x88, 0xEA,
+ 0x83, 0x79, 0x50, 0xA5, 0x78, 0x40, 0x61, 0xD3, 0xB7, 0x28, 0x55, 0xC9, 0x16, 0xFA, 0x31, 0xA0,
+ 0x38, 0xCE, 0x89, 0x36, 0xA3, 0x75, 0xC0, 0x13, 0xF0, 0xB1, 0xD9, 0x0B, 0x83, 0x92, 0x84, 0xEC,
+ 0xF8, 0x42, 0x26, 0xF8, 0xA1, 0xDE, 0x4F, 0xC1, 0xE9, 0x22, 0x74, 0xA1, 0x11, 0x93, 0x3F, 0x98,
+ 0x5C, 0x7D, 0x84, 0xC1, 0x66, 0xD0, 0xDC, 0x7E, 0x5A, 0x9B, 0xF1, 0xBD, 0x46, 0xBA, 0x2B, 0xD9,
+ 0xCA, 0x80, 0xDA, 0x3D, 0x04, 0xE1, 0xBE, 0x74, 0x1F, 0x83, 0x6C, 0xD1, 0x1C, 0xC5, 0x6F, 0x1D,
+ 0x1E, 0xF3, 0x29, 0x93, 0x12, 0xFB, 0x19, 0xCF, 0xB7, 0xA0, 0xF6, 0x21, 0x24, 0x5E, 0x1D, 0xD9,
+ 0x1C, 0x66, 0x21, 0xE9, 0xC8, 0x54, 0xDB, 0x5B, 0x81, 0x4B, 0xDB, 0xE0, 0x36, 0x88, 0xC5, 0x5F,
+ 0x0B, 0xA2, 0xBD, 0x8D, 0x6B, 0x14, 0x46, 0xA0, 0xE0, 0x37, 0x1D, 0x11, 0xB0, 0x15, 0x53, 0xF5,
+ 0xBF, 0xF8, 0x0F, 0x6E, 0xCB, 0x42, 0xE2, 0xFC, 0xE5, 0xBB, 0xFB, 0x8F, 0x98, 0x23, 0x21, 0xC2,
+ 0x69, 0x6D, 0x13, 0x2A, 0x55, 0xEF, 0x32, 0xBF, 0x9E, 0xC3, 0x74, 0x55, 0x0D, 0xA3, 0xF8, 0x56,
+ 0xC0, 0xE1, 0x25, 0x91, 0x78, 0x79, 0x6D, 0xEA, 0xEB, 0xCF, 0x48, 0x82, 0xB0, 0xEB, 0x44, 0x0C,
+ 0xB6, 0xF6, 0x21, 0x9D, 0xD2, 0xF4, 0x67, 0xC1, 0x93, 0x55, 0x48, 0x35, 0xB3, 0xE0, 0x62, 0x86,
+ 0x9C, 0x5C, 0xF1, 0x4C, 0xB5, 0x2A, 0xAF, 0x3D, 0x42, 0xFD, 0x6F, 0x95, 0x4F, 0x00, 0xE9, 0x42,
+ 0x20, 0x6E, 0x8B, 0x51, 0xFF, 0xD4, 0xD8, 0xCE, 0x76, 0xE4, 0xE8, 0x9F, 0x2B, 0x0E, 0x47, 0x12,
+ 0xC4, 0xEF, 0xAB, 0x91, 0xCF, 0x37, 0x4F, 0x52, 0x29, 0x75, 0xC3, 0xC0, 0xB8, 0xF4, 0x04, 0x9E,
+ 0xA9, 0x86, 0x6B, 0x93, 0x21, 0x7A, 0x11, 0x26, 0x33, 0xC0, 0x0A, 0x7B, 0xED, 0x0F, 0x2B, 0x9F,
+ 0x91, 0xE3, 0x19, 0x47, 0xD8, 0xD8, 0x0D, 0xCB, 0x6D, 0xC0, 0xAC, 0xEB, 0xEB, 0x59, 0xA6, 0x44,
+ 0x56, 0xE3, 0x95, 0xB6, 0x2A, 0xBA, 0xBC, 0x65, 0x5B, 0x0C, 0x9E, 0x04, 0xDE, 0x65, 0x8E, 0x29,
+ 0x73, 0x18, 0x0B, 0xC7, 0xA3, 0x76, 0x43, 0xD4, 0x07, 0xF0, 0x3B, 0x09, 0xCC, 0xF7, 0x10, 0x57,
+ 0x9C, 0x05, 0x2A, 0xC5, 0x8C, 0x53, 0xE3, 0xA9, 0xA6, 0x20, 0x0B, 0x71, 0xAF, 0x4B, 0x95, 0x8F,
+ 0xB1, 0xA6, 0x96, 0xDC, 0xFC, 0x85, 0xC5, 0x94, 0xBF, 0x86, 0xA6, 0x88, 0xC9, 0xEB, 0x04, 0x2A,
+ 0x3B, 0xF8, 0x17, 0x07, 0x7D, 0x0F, 0x89, 0x44, 0x3D, 0x97, 0xA1, 0x8A, 0x4E, 0x2E, 0x8F, 0x9C,
+ 0xB8, 0x6C, 0xA0, 0x50, 0x5D, 0xC4, 0x22, 0xDF, 0xF0, 0x5A, 0xD2, 0xF4, 0x3F, 0x20, 0xFD, 0xAA,
+ 0x6E, 0x04, 0xF3, 0xFA, 0x2E, 0x5D, 0x6F, 0x6B, 0x2A, 0xE9, 0x77, 0x16, 0x65, 0xB7, 0x1B, 0xDC,
+ 0x8F, 0x58, 0x2F, 0x32, 0x9D, 0x57, 0xB7, 0x64, 0xD0, 0x77, 0x6E, 0xE7, 0x03, 0x39, 0xB0, 0xDF,
+ 0x19, 0x97, 0x29, 0xCA, 0xFE, 0xFC, 0xB6, 0x21, 0xD0, 0x2C, 0x07, 0x36, 0x1D, 0x72, 0x07, 0x9B,
+ 0xEB, 0xED, 0x1B, 0xB9, 0xD3, 0x87, 0xF8, 0x33, 0x94, 0x42, 0xAF, 0x91, 0x7C, 0x43, 0x91, 0xAF,
+ 0x33, 0x22, 0x5E, 0x48, 0xE6, 0x73, 0xF6, 0xB6, 0x00, 0xAC, 0x29, 0x88, 0xCB, 0x45, 0x31, 0x3D,
+ 0xF8, 0x24, 0x98, 0x3F, 0xD9, 0x21, 0xAA, 0x6D, 0xCA, 0x49, 0x53, 0xC5, 0x20, 0x48, 0xA7, 0xCE,
+ 0x5B, 0x9C, 0x23, 0x54, 0x51, 0xFC, 0xB6, 0x7A, 0x61, 0x4E, 0xDE, 0xE2, 0x82, 0xE8, 0xE0, 0xEC,
+ 0xE3, 0x65, 0xA6, 0xB5, 0x5E, 0x0F, 0x5A, 0xDC, 0xB2, 0x9D, 0x4B, 0x5D, 0x35, 0x71, 0xDB, 0x9F,
+ 0x9D, 0x5F, 0xB6, 0x56, 0x17, 0x02, 0x69, 0x65, 0x1C, 0x5E, 0xC2, 0x81, 0x0D, 0x5D, 0x4A, 0x0F,
+ 0x25, 0x89, 0x60, 0x06, 0xEB, 0xEB, 0x1C, 0x8D, 0x8C, 0x2F, 0xBD, 0xD2, 0x68, 0xB6, 0xE5, 0x86,
+ 0xCA, 0xEC, 0x85, 0x3F, 0x69, 0x90, 0x45, 0xC3, 0x70, 0x57, 0x72, 0x3E, 0xCD, 0xAA, 0xAE, 0xA2,
+ 0x46, 0xEE, 0x70, 0xBE, 0x30, 0xEC, 0x6F, 0xA5, 0xC2, 0xCD, 0x5B, 0x1C, 0x9A, 0x4D, 0xAA, 0x23,
+ 0xE4, 0xC7, 0x4F, 0x9B, 0xF2, 0x19, 0x67, 0x14, 0x32, 0x66, 0xD8, 0xF2, 0x0D, 0xD6, 0x62, 0xEC,
+ 0x95, 0xF5, 0x50, 0xF3, 0x98, 0x75, 0xFA, 0xE2, 0xCA, 0x5D, 0x3F, 0x28, 0x7D, 0xD0, 0xE2, 0x34,
+ 0x40, 0x7B, 0xB5, 0x07, 0x1F, 0x52, 0xEF, 0x2C, 0x3D, 0xAB, 0x3A, 0x72, 0x45, 0xC5, 0x47, 0x83,
+ 0xFA, 0x5C, 0xE3, 0x66, 0x77, 0x4F, 0x89, 0x7C, 0xFE, 0x9C, 0xDB, 0x4E, 0xA4, 0xB9, 0xE6, 0xE8,
+ 0x78, 0x50, 0x43, 0x20, 0x8B, 0x8C, 0x78, 0x27, 0x88, 0x9A, 0x40, 0x89, 0x36, 0x4B, 0x08, 0x2E,
+ 0xC2, 0x60, 0x51, 0x9C, 0xE8, 0x96, 0x93, 0x8B, 0x69, 0xF7, 0x2A, 0x7E, 0x9E, 0xF7, 0x4C, 0xFC,
+ 0xD2, 0xF5, 0x97, 0xC2, 0x49, 0x9D, 0x1B, 0xB0, 0xAA, 0x61, 0x50, 0xD9, 0x06, 0xE7, 0x9E, 0x61,
+ 0x06, 0xB7, 0xD6, 0xDE, 0x64, 0x2A, 0x9D, 0x1E, 0xF3, 0xFB, 0xD4, 0xC1, 0x49, 0x13, 0x4C, 0xC8,
+ 0x1C, 0x84, 0x0C, 0xD9, 0xF8, 0x70, 0x7A, 0x57, 0x7B, 0xE5, 0xAA, 0xD7, 0x0C, 0xD8, 0x90, 0xBB,
+ 0x10, 0x7D, 0x68, 0x76, 0xD9, 0x70, 0xBE, 0x89, 0x75, 0xF9, 0xE6, 0x67, 0x06, 0x1E, 0x43, 0xAF,
+ 0x44, 0xB0, 0x0C, 0xC8, 0x69, 0x9B, 0x07, 0x42, 0xAF, 0xB2, 0x87, 0xCE, 0x39, 0xC6, 0xFE, 0xCF,
+ 0xF9, 0x3F, 0xD0, 0xB6, 0xC5, 0x3C, 0xC4, 0xC9, 0x15, 0x04, 0xA7, 0x4B, 0xB2, 0xC2, 0x1F, 0x52,
+ 0x08, 0x5E, 0xBB, 0x1C, 0x87, 0x0C, 0xF3, 0xF2, 0x3D, 0xE2, 0xC3, 0xEC, 0xFD, 0xA6, 0x99, 0x6B,
+ 0x6D, 0x2F, 0xC6, 0xE0, 0x24, 0xE5, 0xCD, 0xF5, 0x0C, 0x43, 0xDD, 0xDA, 0x85, 0xEF, 0xDD, 0x47,
+ 0xDD, 0xB0, 0xE5, 0x56, 0x8E, 0xC7, 0x3E, 0x20, 0x29, 0x0F, 0x36, 0x6C, 0x5C, 0x39, 0x9C, 0x60,
+ 0x9B, 0x42, 0xDE, 0x40, 0x6E, 0xC0, 0x27, 0x76, 0x68, 0x5C, 0x35, 0xE5, 0x57, 0x1E, 0x27, 0x38,
+ 0x3C, 0x59, 0x17, 0x3E, 0xC1, 0x77, 0x06, 0x45, 0xBD, 0x5E, 0xFD, 0x13, 0x72, 0x2E, 0xCD, 0x62,
+ 0x28, 0x63, 0xAF, 0x61, 0x26, 0x67, 0x07, 0x0F, 0xC3, 0xFE, 0xBB, 0x99, 0x17, 0x6F, 0xBB, 0x82,
+ 0xCC, 0x6E, 0x99, 0xF1, 0x70, 0xAD, 0x4B, 0x78, 0x1C, 0x44, 0x78, 0x36, 0x05, 0x01, 0x38, 0x1E,
+ 0x8E, 0xB1, 0xCE, 0x2F, 0xD2, 0x9F, 0x09, 0x4F, 0x01, 0xB1, 0x12, 0xDD, 0x8E, 0x94, 0x51, 0x43,
+ 0xCD, 0x48, 0xE4, 0x62, 0x71, 0xA5, 0x64, 0xDD, 0xB5, 0x25, 0x2B, 0x67, 0x97, 0x17, 0xC8, 0xE5,
+ 0xD1, 0x52, 0x0E, 0x2E, 0xD1, 0x7D, 0xA1, 0x0C, 0x2E, 0x16, 0x91, 0xC2, 0x5D, 0xE0, 0x16, 0x41,
+ 0x91, 0xA9, 0x27, 0x84, 0x36, 0x1C, 0xC2, 0xAC, 0x10, 0x69, 0x1E, 0x5E, 0x83, 0xE4, 0xA2, 0x9B,
+ 0xEE, 0x4F, 0xAE, 0xE5, 0xAF, 0x83, 0x6C, 0xD7, 0xF8, 0x24, 0x41, 0x33, 0x2B, 0x02, 0xD8, 0xBE,
+ 0x77, 0x8D, 0xC4, 0x86, 0xBA, 0x2F, 0xE6, 0x0F, 0x46, 0xE8, 0x83, 0x38, 0x8E, 0x17, 0x02, 0x98,
+ 0xF7, 0x3B, 0xA0, 0x0C, 0xDD, 0x34, 0x25, 0x0C, 0x19, 0x94, 0x18, 0xF9, 0xA7, 0xCD, 0x33, 0xED,
+ 0xD1, 0xA9, 0x8B, 0xB7, 0xEF, 0x6B, 0xF0, 0x1D, 0x71, 0x22, 0x6D, 0xC5, 0x5B, 0xF0, 0xCA, 0x08,
+ 0xE0, 0xBE, 0x75, 0x76, 0x5E, 0x50, 0x68, 0xA3, 0xC1, 0x39, 0x08, 0x18, 0x85, 0xA8, 0xC6, 0xDE,
+ 0x50, 0x0E, 0xF0, 0x38, 0x8B, 0xA9, 0x16, 0xFB, 0x2D, 0x69, 0x16, 0xA2, 0x55, 0x3D, 0x48, 0x82,
+ 0xD3, 0x14, 0xCA, 0x76, 0x26, 0xA3, 0x61, 0x56, 0xC1, 0x0E, 0xF7, 0xAE, 0x61, 0xC4, 0xEC, 0xB8,
+ 0x1D, 0x7C, 0x8E, 0x4A, 0x9F, 0xC4, 0x62, 0xB8, 0x5A, 0x42, 0x5E, 0xA9, 0x5E, 0x20, 0x06, 0x66,
+ 0xBD, 0x53, 0x49, 0x84, 0x8C, 0xE7, 0xA4, 0xB3, 0xF8, 0x25, 0xA3, 0xF8, 0x49, 0x8B, 0x8F, 0x66,
+ 0xEF, 0xC9, 0xBF, 0x88, 0x5A, 0xE9, 0x22, 0xDD, 0x38, 0xEE, 0xED, 0x7B, 0xB7, 0x0C, 0x0A, 0xEC,
+ 0x26, 0x72, 0x5A, 0xE8, 0xAF, 0x62, 0xAE, 0x01, 0xFA, 0xA0, 0x91, 0x52, 0x55, 0x49, 0x09, 0x5A,
+ 0x4E, 0xC4, 0xB4, 0x78, 0x8C, 0xAE, 0x4F, 0xED, 0x32, 0x88, 0x55, 0xE1, 0x40, 0xDA, 0x77, 0x1A,
+ 0x17, 0x00, 0x9C, 0x14, 0xB9, 0x52, 0x94, 0xB3, 0x02, 0x91, 0x03, 0x90, 0xF4, 0xF1, 0x4C, 0x52,
+ 0x6C, 0x52, 0x39, 0xC5, 0x92, 0xCE, 0x91, 0x42, 0x27, 0xAE, 0x16, 0x44, 0xCF, 0xE4, 0xB8, 0x51,
+ 0x39, 0x03, 0xC0, 0xEE, 0xCE, 0xAB, 0x9F, 0x76, 0x75, 0x53, 0xCD, 0x5E, 0x88, 0x54, 0x9F, 0x61,
+ 0x70, 0xFA, 0xDD, 0x36, 0xFA, 0x37, 0x35, 0x6D, 0xF4, 0x0F, 0x29, 0xC2, 0x22, 0x40, 0x7B, 0x86,
+ 0x7E, 0xCE, 0x9A, 0xED, 0x1A, 0xDC, 0x49, 0xDE, 0x7A, 0xCD, 0xCB, 0x0F, 0xAB, 0xFC, 0x97, 0xC8,
+ 0x8B, 0x3A, 0x0A, 0xAB, 0x23, 0x6D, 0xFC, 0xE9, 0xC4, 0x30, 0x46, 0x30, 0x82, 0x14, 0xFB, 0xBA,
+ 0x77, 0x6F, 0x16, 0x32, 0xD7, 0xE8, 0xAA, 0x79, 0x3D, 0x0B, 0x91, 0x11, 0x45, 0x57, 0x05, 0x79,
+ 0x99, 0x12, 0x55, 0x36, 0x5B, 0x06, 0xCA, 0xAA, 0x82, 0x51, 0x84, 0x8B, 0x20, 0xE9, 0x6A, 0x3A,
+ 0x17, 0x30, 0x30, 0xFD, 0x99, 0xEC, 0xBD, 0x54, 0xCC, 0x3A, 0xC0, 0xFF, 0x5C, 0x49, 0xE0, 0x6C,
+ 0x99, 0x0F, 0x48, 0xCD, 0x70, 0x62, 0x7B, 0x69, 0x92, 0x34, 0x2D, 0x44, 0x63, 0x23, 0x9E, 0x1F,
+ 0x17, 0x7B, 0x2A, 0xF5, 0x06, 0x02, 0x24, 0x21, 0x51, 0x2E, 0x02, 0x2D, 0x23, 0x51, 0x7C, 0x8E,
+ 0xD3, 0x32, 0xE2, 0x28, 0x3B, 0x6B, 0x0E, 0x5B, 0x4B, 0xD5, 0x2B, 0x38, 0x1E, 0x5C, 0xC9, 0x31,
+ 0x88, 0x85, 0xB9, 0xD3, 0x6F, 0x37, 0xAF, 0x93, 0x80, 0xD6, 0x19, 0x31, 0x9A, 0x98, 0x45, 0xF9,
+ 0x74, 0x30, 0x99, 0x56, 0x29, 0xF3, 0xFA, 0x33, 0x6A, 0xBB, 0x70, 0x58, 0x53, 0x0E, 0x17, 0x27,
+ 0xDD, 0x3D, 0xE8, 0x07, 0x85, 0x2A, 0xCB, 0x33, 0x60, 0x23, 0xB0, 0xE9, 0x60, 0x7C, 0xF1, 0x47,
+ 0x69, 0xE1, 0x69, 0x57, 0x3E, 0x8C, 0x49, 0x30, 0xA3, 0x7A, 0xD6, 0x79, 0x1F, 0xF9, 0xCF, 0x1C,
+ 0xE1, 0x56, 0xF1, 0x92, 0xC0, 0x66, 0xC7, 0x67, 0xF0, 0xC6, 0x78, 0x6A, 0x48, 0x26, 0xD4, 0xE9,
+ 0xFA, 0x50, 0x8B, 0xC4, 0xB1, 0x19, 0x96, 0x1F, 0x0C, 0x67, 0x0A, 0xB0, 0x4B, 0x75, 0x1C, 0xBA,
+ 0x86, 0x42, 0xE3, 0x2E, 0x0C, 0xF8, 0xFC, 0x19, 0x66, 0x7B, 0x51, 0xDB, 0x3E, 0xBB, 0xA2, 0xC0,
+ 0xBF, 0x31, 0x9A, 0x8A, 0x3E, 0x4F, 0x24, 0xA0, 0xD3, 0xDA, 0x15, 0x35, 0x91, 0x10, 0x3F, 0x1B,
+ 0x40, 0x9A, 0x79, 0xB7, 0xE4, 0x8B, 0x9E, 0xBB, 0xD8, 0x98, 0x31, 0x8C, 0x69, 0xDE, 0x25, 0xFD,
+ 0x0E, 0x87, 0xC3, 0xD9, 0x8C, 0xAD, 0xC0, 0x95, 0x19, 0x15, 0x18, 0xE1, 0xBD, 0xB1, 0x4F, 0xD4,
+ 0x94, 0x09, 0x3B, 0xD5, 0x07, 0xC1, 0x72, 0xEE, 0x33, 0xA2, 0x9E, 0xAA, 0x05, 0x4E, 0xD3, 0xD3,
+ 0x43, 0x43, 0xB9, 0xE6, 0xBE, 0xCF, 0xE8, 0xE4, 0x00, 0x11, 0x5D, 0xA2, 0x97, 0xAE, 0x1F, 0x3C,
+ 0x3C, 0x0F, 0xA5, 0x06, 0xE5, 0xF8, 0xDE, 0x94, 0x00, 0xA0, 0x99, 0xD2, 0x4C, 0x13, 0x05, 0x09,
+ 0xB8, 0x08, 0x61, 0x3A, 0x67, 0xBB, 0x77, 0xA8, 0x69, 0xA3, 0x8F, 0xF4, 0xF2, 0x2A, 0x6A, 0x88,
+ 0x9E, 0xFD, 0x81, 0xF1, 0x7B, 0xA7, 0xFA, 0x15, 0xCF, 0x32, 0x04, 0x22, 0xD3, 0x62, 0x4C, 0xF4,
+ 0x65, 0x76, 0x5C, 0x85, 0x5E, 0x98, 0x18, 0x6A, 0xF8, 0x95, 0xC1, 0x2A, 0x8E, 0xFF, 0xCD, 0x48,
+ 0x8E, 0x58, 0xE6, 0xCA, 0x8A, 0x8E, 0xA2, 0x0D, 0x33, 0x35, 0xA0, 0xD3, 0xC6, 0x28, 0x72, 0x63,
+ 0xB4, 0xCB, 0x0A, 0xB1, 0x47, 0xF8, 0xFC, 0xF1, 0xC3, 0x7A, 0xAD, 0x56, 0x51, 0x4D, 0xE5, 0x53,
+ 0xB1, 0x3F, 0xC4, 0x2C, 0x7E, 0x93, 0xEB, 0x71, 0x91, 0x06, 0x7C, 0xC7, 0x4E, 0x1F, 0xC0, 0x3C,
+ 0x70, 0x7C, 0x54, 0x7A, 0xA7, 0x46, 0x92, 0x33, 0x3C, 0x99, 0x32, 0x07, 0xAE, 0x7F, 0xD9, 0xF0,
+ 0xEE, 0x4E, 0x26, 0xEE, 0xD7, 0x67, 0xCD, 0xE6, 0x47, 0xD1, 0x1C, 0x17, 0x71, 0x68, 0xAA, 0x07,
+ 0xA4, 0xF4, 0xD0, 0x87, 0xA3, 0x65, 0x2D, 0xA8, 0x3A, 0x06, 0x7B, 0x23, 0x6C, 0xA7, 0xD3, 0x4B,
+ 0xE3, 0x46, 0x6C, 0x31, 0x5B, 0x4F, 0x8F, 0xBF, 0xEB, 0x17, 0x68, 0x05, 0xF3, 0x3D, 0xD9, 0xA1,
+ 0x7B, 0x05, 0x7E, 0x05, 0x14, 0xEF, 0x00, 0xE2, 0xF6, 0xD3, 0xF1, 0x4C, 0x60, 0xC9, 0x71, 0xBD,
+ 0x8B, 0x47, 0x84, 0x24, 0x99, 0x94, 0x99, 0x03, 0xB7, 0xE7, 0x1E, 0x8A, 0x56, 0xE0, 0xCB, 0xD8,
+ 0x12, 0x73, 0x08, 0x3D, 0x31, 0xCF, 0xE2, 0x46, 0xBF, 0x16, 0x62, 0x13, 0xA3, 0x3B, 0x62, 0x2A,
+ 0x6C, 0xF4, 0x77, 0x90, 0x04, 0x7A, 0x95, 0x2C, 0x61, 0xD0, 0xA4, 0x84, 0x3F, 0x32, 0x48, 0xBA,
+ 0xE5, 0xCD, 0x39, 0xF5, 0x5D, 0x5A, 0x3E, 0x0A, 0x4C, 0xBF, 0x0A, 0xEC, 0xCF, 0x0B, 0xF2, 0xEA,
+ 0x38, 0x17, 0x36, 0xDB, 0xD6, 0x2D, 0x48, 0x78, 0xBB, 0x20, 0x5F, 0x5F, 0xDF, 0x63, 0x6D, 0xF5,
+ 0x3D, 0x74, 0xA8, 0xE1, 0xE4, 0x4C, 0x87, 0x65, 0x78, 0x1B, 0x5B, 0xC6, 0xEE, 0x37, 0x69, 0x39,
+ 0x8C, 0xD6, 0x3C, 0x24, 0x6B, 0xFE, 0x4A, 0xC9, 0x13, 0xF8, 0x33, 0x2C, 0xDB, 0xA3, 0x7A, 0xE3,
+ 0x6C, 0x76, 0x18, 0x01, 0x62, 0x95, 0x67, 0x4A, 0xB5, 0xE7, 0xF4, 0xD7, 0x63, 0x74, 0x2F, 0xE0,
+ 0x57, 0x3B, 0x3C, 0x33, 0xC6, 0x06, 0x03, 0xD7, 0x93, 0x0F, 0x8D, 0xDD, 0x57, 0xC3, 0x0C, 0x50,
+ 0xBC, 0x08, 0xF6, 0x98, 0xA1, 0x04, 0x1D, 0xC8, 0x46, 0x02, 0x2E, 0x2D, 0x3D, 0xF1, 0xCD, 0x4B,
+ 0x9B, 0x3F, 0x0C, 0xBC, 0xD3, 0x2F, 0x87, 0xE7, 0x50, 0xA1, 0x7B, 0x94, 0xC5, 0xCD, 0xEC, 0xE9,
+ 0x29, 0xE7, 0x6C, 0xD4, 0xC1, 0x18, 0xA4, 0xCA, 0x4F, 0x00, 0x4E, 0xF9, 0x36, 0x89, 0xFD, 0x07,
+ 0x47, 0xE6, 0xD5, 0xB7, 0xAA, 0x34, 0x7C, 0x16, 0x7B, 0xCB, 0x49, 0x92, 0xF2, 0x03, 0x66, 0x8E,
+ 0xEF, 0x11, 0xFC, 0x8F, 0x26, 0xA5, 0x78, 0x9A, 0x4B, 0x29, 0xC7, 0x98, 0x15, 0xA1, 0x35, 0x58,
+ 0x0C, 0xD5, 0xF8, 0x6F, 0x50, 0x1C, 0xDC, 0x41, 0x20, 0xCC, 0x2A, 0x42, 0xE1, 0xEF, 0x28, 0x22,
+ 0x67, 0x89, 0x71, 0x5B, 0x9B, 0xBA, 0x92, 0xED, 0x1C, 0xB6, 0x9C, 0x89, 0xD4, 0x00, 0x21, 0xD3,
+ 0xF1, 0xD9, 0x3E, 0x9B, 0x55, 0x71, 0xF7, 0x75, 0x26, 0x5A, 0x13, 0x65, 0xBF, 0x6E, 0x46, 0x90,
+ 0x85, 0x7B, 0xD7, 0xD4, 0xDC, 0x90, 0x23, 0x4C, 0x83, 0x12, 0x87, 0x7D, 0x8D, 0xF2, 0x39, 0x4E,
+ 0x9A, 0xA0, 0x4A, 0xDE, 0xAB, 0xCA, 0xA7, 0xCB, 0xBD, 0x1A, 0xA5, 0x3F, 0x54, 0x12, 0x92, 0x6F,
+ 0xEF, 0x37, 0x88, 0xDD, 0x52, 0xDB, 0xD0, 0x8F, 0xEA, 0xCD, 0x88, 0x69, 0x8C, 0x44, 0x6A, 0xF3,
+ 0xD0, 0x61, 0x8B, 0x20, 0x91, 0x17, 0x32, 0x32, 0xBE, 0x39, 0x42, 0xE7, 0x1C, 0x3E, 0x8A, 0x02,
+ 0x58, 0x95, 0x76, 0x45, 0x3A, 0x06, 0x28, 0xE0, 0x7A, 0x47, 0x23, 0x87, 0xB1, 0x5F, 0xF0, 0xE1,
+ 0x2D, 0x18, 0xA4, 0x9B, 0xE7, 0x90, 0xB3, 0xFC, 0x96, 0x2D, 0xAA, 0x04, 0x72, 0x39, 0xCA, 0xF6,
+ 0x8B, 0xFE, 0x5D, 0xF8, 0xAA, 0xFF, 0xBE, 0x94, 0xE3, 0xEF, 0xF2, 0x74, 0x22, 0xD4, 0x8C, 0x82,
+ 0x2C, 0x73, 0x8B, 0xB8, 0x39, 0x35, 0xCF, 0xCB, 0x48, 0xE8, 0xAC, 0x05, 0x49, 0xEE, 0x08, 0x30,
+ 0xFF, 0x99, 0x48, 0xE1, 0x66, 0xDD, 0x01, 0xD9, 0x39, 0x22, 0xDE, 0x2C, 0x1C, 0x47, 0x08, 0xA3,
+ 0x97, 0xFE, 0x02, 0x8C, 0x6B, 0x9E, 0xBF, 0xC4, 0x46, 0xAB, 0x94, 0x6D, 0x86, 0xC2, 0x45, 0x95,
+ 0xB9, 0x1D, 0x15, 0x89, 0xA9, 0x76, 0x7A, 0xDD, 0x11, 0xDC, 0x54, 0x4E, 0x37, 0x96, 0x1E, 0x37,
+ 0xE2, 0xB4, 0xE0, 0xD8, 0xB6, 0xBC, 0xF8, 0xA4, 0x47, 0xC5, 0x6E, 0x33, 0x8F, 0xC2, 0x5C, 0x3B,
+ 0x8E, 0x51, 0x01, 0x10, 0xF1, 0x08, 0x10, 0xD8, 0x47, 0x38, 0xF4, 0x28, 0x22, 0x0E, 0x21, 0x96,
+ 0x8B, 0x89, 0xA6, 0x43, 0x6B, 0xDA, 0xBC, 0xD5, 0xDC, 0x74, 0x74, 0xC6, 0x64, 0xCA, 0x6A, 0x42,
+ 0x7C, 0x24, 0x80, 0x40, 0x1F, 0x82, 0x19, 0x25, 0xB7, 0x97, 0x40, 0x78, 0x16, 0x18, 0x71, 0x5C,
+ 0x44, 0xCD, 0x1B, 0x9F, 0xC9, 0xE0, 0xA6, 0x3F, 0xF4, 0xAA, 0x2B, 0x4E, 0xC2, 0x12, 0x24, 0x3F,
+ 0x98, 0xAD, 0x54, 0x84, 0xAF, 0x72, 0xA9, 0xBF, 0x61, 0x85, 0xA1, 0x95, 0xD8, 0xC1, 0x72, 0x4B,
+ 0x02, 0x21, 0x38, 0x7E, 0x29, 0xA8, 0x90, 0xBA, 0x9A, 0xF9, 0x4D, 0xB4, 0xFC, 0xAC, 0xB8, 0x27,
+ 0x77, 0xA0, 0xBE, 0x1E, 0x45, 0xFE, 0x2B, 0x49, 0x8E, 0x48, 0x66, 0xD5, 0x97, 0x1B, 0x21, 0x65,
+ 0x4F, 0xA5, 0x7E, 0xF8, 0x7E, 0x89, 0xB6, 0x1B, 0x4F, 0xB1, 0x2E, 0xC2, 0x84, 0x50, 0xB6, 0xC7,
+ 0xD5, 0xBC, 0xEE, 0x86, 0xBE, 0xB7, 0x27, 0xDB, 0xE8, 0xF3, 0x49, 0x02, 0xBF, 0xB1, 0x33, 0x71,
+ 0x5D, 0xA3, 0x3D, 0x28, 0x7E, 0x24, 0x76, 0x0E, 0x29, 0xAA, 0x65, 0xC8, 0x0B, 0xD2, 0xE1, 0xF1,
+ 0x36, 0x03, 0x2C, 0x28, 0x92, 0x3A, 0x42, 0x5A, 0xF8, 0x20, 0xEE, 0x43, 0xB6, 0x56, 0x12, 0xA9,
+ 0x2B, 0x8A, 0xC5, 0x5D, 0x7B, 0x77, 0x76, 0xC3, 0x9B, 0x80, 0xD9, 0x30, 0x7F, 0xE5, 0x0F, 0x2B,
+ 0x6A, 0x87, 0x29, 0xEF, 0x51, 0xED, 0x8C, 0x27, 0x2D, 0xD3, 0x9E, 0xEC, 0x4D, 0x3A, 0xDA, 0x65,
+ 0xB6, 0x17, 0xD1, 0x73, 0xEE, 0xE7, 0x94, 0x07, 0x12, 0x79, 0x9F, 0xF4, 0xA0, 0x0C, 0x7F, 0x95,
+ 0xBB, 0x28, 0xF9, 0xE3, 0x5F, 0x46, 0xB5, 0xC6, 0x0C, 0x4A, 0x18, 0xCB, 0x79, 0xA6, 0x90, 0x36,
+ 0xC5, 0xF7, 0x08, 0x36, 0xD2, 0xE7, 0x73, 0x21, 0x59, 0x8F, 0xF5, 0xC8, 0x89, 0xB1, 0x09, 0x11,
+ 0x03, 0xCD, 0xA4, 0xB7, 0x64, 0x04, 0x4A, 0xF4, 0x69, 0x06, 0x89, 0x66, 0x9E, 0xB1, 0x96, 0x1C,
+ 0x55, 0x22, 0x3F, 0x70, 0xBE, 0x72, 0x3D, 0x7C, 0xBC, 0x18, 0x8F, 0xEF, 0x69, 0x91, 0x76, 0x75,
+ 0x21, 0x20, 0x01, 0xAB, 0x44, 0x60, 0x13, 0x6A, 0xBC, 0xB5, 0x0B, 0x95, 0x3E, 0xE4, 0xA3, 0x4E,
+ 0x18, 0xD6, 0xBC, 0x51, 0x3C, 0xE2, 0x3D, 0x71, 0x70, 0xFB, 0xBF, 0xAD, 0x5F, 0x57, 0xB6, 0x6E,
+ 0x9F, 0xBE, 0x70, 0x69, 0x53, 0xEE, 0x34, 0x53, 0x9D, 0xE5, 0xBD, 0x51, 0x9D, 0x1D, 0xEA, 0xBC,
+ 0xD8, 0x89, 0x98, 0xC1, 0x26, 0xCF, 0x0F, 0x65, 0x71, 0xFE, 0x3B, 0x89, 0x9B, 0x5E, 0xAF, 0x6C,
+ 0xFD, 0xB2, 0x53, 0x88, 0x42, 0x7C, 0xFB, 0x87, 0x49, 0x69, 0x4D, 0x7D, 0xC9, 0x76, 0xA7, 0x84,
+ 0x10, 0xFF, 0xF8, 0x63, 0x64, 0xB1, 0xF2, 0x7D, 0x72, 0x79, 0xD8, 0xF1, 0x8B, 0xB6, 0xA3, 0x80,
+ 0xEF, 0x15, 0x92, 0x40, 0xBE, 0x01, 0x05, 0xCB, 0xA8, 0x07, 0x0C, 0xE0, 0xEE, 0x8F, 0xEA, 0xF6,
+ 0x62, 0x9B, 0x4C, 0x89, 0xC4, 0x0D, 0xBC, 0x55, 0x32, 0x91, 0xCC, 0x68, 0xD7, 0x40, 0x54, 0x13,
+ 0x1D, 0xD9, 0x96, 0x49, 0xB6, 0x63, 0xCB, 0xF3, 0x3E, 0x4C, 0xA1, 0xE3, 0xDA, 0xD1, 0x7C, 0x88,
+ 0x2D, 0xB5, 0xED, 0x6F, 0x9D, 0x85, 0x91, 0x3A, 0x5B, 0x80, 0xBB, 0xB8, 0x3B, 0x7E, 0xD2, 0x4B,
+ 0xE1, 0xDF, 0x2A, 0x32, 0x5B, 0x2C, 0xED, 0xB4, 0x39, 0xD2, 0x46, 0xB9, 0x3F, 0x4F, 0x98, 0xB5,
+ 0xB7, 0xB7, 0x16, 0xE9, 0xB1, 0x2A, 0xD5, 0x3A, 0x1B, 0xC1, 0xC4, 0xA4, 0xEB, 0x15, 0x86, 0x86,
+ 0x2E, 0x51, 0xA6, 0xCE, 0x9D, 0xEB, 0x47, 0x15, 0x7F, 0x37, 0x1B, 0x3E, 0x26, 0xED, 0x17, 0xE4,
+ 0x23, 0xE2, 0x7E, 0xDA, 0x03, 0xC8, 0x94, 0xE0, 0x50, 0x6C, 0x8C, 0x68, 0xCE, 0x04, 0x24, 0x7F,
+ 0x67, 0x0D, 0x2F, 0x77, 0xF7, 0x07, 0x75, 0x33, 0xFE, 0x4C, 0x1B, 0x2C, 0x53, 0x19, 0x47, 0xFA,
+ 0x4E, 0x1F, 0x5D, 0x2E, 0x80, 0x2E, 0x9E, 0xE5, 0xA6, 0x4E, 0x41, 0x45, 0x8C, 0x63, 0xA4, 0x4C,
+ 0x5E, 0x19, 0x04, 0x51, 0x6A, 0xAF, 0x6E, 0x4F, 0xBB, 0xA8, 0xAB, 0x87, 0xD4, 0xD7, 0x99, 0x59,
+ 0x77, 0x54, 0x0E, 0x10, 0xE8, 0x7B, 0xC5, 0x7B, 0x6D, 0x13, 0xA8, 0x58, 0xB7, 0x67, 0xD6, 0x23,
+ 0xF1, 0x97, 0xC6, 0xB1, 0xFE, 0x83, 0xE8, 0xBB, 0xC1, 0xD2, 0x26, 0x83, 0xDD, 0x8E, 0x86, 0x4F,
+ 0x69, 0xE5, 0xC4, 0x72, 0x56, 0x98, 0x0A, 0xB1, 0x58, 0x03, 0x4E, 0x14, 0xCD, 0x25, 0x65, 0xEF,
+ 0x31, 0xD0, 0x68, 0x45, 0x9C, 0x42, 0x84, 0xB8, 0xC9, 0x8F, 0xB0, 0xF8, 0xF1, 0xD2, 0x45, 0x75,
+ 0xD3, 0x4F, 0x13, 0x52, 0xD3, 0x8F, 0xF3, 0x8A, 0x3F, 0x73, 0xF0, 0x56, 0x24, 0x1B, 0x77, 0xFC,
+ 0xE4, 0xCC, 0x42, 0x57, 0x8F, 0xF8, 0xE8, 0x4C, 0x53, 0x5F, 0x22, 0x35, 0xDD, 0x6E, 0x33, 0x11,
+ 0xC8, 0xB2, 0xEB, 0xFF, 0x9B, 0x0F, 0xC7, 0x20, 0xED, 0x6F, 0x70, 0xC8, 0x8D, 0x1E, 0xDE, 0x2F,
+ 0x0E, 0x19, 0x50, 0xA2, 0xF1, 0x4F, 0x90, 0x56, 0x07, 0x63, 0x0A, 0x8D, 0xE2, 0x6E, 0xAE, 0x95,
+ 0x68, 0xCA, 0xEA, 0x78, 0x0C, 0xB1, 0xA4, 0x30, 0x14, 0x77, 0x48, 0x0C, 0x51, 0xD9, 0xE5, 0x30,
+ 0x7C, 0xCE, 0x77, 0xBA, 0xC7, 0x34, 0x9D, 0x25, 0x4D, 0xCF, 0x21, 0xE2, 0xCF, 0x50, 0xBA, 0x2A,
+ 0x32, 0xC7, 0x66, 0x07, 0xBA, 0x46, 0xE6, 0x69, 0xDE, 0x46, 0xDF, 0x03, 0x28, 0x51, 0xFE, 0x11,
+ 0x1C, 0x33, 0xBC, 0x4F, 0xD4, 0x2E, 0xC3, 0x7A, 0xED, 0x2A, 0xCE, 0xCA, 0x34, 0xE8, 0x4F, 0x65,
+ 0x8E, 0xF3, 0x77, 0x05, 0x67, 0xFB, 0xD5, 0x1D, 0x5C, 0x94, 0xB5, 0x27, 0xA9, 0x61, 0xF7, 0x99,
+ 0x15, 0x77, 0x2B, 0xA0, 0xB1, 0xB4, 0x3B, 0x72, 0x33, 0x67, 0xA7, 0x70, 0xFB, 0x60, 0x72, 0x04,
+ 0xC4, 0x88, 0x4C, 0xA5, 0x1C, 0xEF, 0x17, 0x66, 0x74, 0xAE, 0xBC, 0x01, 0xC3, 0x2F, 0x0D, 0xD6,
+ 0x12, 0xDF, 0x4F, 0x2C, 0x63, 0xC1, 0x79, 0xF8, 0x50, 0xC9, 0x52, 0x34, 0xA0, 0x6E, 0x73, 0xBA,
+ 0x5A, 0x31, 0x22, 0xF3, 0xC5, 0x98, 0xB0, 0x18, 0xD8, 0x7B, 0x2B, 0x06, 0x47, 0x9D, 0x50, 0xE6,
+ 0x16, 0xBF, 0x59, 0xC9, 0x34, 0xF0, 0x51, 0x58, 0x60, 0xD8, 0xEE, 0x83, 0xC8, 0x8B, 0x1E, 0x92,
+ 0x8F, 0xF0, 0xDF, 0x12, 0x61, 0xCC, 0x69, 0x21, 0x68, 0xE8, 0x78, 0xB8, 0xF2, 0xF0, 0xDE, 0xE7,
+ 0xAB, 0x8A, 0xA4, 0x38, 0x32, 0x06, 0xAE, 0xCD, 0x53, 0x92, 0xE4, 0x9B, 0x2C, 0xC1, 0x63, 0x30,
+ 0x29, 0xB5, 0x12, 0x21, 0x99, 0xCA, 0x99, 0x94, 0x92, 0x71, 0xFB, 0x0A, 0x31, 0xEF, 0xBF, 0xE2,
+ 0x52, 0x2B, 0xA5, 0xCE, 0x16, 0x5D, 0x15, 0x4A, 0x25, 0xCF, 0x74, 0x96, 0x9A, 0x95, 0x21, 0x2C,
+ 0xEA, 0xB7, 0xA1, 0xAE, 0xD4, 0x15, 0x29, 0x38, 0xF9, 0x7B, 0x6C, 0xD7, 0x3A, 0x52, 0xFD, 0x60,
+ 0xA2, 0xD0, 0xEE, 0xA5, 0xDF, 0x4C, 0xC6, 0xBF, 0x30, 0x82, 0x20, 0xB6, 0x73, 0x58, 0xC8, 0x7B,
+ 0xA8, 0xEA, 0x01, 0x9B, 0xEA, 0x02, 0x89, 0xD0, 0x83, 0x71, 0x14, 0x98, 0xB0, 0x6E, 0x5B, 0x80,
+ 0xB4, 0xBA, 0x4D, 0xC5, 0x95, 0x77, 0x5A, 0x44, 0x56, 0x74, 0x12, 0x48, 0xBC, 0xAE, 0x92, 0xCF,
+ 0x5A, 0xF9, 0x62, 0xE8, 0x72, 0xA5, 0x72, 0x5B, 0x58, 0xC6, 0x14, 0x29, 0xF1, 0xC4, 0xD6, 0xC6,
+ 0x75, 0x71, 0x9C, 0xC4, 0x7D, 0xC5, 0x93, 0x26, 0xA2, 0x9B, 0x1C, 0x30, 0xE8, 0x41, 0xC7, 0x03,
+ 0x66, 0x98, 0x2C, 0x10, 0x34, 0x6A, 0x0E, 0xC2, 0x35, 0x53, 0xAA, 0x17, 0x3E, 0xF4, 0xCB, 0x9C,
+ 0xC4, 0x1E, 0xB4, 0x79, 0x0B, 0xA0, 0x41, 0x4B, 0xC6, 0xB4, 0xAC, 0x5F, 0xDA, 0x48, 0x01, 0x0D,
+ 0xBF, 0xDF, 0x6A, 0x0E, 0x42, 0x16, 0xFC, 0x97, 0x58, 0x98, 0x04, 0xDA, 0x46, 0x1E, 0x37, 0x55,
+ 0x77, 0x2A, 0xB8, 0x58, 0x6B, 0x9E, 0x55, 0x2E, 0xF6, 0x52, 0x17, 0x38, 0xE1, 0xA7, 0xD9, 0xA0,
+ 0x08, 0xF3, 0x3E, 0x0B, 0xE4, 0x10, 0x37, 0x2A, 0x16, 0x54, 0x63, 0x1E, 0x5A, 0x43, 0xC7, 0xDE,
+ 0xA3, 0xE9, 0x3B, 0x85, 0x3A, 0xFB, 0x03, 0xE9, 0xDE, 0xD9, 0x1C, 0xDD, 0x9B, 0x56, 0x4F, 0x70,
+ 0x77, 0xDD, 0xF3, 0xBA, 0x0F, 0xA4, 0x0F, 0x12, 0x5A, 0x1C, 0xF4, 0x32, 0xE8, 0x58, 0x6C, 0x23,
+ 0xC5, 0x46, 0x2E, 0x1C, 0xCA, 0xE0, 0x99, 0x27, 0x77, 0xC8, 0x14, 0xD3, 0x34, 0xA4, 0xEA, 0xDD,
+ 0x76, 0x3C, 0x91, 0x39, 0x96, 0x2A, 0xEE, 0x63, 0x05, 0x6A, 0x2D, 0x65, 0x48, 0x88, 0xE6, 0x9D,
+ 0x26, 0xE3, 0x95, 0xD6, 0xFC, 0x86, 0xC8, 0x41, 0xB5, 0x14, 0x99, 0x2C, 0x35, 0x8C, 0xBD, 0xA8,
+ 0x28, 0x1D, 0xF7, 0x74, 0x00, 0x36, 0xCA, 0xE8, 0xBB, 0x28, 0x35, 0x03, 0x10, 0x23, 0xEC, 0x82,
+ 0x4C, 0x32, 0x59, 0xAB, 0x6B, 0x01, 0x2B, 0x42, 0xEB, 0x67, 0x4D, 0x49, 0x80, 0x47, 0x7C, 0xD0,
+ 0xFE, 0x48, 0xB5, 0xC8, 0xB3, 0xF3, 0x06, 0x37, 0x13, 0x65, 0xF1, 0x53, 0x9C, 0x24, 0x00, 0x29,
+ 0x41, 0x8E, 0x97, 0xE7, 0x47, 0x21, 0xF8, 0xB6, 0xEF, 0xC1, 0x08, 0xAC, 0x8B, 0xF3, 0xDF, 0xD1,
+ 0x9B, 0xED, 0x16, 0xEA, 0x5C, 0x3C, 0x39, 0xF6, 0xB9, 0x0F, 0x0D, 0xC1, 0x0C, 0x79, 0xB4, 0xFA,
+ 0xEC, 0x7F, 0xD2, 0xE0, 0x80, 0xEC, 0xF1, 0x88, 0xBE, 0x68, 0xA8, 0xD1, 0x38, 0xB5, 0xFE, 0xB5,
+ 0xED, 0x1A, 0xB1, 0x8D, 0xBC, 0x50, 0x9B, 0xA5, 0x40, 0x45, 0xB4, 0x94, 0x25, 0xF8, 0xA5, 0xEB,
+ 0x88, 0x00, 0xC8, 0xCA, 0xBA, 0x86, 0xF6, 0xB6, 0xDA, 0xC0, 0xF3, 0x42, 0xDA, 0xE4, 0x16, 0xB1,
+ 0x3A, 0xC1, 0xAB, 0x29, 0xF8, 0xD2, 0xCF, 0xB6, 0x24, 0xBD, 0xE9, 0xA7, 0x18, 0xA7, 0xED, 0x80,
+ 0x0B, 0x0A, 0x91, 0xD7, 0x8C, 0xC9, 0x60, 0x5F, 0x73, 0xBE, 0x7C, 0x12, 0x26, 0xED, 0xC5, 0xA4,
+ 0x55, 0x83, 0x55, 0x93, 0x74, 0xF7, 0x1B, 0x05, 0x8B, 0xBA, 0x88, 0x1D, 0x42, 0x9A, 0x15, 0x78,
+ 0x9F, 0xE9, 0x62, 0x95, 0x65, 0xD5, 0x16, 0x02, 0x1F, 0xCA, 0x13, 0xA8, 0x52, 0x84, 0xBF, 0xAD,
+ 0xE5, 0xDD, 0xDB, 0x18, 0xB5, 0x37, 0x8D, 0x70, 0x5E, 0xF9, 0xE3, 0xC2, 0x33, 0x1F, 0xCC, 0x97,
+ 0x52, 0x35, 0x13, 0xD9, 0xD0, 0x29, 0x44, 0x0B, 0xD8, 0xBD, 0xB2, 0x93, 0x6C, 0x2C, 0xAC, 0x7B,
+ 0x14, 0x94, 0x67, 0xCC, 0x65, 0x5E, 0x78, 0x53, 0x82, 0x72, 0xFE, 0xFB, 0xD9, 0x04, 0x5F, 0x90,
+ 0x6C, 0xB0, 0xFB, 0x80, 0x6C, 0x7D, 0x0B, 0x62, 0x8B, 0x7B, 0x73, 0x7D, 0x1F, 0x6B, 0x93, 0x7D,
+ 0x07, 0x66, 0x98, 0xBB, 0xB2, 0x49, 0xB3, 0x34, 0x10, 0xBB, 0x23, 0x2B, 0x14, 0xA0, 0xB4, 0x4A,
+ 0xC1, 0x56, 0x7B, 0x47, 0xD4, 0x49, 0x97, 0x4D, 0x69, 0x9C, 0xFC, 0x7C, 0xF2, 0x87, 0xF4, 0x8B,
+ 0xA4, 0xD6, 0xF8, 0xAE, 0x3B, 0x8F, 0x9A, 0x5B, 0x90, 0x29, 0x9C, 0xD9, 0xE2, 0xA9, 0xA2, 0x60,
+ 0x52, 0x4A, 0x1F, 0xE5, 0x6E, 0x7C, 0x49, 0xEC, 0x83, 0xA8, 0x0E, 0x79, 0x5B, 0x0A, 0x1F, 0x53,
+ 0xDB, 0x6C, 0xEF, 0x78, 0x2D, 0x52, 0xBA, 0x00, 0x3A, 0x49, 0xB2, 0xB1, 0x56, 0x1C, 0x3B, 0x7E,
+ 0x99, 0x9C, 0x20, 0xB7, 0xC7, 0x9E, 0x8B, 0x8C, 0x88, 0xF2, 0x15, 0xFF, 0x4F, 0x06, 0xF4, 0x1B,
+ 0x6F, 0x02, 0x1E, 0x3A, 0x29, 0xA0, 0x7B, 0xFA, 0x2C, 0x26, 0x58, 0xE3, 0x75, 0x5F, 0xB8, 0x94,
+ 0x27, 0x70, 0xF6, 0xA5, 0x79, 0x51, 0x0F, 0x72, 0x52, 0x81, 0xDC, 0xDC, 0x74, 0x93, 0xAF, 0xB4,
+ 0xB5, 0x9F, 0xF2, 0x03, 0x4F, 0x79, 0x0A, 0xC5, 0xB9, 0xC7, 0x3E, 0x12, 0x53, 0x3A, 0x63, 0x6A,
+ 0x8A, 0x27, 0xB6, 0x9D, 0x4C, 0x84, 0x87, 0x92, 0xBF, 0x7D, 0x49, 0x52, 0xAF, 0x10, 0xCD, 0x6C,
+ 0x58, 0xC5, 0xF0, 0xFE, 0x59, 0x5C, 0xA8, 0x5A, 0xDE, 0x0E, 0x19, 0x23, 0x3F, 0x01, 0x87, 0xFD,
+ 0x95, 0xA8, 0x61, 0x90, 0x06, 0x49, 0x77, 0xD8, 0xAD, 0xC4, 0x5D, 0x72, 0x65, 0x5D, 0x2A, 0x48,
+ 0x70, 0xE1, 0x37, 0x2C, 0x20, 0x50, 0x24, 0xC4, 0xE7, 0x74, 0x91, 0x30, 0x91, 0x0E, 0xA3, 0x8B,
+ 0x73, 0x6C, 0x31, 0xE1, 0xAF, 0xC7, 0x8C, 0x37, 0xF8, 0x22, 0x71, 0x36, 0xCA, 0xE0, 0xE1, 0x41,
+ 0xF6, 0x74, 0x26, 0x17, 0x08, 0xC2, 0xD9, 0xB5, 0xCE, 0x4A, 0x67, 0x17, 0xC2, 0x54, 0xA0, 0x1F,
+ 0x22, 0xFF, 0x8D, 0xB6, 0x60, 0x26, 0x7B, 0x7B, 0x05, 0x0D, 0x69, 0xAE, 0x6F, 0x09, 0x78, 0x9D,
+ 0xD0, 0x2C, 0x59, 0xB1, 0xE7, 0xAB, 0x9F, 0x5F, 0x0C, 0xB7, 0xB4, 0x98, 0x47, 0x85, 0x28, 0x24,
+ 0x74, 0x05, 0x79, 0xC8, 0x37, 0xDB, 0x2D, 0x71, 0xBA, 0x70, 0x24, 0x1D, 0xC6, 0x4C, 0x23, 0xF6,
+ 0xFE, 0xE5, 0x47, 0x33, 0xA2, 0xAE, 0x44, 0xB1, 0x64, 0x5D, 0xAB, 0xA3, 0xD5, 0xF1, 0x91, 0x12,
+ 0xA1, 0x12, 0x42, 0xFC, 0xF5, 0xE7, 0x15, 0x57, 0x1F, 0x3F, 0x08, 0x7F, 0xD4, 0x5D, 0x0B, 0x97,
+ 0x43, 0x0B, 0xF3, 0x36, 0x54, 0xF6, 0x0A, 0x54, 0xE4, 0x77, 0xBE, 0xDF, 0x8A, 0xCA, 0xC2, 0x43,
+ 0x5F, 0x4A, 0x32, 0xBC, 0x9A, 0x20, 0x27, 0xB3, 0xB9, 0x2F, 0xA7, 0x92, 0x8E, 0xDD, 0x12, 0x15,
+ 0x27, 0x5A, 0x0D, 0xD6, 0x5E, 0xC7, 0xDE, 0xFB, 0x78, 0xE6, 0x63, 0x5E, 0x07, 0x35, 0xC7, 0xAE,
+ 0x04, 0xC0, 0x14, 0xDB, 0x26, 0x45, 0x4D, 0x57, 0x91, 0x4A, 0xB5, 0xDE, 0xF8, 0x40, 0xE1, 0xE4,
+ 0x6C, 0x32, 0xCC, 0x37, 0x44, 0x34, 0x05, 0xC8, 0xC3, 0x49, 0x28, 0xFA, 0xED, 0x93, 0x08, 0x10,
+ 0xA8, 0x8B, 0x00, 0x8C, 0x4D, 0xF5, 0x23, 0xB1, 0x47, 0x2E, 0x2E, 0x6B, 0xC8, 0x18, 0x89, 0x86,
+ 0x59, 0xBA, 0xC7, 0x3F, 0x1C, 0xD5, 0x24, 0x35, 0xBC, 0x37, 0x46, 0x7F, 0xB3, 0x7E, 0xEF, 0x35,
+ 0xA9, 0x1C, 0x2D, 0x8F, 0x10, 0x11, 0x07, 0x8B, 0x5C, 0x1C, 0x4C, 0x42, 0xC6, 0xE6, 0x17, 0x32,
+ 0xF1, 0xBF, 0x61, 0x7A, 0x75, 0x3E, 0x02, 0x58, 0xE1, 0x6B, 0x59, 0x1E, 0xFF, 0x16, 0xC8, 0x65,
+ 0xAF, 0xF1, 0xB1, 0x14, 0x86, 0x84, 0xC1, 0x03, 0x7A, 0x75, 0x7B, 0x9E, 0x6B, 0xD2, 0x4C, 0x39,
+ 0xD0, 0x01, 0x71, 0xB7, 0xFA, 0x36, 0x78, 0x59, 0xB5, 0xF0, 0x63, 0xF1, 0x24, 0xD1, 0x10, 0x37,
+ 0x92, 0xF6, 0x0F, 0x58, 0x7A, 0xC7, 0xCE, 0xB5, 0xC9, 0x79, 0x1C, 0x38, 0x36, 0x07, 0x34, 0x99,
+ 0xCE, 0xC4, 0x97, 0x98, 0x7C, 0xA0, 0xA7, 0xD0, 0x04, 0x2B, 0x5F, 0x10, 0xC9, 0xE8, 0x7A, 0xF6,
+ 0x5C, 0xFC, 0xAC, 0xF4, 0x6F, 0x2E, 0x6B, 0xB7, 0xE8, 0xC5, 0x26, 0xC5, 0xB1, 0x38, 0x8E, 0x5B,
+ 0x81, 0x90, 0x1C, 0x38, 0xB8, 0x8F, 0xD0, 0x82, 0x1B, 0xF0, 0x4A, 0x0C, 0x46, 0x8B, 0xED, 0x49,
+ 0x21, 0xD9, 0x6D, 0x17, 0x29, 0xA1, 0xBB, 0x59, 0xDE, 0x98, 0x24, 0xDF, 0xAE, 0x07, 0xC5, 0x92,
+ 0xD2, 0xC9, 0x92, 0x00, 0x8F, 0xB0, 0xB0, 0x36, 0x58, 0xFA, 0xB8, 0xB0, 0x43, 0x17, 0xB0, 0xA3,
+ 0x3B, 0xAF, 0x39, 0xB8, 0x31, 0x8A, 0x38, 0xBF, 0xD2, 0xEE, 0x06, 0x0B, 0xB6, 0x99, 0x00, 0x41,
+ 0xF5, 0x72, 0x9A, 0x9C, 0x1F, 0xBA, 0xFB, 0x22, 0xB3, 0xA5, 0x8A, 0x11, 0x7B, 0xF2, 0x53, 0xEB,
+ 0x90, 0x60, 0x72, 0x3C, 0xC3, 0x56, 0xAC, 0xBD, 0xE2, 0xFA, 0xBF, 0x37, 0xB8, 0x9F, 0xDD, 0x4E,
+ 0xF1, 0x05, 0x9E, 0x65, 0x3B, 0x45, 0x89, 0xA5, 0xD3, 0xA3, 0xBA, 0xD4, 0x1C, 0xCA, 0x0C, 0xCE,
+ 0xDC, 0x5C, 0x66, 0xFE, 0x4B, 0x44, 0x1A, 0xC9, 0xB0, 0x52, 0x02, 0xCD, 0x47, 0x89, 0x90, 0x2E,
+ 0xA4, 0x3F, 0xEC, 0x90, 0xCD, 0x84, 0xF3, 0x58, 0x6B, 0x24, 0xBA, 0x03, 0xBC, 0x57, 0x1B, 0xA2,
+ 0xAC, 0xF2, 0x80, 0x0F, 0x26, 0x04, 0x59, 0xA2, 0x74, 0x07, 0x03, 0xFD, 0xC4, 0x57, 0x29, 0xCF,
+ 0x90, 0xF7, 0xD3, 0x58, 0x4A, 0x71, 0x69, 0x7C, 0x7F, 0x52, 0x77, 0x1B, 0x0D, 0xFF, 0x0A, 0x59,
+ 0x80, 0x4E, 0x3F, 0xE8, 0x82, 0xB6, 0xA5, 0x68, 0x9C, 0x62, 0x3A, 0x6C, 0x71, 0x3A, 0xCA, 0x23,
+ 0x6E, 0x03, 0xB1, 0x50, 0x32, 0x13, 0x27, 0x81, 0xCB, 0x68, 0x42, 0x7D, 0x32, 0x23, 0x4F, 0x85,
+ 0x39, 0x76, 0x8C, 0x8F, 0xB0, 0x73, 0xD3, 0xED, 0x56, 0xF0, 0xC6, 0x66, 0x01, 0x13, 0xB4, 0x13,
+ 0x95, 0x8E, 0x49, 0x22, 0x4F, 0x5D, 0xFF, 0xDB, 0xAE, 0x50, 0x71, 0x6E, 0xC2, 0xA2, 0xA7, 0x70,
+ 0xEE, 0xDB, 0xB5, 0x18, 0x1E, 0x4C, 0x0F, 0x57, 0xC7, 0x4E, 0x46, 0xDD, 0x78, 0x5F, 0x1A, 0xEE,
+ 0x02, 0xAC, 0x80, 0xE4, 0xA8, 0x38, 0x67, 0xAD, 0x5C, 0xF7, 0x00, 0xC5, 0xCA, 0x0B, 0x52, 0x49,
+ 0x94, 0x43, 0x97, 0x90, 0x46, 0xF5, 0x1A, 0xA5, 0x21, 0x7E, 0x05, 0xAC, 0xF1, 0x97, 0x66, 0x42,
+ 0xFB, 0x5D, 0x4F, 0x71, 0x4B, 0x8E, 0x3E, 0xC3, 0x9E, 0x14, 0xF7, 0xAD, 0xDE, 0x34, 0xEB, 0x9C,
+ 0x06, 0xB1, 0x8A, 0xE2, 0x9D, 0xA6, 0x25, 0xFD, 0x1B, 0x69, 0xDF, 0x41, 0x60, 0xBF, 0xA4, 0x04,
+ 0x5C, 0xF7, 0x76, 0xFD, 0x22, 0x30, 0x0C, 0x63, 0xDB, 0xAD, 0x42, 0xA8, 0x0A, 0x97, 0xE7, 0xF0,
+ 0x57, 0x9D, 0x17, 0x6B, 0x37, 0x5D, 0x35, 0xC9, 0x5F, 0xAC, 0xF6, 0xB8, 0x89, 0x41, 0xB0, 0x6F,
+ 0x49, 0xA8, 0x47, 0x61, 0xB1, 0x63, 0x65, 0x40, 0x07, 0xD8, 0xC5, 0x5A, 0x5D, 0x1D, 0x82, 0x7F,
+ 0xCC, 0x6A, 0xF2, 0xA1, 0x36, 0x3C, 0xC0, 0x51, 0x6E, 0xD3, 0x4B, 0x36, 0xE0, 0x07, 0xCE, 0xA3,
+ 0x9B, 0xB1, 0x13, 0x04, 0x32, 0x87, 0x75, 0x4A, 0x16, 0x34, 0xB4, 0x75, 0x0F, 0x75, 0x33, 0x7C,
+ 0xEC, 0x02, 0x35, 0xA9, 0x49, 0x39, 0xF6, 0x24, 0x03, 0x73, 0xCE, 0x54, 0x45, 0x02, 0x6C, 0x0A,
+ 0x53, 0x2B, 0x73, 0x38, 0x3C, 0x81, 0x56, 0xA7, 0xBB, 0xF2, 0x73, 0x0F, 0xC7, 0xB7, 0x0E, 0xAA,
+ 0x45, 0x62, 0xA6, 0x29, 0x8C, 0xC9, 0x0D, 0x45, 0x0E, 0xBD, 0xDB, 0xD8, 0x71, 0x5C, 0xD7, 0x18,
+ 0xFC, 0xB0, 0x61, 0x89, 0xA2, 0x22, 0xF4, 0xF5, 0x48, 0x38, 0xE8, 0x7F, 0x17, 0x5C, 0x82, 0xF6,
+ 0x2D, 0x1F, 0x28, 0x85, 0xD9, 0xB7, 0x16, 0xA4, 0x52, 0x6F, 0x3A, 0xF1, 0xEE, 0xA7, 0x2D, 0x99,
+ 0x71, 0xAD, 0xAA, 0x15, 0x24, 0xD8, 0x86, 0x1D, 0x78, 0x90, 0x0B, 0x4C, 0x4E, 0x78, 0xC1, 0xC2,
+ 0xD7, 0xED, 0xE6, 0xB4, 0xF0, 0xAC, 0x2A, 0xFD, 0xE6, 0x75, 0xBA, 0xCA, 0x0C, 0xAD, 0xD6, 0x3D,
+ 0x38, 0x4D, 0x1F, 0xE9, 0x7D, 0x87, 0xA8, 0xCA, 0x13, 0x1A, 0xFA, 0x72, 0x53, 0x8E, 0xB2, 0x2F,
+ 0xE3, 0xAD, 0xAA, 0x8E, 0x7A, 0xBA, 0x6A, 0xBC, 0x2C, 0x8E, 0xBA, 0xD5, 0x0B, 0x3E, 0x2F, 0x4D,
+ 0xB3, 0xC4, 0xF6, 0x6F, 0x01, 0xEF, 0x90, 0x60, 0xC9, 0x3D, 0xD2, 0x93, 0x45, 0x03, 0xCB, 0x65,
+ 0x11, 0xE1, 0xAD, 0x7A, 0x90, 0xCE, 0xFA, 0x41, 0x05, 0x45, 0x55, 0x10, 0xE9, 0x44, 0xBF, 0x59,
+ 0x58, 0xC2, 0x71, 0xDB, 0x00, 0xBA, 0x0C, 0x32, 0x08, 0xF9, 0xB1, 0x58, 0xFA, 0xE6, 0x45, 0xFD,
+ 0x0B, 0xBC, 0x23, 0xB7, 0x82, 0xE1, 0x89, 0x3A, 0x1F, 0xA1, 0xDA, 0xD2, 0x27, 0x7A, 0x0C, 0x18,
+ 0xA1, 0x1D, 0x02, 0xD0, 0x59, 0xEE, 0xA8, 0x42, 0xF4, 0x67, 0x02, 0x0A, 0xC1, 0xB0, 0xC2, 0x3E,
+ 0x8E, 0x86, 0xAD, 0xB5, 0x3B, 0x78, 0x05, 0xBE, 0x51, 0x12, 0xBF, 0x50, 0x58, 0xBD, 0xF3, 0x94,
+ 0xFB, 0x02, 0x04, 0x38, 0x5F, 0xFD, 0xDC, 0x7D, 0xCB, 0xDA, 0x26, 0x36, 0x79, 0x5C, 0x89, 0x52,
+ 0xB8, 0xF8, 0x96, 0x4B, 0xA9, 0x49, 0x43, 0xB5, 0x32, 0x22, 0x40, 0x27, 0x67, 0xFE, 0x46, 0xB9,
+ 0x0B, 0x17, 0x75, 0x4B, 0xEB, 0x08, 0xA1, 0xDE, 0xC6, 0x7E, 0xD5, 0xAF, 0x4A, 0x69, 0xAA, 0x8C,
+ 0xA1, 0x74, 0x33, 0x54, 0x33, 0x47, 0x62, 0x00, 0xE8, 0x63, 0x76, 0x4C, 0xE7, 0x76, 0xEE, 0x78,
+ 0x5A, 0xB8, 0x44, 0x4A, 0x8F, 0x0D, 0xD7, 0x32, 0xC4, 0xB9, 0xB0, 0x1A, 0xF9, 0x58, 0x8F, 0x9E,
+ 0x06, 0x9F, 0x87, 0x9D, 0x29, 0x1E, 0xBF, 0xA5, 0xFD, 0xA6, 0xCD, 0xF9, 0xD8, 0x6D, 0x01, 0xCC,
+ 0x0F, 0xF6, 0x52, 0xCB, 0xFA, 0xE0, 0xA5, 0x2D, 0xCC, 0xB9, 0xA0, 0xB1, 0x9D, 0xD3, 0x09, 0x24,
+ 0x34, 0xD7, 0x01, 0x15, 0x3D, 0xEB, 0x0F, 0x07, 0xAC, 0x3A, 0x94, 0xCC, 0xAA, 0x52, 0x1E, 0xBD,
+ 0x4C, 0x49, 0xCD, 0x22, 0x85, 0x89, 0x47, 0x27, 0x21, 0x4E, 0x96, 0x41, 0x94, 0x6F, 0xFF, 0x2E,
+ 0x69, 0x3A, 0x6B, 0xA7, 0x74, 0xBA, 0x9B, 0xEB, 0x25, 0x5E, 0xA9, 0x5A, 0xE0, 0x66, 0x59, 0xF6,
+ 0x18, 0x5B, 0x77, 0xDF, 0x8E, 0x56, 0x67, 0x52, 0x2C, 0xDA, 0x0C, 0xB0, 0xF2, 0xF8, 0xB9, 0xE2,
+ 0x80, 0xB4, 0x2A, 0x6E, 0xFF, 0x81, 0xC2, 0x72, 0x7C, 0xEE, 0x71, 0xC7, 0x06, 0xF5, 0x61, 0xAC,
+ 0xFC, 0x77, 0x84, 0xD4, 0xEB, 0x41, 0x95, 0x7F, 0xEE, 0xD0, 0xDD, 0x91, 0x20, 0xAE, 0xF9, 0xBE,
+ 0xF8, 0x30, 0xF3, 0x25, 0x57, 0xA4, 0x1D, 0xDB, 0x0F, 0xD3, 0x5A, 0xA7, 0x93, 0x1B, 0x83, 0x4B,
+ 0x62, 0xD4, 0x4C, 0xA1, 0xD6, 0x34, 0x0D, 0xBC, 0x36, 0x00, 0x35, 0x65, 0x61, 0x14, 0x48, 0x03,
+ 0x4B, 0xB5, 0xBB, 0xFA, 0x5D, 0xB0, 0x2D, 0xCA, 0x8E, 0x54, 0x2A, 0xBA, 0x77, 0xA4, 0xE4, 0x94,
+ 0x31, 0x21, 0x0B, 0xDB, 0x04, 0xA2, 0x6B, 0xEB, 0x80, 0xF2, 0x71, 0xD9, 0x2E, 0xDA, 0x8C, 0x61,
+ 0xA5, 0x79, 0x48, 0x7F, 0x70, 0xFB, 0x04, 0xF5, 0xB8, 0xA0, 0xCD, 0x1D, 0xB0, 0xBF, 0x62, 0x29,
+ 0xC1, 0xAB, 0xB1, 0xA1, 0xD8, 0x6E, 0x48, 0xC7, 0x0B, 0x20, 0x1A, 0xF6, 0xD6, 0xB2, 0x37, 0xD2,
+ 0xA3, 0xCC, 0x84, 0x33, 0xBD, 0x90, 0xFE, 0x23, 0x10, 0x9A, 0x41, 0x0A, 0xBA, 0xB3, 0xE6, 0x75,
+ 0x62, 0x7D, 0x91, 0x82, 0x1C, 0x45, 0xBB, 0x24, 0xD3, 0x67, 0xDA, 0xB2, 0xA5, 0xE5, 0x0F, 0xDF,
+ 0x0B, 0x58, 0xDA, 0x25, 0xEB, 0x02, 0x66, 0xE1, 0x5C, 0xEA, 0x3E, 0x6B, 0x32, 0xFF, 0xFA, 0x8A,
+ 0x6F, 0x91, 0x23, 0x3E, 0x52, 0xD5, 0x84, 0x30, 0xA4, 0x15, 0xB5, 0x04, 0xCC, 0xCE, 0x10, 0x9F,
+ 0x04, 0xD2, 0x53, 0x94, 0xB9, 0x01, 0x71, 0x0D, 0xA2, 0xA0, 0xCB, 0x8F, 0x9C, 0xA3, 0x49, 0x6C,
+ 0x2A, 0x3E, 0x88, 0xC3, 0x39, 0x05, 0x99, 0x57, 0xAE, 0xEA, 0x38, 0x78, 0xF9, 0x4C, 0x49, 0x1D,
+ 0xCE, 0x32, 0x10, 0x4A, 0x10, 0x24, 0x5D, 0x16, 0xBE, 0x82, 0x40, 0x28, 0xC5, 0xC4, 0xC9, 0x4E,
+ 0xE0, 0xF9, 0x68, 0xB8, 0x83, 0x68, 0xAC, 0x2F, 0x74, 0xB1, 0x9B, 0x52, 0xFC, 0x0D, 0x31, 0xBB,
+ 0xF2, 0xB0, 0x24, 0x94, 0x78, 0x8C, 0x39, 0xEC, 0xA7, 0xDE, 0x3F, 0xF4, 0xC7, 0xC8, 0x4A, 0x3B,
+ 0x37, 0x42, 0x41, 0x46, 0x4B, 0x5D, 0x53, 0x6C, 0x45, 0xB2, 0x2A, 0x6E, 0x6A, 0x4A, 0x8F, 0xDD,
+ 0x56, 0x1E, 0xAA, 0xB2, 0x41, 0x60, 0xDC, 0xE7, 0x45, 0x86, 0xFD, 0xE2, 0xCE, 0xD9, 0x9B, 0x98,
+ 0x39, 0x4E, 0xBE, 0x2B, 0x89, 0x2E, 0xEF, 0xCB, 0xE4, 0x4D, 0xCD, 0x00, 0x0A, 0x8E, 0x69, 0xAD,
+ 0x36, 0x0A, 0xBB, 0xCC, 0x5E, 0x8F, 0x5D, 0x12, 0x30, 0x6E, 0xEF, 0xAE, 0x4E, 0xAD, 0xFE, 0xF8,
+ 0x3D, 0x71, 0x61, 0x75, 0x37, 0x5B, 0x61, 0xC7, 0x1B, 0x38, 0xFB, 0x16, 0x19, 0xD7, 0x82, 0x5F,
+ 0x98, 0x4E, 0xDF, 0x7E, 0xAD, 0x24, 0x38, 0x6E, 0xCF, 0xA6, 0xD0, 0x93, 0xBE, 0x70, 0x16, 0x1C,
+ 0x01, 0x29, 0xA9, 0x67, 0xD9, 0x08, 0x22, 0x48, 0xDD, 0x1E, 0x82, 0x13, 0xB7, 0xA7, 0xFD, 0x74,
+ 0xAE, 0xA2, 0xE4, 0xEA, 0x60, 0xB8, 0xD1, 0x43, 0xDA, 0x35, 0xFF, 0x76, 0xF8, 0xF5, 0x91, 0x5F,
+ 0xB7, 0xEF, 0x21, 0x81, 0xA1, 0x8B, 0x88, 0xE7, 0x4E, 0xA4, 0x12, 0xDC, 0x3C, 0x35, 0xA8, 0x9D,
+ 0x27, 0x78, 0x1F, 0x48, 0xE7, 0x54, 0x4C, 0x98, 0x7B, 0x13, 0x1F, 0x42, 0xD4, 0x36, 0x55, 0xDB,
+ 0x96, 0x74, 0xE4, 0xDA, 0xF2, 0xE3, 0xCC, 0xC1, 0xC8, 0x23, 0x4D, 0x90, 0x51, 0x77, 0x0B, 0xA3,
+ 0x4D, 0x0C, 0xDD, 0x19, 0x87, 0x13, 0x15, 0xDB, 0x4F, 0x39, 0x8B, 0x48, 0x25, 0x85, 0x3B, 0x02,
+ 0x1E, 0x73, 0x83, 0xEF, 0xBD, 0x5A, 0x13, 0x06, 0xAD, 0xAB, 0x90, 0xD9, 0x9F, 0xBC, 0x59, 0xE7,
+ 0x0A, 0xA8, 0xB6, 0xEF, 0xAD, 0xB5, 0x37, 0x7B, 0x9D, 0xAA, 0xAC, 0x9C, 0xC7, 0x0F, 0x7B, 0x34,
+ 0x78, 0x83, 0x51, 0xCB, 0x5B, 0xD3, 0xFE, 0x14, 0x0E, 0xB1, 0x31, 0xAB, 0x78, 0x9F, 0xDE, 0x3F,
+ 0xDF, 0x05, 0x96, 0xA4, 0xA3, 0x44, 0x3B, 0x5F, 0x20, 0x80, 0x5C, 0xE5, 0x02, 0xFF, 0xD2, 0xD3,
+ 0xB9, 0x0A, 0xFD, 0x39, 0x97, 0x39, 0x68, 0x43, 0x2E, 0x73, 0x18, 0x29, 0xFC, 0x9B, 0x2D, 0x03,
+ 0x4B, 0x93, 0xD0, 0x57, 0x82, 0x82, 0x14, 0x4C, 0xD3, 0x87, 0x21, 0x39, 0x9E, 0x2B, 0x15, 0x6C,
+ 0xCE, 0xB6, 0xB4, 0x69, 0x17, 0xE9, 0xD5, 0xA0, 0x67, 0xED, 0x47, 0xAF, 0xAE, 0xFD, 0xBC, 0xA6,
+ 0xAA, 0xC3, 0xEA, 0x86, 0xF5, 0x5E, 0x2A, 0xA9, 0x41, 0xF9, 0x4D, 0x70, 0x77, 0x43, 0xBF, 0x31,
+ 0xCC, 0x02, 0x06, 0x31, 0xCB, 0x9C, 0x47, 0xD6, 0xAF, 0x79, 0x5B, 0xE3, 0x0B, 0xA9, 0xCB, 0xBF,
+ 0x42, 0xC4, 0x3E, 0xC2, 0x13, 0x3D, 0x5B, 0x5C, 0x23, 0x82, 0xF3, 0x57, 0x08, 0xA7, 0x0A, 0x06,
+ 0x73, 0xC3, 0x13, 0x86, 0xE0, 0x24, 0xAC, 0x45, 0xA6, 0x93, 0x2D, 0x69, 0xA4, 0x13, 0x28, 0x18,
+ 0x7D, 0x92, 0xFB, 0x51, 0x3F, 0x9B, 0x62, 0xFD, 0x51, 0xA9, 0xDA, 0xFC, 0x4A, 0xA0, 0x9D, 0xFC,
+ 0x15, 0xE1, 0xFA, 0x19, 0x08, 0xD3, 0xB7, 0xE3, 0x1F, 0xA5, 0x53, 0xA1, 0xFE, 0xFF, 0xA5, 0xF3,
+ 0x28, 0x9D, 0x26, 0x12, 0xED, 0xD2, 0x3C, 0xFA, 0x7E, 0x7C, 0x20, 0x8D, 0x9D, 0x4E, 0xD8, 0x6A,
+ 0xBD, 0xEE, 0xF8, 0x31, 0x29, 0xDF, 0x36, 0xC7, 0x2B, 0x5F, 0x45, 0xB7, 0x9B, 0xAE, 0x33, 0x95,
+ 0xE3, 0xE3, 0x9F, 0x0C, 0x9C, 0xEB, 0xCE, 0xD3, 0xF2, 0x05, 0x3D, 0xDC, 0x0A, 0xD5, 0x7C, 0xF8,
+ 0x4A, 0xDA, 0xEB, 0xA9, 0x47, 0x90, 0xA1, 0x2B, 0x3E, 0xE3, 0x46, 0xFE, 0x44, 0xE4, 0x90, 0x55,
+ 0xD7, 0x3C, 0x36, 0xAF, 0xCE, 0x42, 0x1C, 0xC8, 0xD7, 0xF2, 0xAB, 0x02, 0x4E, 0x6F, 0x3F, 0xA5,
+ 0x71, 0x9B, 0xB4, 0x67, 0x65, 0x17, 0x06, 0x4C, 0x7A, 0x0E, 0xF5, 0x22, 0x46, 0x11, 0x55, 0x21,
+ 0xD8, 0x27, 0x16, 0x1D, 0xB4, 0xF1, 0xA8, 0x5B, 0x9D, 0xA4, 0x4B, 0xD6, 0xEC, 0xC7, 0x20, 0x37,
+ 0x93, 0x20, 0x40, 0x12, 0x88, 0x9A, 0xE9, 0xDA, 0x63, 0x1A, 0xA4, 0xA6, 0xE1, 0x3E, 0x04, 0xE2,
+ 0x9C, 0x74, 0xDF, 0x7C, 0x4C, 0x34, 0xED, 0x58, 0xAC, 0x6B, 0x55, 0x85, 0x9A, 0xC6, 0x9E, 0x3F,
+ 0x00, 0x2F, 0x2E, 0x03, 0xED, 0x48, 0xDD, 0xC2, 0x49, 0xF5, 0x2B, 0x64, 0x76, 0xD7, 0xF5, 0x2F,
+ 0xC3, 0xE0, 0xE8, 0x56, 0x4D, 0xD4, 0x64, 0x1B, 0xBB, 0xD3, 0x1B, 0x21, 0x1F, 0x01, 0x4C, 0x32,
+ 0xD2, 0xCC, 0xFD, 0xF5, 0x38, 0x99, 0xBC, 0x40, 0x05, 0xE2, 0x02, 0xCB, 0x28, 0x92, 0xE5, 0x5D,
+ 0xFF, 0x2A, 0xBC, 0xFF, 0x98, 0x01, 0x7C, 0xEF, 0x04, 0x36, 0x50, 0xFC, 0x61, 0x35, 0xC6, 0xC1,
+ 0xB2, 0x1B, 0xCD, 0x8C, 0x38, 0x42, 0xBD, 0x8F, 0x84, 0x06, 0xBE, 0x4C, 0x3F, 0xBE, 0xF0, 0xA2,
+ 0x0A, 0x92, 0x4E, 0xD4, 0x87, 0x7E, 0x8A, 0x11, 0x0B, 0x75, 0xF6, 0x5A, 0xBD, 0x3B, 0xB5, 0x9B,
+ 0xFF, 0x39, 0x5E, 0x7E, 0x3C, 0xA1, 0xBD, 0x76, 0xAF, 0xCB, 0x1B, 0xA5, 0x48, 0x35, 0x83, 0x89,
+ 0xCF, 0xB4, 0x18, 0x37, 0xFB, 0x95, 0x34, 0x4F, 0x39, 0x29, 0x17, 0x9C, 0xBB, 0xDC, 0xF7, 0x68,
+ 0x1B, 0xFB, 0x95, 0x42, 0xED, 0xA6, 0xFE, 0xE2, 0xBE, 0x06, 0xDB, 0xE1, 0x6B, 0xC9, 0x54, 0x2F,
+ 0xA3, 0x75, 0x91, 0xBE, 0xE0, 0x55, 0x6B, 0xA5, 0xD8, 0x0E, 0xD0, 0xD0, 0x08, 0x64, 0xEE, 0xFC,
+ 0xEE, 0x7E, 0x39, 0xAC, 0x94, 0x9C, 0x3F, 0x77, 0xF2, 0xDA, 0xF5, 0xBE, 0x9F, 0x91, 0x63, 0x68,
+ 0xB6, 0xE2, 0x06, 0xAD, 0x8B, 0x1B, 0xDB, 0xE9, 0x0D, 0x87, 0x6F, 0x78, 0x6B, 0x51, 0x86, 0xE1,
+ 0x44, 0x91, 0xD7, 0x62, 0x1D, 0x7F, 0x88, 0xE8, 0x2A, 0xAD, 0x19, 0x01, 0x02, 0x76, 0x05, 0x43,
+ 0xBE, 0x1A, 0xB8, 0x36, 0xC2, 0x0D, 0x24, 0x90, 0x2E, 0x13, 0xCF, 0xFC, 0x0C, 0x3E, 0x18, 0x9D,
+ 0xBF, 0x16, 0x1E, 0xAB, 0x22, 0x5B, 0xF8, 0x72, 0xE0, 0xDF, 0xF9, 0x51, 0x73, 0xB2, 0x54, 0x99,
+ 0x32, 0x00, 0x4E, 0x06, 0x3F, 0xAA, 0x1F, 0xE5, 0x6C, 0xF0, 0x1D, 0xF5, 0xA0, 0x10, 0x2B, 0x63,
+ 0x1C, 0x65, 0xAA, 0xC6, 0x8C, 0x8D, 0x7D, 0xE5, 0xA8, 0x98, 0xBD, 0x0E, 0xE4, 0xCF, 0x06, 0x28,
+ 0x8A, 0xC3, 0xFB, 0x16, 0x2A, 0x29, 0xE7, 0xCA, 0xDC, 0xCC, 0xAB, 0xB3, 0xF1, 0x7B, 0x87, 0x76,
+ 0xBA, 0xB3, 0xA2, 0x70, 0x47, 0x08, 0x52, 0x2F, 0x3A, 0xA6, 0x30, 0x0F, 0xA8, 0x66, 0x32, 0xC3,
+ 0x0B, 0x7F, 0x19, 0x24, 0x0A, 0xE3, 0x69, 0x09, 0xD4, 0x90, 0x14, 0xE8, 0xF5, 0xD3, 0xAB, 0x7C,
+ 0xB4, 0xB4, 0x2B, 0x4C, 0xB8, 0x44, 0x90, 0xCF, 0xE4, 0xB1, 0x5C, 0xEE, 0x0E, 0xC1, 0x19, 0xFF,
+ 0x10, 0xC6, 0x9A, 0xD5, 0x32, 0x90, 0x69, 0x9D, 0xCF, 0xD4, 0x7B, 0x65, 0x39, 0x59, 0x19, 0x97,
+ 0x30, 0xB8, 0x00, 0xD1, 0xE2, 0x82, 0x61, 0xBF, 0x9C, 0x6E, 0x05, 0x6A, 0xB4, 0x36, 0x42, 0xC2,
+ 0x7A, 0xB9, 0x96, 0x6E, 0x62, 0x9C, 0x68, 0x11, 0x71, 0x87, 0x64, 0x87, 0x96, 0x80, 0x56, 0x67,
+ 0xFC, 0xDB, 0x71, 0x51, 0x87, 0x4C, 0x5C, 0xFD, 0xA2, 0x90, 0xD2, 0x0E, 0x9C, 0x52, 0xD2, 0xE7,
+ 0x49, 0x07, 0x56, 0x12, 0xA6, 0xD8, 0x8A, 0x1C, 0xAD, 0xAF, 0xA7, 0x20, 0x56, 0x1F, 0xD0, 0xCD,
+ 0x93, 0xBE, 0x4F, 0xFB, 0x60, 0xA3, 0x10, 0xB5, 0x79, 0xB5, 0x7E, 0x79, 0xF5, 0x2F, 0x57, 0xC2,
+ 0xDD, 0x23, 0x23, 0x4E, 0x91, 0xC2, 0xBD, 0x81, 0xDA, 0x48, 0x88, 0xA3, 0xDC, 0x2A, 0xF0, 0xBE,
+ 0x08, 0x00, 0xE7, 0xC6, 0xA4, 0x66, 0x16, 0x30, 0x40, 0xA5, 0xF1, 0x40, 0x1C, 0x57, 0x5F, 0x1D,
+ 0x96, 0x76, 0xF2, 0xE3, 0x71, 0xD4, 0x2E, 0x76, 0x90, 0x32, 0x4F, 0x2F, 0xF5, 0xED, 0x59, 0x2F,
+ 0x20, 0x97, 0x7A, 0x1F, 0xE1, 0xE0, 0xE4, 0x1E, 0x93, 0xF3, 0x79, 0x8B, 0xCD, 0x0B, 0x84, 0x91,
+ 0xDF, 0x35, 0x7C, 0x7F, 0xEE, 0xC9, 0x61, 0xF1, 0xFD, 0xBF, 0xFB, 0xA0, 0x09, 0x7A, 0xA1, 0xFF,
+ 0xD6, 0x13, 0x14, 0xD7, 0xEB, 0x37, 0x26, 0x31, 0x98, 0x16, 0xD8, 0xA7, 0xCE, 0x6C, 0x64, 0x71,
+ 0xE0, 0xE3, 0x5C, 0x33, 0x97, 0x9E, 0x1A, 0x25, 0x13, 0xBF, 0x05, 0x04, 0x0D, 0x11, 0xF3, 0x19,
+ 0x20, 0x43, 0x7B, 0x7D, 0x8A, 0x5F, 0x89, 0x05, 0xAC, 0x59, 0xBC, 0xDA, 0x45, 0x57, 0x30, 0xA3,
+ 0x68, 0x9F, 0x18, 0x0B, 0x9A, 0x41, 0x7E, 0x7B, 0x85, 0x8E, 0x37, 0xAE, 0x2D, 0xDE, 0x7C, 0xE8,
+ 0xB5, 0x37, 0xA7, 0xB9, 0xF0, 0xA9, 0xA4, 0x55, 0x83, 0x3F, 0x8F, 0x1E, 0x01, 0x0C, 0xF9, 0x9E,
+ 0x43, 0x5C, 0x60, 0x3F, 0x26, 0xE4, 0xBB, 0x8B, 0xAC, 0x61, 0xFF, 0x2F, 0x43, 0x1E, 0x6B, 0x0B,
+ 0xFB, 0xC9, 0x6A, 0x8C, 0x22, 0x36, 0xC1, 0x21, 0x77, 0x44, 0xFF, 0x2C, 0xF8, 0xCF, 0x29, 0x9F,
+ 0x6F, 0x3E, 0x43, 0x2B, 0xE2, 0x3F, 0x8E, 0x0F, 0xC1, 0x38, 0x2E, 0x7D, 0x25, 0x76, 0x1A, 0x10,
+ 0x19, 0xEE, 0x37, 0x05, 0xEB, 0x7A, 0x4F, 0x07, 0xD8, 0x1D, 0x0F, 0xF3, 0x50, 0x43, 0x4E, 0x67,
+ 0x85, 0x26, 0x16, 0xE5, 0x38, 0x3D, 0x3F, 0xEB, 0x4C, 0x87, 0x5E, 0xDE, 0x9E, 0xD2, 0x82, 0x04,
+ 0x5B, 0x69, 0x12, 0xEA, 0xB4, 0x8D, 0x73, 0xE0, 0xA9, 0x1A, 0xEB, 0x19, 0x89, 0xEA, 0xBF, 0x6E,
+ 0xBA, 0x6D, 0x9D, 0x2B, 0x0B, 0x6A, 0x64, 0x50, 0x9B, 0x79, 0x30, 0xB3, 0x12, 0x30, 0x89, 0x92,
+ 0x0B, 0xF8, 0x88, 0x31, 0x7E, 0xB7, 0xD0, 0x2D, 0x84, 0xFD, 0x7D, 0xE0, 0x08, 0x39, 0x84, 0x45,
+ 0xD2, 0x5E, 0x1F, 0x42, 0xEE, 0x2C, 0xF3, 0xE5, 0xBA, 0xB5, 0xA5, 0x50, 0xAB, 0xD2, 0xEB, 0xEB,
+ 0x72, 0x9A, 0xE7, 0x18, 0x7A, 0x41, 0xFE, 0x8A, 0xBB, 0x4F, 0x0B, 0x2B, 0xB7, 0xF0, 0x12, 0x12,
+ 0x58, 0xCC, 0xC1, 0x88, 0x9E, 0x20, 0xF2, 0xFA, 0x0F, 0xE5, 0x36, 0xAD, 0x64, 0x05, 0xB4, 0x1C,
+ 0xA4, 0xD8, 0x60, 0x36, 0x7C, 0xD8, 0x1F, 0xED, 0xAA, 0x51, 0x60, 0x2F, 0x1F, 0x76, 0x80, 0xB9,
+ 0x02, 0xAA, 0x2C, 0x14, 0x17, 0xE6, 0xD2, 0xFE, 0x26, 0xBA, 0xD2, 0xE5, 0xCB, 0x0B, 0x7D, 0xBE,
+ 0xCC, 0x09, 0xD9, 0xEE, 0x8D, 0x23, 0x52, 0xFB, 0x54, 0xF4, 0x9E, 0x3B, 0x2A, 0xEA, 0x91, 0x40,
+ 0x6E, 0x3B, 0x03, 0xC0, 0x82, 0x3D, 0x35, 0x72, 0xAD, 0xC5, 0xB9, 0x53, 0xA1, 0x82, 0x4E, 0xE9,
+ 0xB6, 0x99, 0x16, 0xF7, 0xE4, 0x98, 0x93, 0x70, 0xAB, 0xEB, 0x91, 0xC6, 0x7E, 0x70, 0x5D, 0x47,
+ 0xCF, 0x71, 0x5C, 0xCB, 0x61, 0x90, 0xDA, 0xD8, 0xF1, 0x41, 0xA5, 0x85, 0xA2, 0x4A, 0x9A, 0x15,
+ 0xA3, 0x9D, 0x4A, 0xC9, 0x42, 0x9A, 0x41, 0x67, 0x68, 0x02, 0xC1, 0x8D, 0x5F, 0xD5, 0x7F, 0xDF,
+ 0x8F, 0x08, 0xE9, 0x96, 0xF9, 0x8A, 0x43, 0x30, 0xA6, 0x2F, 0x46, 0x31, 0xCC, 0x73, 0x16, 0x31,
+ 0xF5, 0x56, 0x19, 0x7B, 0x99, 0xC1, 0xF0, 0xA3, 0x54, 0x90, 0xFF, 0x1E, 0x81, 0xCB, 0x88, 0x50,
+ 0x64, 0x9F, 0x23, 0xFC, 0xB5, 0x12, 0x24, 0xDC, 0xD2, 0x6B, 0x22, 0x5C, 0xED, 0xA3, 0xF2, 0x8B,
+ 0x0E, 0xE9, 0xD4, 0x8B, 0xAF, 0x94, 0x0B, 0xA4, 0x7B, 0x25, 0x88, 0xD8, 0x4A, 0x5E, 0x33, 0x85,
+ 0x5B, 0xD0, 0xD4, 0x50, 0xA4, 0xB2, 0xE5, 0x18, 0x7B, 0x7B, 0xEE, 0xCB, 0xF0, 0xDA, 0xF5, 0x18,
+ 0xD8, 0x5C, 0x22, 0x0B, 0x11, 0xDE, 0x02, 0x1F, 0xF8, 0xC6, 0x0D, 0x75, 0x36, 0xCA, 0x82, 0xCE,
+ 0x46, 0x31, 0x8C, 0x5E, 0x6A, 0x28, 0x3E, 0xD5, 0x3F, 0xB7, 0x16, 0x31, 0x13, 0x6A, 0x14, 0x59,
+ 0x88, 0x6A, 0x55, 0x65, 0x8A, 0x21, 0xD5, 0x48, 0xD3, 0x4A, 0xD1, 0x70, 0xF4, 0x3B, 0x72, 0xC2,
+ 0x8D, 0x1E, 0x28, 0xAF, 0x41, 0x7B, 0xC2, 0x0C, 0x82, 0x6C, 0x3D, 0xD9, 0x25, 0x48, 0x6C, 0xD9,
+ 0x49, 0x0F, 0x8A, 0xDF, 0x27, 0x6E, 0x1E, 0x21, 0xB7, 0x65, 0x5A, 0x8F, 0x89, 0x4E, 0x3F, 0x82,
+ 0x47, 0xBF, 0x7C, 0x21, 0x91, 0x75, 0x10, 0x55, 0x54, 0x21, 0x95, 0xE3, 0xDC, 0x4F, 0x12, 0x0C,
+ 0x1B, 0x55, 0xC2, 0xBE, 0x85, 0x60, 0x57, 0xB3, 0x70, 0x31, 0x54, 0xD3, 0x53, 0x84, 0xB6, 0x93,
+ 0xB5, 0x68, 0xC2, 0x14, 0x80, 0xC9, 0x91, 0x32, 0x87, 0x96, 0xFA, 0x20, 0x03, 0xC2, 0xBE, 0xC2,
+ 0x42, 0xDC, 0x4D, 0x28, 0xC4, 0xC1, 0x95, 0x5D, 0xCF, 0x4D, 0xFE, 0xFA, 0x09, 0x43, 0x4F, 0xC2,
+ 0x30, 0x65, 0xC4, 0x55, 0xDE, 0x05, 0x6C, 0x29, 0xFA, 0xDD, 0x9C, 0x17, 0x9F, 0x05, 0x89, 0xD9,
+ 0xA8, 0x97, 0x46, 0x8C, 0x85, 0x81, 0xFC, 0x99, 0x72, 0x4F, 0x0A, 0xA0, 0x8F, 0xF3, 0x25, 0x89,
+ 0xBA, 0xDD, 0x63, 0x53, 0x6B, 0xA7, 0x15, 0x20, 0x14, 0x92, 0x88, 0x51, 0x23, 0x82, 0xA3, 0x9D,
+ 0x0D, 0xC2, 0x79, 0xB7, 0xA3, 0x18, 0x88, 0xC9, 0xE0, 0xB0, 0x56, 0x8F, 0x16, 0x16, 0x36, 0xAA,
+ 0x40, 0xC9, 0x61, 0x41, 0x30, 0x82, 0x65, 0x2F, 0x81, 0x57, 0xD3, 0x86, 0x90, 0x05, 0xC4, 0x44,
+ 0x04, 0x12, 0xC8, 0x1B, 0xB8, 0x4D, 0x6A, 0x06, 0x1B, 0x9F, 0xEF, 0xC0, 0xA3, 0xE9, 0x9B, 0xEA,
+ 0x70, 0xC0, 0xCE, 0x73, 0x89, 0x5F, 0x6D, 0x0C, 0x9B, 0x4C, 0x3B, 0x96, 0xB2, 0x8B, 0x6B, 0xF5,
+ 0x07, 0x00, 0xE4, 0x30, 0xED, 0xE0, 0xB6, 0xF0, 0xB5, 0xF8, 0x1D, 0xFB, 0xCC, 0xC9, 0x10, 0x66,
+ 0x5B, 0xE0, 0x15, 0xFB, 0x1D, 0xB7, 0x5C, 0x67, 0x7F, 0x52, 0xD5, 0xA0, 0xF0, 0x9A, 0x6D, 0x37,
+ 0xA7, 0x1B, 0xBD, 0x1F, 0x7B, 0xF9, 0x82, 0x11, 0x98, 0x7D, 0x27, 0x0B, 0xF5, 0x31, 0x5F, 0x20,
+ 0x8D, 0x47, 0xA0, 0xB4, 0xD3, 0x59, 0x4B, 0x17, 0xF9, 0xA2, 0x38, 0x66, 0x31, 0x3F, 0x02, 0xCD,
+ 0x5D, 0xBE, 0x5B, 0x06, 0x17, 0xD7, 0xEC, 0xC4, 0xD1, 0x67, 0x97, 0x49, 0xBA, 0x1D, 0xE5, 0xCD,
+ 0x8E, 0xCF, 0x0D, 0xCD, 0x6B, 0xAB, 0x9A, 0xDA, 0x2F, 0x3F, 0x62, 0xDF, 0xFA, 0xE5, 0xEC, 0x50,
+ 0x6D, 0x62, 0xCB, 0x0F, 0x53, 0xC7, 0x8A, 0x33, 0xF5, 0xB2, 0x8D, 0xFD, 0x85, 0x31, 0x06, 0xE3,
+ 0xCE, 0x77, 0xB6, 0x8B, 0x2A, 0xC7, 0xC2, 0x72, 0xD5, 0xA9, 0x06, 0xBF, 0xAF, 0x76, 0x6F, 0xC2,
+ 0x62, 0x31, 0x9A, 0x89, 0x87, 0xE7, 0x54, 0xD4, 0x8F, 0x32, 0x31, 0x40, 0xE8, 0xAF, 0x82, 0x6C,
+ 0x69, 0x18, 0x19, 0x25, 0x74, 0xF0, 0xD1, 0xEB, 0x43, 0x71, 0x50, 0x20, 0xCD, 0x84, 0xE9, 0x94,
+ 0x86, 0x17, 0xA0, 0xF9, 0xB8, 0x65, 0xFE, 0x48, 0x81, 0x57, 0xCE, 0x0F, 0xA7, 0xF3, 0x28, 0x3F,
+ 0x02, 0x0D, 0xD9, 0x78, 0x7A, 0x2F, 0x9F, 0x36, 0xAD, 0x8D, 0x47, 0x76, 0x51, 0xA7, 0x95, 0xF2,
+ 0xE3, 0x20, 0xDB, 0x57, 0x7F, 0xA9, 0x26, 0x29, 0xF1, 0x0F, 0xF7, 0xAB, 0x2F, 0x7B, 0x2F, 0xEB,
+ 0x96, 0x6C, 0xFD, 0xAA, 0x25, 0x21, 0x35, 0x38, 0x89, 0xFF, 0xAE, 0xCD, 0x5F, 0xA0, 0xFE, 0x0F,
+ 0x57, 0x70, 0xC0, 0x65, 0x49, 0xA6, 0x5E, 0x3F, 0xB5, 0x24, 0x8A, 0x46, 0x32, 0xA1, 0x12, 0xC0,
+ 0x79, 0x0B, 0xD6, 0xE4, 0x26, 0x21, 0x90, 0x25, 0xB6, 0x81, 0xE5, 0x84, 0xB9, 0x4E, 0x78, 0xFF,
+ 0x44, 0xB7, 0xDB, 0xD5, 0xE2, 0x9B, 0x46, 0xBF, 0xB9, 0x5F, 0xC5, 0x70, 0xCC, 0xD3, 0xA2, 0x77,
+ 0xAE, 0xAC, 0xCE, 0x52, 0x08, 0x52, 0x34, 0x6C, 0x41, 0xDA, 0xD6, 0x03, 0x87, 0x71, 0xFB, 0xD6,
+ 0x2B, 0xFC, 0x64, 0x89, 0x9F, 0x5D, 0x1C, 0x4E, 0xEE, 0x2F, 0xE5, 0xAC, 0x01, 0x31, 0x46, 0x63,
+ 0x12, 0x45, 0x79, 0x41, 0x93, 0x0C, 0x1A, 0x6B, 0x3E, 0x73, 0x25, 0xCE, 0xD9, 0x35, 0x87, 0xBD,
+ 0x9F, 0x30, 0xBC, 0x82, 0xA8, 0x47, 0xCE, 0x8F, 0x48, 0x77, 0x26, 0x71, 0xCB, 0x9B, 0xD3, 0x1A,
+ 0x79, 0x2A, 0x29, 0x78, 0x7C, 0x6D, 0x5A, 0x72, 0x01, 0x0B, 0xE1, 0x46, 0x32, 0x65, 0x9D, 0x2B,
+ 0xD4, 0xD6, 0x28, 0x1F, 0xB2, 0x23, 0xA9, 0xF6, 0x62, 0x2F, 0xCD, 0x99, 0x6C, 0x5D, 0x03, 0x5D,
+ 0xA0, 0x7A, 0xC4, 0x05, 0x82, 0x71, 0xB3, 0xC3, 0x2B, 0x9B, 0xC5, 0x47, 0x22, 0x84, 0x29, 0x23,
+ 0xB7, 0x7D, 0xAF, 0xFA, 0xB7, 0x00, 0x10, 0xC9, 0xAB, 0xCF, 0xD6, 0xEA, 0x24, 0xE3, 0x4A, 0x29,
+ 0xDE, 0xD4, 0x93, 0x95, 0x44, 0xC5, 0xD7, 0xEC, 0xA9, 0x2C, 0x31, 0x82, 0x12, 0x7E, 0x21, 0x47,
+ 0x1C, 0x5A, 0xD5, 0xA1, 0x19, 0x9A, 0x57, 0x42, 0x46, 0x70, 0x94, 0x6A, 0xC0, 0xC6, 0x66, 0xA9,
+ 0x88, 0xB6, 0x52, 0x5E, 0xB8, 0xB3, 0x09, 0x84, 0xF5, 0x0B, 0xF1, 0x2E, 0x89, 0x0B, 0x01, 0xD0,
+ 0x40, 0xFC, 0x97, 0xC4, 0xE4, 0xF0, 0x99, 0x1E, 0x48, 0xA5, 0x20, 0x0B, 0x4F, 0xF4, 0xA7, 0x6E,
+ 0xB5, 0x78, 0xB8, 0x80, 0xFB, 0x5C, 0x51, 0x6B, 0xE3, 0x4E, 0x94, 0xF3, 0x94, 0xAC, 0xCC, 0xBB,
+ 0xA4, 0x39, 0x78, 0x67, 0xF9, 0x43, 0x73, 0x63, 0x6E, 0xC0, 0x51, 0xFB, 0xEA, 0xEE, 0x85, 0x57,
+ 0xD4, 0x16, 0xEB, 0xB0, 0x36, 0x1E, 0x2A, 0x80, 0x8A, 0x63, 0x7B, 0x91, 0xB0, 0x6A, 0xA7, 0xC5,
+ 0x59, 0x93, 0x04, 0x1E, 0x44, 0x52, 0x02, 0xB2, 0xBB, 0xEF, 0x23, 0x07, 0x2F, 0x41, 0x93, 0x80,
+ 0x4A, 0x3E, 0x2B, 0x4A, 0x83, 0x79, 0x65, 0x1E, 0x02, 0x58, 0xD5, 0x3E, 0x51, 0xFF, 0x5F, 0x8A,
+ 0x3E, 0x09, 0x90, 0x02, 0xAF, 0x57, 0xCF, 0x0F, 0x30, 0x78, 0x2F, 0x0D, 0x50, 0x51, 0xA9, 0x24,
+ 0xD2, 0x10, 0xB5, 0xE2, 0x3E, 0xD5, 0x53, 0xA2, 0xD9, 0xC6, 0x9C, 0xBC, 0xEB, 0x26, 0xAB, 0xEE,
+ 0x3B, 0x0E, 0x26, 0x03, 0x54, 0x73, 0x0E, 0x58, 0xDA, 0x92, 0x00, 0xA7, 0x2A, 0xDC, 0xA7, 0xD2,
+ 0x4B, 0x78, 0x20, 0x88, 0x5D, 0x11, 0x43, 0x15, 0x67, 0xB5, 0xC2, 0x31, 0x78, 0xD7, 0xCB, 0x5A,
+ 0x1A, 0x04, 0x38, 0xAF, 0x1A, 0xDB, 0x24, 0x90, 0x5F, 0xF0, 0xB3, 0x11, 0xB9, 0x68, 0x9A, 0x8B,
+ 0x1B, 0x28, 0xCA, 0x51, 0x63, 0x8C, 0xD2, 0x70, 0xA9, 0x8B, 0x42, 0x69, 0x86, 0x2E, 0x46, 0x5F,
+ 0x85, 0xA7, 0x80, 0x4D, 0x70, 0x1E, 0xAE, 0x08, 0xD2, 0xFC, 0xCF, 0x5E, 0xDB, 0x41, 0x9F, 0x21,
+ 0xEF, 0xA6, 0x64, 0x38, 0xE7, 0x73, 0xEF, 0xEA, 0xF9, 0x31, 0x61, 0x67, 0xEF, 0xD5, 0x21, 0x44,
+ 0xD9, 0x28, 0xB0, 0x6D, 0xD6, 0x11, 0xF9, 0x28, 0x02, 0x99, 0x84, 0x11, 0x8A, 0xFB, 0x56, 0xF8,
+ 0x37, 0x98, 0xDC, 0x90, 0x22, 0x13, 0xE3, 0x37, 0xBF, 0x9A, 0xD4, 0x05, 0xBF, 0x69, 0x76, 0xE1,
+ 0x70, 0x90, 0x81, 0x72, 0xA5, 0x7A, 0x19, 0x6B, 0x68, 0x13, 0xF1, 0x05, 0xA4, 0xFB, 0xBA, 0x6F,
+ 0x13, 0xCB, 0x15, 0xA4, 0x5D, 0x09, 0x47, 0x4A, 0xD0, 0x50, 0x34, 0x00, 0x45, 0xB8, 0xDF, 0x5E,
+ 0x89, 0x02, 0x50, 0x42, 0x65, 0xDF, 0xB7, 0x46, 0x59, 0x35, 0x81, 0xD9, 0x7D, 0xB6, 0x1E, 0x84,
+ 0x41, 0x08, 0xBA, 0xFA, 0x2B, 0xBB, 0x85, 0x92, 0x0A, 0x9C, 0x9F, 0x9E, 0x8F, 0xE2, 0x7A, 0xF7,
+ 0x6F, 0x5D, 0x8D, 0x0B, 0xA8, 0xE1, 0x02, 0x94, 0x54, 0x76, 0xFB, 0xD0, 0x80, 0xEA, 0x66, 0x17,
+ 0xE5, 0x76, 0x96, 0xF9, 0xC1, 0xB1, 0xA6, 0x7B, 0x3C, 0x7C, 0xA8, 0x0B, 0x4E, 0x28, 0x8B, 0x46,
+ 0xFE, 0x0B, 0xCC, 0x57, 0x41, 0x54, 0x37, 0x49, 0x28, 0x19, 0xD8, 0x43, 0xBF, 0x59, 0x76, 0x59,
+ 0x37, 0x71, 0xD5, 0x19, 0x99, 0xD2, 0xA3, 0xD8, 0x0A, 0x09, 0x58, 0xF4, 0xEE, 0xC6, 0xF4, 0x47,
+ 0xD7, 0xB3, 0xB4, 0x42, 0x74, 0x71, 0x23, 0xF8, 0xE0, 0x76, 0xA1, 0x91, 0x28, 0xE8, 0xE6, 0xFD,
+ 0x38, 0x13, 0x02, 0xD0, 0x07, 0x4C, 0x06, 0x1B, 0xB8, 0x18, 0xA5, 0xB3, 0x0F, 0xBF, 0x06, 0xBB,
+ 0x40, 0xD7, 0xE2, 0xE1, 0x54, 0xAC, 0x3F, 0x40, 0x5E, 0x68, 0x08, 0xA6, 0xF2, 0x7B, 0xA7, 0x97,
+ 0xFE, 0x05, 0x75, 0x41, 0x99, 0xBB, 0xCB, 0x2D, 0xC9, 0xE9, 0x41, 0x69, 0xA5, 0x69, 0x51, 0xC0,
+ 0x85, 0xD9, 0x3D, 0x82, 0x09, 0xF8, 0x91, 0xCB, 0xE1, 0x89, 0xA6, 0xD1, 0x30, 0xBF, 0xF7, 0xFC,
+ 0x5E, 0x23, 0xBB, 0x66, 0x65, 0x17, 0x2B, 0x96, 0xF2, 0xA0, 0xF3, 0xA0, 0xDA, 0xF2, 0x5B, 0x2A,
+ 0xDA, 0x20, 0x25, 0x1C, 0x7B, 0x3E, 0x42, 0xEC, 0xFC, 0xA0, 0x75, 0x1C, 0xDA, 0x96, 0x37, 0x40,
+ 0xF9, 0xD7, 0x6C, 0xA5, 0x2D, 0xE1, 0x9C, 0x69, 0x7D, 0xB3, 0x07, 0x8E, 0xC7, 0xE8, 0x8A, 0x24,
+ 0xDF, 0x77, 0x18, 0x4C, 0xCC, 0xAE, 0x1A, 0x5F, 0xF9, 0xC4, 0x21, 0x77, 0xFA, 0x2B, 0xA7, 0x2C,
+ 0xC3, 0xB4, 0x85, 0x3B, 0x2D, 0x34, 0xF7, 0x2D, 0xFA, 0xE8, 0x42, 0xDA, 0x7D, 0x4B, 0x18, 0x40,
+ 0xC6, 0xC6, 0x4B, 0xE4, 0xCE, 0x64, 0x97, 0x46, 0xC1, 0xA0, 0x32, 0x1C, 0xA4, 0xBB, 0xA0, 0x6C,
+ 0x49, 0xE9, 0x80, 0x46, 0x08, 0xA8, 0x1B, 0x30, 0x5E, 0x79, 0x54, 0x74, 0xE2, 0x0C, 0xC3, 0xD5,
+ 0x5C, 0x27, 0xD0, 0x0C, 0x30, 0xDC, 0x24, 0x47, 0x51, 0x78, 0xF5, 0x42, 0x37, 0xE2, 0x13, 0x4D,
+ 0x6B, 0x1C, 0x3B, 0x92, 0xF6, 0x70, 0xEE, 0x29, 0x04, 0xDF, 0x61, 0x68, 0x7E, 0xC9, 0xF2, 0xA8,
+ 0x9B, 0x0A, 0xD3, 0xC8, 0x2E, 0x34, 0x9B, 0x35, 0xE1, 0xD4, 0x7F, 0x15, 0x1B, 0x77, 0xDE, 0xF6,
+ 0x17, 0x44, 0xE8, 0xDA, 0xDF, 0x5D, 0xE1, 0xEE, 0xA2, 0x4B, 0xBE, 0x7E, 0x69, 0xFA, 0x01, 0x27,
+ 0x3F, 0x2C, 0xA6, 0x59, 0x4C, 0x63, 0x68, 0x48, 0x66, 0xC9, 0x43, 0xAB, 0x2A, 0x44, 0x20, 0xC7,
+ 0x04, 0x29, 0x0A, 0xA5, 0x83, 0x8C, 0xD7, 0x84, 0xE0, 0x87, 0xBB, 0x16, 0xBF, 0xC3, 0xBD, 0xC9,
+ 0x84, 0x41, 0x15, 0x9A, 0xDC, 0x67, 0xD8, 0x08, 0xB1, 0x89, 0xE1, 0xDC, 0x4C, 0x66, 0xFA, 0x64,
+ 0x1E, 0x21, 0xC8, 0x89, 0x1F, 0xC3, 0x74, 0x82, 0xB9, 0x88, 0x2B, 0x05, 0xA4, 0x95, 0xB2, 0x50,
+ 0xE6, 0xC2, 0x85, 0xC6, 0x4B, 0xE1, 0x7E, 0xB0, 0x63, 0x29, 0x9C, 0x2E, 0x51, 0x52, 0xB8, 0xB9,
+ 0xC6, 0x00, 0xE1, 0x7C, 0xA8, 0xFD, 0x41, 0x6D, 0xF0, 0x6E, 0x20, 0x53, 0xB6, 0x2E, 0x2A, 0x42,
+ 0xD7, 0xDF, 0x0F, 0xA5, 0x4E, 0x77, 0xC9, 0xEF, 0xBA, 0x71, 0xA7, 0x51, 0x39, 0xB1, 0xDB, 0xF6,
+ 0x81, 0x67, 0x0E, 0x87, 0x87, 0xE6, 0x47, 0x89, 0xC7, 0xF3, 0xDD, 0xB4, 0x6C, 0xA5, 0x53, 0x83,
+ 0xBF, 0xD7, 0xEC, 0xBE, 0xED, 0x8A, 0xAD, 0xE2, 0x31, 0x43, 0x9E, 0x2C, 0xBE, 0xAD, 0x0F, 0x60,
+ 0xA9, 0xEA, 0xB2, 0x95, 0x0B, 0xBE, 0x13, 0x3C, 0x98, 0x9C, 0xED, 0x0A, 0x04, 0x36, 0xBD, 0x7A,
+ 0x9F, 0x21, 0x41, 0x17, 0xA4, 0x89, 0x01, 0x62, 0xD5, 0x3C, 0xCF, 0xF9, 0xD7, 0x68, 0x4B, 0x3A,
+ 0xF4, 0x89, 0x10, 0x08, 0x10, 0x0C, 0xC5, 0x7C, 0xAD, 0x97, 0x24, 0x7C, 0xF5, 0x52, 0xB6, 0x65,
+ 0xEE, 0x3F, 0x76, 0x81, 0x41, 0xDF, 0x19, 0x8C, 0x75, 0x1D, 0x8E, 0x09, 0xCA, 0x60, 0xBD, 0x29,
+ 0x91, 0x68, 0x2C, 0x4C, 0x23, 0x90, 0x75, 0x27, 0x7F, 0xA5, 0x40, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB,
+ 0xCB, 0xDD, 0x2A, 0xFA, 0x8A, 0x76, 0x3D, 0x9D, 0xF7, 0x74, 0x16, 0x7C, 0x31, 0x6A, 0x88, 0x93,
+ 0x95, 0xD6, 0x5F, 0xE8, 0xBE, 0x1B, 0x0C, 0x4D, 0x65, 0xC1, 0xF6, 0x0D, 0x8E, 0xC9, 0x71, 0x13,
+ 0x61, 0x26, 0xBD, 0xB5, 0xFD, 0x16, 0xDF, 0xE1, 0x2E, 0x36, 0x8C, 0xA8, 0x51, 0xB7, 0x9B, 0xB1,
+ 0x69, 0x35, 0xD1, 0xF6, 0x09, 0x3D, 0x09, 0xB7, 0xDD, 0xAC, 0x39, 0xBD, 0x3F, 0x1D, 0xA6, 0xB8,
+ 0xA2, 0xE8, 0x70, 0x17, 0x9F, 0x49, 0xF9, 0x29, 0x48, 0xDF, 0xA3, 0xBF, 0x95, 0x8C, 0xD2, 0x8E,
+ 0x32, 0xD1, 0xDD, 0x98, 0x49, 0xC8, 0xBC, 0xA2, 0xAD, 0x99, 0x5A, 0xB4, 0x33, 0x51, 0x3D, 0xB8,
+ 0x6E, 0xA3, 0x72, 0xDD, 0xEF, 0x45, 0x51, 0xEC, 0x06, 0x8D, 0xFE, 0x15, 0xA9, 0x76, 0x69, 0xA1,
+ 0xAF, 0x75, 0x1B, 0xE7, 0x8E, 0xDE, 0x4B, 0xF7, 0x49, 0xDC, 0x66, 0xAA, 0xBE, 0xDA, 0x01, 0x18,
+ 0xA7, 0x2A, 0x11, 0xA3, 0x16, 0xF7, 0x29, 0x2C, 0x97, 0xCC, 0x2B, 0x54, 0xBC, 0xEF, 0x9F, 0x94,
+ 0xC8, 0xA4, 0xB8, 0x87, 0x01, 0x3F, 0x0C, 0x69, 0xD5, 0xE9, 0xB9, 0x71, 0x30, 0x9B, 0xAC, 0x1B,
+ 0x1F, 0xB2, 0xC0, 0x67, 0x52, 0x78, 0x91, 0xBA, 0x3F, 0x2F, 0xC3, 0x5C, 0x80, 0x39, 0x70, 0x1C,
+ 0x7E, 0x07, 0x71, 0x70, 0x9D, 0x95, 0x6D, 0xE2, 0x0A, 0x5D, 0x1E, 0x19, 0x06, 0x9A, 0x85, 0xE1,
+ 0x2E, 0xD5, 0xFA, 0x02, 0x2E, 0x32, 0x53, 0xAD, 0x05, 0x2F, 0xEC, 0x08, 0x7E, 0xDD, 0x71, 0x9D,
+ 0x34, 0xFC, 0x9D, 0x0D, 0x44, 0x4E, 0x3E, 0x20, 0x00, 0xA8, 0x76, 0x02, 0xF8, 0xBF, 0x6B, 0x9F,
+ 0x4A, 0x60, 0x99, 0xA1, 0x74, 0x4B, 0xB9, 0x91, 0x16, 0x4D, 0x41, 0xC5, 0xA1, 0x33, 0xD3, 0x90,
+ 0x8A, 0x2F, 0x83, 0x92, 0x8B, 0x53, 0x1D, 0x29, 0x8F, 0x97, 0xD8, 0xA0, 0x48, 0x63, 0xB4, 0x43,
+ 0x20, 0x82, 0xC7, 0xC2, 0x0A, 0x7F, 0xFB, 0x07, 0x74, 0x31, 0x54, 0x2A, 0xCB, 0xCA, 0x7E, 0xD6,
+ 0x91, 0x6B, 0x82, 0x73, 0x51, 0x66, 0x7B, 0xDF, 0x63, 0x53, 0x08, 0xFC, 0x17, 0x20, 0xA9, 0x87,
+ 0x1D, 0x24, 0xD0, 0x44, 0x45, 0xBC, 0x80, 0x80, 0x4B, 0x52, 0x90, 0x4E, 0xA5, 0xDF, 0xD1, 0x3F,
+ 0xA9, 0xCC, 0xD7, 0xD9, 0xAD, 0x1F, 0x65, 0x63, 0xA6, 0x57, 0x85, 0x39, 0x98, 0x33, 0xE8, 0xBC,
+ 0xF5, 0xE2, 0xD2, 0x4B, 0xF7, 0xEA, 0x61, 0xE3, 0xFA, 0xF3, 0x73, 0x6C, 0xA2, 0x0A, 0x26, 0xCB,
+ 0x09, 0x2E, 0xC4, 0x03, 0x38, 0x97, 0x7A, 0x3A, 0xC7, 0xB0, 0x0C, 0x35, 0x6D, 0x73, 0x14, 0x70,
+ 0x01, 0xF6, 0x8F, 0x67, 0xBA, 0xD9, 0x4E, 0xAF, 0xEA, 0x96, 0x3D, 0xC6, 0x7E, 0xE7, 0x2B, 0x29,
+ 0x27, 0xAB, 0xFA, 0xA8, 0x08, 0xB1, 0x01, 0x20, 0xF3, 0xD1, 0x45, 0x35, 0x33, 0x56, 0x26, 0x81,
+ 0x00, 0xB2, 0x41, 0x01, 0x1A, 0x71, 0x28, 0x35, 0xF4, 0x43, 0x2F, 0x48, 0x59, 0x69, 0x22, 0x5A,
+ 0x89, 0x8D, 0xC7, 0x38, 0x5F, 0x12, 0x40, 0x65, 0x7B, 0x89, 0x06, 0x76, 0x74, 0x08, 0xE5, 0xFC,
+ 0x83, 0x61, 0x2B, 0xAF, 0xB4, 0xE0, 0xE4, 0x51, 0x4D, 0xF7, 0x31, 0x09, 0x0A, 0xC0, 0xB9, 0x47,
+ 0x23, 0xCB, 0xF7, 0x90, 0x86, 0x65, 0x27, 0xF3, 0x65, 0xBF, 0x52, 0xAF, 0x4A, 0x3E, 0xBF, 0x0C,
+ 0x9E, 0xC9, 0x6D, 0x4D, 0xD6, 0x64, 0x77, 0x59, 0x2B, 0x88, 0x6B, 0xD7, 0x7E, 0xBF, 0x8F, 0x53,
+ 0x48, 0xD8, 0x9E, 0x6E, 0x7E, 0x16, 0x60, 0x4C, 0xE9, 0x33, 0x83, 0x01, 0x74, 0xCD, 0x1F, 0x8B,
+ 0x4F, 0x3A, 0xEA, 0xCC, 0x45, 0xEE, 0x8F, 0xEA, 0x0C, 0x40, 0x76, 0xA7, 0xDF, 0x69, 0xFE, 0xD4,
+ 0xD3, 0x23, 0x93, 0x07, 0x77, 0x8D, 0xCD, 0x20, 0xE9, 0x71, 0xB7, 0xFA, 0xFB, 0x27, 0x6D, 0x0A,
+ 0xBC, 0x1E, 0xFE, 0x49, 0x2B, 0x15, 0x68, 0x9B, 0x58, 0x3A, 0xA7, 0xC5, 0xB8, 0x17, 0xA3, 0xAA,
+ 0xCF, 0xF7, 0x91, 0x2E, 0xF2, 0xFC, 0xA4, 0xDC, 0x50, 0xB3, 0x19, 0x5C, 0x85, 0xA2, 0x89, 0x8C,
+ 0xBB, 0x9A, 0x12, 0x45, 0xC9, 0x06, 0x36, 0xA3, 0x10, 0x3F, 0x4A, 0x0E, 0x08, 0x7F, 0xF9, 0x45,
+ 0x09, 0xBC, 0xD5, 0xAC, 0x56, 0x6F, 0xB4, 0xC1, 0x15, 0x4E, 0xD4, 0x55, 0xD1, 0xF4, 0x97, 0x19,
+ 0x7E, 0x88, 0x4E, 0xA7, 0x95, 0x5B, 0x89, 0xF9, 0x4A, 0x7A, 0xDD, 0x69, 0xB9, 0xEF, 0xB6, 0x1D,
+ 0x68, 0x98, 0xAB, 0xBE, 0xF9, 0x10, 0x12, 0x79, 0xC0, 0x2E, 0x08, 0x8B, 0xD4, 0xFE, 0xFB, 0x33,
+ 0xF5, 0x17, 0x6F, 0x71, 0x71, 0xD9, 0x95, 0x08, 0xBC, 0x05, 0x71, 0x6A, 0x54, 0x99, 0x80, 0x94,
+ 0x8A, 0x92, 0x2B, 0x1A, 0x52, 0x60, 0x53, 0xAC, 0xB0, 0x58, 0xE1, 0x97, 0xC6, 0xAB, 0x1A, 0x81,
+ 0x89, 0xBE, 0x60, 0xB1, 0x16, 0x79, 0xED, 0x3D, 0xE5, 0x31, 0xA2, 0x35, 0x74, 0x26, 0xAE, 0xFF,
+ 0xEB, 0x7D, 0x62, 0xD0, 0x08, 0x00, 0x44, 0x9C, 0xBA, 0x22, 0x1F, 0x4D, 0x12, 0x1C, 0xF6, 0xEF,
+ 0x43, 0x31, 0xBA, 0x80, 0xB7, 0x21, 0x2C, 0xAA, 0x0C, 0x47, 0xAA, 0x50, 0xC9, 0xE5, 0x9B, 0x6F,
+ 0xAF, 0x69, 0x92, 0xD6, 0x72, 0x73, 0xAE, 0x2D, 0x7B, 0x60, 0x91, 0x0B, 0xC5, 0x48, 0x4D, 0xE4,
+ 0x1B, 0x92, 0xC5, 0x60, 0x81, 0xF5, 0x96, 0xD5, 0x19, 0x72, 0x39, 0xF6, 0xC7, 0x47, 0x81, 0x3C,
+ 0x2E, 0x5D, 0xDA, 0xBE, 0xAE, 0xF0, 0x04, 0x40, 0x2C, 0x0F, 0x98, 0x91, 0x2A, 0xB3, 0x2B, 0x90,
+ 0xCD, 0x31, 0x92, 0x75, 0x9A, 0x93, 0x51, 0x83, 0x74, 0xCD, 0xFE, 0x53, 0x00, 0x99, 0xAE, 0x49,
+ 0x47, 0x4B, 0x4F, 0x04, 0x70, 0xEE, 0x58, 0x4D, 0x84, 0x97, 0x7C, 0x75, 0x46, 0xBC, 0x64, 0xC7,
+ 0x85, 0xA9, 0x0A, 0x7D, 0x5C, 0x6C, 0x9A, 0x21, 0x0B, 0x2A, 0x16, 0xF6, 0x96, 0xE6, 0x35, 0x6B,
+ 0x59, 0xB1, 0xBB, 0xF7, 0xC2, 0x24, 0x33, 0x52, 0x79, 0x55, 0x33, 0x8D, 0xE6, 0xD0, 0xD8, 0xA7,
+ 0xE5, 0x18, 0x5F, 0xF3, 0xE1, 0xE4, 0x23, 0xFF, 0xBF, 0x16, 0xDC, 0xFE, 0x5F, 0x32, 0x99, 0x2B,
+ 0x22, 0x1A, 0x77, 0x2A, 0xAD, 0x04, 0x07, 0x3C, 0x15, 0xBF, 0x99, 0x53, 0x9C, 0x29, 0x2B, 0x67,
+ 0xAF, 0xDD, 0x51, 0x89, 0x03, 0x85, 0xFF, 0x64, 0x2E, 0x1D, 0x0B, 0x03, 0x32, 0xB9, 0x51, 0xB8,
+ 0xE4, 0x9F, 0x54, 0x49, 0xC4, 0x32, 0x0F, 0x99, 0x34, 0xB3, 0x51, 0xE9, 0x2D, 0x75, 0xF3, 0xF8,
+ 0x04, 0x86, 0x6B, 0x84, 0xB0, 0x97, 0x95, 0xF4, 0x38, 0x4C, 0x8C, 0x88, 0x49, 0x48, 0x9E, 0x59,
+ 0x0E, 0x8B, 0xB1, 0xE1, 0x41, 0x66, 0x10, 0x94, 0x59, 0xF9, 0x6E, 0x78, 0xCC, 0x11, 0x80, 0x92,
+ 0x33, 0x7E, 0x6A, 0xB8, 0xC9, 0x33, 0xE8, 0xDD, 0x1B, 0x3F, 0x74, 0x79, 0x42, 0x5C, 0x93, 0x00,
+ 0x4B, 0x68, 0xDA, 0x70, 0x8A, 0xB5, 0x24, 0xFD, 0x6B, 0x14, 0xF8, 0x1A, 0x26, 0x6A, 0x21, 0x36,
+ 0x7C, 0xF6, 0x49, 0x44, 0xB4, 0xA6, 0x59, 0xF3, 0x00, 0x76, 0xC5, 0x8A, 0x30, 0xF4, 0x9C, 0x13,
+ 0xC9, 0xB2, 0xCE, 0xF1, 0x3F, 0xAB, 0x75, 0xD6, 0x4F, 0x36, 0xEA, 0x86, 0x12, 0x7A, 0x9A, 0x54,
+ 0x68, 0xEA, 0x13, 0xF4, 0x39, 0xC1, 0xC5, 0x70, 0x22, 0x79, 0x21, 0x0D, 0x7B, 0x47, 0x02, 0x97,
+ 0x14, 0xFF, 0xD2, 0xBE, 0x99, 0x84, 0x0F, 0x3E, 0xDF, 0xA5, 0x64, 0x98, 0xDF, 0xF8, 0xAA, 0xA2,
+ 0xD2, 0xED, 0xE8, 0x6E, 0x41, 0xF4, 0x04, 0x3C, 0xE8, 0x39, 0x80, 0x07, 0xBA, 0x7A, 0xCF, 0x69,
+ 0x32, 0xDB, 0x7B, 0x72, 0x56, 0xE4, 0x1A, 0xA9, 0x87, 0xB2, 0x32, 0x3F, 0xD9, 0xF4, 0x3F, 0x4B,
+ 0x04, 0xF2, 0xE1, 0x55, 0xD0, 0xED, 0x5D, 0xD9, 0x57, 0x7A, 0x04, 0x08, 0x05, 0x68, 0x15, 0x7B,
+ 0x41, 0x61, 0x73, 0x52, 0x7C, 0xC9, 0x23, 0x30, 0x7A, 0x2F, 0xA4, 0xDF, 0x53, 0xEB, 0x99, 0xAF,
+ 0x28, 0x89, 0x47, 0x10, 0xC5, 0xFD, 0xE0, 0x72, 0xA3, 0x5D, 0xE1, 0x02, 0x22, 0x49, 0x25, 0xDF,
+ 0x00, 0x71, 0x26, 0xE7, 0xC5, 0x16, 0x6C, 0x5F, 0x24, 0x7F, 0xBF, 0x12, 0x2E, 0x71, 0xF1, 0x54,
+ 0x15, 0xE3, 0x76, 0xDA, 0x27, 0x41, 0x8E, 0xF8, 0xA0, 0xC0, 0xF9, 0x5F, 0x6D, 0x4F, 0xC5, 0x4B,
+ 0x58, 0xB5, 0xAB, 0xC4, 0x40, 0xA4, 0x89, 0x32, 0x08, 0x63, 0x5F, 0x68, 0x93, 0x56, 0x1C, 0x1F,
+ 0x6F, 0xDE, 0xF1, 0x63, 0x28, 0x2E, 0x88, 0x52, 0x10, 0x3C, 0xFC, 0xEF, 0x03, 0x87, 0x91, 0xA5,
+ 0x22, 0x06, 0x58, 0x88, 0x4F, 0x2C, 0x0B, 0x11, 0xFC, 0x21, 0x23, 0xB8, 0x6A, 0xBD, 0x21, 0x5B,
+ 0x0C, 0x59, 0x2D, 0x6C, 0x83, 0x6F, 0x7C, 0xF8, 0x4D, 0x7F, 0x62, 0xBC, 0xD1, 0x7D, 0x39, 0x6E,
+ 0x78, 0xCB, 0x88, 0xF2, 0x98, 0xDC, 0xBE, 0xCE, 0x38, 0x45, 0xF5, 0xE9, 0x3F, 0x58, 0x54, 0x62,
+ 0xB4, 0x15, 0xE6, 0xF7, 0xE3, 0xCA, 0x91, 0x05, 0x35, 0x8C, 0x6A, 0xE6, 0x08, 0xFC, 0x05, 0x6D,
+ 0x64, 0x31, 0x4B, 0xA4, 0x61, 0x21, 0x99, 0x4D, 0x51, 0xF5, 0x98, 0x07, 0x65, 0x3F, 0xD0, 0x6A,
+ 0x8F, 0xDB, 0x8B, 0xB2, 0x0E, 0x43, 0x75, 0x49, 0x5D, 0x57, 0xAF, 0x98, 0x51, 0xA8, 0x28, 0x62,
+ 0x8B, 0xBA, 0x47, 0x60, 0x90, 0xCC, 0xC8, 0xC2, 0x8D, 0xA7, 0xC0, 0xD5, 0x80, 0x6D, 0x54, 0x7F,
+ 0xCD, 0xC6, 0xE6, 0x08, 0x23, 0x84, 0x69, 0x79, 0x29, 0x8F, 0x47, 0xB7, 0x85, 0x78, 0x8F, 0x29,
+ 0xE1, 0x53, 0x50, 0xE4, 0x1B, 0x77, 0x66, 0x10, 0x63, 0xBF, 0xA4, 0xC2, 0xDF, 0xB3, 0x2C, 0x87,
+ 0x21, 0x34, 0xE4, 0xE6, 0xE4, 0x6F, 0x2F, 0x5D, 0x5E, 0x45, 0xCF, 0x31, 0x7C, 0x4A, 0x5E, 0x99,
+ 0xB9, 0x81, 0xAF, 0x9C, 0xCD, 0x24, 0x6B, 0x33, 0xE6, 0x8D, 0xB8, 0xB8, 0xA0, 0xDE, 0x15, 0x41,
+ 0xFA, 0xBA, 0x21, 0xFC, 0x5D, 0xD0, 0x85, 0x3E, 0xD2, 0x06, 0x43, 0x3E, 0x93, 0xD6, 0x83, 0x58,
+ 0x74, 0x57, 0xE0, 0xBD, 0x11, 0x4E, 0xF4, 0x17, 0xEA, 0x1C, 0x8B, 0x22, 0xB7, 0x6E, 0x89, 0x92,
+ 0xC8, 0x48, 0xF9, 0x88, 0xEA, 0x46, 0x83, 0x54, 0x76, 0x94, 0xFD, 0x58, 0xD3, 0xA7, 0xD3, 0x24,
+ 0xAF, 0xC9, 0x05, 0x64, 0x76, 0xC9, 0xC5, 0xA6, 0x41, 0x2E, 0xD7, 0xAA, 0x37, 0x72, 0x7A, 0x7C,
+ 0x1B, 0x69, 0xBD, 0xA4, 0xD2, 0x43, 0x9D, 0xC6, 0xE4, 0x20, 0x8F, 0x08, 0x31, 0xE7, 0x6E, 0xD4,
+ 0xFB, 0x2D, 0x85, 0x3D, 0x5A, 0x21, 0xEC, 0x03, 0xB5, 0x66, 0xFE, 0xF0, 0x24, 0x2A, 0xBF, 0x32,
+ 0x6D, 0x5C, 0x4D, 0x9C, 0x4B, 0x22, 0x49, 0xEC, 0x72, 0x9B, 0x9A, 0x36, 0x03, 0x91, 0x8C, 0x7C,
+ 0xB9, 0xE9, 0x8D, 0x72, 0xE0, 0xB0, 0x52, 0x63, 0x2E, 0xDB, 0x9C, 0x0D, 0x55, 0x33, 0xA5, 0x17,
+ 0x7A, 0x2D, 0xAF, 0x75, 0x69, 0x50, 0x7D, 0xDC, 0xEE, 0x26, 0xC6, 0xE3, 0x26, 0xF9, 0x59, 0xF9,
+ 0x10, 0x42, 0x1E, 0xC7, 0x3E, 0x11, 0xCB, 0xFA, 0x4E, 0xE6, 0xAB, 0x6E, 0xA9, 0x1C, 0xD1, 0x76,
+ 0x20, 0xB6, 0xD6, 0xBD, 0xD3, 0xCA, 0x9C, 0x82, 0x33, 0xB8, 0x5E, 0xED, 0xCA, 0x2C, 0x50, 0xC3,
+ 0x58, 0x13, 0x7A, 0xA7, 0xF0, 0x92, 0x89, 0x04, 0xF8, 0x27, 0x98, 0xE2, 0x1C, 0xF2, 0xDA, 0xF6,
+ 0x4D, 0xC0, 0x6A, 0x1C, 0xC5, 0xA5, 0x79, 0x6B, 0x84, 0x37, 0x05, 0x90, 0x6A, 0x0E, 0x2B, 0xAF,
+ 0x96, 0x9E, 0x45, 0xDB, 0x79, 0xDA, 0x2F, 0x46, 0x5F, 0xE2, 0xE8, 0xA6, 0xC6, 0x00, 0xF2, 0x8F,
+ 0xC2, 0xA0, 0xF9, 0x32, 0x53, 0x63, 0xF9, 0xED, 0x9C, 0x0F, 0x29, 0x8F, 0x5D, 0x6C, 0x56, 0xE9,
+ 0xBF, 0x52, 0xB1, 0xB5, 0xD3, 0x8A, 0xE4, 0xE6, 0x1D, 0xB2, 0xC9, 0x0E, 0x8F, 0x28, 0xB0, 0xBF,
+ 0x68, 0x91, 0x87, 0x8E, 0x30, 0x6A, 0xF6, 0x5E, 0x44, 0x81, 0x3E, 0xAA, 0xC2, 0x93, 0x9D, 0x41,
+ 0xAE, 0x54, 0xF1, 0x96, 0x40, 0x30, 0x5F, 0xAD, 0x44, 0xCF, 0xB4, 0x34, 0x86, 0xE2, 0xF4, 0x97,
+ 0x14, 0x21, 0x1D, 0xA5, 0x58, 0xAF, 0x7B, 0x32, 0x5D, 0x63, 0x9A, 0x9D, 0x2A, 0x7C, 0xDA, 0xAD,
+ 0xD5, 0xB2, 0xA8, 0x0D, 0x8F, 0xDA, 0x44, 0xCE, 0xB6, 0xA0, 0xC3, 0x3C, 0x73, 0xC5, 0x8C, 0x9B,
+ 0x62, 0x0C, 0xF2, 0x79, 0x3C, 0x78, 0xF8, 0xC3, 0xC4, 0x4B, 0xAE, 0x29, 0x5A, 0x30, 0xC9, 0xB9,
+ 0x6A, 0xE4, 0x52, 0x09, 0xE1, 0x09, 0x60, 0x8B, 0x56, 0x90, 0x84, 0xE2, 0x5A, 0x07, 0x88, 0x25,
+ 0x03, 0xB7, 0x5B, 0x86, 0x1E, 0x68, 0x2C, 0x25, 0x5D, 0xFE, 0xB9, 0x5A, 0xF0, 0xDC, 0x81, 0x1F,
+ 0xEE, 0xF7, 0x11, 0x94, 0x67, 0x85, 0x13, 0xEC, 0x65, 0xEC, 0x83, 0x53, 0x81, 0x57, 0xEB, 0x95,
+ 0xF5, 0xCE, 0xFF, 0x26, 0xDE, 0x85, 0xDD, 0x7D, 0xA3, 0xFB, 0xA2, 0xB9, 0xD9, 0x33, 0x82, 0x0D,
+ 0x43, 0xC9, 0x1B, 0x72, 0x14, 0x39, 0x24, 0x57, 0x2A, 0x8E, 0x36, 0xA6, 0x86, 0xCC, 0xE8, 0x1F,
+ 0x6B, 0xAD, 0x7B, 0x0E, 0x89, 0xF9, 0x1C, 0xBB, 0x6E, 0x43, 0x99, 0xD5, 0xAA, 0x59, 0xDF, 0x63,
+ 0x12, 0x29, 0x56, 0xCD, 0x55, 0x56, 0xFC, 0x3E, 0xC2, 0x38, 0xD4, 0x65, 0x59, 0xE8, 0x6E, 0x31,
+ 0xFE, 0xA8, 0x18, 0xAA, 0xB4, 0x4C, 0x72, 0x3C, 0xB2, 0xBD, 0xA7, 0x54, 0x8B, 0x53, 0xF8, 0xF7,
+ 0xB8, 0x80, 0xCE, 0x06, 0x89, 0x5E, 0x9D, 0x19, 0x29, 0xDE, 0x73, 0x01, 0xCF, 0x0C, 0xD2, 0xF8,
+ 0xE3, 0x2B, 0x3D, 0x7C, 0x84, 0xFF, 0x4D, 0xE3, 0x2E, 0x33, 0x6F, 0x47, 0x1E, 0x97, 0xB3, 0x55,
+ 0x0B, 0x5C, 0xE3, 0xAB, 0x9C, 0xCB, 0x40, 0x82, 0xD6, 0xA3, 0x47, 0x8B, 0xFF, 0xB1, 0x26, 0x44,
+ 0xE3, 0x7E, 0x39, 0xDB, 0xDD, 0x1B, 0x35, 0xE6, 0x6E, 0xF2, 0x48, 0x57, 0x09, 0x02, 0xB6, 0xA4,
+ 0xD4, 0xB9, 0x7E, 0x20, 0x93, 0x8F, 0x59, 0xE7, 0x2D, 0x0D, 0xB8, 0x82, 0x9A, 0xA4, 0xC7, 0xB2,
+ 0x2A, 0x31, 0x88, 0x52, 0x98, 0xDF, 0x4C, 0xF6, 0xD4, 0xB4, 0xD2, 0x71, 0x41, 0xAA, 0x37, 0x52,
+ 0x34, 0x70, 0x51, 0x9B, 0x33, 0x2D, 0xA3, 0x71, 0x3E, 0xB4, 0xC2, 0x5B, 0xEC, 0xC4, 0xD4, 0x51,
+ 0xF5, 0x8A, 0xD8, 0xB2, 0x87, 0xAE, 0x41, 0xC2, 0xBA, 0x0B, 0x43, 0xEA, 0x83, 0xD8, 0x32, 0x97,
+ 0x5C, 0xCA, 0xF6, 0xBD, 0x65, 0x89, 0xF7, 0x92, 0x8E, 0xF9, 0x97, 0x7F, 0xF7, 0x17, 0x28, 0x47,
+ 0x45, 0xB3, 0xEB, 0x71, 0x86, 0x16, 0x40, 0x86, 0x28, 0x43, 0x33, 0x92, 0x11, 0x06, 0xED, 0x26,
+ 0x5D, 0x8F, 0x35, 0xAB, 0xA7, 0xF6, 0x6C, 0xCE, 0x29, 0x62, 0xD6, 0xBE, 0x16, 0xA3, 0x6B, 0x34,
+ 0xAE, 0x40, 0xED, 0x25, 0x2A, 0xA7, 0x84, 0x1A, 0x7F, 0xB0, 0xBE, 0x2E, 0x09, 0x8A, 0x06, 0x90,
+ 0x11, 0x2D, 0x54, 0x88, 0x2C, 0x23, 0x78, 0x4A, 0x79, 0x13, 0x39, 0xEA, 0xC5, 0x4F, 0x05, 0x30,
+ 0x46, 0xBB, 0x38, 0xF1, 0x47, 0x36, 0xBF, 0xAF, 0xD1, 0x7E, 0x3A, 0x7B, 0x31, 0x54, 0x22, 0x2F,
+ 0x3D, 0xA6, 0xAB, 0x10, 0x1A, 0x3B, 0x76, 0x9A, 0xED, 0xCC, 0xD2, 0xD3, 0x29, 0xA5, 0x90, 0xEB,
+ 0x57, 0x15, 0x1D, 0xC8, 0xB6, 0xCD, 0xD0, 0x11, 0x44, 0x2C, 0x7B, 0xCF, 0x42, 0xA0, 0x76, 0xE2,
+ 0x14, 0x43, 0xC0, 0xBD, 0x53, 0x22, 0x37, 0x4E, 0x83, 0xD2, 0x91, 0x47, 0xDD, 0xCB, 0x8E, 0x5A,
+ 0xB0, 0xA6, 0xB0, 0x13, 0x84, 0x81, 0x6A, 0x59, 0xC4, 0xC9, 0x58, 0x1A, 0x3B, 0x41, 0x09, 0x2B,
+ 0xC1, 0xCB, 0x39, 0x98, 0xE8, 0xDD, 0x1B, 0x45, 0x5F, 0xB6, 0x86, 0x6B, 0x41, 0x7C, 0x32, 0xDC,
+ 0x0E, 0x03, 0xE7, 0xF3, 0xB9, 0x65, 0x8E, 0x3A, 0x69, 0x67, 0x8E, 0xE2, 0x6D, 0x6F, 0xB7, 0xA7,
+ 0x2A, 0x93, 0x9D, 0xEA, 0xA7, 0x2E, 0x82, 0x88, 0x67, 0xC6, 0x91, 0x36, 0xDC, 0x93, 0x47, 0x9A,
+ 0xCD, 0xF9, 0xF6, 0xFA, 0x2A, 0x3A, 0x85, 0xD1, 0x66, 0x48, 0xFC, 0x1A, 0x9E, 0x64, 0x6C, 0x20,
+ 0xD4, 0x19, 0x07, 0xDA, 0xE3, 0xC3, 0x54, 0xD2, 0x45, 0xB5, 0x47, 0x10, 0x2A, 0xB4, 0x00, 0xDF,
+ 0x06, 0xF6, 0xE4, 0xBF, 0x47, 0x6C, 0x61, 0xDD, 0xD7, 0x3C, 0xE2, 0x27, 0x3A, 0x4E, 0xEE, 0xCA,
+ 0x07, 0x03, 0x7E, 0xFC, 0x41, 0x94, 0x3B, 0xA8, 0xD5, 0x28, 0x65, 0xBE, 0x55, 0x28, 0x69, 0x10,
+ 0xF3, 0x91, 0xCE, 0xF8, 0x84, 0x65, 0x45, 0xDC, 0xB0, 0x54, 0x79, 0x1A, 0x17, 0x60, 0x61, 0xBD,
+ 0xB6, 0x2C, 0x93, 0x21, 0x8E, 0x19, 0x35, 0x27, 0x9B, 0x5E, 0xFE, 0x8D, 0xB4, 0x1A, 0xD6, 0xD1,
+ 0xB2, 0xCE, 0xC6, 0x20, 0x6B, 0x92, 0xEC, 0x78, 0xF8, 0x7D, 0x93, 0x22, 0xF0, 0xD5, 0xD4, 0x5B,
+ 0x41, 0xF3, 0xC2, 0x32, 0xB7, 0x58, 0x5E, 0x40, 0x9E, 0x0F, 0x93, 0x2A, 0xBC, 0xBC, 0xD5, 0x33,
+ 0x27, 0x13, 0x0E, 0x4B, 0x9B, 0x8F, 0x3D, 0x77, 0x02, 0x24, 0xA4, 0x72, 0xAE, 0x77, 0xE4, 0x1A,
+ 0xE8, 0xA3, 0x88, 0x7C, 0xDC, 0x15, 0x23, 0x62, 0xD1, 0x53, 0xF8, 0x2F, 0x42, 0xAB, 0xC1, 0xF9,
+ 0x43, 0x4F, 0x5E, 0xAD, 0x44, 0xD3, 0x8B, 0x36, 0x39, 0x5C, 0xAB, 0x52, 0x3D, 0xEB, 0x86, 0x00,
+ 0x49, 0x18, 0x3C, 0x3C, 0x5A, 0x2B, 0xD0, 0xD4, 0xEF, 0xD9, 0xEA, 0xC5, 0x51, 0x53, 0xBD, 0xBD,
+ 0xBE, 0x42, 0x37, 0x37, 0x74, 0x89, 0xBB, 0x1D, 0x6E, 0x2D, 0x42, 0xD3, 0x73, 0x28, 0x47, 0x2F,
+ 0xFD, 0x2C, 0xC0, 0xE0, 0xBE, 0xFD, 0x7D, 0x4E, 0x8A, 0xD8, 0xC6, 0xE0, 0xFE, 0xF5, 0xE0, 0x33,
+ 0x2D, 0xB2, 0x38, 0xAC, 0x83, 0xDF, 0x6D, 0x7F, 0x29, 0xAA, 0x0C, 0x12, 0x74, 0xC0, 0x5B, 0xB6,
+ 0x7E, 0x7F, 0x07, 0x83, 0xC9, 0x70, 0x2E, 0x89, 0x86, 0x13, 0xE6, 0xBA, 0x83, 0xE6, 0x41, 0xA2,
+ 0xC2, 0xFF, 0xE4, 0x33, 0x77, 0xD8, 0x42, 0x80, 0x46, 0xDB, 0x0C, 0x02, 0xF1, 0x4D, 0xAD, 0x82,
+ 0x0E, 0x6F, 0xE2, 0x76, 0x3F, 0x5E, 0x16, 0x23, 0xF8, 0xC9, 0x8D, 0x55, 0x91, 0xBA, 0x52, 0xEF,
+ 0x8A, 0x49, 0x0E, 0x33, 0x7A, 0xF6, 0xB5, 0x62, 0xD3, 0x79, 0xC4, 0x99, 0x49, 0xE9, 0x81, 0xC1,
+ 0xF9, 0x3F, 0x75, 0x9E, 0x24, 0x14, 0x9A, 0x9D, 0x70, 0x62, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB,
+ 0x46, 0x5C, 0x3C, 0xDE, 0xA3, 0xF4, 0xCE, 0x9D, 0x4C, 0x84, 0x69, 0xDA, 0x0E, 0x29, 0x86, 0x8F,
+ 0xF0, 0xD1, 0x3A, 0x33, 0xE4, 0xEE, 0xFC, 0x8D, 0xA9, 0x51, 0x3C, 0x60, 0x27, 0x61, 0x3F, 0x90,
+ 0xE4, 0xC9, 0x71, 0xE1, 0xEB, 0xF9, 0x04, 0xEB, 0xA3, 0xB8, 0xAD, 0x04, 0x82, 0x2B, 0x40, 0x13,
+ 0x46, 0xC0, 0x47, 0x72, 0xC7, 0x37, 0xD5, 0xCF, 0x0E, 0x93, 0x58, 0x2C, 0xED, 0x03, 0x68, 0xE2,
+ 0x78, 0xFD, 0x70, 0xE8, 0x53, 0x27, 0x06, 0x70, 0x7A, 0x7F, 0x85, 0xEF, 0x2B, 0x98, 0x7F, 0xFD,
+ 0x34, 0x2B, 0xAC, 0xA0, 0x46, 0x35, 0x56, 0x75, 0x96, 0x0B, 0xF9, 0xEC, 0xE4, 0x9B, 0xBD, 0x1E,
+ 0xE0, 0x94, 0x67, 0x86, 0xD3, 0xBB, 0xE4, 0x53, 0x82, 0x28, 0x29, 0xC2, 0x1B, 0x3F, 0x79, 0x86,
+ 0x44, 0x6A, 0x50, 0x1E, 0xCE, 0x1B, 0xCC, 0x8C, 0x13, 0x49, 0x32, 0xE3, 0xE6, 0xD1, 0x5B, 0xDD,
+ 0x59, 0x33, 0x75, 0x95, 0xF2, 0xC1, 0xC5, 0x77, 0x08, 0x81, 0x47, 0x39, 0xCD, 0xBA, 0x78, 0xA1,
+ 0x47, 0xD4, 0x2C, 0xDE, 0x9F, 0xB0, 0x20, 0x55, 0xA1, 0x4B, 0xD9, 0x0A, 0xA8, 0x9C, 0xFE, 0x8C,
+ 0x5F, 0x80, 0x2B, 0x90, 0x5D, 0x86, 0xB5, 0x91, 0x31, 0x5C, 0x34, 0x4A, 0xC8, 0x27, 0xFF, 0x2D,
+ 0xDA, 0xA8, 0xA3, 0xBE, 0x9A, 0xB3, 0x24, 0x8A, 0xB4, 0x1C, 0xCC, 0xC1, 0x80, 0x75, 0xEB, 0x88,
+ 0x79, 0xA2, 0x20, 0xD9, 0x7E, 0x13, 0xCC, 0x6E, 0xE9, 0x2E, 0xA0, 0x3A, 0x46, 0x2F, 0xA1, 0x99,
+ 0xDE, 0x57, 0xE4, 0x33, 0x10, 0xB2, 0xC8, 0xE5, 0xCF, 0xC0, 0x75, 0x9E, 0xF7, 0xB9, 0x74, 0xA8,
+ 0xD0, 0x56, 0xFF, 0x86, 0x95, 0x73, 0xE1, 0x36, 0xF5, 0xED, 0x89, 0x0C, 0x35, 0x25, 0xDF, 0x05,
+ 0xDB, 0xAA, 0x09, 0x54, 0x29, 0xF4, 0x96, 0xD1, 0x82, 0x50, 0xC2, 0x60, 0x2C, 0xE4, 0xCB, 0x86,
+ 0xBE, 0xAB, 0xB1, 0x05, 0x1D, 0x85, 0xA6, 0x76, 0xA3, 0xE2, 0x4E, 0x74, 0x71, 0xEB, 0x65, 0xA1,
+ 0x53, 0xF6, 0x32, 0x67, 0x3A, 0x56, 0x2A, 0xE3, 0xE1, 0x8E, 0x75, 0xCF, 0xE0, 0xB2, 0xBB, 0x40,
+ 0x0A, 0xD1, 0x93, 0x83, 0xA0, 0x21, 0x29, 0x77, 0xC1, 0x8D, 0x67, 0x67, 0x27, 0xF0, 0xB1, 0x9B,
+ 0x1C, 0xD2, 0x3F, 0x93, 0x63, 0x86, 0x38, 0x12, 0xB6, 0x33, 0x6D, 0xAB, 0x5B, 0x16, 0xF2, 0xB5,
+ 0xAD, 0x30, 0xD6, 0xDD, 0xA7, 0xA1, 0x9F, 0xDD, 0x52, 0xEE, 0xEA, 0x50, 0xD4, 0x36, 0x1E, 0x9C,
+ 0x2B, 0xD0, 0x45, 0xEF, 0x7E, 0x43, 0xC7, 0x72, 0xBB, 0x55, 0xF7, 0xF6, 0x32, 0xE8, 0xC4, 0xAE,
+ 0x48, 0x1A, 0x6A, 0x8D, 0xE1, 0xA0, 0xBC, 0x83, 0x0F, 0x4A, 0xAC, 0x9C, 0x6F, 0x98, 0x56, 0x8A,
+ 0x66, 0x73, 0x15, 0x07, 0xA6, 0x46, 0xD1, 0x6B, 0x07, 0x1C, 0x36, 0x1E, 0xC9, 0x48, 0x8A, 0x05,
+ 0xC2, 0x1D, 0x9D, 0x54, 0x37, 0x34, 0x8F, 0x4B, 0xD7, 0x63, 0x1F, 0xC3, 0x02, 0xC2, 0x11, 0x70,
+ 0x40, 0x61, 0x4F, 0xE1, 0x17, 0x63, 0xDF, 0x21, 0x50, 0x7D, 0x08, 0x02, 0xB6, 0x97, 0x11, 0x2E,
+ 0xF5, 0xE6, 0x0C, 0x94, 0x10, 0x31, 0x5A, 0x51, 0x5D, 0x00, 0x84, 0xC2, 0x86, 0x90, 0xD4, 0xAE,
+ 0x34, 0xB7, 0x1E, 0x97, 0x80, 0x3F, 0x85, 0x52, 0x2D, 0x7A, 0xBD, 0x32, 0x03, 0x2B, 0x9F, 0xF5,
+ 0xCA, 0x85, 0x6D, 0x9A, 0xF3, 0x65, 0xAF, 0xE2, 0x60, 0xDF, 0x8C, 0x4F, 0x18, 0xD1, 0x85, 0xD3,
+ 0x01, 0x6B, 0x07, 0xA0, 0x54, 0xB6, 0xCB, 0x25, 0xB3, 0x92, 0x96, 0xC5, 0x0B, 0xE8, 0xB4, 0xA4,
+ 0x60, 0x23, 0x81, 0x47, 0xBA, 0xAD, 0x31, 0x05, 0x58, 0x3D, 0xC4, 0xA9, 0xF7, 0xAB, 0x9E, 0x9F,
+ 0xAF, 0x7E, 0xAA, 0x20, 0xB5, 0xA4, 0xA5, 0x9A, 0x46, 0xF7, 0xCC, 0xE8, 0xFE, 0x6B, 0x93, 0x07,
+ 0x7B, 0x43, 0x9F, 0x79, 0x55, 0x4E, 0xAB, 0xCD, 0xEF, 0x3A, 0xA1, 0x8E, 0xC4, 0xDE, 0x62, 0x5F,
+ 0x0A, 0xFF, 0xC7, 0x1B, 0x4E, 0x53, 0x50, 0x36, 0x93, 0x1C, 0x47, 0xF2, 0x6A, 0x58, 0xD0, 0xBF,
+ 0x70, 0x8B, 0x45, 0x34, 0x34, 0x33, 0x9E, 0x44, 0xB9, 0x64, 0xED, 0x9B, 0x6D, 0x07, 0x5F, 0x8C,
+ 0x12, 0xEF, 0xDC, 0x26, 0xFF, 0x4C, 0xCE, 0xCE, 0x8D, 0xB9, 0x91, 0xC7, 0x82, 0xBF, 0x08, 0x23,
+ 0xA8, 0x9A, 0x8E, 0x21, 0x8C, 0xDE, 0x1C, 0x92, 0x5B, 0xB0, 0x70, 0x69, 0x42, 0xD6, 0xB9, 0x94,
+ 0x1A, 0xA2, 0x12, 0x91, 0xF1, 0x54, 0x80, 0x02, 0x0C, 0xD2, 0x54, 0x17, 0x4C, 0x29, 0xEA, 0x31,
+ 0xC1, 0x60, 0x94, 0x9F, 0x44, 0xDF, 0x7B, 0x38, 0xFE, 0xD4, 0x32, 0x36, 0x6C, 0xD4, 0x6A, 0xD1,
+ 0x3D, 0x6C, 0x73, 0x77, 0x81, 0xDC, 0xE2, 0x9D, 0x48, 0x5A, 0xB2, 0x95, 0x28, 0x40, 0x5F, 0xF5,
+ 0x6C, 0x9A, 0x63, 0x4B, 0x24, 0xD5, 0xE3, 0x25, 0x75, 0xD4, 0xAC, 0x87, 0xA4, 0x55, 0x97, 0xA7,
+ 0xB0, 0xD7, 0x06, 0x10, 0xD5, 0x0F, 0xC9, 0x8F, 0xC7, 0x6C, 0x63, 0x49, 0x81, 0x14, 0x24, 0xB0,
+ 0x2C, 0xAA, 0xDE, 0x01, 0xB0, 0x4E, 0x2C, 0xD8, 0xB7, 0xDF, 0x24, 0x21, 0xF8, 0x07, 0xF6, 0x36,
+ 0x93, 0x09, 0x66, 0x1D, 0xBF, 0x6D, 0x76, 0xA7, 0xDC, 0xA2, 0x67, 0xAA, 0x9E, 0x04, 0xB4, 0x9C,
+ 0xE9, 0xBC, 0x78, 0xDC, 0xEC, 0x1D, 0x4D, 0xED, 0x5F, 0x9F, 0xAA, 0xFF, 0x75, 0x24, 0x3A, 0x95,
+ 0xF8, 0xA2, 0xC0, 0x38, 0x73, 0xEF, 0xFF, 0x11, 0x71, 0xDE, 0xBB, 0x76, 0x19, 0xBA, 0xB9, 0xB0,
+ 0xA6, 0x1B, 0x0F, 0x33, 0xFA, 0x3B, 0xB5, 0x4D, 0x32, 0x9F, 0x15, 0x09, 0xC3, 0x22, 0xCE, 0x73,
+ 0x31, 0xDD, 0x23, 0xBF, 0x1E, 0x99, 0x57, 0x6D, 0x0B, 0xDF, 0xF8, 0xFD, 0xAC, 0x41, 0xA7, 0x91,
+ 0x8B, 0x70, 0x5C, 0x41, 0x02, 0x77, 0x52, 0x1D, 0xAC, 0xBF, 0xBD, 0x03, 0xA3, 0x5A, 0xC4, 0x61,
+ 0xA8, 0xE1, 0x00, 0xE1, 0x77, 0x14, 0x7E, 0x5F, 0xDF, 0x11, 0x80, 0x40, 0xBA, 0xA1, 0x07, 0x9F,
+ 0xC7, 0xED, 0xC6, 0x77, 0xF4, 0x14, 0x55, 0x99, 0x56, 0x15, 0x6C, 0xF9, 0x34, 0x02, 0x28, 0x69,
+ 0x81, 0xDD, 0x0D, 0x9E, 0x5B, 0x35, 0xEA, 0x1D, 0x9C, 0xA9, 0xBB, 0x82, 0x79, 0x1B, 0xE7, 0xF5,
+ 0xF8, 0xFD, 0x14, 0xC8, 0xDC, 0xE8, 0x7A, 0x6D, 0x7B, 0xA1, 0x35, 0x7C, 0x0B, 0x13, 0x1B, 0x08,
+ 0x2E, 0x8B, 0x04, 0x27, 0x16, 0x04, 0xFC, 0x6C, 0xE4, 0x1E, 0x29, 0x06, 0xF1, 0x05, 0xCD, 0x6C,
+ 0x10, 0xB1, 0xBA, 0xB9, 0x7F, 0x97, 0xDD, 0x8C, 0xA5, 0x51, 0xB8, 0xD5, 0xE8, 0xE9, 0xEA, 0x23,
+ 0x5D, 0x2C, 0x6A, 0xC2, 0x74, 0x7F, 0x81, 0xB6, 0x47, 0xF9, 0xA5, 0x94, 0x57, 0x31, 0x3B, 0xCE,
+ 0xCB, 0x13, 0xA7, 0xED, 0x9A, 0x29, 0x33, 0x4F, 0xE2, 0xB5, 0xAA, 0x41, 0x37, 0x6F, 0xF4, 0x82,
+ 0x65, 0x5F, 0x5D, 0xAE, 0x4D, 0x92, 0xD9, 0x03, 0xCC, 0x71, 0xA7, 0x6D, 0x68, 0x46, 0x87, 0xA0,
+ 0x79, 0x28, 0x9C, 0x4A, 0x39, 0x7F, 0x5E, 0xA2, 0xD5, 0xB4, 0x8B, 0x35, 0x07, 0x49, 0x66, 0x47,
+ 0x08, 0xFB, 0xFF, 0xE4, 0x44, 0x06, 0x3B, 0x7D, 0x99, 0xED, 0xE6, 0x9D, 0xDD, 0x9B, 0x86, 0x27,
+ 0x4D, 0x3A, 0x46, 0x42, 0xDA, 0xEC, 0xCD, 0xEA, 0x1E, 0x4F, 0xDA, 0x5F, 0x5F, 0x0E, 0x0C, 0xCF,
+ 0x65, 0x64, 0x34, 0x29, 0x4E, 0x14, 0x4B, 0x8A, 0x9A, 0x2C, 0xF6, 0x80, 0xBC, 0x4B, 0xAD, 0xB9,
+ 0x24, 0xC3, 0x56, 0x2E, 0x5E, 0x3D, 0xBD, 0xE0, 0x48, 0x96, 0x30, 0x01, 0xD7, 0x4A, 0xEA, 0x0B,
+ 0xCD, 0xF2, 0xFA, 0x99, 0x67, 0xA3, 0x98, 0x01, 0xD5, 0x19, 0x0D, 0xD5, 0x6E, 0xB3, 0x18, 0x05,
+ 0x62, 0x5C, 0x75, 0xB3, 0xC2, 0x60, 0xCF, 0xF5, 0x22, 0x42, 0x32, 0x73, 0x99, 0x1D, 0x31, 0x94,
+ 0xE6, 0x37, 0xC8, 0x74, 0x41, 0xF1, 0xBD, 0x46, 0xBA, 0x0B, 0x2A, 0xA7, 0x4A, 0x28, 0xB8, 0x25,
+ 0x48, 0x99, 0xEF, 0xE1, 0xE7, 0x4D, 0xEB, 0x53, 0xBA, 0x76, 0xA2, 0x15, 0x1B, 0xFE, 0x80, 0x6F,
+ 0x66, 0x81, 0x15, 0x99, 0x6B, 0x1C, 0x12, 0xB6, 0x61, 0x52, 0xCD, 0xBA, 0x47, 0x79, 0x0D, 0x9A,
+ 0xEE, 0xA9, 0x3E, 0xFB, 0xBD, 0x56, 0xA7, 0xBC, 0x41, 0xF1, 0x17, 0x00, 0xC5, 0x0E, 0x58, 0xA7,
+ 0x71, 0x42, 0x7D, 0x4A, 0xAF, 0x3C, 0x8E, 0xA6, 0x77, 0x6F, 0x35, 0xEC, 0x92, 0x8A, 0xC9, 0xCC,
+ 0xB0, 0x58, 0x74, 0xCE, 0xD3, 0xBB, 0xA0, 0xC1, 0xCD, 0x12, 0xF2, 0x81, 0x1C, 0xA4, 0x26, 0x7C,
+ 0x92, 0x8A, 0x27, 0x19, 0x3C, 0x44, 0x2A, 0x7D, 0x0E, 0xD3, 0xEA, 0x15, 0x3A, 0xF9, 0x4B, 0xBF,
+ 0x99, 0x8A, 0x7F, 0xAB, 0x13, 0x24, 0x65, 0x46, 0x94, 0x29, 0xBD, 0xB7, 0x2A, 0xEE, 0x65, 0xEF,
+ 0x02, 0x34, 0x20, 0xF4, 0xD2, 0xAF, 0xC4, 0x10, 0x93, 0x05, 0xD5, 0x82, 0x71, 0x7C, 0xF8, 0x9D,
+ 0x43, 0x72, 0x09, 0xBB, 0x8C, 0xC3, 0x60, 0x21, 0x40, 0xCB, 0x97, 0xA3, 0x47, 0xE1, 0xDF, 0x18,
+ 0x5E, 0x22, 0x2F, 0x95, 0x49, 0x3F, 0x89, 0x50, 0xFD, 0x08, 0x3D, 0xC2, 0xE2, 0x5D, 0x5A, 0xA3,
+ 0xF2, 0x09, 0x4F, 0x0C, 0x55, 0x38, 0x69, 0xF8, 0x39, 0xC3, 0x94, 0xF7, 0x55, 0x71, 0xA9, 0xC7,
+ 0x0F, 0x2C, 0x8E, 0x3C, 0x70, 0x86, 0x57, 0x6F, 0xCF, 0x5D, 0xE9, 0x4B, 0x4F, 0x80, 0x7E, 0x15,
+ 0x42, 0x43, 0x7B, 0xEC, 0xCD, 0x4E, 0x92, 0x8D, 0x5C, 0x89, 0xD2, 0x08, 0x5A, 0x32, 0x0F, 0x6E,
+ 0x0D, 0x09, 0x29, 0x02, 0x6F, 0xA0, 0x2E, 0x8E, 0x5C, 0x10, 0x16, 0x1E, 0x82, 0xDF, 0xD3, 0xCD,
+ 0xB5, 0x93, 0xD6, 0x21, 0x7B, 0x96, 0xC5, 0xFC, 0x79, 0x21, 0x88, 0x99, 0xC9, 0x3C, 0x75, 0x98,
+ 0x13, 0x67, 0x62, 0xFD, 0x70, 0xB0, 0x58, 0xDA, 0xCF, 0xDC, 0x9E, 0x92, 0x5F, 0x84, 0x3B, 0x0E,
+ 0xD8, 0xE0, 0xCF, 0xF3, 0x90, 0x9E, 0xFC, 0x40, 0xC7, 0x58, 0x2F, 0x11, 0x55, 0x9D, 0x7A, 0xE9,
+ 0x9D, 0x5C, 0xD7, 0xDF, 0xEF, 0xC5, 0x87, 0x7E, 0xC5, 0x14, 0xA7, 0xCE, 0xE6, 0xDB, 0x83, 0xD4,
+ 0x3A, 0xF7, 0x86, 0xD0, 0xE6, 0x2B, 0xFF, 0x8B, 0x80, 0xF8, 0xD6, 0xFE, 0x55, 0x82, 0xD7, 0x5B,
+ 0xEB, 0x29, 0x9C, 0x1D, 0xCD, 0x69, 0x1D, 0xF2, 0xB5, 0x44, 0x09, 0xAD, 0x1D, 0x40, 0xDD, 0xC1,
+ 0xFB, 0xDF, 0x79, 0xCA, 0xA4, 0x61, 0xAC, 0x39, 0x80, 0x66, 0xB8, 0x37, 0x91, 0xF6, 0x23, 0xEB,
+ 0x82, 0x49, 0x05, 0x41, 0x72, 0x98, 0xA6, 0x1C, 0x21, 0xB1, 0x64, 0x90, 0xDC, 0x68, 0x00, 0x2E,
+ 0x61, 0x2A, 0x80, 0x91, 0xEB, 0xCA, 0x04, 0x3D, 0x8E, 0x70, 0x21, 0x60, 0x1E, 0x11, 0x69, 0x4A,
+ 0x3B, 0x09, 0x84, 0x90, 0x98, 0x78, 0xF0, 0x9D, 0x5A, 0x92, 0x71, 0xC3, 0xB7, 0x4B, 0x42, 0x98,
+ 0x8E, 0xB6, 0x2B, 0x39, 0x59, 0x5F, 0xC1, 0x04, 0xC6, 0x8F, 0x6B, 0x33, 0xF7, 0x9E, 0x0B, 0x32,
+ 0x35, 0x60, 0x57, 0x23, 0xA1, 0xCB, 0x73, 0x82, 0xEA, 0x05, 0x3D, 0xDC, 0xF5, 0x36, 0x1B, 0x5E,
+ 0x18, 0x1F, 0x37, 0x14, 0xD7, 0x06, 0xAE, 0xDD, 0x46, 0x15, 0x82, 0xA2, 0x9C, 0xAA, 0x41, 0xFE,
+ 0x28, 0xB8, 0x3E, 0x2A, 0x7D, 0x78, 0xB8, 0x27, 0xE7, 0x65, 0x52, 0x7D, 0x93, 0x9F, 0x13, 0x9A,
+ 0x22, 0xF1, 0xF5, 0xB3, 0x2A, 0x37, 0xB6, 0x81, 0xF7, 0x5D, 0x4C, 0xA3, 0x65, 0x28, 0x13, 0x9E,
+ 0x41, 0xD8, 0xC4, 0xA8, 0x10, 0xD5, 0x5D, 0xB0, 0xBA, 0xE5, 0xDF, 0xF3, 0xFF, 0x49, 0xD1, 0xED,
+ 0x9D, 0x9E, 0xFA, 0x19, 0xF7, 0x41, 0xDB, 0xC1, 0xBE, 0x8E, 0x72, 0xAD, 0xB2, 0xD5, 0x7A, 0x93,
+ 0x6F, 0xF7, 0x25, 0xB9, 0x62, 0xB5, 0xA9, 0x3B, 0x79, 0xF6, 0xA8, 0x56, 0x4A, 0x8F, 0x98, 0x9E,
+ 0xC7, 0x4F, 0x42, 0x49, 0xB3, 0x75, 0xFA, 0x73, 0xDD, 0x37, 0xCA, 0xCE, 0xEA, 0x5E, 0xF0, 0x84,
+ 0x88, 0x6F, 0x54, 0x54, 0xA5, 0xA0, 0x1D, 0xF9, 0xE7, 0x4E, 0xCB, 0xD6, 0x0A, 0xB4, 0x84, 0xBF,
+ 0xD0, 0x2E, 0x2C, 0xF9, 0x12, 0x33, 0x28, 0x91, 0x40, 0x3E, 0xC9, 0x18, 0x9E, 0x84, 0x76, 0xDB,
+ 0xEB, 0x21, 0x62, 0x35, 0xAE, 0x98, 0x20, 0x97, 0x2B, 0x8D, 0x6B, 0x86, 0x73, 0x91, 0x00, 0x0C,
+ 0xA0, 0xF1, 0xAB, 0xB7, 0x65, 0x94, 0x7A, 0x80, 0x09, 0x28, 0x90, 0x0B, 0xAF, 0x1C, 0x72, 0xCD,
+ 0x93, 0x7C, 0xDA, 0xC7, 0xE0, 0x85, 0x72, 0x3F, 0x0A, 0xAA, 0x1E, 0xE7, 0xBF, 0xEA, 0x84, 0xE1,
+ 0xF9, 0xB8, 0x2B, 0x41, 0x4E, 0x30, 0x23, 0x99, 0x47, 0xE4, 0x6C, 0x45, 0x86, 0x51, 0xB2, 0xB1,
+ 0x2A, 0x11, 0x1B, 0x3E, 0xD1, 0x5A, 0xC4, 0x6C, 0xEF, 0x37, 0xBC, 0xAE, 0x10, 0x0C, 0x28, 0xB0,
+ 0x14, 0x6B, 0xB7, 0x34, 0x12, 0x21, 0x12, 0x5D, 0xFC, 0x19, 0x80, 0x72, 0x0B, 0xF3, 0x27, 0x8B,
+ 0x3F, 0x14, 0x7B, 0xD5, 0x66, 0xF2, 0x0F, 0xEF, 0x2E, 0xC6, 0x87, 0x49, 0x61, 0xD1, 0xE6, 0xA5,
+ 0x00, 0xF9, 0x1A, 0x11, 0xB2, 0x3B, 0xAC, 0x77, 0xBF, 0xFB, 0x6B, 0xB1, 0x9C, 0x25, 0x0D, 0x68,
+ 0x2C, 0x2C, 0xA8, 0xE8, 0x67, 0xE7, 0xAF, 0x32, 0x03, 0x6C, 0xAB, 0xF2, 0x27, 0x55, 0xD6, 0xCA,
+ 0x36, 0xC4, 0x2A, 0xD7, 0x74, 0x7F, 0xD5, 0xE5, 0x4E, 0x2F, 0x97, 0xA8, 0x21, 0x71, 0xE0, 0xD7,
+ 0x96, 0xD3, 0x14, 0xA2, 0x3D, 0x6C, 0xC0, 0x86, 0x17, 0x80, 0xA0, 0x9B, 0x96, 0x3F, 0x42, 0x45,
+ 0xCF, 0x34, 0x24, 0x9C, 0xEF, 0x8A, 0xA2, 0x33, 0xB7, 0xEB, 0xF7, 0xB1, 0xE1, 0xE9, 0x9F, 0xDB,
+ 0xA9, 0x80, 0xD0, 0xA8, 0xBC, 0x6A, 0x49, 0x86, 0x69, 0xAF, 0x21, 0x82, 0x9B, 0xF1, 0x90, 0x12,
+ 0x92, 0x7C, 0xCE, 0x56, 0xB7, 0x31, 0xFF, 0x68, 0xE1, 0x5D, 0x54, 0x17, 0xBC, 0x06, 0x46, 0x56,
+ 0xE3, 0x4A, 0x36, 0xAB, 0x7D, 0xBC, 0xE8, 0x34, 0x32, 0x79, 0xEB, 0x96, 0xFC, 0xA5, 0x17, 0x72,
+ 0x50, 0x63, 0xCB, 0x6C, 0x4D, 0x0D, 0xBD, 0xEC, 0x78, 0xC7, 0x73, 0x97, 0x7F, 0xA6, 0xF5, 0xCE,
+ 0xFC, 0xC7, 0x28, 0x59, 0x62, 0xAF, 0xCC, 0x9F, 0xFB, 0x4F, 0x8D, 0xBE, 0xC6, 0xEF, 0xCF, 0x92,
+ 0xDE, 0x56, 0x06, 0xF0, 0xB6, 0xEE, 0x7F, 0xFE, 0x90, 0x59, 0xFF, 0xF1, 0xB2, 0x7A, 0x67, 0xA9,
+ 0x16, 0x0B, 0xB9, 0xDB, 0xF8, 0x5B, 0xAB, 0x6C, 0xD0, 0x4F, 0x6A, 0xB1, 0x42, 0x39, 0x2D, 0x71,
+ 0x31, 0x30, 0x83, 0xC4, 0x3D, 0x5D, 0xB7, 0x6A, 0xE5, 0xE0, 0x1A, 0x07, 0xC8, 0xA1, 0xCC, 0x5C,
+ 0x8B, 0x0E, 0xDA, 0xBA, 0xC5, 0x0E, 0x1D, 0x6D, 0x8C, 0x25, 0x56, 0xAA, 0xA2, 0xC3, 0x1C, 0xB1,
+ 0xDE, 0x5E, 0xAA, 0xCA, 0x53, 0xF8, 0x78, 0x69, 0x51, 0x69, 0x03, 0xA4, 0x0F, 0xB7, 0xA7, 0xAA,
+ 0xB6, 0x44, 0x59, 0x9F, 0xB8, 0x45, 0x48, 0x19, 0x5F, 0x29, 0x64, 0x66, 0xA7, 0x7B, 0x7F, 0x79,
+ 0xF8, 0x9D, 0x15, 0x48, 0x34, 0x57, 0xA1, 0x25, 0x27, 0xCE, 0xBF, 0xD1, 0xC8, 0x5E, 0x96, 0xBF,
+ 0xC9, 0xD2, 0xC7, 0x08, 0x75, 0xDB, 0x8D, 0x55, 0x26, 0x92, 0x2C, 0xB2, 0x87, 0xB1, 0x15, 0x37,
+ 0x22, 0x9B, 0x61, 0xBC, 0xA8, 0xC7, 0x7E, 0xC3, 0x98, 0x89, 0xBC, 0x44, 0x6B, 0x13, 0x93, 0x30,
+ 0xCD, 0x5B, 0x35, 0xB4, 0x9F, 0x5C, 0xB5, 0x2E, 0xB1, 0x23, 0x20, 0xA8, 0xF3, 0xA3, 0x5A, 0x01,
+ 0x29, 0x24, 0x54, 0x20, 0xEF, 0x27, 0xCD, 0xF3, 0x56, 0xE0, 0x6B, 0x02, 0x23, 0x0A, 0xD9, 0x6A,
+ 0xA6, 0x23, 0xE1, 0xC3, 0x96, 0xEE, 0x06, 0x11, 0x53, 0x9E, 0xD6, 0x80, 0xC1, 0x68, 0x15, 0xA4,
+ 0x24, 0x8F, 0xBF, 0xB2, 0x49, 0xC1, 0x2E, 0xE2, 0x6B, 0xD2, 0x48, 0x45, 0x3C, 0xA6, 0xF8, 0x6C,
+ 0xC0, 0x55, 0x51, 0xC4, 0xAC, 0x52, 0x8D, 0x44, 0xEF, 0xBC, 0x04, 0x05, 0x69, 0x5C, 0x87, 0x99,
+ 0x0C, 0x27, 0xFB, 0x02, 0x6E, 0xD1, 0xF7, 0x5E, 0x07, 0x11, 0x26, 0x5A, 0x59, 0x5A, 0xF8, 0x54,
+ 0x12, 0x88, 0x20, 0xBB, 0x38, 0x92, 0x49, 0xF0, 0xE5, 0x82, 0xA3, 0xF6, 0xEE, 0xBD, 0xD7, 0xCC,
+ 0x58, 0xDC, 0x3B, 0x8A, 0x13, 0xE8, 0x5F, 0x58, 0x0C, 0x12, 0x64, 0x3C, 0xAF, 0x92, 0xC0, 0xC9,
+ 0x11, 0xE9, 0xC1, 0xB8, 0xE7, 0xFA, 0x09, 0xAE, 0x61, 0xA3, 0x70, 0x4C, 0x07, 0x45, 0x7C, 0x61,
+ 0x82, 0x1B, 0x64, 0x4C, 0x0F, 0x7D, 0xC2, 0xC5, 0xD9, 0x92, 0x00, 0x35, 0xCC, 0x34, 0x07, 0xBA,
+ 0xDD, 0x52, 0xE3, 0x67, 0x76, 0xC6, 0x8B, 0xD5, 0x51, 0xE7, 0xB3, 0x57, 0x7D, 0xF6, 0xA3, 0x82,
+ 0xEA, 0x7D, 0x88, 0x09, 0x67, 0x49, 0x2B, 0x37, 0x04, 0x1E, 0xBF, 0x83, 0x76, 0xBA, 0x7F, 0xB4,
+ 0xC1, 0x8F, 0xCD, 0xD3, 0x04, 0xD2, 0x89, 0x5F, 0x0E, 0xA7, 0x43, 0x4F, 0x8A, 0x4A, 0x98, 0x48,
+ 0x74, 0x83, 0x0B, 0x2E, 0x6E, 0xC4, 0xAF, 0x29, 0x38, 0xBA, 0xD1, 0x67, 0xEA, 0x96, 0x10, 0x35,
+ 0x69, 0xFF, 0xD2, 0x43, 0x00, 0x2E, 0x9D, 0x60, 0x08, 0x04, 0xDF, 0xFB, 0xCD, 0x6C, 0x98, 0xCE,
+ 0x73, 0x9A, 0xF4, 0x46, 0x23, 0x22, 0x58, 0x0C, 0x1F, 0xE1, 0x5A, 0x43, 0x76, 0x18, 0x81, 0xE3,
+ 0xF4, 0xBE, 0x95, 0xBF, 0x61, 0x88, 0x16, 0xF4, 0x7B, 0x01, 0xEB, 0xD4, 0x85, 0xB9, 0xC2, 0x0C,
+ 0x22, 0x02, 0x27, 0x8D, 0xB5, 0x7F, 0xC8, 0xA9, 0xAA, 0x8A, 0xF7, 0x91, 0x7A, 0x4A, 0x20, 0x37,
+ 0xB7, 0xBE, 0x15, 0x6E, 0x48, 0x2C, 0x50, 0xE3, 0xAE, 0x2B, 0xAE, 0x1E, 0x5C, 0x59, 0x9A, 0x36,
+ 0x46, 0x85, 0x04, 0xE8, 0x51, 0xED, 0x1F, 0xB0, 0x38, 0xE3, 0xC7, 0x5D, 0x9A, 0xD1, 0x07, 0x85,
+ 0xED, 0xDC, 0x3C, 0x99, 0x35, 0x03, 0x57, 0x85, 0xE2, 0x83, 0xFB, 0x06, 0x81, 0x08, 0xDA, 0xF2,
+ 0xFA, 0xF4, 0x9E, 0x5F, 0x2F, 0x82, 0xC2, 0xBA, 0xE3, 0x04, 0x42, 0x59, 0x4B, 0xBD, 0xEB, 0xFD,
+ 0x8F, 0x5D, 0x34, 0x37, 0x86, 0x06, 0x6B, 0xCC, 0x8C, 0x48, 0x7C, 0x14, 0xE9, 0x48, 0xF5, 0x28,
+ 0x51, 0xF3, 0x7E, 0xC9, 0xC8, 0x73, 0x88, 0x8B, 0x03, 0xAD, 0xEA, 0x37, 0x3F, 0x02, 0x95, 0xB8,
+ 0x6A, 0x28, 0xFC, 0x42, 0xD9, 0xAD, 0xFC, 0x4C, 0xE8, 0xEA, 0xDC, 0x4B, 0xD3, 0x9C, 0x74, 0x09,
+ 0x44, 0x74, 0x81, 0xB6, 0x36, 0x96, 0x07, 0xFB, 0x48, 0xF5, 0xBA, 0x21, 0xA5, 0xD4, 0xCA, 0x48,
+ 0x1E, 0x63, 0xF4, 0x8C, 0x16, 0x4C, 0xDF, 0xC2, 0xAA, 0x11, 0x02, 0xCF, 0xE8, 0x28, 0xEF, 0xB9,
+ 0x57, 0x70, 0x6C, 0x2C, 0x43, 0x18, 0x6D, 0xBD, 0x2D, 0xF4, 0x20, 0x54, 0x2A, 0xF3, 0xAE, 0x57,
+ 0x46, 0xA4, 0x0E, 0xC8, 0x18, 0xB3, 0x37, 0x6E, 0xFF, 0x99, 0x6A, 0x26, 0xF8, 0x7E, 0xCF, 0x8B,
+ 0xDB, 0x43, 0xF3, 0x10, 0x30, 0xA7, 0x27, 0x96, 0x07, 0x8F, 0x50, 0xE0, 0x45, 0x41, 0x16, 0xA6,
+ 0xC1, 0x1B, 0xCB, 0x97, 0x00, 0x81, 0x9D, 0x3A, 0x1A, 0x1E, 0xA0, 0x11, 0xFA, 0xBC, 0x89, 0xF5,
+ 0x07, 0x66, 0x93, 0x4E, 0xC4, 0x90, 0xF7, 0xA1, 0x65, 0x00, 0xDE, 0x39, 0x9A, 0xED, 0xCC, 0xEA,
+ 0x70, 0x57, 0x83, 0x62, 0x68, 0xE0, 0x9C, 0x0A, 0xC5, 0x2F, 0x6E, 0x75, 0xB9, 0x93, 0x15, 0x62,
+ 0xAC, 0x7C, 0x8B, 0x23, 0x32, 0xF4, 0xC9, 0x97, 0xBA, 0x7D, 0x7D, 0x9D, 0x19, 0x13, 0x4B, 0x6E,
+ 0xEF, 0xDE, 0x2B, 0x9B, 0x30, 0x9B, 0x30, 0xA8, 0x22, 0xBC, 0x7B, 0x63, 0xC8, 0x08, 0x84, 0xA6,
+ 0x66, 0xE0, 0x87, 0x0C, 0x4A, 0x1B, 0xC3, 0xE2, 0xE4, 0x3B, 0x45, 0x21, 0x45, 0x36, 0x05, 0x98,
+ 0x41, 0xE1, 0x03, 0x82, 0x95, 0x69, 0x0C, 0x6D, 0x4A, 0x13, 0x94, 0x15, 0x66, 0x9C, 0x2F, 0xA5,
+ 0x93, 0x3F, 0x59, 0xE0, 0x86, 0xED, 0x13, 0xD5, 0x9A, 0x0A, 0xEB, 0x0C, 0x58, 0xD1, 0xBB, 0x9C,
+ 0xD9, 0x16, 0x3C, 0xC7, 0x47, 0x7A, 0x2B, 0x62, 0xC5, 0x29, 0x08, 0x03, 0xC6, 0xCE, 0x7B, 0xAB,
+ 0x9B, 0x96, 0x69, 0x42, 0x9A, 0x27, 0x23, 0x0E, 0xAC, 0x69, 0xDA, 0x84, 0xD3, 0xCC, 0xFF, 0x55,
+ 0x58, 0x30, 0x45, 0xFD, 0xBE, 0xA2, 0x25, 0xE1, 0x66, 0xF9, 0x70, 0xAE, 0x1E, 0xC3, 0x3E, 0xC6,
+ 0xF8, 0xF2, 0x0D, 0xA6, 0x49, 0x1F, 0x73, 0x82, 0xBE, 0x74, 0x8C, 0x3B, 0xD7, 0xF1, 0xDA, 0x94,
+ 0x41, 0x20, 0xD4, 0x45, 0xD8, 0xB4, 0x44, 0x97, 0x85, 0x12, 0xE9, 0xB4, 0x4A, 0xDF, 0xD4, 0xED,
+ 0xA5, 0x7D, 0xCD, 0x15, 0x08, 0xD2, 0x7C, 0x46, 0xF4, 0x34, 0x0C, 0x0C, 0x56, 0x4A, 0xFA, 0xDB,
+ 0x8B, 0xC2, 0xB3, 0x0F, 0xB4, 0xEB, 0x26, 0xB6, 0xA7, 0x0A, 0x0C, 0xB7, 0x19, 0x0A, 0x2C, 0x27,
+ 0xC9, 0x1B, 0x83, 0x4B, 0x32, 0xAE, 0xBE, 0x11, 0xA3, 0xBC, 0x3D, 0x94, 0x2B, 0xC8, 0xCB, 0x5D,
+ 0x1F, 0xA6, 0x7C, 0xB6, 0x4C, 0x5E, 0xCF, 0xA4, 0x51, 0x90, 0xDB, 0xE2, 0xBA, 0x4D, 0x14, 0x9D,
+ 0x22, 0x1E, 0x82, 0x2E, 0x28, 0xB9, 0x94, 0x83, 0x46, 0x63, 0xD6, 0xEA, 0x14, 0x03, 0xDE, 0x74,
+ 0x09, 0xD4, 0x21, 0x07, 0xFA, 0xEB, 0x36, 0xB5, 0x76, 0x7D, 0x98, 0xBC, 0x3A, 0x9E, 0xD4, 0xB3,
+ 0x24, 0x35, 0x87, 0x0C, 0x70, 0x09, 0x7C, 0xE4, 0x70, 0x46, 0x6C, 0x8C, 0x19, 0xD0, 0x42, 0xE9,
+ 0x24, 0x2F, 0xCA, 0x16, 0xAD, 0x21, 0xD1, 0x16, 0xDF, 0x01, 0xEC, 0x23, 0xCA, 0xE3, 0x81, 0xD2,
+ 0x53, 0x20, 0x7E, 0xA1, 0x99, 0x8E, 0x88, 0x5D, 0x73, 0xF8, 0xD9, 0x0E, 0x37, 0xB4, 0xF3, 0xE9,
+ 0x66, 0x7B, 0x2D, 0xA0, 0x5B, 0x4B, 0x28, 0xE5, 0xE3, 0x6C, 0xA2, 0x82, 0x6C, 0xA9, 0xE7, 0x1C,
+ 0xD3, 0x33, 0x2C, 0xB4, 0x7D, 0x95, 0xEA, 0x9F, 0x20, 0xEF, 0x02, 0x38, 0x26, 0x3C, 0x5F, 0x39,
+ 0xBB, 0xFA, 0x75, 0x10, 0xBE, 0x00, 0x1A, 0x4B, 0xE8, 0xBC, 0x1B, 0xCE, 0x02, 0x59, 0x97, 0x36,
+ 0xD9, 0xE9, 0x03, 0x2B, 0x1A, 0x54, 0x35, 0x31, 0x9E, 0x59, 0xDE, 0x46, 0x56, 0x5D, 0xF6, 0xB5,
+ 0x91, 0xBC, 0x52, 0xB6, 0xB5, 0x9A, 0xF6, 0x8B, 0x5B, 0xE4, 0x7D, 0x4F, 0xD6, 0x74, 0x2A, 0x7D,
+ 0xC3, 0x85, 0x50, 0xF4, 0xCD, 0x3A, 0x81, 0x3C, 0x2C, 0xA5, 0xF5, 0xAF, 0xE2, 0xA9, 0x9F, 0x97,
+ 0xE5, 0x7B, 0x67, 0x64, 0x46, 0xD4, 0x7C, 0x1A, 0x41, 0xD4, 0x2D, 0x7C, 0xE3, 0xD9, 0xFA, 0x2A,
+ 0xDE, 0x83, 0x17, 0xEC, 0x78, 0x02, 0x7D, 0xAF, 0x4A, 0x06, 0x53, 0xE3, 0x44, 0x0B, 0x06, 0xEC,
+ 0xD4, 0xA7, 0xA5, 0x87, 0x09, 0x23, 0x44, 0x76, 0x3D, 0xD4, 0xA5, 0xEF, 0x5C, 0x75, 0x3A, 0xF7,
+ 0x99, 0xC8, 0x21, 0x6A, 0xFB, 0xBF, 0x0D, 0x08, 0xF0, 0xEE, 0xD6, 0x7E, 0xF8, 0x67, 0x02, 0x87,
+ 0xCA, 0x94, 0x27, 0x4D, 0x0C, 0x5F, 0xA1, 0x94, 0xC9, 0x1F, 0xE1, 0x4B, 0x93, 0x2D, 0x40, 0xE0,
+ 0x25, 0x5A, 0xDB, 0x28, 0xBE, 0x7F, 0xFD, 0x0D, 0x6D, 0x22, 0xF4, 0x31, 0xE5, 0x1C, 0x84, 0x71,
+ 0x09, 0x5F, 0x1D, 0x78, 0xE9, 0x64, 0xD9, 0xB9, 0x82, 0x7D, 0xF5, 0x9B, 0x73, 0x4F, 0x74, 0x8B,
+ 0xA1, 0xB3, 0xC2, 0x01, 0x30, 0x1E, 0x20, 0x72, 0xB9, 0xB8, 0x92, 0x1A, 0xFE, 0x34, 0xF8, 0x5F,
+ 0x69, 0xEC, 0x09, 0x41, 0x50, 0x77, 0x44, 0xF9, 0x68, 0xE4, 0xEC, 0xC7, 0xB5, 0xA3, 0x45, 0x6B,
+ 0x03, 0xC4, 0xE8, 0xA0, 0x53, 0xF2, 0x94, 0xB9, 0x49, 0xA0, 0x6D, 0x11, 0xBA, 0x1C, 0x89, 0x87,
+ 0x08, 0x72, 0xC0, 0xE3, 0x7B, 0x0C, 0x8D, 0x18, 0xDD, 0xB0, 0x3B, 0x0E, 0xC2, 0x0E, 0xBB, 0x4B,
+ 0x61, 0x22, 0x48, 0x64, 0x69, 0x54, 0xE8, 0x29, 0x94, 0x84, 0xE5, 0xD7, 0x1A, 0x5F, 0x4B, 0xBC,
+ 0xAD, 0x35, 0x82, 0xF1, 0xFD, 0x40, 0x14, 0xAE, 0xD0, 0x28, 0x0E, 0xE9, 0xEE, 0x2E, 0x88, 0xFF,
+ 0xD1, 0xC9, 0xC5, 0x36, 0x39, 0xFB, 0x9F, 0xC9, 0x85, 0x97, 0x2A, 0x58, 0x07, 0xD9, 0x6E, 0x6E,
+ 0x83, 0x09, 0x6D, 0xC6, 0x92, 0x1C, 0xBF, 0x50, 0xE3, 0xCB, 0xAD, 0x50, 0x3C, 0xDB, 0xF9, 0xE3,
+ 0x32, 0x51, 0x58, 0x20, 0xE6, 0xD8, 0xCA, 0x50, 0xF7, 0x50, 0x05, 0xAF, 0xB6, 0xF7, 0xAB, 0x3E,
+ 0x48, 0xB7, 0xA4, 0xB1, 0x52, 0x32, 0x2A, 0xD6, 0xC2, 0x78, 0x62, 0x05, 0x34, 0x96, 0x61, 0xF1,
+ 0x21, 0x14, 0x69, 0x6F, 0x10, 0x96, 0xDD, 0xE2, 0x1D, 0xEB, 0xE5, 0x4F, 0xA0, 0x67, 0xA8, 0x46,
+ 0x52, 0xBD, 0x2F, 0xA5, 0x59, 0xF8, 0xCB, 0xB2, 0x51, 0x09, 0xD3, 0x13, 0x9C, 0x37, 0xD3, 0x9B,
+ 0xD4, 0x5C, 0x8E, 0xF9, 0xF2, 0xE4, 0xBF, 0x69, 0xA2, 0xB2, 0x06, 0xC1, 0xF5, 0x65, 0xB9, 0x0A,
+ 0xC6, 0x73, 0x77, 0xEF, 0x4E, 0x50, 0x2D, 0x2C, 0xEE, 0xFF, 0xE9, 0x61, 0x8A, 0x07, 0xC9, 0x64,
+ 0x48, 0x27, 0x4B, 0xCE, 0xE1, 0x80, 0xCC, 0x14, 0x8F, 0x42, 0x92, 0x4D, 0x6F, 0x87, 0x48, 0x90,
+ 0x29, 0xF4, 0x4E, 0x72, 0x2C, 0xCC, 0x1A, 0xDD, 0x96, 0xDA, 0xFE, 0xD7, 0xCB, 0xEE, 0x6F, 0xA4,
+ 0xA0, 0xCB, 0xEE, 0x7F, 0xB3, 0x21, 0x54, 0xBA, 0x6F, 0xC9, 0x53, 0x66, 0x7B, 0x38, 0xEC, 0xF4,
+ 0x5F, 0xA0, 0x99, 0x23, 0x5F, 0x79, 0xD7, 0x08, 0xCC, 0x74, 0xDA, 0x02, 0xA1, 0xFC, 0x01, 0xF0,
+ 0xF6, 0xA9, 0x9C, 0xA5, 0x85, 0xC6, 0x7E, 0xF6, 0x0F, 0x53, 0x11, 0x91, 0x92, 0x6D, 0x60, 0xC7,
+ 0x63, 0xD5, 0x1C, 0x84, 0x7E, 0x91, 0xDA, 0x97, 0x5B, 0xD8, 0x3D, 0xBF, 0x83, 0xC3, 0x42, 0xC1,
+ 0xDB, 0xB6, 0xE3, 0xFB, 0x9F, 0x40, 0x36, 0x6E, 0xB9, 0x8F, 0x44, 0xB8, 0x73, 0x2C, 0x14, 0xBD,
+ 0x6C, 0x5E, 0x71, 0x76, 0xD2, 0xB9, 0xA2, 0x0B, 0xEC, 0xD4, 0x97, 0x9A, 0x1F, 0xCF, 0x0C, 0x3D,
+ 0x5F, 0x49, 0x24, 0x08, 0x3C, 0xEC, 0xCE, 0xA3, 0x16, 0xFC, 0x7B, 0xD9, 0x98, 0x73, 0xEF, 0x74,
+ 0x76, 0x0E, 0x51, 0x94, 0xBC, 0x18, 0x71, 0xAB, 0x43, 0xA8, 0x27, 0xA1, 0x5D, 0x69, 0x23, 0xB5,
+ 0x5C, 0xFB, 0xFB, 0xD1, 0xBE, 0x59, 0x9C, 0x35, 0x1B, 0x5D, 0x49, 0x58, 0xEB, 0x06, 0xFB, 0x0E,
+ 0xFC, 0x3B, 0x4B, 0x47, 0xF9, 0x80, 0xD2, 0x50, 0x97, 0xA1, 0xFB, 0x2F, 0x0D, 0x65, 0x7A, 0x30,
+ 0xA3, 0x33, 0x04, 0x44, 0x0B, 0x4A, 0x88, 0xEB, 0x59, 0x1A, 0xA5, 0x96, 0x8C, 0x09, 0x1E, 0x26,
+ 0x6A, 0x89, 0x74, 0x0C, 0x97, 0xDE, 0x51, 0x1C, 0x49, 0x16, 0x99, 0xDE, 0x80, 0x95, 0xDA, 0x0B,
+ 0xD6, 0x0B, 0x85, 0x83, 0x13, 0x70, 0xCC, 0x60, 0xE3, 0x24, 0xDA, 0xB1, 0xE9, 0x8E, 0x29, 0x04,
+ 0x68, 0xE7, 0x85, 0x0F, 0x78, 0x9D, 0x69, 0x9A, 0x3A, 0xFC, 0x1B, 0x34, 0x65, 0x9D, 0x0D, 0x84,
+ 0xF5, 0x21, 0x30, 0xF6, 0xDF, 0x4E, 0xC5, 0xEB, 0x8C, 0x9A, 0x5F, 0x00, 0xDE, 0x19, 0x2B, 0x1F,
+ 0x7C, 0x86, 0x7D, 0x43, 0xA2, 0x43, 0xC5, 0xA9, 0xDD, 0x84, 0x18, 0x90, 0xAB, 0x4C, 0xD3, 0x0B,
+ 0x01, 0xA6, 0xCC, 0x04, 0x24, 0xF0, 0x0C, 0x3A, 0x8B, 0x20, 0x36, 0x1C, 0xBF, 0x40, 0x5E, 0x1F,
+ 0x70, 0x7D, 0x69, 0xAA, 0xF6, 0xA8, 0x7B, 0x0F, 0x55, 0x4C, 0x63, 0xB8, 0x28, 0x8B, 0x9F, 0xB1,
+ 0xF9, 0x84, 0x20, 0x7C, 0xFD, 0x41, 0x94, 0xAA, 0x92, 0xE0, 0x4E, 0x66, 0x7B, 0x4D, 0xBF, 0x96,
+ 0xA3, 0xE9, 0x9B, 0xEC, 0xD5, 0x75, 0x8B, 0x08, 0x8A, 0x1A, 0xFF, 0x0C, 0xF3, 0x9D, 0xFC, 0x92,
+ 0x61, 0x19, 0x41, 0x5A, 0x52, 0x5E, 0xC2, 0x91, 0xFE, 0xD8, 0x8F, 0xF2, 0xD6, 0x0B, 0x73, 0x4B,
+ 0x1F, 0x63, 0x30, 0xC5, 0x8E, 0x85, 0x8C, 0xE2, 0xEA, 0xE1, 0xDC, 0xBC, 0xDA, 0xF7, 0xA1, 0xBA,
+ 0x3F, 0xCC, 0xD7, 0xAC, 0xF8, 0xAD, 0xB8, 0x53, 0x82, 0x3B, 0xD3, 0x69, 0xC1, 0xDD, 0xB7, 0xD5,
+ 0x89, 0x89, 0x50, 0xF7, 0x73, 0x56, 0xA7, 0xC5, 0x05, 0xB5, 0xEE, 0xE6, 0x4A, 0x22, 0xF8, 0x33,
+ 0xEB, 0xED, 0xF2, 0xDE, 0x73, 0x02, 0x95, 0x3C, 0x0E, 0x4E, 0x5B, 0x0B, 0xE7, 0x6C, 0xF7, 0xE1,
+ 0xF8, 0x67, 0x8A, 0xDF, 0x41, 0x3F, 0xCC, 0x5E, 0x0C, 0xD6, 0x6E, 0x96, 0xBF, 0x95, 0x71, 0x4C,
+ 0x79, 0x7C, 0x3B, 0x88, 0x46, 0x73, 0x96, 0xA2, 0xDA, 0x6C, 0x71, 0xEC, 0x54, 0x14, 0x79, 0x1E,
+ 0x47, 0xF8, 0x94, 0x63, 0x28, 0x4A, 0xFB, 0xBB, 0x82, 0x66, 0x91, 0x99, 0x0E, 0xBE, 0xBB, 0x33,
+ 0x4D, 0x55, 0xE2, 0x08, 0xCA, 0xE7, 0x52, 0x4A, 0xED, 0x64, 0xFF, 0xDD, 0xF7, 0xF9, 0xEA, 0x7D,
+ 0xD0, 0xBD, 0xB9, 0xAC, 0x62, 0x3B, 0xBC, 0xC6, 0x47, 0xEF, 0xEC, 0xA0, 0x6D, 0x7D, 0x0F, 0xD8,
+ 0xC6, 0x10, 0x90, 0x29, 0xCB, 0xF3, 0xA1, 0xC2, 0x2B, 0x1D, 0xDD, 0x43, 0x6A, 0x49, 0xCB, 0x1F,
+ 0x8C, 0x29, 0xC4, 0x4A, 0xAB, 0xCB, 0xD3, 0x89, 0xF6, 0x24, 0x73, 0xA3, 0xA0, 0x5C, 0x9E, 0xE2,
+ 0x93, 0x2C, 0x18, 0x6A, 0xA1, 0x07, 0x5A, 0x77, 0xAA, 0x26, 0x38, 0x2C, 0xF0, 0xA9, 0xFC, 0x6C,
+ 0x94, 0xBE, 0xAF, 0x20, 0xCA, 0x8B, 0xB1, 0x7B, 0x9A, 0x3A, 0xBD, 0x0B, 0xF5, 0x03, 0x73, 0x6D,
+ 0x6F, 0x15, 0xB1, 0x8F, 0x85, 0xDE, 0x24, 0x47, 0x94, 0x1B, 0x94, 0x25, 0xA5, 0x85, 0x31, 0x33,
+ 0x75, 0xA9, 0x0E, 0x16, 0x90, 0x12, 0x91, 0x72, 0x0F, 0x1E, 0x47, 0x7B, 0x42, 0xB4, 0x99, 0x9E,
+ 0xDA, 0xD8, 0xD9, 0xB4, 0x2C, 0xA4, 0x06, 0x05, 0x2F, 0x83, 0xF6, 0xE7, 0x6D, 0x7A, 0x9E, 0x40,
+ 0xCE, 0x91, 0x37, 0x6C, 0x2A, 0x90, 0x87, 0x5D, 0x3E, 0xAA, 0xDB, 0x45, 0x55, 0xEC, 0x79, 0x03,
+ 0x03, 0x22, 0x3B, 0x61, 0x73, 0xBD, 0x53, 0xF3, 0x5A, 0x9B, 0xD4, 0xB4, 0x0E, 0x2C, 0x68, 0x5F,
+ 0x5D, 0x1B, 0xCC, 0xD6, 0x11, 0x7B, 0xA0, 0x4A, 0xB6, 0xD0, 0x56, 0xD0, 0x26, 0xC1, 0xFE, 0x3B,
+ 0x05, 0x20, 0x05, 0xC0, 0xBA, 0xF4, 0xB7, 0x2B, 0x55, 0xE7, 0x69, 0x67, 0xB2, 0x7A, 0xB5, 0x59,
+ 0x78, 0xB4, 0x3E, 0x80, 0x08, 0x20, 0xD8, 0x75, 0x28, 0xF1, 0x21, 0xFE, 0xA3, 0x86, 0xD1, 0x21,
+ 0x76, 0x1F, 0xA6, 0x95, 0x60, 0xA7, 0x5E, 0xB5, 0x68, 0x25, 0xB7, 0x02, 0x56, 0xDA, 0xF8, 0x6D,
+ 0xE3, 0x79, 0x31, 0x63, 0x76, 0xC4, 0x9B, 0x16, 0x08, 0xCA, 0xA8, 0xBA, 0xA0, 0x5A, 0x9A, 0x76,
+ 0x3D, 0x09, 0x80, 0x54, 0x89, 0x50, 0xFC, 0x4F, 0x04, 0x52, 0x2C, 0xAB, 0x01, 0x3B, 0x52, 0xA7,
+ 0x7E, 0x4F, 0x0C, 0x08, 0xE2, 0x18, 0x6F, 0xC6, 0xDF, 0x77, 0x09, 0xE4, 0x21, 0x5E, 0xD7, 0xE2,
+ 0x4A, 0x15, 0x1C, 0xB5, 0xFD, 0x6F, 0x4D, 0xC6, 0xC8, 0x97, 0x26, 0x9F, 0x7C, 0x97, 0xE8, 0x05,
+ 0x4C, 0x89, 0xC3, 0xA6, 0x89, 0x38, 0x11, 0xAB, 0xEC, 0x7E, 0xF4, 0x4C, 0xE1, 0x3A, 0x37, 0x24,
+ 0x57, 0xD9, 0x93, 0xCE, 0x9E, 0xC8, 0x22, 0x78, 0xBB, 0xDB, 0x35, 0x99, 0xFB, 0x82, 0xF4, 0x56,
+ 0x3B, 0x4B, 0x72, 0xE3, 0xF1, 0x48, 0xF3, 0xFE, 0x4B, 0x08, 0xAB, 0x33, 0xF7, 0x30, 0x57, 0xB1,
+ 0x9E, 0xF0, 0xE1, 0xCD, 0x11, 0x7D, 0xD2, 0x1B, 0x33, 0xE8, 0x22, 0xF2, 0xA4, 0x90, 0xB7, 0xD1,
+ 0xFA, 0xA9, 0xB3, 0x23, 0x0F, 0x0F, 0xF4, 0x56, 0x9C, 0x15, 0x31, 0x59, 0x2C, 0x6F, 0xE4, 0xD6,
+ 0x3A, 0xB4, 0x06, 0xCF, 0x80, 0xDD, 0xAE, 0x6F, 0x9B, 0x54, 0x74, 0x31, 0x66, 0xF5, 0x1F, 0x41,
+ 0x0B, 0x4B, 0x19, 0x11, 0xA7, 0x7B, 0x58, 0x29, 0x96, 0x83, 0x44, 0x54, 0x63, 0xAF, 0x09, 0x6B,
+ 0xA4, 0xFE, 0x03, 0xCC, 0xA8, 0xCA, 0x4A, 0xDC, 0xD9, 0x95, 0x56, 0xEB, 0x2E, 0x79, 0x7C, 0xCE,
+ 0xDC, 0x14, 0x26, 0xF5, 0x94, 0x9D, 0x9D, 0xD1, 0x95, 0x09, 0x8B, 0x2E, 0x21, 0xA0, 0x96, 0xC5,
+ 0x4E, 0x09, 0xA0, 0x35, 0x92, 0xAA, 0x95, 0x3C, 0x30, 0xE7, 0xC7, 0x6A, 0x7B, 0xB1, 0x62, 0x01,
+ 0x7D, 0x62, 0x78, 0x77, 0x62, 0xE6, 0x08, 0x63, 0x77, 0x5E, 0xE1, 0x0A, 0xFD, 0xB5, 0x08, 0xE1,
+ 0xED, 0x79, 0x27, 0xD9, 0xB8, 0x1D, 0xB6, 0xBA, 0x3D, 0x6C, 0xA0, 0xB5, 0xA6, 0xE1, 0x92, 0x18,
+ 0x15, 0xC9, 0x25, 0x25, 0xF6, 0x21, 0x7A, 0x4E, 0x2E, 0x18, 0x08, 0x8D, 0x54, 0x79, 0x35, 0xED,
+ 0x76, 0x2F, 0x39, 0xB1, 0x38, 0x38, 0x9F, 0xB6, 0xF4, 0x2D, 0xBF, 0x55, 0x64, 0x3F, 0xEB, 0x49,
+ 0x17, 0x5D, 0xEC, 0x07, 0xC1, 0x08, 0x4E, 0x75, 0xE7, 0xE8, 0xF7, 0xA3, 0xB5, 0x63, 0x01, 0x27,
+ 0xCF, 0xF5, 0x39, 0xDD, 0x65, 0x38, 0x4C, 0xD4, 0xE3, 0xAA, 0xAD, 0x55, 0xD3, 0x3C, 0x6E, 0xC4,
+ 0x99, 0x09, 0x3E, 0xD1, 0xA5, 0x0B, 0xEF, 0xF2, 0x08, 0xA1, 0xBE, 0xD8, 0xE0, 0x7C, 0x58, 0xB9,
+ 0x9E, 0x2E, 0x95, 0x4A, 0xAA, 0x1D, 0xEE, 0xE3, 0x2F, 0x6A, 0xE2, 0x94, 0x70, 0xC4, 0x1C, 0x07,
+ 0xCC, 0x76, 0xE0, 0x40, 0xEA, 0x6D, 0xB4, 0x83, 0xA0, 0x6A, 0x97, 0x76, 0x84, 0x11, 0x40, 0x9F,
+ 0xCA, 0x18, 0x00, 0x6F, 0x7D, 0x07, 0xBE, 0xC9, 0xFC, 0x2D, 0xD7, 0xAF, 0x60, 0x76, 0xC9, 0xD8,
+ 0x28, 0xC2, 0xC8, 0xA8, 0xD7, 0x60, 0x90, 0x64, 0x6C, 0xED, 0xEE, 0xFD, 0x2C, 0xD1, 0x3F, 0x35,
+ 0xD4, 0xCB, 0xA0, 0x34, 0xAA, 0xB0, 0x3A, 0x91, 0x07, 0x1B, 0xD4, 0xB5, 0x33, 0xD2, 0xD3, 0x9D,
+ 0x08, 0xCD, 0x45, 0x01, 0x83, 0x04, 0xB1, 0xE7, 0x0C, 0x1A, 0x57, 0x9F, 0xBB, 0xED, 0x37, 0x46,
+ 0xB1, 0x16, 0x87, 0x3C, 0x20, 0xDE, 0x63, 0x10, 0xAF, 0x2D, 0x77, 0x71, 0x56, 0xEF, 0x7C, 0x14,
+ 0xD0, 0xE3, 0x1E, 0xFB, 0x1F, 0x77, 0x18, 0x1E, 0xA8, 0xD3, 0x40, 0xA7, 0xD7, 0x1F, 0x36, 0x7D,
+ 0x87, 0x1C, 0x42, 0xF6, 0x2F, 0x51, 0xAF, 0x69, 0x2C, 0xCF, 0x79, 0x11, 0xD1, 0x17, 0x47, 0xD3,
+ 0x44, 0x86, 0x9D, 0x2B, 0x44, 0xA3, 0x74, 0x1C, 0x83, 0x75, 0xAB, 0xD1, 0xA5, 0xFE, 0x14, 0x0A,
+ 0x41, 0x76, 0x89, 0x1B, 0x08, 0x4F, 0x29, 0x30, 0x82, 0xD1, 0xFE, 0xD6, 0x0B, 0x71, 0xCD, 0x2C,
+ 0x8E, 0x31, 0x69, 0xAF, 0xD8, 0x67, 0xA6, 0x1A, 0x8E, 0x2A, 0xD4, 0xF1, 0x83, 0xC3, 0xEC, 0x08,
+ 0x76, 0x27, 0xA3, 0xB5, 0xF6, 0x7B, 0xC2, 0x6F, 0xEA, 0xD0, 0x52, 0x6C, 0x6E, 0x2F, 0x18, 0xBB,
+ 0x23, 0x10, 0x3E, 0x7F, 0x37, 0x90, 0x89, 0x7E, 0xF4, 0xBA, 0x47, 0x09, 0xCE, 0x80, 0x34, 0x5D,
+ 0x20, 0x87, 0x1F, 0x76, 0x30, 0xBF, 0xC3, 0xFC, 0x3C, 0xB3, 0x88, 0x89, 0xC9, 0x3D, 0xA4, 0xF4,
+ 0xCE, 0x7E, 0x93, 0xA6, 0x88, 0xFA, 0xAC, 0x32, 0x64, 0x19, 0x76, 0xE7, 0xE0, 0xAE, 0x4B, 0x4F,
+ 0xC3, 0xAC, 0x82, 0xD9, 0xDB, 0x3D, 0xBE, 0x3E, 0x58, 0x4B, 0xBF, 0xD0, 0x17, 0x43, 0xEC, 0x17,
+ 0xEA, 0xFA, 0xA9, 0x6F, 0x9A, 0x33, 0xC2, 0xB9, 0xDC, 0xFF, 0x80, 0x14, 0x9D, 0xD6, 0xA1, 0x41,
+ 0x7F, 0xFE, 0x08, 0x57, 0x21, 0xD6, 0xEB, 0xED, 0xEF, 0xA2, 0xAD, 0x5D, 0x9E, 0xC5, 0x31, 0xC6,
+ 0xBE, 0x73, 0xB9, 0x7D, 0x58, 0x12, 0x28, 0x35, 0x0A, 0xB7, 0x56, 0x9A, 0x23, 0x61, 0x0B, 0x3B,
+ 0x8D, 0x20, 0x35, 0xC7, 0xBF, 0xB1, 0xCE, 0x33, 0x28, 0xEC, 0x2F, 0x71, 0x49, 0xE1, 0x90, 0x36,
+ 0x53, 0x9D, 0x19, 0xB1, 0xBB, 0xFF, 0xF4, 0x50, 0x89, 0xE8, 0x69, 0x88, 0xAF, 0xB6, 0x58, 0x46,
+ 0xDF, 0x73, 0xEC, 0x5B, 0x82, 0xA6, 0xDC, 0x18, 0x71, 0x81, 0xE3, 0x03, 0x25, 0x71, 0x0E, 0x0B,
+ 0xB5, 0x63, 0x67, 0x1A, 0xD1, 0x13, 0x0A, 0xE5, 0xFF, 0x4B, 0x97, 0xEA, 0xBB, 0x75, 0xD7, 0x31,
+ 0xCD, 0x4B, 0x06, 0xBD, 0x6E, 0xB1, 0xA1, 0xD9, 0x30, 0x52, 0x8F, 0xF4, 0x4C, 0x51, 0x16, 0x72,
+ 0x73, 0x81, 0x48, 0x88, 0x3F, 0x9B, 0x80, 0x40, 0xDD, 0xE7, 0xA4, 0x98, 0xC3, 0xB6, 0x7A, 0xF9,
+ 0x91, 0xA1, 0xB1, 0xBB, 0x1D, 0x16, 0x3D, 0x13, 0xF9, 0x7D, 0xD9, 0x31, 0xE6, 0x19, 0x83, 0xCF,
+ 0xA6, 0x59, 0xC9, 0x8F, 0xF7, 0x1E, 0xA3, 0x9C, 0x2B, 0x65, 0x9D, 0x21, 0x5B, 0x7C, 0xA4, 0x4D,
+ 0x07, 0x24, 0x99, 0xA2, 0x51, 0xDF, 0x4D, 0x5F, 0xB6, 0xB0, 0x17, 0xAA, 0xEF, 0x16, 0xAB, 0x45,
+ 0xAA, 0xD2, 0xA0, 0xBC, 0x09, 0x1B, 0x9A, 0x3C, 0x27, 0x86, 0xE0, 0xAD, 0x9E, 0xE4, 0x4D, 0x73,
+ 0x09, 0x88, 0xCC, 0x55, 0x2A, 0x8A, 0x33, 0x29, 0x84, 0xD1, 0x8D, 0xF6, 0xE6, 0xDF, 0x27, 0x70,
+ 0xA0, 0xD6, 0x5B, 0x31, 0xEE, 0x7E, 0x7A, 0x31, 0x87, 0xF2, 0xCC, 0x4C, 0xBE, 0x63, 0xC1, 0x41,
+ 0xC6, 0x39, 0xFA, 0x3B, 0x9A, 0x60, 0x05, 0x29, 0xDF, 0x91, 0x9E, 0x3B, 0x7B, 0xDB, 0x8F, 0x6E,
+ 0xFB, 0x0F, 0xF1, 0x20, 0xC7, 0x08, 0x47, 0x2A, 0x14, 0xB4, 0x7C, 0x93, 0xEB, 0x63, 0xE3, 0x03,
+ 0xC7, 0x4D, 0x9F, 0x7D, 0x29, 0x7F, 0xC3, 0x03, 0x44, 0x89, 0x22, 0x8D, 0x2D, 0xF1, 0x86, 0xCB,
+ 0x28, 0xBE, 0x39, 0xAC, 0x16, 0xBB, 0x73, 0xB2, 0x44, 0xC6, 0xA5, 0x63, 0x06, 0xE2, 0xED, 0x76,
+ 0x95, 0x73, 0x02, 0xCE, 0x6A, 0x7E, 0x55, 0x2D, 0x2A, 0x1D, 0x78, 0x30, 0x3B, 0x0A, 0xAB, 0x3A,
+ 0xDB, 0x21, 0xD8, 0x6D, 0xA4, 0xBE, 0xAD, 0x07, 0xD1, 0x08, 0xAC, 0x26, 0xBC, 0x4F, 0x50, 0x31,
+ 0xA2, 0xDA, 0x18, 0x75, 0xA2, 0xE9, 0x1D, 0x93, 0xB6, 0x34, 0x01, 0xA5, 0xE9, 0xBE, 0x94, 0x7B,
+ 0x33, 0x61, 0x7C, 0x71, 0xE3, 0x72, 0x78, 0x45, 0x3D, 0x2A, 0x7A, 0x87, 0x5B, 0x8D, 0x4E, 0xF8,
+ 0x79, 0x01, 0xF6, 0x49, 0x5B, 0x9B, 0xBD, 0xB8, 0xC8, 0xAE, 0xBD, 0xC2, 0x5D, 0x14, 0x8B, 0x51,
+ 0x4F, 0x86, 0x56, 0xB2, 0xD8, 0xF5, 0x5C, 0x0F, 0x38, 0xDC, 0x30, 0x15, 0x2B, 0x6A, 0x15, 0x98,
+ 0x08, 0x23, 0x5A, 0xEA, 0x1E, 0xCA, 0xC7, 0xAC, 0x74, 0x26, 0xD0, 0x7C, 0xC6, 0x75, 0x1A, 0x67,
+ 0x1E, 0xD3, 0xD3, 0x26, 0x9F, 0x82, 0x2E, 0x90, 0x5D, 0x50, 0xD1, 0x4F, 0x2B, 0x79, 0x5C, 0xCE,
+ 0x4A, 0x8F, 0x9F, 0xBB, 0x60, 0xD4, 0x21, 0x92, 0x63, 0x3E, 0xBC, 0x77, 0x57, 0x0E, 0xC0, 0x56,
+ 0x62, 0x6F, 0x47, 0x75, 0x88, 0xF0, 0x87, 0xA3, 0xCC, 0x1F, 0x12, 0xCC, 0xA2, 0x0B, 0x74, 0x19,
+ 0xEE, 0xD6, 0x2F, 0x5C, 0x34, 0x06, 0x50, 0x7D, 0xBB, 0xB6, 0x21, 0xDB, 0xB4, 0xB1, 0x8C, 0x88,
+ 0x42, 0x8E, 0x3B, 0xBF, 0x89, 0x5F, 0x89, 0x77, 0x5A, 0x46, 0xE4, 0x02, 0xE4, 0x48, 0xBB, 0xA9,
+ 0x3F, 0x09, 0xAA, 0x1F, 0x62, 0x98, 0xF8, 0xE6, 0xCD, 0x62, 0xCB, 0xF7, 0xD0, 0x1D, 0xA4, 0x7A,
+ 0x18, 0x0A, 0x0D, 0x44, 0x6C, 0x14, 0xDB, 0x97, 0x94, 0xCA, 0x98, 0x7F, 0x60, 0x36, 0x1E, 0x13,
+ 0x52, 0xE8, 0x7F, 0x18, 0xEE, 0x99, 0xFA, 0xCB, 0x23, 0x5D, 0xB1, 0x2B, 0xA1, 0xFE, 0xD6, 0xB0,
+ 0x77, 0x13, 0xE4, 0x55, 0xCC, 0x56, 0xFA, 0x8E, 0x29, 0x25, 0xA9, 0xDF, 0x81, 0x58, 0xEE, 0xB6,
+ 0x3B, 0xC2, 0x29, 0xB4, 0x1E, 0x72, 0xCA, 0x55, 0xD3, 0x7B, 0xA6, 0xDD, 0x48, 0x96, 0x3B, 0x76,
+ 0x3A, 0x41, 0xF3, 0x2A, 0x94, 0x13, 0xF3, 0x51, 0xC3, 0x00, 0x09, 0x4F, 0x88, 0xBA, 0x24, 0xD1,
+ 0x14, 0x12, 0x14, 0x2D, 0xC1, 0xAB, 0x3B, 0x21, 0x54, 0x8B, 0x4C, 0xDC, 0x17, 0x08, 0x1E, 0xE8,
+ 0x83, 0x4A, 0x3E, 0x25, 0x0E, 0x7B, 0xBC, 0xD5, 0xC7, 0xCA, 0x13, 0x31, 0x1B, 0xD8, 0x8F, 0xE2,
+ 0x4A, 0x23, 0x24, 0xA9, 0x69, 0xF4, 0x8E, 0x65, 0xB2, 0xEF, 0xA1, 0x83, 0xFF, 0xBF, 0x01, 0xE7,
+ 0x8B, 0xFC, 0xD1, 0x92, 0x91, 0xCF, 0x3D, 0xB7, 0x49, 0x3B, 0xF5, 0x81, 0x54, 0xB1, 0xFF, 0xB6,
+ 0xD9, 0x2C, 0x31, 0xA1, 0xC0, 0x8F, 0x56, 0x54, 0x52, 0x5B, 0x7D, 0x80, 0x61, 0x44, 0x44, 0x8C,
+ 0xC4, 0xFA, 0x8E, 0x59, 0xDE, 0xA1, 0xC5, 0xFB, 0xF7, 0x40, 0xE7, 0xD6, 0x06, 0x55, 0xC3, 0x19,
+ 0x73, 0x21, 0xFD, 0x86, 0x8C, 0x68, 0x1B, 0x37, 0x7A, 0xC9, 0xC4, 0x70, 0x07, 0x38, 0x15, 0x03,
+ 0xA7, 0x2A, 0xBD, 0x37, 0x8A, 0xD0, 0x63, 0x13, 0x66, 0xEA, 0x9D, 0x65, 0x67, 0x87, 0x78, 0xE8,
+ 0xD2, 0x7E, 0xDB, 0x90, 0xA2, 0xAC, 0x9F, 0xAC, 0x7A, 0x81, 0xF1, 0x5F, 0x4C, 0x6C, 0x53, 0x0C,
+ 0xD5, 0x9E, 0x64, 0x1D, 0xD1, 0x85, 0x5D, 0x65, 0x54, 0x9C, 0xE5, 0x20, 0xF7, 0xE5, 0x9C, 0x03,
+ 0x29, 0x71, 0x9A, 0xE4, 0xC7, 0xD1, 0x91, 0x07, 0x66, 0x60, 0x89, 0x37, 0xF9, 0x3F, 0x58, 0x7D,
+ 0x07, 0x06, 0xCC, 0xEE, 0x05, 0x49, 0xEA, 0x50, 0xD7, 0x4A, 0x76, 0x63, 0x16, 0x66, 0xE3, 0x1D,
+ 0xDC, 0xCA, 0x3B, 0x0B, 0x89, 0x4C, 0xF8, 0x04, 0xD2, 0x50, 0x62, 0x2C, 0x1B, 0x7E, 0x62, 0x8B,
+ 0x7B, 0x55, 0x68, 0x3F, 0xAC, 0xD0, 0x5E, 0xB4, 0xF8, 0x25, 0xE5, 0xEA, 0x40, 0xA4, 0x06, 0x7B,
+ 0xA3, 0xC6, 0x8B, 0xE1, 0x4A, 0x83, 0x4B, 0xCC, 0x9C, 0xDA, 0x7C, 0x9F, 0xF6, 0xE7, 0x7A, 0xC2,
+ 0xDD, 0x9E, 0x2F, 0xB4, 0x3A, 0x07, 0xBA, 0x47, 0x83, 0x43, 0x79, 0xBE, 0x69, 0x19, 0x02, 0x48,
+ 0x03, 0x22, 0x10, 0xAE, 0x99, 0x80, 0xEE, 0xB0, 0xDE, 0xBA, 0xC1, 0x51, 0x4B, 0xF4, 0x2E, 0x61,
+ 0xB0, 0xF9, 0x1B, 0x88, 0x6D, 0x92, 0x8B, 0x36, 0x30, 0x92, 0x32, 0x0A, 0xE8, 0xA5, 0x79, 0xAC,
+ 0x27, 0x18, 0xE9, 0x67, 0x4B, 0xBC, 0x12, 0xE5, 0xB3, 0x66, 0x19, 0xD8, 0xFC, 0x62, 0x55, 0xF0,
+ 0x59, 0xFB, 0x58, 0x57, 0x15, 0xB9, 0x15, 0x89, 0x32, 0xAA, 0xA1, 0x0F, 0xC7, 0xD8, 0xFB, 0xD5,
+ 0x6E, 0x94, 0xB8, 0xE3, 0xC7, 0x7B, 0x76, 0x25, 0x0D, 0xB1, 0xD7, 0x2D, 0x26, 0x5E, 0xCA, 0x88,
+ 0xA3, 0x96, 0xD8, 0x1C, 0xBC, 0x31, 0x34, 0x6A, 0xBA, 0x99, 0x64, 0x51, 0xEF, 0x4C, 0xB4, 0x6A,
+ 0x06, 0xEB, 0x4F, 0x98, 0x95, 0x56, 0x75, 0x6F, 0x74, 0x86, 0x22, 0x53, 0x9C, 0x0A, 0x1E, 0x4D,
+ 0xF0, 0xB0, 0xD5, 0x1B, 0x85, 0x8F, 0xD6, 0x37, 0xE1, 0x25, 0x66, 0x5E, 0xE9, 0x89, 0x8F, 0x51,
+ 0x51, 0x8D, 0x76, 0x99, 0xD7, 0xBC, 0x17, 0xEE, 0xF6, 0x6B, 0x3F, 0xCF, 0x56, 0x31, 0x50, 0x77,
+ 0x84, 0x1E, 0xFB, 0x4D, 0x5A, 0x35, 0xBE, 0xE3, 0xAF, 0x88, 0xC3, 0xAC, 0x22, 0xDF, 0x56, 0x58,
+ 0x34, 0x52, 0x8A, 0xCA, 0xE7, 0x9D, 0x76, 0xD4, 0xB8, 0x86, 0xFB, 0xD9, 0xBD, 0x59, 0xEC, 0x84,
+ 0x29, 0x06, 0x0E, 0x65, 0x65, 0x18, 0x50, 0x57, 0xE5, 0xCC, 0xA2, 0xBB, 0x1A, 0x85, 0xF6, 0xFD,
+ 0xBA, 0x40, 0xA8, 0x1E, 0x52, 0xAD, 0x36, 0x12, 0xC7, 0xF1, 0x9B, 0xEA, 0x50, 0xA0, 0xFA, 0x99,
+ 0x54, 0xF5, 0xD0, 0xFA, 0xDA, 0xEC, 0x70, 0xC8, 0x21, 0xA0, 0xEA, 0xEF, 0xC0, 0x51, 0x26, 0x3A,
+ 0x13, 0xD6, 0x4C, 0x95, 0xC5, 0x07, 0xA1, 0xA8, 0x3B, 0x63, 0x8A, 0x4E, 0xAE, 0xE8, 0xA4, 0x68,
+ 0x8E, 0xA3, 0x13, 0xD9, 0x13, 0xDF, 0xA2, 0xB3, 0xEF, 0x9F, 0x4E, 0x0D, 0x00, 0xB2, 0xC2, 0x40,
+ 0xBE, 0x0D, 0xD1, 0x59, 0x20, 0x1F, 0x27, 0x2D, 0x99, 0xEE, 0x1D, 0x05, 0xD7, 0x7D, 0x2A, 0xA3,
+ 0x86, 0x44, 0x54, 0x28, 0x8A, 0x31, 0x1C, 0x66, 0xFB, 0x9F, 0x68, 0xE8, 0xCA, 0xEB, 0x74, 0x9A,
+ 0xAC, 0x77, 0x2F, 0xF4, 0xCF, 0x9D, 0x48, 0xA9, 0x8F, 0xB2, 0x9F, 0x74, 0x9F, 0x75, 0xE3, 0x88,
+ 0x42, 0xB1, 0x5F, 0x7C, 0xEE, 0xED, 0x7E, 0x5A, 0xB0, 0x62, 0xCD, 0x2F, 0x95, 0x68, 0x2F, 0xF2,
+ 0x58, 0x29, 0x8A, 0x22, 0x31, 0xC8, 0x82, 0x75, 0x51, 0x9B, 0xF7, 0xE3, 0x59, 0x52, 0xD9, 0x5B,
+ 0xDE, 0x49, 0x54, 0x22, 0xD1, 0xF2, 0xF6, 0xB0, 0x0B, 0xB8, 0x4E, 0x08, 0x43, 0xF9, 0xEA, 0x98,
+ 0xB4, 0xE3, 0x10, 0xB7, 0x8B, 0x79, 0x2C, 0x86, 0xAC, 0x75, 0x80, 0x6A, 0xC2, 0x18, 0x43, 0x06,
+ 0x5E, 0xB9, 0x80, 0xA9, 0x87, 0x02, 0x9A, 0xF5, 0x57, 0x73, 0xA2, 0x68, 0x49, 0x4E, 0xEF, 0x2D,
+ 0x48, 0x7F, 0x0B, 0x0C, 0x91, 0x35, 0x8A, 0x20, 0x7F, 0xB2, 0xD8, 0x7A, 0x88, 0x70, 0xC3, 0xA7,
+ 0x37, 0xC4, 0x68, 0x21, 0x3E, 0x55, 0x91, 0x88, 0x07, 0x2C, 0x0F, 0xC6, 0xB3, 0x49, 0x7F, 0x85,
+ 0xFB, 0xFF, 0x2D, 0x7E, 0x78, 0x13, 0xB7, 0xD5, 0x69, 0x21, 0xB7, 0x7C, 0xAF, 0x20, 0x14, 0xFD,
+ 0xD9, 0x9C, 0xA8, 0xB2, 0x2F, 0xFE, 0x28, 0x8B, 0xF3, 0x66, 0xF0, 0xA5, 0xED, 0x8E, 0x1B, 0x1C,
+ 0xF8, 0x24, 0x67, 0xB7, 0xE6, 0x06, 0x33, 0xC6, 0x60, 0x28, 0x6A, 0xE6, 0xB8, 0xA1, 0xCF, 0x9B,
+ 0x15, 0x41, 0xA4, 0x7A, 0x7F, 0xAD, 0xF4, 0x8A, 0x1F, 0xE1, 0x77, 0x07, 0x51, 0x66, 0x8C, 0x6B,
+ 0x35, 0x81, 0x60, 0x66, 0x8D, 0x58, 0xA1, 0xDF, 0xAA, 0x0C, 0x3B, 0x9A, 0x70, 0x0F, 0x1F, 0x06,
+ 0x67, 0xC2, 0x0C, 0x6E, 0xD1, 0xFC, 0x93, 0x5C, 0xC7, 0x1F, 0x19, 0x59, 0x70, 0x6C, 0x5C, 0xC8,
+ 0xFA, 0x9C, 0xFB, 0xB2, 0x46, 0x98, 0x5F, 0x1F, 0x80, 0x7B, 0x8D, 0x16, 0x2D, 0x2A, 0x03, 0xF6,
+ 0x27, 0xCB, 0x11, 0xAE, 0x9D, 0xE5, 0x36, 0xDD, 0x20, 0x52, 0x53, 0xD7, 0x66, 0x22, 0x4F, 0x51,
+ 0xE1, 0x2B, 0x7E, 0xF1, 0x9A, 0xAC, 0xBC, 0x8A, 0x6D, 0x78, 0x60, 0x62, 0x20, 0xB3, 0xA2, 0x1E,
+ 0xA5, 0x68, 0x1A, 0x29, 0x45, 0x25, 0x7E, 0xF8, 0x50, 0x62, 0xED, 0x4E, 0x06, 0x44, 0x2A, 0x79,
+ 0xF4, 0x52, 0xD0, 0x4F, 0x2C, 0x2F, 0xC6, 0xFF, 0x74, 0xE2, 0x5B, 0x13, 0x4C, 0x99, 0xB5, 0x7D,
+ 0x0D, 0x01, 0x66, 0x77, 0x3C, 0x74, 0x38, 0x11, 0xFE, 0x1F, 0x31, 0xAA, 0xF4, 0xAF, 0x42, 0x7D,
+ 0xC7, 0x62, 0xA1, 0xA2, 0xBB, 0xFE, 0xE9, 0x89, 0x8F, 0x3D, 0x0B, 0xE4, 0xA0, 0x5B, 0xA1, 0x18,
+ 0x87, 0x36, 0xA0, 0x75, 0x06, 0xA8, 0x83, 0x00, 0xF3, 0x5B, 0x83, 0x3E, 0x42, 0xFA, 0x09, 0x4C,
+ 0x35, 0x27, 0xA7, 0xB0, 0x00, 0xDA, 0x8C, 0x8E, 0x1A, 0x51, 0x9B, 0x5A, 0x8F, 0x05, 0x9A, 0xBD,
+ 0xCB, 0x10, 0x12, 0x4D, 0x17, 0xE5, 0x78, 0xDF, 0xE7, 0x49, 0x5D, 0xB0, 0x78, 0x5F, 0x44, 0xE1,
+ 0xDB, 0xE9, 0x84, 0xD9, 0x90, 0xAD, 0xBE, 0x86, 0x95, 0x81, 0xC1, 0xCD, 0x1B, 0xD4, 0xCE, 0x6D,
+ 0x5E, 0xB3, 0x52, 0xB1, 0x67, 0x5E, 0xF2, 0xE4, 0xC5, 0xCB, 0x5C, 0xC6, 0x57, 0xBE, 0x1C, 0x0E,
+ 0xDE, 0x7B, 0xD3, 0xB3, 0x01, 0xDC, 0x1F, 0x11, 0x12, 0xFC, 0x62, 0x9B, 0xFD, 0xF8, 0x8C, 0xDC,
+ 0xE4, 0x35, 0x22, 0x61, 0x0E, 0xA0, 0x80, 0xF9, 0x48, 0xFC, 0x1C, 0x36, 0x2A, 0x02, 0x4A, 0xDC,
+ 0x55, 0xE2, 0x35, 0xC8, 0xB4, 0x2E, 0xED, 0x43, 0x11, 0x31, 0x6C, 0xFB, 0x77, 0x68, 0x5E, 0xC6,
+ 0x72, 0x37, 0x08, 0x5A, 0xC4, 0x98, 0x23, 0x9E, 0x0A, 0xE3, 0x82, 0x1B, 0xCA, 0xDE, 0x3F, 0xBE,
+ 0xF0, 0x74, 0x6C, 0x9E, 0x16, 0x9B, 0x41, 0xC9, 0x79, 0xB9, 0x82, 0x9D, 0x66, 0x60, 0x09, 0xBD,
+ 0x46, 0x2F, 0xDC, 0xF8, 0xC9, 0xB8, 0x0B, 0xB6, 0xEB, 0x30, 0xD1, 0xAD, 0x93, 0xB4, 0xE3, 0xD1,
+ 0xE6, 0x35, 0xE1, 0x6B, 0xC7, 0x49, 0x47, 0xAE, 0xF1, 0x7A, 0x7A, 0x2E, 0xAE, 0xF8, 0xEC, 0x5D,
+ 0x62, 0x67, 0xFD, 0x9D, 0x18, 0x74, 0xBA, 0xA6, 0xA8, 0xA8, 0x6E, 0xD8, 0xBF, 0x24, 0xCA, 0x74,
+ 0x51, 0xE1, 0x6A, 0x8B, 0xAC, 0x96, 0x43, 0xC5, 0x75, 0x60, 0xAE, 0xA9, 0xCC, 0x89, 0x06, 0xA9,
+ 0x6C, 0xEA, 0x47, 0x53, 0x60, 0x21, 0x7A, 0x38, 0xD4, 0xE4, 0x8A, 0xE6, 0x86, 0xAB, 0x36, 0x39,
+ 0x2F, 0xEA, 0x08, 0xC1, 0x32, 0xDA, 0xA2, 0xC4, 0xD5, 0xB2, 0xC0, 0x12, 0x37, 0x9E, 0xDC, 0xBA,
+ 0xC4, 0xF6, 0x8D, 0xDF, 0xA1, 0x9A, 0x3B, 0x70, 0xE9, 0x9F, 0x4E, 0xD1, 0xE1, 0x27, 0x52, 0x27,
+ 0x69, 0x57, 0xFF, 0x63, 0xF6, 0x68, 0xF5, 0xF1, 0x42, 0x31, 0xE5, 0x05, 0xD2, 0xB7, 0xB5, 0x21,
+ 0xB9, 0xCE, 0x5D, 0xD4, 0xBB, 0xFE, 0xC5, 0x09, 0x8E, 0x98, 0xAA, 0xE7, 0x9D, 0xE4, 0x92, 0x42,
+ 0x7C, 0x2F, 0xC2, 0xC8, 0x05, 0xE0, 0xF7, 0xC5, 0xD5, 0xFA, 0xC7, 0x9E, 0x75, 0x32, 0x7A, 0x7C,
+ 0x18, 0x08, 0xB8, 0x90, 0xDE, 0x09, 0xF1, 0x15, 0xA5, 0x6F, 0xFC, 0xE2, 0xAD, 0x97, 0x9A, 0x63,
+ 0x55, 0xDB, 0x2E, 0x0A, 0xFC, 0x2C, 0x3B, 0xD0, 0x47, 0xC4, 0xF1, 0x06, 0x32, 0xF0, 0x5D, 0xC9,
+ 0xC9, 0x87, 0x13, 0xC0, 0x67, 0xC4, 0x8B, 0x76, 0x80, 0x62, 0x60, 0xC9, 0x3B, 0x0C, 0x81, 0x51,
+ 0x00, 0xFD, 0xF6, 0x9B, 0xE4, 0xF9, 0xC1, 0x03, 0xBB, 0x0F, 0x5D, 0xE3, 0xAC, 0xE6, 0x1F, 0x49,
+ 0xB5, 0x3C, 0x3E, 0x60, 0xC7, 0xC5, 0xD3, 0xB8, 0xAF, 0x07, 0xDF, 0x60, 0x4B, 0x19, 0xB5, 0x90,
+ 0x33, 0x41, 0x61, 0x75, 0xDB, 0x50, 0xD4, 0xB6, 0x63, 0xFA, 0xF9, 0x83, 0x06, 0xBC, 0x4E, 0xF2,
+ 0x53, 0xF0, 0xDC, 0xB8, 0xD5, 0x9B, 0x63, 0xEE, 0xF3, 0x92, 0x68, 0xBB, 0xCB, 0xC3, 0x08, 0x7E,
+ 0x12, 0x4A, 0x8A, 0x48, 0xF9, 0xED, 0xA7, 0x6A, 0xCE, 0xDE, 0x0D, 0x7A, 0xED, 0x2E, 0xA4, 0x75,
+ 0x6C, 0x94, 0xB3, 0x0A, 0xF1, 0x3E, 0xA4, 0xE6, 0x8F, 0x34, 0x13, 0x0E, 0xC7, 0xCE, 0x6B, 0x82,
+ 0x5D, 0xD3, 0xD2, 0x79, 0x7B, 0x6F, 0xB5, 0x00, 0x8B, 0xD6, 0x47, 0x95, 0x98, 0xDD, 0x56, 0xBC,
+ 0x8C, 0x40, 0x3B, 0x5A, 0x65, 0x88, 0x9F, 0xF5, 0x6F, 0x96, 0x32, 0x40, 0x31, 0xAC, 0x3F, 0x18,
+ 0x22, 0xE2, 0xDB, 0xD1, 0xF7, 0xAD, 0x48, 0x20, 0x31, 0x8D, 0x3F, 0xD0, 0xC9, 0x88, 0x7F, 0x94,
+ 0x34, 0x69, 0xBC, 0xEE, 0xB2, 0x5B, 0x42, 0x82, 0x31, 0xBC, 0x83, 0xBD, 0x2C, 0x5A, 0x57, 0x74,
+ 0x94, 0x29, 0xC4, 0xD0, 0x18, 0x8B, 0x2C, 0xAA, 0x09, 0x14, 0x99, 0x33, 0xD0, 0xDA, 0xD8, 0xCD,
+ 0xED, 0x75, 0xBD, 0x69, 0xAA, 0x34, 0xD8, 0x4B, 0x3D, 0xC2, 0xC0, 0x69, 0x7F, 0x2F, 0x0B, 0xDE,
+ 0x23, 0xEE, 0xB1, 0x7C, 0xD8, 0x5A, 0x7C, 0x0C, 0x45, 0x89, 0x08, 0x21, 0xE4, 0x23, 0x99, 0x75,
+ 0xFC, 0x0C, 0xF1, 0x59, 0x19, 0x07, 0xA9, 0xA9, 0x5E, 0x48, 0xEB, 0xCD, 0x10, 0x61, 0xC2, 0xEB,
+ 0x60, 0x74, 0x34, 0x80, 0xC2, 0xAA, 0xEF, 0x35, 0x55, 0x19, 0x8A, 0x95, 0xE4, 0x4A, 0x88, 0x9E,
+ 0x70, 0x73, 0x17, 0xA5, 0x75, 0xB6, 0xBC, 0x5E, 0x5E, 0xAC, 0x88, 0xA8, 0x4E, 0x54, 0x71, 0x4F,
+ 0xB8, 0x84, 0xC2, 0xA3, 0xB5, 0x9D, 0x6C, 0xA2, 0x9B, 0x6C, 0x6F, 0xA6, 0xD8, 0xE6, 0x83, 0x5D,
+ 0xC3, 0x01, 0x2F, 0xB5, 0xE0, 0xFF, 0x62, 0x52, 0xD4, 0x71, 0x8D, 0x2D, 0x72, 0x57, 0xF9, 0x90,
+ 0xA7, 0x76, 0x3D, 0x47, 0x76, 0xDE, 0x7E, 0x1B, 0xFB, 0xA4, 0x44, 0x7A, 0xE1, 0xBC, 0xB9, 0x72,
+ 0x3C, 0x42, 0xC6, 0x26, 0x0F, 0x70, 0xF1, 0xA6, 0x58, 0x91, 0xB1, 0xE7, 0xA1, 0x70, 0x13, 0x75,
+ 0xFE, 0x2C, 0xC2, 0x11, 0x48, 0x19, 0x72, 0xDF, 0xD2, 0x1E, 0x5A, 0x35, 0xC9, 0x2B, 0xE6, 0x8E,
+ 0xC6, 0x10, 0x9E, 0x6F, 0x67, 0xCF, 0x40, 0xB8, 0x7D, 0x60, 0x8A, 0xD9, 0x09, 0x59, 0xFD, 0x04,
+ 0x51, 0xEB, 0xE7, 0x18, 0x8A, 0x77, 0x2C, 0x94, 0xA3, 0xA2, 0x82, 0xF2, 0x50, 0xA6, 0xD9, 0x9C,
+ 0x55, 0x65, 0x94, 0xE9, 0x67, 0xC4, 0xE1, 0x34, 0x04, 0x22, 0x3F, 0x50, 0xAB, 0x1F, 0x0B, 0x94,
+ 0xCC, 0x51, 0x35, 0x28, 0xF9, 0x88, 0xA0, 0xA0, 0xA3, 0xF1, 0x97, 0x00, 0xC2, 0x9C, 0x35, 0x01,
+ 0xC1, 0x1B, 0x01, 0x49, 0x44, 0x4C, 0x06, 0xC9, 0x35, 0xA2, 0xEA, 0x93, 0x26, 0xF0, 0xCA, 0x07,
+ 0x7E, 0x1E, 0xBB, 0xCB, 0x03, 0x27, 0x35, 0x2D, 0xF1, 0xE0, 0x15, 0x1D, 0xBE, 0xCE, 0x89, 0x3A,
+ 0x65, 0xDA, 0x5B, 0xB8, 0x3C, 0xF7, 0xF1, 0x3C, 0xDC, 0xFA, 0xAA, 0xD0, 0x43, 0x72, 0x73, 0x94,
+ 0x72, 0xD2, 0x10, 0x82, 0x32, 0x10, 0xB6, 0x05, 0x25, 0x16, 0x25, 0xD2, 0x10, 0x73, 0xFD, 0x97,
+ 0x7B, 0x7D, 0x31, 0x25, 0x89, 0x26, 0x83, 0xF8, 0x78, 0x1B, 0x32, 0xFF, 0x35, 0x19, 0x91, 0x68,
+ 0x3F, 0x1F, 0x78, 0x38, 0x83, 0xA0, 0x49, 0x63, 0x4F, 0x70, 0x04, 0xAD, 0x57, 0xBC, 0x9D, 0x6F,
+ 0xBE, 0xDA, 0x56, 0xD1, 0xFF, 0xC2, 0x25, 0xA1, 0xF5, 0x39, 0xB3, 0xA8, 0x69, 0x0A, 0xD2, 0xB1,
+ 0xA0, 0x4F, 0x16, 0xB3, 0x15, 0xF4, 0xDD, 0x59, 0x8C, 0xD3, 0x56, 0xDF, 0x11, 0x50, 0x33, 0x6D,
+ 0x15, 0xB9, 0xCC, 0x89, 0xC9, 0x81, 0xC2, 0x7A, 0xCD, 0x1F, 0x04, 0x17, 0xDB, 0x2B, 0x80, 0xFA,
+ 0xC8, 0x00, 0x94, 0xB1, 0x41, 0x42, 0xA8, 0x0F, 0x6D, 0x72, 0xCB, 0xA9, 0xBA, 0xBC, 0x19, 0x5E,
+ 0x42, 0x70, 0x94, 0x1B, 0xA4, 0x16, 0x86, 0x04, 0xF7, 0x06, 0x6E, 0xC2, 0x4A, 0xBE, 0xD5, 0x27,
+ 0x2A, 0x61, 0x1F, 0x56, 0x34, 0x31, 0x8D, 0x59, 0x57, 0x2B, 0x86, 0x01, 0xC3, 0x94, 0x62, 0x8A,
+ 0x9C, 0x18, 0xB5, 0xDD, 0x52, 0xBC, 0x85, 0xB5, 0x09, 0x25, 0xBC, 0x36, 0x05, 0x3F, 0xE4, 0xA8,
+ 0xC9, 0x4A, 0xA1, 0x7C, 0xEB, 0xC1, 0x12, 0x64, 0x05, 0xD4, 0x6A, 0x2D, 0x41, 0xBC, 0xC3, 0xF5,
+ 0x57, 0x00, 0x4A, 0xB0, 0xFF, 0xD3, 0xD2, 0x51, 0x76, 0x71, 0x0E, 0xC4, 0x78, 0x01, 0xD8, 0xC1,
+ 0xCA, 0xA4, 0x1B, 0xBB, 0xB5, 0x99, 0x50, 0xC7, 0xB9, 0xCD, 0x74, 0xAB, 0x09, 0x89, 0x07, 0x54,
+ 0x3A, 0xEA, 0x76, 0xA5, 0xA7, 0xE9, 0x96, 0x3D, 0x8A, 0xFE, 0x24, 0x46, 0x7A, 0x4F, 0x57, 0x8B,
+ 0x6D, 0x5B, 0xB2, 0x12, 0xCA, 0x09, 0x7B, 0x45, 0x4D, 0xC1, 0x03, 0x7A, 0x27, 0xFB, 0x2C, 0xE2,
+ 0x95, 0xC6, 0x17, 0x46, 0x7B, 0x48, 0xFB, 0x8F, 0x78, 0x5B, 0xC8, 0x3E, 0x54, 0x51, 0x99, 0x71,
+ 0xE3, 0xC7, 0x92, 0xED, 0x99, 0xB4, 0x8A, 0x98, 0x86, 0xA8, 0x91, 0x1D, 0x36, 0xB6, 0xB2, 0xC7,
+ 0x9C, 0xD6, 0x68, 0x4D, 0x45, 0x9B, 0x4D, 0x37, 0xB5, 0xA0, 0xCE, 0x30, 0x00, 0x13, 0x5A, 0x49,
+ 0xE4, 0x52, 0x45, 0x7D, 0x30, 0xEA, 0x74, 0xBE, 0xEE, 0x41, 0x43, 0xBC, 0xB5, 0xC9, 0x0C, 0x40,
+ 0x7F, 0x75, 0xC6, 0x57, 0x56, 0x9A, 0x90, 0xF6, 0x56, 0x35, 0x83, 0x99, 0x80, 0x08, 0x69, 0x08,
+ 0xB2, 0x59, 0x9F, 0x79, 0x51, 0x5D, 0x9A, 0xE1, 0xCA, 0x16, 0x17, 0x28, 0xFE, 0x2B, 0xD1, 0x9F,
+ 0x1B, 0x25, 0x62, 0xC0, 0x5A, 0xF6, 0x26, 0x11, 0x6E, 0xD7, 0xE1, 0xBA, 0x5C, 0xB8, 0x04, 0x7A,
+ 0x55, 0xD3, 0x16, 0x59, 0x5C, 0x37, 0x26, 0xD0, 0xB6, 0x09, 0xED, 0x57, 0x88, 0x56, 0x21, 0x5C,
+ 0x91, 0xB6, 0xEB, 0xE4, 0xC2, 0x70, 0x8D, 0x2F, 0x5A, 0x9F, 0x07, 0x5B, 0x57, 0x38, 0x9E, 0x3A,
+ 0x49, 0xDF, 0x67, 0x18, 0xA5, 0x50, 0x90, 0xDC, 0xBD, 0xA1, 0xA6, 0xE5, 0x33, 0x25, 0xD7, 0xA0,
+ 0x25, 0x71, 0x63, 0xD3, 0x8B, 0x89, 0xE2, 0xC0, 0xC5, 0xC8, 0x51, 0xF1, 0x9B, 0x23, 0xD7, 0x35,
+ 0xAC, 0x04, 0xD6, 0x8B, 0x5A, 0xDF, 0x9A, 0x9D, 0x98, 0x5E, 0x5B, 0xD0, 0x2B, 0x28, 0xDF, 0x89,
+ 0x1B, 0x85, 0xC5, 0xB2, 0xDD, 0x43, 0xEF, 0x14, 0x99, 0x74, 0x8B, 0xAB, 0x49, 0x45, 0xA7, 0x57,
+ 0xBF, 0xCD, 0x7E, 0x80, 0xDF, 0x0C, 0x1B, 0x05, 0xB2, 0x1E, 0xD0, 0xFD, 0x72, 0x3E, 0x25, 0xD2,
+ 0xE1, 0x0B, 0x1C, 0x17, 0x6C, 0x5B, 0x61, 0xC0, 0x84, 0xCD, 0xFA, 0xB6, 0x07, 0x0A, 0xBE, 0x2B,
+ 0xF7, 0x3E, 0xEA, 0x2B, 0x0B, 0x52, 0x33, 0x0A, 0x37, 0xC3, 0x48, 0x0A, 0x93, 0x9C, 0xF7, 0x52,
+ 0x45, 0x9B, 0xE5, 0x04, 0xED, 0x3B, 0x5A, 0xFF, 0x8E, 0x4A, 0xFE, 0xD5, 0x76, 0x04, 0xED, 0xA2,
+ 0xAE, 0x36, 0x6A, 0xCC, 0x62, 0x7F, 0xB2, 0xBE, 0x3A, 0x30, 0x02, 0x59, 0xF3, 0x2F, 0xDF, 0x94,
+ 0x0D, 0x03, 0x22, 0xB6, 0x65, 0xDF, 0x26, 0x8A, 0xCE, 0x9F, 0x32, 0x4B, 0x8D, 0x4E, 0x3B, 0x37,
+ 0x24, 0x00, 0x0F, 0xB7, 0xF4, 0x4B, 0x2F, 0x0B, 0xF9, 0x94, 0x14, 0x41, 0x94, 0xD0, 0x66, 0x80,
+ 0x66, 0x9F, 0x04, 0x74, 0xB8, 0x90, 0x35, 0xEE, 0xCC, 0x4B, 0xA7, 0xD4, 0x42, 0x7D, 0xD6, 0x23,
+ 0x3C, 0x2A, 0x8A, 0xB6, 0xAC, 0x19, 0x92, 0x37, 0xD9, 0x46, 0xDF, 0xE1, 0x75, 0x2D, 0x05, 0x02,
+ 0xB1, 0xCA, 0x34, 0x34, 0x1B, 0xB4, 0x67, 0x1F, 0x56, 0xBD, 0x55, 0xCD, 0xEC, 0x9E, 0x3D, 0x4E,
+ 0x83, 0x90, 0x5D, 0x66, 0xBA, 0xA6, 0x76, 0x7E, 0x2E, 0xAA, 0x92, 0xD2, 0x80, 0xC5, 0x25, 0x0D,
+ 0x91, 0xF5, 0x9B, 0x54, 0x6F, 0x05, 0xCE, 0xE3, 0x4A, 0x55, 0xCB, 0xA6, 0xDD, 0x4C, 0x91, 0x92,
+ 0xA0, 0x1C, 0x83, 0xBD, 0x28, 0x05, 0xB9, 0xFC, 0x75, 0x42, 0xEF, 0xB1, 0x7D, 0x2A, 0x17, 0x3E,
+ 0x7A, 0xB3, 0xB5, 0xCB, 0xD9, 0x43, 0x0F, 0xAD, 0x4D, 0x36, 0x70, 0x4E, 0x39, 0x3C, 0x91, 0xF6,
+ 0x05, 0xDB, 0x0A, 0x43, 0xDC, 0x5B, 0xAF, 0x4C, 0x34, 0x72, 0x9B, 0xF1, 0x2D, 0x89, 0x0F, 0x85,
+ 0x1C, 0x90, 0x8B, 0x90, 0x84, 0xCC, 0x1D, 0xD0, 0xAE, 0xF6, 0x58, 0x20, 0x38, 0xE9, 0x44, 0x16,
+ 0xB6, 0xCB, 0x90, 0x5C, 0x76, 0x91, 0xB7, 0x1B, 0x15, 0xB6, 0xEF, 0xB1, 0x31, 0xAE, 0xD0, 0x9E,
+ 0x78, 0x37, 0xBC, 0x69, 0x3B, 0x2C, 0x22, 0x89, 0x10, 0xE5, 0xBF, 0xA5, 0xAA, 0x32, 0x0F, 0x5F,
+ 0xED, 0x7A, 0x85, 0xC2, 0x25, 0x0E, 0x8C, 0x8D, 0xEB, 0x8D, 0xE7, 0x33, 0x84, 0x9B, 0x47, 0xC5,
+ 0xD6, 0x49, 0xAB, 0x1D, 0xA1, 0x0A, 0x84, 0x14, 0x1A, 0x90, 0xD8, 0x11, 0x78, 0x4A, 0x1A, 0x01,
+ 0xE2, 0x27, 0xC9, 0x49, 0x61, 0x82, 0x62, 0xA2, 0xE0, 0xE4, 0xDF, 0x99, 0xC5, 0x5A, 0x7B, 0x54,
+ 0x7B, 0x77, 0xC9, 0xF8, 0xA4, 0xB5, 0xA2, 0xA0, 0x09, 0x42, 0x9F, 0x47, 0x82, 0x6C, 0x79, 0xED,
+ 0x5F, 0x79, 0xBD, 0x0C, 0x73, 0x84, 0x88, 0x05, 0x16, 0x17, 0x08, 0x9D, 0x3C, 0xCA, 0xCB, 0x55,
+ 0xD4, 0x14, 0x16, 0xD3, 0x83, 0xAE, 0x39, 0x1D, 0x3D, 0x19, 0x51, 0x1A, 0x45, 0x32, 0x19, 0xA0,
+ 0xF0, 0xC0, 0xB0, 0x27, 0x4D, 0xC6, 0x6F, 0x75, 0x52, 0x59, 0x14, 0x50, 0xF7, 0xDF, 0x6A, 0x51,
+ 0xE5, 0xB0, 0xDC, 0xE8, 0x27, 0x2E, 0x49, 0x7A, 0x53, 0x96, 0x2C, 0x28, 0x9A, 0x65, 0x75, 0x65,
+ 0xBE, 0x35, 0x1B, 0x6D, 0x1C, 0x90, 0xCA, 0x80, 0x42, 0xBF, 0xA4, 0x45, 0xA2, 0x5C, 0x93, 0xFC,
+ 0xB5, 0x63, 0x30, 0xB2, 0xA7, 0x7B, 0x20, 0x3F, 0x0F, 0x5E, 0xE1, 0x41, 0x61, 0x79, 0xBC, 0xB1,
+ 0x07, 0x69, 0x2F, 0xA9, 0x48, 0x99, 0xEE, 0xD3, 0x46, 0xFF, 0x51, 0x54, 0x31, 0xB5, 0xC1, 0xCE,
+ 0x87, 0x20, 0xB9, 0x0F, 0x47, 0x77, 0x46, 0xB3, 0x57, 0xAD, 0x3C, 0x1E, 0x03, 0xD0, 0xA5, 0x3D,
+ 0x66, 0xB3, 0xC5, 0x28, 0x2E, 0x06, 0xF6, 0x02, 0x49, 0x9D, 0xF9, 0xF5, 0x29, 0x69, 0xF8, 0x16,
+ 0x0A, 0x2F, 0xB7, 0xCD, 0xE8, 0xDB, 0x5F, 0xA2, 0x12, 0xAB, 0x7C, 0x09, 0x24, 0x81, 0x9C, 0x04,
+ 0x27, 0x51, 0x66, 0x4D, 0xDC, 0xE5, 0x24, 0xE9, 0xE4, 0x53, 0xA9, 0x8B, 0x41, 0x25, 0x47, 0x2B,
+ 0x2B, 0xC6, 0xA0, 0x41, 0x81, 0xEB, 0xD1, 0xC6, 0xB3, 0x77, 0x97, 0x90, 0x25, 0x15, 0xFA, 0xB2,
+ 0x37, 0x9F, 0xE4, 0xE3, 0xB2, 0x11, 0xEB, 0xF2, 0x72, 0x62, 0xC6, 0x8A, 0x00, 0xF3, 0x99, 0x83,
+ 0x11, 0x26, 0x64, 0x82, 0xA6, 0xA2, 0x8B, 0xF2, 0xB0, 0xCE, 0xAE, 0x49, 0xE1, 0x16, 0xC1, 0x6F,
+ 0x81, 0x89, 0x61, 0x6F, 0x9E, 0x0A, 0x07, 0xB3, 0xDB, 0x62, 0x45, 0xEF, 0x54, 0x6C, 0x9F, 0x95,
+ 0xC5, 0x50, 0xEF, 0xD7, 0x81, 0x0B, 0x8F, 0x67, 0x15, 0xE4, 0xDF, 0xC6, 0xFB, 0xD5, 0x17, 0x8F,
+ 0x90, 0x27, 0xE5, 0x3B, 0x86, 0xF4, 0xBC, 0xF1, 0x9D, 0x1D, 0x07, 0xB1, 0x3D, 0x45, 0xE4, 0x62,
+ 0x76, 0x6B, 0xFC, 0x2C, 0xE5, 0x31, 0x7E, 0x1D, 0x66, 0x0B, 0x85, 0x27, 0x80, 0xF8, 0xCB, 0xB8,
+ 0x2A, 0xA4, 0x23, 0x4B, 0x3D, 0xB7, 0xE3, 0x10, 0x4D, 0xB8, 0xD1, 0xA9, 0x10, 0x33, 0x84, 0xF1,
+ 0x07, 0x28, 0xE0, 0x89, 0x4D, 0x9C, 0x4F, 0xA3, 0x84, 0xFA, 0x30, 0xBC, 0x38, 0x72, 0x91, 0x59,
+ 0xD5, 0x66, 0x49, 0x2E, 0x62, 0x69, 0x7A, 0x6E, 0xCB, 0x3F, 0x18, 0x9A, 0x24, 0x8A, 0x8A, 0x72,
+ 0x1E, 0x2F, 0xF5, 0xD5, 0x23, 0x5D, 0x85, 0x58, 0x22, 0x1D, 0x23, 0x44, 0x82, 0x94, 0x85, 0x66,
+ 0x07, 0x4C, 0x1C, 0x85, 0xF8, 0x1C, 0x28, 0x0A, 0x09, 0x39, 0x79, 0xFF, 0xCC, 0xF0, 0x20, 0x84,
+ 0xCA, 0x88, 0x77, 0x8F, 0xC3, 0x58, 0x56, 0xDD, 0xB9, 0x06, 0x1C, 0x0D, 0xFB, 0x9B, 0x10, 0xE1,
+ 0xDB, 0x23, 0x84, 0xF0, 0xB0, 0x76, 0xC0, 0x0C, 0xF8, 0x28, 0x13, 0xE7, 0x4E, 0xDD, 0xC3, 0x1A,
+ 0xBD, 0x9F, 0x5B, 0x47, 0xEC, 0x22, 0x01, 0x0A, 0x8E, 0xFC, 0x4A, 0x36, 0xF7, 0xC6, 0xFC, 0x33,
+ 0x1E, 0x29, 0xBB, 0x34, 0xD0, 0xA9, 0x9A, 0x57, 0x17, 0x8E, 0x02, 0x1C, 0x44, 0xB8, 0x33, 0x24,
+ 0xD6, 0x8D, 0xB6, 0x3F, 0xDB, 0x1B, 0xAD, 0xC5, 0x5A, 0x98, 0x88, 0xE6, 0x7D, 0x9C, 0x2F, 0xE7,
+ 0x0E, 0x14, 0xD3, 0xA1, 0x9A, 0x98, 0xB8, 0x54, 0xE2, 0x90, 0x97, 0x5E, 0x48, 0xDE, 0xCF, 0x3B,
+ 0x4F, 0x57, 0x92, 0x66, 0x2D, 0xB4, 0xA7, 0x71, 0x4D, 0x08, 0xB7, 0xA3, 0xF1, 0x5A, 0xAA, 0x7E,
+ 0xAD, 0xAD, 0xAC, 0xD2, 0xBD, 0x27, 0x41, 0x51, 0xC1, 0xEA, 0x4F, 0xE0, 0x0D, 0xC7, 0x3B, 0x20,
+ 0x84, 0x18, 0x7B, 0xBB, 0x78, 0xB7, 0xCB, 0x6E, 0x5B, 0x83, 0xBF, 0x59, 0x72, 0x2F, 0x74, 0x32,
+ 0xA6, 0x55, 0x81, 0x6B, 0xFA, 0xE0, 0xA7, 0x68, 0x0D, 0xB5, 0xCF, 0x02, 0xCB, 0xDD, 0xF0, 0x69,
+ 0xB1, 0x74, 0x4A, 0x53, 0x77, 0xF7, 0xD1, 0xC2, 0xCE, 0x2A, 0x59, 0xFD, 0x01, 0xBD, 0xD9, 0x50,
+ 0x3E, 0xC4, 0xE6, 0xE0, 0x0C, 0x62, 0x44, 0x64, 0xEE, 0x70, 0x9F, 0x69, 0x81, 0x0D, 0xCE, 0x42,
+ 0x87, 0x3A, 0xF2, 0x3A, 0x6B, 0x78, 0xDA, 0x42, 0x99, 0x33, 0xC9, 0xEB, 0x3B, 0x9C, 0xED, 0x3B,
+ 0xC7, 0xF2, 0x65, 0xD1, 0x32, 0xB2, 0x3F, 0x9D, 0x80, 0xEC, 0xAC, 0x7D, 0x04, 0xF1, 0xE9, 0xBA,
+ 0x52, 0x4A, 0x74, 0x70, 0x8C, 0xCF, 0xB1, 0xB9, 0x91, 0x8C, 0x4F, 0x12, 0x0D, 0xC2, 0x7A, 0x2F,
+ 0xB8, 0x86, 0xF2, 0x9B, 0x4D, 0x58, 0xE0, 0xA0, 0x2E, 0xEA, 0x82, 0x17, 0xC1, 0x7E, 0x48, 0xBE,
+ 0x56, 0xA5, 0xC7, 0xB9, 0x88, 0xF5, 0x26, 0xA6, 0xC1, 0x60, 0x83, 0xBC, 0x40, 0x7C, 0x36, 0x2B,
+ 0x32, 0x57, 0x25, 0xBE, 0x88, 0x38, 0x2B, 0x8D, 0xBE, 0xA0, 0xE0, 0x64, 0x0D, 0x06, 0x2C, 0xD5,
+ 0x88, 0x31, 0xCC, 0x79, 0x49, 0x81, 0x19, 0xE5, 0x36, 0x43, 0x3D, 0x74, 0xA3, 0x20, 0x59, 0x3C,
+ 0xFD, 0x5B, 0x5C, 0x35, 0x4D, 0xF1, 0x90, 0x26, 0x8A, 0x06, 0xB5, 0x76, 0x87, 0x1D, 0xC6, 0x7D,
+ 0x93, 0x8A, 0x35, 0x62, 0x12, 0x23, 0x7E, 0xD7, 0x33, 0x4C, 0x73, 0xEB, 0x01, 0x6D, 0xCB, 0xAF,
+ 0xE5, 0xF2, 0x5D, 0x6C, 0x48, 0x73, 0x8E, 0x78, 0xA6, 0xA1, 0x11, 0xAC, 0x91, 0xA1, 0x6D, 0x13,
+ 0xAE, 0x2B, 0xA7, 0x7B, 0x03, 0xDA, 0x16, 0x7A, 0xE3, 0x6A, 0x53, 0xF1, 0x82, 0x1F, 0xD0, 0x29,
+ 0xA6, 0x99, 0xB0, 0xC1, 0x1A, 0x28, 0xBC, 0x08, 0xC7, 0x6C, 0x3E, 0xD8, 0x3B, 0x7D, 0x31, 0x4F,
+ 0xB9, 0xCC, 0x1F, 0x8F, 0x06, 0x85, 0xDE, 0x97, 0xBD, 0x7A, 0x02, 0xA4, 0x16, 0x0E, 0x8F, 0xF2,
+ 0x61, 0xAE, 0x02, 0xA2, 0x43, 0x84, 0xE0, 0x9E, 0x1E, 0xA9, 0xDB, 0xF0, 0x7A, 0xC3, 0xA0, 0xDD,
+ 0x93, 0xE9, 0x84, 0x8D, 0xC3, 0x79, 0x9C, 0xE5, 0x68, 0xBC, 0x63, 0xB8, 0x82, 0xA0, 0x94, 0x7D,
+ 0x7F, 0x5B, 0x73, 0x13, 0x0B, 0x7A, 0x46, 0xBE, 0xEF, 0x70, 0x64, 0xB9, 0x26, 0xB0, 0x86, 0xBB,
+ 0x33, 0x8A, 0xCC, 0x81, 0x04, 0x8E, 0x62, 0x7A, 0x34, 0xFA, 0x25, 0x14, 0x0F, 0x0A, 0xD4, 0x0B,
+ 0xCF, 0xD6, 0x92, 0x05, 0x88, 0x2C, 0x2D, 0x26, 0xDF, 0x08, 0xD6, 0x19, 0x6A, 0xAB, 0x74, 0x2C,
+ 0xB0, 0x08, 0x6B, 0xAB, 0x87, 0xEA, 0x6A, 0x48, 0xB8, 0x73, 0xB6, 0x16, 0x30, 0x33, 0xE7, 0x4B,
+ 0x81, 0xBD, 0xEE, 0x67, 0x31, 0x83, 0x4B, 0xCF, 0x83, 0x22, 0x05, 0x8A, 0x81, 0xEB, 0xFA, 0x75,
+ 0xBB, 0x54, 0x8E, 0x78, 0x5B, 0x76, 0x70, 0x3F, 0x7D, 0x3F, 0xAA, 0x6C, 0x69, 0x7F, 0x19, 0x68,
+ 0xB3, 0x68, 0x51, 0xD1, 0x61, 0xD5, 0x3C, 0x2C, 0x6B, 0xC5, 0x96, 0xE0, 0xDA, 0x26, 0x63, 0xC5,
+ 0x0E, 0xA1, 0xF5, 0x59, 0xD5, 0x78, 0x87, 0x81, 0xEF, 0x87, 0x01, 0x88, 0xD4, 0xE1, 0xBD, 0xB8,
+ 0x96, 0x1D, 0x5D, 0x85, 0x1C, 0x6F, 0x53, 0xED, 0x6A, 0x6A, 0xC0, 0x2A, 0xB2, 0xF1, 0x6C, 0x7A,
+ 0x92, 0xF5, 0x70, 0x6D, 0x94, 0xD5, 0x87, 0x57, 0xE3, 0x26, 0xCD, 0xDA, 0x52, 0x5C, 0x22, 0x03,
+ 0xBD, 0xF6, 0x60, 0xA6, 0xC9, 0x64, 0xF0, 0xC6, 0x11, 0xA4, 0x96, 0xB1, 0x27, 0x8B, 0x8E, 0x99,
+ 0x3E, 0xC2, 0xC1, 0x43, 0xD4, 0x10, 0x7D, 0xCC, 0x9F, 0xE4, 0x7C, 0xA6, 0x10, 0x1E, 0xE5, 0x59,
+ 0x37, 0x58, 0xF0, 0xB3, 0xF6, 0x4F, 0x8B, 0x41, 0xDB, 0x65, 0x01, 0xDD, 0xE3, 0xAB, 0xBD, 0x4C,
+ 0x4C, 0x69, 0x2B, 0x82, 0xBA, 0x80, 0xDE, 0x9E, 0x4D, 0xAC, 0x86, 0xDF, 0x34, 0xDB, 0xDF, 0x1C,
+ 0xBA, 0x25, 0x03, 0xD0, 0x5E, 0x29, 0x29, 0x4E, 0xFC, 0xF6, 0xC0, 0x10, 0x03, 0xCA, 0xB0, 0xA3,
+ 0x22, 0xB0, 0x46, 0xAA, 0xC3, 0xBB, 0xF1, 0xC6, 0x7C, 0xB1, 0xC2, 0x70, 0xCD, 0xAC, 0xE0, 0x6B,
+ 0xDD, 0x14, 0xEC, 0xAD, 0x80, 0x09, 0xF9, 0xBD, 0x1F, 0x4A, 0xD7, 0x20, 0xFA, 0x15, 0xCF, 0xDD,
+ 0xE5, 0x65, 0x2A, 0x06, 0xBD, 0x88, 0xC0, 0x12, 0x74, 0xC4, 0x8B, 0x3C, 0x50, 0x8D, 0x73, 0xC3,
+ 0xF0, 0x36, 0x40, 0x64, 0x39, 0x4C, 0x78, 0x92, 0xD8, 0xDC, 0x93, 0x2A, 0xC0, 0x91, 0x16, 0xB0,
+ 0x96, 0x88, 0x70, 0x85, 0x86, 0xEF, 0x38, 0xF5, 0x8E, 0x70, 0x63, 0x3C, 0xE8, 0xDB, 0x26, 0xDF,
+ 0x3F, 0xEE, 0x01, 0xB1, 0xF6, 0xF6, 0x8E, 0x1A, 0xEE, 0x6F, 0x42, 0x9B, 0x76, 0x08, 0xF2, 0xE4,
+ 0xB5, 0xD8, 0x45, 0x55, 0xCE, 0xF3, 0x89, 0xEC, 0x2D, 0x00, 0xF7, 0xC1, 0xED, 0x4D, 0xD0, 0x04,
+ 0xC1, 0xB2, 0x92, 0xE1, 0xE5, 0xEE, 0x44, 0xFD, 0x79, 0xC1, 0x45, 0xAD, 0x1F, 0x99, 0x49, 0xB9,
+ 0xC3, 0x79, 0xAF, 0xFC, 0x09, 0x31, 0x3F, 0xBE, 0x15, 0x37, 0xB7, 0x9B, 0xA2, 0xD5, 0xD7, 0xDD,
+ 0x1B, 0xBC, 0x69, 0xA3, 0x27, 0x8A, 0x7C, 0xAA, 0xC6, 0x31, 0x2A, 0xA9, 0x6F, 0xA1, 0x3D, 0xFE,
+ 0xB6, 0x40, 0xD0, 0x96, 0xBF, 0xEC, 0x37, 0xB1, 0x5C, 0x8E, 0xA8, 0xF7, 0x4B, 0x9D, 0x62, 0x5C,
+ 0x33, 0x4E, 0x54, 0xDA, 0x66, 0xF2, 0xFF, 0xEE, 0xE2, 0x19, 0xF3, 0x47, 0x74, 0xD2, 0xC8, 0x8D,
+ 0xDB, 0x67, 0xEC, 0x77, 0xD7, 0xC0, 0x1F, 0xC7, 0x4D, 0x7D, 0x03, 0xD1, 0xEB, 0xDD, 0x43, 0xD1,
+ 0x25, 0xD8, 0x29, 0x18, 0xCA, 0xE5, 0xF3, 0x89, 0x86, 0xA0, 0x09, 0xD1, 0x4E, 0x0C, 0x69, 0x47,
+ 0x1B, 0x89, 0x9B, 0xB2, 0xE9, 0xE3, 0x7E, 0x9C, 0xE4, 0xCD, 0xE8, 0x0A, 0x70, 0xF0, 0x95, 0x81,
+ 0x70, 0xF5, 0xAD, 0x6E, 0xD9, 0x41, 0x2D, 0xCD, 0xEC, 0xA3, 0x10, 0x18, 0xF1, 0x34, 0xD3, 0xC1,
+ 0x85, 0x5D, 0x07, 0xE5, 0x8C, 0x6A, 0xEF, 0xCC, 0xB0, 0xA7, 0x00, 0xE8, 0x53, 0x5D, 0xD5, 0xE5,
+ 0x47, 0x60, 0x94, 0xAB, 0x43, 0x26, 0xCD, 0x0E, 0x02, 0xD3, 0x8C, 0xF1, 0x8F, 0xAC, 0x23, 0x0F,
+ 0xDF, 0xB1, 0x3A, 0x8F, 0x99, 0xAF, 0x89, 0xAC, 0x5B, 0xAE, 0x6C, 0x40, 0x6D, 0xC1, 0x20, 0x2A,
+ 0x01, 0xFB, 0xC6, 0x02, 0x19, 0xC1, 0x89, 0x98, 0x41, 0x24, 0x9F, 0xCF, 0xA2, 0x43, 0x15, 0x3F,
+ 0xA7, 0x8F, 0x6F, 0xC6, 0x47, 0x91, 0x0A, 0xBA, 0x7B, 0xD3, 0x5E, 0xD2, 0xB3, 0x70, 0x00, 0x86,
+ 0xAD, 0xD6, 0xF4, 0xC4, 0x1D, 0x76, 0x90, 0x26, 0x47, 0xE3, 0x69, 0xA5, 0x8E, 0x2E, 0xBF, 0xA8,
+ 0x9D, 0x72, 0x84, 0x41, 0xC3, 0x8E, 0x4A, 0x6B, 0xE5, 0xA5, 0xB3, 0x05, 0x67, 0xDC, 0x5F, 0xAF,
+ 0xF0, 0x06, 0x08, 0x9C, 0x8E, 0x10, 0xDC, 0x73, 0x98, 0x73, 0x9A, 0x9B, 0xA6, 0x3D, 0xCF, 0xC2,
+ 0x2E, 0x7F, 0x37, 0xF8, 0xC2, 0xC6, 0x45, 0x6D, 0xD3, 0x01, 0x48, 0x55, 0x4E, 0x62, 0xEF, 0x67,
+ 0xD6, 0xAC, 0x7F, 0x6E, 0x9C, 0x0A, 0x1F, 0x5D, 0x9F, 0xB4, 0x55, 0x4F, 0xEB, 0x9D, 0xFC, 0xDD,
+ 0x92, 0x45, 0x1D, 0xAE, 0xBD, 0xCA, 0xCB, 0x04, 0xB9, 0x18, 0x3A, 0xBB, 0x2B, 0x8C, 0x8A, 0x80,
+ 0x4D, 0x1A, 0x24, 0x39, 0xDA, 0x10, 0x94, 0xDA, 0xC9, 0x4B, 0x2F, 0x0F, 0x86, 0x24, 0x0B, 0x51,
+ 0xF5, 0x57, 0xBA, 0x57, 0x23, 0x4D, 0x03, 0xAA, 0xA4, 0xC0, 0x23, 0x7D, 0xF9, 0x13, 0x02, 0x30,
+ 0x42, 0x4D, 0xDA, 0xE0, 0x5E, 0x11, 0x8E, 0xA7, 0x21, 0x20, 0xEA, 0x1F, 0x26, 0xF1, 0x5C, 0xCD,
+ 0x9C, 0x6F, 0x1E, 0xCC, 0xE8, 0x23, 0xA4, 0xDD, 0x40, 0x36, 0xFC, 0x8A, 0x95, 0x80, 0xFD, 0x91,
+ 0xD3, 0x8F, 0x61, 0x75, 0x6B, 0x09, 0xF8, 0x0A, 0xBE, 0x94, 0x25, 0x9C, 0x02, 0xFD, 0x65, 0x50,
+ 0x6F, 0x90, 0xA5, 0x9E, 0xDE, 0xD8, 0x98, 0x90, 0xBA, 0x06, 0xEF, 0xF6, 0xDC, 0x37, 0x4F, 0x46,
+ 0x3F, 0xF4, 0xD1, 0x91, 0xB2, 0x0D, 0xA7, 0x56, 0x78, 0x76, 0x35, 0xE7, 0x2D, 0x66, 0x2A, 0xF8,
+ 0x5B, 0xC5, 0x1F, 0x41, 0xB1, 0x89, 0xB6, 0x7C, 0x43, 0x68, 0x8E, 0x19, 0x44, 0x03, 0x8C, 0xD0,
+ 0xCA, 0xEF, 0x64, 0x34, 0x87, 0xC4, 0xEB, 0xD4, 0xCD, 0x33, 0x07, 0x71, 0x57, 0xA7, 0xDC, 0xE5,
+ 0x65, 0x2E, 0xD9, 0xE1, 0x7F, 0xAA, 0xCA, 0x11, 0xEC, 0xDF, 0x83, 0xAB, 0xBD, 0x9C, 0x27, 0xAB,
+ 0x5C, 0x34, 0x6A, 0x49, 0xDF, 0xAD, 0x68, 0xFA, 0x61, 0x39, 0xDC, 0x49, 0x7D, 0xF5, 0x76, 0xC2,
+ 0x3F, 0xD4, 0x48, 0xA2, 0x9C, 0x2D, 0x50, 0x94, 0x3E, 0xF7, 0xB3, 0xBA, 0x71, 0x23, 0x9F, 0x63,
+ 0x5F, 0x6D, 0x4D, 0x89, 0xA5, 0x37, 0x03, 0xDB, 0x79, 0x87, 0x27, 0x9E, 0x15, 0x65, 0x1C, 0x9F,
+ 0x61, 0x2B, 0x37, 0xFF, 0x87, 0xF4, 0x18, 0xF8, 0xBE, 0xAA, 0x1D, 0x4E, 0xBC, 0x02, 0x26, 0x1A,
+ 0xA5, 0x3E, 0x52, 0x97, 0x21, 0xE1, 0xD2, 0xDA, 0xC0, 0x2D, 0x8D, 0x4B, 0x57, 0xFC, 0x08, 0xAA,
+ 0x7C, 0x59, 0xF9, 0xBF, 0x3A, 0xF1, 0x96, 0x83, 0xA2, 0x59, 0x70, 0xA4, 0x06, 0x13, 0x6B, 0x15,
+ 0xA8, 0xCB, 0xC8, 0x0B, 0x85, 0x31, 0x42, 0x3E, 0x3E, 0x83, 0x0C, 0xAF, 0x40, 0xAC, 0xBE, 0x6C,
+ 0x6E, 0x17, 0x9A, 0xC6, 0x45, 0xCE, 0x1B, 0x1B, 0xBC, 0x94, 0xBF, 0xA2, 0x53, 0x5B, 0xDF, 0x95,
+ 0xEF, 0x6A, 0x41, 0x93, 0xC4, 0x58, 0xE9, 0x20, 0x68, 0x28, 0xB1, 0xA3, 0x80, 0x80, 0x48, 0xEF,
+ 0x7A, 0x7C, 0x11, 0x33, 0x62, 0x18, 0xB7, 0x41, 0x52, 0x36, 0xD5, 0xB6, 0xC0, 0x95, 0xD7, 0x71,
+ 0x00, 0x0B, 0x0A, 0x86, 0xE7, 0x13, 0x8D, 0xE6, 0x73, 0x33, 0xB5, 0x8B, 0xEE, 0xC3, 0xCA, 0x24,
+ 0x12, 0x96, 0x89, 0x91, 0x90, 0x95, 0xCA, 0x24, 0x30, 0xDB, 0x25, 0x9B, 0x1B, 0xF2, 0x13, 0xCA,
+ 0xC3, 0x3A, 0x8A, 0x7E, 0xEA, 0xF9, 0x7D, 0xB1, 0xF0, 0x69, 0xF8, 0xD9, 0xA0, 0xEE, 0x3C, 0xF8,
+ 0x02, 0x37, 0x93, 0xB5, 0xE3, 0xD9, 0x7B, 0x54, 0xF1, 0x3A, 0x9D, 0x20, 0xB0, 0xD2, 0xC6, 0xAE,
+ 0x61, 0x26, 0x90, 0x4C, 0xA5, 0x9D, 0x20, 0xE1, 0xEF, 0x4A, 0x07, 0xF6, 0xAF, 0xE9, 0x28, 0xF5,
+ 0x9B, 0x47, 0xDE, 0xD1, 0x65, 0x76, 0x0C, 0x70, 0x40, 0xBC, 0xA6, 0xA4, 0xE1, 0xF2, 0xEE, 0x0B,
+ 0xAA, 0xF3, 0x3A, 0x8E, 0x4F, 0x7D, 0x9F, 0x97, 0xB6, 0x65, 0x54, 0x16, 0x88, 0xAF, 0x5C, 0xCD,
+ 0xE3, 0x66, 0xEB, 0xB2, 0xA2, 0xA2, 0x5B, 0xE9, 0x0A, 0x54, 0x9B, 0x0E, 0x50, 0x4F, 0x89, 0xAD,
+ 0x67, 0x11, 0x48, 0x33, 0x08, 0x47, 0xA6, 0xE1, 0xB4, 0x03, 0xF5, 0x65, 0x2B, 0xD1, 0xF7, 0xC7,
+ 0x48, 0x3D, 0x1A, 0x33, 0xA6, 0x1E, 0x71, 0x1C, 0x02, 0x0A, 0x47, 0x9C, 0xE1, 0x97, 0xB3, 0x14,
+ 0xD4, 0xEA, 0xFA, 0xF9, 0xFF, 0x35, 0x67, 0xAA, 0xC3, 0x2E, 0x78, 0x33, 0x3D, 0x03, 0x17, 0x78,
+ 0x0B, 0xC7, 0x68, 0xC1, 0x19, 0x4D, 0x21, 0xFE, 0xD7, 0x84, 0xB8, 0xA0, 0x50, 0x36, 0xE6, 0x98,
+ 0xE7, 0x5C, 0xF2, 0x0C, 0xAC, 0x8D, 0x9E, 0xB4, 0xC4, 0xFB, 0x29, 0x50, 0x9F, 0xF7, 0x27, 0xEB,
+ 0x22, 0xDB, 0xD1, 0x19, 0x8E, 0x1C, 0xC4, 0x8C, 0x84, 0xF8, 0x0D, 0xB4, 0x1F, 0x80, 0x91, 0x70,
+ 0xE1, 0xFC, 0x64, 0xE2, 0x5B, 0xD8, 0x07, 0x67, 0x87, 0xA2, 0x7E, 0x37, 0xE4, 0x7A, 0xBF, 0x87,
+ 0xE4, 0x1F, 0x05, 0xAE, 0x25, 0xA5, 0x8C, 0xCE, 0xB5, 0x5F, 0x87, 0x77, 0xCF, 0x8E, 0x18, 0xA7,
+ 0xAB, 0x4E, 0x16, 0xB1, 0xFC, 0x70, 0x9C, 0x00, 0x4D, 0xC6, 0x9F, 0x92, 0x3F, 0x42, 0xAF, 0xB4,
+ 0xD0, 0x36, 0x13, 0xF0, 0xA3, 0xFE, 0x0E, 0x4B, 0xA3, 0xB9, 0xD6, 0xF0, 0x5F, 0xD3, 0x29, 0xDD,
+ 0xB0, 0x27, 0x49, 0x13, 0x9F, 0x2B, 0xF8, 0xCB, 0x62, 0xC2, 0xBF, 0x80, 0x1D, 0x62, 0x23, 0x5B,
+ 0xCE, 0x19, 0x6F, 0xE1, 0xAA, 0xD9, 0x99, 0x0F, 0x48, 0x72, 0xFE, 0xEF, 0x52, 0x58, 0x39, 0xF6,
+ 0x4A, 0x98, 0x4A, 0xEF, 0xCF, 0xA3, 0x71, 0x92, 0xC6, 0xC6, 0x8F, 0x39, 0xED, 0x7D, 0x0B, 0x6C,
+ 0x62, 0xE1, 0xA8, 0x0E, 0x62, 0xF7, 0x59, 0xD6, 0xB0, 0x67, 0x82, 0x12, 0x5C, 0xA9, 0xBC, 0x52,
+ 0x7F, 0xCF, 0xD3, 0x33, 0x7A, 0x98, 0xFE, 0x8E, 0x70, 0x31, 0xB9, 0x82, 0x37, 0xD2, 0x37, 0xC9,
+ 0xEE, 0x1C, 0xBC, 0x76, 0x0B, 0xBD, 0x95, 0xD4, 0xD0, 0x9C, 0xEE, 0x9F, 0x8A, 0x9C, 0xA0, 0x34,
+ 0xFE, 0x8D, 0x64, 0xF0, 0xDA, 0x02, 0x17, 0xA3, 0x26, 0x68, 0x4B, 0xE8, 0x54, 0xF7, 0xE1, 0x94,
+ 0x6D, 0xA9, 0x5E, 0x8B, 0x86, 0x13, 0xDB, 0x5C, 0x0C, 0xF0, 0x3C, 0x40, 0x4F, 0x0D, 0x15, 0xD7,
+ 0xE7, 0x48, 0x3F, 0xC6, 0x33, 0x24, 0x30, 0x83, 0x50, 0x30, 0xBC, 0xD7, 0xE5, 0x25, 0x32, 0x11,
+ 0xD0, 0xA7, 0xE3, 0x7C, 0x4D, 0xE4, 0x46, 0xE3, 0xCB, 0xF7, 0x04, 0x49, 0xFF, 0x5F, 0x0C, 0xFE,
+ 0x36, 0xEE, 0x39, 0x46, 0x5B, 0x41, 0x7D, 0x1B, 0xF0, 0xCF, 0x90, 0xEF, 0x72, 0x6E, 0x61, 0xE5,
+ 0x26, 0xC7, 0xC5, 0x6A, 0xCA, 0x40, 0x7A, 0x30, 0x8E, 0x0A, 0x2F, 0xDD, 0x64, 0x95, 0xF7, 0x19,
+ 0x6D, 0x0F, 0xDB, 0x80, 0xFB, 0x9E, 0x6B, 0x36, 0xD6, 0x1E, 0x0A, 0x34, 0x7A, 0x8B, 0x1B, 0xB9,
+ 0xA8, 0xBB, 0x49, 0x67, 0xCA, 0x7E, 0xD6, 0x27, 0x6F, 0xAC, 0xED, 0x25, 0x89, 0xFD, 0xB4, 0x11,
+ 0x2F, 0x43, 0x74, 0x40, 0x2D, 0x73, 0x20, 0xA1, 0x94, 0x9E, 0x79, 0x5D, 0x20, 0x88, 0xD5, 0x1F,
+ 0x13, 0x10, 0x35, 0x7A, 0x4C, 0xF0, 0x5B, 0x09, 0x96, 0x75, 0x6F, 0x5F, 0xED, 0x9D, 0x68, 0xBD,
+ 0x0D, 0x77, 0x5C, 0x85, 0x13, 0x3A, 0x11, 0x0D, 0x0A, 0x90, 0x98, 0x8F, 0xCE, 0x4C, 0xE5, 0x46,
+ 0x40, 0x86, 0x75, 0xA5, 0x49, 0x5C, 0x12, 0x57, 0xF8, 0x48, 0x86, 0xD4, 0x81, 0xA4, 0x47, 0x39,
+ 0x19, 0x42, 0x23, 0x44, 0x7F, 0x57, 0x9C, 0x95, 0xA1, 0xFD, 0x3E, 0xA6, 0x29, 0x84, 0xF6, 0x8F,
+ 0x87, 0x79, 0x8B, 0xF6, 0x45, 0x5A, 0x9B, 0x7E, 0xBB, 0xC1, 0xD3, 0xB7, 0xE4, 0x18, 0xB0, 0x61,
+ 0x77, 0xB4, 0x12, 0x25, 0xEE, 0x6C, 0x3D, 0x6C, 0xA9, 0xFE, 0x67, 0xDE, 0xCC, 0x8F, 0x11, 0xC1,
+ 0x8A, 0xD6, 0x72, 0xAC, 0x45, 0x77, 0xEF, 0xD3, 0x96, 0x41, 0xA7, 0xC1, 0x92, 0x15, 0x93, 0x44,
+ 0x18, 0x08, 0x14, 0x7C, 0xAB, 0xCE, 0xBF, 0xFA, 0x89, 0xEF, 0xAD, 0x09, 0x9A, 0xB9, 0x8A, 0x7D,
+ 0xD5, 0xA2, 0x82, 0x90, 0x10, 0x4E, 0xD6, 0xCC, 0x04, 0x43, 0x21, 0x6B, 0xDF, 0xE4, 0x56, 0xE9,
+ 0x7D, 0x17, 0xCD, 0xC1, 0x3A, 0xC0, 0xA1, 0x83, 0xCE, 0xC8, 0x90, 0x2E, 0xA6, 0x73, 0x44, 0x72,
+ 0x10, 0x7B, 0x03, 0xDB, 0x2F, 0xCA, 0x9C, 0x71, 0x44, 0x06, 0xAC, 0xCB, 0x4A, 0x09, 0xF0, 0x08,
+ 0x1C, 0x99, 0x49, 0x13, 0x19, 0x6E, 0xEE, 0x4C, 0xA2, 0xE4, 0xB8, 0xA0, 0x36, 0xE2, 0x9C, 0x13,
+ 0x7E, 0x6C, 0x9B, 0x3C, 0x74, 0x5A, 0x50, 0x90, 0x8C, 0xE1, 0x24, 0x76, 0x14, 0xF7, 0x2E, 0x77,
+ 0x24, 0x64, 0xFA, 0x37, 0x0C, 0xE1, 0x90, 0xDB, 0xB4, 0x4C, 0x9E, 0xC5, 0x26, 0xA8, 0xED, 0x02,
+ 0x72, 0x4D, 0xF4, 0x91, 0x94, 0xDF, 0x77, 0x3B, 0x96, 0xB9, 0x42, 0x34, 0xD2, 0xB7, 0x1E, 0x49,
+ 0xBD, 0x29, 0xBB, 0x3C, 0xC6, 0x5B, 0x3F, 0x15, 0xE5, 0x8F, 0x0E, 0x23, 0xA5, 0xD5, 0x73, 0x06,
+ 0x6F, 0xEF, 0x73, 0x51, 0xB2, 0xC8, 0xD4, 0x44, 0xFC, 0x25, 0x95, 0xA9, 0x44, 0x57, 0xB7, 0x80,
+ 0x07, 0xB0, 0xCE, 0x58, 0x12, 0xFF, 0xD3, 0xD9, 0x13, 0xDD, 0x11, 0x26, 0x5B, 0xC3, 0x5B, 0xEE,
+ 0xA9, 0x53, 0x19, 0xE9, 0x31, 0x9C, 0x1B, 0x3A, 0x2A, 0x9F, 0xD9, 0x7C, 0x7A, 0x55, 0x52, 0x40,
+ 0xE0, 0xEC, 0x11, 0x39, 0x7E, 0x09, 0xD7, 0xE7, 0xCF, 0xC7, 0x67, 0xDB, 0xDE, 0x02, 0x92, 0xEF,
+ 0x47, 0x2C, 0x54, 0xFD, 0xE4, 0x37, 0xC6, 0x9F, 0x51, 0x66, 0x96, 0x84, 0x19, 0x94, 0x90, 0xE6,
+ 0x4E, 0x43, 0x2A, 0xB9, 0x13, 0x40, 0x9C, 0xE9, 0x89, 0xA2, 0x2B, 0x8E, 0x8C, 0x39, 0x42, 0x42,
+ 0xF8, 0xD9, 0x5A, 0x86, 0x0E, 0xA6, 0x3A, 0x9E, 0xA8, 0xA5, 0x23, 0x19, 0x58, 0xDB, 0x4C, 0x46,
+ 0xCA, 0x26, 0x50, 0x0B, 0xD2, 0x6A, 0x9B, 0xBE, 0x63, 0x55, 0xF4, 0x42, 0xD8, 0x20, 0xCD, 0x55,
+ 0x01, 0xA0, 0x3D, 0xE3, 0x97, 0x23, 0x14, 0xF1, 0x6A, 0x2A, 0x5A, 0xA9, 0xBD, 0x01, 0x5E, 0x56,
+ 0x8F, 0xC7, 0x31, 0x6F, 0xBB, 0x78, 0x88, 0x01, 0xF0, 0x00, 0xD2, 0x1B, 0x40, 0x6D, 0x50, 0xD0,
+ 0xCB, 0x44, 0x35, 0x3A, 0xBC, 0xBB, 0x6F, 0x6C, 0xF4, 0xDB, 0x6F, 0x54, 0x27, 0x8C, 0x0A, 0x5A,
+ 0xE8, 0x56, 0xC9, 0x28, 0x44, 0xBC, 0xF7, 0x70, 0xF0, 0x95, 0x17, 0xA1, 0x0B, 0x91, 0xDF, 0x80,
+ 0xF8, 0xF3, 0xF9, 0xB9, 0x1C, 0xEB, 0x81, 0x31, 0x18, 0xE2, 0xB6, 0xF8, 0x80, 0x64, 0x61, 0x1F,
+ 0xD9, 0x14, 0x6C, 0x64, 0xE8, 0xDB, 0x45, 0x5E, 0x16, 0xD4, 0xDB, 0xC9, 0x13, 0x70, 0x4B, 0x0E,
+ 0x40, 0x80, 0xB9, 0xCA, 0x9E, 0xB7, 0x85, 0x88, 0xDA, 0xF8, 0x13, 0xFE, 0x51, 0x28, 0xB9, 0x6E,
+ 0x65, 0x92, 0xAA, 0x45, 0x68, 0xC6, 0x82, 0xCC, 0xBA, 0x28, 0x6E, 0xCF, 0x54, 0x7A, 0xB4, 0x8A,
+ 0x8A, 0x92, 0x3C, 0x2F, 0x55, 0x6A, 0xE3, 0x23, 0x27, 0x4B, 0xFA, 0x13, 0x58, 0xB5, 0xAE, 0x9D,
+ 0xA3, 0x77, 0x25, 0xFA, 0x70, 0x59, 0x5A, 0x34, 0x4C, 0xF1, 0xA9, 0x9A, 0x37, 0x2B, 0xEF, 0xA0,
+ 0x85, 0xB7, 0x97, 0x74, 0x04, 0xD0, 0x08, 0xFE, 0x01, 0x7B, 0x33, 0x44, 0xB8, 0x44, 0x12, 0xE6,
+ 0x1D, 0xCF, 0xE0, 0x8D, 0xDE, 0x92, 0x93, 0x49, 0xB8, 0x2B, 0x65, 0x0D, 0x38, 0x55, 0x3B, 0x90,
+ 0x89, 0x01, 0x40, 0xEB, 0xF1, 0x33, 0x5C, 0x36, 0xAA, 0xF7, 0x84, 0x75, 0x8A, 0xB1, 0xE4, 0x68,
+ 0x6F, 0x3C, 0x7C, 0x84, 0x71, 0x06, 0x57, 0xC4, 0x83, 0x9F, 0x6A, 0x96, 0x8F, 0xEB, 0xA6, 0x59,
+ 0xBB, 0x2D, 0x68, 0x35, 0x8F, 0xBF, 0x8D, 0xFE, 0xC8, 0xBC, 0xA7, 0x41, 0x97, 0x17, 0x49, 0x82,
+ 0x6E, 0x4D, 0xB0, 0xE8, 0xC9, 0x10, 0x57, 0x7B, 0x9C, 0x03, 0xDD, 0x90, 0xE3, 0x15, 0x30, 0x9A,
+ 0x66, 0xAB, 0xF8, 0x9A, 0x69, 0xBE, 0x6E, 0x74, 0x3C, 0xF4, 0xDD, 0x0D, 0x77, 0x77, 0x30, 0x2C,
+ 0x3C, 0x2B, 0x7E, 0x01, 0x90, 0xFD, 0xD7, 0xF1, 0x87, 0x03, 0x61, 0x87, 0x8B, 0x46, 0x5C, 0x02,
+ 0x20, 0x5C, 0xB0, 0x8C, 0x56, 0x51, 0xA3, 0xFE, 0x15, 0x28, 0x24, 0xC7, 0x43, 0xE9, 0x15, 0x43,
+ 0xA7, 0xD7, 0x21, 0x12, 0x88, 0xD5, 0x32, 0xAE, 0x04, 0xC8, 0x3E, 0x28, 0x7E, 0x08, 0xD4, 0x97,
+ 0x5E, 0xCF, 0x60, 0xF1, 0x42, 0x96, 0x2B, 0xED, 0xAE, 0x71, 0x43, 0xD0, 0x04, 0x48, 0x65, 0x03,
+ 0x9A, 0xFA, 0x77, 0x45, 0x5A, 0xFC, 0x48, 0x12, 0x16, 0xCF, 0xAF, 0x13, 0xE4, 0x03, 0xCC, 0x8F,
+ 0xF4, 0xB5, 0x68, 0xB3, 0xF5, 0x53, 0x13, 0x42, 0x26, 0x8F, 0xB5, 0x71, 0x8E, 0x9B, 0xB3, 0x2E,
+ 0xF6, 0x9F, 0x1E, 0x4A, 0xBC, 0xB9, 0xD8, 0xA5, 0x77, 0xCE, 0x95, 0x94, 0xE3, 0x9F, 0xD8, 0xAD,
+ 0x53, 0x79, 0x03, 0xA6, 0x57, 0xF7, 0x13, 0xD5, 0x66, 0x25, 0x66, 0x88, 0x78, 0xF7, 0xF6, 0x35,
+ 0xF9, 0xCC, 0x7F, 0xC6, 0x36, 0xAD, 0xC2, 0x70, 0x34, 0x94, 0xAA, 0xED, 0xCA, 0x4A, 0x14, 0x16,
+ 0xF6, 0x6E, 0x46, 0xE8, 0x32, 0x63, 0xDF, 0x88, 0x66, 0x65, 0x6E, 0xA3, 0xCF, 0xDB, 0x1E, 0x5B,
+ 0xFD, 0xCB, 0xB1, 0x99, 0x4A, 0x65, 0xD3, 0x24, 0xD8, 0xC9, 0xA1, 0xAA, 0x06, 0xA9, 0x4C, 0xF5,
+ 0x7C, 0x9E, 0x98, 0x77, 0x12, 0xC2, 0xA9, 0xF9, 0x8D, 0x5F, 0x43, 0x1B, 0x9D, 0xEB, 0xD2, 0x28,
+ 0x2C, 0x54, 0x60, 0x97, 0x5A, 0x70, 0x28, 0x78, 0xCA, 0x43, 0xD1, 0xBA, 0xA3, 0x5F, 0x49, 0x6A,
+ 0x0C, 0x2A, 0x53, 0x09, 0xF8, 0x5E, 0x89, 0x5C, 0x6A, 0x5D, 0x2A, 0x8B, 0x58, 0x7D, 0x19, 0x1A,
+ 0xF1, 0x1B, 0x5A, 0x12, 0xE7, 0x09, 0x9C, 0x88, 0xD5, 0xD7, 0x15, 0xFB, 0xDF, 0x62, 0xA9, 0x54,
+ 0xD7, 0xD5, 0x7A, 0x2B, 0xBF, 0xCA, 0x0B, 0xB9, 0x07, 0xB4, 0xC9, 0x17, 0x81, 0x33, 0x07, 0x25,
+ 0xE2, 0x0A, 0x6C, 0xF4, 0xD1, 0xF7, 0xF7, 0x65, 0xDE, 0x71, 0x00, 0x72, 0x9C, 0x2A, 0xBC, 0x31,
+ 0xC0, 0x94, 0x85, 0x93, 0x9C, 0x65, 0xA6, 0xF1, 0x2F, 0x01, 0x8B, 0xD8, 0x66, 0x3E, 0x96, 0xB6,
+ 0x96, 0xA0, 0x78, 0xA3, 0x85, 0x35, 0x6C, 0x3A, 0x37, 0x09, 0x76, 0x12, 0xB1, 0xA8, 0xC5, 0xE3,
+ 0x53, 0xFB, 0x17, 0xB4, 0x10, 0xD1, 0x0F, 0xFA, 0xE7, 0x42, 0x58, 0x20, 0x72, 0x79, 0xC2, 0x94,
+ 0xAF, 0xF7, 0x7D, 0x35, 0xD3, 0x48, 0x23, 0x67, 0x0F, 0xD7, 0x65, 0xE0, 0x48, 0x05, 0x7E, 0x09,
+ 0xE6, 0x0A, 0x4B, 0xD2, 0xB0, 0xB9, 0x84, 0x12, 0xAF, 0x4B, 0x92, 0xDD, 0x30, 0x4B, 0x9F, 0xDC,
+ 0xD5, 0x5D, 0xD4, 0x5A, 0x13, 0xE6, 0xB7, 0x18, 0x18, 0xC0, 0x52, 0x18, 0xBF, 0xC2, 0xB8, 0x7D,
+ 0x2B, 0x2A, 0x36, 0x7A, 0x63, 0x6E, 0xF7, 0x59, 0x61, 0xC3, 0x97, 0x31, 0xDD, 0x61, 0x15, 0x1B,
+ 0x30, 0xC3, 0xDD, 0xF5, 0x51, 0x2F, 0x77, 0xB4, 0x54, 0x6E, 0x4D, 0x98, 0x13, 0xDB, 0x3E, 0x4C,
+ 0xA9, 0xCF, 0x77, 0xC8, 0x2D, 0x8E, 0x49, 0xDA, 0x67, 0xBA, 0x6C, 0x37, 0x54, 0xAB, 0x55, 0x80,
+ 0x15, 0x94, 0x5F, 0xB6, 0x4D, 0x6B, 0xB3, 0xA3, 0x13, 0xBD, 0x7C, 0x47, 0xE3, 0xA5, 0x70, 0x9B,
+ 0xEC, 0x5C, 0x94, 0x60, 0xC9, 0xEA, 0xD6, 0x64, 0xEE, 0x3B, 0x8F, 0x4E, 0xE2, 0x07, 0x61, 0xC6,
+ 0xA4, 0x64, 0x8A, 0xA1, 0xF9, 0x57, 0xC2, 0xEA, 0x89, 0x95, 0x12, 0x67, 0xE0, 0xC6, 0xCF, 0x44,
+ 0x40, 0x98, 0x8E, 0xB7, 0xDF, 0xFF, 0xCB, 0xAA, 0xEF, 0xC5, 0x72, 0x8D, 0xD4, 0xC7, 0x58, 0x60,
+ 0x9D, 0xE1, 0xD6, 0x1D, 0x3A, 0x12, 0xBA, 0x5E, 0xA9, 0xAB, 0x21, 0xB9, 0x2E, 0xE0, 0x04, 0x47,
+ 0x1B, 0xB2, 0x37, 0x28, 0xED, 0x7F, 0x7D, 0x24, 0x63, 0x2D, 0x98, 0x04, 0x4D, 0x1E, 0x6B, 0xE7,
+ 0x11, 0x1C, 0xED, 0xB1, 0x02, 0x64, 0x63, 0x51, 0x71, 0x6E, 0xB1, 0x3D, 0xAD, 0xE1, 0xEB, 0x3B,
+ 0x23, 0x51, 0xE3, 0x45, 0xA4, 0x83, 0xB2, 0x83, 0xD9, 0x43, 0x5C, 0xF6, 0x99, 0xDE, 0xC8, 0xD2,
+ 0xB7, 0x11, 0x26, 0xF3, 0xEA, 0x69, 0xFE, 0x54, 0x22, 0x33, 0xCD, 0xDE, 0xE4, 0x2F, 0x65, 0x19,
+ 0xA0, 0x3E, 0xDB, 0x4E, 0xB0, 0x4A, 0xFA, 0x57, 0x47, 0x13, 0x84, 0x7B, 0x73, 0x3B, 0x8E, 0xB1,
+ 0x8A, 0x1C, 0x80, 0x0C, 0x9D, 0x67, 0xF3, 0xD5, 0x00, 0xD7, 0xDA, 0x92, 0xA5, 0xF7, 0xE4, 0x8D,
+ 0x60, 0x48, 0xD2, 0x5C, 0xF6, 0x9A, 0x0D, 0x94, 0xE4, 0x19, 0x75, 0xCF, 0xE2, 0xCD, 0x22, 0xD5,
+ 0x87, 0x9C, 0x36, 0x65, 0xC7, 0x36, 0x0D, 0x5B, 0x5C, 0x7A, 0x08, 0xC7, 0x98, 0xF5, 0xAE, 0x04,
+ 0x45, 0xCE, 0x32, 0x1A, 0x25, 0xC9, 0x1F, 0x2E, 0x96, 0x95, 0x62, 0x97, 0x4C, 0x27, 0x82, 0xB9,
+ 0x0A, 0xFA, 0x0D, 0xE3, 0xF1, 0xEA, 0xD6, 0x59, 0x3A, 0x6C, 0x9B, 0x28, 0xCA, 0x8A, 0x19, 0x79,
+ 0x5C, 0xE9, 0xFF, 0xFD, 0x93, 0x54, 0x26, 0xF4, 0x09, 0x58, 0xB9, 0x41, 0x90, 0x2C, 0x74, 0x98,
+ 0x45, 0x9A, 0x71, 0x12, 0x06, 0x52, 0xAA, 0x31, 0xAD, 0xEA, 0x97, 0x81, 0x33, 0xD6, 0xA3, 0x54,
+ 0xCA, 0x9D, 0x5E, 0xF1, 0x87, 0xDD, 0xAB, 0x1E, 0xF1, 0x1B, 0xA4, 0xFD, 0x74, 0x60, 0x93, 0xD6,
+ 0x01, 0x9F, 0x5C, 0x2D, 0x7D, 0xE7, 0xB8, 0x76, 0x36, 0x80, 0xD0, 0x63, 0x27, 0xC8, 0x94, 0x15,
+ 0x4B, 0x1C, 0xC2, 0x6B, 0x67, 0x23, 0xEC, 0xAC, 0xD2, 0xEB, 0xC5, 0x5D, 0x78, 0x81, 0xD6, 0x30,
+ 0xDD, 0xA6, 0x2C, 0xEE, 0x16, 0xDA, 0x8B, 0xA0, 0x9D, 0x20, 0xF8, 0x62, 0x87, 0x6D, 0xC2, 0x9C,
+ 0x80, 0x53, 0x3C, 0x20, 0x06, 0x78, 0x71, 0xD7, 0xA6, 0x0D, 0xEA, 0xA8, 0x58, 0xA6, 0x21, 0x77,
+ 0xCB, 0xD0, 0x6F, 0x05, 0x7A, 0x47, 0x1C, 0xFB, 0xA0, 0x4D, 0xD8, 0x22, 0xD1, 0xE3, 0x9B, 0x14,
+ 0x98, 0xF4, 0xAE, 0x20, 0xEC, 0x64, 0xD9, 0xC6, 0xBF, 0xB1, 0x40, 0x1A, 0x4C, 0x66, 0xC3, 0x2B,
+ 0xC0, 0xE7, 0xD3, 0x61, 0x4C, 0x6D, 0xF8, 0x5D, 0xC9, 0x33, 0x92, 0xC4, 0x1D, 0xA3, 0xF5, 0x69,
+ 0x10, 0xF3, 0x4B, 0x31, 0x1C, 0x1D, 0x11, 0x8E, 0xB0, 0xF8, 0xD9, 0x3A, 0xBF, 0x06, 0xC1, 0xB0,
+ 0x27, 0x8B, 0xB6, 0x9E, 0x7C, 0x6E, 0x27, 0x15, 0xF1, 0xE0, 0xE7, 0x31, 0x87, 0x10, 0x94, 0x2C,
+ 0x0D, 0xC6, 0x75, 0x54, 0xD2, 0x5A, 0xE4, 0x25, 0xA7, 0xB9, 0x16, 0x4A, 0x93, 0x8E, 0x1D, 0x84,
+ 0x06, 0xDC, 0x84, 0xDE, 0x57, 0x9D, 0xF7, 0xC1, 0x68, 0x08, 0x67, 0xFD, 0x5C, 0x38, 0x2A, 0xC9,
+ 0x99, 0x28, 0xEC, 0x5D, 0xB4, 0x2A, 0xCA, 0xB3, 0xBC, 0x92, 0x0C, 0xFC, 0xC9, 0xED, 0x22, 0x52,
+ 0x79, 0xC4, 0x04, 0x3F, 0xD0, 0x7D, 0x4B, 0xE0, 0x0C, 0x0F, 0x82, 0x00, 0xB8, 0x38, 0x70, 0x06,
+ 0xC5, 0x34, 0x1E, 0x0D, 0x96, 0x7E, 0xDC, 0x94, 0x7E, 0x64, 0x47, 0xA9, 0x62, 0xAE, 0xA3, 0x8B,
+ 0x6E, 0x0B, 0x1D, 0xB9, 0x8F, 0xE8, 0xAA, 0x57, 0xD7, 0xE3, 0x65, 0x15, 0x28, 0x88, 0xF5, 0x21,
+ 0xF3, 0x38, 0xA4, 0xFC, 0xDB, 0x09, 0xC1, 0x7A, 0x7B, 0xA7, 0xFF, 0x0B, 0xA3, 0x18, 0xA2, 0x42,
+ 0x28, 0x22, 0xB2, 0x95, 0x25, 0x56, 0x08, 0xFF, 0x3D, 0xB5, 0xF1, 0x41, 0x44, 0x34, 0x64, 0x67,
+ 0x2C, 0xD5, 0xF0, 0x40, 0x9B, 0x82, 0x18, 0xAE, 0x8E, 0x74, 0xFE, 0x6D, 0xCC, 0x3E, 0x02, 0x13,
+ 0x41, 0xC3, 0x32, 0x33, 0x76, 0x3A, 0x4A, 0x5B, 0xED, 0xFC, 0x64, 0xFB, 0x17, 0x2A, 0xB1, 0x9B,
+ 0xF6, 0xB9, 0x45, 0x83, 0xBC, 0x42, 0x12, 0xAB, 0x91, 0xFD, 0x2A, 0x34, 0xE7, 0x56, 0xBA, 0xB8,
+ 0x69, 0x81, 0xBA, 0x30, 0x6C, 0x8C, 0x4B, 0xAB, 0x1D, 0x47, 0x57, 0xAA, 0xE7, 0x3F, 0x25, 0x25,
+ 0x7E, 0x6A, 0x2D, 0x35, 0x61, 0xB0, 0xC1, 0xAC, 0x81, 0xFE, 0xB5, 0x28, 0x7E, 0xFF, 0x6B, 0x6B,
+ 0x71, 0xBA, 0x60, 0x0C, 0x56, 0xCC, 0x6D, 0xA2, 0x23, 0xB2, 0x2B, 0xFB, 0xCB, 0x16, 0x25, 0xFE,
+ 0x6C, 0xAC, 0x81, 0x2E, 0xAC, 0x11, 0xB2, 0x79, 0xC8, 0x7A, 0x44, 0x0B, 0x82, 0xF8, 0xC6, 0xE0,
+ 0x2D, 0x92, 0x58, 0x73, 0xAF, 0x8A, 0xD7, 0x3D, 0x2C, 0x05, 0x09, 0x54, 0x2F, 0xDE, 0x12, 0x17,
+ 0xC5, 0xB1, 0x32, 0xFA, 0x58, 0xE4, 0x0F, 0x74, 0x1E, 0xAA, 0xAC, 0x3B, 0x35, 0xDF, 0x92, 0x9C,
+ 0xB2, 0xC2, 0xA6, 0x90, 0x6D, 0xD4, 0xEB, 0x13, 0xA8, 0xEA, 0xC2, 0x61, 0xED, 0x67, 0x65, 0x44,
+ 0xAD, 0x46, 0x28, 0x11, 0x0F, 0x46, 0x04, 0x49, 0xE6, 0x2E, 0x1A, 0xD6, 0x67, 0x72, 0x7C, 0x0D,
+ 0x6A, 0x8A, 0xFA, 0xDB, 0x94, 0x66, 0x84, 0xF1, 0x31, 0x3F, 0x38, 0x1C, 0x04, 0xCF, 0x09, 0x52,
+ 0x2F, 0xDB, 0xF6, 0x6F, 0xEB, 0x69, 0x03, 0x10, 0x92, 0xA0, 0x95, 0x0A, 0xE5, 0x52, 0x4A, 0x9B,
+ 0xD7, 0x76, 0x05, 0x80, 0x07, 0x09, 0x4A, 0x3A, 0x37, 0xCD, 0xB3, 0x73, 0x64, 0x1F, 0xAB, 0x14,
+ 0x57, 0xA0, 0xFF, 0x9B, 0x0D, 0x34, 0x56, 0x0A, 0x79, 0x79, 0x20, 0x7C, 0x4A, 0x52, 0xD8, 0xB4,
+ 0x22, 0x45, 0x88, 0x90, 0xA0, 0x35, 0x36, 0x71, 0x9B, 0xD8, 0x2E, 0xC5, 0x89, 0x20, 0x54, 0x36,
+ 0x7A, 0x47, 0x03, 0x45, 0xF8, 0xB2, 0x20, 0xD0, 0xBC, 0x84, 0x05, 0x40, 0xDB, 0xD4, 0xD0, 0x1C,
+ 0x9E, 0xF0, 0x37, 0x02, 0x31, 0xD9, 0xDE, 0xBC, 0xBD, 0x87, 0x3E, 0xA7, 0x2A, 0xD9, 0x7E, 0x8B,
+ 0xBD, 0xEF, 0x67, 0xC4, 0x06, 0x00, 0x43, 0xA7, 0x89, 0xE6, 0xA8, 0x7B, 0xBD, 0x03, 0xCB, 0xC8,
+ 0x2F, 0x46, 0xEF, 0xA5, 0xEF, 0x16, 0x7D, 0xE3, 0xE9, 0x63, 0xCC, 0x89, 0xFC, 0xE5, 0x14, 0x40,
+ 0x3A, 0x5A, 0xC8, 0xBC, 0xF6, 0xD9, 0x3D, 0xAC, 0x82, 0xB5, 0x7F, 0xB7, 0xE4, 0x8F, 0x5C, 0x0A,
+ 0x5F, 0x6E, 0x0C, 0xF1, 0x7E, 0xAD, 0x12, 0xFA, 0x4E, 0x01, 0xC5, 0x62, 0xBF, 0x10, 0x27, 0xE7,
+ 0x72, 0xC0, 0xC3, 0xA6, 0x8B, 0xF7, 0xD8, 0xA5, 0x52, 0x20, 0xA3, 0xEE, 0x70, 0xB0, 0xF6, 0xE2,
+ 0x6A, 0x8D, 0x29, 0x73, 0x17, 0xBD, 0x68, 0x45, 0x25, 0x53, 0x68, 0xC5, 0x1B, 0xD5, 0xC1, 0xFF,
+ 0x38, 0x17, 0x25, 0x47, 0x0C, 0x2E, 0xD4, 0x3E, 0xF7, 0x91, 0x36, 0x35, 0xAD, 0x72, 0xBE, 0x5A,
+ 0x19, 0x04, 0x97, 0x77, 0x51, 0x5D, 0x2E, 0x51, 0xA7, 0xC3, 0x22, 0xEE, 0xE6, 0xC9, 0x9A, 0x3B,
+ 0x9D, 0xA2, 0x84, 0xDE, 0x2B, 0x76, 0x62, 0x00, 0x2C, 0x4F, 0xA5, 0x12, 0xC5, 0x43, 0x8B, 0xD0,
+ 0x13, 0x9E, 0x88, 0x3D, 0x33, 0xC3, 0xF4, 0x41, 0x6D, 0x00, 0x3B, 0xC3, 0xE1, 0xA1, 0x0A, 0x6A,
+ 0x63, 0xE8, 0x42, 0x89, 0x05, 0xAF, 0xAA, 0x2B, 0x07, 0x25, 0x5B, 0xE1, 0xAA, 0xC6, 0xA7, 0xBD,
+ 0x72, 0xC5, 0x17, 0x75, 0x53, 0x61, 0x20, 0x76, 0x14, 0xCC, 0x7A, 0x06, 0xF5, 0x21, 0xD2, 0x8F,
+ 0x8F, 0x18, 0x5C, 0x50, 0xAA, 0x98, 0xA4, 0xB9, 0x7E, 0xBF, 0xD6, 0xBA, 0xEA, 0x9D, 0x64, 0xF3,
+ 0x31, 0x4D, 0x48, 0x18, 0x58, 0xF0, 0x07, 0x23, 0xD6, 0x3E, 0xCA, 0xB4, 0x54, 0xE6, 0x04, 0x19,
+ 0x18, 0xD5, 0xC7, 0x54, 0x85, 0x75, 0xA6, 0x58, 0x0E, 0xEB, 0x74, 0xD6, 0xF6, 0xAF, 0xB4, 0x9D,
+ 0x70, 0xF0, 0x7B, 0x88, 0x8B, 0x8B, 0x64, 0x2C, 0x20, 0x40, 0x98, 0x5E, 0x2C, 0x64, 0xC6, 0x98,
+ 0x26, 0x1D, 0x94, 0x90, 0x01, 0x03, 0x66, 0x5D, 0x6D, 0xC0, 0xBB, 0x5A, 0xC4, 0xF0, 0x0B, 0x78,
+ 0x4E, 0x2E, 0x89, 0xA2, 0x86, 0x41, 0x90, 0x7B, 0x1D, 0x2C, 0x76, 0x17, 0xE5, 0x39, 0xE9, 0xF7,
+ 0x00, 0xC0, 0x6B, 0x1F, 0x7E, 0xC1, 0xC2, 0x15, 0xA8, 0xA3, 0xF6, 0x7C, 0xF6, 0x19, 0x3F, 0xE0,
+ 0xCE, 0xEF, 0x5C, 0x7B, 0x63, 0x63, 0xBE, 0x64, 0x33, 0x0E, 0x03, 0xFE, 0xF9, 0x03, 0xD9, 0xF7,
+ 0xDF, 0x99, 0x37, 0x70, 0xAE, 0x6B, 0x90, 0x2A, 0x99, 0x14, 0x1D, 0x0C, 0x83, 0x6A, 0xC9, 0xEA,
+ 0x34, 0x8C, 0xAC, 0x51, 0x30, 0x04, 0x4A, 0x71, 0xA8, 0x8E, 0xC6, 0xD8, 0x19, 0x70, 0xB0, 0xE4,
+ 0x80, 0x55, 0x52, 0x09, 0x5E, 0x58, 0x22, 0xFF, 0x80, 0xC1, 0xAE, 0x0A, 0x87, 0xC7, 0xBE, 0xC7,
+ 0x95, 0xEA, 0x98, 0x5A, 0xC0, 0x67, 0xA3, 0xDA, 0x68, 0xEF, 0xBA, 0x48, 0xF1, 0xA0, 0x2C, 0x33,
+ 0x56, 0x1A, 0x45, 0xB8, 0xA3, 0x70, 0xA8, 0xD3, 0xB2, 0xCF, 0x1C, 0xC0, 0x02, 0x1E, 0xDA, 0x14,
+ 0x0B, 0x2C, 0x03, 0xEA, 0xEC, 0x2E, 0x2B, 0x21, 0x1C, 0xE1, 0x99, 0xDF, 0x46, 0xD1, 0xC1, 0xE9,
+ 0x00, 0x90, 0xB6, 0x7D, 0x79, 0xA2, 0x42, 0xF7, 0x0E, 0x67, 0xE3, 0x8B, 0xE1, 0x42, 0x26, 0x7A,
+ 0x69, 0x82, 0x9D, 0x5C, 0x26, 0xFE, 0xE2, 0x6D, 0x51, 0x48, 0x74, 0x4A, 0xE1, 0xA7, 0x77, 0x07,
+ 0x09, 0xA3, 0x30, 0x0B, 0x48, 0x4F, 0x64, 0xB1, 0x84, 0x91, 0xFF, 0x81, 0xFF, 0x5C, 0x94, 0x08,
+ 0x44, 0xA8, 0xD6, 0x80, 0x5B, 0x26, 0xF7, 0x5A, 0xDC, 0xF0, 0xC1, 0x6D, 0xED, 0xAF, 0xC3, 0x8D,
+ 0xFA, 0x54, 0xE4, 0xB1, 0x8F, 0x03, 0x45, 0x01, 0x63, 0x72, 0x17, 0x81, 0x21, 0x1D, 0x1E, 0xF3,
+ 0x19, 0x2A, 0xD2, 0x43, 0x4C, 0x6E, 0xC8, 0x83, 0x13, 0x13, 0x4A, 0x00, 0x7E, 0xEF, 0x2D, 0x06,
+ 0x07, 0x40, 0x81, 0x0A, 0xC3, 0xE8, 0x13, 0xF6, 0xDC, 0xD7, 0x2C, 0xEB, 0xEC, 0x7C, 0xF9, 0x7B,
+ 0xC9, 0xD1, 0x79, 0x3A, 0x18, 0x74, 0xFF, 0xE8, 0xB3, 0xAC, 0x06, 0xDC, 0x68, 0x07, 0x35, 0x0A,
+ 0x45, 0x67, 0x5B, 0xC8, 0x1C, 0x3D, 0x4F, 0x77, 0xCD, 0x1D, 0xEF, 0x2E, 0xBD, 0xA7, 0x2E, 0xD4,
+ 0xD7, 0x2E, 0x32, 0xEC, 0x89, 0x42, 0x46, 0x4B, 0x68, 0x60, 0x86, 0x72, 0xA9, 0x9B, 0xC3, 0x36,
+ 0xDE, 0x00, 0xBF, 0xCF, 0x4A, 0xFD, 0x2C, 0x98, 0xEE, 0x98, 0x6F, 0xD7, 0xA7, 0x7B, 0xE4, 0xDA,
+ 0xF6, 0xE2, 0x6E, 0x33, 0x29, 0x7F, 0x7E, 0xA0, 0xE9, 0x6A, 0x07, 0x69, 0xA8, 0xF3, 0x65, 0xC6,
+ 0x8F, 0x9D, 0x43, 0x88, 0xDB, 0xF9, 0x7A, 0x81, 0x7C, 0x8F, 0xF0, 0x99, 0xC7, 0x4A, 0x30, 0xC0,
+ 0x5C, 0x15, 0x21, 0x00, 0xC7, 0x19, 0x23, 0x48, 0xD7, 0x4E, 0x64, 0x8C, 0xA4, 0x26, 0x94, 0x80,
+ 0x24, 0xC1, 0xC1, 0x87, 0xC9, 0x55, 0x51, 0x90, 0x7F, 0x9A, 0xDB, 0x2A, 0x7E, 0x56, 0xCA, 0xE1,
+ 0xDF, 0x81, 0xD9, 0x8B, 0x78, 0xAB, 0x7C, 0x65, 0x04, 0x69, 0x49, 0x6C, 0x42, 0x8D, 0x48, 0x24,
+ 0x1C, 0xB7, 0x8A, 0x58, 0xAA, 0x18, 0x8E, 0xF3, 0xD1, 0x73, 0xB2, 0x20, 0xD9, 0x46, 0x0C, 0x5A,
+ 0xBE, 0x76, 0x2E, 0x86, 0x9F, 0xD5, 0x15, 0xA9, 0x7C, 0x24, 0x09, 0x05, 0x0F, 0xF0, 0x3E, 0xB9,
+ 0x9A, 0x12, 0x1A, 0xDC, 0x41, 0x5A, 0x9F, 0x50, 0x3C, 0x76, 0xE5, 0x21, 0x98, 0x33, 0x1A, 0xA1,
+ 0x90, 0x2C, 0xF0, 0x22, 0x1A, 0x3D, 0x20, 0x24, 0xC4, 0x96, 0xC9, 0x13, 0xD5, 0x8D, 0x81, 0x89,
+ 0xA1, 0x61, 0x88, 0xAA, 0xEC, 0x8C, 0xDC, 0x31, 0x7E, 0x3A, 0xFD, 0x6A, 0xBF, 0x8F, 0x97, 0x03,
+ 0x67, 0x58, 0x31, 0xD3, 0x2D, 0x63, 0xFC, 0x67, 0x8D, 0x14, 0xC3, 0xEB, 0xB7, 0xF8, 0x3E, 0x85,
+ 0xD3, 0x8F, 0x9E, 0xD7, 0xB4, 0x86, 0x3C, 0xDB, 0xD2, 0x5F, 0x0D, 0xD2, 0xB2, 0xD1, 0xFC, 0xA5,
+ 0x95, 0x4E, 0x80, 0x9E, 0x4E, 0x8D, 0x93, 0xAD, 0xB3, 0xCA, 0x8A, 0xE0, 0xBC, 0x54, 0x7F, 0xD6,
+ 0xB1, 0x74, 0xC0, 0xE8, 0x4A, 0xF5, 0xC7, 0x72, 0xA7, 0xB7, 0x42, 0x4D, 0xD9, 0x60, 0x15, 0xEB,
+ 0xB6, 0x29, 0x02, 0x1F, 0x83, 0x78, 0x58, 0x09, 0x9E, 0x50, 0xA3, 0x39, 0xC6, 0x22, 0x1E, 0xD1,
+ 0xE6, 0xB9, 0x5A, 0xA3, 0x6F, 0x80, 0x43, 0xA9, 0x58, 0x0B, 0x8C, 0x60, 0xF4, 0xC2, 0xD2, 0x0F,
+ 0x9C, 0x78, 0xFE, 0xB1, 0x33, 0x01, 0x67, 0xFF, 0xEC, 0x93, 0xC1, 0x6C, 0x77, 0x04, 0x1E, 0xD7,
+ 0xD2, 0x65, 0xDD, 0xF5, 0xAF, 0x6D, 0xC2, 0x04, 0x33, 0xF9, 0x38, 0x8F, 0xF3, 0xCF, 0x80, 0x7D,
+ 0x46, 0xFA, 0x53, 0x58, 0x30, 0xA6, 0x0B, 0x47, 0xAE, 0xF0, 0xCB, 0x31, 0xA2, 0xC2, 0xB4, 0xB9,
+ 0xA3, 0x8C, 0xA3, 0xAA, 0x48, 0xF5, 0x0E, 0x8E, 0x45, 0x92, 0x12, 0xFB, 0x17, 0x8F, 0xC3, 0x2C,
+ 0x8D, 0xA7, 0x93, 0x2A, 0xB3, 0x76, 0x7B, 0x8D, 0xE6, 0x66, 0xBF, 0x9A, 0x88, 0x64, 0x91, 0x2C,
+ 0xD5, 0x9D, 0xE6, 0x28, 0xD6, 0x91, 0x48, 0xAC, 0x5D, 0xCB, 0xE1, 0x9B, 0x1E, 0x9C, 0x73, 0xF4,
+ 0xCB, 0x54, 0x3D, 0x72, 0xED, 0xA0, 0xFA, 0x97, 0x00, 0xCB, 0x32, 0x69, 0xCC, 0xB7, 0x00, 0x61,
+ 0xE8, 0x97, 0x78, 0x79, 0xBA, 0x3D, 0x7B, 0x98, 0xA8, 0xBF, 0xA0, 0xF2, 0x3B, 0x23, 0x22, 0x02,
+ 0x10, 0x16, 0xB2, 0x93, 0xE1, 0x74, 0x95, 0x65, 0xE5, 0x5F, 0x53, 0xEC, 0x70, 0x9F, 0x9F, 0xB6,
+ 0xDD, 0x0B, 0xFF, 0xB4, 0x48, 0x34, 0x1F, 0xA1, 0xF6, 0xBF, 0x61, 0x36, 0x4B, 0xF2, 0xCD, 0xE4,
+ 0xD6, 0x88, 0x08, 0x4A, 0x17, 0xE9, 0x33, 0xC6, 0xCA, 0x44, 0xD6, 0x00, 0xA1, 0x6D, 0x2C, 0xFD,
+ 0x09, 0x80, 0x51, 0xB8, 0xDC, 0xA1, 0xF9, 0x7D, 0x55, 0x87, 0xE1, 0x52, 0x66, 0xF3, 0xA5, 0xF7,
+ 0x0E, 0x61, 0xFC, 0x7B, 0xA5, 0xC0, 0x26, 0x82, 0x37, 0x7A, 0x2D, 0xBF, 0xEA, 0x0E, 0xBD, 0xF3,
+ 0xCD, 0x50, 0x4C, 0x7E, 0x0F, 0xD2, 0xCC, 0x90, 0x81, 0x25, 0x28, 0xAF, 0xD5, 0x7E, 0x89, 0xA5,
+ 0xA8, 0x18, 0x2C, 0x6B, 0x53, 0x07, 0x51, 0xE5, 0x09, 0x07, 0x3E, 0xCF, 0x58, 0xB8, 0x49, 0xCA,
+ 0xE7, 0xA3, 0x36, 0x88, 0xAD, 0x46, 0xF4, 0x8F, 0xA9, 0x55, 0x53, 0x02, 0xED, 0x8D, 0xFE, 0x50,
+ 0x20, 0xD6, 0x5E, 0xD4, 0xEB, 0x2B, 0x34, 0x3D, 0x04, 0x84, 0x39, 0x20, 0x16, 0xCD, 0xDF, 0x40,
+ 0x06, 0x2E, 0xE1, 0xB7, 0x81, 0x13, 0xE3, 0xC2, 0x94, 0x5A, 0xFF, 0xE4, 0x4D, 0xBC, 0x1A, 0x80,
+ 0x9A, 0x17, 0xBD, 0x1C, 0xD3, 0x2B, 0x3C, 0xDE, 0xE4, 0x77, 0xA6, 0x59, 0x48, 0x5A, 0x1C, 0xE1,
+ 0x81, 0x89, 0xAF, 0x34, 0xBC, 0x2F, 0xC2, 0x69, 0x39, 0x9E, 0xE9, 0xEF, 0x9B, 0x72, 0x56, 0x19,
+ 0x90, 0x5E, 0x54, 0x09, 0xF7, 0x5D, 0xBF, 0x04, 0x4F, 0x4D, 0x9A, 0x0B, 0x93, 0x55, 0x09, 0xDB,
+ 0x63, 0xB1, 0xF3, 0x7C, 0xD8, 0xB0, 0x8A, 0x69, 0x43, 0x1E, 0x11, 0x3B, 0x57, 0x6C, 0x0B, 0x04,
+ 0xC8, 0x38, 0xFF, 0x1F, 0x11, 0x07, 0xF7, 0x05, 0x9E, 0x15, 0x3E, 0xF9, 0x37, 0x34, 0x66, 0x33,
+ 0x0B, 0x33, 0x01, 0xBE, 0x7B, 0xD6, 0xDA, 0x54, 0x38, 0xA9, 0x5B, 0x82, 0x83, 0xCC, 0x91, 0xD4,
+ 0x89, 0xA2, 0x3F, 0x88, 0x46, 0x4A, 0x38, 0xE7, 0x23, 0x03, 0xCB, 0x80, 0x3B, 0xFA, 0xFE, 0xB9,
+ 0x1E, 0xE9, 0x2D, 0x3C, 0x64, 0x60, 0x2D, 0xB6, 0xAC, 0xBA, 0xAB, 0xD6, 0x51, 0x15, 0xB2, 0x1A,
+ 0xB6, 0x98, 0xBB, 0x67, 0x2D, 0x04, 0xBB, 0x78, 0x6D, 0xE5, 0xFB, 0x95, 0x8B, 0xE5, 0xCC, 0xAD,
+ 0xE4, 0x15, 0xBB, 0x5F, 0xF0, 0x56, 0x41, 0x06, 0x4D, 0x21, 0x10, 0x61, 0x3C, 0x63, 0xAC, 0x59,
+ 0x83, 0x2D, 0x4F, 0x0E, 0x52, 0xDB, 0x0A, 0x9D, 0x3B, 0xCB, 0x61, 0xAA, 0x4D, 0x84, 0xB2, 0xC2,
+ 0xFC, 0x7E, 0x67, 0xD3, 0x86, 0x3E, 0x83, 0xF2, 0x6B, 0x1C, 0x8D, 0xD2, 0x6C, 0x55, 0x80, 0x14,
+ 0x54, 0xC9, 0x14, 0x7E, 0x14, 0xD9, 0x2A, 0xEE, 0x53, 0xAE, 0xB8, 0x27, 0xB3, 0x34, 0x02, 0xD2,
+ 0xFE, 0xA3, 0xC8, 0x75, 0x81, 0x6E, 0xC7, 0xCE, 0x83, 0xD5, 0xCB, 0xDF, 0x5C, 0xED, 0xD2, 0x5A,
+ 0xCC, 0xA9, 0x4E, 0xD1, 0x0A, 0x50, 0x0C, 0x9D, 0x84, 0x79, 0x84, 0x6D, 0xA4, 0x41, 0x53, 0x69,
+ 0x0E, 0x6C, 0x7D, 0x19, 0x66, 0x1D, 0x05, 0xCE, 0xF8, 0xBE, 0xCC, 0xF8, 0xC5, 0x22, 0x0B, 0x8A,
+ 0x12, 0xC1, 0xB6, 0xF1, 0x96, 0xC7, 0xEA, 0xDC, 0xAE, 0x8D, 0xE9, 0x4A, 0x88, 0x8B, 0xC0, 0xA9,
+ 0xBD, 0xE7, 0xA4, 0x61, 0x3C, 0xE7, 0x8A, 0xB5, 0x60, 0x5C, 0xA3, 0x02, 0x63, 0x6A, 0x3D, 0xE3,
+ 0xBB, 0x25, 0x62, 0xA6, 0xC1, 0xFA, 0x37, 0x10, 0x51, 0x24, 0x85, 0x7A, 0x2F, 0x03, 0x07, 0x35,
+ 0x0E, 0xDF, 0xFE, 0xA1, 0x81, 0x06, 0xCC, 0xC4, 0xBA, 0xFA, 0xE7, 0x92, 0x1E, 0xCA, 0xB2, 0x2C,
+ 0x69, 0x92, 0xAD, 0x10, 0xDF, 0x14, 0xBA, 0xC0, 0xD1, 0xE0, 0x80, 0x56, 0x63, 0xF7, 0x02, 0x63,
+ 0x9B, 0x2C, 0xEA, 0xE6, 0x07, 0x14, 0x77, 0x30, 0xD9, 0x9A, 0xA5, 0xEF, 0xE8, 0xF1, 0x69, 0xA9,
+ 0x8B, 0x74, 0xD6, 0xCB, 0x4A, 0xAB, 0x3E, 0xD0, 0x05, 0xCF, 0xC7, 0xCB, 0x5F, 0x77, 0x61, 0x0B,
+ 0xF3, 0xEF, 0x84, 0x42, 0x63, 0x1A, 0x08, 0x90, 0x38, 0xCC, 0xCC, 0x77, 0x73, 0xF4, 0x10, 0x16,
+ 0x3B, 0x88, 0x6A, 0x36, 0x7F, 0x3D, 0x1B, 0x47, 0xA8, 0x43, 0x13, 0xDE, 0x0F, 0x3E, 0xF8, 0x32,
+ 0xEB, 0xE0, 0x13, 0x3F, 0xE9, 0x45, 0x64, 0x17, 0xAD, 0x1D, 0x94, 0x00, 0x89, 0x5B, 0xDD, 0x1B,
+ 0xD8, 0xCC, 0x3C, 0x2A, 0x48, 0xB3, 0xF8, 0xB8, 0xF1, 0xC1, 0x3D, 0x36, 0x45, 0xB6, 0xDC, 0x29,
+ 0x47, 0x8F, 0x1D, 0x5B, 0x3C, 0x11, 0xF1, 0xEC, 0xA0, 0xB6, 0x74, 0xBF, 0xF0, 0x55, 0xC6, 0x52,
+ 0x65, 0x24, 0x6E, 0x75, 0xE5, 0xC0, 0x3D, 0xE1, 0x34, 0x50, 0xB2, 0xB1, 0xD2, 0xC4, 0x69, 0xAB,
+ 0x31, 0xB5, 0xFD, 0x10, 0xAD, 0x10, 0x00, 0x18, 0x87, 0x0B, 0x63, 0xEC, 0x74, 0x72, 0x07, 0xCC,
+ 0x6B, 0xD8, 0x46, 0x69, 0x4A, 0x3A, 0xD1, 0x2B, 0x25, 0x6C, 0xF7, 0x45, 0x84, 0x1D, 0x97, 0x63,
+ 0x70, 0x68, 0xF4, 0x8B, 0x33, 0x4A, 0xE5, 0x16, 0x81, 0xD2, 0x50, 0x2B, 0xD8, 0x51, 0xEC, 0x33,
+ 0xDB, 0xC8, 0xC0, 0x50, 0xE3, 0xF0, 0x1B, 0x57, 0xFC, 0xC9, 0x7D, 0x7A, 0xC4, 0xA4, 0xF3, 0x39,
+ 0x73, 0xAB, 0xAE, 0x42, 0x71, 0x4B, 0xF0, 0xD1, 0xAD, 0xF4, 0x67, 0x3A, 0x9E, 0xFD, 0xA9, 0xA7,
+ 0x22, 0xF9, 0x06, 0x93, 0xEE, 0xBA, 0x96, 0xB4, 0x31, 0x69, 0x41, 0x8A, 0x6D, 0x8D, 0x7C, 0xBA,
+ 0x03, 0xBB, 0x56, 0x91, 0xAA, 0x63, 0x58, 0xC0, 0x99, 0x61, 0xF8, 0x83, 0x65, 0x9D, 0x0B, 0x95,
+ 0x64, 0x6D, 0xD6, 0x24, 0x9D, 0x52, 0x6F, 0x4A, 0x46, 0xDD, 0x77, 0x09, 0x10, 0x4B, 0x4F, 0x94,
+ 0x82, 0x3E, 0xA6, 0xB4, 0x48, 0xE9, 0x9D, 0x5E, 0x8D, 0x79, 0x36, 0xDD, 0x4A, 0xF4, 0x23, 0x79,
+ 0x10, 0x38, 0xF4, 0x4D, 0x53, 0xA4, 0xB9, 0xD1, 0xC3, 0xF3, 0x79, 0x31, 0xC3, 0x63, 0xBD, 0x71,
+ 0x0B, 0x6A, 0x0C, 0x5F, 0x08, 0x6E, 0xB5, 0x36, 0x89, 0x03, 0x16, 0x5D, 0x26, 0xCE, 0x9C, 0xBF,
+ 0x8F, 0x7E, 0x8D, 0x9A, 0x0B, 0x01, 0x77, 0xD1, 0x94, 0xA9, 0x39, 0x04, 0x20, 0x02, 0xF0, 0x90,
+ 0x4A, 0x89, 0xF0, 0x6F, 0x22, 0xD9, 0xC5, 0x05, 0xDD, 0x2A, 0xB7, 0xDA, 0x78, 0x9A, 0x2C, 0xEB,
+ 0xA0, 0x43, 0xE8, 0xAB, 0x82, 0xA4, 0xF2, 0x5F, 0xA2, 0xFA, 0xC3, 0x30, 0x3E, 0x75, 0xCE, 0x2A,
+ 0xFC, 0x5B, 0x46, 0x87, 0x94, 0xC8, 0x6E, 0x3A, 0x97, 0x07, 0x31, 0x1D, 0x80, 0xE0, 0xD8, 0xC7,
+ 0x80, 0x43, 0x47, 0xC5, 0xA3, 0xBD, 0xFA, 0x47, 0x6B, 0x09, 0x21, 0xF8, 0x2D, 0xA0, 0xFE, 0x41,
+ 0x78, 0xC1, 0x44, 0x54, 0xE5, 0xAD, 0x1E, 0xCF, 0x9B, 0x67, 0xED, 0x27, 0x5C, 0x76, 0x1A, 0x16,
+ 0x08, 0x8A, 0x70, 0x7D, 0x74, 0x93, 0x0B, 0x01, 0x7A, 0x3E, 0x5E, 0x15, 0xBD, 0x4B, 0xFC, 0x29,
+ 0x34, 0x11, 0x43, 0x95, 0x0F, 0xE7, 0x50, 0xCC, 0xAD, 0xE3, 0xD4, 0x1F, 0x53, 0x5B, 0x85, 0x52,
+ 0x72, 0x3C, 0x65, 0x2F, 0xFA, 0x34, 0xD7, 0x1C, 0xAF, 0x81, 0x74, 0x7F, 0xCD, 0x2C, 0x14, 0x08,
+ 0xD6, 0x72, 0xA6, 0xBF, 0x7F, 0x5B, 0x23, 0x74, 0x55, 0xFD, 0xBF, 0x58, 0x4C, 0x1F, 0x26, 0x4C,
+ 0x77, 0xDA, 0x0B, 0x11, 0xDD, 0x11, 0x99, 0x10, 0xB6, 0x9A, 0xE5, 0x77, 0xA5, 0x63, 0x81, 0xF7,
+ 0x2B, 0x9D, 0x8E, 0xD1, 0xFE, 0xF8, 0x8D, 0x8E, 0x24, 0x12, 0x5B, 0x7D, 0x3A, 0xDD, 0x49, 0xAD,
+ 0x06, 0xEE, 0x1F, 0x8C, 0x95, 0x9A, 0x8F, 0x2C, 0xEF, 0xF5, 0x85, 0x61, 0xAF, 0x09, 0xB0, 0x27,
+ 0x16, 0x48, 0xC6, 0x37, 0x2D, 0x0A, 0x17, 0xC4, 0xDA, 0x53, 0x51, 0xEB, 0x42, 0x95, 0xCA, 0x14,
+ 0x32, 0x93, 0x5B, 0x40, 0x92, 0x08, 0x6A, 0xE9, 0xB3, 0x66, 0x9D, 0xE0, 0x81, 0x57, 0x9A, 0x38,
+ 0x4A, 0x23, 0xFE, 0x8F, 0x02, 0x65, 0x33, 0x35, 0x55, 0xB8, 0xB2, 0x34, 0x9D, 0xD2, 0xDC, 0xD7,
+ 0xF4, 0x19, 0x1D, 0x83, 0x2A, 0x91, 0xF0, 0x84, 0xD6, 0x7F, 0x45, 0x63, 0x6E, 0x4F, 0x0E, 0x7E,
+ 0x59, 0xBC, 0x22, 0x92, 0xD4, 0xC5, 0xCF, 0xE8, 0xED, 0x15, 0x8C, 0xB5, 0xAA, 0x43, 0x17, 0xE0,
+ 0x46, 0x04, 0x7A, 0x80, 0x15, 0x0A, 0x40, 0xE8, 0x6E, 0x4E, 0x53, 0x10, 0x7E, 0xB1, 0x71, 0x43,
+ 0x20, 0x14, 0xA3, 0xF5, 0xD2, 0x04, 0x37, 0x90, 0xA8, 0xBF, 0x4C, 0x4E, 0x1E, 0xB7, 0xCE, 0x0F,
+ 0x0C, 0xD1, 0x82, 0x64, 0x4B, 0x79, 0x47, 0x12, 0xE6, 0x7A, 0x4E, 0xC1, 0xAD, 0xFD, 0xFE, 0x31,
+ 0x09, 0x36, 0x41, 0x24, 0x0A, 0xCF, 0x20, 0x0C, 0xC3, 0x04, 0x57, 0x39, 0xDD, 0x9C, 0x3E, 0x2E,
+ 0xED, 0xAD, 0x96, 0x20, 0xBD, 0xC6, 0xB7, 0x18, 0xEC, 0x03, 0x2E, 0xFC, 0x45, 0x93, 0xD2, 0x09,
+ 0x13, 0xAE, 0xB8, 0x22, 0xFB, 0x4B, 0xB4, 0x7D, 0x0F, 0x5E, 0x9F, 0xE1, 0xFB, 0x94, 0xA4, 0xC7,
+ 0x07, 0x9E, 0x72, 0x48, 0x7F, 0xEC, 0xC5, 0x0A, 0x19, 0xD5, 0x54, 0x2B, 0x77, 0x16, 0x0A, 0xDC,
+ 0x22, 0xC7, 0x03, 0x12, 0x9E, 0x11, 0xAC, 0x70, 0x44, 0x1D, 0xA4, 0xC5, 0xE2, 0x19, 0x9B, 0xE3,
+ 0xDC, 0x05, 0x36, 0x30, 0x92, 0xCC, 0xC3, 0xF7, 0xCF, 0xD5, 0x67, 0x3C, 0xF7, 0x99, 0x37, 0x16,
+ 0xB3, 0x38, 0x38, 0xEE, 0x66, 0x7C, 0x80, 0xFD, 0x02, 0x94, 0xFA, 0x1F, 0x10, 0xD9, 0xA8, 0x45,
+ 0x58, 0x91, 0x85, 0xDA, 0x1F, 0xF2, 0x6B, 0xE3, 0x8F, 0x09, 0xB8, 0xA1, 0x17, 0xA2, 0xF0, 0x75,
+ 0x5B, 0x5D, 0xEC, 0x39, 0x86, 0x0C, 0x88, 0xAE, 0xF6, 0x99, 0x7F, 0x55, 0x70, 0x52, 0xF0, 0x63,
+ 0x66, 0x75, 0x80, 0xF4, 0x87, 0x13, 0x01, 0x26, 0x82, 0x39, 0xE3, 0x2F, 0xE2, 0x5F, 0xCF, 0xFC,
+ 0x22, 0x28, 0xE9, 0x75, 0x8F, 0xCD, 0x7A, 0x03, 0x77, 0xB0, 0x4E, 0x19, 0x03, 0x73, 0x2B, 0xFB,
+ 0x87, 0xF4, 0x94, 0x18, 0xF8, 0xF7, 0xCB, 0x94, 0x7C, 0xB9, 0x54, 0xD5, 0xED, 0xC5, 0x47, 0x3B,
+ 0x12, 0xA1, 0x65, 0x05, 0x39, 0x45, 0x5A, 0x51, 0x75, 0x3B, 0xC8, 0x84, 0x6F, 0x1F, 0x5D, 0x6C,
+ 0x7E, 0xBE, 0xE2, 0x42, 0x1A, 0xD8, 0x74, 0x0D, 0x17, 0x62, 0x9B, 0xBE, 0xDF, 0x55, 0x15, 0x50,
+ 0xC4, 0xDF, 0x95, 0x92, 0x9D, 0xCD, 0xA2, 0x3F, 0x38, 0x5C, 0x09, 0x51, 0xBB, 0xF4, 0xD8, 0xE9,
+ 0xEF, 0xB0, 0x88, 0x0C, 0x92, 0x7F, 0xCB, 0x01, 0x91, 0x13, 0x7A, 0x44, 0xA1, 0x98, 0x2E, 0x0E,
+ 0x12, 0x63, 0xA7, 0xBC, 0xD3, 0x0C, 0x07, 0xE0, 0xD4, 0x72, 0xF5, 0x45, 0xCE, 0x44, 0x4D, 0xF8,
+ 0x76, 0xF9, 0x1A, 0x1C, 0xF5, 0x80, 0xB2, 0x93, 0x23, 0x93, 0x9B, 0xEE, 0x99, 0x35, 0xE4, 0xBB,
+ 0xE9, 0x4D, 0x72, 0xFC, 0xA0, 0xE6, 0x7B, 0x27, 0x67, 0x11, 0x88, 0x9B, 0xAA, 0x38, 0x8D, 0x6C,
+ 0x33, 0x52, 0x5D, 0xD6, 0x22, 0xF4, 0xBC, 0xD1, 0xCD, 0x9C, 0x74, 0x3A, 0xEA, 0x2B, 0xB0, 0x20,
+ 0x2E, 0xAA, 0x75, 0xF2, 0xD6, 0xDA, 0xFB, 0x93, 0xDB, 0x71, 0xB6, 0x07, 0xD9, 0x85, 0xCA, 0xBB,
+ 0x45, 0x97, 0x00, 0x42, 0xA8, 0xD1, 0xA3, 0x44, 0x13, 0x66, 0xAF, 0x0A, 0xA0, 0xEB, 0x2F, 0xA3,
+ 0x27, 0x64, 0x78, 0x46, 0x9C, 0xE4, 0x99, 0xA5, 0x47, 0x96, 0xC1, 0xD1, 0x99, 0x5C, 0x9A, 0x6A,
+ 0xBA, 0x5E, 0xC6, 0xBA, 0xEB, 0x63, 0x19, 0x6F, 0xC9, 0xDB, 0x36, 0xD8, 0xAD, 0x58, 0x44, 0x30,
+ 0x8F, 0x59, 0x19, 0x42, 0xAF, 0x6A, 0x1B, 0x8A, 0xC9, 0xA2, 0xAE, 0x00, 0x5D, 0x5A, 0x09, 0x33,
+ 0xAC, 0x02, 0xDA, 0x64, 0xAF, 0xDD, 0xDF, 0x15, 0x2A, 0xA2, 0xD2, 0xA1, 0xA6, 0x93, 0x5C, 0xE1,
+ 0x10, 0xC3, 0x6A, 0x10, 0xA5, 0x97, 0x2D, 0x6D, 0xD9, 0xA9, 0xB5, 0x36, 0x71, 0x54, 0xC4, 0xEF,
+ 0xC8, 0xC6, 0x17, 0x30, 0xDD, 0xCF, 0x96, 0x86, 0xC8, 0x63, 0x60, 0x21, 0xAB, 0x3D, 0xBA, 0x40,
+ 0x8F, 0x30, 0x16, 0xBE, 0xD9, 0xDF, 0x7E, 0x13, 0xCB, 0xBF, 0xF7, 0x0E, 0x33, 0x31, 0x18, 0xED,
+ 0x1E, 0x47, 0xD8, 0xF2, 0xCF, 0x42, 0xC8, 0xF3, 0x2C, 0x20, 0x00, 0xB1, 0x8F, 0xB9, 0x1F, 0xEA,
+ 0x82, 0x11, 0x03, 0x8D, 0xB5, 0x25, 0xB4, 0x84, 0x79, 0x97, 0xDC, 0x56, 0x3C, 0x8B, 0x41, 0x9A,
+ 0x01, 0x63, 0x7A, 0xF7, 0x66, 0x0F, 0x05, 0xF7, 0x4A, 0xDC, 0x05, 0x03, 0x29, 0x5C, 0xF1, 0x89,
+ 0x8D, 0x38, 0x19, 0x48, 0x38, 0xBE, 0x82, 0xCD, 0x04, 0x16, 0xEC, 0xD6, 0x68, 0xB8, 0x00, 0x3D,
+ 0xC6, 0x6E, 0xDA, 0x10, 0x0F, 0x12, 0x19, 0x18, 0xAE, 0x24, 0x29, 0x2E, 0xD1, 0x5D, 0xD3, 0xA2,
+ 0x7A, 0x8A, 0x10, 0x20, 0xB5, 0x8A, 0xD4, 0x41, 0x66, 0x8E, 0x00, 0x9E, 0x29, 0x11, 0x3A, 0xBD,
+ 0xEA, 0x66, 0xA6, 0x18, 0x87, 0xD3, 0xEE, 0x0F, 0x17, 0xE5, 0x5B, 0xB9, 0x16, 0x56, 0x22, 0xDD,
+ 0x9C, 0xB6, 0x02, 0xBD, 0x6C, 0x19, 0xBA, 0x85, 0x1F, 0x44, 0xB7, 0x88, 0x43, 0x45, 0xBE, 0x29,
+ 0x65, 0xA2, 0xBE, 0xC1, 0x4E, 0xCF, 0x25, 0x53, 0xD6, 0xC2, 0x53, 0x59, 0xF9, 0xA3, 0xC3, 0x52,
+ 0x9C, 0xEE, 0xE0, 0x92, 0x39, 0x20, 0x97, 0xA0, 0xF7, 0x8C, 0x58, 0x8B, 0x7A, 0xEA, 0x05, 0x7B,
+ 0x6B, 0x92, 0x65, 0xAC, 0x63, 0x9C, 0x11, 0x06, 0xB5, 0x2F, 0xC2, 0x5D, 0x97, 0x55, 0x88, 0x25,
+ 0x3C, 0x37, 0xE8, 0x8D, 0xBE, 0xB2, 0x3C, 0xFB, 0xC5, 0x0D, 0xD9, 0x6B, 0xA6, 0x7F, 0xD4, 0xD7,
+ 0xB9, 0xB8, 0x56, 0xC3, 0x9B, 0xA0, 0x75, 0x7B, 0x3D, 0x5D, 0xF4, 0x53, 0xED, 0xF7, 0xBF, 0xA7,
+ 0xD9, 0xD8, 0x0C, 0x14, 0x4F, 0xD6, 0xA4, 0xAC, 0xB3, 0x33, 0x44, 0x62, 0x04, 0x52, 0xB4, 0xA2,
+ 0xE3, 0x1E, 0x46, 0x73, 0x78, 0x92, 0x66, 0x24, 0xEB, 0x43, 0x46, 0xEC, 0x6C, 0x1D, 0x7B, 0xA1,
+ 0x0B, 0x55, 0xCB, 0xA1, 0xF7, 0x7F, 0xCA, 0x78, 0x46, 0x22, 0x8F, 0xD7, 0xB2, 0x42, 0x86, 0x4A,
+ 0xE9, 0xCC, 0xFC, 0x77, 0x88, 0x84, 0x95, 0x0A, 0x24, 0x8B, 0xB5, 0xC2, 0x66, 0x6B, 0xA3, 0x91,
+ 0x47, 0xFD, 0x5B, 0x87, 0x9B, 0xE0, 0xBF, 0xB0, 0x49, 0x38, 0xD9, 0x6D, 0x05, 0x7A, 0x53, 0xFF,
+ 0xDC, 0xE8, 0x9C, 0xB9, 0xAF, 0x59, 0xFD, 0xE5, 0xD4, 0xE3, 0x3A, 0x58, 0xCD, 0xA7, 0x9C, 0x6F,
+ 0xE0, 0x19, 0x17, 0xB4, 0x14, 0xFD, 0x16, 0xD5, 0x39, 0x77, 0x8F, 0xCE, 0x7F, 0xC0, 0xF1, 0x5F,
+ 0xE1, 0x69, 0x26, 0x89, 0x4C, 0x43, 0xCA, 0xD7, 0x37, 0x51, 0x12, 0x6B, 0x45, 0x3D, 0x8B, 0xD9,
+ 0xD7, 0x8B, 0xDB, 0x22, 0x33, 0x79, 0x34, 0x56, 0xE7, 0xDC, 0x00, 0xBD, 0xD1, 0x98, 0x52, 0xAC,
+ 0x1D, 0x47, 0x69, 0xFF, 0x88, 0xBF, 0x15, 0x3F, 0x7D, 0xDF, 0x12, 0x26, 0xF7, 0x1F, 0xBD, 0xD4,
+ 0x13, 0x52, 0x86, 0xB5, 0x2F, 0x4F, 0x0F, 0xD2, 0x44, 0x6A, 0xB7, 0x71, 0x67, 0x69, 0x2E, 0x76,
+ 0x56, 0x82, 0xFA, 0x88, 0x8B, 0xE2, 0x80, 0x45, 0x31, 0x4E, 0xE8, 0xEF, 0xFC, 0x48, 0xEA, 0x2E,
+ 0x10, 0x9C, 0x73, 0x12, 0x89, 0xA6, 0x17, 0x3A, 0xFE, 0x2E, 0x4C, 0x33, 0x97, 0x54, 0x3C, 0x8D,
+ 0x0F, 0xAC, 0xA5, 0xD0, 0x71, 0x62, 0x73, 0x97, 0xF8, 0xED, 0xD5, 0xCF, 0xC5, 0x18, 0x67, 0x1A,
+ 0x1C, 0xE2, 0xA6, 0x2E, 0xD1, 0x51, 0x74, 0x57, 0xD3, 0xE8, 0x6E, 0x60, 0x00, 0x96, 0x2D, 0x3E,
+ 0x7F, 0xD3, 0x05, 0xB0, 0x22, 0xC2, 0x0F, 0xF4, 0x69, 0x73, 0xAF, 0xC2, 0x02, 0x22, 0x40, 0xF9,
+ 0x6F, 0x35, 0x13, 0x04, 0xA4, 0x48, 0xD3, 0xE7, 0xEE, 0x88, 0xC4, 0x03, 0xD5, 0x0D, 0x90, 0x48,
+ 0x97, 0x8A, 0x9D, 0x12, 0x02, 0xE9, 0x04, 0xD4, 0x2A, 0xA6, 0x13, 0xF6, 0x04, 0x3C, 0x76, 0x0D,
+ 0x37, 0xBB, 0xF5, 0x8A, 0x12, 0x04, 0x3A, 0xFE, 0xAC, 0xA7, 0x8D, 0xB8, 0x6E, 0xC4, 0xA5, 0x26,
+ 0x84, 0xFF, 0xEA, 0x81, 0x8D, 0x33, 0x2D, 0xF0, 0x9D, 0x0B, 0xFB, 0x04, 0x7B, 0x46, 0x71, 0x57,
+ 0xA0, 0x24, 0xD9, 0xF6, 0x8A, 0x44, 0x16, 0xE1, 0x7F, 0x28, 0xD2, 0xC5, 0xC2, 0xEF, 0x8D, 0xA9,
+ 0x63, 0x8B, 0x6B, 0x98, 0x50, 0x1A, 0xB4, 0x66, 0xFB, 0xCD, 0x3D, 0x1E, 0x79, 0x86, 0x22, 0xA3,
+ 0xB3, 0x78, 0xBF, 0x0D, 0x2E, 0x66, 0x45, 0x0A, 0xA0, 0x58, 0xE9, 0x4D, 0x52, 0x5E, 0x9E, 0x07,
+ 0xAD, 0x05, 0x3D, 0x35, 0x17, 0xA2, 0x65, 0x0C, 0xFE, 0x80, 0x56, 0x81, 0x8C, 0x5D, 0x08, 0x0B,
+ 0x15, 0x75, 0x0E, 0x88, 0x19, 0x34, 0x2D, 0xB7, 0x88, 0x92, 0x6C, 0xC9, 0xF3, 0xDF, 0x19, 0xB6,
+ 0x6D, 0xAB, 0x58, 0x13, 0x6E, 0xCE, 0xC9, 0x9A, 0x07, 0xF9, 0x34, 0x9C, 0x5C, 0x9E, 0x33, 0x8F,
+ 0x11, 0xCA, 0xA5, 0x1D, 0xD4, 0xDA, 0xC7, 0x8C, 0x3B, 0x61, 0xBF, 0x8D, 0xCB, 0x69, 0xFF, 0x36,
+ 0x8E, 0x0C, 0xAD, 0xF4, 0x32, 0xC3, 0x20, 0x57, 0xCE, 0x19, 0xAD, 0x61, 0xB0, 0x2C, 0xB0, 0xCD,
+ 0xA4, 0xBD, 0xE0, 0xFC, 0x73, 0x3F, 0xA6, 0xE9, 0x72, 0x6E, 0xB8, 0x84, 0x2F, 0x6A, 0xE8, 0xAF,
+ 0x58, 0xC6, 0x64, 0xD7, 0xA0, 0x3F, 0x36, 0x63, 0x95, 0x72, 0x06, 0x8B, 0xA7, 0xE5, 0xB4, 0x25,
+ 0xC7, 0xB7, 0xB7, 0xBD, 0xFA, 0xF2, 0xCD, 0x28, 0xDD, 0xC2, 0x80, 0x7B, 0x45, 0xFA, 0x8D, 0xCF,
+ 0xD2, 0x5E, 0xB8, 0x0C, 0xA1, 0x40, 0xC7, 0x40, 0xCB, 0x0D, 0xF4, 0x61, 0xAC, 0x20, 0x45, 0x58,
+ 0xB7, 0x56, 0x2A, 0xE6, 0x2E, 0x64, 0xFF, 0xC3, 0xC7, 0xE1, 0xF6, 0xB3, 0xE8, 0x42, 0x3F, 0xB5,
+ 0x26, 0x4F, 0x49, 0x02, 0x39, 0x91, 0x2C, 0x49, 0x70, 0xDA, 0x87, 0x86, 0xA4, 0x29, 0x36, 0x62,
+ 0xF8, 0x2F, 0xBD, 0xD0, 0xF1, 0x0B, 0xD3, 0xEB, 0x8A, 0x68, 0x13, 0xD6, 0x9C, 0xC8, 0x78, 0x28,
+ 0xBD, 0xAA, 0xDF, 0xEA, 0x72, 0xCD, 0x03, 0x83, 0xE9, 0xBB, 0x3C, 0x6F, 0x75, 0x1F, 0xAF, 0x67,
+ 0x47, 0x5E, 0x01, 0xC1, 0x88, 0xE9, 0x9B, 0xB0, 0xF9, 0x65, 0xF6, 0x8D, 0x79, 0x2A, 0xA9, 0xC9,
+ 0x3C, 0xF3, 0x24, 0x19, 0x22, 0x81, 0x32, 0x9E, 0xBE, 0xFA, 0xB4, 0x53, 0x17, 0x64, 0x02, 0x8C,
+ 0x7C, 0x18, 0x21, 0x01, 0xF2, 0x14, 0xE8, 0x6E, 0xAE, 0x3E, 0xAE, 0x60, 0xB1, 0x4C, 0x51, 0x9B,
+ 0xBA, 0x28, 0x24, 0xA0, 0xB9, 0xFC, 0xEA, 0xE5, 0x9C, 0xA7, 0x18, 0xE2, 0x35, 0x05, 0x07, 0x19,
+ 0xAD, 0xE8, 0x02, 0x71, 0x17, 0x53, 0x20, 0x4A, 0xCD, 0x33, 0xC6, 0xB3, 0x70, 0x9F, 0x46, 0x24,
+ 0xEB, 0xA8, 0x18, 0x24, 0x99, 0xD4, 0x87, 0x16, 0x00, 0xBE, 0xF4, 0x41, 0x6C, 0xBF, 0x45, 0xE3,
+ 0xF7, 0x6F, 0xD1, 0x0A, 0x4A, 0x6A, 0x23, 0x5D, 0x0B, 0xFA, 0xB5, 0x71, 0x97, 0xE2, 0x6B, 0xD3,
+ 0x81, 0xB9, 0x49, 0xBC, 0xC4, 0x3C, 0xB2, 0x0C, 0x15, 0x77, 0x8E, 0x5A, 0xC0, 0x89, 0x5F, 0x9A,
+ 0x93, 0x9A, 0x75, 0xB2, 0xA4, 0xE2, 0x7E, 0x5A, 0x9C, 0x0A, 0x7E, 0x8C, 0xDD, 0x9F, 0x31, 0x10,
+ 0x95, 0x8D, 0x57, 0x0E, 0xB7, 0xDD, 0x8B, 0xE7, 0x39, 0xAC, 0x79, 0x11, 0x51, 0x3C, 0xBB, 0x21,
+ 0x58, 0xD7, 0x23, 0xFA, 0x63, 0xFD, 0x21, 0x85, 0x3F, 0x5F, 0x85, 0xF0, 0x3C, 0xF8, 0xE9, 0x40,
+ 0x72, 0x92, 0x79, 0xCF, 0x21, 0x14, 0xED, 0xAB, 0xB9, 0xC3, 0xCF, 0x10, 0x85, 0x28, 0x3B, 0x81,
+ 0xB6, 0x6E, 0x99, 0x18, 0x7C, 0xD9, 0x36, 0x11, 0x22, 0x6C, 0xF8, 0x83, 0xB2, 0x51, 0xD3, 0xF7,
+ 0x42, 0x37, 0xD4, 0xBA, 0x85, 0xB7, 0x9E, 0x6C, 0x61, 0xB3, 0xDB, 0x6F, 0x79, 0xF2, 0x34, 0xA7,
+ 0x29, 0x3C, 0xE9, 0x2B, 0x2B, 0x0B, 0xF4, 0x5F, 0x47, 0x96, 0x14, 0x36, 0xA4, 0x2F, 0x67, 0x54,
+ 0x77, 0x48, 0x2B, 0x5F, 0x4A, 0x1F, 0xB2, 0xE5, 0xFF, 0x38, 0xE4, 0xE2, 0xAE, 0x76, 0xB1, 0x66,
+ 0x7F, 0x01, 0xE8, 0x31, 0xA4, 0x24, 0xBA, 0x95, 0xAB, 0x0A, 0x9B, 0x1F, 0xC4, 0x04, 0x59, 0x9C,
+ 0x0D, 0xD0, 0x3D, 0x2E, 0x7F, 0xCE, 0xBE, 0xD2, 0x93, 0x2A, 0xB0, 0x95, 0x22, 0xA5, 0xE9, 0xE4,
+ 0xCA, 0xE2, 0x49, 0x15, 0xDF, 0x64, 0x65, 0xE4, 0xE5, 0xC8, 0x65, 0xA3, 0x18, 0x53, 0x36, 0xD4,
+ 0x8B, 0xC7, 0x97, 0xE1, 0x4E, 0xD9, 0x92, 0xE7, 0x4A, 0x01, 0x2F, 0x93, 0xB0, 0x09, 0x40, 0x4E,
+ 0x5A, 0x58, 0x7F, 0x2D, 0xDB, 0x7E, 0xA5, 0xAB, 0x8A, 0xA1, 0xFD, 0x4C, 0x9C, 0x55, 0x0F, 0x47,
+ 0x64, 0x02, 0x80, 0xCB, 0x57, 0x50, 0xEC, 0xFE, 0xB7, 0xDC, 0xD2, 0x21, 0xD7, 0x0B, 0xF5, 0x0F,
+ 0xD3, 0xB2, 0x10, 0xDF, 0x8D, 0x8B, 0x91, 0xE0, 0x9C, 0x44, 0x59, 0x0E, 0x08, 0xF2, 0xAB, 0x94,
+ 0x75, 0xF3, 0x56, 0x96, 0xF0, 0x3E, 0x65, 0xA0, 0xBA, 0x4C, 0x10, 0x20, 0xB7, 0xF4, 0x2E, 0xEC,
+ 0xE2, 0xC4, 0x03, 0x7D, 0xFB, 0xD9, 0x79, 0xCC, 0x88, 0x1F, 0x77, 0xE8, 0x9D, 0x1B, 0x89, 0xCD,
+ 0xBB, 0x3D, 0x63, 0x3D, 0xCC, 0x95, 0x8C, 0xFA, 0x5C, 0x79, 0xC2, 0xE1, 0x83, 0x64, 0xE0, 0xB3,
+ 0x52, 0x38, 0x90, 0x49, 0x2A, 0x02, 0x1A, 0x9F, 0x85, 0xC4, 0x45, 0x59, 0xE2, 0xE1, 0xF6, 0x7B,
+ 0x61, 0xAF, 0x0A, 0xBA, 0xA3, 0x8F, 0xA0, 0x2D, 0xEE, 0x7C, 0xBE, 0x54, 0x40, 0x15, 0xB5, 0x87,
+ 0xA1, 0xEF, 0x7E, 0x09, 0x38, 0x51, 0xED, 0x2D, 0xDE, 0xDB, 0x41, 0xC6, 0xEE, 0x88, 0xAD, 0x1F,
+ 0x9C, 0x1C, 0xEC, 0x70, 0x39, 0x38, 0x45, 0xB8, 0x01, 0xB6, 0x58, 0x85, 0x61, 0x48, 0x3A, 0xCB,
+ 0xE9, 0x97, 0xB3, 0x96, 0x8C, 0x0B, 0xD7, 0x33, 0x73, 0x73, 0x7F, 0x1D, 0x85, 0xFF, 0xE9, 0x9E,
+ 0xCE, 0xD1, 0x1E, 0xFD, 0x1B, 0x7A, 0x63, 0x33, 0x10, 0x47, 0x96, 0xBA, 0x0A, 0x8E, 0xF6, 0x4C,
+ 0x70, 0xC1, 0xE1, 0xFD, 0x19, 0x5A, 0xE0, 0x19, 0xE8, 0xD9, 0x0C, 0x31, 0x8E, 0xA7, 0x42, 0x9D,
+ 0x50, 0xB2, 0xC9, 0x20, 0xE8, 0x62, 0xD2, 0x27, 0x67, 0x8E, 0xB6, 0x33, 0x8C, 0xD9, 0x38, 0x85,
+ 0xDC, 0x4D, 0xCF, 0x72, 0xF3, 0xCF, 0xAF, 0xB6, 0x00, 0xF0, 0x54, 0xAE, 0x27, 0xEC, 0x80, 0x28,
+ 0x4B, 0x4B, 0xA8, 0x57, 0x5C, 0xC3, 0xEE, 0x3A, 0x1F, 0x77, 0xAC, 0x9E, 0xA9, 0x11, 0x71, 0x23,
+ 0x5B, 0xFB, 0xF6, 0x80, 0x0E, 0x80, 0xCB, 0xC7, 0xE8, 0x1F, 0x8B, 0x09, 0x45, 0xA0, 0xF6, 0x70,
+ 0xD1, 0x3D, 0x9D, 0x46, 0x00, 0x80, 0x3E, 0x79, 0x1F, 0x4C, 0xF2, 0x4F, 0xCC, 0x8B, 0x9F, 0x63,
+ 0xCC, 0x01, 0x62, 0xD3, 0x30, 0x7D, 0xB1, 0x74, 0xB8, 0xF5, 0xB1, 0x0F, 0x13, 0x57, 0xF7, 0x70,
+ 0x7F, 0x16, 0x6C, 0x27, 0x17, 0x16, 0x49, 0xE6, 0x5F, 0x87, 0xA2, 0x52, 0x0E, 0x9C, 0xF9, 0xA9,
+ 0xEE, 0x91, 0xF0, 0xB1, 0x9C, 0x32, 0x13, 0x67, 0x08, 0xFA, 0x0C, 0x62, 0xBF, 0x11, 0xB2, 0x81,
+ 0x9F, 0xFF, 0xC1, 0x0C, 0xF9, 0x84, 0xBA, 0x85, 0x2E, 0xC2, 0xBC, 0xC0, 0x59, 0x1E, 0x56, 0x62,
+ 0x58, 0x39, 0x38, 0x6B, 0xFC, 0xC5, 0xC4, 0x9A, 0x97, 0xBC, 0x15, 0xA3, 0x2E, 0x90, 0xD2, 0x8E,
+ 0x18, 0xDF, 0x51, 0x39, 0x61, 0x99, 0xE4, 0x2D, 0xA9, 0x50, 0x70, 0x0B, 0x0F, 0x41, 0x20, 0x89,
+ 0x37, 0xFC, 0xE5, 0xD7, 0x3B, 0x57, 0xF5, 0x94, 0x69, 0x4C, 0xEC, 0x56, 0x1B, 0x9B, 0xA3, 0x73,
+ 0xC2, 0x6F, 0xA8, 0xFF, 0xF2, 0xEC, 0xD0, 0xD9, 0x79, 0x9F, 0x39, 0x0B, 0x7C, 0xF2, 0xE2, 0x5E,
+ 0x52, 0x7A, 0xE0, 0x81, 0xE3, 0x54, 0xC6, 0x2D, 0x86, 0x27, 0x8D, 0x04, 0xC3, 0x63, 0x2E, 0x25,
+ 0x6E, 0x05, 0x8F, 0xFB, 0xCA, 0x89, 0x18, 0x4D, 0x9B, 0xB9, 0x20, 0xA1, 0x15, 0xA2, 0x33, 0x56,
+ 0xAB, 0x3F, 0x2D, 0x14, 0x5A, 0x04, 0x5D, 0xBB, 0x7E, 0xE8, 0xF7, 0x4B, 0xD6, 0x49, 0xE8, 0xAF,
+ 0xE5, 0x10, 0x1F, 0x91, 0x68, 0x7C, 0xA0, 0x55, 0x24, 0x75, 0x46, 0xAF, 0xE1, 0xCD, 0x75, 0x0D,
+ 0x36, 0xC7, 0xAB, 0x21, 0xAC, 0xA8, 0x1C, 0xF0, 0x69, 0x6F, 0x38, 0x5E, 0x67, 0x7D, 0x99, 0x72,
+ 0xB9, 0x39, 0xE9, 0xFB, 0xCF, 0xCC, 0x24, 0x8C, 0x63, 0x6B, 0x6D, 0xBD, 0x0C, 0xFF, 0x5A, 0x2D,
+ 0xD0, 0x3F, 0x62, 0xE9, 0xFE, 0xC3, 0x50, 0x18, 0xC1, 0xE9, 0x07, 0xE8, 0xE5, 0x2E, 0xA5, 0x98,
+ 0x53, 0x27, 0x4A, 0x3D, 0xC9, 0xAF, 0x1B, 0x5E, 0x41, 0x4F, 0x67, 0xFE, 0x84, 0xBB, 0x74, 0x0C,
+ 0x6C, 0x88, 0x02, 0xFA, 0x37, 0x6A, 0xAD, 0xBC, 0x08, 0xDB, 0xE8, 0xF2, 0xCD, 0xA4, 0xF0, 0xFC,
+ 0xCC, 0xAD, 0xB5, 0xE7, 0x95, 0x61, 0x93, 0x99, 0xF1, 0xA3, 0x06, 0xCC, 0x01, 0x8D, 0x45, 0x9E,
+ 0xE1, 0xA6, 0x15, 0xDC, 0x4A, 0x99, 0x0F, 0x15, 0x34, 0x1E, 0x7E, 0x4F, 0xE5, 0x42, 0xEC, 0xE9,
+ 0xD3, 0xA3, 0xAD, 0xAB, 0x96, 0x5B, 0x89, 0x94, 0x12, 0xD3, 0xB1, 0x64, 0x69, 0x5B, 0x55, 0xC6,
+ 0x8C, 0x77, 0xD0, 0x9D, 0x0D, 0xF3, 0x36, 0x79, 0x49, 0x50, 0xE9, 0xBC, 0x61, 0x62, 0xFA, 0x67,
+ 0xDE, 0x00, 0x87, 0xC5, 0x95, 0x02, 0xBD, 0xAC, 0x7F, 0x3C, 0x92, 0x49, 0x15, 0xFE, 0xB4, 0x9D,
+ 0x44, 0xD9, 0x19, 0x10, 0x88, 0xDE, 0xBB, 0xC9, 0xE1, 0xEF, 0xC0, 0xD6, 0x60, 0xC7, 0x1D, 0x8B,
+ 0xE8, 0xE3, 0xD1, 0xE8, 0x28, 0x5D, 0xEC, 0x49, 0xEA, 0x79, 0xE4, 0x61, 0x61, 0x7C, 0x81, 0xBF,
+ 0x6D, 0xA1, 0x89, 0x80, 0x63, 0x83, 0x65, 0xF2, 0x5C, 0xF6, 0xBB, 0xAD, 0xD4, 0x3B, 0x2F, 0xFE,
+ 0x6F, 0x0A, 0xD6, 0x6E, 0x2D, 0x6E, 0x34, 0xB9, 0x0B, 0xE2, 0x12, 0x8B, 0x40, 0xFE, 0x0E, 0x24,
+ 0x6C, 0x67, 0xDE, 0x25, 0xCD, 0x48, 0x34, 0x8A, 0x5B, 0x0D, 0x9B, 0xC4, 0xD3, 0x1C, 0xE6, 0x9D,
+ 0x8C, 0x77, 0xB0, 0x2B, 0x0C, 0x77, 0x2C, 0x0D, 0xBE, 0xAD, 0xE1, 0x9D, 0x9F, 0x10, 0x84, 0x34,
+ 0x39, 0x52, 0xB0, 0xB8, 0x1C, 0x02, 0x24, 0x3C, 0xD8, 0x80, 0xD4, 0x40, 0x63, 0x59, 0xE6, 0x6C,
+ 0x0F, 0xFA, 0xEB, 0xAE, 0xDC, 0x67, 0x47, 0x03, 0x25, 0x80, 0xCD, 0x4B, 0x21, 0x77, 0x17, 0xBB,
+ 0x19, 0x8C, 0xC1, 0x09, 0x7E, 0x0F, 0x7D, 0xD7, 0x50, 0xF9, 0xC3, 0xAA, 0x05, 0x10, 0xDD, 0x6B,
+ 0xD2, 0x96, 0x46, 0x14, 0xC2, 0xA5, 0xD7, 0xF8, 0xED, 0xDA, 0x58, 0x53, 0xC3, 0x8F, 0xAB, 0x47,
+ 0x91, 0x95, 0x48, 0x0C, 0xDE, 0xED, 0x99, 0x04, 0x3A, 0xC7, 0xCC, 0xB5, 0x1C, 0xAC, 0x29, 0xAE,
+ 0xFA, 0xA6, 0xA5, 0x57, 0x65, 0x12, 0x86, 0xBE, 0x72, 0xFB, 0x06, 0x93, 0x49, 0xD0, 0x53, 0x43,
+ 0xD0, 0xD4, 0xC7, 0x2F, 0x8A, 0x13, 0xEC, 0x95, 0x3B, 0x18, 0xD3, 0x67, 0x2B, 0xA6, 0xCF, 0x0B,
+ 0xE6, 0x47, 0xF9, 0x3A, 0x32, 0x41, 0x27, 0xC8, 0xDB, 0xD7, 0xC7, 0xED, 0xB7, 0xCF, 0x75, 0xF1,
+ 0x29, 0xC7, 0x28, 0x97, 0x07, 0xBA, 0x74, 0x2C, 0x5A, 0xAE, 0x6E, 0x39, 0x51, 0xF3, 0xD2, 0x07,
+ 0xE2, 0x82, 0xFA, 0xE0, 0xD0, 0x22, 0x6B, 0xC7, 0xDA, 0x90, 0x0D, 0x1B, 0xB5, 0x17, 0x8A, 0xFA,
+ 0x9E, 0xB5, 0x1A, 0xBD, 0x6F, 0x64, 0x02, 0xF5, 0x14, 0xB4, 0x63, 0x64, 0xFB, 0x42, 0x99, 0x42,
+ 0xDE, 0x6A, 0x6C, 0xAB, 0x5B, 0xE5, 0xC4, 0x62, 0x25, 0x66, 0x83, 0xC3, 0x6A, 0x64, 0x4A, 0xD0,
+ 0xA7, 0x4F, 0x66, 0x21, 0xF9, 0x7C, 0xCC, 0x15, 0x5F, 0x69, 0xB3, 0x2E, 0x83, 0x26, 0x12, 0xC7,
+ 0xE0, 0xE4, 0xAE, 0x92, 0x44, 0xA4, 0x1F, 0xEE, 0xBC, 0x06, 0xAF, 0xC4, 0x5A, 0x14, 0x89, 0xCF,
+ 0x46, 0xC2, 0xA8, 0x80, 0x98, 0xF6, 0xCC, 0xA8, 0x7E, 0xDE, 0x94, 0x31, 0x36, 0xBF, 0x80, 0xA9,
+ 0x49, 0x62, 0xF9, 0x4B, 0x09, 0xFF, 0x29, 0xCC, 0xB6, 0x5A, 0x84, 0xBC, 0xCB, 0xF4, 0xBB, 0x19,
+ 0xC1, 0xA7, 0x09, 0x60, 0xF9, 0xD4, 0x0F, 0x84, 0xE0, 0xDF, 0x9A, 0x0D, 0xCC, 0xCA, 0x14, 0x68,
+ 0x39, 0x74, 0x10, 0x63, 0x13, 0xC0, 0xAE, 0xD2, 0x2B, 0x3C, 0x6E, 0xC2, 0x29, 0x51, 0xC9, 0xAF,
+ 0x0E, 0x09, 0x87, 0xAD, 0x82, 0x8A, 0xA6, 0x0F, 0x02, 0x4B, 0xAD, 0x1F, 0x63, 0xEE, 0xAE, 0x57,
+ 0xE0, 0xE5, 0x51, 0xCC, 0x8C, 0x9A, 0x9E, 0x4F, 0x67, 0xFB, 0xD4, 0x9F, 0xA5, 0x18, 0x13, 0x9F,
+ 0x24, 0xF4, 0x9E, 0x2B, 0x52, 0xC0, 0x08, 0xE8, 0x77, 0xEA, 0xBB, 0x01, 0x5A, 0x77, 0x46, 0xEF,
+ 0x10, 0xAC, 0xA4, 0x70, 0x56, 0x98, 0x5A, 0xBF, 0x4A, 0x82, 0x72, 0x96, 0xB9, 0xB1, 0x61, 0x78,
+ 0x6D, 0x6E, 0xAD, 0x66, 0x6C, 0x67, 0xB3, 0x45, 0x8F, 0xF8, 0xFD, 0x1E, 0xAA, 0x7A, 0x13, 0x0C,
+ 0x35, 0x1A, 0x9F, 0x69, 0x5E, 0x13, 0x8A, 0xB5, 0xE7, 0x17, 0x58, 0x7A, 0xF5, 0xB3, 0x06, 0x48,
+ 0x16, 0x55, 0xDC, 0xD8, 0xB7, 0x70, 0x3D, 0xB1, 0x04, 0x13, 0xA1, 0x21, 0x60, 0xF2, 0x15, 0xA8,
+ 0x09, 0x2A, 0xD2, 0xBC, 0x67, 0xAD, 0x23, 0x01, 0x8E, 0x91, 0xE2, 0x4C, 0x73, 0x41, 0xA4, 0x29,
+ 0x9A, 0x09, 0xFD, 0xC6, 0x8C, 0xC2, 0x0D, 0x62, 0xFE, 0x70, 0x53, 0x8B, 0x72, 0x07, 0x26, 0x73,
+ 0xC1, 0xED, 0x07, 0xE0, 0xD3, 0x02, 0x9C, 0x10, 0x30, 0x83, 0x83, 0x50, 0xDA, 0x11, 0x36, 0x8B,
+ 0x22, 0xE6, 0xF3, 0x90, 0xDE, 0x90, 0x87, 0x6F, 0x10, 0x41, 0x3B, 0x6E, 0x41, 0x87, 0x0A, 0x56,
+ 0x27, 0x95, 0xCA, 0xFE, 0xC8, 0xE0, 0x15, 0xD2, 0xEE, 0xB8, 0xBF, 0x35, 0x4F, 0x8B, 0xF3, 0xBA,
+ 0x37, 0x6F, 0x16, 0x61, 0x80, 0x7E, 0x95, 0x50, 0x27, 0x7A, 0x46, 0x0F, 0xBF, 0xDC, 0x74, 0xB1,
+ 0x73, 0xE0, 0x50, 0x86, 0x6F, 0x92, 0xB6, 0x41, 0x5B, 0x2E, 0xE1, 0xCA, 0x8E, 0xDB, 0x8E, 0xEC,
+ 0xD1, 0x8C, 0xF4, 0x74, 0x7C, 0x9C, 0x1E, 0x24, 0x60, 0xF4, 0xD3, 0x5B, 0xA0, 0x3B, 0xE2, 0x5B,
+ 0x17, 0xBB, 0x7D, 0x97, 0x57, 0x2A, 0x09, 0x9A, 0x1D, 0x5C, 0x02, 0x63, 0x4A, 0xC0, 0x0E, 0xA1,
+ 0xA0, 0x96, 0xE5, 0x4D, 0x6D, 0x91, 0x3C, 0x69, 0x59, 0x80, 0x41, 0x7D, 0xF7, 0x53, 0x93, 0x52,
+ 0x58, 0xF9, 0x11, 0x33, 0xFF, 0xDB, 0x7F, 0x26, 0x5E, 0x90, 0x5B, 0xB5, 0x42, 0x16, 0xE0, 0x05,
+ 0x4E, 0x5B, 0x23, 0xAE, 0x35, 0x7D, 0x95, 0x79, 0x4C, 0xD1, 0x77, 0x47, 0x77, 0x9B, 0x63, 0xED,
+ 0x86, 0x6E, 0x6F, 0x76, 0x54, 0x7C, 0x4A, 0x9D, 0x0F, 0xAE, 0xE7, 0x41, 0xBD, 0x20, 0x1F, 0x04,
+ 0xF4, 0xA8, 0x90, 0x48, 0xF7, 0x59, 0xF7, 0x14, 0xCF, 0x1D, 0x18, 0xE5, 0x54, 0x25, 0x4D, 0x87,
+ 0xE4, 0x61, 0x84, 0x7B, 0xB5, 0xCB, 0xF5, 0x70, 0x78, 0x80, 0xF1, 0x52, 0x89, 0x2D, 0xEA, 0x72,
+ 0xB3, 0xE7, 0x7D, 0x24, 0x59, 0xB7, 0x22, 0x49, 0x9F, 0xDA, 0x7D, 0x81, 0x86, 0xAB, 0xD3, 0x80,
+ 0x18, 0x55, 0xF5, 0x21, 0xC6, 0xE4, 0x9E, 0xE5, 0xBB, 0x12, 0x8D, 0x3E, 0xD1, 0xEE, 0x33, 0x56,
+ 0xCF, 0x24, 0x37, 0x65, 0x73, 0x41, 0x63, 0xDD, 0x21, 0x4C, 0x85, 0xA3, 0xB1, 0x74, 0x67, 0xFC,
+ 0x60, 0xC9, 0x14, 0x0D, 0x4F, 0x31, 0x15, 0x87, 0x70, 0xEA, 0x18, 0x9C, 0xE9, 0x13, 0x09, 0x6A,
+ 0xC5, 0xE2, 0x01, 0x08, 0xF3, 0x2A, 0xE0, 0x28, 0x42, 0x1B, 0x80, 0x30, 0xC3, 0x87, 0xF8, 0x31,
+ 0xBC, 0x0C, 0xC7, 0xBA, 0x61, 0x77, 0x85, 0xC7, 0x9B, 0x56, 0x29, 0x48, 0xCF, 0x65, 0x18, 0x05,
+ 0x2F, 0x8E, 0x23, 0x3D, 0xA3, 0x34, 0xB2, 0x17, 0xAB, 0x42, 0xE6, 0x88, 0x8C, 0x96, 0xB5, 0x5F,
+ 0x44, 0x20, 0x47, 0xAB, 0x1F, 0x02, 0xE3, 0xDF, 0xF2, 0xEF, 0xBE, 0x5A, 0xA8, 0x87, 0x98, 0x57,
+ 0xCE, 0x73, 0x75, 0xAE, 0xA1, 0x51, 0x16, 0xEC, 0x5A, 0x0F, 0xFA, 0xF0, 0xC6, 0x80, 0xFE, 0x7F,
+ 0xE4, 0x3B, 0x02, 0x27, 0x9D, 0x75, 0xE3, 0x41, 0x8C, 0x5C, 0x5B, 0x20, 0x40, 0x22, 0xBF, 0x09,
+ 0x79, 0x63, 0xB4, 0xDC, 0x06, 0x44, 0xE4, 0x5B, 0x09, 0x58, 0xC9, 0x51, 0x38, 0x9D, 0x07, 0x10,
+ 0x98, 0x75, 0x6A, 0x3B, 0x87, 0x00, 0x76, 0x9D, 0x6C, 0xE9, 0xB0, 0x94, 0x1E, 0x50, 0x48, 0x26,
+ 0x5E, 0xFB, 0x2D, 0x10, 0x54, 0x8E, 0xA2, 0x50, 0x03, 0xC6, 0x78, 0x55, 0x86, 0x4E, 0xD4, 0x4B,
+ 0xFC, 0x15, 0x61, 0x4C, 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x00, 0x16, 0x63, 0x73, 0xAD,
+ 0xB0, 0xE1, 0x94, 0x36, 0x43, 0xFE, 0xA4, 0x37, 0x34, 0x3F, 0xE2, 0xB9, 0x75, 0x2D, 0x95, 0x72,
+ 0x2C, 0xC8, 0x8A, 0xC5, 0x4B, 0x03, 0x8C, 0xA4, 0xE8, 0x79, 0x15, 0x38, 0x24, 0x8D, 0x92, 0x0B,
+ 0x91, 0xA4, 0xF3, 0x94, 0x58, 0x35, 0xD6, 0x6D, 0x14, 0x3E, 0x78, 0x4E, 0x17, 0x21, 0x80, 0x5D,
+ 0x95, 0xF0, 0x73, 0x7E, 0xA2, 0xDA, 0x3D, 0xD4, 0x33, 0xF4, 0x0A, 0x80, 0x4A, 0x5C, 0x83, 0x91,
+ 0x6E, 0xE7, 0x13, 0x73, 0x26, 0x94, 0x17, 0xD4, 0x13, 0xBD, 0x8B, 0x74, 0x25, 0x06, 0x34, 0xA8,
+ 0x98, 0x99, 0x94, 0x1F, 0xC7, 0xDC, 0x3F, 0x36, 0xF8, 0x24, 0x57, 0x1E, 0xB7, 0x9D, 0x29, 0xA4,
+ 0xB6, 0x27, 0x1B, 0x31, 0xF3, 0x21, 0x80, 0x60, 0x51, 0xF1, 0x66, 0x10, 0xBD, 0x15, 0xF5, 0xBB,
+ 0x47, 0x50, 0xCD, 0xC7, 0xEC, 0x05, 0x48, 0xCB, 0x84, 0x70, 0xB0, 0x58, 0x5F, 0x53, 0x2A, 0x2B,
+ 0x02, 0x42, 0x5C, 0x78, 0x1C, 0x7C, 0x56, 0xA2, 0xF2, 0x4B, 0xA0, 0x94, 0x8A, 0x84, 0xB0, 0x2D,
+ 0x9B, 0xF5, 0xA8, 0xC2, 0xE2, 0xE3, 0x20, 0xC5, 0xAE, 0xD6, 0x4F, 0x17, 0xDF, 0x52, 0x47, 0x8E,
+ 0x6F, 0x6D, 0x41, 0xDB, 0x59, 0xF0, 0xC5, 0x9D, 0x6D, 0xBD, 0xA0, 0xC9, 0x9D, 0x72, 0x2D, 0x2E,
+ 0x51, 0x10, 0xAC, 0x37, 0x01, 0xA7, 0xD7, 0x4E, 0xF3, 0x96, 0xD6, 0x79, 0xFD, 0xA0, 0xC4, 0x3F,
+ 0x38, 0x68, 0xA4, 0x19, 0x01, 0xE6, 0x0B, 0x96, 0x32, 0xA3, 0x48, 0x8B, 0x4F, 0x77, 0x56, 0x98,
+ 0xB6, 0x85, 0x73, 0xA9, 0x2B, 0x04, 0xED, 0x2F, 0x13, 0x6A, 0x32, 0x0C, 0xAB, 0x51, 0x54, 0xBE,
+ 0x0B, 0x7F, 0xBD, 0x93, 0x4E, 0xB1, 0xBB, 0xA9, 0xA8, 0xD4, 0x53, 0x64, 0x83, 0x49, 0x63, 0x64,
+ 0x5B, 0xD7, 0xB5, 0x02, 0xDD, 0x13, 0x3F, 0xFD, 0x64, 0xF5, 0xC3, 0x18, 0x97, 0xC7, 0xCF, 0x96,
+ 0x11, 0x63, 0xB3, 0x20, 0x15, 0x81, 0x3D, 0x9A, 0x52, 0x99, 0xF2, 0xBE, 0x76, 0xD1, 0x1F, 0xF6,
+ 0x0E, 0xD3, 0x7C, 0x55, 0x42, 0x55, 0x94, 0x5E, 0x10, 0x96, 0x37, 0x4C, 0x2E, 0xAC, 0x9E, 0x30,
+ 0x40, 0xB9, 0xD0, 0xFC, 0x81, 0xA2, 0x87, 0x34, 0x74, 0x82, 0xA2, 0x88, 0xDD, 0x30, 0x4D, 0x50,
+ 0xA6, 0x0E, 0x0C, 0x50, 0x0C, 0xB7, 0xB6, 0xC2, 0x33, 0x7D, 0x73, 0x8C, 0x66, 0x90, 0xC2, 0x42,
+ 0x87, 0x35, 0xD5, 0x4D, 0xB7, 0xEE, 0x1D, 0x0D, 0xB4, 0xFC, 0xD4, 0x3B, 0xD9, 0xA7, 0xF1, 0x2D,
+ 0x02, 0x16, 0x89, 0x1B, 0x32, 0xB2, 0x4D, 0x38, 0x61, 0x6C, 0xD3, 0x3B, 0x53, 0xBF, 0x1E, 0x46,
+ 0xA8, 0x6B, 0x1A, 0x83, 0xB8, 0x3A, 0x2C, 0xCD, 0x6E, 0xBF, 0xBB, 0xDD, 0x42, 0x71, 0xB9, 0x71,
+ 0x93, 0x4C, 0x3B, 0x24, 0x3B, 0xBD, 0x6A, 0x78, 0x93, 0x42, 0x6B, 0x5A, 0x24, 0xCF, 0x41, 0x10,
+ 0xAD, 0x05, 0x3B, 0x7E, 0x90, 0x2C, 0xA7, 0x9C, 0x6B, 0xB5, 0xE0, 0x5E, 0xB5, 0xA0, 0x3C, 0xCB,
+ 0xD0, 0xCB, 0x48, 0x75, 0xE3, 0x17, 0x86, 0x42, 0x5A, 0xF7, 0x2E, 0x4C, 0x6C, 0xF2, 0x21, 0x37,
+ 0xEE, 0xB4, 0xE5, 0x30, 0x6B, 0xA1, 0x4B, 0x31, 0xDB, 0x8C, 0x86, 0xF9, 0x5C, 0xDA, 0xDA, 0x44,
+ 0x95, 0xEA, 0x26, 0x96, 0xD6, 0x26, 0xAE, 0x23, 0x11, 0xEB, 0x21, 0x34, 0xFF, 0xB2, 0x8C, 0x9E,
+ 0x9B, 0xBD, 0x27, 0xFB, 0x09, 0x0F, 0xE3, 0x50, 0x73, 0x8E, 0xAC, 0xE0, 0x05, 0x22, 0x20, 0xD5,
+ 0xF7, 0x4E, 0x72, 0xD0, 0x4E, 0xF7, 0xC5, 0xC9, 0xE7, 0x25, 0x7F, 0xF9, 0x91, 0x19, 0x68, 0x03,
+ 0x17, 0x04, 0xD2, 0xBA, 0x4D, 0x94, 0xAF, 0x95, 0xBC, 0x81, 0x57, 0xB6, 0xD9, 0x56, 0x8F, 0x67,
+ 0x40, 0x24, 0x6D, 0xEC, 0xD5, 0xD1, 0x1E, 0x2E, 0xFC, 0xE8, 0xBA, 0xAB, 0x80, 0x63, 0x35, 0xC3,
+ 0x38, 0x18, 0x98, 0x71, 0x55, 0xA7, 0xC8, 0x09, 0xAE, 0xA3, 0xA3, 0x37, 0xA3, 0x96, 0xCE, 0x8F,
+ 0x0F, 0x12, 0x53, 0xF5, 0x8E, 0x02, 0xB1, 0xBC, 0x56, 0x1E, 0x67, 0x71, 0xFE, 0xAB, 0xF0, 0x04,
+ 0x5B, 0x87, 0x93, 0x92, 0xB2, 0xAC, 0x47, 0xB6, 0xEF, 0xBD, 0x55, 0x1D, 0x30, 0xCB, 0xA6, 0x60,
+ 0x13, 0x13, 0xFE, 0x82, 0x4E, 0x06, 0xA8, 0xAB, 0x2B, 0x40, 0x2E, 0x7C, 0x66, 0x8F, 0xCC, 0x40,
+ 0x36, 0x20, 0xE9, 0xAF, 0xC6, 0x3A, 0xE2, 0xE2, 0xFE, 0x01, 0x97, 0x7E, 0xCA, 0x82, 0x20, 0x58,
+ 0x5E, 0xB5, 0x10, 0xE1, 0x99, 0xE3, 0x4F, 0x82, 0xE3, 0x4D, 0x35, 0xB6, 0x7B, 0x28, 0x37, 0x02,
+ 0x26, 0x00, 0xA1, 0x6C, 0x7B, 0xA1, 0x48, 0x4F, 0xCB, 0x55, 0x25, 0xB8, 0x6B, 0xDD, 0xB1, 0xAE,
+ 0xA0, 0xD3, 0xA1, 0x8B, 0x84, 0x9E, 0xF2, 0xB8, 0x53, 0xDC, 0xE0, 0xE4, 0x6C, 0x5C, 0x63, 0xA8,
+ 0xD7, 0x4F, 0x1C, 0xB6, 0x73, 0xF9, 0x50, 0xA7, 0x99, 0x30, 0x42, 0x3E, 0x60, 0x49, 0x6A, 0x7F,
+ 0x6F, 0x0A, 0x83, 0xAD, 0x99, 0x90, 0x00, 0xC3, 0x5A, 0xFD, 0x83, 0xDA, 0xDE, 0x0A, 0x37, 0xC0,
+ 0x7F, 0xC6, 0x96, 0x61, 0x9A, 0xF8, 0xBF, 0xBF, 0x45, 0x33, 0x3C, 0x17, 0x48, 0x7B, 0x54, 0xB8,
+ 0x38, 0xAD, 0x88, 0xD7, 0x7C, 0x1B, 0x08, 0x04, 0xA9, 0x88, 0xDD, 0x1A, 0x7B, 0x53, 0xEF, 0x8F,
+ 0x49, 0xBC, 0xBC, 0x64, 0x98, 0x17, 0xA0, 0xB2, 0xAE, 0x63, 0x5B, 0x33, 0xE3, 0xED, 0x93, 0x88,
+ 0x5D, 0xB9, 0x3F, 0xF2, 0x8A, 0xD3, 0x38, 0xD9, 0xD6, 0xC9, 0xFE, 0x13, 0x92, 0x3B, 0xF0, 0xA5,
+ 0xE4, 0x1A, 0x09, 0x28, 0x70, 0x27, 0x1A, 0xB5, 0x99, 0xBA, 0x39, 0x2A, 0xBA, 0x8E, 0xAE, 0x79,
+ 0x6A, 0x21, 0xF7, 0xB7, 0x7D, 0x16, 0x34, 0xA4, 0x5D, 0x0E, 0x97, 0xF5, 0xFC, 0x1A, 0x88, 0xEE,
+ 0x4A, 0x9E, 0xB9, 0x64, 0x2B, 0xFF, 0x89, 0xC2, 0x45, 0x34, 0xE7, 0xC4, 0xE0, 0xFC, 0x9E, 0xF8,
+ 0xF6, 0x89, 0x5E, 0x68, 0x53, 0xEC, 0xF0, 0x98, 0x63, 0x5E, 0x53, 0xA0, 0xBE, 0x42, 0x8E, 0xD9,
+ 0x70, 0x5D, 0x3C, 0xC5, 0x11, 0x11, 0x20, 0xC1, 0x9B, 0xF4, 0x6E, 0x61, 0x63, 0x4A, 0xB3, 0xE7,
+ 0x5F, 0x91, 0xC9, 0x2C, 0xFF, 0x1E, 0xCE, 0x25, 0xFE, 0x26, 0x6A, 0xA4, 0x06, 0xE3, 0x30, 0xCF,
+ 0xFC, 0x9D, 0xE8, 0x0D, 0xFD, 0x41, 0xC6, 0x9F, 0x20, 0x2E, 0xB0, 0x24, 0x9B, 0xA1, 0xB2, 0x30,
+ 0x75, 0x3F, 0xFC, 0x33, 0x68, 0x8E, 0x97, 0x33, 0xE5, 0xFE, 0xF8, 0xEC, 0x28, 0xAC, 0xD4, 0x52,
+ 0xA5, 0x97, 0x23, 0x9B, 0x89, 0xDF, 0x42, 0x38, 0xA2, 0xD9, 0x38, 0x7C, 0x59, 0x58, 0x78, 0x2D,
+ 0x64, 0x3E, 0xAC, 0xA4, 0x2F, 0x30, 0x55, 0xD2, 0xE3, 0x4C, 0x4E, 0xA5, 0xEC, 0x4E, 0x5A, 0xF9,
+ 0xAA, 0xB6, 0xB9, 0xBA, 0xFA, 0x23, 0x41, 0x9D, 0xCA, 0x54, 0xDA, 0x90, 0xDD, 0xC4, 0x68, 0x16,
+ 0x2E, 0x4F, 0xB5, 0xDC, 0x9A, 0x25, 0xBF, 0x8B, 0xC0, 0x79, 0x0D, 0xCF, 0xB7, 0xBE, 0xDE, 0x95,
+ 0x59, 0xF0, 0x28, 0x8A, 0x14, 0xD9, 0x90, 0x66, 0xAA, 0xEB, 0x5F, 0x64, 0x61, 0xD1, 0x7E, 0x4C,
+ 0x45, 0x8E, 0x98, 0x11, 0x7A, 0x84, 0x81, 0x0A, 0xD2, 0xBA, 0x5D, 0x72, 0x09, 0xA0, 0x05, 0x1E,
+ 0x16, 0xD4, 0x4A, 0x91, 0xEE, 0xD8, 0x4A, 0x06, 0x4B, 0x5C, 0xEC, 0x79, 0x28, 0xA3, 0xB3, 0x81,
+ 0x4C, 0x90, 0xF1, 0xB2, 0x29, 0x02, 0x2B, 0xF2, 0x44, 0x9F, 0xD9, 0x6D, 0x66, 0x33, 0x78, 0x73,
+ 0x23, 0x5D, 0x26, 0x2C, 0x86, 0x43, 0x9E, 0x69, 0x0A, 0x97, 0x01, 0x8F, 0x64, 0xDA, 0xF9, 0xCC,
+ 0xC7, 0xA0, 0x59, 0xF0, 0x60, 0xD9, 0x46, 0xAA, 0x77, 0x9F, 0xFC, 0xF3, 0xBA, 0x66, 0xD4, 0xBE,
+ 0x69, 0x9B, 0xAE, 0x3C, 0xB6, 0x57, 0x8A, 0x30, 0x53, 0xEC, 0xC6, 0xF8, 0x14, 0x76, 0x84, 0x76,
+ 0x7F, 0x53, 0xA8, 0x14, 0x8A, 0x55, 0xAE, 0x89, 0xE8, 0x4D, 0x8C, 0x69, 0xC2, 0x56, 0xB7, 0x64,
+ 0x2A, 0x57, 0x9A, 0x76, 0xC5, 0x77, 0x8A, 0xC8, 0x01, 0x29, 0xB6, 0xB2, 0xA9, 0x50, 0x43, 0xCD,
+ 0x22, 0xD0, 0xE8, 0xDE, 0x6B, 0xB9, 0x87, 0x18, 0x70, 0xEF, 0xCB, 0x72, 0xAA, 0x18, 0xB6, 0x42,
+ 0xCE, 0xBD, 0xC4, 0x34, 0x7C, 0x6E, 0xA7, 0x6F, 0x63, 0x29, 0x16, 0x97, 0x3A, 0x19, 0x11, 0xEF,
+ 0xB6, 0x47, 0xF0, 0x01, 0xAA, 0x25, 0x4A, 0x50, 0x67, 0xCC, 0x60, 0xF2, 0x36, 0x06, 0x85, 0x7A,
+ 0x99, 0x50, 0x11, 0x24, 0xDD, 0xA5, 0xC1, 0x1A, 0xA6, 0x76, 0x62, 0xBB, 0xB6, 0x34, 0xB8, 0x90,
+ 0x37, 0x35, 0xAA, 0x96, 0xF3, 0xC5, 0xA2, 0x5E, 0x5D, 0x4F, 0x9C, 0x9F, 0x95, 0x99, 0xEF, 0xDE,
+ 0xCC, 0x89, 0xC5, 0x2E, 0x73, 0xC7, 0xF7, 0xAC, 0xFB, 0x87, 0x95, 0xFE, 0x20, 0x99, 0x2B, 0x62,
+ 0x5D, 0xDC, 0x61, 0x3B, 0x10, 0x7A, 0x5C, 0xF5, 0x09, 0xCB, 0xE0, 0xB1, 0x41, 0xB0, 0x7A, 0x90,
+ 0x49, 0x65, 0x2D, 0x3F, 0x7D, 0x10, 0x6C, 0xDD, 0x5F, 0x04, 0x21, 0x70, 0xCA, 0x13, 0x42, 0x2B,
+ 0x71, 0x30, 0xE9, 0x40, 0x80, 0xB4, 0xDD, 0xBF, 0xDF, 0x0D, 0x11, 0x21, 0xC1, 0xE4, 0x51, 0xC8,
+ 0x48, 0xAC, 0x37, 0xD3, 0xDE, 0x32, 0xBE, 0xCF, 0x61, 0xF6, 0x8A, 0xEB, 0x8C, 0xE1, 0xF7, 0x1D,
+ 0xCD, 0xAA, 0x24, 0x68, 0x4C, 0xA1, 0x33, 0x8A, 0x0B, 0xA5, 0xA4, 0xC6, 0x94, 0xCD, 0x1E, 0x07,
+ 0x62, 0xB9, 0x3B, 0x3E, 0xD6, 0x13, 0x6F, 0x54, 0xD9, 0x93, 0x02, 0xD9, 0x1E, 0x72, 0x9C, 0x6C,
+ 0xC9, 0x97, 0xEF, 0xB6, 0x96, 0xDA, 0x93, 0x7E, 0x8D, 0x4F, 0x88, 0x0B, 0xA4, 0x7E, 0xF9, 0x0A,
+ 0x7E, 0xD3, 0x2D, 0x8D, 0x15, 0xCA, 0xC4, 0x14, 0xDC, 0x0E, 0x1B, 0x93, 0x02, 0xC5, 0x7E, 0x31,
+ 0xC8, 0xCC, 0x59, 0x92, 0x9F, 0x66, 0x43, 0xA5, 0x51, 0xFA, 0x76, 0x92, 0xDE, 0x20, 0xCF, 0x5D,
+ 0x28, 0xAA, 0x4E, 0x80, 0x61, 0x6D, 0xE2, 0x3C, 0xD3, 0xAE, 0x55, 0xEC, 0xD1, 0xC2, 0x30, 0xEA,
+ 0xE3, 0xD7, 0x9D, 0xCE, 0x01, 0x64, 0xD4, 0x85, 0x95, 0xC0, 0x91, 0xBD, 0xB7, 0xAF, 0x78, 0xDB,
+ 0xAC, 0x3C, 0xCF, 0x18, 0xE3, 0x07, 0x6C, 0xD4, 0x85, 0xD9, 0x04, 0xF5, 0xFA, 0x43, 0x1C, 0x27,
+ 0x85, 0x1A, 0xF1, 0x86, 0xE5, 0xEE, 0x36, 0x83, 0x18, 0xE4, 0x40, 0x88, 0x67, 0xA4, 0xF9, 0x0E,
+ 0x2C, 0x6F, 0xA9, 0xB2, 0xD8, 0x58, 0x89, 0xC1, 0xF5, 0x5C, 0xC0, 0x79, 0xDB, 0xF0, 0xA3, 0x92,
+ 0xED, 0xBB, 0x7F, 0x76, 0xEE, 0x7D, 0x60, 0x5D, 0x05, 0xB5, 0xBA, 0x4C, 0x6A, 0x58, 0x8A, 0xBD,
+ 0xF3, 0x69, 0x68, 0x4F, 0xDE, 0xE3, 0x7F, 0xF2, 0x05, 0x42, 0xC6, 0xDC, 0x7D, 0x04, 0x48, 0x3B,
+ 0x1F, 0x99, 0x7E, 0x6C, 0x1E, 0x91, 0x86, 0xC8, 0xDF, 0x10, 0x92, 0x3F, 0xBD, 0xC3, 0x43, 0x39,
+ 0xE3, 0xC1, 0x30, 0x7B, 0xBD, 0x02, 0x1F, 0x16, 0xEF, 0x72, 0x07, 0x99, 0xB1, 0x3B, 0x6A, 0x2C,
+ 0xBE, 0x41, 0x38, 0xC6, 0xBF, 0xA0, 0xA4, 0xF4, 0xFF, 0x65, 0x4D, 0xF0, 0x76, 0xF2, 0x2F, 0x02,
+ 0x87, 0x02, 0x13, 0xFD, 0x19, 0xC6, 0x4F, 0x6B, 0x57, 0x45, 0xCE, 0xDE, 0xEC, 0x24, 0x9E, 0x29,
+ 0x0D, 0x9C, 0xF4, 0x16, 0x7A, 0x13, 0x33, 0xB9, 0x1C, 0x9E, 0xC1, 0x6B, 0xE3, 0xAD, 0xFD, 0x06,
+ 0x52, 0xDF, 0x8B, 0xAE, 0x35, 0xA6, 0x1B, 0xE7, 0x93, 0x24, 0xB5, 0x5F, 0xD1, 0x77, 0xD5, 0x3E,
+ 0xC4, 0x9F, 0x2F, 0x8A, 0x5C, 0x1C, 0x35, 0xAE, 0x08, 0xBE, 0x22, 0x10, 0x54, 0xDD, 0x6C, 0xC4,
+ 0x1A, 0xDD, 0xD1, 0x04, 0x16, 0x04, 0x3D, 0x7B, 0x65, 0x92, 0xAC, 0x4B, 0x51, 0x51, 0x12, 0x96,
+ 0xAB, 0x10, 0x05, 0x78, 0xD8, 0x77, 0x6D, 0x46, 0x3A, 0x50, 0x3B, 0xB8, 0xB9, 0xF5, 0x64, 0x13,
+ 0xDA, 0xAD, 0x17, 0x2A, 0xD5, 0xAA, 0x40, 0x56, 0x7F, 0xC5, 0xF4, 0x73, 0xE5, 0xFC, 0x77, 0x96,
+ 0xFD, 0xC5, 0x96, 0xCE, 0x68, 0x2C, 0x95, 0xDB, 0x0B, 0x98, 0xAC, 0x99, 0x3F, 0xF9, 0x22, 0x3D,
+ 0xA2, 0xDC, 0x59, 0x30, 0xBF, 0x40, 0x1F, 0x73, 0xB9, 0xBA, 0xE3, 0x09, 0xF2, 0xDD, 0x51, 0x97,
+ 0x46, 0x2E, 0xB5, 0x1E, 0xA3, 0x4D, 0x62, 0x9F, 0x20, 0xCA, 0xF5, 0xC3, 0xF5, 0x14, 0xC4, 0xD5,
+ 0x5C, 0x06, 0x9A, 0xD7, 0x9B, 0x93, 0xD3, 0x0B, 0xA4, 0xDE, 0xCD, 0xAA, 0xBC, 0xFA, 0x91, 0xD8,
+ 0xF5, 0xA2, 0xC1, 0x31, 0xCD, 0x16, 0xE3, 0x5C, 0xFB, 0x33, 0x4C, 0x33, 0x02, 0xD1, 0x17, 0x69,
+ 0x29, 0xE1, 0x94, 0x97, 0xC9, 0x6C, 0x0F, 0x73, 0x5D, 0xCE, 0xBC, 0xF1, 0x76, 0xCE, 0x22, 0xBC,
+ 0xB5, 0x11, 0xAF, 0x5D, 0x0F, 0x78, 0x54, 0x2E, 0x45, 0xDB, 0x02, 0x58, 0x7C, 0xE3, 0x39, 0x99,
+ 0x74, 0x9D, 0x11, 0xFD, 0xF6, 0x87, 0x10, 0x47, 0xA9, 0xF3, 0x3B, 0x08, 0x6E, 0xBC, 0x0C, 0x8E,
+ 0x54, 0x5E, 0x04, 0x58, 0xF6, 0xD9, 0x66, 0xEC, 0xD9, 0x11, 0x6D, 0x35, 0xAB, 0xB4, 0xE5, 0xDC,
+ 0xF0, 0xB6, 0x1E, 0x71, 0xAC, 0x5D, 0x92, 0xC1, 0x5C, 0xB1, 0xC7, 0xD0, 0x0B, 0x10, 0x6E, 0xE2,
+ 0x32, 0xA6, 0x89, 0x42, 0xAD, 0xA6, 0x5C, 0xBA, 0xAD, 0xB2, 0x0F, 0x47, 0x8C, 0xEF, 0xDD, 0x88,
+ 0xEA, 0x04, 0x70, 0xB5, 0xFA, 0xD7, 0x22, 0x78, 0xD8, 0xCB, 0x20, 0xDD, 0xE4, 0xFE, 0x84, 0x68,
+ 0xFD, 0x86, 0x1E, 0xE3, 0x87, 0x7B, 0x74, 0x61, 0xB2, 0x03, 0xC5, 0xA5, 0x06, 0xED, 0x4E, 0x87,
+ 0x4E, 0x31, 0x0C, 0x0A, 0x2B, 0x49, 0x25, 0xD1, 0x33, 0xFF, 0xFE, 0xAC, 0x5E, 0x1F, 0xB2, 0x8D,
+ 0xC0, 0x0D, 0x67, 0xAD, 0x92, 0x64, 0x12, 0xCD, 0x4C, 0x80, 0x68, 0x8B, 0x91, 0xA3, 0xBD, 0x88,
+ 0xA6, 0x0F, 0xEC, 0x4D, 0x26, 0x1F, 0xD6, 0xB1, 0x8C, 0x5D, 0x6B, 0x25, 0x7A, 0x98, 0xA7, 0x30,
+ 0x57, 0x7D, 0x9D, 0x31, 0x8B, 0xE0, 0x61, 0xBC, 0xA1, 0xB5, 0xB6, 0xD3, 0x21, 0xAF, 0x26, 0x7C,
+ 0x53, 0xC2, 0xFB, 0x3E, 0x82, 0xEC, 0xB3, 0x17, 0x02, 0x82, 0xD7, 0x00, 0x82, 0x0A, 0x28, 0x4B,
+ 0xDE, 0x55, 0x8E, 0x9E, 0x42, 0xB5, 0x93, 0xA6, 0x0C, 0x54, 0x09, 0x59, 0xD0, 0x02, 0x68, 0xBE,
+ 0x00, 0x0C, 0x8F, 0x50, 0x73, 0xE9, 0x19, 0x03, 0xBB, 0x47, 0x65, 0xDE, 0x85, 0x23, 0x8C, 0xDC,
+ 0xBB, 0x5A, 0xB5, 0x59, 0xC7, 0xA3, 0x1A, 0xDF, 0x10, 0x1E, 0x2C, 0x10, 0xD7, 0x36, 0xAE, 0x1E,
+ 0x27, 0x78, 0x4D, 0xEE, 0xE6, 0xC0, 0x30, 0xC3, 0x57, 0x0B, 0x5F, 0xFF, 0x5A, 0xB1, 0x05, 0x73,
+ 0xF6, 0x4D, 0x1C, 0x3E, 0x18, 0x3F, 0x01, 0x43, 0x47, 0x23, 0xE2, 0x0F, 0xA9, 0x1C, 0xDE, 0xC5,
+ 0xAA, 0x2B, 0x24, 0xAB, 0x8F, 0xE0, 0xEC, 0x3A, 0x57, 0xBD, 0xBD, 0x47, 0xF4, 0x86, 0x53, 0x7A,
+ 0xC3, 0x32, 0x20, 0x78, 0x3E, 0x0A, 0xDB, 0xBD, 0x33, 0xA4, 0x62, 0x57, 0x55, 0x5B, 0xB3, 0x33,
+ 0x48, 0x2E, 0x24, 0xCD, 0x54, 0xB9, 0xD6, 0x7B, 0x73, 0x51, 0xDB, 0x45, 0xC5, 0x91, 0xDF, 0x49,
+ 0xC0, 0x83, 0x22, 0x2C, 0x08, 0x9A, 0xE7, 0x24, 0x31, 0xEF, 0xDA, 0x7E, 0x54, 0xE1, 0xAF, 0x43,
+ 0xB3, 0xBB, 0x57, 0x79, 0x4A, 0x07, 0xCC, 0x50, 0x6D, 0x2F, 0x32, 0x46, 0x00, 0xE0, 0xCA, 0x4A,
+ 0xE6, 0x2C, 0xE6, 0xCD, 0x41, 0x23, 0xE3, 0xB9, 0x2F, 0x6A, 0x9B, 0xB7, 0xDE, 0x17, 0x50, 0xEA,
+ 0x38, 0x58, 0x97, 0x40, 0x34, 0x4A, 0x9A, 0x57, 0x5E, 0x68, 0x1A, 0xA3, 0xF9, 0x53, 0xB3, 0xC3,
+ 0x5F, 0xC5, 0x20, 0x37, 0xC9, 0x59, 0xFC, 0xE4, 0xFC, 0x3F, 0xD4, 0x5B, 0xBA, 0xF8, 0xB4, 0xAD,
+ 0x50, 0x65, 0xAE, 0xDC, 0x5D, 0xE6, 0xF9, 0x95, 0xF2, 0xAC, 0x41, 0xC2, 0x96, 0x0F, 0x3F, 0x1F,
+ 0xE3, 0x33, 0x7A, 0x0B, 0x13, 0x2D, 0x68, 0x34, 0xAA, 0x23, 0x5B, 0xC9, 0x81, 0x9D, 0xD1, 0x97,
+ 0x4A, 0x5A, 0x55, 0xD6, 0xF9, 0xCE, 0x7F, 0xA2, 0x05, 0x00, 0x63, 0xF8, 0xF8, 0xE2, 0xD4, 0x43,
+ 0x2B, 0x92, 0x63, 0x49, 0x3B, 0xE0, 0x05, 0x60, 0xBA, 0x29, 0x1F, 0x20, 0x09, 0x3E, 0xB9, 0x56,
+ 0xF8, 0x8D, 0xBC, 0x23, 0xAA, 0xC8, 0xDB, 0xAE, 0xF7, 0xED, 0x15, 0x6E, 0xFE, 0xA8, 0xBA, 0xFC,
+ 0xD5, 0x5B, 0x85, 0xCC, 0x78, 0xC6, 0x50, 0xA1, 0x96, 0xE8, 0x0D, 0x56, 0xBD, 0x45, 0x35, 0xFB,
+ 0xF3, 0xF0, 0x1F, 0x87, 0x90, 0xD8, 0x1B, 0x49, 0x3B, 0x8B, 0xB6, 0x44, 0xF5, 0x08, 0xA7, 0xCB,
+ 0xE6, 0x29, 0x72, 0x01, 0xC5, 0x73, 0x07, 0xD3, 0x6F, 0x8A, 0x08, 0xBC, 0x35, 0x07, 0x7B, 0xE8,
+ 0x3F, 0x85, 0xE4, 0x63, 0x23, 0xF2, 0x99, 0x99, 0x52, 0x6D, 0x4F, 0xEC, 0xAE, 0x92, 0x8A, 0xB1,
+ 0x5D, 0x62, 0x20, 0xFE, 0xC6, 0x8B, 0x5B, 0xA1, 0xD9, 0x21, 0x1E, 0xB5, 0x26, 0x6C, 0x53, 0x92,
+ 0x9C, 0x82, 0x66, 0xCD, 0xA0, 0x2E, 0xD2, 0x72, 0xE2, 0xEB, 0xB1, 0x21, 0xCD, 0xC6, 0xC2, 0xB0,
+ 0xB8, 0x13, 0x96, 0x1B, 0xF3, 0x5E, 0xF8, 0x46, 0xA2, 0xA7, 0x73, 0xFB, 0x67, 0xCB, 0x5E, 0x24,
+ 0x1E, 0x1A, 0x40, 0xA2, 0x96, 0x9E, 0x72, 0x44, 0x3F, 0xFA, 0x4C, 0x03, 0x9B, 0x2B, 0x0E, 0x44,
+ 0xDB, 0x0F, 0x2F, 0x55, 0x82, 0xAF, 0x08, 0x27, 0x85, 0xFB, 0xFE, 0x55, 0x08, 0x28, 0x85, 0x04,
+ 0x92, 0x0D, 0xC7, 0x25, 0x48, 0x2C, 0x2A, 0x49, 0x31, 0x52, 0x65, 0xB4, 0xB4, 0xF2, 0xC0, 0xD2,
+ 0x64, 0x0C, 0xB0, 0xEB, 0xC3, 0x6F, 0x11, 0xF6, 0xB3, 0x8B, 0xB1, 0xA8, 0x1F, 0xB2, 0x69, 0x46,
+ 0x7E, 0x15, 0xFE, 0xCC, 0xE2, 0x1A, 0xF9, 0x1F, 0x7B, 0x65, 0xDD, 0xA6, 0xD9, 0x10, 0x03, 0xD5,
+ 0x37, 0x8C, 0x25, 0x41, 0x0B, 0xFF, 0xFF, 0xF8, 0x46, 0xCE, 0x8A, 0x7A, 0x9F, 0x74, 0x61, 0xD8,
+ 0xD4, 0x64, 0xE6, 0xF1, 0x46, 0xC6, 0x04, 0xC0, 0xEA, 0xDB, 0x10, 0x40, 0x6B, 0x9B, 0xD0, 0xC1,
+ 0x45, 0x83, 0x1C, 0x74, 0xA8, 0x3B, 0x5F, 0xC9, 0x45, 0x69, 0x70, 0x90, 0xBD, 0x93, 0x79, 0x82,
+ 0x71, 0x96, 0x75, 0x23, 0x01, 0x9A, 0x3B, 0x0E, 0xCA, 0x7D, 0xDE, 0x66, 0x49, 0x57, 0x11, 0xB2,
+ 0xBF, 0xB4, 0x7E, 0x33, 0xEB, 0xA4, 0x4E, 0xE0, 0x33, 0xCC, 0x44, 0x6F, 0x89, 0xEC, 0xD0, 0x7D,
+ 0x75, 0x79, 0x41, 0x96, 0x37, 0x9D, 0x5A, 0x82, 0x7A, 0xAA, 0xE8, 0x1A, 0x43, 0xA3, 0xE8, 0x1A,
+ 0x24, 0x14, 0x29, 0x84, 0xE0, 0x2E, 0xD0, 0x7F, 0xAC, 0x35, 0x52, 0xF2, 0xE5, 0xD5, 0xA9, 0x7B,
+ 0x9F, 0x55, 0xF3, 0xF1, 0xCB, 0x31, 0x3C, 0xDF, 0x22, 0x4A, 0x1A, 0x47, 0xB7, 0x5E, 0x3A, 0x8C,
+ 0x1A, 0xF2, 0xE7, 0x0C, 0x9A, 0xC8, 0xE4, 0xF9, 0xF9, 0x30, 0xC7, 0x00, 0x9F, 0x57, 0xEF, 0x67,
+ 0xB4, 0x36, 0x0A, 0xF9, 0xB4, 0x3F, 0xE6, 0x20, 0x66, 0x36, 0x88, 0x60, 0x19, 0x74, 0x8B, 0x29,
+ 0x55, 0x64, 0xF2, 0x6C, 0x9D, 0x3B, 0xF4, 0xE9, 0xC8, 0x74, 0x48, 0x48, 0xCA, 0x56, 0xFF, 0x74,
+ 0xE7, 0x39, 0x98, 0xD9, 0x1D, 0xCE, 0x22, 0x98, 0x35, 0xB6, 0xF5, 0xA8, 0x70, 0x51, 0xA8, 0x53,
+ 0x6C, 0xEB, 0xB7, 0x99, 0xDF, 0x97, 0x34, 0x3C, 0x51, 0x74, 0x4E, 0x1E, 0xB9, 0xF4, 0x11, 0xB6,
+ 0x3B, 0xAC, 0x5F, 0x32, 0xA3, 0xB8, 0x3E, 0xB3, 0x78, 0x45, 0xEB, 0x08, 0xB2, 0xAB, 0xA8, 0xD9,
+ 0xBD, 0x32, 0x95, 0xD2, 0x5C, 0xAE, 0xF2, 0x86, 0x82, 0x1A, 0x53, 0xBB, 0x97, 0xA4, 0x8E, 0x4E,
+ 0xD4, 0x1B, 0x3D, 0x5B, 0x70, 0x4A, 0xCE, 0x7A, 0x1A, 0xBD, 0xAE, 0xF0, 0xE4, 0xF2, 0xC0, 0x9D,
+ 0x00, 0xBA, 0xD7, 0xAF, 0xF6, 0x63, 0x7D, 0x7C, 0xA0, 0x58, 0x29, 0x45, 0xBF, 0x96, 0x8F, 0x5D,
+ 0xE1, 0x79, 0x75, 0x52, 0x98, 0xBF, 0x8E, 0x2C, 0x9B, 0xAE, 0xA5, 0x1B, 0x2A, 0xB0, 0x8A, 0x89,
+ 0x25, 0xFE, 0x4D, 0xDA, 0x12, 0xFE, 0xA5, 0x11, 0xC3, 0x72, 0xEB, 0xE5, 0x91, 0xE0, 0xD8, 0x7E,
+ 0x9B, 0xD1, 0x2D, 0xA5, 0x25, 0x3D, 0x18, 0x53, 0x68, 0x5C, 0x22, 0x7D, 0x18, 0x0A, 0x12, 0x3D,
+ 0x40, 0x08, 0x40, 0x59, 0xA6, 0x12, 0x5F, 0x1C, 0x3A, 0xC5, 0xF5, 0xDB, 0xF6, 0x8D, 0x04, 0x90,
+ 0xF9, 0xB7, 0x43, 0x6D, 0x88, 0x42, 0x0F, 0x5F, 0x97, 0xD0, 0x6E, 0x1B, 0xA3, 0xED, 0x0E, 0xEA,
+ 0x68, 0xDE, 0x9C, 0x42, 0x91, 0xE3, 0xC2, 0xFC, 0xB3, 0x06, 0x7F, 0x55, 0x43, 0x07, 0x1B, 0x76,
+ 0xC2, 0x8F, 0xFE, 0x55, 0xA9, 0x08, 0x83, 0x7F, 0xC5, 0xD9, 0x69, 0xAB, 0x91, 0xCC, 0x68, 0x6C,
+ 0x7C, 0xCA, 0x45, 0x99, 0x72, 0x15, 0xF1, 0x50, 0x47, 0xC6, 0x10, 0xAD, 0xB2, 0x91, 0x93, 0xEA,
+ 0x02, 0x57, 0x73, 0x96, 0x91, 0xB3, 0xD1, 0x06, 0x33, 0x2F, 0x73, 0xB0, 0x9F, 0xB1, 0xC3, 0x44,
+ 0x48, 0x3F, 0xB0, 0x99, 0xD4, 0xE5, 0x89, 0x03, 0xC6, 0x10, 0x31, 0xBA, 0xD4, 0xD0, 0x93, 0x91,
+ 0xBC, 0x21, 0xFA, 0xEA, 0x4B, 0xB1, 0x1A, 0x01, 0x88, 0x0C, 0x30, 0x03, 0x78, 0x8D, 0xF6, 0xF5,
+ 0x99, 0x57, 0x1B, 0x00, 0xBB, 0x08, 0x31, 0x23, 0xA4, 0xAD, 0x68, 0x59, 0x80, 0xE5, 0x52, 0x59,
+ 0x32, 0xE0, 0xC2, 0x93, 0x3B, 0x99, 0xC2, 0x0E, 0x03, 0x46, 0x4A, 0x5E, 0x12, 0x24, 0x7F, 0xE8,
+ 0x35, 0xA5, 0xA3, 0x1A, 0xB6, 0xF6, 0xA5, 0xBE, 0xEA, 0x93, 0x04, 0xFA, 0x06, 0x0A, 0x9B, 0xEB,
+ 0x0D, 0x9C, 0x52, 0x57, 0xC7, 0x88, 0x59, 0xAF, 0x2A, 0x72, 0x59, 0x7C, 0xB3, 0xFC, 0x92, 0x1B,
+ 0x6E, 0xE4, 0x76, 0x1F, 0xD5, 0xFC, 0x4A, 0xF1, 0x2B, 0xEF, 0x64, 0xF8, 0x48, 0x17, 0x43, 0x7E,
+ 0x1A, 0xC0, 0xAE, 0x3B, 0xC1, 0xC2, 0x37, 0x2E, 0xDC, 0x16, 0xAB, 0x8F, 0xE7, 0x54, 0x9D, 0x7C,
+ 0xFD, 0x38, 0xC0, 0xE7, 0x7F, 0xF9, 0x5E, 0x54, 0x56, 0x51, 0xE9, 0x37, 0x95, 0x8A, 0x9E, 0xF0,
+ 0x8F, 0x86, 0x57, 0xE8, 0x49, 0x1C, 0xCE, 0x26, 0x29, 0x94, 0x8C, 0x31, 0x35, 0xB3, 0xD5, 0x7A,
+ 0x22, 0x36, 0xFB, 0x8A, 0x65, 0x21, 0xED, 0x02, 0x0D, 0x97, 0x92, 0xD5, 0x37, 0x6E, 0x25, 0xAC,
+ 0x23, 0xC2, 0x92, 0xCF, 0xF4, 0x11, 0x9B, 0x04, 0x58, 0x31, 0x9C, 0xB6, 0xFA, 0xF8, 0x60, 0xDF,
+ 0xA1, 0xE0, 0x53, 0x5F, 0x78, 0x5D, 0x27, 0x02, 0xD7, 0x60, 0xD3, 0x78, 0xF6, 0xF8, 0x0D, 0xA7,
+ 0x9F, 0x07, 0x91, 0xAB, 0xDC, 0xB6, 0xB4, 0x8E, 0xD3, 0xCE, 0x44, 0x30, 0xEE, 0xEC, 0x94, 0x32,
+ 0xB0, 0x0C, 0x49, 0x07, 0x88, 0x76, 0x67, 0xC0, 0xD7, 0x46, 0x84, 0x1F, 0x07, 0xBA, 0x1A, 0xD6,
+ 0xB9, 0x3B, 0xBF, 0xD1, 0x81, 0xF0, 0xE0, 0xB8, 0xB4, 0xE8, 0x00, 0x20, 0x74, 0xA2, 0x2D, 0x25,
+ 0x40, 0xE6, 0x97, 0x0C, 0xCA, 0xCF, 0xE6, 0xCD, 0x47, 0x9A, 0xAC, 0xD8, 0x68, 0x96, 0x80, 0x3F,
+ 0x1C, 0x2E, 0x22, 0x8F, 0x34, 0x37, 0xCC, 0x7A, 0xC5, 0x30, 0x24, 0xB7, 0x98, 0x25, 0x62, 0x41,
+ 0x6C, 0x9B, 0x38, 0x51, 0x91, 0x99, 0x98, 0x61, 0x54, 0xE7, 0x56, 0xD0, 0x76, 0x4D, 0xFB, 0xEB,
+ 0xE3, 0x7A, 0x85, 0xCF, 0x18, 0x31, 0x6D, 0xD8, 0x58, 0x17, 0x40, 0x18, 0x9F, 0xED, 0x01, 0xBF,
+ 0x68, 0x6D, 0x5E, 0x3D, 0xE7, 0x02, 0x37, 0xF8, 0x11, 0x71, 0x2D, 0x1A, 0xD4, 0x7E, 0xC6, 0xBD,
+ 0x48, 0xB9, 0xE5, 0xF1, 0xF5, 0x9C, 0x6B, 0x34, 0xC4, 0xB8, 0xB2, 0x24, 0x04, 0x9E, 0xFC, 0x02,
+ 0x99, 0x5E, 0xF6, 0x3B, 0x37, 0xAA, 0xA6, 0x54, 0xAB, 0x34, 0x46, 0x26, 0xF5, 0xC7, 0x5E, 0x06,
+ 0xFA, 0x6E, 0x6E, 0xB1, 0x6E, 0xBC, 0xF1, 0x64, 0xDB, 0x86, 0x07, 0x69, 0x35, 0x51, 0x72, 0xCE,
+ 0x8B, 0x3C, 0xE5, 0x1D, 0xB0, 0x54, 0xCD, 0xDE, 0x29, 0x52, 0x72, 0x7F, 0xDF, 0xA0, 0xE7, 0x75,
+ 0xDA, 0xED, 0x05, 0xE9, 0x5E, 0xFE, 0x7F, 0xE5, 0xEF, 0x3B, 0x21, 0x0E, 0xD0, 0x08, 0xE7, 0x7F,
+ 0x77, 0x69, 0xF3, 0x5D, 0x00, 0xB1, 0x51, 0xC4, 0x0C, 0xBA, 0x8D, 0xC2, 0x5E, 0x36, 0xE9, 0xF7,
+ 0xCC, 0x50, 0xEE, 0xD8, 0xF9, 0x5E, 0x53, 0x26, 0x49, 0x7B, 0xAD, 0xE2, 0x80, 0xDF, 0xBE, 0x0D,
+ 0xD1, 0x6A, 0x86, 0x35, 0x34, 0x6D, 0x35, 0x6D, 0x2F, 0xA9, 0xAC, 0x14, 0xE7, 0x06, 0xB5, 0x75,
+ 0xED, 0x5A, 0xF5, 0x5B, 0xE1, 0xA5, 0x64, 0x55, 0x0F, 0x72, 0x1A, 0x43, 0x70, 0x48, 0x6B, 0x13,
+ 0xC1, 0x18, 0x2C, 0x50, 0xC7, 0xCF, 0x7D, 0x69, 0x2C, 0x20, 0xD3, 0xEE, 0xE0, 0xB7, 0x29, 0x97,
+ 0xB2, 0x89, 0xF8, 0xAF, 0x4B, 0x4D, 0xBB, 0x44, 0xFB, 0xC6, 0x28, 0x1D, 0xD3, 0x05, 0xD2, 0xF5,
+ 0x59, 0x2D, 0x92, 0x7D, 0xEC, 0xB0, 0x81, 0x76, 0x76, 0x7A, 0xF8, 0x09, 0x8E, 0x67, 0x5A, 0xAC,
+ 0x77, 0x4C, 0x64, 0x4D, 0x6B, 0x61, 0xE9, 0x27, 0x85, 0x91, 0x57, 0xF9, 0x45, 0xF0, 0xFC, 0xCC,
+ 0x11, 0x0E, 0x6D, 0x84, 0x8F, 0x21, 0xE4, 0xB2, 0xA7, 0x7B, 0x9B, 0x31, 0xF9, 0xEF, 0x45, 0xE1,
+ 0x3F, 0x74, 0x10, 0xEA, 0xF5, 0xBF, 0x65, 0x7E, 0xC8, 0xCF, 0x01, 0xBD, 0x40, 0x41, 0x32, 0x9D,
+ 0x3E, 0xC0, 0x00, 0xC1, 0x9E, 0x6A, 0xE2, 0x54, 0xA1, 0x0D, 0xB3, 0x84, 0x3A, 0xD4, 0x08, 0xC7,
+ 0x4D, 0x6A, 0x01, 0xC5, 0xD3, 0xB9, 0x80, 0xB9, 0x3C, 0xD1, 0x81, 0xB7, 0x5D, 0x8D, 0x37, 0xD4,
+ 0x3C, 0x5A, 0xDC, 0xC9, 0xDD, 0x84, 0x4F, 0x56, 0xBC, 0xCC, 0xA5, 0x0D, 0x9A, 0x53, 0x9D, 0xCC,
+ 0x7A, 0x52, 0xA7, 0xAE, 0x3A, 0x7F, 0x4E, 0xE1, 0x63, 0xAE, 0xFF, 0x0E, 0xA7, 0x7A, 0x3B, 0x05,
+ 0x0A, 0x53, 0xC5, 0xAC, 0xD3, 0x58, 0xB5, 0xB6, 0xE1, 0xC1, 0x8B, 0x1C, 0xEF, 0x77, 0xEB, 0x2A,
+ 0xAF, 0x41, 0xDA, 0x4D, 0xBC, 0xC5, 0x37, 0x27, 0xCD, 0x20, 0xBD, 0xA9, 0x83, 0x64, 0xA6, 0x28,
+ 0xDE, 0x1C, 0xD7, 0x7A, 0x98, 0xEA, 0x55, 0x3D, 0xE2, 0x59, 0x2F, 0x4E, 0x96, 0xEE, 0xB2, 0xAF,
+ 0xAA, 0xD3, 0xC7, 0x03, 0xEB, 0x47, 0x37, 0xF5, 0x3C, 0x6A, 0x07, 0x88, 0x20, 0x9D, 0x2A, 0xD8,
+ 0xED, 0x0F, 0x38, 0xB7, 0x55, 0x3E, 0x99, 0x67, 0x8A, 0x80, 0x0F, 0x20, 0x38, 0xC2, 0x3E, 0x21,
+ 0x65, 0x07, 0x62, 0x7D, 0x56, 0xE2, 0x61, 0x3E, 0x1F, 0x29, 0x20, 0x06, 0x2E, 0xB4, 0xEA, 0x23,
+ 0x72, 0x91, 0xB6, 0x2B, 0x78, 0xB1, 0x01, 0xF0, 0x25, 0x0E, 0x6F, 0xD0, 0x3A, 0x98, 0x14, 0x4B,
+ 0xF7, 0x18, 0x27, 0x70, 0xBF, 0x89, 0x29, 0xF2, 0x0C, 0xFA, 0xAC, 0x26, 0x73, 0xBC, 0xAA, 0x21,
+ 0x5C, 0x0A, 0xC4, 0xF6, 0x95, 0x10, 0xA3, 0x90, 0x46, 0x49, 0x5C, 0x53, 0x25, 0x95, 0x93, 0x80,
+ 0x0F, 0xF3, 0xB5, 0xA1, 0x7F, 0x27, 0xD5, 0xF2, 0x9D, 0x41, 0xA0, 0x34, 0xAB, 0xDC, 0xD2, 0x8F,
+ 0xA4, 0xBC, 0xE8, 0x54, 0x06, 0x60, 0x13, 0x6D, 0x9B, 0x74, 0x57, 0x82, 0x1C, 0x0D, 0x1F, 0xDB,
+ 0x54, 0xC3, 0x4F, 0x0C, 0xC3, 0x99, 0x0F, 0xF6, 0x6B, 0x6A, 0x72, 0x4F, 0x2C, 0x01, 0x0C, 0x91,
+ 0xDC, 0x06, 0x05, 0xA7, 0xCC, 0xD4, 0x6C, 0xB3, 0x35, 0xAF, 0x10, 0xDE, 0xEE, 0xE6, 0x42, 0x93,
+ 0x11, 0x41, 0x66, 0x86, 0x2F, 0xD6, 0xCF, 0xC3, 0xA7, 0x61, 0x24, 0xD0, 0xC8, 0x9D, 0x8B, 0x01,
+ 0x68, 0xF7, 0x54, 0x10, 0x5C, 0xE7, 0x01, 0x49, 0xA3, 0x4D, 0x5D, 0x97, 0xEA, 0x79, 0xA8, 0xFA,
+ 0x09, 0x0F, 0xAD, 0x93, 0x16, 0xCD, 0x75, 0x6B, 0x70, 0x79, 0xDB, 0xC3, 0xC8, 0x04, 0xE1, 0xD6,
+ 0xDA, 0x11, 0x8E, 0x4B, 0xB6, 0x6E, 0x60, 0x5D, 0x21, 0xAA, 0xB0, 0xC0, 0xA0, 0xCD, 0xC7, 0x81,
+ 0x92, 0x0F, 0xF3, 0xBC, 0xA3, 0x80, 0x5C, 0x54, 0xCA, 0x05, 0x9C, 0x75, 0x5B, 0x80, 0x3E, 0x66,
+ 0x76, 0x65, 0xAA, 0x96, 0xE3, 0x6E, 0x9A, 0x6C, 0x09, 0xEC, 0x74, 0xF3, 0x95, 0x7A, 0xA8, 0x0F,
+ 0x4D, 0x08, 0x1B, 0x39, 0x7F, 0xA3, 0x27, 0xA3, 0x50, 0x4F, 0xCA, 0x1A, 0xDA, 0x40, 0xFE, 0x6F,
+ 0x63, 0xFB, 0xB6, 0xBC, 0x03, 0x8F, 0xBD, 0x4A, 0x95, 0xE2, 0xA1, 0xCE, 0x1E, 0xFA, 0xE6, 0xF0,
+ 0x6D, 0x65, 0x7E, 0x03, 0x6C, 0xEF, 0x10, 0x88, 0x2F, 0xC3, 0x35, 0xFC, 0x67, 0xDB, 0xEF, 0xF3,
+ 0xA1, 0xBC, 0x5B, 0x12, 0x9C, 0x4C, 0xFF, 0xD9, 0x5E, 0x53, 0x4E, 0xEC, 0x9C, 0x67, 0x9F, 0xED,
+ 0x24, 0x75, 0x9D, 0xC5, 0xE0, 0xCB, 0x74, 0x89, 0x0D, 0x0B, 0x3B, 0x85, 0x24, 0x12, 0xAA, 0xF8,
+ 0x22, 0x32, 0xAC, 0xDD, 0x3B, 0xC6, 0x90, 0x6F, 0xEF, 0xBB, 0x72, 0xEF, 0xCA, 0x0D, 0xB1, 0x49,
+ 0x30, 0x9B, 0xE3, 0xBC, 0x50, 0x8D, 0x8D, 0xE0, 0x21, 0x79, 0x64, 0x89, 0x01, 0x59, 0xEF, 0xD6,
+ 0x0C, 0x83, 0xED, 0xA4, 0x23, 0xCB, 0x41, 0xC5, 0x4D, 0x10, 0xC4, 0xCF, 0xC2, 0x2F, 0xC7, 0xA3,
+ 0xD9, 0x03, 0xF5, 0x11, 0xD4, 0x2C, 0xC5, 0x31, 0x62, 0xF6, 0xAF, 0x90, 0x39, 0x3D, 0xC8, 0xCB,
+ 0x9F, 0x98, 0xCD, 0x00, 0xBD, 0x0E, 0x80, 0xE4, 0xDF, 0xE7, 0x66, 0x00, 0x19, 0xA4, 0x8D, 0x40,
+ 0x1A, 0x1E, 0xED, 0x2B, 0xD2, 0xAB, 0xDC, 0x6E, 0x0F, 0x0A, 0xD4, 0xD7, 0x44, 0xC7, 0x74, 0x85,
+ 0xC2, 0xF2, 0x63, 0x96, 0x62, 0x90, 0x56, 0x0D, 0x3B, 0x27, 0x1A, 0xB1, 0xBF, 0x9F, 0x58, 0x07,
+ 0xF1, 0xF5, 0x3E, 0xAF, 0x07, 0x00, 0x76, 0xA9, 0xB7, 0x38, 0x7A, 0xBC, 0xF8, 0xD7, 0x83, 0xF7,
+ 0x17, 0x9F, 0xD5, 0xD5, 0x0A, 0x34, 0xBE, 0x07, 0x28, 0xFB, 0xA9, 0x00, 0xC3, 0x2A, 0xD0, 0x32,
+ 0xC6, 0xAD, 0x4A, 0x58, 0x5E, 0xD9, 0xAD, 0x4D, 0x86, 0x14, 0x1D, 0x3E, 0xEB, 0xE9, 0xE5, 0x7D,
+ 0xD0, 0x95, 0x33, 0x54, 0xEC, 0xC1, 0x72, 0x8B, 0xD1, 0x5A, 0x23, 0xBF, 0xB8, 0xD0, 0x85, 0x6E,
+ 0x38, 0x93, 0xD7, 0xD4, 0xE9, 0x7C, 0x03, 0xC7, 0x21, 0x3F, 0x38, 0x36, 0xFB, 0xF5, 0xAD, 0xF4,
+ 0xCA, 0x1A, 0x03, 0x82, 0x9B, 0x3B, 0xEB, 0xB0, 0x0F, 0xE1, 0xEF, 0x98, 0x6D, 0x76, 0x8C, 0x1E,
+ 0xDC, 0xBA, 0x45, 0xE0, 0xE9, 0xAE, 0xC7, 0xC9, 0xAC, 0x91, 0xE7, 0xB5, 0xD1, 0x18, 0xFA, 0x56,
+ 0x5A, 0xA1, 0x92, 0xF9, 0x2C, 0x9C, 0x06, 0x4F, 0x34, 0xDD, 0x80, 0xB5, 0xF4, 0x5F, 0x7E, 0xE0,
+ 0xAF, 0xAB, 0xDE, 0x95, 0x72, 0x7F, 0xCD, 0x5D, 0x29, 0x54, 0x6A, 0xA8, 0x13, 0x5B, 0xDB, 0xCB,
+ 0x30, 0xEE, 0x56, 0xD3, 0x45, 0x8E, 0xCB, 0x59, 0xDA, 0x07, 0xED, 0xEC, 0x43, 0x5E, 0x17, 0x44,
+ 0xAF, 0xBC, 0x81, 0x5C, 0x4B, 0xDB, 0xAE, 0xA0, 0x46, 0x19, 0xA8, 0x61, 0x35, 0x9F, 0x17, 0xB3,
+ 0xAF, 0xCC, 0x22, 0xC6, 0x0B, 0x78, 0x58, 0xE9, 0x87, 0xE2, 0x2D, 0x96, 0xF0, 0xA9, 0x62, 0x12,
+ 0x35, 0xD0, 0x46, 0x6C, 0x61, 0xAE, 0xB9, 0x5D, 0x5A, 0xDE, 0x8B, 0x7F, 0xAC, 0x9E, 0x29, 0xA1,
+ 0xEA, 0xC7, 0x1B, 0x24, 0x9E, 0x08, 0x48, 0xBD, 0x23, 0xF6, 0xAB, 0x4E, 0xE9, 0xDE, 0xAF, 0x4C,
+ 0x79, 0xCC, 0x52, 0xB2, 0xAC, 0xF4, 0x01, 0xA9, 0xA8, 0x02, 0x9B, 0x14, 0x86, 0x4B, 0xEE, 0x94,
+ 0xA8, 0x34, 0x6C, 0x00, 0x4F, 0x4C, 0xE1, 0x6D, 0xF9, 0x19, 0x8F, 0x36, 0x5E, 0x22, 0x5D, 0xB7,
+ 0x03, 0x62, 0x7C, 0x4D, 0xC4, 0xF0, 0x4C, 0x3C, 0x5F, 0xBD, 0x0E, 0xB0, 0x74, 0x14, 0x08, 0xEE,
+ 0x0E, 0x06, 0x65, 0xAB, 0x69, 0x7A, 0x70, 0x67, 0xC2, 0x12, 0x04, 0x45, 0xF2, 0xC8, 0xD7, 0x80,
+ 0x7F, 0xDB, 0xB5, 0xD0, 0xF7, 0xAB, 0x62, 0x7A, 0xFA, 0xD6, 0x1A, 0x9E, 0x14, 0x4C, 0x4A, 0x6C,
+ 0x75, 0x81, 0x37, 0xEF, 0x68, 0x4A, 0x5D, 0x23, 0xDD, 0x7E, 0xF5, 0xDD, 0x9E, 0xEF, 0xB3, 0xC8,
+ 0x3F, 0x18, 0x65, 0x42, 0x14, 0x68, 0x77, 0x56, 0x24, 0x8C, 0xAD, 0x7A, 0xC3, 0x1D, 0xB3, 0xAA,
+ 0x3C, 0x90, 0x38, 0x65, 0xA2, 0x6A, 0x42, 0xD9, 0x4D, 0xA1, 0xAA, 0x04, 0xA5, 0xE6, 0x36, 0xF4,
+ 0xA3, 0x18, 0xA3, 0x9B, 0x8C, 0x9A, 0x5E, 0xAF, 0x6D, 0xDC, 0x6A, 0xD3, 0x61, 0xB7, 0x59, 0x2C,
+ 0xF4, 0xE1, 0x16, 0xFF, 0xFC, 0x3D, 0xBC, 0x2F, 0xD6, 0xC1, 0xEE, 0xBD, 0x9B, 0x48, 0x11, 0x90,
+ 0x7B, 0xED, 0x58, 0x9B, 0x84, 0x57, 0x85, 0xB3, 0xB3, 0x65, 0x14, 0x08, 0x14, 0x8F, 0x71, 0xF2,
+ 0x50, 0x38, 0x7C, 0xCE, 0xEE, 0x47, 0xBD, 0xFD, 0x27, 0x6B, 0x07, 0xB7, 0xB2, 0xBB, 0x05, 0xB0,
+ 0x4F, 0xB5, 0x94, 0xA0, 0x30, 0x89, 0x97, 0xD2, 0x2E, 0xE1, 0xCC, 0xAC, 0xDA, 0x95, 0x2F, 0x2E,
+ 0xDD, 0xA9, 0xA9, 0xD0, 0xC6, 0xC3, 0x77, 0xB8, 0xBA, 0x19, 0xD2, 0x66, 0x91, 0xB6, 0xA8, 0x4D,
+ 0x34, 0xC5, 0xE3, 0xC9, 0x4B, 0x8C, 0x49, 0x68, 0xD2, 0x47, 0xC5, 0x8C, 0x10, 0xE4, 0xBB, 0x40,
+ 0x04, 0x7B, 0x26, 0x34, 0x75, 0x53, 0xC5, 0xA5, 0x57, 0x91, 0x11, 0x81, 0x49, 0x79, 0x0F, 0xE9,
+ 0x95, 0x33, 0x6C, 0xF2, 0x2F, 0x2A, 0x07, 0x43, 0x71, 0xAD, 0x7B, 0x2C, 0x99, 0xFD, 0x4E, 0xC0,
+ 0x8C, 0xC8, 0x69, 0x12, 0xF9, 0x1F, 0x11, 0xFA, 0x28, 0x80, 0xC7, 0xEE, 0x50, 0x63, 0x6D, 0x08,
+ 0x88, 0x9D, 0x6C, 0x2E, 0x05, 0x54, 0xC2, 0x0B, 0x26, 0x69, 0xAB, 0xA5, 0xAD, 0xC1, 0xFD, 0xD9,
+ 0x1D, 0xE6, 0x85, 0xD5, 0x71, 0xB6, 0xA9, 0xE9, 0x10, 0xB7, 0x2F, 0x1E, 0x12, 0x9C, 0x41, 0x14,
+ 0xAF, 0xE0, 0x07, 0x8C, 0xF2, 0xA3, 0x7F, 0xA4, 0x94, 0x91, 0xF9, 0x41, 0x62, 0x8B, 0xE9, 0xA4,
+ 0x11, 0x78, 0x9D, 0x75, 0x33, 0x01, 0xBD, 0x7F, 0x1E, 0x4F, 0x2F, 0x80, 0x7A, 0xF9, 0x70, 0x84,
+ 0xE6, 0x45, 0xDE, 0x76, 0xD8, 0x36, 0x5C, 0xC1, 0xB9, 0x42, 0x59, 0x85, 0x9C, 0x60, 0x5F, 0x29,
+ 0x03, 0x34, 0xE8, 0x65, 0xEB, 0x99, 0x7B, 0xCD, 0x3A, 0x9C, 0xB6, 0x9E, 0xA9, 0xBA, 0x7D, 0x6D,
+ 0x9D, 0x27, 0xDD, 0xBE, 0xD4, 0xF9, 0xB5, 0xF8, 0x66, 0xD5, 0xAC, 0x27, 0x9D, 0x8F, 0x72, 0x04,
+ 0x1D, 0xA3, 0x91, 0x9E, 0x3C, 0xBA, 0x4B, 0xF7, 0x58, 0x06, 0xBD, 0xE6, 0x8F, 0xB5, 0xA5, 0x8F,
+ 0x7F, 0x1C, 0xF9, 0xD9, 0x2E, 0xD6, 0xB0, 0x52, 0x2D, 0x23, 0x8B, 0x8E, 0xD7, 0xE8, 0xFF, 0x5E,
+ 0x04, 0x4A, 0xC4, 0xDA, 0x95, 0xA4, 0x91, 0xFF, 0xCB, 0x36, 0x38, 0xEE, 0x47, 0xB7, 0x51, 0xCD,
+ 0x80, 0x37, 0x0D, 0x06, 0xB6, 0x56, 0x19, 0xFB, 0xAF, 0x4E, 0x94, 0x57, 0x12, 0xCC, 0x46, 0xD4,
+ 0x16, 0x59, 0xF4, 0x83, 0xEF, 0x3C, 0x7C, 0xE3, 0x50, 0x61, 0x69, 0xB3, 0xC7, 0xB5, 0x96, 0xDB,
+ 0x89, 0x6C, 0x27, 0xA6, 0x48, 0x67, 0x9F, 0xE8, 0x31, 0x01, 0x6D, 0x16, 0xD4, 0x8A, 0xFF, 0x93,
+ 0x47, 0x9D, 0xC6, 0x2C, 0x53, 0x18, 0x01, 0x09, 0x09, 0x35, 0xFD, 0xAA, 0x43, 0x1B, 0xC0, 0xD7,
+ 0x9D, 0x84, 0x01, 0x4D, 0x08, 0x51, 0x76, 0xF0, 0x21, 0x21, 0x74, 0x1D, 0xB6, 0x97, 0x0C, 0xEE,
+ 0xC8, 0xCA, 0x00, 0x87, 0x52, 0xD9, 0x50, 0xD3, 0x84, 0xC9, 0xF6, 0xB3, 0x3E, 0x69, 0xB8, 0x7A,
+ 0xDF, 0x10, 0x02, 0xE9, 0xB1, 0x4E, 0xF7, 0x81, 0x6D, 0x3A, 0x6E, 0x5B, 0x14, 0x78, 0xBF, 0x0E,
+ 0x50, 0xB8, 0x63, 0x8B, 0x1F, 0x5F, 0xEB, 0xEA, 0x5C, 0xBB, 0xE8, 0x87, 0x07, 0x60, 0x50, 0x13,
+ 0xE1, 0x36, 0xD9, 0x54, 0xEA, 0xDD, 0x9B, 0x9B, 0x53, 0xEF, 0xFD, 0xD6, 0x92, 0x88, 0x90, 0x50,
+ 0x18, 0xD2, 0xAA, 0x67, 0xFF, 0xF4, 0x95, 0x06, 0xC4, 0x36, 0xB1, 0x38, 0x74, 0xAA, 0xFD, 0x05,
+ 0xC8, 0x0E, 0x59, 0xB3, 0xBA, 0xD3, 0x83, 0x84, 0x3B, 0x96, 0x9E, 0x8D, 0xF4, 0xE2, 0xCA, 0x2A,
+ 0x77, 0x0B, 0xD6, 0xE1, 0x2E, 0x37, 0x88, 0x0E, 0xD9, 0x13, 0xC8, 0xF8, 0x6D, 0xFC, 0x70, 0x95,
+ 0xF5, 0x83, 0x02, 0xA2, 0x0F, 0x75, 0xD4, 0xE0, 0xEC, 0xFD, 0x4A, 0x82, 0xDD, 0x87, 0x1D, 0xC4,
+ 0x57, 0x96, 0x54, 0xDB, 0x36, 0x07, 0x11, 0x0C, 0x0B, 0x94, 0xD0, 0xF4, 0x97, 0x75, 0xF9, 0x1D,
+ 0xC4, 0x5D, 0x34, 0x19, 0x38, 0xE1, 0x2A, 0x23, 0xBD, 0x3B, 0xE6, 0x8F, 0xC2, 0x0A, 0x2B, 0x1D,
+ 0xFD, 0x2E, 0x68, 0xBC, 0x11, 0xA4, 0xA1, 0x87, 0x98, 0x4E, 0x71, 0x1C, 0xBE, 0x19, 0x3F, 0xFC,
+ 0x17, 0x24, 0x52, 0xA5, 0xA3, 0x16, 0xD1, 0xAD, 0x0F, 0xF8, 0x57, 0x9F, 0x7B, 0x8E, 0xD0, 0xC2,
+ 0x3F, 0x78, 0x43, 0xDC, 0x58, 0xEA, 0xE2, 0x5B, 0x71, 0x66, 0x46, 0x20, 0x28, 0x01, 0xFC, 0x41,
+ 0xAF, 0x19, 0x55, 0xA8, 0x8F, 0xB0, 0x08, 0x91, 0x9C, 0xA5, 0x4C, 0x10, 0xA1, 0xD5, 0x6C, 0x9E,
+ 0x85, 0x68, 0x55, 0x5E, 0x07, 0x7B, 0xF6, 0xA3, 0x91, 0xEC, 0x11, 0xA7, 0xE7, 0x2C, 0x6D, 0xF8,
+ 0x73, 0x26, 0x53, 0xB5, 0x44, 0x2C, 0x7E, 0x9B, 0xDD, 0x78, 0x24, 0xBA, 0xB9, 0xE5, 0xB2, 0xD1,
+ 0x0E, 0xE6, 0xC8, 0x4D, 0x1F, 0x14, 0x32, 0x76, 0x1C, 0xBC, 0xE5, 0x1F, 0xC6, 0x81, 0x0E, 0x38,
+ 0xD9, 0xB0, 0xC3, 0x89, 0xE7, 0x51, 0xE2, 0x6D, 0xB5, 0x4C, 0x10, 0x3B, 0xAE, 0x9F, 0x07, 0x6C,
+ 0x88, 0x52, 0x09, 0x06, 0xA5, 0x5C, 0x1A, 0x2D, 0x2F, 0x3F, 0x90, 0x2D, 0xB9, 0xB7, 0x85, 0x2F,
+ 0xC0, 0xE0, 0x60, 0x4A, 0x7D, 0x24, 0xC3, 0xCD, 0x9C, 0x15, 0x37, 0x5A, 0xF0, 0x56, 0x58, 0x9B,
+ 0xA6, 0xB6, 0x0A, 0xED, 0x9E, 0x21, 0xF3, 0xA8, 0x53, 0x78, 0x8C, 0xB4, 0x84, 0x41, 0x02, 0xC4,
+ 0xB7, 0xF5, 0x4B, 0xB2, 0x98, 0x9D, 0x89, 0xB8, 0xAD, 0xE3, 0x5E, 0x84, 0xB9, 0xDB, 0xC7, 0xA8,
+ 0xC9, 0x20, 0x91, 0x05, 0x8E, 0x4B, 0x6F, 0x74, 0x1D, 0xC9, 0x6D, 0x2A, 0x4A, 0xF1, 0x5E, 0xD1,
+ 0x6B, 0xFA, 0xF2, 0x4B, 0xC6, 0x72, 0xB5, 0x99, 0x05, 0xEF, 0xFF, 0xE3, 0x00, 0x97, 0xE1, 0xB6,
+ 0x07, 0x1F, 0xBC, 0x95, 0xCD, 0x1F, 0xDC, 0xD5, 0x93, 0x62, 0x7C, 0xA0, 0xEC, 0xCE, 0x9A, 0xC4,
+ 0x55, 0x9C, 0x79, 0x23, 0x2A, 0x61, 0x17, 0x46, 0x86, 0x9E, 0x81, 0xC5, 0x40, 0x0D, 0x63, 0xBC,
+ 0xAC, 0x52, 0xE8, 0x69, 0xBE, 0x7C, 0x76, 0xE8, 0x12, 0xB3, 0x66, 0x3F, 0xE7, 0xB9, 0x97, 0xF0,
+ 0x32, 0xD9, 0xC6, 0xBF, 0xF3, 0x12, 0xC9, 0x9E, 0x93, 0xD8, 0xF4, 0x2E, 0x17, 0x54, 0xA7, 0x32,
+ 0xE2, 0xF6, 0x6C, 0xBE, 0xCA, 0xBA, 0x8D, 0x76, 0x11, 0xA2, 0x48, 0xB7, 0x4E, 0x84, 0x42, 0xE5,
+ 0xF4, 0xAF, 0x12, 0x4F, 0x56, 0x98, 0x7B, 0xF3, 0xE0, 0x22, 0x94, 0x1A, 0x64, 0xA3, 0xDD, 0x26,
+ 0x13, 0x73, 0x96, 0x84, 0x46, 0xB5, 0x98, 0xE4, 0x91, 0xEC, 0xF3, 0x06, 0x37, 0x21, 0x79, 0x77,
+ 0x91, 0x02, 0x2E, 0x18, 0xE0, 0x60, 0x75, 0xB8, 0xC5, 0xAD, 0x9D, 0xB3, 0x56, 0x8B, 0x92, 0x0E,
+ 0x01, 0xAB, 0x91, 0xF2, 0xDC, 0x41, 0xBC, 0x25, 0xCE, 0x16, 0x31, 0x1B, 0x24, 0x52, 0xD9, 0x02,
+ 0x25, 0x4E, 0x64, 0x8A, 0x11, 0x15, 0xB9, 0x20, 0x33, 0x01, 0xD0, 0x4F, 0x6B, 0x04, 0x67, 0x32,
+ 0xB9, 0xEC, 0xD0, 0x77, 0xFC, 0x51, 0x0F, 0x9E, 0x5C, 0xF5, 0x3C, 0x18, 0x0A, 0xF2, 0xD3, 0x4E,
+ 0x2C, 0x3B, 0xA7, 0xC0, 0x43, 0x33, 0xE8, 0x59, 0x40, 0xB7, 0xAF, 0x75, 0x38, 0xDC, 0x1D, 0xF3,
+ 0x77, 0xAD, 0xD9, 0xF7, 0x3A, 0x5D, 0xF4, 0xD4, 0xB5, 0x54, 0x15, 0x73, 0x7B, 0xE7, 0xA3, 0x2B,
+ 0x22, 0xE9, 0x09, 0x2C, 0xDE, 0x60, 0x2A, 0x5B, 0xBB, 0xD9, 0xA1, 0xF6, 0x1E, 0x69, 0x38, 0xC2,
+ 0x4B, 0xCD, 0xEC, 0xA2, 0xA3, 0x1D, 0xBA, 0xBE, 0x0C, 0xA4, 0x42, 0x01, 0xE9, 0x1C, 0x4A, 0xC6,
+ 0xCF, 0xF8, 0x9A, 0x1B, 0x2B, 0x2B, 0x44, 0x81, 0x50, 0x69, 0x85, 0x08, 0xDD, 0xE7, 0xBE, 0xF9,
+ 0xBF, 0x65, 0x59, 0xB3, 0x80, 0x5C, 0x85, 0x5D, 0x68, 0x05, 0xBA, 0xA1, 0xDC, 0x32, 0x9C, 0xA9,
+ 0x98, 0x7D, 0x3B, 0x4E, 0x03, 0xA4, 0x28, 0x0A, 0x3F, 0xB3, 0x09, 0xA8, 0x0C, 0x5A, 0x92, 0xA3,
+ 0xDF, 0xAE, 0x69, 0xBE, 0x5D, 0xFA, 0x75, 0x49, 0xA4, 0x5C, 0xE5, 0xBB, 0xCD, 0x7C, 0xD8, 0x5A,
+ 0xAA, 0x77, 0x7C, 0x81, 0xE3, 0xCA, 0xB9, 0x7C, 0xC8, 0xF9, 0x83, 0x8B, 0x84, 0xB7, 0xE6, 0xEF,
+ 0x52, 0xF0, 0xC5, 0xB8, 0xAF, 0x7F, 0xA6, 0xA0, 0x4E, 0xE0, 0x1A, 0x41, 0x93, 0x01, 0xF7, 0xBE,
+ 0x0E, 0x58, 0x73, 0xFA, 0x43, 0xE7, 0xC0, 0x72, 0x2B, 0x4F, 0x4A, 0x80, 0xBA, 0xC7, 0x2E, 0x19,
+ 0x4C, 0xB5, 0xF1, 0xFD, 0x97, 0x11, 0x8A, 0xD3, 0xB7, 0xC9, 0x73, 0x6D, 0x04, 0x9E, 0xAA, 0xC2,
+ 0xD3, 0xEE, 0xB9, 0xC0, 0x98, 0x06, 0x9D, 0xA5, 0x6B, 0x19, 0x5B, 0x95, 0x13, 0x6C, 0x27, 0x9E,
+ 0x77, 0xFB, 0x66, 0x7B, 0x7F, 0x1E, 0x9D, 0x5D, 0x38, 0x30, 0xB6, 0x7E, 0xA9, 0x0D, 0xF6, 0x8B,
+ 0xAE, 0x58, 0x94, 0xA3, 0x3B, 0x67, 0x95, 0xAD, 0xCD, 0xEE, 0x37, 0xB6, 0x4A, 0xC1, 0x68, 0x2B,
+ 0x69, 0x5F, 0x46, 0x9F, 0x7D, 0x29, 0x52, 0xEF, 0x7A, 0xCF, 0xB2, 0x28, 0x8C, 0xCE, 0x3D, 0x71,
+ 0xBC, 0x0F, 0x46, 0x7F, 0xC2, 0xB9, 0x86, 0x84, 0x9B, 0x45, 0x21, 0x96, 0x01, 0x1D, 0xD7, 0x03,
+ 0x48, 0xC5, 0xBB, 0x55, 0x30, 0x18, 0x8A, 0xDA, 0xE8, 0xFA, 0x72, 0x94, 0xE0, 0xD8, 0x13, 0xF1,
+ 0x8B, 0x4C, 0xC3, 0xD5, 0x6D, 0x74, 0x92, 0xD0, 0x21, 0xDE, 0xAF, 0x38, 0x99, 0xB3, 0x7D, 0xCB,
+ 0xB3, 0xF4, 0x3C, 0xC8, 0xC3, 0xFA, 0xB6, 0x3F, 0xF8, 0x3E, 0x30, 0x82, 0x55, 0x7F, 0x64, 0x71,
+ 0xEE, 0x62, 0x6B, 0xFA, 0x1D, 0x97, 0x7E, 0xBC, 0x89, 0xCD, 0x3C, 0x72, 0x6A, 0xEA, 0xE0, 0xDE,
+ 0xB7, 0x10, 0x62, 0x16, 0x00, 0x2A, 0xD9, 0x02, 0x47, 0x51, 0xAA, 0x56, 0x8D, 0x1F, 0xC9, 0x04,
+ 0x33, 0x87, 0xE3, 0x1F, 0x0F, 0x19, 0xBC, 0x54, 0x17, 0x9A, 0x3A, 0x88, 0x48, 0x81, 0xC0, 0x68,
+ 0xC7, 0x96, 0xBB, 0xB7, 0x24, 0x7B, 0xF2, 0xA0, 0x45, 0x65, 0x30, 0x4A, 0xDA, 0x70, 0x78, 0x77,
+ 0xC8, 0x0E, 0x98, 0x7B, 0x4E, 0xC3, 0x04, 0x41, 0xDD, 0x9B, 0xA3, 0xED, 0x1A, 0x88, 0x1E, 0x2A,
+ 0xCF, 0x8A, 0xB7, 0xD7, 0x86, 0x2F, 0xC1, 0xBF, 0x67, 0xC2, 0x65, 0x70, 0xDC, 0x77, 0x7B, 0xC5,
+ 0xFA, 0x03, 0x57, 0x42, 0xAD, 0x92, 0xCF, 0xCB, 0xD0, 0x11, 0x11, 0x9E, 0x93, 0x5B, 0xCB, 0x78,
+ 0xC2, 0x55, 0xD6, 0xAD, 0x95, 0x3A, 0x45, 0x32, 0x42, 0x8F, 0xB1, 0x18, 0x17, 0xAF, 0xF2, 0x94,
+ 0x21, 0x08, 0x58, 0x13, 0x19, 0x8F, 0x12, 0x51, 0xB7, 0x95, 0x26, 0x8E, 0xD6, 0x9A, 0x82, 0x78,
+ 0x4D, 0x58, 0xEF, 0xC0, 0x89, 0x0D, 0xF7, 0xB6, 0xCF, 0x46, 0x28, 0x3C, 0x97, 0x68, 0x32, 0xC5,
+ 0x09, 0x25, 0x18, 0xE5, 0x9E, 0x74, 0x0E, 0x73, 0xD8, 0x98, 0xC6, 0x2D, 0xCA, 0xE4, 0xDF, 0x2B,
+ 0x8A, 0xE1, 0x15, 0x8D, 0x9F, 0x70, 0xC0, 0x81, 0xCC, 0x9B, 0x4B, 0x0A, 0xA5, 0x0A, 0x82, 0x5F,
+ 0xC0, 0x55, 0x73, 0x47, 0x0D, 0xEE, 0x59, 0xFD, 0xE5, 0xDD, 0x52, 0x74, 0xA2, 0x0F, 0xF1, 0xFC,
+ 0xE9, 0x14, 0x9C, 0xF7, 0x03, 0x3F, 0xC3, 0xF5, 0xFD, 0x7D, 0x1C, 0xB4, 0x62, 0x8E, 0xDD, 0x01,
+ 0x77, 0x96, 0x4D, 0x23, 0x5D, 0x37, 0x88, 0x83, 0x33, 0xB0, 0x75, 0x1E, 0x9D, 0x15, 0xB5, 0x9F,
+ 0x78, 0x04, 0x92, 0x9E, 0x54, 0x40, 0x10, 0x4E, 0xFF, 0x5B, 0xF3, 0xF8, 0xFC, 0x67, 0xEF, 0x85,
+ 0x1D, 0xFF, 0x0B, 0x2F, 0x5D, 0x54, 0xE1, 0xEA, 0x8C, 0xB8, 0x41, 0x71, 0x91, 0x2D, 0xEB, 0x14,
+ 0x78, 0x78, 0x25, 0x95, 0x73, 0x70, 0xED, 0x24, 0x2F, 0x97, 0x51, 0xE0, 0x8E, 0x6E, 0x43, 0x12,
+ 0x2B, 0xCF, 0x88, 0xDE, 0xA1, 0xB0, 0xDB, 0x7F, 0x1C, 0xA1, 0x75, 0xD9, 0x54, 0x1D, 0x9E, 0xE1,
+ 0x95, 0x68, 0x7E, 0xD4, 0x47, 0xD1, 0x42, 0x61, 0x60, 0xD9, 0xDE, 0x25, 0xC0, 0xD1, 0x5A, 0xB6,
+ 0x72, 0xF5, 0x37, 0xF8, 0x73, 0xC2, 0x05, 0xE3, 0xE1, 0x3B, 0x55, 0x29, 0xCB, 0xB0, 0x2D, 0xBD,
+ 0x6A, 0xF8, 0x67, 0xF6, 0xCD, 0x8B, 0xE3, 0x80, 0x49, 0x24, 0x38, 0x22, 0x2E, 0xA6, 0x68, 0x25,
+ 0x41, 0xCA, 0xEF, 0x0F, 0x33, 0x53, 0xC0, 0xBB, 0x74, 0xEA, 0xC6, 0xC5, 0xA5, 0x5F, 0x07, 0xE6,
+ 0x3B, 0xB4, 0xA0, 0x43, 0xFC, 0xA9, 0x28, 0x9B, 0xD2, 0x11, 0x57, 0x61, 0xD9, 0x79, 0x63, 0x5E,
+ 0x7A, 0x7E, 0x9A, 0xDF, 0x77, 0x70, 0x0E, 0x0C, 0xDA, 0xD6, 0xCE, 0x6B, 0x92, 0x71, 0x94, 0x9B,
+ 0x2B, 0xEE, 0x3B, 0x99, 0xCB, 0x82, 0x19, 0x55, 0x0E, 0x3E, 0xA3, 0xAF, 0x1D, 0xF4, 0x05, 0x1E,
+ 0x50, 0x8F, 0x0E, 0x72, 0x6E, 0x16, 0x28, 0xE3, 0xD1, 0xB2, 0x57, 0xBE, 0x54, 0x9F, 0xE8, 0x7F,
+ 0xBE, 0xC2, 0x07, 0x22, 0xD0, 0x3E, 0xE4, 0x1A, 0x50, 0xB5, 0x78, 0x48, 0x93, 0xC3, 0x7E, 0xA8,
+ 0x62, 0xD1, 0x92, 0x29, 0x52, 0x70, 0xC5, 0x62, 0x5F, 0x44, 0xE8, 0xD5, 0x27, 0x5A, 0x07, 0xBE,
+ 0xE2, 0x01, 0xCB, 0x9F, 0xFF, 0xD4, 0x02, 0x15, 0xD8, 0x9E, 0xB6, 0x19, 0x5A, 0x94, 0x2C, 0x74,
+ 0xC9, 0xEE, 0x0B, 0x0D, 0x57, 0x32, 0x0E, 0x3C, 0x75, 0xC3, 0xEE, 0xC4, 0x48, 0x13, 0xB3, 0xD1,
+ 0x5F, 0xB4, 0xAA, 0xE4, 0x6F, 0xE9, 0x98, 0xD8, 0x02, 0xF4, 0x00, 0xF5, 0xA5, 0x52, 0xED, 0x27,
+ 0x3E, 0x40, 0xB1, 0x84, 0x81, 0x3E, 0x79, 0xF0, 0xF4, 0x09, 0x34, 0x36, 0x01, 0xF3, 0xD5, 0x5D,
+ 0x68, 0xE8, 0xE0, 0xEF, 0x36, 0xA6, 0x67, 0xBA, 0xD7, 0xE2, 0xC7, 0x06, 0x6A, 0x43, 0xCD, 0xC5,
+ 0xD2, 0x78, 0x45, 0x8A, 0xE8, 0x8D, 0x5F, 0x41, 0x10, 0xCA, 0x38, 0x8B, 0x6D, 0x91, 0xF1, 0x05,
+ 0x06, 0xDE, 0x51, 0xE8, 0xF9, 0xC3, 0x68, 0xEE, 0x2D, 0x48, 0x09, 0x58, 0x2E, 0x08, 0x18, 0x0B,
+ 0xD3, 0x64, 0x6B, 0xD3, 0xB3, 0xC4, 0x66, 0xB7, 0x29, 0x4B, 0xDB, 0x47, 0x40, 0xB2, 0xC7, 0xBD,
+ 0x48, 0x21, 0xA0, 0xCF, 0xBC, 0x23, 0xA1, 0x31, 0x42, 0x48, 0x3E, 0xB2, 0xAF, 0x6F, 0x25, 0x95,
+ 0x89, 0xCC, 0x8F, 0xC0, 0x4F, 0xA6, 0x37, 0xCE, 0x0A, 0xF7, 0xF5, 0x93, 0xBE, 0x98, 0x5E, 0x5C,
+ 0x37, 0x2B, 0xBD, 0x14, 0xD3, 0xF7, 0x1F, 0x38, 0x27, 0xA8, 0xD1, 0x55, 0x18, 0xDD, 0x16, 0xF1,
+ 0x3B, 0xC1, 0x20, 0x75, 0x21, 0x30, 0x0B, 0xC3, 0xC1, 0xD9, 0x78, 0x9E, 0x7A, 0xDD, 0xD0, 0x36,
+ 0xEF, 0x97, 0xFC, 0x61, 0x45, 0x9B, 0x49, 0x8D, 0x73, 0x70, 0xC5, 0xEC, 0xB0, 0x45, 0x78, 0x09,
+ 0x85, 0x42, 0x68, 0x9F, 0x7F, 0x50, 0x35, 0xE4, 0x2A, 0x5F, 0xEB, 0x30, 0xB5, 0x01, 0x0F, 0x5B,
+ 0x2B, 0x48, 0xAE, 0xD4, 0x41, 0x00, 0x69, 0x58, 0x7D, 0xCA, 0x23, 0x0B, 0xC0, 0x32, 0xDC, 0x54,
+ 0xBA, 0x26, 0x22, 0xB5, 0xB1, 0xDB, 0xF9, 0x5E, 0x81, 0x6E, 0x48, 0xB8, 0x70, 0x66, 0xAA, 0x7E,
+ 0x6B, 0x42, 0xB4, 0x51, 0x25, 0xB5, 0x0D, 0x1B, 0x45, 0x4B, 0x6C, 0x31, 0x45, 0xA3, 0x91, 0x56,
+ 0x18, 0x2E, 0x34, 0x1A, 0x67, 0x87, 0xA8, 0xC9, 0x6B, 0x72, 0xD8, 0xE5, 0x91, 0x2D, 0x71, 0xD8,
+ 0xC8, 0xA4, 0x95, 0xB1, 0xFD, 0xF8, 0x0F, 0xEA, 0x08, 0x4F, 0x11, 0x2A, 0x39, 0xE7, 0xF6, 0x50,
+ 0xCC, 0xF7, 0x64, 0xA1, 0x66, 0xE7, 0xA9, 0xDD, 0x49, 0xAB, 0xBF, 0x5B, 0x99, 0x14, 0xE2, 0xD6,
+ 0x91, 0x3A, 0x70, 0x08, 0x67, 0x87, 0x7C, 0xB7, 0x76, 0x21, 0xE5, 0x23, 0x32, 0x9F, 0x6F, 0x88,
+ 0xBB, 0x10, 0xB6, 0xBE, 0xA2, 0xB1, 0x3E, 0xDA, 0x64, 0x5C, 0x25, 0x0B, 0x0F, 0x94, 0x39, 0x0E,
+ 0x21, 0x91, 0x01, 0x60, 0x8C, 0x9B, 0x3D, 0x9E, 0xEB, 0x3C, 0x05, 0x28, 0x66, 0x58, 0x9A, 0x7D,
+ 0xA3, 0x2C, 0x42, 0x13, 0xD7, 0x52, 0x09, 0x0A, 0x12, 0x14, 0xB1, 0x05, 0x4D, 0x7C, 0xE4, 0x04,
+ 0x2C, 0xC8, 0x93, 0x98, 0xBB, 0x90, 0x7C, 0xDE, 0x31, 0xD1, 0x21, 0x5C, 0x21, 0x75, 0x94, 0x64,
+ 0x62, 0x33, 0xB9, 0xCF, 0xD1, 0x5C, 0x77, 0xC0, 0xAB, 0x0A, 0xF8, 0x03, 0x00, 0x35, 0xA1, 0xE9,
+ 0x8D, 0xB5, 0x43, 0x6F, 0x94, 0x82, 0xAA, 0xCE, 0xB3, 0x5E, 0x6C, 0x13, 0x45, 0x6F, 0xD5, 0xE8,
+ 0x12, 0xFA, 0x4C, 0x68, 0x3D, 0x04, 0x57, 0x77, 0x87, 0x1D, 0xFC, 0xA6, 0x19, 0xC2, 0x09, 0x5B,
+ 0x65, 0xD7, 0x86, 0xE2, 0x8E, 0x14, 0x52, 0x92, 0xA5, 0xC9, 0xCA, 0xFD, 0x42, 0x54, 0x12, 0xF3,
+ 0xB9, 0x87, 0x11, 0x71, 0x70, 0x8D, 0x98, 0x85, 0xBB, 0x92, 0x36, 0x42, 0x42, 0x4F, 0x2D, 0xDB,
+ 0x8A, 0x77, 0x2A, 0x93, 0x8D, 0xF6, 0x87, 0x5D, 0x8F, 0x52, 0x91, 0x5A, 0x50, 0xC2, 0x9D, 0xE3,
+ 0x8C, 0xA6, 0xD2, 0x4C, 0xDF, 0xE6, 0xEC, 0xF7, 0x6E, 0x4C, 0xAF, 0x80, 0x28, 0xF1, 0x1A, 0x80,
+ 0x25, 0x15, 0x27, 0xFF, 0xB2, 0x6C, 0x3A, 0x49, 0xC1, 0xF4, 0x8F, 0xCD, 0x82, 0x8A, 0xC7, 0x9F,
+ 0x3D, 0x32, 0x6D, 0xDD, 0x36, 0xDB, 0x2F, 0x26, 0x60, 0x2F, 0x21, 0x91, 0xBC, 0x8C, 0x53, 0x7C,
+ 0x76, 0xEF, 0x8F, 0xE7, 0xE6, 0x1D, 0xA9, 0x32, 0x2C, 0x23, 0x81, 0xF9, 0x07, 0x88, 0xB3, 0xD7,
+ 0xBE, 0x83, 0x1A, 0xE4, 0x02, 0x5A, 0x29, 0x72, 0x73, 0x2A, 0x6A, 0xBE, 0x57, 0x3A, 0x05, 0x89,
+ 0xD1, 0xD8, 0x26, 0x9B, 0xCF, 0x01, 0x9F, 0xA4, 0xAB, 0xC1, 0x53, 0x62, 0x83, 0xE9, 0x3D, 0xE5,
+ 0x7C, 0xA4, 0x2A, 0x98, 0x95, 0x57, 0x19, 0x45, 0xE3, 0x54, 0x43, 0xD4, 0x39, 0x51, 0x3B, 0x27,
+ 0x8E, 0xB9, 0x33, 0x90, 0xEF, 0x0E, 0xAD, 0xD2, 0xE6, 0x7A, 0x2A, 0x00, 0xEB, 0x84, 0x3C, 0xE8,
+ 0x97, 0x1F, 0x0A, 0xAB, 0x56, 0x0F, 0x9D, 0xB7, 0xD1, 0x67, 0x64, 0x24, 0xF9, 0x89, 0xE1, 0xB6,
+ 0x1B, 0xEE, 0xB7, 0xA8, 0xDD, 0x03, 0x40, 0xB0, 0xEB, 0x2D, 0x29, 0x53, 0x81, 0x8B, 0x0C, 0x67,
+ 0x53, 0x5E, 0xD3, 0xD5, 0xC5, 0xE6, 0x7C, 0x12, 0xE6, 0xBB, 0x34, 0x24, 0xF1, 0x5B, 0x05, 0xBA,
+ 0x6E, 0x16, 0xA7, 0xA9, 0x31, 0xFB, 0x47, 0xE1, 0xFE, 0x67, 0x07, 0xF9, 0x96, 0x34, 0x5A, 0x3E,
+ 0x95, 0xAD, 0x64, 0x16, 0xE9, 0xD8, 0x72, 0x58, 0x90, 0x67, 0x52, 0xFE, 0x08, 0x83, 0x35, 0xEB,
+ 0x8A, 0x8C, 0xF2, 0xD0, 0xAA, 0x79, 0x42, 0x33, 0x13, 0x8D, 0x34, 0x76, 0xFD, 0x39, 0x2C, 0xEC,
+ 0xCA, 0x74, 0x07, 0xC1, 0xE2, 0x47, 0xF4, 0x5C, 0x65, 0x99, 0xE4, 0xBA, 0xC9, 0x41, 0xA4, 0x48,
+ 0x51, 0xEF, 0x99, 0x5E, 0x99, 0x4F, 0x74, 0x56, 0x4C, 0xA6, 0xFA, 0xC7, 0x4C, 0xC2, 0xAD, 0xA4,
+ 0x3C, 0xF6, 0xD4, 0x8C, 0xB6, 0x91, 0x6B, 0xB4, 0xCE, 0xFB, 0x34, 0xF7, 0xE3, 0xF6, 0x11, 0xE2,
+ 0x56, 0x3E, 0xA2, 0x60, 0xA3, 0x47, 0x59, 0x3E, 0xDF, 0x6A, 0x13, 0xB8, 0xED, 0x03, 0x8B, 0x54,
+ 0x12, 0xD1, 0x29, 0xFD, 0x06, 0x26, 0x03, 0xF5, 0x25, 0x69, 0x05, 0x6D, 0x73, 0xE6, 0x1D, 0x28,
+ 0xC0, 0x6F, 0x75, 0x67, 0xCE, 0xC4, 0xF7, 0x31, 0xBB, 0x21, 0x61, 0xB1, 0xC4, 0x5D, 0x36, 0x50,
+ 0xEC, 0xBE, 0x23, 0xEE, 0x47, 0x62, 0x82, 0x6B, 0xE9, 0x79, 0xCE, 0xAF, 0x76, 0x6A, 0xD1, 0xFC,
+ 0x79, 0x5E, 0xE8, 0x1E, 0xD8, 0x8F, 0xF9, 0x63, 0x5F, 0x09, 0x1A, 0x21, 0x93, 0x09, 0x90, 0x15,
+ 0x62, 0xDE, 0x69, 0x65, 0x8D, 0xA3, 0xAC, 0x79, 0x71, 0xA1, 0xBB, 0xA9, 0xCF, 0x45, 0x89, 0x15,
+ 0x1B, 0x7D, 0x49, 0x37, 0x56, 0x2D, 0x52, 0xF1, 0x66, 0x8F, 0x03, 0xA1, 0xE3, 0x93, 0x8C, 0xAC,
+ 0xB3, 0x77, 0x89, 0x69, 0x41, 0x23, 0xE4, 0x17, 0xEE, 0x8E, 0x73, 0x06, 0xE4, 0xDC, 0x95, 0x49,
+ 0xA6, 0x30, 0xCD, 0x1B, 0x30, 0x42, 0xD9, 0x06, 0xF9, 0x5C, 0x8A, 0x50, 0xBB, 0xA0, 0xA8, 0xEF,
+ 0xD3, 0xA1, 0x83, 0xF1, 0xC1, 0x77, 0x4C, 0x4B, 0x7B, 0xCC, 0xEF, 0xE4, 0xB4, 0x4D, 0x50, 0x01,
+ 0x1B, 0x44, 0x33, 0xFD, 0xEF, 0xB5, 0x10, 0x72, 0x92, 0x3E, 0x96, 0x61, 0xAB, 0x20, 0x7C, 0x38,
+ 0xCB, 0xD7, 0x79, 0xA3, 0x7A, 0x35, 0x87, 0xFA, 0xC6, 0x5E, 0xB8, 0x9E, 0x2C, 0xE5, 0x96, 0xBA,
+ 0x6E, 0xF1, 0xC3, 0x63, 0x92, 0x65, 0xEE, 0x05, 0x5B, 0x13, 0xFA, 0xE8, 0x8B, 0xE7, 0xCB, 0x73,
+ 0xB9, 0xC9, 0x0F, 0x60, 0xC6, 0x36, 0x1D, 0x8F, 0x9C, 0xC0, 0x83, 0x1A, 0xB4, 0x34, 0xDE, 0xF6,
+ 0x13, 0x4E, 0x58, 0x15, 0x3D, 0xD6, 0x21, 0x5F, 0xE6, 0x21, 0x25, 0x15, 0x07, 0xEF, 0xD7, 0x06,
+ 0x5D, 0x9A, 0x59, 0xC2, 0x9F, 0x2D, 0x5A, 0xE4, 0x21, 0x19, 0x02, 0xF2, 0x01, 0x5E, 0xC2, 0x80,
+ 0xAB, 0x8D, 0x96, 0x38, 0x0F, 0x43, 0x71, 0x61, 0x17, 0x72, 0x1E, 0x16, 0x3E, 0x4B, 0xE1, 0xA0,
+ 0xB5, 0x22, 0xFB, 0x74, 0xED, 0x4F, 0xEF, 0x4E, 0x56, 0x8A, 0x52, 0x5D, 0x76, 0x60, 0x9D, 0xE2,
+ 0x8B, 0xC0, 0xEC, 0xF3, 0x05, 0x2F, 0x59, 0xE5, 0xC0, 0x68, 0x02, 0xE9, 0x77, 0x17, 0x86, 0x7D,
+ 0xC6, 0x71, 0xA7, 0xF1, 0x44, 0x50, 0xB3, 0xFB, 0xB6, 0x27, 0x23, 0x57, 0x5E, 0xCA, 0x18, 0xAA,
+ 0xA7, 0x7C, 0xCD, 0xE7, 0xEA, 0xB9, 0xA9, 0xB8, 0xA0, 0x99, 0xF0, 0xED, 0xF1, 0xF8, 0x4D, 0x11,
+ 0xFA, 0x04, 0x75, 0xA7, 0x41, 0xC5, 0xB3, 0xFB, 0x37, 0x46, 0x14, 0xBF, 0x89, 0xAB, 0x33, 0x55,
+ 0x86, 0x92, 0x36, 0x2F, 0xF6, 0xF1, 0x7B, 0x60, 0x8D, 0xA9, 0x85, 0x48, 0xF5, 0x49, 0x46, 0xD9,
+ 0xB3, 0x18, 0xB9, 0x1E, 0x3F, 0x09, 0x87, 0x33, 0x23, 0x72, 0xE8, 0x4F, 0x48, 0xC9, 0xD7, 0x30,
+ 0x1C, 0xF0, 0x7B, 0x88, 0xF9, 0xAE, 0x5C, 0x23, 0x42, 0xC8, 0x3D, 0xD4, 0xA4, 0xA9, 0x8F, 0xBA,
+ 0x9E, 0xFD, 0x6F, 0xC7, 0x10, 0x4F, 0xFD, 0xA5, 0xAC, 0xA4, 0xBF, 0xDB, 0x1D, 0xFB, 0x67, 0xAA,
+ 0x47, 0xE1, 0x8E, 0x47, 0xCC, 0x51, 0xE3, 0xAD, 0x80, 0x63, 0x2A, 0x5A, 0xEF, 0x3B, 0x6B, 0x7E,
+ 0x5B, 0xC6, 0x6F, 0x84, 0x3E, 0xD9, 0xAE, 0x3A, 0x7B, 0x2F, 0xED, 0x23, 0x57, 0x56, 0x59, 0x5A,
+ 0x35, 0x11, 0x0D, 0xFD, 0x43, 0x06, 0x6C, 0xB3, 0x26, 0xDA, 0xB4, 0xEA, 0x84, 0x94, 0xB8, 0x4F,
+ 0x60, 0xAC, 0x3F, 0x2E, 0x9D, 0xF0, 0x1B, 0xD5, 0xCA, 0xF6, 0x97, 0x82, 0x7A, 0x45, 0x76, 0xCC,
+ 0xF2, 0x63, 0x3E, 0xED, 0x80, 0x63, 0xB2, 0x1E, 0x18, 0x21, 0x85, 0x84, 0x89, 0xF8, 0xB0, 0x31,
+ 0x4F, 0x12, 0x76, 0x8E, 0x3B, 0x32, 0x54, 0x57, 0x95, 0x26, 0x0E, 0xB0, 0x28, 0x65, 0xC3, 0x31,
+ 0x18, 0x5B, 0xD1, 0x8E, 0x32, 0x53, 0x40, 0x57, 0xD5, 0x90, 0x16, 0xE6, 0x23, 0xAE, 0xAF, 0x59,
+ 0xD1, 0x8B, 0xDC, 0x3D, 0x34, 0xA5, 0x56, 0xCA, 0x61, 0xF2, 0xEE, 0xF4, 0xD2, 0x67, 0x82, 0x54,
+ 0x5F, 0x5A, 0x05, 0x94, 0x24, 0xDF, 0xD9, 0xE3, 0x72, 0x20, 0x30, 0x6C, 0x58, 0x25, 0x66, 0x12,
+ 0x81, 0x75, 0x46, 0x51, 0xAB, 0xCB, 0x0F, 0xEC, 0x77, 0x84, 0x3D, 0xB1, 0xA7, 0x4A, 0xF5, 0x35,
+ 0xAF, 0xF2, 0x01, 0x6C, 0x7F, 0x42, 0xA9, 0x28, 0x76, 0xE4, 0x6E, 0xF2, 0x4B, 0x7E, 0xD0, 0x7D,
+ 0x57, 0x2E, 0x25, 0x4F, 0x90, 0x8A, 0x74, 0xB2, 0x87, 0x4C, 0x9C, 0x75, 0x5A, 0xBE, 0xEF, 0x46,
+ 0xA1, 0x0D, 0x20, 0xF5, 0x94, 0x7A, 0xA7, 0x72, 0x0A, 0x6E, 0xBC, 0x80, 0x01, 0x14, 0x02, 0x00,
+ 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F,
+ 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
new file mode 100644
index 0000000000..ccb12ed346
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
@@ -0,0 +1,2442 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifFontData [19469] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+ 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1,
+ 0xf8, 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18,
+ 0x4, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, 0xfa,
+ 0x2, 0x5, 0x1c, 0x7, 0x9f, 0xf, 0x1c, 0x8,
+ 0xf6, 0x11, 0xb6, 0x1c, 0x44, 0xa3, 0x12, 0x0,
+ 0x3, 0x1, 0x1, 0x5, 0x2f, 0x3e, 0x45, 0x75,
+ 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20,
+ 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2, 0x0, 0x1,
+ 0x0, 0x9, 0x0, 0x11, 0x0, 0x24, 0x0, 0x2c,
+ 0x0, 0x4a, 0x0, 0x54, 0x0, 0x60, 0x0, 0x68,
+ 0x0, 0x71, 0x0, 0x86, 0x0, 0x91, 0x0, 0x9e,
+ 0x0, 0xb9, 0x0, 0xc1, 0x0, 0xe2, 0x0, 0xff,
+ 0x1, 0xb, 0x1, 0x1d, 0x1, 0x25, 0x1, 0x33,
+ 0x1, 0x4e, 0x1, 0x55, 0x1, 0x68, 0x1, 0x7a,
+ 0x1, 0x7f, 0x1, 0x90, 0x1, 0x94, 0x1, 0x9d,
+ 0x1, 0xa9, 0x1, 0xb9, 0x1, 0xc6, 0x1, 0xfb,
+ 0x2, 0x14, 0x2, 0x1a, 0x2, 0x34, 0x2, 0x3c,
+ 0x2, 0x48, 0x2, 0x59, 0x2, 0x63, 0x2, 0x71,
+ 0x2, 0x84, 0x2, 0x89, 0x2, 0x92, 0x2, 0xac,
+ 0x2, 0xb6, 0x2, 0xc2, 0x2, 0xe6, 0x2, 0xf0,
+ 0x2, 0xfe, 0x3, 0x11, 0x3, 0x19, 0x3, 0x20,
+ 0x3, 0x23, 0x3, 0x2a, 0x3, 0x49, 0x3, 0x53,
+ 0x3, 0x71, 0x3, 0x8e, 0x3, 0x9c, 0x3, 0xa2,
+ 0x3, 0xa8, 0x3, 0xc0, 0x3, 0xd8, 0x3, 0xef,
+ 0x3, 0xf7, 0x3, 0xfe, 0x4, 0x2, 0x4, 0x17,
+ 0x4, 0x2a, 0x4, 0x30, 0x4, 0x44, 0x4, 0x57,
+ 0x4, 0x62, 0x4, 0x69, 0x4, 0x7b, 0x4, 0x87,
+ 0x4, 0x98, 0x4, 0xa3, 0x4, 0xb3, 0x4, 0xb9,
+ 0x4, 0xbf, 0x4, 0xc5, 0x4, 0xcb, 0x4, 0xd8,
+ 0x4, 0xe7, 0x4, 0xf1, 0x4, 0xfb, 0x5, 0xa,
+ 0x5, 0x19, 0x5, 0x22, 0x5, 0x28, 0x5, 0x2d,
+ 0x5, 0x3b, 0x5, 0x3f, 0x5, 0x4c, 0x5, 0x59,
+ 0x5, 0x5e, 0x5, 0x62, 0x5, 0x6e, 0x5, 0x74,
+ 0x5, 0x77, 0x5, 0x82, 0x5, 0x8d, 0x5, 0x94,
+ 0x5, 0x99, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xad,
+ 0x5, 0xb7, 0x5, 0xc1, 0x5, 0xcb, 0x5, 0xd3,
+ 0x5, 0xdc, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+ 0x6, 0x0, 0x6, 0x5, 0x6, 0xc, 0x6, 0x12,
+ 0x6, 0x18, 0x6, 0x1d, 0x6, 0x21, 0x21, 0xa,
+ 0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xb, 0x15, 0xb3,
+ 0x6, 0xf7, 0x2e, 0x22, 0x1d, 0xb, 0xec, 0x5,
+ 0x95, 0x91, 0x9f, 0x98, 0xa2, 0x1a, 0x8f, 0x8a,
+ 0xa7, 0x6b, 0x7d, 0x84, 0x8b, 0x74, 0x74, 0x1e,
+ 0xb, 0x36, 0x1d, 0x26, 0xa, 0x3e, 0x7a, 0xa,
+ 0xb, 0x70, 0x1d, 0x88, 0x7f, 0x6c, 0x7c, 0x1e,
+ 0x86, 0x82, 0x6c, 0x74, 0x75, 0x1b, 0x66, 0x6e,
+ 0xaa, 0xba, 0x1f, 0x8d, 0x7, 0xad, 0x96, 0xc3,
+ 0xf7, 0x2b, 0xbd, 0x1e, 0x2a, 0xa, 0xb, 0x2b,
+ 0x1d, 0xfb, 0x11, 0xf7, 0x3b, 0x5, 0x4d, 0x6,
+ 0xb, 0x37, 0x1d, 0x4e, 0xfb, 0x4d, 0xfb, 0x22,
+ 0xd7, 0x39, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0x8a,
+ 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x24, 0x1d, 0x40,
+ 0xa, 0xef, 0xfb, 0x29, 0x1e, 0xb, 0x70, 0xa,
+ 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0xf, 0x61, 0x1d,
+ 0xf7, 0x10, 0x34, 0xa, 0x32, 0x71, 0x1d, 0x3a,
+ 0x5e, 0xa, 0xb, 0x4c, 0x74, 0x72, 0x19, 0x79,
+ 0x78, 0x7a, 0x7f, 0x2e, 0xa, 0xb, 0x15, 0xad,
+ 0x6, 0xf7, 0xd, 0xf2, 0xf7, 0xe, 0x24, 0x5,
+ 0xad, 0x6, 0xb, 0x6d, 0x1b, 0x49, 0x82, 0xc9,
+ 0x99, 0x1f, 0xf7, 0xda, 0xfb, 0x26, 0x7d, 0x7,
+ 0xa9, 0x89, 0xab, 0x7f, 0x4f, 0x1a, 0xfb, 0x86,
+ 0x7, 0x21, 0xd9, 0x73, 0xb4, 0xb, 0x2e, 0x1d,
+ 0x9e, 0xfb, 0x7c, 0x50, 0x1d, 0xb, 0x15, 0xd7,
+ 0x86, 0x99, 0x76, 0x41, 0x1a, 0xfb, 0xc2, 0x7,
+ 0x4f, 0x8b, 0xfb, 0x57, 0xf7, 0x8c, 0xf7, 0x97,
+ 0x8b, 0xf7, 0x50, 0xdb, 0x1e, 0xf7, 0x8f, 0x7,
+ 0xf4, 0x9c, 0xa4, 0xd8, 0x93, 0x1e, 0xb, 0xa8,
+ 0xf7, 0x78, 0x15, 0xfb, 0x1b, 0xe5, 0x24, 0x65,
+ 0x1d, 0xf7, 0x1f, 0xee, 0xf7, 0x25, 0x2d, 0xe2,
+ 0xfb, 0x17, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb,
+ 0xf, 0x1e, 0xe5, 0xb, 0x5b, 0xa, 0xf7, 0x6a,
+ 0x77, 0x85, 0xa, 0xf7, 0xe6, 0x29, 0x1d, 0xb,
+ 0x9b, 0x16, 0xf7, 0x81, 0x9a, 0x6, 0x46, 0x8f,
+ 0x86, 0xa6, 0xcd, 0x1a, 0xf7, 0xed, 0x7, 0x87,
+ 0x8e, 0xb, 0x2d, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+ 0x49, 0x1d, 0xa0, 0x1e, 0xf7, 0x1b, 0x4e, 0xa,
+ 0x6, 0x88, 0xf7, 0x23, 0x5, 0xfc, 0xa7, 0xb,
+ 0x8c, 0xa, 0x86, 0x83, 0x70, 0x75, 0x1e, 0x7f,
+ 0x7c, 0x70, 0x7e, 0x75, 0x1b, 0x66, 0x6e, 0xaa,
+ 0xba, 0xaf, 0x96, 0xc3, 0xf7, 0x2b, 0xbd, 0x1f,
+ 0x4d, 0xa, 0xb, 0x7d, 0x1d, 0xa1, 0xa1, 0x3d,
+ 0xa, 0xb, 0x39, 0x1d, 0x8b, 0xdc, 0x1f, 0xf7,
+ 0x65, 0x7, 0xf7, 0x24, 0x89, 0xde, 0x8a, 0xa4,
+ 0x7d, 0x97, 0x3b, 0x19, 0xb, 0xe9, 0xf7, 0x9f,
+ 0x15, 0xf7, 0xcb, 0x6, 0xf7, 0x17, 0x80, 0x44,
+ 0xc9, 0x2d, 0x1b, 0x3b, 0xfb, 0x10, 0xb, 0x8d,
+ 0x1b, 0x39, 0xa, 0xb, 0xb8, 0xf7, 0x3d, 0x5,
+ 0x6f, 0x6, 0x26, 0x5f, 0x59, 0x6d, 0xfb, 0x11,
+ 0x1b, 0xfb, 0x29, 0x8b, 0xb, 0x3b, 0x1d, 0xa2,
+ 0xb, 0x15, 0xb3, 0x6, 0xfb, 0x27, 0xf7, 0x28,
+ 0x5, 0xb, 0xaa, 0xb1, 0x37, 0xa, 0xbf, 0x89,
+ 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0xb, 0x8e, 0xab,
+ 0x15, 0xe3, 0x9b, 0xb2, 0xb0, 0xc2, 0x1b, 0xda,
+ 0x95, 0x3e, 0x5b, 0x92, 0x1f, 0xb, 0xfb, 0x8,
+ 0x5c, 0x44, 0x57, 0x1d, 0x1f, 0x94, 0x86, 0x9a,
+ 0x9a, 0x1a, 0xb, 0x3, 0x94, 0x16, 0xf8, 0xc8,
+ 0x6, 0xa3, 0xf7, 0x44, 0x5, 0x74, 0x6, 0x42,
+ 0x75, 0x6e, 0x4a, 0xfb, 0x17, 0x1b, 0xfb, 0x8b,
+ 0x6, 0xf8, 0x44, 0xf8, 0xf5, 0x5, 0x9a, 0xfc,
+ 0xa2, 0x7, 0x77, 0xfb, 0x3f, 0x5, 0xa5, 0x6,
+ 0xce, 0x98, 0xa1, 0xcd, 0xf7, 0x23, 0x1b, 0xf7,
+ 0x67, 0x6, 0xfc, 0x49, 0xfc, 0xf5, 0x5, 0xb,
+ 0xf7, 0xb3, 0xf7, 0x9, 0x15, 0x3b, 0xa, 0xf7,
+ 0x6, 0xfb, 0x80, 0x18, 0x99, 0x6c, 0xbb, 0x2f,
+ 0x7c, 0x1a, 0x7b, 0x63, 0xfb, 0x1e, 0x57, 0x1e,
+ 0xb, 0xa7, 0xa7, 0x76, 0x55, 0x1d, 0xb, 0x15,
+ 0x6d, 0xb9, 0xf7, 0x2c, 0xfb, 0x38, 0x98, 0x1b,
+ 0x91, 0x90, 0x8f, 0x92, 0x98, 0x6f, 0xb3, 0x79,
+ 0xa3, 0x1f, 0x75, 0xa9, 0x64, 0xb7, 0x75, 0xa9,
+ 0xb, 0x65, 0xad, 0x4d, 0x1d, 0x72, 0x99, 0xa,
+ 0xb, 0xfb, 0x7a, 0x1e, 0xf7, 0x6, 0x8c, 0x15,
+ 0xf7, 0x78, 0xf7, 0x3, 0xb, 0x7a, 0xae, 0x1f,
+ 0x7d, 0xa8, 0xa0, 0x7c, 0x52, 0x1d, 0x63, 0x7a,
+ 0x7d, 0x81, 0x70, 0x1b, 0x7c, 0xb, 0x3c, 0xa,
+ 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x88, 0x1d, 0xb,
+ 0xfc, 0x2a, 0x35, 0xa, 0xfb, 0x87, 0x7, 0x6e,
+ 0x73, 0x7c, 0x6e, 0x89, 0x1e, 0xb, 0x51, 0xa,
+ 0x6a, 0x98, 0x71, 0x84, 0x83, 0x87, 0x8a, 0x88,
+ 0x1e, 0x8a, 0x87, 0x88, 0x8a, 0x89, 0x64, 0xa,
+ 0xb, 0x47, 0xa, 0x88, 0xa, 0xe, 0x15, 0x43,
+ 0xa, 0xf7, 0x5c, 0x16, 0x43, 0xa, 0xe, 0x9e,
+ 0xfb, 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x89, 0x75,
+ 0x1d, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x72, 0x75,
+ 0xa, 0x8c, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac,
+ 0xb, 0x1, 0xa8, 0xe5, 0xf7, 0x99, 0xe5, 0x3,
+ 0x2f, 0x1d, 0xb, 0x7b, 0xa0, 0xa0, 0xae, 0x9c,
+ 0xb0, 0xaa, 0x71, 0xa5, 0x6d, 0x6d, 0xb, 0xb1,
+ 0xa5, 0xa1, 0xa5, 0xab, 0x1a, 0xa8, 0x6f, 0xbf,
+ 0x37, 0x5f, 0x55, 0x75, 0x42, 0x69, 0x1e, 0xa4,
+ 0x79, 0x5, 0xa4, 0x9d, 0x9f, 0xab, 0xbb, 0x1b,
+ 0xb5, 0x9a, 0x73, 0x71, 0x65, 0x5c, 0x72, 0x50,
+ 0x79, 0x1f, 0xe, 0xe2, 0x81, 0xc5, 0xf7, 0x95,
+ 0xf7, 0x2f, 0x73, 0xa3, 0xb, 0x78, 0x7, 0xd1,
+ 0x87, 0xa3, 0x70, 0x20, 0x1a, 0xfb, 0x98, 0x7,
+ 0xfb, 0x1f, 0xb, 0x7e, 0x1b, 0x85, 0x86, 0x87,
+ 0x84, 0x7e, 0xa7, 0x63, 0x9d, 0x73, 0x1f, 0xa1,
+ 0x6d, 0xb2, 0x5f, 0xa1, 0x6d, 0xb, 0xaa, 0x1b,
+ 0xd9, 0x9d, 0xd3, 0x65, 0xa, 0xb, 0x8d, 0x99,
+ 0x1b, 0x9b, 0x9e, 0x8a, 0xb, 0x33, 0xa, 0xe,
+ 0xa1, 0x6f, 0x6f, 0x76, 0x62, 0x1d, 0xb, 0x6,
+ 0xf7, 0xa1, 0xf8, 0x29, 0x5, 0x9a, 0xfb, 0xef,
+ 0x7, 0x88, 0xfb, 0xa, 0x5, 0x9d, 0x6, 0xc1,
+ 0x92, 0x99, 0xad, 0xd4, 0x1b, 0xf7, 0x14, 0x6,
+ 0xfb, 0x9e, 0xfc, 0x29, 0x5, 0xb, 0x63, 0x7b,
+ 0x97, 0x6f, 0xaa, 0xa5, 0x9e, 0xa1, 0xa0, 0xb,
+ 0xf7, 0x1, 0x3, 0x9b, 0x16, 0xf7, 0xb0, 0x6,
+ 0xf7, 0xc6, 0xda, 0xf7, 0x58, 0xf7, 0x19, 0xf7,
+ 0x74, 0xfb, 0x33, 0xf7, 0x1, 0xfb, 0x84, 0x1f,
+ 0xfb, 0xa2, 0x78, 0x6, 0xd8, 0xb, 0x5, 0x76,
+ 0x6, 0x6a, 0x83, 0x60, 0x8b, 0x86, 0x75, 0x54,
+ 0xac, 0x32, 0x1b, 0xfb, 0x40, 0xfb, 0x3c, 0xfb,
+ 0xd, 0xfb, 0x74, 0xfb, 0x8d, 0xf7, 0x41, 0x2b,
+ 0xf7, 0x35, 0xb, 0x7b, 0xa, 0xf7, 0x17, 0x77,
+ 0xdd, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x94, 0xb1,
+ 0xb, 0x80, 0x1d, 0xf7, 0x6c, 0xb4, 0xb, 0x5b,
+ 0x1d, 0xf8, 0x35, 0x77, 0xb, 0xf1, 0x3, 0x97,
+ 0x16, 0xf8, 0xae, 0x6, 0xbb, 0xf7, 0x42, 0x5,
+ 0x72, 0x6, 0xfb, 0x17, 0x52, 0x4b, 0x87, 0xfb,
+ 0x2a, 0x1b, 0x38, 0x79, 0xb, 0x78, 0x7, 0xb8,
+ 0x87, 0x9a, 0x88, 0xf1, 0xfb, 0x2a, 0xf7, 0x17,
+ 0xfb, 0x54, 0x18, 0xfb, 0x38, 0x7, 0x3f, 0x88,
+ 0x6a, 0x29, 0x89, 0x1e, 0xb, 0x6b, 0xac, 0xa7,
+ 0x80, 0xb3, 0x1b, 0xf7, 0x1f, 0xd2, 0xf7, 0x20,
+ 0xf7, 0x7, 0xf7, 0x19, 0x3f, 0xdd, 0x32, 0x3e,
+ 0x5d, 0x5a, 0x6f, 0xb, 0x9f, 0xd9, 0x1a, 0xf8,
+ 0x3c, 0x7, 0xdb, 0xb, 0xf7, 0x69, 0xf7, 0x7a,
+ 0xfb, 0x37, 0xb, 0x75, 0x6f, 0x1e, 0xb, 0x7d,
+ 0x94, 0x5, 0x58, 0x69, 0x66, 0x60, 0x43, 0x1b,
+ 0x37, 0x46, 0xd7, 0xf7, 0x7, 0xf7, 0x27, 0xe7,
+ 0xaa, 0xb0, 0xc0, 0xb, 0x15, 0x6f, 0xa2, 0x74,
+ 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, 0xa2,
+ 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xf7,
+ 0x15, 0xf7, 0x2c, 0xd1, 0xb, 0x7, 0x89, 0xa3,
+ 0x9e, 0x8a, 0xa3, 0x1b, 0xf4, 0xcb, 0x9d, 0xb4,
+ 0xb6, 0x1f, 0x9c, 0x9b, 0xb7, 0xb4, 0xd9, 0x1a,
+ 0xb, 0x7, 0xd2, 0x97, 0xa2, 0xd7, 0x91, 0x1e,
+ 0x9e, 0xfb, 0xaa, 0x78, 0x7, 0xd5, 0x85, 0x99,
+ 0x77, 0x41, 0x1a, 0xb, 0x15, 0xbc, 0x6, 0xf8,
+ 0x56, 0xf9, 0x46, 0x5, 0x5d, 0x6, 0xb, 0xf7,
+ 0x49, 0xf7, 0x49, 0xf7, 0x26, 0xb, 0x70, 0xa1,
+ 0x75, 0xa6, 0xa6, 0xa2, 0xa1, 0xa6, 0xa6, 0x74,
+ 0xa2, 0x70, 0x70, 0x75, 0x74, 0x70, 0x1e, 0xb,
+ 0x5b, 0x7a, 0x5a, 0x7d, 0x5b, 0x6f, 0x1d, 0x91,
+ 0x95, 0x82, 0xa, 0xb, 0x6f, 0xa1, 0x7d, 0x1d,
+ 0xa2, 0xa1, 0xa7, 0xa7, 0x74, 0xa2, 0x6f, 0x6f,
+ 0x75, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa0, 0x76,
+ 0x9a, 0x1d, 0x95, 0x1d, 0x74, 0x6f, 0x1e, 0xb,
+ 0x6f, 0xa1, 0x7d, 0x1d, 0x9f, 0xa1, 0xa7, 0xa7,
+ 0x77, 0xa1, 0x6f, 0x6f, 0x75, 0x62, 0x1d, 0xb,
+ 0x7e, 0x19, 0x7b, 0x7, 0x8c, 0xb, 0x15, 0xfb,
+ 0x1b, 0x7, 0x6d, 0xb, 0xfb, 0x78, 0xfb, 0x70,
+ 0x25, 0xb, 0xfb, 0x3, 0xfb, 0x3, 0x25, 0xb,
+ 0xa4, 0x9c, 0xcf, 0x8f, 0x1e, 0x9e, 0xfb, 0xae,
+ 0x78, 0x7, 0x60, 0xa, 0xb, 0xfb, 0x23, 0xfb,
+ 0x2c, 0xfb, 0x1a, 0x8b, 0x66, 0x76, 0x77, 0x8c,
+ 0x8d, 0x78, 0x1e, 0xe, 0x6c, 0x7d, 0x84, 0x7f,
+ 0x84, 0x80, 0x1f, 0xfb, 0x23, 0xb, 0x81, 0xc7,
+ 0xf8, 0x24, 0x77, 0xf7, 0x8c, 0x90, 0xa, 0xb,
+ 0x6d, 0x6c, 0x43, 0x44, 0xfb, 0xf, 0x1b, 0xfb,
+ 0x12, 0xfb, 0xb, 0xe2, 0xf7, 0x68, 0xb, 0xbc,
+ 0xac, 0x69, 0xb7, 0x1b, 0xa6, 0x9e, 0x9c, 0xa5,
+ 0xa5, 0x78, 0x9c, 0x70, 0x1f, 0xb, 0xc2, 0xb8,
+ 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0xb, 0x76,
+ 0xf9, 0x46, 0x77, 0x1, 0xb, 0x1, 0xad, 0xf7,
+ 0x6, 0xb, 0x8f, 0x78, 0x1b, 0x2a, 0x60, 0x49,
+ 0x53, 0x41, 0xc2, 0x66, 0xc9, 0x68, 0x1f, 0xb,
+ 0x75, 0xa7, 0xa7, 0xb, 0x7, 0xf7, 0x28, 0xf7,
+ 0x76, 0xd0, 0xf5, 0xac, 0x8f, 0xaf, 0x8f, 0x19,
+ 0xb, 0xb6, 0x1b, 0xbd, 0xa1, 0x5c, 0x6d, 0x6d,
+ 0x6c, 0x59, 0x59, 0x53, 0x1f, 0xb, 0xf8, 0x1,
+ 0xa0, 0x76, 0xb, 0x6e, 0x89, 0x76, 0xb, 0x66,
+ 0x88, 0x1e, 0x7c, 0xf7, 0x64, 0x9a, 0x7, 0x5a,
+ 0x8f, 0x7f, 0xb, 0x15, 0xa8, 0x6, 0x9c, 0x91,
+ 0xb, 0x87, 0x1e, 0xe, 0xbb, 0xf7, 0xca, 0xc3,
+ 0x12, 0xf7, 0x51, 0xd7, 0x54, 0xdc, 0xb, 0xf7,
+ 0x69, 0x5, 0x76, 0x6, 0x80, 0x89, 0x7c, 0x74,
+ 0x6f, 0xb, 0xe2, 0x81, 0xd0, 0xf7, 0x64, 0xab,
+ 0xb, 0x8f, 0x8c, 0x8e, 0x1e, 0xb, 0x1a, 0xfc,
+ 0x3c, 0x7, 0xb, 0x76, 0xf9, 0x2a, 0x77, 0xb,
+ 0x2e, 0x6f, 0x1e, 0xa4, 0x7d, 0x5, 0xb2, 0x9b,
+ 0xa7, 0xb, 0xf7, 0x63, 0x98, 0x76, 0xf8, 0x9e,
+ 0x77, 0x1, 0xa7, 0xb, 0xb6, 0x28, 0xee, 0xef,
+ 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xb, 0xfb, 0x58,
+ 0x76, 0xf7, 0x63, 0xab, 0xf8, 0xe, 0xc7, 0xb,
+ 0x85, 0x1a, 0x84, 0x8e, 0x87, 0x93, 0x1e, 0xe,
+ 0x73, 0xfb, 0x30, 0x76, 0xf9, 0xe9, 0x77, 0x1,
+ 0xb, 0x73, 0xf8, 0x5a, 0x76, 0xf7, 0x87, 0x77,
+ 0x1, 0xb, 0x73, 0xf8, 0xa4, 0x76, 0xf7, 0x3f,
+ 0x77, 0x1, 0xb, 0x73, 0xfb, 0x30, 0xa4, 0xf9,
+ 0x94, 0xa4, 0x1, 0xb, 0xa8, 0x73, 0xa3, 0x6e,
+ 0x6e, 0x74, 0x73, 0x6e, 0xb, 0xa1, 0x3d, 0xa,
+ 0x77, 0xb, 0x1a, 0x92, 0x88, 0x8f, 0x83, 0x1e,
+ 0xe, 0xf7, 0x1f, 0xe8, 0xf7, 0x1f, 0xb, 0xfb,
+ 0x13, 0xfb, 0x42, 0x8b, 0xb, 0xf7, 0x5b, 0xa0,
+ 0x76, 0xb, 0xa7, 0xa7, 0xa0, 0xb, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+ 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+ 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+ 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+ 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+ 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+ 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+ 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+ 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+ 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+ 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x47,
+ 0x0, 0x61, 0x0, 0xcc, 0x1, 0x51, 0x1, 0xe0,
+ 0x2, 0x97, 0x2, 0xaa, 0x2, 0xdd, 0x3, 0x14,
+ 0x3, 0xb8, 0x3, 0xdd, 0x4, 0x0, 0x4, 0x10,
+ 0x4, 0x1f, 0x4, 0x34, 0x4, 0x7e, 0x4, 0xb4,
+ 0x5, 0x3, 0x5, 0x71, 0x5, 0xa1, 0x6, 0x12,
+ 0x6, 0x72, 0x6, 0x9b, 0x7, 0x10, 0x7, 0x7d,
+ 0x7, 0x98, 0x7, 0xf6, 0x8, 0x1a, 0x8, 0x3e,
+ 0x8, 0x5d, 0x8, 0xc5, 0x9, 0x7e, 0x9, 0xc2,
+ 0xa, 0x4a, 0xa, 0x7e, 0xa, 0xb5, 0xa, 0xfc,
+ 0xb, 0x54, 0xb, 0xc1, 0xc, 0x9, 0xc, 0x11,
+ 0xc, 0x5f, 0xc, 0xd3, 0xc, 0xf4, 0xd, 0x4c,
+ 0xd, 0x67, 0xd, 0x8f, 0xd, 0xc6, 0xe, 0x30,
+ 0xe, 0xa4, 0xe, 0xfe, 0xf, 0x44, 0xf, 0x58,
+ 0xf, 0xa3, 0x10, 0x30, 0x10, 0xb0, 0x10, 0xfa,
+ 0x11, 0x6, 0x11, 0x27, 0x11, 0x3e, 0x11, 0x60,
+ 0x11, 0x7f, 0x11, 0x8f, 0x11, 0xab, 0x12, 0x4,
+ 0x12, 0x54, 0x12, 0x94, 0x13, 0x3, 0x13, 0x1c,
+ 0x13, 0x6b, 0x14, 0x1a, 0x14, 0x87, 0x14, 0xbb,
+ 0x15, 0xd, 0x15, 0x90, 0x15, 0xb2, 0x16, 0x4c,
+ 0x16, 0x6a, 0x16, 0xa7, 0x16, 0xeb, 0x17, 0x55,
+ 0x17, 0xb0, 0x18, 0x17, 0x18, 0x5f, 0x18, 0x85,
+ 0x18, 0xdb, 0x19, 0x6e, 0x19, 0xf4, 0x1a, 0x17,
+ 0x1a, 0x28, 0x1a, 0x79, 0x1a, 0x91, 0x1a, 0xdc,
+ 0x1b, 0x1c, 0x1b, 0x5e, 0x1b, 0xe1, 0x1c, 0x8e,
+ 0x1d, 0x10, 0x1d, 0x94, 0x1d, 0xae, 0x1e, 0x5f,
+ 0x1e, 0x75, 0x1e, 0xce, 0x1f, 0x44, 0x1f, 0x5e,
+ 0x1f, 0x81, 0x1f, 0xf9, 0x20, 0x9, 0x20, 0x40,
+ 0x20, 0x7b, 0x20, 0x99, 0x20, 0xb6, 0x20, 0xbd,
+ 0x21, 0x2f, 0x21, 0x5e, 0x21, 0x71, 0x21, 0xb4,
+ 0x21, 0xcf, 0x22, 0x8, 0x22, 0x34, 0x22, 0x59,
+ 0x22, 0x8c, 0x22, 0xba, 0x23, 0x20, 0x23, 0x3d,
+ 0x23, 0x58, 0x23, 0x6b, 0x23, 0xb7, 0x23, 0xd5,
+ 0x23, 0xff, 0x24, 0xb1, 0x25, 0xe, 0x25, 0x27,
+ 0x25, 0x3c, 0x25, 0x4f, 0x25, 0x83, 0x25, 0x96,
+ 0x25, 0xc1, 0x25, 0xf5, 0x26, 0x26, 0x26, 0x66,
+ 0x26, 0x99, 0x26, 0xa1, 0x26, 0xa9, 0x26, 0xbb,
+ 0x26, 0xf3, 0x27, 0x23, 0x27, 0x5b, 0x27, 0xd6,
+ 0x28, 0x32, 0x28, 0x44, 0x28, 0x5a, 0x28, 0x93,
+ 0x28, 0xac, 0x28, 0xf0, 0x29, 0x72, 0x29, 0xab,
+ 0x29, 0xf5, 0x2a, 0x6, 0x2a, 0x31, 0x2a, 0x5c,
+ 0x2a, 0xc0, 0x2b, 0x65, 0x2b, 0xc1, 0x2b, 0xdf,
+ 0x2b, 0xf6, 0x2c, 0xe, 0x2c, 0x2d, 0x2c, 0x39,
+ 0x2c, 0x44, 0x2c, 0x50, 0x2c, 0x6a, 0x2c, 0xda,
+ 0x2d, 0x29, 0x2d, 0x5a, 0x2d, 0x9b, 0x2d, 0xbd,
+ 0x2d, 0xfa, 0x2e, 0x2e, 0x2e, 0x60, 0x2e, 0xd8,
+ 0x2e, 0xec, 0x2e, 0xfa, 0x2f, 0xf, 0x2f, 0x36,
+ 0x2f, 0x51, 0x2f, 0x90, 0x2f, 0xae, 0x2f, 0xb5,
+ 0x2f, 0xe8, 0x30, 0x22, 0x30, 0xda, 0x31, 0x68,
+ 0x31, 0xbd, 0x32, 0x2c, 0x32, 0x68, 0x32, 0x80,
+ 0x32, 0x99, 0x33, 0xc, 0x33, 0x1b, 0x33, 0x23,
+ 0x33, 0x4a, 0x33, 0x5b, 0x33, 0x91, 0x33, 0xc3,
+ 0x33, 0xe9, 0x34, 0x4, 0x34, 0xd, 0x34, 0x18,
+ 0x34, 0x37, 0x34, 0x4e, 0x34, 0x6f, 0x34, 0x89,
+ 0x34, 0xa1, 0x34, 0xdc, 0x35, 0x75, 0x36, 0x33,
+ 0x36, 0x51, 0x36, 0x85, 0x37, 0x3a, 0x37, 0x50,
+ 0x37, 0x70, 0x37, 0x8b, 0x38, 0x1a, 0x38, 0xbf,
+ 0x38, 0xd2, 0x39, 0x5c, 0x39, 0xdd, 0x20, 0xe,
+ 0x20, 0xe, 0x73, 0x82, 0xf5, 0xf8, 0xd7, 0x77,
+ 0x1, 0xf7, 0x16, 0xf7, 0x0, 0x14, 0x20, 0xf7,
+ 0x44, 0xf7, 0x44, 0x15, 0x9c, 0x6, 0xa1, 0xf7,
+ 0x50, 0xa2, 0xf7, 0xe, 0xd8, 0x1a, 0xca, 0x82,
+ 0xbd, 0x5d, 0x5f, 0x82, 0x58, 0x4e, 0x3d, 0xa3,
+ 0xfb, 0x10, 0xa1, 0xfb, 0x4e, 0x1e, 0x5d, 0xfb,
+ 0x18, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa5,
+ 0xa2, 0xa8, 0xa8, 0x71, 0xa4, 0x6e, 0x6e, 0x73,
+ 0x73, 0x6e, 0x1e, 0xe, 0xbe, 0xf8, 0x58, 0x76,
+ 0xf7, 0x89, 0x77, 0x1, 0xd8, 0xe0, 0xdf, 0xe0,
+ 0x3, 0xf7, 0xaa, 0xf8, 0x43, 0x15, 0x44, 0xa,
+ 0xfb, 0x3d, 0x16, 0x44, 0xa, 0xe, 0xa0, 0x76,
+ 0xf7, 0x6d, 0xbd, 0xf7, 0x21, 0xbc, 0xf7, 0x61,
+ 0x77, 0x12, 0x8d, 0xf8, 0x85, 0x17, 0xde, 0x16,
+ 0xbf, 0x6, 0xaf, 0xf7, 0x6d, 0x5, 0xf7, 0x1b,
+ 0x6, 0x6b, 0xfb, 0x6d, 0x5, 0xc1, 0x6, 0xab,
+ 0xf7, 0x6d, 0x5, 0xf7, 0x1, 0xbd, 0x26, 0x6,
+ 0x9f, 0xf7, 0x21, 0x5, 0xf7, 0x3, 0xbc, 0x25,
+ 0x6, 0xab, 0xf7, 0x61, 0x5, 0x55, 0x6, 0x6c,
+ 0xfb, 0x61, 0x5, 0xfb, 0x1c, 0x6, 0xaa, 0xf7,
+ 0x61, 0x5, 0x54, 0x6, 0x6b, 0xfb, 0x61, 0x5,
+ 0xfb, 0xc, 0x5a, 0xf7, 0x7, 0x6, 0x75, 0xfb,
+ 0x21, 0x5, 0xfb, 0xf, 0x59, 0xf7, 0x7, 0x6,
+ 0x13, 0x60, 0xc8, 0xbd, 0x15, 0x9f, 0xf7, 0x21,
+ 0x5, 0xf7, 0x1c, 0x6, 0x78, 0xfb, 0x21, 0x5,
+ 0xe, 0x49, 0x76, 0xe3, 0xa7, 0xf8, 0xf4, 0xa6,
+ 0xca, 0x77, 0x12, 0xb7, 0x9a, 0xf7, 0x3f, 0xad,
+ 0xf7, 0x26, 0x9a, 0x17, 0xb7, 0xbe, 0x15, 0x7a,
+ 0xa6, 0xc7, 0x69, 0xee, 0x1b, 0x34, 0xad, 0xe2,
+ 0x7, 0xf4, 0x99, 0xe3, 0xb8, 0xf7, 0x7, 0x1a,
+ 0xf7, 0x0, 0x4b, 0xae, 0xfb, 0x15, 0xd5, 0x1e,
+ 0xf7, 0x8a, 0x7, 0xbe, 0xd5, 0x70, 0xfb, 0x2,
+ 0xa0, 0x1f, 0x9a, 0xf7, 0x3, 0x6, 0xb2, 0x5f,
+ 0x45, 0x99, 0x5c, 0x1b, 0xca, 0x69, 0x4c, 0x7,
+ 0xfb, 0x13, 0x58, 0x39, 0x44, 0x29, 0xe2, 0x57,
+ 0xe6, 0x58, 0x1f, 0xfb, 0xae, 0x7, 0x2d, 0x54,
+ 0xbf, 0xf0, 0x75, 0x1f, 0x7c, 0x6, 0xf7, 0x4d,
+ 0xf7, 0x76, 0x15, 0x13, 0x64, 0x4f, 0xb3, 0x60,
+ 0xab, 0xc0, 0x1a, 0xa1, 0x91, 0xde, 0xec, 0x1e,
+ 0xae, 0xfc, 0xf5, 0x15, 0xf7, 0x9d, 0x7, 0x13,
+ 0x44, 0xca, 0x64, 0xbe, 0x6b, 0x44, 0x1a, 0x25,
+ 0x3a, 0x7c, 0x6a, 0x85, 0x1e, 0xe, 0xf8, 0x70,
+ 0x7f, 0xa9, 0x6e, 0x76, 0xf7, 0xc4, 0xa9, 0x9f,
+ 0xa9, 0xf7, 0x91, 0xa9, 0x9c, 0x77, 0x12, 0xbc,
+ 0xd4, 0xf7, 0x24, 0xd3, 0xde, 0xd4, 0xf7, 0x23,
+ 0xd4, 0x13, 0x77, 0xc0, 0xf7, 0x34, 0x82, 0x15,
+ 0xa9, 0x74, 0xf8, 0x28, 0xf9, 0x29, 0x6a, 0xa2,
+ 0x5, 0x13, 0xbb, 0xc0, 0xfc, 0x94, 0xfb, 0x5b,
+ 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf1, 0xb5, 0xf1,
+ 0xdb, 0xdb, 0x60, 0xf0, 0x27, 0x1e, 0x8a, 0x6,
+ 0x25, 0x60, 0x26, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+ 0xbe, 0x96, 0xef, 0xc8, 0x1e, 0x8c, 0x6, 0xc9,
+ 0x94, 0x26, 0x58, 0x5b, 0x82, 0x24, 0x4d, 0x4d,
+ 0x80, 0xf0, 0xbe, 0x1f, 0xf7, 0xbf, 0xfb, 0xb1,
+ 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf0, 0xb6, 0xf1,
+ 0xdb, 0xdb, 0x60, 0xf1, 0x27, 0x1e, 0x8a, 0x6,
+ 0x25, 0x60, 0x25, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+ 0xc0, 0x96, 0xee, 0xc7, 0x1e, 0x8c, 0x6, 0xc9,
+ 0x94, 0x26, 0x58, 0x5a, 0x82, 0x24, 0x4e, 0x4d,
+ 0x80, 0xf1, 0xbd, 0x1f, 0xe, 0xf8, 0x39, 0x7e,
+ 0xbf, 0x57, 0xd2, 0xf8, 0x4, 0x77, 0xf7, 0x82,
+ 0xab, 0x12, 0xb5, 0xe7, 0xcf, 0xda, 0x8b, 0xf7,
+ 0x31, 0x8b, 0xc0, 0x13, 0x7f, 0xf7, 0xd5, 0xf8,
+ 0x34, 0x15, 0x77, 0xb4, 0x77, 0xbf, 0xbb, 0x1a,
+ 0xc9, 0xb0, 0xa4, 0xb4, 0xb6, 0xaf, 0x69, 0x59,
+ 0x38, 0x31, 0x5c, 0x70, 0x7d, 0x1e, 0xf7, 0x0,
+ 0xfb, 0xe6, 0x15, 0x6d, 0xa8, 0xc7, 0x4e, 0xdc,
+ 0x1b, 0xf5, 0xb7, 0xf7, 0x1, 0x8f, 0x8c, 0x1f,
+ 0x7c, 0x96, 0x5, 0x6d, 0x73, 0x77, 0x74, 0x57,
+ 0x1b, 0x41, 0x47, 0xdc, 0x99, 0x82, 0x1f, 0xef,
+ 0xf7, 0x2d, 0xaf, 0xc3, 0xbe, 0xb1, 0xaf, 0x90,
+ 0x19, 0xa0, 0xfb, 0x6c, 0x76, 0x7, 0xb0, 0x88,
+ 0xa6, 0x7c, 0x65, 0x1a, 0x55, 0x4d, 0x3c, 0x6e,
+ 0x65, 0x1e, 0x58, 0xc9, 0x5e, 0xd3, 0x67, 0xd3,
+ 0x8, 0xcb, 0xa9, 0xe6, 0xb7, 0xed, 0x1a, 0xd7,
+ 0x4c, 0xb7, 0x42, 0x26, 0x57, 0x36, 0x43, 0x5b,
+ 0x98, 0x6a, 0xa1, 0x4e, 0x1e, 0x23, 0x4f, 0x30,
+ 0x46, 0x23, 0x1a, 0xfb, 0x17, 0xf3, 0x71, 0xc8,
+ 0xf7, 0xb, 0xca, 0xc3, 0xae, 0xb3, 0x1e, 0x72,
+ 0xa5, 0x15, 0x13, 0xbf, 0x51, 0x46, 0x5a, 0x84,
+ 0x74, 0x1b, 0x44, 0x51, 0xcb, 0xd8, 0xe3, 0xd4,
+ 0xb9, 0xb8, 0xa8, 0x1f, 0xb5, 0x3b, 0xbf, 0x32,
+ 0xc5, 0x45, 0x8, 0xe, 0xfb, 0x45, 0xf8, 0x58,
+ 0x76, 0xf7, 0x89, 0x77, 0x1, 0xbb, 0xe0, 0x3,
+ 0xe5, 0xf8, 0x43, 0x15, 0x44, 0xa, 0xe, 0x90,
+ 0x1d, 0xbb, 0xdc, 0x3, 0xf7, 0xbb, 0xfb, 0x45,
+ 0x15, 0x97, 0x9b, 0x5, 0xfb, 0x24, 0xf7, 0x3,
+ 0x69, 0xf7, 0x66, 0xf1, 0x1a, 0xf7, 0x92, 0xf0,
+ 0xe0, 0xd5, 0xc6, 0x1e, 0x82, 0x9b, 0x5, 0xfb,
+ 0x2f, 0x2f, 0x2f, 0xfb, 0x2a, 0xfb, 0x40, 0x1a,
+ 0xfb, 0x73, 0xea, 0x27, 0xf7, 0x2c, 0xfb, 0x8,
+ 0x1e, 0xe, 0x90, 0x1d, 0xf7, 0x5e, 0xde, 0x3,
+ 0xa8, 0xfb, 0x35, 0x15, 0x94, 0x7b, 0x5, 0xf7,
+ 0x2f, 0xf7, 0x1, 0xe7, 0xf7, 0x19, 0xf7, 0x40,
+ 0x1a, 0xf7, 0x73, 0x2f, 0xf7, 0x0, 0xfb, 0x2c,
+ 0xf7, 0x0, 0x1e, 0x7f, 0x7b, 0x5, 0xf7, 0x3e,
+ 0xfb, 0xd, 0x8e, 0xfb, 0x5e, 0x25, 0x1a, 0xfb,
+ 0x71, 0xfb, 0x27, 0xfb, 0x31, 0x71, 0x79, 0x1e,
+ 0xe, 0xf8, 0x65, 0x90, 0x8b, 0xf7, 0xf, 0xfb,
+ 0x8, 0x76, 0xa9, 0x77, 0xb7, 0xf7, 0x13, 0x12,
+ 0xf7, 0x73, 0xa9, 0x13, 0x2c, 0xf7, 0x84, 0xf8,
+ 0x5c, 0x15, 0x8c, 0x84, 0x5, 0x94, 0x4f, 0x67,
+ 0x55, 0x6c, 0x1a, 0x72, 0x9d, 0x7d, 0x9c, 0xa4,
+ 0x99, 0xa2, 0x9e, 0x1e, 0xa9, 0x6f, 0x98, 0xee,
+ 0x1a, 0x92, 0x7, 0x92, 0x88, 0x5, 0x71, 0xc9,
+ 0xa2, 0x3e, 0xb7, 0x1b, 0x9e, 0x9c, 0x97, 0xa3,
+ 0x1f, 0x13, 0xc4, 0xc6, 0x40, 0x6c, 0x3a, 0xbe,
+ 0x1e, 0x83, 0x90, 0x5, 0xf2, 0xcc, 0xc7, 0x61,
+ 0xcb, 0x1a, 0xa7, 0x73, 0x93, 0x7f, 0x66, 0x71,
+ 0x47, 0x66, 0x4a, 0x1e, 0x84, 0x87, 0x5, 0x13,
+ 0x1c, 0xa5, 0x7, 0xbf, 0xa6, 0xbb, 0xa6, 0x1a,
+ 0x98, 0x83, 0xa5, 0x71, 0x84, 0x6d, 0x8b, 0x64,
+ 0x1e, 0x5f, 0xa4, 0x7e, 0x3a, 0x1a, 0x7e, 0x7,
+ 0xbe, 0x2c, 0x8c, 0xc1, 0x5e, 0x1b, 0x70, 0x85,
+ 0x70, 0x84, 0x51, 0xe1, 0xa1, 0xcf, 0x60, 0x1f,
+ 0x96, 0x84, 0x5, 0x37, 0x51, 0x3a, 0xac, 0x4c,
+ 0x1a, 0x80, 0x93, 0x76, 0xa5, 0xa2, 0x90, 0x91,
+ 0xb0, 0xac, 0x1e, 0x13, 0x2c, 0xa4, 0xa7, 0x8b,
+ 0x8b, 0xbe, 0xad, 0x8, 0xe, 0xf7, 0x63, 0xa0,
+ 0x76, 0xf7, 0x89, 0xb3, 0x1, 0xf7, 0x9a, 0xb5,
+ 0x3, 0xa9, 0xf7, 0x7c, 0x15, 0xf7, 0x7c, 0xfb,
+ 0x7c, 0xb5, 0xf7, 0x7c, 0xf7, 0x7a, 0xb3, 0xfb,
+ 0x7a, 0xf7, 0x7e, 0x61, 0xfb, 0x7e, 0xfb, 0x7c,
+ 0x6, 0xe, 0x20, 0x7f, 0xf7, 0x6, 0x38, 0x76,
+ 0x12, 0x13, 0x80, 0xd5, 0xfb, 0xe, 0x15, 0x94,
+ 0x78, 0x5, 0x3f, 0xa, 0x79, 0x60, 0x5f, 0xb3,
+ 0x78, 0xaa, 0x95, 0x1e, 0x13, 0x40, 0x8c, 0x8f,
+ 0x94, 0x94, 0x38, 0x1d, 0xe, 0x73, 0xf7, 0x56,
+ 0xca, 0x1, 0xb2, 0xf7, 0x56, 0x15, 0xf7, 0x8a,
+ 0xca, 0xfb, 0x8a, 0x6, 0xe, 0x20, 0x80, 0xf7,
+ 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1, 0xb6,
+ 0x15, 0x43, 0x1d, 0xe, 0x3c, 0x92, 0x7a, 0x1d,
+ 0x83, 0xf7, 0xbb, 0x3, 0x83, 0x7d, 0x15, 0xb3,
+ 0x6, 0xf7, 0x93, 0xf9, 0x46, 0x5, 0x66, 0x6,
+ 0xe, 0x7d, 0xa5, 0xf9, 0x12, 0xa5, 0x1, 0xa3,
+ 0xeb, 0xf7, 0x98, 0xeb, 0x3, 0xf7, 0xc, 0xf7,
+ 0xdf, 0x15, 0xcf, 0x8d, 0xf7, 0x8f, 0xf7, 0x14,
+ 0xf7, 0x14, 0x8d, 0xfb, 0x8f, 0x47, 0x3c, 0x89,
+ 0xfb, 0x84, 0xfb, 0x14, 0xfb, 0x14, 0x89, 0xf7,
+ 0x82, 0xdc, 0x1e, 0x2b, 0x16, 0xfb, 0xd, 0xb5,
+ 0xfb, 0x74, 0xf7, 0x4c, 0xf7, 0x4c, 0xb5, 0xf7,
+ 0x74, 0xf7, 0xd, 0xf7, 0xa, 0x61, 0xf7, 0x77,
+ 0xfb, 0x4c, 0xfb, 0x4c, 0x61, 0xfb, 0x77, 0xfb,
+ 0xa, 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x38, 0x77,
+ 0x1, 0xf7, 0x69, 0xe1, 0x3, 0xf7, 0x3, 0x16,
+ 0xf7, 0xaf, 0x9a, 0x6, 0x40, 0x77, 0x99, 0xd6,
+ 0x1f, 0xf8, 0xce, 0x7, 0x83, 0x8d, 0xfb, 0x48,
+ 0x30, 0x5, 0x7d, 0x7, 0xa1, 0xc3, 0x8b, 0x8b,
+ 0x97, 0x1b, 0xad, 0x8b, 0x71, 0x76, 0x1f, 0xfc,
+ 0x4f, 0x7, 0x41, 0x5f, 0x7f, 0x51, 0x89, 0x1e,
+ 0xe, 0x8b, 0xd7, 0xf8, 0xa2, 0xd5, 0x1, 0xf7,
+ 0xe6, 0xe1, 0x3, 0xa9, 0x16, 0xf8, 0x1a, 0x6,
+ 0xc2, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c, 0x64,
+ 0x6c, 0x88, 0x66, 0x1b, 0xfb, 0x77, 0x6, 0xf7,
+ 0x3c, 0xf7, 0x44, 0x5, 0xb7, 0xba, 0xdf, 0xe6,
+ 0xf5, 0x1a, 0xf7, 0x4, 0x31, 0xcf, 0x30, 0x33,
+ 0x2c, 0x5b, 0xfb, 0x2b, 0x6d, 0x1e, 0xa1, 0x86,
+ 0x5, 0xc1, 0xa1, 0xa9, 0xd7, 0xe6, 0x1b, 0xf7,
+ 0xa, 0xa4, 0x2f, 0x58, 0x40, 0x60, 0x31, 0x34,
+ 0x2e, 0x1f, 0xfb, 0x46, 0xfb, 0x51, 0x5, 0xe,
+ 0x7d, 0xaf, 0xf8, 0xe6, 0xc7, 0x12, 0xf7, 0xfb,
+ 0xc5, 0x51, 0xd3, 0x13, 0xd0, 0xf7, 0x2d, 0xf7,
+ 0xdc, 0x15, 0xd0, 0x8d, 0xa4, 0x88, 0xaf, 0x78,
+ 0x8, 0xcb, 0x6a, 0x97, 0x2b, 0x72, 0x1a, 0x40,
+ 0x62, 0x52, 0x2e, 0x6e, 0x73, 0x98, 0x99, 0x75,
+ 0x1e, 0x99, 0x74, 0x75, 0x9a, 0x74, 0x1b, 0x7b,
+ 0x74, 0x84, 0x6f, 0x57, 0xe2, 0x86, 0xa3, 0xf7,
+ 0x31, 0xf7, 0xc, 0xcd, 0xf7, 0x22, 0xf7, 0x18,
+ 0x36, 0xc4, 0x61, 0x9d, 0x1f, 0x13, 0x60, 0xcd,
+ 0xb6, 0xba, 0xb6, 0xc1, 0x1a, 0xb4, 0x70, 0xe9,
+ 0xfb, 0x15, 0x48, 0xfb, 0x3, 0x6c, 0xfb, 0x17,
+ 0x63, 0x1e, 0x9c, 0x87, 0x5, 0xa7, 0x9a, 0xcb,
+ 0xd9, 0xe6, 0x1b, 0xd5, 0xad, 0x56, 0x58, 0x2f,
+ 0x2c, 0x63, 0x30, 0x6e, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf7, 0x31, 0xcb, 0xf8, 0x5b, 0x77, 0x1, 0xf7,
+ 0xb8, 0xd9, 0x3, 0x97, 0xf7, 0x31, 0x15, 0xf7,
+ 0xad, 0xfb, 0x31, 0xd8, 0xf7, 0x31, 0xf1, 0xcb,
+ 0x25, 0xf8, 0x5b, 0x5f, 0x6, 0xfb, 0xce, 0xfc,
+ 0x5b, 0x5, 0xb3, 0x16, 0xf7, 0x82, 0xf7, 0xf2,
+ 0x5, 0x8d, 0xfb, 0xf2, 0x6, 0xe, 0x7d, 0xb0,
+ 0xf8, 0xcd, 0xda, 0x12, 0xf7, 0xf8, 0xd1, 0x17,
+ 0xf7, 0x1f, 0xf8, 0x79, 0x15, 0xb5, 0xe3, 0x5,
+ 0xf7, 0x4e, 0x6, 0x96, 0x9e, 0x8b, 0x94, 0x8e,
+ 0x1f, 0xb1, 0xda, 0x82, 0x9c, 0x5, 0x7c, 0x80,
+ 0x78, 0x80, 0x71, 0x1b, 0xfb, 0x61, 0x6, 0x24,
+ 0xfb, 0x84, 0x5, 0x84, 0x88, 0x8e, 0x85, 0x91,
+ 0x1b, 0xf7, 0x0, 0x87, 0xf7, 0x45, 0x69, 0xfb,
+ 0x34, 0x1a, 0xfb, 0xe, 0x41, 0x53, 0x4a, 0x70,
+ 0x76, 0x9b, 0x9b, 0x75, 0x1e, 0x13, 0xc0, 0x9a,
+ 0x76, 0x74, 0x9a, 0x6c, 0x1b, 0x63, 0x8b, 0x6e,
+ 0x81, 0x67, 0xba, 0x73, 0xda, 0x1f, 0x13, 0x60,
+ 0xf7, 0x32, 0xf7, 0x2, 0xf5, 0xf7, 0x19, 0xe4,
+ 0x80, 0x9e, 0x60, 0xbf, 0x1f, 0x13, 0x40, 0x50,
+ 0xd3, 0x2d, 0x99, 0x3b, 0x99, 0x8, 0xe, 0x7d,
+ 0xa7, 0xf7, 0xe6, 0xb8, 0xf7, 0xb2, 0x77, 0x1,
+ 0xbe, 0xe8, 0xf7, 0x77, 0xe5, 0x3, 0xf7, 0x2e,
+ 0xf8, 0xd, 0x15, 0x9e, 0xf7, 0xe, 0xf6, 0xe6,
+ 0xf7, 0x46, 0xa7, 0x89, 0xaf, 0x18, 0xfb, 0x86,
+ 0x83, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0x5f, 0x1a,
+ 0xfb, 0x66, 0xf1, 0x40, 0xf7, 0xa, 0xf7, 0x46,
+ 0xa8, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x44, 0xcd,
+ 0x21, 0x53, 0x64, 0x86, 0x67, 0x5e, 0x1e, 0x75,
+ 0xfb, 0x21, 0x15, 0xc7, 0x90, 0x9e, 0x97, 0x9c,
+ 0x1e, 0xa7, 0x9f, 0xbc, 0x97, 0xad, 0x1b, 0xf5,
+ 0xa2, 0x31, 0x24, 0xfb, 0x5, 0x64, 0x57, 0x4c,
+ 0x40, 0x43, 0xc1, 0xf7, 0x3c, 0x1f, 0xe, 0x98,
+ 0x76, 0xf8, 0xe8, 0xd5, 0x1, 0x9f, 0xf8, 0x41,
+ 0x3, 0xf7, 0x40, 0x83, 0x15, 0xcc, 0x6, 0xf7,
+ 0x68, 0xf9, 0x22, 0x5, 0x9b, 0xfc, 0x6, 0x7,
+ 0x50, 0xfb, 0x27, 0x9c, 0x83, 0x5, 0xbf, 0xac,
+ 0xa7, 0xa8, 0xcc, 0x1b, 0xf7, 0x63, 0x6, 0xe,
+ 0x7d, 0xa7, 0xf9, 0xe, 0xa7, 0x12, 0xd6, 0xd7,
+ 0x45, 0xd1, 0xf7, 0x60, 0xd0, 0x4c, 0xd7, 0x13,
+ 0xe4, 0xf7, 0x6c, 0xf7, 0xcc, 0x15, 0xf7, 0x7,
+ 0x39, 0xbb, 0x6d, 0x41, 0x1a, 0x45, 0x52, 0x61,
+ 0x4c, 0x3a, 0x5d, 0xcc, 0xd8, 0xe6, 0xbf, 0xb2,
+ 0xab, 0xa5, 0x1e, 0x71, 0x9f, 0x15, 0x32, 0x47,
+ 0x5e, 0x6c, 0x34, 0x1a, 0x3d, 0xcd, 0x39, 0xf7,
+ 0x10, 0xf7, 0x3a, 0xb6, 0xf7, 0x4, 0xbf, 0xce,
+ 0x7a, 0xc5, 0xfb, 0x1a, 0xeb, 0x1e, 0x13, 0xd8,
+ 0xc1, 0xa8, 0xd7, 0xb5, 0xe7, 0x1a, 0xd7, 0x43,
+ 0xcd, 0xfb, 0x5, 0x35, 0x26, 0x55, 0x26, 0x3a,
+ 0xb7, 0x69, 0xdf, 0x41, 0x1e, 0xd6, 0xc4, 0x15,
+ 0x67, 0xa2, 0x2e, 0xc4, 0xd9, 0x1a, 0xbb, 0xab,
+ 0xc0, 0xd6, 0xd8, 0xb8, 0x55, 0x54, 0x33, 0x4d,
+ 0x66, 0x65, 0x72, 0x1e, 0xe, 0x8b, 0x76, 0xf7,
+ 0x74, 0xb6, 0xf8, 0x19, 0xa7, 0x1, 0xa9, 0xe7,
+ 0xf7, 0x88, 0xe8, 0x3, 0xc6, 0x75, 0x15, 0xf7,
+ 0x91, 0x9b, 0xf7, 0x27, 0xf7, 0x51, 0xf7, 0x69,
+ 0x1a, 0xdf, 0x73, 0xc7, 0x63, 0xbb, 0x1e, 0xbc,
+ 0x64, 0x54, 0xa8, 0x4e, 0x1b, 0xfb, 0x17, 0x89,
+ 0x3c, 0x23, 0xfb, 0x11, 0x1a, 0x38, 0xba, 0x23,
+ 0xf7, 0x19, 0xbe, 0xbf, 0x92, 0xb0, 0xb7, 0x1e,
+ 0x8c, 0x8a, 0x83, 0x73, 0x58, 0xfb, 0x78, 0xfb,
+ 0x87, 0x62, 0x19, 0xf7, 0xc7, 0xf7, 0xf9, 0x15,
+ 0x54, 0x4a, 0x82, 0x5b, 0x20, 0x76, 0xee, 0xd7,
+ 0xa7, 0x93, 0xbb, 0x9c, 0xae, 0x1e, 0xaf, 0x9e,
+ 0xa6, 0xa4, 0xb6, 0x1b, 0xcd, 0xad, 0x5b, 0x52,
+ 0x9b, 0x1f, 0x9a, 0x56, 0x8c, 0x59, 0x89, 0x68,
+ 0x8, 0xe, 0x3c, 0x80, 0xf7, 0x3, 0xf7, 0x8c,
+ 0xf7, 0x3, 0x8b, 0x77, 0x1, 0xdc, 0xf7, 0x3,
+ 0x3, 0xdc, 0xf8, 0x26, 0x15, 0x43, 0x1d, 0xfb,
+ 0xfb, 0x4, 0x43, 0x1d, 0xe, 0x3c, 0xfb, 0xc,
+ 0x76, 0xf7, 0x28, 0x76, 0xf7, 0x8, 0x77, 0xf7,
+ 0x9d, 0xf7, 0x4, 0x12, 0xdb, 0xf7, 0x4, 0xfb,
+ 0x4, 0xf7, 0x1f, 0x13, 0x94, 0xed, 0xfb, 0xe,
+ 0x15, 0x94, 0x78, 0x5, 0x13, 0x74, 0xac, 0x97,
+ 0xda, 0xcc, 0xd1, 0x1a, 0xdf, 0x50, 0x97, 0x76,
+ 0x80, 0x5b, 0x85, 0x54, 0x66, 0xa3, 0x79, 0xab,
+ 0x92, 0x96, 0x94, 0x8c, 0x8e, 0x1e, 0x8c, 0x8f,
+ 0x8e, 0x8c, 0x8d, 0x1b, 0x13, 0x18, 0x39, 0xa,
+ 0x79, 0xf8, 0xa1, 0x15, 0x13, 0x10, 0x6c, 0xa4,
+ 0x72, 0xaa, 0x1e, 0x13, 0x98, 0xaa, 0xa4, 0xa4,
+ 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72, 0x72,
+ 0x6c, 0x1f, 0xe, 0x8c, 0x1d, 0xf8, 0x90, 0xfc,
+ 0x7e, 0xca, 0x3, 0xa7, 0xf7, 0x81, 0x15, 0xf8,
+ 0x90, 0xfb, 0x89, 0x5, 0xb8, 0x7, 0xfc, 0x51,
+ 0xf7, 0x6c, 0xf8, 0x51, 0xf7, 0x6b, 0x5, 0xb9,
+ 0x7, 0xfc, 0x90, 0xfb, 0x8c, 0x5, 0xe, 0xf7,
+ 0x63, 0xf7, 0xc, 0xcd, 0xf7, 0x1a, 0xcd, 0x63,
+ 0xb3, 0x12, 0x13, 0xa0, 0xa9, 0xf7, 0xee, 0x15,
+ 0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+ 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb6, 0xfc,
+ 0x8c, 0x7, 0xe, 0x8c, 0x1d, 0x8b, 0x3, 0xa7,
+ 0x83, 0x15, 0xf8, 0x90, 0xf7, 0x89, 0x5, 0xa8,
+ 0x7, 0xfc, 0x90, 0xf7, 0x8c, 0x5, 0x5d, 0x7,
+ 0xf8, 0x51, 0xfb, 0x6b, 0xfc, 0x51, 0xfb, 0x6c,
+ 0x5, 0xe, 0xe2, 0x83, 0xf4, 0xf7, 0xfe, 0x77,
+ 0xf7, 0x63, 0xa9, 0x12, 0xcf, 0xbe, 0xf7, 0x5f,
+ 0xe7, 0x17, 0xf7, 0x77, 0xf7, 0x38, 0x15, 0x9c,
+ 0x6, 0x99, 0xe1, 0xa5, 0xb3, 0xc2, 0xcb, 0x8,
+ 0xa9, 0xae, 0xb8, 0xd1, 0xbe, 0x1a, 0xf1, 0x44,
+ 0xcb, 0xfb, 0x4, 0x46, 0x2d, 0x56, 0x26, 0x69,
+ 0x95, 0x6e, 0xb3, 0xa7, 0x96, 0xa3, 0x9c, 0x9c,
+ 0x83, 0x97, 0x82, 0x95, 0x1e, 0x81, 0x97, 0x80,
+ 0x95, 0x99, 0x1a, 0xac, 0xbe, 0xb1, 0xb5, 0xd8,
+ 0xac, 0x48, 0x4f, 0x63, 0x78, 0x46, 0x79, 0x63,
+ 0x1e, 0x69, 0x3d, 0x73, 0x46, 0x50, 0x1a, 0x61,
+ 0xfb, 0xc, 0x15, 0x6e, 0xa2, 0x74, 0xa8, 0xa8,
+ 0xa3, 0xa2, 0xa8, 0x1e, 0x13, 0x80, 0x94, 0x1d,
+ 0x1e, 0xe, 0xf8, 0xc8, 0x7d, 0xb2, 0xf7, 0xa,
+ 0xac, 0x7f, 0xb7, 0xf7, 0x7a, 0xb7, 0xf7, 0x37,
+ 0xaa, 0x12, 0xf7, 0x8, 0xdf, 0xf7, 0xd, 0xd2,
+ 0xf8, 0xd, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7,
+ 0xa3, 0x15, 0xf7, 0xd, 0xe4, 0xd3, 0xbb, 0xa9,
+ 0x94, 0x74, 0x61, 0x5a, 0x7d, 0x63, 0x7e, 0x6b,
+ 0x1e, 0x4e, 0x72, 0x6a, 0x6d, 0x6f, 0x1b, 0x68,
+ 0x6f, 0xa3, 0xc7, 0x1f, 0xf7, 0x22, 0x52, 0x15,
+ 0x7e, 0x8a, 0xa3, 0x51, 0xcd, 0x1b, 0xf7, 0xb,
+ 0xce, 0xf7, 0x1c, 0xf1, 0xf7, 0x3d, 0xfb, 0x24,
+ 0xf7, 0x12, 0xfb, 0x4c, 0xfb, 0x5a, 0xfb, 0x3b,
+ 0xfb, 0x25, 0xfb, 0x6c, 0xfb, 0x1a, 0xf7, 0x6,
+ 0xfb, 0x57, 0xf7, 0x99, 0xd9, 0xd9, 0xab, 0xa8,
+ 0xca, 0x1f, 0x7f, 0xa9, 0x5, 0x71, 0x52, 0x4d,
+ 0x71, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x8, 0xf7,
+ 0x1d, 0xf7, 0x23, 0xf7, 0x72, 0xf7, 0x14, 0xf7,
+ 0xa, 0xf7, 0x2d, 0xf7, 0x4b, 0xf4, 0xfb, 0x2b,
+ 0xfb, 0x6, 0x1f, 0x13, 0xdf, 0x35, 0x5a, 0xfb,
+ 0xa, 0x3a, 0x5e, 0x91, 0xbc, 0x9a, 0x8e, 0x1e,
+ 0xcd, 0xf7, 0x9c, 0x5, 0x46, 0x6, 0x80, 0x5b,
+ 0x5, 0x13, 0x32, 0xa3, 0x7e, 0x7f, 0xa7, 0x5d,
+ 0x1b, 0xfb, 0x1b, 0x4d, 0xfb, 0x3e, 0x45, 0xfb,
+ 0x5, 0xcf, 0x80, 0xa7, 0xc5, 0xb9, 0xbf, 0x9d,
+ 0x96, 0x1f, 0xe, 0x5c, 0x1d, 0x1, 0x9a, 0x16,
+ 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x51, 0xa4, 0xb2,
+ 0x9a, 0x1f, 0xbd, 0xf7, 0x19, 0x5, 0xf7, 0x9a,
+ 0x6, 0xba, 0x27, 0x93, 0x7d, 0x8f, 0x7b, 0x8,
+ 0x5f, 0x96, 0x60, 0x74, 0x66, 0x1b, 0x78, 0xf7,
+ 0x93, 0x9e, 0x7, 0x73, 0x68, 0xa1, 0xb8, 0x77,
+ 0x1f, 0xfb, 0x98, 0xf8, 0xe0, 0x5, 0x77, 0x6,
+ 0xfb, 0x77, 0xfc, 0xab, 0x78, 0x71, 0x7c, 0x6d,
+ 0x73, 0x5c, 0x6c, 0x7b, 0x2e, 0xa, 0xe, 0xf7,
+ 0xca, 0x8b, 0xb0, 0xf7, 0xb5, 0xb2, 0xf7, 0x98,
+ 0xb0, 0x12, 0xf7, 0x5, 0xf1, 0xf7, 0x86, 0xf1,
+ 0x3a, 0xf7, 0x7, 0x13, 0xf4, 0x9c, 0x16, 0xf7,
+ 0xe2, 0x6, 0xf7, 0x72, 0x9f, 0xf7, 0x1e, 0xb1,
+ 0xf4, 0x3b, 0xbb, 0x34, 0x9d, 0x1f, 0x8d, 0x7,
+ 0x13, 0xf8, 0xb8, 0x96, 0xe3, 0xa1, 0xf7, 0x3,
+ 0x1a, 0xf7, 0x2f, 0xfb, 0x43, 0x99, 0x34, 0x1e,
+ 0xfb, 0xac, 0x78, 0x6, 0xda, 0x9c, 0x66, 0x77,
+ 0x1f, 0xfc, 0x86, 0x7, 0x6c, 0x7f, 0x67, 0x37,
+ 0x89, 0x1e, 0xf7, 0x5a, 0xf7, 0xc7, 0x15, 0xeb,
+ 0xab, 0x86, 0x81, 0xad, 0x1f, 0x13, 0xf4, 0xbf,
+ 0x7b, 0xbc, 0x6a, 0x39, 0x1a, 0xfb, 0x1a, 0xfb,
+ 0xd, 0x82, 0x49, 0x51, 0x79, 0x99, 0xb0, 0x1e,
+ 0xf7, 0xa9, 0x4, 0xf7, 0x70, 0x7, 0x9a, 0x8d,
+ 0xa3, 0x9f, 0x1e, 0x95, 0x99, 0x8c, 0xa0, 0x1b,
+ 0x13, 0xf8, 0xd2, 0xf3, 0x78, 0xfb, 0xb, 0xfb,
+ 0xb, 0xfb, 0xb, 0x89, 0x6f, 0x1f, 0xe, 0xf7,
+ 0xca, 0x7d, 0xb7, 0xf8, 0x39, 0x77, 0xf7, 0x61,
+ 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0x3, 0xf8, 0xfb,
+ 0xf7, 0x17, 0x15, 0x77, 0x1d, 0xf7, 0x57, 0xdb,
+ 0xf7, 0x4, 0xf7, 0x2d, 0xf7, 0xf, 0xd3, 0x3b,
+ 0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x75,
+ 0x59, 0x1d, 0xf7, 0x4c, 0xe1, 0xf7, 0x11, 0x8d,
+ 0x8c, 0x1f, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf8,
+ 0xe0, 0xb0, 0x1, 0xf3, 0xf1, 0xf7, 0xf3, 0x58,
+ 0x1d, 0x85, 0x96, 0x72, 0x67, 0x1a, 0xfc, 0x7c,
+ 0x7, 0x6c, 0x7f, 0x69, 0x3f, 0x87, 0x1e, 0xf7,
+ 0x52, 0xd0, 0x15, 0xf8, 0x7c, 0x7, 0x9f, 0x8b,
+ 0xa8, 0x8b, 0xa, 0xfb, 0xa8, 0xfb, 0x8a, 0x7b,
+ 0x4b, 0x8c, 0x1e, 0x5b, 0x8c, 0x7f, 0x9b, 0xad,
+ 0x1a, 0xe, 0x7b, 0xa, 0xf7, 0xb5, 0xb4, 0xf7,
+ 0x9a, 0xb1, 0x12, 0xee, 0xf1, 0xf7, 0x9c, 0xa2,
+ 0x17, 0x62, 0xa, 0x96, 0xb4, 0x1f, 0xf7, 0x82,
+ 0x7, 0xf7, 0x2e, 0x89, 0xde, 0x8a, 0x9a, 0x7d,
+ 0x97, 0x3b, 0x19, 0x6f, 0xa, 0x44, 0x80, 0x81,
+ 0x73, 0x32, 0x1b, 0xfb, 0x2e, 0xf7, 0x68, 0x6,
+ 0xad, 0x97, 0x95, 0x33, 0x1d, 0x6, 0x13, 0x10,
+ 0x78, 0x7, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+ 0xfc, 0x7d, 0x7, 0x64, 0x74, 0x6e, 0x4b, 0x84,
+ 0x1d, 0x99, 0x1d, 0xf7, 0x7b, 0x77, 0xf7, 0x8,
+ 0xb4, 0xf7, 0x9a, 0xb1, 0x1, 0xee, 0xf1, 0xf7,
+ 0x8a, 0xa2, 0xb4, 0xa4, 0x3, 0x97, 0x16, 0xf7,
+ 0xac, 0x9e, 0x6, 0x44, 0x8e, 0x77, 0xa1, 0xd6,
+ 0x1a, 0xf7, 0x65, 0x7, 0xf7, 0x25, 0x89, 0xd6,
+ 0x8a, 0xa3, 0x81, 0x96, 0x37, 0x19, 0x6f, 0xa,
+ 0x40, 0x81, 0x79, 0x77, 0x39, 0x1b, 0xfb, 0x25,
+ 0xf7, 0x68, 0x6, 0xa9, 0x92, 0x99, 0xa4, 0x1e,
+ 0xf7, 0x1c, 0x4e, 0xa, 0xf7, 0x23, 0xfc, 0xaa,
+ 0x78, 0x6, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+ 0xfc, 0x61, 0x7, 0x45, 0x7f, 0x71, 0x40, 0x84,
+ 0x1d, 0xf8, 0x1, 0x7d, 0xb3, 0xf7, 0xca, 0x9d,
+ 0xf7, 0xae, 0xb3, 0x1, 0xab, 0xf7, 0x6, 0xf8,
+ 0x17, 0xec, 0x3, 0xf8, 0x5a, 0xf7, 0xe4, 0x15,
+ 0xcf, 0x86, 0x9f, 0x7b, 0x49, 0x98, 0xa, 0x67,
+ 0x46, 0x74, 0x47, 0xfb, 0x2f, 0x23, 0xf7, 0x5,
+ 0xf7, 0x49, 0xf7, 0x91, 0xf7, 0x27, 0xca, 0xea,
+ 0xf7, 0x20, 0xbf, 0x28, 0x43, 0xa6, 0x1e, 0xa2,
+ 0x6, 0x83, 0xf7, 0x67, 0x5, 0x75, 0x6, 0x6f,
+ 0x85, 0x6a, 0x86, 0x83, 0x6b, 0x5d, 0xac, 0x26,
+ 0x1b, 0xfb, 0x68, 0xfb, 0x16, 0xfb, 0x3b, 0xfb,
+ 0x3c, 0xfb, 0x80, 0xf7, 0x2a, 0xfb, 0xb, 0xf7,
+ 0x6a, 0xf7, 0x2, 0xf7, 0x19, 0xc5, 0x99, 0x1f,
+ 0xf7, 0x53, 0x7, 0xd2, 0xa5, 0x97, 0xb7, 0x8f,
+ 0x1e, 0x9d, 0xfb, 0x93, 0x7, 0xe, 0x80, 0x1d,
+ 0xf7, 0xcf, 0xb7, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+ 0xf1, 0xf7, 0xc3, 0xf1, 0x3, 0x9e, 0x16, 0xf7,
+ 0xaa, 0x9e, 0x6, 0x3d, 0x90, 0x81, 0xb3, 0xcd,
+ 0x1a, 0xf7, 0x4d, 0xf7, 0xc3, 0xfb, 0x4d, 0x7,
+ 0x40, 0x87, 0x6b, 0x37, 0x87, 0x1e, 0x78, 0xf7,
+ 0xaa, 0x9e, 0x7, 0x3d, 0x90, 0x81, 0xae, 0xcd,
+ 0x1a, 0xf8, 0x36, 0x67, 0x1d, 0xfb, 0x4c, 0xfb,
+ 0xc3, 0xf7, 0x4c, 0x67, 0x1d, 0xfc, 0x31, 0x7,
+ 0x40, 0x87, 0x6b, 0x37, 0x84, 0x1d, 0x73, 0xa0,
+ 0x76, 0xf9, 0x2a, 0x42, 0xa, 0xe, 0xab, 0x6a,
+ 0xf7, 0xe, 0xf8, 0xd4, 0x77, 0x1, 0xf7, 0x44,
+ 0xf1, 0x3, 0xde, 0xf9, 0x17, 0x15, 0xdc, 0x86,
+ 0x97, 0x73, 0x44, 0x1a, 0xfc, 0x53, 0x7, 0x57,
+ 0x7c, 0x7d, 0x73, 0x75, 0x8a, 0xa8, 0xa3, 0x81,
+ 0x1e, 0x9c, 0x84, 0x7e, 0x99, 0x6f, 0x1b, 0x6e,
+ 0x7a, 0x6d, 0x78, 0x7d, 0x91, 0x7b, 0x9b, 0x79,
+ 0x1f, 0x7f, 0x96, 0xa4, 0x7e, 0xb5, 0x1b, 0xa6,
+ 0xf7, 0x21, 0x8e, 0xf7, 0x56, 0x1f, 0xf7, 0xf6,
+ 0x7, 0xd5, 0x99, 0xa0, 0xd9, 0x90, 0x1e, 0x9e,
+ 0xfb, 0xb3, 0x7, 0xe, 0xf8, 0x1, 0x83, 0xa,
+ 0x1, 0xf7, 0x10, 0xf1, 0x3, 0xad, 0x16, 0xf7,
+ 0xae, 0x9e, 0x6, 0x3d, 0x8f, 0x7f, 0xa5, 0xd1,
+ 0x1a, 0xf7, 0x45, 0x7, 0xa5, 0xa0, 0xf5, 0x22,
+ 0x5, 0xad, 0x69, 0xeb, 0x24, 0x6c, 0x1a, 0x75,
+ 0x7a, 0x8a, 0x56, 0x89, 0x1e, 0x78, 0xf7, 0xc5,
+ 0x9e, 0x7, 0x52, 0x89, 0x67, 0xbe, 0x4b, 0xc6,
+ 0xfb, 0x7d, 0xf7, 0x8e, 0x18, 0xf7, 0x52, 0xf7,
+ 0x50, 0xd2, 0xd1, 0xa0, 0x8e, 0xc7, 0x90, 0x19,
+ 0x9e, 0xfb, 0x9a, 0x78, 0x7, 0xbc, 0x89, 0x9e,
+ 0x89, 0x70, 0x1a, 0x69, 0x6e, 0x70, 0xfb, 0x76,
+ 0xfb, 0x5f, 0x1e, 0xf7, 0x57, 0x7, 0xd5, 0x99,
+ 0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb0, 0x78,
+ 0x7, 0xcf, 0x86, 0xa1, 0x7a, 0x3d, 0x1a, 0xfc,
+ 0x3a, 0x7, 0x43, 0x7f, 0x71, 0x3d, 0x84, 0x1d,
+ 0xf7, 0x92, 0x8b, 0xb2, 0xf7, 0x1b, 0x77, 0xf8,
+ 0x90, 0x77, 0x1, 0xf7, 0x13, 0x5d, 0x1d, 0x96,
+ 0xb3, 0x1f, 0xf8, 0x59, 0x7, 0xda, 0x73, 0x1d,
+ 0xfc, 0x59, 0x7, 0x68, 0x74, 0x6b, 0x4b, 0x84,
+ 0x1d, 0xf8, 0xa8, 0x83, 0xa, 0x1, 0xf7, 0x1,
+ 0xb7, 0xf8, 0x9d, 0xf1, 0x3, 0x5f, 0xa, 0xf8,
+ 0x19, 0x8d, 0x7, 0xf7, 0x8d, 0xfc, 0xb6, 0x5,
+ 0x99, 0x6, 0xf7, 0x92, 0xf8, 0xcd, 0x5, 0x8d,
+ 0xfc, 0x57, 0x6, 0x4e, 0x7e, 0x69, 0x3d, 0x87,
+ 0x1e, 0x78, 0xf7, 0xac, 0x9e, 0x7, 0x4b, 0x8f,
+ 0x74, 0x9e, 0xd8, 0x1a, 0xf8, 0x46, 0x7, 0xda,
+ 0xa3, 0x91, 0xca, 0x90, 0x1e, 0x9e, 0xfb, 0x5b,
+ 0x7, 0xfb, 0x71, 0xfc, 0x8d, 0xfb, 0x7b, 0xf8,
+ 0x8d, 0x5, 0xfb, 0x5c, 0x78, 0x6, 0xd5, 0x87,
+ 0xa2, 0x83, 0x3d, 0x1a, 0xfc, 0x20, 0x78, 0xa,
+ 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab, 0x8a, 0x1d,
+ 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13,
+ 0x78, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7, 0x13,
+ 0xb8, 0x3a, 0xa, 0xe, 0x5b, 0xa, 0x85, 0xa,
+ 0xf7, 0xe4, 0x70, 0xa, 0xfb, 0x1d, 0x69, 0x1d,
+ 0xf7, 0xf, 0x61, 0x1d, 0xf7, 0x10, 0x61, 0xa,
+ 0xfb, 0x2, 0x44, 0x1d, 0xd6, 0xf1, 0xf1, 0xf7,
+ 0x3, 0x32, 0x71, 0x1d, 0x3a, 0x72, 0x1d, 0xea,
+ 0xf7, 0x70, 0x1e, 0xe, 0x99, 0x1d, 0xf7, 0xb4,
+ 0xb3, 0xf7, 0xbd, 0xb0, 0x6d, 0xa, 0xa5, 0xdc,
+ 0x1a, 0xf7, 0x37, 0x66, 0x1d, 0xf7, 0x13, 0xfb,
+ 0x10, 0xc0, 0xfb, 0x1e, 0x1e, 0xfb, 0x9c, 0x78,
+ 0x6, 0xd4, 0x84, 0x96, 0x6d, 0x74, 0x1a, 0xfc,
+ 0x59, 0x8d, 0xa, 0xf7, 0xcc, 0x15, 0xf7, 0x8e,
+ 0x7, 0xac, 0x96, 0x96, 0xa9, 0xb7, 0xf7, 0x26,
+ 0x89, 0x74, 0x1d, 0xf8, 0x1, 0xfb, 0x46, 0x9e,
+ 0xf7, 0x32, 0xa2, 0x8b, 0xf8, 0xfe, 0x8b, 0xaf,
+ 0x1, 0xc4, 0xf7, 0x6, 0xf8, 0x16, 0x9a, 0xa,
+ 0xf7, 0x93, 0x8a, 0x15, 0xfb, 0x33, 0xf7, 0x21,
+ 0xf7, 0x27, 0x79, 0xf7, 0x32, 0x1b, 0x9e, 0x7,
+ 0xfb, 0x22, 0x99, 0x53, 0xb9, 0x3e, 0xe7, 0x8,
+ 0xf7, 0x0, 0x98, 0xf7, 0x24, 0xf3, 0xf7, 0x70,
+ 0x1a, 0xf7, 0x7a, 0xfb, 0x2d, 0xf7, 0x8, 0xfb,
+ 0x38, 0xfb, 0x38, 0xfb, 0x2d, 0xfb, 0x9, 0xfb,
+ 0x79, 0xfb, 0x69, 0xf7, 0xa, 0x2e, 0xe8, 0x72,
+ 0x1e, 0x2a, 0xf7, 0xdf, 0x15, 0xf7, 0x79, 0xf0,
+ 0xdc, 0xf1, 0xf1, 0xf0, 0x3a, 0xfb, 0x79, 0xfb,
+ 0x6f, 0x2f, 0x32, 0xfb, 0x3, 0xfb, 0x3, 0x2f,
+ 0xe4, 0xf7, 0x6f, 0x1e, 0xe, 0xf7, 0xca, 0x8b,
+ 0x9e, 0xf7, 0xb3, 0xb0, 0xf7, 0xae, 0xb0, 0x1,
+ 0xf1, 0xf1, 0xf7, 0x7e, 0xf7, 0x1, 0x3, 0x9c,
+ 0x16, 0xf7, 0xa9, 0x9e, 0x6, 0x3b, 0x8f, 0x81,
+ 0xa8, 0xce, 0x1a, 0xf7, 0x4f, 0x7, 0xc3, 0x8d,
+ 0xf7, 0x82, 0xfb, 0xc8, 0x5, 0xf7, 0x35, 0x9e,
+ 0x6, 0x62, 0x8d, 0x73, 0x9d, 0x75, 0xa6, 0xfb,
+ 0x62, 0xf7, 0x91, 0x18, 0xbe, 0x95, 0xf7, 0x16,
+ 0xa3, 0xf7, 0x1a, 0x1a, 0xf7, 0x2e, 0xfb, 0x39,
+ 0xa0, 0x32, 0x1e, 0xfb, 0xa8, 0x78, 0x6, 0xd1,
+ 0x84, 0x9a, 0x6f, 0x6f, 0x1a, 0xfc, 0x63, 0x7,
+ 0x4f, 0x87, 0x6a, 0x3a, 0x86, 0x1e, 0xf7, 0x4f,
+ 0xf7, 0xd8, 0x15, 0xf7, 0x80, 0x7, 0xa8, 0x94,
+ 0x9c, 0xc0, 0xb4, 0xf7, 0x17, 0x88, 0xfb, 0x19,
+ 0xfb, 0x23, 0xfb, 0x2a, 0x89, 0x37, 0x8a, 0x1e,
+ 0xe, 0xf7, 0x5b, 0x7d, 0xaf, 0xf8, 0xf4, 0xb4,
+ 0x12, 0xb5, 0xa1, 0x96, 0xe1, 0xf7, 0x79, 0xf0,
+ 0x17, 0xb5, 0x7d, 0x15, 0xa1, 0x6, 0x9b, 0xbd,
+ 0x9d, 0xa0, 0x9c, 0x9f, 0x80, 0x81, 0xa8, 0x1e,
+ 0x13, 0xf8, 0x84, 0xa0, 0xa5, 0x85, 0xab, 0x1b,
+ 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf1, 0x38, 0xc4,
+ 0x38, 0xbc, 0x1f, 0x37, 0xbd, 0x37, 0xb5, 0xd6,
+ 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4, 0xb8, 0x31,
+ 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x88, 0x86, 0x1d,
+ 0x1b, 0x7d, 0x77, 0x96, 0x94, 0x71, 0x1f, 0x92,
+ 0x77, 0x74, 0x92, 0x71, 0x55, 0xa, 0x13, 0x70,
+ 0x74, 0x6, 0xe, 0xf7, 0x92, 0xa0, 0x76, 0xf9,
+ 0x0, 0xb5, 0x1, 0xf7, 0x92, 0xf1, 0x3, 0xf7,
+ 0x34, 0x16, 0xf7, 0xb8, 0x9e, 0x6, 0x37, 0x8e,
+ 0x7f, 0xa8, 0xcf, 0x1a, 0xf8, 0x89, 0xc1, 0x7,
+ 0xf7, 0x2, 0xa7, 0x79, 0xfb, 0x2, 0xa0, 0x1f,
+ 0xa3, 0x6, 0x85, 0xf7, 0x3e, 0x5, 0xfc, 0xc8,
+ 0x6, 0x85, 0xfb, 0x3e, 0x5, 0xa3, 0x6, 0xf7,
+ 0x1, 0xa1, 0xa6, 0x9e, 0xf7, 0x2, 0x1b, 0xc1,
+ 0xfc, 0x8b, 0x6, 0x4d, 0x88, 0x6b, 0x30, 0x84,
+ 0x1d, 0x6e, 0xa, 0x1, 0xf3, 0xf1, 0xf7, 0xfd,
+ 0xb7, 0x3, 0x99, 0xf9, 0x17, 0x2d, 0x1d, 0x63,
+ 0x3f, 0xfb, 0x27, 0x49, 0x1d, 0xf8, 0x1, 0x95,
+ 0x76, 0xf9, 0x35, 0x77, 0x12, 0x9b, 0xf9, 0x3d,
+ 0x17, 0xf8, 0x4, 0x80, 0x15, 0x9a, 0x6, 0xf7,
+ 0x86, 0xf8, 0xe9, 0x5, 0x13, 0x60, 0x97, 0xa9,
+ 0x97, 0xa3, 0xbb, 0x8e, 0x8, 0x9e, 0xfb, 0x61,
+ 0x78, 0x7, 0xb1, 0x89, 0xae, 0x7e, 0x62, 0x1a,
+ 0xfb, 0x3a, 0xfc, 0x3e, 0x5, 0xfb, 0x42, 0xf8,
+ 0xf, 0x79, 0xb4, 0x9a, 0x1a, 0xab, 0x9e, 0x97,
+ 0xc3, 0x8e, 0x1e, 0x9e, 0xfb, 0x9e, 0x78, 0x7,
+ 0xba, 0x89, 0x9f, 0x77, 0x98, 0x6f, 0x8, 0xe,
+ 0xf8, 0xdf, 0x95, 0x76, 0xf9, 0x35, 0x77, 0x9f,
+ 0x8b, 0x12, 0x90, 0xfa, 0x33, 0x17, 0xf7, 0xc1,
+ 0x80, 0x15, 0x13, 0xf0, 0x9a, 0x6, 0xf7, 0x2e,
+ 0xf8, 0x3b, 0xb6, 0xfb, 0x1, 0xdd, 0xfb, 0x66,
+ 0xae, 0x23, 0x19, 0x9a, 0x6, 0xc6, 0xf7, 0x55,
+ 0xd9, 0xf7, 0x60, 0xd0, 0xf7, 0x4e, 0x99, 0xb2,
+ 0x9d, 0xa3, 0xbc, 0x93, 0x8, 0x9e, 0xfb, 0x5a,
+ 0x78, 0x7, 0xad, 0x88, 0xac, 0x7d, 0x64, 0x1a,
+ 0x76, 0x83, 0x6d, 0x83, 0x76, 0x1e, 0xfb, 0xf,
+ 0xfb, 0xdd, 0x5, 0xfb, 0x27, 0xf8, 0x10, 0x7d,
+ 0x97, 0x9c, 0x1a, 0xaf, 0xbb, 0x97, 0xaa, 0x1e,
+ 0x9e, 0xfb, 0x9f, 0x78, 0x7, 0xc0, 0x8a, 0x98,
+ 0x7b, 0xac, 0x38, 0xae, 0x43, 0x18, 0x20, 0xfb,
+ 0xae, 0x5, 0xfb, 0x29, 0xf8, 0x19, 0x83, 0x92,
+ 0x99, 0x1a, 0xa5, 0xa1, 0x9b, 0xb8, 0x8d, 0x1e,
+ 0x9e, 0xfb, 0x89, 0x78, 0x7, 0xc4, 0x86, 0x97,
+ 0x64, 0xab, 0x38, 0xb1, 0x27, 0xf5, 0xfb, 0xa6,
+ 0xbe, 0xfb, 0x2d, 0x8, 0xe, 0xf8, 0x1, 0x8b,
+ 0x9e, 0xf9, 0x4, 0x9e, 0x1, 0x95, 0x16, 0xf7,
+ 0x7d, 0x9e, 0x6, 0x64, 0x66, 0x9a, 0xab, 0x9e,
+ 0xaa, 0xb2, 0xa0, 0xa5, 0x1f, 0xf7, 0xb, 0xf7,
+ 0x1e, 0xea, 0xfb, 0x16, 0x5, 0x9b, 0x74, 0xae,
+ 0x55, 0x79, 0x1a, 0x6c, 0x70, 0x7e, 0x59, 0x1e,
+ 0x78, 0xf7, 0xbd, 0x9e, 0x7, 0x57, 0x77, 0xa8,
+ 0xc2, 0x64, 0x1f, 0xfb, 0x54, 0xf7, 0x9c, 0xf7,
+ 0x26, 0xf7, 0x40, 0x5, 0xe2, 0xd1, 0xa5, 0x9c,
+ 0xc0, 0x1b, 0x9e, 0xfb, 0x82, 0x78, 0x7, 0xad,
+ 0xaf, 0x7f, 0x6c, 0x78, 0x7a, 0x77, 0x74, 0x6e,
+ 0x1f, 0xfb, 0x5, 0xfb, 0x14, 0x5, 0xfb, 0x1,
+ 0xf7, 0x24, 0x79, 0xac, 0x9f, 0x1a, 0xa9, 0xa3,
+ 0x97, 0xbf, 0x1e, 0x9e, 0xfb, 0xc2, 0x78, 0x7,
+ 0xc5, 0xa0, 0x7a, 0xfb, 0x2a, 0xf1, 0x1f, 0xf7,
+ 0x1, 0xfb, 0x2a, 0x5, 0xfb, 0xac, 0xfb, 0x80,
+ 0x80, 0x70, 0x54, 0x1b, 0xe, 0xf8, 0x1, 0xa0,
+ 0x76, 0xf9, 0x2a, 0x72, 0xa, 0xa6, 0xd3, 0x1a,
+ 0xf7, 0x4c, 0x7, 0xf7, 0x28, 0xf7, 0x6c, 0xd0,
+ 0xf5, 0xac, 0x99, 0xaf, 0x8f, 0x19, 0x9e, 0xfb,
+ 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x7f, 0x75, 0x1d,
+ 0xfb, 0x6c, 0xfb, 0x28, 0xf7, 0x68, 0x75, 0xa,
+ 0x96, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, 0x78,
+ 0x7, 0xb8, 0x87, 0x9a, 0x7e, 0xf1, 0xfb, 0x2a,
+ 0xf7, 0x17, 0xfb, 0x4a, 0x18, 0xfb, 0x44, 0x7,
+ 0x46, 0x88, 0x6f, 0x29, 0x89, 0x1e, 0xe, 0x7b,
+ 0xa, 0xf8, 0xde, 0xb1, 0x1, 0x94, 0xf8, 0xe0,
+ 0x3f, 0x1d, 0xe, 0x93, 0x1d, 0xe3, 0xd7, 0x3,
+ 0xe3, 0xfb, 0x30, 0x15, 0xf7, 0x67, 0xa4, 0x3f,
+ 0x6, 0x5a, 0x81, 0xb3, 0x97, 0x1f, 0xf9, 0x34,
+ 0x7, 0x99, 0x95, 0xa9, 0xb8, 0x1e, 0xdb, 0xa4,
+ 0xfb, 0x67, 0x6, 0xe, 0x3c, 0xfb, 0x23, 0x76,
+ 0xf7, 0x3f, 0x7a, 0x1d, 0xf7, 0x7e, 0xfb, 0x38,
+ 0x15, 0xb6, 0x6, 0xfb, 0x7c, 0xf9, 0xdc, 0x5,
+ 0x60, 0x6, 0xe, 0x93, 0x1d, 0xf7, 0x3d, 0xd7,
+ 0x3, 0xad, 0xfb, 0x17, 0x15, 0x72, 0xf7, 0x67,
+ 0xf9, 0xc6, 0xfb, 0x67, 0x72, 0xd7, 0x7, 0xbc,
+ 0x95, 0x63, 0x7f, 0x1f, 0xfd, 0x34, 0x7, 0x7d,
+ 0x81, 0x6d, 0x5e, 0x1e, 0xe, 0xf7, 0x4, 0xf9,
+ 0x2a, 0x77, 0x1, 0xa3, 0xf7, 0xbd, 0x15, 0xcf,
+ 0x6, 0xf7, 0x23, 0xf7, 0xb5, 0xf7, 0x23, 0xfb,
+ 0xb5, 0x5, 0xcf, 0x6, 0xfb, 0x48, 0xf8, 0x1,
+ 0x5, 0x4d, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1,
+ 0x8b, 0xf8, 0x88, 0x3, 0x40, 0x4, 0x59, 0xf8,
+ 0x88, 0xbd, 0x7, 0xe, 0x92, 0x1d, 0x9e, 0xf7,
+ 0x73, 0x3, 0xf7, 0x5e, 0xf8, 0x8f, 0x15, 0xb3,
+ 0x6, 0xfb, 0x1d, 0xf7, 0x24, 0x5, 0xa2, 0x72,
+ 0x7e, 0x94, 0xa, 0xa6, 0x79, 0x97, 0x7d, 0xa,
+ 0x4f, 0x1d, 0x12, 0xb0, 0xe3, 0x4a, 0xe3, 0xf7,
+ 0x1f, 0xdc, 0x13, 0xd4, 0xf7, 0xb3, 0xf7, 0xaa,
+ 0x15, 0xfb, 0x2f, 0x7, 0x5d, 0x61, 0x6e, 0x55,
+ 0x66, 0x6e, 0xaa, 0xba, 0x1e, 0x8d, 0x7, 0xad,
+ 0x96, 0xcd, 0xf7, 0x2b, 0xbd, 0x1e, 0x8c, 0xfb,
+ 0x6b, 0x15, 0x43, 0x90, 0xb5, 0x8a, 0x2f, 0xa,
+ 0x40, 0xa, 0xef, 0xfb, 0x29, 0x1e, 0x13, 0xcc,
+ 0x3e, 0x1d, 0x13, 0xb4, 0xaa, 0xb1, 0x9d, 0xac,
+ 0xa9, 0xba, 0x80, 0x43, 0x1e, 0x58, 0x7, 0xfb,
+ 0x37, 0x4b, 0x34, 0x5f, 0x27, 0x1a, 0x48, 0xbf,
+ 0x66, 0xc1, 0xc2, 0xc0, 0xb3, 0xac, 0xb0, 0x1e,
+ 0xe, 0x81, 0xab, 0xf8, 0xb, 0xca, 0xf7, 0x73,
+ 0x77, 0x1, 0xd0, 0xdf, 0xf7, 0x77, 0xe3, 0x3,
+ 0xf7, 0x2d, 0xd1, 0x15, 0xf7, 0x90, 0x7, 0xc4,
+ 0xcf, 0x9d, 0xab, 0xe6, 0xaf, 0x24, 0x2e, 0x49,
+ 0x7b, 0xfb, 0x5, 0xfb, 0x7, 0x72, 0x44, 0x98,
+ 0xae, 0x1e, 0xf7, 0xc9, 0x4, 0xf7, 0xc2, 0x7,
+ 0x86, 0x8d, 0x6b, 0x1d, 0x6c, 0x6d, 0x1f, 0xfc,
+ 0x91, 0x7, 0x66, 0xf4, 0x70, 0xbd, 0xf7, 0x4d,
+ 0xc6, 0xf7, 0x32, 0xe5, 0xf6, 0x52, 0xf7, 0x7,
+ 0xfb, 0xd, 0x3f, 0x56, 0x51, 0x74, 0x85, 0x1e,
+ 0xe, 0xe2, 0x81, 0xd3, 0xf8, 0x5, 0xa8, 0x1,
+ 0xa4, 0xd8, 0x3, 0xf8, 0x30, 0xf7, 0x27, 0x15,
+ 0x63, 0x1d, 0x93, 0x79, 0x6d, 0x93, 0x1f, 0x5f,
+ 0x97, 0x99, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+ 0xa2, 0x9d, 0x81, 0xaa, 0x6d, 0xa0, 0x1f, 0x9b,
+ 0x72, 0x5b, 0x9a, 0x67, 0x1b, 0xfb, 0x0, 0xfb,
+ 0x8, 0x38, 0xfb, 0x38, 0xfb, 0x32, 0xf6, 0x4a,
+ 0xdb, 0xdc, 0xcc, 0xb6, 0xf7, 0x6, 0xc1, 0x1f,
+ 0xe, 0x81, 0xbf, 0xf8, 0x1a, 0xa7, 0xf7, 0x78,
+ 0x77, 0x1, 0xa6, 0xe1, 0xf7, 0x77, 0xdf, 0x3,
+ 0xf7, 0xe8, 0xf1, 0x15, 0x67, 0x83, 0x64, 0x73,
+ 0x61, 0x1b, 0x49, 0x43, 0xc3, 0xf7, 0x29, 0xf7,
+ 0x1c, 0xcf, 0xbc, 0xc3, 0xba, 0xbc, 0x6b, 0x47,
+ 0x92, 0x1f, 0xfb, 0xe7, 0x4, 0x8f, 0x88, 0xc0,
+ 0x9e, 0xb9, 0x9b, 0xbb, 0x9c, 0x19, 0x9b, 0x7,
+ 0x48, 0x86, 0x8b, 0xa9, 0xb4, 0x1a, 0xf8, 0xc1,
+ 0x7, 0x86, 0x8d, 0x5b, 0x7a, 0x5a, 0x7d, 0x59,
+ 0x6f, 0x1d, 0x93, 0x95, 0x82, 0xa, 0x6c, 0x6d,
+ 0x1f, 0xfb, 0x26, 0x7, 0xa8, 0x6a, 0x6d, 0x99,
+ 0x60, 0x1b, 0xfb, 0x4, 0x2c, 0xfb, 0x7, 0xfb,
+ 0x17, 0xfb, 0x60, 0xf7, 0x23, 0x77, 0xb2, 0xd5,
+ 0xb0, 0xb0, 0xa6, 0x9d, 0x1f, 0x8d, 0x6, 0xe,
+ 0x87, 0x1d, 0xf6, 0xaf, 0x1, 0xae, 0xd0, 0xf7,
+ 0x5b, 0xf1, 0x3, 0x37, 0x1d, 0x58, 0xfb, 0x4d,
+ 0xfb, 0x22, 0xd7, 0x2f, 0x2b, 0xa, 0x3d, 0x1d,
+ 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x36, 0xab, 0xf7,
+ 0x61, 0xa7, 0x1, 0xf2, 0xdf, 0x3, 0x9f, 0x16,
+ 0xf7, 0x98, 0x9a, 0x6, 0x2f, 0x8d, 0x8a, 0xaf,
+ 0xc8, 0x1a, 0xf7, 0xc4, 0xf7, 0xe, 0xab, 0xfb,
+ 0xf, 0xf7, 0x8, 0x7, 0xb0, 0x90, 0xbf, 0xc2,
+ 0xa1, 0x98, 0x7a, 0x79, 0x97, 0x1e, 0x77, 0x98,
+ 0x97, 0x77, 0xa1, 0x1b, 0x9f, 0xa2, 0x98, 0xa8,
+ 0xad, 0x5f, 0xa6, 0x53, 0xfb, 0x48, 0x8b, 0xfb,
+ 0x45, 0x53, 0x1f, 0x38, 0x6b, 0xde, 0xfb, 0xc4,
+ 0x6, 0x3e, 0x7a, 0x78, 0x49, 0x88, 0x1e, 0xe,
+ 0xfb, 0x6e, 0xc4, 0xf7, 0x26, 0xd4, 0xe6, 0xa4,
+ 0xf7, 0x8c, 0xb2, 0x6e, 0xa7, 0x1, 0xa7, 0xd1,
+ 0x6e, 0xde, 0xf7, 0x45, 0xd8, 0xa6, 0xa7, 0x3,
+ 0xf7, 0x27, 0x89, 0x15, 0x6c, 0x66, 0x79, 0x77,
+ 0x6c, 0x1a, 0x6b, 0xa1, 0x64, 0xeb, 0xf7, 0x9,
+ 0xef, 0xb8, 0xbf, 0xb8, 0x5a, 0x8c, 0x41, 0x8e,
+ 0x1e, 0x2d, 0x8e, 0x76, 0x8a, 0x5b, 0x96, 0x8,
+ 0x90, 0xf7, 0xec, 0x15, 0x3b, 0xa6, 0x33, 0xd8,
+ 0xcf, 0x90, 0xcf, 0xbe, 0xbe, 0x7a, 0xe3, 0x36,
+ 0x67, 0x64, 0x75, 0x47, 0x1e, 0x71, 0xfb, 0xe9,
+ 0x15, 0x70, 0x98, 0x71, 0x97, 0xa7, 0x1a, 0x9d,
+ 0x8b, 0x96, 0xe4, 0xdb, 0x1e, 0x4f, 0xa6, 0x6a,
+ 0xb7, 0xc6, 0x1a, 0xf7, 0xf, 0xe3, 0xb7, 0xe0,
+ 0xae, 0xad, 0x83, 0x7c, 0xa6, 0x1e, 0x80, 0x9f,
+ 0x9e, 0x8c, 0x9b, 0x1b, 0xd8, 0x64, 0x38, 0x6,
+ 0x94, 0x74, 0x95, 0x77, 0x5a, 0x1a, 0xfb, 0x0,
+ 0x24, 0x64, 0x53, 0x1e, 0x7e, 0x68, 0x90, 0x85,
+ 0x1b, 0x77, 0x88, 0x63, 0x62, 0x78, 0x1a, 0x74,
+ 0xbc, 0x87, 0xa8, 0x1e, 0xf7, 0x15, 0x85, 0x5,
+ 0xf6, 0x86, 0x99, 0x41, 0x6f, 0x1a, 0xfb, 0x5,
+ 0xfb, 0x3a, 0x53, 0x31, 0x26, 0x3f, 0xb7, 0xc0,
+ 0xb9, 0xba, 0xb1, 0xbe, 0xb1, 0x1e, 0xe, 0xa0,
+ 0x76, 0xf8, 0x2a, 0xc1, 0xf7, 0x73, 0x77, 0x1,
+ 0xd4, 0xdf, 0xf7, 0x4e, 0xdf, 0x3, 0x94, 0x16,
+ 0xf7, 0x6c, 0x9a, 0x6, 0x5a, 0x90, 0x78, 0x9a,
+ 0xd8, 0x1a, 0xf7, 0x7b, 0x7, 0xbb, 0xb4, 0xb2,
+ 0x9a, 0xa8, 0x1b, 0xc2, 0xa1, 0x64, 0x48, 0x1f,
+ 0xfb, 0x50, 0x7, 0x3e, 0x78, 0x7c, 0x5a, 0x86,
+ 0x1e, 0x7c, 0xf7, 0x68, 0x9a, 0x7, 0x59, 0x94,
+ 0x81, 0x9a, 0xd4, 0x1a, 0xf7, 0x51, 0x7, 0xb3,
+ 0x8a, 0xf7, 0xb, 0xfb, 0xf, 0x4f, 0x5a, 0x6b,
+ 0x59, 0x68, 0x1e, 0x89, 0xf7, 0xc2, 0x6, 0x86,
+ 0x8e, 0x5b, 0x7a, 0x59, 0x7d, 0x5e, 0x7e, 0x19,
+ 0x71, 0x7, 0x8c, 0x8e, 0x96, 0x82, 0xa, 0x76,
+ 0x6d, 0x1f, 0xfc, 0x57, 0x7, 0x42, 0x81, 0x7a,
+ 0x55, 0x84, 0x1e, 0xe, 0x8f, 0xa, 0xf8, 0xd9,
+ 0xf1, 0x12, 0xd9, 0xf0, 0x37, 0xdf, 0x13, 0xe0,
+ 0x31, 0x1d, 0x57, 0x78, 0x54, 0x78, 0x57, 0x7a,
+ 0x19, 0x7c, 0x7, 0x8d, 0x98, 0x9c, 0x8d, 0x99,
+ 0x1b, 0x13, 0xd0, 0x9b, 0x9e, 0x80, 0x50, 0x1f,
+ 0xfb, 0x68, 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88,
+ 0x1e, 0x13, 0xe0, 0xc9, 0xf8, 0xfd, 0x64, 0x1d,
+ 0x3c, 0xfb, 0x6e, 0xad, 0xf9, 0x91, 0xf1, 0x12,
+ 0xf3, 0xf0, 0x2b, 0xdf, 0x13, 0xd0, 0xab, 0xf8,
+ 0x1a, 0x15, 0x8d, 0x9a, 0x98, 0x8d, 0x99, 0x1b,
+ 0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfc, 0x5, 0x7,
+ 0x39, 0x8b, 0x52, 0x59, 0x78, 0x80, 0x9b, 0x9b,
+ 0x7e, 0x1e, 0x99, 0x7f, 0x7e, 0x99, 0x76, 0x1b,
+ 0x78, 0x76, 0x7c, 0x74, 0x66, 0xb9, 0x78, 0xba,
+ 0xf7, 0x15, 0xb4, 0xf0, 0xf7, 0x9, 0x1f, 0x8c,
+ 0xf8, 0x5d, 0x85, 0x8e, 0x57, 0x77, 0x57, 0x79,
+ 0x57, 0x7b, 0x19, 0x13, 0xe0, 0xc7, 0xf7, 0x76,
+ 0x64, 0x1d, 0xa0, 0x76, 0xf8, 0x56, 0x77, 0xf7,
+ 0x91, 0x77, 0x1, 0xdd, 0xdf, 0x3, 0x92, 0x16,
+ 0xf7, 0x7e, 0x9a, 0x6, 0x77, 0x8c, 0x5, 0x6a,
+ 0x8d, 0x75, 0x9d, 0xb4, 0x1a, 0xf7, 0x3f, 0x8d,
+ 0x7, 0xf7, 0x1e, 0xfb, 0x4c, 0x5, 0x97, 0x7a,
+ 0x94, 0x82, 0x84, 0x1a, 0x7e, 0x7e, 0x88, 0x83,
+ 0x1e, 0x78, 0x7c, 0xf7, 0x6e, 0x9a, 0x6, 0x70,
+ 0x8d, 0x64, 0x92, 0x58, 0xcb, 0xfb, 0x2d, 0xf7,
+ 0x56, 0x18, 0xa8, 0xa6, 0x5, 0xf7, 0x12, 0xf7,
+ 0x1b, 0xa7, 0x8b, 0xc0, 0x1b, 0x9a, 0xfb, 0x60,
+ 0x7d, 0x7, 0xb5, 0x93, 0x83, 0x80, 0x82, 0x83,
+ 0x80, 0x7c, 0x7d, 0x1f, 0x63, 0x69, 0x50, 0x54,
+ 0x67, 0x6c, 0x89, 0x8d, 0x18, 0xf8, 0x34, 0x7,
+ 0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x5a, 0x6f,
+ 0x1d, 0x93, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91,
+ 0x71, 0x5e, 0x1f, 0xfc, 0x70, 0x7, 0x69, 0x83,
+ 0x79, 0x48, 0x80, 0x1e, 0xe, 0x8f, 0xa, 0xf9,
+ 0x3f, 0x77, 0x1, 0xed, 0xdf, 0x3, 0x9e, 0x16,
+ 0xf7, 0x82, 0x9a, 0x6, 0x51, 0x8e, 0x7a, 0x9d,
+ 0xc5, 0x1a, 0xf8, 0xdf, 0x5d, 0xa, 0xfc, 0x67,
+ 0x7, 0x54, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+ 0x39, 0xa0, 0x76, 0xf8, 0x2c, 0xbf, 0x1, 0xe1,
+ 0xdf, 0xf7, 0x4c, 0xdf, 0xf7, 0x4c, 0xdf, 0x14,
+ 0x38, 0x9b, 0x16, 0xf7, 0x72, 0x9a, 0x6, 0x68,
+ 0x8c, 0x6a, 0x98, 0xcb, 0x1a, 0xf7, 0x94, 0x7,
+ 0x90, 0xb9, 0xc1, 0xd0, 0xbf, 0x9c, 0x64, 0x49,
+ 0x1e, 0xfb, 0x63, 0x7, 0x4a, 0x74, 0x7e, 0x5e,
+ 0x88, 0x1e, 0x7c, 0xf7, 0x74, 0x9a, 0x7, 0x62,
+ 0x8c, 0x6c, 0x9c, 0xca, 0x1a, 0xf7, 0x8f, 0x7,
+ 0xad, 0xa1, 0xad, 0xa6, 0xc2, 0x1b, 0xd3, 0x8c,
+ 0x50, 0x58, 0x1f, 0xfb, 0x5d, 0x7, 0x4b, 0x7b,
+ 0x7f, 0x59, 0x85, 0x1e, 0x7c, 0xf7, 0x6f, 0x9a,
+ 0x7, 0x71, 0x8d, 0x5, 0x5f, 0x92, 0x8c, 0xac,
+ 0xb3, 0x1a, 0xf7, 0x4d, 0x7, 0xd5, 0x7d, 0xf3,
+ 0x23, 0x3c, 0x4e, 0x4f, 0x73, 0x76, 0x1e, 0xb5,
+ 0x80, 0x6c, 0xb5, 0x4a, 0x1b, 0x55, 0x62, 0x6b,
+ 0x5e, 0x50, 0x1f, 0xd6, 0x7, 0x84, 0x8d, 0x5d,
+ 0x7a, 0x59, 0x7c, 0x5c, 0x7e, 0x19, 0x7a, 0x7,
+ 0x8d, 0x93, 0x98, 0x53, 0x1d, 0x4c, 0x1f, 0xfb,
+ 0x87, 0x7, 0x48, 0x6d, 0x7f, 0x63, 0x8a, 0x1e,
+ 0xe, 0xa0, 0x76, 0xf8, 0x2a, 0xc2, 0x73, 0xa,
+ 0xa5, 0xbe, 0x1a, 0xf7, 0x91, 0x7e, 0xa, 0xfb,
+ 0x6e, 0x7, 0x50, 0x71, 0x7e, 0x82, 0x1d, 0xa4,
+ 0xba, 0x1a, 0xf7, 0x6f, 0x46, 0xa, 0xe, 0x7f,
+ 0xa7, 0xf8, 0x35, 0xa7, 0x1, 0xb8, 0xe5, 0xf7,
+ 0x82, 0xe5, 0x3, 0xa8, 0xf7, 0x7a, 0x15, 0xfb,
+ 0x1b, 0xe5, 0x22, 0x65, 0x1d, 0xf7, 0x1d, 0xee,
+ 0xf7, 0x25, 0x2d, 0xe4, 0xfb, 0x17, 0xfb, 0x1a,
+ 0x39, 0x20, 0xfb, 0xf, 0x1e, 0xe5, 0xa0, 0x15,
+ 0xf3, 0xca, 0xd8, 0xca, 0xe7, 0xb6, 0x37, 0x80,
+ 0xa, 0x39, 0x4c, 0x58, 0xfb, 0xc, 0x83, 0xf7,
+ 0x33, 0xd5, 0x1e, 0xe, 0x8e, 0x1d, 0x1, 0xd6,
+ 0xdf, 0xf7, 0x75, 0xe1, 0x3, 0xf7, 0x33, 0xac,
+ 0x15, 0x5f, 0x1d, 0x76, 0x1f, 0x89, 0x8d, 0x5,
+ 0xd4, 0x7, 0x85, 0x8d, 0x5b, 0x78, 0x5b, 0x7a,
+ 0x5b, 0x7c, 0x19, 0x7b, 0x7, 0x8c, 0x94, 0x95,
+ 0x8b, 0x94, 0x1b, 0xae, 0x8e, 0x7a, 0x63, 0x1f,
+ 0xfc, 0x5e, 0x7, 0x60, 0x87, 0x6c, 0x49, 0x86,
+ 0x1e, 0x7a, 0xf7, 0x86, 0x9d, 0x7, 0x43, 0x7b,
+ 0xa1, 0xc5, 0x1f, 0xf7, 0x63, 0x4, 0x5a, 0xa,
+ 0xfb, 0x58, 0x76, 0xf7, 0x63, 0xc8, 0xf8, 0x11,
+ 0xa7, 0x1, 0xa3, 0xe1, 0xf7, 0x7b, 0xdf, 0x3,
+ 0xf7, 0x90, 0xfb, 0x5c, 0x15, 0x7a, 0xf7, 0x80,
+ 0x99, 0x7, 0x5e, 0x95, 0x79, 0x9b, 0xc7, 0x1a,
+ 0xf8, 0xd1, 0x7, 0x84, 0x8f, 0x51, 0x68, 0x5,
+ 0xa1, 0x64, 0x74, 0x98, 0x58, 0x1b, 0xfb, 0x11,
+ 0x29, 0xfb, 0x2, 0xfb, 0x1e, 0xfb, 0x2b, 0xd6,
+ 0x44, 0xe4, 0xc8, 0xd1, 0xb5, 0xa9, 0x9c, 0x1f,
+ 0x90, 0xfb, 0x44, 0x6, 0x59, 0x7d, 0x6a, 0x40,
+ 0x88, 0x1e, 0xe4, 0xf7, 0xdb, 0x15, 0x8a, 0x6b,
+ 0x8b, 0x7b, 0x57, 0x78, 0x8, 0x84, 0x79, 0x7a,
+ 0x89, 0x7c, 0x1b, 0x32, 0x64, 0xea, 0xe7, 0xf7,
+ 0xd, 0xc1, 0xd4, 0xdc, 0xea, 0x8c, 0x44, 0x6f,
+ 0x1f, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x21, 0xca,
+ 0x55, 0xc1, 0x12, 0xd7, 0xdf, 0x13, 0xd0, 0x90,
+ 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x58, 0x8d, 0x69,
+ 0x99, 0xd0, 0x1a, 0xf7, 0x6b, 0x7, 0xab, 0xb7,
+ 0xbd, 0xa3, 0x98, 0x94, 0x81, 0x82, 0x95, 0x1e,
+ 0x83, 0x95, 0x95, 0x83, 0x9c, 0x1b, 0x13, 0xb0,
+ 0xa3, 0x99, 0x9e, 0xa4, 0xac, 0x77, 0xa0, 0x69,
+ 0x65, 0x69, 0x77, 0x44, 0x5c, 0x1f, 0x89, 0xe4,
+ 0x6, 0x86, 0x8d, 0x5a, 0x77, 0x59, 0x79, 0x5a,
+ 0x7b, 0x19, 0x7b, 0x7, 0x8d, 0x94, 0x96, 0x53,
+ 0x1d, 0x50, 0x1f, 0xfb, 0x7e, 0x7, 0x4b, 0x7b,
+ 0x80, 0x54, 0x81, 0x1e, 0xe, 0xab, 0x7d, 0xa1,
+ 0xf8, 0x3c, 0xa2, 0x87, 0x77, 0x12, 0xc9, 0xc9,
+ 0xf7, 0x2e, 0xd1, 0x57, 0x9a, 0x13, 0xd8, 0xbe,
+ 0x81, 0x15, 0x99, 0x91, 0x5, 0x94, 0x91, 0x99,
+ 0x8e, 0x97, 0x1b, 0x9c, 0x8c, 0x9d, 0x84, 0xa1,
+ 0x86, 0x8, 0x87, 0x9a, 0x9b, 0x88, 0x9d, 0x1b,
+ 0xcb, 0xdc, 0xb5, 0xe2, 0xc7, 0x68, 0x66, 0xa,
+ 0x1e, 0x13, 0xd4, 0xb7, 0xb4, 0x76, 0x25, 0xa1,
+ 0x1f, 0x9a, 0x6, 0x13, 0xb4, 0xf7, 0x1d, 0x80,
+ 0x7, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b, 0x81,
+ 0x80, 0x91, 0x91, 0x7b, 0x1f, 0x8f, 0x7f, 0x7d,
+ 0x7c, 0x1d, 0xc5, 0x6a, 0x5, 0x13, 0xd8, 0xab,
+ 0x79, 0x9f, 0x73, 0x6b, 0x1a, 0x52, 0x5c, 0x95,
+ 0xa, 0x7a, 0x6, 0xe, 0x3c, 0x81, 0xbf, 0xf8,
+ 0x2, 0xab, 0x1, 0xd1, 0xdf, 0x3, 0xf7, 0x9e,
+ 0xd8, 0x15, 0x7e, 0x80, 0x79, 0x75, 0x6b, 0x1b,
+ 0x58, 0x8b, 0xc6, 0xaa, 0x1f, 0xf7, 0xa8, 0xf0,
+ 0xab, 0x26, 0xf7, 0x12, 0x7, 0x93, 0x8b, 0x90,
+ 0x84, 0x1e, 0x66, 0x56, 0x7c, 0x6b, 0x65, 0x64,
+ 0x8, 0x75, 0x75, 0x75, 0x85, 0x7f, 0x1a, 0x88,
+ 0x8d, 0x88, 0x8d, 0x8a, 0x1e, 0xc0, 0xfb, 0xb7,
+ 0x6, 0x27, 0xb4, 0x70, 0xbe, 0xb9, 0xba, 0xac,
+ 0xb6, 0xa3, 0x1e, 0xe, 0x81, 0xc7, 0xf8, 0x24,
+ 0x90, 0xa, 0xf7, 0xe6, 0x84, 0x15, 0x8d, 0x89,
+ 0xba, 0x9c, 0xb1, 0x99, 0xc1, 0x99, 0x19, 0x32,
+ 0xa, 0xfb, 0x75, 0x52, 0xa, 0x7d, 0x2c, 0x1d,
+ 0x9d, 0xbb, 0x8f, 0xb2, 0xb2, 0x1e, 0xb6, 0xb6,
+ 0x5, 0xe, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x1,
+ 0x9e, 0xf8, 0x47, 0x15, 0x9f, 0x8a, 0x9f, 0x7b,
+ 0x9a, 0x6d, 0xaf, 0x44, 0xeb, 0xfb, 0x72, 0xa3,
+ 0x4d, 0x8, 0x60, 0x9b, 0x8d, 0x87, 0x94, 0x1b,
+ 0x92, 0x94, 0xa2, 0xa6, 0x96, 0x1f, 0xf7, 0x14,
+ 0xf7, 0xcb, 0xa3, 0xc6, 0x92, 0xa5, 0xad, 0x8e,
+ 0x19, 0x9a, 0xfb, 0x1f, 0x7c, 0x7, 0xa4, 0x8a,
+ 0xa1, 0x78, 0x74, 0x1a, 0x67, 0x44, 0xfb, 0x26,
+ 0x69, 0x2b, 0x1e, 0x25, 0xf7, 0x8a, 0x5, 0x88,
+ 0x93, 0x85, 0x9a, 0x97, 0x1a, 0xa4, 0xa1, 0x98,
+ 0xa3, 0x8d, 0x1e, 0x9a, 0xfb, 0x58, 0x7, 0xe,
+ 0xf8, 0x1, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x12,
+ 0xa0, 0xf7, 0x48, 0xf8, 0x6, 0xf7, 0xf, 0x17,
+ 0xa0, 0xf8, 0x47, 0x15, 0xa4, 0x89, 0x93, 0x74,
+ 0x9f, 0x5b, 0xf7, 0x1b, 0xfb, 0xe0, 0x18, 0x69,
+ 0x99, 0x90, 0x81, 0x92, 0x1b, 0x91, 0x90, 0x96,
+ 0xa7, 0x99, 0x1f, 0xf7, 0x4, 0xf7, 0x84, 0xe6,
+ 0xfb, 0x80, 0x5, 0x67, 0x99, 0x8d, 0x84, 0x93,
+ 0x1b, 0x93, 0x8f, 0x95, 0xb2, 0x9b, 0x1f, 0xf7,
+ 0x1e, 0xf7, 0xe4, 0x9a, 0xb0, 0x90, 0x9f, 0xa0,
+ 0x92, 0x19, 0x13, 0x70, 0x9a, 0xfb, 0xf, 0x7c,
+ 0x7, 0xa3, 0x86, 0x9f, 0x7d, 0x73, 0x1a, 0x7f,
+ 0x85, 0x70, 0x80, 0x72, 0x1e, 0x31, 0xfb, 0x68,
+ 0x3b, 0xf7, 0x6a, 0x5, 0x7c, 0xb2, 0x85, 0x8c,
+ 0x9d, 0x1a, 0xa8, 0xa4, 0x98, 0xac, 0x90, 0x1e,
+ 0x9a, 0xfb, 0x5f, 0x7c, 0x7, 0xb4, 0x86, 0x96,
+ 0x84, 0xb0, 0xfb, 0x5, 0x30, 0xfb, 0x5b, 0x18,
+ 0x5d, 0xf7, 0x14, 0x50, 0xf7, 0x9, 0xae, 0x1a,
+ 0xa7, 0xa2, 0x99, 0xa2, 0x8d, 0x1e, 0x9a, 0xfb,
+ 0x48, 0x7, 0xe, 0xa0, 0x76, 0xf8, 0x59, 0x77,
+ 0x12, 0x9c, 0xf7, 0x25, 0xf7, 0x8, 0xf7, 0x5d,
+ 0x17, 0x9c, 0x16, 0xf7, 0x25, 0x9a, 0x6, 0x7a,
+ 0x76, 0x95, 0x9d, 0x89, 0x1f, 0x96, 0x99, 0xa0,
+ 0x91, 0x94, 0x1e, 0x13, 0xf0, 0xda, 0xf7, 0x5,
+ 0xdc, 0xfb, 0x6, 0x5, 0x8f, 0x86, 0x97, 0x7f,
+ 0x7c, 0x1a, 0x76, 0x82, 0x7d, 0x6c, 0x8a, 0x1e,
+ 0x7c, 0xf7, 0x5d, 0x9a, 0x7, 0x7a, 0x8c, 0x70,
+ 0x96, 0x65, 0xc5, 0xfb, 0x14, 0xf7, 0x4e, 0x18,
+ 0xde, 0xf7, 0x2, 0x93, 0x98, 0xa9, 0xb3, 0xb6,
+ 0x8c, 0x19, 0x9a, 0xfb, 0x32, 0x7c, 0x7, 0x9c,
+ 0x8a, 0xa2, 0x80, 0x76, 0x1a, 0x80, 0x85, 0x82,
+ 0x4e, 0x33, 0x1e, 0x78, 0xa8, 0x62, 0xc8, 0x9d,
+ 0x1a, 0xa0, 0xa4, 0x97, 0x9d, 0x1e, 0x9a, 0xfb,
+ 0x63, 0x7c, 0x7, 0xac, 0x8c, 0x97, 0x81, 0xb4,
+ 0x4e, 0xe9, 0xfb, 0x1a, 0x18, 0xfb, 0x6, 0xfb,
+ 0x2f, 0x6b, 0x5d, 0x7d, 0x7f, 0x70, 0x88, 0x19,
+ 0xe, 0x96, 0xa, 0xf8, 0xca, 0x77, 0x12, 0x13,
+ 0xa0, 0xf7, 0x86, 0xa1, 0x15, 0x68, 0x85, 0x68,
+ 0xfb, 0xd, 0x57, 0x1b, 0x13, 0x60, 0x45, 0xa,
+ 0x9b, 0xb4, 0x9e, 0x4a, 0xa, 0x3d, 0xfb, 0x68,
+ 0x3b, 0xa, 0x8, 0xe, 0xe2, 0x61, 0xa9, 0xf8,
+ 0x46, 0xa9, 0x6a, 0xa, 0x7b, 0x6c, 0x21, 0x1b,
+ 0xfb, 0x14, 0x56, 0x1d, 0xe, 0x92, 0xa, 0x12,
+ 0xf7, 0x47, 0xd5, 0x47, 0xd5, 0x13, 0xe0, 0xef,
+ 0xf7, 0x8e, 0x15, 0x13, 0xd0, 0xd0, 0x78, 0x9b,
+ 0x5f, 0x4b, 0x98, 0xa, 0xfb, 0xc, 0xc9, 0x77,
+ 0xf2, 0x1e, 0x96, 0x7, 0x44, 0x9b, 0x77, 0xb5,
+ 0xd0, 0x1a, 0xf7, 0x38, 0x7, 0xd2, 0x7e, 0xb2,
+ 0x3d, 0x9c, 0x1e, 0x8d, 0x7, 0xd9, 0x9d, 0x98,
+ 0xb2, 0xd2, 0x1a, 0xf7, 0x38, 0x7, 0xd0, 0x9f,
+ 0xb5, 0xd2, 0x9b, 0x1e, 0x96, 0x7, 0x24, 0x4d,
+ 0x77, 0xfb, 0xb, 0x1f, 0xfb, 0x3b, 0x7, 0x4b,
+ 0x7b, 0x61, 0x46, 0x79, 0x1e, 0xe, 0xfb, 0x31,
+ 0xfb, 0x2a, 0x76, 0xf7, 0x46, 0x7a, 0x1d, 0xce,
+ 0xcd, 0x55, 0xb4, 0x3, 0xda, 0xfb, 0x3f, 0x15,
+ 0xb4, 0xf9, 0xe3, 0x62, 0x6, 0xe, 0x92, 0xa,
+ 0x1, 0xf7, 0x70, 0xd5, 0x3, 0xf7, 0x16, 0xfb,
+ 0x3e, 0x15, 0x80, 0x7, 0xf2, 0xc8, 0x9f, 0xf7,
+ 0xc, 0x1f, 0xf7, 0x38, 0x7, 0xcb, 0x9c, 0xb7,
+ 0xd0, 0x9e, 0x1e, 0x46, 0x9d, 0x7a, 0xb5, 0xcb,
+ 0x1a, 0xf7, 0x3b, 0x7, 0xf7, 0xb, 0x4e, 0x9f,
+ 0x24, 0x1e, 0x80, 0x7, 0xd2, 0x7b, 0x9e, 0x61,
+ 0x46, 0x98, 0xa, 0x44, 0x98, 0x64, 0xd9, 0x79,
+ 0x1e, 0x89, 0x7, 0x3d, 0x7a, 0x7e, 0x64, 0x44,
+ 0x98, 0xa, 0x46, 0x78, 0x61, 0x44, 0x7b, 0x1e,
+ 0xe, 0xf7, 0x4c, 0xf7, 0x4b, 0xcb, 0x97, 0xcb,
+ 0x1, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3,
+ 0xb4, 0xb7, 0x1b, 0xba, 0xa7, 0x79, 0x79, 0xa6,
+ 0x1f, 0x77, 0xa8, 0xa9, 0x77, 0xc3, 0x1b, 0xc9,
+ 0xac, 0xbb, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, 0x5,
+ 0x68, 0x74, 0x72, 0x62, 0x63, 0x1b, 0x6d, 0x6e,
+ 0x9e, 0x9e, 0x69, 0x1f, 0x9e, 0x69, 0x64, 0x9e,
+ 0x5c, 0x1b, 0x48, 0x67, 0x5b, 0x61, 0x75, 0x1f,
+ 0xe, 0x73, 0xfb, 0x59, 0x76, 0xf8, 0xd5, 0xf7,
+ 0x0, 0x1, 0xec, 0xf7, 0x0, 0x3, 0xf7, 0x23,
+ 0xf7, 0xac, 0x15, 0x98, 0x6, 0xa5, 0xfb, 0x5d,
+ 0xa2, 0xfb, 0x48, 0x73, 0x1a, 0x5a, 0x7f, 0x5f,
+ 0x5f, 0x61, 0x81, 0xb2, 0xbf, 0xa4, 0xa0, 0xf7,
+ 0x49, 0xa4, 0xf7, 0x5d, 0x1e, 0x5d, 0xf7, 0x19,
+ 0x15, 0x6d, 0xa3, 0x73, 0xa9, 0xa9, 0xa3, 0xa3,
+ 0xa9, 0xa9, 0x73, 0xa3, 0x6d, 0x6d, 0x73, 0x73,
+ 0x6d, 0x1e, 0xe, 0x87, 0xd4, 0x52, 0xbf, 0xf7,
+ 0xfc, 0xa9, 0x73, 0xa9, 0x12, 0xca, 0xd8, 0x13,
+ 0xa8, 0xf7, 0xa, 0xfb, 0x1e, 0x15, 0xad, 0x6,
+ 0xbc, 0xf7, 0x1e, 0x5, 0x86, 0x9d, 0x99, 0x87,
+ 0xa1, 0x1b, 0xe2, 0xc6, 0xc8, 0xf3, 0xba, 0x1f,
+ 0x7e, 0x93, 0x5, 0x13, 0x68, 0x45, 0x5d, 0x62,
+ 0x6d, 0x4d, 0x1b, 0x74, 0x7c, 0x90, 0x92, 0x78,
+ 0x1f, 0xf0, 0xf7, 0xb7, 0x5, 0x67, 0x9b, 0x9a,
+ 0x7b, 0xa8, 0x1b, 0xa2, 0x9d, 0x9e, 0xa5, 0xad,
+ 0x6b, 0xaf, 0x60, 0x99, 0x1f, 0xba, 0xf7, 0x1b,
+ 0x5, 0x68, 0x6, 0x5f, 0xfb, 0x10, 0x5, 0x13,
+ 0x98, 0x8e, 0x78, 0x7b, 0x8d, 0x7b, 0x1b, 0xfb,
+ 0x19, 0x34, 0xfb, 0x7, 0xfb, 0xe, 0x1f, 0x13,
+ 0x68, 0x3f, 0xac, 0x3c, 0xde, 0x53, 0x1e, 0xa8,
+ 0xe1, 0x15, 0x5c, 0xb1, 0x76, 0xbf, 0xce, 0x1a,
+ 0x13, 0x98, 0xf7, 0x19, 0xde, 0xb5, 0xbf, 0xa1,
+ 0x98, 0x87, 0x86, 0x98, 0x1e, 0xe, 0x83, 0xa7,
+ 0x6f, 0xdf, 0x37, 0xf7, 0x1e, 0xf7, 0x5a, 0xb8,
+ 0xf7, 0x31, 0xf7, 0x26, 0x70, 0xa6, 0x12, 0xf7,
+ 0xf, 0xe0, 0xf7, 0x2b, 0xe4, 0x13, 0x57, 0xf7,
+ 0x46, 0xc1, 0x15, 0x6c, 0xb7, 0xba, 0x6c, 0xbe,
+ 0x1b, 0xd7, 0xe9, 0xda, 0xcc, 0x90, 0x88, 0x8b,
+ 0x88, 0x1f, 0x76, 0x75, 0x4a, 0x2f, 0x1b, 0x6b,
+ 0x53, 0x92, 0xa7, 0x4d, 0x1f, 0xa2, 0xed, 0x8e,
+ 0xac, 0x89, 0xc6, 0x8a, 0xa6, 0x18, 0xf7, 0x18,
+ 0xb8, 0xfb, 0x1b, 0x6, 0x84, 0xc4, 0x87, 0xab,
+ 0xbe, 0x1a, 0xae, 0x93, 0xf0, 0xe2, 0x97, 0xb7,
+ 0x8b, 0x57, 0x1e, 0x13, 0x3b, 0x6a, 0x8b, 0x69,
+ 0xb3, 0xa4, 0xa3, 0x9e, 0xad, 0xb9, 0x5d, 0xba,
+ 0x37, 0x22, 0x31, 0x42, 0xfb, 0x37, 0x6b, 0x8e,
+ 0x7d, 0x8f, 0x76, 0x1e, 0x20, 0x5e, 0xf7, 0x0,
+ 0x6, 0x90, 0x60, 0x90, 0x69, 0x8f, 0x6e, 0x90,
+ 0x64, 0x8f, 0x6d, 0x86, 0x6f, 0x8, 0x8f, 0x7d,
+ 0x7d, 0x8c, 0x7d, 0x1b, 0x59, 0x5e, 0x72, 0x57,
+ 0x60, 0xae, 0x79, 0xab, 0xb9, 0xa5, 0xa9, 0xab,
+ 0xa6, 0x1f, 0xfb, 0x20, 0x8d, 0x15, 0xa8, 0xab,
+ 0x94, 0xa7, 0xa2, 0xa0, 0x83, 0x82, 0x1e, 0x13,
+ 0x9b, 0x81, 0x7b, 0x5c, 0x5b, 0x75, 0x79, 0x9a,
+ 0xa0, 0x1e, 0xe, 0xf7, 0x1d, 0xc4, 0xf7, 0xa4,
+ 0xc4, 0x12, 0xaf, 0xce, 0x5d, 0xc8, 0xf7, 0x9c,
+ 0xc8, 0x5d, 0xce, 0x13, 0xd4, 0xf7, 0xa, 0xf7,
+ 0xdf, 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0x1e, 0x13,
+ 0xe8, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, 0x4c,
+ 0x40, 0x1f, 0x13, 0xd4, 0x3f, 0x52, 0xca, 0xd5,
+ 0x1f, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3, 0x5,
+ 0x74, 0xa5, 0xb6, 0x7e, 0xb6, 0x1b, 0xb7, 0xb7,
+ 0x97, 0xa3, 0xa5, 0x1f, 0xe4, 0x33, 0xb6, 0xb8,
+ 0x34, 0xe2, 0x5, 0x13, 0xe8, 0xa4, 0xa7, 0x95,
+ 0xbb, 0xb9, 0x1a, 0xb3, 0x7e, 0xb2, 0x75, 0xa4,
+ 0x1e, 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5,
+ 0xa3, 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f,
+ 0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60,
+ 0xe3, 0x32, 0x5, 0x13, 0xd4, 0x74, 0x72, 0x7e,
+ 0x62, 0x60, 0x1a, 0x5e, 0x96, 0x5e, 0xa4, 0x70,
+ 0x1e, 0x33, 0x34, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+ 0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xca, 0x77, 0x1,
+ 0xf7, 0x52, 0xe0, 0x3, 0xf7, 0x3, 0x16, 0xf7,
+ 0x88, 0x9e, 0x6, 0x52, 0x8c, 0x74, 0xa3, 0xd6,
+ 0x1a, 0xca, 0xf7, 0x41, 0xb3, 0xfb, 0x41, 0xd7,
+ 0x7, 0x92, 0x99, 0x5, 0xf7, 0x3a, 0xb3, 0xfb,
+ 0x26, 0x6, 0xe7, 0xf7, 0x42, 0xad, 0xce, 0xaf,
+ 0xb4, 0xbb, 0x94, 0x19, 0x9e, 0xfb, 0x57, 0x78,
+ 0x7, 0xae, 0x8e, 0xa9, 0x77, 0x73, 0x1a, 0x7b,
+ 0x85, 0x7e, 0x83, 0x7c, 0x1e, 0xfb, 0x4, 0xfb,
+ 0x66, 0xfb, 0xa, 0xf7, 0x67, 0x5, 0x83, 0x9a,
+ 0x86, 0x9c, 0x97, 0x1a, 0xa0, 0x9d, 0x9f, 0xba,
+ 0x8a, 0x1e, 0x9e, 0xfb, 0x87, 0x78, 0x7, 0xbe,
+ 0x8a, 0xa0, 0x5f, 0xb9, 0x38, 0xea, 0xfb, 0x37,
+ 0x18, 0xfb, 0x24, 0x63, 0xf7, 0x3b, 0x6, 0x92,
+ 0x7d, 0x5, 0x3f, 0xfb, 0x42, 0x63, 0xf7, 0x42,
+ 0x4e, 0x7, 0x53, 0x83, 0x5f, 0x44, 0x89, 0x1e,
+ 0xe, 0xfb, 0x31, 0x92, 0x7a, 0x1d, 0xd9, 0xb7,
+ 0x3, 0xd9, 0xf8, 0x1d, 0x15, 0xb7, 0xf7, 0xaf,
+ 0x5f, 0x6, 0xfd, 0x46, 0x4, 0xb7, 0xf7, 0xa9,
+ 0x5f, 0x6, 0xe, 0xfb, 0x29, 0xa0, 0xf7, 0x74,
+ 0xa0, 0xf8, 0xd0, 0x77, 0x12, 0xcb, 0xc0, 0xf7,
+ 0x67, 0xed, 0x2b, 0xc3, 0x13, 0xf8, 0xf7, 0xbc,
+ 0xf7, 0x11, 0x15, 0xe1, 0x83, 0xb7, 0xca, 0xce,
+ 0x1a, 0xc6, 0x62, 0xc1, 0x5b, 0xb3, 0x1e, 0xfb,
+ 0x1d, 0xf7, 0x5, 0x5, 0x72, 0xa0, 0x82, 0xaa,
+ 0x9f, 0x1a, 0xa2, 0x9e, 0xba, 0xc7, 0xb9, 0xa1,
+ 0x72, 0x79, 0x87, 0x7f, 0x84, 0x81, 0x7f, 0x1e,
+ 0x85, 0x83, 0x85, 0x81, 0x7e, 0x1a, 0x7d, 0x94,
+ 0x6e, 0xb1, 0xae, 0x9b, 0xa3, 0xa9, 0x1e, 0x13,
+ 0xf4, 0xc5, 0x4e, 0xbc, 0x4b, 0x42, 0x46, 0x65,
+ 0x37, 0x48, 0xb5, 0x68, 0xc2, 0x5d, 0x1e, 0x89,
+ 0x89, 0x5, 0x38, 0x95, 0x57, 0x51, 0x41, 0x1a,
+ 0x5a, 0xa8, 0x51, 0xd0, 0x56, 0x1e, 0xf7, 0x26,
+ 0xfb, 0x4, 0x9b, 0x7b, 0x61, 0x1a, 0x59, 0x68,
+ 0x6e, 0x5a, 0x54, 0x78, 0xad, 0x96, 0x1e, 0x98,
+ 0xad, 0x95, 0xad, 0x1a, 0x9c, 0x7c, 0xa3, 0x6a,
+ 0x71, 0x6f, 0x79, 0x67, 0x52, 0xc8, 0x56, 0xda,
+ 0xec, 0xb8, 0xca, 0xca, 0xc3, 0x71, 0xac, 0x49,
+ 0xc3, 0x1e, 0xfb, 0x3f, 0xf7, 0x56, 0x15, 0xbb,
+ 0xb2, 0x9d, 0xa9, 0xc2, 0xf7, 0x13, 0xfb, 0x0,
+ 0x50, 0x5f, 0x69, 0x71, 0x66, 0x4c, 0xfb, 0x9,
+ 0xed, 0xd4, 0x1e, 0xe, 0x73, 0xf8, 0x9f, 0xef,
+ 0x1, 0x9d, 0xed, 0xf0, 0xed, 0x3, 0x9d, 0xf8,
+ 0xd1, 0x15, 0x6e, 0x1d, 0xf7, 0x5b, 0x16, 0x6e,
+ 0x1d, 0xe, 0xf8, 0x27, 0x7d, 0xb5, 0xf7, 0x2e,
+ 0x9f, 0xf7, 0x9f, 0x9f, 0xf7, 0x25, 0xb5, 0x1,
+ 0xb1, 0xc2, 0xf1, 0xd8, 0xf7, 0x97, 0x9b, 0xf7,
+ 0xc, 0xc2, 0x3, 0xb1, 0xf7, 0xde, 0x3e, 0xa,
+ 0x69, 0xa, 0xf8, 0x4a, 0x38, 0x15, 0x5d, 0x77,
+ 0x68, 0x63, 0x49, 0x1b, 0x25, 0x61, 0xd8, 0xf4,
+ 0x8c, 0x1f, 0xec, 0x8c, 0xb6, 0xd3, 0xe8, 0x1b,
+ 0xd9, 0xa7, 0x52, 0x61, 0x8f, 0x1f, 0x9c, 0xdb,
+ 0x6, 0xa9, 0x36, 0x94, 0x64, 0xfb, 0x2c, 0x4a,
+ 0xfb, 0x2, 0x38, 0xfb, 0x21, 0xea, 0x52, 0xf7,
+ 0x7, 0xcc, 0xb0, 0x95, 0xa5, 0xa8, 0x1e, 0x9b,
+ 0xd1, 0x5, 0xe, 0x3a, 0xf8, 0x33, 0x76, 0xf7,
+ 0x92, 0xa7, 0x12, 0x9b, 0xca, 0xd9, 0xd3, 0x17,
+ 0xf7, 0x32, 0xf8, 0xbb, 0x15, 0x48, 0x7, 0x8a,
+ 0x85, 0x8b, 0x84, 0x81, 0x82, 0x8, 0x88, 0x85,
+ 0x77, 0x79, 0x7d, 0x1b, 0x73, 0x7b, 0x9d, 0xa8,
+ 0x9e, 0xa2, 0xa1, 0xcf, 0xa1, 0x1f, 0x93, 0x24,
+ 0x15, 0x5f, 0x92, 0xa6, 0x81, 0x97, 0x1b, 0x96,
+ 0x9f, 0x8c, 0xa8, 0xa6, 0x1f, 0x9d, 0x7, 0x85,
+ 0x84, 0x82, 0x85, 0x7f, 0x1b, 0x7e, 0x8b, 0x97,
+ 0xa2, 0x1f, 0xf7, 0x7, 0x7, 0xac, 0x84, 0xca,
+ 0x2a, 0x40, 0x69, 0x68, 0x6b, 0x7d, 0x96, 0x7a,
+ 0x9f, 0x9f, 0x97, 0x98, 0x98, 0xa5, 0x89, 0x9d,
+ 0xb8, 0xa2, 0x97, 0x7a, 0x54, 0x1e, 0x2d, 0x69,
+ 0x50, 0x76, 0x4f, 0x1a, 0x13, 0x80, 0x5e, 0xb0,
+ 0x75, 0xae, 0xae, 0xae, 0x9f, 0xad, 0x9f, 0x1e,
+ 0xe, 0x79, 0xa, 0xb5, 0xf7, 0x77, 0x50, 0xa,
+ 0xa4, 0xaf, 0x92, 0x1a, 0x92, 0x89, 0x8f, 0x83,
+ 0x1e, 0x78, 0xfb, 0x51, 0x50, 0xa, 0xa5, 0xaf,
+ 0x92, 0x96, 0x1d, 0xf7, 0x63, 0xf7, 0x15, 0x76,
+ 0xf7, 0x68, 0xcd, 0x63, 0xb3, 0x12, 0xf8, 0x68,
+ 0xcd, 0x5e, 0xb8, 0x13, 0xd0, 0x13, 0xa8, 0xa9,
+ 0xf7, 0xee, 0x15, 0xf8, 0x5f, 0xfb, 0x82, 0xb8,
+ 0xf7, 0xaa, 0xfc, 0x8c, 0x6, 0xe, 0xf8, 0x27,
+ 0x7d, 0xb5, 0x7d, 0xf7, 0x49, 0xf7, 0xcd, 0xf7,
+ 0x43, 0x12, 0xb1, 0xc2, 0xf7, 0x43, 0xcb, 0xf7,
+ 0x4, 0xce, 0xf7, 0x30, 0xc2, 0x13, 0x7e, 0xf7,
+ 0x6f, 0xf7, 0x2c, 0x15, 0xf7, 0x36, 0x9a, 0x6,
+ 0x59, 0x90, 0x8c, 0x95, 0xb6, 0x1a, 0xda, 0xbb,
+ 0x7, 0x2d, 0xcb, 0xa4, 0x51, 0xab, 0x1b, 0xcb,
+ 0x93, 0x6, 0x78, 0x9a, 0x6c, 0xad, 0x71, 0xaf,
+ 0x52, 0xd0, 0x18, 0xb8, 0x9a, 0xad, 0xb1, 0xbf,
+ 0x1a, 0xca, 0x53, 0xb1, 0x50, 0x1e, 0xfb, 0x45,
+ 0x7c, 0x6, 0xa1, 0x87, 0xa6, 0x8b, 0x70, 0x1a,
+ 0xfb, 0x8d, 0x7, 0x60, 0x8c, 0x81, 0x59, 0x86,
+ 0x1e, 0xf7, 0x5, 0xf7, 0x30, 0x15, 0xf7, 0x46,
+ 0xb4, 0x7, 0xb2, 0xab, 0x6d, 0x52, 0x56, 0x77,
+ 0x65, 0x5a, 0x1f, 0xfb, 0xe5, 0x92, 0x3e, 0xa,
+ 0x1e, 0x13, 0xbe, 0x69, 0xa, 0xe, 0x73, 0xf8,
+ 0xb7, 0xc1, 0x1, 0x96, 0xf8, 0xb7, 0x15, 0xf7,
+ 0xcb, 0xc1, 0xfb, 0xcb, 0x6, 0xe, 0xb6, 0xf8,
+ 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xc4, 0xb2,
+ 0xf7, 0x64, 0xb2, 0x3, 0xeb, 0xf8, 0xa9, 0x15,
+ 0xc5, 0xb9, 0xbe, 0xc5, 0xc5, 0xb9, 0x58, 0x51,
+ 0x51, 0x5d, 0x58, 0x51, 0x51, 0x5d, 0xbe, 0xc5,
+ 0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb,
+ 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca, 0x3b, 0x3b,
+ 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0xf7, 0x63, 0x8b,
+ 0xcd, 0xc3, 0x77, 0xf7, 0x48, 0xcd, 0x54, 0xb6,
+ 0xf7, 0x3e, 0x77, 0x12, 0xf7, 0x8d, 0xcd, 0x55,
+ 0xb3, 0x13, 0xec, 0xa9, 0x16, 0xf8, 0x8c, 0xb5,
+ 0xfc, 0x8c, 0x6, 0x13, 0xea, 0xf7, 0x7b, 0xdb,
+ 0x15, 0xb3, 0x6, 0x13, 0xda, 0xf7, 0x3f, 0xf7,
+ 0x7d, 0xb6, 0xfb, 0x7d, 0xf7, 0x3e, 0x63, 0xfb,
+ 0x3e, 0xfb, 0x7b, 0x60, 0xf7, 0x7b, 0x7, 0xe,
+ 0x52, 0xf7, 0xa2, 0xcc, 0xf7, 0xaa, 0xca, 0x1,
+ 0xf7, 0x4d, 0xe7, 0x3, 0x90, 0xf7, 0xa2, 0x15,
+ 0xf7, 0x92, 0x56, 0xa, 0x67, 0x8b, 0x1d, 0xb4,
+ 0x7f, 0x1d, 0x28, 0x20, 0x5, 0xe, 0x52, 0xf7,
+ 0x9a, 0x85, 0x1d, 0x13, 0xd0, 0xdf, 0xf8, 0x60,
+ 0x77, 0xa, 0x79, 0x7c, 0x96, 0x95, 0x7d, 0x1e,
+ 0x94, 0x7e, 0x7e, 0x94, 0x7d, 0x63, 0xa, 0x13,
+ 0xe0, 0x4e, 0x1d, 0x92, 0x1d, 0xe8, 0xf8, 0x8f,
+ 0x24, 0xa, 0xfb, 0x59, 0x76, 0xf7, 0x64, 0xc9,
+ 0xf8, 0x22, 0x77, 0x12, 0xaf, 0xe7, 0x47, 0xab,
+ 0x6b, 0xe3, 0xf7, 0x56, 0xe3, 0x13, 0xea, 0xe7,
+ 0xc5, 0x15, 0x8d, 0x8d, 0x5, 0x4f, 0xab, 0xc1,
+ 0x81, 0xaa, 0x1b, 0xbe, 0xbf, 0xb9, 0xbe, 0xa8,
+ 0x1f, 0x8d, 0x6, 0x62, 0x9c, 0x53, 0xbf, 0xaf,
+ 0xa7, 0x95, 0xba, 0xad, 0x1e, 0x93, 0x7, 0x77,
+ 0x76, 0x7d, 0x83, 0x7c, 0x1b, 0x6b, 0x8b, 0xb5,
+ 0xa2, 0x1f, 0xf7, 0xfa, 0x33, 0xfb, 0xd9, 0x7,
+ 0x72, 0x7f, 0x60, 0x5b, 0x58, 0x1b, 0x13, 0xe6,
+ 0x4f, 0x6f, 0xb1, 0xc1, 0x1f, 0xf7, 0xc6, 0x33,
+ 0xfc, 0x20, 0x7, 0x13, 0xf2, 0x4d, 0x73, 0x3c,
+ 0x4f, 0x1a, 0x5c, 0x95, 0x73, 0xaf, 0xaf, 0x95,
+ 0xa3, 0xba, 0x1e, 0x13, 0xea, 0xc7, 0x6d, 0xda,
+ 0x85, 0xcd, 0x1e, 0xe, 0xeb, 0xfb, 0x57, 0x76,
+ 0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x7a, 0xaf, 0xe6,
+ 0xaf, 0x3, 0xf7, 0x7a, 0xfb, 0x6c, 0x15, 0xaf,
+ 0xf9, 0xe7, 0xe6, 0xfd, 0xe7, 0xaf, 0xf9, 0xe7,
+ 0xcb, 0xa6, 0xfb, 0x87, 0x6, 0xfb, 0x20, 0x3d,
+ 0x4f, 0xfb, 0x11, 0xfb, 0x11, 0xd9, 0x50, 0xf7,
+ 0x30, 0x1f, 0xe, 0x20, 0xf7, 0x70, 0x76, 0xf7,
+ 0x3, 0x77, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1,
+ 0xf7, 0x91, 0x15, 0x43, 0x1d, 0xe, 0x73, 0xfb,
+ 0x6b, 0xf7, 0x2d, 0xc9, 0x77, 0x1, 0xf7, 0x4e,
+ 0xd6, 0x3, 0xeb, 0x23, 0x15, 0x92, 0x86, 0x5,
+ 0x8f, 0x98, 0x9c, 0x8d, 0x9a, 0x1b, 0xa0, 0x9c,
+ 0x81, 0x75, 0x68, 0x70, 0x81, 0x6c, 0x76, 0x74,
+ 0x91, 0x91, 0x79, 0x1f, 0x7d, 0x6c, 0x5, 0x83,
+ 0xac, 0x9e, 0x83, 0xb5, 0x1b, 0xba, 0xcf, 0xb7,
+ 0xb2, 0xb8, 0x68, 0xa4, 0x60, 0x80, 0x7f, 0x8a,
+ 0x89, 0x80, 0x1f, 0xa4, 0xcc, 0x5, 0x68, 0x6,
+ 0xe, 0x52, 0xf7, 0xa2, 0xa3, 0xf8, 0x12, 0x77,
+ 0x1, 0xf7, 0x2, 0xdc, 0x3, 0xc4, 0xf7, 0xa2,
+ 0x35, 0xa, 0xfb, 0x86, 0x7, 0x69, 0x73, 0x80,
+ 0x6e, 0x89, 0x1e, 0xe, 0x5c, 0xf8, 0x1e, 0xac,
+ 0xf7, 0x6c, 0xac, 0x1, 0x91, 0xd4, 0xf7, 0x2c,
+ 0xd4, 0x3, 0x91, 0xf8, 0xa8, 0x15, 0x3f, 0xc6,
+ 0x4d, 0xdf, 0xf7, 0x1, 0xb9, 0xde, 0xcc, 0xdd,
+ 0x4d, 0xbf, 0x36, 0x2a, 0x55, 0x4a, 0x3c, 0x1e,
+ 0xd4, 0xa4, 0x15, 0xb7, 0xab, 0xb5, 0xb4, 0xbd,
+ 0xa8, 0x67, 0x3f, 0x4c, 0x62, 0x62, 0x6a, 0x47,
+ 0x81, 0xe3, 0xb5, 0x1e, 0xe, 0x79, 0xa, 0xf7,
+ 0x8b, 0xac, 0x15, 0x58, 0xa, 0x7d, 0x79, 0x5c,
+ 0x4d, 0x6a, 0x5d, 0x8, 0x78, 0x70, 0x7c, 0x75,
+ 0x86, 0x1a, 0x84, 0x8d, 0x87, 0x93, 0x1e, 0xfb,
+ 0x54, 0x16, 0x58, 0xa, 0x7e, 0x79, 0x5e, 0x52,
+ 0x6a, 0x5e, 0x8, 0x75, 0x6d, 0x7b, 0x73, 0x8f,
+ 0x1d, 0xf8, 0x1d, 0x92, 0x76, 0xae, 0x76, 0xe5,
+ 0xc4, 0xf7, 0xf, 0xa3, 0xf8, 0x12, 0x77, 0x12,
+ 0xe5, 0xdc, 0xf8, 0x3a, 0xd1, 0x13, 0x7e, 0x53,
+ 0xa, 0x13, 0xbe, 0xfc, 0x5b, 0xfb, 0x35, 0x68,
+ 0x1d, 0xfc, 0xbe, 0x47, 0x1d, 0xe, 0xf8, 0x1d,
+ 0x8b, 0xcc, 0x51, 0x76, 0xf7, 0xb0, 0xa3, 0xbc,
+ 0xca, 0xf7, 0xa2, 0x77, 0x12, 0xdf, 0xdc, 0xf8,
+ 0x6a, 0xe7, 0x13, 0x7e, 0xf0, 0x7d, 0x68, 0x1d,
+ 0xfc, 0x9f, 0x47, 0x1d, 0x13, 0xbe, 0xf8, 0x3d,
+ 0xfb, 0xba, 0x15, 0xf7, 0x91, 0x56, 0xa, 0x71,
+ 0x8b, 0x1d, 0xaa, 0x7f, 0x1d, 0x29, 0x20, 0x5,
+ 0xe, 0xf8, 0x1d, 0x92, 0x76, 0xf3, 0xc4, 0xf7,
+ 0x7, 0x85, 0x1d, 0xf7, 0xc2, 0xd1, 0x13, 0xf6,
+ 0x53, 0xa, 0xfc, 0x5b, 0xfb, 0x35, 0x68, 0x1d,
+ 0xfc, 0x8f, 0xfb, 0x6c, 0x77, 0xa, 0x7a, 0x7c,
+ 0x95, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, 0x95,
+ 0x7c, 0x63, 0xa, 0x13, 0xfa, 0x4e, 0x1d, 0xe2,
+ 0xfb, 0x6e, 0xa9, 0xf8, 0xb9, 0xf4, 0x12, 0xa9,
+ 0xe7, 0xac, 0xf4, 0x17, 0xf7, 0x5c, 0xf7, 0xba,
+ 0x15, 0x4e, 0x64, 0x5a, 0x63, 0x59, 0x1e, 0x5f,
+ 0x54, 0x5c, 0x53, 0x40, 0x1a, 0x25, 0xd2, 0x4b,
+ 0xf7, 0x4, 0xd0, 0xe9, 0xb6, 0xf0, 0xad, 0x81,
+ 0xa8, 0x63, 0x6f, 0x76, 0x73, 0x7a, 0x79, 0x94,
+ 0x7f, 0x95, 0x80, 0x1e, 0x94, 0x80, 0x95, 0x81,
+ 0x7e, 0x1a, 0x6a, 0x62, 0x6f, 0x61, 0x3e, 0x6a,
+ 0xce, 0xc7, 0x1e, 0x13, 0x50, 0xb3, 0x9e, 0xd0,
+ 0x9d, 0xb3, 0x1e, 0xa7, 0xcb, 0x5, 0x91, 0x99,
+ 0xa3, 0xd0, 0xc6, 0x1a, 0x4d, 0xf7, 0xb, 0x15,
+ 0x6e, 0xa2, 0x74, 0xa8, 0x1e, 0xa8, 0xa3, 0xa2,
+ 0xa8, 0x94, 0x1d, 0x1f, 0xe, 0xf8, 0x1, 0x99,
+ 0x76, 0xf7, 0x73, 0xb4, 0xf8, 0x35, 0x77, 0xf7,
+ 0x80, 0x77, 0x1, 0x54, 0xf9, 0x47, 0xfd, 0x2,
+ 0xf7, 0x5a, 0x3, 0x20, 0x1d, 0x59, 0xf8, 0x62,
+ 0x27, 0x1d, 0x5c, 0x1d, 0xf7, 0x80, 0x77, 0x1,
+ 0x4c, 0xf9, 0x47, 0xfb, 0x93, 0xf7, 0x93, 0x3,
+ 0x21, 0xa, 0x79, 0x5f, 0x6b, 0x2a, 0x1d, 0xfb,
+ 0x33, 0xf8, 0x62, 0x24, 0xa, 0x5c, 0x1d, 0xf7,
+ 0x7c, 0x77, 0x1, 0x54, 0xf9, 0x47, 0x3, 0x20,
+ 0x1d, 0xfb, 0x85, 0xf8, 0x62, 0x25, 0x1d, 0xe,
+ 0x5b, 0x1d, 0xf8, 0x7f, 0xf1, 0x5a, 0xbc, 0x12,
+ 0x90, 0xf9, 0x47, 0x13, 0xd0, 0x20, 0xa, 0x13,
+ 0x58, 0x77, 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0x78,
+ 0x5f, 0x6c, 0x2a, 0x1d, 0xfb, 0x8f, 0xf8, 0x7b,
+ 0x83, 0x1d, 0x9b, 0xb3, 0xb0, 0x1b, 0xa4, 0xa1,
+ 0x80, 0x80, 0x9f, 0x1f, 0x13, 0xe0, 0x7c, 0xa5,
+ 0xa1, 0x7b, 0xa1, 0x1b, 0xd9, 0x9d, 0xcf, 0x65,
+ 0xa, 0x63, 0x7a, 0x6f, 0x81, 0x72, 0x1b, 0x7c,
+ 0x75, 0x98, 0x98, 0x73, 0x1f, 0x97, 0x75, 0x74,
+ 0x97, 0x77, 0x54, 0xa, 0x5c, 0x1d, 0xdd, 0xee,
+ 0x12, 0x8b, 0xf7, 0x5a, 0x99, 0xee, 0xef, 0xee,
+ 0x13, 0xfa, 0x20, 0x1d, 0x67, 0xf8, 0xa4, 0x15,
+ 0x6a, 0x1d, 0x13, 0xf6, 0xfb, 0x5b, 0x16, 0x6a,
+ 0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x6f, 0xf7, 0x3a,
+ 0x12, 0xf7, 0xb1, 0xf7, 0x18, 0xfb, 0x15, 0xf7,
+ 0x3a, 0x13, 0xe8, 0x20, 0x1d, 0xfb, 0x57, 0xf8,
+ 0xb1, 0x67, 0xa, 0xac, 0x16, 0xaf, 0xa9, 0x93,
+ 0xa, 0x6d, 0x67, 0x1e, 0x13, 0xf0, 0x67, 0x6d,
+ 0xa9, 0xaf, 0x1f, 0xe, 0xf8, 0xa8, 0x8b, 0xb1,
+ 0xf7, 0x72, 0xb2, 0xa9, 0xb0, 0xf7, 0x98, 0xaf,
+ 0x77, 0x9f, 0x12, 0x8b, 0xf7, 0x5b, 0xf7, 0x5b,
+ 0xee, 0xf7, 0x87, 0xa0, 0xab, 0xa2, 0x13, 0xf3,
+ 0x0, 0x13, 0xeb, 0x0, 0x8b, 0x4, 0xf7, 0x5b,
+ 0x9e, 0x6, 0x7e, 0x8d, 0x49, 0x89, 0xa0, 0xd8,
+ 0x93, 0xaa, 0xa5, 0xb7, 0xba, 0xe4, 0x8, 0xf7,
+ 0x44, 0xfb, 0x22, 0x6, 0x44, 0x7b, 0x78, 0x53,
+ 0x84, 0x1e, 0x7a, 0x89, 0x5, 0x78, 0xf8, 0x92,
+ 0x7, 0xb7, 0xf7, 0x3c, 0x5, 0x73, 0x6, 0xfb,
+ 0x2, 0x52, 0x68, 0x77, 0x22, 0x1b, 0x3f, 0x6,
+ 0x49, 0x88, 0x96, 0xcc, 0x1f, 0xf7, 0x6b, 0xf7,
+ 0x25, 0x7, 0xe2, 0x90, 0x5c, 0x56, 0x91, 0x1f,
+ 0xa0, 0xf7, 0x7e, 0x76, 0x6, 0x44, 0x85, 0x7c,
+ 0x71, 0xfb, 0x3, 0x1b, 0xfb, 0x3, 0xf7, 0x7a,
+ 0x6, 0xa8, 0x9b, 0x8c, 0x96, 0x1e, 0xe2, 0x6,
+ 0xf7, 0x16, 0xb4, 0x84, 0x29, 0x96, 0x1f, 0xa2,
+ 0xf7, 0x21, 0xfc, 0xc8, 0x6, 0x13, 0xf7, 0x80,
+ 0x77, 0x7, 0xc8, 0xa8, 0x80, 0x73, 0x83, 0x86,
+ 0x81, 0x87, 0x83, 0x1f, 0xfb, 0x89, 0xfc, 0x6e,
+ 0x68, 0x46, 0x79, 0x7e, 0x68, 0x85, 0x19, 0xf7,
+ 0x83, 0xf7, 0xac, 0x15, 0xf7, 0x30, 0xf7, 0xcd,
+ 0x5, 0x8e, 0xfb, 0xcd, 0x6, 0xe, 0xf7, 0xca,
+ 0xfb, 0x56, 0x76, 0xf7, 0x5d, 0xb7, 0xf8, 0xf2,
+ 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0xf7, 0xa4, 0xd6,
+ 0xf5, 0xa2, 0x3, 0xf7, 0xae, 0x8e, 0xa, 0xcc,
+ 0x8c, 0xce, 0xa9, 0xbf, 0x1a, 0xc3, 0x54, 0xa2,
+ 0x52, 0x7f, 0x1e, 0xa0, 0xc1, 0xf7, 0x32, 0x9a,
+ 0xd5, 0xf6, 0x8c, 0x8d, 0x19, 0x79, 0x9d, 0x5,
+ 0x77, 0x1d, 0xf7, 0x24, 0xb7, 0xcb, 0xb2, 0xb1,
+ 0x1f, 0xb4, 0xb5, 0xc5, 0x9f, 0xbd, 0x1b, 0xf7,
+ 0xf, 0xd3, 0x31, 0x22, 0xa4, 0x1f, 0xa2, 0x6,
+ 0x82, 0xf7, 0x7f, 0x59, 0x1d, 0x1f, 0x8c, 0x6,
+ 0x66, 0x33, 0x92, 0x86, 0x5, 0xab, 0x94, 0xbe,
+ 0x8c, 0x86, 0xa, 0x5a, 0x1d, 0xf7, 0x78, 0x77,
+ 0x12, 0x7f, 0xa, 0x17, 0x97, 0x16, 0xf8, 0xb0,
+ 0x6, 0x13, 0xff, 0x80, 0x23, 0x1d, 0xf7, 0xdd,
+ 0xf9, 0x50, 0x27, 0x1d, 0x5a, 0x1d, 0xf7, 0x78,
+ 0x77, 0x1, 0x7f, 0xa, 0x3, 0xf7, 0x7c, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfc, 0x3, 0xfd, 0xf7, 0x2c,
+ 0xa, 0x5a, 0x1d, 0xf7, 0x74, 0x77, 0x1, 0x7f,
+ 0xa, 0x3, 0xf7, 0x2a, 0x38, 0xa, 0xfb, 0x9a,
+ 0xfe, 0xa, 0x2c, 0xa, 0x7b, 0xa, 0xf7, 0xb5,
+ 0xb4, 0xf7, 0x94, 0xb1, 0xd3, 0xf0, 0x12, 0xee,
+ 0xf1, 0x5d, 0xf0, 0xee, 0xf0, 0x94, 0xa2, 0x13,
+ 0xfa, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x36, 0x1d,
+ 0x13, 0x7b, 0x26, 0xa, 0x13, 0x16, 0x3e, 0x7a,
+ 0xa, 0x13, 0xf6, 0xf7, 0x23, 0xf9, 0x91, 0x15,
+ 0x6c, 0x1d, 0xf7, 0x5c, 0x16, 0x6c, 0x1d, 0xe,
+ 0x73, 0x83, 0xa, 0xf7, 0x8c, 0x42, 0xa, 0xf7,
+ 0x4c, 0xf9, 0x50, 0x2d, 0xa, 0x89, 0x81, 0x1d,
+ 0x9d, 0x57, 0xa, 0x73, 0x83, 0xa, 0xf7, 0x8c,
+ 0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0xe8, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfb, 0x72, 0xfd, 0xf7, 0x15,
+ 0xf7, 0xbf, 0x9e, 0x6, 0x41, 0x8d, 0x71, 0x60,
+ 0x1d, 0xa6, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e, 0xfb,
+ 0xbf, 0x78, 0x7, 0x49, 0xa, 0xe, 0x73, 0x83,
+ 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+ 0x3, 0x96, 0x38, 0xa, 0xfb, 0x10, 0xfe, 0xa,
+ 0x15, 0xf7, 0xcb, 0x9e, 0x6, 0x41, 0x8d, 0x6c,
+ 0x60, 0x1d, 0xab, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e,
+ 0xfb, 0xcb, 0x78, 0x7, 0xde, 0x87, 0xa0, 0x75,
+ 0x41, 0x89, 0x1d, 0x44, 0x78, 0x70, 0x36, 0x89,
+ 0x1e, 0xe, 0x73, 0xa0, 0x76, 0xf9, 0x17, 0x97,
+ 0xa, 0x12, 0xad, 0xed, 0x7a, 0xf1, 0x13, 0xd0,
+ 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x13, 0xc8,
+ 0x59, 0xa, 0x13, 0xb0, 0x9e, 0xfb, 0xbd, 0x7,
+ 0x13, 0xd0, 0x78, 0x7, 0x13, 0xc8, 0x49, 0xa,
+ 0xf9, 0x91, 0x4, 0x6d, 0x1d, 0xf7, 0x5b, 0x16,
+ 0x6d, 0x1d, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf7,
+ 0xaa, 0xb7, 0xf7, 0x9e, 0xb0, 0x1, 0xf3, 0xf1,
+ 0xf8, 0x6, 0x58, 0x1d, 0x96, 0x71, 0x41, 0x1f,
+ 0xfb, 0x4c, 0x34, 0x5f, 0xe2, 0xfb, 0x58, 0x7,
+ 0x45, 0x7f, 0x6d, 0x3f, 0x1e, 0xf7, 0x52, 0xf7,
+ 0xbc, 0x15, 0xf7, 0x26, 0xb7, 0xfb, 0x26, 0xf7,
+ 0x4b, 0x6, 0xbe, 0x8b, 0xab, 0x8b, 0xa, 0xfb,
+ 0xb7, 0xfb, 0x8a, 0x8b, 0x4b, 0x5b, 0x7f, 0x9f,
+ 0xc5, 0x1e, 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab,
+ 0x76, 0xf7, 0x49, 0x77, 0xf8, 0x89, 0x77, 0xf1,
+ 0xf5, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7,
+ 0x13, 0x7e, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7,
+ 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0xf7, 0x4c,
+ 0xf9, 0x69, 0x4c, 0xa, 0x9d, 0x67, 0x1f, 0x97,
+ 0x74, 0x75, 0x91, 0x76, 0x54, 0xa, 0x30, 0x1d,
+ 0xf7, 0x8d, 0xf8, 0x10, 0x27, 0x1d, 0x30, 0x1d,
+ 0xf7, 0x20, 0xf8, 0x10, 0x24, 0xa, 0x5b, 0xa,
+ 0xf7, 0x66, 0x77, 0x74, 0xa, 0xf7, 0x62, 0x38,
+ 0xa, 0xfb, 0xbc, 0xfc, 0xb8, 0x29, 0x1d, 0xe,
+ 0x5b, 0xa, 0xcf, 0xf5, 0x85, 0xa, 0xf7, 0xde,
+ 0x70, 0xa, 0xfb, 0x17, 0x69, 0x1d, 0xf7, 0x17,
+ 0x61, 0x1d, 0xf7, 0x8, 0x61, 0xa, 0xfb, 0x8,
+ 0x44, 0x1d, 0xdc, 0xf1, 0xf1, 0xf7, 0x3, 0x3a,
+ 0x71, 0x1d, 0x32, 0x72, 0x1d, 0xe4, 0xf7, 0x70,
+ 0x1e, 0xbb, 0xf8, 0x31, 0x4c, 0xa, 0x91, 0x7f,
+ 0x1f, 0xa3, 0x5c, 0x75, 0x91, 0x76, 0x54, 0xa,
+ 0x5b, 0xa, 0xc6, 0xef, 0x7b, 0x1d, 0xca, 0xef,
+ 0xef, 0xef, 0xca, 0x9a, 0xa, 0xad, 0xf7, 0xe6,
+ 0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0x10,
+ 0x61, 0x1d, 0xf7, 0xf, 0x34, 0xa, 0x33, 0x71,
+ 0x1d, 0x39, 0x5e, 0xa, 0xca, 0xf8, 0x52, 0x15,
+ 0x30, 0xa, 0xf7, 0x5c, 0x16, 0x30, 0xa, 0xe,
+ 0xf7, 0x63, 0xa8, 0x76, 0xac, 0x76, 0xf8, 0x71,
+ 0x77, 0x12, 0x13, 0xa0, 0xc5, 0xc3, 0x15, 0xa6,
+ 0x6f, 0xf7, 0x59, 0xf7, 0x59, 0x5, 0x13, 0x60,
+ 0xf7, 0x61, 0xfb, 0x61, 0xa7, 0xa6, 0xfb, 0x61,
+ 0xf7, 0x62, 0xf7, 0x59, 0xf7, 0x58, 0x6f, 0xa7,
+ 0xfb, 0x59, 0xfb, 0x59, 0xfb, 0x58, 0xf7, 0x59,
+ 0x70, 0x6e, 0xf7, 0x57, 0xfb, 0x57, 0x5, 0xe,
+ 0xf8, 0x1, 0x50, 0x76, 0xcd, 0xaf, 0xf8, 0xfe,
+ 0xaf, 0xc5, 0x77, 0x74, 0xa, 0xf7, 0x6f, 0xe3,
+ 0x15, 0xf7, 0xc8, 0xf8, 0x58, 0x5, 0xa8, 0x5a,
+ 0x9d, 0x41, 0x2e, 0x1a, 0xfb, 0x70, 0x25, 0x39,
+ 0xfb, 0x3, 0x57, 0x57, 0x9f, 0xb9, 0x65, 0x1e,
+ 0x72, 0xae, 0x15, 0x6e, 0xbc, 0x7a, 0xd9, 0xe6,
+ 0x1a, 0xf7, 0x78, 0xf7, 0x3, 0xd2, 0xf1, 0xbc,
+ 0xbf, 0x78, 0x5d, 0xb3, 0x1e, 0xfc, 0x52, 0xfd,
+ 0x23, 0x15, 0xbc, 0x6, 0xda, 0xf7, 0x8, 0x5,
+ 0x6a, 0xbe, 0xc8, 0x7a, 0xcc, 0x1b, 0xf7, 0x49,
+ 0xf7, 0x26, 0xf7, 0x10, 0xf7, 0x69, 0xf7, 0x11,
+ 0x5b, 0xed, 0x45, 0xc5, 0x1f, 0xe3, 0xf7, 0x16,
+ 0x5, 0x5a, 0x6, 0x43, 0x20, 0x5, 0xac, 0x56,
+ 0x4e, 0x9b, 0x4d, 0x1b, 0xfb, 0x38, 0xfb, 0x37,
+ 0x21, 0xfb, 0x7a, 0xfb, 0xb, 0xb8, 0x24, 0xd3,
+ 0x50, 0x1f, 0xe, 0x7c, 0xa, 0xf7, 0xfd, 0xb7,
+ 0x3, 0x99, 0xf9, 0x17, 0x15, 0xd7, 0x99, 0x71,
+ 0x41, 0x1f, 0xfb, 0xc6, 0x7, 0x4a, 0x8b, 0xfb,
+ 0x4e, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, 0x47,
+ 0xe4, 0x1e, 0xf7, 0x8f, 0x7, 0xf4, 0x9c, 0xab,
+ 0xd8, 0x8c, 0x1e, 0x9e, 0xfb, 0x7c, 0x78, 0x7,
+ 0xd1, 0x8a, 0xa3, 0x6d, 0x20, 0x1a, 0xfb, 0x98,
+ 0x7, 0xfb, 0x11, 0x4f, 0x31, 0x98, 0x1d, 0xf7,
+ 0x22, 0xc8, 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97,
+ 0xa7, 0xda, 0x8c, 0x1e, 0x88, 0xa, 0xf8, 0x13,
+ 0xc4, 0x3a, 0x1d, 0x73, 0x87, 0x8b, 0x7b, 0x1b,
+ 0x6c, 0x8a, 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x7c,
+ 0xa, 0xf7, 0xf6, 0xb7, 0x3, 0xf8, 0x4, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfc, 0x89, 0xfb, 0x74, 0x32,
+ 0x1d, 0x6e, 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf3,
+ 0xf1, 0xf7, 0xf6, 0xb7, 0x3, 0xf7, 0x62, 0x38,
+ 0xa, 0xfb, 0xd0, 0xfb, 0x87, 0x32, 0x1d, 0xf8,
+ 0x1, 0x7d, 0xb7, 0xf8, 0xf9, 0x97, 0xa, 0xe9,
+ 0xee, 0x12, 0xf7, 0x13, 0xf1, 0x7a, 0xee, 0xf0,
+ 0xee, 0xb4, 0xb7, 0x13, 0xcb, 0x99, 0xf9, 0x17,
+ 0x2e, 0x1d, 0x13, 0xbb, 0x9e, 0xfb, 0x7c, 0x7,
+ 0x13, 0xcb, 0x50, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+ 0x47, 0xa, 0x13, 0xbb, 0x88, 0xa, 0x13, 0xcb,
+ 0x13, 0xb7, 0xf7, 0x5a, 0xf7, 0xf, 0x4a, 0x1d,
+ 0xf8, 0x1, 0x83, 0xa, 0xf7, 0x8c, 0x72, 0xa,
+ 0xa8, 0xde, 0x1a, 0xf7, 0x3f, 0x7e, 0x1d, 0x4b,
+ 0x1d, 0x5e, 0x1d, 0xf7, 0x6, 0xf9, 0x50, 0x24,
+ 0xa, 0xf7, 0x5b, 0x93, 0x9e, 0xf7, 0x25, 0xb3,
+ 0xf7, 0x95, 0xb1, 0xf7, 0x34, 0x77, 0x6d, 0xa,
+ 0x98, 0xe9, 0x1a, 0xac, 0x66, 0x1d, 0xf7, 0x6,
+ 0x21, 0xcd, 0xfb, 0x2e, 0x1e, 0x3b, 0x6, 0x88,
+ 0xe7, 0x9a, 0x97, 0xda, 0x92, 0x8, 0x9e, 0xfb,
+ 0xa9, 0x78, 0x7, 0xd4, 0x84, 0x96, 0x7f, 0x44,
+ 0x1a, 0xfc, 0x3b, 0x8d, 0xa, 0xf7, 0x4a, 0x15,
+ 0xf7, 0x98, 0x7, 0xac, 0x96, 0x8b, 0xa9, 0xb7,
+ 0xf7, 0x26, 0x8a, 0x74, 0x1d, 0x82, 0xa8, 0x77,
+ 0x9f, 0xf9, 0x10, 0xa6, 0x12, 0xd4, 0xdf, 0xf7,
+ 0x45, 0xe2, 0x5c, 0xe9, 0x13, 0x78, 0x97, 0x16,
+ 0xf7, 0x25, 0xf8, 0xb9, 0x6, 0x9b, 0x8d, 0xe6,
+ 0xe2, 0xbb, 0xb3, 0x5f, 0x2d, 0x1e, 0xfb, 0x38,
+ 0xfb, 0x10, 0xc1, 0x69, 0x1a, 0x6e, 0xc4, 0xa5,
+ 0xbb, 0x65, 0x1e, 0x13, 0xb4, 0x9c, 0x7d, 0xb5,
+ 0x60, 0x23, 0x1a, 0x38, 0x82, 0x46, 0x54, 0x7a,
+ 0x85, 0x92, 0x99, 0x87, 0x1e, 0x89, 0x93, 0x8a,
+ 0x96, 0x8a, 0x97, 0x8, 0x9f, 0x89, 0x7c, 0x9f,
+ 0x72, 0x1b, 0x71, 0x78, 0x77, 0x6e, 0x75, 0x9c,
+ 0x59, 0xdd, 0xf7, 0x1, 0xcf, 0xef, 0xe6, 0xf7,
+ 0x21, 0xfb, 0x4, 0xbe, 0x46, 0x8d, 0x1f, 0x8d,
+ 0x7, 0x13, 0x78, 0xf7, 0x3, 0xbb, 0xa2, 0xb4,
+ 0xd0, 0x1a, 0xf6, 0x2c, 0xb3, 0x43, 0xfb, 0x48,
+ 0x8a, 0xfb, 0x3a, 0x4c, 0x1e, 0xfb, 0xfc, 0x7,
+ 0x4a, 0x73, 0x80, 0x66, 0x88, 0x1e, 0xe, 0x4f,
+ 0x1d, 0xf7, 0x6e, 0x77, 0x12, 0xb0, 0xe3, 0x39,
+ 0xe3, 0xf7, 0x30, 0xdc, 0x13, 0xda, 0x34, 0x1d,
+ 0x1e, 0x13, 0xd6, 0xfb, 0x8, 0x67, 0x44, 0x63,
+ 0x7b, 0x8c, 0x6f, 0xaa, 0xa5, 0xa4, 0x97, 0xa0,
+ 0x1f, 0x94, 0x80, 0xa4, 0x9a, 0x1a, 0x13, 0xba,
+ 0xaa, 0xb1, 0x37, 0xa, 0xcb, 0x89, 0xa, 0xbe,
+ 0xab, 0xa4, 0x1e, 0x6d, 0xf8, 0x46, 0x27, 0x1d,
+ 0x4f, 0x1d, 0xf7, 0x6e, 0x77, 0x1, 0xaa, 0xe3,
+ 0xf7, 0x3c, 0xdc, 0x3, 0x34, 0x1d, 0xfb, 0x8,
+ 0x4f, 0x44, 0x63, 0x7b, 0xa4, 0x6f, 0xaa, 0xa5,
+ 0x91, 0xa1, 0xa0, 0x1e, 0xb2, 0x7, 0xaa, 0xb9,
+ 0x37, 0xa, 0xb3, 0x66, 0xc1, 0xe9, 0xb1, 0xbe,
+ 0xab, 0xa4, 0x1e, 0xfb, 0x1f, 0xf8, 0x46, 0x15,
+ 0xf7, 0x27, 0xf7, 0x28, 0x5, 0xa2, 0xa2, 0x91,
+ 0x8b, 0x9a, 0x1b, 0xab, 0x8c, 0x6f, 0x87, 0x74,
+ 0x78, 0x7f, 0x80, 0x84, 0x1f, 0xfb, 0x2e, 0x2a,
+ 0x5, 0xe, 0x4f, 0x1d, 0xf7, 0x6a, 0x77, 0x84,
+ 0xa, 0xce, 0xf8, 0x8f, 0x25, 0x1d, 0xeb, 0xfc,
+ 0x2a, 0x29, 0xa, 0x4f, 0x1d, 0xd3, 0xf5, 0x84,
+ 0xa, 0xc4, 0xf8, 0xa8, 0x83, 0x1d, 0x96, 0xaf,
+ 0xb1, 0x1b, 0x97, 0x98, 0x84, 0x45, 0x1d, 0x74,
+ 0x94, 0x91, 0x7f, 0x1f, 0xa3, 0x5c, 0x77, 0x96,
+ 0x76, 0x1b, 0x48, 0x6d, 0x4d, 0x5f, 0x83, 0x1f,
+ 0xf7, 0x7a, 0xfb, 0x9c, 0x29, 0xa, 0x4f, 0x1d,
+ 0xcb, 0xee, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0x44,
+ 0xee, 0xf0, 0xea, 0x3a, 0xdc, 0x13, 0xd8, 0x80,
+ 0xf7, 0xb3, 0xf7, 0xa0, 0x28, 0x1d, 0x13, 0xd5,
+ 0x0, 0x3e, 0x1d, 0x13, 0xb8, 0x80, 0x3c, 0x1d,
+ 0x13, 0xd3, 0x0, 0xfb, 0x6b, 0xf8, 0x88, 0x4a,
+ 0x1d, 0xe2, 0x81, 0xc5, 0xf7, 0x95, 0xf7, 0x2b,
+ 0x77, 0xa3, 0xcd, 0xad, 0xf7, 0x17, 0xad, 0x12,
+ 0xc3, 0xe3, 0x64, 0xe3, 0x3d, 0xad, 0xf7, 0x7,
+ 0xdc, 0x98, 0xae, 0x13, 0xda, 0x40, 0xf7, 0xb3,
+ 0xf7, 0xa0, 0x24, 0x1d, 0x13, 0xdc, 0x80, 0x40,
+ 0xa, 0xeb, 0xfb, 0x29, 0xfb, 0x8, 0x5c, 0x48,
+ 0x57, 0x1d, 0x1e, 0x94, 0x86, 0x9a, 0x9a, 0x1a,
+ 0x13, 0xba, 0x40, 0xaa, 0xb1, 0x99, 0xac, 0xa9,
+ 0xba, 0x57, 0x43, 0x1e, 0x7b, 0x4f, 0xa, 0xbf,
+ 0x89, 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0x13, 0xd9,
+ 0x40, 0xfb, 0x39, 0xf8, 0xae, 0x67, 0xa, 0xad,
+ 0x16, 0xaf, 0xa8, 0x93, 0xa, 0x6e, 0x67, 0x67,
+ 0x6e, 0xa8, 0xaf, 0x1e, 0xe, 0xf7, 0xca, 0x81,
+ 0xbb, 0x5b, 0xce, 0xf7, 0x70, 0xa9, 0x88, 0xf7,
+ 0x30, 0x73, 0xa3, 0x12, 0xb1, 0xe2, 0x4a, 0xe4,
+ 0xf7, 0x10, 0xdc, 0x13, 0x6d, 0xf7, 0xc6, 0xd4,
+ 0x15, 0x71, 0x9c, 0xa9, 0x52, 0xe1, 0x1b, 0xb1,
+ 0xe9, 0x98, 0xf7, 0x26, 0xc8, 0x1f, 0x7f, 0x90,
+ 0x5, 0x56, 0x6a, 0x59, 0x5f, 0x54, 0x1b, 0xfb,
+ 0x14, 0x8b, 0xf7, 0xd, 0xee, 0x1f, 0xf7, 0x9a,
+ 0x6, 0x13, 0x93, 0xbd, 0x7c, 0xf7, 0x19, 0xfb,
+ 0x22, 0x58, 0x6d, 0x7f, 0x6a, 0x62, 0x1e, 0xa0,
+ 0x73, 0x6e, 0xa3, 0x49, 0x1b, 0x35, 0x43, 0x5e,
+ 0x4d, 0x65, 0xa4, 0x80, 0x9c, 0xba, 0x8b, 0xb5,
+ 0xaf, 0x1f, 0x13, 0xad, 0xa8, 0x9e, 0xa4, 0xb8,
+ 0xcd, 0x89, 0x57, 0x24, 0x87, 0x1e, 0xfb, 0x35,
+ 0x4a, 0x41, 0x6d, 0x31, 0x1a, 0x61, 0xab, 0x4b,
+ 0xde, 0xee, 0x92, 0xb7, 0xb2, 0xba, 0x1e, 0x7e,
+ 0xa4, 0x15, 0x7d, 0x52, 0x5d, 0x64, 0x54, 0x7a,
+ 0xc2, 0xa5, 0xca, 0xa4, 0xa7, 0xf7, 0xf, 0xb6,
+ 0x1e, 0x8c, 0x57, 0x5, 0x8c, 0x44, 0x9d, 0x72,
+ 0x84, 0x1a, 0xc9, 0xf7, 0x65, 0x15, 0xb5, 0x8d,
+ 0x8f, 0xdd, 0xde, 0x1b, 0xd3, 0x90, 0x37, 0x63,
+ 0x1f, 0xe, 0xe2, 0xfb, 0x56, 0x76, 0xf7, 0x61,
+ 0xd3, 0xf7, 0x91, 0xf7, 0x25, 0x6e, 0xa8, 0x12,
+ 0xa4, 0xd8, 0xf7, 0x31, 0xd6, 0x13, 0xdc, 0xf7,
+ 0x11, 0x8e, 0xa, 0xcb, 0xcf, 0xaa, 0xbf, 0xc3,
+ 0x54, 0xa2, 0x52, 0x7f, 0x1f, 0xa1, 0xc5, 0xcd,
+ 0x95, 0xc2, 0xb8, 0xba, 0xee, 0x19, 0x63, 0x1d,
+ 0x90, 0x79, 0x6d, 0x93, 0x1f, 0x13, 0xec, 0x5f,
+ 0x97, 0x9c, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+ 0xa2, 0xca, 0x33, 0xb1, 0x4e, 0xfb, 0x0, 0xfb,
+ 0x8, 0x38, 0xfb, 0x38, 0xfb, 0x30, 0xf3, 0x4a,
+ 0xda, 0x89, 0x1f, 0x65, 0x2e, 0x92, 0x86, 0x5,
+ 0xab, 0x94, 0xbd, 0x8d, 0x86, 0xa, 0xe2, 0x81,
+ 0xd0, 0xf7, 0x4f, 0xab, 0xf7, 0xd, 0xaf, 0xf7,
+ 0x87, 0x77, 0x12, 0xa3, 0xd0, 0xf7, 0x68, 0xf1,
+ 0x17, 0x26, 0x1d, 0x13, 0x7c, 0x3d, 0x1d, 0x5e,
+ 0xf7, 0x64, 0x27, 0x1d, 0x87, 0x1d, 0xf7, 0x11,
+ 0xaf, 0xf7, 0x6e, 0x77, 0x1, 0xac, 0xd0, 0xf7,
+ 0x46, 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x6, 0xf7,
+ 0x64, 0x24, 0xa, 0x87, 0x1d, 0xf7, 0x11, 0xaf,
+ 0xf7, 0x6a, 0x77, 0x1, 0xa4, 0xd0, 0xf7, 0x65,
+ 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x80, 0xf7, 0x64,
+ 0x25, 0x1d, 0xe, 0xe2, 0x81, 0xd0, 0xf7, 0x58,
+ 0xab, 0xf7, 0x1d, 0xaf, 0xca, 0xef, 0x12, 0xa4,
+ 0xd0, 0x77, 0xed, 0xf0, 0xed, 0x13, 0xfa, 0x28,
+ 0xa, 0x13, 0xf6, 0xfb, 0x79, 0xf7, 0xa6, 0x15,
+ 0x4b, 0xa, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa,
+ 0xf7, 0x33, 0xf8, 0x80, 0x27, 0x1d, 0x8f, 0xa,
+ 0xf9, 0x3a, 0x27, 0xa, 0xbd, 0xf8, 0x80, 0x24,
+ 0xa, 0x8f, 0xa, 0xf9, 0x36, 0x27, 0xa, 0x6b,
+ 0xf8, 0x80, 0x25, 0x1d, 0xe, 0x8f, 0xa, 0xf8,
+ 0xa0, 0xee, 0x1, 0x82, 0xed, 0x91, 0xdf, 0x96,
+ 0xed, 0x23, 0xa, 0x72, 0xf8, 0xc2, 0x15, 0x6b,
+ 0xa, 0xf7, 0x5b, 0x16, 0x6b, 0xa, 0xe, 0x71,
+ 0xa, 0xf7, 0x76, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+ 0x9a, 0xe5, 0x3, 0xf7, 0xb, 0xf7, 0xaa, 0x15,
+ 0xf1, 0xc3, 0xbf, 0xca, 0xd4, 0xd1, 0x3d, 0xfb,
+ 0x2f, 0xfb, 0x23, 0x48, 0x65, 0x58, 0xfb, 0xc,
+ 0x73, 0xf7, 0x4c, 0xd7, 0x1e, 0xf7, 0x89, 0xf7,
+ 0x11, 0x15, 0xb4, 0x60, 0x69, 0x9b, 0x61, 0x1b,
+ 0xfb, 0x19, 0x38, 0xfb, 0x1, 0xfb, 0x17, 0xfb,
+ 0x13, 0xe6, 0x24, 0x65, 0x1d, 0xf7, 0x32, 0xf7,
+ 0x1c, 0xf7, 0xb, 0x5e, 0xf7, 0xd, 0x2e, 0xd9,
+ 0x1f, 0xe6, 0xbb, 0x6a, 0xa9, 0x2c, 0x59, 0x62,
+ 0xa5, 0x57, 0xa5, 0x50, 0x8f, 0x19, 0x61, 0x75,
+ 0xbb, 0x84, 0xb8, 0x6d, 0xb3, 0x6e, 0x19, 0xfb,
+ 0xd, 0x4b, 0xac, 0x6d, 0xf7, 0xf, 0xcc, 0xbe,
+ 0x5a, 0xae, 0x54, 0x95, 0x4f, 0x19, 0xe, 0xa0,
+ 0x76, 0xf8, 0x29, 0xc2, 0xd6, 0xf2, 0x73, 0xa,
+ 0xb2, 0xb6, 0x1a, 0xf7, 0x8c, 0x7e, 0xa, 0xfb,
+ 0x5b, 0x7, 0x3f, 0x71, 0x7c, 0x82, 0x1d, 0xa7,
+ 0xce, 0x1a, 0xf7, 0x58, 0x46, 0xa, 0xd0, 0xf8,
+ 0x99, 0x15, 0xa8, 0x6, 0xb0, 0x8e, 0xac, 0x9e,
+ 0xa3, 0x1b, 0xa6, 0x9f, 0x79, 0x82, 0xa0, 0x1f,
+ 0x7e, 0xaa, 0xa2, 0x7e, 0x9e, 0x1b, 0xd9, 0x98,
+ 0xd0, 0x65, 0xa, 0x5e, 0x83, 0x7a, 0x80, 0x75,
+ 0x1b, 0x77, 0x72, 0x98, 0x95, 0x74, 0x1f, 0x9b,
+ 0x66, 0x76, 0x9c, 0x74, 0x54, 0xa, 0x71, 0xa,
+ 0xf7, 0x6e, 0x77, 0x1, 0xb9, 0xe5, 0xf7, 0x8a,
+ 0xe5, 0x3, 0x2f, 0x1d, 0xa6, 0x15, 0xf3, 0xc2,
+ 0xd4, 0xca, 0xe7, 0xbe, 0x34, 0x80, 0xa, 0x46,
+ 0x4f, 0x58, 0xfb, 0xc, 0x76, 0xf7, 0x37, 0xd5,
+ 0x1e, 0xf7, 0x3b, 0xf7, 0x90, 0x3b, 0x1d, 0x9e,
+ 0x74, 0x86, 0x94, 0xa, 0x9c, 0x57, 0xa, 0x71,
+ 0xa, 0xf7, 0x6e, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+ 0x99, 0xe5, 0x3, 0xa8, 0xf7, 0x7b, 0x15, 0xfb,
+ 0x1b, 0xe5, 0x21, 0x65, 0x1d, 0xf7, 0x1c, 0xee,
+ 0xf7, 0x25, 0x2d, 0xe5, 0xfb, 0x17, 0xfb, 0x1a,
+ 0x39, 0x21, 0xfb, 0xf, 0x1e, 0xe5, 0xad, 0x15,
+ 0xf3, 0xc9, 0xca, 0xca, 0xe7, 0xb7, 0x30, 0x80,
+ 0xa, 0x3b, 0x53, 0x58, 0xfb, 0xc, 0x81, 0xf7,
+ 0x41, 0xd5, 0x1e, 0xc5, 0xf7, 0x86, 0x24, 0xa,
+ 0x71, 0xa, 0xf7, 0x6a, 0x77, 0x4c, 0x1d, 0xa9,
+ 0x15, 0xf3, 0xc2, 0xd1, 0xca, 0xe7, 0xbe, 0x3a,
+ 0x80, 0xa, 0x44, 0x49, 0x58, 0xfb, 0xc, 0x78,
+ 0xf7, 0x3a, 0xd5, 0x1e, 0x73, 0xf7, 0x8d, 0x25,
+ 0x1d, 0xe, 0x71, 0xa, 0xd3, 0xf5, 0x4c, 0x1d,
+ 0xbb, 0x15, 0xf3, 0xc2, 0xbf, 0xca, 0xe7, 0xbe,
+ 0xfb, 0x1, 0x80, 0xa, 0x48, 0x65, 0x58, 0xfb,
+ 0xc, 0x74, 0xf7, 0x4c, 0xd5, 0x1e, 0x69, 0xf7,
+ 0x94, 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x9b, 0xbb,
+ 0xaf, 0x7e, 0x8, 0x71, 0xd1, 0xb0, 0x71, 0x52,
+ 0x1d, 0x7a, 0x63, 0x7c, 0x7a, 0x71, 0x92, 0x8,
+ 0x9b, 0x51, 0x50, 0xad, 0x76, 0x54, 0xa, 0x71,
+ 0xa, 0xca, 0xef, 0x12, 0xa8, 0xe5, 0x79, 0xef,
+ 0xee, 0xef, 0x77, 0xe5, 0x13, 0xf2, 0x2f, 0x1d,
+ 0xa4, 0x15, 0xf3, 0xc2, 0xd6, 0xca, 0xe7, 0xbe,
+ 0x3d, 0x80, 0xa, 0x48, 0x46, 0x58, 0xfb, 0xc,
+ 0x74, 0xf7, 0x35, 0xd5, 0x1e, 0x13, 0xec, 0x79,
+ 0xf7, 0xd4, 0x15, 0x30, 0xa, 0xf7, 0x5b, 0x16,
+ 0x30, 0xa, 0xe, 0xf7, 0x63, 0x96, 0x76, 0xe1,
+ 0x77, 0xb9, 0xf7, 0xa, 0x8b, 0xcd, 0x55, 0xb6,
+ 0xf7, 0x85, 0x77, 0x12, 0xf7, 0x76, 0xf7, 0x5,
+ 0x27, 0xe1, 0x13, 0xee, 0xa9, 0xf7, 0x7c, 0x15,
+ 0xf8, 0x8c, 0xb6, 0xfc, 0x8c, 0x6, 0xf7, 0x90,
+ 0xfb, 0xb1, 0x15, 0x13, 0xf5, 0x6c, 0xa, 0xf8,
+ 0x4c, 0x4, 0x6c, 0xa, 0xe, 0x30, 0x76, 0xf1,
+ 0xa7, 0xf8, 0x32, 0xa7, 0xe6, 0x77, 0x1, 0xa8,
+ 0xe5, 0xf7, 0x99, 0xe5, 0x3, 0xf7, 0x47, 0xc7,
+ 0x15, 0xf7, 0x35, 0xf7, 0xc6, 0x5, 0xa5, 0x60,
+ 0x99, 0x4f, 0x4b, 0x1a, 0xfb, 0x23, 0x48, 0x65,
+ 0x58, 0x67, 0x70, 0x9b, 0xa5, 0x77, 0x1e, 0xfb,
+ 0x13, 0xfb, 0x40, 0x15, 0xb0, 0x6, 0xcc, 0xf7,
+ 0xf, 0x5, 0x7d, 0xa8, 0xaa, 0x84, 0xad, 0x1b,
+ 0xf7, 0x2c, 0xd1, 0xf7, 0x1f, 0xee, 0xe7, 0x66,
+ 0xcf, 0x4e, 0xb1, 0x1f, 0xcc, 0xf7, 0x11, 0x5,
+ 0x64, 0x6, 0x52, 0xfb, 0x1, 0x5, 0x97, 0x6e,
+ 0x6b, 0x91, 0x68, 0x1b, 0xfb, 0x1a, 0x39, 0xfb,
+ 0x1, 0xfb, 0xf, 0x36, 0xaf, 0x42, 0xc7, 0x61,
+ 0x1f, 0xac, 0xcb, 0x15, 0x6c, 0xc6, 0x83, 0xdd,
+ 0xb6, 0x1a, 0xf3, 0xc2, 0xbf, 0xca, 0xab, 0xa5,
+ 0x7e, 0x74, 0xa1, 0x1e, 0xe, 0x76, 0x1d, 0xf7,
+ 0xe6, 0xe1, 0x15, 0x2e, 0x7, 0x8d, 0x88, 0x87,
+ 0xa, 0x19, 0x22, 0xa, 0x57, 0xf8, 0x39, 0x27,
+ 0x1d, 0x76, 0x1d, 0xf7, 0x45, 0xf8, 0x8f, 0x21,
+ 0x1d, 0x9b, 0xfd, 0x2d, 0x25, 0xa, 0xe, 0x81,
+ 0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x88, 0x90, 0xa,
+ 0xea, 0xf8, 0x8f, 0x25, 0x1d, 0xf7, 0xd, 0xfd,
+ 0x40, 0x25, 0xa, 0xe, 0x81, 0xc7, 0xf8, 0x13,
+ 0xf7, 0x52, 0x27, 0xef, 0x12, 0xd2, 0xdf, 0x55,
+ 0xef, 0xed, 0xef, 0x49, 0xdf, 0x13, 0xd2, 0xf7,
+ 0xe8, 0x81, 0x25, 0xa, 0x13, 0xac, 0xfb, 0x81,
+ 0xf8, 0xd8, 0x15, 0x30, 0xa, 0xf7, 0x5a, 0x16,
+ 0x30, 0xa, 0xe, 0x96, 0xa, 0xf8, 0xc2, 0x9a,
+ 0xf7, 0x71, 0x77, 0x12, 0xf7, 0xe8, 0xf7, 0x1b,
+ 0x13, 0x90, 0x40, 0x1d, 0x13, 0x78, 0x41, 0xa,
+ 0xfb, 0x28, 0xf7, 0x46, 0x24, 0xa, 0x8e, 0x1d,
+ 0xf7, 0x73, 0x77, 0x1, 0xd6, 0xdf, 0xf7, 0x75,
+ 0xe1, 0x3, 0x90, 0xfb, 0x5b, 0x15, 0x79, 0xf7,
+ 0x86, 0x9d, 0x7, 0x43, 0x7b, 0xa0, 0xcb, 0x1f,
+ 0xf7, 0x27, 0x7, 0x5f, 0x1d, 0x75, 0x1f, 0x89,
+ 0x8d, 0x5, 0x8c, 0xf7, 0xbb, 0x6, 0x86, 0x8e,
+ 0x6b, 0x1d, 0x76, 0x6d, 0x1f, 0xfd, 0x4a, 0x7,
+ 0x60, 0x87, 0x6c, 0x49, 0x87, 0x1e, 0xf7, 0x2e,
+ 0xf7, 0xb3, 0x15, 0x5a, 0xa, 0x96, 0xa, 0xf8,
+ 0xbb, 0xf7, 0x50, 0x27, 0xef, 0x12, 0xf1, 0xed,
+ 0xf0, 0xed, 0x13, 0xac, 0x40, 0x1d, 0x13, 0x6c,
+ 0x41, 0xa, 0xfb, 0x9b, 0xf7, 0x88, 0x15, 0x13,
+ 0x9c, 0x4b, 0xa, 0x8f, 0xa, 0xf8, 0x60, 0x27,
+ 0xa, 0xe, 0xf7, 0x92, 0x8b, 0x9e, 0xf9, 0x4,
+ 0x9e, 0x1, 0xee, 0x5d, 0x1d, 0x9b, 0xd4, 0x1f,
+ 0xf7, 0x40, 0x7, 0xf7, 0x2f, 0xe9, 0x5, 0xbc,
+ 0x7, 0xfb, 0x2f, 0x2c, 0x5, 0xf7, 0x50, 0x7,
+ 0xe1, 0x73, 0x1d, 0xfb, 0x88, 0x7, 0x34, 0x55,
+ 0x5, 0x5a, 0x7, 0xe2, 0xc0, 0x5, 0xfb, 0xb,
+ 0x7, 0x33, 0x7a, 0xa, 0xe, 0x8f, 0xa, 0xf9,
+ 0x3, 0x9b, 0xb7, 0x77, 0x1, 0xe1, 0xdf, 0x3,
+ 0x9e, 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x51, 0x8e,
+ 0x78, 0x9d, 0xc5, 0x1a, 0xf7, 0xcd, 0x7, 0xd8,
+ 0xbf, 0x5, 0xb7, 0x7, 0x3e, 0x56, 0x5, 0xf7,
+ 0x7b, 0x5d, 0xa, 0xfb, 0x40, 0x7, 0x3c, 0x56,
+ 0x5, 0x5f, 0x7, 0xda, 0xbf, 0x5, 0xfb, 0x91,
+ 0x7, 0x57, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+ 0xa8, 0x85, 0xb0, 0x6c, 0xb2, 0xf7, 0xb6, 0xb0,
+ 0xf7, 0x9e, 0xa9, 0x6d, 0xaf, 0x6b, 0xaf, 0x12,
+ 0xa9, 0xf7, 0x4, 0xf7, 0xb5, 0xef, 0xf7, 0x7b,
+ 0xa1, 0x13, 0xa7, 0x0, 0xf8, 0xa7, 0xf7, 0xdd,
+ 0x15, 0xf7, 0x2c, 0x88, 0x8a, 0x81, 0xa4, 0x1f,
+ 0xab, 0x81, 0x9f, 0x6d, 0x90, 0x5a, 0x8, 0x13,
+ 0xa7, 0x80, 0xa1, 0xf7, 0x7e, 0x75, 0x6, 0x2a,
+ 0x7d, 0x85, 0x8b, 0xfb, 0x67, 0x1b, 0xf7, 0x80,
+ 0x7, 0x9e, 0x8f, 0x90, 0xf7, 0x4, 0xf7, 0x4,
+ 0xb8, 0x84, 0x29, 0x96, 0x1e, 0xa2, 0xf7, 0x21,
+ 0xfb, 0xda, 0x6, 0x64, 0x66, 0x8d, 0x8c, 0x6e,
+ 0x1f, 0x13, 0xab, 0x0, 0x8d, 0x6e, 0x77, 0x8c,
+ 0x84, 0x1b, 0xfb, 0x4a, 0xfb, 0x1f, 0x24, 0xfb,
+ 0x8f, 0xfb, 0x64, 0xf7, 0x18, 0xfb, 0x4, 0xf7,
+ 0x29, 0xa9, 0xa8, 0x8d, 0x8c, 0xa9, 0x1f, 0x13,
+ 0x67, 0x0, 0x8d, 0xa9, 0xaa, 0x8c, 0xa9, 0x1b,
+ 0xf7, 0xf2, 0x6, 0xb7, 0xf7, 0x3c, 0x5, 0x73,
+ 0x6, 0x52, 0xfb, 0x2, 0x5e, 0x7b, 0x5b, 0x89,
+ 0xfb, 0x10, 0x89, 0x18, 0x67, 0x77, 0x8d, 0xb7,
+ 0x1f, 0x27, 0xba, 0x15, 0x13, 0xb3, 0x0, 0x56,
+ 0x7d, 0x5c, 0x37, 0xfb, 0x23, 0x5b, 0xf7, 0x16,
+ 0xf7, 0x3d, 0xf7, 0x34, 0xbf, 0xf7, 0x22, 0xf7,
+ 0x1e, 0xe3, 0x96, 0x54, 0x59, 0x1e, 0xe, 0xf8,
+ 0x1, 0x81, 0xa5, 0x71, 0xce, 0xf7, 0x66, 0xa9,
+ 0xf7, 0x1a, 0xa8, 0x12, 0xa9, 0xe5, 0xf7, 0x73,
+ 0xd8, 0xf7, 0x33, 0xea, 0x13, 0x7e, 0xf8, 0x13,
+ 0xe0, 0x15, 0x4c, 0xa4, 0xb3, 0x6b, 0xcc, 0x1b,
+ 0xec, 0xbc, 0xdd, 0xce, 0xaa, 0x1f, 0x80, 0x91,
+ 0x5, 0x6e, 0x76, 0x60, 0x50, 0x4b, 0x1b, 0xfb,
+ 0xf, 0x85, 0xf7, 0x32, 0xbf, 0x89, 0x1f, 0xf7,
+ 0x92, 0x6, 0xf7, 0x36, 0xfb, 0xa, 0xaa, 0x62,
+ 0x40, 0x6a, 0x5e, 0x6c, 0x74, 0x1e, 0xd0, 0x54,
+ 0x4a, 0x92, 0x6e, 0x1b, 0xfb, 0x43, 0x6d, 0xfb,
+ 0x48, 0x50, 0xfb, 0x3e, 0xf7, 0x8, 0x4e, 0xe9,
+ 0xa3, 0xd5, 0x8f, 0xe6, 0xb8, 0x1f, 0xfb, 0x9b,
+ 0xf7, 0x58, 0x15, 0xf7, 0xc, 0xcc, 0xa9, 0xb5,
+ 0xf7, 0x1, 0x92, 0xfb, 0x3c, 0x52, 0x1e, 0x13,
+ 0xbe, 0xfb, 0x6, 0x71, 0x3f, 0x3d, 0xfb, 0x7,
+ 0x87, 0xf7, 0x4c, 0xdc, 0x1e, 0xf7, 0xbf, 0x9b,
+ 0x15, 0xa8, 0x8d, 0xf4, 0xdc, 0xbc, 0xa7, 0x50,
+ 0x5b, 0x1e, 0x70, 0x7, 0xe, 0xf7, 0x5b, 0x7d,
+ 0xaf, 0x7d, 0x76, 0xf9, 0x1c, 0xb4, 0xf7, 0x66,
+ 0x77, 0x12, 0xd2, 0xe1, 0xf7, 0x7d, 0xf0, 0x13,
+ 0x7c, 0xd3, 0x7e, 0x15, 0xa1, 0x6, 0x9b, 0x9f,
+ 0x9c, 0xa0, 0x1e, 0x13, 0xbc, 0xa9, 0xb2, 0x69,
+ 0xd7, 0x1b, 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf5,
+ 0x32, 0xc4, 0x35, 0xbd, 0x1f, 0x3a, 0xba, 0x3d,
+ 0xb5, 0xd4, 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4,
+ 0xcb, 0x31, 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x75,
+ 0x86, 0x1d, 0x72, 0x5f, 0xad, 0x4f, 0x55, 0xa,
+ 0x74, 0x6, 0x13, 0x7c, 0xf7, 0x61, 0xf8, 0x9c,
+ 0x31, 0xa, 0xab, 0x81, 0xa1, 0x90, 0x76, 0xf7,
+ 0x30, 0x77, 0xf7, 0xb0, 0xa2, 0x97, 0x77, 0xf7,
+ 0x87, 0x77, 0x12, 0xf7, 0xac, 0xd1, 0x13, 0x76,
+ 0xbf, 0x87, 0x15, 0x98, 0x6, 0x94, 0x91, 0x99,
+ 0x8e, 0x97, 0x1b, 0x9b, 0x8c, 0x9e, 0x84, 0xa0,
+ 0x86, 0x8, 0x13, 0xb6, 0x87, 0x9a, 0x9b, 0x88,
+ 0x9e, 0x1b, 0xcb, 0xde, 0xb5, 0xe2, 0xc7, 0x66,
+ 0x66, 0xa, 0xb7, 0xb8, 0x76, 0x25, 0xa1, 0x1e,
+ 0x9a, 0x6, 0x13, 0xae, 0x87, 0xf7, 0x1d, 0x5,
+ 0x80, 0x6, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b,
+ 0x82, 0x80, 0x91, 0x91, 0x7c, 0x1f, 0x13, 0xb6,
+ 0x8f, 0x7f, 0x7b, 0x7c, 0x1d, 0xe5, 0x58, 0xa1,
+ 0x73, 0x6b, 0x1a, 0x52, 0x5a, 0x95, 0xa, 0x7b,
+ 0x6, 0x13, 0x76, 0xf7, 0x3, 0xf7, 0xf7, 0x31,
+ 0xa, 0x80, 0x1d, 0xf9, 0x17, 0x97, 0xa, 0xe8,
+ 0xef, 0x12, 0xf7, 0x69, 0xed, 0x8f, 0xf1, 0x82,
+ 0xed, 0x13, 0xcc, 0x68, 0xa, 0xa3, 0xdd, 0x1a,
+ 0xf7, 0x45, 0x7e, 0x1d, 0x13, 0x3c, 0x4b, 0x1d,
+ 0x7, 0x13, 0x4c, 0x5e, 0x1d, 0x8a, 0xf9, 0x92,
+ 0x15, 0x13, 0x9a, 0x6f, 0x9f, 0x35, 0x1d, 0x77,
+ 0x62, 0x1d, 0xf7, 0x5b, 0x16, 0x6f, 0x9f, 0x35,
+ 0x1d, 0x77, 0x62, 0x1d, 0xe, 0x7b, 0xa, 0x8b,
+ 0x77, 0xf8, 0xf2, 0xb1, 0xf7, 0x74, 0x77, 0x1,
+ 0xaa, 0xa5, 0xf8, 0x99, 0xa2, 0x3f, 0x1d, 0xf7,
+ 0x9d, 0xf9, 0x54, 0x31, 0xa, 0xe2, 0x8b, 0xa9,
+ 0xf8, 0x1a, 0xa9, 0xf7, 0x74, 0x77, 0x6a, 0xa,
+ 0x7a, 0x6c, 0x21, 0x1b, 0xfb, 0x13, 0x56, 0x1d,
+ 0xf7, 0x38, 0xf8, 0x80, 0x31, 0xa, 0xfb, 0x51,
+ 0xa3, 0xf8, 0xb1, 0xaa, 0xf7, 0x84, 0xa8, 0x1,
+ 0xeb, 0xf8, 0xc, 0x15, 0xf7, 0xd, 0x6, 0x63,
+ 0xfc, 0x3, 0x5, 0x38, 0x84, 0x79, 0x30, 0x50,
+ 0x1b, 0x80, 0x83, 0x91, 0x92, 0x1f, 0x95, 0x9a,
+ 0x96, 0x9e, 0x1a, 0xa2, 0x7d, 0x99, 0x75, 0x7e,
+ 0x6a, 0x83, 0x67, 0x65, 0xa8, 0x6b, 0xbd, 0xeb,
+ 0xba, 0xf1, 0xf7, 0x43, 0xac, 0x1e, 0x9a, 0xda,
+ 0x93, 0xe4, 0x9c, 0xf7, 0xc, 0x8, 0xf7, 0xc,
+ 0x6, 0x95, 0xaa, 0x5, 0xfb, 0x12, 0x6, 0xf7,
+ 0x18, 0x97, 0x99, 0xf7, 0x0, 0xcc, 0x1b, 0x96,
+ 0x96, 0x89, 0x80, 0x1f, 0x82, 0x7e, 0x7f, 0x7b,
+ 0x1a, 0x7f, 0x97, 0x75, 0xa4, 0xa3, 0xa2, 0x9c,
+ 0xa9, 0xa8, 0x6c, 0xb0, 0x57, 0xfb, 0x26, 0x6c,
+ 0xfb, 0x6f, 0x59, 0x84, 0x1e, 0xfb, 0x9, 0x6,
+ 0xe, 0x91, 0xa, 0x96, 0xf8, 0x8f, 0x2b, 0x1d,
+ 0xfb, 0xf, 0xf7, 0x3b, 0x5, 0x49, 0x6, 0xe,
+ 0x91, 0xa, 0xf7, 0x1b, 0xf8, 0x8f, 0x31, 0xa,
+ 0x73, 0xf8, 0x8f, 0xc0, 0xf3, 0x77, 0x1, 0xa5,
+ 0xf9, 0x2c, 0x15, 0x6e, 0x9b, 0xfb, 0x14, 0xf7,
+ 0xe, 0xf7, 0x14, 0x9a, 0xf7, 0x12, 0xaa, 0x1e,
+ 0x6e, 0x6, 0x4e, 0x82, 0x5c, 0x60, 0x53, 0x1b,
+ 0x4b, 0x66, 0xb6, 0xc8, 0x81, 0x1f, 0xe, 0x73,
+ 0xf8, 0x9f, 0xef, 0x1, 0xf7, 0xa, 0xed, 0x3,
+ 0xf7, 0xa, 0xf8, 0xd1, 0x15, 0x36, 0xa, 0xe,
+ 0x73, 0xf8, 0x94, 0xad, 0xf7, 0x17, 0xad, 0x12,
+ 0xce, 0xf7, 0x5b, 0x69, 0xad, 0x13, 0xe0, 0xce,
+ 0xf8, 0xf7, 0x15, 0x55, 0xb5, 0x5e, 0xc4, 0x79,
+ 0x1d, 0x53, 0x60, 0x5d, 0x55, 0x1e, 0xad, 0x8c,
+ 0x15, 0xa3, 0x9f, 0xb4, 0xb8, 0x1e, 0x13, 0xd0,
+ 0xb0, 0xa8, 0x6d, 0x67, 0x67, 0x6e, 0x6e, 0x65,
+ 0x5e, 0x78, 0xb4, 0xa4, 0x1f, 0xe, 0x73, 0xfb,
+ 0x24, 0x76, 0xf7, 0x39, 0x77, 0x1, 0xcb, 0xc0,
+ 0x3, 0xf7, 0xc, 0x16, 0x72, 0x7b, 0x6c, 0x61,
+ 0x64, 0x1a, 0x6d, 0xa0, 0x65, 0xc5, 0xb4, 0xbd,
+ 0xa9, 0xc2, 0x9a, 0x1e, 0x7b, 0x92, 0x5, 0x6c,
+ 0x81, 0x68, 0x7b, 0x6e, 0x1b, 0x73, 0x79, 0x99,
+ 0xa8, 0xab, 0xa8, 0xaa, 0x9d, 0x99, 0x1f, 0xe,
+ 0x73, 0xf8, 0xa8, 0xf5, 0x1, 0x8c, 0xf8, 0xa8,
+ 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x98, 0xb9, 0xaf,
+ 0x7f, 0x8, 0x6c, 0xe5, 0x9f, 0x77, 0x52, 0x1d,
+ 0x7a, 0x63, 0x7c, 0x79, 0x71, 0x93, 0x8, 0xa2,
+ 0x43, 0x5e, 0xa6, 0x76, 0x54, 0xa, 0x73, 0xf8,
+ 0x8f, 0xf7, 0x3f, 0x1, 0x88, 0xf8, 0x8f, 0x15,
+ 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0x94, 0xfb,
+ 0x28, 0x15, 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d,
+ 0xe, 0x8a, 0xa, 0xf8, 0x88, 0xb4, 0xfc, 0x88,
+ 0x6, 0xe, 0xf9, 0x17, 0x8a, 0xa, 0xfa, 0x7c,
+ 0xb4, 0xfe, 0x7c, 0x6, 0xe, 0x91, 0x1d, 0xf7,
+ 0x7, 0xf7, 0x1f, 0x3, 0xf7, 0x80, 0xf9, 0x25,
+ 0x15, 0x51, 0xa, 0x6b, 0x99, 0x71, 0x84, 0x87,
+ 0x88, 0x89, 0x86, 0x1e, 0x89, 0x87, 0x87, 0x8a,
+ 0x87, 0x64, 0xa, 0xe, 0x91, 0x1d, 0xda, 0xf7,
+ 0x1f, 0x3, 0xf5, 0xf8, 0x45, 0x15, 0x3c, 0xa,
+ 0xad, 0x7c, 0xa5, 0x92, 0x92, 0x91, 0x8c, 0x8e,
+ 0x1e, 0x54, 0x1d, 0x73, 0xfb, 0xc, 0x76, 0xf7,
+ 0x2d, 0x76, 0xa7, 0x76, 0xf3, 0x77, 0x12, 0xda,
+ 0xf7, 0x1f, 0x13, 0xd8, 0xec, 0xfb, 0xe, 0x15,
+ 0x94, 0x78, 0x5, 0x3c, 0xa, 0xad, 0x7e, 0xa5,
+ 0x92, 0x92, 0x5c, 0xa, 0xe2, 0xf8, 0x45, 0xf7,
+ 0x3, 0xf7, 0x18, 0x77, 0x1, 0xb6, 0x97, 0x1d,
+ 0x3, 0xf7, 0x38, 0xf9, 0x25, 0x15, 0x48, 0x1d,
+ 0xf7, 0x7c, 0x16, 0x48, 0x1d, 0xe, 0xe2, 0xf8,
+ 0x5a, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x1, 0xa9,
+ 0x97, 0x1d, 0x3, 0xc4, 0xf8, 0x45, 0x48, 0xa,
+ 0xf7, 0x85, 0x78, 0x48, 0xa, 0xe, 0xe2, 0xfb,
+ 0xc, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x38, 0x76,
+ 0x12, 0xb8, 0x97, 0x1d, 0x13, 0xd8, 0xca, 0xfb,
+ 0xe, 0x15, 0x94, 0x78, 0x5, 0x46, 0x1d, 0x13,
+ 0xb8, 0x33, 0xa, 0xf7, 0x7c, 0x16, 0x94, 0x78,
+ 0x5, 0xa9, 0x95, 0xdd, 0xcd, 0xd2, 0x1a, 0x13,
+ 0xd8, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0x7c,
+ 0x60, 0x63, 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x5c,
+ 0xa, 0xfb, 0x14, 0x76, 0xf8, 0xbd, 0xe2, 0xf7,
+ 0x4d, 0x77, 0x1, 0xf7, 0x84, 0xa2, 0x3, 0xf7,
+ 0x85, 0xfb, 0x29, 0x15, 0xa0, 0x6, 0x8c, 0xf7,
+ 0x23, 0x5, 0xf7, 0xf, 0xa0, 0xec, 0x9e, 0xb2,
+ 0x1e, 0x61, 0xb6, 0x8b, 0xeb, 0xb9, 0x1a, 0xb2,
+ 0x88, 0xa2, 0x84, 0x9c, 0x84, 0x8, 0x82, 0xa0,
+ 0x98, 0x83, 0xa4, 0x1b, 0x9d, 0xa4, 0x94, 0xae,
+ 0xaa, 0x74, 0x97, 0x79, 0x72, 0x7d, 0x81, 0x82,
+ 0x76, 0x1f, 0x79, 0x83, 0x75, 0x84, 0x63, 0x8a,
+ 0x8, 0xc2, 0x92, 0xaa, 0x93, 0xa1, 0x1e, 0x95,
+ 0xa5, 0x96, 0x98, 0xa5, 0x1a, 0xa4, 0x75, 0xa1,
+ 0x73, 0x71, 0x76, 0x75, 0x72, 0x71, 0x96, 0x7e,
+ 0x95, 0x71, 0x1e, 0x93, 0x75, 0x92, 0x6c, 0x54,
+ 0x1a, 0x5f, 0x8c, 0x73, 0x94, 0x78, 0x94, 0x8,
+ 0x93, 0x79, 0x7e, 0x93, 0x75, 0x1b, 0x79, 0x74,
+ 0x7f, 0x6c, 0x68, 0xa2, 0x82, 0x9d, 0xa1, 0x98,
+ 0x91, 0x92, 0x9c, 0x1f, 0x9e, 0x93, 0xa2, 0x95,
+ 0xb9, 0x8e, 0x8, 0x5d, 0x8b, 0x2b, 0x61, 0x60,
+ 0x1e, 0x9c, 0x64, 0xa2, 0x2a, 0x8d, 0xfb, 0xf,
+ 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x38, 0xe1,
+ 0x7e, 0x76, 0xf8, 0x50, 0xe1, 0xf7, 0x38, 0x77,
+ 0x12, 0xcf, 0xf7, 0x54, 0x4f, 0xef, 0x4f, 0x9f,
+ 0x77, 0xf7, 0x54, 0x13, 0xd9, 0x0, 0xf7, 0x84,
+ 0x16, 0x13, 0xda, 0x0, 0x76, 0xa, 0x13, 0xd9,
+ 0x0, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x8c, 0x5d,
+ 0x62, 0x52, 0x63, 0x1a, 0x13, 0xdc, 0x0, 0x6d,
+ 0xa0, 0x72, 0xa8, 0xa8, 0xa0, 0xa4, 0xa9, 0x1e,
+ 0x13, 0xb9, 0x0, 0xb3, 0x62, 0xc4, 0x8c, 0xb9,
+ 0x1e, 0x78, 0x1d, 0x5f, 0x6a, 0x69, 0x5a, 0x1b,
+ 0x13, 0xdc, 0x0, 0x8f, 0xb3, 0x98, 0xa1, 0xa9,
+ 0xa0, 0x8, 0x67, 0xb6, 0x80, 0xc6, 0xc1, 0x1a,
+ 0xc1, 0x96, 0xc6, 0xaf, 0xb6, 0x1e, 0x13, 0xd9,
+ 0x0, 0x6d, 0xa0, 0x7e, 0xa1, 0x87, 0xb3, 0x8,
+ 0x13, 0xda, 0x0, 0x78, 0x1d, 0x13, 0xdc, 0x0,
+ 0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x8a, 0xb9, 0xb4,
+ 0xc4, 0xb3, 0x1a, 0x13, 0xd8, 0x80, 0xa9, 0x76,
+ 0xa4, 0x6e, 0x6e, 0x76, 0x72, 0x6d, 0x1e, 0x13,
+ 0xbc, 0x0, 0x63, 0xb4, 0x52, 0x8a, 0x5d, 0x1e,
+ 0x76, 0xa, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x87,
+ 0x63, 0x7e, 0x75, 0x6d, 0x76, 0x8, 0x13, 0xd8,
+ 0x80, 0xaf, 0x60, 0x96, 0x50, 0x55, 0x1a, 0x55,
+ 0x80, 0x50, 0x67, 0x60, 0x1e, 0x13, 0xd9, 0x0,
+ 0xa9, 0x76, 0x98, 0x75, 0x8f, 0x63, 0x8, 0xe,
+ 0x84, 0xf7, 0x6d, 0x76, 0xf7, 0xa2, 0x77, 0x1,
+ 0xb3, 0xf7, 0xdf, 0x15, 0x40, 0xc7, 0x4f, 0xd6,
+ 0xd6, 0xc7, 0xc8, 0xd5, 0xd6, 0x4f, 0xc7, 0x40,
+ 0x3f, 0x50, 0x4f, 0x40, 0x1e, 0xe, 0xf9, 0x17,
+ 0x80, 0xf7, 0x3, 0x1, 0xf7, 0x3, 0xf7, 0x4,
+ 0xf7, 0x70, 0xf7, 0x5, 0xf7, 0x70, 0xf7, 0x4,
+ 0x14, 0x70, 0xf7, 0x3, 0xb6, 0x15, 0x65, 0xad,
+ 0x81, 0xa, 0x72, 0x99, 0xa, 0xf7, 0xe0, 0x16,
+ 0x65, 0xae, 0x81, 0xa, 0x71, 0x99, 0xa, 0xf7,
+ 0xe1, 0x16, 0x65, 0xae, 0x4d, 0x1d, 0x71, 0x99,
+ 0xa, 0xe, 0xf9, 0x17, 0x7f, 0xa8, 0x6f, 0x76,
+ 0xf7, 0xcd, 0xa7, 0x90, 0xa8, 0xf7, 0x9b, 0xa8,
+ 0x9c, 0x77, 0x12, 0xb2, 0xd4, 0xf7, 0x1f, 0xd4,
+ 0xb7, 0xd4, 0xf7, 0x1f, 0xd4, 0xa9, 0xd3, 0xf7,
+ 0x20, 0xd4, 0x13, 0x77, 0xf0, 0xf7, 0xe, 0x82,
+ 0x15, 0xaa, 0x74, 0xf8, 0x27, 0xf9, 0x29, 0x6b,
+ 0xa2, 0x5, 0x13, 0xbb, 0xf0, 0xfc, 0x79, 0xfb,
+ 0x57, 0x15, 0x3e, 0x8d, 0x1d, 0xed, 0x28, 0x1e,
+ 0x8a, 0x6, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0xd4,
+ 0x8c, 0x15, 0xbe, 0x95, 0xec, 0xc7, 0x1e, 0x8c,
+ 0x6, 0xc8, 0x92, 0x28, 0x59, 0x5d, 0x84, 0x25,
+ 0x4e, 0x50, 0x7f, 0xf0, 0xbb, 0x1f, 0xf7, 0x94,
+ 0xfb, 0xb9, 0x15, 0x3d, 0xb6, 0x28, 0xef, 0xee,
+ 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xee, 0x29, 0x1e,
+ 0x8a, 0x6, 0x27, 0x60, 0x28, 0x3c, 0x1f, 0xf7,
+ 0xcf, 0x16, 0x3d, 0x8d, 0x1d, 0xee, 0x28, 0x1e,
+ 0x8a, 0x6, 0x28, 0x60, 0x28, 0x3c, 0x1f, 0xfb,
+ 0x86, 0x8c, 0x15, 0xbd, 0x94, 0xed, 0xc8, 0x1e,
+ 0x8c, 0x6, 0xc8, 0x92, 0x27, 0x5a, 0x5d, 0x83,
+ 0x25, 0x4f, 0x4d, 0x82, 0xf0, 0xbb, 0x1f, 0xf7,
+ 0xce, 0x16, 0xbd, 0x96, 0xed, 0xc6, 0x1e, 0x8c,
+ 0x6, 0xc9, 0x92, 0x27, 0x5a, 0x5d, 0x83, 0x25,
+ 0x4e, 0x4e, 0x81, 0xef, 0xbc, 0x1f, 0xe, 0x73,
+ 0x79, 0xa, 0xca, 0xf7, 0x77, 0x42, 0x1d, 0x97,
+ 0x9b, 0xb1, 0xbc, 0xab, 0xb6, 0x8, 0xa5, 0xae,
+ 0xa0, 0xaa, 0x91, 0x96, 0x1d, 0x73, 0x79, 0xa,
+ 0xc6, 0xac, 0x15, 0xf7, 0x67, 0xf7, 0x51, 0x5,
+ 0xaa, 0x5e, 0xfb, 0x2d, 0xf7, 0x37, 0x51, 0x1d,
+ 0x7e, 0x7a, 0x61, 0x55, 0x6a, 0x5e, 0x8, 0x74,
+ 0x6b, 0x79, 0x71, 0x8f, 0x1d, 0xfb, 0x52, 0x92,
+ 0x7a, 0x1d, 0xfb, 0x3c, 0xf8, 0x87, 0x3, 0xfb,
+ 0xb, 0x7d, 0x15, 0xf8, 0x56, 0xf9, 0x46, 0x5,
+ 0x5d, 0x6, 0xfc, 0x59, 0xfd, 0x46, 0x5, 0xe,
+ 0xf8, 0x1, 0x8b, 0xc3, 0xf7, 0x57, 0xb3, 0xe4,
+ 0xb3, 0xf7, 0x6c, 0xb1, 0x1, 0xf7, 0x26, 0xf7,
+ 0x4, 0x2f, 0xf7, 0x4, 0xf8, 0x14, 0xa5, 0x3,
+ 0xf7, 0x3a, 0xf7, 0x8f, 0x15, 0xfb, 0x2a, 0x9a,
+ 0xf7, 0x1e, 0x26, 0xf7, 0x15, 0x1b, 0xf7, 0xb,
+ 0xdc, 0xc9, 0xd9, 0xc5, 0x1f, 0x77, 0x95, 0x5,
+ 0x5f, 0x56, 0x59, 0x59, 0x51, 0x1b, 0xfb, 0x6,
+ 0xfb, 0x18, 0xc8, 0xf7, 0x1a, 0x8a, 0x1f, 0xf7,
+ 0xc3, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xd2, 0x6,
+ 0x89, 0xab, 0x89, 0xa5, 0x8f, 0xaa, 0x8, 0xf7,
+ 0xe4, 0x6, 0x9a, 0xb3, 0x5, 0xfb, 0xee, 0x6,
+ 0xf7, 0x16, 0xf1, 0xe0, 0xf5, 0x8c, 0x1e, 0xf7,
+ 0x11, 0xba, 0x51, 0x2c, 0x1f, 0xa5, 0xf7, 0x26,
+ 0x6, 0xa4, 0x49, 0x64, 0x9f, 0x23, 0x1b, 0xfb,
+ 0x18, 0xfb, 0x7, 0x68, 0xfb, 0x6f, 0x4d, 0x1f,
+ 0xfb, 0xc, 0x6, 0x7c, 0x63, 0x5, 0xf7, 0x16,
+ 0x6, 0x88, 0x6d, 0x8a, 0x6e, 0x8d, 0x6d, 0x8,
+ 0xfb, 0x5, 0x6, 0x7c, 0x63, 0x5, 0xe, 0xf9,
+ 0x3, 0xf7, 0x96, 0x9f, 0x8a, 0x76, 0xf8, 0x16,
+ 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, 0xa5,
+ 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9, 0xf7,
+ 0x96, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57, 0x91,
+ 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, 0x7,
+ 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f, 0xe3,
+ 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94, 0x9c,
+ 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6, 0x5b,
+ 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3, 0x77,
+ 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f, 0x83,
+ 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7, 0x13,
+ 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96, 0x6,
+ 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb, 0x72,
+ 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57, 0x85,
+ 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57, 0x91,
+ 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7, 0xae,
+ 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24, 0x7,
+ 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7, 0xc9,
+ 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7, 0x77,
+ 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f, 0x83,
+ 0x70, 0x5f, 0x84, 0x1d, 0xf7, 0x63, 0xf7, 0x70,
+ 0xcd, 0x12, 0x13, 0x80, 0xa9, 0xf7, 0x70, 0x15,
+ 0xf8, 0x8c, 0xba, 0xfc, 0x8c, 0x6, 0xe, 0x99,
+ 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x64, 0xa4, 0x1,
+ 0xee, 0xdf, 0xf7, 0x4f, 0xdf, 0x3, 0xaa, 0x16,
+ 0xf7, 0x71, 0x9a, 0x6, 0x48, 0x8e, 0x89, 0xb3,
+ 0xb3, 0x1a, 0xf7, 0xd4, 0x7, 0xa0, 0xf7, 0x9,
+ 0x89, 0x8a, 0x98, 0x1f, 0xac, 0x86, 0x8e, 0x80,
+ 0x65, 0x1a, 0xfb, 0x92, 0x7, 0x4f, 0x89, 0x6f,
+ 0x48, 0x87, 0x1e, 0x7c, 0xf7, 0x70, 0x9a, 0x7,
+ 0x58, 0x8f, 0x7b, 0x9f, 0xcf, 0x1a, 0xf7, 0x90,
+ 0x7, 0xa4, 0x8c, 0xb4, 0x8c, 0xab, 0x1e, 0x87,
+ 0x8e, 0x5, 0x85, 0x6a, 0x60, 0x87, 0x66, 0x1b,
+ 0xfb, 0x31, 0x6, 0x8a, 0xce, 0x8b, 0xba, 0x97,
+ 0xa9, 0x8, 0xa8, 0x97, 0xad, 0xae, 0xba, 0x1b,
+ 0xac, 0x9d, 0x7a, 0x78, 0x99, 0x1f, 0x74, 0x9c,
+ 0x97, 0x72, 0xa8, 0x1b, 0x9e, 0x9b, 0x9c, 0x9f,
+ 0xbf, 0x4e, 0x9f, 0x4a, 0xfb, 0x20, 0x42, 0x36,
+ 0xfb, 0x28, 0x86, 0x1f, 0x46, 0x6b, 0xcf, 0xfb,
+ 0xd5, 0x6, 0x51, 0x78, 0x74, 0x5a, 0x8a, 0x1e,
+ 0xe, 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x62,
+ 0xa6, 0x1, 0xf0, 0xdf, 0xf7, 0x50, 0xdf, 0x3,
+ 0xab, 0x16, 0xf7, 0x74, 0x9a, 0x6, 0x61, 0x8f,
+ 0x6e, 0x9a, 0xc2, 0x1a, 0xf7, 0xdd, 0xf7, 0x50,
+ 0xfb, 0xd8, 0x7, 0x4d, 0x6a, 0x7d, 0x69, 0x88,
+ 0x1e, 0x7c, 0xf7, 0x6b, 0x9a, 0x7, 0x51, 0x8e,
+ 0x85, 0xa6, 0xb9, 0x1a, 0xf8, 0xe2, 0x7, 0x86,
+ 0x8d, 0x5, 0x8a, 0x7f, 0x5d, 0x73, 0x7d, 0x1b,
+ 0x7c, 0x7e, 0x94, 0x92, 0x76, 0x1f, 0x90, 0x7c,
+ 0x78, 0x8f, 0x71, 0x1b, 0x61, 0xfb, 0x11, 0x78,
+ 0xfb, 0x6a, 0x8a, 0x1f, 0x44, 0x6b, 0xd0, 0xfb,
+ 0xdd, 0x6, 0x69, 0x78, 0x67, 0x59, 0x87, 0x1e,
+ 0xf7, 0x2d, 0xf8, 0x47, 0x15, 0xe5, 0x89, 0x89,
+ 0xf7, 0x8, 0xd1, 0x1b, 0xa9, 0x96, 0x78, 0x79,
+ 0x97, 0x1f, 0x79, 0x97, 0x97, 0x7a, 0xa9, 0x1b,
+ 0x94, 0x8e, 0x8f, 0x8e, 0x8e, 0x1f, 0xfb, 0x21,
+ 0x7, 0xe, 0x7d, 0x99, 0xf8, 0x56, 0x95, 0xf7,
+ 0x5e, 0x99, 0x6, 0xfb, 0x6e, 0x8c, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+ 0xdf, 0xb, 0xa7, 0x93, 0x8d, 0x8e, 0xc, 0xc,
+ 0xdf, 0x91, 0x97, 0xc, 0xd, 0xf8, 0x88, 0x14,
+ 0xf7, 0xf9, 0x15, 0xb6, 0x13, 0x0, 0x7b, 0x2,
+ 0x0, 0x1, 0x0, 0x36, 0x0, 0x3f, 0x0, 0x4f,
+ 0x0, 0x69, 0x0, 0x6c, 0x0, 0x75, 0x0, 0x8f,
+ 0x0, 0x96, 0x0, 0x9b, 0x0, 0xa6, 0x0, 0xb1,
+ 0x0, 0xcc, 0x0, 0xd3, 0x0, 0xdc, 0x0, 0xee,
+ 0x0, 0xff, 0x1, 0x7, 0x1, 0x1b, 0x1, 0x30,
+ 0x1, 0x37, 0x1, 0x43, 0x1, 0x65, 0x1, 0x6e,
+ 0x1, 0x79, 0x1, 0x7e, 0x1, 0x89, 0x1, 0xbd,
+ 0x1, 0xda, 0x1, 0xe0, 0x1, 0xe7, 0x2, 0x1c,
+ 0x2, 0x29, 0x2, 0x34, 0x2, 0x3c, 0x2, 0x52,
+ 0x2, 0x5f, 0x2, 0x78, 0x2, 0x91, 0x2, 0xbb,
+ 0x2, 0xcc, 0x2, 0xd2, 0x2, 0xe0, 0x2, 0xf6,
+ 0x2, 0xfe, 0x3, 0xc, 0x3, 0x14, 0x3, 0x1e,
+ 0x3, 0x28, 0x3, 0x34, 0x3, 0x47, 0x3, 0x52,
+ 0x3, 0x74, 0x3, 0x7b, 0x3, 0x9b, 0x3, 0xba,
+ 0x3, 0xbe, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xf1,
+ 0x3, 0xf9, 0x3, 0xff, 0x4, 0x14, 0x4, 0x1b,
+ 0x4, 0x28, 0x4, 0x2f, 0x4, 0x36, 0x4, 0x3e,
+ 0x4, 0x53, 0x4, 0x5f, 0x4, 0x65, 0x4, 0x78,
+ 0x4, 0x85, 0x4, 0x90, 0x4, 0xa2, 0x4, 0xb4,
+ 0x4, 0xbd, 0x4, 0xcf, 0x4, 0xe1, 0x4, 0xe9,
+ 0x4, 0xef, 0x4, 0xf5, 0x4, 0xfb, 0x5, 0x4,
+ 0x5, 0x15, 0x5, 0x1c, 0x5, 0x26, 0x5, 0x35,
+ 0x5, 0x44, 0x5, 0x4d, 0x5, 0x54, 0x5, 0x5a,
+ 0x5, 0x5f, 0x5, 0x68, 0x5, 0x6b, 0x5, 0x78,
+ 0x5, 0x80, 0x5, 0x85, 0x5, 0x91, 0x5, 0x97,
+ 0x5, 0x9b, 0x5, 0xa6, 0x5, 0xaa, 0x5, 0xb3,
+ 0x5, 0xba, 0x5, 0xbf, 0x5, 0xc4, 0x5, 0xce,
+ 0x5, 0xd8, 0x5, 0xdf, 0x5, 0xe9, 0x5, 0xf3,
+ 0x5, 0xf7, 0x6, 0x0, 0x6, 0x9, 0x6, 0x12,
+ 0x6, 0x1b, 0x6, 0x23, 0x6, 0x2c, 0x6, 0x32,
+ 0x6, 0x38, 0x6, 0x3d, 0x6, 0x41, 0x6, 0x45,
+ 0x9a, 0x16, 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x5c,
+ 0x95, 0xb5, 0x96, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+ 0xb9, 0xf6, 0x5, 0xf7, 0x9a, 0x6, 0xb4, 0x35,
+ 0x5, 0x91, 0x7d, 0x98, 0x6a, 0x7b, 0x1a, 0x66,
+ 0x6a, 0x80, 0x66, 0x1e, 0x78, 0xf7, 0x93, 0x9e,
+ 0x7, 0x5f, 0x8e, 0x7d, 0xa0, 0x6b, 0xd4, 0xfb,
+ 0x8d, 0xf8, 0xc2, 0x18, 0xb, 0x20, 0xa, 0x77,
+ 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0xb, 0x32, 0xa,
+ 0xfb, 0x6b, 0x52, 0xa, 0x73, 0x2c, 0x1d, 0xbc,
+ 0xc7, 0xb9, 0xbd, 0xb2, 0x1e, 0xb, 0x3, 0x31,
+ 0x1d, 0xfb, 0x2f, 0x54, 0x5, 0x7c, 0x7, 0x8d,
+ 0x98, 0x98, 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x72,
+ 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88, 0x1e, 0xb,
+ 0x21, 0x1d, 0xe, 0x15, 0x87, 0xa, 0x8, 0x22,
+ 0xa, 0x2e, 0x7, 0xb, 0x6f, 0xa, 0x44, 0x80,
+ 0x77, 0x73, 0x32, 0x1b, 0xfb, 0x24, 0xf7, 0x46,
+ 0x6, 0xc2, 0x97, 0xa2, 0x33, 0x1d, 0x78, 0x6,
+ 0x60, 0xa, 0xfc, 0x3c, 0x7, 0xb, 0x77, 0x1,
+ 0xea, 0xdf, 0x23, 0xa, 0xb, 0x26, 0x1d, 0x3d,
+ 0x1d, 0xb, 0x28, 0x1d, 0x13, 0xd6, 0x3e, 0x1d,
+ 0x13, 0xba, 0x3c, 0x1d, 0xe, 0x8c, 0xfb, 0x57,
+ 0x15, 0x43, 0x90, 0xb5, 0x80, 0x2f, 0xa, 0xb,
+ 0xf7, 0x3, 0xf7, 0x24, 0xc5, 0xf7, 0x1c, 0xaa,
+ 0x95, 0x1f, 0x7b, 0x92, 0x5, 0x66, 0x74, 0x60,
+ 0x47, 0x32, 0x1b, 0x49, 0x3a, 0xaa, 0xf7, 0x45,
+ 0x7f, 0x1f, 0xb, 0x15, 0xf8, 0xb0, 0x6, 0x23,
+ 0x1d, 0xe, 0x3a, 0x1d, 0x72, 0x88, 0x8b, 0x7b,
+ 0x1b, 0x6c, 0xb, 0x7b, 0x8a, 0x8, 0xf7, 0x5d,
+ 0xf7, 0x82, 0x15, 0xf7, 0x7, 0xf7, 0xa7, 0xf7,
+ 0x8, 0xfb, 0xa7, 0x5, 0xb, 0x9d, 0x1b, 0x9b,
+ 0xaa, 0x8c, 0xbc, 0xb5, 0x1f, 0xa5, 0x7, 0x82,
+ 0x80, 0x7e, 0x81, 0x76, 0x1b, 0xb, 0x6f, 0xa1,
+ 0x35, 0x1d, 0x75, 0x62, 0x1d, 0xb, 0x15, 0xc9,
+ 0x6, 0xf7, 0x11, 0xf7, 0x3b, 0x5, 0x69, 0x6,
+ 0xfb, 0xe, 0x24, 0xfb, 0xd, 0xf2, 0x5, 0x69,
+ 0x6, 0xe, 0x99, 0x7, 0x4f, 0x89, 0x89, 0xa2,
+ 0xaf, 0x1a, 0xf7, 0xeb, 0xfb, 0x32, 0x7a, 0x7,
+ 0xd1, 0x89, 0x8f, 0x6c, 0x63, 0x1a, 0xb, 0x8c,
+ 0x8f, 0x8e, 0x8c, 0x38, 0x1d, 0xb, 0x61, 0xa,
+ 0xfb, 0x0, 0x44, 0x1d, 0xd4, 0xf1, 0xf1, 0xf7,
+ 0x3, 0xb, 0x15, 0xf7, 0x53, 0xa3, 0x6, 0x65,
+ 0x8d, 0x78, 0x9a, 0xa8, 0x1a, 0xf7, 0xe1, 0x7,
+ 0x7d, 0x8e, 0xfb, 0xa, 0x54, 0x5, 0x74, 0x7,
+ 0x98, 0xaf, 0x8b, 0x8b, 0x93, 0x1b, 0x92, 0x8b,
+ 0x7c, 0x7e, 0x1f, 0xb, 0x6f, 0xa0, 0x75, 0x9a,
+ 0x1d, 0xa1, 0x41, 0x1d, 0xb, 0x9d, 0xac, 0xa9,
+ 0xba, 0x80, 0x43, 0x1e, 0x4e, 0x4f, 0xa, 0xb,
+ 0xf9, 0x63, 0x25, 0x1d, 0xb, 0x92, 0x92, 0x86,
+ 0x82, 0x78, 0x7b, 0x5e, 0x49, 0x61, 0x1f, 0xb,
+ 0xf8, 0x4c, 0xfc, 0xb8, 0x5, 0x9c, 0xf8, 0x98,
+ 0x6, 0xf7, 0x9, 0xab, 0x99, 0xca, 0x92, 0x1e,
+ 0x9e, 0xfb, 0x7f, 0x78, 0x7, 0xcf, 0x86, 0xa7,
+ 0x79, 0xfb, 0x7, 0x1a, 0xfb, 0xd8, 0x89, 0x7,
+ 0xfc, 0x13, 0xf8, 0x75, 0x5, 0xfb, 0x3f, 0x78,
+ 0x6, 0xb3, 0x9b, 0x86, 0x59, 0xb4, 0x1f, 0xfc,
+ 0x43, 0x78, 0xa, 0xb, 0xfb, 0x7, 0xf7, 0x87,
+ 0x5, 0x88, 0x92, 0x84, 0x9b, 0x98, 0x1a, 0xa6,
+ 0xae, 0x96, 0xa2, 0x8c, 0x1e, 0x9a, 0xfb, 0x62,
+ 0x7d, 0x7, 0x98, 0x89, 0xa5, 0x7c, 0x97, 0x72,
+ 0xb, 0x3f, 0xa, 0x7c, 0x60, 0x63, 0xb, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0xb, 0x15, 0xfb,
+ 0x53, 0xf7, 0x2a, 0xfb, 0x2d, 0xf7, 0x56, 0xf7,
+ 0x53, 0xf7, 0x29, 0xf7, 0x2d, 0xf7, 0x53, 0xf7,
+ 0x53, 0xfb, 0x29, 0xf7, 0x2f, 0xfb, 0x53, 0xfb,
+ 0x56, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x53, 0x1e,
+ 0xc2, 0x16, 0xf7, 0x35, 0xf7, 0x12, 0xf7, 0x23,
+ 0xf7, 0x37, 0xf7, 0x34, 0xf7, 0x11, 0xfb, 0x22,
+ 0xfb, 0x36, 0xb, 0xa9, 0x95, 0xdd, 0xcd, 0xd2,
+ 0x1a, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0xb,
+ 0x6e, 0x8b, 0xa8, 0xa8, 0x1f, 0xf7, 0x57, 0x7,
+ 0xc7, 0x8b, 0xb, 0x45, 0xa, 0x9a, 0xb4, 0x9f,
+ 0x4a, 0xa, 0xb, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+ 0x3, 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x59,
+ 0xa, 0x9e, 0xfb, 0xbd, 0x78, 0x7, 0x49, 0xa,
+ 0xb, 0x6f, 0xa0, 0x76, 0xa7, 0xa7, 0xa1, 0xa0,
+ 0xa7, 0xa7, 0x75, 0x55, 0x1d, 0xb, 0xa0, 0x6,
+ 0x95, 0xc2, 0xa1, 0xf7, 0x3, 0xa7, 0x1a, 0xa6,
+ 0x74, 0xa3, 0x78, 0x77, 0x74, 0x73, 0x70, 0x6f,
+ 0xa1, 0xfb, 0x3, 0x95, 0x54, 0x1e, 0xb, 0x7e,
+ 0x6c, 0x9d, 0x70, 0x1b, 0x5d, 0x89, 0x65, 0x85,
+ 0x71, 0xa2, 0x6b, 0xbd, 0xd6, 0xb7, 0xcd, 0xf7,
+ 0x1a, 0xbe, 0x1f, 0xf7, 0x2e, 0xf8, 0x22, 0xb,
+ 0x7, 0xf7, 0xf, 0x44, 0xa6, 0x5d, 0x50, 0x65,
+ 0x68, 0x5d, 0x5a, 0x1e, 0xda, 0x7, 0x84, 0x8d,
+ 0x5d, 0x7a, 0x5c, 0x7c, 0x5e, 0x7e, 0x19, 0x7a,
+ 0x7, 0x8d, 0x8f, 0x96, 0x53, 0x1d, 0x4c, 0x1f,
+ 0xfb, 0x82, 0x7, 0x50, 0x7a, 0x74, 0x5c, 0x88,
+ 0x1e, 0xb, 0xfb, 0x42, 0x8b, 0xf7, 0x1f, 0xcb,
+ 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa2, 0xda,
+ 0x91, 0x1e, 0xb, 0x15, 0x46, 0x1d, 0x33, 0xa,
+ 0xb, 0xde, 0x87, 0x99, 0x75, 0x41, 0x89, 0x1d,
+ 0x44, 0x7f, 0x70, 0x36, 0x89, 0x1e, 0xb, 0x97,
+ 0x98, 0x8d, 0x19, 0x9a, 0xfb, 0x1b, 0x7c, 0x7,
+ 0xab, 0x8c, 0x9b, 0x77, 0x78, 0x1a, 0x82, 0x7e,
+ 0x6b, 0x81, 0x70, 0x1e, 0xb, 0x36, 0xa, 0xf7,
+ 0x5b, 0x16, 0x36, 0xa, 0xe, 0x83, 0x1d, 0x96,
+ 0xad, 0xb1, 0x1b, 0x97, 0x98, 0x86, 0x45, 0x1d,
+ 0x76, 0x99, 0xb, 0x2a, 0xa, 0x40, 0xa, 0xef,
+ 0xfb, 0x29, 0xb, 0x6, 0xf7, 0x3, 0xa5, 0x7b,
+ 0x32, 0x9a, 0x1f, 0xa4, 0xb, 0x7, 0xfb, 0x37,
+ 0x4b, 0x34, 0x69, 0x27, 0x1a, 0x48, 0xb, 0x42,
+ 0x1d, 0x96, 0x9a, 0xac, 0xb6, 0xa9, 0xb3, 0x8,
+ 0xa8, 0xb2, 0xb, 0x82, 0x9e, 0x5, 0x6d, 0x81,
+ 0x39, 0x49, 0x44, 0x1a, 0x38, 0xc5, 0x7e, 0xa2,
+ 0xa4, 0xac, 0x9a, 0xb6, 0xb3, 0xb, 0x7, 0x6a,
+ 0x84, 0x81, 0x82, 0x83, 0x1e, 0x75, 0x70, 0x6d,
+ 0xb, 0xf8, 0x31, 0xe5, 0x15, 0xf7, 0x48, 0x31,
+ 0xd1, 0xe5, 0xc2, 0xc4, 0x54, 0xf7, 0x96, 0x5c,
+ 0x6, 0xfb, 0x5f, 0xfb, 0x9e, 0x5, 0xb8, 0x93,
+ 0x15, 0xf7, 0x19, 0xf7, 0x44, 0x5, 0x8d, 0xfb,
+ 0x44, 0x6, 0xb, 0x1b, 0x48, 0x6d, 0x4d, 0x5f,
+ 0x7d, 0xa, 0x1b, 0x31, 0x30, 0x53, 0xfb, 0x6,
+ 0x28, 0xcb, 0x5f, 0xe7, 0x56, 0x1f, 0xf7, 0x27,
+ 0x35, 0x9b, 0x69, 0x52, 0x1a, 0x55, 0x63, 0x52,
+ 0x3b, 0xfb, 0x1b, 0x58, 0xf7, 0x16, 0xba, 0x78,
+ 0x1e, 0xb, 0x6, 0xb0, 0xe0, 0x7a, 0x92, 0x7c,
+ 0x73, 0x7f, 0x89, 0x73, 0x8a, 0x19, 0xfb, 0xd,
+ 0x6, 0xe1, 0xe0, 0x5, 0xa8, 0xa7, 0xc2, 0xc1,
+ 0xcd, 0x1a, 0xce, 0x52, 0xb4, 0x48, 0x40, 0x5a,
+ 0xb, 0x7d, 0x97, 0x7d, 0xa, 0xf7, 0x67, 0xf7,
+ 0x51, 0x5, 0xa9, 0x5d, 0xfb, 0x2c, 0xf7, 0x38,
+ 0x51, 0x1d, 0xb, 0x41, 0x8d, 0x73, 0x60, 0x1d,
+ 0xa4, 0x9c, 0xd4, 0x8e, 0x1e, 0xb, 0xf7, 0x8a,
+ 0x7, 0xb1, 0x91, 0xc3, 0xa7, 0xaf, 0x1b, 0xf7,
+ 0xe, 0x90, 0xfb, 0x36, 0x74, 0xfb, 0x42, 0x31,
+ 0x78, 0x6a, 0x54, 0x5c, 0xb6, 0xa2, 0x1f, 0xe,
+ 0xf8, 0x1, 0x7d, 0xaf, 0xf8, 0xfe, 0xaf, 0xb,
+ 0x88, 0x1d, 0x13, 0xb8, 0x54, 0x1d, 0x7, 0x87,
+ 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x56, 0x6f, 0x1d,
+ 0x97, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91, 0x7b,
+ 0x5e, 0x1f, 0xb, 0x72, 0x1d, 0xec, 0xf7, 0x70,
+ 0x1e, 0xb, 0x97, 0x16, 0xf7, 0x7f, 0x9e, 0x6,
+ 0x42, 0x8e, 0x76, 0xab, 0xf2, 0x1a, 0xb, 0xca,
+ 0x86, 0xa3, 0x7b, 0x3c, 0x1a, 0xb, 0xfb, 0x38,
+ 0xfb, 0x38, 0xfb, 0x37, 0xb, 0x97, 0x16, 0xf8,
+ 0xb0, 0x6, 0x39, 0x1d, 0xb, 0x1b, 0x75, 0x7e,
+ 0x78, 0x7a, 0x5b, 0xc8, 0x88, 0x9a, 0xf7, 0x29,
+ 0xbe, 0xdd, 0xbc, 0xd7, 0x56, 0xa9, 0x6a, 0x97,
+ 0x1f, 0xb, 0x1b, 0x84, 0x84, 0x90, 0x94, 0x9e,
+ 0x9b, 0xb8, 0xcd, 0xb5, 0x1f, 0xb, 0xad, 0x94,
+ 0x1f, 0x6e, 0x6, 0xb, 0xa7, 0x5a, 0xa9, 0x1f,
+ 0xfb, 0x0, 0xcb, 0x5, 0x66, 0xa1, 0x85, 0xa8,
+ 0x9f, 0x1a, 0xa5, 0xa0, 0xb2, 0xc2, 0xb, 0x15,
+ 0x54, 0xb7, 0x5f, 0xc2, 0x79, 0x1d, 0x54, 0x5f,
+ 0x5e, 0x54, 0x1e, 0xb, 0xf7, 0x6a, 0x16, 0xf7,
+ 0xc6, 0x9e, 0x6, 0x31, 0x8c, 0x7e, 0xb, 0xfb,
+ 0x34, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x32, 0xfb,
+ 0x36, 0xfb, 0x13, 0xf7, 0x22, 0xf7, 0x34, 0x1e,
+ 0xb, 0x1, 0xc0, 0x9d, 0x3, 0xa6, 0x16, 0xf8,
+ 0xd, 0x6, 0x99, 0xf7, 0x1b, 0x79, 0x8f, 0x5,
+ 0x3d, 0x7b, 0xb, 0x6f, 0xa0, 0x76, 0x9a, 0x1d,
+ 0xa0, 0x41, 0x1d, 0xb, 0xa3, 0x9e, 0x9e, 0xa3,
+ 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73,
+ 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb, 0x1, 0xef,
+ 0xf1, 0xf7, 0x7b, 0xf7, 0x1, 0x3, 0x9b, 0x16,
+ 0xf7, 0xac, 0x9e, 0x6, 0x3e, 0x8d, 0x7a, 0xb,
+ 0xf8, 0x1, 0x7d, 0xb7, 0xf9, 0xc, 0x77, 0xb,
+ 0xa2, 0xf7, 0x7c, 0x74, 0x6, 0xb, 0x15, 0xfb,
+ 0x69, 0xf7, 0x26, 0xb, 0x81, 0xa7, 0xf8, 0x32,
+ 0xa7, 0xb, 0x77, 0x1, 0xf7, 0xcf, 0xf1, 0x3,
+ 0x68, 0xa, 0xb, 0x1, 0xdb, 0xdf, 0xf7, 0x44,
+ 0xdf, 0x3, 0x9b, 0x16, 0xf7, 0x6a, 0x9a, 0x6,
+ 0x57, 0x8e, 0x7d, 0xb, 0x7b, 0x1d, 0xf8, 0x3e,
+ 0x9a, 0xa, 0xb, 0x5, 0x82, 0x98, 0x83, 0x9e,
+ 0x96, 0x1a, 0xa7, 0xa4, 0xb, 0x5a, 0x6a, 0xad,
+ 0x5f, 0x1b, 0x70, 0x78, 0x7a, 0x71, 0x71, 0x9e,
+ 0x7a, 0xa6, 0x1f, 0xb, 0x15, 0xa2, 0x8e, 0x5,
+ 0xc6, 0x88, 0xb7, 0x6a, 0x58, 0x1a, 0x72, 0x7e,
+ 0x62, 0x4f, 0xb, 0x7, 0xfb, 0x0, 0x76, 0x72,
+ 0x3f, 0x86, 0x1e, 0xb, 0xc1, 0x76, 0xf8, 0x13,
+ 0x77, 0x1, 0xb, 0x74, 0x78, 0x4b, 0x87, 0x1e,
+ 0xb, 0xf7, 0x92, 0x8b, 0xb1, 0xb, 0x6e, 0xa,
+ 0xf7, 0x8c, 0x77, 0x1, 0xf3, 0xf1, 0xb, 0x83,
+ 0x1f, 0xe, 0x7, 0xb0, 0xb1, 0xaa, 0x9f, 0xa9,
+ 0x1b, 0xc6, 0x9d, 0x67, 0x4e, 0x1f, 0xb, 0xee,
+ 0xf1, 0xf7, 0x9c, 0xa2, 0xac, 0xa4, 0xb, 0xfb,
+ 0x10, 0xfb, 0x23, 0xb, 0x7b, 0xa0, 0xa0, 0xaf,
+ 0x9c, 0xb0, 0xaa, 0x70, 0xa5, 0x6d, 0x6d, 0xb,
+ 0x8b, 0x91, 0x1b, 0xb7, 0x8b, 0xb, 0xa0, 0x8a,
+ 0x1d, 0xb, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0xf7,
+ 0x23, 0xdc, 0x13, 0xda, 0xb, 0x74, 0xa, 0xad,
+ 0xb, 0x65, 0x1a, 0x4f, 0x3e, 0x97, 0x60, 0x9a,
+ 0x1e, 0xe, 0xba, 0x9c, 0xb1, 0x9a, 0xc1, 0x99,
+ 0xb, 0x9e, 0xfb, 0xaf, 0x7, 0xb, 0x66, 0xc1,
+ 0xe9, 0x99, 0xb, 0xf7, 0x5d, 0xbc, 0x12, 0x13,
+ 0x80, 0xf7, 0x5d, 0x4, 0xb, 0xba, 0xf7, 0x66,
+ 0xf7, 0x5, 0xfb, 0x2, 0xfb, 0x4f, 0xb, 0xf7,
+ 0xb3, 0xf7, 0xa0, 0x70, 0x1d, 0xb, 0x7, 0x43,
+ 0x8b, 0x6a, 0x37, 0x85, 0x1e, 0xf7, 0x4e, 0xb,
+ 0xfb, 0x5b, 0x15, 0x80, 0xa0, 0xa7, 0x86, 0xa7,
+ 0x1b, 0xb, 0x3c, 0xa0, 0x76, 0xb, 0x77, 0x1,
+ 0xd2, 0xdf, 0xf7, 0x46, 0xdf, 0x3, 0xb, 0x73,
+ 0xf8, 0xa4, 0x76, 0xf7, 0x3b, 0x77, 0x1, 0xb,
+ 0xf7, 0xf, 0xfb, 0x34, 0x76, 0xf9, 0xf1, 0x77,
+ 0xb, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, 0x67,
+ 0x6d, 0xb, 0x8f, 0x7b, 0x1b, 0x6c, 0x8a, 0x81,
+ 0x1d, 0xb, 0x7b, 0x69, 0x29, 0x78, 0xe2, 0xc0,
+ 0x7f, 0x1e, 0xb, 0xfb, 0x6e, 0xdf, 0x37, 0xf1,
+ 0xb, 0xf7, 0x54, 0xfb, 0x41, 0x77, 0xb, 0x1a,
+ 0xfb, 0x38, 0x7, 0xb, 0x72, 0x6b, 0x1e, 0xb,
+ 0xf7, 0x6, 0x3, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
new file mode 100644
index 0000000000..ba879bdfea
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
@@ -0,0 +1,2433 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldFontData [19395] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x26, 0xf8,
+ 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2,
+ 0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3c,
+ 0xfb, 0x8e, 0xfa, 0x7c, 0xfa, 0xd, 0x5, 0x1c,
+ 0x7, 0x67, 0xf, 0x1c, 0x8, 0xbe, 0x11, 0xaf,
+ 0x1c, 0x44, 0x8e, 0x12, 0x0, 0x4, 0x1, 0x1,
+ 0x5, 0x2f, 0x43, 0x52, 0x45, 0x75, 0x72, 0x6f,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+ 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54,
+ 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2,
+ 0x0, 0x1, 0x0, 0xf, 0x0, 0x4f, 0x0, 0x54,
+ 0x0, 0x62, 0x0, 0x6d, 0x0, 0x78, 0x0, 0x96,
+ 0x0, 0xbb, 0x0, 0xbe, 0x0, 0xc7, 0x0, 0xd6,
+ 0x0, 0xdc, 0x0, 0xef, 0x0, 0xf8, 0x1, 0x5,
+ 0x1, 0x12, 0x1, 0x38, 0x1, 0x45, 0x1, 0x53,
+ 0x1, 0x5a, 0x1, 0x6b, 0x1, 0x73, 0x1, 0x7e,
+ 0x1, 0x87, 0x1, 0x8b, 0x1, 0x9b, 0x1, 0xa6,
+ 0x1, 0xab, 0x1, 0xb6, 0x1, 0xce, 0x1, 0xe8,
+ 0x1, 0xf3, 0x1, 0xfa, 0x2, 0x21, 0x2, 0x33,
+ 0x2, 0x38, 0x2, 0x41, 0x2, 0x4b, 0x2, 0x70,
+ 0x2, 0x94, 0x2, 0xa2, 0x2, 0xad, 0x2, 0xcf,
+ 0x2, 0xd5, 0x2, 0xe0, 0x2, 0xec, 0x2, 0xf2,
+ 0x3, 0x8, 0x3, 0x10, 0x3, 0x17, 0x3, 0x20,
+ 0x3, 0x29, 0x3, 0x30, 0x3, 0x37, 0x3, 0x3b,
+ 0x3, 0x48, 0x3, 0x53, 0x3, 0x61, 0x3, 0x79,
+ 0x3, 0x7f, 0x3, 0x87, 0x3, 0x8f, 0x3, 0x96,
+ 0x3, 0x9d, 0x3, 0xb2, 0x3, 0xb6, 0x3, 0xc0,
+ 0x3, 0xc6, 0x3, 0xcf, 0x3, 0xd5, 0x3, 0xdb,
+ 0x3, 0xef, 0x3, 0xfe, 0x4, 0x9, 0x4, 0x14,
+ 0x4, 0x1b, 0x4, 0x2d, 0x4, 0x35, 0x4, 0x41,
+ 0x4, 0x47, 0x4, 0x4d, 0x4, 0x5e, 0x4, 0x6f,
+ 0x4, 0x79, 0x4, 0x89, 0x4, 0x98, 0x4, 0xa5,
+ 0x4, 0xae, 0x4, 0xb3, 0x4, 0xb8, 0x4, 0xc6,
+ 0x4, 0xd4, 0x4, 0xe1, 0x4, 0xee, 0x4, 0xf1,
+ 0x4, 0xf5, 0x5, 0x1, 0x5, 0xb, 0x5, 0x11,
+ 0x5, 0x17, 0x5, 0x20, 0x5, 0x2b, 0x5, 0x36,
+ 0x5, 0x41, 0x5, 0x48, 0x5, 0x4d, 0x5, 0x51,
+ 0x5, 0x54, 0x5, 0x5e, 0x5, 0x68, 0x5, 0x72,
+ 0x5, 0x7c, 0x5, 0x86, 0x5, 0x90, 0x5, 0x9a,
+ 0x5, 0x9e, 0x5, 0xa7, 0x5, 0xb0, 0x5, 0xb9,
+ 0x5, 0xc0, 0x5, 0xc6, 0x5, 0xcb, 0x5, 0xcf,
+ 0x15, 0x3a, 0xa, 0x20, 0xa, 0x7f, 0x6d, 0x88,
+ 0x86, 0x55, 0x83, 0x19, 0x31, 0x1d, 0x3c, 0xa,
+ 0x71, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, 0x1f,
+ 0xf7, 0x86, 0x7, 0xee, 0xb4, 0x6d, 0xfb, 0x11,
+ 0x97, 0x1f, 0xaf, 0xf7, 0xe6, 0x67, 0x6, 0xfb,
+ 0x10, 0x7c, 0x62, 0x72, 0x2b, 0x1b, 0xf7, 0x6d,
+ 0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xc8,
+ 0x72, 0xfb, 0x22, 0xa2, 0x1e, 0xae, 0xf7, 0x5d,
+ 0xfc, 0xd5, 0x53, 0x1d, 0xfc, 0x81, 0x7, 0x4d,
+ 0x6c, 0x9b, 0x52, 0x85, 0x1e, 0xb, 0x15, 0xc3,
+ 0x22, 0xa, 0xb, 0x32, 0x1d, 0x31, 0xa, 0x2d,
+ 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x51, 0x3a, 0x1d,
+ 0xb, 0x29, 0xa, 0x80, 0x7f, 0xa, 0x9a, 0x7c,
+ 0xa4, 0x7c, 0x1f, 0xb, 0x27, 0x1d, 0x69, 0x7,
+ 0xb4, 0x84, 0x93, 0x7f, 0x38, 0xa, 0xb, 0x3f,
+ 0xc9, 0x6c, 0xbb, 0xa3, 0xd1, 0x90, 0xcc, 0xcc,
+ 0x1e, 0x8a, 0xb7, 0x15, 0x7b, 0x7d, 0x74, 0x70,
+ 0x69, 0x1b, 0x67, 0x7c, 0xaf, 0xaa, 0xe2, 0xee,
+ 0xa8, 0xa2, 0x90, 0x1f, 0xb, 0x5e, 0x8c, 0x80,
+ 0x9d, 0xb2, 0x1a, 0xf7, 0xfc, 0xfb, 0x5d, 0x69,
+ 0x7, 0xad, 0x88, 0xa7, 0x8a, 0x54, 0x1a, 0xfb,
+ 0xa5, 0x7, 0x78, 0x78, 0x72, 0x72, 0x65, 0x1b,
+ 0x54, 0x8a, 0xb6, 0xa7, 0x1f, 0xf7, 0xe7, 0xfb,
+ 0x50, 0xb, 0x22, 0x1d, 0xe, 0x4e, 0xa, 0xed,
+ 0xf7, 0x4, 0x29, 0x2e, 0xa, 0xb, 0x67, 0xa8,
+ 0x74, 0xa, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0x61,
+ 0xa, 0x6e, 0x61, 0x1d, 0xb, 0x34, 0xa, 0x1f,
+ 0x39, 0x1d, 0xb, 0x64, 0x8f, 0x83, 0xa1, 0xaa,
+ 0x1a, 0xf8, 0x6, 0xfb, 0x54, 0x69, 0x7, 0xb1,
+ 0x84, 0x9a, 0x84, 0x5e, 0x1a, 0xb, 0x15, 0x2e,
+ 0x1d, 0xf7, 0x66, 0x16, 0x2e, 0x1d, 0xe, 0x67,
+ 0xa7, 0x6f, 0xaf, 0xaf, 0xa8, 0xa7, 0xaf, 0xaf,
+ 0x6e, 0x6f, 0x1d, 0xb, 0xf7, 0xeb, 0xbf, 0x15,
+ 0x4a, 0x7, 0xc4, 0x9e, 0x99, 0x8c, 0x28, 0xa,
+ 0xb, 0x33, 0xbc, 0x31, 0xef, 0xef, 0xbc, 0xe5,
+ 0xe3, 0xe3, 0x5a, 0xe5, 0x27, 0x27, 0x5a, 0x31,
+ 0x33, 0x1e, 0xf7, 0x6, 0x16, 0xd0, 0x8b, 0xe0,
+ 0xae, 0xae, 0x8b, 0x36, 0x46, 0x46, 0x8b, 0x36,
+ 0x68, 0x68, 0x8b, 0xe0, 0xd0, 0x1e, 0xb, 0xf7,
+ 0x48, 0xf7, 0x5d, 0x15, 0xe9, 0xf7, 0x87, 0xf0,
+ 0xfb, 0x87, 0x5, 0xe, 0x15, 0x6f, 0x91, 0x93,
+ 0x61, 0xd1, 0x1b, 0xb8, 0xb0, 0xa3, 0xac, 0xa7,
+ 0x1f, 0xb, 0xc0, 0xa9, 0xf7, 0x5, 0x3d, 0xa,
+ 0xb, 0x54, 0x8f, 0x63, 0x8e, 0xcb, 0x1a, 0xf8,
+ 0x64, 0x7, 0xcf, 0xbb, 0x8c, 0xba, 0x8d, 0x1e,
+ 0xae, 0xb, 0x5c, 0xa, 0xf7, 0x8b, 0x77, 0x27,
+ 0xa, 0xb, 0x94, 0x1a, 0x13, 0xbc, 0x3b, 0xa,
+ 0x13, 0x8c, 0x24, 0xa, 0xe, 0x2a, 0xa, 0x85,
+ 0x93, 0x85, 0x92, 0x94, 0x1a, 0xb, 0x16, 0x2a,
+ 0x1d, 0xe, 0x73, 0x99, 0x5, 0x74, 0x78, 0x68,
+ 0x5f, 0x50, 0x1b, 0x2c, 0x75, 0xf1, 0xe0, 0x88,
+ 0x1f, 0xb, 0x4e, 0x4c, 0x47, 0xc1, 0x8b, 0x97,
+ 0xbf, 0x9a, 0xb1, 0x9d, 0xb, 0x3b, 0xa, 0x24,
+ 0xa, 0xb, 0x65, 0x1d, 0xf7, 0x7f, 0x45, 0xa,
+ 0xfb, 0x25, 0x5f, 0x1d, 0xb, 0x9a, 0x1a, 0xa7,
+ 0x97, 0x91, 0xd0, 0x1e, 0xae, 0xfb, 0xe3, 0x68,
+ 0x7, 0xbe, 0x88, 0xa3, 0x60, 0x90, 0x82, 0xf7,
+ 0x4b, 0xfb, 0xd6, 0x18, 0xb, 0xfc, 0x31, 0x15,
+ 0xf7, 0x89, 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3,
+ 0x1f, 0xf7, 0xdb, 0x46, 0xa, 0xfb, 0x67, 0x7,
+ 0x65, 0x87, 0x74, 0x40, 0x8c, 0x1e, 0xb, 0x9f,
+ 0xa1, 0x92, 0x70, 0x53, 0x3a, 0x52, 0x6f, 0x78,
+ 0x1f, 0xb, 0x15, 0x2a, 0x1d, 0xf7, 0x66, 0x38,
+ 0x1d, 0x15, 0x2e, 0xca, 0x36, 0xf0, 0xf0, 0xca,
+ 0xe0, 0xe8, 0xe8, 0x4c, 0xe0, 0x26, 0x26, 0x4c,
+ 0x36, 0x2e, 0x1e, 0xf7, 0xe, 0x16, 0xbd, 0x8b,
+ 0xef, 0xb5, 0xb5, 0x8b, 0x27, 0x59, 0x59, 0x8b,
+ 0x27, 0x61, 0x61, 0x8b, 0xef, 0xbd, 0x1e, 0xb,
+ 0xfb, 0x14, 0xf7, 0x8c, 0x7b, 0x9a, 0x3d, 0x1d,
+ 0xfb, 0x1d, 0x7, 0x38, 0x73, 0x89, 0x46, 0x84,
+ 0x1e, 0xb, 0x33, 0x1d, 0x5d, 0x67, 0xb, 0xfb,
+ 0x22, 0x60, 0xfb, 0x13, 0x63, 0x23, 0x1a, 0xb,
+ 0x15, 0xb5, 0x6, 0x9d, 0x8c, 0x9b, 0xa8, 0xab,
+ 0x1b, 0xb, 0x1b, 0xfb, 0x52, 0x71, 0xfb, 0x1c,
+ 0x4e, 0x5d, 0x8b, 0x35, 0xf7, 0x3f, 0x39, 0x1f,
+ 0xf7, 0x18, 0x4c, 0xba, 0x73, 0x48, 0x1a, 0x7e,
+ 0x82, 0x28, 0xfb, 0xc, 0xfb, 0x13, 0x5f, 0xf7,
+ 0x5, 0xf0, 0x77, 0x1e, 0x64, 0x6, 0xb, 0xf7,
+ 0x4c, 0xcb, 0xf7, 0xd, 0xe3, 0xf7, 0x1, 0x3f,
+ 0xc5, 0x69, 0x9c, 0x1f, 0xfb, 0x7b, 0xf7, 0x7,
+ 0x78, 0xa1, 0xc1, 0x1a, 0xcc, 0xc2, 0xa9, 0xbf,
+ 0xf7, 0xa, 0xbd, 0xfb, 0x7, 0x45, 0x9d, 0x1e,
+ 0xb1, 0x6, 0xb, 0x1e, 0xad, 0xfb, 0x8e, 0x69,
+ 0x7, 0xa4, 0x87, 0x90, 0x8b, 0x97, 0x74, 0x8,
+ 0xb, 0xfb, 0x5f, 0x7d, 0xd3, 0xf7, 0x4f, 0xb0,
+ 0xf7, 0x34, 0xaa, 0xb, 0xa5, 0x9b, 0xb9, 0x1a,
+ 0xc3, 0x5c, 0xa3, 0x4d, 0x3e, 0x59, 0x56, 0x65,
+ 0x78, 0x1e, 0x9f, 0x84, 0x5, 0x9a, 0x95, 0xa2,
+ 0xae, 0xb1, 0x1b, 0xbb, 0xa0, 0x71, 0x68, 0x54,
+ 0x56, 0x7c, 0x6c, 0x82, 0x1f, 0xb, 0x54, 0xa,
+ 0xf8, 0x5a, 0x77, 0xb, 0x49, 0x1d, 0xf7, 0x84,
+ 0x77, 0x98, 0xa, 0x17, 0x4d, 0xa, 0xb, 0xad,
+ 0xfb, 0x2b, 0x69, 0x7, 0xa4, 0x8a, 0xa9, 0x8b,
+ 0x6b, 0x1a, 0xb, 0x8b, 0xae, 0xf8, 0xf2, 0xae,
+ 0xb, 0x96, 0x83, 0x5, 0xa7, 0x94, 0xb9, 0x87,
+ 0x66, 0x1a, 0x73, 0x1d, 0x1e, 0x7b, 0x66, 0x5,
+ 0x7b, 0xb4, 0xa1, 0x89, 0x97, 0x1b, 0xb, 0x1b,
+ 0x2f, 0x78, 0x31, 0x68, 0x84, 0x1f, 0xb, 0xf7,
+ 0x17, 0x78, 0xac, 0x93, 0x1d, 0xb, 0x12, 0xa4,
+ 0xf7, 0x26, 0xf7, 0xe, 0xf7, 0x1e, 0xb, 0x68,
+ 0x6, 0xb9, 0x88, 0xb5, 0x93, 0x49, 0x1a, 0xb,
+ 0x7a, 0x85, 0x81, 0x6b, 0x66, 0x1b, 0xb, 0x51,
+ 0xa, 0xf7, 0x8b, 0x72, 0xa, 0xb, 0x15, 0xc3,
+ 0x6, 0xb, 0x5a, 0xa, 0xf7, 0x68, 0xf7, 0xe9,
+ 0x79, 0x1d, 0xf7, 0x3f, 0x66, 0x1d, 0xb, 0x65,
+ 0x1d, 0xf7, 0x84, 0x45, 0xa, 0xfb, 0x2a, 0x5f,
+ 0x1d, 0xb, 0x5d, 0x90, 0x88, 0xa8, 0xa2, 0x1a,
+ 0xf7, 0x95, 0x7, 0x94, 0xb6, 0xbc, 0xb3, 0xb,
+ 0x1a, 0xe6, 0x3b, 0xa0, 0x63, 0x2f, 0x65, 0x33,
+ 0x69, 0x7e, 0x1e, 0xa3, 0x6, 0xbd, 0xa3, 0xae,
+ 0x8f, 0x9a, 0x1b, 0xcd, 0x96, 0x4f, 0x7a, 0xb,
+ 0xae, 0xfb, 0x70, 0x68, 0x7, 0xb, 0xae, 0xf7,
+ 0x45, 0xf7, 0xf6, 0xf7, 0x45, 0xb, 0xa4, 0xf7,
+ 0x27, 0xf7, 0x31, 0xf7, 0x27, 0xb, 0xfb, 0x55,
+ 0xfb, 0x55, 0xfb, 0x35, 0xb, 0xf7, 0x61, 0xf7,
+ 0x61, 0xf7, 0x29, 0xb, 0xae, 0x1, 0xf4, 0x7f,
+ 0x1d, 0x9e, 0x16, 0xf8, 0xd6, 0x6, 0xb4, 0xf7,
+ 0x77, 0x5, 0x6e, 0x6, 0xfb, 0x5, 0x5d, 0x53,
+ 0xb, 0x6e, 0x67, 0x1e, 0xb, 0x63, 0x1d, 0xb2,
+ 0x5c, 0x5b, 0x67, 0x63, 0x5e, 0x1e, 0xe, 0x15,
+ 0x5c, 0xaf, 0x64, 0x1d, 0xb, 0x66, 0xbb, 0xba,
+ 0xb1, 0xaf, 0xbb, 0xb9, 0x65, 0xb, 0xfb, 0x3f,
+ 0xfb, 0x3f, 0x85, 0xb, 0xf7, 0x20, 0xf7, 0x20,
+ 0xb0, 0xb, 0xb9, 0xb4, 0x63, 0xba, 0x1b, 0xa4,
+ 0xa5, 0xa2, 0xa6, 0xa6, 0x71, 0xa2, 0x72, 0x1f,
+ 0x5c, 0x62, 0x63, 0x5d, 0x1b, 0xb, 0x76, 0xf7,
+ 0x42, 0xf7, 0x35, 0x12, 0x99, 0x77, 0xa, 0xe1,
+ 0x77, 0xa, 0x13, 0xe8, 0xb, 0xf7, 0x4d, 0x16,
+ 0xf7, 0xef, 0xae, 0x6, 0x45, 0x92, 0x75, 0xb,
+ 0xf7, 0x7e, 0x66, 0x7, 0x72, 0x81, 0x82, 0x76,
+ 0x70, 0x1b, 0xb, 0xf7, 0xf, 0x98, 0x8, 0xa2,
+ 0x7, 0xb, 0x67, 0xa7, 0x6d, 0xaf, 0xaf, 0xa6,
+ 0xa9, 0xaf, 0xaf, 0x70, 0xa7, 0x67, 0x67, 0x6f,
+ 0x6f, 0x67, 0x1e, 0xb, 0x67, 0xa6, 0x81, 0x1d,
+ 0x70, 0x61, 0x1d, 0xb, 0x67, 0xa7, 0x74, 0xa,
+ 0xa6, 0xa8, 0xaf, 0xaf, 0x70, 0x6f, 0x1d, 0xb,
+ 0x61, 0xa, 0x6f, 0x61, 0x1d, 0xb, 0xfb, 0x17,
+ 0xfb, 0x1f, 0x34, 0xb, 0xa5, 0xf7, 0xe3, 0x15,
+ 0xfb, 0x5a, 0xf7, 0x2a, 0xfb, 0x30, 0xf7, 0x5a,
+ 0xf7, 0x5a, 0xf7, 0x29, 0xb, 0x9b, 0x16, 0xf7,
+ 0x77, 0xae, 0x6, 0x41, 0x93, 0x76, 0x8b, 0xd3,
+ 0x1a, 0xf8, 0x2d, 0x8d, 0x7, 0xb, 0x62, 0x5d,
+ 0x8b, 0x7f, 0x73, 0x7b, 0x92, 0x92, 0x78, 0xb,
+ 0x15, 0xf7, 0x35, 0x34, 0xe9, 0xe2, 0xb4, 0xcd,
+ 0x62, 0xf7, 0x98, 0x57, 0x6, 0x4f, 0x43, 0xb,
+ 0x99, 0x16, 0xf7, 0x87, 0xad, 0x6, 0x5d, 0x90,
+ 0x8a, 0xa8, 0xa2, 0x1a, 0xf7, 0xda, 0xb, 0xfc,
+ 0x95, 0x15, 0xcd, 0x6, 0xf8, 0x60, 0xf9, 0x48,
+ 0x5, 0x49, 0x6, 0xe, 0xa9, 0x30, 0xf1, 0x70,
+ 0xb4, 0x1f, 0xa9, 0xb1, 0xb, 0x15, 0xf7, 0x6,
+ 0x90, 0xb, 0x15, 0xf7, 0x26, 0xb0, 0xb, 0xfb,
+ 0x57, 0xfb, 0xa6, 0x15, 0x69, 0xf7, 0xa5, 0xaa,
+ 0x7, 0x5c, 0x8d, 0x6c, 0xb, 0x8f, 0x85, 0x80,
+ 0x79, 0x7e, 0x82, 0x80, 0x1e, 0xfb, 0x5f, 0xfb,
+ 0x38, 0x5, 0xb, 0xae, 0x78, 0x15, 0xb2, 0x6,
+ 0x9b, 0x8f, 0x90, 0x9d, 0xa0, 0x1b, 0x98, 0xb,
+ 0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5b, 0xbc, 0x51,
+ 0x51, 0x5a, 0x5b, 0x50, 0xb, 0x2e, 0xa, 0xe,
+ 0xf7, 0x36, 0x3, 0xb, 0xfb, 0x30, 0xfb, 0x31,
+ 0xfb, 0xc, 0xf7, 0x1e, 0xf7, 0x38, 0x1e, 0xb,
+ 0x74, 0xa, 0xa7, 0xa8, 0xaf, 0xaf, 0x6f, 0x61,
+ 0xa, 0xb, 0x8b, 0xad, 0xf8, 0x8, 0xce, 0xb,
+ 0x76, 0xf7, 0x44, 0x77, 0x1, 0xb, 0xf7, 0x1f,
+ 0x13, 0xe0, 0x9b, 0x16, 0x99, 0xa, 0xb, 0xf7,
+ 0x1f, 0xf7, 0xe, 0xf7, 0x1f, 0xfb, 0xf, 0xf7,
+ 0x1f, 0xb, 0xf7, 0x8b, 0xf7, 0x41, 0x6c, 0xaa,
+ 0x12, 0xa4, 0xf7, 0x21, 0xb, 0xfb, 0x5f, 0xa0,
+ 0x76, 0xf7, 0xe8, 0x76, 0xf7, 0x2, 0xab, 0xb,
+ 0x89, 0xd3, 0xfb, 0x53, 0x69, 0x6, 0xb, 0xf7,
+ 0xeb, 0xbf, 0x15, 0xb, 0xd6, 0x8b, 0xae, 0xb,
+ 0x85, 0x1e, 0xe, 0xa1, 0x8a, 0x8a, 0xaf, 0xcb,
+ 0x1b, 0xf7, 0x40, 0xa2, 0xb, 0xfb, 0x91, 0xfb,
+ 0x2e, 0x76, 0xf9, 0xfd, 0x77, 0x1, 0xb, 0x6,
+ 0x84, 0x6c, 0x6f, 0x49, 0x54, 0x76, 0x69, 0x80,
+ 0xb, 0x55, 0x8b, 0x5a, 0xc3, 0x93, 0xc7, 0x8b,
+ 0xcb, 0xd3, 0xb, 0xd4, 0x90, 0x28, 0x37, 0x53,
+ 0x88, 0xfb, 0x1b, 0x39, 0xb, 0xfb, 0xce, 0xfb,
+ 0x29, 0xb6, 0xf9, 0x79, 0xb6, 0x1, 0xb, 0xfb,
+ 0xce, 0xfb, 0x27, 0x76, 0xf9, 0xf2, 0x77, 0x1,
+ 0xb, 0xf9, 0x18, 0xac, 0xb, 0x86, 0x84, 0x9d,
+ 0x1f, 0x81, 0xa5, 0xae, 0x7f, 0xb, 0xfb, 0xac,
+ 0x1f, 0xfb, 0xc5, 0x68, 0x6, 0xb2, 0xb, 0xfb,
+ 0x2b, 0x1b, 0x48, 0x75, 0x93, 0xbb, 0x1f, 0xb,
+ 0x7, 0x73, 0x80, 0x67, 0x63, 0x1e, 0xe, 0x76,
+ 0xf7, 0x4d, 0x77, 0x1, 0xb, 0xf7, 0x8b, 0x77,
+ 0x1, 0xb, 0xf7, 0x16, 0x12, 0xb, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+ 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+ 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+ 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+ 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+ 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+ 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+ 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+ 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+ 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+ 0x0, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x4b,
+ 0x0, 0x78, 0x0, 0xec, 0x1, 0x74, 0x1, 0xa0,
+ 0x2, 0x61, 0x2, 0x8c, 0x2, 0xba, 0x2, 0xea,
+ 0x3, 0xe4, 0x4, 0x10, 0x4, 0x3e, 0x4, 0x51,
+ 0x4, 0x59, 0x4, 0x74, 0x4, 0xc5, 0x4, 0xfb,
+ 0x5, 0x4c, 0x5, 0xb5, 0x5, 0xf3, 0x6, 0x51,
+ 0x6, 0xb4, 0x6, 0xda, 0x7, 0x5c, 0x7, 0xbb,
+ 0x7, 0xe1, 0x8, 0x28, 0x8, 0x45, 0x8, 0x67,
+ 0x8, 0x83, 0x8, 0xf4, 0x9, 0xad, 0x9, 0xcd,
+ 0xa, 0x4a, 0xa, 0xa9, 0xa, 0xee, 0xb, 0x4c,
+ 0xb, 0xab, 0xc, 0x23, 0xc, 0x8c, 0xc, 0x91,
+ 0xc, 0xe4, 0xd, 0x50, 0xd, 0x75, 0xd, 0xe6,
+ 0xe, 0x0, 0xe, 0x20, 0xe, 0x7d, 0xe, 0xd7,
+ 0xf, 0x50, 0xf, 0x78, 0xf, 0xbb, 0x10, 0x3,
+ 0x10, 0x46, 0x10, 0xc0, 0x11, 0x3d, 0x11, 0x5f,
+ 0x11, 0x65, 0x11, 0x86, 0x11, 0xa1, 0x11, 0xc2,
+ 0x11, 0xe3, 0x11, 0xef, 0x11, 0xf7, 0x12, 0x36,
+ 0x12, 0x9e, 0x12, 0xe2, 0x13, 0x49, 0x13, 0x76,
+ 0x13, 0xcc, 0x14, 0x91, 0x14, 0xc3, 0x14, 0xed,
+ 0x15, 0x50, 0x15, 0xb9, 0x15, 0xd7, 0x16, 0x64,
+ 0x16, 0xac, 0x16, 0xeb, 0x17, 0x23, 0x17, 0x85,
+ 0x17, 0xe0, 0x18, 0x63, 0x18, 0xac, 0x18, 0xbf,
+ 0x18, 0xef, 0x19, 0x6c, 0x19, 0xe6, 0x19, 0xfa,
+ 0x1a, 0x25, 0x1a, 0x74, 0x1a, 0x8f, 0x1a, 0xde,
+ 0x1b, 0x21, 0x1b, 0x70, 0x1b, 0xf8, 0x1c, 0xad,
+ 0x1d, 0x20, 0x1d, 0x9f, 0x1d, 0xc1, 0x1e, 0x93,
+ 0x1e, 0x9e, 0x1f, 0x19, 0x1f, 0x90, 0x1f, 0xc5,
+ 0x1f, 0xe5, 0x20, 0x79, 0x20, 0x8a, 0x20, 0xc2,
+ 0x20, 0xff, 0x21, 0x30, 0x21, 0x51, 0x21, 0x6d,
+ 0x21, 0xec, 0x22, 0x28, 0x22, 0x32, 0x22, 0x57,
+ 0x22, 0x80, 0x22, 0xb8, 0x22, 0xe4, 0x23, 0x18,
+ 0x23, 0x60, 0x23, 0x98, 0x24, 0xb, 0x24, 0x1d,
+ 0x24, 0x2f, 0x24, 0x41, 0x24, 0x7c, 0x24, 0x9f,
+ 0x24, 0xd9, 0x25, 0x78, 0x26, 0x6, 0x26, 0x12,
+ 0x26, 0x22, 0x26, 0x36, 0x26, 0x60, 0x26, 0x68,
+ 0x26, 0x6f, 0x26, 0x7c, 0x26, 0xae, 0x26, 0xfc,
+ 0x27, 0x35, 0x27, 0x57, 0x27, 0x6a, 0x27, 0x8a,
+ 0x27, 0xe6, 0x28, 0x5, 0x28, 0x35, 0x28, 0xa9,
+ 0x28, 0xba, 0x28, 0xce, 0x28, 0xe2, 0x29, 0x6,
+ 0x29, 0x3a, 0x29, 0xdd, 0x2a, 0x81, 0x2a, 0x9c,
+ 0x2a, 0xb8, 0x2a, 0xd8, 0x2b, 0x28, 0x2b, 0x46,
+ 0x2b, 0x8e, 0x2c, 0x43, 0x2c, 0x9f, 0x2c, 0xb4,
+ 0x2c, 0xca, 0x2c, 0xea, 0x2d, 0xf, 0x2d, 0x29,
+ 0x2d, 0x48, 0x2d, 0x6d, 0x2d, 0x90, 0x2e, 0x5,
+ 0x2e, 0x51, 0x2e, 0xa3, 0x2e, 0xb1, 0x2e, 0xbe,
+ 0x2e, 0xe9, 0x2f, 0x6, 0x2f, 0x38, 0x2f, 0xc3,
+ 0x2f, 0xde, 0x2f, 0xfe, 0x30, 0x15, 0x30, 0x3b,
+ 0x30, 0x78, 0x30, 0xa9, 0x30, 0xcd, 0x30, 0xd6,
+ 0x31, 0x14, 0x31, 0x46, 0x31, 0xe0, 0x32, 0x71,
+ 0x32, 0xa1, 0x33, 0x19, 0x33, 0x4f, 0x33, 0x61,
+ 0x33, 0x93, 0x34, 0x16, 0x34, 0x21, 0x34, 0x39,
+ 0x34, 0x64, 0x34, 0x85, 0x34, 0xcc, 0x35, 0x0,
+ 0x35, 0x39, 0x35, 0x52, 0x35, 0x60, 0x35, 0x70,
+ 0x35, 0x95, 0x35, 0xa1, 0x35, 0xb0, 0x35, 0xd9,
+ 0x35, 0xf3, 0x36, 0xc, 0x36, 0xb0, 0x37, 0x19,
+ 0x37, 0x38, 0x37, 0x5b, 0x37, 0x96, 0x37, 0xba,
+ 0x37, 0xdf, 0x37, 0xf8, 0x38, 0x86, 0x39, 0x2f,
+ 0x39, 0x3f, 0x39, 0xa5, 0x3a, 0x0, 0xfc, 0x21,
+ 0xe, 0xfc, 0x21, 0xe, 0xfb, 0xce, 0x7e, 0xf7,
+ 0x3d, 0xf8, 0xab, 0x77, 0x1, 0xdc, 0xf7, 0x3e,
+ 0x3, 0xdc, 0xd2, 0x15, 0x5c, 0xb0, 0x64, 0x1d,
+ 0xb2, 0x5c, 0x5b, 0x66, 0x63, 0x5e, 0x1e, 0xd1,
+ 0xf7, 0x37, 0x15, 0xa8, 0x6, 0x94, 0xe5, 0x96,
+ 0xc7, 0x96, 0xb7, 0x8, 0x9f, 0xdd, 0x9f, 0xa5,
+ 0xc2, 0x1a, 0xcb, 0x69, 0xaf, 0x58, 0x57, 0x6a,
+ 0x67, 0x4b, 0x54, 0x9f, 0x70, 0x9f, 0x38, 0x1e,
+ 0x96, 0x5f, 0x95, 0x4f, 0x94, 0x33, 0x8, 0xe,
+ 0x2f, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1,
+ 0xde, 0xf7, 0x15, 0xf7, 0x17, 0xf7, 0x15, 0x3,
+ 0xf7, 0x13, 0xf8, 0x28, 0x15, 0x6e, 0xa, 0x74,
+ 0xa6, 0xfb, 0xc, 0x9c, 0x43, 0x1e, 0xf7, 0x98,
+ 0x16, 0x6e, 0xa, 0x1e, 0x8a, 0x74, 0xa7, 0xfb,
+ 0xc, 0x9c, 0x43, 0x8, 0xe, 0xa0, 0x76, 0xf7,
+ 0x66, 0xcc, 0x4a, 0xd4, 0xf7, 0x20, 0xd4, 0x45,
+ 0xcb, 0xf7, 0x66, 0x77, 0x12, 0x13, 0xb4, 0xb5,
+ 0x16, 0xce, 0x6, 0xbb, 0xf7, 0x66, 0x5, 0xf7,
+ 0x21, 0x6, 0x5d, 0xfb, 0x66, 0x5, 0xce, 0x6,
+ 0xb9, 0xf7, 0x66, 0x5, 0xf0, 0x6, 0x13, 0xcc,
+ 0x8c, 0xcc, 0x5, 0x35, 0x6, 0xad, 0xf7, 0x2b,
+ 0x5, 0xdb, 0x6, 0x8c, 0xcb, 0x5, 0x47, 0x6,
+ 0xba, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5b, 0xfb,
+ 0x66, 0x5, 0xfb, 0x22, 0x6, 0xb9, 0xf7, 0x66,
+ 0x5, 0x49, 0x6, 0x5c, 0xfb, 0x66, 0x5, 0xfb,
+ 0xa, 0x6, 0x8a, 0x4b, 0x5, 0xf2, 0x6, 0x6b,
+ 0xfb, 0x2b, 0x5, 0x28, 0x6, 0x8a, 0x4a, 0x5,
+ 0xe1, 0x6, 0xdc, 0xcc, 0x15, 0xab, 0xf7, 0x2b,
+ 0x5, 0xf7, 0x25, 0x6, 0x69, 0xfb, 0x2b, 0x5,
+ 0xe, 0x3d, 0x76, 0xf9, 0xe5, 0x77, 0x12, 0xdc,
+ 0xea, 0xbc, 0xc3, 0xe9, 0xf7, 0x2, 0x17, 0xf7,
+ 0xa1, 0xa9, 0x15, 0xf7, 0x70, 0x7, 0xc5, 0x6a,
+ 0xae, 0x78, 0x51, 0x1a, 0x2e, 0x49, 0x7f, 0x70,
+ 0x86, 0x1e, 0xfb, 0x73, 0x98, 0x15, 0xd3, 0x6e,
+ 0xa7, 0x80, 0xcf, 0x88, 0x8, 0x28, 0xc2, 0xee,
+ 0x7, 0x13, 0x78, 0xf0, 0x9c, 0xf1, 0xaf, 0xf7,
+ 0x26, 0x1a, 0xf7, 0xe, 0x2c, 0xbd, 0xfb, 0x0,
+ 0xc2, 0x1e, 0xf7, 0x6b, 0x7, 0xeb, 0x7b, 0xa0,
+ 0x22, 0x96, 0x64, 0x8, 0xaa, 0xf7, 0x21, 0x6,
+ 0x6f, 0x9c, 0x68, 0xa0, 0x2b, 0x99, 0x8, 0xd7,
+ 0x54, 0x3d, 0x7, 0x37, 0x87, 0x26, 0x54, 0xfb,
+ 0x9, 0x1a, 0xfb, 0xd, 0xf7, 0x5, 0x50, 0xd2,
+ 0x68, 0x1e, 0xfb, 0x8f, 0x7, 0x54, 0x95, 0x5e,
+ 0xa8, 0x67, 0xf7, 0x14, 0x6c, 0x8d, 0x18, 0xf7,
+ 0x3b, 0xf7, 0x93, 0x15, 0x80, 0x8f, 0x3d, 0xa3,
+ 0xd2, 0x1a, 0xc9, 0xbb, 0x9f, 0xb4, 0x94, 0x1e,
+ 0xe, 0xf7, 0xf5, 0x7d, 0xb9, 0xf7, 0x9a, 0xb9,
+ 0x78, 0xbe, 0xf7, 0x97, 0xba, 0x99, 0x77, 0x1,
+ 0xf7, 0x10, 0xf7, 0x6, 0xf7, 0x56, 0xac, 0xd1,
+ 0xf7, 0x9, 0xf7, 0x54, 0xac, 0x3, 0xf8, 0xee,
+ 0xf7, 0x38, 0x41, 0x1d, 0xfd, 0x22, 0xf7, 0xe2,
+ 0x41, 0x1d, 0xb9, 0x76, 0x1d, 0xf7, 0x4e, 0x7b,
+ 0xd8, 0x3e, 0xf0, 0xf8, 0xd1, 0xac, 0x12, 0xc9,
+ 0xf7, 0x1f, 0xf7, 0xe, 0xf7, 0x24, 0x8b, 0xf0,
+ 0xd6, 0xf7, 0x24, 0x13, 0x7c, 0xf8, 0x6f, 0xd3,
+ 0x15, 0x5c, 0xb1, 0xc6, 0x62, 0xc9, 0x1b, 0xb0,
+ 0xad, 0x9d, 0xb1, 0xb1, 0x1f, 0x13, 0x7e, 0x9c,
+ 0x9c, 0xa5, 0xc0, 0x8c, 0x8c, 0x77, 0x97, 0x18,
+ 0x75, 0x7f, 0x77, 0x7b, 0x72, 0x1b, 0x5c, 0x6c,
+ 0xb0, 0xc1, 0x61, 0x1f, 0xc1, 0xd0, 0x96, 0x96,
+ 0xc2, 0xe4, 0x9c, 0xa6, 0x9a, 0x94, 0xb8, 0x8f,
+ 0x8, 0xad, 0xfb, 0x66, 0x69, 0x7, 0xbf, 0x85,
+ 0x99, 0x89, 0x66, 0x1a, 0x5b, 0x5f, 0x5f, 0x6b,
+ 0x64, 0x1e, 0xfb, 0x2b, 0xf7, 0x6a, 0x5, 0xcc,
+ 0xa1, 0xe2, 0xb6, 0xdd, 0x1a, 0xc1, 0x61, 0xce,
+ 0xfb, 0x12, 0xfb, 0x34, 0x25, 0xfb, 0x2c, 0xfb,
+ 0x2b, 0xf7, 0xc, 0x1e, 0x49, 0x6b, 0xfb, 0x16,
+ 0x4c, 0xfb, 0x17, 0x1a, 0xfb, 0xb, 0xea, 0x50,
+ 0xeb, 0xf1, 0xdc, 0xc5, 0xa9, 0xb2, 0x1e, 0x74,
+ 0xa7, 0x15, 0x13, 0xbc, 0x77, 0x70, 0x6b, 0x78,
+ 0x6c, 0x1b, 0x2d, 0x48, 0xf7, 0x17, 0xcf, 0xb7,
+ 0xa0, 0xa3, 0xc0, 0xa9, 0x1f, 0xe3, 0xfb, 0x18,
+ 0xbe, 0x3f, 0xb1, 0x59, 0x8, 0x54, 0xf7, 0xf4,
+ 0x15, 0x73, 0xa8, 0x59, 0xce, 0xbe, 0x1a, 0xbb,
+ 0xa7, 0x96, 0xa4, 0xc4, 0xad, 0x41, 0x59, 0x52,
+ 0x60, 0x7b, 0x70, 0x82, 0x1e, 0xe, 0xfc, 0x5,
+ 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0x5c,
+ 0xf7, 0x15, 0x3, 0xf7, 0xb, 0xf8, 0x28, 0x15,
+ 0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0x4, 0xa2,
+ 0x1a, 0xb6, 0x72, 0xb0, 0x63, 0x63, 0x73, 0x66,
+ 0x60, 0x74, 0xa6, 0xfb, 0x4, 0x9c, 0x43, 0x1e,
+ 0xe, 0x92, 0x1d, 0xbf, 0xf7, 0x5, 0x3, 0xf7,
+ 0xc6, 0xfb, 0x20, 0x15, 0x2a, 0xc6, 0x59, 0xd3,
+ 0xf7, 0xa4, 0x1a, 0xf7, 0xc5, 0xcb, 0xb6, 0xde,
+ 0xc3, 0x1e, 0xa6, 0x7, 0x54, 0x72, 0xfb, 0x61,
+ 0xfb, 0x6, 0xfb, 0xb8, 0x1a, 0x39, 0xa7, 0xfb,
+ 0x74, 0xf7, 0x7c, 0xfb, 0x11, 0x1e, 0xe, 0x92,
+ 0x1d, 0xf7, 0x42, 0xf7, 0x5, 0x3, 0xa6, 0xfb,
+ 0x21, 0x15, 0x70, 0x7, 0xc2, 0xa4, 0xf7, 0x61,
+ 0xf7, 0x11, 0xf7, 0xb8, 0x1a, 0xdd, 0x6f, 0xf7,
+ 0x69, 0xfb, 0x7c, 0xf7, 0x11, 0x1e, 0x6f, 0x7,
+ 0xec, 0x50, 0xbd, 0x4e, 0xfb, 0xa4, 0x1a, 0xfb,
+ 0xc5, 0x4b, 0x55, 0x38, 0x53, 0x1e, 0xe, 0xf7,
+ 0xa8, 0x76, 0xf4, 0x76, 0xa3, 0x76, 0xf7, 0xf,
+ 0x76, 0xf7, 0x8b, 0x77, 0x12, 0xf7, 0x5d, 0xee,
+ 0x13, 0xbc, 0xf7, 0x85, 0xf8, 0x55, 0x15, 0x6f,
+ 0x88, 0x78, 0x86, 0x7d, 0x1e, 0x80, 0x6a, 0x76,
+ 0x85, 0x64, 0x1a, 0x69, 0xa2, 0x76, 0xa4, 0xa3,
+ 0xa6, 0xa0, 0xaa, 0x1e, 0x8a, 0xa8, 0x7b, 0x98,
+ 0x7e, 0xb3, 0x86, 0x9a, 0x87, 0x9f, 0x89, 0xa4,
+ 0x92, 0x90, 0x18, 0xa1, 0x80, 0x94, 0x85, 0x99,
+ 0x7a, 0x93, 0x81, 0x94, 0x7d, 0x9a, 0x76, 0x8,
+ 0x76, 0x99, 0xa1, 0x7f, 0x9e, 0x1b, 0xa5, 0xa2,
+ 0x9a, 0xac, 0xc6, 0x56, 0x7f, 0x4e, 0x97, 0x1f,
+ 0x79, 0x8f, 0x78, 0x90, 0x79, 0x95, 0x8, 0x93,
+ 0x7, 0xa2, 0x9b, 0x9e, 0x91, 0x9b, 0x8e, 0xa5,
+ 0x8f, 0xa0, 0x85, 0xa2, 0x94, 0x8, 0xa7, 0x95,
+ 0x98, 0xa1, 0xa0, 0x1a, 0xa4, 0x79, 0xa2, 0x6a,
+ 0x63, 0x86, 0x6d, 0x64, 0x6b, 0x1e, 0x7f, 0x7d,
+ 0x7a, 0x7b, 0x75, 0x7b, 0x83, 0x8e, 0x18, 0x88,
+ 0xb1, 0x94, 0xa0, 0x94, 0x9c, 0x8, 0x96, 0xa0,
+ 0x99, 0x99, 0xa8, 0x1a, 0xad, 0x71, 0x9f, 0x71,
+ 0x73, 0x73, 0x78, 0x6d, 0x6c, 0x9a, 0x7c, 0x97,
+ 0x73, 0x1e, 0x94, 0x7a, 0x90, 0x75, 0x67, 0x1a,
+ 0x84, 0x88, 0x6f, 0x98, 0x7d, 0x9c, 0x7f, 0x9b,
+ 0x19, 0xac, 0x73, 0x86, 0xac, 0x58, 0x1b, 0x7e,
+ 0x6c, 0x80, 0x66, 0x68, 0x9a, 0x81, 0xa5, 0x86,
+ 0x1f, 0x9d, 0x88, 0xa1, 0x8a, 0xa4, 0x87, 0x9f,
+ 0x87, 0xa0, 0x85, 0xa2, 0x80, 0x8a, 0x84, 0x18,
+ 0x73, 0x79, 0x78, 0x85, 0x7a, 0x89, 0x8, 0x89,
+ 0x7e, 0x7b, 0x8b, 0x7b, 0x1b, 0x6e, 0x6a, 0x7a,
+ 0x67, 0x89, 0x1f, 0x13, 0xdc, 0x71, 0x8a, 0xa1,
+ 0x71, 0xa6, 0x1b, 0xb6, 0x8f, 0xab, 0xb2, 0xac,
+ 0x1f, 0x97, 0x99, 0x9a, 0x9a, 0xa2, 0x9a, 0x8,
+ 0xe, 0x3e, 0xa0, 0x76, 0xf7, 0x74, 0xc6, 0xf7,
+ 0x73, 0x77, 0x12, 0xf7, 0x81, 0xe5, 0x3f, 0xcb,
+ 0x13, 0xf0, 0xac, 0xf7, 0x76, 0x15, 0x13, 0xe8,
+ 0xf7, 0x6e, 0xfb, 0x76, 0xcb, 0xf7, 0x76, 0xf7,
+ 0x72, 0xc6, 0xfb, 0x72, 0xf7, 0x71, 0x4b, 0xfb,
+ 0x71, 0xfb, 0x6e, 0x6, 0xe, 0xfc, 0x21, 0xfb,
+ 0x33, 0x83, 0xa, 0xb2, 0x77, 0xa, 0x13, 0xe0,
+ 0xb6, 0xfb, 0x34, 0x15, 0x97, 0x77, 0x5, 0xc0,
+ 0xa9, 0xf7, 0x7, 0x3d, 0xa, 0x5d, 0x67, 0x6d,
+ 0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0x13, 0xd0,
+ 0x9f, 0xa1, 0x92, 0x70, 0x53, 0x37, 0x50, 0x6f,
+ 0x78, 0x1f, 0xe, 0xfb, 0xce, 0xf7, 0x3f, 0xf7,
+ 0x8, 0x1, 0xb7, 0xf7, 0x3f, 0x15, 0xf7, 0x87,
+ 0xf7, 0x8, 0xfb, 0x87, 0x6, 0xe, 0xfc, 0x21,
+ 0x7e, 0x93, 0xa, 0xd2, 0x62, 0x1d, 0xfc, 0x5,
+ 0x8d, 0x76, 0xf9, 0x4b, 0x77, 0xae, 0x77, 0x12,
+ 0x13, 0xc0, 0x84, 0x78, 0x15, 0xd3, 0x6, 0x13,
+ 0xa0, 0xf7, 0x78, 0xf9, 0x5a, 0x5, 0x3b, 0x6,
+ 0xe, 0x7e, 0xa7, 0xf9, 0x19, 0xa7, 0x1, 0xa3,
+ 0xf7, 0x32, 0xf7, 0x1c, 0xf7, 0x32, 0x3, 0xf7,
+ 0x4a, 0xf7, 0x72, 0x15, 0xf7, 0x79, 0x7, 0xde,
+ 0x8b, 0xf7, 0x12, 0xce, 0xbb, 0xa0, 0x51, 0xfb,
+ 0x2b, 0x1e, 0xfb, 0x79, 0x7, 0x3c, 0x8f, 0xfb,
+ 0x14, 0x43, 0x57, 0x7b, 0xcb, 0xf7, 0x23, 0x1e,
+ 0xfb, 0x32, 0xf7, 0x2, 0x15, 0xfb, 0x5d, 0xed,
+ 0xfb, 0x24, 0xf7, 0x14, 0xf7, 0x20, 0xe1, 0xf7,
+ 0x39, 0xf7, 0x48, 0xf7, 0x84, 0xfb, 0xe, 0xf7,
+ 0x8, 0x22, 0x26, 0xfb, 0x10, 0x23, 0xfb, 0x90,
+ 0x1e, 0xe, 0x8b, 0xad, 0xf9, 0x22, 0x77, 0x1,
+ 0xf7, 0x4e, 0xf7, 0x28, 0x3, 0xcc, 0x16, 0xf8,
+ 0xd, 0xad, 0x6, 0x28, 0x82, 0xa6, 0xce, 0x1f,
+ 0xf8, 0xc4, 0x7a, 0x7, 0xfb, 0x90, 0xfb, 0x1,
+ 0x5, 0x71, 0x7, 0x98, 0xad, 0xad, 0x97, 0x99,
+ 0x1b, 0xb2, 0x8b, 0x5f, 0x72, 0x1f, 0xfc, 0xb,
+ 0x7, 0x4d, 0x86, 0x65, 0xfb, 0x8, 0x1e, 0xe,
+ 0x8b, 0xf7, 0x19, 0xf8, 0x8, 0x76, 0xe5, 0xf7,
+ 0x6, 0x1, 0xf7, 0xc0, 0xf7, 0x1c, 0x3, 0x9c,
+ 0x16, 0xf8, 0x34, 0x6, 0xb8, 0xf7, 0x67, 0x5,
+ 0x69, 0x6, 0x47, 0x6f, 0x82, 0x81, 0x21, 0x1b,
+ 0xfb, 0x21, 0x6, 0xf7, 0xa8, 0xf7, 0x9b, 0x8b,
+ 0xd7, 0xa8, 0x1a, 0xf7, 0x2c, 0xfb, 0xf, 0xae,
+ 0x4d, 0xfb, 0x21, 0x50, 0xfb, 0x27, 0x52, 0x77,
+ 0x1e, 0xa7, 0x6, 0xdf, 0xb0, 0xc9, 0x91, 0xa2,
+ 0x1b, 0xf2, 0x9b, 0x27, 0x6f, 0xfb, 0xa, 0xfb,
+ 0xd, 0xfb, 0x18, 0xfb, 0x36, 0xfb, 0x41, 0x1f,
+ 0xe, 0x7d, 0xbd, 0x59, 0xf7, 0x28, 0xf8, 0x6d,
+ 0xdc, 0x12, 0xf7, 0xf6, 0xf7, 0x6, 0x13, 0xb0,
+ 0xf7, 0x2d, 0xf7, 0xf8, 0x15, 0xd7, 0x71, 0xf7,
+ 0x11, 0x61, 0xfb, 0x19, 0x1a, 0x31, 0x57, 0x6e,
+ 0x5b, 0x6d, 0x74, 0xa2, 0xa3, 0x72, 0x1e, 0x13,
+ 0x70, 0xa4, 0x71, 0x6e, 0xa5, 0x60, 0x1b, 0x6b,
+ 0x6d, 0x74, 0x6a, 0x4c, 0xd2, 0x6e, 0xdb, 0xf7,
+ 0x48, 0xf7, 0xd, 0xf7, 0xe, 0xf7, 0x20, 0xd6,
+ 0x60, 0xd3, 0x3c, 0xa8, 0x1f, 0xb7, 0xa6, 0xb2,
+ 0xa4, 0xd8, 0x1a, 0xe8, 0x43, 0xb5, 0x2b, 0xfb,
+ 0xa, 0x3e, 0x31, 0x4c, 0x6e, 0x1e, 0xa0, 0x7f,
+ 0x5, 0xa3, 0x9a, 0xae, 0xc7, 0xd0, 0x1b, 0xd4,
+ 0xac, 0x5f, 0x50, 0x30, 0x39, 0x72, 0x5b, 0x7c,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x24, 0xf7, 0x3,
+ 0xf7, 0xcf, 0x76, 0xf7, 0x1f, 0x77, 0x1, 0xf7,
+ 0xa1, 0xf7, 0x23, 0x3, 0x9e, 0xf7, 0x24, 0x15,
+ 0xf7, 0x8c, 0xfb, 0x24, 0xf7, 0x25, 0xf7, 0x24,
+ 0xca, 0xf7, 0x3, 0x4c, 0xf8, 0x45, 0x31, 0x6,
+ 0x31, 0xfb, 0xe, 0xfb, 0x10, 0xfb, 0x3b, 0x32,
+ 0xfb, 0x22, 0x8, 0xb4, 0x89, 0x15, 0xf7, 0x63,
+ 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0xba, 0x6, 0xe,
+ 0x83, 0xc8, 0x4e, 0xf7, 0x28, 0xf7, 0x53, 0xf7,
+ 0x1d, 0xdc, 0xf7, 0x13, 0x12, 0xf8, 0x9, 0xd9,
+ 0x13, 0xb8, 0xbe, 0xf7, 0xdf, 0x15, 0xd3, 0x86,
+ 0xd7, 0x86, 0xce, 0x6d, 0x8, 0xc0, 0x74, 0xc1,
+ 0x59, 0x4e, 0x1a, 0x39, 0x49, 0x75, 0x69, 0x6c,
+ 0x6d, 0xa0, 0xa0, 0x6d, 0x1e, 0x13, 0x78, 0xa1,
+ 0x6c, 0x6b, 0xa2, 0x68, 0x1b, 0x60, 0x78, 0x6b,
+ 0x6f, 0x52, 0xcd, 0x6c, 0xd8, 0xf7, 0x4a, 0xf3,
+ 0xf7, 0x2, 0xf7, 0x17, 0xed, 0x50, 0xca, 0x5e,
+ 0xa4, 0x1f, 0x48, 0xb1, 0x4d, 0x91, 0x30, 0x90,
+ 0xa1, 0xe6, 0x18, 0xf7, 0xaa, 0x6, 0xb6, 0xf7,
+ 0x13, 0x5, 0xfb, 0xd6, 0x6, 0xe, 0x7e, 0xa6,
+ 0xf7, 0xfe, 0xb8, 0xf7, 0x9f, 0x77, 0x1, 0xa7,
+ 0xf7, 0x31, 0xf7, 0x1e, 0xf7, 0x2c, 0x3, 0xf8,
+ 0x6a, 0xf9, 0x2a, 0x15, 0xa5, 0x7, 0xfb, 0xc0,
+ 0x6d, 0xfb, 0x22, 0xfb, 0x54, 0xfb, 0x4a, 0x1a,
+ 0xfb, 0x84, 0xf7, 0x1f, 0x52, 0xe5, 0xf7, 0x48,
+ 0xb1, 0xf7, 0x3e, 0xc1, 0xf7, 0x40, 0xfb, 0x4,
+ 0xb1, 0x46, 0x5b, 0x79, 0x84, 0x81, 0x73, 0x1e,
+ 0xb7, 0xf7, 0x4c, 0xf7, 0xe, 0xc1, 0xef, 0x9f,
+ 0x8, 0xfb, 0xa8, 0xfb, 0xbf, 0x15, 0x97, 0x96,
+ 0x9c, 0x8c, 0x9b, 0x1b, 0xd0, 0x9b, 0x3f, 0xfb,
+ 0x24, 0x3c, 0x8b, 0x4c, 0x4e, 0x4d, 0x7c, 0xc9,
+ 0xf7, 0x59, 0xac, 0x93, 0xc3, 0x8c, 0x8c, 0x1f,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6f, 0x76, 0xe0, 0xf7,
+ 0x1d, 0x1, 0xf7, 0x27, 0x16, 0xea, 0x6, 0xf7,
+ 0x7f, 0xf9, 0x38, 0x5, 0xfc, 0x34, 0x6, 0x5f,
+ 0xfb, 0x72, 0x5, 0xae, 0x6, 0xe0, 0xa1, 0xbd,
+ 0x8b, 0xa5, 0x1b, 0xf7, 0x4f, 0x6, 0xe, 0x7e,
+ 0xab, 0xf9, 0x14, 0xa8, 0x12, 0xa7, 0xf7, 0xd,
+ 0xfb, 0x2, 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1f,
+ 0xfb, 0x19, 0xf7, 0xb, 0x13, 0xd4, 0xf7, 0xbe,
+ 0xf8, 0x3a, 0x15, 0x81, 0x90, 0xfb, 0xc, 0xc5,
+ 0xe8, 0x1a, 0xb4, 0xb0, 0xb3, 0xbc, 0xd5, 0x96,
+ 0x44, 0x58, 0x4f, 0x79, 0x73, 0x74, 0x6c, 0x1e,
+ 0xfb, 0xc, 0x29, 0x15, 0x13, 0xe8, 0x48, 0x76,
+ 0x38, 0x64, 0xfb, 0x1, 0x1a, 0xfb, 0x2, 0xf0,
+ 0x51, 0xf7, 0x0, 0xf7, 0x23, 0xe7, 0xd9, 0xf7,
+ 0x11, 0xe8, 0x4b, 0xd1, 0x35, 0xbe, 0x1e, 0x13,
+ 0xd4, 0xc2, 0x9d, 0xdc, 0xa9, 0xe0, 0x1a, 0xc4,
+ 0x57, 0xe9, 0xfb, 0x2c, 0xfb, 0x34, 0x54, 0x36,
+ 0x2e, 0x38, 0xcb, 0x4e, 0xd6, 0x61, 0x1e, 0xa1,
+ 0x79, 0x15, 0x13, 0xe8, 0xcf, 0x5e, 0xcc, 0x60,
+ 0x39, 0x1a, 0x71, 0x84, 0x30, 0x32, 0x4a, 0x74,
+ 0xcd, 0xd3, 0xd4, 0xa0, 0xaa, 0xa9, 0xb8, 0x1e,
+ 0xe, 0x93, 0x76, 0xf7, 0x9f, 0xb8, 0xf7, 0xfe,
+ 0xa6, 0x1, 0xa5, 0xf7, 0x2c, 0xf7, 0x1e, 0xf7,
+ 0x31, 0x3, 0xaa, 0x7e, 0x15, 0xf7, 0xc0, 0xa9,
+ 0xf7, 0x22, 0xf7, 0x54, 0xf7, 0x4a, 0x1a, 0xf7,
+ 0x84, 0xfb, 0x1f, 0xc4, 0x31, 0xfb, 0x48, 0x65,
+ 0xfb, 0x3e, 0x55, 0xfb, 0x40, 0xf7, 0x4, 0x65,
+ 0xd0, 0xae, 0xa5, 0x8e, 0x9b, 0xaa, 0x1e, 0x58,
+ 0xfb, 0x51, 0xfb, 0x9, 0x58, 0x27, 0x77, 0x8,
+ 0xf7, 0xa8, 0xf7, 0xbf, 0x15, 0x83, 0x8a, 0x70,
+ 0x86, 0x7b, 0x1b, 0x46, 0x7b, 0xd7, 0xf7, 0x24,
+ 0xda, 0x90, 0xca, 0xc8, 0xc9, 0x95, 0x42, 0xfb,
+ 0x59, 0x74, 0x85, 0x63, 0x88, 0x7b, 0x1f, 0xe,
+ 0xfb, 0xce, 0x7e, 0xf7, 0x3a, 0xf7, 0x2f, 0xf7,
+ 0x38, 0x1, 0xdd, 0xf7, 0x3d, 0x3, 0xdd, 0xd2,
+ 0x63, 0x1d, 0xaf, 0x5c, 0x5b, 0x67, 0x66, 0x5e,
+ 0x1e, 0xf7, 0xd6, 0x4, 0x86, 0xa, 0xac, 0x5c,
+ 0x5b, 0x67, 0x69, 0x5e, 0x1e, 0xe, 0xfb, 0xce,
+ 0xfb, 0x33, 0x76, 0xf7, 0xe3, 0xf7, 0x2c, 0x8b,
+ 0xf7, 0x39, 0x12, 0xdd, 0xf7, 0x3d, 0x56, 0xcf,
+ 0x13, 0xe8, 0xe4, 0xfb, 0x32, 0x15, 0x96, 0x75,
+ 0x5, 0x33, 0x1d, 0x1e, 0x13, 0xf0, 0x5d, 0x67,
+ 0x6d, 0x57, 0x3c, 0xd2, 0x8b, 0x8e, 0x1f, 0x13,
+ 0xe8, 0xaf, 0x8d, 0x91, 0x80, 0x80, 0x1a, 0x53,
+ 0x3a, 0x52, 0x6f, 0x78, 0x1e, 0x13, 0xf0, 0x84,
+ 0xf8, 0xba, 0x15, 0x86, 0xa, 0xad, 0x5c, 0x5b,
+ 0x67, 0x68, 0x5e, 0x1e, 0xe, 0x95, 0xa, 0xf7,
+ 0x6b, 0x15, 0xf8, 0x90, 0xfb, 0x73, 0x5, 0xd4,
+ 0x7, 0xfc, 0x38, 0xf7, 0x53, 0xf8, 0x38, 0xf7,
+ 0x4d, 0x5, 0xd4, 0x7, 0xfc, 0x90, 0xfb, 0x73,
+ 0x5, 0xe, 0x3e, 0xf6, 0xdf, 0xf7, 0xe, 0xe1,
+ 0x47, 0xcf, 0x12, 0x13, 0xa0, 0xac, 0xf7, 0xdf,
+ 0x15, 0xf8, 0x8c, 0xcf, 0xfc, 0x8c, 0x6, 0xfb,
+ 0xb8, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xcc,
+ 0xfc, 0x8c, 0x7, 0xe, 0x95, 0xa, 0x83, 0x15,
+ 0xf8, 0x90, 0xf7, 0x73, 0x5, 0xd7, 0x7, 0xfc,
+ 0x90, 0xf7, 0x73, 0x5, 0x3f, 0x7, 0xf8, 0x37,
+ 0xfb, 0x4b, 0xfc, 0x37, 0xfb, 0x50, 0x5, 0xe,
+ 0x7e, 0xf7, 0x3d, 0xf8, 0x85, 0xaf, 0x12, 0xc4,
+ 0xf7, 0x17, 0x69, 0xf7, 0x3d, 0x70, 0xf7, 0x29,
+ 0x13, 0xe8, 0xf7, 0x73, 0xf7, 0x7b, 0x15, 0xa9,
+ 0x6, 0xe2, 0x9a, 0x90, 0xde, 0xbe, 0x1e, 0xc0,
+ 0xac, 0xb4, 0xbb, 0xcb, 0x1a, 0xf7, 0x33, 0xfb,
+ 0x37, 0x96, 0x6c, 0xfb, 0x38, 0x6d, 0x25, 0x62,
+ 0x68, 0x9e, 0x61, 0xbe, 0x9f, 0xb4, 0x97, 0xbf,
+ 0xa7, 0x7f, 0x97, 0x81, 0x96, 0x1e, 0x83, 0x93,
+ 0x84, 0x93, 0x98, 0x1a, 0xb0, 0xbd, 0x8e, 0x94,
+ 0xd9, 0x93, 0x2f, 0x61, 0x51, 0x7b, 0x65, 0x7a,
+ 0x6a, 0x1e, 0x71, 0x59, 0x6d, 0x65, 0x9b, 0x44,
+ 0x8, 0x13, 0xd0, 0x46, 0xfb, 0x34, 0x15, 0x5c,
+ 0xb0, 0x66, 0xbb, 0xb9, 0xb1, 0xaf, 0xbb, 0xb9,
+ 0x65, 0xb2, 0x5d, 0x5b, 0x66, 0x63, 0x5e, 0x1e,
+ 0xe, 0xf7, 0xaf, 0x6d, 0xb9, 0xf7, 0x13, 0xb0,
+ 0x66, 0xbb, 0xf7, 0xa2, 0xbb, 0xf7, 0x23, 0xb2,
+ 0x12, 0xeb, 0xe7, 0xf7, 0x25, 0xd8, 0xf8, 0x1,
+ 0xba, 0x13, 0xbf, 0xf8, 0x20, 0xf7, 0xac, 0x15,
+ 0xf7, 0xd, 0xe3, 0xd1, 0xbc, 0xa9, 0x99, 0x75,
+ 0x60, 0x1e, 0x13, 0xaf, 0xfb, 0x25, 0x7d, 0x4e,
+ 0x45, 0x5f, 0x1b, 0x69, 0x6f, 0xa8, 0xc7, 0x1f,
+ 0xf7, 0x23, 0x4b, 0x15, 0x7e, 0x8a, 0xa3, 0x4f,
+ 0xd0, 0x1b, 0xf7, 0xf, 0xcf, 0xf7, 0x1f, 0xf4,
+ 0xf7, 0x42, 0xfb, 0x28, 0xf7, 0x16, 0xfb, 0x52,
+ 0xfb, 0x5f, 0xfb, 0x41, 0xfb, 0x29, 0xfb, 0x72,
+ 0xfb, 0x1e, 0xf7, 0xa, 0xfb, 0x5d, 0xf7, 0xa1,
+ 0xdb, 0xd1, 0xa7, 0xab, 0xcd, 0x1f, 0x7e, 0xae,
+ 0x5, 0x70, 0x50, 0x55, 0x75, 0x30, 0x1b, 0xfb,
+ 0x41, 0xfb, 0xd, 0xf7, 0x25, 0xf7, 0x28, 0xf7,
+ 0x78, 0xf7, 0x1a, 0xf3, 0xf7, 0x2a, 0xf7, 0x4c,
+ 0xf6, 0xfb, 0x28, 0xfb, 0x9, 0x1f, 0x13, 0xdf,
+ 0x33, 0x59, 0xfb, 0xb, 0x3d, 0x60, 0x8f, 0xbc,
+ 0x9c, 0x8e, 0x1e, 0xcd, 0xf7, 0x98, 0x5, 0x44,
+ 0x6, 0x80, 0x63, 0x5, 0xa5, 0x7d, 0x80, 0xa6,
+ 0x5b, 0x1b, 0xfb, 0x1e, 0x4a, 0xfb, 0x36, 0x3e,
+ 0x1f, 0x13, 0x0, 0xfb, 0x4, 0xd1, 0x72, 0xa8,
+ 0x8c, 0x1e, 0xc8, 0x90, 0xba, 0xbd, 0x96, 0x9c,
+ 0x8, 0xe, 0x4b, 0x1d, 0x12, 0x94, 0xf7, 0x5f,
+ 0x65, 0x9a, 0x13, 0xf0, 0x94, 0x16, 0x3a, 0xa,
+ 0x13, 0xe8, 0x20, 0xa, 0x5, 0x13, 0xf0, 0x7f,
+ 0x6d, 0x88, 0x86, 0x55, 0x83, 0x8, 0x13, 0xe8,
+ 0x31, 0x1d, 0x9f, 0x8b, 0xb5, 0xf7, 0xc1, 0xa9,
+ 0xf7, 0x9b, 0xb3, 0x12, 0xf3, 0xf7, 0x34, 0xf7,
+ 0x30, 0xf7, 0x39, 0xfb, 0x1e, 0xf7, 0x40, 0x13,
+ 0xf4, 0xf7, 0x9c, 0xf7, 0xeb, 0x15, 0xa9, 0x6,
+ 0xcc, 0x88, 0xe3, 0x7c, 0xfb, 0x23, 0x1a, 0x4e,
+ 0x7e, 0x3c, 0xfb, 0x2, 0x61, 0x79, 0x9b, 0xb8,
+ 0x1e, 0xf7, 0xa2, 0x4, 0xf7, 0x63, 0x7, 0xa2,
+ 0x8c, 0x8c, 0xac, 0xbe, 0x1b, 0x13, 0xf8, 0xdc,
+ 0xa1, 0x59, 0x45, 0x25, 0x75, 0x62, 0xfb, 0x1a,
+ 0x1f, 0xfb, 0x8c, 0xfc, 0x9, 0x15, 0xf7, 0xd6,
+ 0x6, 0x13, 0xf4, 0xf7, 0x67, 0xd1, 0xed, 0xdf,
+ 0xf7, 0x6, 0x22, 0xc1, 0x37, 0x99, 0x1f, 0x8d,
+ 0x7, 0x13, 0xf8, 0xb5, 0x98, 0xf7, 0x5, 0xa5,
+ 0xf7, 0x3, 0x1a, 0xf7, 0x30, 0xfb, 0x60, 0x8f,
+ 0x53, 0x1e, 0xfb, 0xc9, 0x53, 0x1d, 0xfc, 0x71,
+ 0x7, 0x4e, 0x6b, 0x8a, 0x53, 0x8b, 0x1d, 0xd6,
+ 0x78, 0xbb, 0x7d, 0xa, 0xfb, 0x44, 0xf7, 0x45,
+ 0xf8, 0x2b, 0xae, 0x13, 0xe6, 0xf9, 0x25, 0xf7,
+ 0x2c, 0x15, 0x2e, 0x38, 0x38, 0x6d, 0x3d, 0x1b,
+ 0x13, 0xea, 0xfb, 0x28, 0x64, 0xf7, 0x46, 0xf7,
+ 0x11, 0xf7, 0x3d, 0xb4, 0xf7, 0x31, 0xf7, 0x26,
+ 0xf7, 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1f,
+ 0xae, 0x6, 0x13, 0xd6, 0x6a, 0x1d, 0x83, 0x80,
+ 0x90, 0x92, 0x7c, 0x1f, 0x13, 0xe6, 0x99, 0x6c,
+ 0x5c, 0xa2, 0x4e, 0x1b, 0x13, 0xea, 0xfb, 0x66,
+ 0xfb, 0x2e, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x4f,
+ 0xf7, 0x17, 0xfb, 0x38, 0xf7, 0x7d, 0xf7, 0x14,
+ 0xd4, 0xca, 0xde, 0xd4, 0x1f, 0xe, 0x8a, 0x1d,
+ 0x68, 0xb8, 0xf8, 0xdf, 0xb7, 0x12, 0xec, 0xf7,
+ 0x36, 0xf7, 0x95, 0xf7, 0x42, 0x13, 0xb8, 0x99,
+ 0x16, 0xf7, 0xd0, 0x6, 0xf7, 0x90, 0xf7, 0x0,
+ 0xf7, 0x38, 0xf7, 0x4c, 0xf7, 0x2e, 0x30, 0xf7,
+ 0x42, 0x95, 0x1d, 0x87, 0xb7, 0x89, 0x4e, 0x1a,
+ 0xfc, 0x6d, 0x7, 0x66, 0x77, 0x6e, 0x4c, 0x1e,
+ 0xf7, 0x89, 0xcd, 0x15, 0xf8, 0x6d, 0x7, 0x8c,
+ 0x1d, 0xfb, 0x55, 0x30, 0x1f, 0x13, 0x78, 0x84,
+ 0xa, 0x1e, 0xe, 0x9f, 0x8b, 0xb4, 0xf7, 0xb4,
+ 0xad, 0xf7, 0xa1, 0xb7, 0x12, 0xf3, 0xf7, 0x36,
+ 0xf7, 0x36, 0xa5, 0xf7, 0x6, 0xa4, 0x17, 0x9b,
+ 0x16, 0x3c, 0xa, 0x7b, 0x29, 0x1b, 0x4a, 0x78,
+ 0x97, 0xb7, 0x1f, 0xf7, 0x7c, 0x7, 0xee, 0xbe,
+ 0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xa5, 0xf7, 0xe6,
+ 0x71, 0x6, 0xfb, 0x10, 0x7c, 0x58, 0x72, 0x2b,
+ 0x1b, 0xf7, 0x63, 0x7, 0xb6, 0x9d, 0x9e, 0xc2,
+ 0xf7, 0x1b, 0xd2, 0x7c, 0xfb, 0x22, 0xa2, 0x1e,
+ 0xa4, 0xf7, 0x5d, 0xfc, 0xd5, 0x6, 0x13, 0x10,
+ 0x68, 0x7, 0xb9, 0x88, 0xb5, 0x89, 0x49, 0x1a,
+ 0xfc, 0x6d, 0x7, 0x4d, 0x6c, 0x91, 0x52, 0x8b,
+ 0x1d, 0x67, 0x8b, 0xae, 0xf7, 0xba, 0xad, 0xf7,
+ 0x19, 0x76, 0xc5, 0x76, 0xf7, 0xc, 0xb7, 0x1,
+ 0xf3, 0xf7, 0x36, 0xf7, 0x2d, 0xa4, 0xf7, 0x7,
+ 0xa3, 0x3, 0x9b, 0x16, 0xf7, 0xfc, 0xae, 0x6,
+ 0x45, 0x8e, 0x63, 0x83, 0xcd, 0x1a, 0xf7, 0x7d,
+ 0x7, 0xf7, 0x12, 0x9b, 0x42, 0x39, 0x96, 0x1f,
+ 0xa4, 0xf7, 0xe6, 0x72, 0x6, 0x3b, 0x7d, 0x7c,
+ 0x46, 0xfb, 0x10, 0x1b, 0xf7, 0x6d, 0x7, 0xb6,
+ 0x9d, 0x94, 0xc1, 0xf7, 0x40, 0xa6, 0x56, 0x23,
+ 0xa1, 0x1e, 0xa3, 0xf7, 0x5d, 0xfc, 0xcb, 0x68,
+ 0x6, 0xba, 0x88, 0xb4, 0x93, 0x49, 0x1a, 0xfc,
+ 0x78, 0x7, 0x4d, 0x6c, 0x92, 0x52, 0x8b, 0x1d,
+ 0xf7, 0x17, 0x78, 0xac, 0xf7, 0x82, 0xae, 0xf7,
+ 0x50, 0x76, 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12,
+ 0xb0, 0xf7, 0x45, 0xf7, 0xbf, 0xf7, 0x30, 0x13,
+ 0xf6, 0xf8, 0x30, 0xf7, 0x90, 0x15, 0xd0, 0x87,
+ 0xab, 0x7d, 0x4b, 0x1a, 0x38, 0x7, 0x60, 0x7b,
+ 0x6d, 0x33, 0xfb, 0x51, 0x85, 0xf7, 0x8b, 0xd2,
+ 0xf7, 0x40, 0xb5, 0xf7, 0x2e, 0xf7, 0x25, 0xf7,
+ 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1e, 0xae,
+ 0x6, 0x13, 0xee, 0x6a, 0x1d, 0x84, 0x81, 0x8f,
+ 0x90, 0x7f, 0x1f, 0x13, 0xf6, 0x99, 0x6c, 0x5b,
+ 0xa5, 0x4a, 0x1b, 0xfb, 0x6c, 0xfb, 0x28, 0xfb,
+ 0x36, 0xfb, 0x59, 0xfb, 0x42, 0xf7, 0xe, 0xfb,
+ 0x45, 0xf7, 0x8e, 0xe2, 0xf7, 0x11, 0xa7, 0xad,
+ 0xbb, 0x1f, 0xf7, 0x13, 0x7, 0xdd, 0xa3, 0x84,
+ 0xc9, 0x92, 0x1e, 0xae, 0xfb, 0xeb, 0x7, 0xe,
+ 0xf7, 0x17, 0xa0, 0x76, 0xf7, 0xda, 0xba, 0xf7,
+ 0xa0, 0xae, 0x1, 0xf5, 0xf7, 0x36, 0xf7, 0x85,
+ 0x7f, 0x1d, 0xa0, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+ 0x56, 0x91, 0x66, 0x8f, 0xc8, 0x1a, 0xf7, 0x70,
+ 0xf7, 0x85, 0xfb, 0x70, 0x7, 0x4e, 0x66, 0x87,
+ 0x56, 0x85, 0x1e, 0x68, 0xf7, 0xe8, 0xae, 0x7,
+ 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf8, 0x64,
+ 0x7, 0xcc, 0xb8, 0x8e, 0xb6, 0x8e, 0x1e, 0xae,
+ 0xfb, 0xe8, 0x68, 0x7, 0xb7, 0x88, 0xb9, 0x89,
+ 0x49, 0x1a, 0xfb, 0x59, 0xfb, 0x85, 0xf7, 0x59,
+ 0x7, 0xcd, 0xb9, 0x8d, 0xb7, 0x8e, 0x1e, 0xae,
+ 0xfb, 0xe5, 0x68, 0x7, 0xb5, 0x87, 0xb6, 0x89,
+ 0x4a, 0x7e, 0xa, 0x50, 0x6b, 0x86, 0x56, 0x8b,
+ 0xa, 0x5c, 0xa, 0x27, 0xa, 0xe, 0x2b, 0xac,
+ 0xb7, 0xac, 0xf9, 0x7, 0xae, 0x1, 0x63, 0xf7,
+ 0x23, 0xf7, 0x11, 0x7f, 0x1d, 0xf7, 0x13, 0xf9,
+ 0x15, 0x15, 0xc4, 0x89, 0xb7, 0x7f, 0x47, 0x1a,
+ 0xfc, 0x5e, 0x7, 0x6c, 0x8b, 0x53, 0x4a, 0x6f,
+ 0x7b, 0x99, 0x9c, 0x9b, 0x94, 0x92, 0x93, 0x95,
+ 0x1e, 0x90, 0x92, 0x90, 0x94, 0x9b, 0x1a, 0xc2,
+ 0x59, 0x9f, 0x75, 0x6e, 0x61, 0x75, 0x54, 0x7a,
+ 0x95, 0xfb, 0x2, 0xf7, 0x2a, 0xf2, 0xf7, 0x10,
+ 0x9a, 0xf4, 0x1e, 0xf8, 0x5e, 0x7, 0xd0, 0xab,
+ 0x94, 0xc4, 0x8f, 0x1e, 0xae, 0xfb, 0xf4, 0x7,
+ 0xe, 0xf7, 0x17, 0x4e, 0x1d, 0x1, 0xf7, 0x9,
+ 0x7f, 0x1d, 0xa9, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+ 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf7, 0x4e,
+ 0x7, 0xa6, 0xa4, 0xf7, 0x4a, 0xfb, 0x6d, 0xb5,
+ 0x59, 0x84, 0x7b, 0x31, 0x8c, 0x19, 0x68, 0xf7,
+ 0xe4, 0xae, 0x7, 0x77, 0x8c, 0x7d, 0x8d, 0x7c,
+ 0x9d, 0xfb, 0xc5, 0xf8, 0x4, 0x18, 0xf7, 0x3c,
+ 0xf7, 0x40, 0xbb, 0xb2, 0xf4, 0x91, 0x8, 0xae,
+ 0xfb, 0xb5, 0x68, 0x7, 0xf7, 0x0, 0x8a, 0x86,
+ 0x6a, 0x55, 0x55, 0xfb, 0x6d, 0xfb, 0x64, 0x18,
+ 0xf7, 0x6a, 0x7, 0xe1, 0xad, 0x83, 0xc2, 0x8f,
+ 0x1e, 0xae, 0xfb, 0xe6, 0x68, 0x7, 0xb9, 0x88,
+ 0xb4, 0x7e, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x4e,
+ 0x6b, 0x87, 0x54, 0x8b, 0x1d, 0x9f, 0x8b, 0xb4,
+ 0xf8, 0xec, 0x60, 0x1d, 0x42, 0x96, 0x1d, 0xf8,
+ 0x62, 0x7, 0xcf, 0xaa, 0x99, 0xd1, 0x1e, 0xae,
+ 0xfb, 0xf1, 0x68, 0x7, 0xb8, 0xb4, 0x7b, 0x49,
+ 0x1f, 0xfc, 0x62, 0x7, 0x4e, 0x61, 0x91, 0x5f,
+ 0x8b, 0xa, 0xf7, 0xbd, 0x8b, 0xae, 0xf8, 0xf3,
+ 0xae, 0x12, 0xb2, 0xf7, 0x17, 0x4a, 0xb5, 0xf8,
+ 0x8c, 0xf7, 0x2f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+ 0x7e, 0xae, 0x6, 0x38, 0x90, 0x79, 0x90, 0xd1,
+ 0x1a, 0xf8, 0x64, 0x8d, 0x7, 0x13, 0xe8, 0xf7,
+ 0x8e, 0xfc, 0xd7, 0x5, 0xa6, 0x6, 0xf7, 0x8e,
+ 0xf8, 0xe6, 0x5, 0x8d, 0xfc, 0x78, 0x6, 0x49,
+ 0x6e, 0x88, 0x4f, 0x85, 0x1e, 0x68, 0xf7, 0xe0,
+ 0xae, 0x7, 0x49, 0x94, 0x75, 0x7d, 0xdb, 0x1a,
+ 0xf8, 0x4b, 0x7, 0xe1, 0xab, 0x8d, 0xc3, 0x8f,
+ 0x1e, 0xae, 0xfb, 0x90, 0x7, 0x13, 0xd0, 0xfb,
+ 0x5c, 0xfc, 0x6c, 0xfb, 0x5c, 0xf8, 0x6c, 0x5,
+ 0xfb, 0x91, 0x68, 0x6, 0xd2, 0x86, 0x9d, 0x7d,
+ 0x57, 0x1a, 0xfc, 0x5b, 0x7, 0x51, 0x7e, 0x7c,
+ 0x3d, 0x8b, 0xa, 0xd6, 0x8e, 0x76, 0xb2, 0x76,
+ 0xf8, 0xb5, 0x76, 0xf7, 0x9, 0xae, 0x12, 0xf3,
+ 0xb7, 0xf8, 0x43, 0xb7, 0x13, 0x7c, 0x72, 0x1d,
+ 0x13, 0xbc, 0x37, 0xa, 0xe, 0x51, 0x1d, 0x1,
+ 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x48, 0xa, 0xfb,
+ 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x3c, 0x1d, 0xf7,
+ 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, 0xfb,
+ 0x1d, 0xfb, 0x6e, 0x1e, 0xe, 0x67, 0xa0, 0x76,
+ 0xf7, 0xc3, 0xae, 0xf7, 0xb9, 0xb8, 0x1, 0xef,
+ 0xf7, 0x36, 0xf7, 0x3a, 0xf7, 0x40, 0x3, 0x9b,
+ 0x16, 0xf7, 0xe2, 0xae, 0x6, 0x46, 0x94, 0x78,
+ 0x83, 0xdc, 0x1a, 0xf7, 0x4e, 0x7, 0xf7, 0x3a,
+ 0xf7, 0x40, 0xb6, 0xf7, 0x23, 0xf7, 0x3d, 0xfb,
+ 0x4a, 0x9d, 0x3b, 0x1f, 0xfb, 0xd6, 0x68, 0x6,
+ 0xc0, 0x86, 0xaa, 0x86, 0x62, 0x1a, 0xfc, 0x6d,
+ 0x7, 0x31, 0x64, 0x93, 0x5e, 0x1e, 0xf7, 0x8a,
+ 0xf7, 0xc3, 0x15, 0xf7, 0x96, 0x7, 0xa1, 0x8c,
+ 0x98, 0x98, 0xad, 0x1b, 0xdd, 0xaf, 0x6f, 0xfb,
+ 0x6, 0xfb, 0x10, 0x5e, 0x6e, 0xfb, 0xd, 0x8d,
+ 0x1f, 0xe, 0xf7, 0x17, 0xfb, 0x44, 0xf7, 0x52,
+ 0x93, 0x1d, 0x5a, 0xa, 0xf7, 0xa5, 0x89, 0x15,
+ 0xfb, 0x1f, 0xf7, 0x5, 0xf5, 0x68, 0xe1, 0x1b,
+ 0xcd, 0xc1, 0x9f, 0x9a, 0xb1, 0x1f, 0x85, 0xa3,
+ 0x2d, 0x6d, 0x2f, 0xa4, 0x55, 0xf7, 0x8, 0x19,
+ 0xf7, 0x2b, 0xb2, 0xf1, 0xf7, 0x12, 0xf7, 0x42,
+ 0x1a, 0xf7, 0x6e, 0xfb, 0x35, 0xf7, 0x20, 0x5e,
+ 0x1d, 0xfb, 0x13, 0xfb, 0x7b, 0xfb, 0x14, 0xd8,
+ 0xfb, 0x33, 0xf7, 0x35, 0x5b, 0x1e, 0x4e, 0xf7,
+ 0xe3, 0x79, 0x1d, 0xf7, 0x47, 0x66, 0x1d, 0xfb,
+ 0x47, 0x78, 0xa, 0xfb, 0x7c, 0x65, 0x1d, 0xf7,
+ 0x7c, 0xe2, 0x1e, 0xe, 0xd6, 0xa0, 0x76, 0xf9,
+ 0xc, 0xb7, 0x68, 0xae, 0x12, 0xf7, 0x6, 0xf7,
+ 0x36, 0xf7, 0x4b, 0xf7, 0x3f, 0x13, 0xd8, 0xf7,
+ 0xa8, 0xf7, 0xed, 0x15, 0xf7, 0x89, 0x7, 0xaa,
+ 0x90, 0x8d, 0x96, 0xc2, 0x1b, 0xdb, 0xb4, 0x6a,
+ 0x26, 0xfb, 0x16, 0x57, 0x75, 0xfb, 0x17, 0x8a,
+ 0x1f, 0xfb, 0x8e, 0xfb, 0xed, 0x15, 0xf7, 0xe6,
+ 0xae, 0x6, 0x49, 0x94, 0x75, 0x8e, 0xdb, 0x1a,
+ 0xf7, 0x4e, 0xa6, 0x7, 0xf7, 0x63, 0xfb, 0xcd,
+ 0x5, 0xf7, 0x61, 0xae, 0x6, 0x7f, 0x77, 0x8c,
+ 0x9d, 0x7d, 0x1f, 0xfb, 0x58, 0xf7, 0xa7, 0x5,
+ 0xc1, 0x9c, 0xf2, 0xa8, 0xf7, 0xf, 0x1a, 0xf7,
+ 0x3c, 0xfb, 0x68, 0x95, 0x45, 0x1e, 0xfb, 0xd6,
+ 0x6, 0x13, 0xb8, 0x68, 0x7, 0xc4, 0x87, 0xaa,
+ 0x86, 0x60, 0x1a, 0xfc, 0x62, 0x7, 0x3a, 0x77,
+ 0x88, 0x47, 0x83, 0x1e, 0xe, 0x30, 0x78, 0xac,
+ 0xf9, 0x1a, 0xaa, 0x8c, 0x8e, 0xa, 0x13, 0xd8,
+ 0x7c, 0x1d, 0x97, 0x94, 0x1d, 0xc4, 0x1b, 0x47,
+ 0x1d, 0x13, 0xb8, 0x85, 0xa, 0x77, 0x75, 0x92,
+ 0x93, 0x73, 0x1f, 0x13, 0xd8, 0x94, 0x70, 0x6e,
+ 0x94, 0x6e, 0x46, 0x1d, 0xe, 0x9f, 0x8b, 0xae,
+ 0xf8, 0x61, 0x76, 0xf7, 0x3d, 0xab, 0x1, 0xf7,
+ 0x91, 0x7f, 0x1d, 0xf7, 0x30, 0x16, 0xf7, 0xf9,
+ 0xae, 0x6, 0x41, 0x90, 0x73, 0x8d, 0xe0, 0x1a,
+ 0xf8, 0x99, 0x7, 0xd0, 0x87, 0xf2, 0x86, 0x9f,
+ 0xfb, 0x34, 0x8, 0xa8, 0x6, 0x89, 0xf7, 0x5d,
+ 0x5, 0xfc, 0xef, 0xfb, 0x5d, 0xa8, 0x6, 0x9f,
+ 0xf7, 0x34, 0xf2, 0x90, 0xd1, 0x8f, 0x8, 0xfc,
+ 0x99, 0x7, 0x37, 0x73, 0x89, 0x42, 0x8b, 0x1d,
+ 0x6b, 0xa, 0x63, 0xa, 0x9b, 0xf9, 0x15, 0x15,
+ 0xc3, 0x85, 0xa5, 0x8c, 0x37, 0x1a, 0xfb, 0xdb,
+ 0x7, 0xfb, 0x4d, 0xf7, 0x1c, 0x50, 0xf7, 0x1c,
+ 0xf7, 0x26, 0xf6, 0xe6, 0xf7, 0x2d, 0x1e, 0xf7,
+ 0xdb, 0x7, 0xcd, 0xa2, 0x9a, 0x43, 0xa, 0x73,
+ 0x4e, 0x1a, 0xfb, 0xdb, 0x7, 0x4b, 0x89, 0xfb,
+ 0x17, 0xfb, 0x44, 0xfb, 0x24, 0x8b, 0xf7, 0x1e,
+ 0xc4, 0x1e, 0xf7, 0xdb, 0x7, 0xe3, 0xaa, 0x89,
+ 0xcd, 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xe,
+ 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0x1, 0xf7,
+ 0xf8, 0x79, 0x15, 0xa6, 0x6, 0xf7, 0x78, 0xf8,
+ 0xd5, 0xa1, 0xc3, 0x98, 0x9e, 0xc2, 0x92, 0x19,
+ 0xae, 0xfb, 0x69, 0x68, 0x7, 0xc4, 0x88, 0xa8,
+ 0x87, 0x64, 0x1a, 0xfb, 0x27, 0xfc, 0x18, 0x5,
+ 0xfb, 0x21, 0xf7, 0xe9, 0x77, 0xab, 0x9e, 0x1a,
+ 0xb1, 0xa2, 0x8b, 0xca, 0x8f, 0x1e, 0xae, 0xfb,
+ 0xe4, 0x68, 0x7, 0xb6, 0x84, 0x9a, 0x88, 0xa5,
+ 0x4f, 0x8, 0xe, 0xf7, 0xf5, 0x91, 0x76, 0xf8,
+ 0x7d, 0x76, 0xf7, 0x50, 0xae, 0x1, 0xf7, 0xc0,
+ 0x7c, 0x15, 0xa7, 0x6, 0xf7, 0x4a, 0xf8, 0x68,
+ 0x5, 0x92, 0x6, 0xf7, 0x3c, 0xfc, 0x68, 0x5,
+ 0xa6, 0x6, 0xf7, 0x5c, 0xf8, 0xe4, 0x97, 0xb0,
+ 0xa1, 0xa3, 0xae, 0x8e, 0x19, 0xae, 0xfb, 0x4a,
+ 0x68, 0x7, 0xad, 0x89, 0xae, 0x8a, 0x62, 0x1a,
+ 0xfb, 0xa, 0xfc, 0x8, 0x5, 0x89, 0x6, 0xfb,
+ 0x5, 0xf7, 0xf4, 0x83, 0x99, 0x97, 0x1a, 0xad,
+ 0xa8, 0x8c, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xcc,
+ 0x68, 0x7, 0xbb, 0x89, 0x96, 0x80, 0x98, 0x75,
+ 0xae, 0x35, 0x18, 0xfb, 0x9, 0xfb, 0xc5, 0x5,
+ 0x89, 0x6, 0xfb, 0xf, 0xf8, 0x8, 0x88, 0x8c,
+ 0x96, 0x1a, 0xb0, 0xa7, 0x8d, 0xaf, 0x8e, 0x1e,
+ 0xae, 0xfb, 0xba, 0x68, 0x7, 0xb5, 0x85, 0x95,
+ 0x81, 0x9c, 0x5b, 0x8, 0xe, 0xd6, 0x4e, 0x1d,
+ 0x1, 0x9b, 0xf9, 0x3f, 0x3, 0x9b, 0x16, 0xf7,
+ 0x8e, 0xae, 0x6, 0x68, 0x8e, 0x55, 0x8f, 0xae,
+ 0x1a, 0xf7, 0x20, 0xf7, 0x56, 0x5, 0xf7, 0x3,
+ 0xfb, 0x46, 0x96, 0x7b, 0x81, 0x1a, 0x70, 0x6f,
+ 0x89, 0x57, 0x88, 0x1e, 0x68, 0xf7, 0xe8, 0xae,
+ 0x7, 0x6f, 0x8d, 0x7b, 0x8d, 0x56, 0xdd, 0xfb,
+ 0x4a, 0xf7, 0xa5, 0x18, 0xf7, 0x32, 0xf7, 0x72,
+ 0x9e, 0x9c, 0xe6, 0x93, 0x8, 0xae, 0xfb, 0x8e,
+ 0x68, 0x7, 0xb7, 0x88, 0xa7, 0x8a, 0x6c, 0x1a,
+ 0x70, 0x8b, 0x95, 0xfb, 0x6, 0xfb, 0x32, 0x1e,
+ 0xfb, 0x1, 0xf7, 0x3c, 0x88, 0x87, 0x98, 0x1a,
+ 0xa8, 0x9f, 0x8b, 0xc6, 0x8f, 0x1e, 0xae, 0xfb,
+ 0xee, 0x68, 0x7, 0xb5, 0x89, 0x9c, 0x72, 0xa0,
+ 0x6c, 0xf7, 0x5a, 0xfb, 0xad, 0x18, 0xfb, 0x39,
+ 0xfb, 0x67, 0x62, 0x55, 0x5b, 0x8b, 0x72, 0x89,
+ 0x19, 0xe, 0xd6, 0x4e, 0x1d, 0x1, 0xf7, 0xaa,
+ 0xf7, 0x36, 0xf7, 0x1d, 0xf7, 0xe, 0x3, 0x69,
+ 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x66, 0xa,
+ 0xcf, 0x7f, 0x7a, 0x6e, 0xfb, 0x38, 0xfb, 0xa0,
+ 0x18, 0x42, 0x1d, 0xe, 0x8c, 0xa, 0x1, 0x39,
+ 0xa, 0xe, 0x91, 0x1d, 0xce, 0xf3, 0x3, 0xce,
+ 0xfb, 0x29, 0x15, 0xf7, 0x7e, 0xb6, 0x3b, 0x6,
+ 0x5a, 0x8a, 0xa0, 0xab, 0x1f, 0xf8, 0xfe, 0x7,
+ 0xc6, 0x96, 0x96, 0xc3, 0x1e, 0xca, 0xb6, 0xfb,
+ 0x7e, 0x6, 0xe, 0xfc, 0x5, 0xfb, 0xa, 0x76,
+ 0xf7, 0x21, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7,
+ 0x56, 0xfb, 0x1f, 0x15, 0xcf, 0x6, 0xfb, 0x4e,
+ 0xf9, 0xd2, 0x5, 0x44, 0x6, 0xe, 0x91, 0x1d,
+ 0xf7, 0x36, 0xf3, 0x3, 0xab, 0x21, 0x15, 0x60,
+ 0xf7, 0x7e, 0xf9, 0xcf, 0xfb, 0x7e, 0x60, 0xca,
+ 0x7, 0xc3, 0x96, 0x80, 0x50, 0x1f, 0xfc, 0xfe,
+ 0x7, 0x6a, 0x8b, 0x77, 0x59, 0x1e, 0xe, 0x49,
+ 0xf7, 0xe0, 0x76, 0xf8, 0x1, 0x77, 0x1, 0xd4,
+ 0xf7, 0xcb, 0x15, 0xe4, 0x6, 0xf7, 0x15, 0xf7,
+ 0xa0, 0xf7, 0x15, 0xfb, 0xa0, 0x5, 0xe4, 0x6,
+ 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b, 0x6, 0xe,
+ 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+ 0x88, 0xbd, 0x7, 0xe, 0x90, 0xa, 0xf7, 0x52,
+ 0xf8, 0xa4, 0x26, 0xa, 0x7d, 0xd1, 0x5a, 0x50,
+ 0xa, 0x12, 0xa4, 0xf7, 0x26, 0xfb, 0x13, 0xf7,
+ 0x19, 0xf7, 0x8, 0xf7, 0x1e, 0x13, 0x66, 0xf7,
+ 0xba, 0xc3, 0x32, 0x1d, 0x13, 0x26, 0x31, 0xa,
+ 0x23, 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x5b, 0x3a,
+ 0x1d, 0x1e, 0xb2, 0x6d, 0x93, 0xa0, 0x1a, 0x13,
+ 0x5a, 0x9b, 0xac, 0x9f, 0xaf, 0xd5, 0x8f, 0x55,
+ 0x58, 0x1e, 0x53, 0x7, 0x44, 0x1d, 0x13, 0x8a,
+ 0x26, 0x1d, 0xe, 0x30, 0x7d, 0xab, 0x81, 0x76,
+ 0xf8, 0x44, 0xc1, 0xf7, 0x5f, 0x77, 0x12, 0xd3,
+ 0xf7, 0x1f, 0xf7, 0x37, 0xf7, 0x27, 0x13, 0x7c,
+ 0xd3, 0x7e, 0x15, 0x97, 0x6, 0xda, 0xc3, 0x5,
+ 0x13, 0xbc, 0x5e, 0xb9, 0xb2, 0x7f, 0xaa, 0x1b,
+ 0xf7, 0x39, 0xd8, 0xf7, 0x5, 0xf7, 0x13, 0xf7,
+ 0x17, 0x46, 0xf7, 0x8, 0xfb, 0xb, 0x46, 0x67,
+ 0x65, 0x79, 0x7a, 0x1f, 0xf7, 0x97, 0xfb, 0x56,
+ 0x69, 0x7, 0xaf, 0x84, 0x9e, 0x87, 0x5c, 0x1a,
+ 0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x7b, 0x15, 0xf7,
+ 0x9b, 0x7, 0xa1, 0x94, 0x9a, 0xb0, 0xb9, 0x1b,
+ 0xe2, 0x91, 0xfb, 0x1a, 0x50, 0x1f, 0x13, 0xbc,
+ 0xfb, 0x31, 0x68, 0x58, 0x4f, 0x54, 0x7e, 0xbe,
+ 0xa7, 0x1e, 0xe, 0xfb, 0x5f, 0x7d, 0xce, 0x86,
+ 0x1d, 0xf7, 0x12, 0xf7, 0x10, 0x13, 0xb8, 0xf8,
+ 0x30, 0xf7, 0x1, 0x15, 0x70, 0x73, 0x71, 0x6e,
+ 0x52, 0x1b, 0x3d, 0x4d, 0xb5, 0xf7, 0x20, 0x8c,
+ 0x1f, 0xf5, 0x8c, 0x91, 0xf0, 0xd9, 0x1b, 0x9a,
+ 0xa5, 0x82, 0x6d, 0x1f, 0x13, 0xd8, 0x8f, 0x1d,
+ 0x37, 0xb0, 0x44, 0x2d, 0xfb, 0x22, 0x62, 0xfb,
+ 0x59, 0xfb, 0x1f, 0xe1, 0xfb, 0x2, 0xf7, 0x14,
+ 0xda, 0xcd, 0xb3, 0xcc, 0xb9, 0x1e, 0xe, 0x30,
+ 0x7d, 0xc3, 0xf8, 0xb, 0xc3, 0xf7, 0x3d, 0xad,
+ 0x12, 0xa4, 0xf7, 0x28, 0xf7, 0x37, 0xf7, 0x1f,
+ 0x17, 0xf7, 0xe7, 0xbf, 0x15, 0x4a, 0x7, 0xc9,
+ 0x9c, 0x94, 0x8c, 0xf7, 0x10, 0x9a, 0x8, 0x13,
+ 0xf8, 0xac, 0x7, 0x52, 0x8d, 0x89, 0xa8, 0xa6,
+ 0x1a, 0xf8, 0xc9, 0xfb, 0x6b, 0x69, 0x7, 0xc2,
+ 0x87, 0xa0, 0x8a, 0x56, 0x1a, 0xfb, 0x41, 0x7,
+ 0xa5, 0x73, 0x69, 0xaf, 0x4f, 0x1b, 0x2d, 0x28,
+ 0x42, 0xfb, 0x42, 0xfb, 0x26, 0xe7, 0x2d, 0xde,
+ 0xd6, 0xa7, 0xa7, 0xb1, 0xaf, 0x1f, 0x13, 0xd8,
+ 0x88, 0xc7, 0x15, 0x80, 0x66, 0x50, 0x5d, 0x3b,
+ 0x8b, 0xf7, 0x12, 0xc5, 0xec, 0x99, 0xe9, 0xd2,
+ 0xc3, 0xa1, 0x4e, 0x8a, 0x1e, 0xe, 0x49, 0x1d,
+ 0x98, 0xa, 0x17, 0xf7, 0x38, 0xf7, 0xae, 0x15,
+ 0x13, 0xe0, 0xf7, 0x1e, 0xa9, 0xa1, 0xb0, 0xdb,
+ 0x7d, 0xfb, 0x6, 0x5d, 0x8c, 0x1e, 0xfb, 0x15,
+ 0x66, 0x15, 0xf7, 0x90, 0x6, 0x13, 0xf0, 0xc1,
+ 0x7b, 0xf7, 0x42, 0xfb, 0x42, 0x1e, 0x13, 0xd0,
+ 0x2b, 0x1d, 0xe, 0xfb, 0xce, 0x8b, 0xad, 0xf8,
+ 0x13, 0xb7, 0xcf, 0xf7, 0x36, 0x6c, 0xaa, 0x12,
+ 0xd2, 0xf7, 0x1f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+ 0xaa, 0xad, 0x6, 0x4a, 0x8d, 0x7a, 0x9a, 0xb6,
+ 0x1a, 0xf7, 0xd7, 0xe2, 0xb7, 0x34, 0xf7, 0xe,
+ 0x7, 0xa6, 0x86, 0xbd, 0xbb, 0x97, 0xa3, 0x88,
+ 0x7b, 0x1e, 0x7c, 0x75, 0x7b, 0x70, 0x1a, 0x13,
+ 0xe8, 0x77, 0x9c, 0x69, 0xb5, 0xb3, 0xa2, 0xa6,
+ 0xae, 0xd0, 0x40, 0xaa, 0x4e, 0xfb, 0x49, 0x8a,
+ 0xfb, 0x19, 0x2a, 0x1e, 0x52, 0x5f, 0xc4, 0xfb,
+ 0xd7, 0x6, 0x56, 0x74, 0x88, 0x69, 0x87, 0x1e,
+ 0xe, 0xfb, 0x62, 0xf7, 0x3a, 0xfb, 0x2d, 0xab,
+ 0xf7, 0x1, 0xf7, 0xb, 0xe2, 0xa7, 0xf7, 0x6c,
+ 0xc0, 0x82, 0xaa, 0x12, 0xa7, 0xe3, 0x3c, 0xf7,
+ 0x9, 0xfb, 0x9, 0xf7, 0x1d, 0xf7, 0x15, 0xf7,
+ 0x1b, 0x69, 0xda, 0x13, 0x7a, 0x20, 0xf7, 0xc,
+ 0x63, 0x15, 0x53, 0x86, 0x67, 0x71, 0x63, 0x1a,
+ 0x13, 0x79, 0x20, 0x53, 0xd5, 0x64, 0xf7, 0x10,
+ 0xf7, 0x11, 0xf7, 0x18, 0xa6, 0xf7, 0x10, 0xf7,
+ 0x3, 0xfb, 0x7, 0x95, 0x5a, 0x8c, 0x1e, 0x13,
+ 0x79, 0x40, 0xfb, 0x1f, 0x8d, 0x71, 0x8c, 0xad,
+ 0x1a, 0xa9, 0xb0, 0x9f, 0x9e, 0xec, 0x8b, 0x8b,
+ 0x94, 0xa8, 0x1e, 0xd3, 0xa2, 0xac, 0xc9, 0xc8,
+ 0x1a, 0xc7, 0x6d, 0x9e, 0x81, 0x95, 0x1e, 0x13,
+ 0x7a, 0x20, 0xdd, 0xc0, 0xfb, 0x17, 0x6, 0x13,
+ 0x94, 0xc0, 0x9b, 0x63, 0x67, 0x91, 0x67, 0x1b,
+ 0xfb, 0x1d, 0x49, 0x37, 0x3b, 0x43, 0xbb, 0x5a,
+ 0xd5, 0x70, 0x1f, 0x89, 0x7, 0x60, 0x7f, 0x41,
+ 0x64, 0x4c, 0x1a, 0x57, 0xac, 0x7c, 0xb8, 0x7b,
+ 0x1e, 0x13, 0x7a, 0x20, 0xaa, 0x7d, 0x15, 0xf7,
+ 0x41, 0x6, 0xbf, 0xa7, 0x7c, 0x67, 0x44, 0xfb,
+ 0x1e, 0x8b, 0x63, 0x7a, 0x2e, 0x8a, 0xcb, 0xa1,
+ 0x94, 0x9b, 0xa5, 0xa0, 0x1f, 0x13, 0x74, 0xc0,
+ 0xa2, 0xf7, 0xfd, 0x15, 0xca, 0x90, 0xd1, 0xc8,
+ 0xcd, 0x8b, 0x33, 0x5e, 0x52, 0x88, 0x45, 0x4c,
+ 0x50, 0x84, 0xc5, 0xd0, 0x1e, 0xe, 0x30, 0x82,
+ 0x1d, 0xf7, 0x5f, 0x77, 0x1, 0xbb, 0xf7, 0x1f,
+ 0xf7, 0x2c, 0x8a, 0xa, 0x9b, 0x41, 0xa, 0x8b,
+ 0xb3, 0x9c, 0x1f, 0x76, 0xa, 0x57, 0x60, 0x75,
+ 0x53, 0x5b, 0x1e, 0xf7, 0xad, 0xfb, 0x54, 0x69,
+ 0x7, 0xb2, 0x83, 0x99, 0x88, 0x5c, 0x1a, 0xfc,
+ 0x81, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x8b, 0xa,
+ 0x5d, 0xa, 0x12, 0xb5, 0xf7, 0x2f, 0xfb, 0x1d,
+ 0xf7, 0x2f, 0xfb, 0x26, 0x84, 0x1d, 0x13, 0xc8,
+ 0x2d, 0xa, 0x13, 0xd0, 0xb7, 0xf8, 0xd7, 0x15,
+ 0x60, 0xab, 0x69, 0xb9, 0xb6, 0xad, 0xac, 0xb7,
+ 0xb6, 0x69, 0xae, 0x60, 0x5e, 0x6a, 0x67, 0x61,
+ 0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x5f, 0xf7, 0x35,
+ 0xf8, 0xd6, 0xf7, 0x2f, 0x12, 0xea, 0xf7, 0x2c,
+ 0xfb, 0x27, 0xf7, 0x1f, 0x13, 0xd0, 0xc5, 0xf8,
+ 0x3f, 0x15, 0xae, 0x88, 0xa7, 0x8a, 0x54, 0x7e,
+ 0xa, 0x61, 0x83, 0x69, 0x63, 0x88, 0x6e, 0x8c,
+ 0x9b, 0x93, 0x92, 0x95, 0x91, 0x96, 0x1e, 0x90,
+ 0x94, 0x90, 0x95, 0x96, 0x1a, 0xa0, 0x79, 0xac,
+ 0x62, 0x61, 0x77, 0x6c, 0x6f, 0x41, 0xd6, 0x6f,
+ 0xc2, 0xf7, 0x4b, 0x8f, 0xf7, 0x28, 0xc4, 0x1e,
+ 0xf8, 0x5f, 0xfb, 0x5e, 0x7, 0x13, 0xe0, 0xbd,
+ 0xf7, 0x2c, 0x15, 0x60, 0xaa, 0x69, 0xb9, 0xb6,
+ 0xae, 0xac, 0xb7, 0xb6, 0x68, 0xae, 0x60, 0x5e,
+ 0x6b, 0x67, 0x61, 0x1e, 0xe, 0x30, 0x8b, 0xad,
+ 0xf8, 0x3f, 0x77, 0xf7, 0x7f, 0x77, 0x1, 0xd1,
+ 0x8a, 0xa, 0xa1, 0x16, 0x99, 0xa, 0x5b, 0x92,
+ 0x87, 0x94, 0xb7, 0x1a, 0xf3, 0x7, 0xa2, 0xa3,
+ 0x5, 0xf5, 0xfb, 0x1e, 0x98, 0x77, 0x80, 0x1a,
+ 0x7b, 0x6f, 0x88, 0x7d, 0x1e, 0x69, 0xf7, 0x7e,
+ 0xad, 0x7, 0x83, 0x84, 0x8c, 0x99, 0x81, 0x1f,
+ 0xfb, 0x56, 0xf7, 0x96, 0xa5, 0xaa, 0xc1, 0xb1,
+ 0xa1, 0x9d, 0x19, 0xa7, 0xa2, 0x9e, 0x8f, 0xb3,
+ 0x92, 0x8, 0xac, 0xfb, 0x6a, 0x6a, 0x7, 0xbb,
+ 0x84, 0x96, 0x89, 0x77, 0x1a, 0xfb, 0x29, 0xfb,
+ 0x2e, 0x5, 0xf8, 0x43, 0xfb, 0x4f, 0x69, 0x7,
+ 0xbb, 0x8b, 0x5c, 0x80, 0x1f, 0xfc, 0x7e, 0x7,
+ 0x73, 0x83, 0x67, 0x63, 0x1e, 0xe, 0xfc, 0x5,
+ 0x8b, 0xad, 0xf9, 0x16, 0x77, 0x12, 0xc1, 0xf7,
+ 0x1f, 0xfb, 0x12, 0x84, 0x1d, 0x13, 0xd0, 0x64,
+ 0x81, 0xaa, 0xa8, 0x1f, 0xf8, 0xda, 0x8d, 0xa,
+ 0xfc, 0x7e, 0x97, 0x1d, 0xf7, 0x4e, 0x82, 0x1d,
+ 0x4c, 0x76, 0xd3, 0x77, 0x12, 0xd2, 0xf7, 0x1f,
+ 0xf7, 0x1e, 0x53, 0xa, 0x14, 0xe, 0x13, 0xce,
+ 0x9b, 0x16, 0xf7, 0x84, 0xad, 0x6, 0x64, 0x8f,
+ 0x84, 0xa1, 0xaa, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+ 0xb3, 0xbd, 0xb6, 0xc2, 0x8b, 0x58, 0x6b, 0x1e,
+ 0xfb, 0x7c, 0x7, 0x74, 0x8b, 0x6c, 0x5b, 0x88,
+ 0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x65, 0x8e,
+ 0x82, 0xa1, 0xab, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+ 0xb5, 0xbd, 0xb5, 0xc1, 0x8b, 0x57, 0x6c, 0x1e,
+ 0xfb, 0x7c, 0x7, 0x73, 0x8b, 0x6c, 0x5a, 0x89,
+ 0x1e, 0x69, 0xf7, 0x82, 0xad, 0x7, 0x59, 0x8c,
+ 0x8b, 0xaa, 0xa4, 0x1a, 0xf7, 0x85, 0x7, 0xf7,
+ 0x2, 0x3c, 0xaa, 0x54, 0x51, 0x5e, 0x6f, 0x50,
+ 0x5e, 0x1e, 0xab, 0x7c, 0x72, 0xc2, 0x30, 0x1b,
+ 0x13, 0xbe, 0x37, 0x5f, 0x4f, 0x73, 0x7d, 0x1f,
+ 0x88, 0x1d, 0xa8, 0x87, 0xa5, 0x88, 0x57, 0x1a,
+ 0xfb, 0xa6, 0x7, 0x5a, 0x75, 0x86, 0x6a, 0x8b,
+ 0x1d, 0x30, 0x82, 0x1d, 0x4c, 0x76, 0xd3, 0x77,
+ 0x12, 0xcd, 0xf7, 0x1f, 0xfb, 0x17, 0x85, 0x1d,
+ 0x13, 0xca, 0xa0, 0x16, 0xf7, 0x85, 0xad, 0x6,
+ 0x13, 0xc6, 0x59, 0x1d, 0x1e, 0x13, 0xc9, 0xc1,
+ 0x8c, 0x54, 0x6f, 0x1f, 0x4f, 0xa, 0x8d, 0x8b,
+ 0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x1e, 0x13, 0xba,
+ 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1f, 0x88, 0x1d,
+ 0x13, 0xc6, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a,
+ 0xfb, 0xa6, 0x7, 0x5a, 0x7a, 0x87, 0x67, 0x8b,
+ 0xa, 0x65, 0xa, 0x12, 0xa4, 0xf7, 0x27, 0xf7,
+ 0x25, 0xf7, 0x27, 0xfb, 0x1b, 0xf7, 0x27, 0x13,
+ 0xf0, 0xf7, 0x40, 0xf7, 0x7c, 0x78, 0x1d, 0xeb,
+ 0xd5, 0x1e, 0x13, 0xe8, 0xc8, 0x9c, 0x4d, 0x64,
+ 0xa, 0x39, 0x46, 0x3b, 0x8b, 0xf6, 0xf7, 0x0,
+ 0x1f, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb,
+ 0x8, 0x70, 0xa, 0xf6, 0x6f, 0xa, 0xf7, 0x0,
+ 0x70, 0x1d, 0xfb, 0x4, 0xfb, 0x15, 0x1e, 0xe,
+ 0x7c, 0xa, 0x7f, 0x77, 0x12, 0xd6, 0xf7, 0x1f,
+ 0xf7, 0xc, 0xf7, 0x28, 0x21, 0xf7, 0x28, 0x13,
+ 0xf6, 0x81, 0xa, 0x1e, 0x13, 0xf5, 0x90, 0x1d,
+ 0x54, 0x75, 0xc8, 0x8b, 0x1f, 0x7a, 0x1d, 0x89,
+ 0xc8, 0x58, 0xa, 0x7a, 0x1f, 0x89, 0x6, 0x13,
+ 0xee, 0xcd, 0xfb, 0x55, 0x69, 0x7, 0xb9, 0x85,
+ 0x95, 0x7c, 0x65, 0x1a, 0xfc, 0x75, 0x92, 0xa,
+ 0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x53, 0xc1, 0xf8,
+ 0x25, 0xab, 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x36,
+ 0x8a, 0xa, 0xf7, 0xea, 0xed, 0x15, 0x8d, 0x7a,
+ 0x51, 0x56, 0x1b, 0x49, 0x6f, 0xc7, 0xf7, 0x16,
+ 0xde, 0x91, 0xf7, 0x14, 0xde, 0xb9, 0xa6, 0x63,
+ 0x63, 0x1f, 0x42, 0xfc, 0xa7, 0x15, 0x68, 0xf7,
+ 0x9f, 0xad, 0x7, 0x67, 0x92, 0x78, 0x8e, 0xbb,
+ 0x1a, 0xf8, 0xde, 0x7c, 0x7, 0x3d, 0x52, 0x5,
+ 0xab, 0x67, 0x6c, 0xa4, 0x57, 0x1b, 0xfb, 0x2a,
+ 0x36, 0xfb, 0x11, 0xfb, 0xa, 0xfb, 0x3f, 0xe4,
+ 0x42, 0xef, 0xa8, 0xbc, 0x96, 0xb8, 0xb4, 0x1f,
+ 0xfb, 0x2f, 0x7, 0x5e, 0x79, 0x89, 0x54, 0x81,
+ 0x1e, 0xe, 0xfb, 0x5f, 0x8b, 0xad, 0xf7, 0xba,
+ 0xf7, 0x25, 0x45, 0x76, 0xa5, 0x76, 0xd5, 0x77,
+ 0x12, 0xde, 0xf7, 0x1f, 0x13, 0x9c, 0xa8, 0x16,
+ 0xf7, 0x9e, 0xad, 0x6, 0x4e, 0x8e, 0x7f, 0x92,
+ 0xbd, 0x1a, 0xf7, 0x5a, 0x7, 0xd4, 0xb7, 0xa1,
+ 0x9a, 0x9c, 0x93, 0x79, 0x7b, 0x98, 0x1e, 0x13,
+ 0xc4, 0x7e, 0x96, 0x99, 0x7f, 0xa5, 0x1b, 0xbd,
+ 0x99, 0xb4, 0xa5, 0xa3, 0x7c, 0xc1, 0x47, 0x1f,
+ 0x13, 0xac, 0x4a, 0x5e, 0x4f, 0x6c, 0x76, 0x1f,
+ 0x89, 0xda, 0xfb, 0x51, 0x73, 0x6, 0xa9, 0x87,
+ 0xa3, 0x86, 0x59, 0x1a, 0xfb, 0xb0, 0x7, 0x59,
+ 0x75, 0x87, 0x6b, 0x8b, 0x1d, 0xfb, 0x96, 0x7d,
+ 0xad, 0x7f, 0x76, 0xf7, 0xfc, 0x76, 0xf7, 0x6,
+ 0xac, 0x89, 0x77, 0x12, 0xa4, 0xef, 0xf7, 0x20,
+ 0xeb, 0x13, 0x76, 0xa4, 0x7e, 0x15, 0xae, 0x6,
+ 0x9f, 0x95, 0x91, 0x93, 0x96, 0x1b, 0x8d, 0x90,
+ 0x89, 0x88, 0x91, 0x1f, 0x13, 0xb6, 0x83, 0x9e,
+ 0xae, 0x7b, 0xb0, 0x1b, 0xe8, 0xd8, 0xc6, 0xea,
+ 0xdb, 0x52, 0xaf, 0x52, 0xa6, 0x1f, 0x4f, 0xa8,
+ 0x4d, 0x9e, 0xbf, 0x1a, 0xaa, 0xa4, 0xa5, 0xaf,
+ 0xc4, 0xb4, 0x60, 0x44, 0xa0, 0x1e, 0xae, 0x6,
+ 0x13, 0xae, 0xf7, 0x25, 0x6b, 0x7, 0x83, 0x88,
+ 0x87, 0x7f, 0x79, 0x1b, 0x83, 0x80, 0x8f, 0x90,
+ 0x7e, 0x1f, 0x13, 0xb6, 0x91, 0x7a, 0x75, 0x92,
+ 0x71, 0x1b, 0x2f, 0x46, 0x50, 0x33, 0x41, 0xc3,
+ 0x66, 0xc5, 0x6e, 0x1f, 0xc9, 0x6c, 0xcb, 0x76,
+ 0x5b, 0x1a, 0x6d, 0x73, 0x67, 0x59, 0xfb, 0x3,
+ 0x80, 0xf4, 0xa6, 0x85, 0x1e, 0x65, 0x6, 0xe,
+ 0xfb, 0xce, 0x7f, 0xd2, 0xf7, 0xfa, 0xb7, 0xf7,
+ 0x3d, 0x77, 0x12, 0xc0, 0xf7, 0x1f, 0xfb, 0xc,
+ 0xf7, 0x1f, 0x13, 0xf0, 0xf7, 0xc7, 0xf7, 0x3,
+ 0x15, 0x76, 0x80, 0x7a, 0x6c, 0x6e, 0x1b, 0x13,
+ 0xe8, 0x63, 0x8c, 0xa7, 0x9b, 0x1f, 0xf7, 0xce,
+ 0xe9, 0xb7, 0x2d, 0xf7, 0x3d, 0x72, 0x7, 0x47,
+ 0x2a, 0x5e, 0x5f, 0x56, 0x5e, 0x8, 0x70, 0xbf,
+ 0xfb, 0xce, 0x7, 0x76, 0x8c, 0x8f, 0x2d, 0xf7,
+ 0x0, 0x1b, 0xe5, 0xaf, 0xd0, 0xb6, 0xa0, 0x1f,
+ 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0x12,
+ 0xcc, 0x85, 0x1d, 0x13, 0xf0, 0x71, 0xa, 0x13,
+ 0xe8, 0x25, 0x1d, 0xe, 0x92, 0x76, 0xf8, 0x4d,
+ 0xad, 0x1, 0xa0, 0xf8, 0x64, 0x3, 0xf7, 0x85,
+ 0x7d, 0x15, 0xa5, 0x6, 0xf7, 0x34, 0xf8, 0x16,
+ 0x9f, 0xbd, 0x99, 0x8d, 0xa3, 0x8e, 0x19, 0x4d,
+ 0x1d, 0x38, 0xfb, 0x6d, 0x5, 0x33, 0xf7, 0x6c,
+ 0x8b, 0x8e, 0x8f, 0x1a, 0xa2, 0x9f, 0x8c, 0xac,
+ 0x8e, 0x48, 0x1d, 0xe, 0xd6, 0x92, 0x76, 0xf7,
+ 0xd8, 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf8, 0xd0,
+ 0xf7, 0x1b, 0x3, 0xf7, 0x78, 0x7d, 0x15, 0xa3,
+ 0x6, 0xf7, 0xe, 0xf7, 0xc3, 0x5, 0x90, 0x6,
+ 0xef, 0xfb, 0xc3, 0x5, 0xa2, 0x6, 0xf7, 0x2f,
+ 0xf8, 0x1b, 0x9c, 0xb7, 0x99, 0x8d, 0x9e, 0x8f,
+ 0x19, 0xad, 0xfb, 0x1b, 0x69, 0x7, 0xa7, 0x88,
+ 0x9f, 0x89, 0x6b, 0x1a, 0x75, 0x58, 0xfb, 0x1,
+ 0x70, 0x3f, 0x1e, 0x89, 0x6, 0x79, 0xd9, 0x61,
+ 0xf7, 0xc, 0xa0, 0x1a, 0xa0, 0xa1, 0x8d, 0xa5,
+ 0x8d, 0x1e, 0xad, 0xfb, 0x7e, 0x69, 0x7, 0xa3,
+ 0x88, 0x96, 0x8b, 0x94, 0x76, 0x90, 0x7f, 0x91,
+ 0x81, 0x95, 0x69, 0x47, 0xfb, 0x3f, 0x18, 0x59,
+ 0xf7, 0x1a, 0x69, 0xcd, 0xa0, 0x1a, 0xa5, 0xa3,
+ 0x8d, 0x99, 0x8d, 0x1e, 0xad, 0xfb, 0x72, 0x69,
+ 0x7, 0xa5, 0x86, 0x90, 0x8e, 0xa5, 0x4a, 0x8,
+ 0xe, 0xa0, 0x76, 0xf8, 0x3f, 0xad, 0x1, 0x99,
+ 0xf8, 0x6a, 0x3, 0x99, 0x16, 0xf7, 0x3d, 0xad,
+ 0x6, 0x7a, 0x8c, 0x5b, 0x90, 0x9a, 0x9f, 0x8,
+ 0x9a, 0xa0, 0xcc, 0xe5, 0x8b, 0x1a, 0x8b, 0xc1,
+ 0x36, 0xa0, 0x6c, 0x1e, 0x94, 0x7e, 0x6b, 0x84,
+ 0x75, 0x8a, 0x8, 0x69, 0xf7, 0x85, 0xad, 0x7,
+ 0x7e, 0x8f, 0x83, 0x8e, 0x82, 0x98, 0xfb, 0x28,
+ 0xf7, 0x6e, 0x18, 0xf0, 0xf7, 0x8, 0x9d, 0xa2,
+ 0xa3, 0x97, 0xa7, 0x8f, 0x19, 0xad, 0xfb, 0x3c,
+ 0x69, 0x7, 0xb2, 0x88, 0x97, 0x8a, 0x76, 0x1a,
+ 0x7d, 0x8b, 0x95, 0x41, 0x2c, 0x1e, 0x7c, 0x9e,
+ 0x53, 0xcf, 0x9c, 0x1a, 0x9b, 0xa2, 0x8f, 0xa3,
+ 0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa6, 0x87,
+ 0x93, 0x82, 0x9c, 0x71, 0xf7, 0x14, 0xfb, 0x4f,
+ 0x18, 0xfb, 0x17, 0xfb, 0x3f, 0x88, 0x94, 0x5f,
+ 0x86, 0x8, 0xe, 0xfb, 0x61, 0xf7, 0x23, 0xf8,
+ 0x9f, 0x77, 0x1, 0xf7, 0x80, 0x7e, 0x15, 0x79,
+ 0x56, 0x5, 0x75, 0x84, 0x2b, 0xa, 0xe, 0x87,
+ 0x1d, 0x1, 0xb1, 0xaf, 0x87, 0xa, 0x65, 0x8e,
+ 0x1d, 0x6b, 0x8b, 0x62, 0x8c, 0xf7, 0x7f, 0xf8,
+ 0x27, 0x18, 0xa5, 0xfc, 0xb, 0x7, 0x84, 0xfb,
+ 0x22, 0x5, 0xaf, 0x6, 0xa5, 0xf7, 0x1, 0xb0,
+ 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x28,
+ 0x18, 0xe, 0x8d, 0x1d, 0xf7, 0x15, 0xf4, 0x3,
+ 0xa1, 0xf7, 0x99, 0x15, 0xe2, 0x78, 0x9f, 0x5e,
+ 0x49, 0x1a, 0xfb, 0x3f, 0x7, 0xfb, 0xd, 0xd9,
+ 0x7d, 0xf7, 0x19, 0x1e, 0x97, 0x7, 0x3a, 0x99,
+ 0x72, 0xb3, 0xd0, 0x1a, 0xf7, 0x3f, 0x7, 0xd2,
+ 0x7a, 0xb3, 0x2a, 0x9d, 0x1e, 0x8d, 0x7, 0xec,
+ 0x9d, 0x9c, 0xa5, 0xd2, 0x1a, 0xf7, 0x47, 0x7,
+ 0xd1, 0xa4, 0xb8, 0xdc, 0x9a, 0x1e, 0x97, 0x7,
+ 0xfb, 0x19, 0x3d, 0x77, 0xfb, 0xe, 0x1f, 0xfb,
+ 0x47, 0x7, 0x49, 0x77, 0x6c, 0x34, 0x78, 0x1e,
+ 0xe, 0xfc, 0x3f, 0xfb, 0x29, 0x76, 0xf7, 0x40,
+ 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xcd, 0xe3, 0x3e,
+ 0xd0, 0x3, 0xd8, 0xfb, 0x3e, 0x15, 0xd0, 0xf9,
+ 0xf1, 0x46, 0x6, 0xe, 0x8d, 0x1d, 0xf7, 0x34,
+ 0xf4, 0x3, 0xc1, 0xfb, 0x37, 0x15, 0x7f, 0x7,
+ 0xf7, 0x19, 0xd9, 0x99, 0xf7, 0xe, 0x1f, 0xf7,
+ 0x3f, 0x7, 0xcd, 0x9f, 0xb8, 0xe2, 0x9e, 0x1e,
+ 0x34, 0x9e, 0x77, 0xaa, 0xcd, 0x1a, 0xf7, 0x47,
+ 0x7, 0xf7, 0xd, 0x3d, 0x9f, 0xfb, 0x19, 0x1e,
+ 0x7f, 0x7, 0xdc, 0x7d, 0xa4, 0x5d, 0x46, 0x1a,
+ 0xfb, 0x47, 0x7, 0x44, 0x9c, 0x71, 0xec, 0x79,
+ 0x1e, 0x89, 0x7, 0x2a, 0x79, 0x7a, 0x63, 0x44,
+ 0x1a, 0xfb, 0x3f, 0x7, 0x45, 0x72, 0x64, 0x3a,
+ 0x7c, 0x1e, 0xe, 0xfb, 0x13, 0xf7, 0x41, 0xf7,
+ 0x34, 0x1, 0xa8, 0xf8, 0x62, 0x3, 0xcc, 0xf7,
+ 0x41, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b,
+ 0xb1, 0xaa, 0x7e, 0x7c, 0xa8, 0x1f, 0x78, 0xb1,
+ 0xae, 0x76, 0xb9, 0x1b, 0xc9, 0xac, 0xb7, 0xb5,
+ 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74, 0x72,
+ 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b, 0x66,
+ 0x1f, 0x9d, 0x64, 0x63, 0x9d, 0x6a, 0x1b, 0x48,
+ 0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, 0xce,
+ 0xfb, 0x4a, 0x76, 0xf8, 0xab, 0xf7, 0x3d, 0x12,
+ 0xdd, 0xf7, 0x3d, 0x29, 0xa8, 0x13, 0xe0, 0xdd,
+ 0xf8, 0x35, 0x15, 0x5d, 0xb1, 0x64, 0xba, 0xbb,
+ 0xaf, 0xb3, 0xb8, 0xba, 0x67, 0xb0, 0x5b, 0x5c,
+ 0x65, 0x67, 0x5b, 0x1e, 0x13, 0xd0, 0xd2, 0xfb,
+ 0x37, 0x15, 0x84, 0x44, 0x83, 0x57, 0x82, 0x62,
+ 0x8, 0x75, 0x20, 0x73, 0x71, 0x4e, 0x1a, 0x4b,
+ 0xac, 0x68, 0xbe, 0xbf, 0xac, 0xae, 0xcb, 0xc8,
+ 0x73, 0xa4, 0x75, 0xf5, 0x1e, 0x82, 0xb4, 0x83,
+ 0xc0, 0x84, 0xd3, 0x8, 0xe, 0xfb, 0xb, 0x76,
+ 0xf7, 0x27, 0x76, 0xf7, 0xe3, 0x76, 0xf7, 0x22,
+ 0xaa, 0xf7, 0x7, 0x77, 0x1, 0xc0, 0xf7, 0x21,
+ 0xf7, 0x13, 0xf7, 0xf, 0x3, 0xf7, 0x75, 0xf7,
+ 0x14, 0x15, 0x77, 0xb1, 0x80, 0xbe, 0xc4, 0x1a,
+ 0xab, 0x90, 0xf7, 0x1c, 0xdb, 0x9c, 0xa4, 0x7f,
+ 0x6d, 0x1e, 0x88, 0x7, 0xfb, 0x53, 0xfc, 0xad,
+ 0x15, 0xb3, 0x6, 0xba, 0xf7, 0x19, 0x5, 0x86,
+ 0x9b, 0x9c, 0x89, 0x9d, 0x1b, 0xac, 0xe2, 0x8b,
+ 0xee, 0xd1, 0x1f, 0x79, 0x9d, 0x5, 0x74, 0x78,
+ 0x6f, 0x70, 0x4f, 0x1b, 0x6b, 0x70, 0x98, 0xa3,
+ 0x75, 0x1f, 0xdd, 0xf7, 0x7a, 0x5, 0x7d, 0x96,
+ 0x9c, 0x85, 0x9b, 0x1b, 0x8f, 0xc9, 0x8b, 0xcb,
+ 0xb4, 0x70, 0xa8, 0x67, 0x9d, 0x1f, 0xbb, 0xf7,
+ 0x1c, 0x5, 0x63, 0x6, 0x5f, 0xfb, 0xf, 0x5,
+ 0x90, 0x78, 0x77, 0x8e, 0x78, 0x1b, 0xfb, 0x2,
+ 0xfb, 0x10, 0x39, 0xfb, 0x3b, 0xfb, 0x7, 0xc3,
+ 0x42, 0xd3, 0x6c, 0x1f, 0xe, 0x7d, 0xaa, 0x6c,
+ 0xf7, 0x12, 0x23, 0x76, 0xf7, 0x17, 0xb9, 0xf7,
+ 0x24, 0xcc, 0xf7, 0x12, 0xf7, 0x4d, 0x6d, 0xa9,
+ 0x12, 0xa0, 0xab, 0xbf, 0xf7, 0x12, 0x13, 0x5b,
+ 0x80, 0xf7, 0x71, 0xbc, 0x15, 0x54, 0xc6, 0xad,
+ 0x83, 0xaa, 0x1b, 0xf7, 0x7, 0x96, 0xf7, 0xf,
+ 0xd5, 0x91, 0x1f, 0x74, 0x6, 0x60, 0x80, 0x7b,
+ 0x6f, 0x3f, 0x1b, 0x7f, 0x6c, 0x8d, 0x9f, 0x58,
+ 0x1f, 0xa2, 0xc6, 0x8a, 0xc5, 0x87, 0xc4, 0x8,
+ 0xf7, 0x1, 0xcc, 0xfb, 0x6, 0x6, 0x87, 0x9a,
+ 0x68, 0xf7, 0x3f, 0xa3, 0x1a, 0xac, 0x96, 0xb1,
+ 0xb8, 0xb7, 0x8b, 0x69, 0x7f, 0x1e, 0x13, 0x3d,
+ 0x80, 0x37, 0x89, 0xa4, 0x72, 0xad, 0x1b, 0xbf,
+ 0x9e, 0xad, 0xb1, 0x97, 0x8b, 0xf0, 0xfb, 0x2e,
+ 0xfb, 0x2d, 0x5c, 0xfb, 0xa, 0x3c, 0x65, 0x92,
+ 0x65, 0x92, 0x65, 0x1f, 0x3b, 0x4a, 0x6, 0x13,
+ 0x39, 0x0, 0xed, 0x6, 0x9b, 0x5d, 0xa3, 0x51,
+ 0x8c, 0x5c, 0x8, 0x8f, 0x7c, 0x80, 0x8e, 0x71,
+ 0x1b, 0x26, 0x87, 0x46, 0x70, 0x43, 0xcc, 0x82,
+ 0x9d, 0xd2, 0xa9, 0xb4, 0xa0, 0x9b, 0x1f, 0x63,
+ 0xb0, 0x15, 0x13, 0x9d, 0x80, 0x71, 0x84, 0x7e,
+ 0x60, 0x55, 0x1b, 0x7a, 0x66, 0x94, 0xb3, 0x99,
+ 0x93, 0xb1, 0xb8, 0xb2, 0x9e, 0x7a, 0x7c, 0x9c,
+ 0x1f, 0xe, 0xf7, 0x38, 0xd4, 0xf7, 0x5b, 0xd6,
+ 0x1, 0xd8, 0xe3, 0xf7, 0x31, 0xe3, 0x3, 0xf7,
+ 0x1c, 0xf7, 0xe6, 0x15, 0xca, 0xbb, 0xbf, 0xcc,
+ 0xce, 0xbb, 0x57, 0x4c, 0x4a, 0x5b, 0x52, 0x48,
+ 0x4a, 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8d,
+ 0x15, 0xe1, 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c,
+ 0xb4, 0x1b, 0xb6, 0xb3, 0x9a, 0x9e, 0xa7, 0x1f,
+ 0xe1, 0x33, 0xbf, 0xbf, 0x33, 0xe3, 0x5, 0xa0,
+ 0xa5, 0x97, 0xb3, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1,
+ 0x78, 0xa7, 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x35,
+ 0x35, 0x5, 0x9e, 0x6f, 0x65, 0x95, 0x5e, 0x1b,
+ 0x62, 0x63, 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1,
+ 0x57, 0x59, 0xe3, 0x33, 0x5, 0x78, 0x71, 0x7c,
+ 0x63, 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f,
+ 0x1e, 0x33, 0x33, 0x5, 0xe, 0x8b, 0xae, 0xf7,
+ 0xb, 0xbd, 0xe8, 0xbd, 0xf7, 0xb9, 0xaf, 0x1,
+ 0xf7, 0x4d, 0xf7, 0x16, 0xe0, 0xf7, 0x13, 0x3,
+ 0xde, 0x16, 0xf7, 0xdf, 0xae, 0x6, 0x4b, 0x91,
+ 0x68, 0x8d, 0xdd, 0x1a, 0xb2, 0xf7, 0x1b, 0xbd,
+ 0xfb, 0x1b, 0xce, 0x7, 0x8f, 0x96, 0x5, 0xf7,
+ 0x17, 0xbd, 0xfb, 0x3, 0x6, 0xf7, 0x10, 0xf7,
+ 0x99, 0x9c, 0xac, 0xaa, 0x8d, 0x9b, 0x8d, 0x19,
+ 0xaf, 0xfb, 0x61, 0x67, 0x7, 0xb5, 0x89, 0xaf,
+ 0x8a, 0x64, 0x1a, 0x21, 0xfb, 0x92, 0x5, 0x89,
+ 0x6, 0x55, 0xf7, 0x2, 0x51, 0xf7, 0x14, 0xa5,
+ 0x1a, 0xa3, 0x9d, 0x93, 0xc6, 0x1e, 0xaf, 0xfb,
+ 0xc1, 0x67, 0x7, 0xb8, 0x89, 0xa3, 0x74, 0x99,
+ 0x6f, 0xf7, 0x2, 0xfb, 0x89, 0x18, 0x28, 0x59,
+ 0xf7, 0x10, 0x6, 0x96, 0x76, 0x5, 0x52, 0xfb,
+ 0x1b, 0x59, 0xf7, 0x1b, 0x64, 0x7, 0x39, 0x66,
+ 0x89, 0x4a, 0x8b, 0x1d, 0xfc, 0x3f, 0x8d, 0x76,
+ 0xf8, 0x5d, 0x76, 0xf7, 0xa6, 0x77, 0x1, 0xcd,
+ 0xe3, 0x3e, 0xce, 0x3, 0xd8, 0xf8, 0x35, 0x15,
+ 0xcd, 0xf7, 0xa6, 0x49, 0x6, 0xfd, 0x5a, 0x4,
+ 0xce, 0xf7, 0xae, 0x48, 0x6, 0xe, 0xfb, 0xf,
+ 0xa2, 0xf7, 0x93, 0xa4, 0xf7, 0x2d, 0x77, 0xea,
+ 0xa2, 0xf7, 0x6a, 0x77, 0x12, 0xb3, 0xd6, 0x56,
+ 0xd6, 0x5c, 0xf7, 0x14, 0xf7, 0x0, 0xe0, 0x13,
+ 0x8c, 0x80, 0xf7, 0xc5, 0xf7, 0x24, 0x15, 0xb8,
+ 0x8c, 0xe8, 0x8e, 0xf7, 0x6, 0xf7, 0x38, 0xfb,
+ 0xa2, 0xdc, 0xe4, 0x1a, 0xb9, 0xa7, 0xa5, 0xb4,
+ 0xb9, 0xa1, 0x7d, 0x84, 0x84, 0x80, 0x82, 0x80,
+ 0x81, 0x1e, 0x81, 0x82, 0x81, 0x7f, 0x7c, 0x1a,
+ 0x71, 0xa8, 0x6c, 0xac, 0x9a, 0xbb, 0x9a, 0xbf,
+ 0xa6, 0x67, 0xd0, 0xfb, 0x7, 0x1e, 0x13, 0xfc,
+ 0x80, 0x3f, 0x48, 0x59, 0x38, 0x51, 0xbb, 0x64,
+ 0xbd, 0x5f, 0x1f, 0x89, 0x89, 0x5, 0x13, 0xea,
+ 0x80, 0x62, 0x8e, 0x2a, 0x87, 0xfb, 0xf, 0x1a,
+ 0x3d, 0xb9, 0x6b, 0xf7, 0xe, 0x24, 0x1e, 0xd8,
+ 0x4d, 0x9c, 0x7c, 0x62, 0x1a, 0x65, 0x71, 0x6c,
+ 0x53, 0x51, 0x84, 0xa2, 0x91, 0x91, 0x94, 0x90,
+ 0x94, 0x91, 0x1e, 0x98, 0x93, 0x9a, 0x95, 0xa2,
+ 0x1a, 0x13, 0xf9, 0x80, 0xa1, 0x75, 0xac, 0x5f,
+ 0x5c, 0x7c, 0x5e, 0x79, 0x46, 0xe0, 0x6a, 0xc9,
+ 0x1e, 0x13, 0xfa, 0x80, 0xf6, 0xc7, 0xc6, 0xd0,
+ 0xc8, 0x61, 0xba, 0x52, 0xb1, 0x1f, 0xfb, 0x41,
+ 0xf7, 0x57, 0x15, 0xb8, 0xb1, 0x95, 0x9d, 0x1e,
+ 0x13, 0x8c, 0x80, 0xba, 0xe2, 0x33, 0x89, 0x8d,
+ 0x1f, 0xb1, 0x64, 0x90, 0x80, 0x70, 0x1a, 0x72,
+ 0x7d, 0x6a, 0x62, 0x6b, 0x6c, 0xa4, 0xa3, 0x6f,
+ 0x1e, 0x48, 0xc3, 0x75, 0x9f, 0xb8, 0x1a, 0xe,
+ 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1, 0x89,
+ 0x3f, 0xa, 0xe, 0xef, 0x78, 0xbf, 0xf7, 0x5,
+ 0xa2, 0xf7, 0xb0, 0x76, 0xe0, 0xa2, 0xf6, 0xbf,
+ 0x1, 0xae, 0xd2, 0xf7, 0x7, 0xf1, 0xf7, 0x4a,
+ 0x9e, 0xf7, 0x12, 0xd2, 0x3, 0x71, 0x1d, 0xf7,
+ 0x30, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29, 0xf7,
+ 0x31, 0x55, 0xa, 0xfb, 0x1f, 0xfb, 0x39, 0xfb,
+ 0x38, 0xfb, 0xc, 0xfb, 0x1e, 0x80, 0x1d, 0xf8,
+ 0x40, 0x3c, 0x15, 0x58, 0x74, 0x64, 0x63, 0x4f,
+ 0x1b, 0x2e, 0x6a, 0xd7, 0xf4, 0x8c, 0x1f, 0xef,
+ 0x8c, 0xb2, 0xd6, 0xdd, 0x1b, 0xd2, 0xa6, 0x5c,
+ 0x61, 0x95, 0x1f, 0x9e, 0xd3, 0x6, 0x94, 0x85,
+ 0x92, 0x7b, 0x90, 0x1e, 0x94, 0x70, 0x71, 0x95,
+ 0x57, 0x1b, 0xfb, 0x3b, 0x52, 0xfb, 0x5, 0x36,
+ 0xfb, 0x1e, 0xef, 0x49, 0xf7, 0x13, 0xba, 0xaa,
+ 0x99, 0x8f, 0x9e, 0x1f, 0x9c, 0x92, 0x95, 0x8e,
+ 0x8c, 0x97, 0x9b, 0xd5, 0x18, 0xe, 0xfb, 0xef,
+ 0xf8, 0x36, 0x76, 0xf7, 0xa0, 0xa2, 0x12, 0x8a,
+ 0xed, 0x36, 0xe0, 0xd6, 0xeb, 0x13, 0xd8, 0xf7,
+ 0x43, 0xf8, 0x4a, 0x15, 0x7b, 0x8f, 0x90, 0x72,
+ 0xb9, 0x1b, 0xa8, 0xa3, 0x99, 0x9f, 0x9d, 0x1f,
+ 0x81, 0x97, 0x5, 0x7a, 0x7a, 0x85, 0x9f, 0x8f,
+ 0x1a, 0xf7, 0x30, 0x7, 0xc4, 0x51, 0xa4, 0x43,
+ 0x36, 0x62, 0x67, 0x65, 0x62, 0xaf, 0x8b, 0x92,
+ 0xb0, 0x95, 0xa2, 0x96, 0x1e, 0x9e, 0x77, 0x90,
+ 0x98, 0x1a, 0x94, 0x9a, 0x97, 0xa3, 0xb8, 0x92,
+ 0x6b, 0x6d, 0x1e, 0x6d, 0x7, 0x13, 0xe8, 0x31,
+ 0x74, 0x37, 0x73, 0x4d, 0x1a, 0x13, 0xa8, 0x5a,
+ 0xb4, 0x79, 0xab, 0x9a, 0xb9, 0x8d, 0xb2, 0xb5,
+ 0x1e, 0x88, 0xa6, 0x15, 0x81, 0x84, 0x7c, 0x7b,
+ 0x75, 0x1b, 0x76, 0x81, 0xa1, 0x9d, 0xbf, 0xcb,
+ 0x9d, 0x96, 0x8e, 0x1f, 0xe, 0x82, 0xa, 0x1,
+ 0xf7, 0x6f, 0xf7, 0x92, 0x3, 0xa2, 0xf7, 0x75,
+ 0x88, 0xa, 0x82, 0x95, 0x9b, 0x7d, 0x96, 0x1b,
+ 0x91, 0x90, 0x8f, 0x99, 0x77, 0x1d, 0xe1, 0xf6,
+ 0xa8, 0x1a, 0x95, 0x88, 0x7b, 0x1d, 0xf7, 0x58,
+ 0x87, 0x88, 0xa, 0x82, 0x95, 0x9c, 0x7d, 0x96,
+ 0x1b, 0x91, 0x8f, 0x75, 0xa, 0x95, 0x86, 0x7b,
+ 0x1d, 0xe, 0x3e, 0xf7, 0x15, 0x76, 0xf7, 0x73,
+ 0xcf, 0x12, 0xf8, 0x54, 0xe6, 0x44, 0xd0, 0x13,
+ 0xe0, 0xac, 0xf7, 0xdf, 0x15, 0x13, 0xd0, 0xf8,
+ 0x47, 0xfb, 0x73, 0xd0, 0xf7, 0xb7, 0xfc, 0x8c,
+ 0x6, 0xe, 0xef, 0x78, 0xbf, 0x57, 0xf7, 0x52,
+ 0x7e, 0xf7, 0x51, 0x85, 0x76, 0xf7, 0xef, 0xbf,
+ 0x12, 0xa5, 0xd2, 0xf7, 0x3e, 0xdb, 0xe4, 0xe0,
+ 0xf7, 0x15, 0xd2, 0x13, 0xaf, 0x80, 0x71, 0x1d,
+ 0xf7, 0x34, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29,
+ 0xf7, 0x2d, 0x55, 0xa, 0xfb, 0x1b, 0xfb, 0x39,
+ 0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x22, 0x80, 0x1d,
+ 0xf7, 0x2, 0xfb, 0x4a, 0x15, 0xf7, 0x40, 0x6,
+ 0x13, 0x5f, 0x80, 0x9d, 0x7, 0x5c, 0x8e, 0x8c,
+ 0x8f, 0xb0, 0x1a, 0xf4, 0xb0, 0x7, 0x13, 0xaf,
+ 0x80, 0x3a, 0xc0, 0xc9, 0x35, 0x88, 0x1b, 0xdc,
+ 0x96, 0x6, 0xfb, 0x14, 0xf7, 0x3b, 0x5, 0xbb,
+ 0x9b, 0xab, 0xb0, 0xba, 0x1a, 0xcf, 0x56, 0xac,
+ 0x4d, 0x1e, 0xfb, 0x55, 0x79, 0x6, 0xba, 0x89,
+ 0x8a, 0x87, 0x65, 0x1a, 0xfb, 0x93, 0x7, 0x13,
+ 0x5f, 0x80, 0x66, 0x8c, 0x87, 0x5c, 0x88, 0x1e,
+ 0x13, 0xaf, 0x80, 0xf7, 0x12, 0xf7, 0x3f, 0x15,
+ 0xf7, 0x3c, 0xaf, 0x7, 0xaf, 0xa4, 0x77, 0x50,
+ 0x5d, 0x7c, 0x60, 0x5c, 0x1f, 0xe, 0xfb, 0xce,
+ 0xf8, 0xc9, 0xd3, 0x1, 0x8c, 0xf8, 0xc9, 0x15,
+ 0xf7, 0xde, 0xd3, 0xfb, 0xde, 0x6, 0xe, 0xfb,
+ 0x8b, 0xf8, 0x26, 0xaf, 0xf7, 0x6a, 0xaf, 0x1,
+ 0xbb, 0xb4, 0xf7, 0x69, 0xb4, 0x3, 0xed, 0xf8,
+ 0xb5, 0x15, 0xc4, 0xb8, 0xbd, 0xc4, 0xc4, 0xb8,
+ 0x59, 0x52, 0x52, 0x5e, 0x59, 0x52, 0x52, 0x5e,
+ 0xbd, 0xc4, 0x1e, 0x62, 0x16, 0x3b, 0xca, 0x4c,
+ 0xdb, 0xdb, 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca,
+ 0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0x3e,
+ 0x8b, 0xe1, 0xf7, 0x51, 0xe3, 0x3b, 0xcd, 0xf7,
+ 0x31, 0x77, 0x12, 0xf7, 0x85, 0xe3, 0x3e, 0xcd,
+ 0x13, 0xd4, 0xf7, 0x90, 0xf7, 0x12, 0x15, 0xcd,
+ 0x6, 0x13, 0xb4, 0xf7, 0x31, 0xf7, 0x6f, 0xcd,
+ 0xfb, 0x6f, 0xf7, 0x31, 0x49, 0xfb, 0x31, 0xfb,
+ 0x6f, 0x49, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, 0xfb,
+ 0xaf, 0x15, 0xf8, 0x8c, 0x6, 0x13, 0xd8, 0xcd,
+ 0xfc, 0x8c, 0x7, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+ 0xdb, 0xf7, 0x9d, 0xcf, 0x12, 0xf7, 0x4c, 0xe3,
+ 0x17, 0xf7, 0xa7, 0x4, 0xf7, 0xa2, 0x6, 0xa9,
+ 0xf7, 0x13, 0x5, 0x7b, 0x6, 0x62, 0x79, 0x85,
+ 0x85, 0x46, 0x1b, 0x2f, 0x6, 0xf7, 0x25, 0xed,
+ 0xa7, 0xe7, 0xaa, 0x5a, 0x1d, 0x1f, 0x44, 0x3c,
+ 0x3c, 0x22, 0x23, 0x1e, 0xe, 0xfb, 0xef, 0xf7,
+ 0xb5, 0x76, 0xf8, 0x8, 0xbb, 0x12, 0xf7, 0x44,
+ 0xea, 0x5a, 0xd6, 0x13, 0xd0, 0xe7, 0xf8, 0x7e,
+ 0x40, 0xa, 0x70, 0xb6, 0x56, 0x9d, 0x1e, 0x13,
+ 0x60, 0xa7, 0x9a, 0x4a, 0x1d, 0xe, 0x90, 0xa,
+ 0xe1, 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x1e, 0xe1,
+ 0x5, 0xa3, 0x9a, 0x9f, 0x97, 0xa7, 0x1a, 0xaf,
+ 0x71, 0x93, 0x79, 0x81, 0x73, 0x89, 0x71, 0x74,
+ 0x1e, 0xe, 0x30, 0xfb, 0x4d, 0x76, 0xf9, 0x2f,
+ 0x77, 0x12, 0xac, 0xf7, 0x14, 0x2c, 0xf7, 0x1f,
+ 0xf7, 0x17, 0xf7, 0x1f, 0x13, 0xd8, 0xf7, 0x15,
+ 0x9d, 0x15, 0x8d, 0x8d, 0x5, 0x77, 0xa3, 0xab,
+ 0x7e, 0xb9, 0x1b, 0xb2, 0xaa, 0x9d, 0xad, 0xa5,
+ 0x1f, 0x64, 0xa0, 0xb1, 0x7e, 0xb6, 0x1b, 0xbd,
+ 0xa2, 0x9f, 0xa8, 0xab, 0x1f, 0xa3, 0x7, 0x82,
+ 0x86, 0x83, 0x89, 0x83, 0x8c, 0x8, 0x7c, 0x8d,
+ 0x76, 0x99, 0xaa, 0x1a, 0xf7, 0xfc, 0xfb, 0x1f,
+ 0xfb, 0xfb, 0x7, 0x7d, 0x77, 0x6a, 0x7e, 0x78,
+ 0x1b, 0x6f, 0x6c, 0x9f, 0xc1, 0x1f, 0xf7, 0xcc,
+ 0xfb, 0x1f, 0xfc, 0x9, 0x7, 0x56, 0x85, 0x62,
+ 0x83, 0x6a, 0x1e, 0x13, 0xe8, 0x82, 0x64, 0x81,
+ 0x70, 0x74, 0x1a, 0x5d, 0x9e, 0x6b, 0xbc, 0xb4,
+ 0x9e, 0xab, 0xb9, 0xa8, 0x7f, 0xa7, 0x82, 0xab,
+ 0x1e, 0x86, 0x9d, 0x87, 0x9e, 0x89, 0x9f, 0x8,
+ 0xe, 0x20, 0xfb, 0x54, 0x76, 0xf9, 0xd9, 0xb1,
+ 0x75, 0xa1, 0x12, 0xf7, 0x9a, 0xbc, 0xe3, 0xbc,
+ 0x13, 0xd8, 0xf7, 0x98, 0xfb, 0x69, 0x15, 0xbc,
+ 0xf9, 0xd9, 0xed, 0xfd, 0xd9, 0x6, 0x13, 0xb8,
+ 0xbc, 0xf9, 0x7a, 0x6, 0xe1, 0x97, 0xa4, 0xd3,
+ 0x1e, 0xa1, 0xfb, 0xb2, 0x7, 0xfb, 0x6, 0xfb,
+ 0x20, 0x67, 0xfb, 0x4e, 0xfb, 0x33, 0xf7, 0x6,
+ 0x44, 0xf7, 0x26, 0x1f, 0xe, 0xfc, 0x21, 0xf7,
+ 0x8c, 0x93, 0xa, 0xf7, 0xe0, 0x62, 0x1d, 0xfb,
+ 0xce, 0xfb, 0x59, 0x76, 0xf7, 0x6e, 0x77, 0x12,
+ 0xf7, 0x5d, 0xe8, 0x17, 0xf7, 0x33, 0x16, 0x60,
+ 0x2b, 0x4f, 0x1d, 0x13, 0x60, 0xb1, 0xf7, 0x5,
+ 0x8c, 0xdc, 0xc8, 0x4b, 0xa7, 0x52, 0x7a, 0x1f,
+ 0xa7, 0xcb, 0x5, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+ 0xa9, 0xbd, 0xa9, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+ 0xeb, 0x3, 0xa9, 0xf7, 0xf7, 0x15, 0xf7, 0x87,
+ 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, 0xf7,
+ 0x8b, 0x46, 0xa, 0xfb, 0x17, 0x7, 0x65, 0x89,
+ 0x74, 0x40, 0x8c, 0x1e, 0xe, 0xfb, 0xd1, 0xf8,
+ 0x21, 0x9f, 0xf7, 0x8e, 0xa0, 0x1, 0x9d, 0xec,
+ 0xee, 0xed, 0x3, 0xf7, 0x7, 0xf8, 0xb2, 0x15,
+ 0xe7, 0x97, 0xac, 0xb1, 0xb1, 0x96, 0x6a, 0x2f,
+ 0x3e, 0x86, 0x5b, 0x5f, 0x5f, 0x85, 0xbb, 0xd8,
+ 0x1e, 0x2a, 0x16, 0x3b, 0xc5, 0x4a, 0xe4, 0xe4,
+ 0xc5, 0xcc, 0xdb, 0xde, 0x4e, 0xca, 0x35, 0x35,
+ 0x4e, 0x4c, 0x38, 0x1e, 0xe, 0x82, 0xa, 0x12,
+ 0xf7, 0x25, 0xf7, 0x1c, 0x17, 0xf7, 0x25, 0x91,
+ 0xa, 0x81, 0x91, 0x87, 0x91, 0x97, 0x9f, 0x9b,
+ 0x91, 0x92, 0x4c, 0xa, 0xf7, 0x58, 0x16, 0x6d,
+ 0x65, 0x35, 0x20, 0x6e, 0x1a, 0x80, 0x8f, 0x88,
+ 0x91, 0x96, 0x9d, 0x99, 0x93, 0x95, 0x4c, 0xa,
+ 0xe, 0xf2, 0x94, 0x76, 0xac, 0x76, 0xe2, 0xcd,
+ 0xf7, 0xe, 0xa9, 0xb4, 0x76, 0xf7, 0x1, 0x76,
+ 0xf7, 0xa7, 0x77, 0x12, 0xf6, 0xeb, 0xf8, 0x2a,
+ 0xe8, 0x13, 0x7f, 0x80, 0xf8, 0x53, 0xe2, 0x74,
+ 0x1d, 0x37, 0x23, 0x50, 0x38, 0x73, 0xa, 0x13,
+ 0xbf, 0x80, 0xfb, 0xc0, 0xfb, 0x39, 0x69, 0xa,
+ 0xfc, 0xdf, 0x3e, 0x1d, 0xe, 0xf2, 0x8b, 0xdb,
+ 0x44, 0x76, 0xf7, 0xb3, 0xa9, 0xb3, 0xcf, 0xf7,
+ 0xa7, 0x77, 0x12, 0xd3, 0xeb, 0xf8, 0x7f, 0xe3,
+ 0x13, 0x7e, 0xf7, 0x18, 0x7f, 0x69, 0xa, 0xfc,
+ 0xd8, 0x3e, 0x1d, 0x13, 0xbe, 0xf8, 0x76, 0xfb,
+ 0xc5, 0x15, 0xf7, 0xa2, 0x6, 0xa9, 0xf7, 0x13,
+ 0x5, 0x71, 0x6, 0x62, 0x79, 0x85, 0x85, 0x46,
+ 0x1b, 0x3f, 0x90, 0x6, 0xe8, 0xe2, 0x5, 0xd5,
+ 0xcd, 0x8b, 0xb8, 0x9d, 0x5a, 0x1d, 0x44, 0x3c,
+ 0x3c, 0x22, 0x23, 0x1f, 0xe, 0xf2, 0x94, 0x76,
+ 0xee, 0xcd, 0xf8, 0x7b, 0xbb, 0x12, 0xf7, 0x58,
+ 0xea, 0x5a, 0xd6, 0xf7, 0xae, 0xe8, 0x13, 0xec,
+ 0xf7, 0x40, 0x7f, 0x69, 0xa, 0xfc, 0x89, 0xfb,
+ 0x5a, 0x40, 0xa, 0x6f, 0xb6, 0x5b, 0x9b, 0x1e,
+ 0x8f, 0x7, 0x13, 0xf4, 0xa3, 0x98, 0x4a, 0x1d,
+ 0xf7, 0xd9, 0xfc, 0x31, 0x74, 0x1d, 0x35, 0x26,
+ 0x52, 0x35, 0x73, 0xa, 0xe, 0xfb, 0x5d, 0xaf,
+ 0xf8, 0x88, 0xf7, 0x3a, 0x12, 0xc2, 0xf7, 0x29,
+ 0x70, 0xf7, 0x3d, 0x69, 0xf7, 0x17, 0x13, 0xe8,
+ 0x13, 0xd0, 0xf7, 0x8b, 0xf7, 0x95, 0x15, 0x99,
+ 0x3e, 0x59, 0x6a, 0x56, 0x68, 0x8, 0x58, 0x6a,
+ 0x57, 0x68, 0x40, 0x1a, 0xfb, 0x33, 0xf7, 0x37,
+ 0x80, 0xaa, 0xf7, 0x38, 0xa9, 0xf1, 0xb4, 0xae,
+ 0x78, 0xb5, 0x58, 0x77, 0x62, 0x7f, 0x57, 0x70,
+ 0x96, 0x7f, 0x95, 0x80, 0x1e, 0x93, 0x82, 0x93,
+ 0x83, 0x7e, 0x1a, 0x66, 0x59, 0x88, 0x82, 0x3d,
+ 0x83, 0xe4, 0xb5, 0xcf, 0xa1, 0xb5, 0x9f, 0xb1,
+ 0x1e, 0xa2, 0xb6, 0xa4, 0xae, 0x7a, 0xcc, 0x8,
+ 0x13, 0xe8, 0x27, 0xf7, 0x37, 0x15, 0x5d, 0xb1,
+ 0x64, 0xb9, 0xbb, 0xb0, 0xb3, 0xb8, 0xba, 0x66,
+ 0xad, 0x5b, 0x5d, 0x65, 0x6a, 0x5b, 0x1e, 0xe,
+ 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1, 0xf8, 0xe,
+ 0xf9, 0x76, 0x24, 0x1d, 0xfb, 0x77, 0xfd, 0xce,
+ 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1,
+ 0xf7, 0xa6, 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x26,
+ 0xfe, 0x13, 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x88,
+ 0x77, 0x1, 0xf7, 0x4e, 0xf9, 0x76, 0x29, 0x1d,
+ 0xfb, 0xbf, 0xfe, 0x26, 0x20, 0x1d, 0x54, 0xa,
+ 0xf8, 0x9d, 0xd9, 0x80, 0xd9, 0x12, 0x13, 0xd0,
+ 0xf7, 0x40, 0xf9, 0x8b, 0x45, 0x1d, 0xa1, 0xa5,
+ 0x81, 0x80, 0xa3, 0x1f, 0x13, 0xe0, 0x7e, 0xa9,
+ 0xa8, 0x7c, 0xa1, 0x1b, 0x13, 0xd0, 0x44, 0xa,
+ 0x13, 0xe0, 0x54, 0x1d, 0x6b, 0x77, 0x96, 0x96,
+ 0x77, 0x1f, 0x13, 0xd0, 0x98, 0x74, 0x75, 0x99,
+ 0x69, 0x50, 0x1d, 0xfb, 0x37, 0xfd, 0x8b, 0x20,
+ 0x1d, 0x4b, 0x1d, 0xd8, 0xf7, 0x16, 0x1, 0xf7,
+ 0x4e, 0xf7, 0x13, 0x8b, 0xde, 0x8b, 0xf7, 0x13,
+ 0x14, 0xe, 0xf7, 0x4e, 0xf9, 0xc0, 0x15, 0x6e,
+ 0x1d, 0xf7, 0x66, 0x16, 0x6e, 0x1d, 0xfc, 0x17,
+ 0xfd, 0xc0, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x5f,
+ 0x77, 0xba, 0xbb, 0xf7, 0x15, 0xbb, 0x1, 0xf7,
+ 0x84, 0xbb, 0x8b, 0xf7, 0x9, 0x8b, 0xbb, 0x14,
+ 0x7, 0xf7, 0x84, 0xf9, 0xd0, 0x15, 0x4f, 0xbc,
+ 0x5d, 0xc5, 0x7d, 0x1d, 0x1e, 0xbb, 0x16, 0xac,
+ 0xa4, 0xa5, 0xac, 0xac, 0xa5, 0x71, 0x6a, 0x6a,
+ 0x71, 0x72, 0x6a, 0x6a, 0x72, 0xa4, 0xac, 0x1e,
+ 0xfb, 0xab, 0xfd, 0xd0, 0x20, 0x1d, 0xf7, 0xf5,
+ 0x8b, 0xae, 0x68, 0xb7, 0xf7, 0x97, 0xb3, 0x7f,
+ 0xab, 0xf7, 0xa0, 0xb8, 0x12, 0xf8, 0x44, 0xf7,
+ 0x34, 0x13, 0xac, 0x8f, 0x16, 0xf7, 0x62, 0xae,
+ 0x6, 0x59, 0x91, 0x66, 0x8f, 0xac, 0x1a, 0xf7,
+ 0xb, 0xf7, 0x75, 0x5, 0xf7, 0x52, 0xfb, 0x60,
+ 0x6, 0x64, 0x7d, 0x75, 0x41, 0x88, 0x1e, 0x68,
+ 0xf8, 0xca, 0x7, 0xb4, 0xf7, 0x67, 0x5, 0x74,
+ 0x6, 0x7e, 0x60, 0x44, 0x6b, 0x6c, 0x1e, 0x13,
+ 0x5c, 0x61, 0x5e, 0x62, 0x81, 0x21, 0x1b, 0x4f,
+ 0x82, 0x9e, 0xae, 0x1f, 0xf7, 0x7d, 0x7, 0xf7,
+ 0x16, 0x86, 0x8a, 0x56, 0x9b, 0x28, 0x8, 0xac,
+ 0xf7, 0xe6, 0x6a, 0x6, 0x6f, 0xfb, 0x14, 0x8b,
+ 0x81, 0xfb, 0x9, 0x80, 0x8, 0xf7, 0x82, 0x7,
+ 0x9e, 0x8b, 0x96, 0xdd, 0xf7, 0x44, 0x90, 0x49,
+ 0x31, 0x9e, 0x1e, 0xae, 0xf7, 0x5d, 0xfd, 0xe,
+ 0x6b, 0x6, 0xbf, 0x89, 0xae, 0x85, 0x6c, 0x1a,
+ 0xfb, 0xbc, 0xfc, 0xac, 0x5, 0x13, 0xac, 0x78,
+ 0x68, 0x84, 0x93, 0x67, 0x84, 0x8, 0xf7, 0x98,
+ 0xf7, 0xc8, 0x15, 0xf7, 0x35, 0xf7, 0xac, 0x5,
+ 0x92, 0xfb, 0xac, 0x6, 0xe, 0xd6, 0xfb, 0x59,
+ 0x76, 0xf7, 0x33, 0xb5, 0x8b, 0xb9, 0x7d, 0xa,
+ 0xf7, 0x57, 0xe8, 0x13, 0xfb, 0xf7, 0xc4, 0xfb,
+ 0x37, 0x15, 0x7b, 0x66, 0x5, 0x7b, 0xb4, 0xb1,
+ 0x89, 0x97, 0x1b, 0xb1, 0xec, 0x93, 0xdc, 0xbc,
+ 0x64, 0xa0, 0x58, 0x7e, 0x83, 0x89, 0x88, 0x81,
+ 0x1f, 0x9f, 0xb8, 0xf7, 0x11, 0x8c, 0xd8, 0xca,
+ 0xd3, 0xdd, 0x19, 0x6d, 0xa4, 0x5, 0x2e, 0x38,
+ 0x40, 0x6d, 0x3d, 0x1b, 0xfb, 0x2a, 0x5e, 0xf7,
+ 0x45, 0xf7, 0x12, 0xf7, 0x3d, 0xaa, 0xf7, 0x31,
+ 0xf7, 0x26, 0xf7, 0x6, 0xdd, 0xfb, 0x9, 0x34,
+ 0xae, 0x1f, 0xae, 0x6, 0x13, 0xf7, 0x6a, 0x1d,
+ 0x7b, 0x6c, 0x9d, 0x99, 0x61, 0x1f, 0x13, 0xfb,
+ 0x94, 0x70, 0x6b, 0x93, 0x68, 0x1b, 0xfb, 0x66,
+ 0xfb, 0x24, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x44,
+ 0xf7, 0x4, 0xfb, 0x30, 0xf7, 0x66, 0x7a, 0x1f,
+ 0x68, 0x3c, 0x96, 0x83, 0x5, 0x8d, 0x93, 0x92,
+ 0x8d, 0x98, 0x1b, 0xa5, 0x9f, 0x80, 0x72, 0x73,
+ 0x1d, 0x1f, 0xe, 0x55, 0x1d, 0x9b, 0x16, 0x21,
+ 0x1d, 0xf7, 0xf0, 0xf9, 0x53, 0x26, 0xa, 0x55,
+ 0x1d, 0xf7, 0x98, 0xf9, 0x76, 0x22, 0x1d, 0xfc,
+ 0x11, 0xfe, 0x13, 0x15, 0x21, 0x1d, 0xe, 0x51,
+ 0xa, 0xf7, 0x82, 0x72, 0xa, 0xf7, 0x40, 0xf9,
+ 0x76, 0x29, 0x1d, 0xfb, 0xaa, 0xfe, 0x26, 0x15,
+ 0x21, 0x1d, 0xe, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe,
+ 0xad, 0xf7, 0xab, 0xad, 0xd2, 0x9a, 0x1d, 0xf3,
+ 0xf7, 0x36, 0x2c, 0xf7, 0x16, 0xda, 0xf7, 0x16,
+ 0x2f, 0xaf, 0x13, 0xf9, 0x9b, 0x16, 0x21, 0x1d,
+ 0x13, 0xf6, 0xf7, 0x2f, 0xf9, 0x9d, 0x15, 0x2a,
+ 0x1d, 0xf7, 0x65, 0x38, 0x1d, 0x35, 0x1d, 0xf7,
+ 0x5a, 0xf9, 0x53, 0x26, 0xa, 0x35, 0x1d, 0xe9,
+ 0xf9, 0x53, 0x28, 0x1d, 0x5c, 0xa, 0xf7, 0x82,
+ 0x77, 0x27, 0xa, 0x91, 0xf9, 0x53, 0x29, 0x1d,
+ 0xe, 0x5c, 0xa, 0xd2, 0x9a, 0x1d, 0x9f, 0xf7,
+ 0x1a, 0x62, 0xf7, 0x36, 0x62, 0xf7, 0x16, 0x13,
+ 0xf4, 0x9f, 0x16, 0xf7, 0xf2, 0xae, 0x6, 0x13,
+ 0xe8, 0x34, 0x1d, 0x7, 0x13, 0xf4, 0xfb, 0xf2,
+ 0x68, 0x6, 0x13, 0xe8, 0x4b, 0xa, 0x13, 0xf4,
+ 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0x8f, 0xf9,
+ 0x9d, 0x40, 0x1d, 0x8a, 0x1d, 0xf7, 0xb7, 0xba,
+ 0xf7, 0xa1, 0xad, 0x1, 0xec, 0xf7, 0x36, 0xf7,
+ 0x95, 0xf7, 0x42, 0x3, 0xf7, 0x97, 0xf7, 0xda,
+ 0x15, 0xf7, 0x6, 0xba, 0xfb, 0x6, 0xf7, 0x67,
+ 0x6, 0x8c, 0x1d, 0xfb, 0x69, 0x30, 0x84, 0xa,
+ 0x1f, 0xfb, 0x89, 0x30, 0x15, 0xf7, 0xd0, 0x6,
+ 0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x2e, 0xf7, 0x4c,
+ 0xf7, 0x2e, 0x30, 0xf7, 0x4c, 0x95, 0x1d, 0xb7,
+ 0x8f, 0x4e, 0x1f, 0xfb, 0x67, 0x30, 0x5c, 0xe6,
+ 0xfb, 0x7f, 0x7, 0x66, 0x77, 0x78, 0x4c, 0x1e,
+ 0xe, 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0xdc,
+ 0xd9, 0x12, 0xf2, 0xb7, 0xf8, 0x44, 0xb7, 0x17,
+ 0x72, 0x1d, 0x37, 0xa, 0xf7, 0x37, 0xf9, 0x68,
+ 0x45, 0x1d, 0x13, 0x30, 0xa8, 0xa2, 0x81, 0x80,
+ 0xa0, 0x1f, 0x7e, 0xa4, 0xa3, 0x7c, 0xaa, 0x1b,
+ 0x42, 0xa, 0x13, 0x10, 0x74, 0x76, 0x98, 0x98,
+ 0x72, 0x1f, 0x97, 0x74, 0x71, 0x96, 0x6a, 0x50,
+ 0x1d, 0xe, 0x51, 0x1d, 0xf7, 0x7c, 0x77, 0x57,
+ 0x1d, 0xfb, 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x58,
+ 0x1d, 0xf7, 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e,
+ 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e, 0xf8, 0xe,
+ 0xf8, 0x21, 0x26, 0xa, 0x51, 0x1d, 0xf7, 0x7c,
+ 0x77, 0x1, 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x30,
+ 0xa, 0xf7, 0xa6, 0xf8, 0x26, 0x28, 0x1d, 0x51,
+ 0x1d, 0x57, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb,
+ 0x7a, 0x58, 0x1d, 0xf7, 0x20, 0x5e, 0xa, 0xf7,
+ 0x22, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e,
+ 0xf7, 0x4e, 0xf8, 0x21, 0x29, 0x1d, 0xe, 0x51,
+ 0x1d, 0xcd, 0xd9, 0x6e, 0xd9, 0x12, 0x5c, 0x1d,
+ 0x13, 0xdc, 0xf7, 0x68, 0xf7, 0xea, 0x79, 0x1d,
+ 0xf7, 0x3e, 0x66, 0x1d, 0xfb, 0x49, 0x78, 0xa,
+ 0xfb, 0x7a, 0x65, 0x1d, 0xf7, 0x85, 0x45, 0xa,
+ 0xfb, 0x2b, 0x5f, 0x1d, 0xf7, 0x20, 0x5e, 0xa,
+ 0xf7, 0x22, 0xfb, 0x55, 0x96, 0xa, 0x1e, 0xf7,
+ 0x3a, 0xf8, 0x35, 0x45, 0x1d, 0xa9, 0xa1, 0x80,
+ 0x80, 0xa1, 0x1f, 0x13, 0xec, 0x7e, 0xa4, 0xa2,
+ 0x7d, 0xaa, 0x1b, 0x13, 0xdc, 0x44, 0xa, 0x13,
+ 0xec, 0x54, 0x1d, 0x75, 0x76, 0x98, 0x97, 0x73,
+ 0x1f, 0x13, 0xdc, 0x97, 0x74, 0x70, 0x97, 0x69,
+ 0x50, 0x1d, 0xe, 0x51, 0x1d, 0xc3, 0xf7, 0x16,
+ 0x1, 0xae, 0xf7, 0x45, 0x94, 0xf7, 0x14, 0xdc,
+ 0xf7, 0x14, 0x93, 0x30, 0xa, 0xf7, 0x4e, 0xf8,
+ 0x70, 0x15, 0x6d, 0xa, 0xf7, 0x65, 0x16, 0x6d,
+ 0xa, 0xe, 0x3e, 0xb0, 0x76, 0xf8, 0x6e, 0x77,
+ 0x1, 0xbb, 0xca, 0x15, 0xb8, 0x5c, 0xf7, 0x54,
+ 0xf7, 0x56, 0xf7, 0x54, 0xfb, 0x56, 0xb8, 0xbb,
+ 0xfb, 0x54, 0xf7, 0x51, 0xf7, 0x54, 0xf7, 0x55,
+ 0x5b, 0xb7, 0xfb, 0x51, 0xfb, 0x52, 0xfb, 0x51,
+ 0xf7, 0x52, 0x5b, 0x5e, 0xf7, 0x53, 0xfb, 0x54,
+ 0x5, 0xe, 0xf7, 0x17, 0x56, 0x76, 0xc2, 0xac,
+ 0x93, 0x1d, 0xb9, 0x77, 0x5a, 0xa, 0xdc, 0x41,
+ 0x15, 0xbd, 0x6, 0xd2, 0xf3, 0x5, 0x6b, 0xc0,
+ 0xca, 0x7a, 0xd2, 0x1b, 0xf7, 0x61, 0xf7, 0x29,
+ 0xf7, 0x1f, 0xf7, 0x66, 0xf7, 0x12, 0x55, 0xf4,
+ 0x39, 0xc8, 0x1f, 0xd9, 0xf7, 0x7, 0x5, 0x59,
+ 0x6, 0x4c, 0x2e, 0x5, 0xaa, 0x56, 0x4c, 0x9b,
+ 0x48, 0x1b, 0x96, 0xa, 0xfb, 0xd, 0xbd, 0x21,
+ 0xdd, 0x4c, 0x1f, 0xce, 0xee, 0x15, 0x76, 0xcf,
+ 0x8a, 0xdc, 0xb5, 0x1a, 0xf7, 0x26, 0xb0, 0xf7,
+ 0x3e, 0xf7, 0x20, 0xca, 0xb4, 0x68, 0x55, 0xa6,
+ 0x1e, 0xfb, 0x9f, 0xfc, 0x65, 0x15, 0xf7, 0xb3,
+ 0xf8, 0x38, 0x5, 0x9e, 0x53, 0x92, 0x40, 0x4c,
+ 0x1a, 0x34, 0x85, 0xfb, 0x79, 0xfb, 0x3f, 0x46,
+ 0x61, 0xb1, 0xbf, 0x72, 0x1e, 0xe, 0x6b, 0xa,
+ 0xf7, 0x8b, 0x77, 0x63, 0xa, 0x9b, 0xf9, 0x15,
+ 0x21, 0xa, 0xf8, 0x20, 0xc9, 0x26, 0xa, 0x6b,
+ 0xa, 0xf7, 0x8b, 0x77, 0x63, 0xa, 0xf7, 0xc8,
+ 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x41, 0xfb, 0x92,
+ 0x21, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x82, 0x77,
+ 0x63, 0xa, 0xf7, 0x70, 0xf9, 0x76, 0x29, 0x1d,
+ 0xfb, 0xda, 0xfb, 0xa5, 0x21, 0xa, 0xe, 0x6b,
+ 0xa, 0xd2, 0x9a, 0x1d, 0xed, 0xf7, 0x33, 0x64,
+ 0xf7, 0x16, 0xc8, 0xf7, 0x16, 0x9c, 0xb7, 0x13,
+ 0xf6, 0x9b, 0xf9, 0x15, 0x21, 0xa, 0x13, 0xee,
+ 0xf7, 0x5e, 0xf7, 0x1c, 0x15, 0x2a, 0x1d, 0xf7,
+ 0x67, 0x38, 0x1d, 0xd6, 0x4e, 0x1d, 0xf7, 0x90,
+ 0x77, 0x1, 0xf7, 0xaa, 0x7f, 0x1d, 0x69, 0x1d,
+ 0x83, 0xde, 0x1a, 0xf7, 0x4c, 0x66, 0xa, 0xb8,
+ 0x89, 0x64, 0x1a, 0xfb, 0x32, 0xfb, 0xa0, 0x5,
+ 0xfb, 0x14, 0xf7, 0x82, 0x7b, 0xa4, 0x3d, 0x1d,
+ 0xfb, 0x27, 0x7, 0x38, 0x73, 0x93, 0x46, 0x84,
+ 0x1e, 0xf7, 0x3, 0xf9, 0x58, 0x28, 0x1d, 0x67,
+ 0x8f, 0x76, 0xb1, 0x76, 0xf7, 0x41, 0xae, 0x7d,
+ 0xae, 0xf7, 0xa6, 0xae, 0x68, 0xf7, 0x41, 0xfb,
+ 0x3d, 0xf7, 0x39, 0x8f, 0x77, 0x12, 0xef, 0xf7,
+ 0x36, 0xfb, 0x26, 0xf7, 0x36, 0xf7, 0x29, 0xf7,
+ 0x40, 0xfb, 0x3f, 0xf7, 0x40, 0x13, 0xa2, 0xa0,
+ 0xf7, 0x9a, 0xf7, 0x64, 0x15, 0xf7, 0x98, 0x7,
+ 0x13, 0x99, 0x60, 0xa1, 0x8c, 0x98, 0x98, 0xad,
+ 0x1b, 0x13, 0x92, 0x50, 0xdd, 0xaf, 0x6d, 0xfb,
+ 0x6, 0x1f, 0x13, 0xa2, 0xa0, 0xfb, 0x10, 0x5e,
+ 0x70, 0xfb, 0xd, 0x1e, 0x13, 0x52, 0x60, 0xfb,
+ 0x8a, 0xfb, 0x64, 0x15, 0xf7, 0xe2, 0xae, 0x6,
+ 0x13, 0x92, 0xa0, 0x46, 0x94, 0x78, 0x83, 0xdc,
+ 0x1a, 0x13, 0xa2, 0xa0, 0xc3, 0x7, 0x13, 0x92,
+ 0x50, 0xf7, 0x3c, 0x8a, 0xf7, 0x3e, 0xb8, 0xf7,
+ 0x25, 0x1a, 0x13, 0x99, 0x60, 0xdf, 0x60, 0xe7,
+ 0xfb, 0x79, 0x1e, 0x13, 0x99, 0xa0, 0x49, 0x97,
+ 0x6, 0xdc, 0x9e, 0x8b, 0xd0, 0x95, 0x1e, 0x13,
+ 0x94, 0x60, 0xae, 0xfb, 0xe2, 0x68, 0x7, 0x13,
+ 0x92, 0xa0, 0xc0, 0x86, 0xaa, 0x8a, 0x37, 0x1a,
+ 0xfc, 0x46, 0x7, 0x31, 0x70, 0x9e, 0x52, 0x80,
+ 0x1e, 0xe, 0x30, 0x7f, 0xae, 0x6e, 0xf7, 0x12,
+ 0x28, 0x76, 0xf8, 0x9, 0xad, 0xf7, 0x94, 0xa7,
+ 0x12, 0xd1, 0xf7, 0x1f, 0xf7, 0x16, 0xf7, 0x1d,
+ 0x22, 0xf7, 0x26, 0x13, 0x9e, 0x9e, 0x16, 0xad,
+ 0x7, 0x13, 0x5d, 0xb0, 0x91, 0x99, 0x91, 0xbe,
+ 0x1a, 0xf8, 0x2e, 0x7, 0xf4, 0xdd, 0xda, 0xf7,
+ 0x8, 0xf7, 0x31, 0xbe, 0x2a, 0x55, 0x3b, 0x4b,
+ 0x5a, 0x32, 0x7a, 0x1e, 0x89, 0x7, 0xf7, 0x1a,
+ 0x68, 0xc7, 0x53, 0xfb, 0x3, 0x1a, 0x36, 0x5b,
+ 0x51, 0x57, 0x68, 0x1e, 0x13, 0x9e, 0x7f, 0x83,
+ 0x7d, 0x84, 0x7d, 0x8a, 0x6e, 0x89, 0x18, 0x6e,
+ 0x6e, 0x94, 0x9e, 0x79, 0x1f, 0x13, 0x3e, 0x7f,
+ 0x98, 0x83, 0x9b, 0xa0, 0x1a, 0xa8, 0x9f, 0x9e,
+ 0xa7, 0xad, 0x97, 0x72, 0x75, 0x1e, 0x7f, 0x88,
+ 0x85, 0x81, 0x1a, 0x7d, 0x96, 0x88, 0x97, 0x1e,
+ 0xa4, 0x90, 0x88, 0xa4, 0x7e, 0xbb, 0x8, 0x85,
+ 0xa3, 0x8d, 0xa7, 0xab, 0x1a, 0xf7, 0x2e, 0x67,
+ 0xa5, 0x49, 0x8e, 0x1e, 0xad, 0x7, 0x13, 0x9d,
+ 0xd6, 0x91, 0x86, 0xb6, 0xdf, 0x1a, 0xed, 0x6d,
+ 0xa4, 0x62, 0x55, 0x87, 0x57, 0x72, 0x8a, 0x1e,
+ 0x13, 0x5e, 0xfc, 0xde, 0x7, 0xe, 0x92, 0x50,
+ 0xa, 0x52, 0x1d, 0x13, 0xd8, 0xf7, 0xba, 0xc3,
+ 0x2a, 0xa, 0x84, 0x93, 0x86, 0x92, 0x94, 0x1a,
+ 0x13, 0xb8, 0x3b, 0x1d, 0x71, 0xf7, 0xaf, 0x26,
+ 0xa, 0x92, 0x50, 0xa, 0xd7, 0x76, 0xf7, 0x4d,
+ 0x77, 0x52, 0x1d, 0x13, 0xde, 0xf7, 0x37, 0xf8,
+ 0xa4, 0x22, 0x1d, 0x85, 0xfd, 0x9, 0x37, 0x1d,
+ 0x13, 0xbe, 0x3b, 0x1d, 0xe, 0x92, 0x50, 0xa,
+ 0xf7, 0x7b, 0x77, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+ 0xf8, 0xa4, 0x29, 0x1d, 0xec, 0xfd, 0x1c, 0x23,
+ 0x1d, 0xa2, 0x81, 0x97, 0x82, 0x96, 0x1e, 0x85,
+ 0x92, 0x86, 0x91, 0x36, 0x1d, 0x92, 0x50, 0xa,
+ 0xd5, 0xd9, 0x6e, 0xd9, 0x52, 0x1d, 0x13, 0xce,
+ 0xc8, 0xf8, 0xb9, 0x45, 0x1d, 0xa7, 0xa2, 0x82,
+ 0x80, 0xa1, 0x1f, 0x13, 0xd6, 0x7d, 0xa7, 0xa5,
+ 0x7c, 0xa5, 0x1b, 0x13, 0xce, 0x44, 0xa, 0x13,
+ 0xd6, 0x54, 0x1d, 0x71, 0x73, 0x96, 0x97, 0x73,
+ 0x1f, 0x13, 0xce, 0x98, 0x71, 0x72, 0x98, 0x71,
+ 0x50, 0x1d, 0xf7, 0x7d, 0xfc, 0x81, 0x23, 0x1d,
+ 0xa2, 0x81, 0x98, 0x82, 0x95, 0x1e, 0x85, 0x92,
+ 0x86, 0x91, 0x94, 0x1a, 0x13, 0xb6, 0x3b, 0xa,
+ 0x13, 0x86, 0x24, 0xa, 0xe, 0x92, 0x50, 0xa,
+ 0xcb, 0xf7, 0x16, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+ 0x3f, 0xa, 0x94, 0xfc, 0xb6, 0x23, 0x1d, 0xa2,
+ 0x80, 0x97, 0x83, 0x95, 0x1e, 0x85, 0x92, 0x86,
+ 0x92, 0x36, 0x1d, 0x92, 0x76, 0xf7, 0xbb, 0xf7,
+ 0x54, 0xc1, 0xbb, 0x5b, 0xf7, 0x38, 0xfb, 0x8,
+ 0xf7, 0x8, 0x8b, 0xbc, 0x12, 0xa4, 0xf7, 0x26,
+ 0x69, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x39, 0x13,
+ 0xd5, 0x0, 0xf7, 0x1d, 0x94, 0xa, 0x13, 0xee,
+ 0x80, 0x7d, 0x1d, 0x1f, 0xf7, 0x31, 0xfc, 0xd5,
+ 0x37, 0x1d, 0x3b, 0x1d, 0xfb, 0x0, 0xf8, 0x18,
+ 0x15, 0xab, 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71,
+ 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5,
+ 0xab, 0x1e, 0xe, 0xd6, 0x7d, 0xca, 0x4c, 0xd1,
+ 0xf7, 0x54, 0xb0, 0x8a, 0xf7, 0x51, 0x6b, 0xab,
+ 0x12, 0xac, 0xf7, 0x29, 0xfb, 0x18, 0xf7, 0x18,
+ 0xf7, 0x6, 0xf7, 0x1e, 0xf7, 0x1d, 0xf7, 0xd,
+ 0x13, 0x6d, 0x80, 0xf7, 0xe5, 0xd6, 0x15, 0x37,
+ 0xba, 0xcf, 0x86, 0xb0, 0x1b, 0xde, 0xce, 0xb1,
+ 0xe4, 0xc1, 0x1f, 0x76, 0x9a, 0x5, 0x72, 0x77,
+ 0x69, 0x5c, 0x42, 0x1b, 0xfb, 0x3, 0x8b, 0xf7,
+ 0xf, 0xb9, 0x1f, 0xa2, 0xf7, 0x96, 0x7, 0x13,
+ 0x93, 0x80, 0xf7, 0x41, 0x8c, 0xfb, 0x1, 0xbf,
+ 0x39, 0x1b, 0x4b, 0x65, 0x73, 0x70, 0x71, 0x1f,
+ 0xa0, 0x76, 0x66, 0xa9, 0x29, 0x1b, 0x27, 0x47,
+ 0x52, 0x47, 0x5f, 0xae, 0x77, 0xa8, 0xb8, 0xa2,
+ 0x9d, 0xb3, 0xa1, 0x83, 0x95, 0x84, 0x93, 0x1f,
+ 0x84, 0x92, 0x84, 0x91, 0x97, 0x1a, 0x13, 0xad,
+ 0x80, 0xa1, 0xaf, 0x97, 0xa8, 0xdb, 0x89, 0x57,
+ 0x6e, 0x1e, 0x3b, 0x7, 0xfb, 0x45, 0x52, 0x35,
+ 0x6f, 0x23, 0x1a, 0x46, 0xb6, 0x67, 0xd7, 0xe1,
+ 0xc6, 0xbc, 0xad, 0xad, 0x1e, 0x68, 0x97, 0x15,
+ 0x6c, 0x6e, 0x79, 0x8a, 0x78, 0x1b, 0x5e, 0x83,
+ 0xb7, 0xa7, 0xdb, 0xcb, 0xa7, 0xc2, 0x9e, 0x1f,
+ 0xf7, 0x1e, 0xb0, 0x15, 0xcb, 0x8b, 0xe9, 0xcf,
+ 0xbf, 0x9c, 0x67, 0x32, 0x1e, 0x6a, 0x7, 0xe,
+ 0xfb, 0x5f, 0xfb, 0x59, 0x76, 0xf7, 0x63, 0xcb,
+ 0x86, 0x1d, 0xea, 0xe8, 0x4e, 0xf7, 0x10, 0x13,
+ 0xdc, 0xf7, 0x44, 0x2b, 0x15, 0x4f, 0x1d, 0xb1,
+ 0xf7, 0x5, 0x8e, 0xda, 0xc7, 0x49, 0xa6, 0x54,
+ 0x7c, 0x1f, 0xa1, 0xbe, 0xd3, 0x8f, 0xc7, 0xb2,
+ 0xb6, 0xc8, 0x19, 0x79, 0x9d, 0x5, 0x70, 0x73,
+ 0x71, 0x6e, 0x52, 0x1b, 0x3d, 0x4e, 0xdc, 0xf7,
+ 0x20, 0xb8, 0x98, 0xf7, 0xf, 0xd9, 0x1f, 0x13,
+ 0xea, 0x9a, 0x9f, 0x82, 0x6d, 0x8f, 0x1d, 0x33,
+ 0xb0, 0x44, 0x1f, 0x13, 0x4a, 0x2d, 0xfb, 0x1e,
+ 0x4e, 0xfb, 0x59, 0xfb, 0x7, 0xd6, 0x27, 0xf7,
+ 0x6, 0x80, 0x1f, 0xe, 0x4c, 0x1d, 0x78, 0xfb,
+ 0x4, 0x5b, 0x94, 0x1e, 0xfb, 0x1c, 0x79, 0xa,
+ 0x13, 0xd8, 0x2b, 0x1d, 0xde, 0xf7, 0xaf, 0x26,
+ 0xa, 0x4c, 0x1d, 0x86, 0xfb, 0x9, 0x60, 0x8d,
+ 0x1e, 0xfb, 0x23, 0x80, 0xa, 0x1e, 0x13, 0xd8,
+ 0x2b, 0x1d, 0x76, 0xf7, 0xaf, 0x28, 0x1d, 0x49,
+ 0x1d, 0xd7, 0x83, 0x1d, 0xa4, 0x8a, 0xa, 0x4d,
+ 0xa, 0x82, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb,
+ 0x24, 0x80, 0xa, 0x34, 0xa, 0x1e, 0x39, 0x1d,
+ 0xfb, 0x1, 0xf7, 0xaf, 0x29, 0x1d, 0xe, 0x49,
+ 0x1d, 0xcb, 0xf7, 0x16, 0x98, 0xa, 0x21, 0xf7,
+ 0x16, 0xdb, 0xf7, 0x16, 0x13, 0xfa, 0x4d, 0xa,
+ 0x7d, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb, 0x1f,
+ 0x79, 0xa, 0x2b, 0x1d, 0x13, 0xf6, 0xfb, 0x3,
+ 0xf7, 0xf9, 0x40, 0x1d, 0x3e, 0xa, 0xfb, 0xa6,
+ 0x7, 0x5b, 0x7a, 0x88, 0x67, 0x82, 0x1e, 0xf7,
+ 0x1f, 0xf8, 0x82, 0x29, 0xa, 0x81, 0x7f, 0xa,
+ 0x99, 0x7c, 0xa4, 0x7c, 0x1f, 0xe, 0x3e, 0xa,
+ 0xfb, 0xa9, 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82,
+ 0x1e, 0xae, 0xf8, 0x82, 0x56, 0x1d, 0xf7, 0x22,
+ 0xe3, 0x5, 0xa3, 0x9a, 0x9c, 0x95, 0xa7, 0x1a,
+ 0xaf, 0x6b, 0x2c, 0xa, 0xe, 0x5d, 0xa, 0xf7,
+ 0x0, 0x83, 0x1d, 0xd0, 0x8a, 0xa, 0x67, 0xf8,
+ 0xa4, 0x56, 0x1d, 0xf7, 0x3, 0xed, 0xf7, 0x5,
+ 0x29, 0x5, 0xc4, 0x6, 0xfb, 0x10, 0xf7, 0x44,
+ 0x5, 0x2f, 0x6, 0x46, 0xfd, 0x54, 0x15, 0x33,
+ 0xa, 0xe, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0xad,
+ 0x9a, 0x1d, 0x67, 0xf7, 0x13, 0x75, 0xf7, 0x1f,
+ 0x69, 0xf7, 0x13, 0x13, 0xd0, 0x49, 0xa, 0x13,
+ 0xe8, 0x57, 0xf8, 0xcd, 0x15, 0x6c, 0x1d, 0xf7,
+ 0x66, 0x16, 0x6c, 0x1d, 0xe, 0x65, 0xa, 0xf7,
+ 0x6e, 0x77, 0x12, 0x5d, 0x1d, 0xfb, 0x1c, 0xf7,
+ 0x27, 0x13, 0xf8, 0xf7, 0x40, 0xf7, 0x83, 0x78,
+ 0x1d, 0xe4, 0xd5, 0xc8, 0x9c, 0x5a, 0x64, 0xa,
+ 0x2c, 0x46, 0x3b, 0x8b, 0xf7, 0x6, 0xf7, 0x0,
+ 0x1e, 0x13, 0xf4, 0xf7, 0x3c, 0xf7, 0x55, 0x15,
+ 0xab, 0x73, 0x6b, 0x94, 0x6a, 0x1b, 0xfb, 0x1f,
+ 0x34, 0x22, 0xfb, 0x15, 0xfb, 0x16, 0xe2, 0xfb,
+ 0xf, 0xf7, 0x1f, 0x1f, 0x13, 0xf8, 0xf7, 0x1c,
+ 0xe4, 0xf6, 0xf7, 0x26, 0xf7, 0x36, 0x4e, 0xf7,
+ 0x2e, 0x3b, 0xc6, 0x1f, 0xe7, 0xba, 0x5a, 0xa9,
+ 0x31, 0x5d, 0x55, 0xa8, 0x51, 0x98, 0x5b, 0x8f,
+ 0x19, 0x5d, 0x72, 0xb8, 0x83, 0xb9, 0x78, 0xb5,
+ 0x6c, 0x19, 0xfb, 0x9, 0x50, 0xbb, 0x6c, 0xf7,
+ 0x2, 0xc3, 0xb1, 0x66, 0xa9, 0x5c, 0x9d, 0x54,
+ 0x19, 0xe, 0x30, 0x82, 0x1d, 0xd5, 0xd9, 0x6e,
+ 0xd9, 0x12, 0xd5, 0x53, 0xa, 0x13, 0xdc, 0xa0,
+ 0x41, 0xa, 0x8d, 0x8b, 0xaa, 0xa3, 0x1a, 0x76,
+ 0xa, 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1e, 0x88,
+ 0x1d, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a, 0xfb,
+ 0xa9, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x84, 0x1e,
+ 0xd6, 0xf8, 0x97, 0x45, 0x1d, 0xa6, 0xa3, 0x80,
+ 0x80, 0xa3, 0x1f, 0x13, 0xec, 0x7e, 0xa6, 0xa5,
+ 0x7d, 0xa4, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6d,
+ 0x8f, 0xa, 0x6d, 0x50, 0x1d, 0xe, 0x65, 0xa,
+ 0xd7, 0x98, 0x1d, 0x5d, 0x1d, 0x3, 0xf7, 0x40,
+ 0xf7, 0x90, 0x78, 0x1d, 0xd7, 0xd5, 0xc8, 0x9c,
+ 0x5f, 0x64, 0xa, 0x27, 0x46, 0x3b, 0x8b, 0xf7,
+ 0x13, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x75, 0x15,
+ 0xfb, 0x16, 0xe2, 0xfb, 0x6, 0x70, 0xa, 0xf7,
+ 0x4, 0x6f, 0xa, 0xf2, 0x70, 0x1d, 0xfb, 0x6,
+ 0xfb, 0x15, 0x1e, 0xf7, 0x8d, 0xf7, 0xbe, 0x56,
+ 0x1d, 0x49, 0xd7, 0x64, 0xbd, 0x70, 0xa6, 0x8,
+ 0xaa, 0x6c, 0x7c, 0x8c, 0x80, 0x1b, 0x65, 0x80,
+ 0x7f, 0xa, 0xa5, 0x75, 0xa4, 0x7b, 0x1f, 0xe,
+ 0x65, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x32, 0xa,
+ 0xf7, 0x27, 0xf7, 0xbf, 0x28, 0x1d, 0x65, 0xa,
+ 0xd7, 0x76, 0xf7, 0x44, 0x32, 0xa, 0xc4, 0xf7,
+ 0xbf, 0x60, 0xa, 0x65, 0xa, 0xd5, 0xd9, 0x6e,
+ 0xd9, 0x12, 0x5d, 0x1d, 0x13, 0xdc, 0x25, 0xa,
+ 0xc0, 0xf7, 0xd4, 0x45, 0x1d, 0xa7, 0xa6, 0x7f,
+ 0x7f, 0xa4, 0x1f, 0x13, 0xec, 0x7f, 0xa4, 0xa3,
+ 0x7e, 0xa3, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6c,
+ 0x8f, 0xa, 0x6e, 0x50, 0x1d, 0xe, 0x65, 0xa,
+ 0xcc, 0xf7, 0x15, 0x12, 0xa4, 0xf7, 0x27, 0x30,
+ 0xf7, 0x15, 0xdc, 0xf7, 0x15, 0x30, 0xf7, 0x27,
+ 0x13, 0xf2, 0x25, 0xa, 0x13, 0xec, 0xc3, 0xf8,
+ 0x9, 0x2d, 0x1d, 0x3e, 0x6c, 0xef, 0x27, 0xf7,
+ 0x2a, 0xe5, 0xe2, 0x40, 0xcb, 0xef, 0xf7, 0x2c,
+ 0x27, 0xef, 0x12, 0xf7, 0x65, 0xf7, 0x2d, 0xfb,
+ 0x13, 0xef, 0x13, 0x5a, 0xad, 0xf7, 0x71, 0x15,
+ 0xf8, 0x8b, 0xcb, 0xfc, 0x8b, 0x6, 0x13, 0xa5,
+ 0xf7, 0x5d, 0xfb, 0x9e, 0x15, 0x6c, 0xa, 0xf8,
+ 0x68, 0x4, 0x6c, 0xa, 0xe, 0x44, 0x76, 0xd9,
+ 0xaa, 0xf7, 0xd9, 0x76, 0xf7, 0xd, 0xaa, 0xd7,
+ 0x77, 0x12, 0xa2, 0xf7, 0x27, 0xfb, 0x25, 0xf7,
+ 0x27, 0xf7, 0x31, 0xf7, 0x27, 0x13, 0xfd, 0xf7,
+ 0x41, 0xf7, 0x23, 0x15, 0x13, 0xfb, 0x8a, 0xa5,
+ 0x8b, 0xa4, 0xa9, 0x1a, 0xf7, 0x6, 0x90, 0xf3,
+ 0xd5, 0xad, 0x9f, 0x78, 0x62, 0x96, 0x1e, 0xfb,
+ 0x21, 0xfb, 0x83, 0x5, 0xfb, 0x21, 0xfb, 0x7f,
+ 0x15, 0xba, 0x6, 0xca, 0xf4, 0x5, 0x7a, 0xa9,
+ 0xb0, 0x81, 0xb3, 0x1b, 0xf7, 0x1c, 0xe4, 0xf4,
+ 0xf7, 0x19, 0xde, 0x69, 0xd7, 0x55, 0xb6, 0x1f,
+ 0xd4, 0xf7, 0xf, 0x5, 0x5d, 0x6, 0x4f, 0x26,
+ 0x5, 0x9b, 0x6e, 0x67, 0x94, 0x64, 0x1b, 0xfb,
+ 0x1f, 0x34, 0xfb, 0xc, 0xfb, 0x15, 0x3e, 0xaa,
+ 0x49, 0xc1, 0x5e, 0x1f, 0xd4, 0xb7, 0x15, 0xf7,
+ 0x22, 0xf7, 0x85, 0x5, 0x8d, 0x6, 0x8c, 0x72,
+ 0x8c, 0x67, 0x67, 0x1a, 0xfb, 0x13, 0x83, 0x3b,
+ 0x46, 0x64, 0x77, 0xa3, 0xb2, 0x81, 0x1e, 0xe,
+ 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0,
+ 0x98, 0x1d, 0xcc, 0x53, 0xa, 0x3, 0x89, 0x1d,
+ 0x49, 0x89, 0xa, 0x8d, 0x28, 0xa, 0x5b, 0xf8,
+ 0x70, 0x26, 0xa, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+ 0x77, 0xf7, 0x0, 0x98, 0x1d, 0xcc, 0x53, 0xa,
+ 0x3, 0x71, 0xa, 0x27, 0x1d, 0x6c, 0x7, 0xb4,
+ 0x84, 0x93, 0x7c, 0x38, 0xa, 0xfb, 0x2c, 0xf8,
+ 0x70, 0x28, 0x1d, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+ 0x77, 0xf7, 0x0, 0x83, 0x1d, 0xcc, 0x53, 0xa,
+ 0x3, 0x2f, 0x1d, 0xfb, 0x84, 0xf8, 0x70, 0x29,
+ 0x1d, 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x7a, 0x9a,
+ 0x1d, 0xcc, 0xf7, 0x1f, 0x26, 0xf7, 0x13, 0xde,
+ 0xf7, 0x13, 0x29, 0xf7, 0x1f, 0x13, 0xe4, 0x2f,
+ 0x1d, 0x13, 0xd8, 0xfb, 0x84, 0xf8, 0xba, 0x15,
+ 0x6d, 0x1d, 0xf7, 0x66, 0x16, 0x6d, 0x1d, 0xe,
+ 0xfb, 0x61, 0xf7, 0x23, 0xf8, 0x9f, 0x77, 0xf7,
+ 0x0, 0x76, 0xf7, 0x4d, 0x77, 0x12, 0x9b, 0xf7,
+ 0xe, 0xfb, 0xe, 0xf8, 0x64, 0xfb, 0x2b, 0xf7,
+ 0x2b, 0x13, 0x8a, 0x13, 0x4, 0xf7, 0x80, 0x7e,
+ 0x15, 0x40, 0x72, 0x2f, 0xa, 0x5, 0x13, 0x72,
+ 0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x8, 0x13,
+ 0x74, 0x4d, 0x1d, 0x13, 0xfa, 0x36, 0xa, 0xf7,
+ 0x4, 0xf7, 0x14, 0x28, 0x1d, 0x7c, 0xa, 0xf7,
+ 0x5f, 0x77, 0x1, 0xd6, 0xf7, 0x1f, 0xf7, 0x36,
+ 0xf7, 0x28, 0x3, 0x81, 0xa, 0x90, 0x1d, 0x6f,
+ 0x6a, 0xa0, 0xb3, 0x7b, 0x1e, 0x7a, 0x1d, 0x93,
+ 0xbe, 0x58, 0xa, 0x7c, 0x1f, 0x89, 0xf7, 0xad,
+ 0xfb, 0x56, 0x69, 0x6, 0xaf, 0x84, 0x9e, 0x87,
+ 0x5c, 0x1a, 0xfd, 0x4d, 0x92, 0xa, 0xfb, 0x61,
+ 0xf7, 0x23, 0xf8, 0xec, 0xf7, 0x15, 0x12, 0x9b,
+ 0xf7, 0x56, 0xfb, 0x15, 0xf7, 0x15, 0xdc, 0xf7,
+ 0x15, 0x13, 0xe8, 0xf7, 0x80, 0x7e, 0x15, 0x40,
+ 0x72, 0x2b, 0xa, 0x13, 0xd8, 0xa2, 0xf7, 0x5e,
+ 0x2d, 0x1d, 0x5d, 0xa, 0x1, 0xd0, 0x8a, 0xa,
+ 0x49, 0xa, 0xe, 0x9f, 0x8b, 0xaa, 0xf8, 0xf6,
+ 0x60, 0x1d, 0x38, 0x96, 0x1d, 0xf7, 0x59, 0x7,
+ 0xf7, 0xf, 0xd7, 0x5, 0xc8, 0x7, 0xfb, 0xf,
+ 0x3f, 0x5, 0xf7, 0x6a, 0x7, 0xc7, 0xaa, 0x9e,
+ 0xd1, 0x8e, 0x1e, 0xae, 0xfb, 0xf1, 0x68, 0x7,
+ 0xb8, 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfb, 0xc9,
+ 0x7, 0x3a, 0x5a, 0x5, 0x4e, 0x7, 0xdc, 0xbc,
+ 0x5, 0x25, 0x7, 0x62, 0x6d, 0x87, 0x53, 0x8b,
+ 0xa, 0xfc, 0x5, 0x8b, 0xad, 0xf9, 0x16, 0x77,
+ 0x1, 0xce, 0x8a, 0xa, 0x9b, 0x16, 0x99, 0xa,
+ 0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf7, 0xd1, 0x7,
+ 0xec, 0xdb, 0x5, 0xbd, 0x7, 0x2a, 0x3b, 0x5,
+ 0xf7, 0x6b, 0x8d, 0xa, 0xfb, 0x68, 0x7, 0x32,
+ 0x43, 0x5, 0x59, 0x7, 0xe4, 0xd3, 0x5, 0xfb,
+ 0x78, 0x97, 0x1d, 0xf7, 0xf5, 0x8b, 0xa6, 0x70,
+ 0xae, 0x78, 0x76, 0xf7, 0xe6, 0xac, 0xf7, 0xa7,
+ 0xae, 0x73, 0xab, 0x12, 0xa1, 0xf7, 0x3e, 0xf7,
+ 0xac, 0xf7, 0x2f, 0x13, 0x97, 0xf8, 0x6c, 0xf7,
+ 0x68, 0x15, 0xfb, 0x14, 0x8b, 0x52, 0x21, 0x34,
+ 0x34, 0xa7, 0xf7, 0xa1, 0xf7, 0x9, 0x9f, 0xf7,
+ 0x67, 0xf7, 0x35, 0xee, 0x8b, 0x51, 0x30, 0x1e,
+ 0xf7, 0x2f, 0xfb, 0x3e, 0x15, 0xf7, 0xc, 0x93,
+ 0x46, 0x33, 0x98, 0x1f, 0xac, 0xf7, 0xe6, 0x6a,
+ 0x6, 0xfb, 0x2, 0x73, 0x8d, 0x65, 0xfb, 0xb,
+ 0x1b, 0xf7, 0x8d, 0x7, 0x13, 0x9b, 0xa3, 0x9b,
+ 0x8d, 0xc4, 0xf7, 0x43, 0x99, 0x42, 0x2e, 0x9a,
+ 0x1e, 0xaf, 0xf7, 0x5d, 0xfc, 0x30, 0x6, 0x13,
+ 0x37, 0x79, 0xfb, 0x4, 0x93, 0x79, 0x1b, 0xfb,
+ 0xc6, 0x57, 0xfb, 0x86, 0x2c, 0xfb, 0x79, 0xf7,
+ 0x19, 0xfb, 0xf, 0xf7, 0x5e, 0x1f, 0x13, 0x9b,
+ 0xc3, 0xa7, 0x90, 0xcf, 0x1b, 0xf8, 0x42, 0x6,
+ 0xb5, 0xf7, 0x67, 0x5, 0x70, 0x6, 0x13, 0x5b,
+ 0xfb, 0x33, 0x47, 0x2c, 0x7a, 0x2b, 0x1b, 0x47,
+ 0x8b, 0xa2, 0xa4, 0x1f, 0xe, 0xd6, 0x7d, 0xa9,
+ 0x6d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x36, 0xa8,
+ 0x12, 0xa1, 0xf7, 0x25, 0xf7, 0x1c, 0xf7, 0x1c,
+ 0xf7, 0x18, 0xf7, 0x11, 0x13, 0x7e, 0xf8, 0x50,
+ 0xf7, 0xae, 0x15, 0xe0, 0x8c, 0x8b, 0xd8, 0xc9,
+ 0x1b, 0xc4, 0x8f, 0x4e, 0x26, 0x8e, 0x1f, 0xfb,
+ 0x50, 0xfb, 0x8c, 0x15, 0x7a, 0x9a, 0xa5, 0x6c,
+ 0xda, 0x1b, 0xf6, 0xbe, 0xd4, 0xbd, 0xae, 0x1f,
+ 0x77, 0x9b, 0x5, 0x6a, 0x6e, 0x6e, 0x69, 0x4c,
+ 0x1b, 0xfb, 0x1, 0x87, 0xf7, 0xe, 0xcc, 0x8d,
+ 0x1f, 0xf7, 0x90, 0x6, 0xf7, 0xe, 0x89, 0x64,
+ 0xf5, 0xfb, 0x28, 0x1b, 0x4e, 0x5d, 0x6f, 0x76,
+ 0x70, 0x1f, 0x9b, 0x7b, 0x6a, 0xac, 0x38, 0x1b,
+ 0xfb, 0x19, 0x35, 0xfb, 0x2, 0xfb, 0x1c, 0xfb,
+ 0xd, 0xd9, 0xfb, 0xc, 0xf7, 0x21, 0xe2, 0xae,
+ 0xaa, 0x9c, 0x9f, 0x1f, 0x40, 0xf7, 0x7, 0x15,
+ 0x13, 0xbe, 0x4b, 0x7c, 0x46, 0x57, 0x5e, 0x6e,
+ 0x8b, 0xf7, 0x67, 0xf7, 0x3e, 0xa5, 0xba, 0xbb,
+ 0xc0, 0x99, 0x66, 0x2b, 0x1e, 0xe, 0x30, 0x78,
+ 0xac, 0xf8, 0x76, 0x76, 0xf7, 0x4d, 0xaa, 0xf7,
+ 0x73, 0x8e, 0xa, 0x17, 0x7c, 0x1d, 0x98, 0x94,
+ 0x1d, 0xc3, 0x1b, 0x13, 0xfc, 0x47, 0x1d, 0x13,
+ 0xbc, 0x85, 0xa, 0x80, 0x7d, 0x90, 0x91, 0x7b,
+ 0x1f, 0x95, 0x71, 0x68, 0x97, 0x5a, 0x46, 0x1d,
+ 0xf7, 0x59, 0xf8, 0x92, 0x35, 0xa, 0xfb, 0x96,
+ 0x7d, 0xad, 0x7f, 0x76, 0xf8, 0x59, 0xac, 0x12,
+ 0xa6, 0xef, 0xf7, 0x1e, 0xeb, 0x13, 0x78, 0xa4,
+ 0x7e, 0x15, 0xa4, 0x6, 0x9f, 0x95, 0x91, 0x93,
+ 0x96, 0x1b, 0x90, 0x9f, 0x82, 0x83, 0xa4, 0x1f,
+ 0x13, 0xb8, 0x85, 0x9f, 0xa4, 0x85, 0xa1, 0x1b,
+ 0xe8, 0xd5, 0xc6, 0xea, 0x1f, 0xf7, 0x38, 0xfb,
+ 0x7e, 0x74, 0xf1, 0x1a, 0xaa, 0xa2, 0xa5, 0xaf,
+ 0xc4, 0xbe, 0x60, 0x44, 0xa0, 0x1e, 0xa4, 0xf7,
+ 0x25, 0x75, 0x6, 0x83, 0x88, 0x87, 0x7f, 0x79,
+ 0x1b, 0x81, 0x7b, 0x91, 0x91, 0x77, 0x1f, 0x90,
+ 0x79, 0x76, 0x90, 0x75, 0x1b, 0x2f, 0x48, 0x50,
+ 0x33, 0x1f, 0xfb, 0x2e, 0xf7, 0x82, 0x91, 0x2f,
+ 0x1a, 0x6d, 0x76, 0x67, 0x59, 0xfb, 0x3, 0x73,
+ 0xf4, 0xa6, 0x85, 0x1e, 0x6f, 0x6, 0x13, 0x78,
+ 0xf7, 0xf, 0xf8, 0xc, 0x35, 0xa, 0xd6, 0x4e,
+ 0x1d, 0xd3, 0xf7, 0x15, 0x12, 0xf7, 0x68, 0xf7,
+ 0x15, 0x4c, 0xf7, 0x36, 0x79, 0xf7, 0x15, 0x13,
+ 0xe8, 0x69, 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42,
+ 0x7, 0xf7, 0x4b, 0xf7, 0xc1, 0x9f, 0xab, 0xb0,
+ 0x62, 0xa, 0xb0, 0x89, 0x64, 0x1a, 0xfb, 0x2a,
+ 0xfb, 0xa0, 0x5, 0x42, 0x1d, 0x13, 0xf4, 0xa6,
+ 0xf9, 0x9d, 0x2d, 0x1d, 0x8c, 0xa, 0xf7, 0x82,
+ 0x77, 0x1, 0xa7, 0xf8, 0xf2, 0x3, 0x39, 0xa,
+ 0xf7, 0x97, 0xf9, 0x66, 0x35, 0xa, 0x87, 0x1d,
+ 0xe3, 0x83, 0x1d, 0xb1, 0xa5, 0x87, 0xa, 0x6f,
+ 0x8e, 0x1d, 0x61, 0x8b, 0x62, 0x8c, 0xf7, 0x7b,
+ 0xf8, 0x27, 0x18, 0xa5, 0xfc, 0x7, 0x7, 0x84,
+ 0xfb, 0x22, 0x5, 0xa5, 0x6, 0xa5, 0xf7, 0x1,
+ 0xba, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc,
+ 0x25, 0x18, 0xf7, 0x2f, 0xf8, 0x88, 0x35, 0xa,
+ 0xfb, 0x1a, 0x76, 0xf8, 0xb9, 0xb9, 0xf7, 0x13,
+ 0xf7, 0x1f, 0x6d, 0xa9, 0x12, 0x8b, 0xf7, 0x0,
+ 0xd6, 0xf7, 0x1f, 0x13, 0xdc, 0xd5, 0xf8, 0x1e,
+ 0x15, 0xf7, 0x8, 0x6, 0x7e, 0xfc, 0x2a, 0x5,
+ 0x31, 0x88, 0x65, 0x74, 0x73, 0x1b, 0x7f, 0x81,
+ 0x93, 0x92, 0x1f, 0x98, 0x9d, 0x8d, 0xa5, 0x1a,
+ 0xad, 0x70, 0x9a, 0x70, 0x76, 0x6a, 0x7e, 0x5e,
+ 0x6a, 0xa0, 0x5f, 0xd3, 0x1e, 0x13, 0x54, 0xf7,
+ 0x1c, 0xc4, 0xf7, 0x23, 0xf7, 0x25, 0x9d, 0x1f,
+ 0x96, 0xe2, 0x8a, 0xc6, 0x93, 0xf7, 0x7, 0x8,
+ 0xf7, 0xe, 0xb9, 0xfb, 0xe, 0xe5, 0x6, 0xae,
+ 0x8b, 0xf7, 0x3, 0xcc, 0x9e, 0x8e, 0x7e, 0x89,
+ 0x1e, 0x85, 0x79, 0x77, 0x76, 0x1a, 0x13, 0xec,
+ 0x6f, 0xa5, 0x78, 0xa8, 0xa8, 0xa2, 0xa7, 0xab,
+ 0x1e, 0x13, 0x60, 0x9a, 0x7d, 0xcb, 0x2a, 0xfb,
+ 0x31, 0x73, 0xfb, 0x54, 0x41, 0x7f, 0x1e, 0xfb,
+ 0xc, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xb9, 0x83,
+ 0x1d, 0x89, 0xf8, 0xa4, 0x60, 0xa, 0xfb, 0xce,
+ 0xf8, 0xb9, 0x83, 0x1d, 0xf7, 0xc, 0xf8, 0xa4,
+ 0x52, 0xa, 0x51, 0x6, 0xfb, 0x3, 0x28, 0xfb,
+ 0x3, 0xee, 0x5, 0x52, 0x6, 0xe, 0xfb, 0xce,
+ 0xf8, 0xa4, 0xd7, 0x3f, 0xf7, 0x37, 0x12, 0x13,
+ 0x40, 0x9a, 0xf9, 0x47, 0x15, 0x21, 0xc5, 0x52,
+ 0xe8, 0xec, 0xc2, 0xca, 0xef, 0x1e, 0x5f, 0x6,
+ 0x13, 0x80, 0x6c, 0x83, 0x7c, 0x53, 0x37, 0x1b,
+ 0x13, 0x40, 0x30, 0x7f, 0xc6, 0xa7, 0x86, 0x1f,
+ 0xe, 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1,
+ 0xf2, 0xf7, 0x13, 0x3, 0xf2, 0xf8, 0xef, 0x15,
+ 0x66, 0xa6, 0x6e, 0xb0, 0xae, 0xa7, 0xa8, 0xb0,
+ 0xb0, 0x6f, 0xa6, 0x68, 0x67, 0x6f, 0x6f, 0x67,
+ 0x1e, 0xe, 0xfb, 0xce, 0xf8, 0xa3, 0xf7, 0x39,
+ 0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x39,
+ 0x12, 0xc7, 0xf7, 0x3a, 0xfb, 0x9, 0xf7, 0x9,
+ 0xfb, 0x9, 0xf7, 0x38, 0x13, 0x90, 0xc7, 0x94,
+ 0xa, 0x13, 0x24, 0xc5, 0xbb, 0xba, 0xc6, 0xc5,
+ 0x5c, 0xbc, 0x51, 0x1f, 0x13, 0x90, 0x51, 0x59,
+ 0x5b, 0x50, 0x1f, 0x13, 0x48, 0xbc, 0x16, 0x6b,
+ 0xa6, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, 0xab,
+ 0x71, 0xa6, 0x6b, 0x6b, 0x70, 0x70, 0x6b, 0x1e,
+ 0xe, 0xfb, 0xce, 0xfb, 0x41, 0xd0, 0xf7, 0x28,
+ 0x77, 0x1, 0xe5, 0xdf, 0x3, 0xf7, 0x31, 0xb7,
+ 0x15, 0x5b, 0x5f, 0x78, 0x5e, 0x5e, 0x1a, 0x46,
+ 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, 0xa1,
+ 0x1e, 0x75, 0xa1, 0x5, 0x7d, 0x75, 0x7e, 0x7d,
+ 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba, 0xa4, 0x98,
+ 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xce, 0xf8,
+ 0xb7, 0xd9, 0x6e, 0xd9, 0x12, 0x13, 0x80, 0x7b,
+ 0xf8, 0xb7, 0x15, 0xb5, 0x6, 0x13, 0x40, 0x9d,
+ 0x8c, 0x9b, 0xaa, 0xab, 0x1b, 0xb5, 0xa4, 0x7b,
+ 0x7e, 0xa3, 0x1f, 0x80, 0x9e, 0x9d, 0x82, 0xa4,
+ 0x1b, 0x42, 0xa, 0x74, 0x74, 0x92, 0x94, 0x75,
+ 0x1f, 0x99, 0x68, 0x6c, 0x9e, 0x7a, 0x1b, 0x2f,
+ 0x78, 0x2f, 0x68, 0x84, 0x1f, 0xe, 0xfb, 0xce,
+ 0xf8, 0xa4, 0xf7, 0x4d, 0x1, 0x7e, 0xf8, 0xa4,
+ 0x15, 0xc0, 0x6, 0xf7, 0x25, 0x23, 0xa, 0xcc,
+ 0xfb, 0x31, 0x15, 0xc1, 0x22, 0xa, 0xe, 0xf7,
+ 0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xf8, 0x88,
+ 0xca, 0xfc, 0x88, 0x6, 0xe, 0xf7, 0xf5, 0xf7,
+ 0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xfa, 0x7c,
+ 0xc9, 0xfe, 0x7c, 0x6, 0xe, 0xfb, 0xce, 0xf8,
+ 0xd, 0x83, 0xa, 0xd1, 0xcf, 0x47, 0xf7, 0x4c,
+ 0x13, 0xd0, 0xf7, 0x8b, 0xf9, 0x31, 0x15, 0x5b,
+ 0xa, 0xa5, 0x4d, 0xd4, 0xb9, 0xb2, 0xa9, 0xbf,
+ 0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0x13, 0xe0, 0x68,
+ 0xa, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x7b, 0xa,
+ 0xec, 0xf7, 0xf8, 0x15, 0x47, 0xa, 0xfb, 0xce,
+ 0xfb, 0x33, 0x7b, 0xa, 0xe1, 0xfb, 0x32, 0x15,
+ 0x96, 0x75, 0x5, 0x47, 0xa, 0xf7, 0xf8, 0xf7,
+ 0x35, 0xf7, 0x42, 0x77, 0x12, 0xab, 0xcf, 0x47,
+ 0xf7, 0x4c, 0xe1, 0xcf, 0x47, 0xf7, 0x4c, 0x13,
+ 0xd8, 0xf7, 0x65, 0xf9, 0x31, 0x15, 0x57, 0xa,
+ 0x13, 0xe4, 0x68, 0xa, 0xf7, 0xa2, 0x16, 0x57,
+ 0xa, 0x13, 0xe8, 0x68, 0xa, 0xe, 0xf8, 0xd,
+ 0x68, 0x1d, 0xf7, 0xc2, 0xf7, 0xf8, 0x15, 0x5f,
+ 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb, 0x97, 0x75,
+ 0x15, 0x5f, 0xa, 0x13, 0xd8, 0x3f, 0x1d, 0xe,
+ 0xfb, 0x33, 0x68, 0x1d, 0xf7, 0xb7, 0xfb, 0x32,
+ 0x15, 0x56, 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb,
+ 0xa2, 0x16, 0x56, 0xa, 0x13, 0xd8, 0x3f, 0x1d,
+ 0xe, 0xfb, 0x5, 0x76, 0xf8, 0xae, 0xf5, 0xf7,
+ 0x49, 0x77, 0x12, 0xf7, 0x56, 0xf7, 0x5, 0x46,
+ 0xa7, 0x13, 0xe8, 0xf7, 0x84, 0xfb, 0x1a, 0x15,
+ 0xa0, 0x6, 0x90, 0xf7, 0x2e, 0x90, 0xf7, 0x14,
+ 0xb4, 0xf6, 0x91, 0x98, 0x19, 0x8e, 0x91, 0x4d,
+ 0xa6, 0x8d, 0xf7, 0x25, 0x8, 0xa8, 0xa0, 0x83,
+ 0x83, 0x9d, 0x1f, 0x7f, 0xa4, 0x9f, 0x7d, 0xa7,
+ 0x1b, 0xaa, 0x9f, 0xa8, 0xa7, 0xa4, 0x7c, 0xa3,
+ 0x66, 0x71, 0x79, 0x7d, 0x7f, 0x6f, 0x1f, 0x7a,
+ 0x84, 0x76, 0x84, 0x6d, 0x87, 0x8a, 0xb3, 0x91,
+ 0xa4, 0x93, 0x9f, 0x8, 0x13, 0xf0, 0x99, 0xad,
+ 0x9e, 0x9b, 0xb1, 0x1a, 0xbb, 0x5f, 0x8f, 0x7e,
+ 0x61, 0x7d, 0x6a, 0x71, 0x67, 0xa0, 0x84, 0x98,
+ 0x62, 0x1e, 0x13, 0xe8, 0x91, 0x78, 0x8f, 0x72,
+ 0x65, 0x1a, 0x6d, 0x8d, 0x78, 0x92, 0x7b, 0x92,
+ 0x8, 0x98, 0x70, 0x7c, 0x9a, 0x6b, 0x1b, 0x66,
+ 0x7c, 0x72, 0x72, 0x6f, 0x9f, 0x6e, 0xaa, 0xae,
+ 0x96, 0x9a, 0x98, 0xa8, 0x1f, 0x9a, 0x92, 0x9f,
+ 0x91, 0xa9, 0x8d, 0x8, 0xfb, 0x26, 0x53, 0x72,
+ 0x8d, 0x85, 0x1e, 0x8e, 0x83, 0xb7, 0xfb, 0x5,
+ 0x8f, 0xfb, 0x14, 0x8, 0xe, 0xf7, 0x83, 0x8a,
+ 0x15, 0x87, 0x60, 0x63, 0x55, 0x63, 0x1a, 0x6b,
+ 0xa1, 0x6f, 0xac, 0xac, 0xa1, 0xa7, 0xab, 0xb3,
+ 0x63, 0xc1, 0x87, 0xb6, 0x1e, 0x67, 0x1d, 0x8e,
+ 0xad, 0xa0, 0xa9, 0xa7, 0x9e, 0x8, 0x5c, 0xaf,
+ 0x87, 0xb9, 0xbb, 0x1a, 0xbb, 0x8f, 0xb9, 0xba,
+ 0xaf, 0x1e, 0x6f, 0x9e, 0x76, 0xa9, 0x88, 0xad,
+ 0x8, 0x67, 0x1d, 0x8f, 0xb6, 0xb3, 0xc1, 0xb3,
+ 0x1a, 0xab, 0x75, 0xa7, 0x6a, 0x6a, 0x75, 0x6f,
+ 0x6b, 0x63, 0xb3, 0x55, 0x8f, 0x60, 0x1e, 0x67,
+ 0xa, 0x88, 0x69, 0x76, 0x6d, 0x6f, 0x78, 0x8,
+ 0xba, 0x67, 0x8f, 0x5d, 0x5b, 0x1a, 0x5b, 0x87,
+ 0x5d, 0x5c, 0x67, 0x1e, 0xa7, 0x78, 0xa0, 0x6d,
+ 0x8e, 0x69, 0x8, 0x67, 0xa, 0xe, 0xfb, 0xbd,
+ 0xf7, 0x6f, 0x76, 0xf7, 0xac, 0x77, 0x1, 0xae,
+ 0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4e, 0xd7, 0xda,
+ 0xc8, 0xc8, 0xda, 0xd8, 0x4e, 0xca, 0x3c, 0x3f,
+ 0x4b, 0x4c, 0x3e, 0x1e, 0xe, 0xf7, 0xf5, 0x7e,
+ 0xf7, 0x3d, 0x1, 0xdd, 0xf7, 0x3d, 0xf7, 0x38,
+ 0xf7, 0x3d, 0xf7, 0x38, 0xf7, 0x3d, 0x14, 0x70,
+ 0xdd, 0xd4, 0x15, 0x4a, 0xa, 0xf7, 0xe1, 0x16,
+ 0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, 0xe,
+ 0xf7, 0xf5, 0x7d, 0xa3, 0x87, 0x76, 0xf7, 0xe1,
+ 0xa3, 0x8a, 0x76, 0xb8, 0x76, 0xf7, 0xc8, 0xa3,
+ 0x8c, 0x77, 0x12, 0xa3, 0x97, 0xa, 0xa1, 0x97,
+ 0xa, 0xaf, 0x97, 0xa, 0x13, 0xad, 0xf8, 0xf7,
+ 0xec, 0xf7, 0x38, 0x15, 0x30, 0x1d, 0xf7, 0x70,
+ 0x16, 0x30, 0x1d, 0x13, 0x9d, 0xf8, 0xfd, 0x94,
+ 0xf7, 0xe2, 0x15, 0x30, 0x1d, 0x13, 0x6b, 0xf8,
+ 0x47, 0x76, 0x1d, 0xfb, 0xce, 0x82, 0xa, 0x1,
+ 0xbe, 0xf7, 0x75, 0x88, 0xa, 0x81, 0x95, 0x9b,
+ 0x7e, 0x96, 0x1b, 0x91, 0x90, 0x75, 0xa, 0x96,
+ 0x85, 0x8e, 0x85, 0x80, 0x79, 0x7e, 0x82, 0x81,
+ 0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xe, 0xfb,
+ 0xce, 0x82, 0xa, 0x1, 0xf7, 0x26, 0x91, 0xa,
+ 0x80, 0x91, 0x88, 0x91, 0x96, 0x9d, 0x99, 0x93,
+ 0x95, 0x59, 0xa, 0x95, 0x81, 0x7b, 0x98, 0x80,
+ 0x1b, 0x84, 0x87, 0x86, 0x7e, 0x6d, 0xe6, 0x25,
+ 0xa6, 0x62, 0x1f, 0xe, 0xfc, 0x74, 0x94, 0x76,
+ 0xf9, 0x50, 0x77, 0x1, 0xfb, 0x2, 0x7f, 0x15,
+ 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xfc,
+ 0x4d, 0xfd, 0x50, 0x5, 0xe, 0xd6, 0x8b, 0xe7,
+ 0xf7, 0x3e, 0xb3, 0xe4, 0xb3, 0xe3, 0x76, 0xf7,
+ 0x34, 0xab, 0x1, 0xf6, 0xf7, 0x3b, 0x3, 0x94,
+ 0xf7, 0x9a, 0x15, 0xed, 0x6, 0xfb, 0x2a, 0x9a,
+ 0xf7, 0x31, 0xfb, 0x4, 0xf7, 0x15, 0x1b, 0xf7,
+ 0xb, 0xf3, 0xc0, 0xe2, 0xc5, 0x1f, 0x77, 0x95,
+ 0x5, 0x64, 0x51, 0x4c, 0x78, 0x51, 0x1b, 0xfb,
+ 0x6, 0x2c, 0xca, 0xf6, 0x84, 0x1f, 0xf7, 0xb8,
+ 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xc7, 0x6, 0x8a,
+ 0x9c, 0x8a, 0x9a, 0x9a, 0x1a, 0x99, 0x8b, 0x98,
+ 0x8d, 0x9a, 0x1e, 0xf7, 0xd9, 0x6, 0x9a, 0xb3,
+ 0x5, 0xfb, 0xe3, 0x6, 0xf7, 0x20, 0x98, 0xc0,
+ 0xe2, 0xf5, 0x1b, 0xf7, 0x11, 0xc8, 0x4a, 0x2c,
+ 0x96, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, 0x49,
+ 0x4b, 0xa0, 0x23, 0x1b, 0xfb, 0x18, 0xfb, 0x1a,
+ 0x75, 0xfb, 0x81, 0x4d, 0x1f, 0x34, 0x6, 0x7c,
+ 0x63, 0x5, 0xeb, 0x6, 0x8a, 0x7d, 0x8a, 0x7c,
+ 0x7d, 0x1a, 0x7c, 0x8b, 0x7c, 0x8c, 0x7b, 0x1e,
+ 0x3b, 0x6, 0xe, 0xf7, 0xf5, 0xf7, 0xa4, 0xac,
+ 0x7e, 0x76, 0xf8, 0x8, 0xac, 0x73, 0xa3, 0x12,
+ 0xf7, 0x32, 0xe8, 0xf7, 0x8a, 0xa8, 0xf7, 0xc4,
+ 0xe8, 0x13, 0x9e, 0xf7, 0x0, 0xf7, 0xa4, 0x15,
+ 0xf7, 0x56, 0xac, 0x6, 0x57, 0x8f, 0x8c, 0x8f,
+ 0xb3, 0x1a, 0xf7, 0xbf, 0xb9, 0x7, 0xb3, 0x9d,
+ 0x6e, 0x68, 0x93, 0x1f, 0xa2, 0xe3, 0xfb, 0xfe,
+ 0x33, 0xa2, 0x6, 0xae, 0x93, 0x9c, 0xa8, 0xb3,
+ 0x1b, 0xb9, 0xfb, 0xbf, 0x6, 0x63, 0x8c, 0x87,
+ 0x58, 0x87, 0x1e, 0xf7, 0xe5, 0x6a, 0x15, 0xf7,
+ 0x19, 0xac, 0x6, 0x5c, 0x8e, 0x86, 0x91, 0xbd,
+ 0x1a, 0xf7, 0x5b, 0x8d, 0x7, 0x13, 0x6e, 0xf7,
+ 0x20, 0xfb, 0xb8, 0x5, 0x98, 0x6, 0xf7, 0x27,
+ 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0x68, 0x6, 0x13,
+ 0xae, 0x63, 0x8d, 0x87, 0x57, 0x87, 0x1e, 0x6a,
+ 0xf7, 0x56, 0xac, 0x7, 0x57, 0x8f, 0x8c, 0x8f,
+ 0xb3, 0x1a, 0xf7, 0x86, 0x7, 0xab, 0x92, 0x99,
+ 0xba, 0x8d, 0x1e, 0xac, 0xfb, 0xa, 0x7, 0xfb,
+ 0x2b, 0xfb, 0xb5, 0xfb, 0x22, 0xf7, 0xb5, 0x5,
+ 0xfb, 0x1f, 0x6a, 0x6, 0xa8, 0xa6, 0x81, 0x6b,
+ 0x99, 0x1f, 0xfb, 0x81, 0x7, 0x59, 0x86, 0x85,
+ 0x5c, 0x88, 0x1e, 0xe, 0x3e, 0xf7, 0x65, 0xcb,
+ 0x1, 0xac, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xcb,
+ 0xfc, 0x8c, 0x6, 0xe, 0x30, 0x8b, 0xad, 0xf8,
+ 0x13, 0xb7, 0xf7, 0x5c, 0xa9, 0x12, 0xd2, 0xf7,
+ 0x1f, 0xf7, 0x1e, 0xf7, 0x10, 0xfb, 0x10, 0xf7,
+ 0x1f, 0x13, 0xf8, 0x75, 0x1d, 0xf3, 0x7, 0xa9,
+ 0x8f, 0x7e, 0x76, 0x1f, 0xfb, 0xb8, 0x7, 0x73,
+ 0x8a, 0x6e, 0x5d, 0x87, 0x6a, 0xa, 0x13, 0xf4,
+ 0x65, 0x8c, 0x80, 0x9f, 0xaf, 0x1a, 0xf8, 0x12,
+ 0x7, 0x86, 0x56, 0x49, 0x84, 0x57, 0x1b, 0x21,
+ 0x6, 0xf7, 0x15, 0x88, 0xd2, 0xe0, 0xb7, 0x9b,
+ 0x78, 0x82, 0x1e, 0x87, 0x82, 0x7f, 0x73, 0x1a,
+ 0x5c, 0xbc, 0x84, 0x99, 0x1e, 0x13, 0xf8, 0x90,
+ 0xc8, 0x8c, 0xc7, 0xdf, 0xfb, 0x3a, 0x92, 0x7d,
+ 0xfb, 0x6c, 0x87, 0xfb, 0x38, 0x49, 0x8a, 0x7a,
+ 0xa, 0xe, 0x30, 0xa0, 0x76, 0xf8, 0x35, 0xb7,
+ 0xf7, 0x59, 0xac, 0x8a, 0x77, 0x12, 0xd2, 0x53,
+ 0xa, 0x13, 0xdc, 0x75, 0x1d, 0xf7, 0x1e, 0xfb,
+ 0xda, 0x7, 0x78, 0x8a, 0x6b, 0x5d, 0x85, 0x6a,
+ 0xa, 0x59, 0x8f, 0x8c, 0xb6, 0x95, 0x1a, 0xf8,
+ 0xeb, 0x78, 0x7, 0x5c, 0x6d, 0x5, 0x13, 0xec,
+ 0xaa, 0x47, 0x4e, 0x8b, 0x87, 0x1b, 0xfb, 0x52,
+ 0x72, 0xfb, 0x1a, 0x2b, 0x89, 0x7a, 0xa, 0xf7,
+ 0x58, 0xf8, 0x3f, 0x15, 0xc9, 0x7, 0xc6, 0x87,
+ 0xd7, 0xdd, 0xae, 0x9c, 0x84, 0x7b, 0x1e, 0x83,
+ 0x7e, 0x79, 0x7d, 0x1a, 0x78, 0x97, 0x7c, 0x94,
+ 0x89, 0x1e, 0x29, 0x7, 0xe, 0x78, 0x9e, 0xf8,
+ 0x61, 0x97, 0xf7, 0x5f, 0x9a, 0x6, 0xf7, 0xa0,
+ 0x92, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+ 0x9, 0xb5, 0xa, 0xf7, 0x1d, 0xb, 0x8c, 0xc,
+ 0xe, 0xf8, 0x88, 0x14, 0xf9, 0x1b, 0x15, 0xaf,
+ 0x13, 0x0, 0x7a, 0x2, 0x0, 0x1, 0x0, 0x2d,
+ 0x0, 0x6e, 0x0, 0x74, 0x0, 0x81, 0x0, 0x86,
+ 0x0, 0xb2, 0x0, 0xb5, 0x0, 0xcf, 0x0, 0xd4,
+ 0x0, 0xe3, 0x0, 0xec, 0x0, 0xfa, 0x1, 0x3,
+ 0x1, 0xf, 0x1, 0x1a, 0x1, 0x40, 0x1, 0x58,
+ 0x1, 0x66, 0x1, 0x6e, 0x1, 0x73, 0x1, 0x84,
+ 0x1, 0x92, 0x1, 0xa5, 0x1, 0xdc, 0x1, 0xec,
+ 0x2, 0x21, 0x2, 0x2c, 0x2, 0x38, 0x2, 0x46,
+ 0x2, 0x4f, 0x2, 0x5f, 0x2, 0x88, 0x2, 0xb0,
+ 0x2, 0xbf, 0x2, 0xc4, 0x2, 0xcd, 0x2, 0xd6,
+ 0x2, 0xe0, 0x2, 0xf4, 0x2, 0xfb, 0x3, 0x9,
+ 0x3, 0xe, 0x3, 0x20, 0x3, 0x28, 0x3, 0x3b,
+ 0x3, 0x47, 0x3, 0x4c, 0x3, 0x58, 0x3, 0x60,
+ 0x3, 0x6f, 0x3, 0x78, 0x3, 0x7f, 0x3, 0x85,
+ 0x3, 0x9f, 0x3, 0xac, 0x3, 0xbb, 0x3, 0xd4,
+ 0x3, 0xe2, 0x3, 0xe7, 0x3, 0xf4, 0x3, 0xf9,
+ 0x4, 0x1, 0x4, 0x8, 0x4, 0x12, 0x4, 0x1a,
+ 0x4, 0x1e, 0x4, 0x27, 0x4, 0x30, 0x4, 0x36,
+ 0x4, 0x3c, 0x4, 0x47, 0x4, 0x5b, 0x4, 0x66,
+ 0x4, 0x71, 0x4, 0x78, 0x4, 0x7f, 0x4, 0x91,
+ 0x4, 0x9a, 0x4, 0xac, 0x4, 0xb2, 0x4, 0xb8,
+ 0x4, 0xc1, 0x4, 0xcb, 0x4, 0xdb, 0x4, 0xdf,
+ 0x4, 0xe8, 0x4, 0xf1, 0x4, 0xf6, 0x4, 0xfb,
+ 0x5, 0x9, 0x5, 0x17, 0x5, 0x1f, 0x5, 0x2c,
+ 0x5, 0x39, 0x5, 0x3e, 0x5, 0x42, 0x5, 0x4e,
+ 0x5, 0x5a, 0x5, 0x60, 0x5, 0x66, 0x5, 0x71,
+ 0x5, 0x7c, 0x5, 0x87, 0x5, 0x92, 0x5, 0x99,
+ 0x5, 0x9e, 0x5, 0xa2, 0x5, 0xa5, 0x5, 0xaf,
+ 0x5, 0xb9, 0x5, 0xc3, 0x5, 0xcd, 0x5, 0xd4,
+ 0x5, 0xde, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+ 0x6, 0x0, 0x6, 0x9, 0x6, 0xf, 0x6, 0x14,
+ 0x6, 0x19, 0x9b, 0x9b, 0xaa, 0xa7, 0xd3, 0x1e,
+ 0xf7, 0x75, 0x6, 0x99, 0x6b, 0xab, 0x4b, 0x70,
+ 0x1a, 0x6a, 0x79, 0x8a, 0x4d, 0x86, 0x1e, 0x68,
+ 0xf7, 0xd8, 0xae, 0x7, 0x5b, 0x89, 0x87, 0x95,
+ 0x7e, 0xaa, 0xfb, 0x9f, 0xf8, 0xfc, 0x18, 0x6f,
+ 0x6, 0xfb, 0x8f, 0xfc, 0xf8, 0xb, 0x15, 0xc3,
+ 0x85, 0xa5, 0x96, 0x37, 0x1a, 0xfb, 0xe5, 0x7,
+ 0xfb, 0x4d, 0xf7, 0x30, 0x50, 0xf7, 0x1c, 0xf7,
+ 0x36, 0xd2, 0xdd, 0xf7, 0x36, 0x1e, 0xf7, 0xe5,
+ 0x7, 0xcd, 0xa2, 0x90, 0x43, 0xa, 0x7d, 0x4e,
+ 0x1a, 0xfb, 0xe5, 0x7, 0x4b, 0x7e, 0xfb, 0x17,
+ 0xfb, 0x44, 0xfb, 0x24, 0x96, 0xf7, 0x1e, 0xc4,
+ 0x1e, 0xf7, 0xe5, 0x7, 0xe3, 0xaa, 0x7f, 0xcd,
+ 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xb, 0x6,
+ 0xf7, 0x22, 0x23, 0xa, 0xb, 0xe3, 0x5, 0xa3,
+ 0x9a, 0x9b, 0x95, 0xa7, 0x1a, 0xaf, 0x6c, 0x2c,
+ 0xa, 0xb, 0x44, 0x1d, 0x26, 0x1d, 0xb, 0xf7,
+ 0x40, 0xf7, 0x79, 0x78, 0x1d, 0xee, 0xd5, 0xc8,
+ 0x9c, 0x50, 0x64, 0xa, 0x36, 0x46, 0x3b, 0x8b,
+ 0xf3, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x16, 0xfb,
+ 0x16, 0xe2, 0xfb, 0x5, 0x70, 0xa, 0xf7, 0x2,
+ 0x6f, 0xa, 0xf4, 0x70, 0x1d, 0xfb, 0x7, 0xfb,
+ 0x15, 0x1e, 0xb, 0x24, 0x1d, 0xe, 0x1, 0xf7,
+ 0x5, 0x7f, 0x1d, 0x9f, 0x16, 0xf7, 0xf2, 0xae,
+ 0x6, 0x34, 0x1d, 0xfb, 0xf2, 0x68, 0x7, 0x4b,
+ 0xa, 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0xb,
+ 0x6b, 0x1d, 0x25, 0x1d, 0xb, 0x56, 0x1d, 0xfb,
+ 0x1d, 0xf7, 0x31, 0x5, 0x98, 0x80, 0x77, 0x9a,
+ 0x76, 0x1b, 0x65, 0xb, 0x23, 0x1d, 0xa1, 0x81,
+ 0x97, 0x83, 0x95, 0x1e, 0xb, 0x2f, 0xa, 0x9e,
+ 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x19, 0x4d, 0x1d,
+ 0x36, 0xa, 0xb, 0x93, 0x79, 0x81, 0x78, 0x89,
+ 0x71, 0x74, 0x1e, 0xb, 0x2c, 0x1d, 0xfb, 0xa9,
+ 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xb,
+ 0x5, 0xc4, 0x6, 0xfb, 0xf, 0xf7, 0x44, 0x5,
+ 0x2f, 0x6, 0xb, 0x72, 0x4f, 0x69, 0x1b, 0x7f,
+ 0x86, 0x97, 0x90, 0x1f, 0x8f, 0x8e, 0x90, 0x94,
+ 0x1a, 0x9d, 0x80, 0xac, 0x5e, 0x4f, 0x85, 0x58,
+ 0x7d, 0x6b, 0xa6, 0x5d, 0xcc, 0xe9, 0xa0, 0xc4,
+ 0xf7, 0x19, 0xbd, 0x1e, 0xf7, 0x29, 0xf8, 0x17,
+ 0xb, 0x48, 0xa, 0xfb, 0x44, 0x78, 0xa, 0xfb,
+ 0x7f, 0x3c, 0x1d, 0xf7, 0x25, 0x5e, 0xa, 0xf7,
+ 0x1d, 0x5e, 0x1d, 0xfb, 0x1d, 0xfb, 0x6e, 0x1e,
+ 0xb, 0x7c, 0xa0, 0x5, 0x6c, 0x6c, 0x80, 0xb1,
+ 0x8f, 0x1a, 0xf7, 0x99, 0x7, 0xe9, 0xb, 0x77,
+ 0x1, 0x5d, 0x1d, 0x3, 0x25, 0xa, 0xb, 0x99,
+ 0xa, 0x2d, 0xa, 0xb, 0xfb, 0x7, 0x30, 0x2d,
+ 0xfb, 0x28, 0xfb, 0x3f, 0xf1, 0x41, 0xf0, 0xdb,
+ 0xc4, 0xab, 0xe8, 0xc8, 0xb, 0x52, 0xa, 0x52,
+ 0x6, 0xfb, 0x4, 0x28, 0xfb, 0x4, 0xee, 0x5,
+ 0x53, 0x6, 0xe, 0x3c, 0xfb, 0x77, 0x5, 0x3a,
+ 0xf7, 0x63, 0x80, 0x9b, 0x95, 0x1a, 0xa3, 0xa6,
+ 0x8c, 0xa5, 0x8d, 0x48, 0x1d, 0xb, 0xf8, 0x51,
+ 0xfc, 0xb2, 0x5, 0xa7, 0xf8, 0xce, 0x6, 0xbb,
+ 0x91, 0xab, 0xd3, 0x94, 0x1e, 0xae, 0xfb, 0x6b,
+ 0x68, 0x7, 0xdc, 0x85, 0x97, 0x74, 0x4f, 0x1a,
+ 0xfb, 0xc3, 0x89, 0x7, 0xfb, 0xef, 0xf8, 0x3f,
+ 0x5, 0xfb, 0x67, 0x72, 0x6, 0x98, 0x9b, 0x88,
+ 0x46, 0xc3, 0x1f, 0xfc, 0x64, 0x7, 0x49, 0x6f,
+ 0x84, 0x4f, 0x84, 0x1e, 0xb, 0x63, 0x1a, 0xfb,
+ 0x8a, 0x7, 0x44, 0xad, 0x4a, 0xf1, 0xce, 0xb9,
+ 0xb4, 0xa4, 0xa8, 0x1e, 0xb, 0xa7, 0x16, 0xf8,
+ 0xd8, 0x6, 0xa5, 0xf7, 0x85, 0x5, 0x67, 0x6,
+ 0x57, 0xfb, 0x66, 0x29, 0x8c, 0xfb, 0x73, 0x8e,
+ 0xf8, 0xf, 0xf9, 0x5, 0x18, 0x9b, 0xfc, 0xa0,
+ 0x7, 0x76, 0xfb, 0x62, 0x5, 0xb1, 0x6, 0x9d,
+ 0xbe, 0x9d, 0xdd, 0xd6, 0xa2, 0xac, 0x95, 0x8b,
+ 0x8b, 0xf7, 0x3d, 0x90, 0xfc, 0x12, 0xfd, 0x5,
+ 0x18, 0xb, 0xf7, 0x5f, 0xae, 0x6, 0x69, 0x8d,
+ 0x5b, 0x8e, 0xb1, 0x1a, 0xb, 0x9b, 0xb6, 0x9f,
+ 0xaf, 0xd5, 0x85, 0x55, 0x58, 0x1e, 0x53, 0x7,
+ 0xb, 0xf8, 0xdd, 0x6, 0xb3, 0xf7, 0x64, 0x5,
+ 0x6f, 0x6, 0xfb, 0x2b, 0x4c, 0x25, 0xb, 0xcc,
+ 0xf7, 0x12, 0x1a, 0xbf, 0x6e, 0xc9, 0x42, 0xb,
+ 0x5d, 0xa, 0xf7, 0x0, 0x98, 0x1d, 0xd0, 0x8a,
+ 0xa, 0x9b, 0x16, 0x99, 0xa, 0x2c, 0x1d, 0xb,
+ 0xf8, 0xee, 0x15, 0x72, 0x9f, 0x63, 0xb6, 0xb0,
+ 0xa6, 0xa8, 0xae, 0xaf, 0x6e, 0xa9, 0x68, 0x61,
+ 0x76, 0x63, 0x72, 0x1e, 0xf7, 0x66, 0x16, 0x72,
+ 0x9e, 0x63, 0xb6, 0xb0, 0xa7, 0xa8, 0xae, 0xaf,
+ 0x6d, 0xa9, 0x68, 0x61, 0x77, 0x63, 0x72, 0x1e,
+ 0xb, 0x15, 0xbc, 0x7b, 0xdc, 0x72, 0x3b, 0x1a,
+ 0x5b, 0x6a, 0x7a, 0x6b, 0x76, 0x7c, 0x9b, 0x9a,
+ 0x7a, 0x1e, 0x99, 0x7b, 0x78, 0x99, 0x71, 0x1b,
+ 0x76, 0x85, 0x78, 0x7d, 0x77, 0x1a, 0x55, 0xe4,
+ 0x8a, 0x94, 0xf7, 0x9, 0xda, 0xd4, 0xdf, 0xb8,
+ 0xb, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x59, 0x1d,
+ 0xc1, 0x8c, 0x54, 0x6f, 0x1e, 0x4f, 0xa, 0xb,
+ 0x44, 0xa, 0x54, 0x1d, 0xb, 0xc2, 0x93, 0x1e,
+ 0x5b, 0x1d, 0xe1, 0x87, 0x97, 0xb, 0xe4, 0xa2,
+ 0xe7, 0xae, 0x94, 0x1f, 0x60, 0x6, 0xb, 0xe2,
+ 0x1e, 0xfb, 0x45, 0x16, 0xfb, 0x66, 0xf7, 0x29,
+ 0xb, 0x80, 0x7, 0xfb, 0x38, 0x4a, 0x5, 0x76,
+ 0x7, 0x93, 0xa1, 0xa1, 0x92, 0x95, 0x1b, 0xa4,
+ 0x8b, 0x71, 0x7c, 0x1f, 0xb, 0x5f, 0xa, 0x13,
+ 0xd0, 0x3f, 0x1d, 0xe, 0xf7, 0x45, 0x3, 0xf7,
+ 0x68, 0xf7, 0xe4, 0x79, 0x1d, 0xf7, 0x44, 0x66,
+ 0x1d, 0xb, 0x9b, 0x16, 0x33, 0xa, 0xb, 0x5c,
+ 0xaf, 0x64, 0xbb, 0xba, 0xb1, 0xb1, 0xbb, 0xb9,
+ 0x65, 0xb0, 0x5c, 0x5b, 0x67, 0x65, 0x5e, 0x1e,
+ 0xb, 0xb9, 0x88, 0xba, 0x89, 0x49, 0x7e, 0xa,
+ 0xb, 0x59, 0xa, 0x94, 0x81, 0x7b, 0x99, 0x80,
+ 0x1b, 0x85, 0x86, 0x87, 0x7d, 0x6d, 0xe6, 0x25,
+ 0xa6, 0x62, 0x1f, 0xb, 0xf7, 0x38, 0xf7, 0xae,
+ 0x15, 0xf7, 0x1e, 0xad, 0xa1, 0xb0, 0xdb, 0xb,
+ 0x56, 0x1d, 0xf7, 0x4, 0xb, 0xfb, 0x7c, 0x7,
+ 0x66, 0x7d, 0x7a, 0x6a, 0x88, 0x6a, 0xa, 0x5a,
+ 0xb, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0x6b, 0xab,
+ 0xb, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7,
+ 0x19, 0x76, 0xc5, 0x76, 0xf7, 0x16, 0xad, 0xb,
+ 0x15, 0xe7, 0x6, 0xf7, 0xf, 0xf7, 0x44, 0x5,
+ 0xb, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x1f, 0xb,
+ 0x8a, 0x1d, 0xf7, 0x36, 0xb2, 0xb, 0xfb, 0x5a,
+ 0xfb, 0x5a, 0xfb, 0x2a, 0xfb, 0x31, 0xfb, 0x5b,
+ 0x1e, 0xd2, 0x16, 0xf7, 0x39, 0xf7, 0xc, 0xf7,
+ 0x1f, 0xf7, 0x31, 0xf7, 0x31, 0xf7, 0xb, 0xb,
+ 0x96, 0x75, 0x5, 0x43, 0x1d, 0x6e, 0x57, 0x4c,
+ 0xb9, 0x7a, 0xa7, 0x1e, 0xb, 0x5b, 0xa, 0xa8,
+ 0x4d, 0xd4, 0xb9, 0xaf, 0xa9, 0xbf, 0xca, 0x5d,
+ 0x9b, 0x6f, 0x1e, 0xb, 0x1a, 0xf7, 0x34, 0x7,
+ 0x6a, 0xad, 0xa7, 0x70, 0xc3, 0x1b, 0xf1, 0xe5,
+ 0xdc, 0xf7, 0x39, 0xf7, 0x36, 0x28, 0xd9, 0x37,
+ 0x3b, 0x6d, 0x5e, 0x6a, 0xb, 0x1e, 0xf7, 0x5f,
+ 0xf7, 0x38, 0x5, 0x8f, 0x7, 0xfb, 0x62, 0xf7,
+ 0x3a, 0x5, 0xb, 0x1, 0x5c, 0x1d, 0x3, 0xb,
+ 0x80, 0xa1, 0x5, 0x56, 0x6d, 0xfb, 0x5, 0x4a,
+ 0xfb, 0x12, 0x1a, 0x57, 0xb, 0xfb, 0x96, 0x4e,
+ 0x1d, 0xb, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0x61,
+ 0x77, 0xb, 0xf7, 0x66, 0xf7, 0x6e, 0xfb, 0x35,
+ 0xb, 0x43, 0x1d, 0x6d, 0x57, 0x4c, 0xb9, 0x7b,
+ 0xa7, 0x1e, 0xb, 0x4e, 0xa, 0xf1, 0xf7, 0x4,
+ 0x25, 0x7e, 0x1d, 0xa8, 0x67, 0x67, 0xb, 0x8f,
+ 0x9e, 0x8e, 0x19, 0x5b, 0x1d, 0xba, 0x88, 0xb,
+ 0x1, 0xed, 0xf7, 0x33, 0xf7, 0xd6, 0xb7, 0x3,
+ 0xb, 0xfb, 0x2e, 0xfb, 0x13, 0x83, 0xb, 0x7d,
+ 0xaa, 0xf8, 0x3d, 0xaa, 0xb, 0x7, 0xf7, 0x53,
+ 0xf7, 0xc1, 0x9f, 0xab, 0xa8, 0x62, 0xa, 0xb,
+ 0x5d, 0x62, 0xb3, 0x5c, 0x1b, 0x72, 0x71, 0x74,
+ 0x70, 0x70, 0xa5, 0x74, 0xa4, 0x1f, 0xba, 0xb4,
+ 0xb3, 0xb9, 0x1b, 0xb, 0x77, 0x75, 0x84, 0xa6,
+ 0xc3, 0xdc, 0xc4, 0xa7, 0x9e, 0x1f, 0xb, 0x15,
+ 0xc5, 0x6, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53,
+ 0x6, 0xb, 0x1e, 0x69, 0xf7, 0x7f, 0xad, 0x7,
+ 0xb, 0xd6, 0x78, 0xbc, 0xf8, 0xf7, 0xae, 0xb,
+ 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+ 0x1e, 0xb, 0x67, 0xa7, 0x81, 0x1d, 0x6f, 0x6e,
+ 0x67, 0x1e, 0xb, 0xb4, 0x6, 0x9c, 0xd3, 0xa6,
+ 0xf7, 0xc, 0xa2, 0x1a, 0xb6, 0x72, 0xa8, 0x63,
+ 0x63, 0x73, 0x6e, 0x60, 0xb, 0xf7, 0x19, 0xf7,
+ 0x1f, 0x2d, 0xb, 0xf7, 0x1f, 0xf7, 0x1c, 0xe4,
+ 0xb, 0x89, 0x1d, 0x4a, 0x89, 0xa, 0x8c, 0x6b,
+ 0x1d, 0xb, 0x77, 0x1, 0xf3, 0xf7, 0x36, 0xf7,
+ 0x2c, 0xaf, 0x3, 0xb, 0x8, 0xa6, 0x8c, 0x15,
+ 0xf7, 0x19, 0xf7, 0x3e, 0x5, 0x8d, 0xfb, 0x40,
+ 0xfb, 0x1b, 0x6, 0xb, 0x6e, 0xaf, 0xaf, 0xb,
+ 0x90, 0x98, 0x77, 0x1d, 0xe3, 0xf6, 0xa8, 0x1a,
+ 0xb, 0xf7, 0x7c, 0x7, 0xf7, 0x2, 0x3c, 0xb3,
+ 0x54, 0xb, 0xf7, 0x4c, 0x47, 0xcf, 0xb, 0xfb,
+ 0x26, 0x34, 0x85, 0xb, 0x66, 0x15, 0xf7, 0x90,
+ 0x6, 0xc1, 0x88, 0x7e, 0xf7, 0x42, 0xfb, 0x42,
+ 0x1b, 0xb, 0x1f, 0x52, 0x5f, 0xc4, 0xfb, 0xd7,
+ 0x6, 0x57, 0x76, 0x88, 0x67, 0x86, 0x1e, 0xb,
+ 0x83, 0xa, 0xda, 0x77, 0xa, 0x13, 0xe0, 0xb,
+ 0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x54, 0xc2, 0xf8,
+ 0xa, 0x76, 0xa0, 0xc4, 0xb, 0xf8, 0x52, 0x76,
+ 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12, 0xbc, 0xf7,
+ 0x45, 0xb, 0x1a, 0xfc, 0x64, 0x7, 0xb, 0x6d,
+ 0x7d, 0x74, 0xb, 0x66, 0x15, 0xf7, 0x95, 0x6,
+ 0xc1, 0x76, 0xf7, 0x42, 0xfb, 0x42, 0xb, 0xf7,
+ 0x6a, 0xf2, 0x15, 0xf7, 0x87, 0x7, 0x99, 0xb2,
+ 0xc3, 0xb8, 0xb, 0xc4, 0x76, 0xf8, 0xf, 0x77,
+ 0xb, 0x76, 0xf7, 0xe3, 0x77, 0x12, 0xb, 0xfb,
+ 0x83, 0x33, 0x4b, 0xfb, 0x4, 0x5b, 0x82, 0x9b,
+ 0xb3, 0xb, 0xf7, 0x6d, 0x63, 0x7, 0x78, 0x86,
+ 0x86, 0x7c, 0x74, 0x1b, 0xb, 0x5c, 0xaf, 0x65,
+ 0xbb, 0xba, 0xb1, 0xb0, 0xbb, 0xb9, 0x65, 0xb,
+ 0x3, 0xa0, 0x16, 0xf8, 0x13, 0x6, 0x9b, 0xf7,
+ 0x34, 0x5, 0xb, 0x15, 0xf7, 0x62, 0xfb, 0x3a,
+ 0x5, 0xb, 0x7, 0xc4, 0x9e, 0x99, 0xb, 0xf7,
+ 0x1f, 0x3, 0xb, 0x84, 0x1e, 0xe, 0x9f, 0x8b,
+ 0xae, 0xf8, 0x47, 0x77, 0xf7, 0x53, 0xae, 0xb,
+ 0xfb, 0x52, 0x69, 0x7, 0xbc, 0x8d, 0x5c, 0x80,
+ 0x1f, 0xb, 0x77, 0x12, 0xb7, 0xf7, 0x1, 0xf7,
+ 0x85, 0xf7, 0xb, 0xb, 0x74, 0x93, 0x95, 0x78,
+ 0x1f, 0x99, 0x6f, 0x76, 0x9c, 0xb, 0xfb, 0xce,
+ 0xf8, 0xb9, 0x98, 0x1d, 0xb, 0xf7, 0x74, 0x15,
+ 0x6d, 0x65, 0x33, 0x20, 0x6e, 0x1a, 0xb, 0x7,
+ 0x62, 0x81, 0x81, 0x5d, 0x8b, 0xa, 0xf7, 0x3d,
+ 0x1, 0xb4, 0xf7, 0x3d, 0x3, 0xb4, 0xb, 0xf9,
+ 0xd, 0x15, 0x4f, 0xbc, 0x5d, 0xc5, 0x1e, 0xb,
+ 0x3e, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa,
+ 0xb, 0xfb, 0x55, 0xfb, 0x35, 0xfb, 0x17, 0xfb,
+ 0x6e, 0xb, 0xf7, 0x6, 0xd1, 0xf7, 0x6, 0xb,
+ 0x12, 0xa4, 0xf7, 0x1f, 0xb, 0xf7, 0x83, 0xad,
+ 0x6, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
new file mode 100644
index 0000000000..63f86960eb
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
@@ -0,0 +1,2600 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldItalicFontData [20733] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x0, 0x1, 0x1, 0x1, 0x29, 0xf8, 0x10, 0x0,
+ 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e,
+ 0x3, 0xf8, 0x14, 0x4, 0x7d, 0xc, 0x2, 0xfb,
+ 0x5c, 0xfb, 0x8e, 0xfa, 0x6e, 0xf9, 0xf9, 0x5,
+ 0x1c, 0x6, 0xf6, 0xf, 0x1c, 0x8, 0x4d, 0x11,
+ 0xb7, 0x1c, 0x4a, 0x64, 0x12, 0x0, 0x4, 0x1,
+ 0x1, 0x5, 0x2f, 0x4a, 0x59, 0x45, 0x75, 0x72,
+ 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d,
+ 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f,
+ 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x71, 0x2,
+ 0x0, 0x1, 0x0, 0xf, 0x0, 0x18, 0x0, 0x1d,
+ 0x0, 0x30, 0x0, 0x43, 0x0, 0x50, 0x0, 0x5a,
+ 0x0, 0x61, 0x0, 0x6d, 0x0, 0x84, 0x0, 0x87,
+ 0x0, 0xc2, 0x0, 0xe0, 0x0, 0xe3, 0x0, 0xf7,
+ 0x1, 0xa, 0x1, 0x17, 0x1, 0x1f, 0x1, 0x32,
+ 0x1, 0x39, 0x1, 0x4a, 0x1, 0x6f, 0x1, 0x76,
+ 0x1, 0x89, 0x1, 0xab, 0x1, 0xb8, 0x1, 0xed,
+ 0x1, 0xf4, 0x1, 0xfe, 0x2, 0xe, 0x2, 0x1e,
+ 0x2, 0x26, 0x2, 0x35, 0x2, 0x47, 0x2, 0x59,
+ 0x2, 0x5f, 0x2, 0x6c, 0x2, 0x75, 0x2, 0x7e,
+ 0x2, 0x8d, 0x2, 0x96, 0x2, 0xa4, 0x2, 0xb2,
+ 0x2, 0xbd, 0x2, 0xca, 0x2, 0xd3, 0x2, 0xdb,
+ 0x2, 0xfb, 0x3, 0x5, 0x3, 0xb, 0x3, 0x12,
+ 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, 0x44,
+ 0x3, 0x4b, 0x3, 0x52, 0x3, 0x6c, 0x3, 0x7a,
+ 0x3, 0x80, 0x3, 0x84, 0x3, 0x8b, 0x3, 0xa1,
+ 0x3, 0xa4, 0x3, 0xad, 0x3, 0xb9, 0x3, 0xbf,
+ 0x3, 0xd3, 0x3, 0xe7, 0x3, 0xee, 0x3, 0xf3,
+ 0x4, 0x5, 0x4, 0xd, 0x4, 0x12, 0x4, 0x23,
+ 0x4, 0x30, 0x4, 0x34, 0x4, 0x39, 0x4, 0x49,
+ 0x4, 0x59, 0x4, 0x68, 0x4, 0x71, 0x4, 0x78,
+ 0x4, 0x7e, 0x4, 0x83, 0x4, 0x88, 0x4, 0x96,
+ 0x4, 0xa3, 0x4, 0xaa, 0x4, 0xb7, 0x4, 0xbf,
+ 0x4, 0xc4, 0x4, 0xd0, 0x4, 0xd6, 0x4, 0xd9,
+ 0x4, 0xdf, 0x4, 0xea, 0x4, 0xf5, 0x4, 0xfd,
+ 0x5, 0x2, 0x5, 0xc, 0x5, 0x16, 0x5, 0x20,
+ 0x5, 0x2a, 0x5, 0x2e, 0x5, 0x37, 0x5, 0x40,
+ 0x5, 0x49, 0x5, 0x4d, 0x5, 0x53, 0x5, 0x57,
+ 0x5, 0x5d, 0x5, 0x62, 0x66, 0xa9, 0x6d, 0xb0,
+ 0xb0, 0xa9, 0xa9, 0x36, 0x1d, 0x6d, 0x6d, 0x66,
+ 0x1e, 0xb, 0xe2, 0x5, 0xa2, 0x98, 0x9b, 0x96,
+ 0x25, 0x1d, 0xb, 0x15, 0xbc, 0x21, 0xa, 0xb,
+ 0x5c, 0x79, 0x9c, 0xa2, 0x90, 0x8d, 0x91, 0x8e,
+ 0x90, 0x3f, 0xa, 0x5c, 0x69, 0x85, 0x5e, 0x88,
+ 0x2c, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+ 0x23, 0x1d, 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7,
+ 0x28, 0xf7, 0x87, 0x74, 0x1d, 0xe, 0xa2, 0x1a,
+ 0xab, 0x6f, 0x9a, 0x76, 0x75, 0x76, 0x74, 0x70,
+ 0x71, 0x1e, 0xb, 0xf7, 0x27, 0x5, 0x98, 0x80,
+ 0x79, 0xa0, 0x30, 0x1d, 0xb, 0x7b, 0xa, 0xfb,
+ 0x3, 0x26, 0x1d, 0xb, 0x44, 0xa, 0xfb, 0x3,
+ 0x8e, 0x7a, 0x4a, 0x6f, 0xa, 0x27, 0xa, 0xb,
+ 0x15, 0xc9, 0x8b, 0x60, 0x6b, 0x1f, 0x5d, 0x2e,
+ 0xfb, 0xa5, 0x38, 0xa, 0xcd, 0xf7, 0x78, 0xb3,
+ 0xf7, 0x1f, 0x97, 0x84, 0x55, 0xa, 0xb, 0x27,
+ 0x1d, 0xe, 0x15, 0x43, 0xb2, 0x51, 0xd7, 0xf7,
+ 0x6, 0xd9, 0xf7, 0xf, 0xf3, 0xd6, 0x63, 0xc3,
+ 0x3d, 0xfb, 0x0, 0x3a, 0xfb, 0xe, 0x21, 0x1e,
+ 0xf7, 0x9, 0xe3, 0x15, 0xac, 0x95, 0xa0, 0xdc,
+ 0xb6, 0x1b, 0xa4, 0x92, 0x74, 0x76, 0x6b, 0x6f,
+ 0x32, 0x81, 0x69, 0x1f, 0x6c, 0x82, 0x79, 0x3f,
+ 0x61, 0x1b, 0x75, 0x81, 0x9e, 0x9e, 0xac, 0xa2,
+ 0xe2, 0x95, 0xad, 0x1f, 0xb, 0xf7, 0xb2, 0xf7,
+ 0x2f, 0x15, 0x8d, 0x8a, 0x5, 0x81, 0x6d, 0x7f,
+ 0x69, 0x60, 0x1a, 0x53, 0xbf, 0x8b, 0x9a, 0xdf,
+ 0xc3, 0xea, 0xad, 0x9e, 0x1e, 0x76, 0x98, 0x5,
+ 0x7f, 0x8d, 0xb, 0x2b, 0xa, 0xe, 0x83, 0x6e,
+ 0x86, 0x79, 0x7b, 0x1a, 0x57, 0xbb, 0x7d, 0x9e,
+ 0xc8, 0xc4, 0xd5, 0xbf, 0xac, 0x1e, 0x76, 0x9a,
+ 0x5, 0xb, 0xfb, 0x5a, 0xfb, 0x27, 0x6a, 0x95,
+ 0x2a, 0xee, 0xde, 0xbe, 0xde, 0xb7, 0xa5, 0x1f,
+ 0xfb, 0x26, 0x8c, 0x15, 0xb, 0x70, 0x1b, 0x70,
+ 0x79, 0x73, 0x76, 0x76, 0xa0, 0x7a, 0x98, 0x82,
+ 0x1f, 0xb, 0x40, 0x1d, 0x83, 0x96, 0x89, 0x43,
+ 0xa, 0xb, 0xab, 0xc8, 0xf7, 0x67, 0xb2, 0xf7,
+ 0x23, 0x1f, 0x47, 0x7b, 0x2d, 0x82, 0x63, 0x88,
+ 0x8, 0x70, 0x7, 0xa8, 0xb, 0x65, 0x1d, 0xf7,
+ 0x71, 0x25, 0xa, 0xb, 0x74, 0x3d, 0xfb, 0x8e,
+ 0x5f, 0x1a, 0x73, 0x96, 0x60, 0xc5, 0xd5, 0xb5,
+ 0xc5, 0xd9, 0xbe, 0x1e, 0xb, 0xf7, 0x85, 0xf7,
+ 0x5, 0x15, 0x70, 0xf7, 0x2f, 0x6b, 0xf7, 0x27,
+ 0x78, 0xba, 0x66, 0x81, 0x55, 0x82, 0x51, 0x86,
+ 0x8, 0x70, 0x7, 0xb2, 0x95, 0x8b, 0xfb, 0x2c,
+ 0xad, 0x1f, 0x93, 0x67, 0xb0, 0xfb, 0x48, 0x5a,
+ 0x1a, 0xb, 0xb0, 0xb0, 0x6d, 0xa9, 0x66, 0x66,
+ 0xb, 0xf8, 0xbe, 0x6, 0xc6, 0xf7, 0x56, 0x72,
+ 0x90, 0x5, 0xfb, 0x12, 0x46, 0xfb, 0x4, 0x62,
+ 0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x63, 0x7e, 0x66,
+ 0x79, 0x70, 0xa1, 0x6a, 0xb0, 0xee, 0xe3, 0xeb,
+ 0xf7, 0x3d, 0xf1, 0x1f, 0x94, 0x9a, 0xf7, 0x15,
+ 0xf7, 0x64, 0xf7, 0x9, 0x1a, 0xac, 0x6d, 0xa8,
+ 0x6a, 0x6b, 0x73, 0x6c, 0x72, 0xb, 0x83, 0xba,
+ 0x2b, 0xf8, 0xe4, 0x18, 0x72, 0x6, 0xfc, 0x8,
+ 0xfc, 0xe4, 0xb, 0xf7, 0x3f, 0xf7, 0x2d, 0x15,
+ 0xe7, 0xe2, 0xf8, 0x28, 0xf7, 0x4c, 0xf3, 0x8c,
+ 0x20, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x19, 0xfb,
+ 0x46, 0x50, 0x5e, 0xb0, 0x55, 0x1d, 0xd2, 0xfb,
+ 0x17, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0x9b, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd1,
+ 0x5d, 0x1d, 0xfb, 0x78, 0xfb, 0x89, 0x1e, 0xb,
+ 0x5, 0xbe, 0x6, 0x35, 0x4e, 0xa, 0xb, 0x6c,
+ 0x1d, 0x53, 0x55, 0x73, 0x1b, 0x85, 0x32, 0xa,
+ 0xb, 0x1b, 0xe2, 0xa1, 0xdf, 0xae, 0x94, 0x1f,
+ 0x62, 0x6, 0x78, 0x82, 0x81, 0x74, 0x69, 0x1b,
+ 0xb, 0x1f, 0xdd, 0xf7, 0xb6, 0x9c, 0xcb, 0xa5,
+ 0x90, 0xbe, 0x8e, 0x19, 0xae, 0xfb, 0xcb, 0x7,
+ 0xb, 0x1b, 0x85, 0x88, 0x90, 0x94, 0x28, 0x1d,
+ 0xb, 0x3c, 0x41, 0x1f, 0xa6, 0x86, 0xb6, 0xf7,
+ 0x52, 0x5, 0xfc, 0xb0, 0x68, 0x6, 0xc9, 0xb,
+ 0x71, 0x9e, 0x61, 0xba, 0xb2, 0xa9, 0xa9, 0xaf,
+ 0xb0, 0x6c, 0xaa, 0x65, 0x5e, 0x76, 0x61, 0x73,
+ 0x1e, 0xb, 0x65, 0xa8, 0x6e, 0xb1, 0xb1, 0xa9,
+ 0xa8, 0xb1, 0xb1, 0x6d, 0xa9, 0x65, 0x65, 0x6e,
+ 0x6d, 0x65, 0x1e, 0xb, 0x15, 0x62, 0xa9, 0x45,
+ 0x1d, 0xb, 0xe9, 0xf7, 0xc8, 0x7d, 0x8a, 0x21,
+ 0x74, 0x32, 0x87, 0x6d, 0xa, 0xad, 0xb, 0x6a,
+ 0xb7, 0xb4, 0xac, 0xab, 0xb5, 0xb4, 0x6a, 0xb,
+ 0x15, 0x42, 0x1d, 0xf7, 0x68, 0x16, 0x42, 0x1d,
+ 0xe, 0x89, 0x7f, 0x1f, 0xfb, 0x14, 0xfc, 0x5e,
+ 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xb,
+ 0x1f, 0xd0, 0xf7, 0x9, 0x5, 0xf7, 0x6b, 0x6,
+ 0xb, 0xf7, 0x77, 0x70, 0xa, 0x8e, 0x88, 0x90,
+ 0x9d, 0xb6, 0xb4, 0x9b, 0x4a, 0xa, 0xb, 0x1f,
+ 0x51, 0xfb, 0x65, 0x5, 0x21, 0x6e, 0x64, 0xfb,
+ 0x1e, 0xfb, 0x23, 0x1b, 0xb, 0x65, 0xfb, 0x32,
+ 0xfb, 0x15, 0xfb, 0x3c, 0xfb, 0x2e, 0x1e, 0xb,
+ 0x15, 0xdd, 0x6, 0xf7, 0x36, 0xf7, 0x42, 0x5,
+ 0x53, 0x6, 0xfb, 0x1b, 0xb, 0x1, 0xf7, 0x6c,
+ 0xf7, 0x21, 0x15, 0x72, 0x88, 0xb, 0x88, 0xf7,
+ 0xb, 0xf7, 0x62, 0xf7, 0xb, 0xb, 0x2a, 0x7d,
+ 0x71, 0x92, 0xab, 0x1f, 0x7f, 0x57, 0x15, 0x7b,
+ 0xaa, 0x98, 0x85, 0xa4, 0x1b, 0xf7, 0x22, 0xf7,
+ 0x1a, 0xf7, 0x56, 0xf7, 0x2f, 0xe7, 0x58, 0xad,
+ 0x4f, 0x60, 0x54, 0x70, 0x3c, 0xb, 0xf7, 0x21,
+ 0xf7, 0x4a, 0x15, 0xf7, 0x55, 0xa9, 0xcb, 0xb,
+ 0x56, 0xa, 0xf8, 0x47, 0x77, 0xb, 0x1, 0x4e,
+ 0x1d, 0x3, 0xf7, 0x8, 0xb, 0x58, 0x8b, 0xab,
+ 0xf8, 0xee, 0xae, 0x1, 0x75, 0x16, 0xf8, 0xbd,
+ 0x6, 0xc6, 0xf7, 0x56, 0x73, 0x90, 0x5, 0xfb,
+ 0x11, 0x46, 0xfb, 0x4, 0x61, 0xfb, 0xc, 0x1b,
+ 0xb, 0x1b, 0x29, 0x78, 0xfb, 0x8, 0x89, 0x1f,
+ 0xe, 0xef, 0x1e, 0xfb, 0x24, 0xc4, 0x15, 0x2a,
+ 0xb, 0xb1, 0x90, 0x19, 0x61, 0xa, 0xb, 0x19,
+ 0xae, 0xfb, 0x64, 0x68, 0x7, 0xb, 0x7e, 0xd2,
+ 0x58, 0x76, 0xf8, 0x46, 0xb, 0x1, 0xf7, 0xd5,
+ 0xf7, 0x11, 0x3, 0xf7, 0x5, 0xc8, 0x15, 0xa4,
+ 0xbd, 0xf7, 0x42, 0xa2, 0xbb, 0x1e, 0xb1, 0x9d,
+ 0xb1, 0xb8, 0xb2, 0x1b, 0xa1, 0x9d, 0xb, 0x77,
+ 0x1, 0xf7, 0x77, 0xf9, 0x67, 0x5b, 0xa, 0xea,
+ 0xe3, 0x2c, 0x3b, 0x1d, 0xb, 0x58, 0x1d, 0xb0,
+ 0x90, 0x77, 0xb, 0x77, 0x52, 0x1d, 0xb, 0xfb,
+ 0x1, 0xfb, 0x6f, 0xfb, 0x5f, 0xb, 0x15, 0xf7,
+ 0x82, 0x6, 0xbe, 0xf7, 0x6, 0x5, 0x7b, 0x6,
+ 0x69, 0x75, 0x7b, 0x80, 0x57, 0x1b, 0x34, 0x8d,
+ 0x6, 0xf7, 0xf, 0xb, 0x26, 0x1d, 0xe, 0x4c,
+ 0x1d, 0x26, 0x30, 0xf0, 0x5, 0x59, 0x6, 0xe,
+ 0x15, 0xc5, 0x6, 0xf8, 0x47, 0xf9, 0x48, 0x5,
+ 0x8d, 0x51, 0x7, 0xb, 0xf7, 0x19, 0x1a, 0xdb,
+ 0x50, 0xb, 0xce, 0xaa, 0x97, 0xad, 0xa4, 0x1a,
+ 0xc3, 0x54, 0xa5, 0x61, 0x47, 0x62, 0x62, 0x64,
+ 0x71, 0x1e, 0x99, 0x7e, 0x5, 0xb, 0x1f, 0x3b,
+ 0xfb, 0xb3, 0xfb, 0x6b, 0xf8, 0x65, 0x5, 0xfb,
+ 0x57, 0x68, 0x6, 0xc0, 0x86, 0x96, 0x8f, 0x9e,
+ 0x5f, 0xb, 0xc7, 0x79, 0xad, 0xf9, 0xd, 0xad,
+ 0xb, 0xfc, 0x14, 0x97, 0x76, 0xb, 0x1f, 0xb1,
+ 0x70, 0x7e, 0x94, 0x79, 0x1b, 0x73, 0x7e, 0x79,
+ 0x70, 0x84, 0x90, 0x64, 0xdd, 0xf0, 0xe4, 0xb,
+ 0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0xe, 0xac, 0xb,
+ 0xf8, 0x1a, 0x62, 0xa, 0xb, 0x1e, 0xae, 0xfb,
+ 0xaf, 0x68, 0x7, 0xbb, 0x84, 0x92, 0x8a, 0x9d,
+ 0x54, 0xe3, 0xfb, 0x96, 0x18, 0xb, 0x19, 0xf7,
+ 0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87,
+ 0x74, 0x1d, 0xe, 0x77, 0x4d, 0x1d, 0xb, 0xf7,
+ 0x30, 0x35, 0xe1, 0xb, 0xef, 0xf7, 0xde, 0x5e,
+ 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x19, 0x89, 0x76,
+ 0x5, 0xa8, 0xb3, 0xb, 0x15, 0xcb, 0xf7, 0x83,
+ 0x5, 0xa0, 0x8f, 0x91, 0xa2, 0xb2, 0x1b, 0xe0,
+ 0x8b, 0x23, 0x76, 0xb, 0xa7, 0x88, 0x5, 0xa3,
+ 0x94, 0x98, 0xb0, 0xb4, 0x1b, 0xf7, 0x25, 0x6,
+ 0xfb, 0xb8, 0xb, 0x15, 0xc1, 0x54, 0xc4, 0x51,
+ 0xbc, 0x56, 0x8, 0xb, 0xc0, 0x76, 0xf8, 0x13,
+ 0x77, 0x1, 0xb, 0x9b, 0xb5, 0x1b, 0xf7, 0x51,
+ 0xb, 0xb0, 0xfb, 0x87, 0x5, 0xb, 0xf7, 0xbc,
+ 0xae, 0x6, 0xb, 0x4a, 0xc1, 0x8b, 0x9b, 0xd9,
+ 0xba, 0xd8, 0xc1, 0xab, 0x1e, 0x75, 0x98, 0x5,
+ 0xb, 0x7d, 0x4e, 0x83, 0x41, 0x83, 0x6d, 0xa,
+ 0xad, 0x8c, 0xa8, 0x8b, 0x69, 0xb, 0x28, 0x30,
+ 0xee, 0x5, 0x59, 0x6, 0xe, 0xfb, 0x6e, 0xfb,
+ 0x61, 0xf7, 0x7, 0xf7, 0x5f, 0x77, 0xf8, 0x5,
+ 0x77, 0xb, 0x1a, 0xc3, 0xee, 0xbe, 0x9e, 0x95,
+ 0x1e, 0xb, 0xf7, 0x0, 0xa5, 0xa1, 0xb, 0x1a,
+ 0x86, 0x8b, 0x85, 0x89, 0x85, 0x1e, 0xfb, 0x19,
+ 0xfc, 0x65, 0xb, 0x45, 0x1d, 0xac, 0x62, 0x60,
+ 0xb, 0x3b, 0x1d, 0xe, 0xfb, 0xdd, 0xf8, 0xad,
+ 0x76, 0xb, 0x5, 0xb4, 0x96, 0xab, 0x88, 0x9a,
+ 0x1b, 0xf7, 0x35, 0x8c, 0xb, 0x1f, 0xab, 0x85,
+ 0xbe, 0xf7, 0x7e, 0x5, 0x6d, 0x6, 0x7b, 0xb,
+ 0x6d, 0xa, 0xac, 0xa9, 0x8d, 0x68, 0x1f, 0xe,
+ 0xf7, 0xb, 0x40, 0xd6, 0xb, 0x69, 0xa9, 0x79,
+ 0xa6, 0xb1, 0xa4, 0xa6, 0xb8, 0xb7, 0xb, 0x77,
+ 0x12, 0xf1, 0xf7, 0xd, 0xf7, 0x10, 0xf7, 0xd,
+ 0xb, 0xe3, 0x8b, 0xf7, 0x29, 0xfb, 0x22, 0x76,
+ 0xf1, 0xc8, 0xb, 0xfb, 0x61, 0xb0, 0xf7, 0x2f,
+ 0xae, 0xf8, 0x5, 0xd2, 0xb, 0x1b, 0x85, 0x87,
+ 0xb, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a,
+ 0xd3, 0xb, 0x83, 0x93, 0x1b, 0x90, 0x8f, 0x8f,
+ 0x97, 0x1f, 0xb, 0xc7, 0x8b, 0xae, 0x6e, 0x76,
+ 0xf9, 0x1d, 0xae, 0xb, 0x83, 0x1d, 0x12, 0xb,
+ 0x76, 0xf9, 0x53, 0x77, 0x1, 0xb, 0x15, 0x75,
+ 0x1d, 0xb, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xb,
+ 0xa5, 0xaf, 0xa1, 0xa4, 0xb, 0x1, 0x0, 0x1,
+ 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0,
+ 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0,
+ 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66,
+ 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0,
+ 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0,
+ 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1,
+ 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0,
+ 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0,
+ 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85,
+ 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0,
+ 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0,
+ 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae,
+ 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0,
+ 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0,
+ 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2,
+ 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0,
+ 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0,
+ 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd,
+ 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0,
+ 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0,
+ 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb,
+ 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0,
+ 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0,
+ 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf,
+ 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0,
+ 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0,
+ 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda,
+ 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0,
+ 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0,
+ 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91,
+ 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0,
+ 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0,
+ 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4,
+ 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0,
+ 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+ 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+ 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+ 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+ 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+ 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+ 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+ 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6,
+ 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x5e, 0x0,
+ 0x9d, 0x1, 0x14, 0x1, 0xa9, 0x1, 0xe3, 0x2,
+ 0xb8, 0x2, 0xe4, 0x3, 0x17, 0x3, 0x49, 0x4,
+ 0x25, 0x4, 0x51, 0x4, 0x80, 0x4, 0x96, 0x4,
+ 0xa4, 0x4, 0xb9, 0x5, 0x3, 0x5, 0x44, 0x5,
+ 0x9a, 0x6, 0x2, 0x6, 0x47, 0x6, 0x98, 0x7,
+ 0x2, 0x7, 0x2e, 0x7, 0xae, 0x8, 0xe, 0x8,
+ 0x3a, 0x8, 0x8b, 0x8, 0xaf, 0x8, 0xd1, 0x8,
+ 0xf2, 0x9, 0x57, 0xa, 0x11, 0xa, 0x3b, 0xa,
+ 0xc1, 0xb, 0x17, 0xb, 0x57, 0xb, 0x76, 0xb,
+ 0xd9, 0xc, 0x5a, 0xc, 0xda, 0xd, 0x15, 0xd,
+ 0x74, 0xd, 0xed, 0xe, 0x14, 0xe, 0x94, 0xe,
+ 0xd1, 0xf, 0x14, 0xf, 0x6c, 0x10, 0x7, 0x10,
+ 0x7e, 0x10, 0xff, 0x11, 0x41, 0x11, 0x8c, 0x11,
+ 0xdb, 0x12, 0x59, 0x12, 0xd5, 0x13, 0x19, 0x13,
+ 0x1f, 0x13, 0x4d, 0x13, 0x64, 0x13, 0x95, 0x13,
+ 0xb6, 0x13, 0xc2, 0x13, 0xe4, 0x14, 0x1c, 0x14,
+ 0x6d, 0x14, 0xbc, 0x15, 0x38, 0x15, 0x70, 0x15,
+ 0xee, 0x16, 0x9b, 0x16, 0xff, 0x17, 0x1e, 0x17,
+ 0x72, 0x17, 0xd0, 0x18, 0x0, 0x18, 0xa0, 0x18,
+ 0xd3, 0x19, 0x10, 0x19, 0x45, 0x19, 0xb2, 0x19,
+ 0xfd, 0x1a, 0x64, 0x1a, 0xab, 0x1a, 0xd9, 0x1b,
+ 0x2d, 0x1b, 0xa5, 0x1c, 0x31, 0x1c, 0x53, 0x1c,
+ 0x97, 0x1c, 0xf5, 0x1d, 0x10, 0x1d, 0x6a, 0x1d,
+ 0xb5, 0x1e, 0x3, 0x1e, 0x79, 0x1f, 0x31, 0x1f,
+ 0xa7, 0x20, 0x30, 0x20, 0x5f, 0x21, 0x28, 0x21,
+ 0x42, 0x21, 0xdf, 0x22, 0x4d, 0x22, 0x81, 0x22,
+ 0xa0, 0x23, 0x55, 0x23, 0x69, 0x23, 0x9c, 0x23,
+ 0xdb, 0x23, 0xff, 0x24, 0x32, 0x24, 0x44, 0x24,
+ 0xc7, 0x25, 0x10, 0x25, 0x20, 0x25, 0x57, 0x25,
+ 0x90, 0x25, 0xca, 0x25, 0xf4, 0x26, 0x2e, 0x26,
+ 0x79, 0x26, 0xd3, 0x27, 0x34, 0x27, 0x51, 0x27,
+ 0x63, 0x27, 0x6f, 0x27, 0xcc, 0x27, 0xf5, 0x28,
+ 0x20, 0x28, 0xc6, 0x29, 0x5d, 0x29, 0x9b, 0x29,
+ 0xdf, 0x2a, 0x7, 0x2a, 0x36, 0x2a, 0x58, 0x2a,
+ 0x87, 0x2a, 0xab, 0x2a, 0xd1, 0x2b, 0x29, 0x2b,
+ 0x84, 0x2b, 0x8c, 0x2b, 0x94, 0x2b, 0xa5, 0x2b,
+ 0xd2, 0x2b, 0xf5, 0x2c, 0x25, 0x2c, 0xa4, 0x2c,
+ 0xcc, 0x2c, 0xf7, 0x2d, 0x24, 0x2d, 0x59, 0x2d,
+ 0x9f, 0x2e, 0x13, 0x2e, 0xb5, 0x2e, 0xde, 0x2e,
+ 0xf5, 0x2f, 0xb, 0x2f, 0x45, 0x2f, 0x67, 0x2f,
+ 0xd1, 0x30, 0x8a, 0x31, 0xe, 0x31, 0x1b, 0x31,
+ 0x24, 0x31, 0x3c, 0x31, 0x5f, 0x31, 0x6e, 0x31,
+ 0x82, 0x31, 0xa2, 0x31, 0xcb, 0x32, 0x31, 0x32,
+ 0x85, 0x32, 0x94, 0x32, 0xba, 0x32, 0xc7, 0x32,
+ 0xf4, 0x33, 0x15, 0x33, 0x47, 0x33, 0xbe, 0x33,
+ 0xdc, 0x33, 0xf0, 0x34, 0x6, 0x34, 0x22, 0x34,
+ 0x4d, 0x34, 0x7f, 0x34, 0xbb, 0x34, 0xc2, 0x35,
+ 0x4, 0x35, 0x50, 0x36, 0x3, 0x36, 0x9a, 0x37,
+ 0x2f, 0x37, 0x9c, 0x38, 0xb, 0x38, 0x19, 0x38,
+ 0x65, 0x38, 0xee, 0x38, 0xfe, 0x39, 0xa, 0x39,
+ 0x35, 0x39, 0x49, 0x39, 0x70, 0x39, 0xa3, 0x39,
+ 0xf1, 0x3a, 0x9, 0x3a, 0x1a, 0x3a, 0x2c, 0x3a,
+ 0x59, 0x3a, 0x7f, 0x3a, 0xa9, 0x3a, 0xe2, 0x3b,
+ 0x1b, 0x3b, 0x5b, 0x3b, 0xfb, 0x3c, 0xdb, 0x3c,
+ 0xfc, 0x3d, 0x34, 0x3d, 0x67, 0x3d, 0x7c, 0x3d,
+ 0x90, 0x3d, 0xaa, 0x3e, 0x30, 0x3e, 0xd6, 0x3e,
+ 0xe8, 0x3f, 0x9b, 0x40, 0x47, 0xfc, 0x30, 0xe,
+ 0xfc, 0x30, 0xe, 0xfb, 0xa5, 0x72, 0xf7, 0x24,
+ 0xfb, 0x18, 0xf7, 0x24, 0xf8, 0xb0, 0x77, 0xac,
+ 0x77, 0x12, 0xce, 0xf7, 0x28, 0x13, 0xa8, 0xf7,
+ 0x3b, 0xf7, 0x68, 0x15, 0xa8, 0x83, 0xd2, 0xf7,
+ 0x39, 0xd8, 0xf7, 0x2f, 0x97, 0xa9, 0x19, 0x93,
+ 0xa0, 0x91, 0xa0, 0x9d, 0x1a, 0x13, 0x98, 0xb4,
+ 0x71, 0xa8, 0x6b, 0x50, 0x6b, 0x38, 0x61, 0x85,
+ 0x1e, 0x7a, 0xfb, 0x7, 0x80, 0xfb, 0x15, 0x77,
+ 0x24, 0x8, 0x27, 0xfb, 0x2f, 0x15, 0x13, 0x68,
+ 0x64, 0xa8, 0x6c, 0xb7, 0xb8, 0xa9, 0xad, 0xaf,
+ 0xb1, 0x6a, 0xaf, 0x60, 0x6a, 0x64, 0x70, 0x5c,
+ 0x1e, 0xe, 0x20, 0xf8, 0x37, 0x76, 0xf7, 0xb3,
+ 0x77, 0x1, 0xf7, 0x1c, 0xf8, 0x22, 0x15, 0xb3,
+ 0x6, 0xde, 0xf7, 0x4e, 0x5, 0x91, 0x99, 0x90,
+ 0x9f, 0x9e, 0x1a, 0xa4, 0x7e, 0xa2, 0x66, 0x65,
+ 0x70, 0x68, 0x65, 0x88, 0x1e, 0xf7, 0x90, 0xfb,
+ 0x6a, 0x15, 0xb1, 0x6, 0xe0, 0xf7, 0x4e, 0x5,
+ 0x91, 0x98, 0x8e, 0x9d, 0x9c, 0x1a, 0xa6, 0x7b,
+ 0xa5, 0x6b, 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e,
+ 0xe, 0xa0, 0x76, 0xf7, 0x66, 0xca, 0x4c, 0xd4,
+ 0xf7, 0x1a, 0xd4, 0x4c, 0xca, 0xf7, 0x66, 0x77,
+ 0x12, 0x13, 0xb4, 0x75, 0x16, 0xe0, 0xf7, 0x66,
+ 0x5, 0x2b, 0x6, 0x9f, 0xca, 0x5, 0xf1, 0x6,
+ 0xcb, 0xf7, 0x2e, 0x5, 0x25, 0x6, 0x9f, 0xca,
+ 0x5, 0xf7, 0x3, 0x6, 0xdc, 0xf7, 0x66, 0x5,
+ 0xd0, 0x6, 0x3b, 0xfb, 0x66, 0x5, 0xf7, 0x14,
+ 0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd1, 0x6, 0x3b,
+ 0xfb, 0x66, 0x5, 0xdd, 0x6, 0x77, 0x4c, 0x5,
+ 0x30, 0x6, 0x13, 0xcc, 0x4b, 0xfb, 0x2e, 0x5,
+ 0xe6, 0x6, 0x77, 0x4c, 0x5, 0x2a, 0x6, 0x36,
+ 0xfb, 0x66, 0x5, 0x44, 0x6, 0xe0, 0xf7, 0x66,
+ 0x5, 0xfb, 0x14, 0x6, 0x36, 0xfb, 0x66, 0x5,
+ 0xf7, 0x3, 0xf7, 0xa5, 0x15, 0xf7, 0x14, 0x6,
+ 0xcb, 0xf7, 0x2e, 0x5, 0xfb, 0x14, 0x6, 0xe,
+ 0x3c, 0x76, 0xf0, 0xaa, 0xf8, 0xf1, 0xac, 0xca,
+ 0x77, 0x1, 0xda, 0xee, 0xf7, 0x25, 0xf7, 0x1,
+ 0x3, 0xf7, 0x13, 0x92, 0x15, 0x62, 0x96, 0x62,
+ 0x93, 0x4a, 0xc7, 0xb5, 0xf7, 0x22, 0x18, 0xa1,
+ 0x85, 0x8e, 0x2e, 0x98, 0x57, 0xd8, 0x68, 0x19,
+ 0xd5, 0xf7, 0x99, 0x5, 0x20, 0xd8, 0x72, 0xdd,
+ 0xc7, 0x1a, 0xe7, 0xcf, 0xc3, 0xf7, 0x19, 0x96,
+ 0x94, 0x8a, 0x8a, 0x98, 0x1e, 0x9d, 0xcc, 0x5,
+ 0xbd, 0x6, 0x77, 0x43, 0xb5, 0x86, 0xcc, 0x69,
+ 0xa8, 0x73, 0x19, 0x61, 0xfb, 0x19, 0x76, 0x90,
+ 0x8e, 0xb8, 0x8d, 0xe1, 0x33, 0xa3, 0x19, 0x50,
+ 0xfb, 0x79, 0x5, 0xdb, 0x46, 0xc7, 0x46, 0x32,
+ 0x1a, 0xfb, 0x1, 0x22, 0x50, 0xfb, 0x29, 0x1e,
+ 0x6f, 0x26, 0x5, 0x57, 0x6, 0xf7, 0x2a, 0xf8,
+ 0x9e, 0x15, 0xc2, 0xf7, 0x69, 0x5, 0x8e, 0x84,
+ 0x8d, 0x8a, 0x7c, 0x1b, 0x45, 0x68, 0x48, 0x5b,
+ 0x68, 0x9a, 0x71, 0xc2, 0x64, 0x1f, 0x4d, 0xfc,
+ 0x1a, 0x15, 0xe2, 0xbd, 0xc5, 0xda, 0xc6, 0x68,
+ 0x9c, 0x68, 0xa8, 0x1f, 0xe, 0xf7, 0x3f, 0x7d,
+ 0xa5, 0x85, 0x76, 0xf7, 0xe3, 0xa1, 0xf7, 0xc8,
+ 0xa5, 0x8c, 0x77, 0x12, 0xf7, 0x0, 0xdf, 0xf7,
+ 0x20, 0xdf, 0xc9, 0xdf, 0xf7, 0x20, 0xdf, 0x13,
+ 0xb7, 0x80, 0xf8, 0xe4, 0x7d, 0x3b, 0xa, 0xfc,
+ 0x9, 0xf7, 0xc8, 0x3b, 0xa, 0x13, 0x6f, 0x80,
+ 0xf8, 0xba, 0xf7, 0xdf, 0x15, 0x4f, 0x6, 0xfc,
+ 0xe9, 0xfd, 0x48, 0x5, 0xc7, 0x6, 0xe, 0xf7,
+ 0x8, 0x79, 0xd1, 0x45, 0xdc, 0x4e, 0x76, 0xca,
+ 0xaf, 0xc0, 0xaf, 0xf8, 0x74, 0xac, 0x12, 0xa5,
+ 0xf7, 0x19, 0xd6, 0xf7, 0xd, 0xf7, 0xe, 0xdb,
+ 0x75, 0xa1, 0x13, 0x3f, 0x80, 0xf8, 0x1a, 0xb7,
+ 0x15, 0x13, 0x4f, 0x80, 0x73, 0xa3, 0xb6, 0x65,
+ 0xd4, 0x1b, 0x13, 0x3f, 0x80, 0xe3, 0xb9, 0xc4,
+ 0xb4, 0xae, 0x1f, 0x71, 0xa0, 0x5, 0x13, 0x4f,
+ 0x40, 0x70, 0x7f, 0x75, 0x80, 0x72, 0x1b, 0x5c,
+ 0x52, 0xac, 0xb0, 0x73, 0x1f, 0xe3, 0xf7, 0xa,
+ 0x8a, 0x81, 0xa3, 0xa6, 0xb4, 0xba, 0x9b, 0x8e,
+ 0xb0, 0x93, 0x8, 0xae, 0xfb, 0x68, 0x68, 0x7,
+ 0xa6, 0x86, 0xa8, 0x89, 0x6a, 0x1a, 0x68, 0x61,
+ 0x61, 0x6b, 0x63, 0x1e, 0x6e, 0xb5, 0x5c, 0xf3,
+ 0x81, 0xdc, 0x8, 0xb8, 0x9e, 0xf7, 0x1d, 0xc0,
+ 0xf0, 0x1a, 0xc2, 0x5d, 0xc5, 0x2e, 0xfb, 0xb,
+ 0x4a, 0x2b, 0xfb, 0x2, 0x6a, 0x91, 0x6b, 0x90,
+ 0x70, 0x1e, 0xfb, 0x5, 0x4d, 0xfb, 0x13, 0x75,
+ 0xfb, 0x24, 0x1a, 0x13, 0x3f, 0x80, 0xfb, 0x30,
+ 0xf7, 0x23, 0x78, 0xb7, 0xb8, 0xd9, 0x92, 0xc3,
+ 0xd6, 0x1e, 0x6f, 0xaf, 0x15, 0x13, 0x8f, 0x80,
+ 0x80, 0x74, 0x6c, 0x7a, 0x60, 0x1b, 0x30, 0x67,
+ 0xdd, 0xc0, 0xe8, 0xc3, 0xac, 0xc6, 0xa9, 0x1f,
+ 0x13, 0x3f, 0x80, 0xab, 0xfb, 0x21, 0xb8, 0x43,
+ 0xab, 0x59, 0x8, 0x8f, 0xf7, 0xf6, 0x15, 0x84,
+ 0xb6, 0x87, 0xa5, 0xa3, 0x1a, 0xc8, 0x92, 0xc8,
+ 0xc3, 0xb4, 0x9d, 0x5b, 0x6b, 0x66, 0x78, 0x59,
+ 0x2f, 0x5b, 0x1e, 0xe, 0xfc, 0x14, 0xf8, 0x37,
+ 0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x21, 0xf7,
+ 0xb, 0x3, 0xf7, 0x3b, 0xf8, 0x22, 0x15, 0xe4,
+ 0xf7, 0x4e, 0x5, 0x92, 0x98, 0x90, 0x9c, 0x9e,
+ 0x1a, 0xa6, 0x7f, 0xa4, 0x64, 0x64, 0x71, 0x69,
+ 0x64, 0x88, 0x1e, 0x76, 0xfb, 0x6a, 0x5, 0xe,
+ 0x84, 0xa, 0xa7, 0xe9, 0x3, 0xf7, 0x3e, 0xfb,
+ 0x47, 0x15, 0xa2, 0x9a, 0x5, 0x70, 0xbb, 0x5f,
+ 0xf7, 0x26, 0xf7, 0x15, 0x1a, 0xf7, 0xd0, 0xf7,
+ 0x26, 0xf7, 0xe, 0xd7, 0xcf, 0x1e, 0x79, 0x9f,
+ 0x5, 0xfb, 0x9f, 0xfb, 0x4c, 0x6c, 0xfb, 0x6a,
+ 0xfb, 0x14, 0x1a, 0xfb, 0x51, 0xf0, 0x2f, 0xb4,
+ 0x52, 0x1e, 0xe, 0x84, 0xa, 0xf7, 0x45, 0xe9,
+ 0x3, 0x5f, 0xfb, 0x33, 0x15, 0xf7, 0x1f, 0xf7,
+ 0x1c, 0xdd, 0xf7, 0x2, 0xf7, 0x65, 0x1a, 0xdf,
+ 0x82, 0xf7, 0x57, 0x4c, 0xea, 0x1e, 0xa2, 0x9a,
+ 0x5, 0xdf, 0x22, 0xc6, 0xfb, 0x19, 0xfb, 0x2b,
+ 0x1a, 0xfb, 0x5e, 0xfb, 0xb, 0xfb, 0x30, 0xfb,
+ 0x47, 0xfb, 0x9, 0x1e, 0xe, 0xf7, 0xa2, 0x76,
+ 0xdf, 0xf7, 0x0, 0xc1, 0xf5, 0xdf, 0x77, 0x1,
+ 0xf7, 0x69, 0xee, 0xe9, 0xbd, 0x3, 0xf7, 0x87,
+ 0xf8, 0x54, 0x15, 0x6e, 0x78, 0x7c, 0x77, 0x7c,
+ 0x7a, 0x8, 0x76, 0x7b, 0x77, 0x65, 0x6b, 0x1b,
+ 0x72, 0x72, 0x9b, 0xaa, 0xbc, 0xaa, 0x92, 0xc7,
+ 0x8e, 0x1f, 0xab, 0x8e, 0xaa, 0x8e, 0x9a, 0x9e,
+ 0x8, 0x94, 0x7, 0x7b, 0x96, 0x63, 0x94, 0x72,
+ 0x8e, 0x8, 0x57, 0x93, 0x66, 0x87, 0xbd, 0x1a,
+ 0xa7, 0x97, 0xa2, 0xb6, 0xa7, 0x98, 0x6f, 0x71,
+ 0xa0, 0x1e, 0xa4, 0x6c, 0xa4, 0x70, 0x98, 0x8a,
+ 0x92, 0x90, 0x18, 0xb4, 0x81, 0xa0, 0x80, 0x9e,
+ 0x1e, 0x80, 0x9e, 0x82, 0x9a, 0xa3, 0x1a, 0xa3,
+ 0x97, 0xa8, 0xb0, 0xa7, 0xa0, 0x75, 0x6c, 0x74,
+ 0x82, 0x7d, 0x80, 0x78, 0x1e, 0x80, 0x78, 0x82,
+ 0x75, 0x60, 0x1a, 0x97, 0x86, 0xaa, 0xa0, 0x99,
+ 0x9f, 0x9b, 0xa2, 0x19, 0xa8, 0x9f, 0x96, 0xa0,
+ 0xac, 0x1b, 0xae, 0x9a, 0x6c, 0x7b, 0x5b, 0x5c,
+ 0x83, 0x5e, 0x88, 0x1f, 0x70, 0x8a, 0x6e, 0x85,
+ 0x76, 0x7b, 0x8, 0x81, 0x7, 0x9c, 0x7f, 0xa1,
+ 0x84, 0xaf, 0x88, 0x8, 0xb7, 0x88, 0xbd, 0x7d,
+ 0x63, 0x1a, 0x5f, 0x5e, 0x86, 0x86, 0x6c, 0x7f,
+ 0xa0, 0xb0, 0x70, 0x1e, 0x78, 0xa4, 0x7f, 0x9d,
+ 0x70, 0x98, 0x83, 0x85, 0x18, 0x68, 0x93, 0x76,
+ 0x93, 0x78, 0x1e, 0x97, 0x70, 0x95, 0x7e, 0x73,
+ 0x1a, 0x6f, 0x7b, 0x71, 0x6c, 0x72, 0x72, 0x99,
+ 0xb4, 0x8a, 0x1e, 0x8a, 0xa2, 0x99, 0x9a, 0x96,
+ 0xa2, 0x8, 0x94, 0x9e, 0x95, 0xa3, 0xaf, 0x1a,
+ 0xe, 0x2f, 0xa0, 0x76, 0xf7, 0x70, 0xcc, 0xf7,
+ 0x71, 0x77, 0x12, 0xf7, 0x83, 0xe5, 0x3b, 0xcb,
+ 0x13, 0xf0, 0xac, 0xf7, 0x70, 0x15, 0x13, 0xe8,
+ 0xf7, 0x6c, 0xfb, 0x70, 0xcb, 0xf7, 0x70, 0xf7,
+ 0x74, 0xcc, 0xfb, 0x74, 0xf7, 0x71, 0x4b, 0xfb,
+ 0x71, 0xfb, 0x6c, 0x6, 0xe, 0xfc, 0x30, 0xfb,
+ 0x35, 0x62, 0xa, 0x7f, 0x6d, 0x1d, 0x13, 0xd0,
+ 0x4f, 0x81, 0xa, 0xdf, 0x62, 0x1d, 0x9a, 0x70,
+ 0x1e, 0x13, 0xe0, 0x62, 0x6e, 0x6c, 0x61, 0x6d,
+ 0x9a, 0x7d, 0x9b, 0x7f, 0x1f, 0x13, 0xd0, 0x9e,
+ 0x7e, 0x9f, 0x81, 0x75, 0x1a, 0x53, 0x28, 0x57,
+ 0x78, 0x81, 0x1e, 0xe, 0xfb, 0xdd, 0xf7, 0x3a,
+ 0xf7, 0x8, 0x1, 0x8d, 0xf7, 0x3a, 0x15, 0xf7,
+ 0x88, 0x6, 0xa4, 0xf7, 0x8, 0x5, 0xfb, 0x87,
+ 0x6, 0xe, 0xfc, 0x30, 0x7e, 0xf7, 0x28, 0x1,
+ 0x82, 0xf7, 0x28, 0x3, 0x82, 0xc8, 0x3c, 0xa,
+ 0xfc, 0x14, 0x8e, 0x8d, 0x1d, 0x8d, 0x79, 0x15,
+ 0xf7, 0xe8, 0xf9, 0x53, 0x5, 0x45, 0x6, 0xfb,
+ 0xe4, 0xfd, 0x53, 0x5, 0xe, 0x7d, 0xa8, 0xf9,
+ 0x13, 0xa8, 0x1, 0xf8, 0xa, 0xf2, 0x3, 0x9c,
+ 0xf7, 0x63, 0x15, 0x30, 0xa4, 0xfb, 0x16, 0xf7,
+ 0x13, 0xf7, 0x38, 0xf7, 0x24, 0xf7, 0x82, 0xf7,
+ 0x7e, 0xf7, 0x15, 0x4b, 0xeb, 0x32, 0xfb, 0x47,
+ 0xfb, 0x14, 0xfb, 0xa2, 0xfb, 0x62, 0x1e, 0xf7,
+ 0x4c, 0xf7, 0x81, 0x15, 0xd5, 0xa2, 0xb6, 0xf7,
+ 0x1c, 0xc4, 0x1b, 0xb0, 0x98, 0x6b, 0x5a, 0x47,
+ 0x32, 0xfc, 0x7e, 0xfb, 0x8, 0xfb, 0xb, 0xf7,
+ 0x25, 0xf8, 0x2d, 0x9f, 0x91, 0x1f, 0xe, 0x8b,
+ 0xac, 0xf9, 0x1e, 0x77, 0x1, 0x90, 0x16, 0xf7,
+ 0xed, 0xac, 0x6, 0x53, 0x60, 0x8e, 0xa9, 0x8f,
+ 0x8c, 0x8f, 0x8c, 0x90, 0x1f, 0xf7, 0x3a, 0xf8,
+ 0xf0, 0x49, 0x7b, 0x52, 0x7d, 0xfb, 0x27, 0x75,
+ 0x19, 0x89, 0x74, 0x5, 0x8e, 0x9f, 0xa6, 0x8d,
+ 0x9f, 0x1b, 0x93, 0xae, 0x8a, 0x74, 0x88, 0x8b,
+ 0x87, 0x8a, 0x87, 0x1f, 0xfb, 0x18, 0xfc, 0x87,
+ 0x80, 0x61, 0x4c, 0x88, 0x5e, 0x8a, 0x19, 0xe,
+ 0x8b, 0xf7, 0x3, 0xdb, 0x77, 0xf8, 0x3a, 0xe5,
+ 0x1, 0xf7, 0xcc, 0xf7, 0x1a, 0x3, 0x70, 0x16,
+ 0xf8, 0x3, 0x6, 0xda, 0xf7, 0x53, 0x5, 0x72,
+ 0x6, 0x4d, 0x69, 0x73, 0x79, 0x3a, 0x1b, 0xfb,
+ 0x29, 0x6, 0xf7, 0x58, 0xf7, 0x3b, 0x5, 0xcf,
+ 0xc5, 0xd7, 0xd5, 0xda, 0x1a, 0xf7, 0x11, 0x51,
+ 0xd0, 0x22, 0xfb, 0x11, 0x49, 0x22, 0x50, 0x6f,
+ 0x1e, 0xa1, 0x7f, 0x5, 0xa0, 0x99, 0xb6, 0xcc,
+ 0xd7, 0x1b, 0xe8, 0x8b, 0x36, 0x78, 0x3e, 0x59,
+ 0x3f, 0x52, 0x45, 0x1f, 0x5a, 0x50, 0x8b, 0x8b,
+ 0xfb, 0x4b, 0xfb, 0x4b, 0x8, 0xe, 0x7e, 0xb3,
+ 0xeb, 0x77, 0xf8, 0x91, 0xd2, 0x12, 0xf7, 0xb1,
+ 0xf7, 0xf, 0x34, 0xf7, 0x15, 0x13, 0xf0, 0xf7,
+ 0x14, 0xf7, 0xef, 0x15, 0xef, 0xc4, 0x66, 0x27,
+ 0x2e, 0x58, 0x31, 0x51, 0x68, 0x76, 0xa4, 0xa4,
+ 0x77, 0x1f, 0xa2, 0x78, 0x7b, 0xa2, 0x74, 0x1b,
+ 0x7a, 0x63, 0x84, 0x56, 0x80, 0x92, 0x4a, 0xf7,
+ 0x14, 0xf7, 0x30, 0xf7, 0x18, 0xec, 0xf7, 0x12,
+ 0xf0, 0x6a, 0xc1, 0x5f, 0xab, 0x1f, 0x13, 0xe8,
+ 0xf1, 0xbe, 0x9c, 0xb7, 0xb5, 0x1a, 0xe7, 0x3a,
+ 0xc4, 0x4a, 0x23, 0x4c, 0x46, 0x4b, 0x63, 0x1e,
+ 0xa0, 0x7e, 0x5, 0xae, 0xa6, 0xa6, 0xb3, 0xcb,
+ 0x1b, 0xc9, 0xa2, 0x65, 0x63, 0xfb, 0x9, 0xfb,
+ 0x25, 0x63, 0x5f, 0x83, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf7, 0x2a, 0xed, 0xf8, 0x47, 0x77, 0x1, 0xf7,
+ 0x50, 0xf7, 0x14, 0xf7, 0xd, 0xcd, 0x3, 0xf7,
+ 0x79, 0xf7, 0x2a, 0x15, 0x62, 0xfb, 0x2a, 0x5,
+ 0xf7, 0x14, 0x6, 0xb5, 0xf7, 0x2a, 0x5, 0xcf,
+ 0x6, 0xa6, 0xed, 0x5, 0x46, 0x6, 0xf7, 0xb,
+ 0xf8, 0x47, 0x5, 0x49, 0x6, 0xfc, 0x3c, 0xfc,
+ 0x40, 0x6f, 0x22, 0x5, 0xf7, 0xef, 0xf8, 0xb,
+ 0x15, 0x8d, 0x89, 0x3d, 0xfb, 0xa7, 0x5, 0xfb,
+ 0x5f, 0x6, 0xe, 0x7e, 0xb3, 0x63, 0xf7, 0x1c,
+ 0xf7, 0x8d, 0xf7, 0x4, 0xd7, 0xf7, 0x1, 0x12,
+ 0xf7, 0xc7, 0xf4, 0x13, 0xb8, 0xd4, 0xf8, 0x8,
+ 0x15, 0xf7, 0x2a, 0xdf, 0x38, 0x25, 0x40, 0x52,
+ 0x36, 0x3d, 0x6d, 0x7f, 0xa6, 0xa4, 0x7b, 0x1f,
+ 0x13, 0x78, 0xa2, 0x7d, 0x7a, 0xa0, 0x68, 0x1b,
+ 0x6f, 0x6c, 0x7b, 0x5f, 0x6d, 0xac, 0x5d, 0xeb,
+ 0xf7, 0x29, 0xf7, 0x25, 0xed, 0xf7, 0x3c, 0xe6,
+ 0x22, 0xf7, 0x20, 0xfb, 0x24, 0x1f, 0xad, 0xd7,
+ 0x5, 0xf7, 0x92, 0x6, 0xaf, 0xf7, 0x1, 0x5,
+ 0xfb, 0xaf, 0x6, 0xe, 0x7c, 0xab, 0xf8, 0x1,
+ 0xb2, 0xf7, 0x96, 0x77, 0x1, 0xa2, 0xf7, 0x4,
+ 0xf7, 0x34, 0xf7, 0x10, 0x3, 0xf7, 0x7b, 0xf8,
+ 0x2d, 0x15, 0xbb, 0xee, 0xdd, 0xe8, 0xf7, 0x28,
+ 0xc1, 0x85, 0xa3, 0x18, 0xfb, 0xdd, 0x5b, 0xfb,
+ 0x2b, 0xfb, 0x8c, 0xfb, 0x4a, 0x1a, 0x3f, 0x9f,
+ 0xfb, 0x20, 0xf7, 0x32, 0xf7, 0xf, 0xf7, 0xb,
+ 0xf7, 0x1, 0xf7, 0x30, 0xf7, 0x10, 0x4b, 0xba,
+ 0x4a, 0x6e, 0x6d, 0x88, 0x82, 0x73, 0x1e, 0x2b,
+ 0xfb, 0xce, 0x15, 0xc7, 0xa1, 0xd8, 0xa0, 0xc6,
+ 0x1e, 0xde, 0xab, 0x8d, 0x93, 0xb7, 0x1b, 0xca,
+ 0x8b, 0x58, 0x77, 0x3f, 0x59, 0xfb, 0x1c, 0x88,
+ 0x80, 0x1f, 0x5c, 0x79, 0x72, 0x73, 0x6c, 0x1b,
+ 0x53, 0x8a, 0xc0, 0xa4, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf8, 0xc0, 0xf7, 0x5, 0x1, 0xde, 0xf8, 0x68,
+ 0x3, 0xf7, 0x24, 0x16, 0xf8, 0x11, 0xf9, 0x31,
+ 0x5, 0xfc, 0x11, 0x6, 0x34, 0xfb, 0x52, 0x5,
+ 0xa5, 0x6, 0xc8, 0xae, 0xa3, 0x9b, 0xf7, 0x1,
+ 0x1b, 0xf7, 0xf, 0x6, 0xfb, 0xd6, 0xfc, 0xc0,
+ 0x5, 0xe, 0x7e, 0xa9, 0xf9, 0xd, 0xac, 0x12,
+ 0x8e, 0xec, 0x94, 0xf7, 0x3, 0xe1, 0xf7, 0x5,
+ 0x67, 0xe8, 0x13, 0xf8, 0xf7, 0x4b, 0xf7, 0xe8,
+ 0x15, 0x59, 0x7a, 0xfb, 0x16, 0x5e, 0xfb, 0x14,
+ 0x1a, 0x6b, 0x9b, 0xfb, 0x17, 0xf7, 0x49, 0xf7,
+ 0x9, 0xf1, 0xdd, 0xf7, 0x11, 0xe5, 0x50, 0xca,
+ 0x70, 0xa8, 0x1e, 0x90, 0x7, 0x13, 0xf4, 0xd8,
+ 0xaa, 0xcd, 0xb6, 0xe2, 0x1a, 0xf7, 0x1, 0xfb,
+ 0xc, 0xab, 0x55, 0xfb, 0x2, 0x38, 0x39, 0x43,
+ 0x3e, 0xb4, 0x43, 0xac, 0x68, 0x1e, 0xa5, 0x73,
+ 0x15, 0x13, 0xf8, 0xd7, 0x31, 0xa0, 0x71, 0x4f,
+ 0x1a, 0x4c, 0x65, 0x4a, 0x47, 0x39, 0x79, 0xd7,
+ 0xb7, 0xea, 0xbe, 0xbd, 0xc5, 0xb2, 0x1e, 0xf0,
+ 0xdd, 0x15, 0x5b, 0xb8, 0x61, 0xb7, 0xc8, 0x1a,
+ 0xb5, 0xa2, 0xc2, 0xc6, 0x1e, 0x13, 0xf4, 0xba,
+ 0xad, 0x65, 0x45, 0x4b, 0x65, 0x65, 0x68, 0x66,
+ 0x1f, 0xe, 0x96, 0x76, 0xf7, 0x93, 0x77, 0xf8,
+ 0x3e, 0xab, 0x1, 0xf7, 0x45, 0xf7, 0xf8, 0x15,
+ 0xa0, 0x9e, 0xf7, 0x1c, 0xaf, 0xd1, 0x1e, 0xb2,
+ 0x9f, 0xa6, 0xa8, 0xad, 0x1b, 0xbe, 0x8a, 0x5c,
+ 0x6e, 0x88, 0x88, 0x2e, 0x63, 0x25, 0x1f, 0x37,
+ 0x6b, 0x7c, 0x86, 0x6c, 0x1b, 0x7c, 0x59, 0x8c,
+ 0xce, 0x1f, 0xfb, 0x4b, 0xfc, 0x2, 0x15, 0xf7,
+ 0xfc, 0xbe, 0xf7, 0xd, 0xf7, 0xa7, 0xf7, 0x2a,
+ 0x1a, 0xf7, 0x18, 0x57, 0xe0, 0xfb, 0x2, 0xfb,
+ 0x41, 0x34, 0xfb, 0x2f, 0xfb, 0x8, 0x28, 0xc7,
+ 0x47, 0xe6, 0xa6, 0x9b, 0x91, 0x93, 0x9d, 0x1e,
+ 0x55, 0xfb, 0x9, 0x21, 0x2c, 0xfb, 0x9, 0x6b,
+ 0x8, 0xe, 0xfb, 0xdd, 0x7e, 0xf7, 0x26, 0xf7,
+ 0x47, 0xf7, 0x27, 0x12, 0xa2, 0xf7, 0x28, 0x54,
+ 0xf7, 0x28, 0x13, 0xe0, 0xa2, 0xc8, 0x43, 0x1d,
+ 0xaa, 0x62, 0x60, 0x6c, 0x6b, 0x63, 0x1e, 0x13,
+ 0xd0, 0xe8, 0xf7, 0xd9, 0x43, 0x1d, 0xab, 0x62,
+ 0x60, 0x6c, 0x6a, 0x63, 0x1e, 0xe, 0xfb, 0xdd,
+ 0xfb, 0x36, 0x76, 0xf7, 0xd0, 0x77, 0xf7, 0x5b,
+ 0xf7, 0x27, 0x1, 0xa2, 0x6d, 0x1d, 0x4c, 0xf7,
+ 0x28, 0x3, 0x72, 0xfb, 0x33, 0x15, 0x9e, 0x96,
+ 0xee, 0xbc, 0xc4, 0x1a, 0xa2, 0x79, 0x93, 0x78,
+ 0x98, 0x1e, 0x7a, 0x97, 0x7b, 0x99, 0xaa, 0x1a,
+ 0xb6, 0xa8, 0xaa, 0xb4, 0xa7, 0xc5, 0x7a, 0x3c,
+ 0xfb, 0x18, 0xfb, 0x44, 0x37, 0x7c, 0x87, 0x1e,
+ 0xf7, 0x14, 0xf8, 0xcd, 0x15, 0xb3, 0xaa, 0xac,
+ 0xb6, 0xb4, 0xac, 0x6b, 0x62, 0x60, 0x6a, 0x6c,
+ 0x62, 0x5f, 0x6d, 0xac, 0xb4, 0x1e, 0xe, 0x2f,
+ 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa, 0xf8,
+ 0x90, 0x3, 0xf8, 0x7d, 0x83, 0x15, 0xcf, 0x7,
+ 0xfc, 0x6, 0xf7, 0x55, 0xf8, 0x38, 0xf7, 0x55,
+ 0x5, 0xcf, 0x7, 0xfc, 0x90, 0xfb, 0x7d, 0x5,
+ 0x53, 0x7, 0xe, 0x2f, 0xf1, 0xe5, 0xdd, 0xe4,
+ 0x67, 0xcf, 0x12, 0x13, 0xa0, 0xde, 0xf7, 0xdf,
+ 0x15, 0xf8, 0x5a, 0xcf, 0xfc, 0x5a, 0x6, 0x59,
+ 0xfb, 0xb8, 0x15, 0xf8, 0x5a, 0x6, 0x13, 0xc0,
+ 0xcc, 0xfc, 0x5a, 0x7, 0xe, 0x2f, 0x98, 0x76,
+ 0xf8, 0x9e, 0x77, 0x1, 0xf8, 0xaf, 0xf7, 0x75,
+ 0x15, 0xc3, 0x7, 0xfc, 0x5e, 0xf7, 0x7d, 0x5,
+ 0x47, 0x7, 0xf8, 0x6, 0xfb, 0x55, 0xfc, 0x38,
+ 0xfb, 0x55, 0x5, 0x47, 0x7, 0xe, 0x7e, 0xf7,
+ 0x28, 0xf7, 0xf5, 0xf7, 0x58, 0x6c, 0xaa, 0x12,
+ 0xda, 0xf7, 0x28, 0xfb, 0x0, 0xf7, 0xe, 0xf1,
+ 0xf7, 0x13, 0x13, 0xcc, 0xf7, 0x3b, 0xf7, 0x6b,
+ 0x15, 0xa8, 0x84, 0xa3, 0xc6, 0x9a, 0xaa, 0xb6,
+ 0xa7, 0x19, 0xf7, 0x19, 0xe2, 0xc6, 0xbc, 0xd9,
+ 0x1a, 0xba, 0x65, 0xec, 0xfb, 0x29, 0xfb, 0x1,
+ 0x54, 0x4d, 0x47, 0x67, 0xa5, 0x6d, 0xae, 0xab,
+ 0xa8, 0xa4, 0xad, 0x9f, 0x83, 0x98, 0x83, 0x95,
+ 0x1e, 0x84, 0x94, 0x85, 0x92, 0x94, 0x1a, 0x13,
+ 0xb4, 0xa0, 0xb6, 0x9c, 0xa7, 0xaa, 0xa8, 0x7b,
+ 0x49, 0x55, 0x71, 0x59, 0x3c, 0x2e, 0x1e, 0x4e,
+ 0x3f, 0x84, 0x59, 0x88, 0x6a, 0x8, 0x33, 0xfb,
+ 0x2e, 0x3c, 0xa, 0xf7, 0x3e, 0x79, 0xb9, 0xf7,
+ 0x6, 0xb0, 0x66, 0xbb, 0x5c, 0x77, 0xe7, 0x77,
+ 0xf7, 0xa4, 0xbb, 0xf7, 0x17, 0xb2, 0x12, 0xca,
+ 0xe6, 0xf7, 0xa, 0xd7, 0xf8, 0xc, 0xb9, 0x13,
+ 0xaf, 0xc0, 0xf7, 0xf0, 0xf7, 0xaa, 0x15, 0xf7,
+ 0xc, 0xe3, 0xd0, 0xbb, 0xa8, 0x9a, 0x75, 0x60,
+ 0xfb, 0x22, 0x40, 0x45, 0x5f, 0x6a, 0x6f, 0xa7,
+ 0xc7, 0x1e, 0xf7, 0x22, 0x4c, 0x15, 0x7e, 0xa2,
+ 0x4f, 0xcf, 0xf7, 0xd, 0xcf, 0xf7, 0x1e, 0xf3,
+ 0xf7, 0x40, 0xfb, 0x27, 0xf7, 0x15, 0xfb, 0x50,
+ 0xfb, 0x5c, 0xfb, 0x40, 0xfb, 0x28, 0xfb, 0x70,
+ 0xfb, 0x1d, 0xf7, 0x8, 0xfb, 0x5a, 0xf7, 0x9e,
+ 0xdb, 0xd1, 0xa7, 0xaa, 0xcc, 0x1e, 0x7e, 0xae,
+ 0x5, 0x70, 0x50, 0x57, 0x76, 0x30, 0x1b, 0xfb,
+ 0x3f, 0xfb, 0xc, 0xf7, 0x25, 0xf7, 0x24, 0xf7,
+ 0x77, 0xf7, 0x19, 0xf1, 0xf7, 0x28, 0xf7, 0x4b,
+ 0xf5, 0xfb, 0x26, 0xfb, 0x8, 0x1f, 0x13, 0xcf,
+ 0xc0, 0x34, 0x59, 0xfb, 0xa, 0x3e, 0x6c, 0x85,
+ 0xa4, 0x9f, 0x92, 0x8c, 0x91, 0x8c, 0x92, 0x1e,
+ 0xcc, 0xf7, 0x95, 0x5, 0x44, 0x6, 0x80, 0x65,
+ 0x5, 0xa4, 0x7d, 0x81, 0xa6, 0x5b, 0x1b, 0xfb,
+ 0x1d, 0x4b, 0xfb, 0x35, 0x3f, 0x1f, 0x13, 0x9f,
+ 0xc0, 0xfb, 0x3, 0xd0, 0x73, 0xa8, 0xc7, 0xba,
+ 0xc3, 0x9b, 0x96, 0x1e, 0xe, 0x51, 0x1d, 0x1,
+ 0x40, 0xf9, 0x28, 0x3, 0xf7, 0x15, 0x16, 0xae,
+ 0x7, 0x5f, 0x76, 0x9e, 0x9f, 0x90, 0x8d, 0x90,
+ 0x8e, 0x92, 0x3f, 0xa, 0x5b, 0x69, 0x83, 0x5e,
+ 0x2c, 0xa, 0x68, 0x7, 0xf8, 0xc, 0xf8, 0x7f,
+ 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, 0x90,
+ 0x8b, 0xab, 0xf7, 0xc6, 0xa9, 0xf7, 0xa1, 0xae,
+ 0x12, 0xf8, 0x3e, 0xf7, 0x2d, 0x25, 0xea, 0x2c,
+ 0xf7, 0x27, 0x13, 0xf0, 0x73, 0x16, 0xf7, 0xaf,
+ 0x6, 0xf7, 0x27, 0xf7, 0x3a, 0xbe, 0xf7, 0x31,
+ 0xf1, 0x38, 0xa7, 0x58, 0x9b, 0x1f, 0x8d, 0x7,
+ 0x13, 0xe4, 0xcd, 0x9b, 0xf7, 0xc, 0xaf, 0xf7,
+ 0xd, 0x1a, 0xf7, 0x1f, 0xfb, 0x45, 0x8c, 0x50,
+ 0x1e, 0xfb, 0xa4, 0x68, 0x6, 0xb5, 0xaa, 0x86,
+ 0x63, 0x1f, 0xfb, 0x19, 0xfc, 0x76, 0x7a, 0x4d,
+ 0x6f, 0x86, 0x68, 0x86, 0x19, 0xf7, 0xb9, 0xf7,
+ 0xc3, 0x15, 0x13, 0xf0, 0xd3, 0xd9, 0x76, 0xfb,
+ 0x1, 0x5f, 0x72, 0xfb, 0x18, 0xfb, 0x1b, 0x65,
+ 0x74, 0x95, 0xa4, 0x93, 0x8c, 0x93, 0x8f, 0x96,
+ 0x1f, 0xd5, 0xf7, 0xa6, 0x15, 0xc8, 0xf7, 0x75,
+ 0x5, 0x9f, 0x90, 0x91, 0xa3, 0xb1, 0x1b, 0x13,
+ 0xe8, 0xd1, 0x9f, 0x55, 0x55, 0xfb, 0x38, 0xfb,
+ 0xc, 0x8e, 0x3b, 0x1f, 0xe, 0x90, 0x79, 0xc0,
+ 0xf8, 0xfb, 0xae, 0x1, 0xab, 0xf7, 0x2e, 0x3,
+ 0xf8, 0xb6, 0xf7, 0x2d, 0x15, 0x2f, 0x42, 0x4b,
+ 0x71, 0x3c, 0x1b, 0x7d, 0xfb, 0x16, 0x9f, 0xf7,
+ 0x47, 0xf7, 0x45, 0xf3, 0xf7, 0x83, 0xf7, 0x35,
+ 0xe3, 0xc5, 0x49, 0x32, 0x7f, 0x8a, 0x7e, 0x89,
+ 0x7e, 0x81, 0x1d, 0x81, 0x83, 0x7e, 0x75, 0x1b,
+ 0x82, 0x7f, 0x8f, 0x90, 0x7c, 0x1f, 0x94, 0x70,
+ 0x65, 0x96, 0x54, 0x1b, 0xfb, 0x87, 0xfb, 0x44,
+ 0xfb, 0x79, 0xfb, 0x72, 0xfb, 0x49, 0xf7, 0x22,
+ 0x44, 0xf7, 0x16, 0xf7, 0x16, 0xe6, 0xd3, 0xd8,
+ 0xbe, 0x1f, 0xe, 0xc7, 0x8b, 0xad, 0xf8, 0xf0,
+ 0xaa, 0x1, 0xf8, 0xae, 0xf7, 0x27, 0x3, 0xf7,
+ 0x52, 0xf7, 0x12, 0x15, 0xf7, 0x14, 0xf8, 0x6e,
+ 0x80, 0x1d, 0xfb, 0x2c, 0x2c, 0x25, 0x60, 0xfb,
+ 0x93, 0xfb, 0x97, 0x61, 0x7d, 0x99, 0xa3, 0x9a,
+ 0x8f, 0x9d, 0x77, 0xa, 0x8c, 0xf7, 0x13, 0xf7,
+ 0x73, 0x5d, 0xa, 0x77, 0x83, 0x72, 0xfb, 0xa,
+ 0xfc, 0x37, 0x1e, 0x75, 0x3d, 0x6b, 0x83, 0x6a,
+ 0x86, 0x8, 0xe, 0x51, 0xa, 0x1, 0x70, 0x16,
+ 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98, 0x93,
+ 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x4, 0xab,
+ 0x6f, 0x4c, 0x7e, 0x89, 0x7d, 0x89, 0x7b, 0x2a,
+ 0xa, 0xe, 0x90, 0xa0, 0x76, 0xf7, 0xe6, 0xab,
+ 0xf7, 0x9f, 0xab, 0x1, 0x7e, 0x16, 0xf7, 0xbb,
+ 0x6, 0x90, 0xae, 0x5, 0x5d, 0x71, 0x96, 0xa2,
+ 0x8e, 0x8b, 0x8f, 0x8c, 0x8f, 0x1f, 0xcb, 0xf7,
+ 0x96, 0x5, 0xf7, 0x2, 0xa6, 0x6c, 0x4e, 0x7e,
+ 0x89, 0x7d, 0x89, 0x7c, 0x4c, 0xa, 0x5, 0x37,
+ 0x5f, 0x7f, 0x75, 0xfb, 0x22, 0x1b, 0xc8, 0xf7,
+ 0x73, 0x5, 0xab, 0x94, 0x96, 0x97, 0xb2, 0x1b,
+ 0xf7, 0x49, 0x8b, 0x36, 0x47, 0x1f, 0xa6, 0x86,
+ 0xb6, 0xf7, 0x52, 0x5, 0xfc, 0xa9, 0x68, 0x6,
+ 0xbd, 0x85, 0xa4, 0x87, 0x7a, 0x8b, 0xa, 0x85,
+ 0x1e, 0xfb, 0x14, 0xfc, 0x94, 0x82, 0x67, 0x6c,
+ 0x89, 0x63, 0x84, 0x19, 0xe, 0xc7, 0x79, 0xb1,
+ 0xf7, 0xa6, 0xaf, 0xf7, 0xd3, 0xaf, 0x1, 0xa0,
+ 0xf7, 0x30, 0x3, 0xf8, 0x37, 0xf7, 0xba, 0x15,
+ 0xb9, 0x87, 0xaa, 0x88, 0x65, 0x1a, 0x84, 0x8a,
+ 0x81, 0x89, 0x81, 0x1e, 0x84, 0x68, 0x60, 0xfb,
+ 0x10, 0x87, 0x84, 0x8, 0x74, 0x7d, 0x60, 0x7e,
+ 0x5f, 0x1b, 0x6a, 0xfb, 0x14, 0xbd, 0xf7, 0x3f,
+ 0xf7, 0x67, 0xf4, 0xf7, 0x59, 0xf7, 0x34, 0xf7,
+ 0x3, 0xbb, 0x3b, 0x26, 0x1f, 0xa8, 0x87, 0xbe,
+ 0xf7, 0x71, 0x5, 0x6c, 0x6, 0x81, 0x86, 0x82,
+ 0x77, 0x6f, 0x1b, 0x7e, 0x80, 0x90, 0x90, 0x7c,
+ 0x1f, 0x94, 0x73, 0x68, 0x96, 0x47, 0x1b, 0xfb,
+ 0x99, 0xfb, 0x34, 0xfb, 0x88, 0xfb, 0x5c, 0xfb,
+ 0x45, 0xf7, 0x1c, 0x39, 0xf7, 0x39, 0xd7, 0xf7,
+ 0x7, 0xa4, 0xa4, 0xc1, 0x1f, 0x97, 0x94, 0xbb,
+ 0xf7, 0x49, 0x9d, 0xd0, 0x93, 0x8a, 0xc0, 0x8f,
+ 0x19, 0xaf, 0xfb, 0xb3, 0x7, 0xe, 0xf7, 0x8,
+ 0x8b, 0xae, 0xf7, 0xba, 0xb7, 0xf7, 0x99, 0xae,
+ 0x1, 0x73, 0x16, 0x75, 0x1d, 0x5e, 0x8e, 0x6e,
+ 0x95, 0xa5, 0x1a, 0x8f, 0x8c, 0x8f, 0x8c, 0x90,
+ 0x1e, 0xcd, 0xf7, 0x86, 0x5, 0xf7, 0x83, 0x6,
+ 0x4c, 0xfb, 0x86, 0x83, 0x6b, 0x79, 0x7a, 0x3f,
+ 0x88, 0x19, 0x68, 0xf7, 0xd1, 0xae, 0x7, 0x69,
+ 0x8c, 0x64, 0x97, 0xa7, 0x1a, 0x8e, 0x8b, 0x8f,
+ 0x8c, 0x8f, 0x1e, 0xf7, 0x19, 0xf8, 0x79, 0x9b,
+ 0xc9, 0xa4, 0x85, 0xb3, 0x91, 0x19, 0x61, 0xa,
+ 0xc0, 0x83, 0xa1, 0x7b, 0x74, 0x1a, 0x86, 0x8a,
+ 0x86, 0x8a, 0x86, 0x1e, 0x52, 0xfb, 0x5b, 0x5,
+ 0xfb, 0x83, 0x6, 0xc1, 0xf7, 0x5b, 0x9b, 0xc7,
+ 0xa8, 0x8b, 0xc3, 0x8d, 0x82, 0xa, 0xbe, 0x84,
+ 0xa3, 0x7b, 0x74, 0x1a, 0x86, 0x8a, 0x86, 0x8a,
+ 0x85, 0x1e, 0xfb, 0x18, 0xfc, 0x79, 0x80, 0x62,
+ 0x6a, 0x86, 0x66, 0x85, 0x19, 0xe, 0xfb, 0xa5,
+ 0xa0, 0x76, 0xf9, 0xe, 0xae, 0x1, 0x6b, 0x16,
+ 0x75, 0x1d, 0x60, 0x8d, 0x6e, 0x9b, 0xa4, 0x1a,
+ 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1e, 0xf7, 0x21,
+ 0xf8, 0x77, 0x9a, 0xbe, 0x9e, 0x8d, 0x56, 0x1d,
+ 0xc5, 0x86, 0xa0, 0x75, 0x88, 0x7a, 0x8a, 0x86,
+ 0x8a, 0x86, 0x8a, 0x87, 0xfb, 0x18, 0xfc, 0x77,
+ 0x18, 0x80, 0x61, 0x70, 0x81, 0x60, 0x85, 0x8,
+ 0xe, 0x45, 0xf7, 0x3f, 0xf8, 0xcc, 0x77, 0x12,
+ 0x5d, 0xf7, 0x13, 0xfb, 0x13, 0xf8, 0xce, 0x13,
+ 0xe0, 0xf7, 0x77, 0xf9, 0xe, 0x15, 0xbd, 0x84,
+ 0xa4, 0x7c, 0x73, 0x8b, 0xa, 0x84, 0x1e, 0x22,
+ 0xfc, 0x2d, 0x5, 0xfb, 0xb, 0x6b, 0x5d, 0x61,
+ 0x73, 0x1b, 0x81, 0x86, 0x92, 0x99, 0x98, 0x8f,
+ 0x8f, 0x92, 0x92, 0x1f, 0x92, 0x92, 0x90, 0x92,
+ 0x9e, 0x1a, 0xaf, 0x6e, 0xa5, 0x68, 0x68, 0x6f,
+ 0x6f, 0x60, 0x4e, 0xd1, 0x64, 0xdc, 0xf7, 0x18,
+ 0xbe, 0xe5, 0xf1, 0xa6, 0x1e, 0xf7, 0x0, 0xf8,
+ 0x2d, 0x5, 0x13, 0xd0, 0x9e, 0xc4, 0x9a, 0x88,
+ 0xba, 0x93, 0x8, 0xae, 0xfb, 0xbd, 0x7, 0xe,
+ 0x90, 0xa0, 0x76, 0xf9, 0x31, 0x77, 0x1, 0x76,
+ 0x16, 0xf7, 0xb5, 0xae, 0x6, 0x64, 0x70, 0x98,
+ 0xad, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0xcb,
+ 0xf7, 0x79, 0x93, 0x89, 0x5, 0xf7, 0x1, 0xfb,
+ 0x7d, 0x97, 0x74, 0x88, 0x1a, 0x74, 0x84, 0x8a,
+ 0x51, 0x84, 0x1e, 0x68, 0xf7, 0xac, 0xae, 0x7,
+ 0x71, 0x8e, 0x74, 0x8d, 0x7d, 0xa9, 0xfb, 0x31,
+ 0xf7, 0xdc, 0x18, 0xf7, 0x6c, 0xf7, 0x50, 0xb8,
+ 0xb5, 0x98, 0x8c, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+ 0x67, 0x68, 0x7, 0xb2, 0x87, 0x9c, 0x89, 0x75,
+ 0x1a, 0x72, 0xfb, 0x78, 0xfb, 0x44, 0x64, 0x54,
+ 0x1e, 0x86, 0x8c, 0xc7, 0xf7, 0x71, 0x9b, 0xc5,
+ 0xa7, 0x8b, 0xbd, 0x8f, 0x19, 0xae, 0xfb, 0xca,
+ 0x68, 0x7, 0xbd, 0x84, 0xa4, 0x7c, 0x74, 0x7c,
+ 0x1d, 0x79, 0x4b, 0x70, 0x88, 0x68, 0x86, 0x19,
+ 0xe, 0x53, 0x1d, 0x55, 0x7e, 0x96, 0x9d, 0x94,
+ 0x8f, 0x96, 0x8e, 0x98, 0x1f, 0xf7, 0x15, 0xf8,
+ 0x72, 0x9b, 0xc7, 0xa8, 0x8a, 0xc3, 0x8e, 0x82,
+ 0xa, 0xbf, 0x84, 0xa2, 0x7b, 0x75, 0x7c, 0x1d,
+ 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xe,
+ 0xf7, 0x77, 0x8b, 0xae, 0x71, 0x76, 0xf7, 0x60,
+ 0x77, 0xf8, 0x85, 0x77, 0x12, 0x13, 0xb0, 0x6e,
+ 0x16, 0xf7, 0x63, 0xae, 0x6, 0x50, 0x79, 0xa3,
+ 0xac, 0xa5, 0x93, 0xab, 0x93, 0xa7, 0x1f, 0xef,
+ 0xf8, 0x0, 0x5, 0x8d, 0x6, 0x13, 0x70, 0xcd,
+ 0xfc, 0xbe, 0x5, 0xa7, 0x6, 0xf8, 0x7, 0xf8,
+ 0xca, 0x8d, 0x89, 0xfb, 0xf, 0xfc, 0x47, 0x5,
+ 0x13, 0xb0, 0x7b, 0x50, 0x6f, 0x78, 0x53, 0x87,
+ 0x8, 0x68, 0xf7, 0xcc, 0xae, 0x7, 0x55, 0x7a,
+ 0x96, 0xa0, 0x98, 0x8f, 0x9c, 0x90, 0x9f, 0x1f,
+ 0xf7, 0xf, 0xf8, 0x51, 0x9b, 0xc9, 0xa4, 0x8f,
+ 0xb3, 0x91, 0x19, 0xae, 0xfb, 0x68, 0x7, 0xfb,
+ 0xc8, 0xfc, 0x71, 0x6f, 0xa, 0x55, 0xf8, 0x71,
+ 0x5, 0xfb, 0x71, 0x68, 0x6, 0xc0, 0x89, 0x9e,
+ 0x89, 0x6c, 0x1a, 0xfb, 0xc, 0xfc, 0x39, 0x63,
+ 0xfb, 0x1e, 0x7f, 0x92, 0x5a, 0x7f, 0x19, 0xe,
+ 0x8b, 0x1d, 0x12, 0x13, 0xa0, 0x70, 0x16, 0xf7,
+ 0x64, 0xae, 0x6, 0x51, 0x79, 0x9d, 0xb0, 0x9a,
+ 0x8e, 0x9b, 0x90, 0x9c, 0x1f, 0xf4, 0xf8, 0x20,
+ 0x5, 0x13, 0x60, 0x59, 0xa, 0x8d, 0x96, 0x94,
+ 0x8a, 0x93, 0x1b, 0xaf, 0x97, 0x72, 0x6b, 0x6f,
+ 0x85, 0x6a, 0x83, 0x71, 0x64, 0x1d, 0xfb, 0x12,
+ 0xfc, 0x57, 0x18, 0x13, 0xa0, 0x6d, 0x21, 0x80,
+ 0x9b, 0x55, 0x7e, 0x8, 0xe, 0xc7, 0x79, 0xad,
+ 0xf9, 0xf, 0xad, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+ 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe0, 0xf8, 0x2d,
+ 0xf7, 0x4c, 0xf3, 0x8e, 0x21, 0x76, 0xfb, 0x8,
+ 0x2f, 0xfc, 0x1c, 0xfb, 0x46, 0x50, 0x5c, 0xad,
+ 0x55, 0x1d, 0xd4, 0xfb, 0x14, 0xf7, 0x3b, 0xf7,
+ 0x8d, 0xf7, 0x43, 0xf7, 0x9e, 0xf7, 0x56, 0xf7,
+ 0x42, 0xfb, 0x1b, 0xd0, 0xfb, 0x1, 0xfb, 0x6f,
+ 0xfb, 0x5d, 0xfb, 0x7d, 0xfb, 0x89, 0x1e, 0xe,
+ 0x58, 0xa0, 0x76, 0xf7, 0xd6, 0xab, 0xf7, 0xaf,
+ 0xab, 0x1, 0xf8, 0x67, 0xf7, 0x26, 0x3, 0xf7,
+ 0xa1, 0xf7, 0xf6, 0x6f, 0x1d, 0x23, 0x54, 0x55,
+ 0xfb, 0x23, 0x1f, 0xfb, 0xbc, 0xfb, 0xf6, 0x15,
+ 0xf7, 0xba, 0xae, 0x6, 0x5a, 0x78, 0xa3, 0xb2,
+ 0x97, 0x8e, 0x98, 0x8e, 0x99, 0x1f, 0xc1, 0xf7,
+ 0x4d, 0x5, 0xf7, 0x27, 0xf7, 0x63, 0xa4, 0xf7,
+ 0x39, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0xfb,
+ 0xb3, 0x68, 0x6, 0xbe, 0x84, 0xa3, 0x88, 0x79,
+ 0x8b, 0xa, 0x86, 0x1e, 0xfb, 0xf, 0xfc, 0x5b,
+ 0x7a, 0x4d, 0x6a, 0x6a, 0x63, 0x84, 0x19, 0xe,
+ 0xc7, 0xfb, 0x64, 0xe8, 0x5d, 0xf7, 0x46, 0x69,
+ 0xad, 0xf9, 0xe, 0xad, 0x12, 0x4d, 0xa, 0x13,
+ 0x5c, 0xf7, 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe2,
+ 0xf8, 0x2d, 0xf7, 0x4c, 0xf3, 0x8c, 0x23, 0x76,
+ 0xfb, 0x8, 0x2d, 0xfc, 0x1d, 0xfb, 0x46, 0x50,
+ 0x5e, 0xac, 0xef, 0x1e, 0xfb, 0x23, 0xfb, 0xcf,
+ 0x15, 0x99, 0x73, 0x5, 0xa2, 0xc4, 0xad, 0x90,
+ 0xa0, 0x1b, 0xbe, 0xae, 0x7b, 0x7e, 0xb6, 0x1f,
+ 0x13, 0xbc, 0x81, 0xab, 0xaf, 0x83, 0xbc, 0x1b,
+ 0xf7, 0x20, 0xd2, 0xe3, 0xc8, 0xb7, 0x1f, 0x76,
+ 0x9e, 0x5, 0x58, 0x6b, 0x51, 0x73, 0x4e, 0x1b,
+ 0x6e, 0x6c, 0x8e, 0x94, 0x70, 0x1f, 0x57, 0x9b,
+ 0x5e, 0x93, 0x69, 0x8f, 0x8, 0x66, 0x90, 0x75,
+ 0x8c, 0x8f, 0x1a, 0x90, 0xaa, 0xa8, 0x9a, 0x99,
+ 0x1e, 0xf7, 0x86, 0xf7, 0x59, 0xf7, 0x91, 0xf7,
+ 0x64, 0xf7, 0x42, 0xfb, 0x19, 0xce, 0x5d, 0x1d,
+ 0xfb, 0x7d, 0xfb, 0x89, 0x38, 0xbc, 0x27, 0xf7,
+ 0x5, 0x6c, 0x1f, 0x95, 0x87, 0x8b, 0x8b, 0x8f,
+ 0x86, 0x88, 0x85, 0x8b, 0x8b, 0xfb, 0x40, 0xfb,
+ 0x23, 0x8, 0xe, 0x90, 0xa0, 0x76, 0xf9, 0x11,
+ 0xab, 0x1, 0xf8, 0x6c, 0xf7, 0x2b, 0x3, 0xf7,
+ 0xa5, 0xf7, 0xff, 0x15, 0xc7, 0xf7, 0x7a, 0x5,
+ 0xa2, 0x90, 0x92, 0xa0, 0xac, 0x1b, 0xcb, 0xa9,
+ 0x56, 0x4f, 0x25, 0x3b, 0x50, 0xfb, 0xb, 0x1f,
+ 0xfb, 0xc2, 0xfb, 0xff, 0x8e, 0x1d, 0x66, 0x71,
+ 0x8e, 0xb0, 0x94, 0x8d, 0x95, 0x8e, 0x98, 0x1f,
+ 0xc2, 0xf7, 0x74, 0x5, 0xa8, 0x6, 0xf6, 0xfb,
+ 0xdf, 0x5, 0xf7, 0x5e, 0xae, 0x6, 0x5b, 0x90,
+ 0x79, 0x8d, 0x75, 0xcc, 0x38, 0xf7, 0x80, 0x18,
+ 0xf7, 0x17, 0xa0, 0xc8, 0xdf, 0xd7, 0x1a, 0xf7,
+ 0x25, 0xfb, 0x44, 0x8b, 0x4f, 0x1e, 0xfb, 0xa8,
+ 0x68, 0x6, 0xbf, 0x84, 0xa2, 0x82, 0x77, 0x1a,
+ 0x87, 0x8a, 0x87, 0x8a, 0x84, 0x1e, 0xfb, 0x19,
+ 0xfc, 0x70, 0x7b, 0x52, 0x77, 0x81, 0x5f, 0x86,
+ 0x19, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, 0xae,
+ 0x87, 0x85, 0x1d, 0x13, 0xd8, 0x8d, 0x79, 0x15,
+ 0xa9, 0x6, 0xa2, 0x96, 0x8f, 0x97, 0xa4, 0x1b,
+ 0x98, 0x9a, 0x84, 0x83, 0xa2, 0x1f, 0x82, 0xa6,
+ 0xaa, 0x80, 0xb4, 0x1b, 0xf7, 0x30, 0xe5, 0xf7,
+ 0x0, 0xf7, 0x18, 0xd3, 0x54, 0xc2, 0x51, 0xb8,
+ 0x1f, 0x4b, 0xbe, 0x47, 0xb6, 0xc2, 0x1a, 0x97,
+ 0x84, 0xea, 0xf1, 0xf7, 0x6, 0xa6, 0xfb, 0x2,
+ 0x53, 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xb8, 0xb3,
+ 0xf7, 0x5d, 0x5, 0x6d, 0x6, 0x72, 0x7e, 0x70,
+ 0x8a, 0x87, 0x1b, 0x7c, 0x7a, 0x92, 0x92, 0x74,
+ 0x1f, 0x13, 0xd8, 0x93, 0x74, 0x70, 0x93, 0x6e,
+ 0x1b, 0xfb, 0x19, 0x38, 0x2b, 0x26, 0x3b, 0xc8,
+ 0x5e, 0xc8, 0x63, 0x1f, 0xc8, 0x63, 0xc9, 0x66,
+ 0x4b, 0x1a, 0x77, 0x7e, 0xfb, 0x26, 0xfb, 0x4,
+ 0x61, 0xfb, 0x5, 0x9b, 0xf7, 0x40, 0x1e, 0x6e,
+ 0x8d, 0x5, 0xe, 0x58, 0x58, 0xa, 0x1, 0xbd,
+ 0x16, 0xf7, 0xdf, 0x6, 0x8d, 0xae, 0x5, 0x51,
+ 0x76, 0x91, 0xa9, 0x94, 0x8e, 0x97, 0x8f, 0x9a,
+ 0x1f, 0xf7, 0x1e, 0xf8, 0xa3, 0x5, 0xc0, 0xe0,
+ 0x85, 0xfb, 0x29, 0x1f, 0xa6, 0x89, 0xaf, 0xf7,
+ 0x54, 0x5, 0xfc, 0xbb, 0x6, 0x65, 0xfb, 0x3f,
+ 0xa4, 0x84, 0x5, 0xf1, 0xbe, 0xd2, 0xb4, 0xea,
+ 0x1b, 0xfb, 0x26, 0xfc, 0xa3, 0x78, 0x46, 0x62,
+ 0x86, 0x5e, 0x8d, 0x19, 0xe, 0xc7, 0x79, 0xc3,
+ 0xf8, 0xe9, 0xad, 0x1, 0xce, 0xf7, 0x1e, 0x3,
+ 0xed, 0xf9, 0xe, 0x15, 0xc9, 0x83, 0x96, 0x6b,
+ 0x6b, 0x5d, 0x23, 0xfb, 0xa8, 0x38, 0xa, 0xe1,
+ 0xf7, 0xbb, 0x99, 0xbc, 0x9d, 0x9b, 0x55, 0xa,
+ 0x8c, 0x93, 0x93, 0x8b, 0x92, 0x1b, 0xba, 0x98,
+ 0x68, 0x72, 0x85, 0x8a, 0x85, 0x8a, 0x86, 0x1f,
+ 0x3b, 0xfb, 0xbb, 0x5, 0x21, 0x6f, 0x65, 0xfb,
+ 0xb, 0xfb, 0x23, 0x1b, 0x28, 0x73, 0xb7, 0xc5,
+ 0xb3, 0x9b, 0xbb, 0x97, 0xb7, 0x3e, 0x1d, 0xe,
+ 0x90, 0x87, 0x76, 0xf7, 0x53, 0x77, 0xb2, 0x77,
+ 0xf8, 0x5c, 0xae, 0x12, 0xd3, 0xf9, 0x1e, 0x13,
+ 0xd8, 0x13, 0xb8, 0xf7, 0x7b, 0x79, 0x15, 0xab,
+ 0x6, 0xf8, 0x1d, 0xf8, 0xf8, 0x91, 0x94, 0x9b,
+ 0x9f, 0xb0, 0x96, 0x19, 0xae, 0xfb, 0x54, 0x68,
+ 0x7, 0xba, 0x87, 0x9d, 0x8a, 0x6c, 0x1a, 0xfb,
+ 0x8b, 0xfc, 0x31, 0x6f, 0xa, 0x58, 0xf8, 0x18,
+ 0x5, 0x8a, 0x96, 0x8b, 0x94, 0x92, 0x1a, 0xa7,
+ 0xa7, 0x8d, 0xbb, 0x8f, 0x1e, 0x61, 0xa, 0xc7,
+ 0x89, 0x93, 0x82, 0x94, 0x51, 0x8, 0xe, 0xf7,
+ 0x77, 0x8e, 0x76, 0xf7, 0x8b, 0x77, 0xf8, 0x3d,
+ 0xae, 0x1, 0xf7, 0x70, 0x79, 0x15, 0xa8, 0x6,
+ 0xf7, 0x7b, 0xf8, 0x7a, 0x5, 0x8d, 0x6, 0xc6,
+ 0xfc, 0x7a, 0x5, 0xa8, 0x6, 0xf7, 0xa8, 0xf8,
+ 0xcf, 0xab, 0xcb, 0xaa, 0x98, 0xaa, 0x90, 0x19,
+ 0xad, 0xfb, 0x4f, 0x68, 0x7, 0xb8, 0x8e, 0x9d,
+ 0x81, 0x74, 0x1a, 0x7d, 0x86, 0x7a, 0x81, 0x77,
+ 0x1e, 0xfb, 0x2e, 0xfb, 0xd8, 0x6f, 0xa, 0x6a,
+ 0xf7, 0xb8, 0x5, 0x88, 0xa4, 0x89, 0xa0, 0x9e,
+ 0x1a, 0xaa, 0x99, 0x9b, 0xbb, 0x8c, 0x1e, 0xae,
+ 0xfb, 0xa1, 0x69, 0x7, 0xbe, 0x83, 0x9f, 0x92,
+ 0x2a, 0x1a, 0xfb, 0x28, 0xfb, 0xc8, 0x6f, 0xa,
+ 0x64, 0xf7, 0xe0, 0x5, 0x8a, 0x94, 0x8b, 0x93,
+ 0x92, 0x1a, 0xb0, 0xa8, 0x94, 0xab, 0x8e, 0x1e,
+ 0xae, 0xfb, 0xa9, 0x69, 0x7, 0xcb, 0x80, 0x8d,
+ 0x94, 0x96, 0x43, 0x8, 0xe, 0x90, 0x58, 0xa,
+ 0x1, 0x73, 0x16, 0xf7, 0x6a, 0xae, 0x6, 0x74,
+ 0x8d, 0x57, 0x90, 0xae, 0x1a, 0xf7, 0x42, 0xf7,
+ 0x4f, 0x5, 0x95, 0x63, 0xba, 0x20, 0x60, 0x1a,
+ 0x69, 0x6b, 0x89, 0x67, 0x88, 0x1e, 0x68, 0xf7,
+ 0xc8, 0xae, 0x7, 0x3f, 0x92, 0x7e, 0xa2, 0x70,
+ 0xe1, 0x41, 0xf7, 0x77, 0x18, 0xf7, 0x5b, 0xf7,
+ 0x57, 0xbf, 0xc1, 0xa3, 0x8e, 0xa2, 0x8f, 0x19,
+ 0xae, 0xfb, 0x5f, 0x68, 0x7, 0xac, 0x88, 0xa6,
+ 0x7b, 0x7b, 0x1a, 0x87, 0x8a, 0x87, 0x87, 0x87,
+ 0x1e, 0xfb, 0x38, 0xfb, 0x3a, 0x5, 0x7c, 0xbf,
+ 0x67, 0xda, 0x9e, 0x1a, 0xad, 0x9a, 0xa2, 0xc6,
+ 0x91, 0x1e, 0xae, 0xfb, 0xc5, 0x68, 0x7, 0xbf,
+ 0x86, 0xa3, 0x83, 0x9a, 0x59, 0xdf, 0xfb, 0x9a,
+ 0x18, 0x4f, 0x4c, 0xfb, 0x3, 0xfb, 0xc, 0x47,
+ 0x50, 0x75, 0x78, 0x84, 0x87, 0x6c, 0x82, 0x8,
+ 0xe, 0x58, 0x58, 0xa, 0x1, 0xd4, 0x16, 0xf7,
+ 0xd6, 0xae, 0x6, 0x5d, 0x8d, 0x6c, 0x8c, 0xb4,
+ 0x1a, 0xc7, 0xf7, 0x79, 0x6a, 0xa, 0xc4, 0x88,
+ 0xa3, 0x80, 0x78, 0x1a, 0x81, 0x87, 0x7f, 0x81,
+ 0x7e, 0x1e, 0xfb, 0x2f, 0xfb, 0x6a, 0x48, 0xf7,
+ 0x5c, 0x8d, 0x83, 0x81, 0xa5, 0x19, 0x87, 0x95,
+ 0x88, 0x96, 0x92, 0x1a, 0xa6, 0xa8, 0x94, 0xb9,
+ 0x6a, 0x1d, 0x4f, 0xfb, 0x62, 0x79, 0x4b, 0x72,
+ 0x88, 0x51, 0x86, 0x19, 0xe, 0x58, 0x58, 0xa,
+ 0x3e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x33, 0xb8,
+ 0xf9, 0x7b, 0xb8, 0x1, 0x66, 0xfb, 0x33, 0x15,
+ 0xf7, 0x6f, 0x6, 0x92, 0xb8, 0x5, 0x3b, 0x6,
+ 0x7f, 0x76, 0x8b, 0xa3, 0x1f, 0xf7, 0x32, 0xf9,
+ 0x24, 0x5, 0xc6, 0x99, 0x8a, 0x8f, 0xb0, 0x1b,
+ 0xd2, 0x6, 0x92, 0xb8, 0x5, 0xfb, 0x5c, 0x6,
+ 0xe, 0xfc, 0x14, 0xfb, 0x1c, 0x76, 0xf7, 0x34,
+ 0x8d, 0x1d, 0xf7, 0x1e, 0xfb, 0x31, 0x15, 0xc6,
+ 0x6, 0x32, 0xf9, 0xde, 0x5, 0x50, 0x6, 0xe,
+ 0xfb, 0xdd, 0xfb, 0x31, 0xb8, 0xf9, 0x79, 0xb8,
+ 0x1, 0x64, 0xfb, 0x4, 0x15, 0x84, 0x5e, 0x5,
+ 0xf7, 0x5b, 0x6, 0xf7, 0x5c, 0xf9, 0xd3, 0x5,
+ 0xfb, 0x70, 0x6, 0x84, 0x5e, 0x5, 0xd9, 0x6,
+ 0x96, 0xa3, 0x88, 0x75, 0x1f, 0xfb, 0x31, 0xfd,
+ 0x21, 0x5, 0x51, 0x7d, 0x89, 0x86, 0x66, 0x1b,
+ 0xe, 0x2f, 0xf7, 0xd9, 0x76, 0xf8, 0x1, 0x77,
+ 0x1, 0xce, 0xf7, 0xc4, 0x15, 0xe4, 0x6, 0xf7,
+ 0x15, 0xf7, 0xa1, 0xf7, 0x15, 0xfb, 0xa1, 0x5,
+ 0xe4, 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b,
+ 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4,
+ 0x59, 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x7f, 0x1d,
+ 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x90, 0xf8, 0x98,
+ 0x7b, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0x5, 0x98,
+ 0x80, 0x7a, 0xa0, 0x70, 0x1b, 0x70, 0x78, 0x75,
+ 0x76, 0x76, 0xa0, 0x78, 0x98, 0x82, 0x1f, 0xe,
+ 0x58, 0x1d, 0xb5, 0x85, 0x77, 0x74, 0xa, 0x13,
+ 0x68, 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x2e, 0x1d,
+ 0x13, 0x98, 0x71, 0xa, 0x90, 0x94, 0x44, 0xa,
+ 0x5, 0xfb, 0x3, 0x6, 0x7a, 0x4d, 0x6f, 0xa,
+ 0x13, 0xa8, 0xa4, 0x87, 0x8a, 0xb6, 0x4f, 0x1b,
+ 0xfb, 0xe, 0xfb, 0x33, 0x2f, 0x1d, 0xcc, 0xd5,
+ 0xf7, 0x84, 0xdf, 0x94, 0xad, 0x39, 0xa, 0xe,
+ 0x7e, 0xac, 0xf8, 0xa, 0xcf, 0xf7, 0x81, 0x77,
+ 0x1, 0xf7, 0xd3, 0xf7, 0x11, 0x3, 0xf7, 0x5a,
+ 0xf8, 0xc, 0x15, 0x89, 0x8d, 0xe3, 0xf7, 0xd5,
+ 0x42, 0x77, 0x1d, 0x65, 0xfb, 0x2d, 0xfc, 0x83,
+ 0x6e, 0x1a, 0x77, 0xc1, 0x63, 0xe0, 0xf7, 0x3b,
+ 0xf7, 0x2c, 0xf7, 0x3e, 0xf7, 0x3d, 0xd9, 0x5b,
+ 0xc5, 0x4d, 0x4c, 0x64, 0x63, 0x5d, 0x69, 0x1e,
+ 0x32, 0xfb, 0xd9, 0x15, 0x8c, 0xc7, 0xf7, 0xea,
+ 0xf3, 0xb9, 0x8b, 0x58, 0x7a, 0x36, 0x4a, 0xfb,
+ 0x71, 0xfb, 0x5, 0x86, 0x70, 0x8b, 0xaa, 0x1e,
+ 0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf7, 0x8f, 0xf7,
+ 0x34, 0x6a, 0xac, 0x12, 0x86, 0xf7, 0x14, 0x13,
+ 0xb0, 0xf7, 0xd2, 0xf7, 0x21, 0x15, 0x51, 0x63,
+ 0x66, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0x95, 0xdb,
+ 0xd2, 0xc7, 0xf7, 0x6d, 0xe2, 0x94, 0x99, 0x87,
+ 0x7e, 0x83, 0x85, 0x83, 0x85, 0x81, 0x1f, 0x86,
+ 0x82, 0x87, 0x81, 0x7e, 0x1a, 0x13, 0xd0, 0x84,
+ 0x1d, 0x67, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x24,
+ 0xfb, 0x3c, 0xfb, 0x2d, 0xfb, 0x3, 0xde, 0x60,
+ 0xcd, 0xf5, 0xbe, 0xd3, 0xcb, 0xb8, 0x1e, 0xe,
+ 0x7e, 0xd3, 0x5a, 0x76, 0xf8, 0x43, 0xb5, 0xf7,
+ 0x81, 0x77, 0x12, 0x76, 0xf7, 0x10, 0x13, 0x78,
+ 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x84, 0x6c, 0x88,
+ 0x79, 0x7b, 0x1a, 0x4e, 0xc0, 0x8b, 0x92, 0xd1,
+ 0xc2, 0xe2, 0xb2, 0xa3, 0x1e, 0x75, 0x9b, 0x5,
+ 0x84, 0x90, 0x55, 0x4b, 0x76, 0x1b, 0x86, 0x88,
+ 0x8f, 0x94, 0x1f, 0xf7, 0x3c, 0xf9, 0x6, 0x68,
+ 0x83, 0x5d, 0x80, 0xfb, 0x14, 0x81, 0x6d, 0xa,
+ 0xb6, 0x9e, 0x85, 0x73, 0x7c, 0x72, 0x35, 0x75,
+ 0x38, 0x1f, 0x99, 0x7d, 0x83, 0x9e, 0x60, 0x1b,
+ 0xfb, 0x8, 0xfb, 0x37, 0xfb, 0x55, 0xfb, 0x2f,
+ 0x1f, 0x13, 0xb8, 0x5f, 0xa2, 0x38, 0xde, 0xe1,
+ 0xbb, 0xd9, 0xbc, 0xa8, 0x1e, 0xfb, 0x25, 0x16,
+ 0xd1, 0xcf, 0xf7, 0x80, 0xe2, 0xb0, 0x98, 0x5d,
+ 0x85, 0x6e, 0x47, 0xfb, 0xac, 0x2c, 0x63, 0x89,
+ 0xbd, 0x90, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb,
+ 0xf8, 0x21, 0xac, 0x1, 0x90, 0xf7, 0x16, 0xf7,
+ 0x3f, 0xe7, 0x3, 0x50, 0x1d, 0xf7, 0x7, 0xc2,
+ 0x1a, 0xd3, 0x47, 0x93, 0x68, 0xfb, 0x37, 0xfb,
+ 0x13, 0xfb, 0x55, 0xfb, 0x1c, 0xfb, 0x4, 0xdf,
+ 0x69, 0x35, 0xa, 0x8e, 0xda, 0x9e, 0x8d, 0x97,
+ 0x3d, 0xa, 0x65, 0x82, 0x57, 0x70, 0x3a, 0xfb,
+ 0x17, 0x68, 0x1f, 0xe, 0xfb, 0xdd, 0xfb, 0x61,
+ 0xaa, 0xf8, 0xd9, 0xb5, 0xf7, 0x70, 0xa8, 0x1,
+ 0xb2, 0xf8, 0x2b, 0x15, 0xd4, 0x6, 0x76, 0x3b,
+ 0x63, 0xfb, 0x57, 0x70, 0xfb, 0x9, 0x8, 0xfb,
+ 0x1c, 0x6e, 0x7c, 0x56, 0x5b, 0x1b, 0x80, 0x86,
+ 0x90, 0x92, 0x8e, 0x8f, 0x90, 0x8f, 0x92, 0x1f,
+ 0x8f, 0x92, 0x8f, 0x93, 0x96, 0x1a, 0xaf, 0x66,
+ 0x98, 0x7e, 0x74, 0x6f, 0x79, 0x6c, 0x4f, 0xb8,
+ 0x73, 0xbf, 0xf7, 0x43, 0xb3, 0xf7, 0x67, 0xf8,
+ 0x25, 0xe1, 0x1e, 0xe5, 0x6, 0x94, 0xb5, 0x5,
+ 0x2f, 0x6, 0xf7, 0x3, 0xa6, 0xaa, 0xf7, 0x1,
+ 0xbe, 0x1b, 0x93, 0x94, 0x88, 0x80, 0x88, 0x87,
+ 0x87, 0x87, 0x84, 0x1f, 0x87, 0x84, 0x87, 0x83,
+ 0x80, 0x1a, 0x6e, 0xa0, 0x76, 0xa6, 0xa3, 0xa7,
+ 0x99, 0xb2, 0x9f, 0x81, 0xc7, 0x33, 0xfb, 0x12,
+ 0x49, 0xfb, 0x5, 0xfb, 0x1c, 0x68, 0x1e, 0x42,
+ 0x6, 0xe, 0xfb, 0x5f, 0xad, 0xf7, 0x4c, 0x76,
+ 0xf7, 0x33, 0xaa, 0x74, 0x77, 0xf7, 0xb6, 0xaa,
+ 0x12, 0x57, 0xe2, 0xf7, 0x7b, 0xf7, 0x1, 0x40,
+ 0xf7, 0x9, 0x13, 0xde, 0xd9, 0x93, 0x15, 0x89,
+ 0x7, 0x4c, 0x7b, 0x48, 0x7a, 0x42, 0x1a, 0x3f,
+ 0xf3, 0x70, 0xdb, 0xf7, 0x3f, 0xd3, 0xda, 0xd0,
+ 0xda, 0x44, 0xa6, 0x3d, 0xa0, 0x1e, 0x30, 0xa6,
+ 0x7e, 0x97, 0x9b, 0x1a, 0x96, 0x99, 0xa2, 0x98,
+ 0x1e, 0x13, 0xed, 0x92, 0x92, 0x8a, 0x88, 0x92,
+ 0x1f, 0x88, 0x93, 0x93, 0x8a, 0x96, 0x1b, 0xf7,
+ 0x1, 0xf7, 0x3, 0xcc, 0xf7, 0x4, 0x9f, 0x89,
+ 0x93, 0x87, 0x9a, 0x1f, 0xce, 0xc3, 0xfb, 0x3,
+ 0x6, 0x9e, 0x73, 0x67, 0x99, 0x5b, 0x1b, 0xfb,
+ 0x28, 0x3f, 0x25, 0x3e, 0x54, 0xa8, 0x64, 0xbe,
+ 0x78, 0x1f, 0x4b, 0x68, 0x6b, 0x79, 0x5e, 0x1a,
+ 0x60, 0xb7, 0x7b, 0x9a, 0x86, 0x1e, 0x13, 0xee,
+ 0xae, 0x7d, 0x15, 0xa7, 0xf7, 0x11, 0x63, 0x56,
+ 0x4f, 0x32, 0x81, 0x5e, 0x40, 0x75, 0xab, 0xb0,
+ 0xbe, 0xd4, 0xb6, 0x90, 0x1f, 0xb1, 0xf7, 0x92,
+ 0x15, 0x13, 0xed, 0xac, 0xa7, 0xf7, 0x2a, 0xd6,
+ 0xaf, 0x95, 0x68, 0x70, 0x5b, 0x68, 0xfb, 0x1d,
+ 0x45, 0x5f, 0x8b, 0xb9, 0x9d, 0x1e, 0xe, 0x89,
+ 0x1d, 0xf7, 0x81, 0x77, 0x12, 0x13, 0x70, 0x7e,
+ 0x83, 0xa, 0xa4, 0xe3, 0xae, 0xf7, 0xa, 0xb4,
+ 0xc9, 0x8, 0xb6, 0xa7, 0xbe, 0xda, 0xb5, 0x1b,
+ 0x9e, 0x8f, 0x7c, 0x83, 0x7d, 0x70, 0x44, 0x73,
+ 0x41, 0x1f, 0x78, 0x4f, 0x79, 0x4e, 0x68, 0x1a,
+ 0x13, 0xb0, 0x6a, 0xa1, 0x6f, 0xb6, 0xdd, 0xb8,
+ 0xd3, 0xcb, 0xb4, 0x1e, 0x75, 0x9a, 0x5, 0x77,
+ 0x88, 0x53, 0x4d, 0x8f, 0xa, 0x90, 0x96, 0x90,
+ 0xa0, 0xc5, 0xa1, 0xcb, 0x1f, 0xa3, 0xd0, 0xa3,
+ 0xd6, 0x9f, 0x1a, 0xda, 0x53, 0x9b, 0x75, 0x59,
+ 0x50, 0x6f, 0xfb, 0x26, 0x29, 0x1e, 0x89, 0x8c,
+ 0xf5, 0xf8, 0x2e, 0x40, 0x7c, 0x53, 0x83, 0x3e,
+ 0x84, 0x82, 0x1d, 0x66, 0x1d, 0xf8, 0xc3, 0xf7,
+ 0x1a, 0x4d, 0x1d, 0x53, 0x55, 0x73, 0x88, 0x1d,
+ 0x8f, 0x95, 0x32, 0x1d, 0xa9, 0x8b, 0x6b, 0x1f,
+ 0x34, 0x1d, 0xfb, 0x2, 0xf8, 0x7f, 0x15, 0x41,
+ 0x1d, 0xe, 0xfc, 0x14, 0xfb, 0x4e, 0x76, 0xf9,
+ 0x89, 0xf7, 0x1a, 0x1, 0xaa, 0xf8, 0x2b, 0x15,
+ 0xbb, 0x99, 0x85, 0x72, 0x1f, 0x23, 0xfc, 0x39,
+ 0x5, 0x36, 0x75, 0x7c, 0x5d, 0x67, 0x1b, 0x81,
+ 0x7f, 0x92, 0x90, 0x8f, 0x8e, 0x90, 0x8f, 0x90,
+ 0x1f, 0x8f, 0x91, 0x8f, 0x91, 0x97, 0x1a, 0xb3,
+ 0x65, 0x94, 0x80, 0x73, 0x72, 0x76, 0x6b, 0x6f,
+ 0xa0, 0x5a, 0xe0, 0xe4, 0xd6, 0xc9, 0xf7, 0x3d,
+ 0xb7, 0x1e, 0xf7, 0x6, 0xf8, 0x4a, 0x45, 0x7c,
+ 0x7b, 0x89, 0xfb, 0xe, 0x80, 0x19, 0xf7, 0x5,
+ 0xf7, 0x4c, 0x15, 0x41, 0x1d, 0xe, 0x83, 0xd2,
+ 0x61, 0x76, 0xf8, 0x55, 0x77, 0xf7, 0xa2, 0x77,
+ 0x12, 0x13, 0x70, 0x74, 0x16, 0xf7, 0xe, 0x6,
+ 0xbd, 0xf7, 0x50, 0xb2, 0xa6, 0x5, 0x13, 0xb0,
+ 0xfb, 0xe, 0xa1, 0xa3, 0x26, 0xd9, 0x1b, 0xd0,
+ 0xb5, 0xdb, 0xb7, 0xa3, 0x1f, 0x75, 0x96, 0x5,
+ 0x76, 0x7f, 0x74, 0x60, 0x71, 0x1b, 0x69, 0x7d,
+ 0xd3, 0xf7, 0x32, 0x6c, 0x1f, 0xca, 0xc2, 0xd7,
+ 0xce, 0xa2, 0x85, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+ 0x63, 0x68, 0x7, 0xa5, 0xa4, 0x89, 0x74, 0x68,
+ 0xfb, 0xf, 0x39, 0x65, 0x6d, 0x1f, 0x89, 0x8d,
+ 0xf7, 0xe, 0xf8, 0x5b, 0x4c, 0x7f, 0x38, 0x7f,
+ 0x4d, 0x85, 0x82, 0x1d, 0x66, 0x1d, 0xf9, 0x58,
+ 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x87,
+ 0x8f, 0x95, 0x9f, 0x9b, 0xc5, 0x91, 0xa1, 0x1f,
+ 0xf7, 0x25, 0xf8, 0x9f, 0x7f, 0xa, 0xac, 0x8d,
+ 0x6c, 0x1f, 0x5c, 0xfb, 0x22, 0xfc, 0x54, 0x4f,
+ 0x1a, 0x7d, 0x8b, 0x56, 0xcf, 0xdb, 0xb7, 0xd0,
+ 0xce, 0xb7, 0x1e, 0xe, 0xf7, 0x8, 0x97, 0x76,
+ 0xa9, 0x76, 0xf8, 0x19, 0xd4, 0x12, 0x13, 0x60,
+ 0x7d, 0x83, 0xa, 0xf8, 0x0, 0xe8, 0xf7, 0x3,
+ 0xa4, 0x92, 0x1b, 0xb8, 0x4d, 0xfb, 0x2e, 0xfb,
+ 0x7f, 0x41, 0x1f, 0xf7, 0xc, 0x6, 0xbd, 0xf7,
+ 0x38, 0x99, 0xb8, 0xb0, 0xcb, 0x8e, 0x91, 0xde,
+ 0xf7, 0x5, 0xad, 0x8c, 0x8, 0x94, 0x91, 0x83,
+ 0x78, 0x7d, 0x6b, 0x38, 0x72, 0x3c, 0x1f, 0x7a,
+ 0x56, 0x7d, 0x57, 0x6e, 0x1a, 0x13, 0xa0, 0x4a,
+ 0xc0, 0x8b, 0x9c, 0xdb, 0xb9, 0xd9, 0xc0, 0xaa,
+ 0x1e, 0x75, 0x98, 0x5, 0x73, 0x88, 0x57, 0x58,
+ 0x76, 0x1b, 0x86, 0x87, 0x90, 0x94, 0x9d, 0x9f,
+ 0xc3, 0xa0, 0xc7, 0x1f, 0xa2, 0xce, 0xa4, 0xd4,
+ 0xae, 0x1a, 0xb7, 0x73, 0xae, 0x54, 0x39, 0x50,
+ 0x37, 0x3a, 0x58, 0x1e, 0x8a, 0x8d, 0x5, 0x94,
+ 0xa2, 0x99, 0xad, 0xb2, 0x1a, 0xce, 0x4e, 0x8b,
+ 0x86, 0x32, 0x4a, 0x27, 0x32, 0x51, 0x1e, 0x88,
+ 0x8d, 0xc7, 0xf7, 0x4e, 0x46, 0x7b, 0x72, 0x89,
+ 0x21, 0x82, 0x6d, 0xa, 0x9a, 0xb2, 0x8e, 0x6e,
+ 0x1f, 0x13, 0x60, 0x6a, 0x5e, 0xfb, 0x1f, 0x52,
+ 0xfb, 0x65, 0x1e, 0xe, 0x89, 0x1d, 0x12, 0x13,
+ 0x60, 0x78, 0xa, 0xaf, 0x6d, 0x2e, 0x30, 0x6d,
+ 0x1f, 0x77, 0x4f, 0x78, 0x50, 0x6c, 0x1a, 0x13,
+ 0xa0, 0x76, 0x1d, 0x6a, 0x81, 0x62, 0x61, 0x76,
+ 0x1b, 0x84, 0x86, 0x90, 0x97, 0x99, 0x9f, 0xc4,
+ 0xa0, 0xc9, 0x1f, 0xa1, 0xcd, 0xa3, 0xd4, 0xad,
+ 0x4f, 0xa, 0x13, 0x60, 0x88, 0xa, 0xe, 0x7e,
+ 0xa8, 0xf8, 0x35, 0xa8, 0x52, 0x1d, 0xe1, 0x15,
+ 0xcb, 0xbf, 0xf7, 0xaf, 0xf7, 0x0, 0xa5, 0x9f,
+ 0x7d, 0x59, 0x40, 0x4f, 0xfb, 0xaa, 0x2b, 0x57,
+ 0x8d, 0xbd, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, 0x15,
+ 0x2b, 0xd7, 0x56, 0xdd, 0xf7, 0x34, 0xf7, 0x12,
+ 0xf7, 0x40, 0xf7, 0x29, 0xf7, 0x1a, 0xfb, 0x9,
+ 0x9f, 0x65, 0xfb, 0x32, 0xfb, 0x17, 0xfb, 0x40,
+ 0xfb, 0x2e, 0x1e, 0xe, 0x87, 0x1d, 0x59, 0x1d,
+ 0x78, 0x6b, 0x43, 0x44, 0xfb, 0x8a, 0x4f, 0x1d,
+ 0x57, 0x1f, 0x88, 0x8e, 0xad, 0xf2, 0x44, 0x7d,
+ 0x64, 0x87, 0x38, 0x81, 0x6d, 0xa, 0xaf, 0x9d,
+ 0x89, 0x72, 0x75, 0x4a, 0xfb, 0x85, 0x4f, 0xfb,
+ 0x8f, 0x1f, 0x69, 0x83, 0x6d, 0x87, 0xa, 0x6d,
+ 0x8d, 0xab, 0xa1, 0xa8, 0xe3, 0x93, 0xac, 0x1f,
+ 0xe, 0xfb, 0x61, 0xb0, 0xf7, 0x2f, 0xd3, 0xf7,
+ 0xfc, 0xb6, 0x7e, 0x77, 0x12, 0x8c, 0xf7, 0x11,
+ 0x13, 0xd8, 0xf3, 0xfb, 0x3c, 0x15, 0x66, 0xf7,
+ 0x9f, 0xb0, 0x7, 0x68, 0x6d, 0x8b, 0xa9, 0xa0,
+ 0xf7, 0x13, 0xf8, 0x37, 0xb1, 0xf7, 0x27, 0x1f,
+ 0xfb, 0x1, 0x6, 0x7d, 0x54, 0x6f, 0xa, 0x13,
+ 0xe8, 0xab, 0x86, 0x84, 0xaf, 0x4b, 0x1b, 0xfb,
+ 0x13, 0xfb, 0x22, 0xfb, 0x60, 0xfb, 0x11, 0x6a,
+ 0x8b, 0xfb, 0x5, 0xf4, 0xd4, 0xb8, 0xc5, 0xb9,
+ 0xa7, 0x1f, 0x8d, 0x89, 0x4f, 0xfb, 0x77, 0x83,
+ 0x6d, 0x6d, 0x8e, 0x57, 0x88, 0x19, 0xa1, 0xf7,
+ 0xc1, 0x15, 0xd6, 0xdc, 0xf7, 0x67, 0xdd, 0xa7,
+ 0x93, 0x70, 0x74, 0x54, 0x4a, 0xfb, 0x93, 0x2e,
+ 0x62, 0x8b, 0xbc, 0xa4, 0x1e, 0xe, 0xfb, 0xa5,
+ 0xa0, 0x76, 0xf8, 0x62, 0x77, 0x1, 0x76, 0x83,
+ 0xa, 0xab, 0xe8, 0x95, 0xbb, 0xa5, 0xce, 0x8,
+ 0xc0, 0xa1, 0xbf, 0xef, 0xa7, 0x1b, 0x91, 0x91,
+ 0x83, 0x83, 0x92, 0x1f, 0x81, 0x94, 0x98, 0x7f,
+ 0x9e, 0x1b, 0xaa, 0xa7, 0xa6, 0xb9, 0xcd, 0x55,
+ 0x8b, 0x87, 0x49, 0x50, 0xfb, 0xc, 0x51, 0x68,
+ 0x1f, 0xc3, 0xf7, 0x46, 0x48, 0x7a, 0x6c, 0x89,
+ 0x25, 0x82, 0x6d, 0xa, 0xaf, 0x9d, 0x89, 0x72,
+ 0x6b, 0x5a, 0xfb, 0x3c, 0x56, 0xfb, 0x48, 0x1f,
+ 0xe, 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x51, 0xac,
+ 0x87, 0x77, 0x12, 0x8e, 0xa6, 0xf7, 0x2d, 0xeb,
+ 0xa4, 0xa8, 0x13, 0xdc, 0x85, 0xa, 0x96, 0x95,
+ 0x87, 0x86, 0x97, 0x1f, 0x86, 0x9a, 0x9c, 0x85,
+ 0xa3, 0x1b, 0xcb, 0xe4, 0xb0, 0xec, 0xba, 0x6f,
+ 0xb6, 0x6c, 0xb3, 0x1f, 0x66, 0xbb, 0x62, 0xb5,
+ 0xad, 0x1a, 0x90, 0x87, 0xbc, 0xc0, 0xc6, 0xa4,
+ 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5, 0x13,
+ 0xbc, 0x79, 0xa, 0x7b, 0x82, 0x91, 0x90, 0x80,
+ 0x1f, 0x91, 0x80, 0x7e, 0x90, 0x72, 0x1b, 0x4a,
+ 0x3c, 0x67, 0x32, 0x62, 0xaa, 0x5f, 0xab, 0x60,
+ 0x1f, 0xae, 0x5c, 0xb1, 0x5c, 0x60, 0x1a, 0x72,
+ 0x78, 0x6d, 0x65, 0x82, 0x43, 0x7c, 0xa, 0xe,
+ 0x66, 0x1d, 0xf8, 0x34, 0xb5, 0xf7, 0x25, 0x77,
+ 0x1, 0xf7, 0x5f, 0xf7, 0x21, 0x15, 0x79, 0x89,
+ 0x55, 0x4e, 0x72, 0x1b, 0x84, 0x87, 0x8f, 0x95,
+ 0xad, 0xc1, 0xf7, 0x43, 0xac, 0xf7, 0xe, 0x1f,
+ 0xde, 0xb5, 0x43, 0x6, 0xb2, 0xf7, 0x25, 0x5,
+ 0x68, 0x6, 0x47, 0x21, 0x3f, 0x6c, 0x64, 0x7c,
+ 0x8, 0x68, 0xbe, 0x7, 0x5f, 0xfb, 0x32, 0x5b,
+ 0xfb, 0x2a, 0x62, 0x1a, 0x84, 0x8b, 0x4f, 0xd3,
+ 0xd9, 0xbc, 0xd9, 0xc5, 0xb0, 0x1e, 0xe, 0x64,
+ 0xa, 0xac, 0x77, 0x12, 0x13, 0xc0, 0x2c, 0x1d,
+ 0x56, 0x4d, 0x73, 0x1b, 0x84, 0x87, 0x91, 0x98,
+ 0x31, 0xa, 0x63, 0xa0, 0xc2, 0xaf, 0x96, 0x1f,
+ 0x13, 0xa0, 0x44, 0x1d, 0xa1, 0x88, 0x71, 0x6e,
+ 0x78, 0x50, 0x79, 0x4f, 0x1f, 0x78, 0x4d, 0x78,
+ 0x4b, 0x68, 0x47, 0xa, 0xe, 0xfb, 0x6e, 0x93,
+ 0x76, 0xf8, 0x6f, 0x77, 0x1, 0xda, 0xf7, 0xf,
+ 0xdd, 0xf7, 0x9, 0x3, 0xe0, 0x7e, 0x15, 0xa5,
+ 0x6, 0xf7, 0x3e, 0xf7, 0x32, 0xf7, 0xc, 0xf7,
+ 0x29, 0xef, 0x1a, 0xb6, 0x68, 0xa4, 0x6f, 0x73,
+ 0x6d, 0x73, 0x6a, 0x76, 0x95, 0x7d, 0x95, 0x7f,
+ 0x1e, 0x97, 0x7d, 0x97, 0x80, 0x79, 0x1a, 0x6f,
+ 0x75, 0x60, 0x23, 0xfb, 0x8, 0x1e, 0xf7, 0x4e,
+ 0x82, 0xcf, 0x75, 0xdb, 0x1e, 0x4f, 0x7c, 0x63,
+ 0x86, 0x54, 0x83, 0x8, 0x70, 0x7, 0xaa, 0xa5,
+ 0x87, 0x6a, 0x1f, 0x86, 0x8c, 0x85, 0x84, 0x1a,
+ 0xe, 0x90, 0x93, 0x76, 0xf7, 0x5f, 0x77, 0xf7,
+ 0xb8, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf7, 0xe2,
+ 0xd7, 0x3, 0xea, 0x7e, 0x15, 0xa6, 0x6, 0xda,
+ 0xf7, 0xd, 0xdb, 0xf7, 0x22, 0x94, 0x9e, 0x8,
+ 0x8d, 0x6, 0x8f, 0x5d, 0x9c, 0xfb, 0x67, 0x8d,
+ 0x72, 0x8, 0xa6, 0x6, 0xb5, 0xb7, 0xf7, 0x7a,
+ 0xf7, 0x85, 0xf7, 0x11, 0x1a, 0xb9, 0x66, 0x9e,
+ 0x73, 0x6a, 0x74, 0x6b, 0x70, 0x77, 0x95, 0x7d,
+ 0x95, 0x7d, 0x1e, 0x95, 0x7d, 0x96, 0x7d, 0x79,
+ 0x1a, 0x62, 0x37, 0x2a, 0x68, 0x62, 0x1e, 0x6b,
+ 0xf7, 0xe0, 0x5, 0x70, 0x6, 0x52, 0x30, 0x5d,
+ 0x31, 0x58, 0x30, 0x8, 0x89, 0x6, 0xf7, 0x12,
+ 0x7e, 0xd3, 0x77, 0xd5, 0x1e, 0x5e, 0x82, 0x5d,
+ 0x81, 0x4b, 0x82, 0x8, 0x70, 0x7, 0xab, 0xa5,
+ 0x8b, 0x69, 0x1f, 0x85, 0x8c, 0x84, 0x83, 0x1a,
+ 0xe, 0x93, 0x76, 0xe9, 0x77, 0xb4, 0x77, 0xf8,
+ 0x10, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0x22, 0x15,
+ 0xfb, 0xa, 0x9f, 0xab, 0x66, 0xba, 0x1b, 0xcd,
+ 0xc4, 0xdf, 0xb1, 0xa5, 0x1f, 0x76, 0x99, 0x5,
+ 0x68, 0x76, 0x75, 0x75, 0x78, 0x1b, 0x78, 0x7c,
+ 0x99, 0xb0, 0x83, 0x1f, 0x6b, 0xf7, 0x30, 0x5,
+ 0x9f, 0x99, 0xb6, 0xd6, 0xae, 0x1b, 0x97, 0x92,
+ 0x86, 0x86, 0x93, 0x1f, 0x86, 0x92, 0x93, 0x86,
+ 0x99, 0x1b, 0xac, 0xa3, 0xa5, 0xa5, 0xa3, 0x74,
+ 0xb1, 0x6a, 0x57, 0x69, 0x6a, 0x22, 0x41, 0x1f,
+ 0x7b, 0xd9, 0x82, 0xab, 0x77, 0xa7, 0xfb, 0x3b,
+ 0x73, 0x18, 0x70, 0x7, 0x8c, 0x95, 0x98, 0x8c,
+ 0x96, 0x1b, 0x9e, 0xa4, 0x8b, 0x48, 0x98, 0x1f,
+ 0xa9, 0xfb, 0x2e, 0x5, 0x34, 0x55, 0x7c, 0x73,
+ 0x75, 0x1b, 0x7f, 0x85, 0x91, 0x91, 0x81, 0x1f,
+ 0x8f, 0x83, 0x81, 0x90, 0x7b, 0x1b, 0x68, 0x77,
+ 0x6c, 0x73, 0x7b, 0x94, 0x5f, 0xc0, 0xc2, 0xcb,
+ 0xd4, 0xdd, 0xb1, 0x1f, 0xe, 0x79, 0x1d, 0x1,
+ 0xf7, 0xdc, 0xcb, 0x3, 0x45, 0xa, 0x95, 0x94,
+ 0x7c, 0x1e, 0x93, 0x7e, 0x7d, 0x93, 0x79, 0x38,
+ 0x1d, 0x6a, 0x99, 0x80, 0x99, 0x81, 0x1e, 0x98,
+ 0x82, 0x99, 0x83, 0x75, 0x7a, 0xa, 0xe, 0xfb,
+ 0xa5, 0x52, 0x76, 0xf8, 0x46, 0xe8, 0x1, 0x79,
+ 0x74, 0x15, 0xa7, 0xb1, 0x8b, 0x8b, 0x9a, 0x1b,
+ 0xa4, 0xa4, 0x79, 0x78, 0xa8, 0x1f, 0x75, 0xac,
+ 0xb2, 0x73, 0xc0, 0x76, 0xa, 0x7f, 0x8e, 0x83,
+ 0x8f, 0x85, 0x1f, 0x91, 0x82, 0x92, 0x86, 0x82,
+ 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x6f, 0x81, 0xa6,
+ 0xac, 0x7a, 0x1e, 0x7a, 0xab, 0x72, 0xb1, 0x51,
+ 0xa2, 0x80, 0xa, 0xfb, 0x2b, 0x70, 0x1d, 0xfb,
+ 0xf9, 0x5, 0xe, 0x8a, 0xa, 0x12, 0xa7, 0xf3,
+ 0x60, 0xf1, 0x13, 0xe0, 0xf7, 0x69, 0xfb, 0x43,
+ 0x15, 0x47, 0x95, 0x7e, 0xad, 0xaf, 0x1a, 0x13,
+ 0xd0, 0xc5, 0xc6, 0xf7, 0x2f, 0xc0, 0x1a, 0xb7,
+ 0x77, 0x9b, 0x47, 0x9c, 0x1e, 0x8d, 0x7, 0xf1,
+ 0x9d, 0xa6, 0xa5, 0x9d, 0xd2, 0xb8, 0xf7, 0x47,
+ 0x18, 0x9d, 0xd1, 0xae, 0xb8, 0xe0, 0x9a, 0x8e,
+ 0x97, 0x18, 0xfb, 0x19, 0x37, 0x77, 0xfb, 0xe,
+ 0x6c, 0x1f, 0x5d, 0xfb, 0x47, 0x7a, 0x49, 0x6f,
+ 0x6c, 0x2f, 0x78, 0x19, 0xc4, 0x7d, 0xa6, 0x79,
+ 0x60, 0x1a, 0x13, 0xe0, 0x64, 0x4e, 0xfb, 0x41,
+ 0x52, 0x1a, 0x4b, 0xb2, 0x6f, 0xf7, 0x23, 0x1e,
+ 0xe, 0xfc, 0x4e, 0xfb, 0x3b, 0x76, 0xf7, 0x53,
+ 0x8d, 0x1d, 0xb0, 0xe3, 0x3, 0xf7, 0x5d, 0xf9,
+ 0x41, 0x15, 0xcf, 0x6, 0xfb, 0x79, 0xfd, 0xfd,
+ 0x5, 0x47, 0x6, 0xe, 0x8a, 0xa, 0x1, 0xf7,
+ 0x8, 0xf1, 0x6d, 0xf3, 0x3, 0xfb, 0x12, 0xfb,
+ 0x43, 0x15, 0xe0, 0x9b, 0xad, 0xb1, 0x9e, 0xd1,
+ 0xb8, 0xf7, 0x3f, 0x18, 0x9e, 0xd3, 0xa6, 0xb1,
+ 0xf0, 0x9e, 0x8, 0x8d, 0x7, 0x47, 0x9b, 0x77,
+ 0x9a, 0xb6, 0xc0, 0xc6, 0xf7, 0x2f, 0xc6, 0x1a,
+ 0xb0, 0x7e, 0xad, 0x47, 0x96, 0x1e, 0x8e, 0x97,
+ 0x5, 0xf7, 0x23, 0xb2, 0x6d, 0x4b, 0x1f, 0x52,
+ 0x4e, 0xfb, 0x3e, 0x63, 0x1a, 0x60, 0xa6, 0x7a,
+ 0xc4, 0x7c, 0x1e, 0x2e, 0x78, 0x71, 0x5e, 0x79,
+ 0x49, 0x5d, 0xfb, 0x3f, 0x18, 0xfb, 0xd, 0x6b,
+ 0x38, 0x7c, 0xfb, 0x19, 0x1b, 0xe, 0x2f, 0xf7,
+ 0x45, 0xdf, 0x48, 0x76, 0xa2, 0x76, 0xd1, 0xdf,
+ 0x8f, 0x77, 0x12, 0x13, 0x50, 0xef, 0xf7, 0x41,
+ 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b, 0xb4,
+ 0xac, 0x7c, 0x7b, 0xaa, 0x1f, 0x13, 0x88, 0x79,
+ 0xae, 0xad, 0x78, 0xb6, 0x1b, 0xc9, 0xac, 0xb7,
+ 0xb5, 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74,
+ 0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b,
+ 0x67, 0x1f, 0x13, 0x30, 0x9d, 0x64, 0x63, 0x9d,
+ 0x69, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f,
+ 0xe, 0xfb, 0xa5, 0xfb, 0x4c, 0x76, 0xf8, 0xbd,
+ 0xf7, 0x24, 0x1, 0x9e, 0xf7, 0x29, 0x95, 0xf7,
+ 0x24, 0x3, 0xf7, 0x55, 0xf7, 0xa7, 0x15, 0x4c,
+ 0xfb, 0x39, 0x3a, 0xfb, 0x2f, 0x7b, 0x6d, 0x8,
+ 0x82, 0x7a, 0x86, 0x7a, 0x7c, 0x1a, 0x5d, 0xac,
+ 0x68, 0xae, 0xc6, 0x9e, 0xc1, 0xb5, 0x8e, 0x1e,
+ 0x94, 0xf7, 0x7, 0xa4, 0xf7, 0x32, 0x9f, 0xf2,
+ 0x8, 0x5f, 0xf7, 0x2d, 0x15, 0x63, 0xab, 0x6b,
+ 0xb3, 0xb3, 0xab, 0xab, 0xb3, 0xb3, 0x6b, 0xab,
+ 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x1e, 0xe, 0xfb,
+ 0xe, 0x76, 0xf7, 0x2b, 0x76, 0xf8, 0x4f, 0xac,
+ 0xf7, 0x5, 0x77, 0x1, 0x97, 0xf7, 0x13, 0x3,
+ 0xf7, 0x6a, 0xc4, 0x15, 0x63, 0x9c, 0x86, 0xbe,
+ 0xa5, 0x1a, 0xce, 0xca, 0xf7, 0x68, 0xde, 0xa0,
+ 0x8e, 0x82, 0x84, 0x1e, 0xfb, 0x29, 0xfc, 0x3f,
+ 0x15, 0x5d, 0xfb, 0x16, 0x5, 0xad, 0x6, 0xba,
+ 0xf7, 0x19, 0xdd, 0x98, 0xb6, 0xc8, 0xb5, 0xc6,
+ 0x19, 0x70, 0x9d, 0x6b, 0x5b, 0x64, 0x63, 0x5c,
+ 0x8a, 0x19, 0xe7, 0xf7, 0x9a, 0x5, 0x85, 0x92,
+ 0x97, 0x86, 0x9d, 0x1b, 0xaa, 0xab, 0xa5, 0xb5,
+ 0xab, 0x79, 0xa9, 0x68, 0x9c, 0x1f, 0xb8, 0xf7,
+ 0x12, 0x5, 0x68, 0x6, 0x62, 0xfb, 0x8, 0x5,
+ 0x8d, 0x81, 0x81, 0x8c, 0x7f, 0x1b, 0xfb, 0x1b,
+ 0xfb, 0x26, 0xfb, 0x2e, 0xfb, 0x32, 0xfb, 0xe,
+ 0xe9, 0x61, 0xc1, 0x1f, 0xe, 0x7f, 0xaa, 0x6c,
+ 0xf3, 0x23, 0xf7, 0x42, 0xfb, 0x2c, 0x76, 0xf7,
+ 0x17, 0x77, 0xc2, 0x77, 0xf7, 0x43, 0xc7, 0xf7,
+ 0xab, 0xad, 0x12, 0x6b, 0xa9, 0x13, 0x4f, 0x80,
+ 0xf7, 0x30, 0xbc, 0x15, 0x6e, 0xab, 0xb8, 0x6b,
+ 0xb8, 0x1b, 0xe7, 0xb9, 0xd0, 0xed, 0x9d, 0x1f,
+ 0x72, 0x6, 0x67, 0x7b, 0x7f, 0x70, 0x46, 0x1b,
+ 0x65, 0x4a, 0xa5, 0x91, 0x7c, 0x1f, 0xad, 0xc0,
+ 0xaa, 0xde, 0x95, 0xbd, 0x8, 0xf7, 0x7, 0x6,
+ 0x95, 0xc7, 0x5, 0xfb, 0x6, 0x6, 0xb2, 0xf7,
+ 0x5e, 0x5, 0xbc, 0x94, 0xa0, 0xa7, 0xaa, 0x1b,
+ 0xa7, 0x87, 0x73, 0x73, 0x86, 0x1f, 0x89, 0x82,
+ 0x8a, 0x82, 0x83, 0x1a, 0x67, 0xab, 0x7c, 0xa0,
+ 0xa7, 0xac, 0xa2, 0xb7, 0xcc, 0x4f, 0xa6, 0x58,
+ 0x67, 0xfb, 0x37, 0x7d, 0xfb, 0xbf, 0x59, 0x1e,
+ 0x22, 0x6, 0x81, 0x4f, 0x5, 0xf7, 0x1, 0x6,
+ 0x83, 0x56, 0x86, 0x4d, 0x85, 0x5c, 0x8, 0x13,
+ 0x23, 0x80, 0x93, 0x78, 0x7d, 0x91, 0x6b, 0x1b,
+ 0x5d, 0x5d, 0x6d, 0x50, 0x1f, 0x13, 0x1f, 0x80,
+ 0x5e, 0xaf, 0x64, 0xbe, 0xca, 0xa2, 0xaf, 0xa3,
+ 0x9a, 0x1e, 0x60, 0xb4, 0x15, 0x13, 0x8f, 0x80,
+ 0x6a, 0x85, 0x7b, 0x65, 0x66, 0x1b, 0x75, 0x69,
+ 0x99, 0xad, 0xb7, 0xaa, 0x94, 0x9f, 0xa9, 0xa0,
+ 0x79, 0x7f, 0x98, 0x1f, 0xe, 0xd2, 0x76, 0xdc,
+ 0xd5, 0xf7, 0x65, 0xd5, 0xd4, 0x77, 0x1, 0xd3,
+ 0xdb, 0xf7, 0x5d, 0xda, 0x3, 0xf7, 0x1c, 0xf7,
+ 0xcc, 0x15, 0xca, 0xbe, 0xbf, 0xcb, 0xcd, 0xba,
+ 0x55, 0x4c, 0x4a, 0x5b, 0x54, 0x48, 0x4a, 0x5b,
+ 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8e, 0x15, 0xe1,
+ 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c, 0xb6, 0x1b,
+ 0xb6, 0xb1, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, 0x33,
+ 0xbf, 0xbf, 0x34, 0xe3, 0x5, 0xa0, 0xa6, 0x96,
+ 0xb2, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1, 0x78, 0xa7,
+ 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x34, 0x35, 0x5,
+ 0x9e, 0x6e, 0x67, 0x95, 0x5f, 0x1b, 0x62, 0x62,
+ 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1, 0x57, 0x59,
+ 0xe3, 0x33, 0x5, 0x78, 0x70, 0x7c, 0x64, 0x60,
+ 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f, 0x1e, 0x33,
+ 0x33, 0x5, 0xe, 0x8b, 0xa4, 0xf7, 0x1f, 0xbd,
+ 0xd9, 0xbd, 0xf7, 0xc2, 0xa4, 0x1, 0xb9, 0x16,
+ 0xf7, 0xd6, 0xa4, 0x6, 0x59, 0x8d, 0x6c, 0x8c,
+ 0xb4, 0x1a, 0xa8, 0x98, 0xb6, 0x91, 0xa2, 0x1e,
+ 0xf7, 0x2c, 0x6, 0x99, 0xbd, 0x5, 0xfb, 0x2c,
+ 0x6, 0xa0, 0xd9, 0x5, 0xf7, 0x2a, 0x6, 0x98,
+ 0xbd, 0x5, 0xfb, 0x1b, 0x6, 0xf7, 0x30, 0xf7,
+ 0x7d, 0x90, 0x1d, 0xb8, 0x93, 0x19, 0xa4, 0xfb,
+ 0x5c, 0x72, 0x7, 0xc7, 0xa1, 0x7c, 0x79, 0x82,
+ 0x86, 0x80, 0x84, 0x80, 0x1f, 0xfb, 0x2b, 0xfb,
+ 0x80, 0x5, 0x74, 0xc1, 0x56, 0xf7, 0x54, 0x9d,
+ 0x1a, 0xa2, 0x97, 0x98, 0xca, 0x1e, 0xa4, 0xfb,
+ 0xac, 0x72, 0x7, 0xc0, 0x84, 0x8a, 0x92, 0xa1,
+ 0x64, 0xd8, 0xfb, 0x9b, 0x18, 0xfb, 0x11, 0x6,
+ 0x7d, 0x59, 0x5, 0xf7, 0x22, 0x6, 0x75, 0x3d,
+ 0x5, 0xfb, 0x21, 0x6, 0x7d, 0x59, 0x5, 0xf7,
+ 0x21, 0x6, 0x70, 0x2c, 0x7f, 0x62, 0x71, 0x8d,
+ 0x4c, 0x86, 0x19, 0xe, 0xfc, 0x4e, 0x3e, 0x76,
+ 0xf0, 0x76, 0xf7, 0x96, 0x77, 0xad, 0x77, 0xf8,
+ 0x57, 0x77, 0x12, 0xcd, 0xe3, 0x13, 0xdc, 0xf5,
+ 0xf7, 0xf5, 0x15, 0xcf, 0x6, 0xef, 0xf7, 0xe0,
+ 0x5, 0x43, 0x6, 0xfb, 0x78, 0xfd, 0xa3, 0x15,
+ 0xd4, 0x6, 0x13, 0xec, 0xeb, 0xf7, 0xe6, 0x5,
+ 0x47, 0x6, 0xe, 0xfb, 0xe, 0x76, 0xa2, 0x77,
+ 0xf7, 0x99, 0xa6, 0xf7, 0x90, 0xa4, 0xf7, 0x78,
+ 0xa1, 0x12, 0xaf, 0xf7, 0x6, 0x9d, 0xd1, 0xa9,
+ 0xd8, 0x9e, 0xd2, 0x13, 0x7f, 0x80, 0xf7, 0xb2,
+ 0xf7, 0xd, 0x15, 0x8d, 0x8f, 0x5, 0x88, 0x93,
+ 0x95, 0x8a, 0x97, 0x1b, 0xc6, 0xc5, 0xbc, 0xd6,
+ 0xca, 0x62, 0xc1, 0x78, 0xa3, 0x1f, 0x26, 0xf7,
+ 0xc, 0x67, 0xb5, 0xb4, 0x1a, 0xb0, 0xa3, 0xb0,
+ 0xc3, 0xaf, 0xa7, 0x7c, 0x7f, 0x82, 0x83, 0x87,
+ 0x83, 0x84, 0x1e, 0x80, 0x84, 0x82, 0x81, 0x77,
+ 0x1a, 0x70, 0xa3, 0x71, 0xaa, 0xa0, 0xb0, 0x99,
+ 0xbb, 0xb7, 0x62, 0xc0, 0x27, 0x37, 0x49, 0x55,
+ 0x3a, 0x4b, 0xb7, 0x56, 0x96, 0x80, 0x1e, 0x89,
+ 0x88, 0x5, 0x8f, 0x7e, 0x6d, 0x8d, 0x86, 0x1b,
+ 0xfb, 0x0, 0x6e, 0xfb, 0x2b, 0x28, 0xde, 0x1f,
+ 0xf7, 0x16, 0xfb, 0x34, 0x9e, 0x77, 0x63, 0x1a,
+ 0x4e, 0x4f, 0x7d, 0x70, 0x75, 0x5f, 0x95, 0x9d,
+ 0x96, 0x93, 0x8f, 0x94, 0x93, 0x1e, 0x94, 0x93,
+ 0x94, 0x94, 0xa2, 0x1a, 0xb4, 0x66, 0x95, 0x77,
+ 0x6f, 0x6e, 0x76, 0x64, 0x1e, 0x13, 0xbf, 0x80,
+ 0x52, 0xc4, 0x5b, 0xe3, 0xe2, 0xd8, 0xc4, 0xd8,
+ 0xc6, 0x64, 0xb9, 0x77, 0xa4, 0x1e, 0x3b, 0xec,
+ 0x15, 0x88, 0x8e, 0x4b, 0xcf, 0xbe, 0x1a, 0xb2,
+ 0xa5, 0xa0, 0xab, 0xc2, 0xf7, 0x4, 0xfb, 0x17,
+ 0x50, 0x60, 0x69, 0x78, 0x72, 0x6e, 0x7a, 0x97,
+ 0xc5, 0x56, 0x1e, 0xe, 0xfb, 0xdd, 0xf8, 0xa1,
+ 0xf7, 0x16, 0x1, 0xb8, 0xf7, 0x16, 0xdf, 0xf7,
+ 0x16, 0x3, 0xb8, 0xf8, 0xe2, 0x15, 0x4b, 0xa,
+ 0xf7, 0x68, 0x16, 0x4b, 0xa, 0xe, 0xe0, 0x79,
+ 0xb9, 0xf7, 0x4, 0xa2, 0xe2, 0x77, 0xf7, 0xb4,
+ 0x9f, 0xf0, 0xb9, 0x1, 0x9f, 0xc8, 0x58, 0xc8,
+ 0xe4, 0xe0, 0xf8, 0x1c, 0xc8, 0x3, 0xa9, 0xf7,
+ 0xe1, 0x15, 0xf7, 0x57, 0xf7, 0x2b, 0xf7, 0x31,
+ 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xfb, 0x31,
+ 0xfb, 0x58, 0xfb, 0x58, 0xfb, 0x2b, 0xfb, 0x2e,
+ 0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xf7, 0x2f,
+ 0xf7, 0x58, 0x1e, 0xc8, 0x16, 0xfb, 0x38, 0xf7,
+ 0x12, 0xfb, 0x21, 0xf7, 0x31, 0xf7, 0x31, 0xf7,
+ 0x12, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x38, 0xfb,
+ 0x12, 0xf7, 0x23, 0xfb, 0x31, 0xfb, 0x32, 0xfb,
+ 0x11, 0xfb, 0x23, 0xfb, 0x37, 0x1e, 0xf8, 0x59,
+ 0x38, 0x15, 0x7a, 0x43, 0x5, 0x70, 0x6e, 0x66,
+ 0x80, 0x48, 0x1b, 0xfb, 0xc, 0x2d, 0xc8, 0xf7,
+ 0x21, 0xe0, 0xc8, 0xf7, 0x3, 0xf7, 0x32, 0xc0,
+ 0xa5, 0x82, 0x82, 0xa6, 0x1f, 0x9a, 0x86, 0x92,
+ 0x84, 0x82, 0x1a, 0x44, 0x7a, 0x7, 0xb6, 0x83,
+ 0x70, 0xba, 0x3f, 0x1b, 0x2f, 0x61, 0x3e, 0x28,
+ 0x20, 0xa8, 0x43, 0xef, 0xcc, 0xba, 0xb2, 0xbb,
+ 0x9f, 0x1f, 0xe, 0xfc, 0x20, 0xf8, 0x24, 0xb8,
+ 0x72, 0x76, 0xf7, 0x97, 0xa6, 0x12, 0x9b, 0xd9,
+ 0x13, 0x70, 0xf7, 0x54, 0xf8, 0x6f, 0x15, 0x87,
+ 0x7b, 0x88, 0x81, 0x81, 0x1a, 0x6c, 0xaa, 0x82,
+ 0x97, 0xb3, 0xb0, 0xb8, 0xaa, 0xa0, 0x1e, 0x7e,
+ 0x94, 0x5, 0x7f, 0x85, 0x6f, 0x6e, 0x7f, 0x1b,
+ 0x88, 0x89, 0x8d, 0x91, 0xa1, 0x98, 0xb2, 0x94,
+ 0xa7, 0x1f, 0xb9, 0xf7, 0x20, 0x3f, 0x88, 0x81,
+ 0x6a, 0x6f, 0xa, 0x9a, 0x88, 0x84, 0xa5, 0x64,
+ 0x1b, 0x39, 0x2c, 0xfb, 0xb, 0x33, 0x1f, 0x13,
+ 0xb0, 0x77, 0x92, 0x51, 0xcc, 0xc1, 0xac, 0xbd,
+ 0xa6, 0x9a, 0x1e, 0x2b, 0x16, 0xb8, 0xc5, 0xf7,
+ 0x1c, 0xba, 0x94, 0x95, 0x7f, 0x7a, 0x63, 0x5e,
+ 0xfb, 0x24, 0x52, 0x88, 0x78, 0x8f, 0xa7, 0x1e,
+ 0xe, 0x72, 0x1d, 0x97, 0xf7, 0x6d, 0x71, 0x1d,
+ 0x81, 0x94, 0x96, 0x82, 0x93, 0x1b, 0x91, 0x8f,
+ 0x8e, 0x98, 0x1f, 0x41, 0x8d, 0xa, 0xe3, 0x5f,
+ 0xa, 0xf7, 0x4d, 0x82, 0x71, 0x1d, 0x80, 0x94,
+ 0x97, 0x8a, 0x1d, 0x41, 0x8d, 0xa, 0xe3, 0xdc,
+ 0xaf, 0x1a, 0x94, 0x88, 0x8e, 0x86, 0x79, 0x60,
+ 0x62, 0x7b, 0x6c, 0xa, 0xe, 0x53, 0xf7, 0x15,
+ 0x76, 0xf7, 0x5d, 0xce, 0x48, 0xe5, 0x1, 0xf8,
+ 0x65, 0xe5, 0x43, 0xd3, 0x3, 0xbe, 0xf7, 0xc9,
+ 0x15, 0xf8, 0x44, 0xfb, 0x5d, 0xd3, 0xf7, 0xa0,
+ 0xfc, 0x8c, 0x6, 0xe, 0xe0, 0x79, 0xb9, 0xf7,
+ 0xf, 0xf7, 0x4e, 0xf7, 0x3d, 0xa0, 0xf7, 0x4,
+ 0xb9, 0x1, 0xa9, 0xc8, 0xf7, 0x3a, 0xd2, 0xf7,
+ 0x1, 0xd4, 0xf7, 0x27, 0xc8, 0x3, 0xa9, 0xf7,
+ 0xe3, 0x15, 0xfb, 0x58, 0xf7, 0x2b, 0xfb, 0x31,
+ 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xf7, 0x2d,
+ 0xf7, 0x58, 0xf7, 0x58, 0xfb, 0x2b, 0xf7, 0x32,
+ 0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xfb, 0x2f,
+ 0xfb, 0x57, 0x1e, 0xc8, 0x16, 0xf7, 0x38, 0xf7,
+ 0x11, 0xf7, 0x20, 0xf7, 0x32, 0xf7, 0x32, 0xf7,
+ 0x11, 0xfb, 0x24, 0xfb, 0x38, 0xfb, 0x38, 0xfb,
+ 0x11, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, 0x31, 0xfb,
+ 0x12, 0xf7, 0x23, 0xf7, 0x38, 0x1e, 0xf7, 0xb,
+ 0xfb, 0x4c, 0x15, 0xf7, 0x3a, 0x9b, 0x6, 0x5a,
+ 0x90, 0x8c, 0x8c, 0xb5, 0x1a, 0xf1, 0xb7, 0x7,
+ 0x30, 0xc8, 0xc8, 0x40, 0x89, 0x1b, 0xd1, 0x6,
+ 0x77, 0xa5, 0x6e, 0xad, 0x37, 0xf7, 0x9, 0x8,
+ 0xbb, 0x9a, 0xac, 0xb3, 0xbd, 0x1a, 0xcc, 0x54,
+ 0xa8, 0x4d, 0x1e, 0xfb, 0x4b, 0x7b, 0x6, 0xbc,
+ 0x86, 0x89, 0x8a, 0x62, 0x1a, 0xfb, 0x8d, 0x7,
+ 0x61, 0x8d, 0x8a, 0x5a, 0x86, 0x1e, 0xf7, 0xa,
+ 0xf7, 0x3e, 0x15, 0xf7, 0x3d, 0xb3, 0x7, 0xb2,
+ 0xa9, 0x78, 0x51, 0x56, 0x77, 0x64, 0x5b, 0x1f,
+ 0xe, 0xfb, 0xdd, 0xf8, 0xbd, 0xd1, 0x1, 0xbe,
+ 0xf8, 0xbd, 0x15, 0xf7, 0xd8, 0x6, 0x9d, 0xd1,
+ 0x5, 0xfb, 0xd7, 0x6, 0xe, 0xfb, 0x9a, 0xf8,
+ 0x36, 0x76, 0xf7, 0xb2, 0x77, 0x1, 0xde, 0xf8,
+ 0xb2, 0x15, 0x3c, 0xcb, 0x49, 0xda, 0xda, 0xcb,
+ 0xc9, 0xda, 0xda, 0x4b, 0xcd, 0x3c, 0x3c, 0x4b,
+ 0x4d, 0x3c, 0x1e, 0xb1, 0x8a, 0x15, 0x51, 0xb9,
+ 0x5b, 0xc5, 0xc5, 0xba, 0xb7, 0xc5, 0xc5, 0x5c,
+ 0xbc, 0x51, 0x51, 0x5d, 0x5e, 0x51, 0x1e, 0xe,
+ 0x2f, 0x8b, 0xe4, 0xb2, 0x77, 0xf7, 0x36, 0xe4,
+ 0x3c, 0xc9, 0xf7, 0x38, 0x77, 0x12, 0xf7, 0x85,
+ 0xe3, 0x3e, 0xcc, 0x13, 0xea, 0xf7, 0x90, 0xf7,
+ 0x14, 0x15, 0xcc, 0x6, 0x13, 0xda, 0xf7, 0x2c,
+ 0xf7, 0x70, 0xc9, 0xfb, 0x70, 0xf7, 0x38, 0x4a,
+ 0xfb, 0x38, 0xfb, 0x6f, 0x4d, 0xf7, 0x6f, 0x7,
+ 0xfb, 0x6f, 0xfb, 0xac, 0x15, 0xf8, 0x8c, 0x6,
+ 0x13, 0xec, 0xcf, 0xfc, 0x8c, 0x7, 0xe, 0xfb,
+ 0xfe, 0xf7, 0xa6, 0xd0, 0xf7, 0xab, 0xc8, 0x1,
+ 0x8d, 0xf7, 0xa6, 0x5e, 0x1d, 0xef, 0x5, 0xb6,
+ 0xaa, 0xbc, 0xbd, 0x52, 0xa, 0x6d, 0x66, 0x61,
+ 0x1f, 0x6b, 0x68, 0x8b, 0x84, 0xfb, 0x8, 0xfb,
+ 0x2, 0x8, 0xe, 0xfb, 0xfe, 0xf7, 0xb2, 0x76,
+ 0xf8, 0x3, 0xbe, 0x12, 0xf7, 0x66, 0xdf, 0x4e,
+ 0xe3, 0x13, 0xe0, 0xf7, 0x2, 0xf8, 0x75, 0x15,
+ 0xcc, 0xae, 0x69, 0x4f, 0x69, 0x66, 0x4f, 0x69,
+ 0x81, 0x82, 0x8f, 0x97, 0x83, 0x67, 0x1d, 0xcf,
+ 0xe1, 0xbc, 0x74, 0xa3, 0x6e, 0x9e, 0x1f, 0x13,
+ 0xd0, 0x63, 0x1d, 0x69, 0xa, 0xe, 0x7f, 0x1d,
+ 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x1f, 0xf8, 0x98,
+ 0x15, 0xbd, 0x6, 0xf7, 0x2b, 0x21, 0x1d, 0xe,
+ 0x35, 0xfb, 0x4e, 0x76, 0xf7, 0x63, 0xd1, 0x4d,
+ 0x76, 0xf7, 0x11, 0x77, 0xf7, 0xf9, 0x77, 0x12,
+ 0x4f, 0xf7, 0xb, 0x13, 0xdc, 0xf7, 0xaf, 0xf7,
+ 0x4, 0x15, 0x83, 0x6c, 0x89, 0x7c, 0x7a, 0x1a,
+ 0x6d, 0xa1, 0x6b, 0xb3, 0xda, 0xba, 0xd6, 0xc3,
+ 0xb5, 0x1e, 0x76, 0x9b, 0x5, 0x13, 0xbc, 0x71,
+ 0x80, 0x6b, 0x67, 0x79, 0x1b, 0x80, 0x85, 0x94,
+ 0xab, 0x93, 0x1f, 0xf3, 0xf7, 0xe4, 0x5, 0xfb,
+ 0x1b, 0x6, 0x58, 0xfb, 0x38, 0x5, 0xfb, 0xe,
+ 0x62, 0x42, 0x2e, 0x53, 0x1b, 0x6e, 0x95, 0xb7,
+ 0xa2, 0x91, 0x1f, 0xe8, 0xf7, 0xcc, 0x5, 0x13,
+ 0xdc, 0xfb, 0x1b, 0x6, 0xfb, 0x3, 0xfc, 0xb,
+ 0x5, 0x5f, 0xfb, 0x12, 0x81, 0x54, 0x64, 0x1a,
+ 0x60, 0xa0, 0x79, 0xa9, 0xb3, 0xa7, 0xae, 0xbd,
+ 0xb6, 0x87, 0xc0, 0x9c, 0xbd, 0x1e, 0x7a, 0xa2,
+ 0x94, 0x84, 0xae, 0x1b, 0xc0, 0xcd, 0xd2, 0xb4,
+ 0xa2, 0x1f, 0xe, 0xfb, 0x57, 0x76, 0xf9, 0xdc,
+ 0xb1, 0x12, 0xb2, 0xf7, 0x64, 0x42, 0xe4, 0xf7,
+ 0x2c, 0xe4, 0x13, 0xd8, 0xf7, 0x11, 0xfb, 0x6c,
+ 0x15, 0xbc, 0x6, 0xf7, 0x85, 0xf9, 0xdc, 0x5,
+ 0xe4, 0x6, 0xfb, 0x85, 0xfd, 0xdc, 0x5, 0xbc,
+ 0x6, 0xf7, 0x69, 0xf9, 0x7e, 0x5, 0xed, 0xa7,
+ 0x92, 0x9b, 0xe5, 0x1b, 0x90, 0x9d, 0x5, 0xfb,
+ 0xbd, 0x6, 0x13, 0xe8, 0xfb, 0x64, 0xfb, 0x3,
+ 0xfb, 0x30, 0xfb, 0x1c, 0xfb, 0x13, 0xf0, 0x6c,
+ 0xf6, 0x89, 0x1f, 0xe, 0xfc, 0x30, 0xf7, 0x95,
+ 0xf7, 0x28, 0x1, 0xbe, 0xf7, 0x28, 0x3, 0xbe,
+ 0xf7, 0xdf, 0x3c, 0xa, 0xfb, 0xdd, 0xfb, 0x6e,
+ 0xb4, 0x80, 0xd8, 0x49, 0xd8, 0xf4, 0x77, 0x12,
+ 0x13, 0x50, 0xb4, 0x90, 0x15, 0x49, 0x2a, 0x98,
+ 0x7f, 0x5, 0x13, 0xb0, 0x7d, 0xa, 0x72, 0x7c,
+ 0x6c, 0x6e, 0x7b, 0x86, 0xa, 0x9f, 0x79, 0xbf,
+ 0x1b, 0xc0, 0xe9, 0xa3, 0xca, 0xbf, 0x5e, 0x9e,
+ 0x67, 0x7d, 0x7e, 0x8b, 0x89, 0x83, 0x1f, 0xb8,
+ 0xce, 0x5, 0xe, 0xfb, 0xfe, 0xf7, 0xbb, 0x76,
+ 0xf7, 0x17, 0x76, 0xf7, 0xbf, 0x77, 0x1, 0xa9,
+ 0xf8, 0x14, 0x8c, 0xa, 0x62, 0x71, 0x91, 0xa0,
+ 0x93, 0x1f, 0x9d, 0xb9, 0xc7, 0xf7, 0x21, 0xa7,
+ 0xcd, 0x5e, 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x89,
+ 0x76, 0x18, 0xa8, 0xb3, 0x93, 0x71, 0x7c, 0x45,
+ 0xfb, 0x1f, 0x7b, 0x6e, 0x1f, 0x70, 0x7d, 0x66,
+ 0x8b, 0x73, 0x1b, 0xe, 0xfb, 0xfe, 0xf8, 0x24,
+ 0x9f, 0xf7, 0x89, 0x9f, 0x1, 0xf7, 0x9e, 0xdc,
+ 0x3, 0xf7, 0x1d, 0xf8, 0x5f, 0x15, 0xb2, 0xae,
+ 0xf7, 0x3b, 0xd2, 0x95, 0x98, 0x85, 0x6d, 0x5e,
+ 0x64, 0xfb, 0x38, 0x4d, 0x6f, 0x8b, 0xa6, 0x97,
+ 0x1e, 0x3a, 0xa9, 0x15, 0x52, 0xbe, 0x6b, 0xc0,
+ 0xf3, 0xde, 0xf2, 0xe5, 0xdb, 0x3f, 0x97, 0x72,
+ 0x24, 0x34, 0x24, 0x2e, 0x1e, 0xe, 0x72, 0x1d,
+ 0xf7, 0xeb, 0x49, 0x1d, 0x95, 0x82, 0x80, 0x94,
+ 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xfb, 0x4,
+ 0xfb, 0x40, 0x70, 0xa, 0x8f, 0x88, 0x90, 0x9d,
+ 0xb5, 0xb5, 0x9a, 0x4a, 0xa, 0x95, 0x82, 0x80,
+ 0x94, 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xe,
+ 0x86, 0x1d, 0xf8, 0xa7, 0x77, 0xa2, 0x77, 0x12,
+ 0x13, 0x70, 0xf8, 0x11, 0xe3, 0x15, 0xf7, 0x33,
+ 0x6, 0x13, 0x90, 0x70, 0x33, 0x5, 0xe1, 0x6,
+ 0x13, 0x70, 0x48, 0xa, 0xfc, 0x39, 0xfb, 0x37,
+ 0x61, 0x1d, 0xfc, 0xc8, 0xfc, 0x2a, 0x8c, 0xa,
+ 0x5d, 0x7e, 0x92, 0xa2, 0x93, 0x8e, 0x95, 0x8e,
+ 0x97, 0x1f, 0x13, 0x88, 0x6e, 0x1d, 0x94, 0x70,
+ 0x6b, 0xa, 0xe3, 0x8b, 0xd0, 0x4d, 0x76, 0xf7,
+ 0x14, 0x77, 0xf7, 0x92, 0xc8, 0xf7, 0xa3, 0x77,
+ 0xa2, 0x77, 0x12, 0x13, 0x78, 0xf7, 0xd, 0x7d,
+ 0x61, 0x1d, 0x13, 0xb4, 0xfb, 0x24, 0xfd, 0x3c,
+ 0x5e, 0x1d, 0xee, 0x5, 0xb6, 0xaa, 0xbc, 0xbe,
+ 0x52, 0xa, 0x63, 0x66, 0x61, 0x1f, 0x6b, 0x68,
+ 0x8b, 0x8b, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xfc,
+ 0x39, 0xf7, 0x96, 0x8c, 0xa, 0x5f, 0x7c, 0x90,
+ 0xa0, 0x94, 0x8d, 0x96, 0x8f, 0x99, 0x1f, 0x6e,
+ 0x1d, 0x93, 0x71, 0x6b, 0xa, 0x86, 0x1d, 0xf7,
+ 0x8, 0x77, 0xf7, 0x80, 0xf7, 0x5b, 0x5b, 0xbb,
+ 0x8e, 0x77, 0x12, 0xf7, 0x5c, 0xdf, 0x4e, 0xe3,
+ 0x13, 0x79, 0x0, 0xf7, 0x21, 0x7d, 0x61, 0x1d,
+ 0xfc, 0x70, 0xfb, 0x5b, 0x15, 0xcc, 0xae, 0x69,
+ 0x4f, 0x5c, 0x6c, 0x61, 0x65, 0x7e, 0x80, 0x8f,
+ 0x92, 0x86, 0x67, 0x1d, 0xd1, 0xe1, 0xbc, 0x74,
+ 0xa1, 0x6e, 0x9e, 0x1f, 0x13, 0x92, 0x80, 0x63,
+ 0x1d, 0x13, 0x94, 0x80, 0x69, 0xa, 0x13, 0x79,
+ 0x0, 0xf7, 0xb0, 0xfc, 0x2b, 0x15, 0xf7, 0x33,
+ 0x6, 0x13, 0x99, 0x0, 0x70, 0x33, 0x5, 0xe1,
+ 0x6, 0x13, 0x79, 0x0, 0x48, 0xa, 0xe, 0xfb,
+ 0x61, 0xaa, 0x6c, 0xf7, 0x58, 0xf7, 0xf5, 0xf7,
+ 0x28, 0x12, 0xa9, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+ 0x28, 0x13, 0x78, 0xf7, 0xc4, 0xf7, 0xa3, 0x15,
+ 0x73, 0x50, 0x7c, 0x6c, 0x60, 0x6f, 0x8, 0xfb,
+ 0x19, 0x34, 0x50, 0x5a, 0x3d, 0x1a, 0x5c, 0xa8,
+ 0x2a, 0xf7, 0x29, 0xf7, 0x1, 0xcb, 0xc9, 0xcf,
+ 0xaf, 0x71, 0xa9, 0x68, 0x6b, 0x6e, 0x72, 0x69,
+ 0x78, 0x93, 0x7f, 0x92, 0x81, 0x1e, 0x92, 0x81,
+ 0x92, 0x83, 0x82, 0x1a, 0x13, 0xb8, 0x76, 0x6a,
+ 0x7a, 0x6f, 0x6c, 0x64, 0x9b, 0xcd, 0xc1, 0xa9,
+ 0xbd, 0xd6, 0xe8, 0x1e, 0xc8, 0xd7, 0x92, 0xbd,
+ 0x8e, 0xac, 0x8, 0x4f, 0xf7, 0x2e, 0x3c, 0xa,
+ 0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, 0xf8, 0x3c,
+ 0xf9, 0x67, 0x7b, 0xa, 0xfb, 0x2, 0xf7, 0x26,
+ 0x5, 0x98, 0x80, 0x78, 0xa1, 0x30, 0x1d, 0xfb,
+ 0xfa, 0xfd, 0xc0, 0x33, 0xa, 0x51, 0x1d, 0xf7,
+ 0x85, 0x77, 0x1, 0xf7, 0xcb, 0xf9, 0x67, 0x22,
+ 0x1d, 0xfc, 0x88, 0xfd, 0xea, 0x33, 0xa, 0x51,
+ 0x1d, 0xf7, 0x7e, 0x5a, 0x1d, 0xfc, 0x5a, 0xfe,
+ 0x15, 0x24, 0x1d, 0x56, 0xa, 0xf8, 0x4d, 0x77,
+ 0xd5, 0x83, 0x1d, 0x5e, 0xd6, 0x12, 0x13, 0xe4,
+ 0xf7, 0x93, 0xf9, 0x7c, 0x15, 0x13, 0xe8, 0x9e,
+ 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xac, 0xa2, 0x84,
+ 0x80, 0xa0, 0x1f, 0x13, 0xf0, 0x7f, 0xa6, 0x9f,
+ 0x7d, 0xa6, 0x1b, 0xe1, 0xa3, 0xde, 0xaf, 0x93,
+ 0x1f, 0x62, 0x6, 0x78, 0x82, 0x82, 0x74, 0x68,
+ 0x1b, 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x96,
+ 0x70, 0x6f, 0x94, 0x70, 0x1b, 0x28, 0x79, 0xfb,
+ 0x7, 0x88, 0x1f, 0x35, 0xfd, 0x7c, 0x15, 0xae,
+ 0x7, 0x23, 0x1d, 0x68, 0x7, 0xf8, 0xc, 0xf8,
+ 0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe,
+ 0x56, 0xa, 0xf8, 0x59, 0x77, 0xba, 0xf7, 0x1a,
+ 0xfb, 0xd, 0xf7, 0x1a, 0x12, 0xf7, 0x80, 0xf7,
+ 0x1a, 0xbd, 0xf7, 0x1a, 0x13, 0xee, 0xf7, 0x73,
+ 0xf9, 0xaf, 0x15, 0x13, 0xf6, 0x20, 0x1d, 0xf7,
+ 0x68, 0x2b, 0xa, 0xfc, 0x8a, 0xfd, 0xaf, 0x24,
+ 0x1d, 0x51, 0x1d, 0xb8, 0xbb, 0xf7, 0x1, 0xbc,
+ 0x1, 0xf7, 0xb0, 0xbb, 0xf7, 0x8, 0xbc, 0x3,
+ 0xf7, 0xb0, 0xf9, 0xc2, 0x15, 0x4f, 0xb9, 0x5d,
+ 0xc7, 0xc6, 0xbb, 0xba, 0xc6, 0xc6, 0x5b, 0xbb,
+ 0x50, 0x50, 0x5c, 0x5b, 0x5e, 0xa, 0xfc, 0x23,
+ 0xfd, 0xc2, 0x24, 0x1d, 0xf7, 0xae, 0x8b, 0xab,
+ 0xf7, 0x73, 0xb2, 0xb7, 0xab, 0xf7, 0x9f, 0xab,
+ 0x1, 0x4b, 0xab, 0x15, 0xac, 0x90, 0x8a, 0x8b,
+ 0xc3, 0xd3, 0xf8, 0x2, 0xf8, 0x5b, 0x18, 0x98,
+ 0x9b, 0x92, 0x99, 0x98, 0x1a, 0xa0, 0x6d, 0x93,
+ 0x58, 0x1e, 0xac, 0xf8, 0xe1, 0x7, 0x5e, 0xfb,
+ 0x52, 0x73, 0x90, 0x5, 0xf7, 0x14, 0x39, 0xa4,
+ 0x3c, 0x56, 0x87, 0x80, 0x76, 0x86, 0x1e, 0x4a,
+ 0xfb, 0x7f, 0xf0, 0x88, 0xc0, 0x98, 0xb3, 0xeb,
+ 0x19, 0xa5, 0x87, 0x42, 0xfb, 0xa5, 0x72, 0x90,
+ 0x98, 0xe9, 0x77, 0xb6, 0xfb, 0xf, 0x88, 0x19,
+ 0x4c, 0xfb, 0x85, 0x5, 0x89, 0x82, 0x8a, 0x83,
+ 0x85, 0x1a, 0x6f, 0x9d, 0x7d, 0xa7, 0xf7, 0x2b,
+ 0xcf, 0xba, 0xf7, 0xc, 0xd3, 0x1e, 0xa5, 0x88,
+ 0x50, 0xfb, 0x58, 0x5, 0xfc, 0xa3, 0xab, 0x6,
+ 0xba, 0x93, 0x9a, 0x90, 0x9b, 0xc5, 0xb9, 0xf7,
+ 0x2c, 0x18, 0xfb, 0x54, 0x6, 0xfb, 0x6, 0xfb,
+ 0x2a, 0x5, 0x82, 0x7e, 0x86, 0x80, 0x81, 0x1a,
+ 0x71, 0xa0, 0x7e, 0xb5, 0x1e, 0x6b, 0xfb, 0x57,
+ 0x7, 0xf8, 0x62, 0xf7, 0xba, 0x15, 0xe7, 0xf7,
+ 0xd7, 0x5, 0x7f, 0x6, 0xfb, 0x91, 0xfb, 0xd7,
+ 0x5, 0xe, 0x90, 0xfb, 0x6e, 0xb4, 0xf7, 0x6f,
+ 0x76, 0xae, 0xbf, 0xf8, 0xaf, 0xae, 0x1, 0xab,
+ 0xf7, 0x2e, 0xef, 0xb8, 0xf7, 0xa1, 0xab, 0x98,
+ 0xa9, 0x3, 0xf7, 0x7f, 0x2f, 0x15, 0x98, 0x7f,
+ 0x5, 0x8f, 0x94, 0x94, 0x8c, 0x93, 0x1b, 0xa8,
+ 0xa1, 0x72, 0x7f, 0x70, 0x74, 0x7d, 0x6c, 0x6e,
+ 0x7a, 0x91, 0x96, 0x74, 0x1f, 0x75, 0x6a, 0x5,
+ 0x83, 0x9b, 0xa3, 0x7a, 0xbe, 0x1b, 0xc0, 0xe7,
+ 0x9e, 0xca, 0xc3, 0x58, 0xa0, 0x65, 0x80, 0x82,
+ 0x8a, 0x89, 0x84, 0x1f, 0xaa, 0xb9, 0x5, 0xf7,
+ 0x9, 0xdb, 0xd6, 0xd3, 0xbb, 0x1f, 0x6d, 0xa1,
+ 0x5, 0x2e, 0x43, 0x49, 0x72, 0x3d, 0x1b, 0x7d,
+ 0xfb, 0x16, 0x8b, 0xf7, 0x47, 0xf7, 0x45, 0xf3,
+ 0xf7, 0x97, 0xf7, 0x35, 0xe3, 0xc5, 0x4d, 0x2a,
+ 0x7f, 0x8a, 0x80, 0x89, 0x80, 0x81, 0x1d, 0x80,
+ 0x85, 0x7e, 0x74, 0x1b, 0x7e, 0x77, 0x93, 0x93,
+ 0x6f, 0x1f, 0x92, 0x73, 0x6c, 0x91, 0x63, 0x1b,
+ 0xfb, 0x87, 0xfb, 0x44, 0xfb, 0x74, 0xfb, 0x71,
+ 0xfb, 0x40, 0xf7, 0x15, 0x36, 0xf7, 0x11, 0x1f,
+ 0xe, 0x51, 0xa, 0x73, 0xa, 0xf8, 0x3c, 0xf9,
+ 0x67, 0x27, 0x1d, 0xfb, 0xd2, 0xfd, 0xc0, 0x15,
+ 0x37, 0x1d, 0x57, 0x7b, 0x94, 0x9b, 0x98, 0x93,
+ 0x9c, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x1, 0xae,
+ 0x71, 0x4f, 0x7d, 0x8a, 0x7b, 0x88, 0x79, 0x4c,
+ 0xa, 0x5, 0x3a, 0x60, 0x7c, 0x72, 0xfb, 0x27,
+ 0x1b, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x40,
+ 0x1d, 0x85, 0x96, 0x87, 0x43, 0xa, 0xe, 0x51,
+ 0xa, 0x73, 0xa, 0xf7, 0xcb, 0xf9, 0x67, 0x15,
+ 0xbc, 0x6, 0xf7, 0x2b, 0xe1, 0x5, 0xa2, 0x98,
+ 0x9c, 0x97, 0x25, 0x1d, 0xfc, 0x60, 0xfd, 0xea,
+ 0x15, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98,
+ 0x93, 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x3,
+ 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c, 0x89, 0x7a,
+ 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+ 0x8c, 0x19, 0x65, 0xa, 0x95, 0x73, 0x1d, 0x89,
+ 0x31, 0x1d, 0xe, 0x51, 0xa, 0xf7, 0x78, 0x5a,
+ 0x1d, 0xfc, 0x32, 0xfe, 0x15, 0x15, 0x37, 0x1d,
+ 0x56, 0x7c, 0x95, 0x9c, 0x98, 0x91, 0x9b, 0x90,
+ 0x9e, 0x1f, 0xca, 0xf7, 0x7b, 0x5, 0xf7, 0x6,
+ 0xa9, 0x6e, 0x49, 0x7f, 0x89, 0x7e, 0x89, 0x7d,
+ 0x2a, 0xa, 0xe, 0x51, 0xa, 0xc5, 0xf7, 0x1b,
+ 0x1, 0xf7, 0x86, 0xf7, 0x1b, 0xd8, 0xf7, 0x1b,
+ 0x3, 0x70, 0x16, 0x37, 0x1d, 0x56, 0x7c, 0x95,
+ 0x9b, 0x98, 0x93, 0x9b, 0x90, 0x9f, 0x7e, 0xa,
+ 0xf7, 0x3, 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c,
+ 0x89, 0x7a, 0x2a, 0xa, 0xf7, 0xa1, 0xf9, 0x8b,
+ 0x46, 0x1d, 0x68, 0xa, 0x73, 0xa, 0x6b, 0x16,
+ 0x75, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+ 0x98, 0x8e, 0x95, 0x41, 0xa, 0xc6, 0x9b, 0x7e,
+ 0x7a, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xf7, 0xe5,
+ 0xf9, 0x44, 0x2a, 0x1d, 0x68, 0xa, 0x73, 0xa,
+ 0xf7, 0x54, 0xf9, 0x67, 0x7b, 0xa, 0xf7, 0x1a,
+ 0xdc, 0x5, 0xa1, 0x98, 0x9e, 0x9c, 0x25, 0x1d,
+ 0xfb, 0xda, 0xfd, 0xea, 0x8e, 0x1d, 0x4e, 0x7b,
+ 0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x41,
+ 0xa, 0xc6, 0x9b, 0x7f, 0x79, 0x7f, 0x86, 0x7c,
+ 0x47, 0x1d, 0xe, 0x68, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0xf7, 0xb, 0xf9, 0x67, 0x15, 0xc4, 0x6,
+ 0xf4, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xfb, 0xb1,
+ 0xfe, 0x15, 0x8e, 0x1d, 0x4e, 0x7b, 0x98, 0x9f,
+ 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x46, 0xa, 0x68,
+ 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf2, 0xf7, 0x1b,
+ 0x3, 0xf2, 0xf9, 0xb0, 0x15, 0x41, 0x1d, 0xf7,
+ 0x63, 0x16, 0x41, 0x1d, 0xfb, 0xea, 0xfd, 0xb0,
+ 0x8e, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+ 0x98, 0x8e, 0x95, 0x46, 0xa, 0xc7, 0x8b, 0xad,
+ 0xf7, 0xbb, 0xb7, 0xf7, 0x9d, 0xaa, 0x1, 0xf8,
+ 0xbd, 0xf7, 0x27, 0x3, 0xf7, 0x98, 0xf7, 0xdd,
+ 0x15, 0xf7, 0xe, 0x6, 0x97, 0xb7, 0x5, 0xfb,
+ 0xe, 0x6, 0xc8, 0xf7, 0x77, 0x80, 0x1d, 0xfb,
+ 0x1d, 0x5b, 0x25, 0x60, 0xfb, 0xd1, 0xfb, 0x97,
+ 0x61, 0x7d, 0x9a, 0xa3, 0x9a, 0x8f, 0x9c, 0x77,
+ 0xa, 0x91, 0xf7, 0x13, 0xf7, 0x6e, 0x5d, 0xa,
+ 0x7e, 0x82, 0x75, 0x5a, 0xfb, 0x4a, 0x1e, 0x25,
+ 0x6, 0x7f, 0x5f, 0x5, 0xf1, 0x6, 0x86, 0x78,
+ 0x80, 0x5c, 0x67, 0xfb, 0xf, 0x6f, 0x2d, 0x6d,
+ 0x85, 0x6a, 0x86, 0x8, 0xe, 0x8b, 0x1d, 0xd5,
+ 0x8c, 0x1d, 0x13, 0xb0, 0x70, 0x16, 0xf7, 0x64,
+ 0xae, 0x6, 0x52, 0x77, 0x9e, 0xaf, 0xa7, 0x92,
+ 0xac, 0x93, 0xa6, 0x1f, 0xee, 0xf7, 0xf8, 0x5,
+ 0x13, 0x70, 0x59, 0xa, 0xc2, 0xa0, 0x78, 0x6a,
+ 0x6f, 0x85, 0x68, 0x83, 0x6f, 0x64, 0x1d, 0xfb,
+ 0xc, 0xfc, 0x2f, 0x18, 0x13, 0xa8, 0x63, 0xfb,
+ 0x1f, 0x80, 0x93, 0x59, 0x7f, 0x8, 0xf7, 0xb1,
+ 0xf9, 0x59, 0x50, 0xa, 0xa8, 0xa2, 0x7f, 0x80,
+ 0xa2, 0x1f, 0x13, 0xb0, 0x80, 0xa1, 0xa2, 0x81,
+ 0xaa, 0x3d, 0x1d, 0x7c, 0x73, 0x96, 0x96, 0x70,
+ 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x70, 0x54, 0x1d,
+ 0x33, 0x1d, 0xf8, 0x3d, 0xf8, 0x96, 0x2a, 0x1d,
+ 0x33, 0x1d, 0xf7, 0xef, 0xf8, 0x96, 0x26, 0xa,
+ 0x65, 0x1d, 0xf7, 0x6a, 0x25, 0xa, 0xf7, 0x87,
+ 0xf8, 0x96, 0x5b, 0xa, 0xec, 0xe3, 0x2a, 0x7e,
+ 0x1d, 0x65, 0x1d, 0xc7, 0x8c, 0x1d, 0x4d, 0xa,
+ 0x13, 0xdc, 0x3a, 0x1d, 0xf7, 0x80, 0xf8, 0xaa,
+ 0x50, 0xa, 0xa4, 0xa2, 0x7f, 0x80, 0xa4, 0x1f,
+ 0x13, 0xec, 0x80, 0xa3, 0xa4, 0x81, 0xa8, 0x3d,
+ 0x1d, 0x7c, 0x72, 0x96, 0x96, 0x70, 0x1f, 0x95,
+ 0x71, 0x6f, 0x95, 0x70, 0x54, 0x1d, 0x65, 0x1d,
+ 0xb8, 0xf7, 0x1a, 0x12, 0xa6, 0xf7, 0x24, 0xf7,
+ 0xc, 0xf7, 0x1a, 0xd8, 0xf7, 0x1a, 0x32, 0xf7,
+ 0x24, 0x13, 0xfa, 0x3a, 0x1d, 0xf7, 0x9c, 0xf8,
+ 0xdd, 0x2e, 0xa, 0x13, 0xfc, 0xf7, 0x67, 0x2d,
+ 0x1d, 0x2f, 0xb0, 0x76, 0xf8, 0x6e, 0x77, 0x1,
+ 0xbb, 0xc7, 0x15, 0xb7, 0x5f, 0xf7, 0x54, 0xf7,
+ 0x54, 0xf7, 0x53, 0xfb, 0x54, 0xba, 0xba, 0xfb,
+ 0x55, 0xf7, 0x52, 0xf7, 0x55, 0xf7, 0x56, 0x59,
+ 0xb6, 0xfb, 0x50, 0xfb, 0x52, 0xfb, 0x52, 0xf7,
+ 0x52, 0x5d, 0x5c, 0xf7, 0x51, 0xfb, 0x51, 0x5,
+ 0xe, 0xc7, 0x23, 0x76, 0xf6, 0xad, 0xf9, 0xf,
+ 0xad, 0xda, 0x77, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+ 0x4a, 0xd8, 0x15, 0x83, 0x9f, 0x88, 0xa2, 0xa9,
+ 0x1a, 0xeb, 0xe4, 0xf8, 0x29, 0xf7, 0x49, 0xa8,
+ 0xa0, 0x83, 0x7e, 0x9a, 0x1e, 0xfb, 0xbe, 0xfc,
+ 0xe4, 0x15, 0xf7, 0xd9, 0xf8, 0xbf, 0x5, 0x96,
+ 0x74, 0x8e, 0x6f, 0x79, 0x1a, 0xfb, 0x2, 0x2e,
+ 0xfc, 0x22, 0xfb, 0x47, 0x72, 0x74, 0x91, 0x9b,
+ 0x78, 0x1e, 0xfb, 0x23, 0xfb, 0x37, 0x15, 0xbb,
+ 0x6, 0xd1, 0xf7, 0xc, 0x5, 0x83, 0xa3, 0xa6,
+ 0x86, 0xaa, 0x1b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0xa0, 0xf7, 0x56, 0xf7, 0x2, 0x56, 0xce, 0x47,
+ 0xae, 0x1f, 0xca, 0xf7, 0x0, 0x5, 0x5a, 0x6,
+ 0x56, 0x2f, 0x5, 0x94, 0x70, 0x67, 0x8f, 0x70,
+ 0x1b, 0xfb, 0x6f, 0xfb, 0x57, 0xfb, 0x7d, 0xfb,
+ 0x89, 0x46, 0xaf, 0x36, 0xdc, 0x61, 0x1f, 0xe,
+ 0x72, 0xa, 0x73, 0xa, 0xb0, 0xf7, 0x1e, 0x3,
+ 0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc3, 0x9e, 0x7a,
+ 0x68, 0x6e, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d,
+ 0x2c, 0x6f, 0xb4, 0xc1, 0xb5, 0x9a, 0xbd, 0x98,
+ 0xba, 0x3e, 0x1d, 0xf7, 0xf6, 0xc1, 0x2a, 0x1d,
+ 0x72, 0xa, 0x73, 0xa, 0xce, 0xf7, 0x1e, 0x3,
+ 0xf8, 0x32, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x4a,
+ 0xfb, 0x70, 0x29, 0x1d, 0xc3, 0x9e, 0x79, 0x68,
+ 0x6f, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d, 0x2f,
+ 0x6c, 0xb1, 0xbf, 0xb6, 0x99, 0xbf, 0x99, 0xbc,
+ 0x3e, 0x1d, 0xe, 0x72, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0xce, 0xf7, 0x1e, 0x3, 0xf7, 0xa2, 0xf9,
+ 0x67, 0x42, 0xa, 0xfb, 0xe0, 0xfb, 0x9b, 0x29,
+ 0x1d, 0xc0, 0xa1, 0x7b, 0x6b, 0x6e, 0x85, 0x66,
+ 0x83, 0x6e, 0x4a, 0x1d, 0x30, 0x6b, 0xb1, 0xbe,
+ 0xb6, 0x99, 0xc0, 0x99, 0xbc, 0x3e, 0x1d, 0xe,
+ 0x72, 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf3, 0xf7,
+ 0x1e, 0xca, 0xf7, 0x1a, 0xba, 0xf7, 0x1a, 0x3,
+ 0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc4, 0x9d, 0x78,
+ 0x67, 0x6f, 0x84, 0x6a, 0x84, 0x70, 0x4a, 0x1d,
+ 0x2d, 0x6e, 0xb3, 0xc1, 0xb5, 0x9a, 0xbe, 0x98,
+ 0xba, 0x3e, 0x1d, 0xf7, 0x63, 0xf7, 0x12, 0x2e,
+ 0xa, 0xf7, 0x69, 0x2d, 0x1d, 0x58, 0x58, 0xa,
+ 0x73, 0xa, 0xd4, 0x16, 0xf7, 0xd6, 0xae, 0x6,
+ 0x58, 0x70, 0x98, 0xab, 0x99, 0x8d, 0x9b, 0x92,
+ 0x9c, 0x1f, 0xbf, 0xf7, 0x49, 0x6a, 0xa, 0xc2,
+ 0xa6, 0x7e, 0x79, 0x81, 0x87, 0x7e, 0x80, 0x7c,
+ 0x1f, 0xfb, 0x2f, 0xfb, 0x69, 0x5, 0x4b, 0xf7,
+ 0x5c, 0x81, 0x82, 0xa7, 0x1a, 0xa2, 0x94, 0xb3,
+ 0xc5, 0x6a, 0x1d, 0x55, 0xfb, 0x4e, 0x79, 0x4b,
+ 0x6c, 0x74, 0x51, 0x86, 0x19, 0xf7, 0xb1, 0xf9,
+ 0x44, 0x26, 0xa, 0x58, 0x8b, 0xae, 0xf7, 0x27,
+ 0xab, 0xf7, 0xb4, 0xab, 0x6b, 0xf7, 0x3b, 0x12,
+ 0xf8, 0x3f, 0xf7, 0x26, 0x13, 0xe8, 0xf7, 0x79,
+ 0xf7, 0x6f, 0x6f, 0x1d, 0x33, 0x62, 0x40, 0x26,
+ 0x7a, 0x78, 0x8c, 0x8f, 0x77, 0x1f, 0xfb, 0x94,
+ 0xfb, 0x6f, 0x15, 0xf7, 0xba, 0xae, 0x6, 0x4c,
+ 0x7f, 0x9e, 0xa2, 0x94, 0x8d, 0x94, 0x8d, 0x93,
+ 0x1f, 0xa2, 0xdf, 0x5, 0x87, 0xb0, 0x9a, 0x8a,
+ 0xb4, 0x1b, 0xf7, 0x1a, 0xf7, 0x13, 0xce, 0xf7,
+ 0x14, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0x5b,
+ 0x6, 0xa9, 0xe5, 0xa3, 0x8f, 0xb3, 0x91, 0x8,
+ 0x13, 0xd8, 0x8c, 0xae, 0x5, 0xfb, 0xba, 0x68,
+ 0x6, 0xbf, 0x9f, 0x7f, 0x77, 0x7c, 0x88, 0x78,
+ 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4b, 0x7a,
+ 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xe, 0xfb,
+ 0x5c, 0xf7, 0x16, 0xca, 0xad, 0xf9, 0x1c, 0xa9,
+ 0x12, 0xf7, 0xcf, 0xf7, 0xc, 0x42, 0xf7, 0x3,
+ 0x13, 0xf0, 0xf7, 0x22, 0x9a, 0x15, 0x82, 0x98,
+ 0x96, 0x7e, 0xb6, 0x1b, 0xf7, 0xb, 0xf6, 0xf7,
+ 0x1a, 0xf7, 0x12, 0xe9, 0x4c, 0xb1, 0x3d, 0x98,
+ 0x1f, 0x8d, 0x7, 0x13, 0xe8, 0xca, 0xa2, 0xf7,
+ 0x8, 0xbf, 0xf7, 0x2, 0x1a, 0xd4, 0x4f, 0xba,
+ 0x36, 0xfb, 0x2e, 0x43, 0xfb, 0x33, 0xfb, 0x23,
+ 0x71, 0x1e, 0x49, 0xfb, 0xff, 0x6d, 0xfb, 0x1c,
+ 0x66, 0x5c, 0x8, 0x80, 0x82, 0x71, 0x7a, 0x7c,
+ 0x1b, 0x84, 0x87, 0x8f, 0x94, 0x96, 0x93, 0x8c,
+ 0x90, 0x95, 0x1f, 0x8d, 0x90, 0x8d, 0x91, 0x96,
+ 0x1a, 0xb0, 0x6b, 0x92, 0x7e, 0x55, 0x8b, 0x5c,
+ 0x83, 0x67, 0xaa, 0x64, 0xcc, 0xf7, 0xa, 0xcf,
+ 0xf7, 0xd, 0xf7, 0x49, 0xb4, 0x1e, 0xe6, 0xf8,
+ 0x2b, 0x5, 0xf7, 0x3, 0xa4, 0xa8, 0xc2, 0xb9,
+ 0x1b, 0xba, 0x8c, 0x47, 0x75, 0x4d, 0x79, 0x21,
+ 0x2b, 0x1f, 0x84, 0x6a, 0x5, 0x13, 0xf0, 0xb6,
+ 0x85, 0xaa, 0x5f, 0x3a, 0x1a, 0x5b, 0x6d, 0xfb,
+ 0x46, 0x3f, 0x7a, 0x78, 0x93, 0x9a, 0x80, 0x1e,
+ 0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0xf7, 0x99,
+ 0x34, 0xa, 0x6f, 0x81, 0x62, 0x62, 0x76, 0x1b,
+ 0x84, 0x86, 0x8f, 0x95, 0x44, 0xa, 0x5, 0xfb,
+ 0x1, 0x6, 0x78, 0x4d, 0x6f, 0xa, 0x13, 0xac,
+ 0x27, 0xa, 0x30, 0xa, 0xf7, 0x74, 0xf8, 0x25,
+ 0x2a, 0x1d, 0x5b, 0x1d, 0xf7, 0x93, 0x34, 0xa,
+ 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d, 0x13,
+ 0xac, 0x30, 0xa, 0xf7, 0xd, 0xf8, 0x25, 0x26,
+ 0xa, 0x5b, 0x1d, 0xf7, 0x8c, 0x34, 0xa, 0x71,
+ 0xa, 0x8f, 0x95, 0x28, 0x1d, 0x13, 0xac, 0x30,
+ 0xa, 0xa1, 0xf8, 0x25, 0x42, 0xa, 0xe, 0x5b,
+ 0x1d, 0xe9, 0x8c, 0x1d, 0x76, 0xf7, 0xf, 0x13,
+ 0x6a, 0x28, 0xa, 0x13, 0x9a, 0x6e, 0x80, 0x5e,
+ 0x63, 0x78, 0x3f, 0x1d, 0x13, 0xa6, 0x30, 0xa,
+ 0xa9, 0xf8, 0x3a, 0x50, 0xa, 0xa5, 0xa2, 0x82,
+ 0x81, 0xa1, 0x1f, 0x13, 0xaa, 0x7f, 0xa6, 0xa6,
+ 0x7e, 0xa5, 0x3d, 0x1d, 0x7b, 0x71, 0x98, 0x96,
+ 0x6e, 0x1f, 0x95, 0x72, 0x70, 0x93, 0x72, 0x54,
+ 0x1d, 0x5b, 0x1d, 0xda, 0xf7, 0x1a, 0x74, 0xa,
+ 0xa6, 0x8e, 0xa, 0x13, 0x6f, 0x28, 0xa, 0x13,
+ 0x9f, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d,
+ 0x13, 0xaf, 0x30, 0xa, 0xa6, 0xf8, 0x6d, 0x2e,
+ 0xa, 0x3a, 0xa, 0x58, 0x1d, 0xb0, 0x66, 0xb5,
+ 0xc1, 0xbc, 0x5a, 0xf7, 0x39, 0xfb, 0x8, 0xf7,
+ 0x8, 0xfb, 0x8, 0xf7, 0x38, 0x5b, 0xbb, 0x74,
+ 0xa, 0xf7, 0x3, 0xf7, 0x37, 0xfb, 0x8, 0xf7,
+ 0x8, 0xfb, 0x8, 0xf7, 0x3a, 0x59, 0xbd, 0x13,
+ 0x64, 0xe4, 0x28, 0xa, 0x13, 0x99, 0x64, 0x71,
+ 0xa, 0x8f, 0x95, 0x28, 0x1d, 0x30, 0xa, 0xf7,
+ 0x3, 0xf8, 0x8f, 0x15, 0xc6, 0xba, 0xbb, 0xc6,
+ 0x1e, 0x13, 0xaa, 0xc8, 0xc6, 0xbb, 0x5b, 0x50,
+ 0x50, 0x5b, 0x5c, 0x50, 0x1f, 0x13, 0xa4, 0xe4,
+ 0x50, 0x5c, 0xba, 0xc6, 0x1f, 0x13, 0xaa, 0xd4,
+ 0xba, 0x8c, 0x15, 0x6b, 0xa5, 0x71, 0xab, 0xab,
+ 0xa5, 0xa5, 0xab, 0xab, 0x71, 0xa5, 0x6b, 0x6b,
+ 0x71, 0x71, 0x6b, 0x1e, 0xe, 0xc7, 0x7e, 0xca,
+ 0x4c, 0xd2, 0x5a, 0x76, 0xf7, 0xa, 0x77, 0xf7,
+ 0x14, 0x77, 0xf7, 0x75, 0xb3, 0x6d, 0xa9, 0x8e,
+ 0x77, 0x12, 0x86, 0xf7, 0x12, 0xf8, 0x62, 0xe5,
+ 0x13, 0x9c, 0xc0, 0xf7, 0xac, 0xf7, 0x8, 0x15,
+ 0x8d, 0x6, 0x5b, 0x94, 0x9a, 0x3a, 0xf7, 0x10,
+ 0x1b, 0xf7, 0x17, 0xc4, 0xf7, 0x19, 0x8d, 0x8c,
+ 0x1f, 0x6f, 0x9c, 0x5, 0x7a, 0x82, 0x60, 0x43,
+ 0x44, 0x1b, 0x51, 0x82, 0xc5, 0xa4, 0x9b, 0x8d,
+ 0x9c, 0x8e, 0x9a, 0x1f, 0xb2, 0x94, 0x5, 0xf7,
+ 0x35, 0xb0, 0xce, 0xd4, 0xd2, 0x1a, 0xc8, 0x60,
+ 0xa6, 0x53, 0x68, 0x63, 0x83, 0x56, 0x61, 0x1e,
+ 0x89, 0x8d, 0x9d, 0xc6, 0x5, 0x13, 0x39, 0xc0,
+ 0x28, 0x8e, 0x76, 0x4d, 0x5, 0x88, 0x6, 0xa5,
+ 0x82, 0x7f, 0xaf, 0x4d, 0x1b, 0xfb, 0x10, 0xfb,
+ 0x28, 0xfb, 0x5e, 0xfb, 0x21, 0x26, 0xc9, 0x6d,
+ 0xbe, 0xea, 0xbe, 0xdf, 0xb7, 0xa5, 0x1f, 0xfb,
+ 0x33, 0x8d, 0x15, 0x13, 0x5c, 0xc0, 0xe9, 0xe0,
+ 0xf7, 0x63, 0xd7, 0xb0, 0x99, 0x71, 0x66, 0x5a,
+ 0x49, 0xfb, 0x8d, 0x2b, 0x67, 0x7d, 0xa8, 0xaa,
+ 0x1e, 0xf7, 0xb8, 0xeb, 0x15, 0x90, 0x9c, 0x5,
+ 0x13, 0x9a, 0xc0, 0xc1, 0x9b, 0xb5, 0xf7, 0x24,
+ 0xd5, 0x1b, 0xac, 0x8b, 0x6f, 0x7d, 0xfb, 0xd,
+ 0xfb, 0x22, 0x57, 0x6f, 0x1f, 0xe, 0xfb, 0x6e,
+ 0xfb, 0x6e, 0xb4, 0xd8, 0xf7, 0x2b, 0xfb, 0x2,
+ 0x77, 0xe3, 0x76, 0xf7, 0xce, 0xf7, 0x34, 0x6a,
+ 0xac, 0x12, 0x73, 0xf7, 0x14, 0x13, 0xba, 0xf7,
+ 0x3, 0x7f, 0x15, 0x54, 0x3b, 0x98, 0x7f, 0x5,
+ 0x13, 0xca, 0x7d, 0xa, 0x74, 0x7c, 0x6c, 0x6e,
+ 0x79, 0x86, 0xa, 0xa1, 0x79, 0xbf, 0x1b, 0xc0,
+ 0xe7, 0x9e, 0xca, 0x1f, 0x13, 0xba, 0xc7, 0x49,
+ 0x9c, 0x73, 0x82, 0x83, 0x8a, 0x89, 0x82, 0x1e,
+ 0xae, 0xbf, 0xe0, 0x96, 0xcb, 0xcb, 0xb4, 0xc5,
+ 0x19, 0x6f, 0x9d, 0x5, 0x13, 0xc6, 0x51, 0x63,
+ 0x53, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0xaa, 0xdb,
+ 0xd2, 0xda, 0xf7, 0x58, 0xe2, 0x94, 0x99, 0x87,
+ 0x7e, 0x86, 0x88, 0x85, 0x87, 0x84, 0x1f, 0x85,
+ 0x81, 0x83, 0x7e, 0x7a, 0x1a, 0x13, 0xba, 0x84,
+ 0x1d, 0x60, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x30,
+ 0xfb, 0x2e, 0xfb, 0x2d, 0x23, 0xd3, 0x4c, 0xca,
+ 0x1e, 0xe, 0x2f, 0xa, 0xf7, 0x2a, 0xf7, 0xc2,
+ 0x15, 0xb6, 0x6, 0xfb, 0x1, 0x5f, 0x1d, 0x2f,
+ 0xa, 0xbe, 0xf7, 0xc2, 0x15, 0xb8, 0x5a, 0xa,
+ 0x68, 0x1d, 0xf7, 0x78, 0x22, 0xa, 0x5b, 0xf7,
+ 0xc2, 0x15, 0xc0, 0x6, 0xf7, 0x17, 0xe8, 0xe4,
+ 0x2e, 0x5, 0xbd, 0x6, 0x35, 0x4e, 0xa, 0xe,
+ 0x68, 0x1d, 0xc7, 0xf7, 0x19, 0x12, 0x90, 0xf7,
+ 0x16, 0x69, 0xf7, 0x19, 0xd3, 0xe7, 0x2f, 0xf7,
+ 0x1d, 0x13, 0xf4, 0x20, 0xa, 0x13, 0xea, 0x5c,
+ 0xf8, 0xa, 0x15, 0x67, 0xa, 0xf7, 0x65, 0x16,
+ 0x67, 0xa, 0xe, 0x66, 0x1d, 0xf9, 0x56, 0x3c,
+ 0x1d, 0x74, 0xf8, 0x19, 0x7b, 0xa, 0xfb, 0x4,
+ 0x5f, 0x1d, 0x66, 0x1d, 0xf9, 0x56, 0x6c, 0x1d,
+ 0x52, 0x55, 0x8f, 0xa, 0x90, 0x94, 0x24, 0xa,
+ 0xfb, 0x12, 0xf8, 0x19, 0x26, 0xa, 0x66, 0x1d,
+ 0xf9, 0x4f, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b,
+ 0x84, 0x32, 0xa, 0xfb, 0x84, 0xf8, 0x19, 0x15,
+ 0xc4, 0x6, 0xf7, 0x16, 0xe8, 0xe4, 0x2e, 0x5,
+ 0xbe, 0x6, 0x34, 0x4e, 0xa, 0xe, 0x66, 0x1d,
+ 0xf8, 0xa6, 0xf7, 0x1a, 0x1, 0x9c, 0xf7, 0x1a,
+ 0xd6, 0xf7, 0x1a, 0x3, 0xf7, 0x6c, 0xf7, 0x21,
+ 0x15, 0x71, 0x88, 0x51, 0x56, 0x74, 0x1b, 0x85,
+ 0x88, 0x90, 0x94, 0x24, 0xa, 0xfb, 0x71, 0xf8,
+ 0x61, 0x2e, 0xa, 0xf7, 0x65, 0x2d, 0x1d, 0x7e,
+ 0xa8, 0xf8, 0x35, 0x6e, 0xa, 0xf7, 0x2e, 0x90,
+ 0xa, 0xf7, 0x6b, 0x7b, 0x1d, 0x7d, 0x59, 0x40,
+ 0x51, 0xfb, 0xaa, 0x2b, 0x57, 0x8b, 0xf7, 0xa,
+ 0x9f, 0x1e, 0xf7, 0x77, 0xf7, 0x9e, 0x15, 0xa9,
+ 0x7a, 0x6f, 0x97, 0x73, 0x1b, 0xfb, 0x28, 0xfb,
+ 0x15, 0xfb, 0x2e, 0xfb, 0x2e, 0x2b, 0xd9, 0x44,
+ 0xdd, 0xf7, 0x2f, 0xf7, 0x15, 0xf7, 0x45, 0xf7,
+ 0x6c, 0xe0, 0x66, 0xdd, 0x52, 0xc8, 0x1f, 0xf6,
+ 0xc3, 0x69, 0xab, 0x20, 0x52, 0x64, 0xab, 0x5d,
+ 0xa1, 0x5c, 0x91, 0x19, 0x5f, 0x70, 0xb1, 0x85,
+ 0xb5, 0x73, 0xaf, 0x68, 0x19, 0xfb, 0xe, 0x4b,
+ 0xac, 0x6c, 0xf7, 0xb, 0xc9, 0x5, 0xae, 0x5f,
+ 0xa6, 0x56, 0x56, 0x1a, 0xe, 0x21, 0x97, 0x76,
+ 0xa9, 0x76, 0xf8, 0x62, 0x77, 0xf7, 0x1e, 0xd6,
+ 0x12, 0x13, 0x70, 0x78, 0xa, 0x98, 0x97, 0x81,
+ 0x7f, 0x1f, 0x75, 0x33, 0xfb, 0x6f, 0x44, 0x1a,
+ 0x13, 0xb0, 0x76, 0x1d, 0x68, 0x80, 0x60, 0x63,
+ 0x77, 0x88, 0x1d, 0x91, 0x96, 0x1f, 0xa8, 0xe2,
+ 0xf7, 0x68, 0xcc, 0x4f, 0xa, 0x13, 0x70, 0x88,
+ 0xa, 0xf7, 0x2b, 0xf8, 0xad, 0x50, 0xa, 0xa9,
+ 0xa1, 0x81, 0x81, 0xa1, 0x1f, 0x7f, 0xa4, 0xa3,
+ 0x7f, 0xa7, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96,
+ 0x70, 0x1f, 0x95, 0x71, 0x6d, 0x96, 0x70, 0x54,
+ 0x1d, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xf7, 0x81,
+ 0x37, 0xa, 0xf7, 0xdd, 0xf8, 0xe, 0x2a, 0x1d,
+ 0x7e, 0xa8, 0xf8, 0x33, 0x6e, 0xa, 0xe3, 0x90,
+ 0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7f, 0x59, 0x40,
+ 0x51, 0xfb, 0xaa, 0x36, 0xa, 0xf7, 0x40, 0xf7,
+ 0x29, 0xf7, 0x1a, 0xfb, 0xb, 0x9d, 0x4b, 0x1d,
+ 0xf7, 0x76, 0xf8, 0xe, 0x26, 0xa, 0x8f, 0x1d,
+ 0xf7, 0x7a, 0x37, 0xa, 0xf7, 0x13, 0xf8, 0xe,
+ 0x42, 0xa, 0xe, 0x8f, 0x1d, 0xd7, 0x8c, 0x1d,
+ 0x4e, 0x1d, 0x13, 0xdc, 0x23, 0xa, 0xf7, 0x1b,
+ 0xf8, 0x23, 0x50, 0xa, 0xa9, 0xa0, 0x81, 0x80,
+ 0xa0, 0x1f, 0x13, 0xec, 0x80, 0xa2, 0xa2, 0x7f,
+ 0xac, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, 0x71,
+ 0x1f, 0x95, 0x70, 0x6d, 0x96, 0x70, 0x54, 0x1d,
+ 0x8f, 0x1d, 0xc8, 0xf7, 0x1a, 0x12, 0x88, 0xf7,
+ 0xb, 0x93, 0xf7, 0x1a, 0xcb, 0xf7, 0xb, 0xfb,
+ 0x1, 0xf7, 0x1a, 0x13, 0xfc, 0x23, 0xa, 0xf7,
+ 0x13, 0xf8, 0x56, 0x2e, 0xa, 0x13, 0xfa, 0x3a,
+ 0xa, 0x2f, 0x6e, 0xef, 0x27, 0xf7, 0x28, 0xe7,
+ 0xe1, 0x36, 0xd0, 0xf5, 0xf7, 0x28, 0x27, 0xef,
+ 0x12, 0xf7, 0x67, 0xf7, 0x28, 0xfb, 0xc, 0xef,
+ 0x13, 0x5a, 0xac, 0xf7, 0x68, 0x15, 0xf8, 0x8c,
+ 0xd0, 0xfc, 0x8c, 0x6, 0x13, 0xa5, 0xf7, 0x62,
+ 0xfb, 0x98, 0x15, 0x66, 0xa, 0xf8, 0x64, 0x4,
+ 0x66, 0xa, 0xe, 0x29, 0x76, 0xf5, 0xa8, 0xcd,
+ 0x77, 0xf8, 0x8, 0xa8, 0xec, 0x5c, 0x1d, 0xe1,
+ 0x90, 0xa, 0xf7, 0xb0, 0xf7, 0x0, 0x98, 0x96,
+ 0x86, 0x81, 0x94, 0x1e, 0xfb, 0x51, 0xfb, 0xe5,
+ 0x6f, 0xa, 0x61, 0x40, 0x15, 0x43, 0xfb, 0x12,
+ 0x5, 0xb3, 0x6, 0xcb, 0xf7, 0x6, 0x5, 0x86,
+ 0x9b, 0x9d, 0x88, 0x9c, 0x1b, 0xf7, 0x34, 0xf7,
+ 0x10, 0xf7, 0x40, 0xf7, 0x29, 0xda, 0x62, 0xb2,
+ 0x62, 0x9d, 0x1f, 0xcc, 0xf7, 0x8, 0x5, 0x66,
+ 0x6, 0x50, 0x23, 0x5, 0x90, 0x79, 0x71, 0x8d,
+ 0x81, 0x1b, 0xfb, 0x32, 0xfb, 0xb, 0xfb, 0x41,
+ 0xfb, 0x2e, 0x4d, 0xab, 0x5f, 0xb8, 0x74, 0x1f,
+ 0xc1, 0xa6, 0x15, 0xf7, 0x55, 0xf7, 0xeb, 0x5,
+ 0x8c, 0x8a, 0x8b, 0x87, 0x88, 0x1a, 0x40, 0x51,
+ 0xfb, 0xaa, 0x2b, 0x77, 0x7f, 0x92, 0x96, 0x83,
+ 0x1e, 0xe, 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1,
+ 0x2c, 0x1d, 0x54, 0x4e, 0x8f, 0xa, 0x91, 0x97,
+ 0x31, 0xa, 0x79, 0x86, 0x97, 0x9a, 0x9e, 0x94,
+ 0xa4, 0x2d, 0xa, 0xcf, 0xf7, 0xfd, 0x2a, 0x1d,
+ 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1, 0x29, 0xa,
+ 0x96, 0x9b, 0x9e, 0x94, 0xa4, 0x2d, 0xa, 0x68,
+ 0xf7, 0xfd, 0x26, 0xa, 0x64, 0xa, 0xf7, 0x99,
+ 0x77, 0x1, 0x29, 0xa, 0x95, 0x9a, 0x9e, 0x94,
+ 0xa6, 0x2d, 0xa, 0xfb, 0x1a, 0xf7, 0xfd, 0x42,
+ 0xa, 0xe, 0x64, 0xa, 0xe7, 0xf7, 0x1a, 0x1,
+ 0xf7, 0x2c, 0x8e, 0xa, 0x3, 0x29, 0xa, 0x96,
+ 0x9a, 0x9e, 0x94, 0xa5, 0x2d, 0xa, 0xfb, 0x1a,
+ 0xf8, 0x45, 0x2e, 0xa, 0x3a, 0xa, 0x79, 0x1d,
+ 0xf7, 0x93, 0x77, 0x1, 0x35, 0x1d, 0x55, 0x4b,
+ 0x4a, 0x70, 0x7b, 0x7e, 0x93, 0x93, 0x7e, 0x1e,
+ 0x94, 0x7c, 0x7c, 0x95, 0x77, 0x38, 0x1d, 0x6f,
+ 0x96, 0x7e, 0x97, 0x82, 0x1e, 0x9a, 0x7f, 0x9c,
+ 0x85, 0x72, 0x7a, 0xa, 0x5b, 0xf8, 0x27, 0x26,
+ 0xa, 0x87, 0x1d, 0xf7, 0x81, 0x77, 0x59, 0x1d,
+ 0x74, 0x6b, 0x43, 0x44, 0xfb, 0x86, 0x4f, 0x1d,
+ 0x5a, 0x1f, 0x88, 0x8e, 0xea, 0xf7, 0xe8, 0x44,
+ 0x77, 0x1d, 0x1a, 0x7e, 0xfb, 0xe, 0xfc, 0x5e,
+ 0x4c, 0xfb, 0x88, 0x1e, 0x4d, 0x7b, 0x75, 0x87,
+ 0xa, 0x77, 0xa9, 0xab, 0xa1, 0x9e, 0xc7, 0x93,
+ 0xac, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x61, 0xf7,
+ 0x7, 0xf7, 0x65, 0x77, 0xf7, 0xff, 0x77, 0xda,
+ 0xf7, 0x1a, 0x12, 0xeb, 0x8e, 0xa, 0xfb, 0x2,
+ 0xcb, 0x13, 0xfa, 0x45, 0xa, 0x94, 0x94, 0x7d,
+ 0x1e, 0x94, 0x7d, 0x7e, 0x93, 0x78, 0x38, 0x1d,
+ 0x6c, 0x98, 0x7e, 0x98, 0x82, 0x1e, 0x99, 0x81,
+ 0x9a, 0x84, 0x74, 0x7a, 0xa, 0xfb, 0x27, 0xf8,
+ 0x6f, 0x2e, 0xa, 0x13, 0xfc, 0x3a, 0xa, 0x66,
+ 0x1d, 0xf8, 0x6b, 0x3c, 0x1d, 0xe, 0x53, 0x1d,
+ 0x56, 0x7d, 0x96, 0x9c, 0x94, 0x8e, 0x97, 0x8f,
+ 0x98, 0x1f, 0xbd, 0xf7, 0x4d, 0xf7, 0x28, 0xde,
+ 0xa0, 0xd1, 0xfb, 0x2a, 0x3a, 0xc7, 0xf7, 0x67,
+ 0x9c, 0xc7, 0xa7, 0x94, 0xc3, 0x8e, 0x82, 0xa,
+ 0xba, 0x84, 0xa3, 0x79, 0x74, 0x1a, 0x83, 0x8b,
+ 0x83, 0x89, 0x83, 0x1e, 0x3e, 0xfb, 0xa8, 0x27,
+ 0x56, 0x75, 0x45, 0xf3, 0xc3, 0x69, 0xfb, 0xe,
+ 0x7b, 0x52, 0x76, 0x8c, 0x60, 0x85, 0x19, 0xe,
+ 0x66, 0x1d, 0xf9, 0x58, 0x77, 0x1, 0xf7, 0x66,
+ 0xf7, 0x21, 0x15, 0x71, 0x88, 0x52, 0x56, 0x8f,
+ 0xa, 0x90, 0x94, 0x9f, 0x9b, 0xc5, 0x91, 0xa1,
+ 0x1f, 0xc4, 0xf7, 0x61, 0xe1, 0xba, 0x9e, 0xcf,
+ 0x35, 0x5c, 0xd0, 0xf7, 0x8e, 0x7f, 0xa, 0x8d,
+ 0xac, 0x8b, 0x6c, 0x1a, 0x76, 0x6f, 0x28, 0x71,
+ 0x2f, 0x1e, 0x3d, 0x60, 0x78, 0x45, 0xd8, 0xb6,
+ 0x5, 0x65, 0xfb, 0x1d, 0x6d, 0xfb, 0x1, 0x70,
+ 0x1a, 0x7d, 0x85, 0x56, 0xcf, 0xdb, 0xbd, 0xd0,
+ 0xce, 0xb7, 0x1e, 0xe, 0xf7, 0xae, 0x83, 0xab,
+ 0x73, 0xab, 0xf7, 0xc4, 0xad, 0xf7, 0x9f, 0xab,
+ 0x73, 0xab, 0x12, 0xa2, 0xf7, 0x21, 0x13, 0xb4,
+ 0xf8, 0xe1, 0xf7, 0xe4, 0x15, 0xde, 0x8a, 0xba,
+ 0x80, 0x48, 0x1a, 0x83, 0x88, 0x6b, 0x8a, 0x7d,
+ 0x1e, 0xa6, 0x86, 0xd3, 0xf7, 0xa4, 0x70, 0x8e,
+ 0x72, 0x54, 0x71, 0x5a, 0xfb, 0x1e, 0x8c, 0x19,
+ 0xc8, 0xf7, 0x70, 0x5, 0xac, 0x94, 0x8f, 0x99,
+ 0xb0, 0x1b, 0xf7, 0x44, 0x81, 0x30, 0x4d, 0x1f,
+ 0xa4, 0x85, 0xb9, 0xf7, 0x53, 0x5, 0xfb, 0xe3,
+ 0x6, 0x78, 0x6d, 0x8d, 0x8d, 0x71, 0x1f, 0x13,
+ 0xac, 0x8d, 0x70, 0x73, 0x8d, 0x82, 0x1b, 0xfb,
+ 0x24, 0xfb, 0xc9, 0xfb, 0x6, 0xfb, 0xe0, 0xfb,
+ 0xc, 0xeb, 0xfb, 0xb, 0xf7, 0x3c, 0x1f, 0xf7,
+ 0x35, 0x92, 0x5, 0x13, 0x74, 0xd5, 0x8c, 0x5,
+ 0xf7, 0xbc, 0x6, 0xc7, 0xf7, 0x56, 0x70, 0x90,
+ 0x5, 0x46, 0x67, 0x40, 0x29, 0xfb, 0x14, 0x1b,
+ 0x4c, 0x70, 0x8e, 0xa9, 0x92, 0x8c, 0x94, 0x8d,
+ 0x95, 0x1f, 0xfb, 0x19, 0xab, 0x15, 0x13, 0xac,
+ 0x4e, 0x7a, 0x73, 0x65, 0x4b, 0x1b, 0xfb, 0x4,
+ 0x80, 0xf2, 0xab, 0xf7, 0xe, 0xdf, 0xf7, 0xff,
+ 0xf7, 0x50, 0x8c, 0x1f, 0x9e, 0xc4, 0x8b, 0x4b,
+ 0x74, 0x81, 0x67, 0x89, 0x83, 0x1f, 0xe, 0xc7,
+ 0x7e, 0xa8, 0x6e, 0xca, 0xf8, 0x13, 0xa8, 0x12,
+ 0x91, 0xf7, 0x9, 0x13, 0x70, 0xf8, 0x39, 0xf7,
+ 0x6e, 0x15, 0xf7, 0x6a, 0xd2, 0xaf, 0x8b, 0xa3,
+ 0x1b, 0x9e, 0x9a, 0x7c, 0x70, 0x89, 0x8b, 0xfb,
+ 0x17, 0xfb, 0x39, 0x64, 0x1f, 0x20, 0xfb, 0x42,
+ 0x15, 0x5c, 0xb3, 0xb8, 0x81, 0xa7, 0x1b, 0xe6,
+ 0xc5, 0xbd, 0xe2, 0xb6, 0x1f, 0x6f, 0x9a, 0x5,
+ 0x58, 0x6a, 0x70, 0x65, 0x4f, 0x1b, 0x60, 0x75,
+ 0xb8, 0xbc, 0x98, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+ 0xf1, 0xa2, 0xf7, 0x32, 0xb3, 0xf7, 0xd, 0x1a,
+ 0xd5, 0x50, 0x9f, 0x54, 0x49, 0x60, 0x69, 0x6f,
+ 0x68, 0x1e, 0xa4, 0x7a, 0x70, 0xb0, 0x42, 0x1b,
+ 0xfb, 0x49, 0xfb, 0x4, 0xfb, 0x5c, 0x22, 0xfb,
+ 0x39, 0xf7, 0x19, 0x86, 0xa5, 0xaf, 0xd0, 0x96,
+ 0xb9, 0xb7, 0x1f, 0xfb, 0x53, 0xc7, 0x15, 0xea,
+ 0xca, 0xf7, 0x1e, 0x8a, 0x87, 0x1e, 0xb9, 0x9f,
+ 0xa6, 0xc1, 0xbb, 0x1b, 0xc3, 0x8c, 0x56, 0x76,
+ 0x1f, 0x13, 0xb0, 0x56, 0x51, 0xfb, 0xb6, 0x28,
+ 0x5d, 0x80, 0xb1, 0xbd, 0x1e, 0xe, 0x21, 0x79,
+ 0xad, 0xf9, 0xe, 0xae, 0x87, 0x77, 0xf7, 0x80,
+ 0x85, 0x1d, 0x13, 0xdc, 0x8d, 0x79, 0x15, 0xa9,
+ 0x6, 0xa2, 0x95, 0x90, 0x97, 0xa4, 0x1b, 0x9c,
+ 0xa3, 0x7e, 0x81, 0xad, 0x1f, 0x84, 0xa1, 0xa6,
+ 0x86, 0xa9, 0x1b, 0xf7, 0x2f, 0xe2, 0xdb, 0xf7,
+ 0x18, 0xd9, 0x4d, 0xc8, 0x4d, 0xc2, 0x1f, 0x4e,
+ 0xc2, 0x4f, 0xbb, 0xbf, 0x1a, 0x96, 0x83, 0xeb,
+ 0xf1, 0xf7, 0x6, 0xa1, 0xfb, 0x2, 0x53, 0x91,
+ 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xbc, 0xb3, 0xf7,
+ 0x5d, 0x5, 0x6d, 0x6, 0x71, 0x7f, 0x6f, 0x8b,
+ 0x87, 0x1b, 0x7b, 0x76, 0x93, 0x93, 0x73, 0x1f,
+ 0x13, 0xdc, 0x92, 0x75, 0x72, 0x92, 0x70, 0x1b,
+ 0xfb, 0x1a, 0x3a, 0x2b, 0x26, 0x3e, 0xc2, 0x57,
+ 0xc5, 0x5b, 0x1f, 0xcb, 0x56, 0xcf, 0x5b, 0x47,
+ 0x1a, 0x77, 0x82, 0x21, 0xfb, 0x4, 0x61, 0xfb,
+ 0x8, 0x9b, 0xf7, 0x40, 0x8a, 0x1e, 0x6e, 0x8d,
+ 0x5, 0xf7, 0x94, 0xf8, 0x99, 0x15, 0xdd, 0x6,
+ 0xf7, 0x2a, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb,
+ 0xf, 0x78, 0x1d, 0xfb, 0xa5, 0x93, 0x76, 0xf8,
+ 0x4e, 0xac, 0x8a, 0x77, 0xf7, 0x8d, 0x77, 0x12,
+ 0xf7, 0x40, 0xf6, 0x13, 0xd8, 0x85, 0xa, 0x98,
+ 0x96, 0x85, 0x85, 0x9a, 0x1f, 0x87, 0x97, 0x99,
+ 0x87, 0x9e, 0x1b, 0xcb, 0xe9, 0xb0, 0xec, 0xba,
+ 0x6e, 0xb7, 0x6c, 0xb3, 0x1f, 0x66, 0xba, 0x63,
+ 0xb5, 0xad, 0x1a, 0x90, 0x85, 0xbc, 0xc0, 0xc6,
+ 0xa6, 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5,
+ 0x13, 0xb8, 0x79, 0xa, 0x7a, 0x82, 0x90, 0x91,
+ 0x7f, 0x1f, 0x13, 0xd8, 0x90, 0x80, 0x7d, 0x91,
+ 0x73, 0x1b, 0x4a, 0x3e, 0x67, 0x32, 0x4e, 0xaa,
+ 0x65, 0xbc, 0x4c, 0x1f, 0xa4, 0x6b, 0x9f, 0x5e,
+ 0x69, 0x1a, 0x70, 0x7d, 0x77, 0x66, 0x82, 0x48,
+ 0x7c, 0xa, 0xf7, 0x6a, 0xf8, 0xa5, 0x60, 0x1d,
+ 0x58, 0x8b, 0xa4, 0xf8, 0xff, 0xa4, 0xc5, 0xf7,
+ 0x1b, 0x1, 0xf7, 0x74, 0xf7, 0x1b, 0xd8, 0xf7,
+ 0x1b, 0x3, 0xd4, 0x16, 0xf7, 0xd6, 0xa4, 0x6,
+ 0x64, 0x67, 0x95, 0xac, 0x93, 0x8d, 0x95, 0x8f,
+ 0x96, 0x1f, 0xbf, 0xf7, 0x67, 0xf7, 0x52, 0xf7,
+ 0x9f, 0x90, 0x1d, 0xb6, 0x93, 0x19, 0xa4, 0xfb,
+ 0x64, 0x72, 0x7, 0xbc, 0x89, 0x9f, 0x7c, 0x74,
+ 0x1a, 0x79, 0x80, 0x74, 0x7a, 0x72, 0x1e, 0xfb,
+ 0x15, 0xfb, 0x4e, 0x5, 0x4b, 0xf7, 0x5c, 0x7e,
+ 0x96, 0xa7, 0x1a, 0xa2, 0x97, 0xa9, 0xc5, 0x1e,
+ 0xa4, 0xfb, 0xaf, 0x72, 0x7, 0xbb, 0x84, 0x92,
+ 0x94, 0x9d, 0x54, 0xe3, 0xfb, 0xaa, 0x18, 0x4f,
+ 0xfb, 0x6c, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86,
+ 0x19, 0xf7, 0x2b, 0xf9, 0x95, 0x46, 0x1d, 0x58,
+ 0x58, 0xa, 0xf7, 0x78, 0x77, 0x3e, 0xa, 0xf7,
+ 0xd1, 0xf9, 0x40, 0x60, 0xa, 0xfb, 0xa5, 0x52,
+ 0x76, 0xf8, 0x43, 0xeb, 0xf7, 0x85, 0x77, 0x1,
+ 0x72, 0x75, 0x15, 0xa7, 0xb1, 0x92, 0x8a, 0x9a,
+ 0x1b, 0xa5, 0xa4, 0x78, 0x78, 0xa8, 0x1f, 0x75,
+ 0xac, 0xb2, 0x74, 0xbf, 0x76, 0xa, 0x7e, 0x8f,
+ 0x82, 0x8f, 0x85, 0x1f, 0x90, 0x83, 0x92, 0x86,
+ 0x83, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x71, 0x81,
+ 0xa2, 0xa8, 0x7c, 0x1e, 0x7a, 0xad, 0x73, 0xb5,
+ 0x4c, 0xa4, 0x80, 0xa, 0xfb, 0x2e, 0x70, 0x1d,
+ 0xfb, 0xf6, 0x5, 0xf7, 0x73, 0xf8, 0x99, 0x60,
+ 0xa, 0xfb, 0x30, 0xf7, 0x27, 0xf8, 0x29, 0xb7,
+ 0xf7, 0xb, 0xf7, 0x28, 0x6d, 0xa9, 0x12, 0xf8,
+ 0x3c, 0xf7, 0x5, 0x13, 0xd8, 0xd9, 0xf8, 0x20,
+ 0x15, 0xf4, 0x6, 0x3f, 0xfc, 0x22, 0x8f, 0x3d,
+ 0x55, 0x69, 0x8, 0x85, 0x82, 0x77, 0x85, 0x7c,
+ 0x1b, 0x81, 0x83, 0x8f, 0x94, 0x91, 0x94, 0x93,
+ 0x93, 0x96, 0x1f, 0x91, 0x93, 0x90, 0x95, 0x96,
+ 0x1a, 0x9c, 0x7e, 0xac, 0x64, 0x5c, 0x80, 0x62,
+ 0x7d, 0x48, 0xc0, 0x72, 0xc3, 0xf7, 0x7, 0xef,
+ 0xe5, 0xf7, 0xc8, 0xc1, 0x1e, 0xa6, 0xf7, 0x2e,
+ 0x5, 0xf7, 0x8, 0x6, 0x94, 0xb7, 0x5, 0xfb,
+ 0xa, 0x6, 0xf7, 0x1f, 0xa2, 0x9b, 0xed, 0xcc,
+ 0x1b, 0x97, 0x97, 0x86, 0x81, 0x86, 0x86, 0x86,
+ 0x85, 0x86, 0x1f, 0x83, 0x83, 0x81, 0x81, 0x77,
+ 0x1a, 0x13, 0xe8, 0x66, 0xaa, 0x7e, 0x9d, 0xcb,
+ 0x8b, 0xc0, 0x95, 0xba, 0x5c, 0xb1, 0x4f, 0xfb,
+ 0x41, 0x64, 0xfb, 0x54, 0x40, 0x72, 0x1e, 0x20,
+ 0x6, 0xe, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+ 0xb3, 0xf8, 0x98, 0x5b, 0xa, 0xe6, 0xe3, 0x30,
+ 0x7e, 0x1d, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+ 0xf7, 0x3b, 0xf8, 0x98, 0x60, 0x1d, 0xfb, 0xdd,
+ 0xf8, 0x98, 0xd3, 0x43, 0xf7, 0x36, 0x1, 0xd3,
+ 0xf9, 0x3a, 0x15, 0xb6, 0x6, 0x57, 0x90, 0xaa,
+ 0x65, 0xd3, 0x1b, 0xe5, 0x9e, 0xc3, 0xad, 0x9b,
+ 0x1f, 0xb2, 0x6, 0x85, 0x80, 0xfb, 0x30, 0xfb,
+ 0x37, 0xfb, 0x1f, 0x89, 0xf7, 0xa, 0xb7, 0x1e,
+ 0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1,
+ 0xf7, 0x57, 0xf7, 0x16, 0x3, 0xf7, 0x37, 0xf8,
+ 0xe2, 0x15, 0x4b, 0xa, 0xe, 0xfb, 0xdd, 0xf8,
+ 0x9d, 0xbc, 0xf7, 0xb, 0xbb, 0x1, 0xf7, 0x6,
+ 0xbb, 0xf7, 0x15, 0xbc, 0x3, 0xf7, 0x13, 0xf9,
+ 0x3, 0x15, 0x4f, 0xbb, 0x5c, 0xc6, 0xc5, 0xbb,
+ 0xbb, 0xc6, 0xc5, 0x5b, 0xbb, 0x51, 0x50, 0x5b,
+ 0x5c, 0x5e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x41,
+ 0xd0, 0xf7, 0x28, 0x77, 0x1, 0x63, 0xdf, 0x3,
+ 0xa7, 0xb7, 0x15, 0x63, 0x5f, 0x6f, 0x5e, 0x5e,
+ 0x1a, 0x46, 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6,
+ 0xbb, 0xa1, 0x1e, 0x71, 0x99, 0x5, 0x81, 0x79,
+ 0x7e, 0x81, 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba,
+ 0xa4, 0x98, 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb,
+ 0xdd, 0xf8, 0xb2, 0xf6, 0x30, 0x76, 0xa6, 0x76,
+ 0xb0, 0xd6, 0x41, 0xcf, 0x12, 0x13, 0x30, 0x87,
+ 0xf8, 0xb3, 0x15, 0xaf, 0x6, 0x13, 0x48, 0x9c,
+ 0x92, 0x93, 0xa0, 0xa9, 0x1b, 0xa5, 0xa1, 0x82,
+ 0x81, 0x9f, 0x1f, 0x13, 0x80, 0x81, 0xa0, 0xa0,
+ 0x81, 0xa5, 0x1b, 0xd9, 0x9f, 0xd6, 0xab, 0x93,
+ 0x1f, 0x66, 0x6, 0x7a, 0x83, 0x82, 0x76, 0x6c,
+ 0x1b, 0x7e, 0x74, 0x95, 0x95, 0x72, 0x1f, 0x94,
+ 0x74, 0x72, 0x94, 0x73, 0x1b, 0x13, 0x30, 0x33,
+ 0x7a, 0x23, 0x89, 0x1f, 0xe, 0xfb, 0xdd, 0xf8,
+ 0x98, 0xf7, 0x49, 0x1, 0xd0, 0xf8, 0x98, 0x15,
+ 0xbb, 0x6, 0xf7, 0x2d, 0x21, 0x1d, 0xd0, 0xfb,
+ 0x17, 0x15, 0xba, 0x5a, 0xa, 0xf7, 0x46, 0xc7,
+ 0x4f, 0xe6, 0x1, 0x80, 0xf7, 0x46, 0x15, 0xf8,
+ 0x55, 0xc7, 0xfc, 0x55, 0x6, 0xe, 0xf7, 0xe6,
+ 0xf7, 0x46, 0xc8, 0x4e, 0xe6, 0x1, 0xf7, 0x46,
+ 0x4, 0xfa, 0x53, 0xc8, 0xfe, 0x53, 0x6, 0xe,
+ 0xfb, 0xdd, 0x69, 0x1d, 0xf7, 0x14, 0xe1, 0x35,
+ 0xf7, 0x30, 0x13, 0xe0, 0xf7, 0xe0, 0xf9, 0x29,
+ 0x15, 0x5c, 0xa, 0xc6, 0x7b, 0xa6, 0x1e, 0x13,
+ 0xd0, 0xb4, 0xa8, 0xab, 0xb5, 0xa9, 0x7c, 0x9a,
+ 0x7a, 0x97, 0x1f, 0x13, 0xe0, 0x79, 0x98, 0x77,
+ 0x94, 0xa1, 0x7a, 0x1d, 0xe, 0xfb, 0xdd, 0x69,
+ 0x1d, 0xf7, 0x26, 0x6d, 0x1d, 0x13, 0xd0, 0xf7,
+ 0x3, 0xf8, 0x5, 0x15, 0x49, 0xa, 0x13, 0xe0,
+ 0x62, 0x6e, 0x6b, 0x61, 0x6b, 0x9c, 0x7d, 0x9c,
+ 0x7f, 0x1f, 0x13, 0xd0, 0x9d, 0x7f, 0x9d, 0x81,
+ 0x89, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x35, 0x62,
+ 0xa, 0xb6, 0x6d, 0x1d, 0x13, 0xd0, 0x86, 0xfb,
+ 0x32, 0x15, 0x98, 0x73, 0x5, 0x49, 0xa, 0x13,
+ 0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6f, 0x98, 0x7c,
+ 0x9a, 0x80, 0x1f, 0x13, 0xd0, 0x9e, 0x7c, 0xa2,
+ 0x83, 0x73, 0x54, 0xa, 0xe, 0x69, 0x1d, 0xc0,
+ 0xe1, 0x35, 0xf7, 0x30, 0xef, 0xe1, 0x35, 0xf7,
+ 0x30, 0x13, 0xd8, 0xf7, 0x95, 0xf9, 0x29, 0x15,
+ 0x63, 0xa, 0xab, 0x79, 0x9a, 0x7a, 0x97, 0x1e,
+ 0x13, 0xe4, 0x79, 0x97, 0x7a, 0x94, 0xa0, 0x7a,
+ 0x1d, 0xf7, 0x94, 0x16, 0x63, 0xa, 0xa8, 0x7c,
+ 0x9a, 0x7b, 0x97, 0x1e, 0x13, 0xe8, 0x78, 0x99,
+ 0x77, 0x93, 0xa2, 0x7a, 0x1d, 0xe, 0x69, 0x1d,
+ 0xf0, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4,
+ 0xf7, 0xd6, 0xf8, 0x5, 0x15, 0x40, 0xa, 0x6d,
+ 0x61, 0x6c, 0x9c, 0x7b, 0x9c, 0x7f, 0x1f, 0x13,
+ 0xd4, 0x9d, 0x7e, 0x9d, 0x81, 0x89, 0xa, 0xfb,
+ 0x87, 0x73, 0x15, 0x40, 0xa, 0x6d, 0x61, 0x6d,
+ 0x9a, 0x7c, 0x9b, 0x7f, 0x1f, 0x13, 0xd8, 0x9e,
+ 0x7d, 0x9f, 0x81, 0x75, 0x54, 0xa, 0xe, 0xfb,
+ 0x35, 0x62, 0xa, 0x82, 0x6d, 0x1d, 0xef, 0x6d,
+ 0x1d, 0x13, 0xe4, 0xf7, 0x5b, 0xfb, 0x32, 0x15,
+ 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6a,
+ 0x9d, 0x7c, 0x9d, 0x7f, 0x1f, 0x13, 0xd4, 0x9c,
+ 0x7f, 0x9c, 0x82, 0x89, 0xa, 0xfb, 0x94, 0x16,
+ 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6c,
+ 0x9b, 0x7c, 0x9c, 0x7f, 0x1f, 0x13, 0xd8, 0x9d,
+ 0x7e, 0x9e, 0x82, 0x75, 0x54, 0xa, 0xe, 0xfb,
+ 0x10, 0x76, 0xf8, 0xb7, 0xf3, 0x4c, 0xa3, 0xf7,
+ 0x6e, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x30, 0xfb,
+ 0x25, 0x15, 0xa2, 0x6, 0xb1, 0xf7, 0x1e, 0xb0,
+ 0xf7, 0x4d, 0xd0, 0xe6, 0x8, 0x81, 0x99, 0x7b,
+ 0xce, 0xbe, 0x1a, 0x9b, 0x8d, 0x9a, 0x8f, 0x96,
+ 0x1e, 0xa9, 0x8d, 0xa1, 0x84, 0x9d, 0x82, 0x8,
+ 0x13, 0xd0, 0x7f, 0xa2, 0x9d, 0x7c, 0xa2, 0x1b,
+ 0x95, 0xba, 0x90, 0xba, 0x90, 0x8b, 0xba, 0x54,
+ 0x73, 0x7a, 0x7e, 0x80, 0x73, 0x1f, 0x13, 0xb0,
+ 0x83, 0x7a, 0x77, 0x84, 0x6e, 0x1b, 0x8f, 0x9d,
+ 0x91, 0xac, 0x9e, 0xa2, 0x8, 0xa6, 0xad, 0x9f,
+ 0xa5, 0xa9, 0x1a, 0x9d, 0x80, 0xaf, 0x5d, 0x69,
+ 0x76, 0x73, 0x68, 0x6c, 0x96, 0x6f, 0x91, 0x71,
+ 0x1e, 0x90, 0x72, 0x8a, 0x73, 0x80, 0x72, 0x6a,
+ 0x8a, 0x75, 0x94, 0x78, 0x94, 0x8, 0x13, 0xd0,
+ 0x96, 0x76, 0x79, 0x96, 0x70, 0x1b, 0x81, 0x62,
+ 0x89, 0x57, 0x72, 0x9e, 0x74, 0xaa, 0xab, 0x9c,
+ 0x97, 0x96, 0x9f, 0x1f, 0x13, 0xb0, 0x9c, 0x94,
+ 0x9f, 0x93, 0xaa, 0x8a, 0x88, 0x67, 0x6c, 0x38,
+ 0x56, 0x5f, 0x95, 0xfb, 0xa, 0x18, 0xe, 0xfb,
+ 0x57, 0x76, 0xf7, 0x57, 0xf4, 0xf7, 0xb9, 0xf4,
+ 0xf7, 0x57, 0x77, 0x1, 0xd9, 0xf7, 0x12, 0xaf,
+ 0x9f, 0xaf, 0xf7, 0x12, 0x14, 0xe, 0xf7, 0x4a,
+ 0xa1, 0x15, 0x73, 0x40, 0x3b, 0x59, 0x51, 0x1a,
+ 0x6c, 0xa1, 0x73, 0xaa, 0xb9, 0xa6, 0xb8, 0xb5,
+ 0x1e, 0xad, 0x80, 0xac, 0xad, 0x1a, 0x9c, 0x8f,
+ 0x9c, 0x8e, 0x9b, 0x1e, 0x8a, 0xc1, 0xb8, 0x61,
+ 0xc0, 0x1b, 0xa9, 0xa1, 0xa2, 0xa8, 0xaa, 0x71,
+ 0xa1, 0x6e, 0x1f, 0x8c, 0x6c, 0x50, 0x5e, 0x58,
+ 0x1b, 0x9c, 0xbe, 0xab, 0xa3, 0xbb, 0xa0, 0x8,
+ 0x70, 0x9e, 0x79, 0xa1, 0xae, 0x1a, 0xc2, 0xb7,
+ 0xa7, 0xb6, 0x9e, 0x1e, 0x74, 0xa0, 0x7b, 0x9c,
+ 0xad, 0x1a, 0x97, 0x8d, 0x96, 0x8e, 0x97, 0x1e,
+ 0xb4, 0xcd, 0x58, 0x92, 0xad, 0x1f, 0xac, 0xa0,
+ 0x9e, 0xad, 0xac, 0x70, 0x9e, 0x6b, 0x5d, 0x67,
+ 0x5f, 0x8c, 0x5a, 0x1f, 0xa3, 0xd6, 0xdb, 0xbd,
+ 0xc5, 0x1a, 0xaa, 0x75, 0xa3, 0x6c, 0x5d, 0x70,
+ 0x5e, 0x61, 0x1e, 0x69, 0x96, 0x6a, 0x69, 0x1a,
+ 0x7a, 0x87, 0x7a, 0x88, 0x7b, 0x1e, 0x8c, 0x55,
+ 0x5e, 0xb5, 0x56, 0x1b, 0x6d, 0x75, 0x74, 0x6e,
+ 0x6c, 0xa5, 0x75, 0xa8, 0x1f, 0x8a, 0xaa, 0xc6,
+ 0xb8, 0xbe, 0x1b, 0x7a, 0x58, 0x6b, 0x73, 0x5b,
+ 0x76, 0x8, 0xa6, 0x78, 0x9d, 0x75, 0x68, 0x1a,
+ 0x54, 0x5f, 0x6f, 0x60, 0x78, 0x1e, 0xa2, 0x76,
+ 0x9b, 0x7a, 0x69, 0x1a, 0x7f, 0x89, 0x80, 0x88,
+ 0x7f, 0x1e, 0x62, 0x49, 0xbe, 0x84, 0x69, 0x1f,
+ 0x6a, 0x76, 0x78, 0x69, 0x6a, 0xa6, 0x78, 0xab,
+ 0xb9, 0xaf, 0xb7, 0x8a, 0xbc, 0x1f, 0xe, 0xfb,
+ 0xcc, 0xf7, 0x58, 0x76, 0xf7, 0xc4, 0x77, 0xcd,
+ 0x77, 0x1, 0xac, 0xf7, 0xe6, 0x15, 0x3c, 0xcb,
+ 0x4c, 0xd9, 0xd9, 0xca, 0xc9, 0xd9, 0xd9, 0x4a,
+ 0xcc, 0x3d, 0x3c, 0x4e, 0x4c, 0x3d, 0x1e, 0xe,
+ 0xf7, 0xe6, 0x7e, 0xf7, 0x28, 0x1, 0xb3, 0xf7,
+ 0x2a, 0xf7, 0x49, 0xf7, 0x2a, 0xf7, 0x49, 0xf7,
+ 0x2a, 0x14, 0x70, 0xb3, 0xc8, 0x15, 0x62, 0xab,
+ 0x7d, 0x1d, 0x6a, 0x69, 0x63, 0x1e, 0xf7, 0xdf,
+ 0x16, 0x62, 0xab, 0x7d, 0x1d, 0x6a, 0x69, 0x63,
+ 0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xa9, 0x6a, 0xb7,
+ 0xb4, 0xae, 0xab, 0xb5, 0xb4, 0x68, 0x53, 0xa,
+ 0xf7, 0xe6, 0x7d, 0xa5, 0x85, 0x76, 0xf7, 0xe1,
+ 0xa5, 0xf7, 0xc6, 0xa5, 0x8c, 0x77, 0x12, 0x13,
+ 0xb0, 0xf7, 0xe6, 0xf7, 0x8, 0x2b, 0x1d, 0xf7,
+ 0x74, 0x33, 0x2b, 0x1d, 0xfd, 0x69, 0xf7, 0x88,
+ 0x2b, 0x1d, 0x13, 0x68, 0xfb, 0x30, 0xfc, 0xbb,
+ 0x15, 0xc7, 0x6, 0xf8, 0xe9, 0xf9, 0x48, 0x5,
+ 0x4f, 0x6, 0xe, 0xfb, 0xdd, 0x72, 0x1d, 0xab,
+ 0xf7, 0x6d, 0x71, 0x1d, 0x80, 0x95, 0x96, 0x8a,
+ 0x1d, 0x42, 0x8d, 0xa, 0xe2, 0x5f, 0xa, 0xe,
+ 0xfb, 0xdd, 0x72, 0x1d, 0xf7, 0x30, 0x49, 0x1d,
+ 0x96, 0x82, 0x7f, 0x93, 0x83, 0x1b, 0x86, 0x87,
+ 0x87, 0x7f, 0x1f, 0xe, 0xfc, 0x83, 0x92, 0x76,
+ 0xf9, 0x4d, 0x77, 0x1, 0xfb, 0x1, 0x7d, 0x15,
+ 0xf8, 0x45, 0xf9, 0x4b, 0x5, 0x8d, 0x4f, 0x7,
+ 0xfc, 0x45, 0xfd, 0x4d, 0x5, 0xe, 0x90, 0x8b,
+ 0xba, 0xf7, 0x60, 0xb4, 0xef, 0xb4, 0xf7, 0x69,
+ 0xb0, 0x1, 0xf7, 0x4, 0xf7, 0x26, 0xf7, 0xa7,
+ 0xae, 0x3, 0xb3, 0xf7, 0x8f, 0x15, 0xfb, 0x41,
+ 0xf7, 0x1a, 0x3d, 0xf7, 0x4, 0xf7, 0xb, 0xf7,
+ 0x16, 0xbb, 0xde, 0xc5, 0x1e, 0x6d, 0xa1, 0x5,
+ 0x53, 0x63, 0xfb, 0x2, 0x59, 0x57, 0x1b, 0xfb,
+ 0xe, 0x55, 0xc3, 0xf7, 0x28, 0x8c, 0x1f, 0xf7,
+ 0xbd, 0x6, 0x97, 0xb4, 0x5, 0xfb, 0xc5, 0x6,
+ 0xa5, 0x96, 0xb9, 0x94, 0xa7, 0x1e, 0xf7, 0xc1,
+ 0x6, 0x99, 0xb4, 0x5, 0xfb, 0xc2, 0x6, 0xd5,
+ 0x97, 0xe3, 0xf7, 0x1f, 0xf1, 0x1b, 0xf7, 0x6,
+ 0x91, 0x51, 0x2e, 0x1f, 0xae, 0xf7, 0x22, 0x6,
+ 0x9e, 0x63, 0x79, 0xa6, 0x2c, 0x1b, 0x52, 0xfb,
+ 0x77, 0x55, 0xfb, 0x58, 0x49, 0x1f, 0xfb, 0x17,
+ 0x6, 0x7e, 0x62, 0x5, 0xf7, 0x14, 0x6, 0x83,
+ 0x6e, 0x83, 0x61, 0x89, 0x6e, 0x8, 0x2a, 0x6,
+ 0x7e, 0x62, 0x5, 0xe, 0xf7, 0xe6, 0xf7, 0x9d,
+ 0xa0, 0x89, 0x76, 0xf8, 0x14, 0xa1, 0x12, 0xf7,
+ 0x3c, 0xd9, 0xf7, 0x8d, 0xa6, 0xf7, 0xcc, 0xd9,
+ 0x13, 0xbc, 0xf7, 0xa, 0xf7, 0x9d, 0x15, 0xf7,
+ 0x46, 0xa0, 0x6, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+ 0x1a, 0xf7, 0xc9, 0xbc, 0x7, 0xb3, 0x9d, 0x6d,
+ 0x67, 0x93, 0x1f, 0xa0, 0xe3, 0xfb, 0xf2, 0x33,
+ 0xa0, 0x6, 0xaf, 0x93, 0x9d, 0xa9, 0xb3, 0x1b,
+ 0xbc, 0xfb, 0xc9, 0x6, 0x5d, 0x8c, 0x8a, 0x58,
+ 0x86, 0x1e, 0xf7, 0xd9, 0x76, 0x15, 0xf7, 0x17,
+ 0xa0, 0x6, 0x5e, 0x8f, 0x84, 0x8c, 0xba, 0x1a,
+ 0xf7, 0x77, 0x8d, 0x7, 0x13, 0x7c, 0xf7, 0x26,
+ 0xfb, 0xc2, 0x5, 0x96, 0x6, 0xf7, 0x2b, 0xf7,
+ 0xc4, 0x5, 0x8d, 0xfb, 0x79, 0x6, 0x13, 0xbc,
+ 0x5d, 0x8d, 0x8a, 0x57, 0x86, 0x1e, 0x76, 0xf7,
+ 0x46, 0xa0, 0x7, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+ 0x1a, 0xf7, 0x95, 0x7, 0xad, 0x96, 0x9f, 0xb8,
+ 0x1e, 0x9f, 0xfb, 0x1, 0x7, 0xfb, 0x31, 0xfb,
+ 0xc2, 0xfb, 0x2a, 0xf7, 0xc2, 0x5, 0xfb, 0x13,
+ 0x77, 0x6, 0xa8, 0xa7, 0x76, 0x6c, 0x98, 0x1f,
+ 0xfb, 0x97, 0x7, 0x5c, 0x84, 0x8a, 0x5e, 0x87,
+ 0x1e, 0xe, 0x53, 0xf7, 0x65, 0xc9, 0x4d, 0xe3,
+ 0x1, 0xbe, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xc9,
+ 0xfc, 0x8c, 0x6, 0xe, 0x21, 0xfb, 0x61, 0xad,
+ 0xf7, 0x4b, 0x76, 0xf8, 0x34, 0xb5, 0xf1, 0xf7,
+ 0x2c, 0x6d, 0xa9, 0x12, 0x13, 0xe8, 0x9c, 0xf8,
+ 0x2b, 0x15, 0xd6, 0x6, 0x2f, 0xfc, 0x2f, 0x5,
+ 0xfb, 0x19, 0x6d, 0x7e, 0x69, 0x5d, 0x1b, 0x79,
+ 0x8b, 0x91, 0x8e, 0x93, 0x92, 0x8e, 0x90, 0x92,
+ 0x1f, 0x8f, 0x90, 0x8e, 0x91, 0x96, 0x1a, 0xa9,
+ 0x73, 0x9e, 0x6e, 0x80, 0x67, 0x84, 0x59, 0x60,
+ 0xb6, 0x6b, 0xc2, 0xed, 0xdf, 0xf7, 0x13, 0xd5,
+ 0x9c, 0x1e, 0xf1, 0xf8, 0x2f, 0x5, 0xf7, 0x2a,
+ 0x6, 0x46, 0xfb, 0xa1, 0x5, 0x85, 0x74, 0x86,
+ 0x6f, 0x71, 0x1a, 0x65, 0x9b, 0x6b, 0xbc, 0xcc,
+ 0xb5, 0xb3, 0xeb, 0xc8, 0x1e, 0x75, 0x98, 0x5,
+ 0x7f, 0x83, 0x5f, 0x48, 0x74, 0x1b, 0x80, 0x87,
+ 0x94, 0x99, 0xa8, 0x9b, 0xbc, 0x8e, 0x99, 0x1f,
+ 0xd4, 0xf7, 0xaf, 0x5, 0x8a, 0x76, 0xfb, 0x1,
+ 0x82, 0x72, 0x1b, 0xfb, 0xa, 0x6, 0xf7, 0x23,
+ 0xb1, 0xaa, 0xdc, 0xee, 0x1b, 0xa4, 0x8b, 0x7f,
+ 0x86, 0x84, 0x82, 0x85, 0x85, 0x80, 0x1f, 0x87,
+ 0x84, 0x88, 0x83, 0x7f, 0x1a, 0x13, 0xf0, 0x71,
+ 0xa0, 0x6f, 0xb0, 0xa8, 0xa7, 0x9f, 0xb0, 0xc8,
+ 0x48, 0xad, 0x47, 0xfb, 0x4a, 0x5c, 0xfb, 0x1d,
+ 0xfb, 0x9, 0x63, 0x1e, 0x3f, 0x6, 0xe, 0x21,
+ 0xfb, 0x61, 0xae, 0xf7, 0x4a, 0x76, 0xf8, 0x34,
+ 0xb5, 0xf7, 0x76, 0xa8, 0x1, 0x9f, 0xf8, 0x2b,
+ 0x15, 0xd5, 0x6, 0x2f, 0xfc, 0x26, 0x5, 0xfb,
+ 0x3, 0x72, 0x7c, 0x4b, 0x61, 0x1b, 0x7a, 0x85,
+ 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x92, 0x1f,
+ 0x8f, 0x91, 0x8e, 0x91, 0x96, 0x1a, 0xa5, 0x79,
+ 0x9f, 0x6f, 0x85, 0x5c, 0x8b, 0x57, 0x41, 0xd7,
+ 0x83, 0x9d, 0xf3, 0xd1, 0xba, 0xf7, 0x37, 0xab,
+ 0x1e, 0xee, 0xf8, 0x26, 0x5, 0xf7, 0x27, 0x6,
+ 0x3c, 0xfb, 0xd5, 0x5, 0x89, 0x81, 0x89, 0x80,
+ 0x81, 0x1a, 0x68, 0x9c, 0x6e, 0xc1, 0xd7, 0xb5,
+ 0xcc, 0xd1, 0xb8, 0x1e, 0x77, 0x96, 0x5, 0x7a,
+ 0x80, 0x64, 0x51, 0x72, 0x1b, 0x7d, 0x87, 0x93,
+ 0x95, 0x91, 0x8d, 0x92, 0x8d, 0x91, 0x1f, 0xf7,
+ 0x2b, 0xf8, 0xee, 0x28, 0x7f, 0x5, 0x87, 0x50,
+ 0x9a, 0x6c, 0x1b, 0xfb, 0x45, 0x61, 0xfb, 0x1d,
+ 0xfb, 0xa, 0x66, 0x1f, 0x41, 0x6, 0xf7, 0x53,
+ 0x16, 0xe3, 0xa0, 0xab, 0xf7, 0x1e, 0xe9, 0x1b,
+ 0xa2, 0x96, 0x7e, 0x85, 0x87, 0x84, 0x84, 0x85,
+ 0x81, 0x1f, 0x87, 0x84, 0x87, 0x82, 0x81, 0x1a,
+ 0x73, 0x98, 0x80, 0x93, 0x85, 0x1e, 0x6d, 0xfb,
+ 0xb, 0x5, 0xe, 0x79, 0x9d, 0xf8, 0x54, 0x99,
+ 0xf7, 0x63, 0x9b, 0x98, 0x91, 0x6, 0xfb, 0x62,
+ 0x8d, 0xf7, 0x60, 0x8b, 0xf7, 0x9c, 0x94, 0x7,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xb4,
+ 0xa, 0xf7, 0xc, 0xb, 0x8c, 0xc, 0xe, 0xf8,
+ 0x88, 0x14, 0xf9, 0x2a, 0x15, 0xb7, 0x13, 0x0,
+ 0x71, 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x2f,
+ 0x0, 0x3b, 0x0, 0x58, 0x0, 0x61, 0x0, 0x9b,
+ 0x0, 0x9e, 0x0, 0xab, 0x0, 0xb6, 0x0, 0xc3,
+ 0x0, 0xd6, 0x0, 0xda, 0x0, 0xea, 0x0, 0xfb,
+ 0x0, 0xff, 0x1, 0x6, 0x1, 0x10, 0x1, 0x28,
+ 0x1, 0x2e, 0x1, 0x58, 0x1, 0x62, 0x1, 0x76,
+ 0x1, 0x89, 0x1, 0x96, 0x1, 0xa8, 0x1, 0xb5,
+ 0x1, 0xb9, 0x1, 0xf3, 0x1, 0xfd, 0x2, 0xd,
+ 0x2, 0x41, 0x2, 0x4a, 0x2, 0x51, 0x2, 0x5d,
+ 0x2, 0x65, 0x2, 0x73, 0x2, 0x7d, 0x2, 0x86,
+ 0x2, 0x92, 0x2, 0x9e, 0x2, 0xc4, 0x2, 0xcd,
+ 0x2, 0xe0, 0x2, 0xf2, 0x2, 0xfb, 0x3, 0x3,
+ 0x3, 0x9, 0x3, 0x28, 0x3, 0x32, 0x3, 0x3c,
+ 0x3, 0x58, 0x3, 0x60, 0x3, 0x68, 0x3, 0x6d,
+ 0x3, 0x74, 0x3, 0x7b, 0x3, 0x81, 0x3, 0x9a,
+ 0x3, 0x9d, 0x3, 0xa3, 0x3, 0xb0, 0x3, 0xc6,
+ 0x3, 0xdc, 0x3, 0xea, 0x3, 0xee, 0x3, 0xf4,
+ 0x3, 0xfa, 0x4, 0x4, 0x4, 0xb, 0x4, 0x12,
+ 0x4, 0x24, 0x4, 0x32, 0x4, 0x37, 0x4, 0x48,
+ 0x4, 0x53, 0x4, 0x62, 0x4, 0x6c, 0x4, 0x70,
+ 0x4, 0x76, 0x4, 0x7a, 0x4, 0x83, 0x4, 0x8b,
+ 0x4, 0x92, 0x4, 0x97, 0x4, 0x9c, 0x4, 0xa1,
+ 0x4, 0xaf, 0x4, 0xbd, 0x4, 0xc8, 0x4, 0xd5,
+ 0x4, 0xdd, 0x4, 0xe1, 0x4, 0xed, 0x4, 0xf9,
+ 0x4, 0xff, 0x5, 0x9, 0x5, 0x14, 0x5, 0x1d,
+ 0x5, 0x24, 0x5, 0x29, 0x5, 0x33, 0x5, 0x3d,
+ 0x5, 0x47, 0x5, 0x51, 0x5, 0x5a, 0x5, 0x5e,
+ 0x5, 0x67, 0x5, 0x6d, 0x5, 0x73, 0x5, 0x79,
+ 0x5, 0x7f, 0x5, 0x83, 0x5, 0x87, 0x50, 0x1d,
+ 0xf4, 0xc2, 0x1a, 0xd3, 0x47, 0x9d, 0x68, 0xfb,
+ 0x37, 0xfb, 0x13, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+ 0x4, 0xdf, 0x5f, 0x35, 0xa, 0x98, 0xda, 0x9e,
+ 0x8d, 0x8d, 0x3d, 0xa, 0x72, 0x82, 0x57, 0x70,
+ 0x2d, 0xfb, 0x17, 0x68, 0x1f, 0xb, 0x6, 0xf7,
+ 0x2c, 0x21, 0x1d, 0xb, 0x77, 0x1, 0x90, 0xf7,
+ 0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x20, 0xa, 0xb,
+ 0xf7, 0x8, 0xe3, 0x90, 0xa, 0xf7, 0xab, 0x7b,
+ 0x1d, 0x7b, 0x59, 0x40, 0x51, 0xfb, 0xa6, 0x36,
+ 0xa, 0xf7, 0x3c, 0xf7, 0x29, 0xf7, 0x1a, 0xfb,
+ 0xb, 0xa1, 0x4b, 0x1d, 0xb, 0x32, 0x1d, 0x8c,
+ 0xa9, 0x8a, 0x6b, 0x34, 0x1d, 0xb, 0x77, 0x1,
+ 0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2c, 0x15,
+ 0xe7, 0xe2, 0xf8, 0x29, 0xf7, 0x4c, 0xf3, 0x8c,
+ 0x21, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1a, 0xfb,
+ 0x46, 0x50, 0x5e, 0xaf, 0x55, 0x1d, 0xd2, 0xfb,
+ 0x16, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0x9c, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd0,
+ 0x5d, 0x1d, 0xfb, 0x79, 0xfb, 0x89, 0x1e, 0xb,
+ 0x22, 0x1d, 0xe, 0xa4, 0x87, 0x80, 0xb6, 0x4f,
+ 0x1b, 0xfb, 0xe, 0xfb, 0x29, 0x2f, 0x1d, 0xb,
+ 0xf7, 0x8c, 0xf7, 0x6, 0x15, 0x8d, 0x8c, 0x5,
+ 0x2e, 0x1d, 0xb, 0x2c, 0x1d, 0x54, 0x4d, 0x8f,
+ 0xa, 0x91, 0x98, 0x31, 0xa, 0x79, 0x86, 0xb,
+ 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+ 0x8c, 0x19, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b,
+ 0x31, 0x1d, 0xb, 0x16, 0x20, 0x1d, 0xb, 0x57,
+ 0xa, 0x4e, 0x90, 0x7c, 0x8f, 0x39, 0x1d, 0x65,
+ 0x50, 0x7b, 0x97, 0x6e, 0x82, 0x19, 0xb, 0x91,
+ 0x9f, 0x1f, 0x44, 0x1d, 0x89, 0xa1, 0x8a, 0x71,
+ 0x51, 0x40, 0xfb, 0x4a, 0x46, 0x47, 0xa, 0xb,
+ 0x15, 0x20, 0x1d, 0xb, 0x68, 0x1d, 0xf7, 0x7f,
+ 0x22, 0xa, 0xb, 0xcc, 0xdb, 0xf7, 0x84, 0xdf,
+ 0x94, 0xa7, 0x39, 0xa, 0xb, 0xab, 0xde, 0xf7,
+ 0xa1, 0x9f, 0xd1, 0x1f, 0xfb, 0xa, 0x6, 0x6c,
+ 0x20, 0x74, 0x3c, 0x5e, 0x3a, 0x8, 0x73, 0x7e,
+ 0x4e, 0x2c, 0x63, 0x1b, 0xb, 0x87, 0x8f, 0x95,
+ 0x24, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+ 0x60, 0x75, 0x98, 0xa1, 0x92, 0x8c, 0x93, 0x8f,
+ 0x91, 0x48, 0x1d, 0x9a, 0x20, 0x8b, 0x95, 0x77,
+ 0x1a, 0x5a, 0x69, 0x84, 0x5e, 0x57, 0xa, 0x4d,
+ 0x91, 0x7d, 0x8e, 0x39, 0x1d, 0x67, 0x50, 0x78,
+ 0x95, 0x6f, 0x84, 0x6b, 0x1d, 0x77, 0x74, 0xa,
+ 0x13, 0x6c, 0x28, 0xa, 0x13, 0x9c, 0xb, 0xcd,
+ 0xf7, 0x0, 0xbf, 0xe2, 0xbe, 0xaa, 0x1e, 0x6e,
+ 0x9c, 0x5, 0x66, 0x72, 0x67, 0x55, 0x55, 0x1b,
+ 0x77, 0x5c, 0xb, 0x2b, 0x57, 0x8b, 0xbf, 0x9f,
+ 0x1e, 0xfb, 0xb, 0xbd, 0x15, 0x2b, 0xd9, 0x54,
+ 0xdd, 0xf7, 0x34, 0xf7, 0x10, 0xb, 0x77, 0x1,
+ 0x88, 0xf7, 0xb, 0xf7, 0x62, 0xf7, 0xb, 0x3,
+ 0x23, 0xa, 0xb, 0x35, 0x1a, 0xfb, 0xc, 0xf7,
+ 0x4, 0x57, 0xf6, 0xf7, 0x65, 0xb4, 0xf7, 0x22,
+ 0xf7, 0x1f, 0xb3, 0x1e, 0xb, 0x84, 0x61, 0x41,
+ 0x45, 0xfb, 0x83, 0x34, 0x7d, 0x6d, 0x96, 0xb9,
+ 0x1e, 0xb, 0xf7, 0x64, 0x2d, 0x1d, 0x15, 0xf7,
+ 0xa, 0xd7, 0xf7, 0x12, 0xf6, 0xd1, 0x5f, 0xc0,
+ 0x42, 0xfb, 0x8, 0x40, 0xfb, 0xc, 0x20, 0x44,
+ 0xb0, 0x51, 0xd8, 0x1f, 0x8e, 0xa5, 0x15, 0x72,
+ 0x83, 0x9c, 0xa1, 0xab, 0xa5, 0xe4, 0x95, 0xae,
+ 0x1f, 0xad, 0x95, 0x9b, 0xd6, 0xb8, 0x1b, 0xa0,
+ 0x97, 0x7b, 0x76, 0x65, 0x70, 0x36, 0x7f, 0x63,
+ 0x1f, 0x68, 0x81, 0x7f, 0x46, 0x5d, 0x1b, 0xb,
+ 0x15, 0x62, 0xa9, 0x7d, 0x1d, 0x6c, 0x69, 0x63,
+ 0x1e, 0xe, 0x8f, 0x9d, 0x1f, 0x92, 0xab, 0x15,
+ 0xd4, 0x9b, 0xbe, 0xf7, 0x22, 0xc9, 0x1b, 0xa8,
+ 0x8b, 0xb, 0x1, 0x80, 0x16, 0xf8, 0x8e, 0x6,
+ 0xc6, 0xf7, 0x56, 0x70, 0x90, 0x5, 0xfb, 0x18,
+ 0x4d, 0xfb, 0x1c, 0x6b, 0x24, 0x1b, 0x45, 0x6,
+ 0xf8, 0x46, 0xf8, 0xe7, 0x5, 0xb2, 0xfc, 0x68,
+ 0x7, 0x52, 0xfb, 0x46, 0xa7, 0x87, 0x5, 0xcd,
+ 0xba, 0xc8, 0xdc, 0xf7, 0x24, 0x1b, 0xd9, 0x6,
+ 0xfc, 0x46, 0xfc, 0xe7, 0x5, 0xb, 0x48, 0x1d,
+ 0x9b, 0x21, 0x8a, 0x94, 0x77, 0x1a, 0xb, 0x49,
+ 0xa, 0x13, 0xe8, 0x62, 0x6e, 0xb, 0x1f, 0xf7,
+ 0x14, 0xf8, 0x5b, 0x9c, 0xca, 0xa6, 0x8f, 0x56,
+ 0x1d, 0xb, 0x5b, 0xa, 0xe8, 0xe3, 0x2e, 0x3b,
+ 0x1d, 0xb, 0x6b, 0x1a, 0xfb, 0x19, 0xfc, 0x79,
+ 0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xb,
+ 0xaf, 0x9f, 0xcc, 0x99, 0xba, 0x1f, 0xd2, 0xf7,
+ 0x80, 0xb, 0x35, 0x1d, 0x53, 0x4b, 0x4c, 0x70,
+ 0x79, 0x7d, 0xb, 0x41, 0xa, 0xc7, 0x9a, 0x7e,
+ 0x79, 0x7f, 0x86, 0x7d, 0x47, 0x1d, 0xe, 0x1a,
+ 0x74, 0x8b, 0x54, 0xd8, 0xd7, 0xb5, 0xc5, 0xf5,
+ 0xd7, 0x1e, 0xb, 0xa7, 0xe3, 0x5, 0xb7, 0x6,
+ 0x9c, 0xc8, 0x5, 0x5e, 0x6, 0xd9, 0xf7, 0x99,
+ 0x5, 0x5d, 0x6, 0xfb, 0xaa, 0xfb, 0x93, 0x5,
+ 0xa7, 0x85, 0x15, 0xf7, 0x48, 0xf7, 0x3a, 0x8d,
+ 0x89, 0x5, 0x8c, 0x6, 0x58, 0xfb, 0x38, 0x5,
+ 0xb, 0x75, 0xa, 0xde, 0x62, 0x1d, 0x9b, 0x70,
+ 0x1e, 0xb, 0xa0, 0x1e, 0xbd, 0xaf, 0xdc, 0xc7,
+ 0xbd, 0xaf, 0x8, 0x94, 0x7, 0x55, 0xc2, 0x52,
+ 0xc5, 0x5a, 0xc0, 0x8, 0xb, 0x67, 0xa8, 0x6e,
+ 0xaf, 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8,
+ 0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xb, 0x1f,
+ 0xa7, 0x86, 0xd5, 0xf7, 0xa5, 0x6f, 0x8f, 0xb,
+ 0xa6, 0xf7, 0x24, 0xf8, 0xc, 0xf7, 0x24, 0xb,
+ 0xf7, 0x42, 0x5, 0x3a, 0x6, 0xb, 0x1a, 0xd8,
+ 0x57, 0x8d, 0x73, 0x34, 0x55, 0x38, 0x21, 0x43,
+ 0x1e, 0x88, 0x8d, 0xc7, 0xf7, 0x4e, 0x5, 0x79,
+ 0x3c, 0x28, 0x82, 0x75, 0x1b, 0x70, 0x7, 0xa6,
+ 0xa6, 0x8b, 0x71, 0x1f, 0xb, 0x15, 0xb3, 0x6,
+ 0x9e, 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xb, 0x90,
+ 0x8b, 0xab, 0xf7, 0xc6, 0xab, 0xf7, 0x9f, 0xab,
+ 0xb, 0xc4, 0x1a, 0xba, 0x65, 0xc0, 0x47, 0x36,
+ 0x60, 0x4d, 0x67, 0x79, 0x1e, 0x9d, 0x80, 0x5,
+ 0x94, 0x94, 0xa5, 0xb2, 0xba, 0x1b, 0xc6, 0x8b,
+ 0x52, 0x7f, 0x67, 0x6a, 0xb, 0xac, 0x62, 0x60,
+ 0x6c, 0x69, 0x63, 0x1e, 0xe, 0x1a, 0x53, 0x28,
+ 0x58, 0x78, 0x81, 0x1e, 0xb, 0xbd, 0x96, 0x57,
+ 0x1d, 0xb, 0x90, 0x8b, 0xae, 0xf7, 0x41, 0xb3,
+ 0xb, 0x1e, 0x68, 0xf7, 0xc4, 0xae, 0x7, 0xb,
+ 0x8b, 0xae, 0xf8, 0xeb, 0xae, 0xb, 0xf7, 0x95,
+ 0xfc, 0xb9, 0x5, 0xa7, 0x6, 0xf7, 0x23, 0xf8,
+ 0x8e, 0xb2, 0xf7, 0x1e, 0x95, 0x83, 0xc0, 0x98,
+ 0x19, 0xae, 0xfb, 0x65, 0x68, 0x7, 0xb, 0x21,
+ 0xa, 0xe, 0x15, 0xc4, 0x6, 0xf7, 0x17, 0xb,
+ 0x7e, 0xa3, 0x5, 0x7c, 0x87, 0xfb, 0x44, 0x38,
+ 0xfb, 0x19, 0x1a, 0x3b, 0xb, 0xf7, 0x3b, 0x1a,
+ 0xf7, 0x48, 0xfb, 0x6, 0xed, 0xfb, 0x4f, 0x1e,
+ 0xfb, 0xb6, 0x68, 0x6, 0xc9, 0x82, 0x96, 0x89,
+ 0x6a, 0x1a, 0xb, 0x50, 0x1e, 0xbb, 0x16, 0xab,
+ 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71, 0x6b, 0x6b,
+ 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5, 0xab, 0x1e,
+ 0xb, 0xdc, 0xaf, 0x1a, 0x94, 0x87, 0x8e, 0x86,
+ 0x79, 0x61, 0x61, 0x7c, 0x6c, 0xa, 0xb, 0x4c,
+ 0x1d, 0x78, 0x1d, 0xae, 0xfb, 0xbe, 0x68, 0x7,
+ 0xb, 0x76, 0xf7, 0xd0, 0x77, 0x12, 0xb, 0x5c,
+ 0xa, 0xc3, 0x7b, 0xa6, 0xb4, 0xab, 0xab, 0xb5,
+ 0xb, 0x21, 0x82, 0xd3, 0xf8, 0x16, 0x77, 0xb,
+ 0xc8, 0xf7, 0x73, 0x5, 0xa7, 0x93, 0xb, 0x6f,
+ 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7,
+ 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e,
+ 0xb, 0x66, 0xa8, 0x6e, 0xb0, 0xb0, 0xa9, 0xa8,
+ 0x36, 0x1d, 0x6e, 0x6d, 0x66, 0x1e, 0xb, 0xfb,
+ 0xa5, 0x58, 0xa, 0xb, 0x9e, 0x9c, 0x9e, 0xa2,
+ 0xb4, 0x1b, 0xb3, 0x98, 0x6e, 0x74, 0x4c, 0x2f,
+ 0x7a, 0x6e, 0x86, 0x1f, 0xb, 0xf7, 0x52, 0xf7,
+ 0x95, 0x90, 0x1d, 0xb6, 0x93, 0x57, 0x1d, 0xb,
+ 0x7c, 0x59, 0xfb, 0x2c, 0x67, 0xfb, 0x6, 0x1f,
+ 0x65, 0x7b, 0x68, 0x8a, 0x73, 0x1b, 0xe, 0x76,
+ 0x1e, 0x59, 0x67, 0x3a, 0x4f, 0x59, 0x67, 0x8,
+ 0xb, 0x19, 0x70, 0x7, 0xb, 0xa8, 0xf7, 0x81,
+ 0x5c, 0x1d, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15,
+ 0x50, 0x49, 0x34, 0x3a, 0x67, 0x1a, 0x82, 0xb,
+ 0x6f, 0x80, 0x60, 0x62, 0x77, 0x88, 0x1d, 0xb,
+ 0xc7, 0x79, 0xc3, 0xf8, 0xe8, 0xae, 0xb, 0xf7,
+ 0x7f, 0x77, 0x1, 0xb, 0x12, 0x76, 0xf7, 0xf,
+ 0xb, 0x9a, 0x8f, 0xf7, 0x44, 0xb, 0x1b, 0xd7,
+ 0xaa, 0xc3, 0xac, 0xb4, 0x67, 0x98, 0x79, 0x6f,
+ 0x76, 0x70, 0x74, 0xb, 0x91, 0xa0, 0x1f, 0xfb,
+ 0x80, 0xfb, 0x12, 0x15, 0xf7, 0xb2, 0x6, 0xf7,
+ 0xd2, 0xb, 0x85, 0x83, 0xa, 0xf7, 0xe8, 0xe3,
+ 0xf0, 0xbd, 0xa4, 0x1b, 0xb, 0xa2, 0xf7, 0x2d,
+ 0x5, 0x6e, 0x6, 0x7a, 0x81, 0x88, 0x87, 0x7c,
+ 0x1b, 0xb, 0x1a, 0x67, 0x62, 0x3c, 0x5f, 0x36,
+ 0x1e, 0xb, 0x15, 0xb8, 0x6, 0xb, 0x8b, 0xf7,
+ 0x19, 0x7c, 0x1e, 0x70, 0x8e, 0x75, 0xfb, 0x3a,
+ 0x5, 0xb, 0x8d, 0x93, 0x94, 0x8d, 0x99, 0x1b,
+ 0xb9, 0x8b, 0x6b, 0x87, 0x71, 0xb, 0x1f, 0xc8,
+ 0xf7, 0x7b, 0x5, 0xb, 0x3c, 0x7c, 0x59, 0x83,
+ 0x3b, 0x84, 0x6d, 0xa, 0xa9, 0xb, 0xf7, 0xad,
+ 0xf7, 0xe3, 0x18, 0x95, 0xfb, 0xcc, 0x7, 0x60,
+ 0xb, 0xfb, 0x32, 0x15, 0x98, 0x73, 0x5, 0x75,
+ 0xa, 0xb, 0x19, 0xae, 0xfb, 0xd1, 0x68, 0x7,
+ 0xb, 0x16, 0xf7, 0xd, 0x6, 0xb, 0xfb, 0xdd,
+ 0xfb, 0x32, 0x76, 0xf9, 0xf4, 0x77, 0x1, 0xb,
+ 0x93, 0x7e, 0x15, 0x9c, 0x90, 0x9f, 0x8e, 0x8f,
+ 0x1b, 0xb, 0x92, 0x95, 0x75, 0x1f, 0x75, 0x6a,
+ 0x5, 0x84, 0x9c, 0xb, 0x8b, 0x69, 0x1b, 0x66,
+ 0xf7, 0x8d, 0xb0, 0x7, 0x68, 0xb, 0x72, 0x58,
+ 0xfb, 0x39, 0x58, 0xfb, 0x53, 0x1e, 0xb, 0x76,
+ 0x54, 0xa, 0xb, 0xfb, 0xce, 0xfb, 0x3a, 0x76,
+ 0xf9, 0xfd, 0x77, 0xb, 0x1a, 0x87, 0x8a, 0x86,
+ 0x8a, 0xb, 0x15, 0xf7, 0x74, 0x9e, 0x6, 0xb,
+ 0xf7, 0x40, 0x5, 0xc6, 0xcd, 0xb, 0xf7, 0x1a,
+ 0xd5, 0xf7, 0x1a, 0xb, 0x74, 0x88, 0x1d, 0xb,
+ 0x15, 0xcb, 0xbd, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
new file mode 100644
index 0000000000..26f7784c60
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
@@ -0,0 +1,2662 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifItalicFontData [21227] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+ 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+ 0x2a, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+ 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4,
+ 0x1e, 0xe1, 0x5a, 0x4f, 0xc, 0x2, 0xfb, 0x3c,
+ 0xfb, 0x8e, 0xfa, 0x71, 0xf9, 0xf8, 0x5, 0xf7,
+ 0x3c, 0xf, 0xf8, 0x93, 0x11, 0xb0, 0x1c, 0x46,
+ 0xd6, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f,
+ 0x45, 0x54, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65,
+ 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x20,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1,
+ 0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9,
+ 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0,
+ 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0,
+ 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa,
+ 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0,
+ 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0,
+ 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4,
+ 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0,
+ 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0,
+ 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f,
+ 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0,
+ 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0,
+ 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0,
+ 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0,
+ 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0,
+ 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6,
+ 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0,
+ 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0,
+ 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d,
+ 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0,
+ 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0,
+ 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd,
+ 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0,
+ 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0,
+ 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3,
+ 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0,
+ 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0,
+ 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93,
+ 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0,
+ 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0,
+ 0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0,
+ 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1,
+ 0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e,
+ 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+ 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+ 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+ 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+ 0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0,
+ 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6,
+ 0x2, 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0,
+ 0x4a, 0x0, 0x82, 0x0, 0xf8, 0x1, 0x8c, 0x1,
+ 0xb7, 0x2, 0x73, 0x2, 0xa0, 0x2, 0xd9, 0x3,
+ 0x17, 0x3, 0xed, 0x4, 0x1a, 0x4, 0x49, 0x4,
+ 0x60, 0x4, 0x6d, 0x4, 0x88, 0x4, 0xcf, 0x5,
+ 0x1d, 0x5, 0x70, 0x5, 0xe3, 0x6, 0x2a, 0x6,
+ 0x7a, 0x6, 0xd3, 0x6, 0xff, 0x7, 0x7d, 0x7,
+ 0xe1, 0x7, 0xfe, 0x8, 0x46, 0x8, 0x71, 0x8,
+ 0x95, 0x8, 0xb5, 0x9, 0x2c, 0x9, 0xe6, 0xa,
+ 0x2e, 0xa, 0xb6, 0xa, 0xe4, 0xb, 0x2e, 0xb,
+ 0x8c, 0xb, 0xf5, 0xc, 0x6e, 0xc, 0xf7, 0xd,
+ 0x30, 0xd, 0x87, 0xe, 0xb, 0xe, 0x3a, 0xe,
+ 0xb5, 0xf, 0x1f, 0xf, 0x62, 0xf, 0xc8, 0x10,
+ 0x4c, 0x10, 0xc6, 0x11, 0x2, 0x11, 0x4d, 0x11,
+ 0xa6, 0x11, 0xf6, 0x12, 0x75, 0x12, 0xf6, 0x13,
+ 0x4f, 0x13, 0x59, 0x13, 0x85, 0x13, 0xa3, 0x13,
+ 0xd2, 0x13, 0xf9, 0x14, 0xa, 0x14, 0x26, 0x14,
+ 0x63, 0x14, 0xd3, 0x15, 0x11, 0x15, 0x9e, 0x15,
+ 0xea, 0x16, 0x6e, 0x17, 0x1a, 0x17, 0x8e, 0x17,
+ 0xc6, 0x18, 0x33, 0x18, 0xa9, 0x18, 0xe1, 0x19,
+ 0x85, 0x19, 0xab, 0x19, 0xea, 0x1a, 0x2a, 0x1a,
+ 0x95, 0x1a, 0xf1, 0x1b, 0x53, 0x1b, 0xb1, 0x1b,
+ 0xef, 0x1c, 0x56, 0x1c, 0xf1, 0x1d, 0x95, 0x1d,
+ 0xd7, 0x1e, 0x19, 0x1e, 0x75, 0x1e, 0x8b, 0x1e,
+ 0xe9, 0x1f, 0x36, 0x1f, 0x81, 0x1f, 0xf7, 0x20,
+ 0x99, 0x21, 0xc, 0x21, 0xa1, 0x21, 0xc0, 0x22,
+ 0x97, 0x22, 0xa5, 0x23, 0x4c, 0x23, 0xc3, 0x24,
+ 0x4, 0x24, 0x25, 0x25, 0x13, 0x25, 0x2a, 0x25,
+ 0x62, 0x25, 0x9a, 0x25, 0xb6, 0x25, 0xfd, 0x26,
+ 0x1c, 0x26, 0x98, 0x26, 0xd0, 0x26, 0xdf, 0x27,
+ 0x21, 0x27, 0x73, 0x27, 0xb1, 0x27, 0xc4, 0x28,
+ 0x1c, 0x28, 0x88, 0x28, 0xd1, 0x29, 0x31, 0x29,
+ 0x65, 0x29, 0x8c, 0x29, 0xc3, 0x29, 0xfd, 0x2a,
+ 0x29, 0x2a, 0x89, 0x2b, 0x2f, 0x2b, 0x91, 0x2b,
+ 0xd0, 0x2b, 0xf3, 0x2c, 0x12, 0x2c, 0x33, 0x2c,
+ 0x40, 0x2c, 0x5e, 0x2c, 0x74, 0x2c, 0x89, 0x2c,
+ 0xec, 0x2d, 0x85, 0x2d, 0x96, 0x2d, 0xa9, 0x2d,
+ 0xc2, 0x2d, 0xfd, 0x2e, 0x1f, 0x2e, 0x61, 0x2e,
+ 0xdd, 0x2f, 0x5, 0x2f, 0x1c, 0x2f, 0x2f, 0x2f,
+ 0x5c, 0x2f, 0xc8, 0x30, 0x43, 0x30, 0xfb, 0x31,
+ 0x9, 0x31, 0x1b, 0x31, 0x35, 0x31, 0x5d, 0x31,
+ 0x74, 0x31, 0xbd, 0x32, 0x62, 0x32, 0xd5, 0x32,
+ 0xf4, 0x33, 0x2c, 0x33, 0x50, 0x33, 0x73, 0x33,
+ 0x92, 0x33, 0xaf, 0x33, 0xbe, 0x33, 0xdb, 0x34,
+ 0x4f, 0x34, 0x8b, 0x34, 0xa6, 0x34, 0xc0, 0x34,
+ 0xda, 0x35, 0x13, 0x35, 0x33, 0x35, 0x64, 0x35,
+ 0xd5, 0x35, 0xf0, 0x35, 0xfe, 0x36, 0x24, 0x36,
+ 0x49, 0x36, 0x95, 0x36, 0xe0, 0x37, 0x3e, 0x37,
+ 0x54, 0x37, 0x93, 0x37, 0xdd, 0x38, 0x99, 0x39,
+ 0x38, 0x39, 0x7d, 0x39, 0xe5, 0x3a, 0x66, 0x3a,
+ 0x78, 0x3a, 0xc8, 0x3b, 0x4c, 0x3b, 0x67, 0x3b,
+ 0x83, 0x3b, 0xad, 0x3b, 0xbd, 0x3c, 0xf, 0x3c,
+ 0x41, 0x3c, 0x5e, 0x3c, 0x7e, 0x3c, 0x92, 0x3c,
+ 0xa8, 0x3c, 0xcd, 0x3c, 0xfd, 0x3d, 0x1e, 0x3d,
+ 0x60, 0x3d, 0x99, 0x3d, 0xd2, 0x3e, 0x75, 0x3f,
+ 0x4e, 0x3f, 0x7a, 0x3f, 0xb5, 0x3f, 0xed, 0x40,
+ 0xb, 0x40, 0x27, 0x40, 0x3c, 0x40, 0xba, 0x41,
+ 0x60, 0x41, 0x6d, 0x42, 0x36, 0x43, 0x7, 0x20,
+ 0xe, 0x20, 0xe, 0x73, 0x8e, 0xf4, 0xf8, 0xc3,
+ 0x77, 0x12, 0xb2, 0xf4, 0x17, 0xf7, 0xc, 0xf7,
+ 0x49, 0x15, 0x9c, 0x87, 0xc5, 0xf7, 0x32, 0xbe,
+ 0xf7, 0x8, 0xb7, 0xf7, 0x10, 0x19, 0x92, 0x9f,
+ 0x90, 0x9b, 0x9a, 0x1a, 0xa6, 0x6e, 0x99, 0x7c,
+ 0x1e, 0x13, 0xa0, 0x71, 0x77, 0x6d, 0x64, 0x82,
+ 0x1f, 0x6f, 0xfb, 0x10, 0x76, 0xfb, 0x18, 0x69,
+ 0xfb, 0x35, 0x8, 0x3a, 0xfb, 0x20, 0x15, 0x6e,
+ 0xa2, 0x85, 0xa, 0x74, 0x73, 0x6e, 0x1e, 0xe,
+ 0xca, 0xf8, 0x4e, 0x76, 0xf7, 0x89, 0x77, 0x1,
+ 0xf7, 0x24, 0xa0, 0xf7, 0x32, 0xa0, 0x3, 0xf7,
+ 0xd7, 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xa8, 0xd0,
+ 0xc6, 0xf6, 0xac, 0x1a, 0x9c, 0x7f, 0x9e, 0x76,
+ 0x77, 0x71, 0xbc, 0xa, 0xfb, 0x47, 0x16, 0xa0,
+ 0x6, 0xa7, 0xcc, 0xc1, 0xee, 0xbb, 0x1a, 0x9a,
+ 0x81, 0x9d, 0x7a, 0x72, 0x76, 0xbc, 0xa, 0xe,
+ 0xa0, 0x76, 0xf7, 0x5f, 0xb2, 0x64, 0xc1, 0xf7,
+ 0x2d, 0xc1, 0x63, 0xb3, 0xf7, 0x68, 0x77, 0x12,
+ 0xe9, 0xf8, 0x64, 0x13, 0xb6, 0x9c, 0x16, 0xb3,
+ 0x6, 0xd6, 0xf7, 0x5f, 0x5, 0xf7, 0x42, 0x6,
+ 0x40, 0xfb, 0x5f, 0x5, 0xb2, 0x6, 0xd7, 0xf7,
+ 0x5f, 0x5, 0xf4, 0x6, 0x13, 0xce, 0x96, 0xb2,
+ 0x5, 0x26, 0x6, 0xce, 0xf7, 0x4a, 0x5, 0xf0,
+ 0x6, 0x96, 0xb3, 0x5, 0x2b, 0x6, 0xdb, 0xf7,
+ 0x68, 0x5, 0x62, 0x6, 0x3b, 0xfb, 0x68, 0x5,
+ 0xfb, 0x41, 0x6, 0xda, 0xf7, 0x68, 0x5, 0x66,
+ 0x6, 0x3b, 0xfb, 0x68, 0x5, 0x22, 0x6, 0x80,
+ 0x63, 0x5, 0xee, 0x6, 0x49, 0xfb, 0x4a, 0x5,
+ 0x2b, 0x6, 0x80, 0x64, 0x5, 0xe7, 0x6, 0xc1,
+ 0xb2, 0x15, 0xce, 0xf7, 0x4a, 0x5, 0xf7, 0x42,
+ 0x6, 0x47, 0xfb, 0x4a, 0x5, 0xe, 0x47, 0x76,
+ 0xf5, 0x76, 0xa4, 0x76, 0xf9, 0x15, 0xa6, 0xb9,
+ 0x77, 0x12, 0xa2, 0xd9, 0xf7, 0xab, 0xd6, 0x13,
+ 0xde, 0xf7, 0xae, 0xf8, 0x38, 0x15, 0x61, 0xa9,
+ 0x64, 0xab, 0xc1, 0x1a, 0xd5, 0xc5, 0xaa, 0xd8,
+ 0x1e, 0xfb, 0x7, 0xfc, 0xfc, 0x15, 0xcf, 0xf7,
+ 0xad, 0x5, 0xc2, 0x5d, 0xaf, 0x6d, 0x48, 0x1a,
+ 0xfb, 0x14, 0xfb, 0x14, 0x81, 0x6c, 0x1e, 0xfb,
+ 0x52, 0xb5, 0x15, 0x97, 0x80, 0xbf, 0x65, 0xe1,
+ 0x7b, 0x75, 0x30, 0x18, 0xae, 0x6, 0x13, 0xbe,
+ 0xa0, 0xe4, 0x5, 0x13, 0x5e, 0xf7, 0x56, 0xb9,
+ 0xf6, 0xe4, 0xdb, 0x5e, 0xb9, 0x2a, 0xd5, 0x1f,
+ 0xc3, 0xf7, 0x81, 0x5, 0xad, 0x7d, 0xbe, 0x76,
+ 0x29, 0x1a, 0x9a, 0x89, 0xa7, 0xf7, 0x6, 0x60,
+ 0xaa, 0x50, 0x9b, 0x78, 0x8f, 0x19, 0x9b, 0xcf,
+ 0x5, 0x69, 0x6, 0x7a, 0x4c, 0x5, 0x13, 0x44,
+ 0xfb, 0xe, 0x2b, 0x58, 0xfb, 0x0, 0x44, 0xcc,
+ 0x4d, 0xd1, 0x5c, 0x1f, 0x46, 0xfb, 0xbd, 0x2a,
+ 0xa1, 0x82, 0xcc, 0x82, 0xd5, 0x19, 0x7b, 0x88,
+ 0x5, 0xe, 0xf8, 0x70, 0xb0, 0xa, 0xd5, 0xd0,
+ 0xa, 0xf7, 0x1e, 0xd0, 0xa, 0x13, 0xb7, 0x80,
+ 0xf8, 0x97, 0xf7, 0x9, 0x30, 0xa, 0xfc, 0x8b,
+ 0xf8, 0x11, 0x30, 0xa, 0x13, 0x6f, 0x80, 0x54,
+ 0xfc, 0x33, 0x15, 0xba, 0x6, 0xf9, 0x48, 0xf9,
+ 0x48, 0x5, 0x5c, 0x6, 0xe, 0xf8, 0x39, 0x79,
+ 0xbc, 0x5b, 0xbc, 0xf8, 0x1, 0xaa, 0xf7, 0x62,
+ 0xab, 0x12, 0xd7, 0xe9, 0xf7, 0x2e, 0xdc, 0xf7,
+ 0x4, 0xd0, 0x13, 0x7e, 0xf8, 0x5d, 0xc8, 0x15,
+ 0x13, 0xbe, 0x6d, 0xa3, 0xb3, 0x5a, 0xd5, 0x1b,
+ 0xbe, 0xb6, 0xa5, 0xb5, 0xad, 0x1f, 0x80, 0x96,
+ 0x5, 0x7f, 0x7b, 0x76, 0x79, 0x69, 0x1b, 0x62,
+ 0x60, 0xa6, 0xce, 0x66, 0x1f, 0xc2, 0xd2, 0xa8,
+ 0xbe, 0x9a, 0x9f, 0x8, 0xb0, 0xa6, 0x9f, 0xa8,
+ 0xbc, 0x1b, 0x9c, 0xfb, 0x4d, 0x78, 0x7, 0xaa,
+ 0x95, 0x7b, 0x70, 0x61, 0x71, 0x6a, 0x5f, 0x56,
+ 0x1f, 0x60, 0xcd, 0x6b, 0xf7, 0xb, 0x7f, 0xbf,
+ 0x8, 0xc7, 0xa9, 0xf7, 0x4, 0xc3, 0xe6, 0x1a,
+ 0xbb, 0x61, 0xb7, 0x50, 0x30, 0x45, 0x3b, 0xfb,
+ 0x11, 0x7e, 0x8c, 0x82, 0x91, 0x4e, 0x1e, 0xfb,
+ 0x17, 0x52, 0xfb, 0x10, 0x55, 0xfb, 0x15, 0x1a,
+ 0xfb, 0x1a, 0xf7, 0x14, 0x75, 0xbd, 0xdb, 0xb3,
+ 0xa5, 0xc0, 0xde, 0x1e, 0x78, 0xa8, 0x15, 0x61,
+ 0x5d, 0x52, 0x7d, 0x68, 0x1b, 0x48, 0x4c, 0xba,
+ 0xe1, 0xf7, 0x9, 0xf7, 0x36, 0xc8, 0x8c, 0x1f,
+ 0x9f, 0x45, 0xb2, 0xfb, 0x13, 0xb9, 0x51, 0x8,
+ 0x6f, 0xf7, 0xe6, 0x15, 0x88, 0xa5, 0x89, 0x9c,
+ 0xaf, 0x1a, 0xc2, 0x94, 0xd3, 0xc4, 0x9b, 0xa9,
+ 0x8b, 0x53, 0x38, 0x5c, 0x6e, 0x4f, 0x65, 0x1e,
+ 0xe, 0xfb, 0x23, 0xf8, 0x4e, 0x76, 0xf7, 0x89,
+ 0x77, 0x1, 0xf7, 0x18, 0xa0, 0x3, 0xf7, 0x18,
+ 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xb4, 0xe3, 0xba,
+ 0xe5, 0xa8, 0x1a, 0x9c, 0x80, 0xa0, 0x75, 0x77,
+ 0x71, 0x7e, 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82,
+ 0xfb, 0xc, 0x86, 0x54, 0x8, 0xe, 0x73, 0xfb,
+ 0x34, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xb5, 0xd2,
+ 0x3, 0xf7, 0x21, 0xfb, 0x49, 0x15, 0x9d, 0x91,
+ 0x5, 0x4c, 0xf7, 0x9, 0x9c, 0xf7, 0x53, 0xc4,
+ 0x1a, 0xf7, 0x21, 0xeb, 0xf7, 0x7c, 0xf5, 0xe6,
+ 0x1e, 0x7e, 0x9a, 0x5, 0xfb, 0x4a, 0xfb, 0x2f,
+ 0x3d, 0xfb, 0x30, 0xfb, 0x39, 0x1a, 0x4b, 0x90,
+ 0xfb, 0x2a, 0xe9, 0xfb, 0x34, 0x1e, 0xe, 0x73,
+ 0xfb, 0x36, 0x76, 0xf9, 0xe8, 0x77, 0x12, 0xf7,
+ 0x6d, 0xd3, 0x17, 0x9b, 0xfb, 0x39, 0x15, 0x98,
+ 0x7c, 0x5, 0x13, 0x60, 0xf7, 0x28, 0xf7, 0xb,
+ 0xf7, 0x4, 0xf7, 0x3a, 0xf7, 0x51, 0x1a, 0xf7,
+ 0x16, 0x70, 0xf7, 0x14, 0x43, 0xf7, 0x9, 0x1e,
+ 0x78, 0x86, 0xbd, 0x2b, 0x98, 0xfb, 0x1b, 0x7a,
+ 0xfb, 0x1f, 0x19, 0x75, 0xfb, 0x47, 0x43, 0xfb,
+ 0x4a, 0x20, 0x29, 0x8, 0xe, 0xf7, 0x37, 0xf7,
+ 0x9, 0x66, 0x76, 0xf8, 0x10, 0x76, 0xe0, 0x77,
+ 0xa6, 0x77, 0x12, 0xf7, 0xc1, 0x9d, 0x13, 0xac,
+ 0xf7, 0xc0, 0xf8, 0x52, 0x15, 0x8c, 0x73, 0x8c,
+ 0x71, 0x84, 0x73, 0x8, 0x82, 0x6c, 0x7e, 0x6f,
+ 0x7c, 0x1a, 0x13, 0x6c, 0x72, 0x9d, 0x79, 0x9d,
+ 0x9d, 0x9e, 0x9c, 0xa6, 0x8c, 0x1e, 0x8c, 0xa1,
+ 0x7e, 0x99, 0x82, 0xb0, 0x8, 0x87, 0x9d, 0x88,
+ 0xa2, 0xac, 0x1a, 0xa2, 0x7e, 0x9c, 0x7e, 0x99,
+ 0x7f, 0x8, 0x65, 0xb6, 0x92, 0x6c, 0xab, 0x1b,
+ 0x9d, 0x9e, 0x9a, 0xa3, 0xb1, 0x62, 0x87, 0x4c,
+ 0x9e, 0x1f, 0x79, 0x90, 0x76, 0x97, 0x76, 0x96,
+ 0xa3, 0x9d, 0xa3, 0x94, 0xa0, 0x91, 0x8, 0xc3,
+ 0x9c, 0xb2, 0x82, 0xbb, 0x1a, 0x9e, 0x7a, 0x9a,
+ 0x78, 0x6f, 0x7b, 0x6f, 0x6f, 0x70, 0x1e, 0x70,
+ 0x70, 0x66, 0x71, 0x89, 0x1b, 0xb0, 0x8e, 0xa9,
+ 0x90, 0x98, 0x1e, 0x95, 0xa7, 0x94, 0xa1, 0xa0,
+ 0x1a, 0x13, 0xb4, 0xa7, 0x7a, 0x99, 0x7a, 0x79,
+ 0x78, 0x7b, 0x70, 0x76, 0x95, 0x7a, 0x93, 0x6a,
+ 0x1e, 0x8f, 0x78, 0x8f, 0x73, 0x6a, 0x1a, 0x6f,
+ 0x9b, 0x78, 0x9a, 0x7c, 0x99, 0x8, 0xae, 0x66,
+ 0x83, 0xa4, 0x6b, 0x1b, 0x74, 0x80, 0x77, 0x7d,
+ 0x5e, 0xb3, 0x90, 0xc2, 0x7c, 0x1f, 0x9d, 0x86,
+ 0x9f, 0x84, 0xac, 0x78, 0x70, 0x79, 0x71, 0x81,
+ 0x74, 0x85, 0x8, 0x56, 0x7d, 0x66, 0x8f, 0x5f,
+ 0x1a, 0x81, 0x96, 0x74, 0xa3, 0xa8, 0x9c, 0xa7,
+ 0xa8, 0xa5, 0x1e, 0xa4, 0xa6, 0xa7, 0x97, 0x97,
+ 0x95, 0x8, 0xe, 0xf7, 0xd2, 0xa0, 0x76, 0xf7,
+ 0x86, 0xb4, 0xf7, 0x73, 0x77, 0x12, 0xf7, 0xc5,
+ 0xcd, 0x53, 0xb5, 0x13, 0xf0, 0xe1, 0xf7, 0x86,
+ 0x15, 0x13, 0xe8, 0xf7, 0x79, 0xfb, 0x86, 0xb5,
+ 0xf7, 0x86, 0xf7, 0x7d, 0xb4, 0xfb, 0x7d, 0xf7,
+ 0x73, 0x61, 0xfb, 0x73, 0xfb, 0x79, 0x6, 0xe,
+ 0x20, 0xfb, 0x0, 0x76, 0xf7, 0x7a, 0x77, 0x12,
+ 0xa2, 0xc0, 0xa, 0x13, 0xe0, 0x87, 0xfb, 0x4,
+ 0x15, 0x94, 0x7a, 0x5, 0xc8, 0xa, 0x83, 0x5e,
+ 0x7f, 0x61, 0x75, 0x97, 0x81, 0x97, 0x83, 0x1e,
+ 0x13, 0xd0, 0x97, 0x83, 0x97, 0x84, 0x7a, 0x1a,
+ 0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xe, 0x73,
+ 0xf7, 0x54, 0xca, 0x1, 0xbc, 0xf7, 0x7d, 0x3,
+ 0xbc, 0xf7, 0x54, 0x15, 0xf7, 0x6e, 0x6, 0x9a,
+ 0xca, 0x5, 0xfb, 0x6d, 0x6, 0xe, 0x20, 0x80,
+ 0xf7, 0x3, 0x1, 0xa6, 0xf7, 0x3, 0x3, 0xa6,
+ 0xb7, 0x84, 0xa, 0x3c, 0x8e, 0x76, 0xf9, 0x40,
+ 0x77, 0x1, 0x77, 0xf8, 0xb, 0x3, 0x77, 0x79,
+ 0x15, 0xf8, 0x2a, 0xf9, 0x40, 0x5, 0x5f, 0x6,
+ 0xfc, 0x2b, 0xfd, 0x40, 0x5, 0xe, 0x84, 0xa7,
+ 0xf9, 0x7, 0xa7, 0x1, 0xab, 0xda, 0xf7, 0xc7,
+ 0xda, 0x3, 0xf7, 0x3, 0xf7, 0x30, 0x15, 0xec,
+ 0xd3, 0xf8, 0x1f, 0xf7, 0x29, 0xe1, 0x8b, 0x25,
+ 0x6d, 0xfb, 0x43, 0x35, 0xfb, 0xd4, 0xfb, 0x1a,
+ 0x6b, 0x54, 0x9e, 0xf7, 0x8, 0x1e, 0x3c, 0xbb,
+ 0x15, 0x23, 0xc4, 0x20, 0xf3, 0xf7, 0x3c, 0xf7,
+ 0x1c, 0xf7, 0x7c, 0xf7, 0x5a, 0xed, 0x70, 0xf7,
+ 0x2f, 0xfb, 0x19, 0xfb, 0x1f, 0xfb, 0x3a, 0xfb,
+ 0x5e, 0xfb, 0xa2, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+ 0x38, 0x77, 0x1, 0xbc, 0xf7, 0xf8, 0x3, 0xbc,
+ 0x16, 0xf7, 0xab, 0x9a, 0x6, 0x5e, 0x6c, 0x96,
+ 0xaf, 0x8f, 0x8b, 0x8f, 0x8c, 0x90, 0x1f, 0xf7,
+ 0x2a, 0xf8, 0xc9, 0x5, 0x8e, 0x95, 0x8e, 0x98,
+ 0x92, 0x1a, 0x8f, 0x8a, 0x8d, 0x88, 0x83, 0xfb,
+ 0x1f, 0x6d, 0x83, 0x5c, 0x1e, 0x7c, 0x7, 0x8c,
+ 0xa1, 0x9e, 0x8c, 0x99, 0x1b, 0xa7, 0x97, 0x80,
+ 0x76, 0x83, 0x87, 0x7d, 0x88, 0x80, 0x1f, 0xfb,
+ 0x1a, 0xfc, 0x76, 0x5, 0x5e, 0x7e, 0x52, 0x79,
+ 0x5d, 0x1b, 0xe, 0x8b, 0xd7, 0xf8, 0xa3, 0xd4,
+ 0x1, 0xf8, 0x2, 0xe1, 0x3, 0x97, 0x16, 0xf7,
+ 0xf7, 0x6, 0xbd, 0xf7, 0x18, 0x7a, 0x92, 0x5,
+ 0x67, 0x7a, 0x71, 0x70, 0x49, 0x1b, 0xfb, 0x48,
+ 0x90, 0x6, 0xf7, 0x54, 0xf7, 0x54, 0x5, 0xf7,
+ 0x10, 0xf7, 0x10, 0xa4, 0xb8, 0xce, 0x1a, 0xd6,
+ 0x53, 0xe7, 0x21, 0x72, 0xfb, 0x17, 0x87, 0xfb,
+ 0x30, 0x55, 0x1e, 0xa0, 0x84, 0x5, 0xa4, 0x99,
+ 0xb1, 0xd0, 0xe5, 0x1b, 0xd8, 0xb9, 0x4f, 0x4d,
+ 0x6a, 0x87, 0x51, 0xfb, 0x20, 0xfb, 0x29, 0x1f,
+ 0xfb, 0x66, 0xfb, 0x6d, 0x5, 0xe, 0x84, 0xb1,
+ 0x65, 0xf7, 0x0, 0xf7, 0x98, 0x9b, 0xf7, 0x95,
+ 0xb5, 0x12, 0xf7, 0xee, 0xdb, 0x5b, 0xe2, 0x13,
+ 0x98, 0xf7, 0x20, 0xf7, 0xfd, 0x15, 0xec, 0x92,
+ 0xe3, 0x66, 0xfb, 0x20, 0x1a, 0xfb, 0x12, 0x2d,
+ 0x69, 0x69, 0x6f, 0x76, 0x9c, 0x9c, 0x76, 0x1e,
+ 0x13, 0x74, 0x9d, 0x76, 0x76, 0x9d, 0x74, 0x1b,
+ 0x66, 0x81, 0x6f, 0x76, 0x5e, 0xc2, 0x7d, 0xc6,
+ 0x1f, 0x13, 0x34, 0xf7, 0x4d, 0xe6, 0xf7, 0x22,
+ 0xf7, 0x3, 0xf7, 0x2, 0x46, 0xa9, 0x71, 0x97,
+ 0x1f, 0x8e, 0x7, 0xf4, 0xb2, 0xbd, 0xae, 0xd7,
+ 0x1a, 0xde, 0x43, 0xb5, 0x41, 0x52, 0x40, 0x5f,
+ 0x4f, 0x72, 0x1e, 0x9b, 0x86, 0x5, 0x9f, 0x9a,
+ 0xae, 0xba, 0xca, 0x1b, 0xb1, 0xbc, 0x73, 0x48,
+ 0xfb, 0x0, 0xfb, 0x1f, 0x5f, 0x27, 0x7d, 0x1f,
+ 0xe, 0xa0, 0x76, 0xf7, 0x3c, 0xca, 0xf8, 0x51,
+ 0x77, 0x12, 0x8c, 0xf8, 0x72, 0x17, 0xcc, 0xf7,
+ 0x7b, 0x15, 0x8f, 0x7, 0xf7, 0xc4, 0xf7, 0xdc,
+ 0x5, 0x8f, 0x6, 0x13, 0xf0, 0x28, 0xfb, 0xe0,
+ 0x5, 0xfb, 0xa5, 0x4c, 0x15, 0xf7, 0x97, 0x6,
+ 0x5d, 0xfb, 0x3c, 0x5, 0xda, 0x6, 0xb6, 0xf7,
+ 0x3a, 0x5, 0xef, 0x6, 0x99, 0xcc, 0x5, 0x2c,
+ 0x6, 0x13, 0x30, 0xf7, 0x10, 0xf8, 0x51, 0x5,
+ 0x62, 0x6, 0xfc, 0x35, 0xfc, 0x4d, 0x5, 0xe,
+ 0x84, 0xb5, 0xf8, 0xc4, 0xd2, 0x1, 0xf7, 0xf2,
+ 0xd0, 0x3, 0xf7, 0x17, 0xf8, 0x3b, 0x15, 0xf7,
+ 0x8, 0x72, 0xf2, 0x7f, 0xfb, 0x2d, 0x1a, 0x34,
+ 0x42, 0xfb, 0x3, 0x29, 0x6f, 0x77, 0x9a, 0x99,
+ 0x78, 0x1e, 0x98, 0x79, 0x7a, 0x98, 0x75, 0x1b,
+ 0x78, 0x76, 0x7f, 0x6e, 0x6f, 0xa9, 0x6f, 0xd3,
+ 0xf7, 0x57, 0xf6, 0xf7, 0x2e, 0xf7, 0x14, 0xf7,
+ 0x1a, 0x31, 0xc9, 0xfb, 0x16, 0xa5, 0x1f, 0xb2,
+ 0xed, 0x5, 0xf7, 0x7a, 0x6, 0xa2, 0xd2, 0x5,
+ 0xfb, 0x94, 0x6, 0x23, 0xfb, 0x78, 0x5, 0xe,
+ 0x84, 0xa5, 0xf8, 0x11, 0xaf, 0xf7, 0x8e, 0x77,
+ 0x1, 0xac, 0xd7, 0xf7, 0x9b, 0xe4, 0x3, 0xf7,
+ 0x5b, 0xf8, 0x4a, 0x15, 0xbd, 0xa3, 0xf7, 0xe,
+ 0xf7, 0x4a, 0xf7, 0x44, 0x1b, 0x8a, 0x9b, 0x5,
+ 0xfb, 0xc5, 0xfb, 0x4d, 0xfb, 0xa2, 0xfb, 0x62,
+ 0xfb, 0x38, 0xee, 0x56, 0xdc, 0xf7, 0x3e, 0xdc,
+ 0xf7, 0x3d, 0xf0, 0xf7, 0x22, 0x26, 0xbf, 0x47,
+ 0x6c, 0x6d, 0x83, 0x7e, 0x6f, 0x1f, 0x2a, 0xfb,
+ 0xab, 0x15, 0x9b, 0x95, 0xf7, 0x8c, 0xf7, 0x1e,
+ 0xd7, 0xb5, 0x51, 0x39, 0x31, 0x55, 0xfb, 0x40,
+ 0xfb, 0x6, 0x29, 0x8b, 0xf7, 0x4, 0xa5, 0x1e,
+ 0xe, 0x98, 0x76, 0xf8, 0xed, 0xd4, 0x1, 0xd6,
+ 0xf8, 0x5c, 0x3, 0xda, 0x83, 0x15, 0xd1, 0x6,
+ 0xf8, 0x18, 0xf9, 0x2c, 0x85, 0x95, 0x5, 0xfc,
+ 0xb, 0x6, 0x3a, 0xfb, 0x1c, 0x99, 0x82, 0x5,
+ 0xb3, 0xad, 0xb0, 0xab, 0xd3, 0x1b, 0xf7, 0x68,
+ 0x6, 0x8d, 0x88, 0x5, 0xe, 0x84, 0xa1, 0xf9,
+ 0x12, 0xa2, 0x12, 0xa9, 0xcf, 0xb3, 0xd9, 0xf7,
+ 0x2d, 0xd6, 0x78, 0xcf, 0x13, 0xf8, 0xf7, 0x75,
+ 0xf7, 0xfc, 0x15, 0x73, 0x84, 0xfb, 0x3f, 0x58,
+ 0xfb, 0x25, 0x1a, 0x6d, 0xa0, 0xfb, 0x1a, 0xf7,
+ 0x47, 0xf7, 0x1a, 0xdb, 0xe1, 0xe1, 0xd9, 0x63,
+ 0xcb, 0x40, 0xd6, 0x1e, 0x13, 0xf4, 0xc2, 0x9d,
+ 0xf7, 0x1, 0xb1, 0xec, 0x1a, 0xf7, 0x2, 0xfb,
+ 0x0, 0xaa, 0x49, 0x2d, 0x34, 0x5a, 0x24, 0x57,
+ 0xa5, 0x5c, 0xc8, 0x4a, 0x1e, 0xa1, 0x7b, 0x15,
+ 0x13, 0xf8, 0xec, 0x27, 0xa4, 0x6e, 0x4a, 0x1a,
+ 0x2b, 0x3d, 0x64, 0x55, 0x35, 0x56, 0xc7, 0xda,
+ 0xf7, 0x13, 0xf7, 0xf, 0xc2, 0xa5, 0x93, 0x1e,
+ 0xcb, 0xc2, 0x15, 0x2c, 0xe1, 0x8b, 0xaa, 0xa5,
+ 0x1a, 0xce, 0xb1, 0xb7, 0xcb, 0x1e, 0x13, 0xf4,
+ 0xdc, 0xa5, 0x48, 0x5b, 0x38, 0x50, 0x6d, 0x54,
+ 0x71, 0x1f, 0xe, 0x8f, 0x76, 0xf7, 0x93, 0xb9,
+ 0xf8, 0x2, 0xa5, 0x1, 0xd0, 0xe3, 0xf7, 0x98,
+ 0xd6, 0x3, 0xa2, 0x8c, 0x15, 0x79, 0x7, 0xf7,
+ 0x2e, 0xf7, 0xcf, 0xf7, 0x42, 0xf7, 0xbd, 0xf7,
+ 0x28, 0x3b, 0xd5, 0x24, 0xfb, 0x9, 0xfb, 0xf,
+ 0xfb, 0x10, 0xfb, 0x1d, 0xfb, 0xb, 0xcd, 0x3e,
+ 0xe0, 0xb7, 0xb7, 0x9e, 0xa5, 0xb3, 0x1f, 0x8f,
+ 0x89, 0x5, 0x51, 0x80, 0xfb, 0x54, 0xfb, 0x5f,
+ 0xfb, 0x12, 0x1b, 0xf7, 0x1a, 0xf8, 0x2f, 0x15,
+ 0xe8, 0xbb, 0xf7, 0x25, 0xf7, 0x5, 0xee, 0x8b,
+ 0xfb, 0x0, 0x64, 0x70, 0x7b, 0xfb, 0x4, 0x72,
+ 0x64, 0x1e, 0x60, 0x6f, 0x53, 0x7a, 0x6c, 0x1b,
+ 0x27, 0x87, 0xf7, 0x7, 0xab, 0x1f, 0xe, 0x73,
+ 0x80, 0xf7, 0x2, 0xf7, 0x7c, 0xf7, 0x2, 0x12,
+ 0xbd, 0xf7, 0x2, 0x82, 0xf7, 0x2, 0x13, 0xe0,
+ 0xbd, 0xb7, 0x8a, 0xa, 0x13, 0xd0, 0xf0, 0xf7,
+ 0xea, 0x8a, 0xa, 0xe, 0x73, 0xf7, 0xdd, 0xf7,
+ 0x4, 0x12, 0xf7, 0x29, 0xf7, 0x4, 0xfb, 0x3,
+ 0xf7, 0x3, 0x13, 0xa0, 0xa6, 0xfb, 0x4, 0x15,
+ 0x94, 0x7a, 0x5, 0x13, 0xc0, 0xc8, 0xa, 0x76,
+ 0x6c, 0x7c, 0x61, 0x73, 0x99, 0x83, 0x98, 0x83,
+ 0x1e, 0x95, 0x84, 0x95, 0x84, 0x7c, 0x1a, 0x66,
+ 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xf7, 0xe, 0xf8,
+ 0x85, 0x15, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+ 0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+ 0x72, 0x6c, 0x1e, 0xe, 0xf7, 0xd2, 0x98, 0x76,
+ 0xb9, 0x76, 0xf8, 0x85, 0x77, 0x1, 0xf7, 0x33,
+ 0xf8, 0x59, 0x3, 0xdf, 0xf7, 0x88, 0x15, 0xf8,
+ 0x90, 0xfb, 0x90, 0x5, 0xb5, 0x7, 0xfc, 0x4e,
+ 0xf7, 0x6f, 0xf8, 0x4e, 0xf7, 0x6f, 0x5, 0xb5,
+ 0x7, 0xfc, 0x90, 0xfb, 0x90, 0x5, 0xe, 0xf7,
+ 0xd2, 0xf7, 0xc, 0xce, 0xf7, 0x18, 0xce, 0x63,
+ 0xb3, 0x12, 0x13, 0xa0, 0xe1, 0xf7, 0xee, 0x15,
+ 0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+ 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb0, 0xfc,
+ 0x8c, 0x7, 0xe, 0xf7, 0xd2, 0x98, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xdf, 0x83, 0x15, 0xb5, 0x7,
+ 0xf8, 0x4e, 0xf7, 0x6f, 0xfc, 0x4e, 0xf7, 0x6f,
+ 0x5, 0xb5, 0x7, 0xf8, 0x90, 0xfb, 0x90, 0x5,
+ 0x79, 0x7, 0xe, 0x7f, 0xf3, 0xf8, 0xba, 0xa1,
+ 0x12, 0xf7, 0x18, 0xf3, 0x57, 0xcb, 0xf7, 0x2a,
+ 0xd5, 0x13, 0xd8, 0xf7, 0x5b, 0xf7, 0x44, 0x15,
+ 0x9c, 0x89, 0x5, 0xd3, 0xdb, 0xd6, 0xb5, 0xac,
+ 0x1e, 0xbf, 0xb4, 0xdd, 0xc1, 0xe3, 0x1a, 0xd5,
+ 0x54, 0xc0, 0x2b, 0x44, 0x49, 0x64, 0x44, 0x6e,
+ 0xa1, 0x77, 0xa3, 0x95, 0xac, 0x94, 0xa9, 0x96,
+ 0x85, 0x92, 0x85, 0x92, 0x1e, 0x85, 0x92, 0x84,
+ 0x92, 0x97, 0x1a, 0xba, 0xcc, 0x8b, 0x90, 0xd4,
+ 0x92, 0x50, 0x72, 0x44, 0x62, 0x5e, 0x5b, 0x58,
+ 0x1e, 0x57, 0x55, 0x51, 0x34, 0x41, 0x1a, 0x13,
+ 0xe8, 0x48, 0xfb, 0x1c, 0x15, 0x13, 0xd8, 0x6e,
+ 0xa2, 0x74, 0xa8, 0x1e, 0x13, 0xe8, 0xa8, 0xa2,
+ 0xa2, 0xa8, 0x1f, 0x13, 0xd8, 0xa8, 0x74, 0xa2,
+ 0x6e, 0x1e, 0x13, 0xe8, 0x6e, 0x74, 0x74, 0x6e,
+ 0x1f, 0xe, 0xf8, 0xc7, 0x79, 0xb2, 0xed, 0xac,
+ 0x7d, 0xb6, 0xf7, 0xb3, 0xb7, 0xf7, 0xf, 0xaa,
+ 0x12, 0xf7, 0xa, 0xde, 0xf7, 0xc, 0xd2, 0xf8,
+ 0xa, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7, 0x9c,
+ 0x15, 0xf7, 0xc, 0xe3, 0xd3, 0xbb, 0x1e, 0x13,
+ 0xaf, 0xa8, 0x98, 0x75, 0x61, 0x1f, 0x2a, 0x8c,
+ 0x40, 0xfb, 0x6, 0x61, 0x1b, 0x68, 0x70, 0xa3,
+ 0xc6, 0x1f, 0xf7, 0x21, 0x53, 0x15, 0x7f, 0x8a,
+ 0xa2, 0x51, 0xcd, 0x1b, 0xf7, 0xa, 0xce, 0xf7,
+ 0x1b, 0xf0, 0xf7, 0x3b, 0xfb, 0x23, 0xf7, 0x11,
+ 0xfb, 0x4b, 0xfb, 0x58, 0xfb, 0x3a, 0xfb, 0x24,
+ 0xfb, 0x69, 0xfb, 0x19, 0xf7, 0x5, 0xfb, 0x56,
+ 0xf7, 0x97, 0xd8, 0xd9, 0xab, 0xa9, 0xca, 0x1f,
+ 0x7f, 0xa8, 0x5, 0x71, 0x52, 0x4d, 0x71, 0x33,
+ 0x1b, 0xfb, 0x41, 0xfb, 0x7, 0xf7, 0x1c, 0xf7,
+ 0x21, 0xf7, 0x71, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+ 0x2c, 0xf7, 0x4a, 0xf3, 0xfb, 0x29, 0xfb, 0x5,
+ 0x1f, 0x13, 0xdf, 0x35, 0x5b, 0xfb, 0x8, 0x39,
+ 0x5f, 0x90, 0xbb, 0x9a, 0x8f, 0x1e, 0xcc, 0xf7,
+ 0x9a, 0x5, 0x46, 0x6, 0x81, 0x5c, 0x5, 0xa2,
+ 0x7e, 0x80, 0xa7, 0x5c, 0x1b, 0xfb, 0x19, 0x4d,
+ 0xfb, 0x3c, 0x45, 0x1f, 0x13, 0x0, 0xfb, 0x5,
+ 0xcf, 0x81, 0xa6, 0x1e, 0xc5, 0x8a, 0xb8, 0xc0,
+ 0x97, 0x9c, 0x8, 0xe, 0x5a, 0xa, 0x1, 0x58,
+ 0xf7, 0x4f, 0xf7, 0x98, 0xf7, 0x3c, 0x3, 0x58,
+ 0x16, 0x9b, 0xa, 0x5d, 0x7e, 0x9e, 0xa5, 0xa8,
+ 0x91, 0x91, 0xd2, 0xf7, 0x16, 0x1f, 0xf7, 0x70,
+ 0x6, 0xa1, 0xfb, 0x12, 0x8b, 0x74, 0x8a, 0x1a,
+ 0x63, 0x71, 0x77, 0x57, 0x1e, 0x7b, 0xf7, 0x8a,
+ 0x9b, 0x7, 0x51, 0x87, 0xa6, 0xc8, 0x80, 0x1f,
+ 0x2a, 0xf8, 0xc8, 0x5, 0x71, 0x6, 0xfb, 0xd9,
+ 0xfc, 0xb7, 0x5, 0x59, 0x6e, 0x70, 0x54, 0x65,
+ 0x1b, 0x45, 0xa, 0xe, 0xf7, 0x92, 0x86, 0xa9,
+ 0x72, 0xa9, 0xf7, 0xc1, 0xab, 0xf7, 0x98, 0xa9,
+ 0x12, 0xf7, 0x51, 0xf0, 0xf7, 0x21, 0xf7, 0x0,
+ 0x57, 0xf0, 0x13, 0x7c, 0x83, 0x16, 0xf7, 0xae,
+ 0x6, 0xf7, 0x14, 0xf7, 0x1d, 0xc9, 0xf7, 0x1d,
+ 0xed, 0x45, 0xa9, 0x56, 0xa2, 0x1f, 0x8d, 0x7,
+ 0x13, 0xba, 0xe9, 0x9e, 0xd9, 0xb6, 0xe5, 0x1a,
+ 0xf7, 0x7, 0x2b, 0xad, 0x23, 0x1e, 0xfb, 0x96,
+ 0x7b, 0x6, 0xdf, 0x81, 0x51, 0x52, 0x7c, 0x1f,
+ 0xfb, 0x5, 0xfc, 0x47, 0x7f, 0x5d, 0x67, 0x73,
+ 0x67, 0x8a, 0x19, 0x13, 0x7c, 0xf7, 0x4a, 0xd0,
+ 0x15, 0x9e, 0xbc, 0xf7, 0x37, 0x9a, 0xcb, 0x1e,
+ 0xf7, 0x3a, 0xa6, 0x5e, 0x3d, 0x28, 0x52, 0x3c,
+ 0xfb, 0x21, 0x6e, 0x6d, 0x9c, 0xb1, 0x1f, 0xd5,
+ 0xf7, 0xaa, 0x15, 0xb5, 0xf7, 0x33, 0x5, 0xeb,
+ 0xa2, 0x83, 0x90, 0xd1, 0x1b, 0x13, 0xba, 0xd6,
+ 0xb0, 0x67, 0x47, 0xfb, 0x20, 0xfb, 0xd, 0x7b,
+ 0xfb, 0xa, 0x1f, 0xe, 0xf7, 0xca, 0x79, 0xb8,
+ 0xd4, 0xa, 0x13, 0xb0, 0xf9, 0x20, 0xf8, 0x65,
+ 0x15, 0xb8, 0xa, 0x7e, 0x74, 0x93, 0x92, 0x6d,
+ 0x1f, 0x13, 0xd0, 0x90, 0x75, 0x70, 0x8f, 0x6c,
+ 0xd5, 0xa, 0xfb, 0x5c, 0xf7, 0x26, 0x45, 0xf7,
+ 0x8, 0xf7, 0x26, 0xe4, 0xf4, 0xb7, 0xb0, 0x6f,
+ 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xa9, 0xf8, 0xe5,
+ 0xa9, 0x12, 0xf8, 0xe1, 0xf7, 0x3, 0x17, 0xb1,
+ 0xa, 0x1f, 0x13, 0xe0, 0xf4, 0x4d, 0xf7, 0x35,
+ 0xfb, 0x7a, 0x1e, 0xfb, 0xaa, 0x7b, 0x6, 0xe3,
+ 0x7e, 0x45, 0x59, 0x7d, 0x1f, 0xfb, 0x7, 0xfc,
+ 0x35, 0x5, 0x4d, 0x7a, 0x70, 0x75, 0x63, 0x1b,
+ 0xf7, 0x5f, 0xf7, 0x30, 0x15, 0xf7, 0x4, 0xf8,
+ 0x30, 0x5, 0x99, 0x8f, 0x95, 0xa4, 0xc4, 0xb2,
+ 0xa, 0x59, 0x79, 0x9d, 0xa5, 0xa6, 0x97, 0xaf,
+ 0x95, 0xae, 0x1f, 0xe, 0xf7, 0x92, 0x8b, 0xac,
+ 0xf7, 0xb9, 0xac, 0x6c, 0xe9, 0xa, 0x12, 0x8a,
+ 0xf9, 0xf, 0x13, 0xd8, 0x8b, 0xa, 0x74, 0x62,
+ 0x92, 0xb4, 0x90, 0x8b, 0x96, 0x8d, 0x92, 0x1f,
+ 0x13, 0xb8, 0x8e, 0x96, 0x85, 0x79, 0xcb, 0xf7,
+ 0x7b, 0x8, 0xf7, 0x37, 0x8b, 0x7d, 0x63, 0x40,
+ 0xa, 0x85, 0x80, 0xfb, 0x35, 0x1b, 0xb7, 0xf7,
+ 0x37, 0x5, 0xce, 0x9d, 0x81, 0xa8, 0xe9, 0x1b,
+ 0xf7, 0x3e, 0x9a, 0x6f, 0x67, 0x7c, 0x8b, 0x79,
+ 0x89, 0x76, 0x63, 0xa, 0xc2, 0x9c, 0x70, 0x75,
+ 0x77, 0x87, 0x74, 0x84, 0x74, 0x1f, 0xfb, 0x7,
+ 0xfc, 0x3a, 0x5, 0x47, 0x79, 0x64, 0x7b, 0x70,
+ 0x1b, 0xe, 0x7d, 0xa, 0xf7, 0xdc, 0xe9, 0xa,
+ 0x1, 0xf7, 0x64, 0xee, 0x3, 0x93, 0x16, 0xf7,
+ 0x90, 0x9b, 0x6, 0x49, 0x8a, 0x80, 0xb6, 0x9a,
+ 0xc4, 0xc4, 0xf7, 0x69, 0x18, 0xe3, 0xd1, 0x95,
+ 0x4f, 0x76, 0x86, 0x74, 0x88, 0x7d, 0x1f, 0x9c,
+ 0x86, 0xd7, 0xf7, 0x7e, 0x79, 0x90, 0x5, 0x2c,
+ 0x5d, 0x7a, 0x8d, 0xfb, 0x2d, 0x1b, 0xb6, 0xf7,
+ 0x35, 0x5, 0xe4, 0xa3, 0x8b, 0x94, 0xdb, 0x1b,
+ 0xf7, 0x28, 0xaf, 0x7e, 0x4c, 0x7d, 0x89, 0x7d,
+ 0x8a, 0x7d, 0x1f, 0xa0, 0x89, 0xab, 0xf7, 0x2d,
+ 0x5, 0xfc, 0x86, 0x7b, 0x6, 0xc2, 0x9b, 0x75,
+ 0x6d, 0x78, 0x87, 0x74, 0x85, 0x76, 0x1f, 0xfb,
+ 0x1, 0xfc, 0x2a, 0x75, 0x3a, 0x87, 0x84, 0x4a,
+ 0x7f, 0x19, 0xe, 0xb6, 0xa, 0xb0, 0xf8, 0xf9,
+ 0xad, 0x1, 0xbf, 0xf7, 0x2, 0x3, 0xf8, 0x5c,
+ 0xf7, 0xc3, 0x15, 0xb9, 0xa0, 0x71, 0x69, 0x85,
+ 0x8b, 0x84, 0x8a, 0x84, 0x1f, 0x88, 0x7b, 0x76,
+ 0xfb, 0x17, 0x6e, 0x74, 0x8, 0x74, 0x6e, 0x72,
+ 0x80, 0x58, 0x1b, 0xfb, 0x3e, 0x6b, 0xf7, 0x10,
+ 0xd9, 0xf7, 0x38, 0xed, 0xf7, 0x8b, 0xf7, 0x5d,
+ 0xd2, 0xf7, 0x1, 0x6a, 0xfb, 0x17, 0x1f, 0x9d,
+ 0x88, 0xbc, 0xf7, 0x59, 0x7c, 0x8f, 0x5, 0x7d,
+ 0x81, 0x7d, 0x77, 0x64, 0x1b, 0x7c, 0x70, 0x96,
+ 0x95, 0x67, 0x1f, 0x92, 0x70, 0x6b, 0x91, 0x67,
+ 0x1b, 0xfb, 0x6a, 0xfb, 0x53, 0xfb, 0x59, 0xfb,
+ 0x79, 0x60, 0xa8, 0xfb, 0x6b, 0xf7, 0x9c, 0xd4,
+ 0xe9, 0xa1, 0xb3, 0xcb, 0x1f, 0xb8, 0xf7, 0x45,
+ 0x5, 0xcb, 0x9c, 0xaa, 0x9d, 0xc0, 0x1b, 0x9b,
+ 0xfb, 0x9e, 0x7, 0xe, 0xf8, 0x1, 0xa0, 0x76,
+ 0xf7, 0xb9, 0xb5, 0xf7, 0xd2, 0x77, 0x12, 0x83,
+ 0xf7, 0x8a, 0xfb, 0x8a, 0xf9, 0x9b, 0xfb, 0x8b,
+ 0xf7, 0x8b, 0x13, 0xf4, 0x83, 0x16, 0xf7, 0x8a,
+ 0x9b, 0x6, 0x68, 0x6d, 0x9a, 0xb1, 0x92, 0x8c,
+ 0x92, 0x8d, 0x94, 0x1f, 0x13, 0xe8, 0xc7, 0xf7,
+ 0x7e, 0x5, 0xf7, 0xb1, 0x6, 0x50, 0xfb, 0x76,
+ 0x5, 0x4b, 0x79, 0x55, 0x77, 0x68, 0x1b, 0xe6,
+ 0xa, 0x64, 0x6b, 0x9b, 0xb4, 0x92, 0x8c, 0x93,
+ 0x8d, 0x93, 0x1f, 0xf7, 0x3, 0xf8, 0x3c, 0x5,
+ 0xf7, 0x7, 0xa9, 0xaa, 0x8d, 0xae, 0x1b, 0x93,
+ 0xa, 0xbb, 0x9b, 0x73, 0x6c, 0x78, 0x87, 0x76,
+ 0x85, 0x77, 0x1f, 0x62, 0xfb, 0x2e, 0x5, 0xfb,
+ 0xb1, 0x6, 0xb5, 0xf7, 0x2e, 0x5, 0xf7, 0x5,
+ 0xaa, 0xbf, 0x8d, 0xa9, 0x1b, 0xc4, 0xa, 0xc1,
+ 0x9d, 0x74, 0x6c, 0x78, 0x86, 0x76, 0x85, 0x76,
+ 0x1f, 0xfb, 0x4, 0xfc, 0x3a, 0x5, 0x4d, 0x7a,
+ 0x67, 0x75, 0x69, 0x1b, 0xe, 0x73, 0xcb, 0xa,
+ 0x83, 0xf8, 0x1c, 0x3, 0x83, 0x16, 0xf7, 0x88,
+ 0x9b, 0x6, 0x59, 0x7d, 0xa4, 0xaa, 0x9e, 0x90,
+ 0xa0, 0x90, 0x9d, 0x1f, 0xf7, 0x1, 0xf8, 0x1c,
+ 0x5, 0xec, 0xa6, 0xa2, 0x9d, 0xb6, 0x1b, 0x93,
+ 0xa, 0xb9, 0x9d, 0x76, 0x72, 0x76, 0x88, 0x72,
+ 0x85, 0x74, 0x1f, 0x20, 0xfc, 0x1c, 0x5, 0x28,
+ 0x70, 0x78, 0x7c, 0x5c, 0x1b, 0xe, 0xe2, 0x79,
+ 0xaa, 0x6c, 0xf7, 0x22, 0xf8, 0xa5, 0x77, 0x12,
+ 0x85, 0xe8, 0x13, 0xb0, 0xf7, 0x81, 0xf9, 0x11,
+ 0x15, 0xc3, 0x9d, 0x76, 0x6d, 0x78, 0x86, 0x74,
+ 0x85, 0x75, 0x1f, 0xfb, 0x15, 0xfc, 0x5b, 0x5,
+ 0x77, 0x85, 0x82, 0x69, 0x69, 0x1b, 0x6a, 0x88,
+ 0xa1, 0xa2, 0x8c, 0x1f, 0x91, 0x8c, 0x92, 0x91,
+ 0x1a, 0x13, 0x70, 0xa4, 0x75, 0xa1, 0x71, 0x6e,
+ 0x7a, 0x74, 0x6c, 0x4e, 0xc7, 0x70, 0xc0, 0xf7,
+ 0x17, 0xb2, 0xf3, 0xf5, 0xa8, 0x1e, 0xea, 0xf7,
+ 0xde, 0x5, 0xd9, 0xa2, 0x99, 0xb0, 0xc0, 0x1b,
+ 0x9b, 0xfb, 0x92, 0x7, 0xe, 0xf7, 0xca, 0xa0,
+ 0x76, 0xf7, 0xe6, 0xb0, 0xf7, 0xaa, 0x77, 0x1,
+ 0x92, 0xf9, 0x5f, 0x3, 0x92, 0x16, 0xf7, 0x8c,
+ 0x9b, 0x6, 0x52, 0x7e, 0x9d, 0xaa, 0x9a, 0x91,
+ 0x9e, 0x91, 0xa0, 0x1f, 0xc7, 0xf7, 0x6f, 0x93,
+ 0x8a, 0xf7, 0x7, 0xfb, 0x5a, 0x5, 0x9a, 0x70,
+ 0x9f, 0x6c, 0x73, 0x1a, 0x73, 0x7b, 0x79, 0x53,
+ 0x1e, 0x7b, 0xf7, 0xa7, 0x9b, 0x7, 0x5d, 0x74,
+ 0x92, 0xbc, 0x6f, 0x1f, 0xfb, 0x42, 0xf7, 0xc3,
+ 0xf7, 0xc0, 0xf7, 0x76, 0x5, 0x90, 0x92, 0xb2,
+ 0xaa, 0xa8, 0x1b, 0x9b, 0xfb, 0x72, 0x7b, 0x7,
+ 0xbc, 0x97, 0x83, 0x7a, 0x72, 0x3f, 0x4b, 0x47,
+ 0x5b, 0x1f, 0xfb, 0x24, 0x26, 0x85, 0x8c, 0xb7,
+ 0xf7, 0x31, 0x5, 0xe0, 0xa3, 0xa5, 0x9f, 0xc5,
+ 0x1b, 0xc4, 0xa, 0xc3, 0xa0, 0x7b, 0x70, 0x7a,
+ 0x87, 0x76, 0x84, 0x73, 0x1f, 0xfb, 0x7, 0xfc,
+ 0x2f, 0x5, 0x38, 0x74, 0x81, 0x75, 0x52, 0x1b,
+ 0xe, 0x6e, 0xa, 0x58, 0x59, 0x8b, 0xb2, 0x8f,
+ 0x8b, 0x90, 0x8d, 0x91, 0x1f, 0xf7, 0xd, 0xf8,
+ 0x4f, 0x5, 0xcd, 0x9d, 0xa5, 0xb1, 0xcd, 0x1b,
+ 0xc4, 0xa, 0xc7, 0x9c, 0x79, 0x6e, 0x7b, 0x86,
+ 0x77, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4e,
+ 0x5, 0x4d, 0x7a, 0x6a, 0x7f, 0x6c, 0x1b, 0xe,
+ 0xf8, 0x70, 0xcb, 0xa, 0x79, 0xfa, 0xf, 0xfd,
+ 0x61, 0xf7, 0x49, 0xf7, 0x20, 0xf7, 0xa5, 0x3,
+ 0x79, 0xe4, 0xa, 0x55, 0x7d, 0xa4, 0xab, 0xa1,
+ 0x93, 0xa6, 0x92, 0xa3, 0x1f, 0xf5, 0xf8, 0x1a,
+ 0x5, 0x8f, 0x6, 0xc7, 0xfc, 0xac, 0x5, 0x9c,
+ 0x6, 0xf8, 0x8, 0xf8, 0xbd, 0x5, 0x8e, 0x6,
+ 0xfb, 0xc, 0xfc, 0x45, 0x5, 0x57, 0x7d, 0x86,
+ 0x57, 0x32, 0x1b, 0xe6, 0xa, 0x4d, 0x7a, 0x9d,
+ 0xa6, 0x9c, 0x92, 0x9f, 0x91, 0xa1, 0x1f, 0xf7,
+ 0xf, 0xf8, 0x4f, 0x5, 0xca, 0x9c, 0xa8, 0x96,
+ 0xaf, 0x1b, 0x9b, 0xfb, 0x3b, 0x7, 0xfb, 0xe1,
+ 0xfc, 0x7d, 0x5, 0x88, 0x6, 0x54, 0xf8, 0x7d,
+ 0x5, 0xfb, 0x49, 0x7b, 0x6, 0xc2, 0x9e, 0x79,
+ 0x76, 0x82, 0x80, 0x6c, 0x80, 0x63, 0x1f, 0x21,
+ 0xfc, 0x8, 0x5, 0xfb, 0x8, 0x6a, 0x6b, 0x7d,
+ 0x6a, 0x1b, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf,
+ 0x76, 0xf7, 0x32, 0x77, 0xf8, 0x97, 0x77, 0x12,
+ 0xf7, 0x5a, 0xaa, 0x13, 0x78, 0x77, 0xe4, 0xa,
+ 0x54, 0x7b, 0xa1, 0xaa, 0xa9, 0x9a, 0xb0, 0x93,
+ 0xaa, 0x1f, 0xee, 0xf7, 0xfe, 0x5, 0x8f, 0x6,
+ 0x13, 0xb8, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d,
+ 0x6, 0xf7, 0x24, 0xf8, 0x8b, 0x5, 0xf7, 0xd,
+ 0xae, 0xa0, 0xa7, 0xbb, 0x1b, 0xeb, 0xa, 0x7b,
+ 0x7, 0xc3, 0x9a, 0x77, 0x6d, 0x79, 0x7c, 0x5e,
+ 0x81, 0x67, 0x1f, 0x33, 0xfb, 0xde, 0x5, 0x88,
+ 0x6, 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, 0x35,
+ 0x7b, 0x6, 0xb4, 0xa7, 0x78, 0x66, 0x9c, 0x1f,
+ 0xfb, 0xb, 0xfc, 0x35, 0x5, 0xfb, 0x16, 0x66,
+ 0x75, 0x79, 0x5f, 0x1b, 0xe, 0xbf, 0xa, 0x90,
+ 0xa, 0xc7, 0xf7, 0x73, 0x15, 0xfb, 0x52, 0xf7,
+ 0x1f, 0x58, 0xe0, 0xf7, 0x74, 0xf7, 0x53, 0xf7,
+ 0x86, 0xf7, 0x5d, 0xf7, 0x3c, 0x24, 0xd4, 0xfb,
+ 0xc, 0xfb, 0x47, 0xfb, 0x81, 0xfb, 0x72, 0xfb,
+ 0x71, 0x1e, 0xf4, 0x5d, 0x15, 0xf7, 0x16, 0xf7,
+ 0x1, 0xf7, 0xda, 0xf7, 0x5a, 0xea, 0xa6, 0x47,
+ 0x30, 0xfb, 0xe, 0x30, 0xfb, 0xe5, 0xfb, 0x5f,
+ 0xfb, 0x16, 0x86, 0xf7, 0x1f, 0xa2, 0x1e, 0xe,
+ 0x7d, 0xa, 0xf7, 0xc5, 0xaf, 0xf7, 0xae, 0xa9,
+ 0x1, 0xf8, 0x8a, 0xf2, 0x3, 0x8b, 0x4, 0xf7,
+ 0x89, 0x9b, 0x6, 0x59, 0x7d, 0x9d, 0xaa, 0x9d,
+ 0x91, 0xa1, 0x92, 0xa4, 0x1f, 0xbb, 0xf7, 0x4b,
+ 0x5, 0x86, 0xa1, 0x99, 0x88, 0xd1, 0x1b, 0xf7,
+ 0x5c, 0xc4, 0xf7, 0xe, 0xd5, 0xf7, 0x2b, 0xfb,
+ 0x3b, 0x8c, 0x5f, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+ 0xc0, 0x9c, 0x79, 0x70, 0x76, 0x83, 0x6f, 0x83,
+ 0x6f, 0x1f, 0x22, 0xfc, 0x14, 0x5, 0x4b, 0x79,
+ 0x7e, 0x58, 0x4b, 0x1b, 0xf7, 0x8f, 0xf7, 0xdf,
+ 0xd8, 0xa, 0x9b, 0xa9, 0x1b, 0xf7, 0x2, 0xa9,
+ 0x61, 0x41, 0xfb, 0x1f, 0x28, 0x70, 0x3a, 0x70,
+ 0x72, 0x8e, 0x8e, 0x78, 0x1f, 0xe, 0xf8, 0x1,
+ 0xfb, 0x4a, 0xcf, 0x73, 0xf7, 0x2f, 0x6a, 0xac,
+ 0xf8, 0xfc, 0xac, 0x12, 0x86, 0xa, 0x13, 0x5c,
+ 0xc6, 0xfb, 0x2e, 0x15, 0x95, 0x7c, 0x5, 0xa4,
+ 0xb2, 0xac, 0x91, 0xaa, 0x1b, 0xad, 0xac, 0x7e,
+ 0x80, 0xb2, 0x1f, 0x13, 0xbc, 0x81, 0xae, 0xb3,
+ 0x81, 0xbc, 0x1b, 0xba, 0xf7, 0x28, 0xa5, 0xf6,
+ 0xd2, 0x1f, 0x7c, 0x96, 0x5, 0x62, 0x63, 0x4f,
+ 0x68, 0x26, 0x1b, 0x75, 0x72, 0x91, 0x92, 0x6f,
+ 0x1f, 0x13, 0x3c, 0x5a, 0x98, 0x53, 0x9c, 0x55,
+ 0x89, 0xc8, 0xc4, 0x18, 0xae, 0xa, 0xf7, 0x82,
+ 0x4f, 0xa, 0xfb, 0x66, 0xfb, 0x71, 0xfb, 0x35,
+ 0xeb, 0x44, 0xdb, 0x7c, 0x1f, 0x2a, 0x36, 0x82,
+ 0x85, 0x44, 0x58, 0x8, 0xf5, 0xf7, 0xeb, 0x15,
+ 0xf7, 0x16, 0xef, 0xf7, 0xce, 0xf7, 0x5a, 0xea,
+ 0xaf, 0x45, 0x30, 0xfb, 0xe, 0x2b, 0xfb, 0xe1,
+ 0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x29, 0xa2,
+ 0x1e, 0xe, 0x7d, 0xa, 0xf7, 0xe1, 0xa7, 0xf7,
+ 0x9a, 0xa9, 0x1, 0xf8, 0x77, 0xf4, 0x3, 0x7e,
+ 0x16, 0xf7, 0x88, 0x9b, 0x6, 0x5b, 0x78, 0x98,
+ 0xaa, 0x9a, 0x8f, 0xa0, 0x92, 0xa3, 0x1f, 0xc3,
+ 0xf7, 0x65, 0xcc, 0x86, 0xf7, 0xf, 0xfb, 0xd8,
+ 0x5, 0xf7, 0x28, 0x9b, 0x6, 0x57, 0x74, 0xbb,
+ 0xae, 0x7e, 0x1f, 0x33, 0xf7, 0x7e, 0x5, 0xc1,
+ 0xf7, 0x23, 0xc4, 0xf7, 0xb, 0xf7, 0x24, 0xfb,
+ 0x40, 0x8b, 0x67, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+ 0xbe, 0x9f, 0x7b, 0x72, 0x79, 0x85, 0x74, 0x85,
+ 0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x30, 0x5, 0x4c,
+ 0x79, 0x80, 0x62, 0x4f, 0x1b, 0xf7, 0x94, 0xf7,
+ 0xf2, 0x15, 0xcc, 0xf7, 0x79, 0x5, 0x9d, 0x92,
+ 0x8f, 0x95, 0xb8, 0x1b, 0xc4, 0xc9, 0x74, 0x35,
+ 0x40, 0x66, 0x3d, 0xfb, 0x24, 0x70, 0x83, 0x8c,
+ 0x8f, 0x73, 0x1f, 0xe, 0x79, 0xae, 0x76, 0xae,
+ 0x72, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+ 0x13, 0x30, 0xb9, 0xa, 0x9c, 0x84, 0x83, 0x9f,
+ 0x1f, 0x13, 0x90, 0x81, 0xa4, 0xa8, 0x80, 0xb1,
+ 0x6d, 0xa, 0x13, 0x48, 0xb3, 0xf7, 0x5b, 0x5,
+ 0x74, 0x6, 0x79, 0x7f, 0x78, 0x83, 0x74, 0x1b,
+ 0x73, 0x7b, 0x94, 0x92, 0x72, 0x1f, 0x13, 0x90,
+ 0x90, 0x7b, 0x77, 0x8f, 0x70, 0x64, 0xa, 0xe,
+ 0xf7, 0x5b, 0xa0, 0x76, 0xf8, 0xfe, 0xae, 0x1,
+ 0xcc, 0x16, 0xf7, 0xb6, 0x9b, 0x6, 0x49, 0x77,
+ 0x9e, 0xac, 0x9c, 0x91, 0xa0, 0x92, 0xa3, 0x1f,
+ 0xf7, 0x1a, 0xf8, 0x7c, 0x5, 0xf7, 0x12, 0xac,
+ 0x85, 0x3c, 0x7f, 0x8a, 0x7d, 0x89, 0x7c, 0x1f,
+ 0x9c, 0x89, 0xb7, 0xf7, 0x37, 0x5, 0xfc, 0xa8,
+ 0x6, 0x61, 0xfb, 0x2e, 0x9d, 0x87, 0x5, 0xf7,
+ 0xf, 0xc5, 0xbd, 0x8b, 0xf7, 0x16, 0x1b, 0xfb,
+ 0x17, 0xfc, 0x7c, 0x5, 0x49, 0x79, 0x60, 0x5b,
+ 0x51, 0x1b, 0xe, 0xaa, 0xa, 0x77, 0x1, 0xf1,
+ 0xe5, 0xf8, 0xa, 0xf7, 0x5b, 0x3, 0xf7, 0x13,
+ 0xf9, 0x11, 0x15, 0xbe, 0xa2, 0x7b, 0x67, 0x1f,
+ 0x59, 0x28, 0xfb, 0xaf, 0x7c, 0xa, 0xf7, 0x3d,
+ 0xc5, 0xf7, 0x0, 0xf7, 0x29, 0xb7, 0x1e, 0xee,
+ 0xf7, 0xe3, 0x5, 0x9d, 0x90, 0xa7, 0xb8, 0xba,
+ 0x1b, 0xeb, 0xa, 0x7b, 0x7, 0xae, 0xaa, 0x7a,
+ 0x5f, 0x79, 0x3d, 0xfb, 0xb2, 0x83, 0x6c, 0x1f,
+ 0x26, 0x6f, 0x56, 0xfb, 0x9, 0xfb, 0x1a, 0x1b,
+ 0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xef, 0xf7, 0xea,
+ 0x9a, 0xb8, 0x1f, 0xaf, 0x97, 0xb0, 0x9b, 0xb7,
+ 0x1b, 0xd2, 0xa, 0xe, 0xf7, 0x92, 0x8e, 0x76,
+ 0xf9, 0x33, 0x77, 0x1, 0xd7, 0xf8, 0xf8, 0x3,
+ 0xf7, 0x84, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0xca,
+ 0xf8, 0x94, 0x5, 0x95, 0x91, 0xca, 0xf7, 0x19,
+ 0xbd, 0x1b, 0x9b, 0xfb, 0x4e, 0x7b, 0x7, 0xb4,
+ 0x9c, 0x75, 0x79, 0x69, 0x6e, 0x5b, 0x7d, 0x73,
+ 0x1f, 0xfb, 0x62, 0xfb, 0xf8, 0x5, 0x86, 0x6,
+ 0x4e, 0xf7, 0xfb, 0x5, 0x87, 0xa1, 0x85, 0xa6,
+ 0xa3, 0x1a, 0xb1, 0x9c, 0xab, 0xcc, 0x1e, 0x9b,
+ 0xfb, 0x85, 0x7b, 0x7, 0xbc, 0x8e, 0x75, 0xfb,
+ 0xf, 0x9f, 0x1f, 0xe, 0xf8, 0x70, 0x8e, 0x76,
+ 0xf9, 0x33, 0x77, 0x1, 0xd2, 0xf9, 0xd7, 0x3,
+ 0xf7, 0x68, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0x72,
+ 0xf8, 0x5a, 0x5, 0x90, 0x6, 0xbd, 0xfc, 0x5a,
+ 0x5, 0x9f, 0x6, 0xf7, 0xc0, 0xf8, 0xd1, 0x5,
+ 0xbf, 0xa6, 0xa9, 0xa9, 0xa0, 0x1b, 0x9b, 0xfb,
+ 0x4d, 0x7b, 0x7, 0xbe, 0x99, 0x73, 0x75, 0x79,
+ 0x84, 0x7a, 0x89, 0x87, 0x1f, 0xfb, 0x58, 0xfc,
+ 0x15, 0x5, 0x88, 0x6, 0x5c, 0xf8, 0x24, 0x5,
+ 0x8f, 0x8b, 0x90, 0x8f, 0x1a, 0xaa, 0xb2, 0xa5,
+ 0xae, 0x1e, 0x9b, 0xfb, 0x82, 0x7b, 0x7, 0xc7,
+ 0x97, 0x74, 0x5e, 0x90, 0x1f, 0x92, 0x50, 0xfb,
+ 0x3e, 0xfb, 0xeb, 0x5, 0x88, 0x6, 0x87, 0xa9,
+ 0x61, 0xf7, 0xfd, 0x5, 0x8a, 0x93, 0x8b, 0x92,
+ 0x91, 0x1a, 0xb4, 0xb8, 0x9c, 0xaa, 0x1e, 0x9b,
+ 0xfb, 0x80, 0x7b, 0x7, 0xc1, 0x98, 0x5f, 0x69,
+ 0x8f, 0x1f, 0xe, 0xf7, 0x92, 0xcb, 0xa, 0x6e,
+ 0xf9, 0x40, 0x3, 0x6e, 0x16, 0xf7, 0x6a, 0x9b,
+ 0x6, 0x61, 0x75, 0x9a, 0xa0, 0x98, 0x91, 0x9a,
+ 0x99, 0x9c, 0x1f, 0xf7, 0x2b, 0xf7, 0x40, 0xd3,
+ 0xfb, 0x47, 0x5, 0x8f, 0x81, 0x8d, 0x81, 0x82,
+ 0x1a, 0x73, 0x79, 0x76, 0x51, 0x1e, 0xe6, 0xa,
+ 0x60, 0x67, 0x95, 0xcb, 0x72, 0x1f, 0x25, 0xf7,
+ 0x96, 0xf7, 0x4d, 0xf7, 0x68, 0x5, 0xbe, 0xb8,
+ 0xc0, 0xa5, 0x96, 0x1b, 0x9b, 0xfb, 0x64, 0x7b,
+ 0x7, 0xb4, 0x9e, 0x7d, 0x78, 0x7e, 0x85, 0x7b,
+ 0x7e, 0x7c, 0x1f, 0xfb, 0x25, 0xfb, 0x3b, 0x50,
+ 0xf7, 0x27, 0x5, 0x82, 0xa0, 0x86, 0x9e, 0x9b,
+ 0x1a, 0xa4, 0xa1, 0x9b, 0xbb, 0x1e, 0x9b, 0xfb,
+ 0x9c, 0x7b, 0x7, 0xc2, 0xa2, 0x76, 0x3f, 0xa9,
+ 0x1f, 0xe5, 0xfb, 0x77, 0xfb, 0x32, 0xfb, 0x4c,
+ 0x7d, 0x7c, 0x7a, 0x7a, 0x19, 0x53, 0x53, 0x62,
+ 0x72, 0x7a, 0x1b, 0xe, 0xf7, 0x5b, 0xcb, 0xa,
+ 0xcf, 0xa, 0x58, 0x6d, 0x99, 0xb3, 0x94, 0x8c,
+ 0x95, 0x8e, 0x97, 0x1f, 0xc1, 0xf7, 0x61, 0xf7,
+ 0x6f, 0xf7, 0xa2, 0x5, 0xb3, 0xab, 0xa9, 0xa0,
+ 0x93, 0x1b, 0xe8, 0xa, 0xaa, 0xa7, 0x7d, 0x72,
+ 0x83, 0x89, 0x83, 0x87, 0x81, 0x1f, 0x7a, 0x64,
+ 0xfb, 0x2, 0xfb, 0x16, 0x5e, 0x53, 0x73, 0xe7,
+ 0x6a, 0xf5, 0x85, 0xa5, 0x8, 0x89, 0x92, 0x8b,
+ 0x90, 0x91, 0x1a, 0xaa, 0xaf, 0x9c, 0xad, 0xcd,
+ 0xa, 0xaf, 0xa3, 0x82, 0x52, 0x9b, 0x1f, 0xd8,
+ 0xfb, 0xa1, 0x52, 0xfb, 0x5e, 0x5, 0x49, 0x78,
+ 0x55, 0x79, 0x67, 0x1b, 0xe, 0xf7, 0x5b, 0x8b,
+ 0xaf, 0xf8, 0xd9, 0xaf, 0x50, 0xa, 0xe, 0xe1,
+ 0xa, 0xa0, 0xf8, 0x6, 0x3, 0xa0, 0xfb, 0x2d,
+ 0x15, 0xf7, 0x50, 0x6, 0x92, 0xa6, 0x5, 0x5d,
+ 0x6, 0x6b, 0x68, 0x92, 0xb5, 0x97, 0x1f, 0xf7,
+ 0x34, 0xf9, 0x3a, 0x5, 0xa6, 0x91, 0xa3, 0x93,
+ 0xa6, 0x1b, 0xbf, 0x6, 0x92, 0xa6, 0x5, 0xfb,
+ 0x41, 0x6, 0xe, 0x3c, 0xfb, 0x13, 0x76, 0xf7,
+ 0x20, 0x76, 0xf9, 0x4b, 0x77, 0x1, 0x54, 0xf8,
+ 0xb, 0x3, 0xf7, 0x6b, 0xfb, 0x28, 0x15, 0xad,
+ 0x6, 0xfb, 0x41, 0xf9, 0xc2, 0x5, 0x66, 0x6,
+ 0xe, 0xe1, 0xa, 0x97, 0xf8, 0x6, 0x3, 0x9e,
+ 0xfb, 0x12, 0x15, 0x84, 0x70, 0x5, 0xf7, 0x41,
+ 0x6, 0xf7, 0x59, 0xf9, 0xc4, 0x5, 0xfb, 0x51,
+ 0x6, 0x84, 0x70, 0x5, 0xba, 0x6, 0xaa, 0xad,
+ 0x86, 0x60, 0x81, 0x1f, 0xfb, 0x35, 0xfd, 0x3a,
+ 0x5, 0x79, 0x87, 0x7d, 0x79, 0x65, 0x1b, 0xe,
+ 0xcc, 0xf9, 0x2e, 0x77, 0xa2, 0x76, 0x12, 0xf7,
+ 0x49, 0xf7, 0x41, 0x13, 0x60, 0xf7, 0xc1, 0x4,
+ 0x13, 0xa0, 0xcf, 0x6, 0xf7, 0x23, 0xf7, 0xb2,
+ 0xf7, 0x23, 0xfb, 0xb2, 0x5, 0xcf, 0x6, 0xfb,
+ 0x49, 0xf8, 0x1, 0x5, 0x4f, 0x6, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x94, 0x40, 0x15, 0x82, 0x59,
+ 0x5, 0xf8, 0x80, 0x6, 0x93, 0xbd, 0x5, 0xe,
+ 0x73, 0xf8, 0x95, 0x76, 0xf7, 0x40, 0x77, 0x1,
+ 0xf7, 0xac, 0xf8, 0x80, 0xb7, 0xa, 0xfb, 0x3,
+ 0xf7, 0x22, 0xc5, 0xa, 0x79, 0x92, 0x56, 0xa,
+ 0x9e, 0x7a, 0x80, 0xa, 0x80, 0xbc, 0xf8, 0x11,
+ 0xa1, 0x12, 0x9c, 0xdf, 0xf7, 0x58, 0xd4, 0x8b,
+ 0x99, 0x17, 0xf7, 0xd2, 0xf7, 0x1f, 0x61, 0xa,
+ 0x70, 0xb5, 0xb6, 0xad, 0xb0, 0xd5, 0xc7, 0x1e,
+ 0x13, 0xf8, 0x38, 0xa, 0x45, 0x8a, 0x7a, 0x4f,
+ 0x5, 0x89, 0x6, 0xa7, 0x6d, 0xaf, 0x5f, 0xa,
+ 0x36, 0xa, 0xa8, 0xa1, 0x6e, 0x5b, 0x29, 0x2f,
+ 0xfb, 0x62, 0x21, 0x70, 0x6a, 0x9d, 0xc0, 0x1e,
+ 0xe, 0x80, 0xa2, 0x7f, 0xa2, 0xf8, 0x5, 0xbc,
+ 0x91, 0xbc, 0xf7, 0x4f, 0x77, 0x12, 0xa2, 0xe1,
+ 0xf7, 0xab, 0xe0, 0x13, 0x7e, 0xf7, 0x1, 0xb8,
+ 0x15, 0xf4, 0xeb, 0xf7, 0x86, 0xf7, 0x2, 0xca,
+ 0x95, 0x55, 0x6c, 0x1e, 0x13, 0xbe, 0x37, 0x2c,
+ 0xfb, 0x67, 0xfb, 0x1d, 0x5c, 0x8b, 0xa5, 0x92,
+ 0x1e, 0x8c, 0xf8, 0xea, 0x15, 0xb8, 0x9c, 0x7e,
+ 0x76, 0x7b, 0x85, 0x75, 0x84, 0x73, 0x1f, 0xfb,
+ 0x1c, 0xfc, 0x89, 0x5, 0x87, 0x7, 0x75, 0xd8,
+ 0x6c, 0xc0, 0xf7, 0x2d, 0xf7, 0x3b, 0xf7, 0x41,
+ 0xf7, 0x32, 0xd4, 0x5a, 0xbb, 0x45, 0x31, 0x50,
+ 0x38, 0x57, 0x6a, 0x1e, 0x89, 0x8c, 0xad, 0xf7,
+ 0x5, 0xb5, 0xf7, 0x44, 0xa1, 0xdd, 0x19, 0x86,
+ 0x90, 0x57, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+ 0xe, 0xe2, 0x80, 0xaf, 0xf8, 0x1f, 0xa0, 0x1,
+ 0xa9, 0xe1, 0xf7, 0x72, 0xe2, 0x3, 0xf7, 0xf2,
+ 0xf5, 0x15, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+ 0x4e, 0x6d, 0xb8, 0xd8, 0xeb, 0xd0, 0xdb, 0xa,
+ 0x84, 0x89, 0x85, 0x88, 0x84, 0x1f, 0x87, 0x80,
+ 0x85, 0x7f, 0x7b, 0xa3, 0xa, 0xfb, 0x1e, 0xfb,
+ 0x2d, 0xfb, 0x21, 0xfb, 0x19, 0xde, 0x72, 0xcc,
+ 0xf4, 0xc5, 0xd6, 0xab, 0xa4, 0x1e, 0xe, 0x7f,
+ 0xbb, 0x6f, 0x76, 0xf8, 0x8a, 0xa2, 0xd3, 0x77,
+ 0x12, 0x9a, 0xe2, 0x13, 0xb8, 0xf1, 0xf7, 0x3,
+ 0x15, 0xe6, 0xea, 0xf7, 0x69, 0xf7, 0x4, 0xba,
+ 0x8b, 0x62, 0x74, 0xfb, 0x10, 0x29, 0xfb, 0x53,
+ 0x2c, 0x4e, 0x8b, 0xc5, 0x9c, 0x1e, 0xf7, 0x59,
+ 0x8e, 0x15, 0x83, 0x68, 0x87, 0x74, 0x74, 0x1a,
+ 0x13, 0x78, 0x76, 0x93, 0x72, 0xb2, 0xac, 0xcc,
+ 0xba, 0xce, 0xb6, 0x1e, 0x7f, 0x95, 0x5, 0x5b,
+ 0x61, 0x77, 0x74, 0x77, 0x1b, 0x81, 0x83, 0x92,
+ 0x9a, 0x9b, 0xf7, 0xd, 0xf8, 0x3e, 0xb6, 0xf7,
+ 0x42, 0x1f, 0x86, 0x90, 0x58, 0x80, 0x58, 0x84,
+ 0x58, 0x86, 0x19, 0x7a, 0x7, 0xb3, 0x9a, 0x7c,
+ 0x72, 0x79, 0x85, 0x74, 0x84, 0x72, 0x1f, 0x65,
+ 0xfb, 0x29, 0x89, 0x89, 0x5, 0xa1, 0x87, 0x84,
+ 0xa9, 0x53, 0x1b, 0x13, 0x38, 0xfb, 0xb, 0xfb,
+ 0x3e, 0xfb, 0x48, 0xfb, 0x2b, 0x1f, 0x13, 0xb8,
+ 0x57, 0xa0, 0x48, 0xde, 0xbd, 0xc3, 0x9d, 0xf7,
+ 0x2, 0xd3, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf8,
+ 0x14, 0xa2, 0x12, 0xaa, 0xe2, 0xf7, 0x78, 0xcd,
+ 0x17, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0xa0, 0xc1,
+ 0x5, 0xe5, 0xae, 0xd1, 0xd7, 0xc1, 0x1b, 0xa4,
+ 0x95, 0x6e, 0x76, 0x83, 0x82, 0xfb, 0xc, 0xfb,
+ 0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xf7, 0x52,
+ 0xa0, 0xed, 0xe2, 0xda, 0x1a, 0xb7, 0x6c, 0xad,
+ 0x58, 0x1e, 0x13, 0xa0, 0xfb, 0x21, 0xfb, 0x32,
+ 0x5c, 0xa, 0x1f, 0x73, 0xa, 0x61, 0x57, 0xa2,
+ 0xcf, 0x9f, 0x8c, 0x95, 0x90, 0xa0, 0x1f, 0xe,
+ 0x3c, 0xfb, 0x63, 0xa0, 0xf8, 0xd0, 0xab, 0xf7,
+ 0x82, 0xa1, 0x12, 0xf7, 0xed, 0xda, 0x13, 0xe0,
+ 0xa9, 0xf8, 0x16, 0x15, 0xe5, 0x6, 0x38, 0xfc,
+ 0x2e, 0x5, 0x63, 0x83, 0x71, 0xfb, 0xe, 0x4b,
+ 0x1b, 0x7f, 0x84, 0x93, 0x93, 0x8f, 0x8c, 0x8e,
+ 0x8d, 0x8e, 0x1f, 0x8e, 0x8f, 0x8e, 0x8f, 0x95,
+ 0x1a, 0xa4, 0x71, 0x97, 0x7d, 0x68, 0x8a, 0x63,
+ 0x88, 0x1e, 0x13, 0xf0, 0x65, 0xb7, 0x76, 0xad,
+ 0xf7, 0x9, 0xc4, 0xf7, 0x35, 0xf7, 0xe, 0xa6,
+ 0x1e, 0xce, 0xf7, 0xca, 0x5, 0xf7, 0x1, 0x6,
+ 0x91, 0xab, 0x5, 0xfb, 0x0, 0x6, 0xbe, 0x94,
+ 0xae, 0xf7, 0x4f, 0xdd, 0x1b, 0x98, 0x95, 0x87,
+ 0x83, 0x86, 0x89, 0x88, 0x89, 0x88, 0x1f, 0x88,
+ 0x87, 0x88, 0x85, 0x7f, 0x1a, 0x80, 0x91, 0x70,
+ 0xab, 0xa2, 0x9d, 0x9f, 0x9f, 0x9f, 0x7b, 0xb8,
+ 0x43, 0xfb, 0x12, 0x54, 0xfb, 0x43, 0x36, 0x71,
+ 0x1e, 0x2f, 0x6, 0xe, 0xfb, 0x52, 0xa1, 0xf7,
+ 0xd3, 0xa0, 0xf7, 0x8b, 0xa1, 0x12, 0x93, 0xcc,
+ 0xa2, 0xd9, 0xf7, 0x2b, 0xc7, 0x6a, 0xda, 0x13,
+ 0xfc, 0xf7, 0x11, 0xb2, 0x15, 0x37, 0x54, 0x6a,
+ 0x75, 0x52, 0x1a, 0x54, 0xc0, 0x53, 0xf7, 0x1,
+ 0xf7, 0x1d, 0xd9, 0xc8, 0xe0, 0xc6, 0x64, 0xaa,
+ 0x5f, 0x9f, 0x1e, 0x4f, 0xa6, 0x45, 0x93, 0xa9,
+ 0x1a, 0x98, 0xa1, 0xa6, 0x99, 0x1e, 0x98, 0x99,
+ 0x87, 0x98, 0x1b, 0x13, 0xfa, 0xe3, 0xea, 0xdd,
+ 0xd5, 0x9f, 0x88, 0x9f, 0x85, 0x9e, 0x1f, 0xbd,
+ 0x6, 0x13, 0xa8, 0xb2, 0x4e, 0x7, 0x7c, 0x60,
+ 0xaf, 0x50, 0x1b, 0x39, 0xfb, 0x8, 0x51, 0xfb,
+ 0x4, 0x46, 0xb6, 0x73, 0xaf, 0x7b, 0x1f, 0x69,
+ 0x74, 0x60, 0x6e, 0x6c, 0x1a, 0x78, 0x9a, 0x7f,
+ 0x97, 0x82, 0x1e, 0xa1, 0x80, 0x15, 0x92, 0x8e,
+ 0xed, 0x63, 0x9d, 0x82, 0x8, 0x13, 0xfc, 0x9e,
+ 0x82, 0xaf, 0x7a, 0x5e, 0x1a, 0x59, 0x5a, 0x5e,
+ 0x31, 0x7c, 0x2a, 0x9a, 0xdd, 0x8a, 0x1e, 0xb1,
+ 0x99, 0xbf, 0xc7, 0xa4, 0x1e, 0xa6, 0xf7, 0x72,
+ 0x15, 0x13, 0xa0, 0xce, 0xb7, 0xf1, 0xd8, 0x1e,
+ 0x13, 0xfa, 0xb5, 0x9a, 0x6e, 0x64, 0x38, 0x59,
+ 0x2b, 0x49, 0x5e, 0x7a, 0xac, 0xb8, 0x1f, 0xe,
+ 0xbe, 0xa, 0xf7, 0x86, 0x77, 0x12, 0xf8, 0x6,
+ 0xd9, 0x13, 0x70, 0x9e, 0x16, 0xd6, 0x6, 0xac,
+ 0xf7, 0x12, 0x99, 0xc2, 0xb9, 0xcf, 0x8, 0xa7,
+ 0x9e, 0xe0, 0xf7, 0x5, 0xbd, 0x1b, 0x9b, 0x98,
+ 0x81, 0x7a, 0x1f, 0x7e, 0x39, 0xfb, 0xb3, 0x71,
+ 0x1a, 0x13, 0xb0, 0x70, 0x98, 0x78, 0xab, 0xcd,
+ 0xb6, 0xc9, 0xbf, 0xaf, 0x1e, 0x13, 0x10, 0x7e,
+ 0x97, 0x5, 0x5b, 0x65, 0x73, 0x6c, 0x77, 0x1b,
+ 0x83, 0x83, 0x92, 0x97, 0x1f, 0x13, 0x38, 0xa0,
+ 0xdc, 0xf7, 0x94, 0xae, 0x1a, 0xcc, 0x5d, 0x92,
+ 0x75, 0x31, 0x25, 0xfb, 0x2e, 0x59, 0x6c, 0x1e,
+ 0x89, 0x8d, 0xf7, 0xa, 0xf8, 0x4b, 0x86, 0x90,
+ 0x57, 0x7f, 0x56, 0x82, 0x57, 0x85, 0x19, 0x7b,
+ 0x7, 0xb7, 0x9c, 0x94, 0x4f, 0x81, 0x7a, 0x51,
+ 0x83, 0x6d, 0x1f, 0xe, 0xd7, 0xa, 0xf8, 0xc4,
+ 0xf4, 0x12, 0xbc, 0xd6, 0xb0, 0xf2, 0x17, 0xf7,
+ 0x72, 0xf7, 0x6, 0x4a, 0xa, 0xe7, 0xf7, 0xe4,
+ 0x1f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x32, 0x79,
+ 0x6b, 0x1b, 0x13, 0xf0, 0x7b, 0x7, 0xc2, 0x8f,
+ 0x7c, 0x76, 0x1f, 0x6f, 0x40, 0x4b, 0xa, 0x41,
+ 0xf8, 0x86, 0x15, 0x6e, 0xa0, 0x85, 0xa, 0x76,
+ 0x73, 0x6e, 0x1e, 0xe, 0x3c, 0xfb, 0x63, 0xa2,
+ 0x74, 0xf2, 0xf9, 0x24, 0xf1, 0x12, 0xfb, 0x10,
+ 0xdc, 0xf7, 0x6d, 0xf1, 0x13, 0xb8, 0xd4, 0xf8,
+ 0x24, 0x15, 0xc7, 0x8c, 0x99, 0x8c, 0x61, 0x1a,
+ 0x33, 0xfb, 0xff, 0x5, 0x3e, 0x78, 0x72, 0x23,
+ 0x58, 0x1b, 0x82, 0x80, 0x8c, 0x95, 0x91, 0x8e,
+ 0x8e, 0x8e, 0x8f, 0x1f, 0x8e, 0x8f, 0x8f, 0x90,
+ 0x96, 0x1a, 0x13, 0x78, 0xa0, 0x77, 0x9a, 0x77,
+ 0x66, 0x87, 0x68, 0x87, 0x5a, 0xb8, 0x7c, 0xac,
+ 0xe4, 0xc5, 0xd6, 0xf7, 0x34, 0xb4, 0x1e, 0xf3,
+ 0xf8, 0x2f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x2b,
+ 0x79, 0x68, 0x1b, 0xf0, 0xf7, 0x4f, 0x15, 0x6f,
+ 0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7,
+ 0x74, 0xa2, 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e,
+ 0xe, 0xe2, 0x95, 0x76, 0xab, 0x76, 0xf9, 0x24,
+ 0x77, 0xba, 0x77, 0x12, 0x99, 0xf8, 0x53, 0x13,
+ 0x70, 0x99, 0x16, 0xd6, 0x6, 0xbb, 0xf7, 0x48,
+ 0xb5, 0xab, 0x95, 0x6d, 0xb1, 0x33, 0x97, 0x74,
+ 0x19, 0x13, 0xb0, 0x50, 0xa9, 0x9d, 0x74, 0xaa,
+ 0x1b, 0xb7, 0xa8, 0xb0, 0xd3, 0xb1, 0x1f, 0x7c,
+ 0x96, 0x5, 0x59, 0x6e, 0x81, 0x79, 0x75, 0x1b,
+ 0x71, 0x78, 0xb9, 0xf7, 0x3f, 0x43, 0x1f, 0xf7,
+ 0xe, 0xf7, 0x1e, 0xb5, 0xab, 0xb8, 0x1b, 0x13,
+ 0x38, 0x9b, 0xfb, 0x4b, 0x7b, 0x7, 0xa6, 0xa7,
+ 0x8b, 0x78, 0x6c, 0xfb, 0x14, 0x2b, 0x54, 0x60,
+ 0x1f, 0x89, 0x8d, 0xf7, 0xb, 0xf8, 0x59, 0x86,
+ 0x90, 0x5, 0x7f, 0x57, 0x36, 0x7c, 0x78, 0x1b,
+ 0x13, 0x0, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71,
+ 0x7c, 0x73, 0x3a, 0x82, 0x67, 0x1f, 0xe, 0x3c,
+ 0x8f, 0x76, 0xf9, 0x35, 0x77, 0xba, 0x77, 0x12,
+ 0xb4, 0xd8, 0x17, 0xf7, 0x78, 0xd3, 0xa, 0x7c,
+ 0x8b, 0x99, 0x91, 0x96, 0x93, 0xa6, 0x8d, 0x94,
+ 0x1f, 0xf7, 0x2b, 0xf8, 0xd7, 0x86, 0x90, 0x5,
+ 0x7f, 0x57, 0x3d, 0x7c, 0x71, 0x1b, 0x13, 0x90,
+ 0x7b, 0x7, 0xa5, 0xb1, 0x82, 0x71, 0x1f, 0x76,
+ 0xfb, 0x21, 0xfc, 0x94, 0x76, 0xb5, 0xa, 0xf8,
+ 0x1, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xbf,
+ 0x12, 0x13, 0x60, 0x97, 0x16, 0xd6, 0x6, 0xb0,
+ 0xf7, 0xe, 0x9f, 0xcd, 0xb3, 0xc7, 0x8, 0xb3,
+ 0xa6, 0xd7, 0xf0, 0xb8, 0x1b, 0x94, 0x98, 0x8b,
+ 0x70, 0x78, 0x46, 0xfb, 0x8a, 0x71, 0x2a, 0x1f,
+ 0xd6, 0x6, 0xa8, 0xf7, 0x5, 0x9c, 0xca, 0xbb,
+ 0xd7, 0x8, 0xbc, 0xaa, 0xd3, 0xe3, 0xb4, 0x1b,
+ 0x97, 0x94, 0x83, 0x7c, 0x1f, 0x77, 0x3d, 0xfb,
+ 0xab, 0x70, 0x1a, 0x13, 0xa0, 0x7d, 0x8b, 0x68,
+ 0xb5, 0xc3, 0xbd, 0xc3, 0xc5, 0xb4, 0x1e, 0x7c,
+ 0x97, 0x5, 0x5c, 0x65, 0x71, 0x6b, 0x78, 0x1b,
+ 0x7f, 0x88, 0x8e, 0x9c, 0x1f, 0x99, 0xdc, 0xf7,
+ 0xa0, 0xad, 0x1a, 0xb3, 0x74, 0xa6, 0x67, 0x49,
+ 0x3a, 0x33, 0xfb, 0x8, 0x45, 0x1e, 0x89, 0x8d,
+ 0x5, 0x99, 0xb3, 0xa2, 0xde, 0x99, 0x1a, 0xb5,
+ 0x76, 0xa2, 0x65, 0x37, 0x24, 0xfb, 0x2f, 0x5a,
+ 0x6d, 0x1e, 0x89, 0x8d, 0xc3, 0xf7, 0x5a, 0x88,
+ 0x8f, 0x56, 0x80, 0x56, 0x81, 0x55, 0x81, 0x19,
+ 0x13, 0x0, 0x7b, 0x7, 0xbc, 0x96, 0x75, 0x75,
+ 0x1f, 0x13, 0x60, 0x75, 0x3d, 0xfb, 0x9a, 0x7b,
+ 0x49, 0x1e, 0xe, 0xbe, 0xa, 0x12, 0xf7, 0xfd,
+ 0xdc, 0x13, 0x70, 0x89, 0xa, 0x13, 0x90, 0xc3,
+ 0xa, 0x13, 0xb0, 0x51, 0xa, 0x13, 0x0, 0x7b,
+ 0x7, 0xc1, 0x93, 0x76, 0x7c, 0x1f, 0x13, 0x70,
+ 0x76, 0x4a, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+ 0xe, 0x80, 0xa0, 0xf8, 0x2e, 0xa0, 0x92, 0xa,
+ 0xa6, 0xf7, 0x1b, 0x15, 0x38, 0xba, 0x4c, 0xf5,
+ 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x47, 0xf7, 0xf,
+ 0xcd, 0x6a, 0xdf, 0xfb, 0x8, 0xfb, 0x26, 0xfb,
+ 0x26, 0xfb, 0x33, 0xfb, 0x27, 0x1e, 0xdf, 0x6d,
+ 0x15, 0xf7, 0xa, 0xe4, 0xf7, 0x59, 0xf7, 0x4,
+ 0xbb, 0xa3, 0x5d, 0x57, 0x20, 0x3e, 0xfb, 0x61,
+ 0xfb, 0x6, 0x59, 0x6b, 0xb1, 0xc4, 0x1e, 0xe,
+ 0xfb, 0x48, 0x76, 0xf7, 0x67, 0x76, 0xf8, 0x2d,
+ 0xb6, 0x48, 0xa, 0x73, 0x1f, 0x89, 0x8d, 0xa6,
+ 0xe8, 0x5, 0x96, 0x8e, 0x88, 0x8d, 0x88, 0x1b,
+ 0xfb, 0x2f, 0x75, 0x5, 0x13, 0x80, 0x8d, 0x7b,
+ 0x5, 0xb9, 0x9e, 0x81, 0x79, 0x76, 0x29, 0xfb,
+ 0xfe, 0x70, 0xfb, 0x4, 0x1f, 0x6b, 0x83, 0x81,
+ 0xda, 0xa, 0x61, 0x75, 0x8b, 0xd1, 0x94, 0x1f,
+ 0x8e, 0x9f, 0x9b, 0xd3, 0x94, 0xad, 0x8, 0xe,
+ 0xfb, 0x50, 0x76, 0xf7, 0x5a, 0xc0, 0xf8, 0xd,
+ 0xa1, 0x1, 0xa4, 0xe1, 0xf7, 0xa1, 0x99, 0x3,
+ 0xf7, 0x2a, 0xfb, 0x55, 0x15, 0x7b, 0xf7, 0x85,
+ 0x9d, 0x7, 0x6e, 0x5c, 0x9a, 0xb5, 0x97, 0x1f,
+ 0xf7, 0x30, 0xf8, 0xc4, 0x5, 0x42, 0x6, 0x7d,
+ 0x5f, 0x5, 0x89, 0x6, 0xa5, 0x85, 0x7b, 0xac,
+ 0x53, 0x1b, 0xfb, 0x16, 0xfb, 0x35, 0xfb, 0x52,
+ 0xfb, 0x1d, 0x47, 0xa5, 0x52, 0xd8, 0xe4, 0xc5,
+ 0xdc, 0xd8, 0xc0, 0x1f, 0x8d, 0x89, 0x3b, 0xfb,
+ 0xa7, 0x5, 0x5e, 0x7d, 0x6c, 0x79, 0x54, 0x1b,
+ 0x64, 0xf7, 0xc9, 0x15, 0xf7, 0x8, 0xf7, 0x8,
+ 0xf7, 0x4f, 0xe8, 0xaa, 0xa8, 0x76, 0x5e, 0x29,
+ 0xfb, 0x0, 0xfb, 0x69, 0x22, 0x68, 0x76, 0xaa,
+ 0xb6, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf8, 0x4d,
+ 0x77, 0x1, 0xb8, 0xf8, 0x3, 0x3, 0xb8, 0x16,
+ 0xd7, 0x6, 0xb4, 0xf7, 0x19, 0x99, 0xb8, 0xb1,
+ 0xd3, 0x8, 0x9a, 0x93, 0xc7, 0xf7, 0x3, 0xaa,
+ 0x1b, 0x97, 0x8d, 0x83, 0x82, 0x8f, 0x1f, 0x82,
+ 0x90, 0x92, 0x81, 0xa1, 0x1b, 0x96, 0xaf, 0x8b,
+ 0xbf, 0xad, 0x72, 0x9a, 0x74, 0x4c, 0x39, 0xfb,
+ 0x6, 0x46, 0x70, 0x1f, 0x83, 0x77, 0x89, 0x8d,
+ 0xbc, 0xf7, 0x5b, 0x88, 0x8d, 0x5, 0x84, 0x5b,
+ 0x2f, 0x77, 0x7c, 0x1b, 0x7a, 0x7, 0x8d, 0x96,
+ 0x96, 0x8e, 0x96, 0x1b, 0xa3, 0x94, 0x7a, 0x73,
+ 0x73, 0x83, 0x6d, 0x84, 0x72, 0x1f, 0xe, 0xab,
+ 0x80, 0xa0, 0x89, 0x76, 0xf8, 0x43, 0xa2, 0x8c,
+ 0x77, 0x12, 0xf7, 0x1, 0xd4, 0xb9, 0xd7, 0x13,
+ 0x6c, 0xc2, 0xa, 0x9a, 0x9a, 0x86, 0x86, 0x9a,
+ 0x1f, 0x13, 0xac, 0x86, 0x9a, 0x99, 0x87, 0x9a,
+ 0x1b, 0xc3, 0xe8, 0xa4, 0xf7, 0x1, 0xb3, 0x70,
+ 0xb5, 0x6e, 0xb2, 0x1f, 0x6b, 0xb6, 0x69, 0xb3,
+ 0xac, 0x1a, 0xbc, 0xab, 0x94, 0xa1, 0xcc, 0xa8,
+ 0x49, 0x5a, 0x1e, 0x9b, 0x6, 0x13, 0x9c, 0xbb,
+ 0xa, 0x7d, 0x82, 0x8e, 0x8f, 0x80, 0x1f, 0x13,
+ 0xac, 0x90, 0x7e, 0x7d, 0x90, 0x73, 0x1b, 0x21,
+ 0x7d, 0x3b, 0x6c, 0x65, 0xa8, 0x60, 0xa9, 0x61,
+ 0x1f, 0xa9, 0x61, 0xa9, 0x62, 0x6a, 0xb4, 0xa,
+ 0xe, 0xd7, 0xa, 0xf8, 0x20, 0xab, 0xf7, 0x15,
+ 0x77, 0x1, 0xb0, 0xf7, 0x97, 0x3, 0xf7, 0x6a,
+ 0xf7, 0x9, 0x15, 0x6b, 0x72, 0x68, 0x5c, 0x77,
+ 0x1b, 0x86, 0x80, 0x8e, 0x97, 0x97, 0xa6, 0xeb,
+ 0xc7, 0xf7, 0x74, 0x1f, 0xe1, 0x6, 0x90, 0xab,
+ 0x5, 0x39, 0x6, 0xa9, 0xf7, 0x6, 0x5, 0x93,
+ 0x8d, 0x89, 0x92, 0x84, 0x1b, 0x82, 0x87, 0x84,
+ 0x86, 0x87, 0x1f, 0x6f, 0x68, 0x58, 0x53, 0x6b,
+ 0x7a, 0x8, 0x6b, 0x7a, 0x75, 0x91, 0x6d, 0x1a,
+ 0xd6, 0x6, 0x45, 0xfb, 0x9c, 0x5, 0x87, 0x7b,
+ 0x78, 0x4e, 0x7c, 0x1a, 0x6d, 0xa7, 0x81, 0x9f,
+ 0xbf, 0xb2, 0xb7, 0xd8, 0xbe, 0x1e, 0xe, 0x82,
+ 0xbe, 0x6b, 0x76, 0xf8, 0x58, 0xa9, 0xa, 0xd9,
+ 0x13, 0xa0, 0xf7, 0xe0, 0xf7, 0x77, 0x15, 0x13,
+ 0xb8, 0x4d, 0xa, 0x72, 0xa, 0x80, 0x8a, 0x96,
+ 0x90, 0x9a, 0x99, 0xb7, 0x90, 0x9f, 0x42, 0xa,
+ 0x84, 0x7c, 0x8f, 0x9e, 0x97, 0xaa, 0xf7, 0xc,
+ 0xc8, 0xf7, 0x86, 0x1f, 0x88, 0x8d, 0x5, 0x7f,
+ 0x59, 0x37, 0x7c, 0x7b, 0x1b, 0x13, 0x50, 0x5d,
+ 0xa, 0x13, 0x60, 0xa6, 0xa, 0xe2, 0x8e, 0x76,
+ 0xf8, 0x5f, 0x77, 0x12, 0xf7, 0x1c, 0xd2, 0xf7,
+ 0x3c, 0xbe, 0x17, 0xf7, 0x63, 0xd1, 0x15, 0x8a,
+ 0xc9, 0x83, 0xf7, 0x32, 0x69, 0xf7, 0x17, 0x8,
+ 0x9e, 0x86, 0x8a, 0x8c, 0x81, 0x87, 0xfb, 0x1,
+ 0x72, 0x7d, 0x1b, 0x7e, 0x7, 0xbc, 0xa2, 0x9e,
+ 0xfb, 0x4, 0xa0, 0x1f, 0x9b, 0x34, 0x91, 0xfb,
+ 0x4a, 0x6e, 0x1a, 0x7a, 0x8b, 0x7e, 0x94, 0x1e,
+ 0x13, 0x50, 0x9a, 0x9d, 0x9f, 0xd2, 0xcd, 0x1f,
+ 0xac, 0xae, 0xf7, 0x29, 0xf7, 0x46, 0xe7, 0x1a,
+ 0xb0, 0x73, 0xa5, 0x6a, 0x77, 0x7b, 0x7d, 0x7c,
+ 0x73, 0x93, 0x80, 0x94, 0x83, 0x1e, 0x97, 0x80,
+ 0x98, 0x85, 0x75, 0x1a, 0x59, 0x3b, 0xfb, 0xb,
+ 0x52, 0x50, 0x1e, 0xe, 0xf7, 0xca, 0x8e, 0x76,
+ 0xf8, 0x5e, 0x77, 0xa0, 0x77, 0x12, 0xf7, 0xd,
+ 0xd2, 0xf7, 0x38, 0xca, 0xf7, 0x49, 0xbb, 0x13,
+ 0xbc, 0xf7, 0x52, 0xf7, 0x15, 0x15, 0x9d, 0x84,
+ 0xf7, 0x13, 0x79, 0xf0, 0x1e, 0xc1, 0x81, 0x85,
+ 0x97, 0x85, 0x82, 0x29, 0x73, 0x77, 0x1b, 0x7d,
+ 0x7, 0xc4, 0x9c, 0x8e, 0x30, 0x94, 0x1f, 0x90,
+ 0x54, 0x9c, 0x3f, 0xfb, 0x2f, 0x1a, 0x7d, 0x8c,
+ 0x8a, 0x6a, 0x98, 0x1b, 0x9a, 0x92, 0xa0, 0xf7,
+ 0x40, 0xec, 0x1f, 0xb8, 0xda, 0xa3, 0xb5, 0x9d,
+ 0xab, 0x8, 0x8d, 0x6, 0xa8, 0xfb, 0xd0, 0x5,
+ 0x7b, 0x8c, 0x8b, 0x7d, 0x96, 0x1b, 0x96, 0x98,
+ 0x9e, 0xbb, 0xb3, 0x1f, 0xb9, 0xc1, 0xf7, 0x2f,
+ 0xf7, 0x57, 0xe2, 0x1a, 0xa8, 0x7b, 0xa6, 0x66,
+ 0x6e, 0x82, 0x79, 0x7a, 0x7a, 0x96, 0x82, 0x96,
+ 0x81, 0x1e, 0x96, 0x81, 0x95, 0x81, 0x79, 0x1a,
+ 0x57, 0x3e, 0x2a, 0x33, 0xfb, 0x1, 0x1e, 0x6b,
+ 0xf7, 0xfb, 0x5, 0x13, 0xdc, 0x8d, 0x8a, 0x8b,
+ 0x90, 0x84, 0x1b, 0x85, 0x88, 0x87, 0x86, 0x88,
+ 0x1f, 0xfb, 0x53, 0xfb, 0xc2, 0x5, 0xe, 0xe2,
+ 0x80, 0xc2, 0xf8, 0x21, 0x77, 0x1, 0x70, 0xf8,
+ 0x6e, 0x3, 0xf7, 0x62, 0xf7, 0x44, 0x15, 0xa9,
+ 0xfb, 0xc, 0x5, 0x56, 0x98, 0x9a, 0x7d, 0xa8,
+ 0x1b, 0xa2, 0xa8, 0x8b, 0xf7, 0x6, 0xd2, 0x1f,
+ 0x7d, 0x93, 0x5, 0x6d, 0x70, 0x77, 0x66, 0x76,
+ 0x1b, 0x77, 0x84, 0xa4, 0x9b, 0x87, 0x1f, 0x85,
+ 0xa4, 0x69, 0xf7, 0x1c, 0x9d, 0x1a, 0x8b, 0xcf,
+ 0xf7, 0xd, 0xa8, 0x96, 0x92, 0x87, 0x87, 0x92,
+ 0x1e, 0x87, 0x93, 0x93, 0x86, 0x97, 0x1b, 0xa3,
+ 0x95, 0x9e, 0x9d, 0xa3, 0x75, 0x97, 0x78, 0x57,
+ 0x5c, 0x4e, 0x39, 0x57, 0x1f, 0x80, 0xc2, 0x5,
+ 0xe3, 0x79, 0x7c, 0x8b, 0x75, 0x1b, 0x6b, 0x49,
+ 0x73, 0x82, 0x70, 0x1f, 0x8f, 0x7c, 0x5, 0x93,
+ 0xab, 0x99, 0x8e, 0x94, 0x1b, 0xa6, 0x97, 0x73,
+ 0x6c, 0x94, 0x1f, 0x8c, 0x86, 0xa5, 0xfb, 0xf,
+ 0x82, 0x1a, 0xfb, 0x17, 0x31, 0x71, 0x69, 0x7a,
+ 0x1b, 0x82, 0x82, 0x90, 0x90, 0x81, 0x1f, 0x90,
+ 0x82, 0x81, 0x8f, 0x80, 0x1b, 0x75, 0x7f, 0x79,
+ 0x7b, 0x73, 0x9b, 0x78, 0xac, 0xaa, 0x97, 0x96,
+ 0x9e, 0x9c, 0x1f, 0xad, 0xb0, 0xb5, 0xc1, 0xbb,
+ 0xcd, 0x8, 0xe, 0xe2, 0xfb, 0x4d, 0x76, 0xf9,
+ 0x1b, 0x77, 0x12, 0xf8, 0x1d, 0xc7, 0xa, 0xcf,
+ 0x7e, 0x5d, 0xf7, 0x11, 0x7e, 0x7e, 0xfb, 0x12,
+ 0x73, 0x86, 0x1b, 0x13, 0xe0, 0x98, 0xa, 0x9f,
+ 0x4c, 0xe2, 0xa, 0xae, 0xfb, 0x2f, 0x7a, 0xa,
+ 0x83, 0x85, 0x90, 0x91, 0x83, 0x1f, 0x93, 0x81,
+ 0x7f, 0x94, 0x7a, 0x96, 0xa, 0x70, 0xa, 0x76,
+ 0x96, 0x83, 0x97, 0x83, 0x1f, 0x9a, 0x82, 0x9b,
+ 0x84, 0x74, 0xa7, 0xa, 0xe, 0xab, 0x4f, 0x76,
+ 0xf8, 0x55, 0xc7, 0x1, 0xba, 0xa, 0xb1, 0xb2,
+ 0x71, 0x74, 0xb2, 0x1f, 0x78, 0xac, 0xad, 0x79,
+ 0xad, 0xaf, 0xa, 0x81, 0x8e, 0x83, 0x8e, 0x85,
+ 0x1f, 0x8f, 0x83, 0x8f, 0x85, 0x85, 0x1a, 0x7e,
+ 0x7b, 0x88, 0x7f, 0x81, 0x74, 0x8b, 0xac, 0x75,
+ 0x1e, 0xce, 0x5f, 0x50, 0xac, 0x6b, 0x1b, 0xf7,
+ 0xb6, 0xf7, 0xec, 0x5, 0xca, 0xa, 0x8e, 0x94,
+ 0xc3, 0xdd, 0x1e, 0xf7, 0x1c, 0x6, 0xe, 0xdd,
+ 0xa, 0xbe, 0xd6, 0x82, 0xd6, 0x13, 0xe0, 0xf7,
+ 0x47, 0xfb, 0x3a, 0x15, 0x6b, 0x93, 0x76, 0x9b,
+ 0xb9, 0x1a, 0x13, 0xd0, 0xb3, 0xcd, 0xf7, 0x61,
+ 0xb4, 0x1a, 0xb3, 0x69, 0x9b, 0x78, 0x93, 0x1e,
+ 0x8c, 0x8d, 0xcf, 0x9c, 0xa2, 0xb2, 0x9e, 0xd3,
+ 0x19, 0xb8, 0xf7, 0x3c, 0x5, 0xe6, 0xa3, 0xc0,
+ 0xac, 0xab, 0x1b, 0x8e, 0x96, 0x5, 0x2f, 0x50,
+ 0x7c, 0xfb, 0xc, 0x69, 0x1f, 0x5a, 0xfb, 0x3e,
+ 0x79, 0x4b, 0x77, 0x5e, 0x45, 0x79, 0x19, 0xb6,
+ 0x7d, 0x94, 0x78, 0x6d, 0x1a, 0x13, 0xe0, 0x52,
+ 0x49, 0xfb, 0x49, 0x5a, 0x1a, 0x54, 0xaa, 0x70,
+ 0xe9, 0x1e, 0xe, 0x39, 0xfb, 0x27, 0x76, 0xf7,
+ 0x3f, 0xe0, 0xa, 0x9a, 0xfb, 0x3c, 0x15, 0xb6,
+ 0x6, 0xf7, 0x6c, 0xf9, 0xd6, 0x5, 0x62, 0x6,
+ 0xe, 0xdd, 0xa, 0xf7, 0xa6, 0xd6, 0x42, 0xd6,
+ 0x13, 0xd0, 0x87, 0xfb, 0x3a, 0x15, 0x88, 0x80,
+ 0x5, 0xe7, 0xc9, 0x9a, 0xf7, 0xc, 0xac, 0x1f,
+ 0xba, 0xf7, 0x3e, 0x9c, 0xcb, 0xa0, 0xb8, 0xd1,
+ 0x9d, 0x19, 0x60, 0x99, 0x82, 0x9e, 0xa9, 0x1a,
+ 0x13, 0xe0, 0xc4, 0xcd, 0xf7, 0x49, 0xbc, 0x1a,
+ 0xc2, 0x6c, 0xa6, 0x2d, 0x1e, 0x88, 0x80, 0x5,
+ 0xa1, 0xaa, 0x73, 0x5d, 0x1f, 0x13, 0xd0, 0x63,
+ 0x49, 0xfb, 0x61, 0x62, 0x1a, 0x63, 0xad, 0x7b,
+ 0x9e, 0x83, 0x1e, 0x8a, 0x89, 0x47, 0x7a, 0x74,
+ 0x64, 0x78, 0x43, 0x19, 0x5e, 0xfb, 0x3c, 0x5,
+ 0x31, 0x73, 0x56, 0x69, 0x6b, 0x1b, 0xe, 0xf7,
+ 0x4c, 0xf7, 0x4f, 0xcb, 0x5c, 0x76, 0xd3, 0xcb,
+ 0x8f, 0x77, 0x12, 0xb3, 0xf8, 0x62, 0x13, 0x68,
+ 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3, 0xb0,
+ 0xb7, 0x1b, 0xb9, 0xa9, 0x7d, 0x7b, 0xa7, 0x1f,
+ 0x13, 0x98, 0x79, 0xac, 0xa9, 0x77, 0xbd, 0x1b,
+ 0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xbd,
+ 0x5, 0x68, 0x74, 0x72, 0x66, 0x63, 0x1b, 0x69,
+ 0x6c, 0x99, 0x9b, 0x6c, 0x1f, 0x13, 0x68, 0x9d,
+ 0x67, 0x66, 0x9f, 0x5f, 0x1b, 0x48, 0x67, 0x5f,
+ 0x61, 0x75, 0x1f, 0xe, 0xab, 0xfb, 0x4c, 0x76,
+ 0xf8, 0xd0, 0xf5, 0x1, 0xf7, 0x6c, 0xf5, 0x3,
+ 0xf7, 0x6c, 0xf8, 0x38, 0x15, 0x6e, 0xa3, 0x73,
+ 0xa8, 0xa8, 0xa3, 0xa3, 0xa8, 0xa8, 0x73, 0xa3,
+ 0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0x94, 0xfb,
+ 0x1a, 0x15, 0x51, 0xfb, 0x32, 0x58, 0xfb, 0xa,
+ 0x5f, 0xfb, 0x10, 0x8, 0x84, 0x78, 0x85, 0x7d,
+ 0x7c, 0x1a, 0x75, 0x9e, 0x76, 0x9d, 0xb5, 0x95,
+ 0x9c, 0xc0, 0x96, 0x1e, 0xa5, 0xf7, 0x10, 0xa2,
+ 0xf7, 0x18, 0xad, 0xf7, 0x35, 0x8, 0xe, 0x81,
+ 0xae, 0x80, 0x76, 0xf8, 0x3c, 0xa2, 0x12, 0xd8,
+ 0xe1, 0x13, 0xb0, 0xf7, 0x1d, 0xfb, 0x23, 0xb7,
+ 0xa, 0xba, 0xf7, 0x19, 0x5, 0xf7, 0x16, 0xb5,
+ 0xdb, 0xa5, 0xa5, 0x1f, 0x7b, 0x95, 0x5, 0x64,
+ 0x69, 0x57, 0x61, 0x57, 0x1b, 0x13, 0x70, 0x81,
+ 0x80, 0x8c, 0x8e, 0x81, 0x1f, 0xf7, 0x1d, 0xf8,
+ 0x1b, 0x5, 0x9c, 0x9d, 0x85, 0x7d, 0x82, 0x87,
+ 0x82, 0x87, 0x81, 0x1f, 0x88, 0x82, 0x87, 0x81,
+ 0x7f, 0x97, 0xa, 0xa9, 0x74, 0xbd, 0x3e, 0x1e,
+ 0xb5, 0xf7, 0xc, 0x5, 0x6d, 0x6, 0x61, 0xfb,
+ 0xc, 0x5, 0x13, 0x50, 0xfb, 0x12, 0xfb, 0x1f,
+ 0xfb, 0x32, 0xfb, 0x1b, 0x1f, 0x13, 0x70, 0xfb,
+ 0x6, 0xd3, 0x63, 0xaf, 0x1e, 0x9c, 0xbb, 0x15,
+ 0x71, 0x9e, 0x7e, 0xaf, 0xbe, 0x1a, 0xf2, 0xe2,
+ 0xf7, 0x3b, 0xdf, 0x1e, 0xe, 0x7b, 0xa1, 0x7f,
+ 0xd3, 0xa9, 0xa7, 0xf7, 0x61, 0xb5, 0xf7, 0xa2,
+ 0xa8, 0x12, 0x13, 0xb8, 0xf7, 0x34, 0xf7, 0x7,
+ 0x15, 0x96, 0x63, 0x8b, 0x8b, 0x76, 0x1b, 0x49,
+ 0x74, 0x5f, 0x79, 0x59, 0xa7, 0x77, 0xb2, 0xb7,
+ 0xa7, 0xaf, 0xa6, 0xa1, 0x1f, 0x4e, 0xd6, 0xb3,
+ 0x89, 0xaa, 0x1b, 0xf3, 0xad, 0xe5, 0x92, 0x8d,
+ 0x1f, 0x80, 0x94, 0x5, 0x13, 0x78, 0x70, 0x66,
+ 0x66, 0x84, 0x68, 0x1b, 0x56, 0x55, 0x9d, 0x9f,
+ 0x6a, 0x1f, 0xb8, 0xec, 0x91, 0xa4, 0xa4, 0xf2,
+ 0x8, 0xf7, 0x12, 0x6, 0x92, 0xb5, 0x5, 0xfb,
+ 0xf, 0x6, 0x9d, 0xed, 0x96, 0xc9, 0xa3, 0xc2,
+ 0x8, 0xa1, 0x95, 0x9b, 0xac, 0xb4, 0x1b, 0xa2,
+ 0x97, 0x7e, 0x6c, 0x8f, 0x1f, 0x6d, 0x8e, 0x93,
+ 0x7d, 0xa4, 0x1b, 0x9e, 0x9f, 0x93, 0xad, 0xb1,
+ 0x6b, 0xb0, 0x50, 0xfb, 0x3e, 0x56, 0xfb, 0x76,
+ 0x42, 0x82, 0x1f, 0xfb, 0x2, 0x6, 0x82, 0x61,
+ 0x5, 0xf7, 0x5, 0x6, 0x61, 0xfb, 0x94, 0x15,
+ 0x13, 0xb8, 0x6c, 0x83, 0x67, 0x71, 0x73, 0x1b,
+ 0x69, 0x7f, 0xa0, 0x9b, 0x90, 0x8e, 0xb3, 0xbd,
+ 0xa5, 0x99, 0x81, 0x7c, 0xa0, 0x1f, 0xe, 0xf7,
+ 0x18, 0xc4, 0xf7, 0xa4, 0xc4, 0x1, 0xc4, 0xc8,
+ 0xf7, 0x9c, 0xc8, 0x3, 0xf7, 0xa, 0xf7, 0xda,
+ 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0xd6, 0xc3, 0x4c,
+ 0x43, 0x41, 0x53, 0x4c, 0x40, 0x3f, 0x52, 0xca,
+ 0xd5, 0x1e, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3,
+ 0x5, 0x73, 0xa5, 0xb9, 0x7f, 0xb7, 0x1b, 0xb6,
+ 0xb5, 0x97, 0xa3, 0xa4, 0x1f, 0xe4, 0x33, 0xb6,
+ 0xb8, 0x34, 0xe2, 0x5, 0xa2, 0xa6, 0x97, 0xb6,
+ 0xb6, 0x1a, 0xb6, 0x80, 0xb6, 0x73, 0xa6, 0x1e,
+ 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5, 0xa3,
+ 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f, 0x7f,
+ 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60, 0xe3,
+ 0x32, 0x5, 0x73, 0x71, 0x7f, 0x5f, 0x5f, 0x1a,
+ 0x60, 0x97, 0x60, 0xa3, 0x71, 0x1e, 0x33, 0x34,
+ 0x5, 0xe, 0xa0, 0x76, 0xf7, 0x4a, 0xb3, 0xe5,
+ 0xb3, 0xf7, 0xc1, 0x77, 0x1, 0xbf, 0x16, 0xf7,
+ 0xb1, 0x9b, 0x6, 0x53, 0x6a, 0xa0, 0xb7, 0x91,
+ 0x8c, 0x91, 0x8d, 0x91, 0x1f, 0x92, 0xa7, 0x8f,
+ 0x96, 0x99, 0xb7, 0x8, 0xf7, 0x48, 0x6, 0x97,
+ 0xb3, 0x5, 0xfb, 0x48, 0x6, 0xa3, 0xdd, 0x91,
+ 0x93, 0x5, 0xf7, 0x3e, 0x6, 0x97, 0xb3, 0x5,
+ 0xfb, 0x2b, 0x6, 0xf7, 0x32, 0xf7, 0x74, 0x5,
+ 0xb3, 0xab, 0xaa, 0xa0, 0x95, 0x1b, 0xe8, 0xa,
+ 0xa8, 0xab, 0x7c, 0x74, 0x84, 0x89, 0x83, 0x87,
+ 0x83, 0x1f, 0x77, 0x64, 0x35, 0xfb, 0x1a, 0x5c,
+ 0x53, 0x72, 0xe7, 0x61, 0xf5, 0x86, 0xa5, 0x8,
+ 0x89, 0x95, 0x8a, 0x94, 0x93, 0x1a, 0xaa, 0x9f,
+ 0x93, 0xbf, 0xcd, 0xa, 0xa3, 0xb7, 0x8d, 0x47,
+ 0x9f, 0x1f, 0xd4, 0xfb, 0x6f, 0x5, 0xfb, 0x20,
+ 0x6, 0x7f, 0x63, 0x5, 0xf7, 0x37, 0x6, 0x8e,
+ 0x81, 0x74, 0x3b, 0x5, 0xfb, 0x38, 0x6, 0x7f,
+ 0x63, 0x5, 0xf7, 0x39, 0x6, 0x73, 0x39, 0x5,
+ 0x48, 0x77, 0x50, 0x7a, 0x6a, 0x1b, 0xe, 0x39,
+ 0x8e, 0xe0, 0xa, 0xf7, 0x36, 0xf8, 0x1c, 0x15,
+ 0xb3, 0x6, 0xdd, 0xf7, 0xa6, 0x5, 0x65, 0x6,
+ 0xfb, 0x5d, 0xfd, 0x40, 0x15, 0xb5, 0x6, 0xd5,
+ 0xf7, 0x93, 0x5, 0x5e, 0x6, 0xe, 0xfb, 0x29,
+ 0xa0, 0xf7, 0x78, 0xa0, 0xf7, 0x9f, 0xa0, 0xe8,
+ 0xf7, 0x38, 0x7c, 0xa0, 0x12, 0xc0, 0xf2, 0x49,
+ 0xc4, 0xb0, 0xc8, 0xb5, 0xc5, 0xab, 0xc5, 0x13,
+ 0xed, 0xc0, 0xf7, 0xae, 0xf3, 0x15, 0x8d, 0x8e,
+ 0x5, 0x86, 0x96, 0x90, 0x89, 0xa0, 0x1b, 0xcf,
+ 0xb9, 0xc2, 0xd1, 0xc5, 0x70, 0xb3, 0x7d, 0x9c,
+ 0x1f, 0xfb, 0xf, 0xf7, 0x2a, 0x5, 0x7c, 0x9e,
+ 0x80, 0xa3, 0xa7, 0x1a, 0xca, 0xba, 0xa0, 0xbb,
+ 0xac, 0xa3, 0x7c, 0x7b, 0x81, 0x80, 0x82, 0x82,
+ 0x7f, 0x1e, 0x83, 0x81, 0x85, 0x80, 0x7b, 0x1a,
+ 0x13, 0xf3, 0xc0, 0x79, 0x98, 0x71, 0xac, 0xb6,
+ 0x94, 0xb7, 0xa0, 0xc0, 0x5c, 0xb9, 0x38, 0x41,
+ 0x42, 0x61, 0x37, 0x5e, 0xa3, 0x60, 0xb6, 0x58,
+ 0x1e, 0x89, 0x88, 0x5, 0x95, 0x76, 0x70, 0x8c,
+ 0x86, 0x1b, 0x55, 0x57, 0x5a, 0x3d, 0x60, 0xa4,
+ 0x56, 0xb9, 0x56, 0x1f, 0xd7, 0x34, 0x5, 0xb6,
+ 0x5a, 0x92, 0x76, 0x6f, 0x1a, 0x5a, 0x66, 0x63,
+ 0x47, 0x67, 0x6b, 0x9e, 0x9c, 0x95, 0x95, 0x92,
+ 0x95, 0x94, 0x1e, 0x13, 0xed, 0xc0, 0x96, 0x95,
+ 0x96, 0x97, 0xa4, 0x1a, 0xad, 0x73, 0x95, 0x75,
+ 0x52, 0x8b, 0x51, 0x80, 0x5c, 0xba, 0x51, 0xe7,
+ 0xd5, 0xda, 0xbe, 0xdf, 0xbe, 0x76, 0xa5, 0x61,
+ 0xc1, 0x1e, 0x13, 0xeb, 0xc0, 0xfb, 0x1b, 0xf7,
+ 0x6e, 0x15, 0xb5, 0xae, 0xa3, 0xa9, 0xa9, 0xa6,
+ 0x80, 0x4a, 0xbe, 0x1e, 0xbf, 0x49, 0x90, 0x6e,
+ 0x71, 0x1a, 0x58, 0x5f, 0x78, 0x75, 0x52, 0x20,
+ 0xf7, 0x17, 0xd1, 0x1e, 0xe, 0x73, 0xf8, 0x90,
+ 0xed, 0x1, 0xf6, 0xc6, 0xa, 0x3, 0xf6, 0xf8,
+ 0xc1, 0x23, 0xa, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+ 0x4, 0x9f, 0xf7, 0xef, 0x9f, 0xf0, 0xb5, 0x1,
+ 0xb4, 0xc2, 0xea, 0xd8, 0xf7, 0x89, 0x9b, 0xf7,
+ 0x1b, 0xc2, 0x3, 0xb4, 0xf7, 0xd7, 0x15, 0xfb,
+ 0x51, 0xf7, 0x29, 0xfb, 0x2c, 0xf7, 0x54, 0xf7,
+ 0x52, 0xf7, 0x27, 0xf7, 0x2c, 0xf7, 0x51, 0xf7,
+ 0x51, 0xfb, 0x27, 0xf7, 0x2e, 0xfb, 0x52, 0xfb,
+ 0x54, 0xfb, 0x29, 0xfb, 0x2e, 0xfb, 0x51, 0x1e,
+ 0xc2, 0x16, 0xf7, 0x33, 0xf7, 0x11, 0xf7, 0x22,
+ 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x21,
+ 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb, 0x20,
+ 0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x12, 0xf7, 0x20,
+ 0xf7, 0x33, 0x1e, 0xf8, 0x47, 0x42, 0x15, 0x5e,
+ 0x78, 0x66, 0x5a, 0x49, 0x1b, 0x26, 0x62, 0xd7,
+ 0xf3, 0x8c, 0x1f, 0xeb, 0x8c, 0xb5, 0xd2, 0xe8,
+ 0x1b, 0xd8, 0xa6, 0x5d, 0x61, 0x90, 0x1f, 0x9b,
+ 0xd0, 0x6, 0x93, 0x86, 0x93, 0x7b, 0x90, 0x1e,
+ 0x93, 0x71, 0x72, 0x95, 0x59, 0x1b, 0xfb, 0x2a,
+ 0x49, 0xfb, 0x1, 0x39, 0xfb, 0x20, 0xea, 0x53,
+ 0xf7, 0x6, 0xb9, 0xb2, 0x95, 0x92, 0x9e, 0x1f,
+ 0x9b, 0x8f, 0x94, 0x8e, 0x8c, 0x97, 0x9c, 0xd9,
+ 0x18, 0xe, 0x3a, 0xf8, 0x2a, 0xad, 0xf7, 0x80,
+ 0x77, 0x12, 0xb5, 0xd4, 0xf7, 0x26, 0xaf, 0x13,
+ 0xe0, 0xf7, 0x87, 0xf8, 0x7a, 0x15, 0x80, 0x70,
+ 0x88, 0x7e, 0x7d, 0x1a, 0x81, 0x90, 0x7b, 0xa6,
+ 0xa7, 0xa1, 0xa1, 0xb7, 0xb2, 0x1e, 0x13, 0x70,
+ 0x84, 0x95, 0x5, 0x6f, 0x71, 0x7e, 0x80, 0x84,
+ 0x1b, 0x86, 0x8e, 0x9a, 0x99, 0x8e, 0x1f, 0x13,
+ 0xe0, 0x90, 0xa9, 0xba, 0xf7, 0x3a, 0x8d, 0x92,
+ 0x56, 0x8a, 0x18, 0x7f, 0x64, 0x5, 0x89, 0x6,
+ 0x9b, 0x89, 0x7a, 0xa4, 0x65, 0x1b, 0x35, 0x27,
+ 0xfb, 0x3, 0x33, 0x79, 0x92, 0x56, 0xd1, 0xb8,
+ 0xac, 0x9d, 0xca, 0xb7, 0x1f, 0xfb, 0x12, 0x89,
+ 0x15, 0xbd, 0xcc, 0xf7, 0xf, 0xd2, 0x98, 0x90,
+ 0x81, 0x64, 0x87, 0x1e, 0x5a, 0x86, 0x57, 0xfb,
+ 0xc, 0x4a, 0x1b, 0x83, 0x77, 0x95, 0xae, 0x1f,
+ 0xe, 0xce, 0xa, 0xc0, 0xf7, 0x6c, 0x68, 0xa,
+ 0x93, 0x78, 0xbb, 0x75, 0xbd, 0x1f, 0x81, 0xa2,
+ 0x80, 0xa3, 0x81, 0x9e, 0xa1, 0xa2, 0x9e, 0x9f,
+ 0x9b, 0x9c, 0x8, 0xd6, 0xdc, 0x99, 0xa2, 0x99,
+ 0x69, 0xa, 0xf7, 0x36, 0x82, 0x68, 0xa, 0x93,
+ 0x76, 0xc2, 0x73, 0xc0, 0x1f, 0x82, 0x9f, 0x82,
+ 0x9e, 0x82, 0x9c, 0xa2, 0xa3, 0x9f, 0xa0, 0x9c,
+ 0x9d, 0x8, 0xd4, 0xd9, 0x98, 0xa2, 0x99, 0x69,
+ 0xa, 0xe, 0xf7, 0xd2, 0xf7, 0x15, 0x76, 0xf7,
+ 0x84, 0xb1, 0x12, 0xf8, 0x92, 0xcf, 0x6d, 0xb5,
+ 0x13, 0xe0, 0xe1, 0xf7, 0xf0, 0x15, 0x13, 0xd0,
+ 0xf8, 0x62, 0xfb, 0x84, 0xb5, 0xf7, 0xaa, 0xfc,
+ 0x8c, 0x6, 0xe, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+ 0xe, 0x9a, 0x7c, 0xf7, 0x35, 0xfb, 0x35, 0xf7,
+ 0x47, 0xfb, 0x3e, 0xf7, 0x3e, 0xf7, 0x3b, 0xf7,
+ 0x42, 0x51, 0xb5, 0x71, 0xb5, 0x12, 0xb4, 0xc2,
+ 0x5f, 0xc2, 0xf7, 0x36, 0xcb, 0xf3, 0xce, 0x4e,
+ 0xce, 0xf7, 0x2e, 0xc2, 0x13, 0x92, 0x74, 0xf7,
+ 0xe1, 0xf7, 0xd9, 0x15, 0x13, 0x94, 0x74, 0xf7,
+ 0x3b, 0xb4, 0x7, 0x13, 0x92, 0x6c, 0xb1, 0xaa,
+ 0x78, 0x52, 0x56, 0x78, 0x65, 0x5a, 0x1f, 0x13,
+ 0x92, 0xb4, 0xfb, 0xe2, 0x16, 0xfb, 0x51, 0xf7,
+ 0x29, 0xfb, 0x2e, 0xf7, 0x54, 0xf7, 0x52, 0xf7,
+ 0x27, 0xf7, 0x2f, 0xf7, 0x51, 0x1e, 0x13, 0x91,
+ 0x74, 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2b, 0xfb,
+ 0x52, 0x1e, 0x13, 0x92, 0xb4, 0xfb, 0x54, 0xfb,
+ 0x29, 0xfb, 0x2c, 0xfb, 0x51, 0x1f, 0xc2, 0x16,
+ 0x13, 0x91, 0x74, 0xf7, 0x33, 0xf7, 0x11, 0xf7,
+ 0x20, 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb,
+ 0x1e, 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb,
+ 0x23, 0xfb, 0x31, 0x1e, 0x13, 0x92, 0xb4, 0xfb,
+ 0x34, 0xfb, 0x12, 0xf7, 0x22, 0xf7, 0x33, 0x1f,
+ 0xf7, 0x11, 0xfb, 0x47, 0x15, 0xf7, 0x34, 0x6,
+ 0x13, 0xc2, 0x74, 0x9a, 0x7, 0x59, 0x90, 0x8d,
+ 0x8b, 0xb6, 0x1a, 0x13, 0xa2, 0x74, 0xed, 0xba,
+ 0x7, 0x2e, 0xca, 0xa4, 0x47, 0xab, 0x1b, 0xca,
+ 0x6, 0x13, 0x8a, 0x74, 0x94, 0x7, 0x78, 0x99,
+ 0x6d, 0xad, 0x71, 0xaf, 0x52, 0xd9, 0x18, 0x13,
+ 0xc2, 0x6c, 0xb8, 0x9a, 0xad, 0xb1, 0xbe, 0x1a,
+ 0xc9, 0x54, 0xa7, 0x50, 0x1e, 0xfb, 0x43, 0x7c,
+ 0x6, 0xbc, 0x86, 0x8a, 0x8c, 0x5f, 0x1a, 0xfb,
+ 0x83, 0x7, 0x60, 0x8c, 0x8b, 0x5a, 0x86, 0x1e,
+ 0xe, 0x73, 0xf8, 0xa8, 0xbe, 0x1, 0xee, 0xf7,
+ 0xcc, 0x3, 0xee, 0xf8, 0xa8, 0x15, 0xf7, 0xbf,
+ 0x6, 0x98, 0xbe, 0x5, 0xfb, 0xbf, 0x6, 0xe,
+ 0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1,
+ 0xf0, 0xb2, 0xf7, 0x64, 0xb2, 0x3, 0xf7, 0x20,
+ 0xf8, 0xab, 0x15, 0xc5, 0xb9, 0xbc, 0xc5, 0xc5,
+ 0xb9, 0x5c, 0x51, 0x51, 0x5d, 0x54, 0x51, 0x51,
+ 0x5d, 0xc0, 0xc5, 0x1e, 0x64, 0x16, 0x3b, 0xca,
+ 0x4a, 0xdb, 0xdb, 0xca, 0xce, 0xdb, 0xdb, 0x4c,
+ 0xc6, 0x3b, 0x3b, 0x4c, 0x4e, 0x3b, 0x1e, 0xe,
+ 0xf7, 0xd2, 0x8b, 0xce, 0xf7, 0x69, 0xcf, 0x54,
+ 0xb8, 0xf7, 0x3c, 0x77, 0x12, 0xf7, 0xc5, 0xcf,
+ 0x53, 0xb6, 0x13, 0xd8, 0xe1, 0x16, 0xf8, 0x8c,
+ 0xb5, 0xfc, 0x8c, 0x6, 0x13, 0xb8, 0xf7, 0x8f,
+ 0x4, 0x13, 0xb4, 0xf7, 0x7b, 0xfb, 0x3f, 0xb6,
+ 0xf7, 0x3f, 0xf7, 0x7a, 0xb8, 0xfb, 0x7a, 0xf7,
+ 0x3c, 0x60, 0xfb, 0x3c, 0xfb, 0x7b, 0x6, 0xe,
+ 0x52, 0xf7, 0xa3, 0xc0, 0xf7, 0xc1, 0xbe, 0x1,
+ 0xac, 0xf7, 0xa3, 0xc1, 0xa, 0x77, 0x7e, 0x60,
+ 0x1b, 0x29, 0x95, 0xa, 0xc2, 0x46, 0x79, 0x36,
+ 0x89, 0x75, 0xa, 0xe, 0x52, 0xf7, 0xa0, 0xb2,
+ 0x64, 0xd8, 0xf7, 0x24, 0x94, 0x82, 0xf7, 0x4f,
+ 0x6b, 0xab, 0x12, 0xf7, 0x82, 0xca, 0x6e, 0xce,
+ 0x13, 0x54, 0xf7, 0x11, 0xf8, 0x7d, 0x15, 0xc3,
+ 0xc4, 0x79, 0x37, 0x47, 0x4e, 0x77, 0x75, 0x7c,
+ 0x84, 0x95, 0x95, 0x83, 0x1f, 0x98, 0x81, 0x80,
+ 0x98, 0x70, 0x1b, 0x13, 0xac, 0x6c, 0x88, 0xa5,
+ 0xa, 0x7b, 0x93, 0x1f, 0x87, 0x8d, 0x5, 0x13,
+ 0x6a, 0xc9, 0xa, 0x66, 0x5a, 0x72, 0x67, 0x7b,
+ 0x1e, 0x83, 0xa, 0x73, 0xf8, 0x97, 0x76, 0xf7,
+ 0x3e, 0x77, 0x1, 0xf7, 0x48, 0xad, 0xa, 0xf7,
+ 0x33, 0xeb, 0x9f, 0xa, 0x9d, 0x9c, 0x9a, 0x1a,
+ 0x9d, 0x7d, 0x9c, 0x76, 0x80, 0x76, 0x7d, 0x9d,
+ 0xa, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5b, 0xc2,
+ 0xf8, 0x13, 0x77, 0x1, 0x6d, 0xf4, 0xf7, 0x99,
+ 0xde, 0x3, 0xd9, 0xc7, 0x15, 0x4f, 0x9d, 0xbf,
+ 0x81, 0xaa, 0x1b, 0xbe, 0xcc, 0xb9, 0xbe, 0xb2,
+ 0x1f, 0x8d, 0x6, 0x89, 0x81, 0x85, 0x77, 0x81,
+ 0x1a, 0x68, 0x9d, 0x75, 0xaf, 0xaf, 0xa9, 0x95,
+ 0xba, 0xb7, 0x1e, 0x8e, 0x94, 0x5, 0x76, 0x71,
+ 0x7b, 0x86, 0x7c, 0x1b, 0x67, 0x98, 0xb4, 0xa0,
+ 0x8f, 0x1f, 0xd9, 0xf7, 0xe4, 0x5, 0x33, 0x6,
+ 0x47, 0xfb, 0xc3, 0x5, 0x72, 0x7a, 0x53, 0x54,
+ 0x58, 0x1b, 0x4f, 0x77, 0xb8, 0xc1, 0x96, 0x1f,
+ 0xce, 0xf7, 0xb0, 0x5, 0x33, 0x6, 0x36, 0xfc,
+ 0xa, 0x84, 0x6b, 0x7f, 0x68, 0x7c, 0x6a, 0x19,
+ 0x7d, 0x6c, 0x73, 0x66, 0x5a, 0x1a, 0x72, 0x91,
+ 0x76, 0xa7, 0xcb, 0x92, 0xf7, 0x0, 0xaf, 0xb4,
+ 0x87, 0xb4, 0x8f, 0xb6, 0x1e, 0xe, 0xf7, 0x3a,
+ 0xfb, 0x57, 0x76, 0xf9, 0xe7, 0xa6, 0x1, 0xf7,
+ 0x17, 0xfb, 0x6c, 0x15, 0xaf, 0x6, 0xf7, 0x88,
+ 0xf9, 0xe7, 0x5, 0xe6, 0x6, 0xfb, 0x88, 0xfd,
+ 0xe7, 0x5, 0xae, 0x6, 0xf7, 0x88, 0xf9, 0xe7,
+ 0x5, 0xcc, 0x6, 0x93, 0xa6, 0x5, 0xfb, 0x7a,
+ 0x6, 0xfb, 0x8a, 0x5c, 0xfb, 0x44, 0x4c, 0xfb,
+ 0x4, 0xed, 0x7a, 0xe7, 0x1f, 0xe, 0x20, 0xf7,
+ 0x5b, 0xf7, 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3,
+ 0xd1, 0xf7, 0x92, 0x84, 0xa, 0x73, 0xfb, 0x6d,
+ 0xaf, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x0, 0xd5,
+ 0x3, 0xdc, 0x16, 0x4c, 0x21, 0x94, 0x83, 0x5,
+ 0x91, 0x96, 0x9b, 0x8e, 0x99, 0x1b, 0xa0, 0x9e,
+ 0x81, 0x74, 0x6f, 0x6b, 0x7c, 0x68, 0x78, 0x77,
+ 0x8f, 0x95, 0x7c, 0x1f, 0x7a, 0x6e, 0x5, 0x7e,
+ 0xa3, 0xaf, 0x83, 0xaf, 0x1b, 0xc6, 0xc4, 0xa2,
+ 0xcb, 0xb5, 0x67, 0xa4, 0x64, 0x80, 0x80, 0x8b,
+ 0x88, 0x81, 0x1f, 0xb7, 0xcd, 0x5, 0xe, 0x52,
+ 0xf7, 0xa3, 0x9b, 0xf7, 0x6, 0x76, 0xf7, 0xbc,
+ 0x77, 0x1, 0xb6, 0xf7, 0x7f, 0x3, 0xb6, 0xf7,
+ 0xa3, 0x15, 0xf7, 0x49, 0x9b, 0x6, 0x68, 0x7e,
+ 0x96, 0x9b, 0x9c, 0x96, 0xa4, 0x96, 0xae, 0x1f,
+ 0xdd, 0xf7, 0x9c, 0x5, 0x8e, 0x92, 0x8c, 0x90,
+ 0x8f, 0x1a, 0x8e, 0x89, 0x8d, 0x87, 0x83, 0x2e,
+ 0x78, 0x88, 0x6e, 0x1e, 0x78, 0x7, 0x8c, 0x9b,
+ 0x97, 0x8b, 0x93, 0x1b, 0x97, 0x91, 0x86, 0x82,
+ 0x83, 0x8a, 0x81, 0x88, 0x84, 0x1f, 0x4c, 0xfb,
+ 0x63, 0x73, 0x3b, 0x83, 0x84, 0x4f, 0x7b, 0x19,
+ 0xe, 0x5c, 0xf7, 0xb9, 0xa3, 0xe4, 0xa3, 0xf7,
+ 0x5d, 0xa1, 0x8c, 0xa1, 0x1, 0xce, 0xd4, 0xf7,
+ 0x29, 0xd4, 0x3, 0xce, 0xf8, 0x82, 0x15, 0xe3,
+ 0xe8, 0xe9, 0xef, 0xd8, 0xa4, 0x59, 0x63, 0x40,
+ 0x34, 0x22, 0x23, 0x43, 0x6b, 0xb0, 0xbe, 0x1e,
+ 0xd4, 0x81, 0x15, 0x6c, 0x97, 0x74, 0xa7, 0xcf,
+ 0xb4, 0xf7, 0xb, 0xbe, 0xa6, 0x84, 0xa6, 0x70,
+ 0x48, 0x5b, 0xfb, 0x4, 0x51, 0x1e, 0xe, 0xce,
+ 0xa, 0xc2, 0xf8, 0x1c, 0x3, 0xf7, 0xff, 0xf7,
+ 0x73, 0x15, 0x49, 0xa, 0xfb, 0x36, 0x16, 0x49,
+ 0xa, 0xe, 0xd9, 0xa, 0xf7, 0x10, 0x9b, 0xf8,
+ 0x19, 0x77, 0x12, 0xac, 0xf9, 0x53, 0x13, 0x68,
+ 0x67, 0xa, 0x13, 0xbc, 0x94, 0xa, 0x13, 0xa8,
+ 0xfb, 0xb2, 0xfb, 0x31, 0x8c, 0xa, 0xfc, 0xc9,
+ 0xfc, 0x29, 0x15, 0xf7, 0x49, 0x6, 0x13, 0x10,
+ 0x9b, 0x7, 0x13, 0x1c, 0x71, 0x74, 0x95, 0x9d,
+ 0x8d, 0x8b, 0x8d, 0xf4, 0xf7, 0xe4, 0x1f, 0x8d,
+ 0x92, 0x8d, 0x8f, 0x8f, 0x1a, 0x8e, 0x8a, 0x8e,
+ 0x86, 0xdc, 0xa, 0x8c, 0x9c, 0x97, 0x8b, 0x93,
+ 0x1b, 0xa7, 0x80, 0x72, 0x7d, 0x87, 0x1f, 0x32,
+ 0xfb, 0xa7, 0x85, 0x78, 0x71, 0x7f, 0x69, 0x87,
+ 0x19, 0xe, 0xf8, 0x1d, 0x8b, 0xc0, 0x61, 0x76,
+ 0xf8, 0x0, 0xbf, 0xf7, 0xa2, 0x77, 0x12, 0xad,
+ 0xf7, 0x83, 0xfb, 0x24, 0xbe, 0xf8, 0x8c, 0xcc,
+ 0x13, 0x76, 0xf7, 0x15, 0x81, 0x8c, 0xa, 0x13,
+ 0xba, 0xfb, 0x12, 0xfd, 0x38, 0xc1, 0xa, 0x81,
+ 0x7e, 0x60, 0x1b, 0xfb, 0x0, 0x95, 0xa, 0xc3,
+ 0x46, 0x79, 0x36, 0x88, 0x75, 0xa, 0xfc, 0x3c,
+ 0xf7, 0x91, 0x15, 0xf7, 0x48, 0x6, 0x13, 0x0,
+ 0x9b, 0x7, 0x13, 0x18, 0x72, 0x6e, 0x96, 0x9b,
+ 0x90, 0x1f, 0xc8, 0xf7, 0x5d, 0xba, 0xf7, 0x2d,
+ 0x88, 0x1a, 0x8e, 0x8d, 0x93, 0x84, 0xdc, 0xa,
+ 0xb0, 0x8c, 0x5, 0x99, 0x8f, 0x86, 0x82, 0x7e,
+ 0x89, 0x88, 0x2f, 0xfb, 0xb0, 0x1f, 0x85, 0x78,
+ 0x72, 0x7f, 0x69, 0x87, 0x8, 0xe, 0xd9, 0xa,
+ 0xf7, 0xea, 0xf7, 0x4f, 0x12, 0xf7, 0x6e, 0xca,
+ 0x6e, 0xce, 0x13, 0x78, 0x67, 0xa, 0x94, 0xa,
+ 0x13, 0xb8, 0xfb, 0xb1, 0xfb, 0x31, 0x8c, 0xa,
+ 0xfc, 0x82, 0xfb, 0x4f, 0x15, 0xc3, 0xc4, 0x7e,
+ 0x32, 0x47, 0x4e, 0x77, 0x75, 0x7a, 0x7f, 0x98,
+ 0x97, 0x7f, 0x1f, 0x96, 0x80, 0x80, 0x95, 0x7d,
+ 0x1b, 0x68, 0x8b, 0xa5, 0xa, 0x77, 0x95, 0x1f,
+ 0x13, 0x74, 0xc9, 0xa, 0x1e, 0x13, 0x4, 0x66,
+ 0x5a, 0x72, 0x67, 0x7b, 0x1f, 0x83, 0xa, 0xfb,
+ 0x88, 0xa1, 0x12, 0xa5, 0xd5, 0xf7, 0x2c, 0xcb,
+ 0x55, 0xf5, 0x13, 0xe0, 0xf7, 0xb0, 0xf7, 0xb1,
+ 0x15, 0x73, 0x26, 0x54, 0x5f, 0x60, 0x68, 0x8,
+ 0x26, 0x39, 0x6a, 0x6c, 0x45, 0x1a, 0x41, 0xc2,
+ 0x56, 0xeb, 0x1e, 0xd2, 0xcd, 0xb2, 0xd2, 0xa8,
+ 0x7c, 0xa7, 0x73, 0x81, 0x6d, 0x86, 0x6d, 0x80,
+ 0x8f, 0x81, 0x8f, 0x81, 0x1f, 0x8f, 0x81, 0x8e,
+ 0x81, 0x7f, 0x1a, 0x5c, 0x4a, 0x8b, 0x86, 0x42,
+ 0x84, 0xc6, 0xa4, 0xd6, 0xba, 0xba, 0xbc, 0xc1,
+ 0x1e, 0xba, 0xbf, 0xbb, 0xc6, 0x93, 0xea, 0x8,
+ 0x13, 0xd0, 0x64, 0xf7, 0x1b, 0x15, 0x6e, 0xa3,
+ 0x85, 0xa, 0x73, 0x73, 0x6e, 0x1e, 0xe, 0x88,
+ 0xa, 0x58, 0x16, 0x9b, 0xa, 0x5f, 0x7d, 0xa0,
+ 0xa3, 0x9d, 0x93, 0xa8, 0xcf, 0xf7, 0xa, 0x1f,
+ 0xf7, 0x70, 0x6, 0xa2, 0xfb, 0x18, 0x8b, 0x82,
+ 0x82, 0x1a, 0x66, 0x74, 0x74, 0x53, 0x27, 0xa,
+ 0xc7, 0xf8, 0x4e, 0xb7, 0xa, 0xfb, 0x3, 0xf7,
+ 0x27, 0xc5, 0xa, 0x79, 0x8d, 0x56, 0xa, 0x9e,
+ 0x7f, 0x80, 0xa, 0x88, 0xa, 0xf7, 0xd3, 0xf9,
+ 0x56, 0x7f, 0xa, 0xfc, 0xa3, 0xfd, 0xf1, 0xe7,
+ 0xa, 0x64, 0x78, 0x9f, 0xa3, 0x9e, 0x94, 0xa2,
+ 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x11, 0x8c,
+ 0x83, 0x82, 0x1a, 0x61, 0x78, 0x71, 0x4f, 0x27,
+ 0xa, 0xe, 0x5a, 0xa, 0xf7, 0x75, 0x77, 0x1,
+ 0x58, 0xf8, 0xfb, 0x3, 0xf7, 0x7f, 0x46, 0xa,
+ 0xfc, 0x4f, 0xfd, 0xfd, 0xe7, 0xa, 0x63, 0x79,
+ 0x9f, 0xa4, 0x9e, 0x94, 0xa1, 0x96, 0xa0, 0x81,
+ 0xa, 0xa3, 0xfb, 0x16, 0x8a, 0x82, 0x83, 0x1a,
+ 0x67, 0x71, 0x70, 0x56, 0x35, 0xa, 0x82, 0x68,
+ 0x7c, 0x19, 0xf7, 0x76, 0xf7, 0x8b, 0x4c, 0xa,
+ 0xe, 0x5a, 0xa, 0xdf, 0xac, 0xa, 0x13, 0xf4,
+ 0xf7, 0x83, 0xf9, 0x6d, 0x65, 0xa, 0x73, 0x97,
+ 0x96, 0x71, 0x1f, 0x13, 0xe8, 0x95, 0x73, 0x72,
+ 0x95, 0x71, 0x6c, 0xa, 0xfb, 0xb6, 0xfd, 0x6d,
+ 0xe7, 0xa, 0x64, 0x78, 0x9d, 0xa4, 0x9e, 0x94,
+ 0xa3, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x12,
+ 0x8c, 0x81, 0x84, 0x1a, 0x61, 0x70, 0x72, 0x57,
+ 0x27, 0xa, 0xe, 0x5a, 0xa, 0xd3, 0xed, 0x1,
+ 0xf7, 0x8a, 0xc6, 0xa, 0x3, 0x58, 0x16, 0x9b,
+ 0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, 0x94, 0x9f,
+ 0x96, 0xa1, 0x81, 0xa, 0xa1, 0xfb, 0xf, 0x8c,
+ 0x7f, 0x84, 0x1a, 0x60, 0x72, 0x72, 0x55, 0x27,
+ 0xa, 0xfb, 0xf, 0xf8, 0x8f, 0x23, 0xa, 0x5a,
+ 0xa, 0xae, 0xf7, 0x3a, 0xab, 0xa, 0xf7, 0x39,
+ 0x12, 0x58, 0xf7, 0x4f, 0xf7, 0x28, 0xad, 0x69,
+ 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x3a, 0x13, 0xf2,
+ 0x80, 0xf7, 0xb0, 0xf9, 0xa3, 0x15, 0x54, 0xb8,
+ 0x5e, 0xc2, 0x1e, 0x13, 0xe7, 0x20, 0xc2, 0xb8,
+ 0xb8, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13,
+ 0xf2, 0x80, 0x54, 0x5e, 0x5e, 0x54, 0x1f, 0xad,
+ 0x16, 0xb3, 0xa, 0x13, 0xeb, 0x40, 0xe5, 0xa,
+ 0xfc, 0x5, 0xfd, 0xa3, 0xe7, 0xa, 0x65, 0x77,
+ 0xa0, 0x9f, 0xa3, 0x94, 0x9f, 0x96, 0xa1, 0x81,
+ 0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, 0x1a,
+ 0x60, 0x72, 0x72, 0x55, 0x27, 0xa, 0xe, 0xf8,
+ 0xa8, 0x8b, 0xac, 0xf7, 0x5d, 0xb0, 0xc4, 0xe9,
+ 0xa, 0x1, 0xf9, 0x88, 0x9d, 0x3, 0x70, 0x16,
+ 0x9b, 0xa, 0x6e, 0x6a, 0x9b, 0xa2, 0xb2, 0xe4,
+ 0xe8, 0xad, 0xba, 0x1f, 0xf7, 0x52, 0x6, 0x5d,
+ 0xfb, 0x34, 0x7f, 0x63, 0x7b, 0x7f, 0x54, 0x85,
+ 0x19, 0x7b, 0xf8, 0x86, 0x7, 0xcb, 0xf7, 0x38,
+ 0x79, 0x90, 0x5, 0xfb, 0x3, 0x42, 0x49, 0x72,
+ 0xfb, 0x21, 0x1b, 0x6d, 0x6, 0x65, 0x81, 0x9f,
+ 0x9f, 0x9d, 0xba, 0xf7, 0x36, 0xa0, 0xd6, 0x1f,
+ 0xb3, 0x6, 0xeb, 0xa1, 0x84, 0x5d, 0x7b, 0x88,
+ 0x7a, 0x88, 0x7b, 0x1f, 0x9c, 0x87, 0xd0, 0xf7,
+ 0x7c, 0x79, 0x8f, 0x5, 0x2e, 0x60, 0x7c, 0x87,
+ 0xfb, 0x2d, 0x1b, 0xc8, 0xf7, 0x72, 0x5, 0xb0,
+ 0x95, 0x94, 0x8b, 0xc7, 0x1b, 0xf7, 0x4e, 0x81,
+ 0x76, 0x2a, 0x1f, 0x9c, 0x89, 0xac, 0xf7, 0x2d,
+ 0x5, 0xfc, 0x99, 0x7c, 0x6, 0xbd, 0x87, 0x99,
+ 0x8a, 0x72, 0x1a, 0x7d, 0x7a, 0x78, 0x7c, 0x79,
+ 0x1e, 0xfc, 0x16, 0xfc, 0x77, 0x71, 0x6b, 0x7a,
+ 0x77, 0x73, 0x85, 0x19, 0xf7, 0xa8, 0xf7, 0x93,
+ 0x15, 0xf7, 0x97, 0xf7, 0xde, 0x5, 0x91, 0x6,
+ 0x2f, 0xfb, 0xde, 0x5, 0xe, 0xf7, 0xca, 0xfb,
+ 0x58, 0x76, 0xf7, 0x5d, 0xb6, 0xd4, 0xa, 0x13,
+ 0xe8, 0xf7, 0x90, 0x21, 0x15, 0x93, 0x83, 0x5,
+ 0x91, 0x97, 0x9b, 0x8e, 0x9a, 0x1b, 0xa1, 0x9e,
+ 0x81, 0x74, 0x6e, 0x67, 0x7d, 0x67, 0x7a, 0x79,
+ 0xde, 0xa, 0xa3, 0xb0, 0x83, 0xaf, 0x1b, 0xc5,
+ 0xc4, 0xa3, 0xca, 0xb5, 0x67, 0xa4, 0x64, 0x80,
+ 0x81, 0x8b, 0x88, 0x80, 0x1f, 0xac, 0xbd, 0x5,
+ 0xf7, 0x1d, 0xde, 0xf4, 0xb5, 0xaf, 0x6f, 0xa,
+ 0x9d, 0x88, 0x5, 0x13, 0xd8, 0xb8, 0xa, 0x7f,
+ 0x76, 0x92, 0x91, 0x70, 0x1f, 0x13, 0xe8, 0x91,
+ 0x73, 0x6e, 0x90, 0x6a, 0xd5, 0xa, 0xfb, 0x4f,
+ 0xf7, 0x14, 0x3a, 0xf7, 0x5, 0x1f, 0xe, 0x8d,
+ 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x24, 0x9f,
+ 0xf7, 0x36, 0xa0, 0x3, 0x8b, 0xa, 0x68, 0x6d,
+ 0x98, 0xb2, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f,
+ 0x8d, 0x97, 0x99, 0x3c, 0xa, 0x7f, 0x80, 0xfb,
+ 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76, 0x2a,
+ 0x41, 0xa, 0xf8, 0x42, 0xf9, 0x44, 0xb7, 0xa,
+ 0xfb, 0x1, 0xf7, 0x22, 0xc5, 0xa, 0x77, 0x92,
+ 0x56, 0xa, 0xa0, 0x7a, 0x80, 0xa, 0x8d, 0xa,
+ 0xf7, 0x73, 0x77, 0x1, 0xf8, 0xda, 0xa0, 0x3,
+ 0xf7, 0xdd, 0xf9, 0x56, 0x9e, 0xa, 0xf7, 0x38,
+ 0xf0, 0x9f, 0xa, 0x98, 0x97, 0x47, 0xa, 0x7c,
+ 0x82, 0x9d, 0xa, 0xfc, 0x79, 0xfd, 0xf1, 0x34,
+ 0xa, 0xf7, 0x92, 0x8b, 0xac, 0xf7, 0xbb, 0xac,
+ 0xf7, 0x99, 0xac, 0x89, 0xbe, 0xd1, 0xa, 0xf8,
+ 0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0xf7, 0x98,
+ 0x46, 0xa, 0xfc, 0x36, 0xfd, 0xfd, 0x34, 0xa,
+ 0x8d, 0xa, 0xce, 0xed, 0x1, 0xf7, 0x9e, 0xc6,
+ 0xa, 0x3, 0x8a, 0x16, 0x32, 0xa, 0x7f, 0x80,
+ 0xfb, 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76,
+ 0x2a, 0x41, 0xa, 0xf7, 0x9f, 0xf9, 0x85, 0x23,
+ 0xa, 0x73, 0x99, 0xa, 0x83, 0x16, 0x2a, 0xa,
+ 0xf7, 0xbe, 0xf9, 0x44, 0x77, 0xa, 0x73, 0x99,
+ 0xa, 0xf7, 0x66, 0xf9, 0x56, 0x9e, 0xa, 0xf7,
+ 0x21, 0xee, 0x9f, 0xa, 0x9b, 0x99, 0x47, 0xa,
+ 0x79, 0x80, 0x9d, 0xa, 0xfb, 0xf2, 0xfd, 0xef,
+ 0x15, 0x2a, 0xa, 0xe, 0x73, 0x9a, 0xa, 0xbe,
+ 0xd1, 0xa, 0x83, 0xf8, 0x45, 0x3, 0xf7, 0x17,
+ 0x46, 0xa, 0xfb, 0xbc, 0xfd, 0xfd, 0x15, 0x2a,
+ 0xa, 0xe, 0x73, 0x87, 0xa, 0xe2, 0xed, 0x1,
+ 0xf7, 0x1d, 0xc6, 0xa, 0x3, 0x83, 0x16, 0x2a,
+ 0xa, 0xf7, 0x25, 0xf9, 0x85, 0x23, 0xa, 0xf8,
+ 0x1, 0x8b, 0xa9, 0xf7, 0xbc, 0xb5, 0xf7, 0x93,
+ 0xa9, 0x1, 0xf7, 0x58, 0xee, 0xf7, 0xba, 0xf7,
+ 0x3, 0x3, 0xb1, 0xa, 0xf4, 0x4d, 0xf7, 0x35,
+ 0xfb, 0x7a, 0x1f, 0xfb, 0xaa, 0x7b, 0x6, 0xc4,
+ 0x9d, 0x76, 0x6d, 0x7a, 0x87, 0x79, 0x86, 0x78,
+ 0x1f, 0x5d, 0xfb, 0x38, 0x5, 0x31, 0x6, 0x7f,
+ 0x61, 0x5, 0xe5, 0x6, 0x5d, 0xfb, 0x38, 0x5,
+ 0x26, 0x6f, 0x86, 0x5e, 0x48, 0x1b, 0xf7, 0x8a,
+ 0xf7, 0xca, 0x15, 0xf7, 0x2d, 0x6, 0x97, 0xb5,
+ 0x5, 0xfb, 0x2d, 0x6, 0xb8, 0xf7, 0x39, 0x5,
+ 0xc1, 0x9a, 0x8e, 0xaf, 0xcc, 0xb2, 0xa, 0x55,
+ 0x7a, 0x9b, 0xa5, 0xa2, 0x97, 0xaa, 0x95, 0xaf,
+ 0x1f, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf, 0x76,
+ 0xf9, 0x1e, 0xf7, 0x2f, 0xfb, 0x2c, 0x77, 0xee,
+ 0xc7, 0x56, 0xf2, 0x85, 0x77, 0x12, 0x13, 0x62,
+ 0x77, 0xe4, 0xa, 0x56, 0x7c, 0xa0, 0xab, 0x9c,
+ 0x90, 0x9e, 0x91, 0xa1, 0x1f, 0xf7, 0x0, 0xf8,
+ 0x26, 0x5, 0x8f, 0x6, 0x13, 0xa2, 0xf7, 0x78,
+ 0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x2c, 0xf8,
+ 0xad, 0xa2, 0xdb, 0x9c, 0xa2, 0xc3, 0x97, 0x19,
+ 0x13, 0x5a, 0xeb, 0xa, 0x7, 0x13, 0x62, 0x7b,
+ 0x7, 0xbd, 0x9b, 0x74, 0x6d, 0x78, 0x87, 0x76,
+ 0x85, 0x77, 0x1f, 0x29, 0xfc, 0x2, 0x5, 0x88,
+ 0x6, 0x13, 0x5a, 0xfb, 0x62, 0xf8, 0x83, 0x5,
+ 0xfb, 0x35, 0x6, 0x13, 0x62, 0x7b, 0x7, 0xbb,
+ 0xa0, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0x13, 0xfc,
+ 0x57, 0x76, 0x3f, 0x78, 0x6d, 0x54, 0x83, 0x19,
+ 0xf7, 0xbd, 0xf9, 0x5d, 0x60, 0xa, 0x9d, 0xa9,
+ 0x7f, 0x80, 0xa8, 0x1f, 0x13, 0x5a, 0x80, 0xa7,
+ 0xa6, 0x81, 0x71, 0xa, 0x77, 0x74, 0x96, 0x96,
+ 0x71, 0x1f, 0x13, 0x54, 0x95, 0x73, 0x71, 0x96,
+ 0x71, 0xd6, 0xa, 0xbf, 0xa, 0xf7, 0x66, 0xa8,
+ 0xa, 0xc7, 0xf7, 0x77, 0x24, 0xa, 0xf7, 0xd4,
+ 0xf8, 0x71, 0x77, 0xa, 0xbf, 0xa, 0xf7, 0x66,
+ 0xa8, 0xa, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa,
+ 0xfc, 0x95, 0xfd, 0xe, 0x24, 0xa, 0xe, 0xb6,
+ 0xa, 0xac, 0xf8, 0xf7, 0xb1, 0x6c, 0xac, 0x8b,
+ 0xb1, 0xf7, 0x3d, 0xa8, 0xa, 0xf7, 0xd5, 0x46,
+ 0xa, 0xfc, 0x36, 0xfd, 0x1a, 0x24, 0xa, 0xe,
+ 0xb6, 0xa, 0xac, 0xf8, 0xff, 0xac, 0xd0, 0xf2,
+ 0x88, 0x77, 0x12, 0x86, 0xa, 0x13, 0xec, 0xf7,
+ 0xcf, 0xf9, 0x6d, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+ 0x81, 0xa6, 0x1f, 0x7f, 0xa9, 0xa9, 0x7f, 0x9e,
+ 0x1b, 0x13, 0xdc, 0x43, 0xa, 0x78, 0x74, 0x96,
+ 0x96, 0x72, 0x1f, 0x13, 0xec, 0x96, 0x73, 0x70,
+ 0x95, 0x70, 0x6c, 0xa, 0xfb, 0x93, 0xfc, 0x8a,
+ 0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xb8,
+ 0xac, 0xf7, 0x14, 0xed, 0x12, 0xc7, 0xf4, 0xf8,
+ 0x8, 0xed, 0x62, 0xf4, 0x13, 0xf4, 0xc7, 0xf7,
+ 0x77, 0x24, 0xa, 0xf7, 0x40, 0xf8, 0xb2, 0x58,
+ 0xa, 0x13, 0xf8, 0x25, 0xa, 0xf7, 0xd2, 0xa8,
+ 0x76, 0xb4, 0x76, 0xf8, 0x56, 0x77, 0xb2, 0x77,
+ 0x12, 0xf7, 0x1e, 0xf8, 0x26, 0x13, 0x98, 0xf7,
+ 0x8, 0xc4, 0x15, 0xa7, 0x70, 0xf7, 0x57, 0xf7,
+ 0x53, 0x5, 0x13, 0x58, 0xf7, 0x57, 0xfb, 0x55,
+ 0xa7, 0xa8, 0xfb, 0x57, 0xf7, 0x56, 0xf7, 0x5c,
+ 0xf7, 0x5a, 0x5, 0x13, 0xa8, 0x6e, 0xa8, 0xfb,
+ 0x5b, 0xfb, 0x5a, 0xfb, 0x58, 0xf7, 0x58, 0x70,
+ 0x6e, 0xf7, 0x56, 0xfb, 0x58, 0x5, 0xe, 0xf8,
+ 0x1, 0x37, 0x76, 0xe2, 0xac, 0xf8, 0xfe, 0xac,
+ 0xc3, 0xa8, 0xa, 0xf7, 0x52, 0xd5, 0x15, 0x72,
+ 0xba, 0x8b, 0xe5, 0x98, 0x1a, 0xf7, 0x12, 0xf7,
+ 0x16, 0xf7, 0xaf, 0xf7, 0x3c, 0xaf, 0xa7, 0x81,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0xdf, 0xfc, 0xc7, 0x15,
+ 0xf7, 0xf7, 0xf8, 0xa6, 0x5, 0x9d, 0x6f, 0x91,
+ 0x39, 0x62, 0x1a, 0xfb, 0x1, 0xfb, 0xe, 0xfb,
+ 0xbf, 0xfb, 0x44, 0x65, 0x71, 0x97, 0x9c, 0x7a,
+ 0x1e, 0xfb, 0x26, 0xfb, 0x29, 0x15, 0xb7, 0x6,
+ 0xd5, 0xf7, 0x0, 0x5, 0x7e, 0xa9, 0xad, 0x83,
+ 0xa7, 0x1b, 0xae, 0xa, 0xf7, 0x84, 0xf7, 0x5d,
+ 0xed, 0x65, 0xcd, 0x53, 0xb2, 0x1f, 0xcb, 0xeb,
+ 0x5, 0x5f, 0x6, 0x57, 0x3d, 0x5, 0x9a, 0x6a,
+ 0x67, 0x92, 0x66, 0x1b, 0xfb, 0x47, 0xfb, 0x78,
+ 0xfb, 0x6e, 0xfb, 0x71, 0x21, 0xb5, 0x4b, 0xc0,
+ 0x68, 0x1f, 0xe, 0xaa, 0xa, 0x77, 0xf7, 0x83,
+ 0x77, 0xa3, 0x77, 0x12, 0xcc, 0xa, 0x13, 0xec,
+ 0xf7, 0x13, 0xf9, 0x11, 0x29, 0xa, 0xf8, 0x4,
+ 0xbe, 0xb7, 0xa, 0x20, 0xf7, 0x22, 0x5, 0x13,
+ 0xdc, 0xa2, 0x79, 0x75, 0x92, 0x56, 0xa, 0xa2,
+ 0x7a, 0x80, 0xa, 0xaa, 0xa, 0x77, 0xf7, 0x87,
+ 0x77, 0x1, 0xcc, 0xa, 0x3, 0xf8, 0x33, 0xf9,
+ 0x56, 0x5e, 0xa, 0xfc, 0x52, 0xfb, 0x74, 0x29,
+ 0xa, 0xe, 0xaa, 0xa, 0xbe, 0xd1, 0xa, 0xcc,
+ 0xa, 0x3, 0xf7, 0xc6, 0x46, 0xa, 0xfb, 0xe4,
+ 0xfb, 0x80, 0x29, 0xa, 0xe, 0xb6, 0xa, 0xb4,
+ 0xf8, 0xfa, 0xdf, 0xa, 0xf1, 0xe5, 0xf7, 0x48,
+ 0xc6, 0xa, 0x13, 0xce, 0xf7, 0x13, 0xf9, 0x11,
+ 0x3a, 0xa, 0x13, 0xbe, 0xeb, 0xa, 0x7, 0x13,
+ 0xce, 0x37, 0xa, 0x13, 0xbe, 0xd2, 0xa, 0x13,
+ 0xce, 0xf7, 0x89, 0xf7, 0x8, 0x15, 0x13, 0xbe,
+ 0x21, 0xa, 0xf7, 0x5b, 0x99, 0xa, 0xcf, 0xa,
+ 0x59, 0x69, 0x9c, 0xba, 0x92, 0x8c, 0x91, 0x8d,
+ 0x93, 0x1f, 0x91, 0xa7, 0x92, 0xa1, 0xb8, 0xf7,
+ 0x2f, 0xf7, 0x6f, 0xf7, 0xa2, 0x18, 0xab, 0xb3,
+ 0x96, 0x93, 0xa6, 0x98, 0x8, 0xe8, 0xa, 0xab,
+ 0xac, 0x86, 0x67, 0x62, 0xfb, 0x1f, 0xfb, 0x2c,
+ 0x5e, 0x53, 0x1f, 0x73, 0xe7, 0x6c, 0xf5, 0x85,
+ 0xa5, 0x8, 0x89, 0x95, 0x8b, 0x93, 0x92, 0x1a,
+ 0xa4, 0xaa, 0x98, 0xb0, 0x8e, 0xcd, 0xa, 0xa9,
+ 0xa7, 0x88, 0x4c, 0x9d, 0x1f, 0xd8, 0xfb, 0xa1,
+ 0x51, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x57, 0x79,
+ 0x66, 0x1b, 0xf7, 0xa6, 0xf9, 0x46, 0x9e, 0xa,
+ 0xf7, 0x3f, 0xf5, 0x9f, 0xa, 0x91, 0x92, 0x47,
+ 0xa, 0x83, 0x87, 0x9d, 0xa, 0xe, 0x7d, 0xa,
+ 0xf7, 0x3e, 0xb0, 0xf7, 0xad, 0xa9, 0x6d, 0xf7,
+ 0x39, 0x12, 0xf8, 0x66, 0xf2, 0x13, 0xe8, 0x8b,
+ 0x4, 0xf7, 0x89, 0x9b, 0x6, 0x55, 0x7e, 0x9d,
+ 0xa5, 0x96, 0x8e, 0x98, 0x8f, 0x99, 0x1f, 0xa0,
+ 0xdd, 0x5, 0x84, 0xae, 0xad, 0x88, 0xab, 0x1b,
+ 0xf7, 0x2d, 0xf7, 0x1, 0xdb, 0xf7, 0x8, 0xf7,
+ 0x2b, 0xfb, 0x3b, 0x8c, 0x5f, 0x1f, 0x53, 0x6,
+ 0x99, 0xc9, 0x94, 0xaf, 0xa6, 0x9b, 0xab, 0x90,
+ 0x19, 0x13, 0xd8, 0x9b, 0xfb, 0x82, 0x7b, 0x7,
+ 0xb5, 0x86, 0xa5, 0x7e, 0x66, 0x1a, 0x7d, 0x83,
+ 0x6d, 0x85, 0x74, 0x1e, 0xfb, 0x7, 0xfc, 0x33,
+ 0x79, 0x4b, 0x7b, 0x7f, 0x58, 0x83, 0x19, 0xf7,
+ 0x6b, 0xf7, 0x57, 0xd8, 0xa, 0x9c, 0xa9, 0x1b,
+ 0xf7, 0x2, 0xa9, 0x60, 0x41, 0xfb, 0x1f, 0x30,
+ 0x72, 0x38, 0x6f, 0x70, 0x8d, 0x8d, 0x75, 0x1f,
+ 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf3, 0xdb, 0xa1,
+ 0xf9, 0x25, 0xa2, 0x12, 0xf8, 0x3, 0xe2, 0x62,
+ 0xdb, 0x13, 0xb4, 0xa2, 0x87, 0x15, 0x2c, 0x76,
+ 0x75, 0x37, 0x4c, 0x1b, 0x7d, 0x87, 0x8f, 0x90,
+ 0x8e, 0x8e, 0x8f, 0x8e, 0x92, 0x1f, 0x8e, 0x91,
+ 0x8e, 0x93, 0x92, 0x1a, 0x13, 0x74, 0x94, 0x84,
+ 0xa6, 0x6c, 0x74, 0x79, 0x80, 0x6a, 0x65, 0xaf,
+ 0x75, 0xb5, 0xf7, 0xe, 0xbf, 0xf7, 0x44, 0xb6,
+ 0x96, 0x1e, 0xf7, 0x3, 0xf8, 0x3e, 0x5, 0xb5,
+ 0x96, 0xb9, 0xf7, 0x44, 0xe1, 0x1b, 0xb4, 0xa2,
+ 0x70, 0x5b, 0x4d, 0x7b, 0x3f, 0x4b, 0x6b, 0x1f,
+ 0x74, 0x80, 0x7a, 0x89, 0x7f, 0x8a, 0x8, 0x7c,
+ 0x8a, 0x85, 0x8d, 0x7c, 0x1a, 0x80, 0x95, 0x89,
+ 0x99, 0x8a, 0x1e, 0x13, 0xb8, 0xab, 0x88, 0xbe,
+ 0x89, 0xfb, 0x1, 0x1a, 0x40, 0x61, 0xfb, 0x49,
+ 0x3a, 0x7e, 0x86, 0x94, 0x8f, 0x91, 0x8f, 0x8f,
+ 0x8e, 0x92, 0x1e, 0x8e, 0x90, 0x8d, 0x91, 0x95,
+ 0x1a, 0xa0, 0x7f, 0x9e, 0x71, 0x73, 0x77, 0x7b,
+ 0x6d, 0x58, 0xba, 0x7b, 0xaa, 0xf7, 0x28, 0xd3,
+ 0xf7, 0x4b, 0xd6, 0xdc, 0x5e, 0xc6, 0x3c, 0x91,
+ 0x1e, 0x8e, 0x7, 0x13, 0xb4, 0xc9, 0xa1, 0xf0,
+ 0xb2, 0xf3, 0x1a, 0xc7, 0x64, 0xd1, 0x28, 0xfb,
+ 0x22, 0x48, 0xfb, 0x20, 0xfb, 0x74, 0x58, 0x1e,
+ 0xe, 0xa1, 0xa, 0x33, 0xa, 0x13, 0xb8, 0x28,
+ 0xa, 0xf7, 0x9b, 0xf8, 0x13, 0x78, 0xa, 0xa1,
+ 0xa, 0xf7, 0x9c, 0xf8, 0x82, 0x7f, 0xa, 0x24,
+ 0xfc, 0x92, 0x22, 0xa, 0x13, 0xb8, 0x28, 0xa,
+ 0xe, 0x76, 0xa, 0x8b, 0xbe, 0xf7, 0x3d, 0x77,
+ 0x12, 0x9c, 0xdf, 0x13, 0x7c, 0xf7, 0x43, 0x55,
+ 0xa, 0x7d, 0xfc, 0x9e, 0x22, 0xa, 0x13, 0xbc,
+ 0x28, 0xa, 0xe, 0x76, 0xa, 0xda, 0xac, 0xa,
+ 0x9c, 0xdf, 0x13, 0xb6, 0xf7, 0x4c, 0xf8, 0x99,
+ 0x65, 0xa, 0x74, 0x97, 0x96, 0x71, 0x1f, 0x13,
+ 0x6a, 0x95, 0x73, 0x71, 0x95, 0x71, 0x6c, 0xa,
+ 0xf7, 0x1a, 0xfc, 0xe, 0x22, 0xa, 0x13, 0xb6,
+ 0x28, 0xa, 0xe, 0x76, 0xa, 0xce, 0xed, 0x12,
+ 0x9c, 0xdf, 0xe5, 0xc6, 0xa, 0x13, 0x7e, 0x33,
+ 0xa, 0x13, 0xbe, 0x28, 0xa, 0xe5, 0xf8, 0x54,
+ 0x23, 0xa, 0x76, 0xa, 0xbe, 0xac, 0x8b, 0xf7,
+ 0x17, 0xfb, 0x17, 0xf7, 0x3a, 0x12, 0x9c, 0xdf,
+ 0xf7, 0x1f, 0xf7, 0x38, 0xab, 0xa, 0xf7, 0x3a,
+ 0x13, 0x76, 0x40, 0x33, 0xa, 0x13, 0xb7, 0x0,
+ 0x28, 0xa, 0xf7, 0x1f, 0xf8, 0x76, 0x15, 0x54,
+ 0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0xb6, 0x40, 0xc2,
+ 0xb8, 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f,
+ 0x13, 0xb7, 0x0, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+ 0xac, 0x8a, 0x15, 0xb3, 0xa, 0x13, 0xba, 0x80,
+ 0xe5, 0xa, 0xe, 0xf7, 0xca, 0x80, 0xbd, 0xf8,
+ 0xd, 0xa4, 0x77, 0x9f, 0x12, 0xa2, 0xe1, 0xf7,
+ 0x53, 0xe3, 0xf7, 0x4e, 0xcd, 0x13, 0xbc, 0xf7,
+ 0xba, 0xf7, 0x20, 0x15, 0x90, 0x6, 0x89, 0x83,
+ 0x8a, 0x85, 0x82, 0x1a, 0x49, 0xab, 0x4d, 0xd9,
+ 0xeb, 0xe5, 0xf1, 0x95, 0x91, 0x1e, 0x81, 0x97,
+ 0x5, 0x48, 0x48, 0x58, 0x81, 0x76, 0x1b, 0x42,
+ 0x8b, 0xd6, 0xa8, 0xa3, 0x8c, 0x8d, 0x90, 0xa1,
+ 0x1f, 0xf7, 0xa, 0xad, 0xf7, 0x20, 0xb2, 0xf1,
+ 0x1a, 0xc7, 0x50, 0x9d, 0x75, 0x64, 0x62, 0x76,
+ 0x64, 0x65, 0x1e, 0x89, 0x8d, 0x9f, 0xc3, 0x44,
+ 0x89, 0x78, 0x60, 0x5, 0xa3, 0x80, 0x81, 0xa2,
+ 0x5b, 0x1b, 0xfb, 0x12, 0xfb, 0x2b, 0xfb, 0x6a,
+ 0xfb, 0x18, 0x5c, 0x9a, 0x50, 0xd3, 0xd7, 0xc6,
+ 0xda, 0xd3, 0xbc, 0x1f, 0xfb, 0x4d, 0x67, 0x15,
+ 0xed, 0xee, 0xf7, 0x6f, 0xe9, 0x99, 0xad, 0x88,
+ 0x54, 0x27, 0x20, 0xfb, 0x74, 0x29, 0x1e, 0x13,
+ 0x58, 0x69, 0x89, 0xaa, 0xad, 0x1f, 0xf7, 0xab,
+ 0xf7, 0x1, 0x15, 0xf7, 0x1d, 0xb5, 0xc7, 0xcd,
+ 0xbb, 0x1b, 0x13, 0xc, 0x9b, 0x9f, 0x7c, 0x6b,
+ 0x56, 0x59, 0x40, 0xfb, 0x1c, 0x6f, 0x1f, 0xe,
+ 0xe2, 0xfb, 0x6d, 0xaf, 0xdc, 0xad, 0xc3, 0xae,
+ 0xf8, 0x1f, 0xa0, 0x1, 0xa5, 0xe1, 0xd7, 0xd5,
+ 0xd7, 0xe2, 0x3, 0xf0, 0x28, 0x15, 0x94, 0x83,
+ 0x5, 0x91, 0x95, 0x98, 0x8c, 0x97, 0x1b, 0xa1,
+ 0xa0, 0x7e, 0x72, 0x6e, 0x69, 0x7d, 0x67, 0x79,
+ 0x78, 0xde, 0xa, 0xa2, 0xaf, 0x83, 0xaf, 0x1b,
+ 0xc6, 0xc5, 0xa2, 0xcb, 0xb4, 0x69, 0xa5, 0x65,
+ 0x7f, 0x7f, 0x8b, 0x88, 0x80, 0x1f, 0xb1, 0xc3,
+ 0xeb, 0x91, 0xc0, 0xd1, 0xa3, 0xa9, 0x19, 0x7b,
+ 0x95, 0x5, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+ 0x4e, 0x69, 0xb8, 0xd8, 0xeb, 0xd4, 0xdb, 0xa,
+ 0x81, 0x86, 0x82, 0x87, 0x80, 0x1f, 0x88, 0x83,
+ 0x88, 0x81, 0x80, 0xa3, 0xa, 0xfb, 0x22, 0xfb,
+ 0x2d, 0xfb, 0x21, 0xfb, 0xa, 0xd0, 0x6a, 0xc7,
+ 0x85, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xfc,
+ 0xa2, 0x8c, 0xa2, 0xf7, 0x73, 0x77, 0x1, 0xaa,
+ 0xe0, 0x3, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c,
+ 0xb7, 0x5, 0x2d, 0xa, 0xf7, 0x68, 0xf7, 0xd0,
+ 0x78, 0xa, 0xe2, 0x80, 0xb8, 0xf8, 0xd, 0xa2,
+ 0xf7, 0x7a, 0x77, 0x12, 0xaa, 0xe0, 0xf7, 0x7b,
+ 0xcc, 0x17, 0xf7, 0x80, 0xad, 0xa, 0xf7, 0x3a,
+ 0xee, 0x9f, 0xa, 0x96, 0x99, 0x47, 0xa, 0x7e,
+ 0x80, 0x9d, 0xa, 0xfb, 0x9a, 0xfc, 0x55, 0x15,
+ 0x9c, 0xb7, 0x5, 0x3d, 0xa, 0x13, 0xd0, 0xb7,
+ 0x70, 0xad, 0x58, 0x1e, 0x5b, 0xa, 0x1f, 0x54,
+ 0xa, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xf3, 0xa2,
+ 0x95, 0xa2, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, 0x77,
+ 0x1, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x3, 0xf7,
+ 0x27, 0x55, 0xa, 0xfb, 0x41, 0xfc, 0x63, 0x15,
+ 0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xe, 0xe2, 0x80,
+ 0xb8, 0xf8, 0xd, 0xa2, 0x7b, 0xa2, 0xce, 0xed,
+ 0x12, 0xaa, 0xe0, 0xb0, 0xc6, 0xa, 0x13, 0xde,
+ 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, 0x5,
+ 0x13, 0xbe, 0x2d, 0xa, 0xa8, 0xf8, 0x11, 0x23,
+ 0xa, 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7,
+ 0x72, 0xf7, 0x6, 0x2c, 0xa, 0x9d, 0xf8, 0x19,
+ 0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x23, 0xc5, 0xa,
+ 0x79, 0x91, 0x56, 0xa, 0x9e, 0x7b, 0x80, 0xa,
+ 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7, 0x18,
+ 0xad, 0xa, 0xf7, 0x3a, 0xef, 0x9f, 0xa, 0x97,
+ 0x98, 0x47, 0xa, 0x7d, 0x81, 0x9d, 0xa, 0x48,
+ 0xfc, 0xaa, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf9,
+ 0x34, 0xe3, 0xa, 0xad, 0x55, 0xa, 0xaa, 0xfc,
+ 0xb7, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf8, 0x9b,
+ 0xed, 0x1, 0xbc, 0xf2, 0xf2, 0xed, 0x3, 0xf7,
+ 0x72, 0xf7, 0x6, 0x2c, 0xa, 0xfb, 0x49, 0xf8,
+ 0x5a, 0x58, 0xa, 0xf7, 0x5d, 0x16, 0x20, 0xa,
+ 0xe, 0x80, 0xa0, 0xf7, 0x46, 0xa0, 0xf8, 0x6e,
+ 0x77, 0x12, 0xa6, 0xdf, 0xf7, 0xa5, 0xde, 0x17,
+ 0xf7, 0x3, 0xf2, 0x15, 0xf7, 0xa, 0xe6, 0xf7,
+ 0x5b, 0xf7, 0x4, 0xbb, 0xa1, 0x5f, 0x57, 0x20,
+ 0x3c, 0xfb, 0x63, 0xfb, 0x6, 0x59, 0x6d, 0xaf,
+ 0xc4, 0x1e, 0xf7, 0xaf, 0xf7, 0xb5, 0x15, 0xa9,
+ 0x7d, 0x6a, 0x9e, 0x66, 0x1b, 0xfb, 0x1b, 0xfb,
+ 0x28, 0xfb, 0x35, 0xfb, 0x27, 0x38, 0xb8, 0x4e,
+ 0xf5, 0xf7, 0x2d, 0xf7, 0x1c, 0xf7, 0x43, 0xf7,
+ 0x5c, 0xec, 0x67, 0xce, 0x59, 0xc1, 0x1f, 0xf0,
+ 0xb8, 0x6b, 0xa7, 0x28, 0x60, 0x64, 0xac, 0x5b,
+ 0xa9, 0x63, 0x93, 0x19, 0x68, 0x7a, 0xaf, 0x7d,
+ 0xb3, 0x6b, 0xab, 0x6c, 0x19, 0xfb, 0xf, 0x55,
+ 0xac, 0x6e, 0xf7, 0x9, 0xbe, 0xaf, 0x5e, 0xa6,
+ 0x5a, 0x94, 0x45, 0x19, 0xe, 0xbe, 0xa, 0xda,
+ 0xac, 0xa, 0xf7, 0xfd, 0xdc, 0x13, 0x6a, 0x89,
+ 0xa, 0xc3, 0xa, 0x13, 0xaa, 0x51, 0xa, 0x7b,
+ 0x7, 0xc1, 0x92, 0x76, 0x7c, 0x1f, 0x13, 0x76,
+ 0x76, 0x4b, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+ 0xf7, 0x1b, 0xa2, 0xa, 0xa7, 0x1f, 0x80, 0xa8,
+ 0x57, 0xa, 0x77, 0x72, 0x98, 0x96, 0x70, 0x1f,
+ 0x13, 0x6a, 0x95, 0x74, 0x72, 0x94, 0x72, 0xd6,
+ 0xa, 0xa4, 0xa, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+ 0xf7, 0x91, 0xf7, 0xfc, 0xb7, 0xa, 0xfb, 0x5,
+ 0xf7, 0x26, 0xc5, 0xa, 0x7b, 0x8e, 0x56, 0xa,
+ 0x9c, 0x7e, 0x80, 0xa, 0xa4, 0xa, 0xf7, 0x9c,
+ 0xad, 0xa, 0xf7, 0x33, 0xed, 0x9f, 0xa, 0x9d,
+ 0x9a, 0x47, 0xa, 0x77, 0x7f, 0x9d, 0xa, 0xfc,
+ 0x17, 0xfc, 0x95, 0x26, 0xa, 0xe, 0x80, 0xa0,
+ 0xf8, 0x18, 0xa0, 0x8c, 0xa0, 0x8b, 0xbe, 0xf3,
+ 0xcc, 0x8b, 0x77, 0x92, 0xa, 0xf7, 0x39, 0x55,
+ 0xa, 0xfb, 0xbb, 0xfc, 0xa4, 0x26, 0xa, 0xe,
+ 0x80, 0xa0, 0xf8, 0x21, 0xa0, 0xe7, 0xac, 0xa,
+ 0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x13, 0xee, 0xf7,
+ 0x3d, 0xf8, 0x99, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+ 0x80, 0xa7, 0x1f, 0x80, 0xa8, 0xa9, 0x7f, 0x9e,
+ 0x1b, 0x43, 0xa, 0x77, 0x74, 0x97, 0x96, 0x71,
+ 0x1f, 0x13, 0xd6, 0x95, 0x73, 0x71, 0x95, 0x71,
+ 0x6c, 0xa, 0xfb, 0x22, 0xfc, 0x14, 0x26, 0xa,
+ 0xe, 0x80, 0xa0, 0xf8, 0x25, 0xa0, 0xd7, 0xed,
+ 0x12, 0xa6, 0xdf, 0xdb, 0xed, 0xea, 0xdf, 0x3e,
+ 0xed, 0x13, 0xfc, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+ 0xdb, 0xf8, 0x3d, 0x58, 0xa, 0x13, 0xfa, 0x25,
+ 0xa, 0xf7, 0xd2, 0x80, 0xf7, 0x3, 0xf7, 0xc,
+ 0xcd, 0x53, 0xb9, 0xf7, 0x16, 0xf7, 0x3, 0x12,
+ 0xf7, 0xaf, 0xf7, 0x3, 0x23, 0xe1, 0x13, 0xb8,
+ 0xe1, 0xf7, 0x7a, 0x15, 0xf8, 0x8c, 0xb9, 0xfc,
+ 0x8c, 0x6, 0xf7, 0x8b, 0xf7, 0x2f, 0x15, 0x13,
+ 0xd4, 0x8e, 0xa, 0x8d, 0xfc, 0x4e, 0x15, 0x8e,
+ 0xa, 0xe, 0x82, 0xa2, 0xf8, 0x28, 0xa1, 0x12,
+ 0xa7, 0xdf, 0xf7, 0xa5, 0xdf, 0x17, 0xf7, 0x20,
+ 0xa8, 0x15, 0x78, 0x9c, 0x82, 0x97, 0xd7, 0x1a,
+ 0xd9, 0xd8, 0xf7, 0x62, 0xf7, 0x1f, 0x1e, 0xfb,
+ 0x35, 0xfc, 0x28, 0x15, 0xf7, 0x52, 0xf8, 0x1c,
+ 0x5, 0xaa, 0x67, 0x88, 0x71, 0x58, 0x1a, 0x7c,
+ 0x64, 0xfb, 0x9c, 0xfb, 0x47, 0x1e, 0x60, 0x79,
+ 0x15, 0x4b, 0xfb, 0x17, 0x5, 0xae, 0x6, 0x13,
+ 0xf0, 0xc8, 0xf7, 0x12, 0x5, 0x13, 0x50, 0xf7,
+ 0x61, 0xf7, 0x0, 0xf7, 0x54, 0xf7, 0x0, 0xcf,
+ 0x6f, 0xc6, 0x44, 0x9c, 0x1f, 0xc5, 0xf7, 0xb,
+ 0x5, 0x69, 0x6, 0x54, 0xfb, 0x6, 0x5, 0x13,
+ 0x20, 0xfb, 0x3b, 0xfb, 0x24, 0xfb, 0x34, 0xfb,
+ 0x25, 0x1f, 0x13, 0x0, 0x53, 0xa1, 0x4c, 0xd5,
+ 0x77, 0x1e, 0xe, 0xa0, 0xa, 0xf7, 0xdd, 0xf7,
+ 0x77, 0x3b, 0xa, 0xae, 0xf7, 0x9d, 0xb7, 0xa,
+ 0xfb, 0x4, 0xf7, 0x25, 0xc5, 0xa, 0x7a, 0x8f,
+ 0x56, 0xa, 0x9d, 0x7d, 0x80, 0xa, 0xa0, 0xa,
+ 0xf7, 0x92, 0xf8, 0x82, 0x7e, 0xa, 0x3b, 0xfc,
+ 0x38, 0x3b, 0xa, 0xe, 0x82, 0xba, 0x6f, 0x76,
+ 0xf8, 0x4f, 0xc7, 0xf7, 0x3d, 0xa9, 0xa, 0xe5,
+ 0x13, 0xb0, 0xf7, 0x39, 0xf8, 0x80, 0x15, 0xb2,
+ 0x6, 0x13, 0xbc, 0x39, 0xa, 0x92, 0xfc, 0x46,
+ 0x53, 0xa, 0x13, 0xac, 0x2e, 0xa, 0x13, 0x70,
+ 0xa6, 0xa, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x9b,
+ 0xed, 0x12, 0xb5, 0xd8, 0xc9, 0xc6, 0xa, 0x13,
+ 0xac, 0xf7, 0xdd, 0xf7, 0x77, 0x53, 0xa, 0x13,
+ 0xbc, 0x2b, 0xa, 0x13, 0x7c, 0x5d, 0xa, 0x62,
+ 0xa, 0xfb, 0x28, 0xf7, 0xde, 0x23, 0xa, 0xe2,
+ 0xfb, 0x62, 0xb8, 0xf8, 0xee, 0x77, 0xf7, 0x87,
+ 0x77, 0x12, 0xf8, 0x16, 0xc7, 0xa, 0xdb, 0x7c,
+ 0x5f, 0xf7, 0x5, 0x7e, 0x1b, 0x79, 0x3d, 0x7b,
+ 0x83, 0x5b, 0x1f, 0x98, 0xa, 0x9e, 0x4f, 0xe2,
+ 0xa, 0xaf, 0xfb, 0x32, 0x7a, 0xa, 0x84, 0x84,
+ 0x8f, 0x91, 0x84, 0x1f, 0x93, 0x81, 0x7f, 0x95,
+ 0x79, 0x96, 0xa, 0x1f, 0x13, 0x70, 0x70, 0xa,
+ 0x73, 0x99, 0x82, 0x99, 0x83, 0x1f, 0x98, 0x83,
+ 0x98, 0x84, 0x77, 0xa7, 0xa, 0x6f, 0xf8, 0x3a,
+ 0x7e, 0xa, 0xe, 0xfb, 0x4c, 0x76, 0xf7, 0x6b,
+ 0x76, 0xf8, 0x2d, 0xb6, 0xf7, 0x86, 0x77, 0x48,
+ 0xa, 0x77, 0x1f, 0x89, 0x8d, 0x91, 0x9c, 0xdd,
+ 0xf7, 0xce, 0x8e, 0x97, 0x19, 0x13, 0x90, 0x86,
+ 0x90, 0x58, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+ 0x7a, 0x7, 0xba, 0x9a, 0x7d, 0x75, 0x7a, 0x84,
+ 0x76, 0x85, 0x75, 0x1f, 0x6a, 0xfb, 0x9, 0xfb,
+ 0xf, 0xfc, 0x64, 0x76, 0x35, 0x8, 0x6b, 0x83,
+ 0x82, 0xda, 0xa, 0x74, 0x66, 0x90, 0xb9, 0x9e,
+ 0xa4, 0xe5, 0x93, 0xaf, 0x1f, 0xe, 0xe2, 0xfb,
+ 0x4d, 0x76, 0xf9, 0x1b, 0x77, 0xe2, 0xed, 0x12,
+ 0xf7, 0x23, 0xc6, 0xa, 0x54, 0xb3, 0x13, 0xf4,
+ 0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x3f, 0x5,
+ 0xd6, 0x7d, 0x5e, 0xf7, 0xf, 0x7e, 0x1b, 0x79,
+ 0x8a, 0x3d, 0x7c, 0x5b, 0x83, 0x8, 0x13, 0xb8,
+ 0x98, 0xa, 0x9f, 0x43, 0xe2, 0xa, 0xae, 0xfb,
+ 0x26, 0x7a, 0xa, 0x82, 0x83, 0x93, 0x92, 0x81,
+ 0x1f, 0x92, 0x82, 0x80, 0x91, 0x7d, 0x96, 0xa,
+ 0x1f, 0x13, 0x74, 0x70, 0xa, 0x75, 0x97, 0x83,
+ 0x98, 0x83, 0x1f, 0x99, 0x82, 0x9a, 0x84, 0x75,
+ 0xa7, 0xa, 0xfb, 0xd, 0xf8, 0x79, 0x58, 0xa,
+ 0x13, 0xf8, 0x25, 0xa, 0xd7, 0xa, 0xf8, 0x58,
+ 0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x3f, 0xa,
+ 0x64, 0x84, 0x38, 0x7b, 0x65, 0x89, 0x19, 0x3e,
+ 0xa, 0xe, 0x6e, 0xa, 0x54, 0x5e, 0x8b, 0xb7,
+ 0xac, 0xac, 0xe4, 0xab, 0xf7, 0x11, 0x1f, 0xf7,
+ 0x22, 0xde, 0x99, 0xbc, 0xfb, 0x23, 0x36, 0xb9,
+ 0xf7, 0x31, 0xaa, 0xf5, 0x9b, 0x82, 0xc8, 0x94,
+ 0x19, 0xc4, 0xa, 0xc3, 0x9f, 0x78, 0x6e, 0x7b,
+ 0x87, 0x77, 0x85, 0x76, 0x1f, 0x4f, 0xfb, 0x6a,
+ 0x28, 0x50, 0x7e, 0x5b, 0xee, 0xc6, 0x5c, 0xfb,
+ 0x3e, 0x7a, 0x4d, 0x79, 0x7e, 0x5a, 0x82, 0x19,
+ 0xe, 0xd7, 0xa, 0xf9, 0x4a, 0x77, 0x1, 0xb0,
+ 0xd7, 0x3, 0xf7, 0x74, 0xd3, 0xa, 0x7e, 0x88,
+ 0x95, 0x97, 0x9c, 0x94, 0xa0, 0x8d, 0x92, 0x1f,
+ 0xd5, 0xf7, 0xaf, 0xec, 0xbd, 0x97, 0xb9, 0x2a,
+ 0x59, 0xcc, 0xf7, 0x8e, 0x86, 0x90, 0x57, 0x7f,
+ 0x57, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xa5,
+ 0xb2, 0x82, 0x71, 0x81, 0x6f, 0xfb, 0x0, 0x6e,
+ 0xfb, 0x1, 0x1f, 0x43, 0x67, 0x7f, 0x5d, 0xd3,
+ 0xaf, 0x5, 0x62, 0xfb, 0x28, 0x6b, 0xfb, 0xf,
+ 0x81, 0xb5, 0xa, 0xf8, 0xdf, 0x83, 0xab, 0x73,
+ 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0x78, 0xab, 0x12,
+ 0xbc, 0xf7, 0x0, 0x13, 0xb4, 0xf9, 0x84, 0xf7,
+ 0x74, 0x15, 0x9f, 0x89, 0xcd, 0xf7, 0x7a, 0x79,
+ 0x8f, 0x5, 0x37, 0x64, 0x7b, 0x80, 0xfb, 0x39,
+ 0x1b, 0xcb, 0xf7, 0x77, 0x5, 0x9a, 0x8f, 0x91,
+ 0x9c, 0xa6, 0x1b, 0xeb, 0x6, 0xf7, 0xc, 0x8b,
+ 0x69, 0x38, 0x1f, 0x9b, 0x6, 0xaa, 0xf7, 0x2a,
+ 0x5, 0xfc, 0x5, 0x6, 0x7b, 0x71, 0x8f, 0x8e,
+ 0x6f, 0x1f, 0x13, 0xac, 0x8f, 0x6e, 0x6d, 0x8d,
+ 0x73, 0x1b, 0xfb, 0x5e, 0xfb, 0x53, 0xfb, 0x5e,
+ 0xfb, 0x88, 0xfb, 0x14, 0xf0, 0x27, 0xf7, 0xc,
+ 0xb2, 0xae, 0x8d, 0x8d, 0xad, 0x1f, 0x13, 0x74,
+ 0x8d, 0xae, 0xae, 0x8d, 0xb3, 0x1b, 0xf7, 0xee,
+ 0x6, 0xcc, 0xf7, 0x3a, 0x7b, 0x91, 0x5, 0x49,
+ 0x5b, 0x56, 0x42, 0xfb, 0x37, 0x1b, 0x46, 0x71,
+ 0x8d, 0xae, 0x99, 0x95, 0xad, 0x90, 0x9f, 0x1f,
+ 0xbf, 0xf7, 0x52, 0x5, 0xf7, 0x1f, 0xa7, 0x7a,
+ 0x5e, 0x1f, 0x87, 0x71, 0x8f, 0xa0, 0x85, 0x66,
+ 0x8, 0xfb, 0xba, 0x72, 0x15, 0x13, 0xac, 0xfb,
+ 0x3, 0x6d, 0x72, 0x4b, 0x21, 0x1b, 0xfb, 0x1f,
+ 0x8a, 0xf7, 0x20, 0xb6, 0xf7, 0x45, 0xf7, 0x7,
+ 0xf7, 0x8e, 0xf7, 0x42, 0xca, 0xb5, 0x6c, 0x58,
+ 0x7a, 0x7e, 0x62, 0x84, 0x70, 0x1f, 0xe, 0xf7,
+ 0xca, 0x7f, 0xa0, 0x76, 0xb5, 0x77, 0x76, 0xf8,
+ 0x41, 0xa2, 0x12, 0x9f, 0xde, 0x13, 0x58, 0xf7,
+ 0xc3, 0xc3, 0x15, 0x62, 0x9e, 0xb3, 0x70, 0xb8,
+ 0x1b, 0xe0, 0xd6, 0xcf, 0xb1, 0xb0, 0x1f, 0x80,
+ 0x96, 0x5, 0x5f, 0x52, 0x63, 0x6c, 0x59, 0x1b,
+ 0x79, 0x54, 0x99, 0xcf, 0xa0, 0x8d, 0xaf, 0x94,
+ 0x99, 0x1f, 0x93, 0x97, 0xf0, 0x8a, 0xe5, 0xcc,
+ 0x8, 0xb7, 0xab, 0x9e, 0xb6, 0xa6, 0x1a, 0x92,
+ 0x85, 0xd4, 0x49, 0x61, 0x5c, 0x86, 0x40, 0x3c,
+ 0x1e, 0x93, 0x89, 0x73, 0xd3, 0x32, 0x1b, 0xfb,
+ 0xe, 0xfb, 0x29, 0xfb, 0x37, 0xfb, 0x1e, 0x1f,
+ 0x13, 0x38, 0xfb, 0x3, 0xdf, 0x63, 0xc2, 0xd5,
+ 0xae, 0xac, 0xad, 0xae, 0x1e, 0xfb, 0x5c, 0xc1,
+ 0x15, 0xf7, 0x5, 0xe1, 0xf7, 0x57, 0xe6, 0xc3,
+ 0x92, 0x61, 0x6e, 0x1e, 0x13, 0x98, 0x66, 0x5a,
+ 0xfb, 0xc1, 0xfb, 0xe, 0x46, 0x8b, 0xd6, 0xa5,
+ 0x1e, 0xf7, 0xb2, 0xea, 0x15, 0xf7, 0x8, 0xa9,
+ 0xd7, 0xea, 0xc1, 0x1b, 0xa2, 0x93, 0x70, 0x74,
+ 0x7a, 0x83, 0x5c, 0x54, 0x60, 0x1f, 0x6a, 0x72,
+ 0x73, 0x84, 0x44, 0x75, 0x8, 0xe, 0x79, 0xae,
+ 0x80, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+ 0xbe, 0x9f, 0xc7, 0xe3, 0x13, 0x6c, 0xb9, 0xa,
+ 0x9a, 0x85, 0x83, 0x9e, 0x1f, 0x13, 0xac, 0x81,
+ 0xa4, 0xaa, 0x7f, 0xb2, 0x6d, 0xa, 0x13, 0x9c,
+ 0xb3, 0xf7, 0x5b, 0x5, 0x74, 0x6, 0x78, 0x80,
+ 0x7a, 0x85, 0x78, 0x1b, 0x78, 0x75, 0x91, 0x91,
+ 0x7a, 0x1f, 0x13, 0xac, 0x91, 0x79, 0x7d, 0x91,
+ 0x5e, 0x64, 0xa, 0x13, 0x6c, 0xf7, 0x98, 0xf8,
+ 0x84, 0x52, 0xa, 0xab, 0x93, 0x76, 0xf8, 0x43,
+ 0xa2, 0xf7, 0x70, 0x77, 0x12, 0xf7, 0x1, 0xd4,
+ 0x8b, 0xf7, 0x28, 0x25, 0xd7, 0x13, 0xf4, 0xc2,
+ 0xa, 0x99, 0x9a, 0x87, 0x86, 0x99, 0x1f, 0x86,
+ 0x9a, 0x9b, 0x86, 0x9a, 0x1b, 0xc3, 0xe8, 0xa4,
+ 0xf7, 0x1, 0xb5, 0x6d, 0xb6, 0x6d, 0xb3, 0x1f,
+ 0x6c, 0xb4, 0x6c, 0xb2, 0xab, 0x1a, 0xbc, 0xab,
+ 0x94, 0xa1, 0x1e, 0x13, 0xf8, 0xcc, 0xa8, 0x51,
+ 0x52, 0x1f, 0x9b, 0x6, 0xbb, 0xa, 0x7b, 0x80,
+ 0x90, 0x90, 0x7e, 0x1f, 0x8f, 0x80, 0x7e, 0x8e,
+ 0x76, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, 0x63, 0xab,
+ 0x5d, 0xaa, 0x60, 0x1f, 0x13, 0xf4, 0xa8, 0x63,
+ 0xa6, 0x65, 0x6b, 0xb4, 0xa, 0xf7, 0x65, 0xf7,
+ 0xee, 0x52, 0xa, 0xf7, 0x5b, 0xa0, 0x76, 0xf9,
+ 0x11, 0xdf, 0xa, 0xf7, 0x8d, 0xc6, 0xa, 0x13,
+ 0xcc, 0xcf, 0xa, 0x51, 0x8f, 0x6c, 0x90, 0xb6,
+ 0x1a, 0x94, 0x8d, 0x96, 0x8f, 0x98, 0x1e, 0xc7,
+ 0xf7, 0x61, 0xf7, 0x6f, 0xf7, 0xa2, 0xab, 0xb3,
+ 0x96, 0x93, 0xa6, 0x98, 0x19, 0x13, 0xbc, 0x9b,
+ 0xfb, 0x51, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xb3,
+ 0x87, 0xa6, 0x86, 0x73, 0x1a, 0x84, 0x89, 0x83,
+ 0x87, 0x80, 0x1e, 0x7c, 0x64, 0xfb, 0xc, 0xfb,
+ 0x1c, 0x5e, 0x53, 0x73, 0xe7, 0x6e, 0xf0, 0x83,
+ 0xad, 0x8, 0x88, 0x96, 0x8b, 0x94, 0x93, 0x1a,
+ 0xa4, 0xa3, 0x95, 0xb8, 0x1e, 0x13, 0xbc, 0x9b,
+ 0xfb, 0x83, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xbf,
+ 0x83, 0x93, 0x8a, 0x9b, 0x52, 0xd8, 0xfb, 0xa1,
+ 0x18, 0x4b, 0xfb, 0x5e, 0x78, 0x49, 0x67, 0x7d,
+ 0x5c, 0x87, 0x19, 0xf7, 0x3f, 0xf9, 0x85, 0x15,
+ 0x13, 0xbc, 0x21, 0xa, 0xf7, 0x5b, 0x8b, 0xaf,
+ 0xf8, 0xd9, 0xaf, 0xf7, 0x70, 0x77, 0x50, 0xa,
+ 0xf7, 0xe3, 0xf9, 0x46, 0x52, 0xa, 0xab, 0x54,
+ 0x76, 0xf8, 0x50, 0xc7, 0xf7, 0x7d, 0x77, 0x12,
+ 0xf7, 0xd8, 0xd0, 0x17, 0xba, 0xa, 0xac, 0xac,
+ 0x79, 0x77, 0xac, 0x1f, 0x74, 0xb2, 0xb2, 0x72,
+ 0xb3, 0xaf, 0xa, 0x82, 0x8d, 0x85, 0x8e, 0x85,
+ 0x1f, 0x8f, 0x82, 0x90, 0x84, 0x84, 0x1a, 0x7e,
+ 0x7b, 0x88, 0x7f, 0x81, 0x78, 0x8b, 0xac, 0x71,
+ 0x1e, 0x57, 0xce, 0x7a, 0x9e, 0x49, 0x99, 0xf7,
+ 0xb6, 0xf7, 0xec, 0x18, 0xca, 0xa, 0xc3, 0xa1,
+ 0xaa, 0x8e, 0xb1, 0x1b, 0xf7, 0x1c, 0x6, 0x13,
+ 0xa0, 0x38, 0xf7, 0x10, 0x52, 0xa, 0xfb, 0x4a,
+ 0xa2, 0xf8, 0xa7, 0xa9, 0xf7, 0x8f, 0xa8, 0x1,
+ 0xa4, 0xdf, 0xf7, 0xd1, 0xdc, 0x3, 0xf7, 0xe,
+ 0xf8, 0x8, 0x15, 0xf7, 0x4, 0x6, 0x67, 0xfb,
+ 0xe1, 0x5, 0xfb, 0x8, 0x7e, 0x80, 0x39, 0x4f,
+ 0x1b, 0x85, 0x7e, 0x8f, 0x97, 0x91, 0x8f, 0x90,
+ 0x8e, 0x91, 0x1f, 0x8f, 0x91, 0x8e, 0x92, 0x93,
+ 0x1a, 0x9c, 0x7c, 0xa0, 0x73, 0x85, 0x64, 0x89,
+ 0x5a, 0x6d, 0xa4, 0x69, 0xc2, 0xf7, 0x18, 0xb0,
+ 0xf7, 0x72, 0xb2, 0x90, 0x1e, 0xb2, 0xf7, 0xb9,
+ 0x5, 0xf7, 0xe, 0x6, 0x92, 0xa9, 0x5, 0xfb,
+ 0x12, 0x6, 0xf7, 0x34, 0x9f, 0x99, 0xe6, 0xcc,
+ 0x1b, 0x97, 0x92, 0x84, 0x85, 0x85, 0x88, 0x85,
+ 0x87, 0x85, 0x1f, 0x88, 0x86, 0x88, 0x86, 0x84,
+ 0x1a, 0x72, 0xa2, 0x7d, 0x9c, 0xa5, 0x9a, 0xa0,
+ 0xa5, 0xbe, 0x59, 0x9d, 0x6d, 0xfb, 0x2, 0x50,
+ 0xfb, 0x20, 0xfb, 0x20, 0x77, 0x1e, 0xfb, 0x1,
+ 0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa,
+ 0xe6, 0xf8, 0x80, 0x15, 0xb4, 0x6, 0xf7, 0x16,
+ 0xf3, 0xe0, 0x23, 0x5, 0xb1, 0x6, 0x33, 0xf7,
+ 0x3d, 0x5, 0x5a, 0x6, 0xe, 0x73, 0xf8, 0x95,
+ 0x76, 0xd1, 0xa, 0xf7, 0xd, 0xf7, 0xc5, 0x3,
+ 0xf7, 0x6d, 0xf8, 0x80, 0x7b, 0xa, 0x66, 0x6,
+ 0xfb, 0x1e, 0x22, 0x2f, 0xf4, 0x5, 0x65, 0x6,
+ 0xe, 0x73, 0xf8, 0x80, 0xc3, 0xf1, 0x77, 0x1,
+ 0xf7, 0x9, 0xa9, 0x3, 0xf7, 0x9, 0xf9, 0x1e,
+ 0x15, 0x61, 0x8c, 0xfb, 0x8, 0xf7, 0x19, 0xe1,
+ 0xce, 0xd2, 0xe2, 0x99, 0x1e, 0x6d, 0x6, 0x87,
+ 0x8a, 0x6b, 0x29, 0x28, 0x1b, 0x28, 0x81, 0xe1,
+ 0x9b, 0x1f, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1,
+ 0xf7, 0x63, 0xed, 0x3, 0xf7, 0x63, 0xf8, 0xc1,
+ 0x58, 0xa, 0xe, 0x73, 0xf8, 0x80, 0xad, 0x69,
+ 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x39, 0x12, 0xf7,
+ 0x2f, 0xae, 0x68, 0xf7, 0x3b, 0xfb, 0x18, 0xf7,
+ 0x18, 0xfb, 0x18, 0xf7, 0x39, 0x6a, 0xac, 0x13,
+ 0xa4, 0x80, 0xf7, 0x2f, 0xf8, 0xe3, 0x15, 0x54,
+ 0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0x99, 0x0, 0xc2,
+ 0xb9, 0xb7, 0xc2, 0xc2, 0x5d, 0xb8, 0x54, 0x1f,
+ 0x13, 0x44, 0x80, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+ 0xae, 0x16, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf, 0xaa,
+ 0x6d, 0x67, 0x67, 0x6c, 0x6e, 0x67, 0x1e, 0x13,
+ 0xaa, 0x80, 0xe5, 0xa, 0xe, 0x73, 0xfb, 0x3d,
+ 0xb7, 0xf7, 0x39, 0x77, 0x1, 0x77, 0xc5, 0x3,
+ 0xc5, 0xb3, 0x15, 0x6e, 0x71, 0x5a, 0x44, 0x62,
+ 0x1a, 0x59, 0xa3, 0x76, 0xaa, 0xbb, 0xe8, 0xb2,
+ 0xb4, 0xa3, 0x1e, 0x75, 0x9c, 0x5, 0x6f, 0x76,
+ 0x43, 0x72, 0x74, 0x1b, 0x7d, 0x81, 0x94, 0x9f,
+ 0xb3, 0xa2, 0xc5, 0xa5, 0xb1, 0x1f, 0xe, 0x73,
+ 0xf8, 0x9c, 0xf2, 0x12, 0xef, 0xa2, 0xa, 0xa8,
+ 0x1f, 0x13, 0x80, 0x80, 0xa7, 0x57, 0xa, 0x78,
+ 0x75, 0x95, 0x96, 0x72, 0x1f, 0x96, 0x72, 0x70,
+ 0x96, 0x70, 0xd6, 0xa, 0x73, 0xf8, 0x82, 0xf7,
+ 0x3e, 0x1, 0xe8, 0xf8, 0x1d, 0x3, 0xe8, 0xad,
+ 0xa, 0xf7, 0x36, 0xee, 0x9f, 0xa, 0x9a, 0x99,
+ 0x47, 0xa, 0x7a, 0x80, 0x9d, 0xa, 0x9c, 0xfb,
+ 0x2d, 0x5e, 0xa, 0xe, 0xf7, 0x59, 0xad, 0x69,
+ 0xb9, 0x1, 0x85, 0xf7, 0x59, 0x15, 0xf8, 0x89,
+ 0x6, 0x95, 0xad, 0x5, 0xfc, 0x89, 0x6, 0xe,
+ 0xf8, 0xa8, 0xf7, 0x59, 0xb1, 0x65, 0xb9, 0x1,
+ 0x85, 0xf7, 0x59, 0x15, 0xfa, 0xd, 0x6, 0x96,
+ 0xb1, 0x5, 0xfe, 0xd, 0x6, 0xe, 0x73, 0x91,
+ 0xa, 0xf7, 0x3f, 0xcb, 0x4b, 0xf7, 0x5, 0x13,
+ 0xd0, 0xf7, 0xca, 0xf9, 0x1d, 0x15, 0x79, 0xa,
+ 0xb9, 0x93, 0xb5, 0xa0, 0x80, 0x96, 0x7f, 0x95,
+ 0x1e, 0x13, 0xe0, 0x7e, 0x96, 0x7e, 0x93, 0x9d,
+ 0xbd, 0xa, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x44,
+ 0xf7, 0x6, 0x4b, 0xcb, 0x13, 0xe0, 0xf7, 0x34,
+ 0xf8, 0x48, 0x15, 0xea, 0xa, 0xc8, 0x9c, 0xa,
+ 0xaa, 0x69, 0x83, 0x5c, 0x84, 0x61, 0x76, 0x96,
+ 0x81, 0x97, 0x81, 0x1e, 0x13, 0xd0, 0x98, 0x80,
+ 0x99, 0x82, 0x79, 0x1a, 0x66, 0x54, 0x68, 0x77,
+ 0x7e, 0x1e, 0xe, 0x73, 0xfb, 0x15, 0xf7, 0x7a,
+ 0x12, 0xd2, 0xc0, 0xa, 0x13, 0xc0, 0xb7, 0xfb,
+ 0x4, 0x15, 0x6b, 0xa, 0x74, 0x98, 0x7f, 0x98,
+ 0x81, 0x1e, 0x13, 0xa0, 0x96, 0x82, 0x96, 0x82,
+ 0x7b, 0x82, 0xa, 0xe, 0xf7, 0x5b, 0x91, 0xa,
+ 0xf7, 0x3a, 0xcb, 0x4b, 0xf7, 0x4, 0xec, 0xcb,
+ 0x4b, 0xf7, 0x4, 0x13, 0xd4, 0xf7, 0xc5, 0xf9,
+ 0x1d, 0x15, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa2,
+ 0x7e, 0x97, 0x7e, 0x95, 0x1e, 0x13, 0xe4, 0x80,
+ 0x94, 0x80, 0x94, 0x9b, 0xbd, 0xa, 0xf7, 0x65,
+ 0x16, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa3, 0x7d,
+ 0x96, 0x7e, 0x96, 0x1e, 0x13, 0xd8, 0x80, 0x94,
+ 0x81, 0x93, 0x9b, 0xbd, 0xa, 0xe, 0xf7, 0x5b,
+ 0x91, 0xa, 0xf7, 0x46, 0xc0, 0xa, 0xec, 0xc0,
+ 0xa, 0x13, 0xe4, 0xf7, 0x34, 0xf8, 0x48, 0x15,
+ 0x59, 0xa, 0x75, 0x96, 0x80, 0x97, 0x81, 0x1e,
+ 0x13, 0xd8, 0x97, 0x81, 0x98, 0x82, 0x7a, 0x82,
+ 0xa, 0xf7, 0x6e, 0x7a, 0x15, 0x59, 0xa, 0x77,
+ 0x94, 0x80, 0x96, 0x82, 0x1e, 0x13, 0xd4, 0x98,
+ 0x80, 0x9a, 0x82, 0x78, 0x82, 0xa, 0xe, 0xf7,
+ 0x5b, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xdf, 0xc0,
+ 0xa, 0xec, 0xc0, 0xa, 0x13, 0xd0, 0xc4, 0xfb,
+ 0x4, 0x15, 0x6b, 0xa, 0x75, 0x97, 0x7f, 0x97,
+ 0x81, 0x1e, 0x13, 0xb0, 0x97, 0x81, 0x97, 0x83,
+ 0x7a, 0x82, 0xa, 0xf7, 0x65, 0x16, 0x6b, 0xa,
+ 0x73, 0x99, 0x80, 0x98, 0x80, 0x1e, 0x13, 0xa8,
+ 0x96, 0x82, 0x95, 0x83, 0x7b, 0x82, 0xa, 0xe,
+ 0xf8, 0x3e, 0xa0, 0xf7, 0x6f, 0x77, 0x12, 0xf7,
+ 0xb2, 0xe4, 0x17, 0xf7, 0x31, 0xfb, 0x33, 0x15,
+ 0xa1, 0x6, 0xbb, 0xf7, 0x66, 0x97, 0xc1, 0xb2,
+ 0xf7, 0x1, 0xa9, 0xb7, 0x19, 0x81, 0x8e, 0x85,
+ 0xb5, 0xb7, 0x1a, 0xa7, 0x8e, 0xa9, 0x91, 0xa0,
+ 0x1e, 0xbc, 0xa7, 0x82, 0x82, 0xa0, 0x1f, 0x84,
+ 0x9c, 0x97, 0x85, 0x9a, 0x1b, 0xa8, 0x9b, 0xa0,
+ 0xa0, 0x1f, 0x13, 0xe0, 0x9f, 0x7c, 0x9f, 0x6c,
+ 0x72, 0x7e, 0x84, 0x83, 0x7a, 0x1e, 0x84, 0x7a,
+ 0x75, 0x83, 0x5f, 0x1b, 0x96, 0xc3, 0x9d, 0xa7,
+ 0x9a, 0x9f, 0x8, 0x9a, 0x9f, 0x97, 0x98, 0xa5,
+ 0x1a, 0xb0, 0x77, 0x9e, 0x76, 0x74, 0x72, 0x77,
+ 0x67, 0x7a, 0x8e, 0x7f, 0x8d, 0x7e, 0x1e, 0x8d,
+ 0x81, 0x8d, 0x7f, 0x7c, 0x1a, 0x78, 0x88, 0x6f,
+ 0x84, 0x66, 0x1e, 0x60, 0x75, 0x92, 0x93, 0x79,
+ 0x1f, 0x92, 0x7a, 0x7e, 0x93, 0x72, 0x1b, 0x6c,
+ 0x7c, 0x77, 0x77, 0x76, 0x9b, 0x76, 0xa8, 0x9c,
+ 0x99, 0x93, 0x93, 0x9e, 0x1f, 0x93, 0x9e, 0xa4,
+ 0x92, 0xb3, 0x1b, 0x7f, 0x45, 0x73, 0x55, 0x65,
+ 0x63, 0x99, 0xfb, 0x20, 0x76, 0x56, 0x61, 0xfb,
+ 0x78, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x3e,
+ 0xd3, 0x74, 0x76, 0xb2, 0x76, 0xf8, 0x58, 0xd3,
+ 0xf7, 0x3e, 0x77, 0x12, 0xd8, 0xe0, 0xf7, 0x39,
+ 0xe0, 0x13, 0x9f, 0xf7, 0x30, 0x79, 0x15, 0x7b,
+ 0x5b, 0x4c, 0x4a, 0x5b, 0x1a, 0x79, 0x99, 0x78,
+ 0x9e, 0xaa, 0xa0, 0xa3, 0xdb, 0xab, 0x8e, 0xab,
+ 0x94, 0xa9, 0x1e, 0xc2, 0xb8, 0x6f, 0xaf, 0x1b,
+ 0xa0, 0x9e, 0x9a, 0xa0, 0x9f, 0x78, 0x9b, 0x78,
+ 0x1f, 0x66, 0x67, 0x71, 0x50, 0x1b, 0x9b, 0xb3,
+ 0x9e, 0xb5, 0xb0, 0xa4, 0x8, 0x84, 0x9d, 0x88,
+ 0x9d, 0x9e, 0x1a, 0xd0, 0xb3, 0xee, 0xc3, 0xb4,
+ 0x1e, 0x7f, 0x9e, 0x85, 0x9a, 0xa2, 0x1a, 0x9c,
+ 0x8f, 0x9c, 0x8f, 0x9b, 0x1e, 0xc9, 0xb1, 0x71,
+ 0xae, 0x1b, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x77,
+ 0x9c, 0x79, 0x1f, 0x66, 0x5b, 0x6f, 0x5c, 0x1b,
+ 0x9b, 0xbb, 0xca, 0xcc, 0xbb, 0x1a, 0x9d, 0x7d,
+ 0x9e, 0x78, 0x6c, 0x76, 0x73, 0x3b, 0x1e, 0x13,
+ 0xcf, 0x6b, 0x88, 0x6b, 0x82, 0x6d, 0x1e, 0x54,
+ 0x5e, 0xa7, 0x67, 0x1b, 0x76, 0x78, 0x7c, 0x76,
+ 0x1f, 0x13, 0xaf, 0x77, 0x9e, 0x7b, 0x9e, 0x1e,
+ 0xb0, 0xaf, 0xa5, 0xc6, 0x1b, 0x7b, 0x63, 0x78,
+ 0x61, 0x66, 0x72, 0x8, 0x92, 0x79, 0x8e, 0x79,
+ 0x78, 0x1a, 0x46, 0x63, 0x28, 0x53, 0x62, 0x1e,
+ 0x13, 0xcf, 0x97, 0x78, 0x91, 0x7c, 0x74, 0x1a,
+ 0x7a, 0x87, 0x7a, 0x87, 0x7b, 0x1e, 0x4d, 0x65,
+ 0xa5, 0x68, 0x1b, 0x13, 0x9f, 0x77, 0x77, 0x7c,
+ 0x76, 0x78, 0x9f, 0x7a, 0x9d, 0x1f, 0xb0, 0xbb,
+ 0xa7, 0xba, 0x1b, 0xe, 0x84, 0xf7, 0x68, 0x76,
+ 0xad, 0x76, 0xf7, 0x87, 0x77, 0xad, 0x77, 0x12,
+ 0xbe, 0xf7, 0x8a, 0x13, 0x98, 0xc0, 0xf7, 0xdb,
+ 0x15, 0x13, 0x58, 0x47, 0xc1, 0x54, 0xcf, 0xce,
+ 0xc1, 0xc3, 0xce, 0x1e, 0x13, 0xa8, 0xce, 0x55,
+ 0xc0, 0x47, 0x47, 0x56, 0x56, 0x48, 0x1e, 0xe,
+ 0xf8, 0xa8, 0x80, 0xef, 0x12, 0xc4, 0xf7, 0x3,
+ 0x35, 0xef, 0xf7, 0x3b, 0xef, 0x2c, 0xf7, 0x3,
+ 0xf7, 0x2c, 0xef, 0x49, 0xf7, 0x3, 0x13, 0xaa,
+ 0xdd, 0xb2, 0x15, 0x8f, 0xa, 0x13, 0xd2, 0xf7,
+ 0x9f, 0x16, 0x8f, 0xa, 0x13, 0xcc, 0xf7, 0xa0,
+ 0x16, 0x6f, 0xa0, 0x75, 0xa7, 0xa7, 0xa2, 0xa1,
+ 0xa7, 0xa7, 0x74, 0xa1, 0x6f, 0x6f, 0x76, 0x75,
+ 0x6f, 0x1e, 0xe, 0xf9, 0x17, 0xb0, 0xa, 0xcb,
+ 0xd0, 0xa, 0x75, 0xd0, 0xa, 0xb1, 0xd0, 0xa,
+ 0x13, 0xb5, 0xe0, 0xf9, 0x42, 0xf7, 0x9, 0x30,
+ 0xa, 0xfc, 0x27, 0xbc, 0x30, 0xa, 0xfb, 0xeb,
+ 0xf8, 0x11, 0x6a, 0xa, 0x1e, 0x13, 0xb6, 0xe0,
+ 0x2f, 0xa, 0x13, 0x6e, 0xe0, 0x53, 0xfc, 0x33,
+ 0x15, 0xb5, 0x6, 0xf8, 0xad, 0xf9, 0x48, 0x5,
+ 0x61, 0x6, 0xe, 0x73, 0xb0, 0xf8, 0x2, 0x1,
+ 0xbe, 0xf7, 0x7a, 0x3, 0xbe, 0xf7, 0x6c, 0x68,
+ 0xa, 0x96, 0x63, 0xef, 0x6c, 0xc8, 0x1f, 0xf7,
+ 0x12, 0xf7, 0x16, 0x9e, 0xaa, 0x9c, 0x69, 0xa,
+ 0xe, 0x73, 0xce, 0xa, 0xc7, 0xf7, 0x72, 0x3,
+ 0xf7, 0x5a, 0xf7, 0x73, 0x15, 0xfb, 0x12, 0xfb,
+ 0x16, 0x77, 0x6c, 0x7a, 0x44, 0xa, 0x80, 0xb4,
+ 0x27, 0xaa, 0x4e, 0x1f, 0xe, 0xfb, 0x52, 0x96,
+ 0x76, 0xf9, 0x42, 0x77, 0x1, 0x82, 0x81, 0x15,
+ 0xb7, 0x6, 0xf7, 0x36, 0xf9, 0x42, 0x5, 0x5c,
+ 0x6, 0xe, 0x8b, 0xb8, 0xf7, 0x65, 0xb1, 0xe1,
+ 0xb1, 0xf7, 0x6b, 0xb0, 0x1, 0xf7, 0x4e, 0xf7,
+ 0x1, 0xf7, 0x8a, 0xa2, 0x3, 0xce, 0xf7, 0x92,
+ 0x15, 0xfb, 0x41, 0xf4, 0x3a, 0xf6, 0xf6, 0xf7,
+ 0x12, 0xba, 0xdf, 0xbf, 0x1e, 0x7a, 0x94, 0x5,
+ 0x53, 0x63, 0x26, 0x64, 0x57, 0x1b, 0xfb, 0x13,
+ 0x58, 0xbf, 0xf7, 0x31, 0x1f, 0xf7, 0xac, 0x6,
+ 0x97, 0xb1, 0x5, 0xfb, 0xb7, 0x6, 0xa5, 0x94,
+ 0xab, 0x94, 0xa7, 0x1e, 0xf7, 0xb5, 0x6, 0x99,
+ 0xb1, 0x5, 0xfb, 0xb5, 0x6, 0xd5, 0x97, 0xe2,
+ 0xf7, 0x21, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x52,
+ 0x2e, 0x1f, 0xa2, 0xf7, 0x22, 0x6, 0x9e, 0x63,
+ 0x79, 0xa5, 0x2c, 0x1b, 0x52, 0xfb, 0x44, 0x53,
+ 0xfb, 0x58, 0x49, 0x1f, 0x28, 0x6, 0x7e, 0x65,
+ 0x5, 0xeb, 0x6, 0x83, 0x6e, 0x83, 0x6f, 0x89,
+ 0x6e, 0x8, 0x4a, 0x6, 0x7e, 0x65, 0x5, 0xe,
+ 0xf9, 0x3, 0xf7, 0x8d, 0x9f, 0x8a, 0x76, 0xf8,
+ 0x16, 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e,
+ 0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9,
+ 0xf7, 0x8d, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57,
+ 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd,
+ 0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f,
+ 0xe3, 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94,
+ 0x9c, 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6,
+ 0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3,
+ 0x77, 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f,
+ 0x83, 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7,
+ 0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96,
+ 0x6, 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb,
+ 0x72, 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57,
+ 0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57,
+ 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7,
+ 0xae, 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24,
+ 0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7,
+ 0xc9, 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7,
+ 0x77, 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f,
+ 0x83, 0x70, 0x5f, 0x87, 0x1e, 0xe, 0xf7, 0xd2,
+ 0xe1, 0xf7, 0x70, 0x15, 0xf8, 0x96, 0xb5, 0xfc,
+ 0x96, 0x6, 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf7,
+ 0x4, 0xf3, 0x76, 0xf8, 0x2c, 0xab, 0xf7, 0x7b,
+ 0xa1, 0x12, 0x13, 0xb8, 0xb8, 0xf8, 0x20, 0x15,
+ 0xe2, 0x6, 0x81, 0x75, 0x53, 0xfb, 0xb3, 0x74,
+ 0xfb, 0x3, 0x8, 0x55, 0x80, 0x70, 0x22, 0x54,
+ 0x1b, 0x77, 0x87, 0x8e, 0x95, 0x90, 0x8e, 0x92,
+ 0x8e, 0x93, 0x1f, 0x13, 0x78, 0x8d, 0x91, 0x8c,
+ 0x91, 0x91, 0x1a, 0x98, 0x82, 0xa3, 0x70, 0x70,
+ 0x7e, 0x68, 0x7c, 0x7a, 0x98, 0x5e, 0xcc, 0xf7,
+ 0x9, 0xc3, 0xf7, 0x34, 0xf7, 0xf, 0xa7, 0x1e,
+ 0xd3, 0xf7, 0xd4, 0x5, 0xf7, 0x2f, 0x6, 0x97,
+ 0x8f, 0x87, 0x86, 0x88, 0x8b, 0x87, 0x8a, 0x88,
+ 0x1f, 0x6e, 0x20, 0x53, 0xfb, 0x52, 0x66, 0x1a,
+ 0x6c, 0x9d, 0x77, 0xaa, 0xb8, 0xb7, 0xb9, 0xc6,
+ 0xb5, 0x1e, 0x7b, 0x94, 0x5, 0x78, 0x7b, 0x61,
+ 0x59, 0x78, 0x1b, 0x86, 0x84, 0x8d, 0x94, 0x9a,
+ 0xe3, 0xf7, 0xce, 0x92, 0xa7, 0x1f, 0x90, 0x9e,
+ 0x8c, 0x91, 0x8a, 0x8e, 0x86, 0x8e, 0x18, 0x85,
+ 0x80, 0x89, 0x89, 0x7b, 0x1f, 0x89, 0x7b, 0x75,
+ 0x89, 0x6f, 0x1b, 0xfb, 0x2a, 0x6, 0xf7, 0x16,
+ 0xb0, 0xa7, 0xf0, 0xea, 0x1b, 0x9f, 0x9a, 0x86,
+ 0x80, 0x86, 0x88, 0x87, 0x88, 0x85, 0x1f, 0x88,
+ 0x85, 0x87, 0x83, 0x7d, 0x1a, 0x70, 0x9b, 0x7d,
+ 0xa0, 0x9f, 0xa5, 0x99, 0xb2, 0xba, 0x55, 0xa1,
+ 0x5d, 0xfb, 0x37, 0x58, 0xfb, 0x31, 0x2b, 0x6f,
+ 0x1e, 0x34, 0x6, 0xe, 0xfb, 0x60, 0xa4, 0xf7,
+ 0x53, 0x76, 0xf8, 0x29, 0xab, 0xf7, 0x7c, 0xa1,
+ 0x12, 0xfb, 0x21, 0xd3, 0x17, 0xf7, 0x6c, 0xf8,
+ 0x40, 0x15, 0xd2, 0x9d, 0xb0, 0xf7, 0x35, 0xf7,
+ 0x1, 0x1b, 0x13, 0xf8, 0xa9, 0x97, 0x7d, 0x82,
+ 0x1f, 0x86, 0x7f, 0x81, 0x7d, 0x1a, 0x85, 0x8d,
+ 0x86, 0x8e, 0x85, 0x1e, 0x8e, 0x85, 0x8e, 0x84,
+ 0x89, 0x85, 0x67, 0xfb, 0x24, 0x18, 0xfb, 0xea,
+ 0x6b, 0x15, 0xe4, 0x6, 0x87, 0x79, 0x5f, 0xfb,
+ 0x69, 0x64, 0xfb, 0x4e, 0x8, 0x4e, 0x7e, 0x70,
+ 0x2a, 0x57, 0x1b, 0x75, 0x88, 0x8f, 0x94, 0x90,
+ 0x8e, 0x92, 0x8d, 0x92, 0x1f, 0x8d, 0x91, 0x8d,
+ 0x91, 0x92, 0x1a, 0x9e, 0x7c, 0x9c, 0x77, 0x6b,
+ 0x82, 0x6c, 0x77, 0x7e, 0x94, 0x5b, 0xd1, 0xea,
+ 0xce, 0xf7, 0x3, 0xf7, 0x47, 0xb3, 0x1e, 0xd0,
+ 0xf7, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0x7a, 0x35,
+ 0x4c, 0xfb, 0x67, 0x53, 0x1a, 0x6a, 0x9e, 0x78,
+ 0xa7, 0xad, 0xb0, 0x9c, 0xe3, 0xc9, 0x1e, 0x7b,
+ 0x94, 0x5, 0x70, 0x74, 0x67, 0x61, 0x79, 0x1b,
+ 0x86, 0x84, 0x8d, 0x95, 0x1f, 0x13, 0x30, 0xa1,
+ 0xf7, 0x1d, 0xf8, 0xc0, 0x94, 0xac, 0x1e, 0x8c,
+ 0x90, 0x8c, 0x90, 0x8f, 0x1a, 0x90, 0x89, 0x8f,
+ 0x88, 0x87, 0x85, 0x88, 0x89, 0x84, 0x1e, 0x88,
+ 0x84, 0x84, 0x88, 0x83, 0x1b, 0x83, 0x7d, 0x8e,
+ 0x8e, 0x7b, 0x1f, 0x8d, 0x7b, 0x7a, 0x8e, 0x7d,
+ 0x1b, 0xfb, 0x2e, 0x4a, 0xfb, 0x1e, 0xfb, 0x8,
+ 0x6b, 0x1f, 0x30, 0x6, 0xe, 0x79, 0x9d, 0xf8,
+ 0x3f, 0x98, 0xf7, 0x68, 0x9c, 0x91, 0x92, 0x6,
+ 0xfb, 0x64, 0x8f, 0xf8, 0x6c, 0x8d, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xaa, 0xa,
+ 0xd6, 0xb, 0xf8, 0x88, 0x14, 0xf7, 0xf9, 0x15,
+ 0xb0, 0x13, 0x0, 0xcd, 0x2, 0x0, 0x1, 0x0,
+ 0x13, 0x0, 0x17, 0x0, 0x31, 0x0, 0x34, 0x0,
+ 0x61, 0x0, 0x67, 0x0, 0x9c, 0x0, 0xa5, 0x0,
+ 0xb6, 0x0, 0xbf, 0x0, 0xf3, 0x1, 0xf, 0x1,
+ 0x1b, 0x1, 0x27, 0x1, 0x2c, 0x1, 0x4e, 0x1,
+ 0x53, 0x1, 0x59, 0x1, 0x6b, 0x1, 0x72, 0x1,
+ 0x88, 0x1, 0xa2, 0x1, 0xb8, 0x1, 0xdf, 0x1,
+ 0xf3, 0x2, 0x2, 0x2, 0x21, 0x2, 0x2a, 0x2,
+ 0x37, 0x2, 0x57, 0x2, 0x63, 0x2, 0x6e, 0x2,
+ 0x85, 0x2, 0x99, 0x2, 0xae, 0x2, 0xbd, 0x2,
+ 0xe3, 0x2, 0xea, 0x2, 0xef, 0x2, 0xf7, 0x3,
+ 0x37, 0x3, 0x53, 0x3, 0x62, 0x3, 0x71, 0x3,
+ 0x7e, 0x3, 0x8f, 0x3, 0xa0, 0x3, 0xae, 0x3,
+ 0xe7, 0x4, 0x1f, 0x4, 0x2c, 0x4, 0x32, 0x4,
+ 0x3f, 0x4, 0x44, 0x4, 0x4c, 0x4, 0x51, 0x4,
+ 0x55, 0x4, 0x61, 0x4, 0x6a, 0x4, 0x71, 0x4,
+ 0x7f, 0x4, 0x8d, 0x4, 0x9d, 0x4, 0xa7, 0x4,
+ 0xb1, 0x4, 0xbb, 0x4, 0xc8, 0x4, 0xd4, 0x4,
+ 0xf9, 0x5, 0x3, 0x5, 0xa, 0x5, 0x2d, 0x5,
+ 0x40, 0x5, 0x53, 0x5, 0x5e, 0x5, 0x64, 0x5,
+ 0x6c, 0x5, 0x8c, 0x5, 0xac, 0x5, 0xcc, 0x5,
+ 0xdd, 0x5, 0xe2, 0x5, 0xec, 0x5, 0xf6, 0x6,
+ 0x2, 0x6, 0x1e, 0x6, 0x26, 0x6, 0x36, 0x6,
+ 0x46, 0x6, 0x55, 0x6, 0x64, 0x6, 0x6d, 0x6,
+ 0x76, 0x6, 0x7b, 0x6, 0x8b, 0x6, 0x9b, 0x6,
+ 0x9f, 0x6, 0xa7, 0x6, 0xaf, 0x6, 0xc3, 0x6,
+ 0xd6, 0x6, 0xe2, 0x6, 0xe8, 0x6, 0xec, 0x6,
+ 0xf7, 0x7, 0xa, 0x7, 0x1d, 0x7, 0x22, 0x7,
+ 0x2d, 0x7, 0x36, 0x7, 0x48, 0x7, 0x5a, 0x7,
+ 0x5f, 0x7, 0x67, 0x7, 0x6f, 0x7, 0x75, 0x7,
+ 0x86, 0x7, 0x97, 0x7, 0xa1, 0x7, 0xab, 0x7,
+ 0xb5, 0x7, 0xbc, 0x7, 0xc1, 0x7, 0xc6, 0x7,
+ 0xcb, 0x7, 0xcf, 0x7, 0xd3, 0x7, 0xd7, 0x7,
+ 0xe3, 0x7, 0xee, 0x7, 0xf3, 0x7, 0xfc, 0x8,
+ 0x7, 0x8, 0x16, 0x8, 0x19, 0x8, 0x22, 0x8,
+ 0x26, 0x8, 0x2d, 0x8, 0x33, 0x8, 0x3a, 0x8,
+ 0x41, 0x8, 0x46, 0x8, 0x4b, 0x8, 0x59, 0x8,
+ 0x67, 0x8, 0x75, 0x8, 0x83, 0x8, 0x91, 0x8,
+ 0x9f, 0x8, 0xab, 0x8, 0xaf, 0x8, 0xb3, 0x8,
+ 0xc0, 0x8, 0xcd, 0x8, 0xda, 0x8, 0xe7, 0x8,
+ 0xf4, 0x8, 0xfc, 0x9, 0x4, 0x9, 0xb, 0x9,
+ 0x10, 0x9, 0x1c, 0x9, 0x28, 0x9, 0x34, 0x9,
+ 0x3a, 0x9, 0x3e, 0x9, 0x42, 0x9, 0x4d, 0x9,
+ 0x55, 0x9, 0x60, 0x9, 0x6b, 0x9, 0x6f, 0x9,
+ 0x76, 0x9, 0x7d, 0x9, 0x84, 0x9, 0x8b, 0x9,
+ 0x90, 0x9, 0x95, 0x9, 0x9a, 0x9, 0xa4, 0x9,
+ 0xae, 0x9, 0xb8, 0x9, 0xbb, 0x9, 0xbf, 0x9,
+ 0xc8, 0x9, 0xd1, 0x9, 0xda, 0x9, 0xe3, 0x9,
+ 0xec, 0x9, 0xf5, 0x9, 0xfe, 0xa, 0x7, 0xa,
+ 0x10, 0xa, 0x19, 0xa, 0x1f, 0xa, 0x25, 0xa,
+ 0x2b, 0xa, 0x31, 0xa, 0x37, 0xa, 0x3b, 0xa,
+ 0x41, 0xa, 0x46, 0xa, 0x4a, 0xa, 0x4e, 0xa,
+ 0x52, 0x70, 0xa1, 0x75, 0xa6, 0xa6, 0xa1, 0xa1,
+ 0xa6, 0xa6, 0x75, 0xa1, 0x70, 0x70, 0x75, 0x75,
+ 0x70, 0x1e, 0xb, 0x20, 0xa, 0x25, 0xa, 0x61,
+ 0xa, 0x71, 0xb5, 0xb6, 0xad, 0xaf, 0xd5, 0xc7,
+ 0x1e, 0x38, 0xa, 0x47, 0x87, 0x7b, 0x52, 0x5,
+ 0x89, 0x6, 0xa4, 0x6a, 0xb2, 0x5f, 0xa, 0x1e,
+ 0xb, 0x15, 0x21, 0xa, 0x15, 0xfb, 0x52, 0xf7,
+ 0x1a, 0x54, 0xe0, 0xae, 0xa, 0xf7, 0x84, 0x4f,
+ 0xa, 0xfb, 0x6e, 0xfb, 0x71, 0x1e, 0xf4, 0x16,
+ 0xd8, 0xeb, 0xf7, 0xdd, 0xf7, 0x5e, 0xef, 0xaa,
+ 0x48, 0xfb, 0x17, 0x2e, 0x2b, 0xfb, 0xdb, 0xfb,
+ 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x1a, 0xd9, 0x1e,
+ 0xb, 0xf7, 0x5c, 0x16, 0x20, 0xa, 0xe, 0x15,
+ 0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, 0xf7, 0x1d,
+ 0xf7, 0x49, 0xf7, 0xf, 0xcd, 0x6c, 0xdd, 0xfb,
+ 0x8, 0xfb, 0x26, 0xfb, 0x28, 0xfb, 0x35, 0xfb,
+ 0x27, 0x1e, 0xdf, 0x8a, 0x15, 0xc9, 0xe6, 0xf7,
+ 0x76, 0xf7, 0x4, 0xb8, 0xa4, 0x7d, 0xfb, 0x5,
+ 0x5a, 0x3c, 0xfb, 0x7e, 0xfb, 0x6, 0x59, 0x6d,
+ 0xaa, 0xe6, 0x1e, 0xb, 0x35, 0xa, 0x83, 0x68,
+ 0x7c, 0x19, 0x45, 0xa, 0xb, 0x36, 0xa, 0xaa,
+ 0xa2, 0x7c, 0x4d, 0x2e, 0x2c, 0xfb, 0x67, 0x21,
+ 0x70, 0x6a, 0x9d, 0xc0, 0x1e, 0xb, 0x3a, 0xa,
+ 0xeb, 0xa, 0x37, 0xa, 0xd2, 0xa, 0xb, 0xf7,
+ 0x88, 0x9b, 0x6, 0x58, 0x8f, 0x7c, 0xa1, 0xa6,
+ 0x1a, 0x9e, 0x92, 0xa1, 0x90, 0x9f, 0x1e, 0xf5,
+ 0xf8, 0x1b, 0xa3, 0xe1, 0x90, 0xa0, 0xce, 0x94,
+ 0x19, 0x93, 0xa, 0xbc, 0x85, 0x9c, 0x76, 0x6f,
+ 0x1a, 0x79, 0x87, 0x76, 0x85, 0x76, 0x1e, 0xfb,
+ 0x0, 0xfc, 0x1b, 0x73, 0x36, 0x87, 0x77, 0x4a,
+ 0x81, 0x19, 0xb, 0x72, 0xa, 0x70, 0xa8, 0xd8,
+ 0x9d, 0x90, 0x42, 0xa, 0x79, 0x87, 0x9a, 0x97,
+ 0x8d, 0x8c, 0x94, 0xe6, 0xf7, 0xfb, 0x1f, 0x56,
+ 0x81, 0x59, 0x82, 0x59, 0x85, 0x8, 0xb, 0x3f,
+ 0xa, 0x5, 0x84, 0x64, 0x2c, 0x79, 0x71, 0x1b,
+ 0x3e, 0xa, 0xb, 0x3d, 0xa, 0xb7, 0x70, 0xad,
+ 0x58, 0x5b, 0xa, 0x1e, 0x54, 0xa, 0xb, 0x2b,
+ 0xa, 0x5d, 0xa, 0xb, 0xe5, 0x4d, 0xb9, 0x58,
+ 0xfb, 0x1, 0x3a, 0xfb, 0x11, 0x27, 0x1e, 0xc9,
+ 0x5a, 0x15, 0xd1, 0xc0, 0xf7, 0x4c, 0xd6, 0xb5,
+ 0x94, 0x65, 0x6f, 0x4e, 0x56, 0xfb, 0x4f, 0x3e,
+ 0x6a, 0x7b, 0xa9, 0xa9, 0x1e, 0xb, 0x6a, 0xa,
+ 0x2f, 0xa, 0xb, 0x15, 0xb2, 0x6, 0x39, 0xa,
+ 0xb, 0x4e, 0xa, 0x69, 0x6c, 0x97, 0xb0, 0x91,
+ 0x8b, 0x91, 0x8d, 0x92, 0x1f, 0x8e, 0x97, 0x98,
+ 0x3c, 0xa, 0xb, 0xf7, 0xd2, 0xf7, 0x1f, 0x22,
+ 0xa, 0xb, 0x15, 0x32, 0xa, 0x7e, 0x80, 0xfb,
+ 0x2e, 0x74, 0xa, 0xf7, 0x2f, 0xa9, 0x7d, 0x4f,
+ 0x7e, 0x8a, 0x7d, 0x8a, 0x7a, 0x41, 0xa, 0xe,
+ 0x1e, 0x7b, 0xf7, 0x8a, 0x9b, 0x7, 0x51, 0x90,
+ 0x86, 0xa0, 0x7f, 0xd1, 0x2c, 0xf8, 0xc0, 0x18,
+ 0x71, 0x6, 0xfb, 0xce, 0xfc, 0xb3, 0x5a, 0x35,
+ 0x76, 0xb, 0x6e, 0x8e, 0x32, 0xef, 0xc7, 0xc0,
+ 0xa9, 0xf7, 0xe, 0xde, 0x1e, 0xfb, 0x6b, 0x6b,
+ 0x15, 0xe5, 0xe5, 0xf7, 0x70, 0xf7, 0x9, 0xb,
+ 0x7b, 0x7, 0xb1, 0xa9, 0x7a, 0x5f, 0x79, 0x2f,
+ 0xfb, 0xd6, 0x82, 0x6c, 0x1f, 0x5f, 0x7e, 0x58,
+ 0xfb, 0x1e, 0xfb, 0x1e, 0x1b, 0x4b, 0x40, 0xab,
+ 0xe4, 0xc1, 0xf4, 0xf7, 0xe8, 0x97, 0xb9, 0x1f,
+ 0xa9, 0x93, 0xa4, 0xa2, 0xc5, 0x1b, 0xb, 0x7f,
+ 0x95, 0x5, 0x5f, 0x5e, 0x77, 0x72, 0x7c, 0xec,
+ 0xa, 0x91, 0x92, 0xaa, 0xe7, 0xf7, 0xe9, 0x8e,
+ 0x97, 0x1f, 0xb, 0xf7, 0x1d, 0xf3, 0xdd, 0x23,
+ 0x5, 0xaf, 0x6, 0x33, 0xf7, 0x3d, 0x5, 0x5a,
+ 0x6, 0xb, 0x15, 0xc5, 0x86, 0x9c, 0x7f, 0x67,
+ 0x59, 0x27, 0xfb, 0xae, 0x7c, 0xa, 0xf7, 0x2d,
+ 0xd2, 0xe3, 0xf7, 0x19, 0xb2, 0x1e, 0xf5, 0xf8,
+ 0x7, 0x95, 0xae, 0x97, 0x9c, 0xc6, 0x96, 0x19,
+ 0xb, 0x53, 0xa, 0x2e, 0xa, 0x13, 0x78, 0x62,
+ 0xa, 0xb, 0xb4, 0xb9, 0xf7, 0x42, 0x8, 0xf7,
+ 0x37, 0x8b, 0x86, 0x5a, 0x40, 0xa, 0xb, 0xe5,
+ 0xae, 0xd9, 0xe1, 0xc1, 0x1b, 0x9e, 0x98, 0x84,
+ 0x64, 0x83, 0x81, 0xfb, 0x10, 0xfb, 0x62, 0x61,
+ 0x1f, 0x84, 0x75, 0x15, 0xa7, 0x8f, 0x5, 0xf7,
+ 0x36, 0xa2, 0xed, 0xdc, 0xda, 0x1a, 0xb, 0x7b,
+ 0x7, 0xc2, 0x90, 0x7c, 0x76, 0x1f, 0x6f, 0x3f,
+ 0x4b, 0xa, 0xb, 0x4a, 0xa, 0x8f, 0x99, 0x1f,
+ 0xe3, 0xf7, 0xd6, 0x88, 0x8d, 0xb, 0x7b, 0x88,
+ 0x7b, 0x87, 0x7c, 0x1f, 0x9f, 0x86, 0xcf, 0xf7,
+ 0x7c, 0x79, 0x8f, 0x81, 0x75, 0x82, 0x78, 0x82,
+ 0x7d, 0x19, 0x6c, 0x75, 0xb, 0x63, 0xa, 0xdb,
+ 0x8f, 0x5d, 0x50, 0x79, 0x1f, 0xfb, 0x9, 0xfc,
+ 0x40, 0x7a, 0x4d, 0x76, 0x7a, 0x5a, 0x82, 0x19,
+ 0xb, 0x1f, 0xda, 0xf7, 0xbf, 0x5, 0x41, 0x6,
+ 0x64, 0x20, 0x75, 0x4c, 0x5a, 0x41, 0x8, 0x57,
+ 0x69, 0x4c, 0x2d, 0x60, 0x1b, 0xb, 0xb8, 0xb3,
+ 0xb0, 0xce, 0x96, 0x1f, 0x6f, 0x6, 0x76, 0x84,
+ 0x83, 0x74, 0x65, 0x1b, 0xb, 0x1a, 0x86, 0x8d,
+ 0x88, 0x91, 0x94, 0xd0, 0xc9, 0xa7, 0xab, 0x1e,
+ 0xaa, 0xa6, 0xbf, 0xb1, 0xa8, 0xa2, 0x8, 0x94,
+ 0x7, 0x84, 0x97, 0x5f, 0xc1, 0x7b, 0x9d, 0x8,
+ 0x9c, 0x7c, 0x56, 0xd9, 0x7e, 0x1b, 0x83, 0x8b,
+ 0x85, 0x89, 0xb, 0xf7, 0x76, 0xf7, 0x8a, 0x4c,
+ 0xa, 0xb, 0xf9, 0x54, 0x31, 0xa, 0xb, 0x9a,
+ 0x1a, 0x9d, 0x7c, 0x9c, 0x76, 0x80, 0xb, 0x12,
+ 0xf8, 0xf, 0xe5, 0x17, 0xf7, 0x9, 0xb8, 0x15,
+ 0xb2, 0xb3, 0xf7, 0x1c, 0xa4, 0xcb, 0x1e, 0xcf,
+ 0xa5, 0xc5, 0xb9, 0xba, 0x1b, 0xcc, 0x8c, 0x51,
+ 0x70, 0xfb, 0xb, 0x31, 0xfb, 0x4e, 0xfb, 0xe,
+ 0x72, 0x72, 0x96, 0xa5, 0x1f, 0x7d, 0x64, 0x15,
+ 0x7f, 0xa2, 0x9f, 0x86, 0xa4, 0x1b, 0xf7, 0x1e,
+ 0xf7, 0x34, 0xf7, 0x3a, 0xf7, 0x2f, 0xd3, 0x6d,
+ 0xc6, 0x32, 0x39, 0x52, 0x42, 0x68, 0xb, 0x75,
+ 0x74, 0x78, 0x77, 0x7b, 0x7a, 0x8, 0x40, 0x3a,
+ 0x7d, 0x74, 0x7d, 0x44, 0xa, 0x84, 0x9d, 0x5a,
+ 0xa1, 0x5a, 0x1f, 0x95, 0x73, 0x97, 0x74, 0x95,
+ 0x77, 0x8, 0xb, 0x15, 0x51, 0x62, 0x6e, 0x77,
+ 0x7f, 0x1b, 0x82, 0x84, 0x93, 0x92, 0x97, 0x97,
+ 0xb3, 0xb, 0xfb, 0x82, 0x5c, 0x1a, 0x79, 0x8b,
+ 0x5f, 0xba, 0xc3, 0xb7, 0xc2, 0xc6, 0xb2, 0x1e,
+ 0xb, 0x15, 0xf7, 0x29, 0xf7, 0x97, 0x5, 0x8c,
+ 0x6, 0xb7, 0xfb, 0x97, 0x5, 0xb, 0x74, 0x39,
+ 0x77, 0x37, 0x79, 0x1a, 0x7c, 0x8d, 0x66, 0xb8,
+ 0xbd, 0xa5, 0xa5, 0xe6, 0xca, 0x1e, 0xb, 0xf8,
+ 0x8f, 0x6, 0xc9, 0xf7, 0x36, 0x7b, 0x93, 0x5,
+ 0x28, 0x44, 0x60, 0x65, 0xfb, 0x55, 0x1b, 0xb,
+ 0xf7, 0x5d, 0xf7, 0x3c, 0xfb, 0x4, 0xd6, 0xfb,
+ 0xc, 0xfb, 0x47, 0xfb, 0x78, 0xb, 0x1, 0x85,
+ 0xf8, 0xf8, 0x3, 0x85, 0x16, 0xf8, 0x8d, 0x6,
+ 0xc1, 0xf7, 0x3c, 0x78, 0x8e, 0x5, 0x24, 0x5a,
+ 0x5c, 0x6b, 0xfb, 0x38, 0x1b, 0xfb, 0x2b, 0x6,
+ 0xf8, 0x77, 0xf8, 0xef, 0x5, 0x99, 0xfc, 0x7a,
+ 0x7, 0x5d, 0xfb, 0x26, 0x9e, 0x86, 0x5, 0xd0,
+ 0xad, 0xab, 0xb9, 0xf7, 0x2d, 0x1b, 0xf7, 0x35,
+ 0x6, 0xfc, 0x73, 0xfc, 0xef, 0x5, 0xb, 0x6e,
+ 0x8d, 0x6d, 0xb9, 0xc1, 0xae, 0xb9, 0xce, 0xbd,
+ 0x1e, 0x7d, 0x98, 0x5, 0x5c, 0x66, 0x72, 0x6b,
+ 0x77, 0x1b, 0x89, 0x7d, 0x8d, 0x9a, 0x1f, 0xa9,
+ 0xdb, 0xf7, 0x8b, 0xb6, 0x1a, 0xb5, 0x74, 0xa3,
+ 0x5d, 0x38, 0x2f, 0xfb, 0x1f, 0x41, 0x5c, 0x1e,
+ 0x89, 0x8d, 0xcb, 0xf7, 0x65, 0x88, 0x8d, 0x55,
+ 0x80, 0x55, 0x81, 0x55, 0x81, 0x19, 0xb, 0x7b,
+ 0xa, 0x67, 0x6, 0xfb, 0x22, 0x22, 0x31, 0xf4,
+ 0x5, 0x66, 0x6, 0xe, 0x15, 0x8e, 0x6, 0x4d,
+ 0xa, 0xb, 0x73, 0xa, 0x57, 0x5f, 0xb4, 0xc8,
+ 0x98, 0x8e, 0x98, 0x90, 0x99, 0x1f, 0xb, 0xf8,
+ 0x80, 0x31, 0xa, 0xb, 0x84, 0x1b, 0x75, 0x7d,
+ 0x7c, 0x77, 0x7a, 0xb, 0xa7, 0x80, 0x71, 0xa,
+ 0xb, 0x15, 0x20, 0xa, 0xb, 0xea, 0xa, 0xc7,
+ 0x9c, 0xa, 0xab, 0x69, 0x83, 0x5e, 0x83, 0x61,
+ 0xb, 0x7d, 0xa, 0xf7, 0x76, 0xaf, 0xf8, 0x2a,
+ 0x77, 0xb, 0xfb, 0x21, 0xfb, 0x36, 0x5c, 0xa,
+ 0xb, 0xfb, 0x3c, 0xfb, 0x23, 0x4c, 0xab, 0x3d,
+ 0xf4, 0xef, 0xe6, 0xe7, 0x9b, 0x96, 0xb, 0x7d,
+ 0x7, 0xb4, 0x9b, 0x81, 0x6e, 0x1f, 0x70, 0x42,
+ 0xfb, 0x86, 0x5f, 0x1a, 0xb, 0x9e, 0xa, 0xf7,
+ 0x3b, 0xf0, 0x9f, 0xa, 0x95, 0x97, 0x47, 0xa,
+ 0x7f, 0x82, 0x9d, 0xa, 0xb, 0x60, 0xfb, 0x19,
+ 0xfb, 0x2d, 0xfb, 0x4f, 0xfb, 0x27, 0xb, 0x15,
+ 0xa8, 0x6, 0xa7, 0x92, 0x9c, 0x9e, 0xa7, 0x1b,
+ 0xb, 0x15, 0x7b, 0x4e, 0x86, 0x75, 0x74, 0x1a,
+ 0x7a, 0x8b, 0xb, 0x5f, 0x9e, 0x7c, 0xaf, 0xe5,
+ 0xd5, 0xf7, 0x11, 0xf7, 0x5, 0xcf, 0x1e, 0xb,
+ 0x1f, 0xa0, 0x89, 0xaa, 0xf7, 0x2d, 0x5, 0xfc,
+ 0x85, 0x7b, 0x6, 0xb, 0x1b, 0x2e, 0x3c, 0x48,
+ 0x2a, 0x4a, 0x90, 0x80, 0xf7, 0x1e, 0xfb, 0x27,
+ 0x1f, 0xac, 0x68, 0xb0, 0x6c, 0x4b, 0x1a, 0x59,
+ 0x68, 0x39, 0x2d, 0x31, 0x53, 0xda, 0xe4, 0x93,
+ 0x8c, 0x90, 0x8c, 0x93, 0x1e, 0x77, 0x8d, 0x5,
+ 0xb, 0x66, 0xa, 0xa8, 0x1f, 0x80, 0xa7, 0x57,
+ 0xa, 0x77, 0xb, 0x60, 0xa, 0x9d, 0xa8, 0x80,
+ 0x80, 0xb, 0xf8, 0x64, 0xf7, 0x27, 0x15, 0xf7,
+ 0x4c, 0xf7, 0x49, 0x8d, 0x89, 0x8c, 0x8c, 0x51,
+ 0xfb, 0x48, 0x5, 0xfb, 0x45, 0x61, 0x15, 0xf7,
+ 0x3c, 0x6, 0x6b, 0x22, 0x5, 0xca, 0x6, 0xa9,
+ 0xf3, 0x5, 0xc5, 0x6, 0xb, 0x15, 0x92, 0x7f,
+ 0xb7, 0x55, 0x9b, 0x79, 0x8, 0x7a, 0x9a, 0xc0,
+ 0x3d, 0x98, 0x1b, 0x93, 0x8b, 0x91, 0x8d, 0xb,
+ 0x1a, 0x90, 0x89, 0x8e, 0x85, 0x82, 0x46, 0x4d,
+ 0x6f, 0x6b, 0x1e, 0x6c, 0x70, 0x57, 0x65, 0x6e,
+ 0x74, 0x8, 0xb, 0x15, 0x45, 0xb9, 0x50, 0xd4,
+ 0xde, 0xf0, 0xed, 0xf7, 0xc, 0xb, 0x94, 0x7a,
+ 0x5, 0x59, 0xa, 0xb, 0x1b, 0x41, 0x7a, 0x47,
+ 0x65, 0x81, 0x1f, 0xb, 0x1b, 0xf7, 0x19, 0xd1,
+ 0xf3, 0xe9, 0xcd, 0x77, 0xb3, 0x2e, 0xe6, 0x1f,
+ 0x35, 0xe1, 0x7e, 0xa2, 0xba, 0x1a, 0xce, 0xbe,
+ 0xac, 0xc2, 0xf7, 0xd, 0x8f, 0x22, 0x52, 0x1e,
+ 0x9d, 0x88, 0x5, 0xb, 0xf7, 0x5b, 0x8b, 0xaf,
+ 0xf8, 0xfd, 0x77, 0x1, 0x83, 0xf8, 0xcb, 0x3,
+ 0x83, 0x16, 0xf8, 0x91, 0x6, 0xc5, 0xf7, 0x47,
+ 0x77, 0x91, 0x5, 0xfb, 0x26, 0x49, 0x3a, 0x88,
+ 0xfb, 0xd, 0x1b, 0xb, 0x1f, 0x7a, 0x99, 0x5,
+ 0x5c, 0x5b, 0x45, 0x44, 0xfb, 0x5, 0x1b, 0xfb,
+ 0xb, 0x54, 0xde, 0xf7, 0x17, 0xf7, 0x27, 0xf1,
+ 0xf7, 0x86, 0xf7, 0x5c, 0xf7, 0x23, 0x96, 0xfb,
+ 0x1a, 0x6f, 0x1f, 0xb, 0xf7, 0xb, 0xf7, 0xac,
+ 0xf8, 0x66, 0xf7, 0xb, 0xaf, 0x77, 0xa5, 0x66,
+ 0x71, 0x80, 0x76, 0x7d, 0xb, 0x9d, 0x1b, 0x43,
+ 0xa, 0xb, 0x7d, 0x94, 0x5, 0x5f, 0x68, 0x6f,
+ 0x68, 0x78, 0x1b, 0xb, 0x7f, 0x97, 0x5, 0x62,
+ 0x59, 0x61, 0x69, 0x55, 0x1b, 0xb, 0x1b, 0xbc,
+ 0xf7, 0x40, 0x5, 0xd5, 0xa0, 0x82, 0x98, 0xe0,
+ 0x1b, 0xb, 0x2d, 0x68, 0x1e, 0x98, 0x83, 0x5,
+ 0x96, 0x94, 0xa4, 0xb5, 0xc5, 0x1b, 0xba, 0xa8,
+ 0x67, 0x6d, 0x7c, 0x8a, 0x67, 0x2f, 0x32, 0x1f,
+ 0xfb, 0x19, 0xfb, 0x16, 0x5, 0xb, 0x80, 0xbc,
+ 0x70, 0x76, 0xf8, 0x41, 0xa1, 0xb, 0xb7, 0xa,
+ 0xfb, 0x2, 0xf7, 0x22, 0xc5, 0xa, 0x78, 0x92,
+ 0x56, 0xa, 0x9f, 0x7a, 0x80, 0xa, 0xb7, 0xa,
+ 0xfb, 0x2, 0xf7, 0x23, 0xc5, 0xa, 0x78, 0x91,
+ 0x56, 0xa, 0x9f, 0x7b, 0x80, 0xa, 0x82, 0x9c,
+ 0x5, 0x52, 0x6f, 0x42, 0x4f, 0x48, 0x1a, 0x60,
+ 0xa4, 0x6b, 0xad, 0x93, 0xb, 0x65, 0x1a, 0x70,
+ 0x61, 0x5a, 0x72, 0x6e, 0x1e, 0x63, 0x69, 0x7e,
+ 0x82, 0x7b, 0x1b, 0xb, 0x15, 0xb9, 0x6, 0xf7,
+ 0x37, 0xf7, 0x3d, 0x5, 0xb, 0x26, 0x1a, 0xfb,
+ 0x6, 0xf7, 0x3, 0x54, 0xf1, 0xb, 0xf7, 0x92,
+ 0xa0, 0x76, 0xb, 0x9e, 0xa, 0xf7, 0x38, 0xee,
+ 0x9f, 0xa, 0x98, 0x99, 0x47, 0xa, 0x7c, 0x80,
+ 0x9d, 0xa, 0xb, 0x9e, 0xa, 0xf7, 0x3a, 0xf0,
+ 0x9f, 0xa, 0x96, 0x97, 0x47, 0xa, 0x7e, 0x82,
+ 0x9d, 0xa, 0xb, 0x90, 0x87, 0x1f, 0xe, 0x1f,
+ 0xc3, 0xf2, 0x5, 0xf7, 0x70, 0x6, 0xb, 0x1a,
+ 0x66, 0x54, 0x69, 0x77, 0x7e, 0x1e, 0xb, 0x95,
+ 0x84, 0x5, 0x94, 0x95, 0xa2, 0xa6, 0xb4, 0x1b,
+ 0x9d, 0xaa, 0x7e, 0x63, 0x51, 0x31, 0x71, 0x52,
+ 0x82, 0x1f, 0xe, 0x15, 0x6c, 0xa3, 0x73, 0xaa,
+ 0xaa, 0xa4, 0xa3, 0xaa, 0xaa, 0x72, 0xa4, 0x6c,
+ 0x6c, 0x73, 0x72, 0x6c, 0x1e, 0xe, 0x74, 0xa8,
+ 0xa8, 0xa3, 0xa2, 0xa8, 0xa8, 0x73, 0xa3, 0x6e,
+ 0x6e, 0xb, 0xc7, 0xf4, 0xf8, 0x41, 0xf4, 0xb,
+ 0x9a, 0xa, 0x77, 0xb, 0x5a, 0xa, 0xf7, 0x78,
+ 0x77, 0x1, 0x58, 0xf8, 0xfb, 0x3, 0xb, 0x99,
+ 0x16, 0xd6, 0x6, 0xb4, 0xf7, 0x1c, 0x99, 0xb6,
+ 0xb8, 0xd0, 0x8, 0xc3, 0xb0, 0xc9, 0xe1, 0xbb,
+ 0x1b, 0xb, 0x15, 0x6d, 0xa4, 0x72, 0xa9, 0xa9,
+ 0xa4, 0xa4, 0xa9, 0xa9, 0x72, 0xa4, 0x6d, 0x6d,
+ 0x72, 0x72, 0x6d, 0x1e, 0xb, 0x8a, 0x16, 0x4e,
+ 0xa, 0xb, 0x15, 0xbe, 0x6, 0xf8, 0x5b, 0xf9,
+ 0x42, 0x5, 0x58, 0x6, 0xb, 0xf7, 0x92, 0x8b,
+ 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0xb, 0xa3, 0x9e,
+ 0x9e, 0xa3, 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78,
+ 0x78, 0x73, 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb,
+ 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+ 0x1e, 0xb, 0x1, 0x86, 0xa, 0x3, 0xb, 0xf8,
+ 0x5d, 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xb, 0x1,
+ 0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x3, 0xb, 0x9b,
+ 0xfb, 0x8b, 0x7b, 0x7, 0xb, 0x94, 0xb6, 0x5,
+ 0x54, 0x6, 0xda, 0xf7, 0x97, 0x5, 0x67, 0x6,
+ 0xfb, 0xa3, 0xfb, 0x97, 0x5, 0xb, 0x6, 0x89,
+ 0x90, 0xf7, 0x6, 0xf7, 0x2, 0x5, 0xdb, 0xd8,
+ 0x9e, 0xa3, 0xb3, 0x1a, 0xb4, 0x64, 0xb, 0x1b,
+ 0x76, 0x7a, 0x7a, 0x76, 0x61, 0xb6, 0x88, 0x93,
+ 0xb, 0x1a, 0x74, 0x9a, 0x7d, 0xa4, 0xa4, 0xa1,
+ 0xa7, 0xa7, 0xb, 0x7a, 0x7, 0x8e, 0x97, 0x92,
+ 0x8c, 0x9a, 0x1b, 0xc4, 0xb, 0x87, 0xa, 0xf7,
+ 0x87, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf9, 0x21,
+ 0xb, 0xf7, 0x4f, 0x9b, 0x6, 0xb, 0xce, 0x1a,
+ 0xb6, 0x72, 0xb, 0x85, 0x85, 0x1e, 0xb, 0x15,
+ 0xae, 0x6, 0xb, 0x5, 0x96, 0x92, 0xb, 0x82,
+ 0xba, 0x6f, 0x76, 0xf9, 0x37, 0xa9, 0xa, 0xe5,
+ 0x13, 0xb8, 0xb, 0x76, 0xa, 0xf7, 0x73, 0x77,
+ 0x12, 0x9c, 0xdf, 0x13, 0x78, 0xb, 0xf8, 0x99,
+ 0x66, 0xa, 0xb, 0x97, 0xa, 0xaa, 0x72, 0xbd,
+ 0x37, 0xfb, 0x28, 0xb, 0x80, 0xa0, 0xf8, 0x2e,
+ 0xa0, 0xf7, 0x73, 0x77, 0x92, 0xa, 0xb, 0x72,
+ 0x7e, 0x6c, 0xaf, 0x83, 0xb2, 0xf7, 0x10, 0xc6,
+ 0xe0, 0xce, 0xcd, 0x60, 0x9c, 0xb, 0x62, 0xa,
+ 0xe, 0x1a, 0x56, 0x3c, 0xfb, 0x1b, 0x60, 0x45,
+ 0x1e, 0xb, 0x77, 0x90, 0xa, 0xb, 0x77, 0x12,
+ 0xb5, 0xd8, 0xf7, 0x3e, 0xb, 0xb6, 0xa, 0xb4,
+ 0xf9, 0xa, 0xb, 0xfb, 0x17, 0xf7, 0x17, 0xfb,
+ 0x17, 0xb, 0xc7, 0x4f, 0xf2, 0x8c, 0x77, 0x12,
+ 0xb, 0xf8, 0x82, 0x9e, 0xa, 0xb, 0xf7, 0x74,
+ 0xf7, 0x58, 0xb, 0x1b, 0xbe, 0xb6, 0xb0, 0xb1,
+ 0xab, 0x72, 0x90, 0x82, 0x74, 0x7f, 0x7d, 0x7a,
+ 0xb, 0x7f, 0x9f, 0x89, 0x76, 0xf7, 0xe5, 0x9f,
+ 0xf7, 0xcc, 0x9f, 0x8e, 0x77, 0x12, 0xb, 0x83,
+ 0x16, 0xf7, 0x91, 0x6, 0xf7, 0xba, 0xf7, 0x35,
+ 0xf7, 0x4d, 0xf7, 0x5e, 0xb, 0x1b, 0xf7, 0x45,
+ 0xad, 0xfb, 0xf, 0x26, 0x4e, 0x6a, 0xfb, 0xc8,
+ 0xfb, 0xcf, 0xb, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf,
+ 0xa9, 0x6d, 0x67, 0x67, 0x6d, 0x6e, 0x67, 0x1e,
+ 0xb, 0x1a, 0x6a, 0x7b, 0x5b, 0x53, 0x3a, 0x7b,
+ 0xe7, 0xb7, 0x84, 0x1e, 0x7b, 0x6, 0xb, 0x1a,
+ 0x6f, 0x8f, 0x69, 0xb7, 0xc9, 0xb2, 0xbb, 0xd8,
+ 0xbe, 0x1e, 0xe, 0xf8, 0x1, 0x79, 0xb, 0x15,
+ 0xaa, 0x6, 0xb, 0xb0, 0xf7, 0x5b, 0x5, 0x76,
+ 0x6, 0x81, 0x86, 0x7b, 0x7f, 0x6e, 0x1b, 0xb,
+ 0x9c, 0x7c, 0x15, 0x9d, 0x6, 0x98, 0x8f, 0x9c,
+ 0x9f, 0xa7, 0x1b, 0x9a, 0xb, 0x89, 0x87, 0x15,
+ 0x94, 0x82, 0x5, 0x96, 0x98, 0x9a, 0x92, 0x9c,
+ 0x1b, 0xb, 0x9f, 0xf7, 0x1f, 0x5, 0x7d, 0x6,
+ 0x83, 0x86, 0x7b, 0x81, 0x7a, 0x1b, 0xb, 0x7d,
+ 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82, 0xfb, 0xb,
+ 0x86, 0x54, 0x8, 0xb, 0x1a, 0xb0, 0xc2, 0xad,
+ 0x9f, 0x98, 0x1e, 0xb, 0x97, 0x76, 0xa9, 0x76,
+ 0xf8, 0x1a, 0xbe, 0xb, 0xb6, 0xa, 0xac, 0xf8,
+ 0xfe, 0xac, 0xb, 0xf7, 0x4, 0x4b, 0xcb, 0xb,
+ 0x15, 0xf7, 0x7b, 0x6, 0xac, 0xda, 0x80, 0x93,
+ 0x5, 0x76, 0x7f, 0xb, 0x9b, 0x7e, 0x15, 0x9b,
+ 0x6, 0x96, 0x91, 0x99, 0x95, 0x99, 0x1b, 0xb,
+ 0x9e, 0x91, 0x7d, 0x79, 0x1f, 0x63, 0x41, 0xfb,
+ 0x88, 0x73, 0x1a, 0xb, 0x9b, 0xfb, 0xa5, 0x7b,
+ 0x7, 0xb, 0x5, 0xa2, 0x79, 0xb, 0xed, 0xf1,
+ 0xed, 0xb, 0xb3, 0x17, 0xf7, 0x9c, 0xd3, 0x15,
+ 0x6a, 0xf7, 0x44, 0x5, 0xb, 0xea, 0xa, 0xca,
+ 0x9c, 0xa, 0xa8, 0x69, 0xb, 0xcf, 0xa2, 0xac,
+ 0xa0, 0xb9, 0x1a, 0xbc, 0x59, 0xa3, 0x5b, 0xb,
+ 0x96, 0xfb, 0xb0, 0x7, 0x6c, 0xfb, 0x7, 0x9b,
+ 0x87, 0x5, 0xb, 0x87, 0xa, 0x1, 0xb, 0xf1,
+ 0xe5, 0xf8, 0x4e, 0xf7, 0x17, 0xb, 0x1e, 0x9b,
+ 0xfb, 0x83, 0x7b, 0x7, 0xb, 0xc5, 0x76, 0xf8,
+ 0x2, 0x77, 0x1, 0xb, 0xd9, 0x16, 0xf7, 0xb5,
+ 0x9b, 0x6, 0xb, 0xc9, 0xf7, 0x47, 0xc9, 0xb,
+ 0xf7, 0x3d, 0x77, 0x1, 0xb, 0x9b, 0xfb, 0xa5,
+ 0x7, 0xb, 0xf7, 0xf, 0x15, 0x4c, 0x5a, 0x76,
+ 0x6f, 0x72, 0x1b, 0xb, 0xf8, 0xef, 0xaf, 0x89,
+ 0x77, 0x12, 0xcd, 0xf7, 0x4, 0xb, 0x1b, 0xfb,
+ 0x79, 0xfb, 0x45, 0xfb, 0x71, 0xfb, 0x55, 0xb,
+ 0x6c, 0xa, 0xe, 0x3c, 0x95, 0x76, 0xb, 0x15,
+ 0xd2, 0xf7, 0x8c, 0x5, 0x97, 0x8e, 0x92, 0xb,
+ 0xf8, 0x1d, 0x96, 0x76, 0xaa, 0x76, 0xf4, 0xb5,
+ 0xb, 0x66, 0x56, 0x1b, 0x7b, 0xf7, 0x61, 0x9a,
+ 0x7, 0xb, 0xf7, 0x45, 0xf7, 0x16, 0x9d, 0x9f,
+ 0x86, 0x7c, 0xb, 0x82, 0x30, 0x79, 0x87, 0x6d,
+ 0x1e, 0x78, 0x7, 0xb, 0xb6, 0xfb, 0x30, 0x76,
+ 0xf9, 0xf4, 0x77, 0x12, 0xb, 0x90, 0x94, 0x7d,
+ 0x1f, 0x7a, 0x6e, 0x5, 0x7e, 0xb, 0xf7, 0x49,
+ 0xfb, 0x39, 0x77, 0xe2, 0xed, 0x12, 0xb, 0x76,
+ 0xf9, 0x40, 0x77, 0x1, 0xf4, 0xcd, 0x3, 0xb,
+ 0xab, 0xfb, 0x2d, 0xa6, 0xf9, 0x8e, 0xa6, 0x1,
+ 0xb, 0x30, 0xa7, 0x1f, 0x9b, 0x55, 0xb, 0x77,
+ 0x1, 0xbc, 0xd6, 0x3, 0xb, 0x16, 0xf7, 0x5a,
+ 0x9b, 0x6, 0xb, 0x67, 0x6e, 0xa8, 0xaf, 0x1f,
+ 0xb, 0x7b, 0xf7, 0xa5, 0x9b, 0x7, 0xb, 0x15,
+ 0x9b, 0xa, 0xb, 0x9b, 0xfb, 0x51, 0x7b, 0x7,
+ 0xb, 0xac, 0xf7, 0x97, 0xac, 0xb, 0xc4, 0xa7,
+ 0xd4, 0xb, 0x9b, 0xfb, 0x5b, 0xb, 0x1b, 0x83,
+ 0x85, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
new file mode 100644
index 0000000000..44062cd210
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
@@ -0,0 +1,7097 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifMMFontData [113417] = {
+ 0x80, 0x01, 0xD6, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+ 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+ 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25,
+ 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x54,
+ 0x75, 0x65, 0x20, 0x4F, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x30, 0x31, 0x3A, 0x33, 0x34, 0x3A,
+ 0x32, 0x32, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67,
+ 0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30,
+ 0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F,
+ 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65,
+ 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69,
+ 0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+ 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C,
+ 0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65,
+ 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50,
+ 0x69, 0x74, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+ 0x6E, 0x20, 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65,
+ 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35,
+ 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41,
+ 0x6C, 0x6C, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66,
+ 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73,
+ 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31,
+ 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D,
+ 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69,
+ 0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x31, 0x31, 0x30, 0x20, 0x30, 0x20, 0x5D,
+ 0x5B, 0x37, 0x39, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x31, 0x30, 0x30, 0x20, 0x30,
+ 0x20, 0x5D, 0x5B, 0x39, 0x30, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66,
+ 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x20, 0x5B, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68,
+ 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F,
+ 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56,
+ 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x32, 0x37, 0x30, 0x32, 0x20, 0x30, 0x2E,
+ 0x31, 0x30, 0x34, 0x38, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x30, 0x2E, 0x31, 0x37,
+ 0x34, 0x36, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61,
+ 0x6D, 0x65, 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32,
+ 0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35,
+ 0x20, 0x7B, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+ 0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F,
+ 0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C,
+ 0x61, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71,
+ 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x33, 0x35, 0x20, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65,
+ 0x72, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38,
+ 0x20, 0x2F, 0x61, 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E,
+ 0x67, 0x6C, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F,
+ 0x70, 0x61, 0x72, 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74,
+ 0x65, 0x72, 0x69, 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33,
+ 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+ 0x34, 0x20, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x34, 0x35, 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72,
+ 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77,
+ 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68,
+ 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F,
+ 0x66, 0x6F, 0x75, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20,
+ 0x2F, 0x66, 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34,
+ 0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35,
+ 0x20, 0x2F, 0x73, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x35, 0x36, 0x20, 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C,
+ 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C,
+ 0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F,
+ 0x65, 0x71, 0x75, 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32,
+ 0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x36, 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x36, 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39,
+ 0x20, 0x2F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F,
+ 0x46, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x37, 0x36, 0x20, 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37,
+ 0x20, 0x2F, 0x4D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F,
+ 0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x38, 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x38, 0x34, 0x20, 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35,
+ 0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F,
+ 0x56, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x39, 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61,
+ 0x63, 0x6B, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x39, 0x33, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63,
+ 0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x39, 0x35, 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x30, 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x30, 0x34, 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+ 0x36, 0x20, 0x2F, 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37,
+ 0x20, 0x2F, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20,
+ 0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F,
+ 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x31, 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x32, 0x30, 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32,
+ 0x32, 0x20, 0x2F, 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33,
+ 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36,
+ 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67,
+ 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F,
+ 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65,
+ 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70,
+ 0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C,
+ 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75,
+ 0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65,
+ 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F,
+ 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65,
+ 0x6E, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35,
+ 0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D,
+ 0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20,
+ 0x2F, 0x73, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x35, 0x35, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20,
+ 0x2F, 0x6F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20,
+ 0x2F, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F,
+ 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F,
+ 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33,
+ 0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65,
+ 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62,
+ 0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x36, 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65,
+ 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20,
+ 0x2F, 0x63, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E,
+ 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20,
+ 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69,
+ 0x63, 0x61, 0x6C, 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x34, 0x20, 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72,
+ 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F,
+ 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75,
+ 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61,
+ 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31,
+ 0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32,
+ 0x20, 0x2F, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63,
+ 0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x38, 0x34, 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70,
+ 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38,
+ 0x36, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69,
+ 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72,
+ 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20,
+ 0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x39, 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74,
+ 0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20,
+ 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41,
+ 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+ 0x34, 0x20, 0x2F, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C,
+ 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F,
+ 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C,
+ 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F,
+ 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x30, 0x31, 0x20, 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+ 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20,
+ 0x2F, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F,
+ 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+ 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F,
+ 0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20,
+ 0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x31, 0x30, 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69,
+ 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x31, 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65,
+ 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20,
+ 0x2F, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55,
+ 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+ 0x39, 0x20, 0x2F, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65,
+ 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x31, 0x20, 0x2F, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E,
+ 0x64, 0x62, 0x6C, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34,
+ 0x20, 0x2F, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75,
+ 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72,
+ 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20,
+ 0x2F, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20,
+ 0x2F, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65,
+ 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69,
+ 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69,
+ 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33,
+ 0x37, 0x20, 0x2F, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+ 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F,
+ 0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F,
+ 0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x34, 0x34, 0x20, 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69,
+ 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20,
+ 0x2F, 0x6F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61,
+ 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F,
+ 0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+ 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20,
+ 0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72,
+ 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79,
+ 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74,
+ 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+ 0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65,
+ 0x6E, 0x64, 0x20, 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x30, 0x34, 0x38, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20,
+ 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69,
+ 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72,
+ 0x69, 0x78, 0x20, 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30,
+ 0x20, 0x30, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30,
+ 0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D,
+ 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x35, 0x37, 0x20,
+ 0x2D, 0x32, 0x35, 0x37, 0x20, 0x31, 0x31, 0x39, 0x34, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65,
+ 0x6E, 0x64, 0x20, 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65,
+ 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B,
+ 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, 0x33, 0x36, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20,
+ 0x2D, 0x32, 0x30, 0x31, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32,
+ 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x35, 0x38, 0x32, 0x20, 0x31, 0x32, 0x31, 0x37, 0x20, 0x31, 0x32, 0x37, 0x34, 0x20, 0x31,
+ 0x39, 0x32, 0x32, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+ 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30,
+ 0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6D, 0x73, 0x20, 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64,
+ 0x0D, 0x25, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64,
+ 0x69, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+ 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65,
+ 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73,
+ 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+ 0x64, 0x75, 0x70, 0x0D, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61,
+ 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72,
+ 0x61, 0x74, 0x6F, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F,
+ 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+ 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+ 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D,
+ 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61,
+ 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x61, 0x62, 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D,
+ 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x2F, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66,
+ 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69,
+ 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44,
+ 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D,
+ 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72,
+ 0x61, 0x79, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x63, 0x76, 0x69, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+ 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+ 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61,
+ 0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F,
+ 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D,
+ 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65,
+ 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72,
+ 0x61, 0x6C, 0x6C, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74,
+ 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x2D, 0x31, 0x20, 0x31, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x30, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70,
+ 0x6F, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31,
+ 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x20, 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64,
+ 0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+ 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20,
+ 0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+ 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F,
+ 0x72, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61,
+ 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70,
+ 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+ 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71,
+ 0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54,
+ 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20,
+ 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E,
+ 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+ 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C,
+ 0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63,
+ 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65,
+ 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B,
+ 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F,
+ 0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D,
+ 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20,
+ 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79,
+ 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74,
+ 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B,
+ 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20,
+ 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20,
+ 0x7B, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+ 0x0D, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20,
+ 0x7B, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20,
+ 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30,
+ 0x20, 0x67, 0x74, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+ 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E,
+ 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x64, 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B,
+ 0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65,
+ 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20,
+ 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63,
+ 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42,
+ 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E,
+ 0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66,
+ 0x62, 0x66, 0x20, 0x7B, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33,
+ 0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F,
+ 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20,
+ 0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+ 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F,
+ 0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F,
+ 0x6E, 0x74, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74,
+ 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61,
+ 0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x31, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x36, 0x38, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x30, 0x30,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x38, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62,
+ 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74,
+ 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31,
+ 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33,
+ 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75,
+ 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75,
+ 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24,
+ 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61,
+ 0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65,
+ 0x72, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6D, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B,
+ 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B,
+ 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65,
+ 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20,
+ 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D,
+ 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x20, 0x7B, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65,
+ 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E,
+ 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77,
+ 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F,
+ 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67,
+ 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67,
+ 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63,
+ 0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68,
+ 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,
+ 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20,
+ 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25,
+ 0x29, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+ 0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74,
+ 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20,
+ 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66,
+ 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62,
+ 0x65, 0x67, 0x69, 0x6E, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B,
+ 0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70,
+ 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+ 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+ 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73,
+ 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F,
+ 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20,
+ 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C,
+ 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+ 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63,
+ 0x74, 0x6F, 0x72, 0x0D, 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+ 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64,
+ 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66,
+ 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x64, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x0B, 0x8F,
+ 0x01, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1,
+ 0x86, 0xDC, 0xE0, 0x96, 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE,
+ 0xFF, 0x7D, 0x2F, 0xBF, 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24,
+ 0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78,
+ 0xAB, 0x3D, 0xE1, 0x9F, 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33,
+ 0xE9, 0xDB, 0xE0, 0x38, 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B,
+ 0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C,
+ 0x00, 0xE4, 0x42, 0xE8, 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35,
+ 0xF9, 0x21, 0x6D, 0x42, 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62,
+ 0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB,
+ 0x9A, 0x65, 0xBA, 0xF1, 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43,
+ 0x8F, 0xC1, 0xE7, 0x37, 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6,
+ 0x91, 0xE6, 0xE8, 0x3B, 0x37, 0x22, 0xC0, 0x07, 0x14, 0xDC, 0xBC, 0xEA, 0xA1, 0xDC, 0x3D, 0x22,
+ 0x98, 0x3B, 0x35, 0x61, 0x6A, 0xD7, 0xF1, 0x03, 0x35, 0x0B, 0x4A, 0x40, 0xB2, 0xAA, 0xE5, 0x0E,
+ 0xF0, 0x94, 0x6C, 0x77, 0xC5, 0x67, 0x73, 0x0D, 0x0D, 0xE6, 0x76, 0xA6, 0x95, 0x13, 0x0A, 0xBE,
+ 0xC8, 0xC7, 0xB8, 0xC4, 0x6B, 0xFA, 0xBC, 0xDA, 0xDD, 0x88, 0x2C, 0x74, 0x58, 0x58, 0x9B, 0x2B,
+ 0xEA, 0x87, 0xE1, 0x23, 0x2C, 0x60, 0x58, 0x0C, 0x62, 0x35, 0xB7, 0xD7, 0xE8, 0xC6, 0x6A, 0x2A,
+ 0x72, 0x90, 0x1F, 0x3D, 0x0D, 0x76, 0x59, 0x30, 0x0E, 0x7E, 0x04, 0xFF, 0xDE, 0x4A, 0xA6, 0xD8,
+ 0x88, 0x25, 0x75, 0x76, 0x30, 0xCF, 0x8C, 0x9E, 0x8E, 0xA4, 0x14, 0x10, 0x7F, 0x2F, 0xC4, 0xA8,
+ 0x0F, 0xCA, 0xAF, 0xCB, 0x54, 0x39, 0x87, 0x1A, 0x81, 0x71, 0xFB, 0xA5, 0x08, 0x17, 0x4F, 0x53,
+ 0xB8, 0xEC, 0xE2, 0xD3, 0xBF, 0xBD, 0xBA, 0x93, 0x75, 0xFF, 0x8F, 0xB9, 0x66, 0x12, 0x02, 0x21,
+ 0x87, 0x6D, 0xB0, 0xDC, 0x2D, 0x37, 0x22, 0xB7, 0x88, 0xB4, 0xD3, 0x8F, 0x8B, 0x24, 0xEF, 0x76,
+ 0xF3, 0xB4, 0x91, 0x58, 0x95, 0xFF, 0x41, 0xD8, 0xFA, 0xFA, 0xD8, 0xE8, 0x68, 0xA9, 0xA8, 0x5B,
+ 0x59, 0x2C, 0xF0, 0x30, 0xA1, 0xD0, 0x44, 0x8A, 0x81, 0xF5, 0xE6, 0x92, 0x1E, 0xAE, 0xE8, 0x26,
+ 0xA4, 0xD9, 0xB7, 0x05, 0x5A, 0x9C, 0xA1, 0xC7, 0x98, 0xAA, 0xFA, 0x25, 0x91, 0x11, 0x4D, 0x61,
+ 0xCB, 0x50, 0x2E, 0xFC, 0xFC, 0x44, 0x63, 0x02, 0x08, 0xCB, 0xA9, 0x17, 0x10, 0x3B, 0xC3, 0xA1,
+ 0x2A, 0x60, 0xB1, 0x79, 0x84, 0x95, 0x83, 0xD0, 0xB1, 0xF1, 0xDC, 0x9F, 0xBE, 0xB2, 0xBC, 0x90,
+ 0xD1, 0xE4, 0xF2, 0x42, 0xD5, 0x08, 0x0B, 0xD4, 0xB1, 0x4C, 0x73, 0x8D, 0x0C, 0xD1, 0x69, 0xC8,
+ 0x1E, 0xB6, 0x84, 0x5F, 0xD9, 0x2D, 0xAB, 0x2A, 0x6B, 0xBB, 0x48, 0x3F, 0xB6, 0xFB, 0x08, 0x2F,
+ 0x57, 0x11, 0xAB, 0x42, 0x54, 0xC9, 0xD7, 0xB1, 0xF8, 0x28, 0xBA, 0xCD, 0x68, 0xF9, 0x0D, 0xE0,
+ 0xD1, 0x26, 0xCE, 0xA0, 0x24, 0x56, 0x63, 0xB7, 0xA1, 0xC6, 0x85, 0xD8, 0x55, 0x18, 0x60, 0x25,
+ 0x55, 0x0B, 0xC6, 0x9B, 0xC4, 0x28, 0x0C, 0x37, 0xE0, 0x9A, 0x74, 0x52, 0x0D, 0x76, 0x5F, 0x41,
+ 0xDC, 0xEA, 0xD8, 0x35, 0x1A, 0xB7, 0x49, 0xC3, 0x5C, 0x6D, 0xD0, 0x83, 0x7A, 0x4F, 0xC1, 0xCB,
+ 0x12, 0xAB, 0x27, 0x4B, 0xCF, 0x7F, 0xF8, 0x01, 0xC1, 0x8D, 0x13, 0x34, 0x62, 0xFF, 0xE0, 0x5C,
+ 0x56, 0xCE, 0x4E, 0x3D, 0x34, 0x37, 0xAC, 0xFB, 0xB0, 0x3E, 0x05, 0xA6, 0x2B, 0xF6, 0x2C, 0xA2,
+ 0x46, 0x65, 0x6A, 0xAF, 0x3E, 0xD6, 0x5A, 0x92, 0x22, 0xFF, 0x51, 0xF3, 0x19, 0x27, 0x39, 0xB3,
+ 0x32, 0x7F, 0x94, 0x7A, 0x6B, 0x56, 0xF8, 0xB8, 0xA5, 0x70, 0xB1, 0x3F, 0x15, 0x15, 0xF6, 0x61,
+ 0x4B, 0x88, 0xB0, 0x12, 0xE0, 0x4F, 0x6F, 0xE9, 0xCB, 0x2C, 0x72, 0x01, 0xB1, 0xDB, 0x85, 0x78,
+ 0x3C, 0x0F, 0xD2, 0x3B, 0x54, 0x8E, 0x29, 0x21, 0x66, 0xBA, 0x80, 0xC6, 0x05, 0x5E, 0xD1, 0xD9,
+ 0x93, 0xCD, 0x63, 0xA0, 0x95, 0xBB, 0x26, 0xA3, 0x36, 0x12, 0x2D, 0x1C, 0xE4, 0xEA, 0x98, 0xE6,
+ 0xDC, 0x9F, 0xD6, 0x61, 0xF8, 0x71, 0x14, 0xFE, 0xF8, 0x10, 0xB9, 0x24, 0x36, 0xF9, 0xB3, 0x6C,
+ 0x0F, 0xC3, 0x28, 0x46, 0x43, 0x19, 0xAF, 0xA7, 0xB1, 0xEC, 0x4A, 0x88, 0x7C, 0xE7, 0x85, 0x81,
+ 0x23, 0x69, 0xF3, 0x21, 0x90, 0xEB, 0x3D, 0xB1, 0x73, 0x4A, 0xB2, 0xF2, 0x55, 0x30, 0xF8, 0x02,
+ 0x79, 0x76, 0x1D, 0xFB, 0x0A, 0x40, 0x06, 0x61, 0xCC, 0xCB, 0x47, 0x94, 0x1A, 0x74, 0x70, 0x8F,
+ 0x1B, 0x93, 0x16, 0x24, 0xAA, 0x32, 0xD4, 0xB0, 0xEE, 0xCA, 0xEE, 0x0D, 0x27, 0x71, 0x0D, 0xE8,
+ 0xCC, 0xD7, 0x2A, 0x28, 0xA5, 0xC4, 0xD8, 0xDD, 0x0B, 0x16, 0x74, 0xF7, 0xE3, 0x61, 0x06, 0x37,
+ 0x24, 0x1C, 0x00, 0x14, 0x0C, 0x32, 0x7F, 0x88, 0x75, 0xF9, 0x9B, 0xFA, 0x3B, 0xCA, 0xF6, 0x51,
+ 0xD2, 0xAB, 0xD5, 0x3F, 0x21, 0xCD, 0x51, 0x3D, 0x3D, 0xB4, 0x81, 0xF9, 0x33, 0x79, 0xE9, 0x62,
+ 0x9F, 0x93, 0x5F, 0xA8, 0x77, 0x26, 0x75, 0x01, 0x40, 0xD3, 0xE3, 0xBD, 0x68, 0x8D, 0x1B, 0xCC,
+ 0xE7, 0x79, 0xB2, 0x3E, 0x61, 0xB6, 0x00, 0xF0, 0x0A, 0x58, 0xF2, 0xC1, 0x4C, 0x5A, 0xA4, 0x86,
+ 0xD4, 0xCA, 0xCB, 0x15, 0xCC, 0xD1, 0x16, 0x74, 0x70, 0xF3, 0xCB, 0xBA, 0x0E, 0x8A, 0xDB, 0xEB,
+ 0x4F, 0x3D, 0x0C, 0x3C, 0xFE, 0x40, 0x7D, 0x46, 0xC0, 0x0E, 0x0E, 0x18, 0x64, 0x69, 0xAB, 0xEF,
+ 0x00, 0x68, 0x83, 0x95, 0xFF, 0x32, 0xF3, 0x13, 0x78, 0x8C, 0x1E, 0xF9, 0xA8, 0xE8, 0x2D, 0x5F,
+ 0x04, 0xB8, 0x15, 0x22, 0x76, 0xDD, 0x46, 0xCF, 0x69, 0xA4, 0xCE, 0x5B, 0x20, 0x77, 0xA0, 0x22,
+ 0x24, 0xE5, 0xDE, 0xB8, 0xF3, 0x44, 0x5B, 0xC9, 0xEF, 0x47, 0xFD, 0x3A, 0x02, 0xAF, 0x31, 0x6C,
+ 0x02, 0x4A, 0x02, 0x3C, 0x65, 0x5A, 0x0B, 0x63, 0xB0, 0x11, 0xBB, 0x07, 0x3C, 0xFC, 0xFA, 0xAD,
+ 0x93, 0x46, 0x11, 0x6D, 0x68, 0xFF, 0xB7, 0xC7, 0x58, 0x2F, 0x7C, 0x23, 0x62, 0xD7, 0xD9, 0xF9,
+ 0x7A, 0x8A, 0xD3, 0x11, 0x58, 0xAC, 0x43, 0x0D, 0xA0, 0x77, 0x8D, 0x88, 0xD5, 0x34, 0xD1, 0xB9,
+ 0x2E, 0x4A, 0x8C, 0xDC, 0xA0, 0x71, 0xB9, 0xB2, 0x18, 0xC5, 0x74, 0x1E, 0x48, 0x9E, 0x70, 0x0A,
+ 0x7E, 0x9B, 0x71, 0xFA, 0xC7, 0x4D, 0x3C, 0x6E, 0x19, 0x88, 0xF0, 0xE2, 0xA5, 0x99, 0x3D, 0x85,
+ 0xBB, 0xE1, 0xDA, 0x82, 0x7B, 0xA9, 0xBA, 0x59, 0x0E, 0x03, 0x26, 0x3B, 0x83, 0xC8, 0x81, 0x36,
+ 0x70, 0xA4, 0x11, 0x97, 0x97, 0xB6, 0x47, 0x7D, 0x81, 0x02, 0x45, 0x1C, 0x76, 0x33, 0x98, 0x84,
+ 0xFE, 0xFE, 0x65, 0xDE, 0x37, 0x31, 0xE7, 0xD9, 0x6F, 0xDC, 0xAC, 0xC1, 0x1C, 0x1F, 0xA4, 0x08,
+ 0x98, 0x47, 0xD3, 0x53, 0xF9, 0x24, 0x6E, 0x26, 0x99, 0x7C, 0xF2, 0xCF, 0x2A, 0xC8, 0xCC, 0xAD,
+ 0x17, 0x09, 0xE3, 0x1B, 0x66, 0xAC, 0x24, 0x6F, 0xE0, 0x88, 0x14, 0xC4, 0x8A, 0xF2, 0xFA, 0x93,
+ 0xE9, 0x48, 0xB5, 0xA4, 0x52, 0xF9, 0xDE, 0x54, 0xF5, 0xF4, 0x20, 0x95, 0x45, 0xCE, 0x37, 0x2E,
+ 0x9E, 0x0A, 0xC7, 0x89, 0xF2, 0x00, 0x64, 0x6D, 0xBC, 0xAF, 0x9F, 0x52, 0xBC, 0xA0, 0x17, 0xE3,
+ 0x20, 0x42, 0xAB, 0xBF, 0xFB, 0x2A, 0x7F, 0x51, 0xAC, 0xCC, 0x40, 0xEF, 0x6D, 0xF2, 0xBC, 0x3D,
+ 0xE2, 0xDC, 0x99, 0x0C, 0x2D, 0xBC, 0x47, 0x1D, 0x98, 0x02, 0x0B, 0xB2, 0xE2, 0xA2, 0x03, 0x47,
+ 0x3C, 0x17, 0x69, 0xD6, 0x09, 0xA4, 0x8B, 0x9F, 0x63, 0x40, 0xD8, 0x5F, 0x67, 0xB3, 0x95, 0x28,
+ 0x16, 0xAF, 0x67, 0x97, 0x3A, 0x67, 0x29, 0x67, 0x3C, 0xF1, 0x9D, 0x24, 0x34, 0xE3, 0x47, 0x14,
+ 0xC6, 0x94, 0xA0, 0x1F, 0xB7, 0x64, 0x9D, 0x7E, 0x38, 0xB8, 0x70, 0xD2, 0x4A, 0x74, 0x54, 0xA4,
+ 0x64, 0x34, 0x27, 0x3B, 0xB7, 0x98, 0x18, 0x07, 0x1F, 0x4E, 0x00, 0x86, 0x91, 0x6A, 0x71, 0x09,
+ 0x72, 0x6B, 0x42, 0x4F, 0x11, 0x62, 0xDC, 0x0B, 0x15, 0x0C, 0x74, 0x0B, 0x6D, 0xFF, 0xC2, 0x28,
+ 0x98, 0x97, 0x33, 0x65, 0xD6, 0xBB, 0x83, 0x4E, 0x4B, 0xE2, 0xCF, 0x7E, 0x98, 0x4B, 0xAD, 0x55,
+ 0xF2, 0x1A, 0xEF, 0x15, 0x05, 0xA6, 0xB6, 0xF4, 0xDD, 0x97, 0xAA, 0x81, 0x6D, 0x84, 0x86, 0x17,
+ 0xA0, 0xA5, 0x1D, 0xC3, 0x8C, 0xEA, 0x28, 0xCE, 0x69, 0xCC, 0x56, 0x15, 0xFA, 0xD3, 0xEC, 0x12,
+ 0xCD, 0x8A, 0x98, 0xD5, 0x13, 0xE9, 0x72, 0xBF, 0x01, 0xCE, 0xBA, 0xF7, 0xCA, 0x85, 0x8C, 0x64,
+ 0x55, 0x60, 0xBA, 0x61, 0xF0, 0xDE, 0x97, 0xD9, 0x15, 0xCF, 0xE2, 0x9C, 0xA3, 0x9A, 0x5F, 0x9F,
+ 0xFE, 0xD3, 0xC7, 0x5A, 0xF4, 0x44, 0x69, 0x7F, 0x63, 0x41, 0x97, 0x33, 0xD7, 0x41, 0xDF, 0x9B,
+ 0x3F, 0x03, 0x23, 0x4A, 0x84, 0x7B, 0x4E, 0xB9, 0x94, 0x3D, 0xBD, 0x32, 0x56, 0x1C, 0x47, 0x7A,
+ 0xF0, 0xED, 0x9D, 0x99, 0x24, 0x09, 0xC6, 0x50, 0xC0, 0x98, 0xEA, 0xFE, 0x70, 0x8B, 0xDF, 0xB8,
+ 0x5E, 0x7D, 0x64, 0x2C, 0xDC, 0xB5, 0x5F, 0xCA, 0xF6, 0x7B, 0x02, 0x88, 0xA2, 0x82, 0xD2, 0x14,
+ 0x0E, 0xA4, 0x14, 0x3B, 0x4A, 0x95, 0x14, 0x5E, 0xD9, 0xFB, 0x47, 0x5F, 0x36, 0x9F, 0x85, 0xC2,
+ 0x94, 0x15, 0xB9, 0xC0, 0x01, 0x08, 0x86, 0x75, 0x1E, 0x88, 0x2D, 0x5A, 0x39, 0xC1, 0xDE, 0xC1,
+ 0x8B, 0x32, 0xC4, 0xE7, 0x19, 0xA6, 0xFE, 0xFC, 0x62, 0xE9, 0xCF, 0x3E, 0x11, 0xD1, 0x5E, 0x24,
+ 0x66, 0x23, 0x5B, 0x8F, 0x42, 0x83, 0xD6, 0x3E, 0x2A, 0xE5, 0xF2, 0xE3, 0x6A, 0x69, 0x40, 0xBE,
+ 0xD4, 0xFA, 0x83, 0xC6, 0xE8, 0x2B, 0x35, 0xFE, 0x1A, 0xD1, 0xF3, 0x37, 0x9A, 0x88, 0xA0, 0xC9,
+ 0x55, 0x13, 0x4B, 0xC0, 0xEC, 0x45, 0xD7, 0x48, 0x16, 0x28, 0x99, 0xE4, 0x3B, 0x77, 0xF2, 0xB9,
+ 0x27, 0x34, 0x4F, 0xAB, 0x18, 0x87, 0x63, 0xE5, 0xF5, 0x68, 0x57, 0x9D, 0x5C, 0xAD, 0x53, 0xD7,
+ 0x25, 0xB3, 0x99, 0x5D, 0x70, 0xE0, 0xF6, 0x72, 0xBE, 0xD9, 0x5E, 0x82, 0xFB, 0xD0, 0x72, 0xF5,
+ 0x6E, 0x86, 0xEF, 0x7C, 0xD8, 0x23, 0x1E, 0x85, 0x20, 0x7C, 0xEA, 0x2C, 0x8E, 0x09, 0x2A, 0x9B,
+ 0x73, 0x62, 0xD3, 0x96, 0xAA, 0xE0, 0x45, 0x1E, 0x63, 0x57, 0xB7, 0x6A, 0xB7, 0xB8, 0xFE, 0x01,
+ 0x85, 0x93, 0xEB, 0x7B, 0x25, 0x41, 0xE5, 0x7D, 0xE5, 0x20, 0x50, 0x15, 0x92, 0x06, 0xFE, 0xFA,
+ 0x3F, 0x93, 0x16, 0xC5, 0x6F, 0x4A, 0xDF, 0xB3, 0xB9, 0x43, 0x17, 0x32, 0xAF, 0x81, 0x3B, 0x61,
+ 0x19, 0xDE, 0xCD, 0xBB, 0x7E, 0x24, 0x74, 0xDD, 0xEB, 0xAE, 0xEA, 0x64, 0x34, 0x59, 0x30, 0x31,
+ 0x84, 0x15, 0x77, 0x30, 0x0A, 0xB6, 0x5D, 0xD9, 0x3A, 0x47, 0xD2, 0x9D, 0xA9, 0x57, 0x6F, 0x1D,
+ 0x3E, 0x47, 0x82, 0xAD, 0x80, 0x4C, 0x11, 0x64, 0x4A, 0xA5, 0x28, 0xAE, 0xD3, 0x52, 0x13, 0x23,
+ 0xEF, 0x74, 0x9D, 0x05, 0xBD, 0xCA, 0x9D, 0xAF, 0x69, 0x55, 0xE8, 0x96, 0xDB, 0x35, 0x52, 0x75,
+ 0x0D, 0x7A, 0x19, 0x3E, 0xE9, 0x11, 0xF1, 0x84, 0x5E, 0xB5, 0x1F, 0xD8, 0xF4, 0xA3, 0x25, 0x2A,
+ 0x7F, 0xAF, 0x44, 0xD0, 0xAC, 0x7F, 0x9C, 0x87, 0xB1, 0x11, 0x48, 0x69, 0x9F, 0x3C, 0x60, 0xC4,
+ 0x38, 0x40, 0xBF, 0x43, 0xA2, 0xE4, 0x37, 0xC3, 0x7E, 0xB1, 0x51, 0x82, 0x93, 0xFE, 0x7F, 0xD1,
+ 0x30, 0xD8, 0xBF, 0xD8, 0x6D, 0x7A, 0xE8, 0x38, 0xFA, 0xE5, 0x4B, 0x42, 0x2C, 0x24, 0xF3, 0xA1,
+ 0x7D, 0xE3, 0xE7, 0x9A, 0x6B, 0x53, 0x3C, 0xAC, 0x00, 0x6A, 0xB5, 0xF9, 0x10, 0xD5, 0x3D, 0x11,
+ 0xE4, 0x1D, 0x51, 0xA2, 0x40, 0xC4, 0x48, 0xDC, 0x1C, 0x30, 0xA8, 0x1F, 0x89, 0xE2, 0x53, 0x25,
+ 0xF2, 0xDA, 0xE3, 0xA4, 0xD6, 0xBB, 0x72, 0x5A, 0x0F, 0x3F, 0x98, 0xE4, 0x27, 0xF2, 0xC6, 0x82,
+ 0x5B, 0x64, 0x8A, 0x3D, 0x29, 0x9A, 0xBF, 0x6A, 0x0D, 0x61, 0xA1, 0xCF, 0x4F, 0x00, 0xE0, 0xE2,
+ 0x9A, 0x45, 0xF7, 0xDB, 0x38, 0x0D, 0x38, 0x7C, 0x98, 0x20, 0xB6, 0xA8, 0x00, 0xFE, 0xB5, 0xCD,
+ 0xBB, 0xC2, 0x8A, 0xDF, 0xA3, 0x23, 0x87, 0x77, 0x7F, 0x33, 0x36, 0xB2, 0xC3, 0x90, 0xAA, 0x49,
+ 0x92, 0x71, 0xEB, 0xFE, 0xCD, 0x32, 0xD1, 0xAB, 0x22, 0xB3, 0xC6, 0x4B, 0x12, 0x7E, 0x53, 0xAA,
+ 0xCF, 0xC7, 0x01, 0xDA, 0x38, 0x2A, 0x0A, 0x54, 0xFC, 0x88, 0x41, 0x15, 0x04, 0x27, 0x02, 0x8C,
+ 0x0F, 0x6D, 0xC2, 0xCF, 0xDA, 0xF8, 0x3C, 0xF7, 0x58, 0xE2, 0x70, 0x1A, 0x7E, 0xBE, 0x39, 0xEE,
+ 0xC2, 0x7A, 0xD5, 0x52, 0x4B, 0x62, 0x84, 0xDE, 0x91, 0x46, 0xDC, 0x3A, 0x67, 0x4A, 0xE6, 0x4D,
+ 0x82, 0xFA, 0x60, 0xE2, 0x34, 0x26, 0x1A, 0xD8, 0x0D, 0xA1, 0x57, 0x62, 0x04, 0x38, 0x52, 0x4D,
+ 0xA6, 0x8B, 0xC2, 0x0E, 0xCE, 0x26, 0x28, 0x31, 0x53, 0xC6, 0x63, 0x5A, 0x75, 0x45, 0x65, 0xDA,
+ 0x4B, 0x8D, 0x77, 0xB0, 0x06, 0x28, 0x36, 0x43, 0x1D, 0xA3, 0xC7, 0x33, 0x28, 0x8D, 0x70, 0xB5,
+ 0x0D, 0x24, 0x25, 0x50, 0xA2, 0xEB, 0x50, 0x61, 0x98, 0x3D, 0x8C, 0xCD, 0xDC, 0x17, 0x3F, 0xE4,
+ 0xDD, 0x46, 0x3A, 0xD0, 0xA6, 0x78, 0xD7, 0x85, 0x63, 0xC8, 0x3A, 0x54, 0xDB, 0xD5, 0xB9, 0x7C,
+ 0x4B, 0xFD, 0x1E, 0xA2, 0xBD, 0x97, 0x22, 0x09, 0x06, 0x8F, 0xA5, 0x49, 0x06, 0x29, 0x71, 0x13,
+ 0x69, 0xCE, 0xEC, 0x75, 0xE9, 0x93, 0x58, 0x80, 0x05, 0xFF, 0xBF, 0x1D, 0x48, 0xCE, 0x34, 0xDC,
+ 0x03, 0x40, 0xB9, 0x6F, 0x40, 0x94, 0x2C, 0x30, 0xD0, 0x6F, 0x35, 0xC0, 0x46, 0xE5, 0xD1, 0xFF,
+ 0x44, 0x83, 0x2C, 0x6D, 0x6C, 0xB2, 0x04, 0xD8, 0xB0, 0x1E, 0x2C, 0xF8, 0x71, 0xA4, 0xA1, 0x60,
+ 0x23, 0x8F, 0x19, 0xF7, 0x58, 0x29, 0x42, 0x9F, 0x24, 0x18, 0x2B, 0xD3, 0xF0, 0x31, 0x45, 0xB1,
+ 0xA3, 0x5E, 0xA1, 0xC9, 0x52, 0xEE, 0xE6, 0xF5, 0x0A, 0xBB, 0xEB, 0x6B, 0x09, 0xE9, 0xA7, 0x84,
+ 0xB6, 0x1C, 0xE3, 0xA3, 0x0B, 0x7E, 0x8A, 0x0B, 0xD0, 0x4C, 0xE9, 0x50, 0x45, 0x34, 0x21, 0x1B,
+ 0x55, 0x0E, 0x12, 0x1A, 0x74, 0xDE, 0x28, 0xEB, 0x20, 0x66, 0x13, 0xBB, 0xEA, 0xC7, 0xDA, 0xCF,
+ 0xB4, 0x16, 0x57, 0x65, 0x0A, 0xAD, 0x98, 0xF7, 0x03, 0x1E, 0xF5, 0xD9, 0xFC, 0x3E, 0x59, 0xEC,
+ 0x7A, 0x2B, 0x46, 0xC0, 0x13, 0x19, 0xD8, 0xFD, 0xF7, 0x0D, 0x61, 0xFC, 0x41, 0x2A, 0x5C, 0xC7,
+ 0x84, 0x95, 0xEF, 0x31, 0x9F, 0x1F, 0x84, 0x53, 0x7E, 0xA8, 0x37, 0x04, 0x1D, 0x1D, 0x08, 0xD5,
+ 0xE5, 0x4B, 0x0C, 0x06, 0xCC, 0x14, 0x19, 0xA9, 0x4D, 0x75, 0x06, 0x49, 0x48, 0xC9, 0xDB, 0x3F,
+ 0x1B, 0xB1, 0x0D, 0x19, 0x71, 0xEB, 0x13, 0xE1, 0x26, 0xAF, 0xC0, 0xD9, 0x87, 0xC3, 0xD8, 0x68,
+ 0x8A, 0x3C, 0x96, 0x6B, 0xDE, 0x94, 0x3D, 0x60, 0x0B, 0x24, 0x8F, 0x0C, 0xE1, 0xA3, 0xA7, 0x05,
+ 0x40, 0xB7, 0x24, 0x35, 0x82, 0x45, 0xA0, 0xE0, 0x26, 0xD2, 0xFA, 0xAB, 0x59, 0x33, 0x4E, 0x95,
+ 0xD2, 0xFA, 0x72, 0x82, 0x2C, 0x00, 0x2F, 0xE0, 0xE5, 0x49, 0x16, 0x30, 0x0C, 0x3A, 0xC1, 0xDC,
+ 0x11, 0x70, 0x59, 0xF9, 0x98, 0x81, 0xBB, 0x9F, 0x60, 0xEB, 0xB0, 0xAD, 0x5B, 0x65, 0x7A, 0xC4,
+ 0x3E, 0xE7, 0x6A, 0x3D, 0xD2, 0x7D, 0x02, 0xD3, 0xA8, 0x98, 0xE5, 0xF1, 0xF5, 0xE1, 0xCF, 0xFA,
+ 0x71, 0x50, 0xAA, 0x8A, 0xB1, 0x43, 0xDC, 0x3A, 0x0E, 0xC2, 0x77, 0xF3, 0x95, 0x39, 0x82, 0x1D,
+ 0x4D, 0x88, 0xFD, 0xA6, 0x55, 0x02, 0x5C, 0x80, 0x1E, 0x84, 0x91, 0x5C, 0x7D, 0x63, 0x36, 0x42,
+ 0x68, 0xA8, 0x15, 0x72, 0x40, 0xC0, 0xF5, 0x52, 0xC8, 0x9B, 0xB8, 0xAD, 0x00, 0xCB, 0x4B, 0x0A,
+ 0x87, 0x54, 0x96, 0x48, 0x47, 0x7D, 0x39, 0xCA, 0x1D, 0xF0, 0x83, 0x63, 0x9A, 0x7F, 0xE9, 0xB5,
+ 0x5A, 0x11, 0x2F, 0x94, 0x30, 0x9F, 0x1D, 0xD6, 0xD5, 0x98, 0xCB, 0x80, 0x7B, 0x82, 0x2B, 0xC0,
+ 0xA0, 0x73, 0xBD, 0x17, 0x33, 0xE4, 0x3B, 0xE0, 0xE5, 0x20, 0x59, 0xE6, 0x94, 0xF8, 0xD5, 0x41,
+ 0x21, 0x2D, 0xAD, 0xF0, 0x10, 0x08, 0x79, 0x60, 0x2F, 0x7E, 0x26, 0x82, 0xE8, 0xA2, 0x41, 0x79,
+ 0xE7, 0xF6, 0x06, 0xC0, 0xB2, 0x59, 0xF9, 0x5B, 0x1B, 0x20, 0x12, 0xA0, 0xF5, 0xD8, 0x0F, 0x1F,
+ 0xA6, 0x96, 0x0A, 0x69, 0x3B, 0x2B, 0xD1, 0x95, 0x18, 0x7F, 0xA4, 0x1B, 0x4B, 0xE4, 0x82, 0xDA,
+ 0x50, 0x41, 0xA6, 0x30, 0x0D, 0xC0, 0x68, 0xEC, 0xA9, 0x43, 0x2E, 0x17, 0x13, 0x0B, 0x21, 0x00,
+ 0x42, 0xF5, 0xCE, 0x2F, 0x10, 0x81, 0x3D, 0x6F, 0xDB, 0xDE, 0x81, 0xD1, 0x10, 0xDE, 0x4E, 0x02,
+ 0x98, 0x85, 0x29, 0x81, 0x59, 0xC4, 0x24, 0x82, 0x25, 0xF0, 0x3D, 0x93, 0xB3, 0x08, 0xC9, 0xC5,
+ 0x3D, 0xA1, 0x97, 0xAE, 0x2D, 0xE3, 0x93, 0xAC, 0xBB, 0xB2, 0x06, 0xC6, 0x54, 0x58, 0x1C, 0x9A,
+ 0x37, 0x6B, 0xDE, 0xEA, 0x63, 0xDE, 0x3F, 0x07, 0x76, 0xFF, 0x8E, 0x41, 0x4D, 0x2E, 0x04, 0x54,
+ 0x7D, 0xDF, 0x7F, 0x26, 0x6A, 0xD2, 0x5D, 0xBB, 0x19, 0x5F, 0x2B, 0x09, 0xF4, 0x15, 0x7D, 0x5E,
+ 0xB5, 0x48, 0xEE, 0xF1, 0x17, 0xC0, 0x32, 0xE6, 0x14, 0x2C, 0x2D, 0xF3, 0xDD, 0xDA, 0xFD, 0xC5,
+ 0x2D, 0x05, 0xB3, 0x7D, 0x69, 0x42, 0xF4, 0x4F, 0xDC, 0xEE, 0x27, 0x6C, 0x10, 0x59, 0xCB, 0x63,
+ 0xF6, 0xE9, 0xC2, 0x3B, 0x8A, 0xD0, 0xA8, 0x10, 0x70, 0xF1, 0x35, 0x2B, 0x3D, 0x8E, 0xAE, 0xBD,
+ 0xD3, 0xB7, 0xE2, 0x9E, 0x3A, 0xD7, 0xBD, 0xF5, 0x38, 0x32, 0x90, 0x4F, 0xE2, 0x42, 0xB7, 0x73,
+ 0xE0, 0xFE, 0x83, 0xEA, 0x25, 0x87, 0xFB, 0xB7, 0xE7, 0x31, 0x66, 0xEB, 0xAA, 0xCC, 0x40, 0x4F,
+ 0x35, 0x18, 0x21, 0xFF, 0x31, 0x3C, 0x61, 0x8C, 0xEC, 0xB4, 0x20, 0xD0, 0xFE, 0x1C, 0x81, 0x53,
+ 0xB0, 0x6F, 0x76, 0xF7, 0x0F, 0x7F, 0x51, 0x51, 0x40, 0xAE, 0x35, 0x84, 0x84, 0xA9, 0x35, 0x9C,
+ 0xC0, 0x3C, 0x0D, 0x7E, 0x73, 0x5B, 0xA7, 0xE6, 0x28, 0x62, 0x6C, 0x53, 0x68, 0x2D, 0x72, 0xA1,
+ 0x0F, 0x63, 0xCB, 0x79, 0x79, 0xE5, 0xA5, 0x24, 0xCF, 0x6A, 0x60, 0x6C, 0x0E, 0xF3, 0x52, 0x5B,
+ 0xDF, 0xA4, 0x26, 0x7C, 0xC2, 0xF3, 0xD1, 0x20, 0x8A, 0x8C, 0x80, 0x04, 0x77, 0xCE, 0x0C, 0xE0,
+ 0xA3, 0x8C, 0xE5, 0xC2, 0xDE, 0x60, 0xC1, 0x35, 0x18, 0xA8, 0x94, 0xCF, 0xEA, 0x81, 0xD8, 0xE9,
+ 0x22, 0x93, 0xDB, 0x7A, 0xAA, 0x51, 0xAD, 0xE5, 0x44, 0x6B, 0x31, 0xFF, 0x04, 0xE1, 0xB6, 0xE3,
+ 0x55, 0xFA, 0xEF, 0x17, 0xE7, 0x94, 0x37, 0xDF, 0x89, 0xD5, 0x29, 0x07, 0x96, 0xC7, 0x76, 0xE5,
+ 0x21, 0xD7, 0xE2, 0xB3, 0xA4, 0x77, 0x6F, 0xE4, 0x1E, 0xAD, 0x03, 0x64, 0xF5, 0x38, 0x33, 0xC5,
+ 0x74, 0x2E, 0xA1, 0xF1, 0xBB, 0xAF, 0x1B, 0x24, 0x8B, 0xEE, 0x46, 0x86, 0x25, 0xAD, 0x95, 0x5E,
+ 0x28, 0x1F, 0xE9, 0x2C, 0xCD, 0xC9, 0x85, 0xFC, 0x5B, 0x74, 0x3F, 0xF3, 0xF9, 0x2B, 0x5C, 0x23,
+ 0x5C, 0xD0, 0xBA, 0xBA, 0x7E, 0x8C, 0xA0, 0xA9, 0x56, 0xA0, 0x55, 0xA5, 0x36, 0x7D, 0xB8, 0x8B,
+ 0xA6, 0x46, 0x62, 0x1C, 0x1E, 0x7E, 0x7C, 0xE3, 0xC3, 0xEA, 0x33, 0x8E, 0x28, 0x9A, 0xA8, 0xB6,
+ 0x8E, 0xC3, 0xA4, 0x0F, 0x4A, 0x23, 0xFF, 0x6F, 0x3B, 0x2A, 0xBE, 0x65, 0x97, 0x10, 0x30, 0x12,
+ 0xC0, 0xA6, 0x3A, 0x34, 0xE3, 0x6C, 0xA8, 0x11, 0xED, 0x78, 0x60, 0xE2, 0xAE, 0xC8, 0x2E, 0xE3,
+ 0xEA, 0xB9, 0x3E, 0xAB, 0xBD, 0x15, 0x49, 0x9C, 0x75, 0xD7, 0x49, 0xE3, 0x5C, 0xE9, 0xA2, 0x8A,
+ 0x0C, 0xBE, 0x74, 0x81, 0x1D, 0xE0, 0xCA, 0x12, 0x3E, 0x8A, 0x23, 0xF2, 0x7B, 0x5D, 0xF0, 0xF7,
+ 0x0E, 0x1B, 0x73, 0xF6, 0x5E, 0x8C, 0xE0, 0x8E, 0x57, 0xD5, 0x01, 0x56, 0x5E, 0x3B, 0x7C, 0xC8,
+ 0xF7, 0xE4, 0x61, 0x70, 0x5D, 0x4F, 0xC3, 0x01, 0x26, 0x2A, 0x71, 0x26, 0x50, 0x9B, 0x65, 0xA1,
+ 0x49, 0xBE, 0x50, 0x4C, 0x44, 0x3C, 0x5B, 0x09, 0x3B, 0x39, 0x32, 0x34, 0x82, 0x3B, 0xBF, 0x74,
+ 0x6B, 0x37, 0x59, 0xF4, 0x13, 0x21, 0x30, 0x86, 0x6D, 0x94, 0xDE, 0x2F, 0x5F, 0x69, 0x07, 0x32,
+ 0xFF, 0x14, 0x88, 0x46, 0xA4, 0xB1, 0x9E, 0x69, 0x5A, 0xB7, 0x91, 0x41, 0x2A, 0x62, 0x3C, 0x81,
+ 0xE1, 0x4A, 0x47, 0x9D, 0x61, 0xB2, 0x46, 0x2D, 0x04, 0x3F, 0xD9, 0x57, 0xF2, 0xAB, 0xC9, 0x4F,
+ 0xB3, 0xCE, 0x11, 0x2A, 0x77, 0x76, 0x49, 0x1B, 0x7E, 0x1D, 0xB7, 0xB3, 0x1D, 0xB7, 0x84, 0x5A,
+ 0xC5, 0xCC, 0x1F, 0x9C, 0x82, 0x6D, 0xE0, 0x62, 0x03, 0xEE, 0xA9, 0x9A, 0x05, 0x26, 0x0A, 0xEB,
+ 0x0D, 0x55, 0x01, 0x59, 0x71, 0x10, 0xB9, 0x53, 0x20, 0x65, 0x7B, 0x42, 0x90, 0x37, 0x36, 0x5A,
+ 0xC2, 0xBA, 0x91, 0x20, 0xE0, 0x89, 0xA9, 0x65, 0x2D, 0x67, 0x83, 0x5D, 0x5A, 0xB9, 0x6B, 0x27,
+ 0x13, 0x51, 0xA8, 0x00, 0x9E, 0x98, 0xE9, 0x62, 0xD1, 0x55, 0x7D, 0x37, 0x1E, 0xB5, 0xA3, 0x17,
+ 0x9B, 0x45, 0xD8, 0x60, 0x02, 0xAC, 0xFC, 0x2B, 0xA9, 0xAC, 0x66, 0x79, 0xF9, 0x0C, 0xBC, 0xD4,
+ 0x50, 0x15, 0x8B, 0x48, 0xB1, 0x6A, 0xB4, 0xED, 0xB7, 0xFE, 0xE8, 0x9E, 0x3B, 0xE3, 0x1C, 0xA5,
+ 0x21, 0x15, 0x06, 0x66, 0x2F, 0xBB, 0x05, 0x33, 0xE4, 0x5A, 0x17, 0x5D, 0xF7, 0xB9, 0x2F, 0x3A,
+ 0x2B, 0x83, 0xFF, 0xAC, 0xB6, 0x65, 0x92, 0xEF, 0x6E, 0x1C, 0x8A, 0x6C, 0x72, 0x52, 0x32, 0xA6,
+ 0x5A, 0x16, 0x75, 0xEE, 0xA9, 0x95, 0x84, 0x33, 0x34, 0x5E, 0x71, 0x66, 0x40, 0xB9, 0xFF, 0x8B,
+ 0xD5, 0x50, 0x81, 0xAF, 0x27, 0xC8, 0x58, 0xEE, 0x0D, 0xE7, 0x6D, 0xEB, 0x24, 0xA2, 0x3F, 0xDA,
+ 0x1A, 0xD4, 0xBE, 0x3B, 0x02, 0x7B, 0x1C, 0x5A, 0xAF, 0x1D, 0xE3, 0x4B, 0x9F, 0xBC, 0x78, 0x5B,
+ 0x0B, 0x91, 0x73, 0x78, 0x64, 0xD9, 0x77, 0xC7, 0x6E, 0x4B, 0x94, 0x5F, 0xE9, 0x8D, 0x8F, 0x49,
+ 0xDC, 0x48, 0xEE, 0x58, 0x86, 0x04, 0x63, 0xEB, 0x0D, 0x39, 0x31, 0x81, 0xB4, 0xA8, 0x16, 0xB3,
+ 0x7F, 0x60, 0x7F, 0x94, 0xEE, 0x06, 0x53, 0x38, 0x10, 0x0F, 0x93, 0x7F, 0x12, 0x1F, 0x76, 0x28,
+ 0xA7, 0x3E, 0x46, 0x10, 0x8C, 0x28, 0x53, 0xCF, 0x9F, 0x83, 0x7F, 0x0C, 0xD8, 0xD6, 0x52, 0xF3,
+ 0xE8, 0xD2, 0x21, 0xA6, 0x4A, 0xEE, 0x8B, 0xF7, 0x5B, 0x19, 0x90, 0x6D, 0x35, 0x83, 0xAF, 0x3F,
+ 0x49, 0x71, 0xB1, 0x3E, 0xD1, 0x98, 0x60, 0x77, 0x05, 0x36, 0xA5, 0xFF, 0x82, 0x37, 0x14, 0x49,
+ 0x62, 0x98, 0xB3, 0x05, 0xF5, 0xAC, 0xE2, 0xCC, 0x47, 0x09, 0x94, 0x8A, 0x59, 0x00, 0x23, 0xF4,
+ 0x6D, 0x08, 0xE2, 0xAD, 0x7A, 0xF0, 0xCC, 0x97, 0x68, 0xF7, 0x21, 0x5C, 0x43, 0xD4, 0x1F, 0x16,
+ 0x1A, 0xC6, 0x65, 0xFE, 0x96, 0xB4, 0x7C, 0x2C, 0x79, 0x9E, 0xEC, 0xD4, 0x96, 0xAF, 0x0E, 0x35,
+ 0x24, 0x06, 0x03, 0x8E, 0x9A, 0x4E, 0xA5, 0xA7, 0xCD, 0x35, 0x32, 0xD2, 0x30, 0x15, 0xAC, 0xED,
+ 0xDF, 0xF1, 0x83, 0x39, 0x17, 0xBB, 0x9B, 0x90, 0xED, 0xFB, 0x64, 0xE9, 0x55, 0x09, 0x49, 0x86,
+ 0x7A, 0x9A, 0x43, 0x13, 0xB1, 0xD2, 0xC7, 0xC7, 0xC6, 0xA1, 0x99, 0xC8, 0x51, 0x4A, 0x5F, 0x9D,
+ 0x6F, 0xA6, 0xCD, 0x97, 0x30, 0xE9, 0x55, 0x0B, 0x6F, 0x0F, 0x4A, 0x43, 0x6E, 0x71, 0xE6, 0xCF,
+ 0x3A, 0x7C, 0xC9, 0x78, 0x70, 0xFE, 0xBD, 0x0A, 0x00, 0xEC, 0xA6, 0x7F, 0x83, 0xFA, 0xBE, 0xD4,
+ 0xDF, 0xB0, 0x86, 0x41, 0x12, 0x53, 0x1B, 0x4F, 0x7C, 0x1E, 0x60, 0x2A, 0xC1, 0x20, 0x7A, 0x00,
+ 0xED, 0x6C, 0x66, 0x23, 0x1F, 0x79, 0xC3, 0x3E, 0x01, 0x74, 0xA7, 0x60, 0x7D, 0x1F, 0x29, 0x93,
+ 0x03, 0xF0, 0x64, 0xF6, 0x6F, 0x56, 0x8E, 0x75, 0x57, 0x25, 0x70, 0xDC, 0xD2, 0xD2, 0x28, 0x37,
+ 0xA8, 0x05, 0x9B, 0xB0, 0xAD, 0x1A, 0x2D, 0x86, 0xA9, 0x50, 0xB8, 0xE3, 0xF6, 0xA2, 0x3E, 0x17,
+ 0x5B, 0x78, 0x65, 0xC0, 0x61, 0x95, 0x0E, 0x27, 0x39, 0x72, 0x6A, 0x9E, 0xCB, 0x8E, 0xAD, 0xEC,
+ 0x0C, 0xFC, 0xDB, 0x9A, 0x9A, 0x12, 0x31, 0x16, 0x68, 0x4F, 0x83, 0x79, 0x11, 0x3D, 0x75, 0xED,
+ 0x2D, 0xEA, 0x92, 0x8E, 0xDE, 0xAC, 0x07, 0x55, 0xF1, 0xE4, 0x30, 0x6C, 0xFC, 0x5C, 0x88, 0x1F,
+ 0x77, 0x94, 0xC8, 0x87, 0x73, 0xB2, 0xB6, 0x9F, 0x2A, 0x05, 0x71, 0xDE, 0x8E, 0xF2, 0xEB, 0x3A,
+ 0xDB, 0xBE, 0x46, 0xFA, 0x11, 0xA1, 0xCA, 0x1A, 0xB3, 0x65, 0xAC, 0x42, 0x85, 0xD5, 0x0B, 0x23,
+ 0x57, 0xA5, 0x53, 0xE9, 0x58, 0x30, 0xE0, 0xF9, 0x23, 0xF0, 0x75, 0x2A, 0xF5, 0x2B, 0x9A, 0x25,
+ 0x96, 0xD7, 0x1E, 0x71, 0x31, 0xC7, 0xA7, 0xB0, 0x6B, 0x3F, 0x26, 0xF8, 0x8D, 0xF9, 0x1E, 0x15,
+ 0x83, 0xB8, 0xFF, 0xC6, 0xAA, 0xA6, 0x42, 0xAC, 0x90, 0x82, 0xA2, 0x50, 0x7F, 0x1F, 0xC3, 0x99,
+ 0xDC, 0x27, 0xD7, 0xAA, 0x65, 0x13, 0x08, 0xA2, 0x66, 0x51, 0x7D, 0xC7, 0x7E, 0xAE, 0x1A, 0x33,
+ 0x2B, 0x72, 0xF3, 0xF4, 0x25, 0xD9, 0xEE, 0xF1, 0x07, 0x0F, 0xC3, 0x87, 0xDF, 0x2B, 0x0C, 0xC8,
+ 0x4D, 0x2E, 0xEB, 0xA3, 0x93, 0xB2, 0xBB, 0xAA, 0x61, 0xE1, 0x71, 0x0D, 0x53, 0xE2, 0xF5, 0x7E,
+ 0xF7, 0x08, 0x06, 0xAD, 0x3E, 0xE7, 0xA6, 0xB9, 0x3B, 0xC9, 0x68, 0x5D, 0xB8, 0x7D, 0xC1, 0x31,
+ 0x9B, 0x70, 0xC2, 0x2B, 0x57, 0x26, 0x54, 0x67, 0x3D, 0x14, 0x26, 0xCF, 0xB0, 0xEC, 0xD6, 0x00,
+ 0xE3, 0x3F, 0x26, 0xCA, 0xEF, 0xB8, 0x1A, 0xFD, 0xE4, 0x06, 0xE9, 0x41, 0xF2, 0xAD, 0x2E, 0x16,
+ 0x11, 0x0A, 0x98, 0x4B, 0x01, 0x67, 0x76, 0x99, 0xAE, 0x58, 0xF4, 0xAD, 0xC2, 0xC8, 0x56, 0x26,
+ 0x50, 0xB2, 0x77, 0x4B, 0x32, 0x71, 0x16, 0x13, 0xC7, 0xAE, 0xE3, 0xDE, 0x1C, 0x6D, 0x54, 0x4C,
+ 0x89, 0xA4, 0x81, 0x18, 0x53, 0xC3, 0x01, 0xCD, 0xCF, 0x85, 0xFB, 0x3A, 0x97, 0xD5, 0x25, 0x56,
+ 0x39, 0x89, 0xEF, 0x52, 0xBB, 0x02, 0xC8, 0x23, 0xDD, 0x04, 0x36, 0x85, 0xA2, 0x33, 0xE4, 0x4F,
+ 0x41, 0xC8, 0xE9, 0x8B, 0xCE, 0xD5, 0xB0, 0xDB, 0xF3, 0xB4, 0xC3, 0x7C, 0x70, 0x29, 0x0F, 0xB6,
+ 0x3C, 0xB1, 0xD3, 0x0C, 0xD5, 0x06, 0x56, 0x2E, 0x57, 0xD1, 0x90, 0xAB, 0x5D, 0xE8, 0xE6, 0xD6,
+ 0x94, 0x58, 0xE2, 0xA8, 0x92, 0x42, 0xF8, 0xD4, 0xD7, 0x2F, 0x1F, 0x16, 0x92, 0x0C, 0xD5, 0x8E,
+ 0x69, 0x98, 0xA9, 0x48, 0xA1, 0x6E, 0x94, 0x8C, 0x66, 0x30, 0xA3, 0x52, 0x50, 0x7A, 0x29, 0x96,
+ 0xB0, 0x2B, 0x16, 0x3E, 0x2C, 0x56, 0xA4, 0x9F, 0x85, 0x96, 0x56, 0x25, 0x98, 0x56, 0xAA, 0xFB,
+ 0xEE, 0x4A, 0x31, 0xD9, 0xD7, 0xB3, 0x37, 0xE4, 0x1D, 0x49, 0x3D, 0xA7, 0xF7, 0x93, 0x31, 0x6D,
+ 0x99, 0x24, 0xE5, 0x30, 0x8F, 0xB4, 0x89, 0x56, 0x1F, 0xB7, 0x09, 0x4F, 0x71, 0xDB, 0x4D, 0x02,
+ 0x40, 0x7B, 0xEA, 0x75, 0x38, 0x2C, 0xCD, 0xE2, 0x9F, 0x60, 0xC8, 0x4A, 0x84, 0x2F, 0x9D, 0xFF,
+ 0x75, 0xED, 0x32, 0xBA, 0xB7, 0xF4, 0xC8, 0x0E, 0xCF, 0xC5, 0x31, 0x8A, 0xA0, 0xF7, 0xC9, 0x07,
+ 0x54, 0x44, 0x90, 0xC1, 0x1C, 0x46, 0x49, 0xEE, 0x33, 0x0E, 0xB4, 0x87, 0x4B, 0x9E, 0x3C, 0xF0,
+ 0xAD, 0x0B, 0xA5, 0xA4, 0x28, 0x43, 0xE6, 0x34, 0xD3, 0xD0, 0xF4, 0x88, 0x1E, 0xDE, 0x6E, 0x50,
+ 0x81, 0x0E, 0x24, 0xE5, 0x87, 0xA4, 0xAB, 0x67, 0xD1, 0x91, 0xD2, 0xB8, 0x57, 0xA6, 0x86, 0x4A,
+ 0x47, 0x45, 0x39, 0x6B, 0x1E, 0x2B, 0xCF, 0xCD, 0xE2, 0x1B, 0xBF, 0x75, 0xC2, 0xD4, 0x5A, 0x68,
+ 0x8F, 0xC6, 0xDC, 0x64, 0xBB, 0xBE, 0x71, 0x38, 0x9D, 0x4B, 0xBE, 0x4E, 0xF6, 0x2D, 0xAC, 0x5D,
+ 0x23, 0x6B, 0xC3, 0x96, 0x51, 0x4D, 0x10, 0x70, 0x83, 0xCA, 0x69, 0x91, 0x52, 0x3E, 0x46, 0x03,
+ 0x93, 0xC3, 0xE0, 0x10, 0xDF, 0x24, 0x7F, 0x9B, 0x86, 0xD6, 0x5B, 0x95, 0xD4, 0xCF, 0xED, 0x14,
+ 0xCD, 0x53, 0x82, 0x97, 0x6C, 0x81, 0x9C, 0x3F, 0x6B, 0xFA, 0x9B, 0x44, 0x1B, 0x29, 0xCA, 0x66,
+ 0xD9, 0x22, 0xB1, 0xDE, 0xFE, 0x3A, 0xE2, 0x0C, 0xD5, 0x62, 0xDB, 0x00, 0x12, 0x59, 0x74, 0xE6,
+ 0x8C, 0x22, 0x7B, 0x11, 0x7F, 0x59, 0xB3, 0x0A, 0x2C, 0x76, 0x5F, 0x71, 0x31, 0xA2, 0xD8, 0x42,
+ 0x28, 0xF3, 0x24, 0xC5, 0xF6, 0x85, 0x60, 0x32, 0xC1, 0x91, 0xD7, 0x95, 0x61, 0x70, 0x51, 0x9A,
+ 0x4E, 0x62, 0x8A, 0xCF, 0xBD, 0x98, 0x00, 0xA0, 0x12, 0xB5, 0xB6, 0x90, 0xC7, 0x6E, 0xC3, 0x4A,
+ 0x8E, 0x2F, 0x50, 0xAD, 0xC0, 0x26, 0x12, 0xF4, 0x68, 0x1D, 0x51, 0x72, 0x14, 0x06, 0xB7, 0x7A,
+ 0xCA, 0x37, 0x8F, 0x39, 0x01, 0x76, 0xE5, 0xE4, 0xF1, 0xCA, 0xDA, 0x6A, 0x6B, 0x7C, 0x7D, 0xD9,
+ 0xA9, 0x39, 0xBB, 0x50, 0x79, 0x02, 0xD6, 0xA1, 0x12, 0xE7, 0xE6, 0x9A, 0x1B, 0xF4, 0x89, 0x48,
+ 0x29, 0x88, 0xA7, 0xC8, 0xE9, 0xEF, 0xB1, 0x28, 0x18, 0x22, 0x4B, 0x6A, 0x96, 0xAF, 0x06, 0x3B,
+ 0xE0, 0x8E, 0x9B, 0x2C, 0xC1, 0x7B, 0xD9, 0x87, 0x72, 0xA5, 0xC8, 0xFE, 0x30, 0x9C, 0x24, 0x79,
+ 0xAD, 0x04, 0xBB, 0x38, 0xA9, 0xB8, 0x29, 0x01, 0x41, 0xC3, 0x40, 0xD9, 0xE6, 0xE4, 0xD3, 0x97,
+ 0xE2, 0x42, 0xBF, 0x79, 0x59, 0x7B, 0xAF, 0x31, 0x0C, 0xF3, 0xD1, 0x72, 0xA4, 0x9D, 0x36, 0xD9,
+ 0xDB, 0x0C, 0x0F, 0xCC, 0x3A, 0x8C, 0xAF, 0x71, 0xB7, 0x46, 0x2F, 0x26, 0x7D, 0x1E, 0x25, 0xC9,
+ 0x8E, 0xA3, 0x9B, 0xCF, 0x7F, 0xC4, 0x96, 0xB6, 0xC7, 0x05, 0x62, 0x08, 0x49, 0x3C, 0xFC, 0x24,
+ 0xAA, 0x16, 0xEB, 0x3C, 0xE6, 0x04, 0x57, 0xD1, 0xA3, 0x81, 0x6E, 0xD4, 0x64, 0xF5, 0xC6, 0x24,
+ 0x06, 0x9E, 0xA4, 0x76, 0x3E, 0x62, 0x31, 0x54, 0xC8, 0xC7, 0xAA, 0x31, 0xC6, 0xF0, 0x71, 0x1B,
+ 0xE7, 0x08, 0xFF, 0x3A, 0x7A, 0xD3, 0x51, 0x5A, 0xE8, 0xA6, 0xD4, 0xAA, 0x6E, 0x20, 0x37, 0x28,
+ 0x0D, 0x0A, 0xCC, 0x25, 0x6C, 0x1E, 0x76, 0x8C, 0xC5, 0xCA, 0xDA, 0x6C, 0x24, 0x17, 0xD4, 0xB0,
+ 0x45, 0x3E, 0xD7, 0x25, 0xB8, 0x03, 0xED, 0xA2, 0xDA, 0x82, 0x08, 0x8F, 0x10, 0x3F, 0x13, 0x43,
+ 0x07, 0x3F, 0x8C, 0xF9, 0xE5, 0xD5, 0xB0, 0x35, 0x01, 0x13, 0x61, 0x38, 0x97, 0xCA, 0xB4, 0xFE,
+ 0x1B, 0x1F, 0x44, 0xEC, 0xFB, 0xAB, 0x07, 0xB6, 0x3F, 0x21, 0x80, 0x6A, 0x8D, 0xBA, 0x8A, 0x1D,
+ 0xEA, 0xEF, 0xA0, 0xEB, 0xBC, 0x26, 0x37, 0x4F, 0xA6, 0x16, 0xF8, 0xA2, 0x90, 0x3E, 0xF7, 0x06,
+ 0xD8, 0x4C, 0x21, 0x94, 0x2C, 0x5F, 0x49, 0x05, 0x12, 0xF8, 0xA8, 0xA5, 0x14, 0x40, 0xBE, 0x40,
+ 0x01, 0xF5, 0x23, 0xE1, 0xEE, 0xF6, 0x5B, 0xC0, 0xE6, 0x76, 0xEF, 0x1D, 0x05, 0xA8, 0x77, 0xF2,
+ 0x5D, 0x91, 0xBA, 0x62, 0xB8, 0xDD, 0xF0, 0xFC, 0x5B, 0xA9, 0xB2, 0x25, 0xDD, 0x0E, 0x08, 0xFA,
+ 0xE8, 0x5C, 0xCA, 0x43, 0x0D, 0xD0, 0x65, 0x08, 0x23, 0xA7, 0x2A, 0x2C, 0xE6, 0x6F, 0xB6, 0x0A,
+ 0xE7, 0xED, 0x86, 0x80, 0x50, 0x94, 0x58, 0x0D, 0x11, 0x57, 0xED, 0xB9, 0xD5, 0x7C, 0x33, 0xCD,
+ 0x44, 0x9A, 0x17, 0xFB, 0x74, 0xF3, 0xB1, 0x2D, 0x9F, 0x38, 0x5E, 0x6A, 0x9A, 0xAE, 0x5F, 0x7B,
+ 0xAD, 0x4F, 0x9C, 0x8E, 0x1E, 0x3A, 0x75, 0x4F, 0x30, 0xCF, 0xF7, 0x1C, 0x82, 0x34, 0xC6, 0x3E,
+ 0xE7, 0x5B, 0x8B, 0x2C, 0xD8, 0xFE, 0xDB, 0x33, 0x27, 0xBB, 0x2E, 0x24, 0xB0, 0xDA, 0x74, 0xD3,
+ 0x94, 0x85, 0x78, 0x36, 0x40, 0x2D, 0xEE, 0x40, 0x4A, 0xED, 0x00, 0x4C, 0xDB, 0xF9, 0x49, 0x2F,
+ 0xEC, 0x03, 0x99, 0x63, 0xDD, 0x9E, 0xB7, 0xA3, 0x3B, 0xE1, 0xF2, 0x0E, 0x5D, 0x58, 0xD8, 0x33,
+ 0xE9, 0xE4, 0x0A, 0xD2, 0x83, 0xA0, 0x3F, 0x80, 0x9A, 0x01, 0xC5, 0x8D, 0xF3, 0x14, 0xC8, 0x0F,
+ 0xE4, 0xB8, 0xAD, 0xCD, 0x3E, 0x50, 0x43, 0x17, 0xC1, 0x58, 0x8D, 0x64, 0x03, 0xB1, 0xE5, 0x42,
+ 0xC8, 0x34, 0x6A, 0xFB, 0x74, 0x18, 0xA0, 0xD9, 0x3D, 0x01, 0xD7, 0x2F, 0x51, 0x0F, 0xD8, 0x29,
+ 0x74, 0xB1, 0xF8, 0x99, 0xCA, 0x74, 0xB2, 0xF1, 0xB6, 0x7B, 0x53, 0x10, 0xCE, 0x73, 0xF6, 0x32,
+ 0x3F, 0x05, 0x6E, 0xC7, 0xAD, 0x27, 0x34, 0xD4, 0xB9, 0x1D, 0x34, 0x5D, 0xEC, 0x88, 0x46, 0x22,
+ 0x90, 0x94, 0xAF, 0x1A, 0x51, 0x33, 0x10, 0xB7, 0xBF, 0xBE, 0x0A, 0xCD, 0x1E, 0xE8, 0x95, 0x78,
+ 0x61, 0x17, 0x63, 0x8F, 0x3A, 0xE2, 0x30, 0x59, 0x3F, 0xBF, 0xD8, 0xA3, 0x85, 0xEF, 0x3D, 0x1D,
+ 0xD2, 0x4F, 0x7B, 0xB3, 0xD7, 0x14, 0x91, 0x65, 0xC2, 0x3A, 0x66, 0xBC, 0xFF, 0xFD, 0xC2, 0x12,
+ 0x4A, 0xAF, 0xC4, 0xCC, 0x78, 0x1F, 0xA1, 0xAB, 0x54, 0xB7, 0xDB, 0x3B, 0x07, 0x45, 0x09, 0x93,
+ 0x45, 0x40, 0x2F, 0xA0, 0x68, 0x73, 0x54, 0x27, 0x96, 0xB4, 0x2E, 0x88, 0xC2, 0xF7, 0x98, 0x9E,
+ 0xCA, 0xBF, 0xF4, 0xEC, 0x0A, 0xB6, 0x8F, 0x33, 0x08, 0x5C, 0x91, 0x1B, 0x9F, 0x55, 0xDF, 0xF9,
+ 0x04, 0x5D, 0xF0, 0x3A, 0xE1, 0xFF, 0x93, 0x3A, 0xA7, 0xBB, 0x24, 0x75, 0xA3, 0x0D, 0x95, 0x7D,
+ 0x66, 0x11, 0x4D, 0x0C, 0xCD, 0x8A, 0x98, 0xA3, 0xC4, 0x38, 0x88, 0x00, 0xD3, 0x7F, 0xA8, 0x7D,
+ 0xE6, 0x14, 0xF0, 0xA5, 0xF2, 0x5E, 0xA0, 0xE2, 0xD4, 0x3E, 0xFA, 0x00, 0xD4, 0x5D, 0x01, 0x5D,
+ 0x55, 0xF9, 0xA4, 0xC8, 0x49, 0x59, 0x16, 0xFA, 0xC5, 0x51, 0x15, 0xDC, 0xC3, 0x1E, 0xD5, 0xED,
+ 0xE4, 0xBB, 0x14, 0xA0, 0xF3, 0x68, 0xD5, 0x60, 0xE0, 0x42, 0xB4, 0x30, 0x82, 0xD8, 0xD6, 0x3E,
+ 0xEC, 0xE7, 0xAD, 0x3C, 0x69, 0x61, 0x28, 0x8E, 0x8C, 0x04, 0xF1, 0xA0, 0x1E, 0xBD, 0xDF, 0xBE,
+ 0xFD, 0xAE, 0xD9, 0x65, 0x66, 0x33, 0x0F, 0xB0, 0x8D, 0xE9, 0x46, 0xFD, 0xD5, 0xF9, 0x20, 0x18,
+ 0x7F, 0xF7, 0x20, 0x3F, 0xE2, 0x7A, 0x38, 0x14, 0xBB, 0x1A, 0xC3, 0xCA, 0xAB, 0x56, 0x5B, 0x17,
+ 0x1B, 0x1A, 0xC3, 0x00, 0x97, 0x69, 0x9B, 0x5D, 0xBD, 0x4D, 0x22, 0x77, 0x36, 0x65, 0xD7, 0x04,
+ 0x8F, 0x5B, 0x76, 0xB2, 0x6B, 0x23, 0x52, 0xA2, 0x02, 0xC4, 0x98, 0x16, 0xE3, 0xF7, 0x2B, 0xFC,
+ 0x36, 0x94, 0x91, 0x0B, 0x0B, 0x82, 0x7F, 0xC6, 0x70, 0x8C, 0x80, 0x36, 0x48, 0x4F, 0x8C, 0x15,
+ 0xB9, 0x06, 0x4C, 0x0B, 0x79, 0xA0, 0x37, 0x7D, 0x18, 0xBB, 0x83, 0x8C, 0xA6, 0xF0, 0x02, 0x7D,
+ 0xAE, 0xD1, 0x8D, 0xF7, 0x11, 0x14, 0x69, 0x2D, 0xEE, 0x85, 0x47, 0x52, 0x44, 0x95, 0xD8, 0x8B,
+ 0x91, 0x04, 0x1A, 0x0D, 0x0A, 0xE9, 0x61, 0x35, 0x14, 0xB7, 0x3D, 0x77, 0xD3, 0x7B, 0x97, 0xE2,
+ 0x54, 0x37, 0xCD, 0x77, 0x49, 0x52, 0x2B, 0xF5, 0x0A, 0xA2, 0xCD, 0x9A, 0x51, 0x17, 0x7F, 0xD2,
+ 0x9D, 0x65, 0x0F, 0x0F, 0x54, 0xEC, 0x00, 0x71, 0x89, 0x5B, 0xAC, 0x7C, 0x59, 0x55, 0xA3, 0xEA,
+ 0x27, 0xF1, 0x47, 0x79, 0xF5, 0xDD, 0x0F, 0xD9, 0x14, 0xDB, 0x00, 0xE1, 0xA2, 0x4D, 0x92, 0xDA,
+ 0x0B, 0xEF, 0x41, 0x29, 0x1E, 0xFB, 0x37, 0xAC, 0x08, 0x5D, 0xB7, 0x75, 0x7B, 0x63, 0xC9, 0x47,
+ 0x0B, 0x13, 0x66, 0x39, 0xA1, 0x58, 0x82, 0xA3, 0x8D, 0x8B, 0xAF, 0xF9, 0x21, 0x84, 0xE1, 0xBD,
+ 0x49, 0xD4, 0xF4, 0x43, 0x7F, 0x9A, 0xCF, 0x59, 0xF2, 0xA5, 0x2C, 0x4D, 0x85, 0xB5, 0xFD, 0x95,
+ 0xE8, 0x45, 0xD2, 0xE8, 0x8A, 0xE4, 0xA9, 0x41, 0x6B, 0x99, 0xBE, 0x0D, 0xF1, 0xB2, 0x57, 0x61,
+ 0x7B, 0x6D, 0x09, 0x53, 0x26, 0xCC, 0x28, 0x2C, 0x82, 0x08, 0xFB, 0xDC, 0xA9, 0x8A, 0xEC, 0x76,
+ 0xE3, 0x4D, 0xDE, 0xAC, 0x3E, 0x54, 0xAC, 0xC7, 0x50, 0x92, 0x8A, 0x19, 0x3A, 0xF3, 0xFA, 0xF0,
+ 0xC1, 0x7E, 0xEE, 0x69, 0x0E, 0xB5, 0x35, 0x9D, 0x93, 0x4B, 0xAE, 0xA9, 0x97, 0x09, 0x34, 0x9B,
+ 0x8E, 0x3C, 0xB4, 0x2A, 0x1D, 0x59, 0xF9, 0x1C, 0x82, 0x25, 0x14, 0xCB, 0xC4, 0x89, 0xA5, 0xD5,
+ 0x62, 0xD9, 0xC4, 0xD5, 0xFF, 0xF5, 0xFF, 0x9A, 0xA8, 0x05, 0x95, 0xE1, 0xAC, 0xAF, 0x61, 0x1B,
+ 0x57, 0x77, 0xB0, 0x2C, 0x68, 0xE6, 0x3F, 0x1B, 0x63, 0xFF, 0xC3, 0x33, 0x04, 0x8A, 0x0B, 0x54,
+ 0x7D, 0x36, 0xAE, 0xAE, 0x3F, 0xD3, 0xA6, 0x83, 0x65, 0xA4, 0xFE, 0x3C, 0x29, 0xDB, 0x81, 0x99,
+ 0xF9, 0x7A, 0x9B, 0xBB, 0xA7, 0x86, 0x6B, 0xDF, 0x67, 0x08, 0x23, 0x88, 0x62, 0xE3, 0x08, 0x5C,
+ 0x23, 0x73, 0x0C, 0x01, 0x96, 0xB0, 0x99, 0xC0, 0x8D, 0xD5, 0xDB, 0xCE, 0x4C, 0x1F, 0xE4, 0xFD,
+ 0x19, 0x2E, 0xD7, 0x20, 0x81, 0x4E, 0x22, 0x4E, 0xAD, 0x02, 0x86, 0x1C, 0xEF, 0x2C, 0xEC, 0xCF,
+ 0xD0, 0x7E, 0xFB, 0x02, 0xE1, 0xE1, 0xFD, 0xE5, 0xB9, 0xBC, 0xE5, 0x12, 0xA3, 0xCA, 0xE8, 0x88,
+ 0x45, 0x03, 0x15, 0x0E, 0xA0, 0xC2, 0x1A, 0xB7, 0x13, 0xB3, 0x52, 0x3C, 0x87, 0x18, 0x95, 0x3F,
+ 0x56, 0x9C, 0x31, 0x52, 0x2A, 0x5D, 0x57, 0xD3, 0xA1, 0x41, 0x2B, 0x82, 0x11, 0x23, 0xC2, 0x4D,
+ 0xE8, 0xE5, 0xC3, 0xBA, 0x59, 0x6B, 0x32, 0xBE, 0x22, 0x37, 0xB8, 0xC9, 0x11, 0x88, 0x5C, 0x7E,
+ 0x94, 0x5F, 0xDA, 0xB5, 0xC5, 0xAB, 0xA8, 0xD7, 0x98, 0x2E, 0x4A, 0xBC, 0x5B, 0xD0, 0x7D, 0x3E,
+ 0xA3, 0x43, 0xE8, 0xAB, 0x9F, 0xA7, 0x44, 0x02, 0x07, 0xE9, 0x78, 0x50, 0xB4, 0x0A, 0xE9, 0x5D,
+ 0xDB, 0x23, 0x1E, 0x1D, 0x0A, 0xCB, 0x95, 0xE2, 0xDB, 0xCC, 0x42, 0x40, 0x52, 0x6C, 0x5C, 0xF6,
+ 0xBD, 0x80, 0x51, 0x4C, 0x56, 0x54, 0xB6, 0xC9, 0xB2, 0x9F, 0x70, 0x66, 0xE6, 0x48, 0xD5, 0xC3,
+ 0x7D, 0x94, 0x73, 0xAA, 0x50, 0x10, 0x3D, 0x53, 0x04, 0x85, 0xC1, 0x4E, 0x77, 0x3A, 0x90, 0x3B,
+ 0xBA, 0x9F, 0x37, 0x80, 0xDA, 0xF2, 0x0B, 0xB1, 0xBC, 0x30, 0x94, 0xC6, 0xB7, 0x39, 0x8D, 0xDD,
+ 0x32, 0xA2, 0x71, 0x83, 0x74, 0xE8, 0x1F, 0xB6, 0x92, 0xD5, 0xBE, 0xE6, 0x4B, 0x9F, 0xC5, 0x40,
+ 0x5A, 0x23, 0xDB, 0x3C, 0xB0, 0xAF, 0x14, 0x47, 0x9F, 0x66, 0x53, 0x0D, 0x3E, 0x43, 0x5D, 0xF3,
+ 0xE6, 0x18, 0x03, 0x47, 0xE3, 0x1A, 0xF5, 0x96, 0x53, 0xCA, 0xFE, 0x1B, 0x07, 0x88, 0xBD, 0x6D,
+ 0xE4, 0xF1, 0x86, 0x43, 0xEE, 0x09, 0x6E, 0x3A, 0x81, 0xB7, 0x6B, 0x56, 0x6B, 0x04, 0x25, 0x57,
+ 0x79, 0x5E, 0xD3, 0xAB, 0xA1, 0xBB, 0x60, 0xB8, 0x4A, 0xDB, 0x09, 0xFA, 0x3F, 0x1A, 0x3F, 0x05,
+ 0x1A, 0xDA, 0xFA, 0x5E, 0xB8, 0x55, 0xDB, 0xDC, 0xD7, 0x0A, 0x10, 0x89, 0xAF, 0x70, 0xA3, 0x70,
+ 0xC6, 0xDA, 0xB6, 0x8C, 0x04, 0x27, 0xD8, 0xEF, 0x44, 0x55, 0x8F, 0x07, 0xAF, 0xD5, 0x22, 0xDA,
+ 0x3D, 0x67, 0x9C, 0xC8, 0xE8, 0x2D, 0xE1, 0xF7, 0x2D, 0xFE, 0xFE, 0xA9, 0x27, 0x43, 0xAA, 0xB8,
+ 0x81, 0x78, 0xBC, 0x7F, 0x77, 0xBC, 0xC8, 0x83, 0x0D, 0xF8, 0x8D, 0x81, 0xD8, 0xD4, 0x1E, 0xB9,
+ 0x5C, 0x91, 0x19, 0x41, 0x13, 0xA5, 0x44, 0xC8, 0x60, 0x1F, 0x08, 0xDF, 0x5E, 0xFA, 0xB1, 0xEA,
+ 0x46, 0x01, 0x1E, 0xE2, 0x6D, 0x63, 0xF8, 0x7E, 0xD6, 0xBB, 0x17, 0xC9, 0x80, 0x76, 0x40, 0x87,
+ 0xCF, 0x1A, 0x69, 0x53, 0x40, 0xA4, 0x44, 0xA1, 0x56, 0xD1, 0x28, 0x5F, 0x60, 0x12, 0x7A, 0xBD,
+ 0x02, 0xE3, 0xE1, 0xFF, 0xA4, 0xCB, 0xA0, 0x1E, 0xDC, 0x5C, 0x6C, 0xDB, 0xF7, 0x05, 0x55, 0xC0,
+ 0xE5, 0xAB, 0x57, 0xF8, 0xB4, 0xFF, 0x20, 0xD9, 0x3D, 0xEB, 0x02, 0x1C, 0x67, 0x31, 0xC7, 0xB4,
+ 0x2D, 0x5C, 0x4A, 0x9F, 0xF1, 0x18, 0x97, 0x27, 0x5B, 0x1A, 0x72, 0xDD, 0x6A, 0x8E, 0x29, 0xBB,
+ 0x26, 0xE8, 0x3E, 0xCB, 0xF6, 0x48, 0x19, 0xC1, 0xD2, 0x18, 0x28, 0x92, 0xCA, 0x30, 0xE6, 0x59,
+ 0xBB, 0x34, 0xE4, 0x4C, 0x3B, 0xD8, 0x7D, 0x06, 0xA0, 0xD8, 0x85, 0xD6, 0x06, 0x1F, 0xE9, 0x04,
+ 0x27, 0x78, 0x8F, 0xCA, 0xFC, 0x56, 0x68, 0xE4, 0xA5, 0x25, 0xE0, 0x4C, 0xA0, 0xBC, 0x36, 0xED,
+ 0xBF, 0xAD, 0xC3, 0xA0, 0x2E, 0x83, 0xB3, 0x79, 0x80, 0x4F, 0xC2, 0x80, 0x93, 0xC7, 0xC4, 0x8C,
+ 0xFE, 0x64, 0xEC, 0xFE, 0x24, 0xF1, 0x5C, 0xC5, 0x51, 0x51, 0x13, 0xC0, 0x5E, 0x61, 0x61, 0x5D,
+ 0x5C, 0xAB, 0x50, 0x72, 0x79, 0x91, 0xA3, 0xB6, 0x17, 0x8D, 0x2F, 0xB5, 0xA7, 0x3B, 0x19, 0x8A,
+ 0x5E, 0x14, 0x13, 0xE4, 0xDC, 0x8E, 0x92, 0xE1, 0x51, 0xFF, 0x98, 0xC5, 0xAC, 0xA2, 0x5F, 0xC0,
+ 0xA5, 0x46, 0x77, 0x64, 0x9F, 0xD8, 0x82, 0x0D, 0x54, 0x3A, 0xD7, 0x77, 0xC9, 0xBE, 0x0E, 0xF6,
+ 0x05, 0xF0, 0x17, 0xF1, 0x1E, 0xBF, 0x00, 0x57, 0xAE, 0xAA, 0xE8, 0xB3, 0xEE, 0xF8, 0x2B, 0x4A,
+ 0x02, 0x79, 0xC0, 0x3C, 0xF8, 0x7A, 0x56, 0xA8, 0x69, 0xFF, 0x64, 0x7C, 0x02, 0x76, 0x26, 0x93,
+ 0x95, 0x02, 0xD9, 0x1E, 0xA6, 0x6A, 0x69, 0x3C, 0x00, 0x78, 0x8D, 0x71, 0x7C, 0x83, 0xD0, 0x38,
+ 0xD7, 0x65, 0x94, 0xBD, 0xD3, 0x7B, 0xF0, 0xC3, 0x26, 0x96, 0x27, 0x23, 0xCA, 0xC0, 0x33, 0x74,
+ 0xE1, 0x6D, 0x3E, 0x61, 0xF8, 0xF8, 0x49, 0x0B, 0x79, 0x90, 0x90, 0xCA, 0xD4, 0x5B, 0x7D, 0x9B,
+ 0x75, 0xF9, 0x08, 0x36, 0x8B, 0x2E, 0xA5, 0x50, 0xB8, 0x7E, 0x3A, 0xED, 0x09, 0xED, 0x0C, 0x1C,
+ 0xB8, 0xDD, 0x5E, 0x13, 0x0A, 0x0B, 0x5C, 0xFB, 0x75, 0x41, 0x98, 0x2B, 0xC9, 0xAB, 0xC9, 0x14,
+ 0xDA, 0xFE, 0x34, 0x72, 0xB9, 0x7C, 0x86, 0x89, 0x0E, 0x2E, 0x58, 0xC3, 0xC1, 0xD5, 0x2B, 0x66,
+ 0x26, 0xD2, 0xBF, 0xBF, 0x96, 0x33, 0x30, 0xCE, 0x5D, 0x87, 0x02, 0xE2, 0x20, 0x71, 0xEC, 0x24,
+ 0xAD, 0x40, 0xFE, 0xEF, 0x52, 0xD1, 0x84, 0x72, 0xCD, 0xCD, 0x3C, 0xDB, 0xA7, 0x94, 0x0F, 0xAD,
+ 0x4C, 0x67, 0x3F, 0x13, 0x16, 0x4B, 0x6B, 0x26, 0x92, 0x3F, 0xB2, 0xAE, 0xA4, 0x5F, 0xBB, 0x65,
+ 0x0B, 0x13, 0xE2, 0xB9, 0x87, 0xA7, 0xB2, 0x14, 0xC0, 0x2A, 0x66, 0x5B, 0x99, 0x6C, 0xC6, 0x98,
+ 0xC2, 0xB6, 0x1B, 0x05, 0x14, 0xD6, 0xC9, 0x5B, 0x33, 0xE1, 0x14, 0x35, 0x82, 0xF9, 0x50, 0xF6,
+ 0xFD, 0xA0, 0x15, 0x6D, 0xB1, 0x59, 0x4A, 0x51, 0x9D, 0x81, 0xD4, 0x1C, 0xE2, 0x31, 0xDD, 0xD0,
+ 0xFF, 0xC8, 0x9A, 0x7B, 0x9F, 0xED, 0xD4, 0x33, 0xDF, 0xBA, 0x58, 0x9E, 0x36, 0xC1, 0x69, 0xA2,
+ 0xE2, 0x93, 0xC7, 0x21, 0x8D, 0x07, 0xFD, 0xA2, 0x37, 0xA9, 0xDC, 0x28, 0x7F, 0x16, 0xA1, 0x0E,
+ 0x00, 0x5E, 0x0D, 0x01, 0xCB, 0x36, 0x97, 0xD5, 0xC1, 0xF2, 0x93, 0xC7, 0x8A, 0xAE, 0xA7, 0xE6,
+ 0xBE, 0x0B, 0xA8, 0x3E, 0xA2, 0x26, 0xDF, 0x62, 0x13, 0xEF, 0xB8, 0x9A, 0xDA, 0xD4, 0x4D, 0xD0,
+ 0x78, 0x02, 0x54, 0x78, 0xEE, 0x5A, 0x6F, 0xAB, 0xD2, 0x6D, 0x94, 0xBC, 0xE9, 0xD3, 0x71, 0x3B,
+ 0x59, 0x73, 0xBE, 0x32, 0x7E, 0x7C, 0x69, 0x5C, 0xFC, 0xA3, 0x86, 0x86, 0x59, 0x83, 0x34, 0xD8,
+ 0xC9, 0x66, 0x8C, 0xEB, 0x56, 0xE0, 0xD0, 0xC2, 0xD1, 0x08, 0x35, 0xAB, 0x6F, 0x04, 0xAA, 0xB4,
+ 0x5C, 0x4D, 0x41, 0x71, 0x0A, 0xB8, 0x3E, 0x8C, 0xAF, 0x73, 0xF0, 0xF7, 0xD2, 0x28, 0x2A, 0x20,
+ 0xD6, 0xC6, 0x21, 0x2E, 0xB8, 0xF3, 0xDE, 0x84, 0xFD, 0x1C, 0x10, 0x36, 0x3A, 0x3B, 0x27, 0x97,
+ 0x93, 0xBB, 0x0F, 0xBE, 0x4E, 0xD4, 0x44, 0xA1, 0x3F, 0x53, 0x30, 0x68, 0x58, 0xA5, 0xF9, 0x27,
+ 0xF5, 0xFF, 0x3F, 0xC1, 0x9D, 0x89, 0x57, 0xE8, 0xF9, 0x3E, 0x66, 0x82, 0x57, 0x7B, 0x00, 0xD6,
+ 0x46, 0x6E, 0x42, 0x98, 0x6D, 0xCB, 0x99, 0x71, 0x74, 0xB9, 0x2A, 0x65, 0x54, 0xCE, 0xDD, 0x10,
+ 0xD3, 0xBB, 0xA6, 0x4D, 0xCA, 0x3B, 0x4E, 0x4D, 0x5C, 0xF8, 0x80, 0x45, 0xED, 0x0D, 0xBB, 0x1F,
+ 0xC8, 0xDD, 0x69, 0x33, 0x13, 0x6D, 0x47, 0x3F, 0x29, 0x51, 0x1C, 0xF9, 0xD9, 0x95, 0x64, 0x29,
+ 0x5C, 0xEC, 0x7A, 0x8B, 0x14, 0x07, 0xA0, 0x43, 0x1E, 0x5B, 0x7A, 0x5E, 0xDA, 0x7B, 0xA7, 0xC9,
+ 0x7B, 0xDC, 0x72, 0xF5, 0x90, 0xF2, 0x7D, 0xF9, 0x59, 0xE2, 0xE3, 0x74, 0xEE, 0x8B, 0xBC, 0x87,
+ 0x15, 0x24, 0x6D, 0x5C, 0x39, 0xA6, 0xE2, 0x1E, 0xA9, 0x4D, 0xB7, 0x39, 0x39, 0x75, 0x50, 0xF9,
+ 0x05, 0x88, 0xD2, 0xB5, 0x7C, 0xDB, 0x9A, 0x4D, 0x75, 0x52, 0xAB, 0x45, 0x2F, 0x0B, 0x77, 0x11,
+ 0xEF, 0xE6, 0x22, 0x86, 0xA9, 0xB7, 0x14, 0x08, 0xA9, 0xB2, 0x52, 0x54, 0x2F, 0x01, 0x32, 0x89,
+ 0x3C, 0xBE, 0xC2, 0xF6, 0x7D, 0x34, 0xBE, 0xD1, 0xDB, 0xE3, 0x74, 0x6F, 0x9B, 0x59, 0xF9, 0x86,
+ 0x0F, 0xE1, 0xA8, 0x7F, 0x64, 0x2D, 0xE0, 0x73, 0x9A, 0xCF, 0xB3, 0xF7, 0x7C, 0x7D, 0xE7, 0xF4,
+ 0xFB, 0x70, 0xF4, 0xFF, 0x82, 0x13, 0x31, 0x47, 0x66, 0xAC, 0x93, 0x3C, 0x5E, 0x59, 0x1B, 0xEE,
+ 0xEE, 0x63, 0x39, 0xF6, 0xED, 0x97, 0xAC, 0x17, 0x63, 0x90, 0xF2, 0x99, 0xCB, 0xC1, 0x8C, 0x37,
+ 0x42, 0xE1, 0x58, 0xF1, 0x91, 0xCA, 0x9E, 0x43, 0x01, 0x17, 0xA4, 0xD5, 0xDB, 0x48, 0x26, 0x2B,
+ 0xB9, 0x91, 0xE0, 0x42, 0xC0, 0xB2, 0x9C, 0x55, 0xD6, 0x0B, 0xF2, 0xC4, 0x03, 0x3B, 0x8B, 0xD2,
+ 0x42, 0xFB, 0xDD, 0xDD, 0xB8, 0x22, 0x01, 0x10, 0xC4, 0xE9, 0xA8, 0x88, 0xA4, 0x98, 0x5A, 0xBF,
+ 0x20, 0xEB, 0x6B, 0x0D, 0x6C, 0xB5, 0x2C, 0x82, 0xA8, 0xC5, 0xE4, 0xC2, 0x38, 0x77, 0x5E, 0x43,
+ 0x73, 0x75, 0x03, 0x6D, 0xDC, 0xD3, 0xE4, 0x01, 0xFD, 0x5A, 0x25, 0xD7, 0xF2, 0x7F, 0xC7, 0xF7,
+ 0x53, 0x94, 0x32, 0x11, 0xA1, 0x70, 0x46, 0x61, 0x33, 0x39, 0x73, 0xFB, 0xB9, 0x93, 0xD1, 0x59,
+ 0x92, 0xE8, 0xCB, 0x4A, 0x17, 0xB9, 0xB8, 0x75, 0xA8, 0xCC, 0x14, 0xD9, 0xD6, 0x4D, 0xF7, 0x71,
+ 0xB6, 0x3D, 0xDC, 0x56, 0x1E, 0x5D, 0x53, 0x83, 0xEE, 0xEA, 0x5C, 0xCE, 0xA0, 0xDC, 0x73, 0x4D,
+ 0xE5, 0x6D, 0x1D, 0x8C, 0x6B, 0xE1, 0xD9, 0x27, 0xAE, 0x70, 0x61, 0xEE, 0x8C, 0x3B, 0x83, 0x6A,
+ 0x94, 0x70, 0x28, 0xB1, 0x83, 0x03, 0x6E, 0x0A, 0xE9, 0xA7, 0x15, 0x42, 0x6F, 0x11, 0x95, 0x1D,
+ 0x05, 0x63, 0x20, 0xA8, 0xFA, 0x9A, 0x4F, 0x9B, 0xCD, 0xAF, 0xDA, 0xA2, 0x76, 0x12, 0x41, 0xB1,
+ 0x38, 0xCC, 0x43, 0xFB, 0x88, 0xB7, 0xB4, 0xAB, 0xC0, 0x60, 0x13, 0xC3, 0x8D, 0x98, 0x67, 0x51,
+ 0x35, 0xCE, 0x91, 0x8D, 0xF6, 0x06, 0xA1, 0xE5, 0xB3, 0x36, 0x1C, 0xE2, 0xEA, 0x58, 0x75, 0x7A,
+ 0xD1, 0x5A, 0xF2, 0xE6, 0x97, 0x17, 0x82, 0x07, 0x8D, 0xBD, 0x73, 0xF0, 0x2B, 0x23, 0x37, 0xDA,
+ 0xF7, 0xE0, 0xCE, 0xF0, 0xFB, 0x52, 0xA5, 0x4E, 0x62, 0xF7, 0xDF, 0xC6, 0x07, 0x56, 0xF0, 0x4B,
+ 0x75, 0xD2, 0x05, 0xC2, 0xD8, 0xE2, 0x60, 0xDE, 0x02, 0x21, 0x65, 0x68, 0x38, 0x5E, 0xA4, 0x4A,
+ 0x91, 0x51, 0x12, 0x71, 0xA4, 0x32, 0x52, 0xFD, 0x34, 0x5C, 0xC4, 0x0D, 0x38, 0x66, 0x22, 0xC5,
+ 0xD5, 0x28, 0xD2, 0xB2, 0x4A, 0x76, 0x9A, 0x04, 0xAD, 0x90, 0x34, 0xCF, 0x44, 0x56, 0xF0, 0x10,
+ 0x04, 0x16, 0x25, 0x3C, 0x05, 0x6F, 0x3D, 0xBD, 0xDC, 0x56, 0x15, 0xE8, 0x51, 0xC4, 0xB3, 0x7E,
+ 0xB6, 0xBC, 0x00, 0x20, 0xEA, 0x21, 0x9D, 0x9B, 0x8F, 0xBB, 0x76, 0x70, 0x16, 0x45, 0x23, 0xDE,
+ 0xC3, 0xA5, 0xB7, 0x18, 0x2E, 0x93, 0x5B, 0x65, 0x53, 0x35, 0xDC, 0xED, 0x55, 0x01, 0x89, 0xA6,
+ 0x2A, 0x26, 0xDE, 0x31, 0x68, 0x6D, 0x65, 0xA3, 0x40, 0xB0, 0xC9, 0xC9, 0x83, 0xEF, 0xB5, 0x95,
+ 0x98, 0xC5, 0xD6, 0x35, 0xE7, 0x25, 0x79, 0x5E, 0xFE, 0x5F, 0x5F, 0x32, 0x5F, 0xF8, 0x19, 0x41,
+ 0xB8, 0x97, 0x73, 0xEE, 0xAC, 0x6A, 0x8F, 0x7C, 0x48, 0xEC, 0x02, 0x48, 0x17, 0x0C, 0x60, 0x87,
+ 0x9A, 0x4E, 0xC5, 0xAE, 0x3C, 0xA5, 0xBE, 0x18, 0x34, 0xC6, 0xDF, 0x79, 0x1B, 0x3D, 0x4E, 0xEC,
+ 0x98, 0xE5, 0x59, 0x1B, 0xAC, 0xBF, 0xC3, 0x4A, 0xF4, 0x84, 0x97, 0x21, 0xCA, 0xA2, 0xB3, 0xF3,
+ 0xE4, 0x2B, 0x78, 0xB9, 0x51, 0x43, 0x2A, 0x1C, 0x47, 0xC1, 0x54, 0x3B, 0x0A, 0x75, 0x16, 0x58,
+ 0x6E, 0x7B, 0x73, 0xBF, 0xAD, 0xEA, 0xD6, 0x86, 0xF9, 0x1B, 0x06, 0x5B, 0x1C, 0x34, 0xC0, 0xEE,
+ 0x41, 0x05, 0xB1, 0x8D, 0xE6, 0x2B, 0x61, 0xB1, 0x24, 0x17, 0x89, 0xB1, 0x43, 0xCF, 0xAE, 0xC0,
+ 0x21, 0x76, 0x23, 0xC7, 0xA5, 0xE7, 0xDE, 0x44, 0x9F, 0x12, 0x8B, 0x6C, 0xBC, 0x19, 0x82, 0xCA,
+ 0x23, 0x39, 0x9E, 0xEC, 0x4E, 0xCE, 0x0F, 0x01, 0x51, 0x0D, 0xFE, 0x62, 0x9E, 0x80, 0xF4, 0x69,
+ 0xB3, 0x7A, 0xBC, 0x63, 0x96, 0x60, 0xD3, 0xEA, 0xFB, 0xC4, 0xEE, 0x1B, 0x34, 0x86, 0xA0, 0x7C,
+ 0x2C, 0xAE, 0x6D, 0x71, 0x30, 0x59, 0x22, 0x2C, 0x24, 0xE3, 0x7B, 0x46, 0x7D, 0x18, 0xE1, 0xBA,
+ 0x5D, 0xC0, 0x15, 0x67, 0x0A, 0x04, 0x62, 0xC1, 0x8C, 0x5C, 0xC5, 0x2E, 0x19, 0xB3, 0x8A, 0x41,
+ 0xBE, 0x2A, 0x76, 0x22, 0x8C, 0x76, 0xA2, 0x45, 0xDB, 0xB7, 0x7E, 0x1D, 0xB0, 0x76, 0x37, 0x59,
+ 0xDC, 0x22, 0x47, 0x7D, 0xAB, 0x34, 0x4D, 0x5F, 0x41, 0xCE, 0x89, 0x5D, 0x84, 0xF1, 0xBE, 0x90,
+ 0x25, 0xD3, 0xAC, 0xEE, 0x9F, 0x2A, 0x1E, 0x5C, 0xE2, 0x19, 0x76, 0x6F, 0xA2, 0x5C, 0x28, 0xAC,
+ 0x99, 0xBD, 0x59, 0x86, 0x08, 0x36, 0x0C, 0xB8, 0x3E, 0xD1, 0x98, 0x5D, 0x62, 0x94, 0x8F, 0xB1,
+ 0xA3, 0xE4, 0xFD, 0x56, 0x09, 0x95, 0xCB, 0xFD, 0x79, 0x7C, 0x6A, 0x78, 0x81, 0x19, 0x3C, 0x34,
+ 0x8A, 0x3B, 0x47, 0x10, 0x48, 0xBC, 0x22, 0x3D, 0xEB, 0x6A, 0xE7, 0x2E, 0xB0, 0xE1, 0x42, 0x55,
+ 0xE4, 0x2D, 0x98, 0xD1, 0x7B, 0x9C, 0xD2, 0x5E, 0x6F, 0x52, 0x33, 0x1E, 0xBB, 0x62, 0xBA, 0xB8,
+ 0xFB, 0x2B, 0x52, 0xE1, 0x3D, 0xA0, 0xB4, 0xDD, 0x05, 0xAC, 0xA6, 0xDC, 0x3A, 0x07, 0x0F, 0xB0,
+ 0x78, 0x5E, 0x93, 0xDE, 0xBD, 0x2A, 0x34, 0x92, 0xE0, 0xF0, 0xBC, 0x32, 0xB1, 0xEC, 0xAE, 0xD6,
+ 0x10, 0x37, 0x48, 0x89, 0x50, 0x74, 0x24, 0xEF, 0xC2, 0x5A, 0xFA, 0xF1, 0xCA, 0x5D, 0x12, 0xF9,
+ 0x00, 0xCE, 0x95, 0xA5, 0x9A, 0xC1, 0x38, 0x42, 0x27, 0xE6, 0xD3, 0xD6, 0xE1, 0x20, 0xDE, 0x6E,
+ 0x96, 0x1D, 0x1A, 0x02, 0xC3, 0x0E, 0x10, 0x3E, 0x55, 0x27, 0x78, 0xFA, 0xA1, 0x2B, 0x25, 0x6D,
+ 0x30, 0x97, 0xA5, 0xA6, 0xA0, 0x9D, 0xDE, 0x12, 0x2B, 0xDA, 0x82, 0xF9, 0xE9, 0xF5, 0x4F, 0xB9,
+ 0x30, 0x44, 0x57, 0x92, 0xC7, 0x64, 0xFE, 0x77, 0xF7, 0x0A, 0x4C, 0xC0, 0x96, 0xDD, 0x79, 0xFD,
+ 0xCC, 0xE7, 0xFE, 0x6A, 0x8F, 0x69, 0x34, 0x37, 0xB4, 0x41, 0xAA, 0x72, 0x74, 0xC6, 0xDA, 0xCD,
+ 0x7E, 0x72, 0x14, 0x92, 0x2D, 0xA1, 0x77, 0xAD, 0x1C, 0xDF, 0x99, 0x79, 0x6C, 0xEE, 0xDA, 0x0F,
+ 0x4C, 0x45, 0x93, 0x52, 0xC9, 0x83, 0x07, 0x57, 0x1A, 0xE2, 0xE0, 0xE6, 0x3F, 0x91, 0x7F, 0x72,
+ 0x0E, 0x2F, 0xC9, 0x21, 0x09, 0xB6, 0x66, 0xEA, 0xB2, 0x8D, 0xFB, 0x3E, 0xD2, 0x7C, 0xA4, 0xB5,
+ 0xE9, 0xFF, 0x35, 0xFB, 0x1A, 0x92, 0x81, 0xEA, 0x1D, 0x08, 0x01, 0x6F, 0x7E, 0x02, 0x55, 0x5E,
+ 0x11, 0x51, 0xD1, 0x37, 0x35, 0xD7, 0x96, 0xAD, 0xAC, 0xE4, 0x73, 0x3B, 0x63, 0x1A, 0x57, 0xCB,
+ 0xF8, 0xF7, 0x84, 0xC5, 0x10, 0x84, 0x1F, 0x30, 0x4E, 0x8E, 0xDA, 0xA0, 0xBE, 0xD1, 0x38, 0xC5,
+ 0x7B, 0x08, 0x3C, 0x9D, 0xA3, 0x09, 0x9F, 0x64, 0xE4, 0x12, 0xBA, 0x54, 0x45, 0x2D, 0x32, 0x2A,
+ 0x14, 0xCC, 0x75, 0xF5, 0xE0, 0xEB, 0x05, 0x87, 0x9B, 0xE4, 0x83, 0x52, 0x67, 0xC4, 0xB7, 0x9E,
+ 0x97, 0x38, 0xC7, 0x35, 0x7F, 0xF6, 0x34, 0x08, 0x3F, 0x12, 0x65, 0x88, 0x57, 0x8E, 0x60, 0x76,
+ 0xCB, 0x00, 0x4D, 0xF4, 0x88, 0x12, 0xF6, 0x3C, 0x2E, 0xA1, 0x8F, 0xD8, 0xA8, 0x29, 0x3B, 0xB0,
+ 0xE9, 0x5C, 0x32, 0x36, 0x9C, 0xAF, 0x90, 0x9F, 0x72, 0xA2, 0x96, 0x65, 0x17, 0x61, 0x06, 0x63,
+ 0x2B, 0x9E, 0x57, 0xA6, 0xA7, 0x1E, 0xB7, 0xD9, 0xEB, 0xC2, 0x2A, 0x64, 0xA3, 0x0B, 0x2A, 0x9A,
+ 0x9B, 0x87, 0x13, 0x25, 0x2C, 0x7C, 0xED, 0x8F, 0x21, 0x04, 0x13, 0x4A, 0xF1, 0xB9, 0xD2, 0x0D,
+ 0xAF, 0x95, 0x85, 0x77, 0x0C, 0x94, 0x77, 0xAF, 0x03, 0xA6, 0xA7, 0x3B, 0x06, 0xDF, 0x61, 0x08,
+ 0x36, 0x01, 0x49, 0x6D, 0x7F, 0x34, 0x4F, 0x56, 0x17, 0x50, 0xB5, 0xB4, 0xE7, 0xE7, 0xAE, 0xF5,
+ 0x61, 0xB5, 0xEB, 0xFD, 0x40, 0x15, 0x37, 0x9C, 0xF0, 0xA0, 0x47, 0x89, 0x45, 0x2B, 0x16, 0x49,
+ 0x98, 0xD0, 0xF7, 0x7F, 0x7A, 0xBC, 0x60, 0xA1, 0xBD, 0x7A, 0xB1, 0x75, 0xBD, 0x55, 0xD6, 0x2D,
+ 0x19, 0x5A, 0x51, 0x09, 0xA6, 0xA5, 0x19, 0x98, 0xC2, 0xA3, 0xA0, 0x40, 0x4F, 0x1A, 0x23, 0x04,
+ 0x55, 0x46, 0xA7, 0x1E, 0xE8, 0x33, 0xE1, 0x90, 0x13, 0x74, 0x74, 0x15, 0xA1, 0xCE, 0x47, 0x9C,
+ 0x62, 0x7D, 0x46, 0x3E, 0xE6, 0x2A, 0x51, 0xC4, 0x12, 0xB3, 0x6B, 0x4A, 0x1A, 0xBD, 0xE1, 0x10,
+ 0x8D, 0x64, 0x8A, 0xA8, 0x1D, 0x5F, 0x2E, 0x2F, 0x2F, 0x34, 0xD3, 0xEF, 0x48, 0x1C, 0x5E, 0xAE,
+ 0xA1, 0x53, 0xDB, 0xD5, 0x56, 0x8D, 0xD2, 0x10, 0xDB, 0x1B, 0x6A, 0x64, 0x86, 0x44, 0x27, 0xC5,
+ 0xD0, 0xE0, 0xD0, 0x94, 0x6F, 0xDC, 0x5A, 0x0D, 0x60, 0x93, 0xFA, 0x54, 0x65, 0xE0, 0xA8, 0x14,
+ 0xDB, 0xDF, 0x9F, 0x7B, 0xBB, 0xFA, 0xF7, 0xD5, 0x49, 0x7E, 0xB1, 0x38, 0x2F, 0x49, 0x02, 0xF6,
+ 0x15, 0xB7, 0x6F, 0x25, 0xFA, 0xDB, 0xE4, 0x1A, 0xB9, 0xCF, 0x5F, 0xA1, 0x6C, 0x7D, 0x71, 0xED,
+ 0xCC, 0xAB, 0x76, 0x4E, 0xE2, 0xC8, 0x44, 0x1A, 0xF9, 0xAA, 0x63, 0x51, 0xA0, 0x47, 0xE9, 0x62,
+ 0xAD, 0x48, 0x25, 0x15, 0xBD, 0x6B, 0xA8, 0xF2, 0x69, 0x10, 0x0A, 0xA9, 0x56, 0xCA, 0xCA, 0xF4,
+ 0xCD, 0x7D, 0x55, 0x09, 0xDB, 0x3C, 0x34, 0x9B, 0xED, 0x3A, 0x3A, 0xF9, 0xA4, 0xB2, 0xF4, 0xCE,
+ 0xD5, 0x46, 0x77, 0x34, 0xA3, 0x96, 0xA8, 0x0E, 0xA1, 0xB5, 0xD3, 0x69, 0x68, 0xF5, 0xB3, 0x17,
+ 0x99, 0x30, 0xBE, 0x03, 0xB0, 0x89, 0x1D, 0x75, 0xA4, 0xF7, 0x79, 0xF6, 0x7D, 0xA0, 0x24, 0xCD,
+ 0xE0, 0x0A, 0x92, 0x4D, 0xE4, 0xF7, 0x28, 0xE7, 0x52, 0x0C, 0x28, 0x62, 0xBA, 0x24, 0xD6, 0xA4,
+ 0x02, 0xFF, 0xD1, 0x6B, 0xDE, 0x0C, 0xB9, 0xA1, 0xBC, 0xBD, 0x2C, 0x7D, 0xF6, 0xFF, 0x2C, 0x8D,
+ 0x83, 0x08, 0x62, 0xC5, 0x6B, 0x9F, 0x11, 0xA2, 0x7D, 0xB7, 0x90, 0x38, 0x08, 0xB9, 0xDC, 0x46,
+ 0xA3, 0xD1, 0xD1, 0xE5, 0x36, 0xC3, 0xEE, 0x5F, 0x82, 0x63, 0x4E, 0x66, 0x30, 0x38, 0xC8, 0x40,
+ 0x2E, 0xB8, 0x82, 0xAE, 0x95, 0xCF, 0x45, 0x1A, 0xF9, 0x2A, 0x85, 0x9C, 0x66, 0x96, 0x7D, 0x69,
+ 0xC5, 0xE7, 0x13, 0xD6, 0x86, 0x39, 0x14, 0xE3, 0x1B, 0xBF, 0x78, 0x5B, 0xFB, 0x6A, 0x88, 0x1A,
+ 0xCA, 0x21, 0x6C, 0xE3, 0x80, 0xCE, 0x61, 0x3F, 0x13, 0x7A, 0xFD, 0x16, 0x4F, 0x32, 0xE0, 0xB8,
+ 0x76, 0x6D, 0x1D, 0x46, 0xB9, 0xF4, 0xA1, 0x05, 0x53, 0x5E, 0x96, 0x42, 0xF3, 0xF5, 0xA6, 0xAF,
+ 0x87, 0x78, 0xCF, 0x3D, 0x84, 0xB1, 0xFC, 0x97, 0x1F, 0x86, 0x79, 0x1E, 0xCE, 0xEF, 0x21, 0x13,
+ 0x5F, 0xD3, 0x23, 0xD3, 0x52, 0xE7, 0x31, 0x37, 0x40, 0x08, 0xB7, 0x6C, 0x50, 0xCA, 0x82, 0xB5,
+ 0x47, 0x04, 0x98, 0x5F, 0x28, 0xAA, 0x39, 0x76, 0xFA, 0x18, 0xAD, 0x08, 0x57, 0x9F, 0xFE, 0x7B,
+ 0x6F, 0x2B, 0x46, 0x83, 0x6C, 0xDE, 0x90, 0xCB, 0x41, 0x40, 0x22, 0x24, 0x4B, 0x82, 0x23, 0x72,
+ 0xC0, 0x28, 0x79, 0xAC, 0xE8, 0xF5, 0x96, 0xC2, 0xC1, 0x76, 0x6C, 0x5B, 0xBA, 0xFB, 0x60, 0x12,
+ 0xA1, 0xF1, 0x59, 0xE9, 0x70, 0x97, 0x5C, 0xD3, 0x6D, 0x3C, 0xC2, 0x18, 0xA4, 0x30, 0x37, 0xF0,
+ 0xAC, 0x92, 0xB3, 0xC3, 0x1F, 0xAA, 0x73, 0x03, 0x0A, 0x9F, 0x01, 0x5F, 0x4C, 0x68, 0x3A, 0xA5,
+ 0xB0, 0xB9, 0xBB, 0x87, 0xA4, 0x76, 0x9B, 0x36, 0xD0, 0x35, 0x68, 0x26, 0xEE, 0x76, 0x82, 0xDA,
+ 0x81, 0x16, 0xFB, 0x82, 0xD2, 0x9D, 0xCD, 0x4F, 0x3A, 0xAD, 0xA3, 0xC2, 0xBD, 0x9E, 0x60, 0x39,
+ 0x30, 0x1B, 0x9D, 0x4F, 0xAD, 0x0C, 0x88, 0x54, 0x57, 0x64, 0xFD, 0xBB, 0x63, 0x37, 0x7A, 0xB0,
+ 0x7E, 0x4C, 0x69, 0x4C, 0x6D, 0x78, 0x84, 0x69, 0x59, 0xF2, 0xAF, 0xFD, 0x76, 0x67, 0x0D, 0x1A,
+ 0x40, 0xB4, 0x4A, 0xE7, 0xDB, 0x9D, 0xD7, 0xD8, 0x66, 0xC7, 0x8D, 0xAD, 0x4C, 0xE2, 0x9D, 0x1A,
+ 0x63, 0xA2, 0x56, 0xD9, 0x40, 0x6D, 0x7B, 0xE0, 0x0F, 0x78, 0xAA, 0x88, 0xA7, 0xA8, 0x62, 0xE3,
+ 0x7E, 0xE9, 0x8C, 0x65, 0xB5, 0x56, 0x2A, 0x1E, 0x5C, 0xDF, 0xC4, 0x3C, 0xC3, 0x5D, 0x46, 0x00,
+ 0xF1, 0x8A, 0x0B, 0x7C, 0x58, 0x94, 0xA4, 0x5B, 0xAA, 0x3A, 0x72, 0x0D, 0xE9, 0x59, 0x99, 0x87,
+ 0x06, 0xE8, 0xC9, 0x4F, 0xC5, 0x54, 0x10, 0x00, 0xAE, 0x45, 0xCF, 0xE7, 0x81, 0xE5, 0xC4, 0x85,
+ 0x70, 0xD6, 0xD9, 0x60, 0x9D, 0x19, 0x5F, 0xC9, 0xBE, 0x3D, 0xB7, 0x24, 0xB4, 0x7B, 0x08, 0xFB,
+ 0xA4, 0x9E, 0x36, 0x26, 0xA0, 0xF2, 0x86, 0xE9, 0x67, 0x10, 0xF6, 0x8E, 0xE9, 0xEB, 0xA3, 0xB3,
+ 0x75, 0x83, 0x38, 0xA7, 0x45, 0x81, 0xF0, 0xF3, 0x62, 0x18, 0x02, 0xF1, 0x95, 0x8C, 0xEA, 0x39,
+ 0xD2, 0xB7, 0x11, 0xC0, 0x06, 0x11, 0x07, 0x42, 0x54, 0xE5, 0x2B, 0xC8, 0xD5, 0x8C, 0x08, 0x25,
+ 0xE1, 0xD0, 0x8D, 0x7E, 0x61, 0x28, 0x79, 0x6A, 0x2B, 0x33, 0xD9, 0xE9, 0x6B, 0x04, 0x95, 0x1E,
+ 0xE0, 0xA1, 0xA4, 0x32, 0x71, 0x0E, 0xCD, 0xCB, 0x80, 0xB8, 0x38, 0x79, 0xF0, 0x9E, 0x58, 0x5E,
+ 0xF6, 0x35, 0xCC, 0xC5, 0xB9, 0xC7, 0x73, 0xCF, 0x13, 0xEA, 0x77, 0x18, 0xD4, 0x37, 0x46, 0x1B,
+ 0x66, 0xED, 0x68, 0xEA, 0x1B, 0x38, 0xCF, 0xAD, 0x64, 0x28, 0x1C, 0x04, 0x81, 0x52, 0x03, 0x8F,
+ 0xC7, 0x45, 0xAE, 0x52, 0xD4, 0x23, 0x27, 0xDB, 0x2C, 0x98, 0xE8, 0x74, 0xE6, 0xA7, 0x1E, 0x6E,
+ 0x31, 0x10, 0xF5, 0xBB, 0x1A, 0xA0, 0x5F, 0x6C, 0xAE, 0x38, 0xD7, 0xC6, 0xA2, 0x77, 0x6A, 0x47,
+ 0x92, 0xC5, 0xC3, 0xE3, 0x12, 0xCE, 0x9A, 0xCB, 0x1F, 0x75, 0xED, 0x1C, 0x16, 0x30, 0xB8, 0xCC,
+ 0x4E, 0xB1, 0xA5, 0xCE, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x22, 0x77, 0x9B,
+ 0x13, 0x10, 0x2C, 0x53, 0x96, 0x24, 0x02, 0xA1, 0x6B, 0xB1, 0xEF, 0xC8, 0xE9, 0xF0, 0x2A, 0x87,
+ 0xEF, 0xE3, 0xBF, 0xD8, 0xB3, 0x16, 0xC2, 0x6C, 0xFE, 0xC2, 0xAC, 0x91, 0x28, 0x4F, 0x31, 0xA8,
+ 0xAF, 0x51, 0x1C, 0xB7, 0x37, 0xA7, 0x6E, 0x77, 0x37, 0x78, 0x2B, 0x74, 0x78, 0xEF, 0x09, 0x9B,
+ 0x55, 0x30, 0x4E, 0x23, 0xFE, 0xCE, 0x62, 0xCE, 0x92, 0x38, 0x49, 0x6F, 0x5D, 0xDD, 0xCD, 0x09,
+ 0x9E, 0xEB, 0xC5, 0xCC, 0x9B, 0xC2, 0xE4, 0xBF, 0x12, 0x47, 0xFA, 0xA5, 0xB6, 0x89, 0x09, 0x25,
+ 0xDA, 0x33, 0x3A, 0xFD, 0x77, 0xB2, 0x7A, 0xB3, 0x77, 0xC1, 0x88, 0x88, 0x8E, 0xC5, 0x81, 0xA6,
+ 0x5E, 0x69, 0xE1, 0xA4, 0xB0, 0x4A, 0x99, 0x59, 0xA0, 0xC7, 0x11, 0x9E, 0xBC, 0x63, 0x62, 0x43,
+ 0xC0, 0x2C, 0x33, 0x63, 0x6B, 0x51, 0xCE, 0xDC, 0x15, 0x8C, 0x59, 0x46, 0x6D, 0x91, 0x98, 0x1B,
+ 0x59, 0xA5, 0x48, 0xF1, 0x04, 0x8E, 0x06, 0xA6, 0x5D, 0x30, 0xB6, 0xAF, 0xBF, 0x84, 0x78, 0x06,
+ 0x8B, 0x79, 0x69, 0xB5, 0x19, 0x5A, 0x85, 0xD6, 0xF4, 0x6B, 0xD4, 0x0D, 0x80, 0xDB, 0xCF, 0xC6,
+ 0xCA, 0xE1, 0x48, 0x3C, 0x97, 0x19, 0x5E, 0x4B, 0xE6, 0x5C, 0x6D, 0xAF, 0xA0, 0xBE, 0xF6, 0x50,
+ 0x4C, 0xE2, 0x58, 0xDD, 0xE7, 0xCD, 0x28, 0x70, 0x54, 0x3B, 0x50, 0x97, 0x20, 0xB1, 0x19, 0xF2,
+ 0x09, 0x0B, 0xBB, 0xCF, 0x35, 0xDA, 0x36, 0xAB, 0x12, 0xBA, 0xAF, 0xFF, 0xF4, 0x6C, 0x87, 0xA7,
+ 0xB9, 0x7C, 0x02, 0xB7, 0xC7, 0x16, 0x7E, 0x3E, 0xF1, 0x33, 0x9E, 0x60, 0x9C, 0x3F, 0xCC, 0xAC,
+ 0x01, 0x4C, 0x13, 0xF0, 0x43, 0xBF, 0x21, 0x60, 0xE9, 0xBA, 0x34, 0x2B, 0x08, 0xD2, 0xFE, 0x0F,
+ 0x73, 0x52, 0xAE, 0xA2, 0x54, 0x51, 0x90, 0xD2, 0x9E, 0xE9, 0x62, 0xAC, 0x37, 0x39, 0x2A, 0xAD,
+ 0x0A, 0x1C, 0xFE, 0x09, 0x30, 0xDD, 0x9C, 0x2F, 0x52, 0xFD, 0x8F, 0x41, 0xF9, 0xCE, 0xAE, 0xB8,
+ 0x66, 0xB6, 0x44, 0x1A, 0x82, 0x53, 0x33, 0x48, 0xA6, 0x8D, 0xEF, 0xE8, 0x80, 0xC3, 0x0E, 0xD7,
+ 0x80, 0xC6, 0x13, 0x1F, 0x4C, 0x99, 0x43, 0x56, 0x45, 0x35, 0x54, 0x33, 0x68, 0x1F, 0xEF, 0x7F,
+ 0xB2, 0xB1, 0xF5, 0x7E, 0x7E, 0x08, 0xDE, 0xD2, 0x5B, 0x52, 0x89, 0x20, 0xDF, 0xD9, 0x5A, 0x64,
+ 0x71, 0x37, 0x79, 0x98, 0x69, 0x10, 0xF6, 0xA2, 0x5F, 0xBE, 0x71, 0x35, 0xE0, 0x88, 0x74, 0x7A,
+ 0xB5, 0x81, 0x2E, 0x4E, 0x71, 0x7F, 0x5A, 0x3A, 0x8A, 0xCE, 0xBE, 0xC5, 0x40, 0x8F, 0xC5, 0x2E,
+ 0xA5, 0x9A, 0x4D, 0x74, 0xE4, 0x73, 0xC7, 0x96, 0x97, 0x84, 0x7E, 0x90, 0x44, 0x83, 0x24, 0xEE,
+ 0x83, 0x42, 0xA3, 0xCC, 0x1C, 0x7A, 0x4D, 0x27, 0x0B, 0x80, 0xD0, 0xA4, 0xAC, 0x9B, 0x1E, 0xCB,
+ 0xFC, 0x7F, 0x12, 0x31, 0x41, 0x3D, 0x06, 0x4A, 0xBC, 0xF6, 0x22, 0xF1, 0xC8, 0xF0, 0x9C, 0x1A,
+ 0x8D, 0x96, 0x5A, 0xA7, 0xB4, 0x6B, 0x45, 0xBC, 0x4D, 0x32, 0xC1, 0x9C, 0xC6, 0xA0, 0xCE, 0xED,
+ 0x7B, 0x97, 0x59, 0x7F, 0x42, 0x32, 0x22, 0xA3, 0x18, 0xFD, 0x65, 0xBC, 0x2C, 0xC3, 0xEA, 0xE8,
+ 0xBD, 0xC1, 0xFF, 0xE1, 0x20, 0xAB, 0xC0, 0x6A, 0xDA, 0xF9, 0x3A, 0x85, 0x79, 0x7A, 0x10, 0xB9,
+ 0xA0, 0x7A, 0xAA, 0xAD, 0xF1, 0x8D, 0x67, 0x8F, 0x59, 0xE0, 0x10, 0x4A, 0x62, 0xA7, 0xD1, 0x8D,
+ 0xF9, 0x26, 0xBE, 0x00, 0x42, 0x81, 0xA0, 0x1F, 0xFF, 0xCE, 0xAE, 0xAF, 0x1C, 0x56, 0x92, 0x48,
+ 0x65, 0xE7, 0x2A, 0xC6, 0xE2, 0x78, 0xDE, 0xA2, 0x87, 0x5C, 0x89, 0x3E, 0x38, 0xC4, 0x30, 0xB4,
+ 0x07, 0x75, 0x7A, 0x01, 0x76, 0xCD, 0x95, 0xD2, 0xA1, 0x4C, 0x37, 0xB5, 0xA5, 0x2B, 0xE5, 0x09,
+ 0x8B, 0x45, 0x5C, 0x77, 0x9F, 0xE8, 0xAB, 0xB9, 0xD6, 0xB0, 0x91, 0x57, 0xA6, 0x9E, 0x5D, 0x01,
+ 0xB5, 0xE2, 0xE5, 0x11, 0xC5, 0x77, 0xC1, 0x11, 0x54, 0x97, 0x45, 0x4F, 0x8E, 0x75, 0xB4, 0xA3,
+ 0xD7, 0xF4, 0x0F, 0xCC, 0x69, 0xAA, 0xB2, 0xAC, 0xB4, 0x92, 0xD4, 0x66, 0xB8, 0xA1, 0x91, 0xA2,
+ 0x74, 0xEF, 0xBE, 0x1D, 0xDF, 0xBD, 0xF9, 0x26, 0x34, 0x1D, 0x71, 0x7C, 0x54, 0x14, 0x42, 0x40,
+ 0x94, 0x4B, 0xA2, 0xF2, 0x1C, 0xD6, 0x86, 0x32, 0x22, 0x64, 0xE4, 0x13, 0x8D, 0x6A, 0xA2, 0x1C,
+ 0xB0, 0x3F, 0x78, 0xA9, 0x56, 0x61, 0xFB, 0x56, 0xEE, 0x3D, 0x26, 0x2A, 0x1C, 0x7E, 0x4D, 0x22,
+ 0xD4, 0xFA, 0xA6, 0xBA, 0x7E, 0x2D, 0x9B, 0x6C, 0xF7, 0x64, 0x20, 0xCA, 0xD6, 0x89, 0x49, 0x92,
+ 0xFF, 0x2A, 0xBB, 0xA8, 0x8A, 0xE5, 0x90, 0xEA, 0x20, 0x07, 0xFF, 0xE7, 0xF5, 0xD6, 0x96, 0x77,
+ 0xE2, 0xEB, 0xC4, 0xD2, 0x51, 0x19, 0x74, 0x83, 0xE2, 0xA3, 0xC2, 0x77, 0xF9, 0x2E, 0x73, 0x95,
+ 0x86, 0x76, 0x82, 0x6F, 0xB6, 0x4A, 0x0B, 0x6A, 0x95, 0xCA, 0xDD, 0x7F, 0x66, 0x17, 0x09, 0xE1,
+ 0xD9, 0xD1, 0xA0, 0xE7, 0x25, 0x64, 0xCB, 0xB6, 0x9A, 0x0F, 0x33, 0x0F, 0xFB, 0xB3, 0x52, 0x78,
+ 0x00, 0x4E, 0xFB, 0xFF, 0xC9, 0x55, 0x2A, 0x66, 0x8B, 0xC7, 0x9B, 0x4B, 0x94, 0xFB, 0x5E, 0x77,
+ 0x54, 0x08, 0x94, 0xC3, 0x7C, 0xFB, 0x63, 0xF0, 0x7C, 0x7C, 0xD5, 0xC4, 0xE2, 0xAE, 0x9F, 0x8E,
+ 0x7F, 0xA2, 0x43, 0x10, 0x6E, 0x1C, 0x9C, 0xC7, 0x62, 0x1E, 0x58, 0x87, 0xFE, 0x80, 0x0F, 0x53,
+ 0x40, 0x1E, 0xC9, 0xA5, 0xE1, 0xCD, 0xFC, 0x65, 0x75, 0x5B, 0xC8, 0x4B, 0x18, 0x0C, 0x71, 0x70,
+ 0xF6, 0x0E, 0x70, 0xE6, 0x9C, 0xE0, 0xF3, 0xFE, 0x2A, 0xA2, 0x58, 0x23, 0x80, 0x85, 0xAD, 0xA0,
+ 0x65, 0xA2, 0x62, 0xB6, 0xB5, 0x0A, 0x78, 0x3E, 0xF9, 0x46, 0x85, 0x22, 0xA5, 0xBD, 0x63, 0xB3,
+ 0x56, 0x75, 0x99, 0xD6, 0x87, 0xFB, 0x6A, 0xB6, 0xB1, 0x02, 0x3B, 0xB1, 0x10, 0x32, 0x19, 0x71,
+ 0x32, 0xD4, 0x12, 0xFB, 0x49, 0xBC, 0x51, 0x09, 0xC7, 0x2F, 0xFF, 0xB8, 0xA2, 0xE3, 0x1D, 0xCA,
+ 0x74, 0xC1, 0x41, 0xC3, 0xEF, 0x3F, 0xDC, 0x4D, 0x40, 0xEA, 0xF7, 0xBB, 0x05, 0x91, 0x11, 0x78,
+ 0x99, 0xB4, 0xA4, 0xD9, 0x39, 0x17, 0x87, 0xDF, 0x25, 0xDB, 0xE0, 0x73, 0xA6, 0xE9, 0x3D, 0x27,
+ 0x44, 0xCD, 0x4F, 0xB1, 0x8E, 0x1A, 0x90, 0x94, 0x07, 0xC9, 0x3E, 0x93, 0x46, 0xDB, 0x05, 0x06,
+ 0xF8, 0x64, 0x5D, 0x78, 0xBF, 0x7D, 0x73, 0x59, 0x69, 0x5C, 0x6C, 0x1A, 0xE1, 0x86, 0x9E, 0x69,
+ 0x3C, 0x3B, 0x51, 0x09, 0xE6, 0x43, 0xD3, 0x2B, 0xA8, 0x47, 0x37, 0xAE, 0x9C, 0xBA, 0x6C, 0x3C,
+ 0x2C, 0x46, 0x60, 0x24, 0x69, 0xE8, 0xCE, 0xF5, 0x40, 0xCA, 0x72, 0x7E, 0x2E, 0xAA, 0x6F, 0x60,
+ 0x7E, 0x79, 0x53, 0xFC, 0x09, 0x30, 0x3E, 0x2D, 0x60, 0x21, 0xBA, 0x68, 0x54, 0x49, 0x91, 0x76,
+ 0x53, 0x60, 0x23, 0xE5, 0xC8, 0x9B, 0xA4, 0x4C, 0x64, 0xD5, 0x02, 0x46, 0x95, 0xD9, 0x72, 0x3C,
+ 0x30, 0xE8, 0xF1, 0x53, 0x53, 0xC7, 0x8E, 0x90, 0xF4, 0x34, 0xF3, 0x0C, 0x3F, 0x72, 0xCA, 0x1D,
+ 0x75, 0x72, 0xBE, 0x46, 0x8A, 0xC0, 0xD3, 0x06, 0x93, 0x72, 0xB0, 0xBF, 0xD0, 0x77, 0x99, 0x06,
+ 0x7B, 0xDF, 0x6F, 0x10, 0xFB, 0xC6, 0x1D, 0x55, 0x66, 0x2F, 0x81, 0x83, 0x72, 0x3F, 0x30, 0x60,
+ 0xFA, 0x34, 0xE9, 0xCF, 0xB3, 0x0F, 0x95, 0xBD, 0xE4, 0x9F, 0xDF, 0x53, 0x6E, 0x00, 0xC9, 0x07,
+ 0x7E, 0x9B, 0x79, 0xBD, 0xD2, 0xE2, 0x77, 0x80, 0xB4, 0xF3, 0x9A, 0x46, 0x20, 0x8C, 0x21, 0x0A,
+ 0xEA, 0xFE, 0x07, 0x61, 0x58, 0xB8, 0x38, 0x47, 0xF5, 0x75, 0x5B, 0x33, 0x78, 0x9E, 0x66, 0xDF,
+ 0x30, 0xAD, 0xD8, 0xED, 0x5D, 0x73, 0x75, 0x6D, 0x4E, 0x63, 0x8B, 0x35, 0x4F, 0xCA, 0x75, 0x58,
+ 0xDB, 0xEA, 0x2A, 0xE2, 0xB1, 0xE1, 0x15, 0x6C, 0x69, 0x46, 0xC8, 0xD9, 0x67, 0x15, 0x4B, 0xCE,
+ 0xB4, 0x04, 0x9B, 0x9D, 0xCA, 0xB7, 0x5E, 0x4B, 0xA3, 0x6C, 0xD1, 0xFF, 0x4A, 0x71, 0x71, 0x9C,
+ 0x11, 0x87, 0x5E, 0x9E, 0x5D, 0xA9, 0x05, 0x1F, 0xD8, 0x96, 0xA9, 0x3F, 0xFA, 0xEB, 0x0A, 0x91,
+ 0x44, 0xDD, 0xCF, 0x93, 0xD5, 0x0A, 0x80, 0x9C, 0xA8, 0xCB, 0x2A, 0x7F, 0x03, 0x45, 0x43, 0xA7,
+ 0xC3, 0x59, 0xFF, 0xFC, 0xFF, 0x44, 0x24, 0xB1, 0x02, 0xBB, 0x42, 0xCF, 0x45, 0xC9, 0xF4, 0xAE,
+ 0x23, 0x5D, 0xB2, 0x0B, 0xDE, 0xAD, 0x7E, 0xD6, 0x1C, 0x75, 0xFE, 0x90, 0xCF, 0x49, 0xB1, 0x51,
+ 0x36, 0x3A, 0x48, 0xD2, 0xCE, 0xAA, 0x40, 0x2D, 0xE9, 0x70, 0x85, 0xCC, 0x66, 0xB5, 0x2A, 0x85,
+ 0xA2, 0x1E, 0x18, 0x18, 0xA7, 0x6A, 0x89, 0x39, 0x1E, 0x56, 0x7E, 0xA7, 0xC7, 0x9F, 0x9B, 0xFA,
+ 0x58, 0x4A, 0x08, 0x0E, 0x78, 0x81, 0x84, 0xB3, 0x66, 0xA4, 0x8B, 0x20, 0xF2, 0xB0, 0x48, 0xA4,
+ 0xE4, 0xA1, 0xC2, 0x05, 0xB7, 0x19, 0xFE, 0x71, 0xEF, 0xCB, 0x30, 0x8C, 0xC2, 0x3B, 0xE4, 0x78,
+ 0x1C, 0x92, 0x51, 0x96, 0xC1, 0x89, 0xA3, 0x71, 0x9A, 0x6D, 0xF5, 0x35, 0xA6, 0xEE, 0x71, 0xE2,
+ 0x12, 0x55, 0x88, 0x61, 0x10, 0x50, 0x47, 0x53, 0x3D, 0xBA, 0x0F, 0x6A, 0xE9, 0x5C, 0x8B, 0x0F,
+ 0x8B, 0xAC, 0xCD, 0x20, 0xAE, 0x5B, 0x9A, 0x80, 0xB4, 0x9C, 0x27, 0x5D, 0x47, 0xD6, 0x03, 0xFE,
+ 0x68, 0x38, 0xBC, 0x34, 0x1B, 0xFD, 0x62, 0xCF, 0x9A, 0xC0, 0xC9, 0x7C, 0xAB, 0xF5, 0x85, 0x1D,
+ 0x81, 0x41, 0x6D, 0xB3, 0x62, 0x72, 0x4A, 0x6F, 0xDD, 0xA8, 0xB4, 0xAE, 0xEA, 0xE0, 0xED, 0x57,
+ 0x82, 0x0A, 0x7E, 0xD1, 0x3B, 0x7E, 0xA5, 0x43, 0x9E, 0x5F, 0x73, 0x92, 0xEF, 0xAA, 0xC5, 0xAB,
+ 0xA9, 0x07, 0xD5, 0xB5, 0x32, 0x9E, 0xD3, 0x66, 0xA3, 0x98, 0xDC, 0xF5, 0x12, 0xB6, 0x89, 0xE0,
+ 0x58, 0xE3, 0x26, 0x62, 0xDC, 0xA2, 0xB9, 0x58, 0x7C, 0x42, 0xA7, 0xFB, 0x9E, 0x12, 0xD9, 0x50,
+ 0x55, 0xFD, 0x64, 0xC7, 0xFC, 0xA1, 0x12, 0x98, 0x43, 0xEE, 0x62, 0xBC, 0x75, 0x3B, 0x5D, 0xE1,
+ 0xFF, 0xAF, 0x29, 0x4D, 0x81, 0x6A, 0xB2, 0x13, 0x2D, 0xE9, 0x9C, 0x65, 0x90, 0x1A, 0xBE, 0x06,
+ 0x69, 0x9D, 0xC7, 0xF5, 0x98, 0xEB, 0xA4, 0x13, 0x67, 0xDD, 0xA4, 0x7E, 0x23, 0x56, 0x92, 0x31,
+ 0x62, 0xA3, 0xDD, 0x7B, 0xB9, 0x1C, 0xD1, 0x0E, 0xEF, 0x1A, 0xB5, 0x94, 0xF4, 0x10, 0xD4, 0x21,
+ 0x76, 0x14, 0xC1, 0x2D, 0x5C, 0x2F, 0x71, 0x86, 0x94, 0x84, 0x41, 0x6A, 0x1F, 0xA2, 0x75, 0xFF,
+ 0x34, 0x0B, 0xCA, 0xD4, 0x11, 0x7F, 0xB7, 0xD0, 0xAB, 0x7E, 0xB9, 0x13, 0x26, 0x1B, 0x60, 0x48,
+ 0x62, 0x2A, 0xF7, 0x18, 0x24, 0xDF, 0x51, 0x6B, 0x34, 0x61, 0x99, 0x27, 0x03, 0x95, 0x6C, 0xAA,
+ 0x81, 0xFA, 0x94, 0xAB, 0x9E, 0x34, 0xA5, 0xC5, 0x8C, 0xA6, 0x6A, 0x43, 0x2D, 0x5F, 0x99, 0xE5,
+ 0x00, 0xE5, 0x51, 0x71, 0x19, 0xA6, 0xF5, 0x36, 0x1E, 0x21, 0xF2, 0x26, 0xE4, 0x7A, 0x18, 0x76,
+ 0x10, 0xE9, 0xE0, 0x9E, 0x54, 0x2D, 0xFA, 0x83, 0x9F, 0x41, 0x7C, 0x0E, 0xA7, 0xC9, 0xDD, 0x58,
+ 0x73, 0x18, 0xCB, 0x26, 0x60, 0xE8, 0x90, 0xC1, 0x4D, 0x0B, 0x01, 0x01, 0xD8, 0x57, 0xED, 0x78,
+ 0xF9, 0x28, 0x0D, 0xA7, 0x1F, 0x66, 0x99, 0x0A, 0x17, 0x8C, 0xA7, 0xC1, 0xD2, 0x51, 0x4C, 0x2E,
+ 0x7C, 0x3F, 0xE0, 0x2F, 0x66, 0x6D, 0x68, 0x2B, 0xE0, 0x17, 0x2F, 0x21, 0xE5, 0x4A, 0xD9, 0x46,
+ 0x39, 0xA4, 0xD5, 0x2E, 0xF7, 0x6F, 0xAD, 0xA9, 0x13, 0xAE, 0x97, 0xF3, 0xFC, 0xCE, 0xDA, 0x4C,
+ 0x35, 0xF1, 0x19, 0xCC, 0x27, 0xA4, 0x5C, 0xF9, 0xDD, 0x19, 0x84, 0xF2, 0x35, 0xDD, 0x3D, 0x7A,
+ 0xD0, 0x9F, 0xA5, 0x81, 0xFB, 0x66, 0x6E, 0x71, 0x83, 0x88, 0x47, 0xA5, 0xF7, 0xE8, 0x19, 0x5B,
+ 0x93, 0xE0, 0x1A, 0xE4, 0xED, 0x56, 0xC5, 0xCC, 0x8D, 0xCB, 0x50, 0x41, 0x0B, 0xEA, 0x2D, 0x2F,
+ 0xBA, 0x8A, 0xA3, 0x64, 0x46, 0x5F, 0x27, 0x22, 0x17, 0xD9, 0xCC, 0xD6, 0xAD, 0x32, 0xE6, 0x19,
+ 0x35, 0xD2, 0x3C, 0x54, 0xB5, 0x14, 0xC8, 0x3C, 0x65, 0x9F, 0xA4, 0x2A, 0x44, 0xBA, 0xF3, 0xE5,
+ 0xBA, 0x10, 0x3B, 0xD6, 0x67, 0xFB, 0x94, 0x99, 0x9A, 0xD7, 0x37, 0x96, 0xC6, 0x6B, 0xD7, 0xBA,
+ 0x58, 0x82, 0xED, 0x49, 0xD8, 0x6A, 0x58, 0xDB, 0x04, 0x78, 0x62, 0x8D, 0x30, 0xCA, 0xA0, 0xB8,
+ 0xDE, 0xCD, 0x06, 0x7D, 0xF3, 0xE8, 0xF8, 0x54, 0xD7, 0xD4, 0x8D, 0xFB, 0xD0, 0xB9, 0x08, 0xE3,
+ 0xCE, 0x81, 0x7C, 0xCF, 0x71, 0x41, 0x03, 0x1B, 0x9A, 0xED, 0x5C, 0x71, 0xB5, 0x7B, 0x56, 0xDC,
+ 0x0B, 0x1F, 0xF1, 0xAF, 0x55, 0xE2, 0x37, 0x44, 0x42, 0x69, 0x27, 0xDB, 0xCE, 0x5E, 0xC1, 0x8A,
+ 0x20, 0x30, 0xBD, 0x7F, 0x71, 0x2C, 0x1A, 0x26, 0x7C, 0xF8, 0xEF, 0x72, 0x6B, 0x87, 0xB7, 0x13,
+ 0x9B, 0x39, 0xBC, 0xBD, 0x67, 0xEC, 0x54, 0xA9, 0xB0, 0x5C, 0x11, 0xC3, 0x60, 0xA7, 0x2F, 0x6D,
+ 0xBC, 0xEB, 0x99, 0x82, 0x47, 0xEE, 0xD4, 0xEE, 0x85, 0xA5, 0xF6, 0xEB, 0x59, 0xA1, 0xC0, 0x0E,
+ 0xC1, 0x1C, 0x1B, 0x9F, 0xC7, 0xAD, 0xF1, 0x1C, 0x35, 0x77, 0x06, 0x42, 0xD7, 0xB2, 0x98, 0x0D,
+ 0x86, 0xF1, 0x71, 0x93, 0xED, 0x29, 0x10, 0xC1, 0x64, 0xA1, 0x0D, 0x5F, 0x21, 0x8E, 0x9B, 0x7B,
+ 0x16, 0xF8, 0xAA, 0x6E, 0x39, 0x38, 0x71, 0xB0, 0xDA, 0x6F, 0xF7, 0x74, 0xBD, 0xAB, 0xF2, 0x4C,
+ 0xB2, 0x9E, 0x1E, 0x1D, 0xB0, 0x75, 0x97, 0xD3, 0x22, 0x03, 0x3D, 0xB9, 0x24, 0x16, 0x16, 0x88,
+ 0x95, 0x17, 0x9D, 0x67, 0x19, 0xC1, 0x6F, 0x40, 0xC2, 0x61, 0x52, 0xC8, 0x27, 0x39, 0x75, 0xE5,
+ 0x93, 0xD5, 0x71, 0x89, 0x3E, 0x79, 0x08, 0x49, 0x4B, 0x02, 0xD9, 0x8D, 0xD8, 0x5B, 0x19, 0x35,
+ 0x34, 0x5F, 0x32, 0x68, 0x0A, 0xBA, 0xEA, 0x9C, 0xB3, 0x21, 0x25, 0x29, 0x3F, 0xA5, 0x11, 0xF8,
+ 0x78, 0xA9, 0x6E, 0xED, 0x7E, 0x20, 0xC3, 0xA5, 0xC7, 0x56, 0xCE, 0x29, 0x4E, 0xC0, 0xA5, 0x04,
+ 0x73, 0x2A, 0xE3, 0x22, 0xF8, 0x30, 0xE5, 0x1D, 0x0C, 0x76, 0x00, 0xF6, 0x8F, 0xEC, 0x70, 0x65,
+ 0x18, 0x64, 0xCD, 0x20, 0x37, 0x35, 0x43, 0xA2, 0xF0, 0x67, 0x2D, 0xDE, 0x49, 0xE3, 0x7A, 0x66,
+ 0x5A, 0x01, 0x87, 0x31, 0xD8, 0x77, 0x85, 0x39, 0x6D, 0xBC, 0x5A, 0xF3, 0x8B, 0x5C, 0x7C, 0x8F,
+ 0xD8, 0x6A, 0x98, 0xE6, 0x8C, 0x80, 0x3A, 0x44, 0x9B, 0x44, 0xFC, 0xA1, 0x13, 0xF9, 0xA6, 0x26,
+ 0x1D, 0xC2, 0xF8, 0x49, 0x98, 0x97, 0x49, 0xEF, 0x28, 0x55, 0x0A, 0x0B, 0x0B, 0x3E, 0x12, 0x20,
+ 0x3E, 0x25, 0x57, 0xC0, 0xB4, 0xB1, 0xD8, 0x87, 0x33, 0xB7, 0xB4, 0xD8, 0x99, 0x86, 0x85, 0xB1,
+ 0xCD, 0xB0, 0x36, 0xC1, 0xFD, 0x1D, 0x6E, 0x5E, 0x6C, 0x65, 0x28, 0x34, 0x13, 0x2C, 0x65, 0x91,
+ 0x98, 0x46, 0xCF, 0x26, 0x66, 0x06, 0x35, 0x10, 0xE4, 0x82, 0x89, 0x2E, 0xE2, 0x62, 0x6C, 0xAA,
+ 0x2B, 0x97, 0xAC, 0x23, 0x67, 0x50, 0xE1, 0x88, 0xE2, 0xC2, 0x02, 0xCC, 0x8C, 0x93, 0xAC, 0x46,
+ 0xB1, 0x0D, 0x4B, 0x63, 0x53, 0xC6, 0x75, 0x17, 0xA7, 0x68, 0x98, 0xA5, 0x8D, 0x44, 0x48, 0x9D,
+ 0x7C, 0xEB, 0x78, 0x05, 0x93, 0x30, 0x6E, 0x17, 0xDF, 0x1C, 0x35, 0xED, 0x6A, 0x7A, 0x52, 0x31,
+ 0x27, 0x2F, 0x82, 0xDD, 0x8D, 0x46, 0x18, 0xCE, 0xFF, 0x13, 0xF6, 0x62, 0x3E, 0xB1, 0xBC, 0xE5,
+ 0xF7, 0x8E, 0xA2, 0x04, 0x22, 0x3D, 0xFC, 0xA7, 0x0D, 0xCE, 0x94, 0x2C, 0x48, 0xA2, 0x78, 0x7F,
+ 0x22, 0xBF, 0x08, 0x69, 0xDE, 0x89, 0x5F, 0x56, 0xE4, 0x88, 0xDB, 0xA1, 0x07, 0xD6, 0x6E, 0xCE,
+ 0x50, 0xF0, 0xEE, 0x31, 0x52, 0x69, 0xD3, 0x85, 0x22, 0x96, 0x91, 0xA4, 0x71, 0xA5, 0xB8, 0x7C,
+ 0x0A, 0x8D, 0x59, 0x1F, 0x48, 0x2A, 0xFA, 0xDC, 0x94, 0x6E, 0x31, 0x92, 0x80, 0x4A, 0x05, 0xE4,
+ 0x00, 0x02, 0x19, 0x23, 0xDD, 0xA6, 0x10, 0x03, 0x6B, 0x3D, 0xC2, 0xAE, 0x3C, 0x84, 0x44, 0x84,
+ 0x9B, 0xC9, 0x7F, 0x6D, 0xA1, 0xBE, 0xE8, 0xE9, 0x8E, 0x43, 0x17, 0x18, 0x85, 0x14, 0x6C, 0x3E,
+ 0xB2, 0xB8, 0x83, 0xFF, 0xA8, 0xE0, 0xF3, 0x9C, 0xA4, 0x74, 0xA2, 0x7D, 0x82, 0x58, 0xAB, 0x0B,
+ 0xD2, 0xC8, 0x07, 0x29, 0x8D, 0x66, 0xCD, 0x86, 0xFC, 0xF0, 0x71, 0x7A, 0x6A, 0xF4, 0xC4, 0xD7,
+ 0xEA, 0x34, 0xB8, 0xF7, 0xCC, 0xF7, 0x8F, 0x27, 0xB1, 0xA7, 0x3D, 0x33, 0xFE, 0x2F, 0xA1, 0x80,
+ 0x59, 0xE9, 0x0A, 0xF5, 0x3B, 0xEB, 0x84, 0x65, 0x36, 0xCC, 0x16, 0x49, 0xD8, 0xCE, 0x64, 0x22,
+ 0x12, 0xDA, 0x04, 0x20, 0x16, 0x85, 0x82, 0xC3, 0x5D, 0x17, 0xE2, 0x01, 0xFB, 0xB9, 0x83, 0x52,
+ 0x52, 0x50, 0x3B, 0x70, 0x07, 0x87, 0xD5, 0x2E, 0xC1, 0x09, 0x06, 0x3B, 0xCD, 0x5A, 0xF8, 0x93,
+ 0xA0, 0xD6, 0x67, 0x72, 0xD3, 0x0A, 0x24, 0xB8, 0x4D, 0x98, 0xE9, 0xB4, 0x3F, 0xDA, 0xB5, 0xA4,
+ 0x32, 0x7D, 0x8B, 0x27, 0xF3, 0xA0, 0x81, 0x73, 0x18, 0x2A, 0xE0, 0x5B, 0x09, 0x5F, 0x0D, 0xE6,
+ 0xE9, 0x30, 0x7F, 0x00, 0x33, 0xE5, 0xE3, 0x2B, 0x05, 0x5D, 0x29, 0x9B, 0xA2, 0x90, 0xEE, 0x09,
+ 0x04, 0x62, 0x07, 0x34, 0x8D, 0x95, 0x00, 0x17, 0x56, 0x88, 0x05, 0xD2, 0x8E, 0x3F, 0x49, 0x74,
+ 0xD7, 0x59, 0x69, 0x93, 0xE2, 0x8C, 0xA1, 0xC9, 0x0D, 0xE7, 0x3B, 0x51, 0xB8, 0xE4, 0xA8, 0x77,
+ 0x58, 0x7A, 0xC2, 0xC7, 0x56, 0x01, 0x0C, 0x0D, 0x5C, 0x1F, 0x00, 0x4D, 0x36, 0x74, 0x2A, 0xA1,
+ 0xD8, 0x00, 0xC2, 0xAC, 0x61, 0xAC, 0xAC, 0xC8, 0xA4, 0x0F, 0xE5, 0x8C, 0xCF, 0x9C, 0x2F, 0x93,
+ 0x1A, 0x4A, 0xD9, 0x96, 0x87, 0x31, 0x42, 0x5C, 0x59, 0x16, 0x89, 0xC4, 0xD5, 0x80, 0x0F, 0xD1,
+ 0x2E, 0x43, 0x4E, 0x8A, 0xEE, 0x55, 0x49, 0x32, 0x14, 0x31, 0xD4, 0x5E, 0x58, 0x4E, 0xE9, 0x9A,
+ 0xE3, 0xC2, 0x7C, 0x0E, 0x62, 0xFF, 0xD4, 0x93, 0xFA, 0xF3, 0x16, 0x7D, 0x35, 0xF8, 0x7A, 0x1D,
+ 0x2E, 0x4C, 0x14, 0xEC, 0xE8, 0xFB, 0x2A, 0x77, 0x1D, 0x78, 0xCB, 0xE0, 0xC8, 0x50, 0xEB, 0x90,
+ 0x87, 0xEE, 0xA4, 0xFC, 0xB4, 0x1B, 0x10, 0x11, 0x45, 0x95, 0x26, 0x4F, 0xCD, 0xDC, 0x3E, 0x16,
+ 0x53, 0xBB, 0x84, 0x5C, 0x97, 0x5D, 0x72, 0xBB, 0x96, 0xD1, 0x72, 0x08, 0x0E, 0xAB, 0xA2, 0x40,
+ 0x61, 0x84, 0x4F, 0x09, 0x1A, 0x53, 0xD8, 0x32, 0xEB, 0x48, 0xEC, 0x72, 0x6E, 0x5D, 0x59, 0x48,
+ 0x69, 0x57, 0xD4, 0x0F, 0xA9, 0xA0, 0x19, 0x4F, 0x3C, 0xBB, 0x5C, 0x97, 0xF4, 0xF1, 0x48, 0x10,
+ 0x4D, 0xC1, 0x74, 0xCB, 0x61, 0x4F, 0xDE, 0x8E, 0x04, 0x28, 0xF2, 0xFC, 0x43, 0xDD, 0x7D, 0x1A,
+ 0x30, 0xA5, 0xED, 0xF8, 0x01, 0x70, 0x73, 0xAE, 0x5F, 0x40, 0xA6, 0x83, 0xF0, 0x59, 0xE2, 0xFB,
+ 0xE3, 0x43, 0xA2, 0x54, 0x7A, 0x9E, 0xE2, 0xED, 0xF1, 0xD4, 0x82, 0x14, 0xB3, 0x89, 0x5A, 0xAE,
+ 0xAB, 0x83, 0x37, 0x73, 0x14, 0xE0, 0x48, 0x37, 0x38, 0xA2, 0x2B, 0x6D, 0x26, 0x9A, 0xD7, 0x40,
+ 0x6E, 0x29, 0xB4, 0x1A, 0xD4, 0x82, 0x07, 0x16, 0xC0, 0x0C, 0xAE, 0x4A, 0xA5, 0xB3, 0x08, 0xBD,
+ 0x3C, 0x78, 0xC9, 0x67, 0x3E, 0x3D, 0x85, 0x38, 0xC4, 0x49, 0x03, 0x1C, 0xE6, 0x92, 0x77, 0x5D,
+ 0xD3, 0xEC, 0x54, 0x7D, 0x18, 0x1F, 0x05, 0xF3, 0xBB, 0x7D, 0xD2, 0xBC, 0xB8, 0x4D, 0xD0, 0x6E,
+ 0xD5, 0x0A, 0x52, 0x4F, 0x7A, 0x29, 0x4A, 0x2C, 0xDC, 0x61, 0x5D, 0x44, 0xEA, 0xD7, 0x89, 0x4D,
+ 0x89, 0xB0, 0x0D, 0x44, 0xC9, 0x4E, 0xCF, 0xD9, 0xE2, 0xFA, 0xC8, 0xA3, 0xB8, 0x2A, 0x2D, 0x3D,
+ 0x26, 0x63, 0x0D, 0xB5, 0x28, 0x2A, 0xA0, 0x2D, 0x2F, 0xC5, 0x7B, 0xE8, 0xC4, 0x59, 0x7C, 0xEA,
+ 0xFC, 0x2E, 0x3F, 0xE1, 0x73, 0xF1, 0x38, 0xA6, 0xC0, 0x3E, 0x78, 0x69, 0xF6, 0x77, 0x64, 0x16,
+ 0x52, 0x3A, 0x0D, 0x1F, 0x33, 0x3E, 0xE6, 0x68, 0x9B, 0x32, 0x5E, 0xD6, 0x04, 0xB1, 0x86, 0x0D,
+ 0x61, 0x44, 0xB9, 0xF4, 0x2F, 0xFC, 0x53, 0x78, 0xFA, 0xB9, 0x2E, 0x37, 0x42, 0x41, 0xC1, 0x2E,
+ 0x3D, 0xBF, 0xA9, 0x2C, 0x6D, 0x49, 0x44, 0x0D, 0x7D, 0x0C, 0xD1, 0x91, 0xFF, 0xE7, 0x02, 0x6C,
+ 0x20, 0xB8, 0xE3, 0xF5, 0xD7, 0x3F, 0x6A, 0x5A, 0xFB, 0xA9, 0x24, 0x38, 0x06, 0x15, 0x22, 0xAE,
+ 0xFA, 0x4C, 0xCD, 0x94, 0xDC, 0x1C, 0x3D, 0x74, 0x15, 0x88, 0x3E, 0xD3, 0x40, 0x8D, 0x5E, 0xA1,
+ 0xD5, 0x4B, 0x25, 0x5F, 0xE6, 0x06, 0x91, 0x69, 0x1A, 0xB9, 0x70, 0x79, 0x0B, 0x67, 0xAD, 0xF9,
+ 0xB8, 0x0E, 0xCC, 0x6F, 0x2A, 0x3A, 0x89, 0x14, 0x48, 0x07, 0x69, 0x43, 0x4E, 0xAA, 0x21, 0xB0,
+ 0x55, 0xDC, 0xC1, 0x9F, 0x36, 0x39, 0x29, 0x36, 0x4B, 0x33, 0x84, 0x35, 0x1D, 0x13, 0xF5, 0x4F,
+ 0x46, 0x65, 0x30, 0xD9, 0xFB, 0xC9, 0x43, 0xAB, 0x54, 0x27, 0x77, 0x4F, 0xC7, 0x70, 0x35, 0x75,
+ 0xBF, 0xF5, 0x69, 0x65, 0x93, 0xB8, 0x27, 0x07, 0x12, 0x6F, 0x34, 0xE5, 0x6F, 0x31, 0x80, 0xD5,
+ 0xCD, 0x0D, 0x26, 0x2E, 0xC7, 0xB3, 0xF4, 0x62, 0x79, 0x5C, 0x20, 0x97, 0xB5, 0x17, 0x46, 0x8A,
+ 0xFE, 0xC4, 0x11, 0xBC, 0x7E, 0x6C, 0xFF, 0xF5, 0x5D, 0x08, 0x9F, 0xE8, 0x5A, 0x6D, 0x79, 0x22,
+ 0x0F, 0xFD, 0x0A, 0xB6, 0x76, 0xC7, 0x28, 0x43, 0x61, 0x74, 0x69, 0x7B, 0x82, 0xCF, 0x3A, 0xB2,
+ 0xC7, 0x56, 0x51, 0x6D, 0xE3, 0x6C, 0x5A, 0x7C, 0x38, 0x52, 0xAF, 0x56, 0x71, 0xBD, 0x1E, 0xB6,
+ 0x4D, 0x77, 0x43, 0xD9, 0x76, 0x9B, 0xF7, 0xD2, 0x5E, 0xD5, 0xAF, 0x39, 0xAA, 0x14, 0x74, 0xAF,
+ 0xB1, 0x15, 0x5C, 0xA9, 0x11, 0x3C, 0x62, 0xA9, 0xA7, 0x92, 0xB6, 0x4F, 0x95, 0xCD, 0x26, 0x1A,
+ 0x75, 0x23, 0x4F, 0x55, 0x29, 0x7E, 0x5E, 0xDC, 0x04, 0x57, 0x70, 0xC4, 0x4D, 0xEB, 0x7F, 0x51,
+ 0xB7, 0x99, 0x0D, 0x20, 0x92, 0xA4, 0xC8, 0x88, 0x7B, 0x6D, 0xB4, 0xC8, 0x1C, 0x19, 0x36, 0xC7,
+ 0xD2, 0xFA, 0xC1, 0x9B, 0x92, 0x16, 0x79, 0xAD, 0x88, 0x9A, 0xCB, 0x31, 0xA4, 0x92, 0xA8, 0xBC,
+ 0xF5, 0x46, 0xE3, 0x71, 0xC4, 0xE8, 0x63, 0xF5, 0x89, 0x68, 0x2A, 0x21, 0x41, 0x46, 0x81, 0x7A,
+ 0x99, 0xAC, 0x04, 0xDD, 0x18, 0x91, 0x4E, 0x3D, 0x02, 0x06, 0x8B, 0x8A, 0x6F, 0x47, 0x3A, 0xA5,
+ 0xD5, 0x75, 0xE0, 0x8E, 0x81, 0xB8, 0x36, 0x3D, 0xA0, 0x35, 0x20, 0x5F, 0x0B, 0x96, 0x8E, 0xD8,
+ 0x1D, 0x56, 0x2F, 0x14, 0x81, 0xE1, 0x40, 0x30, 0x79, 0x84, 0x7D, 0x49, 0x83, 0x71, 0xBA, 0xDC,
+ 0x14, 0x0B, 0x64, 0xFC, 0x52, 0xD8, 0xBE, 0x3F, 0x35, 0x74, 0x4C, 0x64, 0x15, 0x8D, 0x84, 0xF4,
+ 0xB5, 0x9D, 0xF9, 0x14, 0x35, 0xC9, 0x71, 0x69, 0x1C, 0x1A, 0x5D, 0x99, 0xA4, 0x41, 0xFF, 0x3B,
+ 0x98, 0x30, 0x64, 0xCE, 0xF3, 0xB3, 0xA9, 0xF7, 0xF0, 0xAA, 0xB2, 0x73, 0xF2, 0x29, 0x01, 0x95,
+ 0x6C, 0xF8, 0x14, 0x21, 0x1B, 0x6E, 0x58, 0xD4, 0x9E, 0x7A, 0x62, 0x82, 0xB7, 0xD7, 0xB3, 0xEE,
+ 0xEB, 0x3F, 0x3D, 0x3D, 0x52, 0x9F, 0xA9, 0x15, 0x5D, 0xB4, 0xB0, 0x6D, 0x17, 0xC8, 0x5C, 0x5F,
+ 0xF7, 0x55, 0xB1, 0xA9, 0xA5, 0x25, 0xEF, 0x89, 0xE2, 0x7F, 0xBA, 0xAA, 0xDD, 0x40, 0x54, 0x6F,
+ 0x6E, 0x86, 0x27, 0x24, 0x3B, 0x18, 0x49, 0xE6, 0xD3, 0x6B, 0xDD, 0x44, 0xC0, 0x94, 0xB0, 0x1D,
+ 0x32, 0xDE, 0x5B, 0x3E, 0xEA, 0x72, 0xB4, 0x01, 0xA1, 0xE4, 0x58, 0x52, 0x26, 0xD7, 0x6F, 0xC7,
+ 0x86, 0x7A, 0xB7, 0x41, 0xC2, 0xB0, 0x55, 0x55, 0x8F, 0x1F, 0xA2, 0x43, 0x60, 0x2E, 0x5A, 0x53,
+ 0xBF, 0xA8, 0xAC, 0xD6, 0x63, 0xA8, 0x0E, 0x2A, 0xA0, 0x4F, 0x8A, 0xF3, 0xF9, 0xF6, 0x1C, 0xC1,
+ 0x1A, 0x0A, 0x3D, 0x16, 0x2F, 0xF5, 0x8A, 0x6F, 0xEF, 0x41, 0x08, 0xAA, 0x5C, 0xFE, 0xFF, 0x4A,
+ 0xFE, 0x9D, 0x36, 0x1B, 0xDE, 0x4C, 0x36, 0x9E, 0x57, 0x0F, 0x4C, 0xD7, 0xFC, 0x8B, 0x03, 0x7E,
+ 0xFB, 0x59, 0x34, 0xBB, 0x1C, 0x8D, 0xCF, 0x59, 0x9D, 0x4C, 0xA4, 0x26, 0xD3, 0x68, 0x35, 0xCE,
+ 0x80, 0xCD, 0xDB, 0x6D, 0xE0, 0x02, 0x5A, 0xAE, 0x64, 0xD9, 0x9E, 0x44, 0x74, 0x08, 0x71, 0x5E,
+ 0x6D, 0x95, 0x0A, 0x60, 0x75, 0xAA, 0xA7, 0xB5, 0xD7, 0x75, 0x5E, 0xD3, 0x05, 0xA3, 0x50, 0xA1,
+ 0x32, 0x13, 0x8C, 0x29, 0x81, 0x45, 0x7A, 0x38, 0x61, 0xB5, 0xD0, 0x4C, 0xB5, 0x95, 0xD7, 0x92,
+ 0x58, 0x8C, 0xF8, 0x0B, 0x9D, 0x7C, 0x33, 0x35, 0xAE, 0x8E, 0x69, 0x48, 0x0F, 0x03, 0x75, 0x81,
+ 0x78, 0xE8, 0x91, 0x0D, 0xEF, 0x84, 0x91, 0x53, 0xF1, 0xE6, 0xED, 0xC1, 0xD7, 0x1D, 0xD3, 0xE0,
+ 0x73, 0x9E, 0x94, 0xD5, 0x68, 0xE9, 0xBD, 0x13, 0xA6, 0x22, 0x76, 0x19, 0x5F, 0x2D, 0xAC, 0xF9,
+ 0xD6, 0x06, 0x88, 0x1E, 0x5B, 0xA5, 0x00, 0x67, 0x6F, 0x0D, 0xD2, 0xF3, 0x5D, 0x8D, 0x06, 0x90,
+ 0xD1, 0xF7, 0xBE, 0x39, 0x19, 0xD5, 0x9E, 0x60, 0x6B, 0xD4, 0x51, 0xE6, 0x46, 0xB2, 0x96, 0xC4,
+ 0x01, 0xC3, 0xD2, 0xA5, 0x3D, 0xCD, 0x4F, 0x9C, 0xBD, 0x3D, 0xC3, 0x0F, 0x1E, 0x94, 0xA8, 0xFD,
+ 0x26, 0xA9, 0x9C, 0x4C, 0xA4, 0xF8, 0xBC, 0xD8, 0xB1, 0xC7, 0xFE, 0x5F, 0x8B, 0xF2, 0x60, 0x37,
+ 0x6D, 0xF9, 0x62, 0xEF, 0xAE, 0xAD, 0x19, 0x69, 0xAF, 0x20, 0x26, 0x41, 0x60, 0xEC, 0x8D, 0x32,
+ 0x6B, 0x3B, 0xA3, 0xA2, 0x67, 0xB0, 0x6D, 0xA3, 0x48, 0x8A, 0xAA, 0x03, 0xD3, 0xE4, 0xE7, 0x76,
+ 0xA0, 0x8C, 0xBE, 0x53, 0xF3, 0x2E, 0x96, 0x1A, 0xEB, 0x1E, 0x38, 0x47, 0x29, 0x64, 0x8F, 0xDB,
+ 0x15, 0xAA, 0xFF, 0xE6, 0xC0, 0x16, 0x22, 0xD8, 0x95, 0x36, 0x56, 0x28, 0x5B, 0x90, 0x0C, 0x8C,
+ 0xF3, 0x03, 0x01, 0xA3, 0x53, 0x17, 0x62, 0x0C, 0xB6, 0xDC, 0x65, 0xE4, 0x70, 0x49, 0xD2, 0x76,
+ 0x85, 0x47, 0x90, 0x8B, 0x84, 0xF4, 0x00, 0x13, 0x0A, 0xB6, 0x3F, 0xF4, 0x3E, 0x67, 0x1A, 0x11,
+ 0xFF, 0xA5, 0x28, 0x0F, 0x1E, 0x0C, 0xD5, 0xE9, 0x99, 0x3E, 0x09, 0xB5, 0x0B, 0x87, 0x9B, 0xF1,
+ 0xB2, 0x8D, 0xFD, 0x24, 0x95, 0x43, 0x52, 0x1D, 0x38, 0xA7, 0x1B, 0x98, 0x38, 0xEC, 0x68, 0x7C,
+ 0x69, 0x45, 0x17, 0x21, 0x63, 0x85, 0x16, 0xF8, 0xCE, 0x10, 0xA4, 0xE1, 0xCE, 0xD8, 0x1A, 0x82,
+ 0x6E, 0xC7, 0x06, 0xD4, 0xB0, 0x58, 0x09, 0x22, 0x95, 0x84, 0x0E, 0xD6, 0x2E, 0x06, 0x74, 0x07,
+ 0x5D, 0x01, 0x8B, 0x88, 0x8D, 0x66, 0xF4, 0x0D, 0x36, 0x52, 0x41, 0xCD, 0xE6, 0x17, 0xBF, 0xF2,
+ 0x37, 0x50, 0x68, 0x3A, 0x5C, 0x7D, 0x4F, 0xD5, 0xE0, 0xE7, 0xB3, 0x24, 0xD3, 0x2A, 0x07, 0x18,
+ 0x9F, 0x53, 0x8D, 0x52, 0xD6, 0x98, 0x26, 0x30, 0xA5, 0x43, 0x04, 0x7C, 0xB1, 0xF3, 0x93, 0xE2,
+ 0xE6, 0x21, 0x1B, 0x94, 0xDA, 0xEE, 0x29, 0xB1, 0xDB, 0x07, 0x3D, 0x9F, 0x9B, 0x14, 0x8F, 0x4E,
+ 0x9D, 0xCB, 0xCE, 0xA9, 0x5C, 0x60, 0xB1, 0xC0, 0x4C, 0xB7, 0x89, 0xBA, 0xD2, 0x14, 0xEE, 0x94,
+ 0xBC, 0xD4, 0x5D, 0x90, 0x3B, 0xC6, 0xC5, 0x7C, 0xCB, 0x13, 0xB9, 0xDE, 0xA0, 0x06, 0x37, 0x94,
+ 0x73, 0xBC, 0xC8, 0xA0, 0xDB, 0xE3, 0x51, 0xD3, 0x36, 0xB5, 0x4E, 0x4F, 0xA0, 0xB0, 0x74, 0x38,
+ 0x76, 0xBC, 0x8A, 0x98, 0x4B, 0xFA, 0x00, 0x4F, 0x89, 0xA5, 0x59, 0x92, 0xC4, 0xAD, 0x35, 0x67,
+ 0x68, 0xE5, 0x7D, 0xDD, 0x5E, 0x1C, 0x50, 0x35, 0x4E, 0xE1, 0xEB, 0x9C, 0x1A, 0xD2, 0x4C, 0x98,
+ 0x25, 0x2A, 0x43, 0x7E, 0x7C, 0x64, 0x45, 0x1B, 0x19, 0x97, 0xDE, 0xD0, 0xCB, 0x24, 0x5C, 0x40,
+ 0x95, 0x46, 0x0A, 0xEC, 0x14, 0x59, 0x55, 0x10, 0x12, 0x23, 0x1C, 0xF9, 0x9E, 0xB5, 0xEF, 0xEA,
+ 0x6E, 0xE4, 0x6B, 0xF7, 0xDD, 0x95, 0xD2, 0x8F, 0x96, 0xBA, 0xDA, 0x04, 0x87, 0x47, 0x5B, 0x2A,
+ 0xB6, 0x71, 0x2C, 0xE3, 0xCA, 0xC6, 0x94, 0xC0, 0xA0, 0xB8, 0x17, 0x78, 0x0A, 0xFE, 0xB9, 0x1E,
+ 0xB3, 0xCB, 0x21, 0x7E, 0x90, 0x01, 0xB2, 0xBD, 0xEE, 0x81, 0xD0, 0x05, 0xDE, 0xC2, 0xFB, 0x6E,
+ 0x94, 0xDC, 0x22, 0xA0, 0x0F, 0x8A, 0xD5, 0xB5, 0x56, 0xA5, 0xB4, 0x39, 0xCD, 0x1E, 0xDB, 0x5A,
+ 0xF2, 0x92, 0xA8, 0x7B, 0x1F, 0xDC, 0x44, 0xE7, 0xFF, 0xE3, 0x59, 0x69, 0x2D, 0x5E, 0x45, 0x53,
+ 0x99, 0xB6, 0xC2, 0x15, 0x21, 0x65, 0x32, 0x43, 0xFC, 0xAD, 0x6D, 0x91, 0xC9, 0x09, 0x82, 0x6B,
+ 0x2C, 0xA8, 0x0A, 0xE8, 0x4A, 0xD7, 0x19, 0x06, 0x53, 0x9A, 0x00, 0x0A, 0x9E, 0x25, 0xA6, 0x6E,
+ 0xE0, 0x98, 0xC2, 0xC9, 0xD4, 0x98, 0x32, 0xE4, 0xEE, 0x37, 0x5D, 0x1F, 0x10, 0x22, 0xCD, 0x91,
+ 0xBD, 0x7B, 0xDA, 0x27, 0xB5, 0x06, 0x5A, 0x9E, 0x27, 0x6C, 0xBA, 0x53, 0x20, 0x13, 0xA3, 0x2E,
+ 0xAC, 0x05, 0x9A, 0x3C, 0xD1, 0xEB, 0xA2, 0xE8, 0x7F, 0x4E, 0xB0, 0xE6, 0x5A, 0x73, 0x6B, 0x5D,
+ 0x37, 0x80, 0x66, 0xD3, 0x50, 0x21, 0xA6, 0x9E, 0x43, 0x15, 0x15, 0x77, 0xC7, 0x0B, 0x30, 0x16,
+ 0xB6, 0x8D, 0x38, 0x93, 0x53, 0xF5, 0x68, 0xF4, 0x34, 0x07, 0xD1, 0xBD, 0x10, 0xDE, 0xDD, 0x4E,
+ 0x87, 0x32, 0xB6, 0xB4, 0x37, 0xD1, 0xBB, 0x8A, 0xD2, 0x4B, 0xBF, 0x04, 0x73, 0x3A, 0x36, 0x5C,
+ 0x87, 0xF7, 0x0B, 0x41, 0x11, 0xF6, 0x27, 0x2C, 0xB6, 0xC2, 0x8B, 0xBE, 0x6E, 0x5D, 0x17, 0xA6,
+ 0xEC, 0x74, 0xDF, 0xE4, 0x88, 0xDD, 0x9E, 0xEF, 0xFD, 0x2B, 0x25, 0xD9, 0x3B, 0x42, 0xB1, 0x2F,
+ 0x21, 0xE4, 0x29, 0xC8, 0x69, 0x48, 0xC8, 0xB8, 0xB3, 0x8C, 0x2B, 0x4F, 0x31, 0xB9, 0x0C, 0xB2,
+ 0xE1, 0xE9, 0xE1, 0xF4, 0x7C, 0xE9, 0x78, 0x1F, 0xFF, 0xB7, 0x6D, 0xF9, 0x01, 0xF5, 0xDA, 0xCB,
+ 0x37, 0x20, 0xAE, 0x29, 0xED, 0xC7, 0x93, 0x25, 0xB7, 0x10, 0x47, 0x1E, 0x07, 0x8A, 0x82, 0xDC,
+ 0xB9, 0x93, 0x39, 0xA0, 0xD8, 0x24, 0x5F, 0xA2, 0x8C, 0xE5, 0xB0, 0xAC, 0x8C, 0x63, 0x09, 0x50,
+ 0x49, 0x04, 0x27, 0xD5, 0x2B, 0xA5, 0xA1, 0x8C, 0x86, 0x8B, 0x3D, 0x19, 0xC6, 0x39, 0x88, 0xB8,
+ 0xB4, 0x2B, 0x4C, 0x5D, 0x6B, 0x9C, 0x36, 0xA6, 0x7A, 0x1A, 0xA7, 0x71, 0xE8, 0x97, 0x78, 0x1C,
+ 0x03, 0xDA, 0x0D, 0xA3, 0xE9, 0xF6, 0x5F, 0x63, 0x2E, 0x9B, 0x6C, 0x86, 0xB9, 0x7C, 0x3D, 0xD2,
+ 0xC9, 0x90, 0xCA, 0x5F, 0x48, 0x5E, 0x1C, 0x11, 0x88, 0xCA, 0xBF, 0x79, 0xB5, 0xBF, 0x2D, 0xED,
+ 0xFE, 0x4D, 0xC6, 0x2C, 0xFB, 0x8E, 0x0E, 0x42, 0x53, 0x8C, 0xB2, 0x07, 0x92, 0xFF, 0xEC, 0x6B,
+ 0xAA, 0xC5, 0xAE, 0x25, 0x09, 0xEA, 0xBB, 0x82, 0x5E, 0x86, 0x63, 0xD2, 0xF5, 0x59, 0x8F, 0x26,
+ 0xF5, 0x98, 0x17, 0xE4, 0x6A, 0x89, 0x28, 0x2B, 0xF5, 0x8A, 0x5E, 0x96, 0x1C, 0x8D, 0xBE, 0x30,
+ 0x47, 0xE6, 0x75, 0x84, 0x79, 0xFE, 0xF1, 0x35, 0xDD, 0x70, 0x7E, 0xCA, 0xC9, 0x1F, 0xD8, 0x03,
+ 0x26, 0xEA, 0x48, 0x39, 0x68, 0xFF, 0x34, 0x8B, 0x58, 0xC6, 0x7C, 0x68, 0x54, 0x1A, 0x03, 0x17,
+ 0x55, 0x23, 0xF9, 0xA8, 0x66, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, 0x46, 0x5C, 0x48, 0xEB, 0xB2,
+ 0x0D, 0x74, 0x67, 0x30, 0xD6, 0x2D, 0xFF, 0x30, 0x6D, 0xB5, 0x66, 0x66, 0x7C, 0xE2, 0x8B, 0xB0,
+ 0xB6, 0x08, 0xFE, 0x2F, 0x05, 0xC4, 0x26, 0x33, 0x1F, 0x40, 0xC3, 0x07, 0x04, 0xAE, 0xFC, 0xC1,
+ 0x23, 0xE5, 0x31, 0xEA, 0x16, 0x63, 0xB5, 0x9C, 0xD8, 0x2D, 0xC1, 0xCE, 0x46, 0xBC, 0x4C, 0x88,
+ 0x7C, 0xBC, 0x86, 0xC5, 0x89, 0x69, 0x93, 0x13, 0x97, 0x0C, 0x05, 0xF3, 0x7C, 0x9D, 0x23, 0xC2,
+ 0x81, 0x2C, 0xB9, 0x98, 0x05, 0x3D, 0x1B, 0x67, 0xDA, 0x50, 0x04, 0xD4, 0x79, 0x8A, 0x97, 0x63,
+ 0xE5, 0xAF, 0xA4, 0xFD, 0x3D, 0x4D, 0x17, 0x3D, 0x8B, 0x9C, 0xA8, 0xEF, 0xA1, 0x42, 0x62, 0xFE,
+ 0xD0, 0xD3, 0x86, 0xBE, 0x8D, 0xCB, 0x54, 0x02, 0xCD, 0x4D, 0xBF, 0xA9, 0xC2, 0x74, 0xBC, 0x4C,
+ 0x82, 0x5A, 0x0A, 0xF9, 0xC6, 0x6C, 0xD1, 0x59, 0x2B, 0x8F, 0xED, 0x51, 0xAF, 0xA6, 0x17, 0x4A,
+ 0xBB, 0xBD, 0xE4, 0x1B, 0xA2, 0x40, 0xC9, 0xAB, 0x7F, 0xE0, 0x59, 0x19, 0x98, 0xCE, 0x84, 0x51,
+ 0x35, 0x3F, 0x49, 0x0E, 0x9F, 0x13, 0xD3, 0x43, 0xAF, 0x98, 0xD7, 0x8A, 0x8E, 0x2E, 0x88, 0x02,
+ 0x4C, 0x17, 0x08, 0x9F, 0xFD, 0x4C, 0xF7, 0x9F, 0x38, 0x74, 0x4E, 0x39, 0xCF, 0x93, 0xC3, 0x0A,
+ 0xB2, 0x9B, 0xBF, 0xE4, 0xAE, 0xA5, 0x6D, 0x7F, 0x1A, 0x62, 0x16, 0x05, 0x9C, 0x10, 0xF4, 0x81,
+ 0x6F, 0xA7, 0xDF, 0xE8, 0x95, 0xC8, 0x88, 0x8A, 0x11, 0xEB, 0x56, 0xC6, 0x27, 0xE0, 0x92, 0x45,
+ 0x87, 0x6F, 0x63, 0x11, 0x1B, 0x5C, 0xD8, 0x4E, 0x13, 0xAA, 0xB5, 0x04, 0x15, 0xCD, 0xF6, 0x66,
+ 0x1C, 0x7C, 0x62, 0x3A, 0x6F, 0x73, 0xCF, 0x8B, 0xAB, 0x3A, 0x42, 0x5E, 0x1F, 0x58, 0x3E, 0xF2,
+ 0x4C, 0xAF, 0xCB, 0x7A, 0x0E, 0x0C, 0xAB, 0xED, 0x04, 0xF6, 0xC2, 0x91, 0xAC, 0x8D, 0x30, 0xF1,
+ 0x2A, 0x43, 0x53, 0x02, 0x5C, 0xF5, 0x92, 0x21, 0x50, 0x56, 0x2E, 0x38, 0x7C, 0x6E, 0x48, 0xDE,
+ 0x81, 0x0E, 0x41, 0x3B, 0xA0, 0x74, 0xFC, 0x63, 0xC3, 0x3D, 0x8E, 0xC9, 0x28, 0xA2, 0xA0, 0x57,
+ 0x4A, 0xDC, 0xB5, 0xAA, 0x1E, 0x86, 0xA2, 0x6C, 0x55, 0xF7, 0xC9, 0x1F, 0x28, 0x6B, 0xB5, 0xD6,
+ 0x98, 0x25, 0x32, 0xE0, 0xA5, 0x29, 0xC8, 0xA6, 0xFE, 0x95, 0xC0, 0xA5, 0xFE, 0x82, 0x32, 0xD5,
+ 0xC0, 0xFE, 0x63, 0x37, 0xBD, 0x57, 0x42, 0x53, 0xF6, 0xF9, 0x6A, 0x2C, 0x88, 0x71, 0xDC, 0xB5,
+ 0x28, 0xF0, 0x18, 0x7E, 0x45, 0xF0, 0xB2, 0x19, 0x15, 0x1C, 0x2D, 0x1A, 0xD2, 0xF4, 0xAD, 0xDB,
+ 0xAF, 0x23, 0x07, 0xA1, 0x3F, 0xDE, 0x97, 0xA5, 0x1A, 0xD2, 0x7E, 0x61, 0x8D, 0x23, 0x49, 0xC6,
+ 0x22, 0x0E, 0xE0, 0xD9, 0x40, 0xC5, 0xE2, 0xD7, 0x0C, 0xDC, 0xD1, 0x50, 0x45, 0xC3, 0x74, 0x64,
+ 0xD4, 0xCC, 0x11, 0xEC, 0x1F, 0x5E, 0x7E, 0x67, 0x76, 0x73, 0x3E, 0x55, 0x43, 0x44, 0x31, 0x1B,
+ 0xBD, 0xF3, 0xA9, 0x7C, 0x72, 0xCE, 0x83, 0x2E, 0x5D, 0x2B, 0xF6, 0x2C, 0xA5, 0xB2, 0xC6, 0xB1,
+ 0x71, 0x1E, 0xEA, 0x33, 0xF1, 0x83, 0x2A, 0x21, 0x65, 0x13, 0xFE, 0xA0, 0x21, 0xB7, 0x44, 0x07,
+ 0x04, 0xF1, 0x46, 0x1D, 0xEF, 0x71, 0x80, 0x27, 0x42, 0x5F, 0x90, 0x55, 0x54, 0x84, 0x60, 0x37,
+ 0xCF, 0xFB, 0xFA, 0x36, 0x4D, 0x92, 0x63, 0x82, 0x3D, 0xE8, 0xC2, 0x09, 0xE7, 0xBE, 0xC3, 0x7D,
+ 0x4C, 0x17, 0xF1, 0x5C, 0x0F, 0xB6, 0x57, 0x25, 0x5D, 0xC0, 0x0C, 0x63, 0xE1, 0xF2, 0x9F, 0x69,
+ 0xD6, 0x35, 0x73, 0xDC, 0xB3, 0x1D, 0xDA, 0x72, 0x5E, 0xB7, 0x12, 0x3B, 0x43, 0xF7, 0xB4, 0xCC,
+ 0x48, 0xAC, 0xE2, 0xB3, 0xFB, 0x15, 0x91, 0x03, 0xFB, 0xDF, 0x2A, 0x4D, 0x70, 0x88, 0x75, 0x02,
+ 0x18, 0x53, 0xF9, 0x9F, 0xC1, 0x9C, 0x0C, 0x5B, 0x5A, 0x59, 0x1B, 0x5F, 0x4A, 0xE5, 0x39, 0x20,
+ 0xAD, 0x28, 0xC7, 0x80, 0x77, 0x13, 0x8E, 0x61, 0xBD, 0xE8, 0x80, 0x37, 0x41, 0x6E, 0xE7, 0x75,
+ 0xCA, 0x41, 0xC6, 0xA9, 0xCC, 0x1C, 0xAF, 0xFF, 0x97, 0xCC, 0xFE, 0xF2, 0xED, 0x85, 0xD8, 0xB1,
+ 0x4F, 0xF3, 0x7A, 0xE7, 0xF9, 0x18, 0x41, 0xD7, 0x49, 0xA2, 0x1B, 0xBC, 0xE2, 0x89, 0x93, 0x54,
+ 0x5A, 0xF1, 0x5E, 0xA3, 0x66, 0x51, 0x8C, 0x66, 0x7A, 0xF7, 0x44, 0xD7, 0xFD, 0x90, 0xF1, 0xEE,
+ 0x3E, 0xF6, 0x0E, 0xA5, 0xE9, 0xDB, 0xD0, 0xDB, 0x58, 0xA7, 0x45, 0xA9, 0x34, 0xD8, 0x44, 0xA3,
+ 0x65, 0x29, 0xCB, 0x61, 0x8E, 0xAD, 0x7F, 0x95, 0xBA, 0x71, 0xFB, 0xB6, 0x93, 0x5F, 0x6F, 0xFC,
+ 0xC1, 0xAA, 0xE6, 0x9F, 0x73, 0x55, 0x69, 0xE7, 0x35, 0x12, 0xCA, 0x26, 0x56, 0x39, 0x79, 0xFB,
+ 0xAB, 0x53, 0x00, 0xF0, 0x8F, 0x72, 0xBF, 0x2D, 0x30, 0x05, 0x67, 0x65, 0x4B, 0xD3, 0x6A, 0xF7,
+ 0x8B, 0x79, 0x41, 0xFA, 0x89, 0x2A, 0xDB, 0x0C, 0xA1, 0x10, 0xFC, 0x3A, 0x12, 0x63, 0x55, 0xB0,
+ 0x3A, 0xB5, 0x30, 0xDB, 0x08, 0x76, 0xAF, 0xF6, 0x1A, 0xD9, 0xAE, 0x51, 0x81, 0xE3, 0x84, 0x90,
+ 0x70, 0x2C, 0x1B, 0xA7, 0x75, 0xA3, 0x44, 0xD2, 0x9B, 0x71, 0x7C, 0x39, 0x0E, 0x1E, 0x32, 0x7D,
+ 0x6B, 0x40, 0x90, 0xEE, 0xEF, 0x85, 0xB3, 0x21, 0x86, 0x2B, 0xE7, 0x53, 0x70, 0x7B, 0xB4, 0xE2,
+ 0x2D, 0xBE, 0x1F, 0x61, 0xEA, 0x7D, 0x31, 0x4E, 0x07, 0xB6, 0xD3, 0x20, 0x82, 0x2F, 0x7E, 0xEA,
+ 0x63, 0x8E, 0x31, 0xD8, 0xCE, 0x3C, 0x50, 0x58, 0x58, 0x99, 0x3D, 0x77, 0x18, 0x6C, 0xF6, 0x64,
+ 0xB2, 0xB8, 0xBF, 0x39, 0xE0, 0x2C, 0x47, 0xAF, 0xBC, 0xDF, 0xC9, 0xE3, 0x4A, 0x92, 0xB3, 0xAB,
+ 0x28, 0x4C, 0x07, 0x32, 0x53, 0xDC, 0x33, 0x25, 0xC8, 0xD6, 0xAC, 0xE9, 0xFF, 0x17, 0xF1, 0x63,
+ 0xD6, 0x03, 0x6A, 0x81, 0xEE, 0x3F, 0xDA, 0xAE, 0xD1, 0x5D, 0xAD, 0x92, 0x51, 0x99, 0xA8, 0x5C,
+ 0xDA, 0x47, 0x3A, 0xDB, 0x94, 0x9D, 0x89, 0xA2, 0x24, 0x88, 0xB0, 0xBB, 0x22, 0x46, 0x8F, 0x03,
+ 0xB0, 0x9C, 0xB9, 0xDE, 0xD6, 0xCA, 0xEA, 0xDE, 0x6B, 0x97, 0xA9, 0xB0, 0xB3, 0xDB, 0xA6, 0x5E,
+ 0xAD, 0xEC, 0x12, 0x23, 0x04, 0x4D, 0x7B, 0xF2, 0x7C, 0x0A, 0xE2, 0xB3, 0xA0, 0x81, 0x58, 0x8F,
+ 0xC0, 0xA6, 0xE9, 0xDF, 0x7F, 0xA7, 0x89, 0x6E, 0x2D, 0x68, 0x23, 0xF1, 0x29, 0xB7, 0xD7, 0xDC,
+ 0x63, 0x4A, 0xCB, 0x83, 0x24, 0xC0, 0xE4, 0x54, 0x5C, 0x67, 0x12, 0xB3, 0xFB, 0x6A, 0x1E, 0x37,
+ 0xE0, 0xBE, 0x85, 0xDA, 0x7C, 0xB4, 0x8B, 0xEC, 0xE8, 0xBB, 0x08, 0x84, 0xD9, 0x90, 0x4B, 0x56,
+ 0xFA, 0x2F, 0xA2, 0x36, 0xC8, 0x97, 0xFC, 0x3E, 0xC0, 0x9C, 0x28, 0x5D, 0xFD, 0x54, 0xD8, 0x53,
+ 0x7D, 0x41, 0x4F, 0x15, 0x09, 0xA6, 0x3F, 0xAF, 0x13, 0x31, 0xE6, 0xE8, 0x45, 0x8C, 0x64, 0xFC,
+ 0xF6, 0x53, 0x1C, 0x2B, 0x25, 0xDF, 0x15, 0x93, 0x06, 0xE1, 0x32, 0x45, 0x9A, 0x29, 0x6B, 0xD5,
+ 0x11, 0x27, 0xA7, 0x2E, 0x98, 0xA8, 0x30, 0xD7, 0x93, 0x37, 0xDE, 0xFE, 0xC2, 0xE7, 0xC0, 0xAE,
+ 0x5E, 0x26, 0x04, 0xA4, 0x57, 0x7A, 0x3F, 0xD7, 0x0E, 0xB6, 0x27, 0xE1, 0xCF, 0xBA, 0x27, 0xC3,
+ 0x84, 0xFE, 0xD5, 0x4A, 0x87, 0xF0, 0xB5, 0x1C, 0x44, 0x3E, 0x17, 0xC9, 0x99, 0x8F, 0x85, 0xE6,
+ 0xDA, 0x41, 0x94, 0xAB, 0x71, 0xC9, 0x0B, 0x9E, 0xA8, 0xF0, 0x5A, 0x01, 0x14, 0x8E, 0x15, 0x05,
+ 0xB7, 0xE0, 0x90, 0xDD, 0x33, 0x9E, 0x82, 0x3B, 0x14, 0x57, 0xBD, 0xD1, 0xC7, 0xC1, 0x6D, 0xDE,
+ 0x3F, 0x4B, 0x4E, 0xD6, 0xF4, 0x49, 0xED, 0xAF, 0x6C, 0x6C, 0xE3, 0x51, 0x0E, 0xDF, 0x15, 0xAF,
+ 0xCD, 0x7F, 0xBF, 0x64, 0xF4, 0x66, 0x0F, 0x25, 0x86, 0xDA, 0xEF, 0xDF, 0xBB, 0x75, 0x92, 0xAD,
+ 0x70, 0x42, 0x1E, 0xC7, 0x23, 0x2C, 0xC1, 0x49, 0x4B, 0x9B, 0xAC, 0x7C, 0x3C, 0x7D, 0xFA, 0xA2,
+ 0x80, 0xCC, 0x0E, 0xDC, 0xD2, 0xAD, 0xDA, 0xBD, 0xF2, 0xFB, 0xAD, 0xCA, 0x96, 0x68, 0x19, 0xAE,
+ 0x7E, 0xDB, 0x43, 0xF3, 0xEF, 0x52, 0x3F, 0x95, 0x3E, 0x5C, 0x9A, 0x9E, 0x54, 0x8F, 0x47, 0x27,
+ 0xEC, 0xC1, 0xBF, 0x31, 0x7A, 0xDB, 0x6B, 0xBE, 0x40, 0x98, 0x8A, 0x33, 0xD8, 0x42, 0x97, 0x0C,
+ 0x51, 0x3B, 0xD7, 0xB1, 0x95, 0xF8, 0xEF, 0x3B, 0xC8, 0xD8, 0x4C, 0x94, 0x0D, 0xDE, 0xC4, 0x09,
+ 0x77, 0x52, 0x6E, 0xF2, 0xEF, 0x50, 0x9A, 0x83, 0x48, 0x6D, 0x69, 0x91, 0x33, 0x1A, 0x56, 0x98,
+ 0xC0, 0x12, 0x86, 0xA8, 0xE3, 0xDE, 0x2E, 0xE9, 0x43, 0xB3, 0x7A, 0x71, 0x40, 0xFA, 0x34, 0xF7,
+ 0xA6, 0xC3, 0x2F, 0xBB, 0x16, 0x6B, 0x91, 0x01, 0x58, 0xB0, 0x8D, 0x7A, 0x54, 0x62, 0x59, 0x3E,
+ 0xC3, 0x2F, 0x3D, 0x48, 0xFB, 0x6C, 0x85, 0xD3, 0xD7, 0xB0, 0xFD, 0x4E, 0xCA, 0x3A, 0xEE, 0x37,
+ 0xFF, 0xA1, 0xA8, 0xB0, 0x8F, 0xF8, 0x3F, 0xC7, 0x88, 0x07, 0x30, 0x1C, 0x81, 0x56, 0x63, 0xC2,
+ 0x97, 0x05, 0x8C, 0x7A, 0x01, 0xBF, 0x14, 0x50, 0xA7, 0x87, 0x9A, 0x86, 0x79, 0x59, 0x45, 0x0F,
+ 0x78, 0xD4, 0x0D, 0x1E, 0x3B, 0xE0, 0xF1, 0x14, 0x11, 0x55, 0x04, 0xE8, 0x10, 0x34, 0xDC, 0xF8,
+ 0x3C, 0x12, 0xC5, 0x93, 0x64, 0x47, 0x70, 0x84, 0x89, 0x5F, 0xAF, 0xC3, 0x6B, 0xB2, 0x89, 0xAE,
+ 0xED, 0xF6, 0x6A, 0x55, 0xC5, 0x50, 0xC5, 0xDE, 0x02, 0x70, 0xF9, 0x03, 0x67, 0xA4, 0x82, 0xDE,
+ 0x0D, 0x38, 0x18, 0xDF, 0x5D, 0x24, 0x8D, 0x00, 0x8A, 0xF5, 0xA3, 0x01, 0xC6, 0xE3, 0xA6, 0x17,
+ 0x16, 0xB9, 0xA1, 0x8E, 0x9C, 0x08, 0x9B, 0x2A, 0x20, 0x22, 0x69, 0x50, 0x91, 0x10, 0x98, 0x2C,
+ 0x19, 0x94, 0xE6, 0xE9, 0x2C, 0x0F, 0xDD, 0x0A, 0x5A, 0xF8, 0xAD, 0xE5, 0xBE, 0x65, 0x3C, 0xD3,
+ 0x75, 0x1C, 0x75, 0x77, 0xC2, 0xF7, 0x23, 0x7E, 0x6E, 0x62, 0xAF, 0xD2, 0x5F, 0x00, 0xFC, 0xD0,
+ 0xF9, 0xF1, 0xCF, 0x7E, 0x11, 0xE6, 0xF5, 0x7E, 0xC0, 0x46, 0xCA, 0xEF, 0x1C, 0x5F, 0x62, 0x2F,
+ 0x6D, 0xF9, 0xF4, 0x88, 0x64, 0xD2, 0xE0, 0x1F, 0x04, 0x33, 0xB9, 0xBA, 0x99, 0xC9, 0x9E, 0xD9,
+ 0x48, 0x11, 0x6B, 0x2C, 0x35, 0x79, 0x36, 0x40, 0xDF, 0xB8, 0x3C, 0x2F, 0xAA, 0x35, 0x91, 0x43,
+ 0xD2, 0x23, 0x8F, 0x1E, 0x24, 0x4E, 0x29, 0xA8, 0x9F, 0x3F, 0xF9, 0xF4, 0x5E, 0xAC, 0xBF, 0x39,
+ 0xE2, 0x7F, 0x12, 0x4C, 0x95, 0xBC, 0xCE, 0x61, 0xF3, 0xEF, 0xD0, 0x30, 0x60, 0x6B, 0xFD, 0xD6,
+ 0xF8, 0x15, 0x25, 0x56, 0x57, 0xC2, 0xF5, 0x84, 0xE4, 0xDF, 0xE8, 0x28, 0xBF, 0x81, 0x98, 0x5D,
+ 0xFA, 0x28, 0x66, 0xF5, 0xD5, 0x43, 0x71, 0x17, 0xBF, 0x19, 0xA2, 0x5F, 0xB6, 0xDB, 0x14, 0x93,
+ 0xBC, 0x30, 0xC4, 0x3E, 0x11, 0x01, 0xC5, 0x04, 0x30, 0x90, 0xBE, 0xA5, 0x85, 0xC4, 0x1B, 0xAD,
+ 0x68, 0xCA, 0xBB, 0x7B, 0x8B, 0x45, 0x29, 0xF4, 0xA3, 0xCE, 0x72, 0x36, 0x79, 0x1B, 0xE6, 0x4D,
+ 0xD7, 0x52, 0xBA, 0xD7, 0x2E, 0x61, 0x97, 0xDB, 0x5B, 0xA5, 0x47, 0x1F, 0x6F, 0xE0, 0x29, 0x25,
+ 0xBC, 0xA1, 0xCF, 0x17, 0xC5, 0x32, 0xAA, 0x2B, 0xB2, 0x52, 0x89, 0x32, 0xCB, 0xFB, 0x1A, 0xCE,
+ 0x4A, 0x2B, 0x98, 0x7F, 0xB5, 0x9B, 0x72, 0x42, 0x08, 0xB4, 0x52, 0x83, 0xB5, 0x98, 0x9D, 0xA0,
+ 0x04, 0x50, 0x3B, 0xFD, 0x4B, 0x18, 0xAF, 0x9D, 0xE0, 0x70, 0xE7, 0x0B, 0x84, 0x09, 0x93, 0x51,
+ 0x35, 0xE1, 0xC0, 0xB2, 0xD3, 0xE1, 0x66, 0x17, 0xB1, 0xDC, 0xE4, 0x1D, 0xBF, 0xE6, 0x76, 0x53,
+ 0x1B, 0x05, 0xB2, 0x47, 0x02, 0x0B, 0xAB, 0x70, 0x52, 0x1B, 0x1C, 0x5B, 0xAF, 0x84, 0x0F, 0x12,
+ 0xCD, 0xB9, 0x3F, 0xB9, 0x15, 0xC6, 0x56, 0xBB, 0xD7, 0x80, 0xBB, 0x94, 0xFB, 0xFB, 0x7C, 0xB9,
+ 0xCF, 0xBC, 0x0E, 0xCB, 0xA8, 0x7E, 0x4A, 0xF3, 0xBA, 0x73, 0xCD, 0x9E, 0x14, 0x0D, 0x12, 0x17,
+ 0x91, 0xF6, 0xF4, 0x9D, 0x14, 0x13, 0x91, 0x8E, 0x6D, 0x62, 0xF3, 0x27, 0xA1, 0x01, 0x85, 0xD2,
+ 0x7A, 0xF5, 0x60, 0x13, 0xEE, 0xDC, 0x75, 0xF9, 0xFF, 0x23, 0x2D, 0xFE, 0xE7, 0x69, 0x40, 0x8B,
+ 0x0A, 0xA8, 0xFF, 0x86, 0x2A, 0x6D, 0x0D, 0xD3, 0x9D, 0x14, 0xA3, 0xDF, 0xB8, 0x1C, 0x44, 0xE9,
+ 0x7E, 0x9D, 0x73, 0x6B, 0x0C, 0xF2, 0x0F, 0x45, 0xA5, 0xCF, 0x46, 0xDA, 0xDC, 0xF6, 0x24, 0xC6,
+ 0x72, 0xD0, 0x91, 0x6E, 0x38, 0x76, 0x1F, 0xA7, 0xF9, 0x8F, 0x9A, 0xFC, 0x16, 0x1E, 0xF7, 0x6A,
+ 0x82, 0x49, 0x1C, 0xC0, 0xDE, 0x8A, 0xDA, 0x62, 0x86, 0x06, 0x6C, 0xF6, 0x8E, 0xA3, 0xE1, 0x65,
+ 0x32, 0x7B, 0x65, 0x00, 0x99, 0xEA, 0xAF, 0x86, 0x03, 0xDE, 0xCE, 0xF9, 0xE6, 0xAE, 0x16, 0x2D,
+ 0x9D, 0x90, 0xB4, 0x63, 0x96, 0xA6, 0x7E, 0xEE, 0x06, 0xE7, 0x69, 0x84, 0x40, 0xDE, 0x94, 0x20,
+ 0x7C, 0xCF, 0x37, 0x21, 0x6E, 0x3D, 0xB0, 0xED, 0x9C, 0x9E, 0xAE, 0x56, 0x5D, 0xD7, 0x54, 0x51,
+ 0x80, 0xA7, 0xCB, 0xB8, 0xC2, 0x02, 0x45, 0xF3, 0x5B, 0x15, 0xA6, 0xEC, 0x5A, 0x10, 0xB2, 0xCC,
+ 0xC6, 0x4D, 0xCD, 0xE5, 0xF5, 0xB5, 0x86, 0xC3, 0x73, 0x00, 0xDB, 0x5B, 0xE7, 0x0E, 0xF8, 0x51,
+ 0x05, 0x4B, 0x93, 0xB3, 0xD0, 0x78, 0x12, 0x1E, 0x86, 0xCD, 0xBB, 0xE4, 0x80, 0xF7, 0x72, 0xF5,
+ 0xC7, 0x95, 0xF5, 0x62, 0xFA, 0x27, 0x9B, 0x9A, 0x24, 0xDD, 0x7E, 0xE3, 0xCE, 0x7C, 0x96, 0x13,
+ 0x29, 0xD2, 0xCD, 0xB5, 0x31, 0xD8, 0x8D, 0xE9, 0x8D, 0x12, 0xD5, 0x49, 0x76, 0xFD, 0xCC, 0xCC,
+ 0x8B, 0x30, 0x6D, 0x7D, 0x33, 0xC1, 0x0B, 0x0B, 0xC8, 0xD3, 0xA2, 0x3A, 0x98, 0xAB, 0x20, 0x50,
+ 0x25, 0x44, 0xC4, 0x34, 0xC0, 0x82, 0x64, 0x94, 0x44, 0x19, 0x33, 0xCB, 0x18, 0x5A, 0x7B, 0x33,
+ 0x38, 0xED, 0xC6, 0x5F, 0xD4, 0x85, 0xD1, 0x1D, 0xDD, 0x1C, 0xD7, 0x43, 0xFF, 0x67, 0x28, 0xD2,
+ 0xC1, 0x8E, 0x3D, 0x19, 0x21, 0xC1, 0x8D, 0x00, 0xCE, 0x0C, 0x2C, 0x83, 0x89, 0x11, 0x14, 0xC1,
+ 0x59, 0x29, 0x63, 0x2D, 0xC6, 0x46, 0xD0, 0x52, 0xFB, 0x02, 0xEC, 0xF3, 0x9C, 0xF2, 0x64, 0xB4,
+ 0x37, 0x99, 0x5C, 0xF6, 0x57, 0xC9, 0x4A, 0x51, 0x18, 0x08, 0x6E, 0x8B, 0x9D, 0xEB, 0xA5, 0x8F,
+ 0xE4, 0x85, 0x29, 0x4C, 0x5F, 0xD8, 0x41, 0x2A, 0x62, 0xAB, 0x25, 0x42, 0xEE, 0x90, 0x64, 0x8E,
+ 0x93, 0x64, 0x87, 0x49, 0x98, 0x7C, 0x0E, 0xDF, 0xAC, 0xC5, 0x79, 0x2D, 0xC8, 0x53, 0x45, 0x2B,
+ 0xCF, 0x2F, 0x0B, 0xB6, 0x5B, 0x4C, 0x45, 0x38, 0x96, 0xE3, 0x70, 0x91, 0x8E, 0xAC, 0x51, 0x67,
+ 0xA2, 0xDB, 0x83, 0x55, 0x4C, 0x9D, 0xEB, 0x49, 0xE4, 0x37, 0x68, 0x9B, 0x58, 0xDC, 0x4B, 0xEC,
+ 0xB5, 0xC4, 0xDC, 0x13, 0xB1, 0x54, 0x92, 0xA5, 0x67, 0x75, 0x98, 0x43, 0x71, 0x27, 0xFF, 0xA5,
+ 0x6E, 0xE3, 0x12, 0x8C, 0xF6, 0xCB, 0x18, 0x21, 0x7C, 0x0A, 0x4B, 0xB3, 0xA5, 0xF4, 0xEA, 0x09,
+ 0x2C, 0x1C, 0x57, 0xBF, 0x8F, 0xA6, 0x94, 0xDD, 0x19, 0x35, 0x4F, 0x17, 0xA7, 0x55, 0x45, 0xBD,
+ 0xC8, 0x32, 0x72, 0x9E, 0x05, 0xD6, 0xBA, 0x3C, 0x60, 0x2E, 0xE6, 0x83, 0x12, 0xC4, 0xE2, 0x80,
+ 0x03, 0xDE, 0xBB, 0x88, 0xFB, 0x7F, 0xAD, 0x3B, 0x9C, 0xD8, 0xD0, 0x8E, 0x4C, 0x52, 0x4D, 0x7A,
+ 0xB8, 0x89, 0xB0, 0xBC, 0x7F, 0x94, 0x81, 0xBB, 0x6C, 0xE7, 0x5E, 0x1C, 0xFA, 0x69, 0x81, 0xB6,
+ 0x46, 0xC2, 0x3B, 0x70, 0xB8, 0x02, 0xA9, 0x9F, 0x17, 0x0F, 0xF2, 0x31, 0x17, 0x82, 0xFF, 0x17,
+ 0x02, 0xB9, 0x14, 0xBB, 0xE7, 0x1B, 0x1B, 0x4B, 0x92, 0x14, 0xE4, 0xE7, 0x6D, 0x6D, 0x73, 0xB8,
+ 0xCB, 0x5D, 0x92, 0x27, 0x7D, 0xDA, 0x00, 0x69, 0x70, 0x15, 0x3C, 0x0F, 0xF0, 0xDE, 0x5F, 0xCD,
+ 0x1A, 0x17, 0x86, 0x2A, 0x58, 0xB5, 0x4B, 0x3E, 0xAB, 0x4D, 0x8D, 0x75, 0x4D, 0x40, 0x7F, 0x84,
+ 0x1D, 0x19, 0x17, 0x1E, 0x41, 0x4C, 0xB9, 0xEF, 0x61, 0x46, 0x80, 0xAD, 0x5D, 0xDB, 0x01, 0x1E,
+ 0x73, 0xED, 0x42, 0xDD, 0x35, 0x07, 0x8B, 0xD0, 0xEC, 0x2E, 0x77, 0x35, 0xB8, 0xFC, 0x2E, 0xE5,
+ 0x8D, 0x30, 0x96, 0x0D, 0x88, 0x7F, 0x52, 0xE7, 0x6B, 0x11, 0xF0, 0xD2, 0x6A, 0x6F, 0x89, 0x66,
+ 0x3F, 0x3A, 0x94, 0x98, 0x64, 0x0F, 0x0E, 0x77, 0xF2, 0x04, 0x96, 0xD9, 0xAA, 0x36, 0x0B, 0x39,
+ 0xEE, 0x1F, 0x1D, 0x10, 0x23, 0xD0, 0xFA, 0x0B, 0xE1, 0x88, 0xED, 0x97, 0x73, 0xFF, 0xCC, 0xC8,
+ 0xD6, 0x49, 0x4A, 0x24, 0xC1, 0x49, 0x78, 0x25, 0x7A, 0x26, 0xD4, 0x6A, 0x9E, 0x4C, 0x98, 0xFA,
+ 0x90, 0xB4, 0xD4, 0x07, 0xA4, 0xD2, 0x5E, 0x8B, 0x6D, 0xB1, 0x03, 0xBD, 0xCE, 0x13, 0x3B, 0x3E,
+ 0x78, 0x4F, 0xFE, 0xCB, 0xB6, 0x53, 0xB7, 0x27, 0xAA, 0xC4, 0x35, 0xCD, 0xD8, 0xD9, 0x96, 0x78,
+ 0x9A, 0x1D, 0xE5, 0x97, 0xAC, 0xBE, 0x31, 0x8A, 0x77, 0x65, 0x67, 0x61, 0x3A, 0xF0, 0x0E, 0x04,
+ 0x54, 0x1C, 0xE4, 0x5F, 0xED, 0x06, 0xBA, 0xFB, 0x34, 0x59, 0xB2, 0x91, 0x33, 0xED, 0xF4, 0x52,
+ 0xFE, 0x42, 0xFB, 0xAE, 0xEF, 0x46, 0xE5, 0x01, 0x95, 0x6F, 0xB7, 0xE6, 0x8A, 0xEE, 0x45, 0xE5,
+ 0xAF, 0x13, 0x8B, 0x76, 0x74, 0xC3, 0x31, 0x36, 0xD2, 0x84, 0x1C, 0xA9, 0x4D, 0xF1, 0x1E, 0xA7,
+ 0x97, 0xF4, 0x4B, 0xD6, 0xA2, 0xF8, 0x90, 0x31, 0x2F, 0xCC, 0x70, 0x9F, 0x59, 0x98, 0x6F, 0x8F,
+ 0x6F, 0x81, 0x44, 0x01, 0x70, 0x25, 0x6B, 0x6A, 0x86, 0xF9, 0x76, 0x87, 0x37, 0xDB, 0x23, 0x5A,
+ 0xE1, 0x1B, 0x83, 0x8C, 0x87, 0x2C, 0x21, 0xC2, 0x8B, 0x76, 0x37, 0x1A, 0x5D, 0x96, 0xFB, 0x5B,
+ 0x9E, 0xF7, 0xA3, 0xFD, 0x11, 0x8F, 0x87, 0x0A, 0xD5, 0xE2, 0x13, 0x33, 0xCC, 0x02, 0xB5, 0x9B,
+ 0x31, 0x7F, 0x50, 0x4B, 0xED, 0x88, 0x74, 0xCF, 0x0A, 0x04, 0x2C, 0x92, 0xE2, 0xE7, 0x79, 0x00,
+ 0x68, 0xFF, 0xC2, 0x5B, 0xA5, 0x76, 0x40, 0xD0, 0x63, 0x53, 0x39, 0x24, 0x48, 0xB2, 0x9F, 0x34,
+ 0x76, 0xD1, 0x68, 0x75, 0x47, 0x0E, 0x51, 0x90, 0x01, 0x53, 0x05, 0x3E, 0x88, 0xE8, 0x1A, 0x10,
+ 0x85, 0x52, 0x2D, 0x57, 0x12, 0x17, 0x83, 0x4D, 0x11, 0xBB, 0x63, 0x0E, 0x59, 0x61, 0xCA, 0xAC,
+ 0x3F, 0xE0, 0x18, 0x04, 0x68, 0xDC, 0x7D, 0xC7, 0xD8, 0xF2, 0x5D, 0xB6, 0x7C, 0x86, 0x0C, 0x03,
+ 0xD6, 0x7E, 0xA6, 0x2C, 0x01, 0x5F, 0x7E, 0xFF, 0x9B, 0x0C, 0x26, 0xA9, 0x9C, 0x5D, 0x9D, 0x00,
+ 0xCD, 0x59, 0x4C, 0x3A, 0xD6, 0x82, 0x85, 0x8B, 0x65, 0x41, 0x85, 0x40, 0xE0, 0xE9, 0x0B, 0x93,
+ 0xE5, 0x32, 0x24, 0xDB, 0x94, 0x74, 0x94, 0x07, 0x47, 0x1B, 0x01, 0x6E, 0x4B, 0x5D, 0x26, 0x31,
+ 0x42, 0xBE, 0x38, 0x08, 0x2B, 0x19, 0xC1, 0x51, 0xCC, 0x51, 0xFC, 0x62, 0xFE, 0x09, 0x08, 0xD3,
+ 0x58, 0x6C, 0x8A, 0x2D, 0x35, 0xDE, 0x82, 0xD6, 0x4F, 0xEB, 0x65, 0x9F, 0xA1, 0xC9, 0xC3, 0x7A,
+ 0x70, 0x9F, 0xAA, 0xF3, 0x97, 0xF3, 0xE9, 0xFC, 0x3B, 0x84, 0x1D, 0xE5, 0x35, 0xA0, 0x05, 0xEE,
+ 0xAB, 0x78, 0xDB, 0xF0, 0xAD, 0xEC, 0x1E, 0xE9, 0x86, 0x96, 0x46, 0x45, 0x44, 0xD5, 0x28, 0x7D,
+ 0x83, 0xB0, 0x83, 0x69, 0xBC, 0x60, 0x5E, 0x14, 0x28, 0xCA, 0xA7, 0x3C, 0xEF, 0xDE, 0x74, 0x89,
+ 0x6D, 0xBF, 0x1B, 0x8F, 0x59, 0x8E, 0x96, 0xD5, 0xCE, 0x19, 0x41, 0x92, 0x88, 0x2A, 0xE8, 0x1B,
+ 0x1D, 0x9E, 0xC1, 0x34, 0x2C, 0x3E, 0x3F, 0xBC, 0x4F, 0x72, 0x61, 0x44, 0x21, 0xCA, 0x08, 0x26,
+ 0x0D, 0x28, 0xDC, 0x3D, 0x6F, 0x33, 0x49, 0xE6, 0x8B, 0xE6, 0xDD, 0x09, 0x6B, 0x29, 0x8B, 0xAB,
+ 0xF6, 0x2C, 0x23, 0x7E, 0x2B, 0x51, 0x63, 0x0F, 0x97, 0x25, 0xA1, 0x3C, 0x76, 0x39, 0x3B, 0xFB,
+ 0x75, 0x62, 0xA4, 0xF5, 0xC6, 0x72, 0x5E, 0xBF, 0x38, 0xA1, 0x8D, 0xB3, 0x31, 0x0E, 0x02, 0x7A,
+ 0x42, 0xDB, 0x92, 0xD0, 0x44, 0x85, 0x8F, 0x6E, 0x7B, 0xCA, 0xD4, 0xE1, 0x8B, 0xC9, 0x6A, 0xC2,
+ 0x20, 0xF7, 0x67, 0x00, 0x39, 0xDA, 0xAA, 0xF9, 0x54, 0x77, 0xDB, 0x54, 0x76, 0x7B, 0x15, 0xBF,
+ 0xE3, 0x8F, 0x7E, 0x75, 0x09, 0x50, 0x1D, 0x8A, 0x82, 0x91, 0xCA, 0x7E, 0xF3, 0x11, 0xB8, 0x1B,
+ 0xA7, 0x11, 0x0F, 0x29, 0xA4, 0x32, 0xB7, 0xB4, 0x66, 0x5A, 0xCE, 0xC3, 0x70, 0xCA, 0x19, 0xF1,
+ 0x75, 0x32, 0x18, 0xCD, 0x11, 0xCD, 0x29, 0x6F, 0x7D, 0x9D, 0x56, 0x17, 0x6F, 0xB2, 0x82, 0x75,
+ 0x9B, 0xE5, 0x60, 0x5F, 0x98, 0xAF, 0x2A, 0x9A, 0xBA, 0x97, 0x90, 0xC5, 0x99, 0x73, 0xC0, 0xFD,
+ 0x70, 0xA3, 0x14, 0xF7, 0xD8, 0xAF, 0xA4, 0x1C, 0xEC, 0x04, 0x27, 0xD5, 0xCB, 0x95, 0xAB, 0x1E,
+ 0x1D, 0x01, 0x33, 0xDA, 0xC1, 0xF3, 0xF3, 0x14, 0x0E, 0xE9, 0x40, 0xCA, 0x8D, 0x16, 0xAF, 0x61,
+ 0x4C, 0x5B, 0x98, 0x11, 0xFE, 0x39, 0x84, 0x08, 0x29, 0x0B, 0x3C, 0xD1, 0xC6, 0x80, 0xAB, 0x8B,
+ 0x61, 0xD3, 0x36, 0x84, 0xAC, 0xBE, 0xD0, 0xC5, 0x5D, 0xD8, 0x7B, 0x9B, 0xF0, 0x72, 0xC0, 0x0C,
+ 0xFD, 0x57, 0x57, 0x75, 0x31, 0x0D, 0x7D, 0x6E, 0xA4, 0xE8, 0xDC, 0x15, 0x73, 0x22, 0x00, 0x25,
+ 0xCB, 0xCA, 0x54, 0x5A, 0xB3, 0x1D, 0x27, 0x52, 0xE5, 0xF8, 0xEA, 0xA5, 0xE7, 0x3E, 0x25, 0x8B,
+ 0x58, 0x23, 0x93, 0xB6, 0x90, 0x62, 0x32, 0xD9, 0xAA, 0xEC, 0x37, 0xB6, 0xC3, 0xA0, 0x92, 0xE4,
+ 0xFB, 0xFF, 0xB3, 0xF4, 0xBF, 0x90, 0x58, 0x51, 0x9F, 0xAC, 0xFD, 0xA7, 0x7B, 0xEA, 0x47, 0x67,
+ 0x5B, 0x5D, 0x1A, 0x1D, 0xED, 0xC8, 0x80, 0x19, 0x86, 0x97, 0x7D, 0x8E, 0x70, 0x1E, 0x5B, 0xF1,
+ 0x04, 0x21, 0xA0, 0x41, 0xBE, 0x6A, 0x6E, 0x0D, 0x31, 0x62, 0xB7, 0xE9, 0x9F, 0xCF, 0x09, 0xC2,
+ 0xC0, 0xC0, 0xA8, 0xE2, 0x9A, 0x01, 0xDB, 0x0C, 0x8B, 0xC3, 0x04, 0xD3, 0xE6, 0xAE, 0x51, 0xCD,
+ 0xA8, 0x75, 0x51, 0xC9, 0x85, 0x87, 0x38, 0x5B, 0x6F, 0xD6, 0x7C, 0x2C, 0x56, 0x7B, 0xE3, 0x90,
+ 0x72, 0xC4, 0x17, 0x4D, 0x61, 0xE8, 0x82, 0x04, 0xB4, 0x54, 0x27, 0xA1, 0xEA, 0x75, 0xB7, 0x3A,
+ 0xA7, 0x51, 0x43, 0xB4, 0x0C, 0xC8, 0xFB, 0x7D, 0xBD, 0x47, 0x43, 0xDC, 0xE1, 0x60, 0x09, 0x94,
+ 0xF1, 0xDA, 0x45, 0x6F, 0x57, 0xFB, 0x66, 0xEF, 0xA4, 0x14, 0x6F, 0x7A, 0xAD, 0xAA, 0xE2, 0x85,
+ 0x3D, 0xC5, 0xF5, 0x14, 0xEB, 0x7B, 0x68, 0xAE, 0x41, 0xDF, 0xB6, 0xDD, 0x83, 0x14, 0x83, 0xAF,
+ 0x54, 0xF8, 0x34, 0xEA, 0x01, 0x61, 0x8D, 0x9B, 0xCC, 0xE9, 0xDB, 0x81, 0x68, 0xC2, 0x6F, 0xD2,
+ 0xAB, 0xF9, 0xF2, 0xC0, 0xF1, 0x29, 0x7A, 0x47, 0x4F, 0x52, 0x51, 0xDB, 0xDA, 0x1C, 0xD3, 0x5C,
+ 0xE8, 0x2A, 0x68, 0xFF, 0x99, 0xD1, 0x6D, 0xE8, 0xA1, 0x90, 0x17, 0x1A, 0x2C, 0x7D, 0xB3, 0x1D,
+ 0x8E, 0xF6, 0x84, 0xE2, 0x3F, 0x1A, 0xD0, 0x3D, 0xE8, 0x51, 0x7B, 0xEA, 0x3E, 0xFF, 0x2B, 0x25,
+ 0xB7, 0x27, 0x3D, 0xA0, 0x2E, 0x10, 0xD8, 0x1C, 0x99, 0xA4, 0xE0, 0x78, 0xA3, 0x30, 0x8E, 0x1E,
+ 0xD2, 0xE4, 0xA1, 0x08, 0x0E, 0x9F, 0x60, 0x22, 0xDE, 0xB3, 0x8C, 0x0F, 0xAE, 0x97, 0x21, 0x35,
+ 0xDC, 0x8E, 0x0D, 0x65, 0x99, 0xFA, 0xAC, 0x46, 0x79, 0x97, 0xEC, 0x58, 0x7E, 0x42, 0x45, 0x58,
+ 0x33, 0xAF, 0x2D, 0xE4, 0x45, 0x9F, 0x54, 0x93, 0x34, 0xCB, 0xAD, 0x10, 0xD6, 0x61, 0x33, 0xB8,
+ 0x5B, 0xCF, 0xB3, 0xF4, 0x68, 0x16, 0xA5, 0x98, 0x54, 0x75, 0x95, 0x8C, 0xCD, 0xCF, 0x74, 0x29,
+ 0x7F, 0xB5, 0xF7, 0xC9, 0x56, 0x6E, 0x5B, 0xFF, 0xEA, 0xCB, 0x8A, 0x53, 0x1E, 0x78, 0xA3, 0x25,
+ 0x68, 0x15, 0xE4, 0xD3, 0xC4, 0xDF, 0x93, 0x6E, 0xC8, 0xAA, 0x53, 0xFA, 0x3C, 0x60, 0xAC, 0x0D,
+ 0xA2, 0x01, 0xF6, 0x36, 0x1E, 0x80, 0x61, 0xE1, 0x89, 0x29, 0xDC, 0x0B, 0xC4, 0x0D, 0xB7, 0x8A,
+ 0xD2, 0xB2, 0x7C, 0xAD, 0x47, 0xB5, 0xE0, 0x1F, 0x48, 0x21, 0x55, 0xAA, 0x5F, 0x7D, 0x85, 0x48,
+ 0xE8, 0xD6, 0x19, 0xBE, 0xE6, 0x9C, 0x61, 0x8F, 0x89, 0x35, 0x49, 0x6D, 0x2E, 0x8B, 0x46, 0x1B,
+ 0xCB, 0xD8, 0x06, 0x83, 0x8B, 0x70, 0xED, 0x66, 0x17, 0xAD, 0x2C, 0xF6, 0xC8, 0xF3, 0x1E, 0xE2,
+ 0xCA, 0xDA, 0x04, 0xAA, 0xD4, 0xA0, 0xA6, 0x8B, 0xCC, 0x19, 0xF1, 0x87, 0x93, 0x3A, 0x69, 0xEE,
+ 0x82, 0x75, 0x71, 0x8B, 0x8E, 0xFD, 0x39, 0x4A, 0x9D, 0x95, 0x07, 0x80, 0x4E, 0xF6, 0x25, 0xFA,
+ 0x9C, 0x68, 0xF1, 0xA6, 0x84, 0x28, 0x8C, 0x47, 0xFB, 0xCC, 0xE5, 0x7A, 0x2B, 0xAC, 0x3B, 0x58,
+ 0xEE, 0x51, 0x31, 0x18, 0x6F, 0xFD, 0x5A, 0xE4, 0xFE, 0x80, 0x75, 0x92, 0x67, 0xF1, 0xF9, 0x78,
+ 0x73, 0xF1, 0x52, 0x4E, 0x9F, 0xFE, 0xA7, 0x18, 0x99, 0x48, 0x74, 0xE3, 0x94, 0x70, 0x1A, 0x9F,
+ 0xCD, 0x15, 0x31, 0xB3, 0x68, 0x4C, 0xFA, 0xED, 0x44, 0xC2, 0x8D, 0x71, 0xC0, 0xC2, 0x1B, 0x39,
+ 0x97, 0xE2, 0xFF, 0xA5, 0x4E, 0x07, 0xF1, 0xA7, 0xFF, 0xBF, 0x85, 0x79, 0x00, 0x29, 0x62, 0xB7,
+ 0x0F, 0xF9, 0x6A, 0xE5, 0xFE, 0x09, 0xE2, 0x2B, 0x76, 0x74, 0xF6, 0x40, 0xBE, 0x64, 0xE9, 0xD4,
+ 0x27, 0x74, 0x6F, 0xEC, 0xDD, 0xBC, 0x53, 0xCD, 0x9F, 0x16, 0x6B, 0x92, 0xAE, 0x59, 0x9E, 0x74,
+ 0x72, 0x18, 0xA5, 0x68, 0xE0, 0xA0, 0xAE, 0x06, 0xDB, 0xC4, 0xE5, 0x34, 0x37, 0x87, 0xAD, 0x80,
+ 0x2B, 0x0F, 0x84, 0x37, 0x99, 0x96, 0x9D, 0xEF, 0x87, 0x3C, 0xED, 0x7A, 0xD9, 0xAA, 0xB8, 0xC8,
+ 0x7A, 0xD4, 0xD0, 0x2A, 0xD7, 0xDA, 0xEC, 0x0B, 0x85, 0x8A, 0x93, 0x84, 0x38, 0x2D, 0x3F, 0x6B,
+ 0xE1, 0x8A, 0x88, 0x5D, 0x4C, 0x26, 0x69, 0xF5, 0x43, 0x55, 0xB1, 0x32, 0xB2, 0x78, 0x67, 0x39,
+ 0xC3, 0x64, 0x4A, 0x6A, 0x5B, 0xA3, 0x7A, 0xBC, 0x8A, 0x0A, 0x76, 0xDB, 0x69, 0x09, 0x66, 0x2C,
+ 0x2F, 0xD9, 0x30, 0x0B, 0x4E, 0xB0, 0x71, 0x5E, 0xDE, 0x48, 0x58, 0x6A, 0x10, 0x6B, 0xB1, 0x6D,
+ 0xF8, 0xB3, 0xF9, 0xD9, 0x24, 0x43, 0x0C, 0xB9, 0xAE, 0xB7, 0x9B, 0x76, 0x3A, 0xB3, 0xF1, 0x68,
+ 0x0A, 0xD4, 0xE5, 0xEC, 0x30, 0x8D, 0x19, 0xD0, 0x19, 0x42, 0x42, 0xF4, 0xD2, 0xF0, 0x3D, 0x40,
+ 0x4E, 0xF0, 0x52, 0x8C, 0x9D, 0x77, 0xE4, 0x5B, 0x04, 0x12, 0x4C, 0x08, 0xC3, 0xF6, 0x9A, 0x58,
+ 0x20, 0x40, 0x4B, 0x06, 0x8B, 0x1C, 0xD6, 0x0E, 0x7D, 0x2C, 0x8A, 0x9F, 0xEC, 0x25, 0xF0, 0x66,
+ 0x91, 0x34, 0xBE, 0xB9, 0x27, 0x02, 0xFE, 0x9C, 0x1C, 0x3D, 0x8A, 0xD9, 0x0C, 0x64, 0x98, 0xE1,
+ 0x2C, 0x9F, 0x25, 0xE9, 0x0A, 0xB7, 0xA4, 0xE7, 0xE1, 0x59, 0x51, 0x2A, 0xC0, 0xBF, 0x63, 0x80,
+ 0xEE, 0x71, 0x25, 0xD2, 0xCA, 0x3E, 0x23, 0xA2, 0x0A, 0x5D, 0x53, 0xD5, 0x38, 0xC6, 0x7E, 0xB2,
+ 0xD6, 0xA1, 0xB0, 0x1F, 0xD0, 0xDA, 0xA7, 0x59, 0x33, 0xF4, 0x43, 0x0A, 0x9E, 0xCB, 0x95, 0x5C,
+ 0x52, 0xD5, 0x34, 0x9E, 0x52, 0xAC, 0xC1, 0x36, 0x84, 0x1F, 0x62, 0x1D, 0x86, 0xD6, 0xBD, 0x56,
+ 0x9F, 0xCC, 0xAF, 0x30, 0xC0, 0x39, 0x28, 0x22, 0xDB, 0xDA, 0xD5, 0x4C, 0x4F, 0x1B, 0x36, 0x1D,
+ 0x1D, 0xAC, 0xF4, 0x98, 0xF5, 0x46, 0x94, 0x32, 0x80, 0x2B, 0xF8, 0x14, 0xF0, 0x68, 0x91, 0x1E,
+ 0xF6, 0x72, 0x1C, 0x4A, 0xF9, 0xD6, 0xC2, 0xA6, 0x3A, 0x85, 0xE9, 0xE1, 0x76, 0xB5, 0xA0, 0xEA,
+ 0x46, 0x6A, 0x2C, 0xF8, 0x8B, 0x8D, 0x0C, 0xD0, 0x1F, 0x4F, 0xD9, 0x38, 0x5B, 0xFE, 0x6E, 0x59,
+ 0xA3, 0xB8, 0xA4, 0x68, 0xED, 0x03, 0x4A, 0x06, 0xD3, 0xC1, 0xCD, 0x02, 0x95, 0x24, 0x5C, 0x3D,
+ 0x3B, 0xEC, 0x5A, 0x1C, 0x46, 0xD6, 0x1B, 0xA5, 0x42, 0xFD, 0x2E, 0xE7, 0xEA, 0x42, 0x98, 0x42,
+ 0x53, 0xB5, 0xD9, 0xCE, 0x53, 0xC1, 0x8F, 0x83, 0x4D, 0xB2, 0xB6, 0x9F, 0x8F, 0xB1, 0x88, 0x4D,
+ 0x45, 0x3D, 0x08, 0x01, 0x9A, 0x28, 0x7B, 0x10, 0x97, 0x6C, 0x76, 0x44, 0xE1, 0x07, 0x04, 0x51,
+ 0x0E, 0x4A, 0xC7, 0x98, 0xED, 0x86, 0x17, 0x69, 0x90, 0x14, 0xA9, 0xD8, 0xB7, 0x07, 0x28, 0x4A,
+ 0x77, 0x0B, 0xF9, 0x3F, 0x27, 0x4F, 0xCF, 0xA9, 0xDA, 0xCE, 0xC4, 0xDA, 0x30, 0x09, 0x56, 0x64,
+ 0x55, 0xCE, 0xD6, 0xEA, 0xE4, 0x85, 0x92, 0x95, 0x3E, 0x12, 0x5B, 0xF4, 0x21, 0x91, 0xCB, 0xD9,
+ 0xFB, 0xB7, 0x38, 0xBB, 0x1D, 0xFB, 0xAD, 0xE9, 0x55, 0x40, 0x9D, 0xF3, 0x30, 0xC5, 0xA4, 0x9E,
+ 0x02, 0xA8, 0x9B, 0x6E, 0x30, 0x07, 0x32, 0x16, 0xD9, 0xEB, 0x85, 0x55, 0xC8, 0x38, 0xBC, 0x84,
+ 0x9A, 0x9D, 0x61, 0x1C, 0x0D, 0xF5, 0x07, 0x06, 0xC8, 0x0B, 0x73, 0xC1, 0xB8, 0xD2, 0x84, 0xC2,
+ 0xAF, 0xCA, 0xB2, 0x88, 0x0A, 0xE4, 0x79, 0x84, 0x5C, 0x8B, 0xF7, 0xB6, 0xC4, 0x47, 0x92, 0xC9,
+ 0xC1, 0xBD, 0xF6, 0x84, 0x78, 0xC2, 0x74, 0xC3, 0xF8, 0x3C, 0x3F, 0xD6, 0x0E, 0x02, 0x5D, 0x22,
+ 0x42, 0x7D, 0xD3, 0xB8, 0xE9, 0xBB, 0x91, 0x36, 0x32, 0x81, 0xDD, 0x89, 0xCD, 0x41, 0x00, 0x37,
+ 0x4F, 0xA1, 0x48, 0x03, 0x2F, 0x3D, 0x54, 0x38, 0x17, 0x7C, 0x51, 0x40, 0x9A, 0x41, 0x57, 0x3C,
+ 0xF4, 0x5E, 0x0D, 0xF6, 0xA4, 0xE4, 0xA2, 0x97, 0x30, 0x71, 0x40, 0xC3, 0x20, 0x88, 0xEE, 0x95,
+ 0x7A, 0xB9, 0x03, 0x9D, 0x54, 0x10, 0xD1, 0x5B, 0xBC, 0x6D, 0x79, 0xFE, 0xF4, 0x44, 0x9C, 0xCB,
+ 0x1E, 0xAF, 0x0C, 0x6B, 0xB7, 0x17, 0x60, 0x91, 0x46, 0x1F, 0x9A, 0xA9, 0xD8, 0x84, 0x0D, 0x49,
+ 0x60, 0x4A, 0x48, 0xDD, 0x73, 0x1E, 0xDD, 0x17, 0xAD, 0xB8, 0x3C, 0x8A, 0xB3, 0xD3, 0x4C, 0x3C,
+ 0x97, 0xE3, 0xD0, 0x0A, 0x8D, 0x83, 0x7E, 0x3F, 0xE2, 0x03, 0xD1, 0xD3, 0x93, 0xA3, 0xFF, 0x3B,
+ 0x12, 0x65, 0x36, 0xF3, 0x27, 0xC1, 0x05, 0x27, 0xA2, 0x03, 0x71, 0x7C, 0xBD, 0xEC, 0xDB, 0xE4,
+ 0x3B, 0x33, 0x5F, 0x93, 0xB5, 0x41, 0xAC, 0xF8, 0x6D, 0xD7, 0xCB, 0x06, 0x33, 0x9A, 0x25, 0x2E,
+ 0xF6, 0x2F, 0xF4, 0x34, 0x6F, 0x5A, 0x05, 0xDD, 0x04, 0x95, 0x33, 0x67, 0x45, 0xD8, 0xD5, 0xD5,
+ 0xEA, 0xC8, 0x2F, 0x9B, 0xC3, 0xBE, 0xED, 0xCA, 0xC0, 0xCF, 0xB6, 0xFC, 0x7C, 0x88, 0x37, 0x1A,
+ 0x7D, 0xDA, 0x9B, 0x0E, 0xFC, 0x30, 0xD9, 0x17, 0xF3, 0x4C, 0x14, 0xF3, 0xDA, 0xF2, 0xCF, 0xCD,
+ 0x8A, 0x46, 0x23, 0xDA, 0x76, 0xC5, 0xF9, 0x06, 0xB9, 0x79, 0xD3, 0x1A, 0xD2, 0xA8, 0x11, 0x03,
+ 0x5D, 0x79, 0xA9, 0xA0, 0x93, 0x15, 0xC8, 0x27, 0xC2, 0xD9, 0x7F, 0x78, 0x3E, 0x84, 0xD4, 0x37,
+ 0x38, 0x52, 0x97, 0xD8, 0x58, 0x67, 0x6A, 0x13, 0x00, 0x00, 0x20, 0xFB, 0xF2, 0xBD, 0x52, 0x71,
+ 0xE6, 0x1C, 0x6C, 0x99, 0xF6, 0xDE, 0x72, 0x89, 0xCC, 0x92, 0x57, 0x13, 0x52, 0x04, 0x88, 0xE7,
+ 0xA5, 0xBC, 0x36, 0x46, 0x3C, 0x03, 0x59, 0xFE, 0x86, 0x99, 0xBC, 0x40, 0x70, 0xE9, 0xF1, 0xAA,
+ 0xCC, 0x4E, 0x16, 0xD2, 0x4B, 0x55, 0xC0, 0x42, 0x43, 0x3D, 0xF1, 0x1A, 0x38, 0xB9, 0x4F, 0x9E,
+ 0x31, 0x4E, 0x86, 0x08, 0x57, 0x95, 0x2D, 0xFB, 0xD7, 0x12, 0xC4, 0x11, 0xC0, 0x5D, 0x00, 0xD0,
+ 0xB5, 0x8D, 0xEA, 0x8F, 0x66, 0xD3, 0x00, 0x17, 0x80, 0x1A, 0x54, 0x0F, 0xDE, 0x75, 0x40, 0xD5,
+ 0x1B, 0x64, 0x89, 0x96, 0xF9, 0x9A, 0x0D, 0x70, 0x26, 0x50, 0x31, 0x3A, 0x3C, 0x0F, 0x5E, 0xC8,
+ 0xA3, 0xB8, 0x5D, 0x72, 0xDC, 0xBA, 0xB2, 0xEF, 0x58, 0x89, 0x52, 0x55, 0xF7, 0x9A, 0x17, 0xE7,
+ 0x43, 0xC2, 0x0F, 0x3A, 0x16, 0x75, 0xEB, 0x48, 0x87, 0x2A, 0xF8, 0x0E, 0xBA, 0xBB, 0x0D, 0xA2,
+ 0x6C, 0x37, 0x71, 0x50, 0xA4, 0xB8, 0x3F, 0x77, 0x2A, 0xDE, 0x12, 0x1B, 0x87, 0x39, 0x91, 0x40,
+ 0xA9, 0x62, 0x93, 0x87, 0x59, 0x8F, 0x1F, 0x9E, 0x27, 0xD6, 0x5F, 0xA9, 0x45, 0x67, 0xBC, 0x8C,
+ 0xE2, 0x84, 0x4C, 0x28, 0x0A, 0x7D, 0xBF, 0xC0, 0x08, 0x1C, 0x72, 0x87, 0x93, 0xC4, 0xA5, 0x88,
+ 0xFF, 0xD9, 0x29, 0x62, 0xC9, 0x2F, 0x9D, 0x96, 0x44, 0x77, 0xC1, 0x9E, 0xF4, 0xDF, 0x37, 0x5D,
+ 0x05, 0x2F, 0xD8, 0x4A, 0x46, 0x5D, 0xB2, 0x0C, 0xBE, 0x28, 0xA4, 0x15, 0x6B, 0xC0, 0xE4, 0x9A,
+ 0xFB, 0xAE, 0xCB, 0x1F, 0x14, 0x3F, 0x63, 0x65, 0x24, 0xD2, 0x49, 0x49, 0x90, 0x31, 0xBF, 0x6F,
+ 0x4F, 0x83, 0xE0, 0xDB, 0xF0, 0x0A, 0xA0, 0x7E, 0x45, 0x7F, 0x15, 0x86, 0x4A, 0x00, 0x06, 0x52,
+ 0xCE, 0x94, 0x81, 0x55, 0x48, 0x99, 0xF8, 0x2C, 0xD5, 0x18, 0x98, 0xF5, 0xB7, 0x5C, 0x71, 0x11,
+ 0x19, 0xAB, 0x7D, 0xAD, 0x35, 0x61, 0x2B, 0x00, 0x00, 0x80, 0xF0, 0x33, 0xF2, 0x4A, 0x77, 0x44,
+ 0xF2, 0x79, 0xA5, 0xE1, 0x53, 0xEE, 0x84, 0x18, 0x8C, 0x1F, 0x43, 0xA5, 0xF6, 0xA7, 0x3E, 0x73,
+ 0x89, 0x42, 0x9B, 0x45, 0xA6, 0x23, 0x09, 0x8B, 0x28, 0x02, 0xF4, 0x52, 0xBA, 0x2D, 0x9A, 0x3A,
+ 0xBC, 0x50, 0x8A, 0x6D, 0xD4, 0x0D, 0x19, 0xAC, 0x7F, 0x04, 0x99, 0xFC, 0x5C, 0x15, 0xD7, 0x30,
+ 0x9E, 0xDE, 0xCB, 0x61, 0x89, 0x54, 0x37, 0x6A, 0x9E, 0x21, 0x62, 0x5E, 0x28, 0x4E, 0xCE, 0x41,
+ 0x7D, 0x50, 0xFC, 0x99, 0xB0, 0x43, 0x86, 0x4A, 0xAD, 0x2C, 0x1C, 0xFC, 0x36, 0xF4, 0x16, 0x8A,
+ 0x23, 0x88, 0xB8, 0x32, 0xB0, 0x53, 0x3F, 0x50, 0xDB, 0x04, 0x20, 0x91, 0x9C, 0xA9, 0x71, 0x57,
+ 0xAB, 0x89, 0xE7, 0xA0, 0xAF, 0x65, 0xE4, 0xDF, 0x19, 0x7D, 0x1C, 0x95, 0xEB, 0x76, 0x9A, 0x1E,
+ 0x89, 0xEE, 0x44, 0x2D, 0xCA, 0xAF, 0x63, 0x32, 0x1B, 0xA6, 0x0C, 0x0A, 0xA0, 0x9D, 0x75, 0xFB,
+ 0x98, 0x68, 0x44, 0xC7, 0x31, 0x4E, 0xA4, 0x39, 0xE4, 0x74, 0xD6, 0xBB, 0xE4, 0x21, 0x6F, 0xAD,
+ 0x57, 0x54, 0x2C, 0x9F, 0x35, 0x01, 0xF1, 0x0A, 0xE1, 0x07, 0xF5, 0x61, 0x60, 0x0C, 0xF8, 0x9B,
+ 0x85, 0xE9, 0xC4, 0xBB, 0xBD, 0xEC, 0x45, 0x5B, 0xDD, 0x0B, 0xED, 0x0F, 0x55, 0x54, 0x7B, 0x50,
+ 0xDB, 0xC7, 0xAC, 0x05, 0x16, 0x5E, 0x55, 0x9C, 0x83, 0xB2, 0x6D, 0x95, 0x59, 0x3B, 0xCA, 0xB5,
+ 0x1B, 0x81, 0x4D, 0xC6, 0xC3, 0x8B, 0x20, 0x95, 0x5C, 0xE6, 0x03, 0xBF, 0xF8, 0xA7, 0x16, 0x8B,
+ 0x49, 0x63, 0xDD, 0x71, 0x15, 0x8B, 0x66, 0xA2, 0xAB, 0x47, 0x06, 0x74, 0xB5, 0xA8, 0xC4, 0x49,
+ 0x31, 0x4F, 0xFF, 0x08, 0x08, 0xB2, 0x2F, 0x9E, 0x6D, 0x13, 0xDD, 0xCB, 0x53, 0xB0, 0x47, 0x61,
+ 0x49, 0x47, 0x10, 0xFF, 0x87, 0xB0, 0x10, 0xD9, 0x21, 0xBD, 0x0F, 0x03, 0x98, 0x3B, 0x07, 0xC5,
+ 0xC4, 0x65, 0x39, 0x76, 0xCC, 0x44, 0x60, 0xCC, 0x79, 0x7B, 0x56, 0x37, 0xFE, 0x31, 0xBB, 0xFB,
+ 0x88, 0x82, 0xCD, 0xA4, 0xA0, 0xED, 0x2F, 0x0A, 0xF8, 0x74, 0x4A, 0x6F, 0xC3, 0xB9, 0x11, 0x76,
+ 0x0A, 0xEA, 0x0F, 0x1C, 0xFC, 0x6A, 0x49, 0x6A, 0x39, 0x32, 0xF8, 0x5C, 0x40, 0x1A, 0xA5, 0xED,
+ 0x72, 0x58, 0x6B, 0xD6, 0xA3, 0x53, 0x11, 0x82, 0xB8, 0x78, 0x85, 0x38, 0xD8, 0xFD, 0x18, 0x8B,
+ 0xDF, 0x0E, 0x62, 0xAF, 0x6B, 0xE4, 0x5F, 0x43, 0x55, 0x53, 0xB7, 0xAA, 0x43, 0x33, 0x89, 0xA8,
+ 0x67, 0x6E, 0xD8, 0x0A, 0xCC, 0x1F, 0x89, 0xDA, 0xA4, 0x16, 0xA2, 0xE0, 0xBA, 0xF5, 0x20, 0x10,
+ 0x05, 0x42, 0x00, 0xAD, 0x39, 0x49, 0xE9, 0x3D, 0x0A, 0xDF, 0x7E, 0x65, 0x14, 0xAF, 0xA8, 0x5E,
+ 0xD9, 0xC2, 0x16, 0x4F, 0x07, 0x18, 0xA0, 0xAD, 0x2C, 0xD8, 0x19, 0x6D, 0x11, 0x93, 0x63, 0xD7,
+ 0x6D, 0x05, 0xA9, 0xDB, 0xBA, 0x02, 0xC8, 0x10, 0x6A, 0xA5, 0x4F, 0x35, 0xC4, 0x35, 0x74, 0xC5,
+ 0xBF, 0x40, 0x71, 0x92, 0xDB, 0x26, 0xB6, 0xEB, 0xD8, 0x17, 0x34, 0x95, 0xEE, 0x3A, 0xF6, 0x30,
+ 0x48, 0x6C, 0xAD, 0x88, 0x82, 0x22, 0x48, 0x9B, 0xA3, 0xDE, 0x5A, 0x47, 0xEB, 0x80, 0x4C, 0x70,
+ 0xFF, 0x7B, 0x7C, 0xD9, 0xD7, 0x7E, 0x08, 0x74, 0x8F, 0xC5, 0x14, 0xBC, 0xC0, 0x4B, 0xF2, 0x3F,
+ 0xFF, 0x52, 0xBC, 0x23, 0xFB, 0x30, 0xA9, 0x2E, 0x7A, 0x93, 0x16, 0x73, 0x99, 0xF4, 0xE5, 0xB7,
+ 0x5F, 0x01, 0xDD, 0x96, 0x1A, 0xDB, 0x36, 0x74, 0xBE, 0xD4, 0xAB, 0xE2, 0x16, 0x24, 0xB2, 0x0E,
+ 0x36, 0x46, 0x36, 0x8C, 0x92, 0xB7, 0x79, 0x5E, 0x83, 0x37, 0x6A, 0x1A, 0x15, 0xCE, 0x6D, 0x61,
+ 0xEA, 0x9D, 0xE6, 0x65, 0x27, 0xD7, 0xB3, 0xF4, 0x6D, 0x55, 0xB8, 0xC0, 0x42, 0x4C, 0xE8, 0x36,
+ 0x1A, 0x0A, 0x21, 0x68, 0xB3, 0x17, 0xB1, 0xEA, 0x8D, 0x5C, 0x50, 0xBE, 0xC4, 0x49, 0xC5, 0x7D,
+ 0x19, 0x83, 0xF8, 0x02, 0x78, 0xAE, 0x3A, 0x5A, 0xB9, 0xA3, 0xA2, 0x0E, 0xCC, 0x10, 0x36, 0x49,
+ 0x84, 0x44, 0xA3, 0xFE, 0x5B, 0x56, 0x5C, 0x13, 0x43, 0xDD, 0x90, 0x29, 0x67, 0x9B, 0x3E, 0xD3,
+ 0x9B, 0x68, 0xA7, 0xAE, 0x52, 0x9C, 0x38, 0xF8, 0xF1, 0x10, 0xB7, 0x19, 0x75, 0x43, 0x27, 0x75,
+ 0x7F, 0x32, 0x40, 0x40, 0xDB, 0xD2, 0x71, 0x35, 0x45, 0x6C, 0x5B, 0x47, 0x84, 0x57, 0x49, 0x75,
+ 0xEB, 0x75, 0xDE, 0x93, 0xB2, 0xA7, 0x99, 0x65, 0xB1, 0x34, 0xA7, 0xB7, 0x67, 0x21, 0x95, 0x56,
+ 0x28, 0xF4, 0x16, 0xF6, 0xA5, 0x86, 0x04, 0x65, 0x44, 0x48, 0xDE, 0x02, 0xE4, 0x08, 0x6F, 0x57,
+ 0xA3, 0xE1, 0x45, 0x68, 0xC2, 0x9C, 0x96, 0xFD, 0xCB, 0x5B, 0x1D, 0xDF, 0xB5, 0x52, 0xAC, 0xB4,
+ 0xE4, 0x2D, 0x33, 0x76, 0x3C, 0x55, 0x8A, 0xD7, 0xD9, 0x65, 0xBD, 0x44, 0x27, 0x4F, 0x7B, 0x48,
+ 0x05, 0xD5, 0x3D, 0xB8, 0x87, 0x7E, 0x49, 0xE6, 0x99, 0x12, 0x27, 0xDA, 0x8E, 0xC9, 0x49, 0x4F,
+ 0xFC, 0x61, 0xD4, 0x8C, 0x63, 0xD1, 0x25, 0x8B, 0x09, 0xA1, 0x21, 0x96, 0xDC, 0xFF, 0x7A, 0x5F,
+ 0x99, 0xBE, 0xBC, 0x04, 0x0B, 0xD1, 0x0E, 0x44, 0xCE, 0x2C, 0xA1, 0x3C, 0x8F, 0x49, 0xD9, 0xA1,
+ 0xD4, 0x4D, 0x8E, 0x2B, 0x3E, 0xB4, 0x2F, 0x59, 0xDB, 0x71, 0x8A, 0xA5, 0x85, 0xD8, 0x31, 0x6A,
+ 0xD3, 0xEE, 0xBD, 0x32, 0x9D, 0xCA, 0x55, 0x19, 0x6A, 0x7F, 0x43, 0xE0, 0x5B, 0x91, 0x14, 0x4B,
+ 0x0C, 0xD2, 0xA1, 0xDA, 0xE8, 0x73, 0xF1, 0x24, 0xB9, 0xEA, 0x69, 0x77, 0xE4, 0x2A, 0x7D, 0xC4,
+ 0xD2, 0xB0, 0x7F, 0xAB, 0x28, 0xB1, 0xD0, 0x34, 0xF1, 0x89, 0x18, 0x57, 0xB0, 0x65, 0x50, 0x3D,
+ 0x5E, 0x81, 0xE5, 0xEE, 0xBF, 0xD1, 0x58, 0x1E, 0xC6, 0xA1, 0xCF, 0xD7, 0x31, 0x4A, 0x5D, 0x78,
+ 0xC6, 0xED, 0x7F, 0xCC, 0xC4, 0xBD, 0xFB, 0x6D, 0xF6, 0xEE, 0x26, 0xF7, 0xA6, 0xBE, 0x08, 0x6A,
+ 0xAD, 0x03, 0x24, 0xE0, 0x79, 0x24, 0xD0, 0xC1, 0xE9, 0x9A, 0xAF, 0x94, 0x3F, 0x10, 0x2E, 0xC8,
+ 0x93, 0x34, 0x08, 0x70, 0xFF, 0x2F, 0x32, 0x66, 0xAF, 0x19, 0xFD, 0xFE, 0xEC, 0x24, 0x44, 0x79,
+ 0x30, 0x41, 0x21, 0x49, 0xC0, 0xEF, 0x30, 0x59, 0xC5, 0x5B, 0xBA, 0x04, 0xAB, 0x03, 0x2F, 0x50,
+ 0x55, 0xF5, 0x48, 0x9F, 0x46, 0x98, 0xF3, 0xC1, 0xDC, 0xFE, 0x8F, 0xE9, 0x59, 0x9F, 0x49, 0xB6,
+ 0x6D, 0x53, 0x9F, 0x05, 0x3E, 0xED, 0xCE, 0xAE, 0x4F, 0xE8, 0x38, 0xE6, 0x0F, 0x55, 0x96, 0xD2,
+ 0x53, 0x72, 0x6C, 0x80, 0x78, 0xFB, 0x7C, 0xDD, 0xD0, 0x2E, 0x23, 0x1B, 0x65, 0x08, 0xF2, 0x76,
+ 0x7C, 0x34, 0x6A, 0xDC, 0xA0, 0xFB, 0xEC, 0xDF, 0x45, 0x1C, 0x53, 0x6B, 0xFD, 0x2C, 0x96, 0x3D,
+ 0xF4, 0x29, 0x4C, 0xF8, 0x92, 0x9E, 0xC4, 0x6B, 0x97, 0xCD, 0x16, 0x4D, 0xAB, 0xBC, 0x12, 0xED,
+ 0x32, 0x8C, 0xAA, 0x94, 0xEC, 0x3E, 0xF2, 0xEC, 0x24, 0x35, 0xD0, 0x97, 0xC9, 0x1E, 0x4C, 0x57,
+ 0xF3, 0xC5, 0x3D, 0xE9, 0x11, 0x6B, 0xB0, 0x66, 0xB4, 0x45, 0xE4, 0x4C, 0xE3, 0x5C, 0xFA, 0x24,
+ 0x0F, 0x70, 0x09, 0xB5, 0xF5, 0x5B, 0x80, 0xBD, 0x0B, 0x14, 0xB4, 0xF5, 0x9B, 0x51, 0x10, 0x6D,
+ 0xB8, 0x29, 0x6F, 0x74, 0x89, 0x89, 0x0E, 0x26, 0x08, 0xBF, 0x3E, 0xC2, 0xD5, 0x30, 0x1D, 0xAC,
+ 0x33, 0x19, 0x10, 0x32, 0x5E, 0xCB, 0x9A, 0x50, 0x52, 0xB4, 0x8F, 0xC8, 0xA1, 0x44, 0xB8, 0x2E,
+ 0x8B, 0x0D, 0x67, 0x1E, 0x8F, 0x31, 0x03, 0x99, 0x96, 0xB2, 0x76, 0xF2, 0xC7, 0xDF, 0xC3, 0x55,
+ 0x52, 0xE3, 0x17, 0xF1, 0xDF, 0x75, 0x60, 0xB0, 0x48, 0xF8, 0xC1, 0xDC, 0xB2, 0xFC, 0x8A, 0x17,
+ 0x6A, 0xED, 0x58, 0x33, 0x02, 0x24, 0x07, 0x86, 0xD4, 0xC0, 0xD9, 0x96, 0x3E, 0x05, 0x10, 0x78,
+ 0x5D, 0x69, 0x56, 0x7F, 0x1D, 0x08, 0x20, 0x49, 0x6E, 0x4F, 0x2A, 0x0B, 0xE6, 0xFD, 0x1E, 0x32,
+ 0x08, 0x07, 0x62, 0xA7, 0x9C, 0xD5, 0x34, 0xF0, 0x37, 0x13, 0x8E, 0x43, 0x10, 0x9D, 0xF9, 0x51,
+ 0x38, 0xBB, 0x5F, 0x61, 0x0A, 0x18, 0xD4, 0xA4, 0xFB, 0x60, 0x93, 0xED, 0x0A, 0x6F, 0x99, 0x89,
+ 0xD6, 0x63, 0x5C, 0x15, 0x6F, 0x93, 0xD8, 0xB1, 0xF2, 0x95, 0x11, 0xDE, 0x20, 0xA2, 0xEE, 0x1E,
+ 0x84, 0xDA, 0x3F, 0xF1, 0xE6, 0x10, 0xA4, 0xA8, 0x2F, 0xF1, 0x6E, 0x2A, 0x07, 0x4D, 0x8D, 0xE6,
+ 0x39, 0x96, 0x8A, 0xCC, 0x00, 0x33, 0x3F, 0x0C, 0x77, 0x5F, 0x2A, 0x85, 0x25, 0x29, 0x1E, 0xF6,
+ 0x65, 0x0F, 0x2D, 0x5E, 0x05, 0xBF, 0x3C, 0x0E, 0x0A, 0x17, 0x98, 0xB8, 0xA4, 0x49, 0x28, 0xA9,
+ 0x3B, 0xED, 0xCE, 0xF3, 0x7E, 0xB6, 0x38, 0x66, 0x0A, 0x31, 0x42, 0xC7, 0x2E, 0x40, 0x63, 0x16,
+ 0xA7, 0x80, 0xE8, 0x19, 0x3A, 0x61, 0xC7, 0x84, 0xBE, 0x89, 0x59, 0xD0, 0x23, 0xD9, 0xAA, 0x84,
+ 0x2A, 0x26, 0x53, 0x32, 0x0D, 0x6B, 0xBC, 0xBF, 0xAD, 0xE1, 0x03, 0x5F, 0x4A, 0xC7, 0x5F, 0x03,
+ 0x88, 0x0B, 0x8F, 0x7A, 0x53, 0xF8, 0xCC, 0x92, 0xAD, 0x57, 0x04, 0xD8, 0xC9, 0x9F, 0x51, 0xB7,
+ 0x9C, 0x6A, 0xAB, 0x45, 0x27, 0x0F, 0xC6, 0x21, 0xBE, 0x01, 0x43, 0x8F, 0x0C, 0x54, 0xDD, 0xAF,
+ 0xF6, 0xFB, 0x32, 0xA3, 0x95, 0xCC, 0x09, 0xBC, 0x98, 0xAD, 0xEF, 0xA8, 0xC5, 0x3F, 0x47, 0xF7,
+ 0x46, 0xBF, 0x2C, 0xF6, 0x05, 0xFB, 0xC8, 0xE8, 0x56, 0x2C, 0x50, 0x89, 0xDF, 0x14, 0x67, 0xE0,
+ 0xD4, 0x41, 0x12, 0x82, 0xD1, 0x94, 0x75, 0x00, 0x3E, 0xF9, 0x4F, 0xCB, 0x20, 0x9A, 0x62, 0x16,
+ 0xB4, 0x50, 0xB6, 0x63, 0x3A, 0x9C, 0x91, 0x3C, 0xBC, 0x0F, 0x6A, 0xB0, 0xE5, 0x2E, 0xD7, 0xEA,
+ 0xE7, 0x85, 0xA3, 0xD9, 0xB0, 0xAB, 0x8C, 0x83, 0x69, 0x62, 0x43, 0x56, 0x1E, 0xDD, 0xA1, 0x55,
+ 0x86, 0x7F, 0x1F, 0xCB, 0x1F, 0xA4, 0xF2, 0x57, 0xCE, 0xB0, 0xA2, 0x1D, 0xFA, 0x17, 0x43, 0x46,
+ 0xF7, 0xFD, 0xA3, 0x72, 0xFC, 0x5C, 0xBC, 0x96, 0xA9, 0xB3, 0x39, 0xB9, 0x54, 0xD3, 0x75, 0x11,
+ 0x78, 0xAD, 0x05, 0x61, 0x0A, 0xB6, 0x7E, 0x94, 0xCB, 0x36, 0x2F, 0x00, 0xEA, 0xCA, 0xEA, 0x5F,
+ 0x09, 0xE8, 0xDF, 0x98, 0xA0, 0xFE, 0x8B, 0x9A, 0xCB, 0x5E, 0xFC, 0x4E, 0xD8, 0x30, 0x91, 0x97,
+ 0x95, 0x92, 0x9E, 0x55, 0xAB, 0x45, 0x4A, 0x0F, 0xDD, 0xFF, 0x73, 0x4E, 0x0C, 0xC3, 0x62, 0x13,
+ 0x3A, 0xC9, 0xB5, 0xEF, 0x85, 0xD1, 0x4D, 0xB3, 0x7B, 0xD5, 0xA5, 0x33, 0xAF, 0x9D, 0xBC, 0x47,
+ 0xE3, 0x1E, 0xC8, 0x97, 0xF4, 0xAF, 0xE0, 0x96, 0x82, 0x8D, 0x3E, 0xD9, 0xBE, 0x1E, 0xDB, 0x04,
+ 0xA6, 0x38, 0xE7, 0x6F, 0x8F, 0xC1, 0xC7, 0x67, 0x0F, 0x50, 0x42, 0xCE, 0x1F, 0x42, 0xCA, 0x2C,
+ 0x52, 0xA0, 0xEC, 0xB2, 0x02, 0x56, 0x37, 0x3B, 0x95, 0x70, 0x0F, 0x03, 0x33, 0x61, 0xE7, 0xDD,
+ 0x6A, 0x0A, 0x0A, 0x27, 0x8C, 0x0E, 0x18, 0xF0, 0x39, 0x83, 0x87, 0x12, 0x18, 0x2B, 0x53, 0xF4,
+ 0x41, 0x01, 0x52, 0xCF, 0xC7, 0xBE, 0x4A, 0x1B, 0x3B, 0x77, 0xCD, 0xF2, 0xE1, 0x4D, 0xC5, 0x78,
+ 0x4E, 0x93, 0x9B, 0xBD, 0xD6, 0xFA, 0xBF, 0x60, 0x48, 0x76, 0x19, 0x3F, 0x22, 0xAB, 0xA8, 0x84,
+ 0xA0, 0xA7, 0x9E, 0x40, 0xE3, 0xA4, 0x86, 0xF1, 0x4F, 0x35, 0x7F, 0xE9, 0xAD, 0x6F, 0x43, 0x62,
+ 0x4E, 0x9B, 0x91, 0xD7, 0x3B, 0x6C, 0x1A, 0x51, 0x67, 0xDB, 0x18, 0x51, 0x9C, 0x8E, 0xB0, 0xB2,
+ 0xE2, 0x45, 0xB5, 0x48, 0x11, 0x03, 0x5C, 0xF3, 0x3A, 0xCD, 0x43, 0x14, 0x40, 0xFC, 0x72, 0x8E,
+ 0x44, 0xF0, 0xE6, 0xF7, 0x69, 0xD3, 0xC2, 0xF9, 0x5A, 0xC7, 0x68, 0xB3, 0xA0, 0x74, 0x94, 0x12,
+ 0xEA, 0x5F, 0xF4, 0x93, 0x2A, 0x9B, 0x71, 0xF5, 0x19, 0x87, 0x98, 0xC2, 0x04, 0xC0, 0x52, 0xC7,
+ 0x2C, 0x26, 0xC1, 0x93, 0xDD, 0xB1, 0xB2, 0xA8, 0x68, 0xF7, 0xE3, 0xCE, 0x20, 0x8E, 0x02, 0xBF,
+ 0x05, 0x08, 0xBD, 0x53, 0xD1, 0x31, 0x30, 0xD7, 0xF2, 0x7B, 0x15, 0xCB, 0x10, 0x47, 0x7B, 0x66,
+ 0xEE, 0x63, 0x44, 0x21, 0xAD, 0xD7, 0xDC, 0xD9, 0x61, 0xCB, 0xC7, 0x71, 0x87, 0x06, 0xEB, 0xE0,
+ 0x6B, 0x7D, 0x4E, 0x01, 0x05, 0x0A, 0xDC, 0x8F, 0xF0, 0x40, 0xA7, 0xDF, 0x18, 0xD6, 0x71, 0x2C,
+ 0x2E, 0x81, 0x05, 0x95, 0x48, 0x26, 0x52, 0xBB, 0x9F, 0x7D, 0xD0, 0x51, 0x28, 0xA5, 0x7F, 0x9F,
+ 0xC5, 0x38, 0x39, 0x3A, 0xDE, 0x1E, 0x53, 0x2F, 0x08, 0x19, 0xE0, 0x56, 0x83, 0x28, 0xB2, 0x5C,
+ 0xB4, 0xEF, 0x35, 0x90, 0xE0, 0xE0, 0x54, 0xCC, 0xE6, 0xA7, 0xB4, 0x83, 0x5E, 0xC0, 0xC4, 0xBE,
+ 0x46, 0x33, 0x14, 0xB1, 0x09, 0xBB, 0xD2, 0xB3, 0xDB, 0xE9, 0xAC, 0x62, 0xEF, 0x52, 0x42, 0x82,
+ 0x5D, 0x99, 0x8E, 0xFD, 0x28, 0xA8, 0xB6, 0xAA, 0xC6, 0x68, 0x58, 0xDF, 0x87, 0x10, 0x32, 0xD9,
+ 0xB1, 0xA7, 0x49, 0x76, 0x2D, 0x40, 0xDD, 0x6D, 0xB3, 0x67, 0x4C, 0x59, 0xC4, 0x5C, 0x66, 0x74,
+ 0xBE, 0x13, 0xC5, 0x19, 0x92, 0x23, 0x3F, 0x81, 0x74, 0xB1, 0x9A, 0x65, 0x5D, 0xDD, 0x24, 0x7E,
+ 0x6F, 0x3B, 0xF1, 0x45, 0x56, 0x9D, 0x66, 0xB2, 0x8B, 0xD6, 0x89, 0xE3, 0xF7, 0xD7, 0xDD, 0x44,
+ 0x6F, 0x41, 0x52, 0x43, 0x66, 0xE0, 0xB1, 0x18, 0x37, 0xFE, 0xE4, 0x95, 0x26, 0x71, 0x29, 0x7D,
+ 0xC5, 0x7A, 0x4A, 0x6B, 0xB0, 0xB1, 0x3B, 0xF2, 0xFA, 0x67, 0x1D, 0x57, 0xBE, 0x51, 0xF0, 0x76,
+ 0x37, 0x45, 0x65, 0xF3, 0x30, 0x75, 0x0C, 0x26, 0xD5, 0x6E, 0x7A, 0xBD, 0xB5, 0x31, 0xE7, 0x30,
+ 0x14, 0x50, 0x64, 0xB8, 0x3C, 0x89, 0x43, 0xF1, 0x32, 0x7C, 0x45, 0xE3, 0xD8, 0x52, 0xF2, 0x00,
+ 0xD4, 0x8D, 0x76, 0xD4, 0xE6, 0x4C, 0x6D, 0x98, 0x7D, 0x56, 0x37, 0x15, 0x1B, 0x0F, 0x75, 0x66,
+ 0x88, 0x29, 0xDF, 0xFB, 0xBF, 0x99, 0x51, 0x46, 0xDA, 0x20, 0xB4, 0xD1, 0xB8, 0x0D, 0xE1, 0xA8,
+ 0x82, 0x2C, 0x69, 0x7C, 0x93, 0xE7, 0x51, 0x3E, 0x0F, 0x25, 0xDE, 0x25, 0x2F, 0x8D, 0x28, 0x4C,
+ 0xAF, 0x35, 0x4F, 0x1C, 0x6B, 0x4B, 0x43, 0xC9, 0x82, 0xAA, 0x5C, 0x31, 0xF6, 0x4D, 0x9F, 0x3B,
+ 0x17, 0x25, 0x21, 0x0D, 0xE4, 0x81, 0x49, 0xD3, 0x02, 0xED, 0xEE, 0x73, 0xCD, 0x54, 0xBD, 0xF1,
+ 0x0E, 0x31, 0x5E, 0x49, 0x13, 0xFE, 0xAA, 0xFF, 0x5D, 0x77, 0x65, 0x3D, 0x9A, 0x62, 0xDE, 0x52,
+ 0x4F, 0x4E, 0x5C, 0xA6, 0xA2, 0xEA, 0xA0, 0x85, 0x69, 0x6F, 0x64, 0x30, 0x71, 0xD7, 0xE0, 0x5F,
+ 0xF0, 0xDF, 0xB7, 0xFC, 0x93, 0x08, 0xDA, 0x58, 0xAA, 0x53, 0x10, 0x3E, 0x2F, 0x47, 0x48, 0x11,
+ 0xC7, 0x02, 0xB1, 0xB0, 0x25, 0x46, 0x83, 0x88, 0x5D, 0xF8, 0xBB, 0x43, 0x00, 0x91, 0x84, 0x8E,
+ 0x80, 0xF1, 0xE8, 0xE8, 0x90, 0xE4, 0xC8, 0x4A, 0x11, 0xA0, 0x92, 0xAA, 0x7E, 0xA5, 0xCA, 0xA7,
+ 0xB6, 0x22, 0x9A, 0xB1, 0x55, 0x8E, 0x6D, 0xE5, 0x47, 0xD6, 0x2E, 0x58, 0x42, 0xCB, 0xC4, 0x19,
+ 0xB5, 0xFF, 0xAB, 0xB1, 0x8F, 0x2A, 0x81, 0x94, 0x19, 0x91, 0xDA, 0x3A, 0x3C, 0xBB, 0x74, 0x8E,
+ 0x84, 0x07, 0xD3, 0x3B, 0x6A, 0x5E, 0xD0, 0x4D, 0xD1, 0xA0, 0xD6, 0x5B, 0x32, 0x7F, 0x92, 0xCC,
+ 0x5E, 0xDF, 0xCE, 0x88, 0xCD, 0x2B, 0x6A, 0x4B, 0x3D, 0x68, 0x75, 0x7A, 0xB0, 0xF1, 0x36, 0x1B,
+ 0xCA, 0x96, 0xFB, 0xE3, 0x77, 0x9B, 0x38, 0x83, 0x2E, 0xDD, 0x4C, 0x53, 0x35, 0x85, 0xC2, 0xE3,
+ 0xCF, 0xA2, 0xF3, 0x85, 0x44, 0xA1, 0xB2, 0x9B, 0x0F, 0xE9, 0x2A, 0x82, 0xD5, 0xB3, 0xC3, 0xF1,
+ 0x2B, 0xE8, 0x1B, 0x2C, 0xFF, 0x7D, 0x3C, 0xC9, 0x24, 0x24, 0x35, 0xC8, 0x43, 0x10, 0x2A, 0x92,
+ 0x53, 0x29, 0x1D, 0x71, 0xB8, 0xFD, 0x7E, 0x18, 0x9B, 0xBA, 0x5F, 0x43, 0x9F, 0x8C, 0x35, 0xB6,
+ 0x0D, 0x93, 0xC1, 0xA7, 0xB9, 0x2A, 0x05, 0xEB, 0x59, 0xB4, 0xA1, 0x94, 0x6C, 0x8B, 0xD3, 0x82,
+ 0xD3, 0xFF, 0xA7, 0x36, 0x8C, 0x79, 0x8D, 0xB9, 0x11, 0x04, 0x78, 0x49, 0xA8, 0xBE, 0x76, 0x7C,
+ 0xAE, 0x9C, 0xD8, 0x26, 0x4C, 0x12, 0x07, 0x45, 0xE3, 0x39, 0x7A, 0xED, 0xFD, 0x1E, 0xC1, 0xC2,
+ 0xBB, 0x90, 0xB2, 0xA7, 0x7A, 0xDC, 0x65, 0x4E, 0x99, 0x73, 0x80, 0xF8, 0x9B, 0x6F, 0x93, 0x76,
+ 0x18, 0x7D, 0x69, 0x75, 0xA9, 0xB0, 0x42, 0xD9, 0xEB, 0x21, 0xF5, 0x0B, 0x33, 0x47, 0xDD, 0xB4,
+ 0xC1, 0x36, 0xDA, 0x6B, 0x82, 0xE1, 0x5B, 0x21, 0xA1, 0xB7, 0x8A, 0x29, 0x73, 0x64, 0x06, 0xC9,
+ 0x0A, 0x67, 0x82, 0xCD, 0xD2, 0xC9, 0x5C, 0x62, 0x75, 0x03, 0x1A, 0xD7, 0x32, 0xFE, 0x84, 0x4E,
+ 0xB6, 0xCF, 0x97, 0x0D, 0x6C, 0x12, 0x0A, 0x57, 0xC3, 0xF2, 0x87, 0x6C, 0x1D, 0x05, 0x39, 0x0C,
+ 0xC9, 0xDB, 0xA8, 0xE5, 0x2E, 0x6A, 0xE0, 0xAB, 0xD1, 0x1C, 0xCC, 0x16, 0xFE, 0xB7, 0x49, 0x3C,
+ 0xC0, 0xCB, 0x43, 0x63, 0x74, 0x89, 0xD8, 0xB6, 0xC0, 0x69, 0x80, 0xF4, 0x8E, 0x84, 0xE0, 0x10,
+ 0x61, 0x3E, 0xF4, 0x04, 0xB5, 0x04, 0x37, 0xA4, 0x23, 0x33, 0xD8, 0x3C, 0x35, 0x26, 0xC9, 0xF6,
+ 0x06, 0x85, 0x5B, 0xC2, 0x8F, 0x53, 0xBA, 0x46, 0xDE, 0x4C, 0x7A, 0xCD, 0x8F, 0xF9, 0x31, 0x8A,
+ 0x21, 0xD9, 0xDF, 0x0C, 0x2A, 0xC4, 0xF0, 0x1F, 0xF1, 0x37, 0xD1, 0x1F, 0xA5, 0x21, 0x27, 0xE8,
+ 0x2B, 0xA6, 0xB6, 0x89, 0x34, 0xF4, 0xF3, 0x7C, 0x24, 0x0E, 0xA6, 0xDB, 0xB3, 0x9D, 0x60, 0x29,
+ 0x3A, 0xC7, 0xD6, 0xAE, 0xE7, 0x95, 0xBF, 0x30, 0x11, 0xA4, 0x77, 0xCC, 0x7C, 0xE7, 0x96, 0x7E,
+ 0xAC, 0xFC, 0xFA, 0xFD, 0x41, 0xAA, 0x0C, 0x6C, 0x53, 0x56, 0xB6, 0x55, 0x7E, 0xC3, 0xB4, 0x82,
+ 0x4B, 0xC0, 0x4A, 0xFE, 0xF7, 0x5F, 0xD1, 0xAB, 0xD8, 0x89, 0x00, 0x44, 0xAA, 0xB1, 0x62, 0xEF,
+ 0xD6, 0x7F, 0x1B, 0x7B, 0x22, 0x48, 0xEA, 0x00, 0x53, 0x49, 0xA7, 0xCD, 0xA6, 0x7B, 0x61, 0xE3,
+ 0xDD, 0xFC, 0xBF, 0xB7, 0xB0, 0xCB, 0xAE, 0xAC, 0xDE, 0x9B, 0x98, 0xC8, 0x86, 0x7C, 0xB2, 0xFB,
+ 0xED, 0x75, 0xA4, 0x30, 0xBF, 0x8A, 0x52, 0x95, 0x7E, 0xCF, 0x4B, 0x28, 0xF2, 0xA2, 0x2F, 0xB9,
+ 0xA2, 0x24, 0x93, 0xA3, 0x84, 0xCB, 0x2C, 0xC0, 0x7D, 0x2F, 0x6E, 0x35, 0x33, 0x1B, 0x0F, 0x6E,
+ 0xFF, 0x32, 0x92, 0x09, 0x17, 0x31, 0xE4, 0xFC, 0x2C, 0x6A, 0x93, 0x1B, 0xFA, 0xA4, 0x87, 0x04,
+ 0x9D, 0x1E, 0xCC, 0xC1, 0xD4, 0x40, 0x83, 0x21, 0xB3, 0x5F, 0x3F, 0x68, 0x9C, 0x37, 0x68, 0x47,
+ 0x6A, 0x21, 0x98, 0xBC, 0x95, 0x50, 0xBE, 0xF7, 0xD4, 0x72, 0x20, 0x70, 0x12, 0x4F, 0xCB, 0x77,
+ 0xBF, 0x68, 0x5A, 0xCE, 0xB5, 0x13, 0xC6, 0x25, 0x30, 0x75, 0xA4, 0xF6, 0xE9, 0xDC, 0xF5, 0xC2,
+ 0xB0, 0x57, 0x55, 0xC3, 0x69, 0xE5, 0xF1, 0xB9, 0xAE, 0x55, 0x69, 0x56, 0x5A, 0xBC, 0xCE, 0x0F,
+ 0x11, 0x32, 0x2A, 0xE9, 0x7E, 0x40, 0x40, 0xCC, 0xDD, 0x04, 0x62, 0x8B, 0x3B, 0x57, 0xE5, 0x45,
+ 0xCB, 0xEE, 0xF0, 0x3D, 0x6A, 0xAC, 0xDD, 0x83, 0x7C, 0x2F, 0x66, 0x9A, 0x6C, 0x3B, 0xD1, 0x80,
+ 0x85, 0xE6, 0xE7, 0xEA, 0xE0, 0x89, 0x19, 0x0E, 0x5A, 0xDE, 0x7E, 0x8F, 0x6C, 0x05, 0xB3, 0xA5,
+ 0x89, 0x08, 0x45, 0x60, 0xA5, 0xE0, 0xB8, 0xD1, 0x7D, 0x45, 0xB6, 0x23, 0x19, 0x84, 0x6A, 0xC2,
+ 0x33, 0xD2, 0xD8, 0x9A, 0x87, 0xD0, 0xF4, 0xED, 0x06, 0x11, 0x08, 0xF1, 0xF2, 0x92, 0xA5, 0x4D,
+ 0xF6, 0xE7, 0xBF, 0x8E, 0x3D, 0x01, 0x60, 0x50, 0xC0, 0x4F, 0xBB, 0x37, 0xAA, 0x8E, 0xE4, 0x81,
+ 0x9F, 0xBD, 0xDD, 0xA0, 0xA1, 0x00, 0xD8, 0x5C, 0x55, 0xB0, 0xCF, 0x39, 0xEF, 0xA0, 0xE1, 0x4F,
+ 0xA7, 0x5D, 0x46, 0x85, 0x11, 0x98, 0x8F, 0x9E, 0xEB, 0x16, 0x0D, 0xF7, 0x0F, 0xEE, 0x9F, 0xBD,
+ 0x22, 0x87, 0x0B, 0x10, 0x0B, 0x9E, 0x4D, 0xC1, 0x5F, 0x82, 0xFA, 0xED, 0xCC, 0xAC, 0xB4, 0x62,
+ 0xCA, 0x57, 0x8B, 0xE7, 0x60, 0x5B, 0xCF, 0x9B, 0x78, 0xFB, 0x8D, 0x10, 0xCD, 0x33, 0x68, 0x19,
+ 0x25, 0x00, 0xCB, 0xD1, 0x13, 0xB4, 0xA3, 0x21, 0x07, 0x5C, 0xED, 0xC5, 0xBB, 0xFA, 0x60, 0x8C,
+ 0xB7, 0xD4, 0x41, 0x39, 0x2D, 0x9E, 0x69, 0x3E, 0xC8, 0x25, 0x34, 0xA4, 0x5B, 0x52, 0xB3, 0xBD,
+ 0x33, 0xC9, 0x74, 0x7B, 0x7D, 0x46, 0x61, 0x9D, 0x9F, 0x28, 0xBC, 0xE6, 0x53, 0xD3, 0xEA, 0x5E,
+ 0xEF, 0xE3, 0x2E, 0xE8, 0x76, 0x68, 0x75, 0x80, 0x98, 0x78, 0x9F, 0x20, 0xF8, 0x50, 0xB7, 0xA1,
+ 0x88, 0x0C, 0x0B, 0xD6, 0xF4, 0x84, 0x7C, 0xA5, 0x7D, 0xEE, 0xBB, 0xD6, 0x47, 0x30, 0x89, 0x5C,
+ 0xF6, 0xF3, 0x9F, 0x83, 0x56, 0xB5, 0x47, 0xCD, 0x9F, 0xD6, 0x50, 0x7A, 0xD2, 0xE5, 0x3C, 0x36,
+ 0x36, 0xBE, 0xBB, 0xAD, 0xB5, 0xDE, 0x92, 0x9F, 0xAF, 0x06, 0x5E, 0x3E, 0x36, 0xB9, 0xC2, 0x53,
+ 0xCA, 0x35, 0x21, 0x3E, 0x4F, 0x83, 0x4C, 0x6B, 0x5E, 0x80, 0x98, 0x05, 0x49, 0xE7, 0x17, 0xC6,
+ 0x6E, 0x29, 0x41, 0xF1, 0x51, 0xB6, 0xDF, 0x97, 0x9C, 0x37, 0xEB, 0xD1, 0x28, 0x57, 0xDD, 0xD5,
+ 0x64, 0x93, 0x31, 0x80, 0x67, 0x67, 0x4B, 0xF3, 0x08, 0x38, 0x6D, 0x8A, 0x0D, 0x50, 0x5D, 0x22,
+ 0x03, 0xF2, 0x5F, 0x79, 0x98, 0x87, 0x2D, 0x2D, 0x32, 0x91, 0xD9, 0x7C, 0x07, 0x8B, 0xA5, 0x83,
+ 0xC0, 0x89, 0xE1, 0x9D, 0x78, 0xF5, 0xB8, 0x88, 0x5F, 0xF6, 0x5C, 0x35, 0x13, 0x2B, 0x07, 0xEA,
+ 0xAB, 0xED, 0x98, 0x1D, 0xC2, 0x51, 0x56, 0x41, 0x90, 0xA3, 0x0D, 0xB5, 0x96, 0xCB, 0x34, 0x1C,
+ 0x6E, 0x43, 0x8F, 0xBF, 0xB5, 0x6F, 0x5D, 0x5E, 0x94, 0x99, 0xC1, 0xD9, 0x12, 0x0F, 0x1D, 0x1E,
+ 0x16, 0x01, 0xA7, 0x71, 0xB1, 0xF5, 0x49, 0xE3, 0x77, 0x3D, 0x02, 0xCF, 0xE2, 0x7C, 0x96, 0x77,
+ 0x8B, 0xA8, 0x01, 0xFD, 0xC0, 0xB5, 0x58, 0x6E, 0xA2, 0x57, 0xFF, 0x31, 0x20, 0x5D, 0x90, 0x59,
+ 0x55, 0x42, 0xB5, 0x5E, 0x8F, 0x4C, 0x23, 0x55, 0x23, 0x21, 0x4A, 0x79, 0x30, 0x9C, 0xF8, 0xB8,
+ 0xD4, 0x5F, 0x23, 0x66, 0xF4, 0x01, 0x96, 0x43, 0xF8, 0x2A, 0x20, 0xFD, 0x04, 0x7E, 0xE4, 0xC3,
+ 0x4B, 0xC3, 0x57, 0x85, 0x61, 0x15, 0x44, 0x7D, 0x8B, 0xDC, 0x29, 0xA4, 0xDB, 0xE6, 0x2D, 0xCC,
+ 0x3E, 0x12, 0x03, 0xEB, 0xC3, 0xB9, 0xDC, 0xE0, 0x13, 0x74, 0x41, 0x2B, 0xF6, 0xEF, 0x67, 0xDD,
+ 0x1D, 0xEE, 0x8B, 0x07, 0x30, 0x68, 0xF8, 0x56, 0x64, 0x2B, 0x4E, 0xB1, 0x19, 0xE3, 0xE7, 0xBE,
+ 0x72, 0xD9, 0x50, 0x69, 0x3C, 0x21, 0xDA, 0xEE, 0x63, 0x89, 0x5D, 0xB3, 0x79, 0xD8, 0xEF, 0x26,
+ 0xE2, 0x1F, 0x66, 0x17, 0x4C, 0x70, 0xCF, 0xDF, 0xC0, 0x9F, 0xE9, 0x8F, 0xA2, 0x88, 0xDB, 0xD2,
+ 0x7F, 0xDF, 0x32, 0xEA, 0xEF, 0x83, 0x4F, 0xC3, 0x6F, 0x7F, 0x0D, 0x4F, 0x63, 0x00, 0xBA, 0xDD,
+ 0x60, 0x37, 0x21, 0x02, 0xAF, 0x99, 0xE6, 0xDC, 0x12, 0xF5, 0x4F, 0xCE, 0x9A, 0xC2, 0x19, 0xB9,
+ 0xB2, 0x9E, 0x87, 0x83, 0xA8, 0x06, 0x56, 0x7D, 0xB7, 0x7F, 0x73, 0x38, 0xDC, 0xE9, 0xC7, 0x75,
+ 0x63, 0xCA, 0x3C, 0x07, 0x06, 0x6A, 0x9E, 0x97, 0x14, 0x2E, 0xED, 0x40, 0x58, 0x3D, 0x9F, 0x52,
+ 0x8F, 0x52, 0x40, 0x3A, 0x2A, 0xBB, 0x3B, 0xE1, 0x8B, 0xEA, 0xD4, 0xCD, 0xC0, 0xE9, 0x68, 0x15,
+ 0x53, 0x93, 0x59, 0xC1, 0x3A, 0x50, 0xD6, 0x98, 0xF5, 0x4E, 0xBC, 0x87, 0x3E, 0x3A, 0x2E, 0xB0,
+ 0x03, 0x88, 0x40, 0x5B, 0x6A, 0x9B, 0x6D, 0x3D, 0xCB, 0x6C, 0x1B, 0x0A, 0xAA, 0x7F, 0xBC, 0xE1,
+ 0x56, 0xF0, 0x62, 0x09, 0xC4, 0x04, 0xFB, 0xE2, 0x61, 0xAA, 0xDE, 0x73, 0xF3, 0x37, 0xA9, 0x49,
+ 0x98, 0x29, 0x05, 0x67, 0x7C, 0xB8, 0x78, 0xFE, 0xD6, 0xF8, 0xBF, 0x59, 0xD4, 0xF5, 0x20, 0x37,
+ 0xCC, 0x4C, 0x5A, 0xC5, 0x26, 0x17, 0x34, 0x8D, 0xB0, 0x30, 0x79, 0x92, 0x64, 0xAD, 0xFB, 0x6D,
+ 0x73, 0xD9, 0xD2, 0x5D, 0x4C, 0x52, 0x86, 0xB2, 0x4A, 0xE5, 0xDE, 0xF0, 0x58, 0x72, 0xE5, 0xB5,
+ 0xC3, 0x83, 0xD4, 0xFC, 0x7E, 0x2F, 0x2D, 0xAD, 0x90, 0x36, 0xCC, 0xD6, 0x49, 0x93, 0xFE, 0xA0,
+ 0x7A, 0xED, 0x8B, 0x85, 0x73, 0x65, 0x1A, 0xAD, 0xB2, 0xD5, 0xA1, 0x86, 0x8A, 0x43, 0x81, 0xD9,
+ 0x4F, 0xA0, 0x09, 0x4B, 0xBF, 0x2C, 0xBB, 0x12, 0x5C, 0xFF, 0xB6, 0x56, 0x26, 0x83, 0x98, 0x7A,
+ 0x31, 0x10, 0x72, 0x8F, 0x4F, 0x38, 0x75, 0xA4, 0x5D, 0xC3, 0x49, 0x88, 0x0B, 0x15, 0x86, 0x2D,
+ 0x30, 0x2F, 0x8B, 0xAD, 0xC2, 0x5B, 0xBE, 0xC7, 0x79, 0x04, 0x6A, 0x36, 0x2F, 0xD8, 0x27, 0xE2,
+ 0xD9, 0x58, 0x2A, 0x0A, 0xA2, 0x14, 0xCB, 0x59, 0x0F, 0xDC, 0x3C, 0x7D, 0x57, 0x0F, 0x47, 0x53,
+ 0x1E, 0x3E, 0x99, 0x6E, 0xF6, 0x3B, 0xE8, 0xCF, 0xE3, 0x13, 0x57, 0x14, 0xF5, 0x7C, 0x2F, 0x8B,
+ 0xD8, 0x83, 0x3B, 0x1A, 0x7D, 0x15, 0x0A, 0x8A, 0x67, 0x0F, 0x18, 0x21, 0x09, 0x8E, 0xE7, 0x4E,
+ 0xC2, 0x66, 0xF9, 0x53, 0x82, 0x24, 0x58, 0xF8, 0x3E, 0x41, 0x34, 0x71, 0x8E, 0x99, 0x87, 0x27,
+ 0xB9, 0x1F, 0x8A, 0xAD, 0x56, 0x56, 0x2D, 0x49, 0x00, 0xA4, 0xB2, 0x89, 0xFB, 0x8F, 0x50, 0x11,
+ 0xEB, 0x17, 0x6A, 0x51, 0x39, 0xD0, 0x23, 0x1F, 0x76, 0xD6, 0xF8, 0x41, 0x5B, 0x09, 0xDF, 0xEA,
+ 0x8B, 0x4E, 0x86, 0x56, 0x12, 0x56, 0x99, 0x8D, 0x1D, 0xC2, 0x15, 0x7C, 0x3C, 0x27, 0xAB, 0x6A,
+ 0x48, 0x5A, 0x14, 0x25, 0x1E, 0x69, 0x91, 0x03, 0x26, 0xF3, 0x87, 0xA5, 0x66, 0x14, 0x9E, 0xEA,
+ 0x78, 0xC7, 0xEC, 0x9B, 0x0A, 0x40, 0x56, 0x94, 0x78, 0x5A, 0x9D, 0x99, 0xAD, 0xD3, 0xFB, 0xC9,
+ 0x5D, 0xCE, 0x05, 0xAC, 0x6E, 0x95, 0x57, 0x6C, 0x4E, 0x04, 0xB5, 0xE4, 0x3B, 0xEF, 0x82, 0x70,
+ 0x1B, 0xC4, 0x38, 0x63, 0x0C, 0x66, 0x47, 0xB9, 0xDF, 0x4B, 0xF5, 0xB1, 0xAC, 0xB9, 0xB2, 0xB5,
+ 0xF1, 0xF2, 0xE0, 0x67, 0x39, 0x62, 0x1C, 0x0A, 0x4F, 0x10, 0xFA, 0xDA, 0xEC, 0x5A, 0xBD, 0x55,
+ 0x82, 0xB9, 0x5F, 0xB9, 0x1C, 0x7B, 0xC3, 0x88, 0x7F, 0xB6, 0x4A, 0x41, 0xA2, 0x02, 0xF2, 0x3E,
+ 0xE0, 0x0F, 0x1C, 0xD6, 0xC9, 0xB5, 0x6F, 0xFB, 0xD7, 0x16, 0x49, 0xB2, 0x14, 0xC9, 0x2C, 0x2B,
+ 0xC6, 0x45, 0x19, 0x84, 0x17, 0x87, 0xE1, 0xDC, 0x49, 0x48, 0x0B, 0x65, 0x47, 0x2B, 0xFE, 0x7C,
+ 0x75, 0x30, 0xFA, 0xB9, 0x40, 0x1C, 0xC2, 0xA2, 0x10, 0x43, 0xDE, 0x5E, 0xF1, 0x4D, 0xCE, 0x56,
+ 0xA9, 0x59, 0x5C, 0x7C, 0x37, 0x9A, 0x17, 0x8A, 0xEA, 0x2D, 0xFF, 0x32, 0xF7, 0xB7, 0x01, 0xEE,
+ 0xB6, 0xC6, 0xA1, 0xD7, 0xBB, 0x79, 0x88, 0x2B, 0xC6, 0x52, 0x7E, 0xCD, 0x75, 0x19, 0x88, 0xAB,
+ 0x51, 0x67, 0xFC, 0x5C, 0x11, 0x79, 0x49, 0x66, 0xE8, 0xE6, 0x48, 0x6B, 0x79, 0x0E, 0x35, 0x93,
+ 0x1E, 0xD4, 0x1E, 0xD7, 0xC8, 0x7A, 0xCE, 0x24, 0xF5, 0x01, 0x69, 0x16, 0xC1, 0xFB, 0x8B, 0x36,
+ 0x9E, 0x4F, 0x42, 0x0D, 0x7C, 0xB5, 0x8E, 0xDA, 0x2A, 0x07, 0x7D, 0xFF, 0xB3, 0x19, 0xB6, 0x33,
+ 0xF4, 0x2B, 0x25, 0xED, 0x7E, 0x21, 0xA2, 0x9A, 0x26, 0x0E, 0x0A, 0xE0, 0x98, 0x1F, 0xAD, 0x79,
+ 0xA6, 0x4C, 0xF6, 0x2D, 0xD1, 0xE2, 0x2C, 0x4B, 0xEA, 0xAB, 0x5E, 0xEB, 0x9E, 0xB0, 0xF4, 0xB5,
+ 0xFC, 0xCC, 0x68, 0xFF, 0x35, 0x1D, 0xBF, 0xEE, 0x3B, 0x22, 0xC1, 0x95, 0x4C, 0x39, 0x55, 0xE8,
+ 0xEA, 0x80, 0xD4, 0x9E, 0x9C, 0x8D, 0xFF, 0x22, 0x60, 0xC6, 0x56, 0x96, 0x86, 0x47, 0x3C, 0xA5,
+ 0xB8, 0xD5, 0x35, 0x97, 0xF7, 0x35, 0xC7, 0x08, 0x47, 0xE1, 0xAD, 0xC5, 0x28, 0x54, 0xCE, 0xF3,
+ 0xA9, 0x6A, 0x08, 0x38, 0xE9, 0x42, 0x6A, 0x2E, 0xC5, 0xC0, 0xA0, 0xA4, 0x62, 0x7D, 0xE0, 0x6F,
+ 0x56, 0x25, 0xEE, 0x90, 0xD9, 0x17, 0x05, 0x1A, 0x0C, 0xAB, 0xD3, 0xD2, 0xBA, 0xDE, 0xAB, 0xBA,
+ 0x8F, 0x85, 0x3E, 0xAF, 0x2E, 0xA1, 0x53, 0x02, 0x8A, 0x55, 0x91, 0x88, 0xB8, 0x92, 0x3E, 0x11,
+ 0xEF, 0xB4, 0x2B, 0x81, 0xE3, 0xCD, 0x0D, 0xEB, 0xC2, 0x5E, 0x34, 0xCB, 0x27, 0x56, 0x79, 0x69,
+ 0xD8, 0x3A, 0xC3, 0x91, 0x94, 0x47, 0xE9, 0xFC, 0x98, 0xA6, 0x74, 0x7E, 0xBE, 0x8D, 0x09, 0xB6,
+ 0x5C, 0x46, 0xA4, 0xD1, 0x7B, 0xF8, 0x78, 0x33, 0x88, 0xEF, 0xD6, 0x56, 0x66, 0x8B, 0x27, 0xB3,
+ 0x55, 0x27, 0xCB, 0xF5, 0xD1, 0x25, 0x15, 0x97, 0x70, 0x13, 0x09, 0x72, 0xEB, 0xE1, 0xD3, 0xF9,
+ 0x89, 0x75, 0x27, 0xF5, 0xA3, 0xA3, 0x00, 0xD6, 0x11, 0x1B, 0x09, 0xF9, 0xB9, 0x0B, 0x8C, 0xBA,
+ 0x40, 0xC0, 0x3F, 0x87, 0xCF, 0xC5, 0xAB, 0xB0, 0x50, 0x99, 0x72, 0x5E, 0xF6, 0x73, 0x48, 0xE8,
+ 0x0B, 0x4C, 0xDE, 0x49, 0xC0, 0xD7, 0x73, 0x21, 0x21, 0x2C, 0x22, 0x4D, 0x9D, 0xF9, 0x48, 0xA0,
+ 0x84, 0x1B, 0xCC, 0x34, 0x2F, 0x1C, 0x58, 0x7E, 0xC4, 0x75, 0xB5, 0x75, 0x28, 0xBC, 0xF8, 0x9C,
+ 0x5D, 0xEA, 0x3C, 0x94, 0xF3, 0x5F, 0x0A, 0x90, 0x4C, 0x64, 0xE4, 0xC2, 0x70, 0x69, 0x79, 0xC4,
+ 0x28, 0xDF, 0x94, 0x10, 0x43, 0x6F, 0xAD, 0x9A, 0xCC, 0xF3, 0x74, 0x28, 0xBA, 0xDB, 0x8F, 0xE5,
+ 0x5D, 0x1F, 0x2D, 0xDB, 0x0A, 0x99, 0x36, 0xA4, 0x50, 0x93, 0x53, 0xAC, 0x37, 0x71, 0x59, 0x64,
+ 0xFC, 0xD1, 0x89, 0x4F, 0x9E, 0x3A, 0xDC, 0x2C, 0xBB, 0x78, 0x1F, 0x19, 0x63, 0xD7, 0xB2, 0x55,
+ 0xF8, 0x96, 0xFC, 0x19, 0xA6, 0x46, 0xC5, 0xFB, 0xCC, 0x69, 0x97, 0xD4, 0x08, 0x3F, 0xD3, 0xB7,
+ 0x27, 0xD0, 0x52, 0x48, 0x0D, 0x42, 0xE3, 0x49, 0xFE, 0xDE, 0x4C, 0x04, 0x3F, 0x81, 0x48, 0x44,
+ 0x88, 0x29, 0x38, 0x11, 0x2A, 0x1F, 0x2B, 0x33, 0x13, 0x0F, 0x0F, 0x44, 0xAC, 0xEB, 0xBA, 0xE1,
+ 0x83, 0x15, 0x83, 0x52, 0x50, 0xD2, 0x80, 0x28, 0xED, 0x76, 0xE3, 0x59, 0xC8, 0xC1, 0x8C, 0x41,
+ 0x22, 0xBC, 0xD9, 0x5F, 0x50, 0x40, 0xFF, 0x5F, 0x66, 0x69, 0x1B, 0xD5, 0x47, 0x76, 0x44, 0xC0,
+ 0x85, 0xB5, 0x55, 0x70, 0x13, 0xAC, 0xEE, 0x11, 0x61, 0xAC, 0xFE, 0x1A, 0xA7, 0x43, 0xA9, 0x6D,
+ 0xB7, 0x94, 0x50, 0x81, 0x8D, 0xBE, 0xCC, 0xCE, 0xED, 0x62, 0xC4, 0x1B, 0x97, 0xFD, 0x10, 0x14,
+ 0xE6, 0x0E, 0x11, 0x16, 0x95, 0x6A, 0x5E, 0x0F, 0x87, 0x88, 0x72, 0xA7, 0x32, 0x9A, 0x05, 0xA2,
+ 0xC0, 0xD3, 0x23, 0x0C, 0xC0, 0x34, 0x93, 0x80, 0x51, 0x40, 0x9A, 0x25, 0x4D, 0x5D, 0x70, 0x87,
+ 0x4C, 0xCE, 0x45, 0xE2, 0x2D, 0x42, 0x5A, 0x36, 0x5A, 0x2A, 0x69, 0xF2, 0x81, 0xA0, 0x90, 0xFF,
+ 0xEB, 0xB5, 0x5A, 0x6B, 0xB5, 0x9F, 0x15, 0x6A, 0x0A, 0x39, 0xF0, 0x3A, 0x3F, 0xA7, 0x8F, 0xF5,
+ 0x1B, 0x81, 0xA9, 0x7F, 0xDF, 0x49, 0xEA, 0xC3, 0x6B, 0xC5, 0xC3, 0x23, 0xE5, 0x08, 0x8D, 0xFC,
+ 0xDE, 0x55, 0xEA, 0x65, 0xBE, 0x6E, 0x19, 0xB5, 0xAC, 0xD1, 0xE3, 0xC8, 0x70, 0x41, 0x40, 0x29,
+ 0xCC, 0xE1, 0xEA, 0x47, 0xC9, 0xB4, 0xB4, 0x86, 0x4C, 0xCC, 0x50, 0x54, 0x46, 0xC1, 0x5A, 0xC0,
+ 0x23, 0xEE, 0xF0, 0x4E, 0x7C, 0xEA, 0x5C, 0x22, 0x3D, 0x6E, 0x0C, 0xA2, 0x34, 0x11, 0x69, 0x89,
+ 0x5A, 0x95, 0xEB, 0x2A, 0x75, 0x13, 0x81, 0x8A, 0x14, 0xD0, 0x9F, 0x78, 0x90, 0x3F, 0xBC, 0xE6,
+ 0x64, 0x82, 0x7B, 0xF3, 0x5E, 0x40, 0x11, 0x1B, 0xF9, 0x21, 0x6A, 0x8F, 0x8B, 0x63, 0xCB, 0xD7,
+ 0x1E, 0x02, 0x05, 0xC6, 0x69, 0xAF, 0x0C, 0x3B, 0xAE, 0x7B, 0x53, 0x6F, 0x5B, 0x99, 0x1D, 0x46,
+ 0x81, 0x99, 0xF2, 0xC6, 0xEE, 0xDB, 0x2E, 0x23, 0xC3, 0xBB, 0x44, 0xB2, 0xD3, 0xC5, 0x6D, 0x96,
+ 0xBA, 0x7F, 0x70, 0x78, 0xC2, 0x31, 0xD8, 0xF5, 0x40, 0xD8, 0xB0, 0x2A, 0x48, 0x09, 0xB5, 0x91,
+ 0x77, 0x35, 0x9B, 0x2E, 0x87, 0xEF, 0x9E, 0x37, 0xA3, 0x2B, 0x68, 0xC4, 0xA2, 0x01, 0x48, 0x51,
+ 0x5C, 0xEF, 0xE7, 0x47, 0x97, 0x55, 0x85, 0x24, 0xCE, 0x8C, 0x20, 0xFF, 0x9D, 0x7E, 0x4D, 0x09,
+ 0xC3, 0xDE, 0x50, 0xDA, 0x52, 0x41, 0xCE, 0x75, 0x57, 0x2C, 0xDC, 0x45, 0x21, 0x33, 0xFB, 0x8C,
+ 0x72, 0xA4, 0x03, 0xF1, 0xEB, 0x86, 0x0D, 0x61, 0xA7, 0x95, 0xA4, 0xE7, 0xAD, 0x5A, 0x89, 0xCB,
+ 0x99, 0x02, 0xA1, 0xE9, 0x16, 0x64, 0x84, 0x18, 0xF6, 0x0F, 0x0E, 0x25, 0x45, 0x22, 0x5C, 0x56,
+ 0x59, 0x6D, 0x61, 0xAD, 0xC0, 0x05, 0x9A, 0x40, 0xD3, 0xCE, 0xE7, 0xA3, 0x92, 0x38, 0x3A, 0xEF,
+ 0xA9, 0xE0, 0x08, 0x35, 0x6D, 0x5B, 0x38, 0x40, 0x15, 0x6D, 0xE0, 0x4A, 0x43, 0x4B, 0x63, 0xDA,
+ 0x6A, 0x07, 0x7E, 0xB1, 0xCD, 0x12, 0xDC, 0x05, 0xA2, 0x23, 0x57, 0x28, 0x7A, 0x0D, 0xB4, 0x89,
+ 0xBD, 0xA3, 0xDB, 0xF4, 0x70, 0x8B, 0x12, 0xFC, 0xD0, 0x75, 0x40, 0x7D, 0x92, 0x8C, 0x5C, 0xD7,
+ 0xA7, 0xE4, 0x6D, 0x7B, 0x92, 0x89, 0x0C, 0xF4, 0xFA, 0xE5, 0x49, 0x15, 0x80, 0x68, 0x88, 0x25,
+ 0xC5, 0x93, 0xAF, 0x78, 0x8E, 0x92, 0x31, 0xE8, 0xBA, 0x9B, 0xEC, 0x93, 0x2E, 0x06, 0xBC, 0x87,
+ 0x30, 0x6E, 0x6F, 0x42, 0x31, 0xC6, 0xCD, 0xEA, 0xE2, 0x43, 0xDF, 0xA6, 0x2C, 0xFE, 0x05, 0x4E,
+ 0x63, 0xD6, 0x63, 0xD8, 0x46, 0x56, 0xD8, 0xB2, 0x6E, 0x4F, 0xDC, 0xF5, 0x23, 0xDE, 0x49, 0xAD,
+ 0xE8, 0x2D, 0x00, 0xEA, 0xAD, 0xE6, 0xE4, 0x4A, 0x48, 0x78, 0x20, 0xCC, 0xC0, 0x47, 0x22, 0xB4,
+ 0xB3, 0xB8, 0xAF, 0x71, 0x1D, 0x89, 0x68, 0xD6, 0x18, 0x70, 0x34, 0xAD, 0xFF, 0x99, 0xB3, 0x41,
+ 0xD4, 0x6B, 0x93, 0xB5, 0x47, 0x54, 0xB3, 0x7D, 0xF5, 0x5F, 0xA3, 0x6E, 0x54, 0x1A, 0x59, 0x11,
+ 0x53, 0x83, 0xAC, 0x23, 0xC2, 0x1F, 0x39, 0x64, 0x11, 0x67, 0x11, 0xBF, 0x50, 0xDB, 0x5D, 0x1D,
+ 0x74, 0x48, 0xDC, 0xF3, 0xBE, 0x55, 0xAA, 0x53, 0xDB, 0xC8, 0x5C, 0x79, 0xEA, 0xB3, 0x28, 0x7A,
+ 0xB6, 0xDB, 0x71, 0x7F, 0xD7, 0xCF, 0x39, 0x77, 0xFD, 0xCE, 0x8B, 0x9F, 0x1A, 0x27, 0x14, 0x3C,
+ 0x78, 0x58, 0x18, 0xE5, 0x93, 0xDD, 0x81, 0x24, 0xF8, 0xFE, 0x97, 0x3C, 0xA8, 0x8F, 0xFE, 0x6C,
+ 0xA1, 0xDB, 0xE2, 0xCF, 0x59, 0x9B, 0x28, 0xC2, 0xAB, 0x59, 0x13, 0x98, 0xDD, 0x2F, 0x03, 0xD0,
+ 0x05, 0x93, 0x72, 0x97, 0x07, 0xA0, 0xBC, 0xC3, 0x8B, 0x47, 0xDF, 0x55, 0x1C, 0x0E, 0x70, 0x6D,
+ 0xEF, 0x48, 0x0E, 0x33, 0x0D, 0x5F, 0x05, 0xF5, 0x98, 0xAC, 0xE3, 0xEE, 0x8F, 0x9D, 0xBD, 0x84,
+ 0xB7, 0x9C, 0x8C, 0x06, 0x60, 0x86, 0xB1, 0xDE, 0x80, 0xB3, 0xAC, 0xD7, 0xE8, 0x35, 0xDC, 0x51,
+ 0x57, 0x8F, 0xE8, 0x7A, 0xC8, 0xC2, 0x46, 0x3A, 0x22, 0x4D, 0x15, 0x6B, 0x9E, 0x0A, 0xB3, 0xFF,
+ 0x11, 0xD9, 0x2D, 0xE0, 0x5A, 0x32, 0xBB, 0x0D, 0x72, 0x0F, 0x8B, 0xB2, 0xD9, 0x86, 0x2D, 0x5F,
+ 0x57, 0x92, 0xBF, 0xAF, 0x00, 0x5C, 0xE2, 0x54, 0x91, 0x51, 0x22, 0xA9, 0x3A, 0x48, 0x9F, 0x8E,
+ 0xF0, 0xA8, 0x04, 0x1F, 0xD3, 0x58, 0x00, 0xB3, 0xDC, 0x7B, 0x99, 0x74, 0x18, 0x12, 0x44, 0x35,
+ 0x65, 0x1A, 0x1E, 0x95, 0xCC, 0x73, 0x53, 0xBB, 0xFC, 0x90, 0x07, 0x68, 0x2B, 0x46, 0x69, 0xF2,
+ 0x68, 0x6E, 0x62, 0x31, 0x5B, 0x11, 0x10, 0x9C, 0x18, 0x70, 0x29, 0x0D, 0x1A, 0x88, 0xD8, 0xA5,
+ 0xC6, 0x2C, 0xAA, 0xB7, 0x80, 0xC6, 0x36, 0xB0, 0x4E, 0x3C, 0x68, 0x74, 0xB8, 0xFE, 0xF6, 0x82,
+ 0x5D, 0x74, 0x71, 0xBE, 0xD1, 0x3C, 0xE0, 0x2D, 0x20, 0x3A, 0x36, 0xA9, 0x87, 0x76, 0xAA, 0x16,
+ 0xB7, 0x6F, 0xB8, 0x66, 0x05, 0xEB, 0x63, 0x15, 0xB6, 0xDE, 0x01, 0x49, 0xF5, 0x01, 0x37, 0xF0,
+ 0x98, 0x11, 0xC9, 0x43, 0x5D, 0xCB, 0x04, 0x48, 0x75, 0xD4, 0x73, 0x97, 0xE6, 0xD5, 0xEF, 0x97,
+ 0x8C, 0xF7, 0x37, 0xC8, 0xDA, 0xAB, 0x53, 0x12, 0x44, 0xF5, 0x72, 0xE7, 0x58, 0xBD, 0x2A, 0x65,
+ 0xE5, 0x79, 0x8D, 0xA5, 0x50, 0xBF, 0x3E, 0x3B, 0x36, 0x9D, 0x48, 0x73, 0xA0, 0x17, 0x4C, 0x8E,
+ 0x82, 0x98, 0xD0, 0xFD, 0xB1, 0xDB, 0x16, 0xBE, 0x05, 0x70, 0xBE, 0xEF, 0x43, 0x8A, 0xE8, 0xB8,
+ 0x79, 0x83, 0xBC, 0x3B, 0x23, 0x94, 0xAD, 0xA8, 0xD9, 0x98, 0x74, 0x4C, 0x91, 0x48, 0x22, 0x96,
+ 0x7D, 0x0E, 0x78, 0xF9, 0x35, 0xC0, 0xAE, 0xFD, 0x0A, 0xB0, 0xF0, 0x6C, 0xA7, 0x51, 0x4D, 0x44,
+ 0xD9, 0xBD, 0x84, 0x76, 0x48, 0x4A, 0x66, 0x41, 0x55, 0xA6, 0xBE, 0xA4, 0xA2, 0x3E, 0xDE, 0xA0,
+ 0xE4, 0x6F, 0xB9, 0xB2, 0xED, 0x74, 0xE2, 0x36, 0x2F, 0x54, 0x64, 0x9C, 0x41, 0xE6, 0xE3, 0xC8,
+ 0x35, 0x23, 0xD5, 0x61, 0x0E, 0x03, 0xCA, 0xFA, 0x17, 0xED, 0x05, 0x69, 0x9C, 0x7A, 0x58, 0x4D,
+ 0x16, 0x34, 0x15, 0xA3, 0x5B, 0x0C, 0x87, 0x0F, 0x02, 0xD2, 0xB3, 0xAF, 0x00, 0xC2, 0x1D, 0x39,
+ 0x87, 0x21, 0xF3, 0x9F, 0x96, 0xD2, 0xA1, 0x8C, 0xBE, 0xFB, 0xF4, 0xAB, 0x0B, 0x65, 0x3A, 0xF9,
+ 0xB7, 0x00, 0x91, 0x53, 0xE6, 0xF8, 0x9E, 0xD3, 0x65, 0xFE, 0xEB, 0x00, 0x6D, 0x15, 0x00, 0x7A,
+ 0x4D, 0xE8, 0xD2, 0xF9, 0xB7, 0xBC, 0x41, 0xBC, 0x90, 0x29, 0xEF, 0x72, 0xAE, 0x38, 0xE8, 0x25,
+ 0x77, 0xEC, 0x55, 0xFF, 0x1D, 0x71, 0x79, 0x8E, 0x7F, 0x32, 0x87, 0x39, 0x46, 0x58, 0x06, 0x19,
+ 0xBB, 0xC0, 0x77, 0x5A, 0x3E, 0xB5, 0xE2, 0x35, 0x7C, 0x24, 0xB5, 0xCC, 0x68, 0xA3, 0x2C, 0xC2,
+ 0xF4, 0x48, 0x39, 0x21, 0x25, 0x46, 0xE1, 0x2B, 0x08, 0x8D, 0x5E, 0xDC, 0x85, 0x4E, 0x03, 0x59,
+ 0x21, 0x42, 0x2C, 0x0F, 0x65, 0xC8, 0xF9, 0x27, 0x7C, 0x28, 0x0A, 0xAF, 0x2E, 0x88, 0x88, 0x0E,
+ 0xB7, 0xB7, 0xB7, 0x01, 0xCA, 0xD8, 0x19, 0xC8, 0x43, 0xE5, 0xCD, 0xBB, 0xBE, 0xC2, 0x74, 0xDE,
+ 0x1F, 0xBA, 0x0B, 0x4C, 0x40, 0x30, 0xEA, 0xC4, 0x76, 0xE7, 0x30, 0xE9, 0xDA, 0x19, 0x30, 0x33,
+ 0x86, 0xD8, 0xC7, 0x47, 0xB3, 0xBB, 0x7A, 0x0D, 0x5F, 0xF1, 0x44, 0x8A, 0xE5, 0x2F, 0x86, 0xC9,
+ 0xCF, 0x5A, 0xF5, 0x12, 0xA1, 0xC8, 0x7B, 0x5F, 0x83, 0x98, 0x96, 0x2D, 0x6A, 0x99, 0xE8, 0xE5,
+ 0xD7, 0x4E, 0x6D, 0x0A, 0x51, 0xCA, 0x90, 0x8F, 0x17, 0x4A, 0x02, 0x94, 0xAF, 0xBC, 0xB9, 0x64,
+ 0x2A, 0xFD, 0x29, 0x84, 0x40, 0x53, 0x71, 0xD6, 0x85, 0xEF, 0x26, 0xD4, 0x33, 0x6C, 0x18, 0x8C,
+ 0x4F, 0x4A, 0xFB, 0xA9, 0xAC, 0x24, 0x63, 0xED, 0x61, 0x20, 0x9C, 0x3A, 0xF0, 0xCF, 0x60, 0xDB,
+ 0xA2, 0xB8, 0xB7, 0x61, 0xB7, 0x0E, 0x68, 0xC3, 0xCB, 0x08, 0x69, 0xA2, 0x08, 0x7B, 0xB4, 0xCB,
+ 0xBA, 0x4A, 0x89, 0x26, 0x38, 0xED, 0x8D, 0x7B, 0x56, 0x27, 0xE1, 0x00, 0xB9, 0x18, 0x7F, 0xDC,
+ 0x42, 0x7C, 0x0D, 0xD6, 0x58, 0x93, 0xC9, 0x6F, 0x56, 0x22, 0x9A, 0x8C, 0x80, 0x19, 0xBA, 0x0F,
+ 0xE0, 0x52, 0x22, 0x1D, 0x98, 0xA7, 0x98, 0x85, 0xCE, 0x21, 0xE2, 0x6E, 0x70, 0x9E, 0x4F, 0xE5,
+ 0x04, 0x35, 0xEA, 0x66, 0x88, 0x22, 0x63, 0xB9, 0x17, 0x1A, 0xFA, 0x56, 0x35, 0x06, 0xB4, 0x27,
+ 0x2C, 0x8F, 0xE3, 0x13, 0x47, 0xCC, 0xA8, 0xC6, 0x46, 0x54, 0x57, 0xD8, 0x70, 0xFF, 0x86, 0x4C,
+ 0xB3, 0xF2, 0x0E, 0x29, 0x5E, 0xD8, 0x88, 0x4C, 0x5A, 0x16, 0x1A, 0x79, 0x41, 0x87, 0x70, 0x52,
+ 0x1E, 0xBA, 0x02, 0xCC, 0xA3, 0xC9, 0xEF, 0x53, 0x12, 0x56, 0x6D, 0x55, 0xBF, 0x8B, 0xAF, 0xFD,
+ 0x12, 0xE0, 0x2D, 0x27, 0x83, 0x9F, 0x8E, 0x2E, 0x1B, 0x7A, 0x22, 0x6D, 0xF9, 0x59, 0xF9, 0x63,
+ 0x7F, 0xB0, 0xBF, 0x05, 0x97, 0x78, 0x2E, 0x67, 0xC3, 0xA8, 0x4B, 0x16, 0xCB, 0x72, 0x47, 0xFD,
+ 0x0C, 0x0F, 0xAE, 0xC9, 0xB4, 0xB6, 0xE8, 0x99, 0xAA, 0xA3, 0x60, 0xF4, 0xD2, 0x07, 0xF5, 0x82,
+ 0xDA, 0x7B, 0xE6, 0x6E, 0xCC, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x25, 0xA5,
+ 0x2E, 0x00, 0xAA, 0x28, 0x63, 0x2B, 0x61, 0x3E, 0x7F, 0x34, 0xA0, 0x83, 0xCE, 0xEC, 0x44, 0x72,
+ 0x29, 0x1F, 0x81, 0x62, 0x8A, 0xED, 0x9D, 0x5F, 0xFD, 0xFE, 0x14, 0x52, 0x9C, 0xFC, 0xB4, 0x04,
+ 0x70, 0x0A, 0x27, 0x7E, 0x94, 0x69, 0x13, 0x80, 0x97, 0xCC, 0xD2, 0x69, 0xDD, 0xD1, 0x38, 0xFA,
+ 0x51, 0x88, 0xC0, 0x9D, 0xB6, 0x14, 0xE3, 0x20, 0xEB, 0x69, 0x62, 0xF4, 0xB7, 0x07, 0xF2, 0x6F,
+ 0xFE, 0xDA, 0xE3, 0xF9, 0x7A, 0x64, 0x70, 0xAD, 0x11, 0x10, 0x54, 0x6B, 0x9F, 0x8B, 0x48, 0x9C,
+ 0x19, 0x27, 0x83, 0x20, 0x29, 0x3E, 0x7C, 0x57, 0x0E, 0x6E, 0x4F, 0x0B, 0xB7, 0xB2, 0x6D, 0x61,
+ 0x52, 0xE0, 0xE5, 0x67, 0xDB, 0xF9, 0x96, 0xBA, 0xF2, 0xA6, 0x4D, 0x2A, 0x98, 0xDF, 0x2F, 0x03,
+ 0xD1, 0x78, 0xB4, 0xF9, 0x08, 0x2A, 0x7C, 0xBA, 0xD6, 0x53, 0x57, 0x6A, 0x2C, 0x8D, 0xF4, 0xDC,
+ 0xA9, 0x05, 0x00, 0xA6, 0x8C, 0xFB, 0xFF, 0x45, 0x13, 0xF4, 0xE8, 0xBD, 0xB5, 0xF4, 0x1D, 0xF7,
+ 0x5F, 0x32, 0xC8, 0x30, 0x1F, 0xD5, 0x0A, 0xC7, 0xA4, 0x28, 0x06, 0xFF, 0x44, 0x18, 0x43, 0x1A,
+ 0x8C, 0x63, 0x81, 0x2B, 0x16, 0x4C, 0xE4, 0xB0, 0xF4, 0x9A, 0x49, 0x09, 0x7B, 0x8B, 0x6F, 0x93,
+ 0x2E, 0xEC, 0x8C, 0x4F, 0x71, 0x01, 0xFF, 0x54, 0x90, 0x1B, 0x6C, 0xF1, 0x9B, 0xB1, 0x06, 0xDA,
+ 0xFC, 0xD4, 0xD6, 0xFB, 0x10, 0xDA, 0x46, 0x8C, 0x0E, 0xAF, 0xF8, 0x19, 0xC0, 0x35, 0xA5, 0xD2,
+ 0x74, 0xFD, 0x25, 0xEF, 0xDD, 0x2E, 0x9C, 0x0B, 0xE1, 0x17, 0xD5, 0x0C, 0xFB, 0xC1, 0xA8, 0xE6,
+ 0x4A, 0x44, 0x0A, 0xF2, 0x48, 0xA2, 0x07, 0x42, 0x3C, 0x36, 0xC5, 0xD7, 0x45, 0x9D, 0xDB, 0xA6,
+ 0x4B, 0x30, 0xC1, 0x3A, 0xB0, 0x31, 0x88, 0x0E, 0xB1, 0x38, 0x4E, 0x34, 0xF9, 0x33, 0xE2, 0x8A,
+ 0x0B, 0xF7, 0x7C, 0xF1, 0xE3, 0x07, 0x5A, 0xA0, 0x63, 0x12, 0x22, 0xFD, 0x44, 0x8A, 0xE7, 0x35,
+ 0xF7, 0x24, 0xAD, 0x6F, 0xBA, 0xC1, 0xA3, 0x2F, 0x6C, 0x58, 0xF3, 0xD3, 0x13, 0x4D, 0x21, 0x0A,
+ 0xA1, 0x1C, 0x54, 0xAA, 0x5E, 0x35, 0xEF, 0x00, 0x48, 0xE8, 0xDE, 0x56, 0xA4, 0xFF, 0xBB, 0xD9,
+ 0xF9, 0xA7, 0x0D, 0x83, 0x08, 0x8B, 0x41, 0xDC, 0x63, 0xA4, 0x40, 0x62, 0x46, 0xAD, 0x57, 0x49,
+ 0x43, 0x67, 0x6D, 0x43, 0x23, 0x19, 0x7E, 0x17, 0xF6, 0xEF, 0xDE, 0x07, 0xF2, 0x5D, 0x11, 0x78,
+ 0x42, 0x8D, 0x11, 0xEF, 0x9F, 0x4A, 0xA6, 0xCE, 0x95, 0x92, 0x34, 0x20, 0x02, 0x95, 0xB9, 0xA8,
+ 0x16, 0xF5, 0x5E, 0x2F, 0x7C, 0xF8, 0xE2, 0x07, 0xB8, 0xF4, 0x07, 0x30, 0x1C, 0x77, 0xD3, 0x46,
+ 0x11, 0x07, 0x8D, 0x6D, 0x69, 0x87, 0xB4, 0x91, 0xCB, 0x72, 0x8E, 0x2D, 0xAD, 0x0E, 0xCD, 0x97,
+ 0x8C, 0xA4, 0x0D, 0x05, 0x93, 0xAF, 0x42, 0xDE, 0x74, 0xF8, 0x97, 0x3B, 0x7F, 0xBF, 0x4D, 0x6A,
+ 0x12, 0xE4, 0xE2, 0xF2, 0xAF, 0x6D, 0x1F, 0x31, 0xCA, 0x81, 0x33, 0x2F, 0x42, 0x42, 0xCE, 0x48,
+ 0x31, 0xD9, 0x09, 0x2A, 0x70, 0xDF, 0x75, 0xE3, 0x9C, 0x42, 0xEF, 0x8A, 0xB1, 0x96, 0x6B, 0xA1,
+ 0xBC, 0x2C, 0x84, 0x77, 0xE9, 0x3D, 0x13, 0x3C, 0x04, 0x9F, 0xC8, 0x70, 0xC3, 0x26, 0xF0, 0xE3,
+ 0xC5, 0x04, 0xD3, 0xEA, 0x02, 0x10, 0x7E, 0xD2, 0xB5, 0x32, 0x87, 0x8D, 0x02, 0xA8, 0x1B, 0x19,
+ 0x7D, 0x6A, 0x54, 0x45, 0x62, 0x06, 0xD3, 0x28, 0x32, 0xAC, 0x2A, 0x1E, 0xA1, 0xC3, 0x56, 0x96,
+ 0xCB, 0xA4, 0x3A, 0x6F, 0xCB, 0x2B, 0xBC, 0xCF, 0x7F, 0x75, 0xE9, 0x05, 0x12, 0x24, 0xC0, 0xD4,
+ 0x97, 0xAB, 0xCF, 0x4D, 0x38, 0x23, 0x87, 0xE6, 0x3D, 0x22, 0xE6, 0x3D, 0xE1, 0xE7, 0x45, 0xF6,
+ 0x62, 0xF3, 0xAB, 0x9B, 0x0C, 0x11, 0x23, 0x57, 0x56, 0x57, 0xB7, 0xD8, 0x58, 0x37, 0x5A, 0x8C,
+ 0x1F, 0x31, 0xA8, 0x29, 0x1A, 0x04, 0xE2, 0xA7, 0x4A, 0xC7, 0x27, 0xCC, 0x39, 0x0E, 0xEF, 0x7F,
+ 0xD4, 0xE1, 0x46, 0xCD, 0xCC, 0x96, 0x22, 0xBC, 0x0E, 0xDD, 0xDF, 0xCA, 0xDB, 0x77, 0x65, 0x49,
+ 0x7C, 0x2F, 0x2C, 0xC0, 0x94, 0x05, 0x71, 0xC2, 0x23, 0x5E, 0x74, 0xC3, 0x4E, 0x59, 0xA9, 0xE2,
+ 0xD1, 0x0F, 0x2B, 0x68, 0x5E, 0x6C, 0x6B, 0x3C, 0xD4, 0x7C, 0x42, 0xE4, 0x26, 0x79, 0xAE, 0xFB,
+ 0x14, 0x65, 0x56, 0x75, 0x6F, 0xA6, 0x70, 0xB9, 0x2E, 0x28, 0x94, 0xF1, 0xD2, 0xE3, 0xDA, 0x1C,
+ 0x4B, 0xF2, 0x71, 0x8A, 0xED, 0xE6, 0x20, 0x1C, 0xF4, 0xEE, 0x63, 0xBB, 0x74, 0x73, 0x61, 0xD9,
+ 0x55, 0x84, 0xED, 0xD9, 0x59, 0x1B, 0x47, 0x8B, 0xE5, 0xEF, 0xBF, 0xA5, 0x78, 0xB4, 0x99, 0x7E,
+ 0xF3, 0x31, 0x59, 0x2A, 0xC8, 0x23, 0xB9, 0x0A, 0x81, 0xE2, 0x4C, 0x8A, 0x97, 0xBC, 0x74, 0x08,
+ 0xE4, 0x35, 0x2D, 0xD1, 0x3C, 0xBA, 0xF2, 0x20, 0x51, 0x76, 0xF8, 0xFD, 0x20, 0x5D, 0xD2, 0x63,
+ 0x7D, 0xA3, 0xEF, 0x7D, 0x56, 0x46, 0x44, 0x86, 0x29, 0x70, 0xC3, 0x5F, 0x1B, 0xC6, 0x3D, 0x42,
+ 0xD3, 0x69, 0x78, 0x5C, 0xD3, 0xD4, 0x79, 0x3B, 0x0B, 0x81, 0x48, 0x00, 0xAA, 0xEA, 0x4C, 0x95,
+ 0x56, 0x20, 0xE8, 0xB1, 0xB6, 0xE9, 0xA7, 0xD6, 0x0F, 0x4F, 0x5B, 0xB1, 0xC3, 0xCD, 0xF6, 0x43,
+ 0x83, 0x6C, 0x4C, 0xA3, 0x17, 0x58, 0xAB, 0x06, 0x68, 0xBB, 0x14, 0x50, 0x07, 0xBC, 0x7B, 0x75,
+ 0x9B, 0x5F, 0x96, 0xC6, 0x79, 0xFF, 0x3C, 0x6A, 0x05, 0x5B, 0xA4, 0x63, 0xA3, 0x93, 0x6F, 0x6F,
+ 0x87, 0xE8, 0xAF, 0x44, 0x48, 0x02, 0x49, 0x4C, 0xED, 0x8C, 0x3A, 0x51, 0x50, 0x43, 0x6F, 0xE6,
+ 0x2A, 0x5E, 0x47, 0x25, 0x05, 0xFB, 0x68, 0x17, 0x2D, 0x90, 0xEB, 0xE2, 0x76, 0xAB, 0x6B, 0x99,
+ 0xB3, 0x84, 0x59, 0xD0, 0xFD, 0x6A, 0x60, 0x6E, 0x4F, 0x46, 0xA0, 0x37, 0xE7, 0x06, 0xB6, 0x15,
+ 0xC9, 0x00, 0xEC, 0x00, 0x38, 0x0A, 0x8F, 0x81, 0xDB, 0xAB, 0xBA, 0xE7, 0xD3, 0x88, 0xF0, 0x1B,
+ 0x5D, 0xE9, 0x41, 0xAC, 0xA0, 0xBC, 0x47, 0x93, 0x73, 0x04, 0x72, 0x88, 0x63, 0x91, 0xD8, 0x60,
+ 0x82, 0xAA, 0x2D, 0x49, 0xA4, 0xFF, 0xFF, 0x0C, 0xCF, 0x16, 0x73, 0x74, 0xFE, 0x5F, 0x72, 0x90,
+ 0x8C, 0x5E, 0x82, 0x2D, 0x6E, 0xDA, 0x8B, 0x30, 0xA6, 0x39, 0xFB, 0x2A, 0x92, 0xC5, 0x0D, 0x49,
+ 0x3A, 0x59, 0x3E, 0x0D, 0xA7, 0xBB, 0x0B, 0x28, 0x46, 0x99, 0x6E, 0x7E, 0x6C, 0xD7, 0x6B, 0x89,
+ 0x8D, 0x1A, 0x85, 0x1D, 0x7E, 0x1A, 0xE8, 0xC8, 0xEF, 0x8F, 0xDD, 0x00, 0xF8, 0x4F, 0xAE, 0x12,
+ 0xF6, 0x88, 0x91, 0x36, 0xF9, 0xDB, 0x09, 0xDD, 0xF7, 0xD5, 0xB3, 0xC8, 0x90, 0x0C, 0xC4, 0xB0,
+ 0x45, 0xD2, 0x96, 0xBF, 0x61, 0xE3, 0xD8, 0xD1, 0x4F, 0xDB, 0x1B, 0xF6, 0xA8, 0x0D, 0x40, 0xF0,
+ 0xEF, 0x23, 0x26, 0x2F, 0x25, 0xAB, 0x0E, 0x15, 0xB6, 0x90, 0x1F, 0xA3, 0x6B, 0xEE, 0x93, 0xD4,
+ 0x57, 0xA7, 0x78, 0x39, 0xB4, 0x79, 0x2B, 0x9E, 0xE7, 0xFA, 0x2E, 0x1D, 0xAA, 0x41, 0xEB, 0x87,
+ 0x99, 0x4E, 0x78, 0x42, 0x47, 0x9D, 0x43, 0x80, 0x9F, 0x56, 0x13, 0x5E, 0x3D, 0x95, 0xF8, 0xB4,
+ 0x76, 0x9F, 0x72, 0x83, 0x81, 0xB1, 0x74, 0xDE, 0x43, 0xBE, 0x91, 0x57, 0x71, 0x90, 0x3C, 0xA0,
+ 0x1F, 0xA0, 0x87, 0x07, 0x47, 0xDF, 0x5C, 0xFD, 0x21, 0xD6, 0x64, 0x4C, 0x72, 0xFB, 0xCE, 0x21,
+ 0xC5, 0x89, 0x23, 0x0B, 0xAE, 0x75, 0x72, 0x73, 0xA6, 0xA6, 0xB3, 0xCE, 0x9C, 0xB1, 0xAF, 0xAB,
+ 0xDF, 0x06, 0x55, 0x5F, 0x0C, 0x1D, 0x6D, 0x13, 0xD1, 0xD2, 0xF0, 0x54, 0x00, 0xAE, 0xA6, 0x51,
+ 0xF2, 0x8B, 0x50, 0xF5, 0x5D, 0x76, 0xC9, 0x4D, 0x55, 0x3C, 0x6F, 0xC7, 0xCB, 0xD1, 0x43, 0xEB,
+ 0x52, 0xCE, 0x84, 0x00, 0x90, 0xEB, 0xBD, 0x54, 0xC9, 0x04, 0x3B, 0x4B, 0xA9, 0x5D, 0x53, 0x0D,
+ 0xB6, 0x13, 0x55, 0xD4, 0x36, 0xEB, 0x71, 0x23, 0x00, 0x98, 0xB3, 0xB9, 0x73, 0x8B, 0x0B, 0xD3,
+ 0xB9, 0x67, 0x50, 0x28, 0xBC, 0xCC, 0x16, 0xD5, 0xDE, 0x72, 0x5B, 0x75, 0x7B, 0x12, 0xF6, 0x3C,
+ 0x94, 0xAE, 0x3E, 0xEF, 0x44, 0x3B, 0x9E, 0x8F, 0x80, 0x1C, 0x18, 0x5F, 0x9B, 0x43, 0x4F, 0xF5,
+ 0xB1, 0xD7, 0x8A, 0x42, 0xA0, 0x51, 0x74, 0x86, 0x0F, 0x31, 0x18, 0x6C, 0x47, 0xF8, 0xB9, 0x97,
+ 0x0F, 0x4B, 0x47, 0x18, 0xF6, 0x5C, 0x70, 0x49, 0xBF, 0xF5, 0x00, 0x08, 0xC6, 0xD7, 0x04, 0x79,
+ 0xE2, 0xE5, 0x05, 0xAA, 0x00, 0x4A, 0xE0, 0xA8, 0x62, 0xDC, 0xD7, 0x17, 0x7C, 0x8D, 0x17, 0x14,
+ 0x0A, 0x16, 0x3B, 0x0B, 0x70, 0x50, 0xF0, 0xB8, 0x1A, 0xE0, 0xB9, 0x8C, 0x04, 0xF0, 0xEB, 0xB1,
+ 0xCB, 0x15, 0x3C, 0xF6, 0xCE, 0xED, 0x40, 0xA2, 0x40, 0x36, 0x3A, 0xF0, 0xA8, 0x21, 0xF9, 0x31,
+ 0x49, 0x8A, 0xC8, 0x1D, 0x57, 0x63, 0xC3, 0x4E, 0x98, 0x3E, 0x2A, 0x0C, 0x41, 0xD9, 0x01, 0xF6,
+ 0xB5, 0xB4, 0xCD, 0x5C, 0xCE, 0x1A, 0x04, 0x81, 0xC4, 0x66, 0x38, 0xAA, 0x06, 0xC9, 0xDA, 0x42,
+ 0x8F, 0x26, 0x7D, 0xB3, 0x51, 0x43, 0x94, 0x1A, 0xC6, 0x8E, 0x2C, 0x78, 0xC4, 0x4E, 0x88, 0x40,
+ 0xF3, 0x38, 0x47, 0x4E, 0x0F, 0xA4, 0x29, 0xBC, 0xC2, 0x02, 0x1F, 0x58, 0x44, 0xF4, 0x1B, 0x8D,
+ 0x2B, 0x82, 0x15, 0x92, 0x80, 0xA2, 0x65, 0xBD, 0x50, 0x93, 0xC5, 0xF9, 0xEF, 0x18, 0x83, 0x45,
+ 0x51, 0x4A, 0x5C, 0xCC, 0x9C, 0x69, 0xF6, 0x96, 0x9E, 0xC0, 0x14, 0x2A, 0x48, 0x72, 0xBD, 0xEE,
+ 0x93, 0x4B, 0x50, 0xFF, 0xF4, 0x60, 0x62, 0x33, 0xE2, 0x0B, 0xD3, 0x63, 0xFE, 0xE6, 0xE5, 0xE9,
+ 0xB0, 0x1A, 0x25, 0x7F, 0x5B, 0xDC, 0xF7, 0xA0, 0x9A, 0x5B, 0x61, 0x76, 0x61, 0x5D, 0x1F, 0xE3,
+ 0x24, 0x02, 0x11, 0x28, 0x97, 0x0E, 0xCB, 0x95, 0x08, 0x1B, 0xD1, 0xA8, 0xD9, 0xE7, 0x91, 0xC6,
+ 0x47, 0x38, 0x10, 0xEC, 0x33, 0xE0, 0x45, 0xF4, 0xE8, 0xAF, 0xBD, 0xCB, 0x5C, 0x32, 0x38, 0x3D,
+ 0x49, 0xC6, 0x36, 0x62, 0xE3, 0x7D, 0x94, 0xC4, 0x05, 0xAF, 0x47, 0x0B, 0x01, 0x72, 0xF1, 0x76,
+ 0x2B, 0x7C, 0xCC, 0x62, 0xB2, 0xF4, 0xD4, 0xE0, 0x10, 0x02, 0x1D, 0xFD, 0x3B, 0xE3, 0x0F, 0x46,
+ 0x45, 0x18, 0x11, 0xF5, 0xBF, 0x15, 0xEB, 0xC7, 0xA4, 0x15, 0x96, 0x53, 0x02, 0xC1, 0xCD, 0xB0,
+ 0xC0, 0xD4, 0xE7, 0xBC, 0x47, 0x7F, 0xE3, 0xAD, 0x1F, 0x4A, 0xFF, 0x36, 0xB2, 0x83, 0x5D, 0x1B,
+ 0xF1, 0x2C, 0xE9, 0xE5, 0xDA, 0x17, 0x0F, 0x6C, 0x68, 0x55, 0x23, 0xEC, 0x28, 0x4C, 0x2B, 0xC3,
+ 0xC3, 0xC2, 0x26, 0x9D, 0xF0, 0x61, 0x8C, 0xDC, 0xD6, 0xDB, 0xDB, 0x3E, 0xF0, 0x37, 0x67, 0xBC,
+ 0x67, 0xFA, 0xCD, 0x17, 0xBC, 0xBA, 0xAC, 0x05, 0xA1, 0x50, 0x41, 0x0B, 0x18, 0x97, 0xE9, 0x7B,
+ 0xE9, 0xE5, 0xA5, 0x70, 0x14, 0x24, 0x7B, 0x75, 0x74, 0xCD, 0x9C, 0x9B, 0xA6, 0xC3, 0x6B, 0x10,
+ 0x7F, 0x9C, 0x6F, 0x8A, 0xE6, 0xDD, 0x30, 0xB0, 0x70, 0x7E, 0x46, 0xB5, 0xC5, 0xDE, 0x97, 0xE0,
+ 0x65, 0x64, 0x64, 0x3E, 0xAD, 0xA3, 0xA8, 0x0A, 0x69, 0xC7, 0x37, 0x5E, 0xCE, 0x17, 0xFD, 0x2B,
+ 0x0C, 0xAE, 0x04, 0xDE, 0xFB, 0x6A, 0x96, 0xD1, 0x6C, 0x32, 0x00, 0xC8, 0xBD, 0x4B, 0xB6, 0x9A,
+ 0xC5, 0xF7, 0xDA, 0xBC, 0xED, 0xA7, 0x11, 0x0D, 0x91, 0x75, 0xC3, 0xFF, 0x7A, 0xC9, 0x06, 0x18,
+ 0x1C, 0x31, 0x92, 0xC2, 0x49, 0x7B, 0xB4, 0xC6, 0xF8, 0xA3, 0x42, 0xC0, 0x37, 0xBE, 0xAD, 0x3C,
+ 0x06, 0xF5, 0x73, 0x62, 0xBF, 0xDE, 0x08, 0x77, 0x29, 0x52, 0x2E, 0x28, 0x57, 0xBF, 0xF9, 0x98,
+ 0xFA, 0xC3, 0x9F, 0xC4, 0xF4, 0xB2, 0xC2, 0x99, 0x4E, 0x45, 0x33, 0x50, 0xB4, 0x9A, 0x65, 0xC9,
+ 0xFB, 0x40, 0xC2, 0x77, 0xAC, 0xC8, 0x87, 0x1C, 0x9F, 0x7F, 0xD9, 0x1C, 0xE7, 0xC1, 0x04, 0x44,
+ 0xAB, 0xFA, 0x47, 0x5D, 0xE4, 0x89, 0x2D, 0xCF, 0x52, 0xC1, 0x24, 0x30, 0x3D, 0xAD, 0x1B, 0x25,
+ 0x34, 0xAF, 0x76, 0xBA, 0xE0, 0x26, 0xF2, 0x63, 0xD0, 0x68, 0xFA, 0x18, 0x07, 0xA4, 0x39, 0xEE,
+ 0xF2, 0xF0, 0xEC, 0xDD, 0xB4, 0x95, 0x4E, 0xBF, 0x46, 0x31, 0x39, 0xC7, 0x1D, 0xB6, 0xCB, 0x5F,
+ 0xA2, 0xA2, 0x62, 0x83, 0x11, 0xA5, 0xE9, 0xED, 0x92, 0xC2, 0xD8, 0x5B, 0x64, 0xD9, 0x65, 0xFE,
+ 0x18, 0xE8, 0xB1, 0xBD, 0xAD, 0xF2, 0xF9, 0xD0, 0x1D, 0xCB, 0x71, 0xDC, 0x49, 0x3F, 0x4F, 0xD9,
+ 0x9E, 0x17, 0x7F, 0xF6, 0x46, 0xA0, 0xFF, 0x99, 0x17, 0xA2, 0xE6, 0xEB, 0xDE, 0xB7, 0xAF, 0x26,
+ 0x4C, 0xFD, 0xDA, 0xE1, 0xFB, 0xEF, 0xAA, 0xC5, 0x2F, 0xF9, 0x31, 0x5C, 0xF6, 0x91, 0x70, 0xDA,
+ 0x66, 0xED, 0xB3, 0x51, 0x72, 0x95, 0x29, 0x22, 0xA5, 0xE2, 0x82, 0x0C, 0x43, 0xFE, 0x92, 0xFF,
+ 0x72, 0xA8, 0xD9, 0xF5, 0x6F, 0xCF, 0x63, 0xFC, 0x75, 0xD2, 0x33, 0x47, 0xAD, 0x01, 0x87, 0xC2,
+ 0xE6, 0xDE, 0xBB, 0xB9, 0xCF, 0xE2, 0x17, 0x50, 0x3A, 0x68, 0x31, 0xD1, 0xB6, 0xC9, 0x3F, 0x43,
+ 0x25, 0xBC, 0xB5, 0xF3, 0xC9, 0xF9, 0xF3, 0xB3, 0x11, 0x5E, 0xF6, 0xE0, 0xBF, 0xAF, 0x1B, 0x90,
+ 0xA3, 0x61, 0xA3, 0x36, 0xFB, 0xBF, 0x0E, 0x62, 0xDF, 0xCC, 0x9B, 0x51, 0x59, 0xFE, 0xA4, 0xFA,
+ 0xD1, 0x3A, 0x4B, 0xA5, 0x9A, 0xA8, 0x21, 0x01, 0x1D, 0x52, 0xAF, 0xBE, 0x74, 0x2D, 0x8B, 0x91,
+ 0x91, 0x98, 0xC9, 0xD1, 0x9C, 0x5B, 0x38, 0x12, 0x00, 0x2B, 0x12, 0x6F, 0x92, 0x7A, 0xC7, 0x45,
+ 0x16, 0xB8, 0xA7, 0xB3, 0x9F, 0x46, 0xF9, 0xAE, 0xBD, 0x13, 0xFB, 0xDD, 0xDB, 0x86, 0x8A, 0x94,
+ 0xFB, 0x10, 0x3B, 0xA3, 0x4D, 0x4C, 0x4D, 0xDD, 0xC2, 0x38, 0x22, 0x58, 0xC4, 0x34, 0xCE, 0x58,
+ 0x78, 0x89, 0x7B, 0x77, 0x28, 0x30, 0xD6, 0xC7, 0x44, 0x04, 0x52, 0x7A, 0x19, 0x1E, 0xF1, 0xFD,
+ 0xD3, 0x77, 0x5F, 0x50, 0x0D, 0xAE, 0xAE, 0xEF, 0x59, 0x06, 0xF4, 0x3D, 0x18, 0x43, 0x38, 0x51,
+ 0xD6, 0x3D, 0xC5, 0x23, 0x04, 0x1F, 0x5B, 0x25, 0x4C, 0x74, 0xB0, 0xC6, 0xEB, 0x76, 0xBA, 0xE8,
+ 0xB1, 0xA7, 0x44, 0xE2, 0x5C, 0xD4, 0x18, 0x1D, 0x34, 0x8D, 0xA8, 0x05, 0x25, 0x03, 0xA2, 0xD7,
+ 0xA3, 0x3F, 0x50, 0x07, 0x52, 0x09, 0x2D, 0x88, 0xFC, 0x2C, 0xF3, 0xAF, 0xB4, 0x89, 0x6A, 0xA0,
+ 0x27, 0x5F, 0xD3, 0x2B, 0x63, 0x8D, 0xD9, 0x60, 0x1B, 0xD3, 0x35, 0x18, 0x61, 0x93, 0xF6, 0x82,
+ 0xD8, 0xBC, 0x9F, 0x90, 0xB6, 0xB1, 0xCF, 0xFD, 0x3B, 0xD4, 0xA8, 0x07, 0x0D, 0x76, 0xF1, 0x44,
+ 0x4F, 0x45, 0x10, 0x4C, 0xFB, 0x92, 0x1A, 0x56, 0x48, 0x87, 0x15, 0x7B, 0x55, 0x3D, 0x10, 0xCE,
+ 0xD8, 0x07, 0x3A, 0x79, 0x72, 0x17, 0x5C, 0xF2, 0x9C, 0x84, 0xE1, 0x72, 0x36, 0x2A, 0xEB, 0xBB,
+ 0xEE, 0x3E, 0xC8, 0x1F, 0x33, 0x2F, 0x53, 0xDF, 0x6B, 0xE8, 0x3E, 0x0A, 0x5C, 0x32, 0x36, 0x81,
+ 0x77, 0x4A, 0xD6, 0xD0, 0xA8, 0x14, 0xBB, 0x32, 0xDC, 0x8B, 0x55, 0xB2, 0xEF, 0xD4, 0xE8, 0xCA,
+ 0xFF, 0x50, 0xDC, 0xBD, 0x55, 0xB5, 0x5E, 0xBE, 0x1B, 0x74, 0x8A, 0x57, 0x5B, 0xBC, 0xCC, 0x2F,
+ 0xF6, 0x72, 0x0C, 0xAF, 0x9F, 0x2A, 0x96, 0xBE, 0xDC, 0xBC, 0xFC, 0x3A, 0xA8, 0xDF, 0x3E, 0x2E,
+ 0x78, 0xA7, 0xD8, 0xA0, 0x2A, 0x95, 0x70, 0x24, 0xBC, 0x6C, 0x1A, 0xFA, 0xAA, 0xE6, 0xE1, 0x38,
+ 0xE4, 0x8A, 0xD8, 0x63, 0x03, 0x82, 0x3C, 0xFB, 0xA6, 0x9E, 0xB9, 0x69, 0xF6, 0x04, 0x60, 0x37,
+ 0x0B, 0xBC, 0xEF, 0x85, 0x70, 0xD4, 0xCB, 0xBE, 0x3E, 0xD3, 0xF2, 0x81, 0x37, 0x45, 0x1A, 0x94,
+ 0xB4, 0x02, 0xD9, 0xA2, 0xC8, 0x1D, 0x92, 0xE0, 0x5C, 0xA4, 0x5D, 0x43, 0xA5, 0xFA, 0x1D, 0xD3,
+ 0x18, 0x14, 0x0B, 0x18, 0x86, 0x74, 0x8E, 0x16, 0xB3, 0x65, 0xD3, 0x24, 0x45, 0x71, 0xA9, 0x28,
+ 0x46, 0x25, 0x68, 0x21, 0x94, 0x8D, 0xDB, 0xCA, 0x13, 0x3C, 0x0C, 0xB1, 0xBB, 0xF2, 0x6E, 0xC2,
+ 0x2D, 0x67, 0xBA, 0x0D, 0xA9, 0x5B, 0x3A, 0xD7, 0x45, 0xDC, 0x68, 0x94, 0x41, 0x30, 0xC1, 0xAD,
+ 0x0C, 0xEF, 0x7E, 0xB1, 0x66, 0x1E, 0xEE, 0x0E, 0x23, 0xC0, 0x6B, 0x08, 0xF0, 0x3E, 0xD0, 0xA8,
+ 0xEF, 0x60, 0x34, 0xA7, 0xDB, 0x9A, 0x3C, 0xD5, 0xEE, 0x02, 0x4C, 0x3E, 0x1C, 0x94, 0x75, 0x8E,
+ 0x95, 0xD2, 0x91, 0xCD, 0xF0, 0x20, 0x49, 0xBC, 0x6A, 0xBC, 0x26, 0x0C, 0x40, 0x55, 0x4F, 0xE4,
+ 0x29, 0xC7, 0x2D, 0xB0, 0x55, 0x28, 0xB1, 0xB2, 0x99, 0x2A, 0x87, 0x4A, 0x19, 0x58, 0x7D, 0xEE,
+ 0x24, 0xE7, 0xEE, 0xA6, 0x6A, 0xBE, 0xE1, 0x96, 0xBB, 0x80, 0xF0, 0x1B, 0x55, 0x71, 0x02, 0x9D,
+ 0xCA, 0x8A, 0x51, 0xE4, 0x1D, 0x34, 0x6C, 0x1D, 0x22, 0x91, 0x3C, 0x19, 0xBC, 0x31, 0x59, 0xA0,
+ 0xD4, 0x82, 0x96, 0xAE, 0xE9, 0x2B, 0x24, 0x8E, 0xF4, 0x97, 0x3B, 0xF0, 0x06, 0xC3, 0x60, 0x18,
+ 0x0A, 0x46, 0xA3, 0x69, 0xA3, 0x9B, 0x35, 0xA8, 0x04, 0xBC, 0x5B, 0x60, 0xE5, 0xF5, 0x10, 0x22,
+ 0x03, 0x59, 0x12, 0x09, 0x1B, 0x28, 0x6B, 0xC4, 0xF1, 0x82, 0xB1, 0x72, 0x43, 0x8B, 0x0A, 0x27,
+ 0x84, 0x7A, 0x38, 0x72, 0x64, 0xFD, 0x74, 0x39, 0x02, 0xB6, 0x19, 0xE2, 0xDD, 0x28, 0x85, 0x61,
+ 0xDE, 0x4F, 0x15, 0x0B, 0x90, 0xE3, 0x83, 0xB5, 0x82, 0xC6, 0xB9, 0xA6, 0xFD, 0x6B, 0x8A, 0xB1,
+ 0x9E, 0xEB, 0xA9, 0xFC, 0xAA, 0x10, 0xC9, 0x4D, 0x06, 0xAB, 0x53, 0x06, 0x2F, 0xF5, 0x7A, 0x94,
+ 0xFB, 0x45, 0x14, 0x52, 0x1D, 0xFD, 0xCD, 0x2C, 0xC7, 0x7B, 0x6D, 0x89, 0xCB, 0x50, 0xC4, 0x6D,
+ 0x89, 0x9D, 0x66, 0x66, 0xFA, 0x17, 0xD7, 0x03, 0xB4, 0x62, 0xAA, 0x6F, 0xEC, 0xB9, 0x33, 0xF1,
+ 0x2A, 0x7E, 0x53, 0x2C, 0x86, 0x41, 0xF2, 0x73, 0xE1, 0xC6, 0xFB, 0x6E, 0x0F, 0x5B, 0x31, 0x66,
+ 0xB3, 0x6C, 0x89, 0xC7, 0x49, 0x26, 0xE6, 0x1B, 0x22, 0xB1, 0x01, 0xC8, 0x00, 0x1D, 0xFF, 0xAF,
+ 0x3C, 0x5F, 0x48, 0xB3, 0x59, 0xCC, 0xAE, 0x96, 0x36, 0x30, 0xCB, 0xBF, 0x64, 0xEB, 0x7D, 0xC1,
+ 0xF0, 0x36, 0xA8, 0x0D, 0xD1, 0x5D, 0xAB, 0x31, 0x89, 0x8E, 0x40, 0x1D, 0xED, 0x84, 0xC9, 0x08,
+ 0x73, 0xB4, 0xFE, 0x20, 0xEF, 0x15, 0x25, 0xD1, 0xF8, 0xAA, 0x24, 0xF9, 0xCE, 0xEC, 0x2B, 0x38,
+ 0x30, 0x98, 0x97, 0x7A, 0x43, 0xEE, 0xFC, 0xCE, 0x1C, 0x90, 0x87, 0x48, 0x7D, 0x7F, 0x97, 0xDF,
+ 0x72, 0x18, 0x16, 0xD7, 0xD3, 0xD7, 0x65, 0xA1, 0xB5, 0xEC, 0xC2, 0xFC, 0x95, 0xC0, 0x34, 0x34,
+ 0x51, 0x15, 0xE5, 0x72, 0xDC, 0x9A, 0x56, 0x67, 0x01, 0xF8, 0x9C, 0x96, 0x12, 0x9E, 0xF4, 0xBD,
+ 0x5B, 0xBE, 0x17, 0xC2, 0xC2, 0x32, 0x6A, 0x0A, 0xD2, 0x4A, 0x0C, 0xF6, 0xAC, 0x33, 0x64, 0x48,
+ 0xE7, 0x36, 0x20, 0x99, 0x4A, 0xCA, 0xF2, 0xFC, 0xC7, 0x88, 0x34, 0x68, 0x15, 0xFC, 0x28, 0x2E,
+ 0xAC, 0xD2, 0x9E, 0xEE, 0x39, 0x7A, 0xC9, 0xB4, 0x88, 0x64, 0xEA, 0x1F, 0x21, 0xA2, 0x5C, 0x5F,
+ 0x29, 0xD1, 0x5B, 0xE9, 0x7E, 0x76, 0x24, 0x7A, 0x05, 0x00, 0xCF, 0x49, 0x0D, 0x51, 0x28, 0x65,
+ 0x07, 0x82, 0xC2, 0x9E, 0x13, 0xED, 0x4A, 0x86, 0xB6, 0xCA, 0x78, 0x15, 0xF0, 0x2C, 0x7A, 0xE5,
+ 0x00, 0xF5, 0x74, 0xFF, 0x2E, 0x50, 0x85, 0xE0, 0x72, 0xCA, 0xB1, 0x41, 0xC2, 0x88, 0x7F, 0x37,
+ 0x9F, 0x46, 0xB2, 0x1F, 0x20, 0x69, 0x7B, 0x1B, 0x44, 0xF6, 0x56, 0xD7, 0xDB, 0xDB, 0x58, 0x5D,
+ 0xF0, 0xDB, 0x11, 0x2B, 0x6E, 0x31, 0xE0, 0x95, 0x8C, 0xAC, 0x64, 0x7A, 0xDE, 0x40, 0x6B, 0xA4,
+ 0x78, 0x7A, 0xC1, 0xAB, 0x6A, 0x03, 0x4F, 0x88, 0x96, 0x0E, 0xF1, 0x14, 0x6B, 0x66, 0xB7, 0x9F,
+ 0x51, 0x25, 0x4F, 0x9A, 0x25, 0x19, 0xBA, 0xE2, 0x31, 0xC5, 0x6D, 0xB0, 0x11, 0x28, 0x1D, 0xAF,
+ 0x8B, 0xEB, 0x75, 0x69, 0x85, 0xB9, 0x27, 0x47, 0xB1, 0x84, 0x35, 0x19, 0xC6, 0xEB, 0xE9, 0x4E,
+ 0x3F, 0x61, 0xFD, 0xA4, 0xEE, 0xD2, 0xC0, 0x31, 0xEC, 0x22, 0x56, 0xE5, 0xB7, 0x22, 0x76, 0x34,
+ 0x2A, 0x75, 0xC1, 0x5D, 0x76, 0x7A, 0xFE, 0x4D, 0x48, 0x17, 0x53, 0xEA, 0xCD, 0x13, 0x09, 0xFF,
+ 0x04, 0x9D, 0xB1, 0x11, 0x70, 0xAF, 0x9B, 0x15, 0x1B, 0xB6, 0x81, 0xD4, 0xF6, 0x38, 0x72, 0x65,
+ 0xF5, 0xFB, 0x01, 0xF5, 0xB0, 0xD0, 0xBA, 0xCA, 0xF0, 0x8E, 0x94, 0x81, 0xB1, 0x39, 0xBD, 0x7F,
+ 0x3A, 0x33, 0x89, 0x04, 0xE5, 0x96, 0x7E, 0xF6, 0xFC, 0x48, 0xE5, 0x96, 0xCF, 0x05, 0xAE, 0x8F,
+ 0x3E, 0xDE, 0x30, 0x92, 0xB8, 0xE0, 0x20, 0x1B, 0x86, 0xC3, 0x12, 0xA8, 0xCA, 0xD8, 0xF3, 0xF5,
+ 0xBF, 0x55, 0x0D, 0x8B, 0x20, 0xC8, 0x96, 0xB8, 0x8E, 0x47, 0xCB, 0xC8, 0xE2, 0x73, 0xF9, 0x1A,
+ 0xFD, 0x07, 0x90, 0x71, 0xDB, 0xC4, 0xAF, 0xCE, 0xB4, 0xB6, 0x3A, 0x53, 0xCB, 0x1F, 0xCC, 0x67,
+ 0xE9, 0x9E, 0xD2, 0x82, 0x1F, 0xE0, 0x46, 0x46, 0xF8, 0xE6, 0x22, 0x01, 0xE7, 0x54, 0x66, 0xB3,
+ 0x66, 0x2E, 0xE3, 0x2B, 0x7E, 0x78, 0x6C, 0x68, 0x81, 0xDC, 0x9E, 0x6F, 0xCA, 0xD3, 0x25, 0x94,
+ 0x30, 0x84, 0x4F, 0x32, 0xD5, 0x37, 0x21, 0x2C, 0xF6, 0xCE, 0x85, 0x83, 0x21, 0x6F, 0xC9, 0x09,
+ 0xE5, 0x0A, 0xE4, 0x8C, 0x22, 0x66, 0xB9, 0x50, 0xFB, 0xE6, 0x97, 0xCF, 0x74, 0x8A, 0xC7, 0x67,
+ 0xCB, 0x38, 0xDA, 0x85, 0x47, 0x8B, 0xF0, 0x64, 0xF3, 0xFF, 0xA4, 0x91, 0x05, 0x7C, 0xE8, 0xED,
+ 0x6F, 0x9F, 0x93, 0x3E, 0x18, 0xA2, 0x4C, 0x68, 0x0C, 0x62, 0xEB, 0x6D, 0x3A, 0x45, 0x52, 0xBF,
+ 0x05, 0xC1, 0xB8, 0xB5, 0x0C, 0xBB, 0xCB, 0xF7, 0xA5, 0x88, 0xB4, 0x94, 0x00, 0x77, 0x92, 0x9D,
+ 0xA3, 0xFB, 0xC2, 0x04, 0x11, 0x4F, 0x8F, 0xA2, 0x22, 0xFB, 0xEC, 0x71, 0xCA, 0x5E, 0x3A, 0xC2,
+ 0x42, 0x1C, 0x2B, 0x74, 0xCE, 0x9E, 0x46, 0xF7, 0xEF, 0x48, 0x24, 0xCF, 0xBA, 0xE1, 0x0A, 0x92,
+ 0xC9, 0x59, 0xF5, 0x10, 0xD7, 0x25, 0x6E, 0xAB, 0x9B, 0xAB, 0xD4, 0xC6, 0x16, 0x98, 0x5B, 0x31,
+ 0x87, 0x39, 0x21, 0xA9, 0x09, 0x7F, 0x47, 0x0B, 0xF4, 0xFB, 0xA9, 0xFE, 0x60, 0x07, 0x1A, 0x31,
+ 0xEC, 0x48, 0x64, 0x0D, 0x73, 0x71, 0xDF, 0x78, 0xE6, 0xB1, 0x76, 0xD9, 0xE1, 0x4C, 0xCF, 0x80,
+ 0xBD, 0x58, 0x96, 0xAF, 0x3D, 0x3D, 0x82, 0x7B, 0xC0, 0x16, 0xD7, 0xD7, 0x8C, 0xBC, 0x5F, 0x91,
+ 0x30, 0xA3, 0x6C, 0x5D, 0x25, 0xCF, 0xAC, 0xA6, 0xEC, 0xCF, 0x42, 0x41, 0x05, 0xA4, 0x74, 0x2E,
+ 0x82, 0xBA, 0x21, 0x42, 0x95, 0xDF, 0xF2, 0xD6, 0x29, 0x5B, 0x04, 0xBD, 0x47, 0x8E, 0x47, 0xBA,
+ 0x3F, 0x99, 0x20, 0x4D, 0x74, 0x56, 0xD6, 0x43, 0x42, 0xC4, 0x36, 0x7D, 0x24, 0xE3, 0xC9, 0xD8,
+ 0x66, 0xAB, 0x3D, 0x62, 0xE2, 0xA9, 0x51, 0x3C, 0x9F, 0x1A, 0xA7, 0x6C, 0x7F, 0x4D, 0xC9, 0xEB,
+ 0x21, 0x66, 0xBB, 0x46, 0xA4, 0x97, 0x5E, 0x6D, 0xAD, 0xD4, 0x6F, 0xFB, 0xB1, 0xC6, 0x6F, 0x51,
+ 0x2F, 0x0A, 0x9A, 0x97, 0x8E, 0xBB, 0x80, 0xD7, 0x16, 0x70, 0xC4, 0x98, 0xEE, 0xB9, 0x69, 0x48,
+ 0x49, 0xA2, 0xBB, 0x93, 0x8B, 0xE6, 0x10, 0xCB, 0xC3, 0x8D, 0x57, 0x17, 0x0A, 0xFE, 0x1B, 0xB5,
+ 0x40, 0x06, 0x7D, 0xE4, 0x89, 0x76, 0x13, 0x01, 0xB1, 0x2E, 0x01, 0xD7, 0x20, 0x1D, 0x5B, 0xE9,
+ 0x5C, 0x11, 0x24, 0x78, 0xF5, 0x9F, 0x02, 0xF8, 0x8B, 0xA9, 0x0B, 0x22, 0x42, 0x66, 0x1A, 0xFE,
+ 0x15, 0xF7, 0x51, 0x93, 0xB7, 0xDB, 0x00, 0x52, 0x0A, 0xF0, 0x4A, 0xA8, 0xE1, 0xDF, 0xCE, 0x88,
+ 0xBF, 0x47, 0x47, 0x73, 0x48, 0x19, 0x89, 0x3B, 0xDD, 0xD2, 0x82, 0x14, 0xB4, 0x70, 0xF6, 0xF2,
+ 0xC1, 0x4D, 0x8B, 0x47, 0x74, 0x12, 0xC1, 0x42, 0x69, 0xE1, 0xFD, 0x25, 0x6F, 0x62, 0xF6, 0x41,
+ 0xF8, 0x60, 0x83, 0xB8, 0x91, 0x06, 0x09, 0x5D, 0x90, 0x2E, 0x52, 0xB3, 0xFC, 0x34, 0x86, 0xD7,
+ 0xC8, 0x27, 0x94, 0xA4, 0xB9, 0x32, 0x7E, 0xA0, 0xA4, 0xB4, 0xE5, 0x2F, 0x14, 0x37, 0x7B, 0xFA,
+ 0x9C, 0x15, 0xD0, 0xE2, 0x13, 0x4C, 0x62, 0x24, 0xE8, 0x0C, 0xDC, 0x52, 0x10, 0xC3, 0xCE, 0x6F,
+ 0xE5, 0x21, 0x57, 0xF3, 0x17, 0xD0, 0x0F, 0x67, 0x9D, 0x58, 0xEA, 0x84, 0x13, 0x9E, 0xE3, 0xEA,
+ 0xF6, 0xBC, 0x5C, 0x40, 0xCE, 0xCC, 0xAA, 0xE8, 0x5B, 0x41, 0x86, 0x68, 0xD7, 0xC3, 0x3B, 0x66,
+ 0xFB, 0x6B, 0xC1, 0xAE, 0x72, 0x29, 0xE6, 0x6C, 0x2A, 0x71, 0xB4, 0xC5, 0x4F, 0x69, 0xBA, 0x40,
+ 0x80, 0x58, 0x08, 0x4F, 0x8D, 0xE5, 0x69, 0x44, 0x1B, 0xC0, 0x3D, 0x97, 0xAB, 0x7D, 0x23, 0xF3,
+ 0x79, 0x40, 0x1A, 0x9D, 0x04, 0x98, 0x31, 0x6A, 0x5E, 0x6C, 0x59, 0x17, 0xEA, 0x34, 0xEC, 0x29,
+ 0xA2, 0x7D, 0xC9, 0x2B, 0x5B, 0x76, 0x9C, 0x15, 0x22, 0x67, 0x6C, 0x08, 0x33, 0x41, 0xC5, 0x46,
+ 0xA7, 0xA6, 0x0E, 0xEB, 0xFB, 0x92, 0x17, 0x41, 0xAF, 0x3B, 0x22, 0x96, 0xDE, 0x35, 0xD6, 0xB6,
+ 0x7C, 0xEF, 0x6B, 0xF6, 0x10, 0xFC, 0xE7, 0xBC, 0x38, 0xE2, 0xB7, 0xA6, 0x93, 0x1F, 0x12, 0x86,
+ 0xF7, 0x1F, 0xBE, 0x41, 0x42, 0xCC, 0xDB, 0xF8, 0x52, 0xCB, 0xFD, 0xFF, 0x40, 0xC1, 0x38, 0x50,
+ 0x6F, 0x72, 0x77, 0x2B, 0xB1, 0x27, 0xCD, 0x9A, 0x0F, 0x6B, 0x5D, 0x1E, 0xE7, 0x9A, 0xB9, 0xA4,
+ 0xA2, 0xC3, 0x8C, 0x2D, 0x73, 0xC1, 0xF9, 0x6B, 0x5E, 0x08, 0xD8, 0x8B, 0x1E, 0x05, 0x0A, 0x04,
+ 0xBD, 0x29, 0xE2, 0x57, 0x52, 0xF7, 0x21, 0xEE, 0x10, 0x36, 0x7E, 0x90, 0x09, 0x08, 0xA3, 0x44,
+ 0xE1, 0xCA, 0xCF, 0x59, 0x53, 0xDB, 0x6E, 0x65, 0x28, 0xEE, 0xF3, 0x60, 0xCB, 0x47, 0x83, 0x18,
+ 0xDC, 0x05, 0xAD, 0xCC, 0x04, 0x09, 0x91, 0x05, 0xAE, 0x96, 0x2F, 0x10, 0x0E, 0x50, 0x0C, 0xF0,
+ 0x57, 0xA8, 0xEE, 0x81, 0x89, 0x4C, 0x9B, 0x72, 0x13, 0xA1, 0xB9, 0x5A, 0x9E, 0x31, 0xB2, 0xA9,
+ 0x80, 0xA8, 0x51, 0xEA, 0x7E, 0x59, 0xA7, 0xB9, 0x7C, 0xBE, 0x82, 0x13, 0xC7, 0x30, 0xAE, 0xF9,
+ 0xF5, 0x22, 0x15, 0xE1, 0xC6, 0xC2, 0x06, 0xD9, 0xC9, 0xD9, 0xF4, 0x4C, 0xBF, 0x0A, 0x02, 0xD3,
+ 0x4C, 0x38, 0x28, 0x60, 0x52, 0xB9, 0xF7, 0x3C, 0xD9, 0x1C, 0x28, 0x98, 0x89, 0xAC, 0xBD, 0x81,
+ 0x17, 0x5E, 0x59, 0xF5, 0x55, 0xC7, 0xED, 0x58, 0x1F, 0x29, 0xE7, 0x57, 0xC1, 0x27, 0x0A, 0x7E,
+ 0x67, 0x00, 0x56, 0xD5, 0x93, 0x99, 0xA6, 0x8E, 0x7D, 0xB1, 0xA0, 0x17, 0x98, 0x88, 0xA8, 0x9D,
+ 0x2D, 0x27, 0x6B, 0x0C, 0x59, 0x5C, 0x0B, 0x3C, 0x6A, 0x3B, 0xFD, 0x44, 0x37, 0x18, 0xAA, 0x49,
+ 0xE7, 0xA1, 0xC1, 0x24, 0xCD, 0xB6, 0xA6, 0x2C, 0x4D, 0x38, 0x1D, 0x3A, 0x0B, 0xA6, 0x42, 0x84,
+ 0x48, 0x63, 0xCB, 0x5A, 0x74, 0xBF, 0x62, 0x3B, 0x5E, 0x55, 0x94, 0xC7, 0x52, 0x7D, 0xD1, 0xA6,
+ 0xFE, 0x3B, 0x1A, 0xE8, 0x80, 0x3D, 0x57, 0x9E, 0x03, 0xE4, 0xA7, 0xB0, 0x52, 0x84, 0x42, 0xC4,
+ 0x95, 0x63, 0xC9, 0xD2, 0x6E, 0xA9, 0x51, 0xE8, 0x51, 0x9C, 0xFB, 0x67, 0xD1, 0xF6, 0x37, 0xC2,
+ 0x56, 0x64, 0x95, 0x70, 0x07, 0x23, 0x0C, 0x79, 0x4C, 0x20, 0x52, 0x94, 0x68, 0x9B, 0xC3, 0x64,
+ 0x7A, 0xBC, 0xF6, 0x54, 0x97, 0xF0, 0xEB, 0x0F, 0x71, 0x8E, 0x69, 0x85, 0xCC, 0x2F, 0x2B, 0x2F,
+ 0xCF, 0x8D, 0xEA, 0x1A, 0x04, 0x37, 0x47, 0xDA, 0xFE, 0xCF, 0xD2, 0x5E, 0xA8, 0xE7, 0x03, 0x21,
+ 0xBA, 0xFE, 0x88, 0x21, 0x33, 0x17, 0xE3, 0x78, 0xB0, 0xE4, 0x71, 0x47, 0x1A, 0x88, 0x9B, 0x4F,
+ 0x5F, 0x38, 0xF8, 0x0F, 0x8F, 0x82, 0x04, 0x72, 0xDC, 0x1E, 0x7B, 0xB6, 0x90, 0x55, 0x19, 0xDE,
+ 0xD7, 0x0E, 0xE6, 0xED, 0xEE, 0x9A, 0x47, 0x5A, 0x63, 0xC4, 0xE6, 0x2A, 0x09, 0xB0, 0xC4, 0x0A,
+ 0xBA, 0x70, 0xF8, 0x18, 0x0F, 0xE1, 0x87, 0xAD, 0x41, 0xCE, 0xB9, 0x4B, 0x6E, 0xF1, 0x0B, 0x04,
+ 0xAC, 0x6A, 0x4F, 0x09, 0x40, 0xDE, 0x60, 0xF2, 0x10, 0xC7, 0xD8, 0x11, 0xFB, 0x58, 0x4D, 0x8C,
+ 0x6F, 0xD9, 0xF7, 0xA5, 0xC3, 0x13, 0x16, 0x39, 0x25, 0x5A, 0x01, 0xE5, 0x92, 0x06, 0x8A, 0x4A,
+ 0x89, 0xB5, 0x43, 0x7A, 0x39, 0xC2, 0x12, 0xCD, 0x45, 0x8B, 0x8E, 0x59, 0x1C, 0x4F, 0x72, 0xA6,
+ 0xEE, 0xA4, 0x88, 0x6F, 0x04, 0xE8, 0x68, 0xD1, 0xDC, 0x90, 0x41, 0x28, 0x8C, 0x2B, 0xC9, 0xF1,
+ 0x92, 0x08, 0xAC, 0x7F, 0x7E, 0xEE, 0x7A, 0x3F, 0x54, 0xFB, 0x45, 0x7F, 0x73, 0xF6, 0xE5, 0xE2,
+ 0xE4, 0x8C, 0x05, 0xA4, 0xAF, 0x63, 0x86, 0xB4, 0xA5, 0x6B, 0x33, 0x19, 0x00, 0x79, 0xB0, 0x73,
+ 0x2C, 0x89, 0xFC, 0x81, 0xDF, 0x7E, 0x5C, 0x59, 0x02, 0xF2, 0xFA, 0x52, 0x9C, 0x1E, 0xD4, 0xE5,
+ 0x56, 0x90, 0x56, 0x23, 0x3A, 0x7A, 0xFD, 0x6F, 0xB4, 0x98, 0x8D, 0x47, 0xD7, 0x4D, 0x84, 0xB9,
+ 0x2A, 0x09, 0xF2, 0x6C, 0xAB, 0x1C, 0x70, 0xD1, 0x01, 0xD5, 0x63, 0xF0, 0xDF, 0x3F, 0xCD, 0x27,
+ 0x94, 0x36, 0xB8, 0xE8, 0xB9, 0xAF, 0xB7, 0xDD, 0x41, 0xE1, 0x43, 0xC7, 0xE4, 0xF5, 0xA8, 0xB7,
+ 0xF4, 0x59, 0x91, 0x84, 0x96, 0x0A, 0x6E, 0x13, 0xA8, 0x43, 0x1C, 0xC1, 0x4A, 0xB6, 0x52, 0x6E,
+ 0x36, 0x21, 0x02, 0x18, 0x15, 0xB1, 0x65, 0xA5, 0xE1, 0x0F, 0xA5, 0x0C, 0xE1, 0xFF, 0xE2, 0x10,
+ 0xCC, 0xBB, 0xBD, 0x33, 0x91, 0x73, 0x7D, 0xA0, 0x16, 0x23, 0x39, 0x9B, 0x36, 0xCF, 0x94, 0x2F,
+ 0x7C, 0xA0, 0x63, 0xE8, 0x3C, 0xB8, 0xBE, 0xC5, 0x03, 0x3D, 0x1A, 0x3D, 0x97, 0x10, 0x7F, 0x79,
+ 0x7F, 0xCA, 0x94, 0x77, 0x30, 0x1A, 0x5B, 0x3A, 0xF1, 0xAF, 0xF1, 0xF4, 0x4F, 0x69, 0xA8, 0x0C,
+ 0x7B, 0x87, 0xED, 0x30, 0x99, 0xEE, 0xEE, 0xD5, 0xEF, 0x29, 0x1B, 0xB9, 0xC0, 0x4C, 0xF6, 0x46,
+ 0x46, 0xD9, 0x12, 0x9E, 0x73, 0xF6, 0x5C, 0x8F, 0x12, 0x14, 0xF1, 0xFC, 0x4C, 0x49, 0xE6, 0xDF,
+ 0xCD, 0x92, 0x82, 0xDC, 0xD6, 0xF1, 0x2D, 0x04, 0x27, 0x94, 0x55, 0xF5, 0x7E, 0xC5, 0x81, 0x4B,
+ 0x84, 0xB8, 0x6F, 0x43, 0xD4, 0x4E, 0x58, 0x44, 0x66, 0x31, 0xC8, 0xB4, 0xD4, 0x64, 0x37, 0x72,
+ 0xAA, 0x46, 0xD0, 0x7A, 0x49, 0x94, 0xEA, 0x1E, 0xF6, 0xED, 0x31, 0xE2, 0xCF, 0xD0, 0x12, 0x53,
+ 0x5F, 0xC4, 0xA9, 0xF4, 0x79, 0xD5, 0xB2, 0x2E, 0xD2, 0x7C, 0xC9, 0x12, 0xDE, 0xFA, 0xED, 0x9E,
+ 0x6B, 0xFB, 0x08, 0xBE, 0x61, 0x53, 0x96, 0x1A, 0xB8, 0x71, 0x2C, 0x5E, 0xE5, 0xF8, 0xAE, 0x68,
+ 0xF5, 0x39, 0x11, 0x53, 0xDD, 0x30, 0x4F, 0x49, 0xCB, 0x5E, 0x9C, 0x20, 0x2B, 0x99, 0x77, 0x8F,
+ 0xA8, 0x46, 0x5F, 0xD2, 0xBB, 0x31, 0x8E, 0x2C, 0x84, 0x60, 0x63, 0xEB, 0xE9, 0x0C, 0x20, 0x98,
+ 0xAA, 0x58, 0xF5, 0x75, 0xA0, 0x2E, 0xB2, 0x65, 0x79, 0xA2, 0xB9, 0xAB, 0xD9, 0xE8, 0xA6, 0xF3,
+ 0x1B, 0x34, 0x37, 0x75, 0xA4, 0xFF, 0x00, 0xF8, 0xA6, 0xF6, 0x26, 0xA4, 0xFF, 0x63, 0x14, 0xB9,
+ 0xA5, 0xD0, 0x12, 0x45, 0x08, 0x8C, 0x6E, 0x78, 0x0C, 0xC5, 0x75, 0xB8, 0xEC, 0x77, 0x73, 0xEA,
+ 0x87, 0x6F, 0xAD, 0x4D, 0x98, 0xCD, 0xC7, 0xA5, 0x20, 0xC3, 0x4E, 0x31, 0x79, 0x16, 0xB0, 0x2A,
+ 0x9A, 0x84, 0x02, 0xAA, 0x00, 0x60, 0xBB, 0x58, 0x84, 0xC6, 0x95, 0xF3, 0xF4, 0x6C, 0xEB, 0xD8,
+ 0xEC, 0x1A, 0xC3, 0x92, 0xD6, 0x09, 0x58, 0x56, 0xDB, 0x64, 0xF9, 0x00, 0x1A, 0x45, 0xF4, 0x2F,
+ 0x65, 0x71, 0x8C, 0xD0, 0x9B, 0xFA, 0x0B, 0x7E, 0xDF, 0x29, 0xF1, 0x91, 0xD5, 0x33, 0xF2, 0x46,
+ 0xC3, 0xBD, 0x30, 0xF8, 0x7E, 0x5A, 0xA7, 0x6A, 0x19, 0x88, 0xC3, 0xE3, 0x5B, 0x37, 0xA9, 0x4C,
+ 0x4F, 0xB3, 0xBD, 0xB8, 0x65, 0x57, 0xCB, 0xBE, 0x79, 0x82, 0x88, 0xDA, 0xB5, 0xAA, 0x9A, 0xD3,
+ 0x05, 0xFA, 0x7A, 0x7B, 0xC0, 0xB9, 0x33, 0xD0, 0xCE, 0x34, 0xEF, 0x43, 0x41, 0x36, 0x23, 0xD4,
+ 0x9C, 0x1F, 0x35, 0x70, 0xC4, 0x18, 0x87, 0x51, 0x7B, 0x9C, 0x8E, 0x24, 0x7C, 0x73, 0x9F, 0x6D,
+ 0xD6, 0x4B, 0xFA, 0x22, 0x1F, 0x99, 0x2E, 0x1F, 0xEE, 0x13, 0xB4, 0xA3, 0xE8, 0xCE, 0xF6, 0xF3,
+ 0x00, 0x9B, 0xE3, 0xDD, 0x0F, 0x8A, 0xCB, 0xC5, 0x49, 0xB1, 0xCA, 0x3F, 0x83, 0x96, 0xB4, 0xA3,
+ 0x37, 0x72, 0x43, 0xAD, 0x2A, 0x79, 0xAF, 0x7F, 0x56, 0x18, 0xB3, 0x95, 0xA2, 0x3B, 0x15, 0x8A,
+ 0x82, 0xFC, 0xED, 0xD1, 0xA1, 0x81, 0x44, 0x23, 0x88, 0x39, 0x89, 0xD8, 0x11, 0x8F, 0xAC, 0x62,
+ 0xCB, 0xC9, 0x9F, 0x88, 0x3C, 0xDD, 0xE8, 0x4B, 0xB4, 0xF4, 0x99, 0xC7, 0x9E, 0xD9, 0xB7, 0xBC,
+ 0x5B, 0x81, 0xD9, 0x0C, 0x1C, 0xA2, 0x8B, 0x36, 0x3C, 0xE2, 0xA9, 0xD4, 0x81, 0x2D, 0x5D, 0x72,
+ 0x5A, 0xBF, 0xB2, 0x62, 0x8E, 0x48, 0x74, 0x56, 0xB8, 0xB9, 0x48, 0x04, 0x53, 0xCA, 0x0F, 0x20,
+ 0x4E, 0x28, 0xD4, 0x0B, 0xC8, 0xE0, 0x3F, 0x09, 0xC5, 0x8F, 0x19, 0x99, 0xB3, 0x5F, 0xC4, 0xC7,
+ 0x5A, 0x65, 0xD6, 0x1F, 0x27, 0xB0, 0xD2, 0x28, 0x03, 0x7B, 0xAB, 0x62, 0x6C, 0xAA, 0x78, 0xA0,
+ 0x15, 0x00, 0xE8, 0x0E, 0xA8, 0x28, 0xAF, 0x1B, 0xCD, 0x1E, 0x5B, 0x09, 0x0E, 0x47, 0x10, 0xA8,
+ 0x67, 0x32, 0x1D, 0x05, 0x7D, 0xBB, 0x57, 0x81, 0x2B, 0xDB, 0x4B, 0x6A, 0x4F, 0xBF, 0x9E, 0x51,
+ 0x45, 0xC3, 0xCC, 0x70, 0xC6, 0x9E, 0x70, 0x30, 0x82, 0x65, 0xCE, 0x23, 0xCD, 0x6A, 0x4F, 0x3B,
+ 0xA5, 0x58, 0x69, 0xFE, 0x37, 0x27, 0xE6, 0x03, 0x0C, 0x99, 0x8D, 0x31, 0xF5, 0xC0, 0xC8, 0xAC,
+ 0x73, 0xCC, 0x48, 0x86, 0xC6, 0x4B, 0xC4, 0xE8, 0x13, 0x0A, 0xEE, 0xC0, 0x18, 0xC8, 0xE3, 0x01,
+ 0x9B, 0x2B, 0xB5, 0x64, 0x06, 0xA9, 0xB6, 0xFD, 0xC4, 0xC1, 0x5D, 0x42, 0x49, 0xEC, 0x83, 0x53,
+ 0x61, 0xAF, 0x7A, 0x8D, 0x8C, 0x1F, 0x7C, 0xBE, 0xE5, 0xA1, 0x2B, 0x8E, 0x20, 0x31, 0x4F, 0x37,
+ 0x6A, 0x88, 0xF8, 0xBF, 0x0C, 0xD9, 0xBA, 0x1B, 0xCB, 0xC7, 0x23, 0x81, 0x85, 0x47, 0x93, 0xD0,
+ 0xC0, 0x03, 0xBE, 0x2E, 0x3D, 0x89, 0xE3, 0x75, 0xAB, 0x5B, 0x32, 0x65, 0x83, 0x40, 0xBF, 0x16,
+ 0xA9, 0x25, 0xE5, 0x4A, 0xFD, 0x86, 0xD2, 0x5F, 0xA0, 0xCF, 0x1F, 0xFF, 0x63, 0xFF, 0x75, 0x2B,
+ 0xAF, 0x1A, 0x0B, 0x3A, 0x03, 0xE3, 0x2D, 0x04, 0x57, 0xDF, 0x56, 0x6D, 0x83, 0x61, 0x81, 0xC5,
+ 0xDB, 0x51, 0xDA, 0x70, 0x0B, 0x5D, 0x5B, 0x21, 0xB6, 0xF4, 0x20, 0x0E, 0x44, 0xFD, 0x7D, 0xA0,
+ 0xD8, 0x5A, 0xF4, 0x16, 0xF1, 0x69, 0x11, 0x6B, 0x13, 0x8F, 0xB3, 0xEC, 0x1E, 0x0C, 0x7D, 0x63,
+ 0xBF, 0x96, 0xDD, 0xA2, 0x80, 0x8F, 0xE7, 0x47, 0x57, 0x4B, 0xCA, 0xE5, 0xF1, 0xB2, 0x66, 0xB5,
+ 0xDC, 0x27, 0x75, 0x72, 0x49, 0x0C, 0x1E, 0x69, 0x6D, 0x3E, 0x31, 0xC4, 0x36, 0xCA, 0x3C, 0xE9,
+ 0x5B, 0xC5, 0xDA, 0x4E, 0x28, 0xBA, 0x12, 0x39, 0x40, 0x9E, 0x92, 0x3E, 0x77, 0x60, 0xC7, 0xDF,
+ 0x0F, 0xE7, 0xDC, 0x3B, 0x97, 0x39, 0xAF, 0x24, 0x49, 0xBA, 0xB0, 0xA2, 0x44, 0x04, 0x20, 0x3C,
+ 0xE6, 0x40, 0x87, 0x30, 0xC2, 0x27, 0x23, 0x69, 0x4F, 0xDE, 0x13, 0x94, 0x09, 0x15, 0xDB, 0x39,
+ 0xDC, 0x04, 0x07, 0xE3, 0x1B, 0x0E, 0xAA, 0x80, 0x0D, 0xA7, 0x58, 0x87, 0xDC, 0x0C, 0xC0, 0xDE,
+ 0x43, 0x81, 0x70, 0x55, 0x11, 0xC8, 0x69, 0x42, 0xA2, 0x72, 0x35, 0xC4, 0xB9, 0x51, 0x2A, 0xD9,
+ 0x19, 0xEE, 0x68, 0xE1, 0x86, 0x02, 0x58, 0x24, 0x8D, 0xE0, 0xF8, 0x0D, 0x19, 0x21, 0x24, 0xF7,
+ 0x23, 0x3D, 0x07, 0xA0, 0x52, 0xE3, 0xE4, 0x98, 0xA3, 0xFD, 0x25, 0x0C, 0x48, 0x26, 0xC2, 0x97,
+ 0xEB, 0x73, 0xFB, 0x00, 0x95, 0xF9, 0x12, 0x45, 0xD9, 0xA8, 0x41, 0xFE, 0xF0, 0xD7, 0x18, 0x7E,
+ 0x6E, 0x9A, 0xFA, 0x78, 0x15, 0xA6, 0x54, 0xB0, 0x3A, 0x8A, 0xFA, 0x8F, 0xD1, 0xE5, 0x22, 0xB9,
+ 0x19, 0x40, 0xC1, 0x19, 0xBA, 0x6B, 0xD5, 0x04, 0x67, 0x4E, 0x1C, 0xDA, 0x81, 0x16, 0x22, 0xE8,
+ 0xB4, 0x7C, 0x99, 0xB7, 0xDD, 0x6E, 0x19, 0x16, 0xAE, 0x11, 0x58, 0xE4, 0x03, 0xA1, 0xA2, 0x6C,
+ 0xDF, 0xF3, 0x1A, 0x88, 0x4B, 0xAF, 0x3F, 0xA2, 0xB0, 0x54, 0xE7, 0x68, 0xE1, 0x3B, 0xB7, 0x2F,
+ 0xFC, 0xB3, 0xE6, 0x80, 0x6F, 0x2B, 0x82, 0x7E, 0x15, 0x6E, 0x61, 0xD3, 0x5F, 0x25, 0xBB, 0xE2,
+ 0xF4, 0x41, 0xD1, 0xEB, 0x47, 0x8E, 0x50, 0x0F, 0x8E, 0x04, 0x80, 0xB5, 0xA7, 0x9E, 0xBB, 0x55,
+ 0x03, 0x69, 0x11, 0x98, 0xAD, 0x64, 0x4E, 0x65, 0x9C, 0xB2, 0x17, 0x2E, 0x0A, 0xD6, 0x4C, 0xD9,
+ 0x55, 0xF1, 0x12, 0x08, 0xB4, 0xB4, 0x4C, 0xDE, 0xE1, 0x27, 0x15, 0x66, 0x28, 0x27, 0x8E, 0xDE,
+ 0xCE, 0xF0, 0x86, 0x28, 0x2B, 0x11, 0x0B, 0x45, 0x27, 0x31, 0xE3, 0x3D, 0x01, 0x71, 0xBD, 0x20,
+ 0x4F, 0xE4, 0x03, 0xBB, 0xFA, 0x1B, 0x63, 0x63, 0x62, 0x4F, 0x0C, 0x9D, 0x47, 0x27, 0x97, 0x0B,
+ 0x0A, 0x53, 0x4E, 0x08, 0xDA, 0x55, 0xDD, 0x27, 0xEB, 0x7D, 0x3B, 0x04, 0x2E, 0x29, 0x8E, 0x40,
+ 0x2F, 0x6B, 0xCC, 0x05, 0xA8, 0x2A, 0x9E, 0x33, 0xF5, 0xB3, 0x82, 0x07, 0x8D, 0x2B, 0x16, 0xA1,
+ 0x8B, 0x6F, 0xB9, 0x06, 0x67, 0x8A, 0x4B, 0x9B, 0x7F, 0x92, 0x21, 0x66, 0x5F, 0x83, 0x57, 0x81,
+ 0xD1, 0x71, 0x02, 0x7C, 0x9E, 0xA1, 0xFB, 0x69, 0xF7, 0x7F, 0x57, 0xA7, 0x49, 0xB3, 0x86, 0xA2,
+ 0x21, 0x9C, 0x71, 0xB8, 0x39, 0x45, 0x12, 0x42, 0x41, 0xA4, 0xF3, 0x89, 0x80, 0xF5, 0x13, 0x2F,
+ 0x79, 0xDB, 0xA0, 0x0E, 0xED, 0x9A, 0x6A, 0xA0, 0x4C, 0x09, 0xC9, 0x92, 0xAC, 0x10, 0x2F, 0x10,
+ 0xDF, 0xE8, 0xCB, 0x1D, 0x0F, 0x0D, 0xE1, 0x2E, 0x62, 0x99, 0xAC, 0xCB, 0x52, 0xD2, 0x1B, 0xAF,
+ 0xB6, 0xB0, 0x78, 0xE0, 0x31, 0xDC, 0x6D, 0xBE, 0x7A, 0xF9, 0x02, 0xE1, 0x48, 0xE5, 0x14, 0xD8,
+ 0x90, 0x9C, 0xE6, 0xE3, 0xF6, 0x6D, 0x7B, 0xF3, 0xDB, 0x60, 0x00, 0x39, 0x38, 0xAB, 0xE7, 0x17,
+ 0xE9, 0x15, 0xC6, 0x3A, 0x7D, 0x40, 0xDF, 0xD9, 0x02, 0xDC, 0x83, 0x50, 0x76, 0xB0, 0x12, 0x16,
+ 0x11, 0x57, 0x1D, 0xC1, 0x22, 0xBC, 0x88, 0x46, 0xCB, 0x13, 0x5D, 0x8F, 0x8F, 0xED, 0xCD, 0xAE,
+ 0x15, 0xC0, 0x2D, 0xB0, 0x2C, 0xDA, 0xD7, 0x38, 0x35, 0x29, 0x2D, 0xF5, 0x0E, 0xF0, 0xD5, 0x96,
+ 0x74, 0x80, 0x96, 0xAB, 0x83, 0xAA, 0xA8, 0xA1, 0x55, 0xB4, 0x90, 0x35, 0x0F, 0x4F, 0x19, 0xF8,
+ 0x52, 0x8A, 0x81, 0x4A, 0xDB, 0x5F, 0x34, 0x25, 0xF9, 0xBB, 0x48, 0x8B, 0x66, 0x18, 0x64, 0x32,
+ 0xC2, 0xAE, 0x44, 0x8E, 0x7F, 0xB1, 0x7F, 0x3F, 0x09, 0x83, 0xB4, 0x21, 0xEF, 0xF6, 0x70, 0xF8,
+ 0xEB, 0xE6, 0x6A, 0xFB, 0x0B, 0x46, 0x23, 0x05, 0xE8, 0x6D, 0x2B, 0x82, 0x87, 0x89, 0xA6, 0x6D,
+ 0x53, 0x86, 0xD6, 0xAC, 0x0C, 0xD3, 0x6C, 0x3A, 0x77, 0x4F, 0x7F, 0xDD, 0x61, 0x47, 0x5C, 0x17,
+ 0x02, 0x79, 0x49, 0x15, 0xCC, 0xE7, 0x33, 0xF8, 0x01, 0x51, 0x64, 0x43, 0xD7, 0x00, 0x29, 0x15,
+ 0x69, 0xD2, 0xDA, 0xF6, 0x66, 0xE1, 0x65, 0xCA, 0x40, 0xB5, 0x8A, 0xE1, 0x0B, 0x1D, 0x54, 0x17,
+ 0xF6, 0x95, 0xD1, 0xFB, 0x21, 0xD9, 0x4B, 0x34, 0xD8, 0x0D, 0x44, 0xB7, 0xEF, 0x5A, 0x94, 0xFC,
+ 0xED, 0x74, 0x01, 0xED, 0x7B, 0x70, 0x52, 0x8D, 0xC9, 0xF2, 0x33, 0x61, 0x74, 0x83, 0xC5, 0x4D,
+ 0x72, 0x53, 0xFA, 0x68, 0xCA, 0xA3, 0x85, 0xEF, 0x8A, 0x7E, 0xEF, 0xEC, 0xF8, 0xAA, 0x22, 0x2D,
+ 0x53, 0xB2, 0xA5, 0xCE, 0x74, 0x3D, 0xF1, 0x87, 0xCE, 0xE7, 0xA0, 0xAE, 0xA6, 0x68, 0xB1, 0xA4,
+ 0xE1, 0x3F, 0x60, 0xBC, 0x9A, 0x05, 0xFF, 0x1F, 0xA4, 0x12, 0x7F, 0xC5, 0xE7, 0x86, 0x18, 0x8A,
+ 0x64, 0x94, 0xDB, 0xFC, 0xB2, 0x4C, 0xFB, 0x3E, 0x2A, 0xB0, 0xC5, 0x88, 0xFC, 0x00, 0x6A, 0x5E,
+ 0x33, 0x81, 0xD4, 0x40, 0x12, 0x44, 0xB0, 0x24, 0xA9, 0xE6, 0xFB, 0x95, 0xEF, 0x56, 0xF2, 0x4B,
+ 0xF0, 0x46, 0x8B, 0xBF, 0xE6, 0x8F, 0x77, 0x90, 0x0E, 0x3B, 0xDA, 0xCD, 0xDC, 0x6F, 0x78, 0x25,
+ 0x37, 0x23, 0x55, 0x3A, 0xBA, 0x35, 0x74, 0x41, 0x31, 0xE0, 0x34, 0xFF, 0x89, 0x14, 0x92, 0xCD,
+ 0x65, 0x6E, 0x22, 0x00, 0x6C, 0xFE, 0x1E, 0x73, 0x5C, 0x59, 0xC6, 0x88, 0x32, 0xFA, 0xC4, 0x9D,
+ 0x8F, 0xF0, 0x54, 0x6F, 0x64, 0xBC, 0x13, 0x44, 0x94, 0x04, 0x92, 0xDE, 0x30, 0xCA, 0x9E, 0xE8,
+ 0x20, 0x3A, 0x03, 0x43, 0xFD, 0xE1, 0x6B, 0x17, 0x09, 0xCC, 0xEC, 0x62, 0x3B, 0x10, 0x8E, 0x79,
+ 0x64, 0x15, 0x6C, 0x01, 0x09, 0x0F, 0x0D, 0x8E, 0x79, 0xBC, 0xD4, 0xE3, 0x01, 0x2C, 0xAF, 0x0C,
+ 0xF9, 0x5F, 0x53, 0xB8, 0xB0, 0x7E, 0x6D, 0xB9, 0x8D, 0x29, 0xC9, 0x3F, 0x1E, 0x82, 0xB8, 0xF0,
+ 0xEB, 0xDD, 0x6A, 0xB4, 0xB4, 0xAE, 0x74, 0xC6, 0x0B, 0x45, 0x12, 0xEC, 0x9D, 0xDD, 0x79, 0x94,
+ 0xC1, 0x2D, 0x4D, 0x3C, 0x25, 0x75, 0xA6, 0x2E, 0x7A, 0x52, 0xE1, 0x31, 0xA4, 0xDD, 0x4E, 0x1B,
+ 0xBC, 0x54, 0x83, 0x50, 0x27, 0xA1, 0xF9, 0xB0, 0xFF, 0xA1, 0x58, 0x71, 0xAD, 0x72, 0x05, 0xAB,
+ 0x90, 0xEC, 0x99, 0x63, 0x69, 0x7F, 0x81, 0xF3, 0xED, 0x31, 0x76, 0x52, 0x6C, 0x5D, 0x56, 0xFA,
+ 0x74, 0x29, 0xFA, 0x40, 0xD7, 0x78, 0x75, 0x29, 0x66, 0x28, 0x46, 0xB2, 0x01, 0xF6, 0xAE, 0x63,
+ 0x37, 0xA5, 0xF9, 0x9F, 0x0F, 0x08, 0x65, 0x27, 0x7D, 0x68, 0xB7, 0x28, 0xD6, 0x5F, 0x04, 0x5F,
+ 0xA8, 0x3F, 0x0D, 0x0B, 0x4E, 0x4B, 0x60, 0x7D, 0xCA, 0xA4, 0x2A, 0x20, 0x5C, 0xD3, 0x0B, 0x58,
+ 0xFF, 0x65, 0x6F, 0xCF, 0x5A, 0x75, 0x1A, 0xB7, 0x75, 0x62, 0x0E, 0xBF, 0xFA, 0xD0, 0xBF, 0xB9,
+ 0x14, 0xE9, 0x56, 0xE7, 0x2C, 0x3D, 0x2C, 0x7C, 0x5D, 0x7E, 0xA8, 0x4B, 0x7F, 0x6B, 0x94, 0x84,
+ 0x17, 0x8C, 0x90, 0x24, 0x06, 0xFD, 0xE0, 0xCE, 0xD7, 0x03, 0xAB, 0x29, 0x9A, 0xCE, 0x09, 0xAB,
+ 0xF0, 0x83, 0x20, 0x19, 0xC4, 0x08, 0xB5, 0x74, 0x45, 0x5C, 0xDB, 0x99, 0xF5, 0x3D, 0x2A, 0x9F,
+ 0x6A, 0xB6, 0x70, 0xBD, 0x6D, 0x9C, 0x8A, 0xF2, 0x18, 0x64, 0x13, 0x5D, 0x92, 0x09, 0x78, 0xD6,
+ 0x04, 0x2A, 0xFB, 0x75, 0xF7, 0x0D, 0xDE, 0x95, 0x81, 0x52, 0xB3, 0x69, 0xF0, 0x0F, 0x84, 0xA2,
+ 0xED, 0x02, 0xB5, 0x79, 0x98, 0x51, 0x66, 0x0B, 0xBD, 0x72, 0x6F, 0xAA, 0xFE, 0xAA, 0x1B, 0x03,
+ 0x4B, 0x3D, 0x24, 0x52, 0xCA, 0x81, 0x78, 0xFE, 0x91, 0xAF, 0x33, 0x90, 0x1D, 0x42, 0x9B, 0x1F,
+ 0xE0, 0x26, 0x39, 0x09, 0x2B, 0xBF, 0x41, 0xDD, 0xB4, 0x99, 0xF6, 0x39, 0x29, 0x5A, 0xF6, 0x20,
+ 0x46, 0xB2, 0x4C, 0x89, 0xF6, 0x87, 0xF0, 0x91, 0x2E, 0x3C, 0xE0, 0x91, 0x1E, 0x4F, 0x4E, 0x3E,
+ 0x49, 0xAB, 0x79, 0x55, 0xA5, 0x7D, 0xE7, 0xAA, 0x35, 0x31, 0x1B, 0xB1, 0x6F, 0x76, 0x30, 0xBC,
+ 0xC6, 0x3E, 0x6C, 0x9B, 0xAB, 0x99, 0x82, 0xB5, 0xA2, 0x37, 0xBD, 0xAC, 0x37, 0x39, 0xAB, 0xA9,
+ 0xCC, 0xD9, 0x65, 0xC6, 0x3D, 0x5E, 0x8B, 0x08, 0x0B, 0x0E, 0xAE, 0xA8, 0x44, 0xFC, 0x30, 0x26,
+ 0x92, 0x3A, 0xAB, 0x9E, 0xB5, 0x16, 0x85, 0xD8, 0xDA, 0x4E, 0x54, 0x36, 0x69, 0x8E, 0x4D, 0xB6,
+ 0x61, 0x83, 0xAF, 0x46, 0x5F, 0x17, 0x71, 0xF2, 0x7C, 0xD2, 0x53, 0xD0, 0xD7, 0xC3, 0x52, 0x6A,
+ 0x8A, 0x18, 0x40, 0xB6, 0x00, 0xD7, 0x0F, 0x41, 0x0B, 0xC1, 0xC5, 0xC0, 0xA6, 0x98, 0x59, 0x7C,
+ 0x45, 0x19, 0x11, 0xDA, 0x2C, 0xE3, 0xCE, 0x56, 0x9E, 0xBF, 0x85, 0xCE, 0xFA, 0xE5, 0x68, 0x66,
+ 0x06, 0xE6, 0x57, 0x58, 0x76, 0xAD, 0xB6, 0xC7, 0xFE, 0x2E, 0x2F, 0xA1, 0x62, 0x7D, 0x8C, 0xB9,
+ 0xC6, 0xBC, 0xF9, 0x0A, 0x84, 0x1A, 0xB7, 0xF6, 0x5C, 0x75, 0x00, 0x1F, 0xA0, 0x6B, 0xF9, 0x54,
+ 0x51, 0xB6, 0xBD, 0xA4, 0xC3, 0xDF, 0x25, 0x07, 0x93, 0x33, 0x6B, 0x8C, 0x7E, 0x7C, 0xC8, 0x16,
+ 0x78, 0x1A, 0xDA, 0xCA, 0x48, 0x4A, 0x7C, 0x61, 0xAD, 0xEE, 0x08, 0x51, 0xCB, 0xE4, 0x99, 0xB2,
+ 0x2A, 0x02, 0x6F, 0x0D, 0x86, 0x1C, 0xC1, 0xD5, 0x0C, 0x55, 0x91, 0xDE, 0x77, 0xF2, 0xE2, 0x96,
+ 0xEF, 0xD7, 0x39, 0x08, 0x42, 0x22, 0x6D, 0x2B, 0xA0, 0xE4, 0xA1, 0x38, 0x86, 0x4F, 0xE4, 0x1A,
+ 0xF2, 0x30, 0xCB, 0xD9, 0x38, 0x1E, 0xF0, 0x27, 0xAA, 0x1A, 0xA3, 0xD6, 0x2B, 0xC8, 0xE8, 0x5E,
+ 0x31, 0xBF, 0xEB, 0x3A, 0x68, 0xF2, 0x98, 0x94, 0xA0, 0x8A, 0x6E, 0x07, 0x2A, 0x81, 0xE7, 0x01,
+ 0xD3, 0x7C, 0xD8, 0x58, 0x19, 0x96, 0x53, 0xA8, 0x3C, 0x71, 0x0E, 0x4C, 0xFB, 0x24, 0x7D, 0x63,
+ 0x47, 0x61, 0x90, 0x94, 0x71, 0x18, 0x38, 0x35, 0x80, 0x03, 0x41, 0xD4, 0x3E, 0xA9, 0x27, 0xAE,
+ 0xB7, 0x0B, 0x9A, 0xD1, 0xDB, 0xC5, 0x1F, 0x38, 0x88, 0x73, 0xD2, 0x3C, 0xB0, 0x72, 0x60, 0x5C,
+ 0xFD, 0xF9, 0xD3, 0x3F, 0x90, 0x89, 0x2B, 0xE2, 0x6C, 0x08, 0x4E, 0xB6, 0x4E, 0xF1, 0x4F, 0x5D,
+ 0x82, 0x3C, 0xC6, 0x08, 0x96, 0xA3, 0xEB, 0xFF, 0xEC, 0xF4, 0xC5, 0xB1, 0xC7, 0x1B, 0xF3, 0x5E,
+ 0x67, 0x6F, 0x11, 0xA3, 0xAC, 0x18, 0xF8, 0xF3, 0x0F, 0x6A, 0x64, 0x02, 0x4F, 0xE2, 0xE4, 0x3A,
+ 0x2A, 0x20, 0x28, 0x5B, 0x5E, 0xAC, 0x83, 0x8C, 0xA3, 0xF1, 0x67, 0x0D, 0xBA, 0x8E, 0xEC, 0x25,
+ 0xDE, 0x7D, 0xEF, 0xCF, 0x2C, 0x06, 0x74, 0x9F, 0x9A, 0x38, 0x70, 0x8D, 0xD0, 0x3E, 0xEA, 0x90,
+ 0x5E, 0xD1, 0xAE, 0xDB, 0x03, 0xC7, 0x8A, 0xEF, 0x55, 0x54, 0x34, 0xB2, 0x15, 0x6F, 0x17, 0x60,
+ 0x31, 0xE4, 0x32, 0x27, 0xF3, 0x82, 0xAE, 0xFB, 0x9E, 0x6E, 0x25, 0x4A, 0x96, 0xFE, 0x23, 0x4E,
+ 0xFB, 0x46, 0xFC, 0xB8, 0x02, 0xAB, 0xD4, 0xD3, 0x1F, 0x0B, 0x23, 0x72, 0x10, 0xAD, 0x6F, 0x13,
+ 0x56, 0xB4, 0x95, 0x20, 0xD3, 0x5A, 0x48, 0xE0, 0xC4, 0xBB, 0x96, 0x4C, 0x52, 0xEA, 0x25, 0x9F,
+ 0xAE, 0xFE, 0x49, 0x3A, 0xA2, 0x54, 0x98, 0x53, 0x06, 0xD3, 0x1A, 0xC2, 0x6C, 0x5A, 0x6D, 0xD7,
+ 0x28, 0xDE, 0x54, 0xDC, 0xCC, 0x2D, 0x42, 0x48, 0x3D, 0x33, 0xA7, 0x9E, 0xEE, 0x9E, 0xAE, 0xAC,
+ 0x4D, 0x8B, 0x0D, 0x98, 0x03, 0xF0, 0x4D, 0xF9, 0x40, 0x62, 0x12, 0x38, 0x34, 0xA4, 0x81, 0xA3,
+ 0x51, 0xA2, 0xDB, 0x76, 0xDD, 0x33, 0xEA, 0x6B, 0xB1, 0x54, 0x6F, 0xCF, 0x42, 0x6C, 0xAB, 0x9D,
+ 0x15, 0x93, 0x3A, 0x0C, 0xEA, 0xD0, 0x0B, 0xBB, 0x77, 0xB1, 0xA0, 0x23, 0xDA, 0x15, 0x10, 0xA9,
+ 0x3E, 0xE6, 0x2F, 0x52, 0x41, 0x57, 0xA8, 0x86, 0xEB, 0x43, 0x96, 0x63, 0x8D, 0x98, 0xE2, 0xE3,
+ 0x8F, 0x2B, 0xA3, 0xB4, 0xAD, 0x2D, 0xDE, 0x72, 0xF0, 0x08, 0xBB, 0x19, 0x42, 0xFB, 0xA4, 0x56,
+ 0x13, 0xEF, 0xF5, 0xE0, 0x6D, 0x2F, 0x9D, 0x87, 0x81, 0x2C, 0xCB, 0xC9, 0x72, 0x21, 0x27, 0xB5,
+ 0x23, 0xB2, 0x9F, 0xC4, 0x0F, 0x4E, 0xBA, 0x9C, 0xF4, 0x86, 0xBE, 0xC7, 0x9C, 0xF9, 0x53, 0xA7,
+ 0xE1, 0x99, 0xB0, 0xF0, 0xF9, 0x35, 0x47, 0x00, 0xB9, 0xC4, 0xED, 0x11, 0x21, 0x5A, 0x48, 0xAE,
+ 0x71, 0xC7, 0xD3, 0xFC, 0x78, 0xBB, 0x69, 0xEA, 0x9A, 0xEA, 0x60, 0x2A, 0x8D, 0xE8, 0x16, 0x33,
+ 0x80, 0x2F, 0x38, 0xEF, 0x9E, 0x09, 0x18, 0x2D, 0xCF, 0x0F, 0xD5, 0x23, 0x8A, 0xF2, 0xE0, 0x2E,
+ 0x68, 0x97, 0x4F, 0x24, 0xCE, 0xD9, 0xD8, 0xC4, 0xAE, 0xCC, 0x97, 0x56, 0x01, 0x0A, 0x2B, 0x3A,
+ 0x42, 0x6D, 0xB4, 0x04, 0xA2, 0x4A, 0x78, 0x77, 0x9F, 0xC2, 0x1E, 0x25, 0x2C, 0x2F, 0x69, 0xC1,
+ 0x3D, 0x4C, 0xB2, 0x8C, 0x9A, 0x02, 0xB8, 0x20, 0x4E, 0xBD, 0x7B, 0x65, 0xFC, 0x7A, 0xDE, 0x24,
+ 0x30, 0x2A, 0xF2, 0x79, 0xD1, 0x5E, 0x45, 0x7D, 0x6D, 0x6B, 0x93, 0xDC, 0xF3, 0x2A, 0xF4, 0x40,
+ 0x6B, 0xE0, 0x08, 0x09, 0xD0, 0x2E, 0x9A, 0xCA, 0x64, 0x42, 0x63, 0xF7, 0x7B, 0x8D, 0x16, 0x49,
+ 0x8F, 0x02, 0xEB, 0x22, 0xCB, 0x8B, 0xB3, 0xE1, 0x3F, 0x10, 0x89, 0xAE, 0x02, 0x72, 0xA0, 0x1A,
+ 0x5E, 0xE4, 0xDD, 0x82, 0x72, 0x50, 0x6A, 0x05, 0xAB, 0x2A, 0xFE, 0xCA, 0x27, 0x4F, 0xF7, 0xC6,
+ 0xBE, 0xDE, 0xC4, 0x7D, 0x0F, 0xF4, 0x5C, 0x38, 0x50, 0xDC, 0x37, 0xF3, 0x13, 0xCA, 0x54, 0x56,
+ 0x30, 0x2F, 0xFF, 0xB1, 0xBC, 0xD1, 0xED, 0x19, 0xA4, 0xFC, 0x84, 0xB0, 0x9E, 0xC3, 0x5A, 0xA7,
+ 0x63, 0x43, 0x7C, 0x8A, 0x06, 0x4D, 0x04, 0x72, 0x16, 0x6B, 0x22, 0xA6, 0x74, 0x0E, 0x12, 0x47,
+ 0x5E, 0xA1, 0x74, 0x72, 0xEE, 0x65, 0x95, 0x8E, 0x30, 0x6B, 0xBF, 0x92, 0xE6, 0x3E, 0xA0, 0xB8,
+ 0x86, 0x55, 0x54, 0xC8, 0x0A, 0x20, 0xA9, 0xE9, 0xAE, 0x5B, 0x47, 0x2E, 0xCE, 0x0A, 0xD5, 0x4B,
+ 0xAF, 0x22, 0xA0, 0x23, 0x3E, 0x4E, 0x77, 0xA7, 0x64, 0x01, 0x15, 0x47, 0x28, 0x6A, 0xD1, 0x90,
+ 0xCD, 0x32, 0x74, 0x7A, 0x02, 0x80, 0xEA, 0x91, 0x2E, 0x6B, 0x22, 0x52, 0x68, 0xC2, 0x40, 0x19,
+ 0xCE, 0xB7, 0x9A, 0xA2, 0xB3, 0x8A, 0xF5, 0xD8, 0xD8, 0x7B, 0x3E, 0x23, 0xA9, 0x33, 0x56, 0x06,
+ 0x1C, 0x74, 0x73, 0x93, 0x3E, 0x97, 0x5C, 0x41, 0x4D, 0x3F, 0xFF, 0x97, 0xD8, 0x94, 0x29, 0xAF,
+ 0x06, 0xD9, 0xC3, 0xF1, 0xD6, 0x8D, 0xA7, 0xEE, 0xAA, 0x26, 0xF7, 0x4F, 0x43, 0x5E, 0x60, 0x8D,
+ 0x0B, 0xD5, 0xAA, 0xD9, 0x89, 0x79, 0x04, 0x7B, 0xC3, 0x90, 0x1A, 0xDF, 0xA7, 0xB1, 0xBA, 0xC5,
+ 0xCA, 0xAB, 0x0C, 0xB8, 0xE8, 0xF0, 0x45, 0xDC, 0x85, 0xB5, 0x3B, 0xAC, 0xA7, 0xB2, 0x5C, 0x25,
+ 0x52, 0x90, 0x0D, 0x4C, 0xEF, 0xFF, 0x06, 0x0F, 0xEE, 0x0F, 0x8A, 0xE9, 0x93, 0x60, 0x3D, 0x8D,
+ 0x47, 0xC7, 0x55, 0xD9, 0x23, 0xAF, 0x77, 0xDB, 0x01, 0x69, 0xBA, 0x3D, 0x9B, 0x62, 0x74, 0x44,
+ 0x8E, 0x65, 0x40, 0x66, 0x3E, 0xDF, 0x54, 0x45, 0x8F, 0xF5, 0xA8, 0x8F, 0xD6, 0x51, 0x42, 0xDE,
+ 0x9D, 0x02, 0xDB, 0x90, 0xD3, 0x93, 0x8C, 0xE0, 0x0E, 0xFA, 0x11, 0xCF, 0xA9, 0xBD, 0x94, 0xDA,
+ 0x0F, 0x94, 0x33, 0xF7, 0xA8, 0x80, 0x62, 0x61, 0xAC, 0xE6, 0x1E, 0xC6, 0x80, 0x55, 0x9D, 0x7C,
+ 0x5B, 0xB8, 0xB3, 0x67, 0xBB, 0x69, 0xA6, 0x6D, 0xE1, 0x42, 0xD6, 0x81, 0x4E, 0x13, 0x68, 0xC0,
+ 0x6B, 0x01, 0xE8, 0x0F, 0xFB, 0xD4, 0x07, 0x08, 0xC7, 0x33, 0xAB, 0x3A, 0x68, 0x23, 0x14, 0x86,
+ 0xC7, 0x76, 0x13, 0xD5, 0x38, 0xF6, 0x4C, 0x91, 0x3E, 0x4F, 0x10, 0xC3, 0x7A, 0xD0, 0x9B, 0xF6,
+ 0x58, 0x42, 0xD5, 0x12, 0x5A, 0xCE, 0x58, 0x1A, 0xB0, 0xBF, 0x27, 0x96, 0xFA, 0xE5, 0x8C, 0x43,
+ 0xF7, 0xDE, 0xBD, 0x5F, 0xE3, 0x79, 0x69, 0xDC, 0x57, 0xA5, 0x12, 0x27, 0x77, 0x61, 0x5E, 0x97,
+ 0xD4, 0x6F, 0xF6, 0x6E, 0x5B, 0x46, 0x98, 0x8F, 0x06, 0xC9, 0x58, 0xAB, 0x2D, 0x02, 0x8C, 0x93,
+ 0x61, 0x7F, 0xDF, 0x14, 0xB1, 0xEC, 0xFD, 0x97, 0xFE, 0x80, 0xD5, 0xCA, 0x08, 0x57, 0x23, 0x9F,
+ 0x49, 0x3A, 0xE3, 0x56, 0xD8, 0x5A, 0x3C, 0x52, 0x5A, 0x4B, 0xC0, 0x8C, 0xB3, 0x79, 0xD7, 0xC4,
+ 0xFD, 0x48, 0xF3, 0xEA, 0x4C, 0x40, 0xF9, 0x36, 0x15, 0x47, 0x3B, 0x14, 0x48, 0x51, 0xF0, 0xC6,
+ 0xBB, 0x30, 0xBB, 0x80, 0xA3, 0x5C, 0x6F, 0xBD, 0xA1, 0x4E, 0xEC, 0x71, 0x52, 0x44, 0x98, 0xB2,
+ 0x82, 0x49, 0x2D, 0xEB, 0x61, 0x22, 0xEE, 0xFC, 0x60, 0xCB, 0x01, 0x53, 0xAA, 0xFD, 0x9A, 0xC8,
+ 0x1B, 0xE9, 0xE4, 0x8C, 0x2C, 0x3C, 0xC8, 0x0A, 0x82, 0xCA, 0x3C, 0x92, 0xB5, 0x96, 0xDA, 0xF1,
+ 0x41, 0x76, 0x8D, 0x19, 0xED, 0x3B, 0xEE, 0x44, 0xB0, 0xD2, 0xB3, 0xE9, 0xD5, 0x8E, 0xD5, 0x70,
+ 0x67, 0x72, 0xD0, 0x33, 0x2B, 0xFC, 0x50, 0x83, 0x1A, 0x72, 0xAE, 0xFE, 0xF0, 0x87, 0x07, 0xD7,
+ 0x19, 0x97, 0xDB, 0x95, 0xEF, 0xDD, 0xBB, 0xEC, 0x3F, 0xC8, 0x08, 0xBB, 0x87, 0x5C, 0xB2, 0x51,
+ 0x3F, 0xEE, 0x27, 0xF4, 0xA8, 0x2C, 0x6C, 0x3B, 0x0C, 0xB9, 0x7C, 0xFB, 0x75, 0xA3, 0xAE, 0x1C,
+ 0xFD, 0x1F, 0x99, 0xF2, 0x5F, 0x30, 0x16, 0x0B, 0x24, 0xB7, 0x02, 0xE5, 0xDD, 0x59, 0x8E, 0x98,
+ 0x92, 0x1E, 0xDB, 0x6C, 0x6E, 0xCF, 0x51, 0x81, 0xE0, 0xF5, 0x32, 0xAD, 0x5F, 0xCC, 0xA1, 0x91,
+ 0x5F, 0x2E, 0xAC, 0xA0, 0xB1, 0x9B, 0x2F, 0xAF, 0x7E, 0x8E, 0x30, 0x76, 0x82, 0xE3, 0x74, 0x01,
+ 0x2C, 0x2C, 0xB3, 0xB3, 0xAD, 0xC3, 0x3B, 0x2C, 0x45, 0xB3, 0x40, 0x97, 0x4B, 0xEB, 0xFD, 0xC6,
+ 0x55, 0xD9, 0x66, 0x0A, 0x4F, 0x3F, 0xB4, 0xE6, 0x01, 0x68, 0x9F, 0x20, 0xEC, 0x97, 0xBE, 0x6C,
+ 0x09, 0xFF, 0x26, 0x09, 0x3D, 0x66, 0x0F, 0x19, 0x2C, 0xAF, 0xBD, 0xA2, 0xF4, 0xEA, 0xD1, 0xF6,
+ 0x37, 0x64, 0x8A, 0x9E, 0x9A, 0x79, 0xFC, 0x20, 0xEC, 0x5B, 0x58, 0x74, 0x8A, 0xD7, 0x78, 0x8E,
+ 0x1F, 0xBF, 0xEC, 0x78, 0xC0, 0x65, 0xE8, 0xD8, 0x4A, 0x72, 0xEB, 0x13, 0x4C, 0xD8, 0xE9, 0x7B,
+ 0xEC, 0x48, 0x00, 0x33, 0x69, 0x92, 0xDC, 0xE9, 0xBE, 0xE5, 0xC7, 0xCE, 0x56, 0x2E, 0x9B, 0xD3,
+ 0x4D, 0xFD, 0xE7, 0x68, 0xE1, 0xCE, 0x18, 0x8D, 0xD0, 0x92, 0x39, 0xE1, 0x69, 0x83, 0x55, 0x54,
+ 0x62, 0xE8, 0x26, 0x8B, 0xAB, 0xA0, 0xAC, 0xB2, 0xFD, 0xB2, 0xBB, 0xB0, 0xD4, 0x1B, 0xC8, 0x2F,
+ 0xA8, 0x9E, 0x9B, 0x24, 0x56, 0xB8, 0x6E, 0xEE, 0x2F, 0x36, 0x2E, 0xD4, 0x2B, 0x9A, 0x2C, 0x00,
+ 0xE1, 0x18, 0x67, 0xD6, 0x13, 0x35, 0xF2, 0x8F, 0x77, 0x88, 0x36, 0x40, 0x1F, 0x7B, 0x18, 0x6C,
+ 0x2B, 0xE6, 0x0E, 0x26, 0x30, 0x98, 0x71, 0x20, 0xE1, 0xA5, 0xF4, 0x94, 0x36, 0xEF, 0x73, 0x52,
+ 0x59, 0xF2, 0x87, 0x67, 0xFD, 0xBA, 0x55, 0x40, 0xBE, 0x3B, 0x3B, 0x25, 0x89, 0x40, 0x73, 0xBA,
+ 0x60, 0xAF, 0x50, 0xBE, 0xEA, 0xC3, 0x31, 0x34, 0x32, 0x71, 0xE4, 0xEC, 0x0E, 0x24, 0x9D, 0x46,
+ 0x56, 0x33, 0xC7, 0x01, 0x94, 0xA5, 0x51, 0xD1, 0xC6, 0xDB, 0xCA, 0x26, 0x8D, 0x89, 0xAF, 0xA9,
+ 0x89, 0x7F, 0x26, 0xFB, 0x67, 0x92, 0x73, 0x39, 0x1A, 0x1A, 0x1C, 0x4E, 0xEB, 0x72, 0x68, 0x92,
+ 0x9F, 0x71, 0x35, 0x13, 0x38, 0x36, 0xF8, 0x0D, 0xBF, 0x95, 0x9F, 0x35, 0x00, 0x79, 0x47, 0x41,
+ 0x62, 0x23, 0xBA, 0xF4, 0xCA, 0xC6, 0x12, 0x7C, 0x96, 0x9D, 0xB8, 0x40, 0x4F, 0x7E, 0x31, 0x01,
+ 0x1E, 0xC7, 0xFD, 0x49, 0xB9, 0xC2, 0x2B, 0x35, 0x24, 0x2A, 0x13, 0x89, 0x62, 0x63, 0xBA, 0x6C,
+ 0xA8, 0x93, 0x6D, 0x99, 0xED, 0x9C, 0xE9, 0xB0, 0xF1, 0x8C, 0x9D, 0xA9, 0xEF, 0xDE, 0xF0, 0x92,
+ 0x1A, 0x3B, 0xA9, 0x94, 0x38, 0x87, 0xA2, 0x53, 0x65, 0x31, 0xAE, 0x0C, 0x96, 0x64, 0xAC, 0xC8,
+ 0xF8, 0x03, 0x65, 0x59, 0x5A, 0xAF, 0xD7, 0x8B, 0x0B, 0x31, 0xD9, 0x3A, 0x2F, 0x1C, 0xE3, 0x49,
+ 0xF3, 0xFA, 0x80, 0x9D, 0x34, 0x0D, 0xC0, 0xCE, 0xBB, 0x6E, 0x90, 0x6E, 0xA5, 0xA7, 0x0D, 0xB4,
+ 0xB8, 0x04, 0x6A, 0xD6, 0x0C, 0x95, 0x79, 0x9E, 0x27, 0x43, 0xDD, 0xD1, 0x8E, 0x8F, 0xE0, 0x19,
+ 0xB5, 0xBF, 0xD9, 0x25, 0xEE, 0xBB, 0x3E, 0x79, 0x0D, 0x9E, 0x0B, 0x03, 0x3D, 0x09, 0x9C, 0xF1,
+ 0x02, 0x0A, 0x81, 0x7B, 0xCE, 0x95, 0x44, 0x99, 0x72, 0xC5, 0x18, 0x4B, 0xD4, 0x9E, 0x5E, 0x8B,
+ 0x2D, 0x5F, 0x1E, 0x13, 0xF1, 0x95, 0xCA, 0x37, 0x75, 0x49, 0x7D, 0x3A, 0x1A, 0x22, 0x02, 0xAC,
+ 0x3E, 0xFE, 0x62, 0xF9, 0x59, 0xB7, 0x11, 0x82, 0xB6, 0x55, 0x82, 0xC7, 0x13, 0xB7, 0x83, 0x8C,
+ 0x1E, 0x90, 0xB4, 0x3D, 0x9B, 0x57, 0xE7, 0x1F, 0x4E, 0xB1, 0x70, 0xF4, 0x9E, 0x06, 0x3B, 0x97,
+ 0xF4, 0xC1, 0xBA, 0x3D, 0xAD, 0x50, 0x01, 0x21, 0xBB, 0x0F, 0xE1, 0x60, 0x49, 0x25, 0x5A, 0x0F,
+ 0xA3, 0x24, 0x33, 0x97, 0xA4, 0xA2, 0x8D, 0xFE, 0x9E, 0x17, 0x7D, 0x42, 0x3D, 0x40, 0xBB, 0xE5,
+ 0xFB, 0xB2, 0xCA, 0x2C, 0x93, 0x38, 0x13, 0xEA, 0x5C, 0xEB, 0x53, 0xFD, 0xFE, 0xD1, 0x2C, 0xB8,
+ 0xF6, 0xE2, 0x0C, 0xDF, 0xFA, 0x93, 0x2C, 0x25, 0x5C, 0x63, 0x07, 0x27, 0x11, 0x4E, 0x5E, 0xFA,
+ 0xD0, 0x9D, 0x2E, 0xE3, 0x85, 0xA8, 0xC5, 0x8B, 0x7B, 0xFE, 0xA0, 0x9C, 0xFE, 0xFE, 0xE5, 0x69,
+ 0xD8, 0x59, 0xAA, 0x52, 0x40, 0x71, 0x6B, 0x1D, 0x51, 0xDA, 0x13, 0x48, 0xEC, 0xCE, 0x1E, 0x2A,
+ 0xE5, 0x70, 0x66, 0xB1, 0x1F, 0xA6, 0x65, 0x3E, 0x99, 0x8E, 0x4B, 0x4D, 0x7C, 0x75, 0xB1, 0x46,
+ 0x51, 0x07, 0x6E, 0x31, 0x7E, 0xE7, 0x5D, 0xE7, 0x66, 0xA6, 0x6F, 0x65, 0x4E, 0xBD, 0xEF, 0x1E,
+ 0xEC, 0x90, 0x36, 0xFA, 0xDB, 0x73, 0x5F, 0x54, 0x68, 0x9A, 0xFD, 0xD9, 0x3D, 0xF0, 0xDC, 0xD5,
+ 0xA3, 0xBF, 0x45, 0xBD, 0x24, 0x7D, 0xB5, 0xC4, 0xC5, 0x63, 0x5F, 0xBC, 0x4C, 0x19, 0x1A, 0xA3,
+ 0x84, 0x71, 0xBD, 0x63, 0x8B, 0x85, 0x71, 0x30, 0x2C, 0x00, 0x76, 0x90, 0xDB, 0x44, 0xFC, 0x86,
+ 0x40, 0x10, 0x4C, 0x4F, 0x9E, 0xFB, 0xC9, 0xF3, 0x61, 0xED, 0x6A, 0x37, 0x7F, 0x76, 0x1E, 0x8D,
+ 0xB2, 0x30, 0x2B, 0xC1, 0x9F, 0x00, 0xF0, 0x54, 0x60, 0x13, 0x74, 0x87, 0x83, 0x90, 0xCD, 0xF3,
+ 0x78, 0xD7, 0x84, 0xA2, 0xCA, 0x47, 0x7F, 0x10, 0xD8, 0xC5, 0xEA, 0xA4, 0xA7, 0x53, 0x47, 0xEF,
+ 0x43, 0x44, 0xA4, 0xEB, 0xD4, 0x73, 0xB9, 0x08, 0xB1, 0x06, 0xD5, 0xD1, 0xF5, 0x9D, 0x92, 0x2C,
+ 0xA2, 0x6C, 0x69, 0x68, 0xF6, 0xD2, 0xEF, 0x35, 0x1F, 0x91, 0xC8, 0x8F, 0x78, 0xF5, 0x2D, 0xB4,
+ 0x83, 0x2C, 0x97, 0x3F, 0xF3, 0x51, 0x42, 0xE7, 0x8C, 0xE0, 0xDC, 0x01, 0x34, 0x66, 0x05, 0x9A,
+ 0x61, 0x6E, 0x90, 0x5F, 0x0C, 0xCD, 0xC9, 0x74, 0x8F, 0x5B, 0xA0, 0x40, 0xB6, 0xAF, 0x48, 0xAA,
+ 0xD9, 0xFA, 0x06, 0x6D, 0xCE, 0x4E, 0x0E, 0x62, 0x8E, 0xF3, 0x23, 0xEB, 0xF5, 0xE5, 0x22, 0x50,
+ 0x74, 0x06, 0x05, 0xA3, 0x00, 0xD7, 0x5C, 0x5E, 0x68, 0x1B, 0x0F, 0xB1, 0x38, 0xB0, 0x46, 0xE1,
+ 0x7B, 0xB7, 0xA1, 0x0F, 0x7B, 0x9A, 0xC2, 0xA3, 0x78, 0x03, 0xD5, 0xA7, 0x93, 0xB1, 0x76, 0xE8,
+ 0xB5, 0x32, 0x8E, 0x5A, 0x2E, 0xA3, 0xCC, 0xC7, 0x6B, 0xAD, 0x88, 0xB1, 0x7C, 0x68, 0xC8, 0x1A,
+ 0x09, 0xAC, 0x19, 0xA1, 0x7F, 0x00, 0xB1, 0xC2, 0xAB, 0x1F, 0x81, 0x29, 0x7A, 0x5C, 0xF1, 0x55,
+ 0xF9, 0x96, 0x52, 0x5E, 0x8C, 0x57, 0x65, 0xDA, 0x5B, 0xC6, 0x0E, 0xB1, 0xC6, 0x0F, 0x50, 0x9C,
+ 0x61, 0x20, 0x7A, 0x62, 0x68, 0x53, 0x4E, 0xF9, 0x40, 0xA4, 0xD4, 0x66, 0xF8, 0xC7, 0x0B, 0xE6,
+ 0x09, 0xA6, 0xBD, 0xBF, 0xA3, 0x57, 0x5E, 0xD6, 0xA1, 0x84, 0x49, 0x05, 0x54, 0x69, 0xC7, 0xA4,
+ 0x67, 0x08, 0x37, 0x3A, 0xD3, 0xD3, 0x43, 0x8E, 0xD3, 0xD1, 0xBF, 0xBD, 0x6A, 0x8D, 0x3A, 0x14,
+ 0x76, 0x6F, 0x04, 0xDE, 0x69, 0x0D, 0xD5, 0x07, 0xF4, 0xEA, 0x36, 0x28, 0x9E, 0x54, 0x47, 0x25,
+ 0x7D, 0x02, 0x54, 0x53, 0xFC, 0x68, 0x72, 0x77, 0xE4, 0x9E, 0x6B, 0xF7, 0xAC, 0xD2, 0xBF, 0xA7,
+ 0xC5, 0x3C, 0xF6, 0x99, 0xEB, 0xC7, 0xA3, 0x11, 0x33, 0xB6, 0xB6, 0x62, 0x4A, 0x3B, 0x93, 0xC2,
+ 0xF6, 0xC7, 0xF1, 0x7B, 0x3F, 0x6D, 0x2D, 0x12, 0x4B, 0x46, 0xC3, 0xC2, 0xC7, 0x5F, 0xDE, 0xC0,
+ 0xFD, 0x5E, 0xCD, 0x3B, 0xD1, 0x4C, 0x41, 0x77, 0x0A, 0x77, 0x3A, 0xA8, 0xB1, 0xEF, 0x02, 0x49,
+ 0x54, 0xA2, 0x3B, 0xA7, 0x79, 0xEF, 0x2B, 0x56, 0x32, 0x7E, 0x81, 0x71, 0xA6, 0x99, 0x53, 0x8D,
+ 0xBF, 0x07, 0x9A, 0x4B, 0x70, 0x7F, 0x1D, 0x84, 0x99, 0xCE, 0x0C, 0x4F, 0x7A, 0x99, 0xBA, 0x94,
+ 0x52, 0xFE, 0x06, 0xDE, 0x2A, 0xF1, 0xDF, 0x75, 0x45, 0x38, 0x25, 0xD9, 0xC4, 0x6A, 0xF1, 0x5B,
+ 0x2B, 0xA3, 0x50, 0x00, 0x68, 0xE7, 0x9C, 0xBC, 0x90, 0xDB, 0x38, 0xF7, 0xEC, 0xBD, 0xDB, 0x1B,
+ 0x77, 0xFF, 0xF8, 0xB8, 0xDB, 0xE8, 0xE5, 0x7F, 0x71, 0xF1, 0x9B, 0x83, 0x98, 0xF3, 0xE2, 0x4E,
+ 0xA6, 0xBD, 0xE7, 0xD7, 0xD2, 0xBF, 0xB1, 0x89, 0x54, 0x3D, 0x36, 0xF0, 0x4E, 0x85, 0x5F, 0x14,
+ 0xE3, 0x58, 0x5B, 0x24, 0x86, 0x75, 0x8D, 0x98, 0x0C, 0xBA, 0x5D, 0x26, 0x62, 0xC4, 0xC2, 0x84,
+ 0xA6, 0xF9, 0x9B, 0x42, 0x0F, 0xA1, 0x8D, 0x39, 0xF1, 0x67, 0xCE, 0xE7, 0xB8, 0x70, 0x24, 0xB8,
+ 0xE6, 0x82, 0xE8, 0xC7, 0xF6, 0x7B, 0xFE, 0xD8, 0x38, 0xCF, 0x1D, 0x0D, 0xEA, 0x7D, 0xBB, 0x65,
+ 0x61, 0x9B, 0xFA, 0xA2, 0xB8, 0xA7, 0x9B, 0xAD, 0x76, 0x0B, 0x93, 0x00, 0x5E, 0x43, 0x10, 0x4A,
+ 0x5F, 0x22, 0xCA, 0x74, 0x8E, 0xEC, 0x2B, 0xB4, 0x68, 0x44, 0x2C, 0x95, 0x4A, 0xDA, 0xDA, 0xC5,
+ 0xBE, 0x8B, 0xFF, 0x4C, 0xC2, 0x0A, 0x74, 0xE0, 0x6E, 0x45, 0xBD, 0xD5, 0x0A, 0x50, 0xB1, 0x33,
+ 0x8D, 0x57, 0xE8, 0xF0, 0x78, 0x6D, 0x05, 0x2B, 0x9C, 0x56, 0xC7, 0xB7, 0xE4, 0x66, 0xB8, 0x72,
+ 0x90, 0x92, 0xC0, 0x07, 0x7B, 0x18, 0xB1, 0x14, 0x6A, 0x64, 0xEE, 0xC1, 0x9F, 0x0D, 0xB4, 0x1D,
+ 0xE7, 0xF1, 0x17, 0x49, 0xB1, 0x84, 0xD9, 0x26, 0xA5, 0x9A, 0xFA, 0xF1, 0xA3, 0x55, 0xC2, 0xAA,
+ 0xF5, 0xBE, 0x49, 0xF6, 0x6C, 0x67, 0x93, 0x04, 0x0A, 0xE3, 0xC0, 0xA1, 0x72, 0x8B, 0xE7, 0x05,
+ 0xEA, 0x70, 0xEF, 0x27, 0xF4, 0xC0, 0xE3, 0xBE, 0x57, 0xA3, 0x66, 0xAF, 0x83, 0x04, 0x0E, 0xAD,
+ 0x08, 0x77, 0x1F, 0xA4, 0x1C, 0xA5, 0xF5, 0xED, 0x03, 0xB4, 0x0E, 0xDA, 0xEC, 0xFD, 0x9D, 0x8B,
+ 0x81, 0x5C, 0xDF, 0xAE, 0x5D, 0xEC, 0x08, 0x94, 0x78, 0xA4, 0x0F, 0x1A, 0x75, 0x0B, 0x32, 0xE2,
+ 0x9F, 0x0B, 0xDF, 0xD4, 0x5D, 0xFE, 0xF8, 0x43, 0x5E, 0xC5, 0xC0, 0x8C, 0xBC, 0xAB, 0xDE, 0x33,
+ 0x38, 0xA0, 0x76, 0x86, 0x94, 0xF0, 0xF0, 0x40, 0xD4, 0x3F, 0x82, 0xED, 0x3F, 0x2C, 0x5A, 0x6F,
+ 0xB3, 0xE9, 0x4C, 0x5D, 0xE5, 0xAB, 0xD5, 0xAB, 0x89, 0x9D, 0x0A, 0x37, 0x9F, 0xC0, 0x84, 0xF6,
+ 0x81, 0xB7, 0x9B, 0x5C, 0x1A, 0xC4, 0x40, 0x06, 0x29, 0xC6, 0x62, 0xCE, 0x07, 0x1B, 0x13, 0xBA,
+ 0x81, 0xDF, 0xEE, 0xF9, 0xD3, 0xE7, 0xC1, 0x9A, 0x7C, 0x43, 0x0E, 0x83, 0xB0, 0x4E, 0xCD, 0x8E,
+ 0xB4, 0x34, 0xBF, 0xEF, 0x74, 0x4D, 0xE0, 0xF4, 0xB3, 0x25, 0x93, 0xAC, 0xCE, 0x20, 0x7B, 0x22,
+ 0x6E, 0xAA, 0x75, 0x14, 0xCA, 0xA8, 0x09, 0x2A, 0xCE, 0xE0, 0x57, 0x5E, 0x3A, 0xCA, 0xF5, 0x11,
+ 0x5D, 0xC6, 0x08, 0x6D, 0xB1, 0xD8, 0x4C, 0x90, 0x4A, 0x5A, 0x4B, 0x1F, 0x98, 0xD6, 0x87, 0xF2,
+ 0xD5, 0x82, 0x86, 0x16, 0xA5, 0x01, 0xEA, 0xFC, 0x78, 0xF3, 0xF9, 0xE2, 0x3C, 0x74, 0xC4, 0xFC,
+ 0x9B, 0x8D, 0x2C, 0x36, 0x87, 0xE6, 0x57, 0x8C, 0x5D, 0xEA, 0x8F, 0x96, 0x85, 0x9A, 0xEF, 0x18,
+ 0x34, 0x36, 0xC0, 0x46, 0x7C, 0x77, 0xD6, 0xBF, 0x25, 0xA2, 0xE7, 0x95, 0xFA, 0x82, 0xDD, 0x11,
+ 0x2B, 0xAC, 0x9D, 0xB8, 0x7B, 0x21, 0xB7, 0x51, 0xFC, 0x21, 0x24, 0xA5, 0x20, 0xD4, 0x89, 0xF0,
+ 0xFF, 0x31, 0x1B, 0x3E, 0x29, 0x10, 0x00, 0xFA, 0xEA, 0x6E, 0xA7, 0xA0, 0x4E, 0x1E, 0x21, 0xDF,
+ 0x7F, 0x84, 0x16, 0x77, 0x8B, 0xF1, 0xFE, 0xAB, 0x4E, 0xBD, 0xF4, 0xA1, 0x2B, 0xA3, 0x8B, 0x7A,
+ 0x46, 0xF2, 0xD3, 0x92, 0x23, 0xBB, 0x23, 0x30, 0x10, 0x7A, 0x69, 0x38, 0x6C, 0xBA, 0xF3, 0xBD,
+ 0xDF, 0xF6, 0xCE, 0xC7, 0x9A, 0xA7, 0x20, 0xB8, 0xE9, 0xE6, 0x14, 0xEE, 0xFD, 0x3E, 0x89, 0xF8,
+ 0x93, 0x6F, 0x7B, 0xDE, 0xD9, 0xB4, 0x3A, 0xED, 0xA9, 0x4B, 0x05, 0x2E, 0x4F, 0xE4, 0x07, 0x0F,
+ 0x45, 0x3F, 0x95, 0x62, 0x6C, 0x4B, 0x23, 0xA3, 0xBF, 0x74, 0x13, 0x16, 0xFD, 0x88, 0xDB, 0xF8,
+ 0xC6, 0xB1, 0xA6, 0x72, 0x20, 0xCC, 0xE2, 0x67, 0x92, 0x30, 0xE0, 0x2C, 0xAF, 0xDA, 0xD9, 0x27,
+ 0x92, 0x01, 0x97, 0xAB, 0xBE, 0xCB, 0x2C, 0x0D, 0x01, 0x67, 0x3F, 0xE3, 0x7A, 0x5B, 0xE0, 0x06,
+ 0x08, 0xB3, 0x25, 0x4E, 0x78, 0x80, 0x76, 0x67, 0xFB, 0x4C, 0xD0, 0x5E, 0xFD, 0x5A, 0x64, 0xD7,
+ 0x0C, 0x09, 0xC2, 0x21, 0x57, 0x06, 0x63, 0x5A, 0x59, 0x2E, 0xF1, 0x3F, 0x09, 0x0D, 0x60, 0xDF,
+ 0xED, 0xDA, 0xA7, 0x75, 0x70, 0xB7, 0xD7, 0x0A, 0x66, 0x2D, 0xAC, 0xB8, 0x2F, 0xA3, 0x96, 0x19,
+ 0xB0, 0x5B, 0x29, 0x9C, 0x6E, 0x50, 0xC0, 0x00, 0x14, 0xC5, 0x3B, 0xA3, 0x6C, 0x3A, 0x6A, 0xAB,
+ 0x97, 0x96, 0x47, 0x72, 0xE7, 0x21, 0x74, 0x8F, 0xD9, 0xB4, 0xCE, 0xDC, 0x81, 0x6E, 0x48, 0x96,
+ 0x59, 0xB7, 0xC9, 0xF3, 0x99, 0xD0, 0x8D, 0x10, 0x3B, 0x69, 0xD0, 0xF5, 0xA7, 0x31, 0x9D, 0xA8,
+ 0x36, 0x63, 0xB6, 0xBC, 0x8A, 0xC9, 0x03, 0x3A, 0xCC, 0xDC, 0xFA, 0x9A, 0xAB, 0x47, 0xC4, 0x19,
+ 0x83, 0xD6, 0xD3, 0x1F, 0x6E, 0x60, 0xD9, 0xCC, 0x98, 0xE5, 0x53, 0xC6, 0xC3, 0xE8, 0xA7, 0xF3,
+ 0xB9, 0xF1, 0xAC, 0xA9, 0xB9, 0x05, 0x47, 0x46, 0x21, 0x3F, 0x0C, 0xCC, 0x60, 0x5C, 0xF8, 0x9E,
+ 0xA8, 0x42, 0x5D, 0xD9, 0xC8, 0xF3, 0x9E, 0x75, 0xAD, 0x22, 0x68, 0x67, 0x37, 0xF2, 0x8F, 0xD1,
+ 0x7C, 0x5D, 0x07, 0xD8, 0x69, 0x6C, 0x34, 0xF0, 0x7E, 0x71, 0x47, 0x29, 0xA1, 0x8D, 0x07, 0x3F,
+ 0x60, 0x75, 0xC8, 0x16, 0xEF, 0x11, 0xE3, 0xFD, 0x48, 0x35, 0xED, 0xCA, 0x2C, 0x37, 0xCF, 0xEA,
+ 0x37, 0x6D, 0xA0, 0xFF, 0x7A, 0x46, 0x15, 0x41, 0x6B, 0xE3, 0x40, 0x6F, 0x27, 0x02, 0xA4, 0x2B,
+ 0x34, 0x0B, 0x07, 0xE3, 0x69, 0x4E, 0xF3, 0xF3, 0xAC, 0x4A, 0xA7, 0xE4, 0xBB, 0x4E, 0x8E, 0xAF,
+ 0xC0, 0x76, 0x9B, 0xD3, 0xB1, 0x93, 0xF3, 0x87, 0x38, 0x7B, 0x0B, 0x84, 0xFA, 0xDA, 0x85, 0x32,
+ 0x06, 0x7C, 0xFD, 0x2E, 0xF0, 0x90, 0x31, 0xAE, 0x3E, 0x9B, 0xBF, 0x0A, 0xDF, 0xA4, 0xA9, 0x3B,
+ 0x43, 0x16, 0x31, 0x04, 0xD6, 0x2F, 0x9F, 0x7A, 0x79, 0xD5, 0x79, 0x5D, 0x1C, 0x4A, 0x6A, 0x19,
+ 0x2A, 0xD0, 0x05, 0x69, 0xFE, 0xAC, 0x78, 0x41, 0xE7, 0xEA, 0xE7, 0xDD, 0x23, 0xA7, 0x7C, 0x59,
+ 0x7F, 0x6B, 0xDA, 0x30, 0x77, 0x16, 0xE8, 0x02, 0x3D, 0xB4, 0x4D, 0xB3, 0xCC, 0x41, 0x56, 0x05,
+ 0x1F, 0xD7, 0x07, 0x0B, 0x5B, 0x30, 0x6C, 0x45, 0x7E, 0x41, 0xE4, 0x79, 0x0B, 0x5A, 0x17, 0xF5,
+ 0xD6, 0x30, 0x9E, 0xAC, 0x2F, 0x6F, 0x99, 0x18, 0x4E, 0x11, 0x39, 0xF4, 0x29, 0x55, 0x82, 0x08,
+ 0xF8, 0x2D, 0xE6, 0x06, 0xE8, 0x2D, 0x62, 0xD5, 0x66, 0xB4, 0x5E, 0x62, 0x96, 0x16, 0xA6, 0xD8,
+ 0x69, 0x04, 0x23, 0x35, 0xD0, 0x4F, 0xA0, 0x7F, 0xC5, 0xE4, 0x49, 0x6C, 0x64, 0x4A, 0xD8, 0xC3,
+ 0x4D, 0x51, 0xBC, 0x49, 0x12, 0x76, 0x8A, 0xEC, 0xB2, 0x03, 0x93, 0xB8, 0x2D, 0x42, 0x91, 0x09,
+ 0xAE, 0xC2, 0x50, 0xD2, 0x72, 0x3A, 0x11, 0x26, 0xF8, 0x43, 0x2A, 0xD5, 0x13, 0x4E, 0x4D, 0x1E,
+ 0x28, 0xE5, 0xAF, 0xCC, 0xCE, 0x6D, 0x4A, 0x06, 0xB4, 0x2E, 0xF7, 0x40, 0x89, 0x33, 0x61, 0x11,
+ 0x7A, 0x4C, 0x75, 0xC5, 0x7D, 0x2E, 0xDB, 0x1D, 0xE7, 0xA0, 0xD7, 0x96, 0xDD, 0x37, 0xF3, 0x48,
+ 0x62, 0xBB, 0xAF, 0xB2, 0x2C, 0x56, 0x99, 0x20, 0x45, 0x1A, 0x20, 0x96, 0x6F, 0x5E, 0x74, 0x7B,
+ 0x04, 0xDA, 0x67, 0x05, 0x0F, 0x4D, 0xFC, 0x7E, 0xE0, 0x65, 0x13, 0xDB, 0x06, 0x5E, 0x50, 0x93,
+ 0xA4, 0xA2, 0x1D, 0x10, 0x7D, 0x61, 0x25, 0x3D, 0x19, 0xCD, 0xC9, 0x51, 0xE2, 0xF1, 0x6A, 0xBC,
+ 0xCF, 0x7D, 0xB3, 0x0F, 0x77, 0x98, 0x7A, 0x09, 0x9C, 0x40, 0x03, 0x48, 0x17, 0xE2, 0x75, 0x10,
+ 0x59, 0xAC, 0x9F, 0x4A, 0xEC, 0x63, 0x0F, 0xD9, 0x3A, 0x75, 0x0D, 0xCD, 0xD4, 0x4E, 0x7F, 0xA5,
+ 0xE3, 0xFB, 0xA3, 0x5E, 0x0A, 0x6E, 0xD2, 0xD8, 0x05, 0x3D, 0x84, 0x20, 0x5E, 0xCE, 0xBE, 0xFC,
+ 0x9A, 0x29, 0x85, 0x08, 0xD6, 0x07, 0x07, 0x4B, 0x01, 0x60, 0x07, 0xE7, 0xF5, 0x83, 0x9E, 0x35,
+ 0x12, 0xEF, 0xDD, 0xA6, 0x97, 0x51, 0xD1, 0x39, 0x11, 0x22, 0x45, 0xB0, 0x5D, 0xCA, 0x29, 0x69,
+ 0x12, 0xE3, 0x0C, 0xA7, 0x41, 0x57, 0x99, 0xF2, 0xD9, 0x05, 0xAD, 0x87, 0xDE, 0xC7, 0x2C, 0xB3,
+ 0x2B, 0x63, 0x87, 0x9F, 0xC5, 0xEE, 0xAB, 0xF5, 0x2A, 0xF1, 0x9B, 0x54, 0xB6, 0x54, 0xC0, 0x41,
+ 0x88, 0x6E, 0x54, 0x63, 0x85, 0xD3, 0xFB, 0xED, 0xAD, 0x45, 0xEE, 0x91, 0xD3, 0x65, 0x4E, 0x5D,
+ 0xF7, 0xE1, 0xF9, 0x56, 0x29, 0x12, 0x9D, 0x3C, 0xFE, 0x91, 0x76, 0xBE, 0x49, 0xD5, 0x62, 0x61,
+ 0x24, 0x4F, 0x5C, 0x6B, 0x9A, 0xFC, 0xD2, 0x31, 0x98, 0x24, 0xA5, 0x5A, 0x7A, 0x98, 0xF5, 0x0B,
+ 0xFE, 0xD4, 0x44, 0xF1, 0xE2, 0x88, 0xE7, 0x00, 0xA7, 0x56, 0xD6, 0xC9, 0xC8, 0x0C, 0x66, 0x20,
+ 0xCC, 0x92, 0x3B, 0x8A, 0x50, 0x65, 0x09, 0x61, 0x54, 0x06, 0xA3, 0x7D, 0x73, 0xFB, 0x9E, 0x45,
+ 0xD8, 0x67, 0x0F, 0x79, 0xF6, 0xF9, 0xAB, 0x72, 0x61, 0xA0, 0x36, 0xE2, 0x95, 0x32, 0x58, 0xE6,
+ 0x47, 0xA6, 0x53, 0x27, 0x68, 0x36, 0xB5, 0x4B, 0x59, 0x61, 0x08, 0xEA, 0xE9, 0xE8, 0x0A, 0x24,
+ 0xFD, 0x96, 0x5A, 0x02, 0xDB, 0xC2, 0xB4, 0x88, 0xF2, 0x15, 0x3C, 0xDC, 0xEF, 0x51, 0x34, 0x43,
+ 0xD2, 0xF4, 0x9D, 0x9E, 0xD4, 0x5C, 0x98, 0x5B, 0xB2, 0xB8, 0x70, 0x39, 0x26, 0x5E, 0x8D, 0xAD,
+ 0x9B, 0x37, 0x18, 0xB9, 0x74, 0xAC, 0xC6, 0xD0, 0x07, 0x1D, 0x13, 0x20, 0x66, 0x36, 0x28, 0x52,
+ 0x62, 0xD9, 0x36, 0x54, 0xAE, 0x14, 0xF4, 0x62, 0x50, 0xA5, 0x96, 0x9B, 0xBE, 0xB8, 0x33, 0xFB,
+ 0xD3, 0xDC, 0xB3, 0x74, 0x90, 0x2B, 0x3B, 0xAC, 0x27, 0xD8, 0x83, 0x8E, 0xF9, 0x6D, 0x35, 0x42,
+ 0xD5, 0x60, 0x46, 0x33, 0x93, 0xF8, 0xB4, 0x77, 0xB0, 0xBF, 0xCD, 0xAE, 0x33, 0x9C, 0x8A, 0x7A,
+ 0x06, 0x33, 0x05, 0x0C, 0x27, 0x61, 0x30, 0x31, 0x13, 0xD3, 0x15, 0xB1, 0x7C, 0x23, 0x22, 0x99,
+ 0xFF, 0x47, 0xB4, 0xA2, 0x1D, 0x39, 0x9A, 0xE1, 0x52, 0xCC, 0x1A, 0x53, 0xF3, 0xA4, 0xE7, 0x2A,
+ 0x4A, 0x12, 0xE5, 0xA4, 0x8D, 0x0D, 0xC4, 0xA6, 0xFE, 0x4F, 0x45, 0x2D, 0x2C, 0xA2, 0x64, 0x39,
+ 0x41, 0xA5, 0xC0, 0xB7, 0x84, 0xA5, 0x98, 0x67, 0x2A, 0xA9, 0x2D, 0x7B, 0xAF, 0x8E, 0xDC, 0xE3,
+ 0x58, 0xAA, 0x17, 0x5B, 0xC3, 0x69, 0xE7, 0x88, 0x64, 0xB8, 0x72, 0x5A, 0xA5, 0xCD, 0x07, 0x27,
+ 0x1B, 0xC3, 0x37, 0x99, 0x9B, 0x57, 0xE7, 0x1F, 0x32, 0xED, 0xB5, 0xD6, 0x39, 0x5C, 0x40, 0x03,
+ 0x6A, 0x20, 0x51, 0xC3, 0x4E, 0x39, 0x9C, 0x5F, 0x75, 0x2B, 0xFF, 0xCA, 0xA1, 0x43, 0x83, 0xC3,
+ 0xA8, 0x5F, 0x0E, 0xC5, 0xBD, 0x88, 0xE6, 0xA9, 0x89, 0x07, 0x60, 0xA1, 0x21, 0x76, 0xF7, 0xBE,
+ 0x65, 0xBC, 0x31, 0x59, 0x88, 0x00, 0xE5, 0xA7, 0xE3, 0x7A, 0x61, 0xE6, 0x87, 0x5C, 0x4E, 0xD1,
+ 0x29, 0xDE, 0xD6, 0x4B, 0xCF, 0x64, 0x93, 0x31, 0xE9, 0x72, 0x91, 0x9F, 0xB3, 0x1E, 0x6E, 0x98,
+ 0x1D, 0xF5, 0x8F, 0xFA, 0xFD, 0x7C, 0xA1, 0x16, 0x39, 0x76, 0x15, 0x52, 0x99, 0x40, 0x5A, 0x2E,
+ 0x40, 0x71, 0x06, 0x53, 0xA9, 0x85, 0x98, 0x67, 0x5D, 0x38, 0x45, 0x50, 0xAF, 0xA3, 0x27, 0x46,
+ 0x12, 0xCF, 0x79, 0xC9, 0x20, 0x39, 0xE9, 0x37, 0xBE, 0xD1, 0xC3, 0x8A, 0xFA, 0x7E, 0x6D, 0x34,
+ 0x79, 0x64, 0x9F, 0x57, 0x78, 0xF1, 0xD2, 0x61, 0x2E, 0xD4, 0x80, 0x3B, 0xF3, 0x13, 0x9E, 0x05,
+ 0x18, 0x0A, 0x5C, 0x7B, 0x2E, 0xAA, 0xB8, 0xA6, 0xCB, 0x11, 0x85, 0x48, 0xBA, 0x78, 0x7B, 0x3A,
+ 0x8E, 0x1A, 0x91, 0xB7, 0x97, 0x61, 0xB5, 0x8E, 0xEB, 0xD4, 0x46, 0xE1, 0x68, 0x2E, 0x66, 0xC6,
+ 0x8F, 0xF3, 0xCA, 0x29, 0x5B, 0x7E, 0xAA, 0x22, 0x71, 0xCA, 0x8A, 0xBB, 0xD5, 0x0D, 0x14, 0xA5,
+ 0x98, 0xD7, 0x63, 0x60, 0xC2, 0x9A, 0x30, 0xD6, 0x5A, 0xE8, 0xCC, 0xFA, 0xCC, 0x06, 0x08, 0x63,
+ 0x1E, 0x16, 0x4C, 0x3D, 0xF5, 0x68, 0xDD, 0xDC, 0xE2, 0xFB, 0xDE, 0x3F, 0x90, 0xD6, 0x7B, 0xC5,
+ 0x09, 0xF7, 0x34, 0x5A, 0x23, 0xA0, 0x45, 0x88, 0x5C, 0x86, 0xA6, 0x12, 0x70, 0x1D, 0xF4, 0x3D,
+ 0xAE, 0xFC, 0x44, 0xA7, 0xB2, 0xBE, 0x3F, 0xEA, 0xC0, 0xA2, 0x28, 0x6C, 0x91, 0xA3, 0xB7, 0xE9,
+ 0xF6, 0x8F, 0x60, 0x29, 0xDA, 0x89, 0xF5, 0x95, 0x85, 0x2C, 0x4D, 0x09, 0xDF, 0x54, 0xC8, 0x96,
+ 0xB5, 0xD4, 0x18, 0xA8, 0xCC, 0xCD, 0x3F, 0xDF, 0x70, 0x2B, 0xD9, 0x28, 0xBC, 0x51, 0x44, 0x02,
+ 0x11, 0xE9, 0x5D, 0xDB, 0xF0, 0x25, 0x68, 0xD3, 0x2F, 0x7E, 0x17, 0x0B, 0x76, 0x31, 0xF9, 0x8E,
+ 0x46, 0x5B, 0x22, 0xB9, 0xB3, 0xBF, 0xDE, 0x24, 0x06, 0x28, 0x37, 0x2A, 0xB6, 0x3D, 0xBA, 0x4D,
+ 0xD8, 0x8F, 0xE0, 0x5D, 0x39, 0x52, 0xA0, 0x2F, 0xE1, 0xDD, 0x8B, 0x91, 0x84, 0xC2, 0xDA, 0x38,
+ 0x2D, 0x61, 0xE0, 0x31, 0x03, 0x8D, 0xE5, 0xCF, 0xDC, 0x74, 0x88, 0x7C, 0x0C, 0xF6, 0x89, 0x99,
+ 0x73, 0xD1, 0x7C, 0x06, 0xC1, 0x4B, 0xDE, 0xC0, 0x66, 0x53, 0xB5, 0xA8, 0x2E, 0xF7, 0x03, 0xE6,
+ 0x88, 0x8D, 0xC3, 0x46, 0x0C, 0xCA, 0xE3, 0x03, 0xA3, 0xEE, 0xA9, 0x4C, 0x3F, 0xAF, 0x81, 0x06,
+ 0x2C, 0xAF, 0x0D, 0x43, 0x2C, 0xF4, 0x9B, 0x42, 0xC0, 0x7B, 0x8B, 0xE5, 0x89, 0xB7, 0x43, 0xA2,
+ 0xBD, 0x4E, 0x98, 0x47, 0x74, 0x1B, 0x80, 0xC3, 0x91, 0x47, 0x11, 0xAA, 0xC0, 0x60, 0x8D, 0x11,
+ 0xFA, 0x5D, 0xC7, 0x1C, 0x3A, 0x3D, 0xE3, 0xA4, 0x2A, 0xBE, 0x4A, 0xF1, 0x30, 0xD8, 0xCC, 0x66,
+ 0x14, 0x8D, 0xE1, 0xEF, 0xB5, 0xCE, 0xE7, 0x65, 0xDB, 0xCC, 0xDF, 0xE9, 0x68, 0x61, 0x2C, 0x20,
+ 0x49, 0x5B, 0xD5, 0x8D, 0x67, 0xAA, 0x32, 0xDF, 0x12, 0x37, 0x53, 0x3E, 0x84, 0x25, 0xAB, 0x3C,
+ 0x00, 0xD7, 0x71, 0x87, 0x69, 0xEC, 0x73, 0x62, 0xED, 0x4D, 0x74, 0x1E, 0x1E, 0x28, 0x99, 0x4A,
+ 0x92, 0x48, 0x88, 0x61, 0x2E, 0x5B, 0x67, 0x0F, 0xA6, 0x43, 0xA7, 0x7F, 0xE9, 0xC5, 0x87, 0xB5,
+ 0x00, 0xE7, 0xE8, 0xF4, 0x9A, 0x51, 0x6A, 0xA6, 0xFE, 0xCD, 0x49, 0xED, 0x63, 0x3C, 0x2D, 0x41,
+ 0x31, 0xD0, 0x6D, 0x3E, 0xCA, 0x31, 0x10, 0x0B, 0x8C, 0xB0, 0x84, 0xF9, 0x55, 0x23, 0x3E, 0x18,
+ 0x48, 0x7B, 0x93, 0xBF, 0x34, 0x9F, 0x2D, 0x20, 0x24, 0x5A, 0x40, 0x4C, 0xDF, 0x97, 0xAB, 0xB9,
+ 0xF1, 0x54, 0xCF, 0x35, 0x13, 0xE8, 0x60, 0x74, 0x21, 0x64, 0xB1, 0xFE, 0xE2, 0x85, 0xD4, 0x4D,
+ 0x4A, 0xA0, 0x74, 0xDD, 0xC2, 0x03, 0xD7, 0x61, 0x4C, 0x77, 0x0F, 0x38, 0xFE, 0x43, 0xEB, 0xDE,
+ 0xEE, 0x32, 0x4D, 0x79, 0x50, 0xE6, 0x02, 0x2B, 0x97, 0x4C, 0xAA, 0x46, 0x31, 0x3A, 0x8D, 0xBD,
+ 0x7F, 0x54, 0x86, 0x0A, 0x51, 0x5D, 0x3D, 0x59, 0xBB, 0x7B, 0x07, 0x99, 0x0F, 0xF0, 0x63, 0xAD,
+ 0x39, 0x0B, 0x99, 0xDC, 0x18, 0x2F, 0x01, 0x26, 0x1F, 0x29, 0xF1, 0x81, 0xD9, 0x46, 0x68, 0x13,
+ 0xC8, 0xE8, 0xC6, 0xE7, 0x7C, 0x66, 0x72, 0xDF, 0x31, 0xEA, 0x13, 0xDF, 0x3E, 0x88, 0xF7, 0x35,
+ 0xC0, 0x27, 0xF1, 0xC8, 0x04, 0x55, 0x8D, 0xC2, 0xB3, 0x87, 0x98, 0x51, 0x54, 0x46, 0x0C, 0x63,
+ 0xBE, 0xD0, 0xBA, 0x4D, 0x6F, 0x1C, 0xDF, 0xD4, 0xB1, 0x76, 0xCA, 0xB2, 0x85, 0xFE, 0x65, 0xE6,
+ 0xC0, 0x0D, 0x56, 0xBA, 0x2D, 0x99, 0xFC, 0x9B, 0x6D, 0xC2, 0xFE, 0x28, 0x53, 0xED, 0xE0, 0xF7,
+ 0x20, 0x4D, 0xD7, 0x4D, 0xF6, 0x5D, 0xC6, 0x50, 0x8D, 0xC1, 0x19, 0xC7, 0x12, 0xF5, 0x53, 0xE0,
+ 0xE8, 0x07, 0xA5, 0x4E, 0x18, 0xF7, 0x5F, 0xFE, 0x48, 0x00, 0x12, 0x5F, 0x23, 0x4B, 0x80, 0x0D,
+ 0x43, 0x11, 0xCA, 0xAC, 0xFF, 0x1F, 0xB5, 0x3C, 0x43, 0x23, 0x7D, 0x86, 0xB3, 0x58, 0x40, 0xF4,
+ 0x42, 0xC1, 0xFB, 0x28, 0xFD, 0x89, 0x6B, 0x9C, 0x41, 0xE5, 0x60, 0xCA, 0x14, 0x76, 0xAB, 0x35,
+ 0x09, 0x74, 0xF0, 0x89, 0xBB, 0x47, 0x3C, 0xBC, 0xED, 0x90, 0x5C, 0x75, 0xFE, 0x24, 0xD9, 0x41,
+ 0x93, 0xE1, 0x98, 0x8D, 0xA7, 0x71, 0xDF, 0x54, 0x4C, 0x62, 0x02, 0x7C, 0x20, 0x9E, 0xDB, 0x59,
+ 0xBB, 0x90, 0x89, 0x2C, 0x4D, 0x8E, 0x21, 0x25, 0x5E, 0x6C, 0xD8, 0x2F, 0x4D, 0x03, 0x92, 0xDF,
+ 0xE0, 0xD3, 0x57, 0xAA, 0x12, 0xA1, 0x84, 0x88, 0x65, 0x25, 0x4B, 0xD6, 0xA1, 0x5C, 0x9F, 0xC0,
+ 0x6E, 0xCE, 0xD8, 0x49, 0xF6, 0x54, 0x22, 0x99, 0xDD, 0x69, 0x3D, 0x97, 0x57, 0x71, 0xB1, 0x8D,
+ 0x94, 0xA2, 0x3A, 0x53, 0x6C, 0xEB, 0xB7, 0x90, 0xEC, 0x4F, 0x9C, 0x35, 0xCC, 0x7B, 0xE1, 0xFD,
+ 0x54, 0xE2, 0xE8, 0xBD, 0x97, 0xDE, 0x5C, 0xE6, 0x2E, 0xEA, 0x1B, 0x72, 0xFF, 0x30, 0xD5, 0x6F,
+ 0x94, 0x60, 0x42, 0x52, 0xA7, 0x71, 0xE2, 0xEA, 0xA9, 0xDC, 0xD0, 0xC4, 0x5A, 0x01, 0x70, 0xFA,
+ 0x04, 0x85, 0x45, 0x30, 0xFF, 0x23, 0x0B, 0x38, 0xFB, 0xBA, 0x63, 0xAB, 0xA4, 0x50, 0x8F, 0x6A,
+ 0x73, 0xAC, 0xFE, 0x33, 0x95, 0x23, 0x1C, 0xD8, 0x5F, 0xEF, 0x71, 0xCD, 0x73, 0xC2, 0x84, 0x9E,
+ 0x7D, 0x81, 0x3B, 0xAE, 0x4D, 0xA8, 0xB7, 0xA8, 0xE8, 0xF5, 0x1A, 0xF0, 0x02, 0x8E, 0x1C, 0x5E,
+ 0x3F, 0x06, 0xDD, 0x2B, 0xC8, 0x38, 0x07, 0x29, 0xAF, 0x80, 0xDB, 0x9E, 0xCD, 0x8A, 0x9F, 0x96,
+ 0xB4, 0x3A, 0x94, 0x53, 0x2F, 0xDA, 0xD8, 0x54, 0x88, 0x73, 0x63, 0x46, 0x73, 0x95, 0xE2, 0xD8,
+ 0xC5, 0x32, 0x06, 0xE7, 0x7C, 0xB4, 0xC7, 0x04, 0x6B, 0x66, 0xE0, 0x18, 0xCD, 0x57, 0x45, 0x5D,
+ 0x62, 0x8A, 0x39, 0x4C, 0x5F, 0x6E, 0x2F, 0xFC, 0x73, 0xFA, 0x9E, 0xBB, 0x23, 0x9E, 0xCB, 0x56,
+ 0x15, 0x6D, 0xF1, 0xDD, 0x98, 0x1E, 0x33, 0x8E, 0xCA, 0xB7, 0x63, 0x3B, 0x62, 0x69, 0x7B, 0x68,
+ 0x71, 0xDB, 0x80, 0xA1, 0xD3, 0x9E, 0xBB, 0xC9, 0x0E, 0x90, 0x4F, 0xFA, 0x61, 0xFC, 0xA3, 0xE1,
+ 0xFA, 0xC3, 0x1F, 0x69, 0xC8, 0x4D, 0xBF, 0xB0, 0x1F, 0x0C, 0xB2, 0x37, 0x28, 0xEC, 0xF1, 0xF7,
+ 0x42, 0x80, 0xD4, 0x9B, 0x40, 0x7D, 0xDA, 0x8B, 0x07, 0x60, 0x18, 0x26, 0x5C, 0x42, 0x1B, 0x05,
+ 0x81, 0x8B, 0xD0, 0xA1, 0x72, 0x3D, 0xCD, 0x44, 0x66, 0xD4, 0xFD, 0x10, 0xDF, 0x78, 0x4D, 0xF0,
+ 0x61, 0x00, 0x05, 0xC1, 0xEC, 0xF0, 0xE8, 0x73, 0x58, 0xDE, 0xCF, 0x97, 0xAF, 0x57, 0xFC, 0x07,
+ 0x0B, 0x06, 0x0F, 0xBB, 0xCD, 0x0F, 0x62, 0x0E, 0x38, 0x80, 0x93, 0x86, 0x95, 0x17, 0x52, 0x22,
+ 0xAE, 0x1A, 0x3B, 0x55, 0x42, 0xCE, 0xF3, 0xF0, 0xFD, 0x34, 0x2F, 0x7E, 0x57, 0x71, 0xAF, 0x45,
+ 0x59, 0x3E, 0x65, 0x4C, 0xA6, 0x04, 0x3A, 0x19, 0x94, 0x00, 0xD4, 0xEE, 0xBB, 0x3F, 0x09, 0x86,
+ 0x57, 0x51, 0xD6, 0x71, 0x03, 0xA9, 0xDB, 0x56, 0xED, 0x94, 0x8D, 0x75, 0xBB, 0x5A, 0x8D, 0x35,
+ 0xBA, 0xEC, 0xDF, 0x13, 0x7A, 0xAF, 0x1D, 0x19, 0xBE, 0x2E, 0x60, 0xB8, 0xED, 0x0A, 0xEA, 0x26,
+ 0xA3, 0x48, 0xF4, 0x8A, 0x71, 0x05, 0x35, 0x5A, 0x54, 0x74, 0xAA, 0xA9, 0x15, 0x93, 0xEF, 0x0E,
+ 0x81, 0x23, 0xE9, 0x4E, 0xD1, 0x4E, 0x88, 0xC2, 0x1D, 0xE6, 0x5C, 0xC4, 0x54, 0x2B, 0xAE, 0xB4,
+ 0xF0, 0xF0, 0x4C, 0x86, 0xBA, 0xB1, 0xDD, 0x00, 0xEC, 0xF6, 0x7E, 0x6F, 0x3F, 0x45, 0xA7, 0xA7,
+ 0x09, 0x58, 0x49, 0x22, 0xBC, 0xB4, 0x0C, 0x33, 0x21, 0xD6, 0x07, 0x44, 0x3C, 0xBA, 0xFE, 0xF8,
+ 0xF8, 0x2B, 0xAE, 0x33, 0x5B, 0xE7, 0xF9, 0x67, 0x68, 0xE3, 0xED, 0x40, 0x28, 0xF5, 0xFD, 0x5C,
+ 0xE5, 0x25, 0x20, 0x04, 0x29, 0x9B, 0xC1, 0xDD, 0x51, 0xEC, 0x57, 0x56, 0x16, 0xA7, 0x4C, 0x3D,
+ 0x80, 0xAE, 0x62, 0xFE, 0xBB, 0x2D, 0x17, 0x51, 0x00, 0x01, 0x79, 0x53, 0xD7, 0x70, 0xFA, 0x89,
+ 0xEB, 0xB5, 0x37, 0x92, 0x03, 0x9C, 0x88, 0xC0, 0xA6, 0x62, 0x14, 0xB2, 0x0D, 0x22, 0xC8, 0xDC,
+ 0x43, 0x17, 0xF8, 0x72, 0xFE, 0x0B, 0x88, 0xD6, 0x96, 0x7A, 0xB5, 0xF3, 0xC4, 0x6F, 0xEF, 0xA5,
+ 0x87, 0xB7, 0x8A, 0xAD, 0x46, 0xCD, 0xFF, 0xF2, 0x38, 0x14, 0xD8, 0xD4, 0xD4, 0xC5, 0x9A, 0x5D,
+ 0x38, 0x3D, 0x44, 0x53, 0xF3, 0x43, 0x79, 0x3F, 0xCD, 0xC2, 0x93, 0xB5, 0x34, 0x4F, 0x5E, 0xFA,
+ 0x4D, 0x64, 0x61, 0x39, 0x0A, 0xDC, 0x8D, 0xB5, 0xD3, 0x82, 0xFD, 0x53, 0xAD, 0x9B, 0xC6, 0x79,
+ 0x24, 0x09, 0x91, 0x8F, 0x61, 0x25, 0x07, 0x21, 0x97, 0x73, 0x98, 0x98, 0xB5, 0x46, 0xD1, 0xFB,
+ 0xCE, 0x91, 0xF4, 0xC6, 0x39, 0xC7, 0xBE, 0xBF, 0x65, 0x97, 0x59, 0x27, 0x08, 0xDA, 0x30, 0x7D,
+ 0x05, 0x6D, 0x04, 0xD8, 0xA2, 0xDA, 0x52, 0xFA, 0xC2, 0x6B, 0x37, 0x21, 0xEC, 0x03, 0xEE, 0x4D,
+ 0x89, 0xA7, 0x81, 0x54, 0x1A, 0xB0, 0x2B, 0x3E, 0xA7, 0xE0, 0x54, 0xF6, 0x5A, 0xD6, 0x4E, 0xA2,
+ 0x23, 0x1D, 0x1E, 0xE2, 0x46, 0x89, 0x20, 0xB5, 0x63, 0x44, 0xF1, 0xF5, 0x50, 0x6E, 0x5E, 0xD1,
+ 0x6A, 0x34, 0xA8, 0xA1, 0xE8, 0xC4, 0x17, 0xE8, 0x4F, 0xC8, 0x2E, 0x64, 0x37, 0xC6, 0xEC, 0xDC,
+ 0x65, 0x88, 0x38, 0x4A, 0xBF, 0x61, 0xC0, 0x8D, 0xC6, 0xEE, 0xFA, 0x77, 0x66, 0xE5, 0xD1, 0x0C,
+ 0x92, 0xC8, 0xD8, 0xE9, 0x9B, 0xD6, 0x96, 0xB9, 0x93, 0x86, 0xB7, 0x40, 0x02, 0x7F, 0xD5, 0x5D,
+ 0x63, 0x53, 0x59, 0xCF, 0xBB, 0xD1, 0xE9, 0x3D, 0xF1, 0x2C, 0xC0, 0xAE, 0xAD, 0xFC, 0x66, 0xC2,
+ 0x0E, 0x13, 0x76, 0x2B, 0xA6, 0xB0, 0xDB, 0x31, 0x89, 0x7D, 0xFE, 0x79, 0xAA, 0x49, 0xB1, 0x9A,
+ 0xC1, 0xF0, 0x39, 0x05, 0x08, 0x1C, 0x1F, 0xFC, 0xA8, 0xDC, 0x19, 0x3F, 0xDA, 0x26, 0x09, 0x11,
+ 0x7D, 0xAD, 0x8D, 0x55, 0xC3, 0x53, 0x61, 0x17, 0x74, 0x21, 0x7B, 0x0E, 0xFC, 0xBF, 0xB5, 0x5B,
+ 0xDC, 0x2B, 0x8F, 0x05, 0x40, 0x31, 0x05, 0xB9, 0xF5, 0x9E, 0x25, 0x3D, 0x92, 0x4E, 0xDD, 0x8B,
+ 0x41, 0x63, 0xC1, 0x7A, 0x48, 0xCA, 0x8A, 0xE2, 0xA4, 0xFA, 0xB0, 0x81, 0x2F, 0x2A, 0x57, 0x8D,
+ 0x18, 0xE3, 0x34, 0xCD, 0x3F, 0x16, 0x7D, 0x69, 0x4E, 0x27, 0x84, 0x62, 0xDD, 0x0C, 0x37, 0x81,
+ 0x79, 0xB0, 0x79, 0x38, 0x46, 0xEF, 0x8B, 0xA7, 0x2A, 0xC1, 0xCA, 0x67, 0xB6, 0xF7, 0x8B, 0xB9,
+ 0x77, 0x93, 0x8F, 0x55, 0x76, 0x10, 0x1C, 0x27, 0x92, 0x94, 0xCA, 0x67, 0xD1, 0xD4, 0xB8, 0x96,
+ 0xEF, 0xD1, 0xD2, 0x32, 0xF4, 0xD7, 0x86, 0x9C, 0xBE, 0xBA, 0x8E, 0x05, 0xDA, 0x4B, 0x3D, 0x4A,
+ 0x7E, 0x09, 0xE8, 0x0C, 0xE7, 0x53, 0xCB, 0x16, 0xA1, 0x9E, 0x56, 0xCD, 0xD8, 0x6C, 0x14, 0x4C,
+ 0x19, 0x01, 0xEE, 0x5E, 0x03, 0x34, 0xB0, 0x3E, 0x30, 0x6E, 0x97, 0x75, 0x7F, 0x2B, 0xF2, 0xBA,
+ 0xB1, 0x84, 0x76, 0x79, 0xC7, 0x6E, 0x46, 0x79, 0xC1, 0x3B, 0x2F, 0x18, 0x18, 0xDF, 0xBC, 0xAE,
+ 0xFC, 0x1D, 0xE2, 0xB6, 0x77, 0x72, 0x5D, 0x04, 0x1E, 0x46, 0x20, 0xFF, 0x78, 0x9A, 0x64, 0xF9,
+ 0xE8, 0x36, 0x19, 0x19, 0xBC, 0xF6, 0x54, 0x84, 0xAA, 0x8F, 0xB9, 0x7E, 0x06, 0x40, 0xF6, 0x96,
+ 0x0A, 0xD9, 0x01, 0x1B, 0x6C, 0xCC, 0x0D, 0x63, 0x9C, 0x0A, 0x13, 0xF0, 0xC6, 0x16, 0x4D, 0xC2,
+ 0x9F, 0xAF, 0x6B, 0x07, 0x96, 0x94, 0x69, 0x5A, 0x90, 0x43, 0x51, 0xAE, 0xD3, 0x90, 0x10, 0x66,
+ 0xEE, 0x94, 0xA1, 0x6C, 0x42, 0x9F, 0x67, 0x1C, 0x85, 0x86, 0xBC, 0x81, 0xF7, 0x88, 0x30, 0xB8,
+ 0xCA, 0x47, 0xA2, 0x08, 0xC1, 0x99, 0x9A, 0x86, 0x79, 0x51, 0x12, 0xCD, 0xE1, 0x69, 0xAE, 0xD2,
+ 0x2C, 0xF8, 0x81, 0x92, 0x68, 0x3B, 0xDB, 0xDA, 0xFA, 0x98, 0x29, 0x84, 0x1C, 0xF0, 0xFD, 0xA1,
+ 0xDA, 0x90, 0x6D, 0xB3, 0x78, 0xD2, 0x04, 0x1D, 0xD1, 0x9B, 0xBF, 0x0C, 0x15, 0x36, 0x9D, 0xC6,
+ 0xB4, 0x4D, 0xB5, 0x93, 0xD9, 0xDF, 0xBC, 0x3A, 0x16, 0x2A, 0x07, 0x3C, 0xB0, 0x43, 0x95, 0x6E,
+ 0x1E, 0x65, 0x09, 0x8D, 0x0D, 0x34, 0x45, 0x0E, 0xD9, 0x3E, 0x52, 0x69, 0x91, 0xC1, 0x90, 0xCA,
+ 0x8E, 0x33, 0x02, 0xD3, 0x54, 0xB5, 0x61, 0xE8, 0xC6, 0x53, 0x01, 0x49, 0x4D, 0x0B, 0xAC, 0x3A,
+ 0x95, 0x1B, 0x70, 0x43, 0x62, 0x6B, 0xD8, 0x37, 0x6C, 0xE7, 0xAE, 0x94, 0xE5, 0xE0, 0x1D, 0xE8,
+ 0x1B, 0xC1, 0x52, 0x2A, 0x6B, 0x50, 0x32, 0xDE, 0xF7, 0xF8, 0xCE, 0x49, 0x3E, 0xE5, 0x74, 0x29,
+ 0x33, 0x75, 0xF0, 0x63, 0x8A, 0x40, 0xE3, 0x13, 0x8F, 0xEB, 0x08, 0x24, 0xB2, 0x5A, 0x7A, 0xA9,
+ 0xD0, 0x1F, 0xCE, 0x8A, 0x84, 0xBA, 0x8C, 0x4F, 0x10, 0x78, 0xAE, 0x64, 0xC3, 0xC3, 0x9A, 0x88,
+ 0x59, 0xD2, 0xCD, 0x6E, 0xC2, 0xBC, 0x71, 0xEF, 0xDF, 0xAA, 0xD4, 0x52, 0xF9, 0x1B, 0xCC, 0x17,
+ 0x51, 0x46, 0x7E, 0xB6, 0x0F, 0x77, 0x25, 0x3F, 0x23, 0x3B, 0xD9, 0xA7, 0x82, 0x6A, 0xB4, 0x12,
+ 0x30, 0x96, 0x27, 0x47, 0x9D, 0x70, 0xD6, 0xE9, 0x86, 0xFA, 0xBD, 0x9D, 0x96, 0xE3, 0x30, 0x0C,
+ 0x1E, 0xBD, 0xD9, 0xEA, 0x1E, 0x50, 0x18, 0x7F, 0x7E, 0xBE, 0xAE, 0x8E, 0x11, 0xEA, 0xDE, 0x17,
+ 0x97, 0x9D, 0x60, 0x2B, 0xA2, 0x44, 0x1B, 0xCE, 0xC5, 0x3E, 0x68, 0x88, 0x1B, 0xDE, 0x0E, 0xFB,
+ 0xD2, 0xDA, 0x30, 0x1E, 0x75, 0x70, 0x84, 0x19, 0xBD, 0x50, 0x8C, 0x9B, 0x46, 0x7F, 0xF4, 0x27,
+ 0x19, 0xBF, 0x5C, 0xFC, 0xE3, 0xCF, 0x18, 0x9D, 0xD1, 0x32, 0x39, 0x28, 0x1E, 0xCD, 0x47, 0xD4,
+ 0x38, 0xB1, 0xF8, 0x06, 0x4B, 0xC7, 0x45, 0x0B, 0x09, 0xA4, 0xE2, 0xF1, 0xC4, 0xA9, 0x00, 0xEA,
+ 0x44, 0xF5, 0x75, 0xCA, 0x9F, 0xD1, 0x3F, 0xCE, 0x4D, 0xD0, 0x42, 0x79, 0x95, 0x76, 0xD9, 0x7C,
+ 0xEF, 0x0A, 0xC6, 0x31, 0x82, 0xCC, 0xEA, 0x59, 0x4B, 0x43, 0xD5, 0xB6, 0x1D, 0x05, 0x5E, 0x59,
+ 0xA7, 0x21, 0x45, 0x0D, 0x65, 0x57, 0x38, 0x76, 0x22, 0x39, 0x8A, 0x5D, 0xC8, 0x94, 0xE0, 0x51,
+ 0x19, 0x68, 0x1E, 0x58, 0x5F, 0xB0, 0xBA, 0xC3, 0x55, 0xB4, 0x86, 0x18, 0x24, 0xDE, 0x2C, 0x8E,
+ 0xE2, 0xB6, 0x67, 0x04, 0xD0, 0x3B, 0x84, 0x22, 0x50, 0xDB, 0x04, 0x1E, 0xE0, 0x17, 0x5F, 0xF0,
+ 0xC7, 0xFE, 0x02, 0x17, 0xD0, 0x0C, 0x9D, 0x49, 0x00, 0x54, 0x79, 0xA0, 0xD0, 0x9B, 0xBF, 0xC2,
+ 0xCE, 0x5E, 0xCC, 0xDE, 0x65, 0xF4, 0x62, 0x72, 0x7D, 0x33, 0x08, 0xF9, 0x26, 0x22, 0x84, 0xEE,
+ 0xC8, 0x35, 0xD7, 0x42, 0x31, 0x8F, 0x5C, 0x23, 0xAA, 0x37, 0xC1, 0x79, 0xB0, 0xAD, 0x1E, 0x3A,
+ 0xE3, 0x1C, 0x16, 0x49, 0x4D, 0xEA, 0xB0, 0x0A, 0x06, 0xD3, 0x56, 0x33, 0xD6, 0xDE, 0x3E, 0xF3,
+ 0x64, 0xE2, 0xB6, 0xF2, 0xAC, 0xA5, 0x41, 0xDD, 0x8E, 0xDA, 0x3E, 0x56, 0x91, 0x66, 0x1B, 0x80,
+ 0xC3, 0x2D, 0xAB, 0x84, 0xC6, 0xBF, 0xDD, 0x10, 0x36, 0x21, 0x65, 0xE5, 0xBE, 0x2B, 0x54, 0xCC,
+ 0x6F, 0xE0, 0x70, 0xE5, 0x7A, 0x73, 0xC7, 0xF9, 0x8F, 0xB2, 0xEC, 0x1E, 0xD6, 0x5E, 0x55, 0x74,
+ 0xC5, 0x19, 0x9D, 0x40, 0x13, 0x7C, 0xD4, 0x85, 0x10, 0xD5, 0x1D, 0x8C, 0x8F, 0x27, 0x68, 0xBC,
+ 0x76, 0x9E, 0x14, 0xFF, 0x5D, 0xEA, 0x8B, 0xCB, 0x16, 0xBE, 0x4F, 0xFB, 0x02, 0xAC, 0x97, 0x0F,
+ 0x3E, 0xBD, 0xD0, 0x1A, 0xCB, 0x93, 0xD8, 0x98, 0xBD, 0x15, 0x26, 0x91, 0xB9, 0xD0, 0xC6, 0x8D,
+ 0x6B, 0x91, 0x82, 0x4A, 0x10, 0x77, 0xFA, 0x04, 0x60, 0xCC, 0xEB, 0x76, 0x15, 0x5D, 0x96, 0xE6,
+ 0x16, 0x19, 0x73, 0xD2, 0xB9, 0xDD, 0x25, 0xF7, 0xFB, 0xFD, 0x7A, 0xEC, 0x1D, 0xA4, 0x5D, 0x3E,
+ 0xAE, 0xBA, 0xEB, 0x84, 0x1D, 0x73, 0xD4, 0xE4, 0xB5, 0xBC, 0x0D, 0x79, 0xC5, 0xF6, 0xA3, 0xE9,
+ 0x02, 0x64, 0x96, 0x65, 0x7A, 0x23, 0xDE, 0xFD, 0xEE, 0x22, 0x24, 0xFD, 0x1A, 0x39, 0x37, 0xD0,
+ 0x51, 0xEB, 0x35, 0x3D, 0x30, 0x90, 0xE4, 0x70, 0x6A, 0x58, 0xB7, 0x9A, 0xE6, 0xB0, 0xAE, 0x7C,
+ 0x64, 0x61, 0x42, 0x74, 0x0C, 0xF3, 0x9D, 0xCC, 0x40, 0x92, 0x23, 0xC1, 0x25, 0x2E, 0x07, 0x0E,
+ 0x76, 0x0C, 0x4C, 0x3C, 0xA4, 0x2A, 0xE7, 0x1A, 0x91, 0xDE, 0x15, 0xF0, 0xF4, 0x08, 0x95, 0x77,
+ 0x58, 0x4B, 0xF2, 0x45, 0xBE, 0x7C, 0xE4, 0x51, 0x57, 0x24, 0x92, 0x8D, 0x5F, 0x50, 0xA6, 0x77,
+ 0xFA, 0x9E, 0xB4, 0xA2, 0xF9, 0xBA, 0x31, 0x37, 0xD8, 0x2D, 0xAF, 0xCB, 0x47, 0x98, 0xB3, 0x68,
+ 0xA0, 0xB7, 0xCA, 0x2F, 0x79, 0xBA, 0xB7, 0x8D, 0x53, 0xB3, 0xAB, 0xDC, 0x4E, 0x47, 0x2F, 0x35,
+ 0x4B, 0xC7, 0xAA, 0x64, 0x49, 0x9B, 0xB2, 0x92, 0x85, 0x43, 0x10, 0xE6, 0x84, 0x8B, 0xF5, 0xAE,
+ 0x77, 0x28, 0x30, 0x46, 0xF4, 0xFC, 0xEE, 0x46, 0x78, 0x71, 0xE1, 0xDA, 0xAA, 0x33, 0x23, 0x98,
+ 0x5E, 0xF0, 0xA5, 0x41, 0x75, 0x4B, 0xC9, 0xBD, 0x4B, 0x91, 0x38, 0xEF, 0x5B, 0x5D, 0x29, 0x9F,
+ 0xAE, 0x95, 0x5F, 0xDB, 0x60, 0xDD, 0xB9, 0xBE, 0x4D, 0x7D, 0xA0, 0xA4, 0xAC, 0x9F, 0x65, 0x6A,
+ 0xFA, 0x81, 0x01, 0xCF, 0x8F, 0xE2, 0x2C, 0x27, 0x64, 0x3A, 0x4D, 0x23, 0xC7, 0x7B, 0x4F, 0xCF,
+ 0xA1, 0xDC, 0x0E, 0x21, 0x82, 0x2B, 0xD8, 0x51, 0x8B, 0x35, 0x81, 0x87, 0x9F, 0xFD, 0x05, 0xC5,
+ 0x17, 0xAF, 0x99, 0x3D, 0x2B, 0x28, 0x2D, 0x82, 0x3A, 0x13, 0x68, 0x31, 0x21, 0x66, 0x53, 0xDB,
+ 0x07, 0x45, 0xBD, 0x24, 0x52, 0xAA, 0xC6, 0xD4, 0x70, 0x24, 0xB1, 0x67, 0x9A, 0x94, 0xEA, 0xF0,
+ 0x6B, 0x67, 0x99, 0xDD, 0x4F, 0x11, 0x73, 0xD2, 0x04, 0xBE, 0xB5, 0x77, 0xFB, 0xA2, 0x31, 0xCC,
+ 0xD4, 0x1E, 0x91, 0x02, 0xD2, 0x62, 0xF6, 0xB1, 0x32, 0x36, 0x12, 0xF8, 0x4D, 0x1D, 0x47, 0x10,
+ 0xA8, 0x65, 0x34, 0x71, 0x48, 0x9E, 0x22, 0x2B, 0xA2, 0x4F, 0xF9, 0x2B, 0xEB, 0x0F, 0x31, 0x80,
+ 0x7E, 0xCA, 0x4A, 0xCF, 0x37, 0x08, 0x21, 0x1D, 0xBA, 0xD9, 0x32, 0x14, 0x3E, 0xEF, 0x6C, 0xFE,
+ 0xB7, 0xA3, 0x56, 0x07, 0x62, 0x50, 0xA5, 0x23, 0xB4, 0x45, 0x9C, 0x51, 0xDF, 0xEB, 0x93, 0x1D,
+ 0x4E, 0xFF, 0x29, 0xB2, 0x50, 0xF0, 0x2A, 0xEF, 0xEE, 0x73, 0x9B, 0x51, 0x69, 0x34, 0xAE, 0xF7,
+ 0x4A, 0x4C, 0x06, 0x9D, 0x20, 0xC7, 0x12, 0x3F, 0x31, 0xBB, 0xBC, 0xD3, 0x27, 0xA9, 0x89, 0xC7,
+ 0x42, 0x1F, 0x2E, 0x60, 0xEC, 0x29, 0x0D, 0x11, 0x88, 0xFC, 0xB4, 0x31, 0x08, 0xDD, 0x69, 0x15,
+ 0xF1, 0x64, 0x25, 0x52, 0x46, 0x07, 0xAE, 0x35, 0xAA, 0x46, 0x89, 0x3A, 0xEA, 0x7F, 0xDC, 0x69,
+ 0x9F, 0xD6, 0xF1, 0x3C, 0xDC, 0x6D, 0x00, 0x09, 0x95, 0x9D, 0x72, 0x50, 0xE7, 0xD7, 0xAC, 0x7D,
+ 0x3D, 0xFD, 0x1D, 0x06, 0x38, 0xAD, 0xD7, 0x7A, 0xEC, 0x06, 0x0F, 0x2F, 0x3F, 0x4F, 0xD2, 0xC2,
+ 0xAA, 0x30, 0x92, 0x18, 0x93, 0xE0, 0x65, 0xD9, 0xD8, 0x01, 0x48, 0xFD, 0xC1, 0xA3, 0xE4, 0xBD,
+ 0x21, 0x05, 0x45, 0xA0, 0xCD, 0xDC, 0x87, 0x29, 0x6E, 0xE1, 0x77, 0x98, 0x4D, 0x09, 0x79, 0xB2,
+ 0x62, 0x51, 0x73, 0x7B, 0x61, 0x14, 0x1D, 0x41, 0xA0, 0x92, 0xB9, 0x6E, 0x32, 0xA7, 0xD1, 0x68,
+ 0xFB, 0x6D, 0x4C, 0x88, 0x3D, 0x7A, 0x54, 0x85, 0x49, 0x7C, 0x24, 0xD9, 0xFF, 0xC7, 0x07, 0x9C,
+ 0xEF, 0xF6, 0x16, 0x6A, 0xB6, 0x1B, 0xB4, 0x23, 0x71, 0x40, 0x3B, 0x0F, 0xE6, 0xC6, 0x35, 0x6E,
+ 0x3B, 0xC7, 0x8F, 0xCE, 0x08, 0xFF, 0x6A, 0x94, 0xCB, 0xB9, 0xA5, 0x21, 0x30, 0xAC, 0xE1, 0xE6,
+ 0xB1, 0xDB, 0x31, 0x84, 0xB3, 0x5A, 0x41, 0x9F, 0x10, 0x21, 0x68, 0xCF, 0xED, 0x6B, 0xB4, 0xCF,
+ 0xAB, 0x6E, 0xA2, 0x05, 0xF1, 0xF1, 0xEC, 0xE8, 0x29, 0xF4, 0xD9, 0x95, 0x61, 0xC2, 0x2A, 0xCC,
+ 0xFE, 0x9B, 0x8D, 0x5B, 0x94, 0x60, 0x96, 0x51, 0x02, 0x3D, 0xB4, 0x0F, 0xC6, 0x51, 0x05, 0x7F,
+ 0xFB, 0x4E, 0x4D, 0x21, 0x38, 0xBF, 0xDD, 0x2E, 0x2A, 0xB0, 0x85, 0xC8, 0x16, 0xB9, 0x78, 0xAB,
+ 0xE1, 0xA0, 0x54, 0x0E, 0x19, 0x86, 0xCD, 0x39, 0xBF, 0x73, 0x38, 0xFF, 0xD3, 0x2F, 0xF9, 0xEB,
+ 0x21, 0xB7, 0x9F, 0x96, 0x8C, 0x15, 0x44, 0x06, 0xEE, 0x04, 0x04, 0xAD, 0x3C, 0xCA, 0x2D, 0xB6,
+ 0xAF, 0x8F, 0x6B, 0x11, 0xE4, 0x12, 0x46, 0x2A, 0x4A, 0x9B, 0x2F, 0x8F, 0x66, 0xEB, 0x2B, 0xA1,
+ 0xF7, 0x65, 0x92, 0x14, 0x78, 0xF9, 0xA4, 0x5A, 0x8A, 0x33, 0x92, 0x87, 0x75, 0x9F, 0x0A, 0x27,
+ 0x53, 0xC8, 0xB1, 0xD5, 0xAB, 0xA2, 0x56, 0xB7, 0x8D, 0xA4, 0xA7, 0x2F, 0x95, 0xA8, 0xC5, 0xC6,
+ 0xB0, 0xBE, 0xAF, 0x68, 0x99, 0x2D, 0x86, 0x01, 0x31, 0x6A, 0x7A, 0xE3, 0xDD, 0x87, 0x03, 0x31,
+ 0x57, 0x33, 0x31, 0x49, 0x12, 0x90, 0xEB, 0x1A, 0x3C, 0x67, 0x2C, 0x60, 0xB8, 0xC4, 0x2C, 0x6A,
+ 0xD2, 0x1C, 0xF5, 0x0E, 0x2E, 0x71, 0x1A, 0x14, 0x25, 0xE0, 0xAA, 0xE2, 0xD7, 0xB7, 0x9D, 0xCE,
+ 0xDA, 0x12, 0x0C, 0x9D, 0x85, 0x37, 0x0E, 0xF3, 0x8B, 0x9D, 0xBF, 0xE7, 0xFB, 0xAC, 0x5D, 0x3D,
+ 0x00, 0x72, 0x4C, 0xB9, 0xEE, 0x7B, 0xF7, 0xA6, 0xC9, 0xD4, 0xE6, 0x27, 0x24, 0x31, 0xD0, 0x56,
+ 0x58, 0x4B, 0x00, 0x02, 0xA0, 0x2A, 0xDA, 0xBB, 0x23, 0x43, 0x87, 0x8F, 0xC0, 0xB4, 0x87, 0x6F,
+ 0xD4, 0xF8, 0x0F, 0x38, 0x6E, 0x82, 0xFC, 0xE2, 0x1E, 0xD5, 0x96, 0x05, 0xD1, 0x1A, 0x95, 0x1B,
+ 0xE6, 0xC1, 0xF0, 0xA1, 0x8A, 0x0F, 0xF0, 0xD4, 0x2D, 0x03, 0x5D, 0x2F, 0xCD, 0xF4, 0x0A, 0xFF,
+ 0xBB, 0xD2, 0x79, 0x06, 0xAA, 0x65, 0xF1, 0x4D, 0x8E, 0x6E, 0x24, 0x08, 0x6D, 0xA5, 0x66, 0x84,
+ 0x28, 0x25, 0xE2, 0xC1, 0xA8, 0xFB, 0x6F, 0x2E, 0x99, 0xC1, 0xA8, 0x99, 0x16, 0xF8, 0xCD, 0x5F,
+ 0xF5, 0x41, 0xFB, 0xD1, 0xC7, 0xA6, 0xF4, 0x2F, 0x4A, 0xAE, 0x36, 0xF8, 0x9D, 0x23, 0x62, 0x5C,
+ 0x3C, 0x62, 0xD4, 0xF5, 0x52, 0x46, 0xDE, 0x28, 0xB5, 0x7D, 0xFD, 0x25, 0xB4, 0x51, 0x70, 0xB3,
+ 0x5D, 0x56, 0x92, 0x51, 0x8C, 0x4B, 0x69, 0xE8, 0x34, 0x66, 0x41, 0x4E, 0x22, 0x72, 0x82, 0x1A,
+ 0xEB, 0xDE, 0x59, 0x5B, 0x3C, 0x0E, 0x66, 0x7F, 0xB6, 0xC8, 0x07, 0x2F, 0x82, 0x89, 0xDA, 0xC4,
+ 0x8E, 0xC4, 0x70, 0xA1, 0xEA, 0xD3, 0xA9, 0x28, 0xFE, 0x9B, 0xCA, 0xE8, 0x89, 0xD1, 0xE0, 0xC6,
+ 0x36, 0x91, 0x09, 0x98, 0x4F, 0x28, 0x9B, 0x10, 0x4B, 0x89, 0xDB, 0xC4, 0xCA, 0x60, 0x57, 0xA0,
+ 0x0F, 0x04, 0x3F, 0x1B, 0x75, 0xAE, 0x5A, 0x9F, 0x0A, 0xFB, 0xCC, 0x6F, 0x46, 0xE8, 0xC1, 0xB0,
+ 0x98, 0x1D, 0x6B, 0xC3, 0x3C, 0xEA, 0x83, 0x5E, 0xBF, 0x21, 0x5E, 0x28, 0x3C, 0x8E, 0xF4, 0x6B,
+ 0xAA, 0x3F, 0x0E, 0xBC, 0xB5, 0xAD, 0x65, 0xEF, 0xA3, 0xB1, 0x73, 0x3C, 0x55, 0x52, 0xB6, 0xBC,
+ 0x5E, 0xA4, 0xC6, 0x27, 0x88, 0xEB, 0x34, 0xB1, 0x61, 0x5F, 0x03, 0x20, 0x66, 0x95, 0x9B, 0xC6,
+ 0x94, 0xC1, 0x65, 0xAA, 0x8E, 0x4E, 0x41, 0xB4, 0xB2, 0x45, 0x04, 0x42, 0xA0, 0xC3, 0xB1, 0xD2,
+ 0x46, 0x0A, 0xFE, 0x4A, 0xDD, 0xC3, 0xC0, 0x01, 0x6A, 0x3F, 0xAF, 0xF5, 0xDE, 0x92, 0xC3, 0xF0,
+ 0xEC, 0xDF, 0x69, 0xEC, 0x25, 0x1F, 0x43, 0x4E, 0x87, 0x80, 0xF9, 0xD7, 0x54, 0x92, 0x8E, 0x02,
+ 0xCC, 0xF0, 0x46, 0x79, 0x9C, 0x2A, 0x5F, 0xCF, 0x24, 0x3F, 0x7F, 0xD3, 0x2F, 0xBE, 0x71, 0x51,
+ 0xCD, 0xAC, 0x73, 0xD5, 0x60, 0x44, 0x7E, 0x96, 0xE6, 0x5F, 0xFD, 0x08, 0x46, 0x17, 0x10, 0x3A,
+ 0x71, 0xF6, 0x8E, 0xAF, 0x6E, 0xFC, 0x4E, 0x05, 0xD1, 0x43, 0xC0, 0xF1, 0x77, 0xEE, 0x02, 0x94,
+ 0x8D, 0x84, 0x32, 0xB5, 0x7E, 0x40, 0x3F, 0xF9, 0x74, 0xF1, 0x5B, 0xCC, 0xDA, 0xB5, 0x48, 0xEC,
+ 0x5A, 0xEC, 0xC0, 0x1D, 0x50, 0x9D, 0x86, 0x6F, 0xBF, 0x42, 0xAE, 0xEE, 0x93, 0x46, 0xEF, 0xEC,
+ 0x0F, 0xFE, 0x13, 0x37, 0x7D, 0xD3, 0xF4, 0xAF, 0x7F, 0x6F, 0x62, 0x61, 0xA3, 0x1A, 0xD1, 0xEF,
+ 0x8D, 0xCF, 0x9E, 0xE3, 0x46, 0x8A, 0x9F, 0x35, 0x3A, 0xB4, 0xBC, 0xA7, 0x9F, 0x3F, 0x90, 0x16,
+ 0x66, 0xBB, 0x6B, 0x5B, 0x47, 0xF9, 0xD5, 0x80, 0x53, 0x26, 0x69, 0x0F, 0x0E, 0x5D, 0xAD, 0x3E,
+ 0x42, 0x75, 0xD1, 0x65, 0x62, 0xDD, 0xBB, 0xBB, 0x0F, 0x2B, 0x11, 0xCC, 0xEE, 0x1D, 0x47, 0x2E,
+ 0xD7, 0x83, 0x71, 0xCE, 0x24, 0x1C, 0xA4, 0xC3, 0xA1, 0x0C, 0x9F, 0x99, 0x51, 0x59, 0x39, 0x8F,
+ 0x24, 0xDA, 0x16, 0xA1, 0x1A, 0xE3, 0x69, 0x07, 0x27, 0x5B, 0xAA, 0xA7, 0x24, 0xA2, 0xEB, 0x2B,
+ 0x49, 0x29, 0x21, 0xA0, 0xA3, 0xC9, 0x0D, 0xC7, 0xB5, 0x0D, 0xDF, 0xA3, 0xED, 0xD8, 0x37, 0x97,
+ 0x47, 0x56, 0xAB, 0x6E, 0x8C, 0x64, 0xE3, 0xDC, 0x2F, 0x1C, 0x0F, 0x44, 0x71, 0x23, 0xF7, 0x59,
+ 0x26, 0xAB, 0xDA, 0x8C, 0x7D, 0x5A, 0x80, 0x15, 0x2D, 0xA0, 0x92, 0x5C, 0x6A, 0x8F, 0x07, 0x88,
+ 0x14, 0xED, 0xAE, 0x56, 0x35, 0xF4, 0x3E, 0xBF, 0x69, 0x84, 0xE0, 0xAE, 0x60, 0xB9, 0xF6, 0x8A,
+ 0x2B, 0x53, 0x22, 0xCE, 0x1C, 0x95, 0x85, 0xBC, 0xEC, 0xE4, 0xE3, 0xE2, 0x96, 0xC0, 0xCF, 0xA5,
+ 0x5D, 0x25, 0x0C, 0x85, 0x51, 0x2A, 0xC5, 0x38, 0x25, 0x97, 0xDC, 0x7C, 0x14, 0x39, 0x1F, 0xB4,
+ 0x3C, 0xBF, 0x65, 0x0F, 0x41, 0xD1, 0xE5, 0x81, 0xCA, 0xF3, 0xB7, 0x1C, 0xC5, 0xC4, 0xC0, 0xB8,
+ 0xBB, 0xCE, 0x39, 0x7C, 0x2E, 0x1F, 0x27, 0xAD, 0x16, 0x8A, 0x69, 0x69, 0x1D, 0x3B, 0x89, 0x4E,
+ 0xC3, 0x28, 0x1C, 0x1B, 0x47, 0x98, 0xA3, 0xDB, 0xC9, 0x69, 0x6E, 0x11, 0xD6, 0xA0, 0x08, 0x74,
+ 0x8B, 0x37, 0x4B, 0x66, 0x7A, 0x12, 0x70, 0x35, 0x84, 0x38, 0x27, 0x8F, 0xAC, 0xC9, 0xFF, 0xFC,
+ 0xC2, 0x1A, 0x0F, 0x58, 0x8E, 0x7E, 0xF1, 0xCD, 0x73, 0x74, 0x09, 0x57, 0x24, 0xBC, 0xA3, 0x0B,
+ 0xBD, 0x6D, 0x8E, 0x63, 0x09, 0x15, 0xBD, 0x7F, 0x09, 0xDA, 0xE1, 0x06, 0x34, 0x0B, 0x74, 0xB8,
+ 0xB8, 0x9D, 0x8A, 0xFA, 0x4E, 0x1E, 0xF4, 0x6A, 0x8C, 0x4C, 0xD6, 0x34, 0x3F, 0x82, 0xD2, 0x84,
+ 0xD5, 0xDA, 0x2D, 0xDB, 0xCD, 0x9F, 0x2A, 0x1D, 0xE8, 0x24, 0x43, 0xEC, 0x94, 0xCF, 0x51, 0xBF,
+ 0x48, 0x50, 0xC5, 0x71, 0x73, 0x78, 0x35, 0xD9, 0x98, 0x1E, 0xCF, 0x96, 0x02, 0x74, 0x29, 0xE9,
+ 0x30, 0x02, 0x5B, 0xEC, 0x66, 0xD8, 0xD0, 0xB6, 0x4D, 0x33, 0x3F, 0x2A, 0xF4, 0x2A, 0xC6, 0xAD,
+ 0x82, 0x9A, 0x1D, 0x62, 0xE2, 0xDA, 0x05, 0xE7, 0x8C, 0x69, 0xCB, 0xB4, 0xB8, 0xD9, 0xEB, 0x7D,
+ 0x49, 0xD6, 0x5E, 0xDD, 0xA5, 0x85, 0xB5, 0x3F, 0x08, 0xEB, 0x33, 0xA6, 0x2D, 0x68, 0x17, 0xF2,
+ 0x20, 0x3D, 0xEC, 0xAC, 0x71, 0x8C, 0x51, 0x7A, 0x20, 0x05, 0x63, 0xF3, 0x7A, 0x98, 0x4A, 0x26,
+ 0x2E, 0xEC, 0xD1, 0x9B, 0x50, 0x7D, 0xEB, 0x37, 0xD3, 0xD9, 0x21, 0x6B, 0x97, 0x06, 0x9F, 0x10,
+ 0x0A, 0x8B, 0x56, 0x6D, 0x7B, 0x78, 0x9D, 0xF6, 0x89, 0x8B, 0xDF, 0x7B, 0x21, 0xF0, 0x55, 0x85,
+ 0xF8, 0x23, 0xAB, 0xEA, 0x5A, 0xF8, 0x0C, 0xB8, 0xB9, 0x13, 0xDA, 0xCC, 0x0A, 0x35, 0x21, 0xAF,
+ 0x78, 0x87, 0x33, 0x78, 0x89, 0x39, 0x1E, 0x15, 0xD7, 0x14, 0x49, 0xC9, 0x14, 0x60, 0x39, 0xAC,
+ 0x4C, 0x76, 0x64, 0xD7, 0xCF, 0x8A, 0x4A, 0xDA, 0xF7, 0x20, 0xCD, 0x46, 0xB4, 0x3B, 0x20, 0x60,
+ 0x43, 0x6B, 0x52, 0xD9, 0x20, 0x10, 0x8A, 0xF9, 0xF7, 0x34, 0xDA, 0x5E, 0xCF, 0xD1, 0xCC, 0x60,
+ 0x31, 0xF8, 0xE5, 0x5C, 0xF5, 0xC8, 0xCB, 0x3C, 0xF6, 0x63, 0xD4, 0x26, 0xA1, 0x41, 0x71, 0xCD,
+ 0x73, 0x97, 0xBF, 0x27, 0x2A, 0x2C, 0x0C, 0x75, 0x6D, 0x4A, 0xA0, 0x8A, 0x0D, 0x02, 0x53, 0xBA,
+ 0x72, 0xA3, 0xE0, 0xE6, 0x1A, 0x85, 0xC5, 0xD7, 0xF1, 0x49, 0x4F, 0x24, 0x16, 0x35, 0x3F, 0x0C,
+ 0x2B, 0xCE, 0x9C, 0x35, 0x0F, 0x23, 0xA3, 0x7C, 0xCE, 0xC8, 0xED, 0x34, 0x2C, 0xCC, 0x33, 0x0A,
+ 0x73, 0xA3, 0x58, 0x53, 0x78, 0x55, 0xD1, 0xC2, 0x08, 0xCA, 0x03, 0xBE, 0x6E, 0x1D, 0x9C, 0xD2,
+ 0x67, 0x71, 0x4D, 0x77, 0x9A, 0x63, 0xA1, 0x7C, 0x31, 0x11, 0x3D, 0xDE, 0xE0, 0xDC, 0x0D, 0x06,
+ 0xDD, 0xAF, 0x16, 0x65, 0xF6, 0xF0, 0x27, 0x28, 0x9A, 0xBA, 0xED, 0xE2, 0xC2, 0x27, 0x2B, 0x74,
+ 0x2D, 0xF8, 0x6E, 0xE1, 0x0C, 0xB2, 0xC7, 0xBF, 0xD3, 0x0A, 0x94, 0x0E, 0x3A, 0xE1, 0x04, 0x34,
+ 0x97, 0xA7, 0x7E, 0x01, 0xA0, 0x31, 0x89, 0x86, 0x05, 0x28, 0x84, 0x0C, 0x3E, 0xB5, 0x22, 0x26,
+ 0x6E, 0x52, 0xFD, 0x3B, 0x39, 0x5B, 0xB7, 0xEC, 0x49, 0x50, 0x21, 0xA6, 0x58, 0x20, 0x50, 0x11,
+ 0x5D, 0x9E, 0xFF, 0xF5, 0x93, 0x74, 0x39, 0x24, 0xBD, 0xBA, 0x5A, 0xB5, 0x4E, 0x35, 0xEB, 0x13,
+ 0x31, 0x04, 0x3D, 0xAD, 0xBE, 0xBB, 0x43, 0x24, 0xC1, 0x8F, 0x2A, 0x43, 0x6D, 0x85, 0x6C, 0x8E,
+ 0x78, 0x6A, 0x7F, 0xE3, 0x5C, 0xE4, 0xC1, 0x4A, 0x68, 0x46, 0xC4, 0xA4, 0xEB, 0x8A, 0xB0, 0xFB,
+ 0x02, 0xE9, 0x76, 0x49, 0x0C, 0x90, 0x3F, 0x4F, 0x79, 0x39, 0xA9, 0x93, 0x61, 0x66, 0x4F, 0x60,
+ 0x8A, 0x5C, 0x91, 0xCC, 0x2D, 0x2D, 0x43, 0xCD, 0x38, 0xE7, 0x6B, 0xE1, 0xA5, 0xA9, 0x53, 0xC9,
+ 0x0E, 0xBB, 0x36, 0x10, 0x2C, 0xDF, 0x2E, 0xB5, 0xD1, 0x81, 0xCC, 0x4F, 0xAF, 0x77, 0x21, 0xFC,
+ 0xA8, 0xFB, 0x78, 0x3D, 0xF0, 0x16, 0x76, 0xCF, 0x97, 0x67, 0xE8, 0x2B, 0x29, 0x00, 0x93, 0xAF,
+ 0x60, 0x66, 0x38, 0x0C, 0x4A, 0xED, 0xAA, 0xA7, 0x89, 0x3F, 0xE8, 0x40, 0x9D, 0x02, 0xA7, 0xB7,
+ 0x95, 0x51, 0xBE, 0x57, 0x45, 0xC5, 0x7E, 0x1E, 0xAD, 0x09, 0x6C, 0xD9, 0x81, 0x56, 0xA2, 0x92,
+ 0x72, 0x17, 0xD2, 0x86, 0x62, 0x7A, 0x62, 0x0A, 0xAE, 0xEC, 0x0D, 0x27, 0x35, 0x40, 0xFA, 0xAE,
+ 0x78, 0xEA, 0x70, 0xD4, 0xF0, 0xDA, 0xCD, 0x87, 0xF5, 0x9D, 0x5F, 0x83, 0xCB, 0x3B, 0x07, 0x52,
+ 0xD0, 0xA2, 0xB4, 0x22, 0x8E, 0xDF, 0xAA, 0xF6, 0xAB, 0x31, 0x91, 0x90, 0xBE, 0x21, 0xF9, 0x7D,
+ 0x87, 0x23, 0x1C, 0x59, 0x00, 0x05, 0xF5, 0x4F, 0x9B, 0xBB, 0x6D, 0x50, 0x7E, 0x56, 0x6B, 0x3E,
+ 0xAE, 0x9B, 0x6F, 0xAB, 0x88, 0xEC, 0xAE, 0x0F, 0x6C, 0x89, 0xAB, 0x26, 0x6B, 0x5A, 0xD9, 0x6D,
+ 0xF1, 0x23, 0x9E, 0xB3, 0xEB, 0x97, 0x08, 0xF0, 0x0E, 0x5C, 0x80, 0x00, 0xCD, 0x7A, 0x4F, 0x64,
+ 0xF9, 0x1A, 0x80, 0x0D, 0xFA, 0x3D, 0x42, 0x71, 0x39, 0x83, 0x15, 0x8A, 0xFF, 0x91, 0x9F, 0x80,
+ 0x0F, 0x67, 0xAA, 0xBB, 0xB0, 0x67, 0x45, 0x30, 0xDD, 0x86, 0x8C, 0x1D, 0xF7, 0x7A, 0xB3, 0x28,
+ 0xA1, 0xD6, 0x56, 0x63, 0xD2, 0x75, 0x10, 0xF0, 0x77, 0x53, 0x1A, 0x95, 0x9A, 0x49, 0xD7, 0x3E,
+ 0xAA, 0x24, 0x92, 0x02, 0x92, 0xF5, 0x7D, 0x2F, 0x8F, 0x24, 0x36, 0x11, 0x59, 0xCF, 0x62, 0xA6,
+ 0x69, 0xCD, 0xB5, 0x66, 0x75, 0x20, 0x16, 0x41, 0xC1, 0x4F, 0xE5, 0x81, 0xC4, 0xC2, 0x91, 0x69,
+ 0xC0, 0xF1, 0xA3, 0x01, 0x6B, 0xA9, 0x0F, 0x55, 0x2D, 0x29, 0xD7, 0x1D, 0xDD, 0x7D, 0x9E, 0xCF,
+ 0xF5, 0x05, 0xFA, 0x7C, 0x1F, 0x8B, 0xC9, 0xCA, 0x34, 0x66, 0xEF, 0x3C, 0x24, 0x9A, 0xAE, 0xCF,
+ 0xCB, 0x12, 0xB1, 0xE5, 0x59, 0xD9, 0x30, 0x90, 0xB3, 0xA7, 0xE9, 0x38, 0x9A, 0x73, 0x1C, 0xDE,
+ 0xBE, 0x62, 0x77, 0x5E, 0x75, 0xBF, 0x37, 0x39, 0x27, 0xBA, 0x91, 0xEB, 0xED, 0xAB, 0xB5, 0xCE,
+ 0x8E, 0x6E, 0xBD, 0xD4, 0x64, 0x64, 0x47, 0x16, 0x14, 0x98, 0xC6, 0xF0, 0xB6, 0x4A, 0xE8, 0xB7,
+ 0x67, 0x86, 0xC5, 0xCB, 0xCE, 0xB1, 0x7B, 0xC0, 0xDE, 0x87, 0xF7, 0x8E, 0xE7, 0x21, 0x3A, 0x86,
+ 0xB5, 0x9C, 0x38, 0xBA, 0x60, 0x98, 0xFA, 0x93, 0xBA, 0x63, 0xE3, 0x0F, 0x74, 0xB1, 0x6B, 0x39,
+ 0x68, 0xB6, 0x53, 0xB1, 0x8A, 0xBB, 0x76, 0x65, 0x74, 0x1D, 0x99, 0xBA, 0x01, 0x8A, 0xE3, 0x7C,
+ 0xC0, 0x73, 0x2A, 0x98, 0x13, 0x0E, 0x22, 0xB4, 0xF6, 0xC4, 0xF9, 0x89, 0xAF, 0x9B, 0x52, 0x6F,
+ 0x28, 0xEC, 0x8E, 0x13, 0xC4, 0xD4, 0x97, 0x74, 0x2E, 0xDB, 0x6F, 0xA8, 0x41, 0xE3, 0xDC, 0x6A,
+ 0xE4, 0xB8, 0x18, 0x2C, 0x19, 0x59, 0xE1, 0x45, 0xC5, 0xED, 0x8F, 0xCA, 0x24, 0x2A, 0x3F, 0xAD,
+ 0xDA, 0x98, 0xC1, 0x70, 0x7F, 0xF3, 0x87, 0xE1, 0xB8, 0xBC, 0xF5, 0xFB, 0x29, 0x7B, 0x12, 0x26,
+ 0x22, 0x1A, 0x5B, 0x59, 0x21, 0x21, 0x79, 0x30, 0xA7, 0x69, 0x13, 0xD9, 0x9E, 0x62, 0x02, 0x77,
+ 0x84, 0xB9, 0x87, 0xD3, 0xCB, 0x0E, 0xB0, 0x73, 0x58, 0x21, 0xFE, 0x18, 0x6A, 0x92, 0x94, 0x30,
+ 0xEC, 0x06, 0x11, 0xB9, 0xC8, 0x99, 0x6B, 0xE9, 0xFE, 0x44, 0x9D, 0x04, 0xBA, 0xC9, 0x92, 0x7E,
+ 0x46, 0x7B, 0x81, 0x4A, 0x70, 0x79, 0x56, 0x7F, 0x39, 0x96, 0x58, 0xC6, 0x35, 0x8A, 0x8F, 0x98,
+ 0x47, 0xF8, 0xD9, 0x16, 0x81, 0xC1, 0x79, 0x43, 0x08, 0xF9, 0x4A, 0xC7, 0xBA, 0x31, 0xCA, 0xC3,
+ 0x0D, 0xEA, 0x71, 0x40, 0x42, 0x2E, 0x29, 0xF2, 0xB1, 0x96, 0xFB, 0xC0, 0x98, 0x3B, 0x2F, 0xB2,
+ 0x8D, 0x82, 0xBA, 0xB0, 0x8D, 0x3D, 0x78, 0x10, 0xF2, 0x33, 0x55, 0xD2, 0x02, 0x98, 0x3A, 0xF3,
+ 0x43, 0x8F, 0x8D, 0x27, 0xD0, 0x1B, 0x50, 0x04, 0xB2, 0xA8, 0x42, 0x36, 0xE7, 0xD9, 0x2B, 0x4A,
+ 0x33, 0x9E, 0xBF, 0x46, 0x12, 0x17, 0x82, 0x89, 0xEA, 0xAA, 0x35, 0x7F, 0x3C, 0x6B, 0xEC, 0xC2,
+ 0x84, 0x33, 0xAB, 0x10, 0x25, 0x59, 0x0F, 0x2B, 0x90, 0x3F, 0xF4, 0x2A, 0x97, 0x6F, 0xD5, 0x6C,
+ 0xE3, 0x08, 0x07, 0xA9, 0xFC, 0x84, 0x7B, 0x51, 0x2F, 0x23, 0x2A, 0x6E, 0xF1, 0x0F, 0xEF, 0x48,
+ 0x9F, 0x66, 0x8F, 0x5C, 0x9A, 0x21, 0x84, 0xD7, 0xB1, 0x14, 0x82, 0xA2, 0xE4, 0xE6, 0x72, 0x56,
+ 0x46, 0xCB, 0x26, 0x2F, 0xE2, 0x6D, 0x5B, 0x07, 0xA6, 0xF3, 0x94, 0x24, 0x24, 0x58, 0x45, 0xF4,
+ 0xB4, 0x54, 0x90, 0xFF, 0x59, 0x17, 0x04, 0xC8, 0x9A, 0x4D, 0x82, 0xEF, 0x24, 0xBB, 0x2C, 0x11,
+ 0x9F, 0x2D, 0xD4, 0xE5, 0x0A, 0x2A, 0xF0, 0x94, 0x64, 0x48, 0xFF, 0xB4, 0x7D, 0x01, 0x42, 0xBE,
+ 0x8F, 0xB2, 0x2F, 0x2A, 0x0A, 0x17, 0xB0, 0xA2, 0x0B, 0x5E, 0x32, 0x05, 0x2A, 0x0A, 0xE5, 0xF6,
+ 0x3D, 0xA8, 0x12, 0xBD, 0x5C, 0x4F, 0x59, 0x76, 0xAB, 0x9C, 0x89, 0x98, 0xFD, 0xCE, 0x0B, 0xA1,
+ 0x62, 0x4D, 0x3A, 0x16, 0xA5, 0x80, 0x62, 0x8B, 0x52, 0xD4, 0x2A, 0x8E, 0xC0, 0x17, 0xE3, 0x42,
+ 0xA6, 0x70, 0x40, 0x6B, 0xE8, 0xE7, 0xD7, 0xA7, 0x43, 0x12, 0xF6, 0xB3, 0x7A, 0xE2, 0xFE, 0x42,
+ 0xB0, 0xAF, 0x33, 0x56, 0x10, 0xB1, 0x69, 0x3D, 0x7B, 0x7F, 0xDE, 0xC6, 0xE1, 0x0F, 0xCC, 0x5B,
+ 0xF9, 0x53, 0x08, 0x80, 0x05, 0x33, 0xD8, 0x09, 0x7B, 0x87, 0x71, 0xE0, 0xF5, 0xCA, 0xB5, 0xFB,
+ 0xB4, 0x3C, 0x4A, 0x6B, 0x10, 0xBA, 0xA6, 0xE6, 0x69, 0xD6, 0x8E, 0x8C, 0x5B, 0x33, 0x07, 0xE8,
+ 0x22, 0xB9, 0xF8, 0x3C, 0xEF, 0xE0, 0xDA, 0x06, 0x54, 0xCB, 0x14, 0xDB, 0x2B, 0x50, 0x92, 0xB2,
+ 0x5C, 0xB8, 0xCB, 0xB6, 0x40, 0xB1, 0x91, 0xD4, 0xD7, 0xF9, 0xC2, 0x08, 0x77, 0xC9, 0xB7, 0x00,
+ 0x9B, 0x32, 0x20, 0xC4, 0x08, 0x39, 0xEE, 0xD6, 0x32, 0xB8, 0x63, 0x0F, 0x1A, 0x73, 0x33, 0x73,
+ 0xE1, 0xFB, 0x0E, 0x94, 0x75, 0xCE, 0x37, 0xA4, 0xAF, 0xBC, 0x39, 0xAB, 0x25, 0x35, 0xA7, 0xDF,
+ 0xC2, 0x9B, 0xF5, 0xD7, 0x52, 0x44, 0xDE, 0x21, 0x50, 0x5F, 0x3E, 0xA6, 0x37, 0x9E, 0x91, 0x56,
+ 0x12, 0x82, 0xCB, 0xA0, 0xAE, 0x6F, 0xA8, 0x81, 0x0C, 0x3B, 0xC0, 0x4C, 0xEE, 0x47, 0x57, 0x79,
+ 0xC1, 0x49, 0x4B, 0x7A, 0x92, 0xC7, 0x95, 0xA4, 0xD6, 0x3E, 0x25, 0xE5, 0xCF, 0x55, 0x65, 0x10,
+ 0x52, 0x58, 0xEA, 0x4F, 0xFC, 0x34, 0xB1, 0x0E, 0x0E, 0x2E, 0x45, 0x4C, 0xD7, 0xB7, 0x92, 0xC4,
+ 0x70, 0xE5, 0x33, 0xA1, 0x22, 0x49, 0x04, 0xF8, 0xAF, 0x5E, 0x6D, 0x4B, 0xDE, 0x76, 0xCD, 0x50,
+ 0x40, 0xFB, 0xFD, 0x7B, 0xC3, 0xF2, 0xEA, 0x4B, 0xEA, 0xA7, 0x66, 0x44, 0x2B, 0x4D, 0x0C, 0xA3,
+ 0xC4, 0xAA, 0x9C, 0x50, 0x36, 0x5A, 0x4D, 0xB7, 0x04, 0x81, 0x5C, 0xBD, 0x40, 0x62, 0x12, 0x6A,
+ 0x4C, 0x13, 0x35, 0x4E, 0x47, 0x16, 0xD9, 0x43, 0xE5, 0x8A, 0x44, 0x6D, 0x49, 0x71, 0x30, 0xA9,
+ 0x4C, 0xDE, 0x31, 0x1E, 0x2A, 0xE1, 0xDB, 0xBF, 0x1F, 0xB6, 0x7C, 0x36, 0xAA, 0x0F, 0x02, 0xBA,
+ 0x85, 0x87, 0xFC, 0x47, 0x90, 0x34, 0xD5, 0x13, 0x9E, 0x09, 0x2B, 0xC3, 0xEC, 0x83, 0x80, 0x9D,
+ 0xFE, 0x3D, 0x18, 0xBA, 0xFB, 0x51, 0x8D, 0x79, 0xF6, 0xFA, 0x38, 0x48, 0x60, 0x14, 0xCC, 0x60,
+ 0x81, 0x57, 0xEE, 0xA5, 0x04, 0x1B, 0x4A, 0x0E, 0x43, 0x15, 0x00, 0x57, 0xE2, 0x0A, 0xBC, 0xF4,
+ 0x14, 0x3B, 0x96, 0x95, 0xF3, 0xFC, 0x4E, 0x13, 0x6F, 0x0D, 0x63, 0x85, 0xD0, 0xB0, 0x3B, 0xCA,
+ 0x0A, 0x80, 0x3D, 0x11, 0xD1, 0x7A, 0xCF, 0xB2, 0x0B, 0xE1, 0x67, 0xDD, 0x45, 0x9B, 0xEC, 0x30,
+ 0xD5, 0xE3, 0x06, 0xB3, 0x94, 0xBB, 0xCB, 0x32, 0xBA, 0x17, 0xDF, 0x5F, 0x1F, 0x38, 0xAF, 0xC6,
+ 0xA9, 0xB5, 0x7F, 0xF6, 0x85, 0xC2, 0x99, 0x33, 0x0A, 0x3F, 0x7D, 0xB2, 0x72, 0x7D, 0xF7, 0xF4,
+ 0x1B, 0x11, 0xA1, 0x7D, 0xF7, 0x3D, 0x7F, 0x0F, 0xFA, 0xB1, 0xEE, 0x6C, 0xAD, 0xA9, 0xE7, 0x43,
+ 0x5D, 0xFE, 0xC9, 0x32, 0xF6, 0xF1, 0x97, 0xE7, 0x87, 0x17, 0x85, 0xB9, 0xBC, 0xC1, 0xD5, 0x2F,
+ 0xC4, 0x5A, 0xBE, 0x03, 0xC3, 0x49, 0xAB, 0x9D, 0x40, 0xFA, 0xE1, 0xBD, 0x1E, 0x44, 0xE8, 0x8A,
+ 0x6E, 0x98, 0x99, 0x4C, 0xC6, 0x2B, 0xE0, 0x18, 0x26, 0x83, 0xCA, 0x08, 0x0B, 0xDD, 0x69, 0xD1,
+ 0x33, 0xD5, 0x8F, 0xAD, 0xBD, 0x86, 0xFE, 0xC3, 0x0C, 0xC3, 0x99, 0x3D, 0x4B, 0xB0, 0x0C, 0x75,
+ 0x17, 0x89, 0x6E, 0x70, 0x0C, 0x23, 0xA9, 0x99, 0xD9, 0x59, 0x07, 0x7D, 0x30, 0xFC, 0xC5, 0x98,
+ 0xD0, 0xFF, 0x5D, 0x10, 0x99, 0xF4, 0xB7, 0xC5, 0x56, 0xE8, 0xA7, 0x0D, 0x02, 0xB4, 0x04, 0xFB,
+ 0x9E, 0x9C, 0x8B, 0x0C, 0x03, 0x57, 0x48, 0x73, 0x51, 0x9A, 0x8E, 0xB6, 0xB9, 0x15, 0x57, 0xFD,
+ 0x52, 0x1E, 0x27, 0x87, 0x68, 0xCF, 0x1C, 0x2B, 0x18, 0x2D, 0xDA, 0x00, 0x2F, 0x71, 0xB8, 0x66,
+ 0x35, 0x3F, 0x50, 0xC0, 0xBC, 0xF6, 0xF1, 0x0E, 0xD0, 0xAC, 0x1C, 0xFC, 0xAD, 0x7C, 0xD9, 0x36,
+ 0x3F, 0x20, 0xC1, 0x96, 0x83, 0xB1, 0x14, 0xAB, 0xC7, 0xD5, 0x0A, 0xF4, 0x41, 0x65, 0x7D, 0x4C,
+ 0x8D, 0x03, 0xB0, 0x4C, 0x3E, 0x16, 0x6B, 0xB7, 0xF7, 0x16, 0x6B, 0x2A, 0x82, 0x27, 0x5A, 0x1A,
+ 0x60, 0xFF, 0x21, 0x47, 0x0E, 0xF9, 0x66, 0x78, 0x3D, 0x27, 0xE7, 0x22, 0x93, 0x3C, 0x39, 0x9D,
+ 0xA1, 0xC1, 0x89, 0x6D, 0x16, 0xCF, 0x12, 0x43, 0x24, 0x9A, 0x40, 0x7A, 0x5A, 0xBA, 0xA5, 0xD2,
+ 0x1A, 0x9E, 0x71, 0x1F, 0x22, 0x33, 0x22, 0xA5, 0xEA, 0xA0, 0xF9, 0x88, 0x55, 0x05, 0x8D, 0xD9,
+ 0x0A, 0x45, 0x21, 0x9F, 0xA2, 0xD7, 0x0B, 0xE1, 0xC1, 0x3E, 0xDF, 0x89, 0xDE, 0x24, 0xF9, 0x3F,
+ 0x9B, 0x1E, 0xA6, 0xB9, 0x94, 0x67, 0x4D, 0xFB, 0x9E, 0x27, 0xA4, 0x6F, 0xF5, 0xCE, 0xEB, 0x97,
+ 0xDA, 0xB4, 0x8A, 0xFB, 0xF2, 0xAD, 0xD2, 0x2C, 0x0A, 0x76, 0xF2, 0xA7, 0x13, 0x0B, 0x47, 0xE2,
+ 0xF7, 0xDA, 0x56, 0xDF, 0x83, 0x86, 0x59, 0xE5, 0x22, 0x58, 0x2F, 0x9E, 0x9F, 0x51, 0xDF, 0xA5,
+ 0x35, 0xB1, 0xC1, 0xC6, 0xCE, 0xAF, 0x2C, 0xF7, 0x5F, 0xE1, 0x39, 0x6A, 0x87, 0x67, 0xB6, 0x86,
+ 0xC7, 0x24, 0x93, 0xEA, 0x78, 0x80, 0xDD, 0x66, 0x96, 0x40, 0x4E, 0xD7, 0x72, 0x14, 0x8F, 0x8E,
+ 0x2B, 0x62, 0x72, 0x07, 0x2F, 0x14, 0x9B, 0x3D, 0x7A, 0xB4, 0x90, 0x10, 0xF2, 0xDC, 0x1A, 0x0F,
+ 0x68, 0xAC, 0x00, 0x21, 0xA0, 0xF7, 0xE3, 0x31, 0x6F, 0xC8, 0x62, 0xDD, 0x16, 0x13, 0xDB, 0x5A,
+ 0x28, 0x56, 0xE5, 0x2A, 0x1D, 0x74, 0x7E, 0x9E, 0x33, 0xC2, 0xE2, 0x96, 0x2C, 0x88, 0xF5, 0xA4,
+ 0x46, 0x43, 0xE5, 0x90, 0x67, 0xE2, 0xC9, 0xF4, 0xB9, 0xC6, 0x44, 0xAB, 0xA2, 0x90, 0x22, 0xD2,
+ 0x7D, 0xF7, 0x23, 0x5F, 0xF7, 0x98, 0x09, 0x2A, 0xB1, 0xF5, 0xDC, 0x63, 0x50, 0x68, 0xB5, 0x07,
+ 0x22, 0x82, 0x59, 0x44, 0x34, 0x7B, 0x8C, 0x0A, 0x15, 0x16, 0x45, 0x9F, 0xAE, 0x25, 0x10, 0x94,
+ 0xB7, 0xC5, 0x4A, 0xDC, 0x42, 0x1C, 0x8A, 0xBC, 0x79, 0xD3, 0xB3, 0xA7, 0x57, 0x70, 0x52, 0xAB,
+ 0x0A, 0x17, 0x3B, 0x8B, 0xAE, 0x4B, 0x6D, 0x7C, 0x4D, 0x94, 0x30, 0x12, 0xAC, 0x9F, 0xF0, 0x2C,
+ 0xB7, 0x84, 0x4F, 0xAF, 0x54, 0x9E, 0x2A, 0x0B, 0x76, 0x65, 0xEB, 0x4C, 0x09, 0x26, 0x51, 0xAC,
+ 0x85, 0xC2, 0xD3, 0x27, 0xE8, 0x90, 0xB1, 0xBD, 0x70, 0x00, 0xBB, 0xBE, 0x32, 0x8A, 0x06, 0x90,
+ 0xB6, 0x7A, 0x28, 0x8C, 0x18, 0xE0, 0xA7, 0x0A, 0x93, 0x4E, 0x3B, 0x91, 0x63, 0xB8, 0xF8, 0xCD,
+ 0x8D, 0xFD, 0x9C, 0x80, 0x22, 0x11, 0x60, 0x16, 0x47, 0xAE, 0x63, 0xD2, 0xEA, 0x1E, 0xF6, 0x09,
+ 0x1E, 0x8A, 0x9B, 0xB5, 0x77, 0xE4, 0x66, 0x2D, 0x04, 0x89, 0xD8, 0xB6, 0xAB, 0x68, 0x70, 0x67,
+ 0x4D, 0x15, 0x70, 0x6F, 0x1C, 0xB0, 0xC0, 0x23, 0x27, 0xDB, 0xCA, 0x5A, 0x10, 0x34, 0x5A, 0x6C,
+ 0x2F, 0x89, 0x27, 0x45, 0x8D, 0xF4, 0xCD, 0x38, 0x28, 0x9B, 0x5C, 0x66, 0xD4, 0x8F, 0x23, 0x08,
+ 0xF9, 0x8F, 0x60, 0x58, 0x56, 0x92, 0xBB, 0xC2, 0x8F, 0x6E, 0xC8, 0x15, 0x92, 0x92, 0x33, 0xAD,
+ 0xB4, 0x50, 0x7C, 0x31, 0x3D, 0x77, 0x9D, 0xCF, 0x01, 0x9E, 0x08, 0xA1, 0x63, 0xEE, 0x3B, 0xDD,
+ 0x79, 0x67, 0x61, 0xF0, 0xB3, 0x90, 0x00, 0x5F, 0x70, 0x58, 0x85, 0x97, 0xED, 0x1F, 0x5C, 0x67,
+ 0x96, 0x45, 0x31, 0xC5, 0xCF, 0xDC, 0x00, 0x48, 0x34, 0xDF, 0x0B, 0x5B, 0xFB, 0xC0, 0xB3, 0x3F,
+ 0x72, 0xFF, 0x0D, 0x05, 0x4E, 0x4D, 0x42, 0x6F, 0x65, 0x75, 0x1B, 0xB5, 0xCA, 0xB5, 0xA6, 0x67,
+ 0x18, 0x77, 0x51, 0x21, 0x4D, 0x0B, 0xC3, 0x6B, 0xB7, 0x70, 0x78, 0x81, 0xCC, 0xB1, 0xD8, 0xCD,
+ 0xFA, 0xA4, 0x40, 0x80, 0xEF, 0x90, 0xE6, 0x64, 0x4C, 0x7E, 0xC7, 0x5F, 0x90, 0xF1, 0xA0, 0x66,
+ 0x7C, 0x06, 0x4F, 0xF9, 0xD3, 0x96, 0x31, 0x96, 0x4B, 0x91, 0x8B, 0x94, 0x45, 0x59, 0xCB, 0xE1,
+ 0x5F, 0x45, 0xBD, 0xDD, 0x29, 0xED, 0x2D, 0xFE, 0xDD, 0x58, 0xBC, 0xED, 0x4A, 0x8B, 0xEE, 0xF5,
+ 0xEA, 0x9B, 0xDC, 0xCE, 0x55, 0xB6, 0x9A, 0x3E, 0xE0, 0xD0, 0xE0, 0x1E, 0xDE, 0xB4, 0x33, 0xF1,
+ 0xA5, 0x1B, 0x07, 0x2B, 0x5F, 0xA2, 0x59, 0x28, 0xD7, 0xC3, 0x3B, 0x52, 0xBF, 0x4C, 0x2E, 0xD7,
+ 0x88, 0x22, 0x77, 0xD9, 0x51, 0x27, 0x08, 0xA4, 0xC7, 0xF3, 0x5B, 0xF2, 0x7B, 0x6D, 0x34, 0x6E,
+ 0x81, 0x53, 0xB2, 0xB8, 0x0F, 0xDE, 0x51, 0x75, 0x20, 0x36, 0x1E, 0x86, 0xB5, 0x1D, 0xCF, 0xCA,
+ 0x5D, 0xEF, 0x00, 0x3E, 0x68, 0xD6, 0x8C, 0x09, 0xE6, 0x12, 0x2D, 0x97, 0x24, 0xFD, 0x6A, 0xB1,
+ 0xD5, 0x13, 0x18, 0x1A, 0xBF, 0x8D, 0xE5, 0x38, 0x7E, 0x57, 0x47, 0x09, 0xEC, 0xA9, 0xDF, 0x97,
+ 0xDA, 0x8C, 0x91, 0x2F, 0x29, 0x2D, 0xAC, 0x8B, 0xCA, 0xC7, 0x03, 0xD8, 0x68, 0xF9, 0x77, 0x2E,
+ 0x9F, 0x5F, 0xCE, 0xD8, 0xA4, 0x39, 0x0E, 0x64, 0xB8, 0xD8, 0x21, 0x7D, 0xCE, 0x68, 0xA5, 0xD5,
+ 0x38, 0x79, 0x9F, 0x90, 0x49, 0x33, 0x72, 0x05, 0x72, 0x4C, 0x76, 0x83, 0x35, 0xFC, 0x1A, 0xE2,
+ 0xF4, 0x60, 0xC8, 0xA8, 0x54, 0xC3, 0xC1, 0x4D, 0x17, 0xFD, 0xAE, 0xA9, 0xA9, 0x20, 0xFE, 0xF9,
+ 0x25, 0x4A, 0xE3, 0x22, 0xDC, 0x7D, 0xE0, 0xFC, 0x47, 0xF7, 0xA6, 0xF3, 0x3F, 0xCE, 0xC8, 0x2E,
+ 0x8B, 0xCE, 0xFA, 0x46, 0x8D, 0x38, 0x4B, 0x3C, 0xB6, 0x23, 0xA9, 0x2E, 0x53, 0xD9, 0xC3, 0x60,
+ 0x60, 0xFF, 0x10, 0xC7, 0x38, 0x54, 0x5C, 0xBD, 0x3E, 0xB1, 0x52, 0x2C, 0x30, 0xB3, 0x6D, 0x14,
+ 0x5B, 0x4D, 0xAD, 0x68, 0x9E, 0xD6, 0x0A, 0x91, 0xFD, 0x40, 0x69, 0xE1, 0xB3, 0x76, 0x21, 0x9D,
+ 0x5D, 0x97, 0x9F, 0x01, 0x11, 0x55, 0x9A, 0x82, 0x57, 0x1D, 0xD6, 0x55, 0xE7, 0x20, 0x5E, 0x12,
+ 0x0A, 0xD9, 0xA8, 0x26, 0xB9, 0x1B, 0x0A, 0xE5, 0xB0, 0x25, 0x79, 0xB2, 0x94, 0x9F, 0x43, 0xA6,
+ 0xBA, 0x29, 0x7E, 0x61, 0x4C, 0x48, 0xEA, 0xBE, 0xC1, 0x5D, 0xE8, 0xF0, 0xEB, 0x4B, 0xE1, 0xF5,
+ 0x4B, 0x2D, 0xD3, 0xAA, 0x1C, 0x51, 0x00, 0x15, 0x16, 0x64, 0xFC, 0xC3, 0x2B, 0xF0, 0x91, 0xBC,
+ 0xF9, 0xDB, 0xE9, 0x88, 0x70, 0xD3, 0x56, 0x47, 0xA3, 0x65, 0xA3, 0x34, 0x74, 0xD8, 0x97, 0x14,
+ 0x7B, 0xA5, 0x1E, 0x12, 0xD7, 0xA6, 0x88, 0x00, 0x91, 0x49, 0xFE, 0xD8, 0xF1, 0x0F, 0x59, 0xE3,
+ 0xED, 0x5D, 0x8E, 0x39, 0x0D, 0x10, 0xB5, 0x42, 0x31, 0x31, 0x6A, 0x7A, 0x56, 0xD0, 0x25, 0xB6,
+ 0x47, 0x7D, 0xBB, 0xCE, 0x47, 0x0A, 0xA7, 0xFF, 0xB9, 0xCB, 0xED, 0x79, 0xFF, 0xFE, 0x16, 0x0C,
+ 0x5F, 0xC4, 0xAF, 0x31, 0x2C, 0xAB, 0x23, 0xA9, 0xBB, 0x2E, 0x9B, 0x09, 0xFA, 0x52, 0xC6, 0x80,
+ 0xF8, 0xB7, 0x3A, 0xFD, 0xD2, 0xAC, 0xBF, 0x87, 0x77, 0x3B, 0x71, 0x25, 0xCA, 0xDB, 0xC7, 0xE9,
+ 0x90, 0xCC, 0x98, 0x42, 0x36, 0xCE, 0xF5, 0x9F, 0x3D, 0x52, 0xDD, 0xE8, 0xB3, 0xFB, 0x46, 0x94,
+ 0xAE, 0x17, 0xC8, 0xA4, 0x84, 0xF7, 0xA7, 0xD3, 0xBD, 0x31, 0xCE, 0x90, 0xAF, 0xE7, 0x88, 0x59,
+ 0x06, 0x68, 0x7F, 0x05, 0xEB, 0x93, 0xDC, 0x17, 0x41, 0x1C, 0xE0, 0x8B, 0x08, 0x98, 0xCE, 0x45,
+ 0xF2, 0xE5, 0x8C, 0xF7, 0xBA, 0xBB, 0x2B, 0x0D, 0x2D, 0x78, 0xC7, 0x37, 0xB2, 0xDD, 0xE9, 0x86,
+ 0x75, 0x96, 0xB7, 0xB6, 0x90, 0x14, 0x0E, 0xB8, 0x65, 0x74, 0xC9, 0x4A, 0xA7, 0x7B, 0x39, 0x88,
+ 0x61, 0x02, 0x24, 0x55, 0x21, 0x14, 0x9B, 0x29, 0xC3, 0xB1, 0x37, 0xE3, 0x48, 0xCE, 0xAE, 0x42,
+ 0x07, 0x2C, 0x08, 0xC8, 0x6E, 0xCE, 0x6F, 0xF6, 0x40, 0x40, 0xBD, 0xC2, 0xC9, 0x76, 0x7B, 0x11,
+ 0xF7, 0x81, 0xD9, 0xE7, 0x6D, 0x4B, 0x1B, 0xDB, 0x9E, 0x13, 0x30, 0xDB, 0x55, 0xBB, 0x84, 0xE7,
+ 0x0F, 0xBA, 0x13, 0x72, 0x04, 0xBE, 0x94, 0x13, 0xB4, 0xA8, 0xF4, 0x23, 0x89, 0x20, 0x1D, 0x5A,
+ 0xC2, 0x23, 0xCF, 0x41, 0x38, 0xCD, 0xFF, 0x93, 0x76, 0x7D, 0xF6, 0x95, 0x5A, 0x3C, 0x27, 0x27,
+ 0xEC, 0x79, 0xA8, 0xF7, 0x41, 0x5C, 0xA4, 0xD7, 0x37, 0x09, 0x6E, 0xBD, 0x1D, 0x2C, 0x59, 0xFE,
+ 0xD7, 0x6B, 0x73, 0xC1, 0x1F, 0x97, 0x5F, 0x9F, 0x1E, 0xDE, 0x23, 0x9D, 0xFF, 0xE2, 0x83, 0x52,
+ 0x9E, 0xB0, 0x80, 0x2D, 0x2E, 0xE4, 0x99, 0xB1, 0x02, 0x28, 0x69, 0xEB, 0x0B, 0x5E, 0xD0, 0xEA,
+ 0xB4, 0x77, 0x96, 0xBD, 0x79, 0xE9, 0xCB, 0x1B, 0xBD, 0x4D, 0x39, 0x83, 0x4E, 0x2D, 0x62, 0x94,
+ 0xB2, 0x29, 0xFC, 0x9E, 0xC3, 0x18, 0x60, 0x8C, 0xE0, 0x60, 0x40, 0x10, 0x97, 0x16, 0xAB, 0x3A,
+ 0x85, 0x2D, 0xD5, 0x80, 0x0C, 0xDA, 0xB7, 0x41, 0xE4, 0x6A, 0x07, 0x75, 0xC5, 0x43, 0x49, 0x6B,
+ 0xBB, 0xA6, 0x12, 0x84, 0xBF, 0xDD, 0x4D, 0x76, 0xC8, 0x0F, 0xEC, 0xC1, 0x1B, 0xFE, 0x24, 0x67,
+ 0x37, 0x08, 0x42, 0xA5, 0x61, 0x60, 0xC9, 0x2B, 0x32, 0x25, 0x88, 0xB4, 0x99, 0x68, 0x40, 0xAD,
+ 0x68, 0x49, 0xD5, 0x61, 0xF9, 0xBA, 0x5A, 0xDD, 0xB1, 0x47, 0xB1, 0xA9, 0x61, 0x38, 0x87, 0xC4,
+ 0x86, 0x88, 0x0B, 0x7B, 0xA8, 0xCD, 0xB0, 0x35, 0x62, 0xA2, 0xDA, 0x7A, 0x3C, 0x85, 0x00, 0x66,
+ 0x79, 0x74, 0xFF, 0x79, 0x6F, 0x6C, 0x4B, 0x21, 0x65, 0x7E, 0x2F, 0xFF, 0x8A, 0xD8, 0xE8, 0x69,
+ 0x3D, 0x3D, 0xF5, 0xB8, 0xEF, 0x8B, 0x6D, 0xE8, 0x6F, 0x69, 0x2F, 0x8B, 0x49, 0xD8, 0x10, 0xF5,
+ 0x42, 0xB9, 0xA6, 0x2A, 0xC8, 0xB2, 0xE7, 0x6A, 0x20, 0x84, 0x89, 0x07, 0xA0, 0xFF, 0xC8, 0x0D,
+ 0x8D, 0xEE, 0xB6, 0xED, 0x7B, 0x03, 0x46, 0x36, 0xC7, 0x69, 0x8A, 0x18, 0x88, 0x5C, 0xBB, 0xA9,
+ 0xC0, 0x40, 0x49, 0x16, 0xB4, 0x85, 0x50, 0x88, 0x3D, 0x50, 0x7C, 0x50, 0x3B, 0x12, 0x19, 0xEB,
+ 0x9E, 0x1F, 0x44, 0x11, 0x8B, 0x1C, 0xF0, 0xCF, 0xE1, 0x76, 0xA4, 0xAB, 0x4F, 0x2E, 0x46, 0x43,
+ 0xA4, 0xB2, 0x6E, 0x79, 0x4A, 0x89, 0x19, 0x70, 0xD8, 0xBE, 0xF5, 0x8D, 0xAA, 0x5B, 0x23, 0xB8,
+ 0xBA, 0xFB, 0xE6, 0xA7, 0xF1, 0xE8, 0xA3, 0xF8, 0xE7, 0x2D, 0x7F, 0x3B, 0x7D, 0x89, 0x48, 0x99,
+ 0xAC, 0x5A, 0xC0, 0x5B, 0xCD, 0xE3, 0xC1, 0x65, 0x52, 0xB0, 0xA5, 0xFC, 0x5C, 0xA2, 0xEB, 0xFB,
+ 0x61, 0x04, 0xE2, 0xC9, 0xD6, 0x24, 0x27, 0x12, 0x2F, 0x3A, 0x9E, 0xE6, 0x97, 0x87, 0x19, 0x4F,
+ 0xBB, 0x09, 0x80, 0x4A, 0xAD, 0x9B, 0x18, 0x8E, 0x43, 0x91, 0xAF, 0x2C, 0x54, 0xE8, 0xDB, 0xB8,
+ 0x0C, 0x11, 0xC7, 0x29, 0xE7, 0x76, 0xCF, 0xAA, 0xCC, 0x83, 0x77, 0x4E, 0xE6, 0x4D, 0x78, 0xFD,
+ 0x1C, 0x14, 0xCA, 0x1F, 0x0F, 0xA3, 0x70, 0xDB, 0x33, 0x44, 0xF2, 0x34, 0x3F, 0xDB, 0x5E, 0x1F,
+ 0x9B, 0x25, 0x47, 0x44, 0x5F, 0x04, 0xCD, 0xBA, 0x79, 0x2A, 0x21, 0xD0, 0x8B, 0x71, 0xF8, 0x9F,
+ 0x16, 0x6D, 0xEE, 0x1A, 0xE9, 0x6C, 0x52, 0xDB, 0x8D, 0x17, 0x28, 0xAD, 0xFD, 0xEF, 0x7B, 0xAC,
+ 0x53, 0x6B, 0xED, 0x11, 0x04, 0x83, 0xFD, 0x96, 0x2E, 0xB2, 0x31, 0xC6, 0x0C, 0x13, 0x4C, 0x20,
+ 0x58, 0x19, 0xDE, 0x2F, 0x8C, 0xF1, 0x63, 0x48, 0x8C, 0x3A, 0xE9, 0xF8, 0x81, 0x75, 0x0D, 0x10,
+ 0x1E, 0x74, 0xA5, 0x7E, 0xF7, 0xC3, 0x11, 0xFB, 0x20, 0xF0, 0xF9, 0x72, 0x7B, 0x8B, 0xF4, 0x3C,
+ 0xCC, 0x54, 0x5F, 0xA6, 0xEF, 0xA8, 0x03, 0xB3, 0x7E, 0x72, 0xEB, 0xA0, 0x93, 0x67, 0xAC, 0x38,
+ 0x9F, 0xD6, 0xEF, 0x16, 0x1D, 0x33, 0x4B, 0xC5, 0x80, 0x60, 0x70, 0xF1, 0xF8, 0x10, 0x91, 0x2D,
+ 0xA7, 0x04, 0xDD, 0x0A, 0xEB, 0xEC, 0x2F, 0xA3, 0xB9, 0x4B, 0x79, 0x96, 0x3C, 0xA4, 0xE8, 0x47,
+ 0xA5, 0xDA, 0xE2, 0x65, 0x94, 0xEA, 0xAA, 0x32, 0x78, 0xBD, 0x6F, 0xA2, 0x78, 0x7D, 0x15, 0x7D,
+ 0xC3, 0xE8, 0x28, 0x91, 0xE4, 0x3C, 0x91, 0x3C, 0xC1, 0x42, 0xEA, 0x0A, 0x51, 0x3E, 0x40, 0x4B,
+ 0xAF, 0xB5, 0xBF, 0x56, 0x42, 0xDE, 0x98, 0xE5, 0xC5, 0xB7, 0xF5, 0x14, 0x22, 0xDB, 0xA6, 0xA4,
+ 0x7E, 0x88, 0xEA, 0xD1, 0x2F, 0x57, 0xD0, 0x3D, 0x17, 0x41, 0x7D, 0xD8, 0x4C, 0x3D, 0x49, 0xC4,
+ 0xF3, 0x0D, 0xC4, 0x80, 0xBE, 0x6C, 0x1A, 0x26, 0xEB, 0xBF, 0xF6, 0x95, 0xE7, 0x9A, 0x44, 0x41,
+ 0x90, 0x1F, 0xD1, 0x70, 0x7B, 0x65, 0xA1, 0x0F, 0xA3, 0xAA, 0xB5, 0xF1, 0xC0, 0x3D, 0x31, 0x92,
+ 0xA7, 0x2F, 0xB4, 0x72, 0xAB, 0x7A, 0x61, 0xB5, 0x37, 0xBF, 0xC2, 0xE5, 0x41, 0xBA, 0x75, 0x5D,
+ 0xB3, 0x59, 0xFA, 0x96, 0x04, 0x59, 0x2B, 0x96, 0x10, 0x79, 0x66, 0x76, 0xF7, 0x71, 0xCB, 0x37,
+ 0xF7, 0x60, 0x19, 0x59, 0x21, 0x5F, 0xEE, 0x8B, 0x2D, 0x91, 0x3D, 0xEB, 0x57, 0x65, 0xB4, 0x09,
+ 0x09, 0x38, 0xEB, 0x70, 0x96, 0x43, 0x87, 0x80, 0x07, 0x9F, 0x0B, 0x09, 0x03, 0xF8, 0x5F, 0xF4,
+ 0x5A, 0x53, 0x60, 0x86, 0x48, 0x8A, 0xB3, 0xB6, 0x34, 0xE0, 0xFC, 0xE5, 0x95, 0x12, 0xE7, 0x7C,
+ 0xE9, 0x14, 0x56, 0x2D, 0x8D, 0x9C, 0xA8, 0x6F, 0x2F, 0x65, 0x29, 0xBC, 0xC2, 0xEB, 0xA8, 0xD2,
+ 0xA9, 0xD3, 0x3E, 0x7E, 0xED, 0x28, 0x9C, 0xFD, 0x15, 0x5D, 0x64, 0x21, 0x30, 0xAB, 0xD3, 0x0C,
+ 0x0D, 0x63, 0x5B, 0xC5, 0xBE, 0x03, 0xB1, 0x03, 0x7E, 0x7E, 0xE5, 0xCC, 0x0C, 0x1C, 0xB8, 0x74,
+ 0x57, 0x58, 0x0E, 0xA1, 0xBE, 0xA7, 0x90, 0x3B, 0x9B, 0x98, 0xB2, 0xC0, 0xF3, 0x97, 0x41, 0xBD,
+ 0x1F, 0xD7, 0x31, 0x42, 0xB6, 0xFF, 0x6D, 0x4B, 0xEC, 0x4D, 0x98, 0x15, 0x71, 0x46, 0x4C, 0x14,
+ 0x7B, 0x59, 0xE2, 0x88, 0xE4, 0x4E, 0xF2, 0x74, 0x6F, 0x64, 0x4A, 0xEE, 0x46, 0x46, 0x4F, 0xC6,
+ 0xF5, 0x3C, 0x12, 0xC8, 0xBE, 0x8C, 0x55, 0x19, 0xC5, 0xC0, 0x9F, 0x31, 0xC4, 0xDA, 0xCB, 0x3C,
+ 0xF3, 0xC6, 0x42, 0xBC, 0x3B, 0x96, 0x62, 0xB9, 0x77, 0x54, 0x41, 0xE6, 0x74, 0x82, 0xBA, 0xCB,
+ 0x32, 0x7A, 0x8D, 0x05, 0xBF, 0x3C, 0x4A, 0x97, 0x2A, 0xF7, 0xEC, 0xCF, 0xA0, 0x3E, 0x5A, 0xDC,
+ 0x41, 0x23, 0xB0, 0xB8, 0x56, 0x55, 0xD8, 0xC2, 0xA7, 0x3F, 0x32, 0x37, 0xD3, 0x6F, 0x01, 0xA2,
+ 0x0E, 0x26, 0xD7, 0xB5, 0xA0, 0xA5, 0x34, 0x22, 0x47, 0xFD, 0xD1, 0x52, 0xF3, 0xE1, 0xE0, 0xAB,
+ 0xF9, 0xD0, 0x8E, 0x7C, 0x42, 0x1D, 0x11, 0xEA, 0xA4, 0xCE, 0x38, 0x68, 0xDE, 0xBC, 0xBA, 0x6A,
+ 0x50, 0x91, 0x54, 0x86, 0x0E, 0x98, 0xAA, 0x2C, 0x57, 0x5C, 0x2A, 0x70, 0x57, 0x58, 0x6A, 0xD1,
+ 0x9C, 0xB9, 0xEB, 0x5E, 0xD2, 0x35, 0xD9, 0xC5, 0x2A, 0x6B, 0x0C, 0x60, 0x39, 0xE4, 0x4C, 0xCD,
+ 0xF0, 0xFB, 0xF7, 0x52, 0x86, 0x48, 0xCF, 0x27, 0xB4, 0x9A, 0xC7, 0x20, 0xB2, 0xDD, 0x5E, 0x7D,
+ 0x4F, 0x2B, 0xC5, 0x96, 0xC5, 0xAE, 0x65, 0x26, 0xD9, 0x18, 0xC6, 0xBE, 0x59, 0xFF, 0x85, 0x51,
+ 0x6D, 0xE6, 0x4E, 0xED, 0x25, 0x7D, 0x8D, 0x86, 0xDD, 0xB9, 0x06, 0x7A, 0x76, 0x66, 0x68, 0x42,
+ 0x13, 0x6F, 0xC8, 0x7D, 0xF8, 0x9E, 0x9B, 0x51, 0xFD, 0xEE, 0x2F, 0xF5, 0x19, 0x5E, 0x14, 0x4E,
+ 0xFB, 0x69, 0x68, 0xE6, 0x9D, 0xB7, 0xD5, 0x31, 0xBB, 0xB4, 0x96, 0x4F, 0x25, 0x86, 0x25, 0xDA,
+ 0x98, 0xC7, 0x3A, 0xD6, 0x10, 0xD0, 0xD4, 0x52, 0x5C, 0x5E, 0x4E, 0xFD, 0xE5, 0x04, 0x6E, 0x37,
+ 0xDE, 0x84, 0x55, 0x6A, 0xB4, 0xAA, 0xC3, 0x50, 0xCB, 0x36, 0x3D, 0x0F, 0x68, 0x26, 0x2D, 0xA0,
+ 0xBB, 0xC3, 0x58, 0x85, 0x37, 0xC3, 0xD5, 0xC2, 0x13, 0x17, 0x15, 0x59, 0x77, 0x4D, 0xEE, 0x44,
+ 0xC2, 0x1E, 0x37, 0x10, 0x44, 0xC3, 0xCD, 0xB5, 0x9C, 0xD7, 0xE2, 0x82, 0xA9, 0x77, 0x83, 0x83,
+ 0xCC, 0xB8, 0xC1, 0xB0, 0xD5, 0x2D, 0xE2, 0xC2, 0x0D, 0x1A, 0x40, 0xCE, 0xBF, 0x57, 0x33, 0x19,
+ 0xFF, 0xB7, 0x9C, 0xC2, 0xAF, 0x3B, 0x7A, 0x51, 0x16, 0x0B, 0x6C, 0xB1, 0x89, 0x49, 0x7D, 0x11,
+ 0x78, 0x79, 0x99, 0xAF, 0x68, 0xB9, 0xB7, 0xA8, 0xC2, 0x8C, 0xD4, 0x54, 0x2A, 0xCB, 0xC1, 0xFA,
+ 0xBA, 0x23, 0x18, 0x44, 0xFB, 0xF4, 0x0D, 0xA9, 0xBD, 0x93, 0x33, 0x55, 0x85, 0xC6, 0xD9, 0xE9,
+ 0xCA, 0x48, 0x4C, 0xBF, 0xA8, 0xA2, 0x19, 0x9C, 0x38, 0xFD, 0x3E, 0xA6, 0x83, 0x9A, 0xFC, 0x94,
+ 0xF7, 0xF7, 0xCC, 0xD5, 0x61, 0xED, 0x3C, 0x02, 0x8B, 0xF4, 0x4E, 0xAF, 0x8A, 0x34, 0xEA, 0x30,
+ 0x4F, 0x65, 0x1A, 0x79, 0x8B, 0x64, 0xAB, 0x9D, 0x3C, 0x90, 0x6B, 0x1D, 0x17, 0x9A, 0x05, 0x9D,
+ 0x11, 0xF6, 0xC1, 0x45, 0x86, 0x87, 0xC0, 0x79, 0xAB, 0x5D, 0x9B, 0x1F, 0xAA, 0x80, 0x7F, 0x7C,
+ 0x4C, 0xAD, 0x26, 0x47, 0x9B, 0xB8, 0x59, 0x79, 0x18, 0x61, 0xC7, 0x29, 0x28, 0xCA, 0xB5, 0xC4,
+ 0x5E, 0x18, 0xA4, 0x02, 0x91, 0x9C, 0xBB, 0x63, 0xBB, 0xBA, 0xCE, 0xBC, 0xC4, 0xB8, 0x65, 0xDA,
+ 0xC4, 0x33, 0xB2, 0x44, 0xDC, 0x26, 0xB9, 0x91, 0x34, 0xA4, 0x69, 0x03, 0x4B, 0x55, 0x12, 0xAB,
+ 0x5E, 0x20, 0x49, 0xFB, 0x3F, 0xA4, 0x68, 0x23, 0x0F, 0xDF, 0xB6, 0xA1, 0x56, 0x98, 0xDD, 0x8B,
+ 0xE7, 0x33, 0xFD, 0x5C, 0x80, 0x69, 0x6E, 0x2E, 0x81, 0xD4, 0x4A, 0x8F, 0x1A, 0xD2, 0x88, 0x8C,
+ 0x1A, 0xB7, 0x41, 0xB4, 0x93, 0x82, 0x4B, 0xC9, 0xED, 0xF0, 0xC7, 0x2F, 0x4B, 0xA4, 0xB3, 0xD5,
+ 0x70, 0x47, 0x3A, 0x6F, 0xBD, 0x45, 0x85, 0x4D, 0x91, 0xDA, 0x28, 0x83, 0x6C, 0xDF, 0x24, 0xD5,
+ 0xFC, 0x4A, 0xE2, 0xFD, 0xD5, 0xC2, 0x5F, 0xC3, 0x69, 0xF4, 0x2A, 0x19, 0xD2, 0x2B, 0x13, 0xC3,
+ 0x57, 0x0D, 0x29, 0xD6, 0x6D, 0xB1, 0x1B, 0xA8, 0x38, 0x72, 0xBC, 0x09, 0x4E, 0x6B, 0x22, 0xF0,
+ 0x89, 0x6C, 0x19, 0x7A, 0x61, 0x0C, 0xC8, 0xE5, 0xCD, 0x7A, 0xA8, 0x44, 0x15, 0xCF, 0x9A, 0x43,
+ 0xA7, 0xF4, 0x75, 0x0B, 0xD1, 0x60, 0x57, 0xF6, 0xF9, 0xE5, 0x18, 0xE8, 0x80, 0xCE, 0x07, 0x17,
+ 0x17, 0x25, 0x1E, 0xA1, 0x15, 0x8C, 0x77, 0x14, 0x4F, 0x4C, 0xA0, 0x22, 0x85, 0x13, 0x5F, 0x54,
+ 0x28, 0x98, 0x23, 0x5A, 0x95, 0xC1, 0xFB, 0x1F, 0x69, 0x4D, 0xD3, 0x4C, 0x48, 0xAC, 0xD1, 0xF1,
+ 0xC6, 0x24, 0xFE, 0x02, 0x15, 0xFE, 0x00, 0x22, 0x14, 0x4A, 0x67, 0x5E, 0xD3, 0xE4, 0x36, 0x6B,
+ 0x04, 0xCA, 0x98, 0xDA, 0x97, 0x9E, 0x52, 0x9E, 0xE5, 0x94, 0xAA, 0x87, 0xEE, 0xCB, 0x08, 0xC8,
+ 0xA7, 0x24, 0x46, 0xF2, 0x23, 0x62, 0xD1, 0x9C, 0xA7, 0x7F, 0xCC, 0x93, 0xC1, 0x58, 0xFF, 0xA8,
+ 0x17, 0xAF, 0x56, 0x28, 0x1D, 0x9F, 0xFB, 0x28, 0x95, 0xBE, 0x48, 0x30, 0xBB, 0xD4, 0x0B, 0x3F,
+ 0xF3, 0x53, 0x34, 0xFC, 0x50, 0x5F, 0x90, 0x89, 0x28, 0xFE, 0x4C, 0x7E, 0x08, 0xF9, 0x0C, 0x53,
+ 0xD8, 0x16, 0xF7, 0x44, 0x88, 0x17, 0xFD, 0xFD, 0x21, 0x0D, 0x52, 0xBF, 0xD8, 0x74, 0xD8, 0xCF,
+ 0x7E, 0xB8, 0x70, 0x8B, 0xA9, 0xBB, 0x5A, 0xC9, 0x75, 0xF2, 0xC0, 0xD3, 0xC5, 0xE0, 0x61, 0x7B,
+ 0xEF, 0xA5, 0x51, 0x70, 0x37, 0xA1, 0xB8, 0x09, 0xAC, 0xF0, 0xF7, 0x43, 0xD5, 0xE8, 0xB5, 0x7C,
+ 0xE5, 0xE7, 0x97, 0xC8, 0x20, 0x88, 0x53, 0xA3, 0x8F, 0x2F, 0x6B, 0xB4, 0xD2, 0xF9, 0x88, 0xDE,
+ 0x15, 0xE3, 0x88, 0xA6, 0x94, 0xC3, 0x51, 0xCE, 0xFF, 0x2F, 0xF5, 0x59, 0xB8, 0xB4, 0x49, 0x6A,
+ 0xAE, 0x6E, 0x8B, 0x63, 0x7B, 0x08, 0xB0, 0xD7, 0x00, 0x3A, 0xF6, 0xBF, 0x55, 0x63, 0xB1, 0x09,
+ 0x24, 0x14, 0x39, 0x56, 0x62, 0x18, 0x33, 0x64, 0x64, 0xEF, 0xAA, 0xA8, 0xC9, 0x38, 0x2A, 0xA2,
+ 0x70, 0x4A, 0x61, 0x66, 0x6F, 0xD7, 0x73, 0xF7, 0xF0, 0x8B, 0x34, 0xC4, 0x92, 0xD1, 0x63, 0xFC,
+ 0x05, 0xC6, 0xD4, 0xE4, 0x9B, 0x8F, 0x4E, 0x2A, 0x58, 0x2A, 0xA7, 0x7C, 0x47, 0x34, 0x01, 0xF3,
+ 0x5D, 0x0F, 0x99, 0xF3, 0x21, 0x86, 0xB7, 0x52, 0x8F, 0x06, 0x60, 0x1D, 0xC6, 0xBB, 0xC4, 0x5A,
+ 0x8F, 0x9B, 0x5E, 0x43, 0x4A, 0xA4, 0x2C, 0x1A, 0xAD, 0xB8, 0x74, 0x79, 0x2C, 0x2D, 0x3A, 0x31,
+ 0x21, 0x7F, 0x63, 0x91, 0x0C, 0xED, 0xFF, 0x33, 0xF4, 0x2D, 0x19, 0xB6, 0x83, 0xD3, 0x33, 0x7B,
+ 0xE7, 0x9C, 0xF1, 0x8E, 0xAF, 0x57, 0x91, 0x81, 0x3A, 0x86, 0x1D, 0xA8, 0xC4, 0x58, 0x78, 0xA8,
+ 0xE8, 0x34, 0xB9, 0xE6, 0x57, 0x89, 0x4E, 0xD3, 0x72, 0xD3, 0xD2, 0x09, 0x8C, 0xF1, 0x5B, 0xFB,
+ 0x64, 0xDB, 0xA5, 0x32, 0x17, 0x99, 0x65, 0x08, 0x31, 0xAD, 0x89, 0x64, 0x60, 0x60, 0xB8, 0xFE,
+ 0x77, 0xE5, 0x33, 0x80, 0xF8, 0x41, 0x75, 0xF0, 0xAE, 0x04, 0xB3, 0x49, 0x6C, 0x24, 0x33, 0xC8,
+ 0x7A, 0x09, 0x43, 0x6D, 0x0F, 0x88, 0xE6, 0xCD, 0x35, 0xA8, 0xF2, 0xBD, 0xEA, 0x39, 0xA6, 0x46,
+ 0xB5, 0x21, 0xD4, 0xC0, 0xF5, 0x91, 0xDD, 0x9C, 0x58, 0x68, 0x04, 0x99, 0x58, 0x1C, 0xC2, 0x03,
+ 0xED, 0x1D, 0xCA, 0x93, 0xBA, 0x18, 0x1D, 0xDD, 0xB4, 0xBB, 0xE2, 0x1E, 0x38, 0x59, 0x04, 0x5E,
+ 0x8E, 0xFF, 0x80, 0xEC, 0xBB, 0x57, 0xE4, 0xA8, 0x9F, 0x4D, 0xC3, 0xE5, 0x15, 0x71, 0x57, 0xDD,
+ 0x02, 0xB2, 0x67, 0x50, 0xD2, 0xDB, 0x95, 0xFF, 0x03, 0x2C, 0xDE, 0xE3, 0x78, 0x4F, 0xFE, 0xA9,
+ 0xAC, 0xE7, 0xE9, 0xC9, 0xA6, 0xB0, 0xCF, 0x98, 0x5E, 0xF7, 0xD7, 0x2C, 0x92, 0x78, 0x44, 0xB9,
+ 0xA0, 0x1A, 0xA4, 0x17, 0xA3, 0x50, 0x5E, 0x7E, 0x1A, 0x9F, 0x18, 0x3C, 0x53, 0x8A, 0xFC, 0x9C,
+ 0xF1, 0x58, 0x5D, 0xA3, 0xD5, 0x18, 0x6C, 0xC7, 0x55, 0x2F, 0x46, 0x5D, 0xFB, 0x33, 0x75, 0x50,
+ 0x0A, 0x28, 0x37, 0x99, 0xBD, 0x06, 0xAD, 0x14, 0x84, 0xB5, 0x9D, 0xDF, 0x04, 0x3F, 0x33, 0x28,
+ 0x1F, 0xD8, 0x57, 0xB7, 0x6A, 0x90, 0x18, 0xC7, 0xA6, 0x1B, 0x56, 0xD1, 0xBF, 0x22, 0x4E, 0x33,
+ 0x6A, 0x7F, 0x94, 0xB8, 0xA6, 0x0C, 0xA0, 0xE0, 0x7C, 0xD1, 0xEE, 0xDA, 0xFF, 0xE0, 0x9B, 0x41,
+ 0x75, 0xD7, 0xCA, 0x96, 0x01, 0xA9, 0xAA, 0xAD, 0x75, 0x54, 0xBA, 0x86, 0x14, 0xF1, 0x84, 0x66,
+ 0xC3, 0xC8, 0x66, 0x71, 0x63, 0x0D, 0x4A, 0x2C, 0x85, 0x4E, 0xD7, 0x6F, 0x9A, 0x59, 0x51, 0x8A,
+ 0xB6, 0xAF, 0xF5, 0x5F, 0x18, 0xA2, 0x49, 0xD0, 0x34, 0xD4, 0x51, 0xF9, 0x8D, 0xA3, 0x91, 0x59,
+ 0x7C, 0x87, 0x9D, 0x31, 0x14, 0xE0, 0xF0, 0x08, 0x95, 0x2C, 0x61, 0xCC, 0x53, 0xE2, 0x15, 0x9D,
+ 0xEE, 0xA1, 0xC2, 0xDE, 0x2B, 0x53, 0xB6, 0x21, 0x88, 0xE0, 0x5B, 0x77, 0x1F, 0x50, 0xEF, 0xFA,
+ 0xAA, 0x48, 0xCF, 0x97, 0x40, 0x3B, 0xC1, 0x82, 0x34, 0x6D, 0xAB, 0xB4, 0xAD, 0x5A, 0xE3, 0x99,
+ 0x78, 0xB6, 0xBD, 0x16, 0x34, 0x32, 0xC9, 0xA2, 0xC2, 0xA1, 0xAB, 0xB3, 0xFA, 0xA6, 0x62, 0x7D,
+ 0xB5, 0xF7, 0x89, 0xAD, 0x9A, 0xA9, 0x7E, 0x1C, 0x7F, 0x9C, 0x64, 0x30, 0x47, 0x9B, 0x6E, 0x48,
+ 0x62, 0x2C, 0xDE, 0x9A, 0xAF, 0x2A, 0xE2, 0xF1, 0x7B, 0xEA, 0xA2, 0xAA, 0x75, 0x3C, 0xB5, 0xB2,
+ 0xC5, 0x2F, 0x0F, 0x50, 0x36, 0x15, 0x12, 0x71, 0x48, 0x2A, 0xD2, 0x73, 0x02, 0xB3, 0xA8, 0xBE,
+ 0x24, 0x18, 0x79, 0xB0, 0xE0, 0x06, 0x07, 0x13, 0xE5, 0xF6, 0x32, 0x96, 0x9C, 0x88, 0x6B, 0xF0,
+ 0xFB, 0xA9, 0x04, 0x52, 0x18, 0x41, 0x91, 0x5D, 0x4C, 0xDC, 0x96, 0x35, 0x45, 0x85, 0x1D, 0x1C,
+ 0xDF, 0x28, 0xCA, 0x07, 0xC5, 0x27, 0x47, 0xF7, 0x30, 0x6D, 0xDF, 0x28, 0x12, 0xCA, 0x28, 0x31,
+ 0x71, 0x77, 0xCC, 0x35, 0x0A, 0x2E, 0x81, 0xEE, 0xD2, 0x6F, 0x01, 0x95, 0x5A, 0x97, 0x44, 0xCA,
+ 0x18, 0x69, 0xD9, 0xA0, 0xC8, 0x88, 0xF3, 0x2B, 0x7A, 0x7F, 0xFD, 0x5F, 0xA6, 0x42, 0x3D, 0x1A,
+ 0x36, 0x78, 0x4D, 0x1B, 0x56, 0x8F, 0x3A, 0xCB, 0x65, 0x77, 0x9E, 0x78, 0x03, 0xDE, 0xA9, 0xE6,
+ 0x0D, 0x06, 0xF6, 0x43, 0xC6, 0x94, 0xCB, 0x37, 0xEA, 0xC1, 0x97, 0x01, 0x69, 0x41, 0x6D, 0x55,
+ 0x7C, 0xC8, 0x9C, 0xD1, 0x4A, 0x66, 0x9E, 0x90, 0x03, 0xCA, 0x29, 0x53, 0x68, 0x0F, 0x69, 0x6C,
+ 0x7D, 0xEB, 0xAD, 0xD9, 0x1A, 0xA4, 0x46, 0xB4, 0x92, 0x9C, 0x42, 0x0E, 0x9F, 0x81, 0x29, 0xA2,
+ 0xDF, 0xB0, 0x2C, 0x4C, 0x32, 0xA2, 0x57, 0x25, 0x01, 0xB1, 0x9C, 0x12, 0x53, 0xC7, 0xF0, 0x0A,
+ 0x60, 0xA6, 0x51, 0xC9, 0x8F, 0xB4, 0x52, 0x20, 0x8A, 0x61, 0x17, 0x76, 0xA3, 0x85, 0xB9, 0x51,
+ 0x02, 0x0A, 0x2D, 0x81, 0x07, 0x90, 0x56, 0x96, 0xA7, 0xF9, 0x5A, 0x36, 0x6E, 0x2A, 0xA8, 0x7E,
+ 0xC1, 0xD8, 0x23, 0x0E, 0x81, 0xBA, 0x85, 0xDD, 0x60, 0x61, 0x28, 0xEF, 0x93, 0x4E, 0x12, 0x9B,
+ 0x1A, 0x0B, 0xC7, 0xEB, 0x7C, 0xE0, 0xEF, 0x24, 0xA1, 0x0A, 0x7D, 0x98, 0xB8, 0x55, 0xF9, 0x88,
+ 0x42, 0xA2, 0x69, 0xC5, 0x8C, 0x24, 0xE1, 0xA1, 0xA4, 0xDE, 0x34, 0x6E, 0x08, 0xFD, 0x1F, 0x25,
+ 0x0C, 0x94, 0xEF, 0x08, 0x62, 0x63, 0x75, 0x08, 0x3E, 0x71, 0xAF, 0xA6, 0xFA, 0x5D, 0x8E, 0xA8,
+ 0x37, 0x00, 0xB7, 0xDF, 0x4A, 0x4D, 0x6E, 0x92, 0x0A, 0x45, 0x02, 0xF8, 0xF0, 0x08, 0x77, 0x38,
+ 0x0C, 0x2B, 0xAE, 0x15, 0xF8, 0x40, 0x6C, 0x40, 0xCC, 0x08, 0x76, 0xB4, 0xD5, 0x92, 0x59, 0x49,
+ 0xA0, 0x98, 0xEC, 0x65, 0xCE, 0xCC, 0xAF, 0x8B, 0xC4, 0xA9, 0xE8, 0x2B, 0x23, 0x90, 0xC0, 0x19,
+ 0x12, 0x15, 0x23, 0xCE, 0xD4, 0x80, 0x22, 0x82, 0x30, 0x6A, 0x50, 0xFA, 0x6D, 0x3A, 0xBD, 0x4B,
+ 0xE1, 0x5B, 0x1A, 0x07, 0x88, 0x4E, 0xD0, 0x42, 0xA6, 0xFD, 0x5E, 0x3C, 0x7F, 0x53, 0x20, 0xDD,
+ 0x9C, 0x46, 0xEA, 0xE8, 0x8D, 0x6F, 0x17, 0x57, 0x41, 0x59, 0xEA, 0x27, 0xC7, 0x70, 0xFB, 0x12,
+ 0x2D, 0x6C, 0xF7, 0xEF, 0xA7, 0x6A, 0x5C, 0x15, 0x09, 0xE3, 0x63, 0xF1, 0x5B, 0xB8, 0xE4, 0x69,
+ 0x92, 0x7C, 0x13, 0x90, 0xBB, 0xA3, 0xE8, 0xF0, 0xC9, 0xF3, 0xD5, 0x27, 0xB7, 0xC4, 0x2B, 0xEB,
+ 0x66, 0x19, 0x36, 0x9B, 0x88, 0x88, 0xFD, 0xBA, 0x0F, 0x2E, 0x66, 0x98, 0x94, 0x3C, 0x6F, 0x09,
+ 0x0B, 0x89, 0x35, 0x3A, 0x8A, 0x8A, 0x7B, 0xA5, 0x1F, 0x9B, 0x9D, 0x53, 0x67, 0xEE, 0xBC, 0x8C,
+ 0x63, 0x83, 0x11, 0x31, 0x87, 0x24, 0x36, 0xBA, 0x7F, 0xC5, 0xA2, 0x06, 0x33, 0x10, 0x79, 0xEC,
+ 0x01, 0x89, 0x48, 0x96, 0x2A, 0xC9, 0x25, 0x0F, 0xF3, 0x92, 0x1E, 0x52, 0x93, 0xCD, 0x65, 0x71,
+ 0x2B, 0x98, 0xE7, 0xC8, 0x29, 0xA3, 0x21, 0x43, 0xF0, 0x37, 0x3C, 0x36, 0x8E, 0x7F, 0xDC, 0x95,
+ 0xA1, 0x56, 0xA1, 0x20, 0xA1, 0xBC, 0x5C, 0x30, 0xDE, 0x52, 0x54, 0xC8, 0x73, 0xCE, 0xA6, 0x30,
+ 0x44, 0x0F, 0x3F, 0xA0, 0x7B, 0x7E, 0x11, 0x66, 0x2E, 0xD6, 0xD8, 0x85, 0x5B, 0x56, 0xC1, 0xD3,
+ 0xEE, 0xF1, 0x7E, 0xBA, 0x08, 0xF1, 0xA4, 0x49, 0xB3, 0x0C, 0x41, 0xA3, 0xFC, 0xAF, 0xA6, 0x9E,
+ 0x90, 0x25, 0x44, 0xC2, 0x36, 0x64, 0x74, 0x38, 0xC9, 0xBC, 0xA5, 0xE8, 0x36, 0x2E, 0x84, 0xCD,
+ 0xEA, 0x22, 0x8A, 0x09, 0x94, 0xB2, 0x38, 0x67, 0xC3, 0xBD, 0x7C, 0x79, 0x12, 0x3D, 0xE2, 0xA0,
+ 0x0A, 0x1F, 0xCE, 0xE7, 0x1D, 0x7A, 0xB5, 0x2B, 0x4E, 0x62, 0x82, 0x37, 0xEC, 0xFB, 0x7B, 0x05,
+ 0xAC, 0xE5, 0x10, 0x60, 0x8B, 0x09, 0x7D, 0xC8, 0x16, 0xE0, 0xFA, 0x78, 0x35, 0x13, 0xF6, 0x8D,
+ 0xB0, 0x39, 0x5F, 0xC8, 0xF4, 0x08, 0xCF, 0x0D, 0xA9, 0xA1, 0xC6, 0xE0, 0xDC, 0x0A, 0x4D, 0x54,
+ 0x6C, 0x47, 0x16, 0xFD, 0x61, 0x08, 0xD3, 0x90, 0xC3, 0x4A, 0xD2, 0xE0, 0x7E, 0xE9, 0xB1, 0x62,
+ 0xBD, 0x15, 0x61, 0xB8, 0x6A, 0xF2, 0x76, 0x66, 0xBB, 0x5C, 0xB6, 0x87, 0x40, 0x8B, 0xFF, 0x90,
+ 0x1F, 0xB7, 0x63, 0xF3, 0x73, 0xF4, 0xE9, 0xEB, 0x96, 0xA9, 0x73, 0xA5, 0xF5, 0x94, 0x5E, 0x16,
+ 0x9B, 0xB1, 0x9F, 0x2F, 0x6B, 0x9D, 0x13, 0x6F, 0x01, 0xD6, 0xB6, 0x74, 0xA7, 0x86, 0x19, 0x82,
+ 0x6F, 0x50, 0x1A, 0x44, 0x5D, 0x47, 0xC5, 0xC5, 0x66, 0xEF, 0x24, 0xE3, 0xA8, 0x16, 0xD3, 0xEB,
+ 0x2B, 0x06, 0x54, 0xDB, 0x9B, 0x1F, 0xFE, 0x8D, 0x03, 0x1C, 0x63, 0x4C, 0xFA, 0x7E, 0xB8, 0x5A,
+ 0xA3, 0x50, 0x2D, 0xE1, 0x04, 0xE1, 0x15, 0x31, 0xF7, 0xB3, 0x23, 0xD7, 0x0E, 0x78, 0x42, 0x4D,
+ 0x28, 0x1F, 0xF2, 0x9D, 0xFC, 0x4A, 0xEC, 0xA1, 0xF2, 0x6E, 0x40, 0xA2, 0xD9, 0xEC, 0x67, 0xDB,
+ 0x81, 0x7C, 0xEA, 0x72, 0x38, 0xAF, 0xA2, 0x06, 0xCC, 0xAB, 0x22, 0xFA, 0x5C, 0xF9, 0xB7, 0x9D,
+ 0xE5, 0x35, 0x11, 0xE8, 0xB3, 0x01, 0xFB, 0xEF, 0xE8, 0xE4, 0x08, 0x36, 0xDB, 0xB3, 0x83, 0x8D,
+ 0xD0, 0xA9, 0xFD, 0xFB, 0x8A, 0x28, 0x60, 0xD3, 0xDC, 0x72, 0x52, 0x40, 0x97, 0x53, 0xBB, 0xA2,
+ 0xAF, 0x6F, 0x04, 0x2B, 0xBE, 0x8E, 0x16, 0x2D, 0x0E, 0x7C, 0x2A, 0xEB, 0xC1, 0xC8, 0x6E, 0x96,
+ 0x29, 0x1F, 0x64, 0x26, 0xFF, 0x89, 0xF3, 0x2D, 0xF2, 0x26, 0xF0, 0x74, 0x0F, 0x4D, 0x7F, 0x2F,
+ 0x61, 0x3C, 0xE9, 0x03, 0x43, 0x82, 0x24, 0x2F, 0x80, 0x42, 0x5D, 0xBE, 0xFA, 0x13, 0x06, 0x0F,
+ 0xA8, 0x82, 0x44, 0x04, 0x97, 0xC4, 0x21, 0x21, 0x4C, 0x4D, 0xB4, 0x37, 0xB3, 0x5D, 0xD8, 0xF7,
+ 0xDB, 0xC3, 0xC6, 0x21, 0x98, 0xF3, 0x11, 0x7A, 0x8D, 0xD9, 0xE3, 0xD9, 0x7F, 0xF6, 0xED, 0x44,
+ 0xCC, 0xCB, 0x2A, 0x2D, 0x22, 0x3C, 0x23, 0x64, 0x25, 0xA0, 0xCC, 0xDE, 0x99, 0x01, 0xE8, 0xCB,
+ 0xB4, 0xE6, 0x4D, 0xEB, 0x57, 0xEC, 0xDA, 0xB3, 0x9A, 0x7E, 0xF5, 0xCC, 0x9B, 0x9D, 0x3A, 0xC8,
+ 0xD4, 0xA9, 0x39, 0x7D, 0x6A, 0x63, 0xC7, 0x48, 0xFF, 0x8E, 0x36, 0x81, 0x8C, 0x2B, 0x8F, 0x1E,
+ 0x52, 0x42, 0xEE, 0x1C, 0xBB, 0xB9, 0xE9, 0xC5, 0xB9, 0x27, 0x47, 0xA7, 0x92, 0x39, 0x01, 0x3E,
+ 0x35, 0xA9, 0x6C, 0x47, 0x55, 0x46, 0x07, 0x28, 0x82, 0x5C, 0x0A, 0xC7, 0x07, 0x6A, 0xE0, 0x57,
+ 0x9F, 0x3C, 0x08, 0xDA, 0xA2, 0x5E, 0xE8, 0xA1, 0xBC, 0xB2, 0x4F, 0xD1, 0xB0, 0x2E, 0x71, 0xC2,
+ 0xAC, 0xA4, 0xF1, 0x8B, 0xE1, 0xF8, 0x30, 0xD6, 0x48, 0xBC, 0x79, 0x74, 0xF6, 0xC3, 0x3F, 0x83,
+ 0x75, 0xC4, 0xC5, 0x20, 0xED, 0x01, 0xB6, 0xA9, 0x3B, 0x22, 0xC0, 0x1F, 0xC2, 0x49, 0xF0, 0xA9,
+ 0x5F, 0x53, 0x6D, 0x6D, 0xB8, 0xE1, 0x6D, 0x9E, 0xE8, 0xD5, 0x45, 0x34, 0x69, 0x87, 0xF8, 0x42,
+ 0x78, 0x1A, 0xD0, 0x07, 0x6A, 0xC6, 0x9E, 0x56, 0xEB, 0xA6, 0xF6, 0x71, 0x88, 0x80, 0x3A, 0xDD,
+ 0xDC, 0xC4, 0x8E, 0xA3, 0x74, 0x6D, 0x10, 0xBA, 0x26, 0x98, 0xE1, 0x68, 0x49, 0x6A, 0x86, 0x0F,
+ 0x62, 0xA5, 0x75, 0x83, 0xD9, 0x5A, 0xD6, 0x34, 0x81, 0x65, 0x17, 0xA9, 0xD2, 0xF0, 0x35, 0x35,
+ 0x27, 0x9D, 0x81, 0x72, 0xAE, 0xA4, 0xC0, 0xFE, 0x09, 0x95, 0xFA, 0x3D, 0x78, 0xEA, 0x3D, 0xA5,
+ 0xA9, 0xB6, 0x4B, 0x91, 0xBA, 0x31, 0x44, 0xCD, 0xD6, 0x94, 0x7A, 0x38, 0x40, 0x75, 0xD6, 0x4C,
+ 0x6F, 0x30, 0x8A, 0x8E, 0xF6, 0x75, 0x50, 0x70, 0x17, 0x28, 0xED, 0x0B, 0xDF, 0xEB, 0x8B, 0x94,
+ 0x05, 0x9B, 0x85, 0x7A, 0xAA, 0xE7, 0x76, 0xE4, 0x5D, 0x9D, 0x2A, 0x02, 0x9A, 0x96, 0x70, 0xA4,
+ 0xC5, 0x4D, 0x90, 0x18, 0x5D, 0x31, 0x2E, 0x49, 0xFF, 0xA9, 0xBE, 0x9D, 0x9E, 0x7F, 0x6E, 0x0A,
+ 0x08, 0x04, 0x83, 0x43, 0xA1, 0x5B, 0x44, 0xA4, 0xAC, 0x66, 0xE1, 0x5A, 0xA3, 0x70, 0xED, 0x00,
+ 0x84, 0x53, 0x0E, 0x52, 0x22, 0x29, 0x3D, 0x14, 0x9D, 0x9C, 0x1C, 0xBC, 0x0A, 0x19, 0xC0, 0x7B,
+ 0xED, 0xBC, 0x4D, 0x15, 0x8B, 0xEC, 0x99, 0xF7, 0x68, 0x76, 0xCD, 0x3C, 0x11, 0x57, 0x28, 0x49,
+ 0xF1, 0x0F, 0x7F, 0x74, 0x24, 0x40, 0x05, 0x98, 0xFF, 0xF4, 0xE7, 0xB7, 0x84, 0xDB, 0x55, 0x09,
+ 0xD6, 0x0B, 0xE4, 0x5B, 0xF9, 0xFF, 0xB1, 0x2E, 0x25, 0x00, 0x3C, 0x9A, 0xEE, 0x1B, 0x24, 0x07,
+ 0x3C, 0xE1, 0xA9, 0xB1, 0x90, 0x44, 0x73, 0x1E, 0xD1, 0xFA, 0x00, 0x35, 0xF5, 0x79, 0xAB, 0xDE,
+ 0xB3, 0x5E, 0x62, 0x56, 0x0B, 0xCC, 0xA3, 0x49, 0x67, 0x44, 0x79, 0x85, 0x3A, 0x5D, 0x2B, 0x9D,
+ 0xA3, 0x57, 0x44, 0x97, 0x2A, 0x50, 0x34, 0xA9, 0x2F, 0x20, 0xE7, 0x58, 0x49, 0xF9, 0x54, 0x8F,
+ 0x9B, 0xE1, 0xCC, 0x44, 0xC2, 0x27, 0xBE, 0x60, 0xDD, 0x6E, 0x4D, 0xFB, 0xA8, 0xB7, 0x5E, 0xFA,
+ 0xBF, 0xDE, 0xF2, 0xB2, 0xDE, 0xF9, 0x55, 0x40, 0xD3, 0xB7, 0x63, 0x56, 0x74, 0x2D, 0x12, 0x37,
+ 0x2D, 0xD6, 0x7E, 0x84, 0x63, 0x3E, 0xAD, 0x44, 0x69, 0x58, 0x8D, 0xEE, 0x9A, 0xA2, 0xF7, 0xFD,
+ 0x90, 0x05, 0xD3, 0x52, 0x2C, 0x53, 0xFF, 0xA0, 0xC3, 0x42, 0xE9, 0x6E, 0x61, 0x68, 0xE9, 0x88,
+ 0x39, 0x35, 0xD7, 0xA0, 0x03, 0xDA, 0x49, 0x0E, 0x9C, 0x03, 0xE4, 0x87, 0x95, 0xA5, 0xD9, 0xD6,
+ 0x29, 0xA2, 0xFB, 0x63, 0x9E, 0xDE, 0x7C, 0x9E, 0x1E, 0xAF, 0x86, 0xC8, 0xD0, 0x27, 0x5E, 0xE1,
+ 0xD3, 0xC6, 0x3A, 0x60, 0xD8, 0x43, 0xD7, 0xDC, 0xFB, 0xC5, 0x72, 0xBF, 0xCF, 0xBD, 0x3A, 0x16,
+ 0xEF, 0x79, 0xC6, 0x3E, 0xB4, 0x27, 0x4C, 0x60, 0x2B, 0x4C, 0xAF, 0x44, 0x26, 0x1E, 0xAB, 0xEC,
+ 0xB2, 0xCE, 0xD6, 0xD1, 0x71, 0xFE, 0x8A, 0xE2, 0xA5, 0x6C, 0x53, 0x89, 0x84, 0x08, 0x8E, 0x79,
+ 0x41, 0xE7, 0xBB, 0x36, 0x8F, 0xFA, 0x81, 0xED, 0x6D, 0x7B, 0x4F, 0x4B, 0x52, 0xC9, 0x03, 0x83,
+ 0x65, 0xC4, 0xF3, 0x28, 0xC3, 0x44, 0x25, 0x85, 0x5D, 0x6D, 0x07, 0x38, 0xDE, 0xC3, 0x33, 0x6E,
+ 0x09, 0x16, 0x64, 0x3F, 0x2F, 0x8A, 0x22, 0x53, 0xEE, 0xDB, 0x1B, 0xF1, 0x41, 0xD2, 0xE5, 0x26,
+ 0xD2, 0xD5, 0x9F, 0x2B, 0x1E, 0x78, 0xFE, 0x81, 0x03, 0x68, 0x79, 0x7C, 0xEB, 0x3E, 0x71, 0xF0,
+ 0x64, 0x28, 0xA0, 0x3E, 0x54, 0x44, 0x2B, 0x56, 0x21, 0x11, 0xD6, 0xD7, 0x35, 0xB3, 0xFD, 0xC1,
+ 0xE5, 0xE6, 0x10, 0xB3, 0xCC, 0xD5, 0x24, 0x25, 0xE0, 0xF6, 0x1A, 0x0F, 0xF9, 0xD5, 0x34, 0x72,
+ 0x26, 0xD1, 0x9F, 0xFA, 0xFA, 0x41, 0x1C, 0x22, 0x97, 0x99, 0x16, 0x41, 0xA8, 0xDC, 0x3B, 0x59,
+ 0xC6, 0xB1, 0x9E, 0xB6, 0x10, 0xD1, 0xD3, 0x36, 0xC8, 0x12, 0x73, 0x4D, 0x7D, 0xD0, 0xFE, 0xF5,
+ 0x82, 0x0A, 0x4A, 0x20, 0x5C, 0xE1, 0x7F, 0x19, 0xFD, 0x1B, 0x34, 0x14, 0xE1, 0x8A, 0xDB, 0x01,
+ 0x9B, 0xF8, 0x68, 0x78, 0x2E, 0x9B, 0x6A, 0x3C, 0xF5, 0x86, 0x67, 0xF7, 0x6D, 0x92, 0xF3, 0xD6,
+ 0x00, 0x77, 0x6B, 0x5F, 0x60, 0x16, 0xE6, 0x41, 0xAB, 0xF6, 0x51, 0xC5, 0x0D, 0xF0, 0x96, 0x13,
+ 0xBB, 0x14, 0x82, 0x44, 0xD1, 0xCC, 0x86, 0xDE, 0xC1, 0x51, 0x88, 0xE3, 0x72, 0x02, 0x5B, 0x41,
+ 0xA2, 0x43, 0x0E, 0xEC, 0x3B, 0xEE, 0xAB, 0xB7, 0xEE, 0xAC, 0xCA, 0x84, 0x71, 0x3F, 0x9F, 0xB7,
+ 0x59, 0x4F, 0x7B, 0x2C, 0x76, 0x10, 0xF1, 0xF8, 0xDC, 0x88, 0x8D, 0x03, 0x76, 0x6D, 0x1D, 0x4B,
+ 0x98, 0x08, 0x74, 0x1D, 0x2E, 0xD5, 0xFC, 0xF3, 0x68, 0x27, 0xB3, 0xA1, 0x89, 0x26, 0x5E, 0x8D,
+ 0x5C, 0xE4, 0x86, 0x9B, 0x10, 0xF0, 0x86, 0xC3, 0xE0, 0x76, 0xFF, 0x8B, 0x8C, 0x39, 0x32, 0x4E,
+ 0xF8, 0xF3, 0x86, 0xE6, 0x0C, 0x6A, 0x00, 0xEB, 0x7F, 0xBD, 0xDE, 0x7F, 0x0C, 0x80, 0xBA, 0x8B,
+ 0xEA, 0x8D, 0x20, 0xCB, 0x86, 0x81, 0x1B, 0x44, 0x49, 0x65, 0xD1, 0xFA, 0x12, 0xD8, 0x1B, 0xD7,
+ 0x6D, 0xA7, 0xF6, 0x53, 0x19, 0x8D, 0x9A, 0x04, 0x34, 0xB2, 0x15, 0xDD, 0xE7, 0x46, 0x75, 0xAA,
+ 0x90, 0xEC, 0x41, 0x9C, 0x93, 0xBA, 0xFD, 0xFE, 0x08, 0xFD, 0x86, 0x73, 0x7C, 0x93, 0xB6, 0xD0,
+ 0x3E, 0x16, 0x82, 0x05, 0x01, 0xC4, 0xBE, 0x9C, 0x24, 0x05, 0x94, 0x53, 0x25, 0xBD, 0x67, 0x48,
+ 0x7C, 0x66, 0xDC, 0xB6, 0x9D, 0x28, 0x26, 0x22, 0xFA, 0x5D, 0xF6, 0x39, 0x31, 0x1D, 0xDA, 0xAA,
+ 0x1A, 0x04, 0x40, 0x33, 0x67, 0xA5, 0x97, 0x48, 0xB1, 0x06, 0xFB, 0x9A, 0xEC, 0xF0, 0x04, 0x5F,
+ 0x11, 0x26, 0x23, 0x93, 0x90, 0x48, 0x72, 0x92, 0xBD, 0xB8, 0xA6, 0xD1, 0xEE, 0x70, 0xFD, 0xB8,
+ 0x53, 0x91, 0x62, 0xC1, 0x48, 0x0D, 0x70, 0xBB, 0xCD, 0xD4, 0xC3, 0xA1, 0x3D, 0x24, 0x42, 0x59,
+ 0xD6, 0x3B, 0xA0, 0xD0, 0xAC, 0x89, 0x07, 0x45, 0x66, 0xC9, 0x1D, 0xBF, 0x66, 0xC4, 0xF9, 0x5D,
+ 0x90, 0x3D, 0x84, 0x10, 0x62, 0x21, 0x37, 0x78, 0x8D, 0x27, 0xF2, 0x01, 0xA8, 0xD0, 0x2E, 0x81,
+ 0xA0, 0xDB, 0x8D, 0x89, 0x78, 0x10, 0xBB, 0x49, 0x60, 0xA0, 0x50, 0x11, 0x6B, 0x04, 0xF3, 0x2E,
+ 0x41, 0xBF, 0x00, 0xC4, 0xFA, 0xA8, 0x3B, 0x93, 0x9C, 0x90, 0x29, 0xD6, 0xBD, 0xC4, 0xE9, 0x26,
+ 0xE2, 0xDB, 0xE8, 0x7E, 0xD6, 0xA7, 0xE7, 0x55, 0x61, 0x5E, 0x46, 0x82, 0x32, 0x8D, 0xD4, 0x96,
+ 0xF5, 0x6B, 0xB3, 0x1D, 0x18, 0xA9, 0xAA, 0x8A, 0x22, 0x49, 0xF7, 0xB7, 0x36, 0xF7, 0xD0, 0x96,
+ 0x2E, 0xC6, 0x73, 0x99, 0x93, 0x63, 0x12, 0x18, 0xF3, 0x82, 0x50, 0xE1, 0x96, 0x1B, 0x7E, 0xA9,
+ 0x29, 0xFF, 0xFA, 0x75, 0x07, 0x82, 0x7D, 0x94, 0x4C, 0x2D, 0xCC, 0x06, 0xAD, 0x41, 0xF3, 0xB5,
+ 0xF3, 0x6E, 0xAD, 0x8A, 0xDD, 0x7B, 0x7F, 0xE4, 0x7D, 0x58, 0xA8, 0x6D, 0x7C, 0xED, 0x9C, 0x1B,
+ 0x63, 0x94, 0xD6, 0x81, 0x43, 0x1B, 0x8C, 0x1B, 0x7F, 0xB9, 0x1C, 0xB4, 0xD5, 0xB7, 0xBD, 0xED,
+ 0xAA, 0x8D, 0xE4, 0x06, 0xE8, 0x88, 0xDB, 0xB5, 0xCB, 0xE9, 0xA5, 0x30, 0xA6, 0xD9, 0xA0, 0x99,
+ 0x5F, 0x53, 0xC5, 0x9E, 0x4E, 0x29, 0xBB, 0xE5, 0xC5, 0xA4, 0xD9, 0x99, 0x86, 0xF1, 0x11, 0xE1,
+ 0x4A, 0x5D, 0xCB, 0xD4, 0xF4, 0xBC, 0x66, 0x87, 0x33, 0x93, 0x76, 0xBC, 0x10, 0x4E, 0xC1, 0xB3,
+ 0x0B, 0x00, 0xF5, 0x0C, 0x57, 0x9A, 0xC5, 0x30, 0x45, 0xCC, 0xDE, 0x08, 0xF0, 0x1C, 0x4C, 0x6D,
+ 0xA9, 0xD8, 0x6C, 0x65, 0x7A, 0xC5, 0x0A, 0xE2, 0x0A, 0x47, 0xB4, 0x2F, 0x82, 0x0A, 0x8B, 0x12,
+ 0xF5, 0xF5, 0xC4, 0x08, 0x17, 0x89, 0x4B, 0xEB, 0x11, 0x9E, 0x1F, 0x2E, 0x2A, 0x24, 0xDF, 0x15,
+ 0xC0, 0x1B, 0x04, 0xCE, 0x07, 0x10, 0xB5, 0x26, 0x81, 0xC4, 0x4C, 0xA5, 0x14, 0x5B, 0x17, 0x57,
+ 0x38, 0x61, 0xF9, 0x2A, 0x25, 0x0E, 0x51, 0x15, 0x5B, 0xEB, 0x85, 0xFE, 0xAA, 0x3E, 0xB6, 0x10,
+ 0x6E, 0x20, 0xAF, 0xAC, 0xFA, 0xE7, 0x86, 0xFF, 0x96, 0xA9, 0xB3, 0xB7, 0x86, 0xAC, 0x2C, 0x53,
+ 0xD9, 0x0A, 0x7A, 0x01, 0xE1, 0x58, 0xBD, 0x8C, 0x7C, 0xB0, 0x7F, 0xBB, 0x70, 0x9B, 0xE1, 0x9A,
+ 0xB8, 0x0E, 0x5D, 0xC9, 0x5D, 0x90, 0xBE, 0x2F, 0x94, 0xCE, 0x2E, 0x28, 0xFB, 0x09, 0xF8, 0xC0,
+ 0x11, 0x31, 0x2F, 0xE2, 0xFF, 0xE1, 0x63, 0xE8, 0x58, 0xB9, 0x4D, 0x27, 0x02, 0x7A, 0x05, 0xF0,
+ 0x61, 0x70, 0x34, 0xAA, 0xB6, 0xCC, 0xA1, 0xB8, 0xC3, 0x53, 0xAE, 0x1B, 0x0D, 0xB6, 0x2B, 0x3D,
+ 0x84, 0x5A, 0xC4, 0x12, 0xDF, 0x6C, 0x60, 0x73, 0x28, 0xE1, 0x07, 0xFF, 0x2C, 0x04, 0xE8, 0xF1,
+ 0x86, 0xCE, 0x38, 0x1E, 0xDE, 0x06, 0x14, 0x59, 0x2A, 0x91, 0x24, 0x6C, 0x72, 0x7A, 0xB6, 0x2A,
+ 0x1A, 0x74, 0xB6, 0x5F, 0x88, 0xE3, 0xC0, 0xC9, 0x28, 0xDE, 0xE5, 0x4B, 0x08, 0x7F, 0xD1, 0x75,
+ 0x2D, 0xF6, 0x9E, 0x91, 0x8D, 0xF0, 0x79, 0x6A, 0x0C, 0xA2, 0x19, 0xD4, 0xDE, 0xE6, 0x45, 0xFC,
+ 0x66, 0xA0, 0xB8, 0x24, 0x1D, 0x88, 0xDD, 0x31, 0x2C, 0x99, 0x02, 0x86, 0xC7, 0xF7, 0xA9, 0xFF,
+ 0x19, 0x61, 0x2E, 0xFA, 0xCE, 0xD2, 0x46, 0xD5, 0x89, 0xD1, 0xBC, 0x3E, 0x03, 0x21, 0x13, 0x14,
+ 0x65, 0x1C, 0x15, 0x54, 0xAB, 0x22, 0xA0, 0x52, 0xEA, 0xEC, 0xB5, 0x8D, 0x7B, 0xC7, 0xFC, 0x9A,
+ 0x1C, 0x30, 0x1D, 0x50, 0x6A, 0xB6, 0xA4, 0x0F, 0x57, 0xE4, 0x6B, 0xBD, 0x69, 0x79, 0xF8, 0x75,
+ 0x43, 0xBE, 0xDC, 0x5C, 0xAD, 0xC0, 0xB8, 0xEF, 0xF1, 0x57, 0xB7, 0xEE, 0xAB, 0xBA, 0x94, 0xBD,
+ 0xEE, 0x62, 0x0C, 0x99, 0xC8, 0xC1, 0x7C, 0x07, 0xCE, 0xE0, 0x51, 0x34, 0x67, 0x8D, 0xFD, 0x89,
+ 0x7E, 0xFD, 0x56, 0xBC, 0xD1, 0x3E, 0x4C, 0x30, 0x11, 0xA4, 0x2C, 0x4E, 0x98, 0xA3, 0xAC, 0xD4,
+ 0x34, 0xE4, 0xD2, 0x30, 0xA5, 0xC6, 0xD5, 0xBE, 0xE9, 0x93, 0x20, 0x2E, 0xD0, 0xD3, 0x27, 0x6C,
+ 0x18, 0xB3, 0xE4, 0x38, 0x09, 0x93, 0x49, 0xE7, 0xB3, 0x25, 0xDF, 0x5F, 0x80, 0x36, 0xC4, 0x74,
+ 0x03, 0x3B, 0x12, 0x0C, 0x4E, 0xA3, 0x79, 0x42, 0x15, 0xC8, 0x7D, 0xE3, 0xCD, 0xED, 0x30, 0x3F,
+ 0x23, 0x11, 0x15, 0x37, 0xB5, 0x03, 0x04, 0x1D, 0xD3, 0x9E, 0x6B, 0x68, 0x78, 0xE7, 0xBF, 0xB6,
+ 0x3D, 0x89, 0x21, 0xF9, 0xAA, 0xC4, 0xD7, 0x54, 0x17, 0xD6, 0xF3, 0x3E, 0xDC, 0xE9, 0xB3, 0x87,
+ 0xA0, 0x3B, 0x6A, 0x54, 0xB0, 0x6D, 0x9E, 0xB0, 0xC2, 0x48, 0xA7, 0xE9, 0x29, 0xEB, 0xDF, 0x88,
+ 0xE6, 0x9F, 0x4B, 0x83, 0xAF, 0x29, 0x4F, 0x30, 0x62, 0x37, 0xC5, 0x23, 0xFB, 0x19, 0x08, 0x1D,
+ 0xFF, 0xA3, 0x19, 0xB2, 0xEB, 0xBF, 0x68, 0x88, 0xBC, 0x1F, 0x9A, 0xE5, 0x2A, 0x24, 0x46, 0xC0,
+ 0x87, 0x82, 0x7F, 0x49, 0x7F, 0x71, 0x50, 0x69, 0xD6, 0x57, 0x27, 0x58, 0x64, 0xFD, 0x06, 0xB8,
+ 0x05, 0x5D, 0x74, 0xD0, 0x33, 0xFC, 0x5A, 0x34, 0x6F, 0x1E, 0xB3, 0x0E, 0xFE, 0x6B, 0x27, 0xCE,
+ 0x3A, 0x51, 0x2D, 0xF5, 0x48, 0x4C, 0x27, 0x36, 0x26, 0x87, 0xE7, 0x3B, 0xB6, 0x64, 0x95, 0x5C,
+ 0x73, 0x3D, 0xD4, 0x2C, 0x4C, 0x03, 0x02, 0x9F, 0x0E, 0xBD, 0xF0, 0xA3, 0x4C, 0xE6, 0xC9, 0xE1,
+ 0xBE, 0x4C, 0x1A, 0xBD, 0xE8, 0x39, 0x75, 0xEC, 0xAA, 0x0A, 0x3D, 0xED, 0x77, 0x57, 0x44, 0x92,
+ 0xF3, 0xE6, 0x86, 0xFA, 0x11, 0x75, 0x7C, 0xA2, 0x1A, 0xF3, 0x36, 0x95, 0xA5, 0xE4, 0xAB, 0x77,
+ 0x8A, 0xA5, 0xCF, 0x72, 0xAB, 0x7B, 0xBC, 0xB7, 0x4F, 0x9A, 0xB3, 0xD6, 0xE6, 0xA7, 0x76, 0x8E,
+ 0x44, 0xD3, 0x4B, 0x2D, 0xC7, 0xC9, 0xCA, 0x1C, 0xE4, 0x94, 0x86, 0x60, 0xF9, 0x9E, 0xEC, 0xA9,
+ 0xD8, 0x47, 0xF1, 0xAB, 0xD7, 0x08, 0x89, 0x63, 0xA4, 0x1D, 0x6C, 0xC7, 0xCC, 0x62, 0xB5, 0xC6,
+ 0x92, 0x1C, 0x12, 0x49, 0x3E, 0x35, 0x01, 0x44, 0x64, 0x3F, 0xEC, 0x73, 0x79, 0x88, 0xC2, 0x57,
+ 0x34, 0x41, 0x49, 0x9D, 0xF6, 0xE9, 0x4D, 0xCC, 0xE1, 0x96, 0xCF, 0x21, 0xA6, 0xFA, 0x9E, 0x1C,
+ 0xDC, 0x6A, 0x0A, 0x97, 0x46, 0x9A, 0x4B, 0x97, 0x7C, 0x24, 0x10, 0x85, 0x83, 0xE7, 0x17, 0x36,
+ 0xB9, 0xE6, 0x5D, 0xA0, 0x56, 0xAD, 0xBE, 0xB5, 0x8B, 0x30, 0xD0, 0xC0, 0x67, 0x0E, 0x7D, 0x85,
+ 0xD1, 0x8A, 0x3B, 0x9F, 0xF4, 0x63, 0x67, 0xC1, 0x37, 0xEC, 0xFF, 0x5F, 0x61, 0x4A, 0x98, 0xDC,
+ 0xF4, 0x01, 0x59, 0x5F, 0xBC, 0xF0, 0x7D, 0x3A, 0xD3, 0x2F, 0x19, 0x4F, 0xB1, 0x85, 0x18, 0x3D,
+ 0x4F, 0x99, 0xA0, 0x61, 0x3B, 0x7C, 0x56, 0x56, 0x00, 0x5C, 0x4E, 0xD9, 0x49, 0x66, 0xDF, 0xF5,
+ 0x28, 0xA3, 0x83, 0x9E, 0xAA, 0xC7, 0x6D, 0xE1, 0xF6, 0xEB, 0x7D, 0x61, 0xFF, 0xFA, 0xDC, 0x26,
+ 0x46, 0x69, 0x66, 0x77, 0x2B, 0x68, 0xA9, 0x63, 0xD0, 0x55, 0xA1, 0xFF, 0xFB, 0xC6, 0x87, 0xF1,
+ 0x01, 0x83, 0x4D, 0x1D, 0xD6, 0x26, 0x51, 0x36, 0x7F, 0x85, 0x73, 0xF7, 0x77, 0xD5, 0x03, 0xCF,
+ 0x76, 0x40, 0xA9, 0xDC, 0x7C, 0x03, 0xFE, 0x59, 0x8C, 0xF7, 0x93, 0x64, 0x7A, 0x0E, 0xA3, 0xB6,
+ 0x6B, 0xAD, 0xBD, 0xD3, 0xB0, 0x43, 0xC6, 0xCA, 0x9D, 0x10, 0x04, 0x96, 0xB1, 0xCE, 0xEF, 0x1B,
+ 0x8D, 0xE2, 0x67, 0x20, 0x4F, 0x96, 0x2E, 0x6C, 0x6D, 0x21, 0xEC, 0x74, 0x0F, 0x23, 0xAE, 0x60,
+ 0x92, 0xB6, 0x19, 0x51, 0xFF, 0x96, 0xA9, 0xC5, 0xF1, 0x04, 0x50, 0x02, 0xCE, 0xB1, 0x5E, 0x83,
+ 0x06, 0x5C, 0x41, 0xB5, 0x2E, 0xBE, 0xDE, 0xB7, 0x39, 0x4C, 0x22, 0xBB, 0x92, 0x4C, 0x74, 0x76,
+ 0x9C, 0xDD, 0xE8, 0xF4, 0xDF, 0xFF, 0xD3, 0x8F, 0x4D, 0xE8, 0xAF, 0xEA, 0xA1, 0xEC, 0x02, 0x32,
+ 0x37, 0xF0, 0xD5, 0xA4, 0x0A, 0x4C, 0x1C, 0x60, 0xE6, 0x95, 0x84, 0x9C, 0xF8, 0xC0, 0x16, 0x7B,
+ 0x88, 0xE6, 0x97, 0x82, 0x0C, 0x6A, 0xEC, 0xE5, 0x8C, 0x9B, 0xFF, 0x96, 0x6D, 0xD5, 0x04, 0xE7,
+ 0x59, 0xD0, 0xB0, 0xCE, 0x6F, 0x9D, 0xBB, 0x7E, 0x09, 0x82, 0xDD, 0xC0, 0xE5, 0x37, 0xB9, 0x07,
+ 0xF0, 0x6E, 0xBA, 0x8C, 0x19, 0x77, 0xA4, 0x21, 0xCB, 0xE1, 0xFA, 0x14, 0xC2, 0x68, 0xBF, 0x86,
+ 0xC0, 0xEE, 0xB3, 0xED, 0x17, 0x8D, 0x99, 0x70, 0x01, 0x61, 0xBF, 0x92, 0x18, 0xA9, 0x2C, 0xEE,
+ 0x94, 0xB4, 0x88, 0x35, 0x21, 0x56, 0xD1, 0x02, 0xA8, 0xC4, 0x12, 0x34, 0x69, 0x7E, 0x1A, 0xFC,
+ 0x64, 0x66, 0x32, 0x8E, 0xA4, 0x1C, 0xB9, 0xDD, 0x37, 0xF0, 0x52, 0xC6, 0x76, 0x5A, 0xEA, 0x4F,
+ 0x49, 0xD3, 0x1C, 0x83, 0x90, 0x96, 0x35, 0x67, 0x65, 0x38, 0x86, 0xE2, 0x45, 0xA9, 0xC4, 0x07,
+ 0x59, 0xAE, 0xCC, 0xD5, 0xDD, 0x88, 0xDE, 0xF2, 0x52, 0xD9, 0x88, 0x02, 0x10, 0x13, 0x62, 0x8C,
+ 0x5A, 0x32, 0x76, 0x80, 0x31, 0xD0, 0xF2, 0x91, 0x22, 0x51, 0x26, 0x3C, 0xD6, 0xA4, 0x1A, 0x61,
+ 0x5A, 0xB2, 0x7D, 0xE7, 0xCD, 0x71, 0x0B, 0x28, 0xB2, 0x3F, 0xA6, 0x38, 0xDC, 0xD9, 0x61, 0xD0,
+ 0xE5, 0xC8, 0x0F, 0xF1, 0xC9, 0x04, 0x09, 0x4A, 0x9F, 0x91, 0x7C, 0xEA, 0x88, 0x74, 0xC0, 0x32,
+ 0xB2, 0xCE, 0xBB, 0xA7, 0xE1, 0x95, 0x4E, 0xEF, 0xA0, 0x6F, 0xE0, 0x75, 0xC3, 0x9F, 0x44, 0x02,
+ 0xF1, 0x06, 0x0B, 0xFD, 0xC8, 0x11, 0x0B, 0xCB, 0xCF, 0x19, 0xE1, 0x64, 0xDE, 0x8D, 0xEE, 0x97,
+ 0x37, 0x48, 0x5F, 0xF6, 0xE7, 0xCE, 0x5C, 0x7A, 0xB7, 0xC6, 0xAB, 0x4F, 0x9A, 0x33, 0x2C, 0xBF,
+ 0x7A, 0x2F, 0xEE, 0x28, 0x90, 0xD6, 0x6E, 0x8A, 0x6D, 0xE0, 0xDE, 0x0E, 0x2B, 0x2B, 0xE1, 0x36,
+ 0xBA, 0xD6, 0xE7, 0x1A, 0x3C, 0x2F, 0x34, 0xF3, 0x39, 0xE2, 0x22, 0x33, 0x91, 0xEB, 0xFF, 0x1C,
+ 0x00, 0x09, 0x82, 0xFE, 0xAB, 0x1E, 0x1F, 0x40, 0x5E, 0x05, 0xF5, 0x6B, 0xCD, 0x52, 0xAB, 0xEA,
+ 0x52, 0x91, 0x23, 0x26, 0x91, 0x6F, 0xEF, 0xA3, 0x46, 0x70, 0xD9, 0x00, 0x79, 0xE6, 0x06, 0x2F,
+ 0x31, 0x2A, 0x35, 0x5F, 0x29, 0xDA, 0x7A, 0xF6, 0xE2, 0x5B, 0xFA, 0x50, 0x5F, 0x27, 0xD9, 0x5E,
+ 0x3D, 0x72, 0x2C, 0xE5, 0x6F, 0x6C, 0xFA, 0x73, 0x2D, 0x5C, 0x02, 0xFF, 0x64, 0xF7, 0xBB, 0xC0,
+ 0x4D, 0x72, 0xCD, 0x3A, 0x68, 0xA8, 0xD0, 0xD4, 0xB4, 0x36, 0x25, 0x4D, 0xD2, 0xF2, 0x72, 0x2E,
+ 0x29, 0x6A, 0x5C, 0xAE, 0x53, 0x36, 0x26, 0x24, 0x2D, 0x40, 0x7B, 0xE2, 0x95, 0xB1, 0x38, 0xCC,
+ 0x98, 0xC3, 0xCA, 0xFD, 0xD2, 0x14, 0x20, 0x67, 0x69, 0xFE, 0xA8, 0x3F, 0xE7, 0xA4, 0xF5, 0x12,
+ 0x72, 0x45, 0x35, 0x09, 0xFB, 0x41, 0x5E, 0xF7, 0x14, 0xC7, 0x6B, 0xF6, 0x14, 0x1B, 0x3D, 0xB6,
+ 0x30, 0xE2, 0x9E, 0xDA, 0xCE, 0x71, 0xF1, 0x7E, 0xAB, 0xD6, 0xE3, 0xFE, 0x81, 0xFB, 0x0B, 0x46,
+ 0xDB, 0x92, 0xBF, 0x0C, 0x78, 0x48, 0x26, 0xD7, 0x06, 0xD2, 0x25, 0x24, 0x07, 0x94, 0xBD, 0x4B,
+ 0x1F, 0xC4, 0x97, 0x13, 0x45, 0xD3, 0x34, 0x7C, 0x6B, 0x6F, 0x2A, 0xD7, 0x4B, 0x2C, 0xF3, 0x4D,
+ 0x30, 0x8E, 0x6F, 0x08, 0x59, 0x23, 0xAD, 0x3C, 0xE0, 0xF8, 0xF1, 0xC5, 0x6D, 0xF2, 0xB2, 0x8C,
+ 0x1B, 0xB4, 0x0D, 0x06, 0xAE, 0xBC, 0x9A, 0x26, 0xE8, 0x1B, 0xB1, 0x69, 0x57, 0xE9, 0x61, 0x9A,
+ 0xDF, 0xF2, 0xEA, 0x46, 0xC8, 0x1D, 0x49, 0xA1, 0x0F, 0x7A, 0x0D, 0xFC, 0xC7, 0x45, 0xC5, 0x8B,
+ 0xBC, 0xF7, 0x0B, 0x7E, 0x27, 0x60, 0x42, 0xD5, 0x5C, 0x7F, 0x99, 0x77, 0x57, 0x3A, 0x9F, 0x7B,
+ 0xC2, 0xE1, 0xDF, 0x96, 0xD4, 0x70, 0x25, 0x5A, 0xBB, 0xC0, 0xEC, 0xB4, 0xC6, 0x93, 0x21, 0x29,
+ 0x96, 0xEC, 0x47, 0x41, 0x6C, 0xE3, 0x60, 0xFC, 0x40, 0x7F, 0x47, 0x1D, 0x8A, 0x19, 0x2C, 0xE9,
+ 0x10, 0x1B, 0x3B, 0x1A, 0x35, 0x29, 0xE4, 0xA6, 0xBC, 0x6B, 0x35, 0x37, 0xF5, 0x39, 0xCD, 0x03,
+ 0x4E, 0x9A, 0x88, 0xF8, 0x88, 0xE1, 0x20, 0x6A, 0xA2, 0x77, 0xD0, 0xF0, 0x82, 0x3E, 0x23, 0x95,
+ 0x1C, 0x72, 0x06, 0xF6, 0x08, 0x0A, 0x79, 0x0C, 0x96, 0x0B, 0x6A, 0x19, 0x13, 0x66, 0x3F, 0xA3,
+ 0xC4, 0xBB, 0x63, 0x21, 0x8E, 0x83, 0xF9, 0x61, 0x82, 0xC5, 0x0E, 0x47, 0x79, 0x9C, 0x09, 0x7C,
+ 0xD2, 0xEE, 0x52, 0x06, 0xDA, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, 0xA1, 0x74, 0x33, 0x7E, 0x58, 0x0A,
+ 0x5C, 0xA9, 0x08, 0x8A, 0x9F, 0x89, 0x3D, 0x72, 0xC4, 0x6B, 0x26, 0xED, 0xCB, 0x46, 0xFA, 0x0A,
+ 0x5C, 0x6E, 0x3C, 0x66, 0x36, 0xC7, 0x5B, 0xEF, 0xCE, 0x59, 0x9F, 0xF1, 0x41, 0xED, 0xA5, 0x70,
+ 0x97, 0xF4, 0xD7, 0xB5, 0x56, 0xFC, 0xBC, 0x50, 0xB6, 0xB4, 0x61, 0xED, 0x8E, 0x5E, 0xF0, 0x50,
+ 0xF0, 0x96, 0xF7, 0x81, 0xAD, 0xE2, 0x8C, 0xA7, 0xB8, 0xC7, 0x17, 0xD5, 0x0C, 0x80, 0xB7, 0x7B,
+ 0xA4, 0xD9, 0x89, 0x04, 0xF2, 0x7B, 0xF8, 0x89, 0x8F, 0x58, 0x8B, 0x88, 0xEF, 0x6E, 0x9A, 0xCB,
+ 0x67, 0xBA, 0x32, 0xA7, 0x68, 0x92, 0x0A, 0xD7, 0xC9, 0xB9, 0x8B, 0xE6, 0x44, 0x0C, 0x38, 0x39,
+ 0x14, 0xBF, 0x0C, 0xE4, 0x68, 0x13, 0xB2, 0x2A, 0x0D, 0x2E, 0xA8, 0x53, 0x46, 0x3D, 0xF5, 0xC6,
+ 0x67, 0x8B, 0x2C, 0x50, 0x94, 0xD5, 0x4A, 0xB3, 0xDA, 0xB0, 0x1F, 0xDD, 0x17, 0xED, 0xF9, 0xF5,
+ 0xDB, 0x1F, 0x96, 0x33, 0xE9, 0x81, 0x28, 0x86, 0x04, 0xAA, 0x0E, 0xEF, 0x8B, 0x6D, 0xE0, 0xA2,
+ 0x26, 0x34, 0xFF, 0x6D, 0xFE, 0x57, 0xB1, 0x0A, 0xE7, 0xE5, 0x7D, 0xD4, 0x13, 0xEF, 0xC8, 0xDC,
+ 0xFE, 0xFA, 0x0A, 0xF7, 0x34, 0x75, 0x37, 0xDC, 0xA3, 0x96, 0xDA, 0x18, 0x75, 0xA3, 0x2D, 0x93,
+ 0xD4, 0x2F, 0xD7, 0xDE, 0x4B, 0xA2, 0x9C, 0x6A, 0x15, 0x36, 0xC5, 0x1F, 0x69, 0x82, 0x0C, 0x65,
+ 0x8C, 0x5E, 0x96, 0x07, 0xF7, 0x5D, 0x7B, 0x22, 0x7C, 0xAB, 0x0D, 0x91, 0xD7, 0xAC, 0xB4, 0x9F,
+ 0x46, 0x82, 0x81, 0xF8, 0xCC, 0xA6, 0x88, 0x6D, 0xEA, 0x36, 0xB3, 0x0B, 0xA7, 0xC8, 0xB6, 0xBD,
+ 0xC8, 0x74, 0x26, 0x09, 0x57, 0xE4, 0xBD, 0x39, 0x86, 0xD9, 0xED, 0x2A, 0xA9, 0x77, 0x6B, 0xD3,
+ 0x77, 0xF9, 0x92, 0xEB, 0x1C, 0xF1, 0xB8, 0x97, 0xBD, 0x8E, 0xCB, 0xCB, 0xF7, 0x1A, 0xBC, 0x12,
+ 0x98, 0x79, 0x56, 0xD4, 0x0D, 0x31, 0xDE, 0xBF, 0xB9, 0x12, 0x82, 0xA2, 0x69, 0x7A, 0x55, 0x23,
+ 0x73, 0xF6, 0xF8, 0xA6, 0x12, 0xCC, 0x51, 0x65, 0xD4, 0x00, 0xDF, 0x46, 0xA0, 0x37, 0xB8, 0x1C,
+ 0x39, 0xD8, 0x73, 0x66, 0xCB, 0x5F, 0xAE, 0x69, 0x3D, 0xFF, 0x9B, 0x13, 0x33, 0xCF, 0xE0, 0x15,
+ 0xD6, 0x78, 0x6B, 0xF1, 0x0F, 0x77, 0xEF, 0x33, 0x64, 0x1C, 0xD8, 0x60, 0x2A, 0xC6, 0x62, 0xFB,
+ 0xC9, 0x84, 0x10, 0xC2, 0x76, 0x24, 0x4C, 0x6F, 0xAF, 0x23, 0x68, 0x3C, 0x71, 0xB1, 0x80, 0x71,
+ 0x0C, 0x86, 0xE0, 0x15, 0xBF, 0xC0, 0xAA, 0xB0, 0x18, 0x61, 0x48, 0x93, 0xFD, 0xAD, 0xC8, 0xC4,
+ 0x23, 0x18, 0x87, 0x21, 0x10, 0x55, 0x7A, 0x35, 0xCC, 0x08, 0xBE, 0x2E, 0xE2, 0xA5, 0x99, 0xAB,
+ 0x55, 0x90, 0x42, 0x19, 0x6E, 0x62, 0x79, 0x4A, 0xE5, 0xE3, 0x70, 0xED, 0x91, 0x3F, 0x85, 0x02,
+ 0xB4, 0x0B, 0xF4, 0x84, 0x89, 0x6D, 0x95, 0xA4, 0x2A, 0x8A, 0x9E, 0x53, 0xCE, 0x5D, 0xCA, 0xE7,
+ 0x58, 0xB2, 0xB0, 0x40, 0x15, 0x5B, 0xA8, 0x79, 0x02, 0xB5, 0x0F, 0xCA, 0x19, 0x8A, 0x3F, 0x2B,
+ 0xA4, 0xE8, 0x66, 0x1D, 0x70, 0x95, 0xF7, 0xE7, 0x4B, 0x1B, 0x37, 0x18, 0xFB, 0x4F, 0xEF, 0x93,
+ 0xDE, 0xCB, 0x2F, 0x5E, 0xD3, 0xA4, 0x56, 0x95, 0xA7, 0x0F, 0x89, 0xB8, 0xE2, 0xC5, 0x35, 0xE0,
+ 0x88, 0xD4, 0x30, 0x05, 0x56, 0xCC, 0x9F, 0x6B, 0x58, 0xA3, 0x12, 0x98, 0x91, 0x99, 0xD8, 0x9B,
+ 0x10, 0xFA, 0xF5, 0x58, 0xD6, 0xD1, 0x7A, 0xBF, 0x16, 0x6E, 0x45, 0x74, 0xF1, 0x7A, 0xC5, 0x08,
+ 0x35, 0x5E, 0xB2, 0x89, 0x93, 0xFA, 0x30, 0xE0, 0x13, 0x94, 0xA1, 0x45, 0xDF, 0x24, 0x59, 0x3B,
+ 0xE7, 0xBA, 0x15, 0x5E, 0x32, 0x49, 0x37, 0x25, 0xC2, 0x32, 0x07, 0x05, 0x5D, 0x35, 0x9C, 0x8E,
+ 0x8A, 0x53, 0x56, 0xF7, 0x53, 0xCD, 0xE5, 0x9D, 0xEF, 0x1E, 0x49, 0xC3, 0x24, 0x67, 0x96, 0x1C,
+ 0x94, 0xDF, 0x8F, 0x98, 0x1F, 0x8A, 0xF6, 0x8E, 0x8F, 0xED, 0xFD, 0xEE, 0x4E, 0xBC, 0x00, 0xE8,
+ 0x95, 0x53, 0xEF, 0x11, 0xD6, 0x65, 0xD0, 0x52, 0xDC, 0x08, 0x7C, 0xB0, 0x32, 0x01, 0xBF, 0xB3,
+ 0x1D, 0x0F, 0x62, 0x32, 0xA3, 0x7D, 0x18, 0x9E, 0x9E, 0x19, 0x9B, 0xF6, 0x68, 0xFF, 0x63, 0xB3,
+ 0x97, 0x61, 0xD6, 0x31, 0xFF, 0x42, 0x7A, 0xE8, 0xCA, 0x87, 0xFA, 0xD7, 0xF0, 0x6C, 0x3C, 0x13,
+ 0x6B, 0x3E, 0x31, 0x10, 0xA9, 0x55, 0x46, 0x64, 0xAA, 0xF6, 0xA0, 0x3A, 0x16, 0x28, 0xBE, 0x71,
+ 0xDE, 0xE0, 0x44, 0x78, 0x5B, 0xE6, 0xF6, 0xAB, 0x2F, 0x9B, 0xE7, 0x61, 0x0A, 0xA4, 0x04, 0x2D,
+ 0xFD, 0xFB, 0x2E, 0x5D, 0xD7, 0x36, 0xC8, 0x30, 0xA8, 0x93, 0xD8, 0x17, 0x4F, 0x8F, 0x4D, 0x8C,
+ 0x98, 0x57, 0x8C, 0x6F, 0x46, 0x57, 0xA0, 0x4A, 0x1A, 0xDB, 0xE7, 0x3F, 0x96, 0xC7, 0x56, 0x41,
+ 0x0D, 0x55, 0x5B, 0x3F, 0x67, 0xD2, 0xAB, 0xEC, 0x4A, 0x66, 0x67, 0x9A, 0xF2, 0x2D, 0x63, 0xC4,
+ 0xB6, 0x50, 0x86, 0xB7, 0x70, 0xAA, 0x19, 0x05, 0x9A, 0xA5, 0x3E, 0x7B, 0x89, 0x64, 0xF9, 0x97,
+ 0x0C, 0xDB, 0x3D, 0x99, 0x92, 0xF0, 0x9A, 0x5C, 0x63, 0x46, 0x6E, 0x57, 0x15, 0xF2, 0xC1, 0x24,
+ 0x09, 0xB0, 0x94, 0xB6, 0x22, 0xA0, 0x23, 0x32, 0x53, 0x9B, 0x24, 0x4B, 0xC7, 0x83, 0x6D, 0xA9,
+ 0xDB, 0x1E, 0x1A, 0xBD, 0x56, 0xB7, 0x13, 0xD8, 0x92, 0x2E, 0x0C, 0x17, 0xA5, 0xEF, 0x4B, 0x53,
+ 0x36, 0xC9, 0xC4, 0xE8, 0xFA, 0x4D, 0xD8, 0xA1, 0x81, 0xE5, 0x9C, 0xE8, 0x65, 0x62, 0xEF, 0x65,
+ 0xA6, 0xA9, 0x1C, 0xBA, 0x33, 0xE2, 0x3F, 0xE7, 0xB7, 0xD6, 0x1A, 0x07, 0xBE, 0x5D, 0xF6, 0x5C,
+ 0x3E, 0xC4, 0x40, 0xF7, 0x3F, 0x8A, 0xE0, 0x77, 0xC0, 0x61, 0x73, 0x86, 0x26, 0x2D, 0x71, 0x54,
+ 0x51, 0xE5, 0x57, 0x5E, 0xB7, 0x46, 0x57, 0x2A, 0xD3, 0x22, 0x90, 0x2E, 0x3E, 0x75, 0xF8, 0x87,
+ 0xB1, 0xD2, 0x29, 0xC2, 0xDD, 0x93, 0x94, 0xD2, 0x5E, 0xAC, 0xCC, 0x90, 0xD2, 0xD8, 0x2E, 0xD3,
+ 0x9B, 0xE5, 0x10, 0x5B, 0xE5, 0x7F, 0x8E, 0x34, 0x64, 0x97, 0xB9, 0xA0, 0x7E, 0xD9, 0x0E, 0x7F,
+ 0xB4, 0x6B, 0x0C, 0xE7, 0x31, 0xA4, 0x35, 0x46, 0x82, 0x7B, 0xDB, 0x6F, 0x0C, 0x7D, 0xE7, 0x21,
+ 0x37, 0x10, 0x54, 0x03, 0x0E, 0x83, 0x77, 0xCB, 0xD9, 0xBB, 0x23, 0x87, 0xF3, 0xA0, 0x68, 0x06,
+ 0x67, 0xF0, 0x0A, 0x6B, 0xE5, 0x98, 0x05, 0x06, 0xB1, 0xDC, 0xB7, 0xE8, 0xDC, 0x7B, 0x2D, 0x9A,
+ 0xF7, 0x1E, 0x53, 0xBE, 0xBB, 0x9D, 0x90, 0xD0, 0x80, 0xA3, 0x02, 0x53, 0xDD, 0x3B, 0x97, 0xF2,
+ 0xC9, 0x1A, 0x5A, 0xAB, 0x9F, 0x53, 0xFB, 0xED, 0x1C, 0x44, 0xEA, 0x13, 0xE6, 0xFF, 0x03, 0xB1,
+ 0xAB, 0x21, 0x94, 0x7A, 0x58, 0x5F, 0x2E, 0x0C, 0xFF, 0xC1, 0x6A, 0xA8, 0xD6, 0xE3, 0x11, 0xC6,
+ 0x9C, 0x88, 0xE5, 0xEB, 0x90, 0x50, 0x6F, 0x34, 0x59, 0x63, 0xD6, 0xAC, 0xFB, 0x1C, 0x70, 0xEC,
+ 0x7E, 0x50, 0xA6, 0xD3, 0x7E, 0xF5, 0x98, 0x4B, 0x26, 0xEE, 0x0B, 0xB4, 0x04, 0xF6, 0x72, 0x77,
+ 0x4A, 0x72, 0x70, 0xE3, 0x8B, 0xE2, 0x55, 0xD2, 0x31, 0x39, 0xF8, 0xB6, 0x8D, 0x97, 0x57, 0x54,
+ 0xAE, 0x02, 0xC8, 0x00, 0x65, 0x49, 0xF7, 0xF2, 0x88, 0xD1, 0x07, 0x46, 0x58, 0x7A, 0x52, 0x66,
+ 0x32, 0xE4, 0xF4, 0x4B, 0xD8, 0xFA, 0xFB, 0x1D, 0xF5, 0xAF, 0x61, 0x60, 0x52, 0x4D, 0x87, 0xC3,
+ 0xBB, 0x71, 0x60, 0x42, 0x1D, 0xA3, 0x8C, 0x59, 0xF3, 0x48, 0xB7, 0x9D, 0x7E, 0xE3, 0xC5, 0x91,
+ 0x20, 0xDE, 0x82, 0xFD, 0xA3, 0xDE, 0xFF, 0x0B, 0x12, 0x6C, 0x9A, 0xD4, 0x37, 0x97, 0xA1, 0x10,
+ 0x2C, 0x1A, 0x84, 0x1A, 0x65, 0xE0, 0xBB, 0xED, 0x31, 0xD9, 0x9E, 0x63, 0x48, 0x3F, 0x73, 0xCD,
+ 0x9D, 0x9C, 0x1A, 0x89, 0x01, 0x89, 0x95, 0xA0, 0x01, 0xFF, 0x15, 0x2E, 0xFD, 0x5B, 0xB7, 0x56,
+ 0x54, 0x9B, 0x1A, 0xD9, 0xD8, 0x6B, 0x4D, 0x2B, 0xEE, 0x65, 0x82, 0xF4, 0x18, 0xC0, 0x8F, 0x92,
+ 0x0F, 0xA9, 0x85, 0x36, 0xE0, 0xFF, 0x5C, 0x67, 0xBC, 0x1C, 0x4C, 0x04, 0x00, 0x1A, 0xFF, 0x33,
+ 0xF3, 0x3C, 0xB9, 0x01, 0x85, 0xF5, 0x9C, 0x42, 0x48, 0x98, 0xD1, 0x1C, 0x12, 0x12, 0x36, 0x69,
+ 0x9F, 0x00, 0x9D, 0x91, 0x55, 0xF2, 0x3B, 0x3C, 0x65, 0x1F, 0x08, 0x56, 0x48, 0x57, 0x6B, 0xE3,
+ 0x88, 0xED, 0x2A, 0x13, 0x48, 0xC4, 0x2C, 0xD5, 0x46, 0x54, 0x8A, 0xBC, 0x1C, 0x4B, 0xCF, 0x27,
+ 0x88, 0xC9, 0x74, 0xCF, 0xD5, 0x82, 0x76, 0x57, 0x76, 0x83, 0x2C, 0xA6, 0x4E, 0xD6, 0xEB, 0xD0,
+ 0xEB, 0x8C, 0x0D, 0x04, 0xD6, 0xAD, 0x88, 0xE3, 0x7C, 0x3C, 0x9C, 0xB1, 0xCA, 0x4E, 0xEF, 0x8A,
+ 0x57, 0x3B, 0x6C, 0x68, 0x2C, 0xEE, 0xA9, 0xEA, 0x71, 0xBB, 0x84, 0x2A, 0xCF, 0x68, 0xBE, 0x7F,
+ 0x16, 0x77, 0x4A, 0x6D, 0x2F, 0x9B, 0x23, 0xA7, 0x65, 0x1D, 0x3A, 0x43, 0xE1, 0xEA, 0xF8, 0x0B,
+ 0x4E, 0xA7, 0x6A, 0x9C, 0x68, 0x65, 0x80, 0x34, 0xBF, 0x92, 0x35, 0x52, 0x47, 0xA3, 0xD1, 0x19,
+ 0x54, 0xD4, 0x61, 0xB2, 0x59, 0xCB, 0x98, 0x01, 0x2A, 0x03, 0xA3, 0x26, 0x13, 0xF4, 0x8D, 0x2E,
+ 0xA5, 0xF5, 0x89, 0xA1, 0x27, 0x5F, 0x08, 0x9E, 0xDF, 0x24, 0xB6, 0x1F, 0x88, 0x0F, 0xA9, 0xA7,
+ 0x3F, 0x8B, 0x14, 0xD6, 0xAE, 0x50, 0x43, 0x73, 0x7F, 0xE5, 0x47, 0xFA, 0xF6, 0xA8, 0xC6, 0x85,
+ 0x03, 0x20, 0x5C, 0x91, 0x13, 0xB4, 0xDF, 0xD0, 0xDE, 0xD5, 0xA3, 0x7A, 0x6F, 0x85, 0xE4, 0x92,
+ 0x9B, 0xED, 0x3D, 0xE9, 0x03, 0x08, 0x45, 0x21, 0x12, 0x0E, 0x5A, 0xEB, 0x12, 0xDF, 0x07, 0x71,
+ 0xD4, 0x96, 0x06, 0x0A, 0xCA, 0xA5, 0x2D, 0x7C, 0x6D, 0xC8, 0x23, 0xAD, 0xB9, 0x7C, 0xCB, 0x0A,
+ 0xEA, 0x29, 0x77, 0x8C, 0x5E, 0x9D, 0xE2, 0x64, 0xFE, 0x41, 0x89, 0x3A, 0xEA, 0x26, 0x6F, 0x2C,
+ 0x1C, 0x73, 0x72, 0x9A, 0xA7, 0x46, 0x69, 0xC6, 0x4D, 0x0B, 0x7F, 0x30, 0x33, 0x1C, 0x73, 0x8D,
+ 0x46, 0xC0, 0xA2, 0xD6, 0x4C, 0x8E, 0x99, 0xB2, 0x0D, 0xC8, 0xD6, 0x41, 0x05, 0xAE, 0x29, 0xB2,
+ 0xEE, 0x1C, 0x58, 0x2E, 0xBB, 0xE3, 0xC1, 0x79, 0x40, 0x3F, 0xA7, 0x15, 0xC9, 0xBB, 0xA7, 0xE4,
+ 0xAF, 0x7E, 0xB3, 0x43, 0x5F, 0xF8, 0xD0, 0x78, 0x01, 0x68, 0x46, 0xFA, 0x82, 0x03, 0x77, 0x72,
+ 0x21, 0x9A, 0x51, 0x1D, 0x5D, 0xB5, 0xC5, 0x29, 0x5D, 0x75, 0xC6, 0x3B, 0x6B, 0x68, 0x7B, 0x6F,
+ 0xF3, 0xD2, 0x9D, 0xE4, 0x8E, 0x69, 0xA2, 0x63, 0x8B, 0xEE, 0xFF, 0xB5, 0x1A, 0xBF, 0xFE, 0xFD,
+ 0x59, 0x18, 0x4D, 0xFC, 0x86, 0xEB, 0x9A, 0xBF, 0x52, 0xC7, 0x4B, 0x77, 0x15, 0x2A, 0xF7, 0x20,
+ 0x37, 0xFE, 0x70, 0x43, 0xE7, 0x26, 0x91, 0xC9, 0xF8, 0x17, 0xA3, 0x96, 0xAD, 0x52, 0xFC, 0x42,
+ 0xCB, 0x0D, 0x2D, 0x16, 0xC7, 0x23, 0xE2, 0x1A, 0x54, 0x8D, 0xF1, 0xAD, 0x1F, 0xAB, 0x7A, 0x10,
+ 0x72, 0x2D, 0x3A, 0xD6, 0xF4, 0x93, 0x50, 0x5F, 0xF0, 0x90, 0xD0, 0x5D, 0xE6, 0xC7, 0x8C, 0x22,
+ 0xA8, 0xAE, 0x9A, 0x87, 0x35, 0x4D, 0x1D, 0x66, 0x2C, 0x2C, 0x4C, 0x6F, 0x8F, 0x6B, 0x10, 0xE9,
+ 0x66, 0xB2, 0xA6, 0xE9, 0x92, 0xCF, 0xC7, 0x6A, 0x87, 0xA3, 0x5F, 0x13, 0x1A, 0x36, 0x69, 0x6A,
+ 0x94, 0xA4, 0xCA, 0xB8, 0xB2, 0xD1, 0xFC, 0x97, 0x62, 0x14, 0x50, 0x2B, 0xD6, 0xEA, 0x9B, 0xDC,
+ 0xE2, 0xD6, 0xC9, 0x17, 0x7B, 0xD7, 0xAF, 0x0E, 0x62, 0x66, 0x5E, 0x67, 0x58, 0xE4, 0x09, 0x68,
+ 0x63, 0x26, 0xF0, 0x23, 0x3A, 0x18, 0xAE, 0x4E, 0xAE, 0x03, 0x6D, 0xA0, 0xBA, 0xB4, 0xE5, 0x20,
+ 0x0B, 0x8B, 0xB0, 0x0E, 0xC1, 0x09, 0x5F, 0xAA, 0xD7, 0x2B, 0xD2, 0x3E, 0xCD, 0xE6, 0xBE, 0xFE,
+ 0x11, 0x11, 0x4B, 0x55, 0x01, 0xEF, 0x0C, 0xFF, 0xF4, 0x4A, 0xBC, 0x87, 0x0F, 0x76, 0x73, 0x5E,
+ 0xCD, 0x4B, 0x3D, 0xA9, 0xAF, 0x3E, 0x96, 0x8D, 0x49, 0xDC, 0x16, 0x18, 0x76, 0x8C, 0x93, 0xB2,
+ 0x6F, 0x72, 0x8F, 0xE0, 0xBD, 0xF5, 0xFA, 0x01, 0xEF, 0x2F, 0x47, 0xD9, 0x6C, 0xAE, 0xE2, 0x37,
+ 0xA2, 0x45, 0x1F, 0xFB, 0xA2, 0xB4, 0xAF, 0x74, 0xFC, 0xE3, 0x6A, 0xC8, 0x4C, 0x9E, 0xAA, 0xFE,
+ 0x86, 0x23, 0xE7, 0xFD, 0x51, 0x32, 0x25, 0xAE, 0x57, 0xAB, 0xE2, 0x44, 0xEE, 0x6A, 0x1B, 0x61,
+ 0x0F, 0x0E, 0x8C, 0xA0, 0x87, 0x1B, 0x5F, 0x66, 0x2E, 0x97, 0x11, 0x29, 0xBD, 0x7D, 0xD9, 0x40,
+ 0x92, 0x7B, 0xF8, 0x1D, 0xCB, 0x97, 0xE8, 0x7B, 0xE8, 0x5C, 0x07, 0x61, 0x19, 0xD6, 0xEE, 0x99,
+ 0xD1, 0xBE, 0x36, 0x1F, 0x42, 0xF7, 0x33, 0x94, 0x01, 0xA4, 0xE0, 0x0C, 0x99, 0x1F, 0x21, 0x31,
+ 0x5A, 0xF9, 0xA1, 0x98, 0xFD, 0x85, 0x44, 0xBB, 0x82, 0xB7, 0x9D, 0xE9, 0x4F, 0x4A, 0xD9, 0xBC,
+ 0x8D, 0xDD, 0x2E, 0xF6, 0x75, 0x38, 0xC0, 0x12, 0x36, 0xA8, 0x1F, 0x57, 0x37, 0x9F, 0x64, 0xB3,
+ 0xF3, 0xFA, 0x5B, 0xA9, 0x81, 0x8B, 0x5E, 0x25, 0x34, 0x38, 0x28, 0x74, 0x4E, 0x58, 0xA1, 0x6C,
+ 0xC2, 0x57, 0x58, 0x40, 0x22, 0x3E, 0xE8, 0x48, 0xBA, 0x6F, 0x4F, 0xC9, 0xC5, 0x06, 0x4D, 0x12,
+ 0xDC, 0x48, 0x68, 0xDB, 0xC2, 0x6A, 0x20, 0xA2, 0x99, 0x4E, 0x08, 0x05, 0xB2, 0x8E, 0xB1, 0x61,
+ 0x2E, 0x25, 0x67, 0x27, 0x69, 0xB9, 0x04, 0xDB, 0x3A, 0x73, 0xEC, 0xA0, 0xB7, 0x73, 0x88, 0x7E,
+ 0x25, 0x4B, 0x33, 0x3B, 0xAC, 0x7F, 0x11, 0x12, 0x3A, 0x49, 0xB5, 0x3A, 0x36, 0x39, 0xD3, 0xCA,
+ 0x02, 0xA0, 0xE4, 0xD8, 0x12, 0x5C, 0x98, 0x29, 0x57, 0x69, 0x39, 0x8E, 0x35, 0x12, 0x07, 0x83,
+ 0xFE, 0x77, 0xD8, 0x30, 0xB4, 0x34, 0xD2, 0xE6, 0xB1, 0x9A, 0xFF, 0xAC, 0xFC, 0x0D, 0x3B, 0x8A,
+ 0x18, 0x1F, 0xF4, 0xE8, 0xBF, 0xE8, 0xE4, 0x26, 0xE5, 0x07, 0xB0, 0xB2, 0x2B, 0xCB, 0x14, 0xFA,
+ 0x53, 0x39, 0x64, 0x43, 0xCB, 0x3D, 0xFC, 0x61, 0x90, 0x3A, 0xF6, 0xE8, 0x7B, 0x13, 0xCD, 0x6E,
+ 0xA9, 0xA5, 0x66, 0xD0, 0x9E, 0xE2, 0x50, 0xC6, 0xCF, 0xFC, 0x03, 0xB1, 0xD5, 0x7D, 0x0A, 0x62,
+ 0x7F, 0xE2, 0x3D, 0x9F, 0x0F, 0x9F, 0x29, 0x99, 0x65, 0x13, 0x69, 0xF2, 0x85, 0x58, 0x07, 0x1D,
+ 0x00, 0x66, 0x9D, 0x4B, 0xA8, 0xC9, 0x07, 0x1A, 0x8F, 0x3E, 0xD7, 0x81, 0xA6, 0xDB, 0xE9, 0x32,
+ 0xB3, 0xD4, 0x29, 0x6D, 0xB8, 0xBA, 0x41, 0x0F, 0x51, 0xCB, 0x50, 0x74, 0x48, 0x07, 0x97, 0x27,
+ 0xC9, 0x23, 0x3C, 0xBD, 0x5B, 0x0F, 0x46, 0x04, 0x38, 0xB5, 0xC0, 0xB6, 0x20, 0x03, 0xFA, 0x56,
+ 0x52, 0x9E, 0x27, 0xAC, 0xF1, 0xE7, 0x32, 0x25, 0x72, 0xFC, 0xAB, 0xE5, 0x1F, 0xF0, 0x55, 0x7D,
+ 0xED, 0xB8, 0x28, 0x96, 0x47, 0xED, 0x86, 0x45, 0xC9, 0xBA, 0xD1, 0xF6, 0xFA, 0xFC, 0xC6, 0xF6,
+ 0x67, 0x45, 0xC4, 0xA9, 0x25, 0xDE, 0xC7, 0x3F, 0x8A, 0xD8, 0x31, 0x3C, 0xB6, 0xE4, 0x0D, 0x7B,
+ 0xBE, 0x89, 0x5A, 0x69, 0x80, 0xEB, 0x62, 0xDE, 0xAF, 0x02, 0x6E, 0xD1, 0x4B, 0x2C, 0x7B, 0xCD,
+ 0x4D, 0xF1, 0xDF, 0x58, 0x82, 0xD0, 0xE6, 0x6F, 0xB7, 0x45, 0x8E, 0xDF, 0xE6, 0x30, 0x84, 0xC4,
+ 0x5D, 0x26, 0xC0, 0x4C, 0x39, 0xC5, 0x2C, 0x99, 0x34, 0x13, 0xF5, 0x32, 0xA3, 0xEE, 0xCF, 0x54,
+ 0x5C, 0x58, 0x2B, 0x5D, 0x54, 0xEF, 0xFA, 0x11, 0xC4, 0xBB, 0x1F, 0x34, 0x7C, 0xE6, 0x2F, 0xE4,
+ 0xA9, 0xD3, 0x95, 0x8B, 0x58, 0xC7, 0xB5, 0xE2, 0x27, 0xCE, 0xF0, 0xF8, 0xD1, 0x9E, 0x0F, 0x88,
+ 0x93, 0x3D, 0x90, 0x0D, 0x15, 0x9A, 0xC3, 0xEA, 0x91, 0xF5, 0xF6, 0xE4, 0x3E, 0x89, 0x01, 0x8A,
+ 0x4E, 0x6F, 0xE3, 0x21, 0xB1, 0x93, 0x04, 0x36, 0x30, 0x22, 0x7B, 0x92, 0x7F, 0xCF, 0x06, 0x6B,
+ 0xA5, 0x60, 0x8E, 0x15, 0x77, 0x8F, 0x7E, 0x9E, 0xB1, 0xE6, 0xFA, 0x30, 0x4D, 0xD1, 0xC7, 0x20,
+ 0xEA, 0xAF, 0xD5, 0xB2, 0x58, 0xD3, 0xAA, 0x74, 0xBC, 0xDD, 0x10, 0x6F, 0x54, 0xFF, 0x15, 0xD4,
+ 0xB0, 0x20, 0xD5, 0xDC, 0xF3, 0x89, 0x28, 0x04, 0x4C, 0x69, 0x7E, 0xE9, 0xBF, 0xE5, 0x83, 0x33,
+ 0x81, 0x69, 0xE4, 0xB8, 0x46, 0xD8, 0x26, 0x24, 0x51, 0xEE, 0x5B, 0x1D, 0x8E, 0xA0, 0x2B, 0xA2,
+ 0xD6, 0x6B, 0x4C, 0x7F, 0xA3, 0xDA, 0xDF, 0x64, 0x4B, 0x79, 0xF8, 0xEA, 0x0D, 0x53, 0x20, 0xB6,
+ 0x67, 0xE4, 0x9F, 0xB5, 0xB6, 0x63, 0x1D, 0x6E, 0xDA, 0x91, 0x1C, 0x9C, 0xE1, 0x96, 0x0D, 0x67,
+ 0xD4, 0xFE, 0xE9, 0x80, 0xEA, 0x43, 0xF3, 0x6C, 0x7F, 0x9D, 0x1E, 0xCB, 0x9A, 0xB0, 0x29, 0x60,
+ 0x68, 0x8C, 0xB9, 0x1B, 0x23, 0x8E, 0x87, 0xBD, 0x27, 0x1A, 0x93, 0xCB, 0xD5, 0x3B, 0x8F, 0x9B,
+ 0xF7, 0x5F, 0xF8, 0x5D, 0xA0, 0x90, 0xC8, 0xEC, 0xDB, 0x2E, 0xCC, 0xBB, 0xDA, 0x4A, 0x8E, 0x7E,
+ 0xD9, 0x80, 0xC9, 0x7C, 0xEA, 0x17, 0x31, 0x51, 0x0E, 0xB0, 0x3E, 0xC2, 0x45, 0x40, 0x70, 0x7B,
+ 0xA4, 0x1B, 0x26, 0x9C, 0xC4, 0x35, 0x38, 0x24, 0x21, 0x6A, 0x33, 0x57, 0x10, 0x7B, 0xE1, 0x00,
+ 0x51, 0x24, 0x22, 0x46, 0xC1, 0x95, 0x0F, 0x9C, 0xC1, 0x38, 0x48, 0xD5, 0x19, 0x09, 0x75, 0xBA,
+ 0x85, 0x8A, 0x7B, 0x55, 0xD5, 0x8C, 0xD3, 0x51, 0x4D, 0x9B, 0x49, 0xCD, 0xA4, 0xCB, 0x14, 0x11,
+ 0xBF, 0x78, 0x52, 0xB1, 0x58, 0x28, 0x50, 0x9B, 0x81, 0x9C, 0xB4, 0x6D, 0xD1, 0xE4, 0x67, 0xED,
+ 0x13, 0x47, 0xE9, 0xC4, 0xDE, 0xB2, 0xC2, 0x38, 0x06, 0x58, 0x40, 0x20, 0x85, 0x80, 0x81, 0xF2,
+ 0x7A, 0xCF, 0xFC, 0x22, 0x31, 0x27, 0x31, 0x0A, 0x3C, 0xF5, 0xAE, 0xBE, 0x8D, 0xDD, 0x94, 0x80,
+ 0x25, 0x73, 0xC5, 0xFD, 0xEB, 0xFA, 0x0C, 0xA8, 0x25, 0x2D, 0xD5, 0x48, 0xF3, 0x48, 0x59, 0x84,
+ 0x4C, 0x71, 0x8D, 0x28, 0xA1, 0x7A, 0x19, 0xF7, 0x45, 0xAA, 0x83, 0x15, 0xEA, 0x40, 0x8F, 0x0F,
+ 0x90, 0xEF, 0x1F, 0x4E, 0x81, 0xAB, 0xEB, 0x03, 0x4F, 0xD4, 0x59, 0xC5, 0xFB, 0x1E, 0xFA, 0x3E,
+ 0x44, 0xB5, 0x48, 0xE2, 0x71, 0x88, 0x18, 0xF3, 0x73, 0x5F, 0xF3, 0x9B, 0x7B, 0xBF, 0x18, 0x17,
+ 0xEB, 0x48, 0x5A, 0x5C, 0xCE, 0x54, 0xDA, 0x84, 0xE8, 0xDC, 0x9C, 0x03, 0xC1, 0xD6, 0x70, 0xBF,
+ 0x5F, 0x3F, 0xC2, 0x3E, 0x05, 0x73, 0x82, 0x2C, 0xB0, 0x19, 0xCF, 0xDC, 0x7D, 0xD8, 0xF4, 0x27,
+ 0x1B, 0xBE, 0x28, 0x9A, 0x0C, 0x22, 0x90, 0x94, 0x60, 0x5A, 0x30, 0x1A, 0xBA, 0xD3, 0x2D, 0xEE,
+ 0xFF, 0x1A, 0x7A, 0x4C, 0xC9, 0x7C, 0xB4, 0x4C, 0xB1, 0x88, 0xB9, 0xF9, 0xFC, 0xE7, 0x62, 0x0F,
+ 0x54, 0xBC, 0x7A, 0x4E, 0xA6, 0xC6, 0x73, 0xE2, 0x4D, 0x49, 0x59, 0x8B, 0x2A, 0x69, 0x0A, 0x62,
+ 0x1D, 0xA4, 0x6B, 0x9C, 0x90, 0x80, 0x82, 0x02, 0x29, 0xBD, 0xF4, 0x04, 0x3A, 0x52, 0x27, 0x85,
+ 0x16, 0x81, 0xB5, 0xB9, 0x4E, 0xB5, 0xA4, 0xD7, 0x3B, 0x22, 0x02, 0x71, 0x87, 0xF5, 0x42, 0x8D,
+ 0x95, 0x13, 0xF2, 0xB5, 0xD2, 0xDE, 0xC6, 0xC4, 0xD8, 0xB9, 0x09, 0x3D, 0x89, 0x7E, 0xFD, 0x71,
+ 0x96, 0x0B, 0x2C, 0xBF, 0xD2, 0xDC, 0x12, 0xE3, 0xE8, 0xD3, 0x4B, 0xE2, 0xA8, 0x99, 0x7A, 0x0E,
+ 0xAA, 0xD8, 0x89, 0x34, 0x6B, 0x8B, 0xF9, 0x56, 0x12, 0x23, 0x5C, 0x80, 0xCC, 0x85, 0x13, 0x0D,
+ 0x9F, 0x4D, 0xBA, 0xBB, 0x66, 0xE4, 0x44, 0x6D, 0x37, 0xF2, 0x26, 0x57, 0x4C, 0x21, 0xE1, 0x99,
+ 0x96, 0xEE, 0x61, 0x80, 0xC3, 0x22, 0x51, 0x2A, 0xD8, 0x70, 0x4B, 0x10, 0x0B, 0x03, 0xF9, 0x13,
+ 0x72, 0x5E, 0xD8, 0x85, 0x81, 0x33, 0x66, 0x97, 0x7D, 0xAC, 0x18, 0x08, 0xE8, 0x24, 0xC1, 0x6C,
+ 0x5F, 0xD6, 0xA3, 0x99, 0xC6, 0x50, 0x54, 0x61, 0x90, 0xF0, 0x3B, 0xBF, 0xF3, 0x12, 0x74, 0x8C,
+ 0x24, 0x38, 0xEB, 0xC5, 0x7A, 0xF1, 0x14, 0x33, 0x59, 0x8E, 0x57, 0x0F, 0x66, 0xF7, 0x9C, 0xC2,
+ 0xE5, 0x2A, 0x39, 0x88, 0xE6, 0x5F, 0x5C, 0x80, 0xD9, 0xDB, 0x1D, 0x80, 0xF5, 0xCF, 0xA9, 0xFC,
+ 0x2F, 0x81, 0x37, 0x11, 0x90, 0x8D, 0x91, 0xD7, 0x7A, 0x76, 0x18, 0x31, 0x80, 0x97, 0xA1, 0x24,
+ 0xB2, 0x86, 0x7F, 0x01, 0x28, 0xB2, 0xA0, 0x78, 0x4F, 0x30, 0xCA, 0x37, 0xC4, 0xFC, 0xCA, 0xC2,
+ 0xC4, 0xE1, 0xD0, 0x62, 0x9E, 0x11, 0x00, 0x12, 0x29, 0xD2, 0x1A, 0x5B, 0x7D, 0x50, 0x69, 0xBF,
+ 0x32, 0xA3, 0xFF, 0x13, 0x26, 0x30, 0x6D, 0xB7, 0xB2, 0x26, 0xAC, 0xE4, 0x74, 0x94, 0x92, 0xA0,
+ 0xFB, 0x8F, 0xF4, 0xB0, 0x9D, 0xAA, 0xA4, 0x00, 0x7F, 0x3B, 0xCC, 0xC9, 0xD4, 0x67, 0xCA, 0xAD,
+ 0xB7, 0xB8, 0xB9, 0xD4, 0x01, 0x27, 0x6C, 0x8E, 0x8F, 0x16, 0x41, 0x13, 0xE5, 0xB5, 0x81, 0x3A,
+ 0x29, 0x3C, 0x21, 0x16, 0x3E, 0x49, 0x8B, 0x15, 0x59, 0x21, 0x8B, 0x14, 0xAB, 0x53, 0x58, 0x8A,
+ 0xC6, 0x02, 0x15, 0x41, 0x38, 0x9A, 0x25, 0x45, 0xBC, 0xF7, 0x84, 0x0B, 0xD7, 0x2F, 0x98, 0x4D,
+ 0xBA, 0x56, 0x9F, 0x3C, 0x0D, 0x86, 0x1F, 0xDC, 0x40, 0x2D, 0x31, 0xA9, 0xB0, 0xBE, 0x84, 0x51,
+ 0x58, 0xEC, 0x2F, 0xFB, 0x4E, 0x36, 0x09, 0xAE, 0x5A, 0x7E, 0xAA, 0x1D, 0xFC, 0xF5, 0x91, 0x9A,
+ 0x28, 0xA2, 0x58, 0x3B, 0xB6, 0x9D, 0xB5, 0x12, 0xB7, 0x70, 0x7D, 0x64, 0x52, 0xB3, 0xC4, 0x07,
+ 0xFA, 0x3A, 0xAA, 0x85, 0xA4, 0x1A, 0x4E, 0x47, 0xB0, 0xD0, 0x44, 0x75, 0x77, 0xA2, 0xFB, 0xB3,
+ 0xE3, 0x27, 0x55, 0xD0, 0x1F, 0x3C, 0x9E, 0x2A, 0xB9, 0x41, 0x1D, 0x50, 0x98, 0x7E, 0xE9, 0xC9,
+ 0xA7, 0x3C, 0x0B, 0xB1, 0x96, 0x74, 0xFC, 0xDB, 0xB6, 0x35, 0xAC, 0xD3, 0x89, 0xCA, 0x3B, 0x79,
+ 0x32, 0x81, 0x70, 0x5C, 0xEE, 0x35, 0x79, 0x55, 0xDC, 0x77, 0x85, 0x01, 0x68, 0xE7, 0xA4, 0xB9,
+ 0x9E, 0xDA, 0x55, 0xA1, 0xDF, 0x9A, 0xF5, 0xEA, 0xF0, 0xE1, 0x4F, 0x59, 0xB4, 0x13, 0xD7, 0xAC,
+ 0x12, 0xF5, 0x06, 0xA2, 0x82, 0x01, 0xA1, 0xB5, 0x04, 0x9B, 0x00, 0x62, 0x11, 0xEF, 0xF9, 0x82,
+ 0x8E, 0x00, 0x4D, 0x0C, 0x16, 0x4C, 0x0C, 0x80, 0xC7, 0x33, 0xCB, 0x0A, 0x43, 0xC3, 0x90, 0x47,
+ 0x79, 0xCD, 0xEA, 0x96, 0xDC, 0xDE, 0x7C, 0xB9, 0x1D, 0x0C, 0xB1, 0xBC, 0x0F, 0x8B, 0x76, 0xE5,
+ 0xBD, 0xD0, 0x59, 0x76, 0x08, 0x79, 0xE4, 0xF3, 0xE1, 0xB3, 0x12, 0xF1, 0x94, 0x14, 0x79, 0xBF,
+ 0xAC, 0x22, 0x4E, 0x57, 0x7B, 0xCB, 0x5B, 0xBF, 0xE4, 0x9D, 0x16, 0x18, 0xA2, 0xB3, 0x2D, 0x04,
+ 0x3A, 0x11, 0xC9, 0x18, 0x6D, 0xCC, 0x99, 0xB5, 0xB5, 0x36, 0xF5, 0x49, 0x4B, 0xEC, 0x60, 0x3E,
+ 0x22, 0x9A, 0x73, 0x60, 0x91, 0x2F, 0x4F, 0x70, 0xB7, 0xA4, 0x48, 0x61, 0xCB, 0x0D, 0x17, 0x84,
+ 0x61, 0xF1, 0xAD, 0x7F, 0xEE, 0xEC, 0x72, 0x18, 0x60, 0x6D, 0xAC, 0xEE, 0xDB, 0xC1, 0xC2, 0x81,
+ 0xF1, 0x03, 0x74, 0xA2, 0x5A, 0xA9, 0xC8, 0x0E, 0x52, 0x85, 0xDD, 0x1D, 0x12, 0xBE, 0x1C, 0xC4,
+ 0x58, 0x0F, 0x62, 0xEE, 0x17, 0xD4, 0xF5, 0x7F, 0xDB, 0xF4, 0x1B, 0xDF, 0x2D, 0x18, 0x6D, 0x0B,
+ 0x47, 0xDB, 0xFF, 0xAF, 0x70, 0xE6, 0xA1, 0x52, 0x60, 0x9E, 0xFC, 0x83, 0xCC, 0x76, 0xB3, 0xAF,
+ 0xED, 0x23, 0x21, 0xBB, 0x7D, 0xBE, 0x7E, 0x59, 0x7F, 0x3A, 0x22, 0x10, 0x8F, 0x43, 0x4E, 0x65,
+ 0xC6, 0xBC, 0xEB, 0xE0, 0x63, 0x82, 0x78, 0xB8, 0xD5, 0xD0, 0xE7, 0xDA, 0x44, 0xF2, 0x1A, 0xBD,
+ 0x75, 0x46, 0xF7, 0x2A, 0xFE, 0x5F, 0x2A, 0x95, 0xB3, 0x4F, 0x51, 0xC2, 0xD1, 0x24, 0xEA, 0x88,
+ 0x06, 0x88, 0x8E, 0xCB, 0x33, 0xA8, 0x71, 0xC3, 0x89, 0x4E, 0xD4, 0x25, 0xBC, 0x87, 0x1C, 0x05,
+ 0x87, 0x74, 0xF5, 0x99, 0x90, 0x58, 0xA1, 0x2E, 0x14, 0x13, 0x25, 0xD6, 0xCB, 0x5C, 0xE5, 0xA8,
+ 0x46, 0xA6, 0x71, 0x68, 0x72, 0x66, 0x48, 0xD8, 0x92, 0x8F, 0x75, 0xAC, 0xB7, 0x14, 0x32, 0x42,
+ 0xB9, 0x9D, 0x57, 0xF9, 0xD2, 0x8E, 0x85, 0x27, 0x92, 0xA8, 0xCC, 0x1A, 0x26, 0x33, 0x76, 0x06,
+ 0x1A, 0xB6, 0x27, 0x56, 0x5D, 0x8E, 0xDC, 0x1F, 0xFC, 0xBA, 0x3F, 0x6A, 0x67, 0xFF, 0x9B, 0x14,
+ 0xFF, 0x90, 0xE7, 0x8E, 0xED, 0x2D, 0x8B, 0x5E, 0x22, 0x84, 0xA2, 0x06, 0x8F, 0xFD, 0x25, 0x02,
+ 0xFD, 0x3D, 0x92, 0x41, 0xE5, 0x49, 0x2D, 0x43, 0x6A, 0x9B, 0x1E, 0xA5, 0x46, 0xC9, 0xA9, 0xDC,
+ 0x2D, 0x8E, 0x75, 0xE2, 0x1B, 0x8D, 0x8F, 0x23, 0x59, 0x2E, 0x21, 0x5D, 0x3C, 0x0A, 0x41, 0xC5,
+ 0x27, 0xD2, 0x76, 0x9A, 0xCA, 0x7D, 0xAC, 0x65, 0x31, 0xC8, 0xAD, 0xB6, 0xBD, 0x19, 0x88, 0x08,
+ 0x7A, 0x91, 0x74, 0xAD, 0x23, 0x14, 0x60, 0xC3, 0x93, 0xCE, 0xF2, 0x10, 0xCF, 0xE3, 0xF1, 0xF7,
+ 0x3F, 0xD2, 0x1F, 0xD1, 0x91, 0x9B, 0x9C, 0xE9, 0xB9, 0xD7, 0xE5, 0xFA, 0x8F, 0xAD, 0xB1, 0x95,
+ 0x03, 0x28, 0xB4, 0x20, 0x46, 0xA2, 0xBD, 0x23, 0x1A, 0x32, 0xB0, 0x23, 0x65, 0x54, 0x93, 0x87,
+ 0x4F, 0xF1, 0x3A, 0xA7, 0x8A, 0xD5, 0x0F, 0x59, 0xC7, 0xD6, 0x7E, 0xBE, 0x6B, 0xFB, 0x66, 0x8A,
+ 0x1E, 0x48, 0xD3, 0xCB, 0xC3, 0x78, 0xBC, 0x2A, 0x07, 0x57, 0x66, 0xD4, 0x83, 0x95, 0xE1, 0x67,
+ 0xDA, 0xE8, 0x0D, 0x68, 0x86, 0xE8, 0xF7, 0xBF, 0x05, 0x4F, 0xB0, 0x41, 0x0C, 0xE6, 0x72, 0x9C,
+ 0xB4, 0xBF, 0x93, 0x59, 0xE5, 0x97, 0xAC, 0x7B, 0xB0, 0x93, 0x0E, 0xEC, 0xE6, 0xC2, 0xC1, 0x0E,
+ 0x06, 0x81, 0x69, 0xF6, 0x27, 0xE4, 0xCA, 0x2D, 0xE0, 0x76, 0x9E, 0x0A, 0x03, 0xE3, 0x60, 0xD1,
+ 0xAB, 0x4C, 0x63, 0xCC, 0x03, 0x7E, 0xBC, 0x4A, 0x58, 0x74, 0x94, 0xEF, 0x96, 0xB7, 0x33, 0xE8,
+ 0x80, 0x56, 0xBD, 0xEC, 0x3F, 0xD6, 0x75, 0x6F, 0xF6, 0xFE, 0x85, 0x0B, 0x0A, 0x30, 0x30, 0xBE,
+ 0x0D, 0x7F, 0x5B, 0x15, 0xD2, 0x0B, 0x7D, 0xA3, 0x2B, 0xB7, 0xE7, 0xE9, 0x17, 0x4C, 0x94, 0xE1,
+ 0x70, 0xED, 0xF7, 0x40, 0x94, 0x3B, 0x3A, 0xCA, 0xCE, 0xF5, 0xB2, 0xF3, 0x8A, 0x69, 0x61, 0x57,
+ 0x5F, 0x64, 0xC5, 0xBC, 0x0F, 0x78, 0x15, 0x9C, 0xF8, 0x30, 0x3A, 0xA4, 0xC2, 0xD8, 0x35, 0xA8,
+ 0x1B, 0xFA, 0x65, 0xAE, 0x78, 0x2A, 0x2B, 0x0E, 0x8C, 0xF7, 0x7E, 0x81, 0x43, 0x0E, 0x15, 0x05,
+ 0xC6, 0x76, 0x7B, 0x29, 0xA6, 0x26, 0xDE, 0xA0, 0xF0, 0x38, 0x39, 0x8B, 0x33, 0x8D, 0x38, 0xD6,
+ 0x84, 0x69, 0x55, 0xF6, 0x5A, 0x6E, 0xBE, 0x7E, 0x18, 0x41, 0x4A, 0x4D, 0xF5, 0x7A, 0x86, 0x8B,
+ 0xCE, 0x48, 0xDD, 0xF5, 0x80, 0xEE, 0x57, 0x05, 0x99, 0x97, 0xA9, 0xCE, 0x26, 0x68, 0x20, 0xA4,
+ 0x9C, 0x84, 0x00, 0x88, 0x0A, 0x7F, 0x7B, 0x74, 0x12, 0xE6, 0x60, 0xF7, 0xD9, 0xE7, 0xB4, 0x46,
+ 0x59, 0x1A, 0x84, 0x1E, 0x08, 0x20, 0x2E, 0x74, 0x51, 0xAE, 0x95, 0xD7, 0x77, 0x5A, 0x6A, 0x9B,
+ 0x0B, 0xFF, 0xB5, 0x5D, 0x65, 0xDC, 0x35, 0x6E, 0x00, 0xAF, 0x01, 0x73, 0x41, 0x82, 0x92, 0x29,
+ 0x9B, 0x67, 0x38, 0x86, 0xE4, 0x1A, 0x2A, 0xDA, 0xBF, 0x23, 0xEC, 0x17, 0x97, 0x13, 0x1B, 0x32,
+ 0x58, 0x31, 0x2F, 0x4E, 0x6D, 0x8E, 0x39, 0x99, 0x7B, 0x9D, 0xEB, 0xBE, 0x47, 0xC5, 0x22, 0x81,
+ 0x64, 0xAE, 0x0B, 0x0D, 0xBC, 0x33, 0x6C, 0x0B, 0x30, 0xDE, 0xD0, 0xA4, 0x8D, 0xB2, 0x9E, 0xFB,
+ 0x02, 0x6C, 0xDC, 0xD3, 0x3E, 0xCF, 0xD6, 0x49, 0x76, 0x22, 0xF2, 0x21, 0x76, 0x26, 0xDE, 0x32,
+ 0x65, 0xAC, 0x1E, 0x68, 0x2F, 0xC5, 0xF3, 0x78, 0x07, 0x15, 0x08, 0xAF, 0x74, 0xD0, 0x81, 0x13,
+ 0x45, 0xAB, 0x14, 0xD4, 0x59, 0x46, 0x24, 0x9F, 0x75, 0x12, 0x0E, 0xBB, 0xDC, 0x6E, 0x4D, 0x44,
+ 0xD3, 0x28, 0x2D, 0x64, 0xA8, 0xD6, 0x71, 0xE2, 0xE0, 0x8B, 0xD2, 0xF4, 0xBD, 0xFC, 0x97, 0x30,
+ 0x0C, 0xAC, 0x52, 0x3A, 0x06, 0xE6, 0x3A, 0x24, 0x09, 0xF5, 0xEE, 0xDB, 0x6C, 0x0A, 0x34, 0xCC,
+ 0xF4, 0xEF, 0x97, 0x39, 0x4B, 0x0E, 0x51, 0xC4, 0x3F, 0x04, 0xC6, 0x79, 0xFC, 0xFC, 0x2C, 0x66,
+ 0x7C, 0x74, 0x9C, 0xF6, 0x42, 0x98, 0x57, 0xE2, 0x78, 0x24, 0x72, 0x0A, 0xF2, 0x3B, 0x82, 0x22,
+ 0xE6, 0x33, 0x80, 0xBC, 0x9A, 0xF5, 0x0D, 0x59, 0x5D, 0xEC, 0x04, 0xD1, 0x63, 0x37, 0x61, 0xB6,
+ 0xBA, 0x30, 0x50, 0x1D, 0xC8, 0x3B, 0xF9, 0x41, 0xC1, 0x4A, 0x70, 0xEF, 0x01, 0x8C, 0xFD, 0x8C,
+ 0xCF, 0xE3, 0xE1, 0x00, 0x94, 0xA0, 0xB7, 0xE8, 0xFA, 0xB9, 0x29, 0x36, 0xFD, 0x8B, 0x39, 0x86,
+ 0x32, 0x48, 0xE6, 0xA1, 0x3B, 0x2C, 0xB7, 0xDB, 0xF3, 0x81, 0xAA, 0x06, 0x45, 0x7F, 0x2F, 0x2B,
+ 0x82, 0xC7, 0xEB, 0x4A, 0x24, 0x35, 0x4F, 0x77, 0x9E, 0xCE, 0xF1, 0xDE, 0x01, 0xCB, 0x43, 0x5B,
+ 0x39, 0x3F, 0x48, 0xDF, 0xEB, 0x6E, 0x16, 0xFA, 0x3B, 0x9D, 0x76, 0x7E, 0xEA, 0xB6, 0x1B, 0x49,
+ 0x21, 0x35, 0x3C, 0xEC, 0x9B, 0x22, 0x65, 0x23, 0x8C, 0x1C, 0xA5, 0xF2, 0xD9, 0xA1, 0x9C, 0xE0,
+ 0x5D, 0x9A, 0xFC, 0xE0, 0x6B, 0x78, 0x45, 0xEF, 0xBC, 0xCC, 0x8A, 0x7C, 0xE0, 0x70, 0xDB, 0xD6,
+ 0xB1, 0x9A, 0xB3, 0x9D, 0x45, 0x3B, 0x9D, 0xE0, 0x23, 0x82, 0xF6, 0x9D, 0x6F, 0x0C, 0xF5, 0x7D,
+ 0xB7, 0x41, 0x51, 0x4C, 0x02, 0xB7, 0x8D, 0xB5, 0x30, 0x9F, 0xF8, 0xD7, 0x50, 0x72, 0xF8, 0xAD,
+ 0x2A, 0x54, 0x0F, 0xF9, 0x2D, 0x08, 0x1C, 0x32, 0x3C, 0xEE, 0xB3, 0x06, 0x73, 0x2B, 0x27, 0xEC,
+ 0x81, 0xB6, 0x73, 0xC2, 0xAE, 0xF0, 0xE0, 0x16, 0x58, 0x55, 0x56, 0xC1, 0x0E, 0x89, 0xC2, 0xA7,
+ 0xCA, 0xFD, 0x9A, 0x02, 0xC6, 0xB7, 0x68, 0xBD, 0x10, 0xFF, 0x82, 0x81, 0x58, 0x77, 0x9F, 0x55,
+ 0x62, 0xC9, 0x80, 0xE9, 0x68, 0xE4, 0xBE, 0x8B, 0xDD, 0xAC, 0x28, 0xF8, 0xE5, 0xC6, 0xC4, 0x6C,
+ 0x77, 0xA3, 0x4F, 0xB4, 0x3F, 0xDC, 0x64, 0x70, 0xF8, 0x32, 0x87, 0x19, 0x97, 0x2F, 0xEE, 0x04,
+ 0xE1, 0x92, 0x4E, 0x73, 0x28, 0x6F, 0x1B, 0x62, 0xCD, 0xD6, 0xD9, 0x7C, 0x6C, 0x5D, 0x09, 0x1F,
+ 0x9C, 0x0A, 0x72, 0x6D, 0xE7, 0x78, 0xA4, 0xA8, 0xEE, 0xF0, 0xA1, 0x3B, 0x03, 0x9E, 0xDF, 0x19,
+ 0x46, 0xD7, 0x0B, 0x8F, 0x1B, 0xCC, 0x9C, 0xD6, 0x3A, 0xB6, 0x98, 0x42, 0x4C, 0x7C, 0xD4, 0x59,
+ 0xC4, 0xBD, 0x86, 0x9E, 0x79, 0x01, 0x05, 0x7C, 0xA7, 0xC4, 0xD5, 0xC4, 0xA4, 0xD7, 0xB2, 0x8A,
+ 0x15, 0x3C, 0x08, 0x12, 0xFF, 0x0E, 0xF1, 0x20, 0x9A, 0x5C, 0x57, 0x2A, 0xDE, 0xF2, 0x21, 0xA7,
+ 0xFB, 0xF2, 0xA7, 0xE9, 0x37, 0xA8, 0x73, 0x45, 0xE8, 0xD4, 0xAC, 0x2F, 0x06, 0xC8, 0x6E, 0x04,
+ 0xDE, 0xF7, 0xE2, 0xF6, 0xD1, 0xA3, 0xC0, 0x7B, 0xD9, 0x77, 0xEF, 0x53, 0x74, 0xEA, 0xBE, 0x23,
+ 0xD2, 0x7E, 0xF0, 0xF0, 0x56, 0xAC, 0x95, 0x80, 0xF3, 0x53, 0xEE, 0x47, 0x1D, 0x76, 0x30, 0x21,
+ 0xC8, 0xAD, 0x46, 0x73, 0x8B, 0x1F, 0x4A, 0xB1, 0x48, 0x4F, 0xE7, 0x3B, 0x92, 0xC0, 0xA7, 0x68,
+ 0xF3, 0x53, 0xC7, 0xD4, 0x51, 0xA8, 0xF6, 0xC9, 0x85, 0xAD, 0xBF, 0xB9, 0x6A, 0x31, 0x0E, 0x0C,
+ 0x7E, 0x64, 0x6F, 0x50, 0x99, 0x31, 0xE4, 0x13, 0xA6, 0xBF, 0xEA, 0xFF, 0x09, 0x1A, 0xA7, 0xD8,
+ 0xD6, 0x42, 0xA7, 0x62, 0x4F, 0xAC, 0x87, 0x4B, 0xBA, 0xB7, 0xBE, 0x50, 0x5A, 0x09, 0x43, 0xD7,
+ 0x4F, 0x9B, 0x27, 0x05, 0x78, 0xEB, 0xB2, 0x16, 0x6C, 0xCA, 0x18, 0x41, 0x58, 0xF2, 0x24, 0xF9,
+ 0xED, 0xBB, 0xF6, 0x96, 0x2F, 0xF3, 0xCB, 0x4A, 0xE9, 0xF8, 0x25, 0x4A, 0x6E, 0x8E, 0x32, 0xB6,
+ 0x51, 0x17, 0x29, 0x98, 0x9B, 0x41, 0xE7, 0x23, 0x80, 0xEA, 0x17, 0x84, 0xAB, 0xF1, 0x94, 0x81,
+ 0xFE, 0xB4, 0x30, 0xA8, 0xF8, 0x59, 0x33, 0x28, 0xAE, 0xF5, 0x24, 0x20, 0x7E, 0x78, 0x54, 0x7C,
+ 0xD5, 0xE9, 0xBA, 0xC1, 0x12, 0xA2, 0x71, 0xD6, 0x1D, 0x5E, 0xE2, 0x5B, 0xF3, 0x26, 0xAA, 0x0B,
+ 0x96, 0x68, 0x46, 0x63, 0x1D, 0x71, 0x38, 0x8C, 0xB4, 0x29, 0x18, 0x92, 0x22, 0x6A, 0x0A, 0x67,
+ 0x70, 0xC2, 0x14, 0xEC, 0x4F, 0x0F, 0x3B, 0x43, 0x27, 0x6F, 0xF5, 0x1B, 0xE0, 0x7B, 0xEB, 0x35,
+ 0x3A, 0x6F, 0x7C, 0xA5, 0x9C, 0xBC, 0x17, 0x2D, 0xF5, 0xC0, 0x7D, 0x67, 0xE2, 0xF1, 0x0D, 0x00,
+ 0x04, 0xD4, 0x68, 0x9F, 0xB8, 0x48, 0xFE, 0xB6, 0xA8, 0x6F, 0xFD, 0xCB, 0x34, 0x94, 0xFA, 0x2D,
+ 0xFA, 0x46, 0x3E, 0x11, 0x2D, 0xF5, 0xBB, 0x2B, 0xD2, 0x92, 0x92, 0x0E, 0x37, 0xEB, 0x7E, 0x84,
+ 0xF9, 0xFD, 0x3B, 0x22, 0xD3, 0xCD, 0xFC, 0x46, 0xEF, 0x21, 0x35, 0x91, 0x19, 0xCF, 0x1F, 0xE0,
+ 0xFE, 0x5C, 0x1A, 0x49, 0x38, 0x95, 0xE0, 0x40, 0x1D, 0x4A, 0xB8, 0xB7, 0xBB, 0xB8, 0x52, 0x08,
+ 0x37, 0x72, 0xE4, 0xF6, 0xE8, 0x42, 0x0A, 0xAB, 0x1E, 0xF0, 0x74, 0x7B, 0xFB, 0x9E, 0x94, 0x4C,
+ 0x87, 0xF5, 0xEE, 0x0D, 0x9E, 0x07, 0x10, 0x79, 0x0C, 0x02, 0xA7, 0xE6, 0x4A, 0xBF, 0xAB, 0xAD,
+ 0x71, 0x5F, 0x31, 0xE1, 0xD5, 0x39, 0x1E, 0x72, 0x53, 0x93, 0xA4, 0x38, 0xB4, 0x04, 0x79, 0xA3,
+ 0x72, 0xCD, 0xBC, 0x29, 0x3E, 0x9F, 0x63, 0xF4, 0x87, 0xB5, 0xB8, 0x99, 0xFC, 0x4E, 0x9D, 0xD2,
+ 0xD9, 0x6F, 0xD5, 0x16, 0x1D, 0x01, 0xF8, 0x43, 0x22, 0x6B, 0xF9, 0xF8, 0xF8, 0x7E, 0x03, 0xD1,
+ 0xF0, 0xC9, 0x8B, 0x97, 0x78, 0x12, 0xF1, 0xE8, 0x23, 0x88, 0x53, 0xD3, 0x73, 0x8D, 0x8D, 0x5D,
+ 0x64, 0x7F, 0xD8, 0x5E, 0x15, 0xA6, 0x4E, 0x31, 0xE5, 0x8F, 0x1E, 0x7C, 0x8F, 0xC7, 0x60, 0x86,
+ 0x2B, 0x4F, 0x69, 0x0E, 0x2C, 0x39, 0x8B, 0xFC, 0xF4, 0x5C, 0xF4, 0x0A, 0x63, 0x4E, 0xE5, 0xCA,
+ 0x46, 0x6B, 0x15, 0xF3, 0x9B, 0x7E, 0xBB, 0xD9, 0xA1, 0x87, 0x50, 0x36, 0x23, 0xEF, 0x37, 0x88,
+ 0xE3, 0x89, 0xAB, 0x5F, 0x0A, 0x07, 0xB4, 0x5F, 0xF8, 0x45, 0xBB, 0xE8, 0x12, 0x10, 0xE8, 0x95,
+ 0xB6, 0x13, 0xEF, 0x51, 0xA2, 0x24, 0x12, 0x7F, 0x6D, 0x05, 0x0E, 0x94, 0xF9, 0x92, 0xB8, 0x2E,
+ 0x64, 0x40, 0xDC, 0xDA, 0xDC, 0xDE, 0x82, 0x81, 0x9C, 0xE0, 0x0A, 0x27, 0xC6, 0x06, 0xB5, 0x01,
+ 0xBF, 0x36, 0x76, 0xF8, 0xB1, 0xE5, 0x3C, 0x42, 0xC3, 0x07, 0xE7, 0xBD, 0xFC, 0x7B, 0xFD, 0x70,
+ 0x4C, 0x17, 0x8F, 0x21, 0x9B, 0xBA, 0x06, 0xFC, 0x34, 0x56, 0xDD, 0x23, 0x7E, 0x2C, 0x8D, 0xF8,
+ 0x99, 0xD6, 0x69, 0xDA, 0x75, 0x42, 0x84, 0x43, 0xDB, 0x51, 0x12, 0xA0, 0x78, 0xEC, 0x95, 0x87,
+ 0x86, 0x84, 0xC9, 0x21, 0xEF, 0x8C, 0x0D, 0xEA, 0xBC, 0xE7, 0x5A, 0x23, 0x01, 0xB1, 0xBD, 0x6A,
+ 0x23, 0x49, 0x1C, 0x42, 0xED, 0x39, 0x5D, 0x26, 0xEF, 0x54, 0x36, 0x5E, 0xE8, 0xA8, 0xB0, 0xC9,
+ 0xF2, 0x39, 0xD0, 0x49, 0x10, 0x89, 0x2A, 0xF3, 0x4F, 0x3B, 0x3F, 0xF3, 0x6F, 0x98, 0xC0, 0xA2,
+ 0x37, 0xC5, 0x98, 0xCB, 0x7A, 0xE6, 0x78, 0x11, 0x15, 0x97, 0x77, 0x7D, 0x34, 0xE5, 0x67, 0x61,
+ 0x8B, 0xC7, 0x2B, 0xA2, 0xE8, 0x67, 0x3F, 0xBA, 0xD6, 0xEC, 0xC1, 0x5B, 0xF7, 0x4E, 0x70, 0xC3,
+ 0x1A, 0x98, 0x20, 0x05, 0xBA, 0x2D, 0x2B, 0x79, 0xB8, 0x10, 0xA3, 0x74, 0xC9, 0x50, 0xEC, 0x90,
+ 0x3C, 0xA9, 0xF8, 0xF7, 0xF9, 0x9F, 0xF9, 0xE1, 0x8E, 0x92, 0x40, 0xEE, 0x62, 0xCE, 0x36, 0x70,
+ 0x90, 0xAA, 0x3D, 0x17, 0xDF, 0x78, 0x8D, 0x49, 0xC1, 0x77, 0x9F, 0xF0, 0xBC, 0x8A, 0xF6, 0x06,
+ 0x90, 0xF5, 0x13, 0x51, 0xA7, 0x1B, 0xB8, 0x7B, 0x15, 0xAE, 0xBA, 0x54, 0x90, 0xCA, 0x01, 0x0C,
+ 0xB0, 0x82, 0xF1, 0xA6, 0x36, 0x0E, 0x1F, 0x40, 0x38, 0x19, 0xE5, 0x3D, 0x22, 0x12, 0x0A, 0xB7,
+ 0x17, 0x5D, 0x47, 0x46, 0x85, 0xE9, 0x40, 0xC3, 0x90, 0x6D, 0xAE, 0xBE, 0x95, 0xCA, 0xA1, 0x00,
+ 0x47, 0x6C, 0x6E, 0xCE, 0xBF, 0xAB, 0x0A, 0x9B, 0x73, 0x86, 0x4C, 0x64, 0x73, 0x7D, 0xF4, 0x01,
+ 0xCF, 0x4F, 0x4F, 0xBD, 0xFB, 0xC5, 0x37, 0xC1, 0x95, 0xAC, 0xCE, 0x58, 0x0A, 0x58, 0x26, 0x67,
+ 0xF2, 0x0B, 0x10, 0x13, 0xC5, 0x8D, 0x72, 0xAC, 0xCE, 0xC2, 0x7B, 0x74, 0xB6, 0x4A, 0xB6, 0x0A,
+ 0x8B, 0xD9, 0x27, 0x3A, 0x3D, 0x15, 0x42, 0xA4, 0xF5, 0xC3, 0x04, 0x91, 0x64, 0x05, 0xF1, 0x44,
+ 0x27, 0x9D, 0xBE, 0xB6, 0x24, 0xDA, 0x68, 0x7B, 0xDB, 0x5C, 0xF7, 0x02, 0x72, 0xF4, 0xBC, 0x88,
+ 0xF6, 0x8A, 0xE1, 0x45, 0xE8, 0x9D, 0x06, 0x5F, 0x37, 0x61, 0xF5, 0xD4, 0xE8, 0x37, 0xAA, 0xE7,
+ 0x79, 0xAA, 0x7C, 0x21, 0x93, 0x0C, 0x66, 0x95, 0x63, 0xE8, 0x25, 0xAD, 0xCB, 0xBD, 0x29, 0x96,
+ 0x7A, 0x87, 0x76, 0x18, 0xC4, 0x97, 0x74, 0x24, 0xF4, 0x00, 0x00, 0x0E, 0x7E, 0xB1, 0xAD, 0x5D,
+ 0xF1, 0x63, 0x3C, 0xF0, 0xA3, 0x21, 0x91, 0x04, 0x15, 0x5C, 0xCD, 0xEC, 0xA3, 0xDC, 0x39, 0x7A,
+ 0x85, 0x12, 0xFC, 0x4C, 0x7B, 0xF6, 0x01, 0x9D, 0xBC, 0x64, 0x31, 0x27, 0xFB, 0x20, 0x69, 0xB2,
+ 0x95, 0x8A, 0xB8, 0x53, 0x15, 0x0D, 0xE8, 0x12, 0x44, 0xA5, 0x96, 0x91, 0x19, 0xA1, 0xB5, 0x77,
+ 0xA2, 0xD2, 0x91, 0x63, 0xB2, 0x3B, 0x8C, 0x29, 0x5A, 0x77, 0xCB, 0x9A, 0x82, 0x17, 0x7C, 0xEB,
+ 0x9A, 0x8D, 0x1D, 0x38, 0xFD, 0x0D, 0x33, 0x62, 0xD3, 0xF1, 0x90, 0xA1, 0x41, 0x90, 0x85, 0x10,
+ 0x28, 0x1C, 0x73, 0x77, 0xD6, 0x64, 0xAE, 0xDE, 0x21, 0x5D, 0xE6, 0xD0, 0xBE, 0x59, 0xA8, 0x04,
+ 0xB1, 0xF1, 0x70, 0xA3, 0xDA, 0xD6, 0xB0, 0xBC, 0x7F, 0x3D, 0x60, 0x91, 0x38, 0xA3, 0xC9, 0xC1,
+ 0xBE, 0xA0, 0xD6, 0x4A, 0x8E, 0x33, 0xF6, 0x1A, 0x99, 0x20, 0xBF, 0xFC, 0x38, 0x9F, 0xD6, 0x66,
+ 0x6A, 0x61, 0xF7, 0xB0, 0x09, 0xC3, 0xB2, 0xD3, 0xC1, 0xA1, 0xB3, 0xB4, 0x6A, 0xE3, 0x94, 0xF5,
+ 0x92, 0xD3, 0xC0, 0xB6, 0x12, 0x53, 0x7A, 0xAC, 0x1E, 0x69, 0x58, 0x3B, 0x1C, 0x0F, 0x69, 0x9E,
+ 0x0E, 0xAA, 0xF4, 0xF2, 0x12, 0xAE, 0x66, 0x3B, 0x40, 0x4A, 0xC3, 0x19, 0x15, 0xDA, 0x08, 0x58,
+ 0x73, 0x1A, 0x9D, 0x18, 0xAD, 0xA7, 0xA3, 0x66, 0xD1, 0x5D, 0x9A, 0x36, 0x4E, 0xF0, 0xA5, 0x69,
+ 0x33, 0xD0, 0x8A, 0x11, 0x2E, 0xBA, 0x33, 0xCB, 0xBE, 0x4F, 0x63, 0x9D, 0x97, 0x50, 0x26, 0x96,
+ 0x8F, 0x6F, 0x4D, 0x30, 0x80, 0x72, 0x28, 0x5E, 0xA8, 0x74, 0x8E, 0x42, 0x9D, 0x15, 0xDA, 0xAC,
+ 0x36, 0x74, 0x91, 0xFA, 0x29, 0x8F, 0x54, 0xF5, 0x06, 0xCC, 0x80, 0x78, 0xED, 0x76, 0xDA, 0x3D,
+ 0x86, 0x9D, 0x9D, 0x3D, 0xA4, 0xA4, 0x7E, 0x9A, 0x80, 0xCC, 0x90, 0x7C, 0x90, 0x14, 0x8D, 0x33,
+ 0x30, 0x8B, 0xCB, 0x17, 0x36, 0xBB, 0xAF, 0xA7, 0xE6, 0x7C, 0xA3, 0xE1, 0x7D, 0xB0, 0xA1, 0x9A,
+ 0xA6, 0x28, 0xFE, 0x13, 0xA3, 0xFF, 0xE5, 0xE9, 0xC9, 0xBD, 0x1E, 0xEF, 0x2C, 0xB6, 0xFE, 0x6F,
+ 0x6E, 0xDD, 0x94, 0xAB, 0x1C, 0xCE, 0x6E, 0x2A, 0x30, 0x08, 0x82, 0xD3, 0xD1, 0xFB, 0xE3, 0xC8,
+ 0x63, 0x25, 0xB2, 0xF6, 0x67, 0x1D, 0x72, 0x57, 0x8B, 0xEE, 0x9F, 0x56, 0x2F, 0x16, 0x3E, 0x9B,
+ 0xEC, 0x27, 0xDE, 0x2E, 0x84, 0x97, 0x67, 0xA9, 0x69, 0x0D, 0xC5, 0x59, 0xC3, 0xC8, 0x74, 0xEE,
+ 0x04, 0x89, 0xEF, 0xF6, 0x4B, 0xB9, 0xA2, 0xE5, 0x82, 0x78, 0x1F, 0x49, 0xDB, 0x02, 0xC6, 0x56,
+ 0x4B, 0xD6, 0x25, 0xDB, 0xBD, 0xF9, 0x9C, 0xFD, 0x2E, 0xF3, 0x05, 0x5A, 0x73, 0x69, 0x2A, 0xE9,
+ 0x62, 0xD2, 0x10, 0x82, 0x9D, 0xC8, 0x6C, 0xDC, 0xC6, 0xF2, 0x18, 0x17, 0xEB, 0x2F, 0x91, 0xDC,
+ 0x30, 0x55, 0xDF, 0xD8, 0x7C, 0xA4, 0x79, 0xE0, 0xC5, 0x37, 0x9D, 0x23, 0xD5, 0xDF, 0xA4, 0xF2,
+ 0x1B, 0x60, 0xB6, 0xC7, 0x6F, 0x20, 0x5C, 0xFC, 0xF2, 0x6D, 0x01, 0x75, 0xFB, 0x50, 0x01, 0x5D,
+ 0x24, 0x48, 0x53, 0xBF, 0x27, 0x99, 0x73, 0x3A, 0x47, 0xD4, 0xDD, 0xBF, 0xE7, 0x41, 0xD3, 0x15,
+ 0x09, 0x21, 0x29, 0xDA, 0xFE, 0x6A, 0x8E, 0x20, 0xB8, 0x86, 0xC1, 0x8D, 0x54, 0x74, 0xC7, 0xD6,
+ 0x66, 0xA7, 0xE5, 0x67, 0xB9, 0xE8, 0x0A, 0x74, 0x3A, 0xF9, 0x4D, 0xAF, 0x54, 0x2D, 0xF0, 0x44,
+ 0x79, 0x04, 0x01, 0x54, 0x49, 0xF9, 0x04, 0x2A, 0xEF, 0xDD, 0x50, 0x19, 0xF6, 0x56, 0x0A, 0x34,
+ 0x58, 0x20, 0x90, 0x23, 0x94, 0x70, 0x43, 0xBC, 0xF3, 0x1E, 0xC0, 0x7D, 0xB5, 0xBD, 0xF0, 0xBF,
+ 0xC9, 0x1F, 0x93, 0x17, 0x1D, 0x56, 0xDF, 0xA0, 0x42, 0x9C, 0xAA, 0x31, 0xD1, 0xE0, 0x74, 0x0D,
+ 0x42, 0x02, 0x3B, 0x06, 0xF6, 0xC5, 0xA8, 0xBB, 0x17, 0x5C, 0xCD, 0x56, 0x71, 0x9E, 0xAA, 0x1E,
+ 0xE8, 0x96, 0x4E, 0x0D, 0x55, 0x4E, 0xA0, 0x9E, 0xDC, 0x30, 0x3E, 0x58, 0xD3, 0x62, 0xB6, 0xAB,
+ 0x3B, 0xCF, 0x4D, 0x2B, 0x4A, 0x17, 0x25, 0xFB, 0xCA, 0x5E, 0x0A, 0x3B, 0x82, 0x36, 0xCC, 0x6D,
+ 0x5D, 0x64, 0x86, 0x5C, 0x73, 0x1E, 0x86, 0xDC, 0x32, 0x5F, 0xF5, 0x2A, 0x2D, 0x58, 0x89, 0xDA,
+ 0x23, 0x1A, 0xAB, 0x0A, 0x6E, 0x5F, 0xD3, 0x84, 0x33, 0x33, 0xC7, 0xFD, 0x42, 0xE9, 0xD3, 0xBD,
+ 0x56, 0xE3, 0x70, 0x8A, 0xBA, 0x95, 0xAF, 0xF6, 0x0A, 0xA6, 0x22, 0x50, 0x3B, 0xCB, 0x1A, 0xE8,
+ 0x88, 0xDF, 0xD3, 0xE8, 0x94, 0x8C, 0xBF, 0xC7, 0x32, 0x4C, 0x31, 0x0F, 0x1E, 0x14, 0x95, 0x9C,
+ 0x2E, 0x08, 0x5B, 0x8B, 0x63, 0x62, 0x51, 0x5B, 0xAB, 0x8B, 0x81, 0x6E, 0xA2, 0x9B, 0xE3, 0x56,
+ 0x9B, 0x78, 0x44, 0x09, 0xCC, 0xD4, 0x69, 0xC4, 0xF0, 0x4F, 0x7D, 0xA9, 0x1B, 0xE1, 0xD7, 0xFB,
+ 0xD4, 0x44, 0x3F, 0xFF, 0x3E, 0xDB, 0xEC, 0xB7, 0x52, 0x91, 0x0E, 0xE6, 0xF7, 0xEF, 0x2F, 0x32,
+ 0x15, 0xC5, 0x25, 0xA6, 0x10, 0xDF, 0xD2, 0x2F, 0x5E, 0xD0, 0x50, 0x28, 0x47, 0xA2, 0x93, 0x37,
+ 0x42, 0x33, 0xC2, 0x3E, 0x2E, 0x1C, 0x1A, 0x52, 0xE5, 0x2C, 0x71, 0x6C, 0xB5, 0x4A, 0x78, 0xD2,
+ 0x60, 0xDE, 0x9D, 0x26, 0x8E, 0xAA, 0x3C, 0x31, 0xFA, 0x55, 0x78, 0x41, 0xD1, 0xBC, 0x9D, 0x19,
+ 0x85, 0x8B, 0x4C, 0xF9, 0x10, 0x95, 0x0E, 0x43, 0x8A, 0x34, 0x66, 0x4A, 0x5A, 0x4D, 0xD9, 0x4A,
+ 0xD6, 0x19, 0x23, 0xC9, 0x67, 0x6A, 0x81, 0x36, 0x87, 0xC2, 0x79, 0x89, 0xE7, 0x17, 0x90, 0x7E,
+ 0x5B, 0x61, 0x49, 0xD8, 0x05, 0xA0, 0x4F, 0x08, 0x9A, 0x77, 0x53, 0x6D, 0x8C, 0xD5, 0x36, 0x4F,
+ 0xE7, 0x4E, 0x56, 0xB4, 0xE1, 0xC0, 0x53, 0xD3, 0xB8, 0xBE, 0xB7, 0x90, 0xCA, 0xFE, 0xB9, 0x80,
+ 0x0E, 0x13, 0xB2, 0x7C, 0x8F, 0x66, 0x40, 0xCC, 0x8B, 0xB0, 0x7C, 0x32, 0x89, 0xDE, 0x2C, 0x5D,
+ 0x6A, 0xC5, 0xE9, 0x4B, 0x36, 0x38, 0xCD, 0x51, 0xE2, 0x97, 0x9F, 0x12, 0x45, 0x92, 0x68, 0x38,
+ 0xED, 0x62, 0x6A, 0xB6, 0x9A, 0x36, 0x82, 0x72, 0x43, 0x58, 0x0F, 0xA9, 0xB0, 0x4F, 0x12, 0xC9,
+ 0x32, 0x2C, 0xC0, 0xAF, 0xF6, 0xE5, 0x4D, 0x48, 0xBF, 0xDD, 0xEC, 0xDB, 0x28, 0xC9, 0xD3, 0x5B,
+ 0xE3, 0xFC, 0x7E, 0xAD, 0x76, 0x28, 0xD4, 0x23, 0x71, 0x85, 0xA5, 0x22, 0xE9, 0x93, 0x5E, 0x43,
+ 0xB5, 0x0F, 0xAE, 0xDF, 0x8B, 0x51, 0x41, 0x86, 0xC3, 0x55, 0xE4, 0x68, 0x43, 0x27, 0x7C, 0x0C,
+ 0x8F, 0x7F, 0xA0, 0x5A, 0x7A, 0xD7, 0x88, 0xC3, 0x8E, 0xF8, 0xC0, 0xF3, 0xB3, 0xC9, 0x15, 0x34,
+ 0x80, 0x16, 0x34, 0x13, 0x17, 0x6A, 0xD1, 0x59, 0x03, 0x94, 0x59, 0x7B, 0xA0, 0xE8, 0xE0, 0xA4,
+ 0x16, 0xFC, 0x76, 0xF0, 0x7C, 0x5A, 0x00, 0x01, 0x50, 0xE8, 0x56, 0xEF, 0x18, 0xC8, 0xDA, 0xBC,
+ 0xCD, 0xB8, 0x92, 0xB8, 0x22, 0xE3, 0xB5, 0x16, 0x05, 0x25, 0xE7, 0x65, 0x3D, 0x1C, 0x0F, 0x23,
+ 0xC5, 0x24, 0x16, 0x9E, 0x75, 0xCC, 0xF0, 0xF9, 0x19, 0x47, 0x83, 0xA0, 0x42, 0xBC, 0x36, 0x99,
+ 0x76, 0xE0, 0x27, 0xA9, 0xDB, 0x4A, 0x6E, 0x50, 0x22, 0x99, 0x4D, 0xDF, 0x43, 0x69, 0xA3, 0x95,
+ 0x48, 0x97, 0xC7, 0xC5, 0x4F, 0x1B, 0x2A, 0x32, 0xBA, 0x9F, 0xB9, 0x2D, 0x1D, 0xE3, 0x6E, 0x46,
+ 0x1F, 0xBD, 0x7A, 0x4F, 0x2A, 0x07, 0xB4, 0xA2, 0xC2, 0x31, 0xA9, 0x93, 0xE9, 0x98, 0x39, 0x93,
+ 0x89, 0x51, 0x82, 0x10, 0x99, 0xD5, 0x65, 0x25, 0x27, 0x37, 0xB1, 0x7E, 0x98, 0x50, 0xEC, 0xA7,
+ 0x29, 0xE0, 0xBE, 0xA4, 0x0C, 0xD5, 0x9B, 0x3D, 0xAD, 0x02, 0x4D, 0x81, 0x93, 0x0F, 0xA4, 0xD7,
+ 0xF4, 0x48, 0xCC, 0x4E, 0xF6, 0x6F, 0xF3, 0x5C, 0xF6, 0x5A, 0x2E, 0x05, 0xFA, 0xFB, 0x04, 0x8D,
+ 0x95, 0x29, 0x94, 0x03, 0x34, 0xF2, 0x33, 0xD9, 0x5B, 0x47, 0x96, 0x6C, 0x0C, 0xE6, 0x8E, 0xF2,
+ 0xD1, 0xF2, 0x83, 0x6A, 0xF2, 0x95, 0x4C, 0xBF, 0x46, 0xB4, 0x42, 0x95, 0xDA, 0x59, 0xBE, 0x32,
+ 0x2F, 0xFB, 0x7A, 0x33, 0xA0, 0x09, 0xB6, 0x34, 0x49, 0x4B, 0xA7, 0x9B, 0xF6, 0x56, 0xA9, 0xB7,
+ 0x5A, 0x98, 0xCD, 0x74, 0xF9, 0xBB, 0xD9, 0x1A, 0x46, 0x87, 0x5D, 0xA4, 0x81, 0x25, 0xB9, 0x9E,
+ 0x58, 0xF7, 0xBE, 0x19, 0x6E, 0x84, 0x50, 0x7D, 0x94, 0x3B, 0x57, 0x0A, 0x05, 0x81, 0x42, 0x2F,
+ 0x42, 0x90, 0x9B, 0xF1, 0xA7, 0x66, 0xD0, 0xD4, 0xF6, 0xD0, 0xB7, 0xE0, 0xDF, 0x2D, 0x6D, 0x60,
+ 0x11, 0xBE, 0xC8, 0xB3, 0x65, 0xEB, 0x71, 0x33, 0x74, 0xAD, 0xD0, 0x3B, 0x5D, 0x06, 0x79, 0x9B,
+ 0xD8, 0x03, 0xB7, 0x28, 0xEC, 0x2D, 0x3F, 0x82, 0xE5, 0xD4, 0x73, 0x01, 0xE8, 0x51, 0xD5, 0x04,
+ 0x46, 0x0D, 0xA9, 0x48, 0x83, 0x75, 0x88, 0x87, 0x4F, 0xA3, 0xC5, 0xCC, 0x0E, 0x39, 0x46, 0x9E,
+ 0xE8, 0xC7, 0x7C, 0xC2, 0xA1, 0xEA, 0x89, 0x08, 0xE4, 0x37, 0xAC, 0xC6, 0x2B, 0x50, 0x7D, 0x78,
+ 0x4F, 0x72, 0xC8, 0x96, 0xDC, 0x48, 0xB0, 0xEF, 0x69, 0x70, 0xDF, 0x85, 0x0A, 0xE8, 0xEF, 0x14,
+ 0xF9, 0x8C, 0xFE, 0x9E, 0xB1, 0xA4, 0x9B, 0x58, 0xC1, 0x77, 0x5E, 0x88, 0x3D, 0xB1, 0x39, 0xC9,
+ 0xE1, 0x8B, 0x4C, 0x16, 0xC2, 0x10, 0xD7, 0x4D, 0x11, 0x11, 0x3E, 0xD9, 0x60, 0xD1, 0xAB, 0x18,
+ 0x9D, 0x85, 0x8E, 0xFF, 0xFA, 0xB6, 0x09, 0x2B, 0xD2, 0x9A, 0xFD, 0x6F, 0x5C, 0x05, 0x51, 0x04,
+ 0x03, 0x25, 0x38, 0x12, 0xCD, 0xF1, 0x0B, 0x10, 0x28, 0x8A, 0x09, 0x2E, 0x2C, 0x38, 0x43, 0x19,
+ 0x40, 0xF8, 0x45, 0xFF, 0x80, 0x5D, 0xD4, 0xDB, 0x52, 0x2C, 0x51, 0x77, 0xD7, 0xB1, 0xFF, 0xED,
+ 0x06, 0x99, 0x56, 0x48, 0x53, 0x40, 0xF7, 0x80, 0xFB, 0x9C, 0x0E, 0x6F, 0x1D, 0x25, 0xAA, 0x4C,
+ 0x8E, 0x91, 0xE7, 0xC5, 0x0A, 0xDB, 0x3F, 0xEA, 0x48, 0xB9, 0xB2, 0xFA, 0x39, 0x46, 0x9E, 0x3A,
+ 0xC3, 0xDC, 0x15, 0xF9, 0xCF, 0x8C, 0xA7, 0x14, 0xFD, 0x16, 0x11, 0x69, 0xC7, 0xD9, 0x2B, 0x00,
+ 0xBA, 0xE7, 0x47, 0xB5, 0xF3, 0x74, 0x14, 0x11, 0xC5, 0x29, 0x5F, 0xA0, 0xF2, 0x0B, 0xB5, 0x45,
+ 0xEB, 0x88, 0x96, 0x1F, 0x26, 0xCC, 0x47, 0xD7, 0x5A, 0x96, 0x1A, 0xB5, 0xD7, 0x66, 0x98, 0xD0,
+ 0x65, 0xDC, 0xE2, 0x15, 0xAF, 0xAC, 0x7E, 0x60, 0xBE, 0x9E, 0x2D, 0xB5, 0x9B, 0xD9, 0x19, 0x36,
+ 0x53, 0x2F, 0xE4, 0x40, 0xD7, 0xDC, 0x82, 0x16, 0x8B, 0x99, 0x1B, 0xB3, 0x5C, 0xBB, 0x6A, 0x3F,
+ 0x90, 0xE4, 0xF8, 0x57, 0xDE, 0x9E, 0x63, 0xFD, 0x78, 0x4F, 0x0A, 0x26, 0x73, 0x0E, 0xD9, 0x47,
+ 0x8B, 0x52, 0xBF, 0x77, 0x75, 0x15, 0xD2, 0x70, 0xDC, 0x4B, 0x47, 0x1D, 0x6A, 0x7A, 0x5F, 0xFE,
+ 0x64, 0x89, 0xAB, 0xA1, 0x95, 0x8F, 0x27, 0xD1, 0xAD, 0x5C, 0x6D, 0xAB, 0xAF, 0x53, 0xA5, 0x7E,
+ 0xFC, 0x14, 0x02, 0xE0, 0xEA, 0x14, 0x60, 0x71, 0x20, 0xB5, 0x2B, 0x33, 0x47, 0xE8, 0x05, 0x82,
+ 0x4B, 0x85, 0xE3, 0xFE, 0x9D, 0x21, 0x95, 0x7F, 0x18, 0x11, 0xB4, 0x0D, 0x7F, 0xB6, 0xAB, 0xF4,
+ 0xF4, 0xE7, 0x43, 0x20, 0x50, 0x28, 0x72, 0x8B, 0x11, 0x83, 0xA5, 0xB6, 0x1E, 0x94, 0xF9, 0x25,
+ 0x94, 0x2B, 0xBC, 0xD6, 0x55, 0x41, 0xE4, 0xF0, 0xD9, 0xF5, 0x4D, 0x30, 0x4A, 0xD4, 0x9D, 0x3B,
+ 0x23, 0xE3, 0x95, 0x2E, 0xB6, 0x60, 0x0D, 0xAD, 0x28, 0xE5, 0xF9, 0x6E, 0x6A, 0x74, 0xB5, 0x6C,
+ 0x88, 0x59, 0x87, 0x30, 0x4A, 0x54, 0xE0, 0x80, 0xAA, 0x1E, 0x76, 0x02, 0x16, 0x55, 0xC5, 0xF2,
+ 0xC8, 0x38, 0xE3, 0x22, 0x12, 0x7A, 0x16, 0x51, 0xDB, 0x5B, 0x38, 0xF3, 0xE0, 0xC1, 0x45, 0x56,
+ 0x6A, 0xD3, 0xD3, 0x25, 0x59, 0x9A, 0x7A, 0x1F, 0x8A, 0xF4, 0xAF, 0x98, 0x4E, 0xC8, 0x1D, 0x6A,
+ 0x7E, 0x34, 0x4B, 0xD7, 0x85, 0x2F, 0xBB, 0x0F, 0x7B, 0xD4, 0x76, 0x44, 0x83, 0x8A, 0x76, 0x01,
+ 0x39, 0xAE, 0x88, 0xA5, 0xB0, 0xFC, 0xBF, 0xEA, 0xD1, 0xFD, 0x44, 0x25, 0x72, 0xD9, 0xBC, 0x3F,
+ 0xD9, 0xC1, 0x29, 0x44, 0x22, 0x0E, 0x6A, 0x49, 0xE1, 0x32, 0x23, 0xB3, 0x45, 0x80, 0x81, 0x9C,
+ 0x38, 0x88, 0xE7, 0x27, 0x66, 0x09, 0x90, 0xF2, 0xBD, 0x3C, 0x4B, 0x10, 0x98, 0x52, 0x4D, 0x81,
+ 0x26, 0x25, 0xD3, 0xE3, 0x66, 0x00, 0x27, 0x39, 0xBF, 0x6A, 0x40, 0x1D, 0x8F, 0x6F, 0x21, 0x16,
+ 0x22, 0x73, 0x1E, 0x9E, 0x11, 0xFF, 0xB8, 0xC9, 0x9A, 0x56, 0x35, 0x14, 0x78, 0xBD, 0x1F, 0x7B,
+ 0x89, 0x47, 0xB6, 0x6A, 0x51, 0xBC, 0x08, 0x9F, 0x3D, 0xCF, 0x1C, 0xC5, 0x2C, 0x82, 0x88, 0x72,
+ 0xCC, 0x35, 0x9B, 0xD7, 0x31, 0xFE, 0xAE, 0x40, 0x2D, 0xBF, 0x21, 0xC3, 0xF1, 0xA8, 0x39, 0xC0,
+ 0x59, 0xB4, 0x29, 0x7C, 0x5D, 0x5C, 0x0A, 0x7C, 0xD6, 0xA2, 0xB9, 0x5A, 0x69, 0x3A, 0xF2, 0xA5,
+ 0xB5, 0x40, 0x5D, 0x84, 0x1E, 0x8A, 0x93, 0x2B, 0x75, 0x8C, 0xF0, 0x7F, 0x57, 0x12, 0xB6, 0xF9,
+ 0xBB, 0xBE, 0x28, 0x20, 0x4B, 0xB1, 0xA8, 0x90, 0xE6, 0x6A, 0xE9, 0xB3, 0xB2, 0x14, 0xCE, 0xA0,
+ 0xCD, 0x9B, 0xD2, 0x8D, 0xEB, 0x34, 0xB2, 0x71, 0x86, 0x96, 0xFB, 0x88, 0x5E, 0x9F, 0x0D, 0xE6,
+ 0x99, 0x87, 0xAB, 0xAA, 0xF4, 0xEA, 0xD3, 0xFE, 0xCE, 0x6D, 0x2C, 0x93, 0x8A, 0x06, 0x16, 0x47,
+ 0xBB, 0xFF, 0xE0, 0xC5, 0x31, 0xF1, 0x46, 0x31, 0xB4, 0x6D, 0xFE, 0x9A, 0x62, 0xC0, 0xD9, 0x17,
+ 0xC2, 0x38, 0x18, 0x5C, 0xBA, 0x00, 0xCE, 0x10, 0x89, 0x96, 0x36, 0x82, 0x95, 0xD4, 0x76, 0x90,
+ 0x7D, 0x5D, 0x79, 0x59, 0x20, 0x63, 0xA4, 0x5F, 0x10, 0x5C, 0x08, 0xF4, 0x53, 0x39, 0xC7, 0x16,
+ 0xB7, 0xE7, 0x37, 0xC6, 0x67, 0x2D, 0x75, 0xA9, 0x86, 0x96, 0x3D, 0x55, 0x45, 0xFE, 0xFA, 0xC4,
+ 0xFE, 0x66, 0xEA, 0x53, 0xD3, 0x3C, 0x40, 0xA1, 0x96, 0x31, 0x0F, 0x2C, 0x56, 0x82, 0xF5, 0xAD,
+ 0x4B, 0x56, 0x1A, 0x04, 0x5E, 0xC0, 0x92, 0xED, 0x74, 0xF1, 0x9D, 0x11, 0x0F, 0x8F, 0x69, 0x90,
+ 0x53, 0x78, 0x71, 0x0D, 0x8A, 0x6C, 0x8E, 0xB0, 0xA2, 0x33, 0x38, 0x7E, 0x18, 0xC5, 0x28, 0xEE,
+ 0x4F, 0xE5, 0x57, 0xC5, 0x5E, 0x42, 0xDE, 0xA8, 0xB7, 0x77, 0xE5, 0x5D, 0xDD, 0xD9, 0xFE, 0xFF,
+ 0x69, 0xF6, 0x0A, 0xBF, 0xE1, 0x22, 0xEC, 0x09, 0xF3, 0x05, 0x61, 0x31, 0x71, 0x31, 0x06, 0x36,
+ 0x76, 0x34, 0xB4, 0x5B, 0x46, 0x4C, 0x7F, 0x26, 0x0F, 0x97, 0x75, 0x34, 0x75, 0x2B, 0x88, 0x1B,
+ 0xEC, 0xF7, 0x65, 0xF7, 0x92, 0x30, 0x04, 0xBA, 0x56, 0xBE, 0x44, 0xF8, 0x0C, 0x3A, 0x27, 0xD9,
+ 0xE1, 0x70, 0x10, 0x18, 0xE8, 0xE0, 0xB5, 0xC6, 0x1E, 0x0E, 0x11, 0x7C, 0xB8, 0x7C, 0x3E, 0xD1,
+ 0xDD, 0xEB, 0xA4, 0x14, 0x2F, 0xC1, 0xAB, 0x77, 0x0E, 0x51, 0x23, 0xCC, 0x5E, 0x34, 0x19, 0xC9,
+ 0xBD, 0x81, 0x96, 0x00, 0xD6, 0xE9, 0xAA, 0x82, 0xD3, 0xE6, 0x00, 0x09, 0x3E, 0xC0, 0xB6, 0x4F,
+ 0xF1, 0x39, 0x00, 0xF0, 0xD6, 0xB1, 0x7A, 0xA2, 0xD3, 0xD6, 0x08, 0x65, 0xE5, 0x4A, 0x84, 0xDA,
+ 0x85, 0x17, 0xAC, 0x17, 0x03, 0x35, 0x07, 0x8F, 0xF9, 0xB3, 0xCC, 0xC9, 0x3E, 0xF9, 0x4E, 0xA4,
+ 0x30, 0xE3, 0xC9, 0x96, 0x8B, 0x6B, 0x53, 0x4E, 0x11, 0xAF, 0x53, 0xAC, 0x92, 0x8E, 0xCC, 0xFE,
+ 0xCA, 0x12, 0x7F, 0x92, 0x0A, 0x62, 0x7A, 0x38, 0xCA, 0xAA, 0x89, 0x0C, 0x00, 0x91, 0xA1, 0x9F,
+ 0x96, 0x13, 0x2B, 0x46, 0x0E, 0x59, 0xC0, 0xF3, 0x49, 0xDC, 0xF0, 0xFA, 0xBF, 0x4D, 0xE7, 0xF3,
+ 0x0A, 0x82, 0x12, 0x05, 0xDE, 0xA5, 0xA9, 0x8B, 0x67, 0xD0, 0xF5, 0x0B, 0xEE, 0xA1, 0x73, 0x8F,
+ 0xCC, 0x47, 0x67, 0x7E, 0x83, 0x79, 0x56, 0x19, 0x49, 0x5B, 0xE0, 0x30, 0x5F, 0xE6, 0xCB, 0x6E,
+ 0xEC, 0x69, 0x31, 0xB8, 0x87, 0x6E, 0xC0, 0xEA, 0x76, 0x79, 0x3A, 0x1A, 0x05, 0x8B, 0xD3, 0xB1,
+ 0x56, 0x57, 0x13, 0xDF, 0x3A, 0x6F, 0x38, 0xFF, 0x3A, 0xFB, 0x59, 0x35, 0x37, 0xFA, 0x93, 0xBB,
+ 0xA3, 0x13, 0x69, 0xC1, 0xCA, 0x3B, 0x9C, 0x73, 0x51, 0x81, 0x38, 0x57, 0x12, 0x55, 0xA7, 0x7F,
+ 0x27, 0x87, 0x8B, 0x4A, 0x0C, 0x7F, 0x2D, 0x6C, 0x6E, 0xED, 0x69, 0xDD, 0xC3, 0x29, 0xDA, 0x67,
+ 0xDF, 0x2E, 0x9B, 0x3D, 0xB1, 0xA7, 0xFA, 0x1E, 0xF0, 0x09, 0xE2, 0x69, 0x4A, 0x97, 0xE0, 0x63,
+ 0x92, 0x16, 0xF1, 0x7C, 0x70, 0x50, 0x72, 0xFE, 0x96, 0x94, 0xE4, 0xAB, 0x5A, 0xCA, 0xEB, 0x69,
+ 0x3C, 0x12, 0xE5, 0x1A, 0xB8, 0x2C, 0x8C, 0x24, 0xA2, 0xF3, 0x2A, 0xFF, 0xA0, 0xEC, 0xE8, 0xDE,
+ 0xAF, 0x4C, 0xA0, 0xEB, 0x4D, 0x13, 0x77, 0x19, 0x23, 0xE3, 0xE2, 0x72, 0xC3, 0xD4, 0x3A, 0x70,
+ 0x1D, 0xA7, 0xE0, 0x92, 0x38, 0x98, 0x68, 0xBB, 0x82, 0x98, 0xC7, 0x30, 0x38, 0x50, 0x2A, 0xDF,
+ 0xAF, 0x9C, 0x7F, 0xAB, 0x8A, 0xBB, 0x98, 0x6A, 0x48, 0x4A, 0xE4, 0x29, 0x3F, 0x5A, 0xBE, 0x7D,
+ 0x3D, 0xC8, 0xCB, 0x13, 0x9E, 0x9D, 0x86, 0xC5, 0x96, 0x1C, 0xB4, 0xD6, 0xBF, 0x32, 0xE2, 0x4D,
+ 0x1B, 0x86, 0x1A, 0xFA, 0xD0, 0xFB, 0x25, 0xA2, 0xBA, 0x6F, 0xEE, 0x36, 0xF6, 0x24, 0xEC, 0x7D,
+ 0x8E, 0x96, 0xA4, 0x95, 0x4B, 0x3F, 0x5D, 0x1F, 0x11, 0x9B, 0xAD, 0x4B, 0xC5, 0x5C, 0x87, 0x58,
+ 0xA4, 0x56, 0xEB, 0xEA, 0x99, 0xC3, 0x85, 0x11, 0x01, 0x7B, 0xFD, 0x39, 0x33, 0xB9, 0xD7, 0xDC,
+ 0x26, 0x99, 0xCD, 0xB7, 0x7E, 0x7E, 0x60, 0xE7, 0x44, 0x29, 0x6C, 0x0C, 0xFB, 0x13, 0x71, 0x2B,
+ 0x5C, 0x13, 0x88, 0xFD, 0xB9, 0xF4, 0x53, 0x20, 0xD6, 0xBB, 0xEF, 0xF0, 0xDB, 0x53, 0x4A, 0xD0,
+ 0x1B, 0xF3, 0x6F, 0xDB, 0x8E, 0xF6, 0xB0, 0x46, 0x5C, 0x2A, 0xAD, 0xFB, 0x27, 0x52, 0xE5, 0xFD,
+ 0x3D, 0x9B, 0x56, 0x9F, 0x47, 0xBA, 0xA9, 0xB7, 0xAA, 0x5C, 0xB2, 0xFD, 0x4F, 0xA8, 0xAD, 0xA9,
+ 0xDB, 0xB2, 0x34, 0xE5, 0x86, 0xCB, 0x5F, 0xE7, 0x65, 0xEE, 0x92, 0x9D, 0x3E, 0x35, 0x42, 0x35,
+ 0x48, 0x03, 0x52, 0x31, 0x71, 0xCE, 0x72, 0xEC, 0x1F, 0x88, 0xCE, 0xDC, 0xB2, 0x38, 0x32, 0xEA,
+ 0x1B, 0x71, 0x22, 0xFC, 0x14, 0x53, 0xD8, 0x2E, 0x6B, 0xF3, 0xDB, 0xF9, 0x3F, 0x01, 0xDC, 0xEF,
+ 0xFE, 0x74, 0xE4, 0xE1, 0x7B, 0x55, 0x21, 0xB5, 0x40, 0x78, 0x87, 0x76, 0xFC, 0xFA, 0x36, 0x25,
+ 0x45, 0xB9, 0x47, 0x2A, 0x65, 0x56, 0x75, 0x8E, 0xDC, 0x6E, 0x27, 0x2D, 0x43, 0x82, 0xCC, 0x76,
+ 0xA0, 0x48, 0x33, 0x88, 0x5B, 0x58, 0xF3, 0x83, 0x6D, 0x8C, 0x1E, 0xFC, 0xA3, 0x1A, 0xAC, 0x74,
+ 0xB4, 0x38, 0x47, 0xCA, 0x20, 0x06, 0x14, 0xAB, 0x5A, 0xBD, 0x5E, 0x38, 0x5A, 0x1E, 0x88, 0xC7,
+ 0xF9, 0x69, 0x7D, 0xBF, 0x91, 0x2C, 0x51, 0x18, 0x95, 0xF6, 0x19, 0x98, 0x79, 0xFC, 0x69, 0xFD,
+ 0xF7, 0xA9, 0x21, 0xA1, 0xD4, 0xBF, 0xC5, 0x21, 0xF5, 0xBA, 0xD2, 0x9B, 0xF8, 0xA5, 0x40, 0x57,
+ 0xD1, 0x10, 0x47, 0x0F, 0x93, 0x50, 0x0F, 0x5D, 0x97, 0x96, 0x14, 0x2B, 0x71, 0x63, 0x88, 0xEC,
+ 0xA1, 0x92, 0xF0, 0x76, 0x86, 0x5C, 0xCC, 0x37, 0x86, 0x04, 0xD2, 0xB0, 0xDD, 0x53, 0x82, 0xD6,
+ 0x28, 0xCC, 0x05, 0x60, 0xE1, 0x3F, 0x27, 0xD2, 0x1C, 0x80, 0x68, 0xAA, 0xA9, 0x16, 0xCD, 0xF5,
+ 0x82, 0x55, 0x11, 0xDD, 0x05, 0x2D, 0x56, 0x9F, 0xC9, 0x92, 0xA2, 0xB8, 0xDF, 0xD9, 0x32, 0x28,
+ 0xD4, 0xE9, 0xEA, 0x7E, 0x93, 0x5D, 0x33, 0x96, 0x77, 0x81, 0xCF, 0x63, 0xE2, 0xC5, 0xC4, 0x41,
+ 0x89, 0x0A, 0x64, 0xCC, 0x68, 0xD3, 0x3A, 0x80, 0x1A, 0xAC, 0x36, 0xDC, 0x50, 0x95, 0x5B, 0x8A,
+ 0xE7, 0x24, 0xAD, 0x65, 0xC9, 0x86, 0x2A, 0xC2, 0x0C, 0x48, 0xB0, 0xDD, 0x33, 0x53, 0x1F, 0x08,
+ 0x35, 0x9B, 0x91, 0x52, 0xBB, 0xA8, 0x85, 0xE2, 0xA9, 0x0D, 0x22, 0x80, 0x1D, 0xCA, 0x57, 0xA5,
+ 0x52, 0xE4, 0xDA, 0x10, 0x7C, 0x31, 0xDB, 0xAA, 0x27, 0x98, 0x85, 0xB7, 0xC7, 0x4E, 0xFC, 0x9D,
+ 0x39, 0x8A, 0x10, 0x30, 0x78, 0x4B, 0xB3, 0x3C, 0xAF, 0xAB, 0xE7, 0xD9, 0xBB, 0xB4, 0x11, 0x3E,
+ 0x59, 0x32, 0x2A, 0xD8, 0x89, 0xD8, 0xF5, 0xEB, 0x45, 0xFC, 0xEF, 0x8B, 0x78, 0xCF, 0x10, 0x1B,
+ 0xCF, 0x4A, 0x2C, 0x24, 0x57, 0xED, 0x82, 0x2E, 0x4B, 0xC9, 0x1A, 0xC8, 0x1C, 0xD0, 0x5D, 0xE1,
+ 0x87, 0x6E, 0xEA, 0xED, 0xD9, 0x0D, 0xC9, 0x1C, 0x59, 0x14, 0x85, 0xFB, 0x60, 0xFE, 0x62, 0x06,
+ 0x4A, 0xB9, 0x0F, 0x0E, 0x83, 0xFE, 0x14, 0x1A, 0x7F, 0x6F, 0xFB, 0xC0, 0xBF, 0x76, 0x02, 0x3C,
+ 0xAB, 0x58, 0x86, 0xB0, 0xDA, 0x69, 0xE7, 0xFD, 0x2B, 0x4C, 0x47, 0x66, 0xAB, 0xAB, 0xFF, 0x5D,
+ 0xA0, 0xF2, 0x95, 0x47, 0xC8, 0x23, 0xB8, 0x58, 0xA2, 0x74, 0x9D, 0x65, 0x6D, 0x3F, 0xC9, 0xD9,
+ 0xC0, 0xE9, 0x8A, 0x62, 0x0A, 0x6E, 0x1F, 0xE7, 0xD2, 0x86, 0x97, 0x26, 0xA4, 0x0A, 0x9C, 0x54,
+ 0x44, 0xC8, 0x8C, 0x4E, 0x3B, 0xA9, 0xE6, 0x97, 0xBE, 0xBE, 0x16, 0x09, 0xE3, 0xC7, 0xCA, 0x68,
+ 0x47, 0x24, 0x80, 0x22, 0x27, 0x0D, 0xC7, 0xE4, 0x11, 0x68, 0xD2, 0x1A, 0x79, 0x61, 0x89, 0x59,
+ 0xD5, 0xA3, 0x99, 0xDF, 0x9C, 0x5B, 0x10, 0x58, 0x36, 0x6D, 0xDE, 0x9F, 0xB5, 0xC2, 0xF2, 0x9F,
+ 0x68, 0x99, 0x95, 0xD1, 0x79, 0x08, 0x8F, 0xE4, 0xEC, 0x82, 0x7D, 0x70, 0xCF, 0xEA, 0x77, 0x00,
+ 0x0A, 0x0A, 0xE6, 0x39, 0x45, 0x96, 0xB6, 0xA1, 0xC0, 0xA3, 0xAA, 0x64, 0xF8, 0x3B, 0xD2, 0xF7,
+ 0x5C, 0xAD, 0xC0, 0x62, 0x93, 0xDA, 0xAE, 0x08, 0x5F, 0xB5, 0x10, 0x7F, 0x14, 0xB6, 0x91, 0xC3,
+ 0xEC, 0xBB, 0x0F, 0x18, 0x4B, 0x88, 0xBE, 0xFF, 0xA2, 0xF1, 0x02, 0x48, 0x03, 0x6C, 0x6A, 0x5C,
+ 0xAE, 0x7F, 0xBB, 0xA3, 0x02, 0x25, 0x6E, 0x13, 0x9B, 0x64, 0x8C, 0x6B, 0x3D, 0xC1, 0xC6, 0xC7,
+ 0xB6, 0xA8, 0xF2, 0x85, 0x12, 0x87, 0xEA, 0xE0, 0x07, 0x3A, 0xEE, 0x2F, 0xC2, 0x68, 0xB8, 0x05,
+ 0xB5, 0x55, 0x15, 0xDF, 0x21, 0x78, 0x9D, 0x21, 0x80, 0xE8, 0x91, 0xA4, 0x97, 0x1C, 0x08, 0xDB,
+ 0x68, 0xA8, 0xEF, 0x25, 0x00, 0xEE, 0xAC, 0xD7, 0x87, 0x26, 0xD6, 0x27, 0xB8, 0xE5, 0x85, 0x79,
+ 0x3F, 0xA4, 0xE9, 0xC8, 0x51, 0x44, 0xAF, 0xAE, 0x32, 0x08, 0x57, 0x1D, 0xC6, 0xB7, 0x4D, 0x43,
+ 0xDC, 0x3D, 0x27, 0xD4, 0x34, 0x53, 0xEA, 0x1A, 0xFA, 0x57, 0x11, 0x04, 0xC1, 0x70, 0x7D, 0x88,
+ 0x9B, 0x35, 0xAA, 0xBE, 0x23, 0xD4, 0x10, 0xFB, 0xEA, 0x9C, 0x4A, 0xBC, 0xA5, 0xC0, 0x4E, 0xE1,
+ 0x2C, 0x30, 0x15, 0x1B, 0xA6, 0xFA, 0x7C, 0x27, 0x78, 0xA3, 0x2B, 0xF7, 0x90, 0x20, 0x4B, 0xB2,
+ 0xBD, 0xEE, 0x11, 0xD1, 0x53, 0xEB, 0xBC, 0x33, 0xAD, 0x87, 0xD5, 0x15, 0x6B, 0x69, 0xFD, 0x20,
+ 0x3E, 0x74, 0xF3, 0x9D, 0x24, 0x9A, 0xC7, 0x39, 0xEB, 0xD2, 0x81, 0x24, 0x7A, 0x75, 0x20, 0x20,
+ 0xA3, 0x2B, 0xB6, 0x59, 0x62, 0x54, 0xE4, 0x6F, 0x03, 0x41, 0xCD, 0x3A, 0x13, 0x69, 0x5C, 0xDA,
+ 0xD6, 0xE1, 0x64, 0x14, 0x4F, 0x05, 0x03, 0x04, 0x4F, 0x1A, 0x38, 0xF8, 0x40, 0x9E, 0xA1, 0x38,
+ 0xDA, 0x20, 0xB5, 0x54, 0xC6, 0x0D, 0x1D, 0x58, 0xE4, 0x45, 0x10, 0xF5, 0x9C, 0xA6, 0xA4, 0x90,
+ 0x64, 0x35, 0xE6, 0xF0, 0xFE, 0x58, 0x47, 0xC6, 0x84, 0xA6, 0x69, 0x62, 0xCC, 0xFA, 0x50, 0xFA,
+ 0xAC, 0x24, 0x5E, 0x72, 0xCF, 0x4C, 0xAF, 0xCF, 0xF1, 0x12, 0xB8, 0x62, 0xA0, 0xF1, 0xB6, 0x36,
+ 0xF7, 0x3E, 0xD5, 0x3F, 0x2B, 0xD5, 0xC3, 0x57, 0xE7, 0x84, 0x9E, 0xCE, 0x48, 0x21, 0x90, 0x09,
+ 0x5D, 0x62, 0xBB, 0xDC, 0x5A, 0x93, 0x20, 0x6D, 0xF3, 0x8F, 0x9C, 0x51, 0x97, 0x74, 0xC7, 0x55,
+ 0x08, 0xD9, 0x42, 0x11, 0x70, 0x55, 0x08, 0x96, 0x2D, 0xC2, 0x5C, 0x0B, 0x02, 0x6D, 0xFC, 0x3A,
+ 0xCD, 0x21, 0xF2, 0x72, 0xD6, 0x78, 0x3B, 0xD5, 0x52, 0xC9, 0xE9, 0x94, 0x51, 0x2F, 0xBA, 0x27,
+ 0x99, 0x6B, 0xF1, 0xF2, 0xFA, 0xBF, 0x15, 0x68, 0xD1, 0xC6, 0x8A, 0x86, 0x3A, 0x51, 0x45, 0xB2,
+ 0xE9, 0x5D, 0xD1, 0x82, 0xC3, 0x32, 0x28, 0xD3, 0x8B, 0xFB, 0x90, 0x6D, 0x96, 0x9E, 0x65, 0x07,
+ 0xE1, 0x05, 0x28, 0x52, 0xE6, 0x93, 0x93, 0x4B, 0xB1, 0x44, 0xE1, 0xD5, 0xB5, 0x65, 0x1D, 0x1D,
+ 0x5C, 0xFA, 0xB0, 0xCA, 0xC3, 0x9D, 0xCD, 0xAC, 0x11, 0xFF, 0x81, 0x44, 0x91, 0xB0, 0x1C, 0xC8,
+ 0x6F, 0x21, 0xC2, 0x61, 0x95, 0x61, 0x49, 0x19, 0x3F, 0x67, 0x9A, 0xC0, 0x7F, 0xEE, 0xCF, 0xE8,
+ 0x5E, 0x75, 0x03, 0x56, 0x4D, 0x24, 0x61, 0xF9, 0xD8, 0x98, 0xA1, 0x2B, 0xD1, 0x8C, 0x40, 0x9B,
+ 0xDC, 0xB6, 0x5C, 0xC0, 0xD6, 0x84, 0x67, 0x2E, 0x00, 0x2A, 0x89, 0xCE, 0x0A, 0x6D, 0x06, 0x23,
+ 0x64, 0x10, 0xD5, 0xD2, 0x17, 0xC5, 0xF9, 0x98, 0xEE, 0xE6, 0xFC, 0x16, 0x6B, 0x0E, 0xAD, 0x40,
+ 0x4D, 0x2D, 0x78, 0x9C, 0x75, 0x60, 0xDD, 0x55, 0x5B, 0x9F, 0xDF, 0xE0, 0x70, 0x2A, 0x72, 0xF3,
+ 0x10, 0x31, 0x0F, 0xB9, 0xA6, 0xDC, 0x3E, 0x0C, 0x9D, 0x20, 0x91, 0xA6, 0x0F, 0x4E, 0x49, 0x0D,
+ 0x3D, 0x2C, 0x2D, 0x33, 0x32, 0x31, 0x1E, 0xF6, 0x89, 0xD6, 0x66, 0xF0, 0x98, 0x1E, 0x11, 0x36,
+ 0xE2, 0xF2, 0xDE, 0x09, 0x5F, 0x7B, 0x29, 0xA2, 0x51, 0x47, 0xA6, 0xAC, 0x2B, 0xE2, 0x5A, 0xAE,
+ 0x7F, 0x38, 0xA5, 0xF6, 0xFE, 0x61, 0x42, 0x70, 0xB9, 0xCC, 0xCC, 0xD7, 0x23, 0x0F, 0xBF, 0xCC,
+ 0x87, 0x48, 0x31, 0x38, 0x1B, 0x7A, 0x4B, 0x9E, 0xEB, 0x1F, 0x3D, 0x16, 0x55, 0xFA, 0xDB, 0xC2,
+ 0xA0, 0xFF, 0xDC, 0x34, 0x4B, 0x0D, 0x3C, 0x33, 0x55, 0x87, 0x7E, 0x73, 0xCD, 0x66, 0x8A, 0x5D,
+ 0x3F, 0xE4, 0xFE, 0xF1, 0x56, 0xFE, 0xB1, 0xB1, 0x09, 0x4E, 0x1D, 0xA5, 0xEE, 0xD5, 0x6D, 0x9F,
+ 0xA3, 0xA9, 0xCB, 0x16, 0xE4, 0x62, 0x87, 0x1F, 0xB5, 0x88, 0xFB, 0x2B, 0x77, 0xA0, 0xB8, 0x9D,
+ 0x51, 0x1F, 0x88, 0x60, 0x45, 0x69, 0x2A, 0x46, 0x1E, 0x7B, 0x7F, 0x63, 0x98, 0x59, 0x8A, 0x75,
+ 0x6C, 0x4E, 0xFE, 0xFD, 0xC1, 0xCB, 0x68, 0x10, 0x71, 0x38, 0x8F, 0x1A, 0x50, 0xF5, 0x4A, 0xE3,
+ 0x82, 0x28, 0x46, 0x4A, 0x72, 0x0A, 0x86, 0xF9, 0xE0, 0xF4, 0x7E, 0xCB, 0x3A, 0xB5, 0x6C, 0x6A,
+ 0x6B, 0x14, 0x1B, 0x0E, 0xAD, 0x60, 0xCE, 0x39, 0x8F, 0x62, 0x3F, 0x2A, 0x33, 0xBC, 0xF3, 0x03,
+ 0x90, 0x40, 0x3B, 0x5E, 0x30, 0x77, 0xE0, 0xA4, 0xAA, 0x5D, 0xC3, 0xCF, 0x43, 0x0F, 0xF7, 0x1C,
+ 0x4E, 0x60, 0x87, 0x82, 0xB6, 0x5A, 0xF3, 0x35, 0x17, 0x48, 0xFB, 0x8F, 0x34, 0xCB, 0xED, 0x6F,
+ 0xFC, 0xB8, 0x73, 0xBB, 0x09, 0xCE, 0x07, 0x89, 0x58, 0xEB, 0xC4, 0x82, 0x67, 0x45, 0xAD, 0xCA,
+ 0xD9, 0x49, 0xE4, 0x00, 0xAA, 0x5A, 0xED, 0x61, 0xA6, 0x49, 0x1A, 0xB6, 0xC8, 0x09, 0xDE, 0xAA,
+ 0x65, 0x1A, 0x0C, 0xF5, 0xDF, 0xA9, 0x2B, 0xB6, 0x91, 0xE9, 0xF0, 0x08, 0x2A, 0xBB, 0x4A, 0x04,
+ 0x30, 0x0C, 0x71, 0x64, 0xE2, 0xCF, 0xF3, 0xD4, 0x1E, 0x99, 0x9A, 0x2B, 0x11, 0x5D, 0x29, 0x61,
+ 0xC6, 0x2C, 0xC1, 0xA7, 0x05, 0xE8, 0x9B, 0xD0, 0xE4, 0xD2, 0x56, 0x96, 0x5E, 0xA9, 0x25, 0x96,
+ 0x25, 0xBC, 0xBC, 0x12, 0xE5, 0x50, 0x47, 0x4C, 0x8D, 0xBF, 0xA6, 0xDA, 0x0A, 0x88, 0x70, 0x2F,
+ 0x74, 0x2D, 0xE9, 0xCD, 0xD8, 0xF6, 0xD9, 0x76, 0x37, 0x9A, 0x1F, 0x1D, 0x3D, 0x10, 0xBA, 0xD0,
+ 0x3C, 0x13, 0x56, 0x73, 0x79, 0x97, 0xB9, 0x55, 0x9D, 0x8B, 0xF3, 0xD5, 0x87, 0x0B, 0x1D, 0x97,
+ 0x53, 0xD0, 0xF9, 0xA9, 0x76, 0x3B, 0xDE, 0x18, 0x3C, 0xE8, 0xF0, 0x81, 0x13, 0x16, 0x5A, 0x7D,
+ 0x59, 0xF1, 0x9E, 0xE3, 0xC5, 0xBA, 0xFC, 0xB7, 0x7E, 0x5F, 0x05, 0xF4, 0x38, 0x6C, 0xA1, 0x09,
+ 0xAA, 0x15, 0x4C, 0xC5, 0xF6, 0xE7, 0x25, 0x72, 0xC4, 0xAA, 0x82, 0xFE, 0xEB, 0x3F, 0xBC, 0x6B,
+ 0x26, 0xB2, 0xAD, 0x85, 0x83, 0xFB, 0xFA, 0xD9, 0x2D, 0x78, 0x50, 0xBE, 0xF6, 0x70, 0xB4, 0x8A,
+ 0xDB, 0x71, 0xA2, 0x60, 0x80, 0x7A, 0x91, 0xB2, 0x74, 0x54, 0x81, 0xB5, 0xF7, 0x48, 0x77, 0x96,
+ 0x05, 0xD6, 0x34, 0xC1, 0x06, 0x0E, 0x35, 0x20, 0x39, 0x28, 0x2D, 0x57, 0xC1, 0x75, 0xA2, 0x26,
+ 0x0B, 0xEB, 0x59, 0x12, 0x07, 0x46, 0x35, 0x1B, 0x7D, 0x2A, 0x5B, 0x0D, 0x19, 0x1A, 0xBD, 0x09,
+ 0x5D, 0xEF, 0x7A, 0x79, 0x7F, 0xB1, 0xD6, 0x45, 0x00, 0xC3, 0x3E, 0xB2, 0xA9, 0x03, 0x19, 0x43,
+ 0xC3, 0x53, 0x73, 0x24, 0xA2, 0xEC, 0x9B, 0x88, 0x09, 0xF4, 0x5C, 0xB5, 0xC0, 0x69, 0x00, 0xB6,
+ 0xB4, 0x80, 0xDE, 0x9A, 0x7A, 0x85, 0x1D, 0xA7, 0x85, 0x81, 0x3D, 0x83, 0x41, 0x85, 0xA5, 0x32,
+ 0x7B, 0x7D, 0x47, 0xEB, 0x35, 0x07, 0x3C, 0xED, 0xBC, 0x6B, 0xEF, 0xB0, 0x1A, 0x6F, 0x33, 0x0A,
+ 0x2C, 0xBA, 0x54, 0xF8, 0xEE, 0xA9, 0xB4, 0x2A, 0x17, 0x8A, 0x1E, 0x6C, 0x58, 0xFB, 0x09, 0xF0,
+ 0x76, 0x0F, 0x03, 0xD3, 0x34, 0xC1, 0xC2, 0xA1, 0xCD, 0x96, 0x21, 0xFC, 0x9C, 0x21, 0x3D, 0xB6,
+ 0xA2, 0xD1, 0xA2, 0x0F, 0x24, 0xF6, 0x33, 0xB4, 0xB4, 0x36, 0xCA, 0x12, 0x25, 0x52, 0x85, 0x5B,
+ 0x07, 0x82, 0xAF, 0xB8, 0x8B, 0xB1, 0x36, 0x67, 0x32, 0xAF, 0x51, 0x74, 0xDE, 0x15, 0x9B, 0xE7,
+ 0xD9, 0x6D, 0x2C, 0xEA, 0xDE, 0x68, 0x99, 0x66, 0x31, 0x87, 0x7D, 0xEA, 0xA8, 0x4D, 0xF4, 0x06,
+ 0xB5, 0x28, 0xD8, 0x93, 0xB8, 0x38, 0xB3, 0x2D, 0xA2, 0xA8, 0xCD, 0x03, 0x96, 0x61, 0xD1, 0x7B,
+ 0x49, 0x11, 0xE8, 0xEE, 0x25, 0xCE, 0x44, 0xA7, 0x77, 0xED, 0x72, 0xA3, 0xF4, 0xA7, 0xCB, 0x2D,
+ 0x9D, 0xC5, 0xBA, 0x89, 0xBD, 0x9A, 0xC0, 0x84, 0xDD, 0x14, 0x09, 0x1C, 0x11, 0x17, 0x4F, 0x99,
+ 0x23, 0xDA, 0xD2, 0xD4, 0x68, 0x4E, 0x7B, 0xFC, 0x85, 0x24, 0xE7, 0x1A, 0x79, 0xA5, 0x91, 0x9E,
+ 0xD8, 0xBB, 0x0E, 0xFA, 0xC4, 0x99, 0x31, 0xFB, 0x02, 0x4C, 0x15, 0xEC, 0x38, 0x6E, 0xBC, 0xF8,
+ 0xA1, 0xCB, 0xAD, 0x8D, 0x12, 0x66, 0x91, 0x61, 0xAF, 0xA8, 0x01, 0x86, 0xF7, 0x8A, 0x54, 0x30,
+ 0x40, 0xDE, 0x3F, 0x83, 0xA4, 0x9C, 0x43, 0x98, 0x50, 0x21, 0x12, 0xB3, 0x20, 0x53, 0xE5, 0x46,
+ 0x82, 0x7E, 0xDF, 0x59, 0x1E, 0x19, 0x0C, 0x2B, 0xFF, 0x77, 0x92, 0x25, 0xF4, 0x31, 0xDA, 0x82,
+ 0xDA, 0x3A, 0x73, 0xF8, 0x2E, 0x83, 0x30, 0xBF, 0x1E, 0x47, 0x46, 0x2C, 0x62, 0xBA, 0xA7, 0x95,
+ 0x5D, 0xE2, 0xB8, 0x7A, 0xE2, 0x3F, 0xD9, 0x6C, 0xEF, 0xC8, 0x47, 0xA7, 0x19, 0x60, 0x56, 0xC0,
+ 0x8F, 0xB4, 0x8E, 0x1F, 0x33, 0xAD, 0x2A, 0x08, 0xDA, 0x53, 0x52, 0x2D, 0x86, 0x14, 0x6A, 0xB5,
+ 0x94, 0xD0, 0xFC, 0xEE, 0xE6, 0xDD, 0x76, 0xC6, 0x91, 0xCA, 0x3D, 0x00, 0xA4, 0x63, 0x3A, 0x38,
+ 0xE4, 0x79, 0xDE, 0x44, 0x48, 0x41, 0x50, 0x9C, 0x1A, 0xCB, 0x15, 0x68, 0xD5, 0xE5, 0xE8, 0x00,
+ 0x69, 0x3E, 0x2B, 0x82, 0x3B, 0x3D, 0x0A, 0x8F, 0x8B, 0xBE, 0x98, 0x08, 0xD9, 0x66, 0xC3, 0xF2,
+ 0xC9, 0x6E, 0xDF, 0xD0, 0xDC, 0xB1, 0x24, 0x91, 0xA8, 0x70, 0xFA, 0xD2, 0xD7, 0x43, 0x25, 0xE1,
+ 0x04, 0xDA, 0xED, 0x5D, 0xBF, 0xD0, 0x1A, 0x8B, 0xBD, 0x22, 0xA1, 0xEC, 0x90, 0x76, 0xBF, 0x07,
+ 0xE2, 0xA5, 0xB4, 0x4D, 0xEA, 0x39, 0xDA, 0x95, 0x2F, 0xE0, 0x77, 0x23, 0x07, 0x48, 0x28, 0x57,
+ 0x35, 0xD7, 0x30, 0xC0, 0xB2, 0xFC, 0x6E, 0x2B, 0x2F, 0xF3, 0x44, 0x9C, 0xD8, 0xBF, 0xD9, 0x44,
+ 0x2D, 0x92, 0xDF, 0x51, 0x7A, 0x6E, 0xBB, 0x69, 0xC9, 0xA8, 0xC2, 0x27, 0x15, 0x8F, 0x88, 0xE3,
+ 0xFD, 0x96, 0xD4, 0x1D, 0x1A, 0xF9, 0xB7, 0x2C, 0x54, 0xE5, 0xA6, 0x4B, 0xBC, 0xC3, 0x89, 0xFD,
+ 0x09, 0xAB, 0xB9, 0xB2, 0xC2, 0xF1, 0xB6, 0x9E, 0xFA, 0x2E, 0xF1, 0x6A, 0x2A, 0x3F, 0x3A, 0xDC,
+ 0x21, 0x66, 0x76, 0xB5, 0x7C, 0xEA, 0xE5, 0xE0, 0xD9, 0xA9, 0x14, 0x92, 0xD6, 0x0D, 0x04, 0xB4,
+ 0x04, 0x8A, 0xF6, 0xF1, 0x85, 0x69, 0xF4, 0x1F, 0x8D, 0xBC, 0x6A, 0x9B, 0x7F, 0x0D, 0x7C, 0xC7,
+ 0x4C, 0x26, 0x60, 0x4F, 0xB0, 0x08, 0x5D, 0x15, 0x72, 0x02, 0x2E, 0xD1, 0xF1, 0xD1, 0xED, 0x8F,
+ 0x0A, 0x8B, 0x8A, 0xD1, 0x18, 0x18, 0x77, 0x40, 0x40, 0x35, 0x2B, 0xDB, 0x28, 0x9B, 0x0B, 0x32,
+ 0xBF, 0x17, 0x54, 0x3B, 0xF5, 0xEF, 0xED, 0x6A, 0x6C, 0x4D, 0x8C, 0x27, 0xF5, 0x36, 0xD2, 0x97,
+ 0x20, 0x3E, 0x72, 0x50, 0x91, 0x79, 0x93, 0x53, 0x53, 0xA3, 0x50, 0xD3, 0x09, 0xAF, 0x36, 0x90,
+ 0x0A, 0xAA, 0xE6, 0x19, 0x05, 0x5D, 0x5D, 0x6D, 0x04, 0x9A, 0x08, 0x7A, 0xD9, 0x06, 0x9C, 0x03,
+ 0xD9, 0x12, 0xFA, 0x36, 0x10, 0xEB, 0x9C, 0x4C, 0x74, 0xEC, 0x69, 0x36, 0xB3, 0x8A, 0x0C, 0x22,
+ 0xA6, 0xB3, 0xF1, 0xAE, 0x70, 0x8B, 0xA8, 0x38, 0x08, 0x0F, 0x42, 0x40, 0x89, 0x6D, 0x09, 0xEC,
+ 0x71, 0x44, 0x8F, 0xD1, 0xC7, 0xCB, 0x8F, 0x4C, 0xEC, 0xC8, 0x5B, 0x7D, 0xB1, 0x77, 0x36, 0x66,
+ 0xA6, 0xDF, 0x29, 0x2B, 0x2F, 0x5E, 0x8D, 0x3D, 0xE6, 0x38, 0xC1, 0x32, 0x0B, 0x64, 0x90, 0xB1,
+ 0xA7, 0x03, 0x4A, 0x41, 0x94, 0xE6, 0xFF, 0x37, 0x1E, 0x75, 0xD4, 0x1C, 0x71, 0x63, 0xB4, 0x64,
+ 0x9B, 0x1B, 0x4C, 0x7B, 0xFB, 0x16, 0x95, 0x95, 0xDB, 0xB6, 0x08, 0x93, 0x9B, 0x7B, 0x86, 0xA0,
+ 0x53, 0x24, 0x40, 0x7F, 0x2F, 0xF0, 0x86, 0xE4, 0x89, 0x02, 0x88, 0xBA, 0x25, 0xE9, 0xD9, 0x46,
+ 0x08, 0x1C, 0xBD, 0x73, 0x81, 0xBB, 0x48, 0x55, 0x65, 0x46, 0x9D, 0x06, 0x75, 0x99, 0x75, 0x7A,
+ 0x06, 0x3E, 0x4B, 0x25, 0x8D, 0x7B, 0x78, 0x81, 0xC6, 0x98, 0xAA, 0x20, 0x22, 0x8B, 0x74, 0x6B,
+ 0x01, 0x1E, 0x7A, 0x36, 0x39, 0xC7, 0x53, 0x09, 0x53, 0x92, 0xF0, 0x1A, 0x49, 0x2E, 0x91, 0x26,
+ 0x02, 0xEB, 0x14, 0xEE, 0x8D, 0x48, 0xC1, 0x79, 0x01, 0x1B, 0x03, 0x33, 0x7B, 0xD1, 0xAE, 0x99,
+ 0xD9, 0xDE, 0x17, 0xAB, 0xBE, 0xA8, 0x38, 0xAD, 0x8B, 0x82, 0x60, 0x4E, 0xF3, 0xF0, 0xB2, 0xFB,
+ 0x51, 0x14, 0x57, 0x9A, 0xE3, 0xDC, 0xB0, 0x5C, 0x66, 0xDD, 0xFE, 0x2A, 0x5A, 0x10, 0x23, 0x2F,
+ 0xBA, 0x07, 0x3C, 0x48, 0x37, 0x6A, 0x29, 0xA5, 0x6C, 0xC5, 0x1E, 0xCF, 0x36, 0x1C, 0x0B, 0x4B,
+ 0x1F, 0x39, 0x8C, 0xAF, 0x16, 0x50, 0xEB, 0x42, 0x30, 0x5F, 0x23, 0x74, 0x85, 0x94, 0xFA, 0x69,
+ 0x53, 0x95, 0xF8, 0xAF, 0x78, 0xDD, 0x88, 0x82, 0xC6, 0xEA, 0xBB, 0xB1, 0xAF, 0x12, 0xE8, 0x97,
+ 0x9A, 0xBB, 0x70, 0x8C, 0x5D, 0x0B, 0x89, 0xB1, 0x86, 0x2F, 0x7C, 0x8B, 0x59, 0x57, 0x2D, 0xC9,
+ 0xC8, 0x8A, 0xDC, 0xA1, 0xCD, 0xE1, 0x5D, 0x15, 0x2E, 0x6C, 0x9C, 0xAA, 0x22, 0x0A, 0x93, 0x6B,
+ 0x8B, 0x9A, 0xDF, 0xE7, 0xBE, 0xD9, 0x29, 0x02, 0x09, 0x8A, 0x7B, 0x14, 0xA4, 0x86, 0xF2, 0x50,
+ 0xFC, 0x64, 0xAA, 0x69, 0xC8, 0x8B, 0xB7, 0xA9, 0x55, 0xFB, 0x1F, 0xD4, 0x35, 0x91, 0xCE, 0x81,
+ 0xBC, 0xC6, 0x54, 0x2A, 0x86, 0x2F, 0x02, 0x90, 0xB7, 0x01, 0x15, 0x31, 0x69, 0x67, 0x18, 0xA0,
+ 0x2B, 0x90, 0x3A, 0xA9, 0xA1, 0x38, 0xDD, 0xA7, 0x42, 0x92, 0xE8, 0x71, 0xCE, 0x32, 0x18, 0x73,
+ 0xCB, 0x1D, 0xC3, 0xA2, 0xF8, 0x1C, 0x6B, 0x60, 0xED, 0xCA, 0x0F, 0xF6, 0xB5, 0x80, 0x7A, 0x7A,
+ 0x33, 0x6D, 0xD1, 0x6D, 0xD1, 0x8C, 0xD1, 0x58, 0x3E, 0xA7, 0x7A, 0x95, 0x30, 0x65, 0xBD, 0x07,
+ 0x15, 0xC1, 0xFC, 0xFF, 0x41, 0x93, 0x5F, 0x7C, 0x7F, 0x30, 0x66, 0x52, 0x44, 0x16, 0x39, 0x6D,
+ 0x42, 0x9D, 0x0D, 0xF1, 0x72, 0x69, 0x11, 0x53, 0xC3, 0xA0, 0x9B, 0x89, 0xB6, 0xE4, 0x8C, 0x4B,
+ 0x87, 0x80, 0x9A, 0xB4, 0x3E, 0x33, 0x8D, 0xAB, 0x81, 0x15, 0x05, 0x19, 0x87, 0xB1, 0xDA, 0x05,
+ 0x4B, 0x60, 0xBA, 0x1D, 0xE7, 0x3B, 0x7E, 0x42, 0xAB, 0x5A, 0xD0, 0x21, 0x30, 0xB5, 0x78, 0xB5,
+ 0xC0, 0x8F, 0x83, 0x39, 0x7A, 0x7A, 0xAF, 0x4F, 0x9B, 0xCC, 0xD9, 0xDA, 0x01, 0x9C, 0xFE, 0xAD,
+ 0xAB, 0xE7, 0xF7, 0x2F, 0xC1, 0xE6, 0x32, 0xC4, 0x9F, 0xCD, 0x10, 0xF2, 0xA5, 0x0F, 0xDD, 0x54,
+ 0x98, 0xEA, 0x57, 0x7C, 0x43, 0x39, 0xAA, 0x95, 0x83, 0x7E, 0x1B, 0x34, 0x3A, 0x29, 0xF7, 0x07,
+ 0xC0, 0x8B, 0xAF, 0x48, 0x71, 0xED, 0xEA, 0x7F, 0x73, 0xD6, 0x0E, 0x6D, 0x96, 0xC3, 0x0F, 0x9F,
+ 0xA9, 0x5C, 0x98, 0x00, 0x16, 0xC4, 0xC6, 0x72, 0xEF, 0x00, 0x27, 0x01, 0x31, 0x75, 0x18, 0x28,
+ 0x75, 0xE5, 0xCB, 0x4D, 0x9E, 0x25, 0xCD, 0x72, 0xD8, 0xAA, 0x1B, 0x0B, 0x35, 0x6A, 0xDC, 0x0A,
+ 0x11, 0x85, 0x01, 0x7B, 0x94, 0x29, 0xA8, 0x41, 0x29, 0xD4, 0xCE, 0xBE, 0x7B, 0x14, 0x45, 0x52,
+ 0x56, 0xEB, 0x4E, 0x45, 0x14, 0x62, 0x87, 0xA4, 0x29, 0x24, 0xF6, 0xF8, 0x70, 0x77, 0x29, 0x6A,
+ 0xB6, 0x56, 0x46, 0x20, 0x5A, 0x9C, 0x45, 0x3A, 0x54, 0x6B, 0xF8, 0x2B, 0x4A, 0xCA, 0x8E, 0xBB,
+ 0x97, 0x15, 0xAC, 0x6B, 0x60, 0x34, 0x73, 0x6F, 0x26, 0xEA, 0x1F, 0x1F, 0x8C, 0x10, 0x40, 0x46,
+ 0x10, 0x09, 0x16, 0x37, 0x26, 0x86, 0xB1, 0xCF, 0x29, 0x28, 0x9F, 0x14, 0x75, 0x6C, 0xEE, 0x7F,
+ 0x92, 0xFB, 0x95, 0xD6, 0xFA, 0x8F, 0x13, 0x75, 0x37, 0xA5, 0xCC, 0x8A, 0x8E, 0xD0, 0x50, 0x9D,
+ 0x80, 0x3B, 0xD8, 0x1E, 0x5A, 0xA4, 0x66, 0xA9, 0x5D, 0xC7, 0xB2, 0x25, 0x3D, 0xCB, 0x36, 0x82,
+ 0x36, 0x9F, 0xCD, 0x11, 0x07, 0x6B, 0x94, 0xED, 0x1D, 0xB2, 0x5A, 0xD8, 0x39, 0xEE, 0xC9, 0x5F,
+ 0x5A, 0xDC, 0x2D, 0xDE, 0x75, 0x9D, 0x3C, 0x6E, 0xA0, 0xD3, 0x61, 0x96, 0x08, 0x44, 0x37, 0x31,
+ 0x62, 0xDB, 0xC1, 0xEC, 0x72, 0x7A, 0xDF, 0x29, 0xD7, 0x94, 0x10, 0x42, 0xA0, 0x77, 0xC4, 0x3E,
+ 0xA2, 0x6D, 0x4D, 0x0D, 0x3F, 0xFA, 0x9A, 0x3B, 0x3D, 0x7D, 0x86, 0xD1, 0x91, 0x96, 0x3F, 0x6C,
+ 0x9C, 0xEF, 0x83, 0xE7, 0x31, 0xC9, 0xEB, 0x7B, 0xDA, 0x82, 0x7A, 0xAA, 0xF9, 0xD7, 0xB2, 0x55,
+ 0x39, 0xE8, 0xF4, 0xEC, 0x06, 0xE8, 0x1C, 0x22, 0x68, 0x18, 0x10, 0x8F, 0xF9, 0x13, 0x0C, 0x0E,
+ 0xEC, 0x26, 0xDB, 0x0D, 0x03, 0xE1, 0x24, 0xC1, 0x97, 0xDB, 0x13, 0xA1, 0x2C, 0xFC, 0x61, 0x32,
+ 0xC6, 0x1B, 0xFB, 0x4F, 0x7C, 0x18, 0xD4, 0x85, 0x1E, 0x14, 0xEE, 0x45, 0x1A, 0x0C, 0xA3, 0xD0,
+ 0x2A, 0x8F, 0x44, 0x10, 0x7F, 0x32, 0xC3, 0x6E, 0xF9, 0x57, 0x6D, 0x59, 0x49, 0xAA, 0xD0, 0x5D,
+ 0xBA, 0xB7, 0xA5, 0x28, 0xD3, 0xE9, 0x1E, 0x99, 0xB1, 0x46, 0x4B, 0xF5, 0x8D, 0x4A, 0xE1, 0x11,
+ 0xAF, 0x9F, 0xBE, 0x3A, 0x21, 0xE1, 0x3F, 0x8F, 0x83, 0xF0, 0x2F, 0x30, 0xB6, 0x59, 0x4F, 0x03,
+ 0x17, 0xDA, 0x32, 0x7F, 0x01, 0x0F, 0x58, 0xB1, 0xAC, 0x04, 0xA5, 0xC3, 0x4D, 0x5C, 0x13, 0xFD,
+ 0x14, 0x58, 0x8D, 0xEE, 0x78, 0x82, 0xBD, 0xD4, 0xFE, 0xA3, 0x7F, 0xDC, 0x78, 0x44, 0x07, 0x3A,
+ 0x4A, 0x64, 0x31, 0x1A, 0x7F, 0xBD, 0x5E, 0x7D, 0x20, 0x99, 0x3B, 0xE3, 0x2B, 0x99, 0x89, 0xDA,
+ 0xEA, 0x73, 0x13, 0x5E, 0x53, 0x5C, 0x93, 0x93, 0xE9, 0x8B, 0xEA, 0x7E, 0xB5, 0xAA, 0xDD, 0xA0,
+ 0x63, 0x0C, 0xB1, 0x2F, 0x2C, 0xD7, 0xAA, 0x13, 0x51, 0x5D, 0xA8, 0x5C, 0x97, 0x9A, 0x9B, 0xF2,
+ 0x70, 0x0D, 0xA6, 0x1C, 0x6E, 0xD1, 0xA5, 0xBA, 0xB8, 0x62, 0x78, 0x00, 0xB1, 0xE5, 0x5D, 0xB5,
+ 0x9F, 0xD0, 0x0C, 0x06, 0x51, 0x9E, 0x41, 0xF0, 0xE3, 0xBA, 0x46, 0x39, 0x83, 0x39, 0xAF, 0x7A,
+ 0xDF, 0x5C, 0x0E, 0xDB, 0xE4, 0xEB, 0x4C, 0x0E, 0x99, 0xC3, 0xD7, 0x95, 0x31, 0xBF, 0xDB, 0x2D,
+ 0xB1, 0x21, 0xA8, 0xDD, 0xB6, 0xB8, 0xAE, 0x08, 0x0A, 0x71, 0x23, 0xF9, 0xE1, 0x57, 0xAD, 0xB8,
+ 0x19, 0xBA, 0x39, 0xB6, 0x65, 0xAC, 0xC3, 0x42, 0x6F, 0xB9, 0x4A, 0xD9, 0xB5, 0xB9, 0xA9, 0x1E,
+ 0xE5, 0xA7, 0x3F, 0xE6, 0x40, 0x63, 0x02, 0x2F, 0xF2, 0x01, 0x0D, 0x07, 0xA1, 0x2F, 0xC3, 0x65,
+ 0xC0, 0x58, 0x2D, 0x21, 0xBC, 0x4C, 0x6E, 0x51, 0xF4, 0xB0, 0xF4, 0x87, 0x79, 0xA5, 0x74, 0x08,
+ 0xF7, 0xFB, 0xF6, 0xF9, 0x13, 0x49, 0x11, 0xBC, 0x36, 0x14, 0x87, 0x20, 0x06, 0x74, 0xBA, 0x1E,
+ 0xCF, 0x92, 0xBC, 0xC3, 0x26, 0x6D, 0xD9, 0x05, 0xC6, 0x08, 0x91, 0x97, 0x8F, 0x0F, 0xC1, 0x9A,
+ 0x3A, 0x91, 0x9C, 0x5F, 0xBE, 0x51, 0x9D, 0x01, 0xA4, 0xF3, 0xAA, 0x26, 0x5E, 0x25, 0xDE, 0xF2,
+ 0x01, 0x6B, 0x84, 0x85, 0x46, 0xBF, 0x8C, 0xCB, 0xBC, 0x24, 0x39, 0x88, 0xB7, 0x2E, 0x5B, 0xD4,
+ 0x36, 0x12, 0xD4, 0xFD, 0xAE, 0x81, 0xA3, 0x9E, 0xD6, 0xE8, 0xA2, 0x40, 0xBD, 0x22, 0xBA, 0x0D,
+ 0x51, 0x8C, 0x67, 0xBC, 0x54, 0x13, 0x3C, 0x1D, 0x05, 0x20, 0xA8, 0x9D, 0x61, 0x0A, 0x74, 0x73,
+ 0x99, 0x5E, 0xBD, 0xB3, 0x10, 0xD9, 0xC7, 0x7C, 0x58, 0x24, 0xF5, 0x9F, 0xFA, 0x13, 0x35, 0x83,
+ 0x1A, 0x14, 0x13, 0x7B, 0x3B, 0xB6, 0xF5, 0x16, 0xB2, 0x75, 0xC2, 0x9E, 0x41, 0x83, 0xC5, 0x68,
+ 0x8C, 0xDF, 0xFC, 0xC1, 0x2E, 0xAC, 0xFC, 0x08, 0x1C, 0xE5, 0x2D, 0x15, 0x0D, 0xB8, 0xE2, 0x3F,
+ 0xD7, 0xA1, 0x46, 0x9E, 0xCB, 0x46, 0x4A, 0x4A, 0x71, 0x88, 0x4E, 0x61, 0x0F, 0x82, 0x34, 0xF0,
+ 0xC5, 0xEA, 0xD0, 0x08, 0x9A, 0xCF, 0xAE, 0x93, 0xEB, 0x69, 0x06, 0x2D, 0x96, 0x1F, 0x96, 0x70,
+ 0xDE, 0x1A, 0x87, 0xA0, 0x24, 0x7E, 0x1F, 0x8E, 0x9C, 0xDB, 0x77, 0xC1, 0x95, 0xDC, 0xDE, 0x9E,
+ 0xE7, 0xEE, 0x85, 0xD9, 0xB4, 0xEC, 0xD5, 0x2A, 0xDF, 0xF7, 0xCD, 0xA6, 0x2B, 0x81, 0xFA, 0xE6,
+ 0x10, 0xB1, 0x3B, 0x03, 0x23, 0xE0, 0xBD, 0xA1, 0xA4, 0x7F, 0x89, 0x69, 0x55, 0x78, 0x14, 0xB1,
+ 0x86, 0x07, 0x6E, 0xB0, 0xB2, 0xB3, 0x96, 0xFD, 0xA0, 0x03, 0x00, 0xC1, 0xF5, 0x60, 0xAA, 0x62,
+ 0xD4, 0xB2, 0xC7, 0xA3, 0x9E, 0x25, 0xF5, 0xF5, 0xB3, 0x85, 0x1D, 0xD2, 0x47, 0xDB, 0xF3, 0x1E,
+ 0x70, 0x85, 0xAC, 0x30, 0x02, 0x87, 0xF4, 0xEB, 0xB8, 0x99, 0xFB, 0x65, 0xAA, 0x56, 0x3F, 0xDC,
+ 0x5C, 0x52, 0x2C, 0x2A, 0xDE, 0x23, 0xEA, 0xE7, 0xD0, 0x20, 0x9C, 0xF3, 0x9A, 0xA9, 0x16, 0x4C,
+ 0xCE, 0x29, 0x87, 0x08, 0x52, 0xA4, 0x5D, 0x3A, 0x4C, 0xC6, 0x2C, 0x13, 0x16, 0x94, 0x3E, 0x14,
+ 0x5B, 0x50, 0x92, 0x34, 0xC2, 0x64, 0x7A, 0x95, 0x89, 0x5C, 0xCA, 0x82, 0xF8, 0x59, 0x7B, 0x27,
+ 0xAA, 0x0F, 0x64, 0x45, 0xBB, 0xFA, 0x61, 0x30, 0x30, 0x57, 0x6E, 0x3A, 0x69, 0x1A, 0x8F, 0x3E,
+ 0xB7, 0x63, 0xCB, 0x86, 0xF6, 0xE2, 0xC6, 0xDF, 0xFB, 0xE5, 0xB7, 0xEA, 0x3B, 0xF5, 0x28, 0x31,
+ 0x6C, 0x44, 0x54, 0xD3, 0xEC, 0x37, 0x77, 0xB9, 0xF7, 0x08, 0xF1, 0x05, 0xDA, 0x16, 0xB8, 0x95,
+ 0x69, 0x5E, 0x84, 0x49, 0x31, 0xC5, 0xEC, 0x06, 0x30, 0x82, 0x52, 0xC2, 0x46, 0xB2, 0xE3, 0x47,
+ 0xE6, 0x60, 0x12, 0x1C, 0x96, 0xDC, 0xBB, 0x08, 0x60, 0x4A, 0xC3, 0x01, 0x4D, 0xBC, 0x1A, 0x4E,
+ 0xF8, 0x3C, 0x06, 0x66, 0xF0, 0x78, 0xB9, 0x6D, 0x04, 0x66, 0x60, 0xDF, 0x7E, 0x5F, 0x2C, 0x07,
+ 0x2A, 0x5A, 0x4F, 0x13, 0x59, 0x40, 0x26, 0x6F, 0xC6, 0x4A, 0x37, 0xE9, 0x5E, 0x58, 0x41, 0xEF,
+ 0xCD, 0xCE, 0x89, 0xAD, 0xAB, 0x72, 0xEF, 0x16, 0x8B, 0x7D, 0x66, 0x1A, 0x98, 0xFC, 0x8B, 0xC2,
+ 0xF7, 0xFD, 0xC3, 0xF9, 0x51, 0xCF, 0x26, 0x06, 0xC6, 0x28, 0x2C, 0x2E, 0x8D, 0x53, 0xBE, 0xD8,
+ 0xA7, 0x26, 0xC3, 0xD6, 0xD8, 0x05, 0xCD, 0x19, 0xCC, 0xA3, 0x23, 0x14, 0x74, 0xC2, 0x97, 0x01,
+ 0x1C, 0x0B, 0x96, 0x22, 0xE2, 0x94, 0x23, 0xD8, 0xC2, 0x1B, 0xF7, 0x03, 0xB5, 0x1E, 0x35, 0x2C,
+ 0x9A, 0x9B, 0xCC, 0x7A, 0x1F, 0x04, 0x52, 0x26, 0x69, 0xD7, 0x6A, 0x21, 0xEA, 0xA8, 0x3A, 0x62,
+ 0x51, 0xA2, 0x02, 0xB2, 0x37, 0x13, 0xC0, 0x57, 0xCC, 0x1D, 0xC4, 0xFF, 0xE6, 0x90, 0xC1, 0x86,
+ 0x20, 0x5B, 0x03, 0xED, 0x6F, 0x32, 0x77, 0x9A, 0x86, 0xB1, 0x1C, 0x89, 0xFB, 0x9B, 0x2B, 0xF4,
+ 0x86, 0xE9, 0xB9, 0xF0, 0x39, 0xF9, 0x85, 0x51, 0x0C, 0x62, 0x95, 0x01, 0x28, 0xD7, 0x6F, 0xB7,
+ 0xBF, 0xC7, 0x2F, 0x2F, 0xF8, 0xAC, 0x31, 0xD1, 0xF8, 0x5D, 0x37, 0xDC, 0xBE, 0x98, 0x2D, 0x76,
+ 0xC4, 0x9C, 0x20, 0xDA, 0xB6, 0xF3, 0xC3, 0xC0, 0x31, 0x14, 0xBF, 0x2B, 0x87, 0x00, 0x66, 0x4A,
+ 0xE2, 0x50, 0x49, 0x84, 0x1E, 0x97, 0x85, 0xB8, 0xED, 0x33, 0x2B, 0xF8, 0x59, 0xC9, 0x03, 0x3F,
+ 0x5A, 0x28, 0xA7, 0xB8, 0xFB, 0x9F, 0x2E, 0x44, 0xFA, 0x2E, 0x6D, 0xFF, 0x40, 0x9E, 0x21, 0xE4,
+ 0x05, 0xB6, 0x31, 0x76, 0xAE, 0xDB, 0x76, 0x96, 0x88, 0x4D, 0x96, 0xCE, 0x1E, 0xD4, 0x22, 0x91,
+ 0xE4, 0xA8, 0x91, 0x5B, 0xED, 0xA4, 0x03, 0x10, 0x06, 0x8C, 0x24, 0xE4, 0xC4, 0x80, 0x16, 0x4D,
+ 0x50, 0xAF, 0xC1, 0x64, 0x4A, 0xA4, 0xB9, 0x79, 0xE3, 0x37, 0x38, 0x7D, 0x8A, 0x85, 0x90, 0xB7,
+ 0x1C, 0x7D, 0x24, 0x26, 0x7F, 0x5F, 0x0C, 0x9D, 0xB3, 0x2D, 0x4D, 0xB0, 0xEE, 0xAC, 0x95, 0x8F,
+ 0x2E, 0x5A, 0xA2, 0x78, 0x7D, 0x0D, 0xDA, 0x99, 0x47, 0x93, 0x13, 0xF9, 0x0C, 0xFF, 0x5E, 0x71,
+ 0x99, 0x8D, 0xE3, 0x21, 0x03, 0x44, 0xF7, 0x4D, 0x61, 0xD0, 0x1D, 0x47, 0xCB, 0x3D, 0x57, 0x4D,
+ 0x43, 0x3C, 0x01, 0xBB, 0x33, 0xC2, 0x04, 0x91, 0x66, 0xC9, 0xA1, 0xF2, 0x18, 0x47, 0x0D, 0x60,
+ 0x61, 0x9F, 0xA7, 0x27, 0x99, 0xB5, 0x27, 0x88, 0x60, 0x2B, 0x8D, 0x3C, 0x8F, 0xD5, 0x53, 0xDD,
+ 0x64, 0xC5, 0x14, 0xB3, 0x77, 0x5C, 0xDE, 0xA9, 0x91, 0x2E, 0x23, 0x83, 0x24, 0xE3, 0xE6, 0x38,
+ 0xC5, 0xCB, 0x9B, 0x4E, 0xC4, 0xEE, 0x3D, 0x7D, 0x58, 0x6C, 0x60, 0x16, 0x97, 0xBC, 0xF6, 0x47,
+ 0x77, 0x83, 0xCE, 0xF1, 0xA9, 0x8F, 0xDA, 0xFF, 0xB3, 0xE4, 0x52, 0x50, 0x67, 0xBA, 0x13, 0x2A,
+ 0xAB, 0xB4, 0x32, 0xC0, 0x4C, 0xAE, 0xBC, 0x92, 0x3C, 0x65, 0x97, 0xA4, 0xD8, 0x10, 0xDF, 0x60,
+ 0x95, 0xCA, 0x74, 0x17, 0x3F, 0x8A, 0xC5, 0x2A, 0x9F, 0xAF, 0xDB, 0xA4, 0x3C, 0x77, 0x01, 0xA6,
+ 0x02, 0x66, 0x0C, 0x15, 0x0F, 0x00, 0x90, 0xBD, 0x9B, 0x77, 0x53, 0xFD, 0x93, 0x44, 0x6F, 0x86,
+ 0x50, 0x54, 0x11, 0x40, 0xBE, 0x72, 0xD2, 0xE5, 0x4B, 0xA4, 0x13, 0x88, 0x0D, 0xAA, 0x87, 0xFB,
+ 0xED, 0x6E, 0x66, 0x59, 0xFB, 0xB8, 0xA0, 0xFE, 0xD1, 0x08, 0x27, 0x07, 0xC4, 0x31, 0x31, 0x8C,
+ 0x6F, 0xE2, 0x0B, 0x23, 0x95, 0x96, 0xF6, 0x3B, 0xD9, 0xD4, 0xB6, 0x5D, 0x84, 0xC2, 0xC4, 0x23,
+ 0xE9, 0xF2, 0xB6, 0x96, 0x9E, 0xD0, 0x4A, 0xE2, 0x2D, 0xAB, 0xBB, 0xB0, 0xAA, 0xEC, 0xFE, 0x67,
+ 0x3A, 0xF9, 0x1A, 0xA8, 0x30, 0xDA, 0x9A, 0x17, 0xD5, 0x46, 0xCC, 0xBA, 0xF7, 0xDA, 0x8E, 0x54,
+ 0x49, 0x58, 0xBE, 0x9C, 0x3B, 0x7E, 0x4E, 0xE4, 0x06, 0x8E, 0x32, 0xB4, 0x7A, 0xEA, 0xF8, 0x40,
+ 0x78, 0xD4, 0x62, 0xBD, 0xAC, 0xA7, 0x9F, 0x0B, 0x27, 0xC4, 0x90, 0xA1, 0xDF, 0x15, 0x64, 0xBA,
+ 0xEC, 0xCB, 0x69, 0xF7, 0xBF, 0xE6, 0x0D, 0x89, 0x6E, 0x5D, 0x62, 0x5D, 0xEA, 0x04, 0x37, 0x1B,
+ 0x40, 0x04, 0x37, 0x3B, 0xD0, 0xC6, 0xE0, 0xFC, 0x63, 0xA6, 0xA1, 0xC8, 0xAB, 0x45, 0xA4, 0xFD,
+ 0x05, 0xFA, 0x57, 0x01, 0x5F, 0x34, 0x76, 0x0B, 0xCF, 0xB0, 0xD3, 0xFD, 0xED, 0x66, 0xAC, 0xFB,
+ 0x63, 0x89, 0x53, 0x46, 0x61, 0xFF, 0x22, 0x64, 0xEB, 0x20, 0x60, 0x02, 0x0B, 0x78, 0xA4, 0xEC,
+ 0xF9, 0x1D, 0x34, 0xAB, 0x98, 0x33, 0xB7, 0x76, 0x4D, 0xDA, 0x4C, 0x33, 0x57, 0xD6, 0x23, 0x84,
+ 0x25, 0x76, 0x4A, 0x0B, 0xDD, 0xC5, 0xCD, 0x8B, 0xFF, 0xB8, 0x22, 0x37, 0x16, 0xAB, 0xCE, 0xDD,
+ 0x92, 0xDB, 0xD1, 0x12, 0xB3, 0x52, 0xD0, 0xE5, 0x4E, 0xBE, 0x69, 0xA8, 0xDF, 0x2F, 0xAF, 0x22,
+ 0x29, 0xD0, 0x28, 0xD3, 0x80, 0xA1, 0x39, 0x57, 0x88, 0x17, 0xBA, 0x63, 0x75, 0xD7, 0xB9, 0x05,
+ 0xBC, 0x4E, 0x60, 0x02, 0xAC, 0x84, 0x96, 0xD9, 0x23, 0x1E, 0xE3, 0xDA, 0xD6, 0x74, 0xC2, 0xCD,
+ 0xA4, 0x22, 0x65, 0x82, 0x50, 0x10, 0xFE, 0x76, 0xF5, 0xE7, 0x61, 0x0D, 0x86, 0xD9, 0x8D, 0x56,
+ 0x10, 0x43, 0x9C, 0xFE, 0x05, 0x3A, 0x51, 0x93, 0x81, 0x74, 0xD2, 0x11, 0x10, 0x82, 0xFC, 0x4C,
+ 0xA1, 0x83, 0x64, 0x21, 0x4B, 0xEB, 0xA9, 0x8E, 0x9A, 0xB8, 0xAB, 0x95, 0x15, 0x96, 0x9D, 0x49,
+ 0x9D, 0xFE, 0xEC, 0xC8, 0xC3, 0x6B, 0xBB, 0x4C, 0x8E, 0x75, 0xBB, 0x8C, 0x42, 0x76, 0x18, 0x8E,
+ 0x6F, 0xE0, 0xD6, 0x7C, 0x19, 0xDA, 0x08, 0xD7, 0xE1, 0x73, 0x6C, 0x18, 0x1B, 0x90, 0xCF, 0x6E,
+ 0x18, 0xE4, 0x61, 0xC7, 0x1B, 0xE3, 0x93, 0x22, 0x80, 0xB0, 0xE6, 0x66, 0xA0, 0xF7, 0x06, 0xA9,
+ 0x1E, 0xD8, 0x62, 0xC5, 0xE3, 0x52, 0x59, 0xF1, 0x71, 0x2A, 0x3C, 0xC0, 0xBC, 0x37, 0xF4, 0x51,
+ 0x8C, 0x81, 0xB4, 0x65, 0x95, 0x4A, 0x9D, 0xB5, 0xDF, 0x59, 0x2A, 0x06, 0xA6, 0xB1, 0x05, 0xCE,
+ 0xF3, 0x24, 0x7A, 0x59, 0x37, 0x76, 0x79, 0xAB, 0x84, 0x23, 0xF9, 0x5C, 0xFD, 0x48, 0xA3, 0xED,
+ 0x75, 0xB8, 0x58, 0x2F, 0x8A, 0xE7, 0xAD, 0x71, 0x94, 0x62, 0x27, 0x1C, 0xAC, 0x5F, 0xE3, 0x92,
+ 0x12, 0x6F, 0xAE, 0xAC, 0x12, 0xDA, 0xA9, 0x02, 0x45, 0xD7, 0x62, 0x53, 0xE0, 0xB8, 0xB9, 0xA8,
+ 0x02, 0xD7, 0xED, 0xA9, 0x26, 0x8C, 0x8F, 0x82, 0x78, 0x93, 0x8D, 0x1E, 0x8F, 0x8D, 0xEC, 0x89,
+ 0xBA, 0x37, 0x6A, 0x35, 0x21, 0x61, 0xD9, 0xE1, 0x52, 0x95, 0x46, 0xD5, 0x3A, 0xDF, 0x8B, 0xBD,
+ 0x9F, 0x36, 0x71, 0x95, 0x09, 0x28, 0x88, 0xB1, 0xF0, 0x70, 0xC2, 0x01, 0xA1, 0x4E, 0x0A, 0xF8,
+ 0xF2, 0x25, 0x1C, 0x60, 0x3C, 0xA3, 0xA0, 0xFB, 0x5C, 0x3E, 0xF4, 0x11, 0xCC, 0x54, 0xDA, 0xD7,
+ 0x80, 0x80, 0xCC, 0xC2, 0xB0, 0x81, 0xDF, 0xC8, 0x1C, 0x96, 0x01, 0x95, 0x17, 0x4E, 0x01, 0x7E,
+ 0x76, 0xF4, 0x1C, 0x61, 0x98, 0x58, 0x2A, 0xBD, 0x04, 0x7E, 0x14, 0x8A, 0x88, 0x77, 0xB6, 0xAD,
+ 0x05, 0x54, 0xC7, 0xDA, 0xDD, 0x08, 0xBA, 0x5C, 0x9F, 0xC8, 0x3C, 0x87, 0x24, 0xB5, 0xA0, 0x53,
+ 0xC7, 0xBD, 0x92, 0x77, 0x5F, 0xE8, 0x22, 0x34, 0x27, 0x98, 0x10, 0xD7, 0x4B, 0x76, 0x77, 0x26,
+ 0x2D, 0xD0, 0x24, 0x03, 0x8E, 0x15, 0x57, 0xF2, 0xC6, 0xED, 0x39, 0xB7, 0xAD, 0xE9, 0xFA, 0x14,
+ 0xED, 0xCF, 0x50, 0x9E, 0x8D, 0xAC, 0x87, 0x4B, 0x26, 0x28, 0xE4, 0x02, 0xBE, 0x24, 0x6A, 0x39,
+ 0x17, 0xBE, 0x9B, 0x79, 0xB7, 0x7E, 0xDF, 0xA6, 0x6E, 0x7B, 0x52, 0xE6, 0x1C, 0xD2, 0xAD, 0xCE,
+ 0x30, 0xB9, 0x91, 0xE7, 0x64, 0x8B, 0xBD, 0x1E, 0x8E, 0x40, 0xE3, 0x69, 0xA6, 0xD4, 0xB2, 0x18,
+ 0x42, 0x53, 0x6C, 0xE6, 0x1C, 0x69, 0xF9, 0x26, 0x84, 0x4E, 0x6F, 0x16, 0xD5, 0x39, 0xB5, 0x4C,
+ 0x86, 0xC9, 0x0D, 0x07, 0x6D, 0x25, 0x61, 0x9E, 0x7D, 0xDA, 0xB7, 0x13, 0x73, 0x7B, 0xC6, 0xF9,
+ 0xF8, 0x25, 0x9D, 0x44, 0xA6, 0x70, 0xFE, 0x5F, 0xC0, 0xFA, 0x64, 0xEE, 0x85, 0x6D, 0xA5, 0x0C,
+ 0x28, 0x68, 0x8C, 0x17, 0xCE, 0x3E, 0x38, 0x86, 0x83, 0x24, 0x97, 0xA3, 0xC2, 0x54, 0xF9, 0x3C,
+ 0xE7, 0x3A, 0xE8, 0xBC, 0x6D, 0xB8, 0x17, 0x7D, 0xF0, 0x6C, 0xEF, 0xFB, 0xBB, 0xC9, 0xD7, 0x5B,
+ 0xBF, 0xBB, 0x99, 0x83, 0x94, 0x29, 0xE9, 0x9F, 0xFC, 0x6D, 0xD7, 0xA8, 0x6C, 0x62, 0x42, 0x18,
+ 0x95, 0x2D, 0x44, 0xFF, 0xB4, 0x48, 0x30, 0x88, 0x29, 0x25, 0x41, 0x83, 0x0F, 0xAE, 0x9D, 0xE3,
+ 0xEC, 0xB2, 0x18, 0x0F, 0xBF, 0x4F, 0x11, 0x1F, 0xDA, 0xF2, 0xEC, 0x54, 0xE3, 0xCF, 0xE9, 0xAD,
+ 0x4A, 0x7E, 0xF0, 0xDE, 0xD4, 0x65, 0x21, 0x6F, 0x3A, 0xA8, 0x2E, 0xD5, 0x02, 0x39, 0x11, 0x4C,
+ 0xA5, 0x0A, 0xF1, 0xE4, 0x04, 0xFE, 0xC7, 0xFA, 0xE2, 0x2B, 0x74, 0xD3, 0xBD, 0xB2, 0x8D, 0xAB,
+ 0x18, 0x6B, 0x22, 0x3B, 0x79, 0x67, 0x88, 0x0F, 0x05, 0xB2, 0xA5, 0x26, 0x9B, 0x5A, 0x4E, 0x96,
+ 0xBE, 0xE4, 0x60, 0x9F, 0xD5, 0x8C, 0x0F, 0x81, 0x12, 0xEE, 0x5E, 0xAA, 0x63, 0x10, 0x0C, 0x87,
+ 0x42, 0x73, 0xA7, 0x16, 0x97, 0x7D, 0x8A, 0x3E, 0x6C, 0xAC, 0xB8, 0xAF, 0x70, 0xC2, 0xCA, 0x95,
+ 0xD5, 0x01, 0x9A, 0x3B, 0xB0, 0x36, 0xBF, 0xEE, 0xF9, 0x7D, 0x0B, 0xA1, 0x21, 0xA6, 0x6D, 0x85,
+ 0x12, 0xB1, 0xCF, 0x14, 0xE8, 0xCC, 0xFC, 0xC3, 0xA2, 0x1A, 0x09, 0x28, 0x48, 0xEB, 0xA8, 0xB2,
+ 0x8B, 0x4D, 0x17, 0xCD, 0x5C, 0x47, 0x70, 0xB9, 0x82, 0xB0, 0xFF, 0xEA, 0xE8, 0x3F, 0x64, 0xDB,
+ 0x9A, 0x0E, 0xFC, 0xED, 0x1D, 0xD2, 0xDE, 0x03, 0x92, 0x91, 0x17, 0xF1, 0x6F, 0x38, 0x14, 0xEC,
+ 0x79, 0x14, 0xCF, 0xA0, 0x2B, 0x63, 0x65, 0x84, 0x28, 0xD3, 0xB8, 0x77, 0x4C, 0x0B, 0x55, 0x4D,
+ 0xF5, 0x89, 0xEF, 0xE7, 0x41, 0xC1, 0x5F, 0x18, 0xAE, 0x06, 0x7F, 0xA9, 0x37, 0x84, 0x34, 0x6F,
+ 0x7C, 0xC3, 0x9B, 0x96, 0x68, 0x88, 0x91, 0x99, 0x35, 0x2B, 0xFF, 0x62, 0xD8, 0xC5, 0xE0, 0x4D,
+ 0x40, 0x79, 0x1D, 0x18, 0x30, 0x58, 0x4B, 0xF9, 0x48, 0xA7, 0x27, 0x02, 0xF5, 0x67, 0xB3, 0x17,
+ 0x4C, 0x22, 0x46, 0x2B, 0x39, 0x20, 0x79, 0x22, 0xE9, 0x25, 0x13, 0x1D, 0x28, 0x20, 0x3E, 0xDA,
+ 0x49, 0x53, 0xA6, 0x3D, 0x7F, 0x70, 0x7B, 0xA6, 0x75, 0xA9, 0x45, 0xEB, 0x3B, 0x8F, 0xFE, 0x36,
+ 0xAD, 0xBA, 0xBE, 0x5B, 0x5A, 0x5B, 0x9E, 0x2A, 0xEA, 0x28, 0xFE, 0xD5, 0x2D, 0x4A, 0x89, 0x7B,
+ 0x6C, 0xBE, 0xF6, 0xEF, 0x19, 0xCD, 0xA1, 0x90, 0xD1, 0x44, 0x10, 0x58, 0x58, 0xD8, 0x39, 0x53,
+ 0x13, 0xA9, 0xBF, 0x02, 0xBC, 0x7A, 0xD3, 0xBC, 0xD1, 0x61, 0xA4, 0xCC, 0x64, 0x0C, 0xF3, 0x51,
+ 0x7C, 0x8B, 0x03, 0x67, 0xBC, 0xA4, 0x0C, 0x20, 0x5C, 0xD5, 0xF1, 0xCA, 0xF3, 0x7B, 0x93, 0x5D,
+ 0x1D, 0x5B, 0x2C, 0xF2, 0x92, 0x3D, 0xF5, 0x0B, 0x90, 0x4C, 0x0C, 0xB6, 0x1C, 0x4D, 0x8D, 0x15,
+ 0x9C, 0x9B, 0x46, 0xDC, 0xC0, 0x7D, 0x01, 0x92, 0x2B, 0x7D, 0xED, 0xCA, 0x27, 0xF3, 0xA2, 0x0F,
+ 0x46, 0x62, 0x09, 0xEA, 0x4B, 0xB1, 0x70, 0x6C, 0x24, 0x96, 0x93, 0xFB, 0xA5, 0x95, 0xD6, 0xF6,
+ 0xDD, 0x04, 0x39, 0x05, 0x58, 0x5C, 0xAC, 0xE2, 0x12, 0xAC, 0x9C, 0x7F, 0x69, 0xBB, 0x0D, 0xD1,
+ 0xD8, 0xE7, 0x26, 0x6D, 0x32, 0xCF, 0xB7, 0x12, 0xC5, 0x21, 0x49, 0x64, 0xCC, 0x31, 0x72, 0x33,
+ 0x8E, 0x2F, 0xC5, 0x9F, 0x4C, 0x92, 0x5E, 0xDB, 0x03, 0x8F, 0x1F, 0x2A, 0xBB, 0xA6, 0x9C, 0xA0,
+ 0x1F, 0xC2, 0x89, 0xB1, 0xA6, 0x70, 0x32, 0x17, 0x74, 0x35, 0x14, 0xE2, 0xF8, 0x83, 0x9D, 0x1E,
+ 0x04, 0xD7, 0x05, 0x34, 0x8E, 0xAE, 0xA8, 0x0A, 0x34, 0x74, 0xA7, 0x42, 0x1B, 0x1F, 0x90, 0x31,
+ 0xA7, 0x9A, 0xFA, 0xC7, 0xD3, 0x6C, 0x45, 0xBA, 0x49, 0x3C, 0x4E, 0xBA, 0x85, 0xFC, 0x0B, 0x8A,
+ 0x89, 0xEF, 0x6A, 0xD2, 0x88, 0xF1, 0xA9, 0xA4, 0x55, 0x54, 0xA0, 0x38, 0x4D, 0xEC, 0x1B, 0x9D,
+ 0x70, 0x7F, 0x98, 0x9E, 0xE0, 0x7E, 0xC0, 0x4F, 0xD3, 0xA5, 0xC5, 0x78, 0x86, 0xDD, 0x92, 0xB5,
+ 0x8A, 0xA5, 0xFB, 0x75, 0x64, 0x06, 0x66, 0xAF, 0x06, 0xF2, 0xEF, 0x7C, 0x82, 0x61, 0xE3, 0x81,
+ 0x64, 0xBC, 0x53, 0x03, 0x8B, 0x62, 0x61, 0xE7, 0xFD, 0x75, 0x3A, 0x63, 0x9C, 0x03, 0x84, 0x00,
+ 0xA0, 0x90, 0x27, 0xAA, 0xF3, 0xA7, 0xF8, 0xB4, 0xB5, 0xF5, 0xC7, 0x22, 0xDE, 0x35, 0x95, 0x3A,
+ 0x35, 0xE6, 0x6D, 0x89, 0x58, 0x0D, 0xBC, 0xC2, 0xC6, 0x97, 0xB1, 0xD4, 0xA6, 0xF0, 0x65, 0x66,
+ 0x7F, 0x19, 0xAF, 0x50, 0x88, 0xB9, 0x58, 0x8C, 0xC2, 0xED, 0x6E, 0x4A, 0xF8, 0xB3, 0xC7, 0x06,
+ 0x1A, 0xCF, 0x92, 0xC4, 0x98, 0x43, 0x27, 0x0D, 0xA2, 0x01, 0x5B, 0x85, 0x98, 0x8C, 0x9C, 0x5E,
+ 0x82, 0x19, 0xA8, 0x4E, 0xA8, 0x60, 0xB1, 0xEE, 0x14, 0x73, 0xC7, 0x70, 0xA9, 0x6E, 0x2A, 0x39,
+ 0x4F, 0xF6, 0x4C, 0x77, 0x1F, 0xB3, 0x7A, 0x4B, 0xAB, 0xA8, 0x14, 0x8D, 0xF2, 0xC5, 0xBC, 0xE2,
+ 0xF1, 0x7E, 0xB8, 0xC3, 0x6B, 0xA2, 0xF5, 0x61, 0x79, 0x93, 0x98, 0xBB, 0x13, 0x5F, 0x7F, 0x62,
+ 0xAE, 0x74, 0xC6, 0xF8, 0x23, 0x4F, 0xA6, 0x41, 0x0D, 0x23, 0xF6, 0x3F, 0xF5, 0x23, 0xD9, 0xE4,
+ 0xCC, 0x87, 0xA5, 0x3E, 0xF8, 0xCC, 0xBC, 0x4F, 0x8F, 0xC8, 0x5C, 0xC8, 0x7D, 0xC1, 0xC4, 0x23,
+ 0x66, 0x62, 0xA5, 0x75, 0xC7, 0x44, 0x15, 0x84, 0xC3, 0xFC, 0x16, 0x81, 0x7F, 0xE5, 0x0C, 0xDA,
+ 0xAC, 0xD8, 0x53, 0x71, 0x5D, 0xBE, 0x91, 0xB8, 0xFC, 0x3B, 0x8F, 0x88, 0x2D, 0x67, 0xA4, 0x1D,
+ 0x9F, 0xFB, 0x12, 0xD7, 0x1D, 0xF0, 0x6C, 0x2F, 0x2D, 0xA3, 0x36, 0x97, 0x1A, 0xA5, 0x5D, 0xE7,
+ 0x18, 0x21, 0x31, 0xFB, 0xAB, 0x1E, 0x75, 0x41, 0x70, 0x4C, 0xC4, 0xBB, 0x01, 0x7B, 0x72, 0x51,
+ 0xAE, 0x0B, 0xB3, 0x59, 0x6D, 0xA4, 0x1F, 0xCB, 0x69, 0x7C, 0x72, 0x28, 0xF6, 0x85, 0xC2, 0xA1,
+ 0x88, 0x4A, 0x82, 0xEA, 0xCF, 0xBA, 0x87, 0xB7, 0x13, 0x5B, 0xD0, 0xFC, 0x5E, 0x77, 0x4F, 0x3D,
+ 0x92, 0x9E, 0x3F, 0xB0, 0xE0, 0xDC, 0x9B, 0xB8, 0x67, 0x13, 0xCE, 0x5D, 0x2F, 0xE8, 0x96, 0xF6,
+ 0x18, 0x24, 0x52, 0x87, 0x6E, 0x46, 0x51, 0x80, 0x37, 0x56, 0xE2, 0xE2, 0x3D, 0x33, 0x82, 0x31,
+ 0xEF, 0x0E, 0xA2, 0xB2, 0x56, 0xF9, 0x3F, 0xBA, 0x22, 0x26, 0x96, 0x3E, 0x3D, 0xE6, 0x35, 0x8E,
+ 0x24, 0x19, 0x7D, 0x0E, 0x0B, 0x10, 0x4C, 0xFE, 0x74, 0x59, 0x32, 0x9C, 0x65, 0xA7, 0xB1, 0xEF,
+ 0x08, 0xF8, 0x07, 0x1C, 0x11, 0x52, 0xC0, 0x8F, 0xE3, 0x93, 0x9E, 0x53, 0x23, 0x13, 0xA6, 0x3E,
+ 0xB3, 0xB1, 0x20, 0x24, 0xB6, 0xE1, 0x22, 0xD1, 0xED, 0x36, 0xD3, 0x5C, 0x18, 0xC4, 0xE4, 0x09,
+ 0x7F, 0x60, 0x45, 0x9D, 0xCE, 0xAE, 0xDF, 0xE2, 0xD4, 0xC6, 0xBA, 0x53, 0x6B, 0x97, 0xAD, 0x2B,
+ 0x60, 0x54, 0x60, 0x22, 0x3C, 0x4C, 0x25, 0x2C, 0x87, 0xF9, 0x64, 0x51, 0x60, 0x2E, 0xE1, 0x90,
+ 0xAE, 0xCC, 0x70, 0xC1, 0xCA, 0x62, 0x07, 0xEF, 0x63, 0x40, 0x80, 0x7B, 0xC2, 0x35, 0x56, 0xC6,
+ 0xB8, 0x12, 0x0E, 0x34, 0xF4, 0x54, 0x28, 0x53, 0x52, 0xD4, 0x4F, 0x0F, 0x98, 0x78, 0x74, 0x9A,
+ 0x4A, 0x1E, 0x77, 0x31, 0x4D, 0xAB, 0x7D, 0xDD, 0x07, 0x4E, 0x57, 0x24, 0xAE, 0x3F, 0xF1, 0x30,
+ 0x19, 0xA8, 0x2E, 0x66, 0xB1, 0x4D, 0x30, 0x5B, 0x28, 0xB4, 0x9F, 0x48, 0xFF, 0x59, 0x19, 0xED,
+ 0xA1, 0x47, 0x5F, 0xBF, 0xC0, 0x6C, 0x50, 0xCA, 0x7C, 0xF3, 0x01, 0x40, 0xAE, 0xD2, 0x06, 0x29,
+ 0x68, 0xAF, 0xDA, 0xD5, 0x42, 0x5B, 0x75, 0xA3, 0xD0, 0xC1, 0x95, 0x6D, 0xB5, 0xB5, 0x1C, 0x63,
+ 0x7D, 0x3F, 0x8F, 0x37, 0x84, 0x67, 0x69, 0xF9, 0xF4, 0x17, 0x03, 0xAB, 0xD8, 0x79, 0x0B, 0x8F,
+ 0xB8, 0x78, 0x6C, 0x7B, 0xE6, 0x43, 0xA4, 0x87, 0x39, 0x3E, 0x57, 0xC6, 0x69, 0x13, 0x41, 0x8A,
+ 0x14, 0x53, 0xBD, 0x1B, 0x44, 0x51, 0x96, 0x87, 0x4A, 0xEB, 0xD4, 0xCB, 0xE1, 0x65, 0x4A, 0x2F,
+ 0xF6, 0xAC, 0x8A, 0x58, 0x94, 0x87, 0xC0, 0xB8, 0x19, 0x7F, 0x88, 0xC2, 0xDE, 0x9A, 0x8E, 0x57,
+ 0xD7, 0xD5, 0xDB, 0x92, 0x8C, 0x16, 0xB7, 0x85, 0x93, 0xE1, 0x7E, 0x16, 0x80, 0x23, 0x2B, 0x5C,
+ 0x83, 0x63, 0xB0, 0xDD, 0x82, 0xDB, 0x21, 0x17, 0x22, 0x51, 0x35, 0xE3, 0x22, 0x36, 0x2B, 0xDA,
+ 0x5E, 0xE5, 0x48, 0xEA, 0xC5, 0x23, 0x05, 0x8E, 0xD1, 0xFF, 0xE6, 0x81, 0xC5, 0x0B, 0xE1, 0x06,
+ 0x0E, 0xD0, 0x2C, 0xA6, 0x43, 0xF3, 0x89, 0x5A, 0x67, 0xBD, 0x33, 0xE6, 0xC8, 0x5E, 0xAC, 0x83,
+ 0xB5, 0xDC, 0x0E, 0x98, 0xAB, 0x32, 0x5A, 0x25, 0xFD, 0xE4, 0x77, 0x48, 0x11, 0xE6, 0x81, 0x22,
+ 0x26, 0x2C, 0x95, 0x3E, 0xDB, 0x5E, 0x74, 0x6C, 0x5E, 0x3B, 0x58, 0x09, 0x89, 0x3F, 0x4A, 0xB8,
+ 0xAF, 0x53, 0xE2, 0x45, 0x3B, 0x63, 0xB5, 0xEE, 0x15, 0xDF, 0x0B, 0x3E, 0x29, 0xF1, 0xAF, 0x54,
+ 0x69, 0xB2, 0x89, 0xF3, 0x42, 0x92, 0x14, 0xF0, 0xC0, 0xC5, 0x25, 0x7F, 0xDF, 0x42, 0xDE, 0xC1,
+ 0x29, 0x60, 0x1A, 0x62, 0xFB, 0x0C, 0xF8, 0xC6, 0x57, 0x8B, 0x1E, 0x82, 0x06, 0x35, 0xA9, 0x06,
+ 0x41, 0xAC, 0x76, 0x7E, 0x8C, 0x84, 0xE2, 0xF9, 0x18, 0x69, 0xC4, 0xD2, 0xB7, 0xB1, 0xBE, 0xDB,
+ 0x83, 0x92, 0xA8, 0x7F, 0x32, 0xC7, 0xF4, 0x08, 0xE0, 0x26, 0xBE, 0x2D, 0x6B, 0x76, 0x9D, 0x68,
+ 0xE3, 0x4B, 0xC9, 0x1A, 0x0A, 0xE4, 0x77, 0x19, 0xB8, 0xB2, 0xBE, 0x46, 0x2A, 0x3C, 0x76, 0xB7,
+ 0x54, 0x6F, 0x41, 0x59, 0x21, 0x7A, 0xA6, 0x44, 0xCE, 0x74, 0xA9, 0xD4, 0x13, 0x47, 0xD1, 0x55,
+ 0xA0, 0xF0, 0x85, 0x20, 0x80, 0xDF, 0x4E, 0x7D, 0xF4, 0xB2, 0xBE, 0x75, 0x9A, 0xA2, 0x10, 0xC2,
+ 0xFD, 0xB1, 0xB9, 0x8E, 0x14, 0x80, 0xB6, 0x5B, 0x8A, 0x6A, 0x81, 0x37, 0x8C, 0x03, 0x51, 0x85,
+ 0x25, 0xD7, 0x85, 0x6A, 0xC8, 0x0A, 0x1F, 0x24, 0xB6, 0x2C, 0xB0, 0x1A, 0x20, 0x23, 0xCB, 0xB5,
+ 0xF8, 0x19, 0x88, 0x63, 0x67, 0xB7, 0xCD, 0x5B, 0x4F, 0x3C, 0xAA, 0xE6, 0x90, 0xCC, 0x6A, 0xDD,
+ 0xE0, 0x51, 0x29, 0x22, 0xFF, 0x17, 0x53, 0x62, 0x40, 0xF4, 0xB6, 0x5F, 0x55, 0x65, 0x67, 0x79,
+ 0x5B, 0x98, 0xA3, 0x58, 0x35, 0xB2, 0x21, 0xDB, 0x0C, 0x6C, 0x20, 0x07, 0x3A, 0x58, 0xE5, 0x96,
+ 0x7F, 0xB9, 0x1F, 0x31, 0x7A, 0x8A, 0x64, 0xA8, 0x06, 0xAA, 0x56, 0x55, 0x2D, 0x0B, 0x8B, 0x71,
+ 0x78, 0x8B, 0x9F, 0xC1, 0x12, 0x54, 0x00, 0x5E, 0x2E, 0x76, 0x98, 0x99, 0x77, 0xE3, 0x4D, 0x08,
+ 0x47, 0xC2, 0xF1, 0xFB, 0xF9, 0xE1, 0x8D, 0x40, 0x71, 0x67, 0xF9, 0x15, 0x34, 0xED, 0x10, 0x63,
+ 0x63, 0xA2, 0x2A, 0x59, 0x0B, 0x3E, 0xA2, 0xB6, 0xC2, 0x03, 0x19, 0x8B, 0x7C, 0x76, 0x17, 0xEF,
+ 0x6B, 0xE3, 0x1F, 0xBF, 0x32, 0xDC, 0xF4, 0x2E, 0x69, 0x15, 0x54, 0x40, 0x78, 0x97, 0x13, 0x2D,
+ 0xB5, 0x7D, 0x18, 0x91, 0x40, 0x84, 0x8F, 0x92, 0x44, 0x32, 0x42, 0x9F, 0xD1, 0x2D, 0xEA, 0x82,
+ 0x48, 0x39, 0x49, 0x19, 0x07, 0xC6, 0x32, 0x9F, 0xD5, 0x87, 0x80, 0x92, 0x78, 0xDA, 0x9A, 0x93,
+ 0x90, 0x71, 0xDD, 0xC4, 0x6D, 0xC3, 0x74, 0xA6, 0xC9, 0x88, 0x98, 0xFF, 0x8A, 0x81, 0x50, 0xAC,
+ 0x73, 0x49, 0x0A, 0x75, 0x27, 0x02, 0xAF, 0x81, 0xB8, 0xAD, 0x83, 0xA9, 0x08, 0x29, 0xF0, 0x78,
+ 0x4A, 0x32, 0xDB, 0x10, 0xA4, 0x5E, 0xFA, 0x3B, 0x49, 0xBD, 0xA5, 0xE1, 0xE6, 0x0B, 0xDB, 0x6F,
+ 0x31, 0x18, 0xDC, 0xA7, 0x63, 0xD0, 0xBA, 0xC7, 0xA3, 0x0A, 0x88, 0x76, 0xA8, 0x6C, 0x4B, 0xBE,
+ 0x3A, 0xD6, 0x81, 0x20, 0xEF, 0xD4, 0x36, 0x4C, 0x2E, 0xBD, 0x22, 0x56, 0x5E, 0xE9, 0xBB, 0x25,
+ 0x75, 0x54, 0x33, 0xF6, 0x1B, 0x7F, 0xD8, 0x95, 0x49, 0x9B, 0xB1, 0x30, 0x3E, 0x6F, 0x17, 0x91,
+ 0x42, 0x82, 0x42, 0x81, 0x16, 0x56, 0xCF, 0x2D, 0xC2, 0x34, 0x6C, 0x38, 0xA0, 0x42, 0x14, 0x7A,
+ 0x13, 0x9D, 0x38, 0xC1, 0x6D, 0x3A, 0x3D, 0x0E, 0x24, 0x2C, 0x23, 0xE3, 0xBC, 0x36, 0x2A, 0x97,
+ 0x05, 0x9E, 0x31, 0x9A, 0xF2, 0x88, 0x84, 0xA2, 0x28, 0xB8, 0xB3, 0x40, 0x3E, 0xE8, 0x5F, 0x44,
+ 0x32, 0x7E, 0xD7, 0x64, 0xFE, 0x37, 0x51, 0x32, 0xD1, 0x59, 0x4E, 0xB8, 0x98, 0xC4, 0x87, 0x50,
+ 0xB0, 0x0C, 0xAD, 0xE8, 0x98, 0x20, 0xA2, 0xAA, 0xFC, 0x94, 0xCF, 0x87, 0xFB, 0x60, 0xDB, 0xBF,
+ 0x93, 0x7E, 0xBD, 0x5F, 0x13, 0x6C, 0xC9, 0x06, 0x34, 0xD5, 0x8A, 0xED, 0x5D, 0xAC, 0x77, 0xC9,
+ 0x84, 0xD5, 0x05, 0x61, 0x71, 0x4E, 0x69, 0xE1, 0xC6, 0xFD, 0x12, 0x3F, 0x37, 0x3F, 0xEE, 0x1D,
+ 0x93, 0x6E, 0xF3, 0x32, 0x18, 0x26, 0x87, 0x2A, 0x7C, 0x0F, 0x75, 0x1A, 0x06, 0x61, 0x76, 0x22,
+ 0x18, 0x39, 0x24, 0x49, 0xA7, 0xF7, 0x81, 0x51, 0x1E, 0x8F, 0x86, 0x76, 0xE3, 0xF2, 0xF0, 0xCF,
+ 0x8B, 0xB1, 0x5E, 0xFA, 0xA7, 0xF3, 0x0F, 0x63, 0x6B, 0x4D, 0x0B, 0x71, 0x3A, 0xAB, 0x60, 0x76,
+ 0x01, 0xA5, 0x28, 0x4D, 0xB4, 0xBF, 0xDB, 0x8E, 0x2B, 0xE1, 0xD6, 0xE6, 0xC8, 0x8F, 0xE6, 0x79,
+ 0xD6, 0x19, 0xD9, 0x3A, 0x6F, 0x0C, 0xDC, 0xC0, 0x31, 0x61, 0x70, 0x21, 0xE4, 0xFA, 0x43, 0x43,
+ 0x03, 0xFC, 0x88, 0xA8, 0x77, 0xCA, 0xE6, 0x79, 0x59, 0x84, 0x5D, 0x2B, 0x0A, 0xB7, 0x13, 0x1B,
+ 0x2C, 0xEC, 0xDD, 0x8A, 0x26, 0xE9, 0xB3, 0x69, 0x4F, 0x72, 0xCB, 0x82, 0x2E, 0x54, 0x00, 0xD1,
+ 0x19, 0xA5, 0x0F, 0xB2, 0x5F, 0xCA, 0x3C, 0xB6, 0x5F, 0x8B, 0xC8, 0xD4, 0x21, 0xCF, 0x26, 0x83,
+ 0x5A, 0xD2, 0xCA, 0xFF, 0x26, 0x46, 0x5E, 0xE8, 0x2C, 0x0F, 0xA7, 0xBA, 0x8E, 0xCD, 0xBB, 0xB0,
+ 0x70, 0x78, 0xA2, 0xF4, 0x8F, 0x9D, 0x0F, 0x23, 0x29, 0xF4, 0xBC, 0xFC, 0x54, 0x22, 0x00, 0x7B,
+ 0x88, 0x0F, 0x87, 0x08, 0xF2, 0x37, 0x3E, 0x07, 0x4E, 0xEF, 0xF3, 0x4F, 0x96, 0x7B, 0xB3, 0xA4,
+ 0x1D, 0x45, 0x3D, 0x88, 0x5D, 0xC2, 0xA8, 0xFA, 0x71, 0xBE, 0xA6, 0x1F, 0x7E, 0x77, 0xD5, 0x48,
+ 0x23, 0x73, 0x1C, 0x62, 0xF5, 0x98, 0x8E, 0xB7, 0x67, 0xB1, 0xC8, 0xFA, 0xD7, 0xCB, 0x08, 0x0A,
+ 0x64, 0x57, 0x93, 0x7E, 0x8E, 0xF2, 0x20, 0xAA, 0xB5, 0x06, 0x8D, 0x12, 0xE2, 0xB8, 0x4D, 0xFC,
+ 0xC8, 0x23, 0xAB, 0x61, 0x05, 0xE4, 0x46, 0x87, 0x15, 0x25, 0x23, 0x43, 0x15, 0x32, 0x63, 0x9E,
+ 0x79, 0xFA, 0xBE, 0x10, 0x2B, 0xA3, 0x49, 0xA0, 0x80, 0xB0, 0x3F, 0x50, 0x68, 0xF5, 0xC0, 0x7C,
+ 0x55, 0xA2, 0x58, 0x92, 0xD4, 0xF3, 0xA0, 0xEE, 0x83, 0x33, 0x71, 0xE6, 0xAB, 0x77, 0x44, 0x25,
+ 0x5D, 0xBF, 0x57, 0x91, 0x25, 0x14, 0x0C, 0x5D, 0x07, 0xA0, 0x8F, 0x82, 0x9C, 0xA8, 0x33, 0x05,
+ 0x25, 0x5F, 0x6B, 0x20, 0xB1, 0x92, 0xDC, 0x4E, 0xDA, 0x6D, 0xC4, 0x85, 0xE7, 0xDE, 0x00, 0xAD,
+ 0x0E, 0x45, 0x9A, 0x3E, 0xBF, 0x1E, 0x7B, 0xF1, 0x94, 0x11, 0x77, 0xCE, 0xE2, 0xF0, 0x7B, 0x9A,
+ 0x85, 0x46, 0x98, 0x27, 0x44, 0xCC, 0xC7, 0x3F, 0x2D, 0x6F, 0xE2, 0xD3, 0xDF, 0x6E, 0x6D, 0x74,
+ 0xFD, 0xC0, 0xEF, 0x8C, 0xA3, 0x71, 0xEA, 0xA4, 0x56, 0x59, 0x57, 0x23, 0x78, 0x87, 0x16, 0x8C,
+ 0x1E, 0x63, 0x9C, 0xE2, 0xA7, 0x28, 0x2A, 0x64, 0xC0, 0x97, 0x34, 0xB0, 0xD5, 0x78, 0x4C, 0xC3,
+ 0xB2, 0x5D, 0x9B, 0x89, 0x3F, 0xD3, 0x7E, 0xD2, 0x8A, 0x78, 0x8C, 0x1A, 0x82, 0xB2, 0xA5, 0xFD,
+ 0x37, 0xE6, 0x64, 0x32, 0xF0, 0xC9, 0xDE, 0xAF, 0xA6, 0xBD, 0xB9, 0xDD, 0xE1, 0xF6, 0x2D, 0xC1,
+ 0x17, 0x15, 0xF1, 0x73, 0xA4, 0x4C, 0x65, 0x11, 0x92, 0xDC, 0x61, 0xFD, 0x0C, 0x60, 0x49, 0x43,
+ 0x54, 0xAC, 0xC9, 0xD7, 0xD5, 0x85, 0x09, 0xD4, 0x57, 0x74, 0x18, 0xD6, 0x53, 0xEB, 0x26, 0xAE,
+ 0x13, 0xCE, 0x0C, 0x6F, 0x7C, 0x11, 0x90, 0x02, 0xB9, 0x46, 0xB8, 0xEC, 0x25, 0x31, 0xE2, 0xBA,
+ 0xD4, 0xE4, 0x19, 0x1F, 0xF8, 0xB9, 0x6D, 0xA6, 0x7A, 0xE8, 0x03, 0x9A, 0x94, 0x9F, 0x26, 0x3B,
+ 0xE0, 0x1A, 0x32, 0xAD, 0x73, 0x3C, 0xB7, 0xE4, 0x32, 0x6F, 0x51, 0x3B, 0x3D, 0x83, 0x86, 0xD7,
+ 0x62, 0x6D, 0xF8, 0xDF, 0x5C, 0xB2, 0x59, 0x92, 0xAE, 0x52, 0xA7, 0xFE, 0xA9, 0x9B, 0x0F, 0xD8,
+ 0x5C, 0xCA, 0x50, 0xC3, 0xD7, 0x7C, 0x8E, 0x80, 0x1E, 0xCE, 0xC9, 0x8E, 0x6B, 0x7A, 0x4F, 0x1B,
+ 0x3A, 0x1E, 0x91, 0x18, 0x4C, 0x01, 0x50, 0x47, 0x54, 0x65, 0xF2, 0x72, 0xA1, 0x83, 0xE2, 0x86,
+ 0x9B, 0x93, 0x07, 0x75, 0xE4, 0x33, 0x47, 0xB5, 0xBD, 0x42, 0xB2, 0x30, 0x6B, 0x69, 0x1F, 0xE9,
+ 0xB3, 0x58, 0x91, 0x95, 0x7B, 0xED, 0xC3, 0xF2, 0x46, 0x28, 0xB5, 0x18, 0x21, 0x27, 0x57, 0xF2,
+ 0x39, 0xE6, 0x8A, 0x28, 0xA7, 0x7D, 0xFB, 0x01, 0xF2, 0x7B, 0x56, 0x5A, 0xC4, 0x85, 0x5A, 0x41,
+ 0x96, 0xF7, 0xF7, 0xC5, 0x91, 0xA4, 0x89, 0x9A, 0x09, 0x91, 0xBB, 0xE9, 0x29, 0x92, 0x7F, 0xE6,
+ 0x5B, 0x94, 0x8E, 0x93, 0x43, 0x90, 0x53, 0x0F, 0x10, 0xD7, 0x7E, 0x04, 0x28, 0xB7, 0xF7, 0x14,
+ 0xB3, 0x42, 0x5E, 0xDF, 0xB5, 0xAA, 0xE4, 0xF7, 0xED, 0x98, 0x43, 0xC6, 0x8C, 0xFA, 0x7C, 0xB0,
+ 0x71, 0xB1, 0xE9, 0x64, 0x65, 0xBB, 0x58, 0xCC, 0x73, 0x5F, 0x6A, 0x5A, 0x86, 0x2D, 0x2E, 0x89,
+ 0xB4, 0x5A, 0xFE, 0x16, 0x5B, 0x64, 0x56, 0x27, 0x38, 0xC2, 0x1D, 0x1C, 0xF0, 0xC5, 0x0B, 0x80,
+ 0x8D, 0x6F, 0x2E, 0x0C, 0x7B, 0x56, 0xEF, 0x23, 0xE5, 0xFC, 0xD2, 0x55, 0xF6, 0x9C, 0xF7, 0x5F,
+ 0xB5, 0xEC, 0xB7, 0xEE, 0xC4, 0xEC, 0xFE, 0xD6, 0xAA, 0xEC, 0x24, 0xB8, 0xB7, 0x98, 0x8D, 0x0B,
+ 0x12, 0x36, 0xAC, 0x5B, 0x3E, 0x87, 0x29, 0x21, 0x9C, 0xFD, 0x84, 0xFD, 0xF5, 0x10, 0xA4, 0xE8,
+ 0x1C, 0x4F, 0x16, 0x45, 0xBF, 0xC9, 0x18, 0x9F, 0xDE, 0xF1, 0x96, 0x64, 0x58, 0x61, 0xF1, 0x41,
+ 0x82, 0xE2, 0xDA, 0xA3, 0xE4, 0x86, 0x0F, 0xB7, 0xCA, 0x17, 0x17, 0x2A, 0x7D, 0xAC, 0x9F, 0xB3,
+ 0x8E, 0x65, 0x63, 0x80, 0x64, 0x8E, 0x6F, 0xDB, 0xD4, 0x05, 0x65, 0xEE, 0x13, 0x1C, 0xE6, 0x51,
+ 0x53, 0x01, 0xA1, 0xE2, 0xA1, 0x3E, 0x46, 0x82, 0xBB, 0x4A, 0x7E, 0xC1, 0x4A, 0x12, 0xBB, 0x56,
+ 0xA2, 0x2F, 0x81, 0xC0, 0x0F, 0x47, 0x7F, 0xA1, 0xD9, 0x8F, 0x21, 0xC5, 0x48, 0x34, 0xF0, 0x7F,
+ 0x07, 0xE8, 0xB4, 0x0C, 0x37, 0xEA, 0x4A, 0x76, 0x5E, 0x98, 0xA0, 0x87, 0x08, 0xC1, 0x51, 0x3D,
+ 0xED, 0xC6, 0xA2, 0x75, 0x90, 0xB4, 0x23, 0xFC, 0x3E, 0x36, 0x4A, 0x9A, 0xEA, 0x25, 0x1F, 0x62,
+ 0x41, 0x69, 0xCC, 0x8C, 0xB0, 0xB7, 0xAA, 0x6B, 0x67, 0xC9, 0x85, 0x7F, 0x92, 0xC0, 0x7A, 0x30,
+ 0x18, 0x35, 0xCD, 0xFD, 0x85, 0xC4, 0x70, 0x23, 0x75, 0x45, 0x67, 0x79, 0xAB, 0xFE, 0x83, 0x4B,
+ 0xC9, 0x09, 0x78, 0xF1, 0x7F, 0xFA, 0xCC, 0xF2, 0x0A, 0x03, 0x0E, 0x43, 0x9A, 0xD1, 0xBF, 0x53,
+ 0xA8, 0x1E, 0x0F, 0x75, 0xC9, 0x14, 0x54, 0x07, 0x6D, 0xCD, 0xC7, 0xB3, 0x5D, 0x14, 0x87, 0x29,
+ 0x0C, 0x43, 0xED, 0x91, 0xE3, 0x0A, 0xD0, 0x6F, 0xAE, 0x3B, 0xB5, 0xA8, 0x29, 0x3C, 0xA5, 0x5E,
+ 0x0A, 0x51, 0xB4, 0x7F, 0x3D, 0x15, 0xCC, 0x1A, 0x35, 0xFB, 0xA4, 0x70, 0xDC, 0x4B, 0x98, 0xD4,
+ 0xBF, 0x28, 0xE6, 0x29, 0x42, 0x60, 0x71, 0xA7, 0xAE, 0x02, 0xC0, 0xE4, 0xEE, 0x61, 0x48, 0x07,
+ 0x84, 0x87, 0xAD, 0x5E, 0x70, 0xA8, 0x03, 0x30, 0x81, 0xE3, 0xE3, 0x53, 0x28, 0xFC, 0x06, 0xF8,
+ 0x37, 0x19, 0x69, 0xA1, 0xD2, 0x7A, 0xDB, 0x91, 0xAD, 0xB2, 0x8E, 0x51, 0xE1, 0xC0, 0x0A, 0xEE,
+ 0x70, 0x3B, 0xB7, 0x37, 0x96, 0x07, 0xBC, 0x66, 0x3B, 0x10, 0x6F, 0x18, 0xCC, 0xA8, 0x8F, 0xDD,
+ 0x6C, 0x30, 0x18, 0xEF, 0x96, 0x09, 0xE5, 0x89, 0x47, 0x8E, 0xBA, 0x57, 0x8D, 0x8F, 0x63, 0x8A,
+ 0xAB, 0x30, 0xA0, 0x45, 0x1C, 0x4C, 0x0D, 0xB0, 0x72, 0x09, 0x0A, 0xC8, 0x56, 0xD8, 0x45, 0x71,
+ 0xD3, 0xB8, 0x03, 0xD3, 0xCD, 0x9E, 0x86, 0x53, 0xA5, 0xD5, 0x58, 0xA5, 0x03, 0xE3, 0xFC, 0x5E,
+ 0x1C, 0x63, 0x65, 0xE9, 0x70, 0x53, 0xF4, 0x99, 0x71, 0x7A, 0x76, 0x2C, 0x2C, 0x38, 0xBE, 0x5A,
+ 0x20, 0xFF, 0xC0, 0x25, 0x16, 0x46, 0xA8, 0x65, 0x9B, 0xE0, 0xB1, 0x10, 0x7D, 0xB2, 0x90, 0xBC,
+ 0xE4, 0xB5, 0x22, 0xC7, 0xD6, 0x8A, 0xBB, 0x19, 0x9F, 0xCD, 0x11, 0x62, 0x82, 0xFC, 0x8D, 0x36,
+ 0xE2, 0x08, 0xF0, 0xDD, 0x68, 0x60, 0x48, 0x09, 0x1F, 0xF0, 0xC5, 0x54, 0xE9, 0x47, 0x7D, 0x79,
+ 0xE6, 0xC4, 0xC1, 0xF1, 0xFF, 0x2D, 0x5C, 0xA3, 0xFD, 0xF2, 0xB1, 0xA7, 0x89, 0xB7, 0xB9, 0x7C,
+ 0x44, 0x28, 0xE5, 0x82, 0x36, 0x4D, 0x48, 0x34, 0x01, 0x5B, 0x43, 0x36, 0x2D, 0x05, 0x93, 0xEE,
+ 0xF5, 0x92, 0x73, 0xDF, 0xA6, 0xBA, 0x3D, 0x5B, 0x96, 0x49, 0x73, 0xDF, 0x70, 0x9B, 0x7A, 0x70,
+ 0x5C, 0x30, 0x14, 0xB8, 0xB7, 0x46, 0xE0, 0xD7, 0xFF, 0x5C, 0x8E, 0x27, 0x39, 0x0E, 0xEE, 0x99,
+ 0x2F, 0x08, 0x1E, 0x95, 0xD4, 0x70, 0xB0, 0xC4, 0x28, 0x83, 0x78, 0x92, 0x93, 0x46, 0xB9, 0xF9,
+ 0xFF, 0x8C, 0x16, 0xA9, 0x63, 0x71, 0xAF, 0xBD, 0x84, 0x1A, 0x25, 0xBE, 0xE8, 0xE3, 0xB2, 0x33,
+ 0x51, 0xB9, 0xB6, 0x0E, 0x12, 0xB8, 0xA7, 0x6E, 0x28, 0xBC, 0xA3, 0x66, 0x24, 0x49, 0x4D, 0x45,
+ 0xA4, 0x5C, 0xCD, 0x4D, 0x2E, 0x17, 0xFB, 0xC0, 0xB5, 0xA7, 0x55, 0x34, 0x08, 0xD7, 0xC7, 0x54,
+ 0x0A, 0xFE, 0xE6, 0x98, 0x85, 0x6D, 0xAF, 0x42, 0x79, 0xED, 0x0A, 0xFA, 0xCF, 0xD3, 0xE2, 0x7C,
+ 0xB8, 0x24, 0xA5, 0xE1, 0x01, 0xA5, 0x94, 0x55, 0x61, 0xA0, 0x49, 0x1B, 0x7C, 0x71, 0xA8, 0x96,
+ 0x5A, 0x4C, 0xF5, 0xC5, 0x1E, 0x8D, 0xD9, 0x2E, 0xBE, 0xC4, 0x13, 0x27, 0xD0, 0xC0, 0x67, 0xA7,
+ 0x77, 0x86, 0x61, 0xAE, 0x7E, 0x69, 0x53, 0xB4, 0x70, 0xC6, 0x1E, 0x62, 0x1A, 0x8B, 0xB3, 0x0A,
+ 0xC5, 0xDF, 0xF4, 0xFA, 0xEB, 0xC5, 0x50, 0x7E, 0xDE, 0xD5, 0x15, 0xB1, 0x2E, 0x09, 0x75, 0xD7,
+ 0x9E, 0xB1, 0x58, 0x76, 0x2F, 0xFE, 0x86, 0x0A, 0xC2, 0x10, 0x1D, 0x84, 0xDF, 0x94, 0x11, 0xD0,
+ 0x86, 0x06, 0xFA, 0x9E, 0x00, 0xF0, 0x27, 0x51, 0x00, 0x43, 0xAF, 0xEA, 0x13, 0x4E, 0xC8, 0x48,
+ 0x5A, 0x57, 0xDB, 0x5C, 0x20, 0xDC, 0xF3, 0x7D, 0x2B, 0x77, 0x35, 0x20, 0xBD, 0x17, 0x0C, 0x3A,
+ 0x2C, 0x3B, 0x58, 0x7D, 0x9D, 0x40, 0xA0, 0xDF, 0xD5, 0xBA, 0x84, 0xA2, 0x9E, 0x4C, 0x87, 0xA5,
+ 0xF9, 0xED, 0xEA, 0xEB, 0x98, 0x0D, 0x81, 0xD9, 0xCB, 0xE3, 0xD5, 0xA0, 0xF7, 0xFF, 0x2A, 0x28,
+ 0xE9, 0x6F, 0x08, 0xE4, 0xBA, 0x76, 0x16, 0x0A, 0xF5, 0x3C, 0x01, 0x11, 0xB3, 0xBA, 0x4C, 0x7E,
+ 0xC3, 0x1F, 0x0B, 0x91, 0x62, 0x82, 0xDD, 0x29, 0x7C, 0x60, 0x5F, 0x56, 0xE5, 0x48, 0x7D, 0xB8,
+ 0x4A, 0xC7, 0x1F, 0x7D, 0xD5, 0xB7, 0x17, 0x9F, 0x91, 0xDD, 0xE3, 0xE0, 0x04, 0x14, 0xF3, 0x4C,
+ 0xD2, 0xB3, 0xC3, 0xAC, 0x7F, 0x63, 0x67, 0xFA, 0x1B, 0x14, 0x0E, 0x2A, 0x8C, 0x82, 0xD8, 0x49,
+ 0x8B, 0x24, 0x4B, 0xF3, 0x21, 0x86, 0x06, 0x91, 0xC9, 0x81, 0xF9, 0x84, 0xC6, 0x2B, 0x12, 0xCF,
+ 0x95, 0x32, 0x7A, 0xFD, 0x9C, 0x1C, 0xFC, 0x3B, 0x3B, 0x06, 0xBA, 0x2C, 0x45, 0x88, 0xDA, 0x5B,
+ 0x5D, 0x90, 0xDC, 0x07, 0xBD, 0xEC, 0xAF, 0xB2, 0x06, 0x98, 0x05, 0xAC, 0x1D, 0x41, 0xA1, 0xD5,
+ 0x76, 0x9D, 0x7B, 0x59, 0x82, 0x9C, 0x46, 0x02, 0xF4, 0x03, 0xB4, 0xFB, 0x70, 0x48, 0x73, 0xB2,
+ 0x4C, 0x8B, 0xA6, 0xDB, 0x11, 0xC5, 0x7E, 0xFE, 0x23, 0x4E, 0xC2, 0x2B, 0x0F, 0x95, 0x51, 0x2A,
+ 0x3B, 0x46, 0x1C, 0xB7, 0xBF, 0x51, 0xF0, 0xA4, 0xF8, 0xAD, 0x16, 0x96, 0xAA, 0x6D, 0xBE, 0xFE,
+ 0x45, 0x46, 0xEF, 0x8B, 0x96, 0xED, 0xE1, 0xE5, 0xB5, 0xEF, 0x22, 0x8C, 0xBA, 0x3A, 0xB0, 0x2F,
+ 0x9A, 0x34, 0x16, 0x52, 0x56, 0x5A, 0x36, 0x8B, 0x50, 0x89, 0xBD, 0xC0, 0xFE, 0xAE, 0x2B, 0xBB,
+ 0x53, 0xAE, 0x76, 0x8D, 0xB6, 0x91, 0x9D, 0x32, 0x18, 0xF5, 0xD7, 0x1A, 0xE5, 0x04, 0x05, 0xFD,
+ 0xDC, 0x5B, 0x67, 0xBE, 0x34, 0x05, 0x03, 0x90, 0xD5, 0xBF, 0xAA, 0x35, 0x8D, 0xB7, 0x63, 0x76,
+ 0xC9, 0x98, 0x2B, 0x99, 0xD6, 0x5A, 0xB4, 0x39, 0x4A, 0xAA, 0xDF, 0xEC, 0x82, 0x83, 0xC6, 0x80,
+ 0xA1, 0x86, 0x74, 0xC8, 0x8E, 0x37, 0xAB, 0x7A, 0xC2, 0x35, 0x99, 0x62, 0xAD, 0x30, 0xD2, 0x4E,
+ 0x30, 0xA4, 0x3F, 0xC6, 0x16, 0x9C, 0xBF, 0xD5, 0x5C, 0x08, 0xF8, 0xF4, 0x35, 0x20, 0x86, 0xF4,
+ 0x0C, 0x12, 0x56, 0xD4, 0xDB, 0x73, 0xDB, 0x82, 0x30, 0x73, 0xD2, 0x60, 0xCF, 0xF7, 0xA8, 0xF6,
+ 0xC8, 0x71, 0xB2, 0x6E, 0xC3, 0x65, 0x05, 0x07, 0x6C, 0x9C, 0x3F, 0xD7, 0xC9, 0x6E, 0x09, 0xFF,
+ 0x9E, 0xF0, 0x68, 0xB6, 0xE0, 0xDB, 0x6A, 0x1F, 0xE9, 0xBC, 0x8C, 0xC1, 0xEB, 0xC5, 0x2A, 0x8B,
+ 0x99, 0x23, 0xFC, 0x35, 0xAF, 0xC1, 0x4A, 0xD8, 0x62, 0x28, 0x95, 0x4C, 0xD5, 0x93, 0x21, 0xBC,
+ 0x19, 0x52, 0xA0, 0x71, 0x3C, 0x2B, 0x3F, 0x88, 0x68, 0xA0, 0xE0, 0x16, 0x10, 0x85, 0xCA, 0xDB,
+ 0x45, 0x96, 0xBD, 0x44, 0xB3, 0x24, 0xE2, 0xCB, 0xE6, 0xE7, 0xC9, 0xDD, 0x7A, 0x78, 0x9B, 0x7C,
+ 0x1E, 0x28, 0x2B, 0xC2, 0x2B, 0x53, 0x12, 0xB2, 0xD7, 0xB8, 0x59, 0x41, 0x19, 0x3D, 0xF9, 0x6F,
+ 0x34, 0xDB, 0x76, 0x43, 0x8C, 0x21, 0x2A, 0xC2, 0xAB, 0x4B, 0x0D, 0xC5, 0x0A, 0x92, 0x41, 0xD2,
+ 0xD2, 0xEB, 0x40, 0x7C, 0x14, 0x5D, 0x73, 0x3D, 0x6C, 0x42, 0xAC, 0xF1, 0xC8, 0x37, 0xCD, 0xC3,
+ 0xC0, 0xDD, 0xC0, 0x42, 0x35, 0x6A, 0x99, 0xF3, 0x7F, 0x63, 0xE1, 0x17, 0xB5, 0x8F, 0xC3, 0x2C,
+ 0xF5, 0x67, 0x4A, 0x96, 0x25, 0xDD, 0xC9, 0x06, 0x3A, 0x86, 0x3C, 0x2B, 0x23, 0x04, 0xB0, 0x53,
+ 0x3C, 0x82, 0xDD, 0x7E, 0xAE, 0x1A, 0xF4, 0x76, 0x65, 0x57, 0xF1, 0x7F, 0xBC, 0x5C, 0xFC, 0xB0,
+ 0xBB, 0x04, 0x13, 0x9B, 0x81, 0x9C, 0x70, 0x87, 0xFE, 0x6C, 0xC2, 0x9B, 0x88, 0x83, 0x3C, 0x4D,
+ 0x43, 0x0B, 0x64, 0xE3, 0x8C, 0x79, 0x25, 0x5D, 0xF7, 0x20, 0xCF, 0xAB, 0x65, 0xC3, 0x9F, 0x17,
+ 0xDA, 0x5A, 0x6F, 0x02, 0x81, 0xEC, 0x8A, 0x20, 0x56, 0x09, 0x31, 0xE2, 0x0E, 0x80, 0x68, 0xE5,
+ 0xA7, 0xFF, 0x70, 0x92, 0x68, 0x09, 0x70, 0x93, 0x98, 0xD1, 0x73, 0xD4, 0x47, 0xA2, 0xD3, 0x91,
+ 0x00, 0xAB, 0xF0, 0x35, 0xD1, 0xBE, 0xB8, 0xC9, 0x9E, 0x82, 0x39, 0x17, 0x2E, 0xB7, 0x8B, 0x0C,
+ 0x7B, 0xAF, 0x84, 0x5C, 0xB5, 0x0A, 0xCE, 0x31, 0x30, 0xE7, 0x38, 0x06, 0xAA, 0x10, 0x48, 0x2C,
+ 0xA8, 0xE1, 0xBD, 0xBD, 0xEE, 0x3D, 0xDA, 0x11, 0xA0, 0x0C, 0x07, 0xFA, 0xD0, 0x5B, 0xA5, 0x91,
+ 0xE5, 0x1D, 0x54, 0x6A, 0xBF, 0x53, 0x56, 0x55, 0x11, 0xC9, 0x5C, 0x89, 0xFE, 0x72, 0x5A, 0xA7,
+ 0x15, 0x9C, 0xBB, 0x37, 0x4E, 0x18, 0x89, 0xED, 0xF2, 0x82, 0x83, 0xF1, 0x5B, 0x9D, 0x27, 0x3D,
+ 0xCF, 0xF3, 0x0B, 0x0C, 0xCB, 0x53, 0xF3, 0x13, 0xA8, 0xA1, 0x5A, 0x0E, 0xB2, 0x21, 0x8B, 0x16,
+ 0xD7, 0x5E, 0xAE, 0xD2, 0x7B, 0x3A, 0x2A, 0xCD, 0x23, 0x14, 0x0F, 0xE7, 0x0D, 0x81, 0x82, 0xF2,
+ 0x41, 0x8B, 0x77, 0x53, 0x16, 0xAE, 0xC7, 0xDF, 0xF7, 0xD1, 0x91, 0x8B, 0x73, 0xA5, 0x0E, 0x9F,
+ 0xC3, 0xBF, 0x2C, 0xC3, 0xE4, 0xB7, 0x60, 0x60, 0xF7, 0xCA, 0x95, 0x6D, 0xFA, 0x4F, 0x66, 0xC2,
+ 0x98, 0xA0, 0x72, 0xC9, 0x0C, 0x9E, 0x6B, 0xFD, 0x5D, 0x14, 0x8B, 0x9E, 0x7F, 0xA1, 0x20, 0x48,
+ 0x99, 0x09, 0xDC, 0xAA, 0xAB, 0xB4, 0x46, 0x10, 0xAB, 0x1B, 0x77, 0x98, 0x2F, 0x7D, 0xE0, 0xD4,
+ 0x18, 0x64, 0x4A, 0x5C, 0xBA, 0x23, 0x3C, 0x7E, 0x2F, 0x96, 0x13, 0xC6, 0x4D, 0x38, 0xED, 0xCE,
+ 0x4D, 0xB3, 0x02, 0x23, 0xAE, 0x9E, 0xD8, 0x8A, 0xC0, 0x17, 0x39, 0x91, 0x75, 0x33, 0x6A, 0xA9,
+ 0x75, 0x12, 0xE3, 0x65, 0x19, 0x30, 0x98, 0x00, 0x4D, 0x82, 0xDB, 0xA3, 0xA2, 0xE7, 0x11, 0x51,
+ 0x7A, 0xA1, 0xFE, 0xD2, 0x4E, 0xEA, 0xBB, 0xCD, 0xA1, 0x29, 0xB0, 0xB3, 0x63, 0x23, 0x54, 0x11,
+ 0x0B, 0xF3, 0xBD, 0x82, 0xA4, 0x60, 0xC2, 0xFE, 0xE9, 0x5C, 0xD7, 0xB5, 0xDA, 0x7D, 0x6C, 0x3D,
+ 0x57, 0xD1, 0xF9, 0x90, 0x03, 0x0B, 0xE8, 0xC1, 0x20, 0xEE, 0x46, 0x68, 0x18, 0x95, 0x66, 0x3C,
+ 0x01, 0x2A, 0xE8, 0x84, 0xC1, 0x26, 0x3B, 0x15, 0xBB, 0x20, 0x5E, 0x3B, 0x57, 0x0E, 0x59, 0xEA,
+ 0x1C, 0xD3, 0x6C, 0xC7, 0x35, 0xE7, 0x23, 0xFE, 0x40, 0x37, 0x84, 0x2D, 0x70, 0x0F, 0xE9, 0x2F,
+ 0xB2, 0x22, 0xEA, 0xB9, 0xB6, 0x93, 0xDC, 0x67, 0xE1, 0xFB, 0x0E, 0x34, 0x91, 0x35, 0x76, 0x52,
+ 0x03, 0x27, 0x79, 0x42, 0x55, 0x1D, 0x5B, 0x8D, 0xAA, 0x17, 0x5C, 0x64, 0x3D, 0x8D, 0xA1, 0x04,
+ 0xBE, 0x3E, 0x6D, 0x92, 0x6E, 0xE6, 0x2C, 0x0B, 0x6E, 0x9B, 0x8A, 0x5D, 0x18, 0x05, 0xB8, 0xE4,
+ 0x18, 0x6E, 0x9E, 0x90, 0x74, 0xD3, 0x1D, 0x33, 0x4D, 0x72, 0xF5, 0x99, 0xE3, 0x2B, 0x2A, 0x0C,
+ 0x11, 0x5C, 0x94, 0xB7, 0x66, 0xCC, 0xAC, 0xF1, 0x0D, 0x8D, 0x20, 0xC5, 0x75, 0x20, 0x4C, 0x0A,
+ 0xB8, 0xBA, 0xCD, 0x0F, 0xD9, 0xF1, 0x59, 0x6E, 0xC8, 0x63, 0x5C, 0x9E, 0xE5, 0xBB, 0x85, 0x93,
+ 0xFE, 0x1F, 0xD9, 0x8C, 0x89, 0xB4, 0x7E, 0xD8, 0xB5, 0xC6, 0x62, 0x03, 0xD1, 0xAB, 0x5F, 0xD2,
+ 0xB4, 0x47, 0xC0, 0xC5, 0xC9, 0x75, 0x14, 0x91, 0x37, 0xFE, 0x3B, 0x78, 0x1F, 0x56, 0x87, 0x13,
+ 0xF4, 0xCC, 0x3A, 0xBD, 0x2C, 0xC1, 0x61, 0xF5, 0xAB, 0x3A, 0xE8, 0x9C, 0x97, 0xCA, 0xAA, 0xA3,
+ 0x12, 0xC4, 0x70, 0x8F, 0x32, 0xDD, 0xEA, 0xE8, 0xF8, 0x8A, 0x03, 0x65, 0x89, 0x99, 0x53, 0x45,
+ 0x28, 0xF3, 0xA8, 0xF3, 0x14, 0x80, 0xB4, 0xD6, 0x44, 0xD4, 0x02, 0xEE, 0x9C, 0x58, 0x46, 0xC1,
+ 0x4F, 0xEE, 0xFA, 0xCD, 0x63, 0x4D, 0x87, 0xE6, 0x22, 0x9F, 0xF9, 0xDA, 0x77, 0xD0, 0x51, 0xAA,
+ 0x1F, 0x2A, 0x2F, 0x48, 0x66, 0x55, 0xE0, 0x2A, 0x5F, 0xEC, 0x12, 0xA6, 0x14, 0xAD, 0x7D, 0xDD,
+ 0xC2, 0x7B, 0x3E, 0xE9, 0x8F, 0x2C, 0xB8, 0x60, 0x7E, 0x03, 0x76, 0x28, 0x7C, 0x22, 0x18, 0x6B,
+ 0x53, 0x39, 0x21, 0x6A, 0xB2, 0x05, 0x75, 0x58, 0xB7, 0xB1, 0x49, 0x1B, 0x11, 0x1D, 0xD6, 0xFA,
+ 0xC8, 0x01, 0x77, 0x12, 0x16, 0x17, 0xB8, 0x71, 0xC2, 0x6F, 0x12, 0xE0, 0xFA, 0xBF, 0x7A, 0xB3,
+ 0xE3, 0xDB, 0xB6, 0x19, 0x78, 0xAF, 0x25, 0x18, 0x4F, 0x7A, 0x21, 0x63, 0xF6, 0x68, 0x33, 0xCC,
+ 0xD9, 0x12, 0x4A, 0x36, 0x73, 0x3D, 0x7C, 0xA4, 0x6E, 0x5E, 0xFD, 0x5E, 0x0D, 0x45, 0xDF, 0x68,
+ 0x66, 0xC6, 0x3F, 0x42, 0xEF, 0xD5, 0x0A, 0x7D, 0x41, 0x3E, 0x1B, 0x4E, 0x3F, 0x93, 0x4F, 0xAA,
+ 0x0B, 0xB4, 0x34, 0x67, 0xEC, 0xEF, 0x23, 0x6B, 0x87, 0x8A, 0xF9, 0x66, 0x48, 0x19, 0xF5, 0x92,
+ 0x57, 0xA8, 0x60, 0x53, 0xC3, 0x37, 0xF3, 0x61, 0x82, 0x42, 0xC3, 0x09, 0x95, 0xBE, 0xE9, 0x1F,
+ 0xBA, 0x1F, 0x01, 0xB6, 0x37, 0xC7, 0xD9, 0x65, 0xAF, 0x2D, 0xB4, 0x42, 0x22, 0xC0, 0x54, 0x1A,
+ 0x3B, 0x13, 0x07, 0x30, 0x94, 0x15, 0x01, 0x17, 0x21, 0x36, 0x3A, 0x4F, 0xC3, 0x76, 0xC4, 0xA9,
+ 0x64, 0x0D, 0xE0, 0x4F, 0x93, 0xCD, 0x5D, 0x7D, 0xD4, 0xB6, 0xDE, 0xAC, 0x9C, 0xB6, 0x79, 0x3B,
+ 0xCE, 0x49, 0x35, 0x21, 0xE2, 0x20, 0xC2, 0x36, 0x9E, 0xCF, 0x51, 0x4D, 0x1D, 0x41, 0x32, 0x05,
+ 0xB0, 0x45, 0x85, 0xEF, 0x68, 0x94, 0xE2, 0x56, 0x61, 0x7A, 0x08, 0xE7, 0x46, 0x3E, 0xBA, 0xEC,
+ 0x9E, 0x82, 0x17, 0x1B, 0xE4, 0xE1, 0x32, 0xCD, 0x9C, 0xF8, 0xC1, 0xE5, 0x1C, 0x9E, 0x84, 0xBB,
+ 0x20, 0x71, 0xF5, 0x6F, 0x0B, 0x55, 0x6F, 0x4C, 0x96, 0x28, 0x08, 0x6E, 0x5D, 0xF2, 0xFE, 0xF9,
+ 0xE2, 0xBB, 0xEF, 0x58, 0xFC, 0x34, 0xEF, 0xD6, 0xF5, 0xB2, 0x77, 0x5F, 0x62, 0x4F, 0x8F, 0x32,
+ 0xD7, 0xAD, 0x14, 0x07, 0xFC, 0xAB, 0x53, 0x06, 0xC9, 0x65, 0x8A, 0x0F, 0xDA, 0xDF, 0x4F, 0xA4,
+ 0x88, 0x45, 0xFC, 0x17, 0x74, 0x1C, 0xE0, 0x9F, 0xBC, 0x91, 0xF3, 0x7A, 0x9D, 0xE8, 0x92, 0xD6,
+ 0x3C, 0x8E, 0x71, 0x65, 0x34, 0x64, 0x4B, 0xAE, 0x41, 0x04, 0x37, 0x3E, 0xE3, 0x79, 0xA1, 0xD4,
+ 0x4F, 0x89, 0xE8, 0x3C, 0x1C, 0x36, 0x41, 0x66, 0x14, 0xA4, 0xCF, 0xC5, 0x38, 0x59, 0xE6, 0x8C,
+ 0x75, 0xE7, 0x6F, 0x3B, 0x20, 0x11, 0x41, 0x55, 0x28, 0x67, 0x12, 0xD5, 0x67, 0x81, 0xC5, 0x76,
+ 0x02, 0xC3, 0xC7, 0x03, 0x1C, 0xC0, 0x2E, 0xDC, 0x7E, 0xD9, 0xAD, 0x24, 0xE0, 0x7A, 0x07, 0x8D,
+ 0xC7, 0xE5, 0x2B, 0x27, 0x13, 0xAC, 0x76, 0x46, 0x93, 0x4B, 0x3B, 0x1C, 0xC7, 0xD2, 0x9E, 0xEF,
+ 0x32, 0xEA, 0x3A, 0x43, 0xDC, 0x79, 0xD6, 0xE8, 0x52, 0x89, 0xAB, 0xEE, 0x9F, 0x22, 0xAA, 0x02,
+ 0xD7, 0x08, 0xE2, 0x50, 0x94, 0x16, 0x09, 0x49, 0x5C, 0x70, 0x61, 0x97, 0xEA, 0x99, 0x42, 0xAC,
+ 0xFB, 0x97, 0xFA, 0x35, 0xA1, 0x80, 0xFD, 0x06, 0x44, 0xA3, 0x6F, 0xFC, 0x39, 0x7A, 0xA2, 0x37,
+ 0x87, 0x3B, 0x72, 0xC2, 0x7A, 0x2A, 0xBA, 0x54, 0x6B, 0xF9, 0xFA, 0x75, 0x46, 0xE6, 0x1B, 0x3C,
+ 0xE7, 0x21, 0xA0, 0xDE, 0xC1, 0x26, 0xC7, 0x3F, 0x8C, 0xA1, 0x8A, 0xC5, 0xBD, 0x7D, 0xC6, 0x70,
+ 0xF7, 0xB6, 0x6B, 0x84, 0xCB, 0x20, 0x4B, 0x34, 0x4D, 0x50, 0xA5, 0xD8, 0xF3, 0x50, 0xF2, 0xE7,
+ 0xE0, 0xE0, 0x32, 0x07, 0x5F, 0xF6, 0x86, 0x06, 0x9D, 0x31, 0x7A, 0xB0, 0x63, 0xB7, 0xB3, 0x04,
+ 0x5B, 0x31, 0xA6, 0x9B, 0x29, 0x27, 0x96, 0xB1, 0x5A, 0x41, 0x09, 0xE3, 0x13, 0x39, 0x8E, 0x0C,
+ 0x94, 0xFF, 0xD2, 0x2D, 0x8F, 0x91, 0x73, 0x43, 0xC7, 0xFA, 0x65, 0x56, 0x70, 0x94, 0x0B, 0x5F,
+ 0xA3, 0xD1, 0xCB, 0x4C, 0x95, 0x5F, 0x64, 0x8D, 0xD2, 0x7C, 0x68, 0xBA, 0x31, 0x0D, 0x1C, 0x55,
+ 0xB6, 0x2F, 0x96, 0xB7, 0xB1, 0x79, 0xDE, 0x50, 0xB5, 0x8D, 0x4C, 0xC4, 0xD5, 0x3A, 0xE2, 0x13,
+ 0x80, 0x37, 0x68, 0x51, 0xDA, 0x33, 0x70, 0x95, 0x49, 0x57, 0xB5, 0x3F, 0x3F, 0x2F, 0xDA, 0xC5,
+ 0xE3, 0x63, 0x95, 0x63, 0x29, 0x96, 0x4A, 0xED, 0xB5, 0x2F, 0x7D, 0xC2, 0xCC, 0x4C, 0x87, 0xDE,
+ 0x49, 0xE2, 0xCA, 0x46, 0x60, 0x38, 0x31, 0xB4, 0x65, 0x86, 0x3F, 0x91, 0x61, 0x8C, 0x11, 0x0F,
+ 0xAF, 0x6F, 0xED, 0xED, 0x4B, 0x9F, 0x32, 0xAB, 0x7A, 0xBB, 0x83, 0xCD, 0xE9, 0x36, 0x58, 0x7E,
+ 0x3D, 0xCD, 0xD1, 0x00, 0x41, 0x80, 0x41, 0x14, 0xD3, 0xF1, 0xEA, 0x24, 0xF2, 0xD7, 0x79, 0x71,
+ 0x71, 0x0B, 0x24, 0x5E, 0x2B, 0xA8, 0x15, 0xCA, 0x20, 0x35, 0xF5, 0x8B, 0xED, 0xC6, 0xD7, 0x7B,
+ 0xAB, 0xF5, 0x74, 0x7E, 0x55, 0xEE, 0xCC, 0x92, 0xF0, 0xBB, 0x0D, 0xE4, 0xF7, 0xD9, 0xD4, 0x74,
+ 0x89, 0x87, 0xF2, 0xE2, 0xAA, 0x73, 0xDF, 0xCD, 0x5C, 0xE1, 0x0D, 0xF1, 0xDA, 0xA9, 0x62, 0x33,
+ 0x20, 0x61, 0x5B, 0xC4, 0x17, 0x8A, 0xDA, 0xA3, 0xD1, 0xA7, 0xB1, 0x27, 0xA1, 0xD7, 0x41, 0x02,
+ 0x06, 0x4A, 0x18, 0xC7, 0xDE, 0x2B, 0xD2, 0xF9, 0xD2, 0x16, 0x43, 0x4B, 0x02, 0x0E, 0xD6, 0x2F,
+ 0x16, 0x28, 0xCA, 0x9C, 0x19, 0xAE, 0x27, 0x61, 0xC8, 0x09, 0xD6, 0xAE, 0x89, 0x90, 0x52, 0x04,
+ 0xC2, 0x17, 0x7D, 0x3D, 0x41, 0x18, 0x20, 0x70, 0xB4, 0xBA, 0x83, 0x51, 0xE1, 0xF0, 0x23, 0x7E,
+ 0x9B, 0x4B, 0x56, 0xC7, 0x9F, 0x3D, 0x0D, 0xE6, 0x92, 0xED, 0xC0, 0xAD, 0x46, 0xC3, 0x35, 0x94,
+ 0xFB, 0xDB, 0x3C, 0xB3, 0x95, 0x9C, 0xFD, 0xA2, 0x9E, 0x23, 0x49, 0xA6, 0xDC, 0xA0, 0x63, 0xC3,
+ 0x5D, 0x37, 0xF1, 0x9C, 0x57, 0xE7, 0x58, 0xD5, 0x28, 0xC4, 0x73, 0x2B, 0xE3, 0xBF, 0x14, 0xD3,
+ 0x83, 0xEC, 0x49, 0x03, 0x42, 0xD1, 0x3F, 0xE6, 0x22, 0xEE, 0xC5, 0x23, 0x50, 0x64, 0x5F, 0xA6,
+ 0x9F, 0x92, 0x5A, 0x69, 0xC5, 0x7D, 0x76, 0x81, 0xB9, 0x0F, 0x43, 0x24, 0x94, 0x20, 0xF1, 0x51,
+ 0xF7, 0x30, 0xF7, 0x6A, 0x3A, 0x73, 0xEF, 0x5B, 0x39, 0xD8, 0x75, 0x0F, 0x78, 0xFB, 0x7A, 0xFD,
+ 0xEB, 0x80, 0xE8, 0xF0, 0x98, 0x4C, 0xE2, 0xDE, 0xA9, 0x5F, 0x75, 0x36, 0x62, 0x3F, 0x7B, 0x66,
+ 0xF1, 0xA8, 0xA7, 0x55, 0xD4, 0x6C, 0x03, 0xE8, 0xFF, 0xD6, 0xBB, 0x50, 0x0E, 0x38, 0xFB, 0xD5,
+ 0xD9, 0xB2, 0x4B, 0xFD, 0xC5, 0x05, 0x08, 0x88, 0xBC, 0x90, 0x47, 0x15, 0xE1, 0x92, 0x04, 0x18,
+ 0x06, 0x4B, 0x13, 0x12, 0x12, 0xCE, 0xF6, 0xA4, 0x9A, 0xBC, 0x1B, 0x60, 0x9E, 0x49, 0xBA, 0xC5,
+ 0x56, 0x9D, 0x47, 0x21, 0x5F, 0xE5, 0x19, 0xFC, 0x71, 0xCB, 0x8D, 0x6F, 0x9E, 0x91, 0x18, 0x6F,
+ 0x6E, 0xF8, 0x07, 0xE9, 0x6C, 0xB3, 0x6B, 0x94, 0x2C, 0xCF, 0xAC, 0x5F, 0x1C, 0x1A, 0xA1, 0xD7,
+ 0x8F, 0x9A, 0x1B, 0x49, 0x28, 0x22, 0xEA, 0x52, 0xDE, 0x0D, 0xB5, 0xF9, 0x0E, 0x08, 0xA4, 0x78,
+ 0x3B, 0x7F, 0x31, 0x1C, 0x75, 0x91, 0x0A, 0xC4, 0x35, 0x68, 0x0D, 0xDF, 0x00, 0xEB, 0x31, 0x0C,
+ 0x84, 0x62, 0xEC, 0xAF, 0x82, 0xAD, 0x52, 0xA2, 0xE2, 0x1F, 0xFE, 0xAC, 0xBE, 0x4D, 0xFB, 0xCE,
+ 0x0C, 0x82, 0xE5, 0x4A, 0x4D, 0xD8, 0x98, 0x57, 0xFD, 0xE6, 0x83, 0x21, 0x95, 0x25, 0xF3, 0xAD,
+ 0x2E, 0xAD, 0x69, 0xB9, 0x4E, 0x1E, 0x4A, 0x29, 0xF0, 0x75, 0xB2, 0xE2, 0x05, 0x7A, 0x4E, 0xF2,
+ 0x7D, 0x1A, 0xFB, 0x03, 0xB4, 0xEE, 0xA2, 0x69, 0x44, 0x42, 0x5C, 0x96, 0xFB, 0xE9, 0xC7, 0x42,
+ 0x74, 0x7A, 0x2F, 0xDE, 0xCC, 0xA4, 0x5C, 0x29, 0xA9, 0x8C, 0xB6, 0x18, 0xBD, 0x0F, 0xB5, 0xB4,
+ 0x79, 0x63, 0x87, 0xAA, 0x60, 0xCA, 0xE9, 0x7C, 0x6A, 0xA9, 0x94, 0x0F, 0x7A, 0x5B, 0xEB, 0x4D,
+ 0x14, 0x27, 0xC5, 0x27, 0xDB, 0x98, 0x7A, 0xB4, 0x6A, 0x79, 0xCB, 0x27, 0xEB, 0x6E, 0x51, 0x9E,
+ 0x6C, 0x55, 0xFC, 0x40, 0xAF, 0xBF, 0x2F, 0x66, 0xED, 0xE1, 0xB0, 0x46, 0x29, 0xCE, 0x04, 0x92,
+ 0xF1, 0xF2, 0x9C, 0xA4, 0x9D, 0x0C, 0xFC, 0x85, 0x57, 0xC4, 0x1D, 0x85, 0x28, 0x8A, 0xFD, 0xA7,
+ 0xF1, 0x3E, 0x24, 0x10, 0x90, 0xBE, 0x97, 0xCE, 0x15, 0x78, 0x7C, 0x46, 0x13, 0xB2, 0x5E, 0x42,
+ 0x4D, 0x67, 0x5D, 0x1F, 0x71, 0x7A, 0xB0, 0xAD, 0xB8, 0xAA, 0x8E, 0xA2, 0x8E, 0x1E, 0x3F, 0xD1,
+ 0x7C, 0xE4, 0x66, 0xCA, 0x06, 0xD7, 0xC8, 0xDC, 0x9B, 0xC5, 0x87, 0x11, 0x99, 0x8D, 0xEF, 0xE9,
+ 0xDA, 0xB3, 0x2F, 0x20, 0x8D, 0x9F, 0xB0, 0x4B, 0xF8, 0xDE, 0x68, 0xC5, 0x88, 0xC2, 0x5D, 0x84,
+ 0xB9, 0xB5, 0x90, 0x7A, 0x41, 0x0C, 0x31, 0x33, 0x55, 0x9D, 0xD6, 0xBE, 0x86, 0x15, 0xA9, 0xE3,
+ 0xFD, 0xB0, 0xB9, 0x79, 0xF8, 0x5C, 0xF4, 0x4B, 0x49, 0x74, 0x27, 0x81, 0xC1, 0xEC, 0xB4, 0x2B,
+ 0x91, 0x7E, 0xF3, 0xC2, 0x9D, 0x62, 0x35, 0x49, 0xF4, 0xE3, 0x8E, 0x4D, 0xEE, 0x44, 0xB7, 0xE2,
+ 0x20, 0xB1, 0x38, 0xC5, 0x30, 0xFD, 0x01, 0x6C, 0xCC, 0x6E, 0x76, 0xF9, 0x6C, 0x27, 0xD1, 0x0F,
+ 0x67, 0x04, 0xCF, 0xF1, 0x00, 0xB5, 0x6A, 0xD4, 0xCD, 0x58, 0x76, 0xAF, 0x1C, 0xFF, 0x74, 0xD7,
+ 0xA7, 0x77, 0x45, 0xCD, 0x33, 0x4E, 0x45, 0xBD, 0xCC, 0x38, 0x5C, 0x6C, 0xF7, 0x7C, 0xF7, 0x2B,
+ 0xCF, 0x45, 0x2C, 0xC4, 0x73, 0xB1, 0x2D, 0x2B, 0xE6, 0x06, 0x0F, 0x4B, 0xAB, 0x48, 0x1E, 0xF2,
+ 0x58, 0x0C, 0x8B, 0x47, 0x4D, 0x81, 0x32, 0x23, 0x7F, 0x7D, 0x2F, 0xF4, 0x80, 0x43, 0x3E, 0x8A,
+ 0xDC, 0x5D, 0x1F, 0x27, 0xE6, 0xA2, 0xDC, 0xC8, 0xB6, 0xF7, 0x63, 0x0E, 0x6D, 0xEB, 0xE8, 0x16,
+ 0x52, 0x69, 0x97, 0xF2, 0x61, 0x7B, 0x2C, 0x8A, 0x15, 0xD8, 0xE1, 0xE9, 0x28, 0xFF, 0x54, 0x92,
+ 0xF3, 0xCB, 0x72, 0x72, 0xB5, 0x23, 0x48, 0xE9, 0x52, 0xA3, 0xC7, 0x3B, 0x1D, 0x05, 0x90, 0x26,
+ 0x10, 0xA4, 0x42, 0x9B, 0xA5, 0xAF, 0x7F, 0x99, 0x3B, 0x5A, 0x70, 0xA4, 0x6C, 0xF8, 0xB5, 0xC3,
+ 0x42, 0x46, 0x47, 0xEA, 0x62, 0xA0, 0x8F, 0x34, 0x5F, 0x5F, 0x0A, 0x88, 0xB9, 0x19, 0x47, 0xFD,
+ 0x94, 0x04, 0x05, 0x7C, 0x8B, 0x65, 0xC4, 0x1D, 0xD2, 0xFC, 0xDD, 0x0E, 0x3A, 0x92, 0x8B, 0xE0,
+ 0xCE, 0xBD, 0xF9, 0x1B, 0xFB, 0x91, 0xD3, 0x90, 0x80, 0x08, 0x6B, 0x94, 0x20, 0xCC, 0xC8, 0xC9,
+ 0xF9, 0x60, 0x28, 0x7D, 0x6F, 0xDA, 0x5E, 0x64, 0xE0, 0x1C, 0x5F, 0xE9, 0xB8, 0xC3, 0x33, 0x18,
+ 0xA5, 0x60, 0xE4, 0xE1, 0x45, 0x1B, 0xEE, 0x20, 0xFF, 0x40, 0x52, 0xFB, 0x3F, 0xD2, 0x03, 0x0A,
+ 0x71, 0xD2, 0xCE, 0xC5, 0x84, 0x98, 0x21, 0xE1, 0xF8, 0x13, 0xD6, 0x78, 0x21, 0x75, 0x3C, 0x22,
+ 0x1A, 0xCC, 0x67, 0x12, 0x9B, 0x31, 0x06, 0xB7, 0x5E, 0xE6, 0x4B, 0xC2, 0x7E, 0x12, 0xCA, 0x6D,
+ 0xD6, 0x95, 0x67, 0xDC, 0xF1, 0x7C, 0xC8, 0xAD, 0x95, 0x53, 0x25, 0x7B, 0x16, 0xD3, 0x0B, 0xE4,
+ 0xF4, 0x17, 0x86, 0xC6, 0xA1, 0x2B, 0x28, 0xA9, 0x02, 0x1D, 0x48, 0x14, 0x42, 0x0A, 0x76, 0x95,
+ 0x3D, 0xC4, 0x2D, 0x77, 0x5A, 0x67, 0x6F, 0xDB, 0x81, 0xA4, 0xA4, 0x74, 0x19, 0xA0, 0xFC, 0x2F,
+ 0x9D, 0x26, 0x4D, 0x44, 0x44, 0xDD, 0xAE, 0xCB, 0x85, 0xBC, 0x21, 0xBB, 0xFC, 0xDF, 0xDB, 0x54,
+ 0xAA, 0x21, 0x95, 0x0C, 0xFF, 0x2C, 0x17, 0x37, 0x5A, 0xFC, 0x4A, 0x39, 0x34, 0xED, 0xE4, 0x71,
+ 0x84, 0x5C, 0x28, 0xEB, 0x0A, 0x25, 0x16, 0xA4, 0xA1, 0x8B, 0x63, 0xB0, 0xFB, 0x26, 0xF3, 0xD1,
+ 0x37, 0x0E, 0x52, 0xF9, 0x77, 0x3D, 0xAA, 0x66, 0xC7, 0xB9, 0xED, 0x84, 0x88, 0xFE, 0xEF, 0x33,
+ 0x5A, 0x61, 0x87, 0x03, 0x2A, 0x83, 0xDB, 0x4C, 0x73, 0xBE, 0xF9, 0x6A, 0x04, 0x3F, 0xEC, 0x6E,
+ 0xCC, 0x5D, 0xA5, 0x8F, 0xA1, 0xCB, 0x53, 0x86, 0x80, 0xC4, 0x21, 0xBA, 0xC2, 0x2D, 0x65, 0xE7,
+ 0xE2, 0x35, 0x97, 0x2C, 0xA6, 0xE2, 0x09, 0x76, 0x10, 0xA2, 0xC0, 0x30, 0xDF, 0x9A, 0xDC, 0x38,
+ 0x06, 0x3D, 0x05, 0x26, 0x16, 0x4D, 0xA8, 0xA9, 0x1E, 0x07, 0x1D, 0x62, 0x6C, 0xA5, 0xCC, 0xEB,
+ 0x05, 0x21, 0x64, 0xD4, 0x3E, 0x4B, 0xB3, 0x96, 0x14, 0x75, 0xFC, 0x5C, 0xCA, 0xDB, 0x1F, 0xDC,
+ 0x41, 0x9D, 0x60, 0x05, 0xF8, 0x89, 0xC9, 0x7E, 0x3B, 0x74, 0x75, 0x49, 0x34, 0x3A, 0x74, 0x79,
+ 0xDF, 0x16, 0x3D, 0x6F, 0xA1, 0xF3, 0x26, 0x29, 0x61, 0x5F, 0xBB, 0xEB, 0x62, 0x42, 0x3A, 0x7F,
+ 0x2F, 0xC5, 0x19, 0xD6, 0x77, 0x9E, 0x1D, 0xF5, 0x15, 0x71, 0x6F, 0x74, 0x1E, 0xE5, 0xBA, 0x08,
+ 0x21, 0x07, 0x64, 0x9F, 0x78, 0x5A, 0x11, 0x20, 0xFB, 0x43, 0x4F, 0x4A, 0xFD, 0x6A, 0x2F, 0xB7,
+ 0x66, 0x7A, 0xA5, 0x27, 0xF7, 0x6F, 0x05, 0x85, 0xCC, 0xC2, 0xC5, 0xDE, 0x18, 0x43, 0xB9, 0x9F,
+ 0x84, 0xBA, 0x09, 0x1A, 0x0E, 0x7E, 0xBE, 0xBA, 0xE4, 0xD6, 0x1E, 0x9E, 0x83, 0x7D, 0x1D, 0xED,
+ 0xDE, 0x4D, 0x96, 0x91, 0x50, 0x2D, 0x54, 0x46, 0x98, 0xC5, 0xE2, 0xE6, 0xE7, 0x6F, 0xB4, 0x06,
+ 0xF0, 0x56, 0x4C, 0x2B, 0xB1, 0xEC, 0xC4, 0x98, 0x87, 0x76, 0x00, 0xF8, 0x47, 0x70, 0x4F, 0x13,
+ 0x2C, 0xDE, 0x79, 0x9B, 0xB5, 0x90, 0xFA, 0xC3, 0xAA, 0x0D, 0xB6, 0xCC, 0x37, 0xB2, 0x5D, 0xB7,
+ 0x8B, 0x19, 0x96, 0x20, 0xFF, 0x0C, 0x21, 0x23, 0x41, 0xA8, 0x15, 0x3F, 0x03, 0x01, 0x57, 0xA2,
+ 0x7F, 0xF1, 0xE6, 0x4B, 0x50, 0xC3, 0xD6, 0xF3, 0xEF, 0xE0, 0x7A, 0xEE, 0x76, 0xA0, 0x67, 0x22,
+ 0x09, 0x45, 0x91, 0x07, 0x87, 0x1E, 0xC6, 0x2A, 0x13, 0x45, 0x10, 0x0E, 0x72, 0x9E, 0xFB, 0xA0,
+ 0x9C, 0xA4, 0xA3, 0xE7, 0x17, 0xC5, 0x90, 0x30, 0x42, 0x87, 0x1B, 0x3A, 0xC0, 0xD9, 0xA7, 0x9A,
+ 0xEE, 0xDE, 0x42, 0xFE, 0x96, 0xD3, 0x7A, 0x3E, 0xBE, 0xAF, 0xE9, 0xCD, 0xEF, 0xA6, 0xD9, 0xC6,
+ 0x0E, 0x2C, 0xA9, 0xC1, 0x6B, 0x99, 0x11, 0xC2, 0x91, 0x45, 0x0B, 0xC4, 0xD0, 0xC3, 0xD7, 0xF9,
+ 0x0B, 0x9A, 0x1E, 0x2E, 0xC7, 0x01, 0x22, 0x6A, 0x75, 0x50, 0x89, 0x79, 0x07, 0x21, 0x8C, 0xF9,
+ 0xA6, 0x15, 0x95, 0xC0, 0xE3, 0xFC, 0x20, 0x65, 0x36, 0x2D, 0x5F, 0xAE, 0xFE, 0xCE, 0x97, 0x71,
+ 0xF5, 0x3A, 0xBD, 0xCB, 0xA1, 0x9F, 0x46, 0xA6, 0x3A, 0xA7, 0x7A, 0x26, 0xA2, 0xDE, 0x36, 0x19,
+ 0x15, 0xDE, 0x17, 0x7E, 0xD7, 0x5E, 0x4A, 0xEE, 0xE2, 0xC9, 0x53, 0x25, 0x77, 0xC3, 0x18, 0xBB,
+ 0xB4, 0xAA, 0x43, 0xFD, 0x5C, 0x21, 0x8A, 0x37, 0xDB, 0x1C, 0x3D, 0x36, 0x2E, 0x6D, 0xEA, 0x61,
+ 0x72, 0x9E, 0xF1, 0x6F, 0xD1, 0x14, 0xF6, 0x29, 0x4E, 0xFD, 0xFD, 0x3D, 0x4D, 0xB9, 0x25, 0x4B,
+ 0x38, 0xA2, 0x00, 0xEB, 0x14, 0xBA, 0xEE, 0xB1, 0x03, 0x84, 0x98, 0xF4, 0xCF, 0x05, 0x9E, 0x1C,
+ 0x7A, 0x8F, 0xAE, 0x85, 0x76, 0x57, 0xF4, 0x8E, 0x16, 0x06, 0x35, 0x77, 0xBB, 0x90, 0x41, 0x9E,
+ 0xCB, 0x52, 0x97, 0xCA, 0xC1, 0x7F, 0xA9, 0x01, 0x8B, 0x7D, 0xC4, 0xB8, 0xD9, 0xDC, 0x01, 0x3D,
+ 0x58, 0xF8, 0x10, 0xD1, 0xDF, 0x1A, 0x6A, 0x27, 0xE2, 0x65, 0x47, 0x1A, 0xC3, 0x8C, 0xDB, 0xE4,
+ 0xC5, 0x5C, 0x72, 0x0D, 0xAB, 0x84, 0x71, 0x54, 0xE2, 0x0F, 0xBB, 0xDE, 0xE0, 0x1F, 0xB1, 0x70,
+ 0x08, 0x09, 0x6B, 0x43, 0x72, 0x76, 0x71, 0x7C, 0xA5, 0x87, 0x65, 0x11, 0x7F, 0xA3, 0x17, 0x93,
+ 0x1C, 0x88, 0x4C, 0x6D, 0x9E, 0x36, 0x17, 0x37, 0x7F, 0x18, 0xDE, 0x6B, 0xC9, 0xEF, 0x04, 0x95,
+ 0xE6, 0x0A, 0x20, 0xEF, 0x30, 0x53, 0xED, 0x09, 0x1F, 0x08, 0xA3, 0x42, 0x1B, 0xA5, 0x5F, 0x21,
+ 0x9D, 0xFF, 0xE1, 0x13, 0x23, 0xC9, 0x36, 0xB4, 0x43, 0x1F, 0x34, 0x2A, 0x18, 0xC5, 0x26, 0x42,
+ 0xCB, 0xFB, 0xF3, 0x67, 0xA8, 0x5E, 0xF6, 0x14, 0x50, 0x68, 0xA6, 0xF9, 0x6D, 0x78, 0xB5, 0xF3,
+ 0x8A, 0x14, 0xE3, 0xFE, 0xB5, 0x7C, 0x88, 0x11, 0x56, 0xDA, 0x9A, 0x62, 0x30, 0x46, 0x34, 0xFB,
+ 0x9D, 0x99, 0xE0, 0xA6, 0xB2, 0x2F, 0xA6, 0xF3, 0x7F, 0x2D, 0xAC, 0x71, 0x29, 0x0A, 0x3D, 0x86,
+ 0xB0, 0x75, 0x97, 0xA4, 0xC3, 0x28, 0x9D, 0x6D, 0x0F, 0xA1, 0x3A, 0xB1, 0xC7, 0xEB, 0xC5, 0x3D,
+ 0x38, 0xE5, 0xED, 0xA6, 0xD9, 0xDF, 0x25, 0x38, 0x81, 0xBC, 0xBA, 0x73, 0x80, 0x09, 0xED, 0x98,
+ 0x59, 0xB9, 0xD9, 0x71, 0xD1, 0xD8, 0x6B, 0xF7, 0x08, 0xF8, 0x8E, 0x0A, 0xD2, 0x57, 0x66, 0xEA,
+ 0x02, 0x5F, 0x8B, 0xF3, 0xAD, 0x62, 0xCA, 0x25, 0x83, 0xD3, 0xA4, 0x0C, 0x3A, 0x68, 0x8E, 0xFC,
+ 0x8A, 0xDE, 0xD8, 0x42, 0x47, 0x6C, 0x38, 0x57, 0xE6, 0xD2, 0x6B, 0x42, 0xDD, 0x68, 0x8E, 0xBA,
+ 0xCD, 0xC7, 0xFB, 0x1C, 0x72, 0x6E, 0xE8, 0x2C, 0x16, 0xCF, 0xB1, 0xEB, 0x1F, 0x07, 0xF4, 0xEB,
+ 0x56, 0x44, 0xD2, 0xA5, 0xC8, 0xCB, 0x97, 0xD5, 0x71, 0xA1, 0xAE, 0x11, 0x38, 0x2F, 0x2E, 0xB8,
+ 0x06, 0x80, 0x73, 0xA2, 0x82, 0xC6, 0x0F, 0x24, 0x58, 0xD9, 0xDB, 0x5A, 0x1A, 0xAC, 0xCA, 0xCA,
+ 0x6C, 0xB3, 0x74, 0x59, 0x4A, 0xBC, 0x42, 0x80, 0x8D, 0x2A, 0xF7, 0x5E, 0x12, 0x7F, 0x01, 0x01,
+ 0x6B, 0xF4, 0x0B, 0xFE, 0x83, 0xD1, 0xC9, 0x9C, 0x11, 0xFE, 0x7C, 0x18, 0xBD, 0xF0, 0xB9, 0x93,
+ 0xEA, 0x5E, 0x6F, 0x95, 0xA1, 0x06, 0x90, 0xA2, 0xEA, 0xAD, 0xA5, 0x87, 0x23, 0x78, 0x9A, 0x20,
+ 0x50, 0xAF, 0x38, 0x17, 0x6D, 0x14, 0xBB, 0x68, 0x5C, 0xCB, 0x6E, 0xC7, 0xD3, 0x11, 0x81, 0x43,
+ 0xD5, 0xE5, 0x87, 0xE4, 0x4E, 0xFB, 0xEE, 0x3E, 0x3A, 0x6D, 0xEC, 0x79, 0xE5, 0x90, 0x68, 0xCB,
+ 0xF7, 0x01, 0xFF, 0x26, 0x3B, 0x82, 0xB1, 0x67, 0x04, 0xB7, 0x32, 0x52, 0xA0, 0xFF, 0x60, 0x97,
+ 0x8D, 0xA9, 0x8C, 0xDC, 0xF3, 0x37, 0xE1, 0x87, 0x1F, 0x95, 0xAD, 0x16, 0x69, 0x4B, 0xF2, 0x26,
+ 0xE4, 0x79, 0x1C, 0x3C, 0xA8, 0x87, 0x4D, 0x9D, 0x0D, 0xB2, 0x01, 0x29, 0x22, 0xB6, 0x20, 0x8B,
+ 0x66, 0x8A, 0x1A, 0x09, 0xF4, 0xE1, 0xAF, 0x52, 0xBA, 0x63, 0xA9, 0x35, 0xD1, 0x1D, 0x4B, 0xDD,
+ 0xBE, 0x30, 0x11, 0x4E, 0xFE, 0xCD, 0x57, 0x54, 0xFA, 0x39, 0xB4, 0x8C, 0x2B, 0x0D, 0x83, 0x36,
+ 0x18, 0x81, 0xE5, 0xBA, 0x18, 0xDF, 0x41, 0x5F, 0x21, 0x25, 0xCE, 0x47, 0x11, 0x56, 0x20, 0x5D,
+ 0x72, 0xFA, 0x54, 0x1E, 0xF5, 0x0A, 0x31, 0x92, 0x85, 0x95, 0x26, 0x11, 0x26, 0x24, 0x67, 0x84,
+ 0x1A, 0xA2, 0x71, 0xFB, 0xAE, 0x7E, 0xAE, 0x27, 0xB5, 0x64, 0xF0, 0xF3, 0x40, 0x55, 0x7D, 0xDB,
+ 0xF3, 0x28, 0x62, 0xDD, 0xF0, 0xFA, 0x41, 0xD7, 0xCA, 0x38, 0x73, 0x25, 0xD9, 0x13, 0x3E, 0xCB,
+ 0xC2, 0x49, 0x79, 0x10, 0xE9, 0x43, 0xCD, 0xEA, 0x78, 0x6C, 0x61, 0x36, 0x87, 0xF3, 0x37, 0x80,
+ 0x08, 0x3C, 0x5B, 0x41, 0x1A, 0x59, 0x3E, 0xA0, 0x2D, 0x07, 0x03, 0x9B, 0xEE, 0x47, 0xEC, 0xB4,
+ 0xB8, 0xB5, 0x5C, 0x5F, 0x70, 0xAB, 0x04, 0x12, 0xF7, 0x5A, 0x89, 0xB7, 0x00, 0x6A, 0x2A, 0x37,
+ 0x14, 0x56, 0xA8, 0x03, 0x45, 0x38, 0xBB, 0xC5, 0x70, 0xAB, 0x4B, 0xBE, 0x6D, 0xEA, 0xA6, 0x27,
+ 0x1F, 0x19, 0x5A, 0x02, 0x12, 0xE0, 0x9E, 0x83, 0xD9, 0x78, 0x27, 0x34, 0x6B, 0x81, 0x2A, 0x82,
+ 0x73, 0x80, 0x06, 0x7E, 0x9C, 0xE2, 0xFB, 0x6E, 0x12, 0xAE, 0xA6, 0x7E, 0x8D, 0xBF, 0xAC, 0x5A,
+ 0x6C, 0x49, 0x81, 0xE7, 0x03, 0x8C, 0x3C, 0x05, 0x01, 0x61, 0x96, 0xD8, 0x05, 0x62, 0xFA, 0x36,
+ 0xBC, 0x26, 0x8E, 0xB3, 0x2D, 0x49, 0x80, 0x6B, 0x4D, 0xF1, 0x63, 0x42, 0x56, 0x53, 0xA8, 0x8E,
+ 0x63, 0xB2, 0xCF, 0x38, 0x31, 0xF0, 0x56, 0x6D, 0x58, 0x6A, 0xEB, 0x59, 0x07, 0x27, 0x08, 0x1D,
+ 0x64, 0xE2, 0x5A, 0x69, 0xBE, 0x47, 0xE8, 0xCA, 0xEE, 0x66, 0x3D, 0x95, 0xE3, 0x00, 0x24, 0xAF,
+ 0xEA, 0xF6, 0xE8, 0x30, 0xB2, 0x24, 0x85, 0x30, 0x28, 0xFB, 0x46, 0x7A, 0xDC, 0xC1, 0x11, 0xF6,
+ 0xBE, 0xBB, 0x12, 0x92, 0x9E, 0x7A, 0x85, 0x24, 0x25, 0xF1, 0xFB, 0xDE, 0xD1, 0x1E, 0x46, 0xCE,
+ 0x4D, 0xCC, 0xB4, 0x5D, 0xD2, 0x41, 0x7F, 0x47, 0x92, 0x1A, 0xAE, 0xB3, 0xB5, 0x26, 0x96, 0xB2,
+ 0x38, 0x92, 0x33, 0x67, 0x52, 0x3D, 0xA9, 0x3C, 0xA0, 0x46, 0x43, 0xE8, 0xEE, 0x22, 0x82, 0xD7,
+ 0xEC, 0xBC, 0x79, 0x9E, 0x0F, 0x47, 0x20, 0x32, 0x48, 0x7E, 0x79, 0x2C, 0x82, 0xD7, 0x57, 0x31,
+ 0xD8, 0xE8, 0xEC, 0x4D, 0x44, 0x7E, 0x92, 0xB8, 0xA2, 0xE3, 0xC5, 0x09, 0x6C, 0x13, 0xFF, 0xF0,
+ 0x35, 0x12, 0x63, 0x46, 0x46, 0x35, 0x3F, 0xC7, 0x7C, 0xB8, 0xEA, 0xA7, 0x96, 0x9D, 0x19, 0xAC,
+ 0x72, 0x44, 0xA5, 0xBC, 0x41, 0xD0, 0x4D, 0xA2, 0xD7, 0x00, 0x19, 0xFF, 0xD7, 0x3F, 0x09, 0xEB,
+ 0x58, 0xAC, 0x81, 0x9D, 0xBB, 0x80, 0x74, 0xFA, 0x2E, 0xBC, 0x6D, 0xE6, 0xEB, 0x91, 0x80, 0x5F,
+ 0x67, 0x03, 0x14, 0x54, 0x65, 0x0A, 0x7D, 0x6C, 0xC1, 0xC9, 0xC0, 0xF4, 0xE0, 0x7B, 0x6A, 0x45,
+ 0xCF, 0x13, 0x3E, 0x37, 0x07, 0x03, 0x42, 0xCA, 0xE0, 0xA2, 0xD1, 0x00, 0x00, 0x10, 0xDE, 0xE5,
+ 0x81, 0x9A, 0xD0, 0x14, 0xF7, 0x98, 0xA5, 0xE1, 0xD3, 0x84, 0xAC, 0x70, 0xC6, 0x75, 0xB4, 0x27,
+ 0xF5, 0xEB, 0x08, 0x4C, 0x64, 0xC1, 0x74, 0x45, 0xB1, 0x30, 0x48, 0xE4, 0xAA, 0x99, 0xBD, 0xC0,
+ 0x27, 0xDE, 0x54, 0xA4, 0xC4, 0xFE, 0xDF, 0x69, 0xF2, 0x46, 0xF8, 0x7E, 0x79, 0x99, 0xFE, 0xD1,
+ 0x4A, 0x77, 0x6C, 0xFA, 0x13, 0x2C, 0xD3, 0x9B, 0x45, 0x2F, 0x86, 0x0F, 0xB6, 0xAA, 0x76, 0x42,
+ 0xE7, 0x11, 0x3D, 0xE9, 0x52, 0xC1, 0x3B, 0x17, 0x66, 0x60, 0x1C, 0x67, 0xA9, 0xF0, 0x83, 0xFF,
+ 0x80, 0x59, 0x4F, 0xAA, 0xC7, 0xE7, 0x95, 0x81, 0xA0, 0xEE, 0x5D, 0x3D, 0x36, 0xA6, 0x0B, 0x81,
+ 0xFD, 0xD0, 0xF3, 0xE7, 0x76, 0x7C, 0x11, 0xB4, 0x4F, 0x62, 0xD6, 0x3A, 0x1E, 0x5D, 0xED, 0x91,
+ 0xB3, 0x55, 0x2D, 0x83, 0xD3, 0xF4, 0xC9, 0x52, 0x59, 0x6B, 0xD2, 0xCA, 0x22, 0xC4, 0x8D, 0x74,
+ 0xEC, 0x15, 0x47, 0x03, 0x0B, 0xDD, 0x1E, 0x83, 0x6A, 0xD7, 0x3C, 0x6F, 0x57, 0x67, 0x6B, 0x77,
+ 0x8D, 0x67, 0x98, 0x88, 0x5D, 0x3C, 0x4C, 0x52, 0x6B, 0xC5, 0x8F, 0x82, 0x10, 0x18, 0x13, 0x3F,
+ 0xD4, 0x65, 0x18, 0xFC, 0xFA, 0xD7, 0x97, 0xFD, 0x89, 0xC4, 0x82, 0x4E, 0xB6, 0x40, 0xC0, 0x62,
+ 0x60, 0xB9, 0x95, 0xAB, 0x86, 0xB8, 0xE1, 0x10, 0xBD, 0xB3, 0xEC, 0x58, 0xDF, 0x13, 0xF4, 0x4D,
+ 0x0A, 0x1D, 0xB8, 0x78, 0x2C, 0x0D, 0x70, 0xC2, 0xF9, 0xB8, 0x78, 0x10, 0x0E, 0x4D, 0xC6, 0x7B,
+ 0xED, 0x1D, 0xBF, 0x64, 0x4E, 0xBC, 0xEA, 0x0A, 0x61, 0x49, 0xCE, 0x20, 0xD1, 0x21, 0x31, 0xEC,
+ 0x30, 0xF9, 0x34, 0x94, 0x46, 0xF0, 0xFF, 0x4E, 0xFE, 0xB8, 0x6D, 0x78, 0xA5, 0x2C, 0x95, 0xDD,
+ 0x45, 0x1E, 0x73, 0xA1, 0xC1, 0x7B, 0x60, 0xBD, 0x62, 0x2F, 0x31, 0x59, 0x6D, 0x3D, 0x00, 0x09,
+ 0x0D, 0x2A, 0xA4, 0x86, 0xF3, 0x5A, 0x12, 0xAA, 0x50, 0x72, 0x8F, 0xA6, 0x96, 0xFD, 0x27, 0xA5,
+ 0x52, 0xE3, 0xD1, 0x87, 0x8C, 0x00, 0xAE, 0xF9, 0x98, 0x98, 0x05, 0xD6, 0x89, 0x54, 0x71, 0x7E,
+ 0x8F, 0xA7, 0xFE, 0x40, 0xAB, 0xEE, 0x04, 0xE2, 0xB2, 0xB5, 0x89, 0xFD, 0x38, 0xF0, 0xF9, 0x63,
+ 0xAD, 0xBA, 0x2F, 0xF2, 0xF2, 0xC4, 0x7B, 0xF4, 0xE4, 0x10, 0x25, 0x8C, 0xBD, 0x6A, 0xF3, 0x23,
+ 0x4B, 0xAE, 0xB1, 0x9B, 0x83, 0xF4, 0x1D, 0x12, 0x54, 0x72, 0xB5, 0xD4, 0xA0, 0xED, 0x4F, 0xA0,
+ 0xBB, 0xBD, 0xEF, 0x4E, 0xC7, 0xDC, 0x5F, 0x04, 0x8B, 0x4F, 0x28, 0x02, 0x6D, 0x57, 0xE5, 0xD1,
+ 0x44, 0x86, 0x26, 0xBB, 0x8E, 0x20, 0xC2, 0xCD, 0xD2, 0x1E, 0x49, 0x0E, 0x71, 0x36, 0xD8, 0x38,
+ 0x7F, 0x18, 0x08, 0x16, 0x98, 0x13, 0x84, 0x39, 0x1C, 0x17, 0xED, 0x52, 0xE8, 0x43, 0x48, 0x44,
+ 0x00, 0x7C, 0x9C, 0xE8, 0x80, 0xF3, 0x71, 0xD0, 0x2D, 0xF8, 0x6D, 0xFF, 0x6E, 0x0B, 0xF5, 0x86,
+ 0xE8, 0x68, 0x25, 0x90, 0xC2, 0x04, 0x0C, 0x30, 0x6B, 0x31, 0x3E, 0x71, 0x51, 0x98, 0xD6, 0xD8,
+ 0x50, 0xB4, 0xAA, 0xDF, 0x02, 0x0C, 0x78, 0x8F, 0x5E, 0x29, 0x02, 0xC8, 0xB5, 0xAD, 0x43, 0x9E,
+ 0x59, 0x7D, 0xF1, 0xBB, 0x1E, 0xCC, 0xA0, 0x78, 0x53, 0xB1, 0x1C, 0x77, 0xAC, 0x55, 0xE1, 0x8C,
+ 0xE3, 0x65, 0x27, 0x06, 0x79, 0x61, 0x95, 0x9D, 0x93, 0x05, 0xBA, 0x35, 0xCF, 0xAA, 0x96, 0x4F,
+ 0x9A, 0xD1, 0x4C, 0x71, 0x27, 0xC4, 0x06, 0x5A, 0xBD, 0x39, 0x26, 0x87, 0x5F, 0x3C, 0x61, 0x94,
+ 0xB9, 0x55, 0x48, 0x03, 0x06, 0x47, 0x8F, 0x81, 0x88, 0x19, 0x63, 0xE9, 0x3D, 0x8E, 0x6C, 0x5F,
+ 0x72, 0xDE, 0x48, 0x1B, 0xFF, 0x8C, 0xEC, 0x2B, 0xF1, 0x75, 0x64, 0x03, 0xE7, 0xA3, 0xB4, 0xCC,
+ 0x19, 0x44, 0x42, 0x96, 0x5C, 0xC4, 0x17, 0x6C, 0x7A, 0x20, 0xFF, 0xE3, 0xD5, 0x2C, 0xB6, 0x5C,
+ 0x27, 0x97, 0xB3, 0x5B, 0x7B, 0xBC, 0x65, 0x76, 0xB5, 0xFD, 0x05, 0xD2, 0xA3, 0xC5, 0x79, 0x77,
+ 0xBF, 0x77, 0x00, 0x7D, 0xA0, 0x0E, 0x53, 0x15, 0x2B, 0xC1, 0xB7, 0x40, 0xEA, 0xBC, 0x37, 0xE0,
+ 0x52, 0x28, 0xAE, 0x03, 0x4D, 0x3E, 0x95, 0x03, 0x61, 0x2B, 0x5C, 0x7D, 0x6E, 0x51, 0xCA, 0x49,
+ 0x37, 0xA2, 0xCF, 0xEA, 0x4C, 0x4B, 0x4D, 0x43, 0xCD, 0xF7, 0xBC, 0xCE, 0xEE, 0x4D, 0xE2, 0x96,
+ 0x6D, 0xD6, 0xE2, 0x82, 0x92, 0xFE, 0x4C, 0x3E, 0x97, 0xD5, 0xDA, 0x45, 0xA3, 0xB0, 0xE0, 0x8C,
+ 0x7E, 0x45, 0xF7, 0xE5, 0x9E, 0xB5, 0xA0, 0x63, 0xE6, 0xC4, 0x0C, 0x02, 0x91, 0x17, 0x4A, 0xC2,
+ 0xD3, 0xB1, 0xDB, 0x85, 0xD1, 0x90, 0x7F, 0x21, 0x4B, 0x8E, 0xEA, 0x13, 0x55, 0xEE, 0xD5, 0xA2,
+ 0xA6, 0xB9, 0x09, 0x96, 0xA2, 0xF8, 0xCB, 0xCE, 0xC4, 0x3B, 0x1C, 0x05, 0xEB, 0x00, 0x13, 0xFC,
+ 0xFC, 0x9F, 0xC0, 0xCD, 0x2C, 0xB0, 0xC5, 0x8F, 0x38, 0xD7, 0xAB, 0xE4, 0x86, 0xB4, 0xA3, 0x78,
+ 0x1F, 0x36, 0x22, 0xD2, 0x81, 0x6A, 0xBD, 0xA0, 0x9F, 0x61, 0x92, 0xF8, 0x6A, 0x27, 0x75, 0x72,
+ 0x06, 0x16, 0x66, 0x76, 0x90, 0x93, 0x29, 0xBD, 0xEB, 0x9D, 0xA5, 0x81, 0xEF, 0xEB, 0x69, 0x93,
+ 0x8E, 0xE8, 0x17, 0x8F, 0x42, 0x0A, 0x4D, 0xA0, 0x2D, 0x20, 0xB3, 0x1F, 0x6A, 0xDB, 0x22, 0xE9,
+ 0x24, 0x64, 0x52, 0x06, 0x65, 0xA5, 0xC5, 0x82, 0x59, 0x47, 0xF4, 0xE9, 0xB9, 0xA3, 0xB1, 0x02,
+ 0xFC, 0x60, 0x8B, 0x42, 0xF5, 0x23, 0xD8, 0xD8, 0x35, 0x70, 0x38, 0xEB, 0x5D, 0x15, 0xEF, 0xD6,
+ 0xD3, 0x75, 0x80, 0x6E, 0xBA, 0x2E, 0xD6, 0x11, 0x54, 0x6E, 0x24, 0xC1, 0xC7, 0x7A, 0xE1, 0xCB,
+ 0xAE, 0x62, 0x27, 0x48, 0xB7, 0x9C, 0xA7, 0x9E, 0x15, 0xFD, 0xDE, 0xC0, 0xBE, 0xBB, 0xC2, 0x2E,
+ 0x4A, 0x5C, 0xD4, 0x81, 0xC0, 0x93, 0x58, 0x00, 0x9C, 0xFB, 0x36, 0x27, 0xD7, 0x72, 0x46, 0x9D,
+ 0xAC, 0xEF, 0xD8, 0x14, 0x1C, 0x58, 0xC0, 0x4E, 0xD4, 0x16, 0xE1, 0x58, 0x56, 0x25, 0xA9, 0x38,
+ 0xCF, 0x06, 0xAA, 0xA3, 0x4F, 0x52, 0x70, 0x09, 0x41, 0x44, 0xD0, 0x98, 0x73, 0xED, 0x18, 0xB4,
+ 0xDB, 0x07, 0xC9, 0xB7, 0xBB, 0x5A, 0xD6, 0x08, 0xE5, 0x89, 0x19, 0xD8, 0x1A, 0xB6, 0x84, 0x72,
+ 0x1B, 0xEA, 0x14, 0x78, 0x96, 0xB4, 0x2D, 0x61, 0x20, 0x8D, 0x9A, 0xD2, 0x87, 0x23, 0x18, 0x7A,
+ 0xA3, 0x70, 0x4D, 0xA6, 0xBB, 0xEE, 0x99, 0x78, 0xD8, 0x94, 0xF1, 0x35, 0x91, 0x45, 0xDB, 0x2A,
+ 0x8A, 0xDD, 0x8F, 0xC5, 0x05, 0x17, 0xB6, 0x69, 0x4E, 0xD2, 0xF0, 0x16, 0x09, 0x14, 0x65, 0xE0,
+ 0x76, 0x6B, 0x33, 0xE8, 0x4D, 0xDF, 0xAF, 0x5A, 0x0C, 0xF6, 0xB0, 0x29, 0xEF, 0xB9, 0x85, 0x96,
+ 0x16, 0xED, 0x03, 0x45, 0xFA, 0x6F, 0x03, 0x64, 0x62, 0x6D, 0x32, 0x75, 0x82, 0x32, 0x14, 0x23,
+ 0x5A, 0x85, 0xFF, 0xFE, 0x65, 0x52, 0xBC, 0xAD, 0x99, 0xC2, 0xDA, 0x8B, 0x86, 0xC0, 0x2E, 0x78,
+ 0x38, 0xDF, 0x5E, 0x83, 0xDE, 0xE0, 0x72, 0xD5, 0x91, 0x6B, 0xDB, 0xDF, 0x7F, 0xA7, 0x8B, 0xA4,
+ 0x5B, 0x10, 0x93, 0x4D, 0xA4, 0xB4, 0x22, 0xC1, 0xB3, 0xBE, 0x8B, 0x56, 0x82, 0xB9, 0x33, 0x85,
+ 0x01, 0xFA, 0xF5, 0x95, 0x9D, 0x0C, 0xBC, 0xD4, 0xB0, 0x2F, 0x94, 0xD9, 0x2E, 0xDA, 0xB9, 0x49,
+ 0xC5, 0x53, 0xA2, 0xE9, 0x4D, 0x81, 0xDE, 0xC0, 0xF8, 0x01, 0x60, 0xEA, 0xAA, 0x57, 0x66, 0xA5,
+ 0x5D, 0x4B, 0x6D, 0xEC, 0x85, 0xBF, 0x10, 0x18, 0x43, 0xD1, 0xD7, 0xA2, 0xBA, 0x72, 0x09, 0x63,
+ 0x71, 0xB2, 0xA2, 0x14, 0x52, 0x94, 0xFD, 0x40, 0xA6, 0x89, 0x1B, 0xD5, 0x16, 0x7D, 0xB1, 0x22,
+ 0x00, 0xF7, 0x62, 0x12, 0x5E, 0xBB, 0xA1, 0x03, 0x6C, 0x3D, 0x32, 0x1C, 0xD8, 0x3A, 0xB5, 0x24,
+ 0xF6, 0x64, 0x67, 0xCD, 0x47, 0xEB, 0x6A, 0xFB, 0x94, 0xCE, 0xA6, 0xF4, 0x9D, 0x2B, 0xBD, 0x50,
+ 0x2A, 0x53, 0x63, 0xEF, 0x7B, 0x94, 0x68, 0x26, 0xE2, 0xD8, 0x13, 0x5A, 0xD2, 0xE3, 0x1D, 0x01,
+ 0xE4, 0xB8, 0x3C, 0x42, 0x07, 0x3B, 0x14, 0x01, 0xEB, 0x18, 0xBF, 0x39, 0xD9, 0xC4, 0xD6, 0x41,
+ 0xB2, 0xE7, 0xCD, 0x02, 0x86, 0x8B, 0xA7, 0x77, 0x5D, 0xC9, 0x5C, 0xC0, 0xBE, 0xDE, 0x3D, 0x67,
+ 0xA3, 0xD7, 0xDA, 0xB5, 0x88, 0x39, 0xEA, 0x9D, 0x7A, 0xF7, 0x99, 0x3E, 0xDE, 0xF9, 0x36, 0x1E,
+ 0xBB, 0xAB, 0x61, 0x8C, 0xB2, 0xB9, 0x61, 0x18, 0x7D, 0x4A, 0x32, 0x7E, 0xCC, 0x71, 0xBC, 0xC6,
+ 0xAA, 0xDE, 0x08, 0xFF, 0xEE, 0x44, 0x4B, 0xD7, 0xC1, 0xDB, 0xCE, 0xFE, 0x89, 0x56, 0x03, 0xDA,
+ 0x3A, 0xF5, 0xD3, 0x9D, 0x39, 0x63, 0x92, 0x33, 0x50, 0x13, 0x8B, 0x7B, 0x5A, 0xC0, 0x79, 0xED,
+ 0x40, 0xAD, 0x1B, 0x53, 0x50, 0x74, 0x0A, 0xA0, 0xA7, 0x5D, 0x5B, 0x61, 0x85, 0x93, 0x8A, 0xB9,
+ 0xA9, 0x2C, 0x0F, 0xA2, 0xBD, 0x7A, 0x33, 0xF3, 0xD6, 0xD6, 0x64, 0x60, 0xCF, 0x12, 0x88, 0x08,
+ 0x13, 0x0B, 0xC2, 0x76, 0xEC, 0x4B, 0x75, 0x74, 0xCC, 0x60, 0xF8, 0x9E, 0xAD, 0x40, 0xFD, 0x5E,
+ 0x58, 0x2D, 0x08, 0xB7, 0x6C, 0xB6, 0x27, 0x73, 0x4B, 0x31, 0x03, 0x1D, 0x7A, 0xC5, 0x59, 0x67,
+ 0x1F, 0x5C, 0xDE, 0x08, 0x24, 0x0D, 0xB9, 0x33, 0x97, 0x51, 0xC6, 0xC3, 0x13, 0xE0, 0xFC, 0x45,
+ 0xDA, 0x5F, 0xFC, 0xA9, 0x8E, 0x71, 0x54, 0x1C, 0x3A, 0x4D, 0xFB, 0x7B, 0x06, 0xFB, 0x65, 0xB1,
+ 0x27, 0x0B, 0x8C, 0xAF, 0xF2, 0xA0, 0x12, 0xA6, 0xD7, 0xAC, 0x27, 0xC1, 0x55, 0xE7, 0x17, 0x81,
+ 0xFD, 0xA2, 0xF8, 0xC3, 0x17, 0x55, 0x9B, 0x00, 0xFE, 0x91, 0xA9, 0xDC, 0xDE, 0xB0, 0xD7, 0x5D,
+ 0x2A, 0xE8, 0x87, 0xF2, 0x1B, 0x28, 0x19, 0x20, 0x63, 0x9E, 0xD8, 0x7E, 0x85, 0xF3, 0x87, 0x0D,
+ 0xAF, 0x35, 0xA5, 0x9F, 0x3B, 0xE7, 0x44, 0x8D, 0x63, 0xDE, 0xEB, 0x7E, 0xC7, 0xD2, 0x0F, 0x09,
+ 0x30, 0xE3, 0xE2, 0x7B, 0xEA, 0x74, 0xAD, 0x46, 0x7D, 0xB4, 0xB8, 0x0C, 0xF1, 0xD3, 0xFA, 0x07,
+ 0xF3, 0xDD, 0xC5, 0xB1, 0x00, 0xF2, 0xD6, 0xBD, 0x4B, 0xBD, 0xAC, 0xC8, 0xBB, 0xA7, 0xD4, 0x53,
+ 0xDE, 0x73, 0x0D, 0xED, 0xFB, 0x84, 0x4C, 0x82, 0x47, 0x0D, 0x2D, 0x9D, 0x2B, 0x0C, 0x4A, 0x4D,
+ 0x4B, 0xD4, 0x3A, 0x4D, 0x64, 0x27, 0xD8, 0x59, 0x27, 0xD3, 0x41, 0x73, 0xA5, 0xCB, 0xF5, 0x31,
+ 0xA2, 0x88, 0x99, 0x79, 0xFB, 0x2B, 0x9A, 0xBA, 0x68, 0x88, 0x35, 0x12, 0x15, 0x11, 0xF6, 0xEA,
+ 0x9A, 0x1B, 0x2A, 0xE1, 0x95, 0x5B, 0x15, 0xAB, 0x79, 0xE2, 0x5A, 0x4A, 0x6E, 0xE2, 0xF7, 0x63,
+ 0x74, 0x52, 0xB5, 0x9B, 0xA9, 0x58, 0x5D, 0x78, 0xAB, 0x61, 0x40, 0xA5, 0x6F, 0x99, 0x80, 0x06,
+ 0xCA, 0x73, 0x82, 0x78, 0x64, 0x8F, 0xE4, 0xA7, 0x2F, 0x9F, 0x6D, 0x50, 0x80, 0x11, 0xF4, 0xE9,
+ 0xE3, 0x63, 0x2A, 0x96, 0x0C, 0xFC, 0x3C, 0xE0, 0xAA, 0xF7, 0x05, 0x55, 0x28, 0xB0, 0x76, 0x24,
+ 0x87, 0xDA, 0x29, 0x28, 0x05, 0xA9, 0x61, 0x0B, 0x66, 0x3C, 0xA0, 0x51, 0x5E, 0xCE, 0xF5, 0x80,
+ 0x0F, 0x1C, 0x90, 0xDD, 0x56, 0x52, 0x07, 0xDF, 0xB4, 0xE6, 0x92, 0x4A, 0x57, 0x97, 0x71, 0xAB,
+ 0x58, 0xF3, 0x03, 0x43, 0x99, 0x49, 0x1A, 0xFC, 0x96, 0x29, 0x31, 0x15, 0x30, 0x6D, 0xCA, 0x92,
+ 0x39, 0x68, 0xF6, 0xAE, 0xDE, 0x56, 0x74, 0x53, 0xC5, 0xCA, 0xBE, 0x09, 0x0C, 0x88, 0xEE, 0xEC,
+ 0xE9, 0xE8, 0xD0, 0x6A, 0x55, 0x6A, 0xB2, 0xDF, 0x41, 0x79, 0xC8, 0x44, 0xD1, 0x2B, 0x6B, 0x5F,
+ 0xB4, 0x27, 0x02, 0xFE, 0x9E, 0x70, 0x48, 0xE9, 0xE8, 0x9B, 0x44, 0x5D, 0x19, 0xB7, 0x24, 0x47,
+ 0x42, 0x0D, 0x1D, 0xA9, 0x26, 0x07, 0x70, 0xC4, 0x36, 0x6A, 0x03, 0xA2, 0xBD, 0x60, 0x65, 0x9A,
+ 0x92, 0x6F, 0x0A, 0x1B, 0xE6, 0x36, 0x7B, 0xA4, 0x55, 0x79, 0xBF, 0x7B, 0x27, 0xBE, 0x6D, 0x67,
+ 0x01, 0x6D, 0xB7, 0x49, 0x7C, 0x3F, 0x99, 0x1B, 0x4E, 0xFB, 0x32, 0x3A, 0xE5, 0x76, 0x0B, 0x96,
+ 0xC6, 0x55, 0xC5, 0x90, 0x5F, 0x80, 0x19, 0x77, 0xAD, 0xB1, 0x5F, 0x6C, 0x75, 0x41, 0x1E, 0x07,
+ 0x58, 0x6F, 0x6D, 0xB5, 0xDA, 0x2E, 0x3E, 0x2B, 0x76, 0xAA, 0x4D, 0xF5, 0x3F, 0x9A, 0x56, 0x31,
+ 0x53, 0x74, 0x1F, 0xA6, 0xC3, 0x97, 0xAE, 0x8A, 0x3E, 0x8B, 0x76, 0xE1, 0x2C, 0x77, 0x6C, 0x70,
+ 0xEC, 0xBB, 0xD5, 0xA5, 0xA7, 0x30, 0x4B, 0xE8, 0xA6, 0x29, 0xAC, 0xE6, 0x6F, 0x8E, 0xC7, 0xFF,
+ 0xBA, 0xD9, 0xCB, 0x62, 0xE8, 0x2E, 0xD7, 0xCF, 0xA3, 0x02, 0xD4, 0x55, 0x88, 0x2D, 0x12, 0x9D,
+ 0x6A, 0x19, 0x50, 0xB4, 0x98, 0xFA, 0x29, 0xF5, 0x2E, 0xFF, 0xF2, 0xD4, 0xAD, 0x04, 0x85, 0xF4,
+ 0xB6, 0x22, 0x56, 0x03, 0x50, 0x3F, 0x96, 0x5D, 0xDE, 0xCD, 0x0D, 0xB3, 0xC5, 0xFB, 0xDB, 0xAC,
+ 0x7F, 0xBD, 0xC1, 0xB6, 0xD0, 0x20, 0xCF, 0x30, 0x5E, 0x62, 0xD6, 0xF9, 0x44, 0x19, 0xF3, 0x96,
+ 0x0D, 0x72, 0xF8, 0xFB, 0x71, 0xB1, 0x9D, 0xA7, 0x77, 0x6E, 0xDD, 0xD2, 0x1B, 0xD9, 0x39, 0xAB,
+ 0x10, 0x26, 0x18, 0xB8, 0x56, 0x92, 0x6E, 0x9B, 0xC2, 0x3D, 0x9B, 0x94, 0x88, 0x9E, 0x2B, 0x4D,
+ 0x79, 0xF6, 0x8D, 0xC6, 0x23, 0x0B, 0x8D, 0xF4, 0xB3, 0x00, 0x8C, 0xD4, 0x4F, 0xE1, 0xA1, 0x2B,
+ 0x9F, 0xE7, 0x3D, 0xE9, 0x04, 0x65, 0xD4, 0x21, 0x87, 0x44, 0xDB, 0x00, 0x30, 0x23, 0x7A, 0x94,
+ 0xC1, 0xE7, 0x4B, 0xC4, 0xA0, 0xA6, 0x90, 0x20, 0x99, 0xE6, 0x98, 0x48, 0x67, 0xB6, 0x49, 0x90,
+ 0x20, 0xB4, 0xA0, 0xA8, 0x90, 0x1E, 0x1B, 0x49, 0x50, 0x41, 0x7B, 0xC5, 0x02, 0xF3, 0xFF, 0xB1,
+ 0x6D, 0x39, 0x79, 0x1C, 0x3C, 0x5E, 0xC7, 0x98, 0x1F, 0xD9, 0x52, 0x49, 0x75, 0x59, 0x01, 0x1A,
+ 0xC1, 0x82, 0xBD, 0xDB, 0x1A, 0x86, 0xD8, 0x9F, 0x12, 0x93, 0xD2, 0x80, 0x13, 0xDE, 0x79, 0x3D,
+ 0xB6, 0xEB, 0xC5, 0x47, 0x75, 0x24, 0xE3, 0x70, 0x8E, 0x20, 0xBE, 0x78, 0x26, 0x15, 0xBD, 0xD4,
+ 0x5B, 0x9D, 0x6D, 0x7B, 0x02, 0x80, 0x73, 0x44, 0xA2, 0xC7, 0x22, 0x8D, 0xAD, 0x19, 0xD0, 0x38,
+ 0x2B, 0xEA, 0x4F, 0xDE, 0x68, 0x84, 0x3C, 0x77, 0x6B, 0xA2, 0x6C, 0x9A, 0x56, 0x13, 0x75, 0x66,
+ 0x8A, 0x91, 0x87, 0xDA, 0xC4, 0x24, 0xE6, 0xC5, 0x14, 0xE7, 0x91, 0x0B, 0x40, 0xBD, 0x7D, 0x8A,
+ 0x3A, 0x0D, 0x39, 0xB5, 0x65, 0x1A, 0xF6, 0x0F, 0x79, 0x4D, 0xED, 0x07, 0x8F, 0xE4, 0x48, 0xA3,
+ 0x7A, 0xE8, 0x9F, 0x09, 0x5B, 0x9E, 0x30, 0x46, 0xA8, 0x63, 0x89, 0x9E, 0xAF, 0xD1, 0x8F, 0xBE,
+ 0x53, 0x20, 0x07, 0xDE, 0x54, 0x8B, 0x8B, 0x98, 0xED, 0x76, 0xD7, 0x3A, 0xE9, 0x40, 0xEC, 0x27,
+ 0x64, 0xDC, 0x66, 0xD4, 0x32, 0x22, 0x43, 0x7E, 0xE0, 0x3E, 0xF8, 0x15, 0xAB, 0xDE, 0xAA, 0xC4,
+ 0x13, 0x7F, 0x56, 0x4E, 0x57, 0xC8, 0x69, 0x27, 0xD4, 0xC6, 0x6B, 0x72, 0x71, 0xB8, 0xA4, 0x7A,
+ 0x2F, 0x82, 0x7D, 0xEE, 0x0C, 0x21, 0xCE, 0xDF, 0xA5, 0x56, 0x01, 0xFC, 0xD2, 0xE7, 0x48, 0x35,
+ 0xD6, 0x8C, 0x87, 0xEF, 0xD8, 0xE1, 0xDC, 0xFC, 0x60, 0x1D, 0xD7, 0x81, 0xE5, 0xE2, 0x83, 0x83,
+ 0xF7, 0x14, 0xDA, 0xC8, 0x64, 0xA1, 0xDC, 0xBF, 0x6A, 0x0D, 0xB4, 0x5D, 0xCB, 0x1E, 0xDF, 0xA7,
+ 0xE7, 0x37, 0xDE, 0xCD, 0x35, 0x27, 0xAF, 0x18, 0xD3, 0xB3, 0xC5, 0xF1, 0x69, 0x57, 0xCD, 0xE4,
+ 0x64, 0x07, 0x50, 0x08, 0x80, 0x80, 0x6A, 0x2F, 0xD3, 0x1E, 0xA8, 0xC9, 0xA7, 0x6C, 0xFD, 0xA1,
+ 0x91, 0xF3, 0x06, 0x12, 0x97, 0x56, 0x9E, 0x37, 0x6A, 0x3D, 0x30, 0x0E, 0x0D, 0x88, 0x1D, 0x47,
+ 0xCC, 0x95, 0x53, 0xAA, 0xF4, 0xDC, 0x11, 0x9C, 0xD5, 0xBA, 0xDA, 0xA6, 0xAC, 0xE3, 0xC6, 0x14,
+ 0x54, 0x75, 0xA9, 0x22, 0x31, 0x0E, 0x58, 0x6B, 0xF6, 0x3E, 0x42, 0x54, 0x81, 0xF1, 0x26, 0x60,
+ 0x42, 0x7E, 0xD7, 0x15, 0x7C, 0x1A, 0xB3, 0x48, 0x74, 0x7E, 0x2A, 0xBC, 0x32, 0xEA, 0x37, 0x98,
+ 0x56, 0x7C, 0x06, 0x44, 0xD3, 0xC6, 0x91, 0x8D, 0x8A, 0xA0, 0xF6, 0x8E, 0x84, 0x11, 0xC1, 0xEB,
+ 0x9A, 0x39, 0x1A, 0xF2, 0xA7, 0x78, 0x17, 0x21, 0x3B, 0xBF, 0x32, 0x5B, 0x9C, 0x61, 0x6A, 0xDD,
+ 0x96, 0x55, 0x62, 0x38, 0x57, 0x6F, 0xA8, 0x7A, 0xB3, 0x44, 0x85, 0x6C, 0x4B, 0x06, 0xD6, 0x8E,
+ 0xAF, 0x6F, 0x30, 0x03, 0xBA, 0x88, 0xE4, 0x2A, 0x61, 0x58, 0x33, 0x34, 0xC9, 0xBF, 0x52, 0xC4,
+ 0x11, 0x71, 0xD1, 0x65, 0xEC, 0x07, 0x40, 0x92, 0x4A, 0x39, 0x4A, 0xF1, 0x6A, 0x37, 0x25, 0x82,
+ 0x91, 0x4A, 0x68, 0x98, 0xAA, 0x25, 0xDC, 0xD4, 0xCB, 0x51, 0x15, 0x46, 0xE4, 0xF0, 0x06, 0xA1,
+ 0x5B, 0x7F, 0xCA, 0xC9, 0xC9, 0xD7, 0x91, 0xF3, 0x9F, 0x0E, 0xC0, 0x69, 0x37, 0x48, 0x81, 0x0C,
+ 0xF4, 0x15, 0x51, 0x9E, 0xE3, 0x73, 0xAC, 0xDF, 0x57, 0x49, 0x2A, 0xF6, 0x98, 0x72, 0x5C, 0x43,
+ 0x2A, 0x63, 0x40, 0x94, 0xF1, 0xB4, 0x0B, 0xBD, 0x79, 0x67, 0xB8, 0xAB, 0xAE, 0xD4, 0x9C, 0xFA,
+ 0x2F, 0x64, 0x0D, 0x33, 0xB7, 0x7F, 0x9E, 0xC4, 0xB7, 0xE6, 0xCB, 0x5E, 0x61, 0x60, 0x29, 0x6D,
+ 0xB7, 0xC9, 0xCA, 0x7D, 0xE2, 0x43, 0x1E, 0x95, 0x04, 0xE1, 0xA9, 0x6B, 0xBD, 0x5F, 0xB2, 0xBF,
+ 0x07, 0x1C, 0xFF, 0x30, 0x74, 0x9A, 0xBC, 0xC4, 0xD5, 0x5C, 0x00, 0x32, 0x76, 0xA6, 0xDD, 0x25,
+ 0x3D, 0x53, 0xD0, 0x38, 0x34, 0x53, 0x7B, 0xD6, 0xBF, 0x0E, 0x84, 0xA0, 0x96, 0xF9, 0x8A, 0x82,
+ 0x8D, 0x94, 0x60, 0x57, 0xE2, 0x54, 0xBE, 0x44, 0x96, 0xF7, 0x86, 0xF5, 0x39, 0x0D, 0x05, 0xA7,
+ 0xB6, 0x74, 0xA5, 0x41, 0xB3, 0x0A, 0xB0, 0x5D, 0x91, 0xCB, 0x85, 0x79, 0x83, 0x4B, 0xC6, 0x55,
+ 0x57, 0x68, 0x8C, 0x91, 0x2F, 0x2A, 0xB8, 0x4A, 0x08, 0x82, 0x1F, 0xEC, 0x9A, 0x68, 0x11, 0x4C,
+ 0x22, 0x2C, 0x90, 0x86, 0x7E, 0xA5, 0x71, 0x46, 0xB5, 0xE0, 0x2B, 0x3F, 0x21, 0x8E, 0xCD, 0x41,
+ 0xA3, 0x96, 0xA5, 0x9E, 0x88, 0x9D, 0xC0, 0x06, 0x64, 0x4A, 0x4B, 0x3A, 0xD4, 0xA1, 0xE7, 0x16,
+ 0xD4, 0x3E, 0x57, 0xD2, 0x0C, 0xDA, 0xE1, 0x34, 0xD8, 0xD6, 0x58, 0xF7, 0x86, 0xBD, 0xF6, 0xC4,
+ 0xBC, 0xDA, 0x21, 0x74, 0xCA, 0x8A, 0xA6, 0xAA, 0x30, 0xEF, 0x25, 0x1F, 0x32, 0x7B, 0x49, 0xA6,
+ 0xEF, 0x9B, 0x95, 0x51, 0x83, 0x34, 0xB8, 0xB8, 0x3E, 0xCE, 0xF6, 0x85, 0x21, 0x3F, 0xE2, 0x93,
+ 0x5E, 0x52, 0xBF, 0x8D, 0xE7, 0xDD, 0xCE, 0xDF, 0x0B, 0x99, 0xB4, 0xB3, 0x89, 0x31, 0x70, 0xAE,
+ 0x82, 0x4D, 0xF5, 0xD1, 0x31, 0xF7, 0x04, 0xB2, 0x8A, 0x6A, 0xD8, 0xAD, 0x36, 0x50, 0x7D, 0x5B,
+ 0xD5, 0xD1, 0x26, 0x07, 0xB0, 0x40, 0xF0, 0x93, 0x4C, 0x17, 0xCD, 0x3F, 0xC3, 0x65, 0x95, 0x25,
+ 0xF4, 0x58, 0x12, 0xEE, 0xAA, 0xE6, 0x86, 0xAB, 0x92, 0x90, 0x18, 0xCD, 0xBD, 0x9A, 0x98, 0xFB,
+ 0x64, 0x17, 0x61, 0xF7, 0x04, 0x8B, 0x26, 0xD6, 0x13, 0xA2, 0x0C, 0x7C, 0xB7, 0x98, 0x35, 0xD0,
+ 0x47, 0x2C, 0x44, 0xB0, 0xA6, 0x5E, 0x96, 0xAE, 0x60, 0x54, 0x15, 0x1C, 0x1F, 0xEF, 0x95, 0x2A,
+ 0x7F, 0xF5, 0x11, 0x8B, 0xD2, 0xFA, 0x9D, 0x2B, 0x80, 0xD7, 0xA3, 0x0E, 0x25, 0xFD, 0x61, 0xA1,
+ 0x59, 0xEF, 0xFA, 0xC6, 0x7D, 0x8C, 0xE2, 0x0E, 0xD5, 0x3B, 0x7F, 0x0A, 0x9B, 0x07, 0x66, 0x2A,
+ 0x10, 0xF7, 0x58, 0x97, 0x78, 0xB5, 0x9E, 0x8C, 0x17, 0x10, 0x36, 0x8F, 0x7E, 0xB5, 0x62, 0xDD,
+ 0xBA, 0x53, 0x62, 0x20, 0x86, 0x69, 0x0B, 0x44, 0xDF, 0x3A, 0xEA, 0x0B, 0xB6, 0xD8, 0xDD, 0x3E,
+ 0x0F, 0x0D, 0xD0, 0x37, 0xDC, 0x2D, 0xD7, 0xEF, 0xB6, 0xD7, 0x4E, 0x2B, 0xFE, 0xA1, 0x4B, 0xDC,
+ 0xC2, 0x69, 0xEA, 0x04, 0x79, 0x6E, 0xC2, 0xD4, 0xD6, 0xC7, 0x3D, 0x21, 0x7C, 0xBD, 0x12, 0x4C,
+ 0x3A, 0x0F, 0xA6, 0xB9, 0xA8, 0x64, 0xF0, 0x13, 0x24, 0x9C, 0xD9, 0xC8, 0x97, 0xBB, 0xAD, 0x31,
+ 0x3D, 0x74, 0x6C, 0x6D, 0x62, 0xE7, 0x4E, 0x54, 0xC9, 0xEA, 0x0C, 0x65, 0xA5, 0xF8, 0x4A, 0xC1,
+ 0x7C, 0x26, 0x6B, 0x3F, 0x71, 0x06, 0xA8, 0xE6, 0xD5, 0x41, 0xCF, 0xD3, 0xFB, 0x6C, 0x88, 0xBC,
+ 0x82, 0xE1, 0x4D, 0x5F, 0x3C, 0x48, 0x61, 0xB4, 0xA1, 0x17, 0x43, 0x18, 0x8E, 0xA3, 0xD2, 0xDE,
+ 0xF5, 0x11, 0xE7, 0x6F, 0xBA, 0x9D, 0x00, 0x8E, 0x59, 0x6D, 0xC5, 0x1C, 0x59, 0x38, 0xD5, 0x3D,
+ 0x1F, 0xB9, 0x20, 0xDA, 0x91, 0xF3, 0xA6, 0x79, 0x91, 0xD4, 0x6A, 0x96, 0xB6, 0xDE, 0xF6, 0xD9,
+ 0xB7, 0x43, 0xD9, 0x14, 0x03, 0x61, 0x69, 0x6B, 0xF1, 0x96, 0x91, 0x5B, 0xA6, 0x47, 0xA5, 0x87,
+ 0x07, 0x5C, 0xB7, 0x33, 0xE1, 0x35, 0xFA, 0x71, 0x0B, 0xF0, 0x15, 0x96, 0x1D, 0xA7, 0x01, 0x88,
+ 0xEC, 0x94, 0xC5, 0xD1, 0x62, 0x53, 0x0F, 0xD9, 0x37, 0x88, 0x7B, 0x83, 0x9F, 0x59, 0x19, 0xB6,
+ 0xC3, 0x6F, 0x98, 0xF7, 0x40, 0x34, 0x10, 0x84, 0xB3, 0x66, 0x72, 0x4E, 0x9B, 0x5B, 0xD5, 0xCE,
+ 0x84, 0x47, 0x6C, 0xBB, 0x89, 0xC0, 0xD7, 0x07, 0x11, 0x20, 0xD8, 0x2E, 0x27, 0x52, 0x3C, 0x33,
+ 0x9E, 0xC9, 0x9F, 0x9F, 0x4A, 0x5F, 0x73, 0xC9, 0xBE, 0xC9, 0x63, 0xD9, 0xF1, 0xDA, 0xE6, 0x3B,
+ 0x09, 0xC0, 0xAA, 0x55, 0xD1, 0xA6, 0x31, 0xF6, 0xB4, 0x3D, 0xED, 0x79, 0x56, 0xE8, 0xB9, 0x04,
+ 0xC6, 0x5D, 0x10, 0x81, 0x86, 0xB8, 0xD4, 0x32, 0xF8, 0x7B, 0xC4, 0x9C, 0x89, 0x68, 0x26, 0x8C,
+ 0xA1, 0xC2, 0x40, 0x34, 0x4B, 0xAD, 0x06, 0xC9, 0x31, 0xD1, 0xDD, 0xE6, 0xB8, 0x77, 0x82, 0xA4,
+ 0xFE, 0x8F, 0x74, 0x69, 0x8E, 0xFF, 0x33, 0xB8, 0xAE, 0x29, 0x99, 0x92, 0x37, 0x8B, 0x82, 0x73,
+ 0x51, 0xE3, 0x0D, 0x5A, 0x88, 0xBE, 0x20, 0x12, 0x7E, 0x04, 0x1A, 0xDA, 0x76, 0x79, 0x34, 0x15,
+ 0xA3, 0x52, 0x5D, 0x77, 0x90, 0x41, 0xFD, 0x32, 0xA5, 0x43, 0x27, 0x03, 0xEC, 0xD6, 0x05, 0x49,
+ 0x6E, 0x0F, 0x21, 0xD2, 0xBD, 0x5E, 0x2C, 0x46, 0x8C, 0x07, 0xAB, 0x64, 0xA3, 0x00, 0x52, 0x6F,
+ 0x65, 0x87, 0x91, 0x2A, 0x88, 0x3F, 0x93, 0x5C, 0xC6, 0x2F, 0xD2, 0xF6, 0x7E, 0x6D, 0x48, 0xC8,
+ 0x7E, 0x29, 0x37, 0x3E, 0xA5, 0xA6, 0x04, 0x3B, 0x55, 0x65, 0xB5, 0x9B, 0x49, 0x72, 0x9C, 0xB7,
+ 0xE6, 0xC4, 0x6D, 0x6A, 0xBD, 0x71, 0x60, 0x6B, 0xBD, 0x60, 0x2E, 0x43, 0xFE, 0x84, 0x88, 0xD8,
+ 0x8C, 0x81, 0xD1, 0xB0, 0x8F, 0xAA, 0xA0, 0x91, 0x9B, 0x1E, 0xE2, 0xA7, 0x1D, 0x56, 0x89, 0x72,
+ 0xE7, 0xD3, 0xE1, 0x58, 0x4E, 0x07, 0x30, 0x75, 0xDE, 0xCD, 0x00, 0xD2, 0xF6, 0xFB, 0x2D, 0x5D,
+ 0xAA, 0x29, 0xF7, 0xEB, 0x84, 0x16, 0x28, 0x17, 0xEB, 0xC9, 0x6D, 0x18, 0xE9, 0x22, 0xF2, 0xED,
+ 0x11, 0xBC, 0xDC, 0x33, 0x91, 0x01, 0xC9, 0x6F, 0x96, 0xD1, 0x89, 0xEB, 0xEF, 0x47, 0x55, 0x93,
+ 0xF1, 0x94, 0x2D, 0xDE, 0x40, 0x2B, 0x9E, 0xDB, 0x02, 0x9E, 0xB8, 0xA9, 0x7E, 0x9D, 0xB6, 0xBF,
+ 0x96, 0x87, 0x3F, 0x07, 0x8D, 0x43, 0x58, 0x70, 0x92, 0xB8, 0x41, 0x7A, 0x05, 0x3F, 0x1F, 0xA7,
+ 0x0B, 0x5B, 0x29, 0xB1, 0x6C, 0x76, 0xB3, 0x44, 0x6C, 0x6F, 0x82, 0x74, 0x10, 0xAB, 0xF0, 0x29,
+ 0x20, 0x6D, 0x00, 0x1E, 0x42, 0x89, 0x8B, 0x79, 0x4B, 0x6A, 0xF0, 0x9D, 0x5E, 0x1C, 0x05, 0x7B,
+ 0x2B, 0x57, 0xB3, 0x45, 0xBF, 0x5A, 0x72, 0x46, 0x01, 0xFB, 0xF6, 0x03, 0x14, 0xBB, 0x1A, 0x1C,
+ 0x62, 0xCA, 0x9B, 0x40, 0xB9, 0xAE, 0x48, 0x4A, 0xC9, 0x0E, 0x0A, 0x26, 0x85, 0x2C, 0x01, 0x92,
+ 0x3F, 0xE1, 0x22, 0x3B, 0xBC, 0x25, 0xF6, 0x08, 0xB7, 0x7E, 0x94, 0x45, 0x18, 0x9B, 0x48, 0xEE,
+ 0x5E, 0xD0, 0xC6, 0x74, 0x34, 0xAF, 0x6E, 0x66, 0xBC, 0x0C, 0xAA, 0x6D, 0xD6, 0x1A, 0xC1, 0x0F,
+ 0xAC, 0xF6, 0x97, 0x20, 0xCF, 0xF3, 0x9A, 0x78, 0xCA, 0x1B, 0x9F, 0x25, 0x52, 0x3D, 0xA9, 0x35,
+ 0x0D, 0xEA, 0x12, 0xCF, 0x0C, 0x32, 0x53, 0x5A, 0x55, 0x4B, 0x99, 0x05, 0x80, 0x56, 0xB6, 0xE2,
+ 0x59, 0xC8, 0x37, 0x0F, 0x4C, 0x79, 0xEF, 0xE5, 0xE0, 0x41, 0x0A, 0x4C, 0x1E, 0x5F, 0x85, 0x90,
+ 0xC7, 0x66, 0x28, 0xAB, 0xD7, 0xF1, 0x91, 0x60, 0xE7, 0x77, 0x28, 0x01, 0x7C, 0xA8, 0x2A, 0x23,
+ 0x84, 0x76, 0x91, 0xAA, 0x65, 0xA4, 0xFF, 0xEC, 0xA2, 0x02, 0x36, 0x9A, 0x43, 0x18, 0xAA, 0x0F,
+ 0x81, 0x26, 0x8F, 0x8B, 0x9C, 0x46, 0x2C, 0x53, 0x63, 0x01, 0x5C, 0x44, 0x4B, 0xBC, 0x28, 0xEA,
+ 0x2F, 0x4E, 0x57, 0x72, 0x35, 0xA3, 0x85, 0x4F, 0x27, 0x22, 0xB5, 0x92, 0x5F, 0x5B, 0xD0, 0x78,
+ 0x49, 0xAF, 0x42, 0x1F, 0x0B, 0x19, 0x9E, 0x17, 0xB0, 0xA6, 0xFB, 0x2F, 0xD7, 0x82, 0x60, 0x11,
+ 0xB6, 0x63, 0x4C, 0x65, 0x44, 0xD1, 0xB4, 0x9A, 0xDA, 0x7A, 0xF8, 0x6E, 0xA5, 0xAE, 0x55, 0x32,
+ 0x46, 0xDD, 0xE5, 0xB8, 0xC3, 0xC6, 0xDC, 0xC4, 0x49, 0x2C, 0x35, 0x2A, 0x2F, 0xFE, 0x85, 0xEE,
+ 0xD0, 0xD7, 0x5E, 0xF1, 0xD9, 0xE9, 0x23, 0xCB, 0x96, 0xAE, 0x30, 0x22, 0x54, 0x80, 0x93, 0x9A,
+ 0xD5, 0x7C, 0x0A, 0xF9, 0x47, 0x1F, 0x02, 0x80, 0x21, 0xFF, 0x53, 0x39, 0xC6, 0xB7, 0x73, 0xDE,
+ 0x4B, 0x03, 0xC8, 0xB7, 0xBF, 0x34, 0x0F, 0xCB, 0x37, 0xD1, 0x5F, 0x53, 0x5F, 0x05, 0x62, 0x2D,
+ 0x62, 0xC4, 0xB6, 0xED, 0x82, 0xC3, 0x19, 0x09, 0xFD, 0xC8, 0x93, 0xAB, 0x63, 0xB2, 0xA5, 0x6B,
+ 0x97, 0x82, 0x37, 0x29, 0xBF, 0x97, 0x54, 0xFE, 0x9B, 0x32, 0xFD, 0x51, 0xE9, 0x14, 0xE1, 0x74,
+ 0x07, 0x2B, 0xFA, 0x39, 0x1C, 0x6A, 0x5B, 0xA3, 0x5B, 0x7E, 0xB6, 0xD9, 0x66, 0x82, 0x0D, 0xF9,
+ 0xD7, 0x9C, 0x64, 0xE8, 0x2A, 0x73, 0x98, 0x95, 0x31, 0xCF, 0xAE, 0xBE, 0x6D, 0x57, 0x69, 0x34,
+ 0x4E, 0x58, 0x0A, 0xD1, 0x5A, 0x94, 0x8F, 0xFE, 0xF5, 0xD6, 0x4E, 0x73, 0xC0, 0x96, 0x4E, 0xFD,
+ 0x21, 0x25, 0xC4, 0xB6, 0x11, 0xFA, 0xA7, 0x41, 0x7E, 0xB2, 0xFC, 0x42, 0x14, 0x16, 0x90, 0xC9,
+ 0x74, 0x5D, 0x4A, 0x25, 0x73, 0xE1, 0x63, 0x7E, 0x81, 0xF9, 0x3F, 0x8E, 0x24, 0x4C, 0x61, 0x02,
+ 0xD5, 0xF8, 0xB2, 0x2E, 0xF3, 0x80, 0x79, 0xBF, 0x13, 0xA0, 0x38, 0xC7, 0x0E, 0x4E, 0x2C, 0x22,
+ 0x46, 0x0E, 0x29, 0xEE, 0x2A, 0x8C, 0xDD, 0x86, 0x33, 0xB7, 0xF0, 0xCC, 0x0F, 0x13, 0x7E, 0x03,
+ 0x07, 0xB3, 0x3E, 0x97, 0xC5, 0x6F, 0xDC, 0xFF, 0x96, 0x23, 0xCB, 0x69, 0x8B, 0x86, 0x94, 0x6D,
+ 0x86, 0xEF, 0x2F, 0x5C, 0x31, 0x7F, 0xF7, 0x22, 0x96, 0x61, 0x88, 0x75, 0x3C, 0x76, 0x97, 0x12,
+ 0x1A, 0xEF, 0x70, 0x7D, 0x6A, 0x17, 0xF5, 0xB1, 0xB5, 0x68, 0x50, 0x91, 0xDD, 0x88, 0x0F, 0xCB,
+ 0x33, 0x73, 0xB9, 0xBF, 0xC6, 0x65, 0xAE, 0x15, 0x6B, 0x20, 0xCF, 0x8A, 0xDF, 0xDF, 0x5D, 0xAD,
+ 0xE8, 0x45, 0x69, 0x7D, 0x1C, 0x1B, 0xF2, 0xAC, 0xCD, 0x9D, 0x9F, 0xB8, 0x6D, 0x57, 0x16, 0x92,
+ 0xCC, 0x1A, 0xF2, 0xC2, 0x62, 0xEE, 0xE2, 0x71, 0x2D, 0x58, 0xAB, 0xB7, 0x60, 0x4D, 0xDB, 0xEF,
+ 0x88, 0xC2, 0x2B, 0x39, 0x8B, 0x4C, 0x0F, 0xEF, 0xEB, 0x86, 0x16, 0x34, 0x49, 0x9E, 0x1E, 0x24,
+ 0xFC, 0xE9, 0x77, 0x2A, 0xD2, 0x75, 0x76, 0x96, 0x24, 0xD3, 0x33, 0x4D, 0x8B, 0xDD, 0x92, 0xBE,
+ 0xBF, 0xE5, 0xB0, 0x12, 0x92, 0x0C, 0x89, 0xD8, 0x73, 0xE2, 0xA6, 0xD7, 0xF3, 0x15, 0x59, 0x76,
+ 0x9F, 0x3B, 0x10, 0xC1, 0xA4, 0x9B, 0x64, 0xC8, 0x4B, 0xD4, 0xEE, 0x63, 0xA7, 0xF7, 0xE9, 0xB4,
+ 0x43, 0x50, 0xC4, 0x7B, 0xE1, 0x7A, 0x53, 0x6D, 0xC8, 0x17, 0x82, 0x31, 0xE4, 0x53, 0xF3, 0x20,
+ 0xF0, 0xE9, 0x78, 0xAF, 0x8F, 0x95, 0x96, 0xA8, 0xE9, 0x0E, 0xFE, 0x10, 0x51, 0x8E, 0xF1, 0x64,
+ 0x89, 0x2B, 0x0B, 0xE1, 0xCE, 0xA1, 0xA9, 0xCA, 0xF0, 0xD4, 0xD3, 0xAA, 0x49, 0xE3, 0x68, 0x76,
+ 0xDE, 0x20, 0x77, 0xCB, 0x92, 0x60, 0x36, 0x66, 0x82, 0x06, 0x6D, 0xDF, 0x11, 0xF7, 0xA3, 0x07,
+ 0x43, 0x18, 0x48, 0x89, 0x40, 0x19, 0x72, 0xAD, 0xF5, 0x06, 0x0B, 0x61, 0x87, 0xD9, 0x48, 0x17,
+ 0x8A, 0x0D, 0xC8, 0x6C, 0xD9, 0xC9, 0x9D, 0xEE, 0x08, 0x16, 0x1F, 0x0D, 0x88, 0xB5, 0xEF, 0x5B,
+ 0x2F, 0x40, 0xAE, 0x71, 0x0F, 0x02, 0x96, 0xAF, 0x2C, 0xC8, 0x8E, 0x86, 0x64, 0x58, 0xF1, 0x7C,
+ 0xE9, 0x86, 0xDB, 0xCF, 0x57, 0x5E, 0xF9, 0x57, 0x7E, 0x85, 0xAE, 0x8B, 0x6A, 0x1E, 0x9B, 0x2B,
+ 0x0D, 0xE2, 0x07, 0xDE, 0x42, 0x76, 0x79, 0x72, 0x25, 0xBB, 0xD6, 0xDA, 0xD8, 0x8D, 0xE4, 0x34,
+ 0xF6, 0xC6, 0xBB, 0x00, 0x62, 0x22, 0x4D, 0x0F, 0x90, 0xD1, 0x35, 0x20, 0x6B, 0x3C, 0x43, 0xB2,
+ 0xBF, 0xED, 0xCA, 0x5D, 0xC2, 0x0F, 0x5A, 0x94, 0x87, 0xE3, 0x61, 0x94, 0x85, 0xE4, 0x24, 0x63,
+ 0xEF, 0x8C, 0xD9, 0x7B, 0xEE, 0x24, 0x5C, 0x51, 0x4A, 0xF1, 0x6B, 0xEB, 0xD6, 0x5A, 0x0F, 0xCE,
+ 0x3B, 0x29, 0xAE, 0x86, 0xAA, 0xFF, 0xEC, 0x66, 0x54, 0x45, 0xA4, 0x86, 0xD1, 0x3F, 0x2C, 0xEF,
+ 0xF1, 0x71, 0x33, 0x4E, 0xB8, 0x16, 0x1A, 0xB2, 0x18, 0x6E, 0xCD, 0xBA, 0x59, 0xDB, 0x52, 0xE8,
+ 0x49, 0x78, 0x75, 0x5C, 0x9F, 0x97, 0xB7, 0x00, 0x57, 0x11, 0xB1, 0x9D, 0x99, 0x0C, 0xA2, 0x54,
+ 0xDD, 0x0A, 0x03, 0xF5, 0xAA, 0x0D, 0xBF, 0x47, 0x2D, 0xC0, 0x41, 0x3A, 0x29, 0x0A, 0xA5, 0x8C,
+ 0x77, 0x38, 0xA5, 0x4F, 0xE9, 0x9C, 0x7E, 0x23, 0x7E, 0xEF, 0x8F, 0xB3, 0x45, 0x96, 0xA5, 0xDC,
+ 0xAC, 0x1A, 0x44, 0xEE, 0xE4, 0x1C, 0x17, 0x01, 0x7E, 0x26, 0x9D, 0xA0, 0x90, 0xD8, 0x4F, 0x5A,
+ 0x14, 0x99, 0x46, 0x51, 0x1F, 0x29, 0xFA, 0xE2, 0xB6, 0xEB, 0x71, 0x1A, 0xF4, 0xE2, 0x59, 0x32,
+ 0x18, 0x66, 0x31, 0x73, 0x58, 0x23, 0xF3, 0xDC, 0xCB, 0x73, 0xBF, 0x04, 0xB5, 0xBD, 0xAD, 0x4D,
+ 0x67, 0x96, 0x84, 0xFA, 0x60, 0x48, 0x97, 0x32, 0xED, 0x55, 0xB1, 0x90, 0xD3, 0x15, 0xFA, 0xD9,
+ 0xE4, 0x9E, 0x65, 0x72, 0x8D, 0xC5, 0x16, 0x99, 0xC9, 0xE7, 0xF7, 0x29, 0xAD, 0xF7, 0xDB, 0x4C,
+ 0x0A, 0xD0, 0x40, 0xBE, 0x26, 0xF4, 0xC3, 0x89, 0x70, 0xE1, 0x82, 0xF1, 0x95, 0xB3, 0xB8, 0x64,
+ 0xE4, 0xBA, 0x2E, 0x4C, 0x4A, 0x93, 0x41, 0x21, 0xF1, 0xBD, 0x2C, 0x8E, 0x15, 0xFC, 0xC2, 0x33,
+ 0x9E, 0x76, 0xAD, 0xCE, 0x93, 0xED, 0x4D, 0x04, 0x27, 0x71, 0xDB, 0x21, 0x0A, 0xDE, 0x48, 0xAD,
+ 0x43, 0x6F, 0xF7, 0x97, 0x7B, 0xBC, 0xCD, 0x5A, 0xDE, 0x60, 0x07, 0x07, 0x2A, 0x83, 0xF4, 0x25,
+ 0x6A, 0xD1, 0xBF, 0xB2, 0x3B, 0xF7, 0x4E, 0x46, 0xB0, 0x34, 0xC2, 0x93, 0x45, 0xB9, 0xE6, 0x32,
+ 0x8E, 0x75, 0x67, 0x12, 0x06, 0x46, 0x7B, 0xB1, 0xD6, 0xEC, 0x91, 0x73, 0x87, 0x99, 0x3E, 0x9E,
+ 0xBB, 0xAC, 0x0C, 0x94, 0xCC, 0xBD, 0x33, 0xCF, 0x27, 0x65, 0x70, 0x18, 0x49, 0x27, 0xD9, 0xAF,
+ 0x17, 0x43, 0x16, 0x99, 0xD3, 0x0A, 0xB9, 0xE9, 0xD6, 0x4A, 0xDE, 0x9C, 0x9C, 0x3F, 0xE8, 0x25,
+ 0xB8, 0xB9, 0xAE, 0xB6, 0x5B, 0xD5, 0x9E, 0x5E, 0x41, 0x41, 0xDE, 0xC8, 0x8E, 0xE3, 0xEC, 0x88,
+ 0xE8, 0xD6, 0x09, 0x16, 0xAB, 0x5C, 0x93, 0xC5, 0xAC, 0xA8, 0x70, 0x14, 0x8B, 0x9D, 0x87, 0x27,
+ 0xC9, 0x07, 0x83, 0x94, 0xD3, 0xBD, 0x38, 0xF8, 0x92, 0xB9, 0xB0, 0xFB, 0xC2, 0xCF, 0x69, 0x0A,
+ 0x6E, 0x39, 0xB4, 0x11, 0xD7, 0x54, 0xCF, 0x2C, 0x87, 0x94, 0x7E, 0xD8, 0x6D, 0xED, 0x54, 0xDF,
+ 0xBA, 0xF6, 0x57, 0x2E, 0xE6, 0x5B, 0x26, 0x3E, 0xD2, 0xA3, 0xE6, 0xB3, 0x9B, 0x75, 0xD5, 0xBD,
+ 0x76, 0x9E, 0xE5, 0x82, 0xA8, 0x4A, 0x2B, 0xC5, 0x45, 0x80, 0xC5, 0x55, 0x0A, 0x72, 0x78, 0x58,
+ 0x3E, 0x88, 0x9D, 0x7D, 0x7C, 0x23, 0xE8, 0xCD, 0x1C, 0xAF, 0x7C, 0x43, 0xB1, 0xE0, 0x19, 0x96,
+ 0x5C, 0xBC, 0xF7, 0x2A, 0x60, 0xF2, 0x50, 0x54, 0xCC, 0xE7, 0xF4, 0xD7, 0x2D, 0xDF, 0x03, 0xBB,
+ 0x77, 0xCE, 0x9C, 0xB3, 0x9F, 0xC0, 0xBC, 0xC3, 0xBB, 0x47, 0xC6, 0xAE, 0x1A, 0x0A, 0x57, 0x52,
+ 0xA5, 0x75, 0xB5, 0x32, 0x62, 0x9A, 0x11, 0xD6, 0x45, 0x03, 0xFC, 0xAA, 0x43, 0x55, 0x4D, 0xDC,
+ 0xE8, 0x0F, 0xBC, 0x46, 0x5B, 0x57, 0x37, 0x9F, 0xD4, 0x5E, 0xFC, 0xD4, 0x7A, 0x1B, 0x67, 0xB7,
+ 0x2A, 0xBE, 0x6A, 0x58, 0xF6, 0x21, 0x20, 0x29, 0x90, 0xC9, 0xB1, 0x25, 0x05, 0xF2, 0x95, 0x5F,
+ 0xA2, 0x3E, 0x39, 0xFC, 0xF0, 0x08, 0x61, 0xE5, 0xB2, 0x9A, 0xFB, 0xE0, 0x9D, 0x40, 0x5D, 0xE4,
+ 0x2D, 0x62, 0x37, 0x8E, 0x02, 0x5A, 0xA1, 0xD5, 0x63, 0x9A, 0xE2, 0x77, 0x46, 0xC6, 0xD1, 0x10,
+ 0xAA, 0x46, 0x1D, 0x22, 0x46, 0x2F, 0xE9, 0x95, 0xF4, 0xD5, 0x69, 0xE6, 0x70, 0xDC, 0x09, 0x4E,
+ 0x0D, 0xA6, 0xD6, 0x16, 0x97, 0xD1, 0x4C, 0xD3, 0xD7, 0x0B, 0x4C, 0x97, 0x66, 0xC0, 0x3F, 0x91,
+ 0xB0, 0x9E, 0x2F, 0x00, 0xF1, 0x10, 0x78, 0x50, 0x9F, 0xC6, 0x38, 0xC5, 0x46, 0xB0, 0x45, 0x53,
+ 0x4F, 0x01, 0x7C, 0x46, 0xB2, 0x85, 0xBE, 0x89, 0xB3, 0x99, 0x33, 0xCB, 0x84, 0x07, 0x45, 0x40,
+ 0x16, 0x0E, 0x2F, 0xE7, 0x5D, 0x0E, 0xFE, 0xF7, 0x68, 0xF3, 0x70, 0xED, 0x8C, 0x82, 0x2F, 0x48,
+ 0x65, 0xD2, 0xCD, 0x3E, 0x65, 0xC3, 0xCD, 0x7A, 0x3D, 0xAD, 0xA0, 0xB4, 0x29, 0x57, 0x26, 0xF1,
+ 0xFF, 0xA1, 0x92, 0x9F, 0x64, 0xAF, 0x1D, 0xB4, 0xF1, 0xDD, 0x4F, 0xC8, 0x1C, 0x1A, 0x8A, 0x26,
+ 0x3D, 0xBC, 0xC8, 0x57, 0x92, 0xDB, 0xAA, 0x5D, 0x5B, 0x7F, 0x77, 0xC5, 0x47, 0x02, 0x34, 0x25,
+ 0x60, 0xC5, 0x7B, 0x8C, 0x84, 0x30, 0x9D, 0xF2, 0x8A, 0x14, 0x6D, 0x55, 0x14, 0xA4, 0xA2, 0x56,
+ 0xFC, 0x26, 0x9F, 0x1B, 0x66, 0xCC, 0x5F, 0x69, 0xF5, 0x9B, 0x43, 0xA0, 0xFC, 0x84, 0x00, 0x1F,
+ 0x85, 0x6A, 0x9C, 0x23, 0x99, 0x6F, 0xF1, 0xFC, 0x8E, 0x07, 0xC4, 0x62, 0x73, 0xEA, 0xFD, 0x7F,
+ 0x92, 0x28, 0xE1, 0xC1, 0x51, 0x5B, 0xDC, 0x2D, 0xB1, 0x88, 0xE5, 0x8C, 0x69, 0x18, 0xF3, 0xD7,
+ 0xFF, 0x76, 0x35, 0x83, 0x0A, 0x54, 0x59, 0x22, 0x31, 0x83, 0x26, 0xB8, 0x5F, 0x26, 0xA7, 0x73,
+ 0x50, 0xB1, 0xB7, 0x53, 0x82, 0x2C, 0x15, 0x65, 0xDF, 0xF9, 0x5E, 0x2A, 0x9A, 0x7E, 0x19, 0xEE,
+ 0xBE, 0xDE, 0xA8, 0xB2, 0x82, 0x58, 0x06, 0xE1, 0xD1, 0xAB, 0xE6, 0x15, 0x7A, 0x31, 0x1B, 0x4B,
+ 0xF6, 0xEE, 0x49, 0x25, 0xB3, 0x68, 0xFE, 0x25, 0x6C, 0x46, 0x9B, 0x88, 0xFA, 0x4C, 0xFC, 0x90,
+ 0xA5, 0x6B, 0x40, 0x07, 0xDB, 0xA5, 0xE5, 0x97, 0x20, 0xD5, 0xE3, 0x0A, 0xC9, 0xB8, 0x55, 0xDD,
+ 0x9B, 0xBA, 0x11, 0x06, 0x4C, 0x3D, 0x34, 0x09, 0xD1, 0xAA, 0x87, 0x5B, 0x95, 0xDD, 0xF9, 0x5D,
+ 0x7E, 0x53, 0xE3, 0x31, 0x46, 0xAB, 0x33, 0x12, 0x0B, 0xB8, 0xEB, 0x4C, 0x2F, 0x95, 0x0D, 0x39,
+ 0xD5, 0xB4, 0xED, 0x96, 0xCE, 0xC0, 0x5A, 0xA3, 0x16, 0xB8, 0x9A, 0x68, 0xDC, 0xE9, 0x3B, 0xC6,
+ 0x36, 0x75, 0x8C, 0x8E, 0x25, 0x97, 0xF7, 0x81, 0xC2, 0xAC, 0x3F, 0x5E, 0x6B, 0x4C, 0x7E, 0x95,
+ 0xAE, 0xD1, 0x50, 0x91, 0x15, 0x67, 0x8E, 0xC8, 0xF2, 0x81, 0x8A, 0x6B, 0xBF, 0x4B, 0xC6, 0xAF,
+ 0xCD, 0x04, 0xCC, 0x16, 0xA2, 0x43, 0x7A, 0x78, 0x56, 0xC1, 0x7E, 0xC8, 0xBE, 0x91, 0x9D, 0x7B,
+ 0x9C, 0xAC, 0x7E, 0x18, 0xFA, 0xEB, 0xAD, 0x1F, 0x28, 0xE0, 0x61, 0x81, 0xC3, 0xD3, 0x24, 0x78,
+ 0x08, 0xE6, 0xD5, 0x91, 0x83, 0x36, 0xA4, 0x1A, 0xB8, 0xCF, 0x93, 0x4F, 0x26, 0x6C, 0xC1, 0x7F,
+ 0x48, 0x93, 0xD2, 0xD6, 0xC2, 0x33, 0x5C, 0x9D, 0x3F, 0x84, 0x7C, 0xD7, 0x8B, 0xBC, 0x9A, 0xDC,
+ 0x46, 0x84, 0xCC, 0x72, 0xF7, 0x7C, 0xEE, 0xA8, 0x37, 0x54, 0x77, 0xD8, 0x21, 0x44, 0xA3, 0x3A,
+ 0xBD, 0xCF, 0x65, 0xF3, 0xDB, 0xD0, 0x6F, 0xCA, 0x19, 0xCD, 0xAC, 0xBD, 0x66, 0x92, 0x89, 0xDF,
+ 0x2B, 0xFE, 0x8D, 0x28, 0xBA, 0x79, 0x5B, 0xBF, 0x66, 0x67, 0x05, 0xE9, 0xA6, 0xFD, 0x56, 0xD6,
+ 0x63, 0x8A, 0x23, 0x01, 0x24, 0x5A, 0x6D, 0x43, 0xCD, 0x26, 0x13, 0x2E, 0x48, 0x46, 0x01, 0x20,
+ 0x52, 0x5A, 0xD8, 0x34, 0x75, 0xF5, 0x4E, 0x63, 0x56, 0x17, 0x35, 0x10, 0x29, 0x4B, 0xDD, 0x0B,
+ 0xA5, 0xAF, 0x95, 0x92, 0xEE, 0x11, 0x99, 0xD2, 0xEA, 0x30, 0x80, 0x16, 0xB3, 0xF8, 0x96, 0x24,
+ 0xED, 0x98, 0x5F, 0x4F, 0x02, 0xBB, 0x69, 0xDD, 0x30, 0x1C, 0xBE, 0x3F, 0x1B, 0x33, 0x2A, 0xA7,
+ 0x83, 0xD7, 0x0E, 0x3D, 0x49, 0x58, 0xEF, 0x61, 0x0D, 0x1C, 0x6B, 0x1B, 0x41, 0xB7, 0xB3, 0x64,
+ 0xF9, 0xE1, 0x1F, 0xF2, 0x4B, 0xC8, 0xED, 0xC7, 0xEE, 0x3A, 0xCB, 0xCD, 0x18, 0x40, 0x28, 0x2F,
+ 0x1C, 0x41, 0x02, 0x31, 0x7A, 0xC3, 0x71, 0x75, 0x21, 0x49, 0x65, 0x6D, 0x32, 0xAC, 0x06, 0x42,
+ 0x11, 0x96, 0xB2, 0xEC, 0xD9, 0x5D, 0xD3, 0xB4, 0xB1, 0x21, 0xFF, 0x98, 0x9F, 0xD6, 0x77, 0x70,
+ 0x6B, 0xA4, 0x6E, 0x45, 0x69, 0x8C, 0xDB, 0x77, 0x92, 0x80, 0xF3, 0x82, 0x95, 0x2E, 0x73, 0xA6,
+ 0x7E, 0xAA, 0x6F, 0xE2, 0x78, 0x82, 0x9E, 0x78, 0x3C, 0xB7, 0x5A, 0x90, 0xA0, 0xE8, 0xB4, 0x5D,
+ 0x7A, 0xA8, 0xCE, 0xAC, 0xBA, 0x00, 0xEA, 0x0F, 0xDF, 0x6B, 0x75, 0x4C, 0x0D, 0x1C, 0x30, 0x7F,
+ 0x6E, 0xFA, 0x03, 0xDC, 0x6B, 0x48, 0xE0, 0x74, 0xD9, 0xB9, 0x67, 0x9D, 0x0B, 0x55, 0xD3, 0xFE,
+ 0x68, 0x79, 0xF7, 0x10, 0x7F, 0x9E, 0xE1, 0xB9, 0x60, 0xE7, 0x54, 0x13, 0x67, 0x2C, 0x04, 0x48,
+ 0xDF, 0xD9, 0x85, 0x2C, 0xFF, 0x1E, 0x01, 0x61, 0x0F, 0x74, 0x2C, 0x21, 0x69, 0x3F, 0xE6, 0x7A,
+ 0xF3, 0xD7, 0xE6, 0xD3, 0xBF, 0x77, 0x83, 0xC8, 0xF5, 0x5D, 0xF4, 0x4D, 0xC6, 0x0B, 0xEC, 0x46,
+ 0x39, 0xDA, 0xBD, 0x39, 0x51, 0xB9, 0xF2, 0xC3, 0x48, 0x41, 0xDA, 0x1E, 0x2F, 0xD8, 0xFB, 0x7F,
+ 0x9E, 0x9C, 0x10, 0xF1, 0xB2, 0x2A, 0x14, 0xD1, 0x3C, 0x38, 0x0F, 0x21, 0x9D, 0xAF, 0x64, 0x95,
+ 0x46, 0x6A, 0xD2, 0x28, 0x14, 0x16, 0xF0, 0x28, 0x43, 0xC9, 0x81, 0x1D, 0x1E, 0xB7, 0x0D, 0x84,
+ 0x8B, 0x30, 0xFD, 0xE3, 0xBB, 0x46, 0x5E, 0xFD, 0xEA, 0x0A, 0x9E, 0x02, 0x3F, 0x5E, 0xE5, 0x00,
+ 0x97, 0xFB, 0x0D, 0xEA, 0xF8, 0x66, 0x7F, 0xB3, 0x6D, 0x2E, 0xFD, 0xC8, 0x15, 0x97, 0xE0, 0xDB,
+ 0x44, 0x59, 0xBC, 0x32, 0xB7, 0x70, 0x61, 0x88, 0xC9, 0x81, 0x21, 0xA4, 0x82, 0x8D, 0x27, 0x67,
+ 0x33, 0x31, 0xE5, 0x6B, 0x94, 0x26, 0xB9, 0xC3, 0xB8, 0x45, 0x69, 0x5D, 0x0B, 0xD2, 0xB1, 0x3A,
+ 0x03, 0x40, 0x8B, 0x06, 0x79, 0x76, 0x63, 0x24, 0x61, 0xB9, 0x26, 0x64, 0x14, 0xC3, 0x9C, 0x9A,
+ 0xFA, 0xD9, 0xBF, 0x7B, 0x6A, 0xB3, 0x2B, 0x9C, 0x9A, 0x8D, 0x9A, 0x11, 0x9B, 0xF7, 0x9D, 0xD2,
+ 0xF8, 0xE4, 0x74, 0x6D, 0x5E, 0x12, 0xD9, 0xC2, 0xE3, 0x7D, 0xDE, 0xDA, 0x57, 0xD6, 0xEF, 0x9A,
+ 0xB1, 0x13, 0xF0, 0xC5, 0x99, 0x5B, 0x88, 0xE2, 0x9B, 0xDF, 0x3B, 0x62, 0x9F, 0x3C, 0x10, 0x38,
+ 0x91, 0xFA, 0x97, 0x82, 0x44, 0x36, 0x65, 0x8C, 0xA2, 0x47, 0x9B, 0x10, 0x12, 0x96, 0xA1, 0x4E,
+ 0x0E, 0x57, 0x42, 0x62, 0xF4, 0xE6, 0xAF, 0x23, 0xC0, 0xB4, 0xA0, 0x49, 0x5A, 0x33, 0xA9, 0x4D,
+ 0xB1, 0xB0, 0x5B, 0x0C, 0x6A, 0x67, 0x47, 0xFB, 0x03, 0x7C, 0x1F, 0x15, 0xA1, 0x72, 0x99, 0xBE,
+ 0x84, 0x58, 0x68, 0x36, 0x13, 0x34, 0x0C, 0x20, 0x11, 0xDB, 0x68, 0x30, 0x9F, 0xEA, 0x05, 0x99,
+ 0xDC, 0x30, 0xF3, 0xA7, 0xA9, 0x3C, 0x7D, 0xA8, 0x3C, 0x0D, 0x43, 0xCB, 0xCC, 0xA5, 0x40, 0xCF,
+ 0x0F, 0xF4, 0x34, 0x91, 0x79, 0x36, 0xB8, 0x4D, 0x25, 0x3E, 0xF7, 0x69, 0xC7, 0x31, 0x9D, 0x45,
+ 0xEC, 0x3C, 0x3D, 0x99, 0x13, 0x54, 0x19, 0x3D, 0xDD, 0x2B, 0xE9, 0x6B, 0xE0, 0xCE, 0xB7, 0xBF,
+ 0x8F, 0x47, 0x0F, 0x1A, 0x43, 0x14, 0x4C, 0xAB, 0xD4, 0xEE, 0xAC, 0x55, 0x0C, 0x4D, 0x7E, 0xA5,
+ 0x40, 0xE9, 0xD0, 0x0A, 0xC0, 0xCD, 0xB8, 0xB4, 0x31, 0x63, 0xEB, 0x78, 0xE9, 0x32, 0x19, 0xE3,
+ 0xFB, 0xA4, 0xCF, 0x48, 0x39, 0x92, 0xA5, 0xAA, 0xA0, 0x4E, 0xA1, 0xF3, 0x2E, 0x1A, 0x59, 0x62,
+ 0xA4, 0xC0, 0x7B, 0xAC, 0xCA, 0xAD, 0x52, 0xA4, 0xB7, 0x6F, 0x4B, 0x67, 0x5E, 0x5E, 0x2A, 0xE0,
+ 0xEC, 0x9B, 0xA7, 0xD6, 0x65, 0xD4, 0x60, 0xF3, 0x48, 0xDF, 0x45, 0xF3, 0xFD, 0xB5, 0x0F, 0xC9,
+ 0xE6, 0x10, 0x78, 0x4D, 0xAD, 0x30, 0xD1, 0x07, 0xEA, 0x38, 0x6A, 0xE3, 0x3B, 0x10, 0x99, 0x1A,
+ 0xA6, 0xDE, 0x2D, 0x9D, 0x1D, 0xCE, 0x5D, 0x26, 0x76, 0x25, 0x87, 0x43, 0xA1, 0xBD, 0xE9, 0xA9,
+ 0xB8, 0xA0, 0x1E, 0x88, 0x1A, 0x6A, 0x99, 0x79, 0x01, 0x32, 0x3A, 0x4C, 0x3B, 0xC1, 0xB5, 0x18,
+ 0x72, 0x32, 0x0F, 0x7B, 0x91, 0x38, 0x66, 0x8A, 0x16, 0x12, 0xAF, 0xBE, 0x5F, 0x73, 0xA3, 0x0A,
+ 0x1D, 0x97, 0x35, 0x87, 0x53, 0x27, 0xB6, 0x5B, 0x43, 0x12, 0xB4, 0xEC, 0xF0, 0x2F, 0x16, 0x59,
+ 0x6E, 0x11, 0x2C, 0x20, 0x11, 0xAB, 0x84, 0x2B, 0x7F, 0x9C, 0x82, 0x19, 0x5D, 0xD3, 0x9A, 0x18,
+ 0xA2, 0xFF, 0x38, 0x7A, 0x07, 0xD3, 0xBE, 0x23, 0x5C, 0x33, 0x00, 0x99, 0xFE, 0xE0, 0xFC, 0xC0,
+ 0x35, 0x05, 0x89, 0xFF, 0x58, 0x93, 0x20, 0x41, 0xDC, 0xD0, 0x27, 0x31, 0xA0, 0xD5, 0xAC, 0xBF,
+ 0x78, 0x87, 0x23, 0x33, 0xBF, 0x52, 0xE2, 0xDB, 0x24, 0xB8, 0x83, 0xE1, 0x26, 0x42, 0x8C, 0x1D,
+ 0xD4, 0xD4, 0xFC, 0xE3, 0x34, 0xF4, 0x5D, 0x98, 0x17, 0xA1, 0xC4, 0x2A, 0x48, 0x3C, 0x4E, 0x89,
+ 0x7D, 0x03, 0x38, 0xE3, 0x13, 0x66, 0xD4, 0x76, 0xB2, 0x93, 0xD2, 0x9C, 0x75, 0x3F, 0xD3, 0x91,
+ 0x34, 0xAF, 0x61, 0x55, 0x1D, 0xE8, 0x4C, 0x2F, 0x59, 0x2A, 0x64, 0x05, 0xB9, 0x1D, 0xC1, 0x0B,
+ 0x1F, 0x4B, 0xFF, 0x83, 0xAB, 0xBE, 0xB7, 0xB5, 0xF2, 0x23, 0x78, 0xD1, 0xA3, 0x81, 0x8F, 0xF2,
+ 0x7C, 0xC6, 0xE7, 0x9F, 0x29, 0xD2, 0x81, 0xFE, 0x50, 0x1C, 0xE7, 0xEF, 0xBF, 0x7F, 0x1C, 0x2A,
+ 0x3F, 0x1A, 0x7C, 0x5E, 0xF7, 0xF5, 0x1B, 0x11, 0x8D, 0xB1, 0xF3, 0xC7, 0xE3, 0x38, 0x43, 0x56,
+ 0x1A, 0x1E, 0x26, 0xE6, 0xD4, 0x15, 0x84, 0x03, 0x04, 0x49, 0xBD, 0xA0, 0xC0, 0x21, 0xC8, 0x8E,
+ 0xC9, 0x96, 0x9B, 0xFA, 0xCA, 0x98, 0xAE, 0x2F, 0xE2, 0x9A, 0x9B, 0xEC, 0x29, 0x8F, 0xF2, 0x04,
+ 0xEA, 0x94, 0xB9, 0x70, 0xED, 0xB1, 0x4E, 0x2B, 0x5C, 0x65, 0x00, 0x79, 0x41, 0x53, 0x4B, 0x9D,
+ 0xFA, 0x90, 0x22, 0x52, 0x76, 0x51, 0xEC, 0xC2, 0x50, 0xCC, 0x6C, 0xA1, 0x5B, 0x4A, 0xAC, 0x58,
+ 0x8F, 0x97, 0x0D, 0xFE, 0xE5, 0x3C, 0x24, 0x34, 0xDC, 0xF2, 0x7A, 0x81, 0xA7, 0x9D, 0x3D, 0x28,
+ 0x87, 0xCF, 0xF3, 0xD2, 0x51, 0x0D, 0xF1, 0x5C, 0x01, 0xD5, 0x58, 0x72, 0x33, 0xD7, 0x48, 0x4A,
+ 0x75, 0xF5, 0x1A, 0x10, 0xF1, 0x12, 0x76, 0x70, 0xD2, 0x0E, 0x3A, 0x9B, 0x09, 0x23, 0x66, 0xED,
+ 0x15, 0xB7, 0xEB, 0x5D, 0xEF, 0x66, 0xEB, 0x8F, 0xAF, 0xD7, 0xDC, 0xF6, 0x5E, 0xA5, 0xED, 0xA8,
+ 0x77, 0xE2, 0xC0, 0xF6, 0x19, 0xFE, 0x38, 0xEC, 0x2D, 0xCC, 0x82, 0xC6, 0x21, 0x22, 0x69, 0x67,
+ 0xE4, 0x86, 0x26, 0x0E, 0xCC, 0x88, 0x55, 0x6A, 0x17, 0xC6, 0xD0, 0x5F, 0x1C, 0x68, 0x72, 0x08,
+ 0x2D, 0x8B, 0xB7, 0xD7, 0xAF, 0x85, 0x0C, 0xC5, 0x9F, 0x4F, 0x6D, 0x0B, 0x34, 0xA2, 0x8D, 0x6D,
+ 0x92, 0x31, 0x6C, 0x92, 0x91, 0xFE, 0x3F, 0xC0, 0xA5, 0x4A, 0x58, 0xA7, 0x23, 0x06, 0xA7, 0xE3,
+ 0xAF, 0xC6, 0xF5, 0x4C, 0x9D, 0x2A, 0x74, 0x4D, 0xAA, 0xD3, 0xA5, 0xD9, 0xB9, 0x4D, 0xDE, 0x2F,
+ 0xA4, 0x69, 0x24, 0x56, 0x5F, 0xCA, 0x0F, 0x43, 0x1E, 0x58, 0xD4, 0x70, 0xD9, 0x11, 0x53, 0xE7,
+ 0xB6, 0x9E, 0x8F, 0x06, 0xCA, 0xBF, 0x20, 0x59, 0xE9, 0x51, 0xAE, 0xBA, 0x68, 0x30, 0xDE, 0x5E,
+ 0x9C, 0x4D, 0x0A, 0xD1, 0xF7, 0xFB, 0x1E, 0xEF, 0xE3, 0x71, 0xFC, 0x9E, 0x12, 0x96, 0xEF, 0xB7,
+ 0xC1, 0xD5, 0x44, 0x48, 0x5E, 0x44, 0x32, 0xED, 0x52, 0xFA, 0x18, 0xA1, 0xAE, 0x6F, 0xCD, 0xDB,
+ 0x83, 0x38, 0x8E, 0xD0, 0xEC, 0x8E, 0x3A, 0xEF, 0x43, 0x03, 0xF2, 0x68, 0x14, 0xE2, 0xD3, 0x7D,
+ 0xF8, 0x2E, 0x23, 0xBC, 0x54, 0x52, 0x60, 0xE4, 0x89, 0xED, 0x87, 0x78, 0x21, 0x07, 0xF8, 0x24,
+ 0x12, 0x1E, 0x99, 0x21, 0x36, 0x3F, 0x6B, 0xB1, 0xE5, 0x62, 0x46, 0x82, 0xC9, 0x44, 0x67, 0x33,
+ 0x3E, 0x38, 0x62, 0x02, 0xA0, 0x48, 0x1B, 0xD7, 0xBD, 0x21, 0xAB, 0x2E, 0x62, 0x9E, 0x35, 0x8E,
+ 0x3E, 0xDA, 0x2D, 0xA4, 0xDC, 0x7E, 0x43, 0x57, 0x45, 0x13, 0xD4, 0x62, 0x45, 0xAB, 0x95, 0x57,
+ 0x4C, 0x56, 0x4C, 0xAD, 0x5F, 0xBF, 0xA0, 0x24, 0x23, 0x53, 0x71, 0xE5, 0xA1, 0x5C, 0x6C, 0xD3,
+ 0xFD, 0xE6, 0x43, 0xFD, 0x28, 0x86, 0xA6, 0x63, 0xA7, 0x73, 0x35, 0xF0, 0xFD, 0xFF, 0xC7, 0x7B,
+ 0x16, 0x38, 0x73, 0x9C, 0xFC, 0x65, 0x50, 0x94, 0x2D, 0x57, 0xE5, 0xDD, 0x8C, 0x3B, 0x68, 0x81,
+ 0xEA, 0x90, 0xA5, 0x3F, 0xC2, 0x2F, 0x9C, 0xD6, 0x9F, 0xBA, 0x01, 0xD7, 0x8E, 0xA1, 0x71, 0xE2,
+ 0xA5, 0x2A, 0x6A, 0xA5, 0xFA, 0xE1, 0x6F, 0x44, 0x13, 0x56, 0x16, 0x3A, 0x1A, 0xBA, 0xBE, 0x5D,
+ 0xA6, 0xFA, 0x73, 0xEB, 0x05, 0xE0, 0x88, 0x8A, 0xEB, 0x5A, 0x50, 0xF5, 0xFC, 0x86, 0xA2, 0x35,
+ 0x41, 0x03, 0x72, 0x92, 0x4A, 0x8F, 0x73, 0xF0, 0x05, 0x2A, 0xA4, 0x8C, 0x5C, 0x46, 0xEB, 0xE9,
+ 0xE3, 0x3C, 0x6F, 0xB2, 0x23, 0x6B, 0xA0, 0x77, 0xED, 0xA9, 0x95, 0x5C, 0x50, 0xA3, 0x01, 0xB0,
+ 0x8D, 0xE9, 0x5B, 0x5C, 0x0B, 0x91, 0xF5, 0x32, 0x9D, 0x52, 0xA1, 0x45, 0x21, 0x45, 0x4A, 0xEA,
+ 0x42, 0x8A, 0x7A, 0x91, 0xA0, 0x34, 0x95, 0x85, 0xEC, 0x84, 0x21, 0xEB, 0x9E, 0x6C, 0xC8, 0xE5,
+ 0x5C, 0x5F, 0xAF, 0x0C, 0xC8, 0x17, 0xC8, 0x87, 0x3C, 0x10, 0xD2, 0x20, 0x03, 0x08, 0xD3, 0x3E,
+ 0xC6, 0x70, 0x33, 0xFE, 0x9E, 0x11, 0x85, 0xDC, 0xB2, 0xD6, 0xEA, 0x83, 0xD2, 0xE2, 0x41, 0x1E,
+ 0x70, 0x0E, 0xED, 0xE5, 0x64, 0xBC, 0x83, 0x6F, 0x1F, 0xEF, 0xC4, 0xFE, 0x20, 0x99, 0x87, 0xF6,
+ 0x76, 0x76, 0x4B, 0xC2, 0xEF, 0x9C, 0xA9, 0xED, 0x33, 0xF8, 0x6A, 0x64, 0x83, 0x76, 0xAE, 0x5D,
+ 0x48, 0xAA, 0x08, 0x64, 0x95, 0xB8, 0x8F, 0x33, 0xB3, 0x88, 0x07, 0x55, 0xDB, 0x6C, 0xA5, 0x1E,
+ 0x3B, 0xCA, 0x76, 0xDC, 0x0D, 0x85, 0x02, 0xA2, 0xEC, 0xB5, 0x0F, 0xC4, 0x52, 0x11, 0x57, 0xF5,
+ 0x2D, 0x8D, 0xFB, 0x3C, 0x49, 0xC7, 0x59, 0x68, 0x3A, 0x62, 0xC9, 0x28, 0xCD, 0x81, 0x98, 0x10,
+ 0xB0, 0x71, 0x3B, 0x96, 0xB9, 0xC2, 0x16, 0x14, 0x88, 0xCC, 0x56, 0x1A, 0xD2, 0x78, 0xBC, 0x53,
+ 0x4A, 0xA8, 0x27, 0xDE, 0x8A, 0x5B, 0xEF, 0x58, 0x97, 0x95, 0x02, 0xF3, 0x76, 0xC1, 0xA2, 0x01,
+ 0xB8, 0xD2, 0xB8, 0xAC, 0xC5, 0xB3, 0x36, 0x33, 0x7C, 0x1A, 0xCA, 0x06, 0x4C, 0x09, 0xBC, 0x3C,
+ 0x0B, 0x0A, 0xD8, 0xAC, 0x74, 0x25, 0xA4, 0x91, 0xDB, 0x13, 0xE5, 0x2B, 0x09, 0xC7, 0x3D, 0x99,
+ 0xFB, 0x4F, 0xFF, 0xB4, 0x9C, 0x9E, 0x89, 0xF8, 0xD3, 0xAC, 0xCF, 0x37, 0xEA, 0x3F, 0xAC, 0x3E,
+ 0x8F, 0x7E, 0xFD, 0x66, 0x97, 0xF1, 0x8A, 0x94, 0xE0, 0x36, 0x2A, 0x48, 0x1C, 0xA9, 0x5B, 0x1E,
+ 0x4D, 0xCC, 0xB0, 0xF6, 0xA6, 0x26, 0x2E, 0x6D, 0x29, 0x6E, 0x89, 0x30, 0x6C, 0x2B, 0xA3, 0x04,
+ 0xD4, 0x8F, 0x8C, 0xCB, 0xA7, 0xA2, 0x05, 0x94, 0x93, 0xE9, 0x9B, 0x03, 0x18, 0x91, 0x76, 0x25,
+ 0x42, 0xF6, 0xC1, 0xE1, 0xE8, 0x6B, 0x56, 0xEF, 0x61, 0xED, 0xDB, 0xF7, 0xD6, 0xD3, 0x50, 0xB1,
+ 0x59, 0xAE, 0x79, 0x22, 0xEB, 0xCC, 0x39, 0x3E, 0x10, 0xD7, 0x21, 0x04, 0x7D, 0xEF, 0x96, 0x73,
+ 0xBC, 0x6C, 0xE5, 0x0D, 0x15, 0x8A, 0x94, 0x07, 0x14, 0x96, 0x86, 0x31, 0x68, 0xD6, 0xC0, 0xE7,
+ 0xE5, 0xEE, 0x6C, 0x77, 0xBD, 0x9E, 0xD9, 0x27, 0xE7, 0x68, 0x1E, 0x57, 0x1A, 0x0D, 0x01, 0xDD,
+ 0x3B, 0xAF, 0x85, 0x5A, 0xA3, 0x49, 0x4A, 0xCB, 0x1D, 0x2E, 0xC4, 0xFE, 0x39, 0x50, 0x36, 0x5C,
+ 0xF8, 0xE4, 0xC4, 0x0D, 0x6A, 0x84, 0xCC, 0xC1, 0x5C, 0xF1, 0x72, 0x34, 0x1B, 0xAE, 0x8E, 0xFB,
+ 0x45, 0x23, 0xBE, 0xC5, 0x4B, 0xAE, 0xC2, 0xC9, 0x74, 0xF5, 0x83, 0x84, 0x26, 0x7A, 0xFA, 0x8D,
+ 0xFF, 0x34, 0x68, 0xDE, 0x39, 0xB3, 0xDB, 0x15, 0xDB, 0x13, 0xC2, 0x59, 0xDE, 0x5F, 0x78, 0xD2,
+ 0x04, 0x1D, 0x3A, 0x45, 0x7B, 0xCD, 0xB5, 0xC4, 0x51, 0xCF, 0x8F, 0xAD, 0x2E, 0x61, 0x23, 0xEC,
+ 0x66, 0x37, 0x2D, 0x4A, 0xB3, 0xD4, 0xCA, 0x8C, 0x37, 0x3F, 0xAE, 0x15, 0x3F, 0xBE, 0xE7, 0x5E,
+ 0x2D, 0xAD, 0x95, 0x30, 0xFB, 0x35, 0x42, 0xC9, 0xFB, 0xF1, 0x5A, 0xD0, 0x20, 0x3A, 0x06, 0xF5,
+ 0x1D, 0x2D, 0xDB, 0xAC, 0x4C, 0xEB, 0x02, 0xF0, 0x11, 0x4D, 0xC9, 0x24, 0x46, 0x5E, 0x1A, 0xAA,
+ 0x24, 0xE8, 0x0B, 0xAC, 0x83, 0xAD, 0x12, 0x9D, 0xD1, 0x79, 0xBC, 0xE0, 0xF7, 0x56, 0x21, 0x90,
+ 0x71, 0x7D, 0x6D, 0x36, 0x59, 0xC3, 0xF8, 0x4C, 0x60, 0xBF, 0x0B, 0xF4, 0x29, 0x60, 0x65, 0xF3,
+ 0xC7, 0x48, 0xAC, 0x8F, 0x7C, 0x5D, 0x4B, 0xF8, 0x75, 0x5E, 0x94, 0x97, 0x1C, 0x02, 0x70, 0xED,
+ 0xA3, 0xC4, 0x22, 0xB6, 0x10, 0xFA, 0x74, 0x00, 0x8C, 0x73, 0x6C, 0xC7, 0xB2, 0xFA, 0x6E, 0x0F,
+ 0x42, 0x8B, 0xF5, 0xB7, 0xF0, 0xE9, 0x29, 0xE8, 0x48, 0xB3, 0x1C, 0xD2, 0xAB, 0xA1, 0xA5, 0x8B,
+ 0x1C, 0x43, 0x44, 0xEF, 0xE9, 0x95, 0xC8, 0xA6, 0xE9, 0x48, 0x8C, 0x73, 0xFA, 0x6C, 0x9C, 0xC4,
+ 0xAE, 0x2B, 0xB3, 0xC9, 0x11, 0x06, 0x20, 0xA9, 0x00, 0xFB, 0x50, 0x1D, 0x73, 0x68, 0xD5, 0xC0,
+ 0x4D, 0x38, 0x4C, 0xAA, 0x93, 0xC0, 0x24, 0x25, 0xE0, 0x55, 0x0C, 0x6F, 0xE8, 0xA2, 0x66, 0x3C,
+ 0xE0, 0x5E, 0x5C, 0x2F, 0xBC, 0x27, 0x66, 0x99, 0x0E, 0xF6, 0xFE, 0xCF, 0x14, 0x19, 0x0E, 0x9D,
+ 0x75, 0xCF, 0xE9, 0x29, 0xC1, 0x77, 0x26, 0xF5, 0x78, 0xA5, 0x4E, 0x7D, 0x7F, 0x3F, 0x33, 0x11,
+ 0x5F, 0x26, 0xCD, 0xCB, 0x5B, 0x47, 0xD4, 0x37, 0x4C, 0xBA, 0x38, 0x59, 0x23, 0x80, 0x84, 0xEF,
+ 0x3C, 0xCC, 0xD6, 0xA9, 0x71, 0xA3, 0xFE, 0x5B, 0xD5, 0x3B, 0x21, 0x52, 0xC2, 0xD6, 0x1B, 0x71,
+ 0x3B, 0x06, 0x55, 0x5C, 0x1B, 0x77, 0xAB, 0x80, 0x0B, 0x17, 0xCB, 0x14, 0x72, 0x87, 0xFB, 0x81,
+ 0xD4, 0xFB, 0xB7, 0xD0, 0x84, 0x65, 0x9B, 0x6F, 0x2B, 0xD5, 0x7A, 0x12, 0xA8, 0x2A, 0xBE, 0xA5,
+ 0xE7, 0xE2, 0x8F, 0x05, 0x1A, 0x54, 0x10, 0xAA, 0x72, 0x34, 0xF6, 0xE9, 0x08, 0x6B, 0xB4, 0xFC,
+ 0x69, 0xAF, 0x26, 0x5F, 0xC5, 0x72, 0x61, 0x96, 0x3A, 0xD6, 0xE4, 0x5B, 0xBA, 0xCB, 0x0C, 0xD1,
+ 0xAE, 0xF8, 0x19, 0xFA, 0xB6, 0xCF, 0x0C, 0xCC, 0xFC, 0xCD, 0x82, 0x15, 0xAC, 0x36, 0x04, 0x80,
+ 0x75, 0x3D, 0x8D, 0xF9, 0x36, 0x57, 0x4F, 0x7C, 0x55, 0x60, 0xE0, 0x2F, 0xB4, 0x89, 0x9E, 0x77,
+ 0xED, 0xCB, 0x19, 0x96, 0xB4, 0xC0, 0x5E, 0xBE, 0x4E, 0xEF, 0xB9, 0xA7, 0xCB, 0x92, 0x68, 0x74,
+ 0xF0, 0x9A, 0x38, 0xE1, 0x15, 0x67, 0x64, 0xE0, 0x70, 0x08, 0x36, 0xED, 0xC4, 0x47, 0x11, 0xD6,
+ 0x79, 0x5E, 0x12, 0x4A, 0x50, 0xD8, 0xFE, 0x7D, 0x09, 0x67, 0x11, 0x53, 0x2B, 0x2E, 0x6F, 0x5B,
+ 0x91, 0xF5, 0x1A, 0xAA, 0x0C, 0x0C, 0x50, 0x45, 0x0B, 0x94, 0x01, 0x16, 0xB7, 0x83, 0x9A, 0xF6,
+ 0xCC, 0x45, 0x79, 0x7C, 0xD0, 0x9C, 0xFD, 0x66, 0xB1, 0xBD, 0xCF, 0x70, 0xBC, 0x77, 0xF4, 0xA2,
+ 0xEE, 0x6F, 0x13, 0x28, 0x48, 0x39, 0x81, 0xCB, 0x80, 0x52, 0xED, 0x49, 0xEE, 0x54, 0xFD, 0x59,
+ 0x27, 0x51, 0x68, 0x8E, 0xFA, 0x46, 0x89, 0x9A, 0xCF, 0x48, 0x45, 0x9F, 0xA5, 0x6F, 0x16, 0x6C,
+ 0x3C, 0x36, 0x41, 0xF7, 0x06, 0xAA, 0x3A, 0x7D, 0xFF, 0x4E, 0x37, 0xE6, 0x7D, 0x83, 0x9F, 0xDE,
+ 0x6E, 0xBC, 0x7C, 0x95, 0xEF, 0x93, 0x82, 0x42, 0x43, 0xAA, 0xC2, 0x85, 0xBA, 0x7E, 0x9C, 0xB6,
+ 0xD4, 0xE1, 0x11, 0xB2, 0x44, 0xDC, 0xFF, 0xC7, 0x5C, 0x92, 0xCE, 0xC0, 0xBC, 0xA7, 0xB2, 0x41,
+ 0x75, 0x05, 0x4F, 0x00, 0xB9, 0x23, 0xF2, 0xCA, 0xE9, 0x65, 0x23, 0x24, 0x49, 0xA4, 0x15, 0x8E,
+ 0x10, 0xB1, 0xC1, 0x2F, 0xCA, 0xB4, 0xAF, 0x86, 0xF7, 0x80, 0x3D, 0xF2, 0xC1, 0x5A, 0x42, 0x2F,
+ 0xC7, 0x39, 0xFD, 0x06, 0x74, 0xEF, 0x15, 0xEB, 0xE0, 0x24, 0x8F, 0x7B, 0xEE, 0xE0, 0xE4, 0x1D,
+ 0x5F, 0x2A, 0x88, 0xDC, 0x9E, 0xB5, 0xA9, 0x9F, 0xDE, 0x73, 0x2C, 0x7A, 0xF3, 0x9B, 0x32, 0xF3,
+ 0xF4, 0x5F, 0x3C, 0x5E, 0xBE, 0xBA, 0xA0, 0xEA, 0xB6, 0x0B, 0x00, 0x10, 0xE5, 0xBA, 0x6C, 0x62,
+ 0x26, 0x27, 0x62, 0x3B, 0x48, 0x5C, 0x60, 0xEE, 0xEB, 0xFA, 0xEE, 0xB1, 0x6C, 0x0A, 0x46, 0xF3,
+ 0x1E, 0xED, 0xA3, 0x1B, 0xF3, 0x60, 0x02, 0xF3, 0x60, 0x6A, 0x1A, 0x8A, 0x33, 0x70, 0x13, 0x7C,
+ 0x5F, 0xC6, 0xEF, 0x8A, 0x15, 0xCB, 0xC1, 0x44, 0xDD, 0xEF, 0x73, 0x9D, 0x01, 0x70, 0xAF, 0xAA,
+ 0x60, 0x34, 0xB4, 0x2D, 0x4B, 0xA1, 0xBB, 0x5B, 0xF2, 0x54, 0x0F, 0x10, 0xDD, 0xA4, 0xBB, 0xA4,
+ 0xE5, 0xC4, 0x3D, 0xAE, 0xEF, 0x70, 0xF9, 0xED, 0x9A, 0x60, 0x2E, 0x22, 0xAB, 0xF5, 0xA8, 0x8A,
+ 0xEA, 0x62, 0x05, 0x2A, 0x32, 0x31, 0x29, 0xDE, 0x4C, 0x8E, 0x8C, 0x6C, 0x4B, 0x70, 0xB0, 0x9C,
+ 0x0A, 0x95, 0x52, 0xC6, 0x90, 0x0D, 0x2A, 0xAA, 0xAC, 0x07, 0x54, 0xCE, 0xFE, 0xF6, 0x95, 0xBB,
+ 0xCD, 0xF3, 0xE4, 0x69, 0xC7, 0x44, 0x75, 0x63, 0x72, 0x84, 0x0E, 0xD5, 0x13, 0xE4, 0xFA, 0x48,
+ 0xC1, 0x42, 0xD5, 0x5F, 0x6B, 0x88, 0x3D, 0x8E, 0x09, 0x67, 0x42, 0x61, 0x69, 0x72, 0xEE, 0xE3,
+ 0xDF, 0x37, 0x75, 0x30, 0xCE, 0x9D, 0xE3, 0x0C, 0xF9, 0x16, 0x0C, 0xD2, 0x6F, 0x3C, 0x69, 0x8D,
+ 0x8F, 0x1D, 0x78, 0x1C, 0x8B, 0x3A, 0x6C, 0xDF, 0x28, 0x5E, 0x76, 0x79, 0x89, 0x75, 0x82, 0xB7,
+ 0x46, 0x97, 0xB3, 0xF2, 0x60, 0x98, 0x96, 0x5E, 0x5C, 0x24, 0x35, 0xA7, 0x0B, 0xA7, 0xB6, 0x96,
+ 0x80, 0xD3, 0x9C, 0x38, 0xE2, 0xF3, 0x9B, 0x76, 0x86, 0x68, 0xC9, 0xA4, 0x08, 0x46, 0x8D, 0x1D,
+ 0x5C, 0xF7, 0x68, 0x62, 0xBC, 0x6B, 0x7B, 0x1C, 0xE5, 0x72, 0x94, 0x4A, 0xAF, 0x2C, 0x74, 0x4D,
+ 0x9A, 0x05, 0x90, 0xA6, 0xD9, 0x2C, 0xDF, 0x20, 0x2A, 0xE9, 0x0D, 0x8B, 0xDD, 0xD9, 0x97, 0x1D,
+ 0x30, 0x8B, 0xC0, 0x23, 0xCD, 0x1E, 0xF4, 0x3C, 0x06, 0xA2, 0xDC, 0xE9, 0x13, 0xDA, 0xC7, 0x82,
+ 0xC0, 0x5F, 0x08, 0x12, 0x7C, 0xEE, 0x7A, 0x3D, 0x95, 0xE9, 0xCB, 0xA2, 0xBC, 0xA0, 0x55, 0x18,
+ 0x49, 0x83, 0x86, 0x62, 0xCF, 0x8F, 0xA6, 0xF1, 0x14, 0xAA, 0x0A, 0x5A, 0xE1, 0x96, 0xF7, 0x13,
+ 0x0C, 0xC1, 0x09, 0xFD, 0xBF, 0x84, 0xEE, 0x6D, 0x0A, 0x34, 0x73, 0x88, 0xD8, 0x54, 0x61, 0x9A,
+ 0x1F, 0x2B, 0x34, 0x36, 0x44, 0x34, 0x41, 0x7F, 0x09, 0x8F, 0x08, 0x08, 0x40, 0xA1, 0x70, 0x24,
+ 0x30, 0x23, 0x02, 0x2D, 0x76, 0x39, 0xC0, 0xCA, 0xF1, 0xAC, 0xA2, 0xFA, 0x09, 0x07, 0xE0, 0x5D,
+ 0xE2, 0x44, 0x0C, 0x2C, 0xAB, 0x77, 0x4C, 0xE7, 0x7E, 0xFA, 0xAB, 0xF3, 0x43, 0xAF, 0x6F, 0x5D,
+ 0xC1, 0xE3, 0x81, 0x28, 0x9A, 0x47, 0xD4, 0xE5, 0x4B, 0x04, 0x0A, 0x47, 0xFD, 0xF6, 0x31, 0x6D,
+ 0x54, 0xAD, 0x3B, 0x19, 0xF7, 0x28, 0x1D, 0x42, 0x7C, 0x3A, 0x4C, 0xCC, 0xB3, 0x66, 0xE2, 0x9F,
+ 0x8C, 0x18, 0x0F, 0x77, 0xC4, 0xA3, 0xF4, 0x22, 0x75, 0x83, 0x65, 0xFB, 0x4F, 0x02, 0x71, 0xE6,
+ 0x4A, 0x2D, 0x2F, 0xE2, 0x46, 0xB4, 0x0C, 0x39, 0x29, 0xAB, 0xC7, 0x3E, 0x38, 0xC3, 0x0B, 0xA5,
+ 0xE8, 0xB5, 0xE6, 0x0E, 0xEC, 0x77, 0x7C, 0xD0, 0xBF, 0x2F, 0xB1, 0x27, 0x4F, 0x56, 0x73, 0xCA,
+ 0x70, 0xA5, 0x35, 0x71, 0x4A, 0x42, 0xA5, 0x37, 0x0A, 0xA7, 0xAD, 0x27, 0x18, 0x02, 0x8C, 0x4B,
+ 0x3A, 0xB1, 0x6D, 0x17, 0xC1, 0x81, 0x76, 0x70, 0x8D, 0xAC, 0xAD, 0x4A, 0xDD, 0x3D, 0x27, 0x18,
+ 0x66, 0x63, 0x3A, 0x0D, 0xFC, 0xA2, 0x9F, 0xC5, 0x2E, 0x29, 0xD9, 0xA5, 0x0C, 0x4C, 0xA3, 0x6F,
+ 0xA9, 0x3F, 0xFF, 0xB5, 0x83, 0x6B, 0x00, 0x93, 0x57, 0x39, 0x26, 0x6D, 0x40, 0x81, 0x89, 0x4A,
+ 0xAE, 0x55, 0x06, 0x58, 0x75, 0x6F, 0x49, 0xC2, 0xFF, 0xA0, 0x92, 0x7B, 0xB6, 0x60, 0x80, 0x72,
+ 0x52, 0xE5, 0x8D, 0x33, 0xC0, 0xB6, 0x3F, 0xF2, 0x2A, 0x81, 0x11, 0x8F, 0xF5, 0xA2, 0x98, 0x84,
+ 0x59, 0x7C, 0xA8, 0xD5, 0x9C, 0xDE, 0x69, 0x4C, 0x67, 0xD9, 0xFB, 0xBC, 0x68, 0x29, 0x92, 0x25,
+ 0x7D, 0xFD, 0x01, 0x8D, 0x60, 0xBC, 0xAE, 0x34, 0x00, 0x77, 0x06, 0x99, 0xD2, 0x9B, 0xFD, 0x69,
+ 0xD5, 0x56, 0x00, 0xB0, 0x76, 0x71, 0x38, 0xCE, 0xBE, 0xAE, 0xA2, 0xA4, 0x8C, 0xA4, 0xE6, 0x78,
+ 0x9E, 0x96, 0x2F, 0x92, 0xF3, 0x13, 0x22, 0x50, 0xE9, 0x0F, 0xB2, 0x0F, 0x31, 0x4E, 0xC7, 0x2E,
+ 0xF0, 0x70, 0x21, 0x33, 0x41, 0xCA, 0xFA, 0xF0, 0x4D, 0xF8, 0xCD, 0x1E, 0x41, 0x42, 0xED, 0xAA,
+ 0xA0, 0x49, 0x30, 0x2D, 0xBA, 0x1E, 0x11, 0x09, 0x14, 0x0E, 0x39, 0x32, 0x32, 0x22, 0x48, 0x93,
+ 0xCF, 0x1A, 0xF8, 0xC1, 0x91, 0x6A, 0x0B, 0xCC, 0x76, 0x98, 0xD1, 0x2B, 0x9A, 0x40, 0xBF, 0x12,
+ 0xD6, 0xFF, 0x20, 0x7E, 0x54, 0xB8, 0x4E, 0x65, 0xEB, 0xB3, 0x46, 0xD1, 0x44, 0x6A, 0x80, 0x19,
+ 0x72, 0xFD, 0x39, 0x11, 0xD7, 0x7A, 0x7C, 0x03, 0x7D, 0x76, 0xE0, 0xB2, 0x30, 0x02, 0xAA, 0xEC,
+ 0x29, 0xA7, 0x90, 0x08, 0xC8, 0x16, 0x12, 0xA0, 0x30, 0x2C, 0xA1, 0x4E, 0xC1, 0x7C, 0x5F, 0xB7,
+ 0x5A, 0x17, 0xF7, 0xA7, 0xFC, 0xFA, 0xCB, 0x5D, 0xC2, 0xDC, 0x2C, 0x86, 0xF7, 0xCD, 0x2A, 0x0A,
+ 0xA7, 0x22, 0x47, 0x48, 0xC2, 0x75, 0x1E, 0x24, 0xC6, 0x26, 0x98, 0x84, 0x15, 0xAD, 0xB9, 0xBA,
+ 0xC9, 0xAF, 0x7D, 0xA2, 0x5D, 0xDD, 0x8E, 0xE0, 0xEE, 0xEF, 0x74, 0xCE, 0x3F, 0xBC, 0xFC, 0xA0,
+ 0x26, 0x09, 0x15, 0x30, 0xEC, 0x3B, 0xBB, 0x0A, 0xC4, 0x43, 0x9F, 0x27, 0x90, 0x1F, 0xCC, 0x2D,
+ 0x8B, 0x7F, 0xDA, 0x51, 0xCB, 0xF7, 0x27, 0xAC, 0xE5, 0xD7, 0x7D, 0xAA, 0xB0, 0xD9, 0x7C, 0xBF,
+ 0x17, 0xD0, 0x42, 0x57, 0xC0, 0xF9, 0xE3, 0xF0, 0x0E, 0x7B, 0x5F, 0xE4, 0x4B, 0xA0, 0xC1, 0xEE,
+ 0xF1, 0xF2, 0xEB, 0x33, 0xDA, 0x25, 0xFB, 0x08, 0xAE, 0x6F, 0x4B, 0xFB, 0x5E, 0x98, 0x91, 0xD7,
+ 0x91, 0x9A, 0x62, 0x76, 0xC6, 0x51, 0xAA, 0x64, 0x6A, 0xF2, 0xCD, 0xAD, 0x24, 0x42, 0x87, 0x05,
+ 0xD3, 0x39, 0xE1, 0xC5, 0xA8, 0x30, 0x79, 0xD8, 0xC0, 0x03, 0x42, 0x84, 0x5A, 0x75, 0xB4, 0x8C,
+ 0x0D, 0xE3, 0xB4, 0xCB, 0x00, 0xFD, 0x51, 0xDC, 0xE1, 0xA8, 0xDE, 0xE7, 0x33, 0x6D, 0x74, 0x62,
+ 0x2A, 0xAE, 0x99, 0x79, 0x9E, 0xFC, 0x0E, 0x19, 0x35, 0xDD, 0xA1, 0x75, 0xE4, 0x2B, 0x0C, 0xC5,
+ 0x37, 0xCB, 0x70, 0x3E, 0x00, 0x0B, 0x28, 0x37, 0x03, 0x23, 0x4D, 0xF0, 0x85, 0xFB, 0xF5, 0x3B,
+ 0x8D, 0xC1, 0xB9, 0xB2, 0x7D, 0x15, 0x4C, 0xC0, 0x86, 0x78, 0x74, 0x01, 0xDB, 0xB0, 0xC3, 0x01,
+ 0x25, 0x4D, 0x56, 0x70, 0x60, 0x66, 0xCC, 0xC0, 0x1A, 0xD7, 0x77, 0x90, 0x42, 0xDE, 0xE1, 0x09,
+ 0xA9, 0x14, 0xB8, 0xB9, 0x78, 0xAF, 0x64, 0x1F, 0x50, 0x02, 0xF9, 0xAF, 0x2C, 0x43, 0x9A, 0xF3,
+ 0xD9, 0x00, 0x56, 0x81, 0xC9, 0xC6, 0xC8, 0xAF, 0x1D, 0x49, 0x5A, 0xC5, 0xFB, 0x80, 0xF6, 0x3E,
+ 0xD1, 0x03, 0x5B, 0x8B, 0xF4, 0xFA, 0x8B, 0x81, 0xB8, 0x87, 0xD3, 0xEE, 0x40, 0x17, 0xB0, 0x39,
+ 0xE5, 0x20, 0xF4, 0x96, 0xEE, 0x8E, 0xA3, 0x71, 0xCE, 0x05, 0xD4, 0x3C, 0x71, 0x46, 0x91, 0xEA,
+ 0x89, 0xC5, 0x9F, 0xD3, 0x07, 0x77, 0x1E, 0x1C, 0x4B, 0x28, 0xA1, 0xA4, 0x5F, 0xE3, 0xC3, 0x9A,
+ 0xF5, 0x2A, 0xF8, 0xC3, 0x68, 0x4C, 0x76, 0x7B, 0x8B, 0x62, 0x49, 0x8C, 0x7C, 0x31, 0x9D, 0x41,
+ 0x07, 0x29, 0xE9, 0xD9, 0xF1, 0x58, 0x6F, 0x20, 0x31, 0x06, 0x45, 0xEA, 0xAB, 0x5E, 0x94, 0x21,
+ 0xEC, 0xB2, 0xC0, 0xA9, 0xD3, 0x23, 0x54, 0x09, 0x32, 0x95, 0xF7, 0x50, 0x41, 0x13, 0x7E, 0x9D,
+ 0x7C, 0xEB, 0xB8, 0x49, 0x87, 0xD2, 0xF9, 0x55, 0xDC, 0xE5, 0x57, 0x5E, 0x45, 0x3C, 0xA0, 0xE7,
+ 0xF2, 0x70, 0x2B, 0x7A, 0x08, 0x38, 0x1D, 0xCC, 0x34, 0x55, 0xF3, 0x79, 0x99, 0xD8, 0x3A, 0x6C,
+ 0xEA, 0xFD, 0x18, 0xE6, 0xA8, 0x8C, 0x22, 0xE6, 0x24, 0x02, 0xC6, 0x71, 0xFE, 0x09, 0x01, 0x63,
+ 0xD9, 0x13, 0xD6, 0x82, 0xE7, 0x86, 0x9C, 0x08, 0xDC, 0xC5, 0x2A, 0x83, 0x13, 0x3A, 0x03, 0x52,
+ 0x25, 0x71, 0x8B, 0x9E, 0xB5, 0xCC, 0x08, 0x05, 0x98, 0xBC, 0xFF, 0xF0, 0xB8, 0x22, 0xF1, 0x87,
+ 0x6B, 0xE7, 0x0A, 0xB0, 0xF1, 0x77, 0xAC, 0x70, 0xA5, 0x34, 0x22, 0x46, 0xD0, 0x53, 0xB5, 0xE8,
+ 0x77, 0x04, 0x9D, 0x90, 0x8D, 0xE8, 0x57, 0x47, 0x5D, 0xE7, 0x91, 0x41, 0xA5, 0x2B, 0xD2, 0xF0,
+ 0xBE, 0x7B, 0xFE, 0x03, 0xF4, 0x81, 0x73, 0x2F, 0xA4, 0x39, 0x21, 0x3D, 0x24, 0x35, 0xAE, 0xCE,
+ 0xE3, 0x9C, 0x36, 0x5B, 0x45, 0xC4, 0xA0, 0xD4, 0x46, 0x02, 0x38, 0xF7, 0x9E, 0xC3, 0x11, 0x01,
+ 0x31, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB, 0xC5, 0xB4, 0xC4, 0xD5, 0x2A, 0xFB, 0x0D, 0xF7, 0x29, 0xB5,
+ 0xCC, 0xE7, 0xD1, 0xF5, 0x1F, 0x53, 0xDF, 0xD7, 0x7D, 0x71, 0xED, 0x0C, 0xB4, 0xDA, 0xFE, 0xA5,
+ 0x28, 0x5D, 0x5A, 0x4D, 0x54, 0x9D, 0x04, 0x40, 0x92, 0xBD, 0xC4, 0xD7, 0x38, 0x4B, 0xBC, 0xF5,
+ 0x1F, 0x58, 0xAE, 0xD8, 0x0D, 0xA6, 0x92, 0xE8, 0xEF, 0x43, 0xEF, 0xDF, 0x0F, 0xCD, 0x22, 0xFA,
+ 0x61, 0x24, 0x77, 0x6A, 0x60, 0x8D, 0x42, 0xFA, 0x8A, 0x0D, 0x6C, 0x47, 0xDB, 0xC2, 0x57, 0x9F,
+ 0x12, 0x0E, 0x32, 0xD4, 0x12, 0xD7, 0x05, 0x1F, 0xDF, 0x7A, 0xEC, 0xE2, 0x79, 0xEB, 0xC4, 0x8B,
+ 0xC4, 0x71, 0x47, 0xB8, 0xE2, 0xA6, 0xF7, 0x55, 0x7D, 0x6D, 0xC7, 0x93, 0xDB, 0x11, 0xED, 0x70,
+ 0xDE, 0xCD, 0xD9, 0x87, 0x14, 0xDA, 0x69, 0x00, 0x63, 0xFF, 0x5E, 0x0F, 0x9A, 0x38, 0xE7, 0xA2,
+ 0x2F, 0xA6, 0x38, 0x0E, 0xA8, 0x88, 0x38, 0xD4, 0xF5, 0xF3, 0x26, 0x27, 0x33, 0x2A, 0xF0, 0xA1,
+ 0xC8, 0x01, 0x7E, 0xF3, 0xB1, 0xEB, 0x59, 0xCE, 0x3F, 0xE0, 0xC4, 0x86, 0x25, 0xDD, 0xCA, 0x55,
+ 0x58, 0x4F, 0x4B, 0x4F, 0x5D, 0x8A, 0x01, 0xAB, 0x82, 0x3E, 0x48, 0x9F, 0x14, 0x4B, 0x9E, 0x05,
+ 0x6C, 0x3E, 0xEE, 0xF6, 0x84, 0x59, 0x76, 0x56, 0x69, 0x10, 0x6B, 0x4B, 0x79, 0xB6, 0x90, 0x0F,
+ 0x2E, 0x04, 0x45, 0x5C, 0x5A, 0x35, 0x7C, 0x4A, 0x8D, 0xEA, 0xC3, 0xA8, 0x35, 0xD2, 0xCD, 0x0B,
+ 0xE1, 0x37, 0xF3, 0x83, 0xCB, 0x65, 0x8B, 0x65, 0x73, 0xEC, 0xA9, 0x80, 0x11, 0xA2, 0xA5, 0x97,
+ 0x83, 0xC2, 0x0D, 0xF0, 0x23, 0x27, 0x6C, 0xA7, 0xFE, 0xD3, 0x01, 0x1A, 0x1A, 0x60, 0x1C, 0x82,
+ 0x09, 0xE6, 0xB7, 0x7E, 0xE3, 0xE5, 0x9E, 0xF3, 0xEC, 0x7F, 0x76, 0x23, 0xCD, 0xF5, 0xCD, 0xA7,
+ 0x21, 0xD5, 0xCF, 0x7C, 0x56, 0x56, 0x1E, 0xF2, 0x25, 0x36, 0x81, 0x81, 0xE8, 0x33, 0x39, 0xFC,
+ 0x93, 0xE7, 0xC8, 0x4A, 0x39, 0xB5, 0x1C, 0x86, 0x13, 0xC9, 0xD2, 0xAA, 0xC6, 0x31, 0x46, 0xDE,
+ 0xEF, 0x35, 0x26, 0x5A, 0x09, 0x42, 0x0F, 0x24, 0xA5, 0x6A, 0x82, 0x84, 0x17, 0x95, 0x35, 0x7C,
+ 0xB7, 0x99, 0x60, 0x6E, 0x54, 0xE1, 0x43, 0xDC, 0xDD, 0x2A, 0x17, 0x06, 0xB9, 0xF2, 0x34, 0xAE,
+ 0xDB, 0xE9, 0xF3, 0xAB, 0x6C, 0xAA, 0x1A, 0x5E, 0x65, 0xCF, 0x45, 0x3B, 0xB2, 0x6C, 0x47, 0xE5,
+ 0x26, 0x7B, 0x43, 0xD0, 0x58, 0x0A, 0x74, 0xE3, 0xEC, 0xDD, 0x7C, 0xB8, 0x3B, 0xE6, 0xCC, 0x72,
+ 0xD3, 0x35, 0x63, 0xB5, 0x26, 0x7A, 0xBE, 0x71, 0x21, 0x82, 0x75, 0x35, 0x20, 0x11, 0x7F, 0x1D,
+ 0xFE, 0xD4, 0x19, 0xD0, 0xB7, 0xC1, 0xF3, 0xF4, 0xE6, 0x9A, 0xE0, 0x7D, 0x02, 0x60, 0xF0, 0xC8,
+ 0x41, 0xC9, 0x36, 0x14, 0xDE, 0xF5, 0x03, 0x91, 0xE6, 0xFE, 0xAD, 0x1F, 0x50, 0xA7, 0x95, 0xFB,
+ 0x09, 0x26, 0x21, 0x23, 0xA4, 0xF8, 0x84, 0xD2, 0xAB, 0x02, 0x88, 0x62, 0xDD, 0xB9, 0x7A, 0x57,
+ 0xF0, 0x57, 0x92, 0x6E, 0xA5, 0xDD, 0x6D, 0xCF, 0xEF, 0x30, 0x0B, 0xC3, 0xD3, 0xE1, 0xDF, 0xB4,
+ 0x39, 0x35, 0x73, 0x19, 0xED, 0xAE, 0x1A, 0x8A, 0x0D, 0xC8, 0x31, 0x94, 0x3C, 0xB5, 0xEF, 0x2C,
+ 0x67, 0xBA, 0xFD, 0x34, 0x13, 0x95, 0x5B, 0x00, 0x0B, 0xDF, 0x23, 0xBC, 0x7D, 0xDE, 0x1C, 0x30,
+ 0x72, 0x81, 0x9C, 0x34, 0xB7, 0x60, 0x0E, 0x4C, 0x96, 0x64, 0x5C, 0x93, 0x61, 0x53, 0x12, 0x20,
+ 0xD3, 0xA2, 0xBB, 0x9F, 0x1F, 0x26, 0x7F, 0xD5, 0xD7, 0xDE, 0x4C, 0x20, 0x8F, 0x1D, 0x43, 0xAB,
+ 0x2C, 0x7F, 0x50, 0xED, 0x9C, 0x7C, 0x2B, 0x44, 0x2C, 0x22, 0xBF, 0xD6, 0x56, 0xB2, 0x56, 0xE4,
+ 0x74, 0x8A, 0x78, 0x5F, 0x21, 0xB9, 0xD2, 0xDB, 0x9D, 0x7D, 0x42, 0x54, 0x92, 0x8F, 0x55, 0x9E,
+ 0x85, 0xE8, 0x28, 0x92, 0xF0, 0x27, 0x77, 0xCF, 0xFD, 0xE0, 0xB6, 0x2F, 0xBD, 0xC6, 0x4B, 0x8E,
+ 0x3E, 0x90, 0xBB, 0x52, 0xED, 0xF6, 0xAA, 0x22, 0x6F, 0x50, 0xDF, 0xFC, 0x65, 0x7B, 0x0D, 0xE9,
+ 0x27, 0x03, 0x7E, 0x4A, 0x38, 0xDD, 0x0E, 0x7A, 0x27, 0x66, 0x65, 0xDF, 0xD4, 0xDC, 0x62, 0x41,
+ 0x4F, 0xBE, 0x74, 0xBB, 0xCE, 0x45, 0x98, 0xBC, 0x78, 0xC4, 0x58, 0xCB, 0x8B, 0xD7, 0x6E, 0xDE,
+ 0x47, 0xE7, 0x62, 0xE5, 0xE4, 0x83, 0xC4, 0x88, 0x07, 0xE8, 0x59, 0xA8, 0x45, 0x66, 0xE7, 0x2E,
+ 0xC0, 0xC6, 0x34, 0x56, 0x9B, 0x6E, 0xC8, 0x7A, 0x79, 0xE1, 0x67, 0x1A, 0x02, 0x00, 0xC9, 0x0D,
+ 0x4F, 0xFE, 0x10, 0x39, 0x18, 0x01, 0xF4, 0xB9, 0x07, 0x10, 0x72, 0xC7, 0xCF, 0x39, 0xE4, 0xFE,
+ 0x7C, 0x90, 0x2E, 0x29, 0x27, 0x7E, 0x6A, 0x64, 0x8E, 0xC6, 0x52, 0x49, 0x00, 0x15, 0x54, 0xFB,
+ 0x17, 0x73, 0x19, 0x22, 0x24, 0x47, 0x9C, 0x90, 0xA3, 0xC2, 0x16, 0xAC, 0x33, 0x93, 0x1B, 0x3F,
+ 0x3D, 0x7C, 0xC2, 0xB1, 0x73, 0xC4, 0xD4, 0xB5, 0xB3, 0xE0, 0x3D, 0x10, 0x8C, 0x1C, 0x93, 0xE0,
+ 0xAC, 0x24, 0xB0, 0xBE, 0x45, 0xF3, 0xE6, 0x44, 0xD8, 0xEB, 0x82, 0x6D, 0x13, 0x73, 0x71, 0x2A,
+ 0x56, 0xD6, 0x7C, 0x25, 0xFB, 0xD6, 0xC2, 0xE9, 0xB0, 0x8A, 0xE9, 0xEB, 0x1D, 0xA5, 0x6F, 0x19,
+ 0xDD, 0x66, 0x6C, 0x24, 0xCF, 0x44, 0x06, 0x12, 0xF3, 0xC0, 0xAE, 0x21, 0x8B, 0xA1, 0xDF, 0x04,
+ 0xC2, 0x1B, 0xF1, 0xA7, 0x3C, 0xF3, 0x68, 0xB9, 0xB2, 0xAF, 0x8C, 0x24, 0xBF, 0x75, 0x72, 0x60,
+ 0x18, 0x06, 0x1C, 0x3F, 0x26, 0x4D, 0x3B, 0x1B, 0xFD, 0x76, 0xC6, 0x91, 0xB0, 0xB6, 0xD2, 0x5F,
+ 0x67, 0xFA, 0x7D, 0xFF, 0xEC, 0xC7, 0x93, 0x7A, 0x15, 0x4F, 0xE1, 0x1C, 0x46, 0x71, 0x1E, 0x96,
+ 0xBE, 0xAD, 0x2F, 0x31, 0x28, 0x71, 0xCB, 0x04, 0x21, 0xFA, 0x47, 0xB4, 0x4D, 0x8B, 0xEC, 0xD0,
+ 0x78, 0xA1, 0x2B, 0x1B, 0x39, 0xDB, 0x41, 0x27, 0x14, 0x28, 0xE2, 0xA8, 0xFE, 0xAC, 0x68, 0x47,
+ 0xFD, 0x7B, 0x4F, 0xE0, 0xA2, 0xC8, 0x7E, 0x83, 0x86, 0xBD, 0x73, 0x03, 0x18, 0x37, 0xDB, 0x46,
+ 0x1F, 0x6B, 0x17, 0x19, 0x11, 0x0C, 0xA2, 0x14, 0x8B, 0x75, 0xB8, 0xB9, 0xEB, 0xC9, 0xD6, 0x0E,
+ 0x8D, 0x78, 0x62, 0xEB, 0x51, 0x9F, 0xE7, 0xAE, 0x96, 0x83, 0x50, 0x75, 0x36, 0xF6, 0x7F, 0x30,
+ 0x9B, 0x52, 0x57, 0x5B, 0x4D, 0xBC, 0x95, 0x70, 0xCA, 0x2C, 0x8E, 0x3F, 0x59, 0xE0, 0x1C, 0x21,
+ 0x3F, 0x81, 0x07, 0x5B, 0x0D, 0xEB, 0x35, 0xA3, 0x04, 0x10, 0x48, 0xE8, 0x1D, 0x82, 0xEB, 0x3C,
+ 0x5A, 0xCF, 0xA7, 0x96, 0x6C, 0x04, 0x80, 0x38, 0x94, 0x8A, 0x5A, 0x20, 0xDD, 0xE0, 0x84, 0x23,
+ 0xEB, 0x88, 0x31, 0x1E, 0x75, 0xD5, 0x1B, 0x35, 0xE0, 0xE6, 0x79, 0xDF, 0x97, 0xCF, 0x5D, 0x9A,
+ 0xDA, 0x22, 0x55, 0xD3, 0x37, 0xDC, 0x09, 0x4D, 0xE4, 0x06, 0x00, 0x4F, 0xA1, 0xD3, 0x8D, 0xFA,
+ 0xDF, 0x99, 0x67, 0x10, 0x46, 0x61, 0x1D, 0x54, 0x73, 0x7D, 0x5F, 0xF6, 0x5C, 0x38, 0x67, 0xB4,
+ 0x31, 0x59, 0xFF, 0xD2, 0x09, 0x28, 0x2F, 0x7C, 0x2A, 0x95, 0xA2, 0x10, 0x55, 0xED, 0xE3, 0xBA,
+ 0x9D, 0x8F, 0x34, 0xB8, 0xC0, 0xC8, 0x25, 0x4D, 0xF2, 0x1C, 0x50, 0x2A, 0x60, 0xF7, 0x0D, 0x1D,
+ 0x29, 0xD3, 0x26, 0xF9, 0x88, 0xDD, 0xA2, 0x62, 0x1E, 0x9E, 0x84, 0xC3, 0xB9, 0x5A, 0xAD, 0x5F,
+ 0xA9, 0xAA, 0xC9, 0x00, 0xDA, 0xCD, 0x89, 0xB5, 0x33, 0xEB, 0x3B, 0x02, 0xBC, 0x86, 0xD5, 0x46,
+ 0x95, 0x43, 0xC7, 0xD7, 0x5E, 0x19, 0x99, 0xD7, 0xB5, 0x5F, 0x9D, 0x60, 0x11, 0x84, 0xA0, 0xDB,
+ 0x24, 0x13, 0xBD, 0x88, 0xAC, 0xBE, 0x04, 0x0E, 0x43, 0xF0, 0x6F, 0x2D, 0x28, 0xBF, 0x23, 0xA0,
+ 0x27, 0xF4, 0xDF, 0xA5, 0xAD, 0x51, 0x77, 0xE3, 0x17, 0x8A, 0x4C, 0x74, 0x32, 0x70, 0x91, 0x39,
+ 0xB2, 0xE6, 0xA8, 0x55, 0x87, 0xF5, 0xDD, 0x6D, 0xA6, 0x7B, 0x53, 0x1F, 0xFF, 0xFD, 0xB2, 0x97,
+ 0x59, 0x8E, 0x5F, 0xB3, 0x54, 0xDB, 0xF7, 0x5C, 0x57, 0x4E, 0xDD, 0xF6, 0x36, 0x23, 0xBF, 0xBE,
+ 0xB9, 0xD0, 0x2C, 0x9E, 0xDA, 0x4B, 0x33, 0x38, 0x5A, 0x25, 0xED, 0xFE, 0x00, 0x08, 0xE5, 0x64,
+ 0xC3, 0x95, 0x00, 0xAA, 0x96, 0xD3, 0xA9, 0x39, 0xB8, 0xE4, 0x47, 0x72, 0x6C, 0xEB, 0x1A, 0x93,
+ 0x37, 0x9E, 0xD6, 0x1E, 0x5C, 0x6D, 0xDB, 0x74, 0x42, 0x16, 0x95, 0x44, 0x7E, 0x3B, 0xAE, 0xBC,
+ 0x02, 0x15, 0x93, 0xB9, 0x07, 0xBF, 0xFD, 0x4B, 0xD2, 0x94, 0xF2, 0x35, 0xFD, 0xA1, 0x44, 0x37,
+ 0x74, 0xFB, 0x45, 0x46, 0x83, 0x39, 0x1D, 0xA8, 0xE9, 0xE8, 0x9C, 0x67, 0x55, 0xEC, 0x2C, 0x59,
+ 0xF8, 0x3E, 0x6A, 0x54, 0x75, 0x23, 0x1F, 0x90, 0xCE, 0x6A, 0xAA, 0x5C, 0x80, 0x93, 0x6E, 0x6D,
+ 0x2C, 0xC3, 0x5A, 0xF2, 0xA2, 0x93, 0x97, 0xAA, 0x7F, 0xAA, 0x76, 0x0B, 0x59, 0x6D, 0x39, 0x38,
+ 0x32, 0x00, 0xA1, 0xF5, 0x39, 0x94, 0x60, 0x9D, 0xD3, 0xE6, 0xF8, 0xF8, 0x14, 0xC4, 0x6D, 0x47,
+ 0x21, 0x66, 0x43, 0xE4, 0xCB, 0x07, 0x0D, 0xBD, 0xD9, 0x55, 0xDD, 0x03, 0x75, 0x90, 0x91, 0x38,
+ 0x3F, 0x32, 0xE6, 0x73, 0x34, 0xC9, 0xC0, 0x87, 0x3A, 0xC5, 0x62, 0x25, 0x1D, 0x74, 0xB8, 0x0D,
+ 0xA5, 0xED, 0xAF, 0x20, 0xC1, 0x0D, 0xA6, 0x2C, 0x78, 0xC2, 0x46, 0xEA, 0x05, 0xDE, 0x06, 0x47,
+ 0x8D, 0xE2, 0x42, 0x1B, 0x4F, 0x44, 0xEE, 0x83, 0x1A, 0xD7, 0x66, 0x49, 0xBE, 0xD0, 0x8C, 0x58,
+ 0x73, 0xF1, 0x9F, 0x97, 0x74, 0x11, 0xA6, 0x4A, 0x07, 0xDA, 0xA5, 0x75, 0x3D, 0x4A, 0x0F, 0x0D,
+ 0x06, 0x56, 0xB2, 0x5F, 0x5A, 0x8E, 0x2A, 0x1C, 0x38, 0x72, 0xBF, 0xC4, 0xD1, 0x06, 0x55, 0xB2,
+ 0x73, 0xC0, 0x9D, 0x5F, 0x2F, 0x9B, 0x07, 0x17, 0xA7, 0x44, 0xA0, 0x0A, 0x0E, 0xE4, 0x72, 0xB7,
+ 0x70, 0x2E, 0x1E, 0x82, 0x76, 0x63, 0xB5, 0xC1, 0x8F, 0x03, 0x6C, 0xEE, 0x80, 0x3C, 0x86, 0xE1,
+ 0x8E, 0x56, 0xD7, 0x14, 0x37, 0x77, 0x93, 0x9C, 0xB6, 0xE0, 0xFC, 0x49, 0x64, 0x56, 0x77, 0xAE,
+ 0x4E, 0xB0, 0x28, 0xBA, 0x5B, 0x49, 0x5A, 0xB8, 0x83, 0xD8, 0x6B, 0xE5, 0x41, 0x7A, 0x65, 0x8C,
+ 0xC1, 0x71, 0xDD, 0x97, 0x01, 0xA8, 0x9A, 0xAD, 0xC8, 0x43, 0xAB, 0xA6, 0xDC, 0x71, 0xD7, 0x9A,
+ 0xCB, 0x99, 0x5F, 0xCA, 0x4D, 0x75, 0xC7, 0xE4, 0x20, 0x0A, 0x12, 0xE5, 0x45, 0x64, 0x19, 0x7E,
+ 0x32, 0x50, 0x67, 0x22, 0x5C, 0x88, 0xA4, 0xAB, 0x30, 0x97, 0x42, 0xF7, 0xE6, 0x17, 0x35, 0xD5,
+ 0xFE, 0xF3, 0x51, 0xD3, 0x6F, 0x2A, 0xB6, 0x01, 0x9B, 0x80, 0x4F, 0x86, 0x1F, 0xA7, 0x2B, 0xF5,
+ 0x84, 0xD9, 0xBB, 0x0E, 0xE6, 0x2A, 0x05, 0x22, 0xBE, 0xFF, 0x21, 0xCD, 0xFD, 0xCD, 0x85, 0x62,
+ 0xAC, 0xC3, 0xC1, 0x99, 0xDD, 0x8F, 0xDB, 0xCD, 0xDC, 0xD5, 0xA7, 0x08, 0x75, 0x9B, 0x3F, 0x44,
+ 0xB9, 0x91, 0xE9, 0xF0, 0x56, 0x59, 0x33, 0x9F, 0xC3, 0xBD, 0x08, 0x04, 0x17, 0x93, 0x3C, 0x41,
+ 0x66, 0x14, 0x20, 0x44, 0x01, 0x46, 0xEB, 0x05, 0x10, 0xBF, 0x6A, 0xAF, 0x4E, 0x44, 0x8C, 0xE1,
+ 0xBB, 0xB9, 0x86, 0x64, 0x64, 0xB4, 0xDE, 0x7C, 0x17, 0x92, 0xD3, 0x9B, 0x98, 0x23, 0xAA, 0x8C,
+ 0x15, 0xE8, 0xBC, 0xEC, 0xDA, 0x58, 0x3D, 0x8F, 0x53, 0x66, 0x66, 0xA1, 0x87, 0xD1, 0x75, 0x56,
+ 0xFD, 0x9F, 0x6C, 0x72, 0x65, 0xDF, 0x2D, 0x48, 0x58, 0x44, 0xD4, 0x6D, 0xD4, 0x47, 0xFD, 0x4C,
+ 0xF1, 0xBA, 0x76, 0x55, 0xD5, 0x35, 0x76, 0x97, 0x1D, 0x25, 0x8B, 0x20, 0xEA, 0x70, 0x6B, 0x7B,
+ 0x8A, 0x44, 0xA0, 0xC6, 0x04, 0x14, 0xD1, 0x91, 0x50, 0x5E, 0x8E, 0xDC, 0xBC, 0xF9, 0xEA, 0xC2,
+ 0xF7, 0x08, 0x0B, 0x20, 0x46, 0x8F, 0x44, 0x2F, 0xD8, 0xAF, 0x16, 0xD8, 0x9A, 0xEA, 0x7A, 0x93,
+ 0x22, 0xAB, 0x3D, 0x6B, 0x82, 0x81, 0x3D, 0xE8, 0x3B, 0x33, 0xA4, 0x2E, 0x6D, 0x4B, 0x24, 0xFD,
+ 0x00, 0x9C, 0xA6, 0x6F, 0x84, 0xC0, 0xE8, 0xDE, 0x66, 0x8C, 0xDF, 0x10, 0xE0, 0x13, 0xF1, 0x6C,
+ 0xC6, 0x2E, 0x29, 0xD9, 0xB3, 0x77, 0xB4, 0x5E, 0xFB, 0xE9, 0x10, 0x89, 0xC5, 0x23, 0x36, 0x1C,
+ 0x59, 0xD8, 0xE4, 0x78, 0x45, 0x00, 0xCB, 0xC8, 0x31, 0xE1, 0x5A, 0x78, 0x6E, 0x05, 0x56, 0x82,
+ 0xF0, 0x66, 0x4A, 0x40, 0xA4, 0x49, 0xA8, 0x3A, 0xF0, 0x32, 0x55, 0xAD, 0x21, 0xE8, 0x56, 0xDB,
+ 0x4C, 0xB5, 0xD4, 0x45, 0x89, 0x57, 0x53, 0xFC, 0x65, 0x23, 0xA7, 0xF0, 0x78, 0x61, 0xC6, 0x4A,
+ 0x32, 0x1F, 0x95, 0xAE, 0x69, 0x46, 0x28, 0xBF, 0xB4, 0x88, 0xD7, 0x18, 0xF6, 0xD3, 0xBE, 0xD4,
+ 0x00, 0x8C, 0x44, 0x17, 0xDC, 0xA1, 0x65, 0x06, 0xF4, 0xE4, 0x9D, 0x51, 0x40, 0x49, 0x30, 0xD1,
+ 0x5A, 0x09, 0xE6, 0xBD, 0x2A, 0x16, 0x47, 0xDD, 0x14, 0x68, 0xF4, 0xED, 0xEB, 0xD5, 0xF2, 0xF5,
+ 0xF3, 0x1C, 0xEC, 0xCF, 0x89, 0x10, 0x9C, 0xDF, 0x26, 0x4C, 0xD7, 0x50, 0xE6, 0x0F, 0x8B, 0x64,
+ 0x86, 0x36, 0x05, 0x35, 0x6C, 0xED, 0x80, 0x9E, 0x68, 0x1E, 0x44, 0x1D, 0xF7, 0x4C, 0xD9, 0xC2,
+ 0xEB, 0x81, 0x6A, 0xB3, 0xA0, 0xE4, 0xFC, 0x06, 0x84, 0x5B, 0xFE, 0x8A, 0x82, 0xE4, 0xD0, 0x20,
+ 0x11, 0x78, 0x0F, 0xD5, 0xDC, 0x4B, 0x6F, 0xCA, 0xCE, 0x2B, 0xB4, 0x0A, 0x67, 0x1A, 0x19, 0x19,
+ 0xA0, 0x06, 0x5C, 0x56, 0xC1, 0x45, 0xA7, 0x3E, 0xDC, 0xD2, 0x41, 0x59, 0x75, 0x59, 0x7E, 0xCB,
+ 0xB7, 0x0B, 0x9C, 0x44, 0xA8, 0x81, 0x6C, 0xF7, 0x89, 0x49, 0x67, 0x11, 0xCF, 0xB8, 0x0D, 0x44,
+ 0x87, 0x97, 0x97, 0xDC, 0x44, 0xF8, 0x37, 0x93, 0xE4, 0x14, 0xAC, 0xF7, 0xB1, 0x64, 0xA4, 0x2C,
+ 0xDF, 0xC5, 0x04, 0xB1, 0x99, 0x9B, 0x6F, 0x85, 0x7F, 0x77, 0x11, 0xF6, 0x70, 0x6A, 0xF6, 0xE4,
+ 0x54, 0xE7, 0xEC, 0xBC, 0x29, 0xE8, 0x11, 0x0A, 0x24, 0x8F, 0xB6, 0xC7, 0xE8, 0x76, 0x65, 0x54,
+ 0x05, 0x54, 0x80, 0x46, 0x4D, 0xA9, 0x8A, 0xF8, 0x6E, 0x46, 0x01, 0x7B, 0xD6, 0x42, 0x74, 0x54,
+ 0x43, 0xE9, 0xC7, 0xE5, 0x1E, 0xAB, 0x28, 0x66, 0xF7, 0x0A, 0xF0, 0x86, 0x71, 0x7B, 0x05, 0x50,
+ 0xDF, 0xAB, 0x7D, 0x19, 0x04, 0x5D, 0x48, 0x31, 0xD2, 0xE1, 0x75, 0x3C, 0xFF, 0xDB, 0x4A, 0xC1,
+ 0xAA, 0x63, 0xEE, 0x2C, 0xF9, 0x79, 0x11, 0x1E, 0x09, 0xCF, 0x86, 0x86, 0x0B, 0x4E, 0xD1, 0x94,
+ 0x13, 0x3F, 0x29, 0xE5, 0x81, 0xA8, 0x12, 0x41, 0xF3, 0xF3, 0x83, 0x2B, 0x2F, 0xF4, 0x18, 0x10,
+ 0x43, 0x16, 0x95, 0xD7, 0xF8, 0x3E, 0x32, 0x9E, 0x2E, 0x93, 0x08, 0xE3, 0x80, 0xD0, 0x52, 0xDD,
+ 0x68, 0x71, 0x82, 0x2A, 0x16, 0x02, 0xBF, 0xE1, 0x45, 0x93, 0x2A, 0x98, 0x49, 0x87, 0x2A, 0x3C,
+ 0xDF, 0xA0, 0xCD, 0x4C, 0x64, 0x8A, 0xAE, 0xBC, 0x39, 0x71, 0xF8, 0xBA, 0xE6, 0xAB, 0x21, 0x60,
+ 0x34, 0x74, 0x54, 0x99, 0xCD, 0x9F, 0x94, 0xB6, 0xE7, 0x62, 0x3A, 0xB7, 0x4D, 0xCB, 0x27, 0xE4,
+ 0xC8, 0x92, 0xF5, 0x45, 0x6E, 0x32, 0x91, 0x15, 0x8C, 0x4E, 0x10, 0x76, 0x1A, 0x93, 0x2C, 0x4E,
+ 0xBD, 0xDA, 0x27, 0x3F, 0x99, 0xAA, 0xB7, 0x3D, 0xF0, 0xFB, 0x34, 0xB2, 0xD2, 0x7A, 0x23, 0xBA,
+ 0xCF, 0xF4, 0xDE, 0xDB, 0xCC, 0x8C, 0xB1, 0x2D, 0x4A, 0xD6, 0xCA, 0xC0, 0xD8, 0x70, 0x58, 0xBC,
+ 0x9E, 0x22, 0x92, 0xAB, 0xD8, 0xFB, 0xE7, 0xBC, 0xEB, 0x81, 0xB3, 0x77, 0x70, 0x31, 0x86, 0xE1,
+ 0x79, 0xD8, 0x52, 0xD0, 0x6D, 0x39, 0x14, 0x78, 0x73, 0x52, 0x96, 0xE5, 0xBC, 0x2E, 0x42, 0x90,
+ 0x43, 0x2D, 0x81, 0x31, 0x01, 0xE1, 0xA4, 0x59, 0x83, 0x6E, 0xB5, 0x02, 0x8F, 0x53, 0xD0, 0x04,
+ 0x82, 0x0B, 0x60, 0xF0, 0xC6, 0x5F, 0xE4, 0x07, 0x6C, 0x8E, 0xF3, 0xC9, 0x15, 0x15, 0x38, 0xB6,
+ 0x1A, 0x17, 0x0A, 0x52, 0xEF, 0xEF, 0xDC, 0x03, 0x4E, 0x62, 0x5E, 0xF6, 0x7E, 0xAD, 0xCA, 0x52,
+ 0xA6, 0xBC, 0x21, 0xC9, 0x0A, 0x15, 0xAB, 0xA6, 0xDF, 0x6C, 0xB1, 0xF9, 0xC6, 0xF3, 0x53, 0x3B,
+ 0xA9, 0x87, 0x06, 0x62, 0x18, 0xBA, 0x06, 0x23, 0xC8, 0xA8, 0x72, 0xC7, 0x89, 0x1E, 0x1D, 0xEC,
+ 0x5E, 0x46, 0xB9, 0xBE, 0x38, 0x04, 0x0B, 0x29, 0x69, 0x60, 0x97, 0x2E, 0x6F, 0x6A, 0x7F, 0x7A,
+ 0xDD, 0x9C, 0x4A, 0x60, 0x2D, 0x19, 0x16, 0x1A, 0xD6, 0x25, 0xAB, 0x17, 0x44, 0x5E, 0x51, 0x5B,
+ 0xC3, 0x4D, 0x36, 0xC0, 0xEE, 0xA3, 0x8B, 0x10, 0x78, 0x4D, 0xC3, 0x00, 0xB5, 0x07, 0x19, 0xA4,
+ 0xC0, 0x3C, 0x99, 0x4B, 0x70, 0x48, 0xBB, 0x53, 0xFB, 0x21, 0x4D, 0x9B, 0x2B, 0x4C, 0x75, 0x6D,
+ 0x0B, 0x86, 0x49, 0x27, 0x76, 0x61, 0x1D, 0xBB, 0x8C, 0x9F, 0xCB, 0x3B, 0xF6, 0x2F, 0x63, 0x64,
+ 0x65, 0x2C, 0x38, 0x9E, 0xE7, 0x12, 0x85, 0xA7, 0x29, 0x48, 0xE9, 0xC6, 0xDB, 0x2D, 0xA6, 0x54,
+ 0x5A, 0xD5, 0xE0, 0xB6, 0x77, 0xA1, 0x78, 0x84, 0x52, 0xD7, 0xC1, 0x5B, 0x9D, 0x0D, 0x8A, 0x70,
+ 0x3E, 0x72, 0x6A, 0x5D, 0x63, 0x0D, 0xEF, 0x97, 0x68, 0x78, 0x1F, 0x35, 0xDA, 0x98, 0x6E, 0x25,
+ 0x05, 0xCC, 0xF3, 0xC0, 0x1E, 0x4F, 0xD2, 0x29, 0xE4, 0x26, 0xC2, 0x32, 0xE6, 0xA0, 0x65, 0xFE,
+ 0x3E, 0xDB, 0x71, 0xAB, 0x85, 0x79, 0xAB, 0xC9, 0x8D, 0xD1, 0x8A, 0xF2, 0xA2, 0x62, 0xE7, 0x4F,
+ 0xC5, 0xCD, 0x09, 0x94, 0xFD, 0xF0, 0x0E, 0xA2, 0x3D, 0x98, 0x8E, 0x65, 0x35, 0x5F, 0xC8, 0xD5,
+ 0xCC, 0xE2, 0xED, 0x3B, 0x50, 0xB5, 0x52, 0x57, 0xB1, 0x04, 0xA1, 0x6E, 0x48, 0x58, 0xE5, 0x61,
+ 0x75, 0x8D, 0xD2, 0x34, 0x21, 0x62, 0xC3, 0xD2, 0x0C, 0x51, 0xF1, 0x2B, 0xD4, 0xF7, 0xA7, 0x04,
+ 0xE7, 0x22, 0x7B, 0xC0, 0xF0, 0x14, 0xFF, 0x3F, 0xAD, 0x46, 0xED, 0xF3, 0xC1, 0xC6, 0x4D, 0xE7,
+ 0x95, 0x86, 0x60, 0xE3, 0x6E, 0x01, 0xE8, 0x96, 0xEF, 0x85, 0xF3, 0xC0, 0x8C, 0xF1, 0x7D, 0x70,
+ 0x4E, 0x69, 0x5C, 0x06, 0xD0, 0xF9, 0x71, 0x0D, 0x9C, 0x6F, 0x5F, 0xC9, 0xFC, 0x27, 0x32, 0x13,
+ 0x0A, 0xA2, 0x79, 0x31, 0x91, 0x19, 0xFE, 0x50, 0xA5, 0x49, 0xC5, 0x39, 0x9E, 0x7C, 0xD6, 0x89,
+ 0xF9, 0x85, 0x1D, 0x08, 0x1A, 0xD1, 0xF1, 0xA5, 0x9C, 0x35, 0xE9, 0x24, 0x12, 0xDC, 0x15, 0x89,
+ 0x30, 0xB9, 0x99, 0xEF, 0x54, 0x79, 0xCC, 0x68, 0x78, 0xFE, 0x77, 0xDE, 0x51, 0xAD, 0x89, 0x7A,
+ 0x4C, 0x31, 0x29, 0x1D, 0x70, 0x45, 0x80, 0xC6, 0x7D, 0xA4, 0xFD, 0xE4, 0x86, 0xA0, 0xA2, 0x4A,
+ 0x31, 0x17, 0xA9, 0xD0, 0x08, 0xCC, 0xF9, 0xEF, 0x3C, 0x71, 0x1A, 0xEE, 0xFA, 0x94, 0x83, 0x1D,
+ 0x2B, 0xEF, 0x19, 0x00, 0xD0, 0x43, 0xB8, 0x10, 0x35, 0x63, 0x06, 0x9D, 0xA8, 0xFC, 0xF9, 0xC3,
+ 0x07, 0x39, 0x48, 0x0E, 0x86, 0x95, 0x80, 0xD2, 0x9E, 0xB0, 0x9E, 0x89, 0x96, 0x2D, 0x58, 0x5D,
+ 0xD6, 0x88, 0x77, 0xEB, 0x64, 0xC0, 0xA2, 0xB6, 0xCD, 0x96, 0x7D, 0xE2, 0xC8, 0x21, 0x93, 0x65,
+ 0x51, 0xF1, 0x17, 0xAE, 0xB7, 0xF8, 0xBF, 0x90, 0x54, 0x40, 0xE0, 0x9C, 0xD0, 0xDE, 0xD7, 0xFC,
+ 0x18, 0x55, 0x6B, 0x58, 0x0C, 0x17, 0xC7, 0xA3, 0x06, 0x93, 0x9B, 0x2F, 0x68, 0x7E, 0x7D, 0x0F,
+ 0x0C, 0xC8, 0x6F, 0xC5, 0xDB, 0x37, 0xA1, 0x46, 0xE4, 0xDA, 0x1E, 0x66, 0x06, 0xF3, 0x24, 0xB0,
+ 0x05, 0xA2, 0x16, 0x76, 0x2D, 0xA4, 0xA2, 0x27, 0x18, 0x56, 0x63, 0x92, 0xD8, 0xED, 0x9D, 0xA7,
+ 0x3A, 0xC0, 0xA8, 0xFE, 0x24, 0x0F, 0x06, 0xC4, 0x05, 0x74, 0xA5, 0x31, 0xA0, 0x42, 0xFC, 0x59,
+ 0xD0, 0xC3, 0x79, 0x6E, 0x1D, 0x6E, 0x35, 0xFC, 0xBB, 0x58, 0x20, 0x0D, 0x5B, 0xA6, 0xAF, 0xBD,
+ 0x07, 0x81, 0xBC, 0xBE, 0x52, 0x37, 0x20, 0x4C, 0x0D, 0x6A, 0x28, 0xE6, 0x12, 0x3D, 0x0B, 0x84,
+ 0xE1, 0xBE, 0x4F, 0x93, 0x56, 0x5A, 0xCB, 0x82, 0x23, 0x8C, 0xF1, 0xF9, 0xB1, 0xEB, 0xAC, 0x5C,
+ 0x88, 0xB4, 0xC0, 0xF8, 0x6A, 0x78, 0x40, 0x13, 0x43, 0xA3, 0xB9, 0xE3, 0x65, 0xE8, 0xAA, 0x0A,
+ 0xC3, 0xCB, 0x19, 0x9A, 0x7B, 0x76, 0xBA, 0x2A, 0xBF, 0x48, 0xAF, 0xFA, 0x9A, 0xFD, 0x69, 0x46,
+ 0x27, 0x7F, 0x34, 0xF8, 0x9F, 0x89, 0x87, 0xB8, 0x5E, 0x34, 0xCE, 0x40, 0x9E, 0xE7, 0x0E, 0xC1,
+ 0x29, 0x27, 0x5F, 0xD4, 0xEB, 0x5F, 0x3A, 0xD3, 0x20, 0xD7, 0xCC, 0x4B, 0x04, 0x22, 0xD5, 0x48,
+ 0x3B, 0x87, 0x7E, 0x80, 0x31, 0xD0, 0xCF, 0xEB, 0x9E, 0xAB, 0xAE, 0xF0, 0x98, 0x5B, 0x50, 0xC3,
+ 0xED, 0x5A, 0xF9, 0xF8, 0xC6, 0xA2, 0xF9, 0x6E, 0x32, 0x22, 0x46, 0x74, 0x01, 0x55, 0xE2, 0x40,
+ 0xA2, 0x0D, 0x15, 0xEA, 0x4B, 0x67, 0x9A, 0x61, 0x5E, 0x10, 0x40, 0x43, 0xE8, 0xDF, 0x81, 0xB3,
+ 0x4C, 0x0C, 0x27, 0x1F, 0x04, 0x74, 0x5F, 0x49, 0x3E, 0x81, 0x6F, 0x52, 0xC8, 0x4A, 0xD7, 0x0F,
+ 0xD8, 0xCB, 0x6F, 0x0B, 0x76, 0xBE, 0xB2, 0x64, 0xE0, 0x02, 0x08, 0xC6, 0x9E, 0x17, 0xDC, 0x37,
+ 0x76, 0xD4, 0x94, 0xE4, 0xAC, 0xA0, 0x7A, 0x06, 0x4A, 0x48, 0x30, 0x16, 0x54, 0x5B, 0xB8, 0x03,
+ 0x4D, 0x83, 0x67, 0x56, 0x2F, 0x37, 0xFD, 0xC7, 0xC3, 0x60, 0xCC, 0xF9, 0x9D, 0x71, 0x9F, 0x0F,
+ 0xE4, 0xDE, 0x4F, 0xE1, 0xE0, 0x4A, 0xF5, 0xEB, 0xB1, 0x19, 0x92, 0xDF, 0x20, 0x9D, 0x7E, 0x99,
+ 0x0A, 0x06, 0xB6, 0x90, 0x25, 0x3A, 0x6E, 0x21, 0x10, 0x8F, 0x71, 0xAF, 0x7B, 0x26, 0xB3, 0x48,
+ 0x85, 0x1E, 0x37, 0x14, 0x16, 0x6C, 0x71, 0x2A, 0xED, 0x0A, 0x73, 0xFB, 0x9B, 0x8B, 0x30, 0xC6,
+ 0x6B, 0xE5, 0xCD, 0x29, 0x4B, 0xE3, 0x16, 0xC7, 0x8B, 0x97, 0x24, 0xE6, 0xD6, 0x5D, 0x4C, 0x66,
+ 0xAE, 0xE6, 0x28, 0xC3, 0x79, 0x93, 0xE5, 0x38, 0xE9, 0x83, 0x9C, 0x3B, 0xAC, 0x90, 0x8F, 0x7C,
+ 0x73, 0x4E, 0xA7, 0xC9, 0x56, 0x39, 0x75, 0x20, 0xE1, 0x94, 0x4A, 0x34, 0x99, 0xF1, 0x6D, 0x47,
+ 0xD5, 0x51, 0x24, 0x0A, 0xD3, 0x3B, 0xB6, 0x4F, 0x87, 0xD2, 0x8C, 0x3E, 0xAE, 0xCD, 0xC0, 0xBA,
+ 0xCA, 0x51, 0xAC, 0x56, 0xBD, 0xB5, 0xAA, 0xAC, 0xA4, 0xB0, 0xC5, 0x7E, 0xD8, 0x7B, 0x50, 0xC2,
+ 0x8B, 0x0F, 0xCE, 0x14, 0xEB, 0xB6, 0x0C, 0x0A, 0x0F, 0x2D, 0xE0, 0xFF, 0x8D, 0x3C, 0xCE, 0x0E,
+ 0x98, 0xF3, 0x97, 0x44, 0x28, 0xE8, 0x6C, 0x0B, 0x90, 0x7F, 0xAB, 0xD1, 0xB6, 0xA2, 0xDE, 0x7F,
+ 0x49, 0x30, 0x52, 0x45, 0x90, 0x8F, 0xB2, 0x3E, 0x50, 0x3E, 0x24, 0x72, 0x11, 0xB8, 0xB6, 0x20,
+ 0x69, 0xC1, 0x85, 0x54, 0xD4, 0x33, 0x46, 0xEC, 0x99, 0xDD, 0x21, 0xB9, 0x37, 0x2A, 0x81, 0xD0,
+ 0xC2, 0xC8, 0x19, 0xEC, 0x95, 0x7B, 0x5E, 0xC5, 0xBC, 0x08, 0x53, 0x36, 0xD9, 0xE1, 0x51, 0x50,
+ 0xD3, 0x7B, 0xB2, 0xDA, 0xF9, 0x33, 0x92, 0xBF, 0x17, 0x28, 0xF4, 0x1C, 0x5E, 0x35, 0x4C, 0x74,
+ 0xD4, 0x82, 0xFA, 0xBA, 0xBE, 0x89, 0x81, 0x44, 0x10, 0xBE, 0x9D, 0x2E, 0xBA, 0x40, 0xF0, 0x83,
+ 0xE3, 0x42, 0xF4, 0x5F, 0x4D, 0x2A, 0xFD, 0xC5, 0x5D, 0xF1, 0xCE, 0x83, 0x20, 0xD6, 0xEF, 0xBF,
+ 0xB1, 0xBB, 0xC4, 0xC7, 0x53, 0x69, 0x10, 0x80, 0x65, 0x73, 0xBF, 0xCE, 0x0A, 0x41, 0x03, 0xEF,
+ 0x4A, 0xB4, 0xA7, 0x23, 0x7D, 0x6C, 0xE8, 0x5F, 0x2F, 0x44, 0x96, 0xD9, 0xD3, 0x10, 0xA5, 0xF7,
+ 0xAA, 0x5C, 0x18, 0xA0, 0x31, 0x00, 0xB9, 0xB2, 0xD9, 0x12, 0x1C, 0x4B, 0x22, 0x66, 0xCF, 0xED,
+ 0xB8, 0xC3, 0xF7, 0xE6, 0x1A, 0xF5, 0xCE, 0xA4, 0xEB, 0xED, 0x69, 0xE8, 0x38, 0xA0, 0x9F, 0x47,
+ 0x3E, 0x4C, 0x51, 0xDC, 0xFB, 0x4B, 0x34, 0xBC, 0xFA, 0xD4, 0x52, 0xFC, 0x11, 0x6F, 0xBA, 0x3E,
+ 0x06, 0x82, 0x4B, 0x06, 0x8F, 0x8A, 0x66, 0x2C, 0xAE, 0x9B, 0x5F, 0x1D, 0x74, 0x46, 0xBF, 0x9B,
+ 0xB3, 0x94, 0x7A, 0xE2, 0xEE, 0x68, 0xB4, 0x91, 0x37, 0x44, 0x8A, 0xF6, 0x2C, 0xC5, 0x99, 0x7E,
+ 0x68, 0x3A, 0xED, 0x2E, 0x05, 0x0B, 0xBF, 0xCB, 0x99, 0x31, 0xBC, 0xBD, 0x96, 0x26, 0x2F, 0x11,
+ 0xA3, 0xEC, 0x67, 0x3D, 0xBF, 0x08, 0x02, 0xAB, 0x12, 0x43, 0x39, 0x60, 0xCE, 0xCF, 0x35, 0xE8,
+ 0x88, 0xC6, 0x57, 0xA4, 0x7A, 0x35, 0x80, 0x48, 0x3C, 0x6C, 0xC9, 0x9B, 0xDA, 0xE5, 0xB3, 0x48,
+ 0x51, 0x92, 0x7B, 0x8B, 0x45, 0xFB, 0x5F, 0x88, 0xDB, 0x95, 0x73, 0xC2, 0x43, 0xD2, 0x92, 0xA3,
+ 0x34, 0x0F, 0xCB, 0x83, 0x90, 0x78, 0xE6, 0x7A, 0x45, 0x9C, 0xEA, 0xD5, 0x03, 0xCC, 0xEB, 0xB3,
+ 0x74, 0xE2, 0x0E, 0x9A, 0xB5, 0xFB, 0xF2, 0x48, 0x5C, 0x3E, 0xB1, 0x67, 0x0C, 0xB8, 0x6C, 0x36,
+ 0x08, 0x84, 0xC6, 0x4C, 0x82, 0x98, 0xE4, 0xD8, 0x1D, 0x58, 0x15, 0xAC, 0xC4, 0x41, 0xF7, 0x9D,
+ 0x08, 0x64, 0x4A, 0xE9, 0x74, 0x7E, 0x3B, 0x91, 0xC1, 0xE3, 0x9A, 0x0E, 0x81, 0x5C, 0xD1, 0x5C,
+ 0x7A, 0x95, 0x02, 0xD4, 0x28, 0x30, 0xD4, 0xE0, 0xAE, 0xB8, 0xF1, 0x7B, 0xCF, 0xAC, 0x50, 0x90,
+ 0xEF, 0x8F, 0x18, 0xD1, 0x9A, 0x19, 0x6F, 0x41, 0x65, 0xCB, 0x28, 0xBD, 0x9C, 0xB6, 0x27, 0x65,
+ 0x8B, 0xB5, 0xB8, 0x08, 0xC7, 0x41, 0xBC, 0xF2, 0x63, 0x6D, 0x9C, 0xD7, 0x69, 0x03, 0xBF, 0xB0,
+ 0x7B, 0x04, 0xCC, 0xFD, 0x74, 0xA0, 0xBD, 0x81, 0x08, 0x86, 0x4F, 0x42, 0x25, 0xD2, 0x4A, 0x66,
+ 0x49, 0x3E, 0xD0, 0x7A, 0x3D, 0x54, 0xCB, 0x50, 0x94, 0xF3, 0x7F, 0x3A, 0xF2, 0x91, 0xE6, 0x5E,
+ 0x11, 0xC6, 0xA4, 0x76, 0x97, 0xC3, 0x6C, 0x21, 0x0E, 0xB6, 0xBA, 0x10, 0x4A, 0xE3, 0xDC, 0xDC,
+ 0x43, 0x3B, 0xF0, 0x0B, 0x47, 0x65, 0xB9, 0xD7, 0x0B, 0x32, 0xFD, 0xF5, 0x51, 0x03, 0xEA, 0x8C,
+ 0x01, 0x65, 0xC4, 0x6B, 0x25, 0xF1, 0xC2, 0x3A, 0x09, 0x65, 0x1D, 0x58, 0xDE, 0xF4, 0x2B, 0xC7,
+ 0x67, 0x30, 0x04, 0x08, 0x0A, 0x7A, 0x3A, 0x4B, 0xE4, 0xE7, 0xE8, 0xBE, 0xFF, 0x05, 0x42, 0xFC,
+ 0xE0, 0x1F, 0xAE, 0xA8, 0x75, 0xBA, 0xE9, 0xDC, 0x8C, 0xBD, 0x30, 0xB8, 0x1D, 0x04, 0x57, 0xD3,
+ 0x93, 0x1A, 0x43, 0x93, 0xFE, 0x5D, 0x6A, 0x28, 0xBE, 0xE0, 0x39, 0xB2, 0xCC, 0xF0, 0x7D, 0x06,
+ 0x4C, 0x95, 0xFC, 0x62, 0xC7, 0x05, 0xEB, 0x16, 0x88, 0x2B, 0x0E, 0x96, 0xF1, 0xC7, 0x43, 0xC2,
+ 0xB7, 0xE9, 0x2F, 0xEC, 0xA0, 0x5C, 0x9A, 0xD7, 0x26, 0x64, 0x69, 0xDB, 0x13, 0x25, 0xD8, 0x43,
+ 0xE0, 0x5B, 0x0B, 0xA1, 0xE4, 0xB0, 0xF2, 0x4E, 0x6A, 0x9C, 0xF4, 0x7B, 0x9E, 0xE3, 0xB7, 0xD4,
+ 0xC6, 0x10, 0xF2, 0x37, 0x45, 0x8A, 0x6B, 0x97, 0x28, 0x2E, 0x0E, 0xA0, 0x93, 0x13, 0xF7, 0x0B,
+ 0x8A, 0xB9, 0x9F, 0xC0, 0xE4, 0x4A, 0xED, 0xE1, 0x79, 0x32, 0x31, 0x97, 0x2B, 0xB7, 0x09, 0xB5,
+ 0xB9, 0xE3, 0x57, 0x56, 0x5F, 0x81, 0x28, 0x85, 0xAA, 0xF8, 0x69, 0x77, 0x40, 0x74, 0xD6, 0x4B,
+ 0x7A, 0xAC, 0xD5, 0x2D, 0x74, 0xB4, 0x67, 0x89, 0xE1, 0xF1, 0xD9, 0x1F, 0xB8, 0xDC, 0xDF, 0x0D,
+ 0x8D, 0xA6, 0xA7, 0x8D, 0xF1, 0x59, 0x30, 0xD6, 0x00, 0x26, 0xD1, 0x21, 0x2E, 0xE7, 0xB7, 0x91,
+ 0x2E, 0xA9, 0xF6, 0xD0, 0x5A, 0xB6, 0x8A, 0x34, 0x59, 0x92, 0x9E, 0x37, 0x1E, 0xD9, 0x38, 0x2A,
+ 0xAE, 0x12, 0xD4, 0x95, 0x8B, 0xE8, 0xA7, 0x5D, 0x8C, 0x92, 0xA1, 0x8A, 0x4D, 0x9E, 0x64, 0x20,
+ 0xA2, 0x7E, 0xCC, 0x39, 0x50, 0xA4, 0x01, 0xEC, 0xA7, 0xF5, 0x6D, 0x88, 0x8E, 0xB6, 0xCE, 0xA4,
+ 0x58, 0xAA, 0xFB, 0xCA, 0xC5, 0x67, 0x26, 0x07, 0xBB, 0xEC, 0xFB, 0x73, 0x5D, 0x48, 0x9B, 0x49,
+ 0xFE, 0x99, 0x25, 0x6D, 0x82, 0x1F, 0x6E, 0x6E, 0x1E, 0x21, 0xBF, 0x94, 0x52, 0xB7, 0xAC, 0x8E,
+ 0x74, 0x22, 0x10, 0x27, 0x14, 0x6F, 0xDC, 0x80, 0xBD, 0xB3, 0xD6, 0xAD, 0x1F, 0x17, 0x59, 0x6B,
+ 0x42, 0x68, 0xBD, 0x37, 0xCF, 0xC6, 0x46, 0x11, 0x64, 0x9E, 0xEB, 0xF5, 0xCD, 0xA2, 0x5F, 0x3F,
+ 0xC8, 0x0E, 0x1F, 0xCC, 0xFA, 0xE0, 0x59, 0xC4, 0x82, 0x8B, 0x8E, 0xC4, 0x8C, 0x96, 0x56, 0xF5,
+ 0x16, 0x2A, 0x53, 0x0E, 0x36, 0xC9, 0x61, 0x34, 0x3F, 0x0F, 0x73, 0xC3, 0xD9, 0x0C, 0x3B, 0x74,
+ 0xD5, 0x97, 0x3F, 0x2D, 0x1B, 0xCF, 0x1F, 0xD2, 0xFC, 0xFF, 0xBC, 0xFB, 0x9E, 0xE7, 0x5D, 0x30,
+ 0x5D, 0x9C, 0x66, 0x06, 0x26, 0xD3, 0x0A, 0x4E, 0x4C, 0x45, 0xA8, 0xE6, 0x23, 0x0A, 0xE1, 0x3A,
+ 0x31, 0x39, 0xC0, 0x01, 0x9D, 0x19, 0xD3, 0x2A, 0x28, 0xD7, 0x43, 0x40, 0x38, 0xC5, 0xA9, 0xCC,
+ 0x80, 0x71, 0xAF, 0xDC, 0xEF, 0x4E, 0x85, 0xC0, 0xBE, 0x56, 0xC1, 0x54, 0xA6, 0xDE, 0x30, 0xE4,
+ 0xF9, 0xD0, 0x1B, 0x40, 0x6A, 0x61, 0x2B, 0x5C, 0x2B, 0xF6, 0x16, 0x99, 0xD7, 0x62, 0xC2, 0x59,
+ 0x81, 0x87, 0xFB, 0x93, 0x45, 0xEE, 0x38, 0xB8, 0xE7, 0xDD, 0x37, 0xC0, 0x76, 0xC9, 0x0D, 0x17,
+ 0x06, 0x34, 0xD3, 0xB3, 0x6E, 0x88, 0x26, 0x99, 0x48, 0x0E, 0x67, 0x46, 0xE3, 0xE4, 0x22, 0x97,
+ 0xFA, 0xD3, 0xC3, 0x66, 0xD1, 0x08, 0x17, 0x93, 0xDD, 0xC9, 0xC6, 0x41, 0xC7, 0x12, 0x4F, 0x83,
+ 0xB8, 0xCC, 0x60, 0xA0, 0x24, 0xB7, 0x17, 0x16, 0x31, 0xC6, 0x42, 0xEB, 0xEC, 0x48, 0xE1, 0xEB,
+ 0x75, 0x54, 0x75, 0xE8, 0x01, 0xF6, 0x42, 0x67, 0xF1, 0x46, 0xF7, 0xB7, 0x2A, 0x22, 0x88, 0x20,
+ 0xAC, 0xCF, 0xA3, 0x27, 0x36, 0x38, 0xD0, 0x70, 0x99, 0xD5, 0x63, 0xA3, 0xF7, 0x05, 0x25, 0x52,
+ 0x82, 0x04, 0x02, 0xED, 0xBD, 0x13, 0x9F, 0xCE, 0x89, 0xD0, 0x6E, 0xE2, 0x85, 0xBB, 0xEC, 0x7B,
+ 0xFA, 0x6C, 0x88, 0x4B, 0x57, 0xD4, 0xC7, 0xCA, 0x5A, 0x01, 0x6A, 0x6C, 0xD9, 0x75, 0x1E, 0x89,
+ 0x26, 0xFA, 0x4A, 0x0E, 0x1F, 0x2B, 0xA9, 0x97, 0xDB, 0x19, 0x4E, 0xD4, 0x55, 0x5C, 0x3D, 0xF2,
+ 0xDB, 0xD7, 0x5B, 0x60, 0x9E, 0x12, 0x4A, 0x62, 0x45, 0xE7, 0xBB, 0x0E, 0xEF, 0x67, 0x99, 0x68,
+ 0xAA, 0x0E, 0x2B, 0x49, 0x82, 0x8D, 0x7E, 0x4C, 0xA4, 0x78, 0x08, 0xC3, 0xAE, 0x79, 0xF4, 0x39,
+ 0xC1, 0xEC, 0x00, 0xB4, 0x9D, 0x7C, 0x40, 0xFC, 0x6B, 0xBC, 0x16, 0xDB, 0xD8, 0xC4, 0x48, 0x5B,
+ 0x63, 0x16, 0xF6, 0xCE, 0xAA, 0x99, 0xC8, 0xF2, 0x87, 0x2A, 0x05, 0xAD, 0x31, 0xB8, 0xA0, 0x1D,
+ 0xA0, 0xA2, 0x03, 0x0C, 0x54, 0xD5, 0x7B, 0x0C, 0xBF, 0x35, 0x70, 0x57, 0xCD, 0xE3, 0xB0, 0x57,
+ 0xE8, 0xBE, 0x7A, 0x95, 0xDF, 0xDF, 0xAB, 0x11, 0x55, 0x86, 0xA3, 0x27, 0x6E, 0x0B, 0x7B, 0xF0,
+ 0xAD, 0x2E, 0xEE, 0xF8, 0xD6, 0x10, 0xC8, 0x4D, 0x68, 0xCE, 0xA7, 0x86, 0xFC, 0x45, 0xC1, 0x1E,
+ 0x4E, 0x56, 0x61, 0x1E, 0xE8, 0x2C, 0xCA, 0x0D, 0x51, 0xD2, 0x2C, 0xC3, 0x7E, 0xCF, 0xB3, 0x96,
+ 0x1B, 0xEA, 0xD6, 0x0B, 0x2D, 0x86, 0xDD, 0x8C, 0xAA, 0xAF, 0x1B, 0x4C, 0x4A, 0xA7, 0xA1, 0x53,
+ 0x5F, 0x8D, 0xB6, 0x0A, 0x3F, 0x5C, 0xA8, 0x23, 0x33, 0xCB, 0x92, 0xEA, 0x1A, 0xEF, 0xBD, 0x2F,
+ 0x89, 0xA1, 0x5C, 0x73, 0x3D, 0xDE, 0x51, 0x64, 0xC5, 0x52, 0xA7, 0x92, 0xBC, 0x1D, 0xCA, 0xBA,
+ 0xC8, 0xFC, 0x2C, 0x1A, 0x69, 0x44, 0x71, 0xFE, 0xAB, 0x2A, 0x2E, 0xBB, 0x02, 0x92, 0xED, 0x90,
+ 0x01, 0xBC, 0x44, 0x7F, 0x6F, 0x76, 0x1E, 0x30, 0xDC, 0x4D, 0x3D, 0xBC, 0x01, 0xD1, 0x1E, 0xE5,
+ 0x71, 0x0E, 0xA6, 0x7D, 0xE1, 0xD5, 0xA6, 0x08, 0xA6, 0x66, 0x9F, 0x0F, 0xAC, 0x11, 0x96, 0x66,
+ 0x13, 0x03, 0x9F, 0x4C, 0x0E, 0x8A, 0x2A, 0x4C, 0x39, 0xF0, 0xC6, 0x8E, 0x41, 0x9B, 0x23, 0xDD,
+ 0xDB, 0x7B, 0x94, 0x71, 0x6C, 0x78, 0x1B, 0xA6, 0xC1, 0xA8, 0x9B, 0xA5, 0x86, 0x0E, 0x02, 0x97,
+ 0x72, 0x2F, 0xE8, 0xE0, 0x01, 0x64, 0x39, 0x8C, 0x6C, 0x4F, 0x64, 0x24, 0x34, 0x81, 0x33, 0x6D,
+ 0xC6, 0x56, 0x60, 0x23, 0x8C, 0xB1, 0xA3, 0x11, 0x94, 0x37, 0xEF, 0xE4, 0x3E, 0x4D, 0xAF, 0x61,
+ 0x2C, 0xF8, 0x86, 0x03, 0xFB, 0x25, 0xA3, 0x0F, 0xFA, 0x04, 0x3F, 0x72, 0x10, 0xF1, 0xE6, 0x71,
+ 0x13, 0x8A, 0xD7, 0xD3, 0x04, 0x92, 0x46, 0x4A, 0x31, 0xAB, 0x5A, 0x1D, 0x16, 0x68, 0x77, 0x26,
+ 0x9C, 0x28, 0x86, 0x27, 0xD9, 0x60, 0xCA, 0x74, 0x41, 0x90, 0xB6, 0x0C, 0x91, 0xB1, 0x1E, 0x82,
+ 0xD9, 0x81, 0x63, 0x00, 0x2A, 0xA0, 0x07, 0x74, 0x62, 0x3B, 0xBD, 0x5B, 0x9C, 0xA0, 0x6E, 0xE0,
+ 0x55, 0x9B, 0x0A, 0x60, 0x84, 0x92, 0x7E, 0xB1, 0xF1, 0xFC, 0x36, 0x97, 0xF8, 0x92, 0xAF, 0x3B,
+ 0xD1, 0x2A, 0xBF, 0x4E, 0xFD, 0x68, 0xC2, 0xF5, 0x89, 0xED, 0xE8, 0x4A, 0x44, 0xA0, 0x66, 0x50,
+ 0xDF, 0x4F, 0x6B, 0x9D, 0x1C, 0x98, 0xA4, 0xF4, 0x22, 0x9F, 0x51, 0x17, 0x46, 0x4F, 0xFC, 0x07,
+ 0xAD, 0xE6, 0x24, 0xF9, 0x5F, 0x9F, 0x56, 0x49, 0x6A, 0x15, 0x39, 0xCA, 0x68, 0x98, 0xAF, 0xF1,
+ 0x3F, 0xFB, 0x60, 0x36, 0xDC, 0xB7, 0xD4, 0x27, 0x1F, 0x98, 0xDD, 0x6B, 0x21, 0x72, 0x1C, 0x4F,
+ 0x4C, 0x93, 0xC4, 0x01, 0xA4, 0x9C, 0xB7, 0x02, 0xC3, 0xFE, 0xCA, 0xC0, 0x8D, 0xD5, 0xBA, 0x09,
+ 0xB9, 0xAF, 0x1C, 0xB0, 0x08, 0x09, 0x36, 0x70, 0x91, 0x08, 0xF5, 0x1B, 0x14, 0xE9, 0x81, 0xB1,
+ 0xD1, 0xA0, 0x94, 0x4C, 0x73, 0x46, 0xBB, 0x7C, 0xFA, 0xB9, 0xE7, 0x31, 0x94, 0xFD, 0xCE, 0x97,
+ 0xDB, 0x52, 0x32, 0x11, 0x72, 0xD7, 0x1C, 0xDE, 0x97, 0xBE, 0x19, 0xD9, 0xCB, 0xCC, 0xEF, 0x0F,
+ 0x2C, 0x90, 0xEA, 0xED, 0x1F, 0x07, 0x10, 0xD4, 0x4E, 0xDF, 0x3F, 0x92, 0x29, 0x57, 0x22, 0x7A,
+ 0x18, 0xB0, 0xE1, 0xDE, 0x76, 0x61, 0xF3, 0xBA, 0x84, 0xD4, 0x7D, 0x9C, 0x92, 0x7B, 0x0B, 0xC2,
+ 0x7F, 0x6A, 0xF5, 0x5E, 0x77, 0xD6, 0xBB, 0xF5, 0x23, 0x1D, 0xCE, 0x52, 0xFA, 0x21, 0x33, 0xD1,
+ 0x33, 0x38, 0x65, 0x34, 0xCE, 0x8C, 0x25, 0x9D, 0xF4, 0x95, 0xF1, 0x71, 0x17, 0xE6, 0x08, 0x96,
+ 0xEA, 0x54, 0xA1, 0xA1, 0xEB, 0xFD, 0x90, 0xAE, 0x63, 0x42, 0xC0, 0x8B, 0x57, 0xD4, 0x64, 0xDF,
+ 0xB9, 0xF1, 0xB2, 0x8A, 0xAD, 0x42, 0x64, 0x99, 0xF4, 0x3E, 0x72, 0xDB, 0xE1, 0x18, 0xF2, 0x28,
+ 0x0A, 0xDD, 0xB9, 0x8D, 0x66, 0xC2, 0xB1, 0x02, 0xDC, 0xAB, 0x31, 0x2E, 0x42, 0xC8, 0x7A, 0xC0,
+ 0xD2, 0x82, 0x7B, 0x2E, 0xBA, 0x25, 0x07, 0x51, 0xB6, 0xC2, 0xDC, 0x75, 0x84, 0x5B, 0xB5, 0x43,
+ 0x36, 0x37, 0x26, 0x8B, 0x89, 0x77, 0x50, 0xC3, 0x49, 0xC0, 0xA1, 0x41, 0xDC, 0xAA, 0x84, 0x32,
+ 0x4E, 0x77, 0xE5, 0xC3, 0xF2, 0x2E, 0xD8, 0xA0, 0x29, 0x64, 0xAA, 0x4A, 0x43, 0x90, 0xBA, 0xB1,
+ 0x84, 0xFB, 0x9D, 0x40, 0x82, 0x97, 0x01, 0xFE, 0x22, 0x40, 0x54, 0x06, 0x68, 0x9A, 0x9E, 0xB6,
+ 0x29, 0x21, 0xFB, 0x9F, 0xD4, 0x3A, 0x23, 0xDC, 0xAC, 0xB6, 0x7F, 0x19, 0xC8, 0x01, 0x12, 0x40,
+ 0xDB, 0xFB, 0xA1, 0x93, 0xAD, 0xD2, 0x03, 0xFA, 0xB3, 0xA1, 0x47, 0x49, 0x8E, 0x8E, 0xA2, 0xF8,
+ 0xDA, 0xB8, 0xDA, 0xF8, 0x55, 0x2E, 0x8D, 0x91, 0x8E, 0x8C, 0x03, 0x1C, 0x6D, 0x9F, 0x09, 0x41,
+ 0x4B, 0x0A, 0x20, 0xDF, 0x6C, 0x1E, 0x07, 0x33, 0x39, 0xDC, 0xFE, 0x4F, 0xD1, 0xC9, 0xFE, 0xC1,
+ 0x44, 0x38, 0x95, 0x88, 0xE6, 0xAA, 0x20, 0x43, 0x3A, 0x23, 0xBB, 0x05, 0x47, 0x34, 0x26, 0x19,
+ 0xD0, 0x9F, 0x7B, 0x3F, 0x6D, 0x10, 0x36, 0xBD, 0xC1, 0x96, 0x4B, 0xB2, 0x2B, 0x25, 0x36, 0xD3,
+ 0x79, 0x74, 0x1D, 0xDD, 0x88, 0x8D, 0x05, 0x4A, 0xF1, 0xA6, 0xC6, 0x62, 0xE7, 0x28, 0x06, 0xD7,
+ 0x34, 0x73, 0x2F, 0xB8, 0xDE, 0x3C, 0xB3, 0xAA, 0x69, 0xBD, 0xDA, 0x1A, 0x30, 0xE8, 0x59, 0x44,
+ 0x81, 0xCB, 0xCF, 0xAA, 0xE0, 0xD0, 0x1B, 0x7C, 0xC6, 0x0E, 0xD7, 0x24, 0x12, 0xA9, 0x86, 0xB7,
+ 0xC3, 0x73, 0xA4, 0x87, 0x35, 0xC5, 0x6D, 0x44, 0x41, 0x30, 0xC0, 0x53, 0xF3, 0x15, 0x12, 0x12,
+ 0xEA, 0xA0, 0x50, 0x95, 0xA4, 0x8A, 0xC3, 0x4B, 0xB1, 0xC1, 0xA8, 0xB6, 0x20, 0x63, 0x00, 0x8B,
+ 0x77, 0x29, 0x30, 0x51, 0x60, 0x87, 0x7C, 0x0E, 0x80, 0x3C, 0x7A, 0xB3, 0x56, 0x82, 0x99, 0xEC,
+ 0xA2, 0x9D, 0x87, 0xE0, 0x8A, 0x7B, 0xF9, 0x88, 0x74, 0xEF, 0xE6, 0x95, 0xC4, 0x58, 0xFD, 0x85,
+ 0xAF, 0xBD, 0x16, 0xFD, 0xAD, 0x5D, 0x5F, 0xFB, 0xE7, 0xCC, 0xD0, 0x50, 0x59, 0x80, 0x2B, 0x12,
+ 0x2F, 0xB2, 0x2E, 0xC0, 0xEB, 0x6C, 0xF9, 0xE9, 0x95, 0xA7, 0x7E, 0xD5, 0xBD, 0x07, 0x68, 0xFB,
+ 0x09, 0xF3, 0xF9, 0x6F, 0xF2, 0xE1, 0x40, 0x78, 0x9D, 0xD1, 0xA4, 0x85, 0xFF, 0x8F, 0x2E, 0x85,
+ 0x87, 0xF2, 0xAA, 0x77, 0xD8, 0xFC, 0xF9, 0x96, 0x74, 0xB0, 0xB4, 0x1E, 0x3C, 0x2C, 0x17, 0x63,
+ 0x3B, 0x03, 0xF0, 0xF0, 0xC9, 0x29, 0x57, 0x11, 0x81, 0xF8, 0x1B, 0x68, 0x03, 0x40, 0x53, 0x0C,
+ 0x75, 0x4C, 0x93, 0x6D, 0xC4, 0x5D, 0x40, 0xD0, 0x91, 0xAC, 0xA1, 0x6E, 0x5F, 0xDD, 0x0F, 0x51,
+ 0xB8, 0x77, 0x2D, 0x0E, 0x71, 0x45, 0x53, 0x2A, 0x10, 0x83, 0x4A, 0xFA, 0x1B, 0xE7, 0x51, 0x8E,
+ 0xE0, 0xDF, 0x54, 0xBF, 0xBF, 0xA8, 0x6E, 0xC2, 0xA9, 0x15, 0x1D, 0x15, 0x15, 0x21, 0x9A, 0x9F,
+ 0x72, 0x00, 0x0C, 0xB3, 0xD6, 0xF6, 0xF6, 0x25, 0x73, 0xE6, 0x27, 0xFD, 0x24, 0xF4, 0x06, 0x63,
+ 0x21, 0x40, 0x0F, 0x38, 0x24, 0xDC, 0x78, 0x7A, 0x5A, 0x60, 0x50, 0xA6, 0xAD, 0x1D, 0x02, 0x27,
+ 0x60, 0xC5, 0x2B, 0x11, 0x6B, 0xD3, 0x44, 0x52, 0x25, 0xAC, 0x90, 0x8C, 0x8E, 0xBD, 0x77, 0xC7,
+ 0xB7, 0x14, 0x8D, 0xDB, 0xF4, 0xBD, 0xD0, 0xED, 0x4F, 0x76, 0xFE, 0x0C, 0x5E, 0x81, 0x63, 0x49,
+ 0xDD, 0x27, 0x79, 0xD3, 0xEF, 0x12, 0x64, 0xD5, 0x84, 0x99, 0xA4, 0x16, 0x25, 0xC6, 0xE2, 0xAC,
+ 0xD5, 0xC4, 0x8C, 0xBA, 0x42, 0x12, 0x21, 0x96, 0x53, 0xFF, 0xC2, 0xCB, 0x12, 0x98, 0xEB, 0xEC,
+ 0x0E, 0x72, 0xE3, 0x4A, 0x15, 0x5F, 0x61, 0xAF, 0xA4, 0x60, 0x43, 0x3F, 0x79, 0x17, 0xC6, 0xCF,
+ 0x9B, 0x48, 0x4C, 0x49, 0x74, 0xC6, 0x64, 0x92, 0x6C, 0x41, 0xD4, 0xBB, 0xB9, 0x9D, 0x17, 0xA1,
+ 0x68, 0xF1, 0x6E, 0xD5, 0x5E, 0xD6, 0xD9, 0xF6, 0xDA, 0xD8, 0x36, 0xC1, 0x3E, 0xC2, 0xF2, 0x85,
+ 0xBC, 0x9B, 0x05, 0xE0, 0xD5, 0x15, 0xCF, 0x00, 0xBC, 0xD1, 0x1F, 0xCE, 0x50, 0x47, 0x37, 0xFE,
+ 0x57, 0x7A, 0xCB, 0x1C, 0x2E, 0x36, 0x79, 0xC4, 0xDC, 0x1C, 0x11, 0x84, 0xDF, 0xD0, 0xF2, 0x7A,
+ 0x02, 0xDD, 0x37, 0x5E, 0xD0, 0x4A, 0x11, 0x0D, 0x59, 0x8F, 0xDD, 0xEB, 0xF6, 0x1D, 0xE6, 0x0D,
+ 0x58, 0x18, 0x7D, 0xD4, 0x4D, 0x3D, 0x1B, 0xD5, 0x13, 0xB1, 0xD4, 0xBB, 0x50, 0x56, 0x29, 0xB1,
+ 0x78, 0xCA, 0xC9, 0xC3, 0xA4, 0x10, 0x67, 0xFA, 0x48, 0x13, 0x12, 0xAB, 0xB5, 0xDA, 0x45, 0x72,
+ 0x6A, 0x41, 0x11, 0x6B, 0xA9, 0xBF, 0x93, 0xFA, 0x47, 0x6D, 0x46, 0xE4, 0xAE, 0x58, 0xED, 0x5D,
+ 0xF3, 0x38, 0x57, 0xED, 0x49, 0xB7, 0x6A, 0x15, 0xC9, 0xBA, 0x05, 0xF2, 0xA5, 0x9D, 0xC0, 0x0A,
+ 0x31, 0x02, 0xC4, 0x70, 0x33, 0x4E, 0x5D, 0x29, 0x02, 0x5B, 0x99, 0xEF, 0x2A, 0x1B, 0xD6, 0x90,
+ 0xA9, 0xF1, 0x9A, 0x52, 0x09, 0xD4, 0xFD, 0xF7, 0x5F, 0x50, 0xA1, 0x78, 0xD5, 0xA0, 0x69, 0xBE,
+ 0xD7, 0x61, 0x5E, 0x97, 0x16, 0x33, 0xBD, 0x25, 0x2B, 0x9F, 0x25, 0x49, 0x6C, 0x9B, 0x5B, 0xB7,
+ 0x8A, 0x9F, 0x54, 0x46, 0x2C, 0x3F, 0xC9, 0xFA, 0xB8, 0xD0, 0xA3, 0x35, 0xBB, 0xF1, 0x7D, 0x4A,
+ 0x74, 0xEC, 0x6F, 0xD3, 0x14, 0xB3, 0x5E, 0x92, 0xFB, 0xF2, 0xE8, 0x41, 0x0A, 0xD2, 0x33, 0xF0,
+ 0x73, 0x5B, 0x36, 0x9A, 0x70, 0x97, 0x6E, 0x60, 0x54, 0xFD, 0x27, 0x79, 0xC0, 0x4B, 0x1C, 0x86,
+ 0x22, 0xAA, 0xA0, 0x14, 0x9D, 0xF6, 0x79, 0x3A, 0xC3, 0x5C, 0xC4, 0xAC, 0xB2, 0xBC, 0x4D, 0xCC,
+ 0xDC, 0xE0, 0x48, 0xB7, 0x8E, 0xBD, 0x49, 0x08, 0x15, 0xB2, 0xA7, 0x05, 0xF9, 0x15, 0x18, 0x79,
+ 0xF1, 0x5F, 0xEA, 0xB8, 0x53, 0x5B, 0xA2, 0xD8, 0x7E, 0xA7, 0x0A, 0x28, 0x1B, 0x0E, 0x21, 0x10,
+ 0x02, 0xB9, 0xAA, 0x62, 0x1E, 0x17, 0x12, 0x31, 0x8A, 0x60, 0x70, 0x90, 0x66, 0xFF, 0x83, 0x3F,
+ 0x39, 0x97, 0x75, 0xE3, 0x8D, 0x51, 0xA8, 0x0A, 0xA4, 0x9C, 0x1F, 0x73, 0x91, 0x8F, 0x8A, 0x9D,
+ 0x17, 0x7C, 0x43, 0x33, 0x1C, 0xE8, 0x29, 0x73, 0xA2, 0x3D, 0x2C, 0x43, 0x07, 0x9B, 0x6D, 0xB2,
+ 0x7F, 0x4E, 0x16, 0x6D, 0x94, 0x5D, 0x3F, 0xC4, 0x0E, 0xEF, 0xEB, 0x0F, 0x71, 0x04, 0x2F, 0x99,
+ 0xCD, 0x50, 0x81, 0x23, 0x2A, 0x9C, 0xB0, 0x74, 0x63, 0x94, 0x8E, 0x41, 0x29, 0x93, 0x2B, 0x20,
+ 0x8B, 0xC8, 0x75, 0x34, 0xEB, 0x11, 0x4C, 0x4F, 0xDA, 0x1A, 0x8B, 0xE5, 0x87, 0xA6, 0xB0, 0x57,
+ 0xE2, 0x3F, 0x58, 0x68, 0xA3, 0xC0, 0x2E, 0x48, 0x92, 0x4B, 0x9A, 0xE1, 0xFD, 0xF3, 0x22, 0x66,
+ 0x8B, 0xF6, 0xCA, 0x10, 0xBA, 0x83, 0x0C, 0x50, 0x68, 0x73, 0xD0, 0x21, 0x06, 0x2E, 0xAD, 0x68,
+ 0x2F, 0x11, 0x1E, 0x31, 0x38, 0x8D, 0xCF, 0x3E, 0xD7, 0x68, 0x08, 0xE3, 0xD2, 0x47, 0x7B, 0x71,
+ 0x68, 0xF6, 0x4F, 0x11, 0x36, 0x97, 0xD9, 0x2A, 0xCF, 0x87, 0x0A, 0xCB, 0x5E, 0xE7, 0x1C, 0x1B,
+ 0x02, 0x7F, 0x58, 0x4F, 0x16, 0x3E, 0x5E, 0x28, 0x9E, 0xB4, 0x3B, 0x20, 0x5C, 0x9B, 0x6D, 0x25,
+ 0x4B, 0x72, 0xE1, 0xA5, 0x38, 0xC1, 0x7F, 0x69, 0x0A, 0x60, 0x42, 0xAB, 0x24, 0x86, 0x09, 0xAA,
+ 0x5D, 0x9E, 0x65, 0xF8, 0xC7, 0x6A, 0xCD, 0x31, 0x14, 0xBC, 0xC0, 0x45, 0x80, 0x68, 0x09, 0xA2,
+ 0x77, 0xD6, 0x4B, 0x95, 0xD4, 0xF4, 0x58, 0xF0, 0xAB, 0x2F, 0x79, 0x77, 0x59, 0x74, 0x38, 0xD5,
+ 0x69, 0xB8, 0x77, 0x32, 0x92, 0x2A, 0x49, 0x96, 0xBE, 0x40, 0x31, 0x4F, 0xC5, 0xCD, 0x9B, 0xA1,
+ 0xD6, 0xB9, 0xCE, 0xF6, 0x4B, 0x01, 0x87, 0xE1, 0x0E, 0x55, 0x40, 0x13, 0xE5, 0x42, 0x01, 0xC8,
+ 0x78, 0x90, 0x6F, 0xA9, 0x5B, 0x65, 0x79, 0xA0, 0x84, 0x85, 0x3B, 0x42, 0x73, 0x2D, 0x7C, 0xBA,
+ 0x2B, 0x7F, 0x19, 0xEB, 0x8D, 0x9D, 0x82, 0xA6, 0xE5, 0x10, 0x0A, 0x5A, 0xAB, 0xA1, 0x1B, 0xD8,
+ 0x87, 0xAB, 0xC5, 0x70, 0x78, 0xC1, 0xBC, 0xF6, 0x5C, 0xFC, 0x60, 0x69, 0x5A, 0xD7, 0xE1, 0x20,
+ 0x50, 0xCB, 0xDD, 0x55, 0x1E, 0x80, 0x1F, 0x0A, 0x97, 0x65, 0x86, 0x02, 0xD4, 0x6C, 0x2E, 0x08,
+ 0xB8, 0xB0, 0x26, 0x78, 0xB9, 0xB3, 0x6D, 0x57, 0x9E, 0x21, 0x37, 0x01, 0xDB, 0xEF, 0x49, 0x4D,
+ 0x66, 0xE0, 0x7C, 0xCB, 0xCC, 0xD9, 0xAC, 0xEE, 0xF2, 0xCE, 0xA5, 0x8E, 0x15, 0x4F, 0x1C, 0x83,
+ 0x3C, 0xC8, 0xD0, 0x88, 0x7E, 0x66, 0xCE, 0xA9, 0xBA, 0x32, 0x97, 0x15, 0x5F, 0x8B, 0xBC, 0x9E,
+ 0x1C, 0x14, 0x55, 0x9A, 0xBC, 0x4E, 0x4A, 0x6B, 0xB0, 0xE0, 0xF0, 0xDB, 0x3A, 0x64, 0x14, 0x75,
+ 0xAC, 0x14, 0x36, 0xE8, 0x6A, 0xB0, 0x3D, 0x7E, 0xD9, 0xB4, 0x2B, 0x1F, 0xE9, 0x50, 0xB1, 0x7C,
+ 0x18, 0x05, 0xA6, 0xE2, 0x44, 0xF3, 0xCE, 0xE6, 0x4C, 0x21, 0x9E, 0x69, 0xAA, 0x22, 0x7E, 0xE2,
+ 0x35, 0x76, 0x3A, 0xAE, 0x6E, 0x4E, 0x72, 0x25, 0xB5, 0x4D, 0xA4, 0xF7, 0x47, 0x82, 0x9C, 0xD5,
+ 0xA0, 0x08, 0x53, 0x17, 0x74, 0xB5, 0xB4, 0xA2, 0x6F, 0x10, 0x40, 0x62, 0x47, 0xB9, 0xCE, 0x00,
+ 0xC8, 0x68, 0x94, 0x9F, 0xD6, 0x7C, 0x0D, 0xD5, 0xB7, 0x8A, 0x13, 0xDE, 0x8C, 0x5B, 0x0B, 0x33,
+ 0xB7, 0x15, 0xD5, 0x43, 0xAE, 0xC0, 0x87, 0x0A, 0x13, 0xF3, 0xB5, 0x1C, 0x00, 0xC7, 0xA4, 0x36,
+ 0x05, 0xE4, 0xFF, 0xE2, 0x18, 0x6E, 0xF5, 0xF9, 0x0D, 0xDE, 0xDA, 0x4D, 0xC6, 0x1B, 0x0D, 0x89,
+ 0xD7, 0xD5, 0x5E, 0x84, 0xDA, 0xC2, 0xAF, 0x42, 0x2D, 0x89, 0xD3, 0x69, 0x38, 0x25, 0xDB, 0xE0,
+ 0xC3, 0x17, 0xCF, 0x3A, 0xB1, 0x8F, 0x60, 0x74, 0xC4, 0x3C, 0x20, 0x1B, 0xE3, 0x0C, 0x91, 0x93,
+ 0xDC, 0xCB, 0x39, 0x45, 0x0E, 0xB3, 0x78, 0x52, 0xBF, 0x6A, 0x79, 0x10, 0x93, 0x67, 0x25, 0x87,
+ 0xD7, 0xA6, 0x55, 0xEB, 0xC0, 0xE2, 0x04, 0x43, 0xF9, 0x25, 0x3B, 0x10, 0x95, 0xEF, 0xD5, 0x34,
+ 0xB0, 0xA6, 0x67, 0x24, 0x26, 0x94, 0x71, 0x4C, 0xA5, 0x7F, 0x4E, 0xAC, 0xA7, 0x58, 0x89, 0xA1,
+ 0x47, 0x47, 0x76, 0x17, 0xC0, 0x79, 0x21, 0xFE, 0x53, 0xB8, 0x55, 0xC3, 0x73, 0xF7, 0x07, 0x4C,
+ 0x76, 0xEE, 0x45, 0x92, 0x72, 0x75, 0x07, 0xAE, 0x18, 0x44, 0xC0, 0x96, 0x20, 0x9F, 0xE6, 0x54,
+ 0x04, 0xEE, 0x16, 0xBA, 0x4B, 0x29, 0xA9, 0x27, 0x35, 0xBE, 0x58, 0xA6, 0x32, 0x00, 0xEE, 0x7C,
+ 0x8D, 0x3F, 0x4D, 0xB2, 0x1D, 0xB2, 0x0C, 0x6D, 0xC9, 0xFE, 0x26, 0x92, 0xCF, 0x50, 0xD8, 0x0F,
+ 0x27, 0x00, 0xDA, 0x4A, 0xB6, 0xD5, 0xD7, 0x03, 0x8E, 0x09, 0xCA, 0x9D, 0xA8, 0xC0, 0x95, 0x6D,
+ 0x7E, 0xC8, 0x36, 0x43, 0x9C, 0x41, 0x30, 0x92, 0xC6, 0x97, 0x0D, 0x6C, 0x87, 0x9F, 0xBC, 0x41,
+ 0x72, 0x83, 0x6F, 0x7E, 0xCA, 0x29, 0x9B, 0x9B, 0x43, 0x7F, 0x1A, 0x1B, 0xE3, 0xEF, 0x48, 0x3B,
+ 0x22, 0x3F, 0x18, 0xDA, 0x3B, 0xE6, 0xE0, 0x10, 0xCA, 0xD4, 0x0E, 0xAF, 0x56, 0xD4, 0x17, 0x20,
+ 0xD8, 0x80, 0xB7, 0xCF, 0xB1, 0xE5, 0x3B, 0xE8, 0x9A, 0x5F, 0xD0, 0x16, 0x44, 0xEE, 0x3A, 0x8B,
+ 0xB3, 0x23, 0x75, 0x1F, 0xBD, 0xDF, 0xE1, 0xF0, 0xFD, 0xB9, 0xEB, 0x21, 0x49, 0x16, 0x00, 0xEE,
+ 0xFD, 0x87, 0x45, 0x97, 0x45, 0x68, 0xDA, 0x57, 0x01, 0x60, 0x33, 0x1A, 0x01, 0x43, 0xB2, 0x1C,
+ 0xB7, 0xA6, 0xCD, 0x67, 0xFD, 0x38, 0x00, 0x44, 0x04, 0xFD, 0xA4, 0x35, 0x63, 0x58, 0x79, 0x47,
+ 0x6A, 0x1B, 0x6F, 0x65, 0x7A, 0x49, 0x2E, 0xA4, 0xCE, 0xEE, 0x44, 0x78, 0xA7, 0xCB, 0x0C, 0xF1,
+ 0x9E, 0x8B, 0x3E, 0xC8, 0x4E, 0xDA, 0x4F, 0x90, 0xF6, 0xA6, 0x38, 0x1C, 0x14, 0x64, 0x21, 0x16,
+ 0x7C, 0x09, 0xAA, 0x52, 0x03, 0xC7, 0xBE, 0x62, 0x9E, 0xBD, 0xC6, 0x3F, 0x6A, 0x0A, 0x79, 0x24,
+ 0xFD, 0x00, 0xDF, 0xCB, 0x9E, 0xC9, 0x8D, 0x56, 0xC6, 0x58, 0x81, 0x78, 0xCD, 0xA6, 0x36, 0x63,
+ 0xE4, 0x78, 0x2F, 0xC8, 0xAF, 0x6E, 0xD5, 0xB4, 0xDD, 0x31, 0xE4, 0x84, 0x33, 0x4E, 0x6F, 0x4D,
+ 0xE1, 0xD2, 0x87, 0x2A, 0xE3, 0xBA, 0x11, 0xBC, 0x0A, 0x4E, 0x28, 0xC9, 0x8B, 0x50, 0x6E, 0xCF,
+ 0x55, 0x06, 0x63, 0x89, 0x6B, 0x45, 0x83, 0x36, 0x08, 0xA2, 0x67, 0x61, 0xBB, 0x72, 0x2F, 0xD1,
+ 0xA4, 0x45, 0xD7, 0x1C, 0x1A, 0x76, 0x47, 0x43, 0xED, 0x72, 0xA7, 0x68, 0x2F, 0xEA, 0xCB, 0x04,
+ 0xD0, 0x70, 0x00, 0xE9, 0xB5, 0xCA, 0xF0, 0x47, 0x5E, 0x5C, 0x28, 0x5E, 0x03, 0x88, 0xB4, 0xD6,
+ 0x52, 0x6A, 0xFE, 0xFF, 0x88, 0x9C, 0x2B, 0x32, 0xD1, 0x3D, 0x9E, 0x4F, 0xD3, 0xD4, 0xA7, 0xE1,
+ 0xB6, 0xB9, 0x89, 0xE7, 0xE2, 0xF7, 0xBC, 0x57, 0xD7, 0xC4, 0x20, 0xFB, 0x91, 0xC0, 0x87, 0x5E,
+ 0xC4, 0x4F, 0xB7, 0x0B, 0xD4, 0x34, 0x30, 0xAC, 0x02, 0x1F, 0xC7, 0x7A, 0xBE, 0x64, 0x25, 0x34,
+ 0x92, 0x12, 0x22, 0x66, 0xB5, 0x81, 0x7F, 0x6E, 0x89, 0xA6, 0x49, 0x07, 0xFA, 0xA6, 0x14, 0x80,
+ 0x7A, 0x5D, 0x4D, 0x06, 0x9D, 0x57, 0x17, 0x82, 0x1B, 0x70, 0xBE, 0xFA, 0x50, 0x1A, 0x5E, 0x7B,
+ 0x48, 0x11, 0xF8, 0x2F, 0xFD, 0xC0, 0xE4, 0x75, 0x57, 0xCD, 0x81, 0x57, 0xDA, 0x84, 0x1A, 0x92,
+ 0x18, 0x40, 0x8A, 0xC3, 0x66, 0xCC, 0xE0, 0x93, 0x8A, 0x19, 0x30, 0x2F, 0xD5, 0x9A, 0xAD, 0x24,
+ 0x8A, 0x39, 0x03, 0x45, 0xCF, 0x8E, 0xF9, 0x8C, 0x8D, 0xE1, 0x29, 0x2D, 0xDD, 0xB6, 0xA0, 0x33,
+ 0xCD, 0x75, 0x99, 0x27, 0xBA, 0x20, 0x10, 0x6C, 0xEE, 0xC5, 0xFE, 0xDB, 0x86, 0x53, 0xD6, 0xCE,
+ 0x48, 0x24, 0xEF, 0xB3, 0x27, 0x99, 0xFC, 0x51, 0x25, 0x52, 0x76, 0x6F, 0xCD, 0x75, 0x68, 0x7E,
+ 0xD2, 0xC8, 0xB7, 0x82, 0x55, 0x5D, 0x2F, 0x30, 0xD0, 0xBF, 0x0C, 0xC6, 0xD6, 0xAB, 0xC8, 0x3A,
+ 0x48, 0x76, 0x26, 0x24, 0x08, 0xBF, 0x44, 0xA2, 0x27, 0xC8, 0x3F, 0xE7, 0xD8, 0xBB, 0xD5, 0xED,
+ 0x5D, 0xE4, 0xFE, 0x94, 0x9F, 0xE0, 0x13, 0xFC, 0x1B, 0xB8, 0x0D, 0xED, 0x68, 0x33, 0xE5, 0x38,
+ 0xFC, 0x7C, 0x05, 0xB1, 0x74, 0xEA, 0x8E, 0xA2, 0x2F, 0x53, 0x5B, 0x9D, 0xD3, 0x53, 0x55, 0x18,
+ 0x01, 0x4C, 0xFE, 0x84, 0x00, 0xF7, 0x66, 0x11, 0x4E, 0xEF, 0x45, 0xF1, 0xAE, 0xCF, 0x6B, 0x5C,
+ 0x40, 0x76, 0x8B, 0xE3, 0xE0, 0x3F, 0x10, 0x14, 0x07, 0x22, 0x9C, 0xBD, 0xE0, 0xFF, 0x56, 0x2F,
+ 0x62, 0xEA, 0x50, 0x50, 0xF6, 0x73, 0xA9, 0x2D, 0x3D, 0xED, 0x2B, 0x1A, 0x10, 0xB8, 0xAC, 0x07,
+ 0x69, 0xB0, 0x7D, 0x42, 0x9A, 0x58, 0x18, 0xA9, 0x87, 0x04, 0x63, 0xE0, 0x64, 0x81, 0x9B, 0x17,
+ 0xB1, 0x42, 0x36, 0x00, 0xA1, 0xA9, 0x1C, 0x9F, 0x03, 0xC2, 0x6E, 0xB8, 0x40, 0xC4, 0xB1, 0x40,
+ 0xDB, 0x45, 0xD3, 0x47, 0xB6, 0x1A, 0x55, 0xB0, 0x91, 0x6B, 0xAE, 0xE4, 0x8C, 0x75, 0x9F, 0x6A,
+ 0x1F, 0xFA, 0xD2, 0x4B, 0x7B, 0x34, 0xE3, 0xAC, 0x77, 0x66, 0x1E, 0x88, 0x2A, 0x89, 0x2E, 0x19,
+ 0xF3, 0x21, 0xC5, 0xEA, 0x09, 0x99, 0xB2, 0x30, 0x9F, 0xA5, 0x6B, 0x75, 0xF0, 0xE8, 0xCB, 0x9F,
+ 0xB0, 0x3E, 0x17, 0x59, 0x10, 0xDD, 0x0B, 0xA7, 0x97, 0xB4, 0x7E, 0x68, 0x26, 0x46, 0xE8, 0xA4,
+ 0x88, 0x4B, 0x0C, 0xE8, 0x5F, 0x4A, 0x2F, 0x67, 0xFE, 0x70, 0x33, 0xA4, 0x55, 0x35, 0xC3, 0x85,
+ 0x20, 0xBC, 0x12, 0x18, 0x85, 0x6B, 0x8D, 0x53, 0x70, 0x1F, 0xF3, 0x8E, 0x1A, 0x56, 0x6F, 0x2E,
+ 0xAD, 0xC9, 0x67, 0x00, 0x28, 0x11, 0x72, 0x2D, 0xAF, 0x8D, 0x45, 0xC3, 0x86, 0xC7, 0xE9, 0xA8,
+ 0xC0, 0xBB, 0x26, 0x97, 0xD5, 0xE4, 0xB7, 0xCF, 0x57, 0x01, 0x00, 0x1E, 0xBF, 0x11, 0xE2, 0xE4,
+ 0x1E, 0x4D, 0xB6, 0x52, 0xC6, 0x69, 0xDE, 0xA0, 0x3A, 0xD6, 0x97, 0x38, 0x63, 0x39, 0x60, 0x17,
+ 0xAC, 0xD6, 0xED, 0xFB, 0x10, 0xA9, 0xE0, 0x5E, 0x6D, 0x43, 0xC2, 0x24, 0xA8, 0xAC, 0xB8, 0xC5,
+ 0xE1, 0xF5, 0xBD, 0x4B, 0x89, 0x47, 0x50, 0x9F, 0x02, 0xB4, 0x40, 0xB1, 0xFA, 0xCD, 0x48, 0x52,
+ 0x68, 0xE5, 0x25, 0xE0, 0x74, 0xA2, 0x64, 0xC4, 0x7B, 0xE5, 0xF1, 0x61, 0x21, 0xA6, 0x39, 0x42,
+ 0x26, 0xC1, 0x87, 0x1F, 0x6F, 0x3D, 0x68, 0x96, 0xC4, 0x74, 0xCD, 0x5E, 0xEE, 0x43, 0x6F, 0x99,
+ 0x91, 0x1D, 0x30, 0x97, 0xBA, 0x7E, 0xA5, 0xA6, 0x08, 0x3B, 0x8D, 0x40, 0x61, 0xAF, 0x1B, 0xA2,
+ 0x37, 0x63, 0x48, 0xD1, 0x70, 0xF6, 0xFC, 0x6A, 0xDF, 0x09, 0x82, 0x4E, 0x00, 0xD6, 0xAA, 0x31,
+ 0x76, 0x98, 0x24, 0x78, 0xE3, 0x18, 0x91, 0xF6, 0x88, 0x3E, 0xA8, 0x54, 0xA1, 0x3F, 0xAD, 0xE1,
+ 0x67, 0xCE, 0x3E, 0x9E, 0x82, 0x62, 0x99, 0x18, 0xF8, 0x40, 0x60, 0x22, 0x92, 0x55, 0xF6, 0xA1,
+ 0x6D, 0x80, 0x69, 0xB9, 0x77, 0x40, 0xBA, 0xAC, 0x3C, 0x31, 0x32, 0xAA, 0xE8, 0x09, 0x26, 0x64,
+ 0x2B, 0xE7, 0x6D, 0x19, 0x31, 0xF3, 0x88, 0xFF, 0x45, 0xF2, 0xA9, 0xD7, 0xBF, 0xDA, 0x50, 0x33,
+ 0xD7, 0x83, 0x55, 0x08, 0xCA, 0xFE, 0xF6, 0x3B, 0x2A, 0x5A, 0xC4, 0xBD, 0x26, 0x35, 0xF5, 0x9D,
+ 0xE8, 0xA8, 0xFE, 0x9C, 0x43, 0x0F, 0x2C, 0xFD, 0x33, 0x81, 0x08, 0x11, 0x4D, 0xE6, 0x5B, 0xB1,
+ 0x96, 0xE7, 0x3A, 0x83, 0xCB, 0xEF, 0x18, 0xDE, 0xF8, 0x5B, 0x09, 0x4D, 0x61, 0x3D, 0xB5, 0xB7,
+ 0xE4, 0xC9, 0x73, 0xFE, 0x5C, 0xD3, 0x57, 0x4F, 0x46, 0x6F, 0x42, 0x56, 0x85, 0xC1, 0x4A, 0x8A,
+ 0xD8, 0x61, 0xA3, 0x15, 0x49, 0x66, 0xA6, 0x1C, 0xC0, 0x1F, 0xB7, 0xA9, 0x88, 0x06, 0xA4, 0x2F,
+ 0xE4, 0x9A, 0xCC, 0x38, 0xE0, 0x90, 0x64, 0xB6, 0x0F, 0xE5, 0xAE, 0xB5, 0x87, 0x64, 0x1C, 0x42,
+ 0x5C, 0x11, 0x01, 0xB5, 0xC2, 0x90, 0x3D, 0xAB, 0x26, 0x4B, 0x2A, 0x67, 0x9F, 0x5B, 0x5B, 0xE3,
+ 0x21, 0xA0, 0xB9, 0x7D, 0x64, 0xD3, 0xF8, 0xB3, 0x77, 0x91, 0x2D, 0x34, 0x78, 0x8E, 0xB8, 0x1D,
+ 0x30, 0x4B, 0xE1, 0x31, 0xFE, 0x3D, 0xE6, 0xAB, 0xDA, 0xA6, 0xB4, 0xDF, 0xB0, 0x67, 0x25, 0x57,
+ 0x4A, 0x30, 0x8F, 0x86, 0x58, 0x13, 0xE6, 0xEA, 0xEE, 0x91, 0x86, 0xD2, 0x0D, 0xCD, 0x19, 0xDC,
+ 0x26, 0x18, 0x86, 0x52, 0xD2, 0x77, 0x79, 0x31, 0xDA, 0xF9, 0x9A, 0xCA, 0x7B, 0xBE, 0xF6, 0x96,
+ 0x61, 0xAE, 0x32, 0xC8, 0x68, 0x17, 0xFF, 0xB8, 0xF4, 0xF5, 0xE5, 0xA4, 0x20, 0xC9, 0x44, 0x8A,
+ 0xD6, 0x8D, 0xB0, 0x0D, 0x3D, 0x2B, 0x47, 0x4B, 0xA5, 0x49, 0x37, 0x11, 0x18, 0x2C, 0x94, 0x37,
+ 0xEB, 0x7D, 0xD6, 0x49, 0x59, 0xFD, 0x75, 0xC7, 0x6C, 0x11, 0x83, 0xBD, 0x92, 0xF4, 0xA0, 0xFD,
+ 0x5D, 0x2D, 0x24, 0x42, 0x8D, 0x3E, 0x96, 0xDA, 0x4B, 0xCD, 0x85, 0xDA, 0xF4, 0x11, 0x27, 0x0F,
+ 0x5B, 0xE1, 0xB4, 0x62, 0x51, 0xC6, 0x04, 0x22, 0xCD, 0x8D, 0x3D, 0x26, 0x59, 0xC9, 0xF3, 0xBF,
+ 0xBD, 0x07, 0xEB, 0x3D, 0xDD, 0x41, 0x3A, 0xAE, 0x35, 0xB6, 0x9C, 0x76, 0xE6, 0xE9, 0x5E, 0x98,
+ 0xF6, 0x9F, 0x9B, 0x6D, 0x9A, 0x0F, 0xF3, 0xA2, 0x5E, 0xD0, 0x37, 0x0F, 0xA7, 0xB9, 0xC1, 0xC2,
+ 0xFF, 0x26, 0x59, 0x51, 0xC6, 0x27, 0x15, 0x25, 0xFD, 0x8E, 0xA0, 0xAA, 0x72, 0xD4, 0xA8, 0x13,
+ 0x61, 0xE0, 0x4C, 0xD0, 0xD2, 0xCA, 0xA8, 0x85, 0x98, 0x95, 0x26, 0x68, 0x7A, 0x1D, 0xBC, 0x6D,
+ 0x87, 0xF8, 0x8C, 0xEC, 0x31, 0xA7, 0x8E, 0x98, 0x1C, 0xEC, 0x51, 0xCA, 0xF7, 0x38, 0x5A, 0x03,
+ 0xF1, 0x7B, 0x84, 0x9D, 0x96, 0x75, 0x30, 0x96, 0x92, 0xDD, 0x4F, 0xCD, 0xD8, 0x00, 0xA0, 0xAB,
+ 0x7B, 0x52, 0x42, 0x2F, 0x0A, 0x9F, 0x28, 0x18, 0x12, 0xD7, 0x47, 0xF5, 0x83, 0xB4, 0x27, 0xA6,
+ 0x5D, 0x8C, 0xB1, 0xD7, 0xC2, 0xB5, 0x3F, 0xCC, 0x31, 0xCA, 0x7C, 0xB5, 0xB5, 0x37, 0xAA, 0xCB,
+ 0xA5, 0x8A, 0x2D, 0x21, 0x72, 0x24, 0xCE, 0xD6, 0x05, 0xDA, 0x32, 0x2A, 0xA9, 0x92, 0x57, 0x07,
+ 0x24, 0x7C, 0x53, 0x92, 0xBA, 0x4A, 0x3D, 0xF8, 0xA9, 0xCB, 0xEC, 0x7A, 0x34, 0x4A, 0xFD, 0x2E,
+ 0x3D, 0x22, 0xA1, 0x8B, 0xC4, 0x8B, 0x39, 0x8F, 0x11, 0x8E, 0x75, 0x85, 0xB3, 0x1C, 0xB3, 0x2E,
+ 0x5B, 0xF6, 0xF7, 0x03, 0x88, 0x11, 0x14, 0x7A, 0x42, 0xDA, 0x25, 0x0C, 0xAD, 0x88, 0xE7, 0xC9,
+ 0xE6, 0x90, 0x65, 0x13, 0x2B, 0x40, 0x20, 0xC3, 0x03, 0xCC, 0x38, 0x71, 0x5C, 0x32, 0x54, 0xFE,
+ 0x42, 0x2A, 0xC8, 0x4D, 0xDB, 0x4F, 0x0F, 0x9D, 0x53, 0xEA, 0xBE, 0xA8, 0x84, 0x87, 0x63, 0x8F,
+ 0xC7, 0xC5, 0xC7, 0xD9, 0x41, 0xDF, 0x53, 0x72, 0x50, 0x61, 0x9A, 0x81, 0x6B, 0x70, 0x6F, 0xE4,
+ 0x98, 0xBB, 0x46, 0xEF, 0x24, 0xA6, 0xA0, 0xCB, 0x49, 0x05, 0x13, 0xA6, 0xC2, 0x1F, 0x2D, 0x1A,
+ 0x2B, 0xBD, 0xA9, 0x97, 0xB4, 0xEC, 0x6C, 0x0C, 0x1C, 0xA1, 0x9E, 0xDB, 0x5E, 0x55, 0x95, 0xE0,
+ 0xE1, 0xC5, 0x4E, 0x97, 0x89, 0x69, 0xDA, 0xB6, 0x5C, 0xAA, 0xF2, 0x96, 0x28, 0x7A, 0xCB, 0xA9,
+ 0xCE, 0x46, 0x5E, 0x07, 0xFE, 0x73, 0x4F, 0x2C, 0x46, 0xAF, 0xFB, 0x2F, 0xC5, 0xD1, 0xB6, 0xB2,
+ 0x85, 0x65, 0x1C, 0x7F, 0x72, 0xBC, 0xF9, 0x51, 0x1B, 0x02, 0xAE, 0x6A, 0x46, 0xB5, 0x39, 0x1A,
+ 0x8D, 0x34, 0x84, 0x40, 0xE5, 0x1B, 0x91, 0x11, 0xE9, 0x42, 0x44, 0x56, 0x64, 0x01, 0xF5, 0xC0,
+ 0x7D, 0x64, 0x37, 0x72, 0xA4, 0x7A, 0xE5, 0xD6, 0x19, 0xA6, 0xDB, 0x78, 0x23, 0x47, 0x68, 0xE5,
+ 0x8D, 0x7D, 0x8C, 0xE5, 0x63, 0xF3, 0x3E, 0x07, 0xEE, 0x4E, 0x8D, 0xF1, 0x56, 0x37, 0xA4, 0x27,
+ 0xDC, 0x67, 0x45, 0x84, 0x41, 0x89, 0xD2, 0x77, 0x67, 0x3C, 0x76, 0x27, 0x6B, 0x8B, 0xD2, 0x65,
+ 0x6A, 0x65, 0x2B, 0xB1, 0xA6, 0x73, 0x3F, 0xD2, 0xC6, 0x78, 0x5D, 0xF9, 0xDA, 0xBD, 0x8B, 0x9F,
+ 0xC0, 0x5B, 0xF2, 0xF4, 0xA6, 0x46, 0xF4, 0x5A, 0xCD, 0xDC, 0x40, 0x0E, 0x48, 0x28, 0xA2, 0x98,
+ 0x87, 0xE7, 0x4F, 0x46, 0xD4, 0x6E, 0xFB, 0x6F, 0x11, 0xC5, 0x85, 0xCF, 0xDF, 0xA9, 0xBB, 0xE1,
+ 0x61, 0x80, 0x41, 0xFC, 0x69, 0x8F, 0xD7, 0xDD, 0xD9, 0x8B, 0x63, 0xE2, 0x60, 0x1A, 0x0A, 0xFF,
+ 0x56, 0x85, 0x6C, 0x4C, 0x0D, 0x19, 0x9E, 0xE1, 0xCB, 0xF3, 0xEB, 0x9C, 0xBF, 0x11, 0x4A, 0x0B,
+ 0x23, 0xFD, 0x88, 0x93, 0x1A, 0x8B, 0xA2, 0x68, 0xD2, 0x07, 0x90, 0x11, 0xC6, 0x3D, 0xEF, 0x2C,
+ 0x3C, 0x02, 0x41, 0x1F, 0x41, 0x93, 0x2B, 0x83, 0xAB, 0x2D, 0x35, 0xA4, 0x6E, 0xD7, 0x36, 0x51,
+ 0x09, 0x7C, 0x23, 0x4F, 0xAD, 0xF8, 0x38, 0xF0, 0x1D, 0x98, 0x2E, 0xEA, 0x20, 0xAF, 0x10, 0x9B,
+ 0x03, 0x96, 0xE0, 0x68, 0xCB, 0x01, 0xC2, 0xAF, 0x4B, 0x70, 0xB0, 0x6F, 0xB6, 0xBC, 0x71, 0xA8,
+ 0x57, 0x32, 0x26, 0x98, 0x23, 0xAD, 0xC6, 0x07, 0xE8, 0xDF, 0xB6, 0xC8, 0x83, 0xF6, 0x17, 0xFD,
+ 0x4C, 0xDA, 0xB7, 0x1D, 0xA4, 0x92, 0xCE, 0xAD, 0x4B, 0xB8, 0xD2, 0xBB, 0xC4, 0x2E, 0x9C, 0xE3,
+ 0x40, 0x31, 0xF1, 0xF8, 0x1A, 0xC7, 0x55, 0x99, 0x08, 0xAE, 0xFF, 0xD1, 0x39, 0x74, 0x4F, 0x87,
+ 0x6A, 0x26, 0xBC, 0x36, 0x5D, 0x2C, 0x25, 0x53, 0x0B, 0x18, 0x15, 0x7F, 0xA3, 0x2A, 0x45, 0xC4,
+ 0x9A, 0xE2, 0xEF, 0xDC, 0xDC, 0xF1, 0x9D, 0xE9, 0x5E, 0xD9, 0xD5, 0x54, 0x89, 0x6D, 0x5A, 0xCE,
+ 0x8D, 0x22, 0x16, 0xF1, 0xD7, 0x36, 0xB9, 0x9A, 0xB0, 0xF4, 0xCD, 0xEF, 0xE6, 0x0C, 0x3A, 0x5D,
+ 0x09, 0x22, 0xF6, 0x45, 0xD7, 0x02, 0x55, 0x01, 0x02, 0x7A, 0x4F, 0xBB, 0x22, 0x6A, 0x87, 0x66,
+ 0x62, 0xD0, 0x1D, 0x54, 0x72, 0xB2, 0xD8, 0x0A, 0x7E, 0x60, 0xC1, 0x1D, 0x68, 0xEA, 0xFB, 0x6A,
+ 0xE3, 0x5F, 0x97, 0xC5, 0xFD, 0xEB, 0x08, 0x2C, 0x50, 0x96, 0xB8, 0xC1, 0x9D, 0x5E, 0x1E, 0x3E,
+ 0x46, 0xA6, 0x49, 0x57, 0xC8, 0xBD, 0xB1, 0xD6, 0xD5, 0x21, 0x2A, 0x03, 0x84, 0x65, 0x24, 0x11,
+ 0xB0, 0xF0, 0x0F, 0xF4, 0x04, 0x52, 0x43, 0xBA, 0xEA, 0x93, 0xBA, 0x9F, 0x34, 0x26, 0x1F, 0xD7,
+ 0x1F, 0x7B, 0xC0, 0x30, 0x01, 0x69, 0x68, 0x9B, 0x21, 0x13, 0xA5, 0xD4, 0x87, 0x30, 0xDC, 0xEB,
+ 0x35, 0x39, 0x76, 0x35, 0xB9, 0xE3, 0xDF, 0xCD, 0xB5, 0xE5, 0x89, 0xEA, 0x54, 0x1F, 0x3E, 0xDB,
+ 0x90, 0xCF, 0x5C, 0x4A, 0x96, 0x97, 0x32, 0x3F, 0x6F, 0xB4, 0xE5, 0x28, 0xDF, 0xE4, 0xCA, 0xB1,
+ 0x1B, 0x78, 0x65, 0x2C, 0x99, 0x3D, 0x77, 0x32, 0x5F, 0x6C, 0x6D, 0xD3, 0x53, 0x67, 0x15, 0x39,
+ 0xFD, 0xE1, 0x2A, 0xB0, 0x48, 0x24, 0x4D, 0x36, 0x4D, 0x90, 0x9F, 0xF3, 0x1D, 0x4F, 0x9D, 0x3B,
+ 0xBE, 0x64, 0xFE, 0xF0, 0xF2, 0xAE, 0x31, 0xB2, 0xBE, 0x35, 0x8E, 0x34, 0xD6, 0x56, 0xAB, 0xF2,
+ 0x45, 0xC4, 0x37, 0x65, 0xA0, 0x08, 0x66, 0x5D, 0x9F, 0x0D, 0x96, 0x0B, 0x58, 0xC2, 0x18, 0x00,
+ 0x43, 0xBA, 0xC4, 0xFE, 0xD3, 0x6C, 0x96, 0x78, 0xAE, 0x10, 0x2D, 0x86, 0x4D, 0x8F, 0x87, 0x44,
+ 0xCF, 0x8E, 0x1D, 0x23, 0x00, 0x8D, 0x8A, 0x91, 0x28, 0xDE, 0x13, 0xF1, 0x2B, 0xBC, 0x75, 0x32,
+ 0xB3, 0x50, 0xDB, 0xD3, 0x5A, 0xA5, 0x2A, 0x28, 0x82, 0x70, 0x4B, 0xF9, 0x77, 0x70, 0xC5, 0x5D,
+ 0x4A, 0x52, 0x43, 0x4C, 0x1D, 0x6E, 0xB5, 0x6A, 0x41, 0x65, 0xFF, 0xF2, 0x67, 0xC2, 0x86, 0x85,
+ 0x0C, 0x95, 0x25, 0xAB, 0x61, 0x3E, 0x79, 0x0A, 0x2F, 0x3F, 0xBB, 0x4A, 0xC7, 0x33, 0xEE, 0x2E,
+ 0x04, 0xD6, 0x44, 0xCE, 0x40, 0xB9, 0xFA, 0xF4, 0x8A, 0x7B, 0xA2, 0xE0, 0x43, 0xFE, 0x80, 0x88,
+ 0xA5, 0xB1, 0x47, 0x51, 0xFF, 0x48, 0xE4, 0x13, 0xA1, 0x6D, 0x6D, 0x1E, 0x4F, 0x14, 0x5C, 0x32,
+ 0x05, 0x73, 0x4E, 0x1B, 0x9E, 0xB2, 0xEB, 0xF1, 0xC7, 0x42, 0x84, 0x3A, 0xAA, 0xE0, 0x6D, 0xEC,
+ 0x3E, 0x79, 0x60, 0x00, 0x36, 0x01, 0x2F, 0xBC, 0xB7, 0x82, 0x03, 0x6D, 0x26, 0x6F, 0x28, 0x6E,
+ 0x4C, 0xB7, 0xD7, 0x93, 0xCB, 0xF2, 0xFC, 0x58, 0x2B, 0x3F, 0x5A, 0x2F, 0x88, 0x36, 0xCB, 0x7A,
+ 0xEF, 0xF2, 0xC6, 0x63, 0xC1, 0x60, 0x20, 0x71, 0x1F, 0xE4, 0xA6, 0x8A, 0x14, 0x16, 0x7D, 0x9F,
+ 0xD3, 0x83, 0x8D, 0x0C, 0x8D, 0xC4, 0x8A, 0x5D, 0x1F, 0xE2, 0x05, 0x07, 0xC7, 0x1D, 0x2B, 0x4F,
+ 0xAF, 0x20, 0x33, 0x60, 0x43, 0x6D, 0x60, 0x5F, 0xEC, 0x57, 0x2F, 0xF5, 0x8A, 0xC4, 0xC7, 0x8E,
+ 0x2B, 0x6B, 0xE8, 0xF0, 0xA2, 0x4E, 0x66, 0xBA, 0x55, 0xEF, 0x67, 0x78, 0x20, 0x70, 0x1D, 0x57,
+ 0x25, 0x1C, 0xC8, 0x0C, 0x7F, 0x1D, 0x88, 0x4D, 0x28, 0xCE, 0x90, 0xDE, 0xE5, 0xBE, 0x9B, 0xCC,
+ 0x28, 0x38, 0x52, 0xA5, 0xB4, 0xE0, 0x86, 0x7F, 0x73, 0x22, 0x75, 0x9D, 0xCA, 0x1F, 0xCB, 0x31,
+ 0x35, 0xC7, 0x55, 0xA7, 0xD2, 0xCD, 0x56, 0xC7, 0x22, 0xA6, 0xD3, 0x37, 0x02, 0x2E, 0xBE, 0x08,
+ 0x00, 0x26, 0x9A, 0x99, 0x62, 0x46, 0x1B, 0x25, 0xED, 0x6A, 0xD5, 0x61, 0x20, 0xB9, 0xDD, 0xF7,
+ 0xBE, 0xDD, 0x64, 0x5D, 0x61, 0xE5, 0x2F, 0x87, 0x81, 0x47, 0x7E, 0xC2, 0x7D, 0x45, 0xB7, 0x2A,
+ 0x0C, 0xB0, 0x0C, 0x5F, 0x4C, 0x93, 0x02, 0xEE, 0x96, 0x55, 0xAF, 0x7C, 0x06, 0xA8, 0x74, 0x64,
+ 0x61, 0x6A, 0xA1, 0x41, 0x69, 0x55, 0x63, 0x15, 0x5B, 0x50, 0xA9, 0x8A, 0xC5, 0x02, 0x3E, 0x5E,
+ 0xFF, 0x4D, 0xD7, 0xE4, 0xE0, 0x88, 0xFE, 0xB5, 0x53, 0x72, 0xA0, 0x52, 0xCE, 0x3C, 0x25, 0x98,
+ 0xFF, 0x05, 0xFC, 0xE4, 0x0C, 0x57, 0xE7, 0x4C, 0xD0, 0xEB, 0x1B, 0x4C, 0xEC, 0x89, 0xCE, 0x88,
+ 0x15, 0x6A, 0x9B, 0x7B, 0xDD, 0x0C, 0x53, 0x72, 0x0D, 0x0C, 0xD2, 0xE0, 0x6E, 0x20, 0xF5, 0x30,
+ 0xCE, 0xD2, 0xF6, 0x11, 0x0D, 0xCC, 0x85, 0x4C, 0x9A, 0xD3, 0xBF, 0xF2, 0x39, 0xFF, 0x26, 0x4F,
+ 0x4D, 0xAE, 0x25, 0x4A, 0x72, 0xD9, 0x22, 0x8B, 0xE1, 0x07, 0xA9, 0xBD, 0x53, 0x45, 0x7C, 0xEB,
+ 0xFE, 0x56, 0xAE, 0x01, 0x7F, 0x12, 0x4E, 0x18, 0xE7, 0x96, 0xB1, 0x0E, 0x9C, 0x89, 0xA8, 0xB4,
+ 0x1C, 0xDA, 0x3E, 0xFE, 0x8C, 0x1C, 0xEF, 0xB4, 0x50, 0xE5, 0x46, 0x1B, 0x56, 0xCE, 0x01, 0x53,
+ 0xB2, 0x6D, 0xB0, 0xD0, 0x8E, 0x08, 0x89, 0x2A, 0x5B, 0xC8, 0xFC, 0x9B, 0x6B, 0x4B, 0x6D, 0xDC,
+ 0x2E, 0x2E, 0x74, 0xAB, 0xE1, 0xAE, 0xA6, 0x74, 0x8F, 0x31, 0x74, 0x5F, 0x34, 0x45, 0xE4, 0x88,
+ 0xCE, 0x66, 0x24, 0xE9, 0x93, 0x68, 0x76, 0xD6, 0xB9, 0x10, 0xA9, 0xBA, 0x6A, 0x3A, 0xCD, 0xB8,
+ 0x95, 0x44, 0x7D, 0x75, 0x13, 0x64, 0x7B, 0xD2, 0x29, 0xB9, 0x3A, 0x75, 0x98, 0x26, 0xFC, 0x2B,
+ 0x46, 0x8A, 0xFD, 0x5C, 0x2B, 0xB5, 0x6C, 0x48, 0x20, 0x5F, 0xAA, 0x09, 0xAD, 0xBA, 0x7B, 0xE3,
+ 0x13, 0x55, 0x3D, 0xBD, 0x43, 0xEA, 0xC7, 0xA7, 0x3E, 0xDD, 0xF3, 0xEB, 0xBB, 0x7D, 0xFE, 0x2A,
+ 0x9B, 0xC4, 0xFB, 0x44, 0x1D, 0xD1, 0x72, 0x33, 0x88, 0x65, 0xFE, 0xE7, 0xD1, 0xD7, 0x55, 0xDC,
+ 0x2F, 0x17, 0xC0, 0x8A, 0xE2, 0xDA, 0x5E, 0xA4, 0x68, 0x9C, 0xA2, 0x5C, 0xA0, 0xE7, 0x1F, 0x02,
+ 0xFB, 0xC3, 0xEE, 0x63, 0xB7, 0xBD, 0x29, 0xEF, 0xCB, 0xA5, 0x47, 0x5A, 0x79, 0x4D, 0x5E, 0x9D,
+ 0x44, 0x5A, 0xF9, 0xC6, 0xDE, 0x0A, 0x71, 0x58, 0xB6, 0xA0, 0x02, 0xE5, 0xAA, 0x62, 0x15, 0xF4,
+ 0x39, 0x28, 0x9A, 0xF8, 0x59, 0xF1, 0x92, 0x17, 0x45, 0x27, 0x6A, 0x1D, 0x11, 0x3E, 0x08, 0xA2,
+ 0xCD, 0x31, 0x0E, 0xEE, 0xD4, 0xFC, 0xF9, 0x3C, 0x1F, 0x87, 0x00, 0xE2, 0x5F, 0xB8, 0x35, 0xBB,
+ 0xC5, 0x97, 0x32, 0xCE, 0x7F, 0x1D, 0xD6, 0x05, 0xEE, 0xD7, 0x0D, 0xB9, 0x3C, 0x6B, 0xAF, 0x23,
+ 0x0B, 0x86, 0x3C, 0x40, 0x66, 0xCD, 0x65, 0x8A, 0xF8, 0xEB, 0x6B, 0xAB, 0x2F, 0x98, 0x6C, 0x40,
+ 0x8E, 0x54, 0x90, 0xB5, 0x1C, 0x79, 0x7B, 0x83, 0x12, 0xA4, 0x0B, 0x20, 0xD5, 0x95, 0x30, 0x2C,
+ 0x8A, 0x6E, 0x94, 0xD2, 0xAB, 0x78, 0xF5, 0x71, 0x38, 0x4F, 0xB2, 0x93, 0x50, 0xDB, 0x16, 0x94,
+ 0xC4, 0xA9, 0x7D, 0x9D, 0x2F, 0x48, 0x98, 0xEB, 0x74, 0xE2, 0xD7, 0x97, 0x91, 0xBC, 0xF8, 0x90,
+ 0xAF, 0x74, 0x71, 0x38, 0x94, 0xFE, 0xA6, 0xC7, 0x89, 0x63, 0x0D, 0x9B, 0xF1, 0x81, 0x28, 0x4A,
+ 0x75, 0x85, 0x53, 0x83, 0x34, 0x99, 0xE6, 0xF4, 0xAA, 0xF4, 0xF0, 0x1D, 0x92, 0xBE, 0x12, 0x8E,
+ 0x20, 0xBF, 0xCA, 0x41, 0x30, 0x08, 0x9B, 0x47, 0xD0, 0x23, 0x45, 0x67, 0x38, 0x2B, 0x0F, 0xD3,
+ 0xBA, 0x59, 0xEB, 0x7C, 0x39, 0xCF, 0xA8, 0xB7, 0xA9, 0xEF, 0xF4, 0xC7, 0xD9, 0x1B, 0x5B, 0xC4,
+ 0xC3, 0xA3, 0x92, 0xA2, 0xF9, 0x1F, 0xC1, 0x99, 0x57, 0xE6, 0xD8, 0x22, 0xF8, 0xA5, 0xC8, 0x4B,
+ 0xCE, 0xAD, 0xBD, 0x19, 0x71, 0xC3, 0x1A, 0xEB, 0x25, 0xFD, 0xA7, 0x7F, 0xA8, 0x7A, 0xEC, 0x54,
+ 0x0A, 0x97, 0x3E, 0x85, 0x29, 0xAF, 0x85, 0xDE, 0x14, 0x10, 0x3C, 0xBD, 0x66, 0xBE, 0x59, 0xE4,
+ 0x71, 0xD8, 0x7E, 0xEA, 0xF6, 0x8A, 0x8F, 0xF1, 0x3A, 0x03, 0x41, 0x99, 0x27, 0x45, 0xB6, 0x05,
+ 0x2F, 0x6B, 0x11, 0x61, 0xB4, 0x40, 0x40, 0x3A, 0xD2, 0xE9, 0x90, 0xDD, 0x0C, 0x19, 0x3B, 0x01,
+ 0xF2, 0xA4, 0xF5, 0x3B, 0x9C, 0x18, 0x32, 0x26, 0xCB, 0xDB, 0x20, 0x5B, 0xE2, 0x43, 0x70, 0xCB,
+ 0x37, 0xA6, 0xEC, 0x34, 0x85, 0x33, 0xD6, 0x8B, 0x1F, 0x5F, 0x10, 0xCC, 0x86, 0xAB, 0x04, 0x31,
+ 0x5D, 0x07, 0xD6, 0x7C, 0x5F, 0x71, 0x08, 0xAC, 0x3F, 0x08, 0xC6, 0xCF, 0xAC, 0x50, 0xCF, 0xA2,
+ 0xFC, 0xDB, 0x02, 0x01, 0xD5, 0x33, 0x9E, 0x57, 0xDC, 0x88, 0xBC, 0x51, 0x71, 0x95, 0x9A, 0x86,
+ 0x99, 0xBB, 0xFC, 0x5A, 0x3C, 0xB8, 0xC0, 0xA5, 0x12, 0xA4, 0x26, 0x55, 0xE7, 0x8A, 0xD0, 0x6F,
+ 0x2C, 0x52, 0x21, 0xA4, 0x0A, 0xBE, 0xC9, 0xA7, 0x87, 0x4B, 0xBD, 0x47, 0x44, 0xFA, 0x7A, 0xE5,
+ 0xDF, 0x07, 0x54, 0xC8, 0xA3, 0xF3, 0x73, 0x28, 0xE5, 0x52, 0x36, 0x04, 0x42, 0xAB, 0x9C, 0x6E,
+ 0x80, 0x5B, 0x44, 0xF0, 0xA7, 0xC6, 0x00, 0xC3, 0x69, 0x14, 0xE9, 0x01, 0xD2, 0xE4, 0x69, 0x7D,
+ 0x32, 0xAC, 0x78, 0x70, 0x76, 0x81, 0x9A, 0x19, 0x7D, 0x80, 0x82, 0xB5, 0xCE, 0x11, 0xBD, 0xF1,
+ 0x15, 0x36, 0x49, 0xB1, 0x84, 0xCB, 0x15, 0x46, 0x87, 0xF4, 0x83, 0x3D, 0x82, 0x9A, 0x84, 0xB7,
+ 0x86, 0x47, 0x06, 0x72, 0xE9, 0xE5, 0xFE, 0x4C, 0x11, 0xAE, 0xD1, 0x0D, 0xA7, 0xBE, 0xFD, 0xE2,
+ 0xF7, 0xAD, 0xC2, 0x47, 0xA5, 0x72, 0x4A, 0x96, 0x38, 0xCC, 0x6B, 0xE7, 0x94, 0xA3, 0x91, 0x6B,
+ 0x3D, 0x20, 0x86, 0xA4, 0x70, 0x84, 0xDB, 0x35, 0x78, 0xC9, 0x50, 0x89, 0x57, 0xE6, 0xB1, 0xA7,
+ 0x60, 0xD7, 0x89, 0x13, 0x8C, 0x04, 0xEC, 0x19, 0x40, 0x0C, 0xFB, 0x5D, 0x73, 0xAB, 0x2B, 0x58,
+ 0xEF, 0xD2, 0x9C, 0x2C, 0x8F, 0x11, 0x5F, 0x86, 0x43, 0xD3, 0x68, 0xE3, 0x7C, 0xB6, 0x6B, 0xEF,
+ 0x88, 0xC6, 0x64, 0x69, 0x32, 0x0C, 0x86, 0x30, 0xCC, 0x25, 0x0B, 0x5A, 0x74, 0x64, 0x5C, 0xCC,
+ 0xAC, 0xEF, 0x61, 0xFD, 0x06, 0xEE, 0x95, 0xC6, 0xEB, 0xB8, 0xD1, 0x46, 0x7B, 0x50, 0xD1, 0x1D,
+ 0x82, 0x4C, 0xE5, 0xA2, 0xB2, 0xAC, 0x24, 0x49, 0xE0, 0xFB, 0x14, 0x29, 0xC9, 0x39, 0x93, 0x9C,
+ 0x35, 0x61, 0xD4, 0x29, 0xD3, 0x1A, 0x21, 0x6C, 0xD4, 0x89, 0x84, 0x47, 0xF6, 0xE2, 0x00, 0x3A,
+ 0x40, 0xB2, 0xC1, 0x39, 0xFE, 0x79, 0x18, 0xC8, 0x5A, 0x41, 0x1C, 0xAD, 0x8A, 0xB6, 0x79, 0x3F,
+ 0x32, 0xFD, 0x8F, 0x3E, 0x57, 0x22, 0x5F, 0xDE, 0xE0, 0x90, 0x9B, 0xB7, 0xF7, 0x80, 0xA2, 0x42,
+ 0x33, 0x4E, 0x64, 0xD2, 0xB4, 0x25, 0x77, 0x62, 0xA2, 0x48, 0x80, 0x06, 0x17, 0xBB, 0xC8, 0x04,
+ 0x35, 0x94, 0x1A, 0xD7, 0x64, 0xA4, 0xE6, 0xB6, 0xE6, 0x43, 0x30, 0x46, 0x78, 0xB6, 0x98, 0x1B,
+ 0x0F, 0x90, 0xE6, 0xF7, 0x9A, 0x6A, 0xEC, 0x96, 0x7F, 0x46, 0xD8, 0x1E, 0x62, 0xA6, 0x56, 0x54,
+ 0x63, 0x44, 0x62, 0x18, 0x75, 0x61, 0xB4, 0x11, 0x0F, 0x6D, 0x5E, 0xE3, 0x45, 0xD4, 0x80, 0xC1,
+ 0xAF, 0x98, 0xF6, 0x48, 0x15, 0xDF, 0xD5, 0x3C, 0xD3, 0xE9, 0xD2, 0x17, 0x7E, 0x1A, 0x18, 0x3A,
+ 0xA1, 0xFF, 0xF0, 0x46, 0x9C, 0x48, 0xBA, 0x72, 0xFF, 0x21, 0x66, 0x63, 0x8D, 0xB7, 0xA5, 0x17,
+ 0x42, 0x4F, 0x2E, 0xCA, 0xEA, 0x8E, 0xD9, 0x6F, 0xBD, 0x4B, 0x80, 0x4C, 0x73, 0x4F, 0x85, 0x3D,
+ 0x0B, 0x80, 0x32, 0x1A, 0xAD, 0x93, 0x83, 0x82, 0x0B, 0xA6, 0x5E, 0x76, 0x5B, 0x60, 0x51, 0x81,
+ 0x53, 0x9D, 0x82, 0x5F, 0x65, 0xAD, 0x93, 0x80, 0x81, 0x2C, 0x8A, 0x0B, 0x7D, 0x58, 0x67, 0xE5,
+ 0xAD, 0xB9, 0x94, 0xF7, 0x11, 0x58, 0xE9, 0x7D, 0xE0, 0xC6, 0x92, 0xC9, 0x7D, 0x4C, 0xDC, 0x4C,
+ 0x88, 0x22, 0x31, 0x68, 0xC3, 0x37, 0xE3, 0x1E, 0xE5, 0xA4, 0x6B, 0x41, 0xEA, 0x9D, 0xE8, 0xFC,
+ 0xF1, 0xF3, 0x78, 0xF4, 0x54, 0x40, 0x53, 0x9D, 0x7D, 0x4C, 0x70, 0x56, 0xBE, 0xB0, 0x74, 0x67,
+ 0xAC, 0x7D, 0xE0, 0x4F, 0x67, 0x28, 0x71, 0xDD, 0xCE, 0x78, 0xDB, 0xB5, 0xFF, 0x54, 0x22, 0xBD,
+ 0x89, 0x74, 0x38, 0x14, 0x1A, 0x10, 0x2C, 0xDF, 0x30, 0x24, 0xB0, 0xC1, 0x85, 0x09, 0x4D, 0xB5,
+ 0xE2, 0x02, 0x5E, 0x85, 0x9E, 0x6E, 0x6A, 0xB7, 0xE0, 0x6C, 0xF3, 0x91, 0x42, 0xE7, 0x08, 0x07,
+ 0x95, 0x00, 0xD9, 0x7F, 0x2C, 0xD0, 0xA1, 0x2A, 0xB1, 0x52, 0x18, 0x62, 0x57, 0x51, 0xA0, 0xF2,
+ 0xC9, 0x8B, 0xAA, 0x01, 0x08, 0x74, 0xA6, 0x7C, 0x60, 0x3D, 0x3C, 0x4B, 0xED, 0x45, 0xFE, 0xCE,
+ 0x00, 0x9E, 0x6E, 0x99, 0xDA, 0x0B, 0xC6, 0xB6, 0xC5, 0xCF, 0xAA, 0x03, 0xEE, 0x7F, 0x41, 0xAE,
+ 0x83, 0xAB, 0x23, 0xAA, 0x67, 0x1E, 0x20, 0x42, 0x55, 0x54, 0x95, 0xAE, 0xAE, 0x82, 0x2A, 0x3F,
+ 0xAA, 0x14, 0x66, 0xF4, 0xAB, 0x01, 0xAD, 0x5F, 0xA7, 0x76, 0xFA, 0x21, 0xF4, 0x82, 0x22, 0x67,
+ 0x8F, 0xDC, 0xA2, 0x1A, 0xBC, 0x01, 0x75, 0x8D, 0x66, 0x8C, 0xD5, 0x46, 0x90, 0x4D, 0xD8, 0xC0,
+ 0xBC, 0x0F, 0x61, 0xB2, 0xE9, 0xE2, 0xD0, 0x32, 0x27, 0x4B, 0x39, 0x43, 0x50, 0xD0, 0xF7, 0xF2,
+ 0x32, 0x24, 0xE8, 0x32, 0x19, 0x31, 0x57, 0x04, 0x5B, 0xAB, 0x54, 0xC7, 0x44, 0x6B, 0x5F, 0x6C,
+ 0x14, 0xB2, 0x83, 0xA2, 0xEC, 0x5F, 0x04, 0x8A, 0x78, 0x0D, 0xF8, 0x8F, 0x61, 0xFA, 0x32, 0xC9,
+ 0xB4, 0x60, 0xCC, 0xCB, 0x35, 0x92, 0xB3, 0x23, 0x29, 0x28, 0x4D, 0x48, 0x6C, 0x00, 0x9F, 0xF9,
+ 0x8D, 0x26, 0x44, 0xC9, 0x0B, 0xB2, 0x73, 0x94, 0xF3, 0x7A, 0x9C, 0x4E, 0x7E, 0xC3, 0xB7, 0x7E,
+ 0x87, 0x98, 0x18, 0x83, 0x35, 0x93, 0xDD, 0x35, 0xF7, 0xD1, 0x3D, 0xF1, 0x40, 0x48, 0x89, 0xAC,
+ 0xEE, 0x98, 0xE7, 0x5A, 0x77, 0xED, 0x3A, 0xED, 0x5A, 0xE7, 0x38, 0x74, 0xF7, 0xD6, 0xB6, 0x40,
+ 0x76, 0xAE, 0xBD, 0x99, 0x93, 0x02, 0xB3, 0xFF, 0xDE, 0x14, 0x70, 0xC3, 0xBF, 0x77, 0x00, 0x4F,
+ 0xC6, 0x7E, 0x7A, 0x1E, 0x39, 0xD3, 0x00, 0xDC, 0xC2, 0x35, 0x01, 0x25, 0x8C, 0x9C, 0x34, 0x79,
+ 0xA0, 0x47, 0xD4, 0xD4, 0x3B, 0xFF, 0x89, 0x7D, 0x79, 0x8B, 0xBF, 0x9A, 0x64, 0x4E, 0xB7, 0xE5,
+ 0x79, 0x31, 0xB8, 0x45, 0x03, 0xD0, 0xCC, 0xA6, 0xE5, 0x22, 0xBC, 0xF1, 0x40, 0x24, 0xBA, 0xF6,
+ 0x2B, 0xE0, 0x21, 0xE3, 0xA5, 0x4D, 0xBE, 0xBB, 0x45, 0x12, 0x5A, 0x10, 0x1B, 0x28, 0xC2, 0xD6,
+ 0x85, 0xBE, 0xBD, 0xD0, 0xDD, 0xA3, 0xA0, 0x7B, 0x2F, 0x98, 0xE2, 0x9D, 0x62, 0xB1, 0xB6, 0xE2,
+ 0x1E, 0x1D, 0x7E, 0x69, 0x6F, 0x39, 0x92, 0xF2, 0x97, 0x3D, 0x02, 0xE1, 0x17, 0x25, 0x03, 0x63,
+ 0x20, 0x39, 0xEF, 0xBD, 0x56, 0xFD, 0x66, 0xD5, 0x40, 0x31, 0x9A, 0xA7, 0x45, 0x00, 0xD0, 0x01,
+ 0x60, 0x30, 0xA2, 0xD5, 0x6C, 0x5A, 0x56, 0x67, 0x11, 0x57, 0xC8, 0x09, 0x9D, 0x96, 0xB0, 0xD1,
+ 0x88, 0x9F, 0xE7, 0xE3, 0xAC, 0xD0, 0x0C, 0x39, 0x13, 0xB8, 0xF5, 0xFA, 0xDB, 0xFE, 0x5C, 0x52,
+ 0x4A, 0x8D, 0xA2, 0x8C, 0xA8, 0x7E, 0xAB, 0xEC, 0x22, 0x7F, 0x23, 0x04, 0x16, 0x0E, 0x8F, 0x99,
+ 0xD7, 0x83, 0x13, 0xDF, 0x40, 0x3F, 0xB7, 0xF1, 0xA9, 0x2A, 0x04, 0x62, 0xD3, 0xC1, 0x2F, 0x4B,
+ 0x5D, 0xE8, 0xB8, 0x0E, 0xD2, 0x46, 0xF3, 0x13, 0x92, 0x9A, 0x63, 0x03, 0x54, 0xEC, 0x9E, 0xD3,
+ 0x30, 0x00, 0x03, 0x8A, 0x77, 0x8B, 0xCD, 0x8C, 0x3D, 0x6B, 0x9E, 0xBB, 0x72, 0x7B, 0xB8, 0x72,
+ 0xB9, 0xCD, 0x98, 0x69, 0xFB, 0x20, 0xB8, 0xC5, 0x3F, 0xA0, 0x9C, 0xD1, 0x29, 0x89, 0xE0, 0x55,
+ 0xDF, 0x87, 0x5D, 0x90, 0x28, 0x99, 0xE6, 0x39, 0x63, 0x6A, 0x19, 0xE8, 0x0D, 0x50, 0xB1, 0x2C,
+ 0xF3, 0x31, 0xC1, 0x68, 0x23, 0xE3, 0x70, 0xFF, 0x7E, 0x1F, 0x4D, 0xF5, 0xC5, 0x90, 0xE9, 0x81,
+ 0x17, 0x66, 0x17, 0x40, 0x44, 0xDF, 0x2F, 0x63, 0x50, 0x82, 0x72, 0x87, 0x23, 0x93, 0x6B, 0x7E,
+ 0xAD, 0x53, 0x6F, 0xD7, 0x78, 0x31, 0x25, 0x9F, 0x9E, 0xC3, 0xC9, 0x42, 0x18, 0x40, 0xE9, 0x4C,
+ 0xFC, 0xAA, 0xC7, 0xF5, 0x51, 0x93, 0x24, 0xE2, 0xFD, 0x69, 0x72, 0x68, 0xE1, 0x8D, 0x59, 0x42,
+ 0x1A, 0x14, 0x48, 0x6A, 0xDD, 0x59, 0xC3, 0xA7, 0x34, 0x73, 0x37, 0xAE, 0x82, 0xB9, 0xEB, 0x46,
+ 0xD2, 0xB6, 0x31, 0xB4, 0x3E, 0x82, 0x49, 0x4B, 0x0F, 0x13, 0xB5, 0x98, 0x47, 0x26, 0xD4, 0x45,
+ 0x8C, 0xE2, 0x04, 0xD4, 0xC6, 0x8B, 0x7B, 0x7D, 0x0E, 0x7D, 0x3C, 0x63, 0x39, 0xD7, 0xDF, 0xB2,
+ 0x68, 0x34, 0xD4, 0xB4, 0x70, 0x6A, 0x98, 0x15, 0xDF, 0x16, 0xEF, 0xAF, 0x1E, 0xC5, 0x1F, 0x5C,
+ 0x3D, 0x85, 0x74, 0xC6, 0xCF, 0x44, 0x01, 0xD3, 0xC3, 0x61, 0x93, 0xBF, 0x23, 0x9F, 0x99, 0x44,
+ 0x54, 0x2A, 0x32, 0xB9, 0x75, 0x21, 0x1B, 0x2C, 0xE1, 0xFB, 0xFF, 0xAF, 0x62, 0x6F, 0x86, 0x23,
+ 0xFE, 0xCD, 0x68, 0x38, 0xB6, 0xAC, 0x49, 0xF6, 0x4A, 0x0C, 0xA1, 0xF5, 0x19, 0xD1, 0x5A, 0xA8,
+ 0xF0, 0xB4, 0x9B, 0x4E, 0x0F, 0x6B, 0x65, 0x46, 0x44, 0x16, 0x2F, 0x7E, 0x6E, 0xDC, 0x5F, 0x5E,
+ 0x6F, 0x31, 0x99, 0x43, 0xA0, 0x27, 0xBD, 0x2A, 0x58, 0x6E, 0xB2, 0x82, 0x29, 0x78, 0xED, 0xA6,
+ 0x83, 0x4D, 0x1B, 0xCD, 0x9C, 0x0F, 0xE5, 0xE7, 0x1A, 0xE4, 0x63, 0xD6, 0x6A, 0xD5, 0x03, 0x39,
+ 0xB8, 0x48, 0x77, 0x80, 0xF7, 0xF3, 0xFE, 0x64, 0x8B, 0x98, 0x72, 0xBE, 0x31, 0x28, 0xF0, 0x48,
+ 0x2A, 0x65, 0x37, 0xDA, 0xD1, 0x9A, 0x18, 0x37, 0xBB, 0x23, 0x59, 0xB3, 0x24, 0x75, 0xF7, 0xF5,
+ 0x79, 0x4E, 0xF0, 0xCA, 0x85, 0x13, 0x3C, 0x93, 0xD0, 0xC6, 0xD9, 0xEA, 0xAE, 0xDF, 0x7E, 0xAC,
+ 0xE4, 0xAB, 0x88, 0x0E, 0x78, 0x80, 0x1D, 0x26, 0x2A, 0x5C, 0x95, 0x23, 0x6B, 0x70, 0x99, 0x6C,
+ 0x15, 0xC4, 0x86, 0xC0, 0x29, 0x9D, 0x55, 0xE4, 0xC1, 0x84, 0x37, 0x6B, 0xA7, 0x26, 0x82, 0xCC,
+ 0x9C, 0xDA, 0xEB, 0x54, 0x17, 0x67, 0xD3, 0x74, 0x4B, 0x4F, 0x7C, 0x63, 0x4D, 0xE7, 0xE4, 0x93,
+ 0x34, 0xDB, 0xDE, 0x9D, 0x17, 0x28, 0x06, 0xEA, 0x09, 0x2A, 0x63, 0x8D, 0x1A, 0x32, 0xD8, 0xC9,
+ 0x66, 0xE2, 0x77, 0xE6, 0x19, 0x59, 0x44, 0x13, 0x2A, 0x7E, 0x4E, 0xF4, 0x5A, 0xC7, 0xBB, 0x43,
+ 0xDC, 0xC8, 0x6A, 0x56, 0x5D, 0x2F, 0x55, 0xFD, 0x7E, 0x5A, 0x37, 0x1F, 0x99, 0xE3, 0xF8, 0xEC,
+ 0x50, 0x0B, 0xE3, 0x94, 0xC4, 0xF5, 0xCD, 0xC1, 0x03, 0x96, 0x76, 0xB3, 0x34, 0x01, 0xF9, 0x5C,
+ 0xE6, 0xC9, 0x99, 0x40, 0xB7, 0xCD, 0x5C, 0xF8, 0xE6, 0xF7, 0x3F, 0x7B, 0x13, 0x19, 0x22, 0x02,
+ 0xEF, 0x59, 0x45, 0x48, 0x61, 0x2B, 0xED, 0xCD, 0xB5, 0x90, 0x2C, 0xD0, 0x49, 0xB4, 0x39, 0x76,
+ 0x51, 0xBE, 0x51, 0xD7, 0x3D, 0xD7, 0xDD, 0x55, 0x98, 0xC5, 0x0F, 0xBD, 0xF6, 0xE0, 0x96, 0xAA,
+ 0xB8, 0x19, 0x97, 0x7F, 0x35, 0x2C, 0x50, 0x69, 0xE8, 0xEE, 0x6A, 0x2F, 0x00, 0x18, 0x65, 0x1B,
+ 0xD6, 0xB8, 0x2A, 0xC3, 0x0A, 0x37, 0xEA, 0x7E, 0x95, 0x8B, 0x60, 0xA5, 0x2E, 0xC0, 0x55, 0x24,
+ 0x3B, 0x3D, 0xB1, 0x40, 0x22, 0x8A, 0x56, 0xAB, 0x04, 0x6B, 0x31, 0x0E, 0xB6, 0xD7, 0x17, 0xF1,
+ 0xEA, 0x9B, 0x91, 0x0E, 0xEE, 0xCE, 0x0A, 0xFE, 0x37, 0x46, 0xAC, 0x15, 0xF9, 0x60, 0xFF, 0x73,
+ 0x54, 0xC9, 0xE1, 0x8C, 0x42, 0xFA, 0x39, 0x51, 0xD4, 0x77, 0xAC, 0x62, 0xF3, 0x15, 0x8D, 0xC5,
+ 0xEC, 0x46, 0x75, 0x97, 0x50, 0xED, 0x10, 0xF5, 0xC7, 0x81, 0xEC, 0x1D, 0x7C, 0x40, 0x7B, 0x9F,
+ 0x4F, 0x37, 0xA4, 0xED, 0x3C, 0x35, 0x68, 0xDB, 0xDB, 0x7F, 0xF2, 0xF3, 0xDC, 0x39, 0xA0, 0x40,
+ 0xE8, 0x17, 0x9C, 0xD8, 0x26, 0x92, 0xF2, 0x57, 0x5E, 0xE7, 0x56, 0xDA, 0x4F, 0x3F, 0x4C, 0xF4,
+ 0x90, 0x4A, 0x89, 0x33, 0x49, 0xBB, 0x99, 0xE9, 0xCA, 0x6F, 0x5F, 0x51, 0xAE, 0xFF, 0x83, 0x90,
+ 0x83, 0x53, 0xFF, 0x00, 0x7F, 0x2F, 0x84, 0xD7, 0xD8, 0xE8, 0xB1, 0xAB, 0xF9, 0x56, 0x65, 0x93,
+ 0xA7, 0xC2, 0xB4, 0xD7, 0x6B, 0xB4, 0xCF, 0x65, 0xC8, 0xCA, 0x20, 0x15, 0x91, 0x74, 0x30, 0x4D,
+ 0x72, 0x5B, 0xBD, 0x70, 0xC5, 0x8B, 0xD3, 0xC7, 0xD4, 0x7B, 0xFB, 0xDF, 0x6B, 0x7B, 0x19, 0x6B,
+ 0x8B, 0x83, 0x47, 0x83, 0xC6, 0x44, 0xBA, 0xA8, 0xEA, 0xB8, 0x38, 0x67, 0x6B, 0x58, 0xF3, 0x4E,
+ 0xC8, 0xA8, 0xF4, 0xDD, 0x30, 0xDD, 0x59, 0x4D, 0x55, 0x27, 0x1E, 0x14, 0x3A, 0x71, 0xD5, 0xFD,
+ 0x59, 0x0B, 0xC2, 0x17, 0x2F, 0x08, 0x53, 0x27, 0x07, 0xEE, 0xA0, 0xC6, 0xE9, 0xF8, 0x31, 0xDD,
+ 0x97, 0xC4, 0xAD, 0xC1, 0x9A, 0x60, 0x5C, 0xE4, 0x27, 0x0A, 0x03, 0x35, 0x10, 0x9C, 0xE8, 0x70,
+ 0xE3, 0xF3, 0xD8, 0xE6, 0x72, 0xA5, 0x31, 0xC6, 0xFE, 0x46, 0xA8, 0x46, 0x6E, 0x74, 0x90, 0xD6,
+ 0x8F, 0x27, 0x3C, 0x39, 0x24, 0x5E, 0x31, 0x3C, 0xCC, 0x9A, 0xDD, 0xFE, 0xE9, 0xDA, 0x84, 0xE8,
+ 0xA1, 0xCC, 0x4B, 0xE1, 0x1B, 0xAA, 0x7D, 0xF6, 0x7C, 0xA8, 0x4C, 0xD5, 0xFC, 0x3C, 0x4C, 0xFC,
+ 0x62, 0x32, 0xAE, 0x5D, 0xBA, 0x65, 0xDC, 0xC3, 0x1D, 0x8C, 0x9D, 0x0E, 0x2A, 0x46, 0x64, 0x8D,
+ 0xCD, 0x6E, 0xBC, 0x86, 0x16, 0x15, 0xA2, 0x26, 0xD1, 0x3E, 0x5F, 0x0A, 0x81, 0x86, 0x0F, 0xE8,
+ 0xA1, 0x28, 0xA3, 0x5F, 0xFF, 0xE4, 0x68, 0x2C, 0xE6, 0x30, 0x16, 0xB8, 0x2E, 0xCD, 0x41, 0x52,
+ 0xE3, 0x81, 0xFB, 0x1D, 0x1C, 0xA2, 0x17, 0xC3, 0xF1, 0x24, 0x02, 0x94, 0xB9, 0x59, 0xEC, 0x4A,
+ 0x6D, 0xE3, 0x27, 0x18, 0x2C, 0xDA, 0x75, 0x17, 0x42, 0xAA, 0xF7, 0x61, 0x50, 0x29, 0x8C, 0x0A,
+ 0xCA, 0x8E, 0xCA, 0x59, 0x82, 0x1F, 0x1D, 0x0B, 0x00, 0x36, 0xE4, 0x78, 0x25, 0x01, 0xF7, 0xFB,
+ 0x0E, 0x65, 0x4E, 0x07, 0x5E, 0xD8, 0x23, 0xC6, 0x49, 0x76, 0x06, 0x0B, 0xA5, 0xC2, 0x30, 0x55,
+ 0x82, 0xF6, 0x60, 0x69, 0xAE, 0x1B, 0x37, 0xC1, 0x02, 0xE8, 0x23, 0x9B, 0x15, 0x70, 0x7B, 0xF8,
+ 0xF9, 0x5E, 0x50, 0x69, 0x2F, 0x28, 0x7E, 0xDB, 0x35, 0x2F, 0x6C, 0x87, 0xCC, 0xFD, 0x23, 0x1A,
+ 0x3B, 0x32, 0x9C, 0xFC, 0xE2, 0x6A, 0x24, 0x2A, 0x0C, 0x5E, 0x4D, 0x19, 0x7E, 0xDA, 0xCA, 0x95,
+ 0x61, 0xE1, 0xC6, 0x60, 0x4E, 0x62, 0xCB, 0x6A, 0x09, 0x83, 0x02, 0xEF, 0xC8, 0x7E, 0x36, 0x79,
+ 0x14, 0x24, 0x35, 0x01, 0xCF, 0xCB, 0x95, 0xF5, 0x08, 0x5E, 0x0A, 0x46, 0xD2, 0x5B, 0x46, 0x43,
+ 0x54, 0x3B, 0x4F, 0x96, 0xD5, 0x53, 0x81, 0x8D, 0x0E, 0xDE, 0x7A, 0x94, 0xB8, 0x09, 0x11, 0x47,
+ 0x8F, 0x38, 0xFE, 0x47, 0x00, 0xFA, 0x76, 0x73, 0x96, 0xDA, 0x1C, 0x55, 0xE9, 0x9E, 0x73, 0x1E,
+ 0x75, 0xCF, 0x7A, 0x4D, 0xB0, 0x44, 0x6E, 0x2A, 0x6D, 0x98, 0x2B, 0x39, 0xDC, 0xBA, 0x17, 0x50,
+ 0x06, 0xEA, 0xA6, 0x62, 0x33, 0xD9, 0xD2, 0x66, 0x78, 0x05, 0xE5, 0x52, 0x2B, 0x9F, 0x34, 0xAE,
+ 0xDF, 0xE9, 0x9D, 0x44, 0xBA, 0x93, 0xD8, 0x29, 0x02, 0xC6, 0xED, 0x5A, 0x59, 0x0A, 0xD0, 0xD9,
+ 0x6D, 0xBE, 0x97, 0x25, 0x5E, 0xDA, 0x95, 0x44, 0xCE, 0x73, 0xFD, 0xE5, 0x98, 0xFD, 0x75, 0x38,
+ 0x88, 0x1E, 0x42, 0x2A, 0x3F, 0x65, 0x96, 0x7C, 0xF1, 0x86, 0x51, 0xBE, 0x51, 0xB1, 0x1E, 0xD1,
+ 0x76, 0x64, 0x08, 0x85, 0x49, 0xD7, 0xDD, 0xDD, 0xD4, 0xFA, 0xFE, 0xCA, 0x67, 0xDB, 0x36, 0x90,
+ 0x07, 0xEB, 0x86, 0xF6, 0x07, 0x7A, 0x21, 0xDB, 0xEE, 0x57, 0x24, 0x55, 0x87, 0x2C, 0xD2, 0xA4,
+ 0xEE, 0x45, 0x51, 0xE8, 0x05, 0xD1, 0x24, 0x08, 0xD0, 0x3B, 0x7D, 0xCA, 0x0E, 0x5D, 0x03, 0x57,
+ 0x44, 0xF7, 0x76, 0x0A, 0xCD, 0x20, 0x9B, 0x93, 0xE0, 0x7D, 0x86, 0x3E, 0x48, 0x8D, 0xF0, 0x4C,
+ 0x28, 0x32, 0x77, 0xD8, 0xA3, 0x48, 0xA0, 0x93, 0x36, 0x05, 0xA0, 0x19, 0xF2, 0x98, 0x6C, 0x17,
+ 0x5E, 0x2C, 0x5E, 0xE4, 0xAD, 0x36, 0x96, 0x10, 0x1B, 0xE5, 0xB7, 0x6B, 0x84, 0x0C, 0xED, 0xE3,
+ 0xDC, 0x4B, 0xA4, 0xE7, 0x0A, 0xDA, 0xD4, 0xE7, 0xD9, 0x1E, 0xEE, 0xF9, 0xD5, 0x06, 0xAF, 0x3F,
+ 0x51, 0x1D, 0x98, 0x42, 0x77, 0x11, 0x02, 0x57, 0x10, 0x3C, 0x5C, 0x98, 0xDA, 0x7D, 0x64, 0x6B,
+ 0xEC, 0x6B, 0x51, 0xFB, 0x77, 0x31, 0x79, 0xCE, 0x9C, 0x58, 0x03, 0xEA, 0x2A, 0xDF, 0x92, 0x5D,
+ 0xED, 0x0F, 0x20, 0xCC, 0x0A, 0x70, 0x42, 0x94, 0x37, 0xFA, 0xDF, 0xA1, 0xAF, 0x70, 0x1B, 0x0E,
+ 0x80, 0x5B, 0x3E, 0xA9, 0xBF, 0x0F, 0x2B, 0x5D, 0xD8, 0x2F, 0xEF, 0xF9, 0xF3, 0x53, 0xC5, 0xE7,
+ 0x93, 0x87, 0x49, 0x54, 0xE4, 0x48, 0x74, 0xD2, 0xDC, 0x2A, 0x9A, 0xE2, 0x18, 0x61, 0xD7, 0xAC,
+ 0x4C, 0x1A, 0x2E, 0x72, 0x83, 0x8D, 0xDA, 0xCE, 0x16, 0xD1, 0x3F, 0x90, 0x62, 0xCA, 0xA7, 0x06,
+ 0x22, 0x66, 0xF3, 0x67, 0xB0, 0xA3, 0xD4, 0xDD, 0xB1, 0xA4, 0xF3, 0x22, 0xB3, 0x02, 0x4D, 0xD4,
+ 0x2C, 0x84, 0xF5, 0x75, 0x87, 0x7D, 0x56, 0x04, 0xC1, 0xC1, 0x62, 0x12, 0x59, 0xCF, 0x04, 0xA4,
+ 0x20, 0x1F, 0xF5, 0xC5, 0x8D, 0xB6, 0x88, 0x54, 0x61, 0xF3, 0x5A, 0x88, 0x3F, 0x6E, 0x5C, 0xE9,
+ 0x8B, 0x81, 0x56, 0xE6, 0x10, 0xC7, 0xED, 0x5F, 0x03, 0x67, 0x3E, 0x2E, 0xBD, 0x6A, 0xC3, 0x4D,
+ 0x33, 0xB7, 0xD4, 0x87, 0x46, 0x0B, 0x27, 0x86, 0xFC, 0x65, 0x6F, 0xDF, 0x5A, 0x3D, 0x77, 0x49,
+ 0x5A, 0xFB, 0x3A, 0x81, 0xCE, 0xA1, 0xAC, 0x02, 0x18, 0x7E, 0x5B, 0x58, 0x75, 0xFB, 0x64, 0x7C,
+ 0xAA, 0x50, 0xE6, 0xE6, 0xA2, 0x7E, 0xFC, 0xC7, 0x67, 0x25, 0x5D, 0xE5, 0x24, 0x28, 0x1F, 0x3B,
+ 0xE6, 0x31, 0x6D, 0x43, 0x93, 0xD3, 0xC4, 0xB4, 0x6F, 0x89, 0x02, 0x9B, 0x54, 0xC7, 0x6B, 0x97,
+ 0xD3, 0x85, 0x06, 0xE1, 0x4E, 0x15, 0xD2, 0xE8, 0xF3, 0x94, 0x37, 0x40, 0x30, 0x2C, 0xA0, 0x25,
+ 0x77, 0xA8, 0xC0, 0x23, 0x3F, 0x5F, 0x55, 0x71, 0x21, 0xD3, 0x33, 0x0B, 0x7A, 0x2F, 0xDF, 0xB9,
+ 0x39, 0x0D, 0xAE, 0x65, 0xCF, 0x53, 0x9C, 0x82, 0xA2, 0xE5, 0x40, 0xF9, 0xF6, 0xDF, 0xBA, 0x33,
+ 0x96, 0xF3, 0x55, 0x25, 0x35, 0x9E, 0x5F, 0x9B, 0x25, 0x39, 0x94, 0x2F, 0x03, 0xA6, 0x28, 0xB0,
+ 0x6A, 0xFF, 0xFA, 0x14, 0xD6, 0xE7, 0x02, 0x07, 0x8F, 0x1A, 0xC4, 0xF0, 0x51, 0x34, 0x3D, 0xD3,
+ 0xDF, 0xCB, 0x57, 0xC3, 0xF5, 0x04, 0xE2, 0x4C, 0x58, 0x18, 0xA5, 0xE2, 0x39, 0xB4, 0xA3, 0xE2,
+ 0xE6, 0x25, 0xC5, 0xAC, 0xFD, 0x75, 0xB2, 0x2B, 0x5B, 0x93, 0xC5, 0xFF, 0x56, 0xDB, 0xAA, 0x6E,
+ 0xCC, 0x18, 0x98, 0x90, 0x8A, 0x2C, 0x85, 0x84, 0xE7, 0xCF, 0xB0, 0xC5, 0x18, 0x1F, 0x59, 0xC7,
+ 0xA4, 0xCE, 0xAD, 0xB2, 0x04, 0x41, 0xBD, 0x56, 0xD3, 0x12, 0xD5, 0x0A, 0x19, 0x83, 0x6D, 0xED,
+ 0x87, 0xB0, 0xAB, 0xAE, 0x8F, 0x79, 0xE5, 0x51, 0x30, 0xE9, 0x90, 0xBB, 0x91, 0x38, 0x2A, 0x17,
+ 0xDE, 0x3F, 0x53, 0x54, 0x34, 0x1E, 0x3F, 0x20, 0xE1, 0xA5, 0x17, 0xD5, 0xCD, 0x64, 0x62, 0x1C,
+ 0x60, 0xD2, 0xFC, 0xC1, 0x86, 0xA1, 0x55, 0x62, 0x29, 0x58, 0x33, 0xD6, 0x1D, 0x3F, 0xD2, 0x70,
+ 0xD6, 0x79, 0x09, 0x35, 0x23, 0x6B, 0xEA, 0x8E, 0x80, 0xEB, 0x43, 0xAF, 0xBF, 0x86, 0xE8, 0xD6,
+ 0xBB, 0x1F, 0x75, 0x7A, 0x43, 0xAC, 0xC7, 0x84, 0x85, 0xAD, 0xE1, 0x72, 0x4A, 0xF8, 0x97, 0xBE,
+ 0xC6, 0x11, 0xCD, 0xAD, 0x99, 0xAE, 0xD4, 0x78, 0x4F, 0xFA, 0x76, 0x5F, 0x95, 0xEF, 0x0E, 0x0C,
+ 0x86, 0x2F, 0x45, 0x6F, 0xB0, 0xED, 0x35, 0x87, 0x55, 0x79, 0x0B, 0x39, 0x0E, 0x13, 0x4A, 0x67,
+ 0x9A, 0xC5, 0x27, 0xC7, 0x5C, 0x99, 0x84, 0x75, 0xE6, 0xD1, 0x66, 0x2F, 0x2F, 0x47, 0xA9, 0xE6,
+ 0xDD, 0x9C, 0xCF, 0x10, 0x64, 0x33, 0xDE, 0xBB, 0x35, 0x54, 0x9F, 0xBB, 0x40, 0x1B, 0xF1, 0x53,
+ 0x48, 0xA1, 0x68, 0x42, 0x39, 0x92, 0x52, 0xAE, 0xAC, 0xA5, 0x6E, 0xA4, 0x09, 0x96, 0x1A, 0xE8,
+ 0x88, 0x59, 0x38, 0xF3, 0xCA, 0x72, 0x52, 0xCC, 0xB0, 0x4F, 0x2B, 0x86, 0xA9, 0xA9, 0x7D, 0xBF,
+ 0x6F, 0x6A, 0x07, 0x89, 0x52, 0x99, 0xF8, 0x06, 0xE5, 0x28, 0xC5, 0x74, 0xEC, 0x81, 0xE1, 0xE8,
+ 0x25, 0x66, 0xD7, 0x7F, 0xEA, 0x51, 0x56, 0xF7, 0xA8, 0x06, 0x44, 0xE9, 0xE0, 0x2F, 0x33, 0x19,
+ 0x4A, 0xD1, 0xCD, 0x92, 0x19, 0x2A, 0x1F, 0x03, 0x07, 0xD1, 0x46, 0x05, 0x0D, 0x64, 0x23, 0xEC,
+ 0x4D, 0x4E, 0x03, 0x2A, 0xED, 0xA5, 0xF4, 0x9F, 0xC3, 0x93, 0xAB, 0xA3, 0xE2, 0x8C, 0x3F, 0xC4,
+ 0xA5, 0xE1, 0x47, 0x0D, 0x1A, 0x37, 0x52, 0x9D, 0x45, 0x96, 0xE2, 0x4D, 0x7F, 0xFD, 0x06, 0x28,
+ 0xE3, 0xEE, 0xE4, 0x57, 0x5D, 0x7B, 0x72, 0xA7, 0x8A, 0xCE, 0x77, 0x26, 0xCF, 0x98, 0x06, 0x31,
+ 0xB7, 0x28, 0x73, 0x1D, 0xA3, 0x4F, 0xB5, 0x01, 0xE5, 0x4C, 0x14, 0xAD, 0xDB, 0x3F, 0xE6, 0xD1,
+ 0xDA, 0xF7, 0x58, 0xBC, 0x54, 0x76, 0x9E, 0x99, 0xD4, 0xFC, 0x7F, 0xE9, 0x6D, 0xF9, 0xAE, 0xC2,
+ 0x7B, 0x45, 0x32, 0x7D, 0x29, 0x22, 0xB2, 0xF3, 0x7D, 0x08, 0x37, 0x49, 0x0C, 0xB7, 0xC4, 0x0E,
+ 0xE7, 0x6C, 0x1E, 0xA7, 0xBE, 0x75, 0x4E, 0x4C, 0x1A, 0xBD, 0x2F, 0xC6, 0x70, 0xD7, 0x38, 0xAE,
+ 0x61, 0x3C, 0x01, 0xEB, 0x07, 0x25, 0xEA, 0x45, 0x21, 0x06, 0x99, 0xBF, 0xD0, 0xAC, 0xD1, 0xDB,
+ 0x69, 0xF4, 0x64, 0x9F, 0xEB, 0xB3, 0xCF, 0xD8, 0xB1, 0x90, 0xAA, 0xAF, 0x80, 0x50, 0xA0, 0x92,
+ 0xBA, 0x7E, 0xA2, 0x7B, 0x2D, 0x13, 0x7E, 0x9F, 0x4F, 0xFD, 0x0F, 0x40, 0xEC, 0x2D, 0x0E, 0x85,
+ 0xB7, 0xDA, 0x01, 0x64, 0x95, 0x95, 0x66, 0x91, 0x15, 0x3F, 0x09, 0x77, 0xAC, 0xBF, 0x0D, 0x6F,
+ 0x7C, 0xC1, 0xB7, 0x5F, 0xBD, 0xDA, 0xE9, 0xF7, 0xCC, 0x83, 0x17, 0x3B, 0x14, 0x20, 0x81, 0xE5,
+ 0x9A, 0xA5, 0x4A, 0x40, 0xD7, 0x4A, 0x7A, 0x94, 0xE1, 0x6F, 0x3B, 0x27, 0xEA, 0x13, 0x7E, 0x5E,
+ 0xE7, 0x4D, 0x96, 0xF1, 0x47, 0x8F, 0xD4, 0x79, 0x3D, 0x98, 0xD7, 0xCD, 0x3C, 0x35, 0x3A, 0x3F,
+ 0x54, 0x3A, 0x48, 0x73, 0x66, 0xC3, 0xFD, 0x11, 0x87, 0x76, 0x0C, 0xF0, 0xC5, 0x08, 0x97, 0xA6,
+ 0xC5, 0x88, 0x3F, 0x4F, 0xC7, 0x32, 0x72, 0x5C, 0xD4, 0x17, 0x8D, 0x45, 0x91, 0x62, 0xB2, 0xC3,
+ 0x4A, 0xA4, 0x58, 0x88, 0x5C, 0x9C, 0xB5, 0x72, 0xFE, 0xE9, 0xB7, 0x73, 0x55, 0x7B, 0xD5, 0x91,
+ 0x66, 0x02, 0x4C, 0xF7, 0x11, 0x77, 0x9D, 0x68, 0x4E, 0x1A, 0xC5, 0x6B, 0xB9, 0x0A, 0xC3, 0x7F,
+ 0xB0, 0x48, 0x87, 0xC4, 0xC9, 0x29, 0x73, 0x1A, 0x25, 0xDA, 0x46, 0x3E, 0x10, 0x02, 0x9A, 0xCE,
+ 0x23, 0xD9, 0x77, 0xC6, 0x0D, 0xA3, 0xD5, 0xF8, 0x6B, 0xE2, 0x10, 0x90, 0x01, 0xE7, 0xF7, 0xAF,
+ 0x35, 0x59, 0x8D, 0x1D, 0xA7, 0x3B, 0xD2, 0x5A, 0x33, 0x33, 0xAF, 0xB0, 0xAC, 0xD1, 0x2A, 0x43,
+ 0x79, 0x13, 0x5C, 0x2A, 0x55, 0x37, 0x52, 0xA1, 0x69, 0x17, 0x7F, 0xE9, 0x7C, 0xD7, 0x6D, 0x43,
+ 0x57, 0xC3, 0x1B, 0x2E, 0x5D, 0xA0, 0x5B, 0x3D, 0x75, 0x4E, 0xF4, 0xA1, 0x24, 0xDE, 0x50, 0x18,
+ 0x90, 0xB9, 0x89, 0xF1, 0x47, 0x4C, 0x61, 0xDB, 0xD8, 0xF0, 0x66, 0xD6, 0x1F, 0xB3, 0x9F, 0x91,
+ 0x4D, 0x91, 0xFD, 0x6E, 0xB9, 0x4B, 0x47, 0xC9, 0xF6, 0x48, 0x07, 0xFB, 0xC6, 0x64, 0x48, 0x33,
+ 0x5F, 0x92, 0x19, 0x22, 0xB7, 0x69, 0xE2, 0x9D, 0x69, 0x02, 0xE7, 0x47, 0x97, 0xAC, 0x52, 0xAA,
+ 0xB6, 0x50, 0xC7, 0x9B, 0x16, 0x29, 0x15, 0x1F, 0x12, 0x46, 0xE0, 0xC0, 0x3F, 0xA9, 0xB0, 0x30,
+ 0x47, 0xE7, 0x6F, 0x73, 0x62, 0xB0, 0xD6, 0x50, 0x20, 0x40, 0x47, 0x4C, 0x5D, 0x5C, 0xA1, 0xBA,
+ 0x05, 0x8E, 0x06, 0x22, 0xEA, 0xDF, 0x4C, 0x52, 0xFE, 0x21, 0x72, 0x6B, 0xD4, 0xB1, 0xEF, 0x38,
+ 0x74, 0xF5, 0xB3, 0x4D, 0x38, 0x91, 0x5F, 0x21, 0x74, 0x4B, 0x18, 0x27, 0xBD, 0x70, 0x4A, 0x6A,
+ 0xBD, 0x62, 0x2A, 0xEE, 0xCE, 0xAE, 0x6B, 0x23, 0xA2, 0x97, 0x7E, 0x06, 0x24, 0xAE, 0x09, 0xD6,
+ 0xC3, 0xEE, 0x10, 0x6D, 0x8D, 0x04, 0xF2, 0xAE, 0x09, 0x10, 0xB0, 0x54, 0xD0, 0x1C, 0x84, 0x55,
+ 0xCF, 0xED, 0xFD, 0xB8, 0xDE, 0xF5, 0xA4, 0x5B, 0xFA, 0x7D, 0x7C, 0xAC, 0xC0, 0x85, 0x48, 0xB2,
+ 0x05, 0x45, 0x05, 0x36, 0xDD, 0x9A, 0xD9, 0x43, 0x75, 0x94, 0xAF, 0xD5, 0xDF, 0x70, 0xE4, 0x7D,
+ 0x37, 0x49, 0x0E, 0xE6, 0xD1, 0xC2, 0x1A, 0xBD, 0xCD, 0xC6, 0xD8, 0xC5, 0xAA, 0xD8, 0x90, 0x6E,
+ 0xD7, 0x5D, 0xA4, 0x6B, 0x19, 0xB1, 0x7A, 0x18, 0xF1, 0x29, 0x4D, 0x20, 0xF7, 0x7A, 0x7F, 0x7C,
+ 0xE6, 0x8A, 0x54, 0x05, 0xB7, 0xA0, 0xD9, 0x32, 0xDB, 0x53, 0xF6, 0x48, 0x65, 0x89, 0x86, 0x5B,
+ 0x85, 0x7F, 0x11, 0x61, 0x0A, 0x99, 0xBE, 0x01, 0x56, 0xA3, 0xA7, 0x3A, 0xE6, 0xAB, 0xDF, 0x6B,
+ 0xB4, 0x11, 0x24, 0xFC, 0x36, 0x30, 0x8C, 0x85, 0x06, 0xFB, 0x0C, 0xB9, 0xB2, 0x50, 0x51, 0xF8,
+ 0xDD, 0x3B, 0xB3, 0xC7, 0x4E, 0x7A, 0x4A, 0x8E, 0x42, 0x01, 0xCB, 0xA9, 0xE5, 0x21, 0xD5, 0xDF,
+ 0x8E, 0x59, 0x53, 0x82, 0xA8, 0xA0, 0x25, 0x9F, 0xCE, 0x99, 0x17, 0x9F, 0xC6, 0xD7, 0xDB, 0x67,
+ 0xA7, 0x72, 0xC8, 0x22, 0x43, 0x32, 0x8E, 0x75, 0xE7, 0x29, 0xAC, 0x7A, 0x0A, 0x95, 0xC3, 0x32,
+ 0xA9, 0x56, 0xE6, 0xD7, 0xFE, 0x29, 0xC1, 0x5C, 0x02, 0xB6, 0xD7, 0x16, 0x06, 0xC7, 0x86, 0x33,
+ 0x68, 0x41, 0x64, 0xAE, 0x1D, 0xD6, 0xEC, 0x9F, 0x4D, 0x2A, 0x79, 0x01, 0xDB, 0x48, 0x52, 0xB7,
+ 0x62, 0x36, 0x2B, 0x47, 0x2C, 0x0C, 0x9F, 0x10, 0xB0, 0x16, 0x34, 0x13, 0xAA, 0xF8, 0x18, 0xC5,
+ 0xAA, 0xAF, 0x57, 0x03, 0xC9, 0x48, 0xE4, 0x75, 0x94, 0xCB, 0xDA, 0xC2, 0xDF, 0xDE, 0x92, 0x23,
+ 0x1E, 0x07, 0xF8, 0x04, 0xFC, 0x90, 0x34, 0xCE, 0xC3, 0x9C, 0x87, 0xBF, 0xA6, 0x45, 0x1B, 0xFC,
+ 0x73, 0x2B, 0xF8, 0x4E, 0x96, 0x82, 0xDA, 0xE8, 0x98, 0x87, 0x0D, 0x37, 0xCD, 0xD1, 0x3E, 0x31,
+ 0x15, 0x72, 0x87, 0x3B, 0x67, 0xAF, 0x5D, 0x0B, 0x88, 0xFF, 0x44, 0xC1, 0xAB, 0xD1, 0x1E, 0x5F,
+ 0xE6, 0x8B, 0xAD, 0x0F, 0x95, 0xFC, 0x9F, 0x8F, 0x91, 0xED, 0x36, 0xE2, 0xD6, 0x2E, 0xC3, 0x2D,
+ 0x9E, 0x80, 0x6A, 0x78, 0x4A, 0xCA, 0x04, 0xCD, 0x64, 0x73, 0x7A, 0x81, 0x2D, 0x45, 0x53, 0xC8,
+ 0xED, 0x68, 0x74, 0x36, 0x85, 0x83, 0xD9, 0x6F, 0x8C, 0xAF, 0xEC, 0xE5, 0xC1, 0xF1, 0x65, 0x0C,
+ 0x45, 0xB4, 0xE7, 0xD1, 0xF8, 0x3C, 0xAA, 0xF3, 0x1E, 0xC7, 0x99, 0x78, 0x13, 0xC9, 0x55, 0x2B,
+ 0xA8, 0x5C, 0x24, 0xE2, 0xDF, 0x43, 0x46, 0x09, 0xAD, 0xAB, 0x1D, 0xED, 0xAA, 0xE0, 0xE6, 0x09,
+ 0xE2, 0x52, 0xE0, 0x5E, 0x78, 0xF8, 0x26, 0x88, 0x66, 0xB9, 0x98, 0x68, 0x52, 0x7A, 0xB4, 0xDF,
+ 0x34, 0xAA, 0xF6, 0x1A, 0x4C, 0x3D, 0x36, 0x8D, 0xB7, 0x05, 0x5B, 0x0B, 0x00, 0xF8, 0x3B, 0xDD,
+ 0x95, 0xB7, 0x47, 0x3A, 0xB0, 0x5A, 0x0A, 0xA8, 0x85, 0x17, 0xCB, 0x4E, 0x92, 0x47, 0x72, 0x92,
+ 0x73, 0x6A, 0xAB, 0xB5, 0x7D, 0x99, 0xBC, 0x8B, 0xAC, 0x1B, 0xE8, 0x1A, 0xE6, 0x32, 0x11, 0x79,
+ 0x2C, 0x6B, 0x88, 0x56, 0x70, 0x41, 0xED, 0xC3, 0x7E, 0x0A, 0xA8, 0xDF, 0xCA, 0xA8, 0xD4, 0x3E,
+ 0x1A, 0xE0, 0x9E, 0x6D, 0x7C, 0xBD, 0x32, 0xB1, 0x7F, 0x7D, 0x32, 0x18, 0x4D, 0x18, 0x5E, 0xF3,
+ 0x19, 0x30, 0xCA, 0x8C, 0x66, 0xB5, 0x77, 0x57, 0x5B, 0x98, 0x8F, 0x6D, 0x6B, 0x2D, 0x8D, 0xC4,
+ 0x0B, 0x76, 0xE0, 0x37, 0x42, 0x02, 0xC4, 0x61, 0xFE, 0x43, 0x5F, 0x41, 0xA7, 0x40, 0x64, 0x45,
+ 0xD6, 0x09, 0x99, 0x3F, 0x95, 0x73, 0x0D, 0x9F, 0xC4, 0xBE, 0x22, 0x2A, 0xE5, 0x4C, 0xAD, 0x32,
+ 0xC2, 0xF3, 0x49, 0xC4, 0xCF, 0x9C, 0xD1, 0x63, 0x3E, 0xBA, 0xD3, 0x9B, 0x24, 0x2F, 0x52, 0xF3,
+ 0xBA, 0x21, 0x2E, 0xEC, 0xDF, 0x8D, 0xAD, 0x3F, 0xF3, 0xE1, 0x23, 0x8C, 0x0D, 0x76, 0xDD, 0xCB,
+ 0x36, 0xB9, 0x7A, 0x13, 0x78, 0xB2, 0x6D, 0xDB, 0x16, 0xAD, 0x2A, 0x94, 0xAC, 0xF9, 0x86, 0x8B,
+ 0x2D, 0x75, 0x33, 0x86, 0x43, 0x18, 0xCF, 0x65, 0x4F, 0x08, 0x22, 0x88, 0x6E, 0x38, 0xBF, 0xF7,
+ 0x12, 0x3F, 0x8A, 0xC3, 0x49, 0xA0, 0xC6, 0x03, 0xAB, 0x1C, 0xD5, 0x3D, 0xA2, 0x43, 0xFF, 0x93,
+ 0xD4, 0x80, 0xDA, 0xDC, 0x77, 0x6D, 0xF8, 0xE1, 0xD3, 0x88, 0xA4, 0xCF, 0x82, 0xE0, 0x08, 0xB2,
+ 0x6E, 0x98, 0xBA, 0x6C, 0x0A, 0x84, 0xA0, 0x94, 0x51, 0xFE, 0x17, 0x96, 0xF1, 0xBC, 0xD0, 0xFB,
+ 0x6B, 0x50, 0x13, 0xA6, 0x8E, 0x42, 0xFA, 0x01, 0x8C, 0xF4, 0x04, 0x02, 0xB1, 0xA8, 0x53, 0x5D,
+ 0x9B, 0x15, 0x48, 0xC3, 0x81, 0xCB, 0xAF, 0x4B, 0x4E, 0x61, 0xB6, 0x86, 0x5C, 0xB1, 0x83, 0x44,
+ 0x5C, 0xB9, 0x3F, 0x31, 0x84, 0xEF, 0x75, 0x20, 0x66, 0x4C, 0x77, 0x66, 0x73, 0x04, 0x45, 0xB8,
+ 0xE7, 0xBD, 0x14, 0xF9, 0x93, 0xC7, 0x17, 0x60, 0xE5, 0x63, 0xAE, 0x6A, 0xD6, 0x99, 0xCD, 0x10,
+ 0x4F, 0x6B, 0xC1, 0x44, 0x63, 0x37, 0x79, 0x9C, 0x9C, 0xAA, 0xBC, 0x64, 0x19, 0x61, 0xB5, 0xC1,
+ 0x52, 0x09, 0x6E, 0x6B, 0x6B, 0x90, 0x8B, 0xA6, 0x23, 0xDC, 0xE4, 0xE1, 0xB4, 0x82, 0x47, 0x11,
+ 0x86, 0x9B, 0x9F, 0xE0, 0x24, 0xC0, 0x19, 0xAE, 0x7D, 0x9A, 0x8C, 0x49, 0x6C, 0x42, 0x6D, 0x4E,
+ 0x1F, 0xC7, 0x66, 0x20, 0x19, 0xCA, 0xA0, 0xF0, 0x44, 0x1A, 0x61, 0x1E, 0x67, 0x58, 0x4B, 0xA4,
+ 0x15, 0x8F, 0x26, 0x2C, 0xAC, 0xE8, 0xBA, 0x1D, 0x33, 0x77, 0x22, 0x83, 0xBB, 0xE1, 0x18, 0xBD,
+ 0x45, 0x1A, 0xB4, 0x9F, 0x4F, 0x1F, 0x80, 0xE8, 0x99, 0x14, 0xB2, 0x1C, 0x1E, 0x4E, 0xBB, 0x04,
+ 0xD6, 0x57, 0x50, 0x6F, 0x79, 0x60, 0xAA, 0xC1, 0xFD, 0x5D, 0xC7, 0x72, 0xA7, 0xBC, 0xD0, 0x29,
+ 0x29, 0x32, 0xD9, 0xDF, 0x9D, 0xF4, 0xC6, 0xF6, 0x54, 0x67, 0xF4, 0x16, 0x3C, 0xB7, 0xA9, 0x06,
+ 0x9D, 0xDC, 0xD9, 0x69, 0x4C, 0xD7, 0xC2, 0x8B, 0xF7, 0x7E, 0xAD, 0x7E, 0xD8, 0xC7, 0x23, 0x90,
+ 0x1F, 0xD6, 0xC4, 0xD3, 0xBB, 0xD4, 0x57, 0x35, 0xF6, 0xD3, 0x52, 0x32, 0x18, 0x20, 0xEC, 0x33,
+ 0x97, 0x01, 0xB5, 0x91, 0x7C, 0xCF, 0xB4, 0x6B, 0x55, 0x0C, 0x5C, 0x73, 0xE9, 0x8D, 0x9E, 0xDD,
+ 0xCF, 0xF8, 0xDF, 0xB8, 0x21, 0x13, 0x62, 0x2B, 0x66, 0x6E, 0x76, 0x03, 0x04, 0x75, 0xAA, 0x56,
+ 0xDF, 0x91, 0x5F, 0x26, 0x9B, 0xF9, 0x72, 0x25, 0x81, 0x63, 0x5B, 0xFE, 0xE4, 0x2A, 0x8E, 0x14,
+ 0x03, 0xFD, 0x8D, 0x23, 0x35, 0x82, 0x64, 0x70, 0x30, 0x91, 0x3F, 0xBB, 0x19, 0x2C, 0x04, 0x9E,
+ 0x44, 0xDC, 0x79, 0x9A, 0x7B, 0x69, 0x52, 0x08, 0xC3, 0x9E, 0x2A, 0xB9, 0x02, 0xD4, 0x19, 0xF2,
+ 0x3A, 0x4A, 0x4C, 0x47, 0x08, 0x38, 0x4B, 0x2E, 0x75, 0xF8, 0x86, 0x7C, 0x09, 0x72, 0xEC, 0xB2,
+ 0xAC, 0x9C, 0xEC, 0x42, 0x5C, 0x61, 0x7F, 0xD8, 0x24, 0x05, 0x88, 0x55, 0x3D, 0xB7, 0x79, 0x90,
+ 0x73, 0x7D, 0x0A, 0x10, 0xF5, 0xB3, 0x5C, 0xC8, 0x8D, 0x5E, 0x59, 0x51, 0xD2, 0xDB, 0x4E, 0x5D,
+ 0x4B, 0x39, 0x16, 0x14, 0xF2, 0xA2, 0x75, 0x28, 0x66, 0x45, 0xBF, 0x73, 0x60, 0xD3, 0xFD, 0x53,
+ 0xDA, 0x8D, 0x5C, 0x94, 0x2E, 0x91, 0x14, 0xE2, 0xAA, 0xEF, 0x93, 0x82, 0x68, 0x0A, 0x69, 0x1F,
+ 0xE2, 0x10, 0x26, 0xEB, 0x69, 0xD6, 0x35, 0x9B, 0x62, 0x05, 0x97, 0x7D, 0x04, 0x6D, 0x6C, 0x22,
+ 0x3E, 0x7C, 0xAB, 0x13, 0xC0, 0xEF, 0x4C, 0xE1, 0x96, 0x5B, 0xB7, 0xA3, 0x80, 0xC2, 0x89, 0x1A,
+ 0x2F, 0x47, 0x0B, 0xD9, 0x76, 0x6C, 0xD3, 0x03, 0x08, 0xA3, 0x8E, 0x9B, 0xAE, 0xA1, 0x55, 0x73,
+ 0x7B, 0x9F, 0xAE, 0x40, 0xB6, 0x0C, 0x0A, 0x8A, 0x83, 0x7A, 0x88, 0x6B, 0x3E, 0xD7, 0x98, 0x7F,
+ 0x43, 0x40, 0x01, 0xE4, 0x3A, 0xFF, 0x26, 0xEC, 0x91, 0x68, 0x71, 0xD8, 0x84, 0x18, 0xC1, 0xD5,
+ 0xAB, 0xA2, 0xBB, 0xCC, 0xEA, 0x43, 0x79, 0x73, 0x97, 0x4C, 0x9B, 0x03, 0xD0, 0x10, 0x7C, 0x09,
+ 0x84, 0x32, 0x04, 0x0A, 0x35, 0xA6, 0x29, 0xAB, 0x6E, 0x26, 0x9A, 0xCF, 0x49, 0x8F, 0x15, 0xC2,
+ 0xAC, 0x56, 0xD6, 0x82, 0xB9, 0x3C, 0xD2, 0xDD, 0x68, 0xB7, 0x43, 0xBC, 0xBC, 0xFD, 0xA4, 0xC5,
+ 0xCE, 0x5C, 0xC0, 0xD3, 0x93, 0xD6, 0x40, 0xAF, 0xDA, 0x23, 0x55, 0x83, 0x3A, 0xE6, 0x6C, 0x64,
+ 0xA0, 0x37, 0xC0, 0x47, 0xBA, 0xAA, 0x62, 0x79, 0x56, 0x85, 0x55, 0xC1, 0xEA, 0x80, 0xD5, 0x3C,
+ 0xBB, 0x9F, 0x89, 0xEA, 0x45, 0xFC, 0x59, 0x6C, 0x26, 0xF0, 0x07, 0x72, 0x31, 0xCC, 0x5F, 0x8F,
+ 0xA5, 0x61, 0x20, 0x16, 0x55, 0x4D, 0x87, 0x72, 0x13, 0xE6, 0xA9, 0xB3, 0xAF, 0xBD, 0x42, 0x08,
+ 0x39, 0xD5, 0xCF, 0x81, 0xCA, 0x5E, 0xD0, 0xAB, 0x77, 0xB0, 0x05, 0x7E, 0x73, 0x87, 0xFE, 0xF4,
+ 0xA7, 0x7F, 0x00, 0xBE, 0xF9, 0x67, 0x83, 0x64, 0x61, 0x19, 0x4F, 0x23, 0x21, 0xD9, 0x37, 0xB7,
+ 0x54, 0xD3, 0x2F, 0x0C, 0x39, 0xD2, 0xA4, 0x78, 0xFD, 0x3C, 0x9F, 0x5C, 0xC5, 0x16, 0x55, 0x9B,
+ 0xBB, 0x96, 0x72, 0x13, 0x1D, 0xCC, 0xAF, 0xB4, 0xC1, 0xEB, 0x7D, 0xF9, 0xA1, 0x37, 0x93, 0x13,
+ 0xC3, 0xDB, 0x58, 0xF8, 0x7C, 0xFB, 0x2E, 0x91, 0x7B, 0x6D, 0x21, 0xE2, 0xCE, 0xB1, 0xAF, 0x8A,
+ 0x55, 0x25, 0x5A, 0x08, 0x35, 0xAD, 0xF6, 0x1E, 0x54, 0x56, 0xB9, 0x52, 0xA8, 0x9F, 0x9F, 0x06,
+ 0x9B, 0x30, 0x7B, 0x5F, 0x25, 0x13, 0x7C, 0xD4, 0xA7, 0x56, 0xE3, 0x48, 0x55, 0x40, 0xB8, 0x3E,
+ 0x11, 0x7B, 0x81, 0x89, 0x2E, 0x40, 0x76, 0x1D, 0x4C, 0x30, 0xCF, 0xBE, 0xA6, 0x66, 0x25, 0x69,
+ 0x9B, 0xE7, 0x85, 0x36, 0x71, 0x45, 0xD4, 0x54, 0x24, 0x3B, 0x2D, 0x16, 0x9B, 0xD6, 0xE6, 0x91,
+ 0x13, 0x53, 0x6E, 0x56, 0x21, 0xB6, 0x3C, 0x12, 0x23, 0x20, 0xC9, 0xB7, 0xDD, 0xF1, 0x04, 0x1C,
+ 0x49, 0x58, 0x44, 0x97, 0x4A, 0x21, 0x36, 0x0C, 0x7D, 0xDE, 0x3F, 0x2F, 0xE6, 0x8E, 0x05, 0x42,
+ 0x28, 0x2A, 0xA5, 0x0F, 0xF1, 0x31, 0x7B, 0x9A, 0x1B, 0x36, 0x40, 0x48, 0xC3, 0xC4, 0x59, 0x8F,
+ 0xFF, 0x82, 0x2F, 0xE2, 0x75, 0xEF, 0x54, 0x39, 0x31, 0xC8, 0x5F, 0xD2, 0xDA, 0x74, 0x50, 0x47,
+ 0x45, 0x16, 0xC9, 0xF8, 0x2B, 0xAE, 0x07, 0x6B, 0x18, 0xF6, 0x22, 0x1F, 0xF4, 0x39, 0x6D, 0x13,
+ 0x83, 0x0C, 0xCB, 0xF3, 0x12, 0x1B, 0xB4, 0x27, 0xB6, 0xB1, 0x67, 0x79, 0x29, 0xD7, 0xAF, 0x00,
+ 0xF1, 0xE4, 0x14, 0xB4, 0xA1, 0x95, 0x54, 0x47, 0x19, 0x7B, 0xB0, 0xF6, 0x81, 0x42, 0x94, 0xE4,
+ 0xD3, 0xA3, 0x9D, 0x74, 0xE5, 0x93, 0xEE, 0x02, 0x5A, 0x44, 0x9F, 0x25, 0xCB, 0xB2, 0x8E, 0xEE,
+ 0xD8, 0xE7, 0x02, 0x5D, 0x83, 0x94, 0x68, 0xDD, 0xA4, 0x3E, 0x6A, 0x86, 0xE6, 0x2E, 0xFC, 0x1C,
+ 0xC5, 0xAE, 0x91, 0x7D, 0x34, 0x12, 0xD5, 0x10, 0xD8, 0x4E, 0x34, 0x18, 0x6B, 0x72, 0x0D, 0x8F,
+ 0x28, 0x17, 0xE2, 0x81, 0xD6, 0xE4, 0x70, 0xBB, 0x20, 0x0C, 0xE9, 0xA9, 0x65, 0xEC, 0xDC, 0x80,
+ 0x41, 0x13, 0xB4, 0x53, 0x67, 0x1F, 0xF4, 0xB0, 0xA6, 0x4D, 0xB1, 0x43, 0x29, 0x00, 0xAD, 0x51,
+ 0xE8, 0x4C, 0x6A, 0x62, 0x8B, 0xB9, 0xEE, 0x05, 0x53, 0xE5, 0xBE, 0xCC, 0xDD, 0x08, 0xA9, 0x89,
+ 0x84, 0x04, 0xF3, 0xC4, 0xA9, 0x4E, 0x40, 0x18, 0xE4, 0xF8, 0xEC, 0xB0, 0xF4, 0x7B, 0x69, 0x6D,
+ 0xD1, 0xB3, 0x5F, 0x53, 0x85, 0x14, 0xF5, 0xC9, 0xBE, 0x9D, 0x8E, 0x7B, 0x9A, 0x8C, 0x77, 0xA2,
+ 0xD6, 0x97, 0xA3, 0x35, 0x48, 0x47, 0x93, 0x5C, 0x2D, 0xB7, 0xBA, 0x80, 0xC0, 0xB5, 0xD5, 0x24,
+ 0x40, 0xA8, 0xB6, 0xA6, 0x4E, 0x4C, 0x4C, 0xE8, 0x60, 0xE4, 0xF7, 0xDC, 0x24, 0xD9, 0x0F, 0x3C,
+ 0xC7, 0x86, 0xC9, 0xEB, 0xEA, 0xD9, 0xDC, 0x12, 0x50, 0x30, 0xB2, 0x7D, 0x28, 0x2E, 0x9D, 0x7C,
+ 0xC3, 0x72, 0x6D, 0x22, 0x40, 0x81, 0x1A, 0x5B, 0xED, 0x16, 0xDD, 0x6D, 0x15, 0x83, 0xD1, 0xC6,
+ 0x35, 0xBD, 0x11, 0x1F, 0x0F, 0x60, 0x89, 0x22, 0xCD, 0x63, 0x39, 0x42, 0x2B, 0x05, 0xE5, 0x40,
+ 0x89, 0xC3, 0x64, 0xBC, 0xB2, 0x7B, 0x1E, 0xBF, 0x37, 0x68, 0x0A, 0x82, 0xD8, 0x71, 0x10, 0xE7,
+ 0xD3, 0xEB, 0xF9, 0x24, 0xBD, 0x5F, 0x62, 0x7F, 0xAA, 0xF0, 0x5B, 0xE5, 0x75, 0xCB, 0x84, 0xA4,
+ 0x66, 0x78, 0x80, 0xE4, 0xD5, 0x04, 0x02, 0xE4, 0xE6, 0x79, 0x67, 0xC2, 0x79, 0x92, 0x3C, 0x32,
+ 0x8C, 0xB6, 0x1D, 0x21, 0xDB, 0xB8, 0x91, 0x88, 0x76, 0xBD, 0x20, 0x30, 0x8A, 0x87, 0x49, 0x7F,
+ 0x54, 0x32, 0x95, 0x3D, 0x1F, 0x44, 0xDE, 0xA0, 0xE6, 0x4D, 0x00, 0xE9, 0x1F, 0x12, 0x49, 0x2A,
+ 0x73, 0x58, 0x55, 0xB2, 0x22, 0x36, 0x46, 0x37, 0x6E, 0x89, 0xCF, 0x8E, 0x17, 0x91, 0x8C, 0xD3,
+ 0xAE, 0x40, 0x75, 0x66, 0xAA, 0xAD, 0x37, 0x77, 0x00, 0x9B, 0x56, 0x98, 0x52, 0x1F, 0x41, 0x01,
+ 0x60, 0x6A, 0x3D, 0xB1, 0x07, 0x5F, 0x57, 0x72, 0xE6, 0x69, 0x0B, 0x93, 0xE7, 0x1B, 0xB1, 0x54,
+ 0x26, 0xB0, 0x52, 0xA1, 0xB1, 0x0A, 0x1A, 0x59, 0xBD, 0xA5, 0x70, 0x98, 0x21, 0xCD, 0x09, 0x35,
+ 0x1A, 0x29, 0x03, 0x10, 0xAC, 0x40, 0x90, 0x47, 0xFB, 0xA3, 0x07, 0xB4, 0x43, 0xCC, 0x37, 0x14,
+ 0xC9, 0xA8, 0xD4, 0x5A, 0xD0, 0x70, 0xF9, 0x85, 0xAC, 0xF3, 0xFA, 0xA5, 0x5A, 0x9A, 0xF1, 0xC3,
+ 0x54, 0xDC, 0xE1, 0x00, 0x2D, 0xD6, 0xCF, 0x7A, 0x02, 0x87, 0x8B, 0x49, 0x6C, 0x19, 0xF4, 0x68,
+ 0xDE, 0x5F, 0x11, 0x91, 0xF1, 0x7A, 0xF2, 0x34, 0xA5, 0xDF, 0x42, 0x01, 0x2E, 0x2F, 0x12, 0x91,
+ 0xA9, 0x5E, 0x23, 0x6E, 0xFC, 0x1C, 0x96, 0xFA, 0xE8, 0xBB, 0x4A, 0x42, 0x7F, 0xB7, 0xEE, 0x12,
+ 0x3C, 0x25, 0xDB, 0x7B, 0x95, 0xED, 0xF6, 0xAB, 0xBC, 0x59, 0xE4, 0xF3, 0x15, 0x71, 0xAB, 0xAB,
+ 0x1B, 0x27, 0x6B, 0x48, 0x44, 0x52, 0xC3, 0xA3, 0xB0, 0xC1, 0x49, 0xCE, 0x74, 0xD9, 0x9D, 0xC8,
+ 0xAC, 0x71, 0xB5, 0xB9, 0x1B, 0xA6, 0xD3, 0xF9, 0x84, 0x30, 0xAE, 0x9E, 0x69, 0x31, 0xB8, 0xB4,
+ 0x64, 0xE8, 0xD9, 0x47, 0xBD, 0x63, 0xB5, 0x25, 0x30, 0x1A, 0xD7, 0xB2, 0xC0, 0xBD, 0x75, 0x30,
+ 0x55, 0x02, 0x5B, 0xC6, 0xE6, 0x63, 0x69, 0x65, 0xAF, 0xE7, 0x7B, 0xAB, 0x5D, 0xA6, 0xA5, 0xC4,
+ 0xAF, 0xDE, 0xAC, 0x67, 0x1E, 0x7F, 0x73, 0x55, 0x2C, 0x33, 0x25, 0x83, 0x24, 0x3F, 0xB0, 0x48,
+ 0xFC, 0x08, 0xB9, 0x60, 0xBB, 0xFB, 0x3D, 0xFD, 0xA3, 0xF6, 0xF2, 0x1B, 0x89, 0x82, 0x87, 0xD1,
+ 0x10, 0xE5, 0xBD, 0xEF, 0x16, 0xA7, 0x3F, 0x15, 0x32, 0x11, 0x50, 0xB9, 0x7D, 0x77, 0x15, 0x0F,
+ 0xBA, 0xFE, 0x76, 0x0A, 0x4F, 0xF2, 0xA0, 0xFB, 0x2D, 0xF1, 0xCE, 0x5E, 0xE7, 0x50, 0x6A, 0xA0,
+ 0xB2, 0xB4, 0xEE, 0x2B, 0xD5, 0x3B, 0x03, 0x07, 0xB0, 0x40, 0x4A, 0x26, 0xF4, 0x3E, 0x1F, 0xC4,
+ 0x58, 0x80, 0x8A, 0x3B, 0x00, 0x52, 0x2B, 0x53, 0xBF, 0xD4, 0x8F, 0xEE, 0x6D, 0xA4, 0x0D, 0xF7,
+ 0x82, 0xF8, 0x53, 0xDA, 0xF6, 0x53, 0xAF, 0xF8, 0xD2, 0xD8, 0xFB, 0x1F, 0x2D, 0x98, 0x87, 0xDA,
+ 0x19, 0xAC, 0x48, 0x6B, 0xEA, 0xDE, 0x08, 0xA6, 0x13, 0x37, 0x1B, 0x2C, 0x15, 0x60, 0xB2, 0xDB,
+ 0x28, 0x0E, 0x2E, 0xA3, 0x4A, 0xB1, 0xF2, 0x5C, 0x48, 0x69, 0x46, 0xFA, 0x08, 0x9F, 0xE9, 0x65,
+ 0x2F, 0x3A, 0x29, 0xB0, 0x88, 0xB5, 0x13, 0x44, 0x41, 0x92, 0x30, 0x74, 0x9C, 0x9C, 0xD8, 0xC8,
+ 0xB1, 0x59, 0x42, 0x67, 0xAC, 0xC8, 0x0D, 0xFF, 0x8E, 0x52, 0x4C, 0xED, 0x86, 0xFF, 0x4E, 0x45,
+ 0xBE, 0xC4, 0xAF, 0x32, 0xE4, 0xBC, 0x41, 0xC5, 0xDC, 0x3F, 0x71, 0x8C, 0x2C, 0xAD, 0x78, 0x7E,
+ 0x79, 0x47, 0xB2, 0x02, 0xA6, 0x11, 0xDE, 0x0F, 0x5D, 0xAD, 0xFE, 0x8D, 0x6B, 0x09, 0xEA, 0x28,
+ 0x4B, 0xB1, 0x9F, 0xD3, 0x09, 0x4A, 0x77, 0x52, 0x58, 0xA2, 0x31, 0xC1, 0x48, 0xF1, 0x35, 0x48,
+ 0x46, 0x93, 0xDB, 0x22, 0xFD, 0x06, 0x49, 0xEB, 0x22, 0xE8, 0xB3, 0x9C, 0xCF, 0x40, 0x8B, 0xC7,
+ 0x35, 0x07, 0xBD, 0x2C, 0x21, 0xFB, 0x15, 0x53, 0x38, 0x0B, 0x61, 0x10, 0x75, 0x11, 0x17, 0x1F,
+ 0xE1, 0x76, 0x10, 0x53, 0x66, 0x2E, 0x36, 0x65, 0xF6, 0x62, 0x19, 0xAC, 0x68, 0x63, 0x1D, 0x17,
+ 0x6C, 0x49, 0x6C, 0xA8, 0x40, 0x49, 0xFC, 0xBA, 0x63, 0x25, 0x5E, 0x79, 0x07, 0x10, 0xC3, 0x3C,
+ 0xC5, 0x81, 0x14, 0xBB, 0xCD, 0xC3, 0x63, 0x36, 0x9F, 0xB9, 0x68, 0x54, 0x8D, 0x31, 0x66, 0xC8,
+ 0xF7, 0x4A, 0xA0, 0x68, 0x8A, 0xCC, 0xE2, 0xB8, 0x50, 0x88, 0x7B, 0xFF, 0x38, 0xE0, 0x8B, 0x90,
+ 0x0C, 0x98, 0xF1, 0xC5, 0x5F, 0xFA, 0x2A, 0x37, 0x6A, 0x3C, 0x39, 0xC0, 0xF1, 0x29, 0x0F, 0xC1,
+ 0xA6, 0xCE, 0xCC, 0x98, 0xD7, 0x9C, 0xAE, 0x71, 0xAB, 0xFE, 0xA1, 0xC6, 0x0E, 0xF7, 0xE7, 0x60,
+ 0x9B, 0x63, 0x50, 0x00, 0x8B, 0x1A, 0xC4, 0xF2, 0xDB, 0xFF, 0xCB, 0xC8, 0xDC, 0x23, 0x49, 0xA9,
+ 0xFB, 0xF3, 0x1A, 0x09, 0xA5, 0x27, 0xD5, 0x18, 0x4C, 0x84, 0x2E, 0x6E, 0x56, 0x39, 0x3F, 0xD3,
+ 0x08, 0xDE, 0x76, 0x90, 0xC1, 0x43, 0x33, 0x32, 0xF8, 0x76, 0x59, 0x48, 0x14, 0xCD, 0x2E, 0x19,
+ 0xDF, 0x8B, 0x72, 0xAF, 0xB2, 0x2F, 0xD9, 0x5C, 0x5C, 0x87, 0x8C, 0x3A, 0x66, 0x86, 0xBD, 0xEA,
+ 0x82, 0xFC, 0x36, 0xFA, 0x05, 0xE8, 0xE0, 0x07, 0x53, 0xD8, 0x68, 0xD4, 0x86, 0x3A, 0xA4, 0x64,
+ 0xD5, 0x13, 0x16, 0x3F, 0x9B, 0x1D, 0x60, 0x3A, 0x46, 0xAF, 0x99, 0x89, 0xBF, 0x1A, 0xD2, 0x45,
+ 0xF8, 0xD7, 0x86, 0x6E, 0x0C, 0x3A, 0xCD, 0x69, 0x05, 0x1A, 0x07, 0x7D, 0x52, 0x96, 0xE1, 0xB6,
+ 0x84, 0xE9, 0x63, 0x5B, 0x3D, 0xEE, 0xF6, 0xDC, 0x8A, 0xE2, 0xDC, 0xFA, 0xDD, 0xD6, 0x5F, 0xA3,
+ 0x17, 0xD3, 0xE6, 0x3C, 0xC6, 0xEE, 0x7C, 0x84, 0x6F, 0x82, 0x9A, 0x01, 0xF7, 0xC4, 0x71, 0x69,
+ 0x0B, 0x56, 0xEB, 0x48, 0xB3, 0x09, 0x23, 0x05, 0x26, 0x47, 0xD5, 0x8B, 0x2D, 0x8B, 0x91, 0x73,
+ 0xF8, 0x14, 0xAC, 0xE6, 0xEE, 0xB3, 0x40, 0x6D, 0x43, 0x70, 0x18, 0x8A, 0xA4, 0xA9, 0x9A, 0x66,
+ 0x77, 0x85, 0x7E, 0x0F, 0x48, 0x24, 0x0B, 0xF1, 0x15, 0xEF, 0xBB, 0x25, 0xB8, 0x44, 0x43, 0x8E,
+ 0x91, 0x29, 0x74, 0x43, 0xEC, 0xF9, 0x31, 0x48, 0x97, 0xFC, 0xDF, 0x5A, 0xA9, 0x3B, 0x50, 0xAB,
+ 0x9E, 0xE5, 0x93, 0xF3, 0x39, 0xD8, 0x4E, 0xAB, 0x7F, 0xAD, 0x2E, 0x83, 0x7F, 0x85, 0x46, 0x24,
+ 0xE7, 0x76, 0xF4, 0x64, 0xFF, 0x6A, 0xDA, 0x79, 0x2F, 0x49, 0x16, 0xD8, 0xF1, 0x54, 0xD6, 0x37,
+ 0xCB, 0x50, 0x13, 0xA0, 0xB2, 0x4E, 0xDC, 0x1E, 0xF0, 0x59, 0xB4, 0x4F, 0xB4, 0x9B, 0x6D, 0x17,
+ 0xA1, 0x4C, 0x25, 0x24, 0x71, 0x3C, 0x06, 0x6D, 0xEE, 0x35, 0x8D, 0xA7, 0x6E, 0x1C, 0x59, 0x17,
+ 0x7A, 0xA5, 0xB4, 0x14, 0x9F, 0x12, 0x8D, 0xE0, 0xC1, 0xEE, 0xAA, 0xE5, 0xF6, 0x9D, 0x2F, 0x81,
+ 0x75, 0x9F, 0xCC, 0xE4, 0xE1, 0x87, 0x85, 0x65, 0x86, 0x08, 0xD4, 0xC2, 0xC5, 0xE1, 0x87, 0x4C,
+ 0x76, 0x25, 0xFC, 0x9F, 0x70, 0x08, 0x5C, 0x69, 0xB2, 0xEF, 0xDD, 0x2E, 0x41, 0xAF, 0x8E, 0x8A,
+ 0x51, 0x0F, 0x1E, 0x7D, 0xD2, 0x24, 0x8C, 0x70, 0x4D, 0xB9, 0x22, 0x8B, 0x39, 0x51, 0xEF, 0xCB,
+ 0x19, 0x16, 0xDC, 0x38, 0xF2, 0x95, 0xE6, 0x39, 0xD0, 0x2A, 0x59, 0x2D, 0xD0, 0xFA, 0xC3, 0x7E,
+ 0xC7, 0x43, 0xF1, 0x74, 0x11, 0x1D, 0x4D, 0xA2, 0x35, 0x35, 0xCA, 0x97, 0x05, 0x02, 0x2B, 0xA2,
+ 0x82, 0x23, 0x36, 0xEF, 0xFC, 0xEC, 0xA9, 0x0A, 0x1B, 0xCA, 0x55, 0x77, 0x11, 0xAC, 0x3F, 0xCC,
+ 0xA7, 0xF5, 0x12, 0x1D, 0x7C, 0x4C, 0xA3, 0xF9, 0x14, 0x85, 0x1D, 0x8E, 0x5E, 0xD3, 0x49, 0x52,
+ 0x9D, 0x37, 0x6D, 0x8E, 0x35, 0x8C, 0xA9, 0xFE, 0x37, 0x23, 0x56, 0xB8, 0x05, 0x65, 0x54, 0x07,
+ 0xF2, 0xC6, 0xED, 0x70, 0x10, 0xA1, 0x97, 0x77, 0xD4, 0xD7, 0x77, 0x50, 0x50, 0x16, 0x8C, 0x6E,
+ 0x45, 0xED, 0x9D, 0xB4, 0xF3, 0xE5, 0x82, 0x37, 0x99, 0x67, 0x53, 0x68, 0xC6, 0x22, 0x33, 0xFD,
+ 0x0C, 0xAD, 0x18, 0x24, 0x76, 0x06, 0x26, 0x5D, 0x9B, 0x14, 0xF6, 0xCC, 0xB8, 0x48, 0x7E, 0x85,
+ 0x15, 0x35, 0xC7, 0x16, 0x1F, 0xE5, 0x3A, 0x41, 0x9B, 0xB6, 0xA8, 0x64, 0x48, 0x57, 0x32, 0x60,
+ 0x91, 0xE5, 0xC1, 0x41, 0xEC, 0x4C, 0x97, 0xEF, 0xD4, 0xF8, 0x84, 0x41, 0x61, 0x47, 0x17, 0x08,
+ 0x96, 0xC3, 0xBB, 0xF3, 0xB7, 0x2C, 0xF6, 0xB9, 0xA1, 0x89, 0x78, 0x79, 0x73, 0x89, 0x4C, 0x07,
+ 0x34, 0x4E, 0x75, 0x88, 0xA8, 0x18, 0x54, 0x3C, 0xF3, 0x8F, 0xED, 0x04, 0xE7, 0x86, 0xD7, 0x8B,
+ 0xED, 0x34, 0x6B, 0xCF, 0x29, 0x1F, 0x7A, 0x54, 0x7E, 0x8A, 0xE1, 0x81, 0x4C, 0xEE, 0xEA, 0x23,
+ 0x7B, 0x3F, 0x16, 0x24, 0x71, 0x9D, 0x97, 0xF8, 0x5B, 0xD0, 0x73, 0x86, 0xFA, 0x21, 0x27, 0x3E,
+ 0x73, 0x1F, 0x0C, 0x36, 0x87, 0x56, 0x2F, 0x21, 0x10, 0x38, 0xFD, 0x14, 0xB4, 0x1E, 0xAB, 0x3B,
+ 0xC1, 0x54, 0xE2, 0xDB, 0xB5, 0x76, 0xF2, 0x61, 0x14, 0xBA, 0x19, 0x23, 0x7C, 0x53, 0x30, 0xC8,
+ 0x0C, 0x62, 0x61, 0x93, 0x41, 0x83, 0x1C, 0xA7, 0x2D, 0x15, 0xD5, 0x67, 0x95, 0xEE, 0xBD, 0xDB,
+ 0x27, 0x31, 0x16, 0x81, 0xC9, 0x3A, 0x78, 0xFC, 0xB2, 0x26, 0x10, 0x3F, 0xCA, 0x89, 0x11, 0xB0,
+ 0x03, 0xE1, 0xB9, 0x7E, 0xDE, 0x0C, 0x34, 0xD1, 0xAA, 0x72, 0x34, 0x90, 0xD8, 0x62, 0x74, 0xAE,
+ 0xA7, 0x63, 0x96, 0xCD, 0xBA, 0x58, 0x60, 0x6E, 0xD1, 0x6C, 0x6B, 0xAE, 0xB2, 0x15, 0x7E, 0x12,
+ 0x1A, 0x29, 0x03, 0x2E, 0x28, 0x98, 0x59, 0x52, 0xE2, 0x94, 0xAC, 0x18, 0x00, 0x1B, 0x2D, 0xCC,
+ 0xE0, 0xDC, 0x71, 0xA0, 0x97, 0xAF, 0xA1, 0xD3, 0x9D, 0xA6, 0xEE, 0x62, 0xB4, 0x51, 0xBE, 0xE9,
+ 0xF0, 0x23, 0xBD, 0x5A, 0xED, 0x16, 0xEC, 0x01, 0x70, 0x8F, 0x39, 0xF2, 0xF9, 0xD8, 0x6D, 0x54,
+ 0x6A, 0xD3, 0x70, 0x7B, 0xE4, 0x6E, 0x1D, 0x40, 0xF4, 0x4A, 0x04, 0xA6, 0x3A, 0x2B, 0x76, 0x62,
+ 0x7F, 0x04, 0xC2, 0x0B, 0xB0, 0xAC, 0xB6, 0xE1, 0x85, 0x8A, 0xD5, 0x35, 0xCA, 0xDF, 0xDE, 0x8A,
+ 0x57, 0x34, 0x51, 0xD0, 0x44, 0xC0, 0xBB, 0x51, 0x16, 0x44, 0x3F, 0xC7, 0xC4, 0x10, 0x3B, 0x06,
+ 0xB2, 0xB7, 0xA1, 0xF4, 0x9C, 0x2F, 0xFA, 0xD3, 0x46, 0x51, 0xC3, 0x25, 0x9A, 0x94, 0xB8, 0x78,
+ 0xE3, 0x3B, 0x63, 0x64, 0x61, 0xF6, 0x1D, 0x4C, 0x9C, 0xFF, 0x68, 0x18, 0xCC, 0x51, 0xD0, 0xC3,
+ 0x0B, 0x67, 0x0D, 0xED, 0x78, 0xF4, 0xD7, 0x26, 0x41, 0x0C, 0xEE, 0xB7, 0x35, 0x72, 0xDA, 0x39,
+ 0x3D, 0x20, 0x35, 0xF0, 0xC8, 0xF2, 0x6A, 0x29, 0xE3, 0x03, 0x90, 0x80, 0xE7, 0x76, 0xBA, 0x78,
+ 0x5E, 0x5C, 0x9A, 0x35, 0x05, 0x9C, 0x2E, 0xB8, 0xA8, 0x86, 0x2F, 0xD3, 0xEA, 0x37, 0x7D, 0xED,
+ 0x66, 0xA8, 0x4E, 0xEF, 0xA3, 0xBF, 0x3F, 0x85, 0x21, 0x94, 0x59, 0x23, 0x3A, 0xB5, 0x42, 0x6D,
+ 0x95, 0x3D, 0x9A, 0xE2, 0x2A, 0x08, 0xC9, 0xD5, 0x6D, 0xC3, 0x6C, 0x09, 0x09, 0xAC, 0x48, 0x4A,
+ 0x7A, 0x46, 0xB7, 0x34, 0x03, 0xF0, 0x8A, 0x33, 0x3E, 0xAE, 0x27, 0xFD, 0x2D, 0xF8, 0xAB, 0xE4,
+ 0x82, 0x81, 0x93, 0x65, 0x4E, 0xC2, 0x0D, 0x6D, 0xD0, 0xEA, 0xDF, 0x8D, 0xA5, 0xD6, 0xA1, 0x45,
+ 0x7F, 0x08, 0xE1, 0x93, 0x7E, 0x87, 0x50, 0x84, 0xDE, 0x7D, 0x03, 0x9F, 0x3C, 0xD9, 0x81, 0x31,
+ 0x1B, 0x1E, 0xA1, 0x82, 0x17, 0x76, 0xE4, 0x3F, 0x45, 0xC9, 0x2E, 0x8E, 0x72, 0xE3, 0x43, 0xF1,
+ 0x84, 0xF2, 0xFC, 0x0B, 0x8E, 0x6E, 0xB4, 0x5F, 0x10, 0xF2, 0x3E, 0xC0, 0x7D, 0x57, 0xC2, 0x3E,
+ 0xE9, 0x15, 0x4F, 0xC8, 0x0B, 0x65, 0x53, 0xBB, 0xD9, 0x50, 0xA2, 0x5C, 0xCB, 0x11, 0x14, 0x77,
+ 0xDF, 0x2A, 0x18, 0x43, 0x3E, 0xE0, 0x1D, 0x30, 0x6E, 0xF3, 0xFE, 0xB7, 0x3D, 0x7B, 0x22, 0x7A,
+ 0x73, 0xF4, 0x62, 0xBA, 0x82, 0x51, 0x5D, 0x42, 0x0B, 0x27, 0x0E, 0x13, 0x27, 0xB4, 0xB5, 0xB4,
+ 0x29, 0xDA, 0x94, 0xB3, 0x99, 0x9B, 0x3B, 0x37, 0x6E, 0xB2, 0x28, 0x26, 0x52, 0xCF, 0x5C, 0xCB,
+ 0x74, 0x95, 0x30, 0x50, 0x48, 0xC9, 0xAD, 0xEE, 0x8B, 0xC6, 0x72, 0x55, 0xEC, 0x28, 0x14, 0x00,
+ 0x78, 0xC4, 0x42, 0x61, 0xBF, 0x96, 0x81, 0x06, 0xFA, 0x45, 0x4F, 0xC0, 0x1F, 0xC0, 0x4F, 0xCA,
+ 0xEE, 0xBC, 0xCC, 0xF5, 0xAA, 0xC4, 0x78, 0x0A, 0x16, 0xF5, 0xD2, 0x65, 0x6D, 0xCD, 0x74, 0x2D,
+ 0x87, 0x93, 0xBC, 0x51, 0x02, 0x68, 0xE0, 0x72, 0xE0, 0x5F, 0x98, 0x1E, 0x7D, 0x2B, 0x9F, 0xCD,
+ 0x1D, 0xC7, 0x20, 0x34, 0xF5, 0x95, 0x82, 0x7A, 0x04, 0x80, 0x35, 0x96, 0x88, 0xB8, 0x1C, 0x26,
+ 0x16, 0x62, 0xD9, 0x32, 0x91, 0xD0, 0x0F, 0x87, 0x23, 0x4E, 0x44, 0x25, 0x7C, 0x2A, 0xD4, 0x8E,
+ 0x43, 0x0B, 0xEC, 0xA4, 0xD0, 0x92, 0x46, 0xEE, 0xB1, 0xC3, 0xC4, 0x61, 0xE5, 0xA9, 0x90, 0x0D,
+ 0x03, 0x00, 0xBD, 0xA5, 0xEB, 0x81, 0xB0, 0x2B, 0xAB, 0xEF, 0x5F, 0x70, 0x6A, 0x80, 0x2F, 0xA1,
+ 0xDC, 0xB3, 0x47, 0x7F, 0xF4, 0x8A, 0x41, 0xB2, 0x94, 0xEA, 0x06, 0x91, 0x92, 0x1D, 0xEF, 0x4A,
+ 0xF1, 0x81, 0xAE, 0x8E, 0xA6, 0xE8, 0x7B, 0xC1, 0x46, 0xDD, 0x33, 0xBE, 0x14, 0x1C, 0x24, 0x27,
+ 0xD8, 0xE0, 0xE7, 0x69, 0x9E, 0xFC, 0x53, 0x7E, 0x40, 0x2C, 0x13, 0xA7, 0xD6, 0x5A, 0x82, 0xD6,
+ 0xFF, 0x09, 0xA8, 0x6B, 0xB1, 0x60, 0x82, 0x0A, 0xDD, 0x90, 0x1C, 0xE4, 0x6A, 0xA3, 0x18, 0xFB,
+ 0x66, 0xD4, 0x4F, 0x9B, 0x28, 0xB2, 0x5B, 0xE7, 0x73, 0xCA, 0x33, 0x2F, 0x75, 0x57, 0x9B, 0xEA,
+ 0x36, 0x03, 0xC4, 0x06, 0x22, 0x4D, 0xDE, 0x30, 0x57, 0x4C, 0x7C, 0x90, 0xE5, 0xCF, 0x88, 0x39,
+ 0xF5, 0x19, 0x18, 0x18, 0x2A, 0x1A, 0x16, 0x11, 0xD8, 0x49, 0xCF, 0x5A, 0x4A, 0x51, 0x1B, 0x78,
+ 0x1D, 0xF1, 0x65, 0xB2, 0x7C, 0xC7, 0xD4, 0xF1, 0xB1, 0x3D, 0xA3, 0x5C, 0x0A, 0xB5, 0x3E, 0x72,
+ 0x4B, 0xE3, 0x28, 0xEA, 0xC9, 0x73, 0x9F, 0x36, 0xC1, 0x50, 0x4F, 0x19, 0x33, 0x47, 0xAB, 0x46,
+ 0x71, 0x60, 0x0E, 0xE8, 0x1D, 0xD2, 0xDB, 0xD3, 0xD8, 0xF3, 0xA9, 0xD7, 0xE5, 0x25, 0x2B, 0xA2,
+ 0x75, 0x36, 0x77, 0x55, 0x00, 0x8E, 0x67, 0xF1, 0xF9, 0xDE, 0x38, 0x45, 0x24, 0x84, 0x01, 0x15,
+ 0xA6, 0xD2, 0x30, 0x91, 0x71, 0xE3, 0xA6, 0xA7, 0xF4, 0x52, 0x77, 0x76, 0x74, 0xC8, 0x43, 0x76,
+ 0x3E, 0xBF, 0x61, 0xB1, 0xBD, 0x1C, 0x68, 0x10, 0x8B, 0x69, 0xCD, 0x90, 0x1C, 0x2D, 0x76, 0xD4,
+ 0x4B, 0x3F, 0xF4, 0x3F, 0xC0, 0x8F, 0xB2, 0x13, 0x2D, 0x07, 0xC0, 0x9A, 0x03, 0x74, 0x11, 0x0A,
+ 0xAA, 0x74, 0x61, 0xB7, 0x5F, 0x64, 0xE8, 0x0D, 0xE7, 0x57, 0x4C, 0x46, 0x36, 0xAE, 0x54, 0x71,
+ 0xFD, 0x02, 0xD1, 0x6E, 0x18, 0x06, 0xCA, 0x74, 0x7F, 0xA8, 0xF4, 0xDF, 0x1A, 0x37, 0xF2, 0xD6,
+ 0x43, 0xD3, 0xF5, 0x70, 0x22, 0xFD, 0x78, 0x24, 0x65, 0xF1, 0x90, 0x79, 0xE2, 0x12, 0x31, 0xBD,
+ 0xAA, 0xFF, 0xA1, 0x89, 0x05, 0xBE, 0xAE, 0xCA, 0x1A, 0x4B, 0x9A, 0x6D, 0x24, 0xF3, 0xDF, 0x4E,
+ 0xB2, 0xB9, 0x71, 0x10, 0x96, 0xCD, 0xA5, 0xEB, 0x99, 0xDA, 0x5D, 0xB1, 0xF4, 0x50, 0x30, 0x8F,
+ 0x51, 0x6F, 0xDF, 0xF5, 0x7F, 0xB5, 0x8B, 0xD9, 0x58, 0xD2, 0x0C, 0x72, 0x00, 0xB2, 0x32, 0x62,
+ 0x18, 0x78, 0xBD, 0x8A, 0x2B, 0x07, 0xB4, 0x5E, 0x4E, 0xB5, 0x1B, 0xE4, 0x4D, 0xD4, 0x59, 0x29,
+ 0x8E, 0xAA, 0x97, 0x71, 0x66, 0x7F, 0x9E, 0x3B, 0x57, 0xE0, 0x35, 0x03, 0x6B, 0xF7, 0x12, 0x3C,
+ 0x5A, 0xAD, 0x1A, 0xF1, 0xC6, 0xC9, 0x5A, 0xF0, 0x1D, 0x25, 0x15, 0xE4, 0x3B, 0x45, 0x88, 0x70,
+ 0x77, 0x7F, 0x33, 0xC0, 0xA7, 0x50, 0x6F, 0x22, 0x9B, 0xB6, 0xAF, 0x35, 0xF4, 0xC1, 0xEC, 0xEC,
+ 0xF7, 0x7B, 0x59, 0x45, 0x2E, 0x8C, 0x45, 0x94, 0xCF, 0xF2, 0x64, 0xD4, 0x99, 0x78, 0xB6, 0xD3,
+ 0x20, 0x42, 0x49, 0xF4, 0x8E, 0xC4, 0x4E, 0xC9, 0x63, 0x10, 0xE7, 0x57, 0xA8, 0x33, 0xBB, 0xE3,
+ 0xF2, 0xDF, 0x38, 0x24, 0xF4, 0xC5, 0xEA, 0x86, 0xAF, 0xB7, 0xB1, 0x34, 0x46, 0x74, 0xAD, 0x96,
+ 0x84, 0x5F, 0x44, 0x16, 0xE2, 0x54, 0xCA, 0x6A, 0x93, 0xE1, 0x59, 0xBD, 0x56, 0xCF, 0x8C, 0x3A,
+ 0x3C, 0x1B, 0xAB, 0xBE, 0x6A, 0x0E, 0xCA, 0x56, 0x20, 0x1C, 0xDE, 0xDF, 0x0A, 0x5D, 0x7F, 0x55,
+ 0xF9, 0x9E, 0x21, 0x9D, 0x98, 0x37, 0xFD, 0xFE, 0xE7, 0xD7, 0xDC, 0x87, 0xD1, 0xC5, 0x60, 0xF5,
+ 0x91, 0xD9, 0x10, 0x95, 0x6C, 0x24, 0x5B, 0x0F, 0x59, 0x54, 0x4D, 0x04, 0xE8, 0xF8, 0x33, 0x94,
+ 0x1D, 0x00, 0x72, 0xCE, 0x6B, 0xCD, 0x90, 0xC7, 0x6A, 0x9F, 0xF4, 0xE7, 0x5B, 0x67, 0x52, 0xBB,
+ 0xB6, 0x58, 0x19, 0xBB, 0xD5, 0x09, 0x0B, 0x8C, 0x30, 0xBE, 0x21, 0xDA, 0xCB, 0xE7, 0x67, 0xDC,
+ 0x24, 0x00, 0xDD, 0x1A, 0x43, 0x13, 0x71, 0x44, 0x11, 0xA1, 0xA5, 0x9D, 0x9E, 0xD1, 0x19, 0xE4,
+ 0x9D, 0x59, 0x2D, 0xF9, 0x9F, 0x8D, 0x2D, 0x09, 0x01, 0x32, 0x35, 0xC7, 0x2E, 0x12, 0x15, 0x84,
+ 0x88, 0x9F, 0xA7, 0xA2, 0x48, 0x72, 0xA6, 0xB2, 0xE0, 0x81, 0x8A, 0xB1, 0x07, 0x21, 0x5D, 0x9D,
+ 0x74, 0x1D, 0x3D, 0x98, 0x24, 0x1E, 0x4C, 0x45, 0xBD, 0x45, 0x3F, 0x1E, 0x31, 0x5D, 0xBE, 0x8C,
+ 0x4F, 0xDD, 0x1D, 0x0C, 0xA7, 0xFC, 0x5C, 0xA3, 0x20, 0x13, 0x71, 0x9F, 0xB8, 0x0E, 0x50, 0xFA,
+ 0x27, 0x5A, 0xA0, 0x91, 0x28, 0xCA, 0xDF, 0x43, 0x39, 0x18, 0xA2, 0x9F, 0x60, 0xAB, 0xEC, 0x2B,
+ 0x89, 0x03, 0x03, 0x58, 0xB0, 0xA0, 0x76, 0x46, 0xBB, 0x2A, 0x37, 0xEF, 0xD9, 0xD7, 0xDD, 0x93,
+ 0x40, 0x0A, 0x13, 0x7E, 0xF6, 0x84, 0xB7, 0x34, 0x10, 0xB2, 0x31, 0x83, 0x09, 0x66, 0x78, 0xA1,
+ 0x60, 0xD5, 0x30, 0xC4, 0x82, 0xD4, 0x2E, 0x6D, 0xFD, 0x8B, 0x01, 0x84, 0x91, 0x78, 0x4A, 0x4E,
+ 0x2A, 0x85, 0x82, 0xC9, 0x92, 0x0D, 0x28, 0x32, 0x26, 0xE5, 0x25, 0x35, 0x09, 0x79, 0x04, 0xA5,
+ 0xE4, 0xFA, 0x35, 0xE0, 0xB3, 0x87, 0x8B, 0x18, 0x02, 0xED, 0xEC, 0x7B, 0x34, 0x56, 0xAE, 0x6C,
+ 0x00, 0x3C, 0x8F, 0xEF, 0xA6, 0x06, 0xFC, 0xBD, 0xD9, 0x35, 0x47, 0x79, 0x0F, 0xB4, 0x49, 0x7D,
+ 0x9A, 0x1B, 0xB9, 0xEE, 0xB4, 0xFB, 0xDA, 0xAA, 0xCD, 0xEF, 0xA1, 0xD6, 0xD4, 0xCA, 0x7F, 0xE8,
+ 0x1D, 0x91, 0x72, 0x83, 0xB6, 0x4B, 0x86, 0xE4, 0xEC, 0x27, 0xD9, 0xEF, 0xDC, 0x0D, 0xA0, 0x25,
+ 0xE8, 0xD8, 0xEA, 0xC0, 0xD1, 0x5C, 0x58, 0x00, 0xFD, 0x31, 0x48, 0x69, 0xD7, 0x09, 0xFD, 0xD4,
+ 0x1A, 0x8D, 0x5B, 0xE7, 0xA6, 0xE1, 0x9A, 0xF6, 0x1A, 0x03, 0xF9, 0x2D, 0x2E, 0x42, 0xC9, 0x93,
+ 0xCA, 0x31, 0xAA, 0xF1, 0xBB, 0x52, 0xCF, 0x20, 0x01, 0x67, 0xE0, 0x7D, 0x80, 0x69, 0xBA, 0x81,
+ 0xF5, 0x3A, 0x55, 0x40, 0x4E, 0x4F, 0x9B, 0xDD, 0x0F, 0xF9, 0x20, 0xB8, 0x4A, 0x16, 0x58, 0x21,
+ 0x6D, 0x71, 0x42, 0x78, 0xC4, 0x25, 0x3D, 0x6F, 0x9C, 0xC5, 0xE1, 0x2B, 0x39, 0xE0, 0x52, 0x07,
+ 0x4A, 0xFF, 0x62, 0x2C, 0xD2, 0xAB, 0xF3, 0x5B, 0x20, 0xB3, 0x85, 0x44, 0x24, 0x84, 0x8C, 0x3C,
+ 0x38, 0x09, 0x9A, 0x3A, 0x4E, 0xAF, 0xBC, 0xAB, 0x6E, 0x0D, 0x60, 0x30, 0xBA, 0x04, 0xAA, 0x74,
+ 0x93, 0x15, 0x14, 0xB8, 0xD4, 0x20, 0xD6, 0x2F, 0x2B, 0x23, 0x7F, 0x03, 0xC1, 0x3F, 0xF0, 0xE2,
+ 0xBA, 0x77, 0x9C, 0xF3, 0x83, 0xE5, 0x61, 0x11, 0xA2, 0x77, 0x9D, 0xB8, 0x65, 0xB5, 0x87, 0xC2,
+ 0xFD, 0xEA, 0x9E, 0x6E, 0xBA, 0x5D, 0x5E, 0x76, 0x46, 0x49, 0x4E, 0x5A, 0x5F, 0x4C, 0x96, 0xB1,
+ 0x5F, 0x6A, 0xE5, 0xA2, 0xC2, 0xDB, 0xC6, 0x66, 0x92, 0xD7, 0xD4, 0x80, 0x6F, 0x63, 0x01, 0x1C,
+ 0x0D, 0x13, 0xB5, 0xA9, 0x72, 0x8B, 0x6B, 0xA6, 0xF0, 0x98, 0xE4, 0xC6, 0xF8, 0x46, 0x23, 0x61,
+ 0x1E, 0x4C, 0xFD, 0xFF, 0x3E, 0x4C, 0x78, 0xE8, 0x49, 0xCE, 0xA6, 0xD0, 0x5C, 0x2B, 0x85, 0x7D,
+ 0xB4, 0xF5, 0x7D, 0x71, 0x1C, 0x89, 0x57, 0x42, 0x6A, 0x7A, 0x71, 0x44, 0x75, 0x01, 0x90, 0xC3,
+ 0xBF, 0x95, 0x7B, 0x0A, 0x4E, 0x01, 0x0A, 0x52, 0xF4, 0xA0, 0x21, 0x94, 0x7C, 0xEB, 0xA9, 0xEB,
+ 0xAD, 0x1B, 0xBE, 0x78, 0x98, 0x04, 0xC4, 0x26, 0x20, 0x73, 0x5F, 0xB5, 0x45, 0x6C, 0xE2, 0xC7,
+ 0x04, 0xD2, 0xEB, 0x67, 0xE5, 0x8F, 0x2F, 0xA0, 0x66, 0x4C, 0xBD, 0x36, 0x2C, 0xFE, 0x8E, 0x40,
+ 0x46, 0xB6, 0xAB, 0x2F, 0xCF, 0x1F, 0xA1, 0x3E, 0xBF, 0x96, 0x61, 0x74, 0x68, 0xD6, 0x82, 0x1D,
+ 0x12, 0xD5, 0xFD, 0xB9, 0x45, 0xDA, 0x8D, 0x2B, 0x76, 0xDE, 0x9C, 0x65, 0xA0, 0x2D, 0x76, 0x2F,
+ 0x49, 0x2E, 0xEC, 0x27, 0xD4, 0x40, 0x26, 0xA3, 0x06, 0x01, 0x2E, 0x60, 0x04, 0x94, 0x43, 0xA4,
+ 0x79, 0x5D, 0xEA, 0xD8, 0xD1, 0x5B, 0x95, 0xF2, 0x2E, 0x13, 0x17, 0x9E, 0xED, 0x7A, 0x7E, 0x83,
+ 0x86, 0xDF, 0xD1, 0xD4, 0xE9, 0x00, 0x55, 0x8D, 0xCA, 0x4F, 0x18, 0x74, 0x4E, 0x5E, 0x7C, 0xAC,
+ 0xE9, 0x4A, 0x25, 0xA7, 0x3A, 0x84, 0x43, 0xF5, 0x77, 0x74, 0x1E, 0xDC, 0x32, 0xDB, 0x50, 0xCF,
+ 0xF8, 0xAC, 0x01, 0x37, 0x33, 0x59, 0xBE, 0xF5, 0xC2, 0x98, 0xE7, 0x09, 0x29, 0xE3, 0x6E, 0xBC,
+ 0x22, 0x1D, 0x20, 0x06, 0x89, 0x90, 0x95, 0xCC, 0xC7, 0x3F, 0x2B, 0x48, 0x5F, 0x23, 0x0B, 0xCB,
+ 0xD5, 0xA2, 0x4E, 0x52, 0x5A, 0x1E, 0x1A, 0x4C, 0x51, 0x75, 0x67, 0x33, 0xD6, 0xF1, 0xBE, 0x9B,
+ 0x8D, 0x31, 0x0F, 0xBA, 0x2A, 0x67, 0x58, 0xF5, 0x62, 0xC3, 0x80, 0x48, 0x89, 0x5C, 0x3F, 0x81,
+ 0xFF, 0x27, 0x6E, 0x0B, 0x79, 0x6A, 0xD0, 0x33, 0xD6, 0x2D, 0x6A, 0xF1, 0x36, 0xCC, 0x96, 0x6C,
+ 0xA6, 0x6D, 0xA0, 0x92, 0x04, 0x5B, 0x27, 0xC9, 0x05, 0x1D, 0xCA, 0xB2, 0x8D, 0x4F, 0x20, 0xB6,
+ 0xEA, 0xE4, 0x57, 0xAE, 0xAF, 0x77, 0xF7, 0xA8, 0xA5, 0xCD, 0xFF, 0x5C, 0xB9, 0x7F, 0x29, 0x98,
+ 0x2C, 0x5E, 0xDA, 0x69, 0x3E, 0x99, 0x21, 0x25, 0x49, 0x1F, 0xEA, 0xD4, 0x91, 0x63, 0x89, 0xB8,
+ 0xEC, 0xCF, 0x8B, 0x1D, 0xF6, 0x33, 0x3C, 0x29, 0x26, 0xEF, 0xAC, 0x81, 0x12, 0xC5, 0x1B, 0x44,
+ 0xAC, 0x18, 0x90, 0x20, 0xBB, 0x03, 0x5B, 0x3F, 0x3E, 0xD3, 0xD3, 0xC5, 0x47, 0xAF, 0x7F, 0x44,
+ 0x9E, 0x32, 0xC5, 0x06, 0xE9, 0xB6, 0x7D, 0xB3, 0xA1, 0xF6, 0x77, 0x29, 0x7F, 0xA9, 0xA9, 0x10,
+ 0x20, 0xCE, 0x2E, 0x18, 0xC8, 0xAA, 0x68, 0x65, 0x64, 0x11, 0x57, 0x4F, 0xE9, 0xA2, 0xE3, 0xD1,
+ 0xEA, 0x03, 0x40, 0xAC, 0x68, 0x04, 0xC8, 0x36, 0x69, 0xE9, 0xB5, 0x6D, 0x77, 0x93, 0xFA, 0xD6,
+ 0xB8, 0xA5, 0x71, 0x63, 0x70, 0xE8, 0xA0, 0x27, 0x39, 0xD7, 0x33, 0x52, 0x76, 0x59, 0xF1, 0xEF,
+ 0xE2, 0x76, 0x83, 0xC5, 0x4D, 0xC5, 0xA3, 0xF2, 0x10, 0x4C, 0xB3, 0x35, 0x6E, 0x12, 0x5B, 0x26,
+ 0x7C, 0x4A, 0x8B, 0xFB, 0x02, 0x2B, 0xBE, 0xF4, 0x0A, 0x91, 0xF5, 0x7C, 0x82, 0x08, 0x62, 0x70,
+ 0xD8, 0xA4, 0x29, 0xE0, 0xF8, 0x97, 0x19, 0x1D, 0x06, 0xD3, 0x46, 0x90, 0xEB, 0xB5, 0x89, 0x5B,
+ 0x6C, 0x50, 0xB5, 0xB6, 0x70, 0x58, 0xA0, 0x30, 0x05, 0xF5, 0x40, 0x51, 0x4E, 0x30, 0xDF, 0x64,
+ 0x6F, 0x7A, 0x4E, 0x54, 0x64, 0xE3, 0x20, 0xD3, 0x93, 0xE3, 0x79, 0x28, 0x39, 0xB1, 0x18, 0xDF,
+ 0xCC, 0xF1, 0x98, 0xD1, 0x2D, 0x86, 0x34, 0x84, 0xA1, 0x83, 0x4A, 0xE5, 0xA9, 0x61, 0x6B, 0x09,
+ 0xA2, 0x3B, 0xCE, 0x5E, 0xF7, 0x6B, 0xFF, 0xC2, 0x20, 0xFC, 0xF3, 0xAC, 0x2E, 0x7C, 0x63, 0x55,
+ 0x11, 0x24, 0xEE, 0xE3, 0x51, 0xE6, 0x18, 0xB0, 0xD6, 0x6E, 0x85, 0xF5, 0xE5, 0x00, 0x91, 0x21,
+ 0xD4, 0x88, 0xF1, 0x50, 0x31, 0x39, 0x0A, 0x08, 0x23, 0xA9, 0x01, 0xB3, 0xEF, 0xE8, 0xAF, 0xDF,
+ 0xAE, 0x2B, 0xAF, 0xF9, 0x0D, 0xE2, 0x4D, 0x00, 0xE3, 0x5B, 0x56, 0x80, 0x90, 0xB8, 0xD4, 0x76,
+ 0xEA, 0x14, 0x68, 0x40, 0x53, 0x9A, 0x3B, 0x82, 0xFC, 0x63, 0x9F, 0x9A, 0x4C, 0xFF, 0xE3, 0x10,
+ 0x49, 0xCB, 0xA8, 0x1D, 0x59, 0x98, 0x3F, 0x4C, 0xDD, 0x2C, 0xB2, 0x8D, 0x11, 0xB5, 0x23, 0xF4,
+ 0x90, 0x87, 0xE3, 0x85, 0x24, 0xD4, 0x0A, 0xE9, 0x79, 0xBB, 0x1F, 0x56, 0xC3, 0x62, 0x35, 0xDF,
+ 0xE0, 0xAA, 0x51, 0x02, 0x93, 0xAE, 0x11, 0x21, 0xCF, 0xE4, 0xF3, 0x84, 0x08, 0x64, 0x06, 0x8B,
+ 0x8A, 0x32, 0xB0, 0xF0, 0xC5, 0xD3, 0x5E, 0x1E, 0xF1, 0x69, 0x48, 0x46, 0xEC, 0x61, 0xA2, 0x7F,
+ 0x28, 0xB6, 0xF8, 0xC9, 0x78, 0x35, 0x9B, 0x4D, 0x8C, 0xFE, 0xB7, 0xC9, 0xBC, 0xE9, 0x6E, 0x17,
+ 0xCB, 0xFB, 0x00, 0x91, 0xE8, 0x27, 0x77, 0x7C, 0x96, 0xD6, 0xAF, 0x8D, 0xE4, 0x18, 0x8F, 0xEB,
+ 0x7B, 0x9F, 0x01, 0x9C, 0x2E, 0x77, 0xF5, 0x40, 0x7C, 0x6D, 0x85, 0xA5, 0x17, 0x8F, 0x40, 0xB7,
+ 0x9D, 0xBB, 0x68, 0x96, 0x22, 0x17, 0x0A, 0x75, 0xA3, 0x1D, 0x07, 0xE4, 0x93, 0x8A, 0xBB, 0xAD,
+ 0x7E, 0x2E, 0xAA, 0x21, 0xDA, 0x62, 0xBF, 0xE8, 0xBB, 0x28, 0xB2, 0xCE, 0xE3, 0x0F, 0xCB, 0x3C,
+ 0x2C, 0x4A, 0x3D, 0xAA, 0xFC, 0x4B, 0xB5, 0x6A, 0x04, 0x05, 0xA4, 0x63, 0x98, 0xD8, 0xA2, 0x5E,
+ 0x96, 0xD5, 0x52, 0x7B, 0xCB, 0xED, 0xA3, 0x72, 0x3E, 0x2A, 0x3F, 0xE2, 0x79, 0x3D, 0xFE, 0x8A,
+ 0xA0, 0xD4, 0x32, 0x60, 0x10, 0xBE, 0xF2, 0xE5, 0xF9, 0x03, 0xE2, 0x66, 0x76, 0x7A, 0x48, 0xEF,
+ 0x33, 0x63, 0xA0, 0x93, 0x99, 0x28, 0x97, 0x40, 0xB9, 0xAD, 0xEC, 0xB4, 0xD7, 0x98, 0x9D, 0x87,
+ 0x6A, 0x6C, 0x9D, 0xD5, 0xF6, 0xAA, 0x64, 0xE4, 0xD6, 0x73, 0x92, 0xA9, 0xC2, 0xB4, 0x80, 0x0F,
+ 0x58, 0x7B, 0x01, 0x17, 0xAD, 0x7C, 0x3E, 0x5C, 0xDE, 0x7D, 0x77, 0xF2, 0x35, 0x4E, 0x6F, 0x0D,
+ 0xE1, 0x4E, 0xAD, 0x4E, 0x82, 0x36, 0x87, 0x89, 0x43, 0x13, 0x50, 0x08, 0x22, 0x3D, 0x14, 0x3D,
+ 0x85, 0x50, 0xBC, 0x17, 0x18, 0x66, 0xE1, 0x85, 0xEF, 0xCA, 0xF1, 0x12, 0x9B, 0xA1, 0xC0, 0x95,
+ 0x14, 0x2E, 0x2C, 0xB6, 0x1B, 0x25, 0x9F, 0x4C, 0xF2, 0x49, 0xAE, 0x8A, 0xD4, 0xE7, 0x1A, 0x05,
+ 0xFB, 0x6F, 0x75, 0x42, 0xC6, 0x14, 0xD8, 0xE5, 0x03, 0x04, 0x80, 0xEB, 0x58, 0x8F, 0x92, 0xAF,
+ 0xD1, 0x15, 0x00, 0x63, 0xB7, 0xFF, 0xF8, 0xD7, 0xE3, 0xC0, 0x37, 0xEF, 0x68, 0xF9, 0xC8, 0x5A,
+ 0x03, 0x6D, 0x4A, 0x56, 0xAE, 0xDF, 0x8E, 0xBD, 0x52, 0x5F, 0x7D, 0x22, 0x4A, 0xFA, 0xFE, 0xA2,
+ 0x3F, 0xCE, 0x45, 0xD8, 0x41, 0x94, 0x70, 0x21, 0x48, 0xF7, 0x95, 0xE5, 0xE4, 0x22, 0x52, 0x7E,
+ 0x15, 0xAE, 0xC7, 0x34, 0xA8, 0xF9, 0x15, 0x4B, 0x15, 0x11, 0x19, 0x19, 0xDC, 0x4A, 0x3D, 0x3D,
+ 0x33, 0x79, 0x0E, 0x8A, 0x34, 0x11, 0xEB, 0x4A, 0x8B, 0xAF, 0x0F, 0xE8, 0xBA, 0x3E, 0x94, 0xA6,
+ 0x2C, 0xF8, 0xF8, 0xA9, 0xD1, 0xE7, 0x3A, 0x3D, 0x44, 0xC8, 0x08, 0x47, 0x5E, 0xD8, 0xF1, 0x6C,
+ 0xCD, 0x8C, 0x60, 0xD7, 0xF6, 0xA5, 0x57, 0xF2, 0x0C, 0xD6, 0x9E, 0x0C, 0x90, 0xCB, 0xAE, 0xC0,
+ 0xC1, 0x62, 0xD4, 0xC6, 0x6C, 0x7F, 0xED, 0x38, 0x23, 0x48, 0x0B, 0x53, 0x64, 0xBE, 0xD2, 0x6C,
+ 0xE2, 0xAB, 0x71, 0x9E, 0x51, 0x87, 0xBF, 0x54, 0xC1, 0x36, 0xC0, 0x5B, 0x0E, 0xD0, 0x63, 0xE9,
+ 0x1C, 0x0C, 0x07, 0x3B, 0xAE, 0xEE, 0xA5, 0x51, 0x1E, 0xE6, 0x8E, 0x01, 0x1E, 0x59, 0xEA, 0x6C,
+ 0x25, 0x63, 0x33, 0x08, 0x08, 0x2C, 0x21, 0xF5, 0xEA, 0x01, 0x56, 0x44, 0x7D, 0xE0, 0x85, 0x1C,
+ 0xD5, 0x4D, 0x8D, 0xC2, 0xB7, 0xEE, 0x54, 0x51, 0xCA, 0x8B, 0xA6, 0xCF, 0x47, 0x85, 0x02, 0x29,
+ 0xDD, 0x60, 0x42, 0xE4, 0x17, 0x8E, 0x42, 0x5D, 0xFF, 0x10, 0x91, 0x25, 0x46, 0x93, 0x6B, 0xDA,
+ 0xAD, 0xDA, 0x01, 0x0F, 0x31, 0x85, 0x53, 0x9E, 0x7A, 0x3C, 0x14, 0xF5, 0xF0, 0xA4, 0x12, 0x9B,
+ 0xED, 0xC7, 0x83, 0x73, 0xA4, 0x6B, 0xC8, 0xAA, 0x7B, 0xD4, 0x64, 0xF7, 0xF5, 0xD3, 0x07, 0x2F,
+ 0x41, 0x8B, 0x09, 0xBF, 0xC7, 0xBD, 0x00, 0x2A, 0xBC, 0xBA, 0xFC, 0x9A, 0xE2, 0x58, 0x64, 0xFD,
+ 0xE1, 0x60, 0x4E, 0x3C, 0x60, 0xE3, 0x84, 0xCD, 0xD3, 0xAE, 0xB4, 0x0D, 0xF8, 0xA3, 0xAA, 0x74,
+ 0xE1, 0x42, 0x18, 0x56, 0xA6, 0x72, 0x65, 0xD1, 0x14, 0xCC, 0xFE, 0x1F, 0xD0, 0x91, 0x84, 0xA1,
+ 0x6A, 0x33, 0x76, 0x97, 0x5B, 0x72, 0x3F, 0xB3, 0xB8, 0xDF, 0xD9, 0x3E, 0x1D, 0x1E, 0xFD, 0x35,
+ 0xDF, 0x4B, 0xD7, 0x50, 0xE7, 0x2D, 0x1B, 0xC8, 0xCA, 0xB3, 0x89, 0xE4, 0x56, 0xA9, 0x81, 0x4A,
+ 0xED, 0x96, 0xE3, 0x0C, 0xE5, 0x9F, 0x60, 0xF5, 0xB4, 0x9A, 0xCD, 0xAD, 0xBA, 0x63, 0x8B, 0x54,
+ 0x39, 0xD0, 0x0A, 0xE9, 0x98, 0x5E, 0xC1, 0xC9, 0x40, 0xB7, 0xA4, 0x10, 0x32, 0x7D, 0x9E, 0x00,
+ 0x68, 0x69, 0xB8, 0x23, 0xDF, 0xBE, 0xC0, 0x45, 0x33, 0xF1, 0x8E, 0x27, 0xED, 0xA1, 0xD9, 0x38,
+ 0x74, 0xF2, 0x8A, 0xBE, 0x85, 0x1E, 0xF0, 0x5B, 0x1A, 0x34, 0x93, 0x72, 0xDE, 0x37, 0xD7, 0x83,
+ 0xEB, 0x7B, 0x28, 0x5E, 0x14, 0x2A, 0xBC, 0xC7, 0xE2, 0xB3, 0x06, 0x29, 0x76, 0x37, 0xD3, 0xC4,
+ 0x47, 0x8A, 0xDB, 0xC7, 0x30, 0x02, 0x66, 0xC9, 0x53, 0x5E, 0xBA, 0xDB, 0x07, 0x60, 0x0D, 0x6B,
+ 0x54, 0xCB, 0x0C, 0xC1, 0x27, 0x54, 0xDE, 0x12, 0xED, 0x7D, 0x8E, 0x76, 0xCD, 0x57, 0x52, 0x88,
+ 0xF0, 0x16, 0x9C, 0x80, 0xE1, 0x00, 0x50, 0x95, 0x61, 0x8E, 0x55, 0xEE, 0xE1, 0xC9, 0x8F, 0xD4,
+ 0x1C, 0x74, 0xDD, 0x85, 0xCB, 0xE5, 0x7C, 0x8B, 0x24, 0x4C, 0x4B, 0xDA, 0x16, 0x98, 0xA0, 0x70,
+ 0x58, 0x13, 0x5D, 0x05, 0x0C, 0x3F, 0x61, 0xE3, 0x14, 0xE2, 0xEF, 0x92, 0xC8, 0x3A, 0xDA, 0xFF,
+ 0x0E, 0x1A, 0xB3, 0x7D, 0x02, 0x43, 0xDD, 0xE5, 0xE3, 0x8C, 0xE9, 0xFC, 0xD1, 0x66, 0xA2, 0x8E,
+ 0x4D, 0x81, 0xA4, 0x4C, 0xBF, 0x4D, 0x9B, 0x67, 0x53, 0x63, 0x11, 0x86, 0x78, 0x54, 0xF0, 0x9E,
+ 0x70, 0x56, 0x1C, 0x5F, 0xBA, 0xC9, 0x1C, 0xAB, 0xC8, 0x39, 0x8B, 0xC9, 0xE4, 0xB1, 0x07, 0xEA,
+ 0xB5, 0xD4, 0x75, 0xF2, 0x91, 0x83, 0x1C, 0x2F, 0x73, 0xEC, 0xFB, 0x56, 0x68, 0xA1, 0xC8, 0xAC,
+ 0xCA, 0x20, 0x3F, 0x6A, 0xE9, 0xBF, 0xC1, 0x1D, 0x00, 0xBC, 0x23, 0x1F, 0x1E, 0xF8, 0xC3, 0x08,
+ 0xBD, 0x66, 0xA5, 0xF6, 0x5D, 0x77, 0xD5, 0x5A, 0x6D, 0x04, 0xEB, 0x76, 0x9E, 0xDB, 0x0C, 0x8C,
+ 0x28, 0x9F, 0xCC, 0x4E, 0x77, 0xFC, 0x00, 0x36, 0xEC, 0xCE, 0x4B, 0x72, 0x06, 0xD1, 0x73, 0x1A,
+ 0xD8, 0x91, 0x45, 0x55, 0xB8, 0xA7, 0x8C, 0x40, 0xCA, 0xF7, 0xCF, 0x39, 0x6A, 0x74, 0x63, 0xD3,
+ 0x71, 0x76, 0xA4, 0x59, 0xB8, 0x8C, 0xB5, 0x4E, 0xCA, 0x12, 0x35, 0xB5, 0x87, 0x9F, 0xA9, 0x94,
+ 0x07, 0x67, 0x4D, 0xF0, 0xDF, 0x97, 0x0F, 0x53, 0x68, 0xCC, 0x67, 0x26, 0xF8, 0xF5, 0xBE, 0xAD,
+ 0x1E, 0x95, 0xD0, 0x90, 0x88, 0x27, 0xA8, 0x3D, 0x4F, 0xA1, 0x58, 0xDE, 0x8F, 0xBC, 0x36, 0x2F,
+ 0x36, 0x0B, 0x38, 0x9A, 0x51, 0x95, 0xA2, 0xE5, 0x8F, 0xC5, 0x1D, 0xE4, 0x2E, 0x27, 0x9D, 0xEA,
+ 0x43, 0xD7, 0x07, 0x02, 0x0B, 0x26, 0x85, 0xD3, 0xEC, 0xA3, 0x67, 0xA9, 0xC3, 0x23, 0xFA, 0x46,
+ 0x5F, 0x9C, 0x64, 0xD5, 0xCC, 0x7D, 0x75, 0xE3, 0x51, 0x32, 0x31, 0x1F, 0x51, 0x99, 0xF0, 0x57,
+ 0x30, 0xC9, 0x22, 0xA0, 0x2B, 0xA3, 0xA7, 0x7A, 0x26, 0x21, 0x91, 0xD1, 0x75, 0xD4, 0xB7, 0x0B,
+ 0xC5, 0x96, 0x71, 0x66, 0x2D, 0x5E, 0xDA, 0x71, 0x48, 0xEA, 0xAC, 0x97, 0x8B, 0x23, 0xD5, 0x49,
+ 0xC2, 0x66, 0x1D, 0x62, 0xFC, 0x06, 0x17, 0xA1, 0xEC, 0x71, 0x17, 0xA0, 0x3B, 0xE3, 0xF0, 0xF7,
+ 0x0D, 0xCB, 0x84, 0xB6, 0x7C, 0xC0, 0x42, 0x0E, 0xB8, 0xA3, 0x8C, 0x31, 0x4A, 0x9A, 0xAA, 0x97,
+ 0xFC, 0x67, 0xB1, 0x75, 0xC6, 0x51, 0xFC, 0x28, 0x69, 0xD0, 0x43, 0x28, 0x54, 0xB9, 0xAE, 0xBE,
+ 0x44, 0x7A, 0x18, 0x36, 0x39, 0x26, 0x46, 0x29, 0x33, 0x0E, 0x15, 0xAF, 0x03, 0x21, 0x07, 0x87,
+ 0xDE, 0x30, 0xE3, 0xE5, 0xDA, 0x34, 0x81, 0xE5, 0xE2, 0xCD, 0x6B, 0xEE, 0xEF, 0x95, 0xD3, 0x2C,
+ 0x7B, 0x31, 0x15, 0x56, 0xB4, 0x77, 0xDA, 0x40, 0xFD, 0x59, 0xB9, 0xDF, 0xEC, 0x39, 0x2B, 0x6C,
+ 0x18, 0x7E, 0xCA, 0x99, 0x5E, 0x55, 0xF2, 0x61, 0x45, 0x74, 0x2C, 0x50, 0xB7, 0x42, 0x31, 0xD9,
+ 0x58, 0xAE, 0x75, 0x17, 0x4D, 0xFA, 0xF1, 0x18, 0x26, 0x6B, 0x2C, 0xD9, 0xE8, 0x98, 0x75, 0xE7,
+ 0x8A, 0xC9, 0x07, 0x63, 0x6D, 0x55, 0xFD, 0xEE, 0x2D, 0x24, 0x4D, 0x0F, 0x11, 0x7C, 0x0B, 0x48,
+ 0x99, 0xC0, 0x06, 0x83, 0xC3, 0xF5, 0x90, 0xBD, 0x12, 0xE7, 0xC6, 0x86, 0x16, 0x8A, 0x63, 0xD7,
+ 0xF8, 0x1E, 0x54, 0xCD, 0x06, 0x20, 0x4C, 0x5C, 0xC6, 0x15, 0x76, 0x56, 0xE0, 0xE1, 0xDD, 0xE4,
+ 0xC1, 0x63, 0x75, 0x53, 0xBC, 0xE1, 0x8C, 0xBF, 0x26, 0x41, 0xF9, 0xA9, 0xCC, 0xEE, 0x69, 0xEA,
+ 0x7D, 0x0E, 0x9F, 0xF2, 0x70, 0x0C, 0x4A, 0xD0, 0x2D, 0x17, 0x47, 0xB0, 0x66, 0xD4, 0xDF, 0x9A,
+ 0xDC, 0xAD, 0x94, 0xE6, 0x66, 0x3F, 0x0D, 0x57, 0xB3, 0xAD, 0x90, 0xD0, 0xD7, 0x72, 0x3D, 0x1E,
+ 0x9C, 0xAF, 0x1A, 0x46, 0x20, 0x8B, 0x48, 0xEA, 0x3A, 0x10, 0x42, 0x32, 0x3D, 0xB9, 0xEB, 0x61,
+ 0x47, 0x29, 0x61, 0xED, 0xB6, 0x8C, 0x1D, 0x9E, 0xD4, 0x00, 0x34, 0xD9, 0xAB, 0x16, 0x16, 0x84,
+ 0xAF, 0xC5, 0x79, 0x37, 0xE4, 0xC9, 0xBE, 0x91, 0x57, 0x4F, 0xFE, 0x87, 0xF7, 0x47, 0x62, 0x99,
+ 0x4F, 0xFA, 0xAE, 0x51, 0x68, 0x1A, 0xE2, 0x90, 0xB5, 0x62, 0x21, 0xE4, 0x06, 0x14, 0x3D, 0xB5,
+ 0xC2, 0x34, 0xB0, 0xF3, 0x6B, 0x0D, 0xF7, 0x0F, 0x3C, 0x54, 0xD6, 0x2B, 0xCF, 0xD8, 0xD1, 0x9B,
+ 0x54, 0x8B, 0x93, 0xBB, 0x15, 0xF1, 0xC5, 0x9F, 0x24, 0x53, 0x02, 0x94, 0xDE, 0x66, 0x4F, 0x2F,
+ 0x77, 0xF6, 0xE4, 0x4C, 0x58, 0x19, 0xBB, 0x08, 0x0A, 0x9B, 0xAC, 0x4C, 0xA5, 0xAC, 0x4A, 0x66,
+ 0x72, 0x01, 0x45, 0x41, 0xDA, 0x86, 0xF9, 0x7C, 0x0A, 0x8E, 0xA6, 0xFD, 0x10, 0x18, 0x4F, 0x2F,
+ 0xEA, 0x5A, 0xD9, 0x79, 0xD2, 0xD8, 0x3F, 0x02, 0x11, 0x5F, 0x43, 0x79, 0x3A, 0x40, 0x75, 0x6C,
+ 0xFC, 0x3A, 0x24, 0xEB, 0xBF, 0xD2, 0xC0, 0xF3, 0xD0, 0xD1, 0x21, 0xA9, 0x84, 0xFB, 0x9D, 0xA3,
+ 0xF1, 0x0F, 0x57, 0xAE, 0x99, 0xCB, 0x3B, 0xBC, 0x55, 0x88, 0xE6, 0xE1, 0x7D, 0xC6, 0xDB, 0xA9,
+ 0x35, 0x59, 0x11, 0x26, 0x05, 0x0E, 0x8E, 0x5D, 0xBE, 0xF1, 0x32, 0x5A, 0xBF, 0xBE, 0xE8, 0x07,
+ 0xB8, 0x80, 0x61, 0x70, 0xEA, 0x8C, 0x05, 0xC0, 0x4D, 0xBF, 0xE9, 0x63, 0xA1, 0x11, 0xFC, 0x0A,
+ 0x4B, 0x6D, 0x03, 0x11, 0x86, 0x7A, 0x69, 0x49, 0x15, 0xDA, 0x23, 0x67, 0xC5, 0x51, 0x3A, 0x5A,
+ 0xAD, 0xCA, 0xAC, 0xF7, 0xD7, 0x6C, 0x0E, 0x2D, 0xC5, 0x88, 0xD9, 0x95, 0x48, 0x58, 0x70, 0x37,
+ 0xBE, 0x8E, 0xBC, 0xF6, 0x14, 0x4C, 0xA0, 0x13, 0x9C, 0x8D, 0x58, 0x9F, 0x02, 0xAB, 0x65, 0xCA,
+ 0x66, 0x73, 0x84, 0x3B, 0xC6, 0xD5, 0x43, 0x9E, 0x1C, 0xCE, 0xA0, 0x00, 0x59, 0xEC, 0x4A, 0xC0,
+ 0x9D, 0x31, 0x5A, 0xB2, 0x0A, 0x86, 0x23, 0x2A, 0xCD, 0xCF, 0x18, 0x96, 0xE2, 0xE5, 0xFF, 0x36,
+ 0xBC, 0x66, 0x8A, 0xA7, 0x8A, 0xE0, 0xF4, 0x06, 0x39, 0x7C, 0xCF, 0x21, 0xEE, 0x17, 0x39, 0x87,
+ 0x74, 0xA0, 0x73, 0x38, 0xA9, 0x90, 0x6C, 0xC2, 0x1B, 0xF0, 0x69, 0xD8, 0xBF, 0x6E, 0x44, 0x6F,
+ 0x77, 0x75, 0x1E, 0x45, 0xB5, 0x65, 0xAD, 0xDF, 0x56, 0x66, 0xFD, 0xA0, 0x59, 0x85, 0xC5, 0x06,
+ 0x0C, 0xBF, 0xD5, 0x17, 0xA1, 0x48, 0x99, 0x63, 0xEE, 0xF0, 0x7D, 0xAE, 0x3A, 0x7C, 0x6A, 0x7C,
+ 0xB4, 0xDA, 0xDB, 0x1A, 0xED, 0x70, 0xF9, 0x4D, 0xD2, 0xA4, 0x09, 0xE4, 0xFA, 0x4B, 0x95, 0xDD,
+ 0x95, 0x7B, 0x3D, 0xD1, 0x52, 0xDB, 0x59, 0x68, 0xFF, 0xE5, 0x13, 0x39, 0xE5, 0x01, 0x12, 0x7F,
+ 0x9A, 0x0E, 0xFF, 0x35, 0x75, 0x6A, 0x56, 0xEA, 0x66, 0x91, 0xF7, 0x3E, 0x71, 0x86, 0x6C, 0xC3,
+ 0x11, 0x1B, 0x04, 0x4C, 0x98, 0x13, 0xA1, 0x35, 0x23, 0x96, 0xC9, 0x8C, 0xFB, 0x43, 0x96, 0x4B,
+ 0xC0, 0x1F, 0x30, 0x95, 0xAA, 0x8B, 0x27, 0x16, 0x6C, 0x91, 0x0D, 0x62, 0xAB, 0x87, 0x1A, 0xDA,
+ 0x61, 0xB1, 0x2E, 0xBC, 0x19, 0xA8, 0xF0, 0x32, 0xD7, 0x06, 0x6F, 0x82, 0xFD, 0x5F, 0xF1, 0x08,
+ 0x5E, 0x97, 0x83, 0xEF, 0xB0, 0x91, 0xC2, 0xE6, 0x37, 0x47, 0xFC, 0xD1, 0xE7, 0x6C, 0xC1, 0x1A,
+ 0xAF, 0x91, 0xDF, 0x5C, 0x2D, 0x1B, 0xBC, 0x6A, 0x10, 0xAC, 0xAE, 0x2C, 0x34, 0xCD, 0xD2, 0x6B,
+ 0x15, 0x07, 0xEA, 0xD0, 0x6C, 0x3E, 0x19, 0x14, 0xEF, 0x35, 0xA4, 0x2B, 0x17, 0xF8, 0x2F, 0x48,
+ 0x0D, 0x5C, 0x70, 0xE2, 0xFF, 0x94, 0x2B, 0x59, 0x3C, 0xDE, 0x2F, 0x14, 0x84, 0x5F, 0x0F, 0xF3,
+ 0xA0, 0xFC, 0x40, 0xBE, 0xFA, 0xAE, 0x97, 0xC7, 0xC6, 0xF3, 0xB5, 0xC2, 0x50, 0xBB, 0xA3, 0xB8,
+ 0xC1, 0x7D, 0x6B, 0xE9, 0x87, 0x98, 0x8B, 0xBE, 0x19, 0xA5, 0xAC, 0xB1, 0x8D, 0x6C, 0x67, 0x94,
+ 0x95, 0x7C, 0x60, 0xCC, 0x0B, 0x75, 0x24, 0xB9, 0x54, 0x7D, 0xD4, 0x4D, 0x9B, 0xF2, 0xA6, 0xFB,
+ 0xC0, 0x78, 0x38, 0x90, 0x19, 0x5A, 0x62, 0x85, 0x3A, 0x34, 0xD8, 0xCD, 0xA1, 0xA5, 0xD9, 0xC0,
+ 0xC5, 0xB3, 0x6E, 0x26, 0x13, 0xCF, 0x7C, 0xC1, 0x50, 0x6D, 0x80, 0xCE, 0xF9, 0xA7, 0xFE, 0x2F,
+ 0x14, 0x53, 0x03, 0x0E, 0xFE, 0xB4, 0xA2, 0x75, 0x0A, 0xB4, 0xD9, 0xDB, 0xEA, 0xBC, 0xF1, 0xB0,
+ 0x8E, 0xE5, 0x33, 0x49, 0x16, 0xCD, 0x3B, 0x7C, 0x3B, 0x31, 0x51, 0x8D, 0xF2, 0x12, 0xDB, 0x09,
+ 0xA7, 0x06, 0x7E, 0x66, 0x09, 0x77, 0xA2, 0x3E, 0xB9, 0xA2, 0xA2, 0xEE, 0xFB, 0x9E, 0x84, 0xF1,
+ 0x77, 0x28, 0xB1, 0x02, 0xF4, 0xE9, 0x74, 0x56, 0x3D, 0x6F, 0x83, 0x2F, 0xDE, 0x50, 0x4F, 0xAA,
+ 0x2C, 0xC9, 0x8A, 0x71, 0x45, 0xE1, 0x79, 0x4D, 0x9B, 0xC0, 0xC0, 0x8B, 0x33, 0x7D, 0x3F, 0x07,
+ 0x2B, 0x4C, 0x16, 0x4F, 0xD1, 0xFB, 0x28, 0xB8, 0x7B, 0xF2, 0x4F, 0xA8, 0x56, 0x84, 0xDF, 0x61,
+ 0xEC, 0x1F, 0x4D, 0x95, 0xC5, 0xD7, 0x90, 0x4D, 0x38, 0x35, 0xE5, 0x96, 0xBA, 0x6D, 0x31, 0xAE,
+ 0xE7, 0xAC, 0xE6, 0xDD, 0x05, 0x5E, 0xD4, 0xF5, 0x47, 0x5B, 0xEA, 0xA3, 0x36, 0x7C, 0x58, 0x04,
+ 0x41, 0x3C, 0xEC, 0xC6, 0x70, 0x59, 0xEC, 0x4D, 0xE3, 0x80, 0x59, 0x6D, 0xA1, 0x3A, 0x31, 0xA1,
+ 0x50, 0xB7, 0x10, 0xC0, 0xC4, 0x47, 0x87, 0xAB, 0xEA, 0x4B, 0xFD, 0xF6, 0x5C, 0xA8, 0x62, 0x40,
+ 0x3E, 0x89, 0x1D, 0xE1, 0x9B, 0x04, 0x1F, 0x22, 0x2B, 0xAF, 0x0B, 0xFC, 0xD1, 0x64, 0x4B, 0xCE,
+ 0xC4, 0xF9, 0x19, 0xF4, 0x21, 0x95, 0xBA, 0xC0, 0x77, 0x4B, 0xFC, 0x15, 0xC7, 0x6F, 0xF7, 0x70,
+ 0x8E, 0xE2, 0xDF, 0xFE, 0x48, 0xA9, 0x17, 0xA2, 0xAB, 0xA5, 0xFC, 0x2A, 0x72, 0x08, 0xFF, 0xBC,
+ 0x56, 0xFC, 0xAF, 0xFF, 0x47, 0xEC, 0xCE, 0x29, 0x17, 0xAE, 0x2D, 0xB3, 0xB3, 0x5F, 0x93, 0x9D,
+ 0x57, 0x2A, 0xF4, 0xDE, 0xDD, 0xE4, 0xE6, 0x43, 0x73, 0xCA, 0x00, 0x16, 0xB8, 0xD7, 0x15, 0x67,
+ 0xEB, 0x33, 0x6C, 0xCE, 0x0C, 0xFA, 0x8F, 0xF1, 0x08, 0x6E, 0xC0, 0x3F, 0xAF, 0x30, 0x9F, 0x2A,
+ 0x98, 0x4C, 0x03, 0x1C, 0x88, 0x7D, 0xBF, 0x7A, 0xB1, 0xAE, 0x51, 0x69, 0x6D, 0xE9, 0x67, 0x8F,
+ 0x73, 0x3A, 0xB9, 0x58, 0x9B, 0xB0, 0xE6, 0x14, 0xB2, 0x04, 0x57, 0x85, 0x6E, 0x09, 0x84, 0x53,
+ 0x1F, 0x6D, 0xAA, 0xD1, 0x42, 0xCA, 0xFA, 0x8D, 0xB5, 0xAA, 0xD6, 0xDC, 0x9A, 0xC1, 0x90, 0x69,
+ 0x5A, 0xB7, 0xB8, 0x75, 0xD4, 0xD8, 0x5E, 0x2B, 0x5E, 0xB5, 0x73, 0x4B, 0x42, 0x2D, 0x5C, 0x4C,
+ 0x58, 0x9E, 0xF1, 0xE0, 0x18, 0x51, 0x5B, 0x68, 0xEA, 0x4E, 0x92, 0x98, 0x62, 0x6C, 0xF8, 0x68,
+ 0xA8, 0x92, 0x48, 0x8E, 0x2B, 0x11, 0xC7, 0xC5, 0x8E, 0x3A, 0x3C, 0xFF, 0xB3, 0x93, 0x32, 0xA8,
+ 0x55, 0x94, 0x0E, 0xA1, 0x78, 0x7E, 0x3D, 0xD2, 0xF0, 0xA2, 0x27, 0x1B, 0x8F, 0x14, 0x73, 0x0B,
+ 0xE7, 0xC9, 0xBE, 0xE5, 0x49, 0xCF, 0x26, 0xE2, 0xC0, 0x5E, 0x51, 0xE5, 0xAC, 0x32, 0x45, 0x37,
+ 0x6A, 0x4C, 0xF9, 0xCC, 0x6C, 0x0A, 0x0B, 0xEE, 0x1C, 0x5B, 0x7D, 0xE8, 0xDF, 0x83, 0x96, 0x0E,
+ 0x7D, 0x6E, 0x87, 0x2D, 0x4A, 0xA8, 0x00, 0x7C, 0xE9, 0xE2, 0x1A, 0xE7, 0x9E, 0x9D, 0x09, 0x99,
+ 0xA5, 0xB6, 0x46, 0x4D, 0xDE, 0xD7, 0xA9, 0x9B, 0x13, 0xA5, 0xC9, 0xB1, 0x6E, 0xDC, 0xF6, 0x42,
+ 0x20, 0x08, 0x86, 0xFE, 0x8A, 0x3E, 0x42, 0x42, 0x33, 0x0B, 0x54, 0xD1, 0xB9, 0x97, 0x86, 0x03,
+ 0xC9, 0xA7, 0x20, 0x0B, 0x09, 0x46, 0x0C, 0xCF, 0x6B, 0x7B, 0x74, 0x95, 0xFE, 0xC0, 0x24, 0x8D,
+ 0x12, 0xBD, 0xC9, 0x60, 0x48, 0x2F, 0x02, 0x77, 0x5C, 0x5F, 0x86, 0xA9, 0x39, 0xB3, 0x7C, 0x77,
+ 0x10, 0xCE, 0xE9, 0xB4, 0x61, 0x63, 0x63, 0x39, 0x86, 0x89, 0x97, 0x4A, 0xD3, 0x16, 0x51, 0x1F,
+ 0x8E, 0xFC, 0xF0, 0x51, 0xF4, 0x5D, 0x62, 0x73, 0xF3, 0x47, 0x82, 0x04, 0xF0, 0xD8, 0xD8, 0xD5,
+ 0x16, 0x63, 0x96, 0xBE, 0xF5, 0xB5, 0x4A, 0x70, 0xCB, 0x8B, 0x23, 0xF5, 0xB0, 0xEE, 0x0F, 0xFA,
+ 0xC7, 0x9A, 0xA5, 0xB1, 0x6B, 0x39, 0x53, 0x90, 0xAF, 0xF8, 0x9F, 0xCC, 0x99, 0xE4, 0x65, 0x7A,
+ 0x69, 0xBD, 0x2B, 0x1F, 0x27, 0x3F, 0x87, 0x69, 0x2D, 0x1E, 0x9F, 0xC2, 0x96, 0xE9, 0x64, 0xEC,
+ 0xF8, 0x34, 0x30, 0xA1, 0xC3, 0xAF, 0x77, 0x55, 0x42, 0x30, 0xA7, 0x8E, 0x35, 0x12, 0xBF, 0x1C,
+ 0xA3, 0x1F, 0x74, 0x43, 0x41, 0xD5, 0x35, 0xC9, 0x02, 0x6E, 0xB9, 0x3C, 0x12, 0x6D, 0x23, 0x3B,
+ 0xD6, 0xCB, 0x2D, 0x01, 0xCA, 0x96, 0xCB, 0x36, 0xCD, 0x65, 0x81, 0x04, 0xDA, 0x83, 0xB2, 0x8E,
+ 0x32, 0xB7, 0x85, 0xAE, 0x7F, 0xC2, 0x2F, 0x05, 0xFE, 0x0C, 0x29, 0x9D, 0x21, 0x8D, 0x9E, 0xED,
+ 0x9A, 0x45, 0xCD, 0xD6, 0xC1, 0xC5, 0x22, 0xAF, 0x4B, 0xFD, 0xED, 0xEE, 0x34, 0xA4, 0xD7, 0x51,
+ 0xFE, 0x05, 0x20, 0xE0, 0x25, 0xBF, 0x4D, 0xCE, 0xCE, 0x8B, 0xC6, 0xBA, 0xF2, 0x8C, 0x13, 0xF2,
+ 0xA5, 0x50, 0xC9, 0xC7, 0x69, 0x64, 0xA7, 0x9F, 0x42, 0xD4, 0x82, 0xA8, 0x1A, 0x65, 0x36, 0xBD,
+ 0xF8, 0x42, 0x98, 0x41, 0x76, 0x32, 0x34, 0x19, 0x1C, 0xC9, 0x3E, 0x08, 0x43, 0xB2, 0x1F, 0xE4,
+ 0x3B, 0x17, 0x75, 0x8F, 0x6A, 0x66, 0xFA, 0xF0, 0x63, 0xC5, 0xA0, 0x96, 0x0B, 0x9C, 0xB8, 0xA1,
+ 0x76, 0xDE, 0xEC, 0xB2, 0x8B, 0x28, 0xC0, 0xAC, 0x99, 0x7E, 0x4B, 0x36, 0x50, 0xD1, 0xBC, 0xE6,
+ 0xBA, 0xEE, 0x8B, 0x4C, 0x5A, 0xD7, 0xD4, 0x59, 0x4B, 0xE2, 0x96, 0xC5, 0x29, 0xFC, 0xE2, 0x22,
+ 0xE1, 0x90, 0x64, 0x4F, 0xBA, 0x52, 0x20, 0x11, 0x96, 0x5B, 0x1D, 0x92, 0xC9, 0x6F, 0x32, 0x8E,
+ 0x2D, 0x21, 0xEC, 0xA0, 0xDE, 0x49, 0xBA, 0x44, 0xB7, 0x86, 0xCE, 0xA8, 0x5D, 0xB0, 0xB2, 0x80,
+ 0x14, 0x64, 0x2E, 0xA0, 0x3D, 0xB2, 0x17, 0xE2, 0xD3, 0x83, 0x09, 0x30, 0x26, 0x32, 0x90, 0x8D,
+ 0x41, 0x1F, 0x18, 0x47, 0xC0, 0xC2, 0x35, 0x47, 0xA1, 0xE5, 0x83, 0x68, 0x96, 0x4E, 0x84, 0x9C,
+ 0x2F, 0x0E, 0x64, 0xBA, 0x07, 0x18, 0x50, 0xFE, 0x1B, 0xF2, 0xD7, 0xED, 0x05, 0x3A, 0x1A, 0xE8,
+ 0xC9, 0x89, 0xCE, 0xC0, 0x45, 0x19, 0xB4, 0x3F, 0x98, 0x08, 0xAB, 0x2D, 0x32, 0xE8, 0x36, 0x58,
+ 0x14, 0xBA, 0xF1, 0x28, 0x37, 0x4D, 0xA0, 0x51, 0x53, 0xA6, 0xAE, 0xDA, 0x5D, 0xF0, 0xEC, 0x51,
+ 0xDA, 0x22, 0xDB, 0xEB, 0x6A, 0x79, 0xC6, 0x63, 0x3B, 0x03, 0x1A, 0xF7, 0x8F, 0x87, 0xBB, 0x7B,
+ 0x85, 0x56, 0x5E, 0x99, 0xCD, 0xFA, 0x4A, 0x6C, 0x13, 0xCF, 0x55, 0x8E, 0x90, 0xE7, 0xB1, 0x6B,
+ 0x73, 0xF3, 0x44, 0xAF, 0xDB, 0x05, 0xAB, 0x6B, 0xEF, 0x34, 0x56, 0xF8, 0xAC, 0x76, 0xC4, 0xD0,
+ 0xF7, 0xE9, 0x12, 0xF6, 0xF1, 0x7B, 0xB9, 0x27, 0x4D, 0xF6, 0xBF, 0x3A, 0xC9, 0x25, 0xD1, 0x08,
+ 0xF0, 0xE1, 0x0F, 0xF0, 0x0E, 0x1D, 0xBC, 0x31, 0x09, 0x2A, 0x58, 0x37, 0xC1, 0x25, 0x45, 0x7E,
+ 0x9D, 0x15, 0xEA, 0x53, 0x8B, 0xE9, 0x27, 0x7C, 0xB1, 0xEC, 0x0A, 0xC0, 0x36, 0x64, 0xBB, 0xC3,
+ 0x2F, 0xB7, 0xD3, 0x95, 0x24, 0x7D, 0xEA, 0x35, 0x42, 0xDF, 0x48, 0xF5, 0x23, 0x2E, 0xF1, 0x7F,
+ 0xE8, 0x4A, 0x4E, 0x7B, 0x38, 0xB5, 0xD8, 0x13, 0xE4, 0x73, 0x31, 0x50, 0x9D, 0x21, 0xE1, 0xD9,
+ 0xDC, 0xF5, 0x87, 0x6F, 0xC1, 0xBC, 0x9F, 0xF5, 0x1A, 0xEB, 0x61, 0x92, 0xD8, 0x10, 0x88, 0x2B,
+ 0xC7, 0x48, 0x3E, 0xC6, 0x2E, 0x9B, 0xF4, 0x20, 0x4D, 0x10, 0x5C, 0x45, 0xA2, 0x82, 0x87, 0xBE,
+ 0x96, 0x54, 0xEA, 0xE7, 0x53, 0xDC, 0x35, 0x36, 0xAD, 0x48, 0x98, 0xD8, 0xD2, 0x37, 0x0A, 0x82,
+ 0xF7, 0x55, 0x8C, 0x28, 0x01, 0x68, 0x9C, 0x8E, 0xE0, 0x44, 0x2A, 0xD5, 0x09, 0x95, 0x8F, 0x2D,
+ 0xD7, 0xE7, 0x26, 0xB9, 0xDC, 0x7D, 0x00, 0x0B, 0x5A, 0xDB, 0x30, 0xDC, 0x58, 0x3F, 0x53, 0x6D,
+ 0x14, 0xBA, 0x5C, 0x4B, 0x3E, 0xB1, 0x7F, 0x3C, 0xF8, 0x2E, 0x49, 0xB3, 0x7F, 0x05, 0x44, 0xC6,
+ 0x44, 0x5D, 0x83, 0xFC, 0xD7, 0x15, 0x3F, 0xA3, 0x55, 0x60, 0x15, 0x13, 0x38, 0xBD, 0x9C, 0x3B,
+ 0xFE, 0xF3, 0x68, 0x06, 0xD8, 0xF1, 0x7C, 0x19, 0xB4, 0x01, 0xAB, 0x5C, 0x81, 0xBC, 0x69, 0xAD,
+ 0xF5, 0xB2, 0xF6, 0x58, 0xFB, 0x03, 0xE3, 0x79, 0xE5, 0xC3, 0x63, 0xDB, 0x23, 0xA5, 0xD8, 0xE9,
+ 0x32, 0xCE, 0xA0, 0x56, 0xD6, 0xFD, 0x53, 0xA0, 0xA5, 0xB4, 0x1D, 0xE9, 0x44, 0x19, 0x27, 0xEE,
+ 0x3C, 0xE7, 0x5D, 0x11, 0x14, 0x7B, 0x56, 0xEA, 0x16, 0xB8, 0x2A, 0x4B, 0x7E, 0x7C, 0x6D, 0x7D,
+ 0xD1, 0x8F, 0x72, 0xFB, 0x75, 0x8F, 0x12, 0x5C, 0x6D, 0x1C, 0xBF, 0x40, 0xD7, 0x8E, 0x30, 0x09,
+ 0xAB, 0xAE, 0xB3, 0x7D, 0x34, 0x23, 0xCD, 0xA8, 0x69, 0xB7, 0xD7, 0x78, 0x75, 0x14, 0x82, 0xD5,
+ 0x36, 0x12, 0x9B, 0x70, 0x3E, 0x94, 0xE7, 0xA5, 0x2E, 0xF4, 0x44, 0x48, 0x82, 0x47, 0xCF, 0xE9,
+ 0xA1, 0x21, 0x28, 0x60, 0x4C, 0x60, 0x4A, 0xDB, 0xC6, 0x25, 0x0B, 0xF3, 0x5B, 0x5C, 0x34, 0x7B,
+ 0x6B, 0x8F, 0x1D, 0x6C, 0xCD, 0xA5, 0x03, 0x62, 0x24, 0xB5, 0x4E, 0x8F, 0x1B, 0x80, 0x61, 0x19,
+ 0x52, 0x95, 0xC8, 0x46, 0xEF, 0x57, 0xB6, 0x8F, 0x0C, 0xE3, 0xA1, 0xD6, 0x08, 0x16, 0xC8, 0x20,
+ 0x3C, 0x13, 0x93, 0x42, 0xDE, 0xE4, 0xE2, 0x28, 0xAC, 0x62, 0xA4, 0xCC, 0x28, 0x83, 0xB0, 0xF9,
+ 0xEB, 0xD8, 0x51, 0xA9, 0x13, 0x3C, 0x53, 0x73, 0x7A, 0x9D, 0xB5, 0xC4, 0xFA, 0xC8, 0x0D, 0xB8,
+ 0x66, 0x15, 0x8E, 0x65, 0x79, 0x08, 0xC9, 0x6E, 0x65, 0xC5, 0x09, 0x9B, 0x20, 0x7D, 0xC0, 0xBE,
+ 0xCC, 0xC3, 0x60, 0xA5, 0x10, 0xBD, 0xC9, 0x50, 0xCE, 0xE2, 0xAF, 0x16, 0xD7, 0xE0, 0xAC, 0x17,
+ 0x78, 0x35, 0x2A, 0x0A, 0xAF, 0x4C, 0x2C, 0x78, 0x78, 0x3E, 0xF4, 0x7A, 0xB2, 0x63, 0xD4, 0xBD,
+ 0x4B, 0xC2, 0x8C, 0x0C, 0x5C, 0x57, 0xBA, 0x90, 0x5C, 0x2D, 0xDB, 0x79, 0xCE, 0x4B, 0x83, 0xB6,
+ 0x3C, 0xB0, 0x7B, 0xFA, 0x7B, 0x05, 0xAD, 0x0B, 0xA0, 0xF5, 0xBD, 0x24, 0x42, 0x69, 0x2D, 0xE4,
+ 0x9B, 0x67, 0xB9, 0xBD, 0x6E, 0x18, 0x61, 0xE6, 0x30, 0x62, 0x01, 0xBB, 0x88, 0xB6, 0xC2, 0x6A,
+ 0x09, 0x87, 0x2C, 0xB9, 0xC6, 0x11, 0x54, 0xC5, 0x19, 0xA3, 0xBC, 0x54, 0xDD, 0x2C, 0x13, 0xDD,
+ 0xA1, 0xD2, 0x4D, 0x79, 0x2A, 0xE0, 0x89, 0xB0, 0x3B, 0xC1, 0xF4, 0xB8, 0xCC, 0x7A, 0xF8, 0x90,
+ 0xC2, 0xEF, 0x2F, 0x1E, 0xEC, 0xBB, 0xDC, 0x8A, 0x82, 0x9E, 0x94, 0x04, 0x30, 0x1E, 0x33, 0x66,
+ 0x8F, 0x22, 0x47, 0xE4, 0x80, 0x6A, 0x70, 0x87, 0x47, 0x95, 0x5D, 0x7F, 0x10, 0x66, 0x7D, 0x94,
+ 0xDB, 0xB2, 0xD2, 0xA6, 0x10, 0xE0, 0xBE, 0x01, 0xB2, 0x5A, 0xB2, 0x66, 0x01, 0xA2, 0xA1, 0x4E,
+ 0xB5, 0xD5, 0xBE, 0x52, 0x88, 0x11, 0xB0, 0x45, 0xB6, 0xA4, 0x0B, 0xEE, 0x50, 0x45, 0x0C, 0x9D,
+ 0x3F, 0xA3, 0x4C, 0xEC, 0x63, 0x6D, 0x99, 0x6C, 0x30, 0x7F, 0xB1, 0x27, 0x38, 0xB7, 0xBC, 0x41,
+ 0x49, 0x08, 0x7E, 0xBE, 0x84, 0x9C, 0x3C, 0x5C, 0xBA, 0x19, 0xA3, 0x00, 0xB1, 0x1F, 0xD4, 0x1B,
+ 0x80, 0x9D, 0xA2, 0xFC, 0xCA, 0x70, 0xFF, 0x15, 0x02, 0x60, 0x69, 0x12, 0x64, 0x40, 0x1D, 0xF1,
+ 0x65, 0x12, 0x52, 0x64, 0x3A, 0xAC, 0x44, 0xE2, 0x9D, 0xE3, 0x8C, 0x50, 0xD5, 0x59, 0x7E, 0x1A,
+ 0xE0, 0x26, 0x72, 0xB5, 0x52, 0xB4, 0x79, 0xB9, 0x93, 0x41, 0xA2, 0xC9, 0x5D, 0x9E, 0x65, 0x70,
+ 0x83, 0x2D, 0x3A, 0x93, 0xE4, 0xDE, 0xC3, 0x40, 0x35, 0xA2, 0x86, 0x3D, 0x9D, 0x0A, 0x9E, 0x11,
+ 0xEA, 0x81, 0xDB, 0x3B, 0x99, 0xCB, 0x46, 0xD3, 0x6B, 0x49, 0xB6, 0xDA, 0xE8, 0xF1, 0xB5, 0xA4,
+ 0x52, 0x15, 0x39, 0xAE, 0xBF, 0xA7, 0xDB, 0xEE, 0xDF, 0x41, 0x24, 0x98, 0xED, 0xF3, 0x0D, 0x12,
+ 0xBE, 0x59, 0x4E, 0x09, 0xF8, 0x50, 0xDE, 0xE2, 0x36, 0x9A, 0x12, 0xC4, 0x12, 0xF2, 0xF1, 0xF8,
+ 0x58, 0xC8, 0x86, 0x14, 0xE1, 0x39, 0x3B, 0x9A, 0xFB, 0x46, 0x7B, 0x98, 0x0D, 0x26, 0xBC, 0xA3,
+ 0x54, 0xEA, 0x01, 0x72, 0x68, 0x73, 0x2F, 0xD5, 0x08, 0x3B, 0xF3, 0x7B, 0x7A, 0x9F, 0xDB, 0x29,
+ 0x11, 0x3B, 0xF0, 0x07, 0x4C, 0x46, 0x10, 0xDF, 0xA0, 0x9D, 0x0A, 0xD8, 0x08, 0x1A, 0x7B, 0xD1,
+ 0xE1, 0x9A, 0x83, 0x77, 0x1A, 0x2F, 0x1A, 0x16, 0x77, 0x22, 0x75, 0x98, 0xED, 0x70, 0x40, 0x54,
+ 0x9A, 0x15, 0x56, 0x32, 0x93, 0xC9, 0xA2, 0xD1, 0x48, 0x54, 0x8F, 0xEF, 0x07, 0x43, 0x4D, 0x9E,
+ 0xC7, 0x07, 0x32, 0x6C, 0x6E, 0xAC, 0x79, 0x8C, 0x6E, 0x1A, 0x48, 0x99, 0xBC, 0x6A, 0x0D, 0x19,
+ 0x47, 0x5B, 0x1C, 0x3E, 0x18, 0xCA, 0x54, 0x6A, 0x7F, 0xA4, 0xAB, 0xD3, 0x2B, 0x86, 0xD1, 0x1B,
+ 0x32, 0xCB, 0x8C, 0x12, 0x1C, 0x0D, 0x28, 0x52, 0xD1, 0x02, 0x47, 0x22, 0xD2, 0xD4, 0x79, 0xDD,
+ 0xB9, 0x8C, 0x49, 0xD0, 0x26, 0x94, 0xAE, 0x0E, 0xC1, 0xA3, 0x27, 0x6F, 0x87, 0x5D, 0x30, 0xED,
+ 0xFB, 0x30, 0x13, 0x23, 0x9C, 0xC3, 0x10, 0x5D, 0x8F, 0x8A, 0x9D, 0xD8, 0x91, 0xC2, 0xA5, 0x70,
+ 0x8C, 0xC4, 0x56, 0xD0, 0x43, 0xE7, 0xAB, 0x40, 0xD4, 0x8F, 0xBE, 0x1B, 0xE4, 0xD5, 0xD2, 0xC5,
+ 0x83, 0x8C, 0x27, 0xE9, 0x3B, 0x4F, 0xDB, 0xF4, 0x79, 0xCA, 0x91, 0x89, 0xF3, 0x78, 0xEB, 0x40,
+ 0x25, 0x80, 0x73, 0xB6, 0x49, 0x8F, 0x76, 0x74, 0x70, 0xD4, 0x70, 0xDC, 0x77, 0x2F, 0xDD, 0xC2,
+ 0x1B, 0x12, 0xB1, 0xA1, 0x3F, 0xC5, 0xAC, 0x70, 0x22, 0x1F, 0xB4, 0x8E, 0x36, 0xC2, 0x5E, 0x93,
+ 0x51, 0x42, 0x93, 0xEB, 0x26, 0x13, 0xDC, 0x38, 0x03, 0x68, 0xF6, 0xE1, 0x77, 0x3C, 0x81, 0x07,
+ 0xD4, 0x55, 0x70, 0x56, 0x25, 0x0A, 0x08, 0x36, 0x6F, 0x99, 0xFE, 0x12, 0xDC, 0xA1, 0x35, 0x19,
+ 0x30, 0xAA, 0x84, 0xB5, 0xE6, 0xF6, 0x23, 0x81, 0xC4, 0x7D, 0x95, 0x35, 0x4C, 0xD5, 0xFA, 0x12,
+ 0xB4, 0x09, 0x20, 0x00, 0x5C, 0x15, 0xB2, 0xDD, 0x8B, 0x77, 0x2F, 0x97, 0xDD, 0xFD, 0x4E, 0xEF,
+ 0x20, 0x3F, 0x0F, 0x0C, 0xA6, 0xE3, 0x40, 0x12, 0xA3, 0xD1, 0x18, 0x0F, 0x88, 0x16, 0x97, 0x48,
+ 0x6B, 0x76, 0x10, 0xE8, 0x4A, 0x91, 0xA4, 0x9C, 0x05, 0x88, 0xA8, 0xC7, 0x2B, 0x3A, 0xAB, 0x87,
+ 0xE1, 0x51, 0x21, 0xE5, 0x7B, 0xD4, 0x78, 0xB7, 0x4C, 0x35, 0x7C, 0x0A, 0x27, 0x63, 0xA8, 0x15,
+ 0xCF, 0xB8, 0xEE, 0x00, 0x5C, 0xD5, 0x9F, 0x40, 0x5B, 0x8A, 0xEC, 0xA3, 0xFA, 0x64, 0x73, 0xE2,
+ 0x8E, 0x5E, 0x1F, 0x69, 0x0C, 0xD4, 0x0A, 0x95, 0x2E, 0x62, 0xD6, 0xB1, 0x7B, 0x51, 0x3E, 0x54,
+ 0x7C, 0x51, 0x00, 0xF2, 0xF0, 0x49, 0xD2, 0xB2, 0x13, 0xF6, 0x1E, 0x37, 0xC4, 0xE8, 0x2A, 0xC2,
+ 0x5D, 0x50, 0xCE, 0x31, 0xDD, 0x4F, 0x5E, 0x94, 0x8A, 0x33, 0xF3, 0x52, 0xDC, 0x9E, 0xBE, 0x1B,
+ 0xE9, 0xA2, 0x97, 0xF4, 0x4A, 0xC0, 0xCA, 0x26, 0x24, 0x2B, 0x94, 0xA3, 0xBF, 0x41, 0xD5, 0x1E,
+ 0x06, 0xFC, 0x74, 0x34, 0xCA, 0x2A, 0x61, 0x3C, 0xB2, 0x22, 0xD9, 0x24, 0xF9, 0x8C, 0x37, 0x3E,
+ 0x48, 0x1D, 0xAA, 0xBE, 0x9F, 0x0F, 0x93, 0x14, 0x94, 0x3A, 0x44, 0x7F, 0x47, 0x7A, 0x1D, 0x07,
+ 0x33, 0x4F, 0x86, 0x39, 0xF3, 0xD5, 0x23, 0xAF, 0x83, 0xF0, 0xCC, 0xFA, 0xDA, 0x86, 0x5F, 0x6B,
+ 0x28, 0x77, 0xF2, 0x28, 0x78, 0xFF, 0x7B, 0xB9, 0xB9, 0x9B, 0xF7, 0x45, 0x46, 0x86, 0x12, 0xED,
+ 0xB0, 0x93, 0x89, 0x7B, 0xFF, 0xE8, 0x93, 0xB7, 0xAD, 0x08, 0xBC, 0xB2, 0xE9, 0x53, 0xFB, 0x78,
+ 0xD6, 0xAD, 0xB3, 0x0D, 0x9F, 0xEC, 0x97, 0x49, 0xA6, 0x43, 0xAB, 0xBE, 0x5E, 0xF9, 0x9D, 0xA0,
+ 0xAE, 0x1D, 0x7C, 0x05, 0xB7, 0x2B, 0x60, 0x3A, 0x61, 0xE3, 0x69, 0xA8, 0xBA, 0x6F, 0xD5, 0x9E,
+ 0x23, 0x8E, 0x0C, 0x99, 0x03, 0x24, 0xE9, 0xDC, 0x52, 0xC5, 0x74, 0xE9, 0x14, 0x1F, 0x71, 0x5C,
+ 0x91, 0x61, 0x6D, 0x2F, 0xB2, 0xA8, 0xCE, 0x88, 0xBE, 0x8E, 0x73, 0x44, 0xF4, 0x53, 0x9B, 0x19,
+ 0x0A, 0xEC, 0xBE, 0x54, 0xF6, 0x31, 0x00, 0x91, 0xE9, 0x39, 0x72, 0x0E, 0x07, 0x6A, 0xE9, 0x46,
+ 0x5E, 0xF8, 0xF8, 0x3B, 0x30, 0x60, 0x8E, 0xD0, 0xBC, 0x05, 0x1E, 0xF5, 0xEE, 0x33, 0x6A, 0xFA,
+ 0x54, 0xCD, 0x4E, 0x8B, 0xCF, 0xEC, 0xD9, 0x9F, 0x53, 0x3A, 0xEF, 0x21, 0xC3, 0x6F, 0x09, 0xF8,
+ 0x67, 0xFD, 0x3E, 0x70, 0xE6, 0x6F, 0x63, 0x99, 0xE5, 0x4F, 0xD6, 0x70, 0xED, 0xFB, 0x3B, 0xD9,
+ 0xFF, 0xAA, 0x30, 0x5C, 0xBE, 0xB2, 0x28, 0x78, 0xE4, 0xB5, 0x26, 0x82, 0x03, 0x86, 0xB9, 0xDB,
+ 0x9D, 0xBD, 0x99, 0xD8, 0xF2, 0x70, 0x9C, 0x9D, 0x6C, 0x81, 0xFC, 0xF8, 0x2B, 0x5E, 0xD4, 0x85,
+ 0x95, 0x62, 0xEB, 0xFA, 0xEB, 0x5A, 0x09, 0xC6, 0x14, 0x51, 0xE2, 0x43, 0x62, 0xE9, 0x69, 0x31,
+ 0xB1, 0x7B, 0x8F, 0xA6, 0x4D, 0x76, 0xD5, 0x8C, 0xF1, 0xB2, 0xD5, 0x07, 0x17, 0x21, 0x64, 0x23,
+ 0xCA, 0x68, 0xF8, 0x60, 0xFF, 0x15, 0x7D, 0xB8, 0xCE, 0xBA, 0xF3, 0x92, 0x77, 0x04, 0x2F, 0x38,
+ 0x99, 0x1A, 0xF7, 0x91, 0xC9, 0x0C, 0x99, 0x0F, 0x3A, 0x58, 0x7D, 0x31, 0x01, 0xCB, 0x10, 0xBD,
+ 0xC0, 0xAD, 0x4D, 0x37, 0x6C, 0x87, 0x3E, 0x9B, 0x4B, 0xE2, 0x68, 0x72, 0x8C, 0x40, 0xED, 0x6F,
+ 0xD6, 0xC1, 0x8B, 0xA0, 0x82, 0xA7, 0x72, 0x73, 0x79, 0x8A, 0xC9, 0xFB, 0x57, 0xEE, 0xFA, 0x5D,
+ 0x15, 0x53, 0x2F, 0x81, 0x66, 0x7E, 0xC1, 0x4E, 0xEF, 0x23, 0xC2, 0xB5, 0x76, 0x61, 0xC1, 0xAC,
+ 0x55, 0x01, 0x72, 0xB6, 0x2E, 0xC9, 0x56, 0x30, 0x73, 0x77, 0xFE, 0x6F, 0x0F, 0x4F, 0xD4, 0xA3,
+ 0xA0, 0x51, 0xC1, 0xEC, 0xE9, 0xF8, 0x16, 0x7A, 0x22, 0x9F, 0x55, 0xDA, 0xA9, 0xC0, 0x31, 0x84,
+ 0xC0, 0x3F, 0x3A, 0x57, 0x9D, 0x41, 0x9B, 0x4A, 0x5E, 0x84, 0x19, 0xE5, 0x93, 0xC8, 0xAE, 0xFA,
+ 0x91, 0xD8, 0xB8, 0x98, 0x67, 0xB2, 0x8C, 0x37, 0x4B, 0x4C, 0xAA, 0xF9, 0x7C, 0xCD, 0x67, 0x50,
+ 0xB2, 0x83, 0x19, 0x88, 0x89, 0xE9, 0xD1, 0xD1, 0x29, 0xA8, 0x9C, 0x94, 0x24, 0x65, 0x1D, 0xF4,
+ 0x67, 0x9A, 0xF3, 0x91, 0xB2, 0x3B, 0xAB, 0x94, 0xE9, 0x8C, 0x16, 0xD6, 0x58, 0x17, 0x18, 0x72,
+ 0xB2, 0xBD, 0xCD, 0x1B, 0x4B, 0x8A, 0x32, 0x70, 0xDC, 0xFC, 0x97, 0x54, 0x73, 0x25, 0x74, 0x9B,
+ 0xF3, 0x90, 0x0C, 0x04, 0xDD, 0x7C, 0x1A, 0xA8, 0xD7, 0x33, 0xCD, 0xE6, 0x88, 0xAF, 0x8E, 0x96,
+ 0xD1, 0xE9, 0xFF, 0xCE, 0xEE, 0x3C, 0x1A, 0x42, 0xA5, 0xB2, 0x56, 0xB3, 0x99, 0xA3, 0x8E, 0xED,
+ 0x2D, 0xE7, 0xAE, 0xB0, 0x2E, 0x3C, 0xC6, 0x7C, 0xAA, 0xA3, 0x3F, 0xC7, 0xD2, 0x79, 0x04, 0x98,
+ 0x9A, 0xC0, 0xA4, 0x6A, 0xDC, 0x64, 0x49, 0x24, 0x4F, 0x8B, 0xFA, 0x86, 0x45, 0x17, 0xE8, 0x7E,
+ 0xF5, 0xD3, 0x8A, 0x56, 0x76, 0xBF, 0x95, 0x50, 0xE2, 0x4A, 0xE1, 0x3F, 0xF2, 0x50, 0x5E, 0x8F,
+ 0x99, 0x2C, 0xE7, 0xB9, 0x10, 0x6C, 0x99, 0x7C, 0x39, 0x6C, 0xA3, 0x39, 0xAB, 0x0B, 0xF0, 0x84,
+ 0x82, 0x7C, 0xD6, 0x59, 0x21, 0x5B, 0x85, 0xFD, 0xFC, 0xF9, 0x15, 0xC2, 0x35, 0x02, 0x52, 0xD2,
+ 0x16, 0x20, 0x3B, 0x6F, 0x27, 0xFB, 0x7F, 0x11, 0xBF, 0x05, 0xA1, 0xF1, 0x7C, 0xA1, 0x73, 0x34,
+ 0xFD, 0x40, 0x3D, 0xF0, 0x36, 0xEE, 0xC8, 0x4B, 0xC7, 0x4F, 0x35, 0x04, 0x1C, 0x69, 0x49, 0x65,
+ 0x0B, 0xCD, 0x4E, 0x3B, 0xED, 0x5C, 0xA6, 0x42, 0x11, 0xB8, 0xFC, 0x8F, 0xA9, 0x44, 0x04, 0x55,
+ 0x19, 0x12, 0xA8, 0xAC, 0xE0, 0x4F, 0x13, 0xB5, 0xA0, 0xBA, 0xAD, 0xFA, 0x84, 0x5E, 0x11, 0x95,
+ 0x4B, 0xC1, 0x19, 0x57, 0x45, 0x3E, 0x3C, 0x46, 0x92, 0x0C, 0xAD, 0x54, 0xD2, 0xDD, 0x47, 0x6F,
+ 0xF0, 0x77, 0x0E, 0xAD, 0xD2, 0x5D, 0xEF, 0x39, 0xF3, 0x67, 0xD7, 0x8D, 0x31, 0x3C, 0xCD, 0x5B,
+ 0xB0, 0x3A, 0x47, 0x4C, 0xD1, 0x16, 0xBB, 0xB2, 0xDA, 0x65, 0xF0, 0x9B, 0x82, 0x75, 0x3B, 0xF7,
+ 0x46, 0xD3, 0x12, 0xBA, 0xFD, 0x04, 0x9D, 0x2E, 0x8A, 0x3E, 0x75, 0x88, 0x9A, 0xC7, 0xF3, 0x20,
+ 0x6B, 0x9E, 0xD7, 0xD3, 0xD3, 0x39, 0x75, 0xF9, 0x76, 0x47, 0xB0, 0xEB, 0xD1, 0x3E, 0xEA, 0xD9,
+ 0xF4, 0x7F, 0x0B, 0x6C, 0xF6, 0x8B, 0x04, 0xD3, 0x6F, 0x1F, 0x6D, 0x30, 0xA0, 0xA3, 0x09, 0x45,
+ 0x57, 0x6E, 0xE2, 0x3A, 0x0E, 0xE7, 0x07, 0x98, 0x24, 0xED, 0xCB, 0x6D, 0x73, 0xB9, 0x4E, 0x09,
+ 0xE7, 0xA9, 0xDD, 0xF7, 0x28, 0xBE, 0xA6, 0x94, 0x4E, 0x58, 0x92, 0x88, 0x74, 0x91, 0x85, 0x20,
+ 0x3C, 0x78, 0xBB, 0xA4, 0x13, 0x65, 0xA6, 0x82, 0x2A, 0xCF, 0x1F, 0x2F, 0x43, 0x78, 0x43, 0x36,
+ 0x32, 0x8B, 0x99, 0xE9, 0x7E, 0xC3, 0x73, 0x39, 0x3E, 0xC3, 0xFF, 0x42, 0x29, 0x76, 0xD7, 0x99,
+ 0x3B, 0x7A, 0x0A, 0xCF, 0x7F, 0x40, 0xB7, 0x54, 0x92, 0x23, 0x18, 0x64, 0xD8, 0xD1, 0x12, 0xC4,
+ 0x91, 0xBF, 0xA1, 0x90, 0x5E, 0x03, 0xB3, 0x1D, 0xC5, 0xF4, 0xD7, 0xC7, 0x9A, 0x6C, 0x87, 0x90,
+ 0xB8, 0xD2, 0x0C, 0x66, 0x04, 0x20, 0x73, 0xA9, 0x6A, 0x73, 0xD4, 0xC5, 0x76, 0x5A, 0xBA, 0x4D,
+ 0xD1, 0x56, 0xFA, 0x99, 0xF6, 0x32, 0x90, 0x5E, 0xFD, 0x19, 0xA4, 0xCD, 0x85, 0x1F, 0x13, 0x39,
+ 0x0D, 0x2D, 0x6B, 0x01, 0xA4, 0x48, 0x59, 0x0F, 0x6E, 0x4B, 0xC2, 0xD4, 0xF4, 0x03, 0x71, 0x92,
+ 0x91, 0x0E, 0xCD, 0x5B, 0x0A, 0x48, 0xB4, 0xA2, 0x1A, 0xA4, 0xF1, 0x93, 0x6F, 0x1B, 0x90, 0x33,
+ 0xCF, 0x05, 0xF5, 0xB4, 0x0D, 0x7F, 0xE3, 0x88, 0xD7, 0x8F, 0xB6, 0x34, 0xBD, 0xEC, 0x0B, 0xA2,
+ 0x45, 0xCA, 0x3B, 0xFD, 0xB2, 0x74, 0x10, 0xC0, 0x16, 0x03, 0x77, 0x1B, 0x0C, 0xBC, 0xFB, 0x36,
+ 0x93, 0x8A, 0x95, 0x52, 0x14, 0x4A, 0x52, 0x42, 0x4E, 0x8C, 0x5E, 0x59, 0xEC, 0x68, 0xC7, 0xCE,
+ 0x8F, 0xFB, 0x15, 0x10, 0xA1, 0xDB, 0xA2, 0x6A, 0x6D, 0x49, 0x65, 0x3C, 0x7C, 0x71, 0xE9, 0x91,
+ 0xD5, 0x25, 0x08, 0x19, 0x66, 0xFD, 0x67, 0xF7, 0xC3, 0x4C, 0x1A, 0x4D, 0x6E, 0x31, 0xA0, 0x2A,
+ 0x49, 0x57, 0x97, 0xB0, 0x8E, 0xB4, 0xB6, 0x0D, 0xCE, 0xA5, 0x26, 0x52, 0x6C, 0xA3, 0xB3, 0x0E,
+ 0xC6, 0x1E, 0x28, 0xA6, 0x4B, 0xEF, 0x20, 0xD1, 0x58, 0x86, 0x64, 0xEF, 0x49, 0x40, 0x62, 0x43,
+ 0x58, 0x2A, 0x65, 0x5D, 0x8C, 0x91, 0xFE, 0xDB, 0x85, 0x2D, 0x9D, 0x66, 0x0B, 0x5B, 0xDF, 0xCA,
+ 0xFC, 0xA4, 0x35, 0x01, 0xA4, 0x0C, 0x3E, 0x82, 0xF6, 0xD0, 0xB6, 0xEB, 0x38, 0x6F, 0x6F, 0xD6,
+ 0xB0, 0x6D, 0xD5, 0xC8, 0x37, 0x2D, 0xD4, 0x3F, 0x7F, 0xA9, 0xCD, 0x95, 0xD0, 0xE0, 0xBA, 0x56,
+ 0xF2, 0xF5, 0x2F, 0x38, 0xDA, 0x23, 0x3C, 0x62, 0xC1, 0x96, 0xAC, 0xE4, 0xA5, 0xAB, 0xD3, 0xE4,
+ 0x42, 0xD6, 0x06, 0x7D, 0x2F, 0x64, 0xBC, 0x8E, 0xD7, 0x49, 0xF1, 0xA8, 0x08, 0xC0, 0xD4, 0xED,
+ 0x10, 0x53, 0x99, 0x3F, 0x7E, 0x66, 0xC8, 0x24, 0xDB, 0x12, 0x1E, 0x15, 0x30, 0x8E, 0x76, 0xD7,
+ 0xCD, 0x65, 0xD4, 0x97, 0xCB, 0xC7, 0xDD, 0x89, 0x1E, 0x28, 0x7B, 0x08, 0xED, 0x16, 0xBD, 0x78,
+ 0x21, 0x5A, 0xBD, 0x37, 0x98, 0xD8, 0xE3, 0x81, 0x6B, 0x5C, 0x96, 0x51, 0x45, 0x95, 0xED, 0x2A,
+ 0x53, 0x4B, 0xDB, 0x96, 0x66, 0xB4, 0xBF, 0x54, 0x55, 0xBC, 0x82, 0xB0, 0x31, 0x75, 0xA0, 0xA7,
+ 0x5F, 0x4D, 0xED, 0x89, 0xBB, 0x47, 0x87, 0x40, 0x68, 0xCA, 0x74, 0x3A, 0xD9, 0x3A, 0xC3, 0x10,
+ 0xBA, 0x18, 0xAF, 0xC7, 0x67, 0x0A, 0x86, 0x31, 0x08, 0xE6, 0x8A, 0xD6, 0x0C, 0xD6, 0xDE, 0xB6,
+ 0x4A, 0xD7, 0x99, 0xC6, 0x28, 0xBF, 0xD2, 0x82, 0xF6, 0x8C, 0xFA, 0xC9, 0x0F, 0x81, 0x1A, 0x9B,
+ 0xD1, 0xE5, 0x7C, 0x3B, 0x31, 0x30, 0x14, 0x27, 0x23, 0x69, 0xD6, 0x3E, 0xB2, 0x94, 0x0A, 0xC4,
+ 0xD0, 0x6F, 0x98, 0x4A, 0x42, 0xE5, 0x81, 0x51, 0x00, 0xD4, 0x46, 0x1F, 0x6A, 0x96, 0x3B, 0xB1,
+ 0x03, 0x2F, 0x81, 0x2B, 0xD8, 0xC8, 0x79, 0xCF, 0x3E, 0x3F, 0x53, 0xDC, 0x88, 0x1A, 0xF8, 0xAF,
+ 0x1C, 0xF5, 0x71, 0x0A, 0xCF, 0xE2, 0x06, 0x29, 0x76, 0xBD, 0xAA, 0x55, 0x9E, 0x87, 0x72, 0x47,
+ 0x7C, 0x74, 0x36, 0x17, 0xC7, 0xDF, 0x90, 0xA4, 0x92, 0x2C, 0x72, 0x17, 0x4B, 0xAB, 0x41, 0x7B,
+ 0xA2, 0xEC, 0x60, 0x0A, 0xB9, 0x25, 0xAF, 0xAC, 0x0F, 0x66, 0x60, 0x92, 0xC1, 0xA8, 0x5F, 0xD4,
+ 0x67, 0x3F, 0x9D, 0xF4, 0x63, 0x3A, 0x28, 0x21, 0x2A, 0x8C, 0x4A, 0x4E, 0x89, 0x0B, 0x23, 0x46,
+ 0x81, 0x8D, 0xC1, 0xE0, 0x0F, 0x87, 0x60, 0xFA, 0xA1, 0xC1, 0x71, 0x1F, 0x10, 0x37, 0xDA, 0xCC,
+ 0x65, 0xF5, 0xA0, 0x33, 0x84, 0x84, 0x36, 0x0A, 0xED, 0x28, 0x3F, 0x5A, 0xBE, 0x76, 0x95, 0xB6,
+ 0xA4, 0xBA, 0xE3, 0x92, 0xF8, 0x4B, 0x55, 0x78, 0x23, 0xBF, 0xAD, 0x7B, 0x39, 0x72, 0xAF, 0xE8,
+ 0xAC, 0xEE, 0x27, 0x69, 0x0E, 0x8C, 0x57, 0x29, 0x08, 0xDA, 0xCB, 0x35, 0x07, 0x6D, 0xA4, 0x66,
+ 0xC5, 0xF6, 0xF0, 0x73, 0x3A, 0xDC, 0xD3, 0x08, 0x79, 0x9A, 0x28, 0xCC, 0xD0, 0xCC, 0x45, 0x7C,
+ 0xED, 0x82, 0x5A, 0x14, 0x29, 0xEF, 0x7E, 0x1E, 0x80, 0x42, 0x5E, 0x36, 0xD3, 0x21, 0x48, 0x8C,
+ 0xE6, 0xBA, 0x91, 0x42, 0x54, 0xC6, 0xCF, 0x36, 0x4D, 0x68, 0xE5, 0xC3, 0x18, 0xEF, 0xCE, 0x92,
+ 0x47, 0xE7, 0x2E, 0x8F, 0xB1, 0x67, 0x88, 0xC6, 0xB4, 0xB3, 0x98, 0xF8, 0x44, 0x51, 0x6D, 0x44,
+ 0xC5, 0x11, 0xFB, 0x2E, 0xA5, 0x67, 0x48, 0xDE, 0xED, 0x7E, 0x9C, 0x6F, 0x53, 0x5D, 0xA0, 0xFF,
+ 0x9F, 0x4D, 0x2E, 0x3F, 0xB6, 0x0D, 0x61, 0x41, 0x35, 0xB7, 0x0B, 0x28, 0x8F, 0x6A, 0x29, 0xD5,
+ 0xFC, 0x25, 0x42, 0xBF, 0x04, 0x0E, 0xA7, 0xC0, 0xE9, 0xD4, 0xD0, 0x99, 0x26, 0x0C, 0x3B, 0xEE,
+ 0xE0, 0x66, 0xFB, 0x66, 0x0E, 0xEC, 0x37, 0x13, 0xE2, 0xD8, 0x2F, 0x90, 0x6B, 0x0D, 0x4E, 0x9C,
+ 0x14, 0xCB, 0xBA, 0xF0, 0xD6, 0x49, 0x55, 0xAB, 0xFE, 0x96, 0x74, 0x48, 0x07, 0xA2, 0x0B, 0x6F,
+ 0x91, 0x0B, 0x7D, 0x75, 0x60, 0xB9, 0x11, 0x1B, 0x8F, 0x48, 0x6D, 0x66, 0xED, 0xDD, 0xCC, 0x83,
+ 0x57, 0x1A, 0x2B, 0x81, 0x7F, 0xC5, 0x7B, 0x3B, 0x16, 0x92, 0x93, 0x6C, 0xC7, 0xB2, 0xC5, 0x48,
+ 0xAE, 0xB2, 0x2E, 0x4C, 0x22, 0xE8, 0xF9, 0xD4, 0x91, 0x95, 0xA9, 0xA1, 0x97, 0x48, 0x80, 0x4D,
+ 0x4D, 0x5E, 0xEF, 0x3E, 0x87, 0xD5, 0x3C, 0xF7, 0xDF, 0xFA, 0x36, 0x4A, 0xC4, 0x72, 0x0C, 0x2E,
+ 0x0E, 0xA2, 0xC6, 0x61, 0xB1, 0x3D, 0xEC, 0x5A, 0x6C, 0x9D, 0x16, 0x81, 0x13, 0x61, 0x8E, 0x7E,
+ 0x28, 0xA0, 0x3D, 0xEB, 0x8E, 0x97, 0x59, 0x0E, 0x24, 0xCF, 0x5B, 0x4D, 0x98, 0xDE, 0x01, 0xC9,
+ 0x48, 0x97, 0x8F, 0x1C, 0xCC, 0xF9, 0x6B, 0xA8, 0xC0, 0x44, 0x73, 0xEB, 0x06, 0x17, 0xB2, 0x8D,
+ 0xA5, 0xD4, 0x25, 0x87, 0x0E, 0xE2, 0x6E, 0x0D, 0x99, 0x7E, 0xCE, 0x06, 0x83, 0x99, 0x3A, 0x8C,
+ 0xE6, 0xC7, 0x99, 0xAC, 0x3C, 0xF3, 0x0C, 0x50, 0x8F, 0xA7, 0xB2, 0x2B, 0x3C, 0xCA, 0x56, 0x06,
+ 0x63, 0xA0, 0x9A, 0xB6, 0xF8, 0x84, 0x43, 0x03, 0x04, 0x07, 0x8A, 0xEC, 0x43, 0xA1, 0x3E, 0x5F,
+ 0xE2, 0x2A, 0x50, 0x02, 0xBA, 0x62, 0xDA, 0x77, 0x7A, 0xC9, 0x06, 0x50, 0xF5, 0xEE, 0xE0, 0xD0,
+ 0x85, 0xDA, 0x15, 0x54, 0x36, 0x83, 0x44, 0xC5, 0x14, 0xBD, 0x98, 0xB4, 0x37, 0x27, 0x56, 0x4B,
+ 0xB2, 0x19, 0x59, 0xEB, 0xD5, 0x95, 0x27, 0xAD, 0x94, 0x2F, 0x36, 0x8D, 0x61, 0x26, 0x95, 0xEF,
+ 0x4B, 0x05, 0x9E, 0x22, 0xDB, 0x76, 0x06, 0x67, 0xA0, 0x0D, 0x28, 0x90, 0x5D, 0x6D, 0xFF, 0xA6,
+ 0x2F, 0x2F, 0x8F, 0x1F, 0x72, 0xEA, 0x88, 0x79, 0xE2, 0xC8, 0x8B, 0xA1, 0x19, 0xC3, 0x09, 0xA3,
+ 0x21, 0x93, 0xB4, 0x74, 0xB1, 0xDF, 0x53, 0x78, 0x08, 0x25, 0x01, 0xC6, 0x83, 0x2D, 0x17, 0xD4,
+ 0x6C, 0x44, 0x1C, 0xAE, 0xFD, 0x3D, 0xE8, 0xF0, 0xA7, 0x93, 0x59, 0x3B, 0x96, 0x01, 0x5F, 0xC1,
+ 0xA4, 0x5F, 0x82, 0xA7, 0x1D, 0x9C, 0xB9, 0x60, 0x00, 0xF4, 0x02, 0x9A, 0xD0, 0xCF, 0xA7, 0x8F,
+ 0x25, 0x9E, 0x21, 0xD7, 0x47, 0x9A, 0x18, 0x9E, 0x7F, 0x39, 0x1A, 0x7E, 0x5E, 0x52, 0x44, 0x11,
+ 0x1A, 0xF0, 0xD6, 0x4D, 0x3E, 0x98, 0x2D, 0x88, 0x45, 0xDA, 0xC4, 0xBF, 0x51, 0x9F, 0x34, 0xC0,
+ 0xEA, 0x0E, 0xD1, 0x32, 0xCD, 0xB9, 0x7E, 0x16, 0x01, 0xF2, 0xD4, 0x81, 0x9E, 0x40, 0xC9, 0xBA,
+ 0xC0, 0x93, 0xFB, 0x88, 0x14, 0x8E, 0x79, 0x2F, 0x85, 0x54, 0x12, 0x29, 0x54, 0x8E, 0x4F, 0x72,
+ 0x6C, 0x3F, 0x0D, 0xB6, 0xD4, 0x27, 0x91, 0xCE, 0xAC, 0xC7, 0x7B, 0x9A, 0x77, 0xEA, 0xCB, 0xBE,
+ 0x0C, 0x53, 0xCB, 0x2E, 0x8E, 0x45, 0x3E, 0xC0, 0x95, 0x76, 0x35, 0x96, 0xF0, 0xAF, 0xA1, 0x91,
+ 0x7E, 0x64, 0xE8, 0x82, 0xA2, 0x27, 0x3F, 0x90, 0xC6, 0xE3, 0x78, 0x75, 0xC6, 0x32, 0x3B, 0xDD,
+ 0x91, 0xE4, 0x7C, 0xFD, 0x18, 0x16, 0xAC, 0xEF, 0x93, 0xEF, 0x76, 0xC4, 0x4C, 0xC8, 0x1F, 0x61,
+ 0xEF, 0xD0, 0x40, 0x0D, 0xD9, 0x9B, 0x13, 0xB8, 0xAA, 0x6E, 0xFC, 0x9F, 0x1D, 0x5E, 0x7C, 0x7F,
+ 0xB6, 0x2B, 0xCA, 0x06, 0xF6, 0xDA, 0x06, 0xE0, 0x94, 0x81, 0x8C, 0x49, 0x75, 0xD6, 0x8A, 0xA3,
+ 0xC0, 0x7A, 0x59, 0xCE, 0xFC, 0x85, 0xB4, 0xCA, 0xE5, 0xA3, 0x58, 0x64, 0x31, 0xA8, 0x41, 0x2D,
+ 0xF4, 0xCD, 0x56, 0x10, 0x2A, 0x18, 0x4C, 0x15, 0xBE, 0xD5, 0x1B, 0xAC, 0xC7, 0x68, 0xB4, 0x3C,
+ 0x60, 0x4D, 0xD0, 0xC2, 0x7A, 0xE4, 0xE1, 0x59, 0x84, 0x95, 0x5D, 0x0C, 0x1D, 0x74, 0x4E, 0x5A,
+ 0xCC, 0xBB, 0x85, 0xAA, 0xFC, 0x91, 0x81, 0x50, 0xFC, 0x05, 0xC7, 0x77, 0xC5, 0xE3, 0xCE, 0x70,
+ 0xA1, 0x35, 0xBD, 0xAF, 0x9C, 0x17, 0xB3, 0x52, 0xD0, 0xE1, 0xC4, 0x6B, 0x12, 0x00, 0x4E, 0xA3,
+ 0x2E, 0xC2, 0x45, 0xB3, 0x85, 0x1E, 0xBF, 0x4C, 0x1C, 0xC5, 0x49, 0x7A, 0xB4, 0x9D, 0xCB, 0xB9,
+ 0x2D, 0x93, 0xAF, 0xB3, 0x98, 0x30, 0xA1, 0x17, 0x93, 0x31, 0xE8, 0x79, 0xBE, 0xFB, 0xE3, 0xF6,
+ 0x8E, 0x8F, 0xBE, 0x11, 0x43, 0xCB, 0x06, 0x38, 0xDD, 0x33, 0x5A, 0x27, 0x77, 0xF7, 0x59, 0xF9,
+ 0x12, 0x8E, 0x9E, 0xAA, 0xA6, 0x99, 0x54, 0x9C, 0x26, 0xD8, 0x55, 0x39, 0x8C, 0xD0, 0x62, 0xC7,
+ 0x2B, 0xE7, 0xAD, 0x43, 0xDC, 0xFA, 0xA4, 0xB7, 0xB3, 0xB2, 0xEE, 0xDB, 0xC1, 0x1F, 0x37, 0x44,
+ 0x89, 0x30, 0xBC, 0xE6, 0x6A, 0x17, 0xEC, 0x31, 0xBB, 0x52, 0x52, 0x36, 0x99, 0x49, 0x45, 0x59,
+ 0x6A, 0x55, 0xD0, 0xC6, 0x5C, 0xAD, 0x1B, 0xE6, 0x2F, 0x1B, 0x71, 0x6A, 0x3D, 0x78, 0x3C, 0xFD,
+ 0x63, 0x6F, 0x41, 0x6B, 0x4D, 0xA7, 0x83, 0x65, 0x01, 0xFF, 0x82, 0x0E, 0x0E, 0x04, 0xFC, 0x8B,
+ 0x24, 0xD1, 0x65, 0x3B, 0xF0, 0x61, 0x78, 0x2A, 0x43, 0x4A, 0xD5, 0xDE, 0xE2, 0x7E, 0x41, 0x15,
+ 0x76, 0x08, 0xB8, 0x9B, 0x24, 0x2D, 0x2A, 0xD9, 0x3C, 0xA7, 0x17, 0x47, 0xF7, 0x88, 0xA0, 0xCF,
+ 0xDD, 0x5B, 0x08, 0xB6, 0x05, 0x25, 0x54, 0x80, 0x93, 0x83, 0x9E, 0x8D, 0xE1, 0x1F, 0xE6, 0x8E,
+ 0x08, 0x4C, 0x06, 0x26, 0xE2, 0x0B, 0xE5, 0xEE, 0xDD, 0x4D, 0xAB, 0xD0, 0x43, 0x15, 0x95, 0x66,
+ 0x8F, 0xB6, 0xF8, 0x54, 0xF2, 0xF5, 0x9F, 0x79, 0xB5, 0x08, 0x2E, 0x94, 0x8D, 0x1F, 0x00, 0x86,
+ 0xEF, 0xF2, 0xB7, 0x1C, 0x9A, 0x01, 0xA9, 0x00, 0xE2, 0x61, 0x39, 0x47, 0x52, 0xF1, 0x25, 0xA6,
+ 0xA2, 0xCC, 0x82, 0xB4, 0xE1, 0x93, 0xBE, 0xC4, 0xBF, 0x2E, 0xBA, 0x02, 0x5D, 0x65, 0x09, 0x50,
+ 0x2F, 0x36, 0x58, 0x82, 0x49, 0x9C, 0xC3, 0x78, 0xD8, 0x1D, 0xD5, 0xBC, 0xE8, 0x18, 0xA7, 0xD8,
+ 0x9C, 0xB0, 0x15, 0x7D, 0xF9, 0xE1, 0x58, 0xD3, 0x59, 0xEA, 0x13, 0xEC, 0x9F, 0xD7, 0xF3, 0x35,
+ 0x90, 0xF7, 0x29, 0xC0, 0x21, 0x7C, 0x55, 0xD4, 0x11, 0x48, 0xF7, 0x6F, 0x6A, 0x00, 0xC5, 0x25,
+ 0xE5, 0x00, 0x64, 0xC4, 0xB0, 0x31, 0xE5, 0xF2, 0x03, 0x92, 0x9A, 0x07, 0x47, 0x5E, 0xA0, 0x94,
+ 0x65, 0xAF, 0x5A, 0xB6, 0xFC, 0x4B, 0x48, 0xB6, 0x4A, 0xCF, 0x4D, 0xCA, 0x8C, 0x16, 0x77, 0x6C,
+ 0xF7, 0x99, 0xBD, 0xCC, 0x1E, 0x40, 0x55, 0xE2, 0xAA, 0xCB, 0xBF, 0xCC, 0x74, 0x92, 0xA2, 0x8A,
+ 0x64, 0xC3, 0xE6, 0x17, 0x60, 0x10, 0x72, 0xD1, 0xA0, 0x62, 0xD3, 0x06, 0xCF, 0x12, 0xAD, 0xE6,
+ 0xBE, 0xC4, 0x76, 0xD7, 0x34, 0x8E, 0xA7, 0xB4, 0x76, 0xD5, 0x9D, 0xC3, 0xA1, 0x4A, 0xCE, 0xA9,
+ 0xC0, 0x4F, 0x70, 0x15, 0x91, 0xAD, 0x41, 0x23, 0x44, 0xB8, 0x65, 0x8C, 0x44, 0x49, 0x4F, 0xB8,
+ 0xBE, 0x45, 0x49, 0xA5, 0xAF, 0x02, 0x66, 0x71, 0x58, 0xB6, 0x8D, 0x40, 0xAD, 0x4F, 0x89, 0xF4,
+ 0x6F, 0x25, 0x14, 0xB0, 0x62, 0x9A, 0xA6, 0xE8, 0x72, 0x01, 0x66, 0x02, 0xC9, 0xF2, 0xCE, 0xCA,
+ 0xBD, 0xA1, 0x3A, 0x12, 0xE4, 0xD4, 0x3A, 0x4B, 0x40, 0xC6, 0xB6, 0x29, 0x00, 0xC9, 0x92, 0x04,
+ 0x3B, 0xBC, 0xA9, 0x2E, 0xAD, 0x63, 0x7C, 0xC5, 0x84, 0xAE, 0x3D, 0x91, 0x64, 0x28, 0xB1, 0xA2,
+ 0xA7, 0x7E, 0x67, 0xD5, 0xBF, 0x8B, 0x00, 0x23, 0x37, 0x87, 0x57, 0x83, 0xA8, 0x2C, 0x13, 0x12,
+ 0x5A, 0x86, 0x67, 0x79, 0x3A, 0xF7, 0xFA, 0x2B, 0xCB, 0xC2, 0xB6, 0x20, 0xF0, 0xD2, 0x3F, 0x39,
+ 0x1B, 0x23, 0xA2, 0x11, 0x74, 0x9C, 0xA2, 0x8E, 0x91, 0x4E, 0x70, 0xB3, 0xE1, 0x85, 0x18, 0xC6,
+ 0x16, 0x4B, 0x25, 0x93, 0xF1, 0x76, 0x74, 0x4C, 0xA8, 0x9C, 0x81, 0x73, 0xE4, 0x97, 0x54, 0x2A,
+ 0x74, 0x45, 0xD7, 0x3A, 0x80, 0x36, 0x43, 0x68, 0x91, 0xAE, 0x99, 0x3B, 0xE6, 0x64, 0x28, 0xC1,
+ 0xFD, 0xE6, 0xD3, 0xFA, 0xCE, 0xE2, 0x63, 0xA2, 0x27, 0xA0, 0x50, 0x83, 0x9E, 0x90, 0xE9, 0x47,
+ 0x95, 0x27, 0x20, 0x6F, 0x82, 0x4A, 0x88, 0x46, 0xBB, 0xC6, 0xBA, 0x55, 0x72, 0xA8, 0xBD, 0x21,
+ 0xD7, 0xE7, 0xFC, 0xC2, 0xCF, 0x30, 0x43, 0x09, 0x80, 0x15, 0xDC, 0x61, 0xFA, 0xE3, 0x46, 0x03,
+ 0xD6, 0x28, 0x05, 0xC4, 0x24, 0xD3, 0xC6, 0x90, 0x36, 0x4B, 0x58, 0xE0, 0x32, 0x3A, 0x6B, 0xDD,
+ 0x95, 0xEF, 0x4A, 0xDB, 0x72, 0x8A, 0x85, 0xFD, 0x1B, 0x72, 0x48, 0xAF, 0xE1, 0x75, 0x0B, 0xAF,
+ 0x65, 0xAA, 0xDC, 0xD1, 0xBA, 0xB5, 0x6F, 0x15, 0x95, 0xE6, 0x2B, 0x9B, 0x78, 0xE3, 0xCF, 0xB8,
+ 0xB6, 0x1D, 0xE6, 0xB9, 0xB9, 0xA5, 0x20, 0x53, 0xC4, 0x50, 0xDC, 0xD2, 0x4A, 0x4D, 0x80, 0x44,
+ 0xF5, 0xFD, 0x68, 0xB0, 0x78, 0x75, 0x79, 0x08, 0x19, 0xCE, 0x4C, 0xA1, 0x85, 0x51, 0xFA, 0xCB,
+ 0xB6, 0xE6, 0x4B, 0x81, 0x42, 0x5D, 0xEA, 0xF3, 0x97, 0xC6, 0x68, 0xD1, 0x56, 0x51, 0x52, 0x48,
+ 0x3D, 0x61, 0xD2, 0x1C, 0x0D, 0x68, 0x4A, 0xC4, 0xDE, 0x06, 0x04, 0x34, 0x1C, 0xE4, 0xD1, 0x36,
+ 0xED, 0x6D, 0xA7, 0x70, 0x38, 0x89, 0x64, 0x34, 0xC3, 0xBB, 0x93, 0xA2, 0x75, 0xE6, 0x39, 0xF7,
+ 0x97, 0x1C, 0xBD, 0x8F, 0xD1, 0xAF, 0x4C, 0x98, 0xF4, 0x7D, 0xD7, 0x71, 0xEE, 0x50, 0x78, 0x72,
+ 0x86, 0xB0, 0xD4, 0xB9, 0xD0, 0xCB, 0x5B, 0xB1, 0x50, 0x55, 0xFC, 0xC2, 0xB3, 0x0B, 0x2F, 0xAF,
+ 0x54, 0x32, 0x7C, 0x77, 0x6E, 0xC8, 0x2A, 0x57, 0xBB, 0x99, 0x8E, 0xB3, 0x93, 0x37, 0x11, 0xFE,
+ 0x23, 0x2C, 0x4B, 0x33, 0x48, 0x9D, 0x13, 0x05, 0xD9, 0x90, 0xF3, 0x4D, 0xBB, 0x3C, 0x3C, 0xBE,
+ 0xF2, 0x29, 0x6A, 0xFB, 0xC9, 0x77, 0x21, 0x64, 0x3A, 0xA7, 0xA4, 0x8D, 0xC8, 0x62, 0x4D, 0xE7,
+ 0x97, 0x96, 0x2D, 0x88, 0xF7, 0xF1, 0x0D, 0x99, 0x35, 0x09, 0x2B, 0x34, 0xAF, 0x19, 0xB4, 0xBC,
+ 0x0C, 0xBA, 0x35, 0x13, 0x9F, 0x85, 0x27, 0x98, 0xD7, 0x5A, 0x98, 0x76, 0x41, 0x3D, 0xE3, 0xDC,
+ 0xB1, 0x57, 0x2F, 0x84, 0xA7, 0xAC, 0x60, 0x28, 0x0A, 0x41, 0xCA, 0xA1, 0xB6, 0xB4, 0x68, 0xA9,
+ 0x4F, 0xC8, 0xDA, 0x4A, 0x43, 0x89, 0x25, 0x36, 0xC9, 0xCF, 0x6E, 0x3F, 0x04, 0x73, 0xCB, 0xE7,
+ 0x9E, 0x2A, 0xB6, 0x04, 0xFF, 0x9F, 0x4B, 0x42, 0x7D, 0x2D, 0x74, 0xAC, 0x3D, 0x6D, 0x78, 0xC7,
+ 0xA5, 0x34, 0x9C, 0xD2, 0x8A, 0x09, 0x06, 0xF0, 0x80, 0xA9, 0x69, 0x60, 0xEC, 0x52, 0x70, 0x6B,
+ 0x34, 0x0C, 0x7E, 0xAF, 0x17, 0xA7, 0x48, 0x5E, 0xAF, 0x85, 0xF7, 0x29, 0xE4, 0x33, 0x54, 0xA2,
+ 0x44, 0x8B, 0xA0, 0x30, 0xF0, 0xAA, 0xE5, 0xAD, 0x87, 0x5E, 0xF6, 0xA8, 0x67, 0xBA, 0x4A, 0x4E,
+ 0xA8, 0x85, 0xED, 0x50, 0x2C, 0x4D, 0xBA, 0xC2, 0x89, 0x2F, 0x39, 0x64, 0x62, 0x9F, 0x4B, 0x8E,
+ 0x60, 0x5B, 0x2C, 0x5F, 0x4A, 0xFA, 0x65, 0xB3, 0xCD, 0x52, 0x93, 0x43, 0xC1, 0x71, 0x3E, 0xE7,
+ 0xFB, 0x78, 0xAD, 0x32, 0xEC, 0xF0, 0xB8, 0x2C, 0x72, 0xEF, 0xD8, 0x37, 0xCA, 0x80, 0xFB, 0x4F,
+ 0x2C, 0x18, 0xF4, 0x6D, 0x88, 0x5E, 0xCB, 0x07, 0xB7, 0xB3, 0x9C, 0x05, 0x58, 0x84, 0x71, 0xB1,
+ 0xE1, 0x11, 0xD4, 0xC9, 0x63, 0xAE, 0x23, 0x82, 0xEB, 0xF9, 0x48, 0x97, 0xCA, 0x26, 0x30, 0xC2,
+ 0xF1, 0x37, 0x8E, 0xE6, 0x53, 0x08, 0x16, 0x5E, 0x2A, 0x24, 0x95, 0xFB, 0x92, 0x68, 0xF5, 0xFC,
+ 0x34, 0x70, 0x98, 0x6E, 0x2C, 0x54, 0x97, 0x81, 0x11, 0xFC, 0x95, 0xEF, 0xCA, 0xD3, 0xBF, 0xC3,
+ 0xB5, 0xB5, 0xC0, 0xC7, 0xCE, 0xF3, 0x22, 0x8C, 0x9F, 0xD7, 0xC7, 0xA2, 0xFC, 0x95, 0xEE, 0x69,
+ 0x94, 0x20, 0x16, 0x5B, 0x55, 0xA4, 0x48, 0x66, 0x2A, 0x70, 0x91, 0xD5, 0x61, 0x32, 0xBB, 0x34,
+ 0x61, 0x13, 0x00, 0x59, 0xEA, 0xB7, 0xDE, 0xAE, 0xE0, 0xA2, 0xEF, 0x3B, 0xF0, 0x1C, 0xA9, 0xC2,
+ 0xFC, 0x02, 0xE3, 0x69, 0x8E, 0xBA, 0xED, 0xAD, 0xBA, 0x37, 0x52, 0x71, 0x4E, 0x8A, 0xC3, 0xA1,
+ 0x77, 0xA8, 0xDF, 0xA5, 0x3E, 0x95, 0xF7, 0xEE, 0xEF, 0xD7, 0xBE, 0x46, 0x4F, 0x65, 0x7A, 0xB5,
+ 0x8C, 0xBB, 0xB7, 0x45, 0xB9, 0x36, 0xA2, 0xD1, 0x44, 0xBE, 0x10, 0x8F, 0x9F, 0x29, 0xDF, 0xFC,
+ 0x4E, 0xC0, 0x69, 0x49, 0x8E, 0x05, 0x07, 0x7D, 0x9E, 0xA2, 0x0B, 0x6E, 0x92, 0x47, 0x18, 0x99,
+ 0xF2, 0xF7, 0x62, 0x5C, 0x38, 0xD9, 0xE6, 0x92, 0x82, 0x37, 0x44, 0xB7, 0xAB, 0x8B, 0x7D, 0xB5,
+ 0x4D, 0x3E, 0xA4, 0xF3, 0x8F, 0x6B, 0x0B, 0x8B, 0x60, 0xDD, 0x55, 0x2D, 0x9E, 0xB7, 0xF8, 0x79,
+ 0x9B, 0xCA, 0x8F, 0x76, 0x78, 0x7B, 0x1B, 0xE7, 0xDB, 0x55, 0xBA, 0x71, 0x0B, 0x7F, 0x7D, 0xEC,
+ 0xF4, 0x2A, 0x7D, 0x7E, 0xA6, 0xD5, 0xE6, 0x7C, 0x50, 0x6E, 0x11, 0x3A, 0x00, 0x33, 0xA5, 0xB7,
+ 0xF1, 0x40, 0xF5, 0xDE, 0x62, 0xD5, 0xC9, 0x18, 0x76, 0x70, 0x7C, 0x09, 0x5A, 0x88, 0x2F, 0x0F,
+ 0x5C, 0xC9, 0x80, 0xB1, 0xEA, 0x55, 0x05, 0x4F, 0x7E, 0x51, 0x25, 0xF8, 0x82, 0x76, 0xF6, 0x0B,
+ 0x5E, 0xC5, 0x7E, 0xCE, 0xB8, 0x59, 0x2B, 0x2C, 0x8B, 0x0B, 0x43, 0xDC, 0xC7, 0x74, 0x96, 0x13,
+ 0xBA, 0x34, 0xD7, 0x69, 0x11, 0x6C, 0x01, 0x4E, 0xC2, 0x8A, 0xD7, 0x38, 0x10, 0x20, 0xB8, 0xAB,
+ 0x20, 0xA1, 0xA7, 0x10, 0x20, 0xD3, 0x61, 0x07, 0x01, 0x5C, 0x48, 0x89, 0x87, 0x93, 0xFE, 0x36,
+ 0x05, 0x28, 0x52, 0x07, 0x35, 0xF0, 0x05, 0x75, 0x0D, 0x26, 0x95, 0x77, 0xEC, 0x41, 0x99, 0xBF,
+ 0xEB, 0xC4, 0xD8, 0xD1, 0x0A, 0x08, 0x78, 0xC6, 0x6A, 0xEA, 0x52, 0x05, 0x1D, 0x45, 0x5D, 0x87,
+ 0x80, 0x94, 0x42, 0xD9, 0x5A, 0x1F, 0xBA, 0xAE, 0x11, 0x86, 0xA1, 0xCC, 0xF9, 0xBA, 0x29, 0xE4,
+ 0xF2, 0x07, 0x91, 0xF1, 0xDF, 0x17, 0x61, 0x56, 0xF5, 0xEC, 0x19, 0xCC, 0x1F, 0xB0, 0xF5, 0x22,
+ 0x9F, 0xD1, 0x06, 0x93, 0x6B, 0xE5, 0x98, 0xF6, 0xBE, 0xE1, 0x3C, 0x0E, 0x62, 0xF5, 0x77, 0xF6,
+ 0x27, 0x7E, 0xDB, 0xB2, 0x96, 0x13, 0xCE, 0x0E, 0x43, 0x41, 0x14, 0x52, 0x35, 0xAF, 0x63, 0x36,
+ 0xAE, 0x97, 0x2E, 0xB0, 0x22, 0xCA, 0xC1, 0xEC, 0xC9, 0x98, 0x93, 0xBD, 0xCD, 0x8E, 0x90, 0x6B,
+ 0x12, 0x30, 0x1D, 0xAA, 0x6C, 0xB4, 0xEF, 0x3B, 0x0D, 0x24, 0xBE, 0x28, 0xB0, 0xD1, 0xAD, 0x06,
+ 0xDA, 0x82, 0x16, 0x0F, 0xB2, 0xD4, 0xDB, 0x2A, 0xAC, 0x7B, 0x94, 0x62, 0xF3, 0x3F, 0x29, 0xA6,
+ 0xF3, 0x6F, 0xC5, 0xD6, 0xBB, 0x81, 0x53, 0xAB, 0x86, 0xE5, 0xA5, 0x63, 0x02, 0xDA, 0xF3, 0x88,
+ 0x8E, 0xBF, 0xB5, 0x56, 0x1A, 0x79, 0x4D, 0x39, 0xCA, 0xDB, 0xC9, 0xD4, 0x78, 0xFD, 0x4C, 0xDB,
+ 0x03, 0x10, 0x84, 0x83, 0xAD, 0x4A, 0x13, 0xCF, 0xB8, 0xD7, 0x58, 0x34, 0x51, 0xD8, 0x13, 0x25,
+ 0x99, 0x46, 0x9E, 0xD6, 0xD7, 0xDB, 0xE6, 0x2F, 0x6F, 0xAC, 0x12, 0xF1, 0x08, 0xB1, 0x07, 0xB9,
+ 0x73, 0x61, 0xDB, 0x68, 0xAE, 0x3A, 0xC3, 0xBC, 0x74, 0x02, 0xD3, 0x55, 0x8F, 0x69, 0x8A, 0x2E,
+ 0x51, 0x84, 0xEA, 0x19, 0x6B, 0xA9, 0x52, 0xC7, 0x06, 0x47, 0x79, 0xFB, 0xD0, 0x98, 0xC6, 0x7D,
+ 0xF2, 0xBA, 0xF6, 0xE4, 0xEC, 0x10, 0x69, 0xE0, 0xB8, 0x52, 0x2C, 0x7F, 0xB8, 0x9C, 0x4F, 0xB2,
+ 0x5A, 0x48, 0x39, 0x05, 0x81, 0xA8, 0x5E, 0x91, 0xD6, 0xFA, 0x84, 0xC9, 0xE6, 0x12, 0xC6, 0x09,
+ 0x44, 0x3A, 0x69, 0xE9, 0x9C, 0x20, 0x9C, 0x4B, 0x6E, 0x39, 0xC8, 0x0A, 0xC8, 0x65, 0x28, 0x96,
+ 0xA6, 0x6F, 0x3B, 0x07, 0x5E, 0xB0, 0xF1, 0x91, 0x27, 0x99, 0x38, 0x23, 0xF9, 0x0B, 0xF1, 0xE1,
+ 0xC6, 0x01, 0xFB, 0x64, 0xA1, 0x41, 0x4D, 0x49, 0xEA, 0xC6, 0x35, 0xF4, 0x6A, 0x73, 0xE9, 0x9E,
+ 0x6A, 0x2F, 0xA0, 0x00, 0x06, 0xF7, 0xF6, 0x8C, 0xD7, 0x3D, 0x7A, 0xC5, 0xEF, 0xBD, 0x91, 0xFD,
+ 0x76, 0x8D, 0x78, 0xAA, 0x2D, 0x14, 0x0F, 0x01, 0xC8, 0x70, 0x96, 0xF9, 0x8F, 0x83, 0x61, 0xC7,
+ 0xE4, 0xB2, 0xA6, 0x52, 0xBB, 0xE5, 0x1B, 0x49, 0x16, 0xCC, 0xBE, 0xD7, 0xAF, 0x76, 0xA7, 0x38,
+ 0x44, 0x4D, 0xF2, 0xAC, 0x23, 0xD2, 0x50, 0x2C, 0xE7, 0x4E, 0xDC, 0xBA, 0xFD, 0xCB, 0x0C, 0x8A,
+ 0xEA, 0xE7, 0x7A, 0x00, 0xEE, 0x14, 0xAB, 0xC9, 0x52, 0xCE, 0xA4, 0x38, 0x40, 0xE0, 0x75, 0x5E,
+ 0x33, 0xCA, 0xA5, 0x20, 0xB7, 0x5D, 0xF9, 0x09, 0x1A, 0xA8, 0xBD, 0xBE, 0x34, 0xBF, 0xD8, 0x12,
+ 0xF9, 0xF0, 0xC2, 0x63, 0xEE, 0xFF, 0xA9, 0xBF, 0x5C, 0xD7, 0xD3, 0x3A, 0x40, 0xEC, 0xE6, 0x32,
+ 0x86, 0xA7, 0xA7, 0x0B, 0xA8, 0x87, 0x7A, 0x3E, 0x5E, 0x53, 0x4B, 0x85, 0x53, 0xFA, 0x9F, 0xA2,
+ 0xAB, 0xC7, 0x88, 0x16, 0x77, 0x4D, 0x35, 0x06, 0xFE, 0xDA, 0x4A, 0x47, 0x4F, 0x1C, 0x7C, 0xFF,
+ 0x4C, 0xB2, 0x84, 0x2D, 0x4F, 0x51, 0x7F, 0x65, 0x4E, 0x1C, 0xA7, 0x92, 0xE6, 0xCD, 0x80, 0x0A,
+ 0xA3, 0xE8, 0xB8, 0x7A, 0x42, 0xBC, 0x3A, 0x09, 0xEC, 0xE4, 0x7D, 0x2F, 0xBC, 0x27, 0x2A, 0xBD,
+ 0x8C, 0x6E, 0xE4, 0x48, 0x54, 0x73, 0x6D, 0x1F, 0x15, 0xCD, 0x37, 0x39, 0x64, 0x12, 0xE3, 0xE4,
+ 0x49, 0x35, 0xCA, 0x83, 0x84, 0xE3, 0xE2, 0x58, 0xEB, 0xEB, 0x8D, 0xC7, 0x3B, 0x9E, 0xB0, 0xD4,
+ 0x74, 0xF9, 0xC9, 0x09, 0x58, 0x15, 0xC4, 0x43, 0x18, 0x1E, 0x1D, 0x6D, 0xE2, 0xB1, 0xE7, 0x2A,
+ 0x50, 0xC6, 0x4F, 0x32, 0x39, 0xAE, 0xC8, 0x9E, 0x6C, 0xFF, 0xF7, 0xD2, 0xD9, 0xA6, 0x13, 0x85,
+ 0x82, 0xA2, 0xF7, 0x0A, 0xF7, 0x2E, 0x52, 0x96, 0x41, 0xCE, 0x84, 0x1E, 0x54, 0x53, 0x4A, 0x63,
+ 0x34, 0xA2, 0x56, 0x3A, 0xD1, 0xAF, 0x52, 0xDF, 0x33, 0x39, 0x37, 0xBD, 0x78, 0x52, 0x01, 0x95,
+ 0x52, 0xA1, 0x39, 0xE0, 0xEB, 0x33, 0xC5, 0x05, 0x5B, 0x02, 0xB7, 0xFE, 0xA7, 0x89, 0x7F, 0xE2,
+ 0x30, 0x27, 0xF4, 0xD4, 0xBF, 0x07, 0x44, 0xF8, 0x6A, 0x56, 0x82, 0xE1, 0x87, 0xE1, 0xFB, 0xBA,
+ 0x06, 0xD1, 0x75, 0xBB, 0x32, 0x69, 0x61, 0x6B, 0x45, 0x68, 0x87, 0x2C, 0x4C, 0xF2, 0xBE, 0xAD,
+ 0x27, 0xB7, 0x7B, 0x9E, 0xB2, 0x24, 0x15, 0x44, 0x89, 0x2D, 0x2A, 0xF2, 0x10, 0xE5, 0x0D, 0x60,
+ 0x44, 0xC8, 0x25, 0x03, 0xAD, 0xC9, 0x64, 0xAA, 0xD6, 0x90, 0x05, 0x14, 0xD7, 0xFE, 0xBF, 0x3B,
+ 0x0F, 0xD8, 0x76, 0xD9, 0x76, 0x24, 0xE8, 0xA5, 0xF1, 0x0C, 0xAA, 0x78, 0x4D, 0xF1, 0x43, 0x8A,
+ 0x5E, 0x8B, 0x40, 0xC2, 0x15, 0xD9, 0x3E, 0x29, 0x75, 0x8F, 0x8D, 0x63, 0x32, 0x4B, 0xC4, 0xFD,
+ 0x4F, 0x7C, 0x9C, 0x33, 0x6A, 0x21, 0x17, 0xE6, 0xF7, 0xA5, 0x03, 0x3D, 0x68, 0x3E, 0xC9, 0x2A,
+ 0x46, 0xCB, 0xB1, 0x5F, 0x69, 0x67, 0xDC, 0x28, 0xD7, 0xA9, 0x0D, 0x08, 0xAA, 0x55, 0x9B, 0xB1,
+ 0x52, 0x7B, 0x20, 0x28, 0xC2, 0x67, 0x77, 0xBA, 0xB1, 0xC4, 0x81, 0x70, 0x5E, 0xDD, 0x46, 0x89,
+ 0x16, 0xC9, 0x16, 0x5E, 0x79, 0x16, 0xEC, 0x7C, 0x5C, 0x5B, 0x6B, 0x15, 0x74, 0x28, 0xE4, 0xB7,
+ 0xFC, 0x59, 0xB7, 0x22, 0xB7, 0x5C, 0x8D, 0x7A, 0xB2, 0x4F, 0xE4, 0x29, 0x2D, 0xD1, 0x10, 0xBF,
+ 0xCA, 0x92, 0x90, 0x85, 0x51, 0x76, 0x48, 0x1D, 0x4F, 0x7B, 0x40, 0xC1, 0xB2, 0xED, 0x91, 0x20,
+ 0x96, 0xD3, 0xD4, 0x46, 0x10, 0xD0, 0xA6, 0xF4, 0x3F, 0x0B, 0x7D, 0x6D, 0x6C, 0x04, 0xC9, 0x94,
+ 0x23, 0x97, 0x2F, 0xBD, 0x75, 0x06, 0x68, 0x85, 0xCB, 0x2D, 0xFD, 0xA9, 0xD1, 0xD5, 0xD2, 0x98,
+ 0x60, 0x74, 0xC8, 0x1D, 0xAD, 0x8A, 0x21, 0xD3, 0x54, 0x8F, 0x20, 0xBE, 0x06, 0x3D, 0x34, 0xE4,
+ 0x95, 0x78, 0x55, 0x8E, 0x70, 0xC5, 0xB5, 0x3B, 0x68, 0x58, 0x2F, 0xC2, 0x16, 0xEC, 0x7F, 0x85,
+ 0xC0, 0x05, 0x28, 0xB7, 0xBF, 0x33, 0x3F, 0x0D, 0x83, 0xC7, 0x93, 0x36, 0x97, 0x24, 0x18, 0x0A,
+ 0x43, 0x28, 0xFF, 0x90, 0xA1, 0x38, 0xF5, 0xCE, 0x27, 0xCA, 0xD7, 0x47, 0x46, 0xBD, 0x40, 0x7A,
+ 0xF2, 0x49, 0x2D, 0x56, 0x1B, 0xAD, 0xDA, 0x00, 0x51, 0x74, 0x44, 0xA3, 0x09, 0x25, 0xE7, 0xB9,
+ 0x13, 0xA8, 0x51, 0xED, 0xED, 0xDB, 0xB1, 0x54, 0xFB, 0x5F, 0x38, 0x30, 0x0D, 0x4B, 0x4B, 0x92,
+ 0xB5, 0x2B, 0x45, 0x5E, 0x41, 0xFB, 0x27, 0xC4, 0x17, 0xDF, 0x82, 0x3D, 0x9C, 0xD3, 0xF9, 0x8A,
+ 0x0E, 0x4A, 0x2F, 0xA1, 0x4D, 0xF4, 0x7C, 0x26, 0xFB, 0x8A, 0xA9, 0xBC, 0xB3, 0xE8, 0x3D, 0x11,
+ 0x5A, 0x2B, 0x9D, 0x7D, 0xDA, 0xE7, 0x85, 0x19, 0x9F, 0x78, 0x70, 0x5A, 0x5C, 0xDE, 0x88, 0x40,
+ 0x8C, 0x09, 0x5A, 0x0A, 0x2E, 0x0C, 0x6E, 0xF2, 0xFA, 0x9A, 0x00, 0xAC, 0x2A, 0x29, 0xB1, 0x30,
+ 0xB1, 0x19, 0x0A, 0x1E, 0x01, 0x6C, 0x02, 0x2F, 0x6F, 0x1D, 0xDF, 0x77, 0x45, 0xF6, 0x81, 0x1F,
+ 0xBC, 0x2D, 0x55, 0x2D, 0x31, 0xC9, 0x34, 0x9A, 0xE3, 0x04, 0xC7, 0xD1, 0x1D, 0xA2, 0xE1, 0x5D,
+ 0xD4, 0xFF, 0x2F, 0xD5, 0x74, 0x1B, 0xAF, 0x49, 0xA3, 0x2A, 0xE2, 0x31, 0x8D, 0x7E, 0x3B, 0x21,
+ 0x64, 0x54, 0x8D, 0x52, 0x64, 0x58, 0x96, 0xFF, 0x83, 0x4F, 0x43, 0xA8, 0x4A, 0xDD, 0xB0, 0xFE,
+ 0xC7, 0x4F, 0x8C, 0xDD, 0xA3, 0x02, 0x30, 0xCA, 0xC2, 0xB2, 0x59, 0x17, 0x5D, 0xB3, 0xD7, 0x0A,
+ 0x66, 0x4D, 0xF6, 0x7B, 0x38, 0xA2, 0x67, 0xDA, 0x37, 0x3C, 0x69, 0xF0, 0x89, 0xE5, 0x57, 0xBA,
+ 0xAF, 0x7C, 0x0C, 0x64, 0x3A, 0x5B, 0x8D, 0xD5, 0x33, 0xE4, 0xBC, 0xFD, 0x45, 0x44, 0x04, 0x23,
+ 0xDB, 0x03, 0x3D, 0xCD, 0xA1, 0xA8, 0x6A, 0xE6, 0x9E, 0xDB, 0x1D, 0xBF, 0x10, 0xBB, 0x32, 0xD8,
+ 0x6A, 0x47, 0xDB, 0x83, 0x24, 0xE4, 0x1B, 0x4C, 0xC3, 0xDE, 0x5B, 0x3D, 0xD5, 0x1E, 0x69, 0x51,
+ 0xA3, 0x94, 0xFF, 0x97, 0x54, 0x44, 0xDF, 0x20, 0x41, 0xD8, 0xE2, 0xFE, 0x72, 0xC7, 0x0B, 0x99,
+ 0x0B, 0x1D, 0x49, 0x09, 0xA9, 0xBE, 0xE4, 0x66, 0xD1, 0x16, 0x49, 0x8A, 0xE9, 0xBD, 0x7D, 0xEF,
+ 0xCF, 0xE2, 0x69, 0x2A, 0x51, 0x28, 0xCC, 0xD6, 0x80, 0xC7, 0xCE, 0x9C, 0x9E, 0x20, 0x1D, 0x42,
+ 0x00, 0x5F, 0x3C, 0xCC, 0x0B, 0x10, 0x40, 0xE3, 0x7A, 0xB6, 0x2A, 0x34, 0xB6, 0x44, 0x50, 0x6F,
+ 0x9B, 0x6E, 0xC5, 0xE5, 0xE1, 0x94, 0x0D, 0x0C, 0x9B, 0xF7, 0x35, 0x91, 0xFD, 0xCE, 0x65, 0x1A,
+ 0x79, 0xE1, 0x20, 0x69, 0xAD, 0xB4, 0x92, 0xC2, 0x58, 0x85, 0xF9, 0x45, 0x1C, 0x98, 0x46, 0xC7,
+ 0x23, 0xA4, 0xDD, 0x81, 0x7C, 0x93, 0x81, 0x55, 0x1D, 0x47, 0x7B, 0x23, 0x18, 0xB4, 0x7D, 0xFF,
+ 0x03, 0xA5, 0xE0, 0x78, 0xE3, 0x57, 0xA3, 0x17, 0xB3, 0xB1, 0x01, 0x88, 0x03, 0xA9, 0x10, 0x0B,
+ 0x35, 0xFE, 0x67, 0xFA, 0x67, 0x6F, 0xD3, 0xF5, 0x25, 0xCB, 0x75, 0xA0, 0x4F, 0x39, 0xD6, 0x5B,
+ 0xD0, 0x65, 0xD7, 0xA8, 0x77, 0xBB, 0xD8, 0x60, 0xAF, 0x2B, 0x9D, 0x37, 0x19, 0xFA, 0x83, 0xF8,
+ 0x52, 0x57, 0xDA, 0x2D, 0xEF, 0xBC, 0x17, 0xAA, 0xC6, 0x97, 0xF4, 0xC5, 0xEF, 0x16, 0x81, 0xA7,
+ 0xBF, 0x27, 0x49, 0xEA, 0x7A, 0x23, 0x6F, 0x31, 0x6D, 0x62, 0x5B, 0xB6, 0xF3, 0x61, 0xE1, 0xFA,
+ 0x87, 0x72, 0xE8, 0xE1, 0x0C, 0x89, 0x6B, 0x53, 0xF0, 0x7F, 0x09, 0x9D, 0x7E, 0x1D, 0x8C, 0x02,
+ 0xFE, 0x29, 0xAA, 0xBD, 0x6C, 0xB1, 0x68, 0x67, 0xCC, 0xA6, 0xEA, 0xAE, 0xA9, 0x84, 0xDD, 0xC4,
+ 0x44, 0xF7, 0x2E, 0x22, 0x8C, 0xA5, 0x07, 0xE7, 0xEE, 0xE5, 0xC6, 0xB5, 0xF3, 0x5A, 0x41, 0xD4,
+ 0x02, 0x2A, 0xE6, 0x1E, 0x79, 0x5C, 0x4B, 0x1B, 0xED, 0x9F, 0x2A, 0xBA, 0xB6, 0x0E, 0x9B, 0xAB,
+ 0x83, 0x2D, 0xF0, 0x84, 0x35, 0x83, 0xA2, 0xF4, 0x2C, 0xB6, 0x2F, 0x4C, 0xE9, 0x8B, 0xF6, 0xA4,
+ 0x5C, 0x8A, 0xEC, 0x01, 0x9A, 0x2E, 0x80, 0xC0, 0x6C, 0x5B, 0xAC, 0x92, 0x07, 0xAB, 0x93, 0x2D,
+ 0x5D, 0x77, 0x7A, 0xA3, 0xA1, 0xDB, 0x8F, 0x05, 0x51, 0xD9, 0x92, 0x98, 0x1E, 0xD1, 0x23, 0x01,
+ 0xEC, 0x7E, 0xB7, 0xB8, 0x4F, 0xA7, 0xCD, 0xCC, 0x5F, 0x76, 0x64, 0xDD, 0x06, 0xA9, 0xC9, 0x98,
+ 0xD2, 0x3C, 0xB8, 0x06, 0x4B, 0x79, 0x28, 0x9E, 0x14, 0x10, 0xFB, 0x39, 0xDC, 0xF9, 0xE1, 0xE5,
+ 0x27, 0xFB, 0x89, 0x8C, 0x66, 0xB6, 0xFE, 0xC1, 0x13, 0x0F, 0x7C, 0xAA, 0x6A, 0x02, 0x45, 0xB1,
+ 0x18, 0xD8, 0x3A, 0x2C, 0x94, 0x09, 0x8B, 0x66, 0xED, 0xE9, 0xD7, 0x5E, 0xA2, 0x48, 0x01, 0x8D,
+ 0x8D, 0xC7, 0x05, 0x6A, 0xD3, 0x67, 0x07, 0xFC, 0x22, 0x28, 0xE8, 0x0F, 0xCD, 0xFF, 0x12, 0xD5,
+ 0xED, 0x64, 0x3F, 0xE5, 0x89, 0x08, 0x41, 0x2C, 0x49, 0x4D, 0x07, 0x7D, 0xF8, 0x2C, 0x28, 0xB5,
+ 0x2F, 0xCB, 0xF6, 0xC0, 0x68, 0xDB, 0x0E, 0xFF, 0x92, 0x06, 0xCC, 0x15, 0x17, 0xDD, 0xA7, 0xF4,
+ 0xA9, 0x7C, 0x49, 0xFF, 0x91, 0x8B, 0xBE, 0xA5, 0xDC, 0x43, 0x5B, 0xD9, 0x17, 0x17, 0x4A, 0xBC,
+ 0x27, 0xAC, 0x90, 0xC4, 0xC7, 0x68, 0x9F, 0x84, 0x29, 0x4E, 0x52, 0xF4, 0x6D, 0x29, 0x30, 0xA7,
+ 0xB4, 0x87, 0x42, 0x4F, 0x93, 0x1D, 0x71, 0x7A, 0xC4, 0x97, 0x7C, 0xEB, 0xB1, 0x55, 0xDA, 0x95,
+ 0xA5, 0x48, 0xC8, 0xA3, 0xFF, 0x2E, 0xE0, 0x2F, 0x5B, 0xE1, 0xA3, 0x2A, 0x93, 0x2A, 0x34, 0x30,
+ 0x19, 0x63, 0x45, 0xB1, 0x7D, 0x68, 0x95, 0x23, 0xCD, 0xE1, 0x79, 0x1B, 0x4D, 0x10, 0x45, 0x0C,
+ 0x9B, 0xF3, 0x7A, 0x13, 0x78, 0xC1, 0x06, 0x09, 0x7E, 0x24, 0xAE, 0xDE, 0xB7, 0xE0, 0x91, 0x12,
+ 0x4C, 0x0C, 0xA3, 0x0F, 0xA9, 0xFE, 0xB5, 0x2E, 0x13, 0x16, 0x87, 0x9F, 0x89, 0xBD, 0x33, 0x72,
+ 0xF9, 0x34, 0xBC, 0x50, 0xA3, 0x60, 0x49, 0xED, 0x65, 0x04, 0xD3, 0xB7, 0x94, 0x95, 0x8D, 0xFA,
+ 0xE9, 0xE5, 0x8C, 0x6F, 0x72, 0xEB, 0xE6, 0x21, 0x77, 0x6E, 0xCE, 0x77, 0xEE, 0xFC, 0xDA, 0x4E,
+ 0x93, 0xDA, 0x1E, 0xCD, 0xA3, 0xB0, 0xB1, 0x40, 0x37, 0xC8, 0x7B, 0x3E, 0xFF, 0x8D, 0x99, 0xAF,
+ 0xB7, 0x79, 0x18, 0x6D, 0xF6, 0xB0, 0x7E, 0xA1, 0xFD, 0x0F, 0x55, 0x98, 0x65, 0xCD, 0x74, 0x64,
+ 0x4C, 0x97, 0x63, 0x48, 0xC1, 0x0C, 0x24, 0xBE, 0xC9, 0x92, 0x8E, 0x8F, 0x15, 0x66, 0x0A, 0x02,
+ 0x13, 0xC2, 0x5B, 0x9F, 0xB2, 0x03, 0xD1, 0xC3, 0x0A, 0xCE, 0x56, 0x6E, 0x26, 0xD1, 0x55, 0x4E,
+ 0xFA, 0xE9, 0xCB, 0x48, 0xA5, 0x74, 0xCC, 0x59, 0x54, 0x92, 0x40, 0x15, 0x07, 0x5D, 0x92, 0xAD,
+ 0xCF, 0x7C, 0x75, 0x2D, 0x0C, 0xEE, 0x5B, 0x75, 0x99, 0xB5, 0x66, 0x9B, 0xC6, 0x62, 0xAC, 0x84,
+ 0xC8, 0x69, 0x53, 0xA3, 0xD3, 0xAC, 0x64, 0x1F, 0x3C, 0x6B, 0xD4, 0xB8, 0x57, 0x79, 0x20, 0xDB,
+ 0x28, 0xD8, 0x0B, 0xB0, 0x40, 0x72, 0x76, 0x40, 0x51, 0xEC, 0xBC, 0x36, 0x4A, 0xC7, 0x01, 0x55,
+ 0x1D, 0x76, 0xE8, 0xB3, 0xF6, 0x5B, 0x38, 0x9A, 0x01, 0xFE, 0x00, 0xE0, 0x5B, 0xF6, 0x3F, 0x5D,
+ 0xC2, 0x55, 0x0E, 0x1A, 0xB6, 0xC1, 0x88, 0x43, 0xB9, 0xB8, 0xE5, 0xDA, 0xF9, 0x6D, 0xBC, 0x96,
+ 0x3F, 0xC5, 0xB3, 0xC2, 0x14, 0xFF, 0xB8, 0x24, 0x70, 0x4D, 0x8F, 0xF2, 0x65, 0xD9, 0x52, 0xE2,
+ 0x6F, 0x95, 0x47, 0x0F, 0xEF, 0xD3, 0xBD, 0xF0, 0x93, 0xF6, 0x77, 0x7C, 0x4B, 0xDD, 0x09, 0xA1,
+ 0x9D, 0x14, 0xB7, 0x09, 0x75, 0x5A, 0xD5, 0xE7, 0xCD, 0xB4, 0x4E, 0xC9, 0xB2, 0xCC, 0xEB, 0xA7,
+ 0x13, 0x8D, 0xF1, 0xBE, 0x7B, 0xF1, 0x3C, 0x03, 0xDC, 0xAE, 0x73, 0x50, 0xC1, 0x79, 0xDC, 0x1E,
+ 0xC1, 0x3A, 0xD1, 0x23, 0x9D, 0xF1, 0xF3, 0x87, 0x18, 0x5B, 0x97, 0x09, 0x53, 0xF2, 0x61, 0x89,
+ 0x2D, 0xD7, 0x20, 0x3F, 0x40, 0x85, 0x83, 0x1F, 0x69, 0xB0, 0xF7, 0x07, 0x48, 0x50, 0x2D, 0x2D,
+ 0xEF, 0xA8, 0x1A, 0x9F, 0x0B, 0xC1, 0xA5, 0x3C, 0xAD, 0x43, 0x59, 0x8A, 0xAA, 0x64, 0x6C, 0x60,
+ 0x50, 0x67, 0x3B, 0x52, 0x61, 0x3D, 0x8B, 0x7B, 0xA5, 0x2D, 0x04, 0x7E, 0xE5, 0xEB, 0xE7, 0x79,
+ 0x69, 0xD1, 0x05, 0xAE, 0xA2, 0x20, 0x7A, 0xC7, 0x68, 0x8A, 0xCA, 0xBE, 0xBF, 0x27, 0x0C, 0xB3,
+ 0x49, 0x05, 0x16, 0x83, 0x7F, 0x29, 0x87, 0x1E, 0x58, 0x94, 0x76, 0xEA, 0xEA, 0xC5, 0x43, 0x3B,
+ 0xB3, 0x17, 0xB6, 0x41, 0x3C, 0x59, 0x03, 0x20, 0x83, 0x78, 0x57, 0xD8, 0x9A, 0x69, 0x2C, 0xEE,
+ 0x27, 0xCC, 0xC1, 0xAA, 0x7F, 0x52, 0x3A, 0x81, 0x04, 0xC3, 0xCD, 0x64, 0xC0, 0xAF, 0xCF, 0xF8,
+ 0xB2, 0x34, 0x8A, 0x94, 0xBD, 0xF7, 0x83, 0x0D, 0x16, 0xE7, 0xB0, 0x47, 0xA2, 0xFA, 0xD6, 0xA7,
+ 0x3E, 0xDF, 0xE1, 0x3A, 0xBA, 0x87, 0xA7, 0xF3, 0x8C, 0x5B, 0xB2, 0x28, 0x88, 0x4A, 0x13, 0x69,
+ 0x1C, 0xEF, 0x07, 0xAE, 0xC4, 0xCE, 0x95, 0x0D, 0x49, 0x1E, 0x11, 0x96, 0x79, 0x72, 0xEB, 0xA5,
+ 0x3E, 0x86, 0x6B, 0x80, 0xF8, 0xE2, 0xAF, 0x28, 0x70, 0x22, 0xE0, 0x07, 0x98, 0xD9, 0xE5, 0x0A,
+ 0x45, 0xD1, 0x9A, 0xD9, 0x86, 0x85, 0xEE, 0x92, 0xCC, 0x9B, 0x3A, 0xB6, 0xFE, 0x3F, 0x17, 0x59,
+ 0x53, 0xE1, 0xDA, 0xF0, 0x7A, 0x3B, 0x28, 0xD6, 0x28, 0xFD, 0xA2, 0xE6, 0x49, 0xBA, 0x68, 0x99,
+ 0x32, 0x89, 0x73, 0xB1, 0x87, 0xA8, 0x3E, 0x84, 0x70, 0xE9, 0xD4, 0x22, 0x24, 0x89, 0x20, 0x01,
+ 0xAF, 0x1B, 0xD9, 0xB5, 0x51, 0xA6, 0xFB, 0x67, 0x26, 0x9A, 0x89, 0x47, 0x85, 0x52, 0xB6, 0x0B,
+ 0xD4, 0x6B, 0xEE, 0xF4, 0xEF, 0x44, 0xD8, 0x27, 0x74, 0xBA, 0x1E, 0x3C, 0x45, 0x68, 0xFF, 0x93,
+ 0xDE, 0x4F, 0x03, 0xA7, 0xC1, 0xB9, 0x11, 0xD3, 0x27, 0xEB, 0x78, 0x40, 0x68, 0xF5, 0x1D, 0x78,
+ 0xE9, 0x24, 0x47, 0x3E, 0x80, 0x87, 0xF7, 0xE1, 0x87, 0xDA, 0xA0, 0xE3, 0x79, 0xA6, 0x61, 0x80,
+ 0xFD, 0x1A, 0xEB, 0x03, 0x7F, 0xE9, 0x50, 0x00, 0xD3, 0x1E, 0xBC, 0x6D, 0x65, 0xA2, 0xD5, 0x09,
+ 0x53, 0x3E, 0x60, 0x54, 0x6D, 0xD0, 0x2E, 0x01, 0x04, 0xA6, 0x13, 0xEE, 0xC0, 0x72, 0x8A, 0x66,
+ 0x09, 0x91, 0x56, 0x84, 0x40, 0xFC, 0x8D, 0x35, 0x01, 0xE2, 0x13, 0x76, 0x4E, 0x63, 0xCE, 0xE8,
+ 0xF0, 0xD9, 0x0F, 0x09, 0xBA, 0x19, 0x44, 0x4B, 0x44, 0x79, 0xAB, 0xF5, 0xE2, 0x48, 0x92, 0x3F,
+ 0xD9, 0x16, 0x57, 0xCA, 0x94, 0x82, 0x9E, 0xFE, 0x02, 0x24, 0x93, 0xAE, 0xF2, 0xF3, 0x2B, 0xCE,
+ 0x0A, 0x17, 0x91, 0x5D, 0x90, 0x97, 0x74, 0x13, 0x59, 0x8B, 0x16, 0xB4, 0x65, 0xD2, 0xFF, 0x5C,
+ 0x91, 0x35, 0xB8, 0x6D, 0xA0, 0xEA, 0xCB, 0x07, 0xD2, 0x88, 0x6E, 0x8C, 0xF1, 0xC3, 0x9C, 0x6E,
+ 0x25, 0xDC, 0xC4, 0x16, 0x73, 0x2B, 0xEA, 0x87, 0xAC, 0x60, 0x7B, 0x0D, 0x50, 0xFF, 0xE8, 0x24,
+ 0xB2, 0x77, 0xEF, 0xFD, 0x5D, 0x93, 0x16, 0x62, 0xF5, 0x47, 0x17, 0x5B, 0x3E, 0x0B, 0x55, 0x93,
+ 0xCD, 0x04, 0xCD, 0xB2, 0x51, 0xFC, 0x78, 0x0A, 0x4E, 0xAD, 0x07, 0x46, 0xC3, 0x66, 0xE5, 0xA6,
+ 0xB7, 0xE4, 0xE2, 0x71, 0x99, 0xA8, 0x44, 0x5B, 0xD6, 0x3D, 0x63, 0x7A, 0x3A, 0x4F, 0x15, 0x6E,
+ 0x3E, 0x07, 0x23, 0xDB, 0xBF, 0xD6, 0x78, 0x2B, 0x51, 0x73, 0xCF, 0x48, 0xB3, 0x2C, 0x6A, 0xB6,
+ 0x8A, 0x3D, 0x5D, 0x25, 0xA7, 0x70, 0x8D, 0x5A, 0x44, 0x2D, 0x1B, 0x24, 0x4C, 0x27, 0xAA, 0x02,
+ 0xE3, 0x57, 0x79, 0xA1, 0x74, 0x0F, 0x73, 0x5F, 0xD2, 0x09, 0x64, 0xE7, 0x26, 0xE6, 0xC3, 0xA4,
+ 0x15, 0x90, 0x12, 0x68, 0x54, 0x4A, 0xAF, 0xA5, 0x01, 0x0C, 0x10, 0x1D, 0x22, 0xF3, 0x79, 0xAF,
+ 0xED, 0xA4, 0x68, 0x58, 0x4B, 0x97, 0x6F, 0xE9, 0x2B, 0x59, 0x4B, 0x61, 0x91, 0x87, 0x0D, 0x33,
+ 0x2C, 0x75, 0xAA, 0x19, 0x93, 0x81, 0xC1, 0xD0, 0x5D, 0xA6, 0xA4, 0xE4, 0x85, 0x1C, 0xBC, 0x32,
+ 0xA7, 0xB5, 0x36, 0x3F, 0x26, 0x57, 0xAB, 0xAA, 0xEC, 0x9F, 0xC8, 0x74, 0x08, 0x83, 0x4B, 0x09,
+ 0xE1, 0x22, 0x94, 0xD5, 0xD8, 0xB4, 0xAA, 0x90, 0xFD, 0x34, 0x14, 0x27, 0xCA, 0x6B, 0x9A, 0x5A,
+ 0x30, 0x2D, 0x75, 0x6D, 0x01, 0x6D, 0x17, 0xCB, 0xEF, 0xA6, 0x3F, 0x36, 0xE2, 0xB2, 0x6B, 0x81,
+ 0x3E, 0xAF, 0x8C, 0x92, 0x70, 0x43, 0xA1, 0x1D, 0x09, 0x61, 0x71, 0x6B, 0x0E, 0x53, 0x0F, 0x6B,
+ 0x00, 0x32, 0xAC, 0x78, 0xCC, 0x2D, 0xC9, 0x42, 0x0C, 0x70, 0x3F, 0xDF, 0x52, 0x5C, 0xD4, 0x43,
+ 0xC7, 0xAC, 0x1C, 0x17, 0xE2, 0xC0, 0x75, 0x8B, 0xF8, 0xC8, 0xD2, 0xE1, 0x69, 0xB1, 0x86, 0x07,
+ 0x82, 0x37, 0xB9, 0x4A, 0x5F, 0xC6, 0x4F, 0x95, 0x86, 0x1B, 0x6D, 0x2B, 0xEB, 0x21, 0xD2, 0x84,
+ 0xD6, 0x4B, 0xFA, 0xBF, 0x54, 0x41, 0x34, 0xA8, 0x5C, 0x86, 0x23, 0x3A, 0x3D, 0xB6, 0x0C, 0x97,
+ 0x28, 0x8B, 0xBB, 0xE8, 0xF6, 0xC0, 0x68, 0xE5, 0x83, 0x21, 0x60, 0xF0, 0xE8, 0x8D, 0x80, 0xFA,
+ 0x1F, 0xAC, 0x32, 0xC6, 0x1D, 0x17, 0xD2, 0x3E, 0x57, 0xEB, 0x81, 0x68, 0x28, 0x0B, 0x36, 0x6F,
+ 0x3C, 0x08, 0xA3, 0xEB, 0xEE, 0xF0, 0x25, 0x24, 0xB2, 0x70, 0xC5, 0x62, 0xA9, 0xC8, 0x48, 0xDC,
+ 0xA1, 0x02, 0x49, 0x0E, 0xE8, 0x19, 0xBE, 0xFC, 0x8C, 0x8E, 0xC4, 0xBE, 0x9D, 0x6A, 0xDB, 0x70,
+ 0xDC, 0x78, 0xE1, 0xD4, 0xD1, 0xA4, 0xC8, 0x57, 0x3E, 0xC7, 0x40, 0xA6, 0xF0, 0xA9, 0x83, 0x12,
+ 0x76, 0x52, 0x4D, 0xB0, 0xBB, 0xBA, 0xE4, 0x85, 0x93, 0xBF, 0x6D, 0x71, 0x2C, 0x18, 0x57, 0xDE,
+ 0x57, 0x24, 0x8E, 0x33, 0xD7, 0xF9, 0x36, 0xE6, 0x3B, 0x63, 0x3B, 0x71, 0xB6, 0xF5, 0x9C, 0x4D,
+ 0x2C, 0xC3, 0x55, 0x7B, 0xDB, 0xD9, 0x1F, 0x7D, 0xC7, 0x2B, 0x4E, 0x65, 0x3C, 0xD4, 0xFD, 0xEC,
+ 0x01, 0xA6, 0xD8, 0xDB, 0x4F, 0x0A, 0x76, 0xF2, 0x3E, 0x3E, 0x16, 0xB5, 0xE9, 0xBB, 0xE7, 0x8B,
+ 0xDF, 0x8D, 0x60, 0x80, 0x79, 0xB5, 0xC6, 0x79, 0x1E, 0x9A, 0xDB, 0x53, 0xB4, 0x80, 0x6C, 0x9C,
+ 0xC9, 0x97, 0x7C, 0x0E, 0xAF, 0x41, 0xF9, 0x4C, 0x5E, 0xA4, 0xA4, 0x46, 0x85, 0xF2, 0x9A, 0xAE,
+ 0xFE, 0xC5, 0xB0, 0xB7, 0x16, 0x07, 0x03, 0x89, 0x27, 0x3F, 0x53, 0x92, 0x3E, 0x85, 0xE3, 0x23,
+ 0xE4, 0x72, 0x1F, 0xD7, 0x77, 0xCF, 0x3E, 0x57, 0xB3, 0x1F, 0xD8, 0x5D, 0x0C, 0xE2, 0xD1, 0xD6,
+ 0xCF, 0x20, 0xB0, 0xE1, 0x80, 0x38, 0xF6, 0xEF, 0x91, 0xD3, 0xD7, 0x2E, 0xDE, 0xA3, 0xEA, 0x77,
+ 0x44, 0xAF, 0xDC, 0x9A, 0x13, 0x19, 0x75, 0x28, 0x85, 0x61, 0xE5, 0x40, 0x8C, 0xE3, 0xF9, 0x5A,
+ 0xEC, 0x2A, 0x5C, 0x29, 0x12, 0x7B, 0x13, 0xBC, 0x21, 0x4D, 0x79, 0xF8, 0xEF, 0xD4, 0xEB, 0xA2,
+ 0x95, 0x43, 0xC5, 0xB5, 0x9E, 0x5B, 0x11, 0xAB, 0xE1, 0x9E, 0xB3, 0x76, 0xFF, 0x05, 0xD5, 0x42,
+ 0x4F, 0x92, 0x47, 0x58, 0x7A, 0xE2, 0x4D, 0x58, 0x8F, 0x95, 0xC4, 0xDC, 0xC3, 0xD4, 0x4A, 0x78,
+ 0x8A, 0xB7, 0x9B, 0x5D, 0x2D, 0x51, 0xFA, 0x4B, 0x10, 0x7B, 0x92, 0xF0, 0x66, 0xEC, 0x7C, 0x01,
+ 0xCA, 0xEE, 0x5F, 0xB8, 0x45, 0x78, 0x54, 0x87, 0xB8, 0xDF, 0xDE, 0x80, 0xE8, 0xAD, 0x3A, 0xB7,
+ 0xA6, 0xB2, 0x60, 0xC4, 0xA0, 0xE0, 0x42, 0x13, 0x38, 0xED, 0xFF, 0xB4, 0x77, 0xA8, 0xF4, 0xE7,
+ 0xF7, 0xE8, 0x71, 0xAE, 0x93, 0x3D, 0xA0, 0xCE, 0xB5, 0x55, 0xC9, 0x5F, 0xE0, 0x65, 0x4F, 0x2C,
+ 0xD6, 0x31, 0x7B, 0x61, 0x8E, 0x45, 0x00, 0x02, 0x97, 0x4F, 0x0F, 0xB9, 0x05, 0x03, 0xC4, 0xC2,
+ 0xBE, 0x3C, 0x4C, 0x2C, 0xB5, 0x04, 0x22, 0x7F, 0x7E, 0x16, 0x3E, 0xC1, 0xC7, 0xBD, 0x6A, 0xEB,
+ 0x10, 0xA6, 0x15, 0x78, 0x6C, 0x66, 0x55, 0x7D, 0xFA, 0xE0, 0x2B, 0xD0, 0x88, 0xAB, 0x80, 0x71,
+ 0x6D, 0x2B, 0xD9, 0xC3, 0x39, 0x7A, 0x6F, 0x39, 0xCC, 0xC0, 0x17, 0x73, 0xC8, 0x58, 0x21, 0x63,
+ 0xF5, 0x7F, 0x99, 0xF7, 0xC7, 0x46, 0xFC, 0x2B, 0xE3, 0x3B, 0x66, 0x73, 0x0E, 0x90, 0x4A, 0xC3,
+ 0x48, 0xCE, 0xDB, 0x39, 0x46, 0xF9, 0xE9, 0x7B, 0x33, 0xCD, 0x9B, 0x8B, 0x3E, 0x21, 0x55, 0x35,
+ 0xAE, 0x71, 0xFE, 0xA4, 0x2E, 0xC9, 0xC8, 0xA0, 0x1E, 0x97, 0x10, 0x6A, 0x29, 0x95, 0xFC, 0xCD,
+ 0xE0, 0xEC, 0x37, 0x95, 0xFA, 0x61, 0xB5, 0x62, 0x5C, 0xC5, 0xEA, 0xDF, 0x8D, 0xA7, 0xC2, 0xF7,
+ 0x4A, 0xC9, 0x34, 0x15, 0xA4, 0x8C, 0x63, 0xA5, 0x16, 0x25, 0x4F, 0xA9, 0x89, 0xD7, 0x2D, 0x77,
+ 0x0D, 0x5E, 0xC1, 0x32, 0x2A, 0x86, 0x55, 0x80, 0x97, 0xD1, 0x8C, 0x98, 0x04, 0x5A, 0x89, 0xC9,
+ 0xD1, 0x5F, 0x00, 0x5E, 0x29, 0x2C, 0xEB, 0x17, 0x96, 0x6A, 0xEB, 0x9A, 0xEA, 0x5F, 0x2D, 0x99,
+ 0x3D, 0x47, 0xCD, 0xFA, 0xA7, 0x8B, 0xFA, 0xB8, 0x16, 0x1A, 0xE7, 0x07, 0x85, 0x47, 0xB6, 0x3F,
+ 0xBD, 0x96, 0x4C, 0xD2, 0xE8, 0xBE, 0x78, 0xE0, 0xFE, 0xF8, 0xD7, 0x9F, 0x05, 0xC2, 0xDF, 0x2F,
+ 0x1D, 0x8C, 0xDC, 0xDF, 0x4C, 0x36, 0x06, 0xF5, 0xD3, 0xAD, 0xFC, 0x82, 0xB3, 0x7D, 0x47, 0xE3,
+ 0xE6, 0x26, 0xD7, 0xA8, 0xC1, 0xA8, 0xD7, 0x73, 0x55, 0x0D, 0x99, 0x81, 0xE8, 0x97, 0x84, 0x22,
+ 0x5D, 0x93, 0x7B, 0x83, 0xE3, 0x27, 0xEA, 0x60, 0x03, 0x2E, 0xC9, 0x71, 0xBB, 0x31, 0xF1, 0x4A,
+ 0x4D, 0xEA, 0x5B, 0xAD, 0x29, 0x37, 0xAA, 0x4F, 0x6D, 0xEC, 0xBB, 0x00, 0x6A, 0xD9, 0x98, 0xDB,
+ 0x08, 0x72, 0x8A, 0x94, 0xC8, 0x9C, 0x03, 0xC5, 0x02, 0x54, 0x46, 0xB5, 0x1E, 0x25, 0xD1, 0x50,
+ 0x3C, 0x3E, 0xE0, 0x55, 0x89, 0x28, 0xC0, 0xE3, 0x08, 0x1A, 0x26, 0x9C, 0x4D, 0x74, 0x57, 0x09,
+ 0x34, 0xB3, 0x2D, 0x21, 0xA0, 0x4E, 0x9B, 0xB2, 0x93, 0xC0, 0x7A, 0x52, 0xAC, 0x0D, 0x2B, 0xAA,
+ 0x5F, 0xCF, 0x9E, 0x94, 0x88, 0x0D, 0xCB, 0x30, 0x74, 0xC7, 0x6B, 0x78, 0x5E, 0xEE, 0x24, 0xC4,
+ 0xA8, 0x0B, 0x84, 0x2D, 0xD7, 0xEC, 0x31, 0xA8, 0xE3, 0x62, 0xC8, 0x43, 0x6A, 0x12, 0x0E, 0x46,
+ 0xEE, 0x86, 0x33, 0x4B, 0xF9, 0xA6, 0x52, 0x96, 0x6D, 0xA1, 0xD2, 0x1C, 0x50, 0xEC, 0xEE, 0x53,
+ 0xE8, 0x7E, 0xD4, 0xE1, 0x41, 0x76, 0x6E, 0xF7, 0x66, 0x89, 0x46, 0xA6, 0xC9, 0x06, 0x32, 0xCC,
+ 0x13, 0x23, 0x80, 0xE8, 0x3E, 0x93, 0x52, 0x05, 0x78, 0x1A, 0x02, 0xAA, 0x5C, 0x11, 0xD7, 0xF0,
+ 0x39, 0x77, 0x06, 0x4F, 0xB3, 0x4B, 0x8E, 0x9D, 0x84, 0x00, 0x3A, 0xEE, 0x03, 0xFD, 0x48, 0xBA,
+ 0xA7, 0x23, 0x59, 0xBE, 0x43, 0x7B, 0x2F, 0xA0, 0x23, 0x6F, 0x9A, 0xE9, 0xB0, 0xC2, 0x84, 0x1A,
+ 0x9F, 0x5A, 0x39, 0x22, 0xB6, 0x78, 0x21, 0x86, 0xDD, 0xEC, 0x37, 0x24, 0x1C, 0xB1, 0xD8, 0x7C,
+ 0x88, 0xAB, 0xC3, 0x9F, 0xA1, 0x3C, 0xBA, 0xF8, 0x1C, 0x43, 0x41, 0xB2, 0x12, 0x3C, 0x16, 0x38,
+ 0xD6, 0x58, 0xFF, 0xBF, 0x73, 0xEA, 0xFE, 0x63, 0xE0, 0x36, 0xA4, 0xE7, 0x38, 0xA2, 0xA5, 0xB2,
+ 0xEF, 0xE0, 0x7B, 0x32, 0xCC, 0x34, 0x0A, 0x32, 0x23, 0x14, 0xCE, 0xE9, 0xDC, 0xC7, 0xF1, 0x85,
+ 0x79, 0x19, 0x4B, 0xC2, 0x39, 0xC8, 0x57, 0x2A, 0xDD, 0x19, 0x6D, 0x10, 0xC9, 0x3E, 0x39, 0x13,
+ 0x5A, 0xC3, 0x33, 0xC5, 0xB1, 0x6D, 0xD8, 0x8B, 0x35, 0x14, 0x9C, 0x67, 0xE6, 0x58, 0xC9, 0x0C,
+ 0xE6, 0xC7, 0x59, 0xCA, 0xA7, 0xB6, 0x10, 0x8B, 0x44, 0x2D, 0x8D, 0x12, 0xC3, 0xC3, 0xEE, 0x58,
+ 0xB9, 0xFA, 0x60, 0xBD, 0xAB, 0x29, 0xD4, 0xB9, 0x86, 0xA1, 0x2D, 0x8F, 0x62, 0xE4, 0x19, 0x9A,
+ 0x71, 0xC2, 0xF4, 0xA5, 0x93, 0x04, 0xBB, 0x8D, 0x64, 0xB5, 0x40, 0x8C, 0x8B, 0xA6, 0x52, 0xCE,
+ 0xE3, 0x95, 0x53, 0xEA, 0x14, 0x21, 0x7C, 0x64, 0xCE, 0xCA, 0x69, 0xE9, 0x3F, 0xD9, 0xB7, 0xD4,
+ 0xB3, 0xB3, 0xC2, 0x82, 0x64, 0xA2, 0x23, 0xC6, 0xE6, 0x8A, 0x5F, 0xFE, 0xFA, 0x06, 0xE6, 0x5F,
+ 0xA2, 0x82, 0x3B, 0x4E, 0x89, 0xAA, 0xCF, 0xCB, 0x18, 0xA1, 0x69, 0x65, 0x93, 0xA8, 0x19, 0xC7,
+ 0x78, 0x6F, 0x94, 0x9A, 0x2F, 0x1F, 0x5B, 0x47, 0x30, 0x06, 0xBE, 0x59, 0x5D, 0x84, 0xDB, 0xDF,
+ 0xAC, 0xAF, 0x91, 0x8A, 0x39, 0x28, 0xB4, 0xA1, 0x68, 0x2D, 0x4F, 0x39, 0x64, 0xC3, 0x92, 0xB7,
+ 0x31, 0x38, 0xAE, 0x87, 0xD1, 0xCD, 0xB8, 0x11, 0xD4, 0xF6, 0xEA, 0x06, 0xB6, 0xB2, 0x22, 0xE8,
+ 0x46, 0x7C, 0xB3, 0xC4, 0x93, 0xD1, 0x19, 0x2D, 0xEE, 0x9B, 0xAC, 0x1E, 0x9C, 0xEE, 0x6C, 0x85,
+ 0x6F, 0x35, 0xAC, 0x97, 0x3E, 0x97, 0xD0, 0x50, 0x38, 0x59, 0xF8, 0x5E, 0xB0, 0x3D, 0xAA, 0x9E,
+ 0x8F, 0x78, 0x51, 0x04, 0xE0, 0x01, 0x8C, 0xF3, 0xE3, 0x9F, 0x59, 0x11, 0x7D, 0x5F, 0xC9, 0xDB,
+ 0xA3, 0x99, 0xA6, 0xE2, 0x65, 0x90, 0x75, 0xDD, 0xEC, 0x59, 0x60, 0x19, 0x70, 0x66, 0x12, 0x0B,
+ 0x27, 0x26, 0xC2, 0x3B, 0x5B, 0xDB, 0x6F, 0x11, 0x39, 0x08, 0xDC, 0xF4, 0x14, 0x51, 0x06, 0xFE,
+ 0x9B, 0xDB, 0x22, 0x25, 0x1E, 0x25, 0x43, 0x8D, 0xD5, 0xD0, 0xFB, 0x68, 0xF3, 0x65, 0xEA, 0x97,
+ 0x20, 0xDD, 0x60, 0x7B, 0xB4, 0xE0, 0x90, 0x24, 0x62, 0xF6, 0x84, 0xF0, 0x47, 0xD6, 0xB9, 0xE3,
+ 0xB8, 0x16, 0x6A, 0xDB, 0xA7, 0xF7, 0xFD, 0xFC, 0x74, 0x1F, 0x8C, 0xFD, 0x88, 0x4A, 0xE9, 0xEE,
+ 0xFE, 0xCC, 0xE5, 0xA0, 0x2C, 0x1D, 0xAE, 0xD0, 0xF3, 0x56, 0xBE, 0xD8, 0x45, 0xC4, 0x44, 0xEA,
+ 0xD7, 0x71, 0x34, 0x7C, 0x2A, 0x0A, 0x3F, 0xD1, 0xA8, 0xCA, 0xF1, 0x7E, 0x9C, 0x39, 0x6B, 0x51,
+ 0xBD, 0xDB, 0x56, 0x87, 0xAC, 0xDF, 0x31, 0xF9, 0xC0, 0x73, 0xDB, 0xBC, 0x0D, 0x1D, 0xD7, 0x8B,
+ 0xBB, 0x50, 0x3B, 0xE7, 0xB5, 0xE9, 0x6A, 0x3B, 0x83, 0xF8, 0x27, 0xE8, 0x7C, 0xD1, 0x8D, 0x14,
+ 0xDD, 0x5A, 0xDF, 0xD1, 0xBE, 0xBA, 0xFD, 0x3E, 0xF8, 0xA4, 0x8A, 0xED, 0xAD, 0x82, 0xFD, 0x28,
+ 0x3F, 0x46, 0x1C, 0x56, 0x71, 0x71, 0x71, 0xFB, 0x1F, 0xEB, 0xE6, 0x72, 0x10, 0x40, 0xDB, 0xA3,
+ 0x40, 0xEA, 0x06, 0x63, 0x74, 0xE7, 0xC3, 0xA9, 0xE4, 0x07, 0xFD, 0xA8, 0x5C, 0x83, 0x16, 0x69,
+ 0xB4, 0x6A, 0xAE, 0x85, 0xFC, 0x32, 0xDF, 0x59, 0x71, 0xBB, 0x7A, 0xC1, 0xC2, 0x0E, 0xC0, 0x5A,
+ 0xA1, 0x1F, 0x88, 0x6E, 0xF4, 0x79, 0xF2, 0x4F, 0xA5, 0x84, 0x8B, 0xA7, 0x39, 0xCC, 0x6D, 0x44,
+ 0x33, 0xD8, 0x1A, 0x9B, 0xAD, 0x8F, 0x12, 0x49, 0x63, 0x93, 0xBB, 0x70, 0xA7, 0x9D, 0x4A, 0x69,
+ 0xDC, 0x18, 0x09, 0xB8, 0xED, 0xB1, 0x50, 0x13, 0x59, 0xEA, 0xDC, 0x7B, 0xBF, 0x7F, 0x83, 0x4F,
+ 0xC7, 0xFA, 0x3B, 0x44, 0xEF, 0xF9, 0x4C, 0xE9, 0x72, 0x70, 0xD7, 0x27, 0xEC, 0x80, 0x18, 0x2A,
+ 0x45, 0x71, 0x87, 0x99, 0x9F, 0xE0, 0x74, 0x3E, 0xE0, 0xE1, 0xCD, 0xF6, 0x76, 0xD9, 0x82, 0x6D,
+ 0xF5, 0x01, 0x9C, 0x33, 0x19, 0xB7, 0x0A, 0x1E, 0x07, 0xC7, 0x11, 0x4B, 0xC2, 0x64, 0x16, 0x14,
+ 0x9F, 0xE6, 0xD2, 0x65, 0x64, 0x9E, 0xCA, 0x29, 0xB9, 0xC1, 0xA1, 0x64, 0x4A, 0x39, 0x36, 0xD7,
+ 0xED, 0xC4, 0xCA, 0x4D, 0x93, 0xB7, 0xE7, 0x52, 0x6E, 0xC4, 0x2A, 0x89, 0x16, 0x14, 0xC2, 0x26,
+ 0xF9, 0xD6, 0x69, 0xA6, 0x8B, 0x52, 0x04, 0xA3, 0xF9, 0xB5, 0x34, 0x97, 0x98, 0x0F, 0x77, 0x01,
+ 0x02, 0xD7, 0x3D, 0x75, 0x08, 0xE7, 0x90, 0x1B, 0x0A, 0xA4, 0x1D, 0x27, 0xBB, 0xC3, 0xF5, 0x9A,
+ 0x3A, 0x75, 0xC2, 0x85, 0x12, 0x98, 0x59, 0x90, 0x92, 0x99, 0x15, 0x73, 0xA2, 0x1D, 0x8A, 0xC0,
+ 0x68, 0x39, 0x69, 0x93, 0x2C, 0xCF, 0xE1, 0x43, 0x99, 0xD6, 0x68, 0xEB, 0xBD, 0xB1, 0xF2, 0xA4,
+ 0xB4, 0x84, 0x78, 0x62, 0xCA, 0xF7, 0xE3, 0xC8, 0x5B, 0x12, 0x92, 0xA4, 0x93, 0xAA, 0x04, 0x07,
+ 0x45, 0x26, 0x09, 0x77, 0x6E, 0x30, 0x47, 0x26, 0x9D, 0x24, 0x8B, 0xED, 0xDC, 0xFB, 0xFF, 0x23,
+ 0x3A, 0xFD, 0x6B, 0xCB, 0xA0, 0x88, 0x08, 0x76, 0x66, 0x0A, 0xF9, 0x7B, 0x4F, 0xE2, 0x23, 0x5C,
+ 0x4E, 0xE9, 0x16, 0x29, 0xA0, 0x9E, 0xE2, 0x7B, 0xB7, 0xD6, 0xDB, 0xD9, 0xC5, 0xCF, 0x68, 0x4A,
+ 0x9F, 0x08, 0x22, 0xA0, 0xEC, 0xF2, 0x3F, 0x95, 0xAE, 0x25, 0x95, 0xED, 0x10, 0x6F, 0x35, 0x1A,
+ 0xCA, 0x58, 0xB2, 0xC6, 0x72, 0xA1, 0x03, 0x7E, 0x58, 0x70, 0x59, 0x24, 0x6A, 0x39, 0x00, 0x8B,
+ 0x4A, 0x27, 0xBC, 0xB9, 0x00, 0x92, 0x6A, 0xA5, 0xC8, 0x1D, 0xBA, 0xFB, 0x24, 0x7F, 0x91, 0x3D,
+ 0xF3, 0x4D, 0x7D, 0xB5, 0xF8, 0xB8, 0x76, 0x27, 0x0A, 0x50, 0x10, 0x98, 0xD3, 0xFE, 0xD8, 0xCD,
+ 0x55, 0xDD, 0xC3, 0x70, 0x38, 0x23, 0x75, 0x44, 0xA1, 0x16, 0x01, 0xC4, 0xFB, 0x7A, 0x31, 0xBD,
+ 0xC1, 0x1B, 0x51, 0x7F, 0xAB, 0xC0, 0xAE, 0x0C, 0x43, 0xA5, 0x07, 0x35, 0x88, 0xAF, 0x8D, 0x5F,
+ 0xF6, 0xE0, 0xFA, 0x6C, 0x83, 0x05, 0xEC, 0xFC, 0x85, 0xDD, 0x66, 0x11, 0x64, 0x77, 0xE7, 0xCA,
+ 0xF4, 0xE5, 0xC8, 0x11, 0xC2, 0xAE, 0x06, 0x94, 0x40, 0xF7, 0xA4, 0x00, 0x6F, 0xDD, 0x99, 0xBD,
+ 0x3A, 0xA3, 0x69, 0x5B, 0xFF, 0x09, 0xC8, 0xC7, 0xF5, 0xFD, 0xA7, 0xE3, 0x6D, 0x0D, 0x81, 0xC4,
+ 0x70, 0xA1, 0x86, 0x35, 0xEF, 0x76, 0x58, 0x4F, 0xD8, 0x91, 0xD2, 0x34, 0xF6, 0x48, 0x86, 0x20,
+ 0x95, 0xA2, 0x39, 0xDD, 0x4A, 0x63, 0xC4, 0xFD, 0xAC, 0x12, 0x61, 0xCC, 0xF9, 0x08, 0x15, 0x17,
+ 0x4D, 0x94, 0x9B, 0x03, 0xFF, 0x27, 0x06, 0xDC, 0x2A, 0x6B, 0xC6, 0x45, 0x8C, 0xBE, 0x6B, 0x2E,
+ 0x21, 0x9A, 0xDE, 0xBE, 0x17, 0x3A, 0x91, 0xA8, 0xA4, 0x09, 0x94, 0x70, 0x22, 0x62, 0x06, 0xDD,
+ 0x65, 0x5E, 0x81, 0x8C, 0xB0, 0x2D, 0xA7, 0xA6, 0x6B, 0xD9, 0x9C, 0x75, 0xA1, 0x4C, 0x55, 0x96,
+ 0x67, 0x6C, 0xF7, 0xFB, 0x34, 0xA6, 0x4C, 0x53, 0x10, 0x5A, 0xDB, 0x54, 0x7E, 0xAC, 0x67, 0xEA,
+ 0x12, 0xF0, 0x29, 0x2A, 0x49, 0x89, 0xFF, 0xC5, 0xF3, 0xD4, 0x1D, 0xBA, 0xFB, 0xEF, 0xCE, 0xA3,
+ 0x58, 0x33, 0x7C, 0xFA, 0xC0, 0x30, 0x45, 0x70, 0x15, 0xB0, 0xDE, 0x85, 0xD7, 0x66, 0xCA, 0x00,
+ 0x87, 0x93, 0x85, 0x6B, 0xD0, 0x2E, 0x94, 0x80, 0x30, 0x24, 0x69, 0xC5, 0xD9, 0xD8, 0x00, 0xA7,
+ 0xBF, 0x4E, 0xF7, 0x5C, 0xDE, 0x10, 0xBE, 0x0A, 0xAE, 0xDA, 0x8D, 0xFD, 0xCB, 0xD0, 0xAF, 0x6F,
+ 0xBB, 0xD2, 0xEB, 0xEB, 0x05, 0xA4, 0xF7, 0x3B, 0x0B, 0xC1, 0x0E, 0x50, 0xE4, 0x80, 0x65, 0xF6,
+ 0xEE, 0x78, 0xDB, 0xFA, 0xCD, 0x96, 0xDA, 0xB7, 0x47, 0xDD, 0x95, 0x0D, 0xEC, 0x65, 0x4F, 0x2A,
+ 0x51, 0x8A, 0xC6, 0xA9, 0x25, 0xCE, 0x3D, 0x2D, 0xC2, 0x06, 0xB9, 0x26, 0xE1, 0x68, 0xA4, 0x68,
+ 0x23, 0xB9, 0x0B, 0x12, 0x7D, 0x79, 0xD3, 0x48, 0x0E, 0xA6, 0x2A, 0x2B, 0xA3, 0x23, 0x64, 0x10,
+ 0xBA, 0xA3, 0x92, 0x83, 0xF0, 0x91, 0xB9, 0xF7, 0x12, 0x4A, 0x08, 0xFA, 0xE3, 0x10, 0xAE, 0x69,
+ 0xDD, 0x93, 0x1C, 0xC6, 0xCC, 0x32, 0x78, 0x85, 0x15, 0x84, 0xBE, 0x0E, 0x9B, 0x21, 0xB0, 0xE7,
+ 0x0B, 0xC0, 0x25, 0xCA, 0xE3, 0xA3, 0xC0, 0x6A, 0x96, 0xC4, 0x98, 0x51, 0x9B, 0xF6, 0x5B, 0x09,
+ 0xAD, 0x67, 0x03, 0xA1, 0x4A, 0x51, 0x1B, 0xC0, 0x4B, 0x0B, 0x1C, 0x23, 0x0A, 0x2B, 0xBA, 0x9F,
+ 0xAE, 0x74, 0xED, 0xFA, 0xA1, 0xC4, 0x30, 0xAB, 0x00, 0xED, 0x7A, 0x17, 0xCC, 0x15, 0xC5, 0xBF,
+ 0xCC, 0x49, 0x41, 0x97, 0x3D, 0xBE, 0x2A, 0xE7, 0xED, 0x33, 0x02, 0x5B, 0x42, 0xF3, 0x18, 0x10,
+ 0xD3, 0xD5, 0x27, 0x08, 0x4A, 0xFD, 0xFB, 0xA5, 0x19, 0x43, 0xE6, 0x38, 0x26, 0xAA, 0xC3, 0xE6,
+ 0x7B, 0xF1, 0xD5, 0x02, 0x96, 0x27, 0x86, 0xAC, 0x38, 0x86, 0x4E, 0xD0, 0x8B, 0xD7, 0x2B, 0xCC,
+ 0x97, 0x96, 0x24, 0x6D, 0x66, 0x7D, 0x2B, 0xC8, 0xF7, 0x49, 0xEA, 0x26, 0x74, 0xED, 0x29, 0x50,
+ 0x03, 0x72, 0x2E, 0x3D, 0x52, 0x3D, 0x1C, 0x63, 0x38, 0x67, 0x47, 0x3B, 0x07, 0xF8, 0x5C, 0x54,
+ 0x98, 0x0A, 0xEA, 0xB9, 0x0E, 0xB7, 0x7E, 0x78, 0xF6, 0xD5, 0x8E, 0xC1, 0x1C, 0x36, 0x2A, 0x17,
+ 0x17, 0x0A, 0x3E, 0x90, 0xA4, 0x77, 0x27, 0x47, 0xBA, 0xC9, 0x03, 0x6A, 0x3C, 0x88, 0x17, 0xF5,
+ 0xEC, 0x7A, 0x94, 0x3D, 0xD3, 0x06, 0x00, 0xEE, 0xB2, 0x31, 0x36, 0xB5, 0xCA, 0x53, 0x52, 0xC9,
+ 0x4C, 0xA6, 0x54, 0x12, 0xC6, 0x58, 0xB7, 0x2F, 0xD1, 0xD1, 0xF5, 0x8A, 0x96, 0x3E, 0x44, 0x61,
+ 0x4B, 0xA0, 0x9D, 0xF1, 0x54, 0x4A, 0xE7, 0x27, 0x8B, 0x02, 0x8B, 0x8E, 0xC3, 0xF2, 0xAF, 0x01,
+ 0xDE, 0x38, 0xE9, 0x7A, 0x15, 0xAE, 0x0D, 0xA2, 0xF2, 0x43, 0x2C, 0x2D, 0x2E, 0xCD, 0xD9, 0x61,
+ 0x72, 0xD2, 0x34, 0x7E, 0x07, 0x2C, 0x2A, 0x00, 0x2D, 0x56, 0x6A, 0x9C, 0xFF, 0x13, 0xBE, 0xF2,
+ 0x60, 0xCD, 0xBA, 0xFA, 0xB5, 0xBA, 0x95, 0x7F, 0x3B, 0xE1, 0x6F, 0x86, 0x83, 0xAF, 0x52, 0xD3,
+ 0x86, 0xBE, 0xDF, 0x71, 0xFD, 0x39, 0x1B, 0x49, 0x23, 0xE8, 0x82, 0x3D, 0x98, 0xE7, 0x6A, 0x7E,
+ 0xE4, 0x76, 0xB0, 0x2C, 0xBD, 0xAE, 0x26, 0xC5, 0xB5, 0x6F, 0x9A, 0xA2, 0x7E, 0x95, 0x84, 0x2A,
+ 0x74, 0x4A, 0xEC, 0x70, 0x4D, 0xC1, 0xA9, 0xEB, 0x30, 0xD9, 0xAE, 0x8D, 0x7A, 0xA3, 0xF7, 0x5F,
+ 0x3F, 0xDE, 0xC2, 0xCD, 0x8B, 0xB0, 0xD6, 0xD0, 0xC5, 0x71, 0x7C, 0xC7, 0xF9, 0x97, 0x98, 0x51,
+ 0x52, 0x7E, 0x0D, 0x50, 0xB4, 0xC9, 0x29, 0x79, 0x65, 0xC8, 0x43, 0x7B, 0x46, 0x9B, 0x57, 0xF8,
+ 0x74, 0xF7, 0x8B, 0x58, 0xE8, 0xB3, 0x22, 0x43, 0xEB, 0x06, 0xCD, 0xED, 0x0C, 0xC9, 0x86, 0x2B,
+ 0x5E, 0xF9, 0xBA, 0xF5, 0xA3, 0x01, 0x46, 0xE5, 0xE7, 0x99, 0x17, 0x83, 0xA2, 0x4F, 0x2C, 0xEA,
+ 0x9B, 0x12, 0xDB, 0xC9, 0x0B, 0x51, 0x79, 0x65, 0x6F, 0x3A, 0xC6, 0x1D, 0x35, 0x3B, 0xCB, 0xC2,
+ 0xA1, 0x27, 0xA0, 0xE0, 0xC8, 0xCB, 0xBF, 0xA0, 0x7E, 0x9D, 0x7B, 0x8A, 0x6F, 0x38, 0x1D, 0x6A,
+ 0xDA, 0x14, 0xF6, 0x00, 0xA4, 0xEA, 0x18, 0x71, 0x48, 0x3D, 0x05, 0x03, 0x42, 0x42, 0xE7, 0x50,
+ 0x3C, 0x3F, 0x21, 0x2F, 0x7C, 0x18, 0x65, 0x3F, 0xDE, 0xDC, 0x65, 0x9D, 0xB2, 0x8E, 0x92, 0xA1,
+ 0xC7, 0x0B, 0xAD, 0x3C, 0x22, 0x3C, 0x07, 0x62, 0x1D, 0x3C, 0x8F, 0x57, 0xF0, 0x50, 0x21, 0x5C,
+ 0xC2, 0x6A, 0xA9, 0x72, 0x3B, 0x9F, 0xB0, 0x51, 0xEF, 0x1F, 0x5C, 0x83, 0x27, 0x1F, 0xAA, 0x81,
+ 0x50, 0xDC, 0xB2, 0x80, 0x94, 0xE2, 0x69, 0x66, 0x4B, 0x7E, 0xBD, 0xCA, 0x8B, 0x5F, 0xD0, 0xE8,
+ 0x69, 0x63, 0x6D, 0xE4, 0xDA, 0xF7, 0x83, 0x45, 0xCB, 0xFC, 0x33, 0xDB, 0x43, 0x99, 0x7E, 0x41,
+ 0x86, 0x3F, 0x95, 0xDC, 0xB2, 0x58, 0x8F, 0x8E, 0x7F, 0xAA, 0xC8, 0x37, 0x80, 0x08, 0x1C, 0xAE,
+ 0x22, 0x03, 0xF1, 0x98, 0x73, 0x47, 0x75, 0x38, 0x5B, 0x1F, 0x99, 0x70, 0xE4, 0x48, 0x15, 0x48,
+ 0xCE, 0x24, 0x15, 0xE4, 0x0B, 0xCA, 0x01, 0x8E, 0x8B, 0xE7, 0x9B, 0x4E, 0x5B, 0x56, 0x11, 0x14,
+ 0x31, 0x78, 0x8F, 0xA9, 0x9A, 0xDA, 0x41, 0x52, 0x21, 0xBB, 0x34, 0x10, 0x74, 0x55, 0x87, 0x4B,
+ 0x7A, 0x65, 0xBA, 0x53, 0xFB, 0x06, 0xB3, 0x82, 0x3F, 0xEC, 0x43, 0x84, 0xF4, 0xC9, 0xAF, 0x11,
+ 0x7F, 0x25, 0x7A, 0x7A, 0x2F, 0x33, 0x93, 0x10, 0x9B, 0x7D, 0xA0, 0xAB, 0x35, 0x54, 0x61, 0x85,
+ 0x3A, 0x08, 0x6B, 0x38, 0x45, 0x35, 0xCB, 0xAC, 0x71, 0x07, 0x43, 0x5C, 0x38, 0x79, 0x28, 0xFB,
+ 0x9E, 0x30, 0xDC, 0x69, 0xBE, 0x28, 0x25, 0x52, 0x1A, 0xCF, 0x0C, 0x67, 0x9E, 0x20, 0xF9, 0x18,
+ 0xE2, 0x48, 0x4B, 0xD3, 0x2D, 0x78, 0xF5, 0xFC, 0xB0, 0xCF, 0x03, 0xC8, 0x9B, 0x4D, 0x82, 0xF5,
+ 0xEE, 0x4A, 0x87, 0x45, 0xEC, 0x49, 0x32, 0x59, 0x15, 0x32, 0xEC, 0x63, 0x0B, 0x44, 0x9F, 0x03,
+ 0xAD, 0x0C, 0x4B, 0xC4, 0xCE, 0x74, 0xF0, 0xBA, 0x8D, 0xE6, 0x4A, 0xBC, 0x69, 0xB7, 0xF5, 0xAE,
+ 0xCB, 0x54, 0x43, 0xE8, 0x5A, 0x61, 0xF9, 0x4D, 0x04, 0xAA, 0xCE, 0x99, 0xF4, 0x67, 0x60, 0x63,
+ 0x70, 0x3A, 0x98, 0x3C, 0x42, 0x48, 0x38, 0x9B, 0x90, 0xB4, 0x2F, 0xD7, 0xE1, 0xCF, 0x15, 0x63,
+ 0x1F, 0x9C, 0xDC, 0x3C, 0x1A, 0xE7, 0x43, 0x2A, 0x54, 0xE7, 0x95, 0x16, 0x12, 0xE9, 0x93, 0xAE,
+ 0x89, 0x21, 0x0B, 0xAD, 0xFB, 0x05, 0x50, 0x5A, 0x70, 0x02, 0xD0, 0xCC, 0xDA, 0x66, 0x25, 0x68,
+ 0x11, 0x1F, 0x42, 0x07, 0x10, 0x56, 0x47, 0xCC, 0xA2, 0x3A, 0xAA, 0x44, 0x5B, 0x10, 0xA0, 0x0F,
+ 0x25, 0x44, 0x70, 0x3E, 0x72, 0x3A, 0x58, 0x7C, 0x82, 0x03, 0x3B, 0x8B, 0xFF, 0x5E, 0x6C, 0x06,
+ 0x5A, 0xFC, 0x23, 0x1B, 0x78, 0xD1, 0xCE, 0xC6, 0xC0, 0x3A, 0xAA, 0x07, 0x0F, 0xC0, 0xAC, 0xB7,
+ 0x88, 0x31, 0x31, 0x9A, 0x67, 0x3C, 0xDA, 0x7F, 0xE6, 0x48, 0xAB, 0xE8, 0x30, 0xC0, 0xB4, 0xBF,
+ 0x0B, 0x14, 0x97, 0x81, 0x8F, 0x5E, 0x65, 0x5D, 0xC9, 0x80, 0xDC, 0x85, 0x76, 0x84, 0x90, 0x7B,
+ 0xC0, 0x2E, 0x59, 0x03, 0xB2, 0x19, 0x2C, 0x5B, 0x98, 0xA7, 0xA9, 0xDC, 0xE9, 0x4A, 0x02, 0xE3,
+ 0x80, 0x0D, 0x08, 0x57, 0x03, 0x1D, 0xBB, 0xB0, 0x88, 0x32, 0xCA, 0xF0, 0x4C, 0xD3, 0xF9, 0xBD,
+ 0x25, 0x56, 0x86, 0xBC, 0x99, 0x92, 0xFC, 0xAE, 0x66, 0xF2, 0x9B, 0x43, 0xF9, 0xCF, 0xEE, 0xD4,
+ 0xEF, 0xF9, 0xFE, 0xB6, 0x26, 0x5D, 0x47, 0x07, 0x94, 0x1F, 0xE9, 0xD9, 0xA0, 0x78, 0xF9, 0x57,
+ 0x26, 0x6E, 0xF9, 0xEB, 0x02, 0x01, 0x9E, 0xB0, 0x75, 0x43, 0x0C, 0x6D, 0x82, 0x54, 0xFC, 0xE2,
+ 0xFA, 0x1B, 0x3C, 0x31, 0x64, 0xD5, 0x66, 0x22, 0x45, 0x1F, 0x35, 0x74, 0x8A, 0x70, 0x9A, 0xD8,
+ 0xEC, 0xE8, 0x44, 0x0C, 0x9D, 0x10, 0xFD, 0x5A, 0xB3, 0x53, 0x21, 0x6A, 0x64, 0xD5, 0x15, 0x6A,
+ 0x96, 0x48, 0x1A, 0xA3, 0x4E, 0x97, 0xB8, 0xCF, 0xB2, 0xA3, 0x14, 0x23, 0x83, 0xC1, 0x1A, 0x07,
+ 0x6B, 0x89, 0x64, 0x16, 0x02, 0x9B, 0x04, 0x17, 0xA4, 0xE3, 0xF3, 0xDB, 0x1C, 0x8F, 0x9E, 0x0D,
+ 0x0A, 0x6D, 0xB4, 0xA2, 0xA7, 0x76, 0x49, 0xBB, 0xBA, 0x79, 0x2D, 0x6F, 0xCE, 0xD9, 0x5C, 0x24,
+ 0xC7, 0xDD, 0xF1, 0x22, 0xCC, 0x7D, 0xDF, 0xED, 0x97, 0x93, 0x60, 0xDD, 0x0B, 0x99, 0xBD, 0x58,
+ 0x0B, 0x06, 0x77, 0x91, 0x82, 0x1F, 0xE2, 0xFE, 0xCF, 0x14, 0xF8, 0x51, 0x12, 0x2B, 0xBE, 0xFF,
+ 0x68, 0xE7, 0xD9, 0xA5, 0xA4, 0x2E, 0xD5, 0xAA, 0xE2, 0xFA, 0x80, 0x58, 0xAC, 0xD1, 0x6C, 0xDD,
+ 0xB6, 0x40, 0xB6, 0xCE, 0x39, 0x6B, 0x95, 0x5C, 0xFF, 0x46, 0x7D, 0x2F, 0x03, 0xCA, 0xE1, 0x92,
+ 0x5E, 0x2D, 0xD5, 0x58, 0x56, 0x82, 0xE1, 0x7D, 0x13, 0x21, 0xB0, 0x76, 0x1A, 0x92, 0xDE, 0x77,
+ 0xB4, 0x05, 0xD0, 0xBC, 0xC9, 0xE3, 0xCE, 0xD2, 0xB9, 0x2B, 0x70, 0xBD, 0xF4, 0x79, 0x3C, 0xFA,
+ 0xF3, 0x91, 0x51, 0xAA, 0xF4, 0xF0, 0x14, 0x0C, 0x4E, 0xD1, 0x66, 0x60, 0x90, 0x16, 0x5B, 0xEF,
+ 0x34, 0xE8, 0xB1, 0x5A, 0x2B, 0x8E, 0x2C, 0x11, 0x39, 0x2D, 0x37, 0x43, 0x4F, 0xA3, 0x9C, 0x0B,
+ 0x19, 0x19, 0x3D, 0x30, 0xCA, 0x51, 0x07, 0x67, 0x5A, 0xD2, 0xE0, 0x1D, 0x6C, 0xDD, 0xB2, 0xF8,
+ 0x9E, 0x32, 0x07, 0x7A, 0x33, 0x26, 0x2F, 0x3A, 0x71, 0x25, 0xB0, 0x26, 0xDF, 0xAB, 0xEE, 0xCC,
+ 0xAD, 0xA9, 0x46, 0x40, 0x65, 0xD6, 0x51, 0xD2, 0x12, 0x5D, 0x27, 0x4F, 0xBB, 0x95, 0x51, 0x87,
+ 0x55, 0xB2, 0xF7, 0xEB, 0x89, 0x65, 0xDF, 0xCA, 0xDF, 0xA2, 0x55, 0xAD, 0xA0, 0x19, 0x6A, 0xE5,
+ 0x88, 0x0A, 0xCE, 0x24, 0xA2, 0xA7, 0xEB, 0x0C, 0x29, 0xDC, 0x24, 0x09, 0x93, 0x99, 0x50, 0x2C,
+ 0xB7, 0x0F, 0x21, 0xB7, 0x71, 0xF6, 0x8B, 0x3F, 0x69, 0x0C, 0x32, 0xA1, 0x18, 0x3A, 0x81, 0xEE,
+ 0x42, 0x67, 0x82, 0x5E, 0xE1, 0x7B, 0x1C, 0x6F, 0x57, 0xA9, 0x60, 0x38, 0x53, 0x42, 0x04, 0x65,
+ 0x21, 0x31, 0x8B, 0xB8, 0xEA, 0x9F, 0x0D, 0xA6, 0xAE, 0xD8, 0x4D, 0x9B, 0xCB, 0x36, 0x53, 0xC4,
+ 0x60, 0x2F, 0x84, 0x0E, 0x64, 0xBF, 0xCE, 0x08, 0x89, 0xD0, 0x2B, 0xB9, 0xE3, 0x87, 0xEC, 0x10,
+ 0xA8, 0x61, 0x70, 0xF7, 0xE5, 0x23, 0xAA, 0x2E, 0x7A, 0x70, 0x64, 0x5D, 0x04, 0xD6, 0xC6, 0xA2,
+ 0xA9, 0x3B, 0x79, 0xD6, 0x9A, 0x9A, 0x15, 0x39, 0xDF, 0xF4, 0x4A, 0x2A, 0xE0, 0x2C, 0x67, 0xC7,
+ 0x01, 0xF3, 0x02, 0x6B, 0xE4, 0xF4, 0xE0, 0x77, 0x17, 0xA2, 0xEC, 0x93, 0xD3, 0x61, 0x49, 0xB4,
+ 0xAC, 0x52, 0x3A, 0x84, 0xFA, 0x3E, 0x2C, 0xD8, 0xAB, 0xD9, 0xE6, 0xDD, 0x59, 0x1C, 0x1E, 0x41,
+ 0x97, 0xEF, 0x29, 0x13, 0xF2, 0x2D, 0x1D, 0x21, 0x5F, 0x6F, 0x16, 0xF2, 0x7C, 0x72, 0x69, 0xB6,
+ 0x93, 0xC9, 0xE5, 0x7A, 0x1B, 0x4E, 0x10, 0x78, 0x6C, 0x79, 0x4B, 0x23, 0x73, 0x02, 0x9B, 0xF2,
+ 0xE0, 0xC3, 0xDB, 0x58, 0xF3, 0x23, 0x37, 0xC9, 0x06, 0x20, 0xF1, 0x08, 0x34, 0x47, 0x91, 0xB0,
+ 0x8E, 0xF3, 0xFF, 0xFE, 0x83, 0x4A, 0x97, 0xA4, 0x55, 0x22, 0x55, 0xF3, 0x9F, 0x41, 0x7F, 0xE1,
+ 0xF5, 0xE3, 0x42, 0xAE, 0x54, 0xF0, 0x83, 0x68, 0x08, 0x09, 0x2C, 0x95, 0x6C, 0x23, 0x11, 0x7E,
+ 0x9F, 0x7D, 0x53, 0x78, 0xA1, 0x6B, 0x02, 0x14, 0x8C, 0xDD, 0xF2, 0x34, 0x35, 0x7D, 0xF7, 0xCB,
+ 0xEF, 0x68, 0x04, 0x07, 0x2C, 0xC2, 0x36, 0x1E, 0x15, 0x17, 0x15, 0x6B, 0x74, 0x56, 0xC4, 0x12,
+ 0xB7, 0xBF, 0xC8, 0xDB, 0x66, 0xF2, 0x88, 0xFA, 0xEB, 0xD3, 0xA3, 0x99, 0xBE, 0xD3, 0x21, 0x35,
+ 0x05, 0xED, 0x73, 0x9A, 0xA0, 0x14, 0x3C, 0x24, 0x0A, 0xDF, 0x97, 0x0F, 0x1B, 0xA2, 0x9A, 0xB0,
+ 0x0F, 0x01, 0xAD, 0x1D, 0x87, 0xED, 0x21, 0x8F, 0x2F, 0xA8, 0x4D, 0xFD, 0x02, 0x5E, 0x4B, 0xEA,
+ 0xAD, 0x44, 0x2D, 0x58, 0xB4, 0xC8, 0x8F, 0x40, 0x38, 0x9D, 0x93, 0x3D, 0x32, 0x28, 0x6C, 0x50,
+ 0xE2, 0x10, 0xC1, 0x7C, 0xDD, 0x10, 0x08, 0x22, 0xB1, 0x1C, 0xB2, 0x2C, 0xA2, 0x33, 0xB5, 0x91,
+ 0x55, 0x3C, 0xDA, 0xAA, 0xF2, 0xDA, 0xBF, 0x97, 0xA8, 0xB0, 0x81, 0x21, 0xD8, 0x5E, 0xBE, 0xCE,
+ 0x21, 0x55, 0xD7, 0xBE, 0xC0, 0xAF, 0xDE, 0xF3, 0xB7, 0x5E, 0xDB, 0x98, 0x40, 0x71, 0x8D, 0xB0,
+ 0xDD, 0xAB, 0x7D, 0xEB, 0x68, 0x9C, 0xAD, 0x24, 0xA6, 0xE1, 0xB0, 0x90, 0x79, 0xAC, 0xEB, 0xD4,
+ 0x9D, 0x69, 0x09, 0xE8, 0xE1, 0x7E, 0xFD, 0xE5, 0xAD, 0x59, 0xD2, 0x3A, 0xBD, 0x83, 0x96, 0xC8,
+ 0x04, 0xF4, 0x8E, 0x55, 0x56, 0xBC, 0x95, 0xC9, 0x0D, 0x9E, 0xC6, 0x6F, 0xA3, 0x4F, 0x68, 0xD2,
+ 0x78, 0x16, 0x57, 0x5D, 0x09, 0xE0, 0x61, 0xC5, 0xAD, 0x3F, 0xD1, 0xE0, 0xFA, 0xE8, 0x1D, 0x77,
+ 0x70, 0x42, 0xF7, 0x53, 0x47, 0xAA, 0xBB, 0x7D, 0xF3, 0xBA, 0xC9, 0x26, 0xB2, 0xC9, 0xC3, 0x0A,
+ 0x17, 0x4C, 0x2A, 0x1B, 0xB6, 0x12, 0x32, 0x54, 0x9A, 0xB1, 0xEA, 0xC7, 0xB5, 0x28, 0x5F, 0x59,
+ 0xD9, 0x19, 0x4E, 0xFF, 0x0D, 0xB1, 0x67, 0x40, 0xD3, 0x76, 0xA7, 0x0A, 0x94, 0xD9, 0x75, 0x71,
+ 0xCE, 0x6E, 0xE5, 0xFB, 0xD8, 0x9F, 0xB6, 0x5F, 0x91, 0x74, 0x68, 0x9F, 0x7C, 0xA3, 0x99, 0x3A,
+ 0xD9, 0x0C, 0x83, 0x64, 0xFB, 0x7E, 0xB2, 0x9B, 0x1A, 0x5F, 0xDA, 0x85, 0xB5, 0xB9, 0x4C, 0xB1,
+ 0x72, 0xA2, 0x1B, 0x92, 0x20, 0x7A, 0x77, 0xD3, 0x41, 0x8E, 0x1B, 0xF1, 0xC3, 0x5A, 0x6B, 0xF0,
+ 0x66, 0x16, 0x94, 0x1F, 0x57, 0x5A, 0xC1, 0x16, 0xB3, 0xF9, 0xE9, 0xFA, 0x0C, 0x28, 0xC5, 0x32,
+ 0x6F, 0x04, 0xF1, 0xAF, 0x66, 0x9F, 0xF8, 0x72, 0xD6, 0x91, 0x5F, 0x4C, 0xE9, 0x9A, 0xA8, 0x38,
+ 0x47, 0x6C, 0x8C, 0x00, 0xB4, 0x47, 0x20, 0x41, 0x68, 0x12, 0x54, 0x51, 0x1A, 0x56, 0x66, 0x56,
+ 0x4B, 0xC3, 0x59, 0xC7, 0x9C, 0x49, 0x74, 0x06, 0xAB, 0x45, 0x1D, 0x7B, 0x01, 0xA0, 0xF5, 0x34,
+ 0x9E, 0xE3, 0xAD, 0x5B, 0x3A, 0x12, 0x33, 0x3E, 0x03, 0xB7, 0xA6, 0x92, 0x62, 0x11, 0x75, 0x5D,
+ 0xE4, 0xB9, 0x78, 0x43, 0xCC, 0x4D, 0xF7, 0x03, 0x0C, 0x5A, 0xED, 0x74, 0x55, 0x96, 0x91, 0x29,
+ 0xFA, 0xBA, 0xC6, 0x38, 0xCB, 0x22, 0xF2, 0x90, 0x6B, 0x7B, 0x3D, 0xFF, 0xEF, 0x94, 0x29, 0x59,
+ 0x33, 0x8B, 0x60, 0x66, 0xE7, 0x32, 0xFD, 0x6B, 0xE1, 0x19, 0x68, 0x2F, 0xD3, 0x71, 0xA0, 0x70,
+ 0xE9, 0xAF, 0xE6, 0x25, 0x4E, 0xE8, 0x46, 0x08, 0x1C, 0xF1, 0xE3, 0x60, 0x75, 0x63, 0xF2, 0xAC,
+ 0xAE, 0x25, 0x45, 0x6E, 0xB7, 0x43, 0x71, 0xFD, 0xF9, 0x0B, 0x34, 0x2F, 0xDA, 0xBD, 0x6B, 0x27,
+ 0x68, 0x0D, 0x27, 0x8D, 0xDE, 0xC7, 0x7C, 0x8D, 0x24, 0xC4, 0xCB, 0x9B, 0xED, 0x80, 0x01, 0x14,
+ 0x02, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72,
+ 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
new file mode 100644
index 0000000000..18cde34c66
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
@@ -0,0 +1,2099 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSymbolFontData [16729] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xf,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6d,
+ 0x62, 0x6f, 0x6c, 0x4f, 0x54, 0x46, 0x0, 0x1,
+ 0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0xad,
+ 0x1, 0xf8, 0xae, 0x2, 0xf8, 0xae, 0x3, 0xf8,
+ 0x18, 0x4, 0xfb, 0x48, 0xfb, 0xba, 0xfa, 0xd6,
+ 0xfa, 0x86, 0x5, 0x1c, 0x6, 0x3d, 0xf, 0x1c,
+ 0x6, 0x89, 0x11, 0xab, 0x1c, 0x3e, 0xa2, 0x12,
+ 0x0, 0x94, 0x2, 0x0, 0x1, 0x0, 0x6, 0x0,
+ 0xa, 0x0, 0xf, 0x0, 0x16, 0x0, 0x1a, 0x0,
+ 0x1d, 0x0, 0x22, 0x0, 0x26, 0x0, 0x2b, 0x0,
+ 0x31, 0x0, 0x33, 0x0, 0x35, 0x0, 0x37, 0x0,
+ 0x3e, 0x0, 0x40, 0x0, 0x43, 0x0, 0x48, 0x0,
+ 0x4b, 0x0, 0x52, 0x0, 0x55, 0x0, 0x58, 0x0,
+ 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x69, 0x0,
+ 0x6e, 0x0, 0x75, 0x0, 0x79, 0x0, 0x7c, 0x0,
+ 0x81, 0x0, 0x85, 0x0, 0x8a, 0x0, 0x90, 0x0,
+ 0x92, 0x0, 0x94, 0x0, 0x9b, 0x0, 0x9d, 0x0,
+ 0xa0, 0x0, 0xa6, 0x0, 0xab, 0x0, 0xae, 0x0,
+ 0xb5, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xbe, 0x0,
+ 0xc3, 0x0, 0xc9, 0x0, 0xd1, 0x0, 0xd5, 0x0,
+ 0xdb, 0x0, 0xe1, 0x0, 0xe7, 0x0, 0xeb, 0x0,
+ 0xf3, 0x0, 0xfe, 0x1, 0x6, 0x1, 0xb, 0x1,
+ 0x10, 0x1, 0x19, 0x1, 0x20, 0x1, 0x2a, 0x1,
+ 0x33, 0x1, 0x3c, 0x1, 0x4a, 0x1, 0x56, 0x1,
+ 0x60, 0x1, 0x6d, 0x1, 0x79, 0x1, 0x85, 0x1,
+ 0x8e, 0x1, 0x99, 0x1, 0xa4, 0x1, 0xac, 0x1,
+ 0xb1, 0x1, 0xb9, 0x1, 0xc0, 0x1, 0xca, 0x1,
+ 0xd2, 0x1, 0xd9, 0x1, 0xe2, 0x1, 0xee, 0x1,
+ 0xf5, 0x2, 0x1, 0x2, 0x9, 0x2, 0xe, 0x2,
+ 0x18, 0x2, 0x21, 0x2, 0x2d, 0x2, 0x32, 0x2,
+ 0x3a, 0x2, 0x43, 0x2, 0x4a, 0x2, 0x53, 0x2,
+ 0x5e, 0x2, 0x66, 0x2, 0x71, 0x2, 0x7a, 0x2,
+ 0x86, 0x2, 0x92, 0x2, 0xa0, 0x2, 0xa9, 0x2,
+ 0xb5, 0x2, 0xc3, 0x2, 0xcd, 0x2, 0xdb, 0x2,
+ 0xe8, 0x2, 0xef, 0x2, 0xf9, 0x3, 0x3, 0x3,
+ 0xc, 0x3, 0x16, 0x3, 0x1d, 0x3, 0x22, 0x3,
+ 0x26, 0x3, 0x2b, 0x3, 0x32, 0x3, 0x40, 0x3,
+ 0x4d, 0x3, 0x5b, 0x3, 0x64, 0x3, 0x6f, 0x3,
+ 0x7b, 0x3, 0x87, 0x3, 0x94, 0x3, 0xa1, 0x3,
+ 0xac, 0x3, 0xb7, 0x3, 0xc2, 0x3, 0xcf, 0x3,
+ 0xdc, 0x3, 0xe9, 0x3, 0xf4, 0x4, 0x0, 0x4,
+ 0xb, 0x4, 0x12, 0x4, 0x1c, 0x4, 0x28, 0x4,
+ 0x34, 0x4, 0x40, 0x4, 0x4e, 0x4, 0x5c, 0x4,
+ 0x6a, 0x4, 0x76, 0x4, 0x83, 0x4, 0x8f, 0x4,
+ 0x94, 0x4, 0xbe, 0x4, 0xce, 0x41, 0x6c, 0x70,
+ 0x68, 0x61, 0x42, 0x65, 0x74, 0x61, 0x47, 0x61,
+ 0x6d, 0x6d, 0x61, 0x45, 0x70, 0x73, 0x69, 0x6c,
+ 0x6f, 0x6e, 0x5a, 0x65, 0x74, 0x61, 0x45, 0x74,
+ 0x61, 0x54, 0x68, 0x65, 0x74, 0x61, 0x49, 0x6f,
+ 0x74, 0x61, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x4c,
+ 0x61, 0x6d, 0x62, 0x64, 0x61, 0x4d, 0x75, 0x4e,
+ 0x75, 0x58, 0x69, 0x4f, 0x6d, 0x69, 0x63, 0x72,
+ 0x6f, 0x6e, 0x50, 0x69, 0x52, 0x68, 0x6f, 0x53,
+ 0x69, 0x67, 0x6d, 0x61, 0x54, 0x61, 0x75, 0x55,
+ 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x50, 0x68,
+ 0x69, 0x43, 0x68, 0x69, 0x50, 0x73, 0x69, 0x61,
+ 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x61,
+ 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x64, 0x65, 0x6c,
+ 0x74, 0x61, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+ 0x6e, 0x7a, 0x65, 0x74, 0x61, 0x65, 0x74, 0x61,
+ 0x74, 0x68, 0x65, 0x74, 0x61, 0x69, 0x6f, 0x74,
+ 0x61, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x6c, 0x61,
+ 0x6d, 0x62, 0x64, 0x61, 0x6e, 0x75, 0x78, 0x69,
+ 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x70,
+ 0x69, 0x72, 0x68, 0x6f, 0x73, 0x69, 0x67, 0x6d,
+ 0x61, 0x31, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x74,
+ 0x61, 0x75, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+ 0x6e, 0x70, 0x68, 0x69, 0x63, 0x68, 0x69, 0x70,
+ 0x73, 0x69, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74,
+ 0x68, 0x65, 0x74, 0x61, 0x31, 0x55, 0x70, 0x73,
+ 0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x70, 0x68, 0x69,
+ 0x31, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x6d,
+ 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x65, 0x63,
+ 0x6f, 0x6e, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x49,
+ 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x77,
+ 0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61,
+ 0x73, 0x73, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74,
+ 0x75, 0x72, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x61,
+ 0x6c, 0x65, 0x70, 0x68, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72,
+ 0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x61,
+ 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68,
+ 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65,
+ 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65,
+ 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x62, 0x6c, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62,
+ 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72,
+ 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74,
+ 0x68, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+ 0x61, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+ 0x6c, 0x64, 0x69, 0x66, 0x66, 0x65, 0x78, 0x69,
+ 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74,
+ 0x44, 0x65, 0x6c, 0x74, 0x61, 0x67, 0x72, 0x61,
+ 0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x6e, 0x6f, 0x74, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75,
+ 0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x75, 0x6d,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73,
+ 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61,
+ 0x74, 0x68, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61,
+ 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x6e, 0x67,
+ 0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+ 0x6c, 0x61, 0x6e, 0x64, 0x6c, 0x6f, 0x67, 0x69,
+ 0x63, 0x61, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x68,
+ 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x73,
+ 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x63, 0x6f,
+ 0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x61,
+ 0x70, 0x70, 0x72, 0x6f, 0x78, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61,
+ 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x73,
+ 0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65,
+ 0x72, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, 0x73,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66,
+ 0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73,
+ 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x63,
+ 0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75,
+ 0x73, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d,
+ 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x70,
+ 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63,
+ 0x75, 0x6c, 0x61, 0x72, 0x64, 0x6f, 0x74, 0x6d,
+ 0x61, 0x74, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x67,
+ 0x72, 0x61, 0x6c, 0x74, 0x70, 0x69, 0x6e, 0x74,
+ 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x61,
+ 0x6e, 0x67, 0x6c, 0x65, 0x6c, 0x65, 0x66, 0x74,
+ 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x6c, 0x6f, 0x7a, 0x65, 0x6e, 0x67,
+ 0x65, 0x73, 0x70, 0x61, 0x64, 0x65, 0x63, 0x6c,
+ 0x75, 0x62, 0x68, 0x65, 0x61, 0x72, 0x74, 0x64,
+ 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x63, 0x6f,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+ 0x65, 0x72, 0x69, 0x66, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x65, 0x72, 0x73, 0x65, 0x72, 0x69,
+ 0x66, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61,
+ 0x72, 0x6b, 0x73, 0x65, 0x72, 0x69, 0x66, 0x72,
+ 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x76, 0x65, 0x72,
+ 0x74, 0x65, 0x78, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x78, 0x72,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73,
+ 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x70, 0x79, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6e, 0x73,
+ 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72,
+ 0x6b, 0x73, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72,
+ 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66,
+ 0x74, 0x65, 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e,
+ 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72,
+ 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66,
+ 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78,
+ 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c,
+ 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61,
+ 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+ 0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66,
+ 0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, 0x63,
+ 0x65, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x65, 0x78, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x65, 0x78,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x74, 0x70, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63,
+ 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65,
+ 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+ 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x62, 0x72,
+ 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x6d, 0x69, 0x64, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x62, 0x74, 0x61, 0x70, 0x70, 0x6c, 0x65,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+ 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x4f,
+ 0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,
+ 0x0, 0x4, 0x0, 0x0, 0x6, 0x1, 0x0, 0x9,
+ 0x1, 0x0, 0xc, 0x1, 0x0, 0xf, 0x11, 0x0,
+ 0x3c, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x40, 0x0,
+ 0x0, 0x5c, 0x2, 0x0, 0x97, 0x0, 0x0, 0xa1,
+ 0x0, 0x0, 0x9c, 0x0, 0x0, 0x98, 0x0, 0x0,
+ 0xa8, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x65, 0x0,
+ 0x1, 0x87, 0x31, 0x0, 0x74, 0x0, 0x0, 0x79,
+ 0x0, 0x1, 0xb9, 0x1, 0x0, 0x63, 0x0, 0x1,
+ 0xbb, 0x1b, 0x0, 0xa6, 0x0, 0x1, 0xd7, 0x41,
+ 0x0, 0xbf, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0,
+ 0x7, 0x0, 0x3b, 0x0, 0xad, 0x1, 0x68, 0x2,
+ 0x26, 0x2, 0x5c, 0x2, 0x8f, 0x2, 0xb0, 0x3,
+ 0x4, 0x3, 0x13, 0x3, 0x27, 0x3, 0x73, 0x3,
+ 0xa3, 0x3, 0xf5, 0x4, 0x65, 0x4, 0x99, 0x4,
+ 0xf2, 0x5, 0x53, 0x5, 0x7a, 0x5, 0xf1, 0x6,
+ 0x56, 0x6, 0x6d, 0x6, 0xd9, 0x6, 0xf0, 0x7,
+ 0x3, 0x7, 0x1c, 0x7, 0x79, 0x7, 0x9a, 0x7,
+ 0xbc, 0x7, 0xcc, 0x8, 0x17, 0x8, 0x2d, 0x8,
+ 0x79, 0x8, 0x91, 0x8, 0xc9, 0x8, 0xf8, 0x9,
+ 0x6e, 0x9, 0x9d, 0x9, 0xbd, 0xa, 0x3c, 0xa,
+ 0xa0, 0xb, 0xa, 0xb, 0x4c, 0xb, 0xa9, 0xb,
+ 0xe8, 0xc, 0x18, 0xc, 0xb5, 0xc, 0xc4, 0xd,
+ 0x1e, 0xd, 0x6f, 0xd, 0xca, 0xe, 0x11, 0xe,
+ 0x88, 0xe, 0xdd, 0xf, 0x1c, 0xf, 0x69, 0xf,
+ 0xa5, 0xf, 0xde, 0x10, 0x2e, 0x10, 0xab, 0x11,
+ 0x40, 0x11, 0xab, 0x12, 0x1a, 0x12, 0xa8, 0x13,
+ 0x2, 0x13, 0x87, 0x14, 0xa, 0x14, 0x90, 0x14,
+ 0xf6, 0x15, 0x4d, 0x15, 0x89, 0x16, 0x4, 0x16,
+ 0x61, 0x16, 0xac, 0x17, 0x62, 0x17, 0xa8, 0x18,
+ 0x10, 0x18, 0x71, 0x18, 0xe3, 0x19, 0x2e, 0x19,
+ 0x80, 0x19, 0xe3, 0x1a, 0x47, 0x1a, 0xa3, 0x1b,
+ 0x18, 0x1b, 0x93, 0x1c, 0x24, 0x1c, 0x85, 0x1c,
+ 0xf2, 0x1d, 0x87, 0x1d, 0xab, 0x1d, 0xd0, 0x1d,
+ 0xf2, 0x1e, 0x1f, 0x1e, 0x38, 0x1e, 0xc3, 0x1f,
+ 0x58, 0x20, 0xc, 0x20, 0xe9, 0x21, 0x72, 0x22,
+ 0x1a, 0x22, 0x4b, 0x22, 0x79, 0x22, 0xa5, 0x22,
+ 0xd4, 0x23, 0x31, 0x23, 0x53, 0x23, 0x96, 0x23,
+ 0xd5, 0x24, 0xf, 0x24, 0x4e, 0x24, 0xad, 0x24,
+ 0xde, 0x25, 0x46, 0x25, 0x6b, 0x25, 0xea, 0x26,
+ 0xe, 0x26, 0x33, 0x26, 0x74, 0x26, 0xe6, 0x27,
+ 0x31, 0x27, 0x80, 0x27, 0xd8, 0x27, 0xe3, 0x28,
+ 0xf3, 0x29, 0x16, 0x29, 0x88, 0x29, 0xf3, 0x2a,
+ 0xa, 0x2a, 0x26, 0x2a, 0x49, 0x2a, 0x7f, 0x2a,
+ 0xb5, 0x2b, 0xc, 0x2b, 0x54, 0x2b, 0xa0, 0x2b,
+ 0xfb, 0x2c, 0x46, 0x2c, 0x84, 0x2c, 0xa1, 0x2c,
+ 0xb3, 0x2c, 0xc8, 0x2c, 0xfa, 0x2d, 0x24, 0x2d,
+ 0x7a, 0x2d, 0xb6, 0x2d, 0xef, 0x2e, 0x31, 0x2e,
+ 0x7d, 0x2e, 0x98, 0x2e, 0xb7, 0x2e, 0xf1, 0x2f,
+ 0x2d, 0x2f, 0x45, 0x2f, 0x5f, 0x2f, 0x95, 0x2f,
+ 0xff, 0x30, 0x8e, 0x30, 0xda, 0x30, 0xf9, 0x31,
+ 0x55, 0x31, 0xeb, 0x32, 0x87, 0x32, 0x99, 0x32,
+ 0xab, 0x32, 0xc0, 0x33, 0x45, 0x33, 0x92, 0x33,
+ 0xdb, 0x34, 0x6, 0x34, 0x12, 0x34, 0x3a, 0x34,
+ 0x57, 0x34, 0x68, 0x34, 0x84, 0x34, 0xa7, 0x34,
+ 0xd5, 0x34, 0xf4, 0x34, 0xfb, 0x35, 0xe, 0x35,
+ 0x35, 0x35, 0x43, 0x35, 0x6b, 0x35, 0x8a, 0x35,
+ 0x9e, 0x35, 0xbb, 0x35, 0xd7, 0x36, 0x5, 0x36,
+ 0x21, 0x36, 0x97, 0xfc, 0x45, 0xe, 0xfc, 0x45,
+ 0xe, 0xfb, 0xf2, 0x7a, 0xf7, 0x4, 0xf8, 0xd5,
+ 0x77, 0x1, 0xf7, 0x14, 0xf7, 0x4, 0x3, 0xf7,
+ 0x42, 0xf7, 0x64, 0x15, 0x7f, 0x8c, 0x90, 0x85,
+ 0x8f, 0x1b, 0x8f, 0x8f, 0x91, 0x97, 0x8d, 0x1f,
+ 0xb0, 0xf7, 0xb8, 0x94, 0xc1, 0xb6, 0x1a, 0xcb,
+ 0x69, 0x96, 0x75, 0x75, 0x69, 0x81, 0x4a, 0x1e,
+ 0xfc, 0xc2, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0x90,
+ 0x76, 0xf7, 0x64, 0xb9, 0xf7, 0x4a, 0xb9, 0xf7,
+ 0x63, 0x77, 0x1, 0x9f, 0xf8, 0x61, 0x3, 0xe9,
+ 0x7b, 0x15, 0xba, 0x6, 0xa8, 0xf7, 0x64, 0x5,
+ 0xf7, 0x10, 0x6, 0x6f, 0xfb, 0x64, 0x5, 0xba,
+ 0x6, 0xa7, 0xf7, 0x64, 0x5, 0xf3, 0x6, 0x91,
+ 0xb9, 0x5, 0x24, 0x6, 0xa3, 0xf7, 0x4a, 0x5,
+ 0xf2, 0x6, 0x91, 0xb9, 0x5, 0x25, 0x6, 0xa7,
+ 0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6f, 0xfb, 0x63,
+ 0x5, 0xfb, 0x11, 0x6, 0xa8, 0xf7, 0x63, 0x5,
+ 0x5c, 0x6, 0x6e, 0xfb, 0x63, 0x5, 0x27, 0x6,
+ 0x85, 0x5d, 0x5, 0xef, 0x6, 0x72, 0xfb, 0x4a,
+ 0x5, 0x24, 0x6, 0x85, 0x5d, 0x5, 0xf2, 0x6,
+ 0xc0, 0xb9, 0x15, 0xa4, 0xf7, 0x4a, 0x5, 0xf7,
+ 0x10, 0x6, 0x73, 0xfb, 0x4a, 0x5, 0xe, 0xf7,
+ 0x2a, 0x5d, 0xb1, 0xf7, 0xa6, 0xbc, 0x7c, 0xb1,
+ 0xf7, 0x70, 0xa7, 0xd0, 0x77, 0x12, 0xca, 0xdc,
+ 0xf7, 0x70, 0xa8, 0xb7, 0xd6, 0xf7, 0x79, 0xaa,
+ 0x13, 0xdf, 0x80, 0xf7, 0x3f, 0x67, 0x15, 0xc2,
+ 0x6, 0xf8, 0x4d, 0xf9, 0x47, 0x5, 0x54, 0x6,
+ 0x66, 0x82, 0x33, 0x6b, 0x5c, 0x1b, 0x53, 0x8a,
+ 0x6c, 0xa4, 0x83, 0x8f, 0x8, 0xa0, 0x71, 0x79,
+ 0x9f, 0x63, 0x1b, 0xfb, 0x4, 0xfb, 0x6, 0xfb,
+ 0x23, 0xfb, 0x19, 0x40, 0xb9, 0x65, 0xc7, 0xf7,
+ 0x1a, 0xe4, 0xf7, 0x25, 0xef, 0x8c, 0x1f, 0xa0,
+ 0x8b, 0xa0, 0x88, 0x9f, 0x1e, 0x9c, 0x81, 0xaa,
+ 0x85, 0xac, 0x8c, 0xb0, 0x8c, 0xb3, 0x93, 0xa4,
+ 0x9b, 0x8, 0xfb, 0x69, 0x87, 0x15, 0x8d, 0x76,
+ 0x8d, 0x80, 0x6f, 0x1a, 0x3a, 0x45, 0xfb, 0xf,
+ 0x27, 0x66, 0x7e, 0xb3, 0xad, 0xe3, 0xda, 0xf7,
+ 0x14, 0xcd, 0x95, 0x1e, 0x9b, 0x7e, 0xac, 0x7d,
+ 0xa1, 0x82, 0x8, 0xd8, 0xfc, 0x7e, 0x15, 0x3b,
+ 0xbc, 0x5e, 0xd8, 0xf7, 0xc, 0xe4, 0xf7, 0x2a,
+ 0xf2, 0x1e, 0x13, 0xbf, 0x80, 0xc2, 0x76, 0xcd,
+ 0x35, 0xfb, 0x18, 0x2b, 0xfb, 0x20, 0xfb, 0x1,
+ 0x1e, 0xd6, 0x80, 0x15, 0xe8, 0xdf, 0xf7, 0x16,
+ 0xd3, 0x8a, 0x1e, 0xc6, 0x99, 0x5c, 0x60, 0x38,
+ 0x38, 0xfb, 0x11, 0x26, 0x6c, 0x7d, 0xb0, 0xb2,
+ 0x1f, 0xe, 0xea, 0x79, 0xc6, 0x50, 0xd6, 0xf7,
+ 0xed, 0x9d, 0xf7, 0x5d, 0xb3, 0x12, 0xb4, 0xe8,
+ 0xc9, 0xd7, 0x8b, 0xf7, 0x38, 0x8b, 0xbd, 0x13,
+ 0x7f, 0xf8, 0x3e, 0xdd, 0x15, 0x76, 0xa0, 0xd2,
+ 0x3c, 0xdb, 0x1b, 0x13, 0xbf, 0xdb, 0xb2, 0xb4,
+ 0xd8, 0xac, 0x1f, 0x7b, 0x99, 0x5, 0x66, 0x61,
+ 0x64, 0x77, 0x73, 0x1b, 0x4f, 0x56, 0xc2, 0xaa,
+ 0x6c, 0x1f, 0xcc, 0xd7, 0x9f, 0xb7, 0xb2, 0xc8,
+ 0x8, 0xaf, 0xa2, 0xa3, 0xb5, 0xbd, 0x1b, 0x9d,
+ 0xfb, 0x67, 0x79, 0x7, 0xae, 0xa2, 0x7d, 0x71,
+ 0x52, 0x48, 0xfb, 0xa, 0x75, 0x7b, 0x1f, 0x4d,
+ 0xd3, 0x60, 0xd6, 0x69, 0xc9, 0x8, 0xe2, 0xb1,
+ 0xd5, 0xab, 0xe8, 0x1a, 0xc9, 0x4d, 0xc3, 0x49,
+ 0x27, 0x4d, 0x54, 0x24, 0x1e, 0x13, 0x9f, 0x56,
+ 0x9e, 0x6f, 0x9c, 0x5b, 0x1e, 0xfb, 0x2, 0x44,
+ 0x3a, 0x5f, 0xfb, 0xd, 0x1a, 0xfb, 0x0, 0xe2,
+ 0x5b, 0xe4, 0xf7, 0x11, 0xc2, 0xd0, 0xaa, 0xa8,
+ 0x1e, 0xfb, 0xd, 0xf7, 0xdc, 0x15, 0x7c, 0xb0,
+ 0x79, 0xbc, 0xb8, 0x1a, 0xb6, 0xb1, 0xb0, 0xba,
+ 0xaf, 0xb6, 0x6a, 0x52, 0x51, 0x3c, 0x6a, 0x57,
+ 0x6d, 0x1e, 0xe8, 0xfb, 0xc4, 0x15, 0x13, 0xbf,
+ 0x82, 0x83, 0x4e, 0x53, 0x48, 0x1b, 0x44, 0x52,
+ 0xc9, 0xda, 0xe4, 0xd2, 0xb1, 0xb4, 0xaa, 0x1f,
+ 0xba, 0x3b, 0xa2, 0x5b, 0xde, 0x24, 0x8, 0xe,
+ 0x50, 0xa, 0xc0, 0xdd, 0x3, 0xf7, 0xb6, 0xfb,
+ 0x53, 0x15, 0x95, 0x9c, 0x5, 0xfb, 0xe, 0xe6,
+ 0x60, 0xf7, 0x35, 0xf7, 0x3a, 0x1a, 0xf7, 0x40,
+ 0xad, 0xf7, 0x2f, 0xf7, 0x17, 0xe0, 0x1e, 0x81,
+ 0x9c, 0x5, 0xfb, 0x0, 0x72, 0xfb, 0x15, 0xfb,
+ 0x2a, 0xfb, 0x95, 0x1a, 0xfb, 0x7a, 0xf7, 0x22,
+ 0xfb, 0x48, 0xea, 0x75, 0x1e, 0xe, 0x50, 0xa,
+ 0xf7, 0x58, 0xdd, 0x3, 0xb4, 0xfb, 0x53, 0x15,
+ 0xea, 0xa1, 0xf7, 0x22, 0xf7, 0x48, 0xf7, 0x7a,
+ 0x1a, 0xf7, 0x95, 0xfb, 0x15, 0xf7, 0x2a, 0xfb,
+ 0x0, 0xa4, 0x1e, 0x81, 0x7a, 0x5, 0xf7, 0x17,
+ 0x36, 0xad, 0xfb, 0x2f, 0xfb, 0x40, 0x1a, 0xfb,
+ 0x3a, 0x60, 0xfb, 0x35, 0xfb, 0xe, 0x30, 0x1e,
+ 0xe, 0xf7, 0xbe, 0x8b, 0x1, 0xf7, 0x8b, 0xc2,
+ 0x3, 0x95, 0xf7, 0x87, 0x15, 0xf7, 0x81, 0xfb,
+ 0x87, 0xc2, 0xf7, 0x87, 0xf7, 0x81, 0xc2, 0xfb,
+ 0x81, 0xf7, 0x7f, 0x54, 0xfb, 0x7f, 0xfb, 0x81,
+ 0x6, 0xe, 0xfc, 0x45, 0xfb, 0x17, 0x76, 0xf7,
+ 0x24, 0xf7, 0x4, 0x22, 0xf4, 0x12, 0xc3, 0xf7,
+ 0x1e, 0x13, 0xd0, 0xc3, 0xb8, 0x15, 0x6b, 0x9e,
+ 0x76, 0xaf, 0x1e, 0x13, 0xb0, 0x97, 0x99, 0x93,
+ 0x8a, 0x93, 0x1f, 0x8f, 0x8a, 0x8d, 0x89, 0x84,
+ 0x1a, 0x54, 0x51, 0x62, 0x73, 0x79, 0x1e, 0x86,
+ 0x87, 0x83, 0x86, 0x84, 0x1a, 0x84, 0x90, 0x87,
+ 0x92, 0x8f, 0x92, 0x8c, 0x90, 0x92, 0x1e, 0x9c,
+ 0x95, 0xac, 0xa4, 0x9f, 0xa4, 0x8, 0xaf, 0xb9,
+ 0x8d, 0xb4, 0xa7, 0x1a, 0xba, 0x65, 0xa7, 0x67,
+ 0x5f, 0x77, 0x6c, 0x6f, 0x1e, 0xe, 0xfc, 0x45,
+ 0x7a, 0xf7, 0x4, 0x1, 0xd0, 0xf7, 0x4, 0x3,
+ 0xd0, 0xb2, 0x15, 0x22, 0xa, 0xfc, 0x29, 0x8e,
+ 0x76, 0xf9, 0x2c, 0x77, 0x1, 0x79, 0x4, 0xb7,
+ 0x6, 0xf7, 0x66, 0xf9, 0x2c, 0x5, 0x5f, 0x6,
+ 0xe, 0xfb, 0x4b, 0x7a, 0xab, 0xf9, 0x14, 0xa9,
+ 0x1, 0xa2, 0xee, 0xf7, 0x93, 0xe9, 0x3, 0xf7,
+ 0xe, 0xf7, 0xe3, 0x15, 0xd4, 0x8b, 0xf7, 0x8b,
+ 0xf7, 0x14, 0xf7, 0x14, 0x8a, 0xfb, 0x8b, 0x42,
+ 0x38, 0x8c, 0xfb, 0x81, 0xfb, 0x14, 0xfb, 0x14,
+ 0x8b, 0xf7, 0x7f, 0xe0, 0x1e, 0x28, 0x16, 0xfb,
+ 0x11, 0xb6, 0xfb, 0x77, 0xf7, 0x4c, 0xf7, 0x4c,
+ 0xb0, 0xf7, 0x77, 0xf7, 0x11, 0xf7, 0xf, 0x66,
+ 0xf7, 0x77, 0xfb, 0x4c, 0xfb, 0x4c, 0x60, 0xfb,
+ 0x77, 0xfb, 0xf, 0x1e, 0xe, 0xfb, 0x4b, 0x3b,
+ 0xa, 0xf7, 0x69, 0xdf, 0x3, 0xf7, 0x9, 0x16,
+ 0xf7, 0xa5, 0x9d, 0x6, 0x7e, 0x3b, 0x96, 0xd2,
+ 0x1f, 0xf8, 0xd1, 0x79, 0x7, 0xfb, 0x36, 0x32,
+ 0x5, 0x79, 0x7, 0xc4, 0xa0, 0x5, 0xa7, 0x95,
+ 0x96, 0x7e, 0x77, 0x1a, 0xfc, 0x64, 0x7, 0x44,
+ 0x38, 0x80, 0x7e, 0x1e, 0xe, 0xfb, 0x4b, 0x8b,
+ 0xd7, 0xf8, 0x1c, 0x9d, 0xf7, 0xc, 0xdb, 0x1,
+ 0xf7, 0xe0, 0xe5, 0x3, 0xa4, 0x16, 0xf8, 0x1d,
+ 0x6, 0xc4, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c,
+ 0x64, 0x6e, 0x88, 0x64, 0x1b, 0xfb, 0x77, 0x6,
+ 0xf7, 0x58, 0xf7, 0x5c, 0xed, 0xf7, 0x6, 0xf5,
+ 0x1a, 0xf7, 0xd, 0x41, 0xd0, 0x22, 0x33, 0x2d,
+ 0x5a, 0xfb, 0x2b, 0x6d, 0x1e, 0xa0, 0x86, 0x5,
+ 0xc1, 0xa1, 0xa9, 0xd2, 0xe6, 0x1b, 0xf7, 0x7,
+ 0xa1, 0x30, 0x5c, 0x37, 0x5d, 0x34, 0x46, 0x40,
+ 0x1f, 0xfb, 0x54, 0xfb, 0x66, 0x5, 0xe, 0xfb,
+ 0x4b, 0x7a, 0xb2, 0xf8, 0xef, 0xc7, 0x12, 0xf7,
+ 0xcf, 0xdd, 0x65, 0xd7, 0x13, 0xd0, 0xf7, 0x25,
+ 0xf7, 0xe8, 0x15, 0xf1, 0x8c, 0xf7, 0x4, 0x5c,
+ 0xfb, 0x1, 0x1a, 0x37, 0x62, 0x3c, 0x2e, 0x6e,
+ 0x74, 0x97, 0x9c, 0x76, 0x1e, 0x9c, 0x76, 0x77,
+ 0x98, 0x74, 0x1b, 0x68, 0x7d, 0x7e, 0x6e, 0x58,
+ 0xf7, 0x10, 0x86, 0x9e, 0xf7, 0x20, 0xf7, 0x5,
+ 0xe5, 0xf7, 0x27, 0xf7, 0x16, 0x36, 0xb5, 0x5d,
+ 0x9b, 0x1f, 0x13, 0xe0, 0xcd, 0xb8, 0xa6, 0xb6,
+ 0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48,
+ 0x2c, 0x6b, 0xfb, 0x17, 0x63, 0x1e, 0x9a, 0x87,
+ 0x5, 0xa7, 0x9a, 0xbb, 0xda, 0xe6, 0x1b, 0xd5,
+ 0xac, 0x56, 0x58, 0x2f, 0x40, 0x5b, 0x2c, 0x71,
+ 0x1f, 0x86, 0x8b, 0x86, 0x86, 0x1a, 0xe, 0xfb,
+ 0x4b, 0xa0, 0x76, 0xf7, 0x33, 0xd1, 0xf8, 0x5c,
+ 0x77, 0x1, 0x9b, 0xb8, 0xf7, 0x81, 0xdf, 0x3,
+ 0x9b, 0xf7, 0x33, 0x15, 0xf7, 0xae, 0xfb, 0x33,
+ 0xdf, 0xf7, 0x33, 0xe2, 0xd1, 0x34, 0xf8, 0x5c,
+ 0x59, 0x6, 0xfb, 0xd0, 0xfc, 0x5b, 0x5, 0xb8,
+ 0x8a, 0x15, 0xf7, 0x81, 0xf7, 0xe4, 0x5, 0xfb,
+ 0xe4, 0x7, 0xe, 0xfb, 0x4b, 0x7a, 0xb3, 0xf8,
+ 0x1c, 0xe0, 0xe9, 0xda, 0x1, 0xf7, 0xf7, 0xd2,
+ 0x3, 0xc7, 0xf8, 0x33, 0x15, 0xf7, 0x7, 0x86,
+ 0xf7, 0x48, 0x59, 0xfb, 0x34, 0x1a, 0xfb, 0xe,
+ 0x42, 0x54, 0x4a, 0x70, 0x78, 0x9d, 0x9d, 0x77,
+ 0x1e, 0x9d, 0x78, 0x77, 0x9d, 0x6d, 0x1b, 0x6c,
+ 0x75, 0x7a, 0x6b, 0x57, 0xe5, 0x80, 0xbd, 0xf7,
+ 0x32, 0xee, 0xf7, 0x1, 0xf7, 0x19, 0xf7, 0x2d,
+ 0x30, 0xf7, 0x4, 0xfb, 0x57, 0x95, 0x1f, 0xaf,
+ 0xe9, 0x5, 0xf7, 0x79, 0x6, 0xb1, 0xe1, 0x7c,
+ 0x90, 0x5, 0x81, 0x81, 0x6e, 0x89, 0x64, 0x1b,
+ 0xfb, 0x48, 0x6, 0xe, 0xfb, 0x4b, 0x7d, 0xa7,
+ 0xf8, 0x4, 0xb9, 0xf7, 0x95, 0x77, 0x1, 0xad,
+ 0xe8, 0xf7, 0x8f, 0xe5, 0x3, 0xf8, 0x51, 0xf9,
+ 0x41, 0x15, 0xfb, 0x85, 0x82, 0xfb, 0x3e, 0xfb,
+ 0x4a, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, 0x2c,
+ 0xf7, 0xa, 0xf7, 0x46, 0xaf, 0xf7, 0x33, 0xd4,
+ 0xf7, 0x1a, 0x3d, 0xd7, 0x22, 0x54, 0x74, 0x7f,
+ 0x6c, 0x52, 0x1e, 0xa0, 0xf7, 0xc, 0xee, 0xf7,
+ 0x1b, 0xf7, 0x48, 0xa7, 0x8, 0xfb, 0xce, 0xfb,
+ 0xdc, 0x15, 0xad, 0xaf, 0xaf, 0x93, 0xb0, 0x1b,
+ 0xf2, 0xa9, 0x27, 0x24, 0xfb, 0x5, 0x5d, 0x57,
+ 0x4c, 0x40, 0x48, 0xd5, 0xf7, 0x3c, 0xad, 0x8c,
+ 0xa5, 0x93, 0xa3, 0x1f, 0xe, 0xfb, 0x4b, 0x92,
+ 0x76, 0xf8, 0xe9, 0xe5, 0x1, 0xf7, 0x43, 0x7b,
+ 0x15, 0xc7, 0x6, 0xf7, 0x69, 0xf9, 0x25, 0x5,
+ 0xab, 0xfb, 0xff, 0x7, 0x4e, 0xfb, 0x34, 0xa1,
+ 0x82, 0x5, 0xb3, 0xa3, 0xa6, 0xb2, 0xc3, 0x1b,
+ 0xf7, 0x6d, 0x6, 0xe, 0xfb, 0x4b, 0x79, 0xab,
+ 0xf9, 0xe, 0xb0, 0x12, 0xc1, 0xd9, 0x45, 0xd1,
+ 0xf7, 0x72, 0xcc, 0x55, 0xd6, 0x13, 0xe4, 0xf7,
+ 0x63, 0xf7, 0xcd, 0x15, 0xf7, 0x4, 0x38, 0xb9,
+ 0x6d, 0x41, 0x1a, 0x45, 0x5d, 0x61, 0x4c, 0x3a,
+ 0x60, 0xcc, 0xd8, 0xe6, 0xb3, 0xb2, 0xae, 0xa6,
+ 0x1e, 0x6f, 0xa6, 0x15, 0x34, 0x4a, 0x65, 0x61,
+ 0x34, 0x1a, 0x3d, 0xcf, 0x35, 0xf7, 0x10, 0xf7,
+ 0x3a, 0xa7, 0xf7, 0x8, 0xbf, 0xce, 0x7c, 0xc8,
+ 0xfb, 0x16, 0xe1, 0x1e, 0x13, 0xd8, 0xc1, 0xb1,
+ 0xd1, 0xbc, 0xe7, 0x1a, 0xd7, 0x4c, 0xcd, 0xfb,
+ 0x5, 0x35, 0x2c, 0x55, 0x26, 0x3a, 0xab, 0x69,
+ 0xe0, 0x40, 0x1e, 0xde, 0xbd, 0x15, 0x68, 0xa1,
+ 0x30, 0xc4, 0xd9, 0x1a, 0xbb, 0xab, 0xc0, 0xd6,
+ 0xd8, 0xad, 0x55, 0x54, 0x33, 0x56, 0x66, 0x64,
+ 0x73, 0x1e, 0xe, 0xfb, 0x4b, 0x8e, 0x76, 0xf7,
+ 0x8d, 0xb6, 0xf8, 0xe, 0xac, 0x1, 0xaa, 0xe6,
+ 0xf7, 0x84, 0xed, 0x3, 0xc2, 0x8d, 0x15, 0x90,
+ 0x77, 0x5, 0xf7, 0x8e, 0x98, 0xf7, 0x2a, 0xf7,
+ 0x48, 0xf7, 0x75, 0x1a, 0xf7, 0x3b, 0x2a, 0xf7,
+ 0xa, 0xfb, 0xf, 0xfb, 0x16, 0x3c, 0xfb, 0x5,
+ 0xfb, 0x19, 0x39, 0xb8, 0xfb, 0x12, 0xf7, 0x1a,
+ 0xbd, 0xc0, 0x9d, 0xb0, 0xb7, 0x1e, 0x87, 0x70,
+ 0x54, 0xfb, 0x6d, 0xfb, 0x87, 0x63, 0x8, 0xf7,
+ 0xc3, 0xf7, 0xd8, 0x15, 0x69, 0x6a, 0x61, 0x79,
+ 0x6a, 0x1b, 0x21, 0x75, 0xf7, 0x13, 0xd7, 0xdd,
+ 0xa2, 0xe8, 0xdf, 0xf7, 0x17, 0x8d, 0xfb, 0x4f,
+ 0x4a, 0x76, 0x89, 0x69, 0x89, 0x78, 0x1f, 0xe,
+ 0xfc, 0x29, 0x7a, 0xf7, 0x4, 0xf7, 0x91, 0xf7,
+ 0x4, 0x1, 0xdc, 0xf7, 0x4, 0x3, 0xdc, 0xb2,
+ 0x37, 0xa, 0xf8, 0x1, 0x4, 0x22, 0xa, 0xfc,
+ 0x29, 0xfb, 0x17, 0x76, 0xf7, 0x3b, 0x76, 0xa6,
+ 0x76, 0xf7, 0xf0, 0xf7, 0x4, 0x12, 0xde, 0xf7,
+ 0x1e, 0xfb, 0x15, 0xf7, 0x4, 0x13, 0xd8, 0xde,
+ 0xb5, 0x15, 0x72, 0x9b, 0x74, 0xb0, 0x90, 0x91,
+ 0x8c, 0x8d, 0x90, 0x1e, 0x13, 0xb8, 0x8d, 0x91,
+ 0x91, 0x8c, 0x8f, 0x1b, 0x91, 0x8f, 0x87, 0x80,
+ 0x6f, 0x7b, 0x71, 0x7b, 0x7a, 0x1f, 0x7c, 0x7c,
+ 0x7a, 0x7f, 0x7f, 0x83, 0x8, 0x7e, 0x82, 0x85,
+ 0x88, 0x80, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x8e,
+ 0x8f, 0x8b, 0x8c, 0x90, 0x1e, 0x95, 0x8d, 0xb7,
+ 0xab, 0xa5, 0xaa, 0x8, 0xa8, 0xae, 0x94, 0xb7,
+ 0xab, 0x1a, 0xb2, 0x6a, 0xaf, 0x5d, 0x6a, 0x71,
+ 0x75, 0x67, 0x1e, 0x13, 0xd4, 0x94, 0xf7, 0xfe,
+ 0x15, 0x22, 0xa, 0xa0, 0x76, 0xf8, 0x9e, 0x77,
+ 0x1, 0xa5, 0xf7, 0x7a, 0x15, 0xf8, 0x85, 0xfb,
+ 0x7a, 0x5, 0xc9, 0x7, 0xfc, 0x45, 0xf7, 0x5b,
+ 0x3e, 0xa, 0xf7, 0x21, 0xc2, 0xf7, 0x1f, 0xc2,
+ 0x1, 0x96, 0xf7, 0xe3, 0x15, 0x3a, 0xa, 0xfb,
+ 0x8d, 0x4, 0x3a, 0xa, 0xe, 0xa0, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xf8, 0x9f, 0xf7, 0x7a, 0x15,
+ 0x51, 0xa, 0xf8, 0x44, 0xfb, 0x5b, 0xfc, 0x44,
+ 0xfb, 0x5b, 0x5, 0x4d, 0x7, 0xe, 0xfb, 0x83,
+ 0x7a, 0xf7, 0x4, 0xf8, 0xc3, 0xab, 0x1, 0xf7,
+ 0x42, 0xf7, 0x4, 0xa6, 0xeb, 0x3, 0xf7, 0x74,
+ 0xf7, 0x3b, 0x15, 0xa0, 0x6, 0x98, 0xe7, 0xb1,
+ 0xc3, 0xad, 0xb3, 0x8, 0x9f, 0xa3, 0xc6, 0xd6,
+ 0xd6, 0x1a, 0xbd, 0x77, 0xf6, 0xfb, 0x32, 0xfb,
+ 0x5, 0x5b, 0x32, 0x4a, 0x69, 0x9f, 0x68, 0xa8,
+ 0xa1, 0x9b, 0x97, 0xa5, 0x9e, 0x80, 0x99, 0x81,
+ 0x9a, 0x1e, 0x82, 0x98, 0x82, 0x99, 0x9e, 0x1a,
+ 0xb2, 0xb9, 0x9f, 0xbe, 0xc1, 0xb7, 0x56, 0x41,
+ 0x4b, 0x76, 0x56, 0x75, 0x51, 0x1e, 0x77, 0x53,
+ 0x77, 0x48, 0x85, 0x4d, 0x8, 0x59, 0xfb, 0x14,
+ 0x15, 0x22, 0xa, 0x4e, 0xa, 0xe1, 0xd8, 0x3,
+ 0xe1, 0xfb, 0x2f, 0x15, 0xf7, 0x69, 0xa4, 0x3c,
+ 0x6, 0x64, 0x79, 0xa3, 0xb0, 0x1f, 0xf9, 0x25,
+ 0x7, 0xb0, 0x9d, 0xa3, 0xb2, 0x1e, 0xda, 0xa4,
+ 0xfb, 0x69, 0x6, 0xe, 0x4e, 0xa, 0xf7, 0x3d,
+ 0xd8, 0x3, 0xac, 0xfb, 0x16, 0x15, 0x72, 0xf7,
+ 0x69, 0xf9, 0xd1, 0xfb, 0x69, 0x72, 0xda, 0x7,
+ 0xb2, 0x9d, 0x73, 0x66, 0x1f, 0xfd, 0x25, 0x7,
+ 0x66, 0x79, 0x73, 0x64, 0x1e, 0xe, 0xfb, 0x4b,
+ 0xfb, 0x90, 0xb9, 0x1, 0x89, 0xfb, 0x62, 0x15,
+ 0x5d, 0xf8, 0x8c, 0xb9, 0x7, 0xe, 0x4d, 0xa,
+ 0xf7, 0x4e, 0xd6, 0x3, 0xc5, 0xf7, 0x7c, 0x15,
+ 0xc4, 0x7f, 0xd2, 0x8b, 0x27, 0x1a, 0xfb, 0x53,
+ 0x7, 0x39, 0xac, 0x6d, 0xd8, 0x1e, 0xf0, 0xa4,
+ 0x5a, 0x6, 0x52, 0x6d, 0xaa, 0xc3, 0x1f, 0xf7,
+ 0x53, 0x7, 0xdb, 0x28, 0xb4, 0x5b, 0x8e, 0x1e,
+ 0xb8, 0x93, 0xf1, 0xaf, 0xdd, 0x1a, 0xf7, 0x53,
+ 0x7, 0xc5, 0xa9, 0xa8, 0xc4, 0x1e, 0xbc, 0xa4,
+ 0x26, 0x6, 0x3f, 0x69, 0x71, 0x35, 0x1f, 0xfb,
+ 0x53, 0x7, 0x27, 0x44, 0x8b, 0x52, 0x7f, 0x1e,
+ 0xe, 0xfc, 0x77, 0xfb, 0x30, 0x76, 0xf9, 0xe6,
+ 0x77, 0x1, 0xcc, 0xd1, 0x3, 0xcc, 0xfb, 0x45,
+ 0x15, 0xd1, 0xf9, 0xe6, 0x45, 0x6, 0xe, 0x4d,
+ 0xa, 0xf7, 0x6b, 0xd6, 0x3, 0xda, 0xfb, 0x32,
+ 0x15, 0x72, 0xf0, 0x7, 0xd8, 0xac, 0xa7, 0xdf,
+ 0x1f, 0xf7, 0x53, 0x7, 0xef, 0xd2, 0x8b, 0xc4,
+ 0x97, 0x1e, 0xa5, 0x7, 0x52, 0x97, 0x44, 0x8b,
+ 0xef, 0x1a, 0xf7, 0x53, 0x7, 0xdd, 0x6b, 0xa9,
+ 0x3d, 0x1e, 0x26, 0x72, 0xbc, 0x6, 0xbd, 0xb0,
+ 0x74, 0x4b, 0x1f, 0xfb, 0x53, 0x7, 0x39, 0xf3,
+ 0x65, 0xb6, 0x83, 0x1e, 0x5e, 0x89, 0x25, 0x63,
+ 0x3b, 0x1a, 0xfb, 0x53, 0x7, 0x4b, 0x66, 0x74,
+ 0x59, 0x1e, 0xe, 0xa9, 0xf7, 0x7d, 0xc2, 0x1,
+ 0xf8, 0xf1, 0xc2, 0x3, 0xae, 0xf7, 0xb4, 0x15,
+ 0xf9, 0x5, 0xfb, 0xb4, 0x54, 0xf7, 0x7d, 0xfc,
+ 0xce, 0x6, 0xe, 0xfb, 0xaf, 0xf8, 0x15, 0xb4,
+ 0xf7, 0x6e, 0xb4, 0x1, 0xbd, 0xb6, 0xf7, 0x6b,
+ 0xb5, 0x3, 0xbd, 0xf8, 0xab, 0x15, 0x38, 0xce,
+ 0x48, 0xde, 0xdd, 0xcf, 0xce, 0xde, 0xdd, 0x47,
+ 0xcf, 0x39, 0x38, 0x48, 0x49, 0x37, 0x1e, 0xb6,
+ 0x16, 0xc7, 0xb9, 0xbc, 0xc7, 0xc8, 0xbb, 0x5a,
+ 0x4f, 0x4e, 0x5b, 0x5b, 0x4f, 0x4e, 0x5d, 0xbb,
+ 0xc8, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0xbe, 0xc2,
+ 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x8b, 0xc2, 0x3,
+ 0x95, 0xf7, 0xf5, 0x15, 0xf7, 0x81, 0xfb, 0x82,
+ 0xc2, 0xf7, 0x82, 0xf7, 0x81, 0xc2, 0xfb, 0x81,
+ 0xf7, 0x81, 0x54, 0xfb, 0x81, 0xfb, 0x81, 0x6,
+ 0xfc, 0x2c, 0x4, 0xf8, 0xa5, 0xc2, 0xfc, 0xa5,
+ 0x6, 0xe, 0x20, 0xfb, 0x5e, 0x76, 0xf7, 0x61,
+ 0xbd, 0x59, 0xd2, 0xf8, 0x53, 0x77, 0x12, 0xc8,
+ 0xe1, 0xf7, 0x63, 0xe1, 0x13, 0xdc, 0xec, 0xaa,
+ 0x15, 0x6c, 0x9c, 0xbd, 0x79, 0xb4, 0x1b, 0xca,
+ 0xd3, 0xd2, 0xb1, 0x9a, 0x1f, 0x52, 0x8c, 0xb8,
+ 0x57, 0xcf, 0x1b, 0xd1, 0xa7, 0xc6, 0xc7, 0x1f,
+ 0x77, 0x6, 0x72, 0x81, 0x80, 0x5f, 0x67, 0x1b,
+ 0x69, 0x7b, 0xbd, 0xad, 0x1f, 0xf8, 0x14, 0x35,
+ 0xfb, 0xfe, 0x7, 0x13, 0xbc, 0x5d, 0x6f, 0x62,
+ 0x64, 0x5c, 0x1b, 0x4a, 0x71, 0xbf, 0xc9, 0x1f,
+ 0xf7, 0xe1, 0x35, 0xfc, 0x80, 0x7, 0x73, 0x88,
+ 0x78, 0x87, 0x7b, 0x1e, 0x83, 0x6b, 0x7e, 0x72,
+ 0x63, 0x1a, 0x66, 0x9e, 0x65, 0xa8, 0xa6, 0x9e,
+ 0xb2, 0xb0, 0xb0, 0x7e, 0xa1, 0x82, 0xaf, 0x1e,
+ 0x87, 0x9b, 0x88, 0x9f, 0x8a, 0xa3, 0x8, 0xe,
+ 0xa8, 0x76, 0xf8, 0x98, 0x77, 0x1, 0x9c, 0xb8,
+ 0x15, 0xaf, 0x66, 0xf7, 0x72, 0xf7, 0x72, 0xf7,
+ 0x72, 0xfb, 0x72, 0xaf, 0xb0, 0xfb, 0x70, 0xf7,
+ 0x71, 0xf7, 0x70, 0xf7, 0x71, 0x68, 0xb0, 0xfb,
+ 0x73, 0xfb, 0x72, 0xfb, 0x72, 0xf7, 0x72, 0x67,
+ 0x66, 0xf7, 0x70, 0xfb, 0x71, 0x5, 0xe, 0xd2,
+ 0xf7, 0x4, 0xc0, 0xc2, 0xc0, 0xf7, 0x4, 0x1,
+ 0xf7, 0x68, 0xf7, 0x4, 0x14, 0xe0, 0x95, 0xf7,
+ 0x80, 0x15, 0x3a, 0xa, 0xf7, 0x5e, 0xf7, 0x1,
+ 0x37, 0xa, 0xfb, 0xa5, 0x4, 0x22, 0xa, 0xfb,
+ 0x4b, 0xf8, 0xa, 0xac, 0xf7, 0x91, 0xa5, 0x1,
+ 0x8d, 0xdf, 0xf7, 0xdc, 0xdb, 0x3, 0xf0, 0xf8,
+ 0xa, 0x15, 0xf7, 0x9, 0x6, 0x6d, 0xfb, 0xab,
+ 0x85, 0x4f, 0x84, 0x53, 0x8, 0x6a, 0x87, 0x76,
+ 0xfb, 0x5, 0x53, 0x1b, 0x82, 0x80, 0x8d, 0x90,
+ 0x1f, 0x9a, 0x97, 0x8b, 0xb0, 0x1a, 0x9f, 0x78,
+ 0x9e, 0x78, 0x76, 0x72, 0x7d, 0x65, 0x5a, 0xb6,
+ 0x74, 0xb5, 0x1e, 0xe8, 0x8c, 0xb0, 0xe6, 0x9c,
+ 0xd7, 0xa7, 0xf7, 0x1c, 0x9c, 0xf7, 0x16, 0xa2,
+ 0xf7, 0x19, 0x8, 0xf7, 0xe, 0x6, 0x95, 0xac,
+ 0x5, 0xfb, 0x14, 0x6, 0xf7, 0x3d, 0xa0, 0x9c,
+ 0xdf, 0xbe, 0x1b, 0x9b, 0x94, 0x87, 0x83, 0x1f,
+ 0x84, 0x85, 0x7b, 0x81, 0x1a, 0x76, 0x9c, 0x73,
+ 0xa4, 0xa5, 0x97, 0x9e, 0xa8, 0xb3, 0x67, 0xa7,
+ 0x6b, 0xfb, 0x26, 0x65, 0xfb, 0x30, 0xfb, 0xf,
+ 0x7b, 0x1e, 0xfb, 0x4, 0x6, 0xe, 0xb2, 0xa0,
+ 0x76, 0xf7, 0x6e, 0xb5, 0xf8, 0x31, 0x77, 0x1,
+ 0x8f, 0xf7, 0x13, 0xf8, 0x4, 0xf7, 0x4d, 0x3,
+ 0x8f, 0x16, 0xf7, 0x54, 0x9d, 0x6, 0x7c, 0x59,
+ 0x90, 0xb5, 0x94, 0x8d, 0x95, 0x8f, 0x97, 0x1f,
+ 0xbb, 0xf7, 0xe, 0x5, 0xf7, 0x97, 0x6, 0xbc,
+ 0xfb, 0xe, 0x5, 0x8f, 0x7f, 0x8d, 0x81, 0x82,
+ 0x1a, 0x61, 0x59, 0x86, 0x7c, 0x1e, 0x79, 0xf7,
+ 0x8e, 0x9d, 0x7, 0x5d, 0x7d, 0xaf, 0xb1, 0x7a,
+ 0x1f, 0xfb, 0x8f, 0xf8, 0xd9, 0x5, 0x71, 0x6,
+ 0xfb, 0x8d, 0xfc, 0xd9, 0x5, 0x67, 0x7b, 0x79,
+ 0x65, 0x60, 0x1b, 0xf7, 0x5c, 0xf7, 0x86, 0x15,
+ 0xf7, 0x5, 0xf7, 0xa0, 0xf7, 0x5, 0xfb, 0xa0,
+ 0x5, 0xe, 0x7b, 0x8b, 0xb5, 0xf7, 0xb2, 0xb5,
+ 0xf7, 0x98, 0xb6, 0x12, 0xf7, 0xb, 0xf3, 0xf7,
+ 0x81, 0xf2, 0x36, 0xf7, 0x6, 0x13, 0xf4, 0xa8,
+ 0x16, 0xf7, 0xe7, 0x6, 0xf7, 0x10, 0xef, 0xd5,
+ 0xf7, 0x2, 0xd6, 0x5d, 0xd0, 0xfb, 0x2, 0xa3,
+ 0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xe3, 0xa5, 0xb2,
+ 0xbb, 0xd3, 0x1a, 0xf7, 0x32, 0xfb, 0x32, 0x9a,
+ 0x28, 0x33, 0xa, 0xf7, 0xf4, 0x15, 0x13, 0x78,
+ 0xf7, 0x8f, 0x7, 0x99, 0xd2, 0x86, 0x97, 0xf7,
+ 0xc, 0xad, 0x42, 0x4e, 0xfb, 0xd, 0xfb, 0xa,
+ 0x86, 0x63, 0x1e, 0x3c, 0x61, 0x15, 0xde, 0x6,
+ 0x13, 0xf4, 0xf1, 0xd1, 0x68, 0xfb, 0x9, 0x3a,
+ 0x4f, 0x56, 0x4b, 0x1f, 0x33, 0x6, 0x61, 0x8a,
+ 0xab, 0xa3, 0x1f, 0xe, 0x3b, 0xa0, 0x76, 0xf9,
+ 0x8, 0xb8, 0x77, 0x9f, 0x12, 0xf7, 0x11, 0xf3,
+ 0xf7, 0xf7, 0xa4, 0x13, 0xd0, 0xa3, 0x16, 0xf7,
+ 0xbb, 0x9d, 0x6, 0x2a, 0xa, 0x13, 0x58, 0xf8,
+ 0xac, 0xf7, 0x54, 0x7, 0xea, 0xcc, 0x6a, 0x37,
+ 0x8e, 0x1f, 0xa4, 0x6, 0x7a, 0xf7, 0x36, 0x5,
+ 0xfc, 0xcc, 0x6, 0x13, 0xb0, 0x77, 0x7, 0x9f,
+ 0x8a, 0xdc, 0x86, 0x23, 0x1a, 0xfc, 0x57, 0x7,
+ 0x54, 0x5d, 0x78, 0x54, 0x1e, 0xe, 0x43, 0x8b,
+ 0xb9, 0xf7, 0xb3, 0xb5, 0xf7, 0x8e, 0xbb, 0x79,
+ 0x9d, 0x12, 0xf7, 0xe, 0xf3, 0xf7, 0x96, 0xa2,
+ 0xa8, 0xa6, 0x13, 0xee, 0xab, 0x16, 0xf8, 0xa9,
+ 0x6, 0xb9, 0xf7, 0x3e, 0x5, 0x6c, 0x6, 0x58,
+ 0x73, 0x72, 0x42, 0x21, 0x1b, 0xfb, 0x33, 0x6,
+ 0x76, 0x78, 0x99, 0xae, 0x1f, 0xf7, 0x82, 0xf7,
+ 0x30, 0x7, 0xdb, 0xa1, 0x69, 0x4f, 0x1f, 0xa2,
+ 0xf7, 0x7a, 0x74, 0x6, 0x4f, 0x75, 0x69, 0x3b,
+ 0x1e, 0xfb, 0x30, 0xf7, 0x8e, 0xf7, 0x6b, 0x6,
+ 0xe1, 0x87, 0x55, 0x5d, 0x98, 0x1f, 0xa6, 0xf7,
+ 0x28, 0xfc, 0xa7, 0x6, 0x13, 0xdc, 0x79, 0x7,
+ 0x25, 0xa, 0xe, 0x43, 0x8b, 0xb5, 0xf8, 0xe1,
+ 0xb5, 0x1, 0xb7, 0xf8, 0xe4, 0x3, 0xb7, 0x16,
+ 0xf8, 0xcb, 0x6, 0xa4, 0xf7, 0x49, 0x5, 0x6e,
+ 0x6, 0x5c, 0x7d, 0x78, 0x2f, 0xfb, 0x1f, 0x1b,
+ 0xfb, 0x87, 0x6, 0xf8, 0x31, 0xf8, 0xf0, 0x5,
+ 0xa6, 0xfc, 0x9e, 0x7, 0x7c, 0xfb, 0x43, 0x5,
+ 0xa4, 0x6, 0xd1, 0x9f, 0x9a, 0xca, 0xf7, 0x12,
+ 0x1b, 0xf7, 0x6f, 0x6, 0xfc, 0x41, 0xfc, 0xf8,
+ 0x5, 0xe, 0xb2, 0xa0, 0x76, 0xf7, 0xd7, 0xb5,
+ 0xf7, 0xc8, 0x77, 0x1, 0xf7, 0x15, 0xf3, 0xf7,
+ 0xc2, 0xf3, 0x3, 0xb2, 0x24, 0xa, 0xf7, 0x7b,
+ 0xf7, 0xc2, 0xfb, 0x7b, 0x27, 0xa, 0x79, 0xf7,
+ 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0xf8, 0x7d, 0x7,
+ 0x3c, 0xa, 0xfb, 0x6c, 0xfb, 0xc2, 0xf7, 0x6c,
+ 0x26, 0xa, 0xc5, 0x7a, 0xb2, 0xf7, 0xae, 0xce,
+ 0xf7, 0xa5, 0xb2, 0x1, 0xb4, 0xf7, 0x6, 0xf8,
+ 0x50, 0xf7, 0x8, 0x3, 0xb4, 0xf7, 0xe6, 0x15,
+ 0xfb, 0x42, 0xf7, 0x14, 0xfb, 0x49, 0xf7, 0x63,
+ 0xf7, 0x63, 0xf7, 0x18, 0xf7, 0x49, 0xf7, 0x42,
+ 0xf7, 0x3e, 0xfb, 0x1b, 0xf7, 0x43, 0xfb, 0x60,
+ 0xfb, 0x60, 0xfb, 0x17, 0xfb, 0x43, 0xfb, 0x3e,
+ 0x1e, 0xf7, 0x6, 0x16, 0xf7, 0x22, 0xbc, 0xf7,
+ 0x38, 0xf7, 0x40, 0xf7, 0x41, 0xbd, 0xfb, 0x38,
+ 0xfb, 0x22, 0xfb, 0x1a, 0x50, 0xfb, 0x4a, 0xfb,
+ 0x38, 0xfb, 0x3d, 0x57, 0xf7, 0x4a, 0xf7, 0x1a,
+ 0x1e, 0xd9, 0x35, 0x15, 0x9a, 0x8a, 0x5, 0xad,
+ 0x96, 0x9e, 0x9e, 0xb0, 0x1b, 0xf7, 0x12, 0x6,
+ 0xb0, 0x9e, 0x78, 0x69, 0x96, 0x1f, 0x9a, 0x8c,
+ 0x5, 0x87, 0xac, 0x89, 0xa7, 0xa4, 0x1a, 0xa4,
+ 0x8d, 0xa7, 0x8f, 0xab, 0x1e, 0x7c, 0x8c, 0x5,
+ 0x6a, 0x80, 0x78, 0x77, 0x66, 0x1b, 0xfb, 0x12,
+ 0x6, 0x66, 0x78, 0x9f, 0xac, 0x80, 0x1f, 0x7c,
+ 0x8a, 0x5, 0x8f, 0x6b, 0x8d, 0x6f, 0x72, 0x1a,
+ 0x72, 0x89, 0x6f, 0x87, 0x6a, 0x1e, 0xe, 0xfb,
+ 0xf2, 0x3b, 0xa, 0xf7, 0xe, 0xf3, 0x3, 0xab,
+ 0x24, 0xa, 0xf8, 0x7d, 0x26, 0xa, 0xb2, 0x3b,
+ 0xa, 0xf7, 0x11, 0xf3, 0xf7, 0x9a, 0xf7, 0x42,
+ 0x3, 0xae, 0x24, 0xa, 0xf7, 0x61, 0x7, 0xac,
+ 0xa9, 0xf7, 0x66, 0xfb, 0x81, 0x5, 0x9a, 0x79,
+ 0x93, 0x7d, 0x80, 0x1a, 0x77, 0x72, 0x82, 0x57,
+ 0x1e, 0x79, 0xf7, 0xc4, 0x9d, 0x7, 0x6a, 0x91,
+ 0x73, 0x88, 0x43, 0xdc, 0xfb, 0x95, 0xf7, 0xb6,
+ 0x18, 0xd5, 0xd0, 0xbd, 0xbb, 0xcd, 0xd0, 0x8,
+ 0xc5, 0xc6, 0xae, 0x9e, 0xb8, 0x1b, 0x9d, 0xfb,
+ 0x98, 0x79, 0x7, 0xbd, 0xaf, 0x81, 0x74, 0x80,
+ 0x84, 0x7c, 0x79, 0x79, 0x1f, 0x3f, 0x3d, 0x3d,
+ 0x43, 0x38, 0x47, 0x8, 0xf7, 0x71, 0x26, 0xa,
+ 0x8e, 0x8b, 0x9d, 0xf9, 0x28, 0x77, 0x1, 0x91,
+ 0xf7, 0x28, 0xf7, 0xdd, 0xf7, 0x59, 0x3, 0x91,
+ 0x16, 0xf7, 0x6b, 0x9d, 0x6, 0x6d, 0x66, 0x91,
+ 0xb4, 0x97, 0x8e, 0x9a, 0x92, 0x9e, 0x1f, 0xf7,
+ 0x26, 0xf8, 0x15, 0xf7, 0x36, 0xfc, 0x17, 0x5,
+ 0x91, 0x7c, 0x90, 0x75, 0x81, 0x1a, 0x5f, 0x51,
+ 0x8b, 0x7a, 0x1e, 0x79, 0xf7, 0xa4, 0x9d, 0x7,
+ 0x80, 0x53, 0xa1, 0xd0, 0x6d, 0x1f, 0xfb, 0x87,
+ 0xf8, 0xcd, 0x5, 0x83, 0x6, 0xfb, 0x6c, 0xfc,
+ 0xcb, 0x5, 0x52, 0x74, 0x46, 0x67, 0x79, 0x1b,
+ 0xe, 0xf7, 0x62, 0x3b, 0xa, 0xf7, 0xd, 0xbc,
+ 0xf8, 0x9f, 0xf3, 0x3, 0xa7, 0x16, 0xf7, 0x7c,
+ 0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8,
+ 0x57, 0x7, 0xf7, 0x98, 0xfc, 0xb3, 0x5, 0x9d,
+ 0x6, 0xf7, 0x89, 0xf8, 0xd0, 0x5, 0xfc, 0x74,
+ 0x27, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, 0x54,
+ 0x68, 0x94, 0xcc, 0x1f, 0xf8, 0x76, 0x7, 0xd2,
+ 0xc8, 0x95, 0xa8, 0x1e, 0x9d, 0xfb, 0x5c, 0x7,
+ 0xfb, 0x74, 0xfc, 0x92, 0xfb, 0x7e, 0xf8, 0x92,
+ 0x5, 0xfb, 0x5d, 0x79, 0x6, 0xda, 0x85, 0x99,
+ 0x65, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x5c, 0x61,
+ 0x70, 0x58, 0x1e, 0xe, 0xb2, 0x98, 0x76, 0xf9,
+ 0x3d, 0x77, 0x1, 0xf7, 0xb, 0xbc, 0xf8, 0x31,
+ 0xbc, 0x3, 0xa8, 0x83, 0x15, 0xf7, 0x79, 0x9d,
+ 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8, 0x5b,
+ 0x7, 0xf8, 0x4c, 0xfc, 0xb7, 0x5, 0xa1, 0xf8,
+ 0xe1, 0x6, 0x31, 0xa, 0xfb, 0x79, 0x45, 0xa,
+ 0xfc, 0x20, 0x7, 0xfc, 0x13, 0xf8, 0x7c, 0x5,
+ 0xfb, 0x3d, 0x79, 0x6, 0xbe, 0x94, 0x79, 0x69,
+ 0xa9, 0x1f, 0xfc, 0x9b, 0x7, 0x5c, 0x64, 0x70,
+ 0x58, 0x1e, 0xe, 0x65, 0x8b, 0xe8, 0xf7, 0x69,
+ 0xea, 0xf7, 0x4a, 0xe5, 0x1, 0xaf, 0x9d, 0xe8,
+ 0x9d, 0xf7, 0xc9, 0x9d, 0xe4, 0x9d, 0x3, 0xc7,
+ 0xf8, 0x9e, 0x15, 0x9b, 0x6, 0x9d, 0x8e, 0x8d,
+ 0xb6, 0xcd, 0x1b, 0xf7, 0xec, 0x6, 0xcd, 0x8e,
+ 0x60, 0x79, 0x8e, 0x1f, 0x9b, 0xf7, 0x2b, 0xfc,
+ 0x9b, 0x6, 0xe2, 0xfc, 0x3b, 0x15, 0x9d, 0x6,
+ 0xbb, 0x8e, 0xa3, 0x93, 0xae, 0x1b, 0xf7, 0x4d,
+ 0x6, 0xae, 0xa3, 0x83, 0x5b, 0x8e, 0x1f, 0x9d,
+ 0xf7, 0x63, 0x79, 0x6, 0x5b, 0x88, 0x73, 0x83,
+ 0x68, 0x1b, 0xfb, 0x4d, 0x6, 0x68, 0x73, 0x93,
+ 0xbb, 0x88, 0x1f, 0x79, 0x6, 0xfb, 0x3, 0xfc,
+ 0x5d, 0x15, 0xf8, 0xc7, 0xf7, 0x56, 0x79, 0x6,
+ 0x47, 0x82, 0x7b, 0x6a, 0x43, 0x1b, 0xfb, 0xdd,
+ 0x6, 0x43, 0x77, 0xac, 0xcf, 0x82, 0x1f, 0x79,
+ 0x6, 0xe, 0xb2, 0x7a, 0xb2, 0xf9, 0x4, 0xb2,
+ 0x1, 0xb4, 0xf7, 0x8, 0xf8, 0x4f, 0xf7, 0x7,
+ 0x3, 0xb4, 0xf7, 0xe4, 0x15, 0xfb, 0x42, 0xf7,
+ 0x16, 0xfb, 0x47, 0xf7, 0x63, 0xf7, 0x63, 0xf7,
+ 0x16, 0xf7, 0x47, 0xf7, 0x42, 0xf7, 0x3e, 0xfb,
+ 0x19, 0xf7, 0x47, 0xfb, 0x60, 0xfb, 0x60, 0xfb,
+ 0x19, 0xfb, 0x47, 0xfb, 0x3e, 0x1e, 0xf7, 0x8,
+ 0x16, 0xf7, 0x1b, 0xc6, 0xf7, 0x43, 0xf7, 0x36,
+ 0xf7, 0x3b, 0xc2, 0xfb, 0x3f, 0xfb, 0x20, 0xfb,
+ 0x1b, 0x53, 0xfb, 0x46, 0xfb, 0x3a, 0xfb, 0x3c,
+ 0x56, 0xf7, 0x48, 0xf7, 0x1a, 0x1e, 0xe, 0xe0,
+ 0xa0, 0x76, 0xf9, 0xc, 0xb4, 0x79, 0x9d, 0x12,
+ 0xf7, 0x7, 0xf2, 0xf7, 0xe1, 0xf2, 0x13, 0xd8,
+ 0xa4, 0x24, 0xa, 0x8a, 0xf8, 0xb0, 0x5, 0xf7,
+ 0xe1, 0xfc, 0xb0, 0x6, 0x28, 0xa, 0x79, 0xf7,
+ 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0x8a, 0xf8, 0x6f,
+ 0x5, 0x13, 0xb8, 0xd4, 0xcc, 0x9a, 0xa5, 0x1e,
+ 0x9d, 0xfd, 0x64, 0x79, 0x7, 0xa5, 0xcb, 0x7c,
+ 0x42, 0x1f, 0xfc, 0x6f, 0x39, 0xa, 0xfb, 0x13,
+ 0xa0, 0x76, 0xf7, 0xc0, 0xb4, 0xf7, 0xb8, 0xb3,
+ 0x79, 0x9d, 0x12, 0xf7, 0xa, 0xf3, 0xf7, 0x6a,
+ 0xf6, 0x13, 0xdc, 0xa7, 0x24, 0xa, 0xf7, 0x64,
+ 0x7, 0xf7, 0xbe, 0x8a, 0xa2, 0xd5, 0xf7, 0xf,
+ 0x1a, 0xf7, 0x5, 0x6a, 0xcb, 0xfb, 0x61, 0x33,
+ 0xa, 0xf7, 0xe3, 0x15, 0xf7, 0x94, 0x7, 0x13,
+ 0xec, 0x9e, 0x9d, 0x90, 0x9c, 0x1e, 0xf7, 0x9,
+ 0x8c, 0xc9, 0x77, 0xfb, 0xa, 0x1a, 0xfb, 0x12,
+ 0x6b, 0x6e, 0xfb, 0x2d, 0x7f, 0x81, 0x92, 0x90,
+ 0x84, 0x1e, 0xe, 0x30, 0x8b, 0xe9, 0xf8, 0xa9,
+ 0xb9, 0x1, 0x90, 0x16, 0xf8, 0xb7, 0x6, 0xb0,
+ 0xf7, 0x61, 0x5, 0x77, 0x6, 0x2a, 0x6d, 0x5c,
+ 0x7d, 0x4b, 0x1b, 0xfb, 0xaf, 0x6, 0xf7, 0x80,
+ 0xf7, 0xa7, 0xfb, 0x5d, 0xf7, 0x96, 0x5, 0xf7,
+ 0x66, 0x6, 0xee, 0xa6, 0x48, 0x65, 0x95, 0x1f,
+ 0x9e, 0x6, 0x81, 0xf7, 0x2b, 0x5, 0xfc, 0x9a,
+ 0x6, 0xf7, 0xa1, 0xfb, 0xee, 0x5, 0xe, 0x43,
+ 0xa0, 0x76, 0xf9, 0xe, 0xb2, 0x1, 0xae, 0xa3,
+ 0xf7, 0x65, 0xf3, 0xf7, 0x65, 0xa2, 0x3, 0xf7,
+ 0x46, 0x24, 0xa, 0xf8, 0xb2, 0x7, 0xf7, 0xc,
+ 0x8c, 0xe5, 0x6f, 0x8a, 0x20, 0xa5, 0x8d, 0x18,
+ 0x86, 0xf7, 0x3f, 0x5, 0xfc, 0xc8, 0x6, 0x86,
+ 0xfb, 0x3f, 0xa5, 0x89, 0x8c, 0xf6, 0xdb, 0xa7,
+ 0xf7, 0x14, 0x8a, 0x19, 0xfc, 0xb2, 0x39, 0xa,
+ 0x92, 0x3b, 0xa, 0xf7, 0xba, 0xf3, 0x3, 0xf7,
+ 0x60, 0x24, 0xa, 0xf7, 0x60, 0x7, 0xf7, 0x4d,
+ 0xf7, 0xbe, 0x5, 0xca, 0xb2, 0xb0, 0x89, 0xae,
+ 0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xbf, 0x9b,
+ 0x7f, 0x7c, 0x81, 0x84, 0x7e, 0x84, 0x80, 0x1f,
+ 0xfb, 0x20, 0xfb, 0x7b, 0xfb, 0x30, 0xf7, 0x83,
+ 0x5, 0x85, 0x95, 0x88, 0x94, 0x92, 0x1a, 0x9d,
+ 0xa5, 0x94, 0xbf, 0x1e, 0x9d, 0xfb, 0xbd, 0x79,
+ 0x7, 0xc0, 0xac, 0x64, 0x7b, 0x97, 0x1f, 0xf7,
+ 0x60, 0xfb, 0xc0, 0x5, 0xfb, 0x64, 0x39, 0xa,
+ 0xdb, 0x8b, 0x9d, 0xe2, 0xae, 0xf8, 0x21, 0xaa,
+ 0xe2, 0x9d, 0x1, 0xa5, 0xf7, 0xd, 0xf7, 0x4f,
+ 0xf1, 0xf7, 0x4f, 0xf7, 0xa, 0x3, 0xf7, 0x7c,
+ 0x16, 0xf7, 0xc6, 0x9d, 0x6, 0x32, 0x7e, 0xb4,
+ 0xb9, 0x1f, 0xf7, 0x21, 0x8a, 0xf7, 0x38, 0xd5,
+ 0xf7, 0x2d, 0x1a, 0xf7, 0x23, 0xfb, 0x2b, 0xe9,
+ 0xfb, 0x2e, 0x1e, 0xb9, 0x97, 0xb4, 0xe4, 0x1e,
+ 0x9d, 0xfb, 0xc4, 0x79, 0x7, 0xe4, 0x97, 0x62,
+ 0x5d, 0x1f, 0xfb, 0x37, 0xfb, 0x25, 0x2f, 0xfb,
+ 0x25, 0xfb, 0x2f, 0xf7, 0x35, 0x43, 0xf7, 0x27,
+ 0x8c, 0x1f, 0x5d, 0x7e, 0x62, 0x32, 0x1e, 0xf7,
+ 0x60, 0xf7, 0xe, 0x15, 0xf8, 0x21, 0x7, 0xf7,
+ 0x4, 0xd6, 0x31, 0xfb, 0x8, 0x3d, 0x5a, 0xfb,
+ 0x5, 0xfb, 0x1e, 0x1f, 0x25, 0x16, 0xfb, 0x1c,
+ 0x58, 0xf7, 0x4, 0xda, 0xf7, 0x1, 0xce, 0xeb,
+ 0xf7, 0xc, 0x8c, 0x1f, 0xe, 0xb2, 0xa0, 0x76,
+ 0xf9, 0x35, 0x77, 0x12, 0x82, 0xf7, 0x38, 0xfb,
+ 0x38, 0xf9, 0x5d, 0xfb, 0x46, 0xf7, 0x35, 0x13,
+ 0xe8, 0x82, 0x16, 0xf7, 0x7a, 0x9d, 0x6, 0x59,
+ 0x7b, 0x9f, 0xa0, 0x95, 0x90, 0x96, 0x92, 0x94,
+ 0x1f, 0xf7, 0x39, 0xf7, 0x5f, 0xf7, 0x21, 0xfb,
+ 0x67, 0x5, 0x91, 0x81, 0x8e, 0x82, 0x83, 0x1a,
+ 0x76, 0x72, 0x7c, 0x56, 0x1e, 0x79, 0x7, 0x13,
+ 0xd0, 0xf7, 0xc0, 0x9d, 0x6, 0x62, 0x5f, 0xb9,
+ 0x9b, 0x7f, 0x1f, 0xfb, 0x67, 0xf7, 0xbb, 0xf7,
+ 0x42, 0xf7, 0x65, 0x5, 0x13, 0xf0, 0xae, 0xa9,
+ 0xc7, 0xaf, 0xa6, 0x1b, 0x9d, 0xfb, 0x7c, 0x79,
+ 0x7, 0xc0, 0x9d, 0x7e, 0x7a, 0x7d, 0x83, 0x7c,
+ 0x82, 0x7f, 0x1f, 0xfb, 0x20, 0xfb, 0x3f, 0xfb,
+ 0xf, 0xf7, 0x47, 0x5, 0x84, 0x96, 0x89, 0x95,
+ 0x94, 0x1a, 0x9f, 0xa4, 0x98, 0xc0, 0x1e, 0x9d,
+ 0xfb, 0xc0, 0x79, 0x7, 0xb8, 0xb7, 0x5b, 0x7b,
+ 0x97, 0x1f, 0xf7, 0x51, 0xfb, 0x96, 0xfb, 0x5d,
+ 0xfb, 0x88, 0x5, 0x66, 0x6c, 0x51, 0x69, 0x73,
+ 0x1b, 0xe, 0xf7, 0x4, 0xa0, 0x76, 0xf7, 0xb6,
+ 0xb3, 0xf7, 0xd9, 0x9d, 0x96, 0x77, 0x12, 0xd2,
+ 0xf7, 0x7, 0xf7, 0x34, 0xf3, 0xf7, 0x34, 0xf7,
+ 0x7, 0x14, 0xe, 0x13, 0xde, 0xf7, 0x94, 0x24,
+ 0xa, 0xf7, 0x5a, 0x7, 0xf7, 0x1b, 0xf7, 0x20,
+ 0xad, 0xf7, 0x20, 0xf7, 0x5, 0x82, 0xe4, 0xcc,
+ 0x1f, 0x9d, 0x7, 0xfb, 0x19, 0x65, 0x3a, 0xfb,
+ 0x1b, 0xfb, 0x12, 0x29, 0x80, 0x4d, 0x8a, 0x1f,
+ 0xf7, 0x8f, 0x7, 0x13, 0xee, 0x3c, 0xa, 0xfb,
+ 0x8f, 0x7, 0x4d, 0x8c, 0x29, 0x96, 0xf7, 0x12,
+ 0x1a, 0x13, 0xde, 0xf7, 0x1e, 0x6c, 0xd9, 0xfb,
+ 0x20, 0x1e, 0x79, 0x7, 0xd2, 0x7c, 0x33, 0xfb,
+ 0x6, 0xfb, 0x21, 0xf7, 0x1f, 0x6a, 0xf7, 0x1c,
+ 0x1f, 0xfb, 0x5a, 0x39, 0xa, 0x57, 0x79, 0xad,
+ 0x69, 0xd1, 0xf8, 0x26, 0xb9, 0x12, 0xb4, 0xf5,
+ 0x13, 0x70, 0xf8, 0x4e, 0xf6, 0x15, 0x49, 0xae,
+ 0xa5, 0x50, 0xb7, 0x1b, 0xd4, 0x8d, 0xf7, 0x4,
+ 0xb6, 0x1f, 0x79, 0x6, 0x7d, 0x8c, 0x76, 0x44,
+ 0x6b, 0x1b, 0x69, 0x6b, 0xcb, 0xc1, 0x7d, 0x1f,
+ 0xf7, 0x7, 0xf7, 0xde, 0x5, 0x33, 0x6, 0x4b,
+ 0xfb, 0x53, 0x5, 0xdc, 0x7c, 0x55, 0xf7, 0x2,
+ 0xfb, 0x2, 0x1b, 0xfb, 0x22, 0x42, 0xfb, 0x0,
+ 0xfb, 0x13, 0xfb, 0x35, 0xaf, 0xfb, 0xe, 0xf7,
+ 0x3b, 0xea, 0xe1, 0xeb, 0xa8, 0x9c, 0x1f, 0x68,
+ 0xf7, 0x8, 0x15, 0x13, 0xb0, 0x20, 0x70, 0x40,
+ 0x27, 0x4f, 0x1b, 0x2b, 0x89, 0xf7, 0x42, 0xd4,
+ 0xf4, 0x92, 0xe1, 0xf3, 0xd1, 0xcc, 0xfb, 0x28,
+ 0x38, 0x99, 0x1f, 0xe, 0xfb, 0x5e, 0x76, 0xf7,
+ 0x61, 0xbb, 0xf8, 0x5, 0xc2, 0xf7, 0x91, 0xad,
+ 0x12, 0xd8, 0xd9, 0xf7, 0x61, 0xf2, 0x56, 0xf4,
+ 0x13, 0xfa, 0xf7, 0x32, 0xb0, 0x15, 0xbd, 0x65,
+ 0xc9, 0x79, 0xc6, 0x8c, 0x8, 0xe8, 0x8c, 0xe8,
+ 0xda, 0xf7, 0x1e, 0x1a, 0xf2, 0x55, 0xe1, 0x2f,
+ 0xb6, 0x1e, 0x13, 0xfc, 0xc8, 0xa2, 0xac, 0xc7,
+ 0xc8, 0x1a, 0xf7, 0x7, 0x34, 0xbd, 0xfb, 0x0,
+ 0x3c, 0xfb, 0x4, 0x51, 0x28, 0x1e, 0xfd, 0x23,
+ 0x7, 0x58, 0x80, 0x59, 0x86, 0x58, 0x1e, 0xe2,
+ 0x6, 0x8e, 0xa4, 0x90, 0xa4, 0xa4, 0x1a, 0x8a,
+ 0xf7, 0x85, 0x15, 0xf8, 0x8c, 0x7, 0xc7, 0xbc,
+ 0xbd, 0xc0, 0xd6, 0xa6, 0x4f, 0x49, 0x8c, 0x1e,
+ 0x5c, 0x8c, 0x7b, 0x3b, 0x65, 0x7a, 0x77, 0x91,
+ 0x74, 0x1b, 0x77, 0x78, 0x81, 0x74, 0x73, 0x9e,
+ 0x81, 0xa0, 0x1f, 0xa3, 0x9e, 0x91, 0x9f, 0x1b,
+ 0x13, 0xfa, 0xc0, 0xb9, 0xfb, 0x3a, 0x4b, 0x40,
+ 0x6a, 0x4b, 0x31, 0x59, 0x54, 0xa6, 0xaf, 0x70,
+ 0x1f, 0xe, 0xfb, 0xa4, 0xfb, 0x60, 0x76, 0xf9,
+ 0x1b, 0xd8, 0x1, 0x90, 0x9b, 0xf7, 0x32, 0xf7,
+ 0xb, 0x3, 0xf7, 0x83, 0xc7, 0x15, 0x78, 0x5a,
+ 0x62, 0x2b, 0x45, 0x1a, 0x63, 0x9e, 0x6d, 0xa7,
+ 0xbd, 0xa1, 0xca, 0xc1, 0xcf, 0x7c, 0xd4, 0x88,
+ 0xa4, 0x1e, 0xf7, 0x60, 0xf8, 0x4d, 0x5, 0x23,
+ 0x6, 0xfb, 0x5, 0xfb, 0xf9, 0x5, 0x89, 0x6,
+ 0xe8, 0x79, 0x6c, 0xf7, 0x9c, 0xfb, 0x0, 0x1b,
+ 0x4c, 0x65, 0x54, 0x3d, 0x8a, 0x1f, 0x74, 0x8b,
+ 0x77, 0x8a, 0x7b, 0x1e, 0x9b, 0x6, 0xb3, 0x8e,
+ 0x9a, 0xd6, 0xc0, 0x1b, 0xef, 0xad, 0xfb, 0x9f,
+ 0x2c, 0x98, 0x1f, 0xe, 0xfb, 0x51, 0x78, 0xba,
+ 0xf9, 0x34, 0xb3, 0x12, 0xb3, 0xee, 0x61, 0xbc,
+ 0xf7, 0x82, 0xec, 0x13, 0xe8, 0xf7, 0x93, 0xf8,
+ 0x53, 0x15, 0xfb, 0x2b, 0x68, 0x4b, 0x34, 0xfb,
+ 0x17, 0x1a, 0x25, 0xe7, 0xfb, 0x3, 0xf7, 0x18,
+ 0xf7, 0xb, 0xed, 0xf7, 0x0, 0xf7, 0x8, 0xf7,
+ 0xf, 0x54, 0xcf, 0x43, 0xc4, 0x1e, 0x13, 0xd8,
+ 0x21, 0xde, 0x25, 0xb9, 0xcf, 0x1a, 0xa7, 0xb1,
+ 0xa1, 0xad, 0xb2, 0xa4, 0x7b, 0x77, 0x9d, 0x1e,
+ 0x6b, 0xa9, 0x9a, 0x60, 0xb5, 0x1b, 0xa8, 0xa3,
+ 0x9c, 0xaa, 0xcf, 0xfb, 0xa, 0xae, 0x3d, 0x4b,
+ 0x38, 0x78, 0x40, 0x33, 0xf7, 0x2, 0x58, 0xbb,
+ 0x4f, 0x1f, 0xaa, 0x6e, 0x15, 0x97, 0x88, 0xe6,
+ 0x24, 0x86, 0xfb, 0x2, 0x8, 0x32, 0x87, 0x5f,
+ 0x36, 0x41, 0x1b, 0x66, 0x6d, 0xa4, 0xad, 0x77,
+ 0x1f, 0x13, 0xe8, 0x76, 0xae, 0x7c, 0xb7, 0xb1,
+ 0x1a, 0xef, 0xb0, 0xe0, 0xf7, 0x2, 0xa8, 0x1e,
+ 0xe, 0xfb, 0x88, 0x78, 0xb9, 0xf7, 0x58, 0xba,
+ 0x64, 0xbc, 0xf7, 0x4e, 0xaf, 0x12, 0xa1, 0xf3,
+ 0x30, 0xe6, 0x13, 0xb8, 0xf7, 0x19, 0xf7, 0x90,
+ 0x15, 0x65, 0x86, 0x42, 0x66, 0x30, 0x1a, 0x28,
+ 0xf7, 0x4, 0x64, 0xe6, 0xf7, 0x4, 0xe5, 0xa7,
+ 0xed, 0x1e, 0x71, 0x92, 0x5, 0x49, 0x77, 0x63,
+ 0x76, 0x4f, 0x1b, 0x4d, 0x8a, 0x2e, 0xa6, 0xdb,
+ 0x1a, 0xc5, 0xb0, 0xb3, 0xce, 0x1e, 0x13, 0xd8,
+ 0xa6, 0x97, 0x83, 0xb0, 0x1b, 0x9d, 0x9b, 0x94,
+ 0xa2, 0x1f, 0x13, 0xb8, 0x9d, 0x79, 0x92, 0x79,
+ 0x1e, 0x13, 0xd4, 0x67, 0x7c, 0x81, 0x6f, 0x1b,
+ 0x5a, 0x5a, 0xb1, 0xcf, 0xb2, 0xb3, 0xbe, 0xc0,
+ 0x1f, 0xaf, 0x8c, 0xab, 0x76, 0x92, 0x6e, 0x8,
+ 0x5c, 0x96, 0xa8, 0x86, 0x9e, 0x1b, 0xa4, 0x9c,
+ 0xa2, 0xa5, 0xc5, 0x30, 0xa9, 0x53, 0x37, 0xfb,
+ 0x16, 0x67, 0x20, 0x1f, 0x8c, 0x55, 0xb7, 0x69,
+ 0xc0, 0x78, 0x8, 0xe, 0xfb, 0x51, 0xfb, 0x75,
+ 0xef, 0xf7, 0x17, 0xed, 0xf9, 0x20, 0x77, 0x12,
+ 0xc7, 0xbb, 0x85, 0xc6, 0xf7, 0x9c, 0xb5, 0x13,
+ 0xf4, 0xf7, 0x59, 0xf8, 0xdc, 0x15, 0x3c, 0x33,
+ 0x51, 0xfb, 0x35, 0x2d, 0x1a, 0xfb, 0x54, 0xf7,
+ 0x0, 0x60, 0xf7, 0x44, 0xb8, 0xaf, 0x77, 0x62,
+ 0x70, 0x76, 0x43, 0x51, 0x98, 0x1e, 0x8e, 0x7c,
+ 0x68, 0x98, 0x72, 0x1b, 0x63, 0x7d, 0x6f, 0x77,
+ 0x63, 0xc0, 0x7f, 0xaa, 0xf1, 0xcb, 0xd9, 0xf7,
+ 0xd, 0xf7, 0x12, 0xfb, 0x13, 0x8f, 0xfb, 0x2,
+ 0xfb, 0x2, 0x7f, 0xec, 0xb7, 0xf7, 0x20, 0xce,
+ 0xf7, 0x2, 0xcc, 0xe2, 0x1f, 0xbe, 0x86, 0xf7,
+ 0x23, 0xbc, 0xc5, 0x1a, 0xab, 0x77, 0x9a, 0x73,
+ 0x4f, 0x27, 0x25, 0x7c, 0x7f, 0x1e, 0x13, 0xec,
+ 0x72, 0x8e, 0x6b, 0xa2, 0xae, 0x1a, 0xb2, 0xb5,
+ 0x9e, 0x96, 0x90, 0x1e, 0x89, 0x9d, 0x5, 0x67,
+ 0x41, 0x58, 0x5d, 0x72, 0xa1, 0x66, 0xd4, 0x7e,
+ 0x1f, 0xe, 0x3b, 0xfb, 0x49, 0x76, 0xf7, 0x73,
+ 0x76, 0xf8, 0x4f, 0xd2, 0x62, 0x76, 0x12, 0x8b,
+ 0x9d, 0xf2, 0xe0, 0xf7, 0x61, 0xe4, 0x13, 0xee,
+ 0xf7, 0xd, 0x16, 0xe0, 0xf7, 0xeb, 0x6, 0xb7,
+ 0x9e, 0xac, 0xc3, 0xbe, 0x1b, 0xc6, 0xb3, 0x74,
+ 0x41, 0x8e, 0x1f, 0x99, 0xfc, 0x5c, 0x8d, 0x56,
+ 0x92, 0x7c, 0x8f, 0x73, 0x19, 0xe4, 0x6, 0x82,
+ 0x9e, 0x84, 0xb7, 0x97, 0x1a, 0x80, 0xf8, 0x85,
+ 0x5, 0xda, 0x89, 0x5b, 0xcc, 0x39, 0x1b, 0x40,
+ 0x4f, 0x6f, 0x33, 0x6d, 0x1f, 0xbf, 0x8e, 0x6c,
+ 0xc3, 0x53, 0x1b, 0x36, 0x69, 0x39, 0x4b, 0x1f,
+ 0x9d, 0x6, 0x13, 0xde, 0xa9, 0x8c, 0xa0, 0xc9,
+ 0xae, 0x1b, 0xb3, 0x91, 0x52, 0x58, 0x1f, 0xe,
+ 0xfb, 0x36, 0x7a, 0xb1, 0xf7, 0xbb, 0xbf, 0xf7,
+ 0xb4, 0xad, 0x1, 0xb6, 0xf1, 0xf7, 0x86, 0xed,
+ 0x3, 0xf7, 0x9f, 0x7a, 0x15, 0xf7, 0x3f, 0xba,
+ 0xf7, 0x71, 0xf7, 0x1d, 0xf7, 0x24, 0x4f, 0xf7,
+ 0x61, 0xfb, 0x34, 0xfb, 0x35, 0x4e, 0xfb, 0x70,
+ 0xfb, 0x11, 0xfb, 0x18, 0xc5, 0xfb, 0x7a, 0xf7,
+ 0x3a, 0x1f, 0xfb, 0xe, 0xf8, 0x15, 0x15, 0xf7,
+ 0x1d, 0xae, 0xf7, 0x2b, 0xe1, 0xf0, 0x9e, 0xfb,
+ 0x49, 0x20, 0x8c, 0x1e, 0xfb, 0x85, 0x57, 0x15,
+ 0xf7, 0x84, 0x6, 0x32, 0x71, 0xfb, 0x62, 0x2e,
+ 0x2c, 0x71, 0xf7, 0x65, 0xe1, 0x1e, 0xe, 0xfb,
+ 0xf6, 0x7a, 0xbd, 0xf8, 0x6a, 0x77, 0x1, 0xe3,
+ 0xe0, 0x3, 0xf7, 0xd5, 0xf0, 0x15, 0x78, 0x6,
+ 0x6e, 0x89, 0x7e, 0x64, 0x61, 0x1b, 0x5a, 0x88,
+ 0xce, 0xae, 0x1f, 0xf8, 0x4, 0x7, 0x57, 0x78,
+ 0x6c, 0x7b, 0x31, 0x79, 0x8, 0x77, 0x7, 0xab,
+ 0xc3, 0x8f, 0xfb, 0x17, 0x1f, 0xfb, 0x78, 0x7,
+ 0x5f, 0xa7, 0x5b, 0xcd, 0xf5, 0x93, 0xe8, 0xa4,
+ 0x90, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x41, 0xd3,
+ 0x48, 0xa0, 0x12, 0xf7, 0xb, 0xd6, 0x13, 0xd0,
+ 0xf7, 0xb, 0x16, 0xd6, 0xf7, 0x96, 0x6, 0xf7,
+ 0x2f, 0xfb, 0x55, 0x5, 0x92, 0x82, 0x90, 0x81,
+ 0x83, 0x1a, 0x80, 0x81, 0x82, 0x6f, 0x1e, 0x79,
+ 0xf7, 0x7f, 0x9d, 0x7, 0x50, 0x71, 0xaf, 0xb0,
+ 0x6c, 0x1f, 0xfb, 0x3c, 0xf7, 0x6a, 0xbe, 0xbe,
+ 0xaa, 0xa6, 0xab, 0xa6, 0x19, 0x99, 0x9c, 0x96,
+ 0x90, 0x95, 0x1b, 0x97, 0x8a, 0x95, 0x81, 0x9e,
+ 0x7e, 0x93, 0x84, 0x9b, 0x87, 0x9b, 0x8c, 0x8,
+ 0xa4, 0x8c, 0xa5, 0x98, 0xb0, 0x1a, 0xaf, 0x62,
+ 0x9e, 0x6a, 0x6f, 0x6d, 0x80, 0x7b, 0x78, 0x1e,
+ 0x41, 0x4f, 0x48, 0x49, 0x43, 0x4b, 0x8, 0x13,
+ 0x50, 0xf7, 0x6d, 0x7, 0x13, 0xb0, 0x39, 0x69,
+ 0x65, 0x82, 0x62, 0x88, 0x8, 0x76, 0x7, 0xae,
+ 0x8a, 0xbe, 0x85, 0x35, 0x1a, 0xe, 0x7a, 0xe2,
+ 0xf8, 0xe5, 0xd7, 0x1, 0xc6, 0x9e, 0xf7, 0x67,
+ 0xb1, 0xf7, 0x5e, 0x9e, 0x3, 0xa3, 0x7a, 0x15,
+ 0xe7, 0x6, 0xf7, 0x3f, 0xf8, 0x12, 0x5, 0x8d,
+ 0x6, 0xfb, 0x24, 0xaa, 0x89, 0xfb, 0x82, 0xf7,
+ 0xf, 0x1b, 0xe1, 0xa0, 0xf6, 0xd4, 0x1f, 0x78,
+ 0x6, 0x70, 0x8a, 0x77, 0x41, 0x57, 0x1b, 0x62,
+ 0x6e, 0xba, 0xb6, 0x7f, 0x1f, 0x5f, 0xf7, 0x30,
+ 0x65, 0xf7, 0x51, 0x60, 0xf7, 0x3a, 0x8, 0xb5,
+ 0x80, 0x6b, 0xad, 0x5a, 0x1b, 0x45, 0x6d, 0xfb,
+ 0x12, 0x56, 0x8d, 0x1f, 0x9e, 0x6, 0xa3, 0x8a,
+ 0xa3, 0xda, 0xc1, 0x1b, 0xbf, 0xaa, 0x2f, 0x42,
+ 0x9c, 0x1f, 0xe, 0xfb, 0x36, 0x90, 0x76, 0xf8,
+ 0x9f, 0x77, 0x1, 0xf7, 0x7c, 0x7b, 0x15, 0xb0,
+ 0x6, 0xa1, 0xb7, 0xe2, 0xf7, 0x44, 0xc1, 0xf7,
+ 0x2, 0x8, 0xa5, 0xc0, 0x9c, 0xb5, 0xb5, 0x1a,
+ 0xa6, 0x82, 0xa8, 0x5d, 0x58, 0x89, 0x50, 0x5a,
+ 0x94, 0x1e, 0x8f, 0x75, 0x8e, 0x7a, 0x7c, 0x1a,
+ 0x6d, 0x83, 0x74, 0x78, 0x66, 0x1e, 0x3f, 0xfb,
+ 0x2c, 0xfb, 0x32, 0xf8, 0x28, 0x51, 0x72, 0x88,
+ 0x8c, 0x45, 0x84, 0x19, 0x78, 0x7, 0xb4, 0x86,
+ 0xa4, 0x87, 0x99, 0x67, 0x8, 0xe, 0xfb, 0x52,
+ 0xfb, 0x5f, 0x76, 0xf7, 0x70, 0xeb, 0xf7, 0xb8,
+ 0xe7, 0xf7, 0xb6, 0x77, 0x12, 0xa6, 0xbc, 0x7f,
+ 0xc0, 0x74, 0xb2, 0xf7, 0xb3, 0xbc, 0x13, 0xfb,
+ 0xf7, 0x2d, 0xf8, 0x2e, 0x15, 0x42, 0x50, 0x56,
+ 0x53, 0x31, 0x1a, 0xfb, 0x43, 0xf7, 0x37, 0x69,
+ 0xf7, 0x28, 0xa7, 0xc1, 0x89, 0x51, 0x53, 0x64,
+ 0x6d, 0x68, 0x97, 0x1e, 0x6a, 0x96, 0x72, 0x90,
+ 0x79, 0x89, 0x8, 0x6d, 0x89, 0x7c, 0x7b, 0x6e,
+ 0x1a, 0x60, 0xc0, 0x81, 0xa6, 0xf4, 0xc6, 0xdc,
+ 0xf7, 0xd, 0xd7, 0x43, 0xb1, 0x3d, 0xfb, 0x3d,
+ 0x41, 0xc8, 0xce, 0xe1, 0xe1, 0xd5, 0xb2, 0x9b,
+ 0x1e, 0x85, 0x8c, 0xb8, 0x85, 0xbb, 0x1b, 0xc6,
+ 0xc1, 0x97, 0xb9, 0xa6, 0x6b, 0x92, 0x72, 0x51,
+ 0x39, 0x6c, 0x7c, 0x71, 0x1f, 0x64, 0xa3, 0x7e,
+ 0xac, 0xab, 0x1a, 0xb5, 0xa8, 0xb3, 0xaa, 0x98,
+ 0x1e, 0xad, 0x85, 0xf7, 0x19, 0xb0, 0xc0, 0x1a,
+ 0xa1, 0x7e, 0x9b, 0x6f, 0x5a, 0x45, 0x4f, 0x73,
+ 0x6e, 0x1e, 0x13, 0xf5, 0x6e, 0x8d, 0x72, 0x9c,
+ 0xa7, 0x1a, 0xac, 0x9e, 0x96, 0x97, 0x90, 0x1e,
+ 0x89, 0x9d, 0x5, 0x58, 0x6c, 0x6c, 0x62, 0x64,
+ 0xb6, 0x6e, 0xa9, 0x83, 0x1f, 0x13, 0xfb, 0x6f,
+ 0x6b, 0x7c, 0x68, 0x68, 0x1a, 0x66, 0x9d, 0x66,
+ 0xb4, 0x6b, 0x1e, 0xe, 0x78, 0xb7, 0xf8, 0x4f,
+ 0xaa, 0x1, 0xae, 0xea, 0xf7, 0xad, 0xe5, 0x3,
+ 0xae, 0xf7, 0x80, 0x15, 0xfb, 0xe, 0xef, 0xfb,
+ 0x19, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0xf7, 0x17,
+ 0xf7, 0x2a, 0xf7, 0x24, 0x20, 0xe8, 0xfb, 0x1b,
+ 0xfb, 0x1d, 0x34, 0xfb, 0x1b, 0xfb, 0x14, 0x1e,
+ 0xea, 0xaa, 0x15, 0xde, 0xa1, 0xf7, 0xa, 0xf0,
+ 0xf7, 0xd, 0xb0, 0xfb, 0x34, 0x29, 0x33, 0x68,
+ 0x2a, 0x30, 0xfb, 0x2, 0x5e, 0xf7, 0x28, 0xe9,
+ 0x1e, 0xe, 0x78, 0xe9, 0xf7, 0xda, 0xe1, 0x1,
+ 0x95, 0xf7, 0xdc, 0x15, 0x9c, 0x6, 0xc4, 0xab,
+ 0x9c, 0x9b, 0xa7, 0x1b, 0xc4, 0x6, 0x6e, 0xfb,
+ 0x6c, 0x8b, 0x6d, 0x7c, 0x73, 0x8, 0x77, 0x6b,
+ 0x64, 0x72, 0x63, 0x1a, 0x7d, 0x95, 0x64, 0xb8,
+ 0xb2, 0x9a, 0xa7, 0xb4, 0x94, 0x1e, 0x97, 0xc1,
+ 0x9d, 0xf7, 0x2, 0x9b, 0xf7, 0x4f, 0x8, 0xf7,
+ 0x5, 0x6, 0x7a, 0xfb, 0x35, 0x5, 0x3a, 0x82,
+ 0x87, 0xfb, 0x46, 0xf7, 0x9, 0x1b, 0xd3, 0xaf,
+ 0xd8, 0xf2, 0x1f, 0x76, 0x6, 0x76, 0x78, 0x4a,
+ 0x5c, 0x66, 0x75, 0xbf, 0xb2, 0xb1, 0x8b, 0xdb,
+ 0x97, 0xf7, 0x9, 0x1e, 0xf7, 0x1a, 0xe1, 0xfc,
+ 0x11, 0x6, 0x33, 0x63, 0xfb, 0x0, 0x58, 0x80,
+ 0x1f, 0xe, 0xfb, 0x65, 0x76, 0xf9, 0x36, 0xc2,
+ 0x1, 0xc6, 0xe3, 0xf7, 0x91, 0xe5, 0x3, 0xf7,
+ 0x27, 0xb3, 0x15, 0xb0, 0x69, 0xab, 0x6f, 0xca,
+ 0x8c, 0x8, 0xf7, 0x2b, 0x8d, 0xc7, 0xef, 0xf7,
+ 0x4a, 0x1a, 0xf7, 0x4f, 0x45, 0xbc, 0xfb, 0x2d,
+ 0xfb, 0x1c, 0x40, 0x26, 0xfb, 0xa, 0x8c, 0x1e,
+ 0x8f, 0xfc, 0x3b, 0x5, 0x6d, 0x87, 0x69, 0x84,
+ 0x74, 0x1e, 0xe2, 0x6, 0x95, 0xb3, 0x8b, 0xae,
+ 0xb3, 0x1a, 0x88, 0xf7, 0x70, 0x15, 0x85, 0xf7,
+ 0x7b, 0x5, 0xc2, 0x8a, 0xab, 0xc0, 0xc2, 0x1b,
+ 0xf7, 0x18, 0xb7, 0x4f, 0xfb, 0x22, 0xfb, 0x7,
+ 0x6d, 0x30, 0xfb, 0xd, 0x64, 0x5d, 0xa2, 0xb9,
+ 0x77, 0x1f, 0xe, 0xfb, 0x88, 0xfb, 0x68, 0x76,
+ 0xf7, 0x75, 0xf4, 0xf7, 0xbe, 0xf4, 0x3b, 0xdb,
+ 0x12, 0xb3, 0xb5, 0xf7, 0xd0, 0xb1, 0x13, 0xdc,
+ 0xb3, 0xf7, 0x66, 0x15, 0xfb, 0x15, 0xd4, 0x32,
+ 0xf7, 0x1b, 0xf7, 0xa, 0xab, 0x74, 0x62, 0x68,
+ 0x78, 0x66, 0x65, 0x8a, 0x1e, 0x7d, 0x7c, 0x90,
+ 0x91, 0x7b, 0x1f, 0x91, 0x7b, 0x7a, 0x92, 0x7b,
+ 0x1b, 0x72, 0x71, 0x78, 0x68, 0x6c, 0xaa, 0x70,
+ 0xbe, 0xd3, 0xe1, 0xd2, 0xf7, 0x5, 0xf1, 0x50,
+ 0xb7, 0x34, 0x20, 0x26, 0x88, 0xf7, 0x1f, 0xf1,
+ 0xca, 0xdf, 0xdc, 0x8c, 0x1f, 0x9f, 0xa0, 0x84,
+ 0x84, 0xa0, 0x1f, 0x13, 0xec, 0x85, 0x9c, 0x9c,
+ 0x86, 0x9a, 0x1b, 0xb9, 0xa9, 0x9c, 0xa7, 0xbe,
+ 0x52, 0x94, 0x62, 0xfb, 0x38, 0xfb, 0x3, 0xfb,
+ 0x14, 0xfb, 0x36, 0x1f, 0xe, 0x3b, 0x76, 0xb7,
+ 0xf8, 0x1b, 0xe1, 0x1, 0xa9, 0xf0, 0xf7, 0xc2,
+ 0xe9, 0x3, 0xf8, 0xe0, 0xf8, 0x32, 0x15, 0xe1,
+ 0xfb, 0x97, 0x7, 0xfb, 0x14, 0xfb, 0x3f, 0x42,
+ 0xfb, 0x31, 0xfb, 0x17, 0xd9, 0xfb, 0x34, 0xf7,
+ 0x43, 0xf7, 0x4e, 0xc5, 0xf7, 0xc, 0xec, 0xee,
+ 0x46, 0xd1, 0x34, 0xba, 0x1f, 0x8d, 0x7, 0x56,
+ 0x16, 0xe0, 0x40, 0xa9, 0x48, 0xfb, 0x0, 0x1a,
+ 0x3e, 0x60, 0x4b, 0x3b, 0x2b, 0x38, 0xf7, 0xd,
+ 0xf7, 0xa, 0xf1, 0xe7, 0xbd, 0xea, 0x1e, 0xe,
+ 0xfb, 0x88, 0x78, 0xe8, 0xf7, 0xe1, 0xe8, 0x1,
+ 0xf7, 0x4a, 0xd5, 0x3, 0xa7, 0xf7, 0xc1, 0x15,
+ 0xaf, 0x98, 0xb0, 0xd1, 0xad, 0x1b, 0xe6, 0x6,
+ 0x85, 0x56, 0x7c, 0xfb, 0x11, 0x28, 0x1a, 0x23,
+ 0xb5, 0x5e, 0xc6, 0xe8, 0x9d, 0xf7, 0x7, 0xcd,
+ 0x87, 0x1e, 0x79, 0x6, 0x84, 0x62, 0x7d, 0x5b,
+ 0x5d, 0x8c, 0x58, 0x8c, 0x81, 0xca, 0x8f, 0xbd,
+ 0x9b, 0xf7, 0x70, 0x18, 0xf7, 0x2e, 0x8a, 0x5,
+ 0xe8, 0xfb, 0x7f, 0x7, 0x66, 0x60, 0x7b, 0x6f,
+ 0x72, 0x1f, 0x6b, 0x67, 0x7c, 0x62, 0x76, 0x3d,
+ 0x8, 0xe, 0x20, 0x79, 0xbb, 0xf8, 0x71, 0x77,
+ 0x1, 0xf7, 0x21, 0xe1, 0xf7, 0x79, 0xda, 0x3,
+ 0x92, 0xf7, 0xee, 0x15, 0xa1, 0x6, 0x97, 0xac,
+ 0x9e, 0xbd, 0xaf, 0x8c, 0x8, 0x98, 0x96, 0x7b,
+ 0x7f, 0x8d, 0x1f, 0x92, 0x66, 0x97, 0xfb, 0x2,
+ 0x40, 0x1a, 0x26, 0xc7, 0x2a, 0xf7, 0xc, 0xf7,
+ 0x21, 0xd4, 0xf7, 0x9, 0xf7, 0x26, 0xf7, 0x3,
+ 0x65, 0xe2, 0xfb, 0x2c, 0xcb, 0x1e, 0x85, 0x7a,
+ 0x5, 0x9d, 0x89, 0xee, 0x4f, 0xfb, 0x47, 0x1a,
+ 0x28, 0x73, 0xfb, 0xc, 0x2f, 0x4b, 0x5a, 0xcb,
+ 0xd9, 0xc7, 0x82, 0xf7, 0x14, 0x81, 0xd3, 0x1e,
+ 0xbc, 0x84, 0x6e, 0xa5, 0x65, 0x1b, 0x38, 0x69,
+ 0x2f, 0x46, 0x81, 0x1f, 0xe, 0xfb, 0x36, 0xfb,
+ 0x5f, 0x76, 0xfa, 0x13, 0x77, 0x1, 0xa6, 0xe6,
+ 0xf7, 0x8, 0xbb, 0x5e, 0xb8, 0xf7, 0xc, 0xe3,
+ 0x3, 0xf7, 0x85, 0x7e, 0x15, 0x8d, 0xfb, 0x5b,
+ 0xb2, 0x7f, 0x5, 0xf7, 0x67, 0x7, 0xb5, 0xf7,
+ 0x3a, 0xaa, 0xf7, 0x7c, 0xf7, 0x46, 0xfb, 0x2a,
+ 0xd3, 0x51, 0x1f, 0xf7, 0x2e, 0x7, 0x5a, 0x9c,
+ 0x8d, 0xfb, 0x3f, 0x5, 0x68, 0xfb, 0x41, 0x63,
+ 0xfb, 0x70, 0xfb, 0x52, 0xf7, 0x24, 0x4c, 0xd1,
+ 0x1f, 0xb4, 0xb0, 0x15, 0xf8, 0x4c, 0x7, 0x9b,
+ 0xf3, 0x55, 0xfb, 0x3c, 0xfb, 0x48, 0x28, 0x67,
+ 0x76, 0x89, 0x1f, 0x61, 0x16, 0x72, 0x2a, 0xb8,
+ 0xf7, 0x40, 0xf7, 0x3e, 0xe9, 0xc0, 0xa2, 0x1f,
+ 0xe, 0xfb, 0x7b, 0xe3, 0xf8, 0xca, 0xd7, 0x1,
+ 0x98, 0xfb, 0x7b, 0x15, 0xf1, 0x6, 0xf7, 0x2e,
+ 0xf7, 0xae, 0x5, 0x8d, 0x6, 0x3a, 0x9a, 0xa1,
+ 0xfb, 0x5d, 0xe9, 0x1b, 0xe7, 0xa5, 0xf7, 0x1f,
+ 0xbf, 0x8d, 0x1f, 0x78, 0x6, 0x6f, 0x8a, 0x6c,
+ 0x40, 0x4e, 0x1b, 0x3c, 0x71, 0xf7, 0x5c, 0xb5,
+ 0x82, 0x1f, 0xf7, 0x76, 0xf8, 0x24, 0x5, 0x25,
+ 0x6, 0xfb, 0x2f, 0xfb, 0xa1, 0x5, 0xf7, 0x20,
+ 0x73, 0x79, 0xf7, 0x15, 0x25, 0x1b, 0x34, 0x7b,
+ 0xfb, 0x1f, 0x5a, 0x85, 0x1f, 0x9d, 0x6, 0xa8,
+ 0x90, 0xa3, 0xde, 0xbe, 0x1b, 0xdb, 0xa8, 0xfb,
+ 0x43, 0x46, 0x9e, 0x1f, 0xe, 0x8e, 0xfb, 0x63,
+ 0x76, 0xf9, 0x6c, 0x77, 0x1, 0xf7, 0xd9, 0xca,
+ 0x3, 0xf7, 0xd9, 0x70, 0x15, 0xfb, 0x5d, 0xca,
+ 0xf7, 0x5d, 0x7, 0xc0, 0x96, 0xcd, 0xa3, 0xba,
+ 0xca, 0xaa, 0xb5, 0xa3, 0xbe, 0x97, 0xf7, 0x81,
+ 0x8e, 0xc2, 0xaa, 0x8f, 0xb9, 0x95, 0x8, 0x9d,
+ 0x7, 0x97, 0x75, 0x69, 0x8b, 0x7f, 0x1b, 0xfb,
+ 0x17, 0x8b, 0xfb, 0x8b, 0xfb, 0x11, 0x7d, 0x1f,
+ 0x83, 0x3f, 0x57, 0x6d, 0x63, 0x81, 0x8, 0xf8,
+ 0x6f, 0x4c, 0xfc, 0x6f, 0x7, 0x63, 0x95, 0x57,
+ 0xa9, 0x83, 0xd7, 0x8, 0xf7, 0x11, 0x7e, 0x95,
+ 0xf7, 0x8b, 0xfb, 0x22, 0x1b, 0x7f, 0x69, 0x8b,
+ 0x7f, 0x75, 0x1f, 0x79, 0x7, 0xb9, 0x81, 0xaa,
+ 0x87, 0x8e, 0x54, 0x97, 0xfb, 0x81, 0xa3, 0x58,
+ 0xaa, 0x61, 0xba, 0x4c, 0xcd, 0x73, 0xc0, 0x80,
+ 0x8, 0xe, 0x8e, 0x7a, 0xb9, 0xf8, 0x6b, 0x77,
+ 0x1, 0xb5, 0xf2, 0xf7, 0x39, 0xf5, 0xf7, 0x38,
+ 0xf3, 0x3, 0xf7, 0xff, 0xd3, 0x15, 0x5c, 0xa9,
+ 0xc3, 0x61, 0xc5, 0x1b, 0xf7, 0x5, 0xcb, 0xf7,
+ 0x9, 0xf6, 0xf7, 0x2a, 0x36, 0xf7, 0x23, 0xfb,
+ 0x3e, 0x1f, 0x7a, 0x7, 0xf7, 0x7, 0x74, 0xaf,
+ 0xfb, 0x8, 0x26, 0x1a, 0x46, 0x83, 0xfb, 0x25,
+ 0x39, 0x41, 0x6b, 0xe2, 0xa4, 0x8e, 0x1e, 0x97,
+ 0x98, 0x9c, 0xd4, 0xce, 0x1a, 0xc9, 0x7f, 0xc4,
+ 0x62, 0x62, 0x7f, 0x52, 0x4d, 0x48, 0x9c, 0x42,
+ 0x97, 0x7e, 0x1e, 0x73, 0x8d, 0x6e, 0x33, 0x41,
+ 0x1b, 0x3d, 0x7c, 0xf7, 0x18, 0xd0, 0xf3, 0xab,
+ 0xf7, 0x11, 0xf7, 0xc, 0xa3, 0x1f, 0x9c, 0x7,
+ 0xfb, 0x3a, 0x32, 0xfb, 0x15, 0xfb, 0x26, 0xfb,
+ 0x2, 0xc6, 0xfb, 0x18, 0xf7, 0x10, 0xc3, 0xc0,
+ 0xb7, 0xb8, 0xa8, 0x1f, 0xe, 0x57, 0x79, 0xa7,
+ 0xf8, 0x15, 0xd1, 0xf7, 0x43, 0xb4, 0x12, 0xf7,
+ 0x1d, 0xdd, 0x48, 0xe5, 0x92, 0xad, 0xf7, 0x50,
+ 0xd9, 0x13, 0xee, 0x9d, 0xf7, 0xd6, 0x15, 0x90,
+ 0x89, 0x90, 0x8a, 0x90, 0x89, 0x8, 0xb1, 0xa1,
+ 0xa4, 0xb3, 0xaf, 0x1b, 0xa4, 0x94, 0x78, 0x77,
+ 0x8d, 0x1f, 0x13, 0xf6, 0x8f, 0x4f, 0x78, 0x42,
+ 0x4e, 0x1a, 0xfb, 0x6, 0xc4, 0x49, 0xf2, 0xf7,
+ 0x37, 0xe4, 0xf7, 0x28, 0xf7, 0x51, 0x1e, 0xd5,
+ 0x5d, 0x5, 0xc0, 0x7, 0x41, 0xb0, 0x5, 0xf2,
+ 0x66, 0xf7, 0x6b, 0xfb, 0x3a, 0x48, 0x6d, 0x60,
+ 0x55, 0xfb, 0xa, 0xf0, 0x56, 0xf7, 0xd, 0x49,
+ 0x1e, 0x37, 0x8c, 0x7e, 0xfb, 0x91, 0xfb, 0x26,
+ 0x1b, 0x47, 0x71, 0xc4, 0xcc, 0x1f, 0x13, 0xee,
+ 0xdb, 0xa2, 0xda, 0xdb, 0x1a, 0xbf, 0x62, 0xb5,
+ 0x5c, 0x53, 0x4c, 0x42, 0x45, 0x7a, 0x1e, 0xf8,
+ 0x58, 0xcf, 0x15, 0x63, 0x9f, 0xfb, 0x27, 0xcd,
+ 0xf0, 0x1a, 0xad, 0x9f, 0xa8, 0xb3, 0xf7, 0xa,
+ 0x94, 0xfb, 0x73, 0x70, 0x1e, 0xe, 0x4c, 0xa0,
+ 0x76, 0xf8, 0x8b, 0xf7, 0x4a, 0x66, 0xb0, 0x12,
+ 0xf7, 0x84, 0xf3, 0x13, 0xb0, 0xf7, 0x2b, 0x24,
+ 0xa, 0x8a, 0xf7, 0x6a, 0x5, 0xda, 0x91, 0xb1,
+ 0xf7, 0x9b, 0xf7, 0x4, 0x1b, 0x9d, 0x9a, 0x81,
+ 0x7d, 0x1f, 0x75, 0x65, 0x72, 0x6d, 0x1a, 0x13,
+ 0xd0, 0x6b, 0xa5, 0x7f, 0xa6, 0xad, 0xa7, 0xb4,
+ 0xb4, 0xcc, 0x6d, 0xae, 0x56, 0xfb, 0x1d, 0x58,
+ 0xfb, 0x2a, 0x2a, 0x76, 0x1e, 0xf7, 0x31, 0x7d,
+ 0xfb, 0x1d, 0xe1, 0xfb, 0x27, 0x1b, 0x7e, 0x82,
+ 0x83, 0x84, 0x87, 0x8f, 0x87, 0x92, 0x89, 0x1f,
+ 0xf7, 0x59, 0x5e, 0xac, 0x2e, 0x8c, 0xfb, 0x6b,
+ 0x8c, 0xfb, 0x67, 0x18, 0x28, 0xa, 0xe, 0x3b,
+ 0xfb, 0x5f, 0x76, 0xf7, 0x68, 0xb1, 0xf8, 0x21,
+ 0xd7, 0x1, 0xaf, 0xf4, 0xf7, 0x1a, 0xcc, 0xf7,
+ 0x27, 0xef, 0x3, 0xf7, 0xa9, 0x7f, 0x15, 0xfb,
+ 0x68, 0xca, 0xf7, 0x68, 0x7, 0xf7, 0x1b, 0x8a,
+ 0xf7, 0x4, 0xee, 0xf7, 0x27, 0x1a, 0xf7, 0x27,
+ 0x49, 0xf7, 0xb, 0xfb, 0x10, 0x26, 0x73, 0x48,
+ 0x3e, 0x8d, 0x1e, 0x8e, 0xfb, 0xdd, 0x5, 0x28,
+ 0x66, 0xf7, 0x7, 0xf0, 0xd7, 0x9b, 0xf7, 0x15,
+ 0xe6, 0xad, 0x1f, 0x9d, 0x7, 0xfb, 0x10, 0x33,
+ 0xfb, 0x1d, 0xfb, 0x10, 0xfb, 0x36, 0xf7, 0x4,
+ 0x32, 0xf7, 0x15, 0x8c, 0x1f, 0xca, 0xb1, 0x15,
+ 0xf7, 0xde, 0x7, 0xa5, 0x8c, 0x8a, 0xb4, 0xb7,
+ 0x1b, 0xd8, 0xa5, 0x28, 0x32, 0xfb, 0x8, 0x53,
+ 0x2e, 0x30, 0x1f, 0xe, 0xa9, 0x79, 0xb4, 0xf8,
+ 0x6f, 0xe0, 0x1, 0xae, 0xf5, 0xf7, 0x37, 0xec,
+ 0xf7, 0x40, 0xed, 0x3, 0xf7, 0xf8, 0xd0, 0x15,
+ 0x61, 0x9b, 0xbc, 0x5e, 0xd6, 0x1b, 0xf7, 0xc,
+ 0xc2, 0xf7, 0x1d, 0xf7, 0x11, 0xec, 0x3e, 0xf7,
+ 0x17, 0x24, 0xa5, 0x1f, 0xf7, 0x48, 0x8c, 0x5,
+ 0xdf, 0xfc, 0x9d, 0x7, 0x6b, 0x47, 0x66, 0x25,
+ 0x65, 0x1f, 0x9d, 0x87, 0xc6, 0xb7, 0xab, 0x94,
+ 0xe4, 0x92, 0x19, 0x26, 0x4e, 0x41, 0x36, 0xfb,
+ 0x6, 0x1a, 0xfb, 0x14, 0xb7, 0xfb, 0x16, 0xf7,
+ 0x1b, 0xc5, 0xca, 0xbb, 0xb2, 0xa0, 0x1e, 0x72,
+ 0xd4, 0x15, 0x62, 0x8d, 0x5e, 0x3d, 0x52, 0x1b,
+ 0x36, 0x86, 0xf7, 0x2c, 0xd1, 0xf7, 0xa, 0xc2,
+ 0xf0, 0xed, 0xad, 0x1f, 0xf7, 0x10, 0x6, 0xf0,
+ 0x6d, 0xc1, 0xfb, 0x9, 0x23, 0x1a, 0x3d, 0x8b,
+ 0xfb, 0x22, 0x30, 0x4e, 0x5e, 0xcf, 0xba, 0x8d,
+ 0x1e, 0x98, 0xc5, 0x95, 0xd1, 0xad, 0x1a, 0xab,
+ 0x8d, 0xdc, 0x5a, 0x57, 0x8e, 0x3f, 0x67, 0x8a,
+ 0x1e, 0x8a, 0x60, 0x95, 0x41, 0x9d, 0x5d, 0x8,
+ 0xe, 0xfb, 0x73, 0xf7, 0x1a, 0x76, 0xf7, 0xfc,
+ 0x77, 0x1, 0xbd, 0xf7, 0xfc, 0x3, 0xf7, 0x7a,
+ 0xf7, 0x5, 0x15, 0xee, 0xdc, 0xdb, 0xef, 0xee,
+ 0x3a, 0xdc, 0x28, 0x27, 0x3b, 0x3a, 0x28, 0x27,
+ 0xdb, 0x3b, 0xef, 0x1f, 0xe, 0xf7, 0xd1, 0x7a,
+ 0xf7, 0x4, 0x1, 0xf7, 0x3, 0xf7, 0x4, 0xf7,
+ 0x71, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, 0x14,
+ 0x70, 0xf7, 0x3, 0xb1, 0x15, 0x29, 0xa, 0xf7,
+ 0xe1, 0x16, 0x29, 0xa, 0xf7, 0xe1, 0x16, 0x29,
+ 0xa, 0xe, 0xfc, 0x48, 0xf8, 0x74, 0x76, 0xf7,
+ 0xa8, 0x77, 0x1, 0xa9, 0xf8, 0x7d, 0x15, 0x38,
+ 0xa, 0x59, 0xa, 0x1e, 0xf7, 0x31, 0xf7, 0x5a,
+ 0x40, 0xa, 0x6d, 0xa1, 0x6c, 0x7b, 0x7d, 0x85,
+ 0x81, 0x87, 0x1e, 0xe, 0xfb, 0xa4, 0xf8, 0x74,
+ 0x76, 0xf7, 0xaa, 0x77, 0x1, 0xb9, 0xf8, 0x5f,
+ 0x15, 0x59, 0xa, 0x1f, 0xf7, 0x32, 0x36, 0xa,
+ 0x23, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e, 0xf7,
+ 0x54, 0x16, 0x59, 0xa, 0x1f, 0xf7, 0x31, 0x36,
+ 0xa, 0x24, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e,
+ 0xe, 0xfc, 0x98, 0x94, 0x76, 0xf9, 0x45, 0x77,
+ 0x1, 0xfb, 0x10, 0x7f, 0x15, 0xf8, 0x64, 0xf9,
+ 0x45, 0x5, 0x53, 0x6, 0xfc, 0x64, 0xfd, 0x45,
+ 0x5, 0xe, 0xce, 0x7f, 0xca, 0xf7, 0x54, 0xca,
+ 0xca, 0xca, 0xf7, 0x52, 0xca, 0x1, 0xf7, 0x7,
+ 0xce, 0x3, 0x9f, 0xf7, 0x87, 0x15, 0xf7, 0x0,
+ 0x6, 0xfb, 0x26, 0xb0, 0xf7, 0x1b, 0xfb, 0x1,
+ 0xf7, 0x39, 0x1b, 0xea, 0xd6, 0xb0, 0xb3, 0xbd,
+ 0x1f, 0xe5, 0x7, 0x4b, 0x57, 0x39, 0x63, 0x35,
+ 0x1b, 0xfb, 0x11, 0x25, 0xdb, 0xf7, 0x4, 0x64,
+ 0x1f, 0xf7, 0xf8, 0x6, 0xa9, 0xca, 0x5, 0xfc,
+ 0x25, 0x6, 0x8a, 0x96, 0x8a, 0x94, 0x95, 0x1a,
+ 0x95, 0x8c, 0x95, 0x8c, 0x98, 0x1e, 0xf8, 0x42,
+ 0x6, 0xa9, 0xca, 0x5, 0xfc, 0x51, 0x6, 0xf7,
+ 0x0, 0xad, 0xf6, 0xdd, 0xf7, 0x11, 0x1b, 0xe5,
+ 0xdc, 0x61, 0x4f, 0xbc, 0x1f, 0xa8, 0xc8, 0x5,
+ 0xcb, 0x4b, 0x31, 0xb3, 0x2c, 0x1b, 0xfb, 0x35,
+ 0xfb, 0x1f, 0x22, 0xfb, 0x28, 0x66, 0x1f, 0x3d,
+ 0x6, 0x6d, 0x4c, 0x5, 0xeb, 0x6, 0x8a, 0x7e,
+ 0x8b, 0x82, 0x81, 0x1a, 0x82, 0x8b, 0x82, 0x8c,
+ 0x7e, 0x1e, 0x49, 0x6, 0xe, 0x8e, 0x56, 0xde,
+ 0xad, 0xcf, 0xf7, 0x70, 0xa2, 0xf7, 0xa9, 0xe3,
+ 0x1, 0xc4, 0xb2, 0xf7, 0xac, 0xd1, 0xc3, 0xd7,
+ 0x3, 0xa5, 0xb7, 0x15, 0x98, 0xa6, 0x9b, 0x92,
+ 0x9b, 0x1b, 0x99, 0xc2, 0x6f, 0x6e, 0xc3, 0x1f,
+ 0x6d, 0xc5, 0xc6, 0x6d, 0x99, 0x1b, 0xac, 0xf7,
+ 0x60, 0xf7, 0x3e, 0xcd, 0xb0, 0x5d, 0xd0, 0x65,
+ 0xcf, 0x1f, 0x71, 0xba, 0x75, 0xb9, 0xaf, 0x1a,
+ 0x9f, 0xda, 0xe7, 0xb3, 0xc3, 0x1e, 0xb1, 0x42,
+ 0x25, 0xbb, 0x32, 0x1b, 0xfb, 0x5, 0xfb, 0x17,
+ 0x44, 0xfb, 0x14, 0xfb, 0x6, 0xef, 0x3f, 0xf7,
+ 0x0, 0x8c, 0x1f, 0x8d, 0xa2, 0x5, 0x41, 0x8a,
+ 0x2a, 0xcd, 0xdc, 0x1a, 0xdf, 0xd0, 0xb8, 0xdd,
+ 0x8d, 0x1e, 0xcd, 0x8d, 0xf1, 0x64, 0xbe, 0x71,
+ 0x8, 0x39, 0x23, 0x83, 0x75, 0x74, 0x1a, 0x63,
+ 0xa2, 0x5c, 0xa5, 0x5d, 0x1e, 0xae, 0x4d, 0xb5,
+ 0x4d, 0x5c, 0x1a, 0x5f, 0x4b, 0x4d, 0x5b, 0x77,
+ 0x57, 0xa7, 0xa6, 0x57, 0x1e, 0xa5, 0x59, 0x5c,
+ 0xa0, 0x77, 0x1b, 0x72, 0x2d, 0x50, 0x7f, 0x77,
+ 0x1f, 0xe, 0xf7, 0xc4, 0xfb, 0x67, 0xac, 0xf7,
+ 0x39, 0xaf, 0xf8, 0x4b, 0xb5, 0xd0, 0x77, 0x1,
+ 0xf7, 0x33, 0xab, 0x9e, 0xdb, 0xb8, 0xd3, 0xac,
+ 0xb9, 0xf7, 0xb2, 0xed, 0x3, 0xf7, 0x8c, 0xf7,
+ 0x10, 0x15, 0x67, 0x4b, 0x56, 0x50, 0x40, 0x1a,
+ 0x45, 0xa8, 0x48, 0xe5, 0xee, 0xa9, 0xdb, 0xd8,
+ 0xee, 0x64, 0xbf, 0x6a, 0xde, 0x1e, 0xef, 0xd6,
+ 0xf7, 0x5c, 0xf7, 0x4a, 0xf0, 0x1b, 0xb0, 0xa3,
+ 0x6b, 0x46, 0xfb, 0x26, 0x26, 0xfb, 0x54, 0x2f,
+ 0x48, 0x71, 0xac, 0xae, 0xa2, 0x9e, 0x91, 0x97,
+ 0x1f, 0xa7, 0x8c, 0xa0, 0xa7, 0xa3, 0x1a, 0xa3,
+ 0x76, 0x9e, 0x73, 0x8a, 0x1e, 0x5b, 0x8a, 0x6a,
+ 0x5e, 0x58, 0x1a, 0x43, 0xbe, 0x50, 0xe4, 0xf7,
+ 0x41, 0xf7, 0x9, 0xf7, 0x87, 0xf7, 0x6, 0xd9,
+ 0x5a, 0xdd, 0x33, 0xfb, 0x3e, 0xfb, 0x1f, 0xfb,
+ 0x50, 0x21, 0x25, 0x1e, 0x75, 0xb5, 0x81, 0xa6,
+ 0xa5, 0x1a, 0xda, 0xf7, 0x16, 0xf7, 0x1, 0xc9,
+ 0xcb, 0x1e, 0x82, 0x9b, 0x5, 0x27, 0x48, 0xfb,
+ 0x37, 0xfb, 0x8, 0xfb, 0x11, 0x1a, 0x8a, 0x56,
+ 0xa4, 0x58, 0x99, 0x66, 0x8, 0x9a, 0x6d, 0x15,
+ 0xc1, 0xfb, 0x0, 0x9d, 0x5d, 0x65, 0x1a, 0x63,
+ 0x7f, 0x63, 0x5c, 0x5c, 0x65, 0xb7, 0xcb, 0xbc,
+ 0xaf, 0xc5, 0xaf, 0xc4, 0x1e, 0xe, 0xf7, 0x4,
+ 0x91, 0x76, 0xc2, 0xdf, 0xf8, 0xa4, 0xdd, 0x52,
+ 0xc4, 0x12, 0xa5, 0xac, 0xf7, 0x24, 0xc0, 0xe5,
+ 0xe3, 0x13, 0xee, 0xd1, 0xac, 0x15, 0x92, 0x86,
+ 0x90, 0x86, 0x92, 0x86, 0x8, 0x9a, 0x9e, 0x9b,
+ 0x92, 0x97, 0x1b, 0xaa, 0xa7, 0x64, 0x7b, 0xa4,
+ 0x1f, 0xf7, 0x2c, 0xc3, 0xc8, 0xf7, 0x42, 0xf7,
+ 0x19, 0x1a, 0x13, 0xae, 0xd0, 0x8b, 0xe5, 0x7c,
+ 0xe3, 0x1e, 0xb6, 0xce, 0x98, 0x99, 0xa0, 0x1b,
+ 0xa2, 0xf3, 0x2a, 0x84, 0x92, 0x1f, 0xfb, 0x55,
+ 0xfb, 0x24, 0x96, 0x77, 0x5, 0xd3, 0x9e, 0x39,
+ 0x21, 0xfb, 0xd, 0x9a, 0x4c, 0xd3, 0x70, 0x1f,
+ 0xf7, 0x2, 0xe3, 0x7c, 0xa2, 0x5, 0x86, 0x7f,
+ 0x6f, 0x79, 0x7c, 0x1b, 0x69, 0x86, 0xb4, 0xed,
+ 0xef, 0x82, 0xf7, 0x1, 0x46, 0xa3, 0x1f, 0xf7,
+ 0x4a, 0xf7, 0x1f, 0x5, 0x13, 0x1e, 0xf7, 0x26,
+ 0xfb, 0x38, 0x8a, 0x8f, 0x7b, 0x1b, 0x79, 0xfb,
+ 0xe, 0x2f, 0x78, 0x71, 0x1f, 0xce, 0x76, 0x41,
+ 0xb7, 0x44, 0x1b, 0xfb, 0x1d, 0x3d, 0x47, 0xfb,
+ 0x11, 0x2e, 0xdd, 0x5b, 0xd3, 0x63, 0x1f, 0x9a,
+ 0x82, 0x93, 0x81, 0x81, 0x1a, 0x78, 0x77, 0x7f,
+ 0x85, 0x82, 0x1e, 0xa2, 0x7b, 0x5, 0xb6, 0xb8,
+ 0x98, 0xa0, 0x9e, 0x1a, 0xa9, 0x60, 0xa9, 0x5e,
+ 0xa6, 0x1e, 0x57, 0xa8, 0x52, 0xa9, 0xcc, 0x1a,
+ 0x13, 0xde, 0xc8, 0xd5, 0xb8, 0xc4, 0xf7, 0x1c,
+ 0x9e, 0xfb, 0x29, 0xfb, 0x1f, 0xfb, 0x15, 0x64,
+ 0xfb, 0x25, 0x60, 0x50, 0x1e, 0xc6, 0x35, 0x9d,
+ 0x94, 0x7a, 0x1b, 0x75, 0x88, 0x40, 0x36, 0x80,
+ 0x88, 0x8, 0xe, 0xe0, 0x8b, 0xf0, 0xf8, 0xbf,
+ 0xab, 0x12, 0xad, 0x9a, 0x91, 0xf7, 0x8, 0xf8,
+ 0x40, 0xf7, 0x9, 0x90, 0x9a, 0x17, 0xad, 0x16,
+ 0x13, 0xdc, 0xf7, 0xb8, 0x6, 0x7b, 0xf7, 0x2c,
+ 0x5, 0xfb, 0x1, 0xa9, 0x6d, 0xf7, 0xf, 0xf4,
+ 0x1a, 0xf7, 0x16, 0xdb, 0xf7, 0x8, 0xf7, 0x1a,
+ 0xf7, 0x20, 0xd5, 0xfb, 0x8, 0xfb, 0x1a, 0x27,
+ 0x65, 0xfb, 0x14, 0x26, 0x71, 0x1e, 0x7b, 0xfb,
+ 0x2c, 0x5, 0x13, 0xfc, 0xf7, 0xb8, 0xf7, 0x36,
+ 0x6, 0x13, 0xdc, 0x7c, 0x6, 0x5a, 0x7f, 0x75,
+ 0x7f, 0x61, 0x1b, 0xfb, 0x28, 0x6, 0x8d, 0xa7,
+ 0x5, 0xf7, 0x1e, 0xa1, 0xda, 0xf7, 0x18, 0xf7,
+ 0x10, 0x1a, 0xf7, 0x52, 0xfb, 0x3f, 0xe6, 0xfb,
+ 0x34, 0xfb, 0x33, 0xfb, 0x3e, 0x2f, 0xfb, 0x4d,
+ 0x8a, 0x1e, 0x8a, 0xfb, 0x12, 0xd6, 0xfb, 0x1b,
+ 0xf7, 0x22, 0x76, 0x8d, 0x6f, 0x18, 0x13, 0xa0,
+ 0xfb, 0x28, 0x6, 0x61, 0x75, 0x97, 0xbc, 0x7f,
+ 0x1f, 0x7c, 0x6, 0xe, 0xf7, 0x20, 0x8e, 0x76,
+ 0xb2, 0x76, 0xf8, 0x69, 0xf7, 0x18, 0xc4, 0x77,
+ 0x12, 0xf7, 0x43, 0xe6, 0x13, 0x78, 0xf7, 0x43,
+ 0x16, 0xf7, 0x47, 0x6, 0x9b, 0xb6, 0x86, 0x9e,
+ 0x99, 0x1a, 0xac, 0x6e, 0xb0, 0x70, 0xb1, 0x1e,
+ 0x75, 0xab, 0x76, 0xac, 0xac, 0x1a, 0xaa, 0xa6,
+ 0xa1, 0xa0, 0xa1, 0x1e, 0x13, 0xb8, 0xf7, 0x7c,
+ 0xfb, 0xa1, 0xbb, 0x4f, 0x97, 0x5d, 0x8, 0x9e,
+ 0x93, 0xaf, 0xab, 0xcd, 0x1a, 0xc3, 0x6a, 0xb1,
+ 0x6b, 0xac, 0x1e, 0x6b, 0xab, 0x6c, 0xa6, 0xac,
+ 0x1a, 0xd9, 0xd0, 0xe0, 0xc1, 0x7e, 0x1e, 0x90,
+ 0xe0, 0x5, 0xad, 0x86, 0x74, 0xa4, 0x6a, 0x1b,
+ 0x7a, 0x7d, 0x8b, 0x8c, 0x7f, 0x1f, 0x55, 0x8e,
+ 0x87, 0x96, 0x90, 0xb5, 0x8, 0x5c, 0x84, 0x76,
+ 0x54, 0x5b, 0x1a, 0x47, 0xcb, 0x7d, 0xc2, 0x8e,
+ 0x1e, 0x62, 0x5d, 0x7f, 0x61, 0x77, 0x5d, 0xfb,
+ 0x6c, 0xf7, 0x92, 0x79, 0x99, 0x83, 0xbb, 0x8,
+ 0x70, 0x82, 0x65, 0x5a, 0x60, 0x1a, 0x64, 0xd0,
+ 0x40, 0xb4, 0x5d, 0x1e, 0x4b, 0x4a, 0x5d, 0x6f,
+ 0x3e, 0x1a, 0x74, 0xa0, 0x71, 0x9b, 0x6a, 0x1e,
+ 0x95, 0x76, 0x94, 0x73, 0x6f, 0x1a, 0x6e, 0x67,
+ 0x8c, 0x77, 0x1e, 0xe, 0x46, 0xa, 0xab, 0xfa,
+ 0x22, 0x3, 0xab, 0xf7, 0x8c, 0x15, 0xe9, 0x31,
+ 0xd1, 0x45, 0xe2, 0x24, 0xae, 0xae, 0x18, 0x5b,
+ 0xc7, 0x2d, 0xf1, 0x64, 0xb1, 0x8, 0xf9, 0xb9,
+ 0xc3, 0xfd, 0xb9, 0x6, 0xb2, 0xb1, 0xe9, 0xf1,
+ 0xbb, 0xc7, 0x68, 0xae, 0x18, 0x34, 0x24, 0x45,
+ 0x45, 0x2d, 0x31, 0x8, 0xe, 0x3b, 0xa0, 0x76,
+ 0xfa, 0x22, 0x49, 0xa, 0xf7, 0xac, 0x16, 0xc3,
+ 0xf9, 0xb9, 0x6, 0xb1, 0x64, 0xf1, 0x2d, 0xc7,
+ 0x5b, 0xae, 0xae, 0x18, 0x24, 0xe2, 0x45, 0xd1,
+ 0x31, 0xe9, 0x31, 0x2d, 0x45, 0x45, 0x24, 0x34,
+ 0xae, 0x68, 0x18, 0xc7, 0xbb, 0xf1, 0xe9, 0xb1,
+ 0xb2, 0x8, 0xe, 0x46, 0xa, 0xbc, 0xf7, 0x70,
+ 0x15, 0xf9, 0xb9, 0x6, 0x64, 0x65, 0x2d, 0x25,
+ 0x5b, 0x4f, 0xae, 0x68, 0x18, 0xe2, 0xf2, 0xd1,
+ 0xd1, 0xe9, 0xe5, 0x2d, 0xe5, 0x45, 0xd1, 0x34,
+ 0xf2, 0x68, 0x68, 0x18, 0xbb, 0x4f, 0xe9, 0x25,
+ 0xb2, 0x65, 0x8, 0xfd, 0xb9, 0x6, 0xe, 0x3b,
+ 0x8a, 0x76, 0xfa, 0x22, 0x49, 0xa, 0xb8, 0xf7,
+ 0x79, 0x15, 0xf2, 0x34, 0xd1, 0x45, 0xe5, 0x2d,
+ 0xe5, 0xe9, 0xd1, 0xd1, 0xf2, 0xe2, 0x68, 0xae,
+ 0x18, 0x4f, 0x5b, 0x25, 0x2d, 0x65, 0x64, 0x8,
+ 0xf9, 0xb9, 0x53, 0xfd, 0xb9, 0x7, 0x65, 0xb2,
+ 0x25, 0xe9, 0x4f, 0xbb, 0x8, 0xe, 0xf7, 0xfb,
+ 0x91, 0x76, 0xf7, 0x81, 0xbf, 0xf7, 0x81, 0x77,
+ 0x1, 0xa3, 0xfa, 0x7c, 0x3, 0xa3, 0xf7, 0x8c,
+ 0x15, 0xf7, 0x7, 0x25, 0xc2, 0x48, 0xda, 0x2d,
+ 0xb0, 0xab, 0x18, 0x47, 0xea, 0x6f, 0xa0, 0x36,
+ 0xe4, 0x8, 0xf9, 0xaa, 0x6, 0x36, 0x32, 0x70,
+ 0x75, 0x46, 0x2d, 0xb0, 0x6b, 0x18, 0xda, 0xe9,
+ 0xc2, 0xce, 0xf7, 0x7, 0xf1, 0xfb, 0x7, 0xf1,
+ 0x54, 0xce, 0x3c, 0xe9, 0x66, 0x6b, 0x18, 0xd0,
+ 0x2e, 0xa5, 0x73, 0xe1, 0x33, 0x8, 0xfd, 0xaa,
+ 0x6, 0xe0, 0xe4, 0xa7, 0xa0, 0xcf, 0xea, 0x66,
+ 0xab, 0x18, 0x3c, 0x2d, 0x54, 0x48, 0xfb, 0x7,
+ 0x25, 0x8, 0xe, 0x72, 0x90, 0x76, 0xe9, 0xc2,
+ 0xf8, 0x84, 0x77, 0x1, 0xf8, 0xb7, 0xc2, 0x3,
+ 0x9a, 0xf5, 0x15, 0xf7, 0x3a, 0xfb, 0xe, 0x5,
+ 0xe9, 0xf8, 0x39, 0xf8, 0xbb, 0x54, 0xfc, 0x84,
+ 0xfc, 0x2, 0xe9, 0x7, 0xe, 0xf7, 0xc4, 0xeb,
+ 0xc0, 0xf7, 0x5c, 0xc0, 0xd9, 0xac, 0x8b, 0x77,
+ 0x1, 0xa9, 0xfa, 0x21, 0x3, 0xa9, 0xf7, 0x8d,
+ 0x15, 0xf7, 0xa, 0xfb, 0x3, 0xb4, 0x61, 0xe5,
+ 0xfb, 0x3, 0xb4, 0xac, 0x18, 0x4d, 0xd9, 0x5,
+ 0xf9, 0x3d, 0xc0, 0xfd, 0x65, 0x6, 0x23, 0xef,
+ 0xf3, 0xef, 0x5, 0xf9, 0x65, 0xc0, 0xfd, 0x3d,
+ 0x6, 0xc9, 0xd9, 0x62, 0xac, 0x31, 0xfb, 0x3,
+ 0x62, 0x61, 0xfb, 0xa, 0xfb, 0x3, 0x19, 0xe,
+ 0x3b, 0xa2, 0x76, 0xfa, 0x21, 0x77, 0x1, 0xf7,
+ 0x3e, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xf7, 0x3e,
+ 0x8d, 0x15, 0xc0, 0xf9, 0x7c, 0x6, 0xdb, 0xdc,
+ 0xdb, 0x3a, 0x5, 0xfd, 0x7c, 0xc0, 0xf9, 0x4c,
+ 0x7, 0xed, 0x3e, 0xac, 0xb4, 0xfb, 0x3, 0xe5,
+ 0x61, 0xb4, 0xfb, 0x3, 0xf7, 0xa, 0x19, 0xfb,
+ 0x3, 0xfb, 0xa, 0x61, 0x62, 0xfb, 0x3, 0x31,
+ 0xac, 0x62, 0x18, 0xed, 0xd8, 0x5, 0xe, 0xf7,
+ 0xc4, 0xee, 0xc0, 0xf7, 0x51, 0xc0, 0x1, 0xb8,
+ 0xee, 0x15, 0xf9, 0x3d, 0x6, 0x48, 0x35, 0xb9,
+ 0x6a, 0xe5, 0xf7, 0x3, 0xb4, 0xb5, 0xf7, 0xa,
+ 0xf7, 0x3, 0x19, 0xfb, 0xa, 0xf7, 0x3, 0x62,
+ 0xb5, 0x31, 0xf7, 0x3, 0x5d, 0x6a, 0x18, 0xce,
+ 0x3a, 0x5, 0xfd, 0x3d, 0x56, 0xf9, 0x68, 0x6,
+ 0xf0, 0x2a, 0x26, 0x2f, 0x5, 0xfd, 0x68, 0x6,
+ 0xe, 0x3b, 0x8d, 0x76, 0xfa, 0x21, 0x77, 0x1,
+ 0xf7, 0x43, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xb7,
+ 0xf7, 0x7a, 0x15, 0xf7, 0x3, 0x31, 0xb5, 0x62,
+ 0xf7, 0x3, 0xfb, 0xa, 0xf7, 0x3, 0xf7, 0xa,
+ 0xb5, 0xb4, 0xf7, 0x3, 0xe5, 0x6a, 0xb4, 0x18,
+ 0x29, 0x3e, 0x5, 0xf9, 0x4c, 0x56, 0xfd, 0x7c,
+ 0x7, 0x3b, 0x3a, 0x3b, 0xdc, 0x5, 0xf9, 0x7c,
+ 0x56, 0xfd, 0x4c, 0x7, 0x29, 0xd8, 0x5, 0xe,
+ 0xf7, 0xfb, 0xf7, 0x1, 0xbd, 0xf7, 0x40, 0xbd,
+ 0x1, 0xa6, 0xfa, 0x78, 0x3, 0xa6, 0xf7, 0x89,
+ 0x15, 0xf7, 0x8, 0x21, 0xb2, 0x61, 0xed, 0xfb,
+ 0x9, 0xb3, 0xad, 0x18, 0x3f, 0xea, 0x5, 0xf8,
+ 0xc6, 0x6, 0x3f, 0x2c, 0xb3, 0x69, 0xed, 0xf7,
+ 0x9, 0xb2, 0xb5, 0xf7, 0x8, 0xf5, 0x19, 0xfb,
+ 0x8, 0xf5, 0x64, 0xb5, 0x29, 0xf7, 0x9, 0x63,
+ 0x69, 0x18, 0xd7, 0x2c, 0x5, 0xfc, 0xc6, 0x6,
+ 0xd7, 0xea, 0x63, 0xad, 0x29, 0xfb, 0x9, 0x64,
+ 0x61, 0xfb, 0x8, 0x21, 0x19, 0xf7, 0x41, 0x35,
+ 0x15, 0x34, 0xe1, 0xe2, 0xe1, 0x5, 0xf9, 0x1f,
+ 0x6, 0xe2, 0x35, 0x34, 0x35, 0x5, 0xe, 0xa9,
+ 0xa0, 0x76, 0xf8, 0x5d, 0xc2, 0xf7, 0x55, 0x77,
+ 0x1, 0xf7, 0xdd, 0x16, 0xc6, 0x6, 0xf7, 0xb9,
+ 0xf9, 0x55, 0x5, 0x52, 0x6, 0x39, 0xfb, 0x55,
+ 0x5, 0xfc, 0x5, 0x6, 0x36, 0xf7, 0x55, 0x5,
+ 0x52, 0x6, 0xf7, 0xde, 0xfd, 0xf, 0x15, 0xfb,
+ 0x38, 0xf8, 0x17, 0x5, 0xf7, 0xd6, 0x6, 0xe,
+ 0xfb, 0x51, 0x77, 0xa8, 0xf8, 0x0, 0xb2, 0xf7,
+ 0xb2, 0xbb, 0x1, 0xa5, 0xe1, 0xf7, 0x9f, 0xde,
+ 0x3, 0xf8, 0xf, 0xf7, 0xec, 0x15, 0xbf, 0x48,
+ 0x6e, 0x9b, 0x50, 0x1b, 0xfb, 0xa, 0x3b, 0x27,
+ 0xfb, 0xe, 0xfb, 0x10, 0xdf, 0x35, 0xf6, 0xf7,
+ 0x56, 0xbe, 0xf7, 0xb4, 0xf7, 0x11, 0xf7, 0x30,
+ 0x48, 0xf7, 0x59, 0xfb, 0x59, 0x57, 0x58, 0x7b,
+ 0x7e, 0x6d, 0x1f, 0xb2, 0x59, 0x5, 0xa0, 0xb4,
+ 0xa4, 0x95, 0xd2, 0x1b, 0xf1, 0xb6, 0xfb, 0x36,
+ 0xfb, 0x54, 0x84, 0x1f, 0x83, 0x68, 0x15, 0x2b,
+ 0x77, 0x7a, 0xfb, 0x60, 0xfb, 0x1b, 0x1b, 0x40,
+ 0x7f, 0xea, 0xb7, 0xd9, 0xb1, 0xf7, 0x27, 0xf7,
+ 0x0, 0xc8, 0xaa, 0x62, 0x74, 0xa0, 0x1f, 0xe,
+ 0x8b, 0xc2, 0xf7, 0xb3, 0xc2, 0xf7, 0x93, 0xc2,
+ 0x1, 0xf8, 0x3b, 0xc2, 0x3, 0xa4, 0x16, 0xf8,
+ 0x59, 0xf9, 0x57, 0xfc, 0x59, 0x54, 0xf8, 0x22,
+ 0xfb, 0x93, 0xfb, 0xf6, 0x54, 0xf7, 0xf6, 0xfb,
+ 0xb3, 0xfc, 0x22, 0x6, 0xe, 0xf7, 0x20, 0x73,
+ 0xc0, 0xf9, 0x14, 0xbd, 0x1, 0xb2, 0xc3, 0xf9,
+ 0xb, 0xc2, 0x3, 0xf7, 0x6c, 0xf7, 0x0, 0x15,
+ 0xf8, 0x42, 0xf8, 0x56, 0x5, 0xba, 0x55, 0xac,
+ 0x40, 0x3c, 0x1a, 0xfb, 0x40, 0xfb, 0x20, 0xfb,
+ 0x29, 0xfb, 0x40, 0x3c, 0x48, 0xad, 0xb8, 0x57,
+ 0x1e, 0x66, 0xb1, 0x15, 0x73, 0xa8, 0x4f, 0xc5,
+ 0xf7, 0xe, 0x1a, 0xf7, 0x2e, 0xf7, 0x24, 0xf7,
+ 0x34, 0xf7, 0x3f, 0xd7, 0xd0, 0x6d, 0x5d, 0xc2,
+ 0x1e, 0xfc, 0xcb, 0xfc, 0xdc, 0x15, 0xac, 0x6a,
+ 0xee, 0xe5, 0x5, 0x53, 0xca, 0xde, 0x69, 0xe8,
+ 0x1b, 0xf7, 0x5f, 0xf7, 0x38, 0xf7, 0x3f, 0xf7,
+ 0x5f, 0xe8, 0x65, 0xe4, 0x51, 0xcc, 0x1f, 0xe4,
+ 0xe3, 0x67, 0xad, 0x33, 0x34, 0x5, 0xc2, 0x4b,
+ 0x37, 0xab, 0x2f, 0x1b, 0xfb, 0x5f, 0xfb, 0x3c,
+ 0xfb, 0x3f, 0xfb, 0x55, 0xfb, 0x10, 0xbc, 0x3b,
+ 0xbd, 0x5b, 0x1f, 0xe, 0x44, 0x8b, 0xbc, 0xf9,
+ 0x13, 0x77, 0x1, 0x91, 0xf8, 0xee, 0x3, 0x91,
+ 0x16, 0xf8, 0xee, 0x6, 0xfb, 0xc3, 0xf9, 0x44,
+ 0x5, 0xfb, 0x88, 0xfd, 0x13, 0x15, 0xf7, 0x6e,
+ 0xf8, 0x68, 0xf7, 0x5b, 0xfc, 0x68, 0x5, 0xe,
+ 0xa9, 0x8d, 0x76, 0xf9, 0x42, 0xbe, 0x1, 0xaf,
+ 0xf9, 0x19, 0x3, 0xf7, 0xe5, 0x78, 0x15, 0xf7,
+ 0xec, 0xf9, 0x75, 0x5, 0xfd, 0x19, 0x6, 0xf7,
+ 0xe9, 0xfc, 0xc0, 0x15, 0xfb, 0x62, 0xf8, 0x8d,
+ 0x5, 0xf8, 0x47, 0x6, 0xe, 0xa9, 0x8b, 0xc1,
+ 0xf7, 0x2d, 0xc1, 0xf7, 0x2d, 0xc1, 0x1, 0xb8,
+ 0xf8, 0x60, 0x14, 0xe0, 0xef, 0xf7, 0x63, 0x15,
+ 0xf8, 0x29, 0xc1, 0xfc, 0x29, 0x6, 0xe2, 0x95,
+ 0xd7, 0xcd, 0xdd, 0x1b, 0xf7, 0x81, 0xc1, 0xfb,
+ 0x81, 0x6, 0xfb, 0x2a, 0x42, 0xfb, 0xd, 0xfb,
+ 0x5, 0xfb, 0x6, 0xd7, 0xfb, 0xc, 0xf7, 0x27,
+ 0x1f, 0xf7, 0x81, 0xc1, 0xfb, 0x81, 0x6, 0x39,
+ 0x3f, 0xcd, 0xe2, 0x81, 0x1f, 0xe, 0xa9, 0x66,
+ 0x76, 0xc5, 0xc1, 0xf7, 0x2d, 0xc1, 0xf7, 0x2d,
+ 0xc1, 0xe2, 0x77, 0x1, 0xb8, 0xc2, 0x3, 0xe9,
+ 0x6a, 0x15, 0xb7, 0x72, 0xb8, 0xd8, 0x5, 0x80,
+ 0x9a, 0xa9, 0x83, 0xa1, 0x1b, 0xf7, 0x93, 0xc1,
+ 0xfb, 0x89, 0x6, 0x7f, 0x73, 0x8d, 0x95, 0x7c,
+ 0x1f, 0xdb, 0xf7, 0x21, 0x5, 0xf7, 0x6c, 0xc1,
+ 0xfb, 0x4e, 0x6, 0xe2, 0xf7, 0x2d, 0x5, 0xee,
+ 0xc1, 0x47, 0x6, 0xae, 0xc9, 0x5d, 0xa4, 0x5a,
+ 0x34, 0x5, 0xfb, 0x8, 0x6, 0x29, 0xfb, 0xa,
+ 0x2e, 0xfb, 0x1b, 0x38, 0xa7, 0x57, 0xcc, 0x4f,
+ 0x1f, 0x65, 0xf7, 0x6c, 0x15, 0xd2, 0x91, 0xd6,
+ 0xdf, 0xd5, 0x1b, 0xe8, 0x6, 0x32, 0xfb, 0x2f,
+ 0x5, 0x2e, 0xfb, 0x3b, 0x15, 0x6e, 0xa6, 0x70,
+ 0xb3, 0x83, 0xb9, 0x8, 0xf7, 0x14, 0x6, 0xe,
+ 0xfb, 0x88, 0x7a, 0xba, 0xf7, 0x4b, 0xc2, 0xf7,
+ 0x4a, 0xbd, 0x1, 0xf7, 0xd4, 0xe9, 0x3, 0xbb,
+ 0x8e, 0x15, 0x85, 0x9d, 0xab, 0x7d, 0xbe, 0x1b,
+ 0xf7, 0x22, 0xf7, 0xf, 0xf7, 0x1, 0xf7, 0x3d,
+ 0xe3, 0x50, 0xf7, 0x2b, 0xfb, 0x43, 0x6c, 0x69,
+ 0x88, 0x82, 0x64, 0x1f, 0x60, 0x7, 0x8e, 0x98,
+ 0x99, 0x8d, 0x98, 0x1b, 0xf0, 0xf2, 0x45, 0xfb,
+ 0x4, 0x1f, 0xfb, 0x5c, 0x54, 0xf7, 0x5a, 0x6,
+ 0x24, 0x2f, 0x3b, 0x25, 0x72, 0x71, 0x8f, 0x94,
+ 0x72, 0x1e, 0xe, 0xf7, 0x20, 0x26, 0xa2, 0xf9,
+ 0xba, 0xa2, 0x1, 0xf7, 0xe, 0xf7, 0x5, 0xf7,
+ 0xfa, 0xf7, 0x5, 0x3, 0xa4, 0x3d, 0x15, 0x74,
+ 0xf7, 0xc7, 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1,
+ 0x1f, 0xf9, 0x43, 0xf7, 0xfa, 0xfd, 0x43, 0x7,
+ 0x45, 0x65, 0x76, 0x51, 0x1e, 0x74, 0xf7, 0xc6,
+ 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1, 0x1f, 0xf8,
+ 0xf2, 0x7, 0xe8, 0xd0, 0x9b, 0xa7, 0x1e, 0xa2,
+ 0xfd, 0x9e, 0x74, 0x7, 0xa7, 0xd0, 0x7b, 0x2e,
+ 0x1f, 0xfc, 0xf2, 0x7, 0x45, 0x66, 0x76, 0x4f,
+ 0x1e, 0xe, 0xa9, 0x27, 0xf2, 0xf9, 0x4d, 0xb8,
+ 0x1, 0xf8, 0xef, 0x9f, 0x3, 0x99, 0xfb, 0x0,
+ 0x15, 0x9f, 0xa6, 0x93, 0x9f, 0x1b, 0xf8, 0x78,
+ 0x8e, 0x5, 0xa4, 0xaf, 0x84, 0x87, 0xa5, 0x1f,
+ 0x98, 0xf1, 0x90, 0x9f, 0xa4, 0xf1, 0x8, 0x74,
+ 0x6, 0x32, 0x68, 0x6b, 0x73, 0x3d, 0x1b, 0xfb,
+ 0xfd, 0x6, 0xf7, 0xba, 0xf7, 0xe7, 0xfb, 0xa5,
+ 0xf7, 0xfa, 0x5, 0xf7, 0x91, 0x6, 0xf7, 0x14,
+ 0x9a, 0x5a, 0x4a, 0x9f, 0x1f, 0x9f, 0x6, 0x85,
+ 0xf7, 0x33, 0x5, 0xfc, 0x85, 0x6, 0x69, 0x65,
+ 0x90, 0x8d, 0x69, 0x1f, 0xf7, 0xf1, 0xfc, 0x5a,
+ 0x5, 0xe, 0xf7, 0x7d, 0xc2, 0x1, 0x96, 0xf7,
+ 0x7d, 0x15, 0x42, 0xa, 0xe, 0xfb, 0x4b, 0xf7,
+ 0x2f, 0x76, 0xf7, 0x4f, 0xb9, 0x9e, 0xdb, 0xe0,
+ 0x77, 0x1, 0xf7, 0x81, 0x9d, 0x3, 0xcc, 0xf7,
+ 0x94, 0x15, 0x75, 0x9e, 0x7f, 0x9f, 0xa2, 0x93,
+ 0xa0, 0xa1, 0x9f, 0x1e, 0x9e, 0xa0, 0x97, 0x96,
+ 0xab, 0x9f, 0x8, 0x8e, 0x90, 0x92, 0x8c, 0x8d,
+ 0x1b, 0x91, 0x8a, 0x7f, 0x87, 0x76, 0x86, 0x7a,
+ 0x86, 0x7c, 0x1f, 0x83, 0x73, 0x80, 0x77, 0x6d,
+ 0x1a, 0x74, 0x96, 0x76, 0xa6, 0xa5, 0x95, 0xa2,
+ 0xa0, 0x8c, 0x1e, 0xa9, 0x81, 0x9f, 0x83, 0xa4,
+ 0x1e, 0x86, 0x9a, 0x87, 0x9b, 0xa0, 0x1a, 0x8f,
+ 0x89, 0x96, 0x91, 0x8e, 0x8e, 0x8a, 0x87, 0x92,
+ 0x1e, 0xa6, 0x7a, 0x9e, 0x7a, 0x98, 0x7e, 0x8,
+ 0x73, 0xa3, 0x99, 0x75, 0xa6, 0x1b, 0x9b, 0x99,
+ 0x97, 0xa1, 0xaa, 0x68, 0x94, 0x6e, 0x93, 0x1f,
+ 0x6f, 0x93, 0x6b, 0x93, 0x74, 0x97, 0x8, 0x84,
+ 0x8f, 0x85, 0x8e, 0x90, 0x1a, 0x8e, 0x8f, 0x8f,
+ 0x94, 0x90, 0x1e, 0xcd, 0xaa, 0x8d, 0x82, 0xb3,
+ 0x95, 0x8, 0x97, 0x8e, 0xa6, 0x98, 0xa3, 0x1a,
+ 0xa4, 0x7a, 0x97, 0x78, 0x6e, 0x79, 0x6b, 0x6f,
+ 0x70, 0x1e, 0x7f, 0x7f, 0x7a, 0x7f, 0x7d, 0x83,
+ 0x8, 0x88, 0x85, 0x86, 0x88, 0x88, 0x1b, 0x87,
+ 0x8a, 0x90, 0x98, 0xa6, 0x92, 0x9e, 0x92, 0x9f,
+ 0x1f, 0x91, 0x9c, 0x91, 0x9d, 0xa4, 0x1a, 0x9d,
+ 0x83, 0xa1, 0x70, 0x70, 0x83, 0x76, 0x79, 0x73,
+ 0x91, 0x79, 0x91, 0x78, 0x1e, 0x92, 0x77, 0x92,
+ 0x77, 0x71, 0x1a, 0x7f, 0x8a, 0x85, 0x87, 0x88,
+ 0x87, 0x8d, 0x8f, 0x84, 0x1e, 0x75, 0x96, 0x7d,
+ 0x97, 0x80, 0x96, 0x8, 0xa3, 0x75, 0x80, 0xae,
+ 0x6a, 0x1b, 0x73, 0x7b, 0x7a, 0x75, 0x71, 0x9f,
+ 0x83, 0xb3, 0x84, 0x1f, 0xa8, 0x86, 0x8b, 0x8d,
+ 0xc5, 0x70, 0x8, 0x96, 0x86, 0x90, 0x87, 0x88,
+ 0x1a, 0x88, 0x87, 0x87, 0x82, 0x86, 0x1e, 0x70,
+ 0x7b, 0x71, 0x84, 0x72, 0x86, 0x8, 0x6b, 0x86,
+ 0x63, 0x7f, 0x6c, 0x1a, 0xe, 0x65, 0xfa, 0x4f,
+ 0x1, 0x95, 0xf8, 0x8d, 0x3, 0xf8, 0x1, 0x65,
+ 0x15, 0xf7, 0x2a, 0xfa, 0x4a, 0x68, 0x90, 0xfb,
+ 0x13, 0xfd, 0xb2, 0xfb, 0x59, 0xf8, 0x31, 0xfb,
+ 0x26, 0x43, 0x9b, 0x6a, 0xeb, 0xba, 0x5, 0xe,
+ 0xa9, 0xf7, 0xf, 0xbe, 0xf7, 0x46, 0xbf, 0x1,
+ 0xa6, 0xc0, 0x3, 0xf8, 0x1, 0xf7, 0x81, 0x15,
+ 0x60, 0xb6, 0xda, 0x44, 0xd0, 0x1b, 0xad, 0xa8,
+ 0x9b, 0x9f, 0x9f, 0x1f, 0x6b, 0xad, 0x5, 0x7f,
+ 0x7d, 0x7b, 0x84, 0x7a, 0x1b, 0x5d, 0x59, 0xb2,
+ 0xc4, 0x50, 0x1f, 0xbc, 0xbf, 0xba, 0xb0, 0xb8,
+ 0x1b, 0xa0, 0x9f, 0x85, 0x7b, 0x9f, 0x1f, 0xa8,
+ 0xb1, 0x5, 0x93, 0x7e, 0x72, 0xa3, 0x63, 0x1b,
+ 0x37, 0x68, 0x64, 0x4e, 0x3f, 0x1f, 0xc6, 0x44,
+ 0x51, 0xb4, 0x47, 0x1b, 0x33, 0x55, 0x3f, 0x51,
+ 0x3e, 0xc3, 0x45, 0xde, 0xd6, 0xc7, 0xbf, 0xc9,
+ 0xcb, 0x1f, 0x62, 0xab, 0x15, 0x73, 0x7d, 0x3b,
+ 0x45, 0x4f, 0x1b, 0x56, 0x66, 0xc2, 0xb2, 0xa5,
+ 0xa3, 0xc4, 0xcf, 0xbe, 0xe1, 0x4c, 0x77, 0x9a,
+ 0x1f, 0xe, 0xa9, 0xf7, 0x10, 0xbe, 0xf7, 0x48,
+ 0xbc, 0x1, 0xa5, 0xbe, 0xf8, 0xc2, 0xc0, 0x3,
+ 0xf7, 0xf9, 0xf7, 0x80, 0x15, 0x76, 0xa3, 0xcf,
+ 0x30, 0xdf, 0x1b, 0xf4, 0xbd, 0xd2, 0xd5, 0xd1,
+ 0x4a, 0xcc, 0x31, 0x36, 0x67, 0x5a, 0x56, 0x54,
+ 0x1f, 0xc5, 0x4d, 0x61, 0xb7, 0x34, 0x1b, 0x42,
+ 0x8a, 0x48, 0x4f, 0x41, 0x1a, 0x41, 0xba, 0x44,
+ 0xe8, 0xf2, 0xcb, 0xe6, 0xa0, 0xa3, 0x1e, 0x69,
+ 0xac, 0x15, 0x58, 0x5d, 0x5a, 0x60, 0x4d, 0x1b,
+ 0x5c, 0x61, 0xae, 0xc6, 0xb0, 0xa6, 0xbc, 0xc9,
+ 0xbf, 0xb3, 0x6b, 0x55, 0xcc, 0x1f, 0xce, 0x16,
+ 0xc2, 0xca, 0xa1, 0xa8, 0xc5, 0x1b, 0xd6, 0xa6,
+ 0x51, 0x71, 0x49, 0x56, 0x6d, 0x5a, 0x61, 0x61,
+ 0xb2, 0xc4, 0x50, 0x1f, 0xe, 0xe0, 0x8b, 0xc2,
+ 0xf8, 0xfe, 0x77, 0x1, 0xa5, 0x16, 0xf9, 0x5c,
+ 0xc2, 0xfc, 0xd6, 0x6, 0xf8, 0xd6, 0xf8, 0xd9,
+ 0x62, 0xb0, 0x5, 0xe, 0x3b, 0xa0, 0x76, 0xf8,
+ 0x5a, 0x77, 0x1, 0xa2, 0x16, 0xcc, 0x6, 0xf7,
+ 0x6b, 0xf7, 0xf2, 0xf7, 0x6b, 0xfb, 0xf2, 0x5,
+ 0xcc, 0x6, 0xfb, 0xac, 0xf8, 0x5a, 0x5, 0xe,
+ 0x3b, 0xa0, 0x76, 0xf8, 0x71, 0x77, 0x1, 0xa9,
+ 0xf8, 0xb8, 0x3, 0xa9, 0xf8, 0x54, 0x15, 0xf7,
+ 0xa6, 0xfc, 0x54, 0xf7, 0xa6, 0xf8, 0x54, 0x5f,
+ 0xa8, 0xfb, 0x7a, 0xfc, 0xb, 0xfb, 0x7a, 0xf8,
+ 0xb, 0x5, 0xe, 0xe0, 0xa0, 0x76, 0xf8, 0x61,
+ 0xbb, 0x55, 0xa, 0x16, 0xc2, 0xf7, 0x51, 0x6,
+ 0xf7, 0x23, 0xf7, 0x27, 0xf7, 0x15, 0xf7, 0x24,
+ 0xf7, 0x32, 0xf7, 0x19, 0xfb, 0x27, 0xfb, 0x11,
+ 0x1e, 0xfb, 0x51, 0xc2, 0xf7, 0x51, 0x7, 0xf7,
+ 0x41, 0xfb, 0x2f, 0xf7, 0x27, 0xfb, 0x53, 0xfb,
+ 0x53, 0xfb, 0x2f, 0xfb, 0x27, 0xfb, 0x41, 0x1e,
+ 0xe, 0xe0, 0x7a, 0xba, 0xf8, 0x62, 0x77, 0x55,
+ 0xa, 0xf7, 0xc1, 0x15, 0xfb, 0x41, 0xf7, 0x2f,
+ 0xfb, 0x25, 0x4b, 0xa, 0xf7, 0x2f, 0xf7, 0x25,
+ 0xf7, 0x41, 0x1e, 0xf7, 0x53, 0x54, 0xfb, 0x52,
+ 0x7, 0xfb, 0x11, 0xfb, 0x19, 0xfb, 0x27, 0xfb,
+ 0x32, 0xfb, 0x24, 0xfb, 0x27, 0xf7, 0x15, 0xf7,
+ 0x23, 0x1e, 0xf7, 0x52, 0x54, 0x7, 0xe, 0xfc,
+ 0x2d, 0x20, 0xf7, 0x4, 0xf9, 0xb8, 0xf6, 0x1,
+ 0xf7, 0xc, 0xd1, 0x3, 0x8d, 0x58, 0x15, 0x6a,
+ 0xaa, 0x74, 0xae, 0xf7, 0x27, 0x6e, 0xf8, 0x5d,
+ 0xf7, 0x1e, 0x8f, 0x1e, 0xf7, 0x1c, 0x76, 0xf7,
+ 0x31, 0x8d, 0xb0, 0x1e, 0x95, 0x8c, 0x8e, 0x92,
+ 0x94, 0x9b, 0x9a, 0x71, 0xac, 0x1b, 0xa4, 0x9d,
+ 0x9d, 0xa6, 0xb2, 0x72, 0xa2, 0x67, 0xfb, 0xb,
+ 0x94, 0xfb, 0x8a, 0xfb, 0x27, 0x1f, 0x8a, 0xfb,
+ 0xca, 0x90, 0x2e, 0x8d, 0x41, 0x8, 0x5c, 0x8d,
+ 0x8a, 0x73, 0x7c, 0x7c, 0x7a, 0xa9, 0x71, 0x1b,
+ 0x6f, 0x73, 0x7e, 0x60, 0x1f, 0xe, 0xf7, 0x48,
+ 0x8b, 0xf7, 0x15, 0xf7, 0x6f, 0xf7, 0x16, 0x1,
+ 0xf7, 0x37, 0xf7, 0x15, 0xd6, 0xf7, 0x16, 0xd6,
+ 0xf7, 0x15, 0x14, 0x38, 0xf7, 0x37, 0xcc, 0x15,
+ 0x52, 0xa, 0x6f, 0xa7, 0x67, 0x67, 0x6e, 0x6f,
+ 0x67, 0x1e, 0xf8, 0x2d, 0x16, 0x52, 0xa, 0x6d,
+ 0xa7, 0x67, 0x67, 0x70, 0x6f, 0x67, 0x1e, 0xfb,
+ 0x61, 0xf7, 0xf0, 0x15, 0x67, 0xa8, 0x6e, 0xaf,
+ 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8, 0x67,
+ 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xe, 0xf7, 0x5f,
+ 0xbf, 0x8b, 0xbf, 0x12, 0x9c, 0xf8, 0x94, 0x17,
+ 0x13, 0x60, 0xbc, 0xf7, 0x5f, 0x15, 0xa9, 0xa6,
+ 0xaa, 0xa1, 0xb8, 0x1b, 0xa9, 0xaa, 0x7f, 0x7c,
+ 0xba, 0x1f, 0x7f, 0xb1, 0xc0, 0x7e, 0xba, 0x1b,
+ 0xa2, 0xa1, 0x92, 0x94, 0x9f, 0x1f, 0xaa, 0x9a,
+ 0xa5, 0xa0, 0x94, 0x9d, 0x6a, 0xad, 0x18, 0x7c,
+ 0x7d, 0x6f, 0x66, 0x53, 0x1b, 0x63, 0x5f, 0x96,
+ 0x98, 0x65, 0x1f, 0x13, 0xe0, 0x99, 0x63, 0x66,
+ 0x99, 0x5c, 0x1b, 0x40, 0x6a, 0x61, 0x73, 0x70,
+ 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0x15, 0xc2, 0xf7,
+ 0x1b, 0xba, 0x90, 0xbb, 0x12, 0x96, 0xf7, 0x4c,
+ 0x15, 0x3a, 0xa, 0xfb, 0x83, 0x4, 0x3a, 0xa,
+ 0x13, 0x30, 0xba, 0xf7, 0xcf, 0x15, 0xab, 0xa8,
+ 0xa2, 0xa3, 0xbe, 0x1b, 0xa5, 0xad, 0x84, 0x7b,
+ 0xb9, 0x1f, 0x13, 0x20, 0x78, 0xc0, 0xb4, 0x81,
+ 0xaf, 0x1b, 0xa4, 0xa1, 0x90, 0x96, 0xa2, 0x1f,
+ 0xb7, 0xa0, 0x96, 0xa4, 0x93, 0x9a, 0x66, 0xa3,
+ 0x18, 0x7b, 0x7d, 0x73, 0x65, 0x4b, 0x1b, 0x72,
+ 0x63, 0x94, 0x97, 0x6c, 0x1f, 0x13, 0x10, 0x66,
+ 0x99, 0x60, 0x9c, 0x5e, 0x8c, 0x8, 0x34, 0x5e,
+ 0x5d, 0x6b, 0x77, 0x1f, 0xe, 0xf7, 0x1b, 0xbe,
+ 0xf4, 0xbe, 0x12, 0x99, 0xf8, 0x96, 0x17, 0xb9,
+ 0xf7, 0xb7, 0x57, 0xa, 0xb3, 0x7b, 0x7d, 0xbc,
+ 0x1f, 0x80, 0xb0, 0xb6, 0x32, 0xa, 0x97, 0x98,
+ 0x65, 0x1f, 0x98, 0x63, 0x62, 0x99, 0x5c, 0x1b,
+ 0x40, 0x68, 0x63, 0x72, 0x6d, 0x1f, 0xab, 0xfb,
+ 0x56, 0x57, 0xa, 0xb5, 0x7b, 0x7d, 0xbc, 0x1f,
+ 0x13, 0xa0, 0x80, 0xb0, 0xb4, 0x32, 0xa, 0x98,
+ 0x98, 0x64, 0x1f, 0x98, 0x63, 0x63, 0x98, 0x5c,
+ 0x1b, 0x40, 0x68, 0x62, 0x72, 0x6d, 0x1f, 0xe,
+ 0x87, 0x76, 0xf7, 0x35, 0xc2, 0xf7, 0x1f, 0xc2,
+ 0xf7, 0x38, 0x77, 0x1, 0xe9, 0x16, 0xbd, 0x72,
+ 0xe6, 0xf7, 0x35, 0x5, 0xf7, 0xc5, 0xc2, 0xfb,
+ 0xa7, 0x6, 0xd8, 0xf7, 0x1f, 0x5, 0xf7, 0x5a,
+ 0xc2, 0xfb, 0x3c, 0x6, 0xd7, 0xf7, 0x1c, 0x5a,
+ 0xa7, 0x30, 0xfb, 0x38, 0x5, 0xfb, 0xb9, 0x54,
+ 0xf7, 0x9a, 0x6, 0x3e, 0xfb, 0x1f, 0x5, 0xfb,
+ 0x4d, 0x54, 0xf7, 0x2f, 0x6, 0xe, 0xdd, 0xc2,
+ 0xed, 0xc2, 0xed, 0xc2, 0x1, 0x99, 0xf8, 0xa0,
+ 0x14, 0xe0, 0x99, 0xf8, 0x18, 0x15, 0x42, 0xa,
+ 0xfb, 0x64, 0x4, 0x42, 0xa, 0xfb, 0x64, 0x4,
+ 0x42, 0xa, 0xe, 0x3d, 0xa, 0xf7, 0xb8, 0x4,
+ 0xf8, 0x85, 0xfb, 0x76, 0x5, 0xc9, 0x7, 0xfc,
+ 0x45, 0xf7, 0x57, 0x3e, 0xa, 0x3d, 0xa, 0xcd,
+ 0x4, 0xf8, 0x85, 0xf7, 0x76, 0x5, 0x51, 0xa,
+ 0xf8, 0x45, 0xfb, 0x5b, 0xfc, 0x45, 0xfb, 0x57,
+ 0x5, 0xe, 0xa9, 0x8b, 0x47, 0xa, 0xb1, 0xc5,
+ 0x3, 0xf9, 0x46, 0x16, 0xc2, 0xfc, 0x29, 0x7,
+ 0x21, 0x8c, 0x39, 0xe3, 0xe2, 0x1a, 0xf0, 0xe1,
+ 0xde, 0xf3, 0x1e, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+ 0x6, 0xfb, 0x33, 0x34, 0xfb, 0x11, 0xfb, 0x6,
+ 0x8a, 0x1f, 0xfb, 0x19, 0x8a, 0xf7, 0x6, 0x29,
+ 0xf7, 0x16, 0x1b, 0xe, 0xa9, 0x8b, 0x47, 0xa,
+ 0xf8, 0xfb, 0xc5, 0x3, 0xf8, 0x40, 0x16, 0xf7,
+ 0x16, 0xf7, 0x7, 0xed, 0xf7, 0x19, 0xf7, 0x6,
+ 0x31, 0xf7, 0x11, 0xfb, 0x33, 0x1f, 0xfc, 0x28,
+ 0x54, 0xf8, 0x27, 0x6, 0xf3, 0xe3, 0x38, 0x26,
+ 0x34, 0x37, 0x33, 0x21, 0x58, 0xa, 0xa9, 0x5a,
+ 0x76, 0xd1, 0xc2, 0xf7, 0xfb, 0xc2, 0xd2, 0x77,
+ 0x1, 0xaf, 0xc5, 0x3, 0xf7, 0x8d, 0x45, 0x15,
+ 0xc7, 0x6, 0xaf, 0xd1, 0x5, 0xf7, 0xed, 0xc2,
+ 0xfb, 0xd0, 0x6, 0xf7, 0x44, 0xf7, 0xfb, 0x5,
+ 0xf7, 0x20, 0xc2, 0xfb, 0x4, 0x6, 0xb0, 0xd2,
+ 0x5, 0x4f, 0x6, 0x67, 0x44, 0x5, 0xfb, 0x8a,
+ 0x6, 0xfb, 0x4, 0xfb, 0x11, 0x36, 0xfb, 0x2b,
+ 0xfb, 0x31, 0xf7, 0x11, 0x3f, 0xf7, 0x10, 0x8a,
+ 0x1f, 0xa7, 0xc2, 0x15, 0xfb, 0x14, 0x8c, 0x30,
+ 0xdc, 0xee, 0x1a, 0xe2, 0xd9, 0xe7, 0xf5, 0x1e,
+ 0xf7, 0x68, 0x6, 0xe, 0xa9, 0xfb, 0x11, 0xc2,
+ 0xd1, 0x47, 0xa, 0xb0, 0xc3, 0x3, 0xb0, 0x45,
+ 0x15, 0x54, 0xf9, 0x21, 0xc2, 0x7, 0xd1, 0x4,
+ 0xc2, 0xfc, 0x29, 0x7, 0xfb, 0x10, 0x8c, 0x46,
+ 0xee, 0x8c, 0xdc, 0x8, 0xf7, 0x0, 0x8c, 0xea,
+ 0xd2, 0xed, 0x1b, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+ 0x6, 0xfb, 0x40, 0x3e, 0xfb, 0x16, 0xfb, 0x1,
+ 0xfb, 0x19, 0xf3, 0x29, 0xf7, 0x21, 0x1f, 0xe,
+ 0xa9, 0xfb, 0x11, 0xc2, 0xd1, 0x47, 0xa, 0xf8,
+ 0xfd, 0xc3, 0x3, 0x9f, 0xfb, 0x11, 0x15, 0xf9,
+ 0x21, 0xc2, 0xfd, 0x21, 0x6, 0xf8, 0x2c, 0xd1,
+ 0x15, 0xf7, 0x21, 0xf3, 0xed, 0xf7, 0x19, 0xf7,
+ 0x1, 0x3e, 0xf7, 0x16, 0xfb, 0x40, 0x1f, 0xfc,
+ 0x28, 0x54, 0xf8, 0x27, 0x6, 0xed, 0xeb, 0x44,
+ 0xfb, 0x0, 0x3a, 0x47, 0x28, 0xfb, 0x10, 0x58,
+ 0xa, 0xe0, 0x7c, 0xc0, 0xf7, 0x9d, 0xc1, 0xf7,
+ 0x9d, 0xc0, 0x1, 0xb6, 0xc4, 0xf7, 0x99, 0xc1,
+ 0xf7, 0x9d, 0xc0, 0x14, 0xe0, 0xf7, 0x24, 0xf7,
+ 0xc3, 0x15, 0xf7, 0x6d, 0xfb, 0x71, 0xc1, 0xf7,
+ 0x71, 0xf7, 0x6e, 0xc1, 0xfb, 0x6e, 0xf7, 0x6f,
+ 0x55, 0xfb, 0x6f, 0xfb, 0x6d, 0x6, 0x5f, 0x70,
+ 0x15, 0xf7, 0x35, 0xf7, 0x13, 0x30, 0xa, 0xfb,
+ 0x13, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0x52, 0x16,
+ 0x21, 0xa, 0xe, 0xe0, 0x7a, 0xc0, 0xf8, 0xdc,
+ 0xc0, 0x1, 0xb6, 0xc0, 0xf8, 0xdc, 0xc0, 0x3,
+ 0xf7, 0x54, 0xf7, 0x3f, 0x15, 0xb2, 0x64, 0xf7,
+ 0x31, 0xf7, 0x32, 0xf7, 0x32, 0xfb, 0x33, 0xb2,
+ 0xb1, 0xfb, 0x32, 0xf7, 0x33, 0xf7, 0x30, 0xf7,
+ 0x30, 0x64, 0xb1, 0xfb, 0x30, 0xfb, 0x30, 0xfb,
+ 0x31, 0xf7, 0x32, 0x64, 0x64, 0xf7, 0x31, 0xfb,
+ 0x31, 0x5, 0xfb, 0xc6, 0x16, 0x21, 0xa, 0xc0,
+ 0x16, 0xf7, 0x35, 0xf7, 0x17, 0x30, 0xa, 0xfb,
+ 0x17, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0xe, 0x72,
+ 0x8b, 0xc2, 0xf8, 0xff, 0x77, 0x1, 0xf7, 0xc6,
+ 0xc2, 0x3, 0x9a, 0x16, 0xf9, 0x11, 0xc2, 0xfb,
+ 0xb7, 0xf8, 0xff, 0x54, 0xfc, 0xff, 0xfb, 0xb7,
+ 0x6, 0xe, 0xfc, 0x45, 0xf7, 0x66, 0xef, 0x1,
+ 0xd0, 0xef, 0x3, 0xd0, 0xf7, 0x98, 0x15, 0x6f,
+ 0xa1, 0x75, 0xa7, 0xa6, 0xa2, 0xa1, 0xa7, 0xa6,
+ 0x74, 0xa2, 0x70, 0x6f, 0x75, 0x74, 0x70, 0x1e,
+ 0xe, 0x8e, 0x4d, 0x76, 0xf9, 0xe9, 0xf7, 0x2b,
+ 0x1, 0xf7, 0xe0, 0xd1, 0x3, 0xf7, 0xe0, 0x38,
+ 0x15, 0xd1, 0xf8, 0x13, 0x6, 0xf8, 0x88, 0xf7,
+ 0x33, 0xd0, 0xae, 0x93, 0x92, 0x89, 0x89, 0x8f,
+ 0x1e, 0x82, 0x86, 0x80, 0x79, 0x78, 0x1a, 0x73,
+ 0x9d, 0x6e, 0xb1, 0xb7, 0x9f, 0xb3, 0xb2, 0xaf,
+ 0x68, 0xaf, 0x5e, 0x4f, 0xfb, 0x87, 0x59, 0xfc,
+ 0xd3, 0x1e, 0xe, 0x8e, 0x3a, 0xf7, 0x29, 0xf9,
+ 0xe9, 0x77, 0x1, 0xf7, 0xee, 0xd0, 0x3, 0xf7,
+ 0x1e, 0x70, 0x15, 0x94, 0x90, 0x96, 0x9d, 0x9e,
+ 0x1a, 0xa3, 0x79, 0xa8, 0x65, 0x5f, 0x78, 0x64,
+ 0x64, 0x67, 0xad, 0x68, 0xb8, 0xc7, 0xf7, 0x81,
+ 0xbb, 0xf8, 0xd3, 0x1e, 0xf8, 0xf, 0x46, 0xfc,
+ 0x13, 0x7, 0xfc, 0x88, 0xfb, 0x2e, 0x46, 0x68,
+ 0x83, 0x84, 0x8d, 0x8d, 0x87, 0x1e, 0xe, 0x4c,
+ 0xa, 0xa4, 0xf7, 0xa6, 0x15, 0xf7, 0x7a, 0xfc,
+ 0x6c, 0xbe, 0xa4, 0xfb, 0x6e, 0xf8, 0x53, 0xf7,
+ 0x6e, 0xf8, 0x54, 0x58, 0xa3, 0x5, 0xe, 0x4c,
+ 0xa, 0xd3, 0xfb, 0x5a, 0x15, 0xf7, 0x7a, 0xf8,
+ 0x6c, 0xfb, 0x7a, 0xf8, 0x6c, 0x58, 0x73, 0xf7,
+ 0x6e, 0xfc, 0x54, 0xfb, 0x6e, 0xfc, 0x53, 0x5,
+ 0xe, 0xfb, 0x51, 0xa0, 0x76, 0xf9, 0x7d, 0x77,
+ 0x1, 0x9d, 0xc7, 0xf7, 0xde, 0xc7, 0x3, 0xf7,
+ 0x68, 0x16, 0xc7, 0x6, 0xf7, 0x58, 0xf8, 0xd,
+ 0xfb, 0x58, 0xf8, 0x4, 0x5, 0x4f, 0x6, 0xfb,
+ 0x56, 0xfc, 0x4, 0x5, 0xf7, 0x74, 0xfb, 0xd6,
+ 0x15, 0xfb, 0x38, 0xf7, 0xd6, 0xf7, 0x38, 0xf7,
+ 0xce, 0xf7, 0x3a, 0xfb, 0xce, 0x5, 0xe, 0xd1,
+ 0x7c, 0x76, 0xf8, 0xdc, 0x77, 0x1, 0xf7, 0xec,
+ 0xc1, 0x3, 0xf7, 0xbb, 0x67, 0x15, 0xf7, 0x2c,
+ 0x6, 0x84, 0x95, 0x62, 0xac, 0x8a, 0xce, 0x8,
+ 0xaf, 0x8a, 0x94, 0xa0, 0x9d, 0x1b, 0x91, 0x8f,
+ 0x86, 0x81, 0x90, 0x1f, 0x5d, 0xa2, 0xa2, 0x5e,
+ 0xcc, 0x1b, 0xbb, 0xaa, 0xc4, 0xbb, 0xc0, 0x74,
+ 0xb2, 0x61, 0xc2, 0x1f, 0x2d, 0xf7, 0x10, 0x6f,
+ 0xae, 0x44, 0xf7, 0x4, 0x44, 0xfb, 0x4, 0x6f,
+ 0x68, 0x2d, 0xfb, 0x10, 0x8, 0x61, 0x54, 0x74,
+ 0x64, 0x56, 0x1a, 0x5f, 0xa1, 0x4c, 0xcb, 0xc8,
+ 0xa6, 0xc6, 0xb1, 0x9c, 0x1e, 0x92, 0x8e, 0x8f,
+ 0x90, 0x94, 0x1b, 0x98, 0x97, 0x77, 0x65, 0x8a,
+ 0x1f, 0x8a, 0x48, 0x62, 0x6a, 0x84, 0x81, 0x8,
+ 0xe, 0xd1, 0x86, 0x76, 0xf7, 0x3c, 0xf7, 0x17,
+ 0x12, 0xf7, 0xe5, 0xd2, 0x4f, 0xbd, 0x13, 0xd0,
+ 0xf7, 0xbf, 0x71, 0x15, 0xf7, 0x28, 0x6, 0x70,
+ 0xac, 0x75, 0x9f, 0xcd, 0x1a, 0xaa, 0x8e, 0x9e,
+ 0x99, 0x95, 0x9a, 0x7e, 0x6f, 0xa2, 0x1e, 0x6b,
+ 0xa6, 0xab, 0x81, 0xb2, 0x1b, 0xc5, 0xb4, 0xc7,
+ 0xc9, 0xd1, 0x67, 0xc6, 0x47, 0x5f, 0x5e, 0x6d,
+ 0x83, 0x7c, 0x1f, 0x13, 0xe0, 0x70, 0x7d, 0x7a,
+ 0x92, 0x9a, 0x1a, 0x92, 0x8f, 0x92, 0x90, 0x90,
+ 0x1e, 0x9d, 0x9e, 0xcd, 0xb0, 0xd1, 0x1a, 0xd9,
+ 0x4b, 0xa8, 0x4b, 0x4a, 0x4b, 0x6c, 0x38, 0x48,
+ 0xd1, 0x67, 0x9a, 0x7b, 0x1e, 0x90, 0x85, 0x8e,
+ 0x85, 0x84, 0x1a, 0x7c, 0x79, 0x86, 0x72, 0x97,
+ 0x1e, 0x93, 0x7c, 0x64, 0xa9, 0x5f, 0x1b, 0x46,
+ 0x62, 0x53, 0x46, 0x47, 0xb5, 0x50, 0xcc, 0xaf,
+ 0xa8, 0x98, 0xa9, 0xa5, 0x1f, 0xa7, 0xa4, 0x9b,
+ 0x97, 0x94, 0x1b, 0x13, 0xd0, 0x99, 0x8b, 0x71,
+ 0x74, 0x49, 0x74, 0x76, 0x71, 0x6b, 0x1f, 0xe,
+ 0xd1, 0x7f, 0x76, 0xf8, 0xc9, 0x77, 0x1, 0xf8,
+ 0xa, 0x6a, 0x15, 0xd9, 0xf7, 0x7, 0x9a, 0xa7,
+ 0xe6, 0xf7, 0x9, 0x8, 0xb4, 0xc0, 0xab, 0xc0,
+ 0xc4, 0x1a, 0xf7, 0x8, 0x43, 0xa5, 0x61, 0x5d,
+ 0x5d, 0x76, 0x48, 0x72, 0x1e, 0x78, 0x83, 0x88,
+ 0x75, 0x7c, 0x1b, 0x7c, 0x88, 0xa1, 0x9e, 0x83,
+ 0x1f, 0xce, 0x72, 0x5d, 0xa0, 0x5d, 0x1b, 0x61,
+ 0x43, 0x71, 0xfb, 0x8, 0x52, 0xab, 0x56, 0xb4,
+ 0x56, 0x1f, 0xe6, 0xfb, 0x9, 0x9a, 0x6f, 0xd9,
+ 0xfb, 0x7, 0x8, 0xe, 0xd1, 0x7c, 0x76, 0xf8,
+ 0xde, 0x77, 0x1, 0xf7, 0x22, 0xf8, 0x5e, 0x3,
+ 0xf7, 0x22, 0xf7, 0x95, 0x15, 0xf7, 0x7c, 0xfb,
+ 0xb9, 0xf7, 0x76, 0xf7, 0xb9, 0xfb, 0x76, 0xf7,
+ 0xb9, 0x5, 0xe, 0xf6, 0x7c, 0xb3, 0xf3, 0xb1,
+ 0xf7, 0xdb, 0xa5, 0xf7, 0x7, 0xb3, 0x1, 0xbe,
+ 0xb3, 0xf7, 0xa, 0xcc, 0xf7, 0x92, 0x9f, 0xf7,
+ 0x2d, 0xb3, 0x3, 0xf8, 0xaf, 0xf7, 0x70, 0x15,
+ 0x62, 0x59, 0x6a, 0x7f, 0x5e, 0x1b, 0x40, 0x4d,
+ 0xc7, 0xf1, 0xd5, 0xb8, 0xe6, 0xdc, 0xc6, 0xc6,
+ 0x6c, 0x42, 0x95, 0x1f, 0x9f, 0x6, 0x87, 0xf7,
+ 0x14, 0x5, 0x78, 0x6, 0x88, 0x7d, 0x7c, 0x86,
+ 0x79, 0x8f, 0x8, 0x90, 0x76, 0x6b, 0x97, 0x64,
+ 0x1b, 0x24, 0x36, 0x31, 0x23, 0xfb, 0x9, 0xdb,
+ 0x3b, 0xf7, 0xb, 0xd7, 0xb7, 0xbd, 0xa2, 0xa1,
+ 0x1f, 0xfc, 0x87, 0xf7, 0x14, 0x23, 0xa, 0xf6,
+ 0x7a, 0xb3, 0xf7, 0x18, 0x9d, 0xf7, 0x31, 0xa2,
+ 0xf7, 0x32, 0xa3, 0xed, 0xb3, 0x1, 0xbd, 0xb3,
+ 0xf7, 0x51, 0xcb, 0xf7, 0x17, 0xcf, 0xf7, 0x32,
+ 0xb3, 0x3, 0xbd, 0xf7, 0xdc, 0x4f, 0xa, 0xf7,
+ 0x52, 0xf7, 0x2f, 0xf7, 0x2e, 0xf7, 0x53, 0x48,
+ 0xa, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x52, 0x8c,
+ 0x2c, 0xa, 0x1e, 0xfb, 0x3d, 0x8a, 0xfb, 0x1c,
+ 0x43, 0xa, 0x1a, 0xf7, 0x20, 0xfb, 0x40, 0x15,
+ 0xf7, 0x34, 0x9d, 0x6, 0x75, 0x72, 0x9a, 0xa3,
+ 0x1f, 0xf7, 0xa, 0xa5, 0x7, 0xf7, 0x19, 0xfb,
+ 0x43, 0x5, 0xea, 0x9d, 0x6, 0x7e, 0x7f, 0x8b,
+ 0x99, 0x80, 0x1f, 0xfb, 0xc, 0xf7, 0x2c, 0x5,
+ 0xc5, 0x9c, 0xb6, 0xa2, 0xc9, 0x1a, 0xd8, 0x3b,
+ 0x9c, 0x4f, 0x1e, 0xfb, 0x3b, 0x79, 0x6, 0xb3,
+ 0x8f, 0x80, 0x6e, 0x1f, 0xfb, 0xa0, 0x7, 0x78,
+ 0x71, 0x7a, 0x74, 0x1e, 0xf7, 0x5, 0xf7, 0x48,
+ 0x15, 0xf7, 0x12, 0x7, 0x9c, 0x95, 0x9a, 0x95,
+ 0xcf, 0xb5, 0x79, 0x58, 0x8c, 0x1e, 0x39, 0x43,
+ 0x85, 0x50, 0x8a, 0x1e, 0xe, 0xf7, 0x63, 0xf7,
+ 0xce, 0x76, 0xf7, 0xf9, 0xa2, 0x79, 0x9d, 0x12,
+ 0x9d, 0x9d, 0xf7, 0x6, 0xc6, 0xf7, 0x6, 0x9d,
+ 0xdd, 0xa6, 0xf7, 0xbc, 0xc6, 0x13, 0xdf, 0xee,
+ 0xf7, 0xb9, 0x15, 0xf7, 0x34, 0x9d, 0x6, 0x6c,
+ 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xc2, 0x7, 0xb0,
+ 0x8a, 0xc3, 0x89, 0xa2, 0x6e, 0x89, 0x5f, 0x19,
+ 0x9d, 0x8c, 0x88, 0xec, 0x5, 0xfb, 0xd1, 0x6,
+ 0x88, 0x2a, 0x9d, 0x8a, 0x89, 0xb7, 0xa2, 0xa8,
+ 0xc3, 0x8d, 0x19, 0xb0, 0x8c, 0x5, 0xfb, 0xc2,
+ 0x4a, 0xa, 0xf7, 0xa5, 0x79, 0x15, 0xf7, 0x15,
+ 0x9d, 0x6, 0x6c, 0x77, 0x9a, 0xa2, 0x1f, 0xf7,
+ 0x8f, 0x7, 0xf7, 0x24, 0xfb, 0xc7, 0x5, 0x9d,
+ 0x6, 0xf7, 0x1a, 0xf7, 0xd7, 0x5, 0xfb, 0x9f,
+ 0x4a, 0xa, 0x79, 0xf7, 0x34, 0x9d, 0x7, 0x6c,
+ 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xad, 0x7, 0x13,
+ 0xbf, 0xa6, 0xa8, 0x89, 0xa0, 0x1e, 0x9d, 0xfb,
+ 0x5, 0x7, 0xfb, 0x12, 0xfb, 0xb4, 0xfb, 0x18,
+ 0xf7, 0xb4, 0x5, 0xfb, 0x6, 0x79, 0x6, 0xab,
+ 0xa0, 0x8e, 0x65, 0x1f, 0xfb, 0xa3, 0x4a, 0xa,
+ 0xe, 0xfb, 0x4b, 0xfa, 0x5, 0xaf, 0x1, 0xf8,
+ 0x74, 0xfa, 0x5, 0x15, 0xf8, 0xf6, 0xaf, 0xfc,
+ 0xf6, 0x6, 0xe, 0x3b, 0x28, 0x76, 0xfa, 0xfe,
+ 0x49, 0xa, 0xf7, 0xac, 0xfb, 0xc, 0x15, 0xc3,
+ 0xfa, 0xfe, 0x53, 0x6, 0xe, 0xf7, 0xd1, 0xf7,
+ 0x70, 0xc3, 0x1, 0x4f, 0xfa, 0xea, 0x3, 0x4f,
+ 0xf7, 0x70, 0x15, 0xfa, 0xea, 0xc3, 0xfe, 0xea,
+ 0x6, 0xe, 0xf6, 0x77, 0xb3, 0xf7, 0xb4, 0xb6,
+ 0xf7, 0x17, 0xb6, 0xf4, 0xb3, 0x1, 0xbd, 0xb3,
+ 0xf7, 0x44, 0xbc, 0xf7, 0x54, 0xb9, 0xf7, 0x27,
+ 0xb3, 0x3, 0xbd, 0xf7, 0xd9, 0x4f, 0xa, 0x1e,
+ 0xf7, 0x52, 0x8c, 0xf7, 0x2f, 0xf7, 0x2d, 0xf7,
+ 0x53, 0x1a, 0x48, 0xa, 0xfb, 0x2e, 0xfb, 0x2f,
+ 0xfb, 0x52, 0x2c, 0xa, 0xfb, 0x3d, 0xfb, 0x1c,
+ 0xf7, 0x1c, 0xf7, 0x3c, 0x1e, 0xf7, 0x44, 0xfb,
+ 0x50, 0x15, 0xbc, 0xf7, 0x40, 0xf7, 0x11, 0x6,
+ 0xd2, 0x82, 0x3c, 0x67, 0x8c, 0x1f, 0x8c, 0x6f,
+ 0x93, 0x89, 0x94, 0x79, 0x8, 0x9e, 0xa1, 0x8b,
+ 0x9e, 0x1b, 0x73, 0xa7, 0x87, 0xa3, 0xb0, 0x1a,
+ 0xbe, 0x7c, 0xa6, 0x6c, 0xa0, 0x1e, 0xb0, 0xa7,
+ 0x98, 0x9d, 0xbc, 0x1a, 0xe1, 0x4d, 0x96, 0x50,
+ 0x1e, 0xfb, 0x3e, 0x6, 0xbc, 0xfb, 0x42, 0x15,
+ 0xf7, 0x17, 0xf7, 0xe, 0x7, 0xa9, 0xb3, 0x83,
+ 0x4a, 0x5a, 0x66, 0x82, 0x6a, 0x1f, 0xe, 0xf6,
+ 0x7c, 0xb3, 0xef, 0xb9, 0xf7, 0xcc, 0xb6, 0xf7,
+ 0x1, 0xb3, 0x1, 0xbc, 0xb3, 0xf7, 0x1e, 0xbc,
+ 0xf7, 0x80, 0xb8, 0xf7, 0x22, 0xb3, 0x3, 0xf8,
+ 0x94, 0xf7, 0xa6, 0x15, 0x52, 0x59, 0x5d, 0x52,
+ 0x35, 0x60, 0xe5, 0xd6, 0xdd, 0xb7, 0xcc, 0xd8,
+ 0xce, 0xb3, 0x6f, 0x58, 0x8d, 0x1e, 0xbe, 0x6,
+ 0xe5, 0x89, 0x44, 0xab, 0x33, 0x1b, 0xfb, 0x0,
+ 0x4e, 0x33, 0x23, 0xfb, 0x4, 0xcd, 0x2a, 0xf7,
+ 0x4, 0xf7, 0x0, 0xb9, 0xe7, 0xc4, 0x1f, 0xfc,
+ 0x92, 0xc3, 0x23, 0xa, 0xf2, 0xf7, 0xce, 0x76,
+ 0xf7, 0xe5, 0xb6, 0x1, 0xf7, 0x16, 0xbc, 0xf7,
+ 0x50, 0xbc, 0xf7, 0x98, 0xbc, 0x3, 0xf7, 0x16,
+ 0xf7, 0xb9, 0x15, 0xbc, 0xf7, 0xe5, 0xf7, 0x11,
+ 0xb6, 0xfb, 0xbf, 0x60, 0xf7, 0x11, 0x6, 0xf7,
+ 0x81, 0xfb, 0xe5, 0x15, 0xbc, 0xf7, 0xc9, 0x6,
+ 0xf4, 0xfb, 0xc4, 0x5, 0xbd, 0x6, 0xf4, 0xf7,
+ 0xc4, 0x5, 0xfb, 0xc9, 0xbc, 0xf8, 0x10, 0x44,
+ 0x7, 0xfb, 0x0, 0xfb, 0xd2, 0xfb, 0x0, 0xf7,
+ 0xd2, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xbf, 0xfb,
+ 0xb9, 0x1c, 0x4, 0xb9, 0x1, 0xa3, 0xdf, 0x3,
+ 0xa3, 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x2e, 0x6,
+ 0xf7, 0xf3, 0xf5, 0xf7, 0xc9, 0xf7, 0x72, 0xf7,
+ 0x1f, 0x1e, 0x7e, 0x95, 0x5, 0xfb, 0x57, 0x2a,
+ 0xfb, 0x60, 0xfb, 0x62, 0xfc, 0x8e, 0x1a, 0xe,
+ 0xfb, 0xbf, 0xfa, 0x31, 0x8b, 0x1, 0xa3, 0xdf,
+ 0x3, 0xa3, 0x54, 0xa, 0x3f, 0xa, 0xa3, 0xdf,
+ 0x3, 0xf8, 0x41, 0xfb, 0xb9, 0x15, 0x92, 0x95,
+ 0x5, 0xfb, 0x72, 0xf7, 0x29, 0x21, 0xf7, 0xbf,
+ 0xf7, 0xf3, 0x1a, 0xf8, 0x2e, 0x37, 0xfc, 0x2e,
+ 0x7, 0xfc, 0x8e, 0xf7, 0x65, 0xfb, 0x58, 0xf7,
+ 0x57, 0x20, 0x1e, 0xe, 0xfb, 0xbf, 0xfa, 0x9,
+ 0xb4, 0x1, 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xd8,
+ 0xf9, 0xd2, 0x6, 0xf7, 0x11, 0x9b, 0x95, 0xf7,
+ 0x11, 0x1e, 0xf7, 0x17, 0xb4, 0xfb, 0xf1, 0x6,
+ 0xe, 0xfb, 0xbf, 0x3c, 0xfa, 0x80, 0x1, 0x8b,
+ 0xd8, 0x3, 0x3c, 0x4, 0xd8, 0xfa, 0x80, 0x3e,
+ 0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0x8b,
+ 0xd8, 0x3, 0x3b, 0x4, 0xf7, 0xe8, 0xb4, 0xfb,
+ 0xe, 0x6, 0xfb, 0x11, 0x7b, 0x95, 0xf7, 0x11,
+ 0x1f, 0xf9, 0xd2, 0x3e, 0x7, 0xe, 0xfb, 0x51,
+ 0xfa, 0x13, 0xa9, 0x35, 0xa, 0xf7, 0xb0, 0x36,
+ 0x15, 0xf9, 0xc8, 0x7, 0xf7, 0x2, 0x91, 0xbd,
+ 0xdb, 0x1e, 0xd6, 0xa9, 0x40, 0x6, 0xfb, 0x2,
+ 0x58, 0x6e, 0xfb, 0x35, 0x1f, 0xfd, 0xc8, 0x7,
+ 0xe, 0x2d, 0xa, 0xf7, 0x7f, 0x6, 0xf7, 0x2d,
+ 0x4c, 0xde, 0xfb, 0x1c, 0xb2, 0x1e, 0xf7, 0x1c,
+ 0xb2, 0xca, 0xde, 0xf7, 0x2d, 0x1a, 0xf7, 0x7f,
+ 0x40, 0xfb, 0x7f, 0x7, 0x27, 0x67, 0xfb, 0x7,
+ 0xfb, 0x2d, 0x5e, 0x1e, 0x6d, 0x7, 0xf7, 0x2d,
+ 0x5e, 0xaf, 0xfb, 0x7, 0x27, 0x1a, 0xe, 0x53,
+ 0xa, 0xf7, 0x65, 0xfa, 0x3b, 0x15, 0xfd, 0xcc,
+ 0x7, 0xfb, 0x35, 0xb4, 0x72, 0xf7, 0x2, 0x1e,
+ 0xe0, 0xa9, 0x36, 0x6, 0x3b, 0x8f, 0xb9, 0xf7,
+ 0x2, 0x1f, 0xf9, 0xcc, 0x7, 0xe, 0x2d, 0xa,
+ 0xfa, 0x90, 0x40, 0x6, 0xe, 0x8e, 0x33, 0xfa,
+ 0xbb, 0x1, 0xf7, 0xc8, 0xd1, 0x3, 0xf7, 0xc8,
+ 0x33, 0x15, 0xd1, 0xfa, 0xbb, 0x45, 0x6, 0xe,
+ 0x3f, 0xa, 0xf8, 0x12, 0xdf, 0x3, 0xf8, 0x12,
+ 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x38, 0x6, 0xf8,
+ 0x8e, 0xfb, 0x60, 0xf7, 0x58, 0xfb, 0x57, 0xec,
+ 0x1e, 0x7e, 0x81, 0x5, 0xf7, 0x72, 0xfb, 0x1f,
+ 0xf5, 0xfb, 0xbf, 0xfb, 0xf3, 0x1a, 0xe, 0xfb,
+ 0xbf, 0x36, 0xfa, 0x86, 0x1, 0xf8, 0x12, 0xdf,
+ 0x3, 0xf8, 0x12, 0x54, 0xa, 0x3f, 0xa, 0xf8,
+ 0x12, 0xdf, 0x3, 0xc1, 0xfb, 0xaf, 0x15, 0x98,
+ 0x81, 0x5, 0xf7, 0x57, 0xec, 0xf7, 0x60, 0xf7,
+ 0x5d, 0xf8, 0x8e, 0x1a, 0xf8, 0x33, 0x37, 0xfc,
+ 0x33, 0x7, 0xfb, 0xf3, 0x21, 0xfb, 0xc4, 0xfb,
+ 0x72, 0xfb, 0x1f, 0x1e, 0xe, 0xfb, 0xbf, 0xfa,
+ 0x9, 0xb4, 0x1, 0xf7, 0xb9, 0xd9, 0x3, 0xf7,
+ 0xb9, 0x3b, 0x15, 0xd9, 0xfa, 0x82, 0xfb, 0xf1,
+ 0x62, 0xf7, 0x1b, 0x6, 0xf7, 0x11, 0x96, 0x80,
+ 0xfb, 0x11, 0x1f, 0xe, 0xfb, 0xbf, 0x3c, 0xfa,
+ 0x80, 0x1, 0xf7, 0xba, 0xd8, 0x3, 0xf7, 0xba,
+ 0x3c, 0x15, 0xd8, 0xfa, 0x80, 0x3e, 0x6, 0xe,
+ 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0xf7, 0xba, 0xd8,
+ 0x3, 0xa1, 0x64, 0x15, 0x62, 0xf7, 0xf1, 0xfa,
+ 0x82, 0x3e, 0xfd, 0xcf, 0x7, 0xfb, 0x13, 0x79,
+ 0x80, 0xfb, 0x11, 0x1e, 0xe, 0xfb, 0x51, 0xfa,
+ 0x13, 0xa9, 0x2e, 0xa, 0xf9, 0xc8, 0x6, 0xf7,
+ 0x2c, 0x74, 0xb1, 0xfb, 0x19, 0x1e, 0x3b, 0x6d,
+ 0xdb, 0x6, 0xd1, 0x96, 0x5f, 0xfb, 0x8, 0x1f,
+ 0xe, 0x2d, 0xa, 0xf7, 0x80, 0x6, 0xef, 0xaf,
+ 0xf7, 0x6, 0xf7, 0x2d, 0xb8, 0x1e, 0xa9, 0x7,
+ 0xfb, 0x2d, 0xb8, 0x67, 0xf7, 0x6, 0xef, 0x1a,
+ 0xf7, 0x80, 0x40, 0xfb, 0x80, 0x7, 0xfb, 0x2d,
+ 0xca, 0x39, 0xf7, 0x1c, 0x64, 0x1e, 0xfb, 0x1c,
+ 0x64, 0x4c, 0x39, 0xfb, 0x2d, 0x1a, 0xe, 0x53,
+ 0xa, 0xbb, 0x5e, 0x15, 0x6d, 0xdb, 0x7, 0xf7,
+ 0x16, 0xa5, 0xb3, 0xf7, 0x2b, 0x1f, 0xf9, 0xc7,
+ 0x40, 0xfd, 0xc7, 0x7, 0xfb, 0x16, 0x80, 0x6c,
+ 0x45, 0x1e, 0xe, 0xf6, 0x9d, 0x76, 0xf8, 0xff,
+ 0xf7, 0x54, 0x1, 0xf9, 0x71, 0xf7, 0x69, 0x15,
+ 0x3f, 0xa0, 0x65, 0xd3, 0xd4, 0x1a, 0xce, 0xa9,
+ 0xcd, 0xca, 0xa9, 0x1e, 0xbf, 0x6e, 0x41, 0xa4,
+ 0x52, 0x1b, 0x6e, 0x76, 0x84, 0x83, 0x76, 0x1f,
+ 0x83, 0x76, 0x75, 0x83, 0x6e, 0x1b, 0x72, 0x75,
+ 0x93, 0x93, 0x76, 0x1f, 0x94, 0x74, 0x75, 0x94,
+ 0x70, 0x1b, 0xfb, 0x3, 0x25, 0x2b, 0xfb, 0x21,
+ 0xfb, 0x1a, 0xd2, 0xfb, 0x92, 0xf7, 0x37, 0xa5,
+ 0x9e, 0x96, 0x94, 0xa0, 0x1f, 0x92, 0x9b, 0x9b,
+ 0x91, 0xa0, 0x1b, 0xa1, 0x9b, 0x85, 0x85, 0x9a,
+ 0x1f, 0x82, 0xa1, 0x9d, 0x7f, 0xa7, 0x1b, 0xe1,
+ 0xb5, 0xe2, 0xf7, 0x15, 0xd6, 0x1f, 0xfb, 0xdb,
+ 0xf8, 0x27, 0x15, 0xe6, 0x88, 0xe5, 0xf0, 0x76,
+ 0xe9, 0x8, 0x3c, 0x35, 0x2b, 0x2b, 0x90, 0x1f,
+ 0xe, 0x78, 0x9e, 0xf8, 0x7b, 0x98, 0xf7, 0x41,
+ 0x9a, 0x6, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+ 0x9, 0xe7, 0xa, 0xe0, 0xb, 0x9f, 0xd3, 0xc,
+ 0xc, 0xf8, 0xb9, 0x14, 0xf9, 0x3f, 0x15, 0xab,
+ 0x13, 0x0, 0x3a, 0x2, 0x0, 0x1, 0x0, 0x13,
+ 0x0, 0x2d, 0x0, 0x30, 0x0, 0x47, 0x0, 0x4f,
+ 0x0, 0x56, 0x0, 0x5d, 0x0, 0x61, 0x0, 0x67,
+ 0x0, 0x7c, 0x0, 0x82, 0x0, 0x8b, 0x0, 0xa6,
+ 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xc7,
+ 0x0, 0xce, 0x0, 0xe3, 0x0, 0xed, 0x0, 0xf6,
+ 0x0, 0xfc, 0x1, 0xa, 0x1, 0xe, 0x1, 0x19,
+ 0x1, 0x1c, 0x1, 0x23, 0x1, 0x2a, 0x1, 0x31,
+ 0x1, 0x40, 0x1, 0x4d, 0x1, 0x56, 0x1, 0x5f,
+ 0x1, 0x66, 0x1, 0x6d, 0x1, 0x72, 0x1, 0x77,
+ 0x1, 0x7c, 0x1, 0x88, 0x1, 0x8e, 0x1, 0x99,
+ 0x1, 0xa0, 0x1, 0xa7, 0x1, 0xac, 0x1, 0xb6,
+ 0x1, 0xc0, 0x1, 0xca, 0x1, 0xce, 0x1, 0xd8,
+ 0x1, 0xe2, 0x1, 0xec, 0x1, 0xf3, 0x1, 0xfb,
+ 0x2, 0x4, 0x2, 0x9, 0x2, 0x12, 0x2, 0x19,
+ 0x2, 0x1f, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+ 0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+ 0x72, 0x6c, 0x1e, 0xb, 0x2b, 0xa, 0xf7, 0x53,
+ 0xf7, 0x2e, 0xf7, 0x2e, 0x4b, 0xa, 0xfb, 0x2e,
+ 0xf7, 0x2e, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0x2e,
+ 0xfb, 0x2e, 0xfb, 0x53, 0x1e, 0xb, 0x20, 0xa,
+ 0xe, 0x15, 0x21, 0xa, 0xb3, 0x16, 0xf7, 0x3c,
+ 0xf7, 0x1d, 0x43, 0xa, 0xf7, 0x3c, 0xf7, 0x1d,
+ 0x34, 0xa, 0x34, 0xa, 0x43, 0xa, 0x1e, 0xe,
+ 0x16, 0xf7, 0xb0, 0x9d, 0x6, 0x2a, 0xa, 0xb,
+ 0x2f, 0xa, 0xfc, 0x7d, 0x27, 0xa, 0xb, 0x7,
+ 0x3c, 0xa, 0xfc, 0x7d, 0x39, 0xa, 0x7, 0x28,
+ 0xa, 0xb, 0x54, 0x68, 0x78, 0x54, 0x1e, 0xb,
+ 0x6d, 0xa4, 0x72, 0xaa, 0x1e, 0xa9, 0x8c, 0xa5,
+ 0xa3, 0xaa, 0x1a, 0xa9, 0x71, 0xa5, 0x6d, 0x6c,
+ 0x72, 0x71, 0x6c, 0x1e, 0xb, 0x54, 0x68, 0x9e,
+ 0xc2, 0x1f, 0xb, 0xfb, 0x53, 0xf7, 0x2e, 0xfb,
+ 0x2e, 0xf7, 0x53, 0xb, 0x1e, 0xb3, 0x8a, 0x15,
+ 0xf7, 0x3d, 0xf7, 0x1c, 0x43, 0xa, 0xf7, 0x3d,
+ 0xf7, 0x1d, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, 0x3d,
+ 0xfb, 0x1d, 0xfb, 0x1c, 0xfb, 0x3c, 0xb, 0xfb,
+ 0x51, 0x36, 0xfa, 0x90, 0x2e, 0xa, 0xb, 0x44,
+ 0xa, 0x36, 0x15, 0xd6, 0xb, 0xc2, 0xae, 0x78,
+ 0x54, 0x1f, 0xb, 0xf7, 0x17, 0xf7, 0x35, 0xf7,
+ 0x35, 0xf7, 0x17, 0x56, 0xa, 0x41, 0xa, 0xb,
+ 0xc2, 0xae, 0x9e, 0xc2, 0x1e, 0x9d, 0xb, 0x82,
+ 0xb9, 0x1b, 0xc5, 0xc7, 0xb4, 0xa8, 0x9a, 0x1f,
+ 0x68, 0xac, 0x5, 0x7c, 0x7d, 0x72, 0x66, 0x53,
+ 0x1b, 0x62, 0x66, 0xb, 0x1e, 0xfb, 0xa9, 0x79,
+ 0x6, 0x25, 0xa, 0xf7, 0x56, 0xb, 0xfb, 0x1d,
+ 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1d, 0xb, 0x1,
+ 0xf7, 0x65, 0xd6, 0x3, 0xb, 0xf7, 0x5c, 0x40,
+ 0xa, 0x6f, 0xa1, 0x6c, 0x7b, 0x7b, 0x85, 0x81,
+ 0x87, 0x1e, 0xb, 0x15, 0x20, 0xa, 0xb, 0x88,
+ 0x85, 0x8b, 0x89, 0x8a, 0x1a, 0x7c, 0x9a, 0x85,
+ 0x96, 0xb, 0x27, 0xa, 0xe, 0xf8, 0xa2, 0xc2,
+ 0xfc, 0xa2, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x35,
+ 0x77, 0x1, 0xb, 0x31, 0xa, 0xfb, 0xb0, 0x45,
+ 0xa, 0xb, 0x8b, 0xc2, 0xf8, 0xdc, 0x77, 0x1,
+ 0xa8, 0x16, 0xf8, 0x85, 0xc2, 0xfc, 0x85, 0x6,
+ 0xb, 0xf8, 0x45, 0xf7, 0x5b, 0x5, 0xc9, 0x7,
+ 0xfc, 0x85, 0xfb, 0x7a, 0x5, 0xe, 0xfb, 0xbf,
+ 0xfb, 0xb9, 0x1c, 0x4, 0xc3, 0x1, 0xb, 0x5,
+ 0x8f, 0x8f, 0x8d, 0x95, 0x91, 0x1a, 0xa8, 0xb,
+ 0xfb, 0x17, 0xfb, 0x35, 0xfb, 0x35, 0xb, 0xf8,
+ 0xa0, 0xc2, 0xfc, 0xa0, 0x6, 0xb, 0xf7, 0x1d,
+ 0xf7, 0x3c, 0xb, 0x35, 0xa, 0xf7, 0x65, 0xb,
+ 0x79, 0x7, 0x2f, 0xa, 0xb, 0xf7, 0xc4, 0x91,
+ 0x76, 0xf7, 0x7f, 0xc3, 0xf7, 0x7f, 0x77, 0x1,
+ 0xb, 0xc2, 0xf7, 0xfc, 0xc2, 0x1, 0xb, 0xf7,
+ 0x52, 0xfb, 0x2f, 0xf7, 0x2f, 0xfb, 0x52, 0xfb,
+ 0x53, 0xb, 0x77, 0x1, 0xf7, 0xac, 0xc3, 0x3,
+ 0xb, 0x7, 0x74, 0x77, 0x7c, 0x6c, 0x1e, 0xb,
+ 0xf7, 0x53, 0xf7, 0x53, 0xb, 0xfb, 0xf6, 0xfb,
+ 0x45, 0x76, 0xfa, 0x44, 0x77, 0x1, 0xb, 0xfb,
+ 0x5f, 0xfb, 0x4b, 0xa4, 0xf9, 0xba, 0xa4, 0x1,
+ 0xb, 0xfb, 0xf2, 0xfb, 0x2f, 0xa4, 0xf9, 0x9f,
+ 0xa4, 0x1, 0xb, 0x15, 0x2b, 0xa, 0xb, 0xfb,
+ 0xf2, 0xfb, 0x3e, 0x76, 0xf9, 0xf4, 0x77, 0x1,
+ 0xb, 0xc9, 0x7, 0xfc, 0x85, 0xf7, 0x7a, 0x5,
+ 0x4d, 0x7, 0xb, 0x67, 0xa8, 0x6e, 0xaf, 0xaf,
+ 0xa7, 0xa8, 0xaf, 0xaf, 0xb, 0xfb, 0x51, 0x40,
+ 0xa9, 0x35, 0xa, 0xb, 0x36, 0x15, 0xdf, 0xfa,
+ 0x86, 0x37, 0x6, 0xe, 0x1, 0xb3, 0xc2, 0xf8,
+ 0xda, 0xc2, 0x3, 0xb3, 0xb, 0x41, 0xa, 0xfb,
+ 0x17, 0xb, 0x15, 0xa9, 0xa6, 0xaa, 0x9f, 0xb8,
+ 0x1b, 0xaa, 0xb, 0x8a, 0x1f, 0xfc, 0x29, 0x54,
+ 0x6, 0xe, 0x90, 0x90, 0x8f, 0x8e, 0x8d, 0xb
+ };
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
new file mode 100644
index 0000000000..c5ccbaf64a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
@@ -0,0 +1,288 @@
+#ifndef _FX_FREETYPE_DONT_RENAME_
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+// To avoid any possible linking confliction, we rename all FreeType exported names
+
+#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType
+#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType
+#define FT_New_Face FPDFAPI_FT_New_Face
+#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap
+#define FT_Done_Face FPDFAPI_FT_Done_Face
+#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index
+#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face
+#define FT_MulDiv FPDFAPI_FT_MulDiv
+#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform
+#define FT_Cos FPDFAPI_FT_Cos
+#define FT_Sin FPDFAPI_FT_Sin
+#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph
+#define FT_DivFix FPDFAPI_FT_DivFix
+#define FT_Realloc FPDFAPI_FT_Realloc
+#define FT_Alloc FPDFAPI_FT_Alloc
+#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index
+#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints
+#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add
+#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs
+#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate
+#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform
+#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox
+#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind
+#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints
+#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New
+#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra
+#define FT_Free FPDFAPI_FT_Free
+#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap
+#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define FT_QAlloc FPDFAPI_FT_QAlloc
+#define FT_QRealloc FPDFAPI_FT_QRealloc
+#define FT_List_Find FPDFAPI_FT_List_Find
+#define FT_List_Add FPDFAPI_FT_List_Add
+#define FT_List_Insert FPDFAPI_FT_List_Insert
+#define FT_List_Remove FPDFAPI_FT_List_Remove
+#define FT_List_Up FPDFAPI_FT_List_Up
+#define FT_List_Iterate FPDFAPI_FT_List_Iterate
+#define FT_List_Finalize FPDFAPI_FT_List_Finalize
+#define ft_highpow2 FPDFAPI_ft_highpow2
+#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory
+#define FT_Stream_Close FPDFAPI_FT_Stream_Close
+#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek
+#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip
+#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos
+#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt
+#define FT_Stream_Read FPDFAPI_FT_Stream_Read
+#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead
+#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame
+#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame
+#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame
+#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame
+#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar
+#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort
+#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE
+#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset
+#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong
+#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE
+#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar
+#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort
+#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE
+#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset
+#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong
+#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE
+#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields
+#define FT_RoundFix FPDFAPI_FT_RoundFix
+#define FT_CeilFix FPDFAPI_FT_CeilFix
+#define FT_FloorFix FPDFAPI_FT_FloorFix
+#define FT_Sqrt32 FPDFAPI_FT_Sqrt32
+#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed
+#define FT_Tan FPDFAPI_FT_Tan
+#define FT_Atan2 FPDFAPI_FT_Atan2
+#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit
+#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate
+#define FT_Vector_Length FPDFAPI_FT_Vector_Length
+#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize
+#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar
+#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff
+#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose
+#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal
+#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal
+#define FT_Outline_New FPDFAPI_FT_Outline_New
+#define FT_Outline_Check FPDFAPI_FT_Outline_Check
+#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy
+#define FT_Outline_Done FPDFAPI_FT_Outline_Done
+#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse
+#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer
+#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer
+#define FT_Outline_Render FPDFAPI_FT_Outline_Render
+#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap
+#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation
+#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden
+#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset
+#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare
+#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup
+#define ft_validator_init FPDFAPI_ft_validator_init
+#define ft_validator_run FPDFAPI_ft_validator_run
+#define ft_validator_error FPDFAPI_ft_validator_error
+#define FT_Stream_New FPDFAPI_FT_Stream_New
+#define FT_Stream_Free FPDFAPI_FT_Stream_Free
+#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap
+#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap
+#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap
+#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap
+#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot
+#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot
+#define FT_Set_Transform FPDFAPI_FT_Set_Transform
+#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal
+#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph
+#define FT_Load_Char FPDFAPI_FT_Load_Char
+#define FT_New_Size FPDFAPI_FT_New_Size
+#define FT_Open_Face FPDFAPI_FT_Open_Face
+#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream
+#define FT_Attach_File FPDFAPI_FT_Attach_File
+#define FT_Done_Size FPDFAPI_FT_Done_Size
+#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size
+#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes
+#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning
+#define FT_CMap_Done FPDFAPI_FT_CMap_Done
+#define FT_CMap_New FPDFAPI_FT_CMap_New
+#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char
+#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char
+#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index
+#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name
+#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name
+#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table
+#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table
+#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info
+#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID
+#define FT_Activate_Size FPDFAPI_FT_Activate_Size
+#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer
+#define FT_Remove_Module FPDFAPI_FT_Remove_Module
+#define FT_Add_Module FPDFAPI_FT_Add_Module
+#define FT_Get_Module FPDFAPI_FT_Get_Module
+#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface
+#define ft_module_get_service FPDFAPI_ft_module_get_service
+#define FT_New_Library FPDFAPI_FT_New_Library
+#define FT_Library_Version FPDFAPI_FT_Library_Version
+#define FT_Done_Library FPDFAPI_FT_Done_Library
+#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook
+#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo
+#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets
+#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess
+#define af_dummy_script_class FPDFAPI_af_dummy_script_class
+#define af_latin_script_class FPDFAPI_af_latin_script_class
+#define af_cjk_script_class FPDFAPI_af_cjk_script_class
+#define af_autofitter_service FPDFAPI_af_autofitter_service
+#define autofit_module_class FPDFAPI_autofit_module_class
+#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec
+#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec
+#define cff_driver_class FPDFAPI_cff_driver_class
+#define FT_Stream_Open FPDFAPI_FT_Stream_Open
+#define FT_New_Memory FPDFAPI_FT_New_Memory
+#define FT_Done_Memory FPDFAPI_FT_Done_Memory
+#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc
+#define ft_mem_alloc FPDFAPI_ft_mem_alloc
+#define ft_mem_free FPDFAPI_ft_mem_free
+#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc
+#define ft_mem_realloc FPDFAPI_ft_mem_realloc
+#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type
+#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes
+#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes
+#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info
+#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count
+#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name
+#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New
+#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy
+#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done
+#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert
+#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden
+#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class
+#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class
+#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply
+#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert
+#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph
+#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy
+#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph
+#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform
+#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox
+#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap
+#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules
+#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master
+#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var
+#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates
+#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates
+#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates
+#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates
+#define ps_table_funcs FPDFAPI_ps_table_funcs
+#define ps_parser_funcs FPDFAPI_ps_parser_funcs
+#define t1_builder_funcs FPDFAPI_t1_builder_funcs
+#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs
+#define afm_parser_funcs FPDFAPI_afm_parser_funcs
+#define t1_cmap_classes FPDFAPI_t1_cmap_classes
+#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec
+#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec
+#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec
+#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec
+#define psaux_module_class FPDFAPI_psaux_module_class
+#define pshinter_module_class FPDFAPI_pshinter_module_class
+#define ps_hints_apply FPDFAPI_ps_hints_apply
+#define psnames_module_class FPDFAPI_psnames_module_class
+#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class
+#define ft_standard_raster FPDFAPI_ft_standard_raster
+#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class
+#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec
+#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec
+#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec
+#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec
+#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec
+#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec
+#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec
+#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec
+#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec
+#define sfnt_module_class FPDFAPI_sfnt_module_class
+#define ft_grays_raster FPDFAPI_ft_grays_raster
+#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class
+#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class
+#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class
+#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state
+#define tt_driver_class FPDFAPI_tt_driver_class
+#define TT_RunIns FPDFAPI_TT_RunIns
+#define TT_New_Context FPDFAPI_TT_New_Context
+#define t1_driver_class FPDFAPI_t1_driver_class
+#define t1cid_driver_class FPDFAPI_t1cid_driver_class
+#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning
+#define FT_Match_Size FPDFAPI_FT_Match_Size
+#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round
+#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics
+#define FT_Request_Size FPDFAPI_FT_Request_Size
+#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics
+#define FT_Select_Size FPDFAPI_FT_Select_Size
+#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics
+#define New_Profile FPDFAPI_New_Profile
+#define End_Profile FPDFAPI_End_Profile
+#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn
+#define Split_Conic FPDFAPI_Split_Conic
+#define Split_Cubic FPDFAPI_Split_Cubic
+#define Line_Up FPDFAPI_Line_Up
+#define Bezier_Up FPDFAPI_Bezier_Up
+#define Bezier_Down FPDFAPI_Bezier_Down
+#define Line_To FPDFAPI_Line_To
+#define Conic_To FPDFAPI_Conic_To
+#define Cubic_To FPDFAPI_Cubic_To
+#define Decompose_Curve FPDFAPI_Decompose_Curve
+#define Convert_Glyph FPDFAPI_Convert_Glyph
+#define Sort FPDFAPI_Sort
+#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init
+#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span
+#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop
+#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step
+#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init
+#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span
+#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop
+#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step
+#define Draw_Sweep FPDFAPI_Draw_Sweep
+#define Render_Single_Pass FPDFAPI_Render_Single_Pass
+#define Render_Glyph FPDFAPI_Render_Glyph
+#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table
+#define InsNew FPDFAPI_InsNew
+#define DelOld FPDFAPI_DelOld
+#define FT_MulFix FPDFAPI_FT_MulFix
+#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled
+#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled
+#define ft_corner_orientation FPDFAPI_ft_corner_orientation
+#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat
+#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format
+#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn
+#define ft_mem_dup FPDFAPI_ft_mem_dup
+#define ft_mem_strdup FPDFAPI_ft_mem_strdup
+#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault
+#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant
+#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar
+#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors
+#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex
+#define FT_Get_Advances FPDFAPI_FT_Get_Advances
+#define FT_Get_Advance FPDFAPI_FT_Get_Advance
+#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter
+
+#endif // !_FX_FREETYPE_DONT_RENAME_
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
new file mode 100644
index 0000000000..b971d146ed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/* */
+/* ftconfig.h */
+/* */
+/* ANSI-specific configuration file (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This header file contains a number of macro definitions that are used */
+ /* by the rest of the engine. Most of the macros here are automatically */
+ /* determined at compile time, and you should not need to change it to */
+ /* port FreeType, except to compile the library with a non-ANSI */
+ /* compiler. */
+ /* */
+ /* Note however that if some specific modifications are needed, we */
+ /* advise you to place a modified copy in your build directory. */
+ /* */
+ /* The build directory is usually `freetype/builds/<system>', and */
+ /* contains system-specific files that are always included first when */
+ /* building the library. */
+ /* */
+ /* This ANSI version should stay in `include/freetype/config'. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include "../../ft2build.h"
+#include "ftoption.h"
+#include "ftstdlib.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* PLATFORM-SPECIFIC CONFIGURATION MACROS */
+ /* */
+ /* These macros can be toggled to suit a specific system. The current */
+ /* ones are defaults used to compile FreeType in an ANSI C environment */
+ /* (16bit compilers are also supported). Copy this file to your own */
+ /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+ /* */
+ /*************************************************************************/
+
+
+ /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+ /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */
+ /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */
+ /* is probably unexpected. */
+ /* */
+ /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */
+ /* `char' type. */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT CHAR_BIT
+#endif
+
+
+ /* The size of an `int' type. */
+#if FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT (16 / FT_CHAR_BIT)
+#elif FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+ /* The size of a `long' type. A five-byte `long' (as used e.g. on the */
+ /* DM642) is recognized but avoided. */
+#if FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+ /* FT_UNUSED is a macro used to indicate that a given parameter is not */
+ /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg ) ( (arg) = (arg) )
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* AUTOMATIC CONFIGURATION MACROS */
+ /* */
+ /* These macros are computed from the ones defined above. Don't touch */
+ /* their definition, unless you know precisely what you are doing. No */
+ /* porter should need to mess with them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Mac support */
+ /* */
+ /* This is the only necessary change, so it is defined here instead */
+ /* providing a new configuration file. */
+ /* */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+ /* no Carbon frameworks for 64bit 10.4.x */
+ /* AvailabilityMacros.h is available since Mac OS X 10.2, */
+ /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+ /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit signed integer type. */
+ /* */
+ typedef signed short FT_Int16;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit unsigned integer type. */
+ /* */
+ typedef unsigned short FT_UInt16;
+
+ /* */
+
+
+ /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int32 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 32bit signed integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef signed XXX FT_Int32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt32 */
+ /* */
+ /* A typedef for a 32bit unsigned integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef unsigned XXX FT_UInt32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int64 */
+ /* */
+ /* A typedef for a 64bit signed integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef signed XXX FT_Int64;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt64 */
+ /* */
+ /* A typedef for a 64bit unsigned integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef unsigned XXX FT_UInt64;
+
+ /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+ typedef signed int FT_Int32;
+ typedef unsigned int FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+ typedef signed long FT_Int32;
+ typedef unsigned long FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+ /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+ typedef int FT_Fast;
+ typedef unsigned int FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+ typedef long FT_Fast;
+ typedef unsigned long FT_UFast;
+
+#endif
+
+
+ /* determine whether we have a 64-bit int type for platforms without */
+ /* Autoconf */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+ /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64 long
+#define FT_UINT64 unsigned long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __BORLANDC__ ) /* Borland C++ */
+
+ /* XXXX: We should probably check the value of __BORLANDC__ in order */
+ /* to test the compiler version. */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __WATCOMC__ ) /* Watcom C++ */
+
+ /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#elif defined( __GNUC__ )
+
+ /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+ /*************************************************************************/
+ /* */
+ /* A 64-bit data type will create compilation problems if you compile */
+ /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
+ /* is defined. You can however ignore this rule by defining the */
+ /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
+ /* */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+ /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+#ifdef FT_LONG64
+ typedef FT_INT64 FT_Int64;
+ typedef FT_UINT64 FT_UInt64;
+#endif
+
+
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+ /* Provide assembler fragments for performance-critical functions. */
+ /* These must be defined `static __inline__' with GCC. */
+
+ /**Johnson add !defined( __thumb__ )*/
+#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ ) /* RVCT */
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm
+ {
+ smull t2, t, b, a /* (lo=t2,hi=t) = a*b */
+ mov a, t, asr #31 /* a = (hi >> 31) */
+ add a, a, #0x8000 /* a += 0x8000 */
+ adds t2, t2, a /* t2 += a */
+ adc t, t, #0 /* t += carry */
+ mov a, t2, lsr #16 /* a = t2 >> 16 */
+ orr a, a, t, lsl #16 /* a |= t << 16 */
+ }
+ return a;
+ }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ ) && \
+ !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm__ __volatile__ (
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
+ "adds %1, %1, %0\n\t" /* %1 += %0 */
+ "adc %2, %2, #0\n\t" /* %2 += carry */
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
+ "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
+ : "=r"(a), "=&r"(t2), "=&r"(t)
+ : "r"(a), "r"(b)
+ : "cc" );
+ return a;
+ }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x8000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $16, %%eax\n"
+ "shll $16, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "=d"(b)
+ : "a"(a), "d"(b)
+ : "%ecx", "cc" );
+ return result;
+ }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+ __asm
+ {
+ mov eax, a
+ mov edx, b
+ imul edx
+ mov ecx, edx
+ sar ecx, 31
+ add ecx, 8000h
+ add eax, ecx
+ adc edx, 0
+ shr eax, 16
+ shl edx, 16
+ add eax, edx
+ mov result, eax
+ }
+ return result;
+ }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x ) static x
+#define FT_LOCAL_DEF( x ) static x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x ) extern "C" x
+#define FT_LOCAL_DEF( x ) extern "C" x
+#else
+#define FT_LOCAL( x ) extern x
+#define FT_LOCAL_DEF( x ) x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x ) extern "C" x
+#else
+#define FT_BASE( x ) extern x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x ) x
+#else
+#define FT_BASE_DEF( x ) x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x ) extern "C" x
+#else
+#define FT_EXPORT( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x ) extern "C" x
+#else
+#define FT_EXPORT_DEF( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x ) extern "C" x
+#else
+#define FT_EXPORT_VAR( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+ /* The following macros are needed to compile the library with a */
+ /* C++ compiler and with 16bit compilers. */
+ /* */
+
+ /* This is special. Within C++, you must specify `extern "C"' for */
+ /* functions which are used via function pointers, and you also */
+ /* must do that for structures which contain function pointers to */
+ /* assure C linkage -- it's not possible to have (local) anonymous */
+ /* functions which are accessed by (global) function pointers. */
+ /* */
+ /* */
+ /* FT_CALLBACK_DEF is used to _define_ a callback function. */
+ /* */
+ /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+ /* contains pointers to callback functions. */
+ /* */
+ /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */
+ /* that contains pointers to callback functions. */
+ /* */
+ /* */
+ /* Some 16bit compilers have to redefine these macros to insert */
+ /* the infamous `_cdecl' or `__fastcall' declarations. */
+ /* */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x ) extern "C" x
+#else
+#define FT_CALLBACK_DEF( x ) static x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE extern "C"
+#define FT_CALLBACK_TABLE_DEF extern "C"
+#else
+#define FT_CALLBACK_TABLE extern
+#define FT_CALLBACK_TABLE_DEF /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
new file mode 100644
index 0000000000..d97910471e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
@@ -0,0 +1,832 @@
+/***************************************************************************/
+/* */
+/* ftheader.h */
+/* */
+/* Build macros of the FreeType 2 library. */
+/* */
+/* Copyright 1996-2008, 2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_BEGIN_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_END_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER extern "C" {
+#else
+#define FT_BEGIN_HEADER /* nothing */
+#endif
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_END_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_BEGIN_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_END_HEADER }
+#else
+#define FT_END_HEADER /* nothing */
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Aliases for the FreeType 2 public and configuration files. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* header_file_macros */
+ /* */
+ /* <Title> */
+ /* Header File Macros */
+ /* */
+ /* <Abstract> */
+ /* Macro definitions used to #include specific header files. */
+ /* */
+ /* <Description> */
+ /* The following macros are defined to the name of specific */
+ /* FreeType~2 header files. They can be used directly in #include */
+ /* statements as in: */
+ /* */
+ /* { */
+ /* #include "../freetype.h" */
+ /* #include "../ftmm.h" */
+ /* #include "../ftglyph.h" */
+ /* } */
+ /* */
+ /* There are several reasons why we are now using macros to name */
+ /* public header files. The first one is that such macros are not */
+ /* limited to the infamous 8.3~naming rule required by DOS (and */
+ /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */
+ /* */
+ /* The second reason is that it allows for more flexibility in the */
+ /* way FreeType~2 is installed on a given system. */
+ /* */
+ /*************************************************************************/
+
+
+ /* configuration files */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_CONFIG_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 configuration data.
+ *
+ */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_STANDARD_LIBRARY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 interface to the standard C library functions.
+ *
+ */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_OPTIONS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 project-specific configuration options.
+ *
+ */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_MODULES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 modules that are statically linked to new library
+ * instances in @FT_Init_FreeType.
+ *
+ */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h>
+#endif
+
+ /* */
+
+ /* public headers */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_FREETYPE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * base FreeType~2 API.
+ *
+ */
+#define FT_FREETYPE_H <freetype/freetype.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 error codes (and messages).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_ERRORS_H <freetype/fterrors.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 module error offsets (and messages).
+ *
+ */
+#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYSTEM_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 interface to low-level operations (i.e., memory management
+ * and stream i/o).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_SYSTEM_H <freetype/ftsystem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing type
+ * definitions related to glyph images (i.e., bitmaps, outlines,
+ * scan-converter parameters).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_IMAGE_H <freetype/ftimage.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * basic data types defined by FreeType~2.
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_TYPES_H <freetype/fttypes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LIST_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list management API of FreeType~2.
+ *
+ * (Most applications will never need to include this file.)
+ *
+ */
+#define FT_LIST_H <freetype/ftlist.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OUTLINE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * scalable outline management API of FreeType~2.
+ *
+ */
+#define FT_OUTLINE_H <freetype/ftoutln.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SIZES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API which manages multiple @FT_Size objects per face.
+ *
+ */
+#define FT_SIZES_H <freetype/ftsizes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * module management API of FreeType~2.
+ *
+ */
+#define FT_MODULE_H <freetype/ftmodapi.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_RENDER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * renderer module management API of FreeType~2.
+ *
+ */
+#define FT_RENDER_H <freetype/ftrender.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_AUTOHINTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the auto-hinting module.
+ *
+ */
+#define FT_AUTOHINTER_H <freetype/ftautoh.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CFF_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the CFF driver module.
+ *
+ */
+#define FT_CFF_DRIVER_H <freetype/ftcffdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the TrueType driver module.
+ *
+ */
+#define FT_TRUETYPE_DRIVER_H <freetype/ftttdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPE1_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the Type~1 format.
+ *
+ */
+#define FT_TYPE1_TABLES_H <freetype/t1tables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_IDS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * enumeration values which identify name strings, languages, encodings,
+ * etc. This file really contains a _large_ set of constant macro
+ * definitions, taken from the TrueType and OpenType specifications.
+ *
+ */
+#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the TrueType (as well as OpenType) format.
+ *
+ */
+#define FT_TRUETYPE_TABLES_H <freetype/tttables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TAGS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of TrueType four-byte `tags' which identify blocks in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_TRUETYPE_TAGS_H <freetype/tttags.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BDF_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which accesses BDF-specific strings from a
+ * face.
+ *
+ */
+#define FT_BDF_H <freetype/ftbdf.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CID_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which access CID font information from a
+ * face.
+ *
+ */
+#define FT_CID_H <freetype/ftcid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GZIP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports gzip-compressed files.
+ *
+ */
+#define FT_GZIP_H <freetype/ftgzip.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LZW_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports LZW-compressed files.
+ *
+ */
+#define FT_LZW_H <freetype/ftlzw.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BZIP2_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports bzip2-compressed files.
+ *
+ */
+#define FT_BZIP2_H <freetype/ftbzip2.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_WINFONTS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports Windows FNT files.
+ *
+ */
+#define FT_WINFONTS_H <freetype/ftwinfnt.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GLYPH_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional glyph management component.
+ *
+ */
+#define FT_GLYPH_H <freetype/ftglyph.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BITMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional bitmap conversion component.
+ *
+ */
+#define FT_BITMAP_H <freetype/ftbitmap.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BBOX_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional exact bounding box computation routines.
+ *
+ */
+#define FT_BBOX_H <freetype/ftbbox.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional FreeType~2 cache sub-system.
+ *
+ */
+#define FT_CACHE_H <freetype/ftcache.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `glyph image' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for @FT_Glyph elements. You can also
+ * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+ * store small glyph bitmaps, as it will use less memory.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * glyph image-related cache declarations.
+ *
+ */
+#define FT_CACHE_IMAGE_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_SMALL_BITMAPS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `small bitmaps' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for small glyph bitmaps in a relatively
+ * memory-efficient way. You can also use the API defined in
+ * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+ * including scalable outlines.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * small bitmaps-related cache declarations.
+ *
+ */
+#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_CHARMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `charmap' API of the FreeType~2 cache sub-system.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * charmap-based cache declarations.
+ *
+ */
+#define FT_CACHE_CHARMAP_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MAC_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * Macintosh-specific FreeType~2 API. The latter is used to access
+ * fonts embedded in resource forks.
+ *
+ * This header file must be explicitly included by client applications
+ * compiled on the Mac (note that the base API still works though).
+ *
+ */
+#define FT_MAC_H <freetype/ftmac.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MULTIPLE_MASTERS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional multiple-masters management API of FreeType~2.
+ *
+ */
+#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SFNT_NAMES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which accesses embedded `name' strings in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_SFNT_NAMES_H <freetype/ftsnames.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OPENTYPE_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+ * GPOS, GSUB, JSTF).
+ *
+ */
+#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GX_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+ * mort, morx, bsln, just, kern, opbd, trak, prop).
+ *
+ */
+#define FT_GX_VALIDATE_H <freetype/ftgxval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_PFR_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which accesses PFR-specific data.
+ *
+ */
+#define FT_PFR_H <freetype/ftpfr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_STROKER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions to stroke outline paths.
+ */
+#define FT_STROKER_H <freetype/ftstroke.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYNTHESIS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs artificial obliquing and emboldening.
+ */
+#define FT_SYNTHESIS_H <freetype/ftsynth.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_XFREE86_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions specific to the XFree86 and
+ * X.Org X11 servers.
+ */
+#define FT_XFREE86_H <freetype/ftxf86.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRIGONOMETRY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs trigonometric computations (e.g.,
+ * cosines and arc tangents).
+ */
+#define FT_TRIGONOMETRY_H <freetype/fttrigon.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LCD_FILTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_LCD_FILTER_H <freetype/ftlcdfil.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_UNPATENTED_HINTING_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_INCREMENTAL_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GASP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns entries from the TrueType GASP table.
+ */
+#define FT_GASP_H <freetype/ftgasp.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ADVANCES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns individual and ranged glyph advances.
+ */
+#define FT_ADVANCES_H <freetype/ftadvanc.h>
+
+
+ /* */
+
+#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h>
+
+
+ /* The internals of the cache sub-system are no longer exposed. We */
+ /* default to FT_CACHE_H at the moment just in case, but we know of */
+ /* no rogue client that uses them. */
+ /* */
+#define FT_CACHE_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h>
+
+
+ /*
+ * Include internal headers definitions from <freetype/internal/...>
+ * only when building the library.
+ */
+#ifdef FT2_BUILD_LIBRARY
+#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h>
+#include "../internal/internal.h"
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
new file mode 100644
index 0000000000..0d31ce6932
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
@@ -0,0 +1,32 @@
+/*
+ * This file registers the FreeType modules compiled into the library.
+ *
+ * If you use GNU make, this file IS NOT USED! Instead, it is created in
+ * the objects directory (normally `<topdir>/objs/') based on information
+ * from `<topdir>/modules.cfg'.
+ *
+ * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ * FreeType without GNU make.
+ *
+ */
+
+//FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
new file mode 100644
index 0000000000..e16e3c199c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
@@ -0,0 +1,833 @@
+/***************************************************************************/
+/* */
+/* ftoption.h */
+/* */
+/* User-selectable configuration macros (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include "../../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* USER-SELECTABLE CONFIGURATION MACROS */
+ /* */
+ /* This file contains the default configuration macro definitions for */
+ /* a standard build of the FreeType library. There are three ways to */
+ /* use this file to build project-specific versions of the library: */
+ /* */
+ /* - You can modify this file by hand, but this is not recommended in */
+ /* cases where you would like to build several versions of the */
+ /* library from a single source directory. */
+ /* */
+ /* - You can put a copy of this file in your build directory, more */
+ /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */
+ /* is the name of a directory that is included _before_ the FreeType */
+ /* include path during compilation. */
+ /* */
+ /* The default FreeType Makefiles and Jamfiles use the build */
+ /* directory `builds/<system>' by default, but you can easily change */
+ /* that for your own projects. */
+ /* */
+ /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */
+ /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */
+ /* locate this file during the build. For example, */
+ /* */
+ /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */
+ /* #include <freetype/config/ftheader.h> */
+ /* */
+ /* will use `$BUILD/myftoptions.h' instead of this file for macro */
+ /* definitions. */
+ /* */
+ /* Note also that you can similarly pre-define the macro */
+ /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+ /* that are statically linked to the library at compile time. By */
+ /* default, this file is <freetype/config/ftmodule.h>. */
+ /* */
+ /* We highly recommend using the third method whenever possible. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Uncomment the line below if you want to activate sub-pixel rendering */
+ /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */
+ /* */
+ /* Note that this feature is covered by several Microsoft patents */
+ /* and should not be activated in any default build of the library. */
+ /* */
+ /* This macro has no impact on the FreeType API, only on its */
+ /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */
+ /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */
+ /* the original size in case this macro isn't defined; however, each */
+ /* triplet of subpixels has R=G=B. */
+ /* */
+ /* This is done to allow FreeType clients to run unmodified, forcing */
+ /* them to display normal gray-level anti-aliased glyphs. */
+ /* */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+ /*************************************************************************/
+ /* */
+ /* Many compilers provide a non-ANSI 64-bit data type that can be used */
+ /* by FreeType to speed up some computations. However, this will create */
+ /* some problems when compiling the library in strict ANSI mode. */
+ /* */
+ /* For this reason, the use of 64-bit integers is normally disabled when */
+ /* the __STDC__ macro is defined. You can however disable this by */
+ /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */
+ /* */
+ /* For most compilers, this will only create compilation warnings when */
+ /* building the library. */
+ /* */
+ /* ObNote: The compiler-specific 64-bit integers are detected in the */
+ /* file `ftconfig.h' either statically or through the */
+ /* `configure' script on supported platforms. */
+ /* */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, do not try to use an assembler version of */
+ /* performance-critical functions (e.g. FT_MulFix). You should only do */
+ /* that to verify that the assembler function works properly, or to */
+ /* execute benchmark tests of the various implementations. */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, try to use an inlined assembler version of */
+ /* the `FT_MulFix' function, which is a `hotspot' when loading and */
+ /* hinting glyphs, and which should be executed as fast as possible. */
+ /* */
+ /* Note that if your compiler or CPU is not supported, this will default */
+ /* to the standard and portable implementation found in `ftcalc.c'. */
+ /* */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+ /*************************************************************************/
+ /* */
+ /* LZW-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `compress' program. This is mostly used to parse many of the PCF */
+ /* files that come with various X11 distributions. The implementation */
+ /* uses NetBSD's `zopen' to partially uncompress the file on the fly */
+ /* (see src/lzw/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+ /*************************************************************************/
+ /* */
+ /* Gzip-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `gzip' program. This is mostly used to parse many of the PCF files */
+ /* that come with XFree86. The implementation uses `zlib' to */
+ /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. See also */
+ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */
+ /* */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+ /*************************************************************************/
+ /* */
+ /* ZLib library selection */
+ /* */
+ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */
+ /* It allows FreeType's `ftgzip' component to link to the system's */
+ /* installation of the ZLib library. This is useful on systems like */
+ /* Unix or VMS where it generally is already available. */
+ /* */
+ /* If you let it undefined, the component will use its own copy */
+ /* of the zlib sources instead. These have been modified to be */
+ /* included directly within the component and *not* export external */
+ /* function names. This allows you to link any program with FreeType */
+ /* _and_ ZLib without linking conflicts. */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+ /*************************************************************************/
+ /* */
+ /* Bzip2-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `bzip2' program. This is mostly used to parse many of the PCF */
+ /* files that come with XFree86. The implementation uses `libbz2' to */
+ /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+ /* Contrary to gzip, bzip2 currently is not included and need to use */
+ /* the system available bzip2 implementation. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define to disable the use of file stream functions and types, FILE, */
+ /* fopen() etc. Enables the use of smaller system libraries on embedded */
+ /* systems that have multiple system libraries, some with or without */
+ /* file stream support, in the cases where file stream support is not */
+ /* necessary such as memory loading of font files. */
+ /* */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+ /*************************************************************************/
+ /* */
+ /* PNG bitmap support. */
+ /* */
+ /* FreeType now handles loading color bitmap glyphs in the PNG format. */
+ /* This requires help from the external libpng library. Uncompressed */
+ /* color bitmaps do not need any external libraries and will be */
+ /* supported regardless of this configuration. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_PNG */
+
+
+ /*************************************************************************/
+ /* */
+ /* DLL export compilation */
+ /* */
+ /* When compiling FreeType as a DLL, some systems/compilers need a */
+ /* special keyword in front OR after the return type of function */
+ /* declarations. */
+ /* */
+ /* Two macros are used within the FreeType source code to define */
+ /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */
+ /* */
+ /* FT_EXPORT( return_type ) */
+ /* */
+ /* is used in a function declaration, as in */
+ /* */
+ /* FT_EXPORT( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ); */
+ /* */
+ /* */
+ /* FT_EXPORT_DEF( return_type ) */
+ /* */
+ /* is used in a function definition, as in */
+ /* */
+ /* FT_EXPORT_DEF( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ) */
+ /* { */
+ /* ... some code ... */
+ /* return FT_Err_Ok; */
+ /* } */
+ /* */
+ /* You can provide your own implementation of FT_EXPORT and */
+ /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */
+ /* will be later automatically defined as `extern return_type' to */
+ /* allow normal compilation. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_EXPORT(x) extern x */
+/* #define FT_EXPORT_DEF(x) x */
+
+
+ /*************************************************************************/
+ /* */
+ /* Glyph Postscript Names handling */
+ /* */
+ /* By default, FreeType 2 is compiled with the `psnames' module. This */
+ /* module is in charge of converting a glyph name string into a */
+ /* Unicode value, or return a Macintosh standard glyph name for the */
+ /* use with the TrueType `post' table. */
+ /* */
+ /* Undefine this macro if you do not want `psnames' compiled in your */
+ /* build of FreeType. This has the following effects: */
+ /* */
+ /* - The TrueType driver will provide its own set of glyph names, */
+ /* if you build it to support postscript names in the TrueType */
+ /* `post' table. */
+ /* */
+ /* - The Type 1 driver will not be able to synthesize a Unicode */
+ /* charmap out of the glyphs found in the fonts. */
+ /* */
+ /* You would normally undefine this configuration macro when building */
+ /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */
+ /* */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Postscript Names to Unicode Values support */
+ /* */
+ /* By default, FreeType 2 is built with the `PSNames' module compiled */
+ /* in. Among other things, the module is used to convert a glyph name */
+ /* into a Unicode value. This is especially useful in order to */
+ /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */
+ /* through a big table named the `Adobe Glyph List' (AGL). */
+ /* */
+ /* Undefine this macro if you do not want the Adobe Glyph List */
+ /* compiled in your `PSNames' module. The Type 1 driver will not be */
+ /* able to synthesize a Unicode charmap out of the glyphs found in the */
+ /* fonts. */
+ /* */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+ /*************************************************************************/
+ /* */
+ /* Support for Mac fonts */
+ /* */
+ /* Define this macro if you want support for outline fonts in Mac */
+ /* format (mac dfont, mac resource, macbinary containing a mac */
+ /* resource) on non-Mac platforms. */
+ /* */
+ /* Note that the `FOND' resource isn't checked. */
+ /* */
+//#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Guessing methods to access embedded resource forks */
+ /* */
+ /* Enable extra Mac fonts support on non-Mac platforms (e.g. */
+ /* GNU/Linux). */
+ /* */
+ /* Resource forks which include fonts data are stored sometimes in */
+ /* locations which users or developers don't expected. In some cases, */
+ /* resource forks start with some offset from the head of a file. In */
+ /* other cases, the actual resource fork is stored in file different */
+ /* from what the user specifies. If this option is activated, */
+ /* FreeType tries to guess whether such offsets or different file */
+ /* names must be used. */
+ /* */
+ /* Note that normal, direct access of resource forks is controlled via */
+ /* the FT_CONFIG_OPTION_MAC_FONTS option. */
+ /* */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Allow the use of FT_Incremental_Interface to load typefaces that */
+ /* contain no glyph data, but supply it via a callback function. */
+ /* This is required by clients supporting document formats which */
+ /* supply font data incrementally as the document is parsed, such */
+ /* as the Ghostscript interpreter for the PostScript language. */
+ /* */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+ /*************************************************************************/
+ /* */
+ /* The size in bytes of the render pool used by the scan-line converter */
+ /* to do all of its work. */
+ /* */
+ /* This must be greater than 4KByte if you use FreeType to rasterize */
+ /* glyphs; otherwise, you may set it to zero to avoid unnecessary */
+ /* allocation of the render pool. */
+ /* */
+#define FT_RENDER_POOL_SIZE 16384L
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MAX_MODULES */
+ /* */
+ /* The maximum number of modules that can be registered in a single */
+ /* FreeType library object. 32 is the default. */
+ /* */
+#define FT_MAX_MODULES 32
+
+
+ /*************************************************************************/
+ /* */
+ /* Debug level */
+ /* */
+ /* FreeType can be compiled in debug or trace mode. In debug mode, */
+ /* errors are reported through the `ftdebug' component. In trace */
+ /* mode, additional messages are sent to the standard output during */
+ /* execution. */
+ /* */
+ /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */
+ /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */
+ /* */
+ /* Don't define any of these macros to compile in `release' mode! */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Autofitter debugging */
+ /* */
+ /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */
+ /* control the autofitter behaviour for debugging purposes with global */
+ /* boolean variables (consequently, you should *never* enable this */
+ /* while compiling in `release' mode): */
+ /* */
+ /* _af_debug_disable_horz_hints */
+ /* _af_debug_disable_vert_hints */
+ /* _af_debug_disable_blue_hints */
+ /* */
+ /* Additionally, the following functions provide dumps of various */
+ /* internal autofit structures to stdout (using `printf'): */
+ /* */
+ /* af_glyph_hints_dump_points */
+ /* af_glyph_hints_dump_segments */
+ /* af_glyph_hints_dump_edges */
+ /* */
+ /* As an argument, they use another global variable: */
+ /* */
+ /* _af_debug_hints */
+ /* */
+ /* Please have a look at the `ftgrid' demo program to see how those */
+ /* variables and macros should be used. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+ /*************************************************************************/
+ /* */
+ /* Memory Debugging */
+ /* */
+ /* FreeType now comes with an integrated memory debugger that is */
+ /* capable of detecting simple errors like memory leaks or double */
+ /* deletes. To compile it within your build of the library, you */
+ /* should define FT_DEBUG_MEMORY here. */
+ /* */
+ /* Note that the memory debugger is only activated at runtime when */
+ /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_MEMORY */
+
+
+ /*************************************************************************/
+ /* */
+ /* Module errors */
+ /* */
+ /* If this macro is set (which is _not_ the default), the higher byte */
+ /* of an error code gives the module in which the error has occurred, */
+ /* while the lower byte is the real error code. */
+ /* */
+ /* Setting this macro makes sense for debugging purposes only, since */
+ /* it would break source compatibility of certain programs that use */
+ /* FreeType 2. */
+ /* */
+ /* More details can be found in the files ftmoderr.h and fterrors.h. */
+ /* */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+ /*************************************************************************/
+ /* */
+ /* Position Independent Code */
+ /* */
+ /* If this macro is set (which is _not_ the default), FreeType2 will */
+ /* avoid creating constants that require address fixups. Instead the */
+ /* constants will be moved into a struct and additional intialization */
+ /* code will be used. */
+ /* */
+ /* Setting this macro is needed for systems that prohibit address */
+ /* fixups, such as BREW. */
+ /* */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** S F N T D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */
+ /* embedded bitmaps in all formats using the SFNT module (namely */
+ /* TrueType & OpenType). */
+ /* */
+#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */
+ /* load and enumerate the glyph Postscript names in a TrueType or */
+ /* OpenType file. */
+ /* */
+ /* Note that when you do not compile the `PSNames' module by undefining */
+ /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */
+ /* contain additional code used to read the PS Names table from a font. */
+ /* */
+ /* (By default, the module uses `PSNames' to extract glyph names.) */
+ /* */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */
+ /* access the internal name table in a SFNT-based format like TrueType */
+ /* or OpenType. The name table contains various strings used to */
+ /* describe the font, like family name, copyright, version, etc. It */
+ /* does not contain any glyph name though. */
+ /* */
+ /* Accessing SFNT names is done through the functions declared in */
+ /* `freetype/ftsnames.h'. */
+ /* */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType CMap support */
+ /* */
+ /* Here you can fine-tune which TrueType CMap table format shall be */
+ /* supported. */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */
+ /* a bytecode interpreter in the TrueType driver. */
+ /* */
+ /* By undefining this, you will only compile the code necessary to load */
+ /* TrueType glyphs without hinting. */
+ /* */
+ /* Do not #undef this macro here, since the build system might */
+ /* define it for certain configurations only. */
+ /* */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */
+ /* EXPERIMENTAL subpixel hinting support into the TrueType driver. This */
+ /* replaces the native TrueType hinting mechanism when anything but */
+ /* FT_RENDER_MODE_MONO is requested. */
+ /* */
+ /* Enabling this causes the TrueType driver to ignore instructions under */
+ /* certain conditions. This is done in accordance with the guide here, */
+ /* with some minor differences: */
+ /* */
+ /* http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+ /* */
+ /* By undefining this, you only compile the code necessary to hint */
+ /* TrueType glyphs with native TT hinting. */
+ /* */
+ /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */
+ /* defined. */
+ /* */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */
+ /* of the TrueType bytecode interpreter is used that doesn't implement */
+ /* any of the patented opcodes and algorithms. The patents related to */
+ /* TrueType hinting have expired worldwide since May 2010; this option */
+ /* is now deprecated. */
+ /* */
+ /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */
+ /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */
+ /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */
+ /* */
+ /* This macro is only useful for a small number of font files (mostly */
+ /* for Asian scripts) that require bytecode interpretation to properly */
+ /* load glyphs. For all other fonts, this produces unpleasant results, */
+ /* thus the unpatented interpreter is never used to load glyphs from */
+ /* TrueType fonts unless one of the following two options is used. */
+ /* */
+ /* - The unpatented interpreter is explicitly activated by the user */
+ /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */
+ /* when opening the FT_Face. */
+ /* */
+ /* - FreeType detects that the FT_Face corresponds to one of the */
+ /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */
+ /* contains a hard-coded list of font names and other matching */
+ /* parameters (see function `tt_face_init' in file */
+ /* `src/truetype/ttobjs.c'). */
+ /* */
+ /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+ /* */
+ /* { */
+ /* FT_Parameter parameter; */
+ /* FT_Open_Args open_args; */
+ /* */
+ /* */
+ /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */
+ /* */
+ /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */
+ /* open_args.pathname = my_font_pathname; */
+ /* open_args.num_params = 1; */
+ /* open_args.params = &parameter; */
+ /* */
+ /* error = FT_Open_Face( library, &open_args, index, &face ); */
+ /* ... */
+ /* } */
+ /* */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */
+ /* bytecode interpreter with a huge switch statement, rather than a call */
+ /* table. This results in smaller and faster code for a number of */
+ /* architectures. */
+ /* */
+ /* Note however that on some compiler/processor combinations, undefining */
+ /* this macro will generate faster, though larger, code. */
+ /* */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */
+ /* TrueType glyph loader to use Apple's definition of how to handle */
+ /* component offsets in composite glyphs. */
+ /* */
+ /* Apple and MS disagree on the default behavior of component offsets */
+ /* in composites. Apple says that they should be scaled by the scaling */
+ /* factors in the transformation matrix (roughly, it's more complex) */
+ /* while MS says they should not. OpenType defines two bits in the */
+ /* composite flags array which can be used to disambiguate, but old */
+ /* fonts will not have them. */
+ /* */
+ /* http://www.microsoft.com/typography/otspec/glyf.htm */
+ /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */
+ /* */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */
+ /* support for Apple's distortable font technology (fvar, gvar, cvar, */
+ /* and avar tables). This has many similarities to Type 1 Multiple */
+ /* Masters support. */
+ /* */
+#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BDF if you want to include support for */
+ /* an embedded `BDF ' table within SFNT-based bitmap formats. */
+ /* */
+#undef TT_CONFIG_OPTION_BDF
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */
+ /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */
+ /* required. */
+ /* */
+#define T1_MAX_DICT_DEPTH 5
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 16
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+ /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 512
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of `t1afm', which is in charge of reading Type 1 AFM */
+ /* files into an existing face. Note that if set, the T1 driver will be */
+ /* unable to produce kerning distances. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of the Multiple Masters font support in the Type 1 */
+ /* driver. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** C F F D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */
+ /* engine gets compiled into FreeType. If defined, it is possible to */
+ /* switch between the two engines using the `hinting-engine' property of */
+ /* the cff driver module. */
+ /* */
+/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */
+ /* support. */
+ /* */
+#define AF_CONFIG_OPTION_CJK
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with Indic script support. */
+ /* */
+#define AF_CONFIG_OPTION_INDIC
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with warp hinting. The idea of the warping */
+ /* code is to slightly scale and shift a glyph within a single dimension */
+ /* so that as much of its segments are aligned (more or less) on the */
+ /* grid. To find out the optimal scaling and shifting value, various */
+ /* parameter combinations are tried and scored. */
+ /* */
+ /* This experimental option is only active if the render mode is */
+ /* FT_RENDER_MODE_LIGHT. */
+ /* */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+ /* */
+
+
+ /*
+ * This macro is obsolete. Support has been removed in FreeType
+ * version 2.5.
+ */
+/* #define FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+ /*
+ * This macro is defined if either unpatented or native TrueType
+ * hinting is requested by the definitions above.
+ */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define TT_USE_BYTECODE_INTERPRETER
+#undef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
new file mode 100644
index 0000000000..b7cd237f40
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/* */
+/* ftstdlib.h */
+/* */
+/* ANSI-specific library and header configuration file (specification */
+/* only). */
+/* */
+/* Copyright 2002-2007, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to group all #includes to the ANSI C library that */
+ /* FreeType normally requires. It also defines macros to rename the */
+ /* standard functions within the FreeType source code. */
+ /* */
+ /* Load a file which defines __FTSTDLIB_H__ before this one to override */
+ /* it. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t ptrdiff_t
+
+
+ /**********************************************************************/
+ /* */
+ /* integer limits */
+ /* */
+ /* UINT_MAX and ULONG_MAX are used to automatically compute the size */
+ /* of `int' and `long' in bytes at compile-time. So far, this works */
+ /* for all platforms the library has been tested on. */
+ /* */
+ /* Note that on the extremely rare platforms that do not provide */
+ /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */
+ /* old Crays where `int' is 36 bits), we do not make any guarantee */
+ /* about the correct behaviour of FT2 with all fonts. */
+ /* */
+ /* In these case, `ftconfig.h' will refuse to compile anyway with a */
+ /* message like `couldn't find 32-bit type' or something similar. */
+ /* */
+ /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT CHAR_BIT
+#define FT_USHORT_MAX USHRT_MAX
+#define FT_INT_MAX INT_MAX
+#define FT_INT_MIN INT_MIN
+#define FT_UINT_MAX UINT_MAX
+#define FT_ULONG_MAX ULONG_MAX
+
+
+ /**********************************************************************/
+ /* */
+ /* character and string processing */
+ /* */
+ /**********************************************************************/
+
+#include "../../../../../../../include/fxcrt/fx_system.h"
+#include <string.h>
+
+#define ft_memchr FXSYS_memchr
+#define ft_memcmp FXSYS_memcmp32
+#define ft_memcpy FXSYS_memcpy32
+#define ft_memmove FXSYS_memmove32
+#define ft_memset FXSYS_memset8
+//#define ft_strcat FXSYS_strcat
+#define ft_strcmp FXSYS_strcmp
+#define ft_strcpy FXSYS_strcpy
+#define ft_strlen FXSYS_strlen
+#define ft_strncmp FXSYS_strncmp
+#define ft_strncpy FXSYS_strncpy
+#define ft_strrchr FXSYS_strrchr
+#define ft_strstr FXSYS_strstr
+
+
+ /**********************************************************************/
+ /* */
+ /* file handling */
+ /* */
+ /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE FXSYS_FILE
+#define ft_fclose FXSYS_fclose
+#define ft_fopen FXSYS_fopen
+#define ft_fread FXSYS_fread
+#define ft_fseek FXSYS_fseek
+#define ft_ftell FXSYS_ftell
+#define ft_sprintf FXSYS_sprintf
+
+
+ /**********************************************************************/
+ /* */
+ /* sorting */
+ /* */
+ /**********************************************************************/
+
+
+//#include <stdlib.h>
+
+#define ft_qsort FXSYS_qsort
+
+
+ /**********************************************************************/
+ /* */
+ /* memory allocation */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_scalloc calloc
+#define ft_sfree free
+#define ft_smalloc malloc
+#define ft_srealloc realloc
+
+
+ /**********************************************************************/
+ /* */
+ /* miscellaneous */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_atol FXSYS_atoi
+#define ft_labs labs
+
+
+ /**********************************************************************/
+ /* */
+ /* execution control */
+ /* */
+ /**********************************************************************/
+
+
+//#include <setjmp.h>
+
+#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */
+ /* jmp_buf is defined as a macro */
+ /* on certain platforms */
+
+#define ft_longjmp longjmp
+#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
+
+
+ /* the following is only used for debugging purposes, i.e., if */
+ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
new file mode 100644
index 0000000000..b6c77153a9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
@@ -0,0 +1,4016 @@
+/***************************************************************************/
+/* */
+/* freetype.h */
+/* */
+/* FreeType high-level API and common types (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FREETYPE_H__
+#define __FREETYPE_H__
+
+
+#ifndef FT_FREETYPE_H
+#error "`ft2build.h' hasn't been included yet!"
+#error "Please always use macros to include FreeType header files."
+#error "Example:"
+#error " #include <ft2build.h>"
+#error " #include FT_FREETYPE_H"
+#endif
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "fttypes.h"
+#include "fterrors.h"
+
+
+FT_BEGIN_HEADER
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* user_allocation */
+ /* */
+ /* <Title> */
+ /* User allocation */
+ /* */
+ /* <Abstract> */
+ /* How client applications should allocate FreeType data structures. */
+ /* */
+ /* <Description> */
+ /* FreeType assumes that structures allocated by the user and passed */
+ /* as arguments are zeroed out except for the actual data. In other */
+ /* words, it is recommended to use `calloc' (or variants of it) */
+ /* instead of `malloc' for allocation. */
+ /* */
+ /*************************************************************************/
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S I C T Y P E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* base_interface */
+ /* */
+ /* <Title> */
+ /* Base Interface */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 base font interface. */
+ /* */
+ /* <Description> */
+ /* This section describes the public high-level API of FreeType~2. */
+ /* */
+ /* <Order> */
+ /* FT_Library */
+ /* FT_Face */
+ /* FT_Size */
+ /* FT_GlyphSlot */
+ /* FT_CharMap */
+ /* FT_Encoding */
+ /* */
+ /* FT_FaceRec */
+ /* */
+ /* FT_FACE_FLAG_SCALABLE */
+ /* FT_FACE_FLAG_FIXED_SIZES */
+ /* FT_FACE_FLAG_FIXED_WIDTH */
+ /* FT_FACE_FLAG_HORIZONTAL */
+ /* FT_FACE_FLAG_VERTICAL */
+ /* FT_FACE_FLAG_SFNT */
+ /* FT_FACE_FLAG_KERNING */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS */
+ /* FT_FACE_FLAG_GLYPH_NAMES */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM */
+ /* FT_FACE_FLAG_FAST_GLYPHS */
+ /* FT_FACE_FLAG_HINTER */
+ /* */
+ /* FT_STYLE_FLAG_BOLD */
+ /* FT_STYLE_FLAG_ITALIC */
+ /* */
+ /* FT_SizeRec */
+ /* FT_Size_Metrics */
+ /* */
+ /* FT_GlyphSlotRec */
+ /* FT_Glyph_Metrics */
+ /* FT_SubGlyph */
+ /* */
+ /* FT_Bitmap_Size */
+ /* */
+ /* FT_Init_FreeType */
+ /* FT_Done_FreeType */
+ /* */
+ /* FT_New_Face */
+ /* FT_Done_Face */
+ /* FT_New_Memory_Face */
+ /* FT_Open_Face */
+ /* FT_Open_Args */
+ /* FT_Parameter */
+ /* FT_Attach_File */
+ /* FT_Attach_Stream */
+ /* */
+ /* FT_Set_Char_Size */
+ /* FT_Set_Pixel_Sizes */
+ /* FT_Request_Size */
+ /* FT_Select_Size */
+ /* FT_Size_Request_Type */
+ /* FT_Size_Request */
+ /* FT_Set_Transform */
+ /* FT_Load_Glyph */
+ /* FT_Get_Char_Index */
+ /* FT_Get_Name_Index */
+ /* FT_Load_Char */
+ /* */
+ /* FT_OPEN_MEMORY */
+ /* FT_OPEN_STREAM */
+ /* FT_OPEN_PATHNAME */
+ /* FT_OPEN_DRIVER */
+ /* FT_OPEN_PARAMS */
+ /* */
+ /* FT_LOAD_DEFAULT */
+ /* FT_LOAD_RENDER */
+ /* FT_LOAD_MONOCHROME */
+ /* FT_LOAD_LINEAR_DESIGN */
+ /* FT_LOAD_NO_SCALE */
+ /* FT_LOAD_NO_HINTING */
+ /* FT_LOAD_NO_BITMAP */
+ /* FT_LOAD_CROP_BITMAP */
+ /* */
+ /* FT_LOAD_VERTICAL_LAYOUT */
+ /* FT_LOAD_IGNORE_TRANSFORM */
+ /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */
+ /* FT_LOAD_FORCE_AUTOHINT */
+ /* FT_LOAD_NO_RECURSE */
+ /* FT_LOAD_PEDANTIC */
+ /* */
+ /* FT_LOAD_TARGET_NORMAL */
+ /* FT_LOAD_TARGET_LIGHT */
+ /* FT_LOAD_TARGET_MONO */
+ /* FT_LOAD_TARGET_LCD */
+ /* FT_LOAD_TARGET_LCD_V */
+ /* */
+ /* FT_Render_Glyph */
+ /* FT_Render_Mode */
+ /* FT_Get_Kerning */
+ /* FT_Kerning_Mode */
+ /* FT_Get_Track_Kerning */
+ /* FT_Get_Glyph_Name */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* FT_CharMapRec */
+ /* FT_Select_Charmap */
+ /* FT_Set_Charmap */
+ /* FT_Get_Charmap_Index */
+ /* */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING */
+ /* FT_FSTYPE_NO_SUBSETTING */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */
+ /* */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Glyph_Metrics */
+ /* */
+ /* <Description> */
+ /* A structure used to model the metrics of a single glyph. The */
+ /* values are expressed in 26.6 fractional pixel format; if the flag */
+ /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */
+ /* are expressed in font units instead. */
+ /* */
+ /* <Fields> */
+ /* width :: */
+ /* The glyph's width. */
+ /* */
+ /* height :: */
+ /* The glyph's height. */
+ /* */
+ /* horiBearingX :: */
+ /* Left side bearing for horizontal layout. */
+ /* */
+ /* horiBearingY :: */
+ /* Top side bearing for horizontal layout. */
+ /* */
+ /* horiAdvance :: */
+ /* Advance width for horizontal layout. */
+ /* */
+ /* vertBearingX :: */
+ /* Left side bearing for vertical layout. */
+ /* */
+ /* vertBearingY :: */
+ /* Top side bearing for vertical layout. Larger positive values */
+ /* mean further below the vertical glyph origin. */
+ /* */
+ /* vertAdvance :: */
+ /* Advance height for vertical layout. Positive values mean the */
+ /* glyph has a positive advance downward. */
+ /* */
+ /* <Note> */
+ /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */
+ /* dimensions of the hinted glyph (in case hinting is applicable). */
+ /* */
+ /* Stroking a glyph with an outside border does not increase */
+ /* `horiAdvance' or `vertAdvance'; you have to manually adjust these */
+ /* values to account for the added width and height. */
+ /* */
+ typedef struct FT_Glyph_Metrics_
+ {
+ FT_Pos width;
+ FT_Pos height;
+
+ FT_Pos horiBearingX;
+ FT_Pos horiBearingY;
+ FT_Pos horiAdvance;
+
+ FT_Pos vertBearingX;
+ FT_Pos vertBearingY;
+ FT_Pos vertAdvance;
+
+ } FT_Glyph_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap_Size */
+ /* */
+ /* <Description> */
+ /* This structure models the metrics of a bitmap strike (i.e., a set */
+ /* of glyphs for a given point size and resolution) in a bitmap font. */
+ /* It is used for the `available_sizes' field of @FT_Face. */
+ /* */
+ /* <Fields> */
+ /* height :: The vertical distance, in pixels, between two */
+ /* consecutive baselines. It is always positive. */
+ /* */
+ /* width :: The average width, in pixels, of all glyphs in the */
+ /* strike. */
+ /* */
+ /* size :: The nominal size of the strike in 26.6 fractional */
+ /* points. This field is not very useful. */
+ /* */
+ /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* <Note> */
+ /* Windows FNT: */
+ /* The nominal size given in a FNT font is not reliable. Thus when */
+ /* the driver finds it incorrect, it sets `size' to some calculated */
+ /* values and sets `x_ppem' and `y_ppem' to the pixel width and */
+ /* height given in the font, respectively. */
+ /* */
+ /* TrueType embedded bitmaps: */
+ /* `size', `width', and `height' values are not contained in the */
+ /* bitmap strike itself. They are computed from the global font */
+ /* parameters. */
+ /* */
+ typedef struct FT_Bitmap_Size_
+ {
+ FT_Short height;
+ FT_Short width;
+
+ FT_Pos size;
+
+ FT_Pos x_ppem;
+ FT_Pos y_ppem;
+
+ } FT_Bitmap_Size;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Library */
+ /* */
+ /* <Description> */
+ /* A handle to a FreeType library instance. Each `library' is */
+ /* completely independent from the others; it is the `root' of a set */
+ /* of objects like fonts, faces, sizes, etc. */
+ /* */
+ /* It also embeds a memory manager (see @FT_Memory), as well as a */
+ /* scan-line converter object (see @FT_Raster). */
+ /* */
+ /* In multi-threaded applications, make sure that the same FT_Library */
+ /* object or any of its children doesn't get accessed in parallel. */
+ /* */
+ /* <Note> */
+ /* Library objects are normally created by @FT_Init_FreeType, and */
+ /* destroyed with @FT_Done_FreeType. If you need reference-counting */
+ /* (cf. @FT_Reference_Library), use @FT_New_Library and */
+ /* @FT_Done_Library. */
+ /* */
+ typedef struct FT_LibraryRec_ *FT_Library;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Module */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType module object. Each module can be a */
+ /* font driver, a renderer, or anything else that provides services */
+ /* to the formers. */
+ /* */
+ typedef struct FT_ModuleRec_* FT_Module;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType font driver object. Each font driver */
+ /* is a special module capable of creating faces from font files. */
+ /* */
+ typedef struct FT_DriverRec_* FT_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Renderer */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType renderer. A renderer is a special */
+ /* module in charge of converting a glyph image to a bitmap, when */
+ /* necessary. Each renderer supports a given glyph image format, and */
+ /* one or more target surface depths. */
+ /* */
+ typedef struct FT_RendererRec_* FT_Renderer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a given typographic face object. A face object models */
+ /* a given typeface, in a given style. */
+ /* */
+ /* <Note> */
+ /* Each face object also owns a single @FT_GlyphSlot object, as well */
+ /* as one or more @FT_Size objects. */
+ /* */
+ /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */
+ /* a given filepathname or a custom input stream. */
+ /* */
+ /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */
+ /* */
+ /* <Also> */
+ /* See @FT_FaceRec for the publicly accessible fields of a given face */
+ /* object. */
+ /* */
+ typedef struct FT_FaceRec_* FT_Face;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a face scaled to a given */
+ /* character size. */
+ /* */
+ /* <Note> */
+ /* Each @FT_Face has an _active_ @FT_Size object that is used by */
+ /* functions like @FT_Load_Glyph to determine the scaling */
+ /* transformation which is used to load and hint glyphs and metrics. */
+ /* */
+ /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */
+ /* @FT_Request_Size or even @FT_Select_Size to change the content */
+ /* (i.e., the scaling values) of the active @FT_Size. */
+ /* */
+ /* You can use @FT_New_Size to create additional size objects for a */
+ /* given @FT_Face, but they won't be used by other functions until */
+ /* you activate it through @FT_Activate_Size. Only one size can be */
+ /* activated at any given time per face. */
+ /* */
+ /* <Also> */
+ /* See @FT_SizeRec for the publicly accessible fields of a given size */
+ /* object. */
+ /* */
+ typedef struct FT_SizeRec_* FT_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a given `glyph slot'. A slot is a container where it */
+ /* is possible to load any of the glyphs contained in its parent */
+ /* face. */
+ /* */
+ /* In other words, each time you call @FT_Load_Glyph or */
+ /* @FT_Load_Char, the slot's content is erased by the new glyph data, */
+ /* i.e., the glyph's metrics, its image (bitmap or outline), and */
+ /* other control information. */
+ /* */
+ /* <Also> */
+ /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */
+ /* */
+ typedef struct FT_GlyphSlotRec_* FT_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a given character map. A charmap is used to translate */
+ /* character codes in a given encoding into glyph indexes for its */
+ /* parent's face. Some font formats may provide several charmaps per */
+ /* font. */
+ /* */
+ /* Each face object owns zero or more charmaps, but only one of them */
+ /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */
+ /* */
+ /* The list of available charmaps in a face is available through the */
+ /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */
+ /* */
+ /* The currently active charmap is available as `face->charmap'. */
+ /* You should call @FT_Set_Charmap to change it. */
+ /* */
+ /* <Note> */
+ /* When a new face is created (either through @FT_New_Face or */
+ /* @FT_Open_Face), the library looks for a Unicode charmap within */
+ /* the list and automatically activates it. */
+ /* */
+ /* <Also> */
+ /* See @FT_CharMapRec for the publicly accessible fields of a given */
+ /* character map. */
+ /* */
+ typedef struct FT_CharMapRec_* FT_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_ENC_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags into an unsigned long. It is */
+ /* used to define `encoding' identifiers (see @FT_Encoding). */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_ENC_TAG( value, a, b, c, d ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d ) \
+ value = ( ( (FT_UInt32)(a) << 24 ) | \
+ ( (FT_UInt32)(b) << 16 ) | \
+ ( (FT_UInt32)(c) << 8 ) | \
+ (FT_UInt32)(d) )
+
+#endif /* FT_ENC_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Encoding */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify character sets supported by */
+ /* charmaps. Used in the @FT_Select_Charmap API function. */
+ /* */
+ /* <Note> */
+ /* Despite the name, this enumeration lists specific character */
+ /* repertories (i.e., charsets), and not text encoding methods (e.g., */
+ /* UTF-8, UTF-16, etc.). */
+ /* */
+ /* Other encodings might be defined in the future. */
+ /* */
+ /* <Values> */
+ /* FT_ENCODING_NONE :: */
+ /* The encoding value~0 is reserved. */
+ /* */
+ /* FT_ENCODING_UNICODE :: */
+ /* Corresponds to the Unicode character set. This value covers */
+ /* all versions of the Unicode repertoire, including ASCII and */
+ /* Latin-1. Most fonts include a Unicode charmap, but not all */
+ /* of them. */
+ /* */
+ /* For example, if you want to access Unicode value U+1F028 (and */
+ /* the font contains it), use value 0x1F028 as the input value for */
+ /* @FT_Get_Char_Index. */
+ /* */
+ /* FT_ENCODING_MS_SYMBOL :: */
+ /* Corresponds to the Microsoft Symbol encoding, used to encode */
+ /* mathematical symbols in the 32..255 character code range. For */
+ /* more information, see `http://www.ceviz.net/symbol.htm'. */
+ /* */
+ /* FT_ENCODING_SJIS :: */
+ /* Corresponds to Japanese SJIS encoding. More info at */
+ /* at `http://langsupport.japanreference.com/encoding.shtml'. */
+ /* See note on multi-byte encodings below. */
+ /* */
+ /* FT_ENCODING_GB2312 :: */
+ /* Corresponds to an encoding system for Simplified Chinese as used */
+ /* used in mainland China. */
+ /* */
+ /* FT_ENCODING_BIG5 :: */
+ /* Corresponds to an encoding system for Traditional Chinese as */
+ /* used in Taiwan and Hong Kong. */
+ /* */
+ /* FT_ENCODING_WANSUNG :: */
+ /* Corresponds to the Korean encoding system known as Wansung. */
+ /* For more information see */
+ /* `http://www.microsoft.com/typography/unicode/949.txt'. */
+ /* */
+ /* FT_ENCODING_JOHAB :: */
+ /* The Korean standard character set (KS~C 5601-1992), which */
+ /* corresponds to MS Windows code page 1361. This character set */
+ /* includes all possible Hangeul character combinations. */
+ /* */
+ /* FT_ENCODING_ADOBE_LATIN_1 :: */
+ /* Corresponds to a Latin-1 encoding as defined in a Type~1 */
+ /* PostScript font. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_STANDARD :: */
+ /* Corresponds to the Adobe Standard encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_EXPERT :: */
+ /* Corresponds to the Adobe Expert encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_CUSTOM :: */
+ /* Corresponds to a custom encoding, as found in Type~1, CFF, and */
+ /* OpenType/CFF fonts. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_APPLE_ROMAN :: */
+ /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */
+ /* and OpenType fonts contain a charmap for this encoding, since */
+ /* older versions of Mac OS are able to use it. */
+ /* */
+ /* FT_ENCODING_OLD_LATIN_2 :: */
+ /* This value is deprecated and was never used nor reported by */
+ /* FreeType. Don't use or test for it. */
+ /* */
+ /* FT_ENCODING_MS_SJIS :: */
+ /* Same as FT_ENCODING_SJIS. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_GB2312 :: */
+ /* Same as FT_ENCODING_GB2312. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_BIG5 :: */
+ /* Same as FT_ENCODING_BIG5. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_WANSUNG :: */
+ /* Same as FT_ENCODING_WANSUNG. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_JOHAB :: */
+ /* Same as FT_ENCODING_JOHAB. Deprecated. */
+ /* */
+ /* <Note> */
+ /* By default, FreeType automatically synthesizes a Unicode charmap */
+ /* for PostScript fonts, using their glyph names dictionaries. */
+ /* However, it also reports the encodings defined explicitly in the */
+ /* font file, for the cases when they are needed, with the Adobe */
+ /* values as well. */
+ /* */
+ /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */
+ /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */
+ /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */
+ /* which encoding is really present. If, for example, the */
+ /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */
+ /* the font is encoded in KOI8-R. */
+ /* */
+ /* FT_ENCODING_NONE is always set (with a single exception) by the */
+ /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */
+ /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */
+ /* which encoding is really present. For example, */
+ /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */
+ /* Russian). */
+ /* */
+ /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
+ /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */
+ /* FT_ENCODING_APPLE_ROMAN). */
+ /* */
+ /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */
+ /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */
+ /* be needed to be able to distinguish Apple encoding variants. See */
+ /* */
+ /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */
+ /* */
+ /* to get an idea how to do that. Basically, if the language ID */
+ /* is~0, don't use it, otherwise subtract 1 from the language ID. */
+ /* Then examine `encoding_id'. If, for example, `encoding_id' is */
+ /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */
+ /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */
+ /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */
+ /* variant the Arabic encoding. */
+ /* */
+ typedef enum FT_Encoding_
+ {
+ FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
+
+ FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
+ FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),
+
+ FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
+ FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
+ FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
+ FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
+ FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),
+
+ /* for backwards compatibility */
+ FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
+ FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
+ FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
+ FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
+ FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,
+
+ FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),
+
+ FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
+
+ FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
+
+ } FT_Encoding;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_encoding_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated; use the corresponding @FT_Encoding */
+ /* values instead. */
+ /* */
+#define ft_encoding_none FT_ENCODING_NONE
+#define ft_encoding_unicode FT_ENCODING_UNICODE
+#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL
+#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1
+#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2
+#define ft_encoding_sjis FT_ENCODING_SJIS
+#define ft_encoding_gb2312 FT_ENCODING_GB2312
+#define ft_encoding_big5 FT_ENCODING_BIG5
+#define ft_encoding_wansung FT_ENCODING_WANSUNG
+#define ft_encoding_johab FT_ENCODING_JOHAB
+
+#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD
+#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT
+#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM
+#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_CharMapRec */
+ /* */
+ /* <Description> */
+ /* The base charmap structure. */
+ /* */
+ /* <Fields> */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* encoding :: An @FT_Encoding tag identifying the charmap. Use */
+ /* this with @FT_Select_Charmap. */
+ /* */
+ /* platform_id :: An ID number describing the platform for the */
+ /* following encoding ID. This comes directly from */
+ /* the TrueType specification and should be emulated */
+ /* for other formats. */
+ /* */
+ /* encoding_id :: A platform specific encoding number. This also */
+ /* comes from the TrueType specification and should be */
+ /* emulated similarly. */
+ /* */
+ typedef struct FT_CharMapRec_
+ {
+ FT_Face face;
+ FT_Encoding encoding;
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+
+ } FT_CharMapRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S E O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Face_InternalRec' structure, used to */
+ /* model private data of a given @FT_Face object. */
+ /* */
+ /* This structure might change between releases of FreeType~2 and is */
+ /* not generally available to client applications. */
+ /* */
+ typedef struct FT_Face_InternalRec_* FT_Face_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_FaceRec */
+ /* */
+ /* <Description> */
+ /* FreeType root face class structure. A face object models a */
+ /* typeface in a font file. */
+ /* */
+ /* <Fields> */
+ /* num_faces :: The number of faces in the font file. Some */
+ /* font formats can have multiple faces in */
+ /* a font file. */
+ /* */
+ /* face_index :: The index of the face in the font file. It */
+ /* is set to~0 if there is only one face in */
+ /* the font file. */
+ /* */
+ /* face_flags :: A set of bit flags that give important */
+ /* information about the face; see */
+ /* @FT_FACE_FLAG_XXX for the details. */
+ /* */
+ /* style_flags :: A set of bit flags indicating the style of */
+ /* the face; see @FT_STYLE_FLAG_XXX for the */
+ /* details. */
+ /* */
+ /* num_glyphs :: The number of glyphs in the face. If the */
+ /* face is scalable and has sbits (see */
+ /* `num_fixed_sizes'), it is set to the number */
+ /* of outline glyphs. */
+ /* */
+ /* For CID-keyed fonts, this value gives the */
+ /* highest CID used in the font. */
+ /* */
+ /* family_name :: The face's family name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's family (like `Times New */
+ /* Roman', `Bodoni', `Garamond', etc). This */
+ /* is a least common denominator used to list */
+ /* fonts. Some formats (TrueType & OpenType) */
+ /* provide localized and Unicode versions of */
+ /* this string. Applications should use the */
+ /* format specific interface to access them. */
+ /* Can be NULL (e.g., in fonts embedded in a */
+ /* PDF file). */
+ /* */
+ /* style_name :: The face's style name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's style (like `Italic', */
+ /* `Bold', `Condensed', etc). Not all font */
+ /* formats provide a style name, so this field */
+ /* is optional, and can be set to NULL. As */
+ /* for `family_name', some formats provide */
+ /* localized and Unicode versions of this */
+ /* string. Applications should use the format */
+ /* specific interface to access them. */
+ /* */
+ /* num_fixed_sizes :: The number of bitmap strikes in the face. */
+ /* Even if the face is scalable, there might */
+ /* still be bitmap strikes, which are called */
+ /* `sbits' in that case. */
+ /* */
+ /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */
+ /* strikes in the face. It is set to NULL if */
+ /* there is no bitmap strike. */
+ /* */
+ /* num_charmaps :: The number of charmaps in the face. */
+ /* */
+ /* charmaps :: An array of the charmaps of the face. */
+ /* */
+ /* generic :: A field reserved for client uses. See the */
+ /* @FT_Generic type description. */
+ /* */
+ /* bbox :: The font bounding box. Coordinates are */
+ /* expressed in font units (see */
+ /* `units_per_EM'). The box is large enough */
+ /* to contain any glyph from the font. Thus, */
+ /* `bbox.yMax' can be seen as the `maximum */
+ /* ascender', and `bbox.yMin' as the `minimum */
+ /* descender'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* Note that the bounding box might be off by */
+ /* (at least) one pixel for hinted fonts. See */
+ /* @FT_Size_Metrics for further discussion. */
+ /* */
+ /* units_per_EM :: The number of font units per EM square for */
+ /* this face. This is typically 2048 for */
+ /* TrueType fonts, and 1000 for Type~1 fonts. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* ascender :: The typographic ascender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMax'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* descender :: The typographic descender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMin'. Note that this field is */
+ /* usually negative. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* height :: This value is the vertical distance */
+ /* between two consecutive baselines, */
+ /* expressed in font units. It is always */
+ /* positive. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* If you want the global glyph height, use */
+ /* `ascender - descender'. */
+ /* */
+ /* max_advance_width :: The maximum advance width, in font units, */
+ /* for all glyphs in this face. This can be */
+ /* used to make word wrapping computations */
+ /* faster. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* max_advance_height :: The maximum advance height, in font units, */
+ /* for all glyphs in this face. This is only */
+ /* relevant for vertical layouts, and is set */
+ /* to `height' for fonts that do not provide */
+ /* vertical metrics. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* underline_position :: The position, in font units, of the */
+ /* underline line for this face. It is the */
+ /* center of the underlining stem. Only */
+ /* relevant for scalable formats. */
+ /* */
+ /* underline_thickness :: The thickness, in font units, of the */
+ /* underline for this face. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* glyph :: The face's associated glyph slot(s). */
+ /* */
+ /* size :: The current active size for this face. */
+ /* */
+ /* charmap :: The current active charmap for this face. */
+ /* */
+ /* <Note> */
+ /* Fields may be changed after a call to @FT_Attach_File or */
+ /* @FT_Attach_Stream. */
+ /* */
+ typedef struct FT_FaceRec_
+ {
+ FT_Long num_faces;
+ FT_Long face_index;
+
+ FT_Long face_flags;
+ FT_Long style_flags;
+
+ FT_Long num_glyphs;
+
+ FT_String* family_name;
+ FT_String* style_name;
+
+ FT_Int num_fixed_sizes;
+ FT_Bitmap_Size* available_sizes;
+
+ FT_Int num_charmaps;
+ FT_CharMap* charmaps;
+
+#ifdef _FX_MANAGED_CODE_
+#define generic generic_data
+#endif
+
+ FT_Generic generic;
+
+ /*# The following member variables (down to `underline_thickness') */
+ /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */
+ /*# for bitmap fonts. */
+ FT_BBox bbox;
+
+ FT_UShort units_per_EM;
+ FT_Short ascender;
+ FT_Short descender;
+ FT_Short height;
+
+ FT_Short max_advance_width;
+ FT_Short max_advance_height;
+
+ FT_Short underline_position;
+ FT_Short underline_thickness;
+
+ FT_GlyphSlot glyph;
+ FT_Size size;
+ FT_CharMap charmap;
+
+ /*@private begin */
+
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_Stream stream;
+
+ FT_ListRec sizes_list;
+
+ FT_Generic autohint; /* face-specific auto-hinter data */
+ void* extensions; /* unused */
+
+ FT_Face_Internal internal;
+
+ /*@private end */
+
+ } FT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FACE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `face_flags' field of the */
+ /* @FT_FaceRec structure. They inform client applications of */
+ /* properties of the corresponding face. */
+ /* */
+ /* <Values> */
+ /* FT_FACE_FLAG_SCALABLE :: */
+ /* Indicates that the face contains outline glyphs. This doesn't */
+ /* prevent bitmap strikes, i.e., a face can have both this and */
+ /* and @FT_FACE_FLAG_FIXED_SIZES set. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_SIZES :: */
+ /* Indicates that the face contains bitmap strikes. See also the */
+ /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_WIDTH :: */
+ /* Indicates that the face contains fixed-width characters (like */
+ /* Courier, Lucido, MonoType, etc.). */
+ /* */
+ /* FT_FACE_FLAG_SFNT :: */
+ /* Indicates that the face uses the `sfnt' storage scheme. For */
+ /* now, this means TrueType and OpenType. */
+ /* */
+ /* FT_FACE_FLAG_HORIZONTAL :: */
+ /* Indicates that the face contains horizontal glyph metrics. This */
+ /* should be set for all common formats. */
+ /* */
+ /* FT_FACE_FLAG_VERTICAL :: */
+ /* Indicates that the face contains vertical glyph metrics. This */
+ /* is only available in some formats, not all of them. */
+ /* */
+ /* FT_FACE_FLAG_KERNING :: */
+ /* Indicates that the face contains kerning information. If set, */
+ /* the kerning distance can be retrieved through the function */
+ /* @FT_Get_Kerning. Otherwise the function always return the */
+ /* vector (0,0). Note that FreeType doesn't handle kerning data */
+ /* from the `GPOS' table (as present in some OpenType fonts). */
+ /* */
+ /* FT_FACE_FLAG_FAST_GLYPHS :: */
+ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */
+ /* */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */
+ /* Indicates that the font contains multiple masters and is capable */
+ /* of interpolating between them. See the multiple-masters */
+ /* specific API for details. */
+ /* */
+ /* FT_FACE_FLAG_GLYPH_NAMES :: */
+ /* Indicates that the font contains glyph names that can be */
+ /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */
+ /* fonts contain broken glyph name tables. Use the function */
+ /* @FT_Has_PS_Glyph_Names when needed. */
+ /* */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM :: */
+ /* Used internally by FreeType to indicate that a face's stream was */
+ /* provided by the client application and should not be destroyed */
+ /* when @FT_Done_Face is called. Don't read or test this flag. */
+ /* */
+ /* FT_FACE_FLAG_HINTER :: */
+ /* Set if the font driver has a hinting machine of its own. For */
+ /* example, with TrueType fonts, it makes sense to use data from */
+ /* the SFNT `gasp' table only if the native TrueType hinting engine */
+ /* (with the bytecode interpreter) is available and active. */
+ /* */
+ /* FT_FACE_FLAG_CID_KEYED :: */
+ /* Set if the font is CID-keyed. In that case, the font is not */
+ /* accessed by glyph indices but by CID values. For subsetted */
+ /* CID-keyed fonts this has the consequence that not all index */
+ /* values are a valid argument to FT_Load_Glyph. Only the CID */
+ /* values for which corresponding glyphs in the subsetted font */
+ /* exist make FT_Load_Glyph return successfully; in all other cases */
+ /* you get an `FT_Err_Invalid_Argument' error. */
+ /* */
+ /* Note that CID-keyed fonts which are in an SFNT wrapper don't */
+ /* have this flag set since the glyphs are accessed in the normal */
+ /* way (using contiguous indices); the `CID-ness' isn't visible to */
+ /* the application. */
+ /* */
+ /* FT_FACE_FLAG_TRICKY :: */
+ /* Set if the font is `tricky', this is, it always needs the */
+ /* font format's native hinting engine to get a reasonable result. */
+ /* A typical example is the Chinese font `mingli.ttf' which uses */
+ /* TrueType bytecode instructions to move and scale all of its */
+ /* subglyphs. */
+ /* */
+ /* It is not possible to autohint such fonts using */
+ /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */
+ /* @FT_LOAD_NO_HINTING. You have to set both @FT_LOAD_NO_HINTING */
+ /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
+ /* probably never want this except for demonstration purposes. */
+ /* */
+ /* Currently, there are about a dozen TrueType fonts in the list of */
+ /* tricky fonts; they are hard-coded in file `ttobjs.c'. */
+ /* */
+#define FT_FACE_FLAG_SCALABLE ( 1L << 0 )
+#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 )
+#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 )
+#define FT_FACE_FLAG_SFNT ( 1L << 3 )
+#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 )
+#define FT_FACE_FLAG_VERTICAL ( 1L << 5 )
+#define FT_FACE_FLAG_KERNING ( 1L << 6 )
+#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 )
+#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 )
+#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 )
+#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER ( 1L << 11 )
+#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 )
+#define FT_FACE_FLAG_TRICKY ( 1L << 13 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_HORIZONTAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains
+ * horizontal metrics (this is true for all font formats though).
+ *
+ * @also:
+ * @FT_HAS_VERTICAL can be used to check for vertical metrics.
+ *
+ */
+#define FT_HAS_HORIZONTAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_VERTICAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains real
+ * vertical metrics (and not only synthesized ones).
+ *
+ */
+#define FT_HAS_VERTICAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_KERNING( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains kerning
+ * data that can be accessed with @FT_Get_Kerning.
+ *
+ */
+#define FT_HAS_KERNING( face ) \
+ ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SCALABLE( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a scalable
+ * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
+ * and PFR font formats.
+ *
+ */
+#define FT_IS_SCALABLE( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SFNT( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font
+ * whose format is based on the SFNT storage scheme. This usually
+ * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
+ * bitmap fonts.
+ *
+ * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
+ * @FT_TRUETYPE_TABLES_H are available.
+ *
+ */
+#define FT_IS_SFNT( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_FIXED_WIDTH( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font face
+ * that contains fixed-width (or `monospace', `fixed-pitch', etc.)
+ * glyphs.
+ *
+ */
+#define FT_IS_FIXED_WIDTH( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FIXED_SIZES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * embedded bitmaps. See the `available_sizes' field of the
+ * @FT_FaceRec structure.
+ *
+ */
+#define FT_HAS_FIXED_SIZES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FAST_GLYPHS( face )
+ *
+ * @description:
+ * Deprecated.
+ *
+ */
+#define FT_HAS_FAST_GLYPHS( face ) 0
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_GLYPH_NAMES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some glyph
+ * names that can be accessed through @FT_Get_Glyph_Name.
+ *
+ */
+#define FT_HAS_GLYPH_NAMES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_MULTIPLE_MASTERS( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H
+ * are then available to choose the exact design you want.
+ *
+ */
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+ ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_CID_KEYED( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a CID-keyed
+ * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more
+ * details.
+ *
+ * If this macro is true, all functions defined in @FT_CID_H are
+ * available.
+ *
+ */
+#define FT_IS_CID_KEYED( face ) \
+ ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_TRICKY( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face represents a `tricky' font.
+ * See the discussion of @FT_FACE_FLAG_TRICKY for more details.
+ *
+ */
+#define FT_IS_TRICKY( face ) \
+ ( face->face_flags & FT_FACE_FLAG_TRICKY )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_STYLE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-flags used to indicate the style of a given face. */
+ /* These are used in the `style_flags' field of @FT_FaceRec. */
+ /* */
+ /* <Values> */
+ /* FT_STYLE_FLAG_ITALIC :: */
+ /* Indicates that a given face style is italic or oblique. */
+ /* */
+ /* FT_STYLE_FLAG_BOLD :: */
+ /* Indicates that a given face is bold. */
+ /* */
+ /* <Note> */
+ /* The style information as provided by FreeType is very basic. More */
+ /* details are beyond the scope and should be done on a higher level */
+ /* (for example, by analyzing various fields of the `OS/2' table in */
+ /* SFNT based fonts). */
+ /* */
+#define FT_STYLE_FLAG_ITALIC ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD ( 1 << 1 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Size_InternalRec' structure, used to */
+ /* model private data of a given @FT_Size object. */
+ /* */
+ typedef struct FT_Size_InternalRec_* FT_Size_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Metrics */
+ /* */
+ /* <Description> */
+ /* The size metrics structure gives the metrics of a size object. */
+ /* */
+ /* <Fields> */
+ /* x_ppem :: The width of the scaled EM square in pixels, hence */
+ /* the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal width'. */
+ /* */
+ /* y_ppem :: The height of the scaled EM square in pixels, */
+ /* hence the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal height'. */
+ /* */
+ /* x_scale :: A 16.16 fractional scaling value used to convert */
+ /* horizontal metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* y_scale :: A 16.16 fractional scaling value used to convert */
+ /* vertical metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* ascender :: The ascender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* descender :: The descender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* height :: The height in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* max_advance :: The maximum advance width in 26.6 fractional */
+ /* pixels. See @FT_FaceRec for the details. */
+ /* */
+ /* <Note> */
+ /* The scaling values, if relevant, are determined first during a */
+ /* size changing operation. The remaining fields are then set by the */
+ /* driver. For scalable formats, they are usually set to scaled */
+ /* values of the corresponding fields in @FT_FaceRec. */
+ /* */
+ /* Note that due to glyph hinting, these values might not be exact */
+ /* for certain fonts. Thus they must be treated as unreliable */
+ /* with an error margin of at least one pixel! */
+ /* */
+ /* Indeed, the only way to get the exact metrics is to render _all_ */
+ /* glyphs. As this would be a definite performance hit, it is up to */
+ /* client applications to perform such computations. */
+ /* */
+ /* The FT_Size_Metrics structure is valid for bitmap fonts also. */
+ /* */
+ typedef struct FT_Size_Metrics_
+ {
+ FT_UShort x_ppem; /* horizontal pixels per EM */
+ FT_UShort y_ppem; /* vertical pixels per EM */
+
+ FT_Fixed x_scale; /* scaling values used to convert font */
+ FT_Fixed y_scale; /* units to 26.6 fractional pixels */
+
+ FT_Pos ascender; /* ascender in 26.6 frac. pixels */
+ FT_Pos descender; /* descender in 26.6 frac. pixels */
+ FT_Pos height; /* text height in 26.6 frac. pixels */
+ FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */
+
+ } FT_Size_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SizeRec */
+ /* */
+ /* <Description> */
+ /* FreeType root size class structure. A size object models a face */
+ /* object at a given size. */
+ /* */
+ /* <Fields> */
+ /* face :: Handle to the parent face object. */
+ /* */
+ /* generic :: A typeless pointer, which is unused by the FreeType */
+ /* library or any of its drivers. It can be used by */
+ /* client applications to link their own data to each size */
+ /* object. */
+ /* */
+ /* metrics :: Metrics for this size object. This field is read-only. */
+ /* */
+ typedef struct FT_SizeRec_
+ {
+ FT_Face face; /* parent face object */
+ FT_Generic generic; /* generic pointer for client uses */
+ FT_Size_Metrics metrics; /* size metrics */
+ FT_Size_Internal internal;
+
+ } FT_SizeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SubGlyph */
+ /* */
+ /* <Description> */
+ /* The subglyph structure is an internal object used to describe */
+ /* subglyphs (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The subglyph implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ /* You can however retrieve subglyph information with */
+ /* @FT_Get_SubGlyph_Info. */
+ /* */
+ typedef struct FT_SubGlyphRec_* FT_SubGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Slot_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */
+ /* model private data of a given @FT_GlyphSlot object. */
+ /* */
+ typedef struct FT_Slot_InternalRec_* FT_Slot_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphSlotRec */
+ /* */
+ /* <Description> */
+ /* FreeType root glyph slot class structure. A glyph slot is a */
+ /* container where individual glyphs can be loaded, be they in */
+ /* outline or bitmap format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library instance */
+ /* this slot belongs to. */
+ /* */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* next :: In some cases (like some font tools), several */
+ /* glyph slots per face object can be a good */
+ /* thing. As this is rare, the glyph slots are */
+ /* listed through a direct, single-linked list */
+ /* using its `next' field. */
+ /* */
+ /* generic :: A typeless pointer which is unused by the */
+ /* FreeType library or any of its drivers. It */
+ /* can be used by client applications to link */
+ /* their own data to each glyph slot object. */
+ /* */
+ /* metrics :: The metrics of the last loaded glyph in the */
+ /* slot. The returned values depend on the last */
+ /* load flags (see the @FT_Load_Glyph API */
+ /* function) and can be expressed either in 26.6 */
+ /* fractional pixels or font units. */
+ /* */
+ /* Note that even when the glyph image is */
+ /* transformed, the metrics are not. */
+ /* */
+ /* linearHoriAdvance :: The advance width of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* linearVertAdvance :: The advance height of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* advance :: This shorthand is, depending on */
+ /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */
+ /* advance width for the glyph (in 26.6 */
+ /* fractional pixel format). As specified with */
+ /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */
+ /* `horiAdvance' or the `vertAdvance' value of */
+ /* `metrics' field. */
+ /* */
+ /* format :: This field indicates the format of the image */
+ /* contained in the glyph slot. Typically */
+ /* @FT_GLYPH_FORMAT_BITMAP, */
+ /* @FT_GLYPH_FORMAT_OUTLINE, or */
+ /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */
+ /* possible. */
+ /* */
+ /* bitmap :: This field is used as a bitmap descriptor */
+ /* when the slot format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. Note that the */
+ /* address and content of the bitmap buffer can */
+ /* change between calls of @FT_Load_Glyph and a */
+ /* few other functions. */
+ /* */
+ /* bitmap_left :: This is the bitmap's left bearing expressed */
+ /* in integer pixels. Of course, this is only */
+ /* valid if the format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* bitmap_top :: This is the bitmap's top bearing expressed in */
+ /* integer pixels. Remember that this is the */
+ /* distance from the baseline to the top-most */
+ /* glyph scanline, upwards y~coordinates being */
+ /* *positive*. */
+ /* */
+ /* outline :: The outline descriptor for the current glyph */
+ /* image if its format is */
+ /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */
+ /* loaded, `outline' can be transformed, */
+ /* distorted, embolded, etc. However, it must */
+ /* not be freed. */
+ /* */
+ /* num_subglyphs :: The number of subglyphs in a composite glyph. */
+ /* This field is only valid for the composite */
+ /* glyph format that should normally only be */
+ /* loaded with the @FT_LOAD_NO_RECURSE flag. */
+ /* For now this is internal to FreeType. */
+ /* */
+ /* subglyphs :: An array of subglyph descriptors for */
+ /* composite glyphs. There are `num_subglyphs' */
+ /* elements in there. Currently internal to */
+ /* FreeType. */
+ /* */
+ /* control_data :: Certain font drivers can also return the */
+ /* control data for a given glyph image (e.g. */
+ /* TrueType bytecode, Type~1 charstrings, etc.). */
+ /* This field is a pointer to such data. */
+ /* */
+ /* control_len :: This is the length in bytes of the control */
+ /* data. */
+ /* */
+ /* other :: Really wicked formats can use this pointer to */
+ /* present their own glyph image to client */
+ /* applications. Note that the application */
+ /* needs to know about the image format. */
+ /* */
+ /* lsb_delta :: The difference between hinted and unhinted */
+ /* left side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* rsb_delta :: The difference between hinted and unhinted */
+ /* right side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* <Note> */
+ /* If @FT_Load_Glyph is called with default flags (see */
+ /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */
+ /* its native format (e.g., an outline glyph for TrueType and Type~1 */
+ /* formats). */
+ /* */
+ /* This image can later be converted into a bitmap by calling */
+ /* @FT_Render_Glyph. This function finds the current renderer for */
+ /* the native image's format, then invokes it. */
+ /* */
+ /* The renderer is in charge of transforming the native image through */
+ /* the slot's face transformation fields, then converting it into a */
+ /* bitmap that is returned in `slot->bitmap'. */
+ /* */
+ /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
+ /* to specify the position of the bitmap relative to the current pen */
+ /* position (e.g., coordinates (0,0) on the baseline). Of course, */
+ /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* <Note> */
+ /* Here a small pseudo code fragment which shows how to use */
+ /* `lsb_delta' and `rsb_delta': */
+ /* */
+ /* { */
+ /* FT_Pos origin_x = 0; */
+ /* FT_Pos prev_rsb_delta = 0; */
+ /* */
+ /* */
+ /* for all glyphs do */
+ /* <compute kern between current and previous glyph and add it to */
+ /* `origin_x'> */
+ /* */
+ /* <load glyph with `FT_Load_Glyph'> */
+ /* */
+ /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */
+ /* origin_x -= 64; */
+ /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */
+ /* origin_x += 64; */
+ /* */
+ /* prev_rsb_delta = face->glyph->rsb_delta; */
+ /* */
+ /* <save glyph image, or render glyph, or ...> */
+ /* */
+ /* origin_x += face->glyph->advance.x; */
+ /* endfor */
+ /* } */
+ /* */
+ typedef struct FT_GlyphSlotRec_
+ {
+ FT_Library library;
+ FT_Face face;
+ FT_GlyphSlot next;
+ FT_UInt reserved; /* retained for binary compatibility */
+ FT_Generic generic;
+
+ FT_Glyph_Metrics metrics;
+ FT_Fixed linearHoriAdvance;
+ FT_Fixed linearVertAdvance;
+ FT_Vector advance;
+
+ FT_Glyph_Format format;
+
+ FT_Bitmap bitmap;
+ FT_Int bitmap_left;
+ FT_Int bitmap_top;
+
+ FT_Outline outline;
+
+ FT_UInt num_subglyphs;
+ FT_SubGlyph subglyphs;
+
+ void* control_data;
+ long control_len;
+
+ FT_Pos lsb_delta;
+ FT_Pos rsb_delta;
+
+ void* other;
+
+ FT_Slot_Internal internal;
+
+ } FT_GlyphSlotRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* F U N C T I O N S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Init_FreeType */
+ /* */
+ /* <Description> */
+ /* Initialize a new FreeType library object. The set of modules */
+ /* that are registered by this function is determined at build time. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A handle to a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case you want to provide your own memory allocating routines, */
+ /* use @FT_New_Library instead, followed by a call to */
+ /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */
+ /* */
+ /* For multi-threading applications each thread should have its own */
+ /* FT_Library object. */
+ /* */
+ /* If you need reference-counting (cf. @FT_Reference_Library), use */
+ /* @FT_New_Library and @FT_Done_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Init_FreeType( FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_FreeType */
+ /* */
+ /* <Description> */
+ /* Destroy a given FreeType library object and all of its children, */
+ /* including resources, drivers, faces, sizes, etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_FreeType( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OPEN_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants used within the `flags' field of the */
+ /* @FT_Open_Args structure. */
+ /* */
+ /* <Values> */
+ /* FT_OPEN_MEMORY :: This is a memory-based stream. */
+ /* */
+ /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */
+ /* */
+ /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */
+ /* name. */
+ /* */
+ /* FT_OPEN_DRIVER :: Use the `driver' field. */
+ /* */
+ /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */
+ /* */
+ /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */
+ /* */
+ /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */
+ /* */
+ /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */
+ /* */
+ /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */
+ /* */
+ /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */
+ /* */
+ /* <Note> */
+ /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */
+ /* flags are mutually exclusive. */
+ /* */
+#define FT_OPEN_MEMORY 0x1
+#define FT_OPEN_STREAM 0x2
+#define FT_OPEN_PATHNAME 0x4
+#define FT_OPEN_DRIVER 0x8
+#define FT_OPEN_PARAMS 0x10
+
+#define ft_open_memory FT_OPEN_MEMORY /* deprecated */
+#define ft_open_stream FT_OPEN_STREAM /* deprecated */
+#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */
+#define ft_open_driver FT_OPEN_DRIVER /* deprecated */
+#define ft_open_params FT_OPEN_PARAMS /* deprecated */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Parameter */
+ /* */
+ /* <Description> */
+ /* A simple structure used to pass more or less generic parameters to */
+ /* @FT_Open_Face. */
+ /* */
+ /* <Fields> */
+ /* tag :: A four-byte identification tag. */
+ /* */
+ /* data :: A pointer to the parameter data. */
+ /* */
+ /* <Note> */
+ /* The ID and function of parameters are driver-specific. See the */
+ /* various FT_PARAM_TAG_XXX flags for more information. */
+ /* */
+ typedef struct FT_Parameter_
+ {
+ FT_ULong tag;
+ FT_Pointer data;
+
+ } FT_Parameter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Open_Args */
+ /* */
+ /* <Description> */
+ /* A structure used to indicate how to open a new font file or */
+ /* stream. A pointer to such a structure can be used as a parameter */
+ /* for the functions @FT_Open_Face and @FT_Attach_Stream. */
+ /* */
+ /* <Fields> */
+ /* flags :: A set of bit flags indicating how to use the */
+ /* structure. */
+ /* */
+ /* memory_base :: The first byte of the file in memory. */
+ /* */
+ /* memory_size :: The size in bytes of the file in memory. */
+ /* */
+ /* pathname :: A pointer to an 8-bit file pathname. */
+ /* */
+ /* stream :: A handle to a source stream object. */
+ /* */
+ /* driver :: This field is exclusively used by @FT_Open_Face; */
+ /* it simply specifies the font driver to use to open */
+ /* the face. If set to~0, FreeType tries to load the */
+ /* face with each one of the drivers in its list. */
+ /* */
+ /* num_params :: The number of extra parameters. */
+ /* */
+ /* params :: Extra parameters passed to the font driver when */
+ /* opening a new face. */
+ /* */
+ /* <Note> */
+ /* The stream type is determined by the contents of `flags' which */
+ /* are tested in the following order by @FT_Open_Face: */
+ /* */
+ /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */
+ /* memory file of `memory_size' bytes, located at `memory_address'. */
+ /* The data are are not copied, and the client is responsible for */
+ /* releasing and destroying them _after_ the corresponding call to */
+ /* @FT_Done_Face. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */
+ /* custom input stream `stream' is used. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */
+ /* is a normal file and use `pathname' to open it. */
+ /* */
+ /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */
+ /* open the file with the driver whose handler is in `driver'. */
+ /* */
+ /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */
+ /* `num_params' and `params' is used. They are ignored otherwise. */
+ /* */
+ /* Ideally, both the `pathname' and `params' fields should be tagged */
+ /* as `const'; this is missing for API backwards compatibility. In */
+ /* other words, applications should treat them as read-only. */
+ /* */
+ typedef struct FT_Open_Args_
+ {
+ FT_UInt flags;
+ const FT_Byte* memory_base;
+ FT_Long memory_size;
+ FT_String* pathname;
+ FT_Stream stream;
+ FT_Module driver;
+ FT_Int num_params;
+ FT_Parameter* params;
+
+ } FT_Open_Args;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font by its pathname. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* pathname :: A path to the font file. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Done_Face to destroy the created @FT_Face object (along */
+ /* with its slot and sizes). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* filepathname,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font which has been */
+ /* loaded into memory. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* file_base :: A pointer to the beginning of the font data. */
+ /* */
+ /* file_size :: The size of the memory chunk used by the font data. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You must not deallocate the memory before calling @FT_Done_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Memory_Face( FT_Library library,
+ const FT_Byte* file_base,
+ FT_Long file_size,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Open_Face */
+ /* */
+ /* <Description> */
+ /* Create a face object from a given resource described by */
+ /* @FT_Open_Args. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* args :: A pointer to an `FT_Open_Args' structure which must */
+ /* be filled by the caller. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See note below. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Unlike FreeType 1.x, this function automatically creates a glyph */
+ /* slot for the face object which can be accessed directly through */
+ /* `face->glyph'. */
+ /* */
+ /* FT_Open_Face can be used to quickly check whether the font */
+ /* format of a given font resource is supported by FreeType. If the */
+ /* `face_index' field is negative, the function's return value is~0 */
+ /* if the font format is recognized, or non-zero otherwise; */
+ /* the function returns a more or less empty face handle in `*aface' */
+ /* (if `aface' isn't NULL). The only useful field in this special */
+ /* case is `face->num_faces' which gives the number of faces within */
+ /* the font file. After examination, the returned @FT_Face structure */
+ /* should be deallocated with a call to @FT_Done_Face. */
+ /* */
+ /* Each new face object created with this function also owns a */
+ /* default @FT_Size object, accessible as `face->size'. */
+ /* */
+ /* One @FT_Library instance can have multiple face objects, this is, */
+ /* @FT_Open_Face and its siblings can be called multiple times using */
+ /* the same `library' argument. */
+ /* */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Open_Face( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_File */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Attach_Stream to attach a file. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* filepathname :: The pathname. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_File( FT_Face face,
+ const char* filepathname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_Stream */
+ /* */
+ /* <Description> */
+ /* `Attach' data to a face object. Normally, this is used to read */
+ /* additional information for the face object. For example, you can */
+ /* attach an AFM file that comes with a Type~1 font to get the */
+ /* kerning values and other metrics. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* parameters :: A pointer to @FT_Open_Args which must be filled by */
+ /* the caller. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The meaning of the `attach' (i.e., what really happens when the */
+ /* new file is read) is not fixed by FreeType itself. It really */
+ /* depends on the font format (and thus the font driver). */
+ /* */
+ /* Client applications are expected to know what they are doing */
+ /* when invoking this function. Most drivers simply do not implement */
+ /* file attachments. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_Stream( FT_Face face,
+ FT_Open_Args* parameters );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Face */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Face structure */
+ /* is created. This function increments the counter. @FT_Done_Face */
+ /* then only destroys a face if the counter is~1, otherwise it simply */
+ /* decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Face objects. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Face */
+ /* */
+ /* <Description> */
+ /* Discard a given face object, as well as all of its child slots and */
+ /* sizes. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Size */
+ /* */
+ /* <Description> */
+ /* Select a bitmap strike. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* strike_index :: The index of the bitmap strike in the */
+ /* `available_sizes' field of @FT_FaceRec structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Size( FT_Face face,
+ FT_Int strike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Size_Request_Type */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the supported size request types. */
+ /* */
+ /* <Values> */
+ /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */
+ /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */
+ /* used to determine both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */
+ /* The real dimension. The sum of the the `ascender' and (minus */
+ /* of) the `descender' fields of @FT_FaceRec are used to determine */
+ /* both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_BBOX :: */
+ /* The font bounding box. The width and height of the `bbox' field */
+ /* of @FT_FaceRec are used to determine the horizontal and vertical */
+ /* scaling value, respectively. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_CELL :: */
+ /* The `max_advance_width' field of @FT_FaceRec is used to */
+ /* determine the horizontal scaling value; the vertical scaling */
+ /* value is determined the same way as */
+ /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */
+ /* values are set to the smaller one. This type is useful if you */
+ /* want to specify the font size for, say, a window of a given */
+ /* dimension and 80x24 cells. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_SCALES :: */
+ /* Specify the scaling values directly. */
+ /* */
+ /* <Note> */
+ /* The above descriptions only apply to scalable formats. For bitmap */
+ /* formats, the behaviour is up to the driver. */
+ /* */
+ /* See the note section of @FT_Size_Metrics if you wonder how size */
+ /* requesting relates to scaling values. */
+ /* */
+ typedef enum FT_Size_Request_Type_
+ {
+ FT_SIZE_REQUEST_TYPE_NOMINAL,
+ FT_SIZE_REQUEST_TYPE_REAL_DIM,
+ FT_SIZE_REQUEST_TYPE_BBOX,
+ FT_SIZE_REQUEST_TYPE_CELL,
+ FT_SIZE_REQUEST_TYPE_SCALES,
+
+ FT_SIZE_REQUEST_TYPE_MAX
+
+ } FT_Size_Request_Type;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_RequestRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a size request. */
+ /* */
+ /* <Fields> */
+ /* type :: See @FT_Size_Request_Type. */
+ /* */
+ /* width :: The desired width. */
+ /* */
+ /* height :: The desired height. */
+ /* */
+ /* horiResolution :: The horizontal resolution. If set to zero, */
+ /* `width' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* vertResolution :: The vertical resolution. If set to zero, */
+ /* `height' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* <Note> */
+ /* If `width' is zero, then the horizontal scaling value is set equal */
+ /* to the vertical scaling value, and vice versa. */
+ /* */
+ typedef struct FT_Size_RequestRec_
+ {
+ FT_Size_Request_Type type;
+ FT_Long width;
+ FT_Long height;
+ FT_UInt horiResolution;
+ FT_UInt vertResolution;
+
+ } FT_Size_RequestRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Request */
+ /* */
+ /* <Description> */
+ /* A handle to a size request structure. */
+ /* */
+ typedef struct FT_Size_RequestRec_ *FT_Size_Request;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Request_Size */
+ /* */
+ /* <Description> */
+ /* Resize the scale of the active @FT_Size object in a face. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* req :: A pointer to a @FT_Size_RequestRec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Although drivers may select the bitmap strike matching the */
+ /* request, you should not rely on this if you intend to select a */
+ /* particular bitmap strike. Use @FT_Select_Size instead in that */
+ /* case. */
+ /* */
+ /* The relation between the requested size and the resulting glyph */
+ /* size is dependent entirely on how the size is defined in the */
+ /* source face. The font designer chooses the final size of each */
+ /* glyph relative to this size. For more information refer to */
+ /* `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html' */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Request_Size( FT_Face face,
+ FT_Size_Request req );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Char_Size */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in points). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* char_width :: The nominal width, in 26.6 fractional points. */
+ /* */
+ /* char_height :: The nominal height, in 26.6 fractional points. */
+ /* */
+ /* horz_resolution :: The horizontal resolution in dpi. */
+ /* */
+ /* vert_resolution :: The vertical resolution in dpi. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If either the character width or height is zero, it is set equal */
+ /* to the other value. */
+ /* */
+ /* If either the horizontal or vertical resolution is zero, it is set */
+ /* equal to the other value. */
+ /* */
+ /* A character width or height smaller than 1pt is set to 1pt; if */
+ /* both resolution values are zero, they are set to 72dpi. */
+ /* */
+ /* Don't use this function if you are using the FreeType cache API. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Char_Size( FT_Face face,
+ FT_F26Dot6 char_width,
+ FT_F26Dot6 char_height,
+ FT_UInt horz_resolution,
+ FT_UInt vert_resolution );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Pixel_Sizes */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in pixels). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* pixel_width :: The nominal width, in pixels. */
+ /* */
+ /* pixel_height :: The nominal height, in pixels. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should not rely on the resulting glyphs matching, or being */
+ /* constrained, to this pixel size. Refer to @FT_Request_Size to */
+ /* understand how requested sizes relate to actual sizes. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Pixel_Sizes( FT_Face face,
+ FT_UInt pixel_width,
+ FT_UInt pixel_height );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* glyph_index :: The index of the glyph in the font file. For */
+ /* CID-keyed fonts (either in PS or in CFF format) */
+ /* this argument specifies the CID value. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The loaded glyph may be transformed. See @FT_Set_Transform for */
+ /* the details. */
+ /* */
+ /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */
+ /* returned for invalid CID values (this is, for CID values which */
+ /* don't have a corresponding glyph in the font). See the discussion */
+ /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Glyph( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Char */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object, according to its character code. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* char_code :: The glyph's character code, according to the */
+ /* current charmap used in the face. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_XXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_Load_Glyph to indicate
+ * what kind of operations to perform during glyph loading.
+ *
+ * @values:
+ * FT_LOAD_DEFAULT ::
+ * Corresponding to~0, this value is used as the default glyph load
+ * operation. In this case, the following happens:
+ *
+ * 1. FreeType looks for a bitmap for the glyph corresponding to the
+ * face's current size. If one is found, the function returns.
+ * The bitmap data can be accessed from the glyph slot (see note
+ * below).
+ *
+ * 2. If no embedded bitmap is searched or found, FreeType looks for a
+ * scalable outline. If one is found, it is loaded from the font
+ * file, scaled to device pixels, then `hinted' to the pixel grid
+ * in order to optimize it. The outline data can be accessed from
+ * the glyph slot (see note below).
+ *
+ * Note that by default, the glyph loader doesn't render outlines into
+ * bitmaps. The following flags are used to modify this default
+ * behaviour to more specific and useful cases.
+ *
+ * FT_LOAD_NO_SCALE ::
+ * Don't scale the loaded outline glyph but keep it in font units.
+ *
+ * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
+ * unsets @FT_LOAD_RENDER.
+ *
+ * If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using
+ * FT_LOAD_NO_SCALE usually yields meaningless outlines because the
+ * subglyphs must be scaled and positioned with hinting instructions.
+ * This can be solved by loading the font without FT_LOAD_NO_SCALE and
+ * setting the character size to `font->units_per_EM'.
+ *
+ * FT_LOAD_NO_HINTING ::
+ * Disable hinting. This generally generates `blurrier' bitmap glyphs
+ * when the glyph are rendered in any of the anti-aliased modes. See
+ * also the note below.
+ *
+ * This flag is implied by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_RENDER ::
+ * Call @FT_Render_Glyph after the glyph is loaded. By default, the
+ * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be
+ * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
+ *
+ * This flag is unset by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_NO_BITMAP ::
+ * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this
+ * flag.
+ *
+ * @FT_LOAD_NO_SCALE always sets this flag.
+ *
+ * FT_LOAD_VERTICAL_LAYOUT ::
+ * Load the glyph for vertical text layout. In particular, the
+ * `advance' value in the @FT_GlyphSlotRec structure is set to the
+ * `vertAdvance' value of the `metrics' field.
+ *
+ * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use
+ * this flag currently. Reason is that in this case vertical metrics
+ * get synthesized, and those values are not always consistent across
+ * various font formats.
+ *
+ * FT_LOAD_FORCE_AUTOHINT ::
+ * Indicates that the auto-hinter is preferred over the font's native
+ * hinter. See also the note below.
+ *
+ * FT_LOAD_CROP_BITMAP ::
+ * Indicates that the font driver should crop the loaded bitmap glyph
+ * (i.e., remove all space around its black bits). Not all drivers
+ * implement this.
+ *
+ * FT_LOAD_PEDANTIC ::
+ * Indicates that the font driver should perform pedantic verifications
+ * during glyph loading. This is mostly used to detect broken glyphs
+ * in fonts. By default, FreeType tries to handle broken fonts also.
+ *
+ * In particular, errors from the TrueType bytecode engine are not
+ * passed to the application if this flag is not set; this might
+ * result in partially hinted or distorted glyphs in case a glyph's
+ * bytecode is buggy.
+ *
+ * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
+ * Ignored. Deprecated.
+ *
+ * FT_LOAD_NO_RECURSE ::
+ * This flag is only used internally. It merely indicates that the
+ * font driver should not load composite glyphs recursively. Instead,
+ * it should set the `num_subglyph' and `subglyphs' values of the
+ * glyph slot accordingly, and set `glyph->format' to
+ * @FT_GLYPH_FORMAT_COMPOSITE.
+ *
+ * The description of sub-glyphs is not available to client
+ * applications for now.
+ *
+ * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
+ *
+ * FT_LOAD_IGNORE_TRANSFORM ::
+ * Indicates that the transform matrix set by @FT_Set_Transform should
+ * be ignored.
+ *
+ * FT_LOAD_MONOCHROME ::
+ * This flag is used with @FT_LOAD_RENDER to indicate that you want to
+ * render an outline glyph to a 1-bit monochrome bitmap glyph, with
+ * 8~pixels packed into each byte of the bitmap data.
+ *
+ * Note that this has no effect on the hinting algorithm used. You
+ * should rather use @FT_LOAD_TARGET_MONO so that the
+ * monochrome-optimized hinting algorithm is used.
+ *
+ * FT_LOAD_LINEAR_DESIGN ::
+ * Indicates that the `linearHoriAdvance' and `linearVertAdvance'
+ * fields of @FT_GlyphSlotRec should be kept in font units. See
+ * @FT_GlyphSlotRec for details.
+ *
+ * FT_LOAD_NO_AUTOHINT ::
+ * Disable auto-hinter. See also the note below.
+ *
+ * FT_LOAD_COLOR ::
+ * This flag is used to request loading of color embedded-bitmap
+ * images. The resulting color bitmaps, if available, will have the
+ * @FT_PIXEL_MODE_BGRA format. When the flag is not used and color
+ * bitmaps are found, they will be converted to 256-level gray
+ * bitmaps transparently. Those bitmaps will be in the
+ * @FT_PIXEL_MODE_GRAY format.
+ *
+ * @note:
+ * By default, hinting is enabled and the font's native hinter (see
+ * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can
+ * disable hinting by setting @FT_LOAD_NO_HINTING or change the
+ * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set
+ * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
+ * used at all.
+ *
+ * See the description of @FT_FACE_FLAG_TRICKY for a special exception
+ * (affecting only a handful of Asian fonts).
+ *
+ * Besides deciding which hinter to use, you can also decide which
+ * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details.
+ *
+ * Note that the auto-hinter needs a valid Unicode cmap (either a native
+ * one or synthesized by FreeType) for producing correct results. If a
+ * font provides an incorrect mapping (for example, assigning the
+ * character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a
+ * mathematical integral sign), the auto-hinter might produce useless
+ * results.
+ *
+ */
+#define FT_LOAD_DEFAULT 0x0
+#define FT_LOAD_NO_SCALE ( 1L << 0 )
+#define FT_LOAD_NO_HINTING ( 1L << 1 )
+#define FT_LOAD_RENDER ( 1L << 2 )
+#define FT_LOAD_NO_BITMAP ( 1L << 3 )
+#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 )
+#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 )
+#define FT_LOAD_CROP_BITMAP ( 1L << 6 )
+#define FT_LOAD_PEDANTIC ( 1L << 7 )
+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 )
+#define FT_LOAD_NO_RECURSE ( 1L << 10 )
+#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 )
+#define FT_LOAD_MONOCHROME ( 1L << 12 )
+#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 )
+#define FT_LOAD_NO_AUTOHINT ( 1L << 15 )
+ /* Bits 16..19 are used by `FT_LOAD_TARGET_' */
+#define FT_LOAD_COLOR ( 1L << 20 )
+
+ /* */
+
+ /* used internally only by certain font drivers! */
+#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 )
+#define FT_LOAD_SBITS_ONLY ( 1L << 14 )
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_TARGET_XXX
+ *
+ * @description:
+ * A list of values that are used to select a specific hinting algorithm
+ * to use by the hinter. You should OR one of these values to your
+ * `load_flags' when calling @FT_Load_Glyph.
+ *
+ * Note that font's native hinters may ignore the hinting algorithm you
+ * have specified (e.g., the TrueType bytecode interpreter). You can set
+ * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
+ *
+ * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
+ * always implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * @values:
+ * FT_LOAD_TARGET_NORMAL ::
+ * This corresponds to the default hinting algorithm, optimized for
+ * standard gray-level rendering. For monochrome output, use
+ * @FT_LOAD_TARGET_MONO instead.
+ *
+ * FT_LOAD_TARGET_LIGHT ::
+ * A lighter hinting algorithm for non-monochrome modes. Many
+ * generated glyphs are more fuzzy but better resemble its original
+ * shape. A bit like rendering on Mac OS~X.
+ *
+ * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * FT_LOAD_TARGET_MONO ::
+ * Strong hinting algorithm that should only be used for monochrome
+ * output. The result is probably unpleasant if the glyph is rendered
+ * in non-monochrome modes.
+ *
+ * FT_LOAD_TARGET_LCD ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+ * decimated LCD displays.
+ *
+ * FT_LOAD_TARGET_LCD_V ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
+ * decimated LCD displays.
+ *
+ * @note:
+ * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
+ * `load_flags'. They can't be ORed.
+ *
+ * If @FT_LOAD_RENDER is also set, the glyph is rendered in the
+ * corresponding mode (i.e., the mode which matches the used algorithm
+ * best). An exeption is FT_LOAD_TARGET_MONO since it implies
+ * @FT_LOAD_MONOCHROME.
+ *
+ * You can use a hinting algorithm that doesn't correspond to the same
+ * rendering mode. As an example, it is possible to use the `light'
+ * hinting algorithm and have the results rendered in horizontal LCD
+ * pixel mode, with code like
+ *
+ * {
+ * FT_Load_Glyph( face, glyph_index,
+ * load_flags | FT_LOAD_TARGET_LIGHT );
+ *
+ * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+ * }
+ *
+ */
+#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 )
+
+#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
+#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT )
+#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO )
+#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD )
+#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V )
+
+
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_LOAD_TARGET_MODE
+ *
+ * @description:
+ * Return the @FT_Render_Mode corresponding to a given
+ * @FT_LOAD_TARGET_XXX value.
+ *
+ */
+#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Transform */
+ /* */
+ /* <Description> */
+ /* A function used to set the transformation that is applied to glyph */
+ /* images when they are loaded into a glyph slot through */
+ /* @FT_Load_Glyph. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */
+ /* the identity matrix. */
+ /* delta :: A pointer to the translation vector. Use~0 for the null */
+ /* vector. */
+ /* */
+ /* <Note> */
+ /* The transformation is only applied to scalable image formats after */
+ /* the glyph has been loaded. It means that hinting is unaltered by */
+ /* the transformation and is performed on the character size given in */
+ /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */
+ /* */
+ /* Note that this also transforms the `face.glyph.advance' field, but */
+ /* *not* the values in `face.glyph.metrics'. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Transform( FT_Face face,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Render_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the render modes supported by */
+ /* FreeType~2. Each mode corresponds to a specific type of scanline */
+ /* conversion performed on the outline. */
+ /* */
+ /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */
+ /* field in the @FT_GlyphSlotRec structure gives the format of the */
+ /* returned bitmap. */
+ /* */
+ /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */
+ /* */
+ /* <Values> */
+ /* FT_RENDER_MODE_NORMAL :: */
+ /* This is the default render mode; it corresponds to 8-bit */
+ /* anti-aliased bitmaps. */
+ /* */
+ /* FT_RENDER_MODE_LIGHT :: */
+ /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */
+ /* defined as a separate value because render modes are also used */
+ /* indirectly to define hinting algorithm selectors. See */
+ /* @FT_LOAD_TARGET_XXX for details. */
+ /* */
+ /* FT_RENDER_MODE_MONO :: */
+ /* This mode corresponds to 1-bit bitmaps (with 2~levels of */
+ /* opacity). */
+ /* */
+ /* FT_RENDER_MODE_LCD :: */
+ /* This mode corresponds to horizontal RGB and BGR sub-pixel */
+ /* displays like LCD screens. It produces 8-bit bitmaps that are */
+ /* 3~times the width of the original glyph outline in pixels, and */
+ /* which use the @FT_PIXEL_MODE_LCD mode. */
+ /* */
+ /* FT_RENDER_MODE_LCD_V :: */
+ /* This mode corresponds to vertical RGB and BGR sub-pixel displays */
+ /* (like PDA screens, rotated LCD displays, etc.). It produces */
+ /* 8-bit bitmaps that are 3~times the height of the original */
+ /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */
+ /* */
+ /* <Note> */
+ /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
+ /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
+ /* (not active in the default builds). It is up to the caller to */
+ /* either call @FT_Library_SetLcdFilter (if available) or do the */
+ /* filtering itself. */
+ /* */
+ /* The selected render mode only affects vector glyphs of a font. */
+ /* Embedded bitmaps often have a different pixel mode like */
+ /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */
+ /* them into 8-bit pixmaps. */
+ /* */
+ typedef enum FT_Render_Mode_
+ {
+ FT_RENDER_MODE_NORMAL = 0,
+ FT_RENDER_MODE_LIGHT,
+ FT_RENDER_MODE_MONO,
+ FT_RENDER_MODE_LCD,
+ FT_RENDER_MODE_LCD_V,
+
+ FT_RENDER_MODE_MAX
+
+ } FT_Render_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_render_mode_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Render_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */
+ /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */
+ /* */
+#define ft_render_mode_normal FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono FT_RENDER_MODE_MONO
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph image to a bitmap. It does so by inspecting */
+ /* the glyph image format, finding the relevant renderer, and */
+ /* invoking it. */
+ /* */
+ /* <InOut> */
+ /* slot :: A handle to the glyph slot containing the image to */
+ /* convert. */
+ /* */
+ /* <Input> */
+ /* render_mode :: This is the render mode used to render the glyph */
+ /* image into a bitmap. See @FT_Render_Mode for a */
+ /* list of possible values. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Render_Glyph( FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Kerning_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify which kerning values to return in */
+ /* @FT_Get_Kerning. */
+ /* */
+ /* <Values> */
+ /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */
+ /* distances (value is~0). */
+ /* */
+ /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */
+ /* distances. */
+ /* */
+ /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */
+ /* units. */
+ /* */
+ typedef enum FT_Kerning_Mode_
+ {
+ FT_KERNING_DEFAULT = 0,
+ FT_KERNING_UNFITTED,
+ FT_KERNING_UNSCALED
+
+ } FT_Kerning_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_default */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */
+ /* instead. */
+ /* */
+#define ft_kerning_default FT_KERNING_DEFAULT
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unfitted */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */
+ /* instead. */
+ /* */
+#define ft_kerning_unfitted FT_KERNING_UNFITTED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unscaled */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */
+ /* instead. */
+ /* */
+#define ft_kerning_unscaled FT_KERNING_UNSCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the kerning vector between two glyphs of a same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* kern_mode :: See @FT_Kerning_Mode for more information. */
+ /* Determines the scale and dimension of the returned */
+ /* kerning vector. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning vector. This is either in font units */
+ /* or in pixels (26.6 format) for scalable formats, */
+ /* and in pixels for fixed-sizes formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this method. Other layouts, or more sophisticated */
+ /* kernings, are out of the scope of this API function -- they can be */
+ /* implemented through format-specific interfaces. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Kerning( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_UInt kern_mode,
+ FT_Vector *akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Track_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the track kerning for a given face object at a given size. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* point_size :: The point size in 16.16 fractional points. */
+ /* */
+ /* degree :: The degree of tightness. Increasingly negative */
+ /* values represent tighter track kerning, while */
+ /* increasingly positive values represent looser track */
+ /* kerning. Value zero means no track kerning. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning in 16.16 fractional points, to be */
+ /* uniformly applied between all glyphs. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Currently, only the Type~1 font driver supports track kerning, */
+ /* using data from AFM files (if attached with @FT_Attach_File or */
+ /* @FT_Attach_Stream). */
+ /* */
+ /* Only very few AFM files come with track kerning data; please refer */
+ /* to the Adobe's AFM specification for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Track_Kerning( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII name of a given glyph in a face. This only */
+ /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* buffer_max :: The maximum number of bytes available in the */
+ /* buffer. */
+ /* */
+ /* <Output> */
+ /* buffer :: A pointer to a target buffer where the name is */
+ /* copied to. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error is returned if the face doesn't provide glyph names or if */
+ /* the glyph index is invalid. In all cases of failure, the first */
+ /* byte of `buffer' is set to~0 to indicate an empty name. */
+ /* */
+ /* The glyph name is truncated to fit within the buffer if it is too */
+ /* long. The returned string is always zero-terminated. */
+ /* */
+ /* Be aware that FreeType reorders glyph indices internally so that */
+ /* glyph index~0 always corresponds to the `missing glyph' (called */
+ /* `.notdef'). */
+ /* */
+ /* This function is not compiled within the library if the config */
+ /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */
+ /* `include/freetype/config/ftoptions.h'. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph_Name( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII PostScript name of a given face, if available. */
+ /* This only works with PostScript and TrueType fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the face's PostScript name. NULL if unavailable. */
+ /* */
+ /* <Note> */
+ /* The returned pointer is owned by the face and is destroyed with */
+ /* it. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_Postscript_Name( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap by its encoding tag (as listed in */
+ /* `freetype.h'). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* encoding :: A handle to the selected encoding. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if no charmap in the face */
+ /* corresponds to the encoding queried here. */
+ /* */
+ /* Because many fonts contain more than a single cmap for Unicode */
+ /* encoding, this function has some special code to select the one */
+ /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */
+ /* is preferred to a UCS-2 cmap). It is thus preferable to */
+ /* @FT_Set_Charmap in this case. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Charmap( FT_Face face,
+ FT_Encoding encoding );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap for character code to glyph index mapping. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* charmap :: A handle to the selected charmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if the charmap is not part of */
+ /* the face (i.e., if it is not listed in the `face->charmaps' */
+ /* table). */
+ /* */
+ /* It also fails if a type~14 charmap is selected. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Charmap( FT_Face face,
+ FT_CharMap charmap );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Get_Charmap_Index
+ *
+ * @description:
+ * Retrieve index of a given charmap.
+ *
+ * @input:
+ * charmap ::
+ * A handle to a charmap.
+ *
+ * @return:
+ * The index into the array of character maps within the face to which
+ * `charmap' belongs. If an error occurs, -1 is returned.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Charmap_Index( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Char_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code. This function */
+ /* uses a charmap object to do the mapping. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* charcode :: The character code. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within the */
+ /* file. This is done to ensure that value~0 always corresponds to */
+ /* the `missing glyph'. If the first glyph is not named `.notdef', */
+ /* then for Type~1 and Type~42 fonts, `.notdef' will be moved into */
+ /* the glyph ID~0 position, and whatever was there will be moved to */
+ /* the position `.notdef' had. For Type~1 fonts, if there is no */
+ /* `.notdef' glyph at all, then one will be created at index~0 and */
+ /* whatever was there will be moved to the last index -- Type~42 */
+ /* fonts are considered invalid under this condition. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_First_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the first character code in the */
+ /* current charmap of a given face. It also returns the */
+ /* corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of first character code. 0~if charmap is */
+ /* empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's first character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_Next_Char to be able to */
+ /* parse all character codes available in a given charmap. The code */
+ /* should look like this: */
+ /* */
+ /* { */
+ /* FT_ULong charcode; */
+ /* FT_UInt gindex; */
+ /* */
+ /* */
+ /* charcode = FT_Get_First_Char( face, &gindex ); */
+ /* while ( gindex != 0 ) */
+ /* { */
+ /* ... do something with (charcode,gindex) pair ... */
+ /* */
+ /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */
+ /* } */
+ /* } */
+ /* */
+ /* Note that `*agindex' is set to~0 if the charmap is empty. The */
+ /* result itself can be~0 in two cases: if the charmap is empty or */
+ /* if the value~0 is the first valid character code. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_First_Char( FT_Face face,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Next_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the next character code in the */
+ /* current charmap of a given face following the value `char_code', */
+ /* as well as the corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* char_code :: The starting character code. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of next character code. 0~if charmap */
+ /* is empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's next character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_First_Char to walk */
+ /* over all character codes available in a given charmap. See the */
+ /* note for this function for a simple code example. */
+ /* */
+ /* Note that `*agindex' is set to~0 when there are no more codes in */
+ /* the charmap. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Name_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given glyph name. This function uses */
+ /* driver specific objects to do the translation. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* glyph_name :: The glyph name. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Name_Index( FT_Face face,
+ FT_String* glyph_name );
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SUBGLYPH_FLAG_XXX
+ *
+ * @description:
+ * A list of constants used to describe subglyphs. Please refer to the
+ * TrueType specification for the meaning of the various flags.
+ *
+ * @values:
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+ * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+ * FT_SUBGLYPH_FLAG_SCALE ::
+ * FT_SUBGLYPH_FLAG_XY_SCALE ::
+ * FT_SUBGLYPH_FLAG_2X2 ::
+ * FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+ *
+ */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_SubGlyph_Info
+ *
+ * @description:
+ * Retrieve a description of a given subglyph. Only use it if
+ * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
+ * returned otherwise.
+ *
+ * @input:
+ * glyph ::
+ * The source glyph slot.
+ *
+ * sub_index ::
+ * The index of the subglyph. Must be less than
+ * `glyph->num_subglyphs'.
+ *
+ * @output:
+ * p_index ::
+ * The glyph index of the subglyph.
+ *
+ * p_flags ::
+ * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
+ *
+ * p_arg1 ::
+ * The subglyph's first argument (if any).
+ *
+ * p_arg2 ::
+ * The subglyph's second argument (if any).
+ *
+ * p_transform ::
+ * The subglyph transformation (if any).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
+ * interpreted depending on the flags returned in `*p_flags'. See the
+ * TrueType specification for details.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_SubGlyph_Info( FT_GlyphSlot glyph,
+ FT_UInt sub_index,
+ FT_Int *p_index,
+ FT_UInt *p_flags,
+ FT_Int *p_arg1,
+ FT_Int *p_arg2,
+ FT_Matrix *p_transform );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FSTYPE_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `fsType' field of the OS/2 table */
+ /* in a TrueType or OpenType font and the `FSType' entry in a */
+ /* PostScript font. These bit flags are returned by */
+ /* @FT_Get_FSType_Flags; they inform client applications of embedding */
+ /* and subsetting restrictions associated with a font. */
+ /* */
+ /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */
+ /* more details. */
+ /* */
+ /* <Values> */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */
+ /* Fonts with no fsType bit set may be embedded and permanently */
+ /* installed on the remote system by an application. */
+ /* */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */
+ /* Fonts that have only this bit set must not be modified, embedded */
+ /* or exchanged in any manner without first obtaining permission of */
+ /* the font software copyright owner. */
+ /* */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded and temporarily */
+ /* loaded on the remote system. Documents containing Preview & */
+ /* Print fonts must be opened `read-only'; no edits can be applied */
+ /* to the document. */
+ /* */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded but must only be */
+ /* installed temporarily on other systems. In contrast to Preview */
+ /* & Print fonts, documents containing editable fonts may be opened */
+ /* for reading, editing is permitted, and changes may be saved. */
+ /* */
+ /* FT_FSTYPE_NO_SUBSETTING :: */
+ /* If this bit is set, the font may not be subsetted prior to */
+ /* embedding. */
+ /* */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */
+ /* If this bit is set, only bitmaps contained in the font may be */
+ /* embedded; no outline data may be embedded. If there are no */
+ /* bitmaps available in the font, then the font is unembeddable. */
+ /* */
+ /* <Note> */
+ /* While the fsType flags can indicate that a font may be embedded, a */
+ /* license with the font vendor may be separately required to use the */
+ /* font in this way. */
+ /* */
+#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000
+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002
+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004
+#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008
+#define FT_FSTYPE_NO_SUBSETTING 0x0100
+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /* <Description> */
+ /* Return the fsType flags for a font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* The fsType flags, @FT_FSTYPE_XXX. */
+ /* */
+ /* <Note> */
+ /* Use this function rather than directly reading the `fs_type' field */
+ /* in the @PS_FontInfoRec structure which is only guaranteed to */
+ /* return the correct results for Type~1 fonts. */
+ /* */
+ /* <Since> */
+ /* 2.3.8 */
+ /* */
+ FT_EXPORT( FT_UShort )
+ FT_Get_FSType_Flags( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_variants */
+ /* */
+ /* <Title> */
+ /* Glyph Variants */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 interface to Unicode Ideographic Variation */
+ /* Sequences (IVS), using the SFNT cmap format~14. */
+ /* */
+ /* <Description> */
+ /* Many CJK characters have variant forms. They are a sort of grey */
+ /* area somewhere between being totally irrelevant and semantically */
+ /* distinct; for this reason, the Unicode consortium decided to */
+ /* introduce Ideographic Variation Sequences (IVS), consisting of a */
+ /* Unicode base character and one of 240 variant selectors */
+ /* (U+E0100-U+E01EF), instead of further extending the already huge */
+ /* code range for CJK characters. */
+ /* */
+ /* An IVS is registered and unique; for further details please refer */
+ /* to Unicode Technical Standard #37, the Ideographic Variation */
+ /* Database: */
+ /* */
+ /* http://www.unicode.org/reports/tr37/ */
+ /* */
+ /* To date (November 2012), the character with the most variants is */
+ /* U+9089, having 31 such IVS. */
+ /* */
+ /* Adobe and MS decided to support IVS with a new cmap subtable */
+ /* (format~14). It is an odd subtable because it is not a mapping of */
+ /* input code points to glyphs, but contains lists of all variants */
+ /* supported by the font. */
+ /* */
+ /* A variant may be either `default' or `non-default'. A default */
+ /* variant is the one you will get for that code point if you look it */
+ /* up in the standard Unicode cmap. A non-default variant is a */
+ /* different glyph. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIndex */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code as modified by */
+ /* the variation selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character code point in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode code point of the variation selector. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means either `undefined character code', or */
+ /* `undefined selector code', or `no variation selector cmap */
+ /* subtable', or `current CharMap is not Unicode'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within */
+ /* the file. This is done to ensure that value~0 always corresponds */
+ /* to the `missing glyph'. */
+ /* */
+ /* This function is only meaningful if */
+ /* a) the font has a variation selector cmap sub table, */
+ /* and */
+ /* b) the current charmap has a Unicode encoding. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Face_GetCharVariantIndex( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIsDefault */
+ /* */
+ /* <Description> */
+ /* Check whether this variant of this Unicode character is the one to */
+ /* be found in the `cmap'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode codepoint of the variation selector. */
+ /* */
+ /* <Return> */
+ /* 1~if found in the standard (Unicode) cmap, 0~if found in the */
+ /* variation selector cmap, or -1 if it is not a variant. */
+ /* */
+ /* <Note> */
+ /* This function is only meaningful if the font has a variation */
+ /* selector cmap subtable. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_Int )
+ FT_Face_GetCharVariantIsDefault( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantSelectors */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* in the font. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of selector code points, or NULL if there is */
+ /* no valid variant selector cmap subtable. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantSelectors( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantsOfChar */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* for the specified character code. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of variant selector code points which are */
+ /* active for the given character, or NULL if the corresponding list */
+ /* is empty. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantsOfChar( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharsOfVariant */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode character codes found for */
+ /* the specified variant selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* variantSelector :: */
+ /* The variant selector code point in Unicode. */
+ /* */
+ /* <Return> */
+ /* A list of all the code points which are specified by this selector */
+ /* (both default and non-default codes are returned) or NULL if there */
+ /* is no valid cmap or the variant selector is invalid. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetCharsOfVariant( FT_Face face,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /* <Title> */
+ /* Computations */
+ /* */
+ /* <Abstract> */
+ /* Crunching fixed numbers and vectors. */
+ /* */
+ /* <Description> */
+ /* This section contains various functions used to perform */
+ /* computations on 16.16 fixed-float numbers or 2d vectors. */
+ /* */
+ /* <Order> */
+ /* FT_MulDiv */
+ /* FT_MulFix */
+ /* FT_DivFix */
+ /* FT_RoundFix */
+ /* FT_CeilFix */
+ /* FT_FloorFix */
+ /* FT_Vector_Transform */
+ /* FT_Matrix_Multiply */
+ /* FT_Matrix_Invert */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* with maximum accuracy (it uses a 64-bit intermediate integer */
+ /* whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /* */
+
+ /* The following #if 0 ... #endif is for the documentation formatter, */
+ /* hiding the internal `FT_MULFIX_INLINED' macro. */
+
+#if 0
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */
+ /* used to multiply a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/0x10000'. */
+ /* */
+ /* <Note> */
+ /* This function has been optimized for the case where the absolute */
+ /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
+ /* As this happens mainly when scaling from notional units to */
+ /* fractional pixels in FreeType, it resulted in noticeable speed */
+ /* improvements between versions 2.x and 1.x. */
+ /* */
+ /* As a conclusion, always try to place a 16.16 factor as the */
+ /* _second_ argument of this function; this can make a great */
+ /* difference. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+
+ /* */
+#endif
+
+#ifdef FT_MULFIX_INLINED
+#define FPDFAPI_FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b )
+#else
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_DivFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */
+ /* used to divide a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*0x10000)/b'. */
+ /* */
+ /* <Note> */
+ /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */
+ /* 32~bits, then the division is computed directly. Otherwise, we */
+ /* use a specialized version of @FT_MulDiv. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_RoundFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to round a 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number to be rounded. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x8000) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_RoundFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_CeilFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the ceiling function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the ceiling function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x10000 - 1) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_CeilFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FloorFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the floor function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the floor function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `a & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_FloorFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Vector_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a single vector through a 2x2 matrix. */
+ /* */
+ /* <InOut> */
+ /* vector :: The target vector to transform. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the source 2x2 matrix. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `vector' or `matrix' is invalid. */
+ /* */
+ FT_EXPORT( void )
+ FT_Vector_Transform( FT_Vector* vec,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* version */
+ /* */
+ /* <Title> */
+ /* FreeType Version */
+ /* */
+ /* <Abstract> */
+ /* Functions and macros related to FreeType versions. */
+ /* */
+ /* <Description> */
+ /* Note that those functions and macros are of limited use because */
+ /* even a new release of FreeType with only documentation changes */
+ /* increases the version number. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FREETYPE_XXX
+ *
+ * @description:
+ * These three macros identify the FreeType source code version.
+ * Use @FT_Library_Version to access them at runtime.
+ *
+ * @values:
+ * FREETYPE_MAJOR :: The major version number.
+ * FREETYPE_MINOR :: The minor version number.
+ * FREETYPE_PATCH :: The patch level.
+ *
+ * @note:
+ * The version number of FreeType if built as a dynamic link library
+ * with the `libtool' package is _not_ controlled by these three
+ * macros.
+ *
+ */
+#define FREETYPE_MAJOR 2
+#define FREETYPE_MINOR 5
+#define FREETYPE_PATCH 0
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Library_Version */
+ /* */
+ /* <Description> */
+ /* Return the version of the FreeType library being used. This is */
+ /* useful when dynamically linking to the library, since one cannot */
+ /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */
+ /* @FREETYPE_PATCH. */
+ /* */
+ /* <Input> */
+ /* library :: A source library handle. */
+ /* */
+ /* <Output> */
+ /* amajor :: The major version number. */
+ /* */
+ /* aminor :: The minor version number. */
+ /* */
+ /* apatch :: The patch version number. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' argument is because */
+ /* certain programs implement library initialization in a custom way */
+ /* that doesn't use @FT_Init_FreeType. */
+ /* */
+ /* In such cases, the library version might not be available before */
+ /* the library object has been created. */
+ /* */
+ FT_EXPORT( void )
+ FT_Library_Version( FT_Library library,
+ FT_Int *amajor,
+ FT_Int *aminor,
+ FT_Int *apatch );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_CheckTrueTypePatents */
+ /* */
+ /* <Description> */
+ /* Parse all bytecode instructions of a TrueType font file to check */
+ /* whether any of the patented opcodes are used. This is only useful */
+ /* if you want to be able to use the unpatented hinter with */
+ /* fonts that do *not* use these opcodes. */
+ /* */
+ /* Note that this function parses *all* glyph instructions in the */
+ /* font file, which may be slow. */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* <Return> */
+ /* 1~if this is a TrueType font that uses one of the patented */
+ /* opcodes, 0~otherwise. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_CheckTrueTypePatents( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_SetUnpatentedHinting */
+ /* */
+ /* <Description> */
+ /* Enable or disable the unpatented hinter for a given face. */
+ /* Only enable it if you have determined that the face doesn't */
+ /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* value :: New boolean setting. */
+ /* */
+ /* <Return> */
+ /* The old setting value. This will always be false if this is not */
+ /* an SFNT font, or if the unpatented hinter is not compiled in this */
+ /* instance of the library. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_SetUnpatentedHinting( FT_Face face,
+ FT_Bool value );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FREETYPE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
new file mode 100644
index 0000000000..0163ba1874
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.h */
+/* */
+/* Quick computation of advance widths (specification only). */
+/* */
+/* Copyright 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * quick_advance
+ *
+ * @title:
+ * Quick retrieval of advance values
+ *
+ * @abstract:
+ * Retrieve horizontal and vertical advance values without processing
+ * glyph outlines, if possible.
+ *
+ * @description:
+ * This section contains functions to quickly extract advance values
+ * without handling glyph outlines, if possible.
+ */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_ADVANCE_FLAG_FAST_ONLY */
+ /* */
+ /* <Description> */
+ /* A bit-flag to be OR-ed with the `flags' parameter of the */
+ /* @FT_Get_Advance and @FT_Get_Advances functions. */
+ /* */
+ /* If set, it indicates that you want these functions to fail if the */
+ /* corresponding hinting mode or font driver doesn't allow for very */
+ /* quick advance computation. */
+ /* */
+ /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */
+ /* or light-hinted can have their advance width computed very */
+ /* quickly. */
+ /* */
+ /* Normal and bytecode hinted modes, which require loading, scaling, */
+ /* and hinting of the glyph outline, are extremely slow by */
+ /* comparison. */
+ /* */
+#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advance */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance value of a given glyph outline in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph, used to determine what kind */
+ /* of advances you need. */
+ /* <Output> */
+ /* padvance :: The advance value. If scaling is performed (based on */
+ /* the value of `load_flags'), the advance value is in */
+ /* 16.16 format. Otherwise, it is in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */
+ /* vertical advance corresponding to a vertical layout. */
+ /* Otherwise, it is the horizontal advance in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* A scaled advance is returned in 16.16 format but isn't transformed */
+ /* by the affine transformation specified by @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Int32 load_flags,
+ FT_Fixed *padvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advances */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance values of several glyph outlines in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* start :: The first glyph index. */
+ /* */
+ /* count :: The number of advance values you want to retrieve. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph. */
+ /* */
+ /* <Output> */
+ /* padvance :: The advance values. This array, to be provided by the */
+ /* caller, must contain at least `count' elements. */
+ /* */
+ /* If scaling is performed (based on the value of */
+ /* `load_flags'), the advance values are in 16.16 format. */
+ /* Otherwise, they are in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */
+ /* vertical advances corresponding to a vertical layout. */
+ /* Otherwise, they are the horizontal advances in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* Scaled advances are returned in 16.16 format but aren't */
+ /* transformed by the affine transformation specified by */
+ /* @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
new file mode 100644
index 0000000000..6edd9f4b73
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/* */
+/* ftautoh.h */
+/* */
+/* FreeType API for controlling the auto-hinter (specification only). */
+/* */
+/* Copyright 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * auto_hinter
+ *
+ * @title:
+ * The auto-hinter
+ *
+ * @abstract:
+ * Controlling the auto-hinting module.
+ *
+ * @description:
+ * While FreeType's auto-hinter doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * Note that the auto-hinter's module name is `autofitter' for
+ * historical reasons.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * glyph-to-script-map
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The auto-hinter provides various script modules to hint glyphs.
+ * Examples of supported scripts are Latin or CJK. Before a glyph is
+ * auto-hinted, the Unicode character map of the font gets examined, and
+ * the script is then determined based on Unicode character ranges, see
+ * below.
+ *
+ * OpenType fonts, however, often provide much more glyphs than
+ * character codes (small caps, superscripts, ligatures, swashes, etc.),
+ * to be controlled by so-called `features'. Handling OpenType features
+ * can be quite complicated and thus needs a separate library on top of
+ * FreeType.
+ *
+ * The mapping between glyph indices and scripts (in the auto-hinter
+ * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+ * array with `num_glyphs' elements, as found in the font's @FT_Face
+ * structure. The `glyph-to-script-map' property returns a pointer to
+ * this array which can be modified as needed. Note that the
+ * modification should happen before the first glyph gets processed by
+ * the auto-hinter so that the global analysis of the font shapes
+ * actually uses the modified mapping.
+ *
+ * The following example code demonstrates how to access it (omitting
+ * the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_GlyphToScriptMap prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ *
+ * prop.face = face;
+ *
+ * FT_Property_Get( library, "autofitter",
+ * "glyph-to-script-map", &prop );
+ *
+ * // adjust `prop.map' as needed right here
+ *
+ * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+ * }
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_AUTOHINTER_SCRIPT_XXX
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * A list of constants used for the @glyph-to-script-map property to
+ * specify the script submodule the auto-hinter should use for hinting a
+ * particular glyph.
+ *
+ * @values:
+ * FT_AUTOHINTER_SCRIPT_NONE ::
+ * Don't auto-hint this glyph.
+ *
+ * FT_AUTOHINTER_SCRIPT_LATIN ::
+ * Apply the latin auto-hinter. For the auto-hinter, `latin' is a
+ * very broad term, including Cyrillic and Greek also since characters
+ * from those scripts share the same design constraints.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0020 - U+007F // Basic Latin (no control characters)
+ * U+00A0 - U+00FF // Latin-1 Supplement (no control characters)
+ * U+0100 - U+017F // Latin Extended-A
+ * U+0180 - U+024F // Latin Extended-B
+ * U+0250 - U+02AF // IPA Extensions
+ * U+02B0 - U+02FF // Spacing Modifier Letters
+ * U+0300 - U+036F // Combining Diacritical Marks
+ * U+0370 - U+03FF // Greek and Coptic
+ * U+0400 - U+04FF // Cyrillic
+ * U+0500 - U+052F // Cyrillic Supplement
+ * U+1D00 - U+1D7F // Phonetic Extensions
+ * U+1D80 - U+1DBF // Phonetic Extensions Supplement
+ * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement
+ * U+1E00 - U+1EFF // Latin Extended Additional
+ * U+1F00 - U+1FFF // Greek Extended
+ * U+2000 - U+206F // General Punctuation
+ * U+2070 - U+209F // Superscripts and Subscripts
+ * U+20A0 - U+20CF // Currency Symbols
+ * U+2150 - U+218F // Number Forms
+ * U+2460 - U+24FF // Enclosed Alphanumerics
+ * U+2C60 - U+2C7F // Latin Extended-C
+ * U+2DE0 - U+2DFF // Cyrillic Extended-A
+ * U+2E00 - U+2E7F // Supplemental Punctuation
+ * U+A640 - U+A69F // Cyrillic Extended-B
+ * U+A720 - U+A7FF // Latin Extended-D
+ * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures)
+ * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+ * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_CJK ::
+ * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+ * Vietnamese, and some other scripts.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+1100 - U+11FF // Hangul Jamo
+ * U+2E80 - U+2EFF // CJK Radicals Supplement
+ * U+2F00 - U+2FDF // Kangxi Radicals
+ * U+2FF0 - U+2FFF // Ideographic Description Characters
+ * U+3000 - U+303F // CJK Symbols and Punctuation
+ * U+3040 - U+309F // Hiragana
+ * U+30A0 - U+30FF // Katakana
+ * U+3100 - U+312F // Bopomofo
+ * U+3130 - U+318F // Hangul Compatibility Jamo
+ * U+3190 - U+319F // Kanbun
+ * U+31A0 - U+31BF // Bopomofo Extended
+ * U+31C0 - U+31EF // CJK Strokes
+ * U+31F0 - U+31FF // Katakana Phonetic Extensions
+ * U+3200 - U+32FF // Enclosed CJK Letters and Months
+ * U+3300 - U+33FF // CJK Compatibility
+ * U+3400 - U+4DBF // CJK Unified Ideographs Extension A
+ * U+4DC0 - U+4DFF // Yijing Hexagram Symbols
+ * U+4E00 - U+9FFF // CJK Unified Ideographs
+ * U+A960 - U+A97F // Hangul Jamo Extended-A
+ * U+AC00 - U+D7AF // Hangul Syllables
+ * U+D7B0 - U+D7FF // Hangul Jamo Extended-B
+ * U+F900 - U+FAFF // CJK Compatibility Ideographs
+ * U+FE10 - U+FE1F // Vertical forms
+ * U+FE30 - U+FE4F // CJK Compatibility Forms
+ * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms
+ * U+1B000 - U+1B0FF // Kana Supplement
+ * U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+ * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+ * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+ * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+ * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+ * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_INDIC ::
+ * Apply the indic auto-hinter, covering all major scripts from the
+ * Indian sub-continent and some other related scripts like Thai, Lao,
+ * or Tibetan.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0900 - U+0DFF // Indic Range
+ * U+0F00 - U+0FFF // Tibetan
+ * U+1900 - U+194F // Limbu
+ * U+1B80 - U+1BBF // Sundanese
+ * U+1C80 - U+1CDF // Meetei Mayak
+ * U+A800 - U+A82F // Syloti Nagri
+ * U+11800 - U+118DF // Sharada
+ * }
+ *
+ * Note that currently Indic support is rudimentary only, missing blue
+ * zone support.
+ *
+ */
+#define FT_AUTOHINTER_SCRIPT_NONE 0
+#define FT_AUTOHINTER_SCRIPT_LATIN 1
+#define FT_AUTOHINTER_SCRIPT_CJK 2
+#define FT_AUTOHINTER_SCRIPT_INDIC 3
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_GlyphToScriptMap
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The data exchange structure for the @glyph-to-script-map property.
+ *
+ */
+ typedef struct FT_Prop_GlyphToScriptMap_
+ {
+ FT_Face face;
+ FT_Byte* map;
+
+ } FT_Prop_GlyphToScriptMap;
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * fallback-script
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * If no auto-hinter script module can be assigned to a glyph, a
+ * fallback script gets assigned to it (see also the
+ * @glyph-to-script-map property). By default, this is
+ * @FT_AUTOHINTER_SCRIPT_CJK. Using the `fallback-script' property,
+ * this fallback value can be changed.
+ *
+ * {
+ * FT_Library library;
+ * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "fallback-script", &fallback_script );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * It's important to use the right timing for changing this value: The
+ * creation of the glyph-to-script map which eventually uses the
+ * fallback script value gets triggered either by setting or reading a
+ * face-specific property like @glyph-to-script-map, or by auto-hinting
+ * any glyph from that face. In particular, if you have already created
+ * an @FT_Face structure but not loaded any glyph (using the
+ * auto-hinter), a change of the fallback glyph will affect this face.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * increase-x-height
+ *
+ * @description:
+ * For ppem values in the range 6~<= ppem <= `increase-x-height', round
+ * up the font's x~height much more often than normally. If the value
+ * is set to~0, which is the default, this feature is switched off. Use
+ * this property to improve the legibility of small font sizes if
+ * necessary.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_IncreaseXHeight prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+ *
+ * prop.face = face;
+ * prop.limit = 14;
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "increase-x-height", &prop );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * Set this value right after calling @FT_Set_Char_Size, but before
+ * loading any glyph (using the auto-hinter).
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_IncreaseXHeight
+ *
+ * @description:
+ * The data exchange structure for the @increase-x-height property.
+ *
+ */
+ typedef struct FT_Prop_IncreaseXHeight_
+ {
+ FT_Face face;
+ FT_UInt limit;
+
+ } FT_Prop_IncreaseXHeight;
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
new file mode 100644
index 0000000000..5f54246976
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbbox.h */
+/* */
+/* FreeType exact bbox computation (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component has a _single_ role: to compute exact outline bounding */
+ /* boxes. */
+ /* */
+ /* It is separated from the rest of the engine for various technical */
+ /* reasons. It may well be integrated in `ftoutln' later. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* <Description> */
+ /* Compute the exact bounding box of an outline. This is slower */
+ /* than computing the control box. However, it uses an advanced */
+ /* algorithm which returns _very_ quickly when the two boxes */
+ /* coincide. Otherwise, the outline Bézier arcs are traversed to */
+ /* extract their extrema. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline. */
+ /* */
+ /* <Output> */
+ /* abbox :: The outline's exact bounding box. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get */
+ /* reasonable values for the BBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the BBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_BBox( FT_Outline* outline,
+ FT_BBox *abbox );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
new file mode 100644
index 0000000000..c4721bcd4e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/* */
+/* ftbdf.h */
+/* */
+/* FreeType API for accessing BDF-specific strings (specification). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bdf_fonts */
+ /* */
+ /* <Title> */
+ /* BDF and PCF Files */
+ /* */
+ /* <Abstract> */
+ /* BDF and PCF specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions specific to BDF */
+ /* and PCF fonts. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_PropertyType
+ *
+ * @description:
+ * A list of BDF property types.
+ *
+ * @values:
+ * BDF_PROPERTY_TYPE_NONE ::
+ * Value~0 is used to indicate a missing property.
+ *
+ * BDF_PROPERTY_TYPE_ATOM ::
+ * Property is a string atom.
+ *
+ * BDF_PROPERTY_TYPE_INTEGER ::
+ * Property is a 32-bit signed integer.
+ *
+ * BDF_PROPERTY_TYPE_CARDINAL ::
+ * Property is a 32-bit unsigned integer.
+ */
+ typedef enum BDF_PropertyType_
+ {
+ BDF_PROPERTY_TYPE_NONE = 0,
+ BDF_PROPERTY_TYPE_ATOM = 1,
+ BDF_PROPERTY_TYPE_INTEGER = 2,
+ BDF_PROPERTY_TYPE_CARDINAL = 3
+
+ } BDF_PropertyType;
+
+
+ /**********************************************************************
+ *
+ * @type:
+ * BDF_Property
+ *
+ * @description:
+ * A handle to a @BDF_PropertyRec structure to model a given
+ * BDF/PCF property.
+ */
+ typedef struct BDF_PropertyRec_* BDF_Property;
+
+
+ /**********************************************************************
+ *
+ * @struct:
+ * BDF_PropertyRec
+ *
+ * @description:
+ * This structure models a given BDF/PCF property.
+ *
+ * @fields:
+ * type ::
+ * The property type.
+ *
+ * u.atom ::
+ * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+ *
+ * u.integer ::
+ * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+ *
+ * u.cardinal ::
+ * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+ */
+ typedef struct BDF_PropertyRec_
+ {
+ BDF_PropertyType type;
+ union {
+ const char* atom;
+ FT_Int32 integer;
+ FT_UInt32 cardinal;
+
+ } u;
+
+ } BDF_PropertyRec;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Charset_ID
+ *
+ * @description:
+ * Retrieve a BDF font character set identity, according to
+ * the BDF specification.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * acharset_encoding ::
+ * Charset encoding, as a C~string, owned by the face.
+ *
+ * acharset_registry ::
+ * Charset registry, as a C~string, owned by the face.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with BDF faces, returning an error otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Charset_ID( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Property
+ *
+ * @description:
+ * Retrieve a BDF property from a BDF or PCF font file.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * name :: The property name.
+ *
+ * @output:
+ * aproperty :: The property.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function works with BDF _and_ PCF fonts. It returns an error
+ * otherwise. It also returns an error if the property is not in the
+ * font.
+ *
+ * A `property' is a either key-value pair within the STARTPROPERTIES
+ * ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+ * `info->props' array within a `FontRec' structure of a PCF font.
+ *
+ * Integer properties are always stored as `signed' within PCF fonts;
+ * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+ * for BDF fonts only.
+ *
+ * In case of error, `aproperty->type' is always set to
+ * @BDF_PROPERTY_TYPE_NONE.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Property( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
new file mode 100644
index 0000000000..9640790925
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/* */
+/* ftbitmap.h */
+/* */
+/* FreeType utility functions for bitmaps (specification). */
+/* */
+/* Copyright 2004-2006, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bitmap_handling */
+ /* */
+ /* <Title> */
+ /* Bitmap Handling */
+ /* */
+ /* <Abstract> */
+ /* Handling FT_Bitmap objects. */
+ /* */
+ /* <Description> */
+ /* This section contains functions for converting FT_Bitmap objects. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_New */
+ /* */
+ /* <Description> */
+ /* Initialize a pointer to an @FT_Bitmap structure. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the bitmap structure. */
+ /* */
+ FT_EXPORT( void )
+ FT_Bitmap_New( FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Copy */
+ /* */
+ /* <Description> */
+ /* Copy a bitmap into another one. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: A handle to the source bitmap. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden a bitmap. The new bitmap will be about `xStrength' */
+ /* pixels wider and `yStrength' pixels higher. The left and bottom */
+ /* borders are kept unchanged. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* xStrength :: How strong the glyph is emboldened horizontally. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* yStrength :: How strong the glyph is emboldened vertically. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* <InOut> */
+ /* bitmap :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The current implementation restricts `xStrength' to be less than */
+ /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */
+ /* */
+ /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */
+ /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Embolden( FT_Library library,
+ FT_Bitmap* bitmap,
+ FT_Pos xStrength,
+ FT_Pos yStrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Convert */
+ /* */
+ /* <Description> */
+ /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
+ /* to a bitmap object with depth 8bpp, making the number of used */
+ /* bytes line (a.k.a. the `pitch') a multiple of `alignment'. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: The source bitmap. */
+ /* */
+ /* alignment :: The pitch of the bitmap is a multiple of this */
+ /* parameter. Common values are 1, 2, or 4. */
+ /* */
+ /* <Output> */
+ /* target :: The target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* It is possible to call @FT_Bitmap_Convert multiple times without */
+ /* calling @FT_Bitmap_Done (the memory is simply reallocated). */
+ /* */
+ /* Use @FT_Bitmap_Done to finally remove the bitmap object. */
+ /* */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Convert( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target,
+ FT_Int alignment );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GlyphSlot_Own_Bitmap */
+ /* */
+ /* <Description> */
+ /* Make sure that a glyph slot owns `slot->bitmap'. */
+ /* */
+ /* <Input> */
+ /* slot :: The glyph slot. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function is to be used in combination with */
+ /* @FT_Bitmap_Embolden. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a bitmap object created with @FT_Bitmap_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* bitmap :: The bitmap object to be freed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Done( FT_Library library,
+ FT_Bitmap *bitmap );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
new file mode 100644
index 0000000000..654b222346
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbzip2.h */
+/* */
+/* Bzip2-compressed stream support. */
+/* */
+/* Copyright 2010 by */
+/* Joel Klinghed. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bzip2 */
+ /* */
+ /* <Title> */
+ /* BZIP2 Streams */
+ /* */
+ /* <Abstract> */
+ /* Using bzip2-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Bzip2-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenBzip2
+ *
+ * @description:
+ * Open a new stream to parse bzip2-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.bz2' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, bzip2 compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a bzip2 compressed stream
+ * from it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with bzip2 support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenBzip2( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
new file mode 100644
index 0000000000..404b0faf8e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
@@ -0,0 +1,1057 @@
+/***************************************************************************/
+/* */
+/* ftcache.h */
+/* */
+/* FreeType Cache subsystem (specification). */
+/* */
+/* Copyright 1996-2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include "../ft2build.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************
+ *
+ * <Section>
+ * cache_subsystem
+ *
+ * <Title>
+ * Cache Sub-System
+ *
+ * <Abstract>
+ * How to cache face, size, and glyph data with FreeType~2.
+ *
+ * <Description>
+ * This section describes the FreeType~2 cache sub-system, which is used
+ * to limit the number of concurrently opened @FT_Face and @FT_Size
+ * objects, as well as caching information like character maps and glyph
+ * images while limiting their maximum memory usage.
+ *
+ * Note that all types and functions begin with the `FTC_' prefix.
+ *
+ * The cache is highly portable and thus doesn't know anything about the
+ * fonts installed on your system, or how to access them. This implies
+ * the following scheme:
+ *
+ * First, available or installed font faces are uniquely identified by
+ * @FTC_FaceID values, provided to the cache by the client. Note that
+ * the cache only stores and compares these values, and doesn't try to
+ * interpret them in any way.
+ *
+ * Second, the cache calls, only when needed, a client-provided function
+ * to convert an @FTC_FaceID into a new @FT_Face object. The latter is
+ * then completely managed by the cache, including its termination
+ * through @FT_Done_Face. To monitor termination of face objects, the
+ * finalizer callback in the `generic' field of the @FT_Face object can
+ * be used, which might also be used to store the @FTC_FaceID of the
+ * face.
+ *
+ * Clients are free to map face IDs to anything else. The most simple
+ * usage is to associate them to a (pathname,face_index) pair that is
+ * used to call @FT_New_Face. However, more complex schemes are also
+ * possible.
+ *
+ * Note that for the cache to work correctly, the face ID values must be
+ * *persistent*, which means that the contents they point to should not
+ * change at runtime, or that their value should not become invalid.
+ *
+ * If this is unavoidable (e.g., when a font is uninstalled at runtime),
+ * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+ * the cache get rid of any references to the old @FTC_FaceID it may
+ * keep internally. Failure to do so will lead to incorrect behaviour
+ * or even crashes.
+ *
+ * To use the cache, start with calling @FTC_Manager_New to create a new
+ * @FTC_Manager object, which models a single cache instance. You can
+ * then look up @FT_Face and @FT_Size objects with
+ * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+ *
+ * If you want to use the charmap caching, call @FTC_CMapCache_New, then
+ * later use @FTC_CMapCache_Lookup to perform the equivalent of
+ * @FT_Get_Char_Index, only much faster.
+ *
+ * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+ * later use @FTC_ImageCache_Lookup to retrieve the corresponding
+ * @FT_Glyph objects from the cache.
+ *
+ * If you need lots of small bitmaps, it is much more memory efficient
+ * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This
+ * returns @FTC_SBitRec structures, which are used to store small
+ * bitmaps directly. (A small bitmap is one whose metrics and
+ * dimensions all fit into 8-bit integers).
+ *
+ * We hope to also provide a kerning cache in the near future.
+ *
+ *
+ * <Order>
+ * FTC_Manager
+ * FTC_FaceID
+ * FTC_Face_Requester
+ *
+ * FTC_Manager_New
+ * FTC_Manager_Reset
+ * FTC_Manager_Done
+ * FTC_Manager_LookupFace
+ * FTC_Manager_LookupSize
+ * FTC_Manager_RemoveFaceID
+ *
+ * FTC_Node
+ * FTC_Node_Unref
+ *
+ * FTC_ImageCache
+ * FTC_ImageCache_New
+ * FTC_ImageCache_Lookup
+ *
+ * FTC_SBit
+ * FTC_SBitCache
+ * FTC_SBitCache_New
+ * FTC_SBitCache_Lookup
+ *
+ * FTC_CMapCache
+ * FTC_CMapCache_New
+ * FTC_CMapCache_Lookup
+ *
+ *************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BASIC TYPE DEFINITIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type: FTC_FaceID
+ *
+ * @description:
+ * An opaque pointer type that is used to identity face objects. The
+ * contents of such objects is application-dependent.
+ *
+ * These pointers are typically used to point to a user-defined
+ * structure containing a font file path, and face index.
+ *
+ * @note:
+ * Never use NULL as a valid @FTC_FaceID.
+ *
+ * Face IDs are passed by the client to the cache manager, which calls,
+ * when needed, the @FTC_Face_Requester to translate them into new
+ * @FT_Face objects.
+ *
+ * If the content of a given face ID changes at runtime, or if the value
+ * becomes invalid (e.g., when uninstalling a font), you should
+ * immediately call @FTC_Manager_RemoveFaceID before any other cache
+ * function.
+ *
+ * Failure to do so will result in incorrect behaviour or even
+ * memory leaks and crashes.
+ */
+ typedef FT_Pointer FTC_FaceID;
+
+
+ /************************************************************************
+ *
+ * @functype:
+ * FTC_Face_Requester
+ *
+ * @description:
+ * A callback function provided by client applications. It is used by
+ * the cache manager to translate a given @FTC_FaceID into a new valid
+ * @FT_Face object, on demand.
+ *
+ * <Input>
+ * face_id ::
+ * The face ID to resolve.
+ *
+ * library ::
+ * A handle to a FreeType library object.
+ *
+ * req_data ::
+ * Application-provided request data (see note below).
+ *
+ * <Output>
+ * aface ::
+ * A new @FT_Face handle.
+ *
+ * <Return>
+ * FreeType error code. 0~means success.
+ *
+ * <Note>
+ * The third parameter `req_data' is the same as the one passed by the
+ * client when @FTC_Manager_New is called.
+ *
+ * The face requester should not perform funny things on the returned
+ * face object, like creating a new @FT_Size for it, or setting a
+ * transformation through @FT_Set_Transform!
+ */
+ typedef FT_Error
+ (*FTC_Face_Requester)( FTC_FaceID face_id,
+ FT_Library library,
+ FT_Pointer request_data,
+ FT_Face* aface );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CACHE MANAGER OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Manager */
+ /* */
+ /* <Description> */
+ /* This object corresponds to one instance of the cache-subsystem. */
+ /* It is used to cache one or more @FT_Face objects, along with */
+ /* corresponding @FT_Size objects. */
+ /* */
+ /* The manager intentionally limits the total number of opened */
+ /* @FT_Face and @FT_Size objects to control memory usage. See the */
+ /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */
+ /* */
+ /* The manager is also used to cache `nodes' of various types while */
+ /* limiting their total memory usage. */
+ /* */
+ /* All limitations are enforced by keeping lists of managed objects */
+ /* in most-recently-used order, and flushing old nodes to make room */
+ /* for new ones. */
+ /* */
+ typedef struct FTC_ManagerRec_* FTC_Manager;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Node */
+ /* */
+ /* <Description> */
+ /* An opaque handle to a cache node object. Each cache node is */
+ /* reference-counted. A node with a count of~0 might be flushed */
+ /* out of a full cache whenever a lookup request is performed. */
+ /* */
+ /* If you look up nodes, you have the ability to `acquire' them, */
+ /* i.e., to increment their reference count. This will prevent the */
+ /* node from being flushed out of the cache until you explicitly */
+ /* `release' it (see @FTC_Node_Unref). */
+ /* */
+ /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */
+ /* */
+ typedef struct FTC_NodeRec_* FTC_Node;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache manager. */
+ /* */
+ /* <Input> */
+ /* library :: The parent FreeType library handle to use. */
+ /* */
+ /* max_faces :: Maximum number of opened @FT_Face objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_sizes :: Maximum number of opened @FT_Size objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_bytes :: Maximum number of bytes to use for cached data nodes. */
+ /* Use~0 for defaults. Note that this value does not */
+ /* account for managed @FT_Face and @FT_Size objects. */
+ /* */
+ /* requester :: An application-provided callback used to translate */
+ /* face IDs into real @FT_Face objects. */
+ /* */
+ /* req_data :: A generic pointer that is passed to the requester */
+ /* each time it is called (see @FTC_Face_Requester). */
+ /* */
+ /* <Output> */
+ /* amanager :: A handle to a new manager object. 0~in case of */
+ /* failure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_New( FT_Library library,
+ FT_UInt max_faces,
+ FT_UInt max_sizes,
+ FT_ULong max_bytes,
+ FTC_Face_Requester requester,
+ FT_Pointer req_data,
+ FTC_Manager *amanager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Reset */
+ /* */
+ /* <Description> */
+ /* Empty a given cache manager. This simply gets rid of all the */
+ /* currently cached @FT_Face and @FT_Size objects within the manager. */
+ /* */
+ /* <InOut> */
+ /* manager :: A handle to the manager. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Reset( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a given manager after emptying it. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the target cache manager object. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Done( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupFace */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Face object that corresponds to a given face ID */
+ /* through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* face_id :: The ID of the face object. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to the face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Face object is always owned by the manager. You */
+ /* should never try to discard it yourself. */
+ /* */
+ /* The @FT_Face object doesn't necessarily have a current size object */
+ /* (i.e., face->size can be~0). If you need a specific `font size', */
+ /* use @FTC_Manager_LookupSize instead. */
+ /* */
+ /* Never change the face's transformation matrix (i.e., never call */
+ /* the @FT_Set_Transform function) on a returned face! If you need */
+ /* to transform glyphs, do it yourself after glyph loading. */
+ /* */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory was available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupFace( FTC_Manager manager,
+ FTC_FaceID face_id,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_ScalerRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given character size in either */
+ /* pixels or points to the cache manager. See */
+ /* @FTC_Manager_LookupSize. */
+ /* */
+ /* <Fields> */
+ /* face_id :: The source face ID. */
+ /* */
+ /* width :: The character width. */
+ /* */
+ /* height :: The character height. */
+ /* */
+ /* pixel :: A Boolean. If 1, the `width' and `height' fields are */
+ /* interpreted as integer pixel character sizes. */
+ /* Otherwise, they are expressed as 1/64th of points. */
+ /* */
+ /* x_res :: Only used when `pixel' is value~0 to indicate the */
+ /* horizontal resolution in dpi. */
+ /* */
+ /* y_res :: Only used when `pixel' is value~0 to indicate the */
+ /* vertical resolution in dpi. */
+ /* */
+ /* <Note> */
+ /* This type is mainly used to retrieve @FT_Size objects through the */
+ /* cache manager. */
+ /* */
+ typedef struct FTC_ScalerRec_
+ {
+ FTC_FaceID face_id;
+ FT_UInt width;
+ FT_UInt height;
+ FT_Int pixel;
+ FT_UInt x_res;
+ FT_UInt y_res;
+
+ } FTC_ScalerRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_Scaler */
+ /* */
+ /* <Description> */
+ /* A handle to an @FTC_ScalerRec structure. */
+ /* */
+ typedef struct FTC_ScalerRec_* FTC_Scaler;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupSize */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Size object that corresponds to a given */
+ /* @FTC_ScalerRec pointer through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* scaler :: A scaler handle. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to the size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Size object is always owned by the manager. You */
+ /* should never try to discard it by yourself. */
+ /* */
+ /* You can access the parent @FT_Face object simply as `size->face' */
+ /* if you need it. Note that this object is also owned by the */
+ /* manager. */
+ /* */
+ /* <Note> */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory is available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupSize( FTC_Manager manager,
+ FTC_Scaler scaler,
+ FT_Size *asize );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Node_Unref */
+ /* */
+ /* <Description> */
+ /* Decrement a cache node's internal reference count. When the count */
+ /* reaches 0, it is not destroyed but becomes eligible for subsequent */
+ /* cache flushes. */
+ /* */
+ /* <Input> */
+ /* node :: The cache node handle. */
+ /* */
+ /* manager :: The cache manager handle. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Node_Unref( FTC_Node node,
+ FTC_Manager manager );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_Manager_RemoveFaceID
+ *
+ * @description:
+ * A special function used to indicate to the cache manager that
+ * a given @FTC_FaceID is no longer valid, either because its
+ * content changed, or because it was deallocated or uninstalled.
+ *
+ * @input:
+ * manager ::
+ * The cache manager handle.
+ *
+ * face_id ::
+ * The @FTC_FaceID to be removed.
+ *
+ * @note:
+ * This function flushes all nodes from the cache corresponding to this
+ * `face_id', with the exception of nodes with a non-null reference
+ * count.
+ *
+ * Such nodes are however modified internally so as to never appear
+ * in later lookups with the same `face_id' value, and to be immediately
+ * destroyed when released by all their users.
+ *
+ */
+ FT_EXPORT( void )
+ FTC_Manager_RemoveFaceID( FTC_Manager manager,
+ FTC_FaceID face_id );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_CMapCache
+ *
+ * @description:
+ * An opaque handle used to model a charmap cache. This cache is to
+ * hold character codes -> glyph indices mappings.
+ *
+ */
+ typedef struct FTC_CMapCacheRec_* FTC_CMapCache;
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_New
+ *
+ * @description:
+ * Create a new charmap cache.
+ *
+ * @input:
+ * manager ::
+ * A handle to the cache manager.
+ *
+ * @output:
+ * acache ::
+ * A new cache handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Like all other caches, this one will be destroyed with the cache
+ * manager.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FTC_CMapCache_New( FTC_Manager manager,
+ FTC_CMapCache *acache );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_Lookup
+ *
+ * @description:
+ * Translate a character code into a glyph index, using the charmap
+ * cache.
+ *
+ * @input:
+ * cache ::
+ * A charmap cache handle.
+ *
+ * face_id ::
+ * The source face ID.
+ *
+ * cmap_index ::
+ * The index of the charmap in the source face. Any negative value
+ * means to use the cache @FT_Face's default charmap.
+ *
+ * char_code ::
+ * The character code (in the corresponding charmap).
+ *
+ * @return:
+ * Glyph index. 0~means `no glyph'.
+ *
+ */
+ FT_EXPORT( FT_UInt )
+ FTC_CMapCache_Lookup( FTC_CMapCache cache,
+ FTC_FaceID face_id,
+ FT_Int cmap_index,
+ FT_UInt32 char_code );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** IMAGE CACHE OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FTC_ImageTypeRec
+ *
+ * @description:
+ * A structure used to model the type of images in a glyph cache.
+ *
+ * @fields:
+ * face_id ::
+ * The face ID.
+ *
+ * width ::
+ * The width in pixels.
+ *
+ * height ::
+ * The height in pixels.
+ *
+ * flags ::
+ * The load flags, as in @FT_Load_Glyph.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_
+ {
+ FTC_FaceID face_id;
+ FT_Int width;
+ FT_Int height;
+ FT_Int32 flags;
+
+ } FTC_ImageTypeRec;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_ImageType
+ *
+ * @description:
+ * A handle to an @FTC_ImageTypeRec structure.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_* FTC_ImageType;
+
+
+ /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \
+ ( (d1)->face_id == (d2)->face_id && \
+ (d1)->width == (d2)->width && \
+ (d1)->flags == (d2)->flags )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_ImageCache */
+ /* */
+ /* <Description> */
+ /* A handle to a glyph image cache object. They are designed to */
+ /* hold many distinct glyph images while not exceeding a certain */
+ /* memory threshold. */
+ /* */
+ typedef struct FTC_ImageCacheRec_* FTC_ImageCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new glyph image cache. */
+ /* */
+ /* <Input> */
+ /* manager :: The parent manager for the image cache. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new glyph image cache object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_New( FTC_Manager manager,
+ FTC_ImageCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Retrieve a given glyph image from a glyph image cache. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* type :: A pointer to a glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_Lookup( FTC_ImageCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* scaler :: A pointer to a scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ /* Calls to @FT_Set_Char_Size and friends have no effect on cached */
+ /* glyphs; you should always use the FreeType cache API instead. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_LookupScaler( FTC_ImageCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBit */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */
+ /* structure for details. */
+ /* */
+ typedef struct FTC_SBitRec_* FTC_SBit;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_SBitRec */
+ /* */
+ /* <Description> */
+ /* A very compact structure used to describe a small glyph bitmap. */
+ /* */
+ /* <Fields> */
+ /* width :: The bitmap width in pixels. */
+ /* */
+ /* height :: The bitmap height in pixels. */
+ /* */
+ /* left :: The horizontal distance from the pen position to the */
+ /* left bitmap border (a.k.a. `left side bearing', or */
+ /* `lsb'). */
+ /* */
+ /* top :: The vertical distance from the pen position (on the */
+ /* baseline) to the upper bitmap border (a.k.a. `top */
+ /* side bearing'). The distance is positive for upwards */
+ /* y~coordinates. */
+ /* */
+ /* format :: The format of the glyph bitmap (monochrome or gray). */
+ /* */
+ /* max_grays :: Maximum gray level value (in the range 1 to~255). */
+ /* */
+ /* pitch :: The number of bytes per bitmap line. May be positive */
+ /* or negative. */
+ /* */
+ /* xadvance :: The horizontal advance width in pixels. */
+ /* */
+ /* yadvance :: The vertical advance height in pixels. */
+ /* */
+ /* buffer :: A pointer to the bitmap pixels. */
+ /* */
+ typedef struct FTC_SBitRec_
+ {
+ FT_Byte width;
+ FT_Byte height;
+ FT_Char left;
+ FT_Char top;
+
+ FT_Byte format;
+ FT_Byte max_grays;
+ FT_Short pitch;
+ FT_Char xadvance;
+ FT_Char yadvance;
+
+ FT_Byte* buffer;
+
+ } FTC_SBitRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBitCache */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap cache. These are special cache objects */
+ /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */
+ /* much more efficient way than the traditional glyph image cache */
+ /* implemented by @FTC_ImageCache. */
+ /* */
+ typedef struct FTC_SBitCacheRec_* FTC_SBitCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache to store small glyph bitmaps. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the source cache manager. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new sbit cache. NULL in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_New( FTC_Manager manager,
+ FTC_SBitCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Look up a given small glyph bitmap in a given sbit cache and */
+ /* `lock' it to prevent its flushing from the cache until needed. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* type :: A pointer to the glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_Lookup( FTC_SBitCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* scaler :: A pointer to the scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_LookupScaler( FTC_SBitCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
new file mode 100644
index 0000000000..3a377950d9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/* */
+/* ftcffdrv.h */
+/* */
+/* FreeType API for controlling the CFF driver (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCFFDRV_H__
+#define __FTCFFDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * cff_driver
+ *
+ * @title:
+ * The CFF driver
+ *
+ * @abstract:
+ * Controlling the CFF driver module.
+ *
+ * @description:
+ * While FreeType's CFF driver doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The CFF driver's module name is `cff'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * hinting-engine
+ *
+ * @description:
+ * Thanks to Adobe, which contributed a new hinting (and parsing)
+ * engine, an application can select between `freetype' and `adobe' if
+ * compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration
+ * macro isn't defined, `hinting-engine' does nothing.
+ *
+ * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
+ * defined, and `adobe' otherwise.
+ *
+ * The following example code demonstrates how to select Adobe's hinting
+ * engine (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt hinting_engine = FT_CFF_HINTING_ADOBE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "hinting-engine", &hinting_engine );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_CFF_HINTING_XXX
+ *
+ * @description:
+ * A list of constants used for the @hinting-engine property to select
+ * the hinting engine for CFF fonts.
+ *
+ * @values:
+ * FT_CFF_HINTING_FREETYPE ::
+ * Use the old FreeType hinting engine.
+ *
+ * FT_CFF_HINTING_ADOBE ::
+ * Use the hinting engine contributed by Adobe.
+ *
+ */
+#define FT_CFF_HINTING_FREETYPE 0
+#define FT_CFF_HINTING_ADOBE 1
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * no-stem-darkening
+ *
+ * @description:
+ * By default, the Adobe CFF engine darkens stems at smaller sizes,
+ * regardless of hinting, to enhance contrast. Setting this property,
+ * stem darkening gets switched off.
+ *
+ * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Bool no_stem_darkening = TRUE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "no-stem-darkening", &no_stem_darkening );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCFFDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
new file mode 100644
index 0000000000..c55670d1d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/* */
+/* This file defines the structure of the FreeType reference. */
+/* It is used by the python script which generates the HTML files. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* general_remarks */
+/* */
+/* <Title> */
+/* General Remarks */
+/* */
+/* <Sections> */
+/* user_allocation */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* core_api */
+/* */
+/* <Title> */
+/* Core API */
+/* */
+/* <Sections> */
+/* version */
+/* basic_types */
+/* base_interface */
+/* glyph_variants */
+/* glyph_management */
+/* mac_specific */
+/* sizes_management */
+/* header_file_macros */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* format_specific */
+/* */
+/* <Title> */
+/* Format-Specific API */
+/* */
+/* <Sections> */
+/* multiple_masters */
+/* truetype_tables */
+/* type1_tables */
+/* sfnt_names */
+/* bdf_fonts */
+/* cid_fonts */
+/* pfr_fonts */
+/* winfnt_fonts */
+/* font_formats */
+/* gasp_table */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* module_specific */
+/* */
+/* <Title> */
+/* Controlling FreeType Modules */
+/* */
+/* <Sections> */
+/* auto_hinter */
+/* cff_driver */
+/* tt_driver */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* cache_subsystem */
+/* */
+/* <Title> */
+/* Cache Sub-System */
+/* */
+/* <Sections> */
+/* cache_subsystem */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* support_api */
+/* */
+/* <Title> */
+/* Support API */
+/* */
+/* <Sections> */
+/* computations */
+/* list_processing */
+/* outline_processing */
+/* quick_advance */
+/* bitmap_handling */
+/* raster */
+/* glyph_stroker */
+/* system_interface */
+/* module_management */
+/* gzip */
+/* lzw */
+/* bzip2 */
+/* lcd_filtering */
+/* */
+/***************************************************************************/
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
new file mode 100644
index 0000000000..f59597574b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/* */
+/* ftcid.h */
+/* */
+/* FreeType API for accessing CID font information (specification). */
+/* */
+/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cid_fonts */
+ /* */
+ /* <Title> */
+ /* CID Fonts */
+ /* */
+ /* <Abstract> */
+ /* CID-keyed font specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of CID-keyed font specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Registry_Ordering_Supplement
+ *
+ * @description:
+ * Retrieve the Registry/Ordering/Supplement triple (also known as the
+ * "R/O/S") from a CID-keyed font.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * registry ::
+ * The registry, as a C~string, owned by the face.
+ *
+ * ordering ::
+ * The ordering, as a C~string, owned by the face.
+ *
+ * supplement ::
+ * The supplement.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces, returning an error
+ * otherwise.
+ *
+ * @since:
+ * 2.3.6
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Registry_Ordering_Supplement( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement);
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Is_Internally_CID_Keyed
+ *
+ * @description:
+ * Retrieve the type of the input face, CID keyed or not. In
+ * constrast to the @FT_IS_CID_KEYED macro this function returns
+ * successfully also for CID-keyed fonts in an SNFT wrapper.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * is_cid ::
+ * The type of the face as an @FT_Bool.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face,
+ FT_Bool *is_cid );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_From_Glyph_Index
+ *
+ * @description:
+ * Retrieve the CID of the input glyph index.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * glyph_index ::
+ * The input glyph index.
+ *
+ * @output:
+ * cid ::
+ * The CID as an @FT_UInt.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_From_Glyph_Index( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
new file mode 100644
index 0000000000..76c7b9e36f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
@@ -0,0 +1,249 @@
+/***************************************************************************/
+/* */
+/* fterrdef.h */
+/* */
+/* FreeType error codes (specification). */
+/* */
+/* Copyright 2002, 2004, 2006, 2007, 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST OF ERROR CODES/MESSAGES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+ /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+ /* including this file. */
+
+
+ /* generic errors */
+
+ FT_NOERRORDEF_( Ok, 0x00, \
+ "no error" )
+
+ FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \
+ "cannot open resource" )
+ FT_ERRORDEF_( Unknown_File_Format, 0x02, \
+ "unknown file format" )
+ FT_ERRORDEF_( Invalid_File_Format, 0x03, \
+ "broken file" )
+ FT_ERRORDEF_( Invalid_Version, 0x04, \
+ "invalid FreeType version" )
+ FT_ERRORDEF_( Lower_Module_Version, 0x05, \
+ "module version is too low" )
+ FT_ERRORDEF_( Invalid_Argument, 0x06, \
+ "invalid argument" )
+ FT_ERRORDEF_( Unimplemented_Feature, 0x07, \
+ "unimplemented feature" )
+ FT_ERRORDEF_( Invalid_Table, 0x08, \
+ "broken table" )
+ FT_ERRORDEF_( Invalid_Offset, 0x09, \
+ "broken offset within table" )
+ FT_ERRORDEF_( Array_Too_Large, 0x0A, \
+ "array allocation size too large" )
+ FT_ERRORDEF_( Missing_Module, 0x0B, \
+ "missing module" )
+ FT_ERRORDEF_( Missing_Property, 0x0C, \
+ "missing property" )
+
+ /* glyph/character errors */
+
+ FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \
+ "invalid glyph index" )
+ FT_ERRORDEF_( Invalid_Character_Code, 0x11, \
+ "invalid character code" )
+ FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \
+ "unsupported glyph image format" )
+ FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \
+ "cannot render this glyph format" )
+ FT_ERRORDEF_( Invalid_Outline, 0x14, \
+ "invalid outline" )
+ FT_ERRORDEF_( Invalid_Composite, 0x15, \
+ "invalid composite glyph" )
+ FT_ERRORDEF_( Too_Many_Hints, 0x16, \
+ "too many hints" )
+ FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \
+ "invalid pixel size" )
+
+ /* handle errors */
+
+ FT_ERRORDEF_( Invalid_Handle, 0x20, \
+ "invalid object handle" )
+ FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \
+ "invalid library handle" )
+ FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \
+ "invalid module handle" )
+ FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \
+ "invalid face handle" )
+ FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \
+ "invalid size handle" )
+ FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \
+ "invalid glyph slot handle" )
+ FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \
+ "invalid charmap handle" )
+ FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \
+ "invalid cache manager handle" )
+ FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \
+ "invalid stream handle" )
+
+ /* driver errors */
+
+ FT_ERRORDEF_( Too_Many_Drivers, 0x30, \
+ "too many modules" )
+ FT_ERRORDEF_( Too_Many_Extensions, 0x31, \
+ "too many extensions" )
+
+ /* memory errors */
+
+ FT_ERRORDEF_( Out_Of_Memory, 0x40, \
+ "out of memory" )
+ FT_ERRORDEF_( Unlisted_Object, 0x41, \
+ "unlisted object" )
+
+ /* stream errors */
+
+ FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \
+ "cannot open stream" )
+ FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \
+ "invalid stream seek" )
+ FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \
+ "invalid stream skip" )
+ FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \
+ "invalid stream read" )
+ FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \
+ "invalid stream operation" )
+ FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \
+ "invalid frame operation" )
+ FT_ERRORDEF_( Nested_Frame_Access, 0x57, \
+ "nested frame access" )
+ FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \
+ "invalid frame read" )
+
+ /* raster errors */
+
+ FT_ERRORDEF_( Raster_Uninitialized, 0x60, \
+ "raster uninitialized" )
+ FT_ERRORDEF_( Raster_Corrupted, 0x61, \
+ "raster corrupted" )
+ FT_ERRORDEF_( Raster_Overflow, 0x62, \
+ "raster overflow" )
+ FT_ERRORDEF_( Raster_Negative_Height, 0x63, \
+ "negative height while rastering" )
+
+ /* cache errors */
+
+ FT_ERRORDEF_( Too_Many_Caches, 0x70, \
+ "too many registered caches" )
+
+ /* TrueType and SFNT errors */
+
+ FT_ERRORDEF_( Invalid_Opcode, 0x80, \
+ "invalid opcode" )
+ FT_ERRORDEF_( Too_Few_Arguments, 0x81, \
+ "too few arguments" )
+ FT_ERRORDEF_( Stack_Overflow, 0x82, \
+ "stack overflow" )
+ FT_ERRORDEF_( Code_Overflow, 0x83, \
+ "code overflow" )
+ FT_ERRORDEF_( Bad_Argument, 0x84, \
+ "bad argument" )
+ FT_ERRORDEF_( Divide_By_Zero, 0x85, \
+ "division by zero" )
+ FT_ERRORDEF_( Invalid_Reference, 0x86, \
+ "invalid reference" )
+ FT_ERRORDEF_( Debug_OpCode, 0x87, \
+ "found debug opcode" )
+ FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \
+ "found ENDF opcode in execution stream" )
+ FT_ERRORDEF_( Nested_DEFS, 0x89, \
+ "nested DEFS" )
+ FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \
+ "invalid code range" )
+ FT_ERRORDEF_( Execution_Too_Long, 0x8B, \
+ "execution context too long" )
+ FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \
+ "too many function definitions" )
+ FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \
+ "too many instruction definitions" )
+ FT_ERRORDEF_( Table_Missing, 0x8E, \
+ "SFNT font table missing" )
+ FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \
+ "horizontal header (hhea) table missing" )
+ FT_ERRORDEF_( Locations_Missing, 0x90, \
+ "locations (loca) table missing" )
+ FT_ERRORDEF_( Name_Table_Missing, 0x91, \
+ "name table missing" )
+ FT_ERRORDEF_( CMap_Table_Missing, 0x92, \
+ "character map (cmap) table missing" )
+ FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \
+ "horizontal metrics (hmtx) table missing" )
+ FT_ERRORDEF_( Post_Table_Missing, 0x94, \
+ "PostScript (post) table missing" )
+ FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \
+ "invalid horizontal metrics" )
+ FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \
+ "invalid character map (cmap) format" )
+ FT_ERRORDEF_( Invalid_PPem, 0x97, \
+ "invalid ppem value" )
+ FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \
+ "invalid vertical metrics" )
+ FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \
+ "could not find context" )
+ FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \
+ "invalid PostScript (post) table format" )
+ FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \
+ "invalid PostScript (post) table" )
+
+ /* CFF, CID, and Type 1 errors */
+
+ FT_ERRORDEF_( Syntax_Error, 0xA0, \
+ "opcode syntax error" )
+ FT_ERRORDEF_( Stack_Underflow, 0xA1, \
+ "argument stack underflow" )
+ FT_ERRORDEF_( Ignore, 0xA2, \
+ "ignore" )
+ FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \
+ "no Unicode glyph name found" )
+ FT_ERRORDEF_( Glyph_Too_Big, 0xA4, \
+ "glyph to big for hinting" )
+
+ /* BDF errors */
+
+ FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \
+ "`STARTFONT' field missing" )
+ FT_ERRORDEF_( Missing_Font_Field, 0xB1, \
+ "`FONT' field missing" )
+ FT_ERRORDEF_( Missing_Size_Field, 0xB2, \
+ "`SIZE' field missing" )
+ FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \
+ "`FONTBOUNDINGBOX' field missing" )
+ FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \
+ "`CHARS' field missing" )
+ FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \
+ "`STARTCHAR' field missing" )
+ FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \
+ "`ENCODING' field missing" )
+ FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \
+ "`BBX' field missing" )
+ FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \
+ "`BBX' too big" )
+ FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \
+ "Font header corrupted or missing fields" )
+ FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \
+ "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
new file mode 100644
index 0000000000..bd69d0f5e1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
@@ -0,0 +1,198 @@
+/***************************************************************************/
+/* */
+/* fterrors.h */
+/* */
+/* FreeType error code handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This special header file is used to define the handling of FT2 */
+ /* enumeration constants. It can also be used to generate error message */
+ /* strings with a small macro trick explained below. */
+ /* */
+ /* I - Error Formats */
+ /* ----------------- */
+ /* */
+ /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */
+ /* defined in ftoption.h in order to make the higher byte indicate */
+ /* the module where the error has happened (this is not compatible */
+ /* with standard builds of FreeType 2). See the file `ftmoderr.h' for */
+ /* more details. */
+ /* */
+ /* */
+ /* II - Error Message strings */
+ /* -------------------------- */
+ /* */
+ /* The error definitions below are made through special macros that */
+ /* allow client applications to build a table of error message strings */
+ /* if they need it. The strings are not included in a normal build of */
+ /* FreeType 2 to save space (most client applications do not use */
+ /* them). */
+ /* */
+ /* To do so, you have to define the following macros before including */
+ /* this file: */
+ /* */
+ /* FT_ERROR_START_LIST :: */
+ /* This macro is called before anything else to define the start of */
+ /* the error list. It is followed by several FT_ERROR_DEF calls */
+ /* (see below). */
+ /* */
+ /* FT_ERROR_DEF( e, v, s ) :: */
+ /* This macro is called to define one single error. */
+ /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */
+ /* `v' is the error numerical value. */
+ /* `s' is the corresponding error string. */
+ /* */
+ /* FT_ERROR_END_LIST :: */
+ /* This macro ends the list. */
+ /* */
+ /* Additionally, you have to undefine __FTERRORS_H__ before #including */
+ /* this file. */
+ /* */
+ /* Here is a simple example: */
+ /* */
+ /* { */
+ /* #undef __FTERRORS_H__ */
+ /* #define FT_ERRORDEF( e, v, s ) { e, s }, */
+ /* #define FT_ERROR_START_LIST { */
+ /* #define FT_ERROR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int err_code; */
+ /* const char* err_msg; */
+ /* } ft_errors[] = */
+ /* */
+ /* #include "fterrors.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+ /* include module base error codes */
+#include "ftmoderr.h"
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+
+ /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+ /* By default, we use `FT_Err_'. */
+ /* */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX FT_Err_
+#endif
+
+
+ /* FT_ERR_BASE is used as the base for module-specific errors. */
+ /* */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE 0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+ /* If FT_ERRORDEF is not defined, we need to define a simple */
+ /* enumeration type. */
+ /* */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s ) e = v,
+#define FT_ERROR_START_LIST enum {
+#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+ /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+ /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+ FT_ERROR_START_LIST
+#endif
+
+
+ /* now include the error codes */
+#include "fterrdef.h"
+
+
+#ifdef FT_ERROR_END_LIST
+ FT_ERROR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SIMPLE CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+ /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
new file mode 100644
index 0000000000..ff0a34acc6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/* */
+/* ftgasp.h */
+/* */
+/* Access of TrueType's `gasp' table (specification). */
+/* */
+/* Copyright 2007, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+ /***************************************************************************
+ *
+ * @section:
+ * gasp_table
+ *
+ * @title:
+ * Gasp Table
+ *
+ * @abstract:
+ * Retrieving TrueType `gasp' table entries.
+ *
+ * @description:
+ * The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+ * font for specific entries in its `gasp' table, if any. This is
+ * mainly useful when implementing native TrueType hinting with the
+ * bytecode interpreter to duplicate the Windows text rendering results.
+ */
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_GASP_XXX
+ *
+ * @description:
+ * A list of values and/or bit-flags returned by the @FT_Get_Gasp
+ * function.
+ *
+ * @values:
+ * FT_GASP_NO_TABLE ::
+ * This special value means that there is no GASP table in this face.
+ * It is up to the client to decide what to do.
+ *
+ * FT_GASP_DO_GRIDFIT ::
+ * Grid-fitting and hinting should be performed at the specified ppem.
+ * This *really* means TrueType bytecode interpretation. If this bit
+ * is not set, no hinting gets applied.
+ *
+ * FT_GASP_DO_GRAY ::
+ * Anti-aliased rendering should be performed at the specified ppem.
+ * If not set, do monochrome rendering.
+ *
+ * FT_GASP_SYMMETRIC_SMOOTHING ::
+ * If set, smoothing along multiple axes must be used with ClearType.
+ *
+ * FT_GASP_SYMMETRIC_GRIDFIT ::
+ * Grid-fitting must be used with ClearType's symmetric smoothing.
+ *
+ * @note:
+ * The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+ * used for standard font rasterization only. Independently of that,
+ * `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+ * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+ * `FT_GASP_DO_GRAY' are consequently ignored).
+ *
+ * `ClearType' is Microsoft's implementation of LCD rendering, partly
+ * protected by patents.
+ *
+ * @since:
+ * 2.3.0
+ */
+#define FT_GASP_NO_TABLE -1
+#define FT_GASP_DO_GRIDFIT 0x01
+#define FT_GASP_DO_GRAY 0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING 0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT 0x10
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_Gasp
+ *
+ * @description:
+ * Read the `gasp' table from a TrueType or OpenType font file and
+ * return the entry corresponding to a given character pixel size.
+ *
+ * @input:
+ * face :: The source face handle.
+ * ppem :: The vertical character pixel size.
+ *
+ * @return:
+ * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+ * `gasp' table in the face.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Gasp( FT_Face face,
+ FT_UInt ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
new file mode 100644
index 0000000000..ec2d9d89c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/* */
+/* ftglyph.h */
+/* */
+/* FreeType convenience functions to handle glyphs (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of several convenience functions */
+ /* that can be used by client applications to easily retrieve glyph */
+ /* bitmaps and outlines from a given face. */
+ /* */
+ /* These functions should be optional if you are writing a font server */
+ /* or text layout engine on top of FreeType. However, they are pretty */
+ /* handy for many other simple uses of the library. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_management */
+ /* */
+ /* <Title> */
+ /* Glyph Management */
+ /* */
+ /* <Abstract> */
+ /* Generic interface to manage individual glyph data. */
+ /* */
+ /* <Description> */
+ /* This section contains definitions used to manage glyph data */
+ /* through generic FT_Glyph objects. Each of them can contain a */
+ /* bitmap, a vector outline, or even images in other formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* forward declaration to a private type */
+ typedef struct FT_Glyph_Class_ FT_Glyph_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Glyph */
+ /* */
+ /* <Description> */
+ /* Handle to an object used to model generic glyph images. It is a */
+ /* pointer to the @FT_GlyphRec structure and can contain a glyph */
+ /* bitmap or pointer. */
+ /* */
+ /* <Note> */
+ /* Glyph objects are not owned by the library. You must thus release */
+ /* them manually (through @FT_Done_Glyph) _before_ calling */
+ /* @FT_Done_FreeType. */
+ /* */
+ typedef struct FT_GlyphRec_* FT_Glyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphRec */
+ /* */
+ /* <Description> */
+ /* The root glyph structure contains a given glyph image plus its */
+ /* advance width in 16.16 fixed-point format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library object. */
+ /* */
+ /* clazz :: A pointer to the glyph's class. Private. */
+ /* */
+ /* format :: The format of the glyph's image. */
+ /* */
+ /* advance :: A 16.16 vector that gives the glyph's advance width. */
+ /* */
+ typedef struct FT_GlyphRec_
+ {
+ FT_Library library;
+ const FT_Glyph_Class* clazz;
+ FT_Glyph_Format format;
+ FT_Vector advance;
+
+ } FT_GlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_BitmapGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a bitmap glyph image. This is */
+ /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BitmapGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for bitmap glyph images. This really is a */
+ /* `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* left :: The left-side bearing, i.e., the horizontal distance */
+ /* from the current pen position to the left border of the */
+ /* glyph bitmap. */
+ /* */
+ /* top :: The top-side bearing, i.e., the vertical distance from */
+ /* the current pen position to the top border of the glyph */
+ /* bitmap. This distance is positive for upwards~y! */
+ /* */
+ /* bitmap :: A descriptor for the bitmap. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */
+ /* the bitmap's contents easily. */
+ /* */
+ /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */
+ /* and is thus created and destroyed with it. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Int left;
+ FT_Int top;
+ FT_Bitmap bitmap;
+
+ } FT_BitmapGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_OutlineGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model an outline glyph image. This */
+ /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_OutlineGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for outline (vectorial) glyph images. This */
+ /* really is a `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* outline :: A descriptor for the outline. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */
+ /* the outline's content easily. */
+ /* */
+ /* As the outline is extracted from a glyph slot, its coordinates are */
+ /* expressed normally in 26.6 pixels, unless the flag */
+ /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+ /* */
+ /* The outline's tables are always owned by the object and are */
+ /* destroyed with it. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Outline outline;
+
+ } FT_OutlineGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to extract a glyph image from a slot. Note that */
+ /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the source glyph slot. */
+ /* */
+ /* <Output> */
+ /* aglyph :: A handle to the glyph object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph( FT_GlyphSlot slot,
+ FT_Glyph *aglyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Copy */
+ /* */
+ /* <Description> */
+ /* A function used to copy a glyph image. Note that the created */
+ /* @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source glyph object. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target glyph object. 0~in case of */
+ /* error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Copy( FT_Glyph source,
+ FT_Glyph *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a glyph image if its format is scalable. */
+ /* */
+ /* <InOut> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to a 2x2 matrix to apply. */
+ /* */
+ /* delta :: A pointer to a 2d vector to apply. Coordinates are */
+ /* expressed in 1/64th of a pixel. */
+ /* */
+ /* <Return> */
+ /* FreeType error code (if not 0, the glyph format is not scalable). */
+ /* */
+ /* <Note> */
+ /* The 2x2 transformation matrix is also applied to the glyph's */
+ /* advance vector. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Transform( FT_Glyph glyph,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_BBox_Mode */
+ /* */
+ /* <Description> */
+ /* The mode how the values of @FT_Glyph_Get_CBox are returned. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_BBOX_UNSCALED :: */
+ /* Return unscaled font units. */
+ /* */
+ /* FT_GLYPH_BBOX_SUBPIXELS :: */
+ /* Return unfitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_GRIDFIT :: */
+ /* Return grid-fitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_TRUNCATE :: */
+ /* Return coordinates in integer pixels. */
+ /* */
+ /* FT_GLYPH_BBOX_PIXELS :: */
+ /* Return grid-fitted pixel coordinates. */
+ /* */
+ typedef enum FT_Glyph_BBox_Mode_
+ {
+ FT_GLYPH_BBOX_UNSCALED = 0,
+ FT_GLYPH_BBOX_SUBPIXELS = 0,
+ FT_GLYPH_BBOX_GRIDFIT = 1,
+ FT_GLYPH_BBOX_TRUNCATE = 2,
+ FT_GLYPH_BBOX_PIXELS = 3
+
+ } FT_Glyph_BBox_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_bbox_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Glyph_BBox_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */
+ /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */
+ /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */
+ /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */
+ /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return a glyph's `control box'. The control box encloses all the */
+ /* outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the source glyph object. */
+ /* */
+ /* mode :: The mode which indicates how to interpret the returned */
+ /* bounding box values. */
+ /* */
+ /* <Output> */
+ /* acbox :: The glyph coordinate bounding box. Coordinates are */
+ /* expressed in 1/64th of pixels if it is grid-fitted. */
+ /* */
+ /* <Note> */
+ /* Coordinates are relative to the glyph origin, using the y~upwards */
+ /* convention. */
+ /* */
+ /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */
+ /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */
+ /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */
+ /* is another name for this constant. */
+ /* */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get */
+ /* reasonable values for the CBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the CBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ /* Note that the maximum coordinates are exclusive, which means that */
+ /* one can compute the width and height of the glyph image (be it in */
+ /* integer or 26.6 pixels) as: */
+ /* */
+ /* { */
+ /* width = bbox.xMax - bbox.xMin; */
+ /* height = bbox.yMax - bbox.yMin; */
+ /* } */
+ /* */
+ /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */
+ /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */
+ /* which corresponds to: */
+ /* */
+ /* { */
+ /* bbox.xMin = FLOOR(bbox.xMin); */
+ /* bbox.yMin = FLOOR(bbox.yMin); */
+ /* bbox.xMax = CEILING(bbox.xMax); */
+ /* bbox.yMax = CEILING(bbox.yMax); */
+ /* } */
+ /* */
+ /* To get the bbox in pixel coordinates, set `bbox_mode' to */
+ /* @FT_GLYPH_BBOX_TRUNCATE. */
+ /* */
+ /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */
+ /* to @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+ FT_EXPORT( void )
+ FT_Glyph_Get_CBox( FT_Glyph glyph,
+ FT_UInt bbox_mode,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_To_Bitmap */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph object to a bitmap glyph object. */
+ /* */
+ /* <InOut> */
+ /* the_glyph :: A pointer to a handle to the target glyph. */
+ /* */
+ /* <Input> */
+ /* render_mode :: An enumeration that describes how the data is */
+ /* rendered. */
+ /* */
+ /* origin :: A pointer to a vector used to translate the glyph */
+ /* image before rendering. Can be~0 (if no */
+ /* translation). The origin is expressed in */
+ /* 26.6 pixels. */
+ /* */
+ /* destroy :: A boolean that indicates that the original glyph */
+ /* image should be destroyed by this function. It is */
+ /* never destroyed in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does nothing if the glyph format isn't scalable. */
+ /* */
+ /* The glyph image is translated with the `origin' vector before */
+ /* rendering. */
+ /* */
+ /* The first parameter is a pointer to an @FT_Glyph handle, that will */
+ /* be _replaced_ by this function (with newly allocated data). */
+ /* Typically, you would use (omitting error handling): */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyph; */
+ /* FT_BitmapGlyph glyph_bitmap; */
+ /* */
+ /* */
+ /* // load glyph */
+ /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */
+ /* */
+ /* // extract glyph image */
+ /* error = FT_Get_Glyph( face->glyph, &glyph ); */
+ /* */
+ /* // convert to a bitmap (default render mode + destroying old) */
+ /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */
+ /* { */
+ /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */
+ /* 0, 1 ); */
+ /* if ( error ) // `glyph' unchanged */
+ /* ... */
+ /* } */
+ /* */
+ /* // access bitmap content by typecasting */
+ /* glyph_bitmap = (FT_BitmapGlyph)glyph; */
+ /* */
+ /* // do funny stuff with it, like blitting/drawing */
+ /* ... */
+ /* */
+ /* // discard glyph image (bitmap or not) */
+ /* FT_Done_Glyph( glyph ); */
+ /* } */
+ /* */
+ /* */
+ /* Here another example, again without error handling: */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyphs[MAX_GLYPHS] */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */
+ /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* { */
+ /* FT_Glyph bitmap = glyphs[idx]; */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* // after this call, `bitmap' no longer points into */
+ /* // the `glyphs' array (and the old value isn't destroyed) */
+ /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */
+ /* */
+ /* ... */
+ /* */
+ /* FT_Done_Glyph( bitmap ); */
+ /* } */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* FT_Done_Glyph( glyphs[idx] ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_To_Bitmap( FT_Glyph* the_glyph,
+ FT_Render_Mode render_mode,
+ FT_Vector* origin,
+ FT_Bool destroy );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Glyph */
+ /* */
+ /* <Description> */
+ /* Destroy a given glyph. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Done_Glyph( FT_Glyph glyph );
+
+ /* */
+
+
+ /* other helpful functions */
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Multiply */
+ /* */
+ /* <Description> */
+ /* Perform the matrix operation `b = a*b'. */
+ /* */
+ /* <Input> */
+ /* a :: A pointer to matrix `a'. */
+ /* */
+ /* <InOut> */
+ /* b :: A pointer to matrix `b'. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `a' or `b' is zero. */
+ /* */
+ FT_EXPORT( void )
+ FT_Matrix_Multiply( const FT_Matrix* a,
+ FT_Matrix* b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Invert */
+ /* */
+ /* <Description> */
+ /* Invert a 2x2 matrix. Return an error if it can't be inverted. */
+ /* */
+ /* <InOut> */
+ /* matrix :: A pointer to the target matrix. Remains untouched in */
+ /* case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Matrix_Invert( FT_Matrix* matrix );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
new file mode 100644
index 0000000000..763652a012
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/* */
+/* ftgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006 by */
+/* Masatake YAMATO, Redhat K.K, */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gx_validation */
+ /* */
+ /* <Title> */
+ /* TrueTypeGX/AAT Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate TrueTypeGX/AAT tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */
+ /* trak, prop, lcar). */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* */
+ /* Warning: Use FT_VALIDATE_XXX to validate a table. */
+ /* Following definitions are for gxvalid developers. */
+ /* */
+ /* */
+ /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX 0
+#define FT_VALIDATE_mort_INDEX 1
+#define FT_VALIDATE_morx_INDEX 2
+#define FT_VALIDATE_bsln_INDEX 3
+#define FT_VALIDATE_just_INDEX 4
+#define FT_VALIDATE_kern_INDEX 5
+#define FT_VALIDATE_opbd_INDEX 6
+#define FT_VALIDATE_trak_INDEX 7
+#define FT_VALIDATE_prop_INDEX 8
+#define FT_VALIDATE_lcar_INDEX 9
+#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_VALIDATE_GX_LENGTH
+ *
+ * @description:
+ * The number of tables checked in this module. Use it as a parameter
+ * for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+ */
+#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+ /* */
+
+ /* Up to 0x1000 is used by otvalid.
+ Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag ) \
+ ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_GXXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+ * indicate which TrueTypeGX/AAT Type tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_feat ::
+ * Validate `feat' table.
+ *
+ * FT_VALIDATE_mort ::
+ * Validate `mort' table.
+ *
+ * FT_VALIDATE_morx ::
+ * Validate `morx' table.
+ *
+ * FT_VALIDATE_bsln ::
+ * Validate `bsln' table.
+ *
+ * FT_VALIDATE_just ::
+ * Validate `just' table.
+ *
+ * FT_VALIDATE_kern ::
+ * Validate `kern' table.
+ *
+ * FT_VALIDATE_opbd ::
+ * Validate `opbd' table.
+ *
+ * FT_VALIDATE_trak ::
+ * Validate `trak' table.
+ *
+ * FT_VALIDATE_prop ::
+ * Validate `prop' table.
+ *
+ * FT_VALIDATE_lcar ::
+ * Validate `lcar' table.
+ *
+ * FT_VALIDATE_GX ::
+ * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+ * opbd, trak, prop and lcar).
+ *
+ */
+
+#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \
+ FT_VALIDATE_mort | \
+ FT_VALIDATE_morx | \
+ FT_VALIDATE_bsln | \
+ FT_VALIDATE_just | \
+ FT_VALIDATE_kern | \
+ FT_VALIDATE_opbd | \
+ FT_VALIDATE_trak | \
+ FT_VALIDATE_prop | \
+ FT_VALIDATE_lcar )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Validate
+ *
+ * @description:
+ * Validate various TrueTypeGX tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_GXXXX for possible values.
+ *
+ * table_length ::
+ * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH
+ * should be passed.
+ *
+ * @output:
+ * tables ::
+ * The array where all validated sfnt tables are stored.
+ * The array itself must be allocated by a client.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with TrueTypeGX fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the buffers pointed to by
+ * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value
+ * indicates that the table either doesn't exist in the font, the
+ * application hasn't asked for validation, or the validator doesn't have
+ * the ability to validate the sfnt table.
+ */
+ FT_EXPORT( FT_Error )
+ FT_TrueTypeGX_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Free
+ *
+ * @description:
+ * Free the buffer allocated by TrueTypeGX validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer allocated by
+ * @FT_TrueTypeGX_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_TrueTypeGX_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_TrueTypeGX_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_CKERNXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_ClassicKern_Validate
+ * to indicate the classic kern dialect or dialects. If the selected
+ * type doesn't fit, @FT_ClassicKern_Validate regards the table as
+ * invalid.
+ *
+ * @values:
+ * FT_VALIDATE_MS ::
+ * Handle the `kern' table as a classic Microsoft kern table.
+ *
+ * FT_VALIDATE_APPLE ::
+ * Handle the `kern' table as a classic Apple kern table.
+ *
+ * FT_VALIDATE_CKERN ::
+ * Handle the `kern' as either classic Apple or Microsoft kern table.
+ */
+#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Validate
+ *
+ * @description:
+ * Validate classic (16-bit format) kern table to assure that the offsets
+ * and indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without error
+ * checking (which can be quite time consuming).
+ *
+ * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+ * the new 32-bit format and the classic 16-bit format, while
+ * FT_ClassicKern_Validate only supports the classic 16-bit format.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the dialect to be validated. See
+ * @FT_VALIDATE_CKERNXXX for possible values.
+ *
+ * @output:
+ * ckern_table ::
+ * A pointer to the kern table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * After use, the application should deallocate the buffers pointed to by
+ * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value
+ * indicates that the table doesn't exist in the font.
+ */
+ FT_EXPORT( FT_Error )
+ FT_ClassicKern_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *ckern_table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Free
+ *
+ * @description:
+ * Free the buffer allocated by classic Kern validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_ClassicKern_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_ClassicKern_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_ClassicKern_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
new file mode 100644
index 0000000000..87155a41bf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftgzip.h */
+/* */
+/* Gzip-compressed stream support. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gzip */
+ /* */
+ /* <Title> */
+ /* GZIP Streams */
+ /* */
+ /* <Abstract> */
+ /* Using gzip-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Gzip-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenGzip
+ *
+ * @description:
+ * Open a new stream to parse gzip-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.gz' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, gzip compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a gzipped stream from
+ * it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with zlib support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenGzip( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
new file mode 100644
index 0000000000..401cb38633
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
@@ -0,0 +1,1322 @@
+/***************************************************************************/
+/* */
+/* ftimage.h */
+/* */
+/* FreeType glyph image formats and default raster interface */
+/* (specification). */
+/* */
+/* Copyright 1996-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Note: A `raster' is simply a scan-line converter, used to render */
+ /* FT_Outlines into FT_Bitmaps. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+ /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include "../ft2build.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pos */
+ /* */
+ /* <Description> */
+ /* The type FT_Pos is used to store vectorial coordinates. Depending */
+ /* on the context, these can represent distances in integer font */
+ /* units, or 16.16, or 26.6 fixed-point pixel coordinates. */
+ /* */
+ typedef signed long FT_Pos;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Vector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector; coordinates are of */
+ /* the FT_Pos type. */
+ /* */
+ /* <Fields> */
+ /* x :: The horizontal coordinate. */
+ /* y :: The vertical coordinate. */
+ /* */
+ typedef struct FT_Vector_
+ {
+ FT_Pos x;
+ FT_Pos y;
+
+ } FT_Vector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BBox */
+ /* */
+ /* <Description> */
+ /* A structure used to hold an outline's bounding box, i.e., the */
+ /* coordinates of its extrema in the horizontal and vertical */
+ /* directions. */
+ /* */
+ /* <Fields> */
+ /* xMin :: The horizontal minimum (left-most). */
+ /* */
+ /* yMin :: The vertical minimum (bottom-most). */
+ /* */
+ /* xMax :: The horizontal maximum (right-most). */
+ /* */
+ /* yMax :: The vertical maximum (top-most). */
+ /* */
+ /* <Note> */
+ /* The bounding box is specified with the coordinates of the lower */
+ /* left and the upper right corner. In PostScript, those values are */
+ /* often called (llx,lly) and (urx,ury), respectively. */
+ /* */
+ /* If `yMin' is negative, this value gives the glyph's descender. */
+ /* Otherwise, the glyph doesn't descend below the baseline. */
+ /* Similarly, if `ymax' is positive, this value gives the glyph's */
+ /* ascender. */
+ /* */
+ /* `xMin' gives the horizontal distance from the glyph's origin to */
+ /* the left edge of the glyph's bounding box. If `xMin' is negative, */
+ /* the glyph extends to the left of the origin. */
+ /* */
+ typedef struct FT_BBox_
+ {
+ FT_Pos xMin, yMin;
+ FT_Pos xMax, yMax;
+
+ } FT_BBox;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Pixel_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of pixels in a */
+ /* given bitmap. Note that additional formats may be added in the */
+ /* future. */
+ /* */
+ /* <Values> */
+ /* FT_PIXEL_MODE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_PIXEL_MODE_MONO :: */
+ /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */
+ /* are stored in most-significant order (MSB), which means that */
+ /* the left-most pixel in a byte has value 128. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY :: */
+ /* An 8-bit bitmap, generally used to represent anti-aliased glyph */
+ /* images. Each pixel is stored in one byte. Note that the number */
+ /* of `gray' levels is stored in the `num_grays' field of the */
+ /* @FT_Bitmap structure (it generally is 256). */
+ /* */
+ /* FT_PIXEL_MODE_GRAY2 :: */
+ /* A 2-bit per pixel bitmap, used to represent embedded */
+ /* anti-aliased bitmaps in font files according to the OpenType */
+ /* specification. We haven't found a single font using this */
+ /* format, however. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY4 :: */
+ /* A 4-bit per pixel bitmap, representing embedded anti-aliased */
+ /* bitmaps in font files according to the OpenType specification. */
+ /* We haven't found a single font using this format, however. */
+ /* */
+ /* FT_PIXEL_MODE_LCD :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on LCD displays; the bitmap is three times */
+ /* wider than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD. */
+ /* */
+ /* FT_PIXEL_MODE_LCD_V :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on rotated LCD displays; the bitmap is three */
+ /* times taller than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD_V. */
+ /* */
+ /* FT_PIXEL_MODE_BGRA :: */
+ /* An image with four 8-bit channels per pixel, representing a */
+ /* color image (such as emoticons) with alpha channel. For each */
+ /* pixel, the format is BGRA, which means, the blue channel comes */
+ /* first in memory. The color channels are pre-multiplied and in */
+ /* the sRGB colorspace. For example, full red at half-translucent */
+ /* opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
+ /* See also @FT_LOAD_COLOR. */
+ /* */
+ typedef enum FT_Pixel_Mode_
+ {
+ FT_PIXEL_MODE_NONE = 0,
+ FT_PIXEL_MODE_MONO,
+ FT_PIXEL_MODE_GRAY,
+ FT_PIXEL_MODE_GRAY2,
+ FT_PIXEL_MODE_GRAY4,
+ FT_PIXEL_MODE_LCD,
+ FT_PIXEL_MODE_LCD_V,
+ FT_PIXEL_MODE_BGRA,
+
+ FT_PIXEL_MODE_MAX /* do not remove */
+
+ } FT_Pixel_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_pixel_mode_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Pixel_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */
+ /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */
+ /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */
+ /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */
+ /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */
+ /* */
+#define ft_pixel_mode_none FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Palette_Mode */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */
+ /* */
+ /* An enumeration type to describe the format of a bitmap palette, */
+ /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */
+ /* */
+ /* <Values> */
+ /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */
+ /* records. */
+ /* */
+ /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */
+ /* records. */
+ /* */
+ /* <Note> */
+ /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */
+ /* FreeType, these types are not handled by the library itself. */
+ /* */
+ typedef enum FT_Palette_Mode_
+ {
+ ft_palette_mode_rgb = 0,
+ ft_palette_mode_rgba,
+
+ ft_palette_mode_max /* do not remove */
+
+ } FT_Palette_Mode;
+
+ /* */
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a bitmap or pixmap to the raster. */
+ /* Note that we now manage pixmaps of various depths through the */
+ /* `pixel_mode' field. */
+ /* */
+ /* <Fields> */
+ /* rows :: The number of bitmap rows. */
+ /* */
+ /* width :: The number of pixels in bitmap row. */
+ /* */
+ /* pitch :: The pitch's absolute value is the number of bytes */
+ /* taken by one bitmap row, including padding. */
+ /* However, the pitch is positive when the bitmap has */
+ /* a `down' flow, and negative when it has an `up' */
+ /* flow. In all cases, the pitch is an offset to add */
+ /* to a bitmap pointer in order to go down one row. */
+ /* */
+ /* Note that `padding' means the alignment of a */
+ /* bitmap to a byte border, and FreeType functions */
+ /* normally align to the smallest possible integer */
+ /* value. */
+ /* */
+ /* For the B/W rasterizer, `pitch' is always an even */
+ /* number. */
+ /* */
+ /* To change the pitch of a bitmap (say, to make it a */
+ /* multiple of 4), use @FT_Bitmap_Convert. */
+ /* Alternatively, you might use callback functions to */
+ /* directly render to the application's surface; see */
+ /* the file `example2.cpp' in the tutorial for a */
+ /* demonstration. */
+ /* */
+ /* buffer :: A typeless pointer to the bitmap buffer. This */
+ /* value should be aligned on 32-bit boundaries in */
+ /* most cases. */
+ /* */
+ /* num_grays :: This field is only used with */
+ /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */
+ /* levels used in the bitmap. */
+ /* */
+ /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */
+ /* See @FT_Pixel_Mode for possible values. */
+ /* */
+ /* palette_mode :: This field is intended for paletted pixel modes; */
+ /* it indicates how the palette is stored. Not */
+ /* used currently. */
+ /* */
+ /* palette :: A typeless pointer to the bitmap palette; this */
+ /* field is intended for paletted pixel modes. Not */
+ /* used currently. */
+ /* */
+ /* <Note> */
+ /* For now, the only pixel modes supported by FreeType are mono and */
+ /* grays. However, drivers might be added in the future to support */
+ /* more `colorful' options. */
+ /* */
+ typedef struct FT_Bitmap_
+ {
+ int rows;
+ int width;
+ int pitch;
+ unsigned char* buffer;
+ short num_grays;
+ char pixel_mode;
+ char palette_mode;
+ void* palette;
+
+ } FT_Bitmap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline */
+ /* */
+ /* <Description> */
+ /* This structure is used to describe an outline to the scan-line */
+ /* converter. */
+ /* */
+ /* <Fields> */
+ /* n_contours :: The number of contours in the outline. */
+ /* */
+ /* n_points :: The number of points in the outline. */
+ /* */
+ /* points :: A pointer to an array of `n_points' @FT_Vector */
+ /* elements, giving the outline's point coordinates. */
+ /* */
+ /* tags :: A pointer to an array of `n_points' chars, giving */
+ /* each outline point's type. */
+ /* */
+ /* If bit~0 is unset, the point is `off' the curve, */
+ /* i.e., a Bézier control point, while it is `on' if */
+ /* set. */
+ /* */
+ /* Bit~1 is meaningful for `off' points only. If set, */
+ /* it indicates a third-order Bézier arc control point; */
+ /* and a second-order control point if unset. */
+ /* */
+ /* If bit~2 is set, bits 5-7 contain the drop-out mode */
+ /* (as defined in the OpenType specification; the value */
+ /* is the same as the argument to the SCANMODE */
+ /* instruction). */
+ /* */
+ /* Bits 3 and~4 are reserved for internal purposes. */
+ /* */
+ /* contours :: An array of `n_contours' shorts, giving the end */
+ /* point of each contour within the outline. For */
+ /* example, the first contour is defined by the points */
+ /* `0' to `contours[0]', the second one is defined by */
+ /* the points `contours[0]+1' to `contours[1]', etc. */
+ /* */
+ /* flags :: A set of bit flags used to characterize the outline */
+ /* and give hints to the scan-converter and hinter on */
+ /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */
+ /* */
+ /* <Note> */
+ /* The B/W rasterizer only checks bit~2 in the `tags' array for the */
+ /* first point of each contour. The drop-out mode as given with */
+ /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */
+ /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */
+ /* */
+ typedef struct FT_Outline_
+ {
+ short n_contours; /* number of contours in glyph */
+ short n_points; /* number of points in the glyph */
+
+ FT_Vector* points; /* the outline's points */
+ char* tags; /* the points flags */
+ short* contours; /* the contour end points */
+
+ int flags; /* outline masks */
+
+ } FT_Outline;
+
+ /* Following limits must be consistent with */
+ /* FT_Outline.{n_contours,n_points} */
+#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX SHRT_MAX
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OUTLINE_FLAGS */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants use for the flags in an outline's */
+ /* `flags' field. */
+ /* */
+ /* <Values> */
+ /* FT_OUTLINE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_OUTLINE_OWNER :: */
+ /* If set, this flag indicates that the outline's field arrays */
+ /* (i.e., `points', `flags', and `contours') are `owned' by the */
+ /* outline object, and should thus be freed when it is destroyed. */
+ /* */
+ /* FT_OUTLINE_EVEN_ODD_FILL :: */
+ /* By default, outlines are filled using the non-zero winding rule. */
+ /* If set to 1, the outline will be filled using the even-odd fill */
+ /* rule (only works with the smooth rasterizer). */
+ /* */
+ /* FT_OUTLINE_REVERSE_FILL :: */
+ /* By default, outside contours of an outline are oriented in */
+ /* clock-wise direction, as defined in the TrueType specification. */
+ /* This flag is set if the outline uses the opposite direction */
+ /* (typically for Type~1 fonts). This flag is ignored by the scan */
+ /* converter. */
+ /* */
+ /* FT_OUTLINE_IGNORE_DROPOUTS :: */
+ /* By default, the scan converter will try to detect drop-outs in */
+ /* an outline and correct the glyph bitmap to ensure consistent */
+ /* shape continuity. If set, this flag hints the scan-line */
+ /* converter to ignore such cases. See below for more information. */
+ /* */
+ /* FT_OUTLINE_SMART_DROPOUTS :: */
+ /* Select smart dropout control. If unset, use simple dropout */
+ /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */
+ /* below for more information. */
+ /* */
+ /* FT_OUTLINE_INCLUDE_STUBS :: */
+ /* If set, turn pixels on for `stubs', otherwise exclude them. */
+ /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */
+ /* more information. */
+ /* */
+ /* FT_OUTLINE_HIGH_PRECISION :: */
+ /* This flag indicates that the scan-line converter should try to */
+ /* convert this outline to bitmaps with the highest possible */
+ /* quality. It is typically set for small character sizes. Note */
+ /* that this is only a hint that might be completely ignored by a */
+ /* given scan-converter. */
+ /* */
+ /* FT_OUTLINE_SINGLE_PASS :: */
+ /* This flag is set to force a given scan-converter to only use a */
+ /* single pass over the outline to render a bitmap glyph image. */
+ /* Normally, it is set for very large character sizes. It is only */
+ /* a hint that might be completely ignored by a given */
+ /* scan-converter. */
+ /* */
+ /* <Note> */
+ /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+ /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */
+ /* rasterizer. */
+ /* */
+ /* There exists a second mechanism to pass the drop-out mode to the */
+ /* B/W rasterizer; see the `tags' field in @FT_Outline. */
+ /* */
+ /* Please refer to the description of the `SCANTYPE' instruction in */
+ /* the OpenType specification (in file `ttinst1.doc') how simple */
+ /* drop-outs, smart drop-outs, and stubs are defined. */
+ /* */
+#define FT_OUTLINE_NONE 0x0
+#define FT_OUTLINE_OWNER 0x1
+#define FT_OUTLINE_EVEN_ODD_FILL 0x2
+#define FT_OUTLINE_REVERSE_FILL 0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS 0x8
+#define FT_OUTLINE_SMART_DROPOUTS 0x10
+#define FT_OUTLINE_INCLUDE_STUBS 0x20
+
+#define FT_OUTLINE_HIGH_PRECISION 0x100
+#define FT_OUTLINE_SINGLE_PASS 0x200
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * ft_outline_flags
+ *
+ * @description:
+ * These constants are deprecated. Please use the corresponding
+ * @FT_OUTLINE_FLAGS values.
+ *
+ * @values:
+ * ft_outline_none :: See @FT_OUTLINE_NONE.
+ * ft_outline_owner :: See @FT_OUTLINE_OWNER.
+ * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL.
+ * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL.
+ * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+ * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION.
+ * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS.
+ */
+#define ft_outline_none FT_OUTLINE_NONE
+#define ft_outline_owner FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS
+
+ /* */
+
+#define FT_CURVE_TAG( flag ) ( flag & 3 )
+
+#define FT_CURVE_TAG_ON 1
+#define FT_CURVE_TAG_CONIC 0
+#define FT_CURVE_TAG_CUBIC 2
+
+#define FT_CURVE_TAG_HAS_SCANMODE 4
+
+#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \
+ FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_MoveToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `move */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `move to' is emitted to start a new contour in an outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `move to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_MoveToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_LineToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `line */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `line to' is emitted to indicate a segment in the outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `line to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_LineToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_LineTo_Func FT_Outline_LineToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_ConicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `conic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `conic to' is emitted to indicate a second-order Bézier arc in */
+ /* the outline. */
+ /* */
+ /* <Input> */
+ /* control :: An intermediate control point between the last position */
+ /* and the new target in `to'. */
+ /* */
+ /* to :: A pointer to the target end point of the conic arc. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_ConicToFunc)( const FT_Vector* control,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_CubicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `cubic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `cubic to' is emitted to indicate a third-order Bézier arc. */
+ /* */
+ /* <Input> */
+ /* control1 :: A pointer to the first Bézier control point. */
+ /* */
+ /* control2 :: A pointer to the second Bézier control point. */
+ /* */
+ /* to :: A pointer to the target end point. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_CubicToFunc)( const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure to hold various function pointers used during outline */
+ /* decomposition in order to emit segments, conic, and cubic Béziers. */
+ /* */
+ /* <Fields> */
+ /* move_to :: The `move to' emitter. */
+ /* */
+ /* line_to :: The segment emitter. */
+ /* */
+ /* conic_to :: The second-order Bézier arc emitter. */
+ /* */
+ /* cubic_to :: The third-order Bézier arc emitter. */
+ /* */
+ /* shift :: The shift that is applied to coordinates before they */
+ /* are sent to the emitter. */
+ /* */
+ /* delta :: The delta that is applied to coordinates before they */
+ /* are sent to the emitter, but after the shift. */
+ /* */
+ /* <Note> */
+ /* The point coordinates sent to the emitters are the transformed */
+ /* version of the original coordinates (this is important for high */
+ /* accuracy during scan-conversion). The transformation is simple: */
+ /* */
+ /* { */
+ /* x' = (x << shift) - delta */
+ /* y' = (x << shift) - delta */
+ /* } */
+ /* */
+ /* Set the values of `shift' and `delta' to~0 to get the original */
+ /* point coordinates. */
+ /* */
+ typedef struct FT_Outline_Funcs_
+ {
+ FT_Outline_MoveToFunc move_to;
+ FT_Outline_LineToFunc line_to;
+ FT_Outline_ConicToFunc conic_to;
+ FT_Outline_CubicToFunc cubic_to;
+
+ int shift;
+ FT_Pos delta;
+
+ } FT_Outline_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_IMAGE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags to an unsigned long type. */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \
+ value = ( ( (unsigned long)_x1 << 24 ) | \
+ ( (unsigned long)_x2 << 16 ) | \
+ ( (unsigned long)_x3 << 8 ) | \
+ (unsigned long)_x4 )
+#endif /* FT_IMAGE_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_Format */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of a given glyph */
+ /* image. Note that this version of FreeType only supports two image */
+ /* formats, even though future font drivers will be able to register */
+ /* their own format. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_FORMAT_NONE :: */
+ /* The value~0 is reserved. */
+ /* */
+ /* FT_GLYPH_FORMAT_COMPOSITE :: */
+ /* The glyph image is a composite of several other images. This */
+ /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */
+ /* report compound glyphs (like accented characters). */
+ /* */
+ /* FT_GLYPH_FORMAT_BITMAP :: */
+ /* The glyph image is a bitmap, and can be described as an */
+ /* @FT_Bitmap. You generally need to access the `bitmap' field of */
+ /* the @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_OUTLINE :: */
+ /* The glyph image is a vectorial outline made of line segments */
+ /* and Bézier arcs; it can be described as an @FT_Outline; you */
+ /* generally want to access the `outline' field of the */
+ /* @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_PLOTTER :: */
+ /* The glyph image is a vectorial path with no inside and outside */
+ /* contours. Some Type~1 fonts, like those in the Hershey family, */
+ /* contain glyphs in this format. These are described as */
+ /* @FT_Outline, but FreeType isn't currently capable of rendering */
+ /* them correctly. */
+ /* */
+ typedef enum FT_Glyph_Format_
+ {
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' )
+
+ } FT_Glyph_Format;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_format_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Glyph_Format values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */
+ /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */
+ /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */
+ /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */
+ /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */
+ /* */
+#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** R A S T E R D E F I N I T I O N S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* A raster is a scan converter, in charge of rendering an outline into */
+ /* a a bitmap. This section contains the public API for rasters. */
+ /* */
+ /* Note that in FreeType 2, all rasters are now encapsulated within */
+ /* specific modules called `renderers'. See `freetype/ftrender.h' for */
+ /* more details on renderers. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* raster */
+ /* */
+ /* <Title> */
+ /* Scanline Converter */
+ /* */
+ /* <Abstract> */
+ /* How vectorial outlines are converted into bitmaps and pixmaps. */
+ /* */
+ /* <Description> */
+ /* This section contains technical definitions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Raster */
+ /* */
+ /* <Description> */
+ /* A handle (pointer) to a raster object. Each object can be used */
+ /* independently to convert an outline into a bitmap or pixmap. */
+ /* */
+ typedef struct FT_RasterRec_* FT_Raster;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Span */
+ /* */
+ /* <Description> */
+ /* A structure used to model a single span of gray (or black) pixels */
+ /* when rendering a monochrome or anti-aliased bitmap. */
+ /* */
+ /* <Fields> */
+ /* x :: The span's horizontal start position. */
+ /* */
+ /* len :: The span's length in pixels. */
+ /* */
+ /* coverage :: The span color/coverage, ranging from 0 (background) */
+ /* to 255 (foreground). Only used for anti-aliased */
+ /* rendering. */
+ /* */
+ /* <Note> */
+ /* This structure is used by the span drawing callback type named */
+ /* @FT_SpanFunc which takes the y~coordinate of the span as a */
+ /* a parameter. */
+ /* */
+ /* The coverage value is always between 0 and 255. If you want less */
+ /* gray values, the callback function has to reduce them. */
+ /* */
+ typedef struct FT_Span_
+ {
+ short x;
+ unsigned short len;
+ unsigned char coverage;
+
+ } FT_Span;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_SpanFunc */
+ /* */
+ /* <Description> */
+ /* A function used as a call-back by the anti-aliased renderer in */
+ /* order to let client applications draw themselves the gray pixel */
+ /* spans on each scan line. */
+ /* */
+ /* <Input> */
+ /* y :: The scanline's y~coordinate. */
+ /* */
+ /* count :: The number of spans to draw on this scanline. */
+ /* */
+ /* spans :: A table of `count' spans to draw on the scanline. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Note> */
+ /* This callback allows client applications to directly render the */
+ /* gray spans of the anti-aliased bitmap to any kind of surfaces. */
+ /* */
+ /* This can be used to write anti-aliased outlines directly to a */
+ /* given background bitmap, and even perform translucency. */
+ /* */
+ /* Note that the `count' field cannot be greater than a fixed value */
+ /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */
+ /* `ftoption.h'. By default, this value is set to~32, which means */
+ /* that if there are more than 32~spans on a given scanline, the */
+ /* callback is called several times with the same `y' parameter in */
+ /* order to draw all callbacks. */
+ /* */
+ /* Otherwise, the callback is only called once per scan-line, and */
+ /* only for those scanlines that do have `gray' pixels on them. */
+ /* */
+ typedef void
+ (*FT_SpanFunc)( int y,
+ int count,
+ const FT_Span* spans,
+ void* user );
+
+#define FT_Raster_Span_Func FT_SpanFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitTest_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to test whether a given target pixel is already set to the drawing */
+ /* `color'. These tests are crucial to implement drop-out control */
+ /* per-se the TrueType spec. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef int
+ (*FT_Raster_BitTest_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitSet_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to set an individual target pixel. This is crucial to implement */
+ /* drop-out control according to the TrueType specification. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef void
+ (*FT_Raster_BitSet_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_RASTER_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flag constants as used in the `flags' field of a */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* <Values> */
+ /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */
+ /* */
+ /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */
+ /* anti-aliased glyph image should be */
+ /* generated. Otherwise, it will be */
+ /* monochrome (1-bit). */
+ /* */
+ /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */
+ /* rendering. In this mode, client */
+ /* applications must provide their own span */
+ /* callback. This lets them directly */
+ /* draw or compose over an existing bitmap. */
+ /* If this bit is not set, the target */
+ /* pixmap's buffer _must_ be zeroed before */
+ /* rendering. */
+ /* */
+ /* Note that for now, direct rendering is */
+ /* only possible with anti-aliased glyphs. */
+ /* */
+ /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */
+ /* rendering mode. If set, the output will */
+ /* be clipped to a box specified in the */
+ /* `clip_box' field of the */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* Note that by default, the glyph bitmap */
+ /* is clipped to the target pixmap, except */
+ /* in direct rendering mode where all spans */
+ /* are generated if no clipping box is set. */
+ /* */
+#define FT_RASTER_FLAG_DEFAULT 0x0
+#define FT_RASTER_FLAG_AA 0x1
+#define FT_RASTER_FLAG_DIRECT 0x2
+#define FT_RASTER_FLAG_CLIP 0x4
+
+ /* deprecated */
+#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Params */
+ /* */
+ /* <Description> */
+ /* A structure to hold the arguments used by a raster's render */
+ /* function. */
+ /* */
+ /* <Fields> */
+ /* target :: The target bitmap. */
+ /* */
+ /* source :: A pointer to the source glyph image (e.g., an */
+ /* @FT_Outline). */
+ /* */
+ /* flags :: The rendering flags. */
+ /* */
+ /* gray_spans :: The gray span drawing callback. */
+ /* */
+ /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_test :: The bit test callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_set :: The bit set callback. UNIMPLEMENTED! */
+ /* */
+ /* user :: User-supplied data that is passed to each drawing */
+ /* callback. */
+ /* */
+ /* clip_box :: An optional clipping box. It is only used in */
+ /* direct rendering mode. Note that coordinates here */
+ /* should be expressed in _integer_ pixels (and not in */
+ /* 26.6 fixed-point units). */
+ /* */
+ /* <Note> */
+ /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */
+ /* bit flag is set in the `flags' field, otherwise a monochrome */
+ /* bitmap is generated. */
+ /* */
+ /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */
+ /* raster will call the `gray_spans' callback to draw gray pixel */
+ /* spans, in the case of an aa glyph bitmap, it will call */
+ /* `black_spans', and `bit_test' and `bit_set' in the case of a */
+ /* monochrome bitmap. This allows direct composition over a */
+ /* pre-existing bitmap through user-provided callbacks to perform the */
+ /* span drawing/composition. */
+ /* */
+ /* Note that the `bit_test' and `bit_set' callbacks are required when */
+ /* rendering a monochrome bitmap, as they are crucial to implement */
+ /* correct drop-out control as defined in the TrueType specification. */
+ /* */
+ typedef struct FT_Raster_Params_
+ {
+ const FT_Bitmap* target;
+ const void* source;
+ int flags;
+ FT_SpanFunc gray_spans;
+ FT_SpanFunc black_spans; /* doesn't work! */
+ FT_Raster_BitTest_Func bit_test; /* doesn't work! */
+ FT_Raster_BitSet_Func bit_set; /* doesn't work! */
+ void* user;
+ FT_BBox clip_box;
+
+ } FT_Raster_Params;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_NewFunc */
+ /* */
+ /* <Description> */
+ /* A function used to create a new raster object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory allocator. */
+ /* */
+ /* <Output> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `memory' parameter is a typeless pointer in order to avoid */
+ /* un-wanted dependencies on the rest of the FreeType code. In */
+ /* practice, it is an @FT_Memory object, i.e., a handle to the */
+ /* standard FreeType memory allocator. However, this field can be */
+ /* completely ignored by a given raster implementation. */
+ /* */
+ typedef int
+ (*FT_Raster_NewFunc)( void* memory,
+ FT_Raster* raster );
+
+#define FT_Raster_New_Func FT_Raster_NewFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_DoneFunc */
+ /* */
+ /* <Description> */
+ /* A function used to destroy a given raster object. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ typedef void
+ (*FT_Raster_DoneFunc)( FT_Raster raster );
+
+#define FT_Raster_Done_Func FT_Raster_DoneFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_ResetFunc */
+ /* */
+ /* <Description> */
+ /* FreeType provides an area of memory called the `render pool', */
+ /* available to all registered rasters. This pool can be freely used */
+ /* during a given scan-conversion but is shared by all rasters. Its */
+ /* content is thus transient. */
+ /* */
+ /* This function is called each time the render pool changes, or just */
+ /* after a new raster object is created. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* pool_base :: The address in memory of the render pool. */
+ /* */
+ /* pool_size :: The size in bytes of the render pool. */
+ /* */
+ /* <Note> */
+ /* Rasters can ignore the render pool and rely on dynamic memory */
+ /* allocation if they want to (a handle to the memory allocator is */
+ /* passed to the raster constructor). However, this is not */
+ /* recommended for efficiency purposes. */
+ /* */
+ typedef void
+ (*FT_Raster_ResetFunc)( FT_Raster raster,
+ unsigned char* pool_base,
+ unsigned long pool_size );
+
+#define FT_Raster_Reset_Func FT_Raster_ResetFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_SetModeFunc */
+ /* */
+ /* <Description> */
+ /* This function is a generic facility to change modes or attributes */
+ /* in a given raster. This can be used for debugging purposes, or */
+ /* simply to allow implementation-specific `features' in a given */
+ /* raster module. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* mode :: A 4-byte tag used to name the mode or property. */
+ /* */
+ /* args :: A pointer to the new mode/property to use. */
+ /* */
+ typedef int
+ (*FT_Raster_SetModeFunc)( FT_Raster raster,
+ unsigned long mode,
+ void* args );
+
+#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_RenderFunc */
+ /* */
+ /* <Description> */
+ /* Invoke a given raster to scan-convert a given glyph image into a */
+ /* target bitmap. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* store the rendering parameters. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The exact format of the source image depends on the raster's glyph */
+ /* format defined in its @FT_Raster_Funcs structure. It can be an */
+ /* @FT_Outline or anything else in order to support a large array of */
+ /* glyph formats. */
+ /* */
+ /* Note also that the render function can fail and return a */
+ /* `FT_Err_Unimplemented_Feature' error code if the raster used does */
+ /* not support direct composition. */
+ /* */
+ /* XXX: For now, the standard raster doesn't support direct */
+ /* composition but this should change for the final release (see */
+ /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */
+ /* for examples of distinct implementations which support direct */
+ /* composition). */
+ /* */
+ typedef int
+ (*FT_Raster_RenderFunc)( FT_Raster raster,
+ const FT_Raster_Params* params );
+
+#define FT_Raster_Render_Func FT_Raster_RenderFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given raster class to the library. */
+ /* */
+ /* <Fields> */
+ /* glyph_format :: The supported glyph format for this raster. */
+ /* */
+ /* raster_new :: The raster constructor. */
+ /* */
+ /* raster_reset :: Used to reset the render pool within the raster. */
+ /* */
+ /* raster_render :: A function to render a glyph into a given bitmap. */
+ /* */
+ /* raster_done :: The raster destructor. */
+ /* */
+ typedef struct FT_Raster_Funcs_
+ {
+ FT_Glyph_Format glyph_format;
+ FT_Raster_NewFunc raster_new;
+ FT_Raster_ResetFunc raster_reset;
+ FT_Raster_SetModeFunc raster_set_mode;
+ FT_Raster_RenderFunc raster_render;
+ FT_Raster_DoneFunc raster_done;
+
+ } FT_Raster_Funcs;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
new file mode 100644
index 0000000000..3a3015edc6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/* */
+/* ftincrem.h */
+/* */
+/* FreeType incremental loading (specification). */
+/* */
+/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * incremental
+ *
+ * @title:
+ * Incremental Loading
+ *
+ * @abstract:
+ * Custom Glyph Loading.
+ *
+ * @description:
+ * This section contains various functions used to perform so-called
+ * `incremental' glyph loading. This is a mode where all glyphs loaded
+ * from a given @FT_Face are provided by the client application,
+ *
+ * Apart from that, all other tables are loaded normally from the font
+ * file. This mode is useful when FreeType is used within another
+ * engine, e.g., a PostScript Imaging Processor.
+ *
+ * To enable this mode, you must use @FT_Open_Face, passing an
+ * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+ * @FT_Incremental_Interface value. See the comments for
+ * @FT_Incremental_InterfaceRec for an example.
+ *
+ */
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental
+ *
+ * @description:
+ * An opaque type describing a user-provided object used to implement
+ * `incremental' glyph loading within FreeType. This is used to support
+ * embedded fonts in certain environments (e.g., PostScript interpreters),
+ * where the glyph data isn't in the font file, or must be overridden by
+ * different values.
+ *
+ * @note:
+ * It is up to client applications to create and implement @FT_Incremental
+ * objects, as long as they provide implementations for the methods
+ * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+ * and @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ * See the description of @FT_Incremental_InterfaceRec to understand how
+ * to use incremental objects with FreeType.
+ *
+ */
+ typedef struct FT_IncrementalRec_* FT_Incremental;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_MetricsRec
+ *
+ * @description:
+ * A small structure used to contain the basic glyph metrics returned
+ * by the @FT_Incremental_GetGlyphMetricsFunc method.
+ *
+ * @fields:
+ * bearing_x ::
+ * Left bearing, in font units.
+ *
+ * bearing_y ::
+ * Top bearing, in font units.
+ *
+ * advance ::
+ * Horizontal component of glyph advance, in font units.
+ *
+ * advance_v ::
+ * Vertical component of glyph advance, in font units.
+ *
+ * @note:
+ * These correspond to horizontal or vertical metrics depending on the
+ * value of the `vertical' argument to the function
+ * @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_
+ {
+ FT_Long bearing_x;
+ FT_Long bearing_y;
+ FT_Long advance;
+ FT_Long advance_v; /* since 2.3.12 */
+
+ } FT_Incremental_MetricsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_Metrics
+ *
+ * @description:
+ * A handle to an @FT_Incremental_MetricsRec structure.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphDataFunc
+ *
+ * @description:
+ * A function called by FreeType to access a given glyph's data bytes
+ * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+ * enabled.
+ *
+ * Note that the format of the glyph's data bytes depends on the font
+ * file format. For TrueType, it must correspond to the raw bytes within
+ * the `glyf' table. For PostScript formats, it must correspond to the
+ * *unencrypted* charstring bytes, without any `lenIV' header. It is
+ * undefined for any other format.
+ *
+ * @input:
+ * incremental ::
+ * Handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * @output:
+ * adata ::
+ * A structure describing the returned glyph data bytes (which will be
+ * accessed as a read-only byte block).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If this function returns successfully the method
+ * @FT_Incremental_FreeGlyphDataFunc will be called later to release
+ * the data bytes.
+ *
+ * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+ * compound glyphs.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Data* adata );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_FreeGlyphDataFunc
+ *
+ * @description:
+ * A function used to release the glyph data bytes returned by a
+ * successful call to @FT_Incremental_GetGlyphDataFunc.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * data ::
+ * A structure describing the glyph data bytes (which will be accessed
+ * as a read-only byte block).
+ *
+ */
+ typedef void
+ (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental,
+ FT_Data* data );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphMetricsFunc
+ *
+ * @description:
+ * A function used to retrieve the basic metrics of a given glyph index
+ * before accessing its data. This is necessary because, in certain
+ * formats like TrueType, the metrics are stored in a different place from
+ * the glyph images proper.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * vertical ::
+ * If true, return vertical metrics.
+ *
+ * ametrics ::
+ * This parameter is used for both input and output.
+ * The original glyph metrics, if any, in font units. If metrics are
+ * not available all the values must be set to zero.
+ *
+ * @output:
+ * ametrics ::
+ * The replacement glyph metrics in font units.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphMetricsFunc)
+ ( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Bool vertical,
+ FT_Incremental_MetricsRec *ametrics );
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_FuncsRec
+ *
+ * @description:
+ * A table of functions for accessing fonts that load data
+ * incrementally. Used in @FT_Incremental_InterfaceRec.
+ *
+ * @fields:
+ * get_glyph_data ::
+ * The function to get glyph data. Must not be null.
+ *
+ * free_glyph_data ::
+ * The function to release glyph data. Must not be null.
+ *
+ * get_glyph_metrics ::
+ * The function to get glyph metrics. May be null if the font does
+ * not provide overriding glyph metrics.
+ *
+ */
+ typedef struct FT_Incremental_FuncsRec_
+ {
+ FT_Incremental_GetGlyphDataFunc get_glyph_data;
+ FT_Incremental_FreeGlyphDataFunc free_glyph_data;
+ FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics;
+
+ } FT_Incremental_FuncsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_InterfaceRec
+ *
+ * @description:
+ * A structure to be used with @FT_Open_Face to indicate that the user
+ * wants to support incremental glyph loading. You should use it with
+ * @FT_PARAM_TAG_INCREMENTAL as in the following example:
+ *
+ * {
+ * FT_Incremental_InterfaceRec inc_int;
+ * FT_Parameter parameter;
+ * FT_Open_Args open_args;
+ *
+ *
+ * // set up incremental descriptor
+ * inc_int.funcs = my_funcs;
+ * inc_int.object = my_object;
+ *
+ * // set up optional parameter
+ * parameter.tag = FT_PARAM_TAG_INCREMENTAL;
+ * parameter.data = &inc_int;
+ *
+ * // set up FT_Open_Args structure
+ * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+ * open_args.pathname = my_font_pathname;
+ * open_args.num_params = 1;
+ * open_args.params = &parameter; // we use one optional argument
+ *
+ * // open the font
+ * error = FT_Open_Face( library, &open_args, index, &face );
+ * ...
+ * }
+ *
+ */
+ typedef struct FT_Incremental_InterfaceRec_
+ {
+ const FT_Incremental_FuncsRec* funcs;
+ FT_Incremental object;
+
+ } FT_Incremental_InterfaceRec;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_Interface
+ *
+ * @description:
+ * A pointer to an @FT_Incremental_InterfaceRec structure.
+ *
+ */
+ typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface;
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_INCREMENTAL
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to indicate
+ * an incremental loading object to be used by FreeType.
+ *
+ */
+#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
new file mode 100644
index 0000000000..042f98396e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
@@ -0,0 +1,251 @@
+/***************************************************************************/
+/* */
+/* ftlcdfil.h */
+/* */
+/* FreeType API for color filtering of subpixel bitmap glyphs */
+/* (specification). */
+/* */
+/* Copyright 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * lcd_filtering
+ *
+ * @title:
+ * LCD Filtering
+ *
+ * @abstract:
+ * Reduce color fringes of LCD-optimized bitmaps.
+ *
+ * @description:
+ * The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+ * filter which is then applied to LCD-optimized bitmaps generated
+ * through @FT_Render_Glyph. This is useful to reduce color fringes
+ * which would occur with unfiltered rendering.
+ *
+ * Note that no filter is active by default, and that this function is
+ * *not* implemented in default builds of the library. You need to
+ * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+ * in order to activate it.
+ *
+ * FreeType generates alpha coverage maps, which are linear by nature.
+ * For instance, the value 0x80 in bitmap representation means that
+ * (within numerical precision) 0x80/0xff fraction of that pixel is
+ * covered by the glyph's outline. The blending function for placing
+ * text over a background is
+ *
+ * {
+ * dst = alpha * src + (1 - alpha) * dst ,
+ * }
+ *
+ * which is known as OVER. However, when calculating the output of the
+ * OVER operator, the source colors should first be transformed to a
+ * linear color space, then alpha blended in that space, and transformed
+ * back to the output color space.
+ *
+ * When linear light blending is used, the default FIR5 filtering
+ * weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
+ * they have been designed for black on white rendering while lacking
+ * gamma correction. To preserve color neutrality, weights for a FIR5
+ * filter should be chosen according to two free parameters `a' and `c',
+ * and the FIR weights should be
+ *
+ * {
+ * [a - c, a + c, 2 * a, a + c, a - c] .
+ * }
+ *
+ * This formula generates equal weights for all the color primaries
+ * across the filter kernel, which makes it colorless. One suggested
+ * set of weights is
+ *
+ * {
+ * [0x10, 0x50, 0x60, 0x50, 0x10] ,
+ * }
+ *
+ * where `a' has value 0x30 and `b' value 0x20. The weights in filter
+ * may have a sum larger than 0x100, which increases coloration slightly
+ * but also improves contrast.
+ */
+
+
+ /****************************************************************************
+ *
+ * @enum:
+ * FT_LcdFilter
+ *
+ * @description:
+ * A list of values to identify various types of LCD filters.
+ *
+ * @values:
+ * FT_LCD_FILTER_NONE ::
+ * Do not perform filtering. When used with subpixel rendering, this
+ * results in sometimes severe color fringes.
+ *
+ * FT_LCD_FILTER_DEFAULT ::
+ * The default filter reduces color fringes considerably, at the cost
+ * of a slight blurriness in the output.
+ *
+ * FT_LCD_FILTER_LIGHT ::
+ * The light filter is a variant that produces less blurriness at the
+ * cost of slightly more color fringes than the default one. It might
+ * be better, depending on taste, your monitor, or your personal vision.
+ *
+ * FT_LCD_FILTER_LEGACY ::
+ * This filter corresponds to the original libXft color filter. It
+ * provides high contrast output but can exhibit really bad color
+ * fringes if glyphs are not extremely well hinted to the pixel grid.
+ * In other words, it only works well if the TrueType bytecode
+ * interpreter is enabled *and* high-quality hinted fonts are used.
+ *
+ * This filter is only provided for comparison purposes, and might be
+ * disabled or stay unsupported in the future.
+ *
+ * @since:
+ * 2.3.0
+ */
+ typedef enum FT_LcdFilter_
+ {
+ FT_LCD_FILTER_NONE = 0,
+ FT_LCD_FILTER_DEFAULT = 1,
+ FT_LCD_FILTER_LIGHT = 2,
+ FT_LCD_FILTER_LEGACY = 16,
+
+ FT_LCD_FILTER_MAX /* do not remove */
+
+ } FT_LcdFilter;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilter
+ *
+ * @description:
+ * This function is used to apply color filtering to LCD decimated
+ * bitmaps, like the ones used when calling @FT_Render_Glyph with
+ * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * filter ::
+ * The filter type.
+ *
+ * You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+ * @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+ * well on most LCD screens.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This feature is always disabled by default. Clients must make an
+ * explicit call to this function with a `filter' value other than
+ * @FT_LCD_FILTER_NONE in order to enable it.
+ *
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+ * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+ *
+ * It does _not_ affect the output of @FT_Outline_Render and
+ * @FT_Outline_Get_Bitmap.
+ *
+ * If this feature is activated, the dimensions of LCD glyph bitmaps are
+ * either larger or taller than the dimensions of the corresponding
+ * outline with regards to the pixel grid. For example, for
+ * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+ * up to 3~pixels to the right.
+ *
+ * The bitmap offset values are adjusted correctly, so clients shouldn't
+ * need to modify their layout and glyph positioning code when enabling
+ * the filter.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter );
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilterWeights
+ *
+ * @description:
+ * Use this function to override the filter weights selected by
+ * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple
+ * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+ * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+ * FT_LCD_FILTER_LEGACY.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * weights ::
+ * A pointer to an array; the function copies the first five bytes and
+ * uses them to specify the filter weights.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * This function must be called after @FT_Library_SetLcdFilter to have
+ * any effect.
+ *
+ * @since:
+ * 2.4.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
new file mode 100644
index 0000000000..8b18978bcd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/* */
+/* ftlist.h */
+/* */
+/* Generic list support for FreeType (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file implements functions relative to list processing. Its */
+ /* data structures are defined in `freetype.h'. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /* <Title> */
+ /* List Processing */
+ /* */
+ /* <Abstract> */
+ /* Simple management of lists. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to list */
+ /* processing using doubly-linked nodes. */
+ /* */
+ /* <Order> */
+ /* FT_List */
+ /* FT_ListNode */
+ /* FT_ListRec */
+ /* FT_ListNodeRec */
+ /* */
+ /* FT_List_Add */
+ /* FT_List_Insert */
+ /* FT_List_Find */
+ /* FT_List_Remove */
+ /* FT_List_Up */
+ /* FT_List_Iterate */
+ /* FT_List_Iterator */
+ /* FT_List_Finalize */
+ /* FT_List_Destructor */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Find */
+ /* */
+ /* <Description> */
+ /* Find the list node for a given listed object. */
+ /* */
+ /* <Input> */
+ /* list :: A pointer to the parent list. */
+ /* data :: The address of the listed object. */
+ /* */
+ /* <Return> */
+ /* List node. NULL if it wasn't found. */
+ /* */
+ FT_EXPORT( FT_ListNode )
+ FT_List_Find( FT_List list,
+ void* data );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Add */
+ /* */
+ /* <Description> */
+ /* Append an element to the end of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to append. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Add( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Insert */
+ /* */
+ /* <Description> */
+ /* Insert an element at the head of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to parent list. */
+ /* node :: The node to insert. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Insert( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Remove */
+ /* */
+ /* <Description> */
+ /* Remove a node from a list. This function doesn't check whether */
+ /* the node is in the list! */
+ /* */
+ /* <Input> */
+ /* node :: The node to remove. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Remove( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Up */
+ /* */
+ /* <Description> */
+ /* Move a node to the head/top of a list. Used to maintain LRU */
+ /* lists. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to move. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Up( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Iterator */
+ /* */
+ /* <Description> */
+ /* An FT_List iterator function which is called during a list parse */
+ /* by @FT_List_Iterate. */
+ /* */
+ /* <Input> */
+ /* node :: The current iteration list node. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. */
+ /* Can be used to point to the iteration's state. */
+ /* */
+ typedef FT_Error
+ (*FT_List_Iterator)( FT_ListNode node,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Iterate */
+ /* */
+ /* <Description> */
+ /* Parse a list and calls a given iterator function on each element. */
+ /* Note that parsing is stopped as soon as one of the iterator calls */
+ /* returns a non-zero value. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* iterator :: An iterator function, called on each node of the list. */
+ /* user :: A user-supplied field which is passed as the second */
+ /* argument to the iterator. */
+ /* */
+ /* <Return> */
+ /* The result (a FreeType error code) of the last iterator call. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_List_Iterate( FT_List list,
+ FT_List_Iterator iterator,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Destructor */
+ /* */
+ /* <Description> */
+ /* An @FT_List iterator function which is called during a list */
+ /* finalization by @FT_List_Finalize to destroy all elements in a */
+ /* given list. */
+ /* */
+ /* <Input> */
+ /* system :: The current system object. */
+ /* */
+ /* data :: The current object to destroy. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. It can */
+ /* be used to point to the iteration's state. */
+ /* */
+ typedef void
+ (*FT_List_Destructor)( FT_Memory memory,
+ void* data,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Finalize */
+ /* */
+ /* <Description> */
+ /* Destroy all elements in the list as well as the list itself. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* */
+ /* destroy :: A list destructor that will be applied to each element */
+ /* of the list. */
+ /* */
+ /* memory :: The current memory object which handles deallocation. */
+ /* */
+ /* user :: A user-supplied field which is passed as the last */
+ /* argument to the destructor. */
+ /* */
+ /* <Note> */
+ /* This function expects that all nodes added by @FT_List_Add or */
+ /* @FT_List_Insert have been dynamically allocated. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Finalize( FT_List list,
+ FT_List_Destructor destroy,
+ FT_Memory memory,
+ void* user );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
new file mode 100644
index 0000000000..5bb4a82247
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/* */
+/* ftlzw.h */
+/* */
+/* LZW-compressed stream support. */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* lzw */
+ /* */
+ /* <Title> */
+ /* LZW Streams */
+ /* */
+ /* <Abstract> */
+ /* Using LZW-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of LZW-specific functions. */
+ /* */
+ /*************************************************************************/
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenLZW
+ *
+ * @description:
+ * Open a new stream to parse LZW-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.Z' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream :: The target embedding stream.
+ *
+ * source :: The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream
+ *
+ * In certain builds of the library, LZW compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a LZW stream from it
+ * and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with LZW support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenLZW( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
new file mode 100644
index 0000000000..f40f3fb9ee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftmac.h */
+/* */
+/* Additional Mac-specific API. */
+/* */
+/* Copyright 1996-2001, 2004, 2006, 2007 by */
+/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* NOTE: Include this file after <freetype/freetype.h> and after any */
+/* Mac-specific headers (because this header uses Mac types such as */
+/* Handle, FSSpec, FSRef, etc.) */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__) && \
+ ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* mac_specific */
+ /* */
+ /* <Title> */
+ /* Mac Specific Interface */
+ /* */
+ /* <Abstract> */
+ /* Only available on the Macintosh. */
+ /* */
+ /* <Description> */
+ /* The following definitions are only available if FreeType is */
+ /* compiled on a Macintosh. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FOND */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a FOND resource. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* fond :: A FOND resource. */
+ /* */
+ /* face_index :: Only supported for the -1 `sanity check' special */
+ /* case. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Notes> */
+ /* This function can be used to create @FT_Face objects from fonts */
+ /* that are installed in the system as follows. */
+ /* */
+ /* { */
+ /* fond = GetResource( 'FOND', fontName ); */
+ /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FOND( FT_Library library,
+ Handle fond,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font (e.g., Times New Roman */
+ /* Bold). */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_ATS_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFilePath_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return a pathname of the disk file and face index for given font */
+ /* name which is handled by ATS framework. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* path :: Buffer to store pathname of the file. For passing */
+ /* to @FT_New_Face. The client must allocate this */
+ /* buffer before calling this function. */
+ /* */
+ /* maxPathSize :: Lengths of the buffer `path' that client allocated. */
+ /* */
+ /* face_index :: Index of the face. For passing to @FT_New_Face. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFilePath_From_Mac_ATS_Name( const char* fontName,
+ UInt8* path,
+ UInt32 maxPathSize,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSSpec */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSSpec to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSSpec to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */
+ /* it accepts an FSSpec instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSSpec( FT_Library library,
+ const FSSpec *spec,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSRef */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSRef to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSRef to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */
+ /* it accepts an FSRef instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSRef( FT_Library library,
+ const FSRef *ref,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
new file mode 100644
index 0000000000..52aaf44375
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/* */
+/* ftmm.h */
+/* */
+/* FreeType Multiple Master font interface (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include "../ft2build.h"
+#include "t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* multiple_masters */
+ /* */
+ /* <Title> */
+ /* Multiple Masters */
+ /* */
+ /* <Abstract> */
+ /* How to manage Multiple Masters fonts. */
+ /* */
+ /* <Description> */
+ /* The following types and functions are used to manage Multiple */
+ /* Master fonts, i.e., the selection of specific design instances by */
+ /* setting design axis coordinates. */
+ /* */
+ /* George Williams has extended this interface to make it work with */
+ /* both Type~1 Multiple Masters fonts and GX distortable (var) */
+ /* fonts. Some of these routines only work with MM fonts, others */
+ /* will work with both types. They are similar enough that a */
+ /* consistent interface makes sense. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters fonts. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ typedef struct FT_MM_Axis_
+ {
+ FT_String* name;
+ FT_Long minimum;
+ FT_Long maximum;
+
+ } FT_MM_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Multi_Master */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* font. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: Number of axes. Cannot exceed~4. */
+ /* */
+ /* num_designs :: Number of designs; should be normally 2^num_axis */
+ /* even though the Type~1 specification strangely */
+ /* allows for intermediate designs to be present. This */
+ /* number cannot exceed~16. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* */
+ typedef struct FT_Multi_Master_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_MM_Axis axis[T1_MAX_MM_AXIS];
+
+ } FT_Multi_Master;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters and GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* Not always meaningful for GX. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* def :: The axis's default design coordinate. */
+ /* FreeType computes meaningful default values for MM; it */
+ /* is then an integer value, not in 16.16 format. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ /* tag :: The axis's tag (the GX equivalent to `name'). */
+ /* FreeType provides default values for MM if possible. */
+ /* */
+ /* strid :: The entry in `name' table (another GX version of */
+ /* `name'). */
+ /* Not meaningful for MM. */
+ /* */
+ typedef struct FT_Var_Axis_
+ {
+ FT_String* name;
+
+ FT_Fixed minimum;
+ FT_Fixed def;
+ FT_Fixed maximum;
+
+ FT_ULong tag;
+ FT_UInt strid;
+
+ } FT_Var_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Named_Style */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a named style in a GX var font. */
+ /* */
+ /* This structure can't be used for MM fonts. */
+ /* */
+ /* <Fields> */
+ /* coords :: The design coordinates for this style. */
+ /* This is an array with one entry for each axis. */
+ /* */
+ /* strid :: The entry in `name' table identifying this style. */
+ /* */
+ typedef struct FT_Var_Named_Style_
+ {
+ FT_Fixed* coords;
+ FT_UInt strid;
+
+ } FT_Var_Named_Style;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Var */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* or GX var distortable font. */
+ /* */
+ /* Some fields are specific to one format and not to the other. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: The number of axes. The maximum value is~4 for */
+ /* MM; no limit in GX. */
+ /* */
+ /* num_designs :: The number of designs; should be normally */
+ /* 2^num_axis for MM fonts. Not meaningful for GX */
+ /* (where every glyph could have a different */
+ /* number of designs). */
+ /* */
+ /* num_namedstyles :: The number of named styles; only meaningful for */
+ /* GX which allows certain design coordinates to */
+ /* have a string ID (in the `name' table) */
+ /* associated with them. The font can tell the */
+ /* user that, for example, Weight=1.5 is `Bold'. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* GX fonts contain slightly more data than MM. */
+ /* */
+ /* namedstyles :: A table of named styles. */
+ /* Only meaningful with GX. */
+ /* */
+ typedef struct FT_MM_Var_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_UInt num_namedstyles;
+ FT_Var_Axis* axis;
+ FT_Var_Named_Style* namedstyle;
+
+ } FT_MM_Var;
+
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Multi_Master */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master descriptor of a given font. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Multi_Master( FT_Face face,
+ FT_Multi_Master *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_MM_Var */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master/GX var descriptor of a given font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters/GX var descriptor. */
+ /* Allocates a data structure, which the user must free */
+ /* (a single call to FT_FREE will do it). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_MM_Var( FT_Face face,
+ FT_MM_Var* *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters fonts, choose an interpolated font design */
+ /* through design coordinates. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Master or GX Var fonts, choose an interpolated font */
+ /* design through design coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters and GX var fonts, choose an interpolated font */
+ /* design through normalized blend coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: The design coordinates array (each element must be */
+ /* between 0 and 1.0). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* This is another name of @FT_Set_MM_Blend_Coordinates. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
new file mode 100644
index 0000000000..f12c0a933f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/* */
+/* ftmodapi.h */
+/* */
+/* FreeType modules public interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /* <Title> */
+ /* Module Management */
+ /* */
+ /* <Abstract> */
+ /* How to add, upgrade, remove, and control modules from FreeType. */
+ /* */
+ /* <Description> */
+ /* The definitions below are used to manage modules within FreeType. */
+ /* Modules can be added, upgraded, and removed at runtime. */
+ /* Additionally, some module properties can be controlled also. */
+ /* */
+ /* Here is a list of possible values of the `module_name' field in */
+ /* the @FT_Module_Class structure. */
+ /* */
+ /* { */
+ /* autofitter */
+ /* bdf */
+ /* cff */
+ /* gxvalid */
+ /* otvalid */
+ /* pcf */
+ /* pfr */
+ /* psaux */
+ /* pshinter */
+ /* psnames */
+ /* raster1, raster5 */
+ /* sfnt */
+ /* smooth, smooth-lcd, smooth-lcdv */
+ /* truetype */
+ /* type1 */
+ /* type42 */
+ /* t1cid */
+ /* winfonts */
+ /* } */
+ /* */
+ /* Note that the FreeType Cache sub-system is not a FreeType module. */
+ /* */
+ /*************************************************************************/
+
+
+ /* module bit flags */
+#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */
+#define FT_MODULE_RENDERER 2 /* this module is a renderer */
+#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */
+#define FT_MODULE_STYLER 8 /* this module is a styler */
+
+#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */
+ /* scalable fonts */
+#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */
+ /* support vector outlines */
+#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */
+ /* own hinter */
+
+
+ /* deprecated values */
+#define ft_module_font_driver FT_MODULE_FONT_DRIVER
+#define ft_module_renderer FT_MODULE_RENDERER
+#define ft_module_hinter FT_MODULE_HINTER
+#define ft_module_styler FT_MODULE_STYLER
+
+#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER
+
+
+ typedef FT_Pointer FT_Module_Interface;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Constructor */
+ /* */
+ /* <Description> */
+ /* A function used to initialize (not create) a new module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to initialize. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Constructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destructor */
+ /* */
+ /* <Description> */
+ /* A function used to finalize (not destroy) a given module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to finalize. */
+ /* */
+ typedef void
+ (*FT_Module_Destructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Requester */
+ /* */
+ /* <Description> */
+ /* A function used to query a given module for a specific interface. */
+ /* */
+ /* <Input> */
+ /* module :: The module to be searched. */
+ /* */
+ /* name :: The name of the interface in the module. */
+ /* */
+ typedef FT_Module_Interface
+ (*FT_Module_Requester)( FT_Module module,
+ const char* name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Module_Class */
+ /* */
+ /* <Description> */
+ /* The module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* module_flags :: Bit flags describing the module. */
+ /* */
+ /* module_size :: The size of one module object/instance in */
+ /* bytes. */
+ /* */
+ /* module_name :: The name of the module. */
+ /* */
+ /* module_version :: The version, as a 16.16 fixed number */
+ /* (major.minor). */
+ /* */
+ /* module_requires :: The version of FreeType this module requires, */
+ /* as a 16.16 fixed number (major.minor). Starts */
+ /* at version 2.0, i.e., 0x20000. */
+ /* */
+ /* module_init :: The initializing function. */
+ /* */
+ /* module_done :: The finalizing function. */
+ /* */
+ /* get_interface :: The interface requesting function. */
+ /* */
+ typedef struct FT_Module_Class_
+ {
+ FT_ULong module_flags;
+ FT_Long module_size;
+ const FT_String* module_name;
+ FT_Fixed module_version;
+ FT_Fixed module_requires;
+
+ const void* module_interface;
+
+ FT_Module_Constructor module_init;
+ FT_Module_Destructor module_done;
+ FT_Module_Requester get_interface;
+
+ } FT_Module_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Module */
+ /* */
+ /* <Description> */
+ /* Add a new module to a given library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* clazz :: A pointer to class descriptor for the module. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Add_Module( FT_Library library,
+ const FT_Module_Class* clazz );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module */
+ /* */
+ /* <Description> */
+ /* Find a module by its name. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module handle. 0~if none was found. */
+ /* */
+ /* <Note> */
+ /* FreeType's internal modules aren't documented very well, and you */
+ /* should look up the source code for details. */
+ /* */
+ FT_EXPORT( FT_Module )
+ FT_Get_Module( FT_Library library,
+ const char* module_name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Remove_Module */
+ /* */
+ /* <Description> */
+ /* Remove a given module from a library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* <Input> */
+ /* module :: A handle to a module object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The module object is destroyed by the function in case of success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Remove_Module( FT_Library library,
+ FT_Module module );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Set
+ *
+ * @description:
+ * Set a property for a given module.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * Note that only a few modules have properties.
+ *
+ * value ::
+ * A generic pointer to a variable or structure which gives the new
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example sets property `bar' (a simple integer) in
+ * module `foo' to value~1.
+ *
+ * {
+ * FT_UInt bar;
+ *
+ *
+ * bar = 1;
+ * FT_Property_Set( library, "foo", "bar", &bar );
+ * }
+ *
+ * Note that the FreeType Cache sub-system doesn't recognize module
+ * property changes. To avoid glyph lookup confusion within the cache
+ * you should call @FTC_Manager_Reset to completely flush the cache if
+ * a module property gets changed after @FTC_Manager_New has been
+ * called.
+ *
+ * It is not possible to set properties of the FreeType Cache
+ * sub-system itself with FT_Property_Set; use @FTC_Property_Set
+ * instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ const void* value );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Get
+ *
+ * @description:
+ * Get a module's property value.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * @inout:
+ * value ::
+ * A generic pointer to a variable or structure which gives the
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example gets property `baz' (a range) in module `foo'.
+ *
+ * {
+ * typedef range_
+ * {
+ * FT_Int32 min;
+ * FT_Int32 max;
+ *
+ * } range;
+ *
+ * range baz;
+ *
+ *
+ * FT_Property_Get( library, "foo", "baz", &baz );
+ * }
+ *
+ * It is not possible to retrieve properties of the FreeType Cache
+ * sub-system with FT_Property_Get; use @FTC_Property_Get instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Get( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Library */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Library */
+ /* structure is created. This function increments the counter. */
+ /* @FT_Done_Library then only destroys a library if the counter is~1, */
+ /* otherwise it simply decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Library objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Library( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Library */
+ /* */
+ /* <Description> */
+ /* This function is used to create a new FreeType library instance */
+ /* from a given memory object. It is thus possible to use libraries */
+ /* with distinct memory allocators within the same program. */
+ /* */
+ /* Normally, you would call this function (followed by a call to */
+ /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */
+ /* instead of @FT_Init_FreeType to initialize the FreeType library. */
+ /* */
+ /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */
+ /* library instance. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the original memory object. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A pointer to handle of a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Library( FT_Memory memory,
+ FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Library */
+ /* */
+ /* <Description> */
+ /* Discard a given library object. This closes all drivers and */
+ /* discards all resource objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Library( FT_Library library );
+
+/* */
+
+ typedef void
+ (*FT_DebugHook_Func)( void* arg );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Debug_Hook */
+ /* */
+ /* <Description> */
+ /* Set a debug hook function for debugging the interpreter of a font */
+ /* format. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* hook_index :: The index of the debug hook. You should use the */
+ /* values defined in `ftobjs.h', e.g., */
+ /* `FT_DEBUG_HOOK_TRUETYPE'. */
+ /* */
+ /* debug_hook :: The function used to debug the interpreter. */
+ /* */
+ /* <Note> */
+ /* Currently, four debug hook slots are available, but only two (for */
+ /* the TrueType and the Type~1 interpreter) are defined. */
+ /* */
+ /* Since the internal headers of FreeType are no longer installed, */
+ /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */
+ /* This is a bug and will be fixed in a forthcoming release. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Debug_Hook( FT_Library library,
+ FT_UInt hook_index,
+ FT_DebugHook_Func debug_hook );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Default_Modules */
+ /* */
+ /* <Description> */
+ /* Add the set of default drivers to a given library object. */
+ /* This is only useful when you create a library object with */
+ /* @FT_New_Library (usually to plug a custom memory manager). */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a new library object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Add_Default_Modules( FT_Library library );
+
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * truetype_engine
+ *
+ * @title:
+ * The TrueType Engine
+ *
+ * @abstract:
+ * TrueType bytecode support.
+ *
+ * @description:
+ * This section contains a function used to query the level of TrueType
+ * bytecode support compiled in this version of the library.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_TrueTypeEngineType
+ *
+ * @description:
+ * A list of values describing which kind of TrueType bytecode
+ * engine is implemented in a given FT_Library instance. It is used
+ * by the @FT_Get_TrueType_Engine_Type function.
+ *
+ * @values:
+ * FT_TRUETYPE_ENGINE_TYPE_NONE ::
+ * The library doesn't implement any kind of bytecode interpreter.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+ * The library implements a bytecode interpreter that doesn't
+ * support the patented operations of the TrueType virtual machine.
+ *
+ * Its main use is to load certain Asian fonts which position and
+ * scale glyph components with bytecode instructions. It produces
+ * bad output for most other fonts.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+ * The library implements a bytecode interpreter that covers
+ * the full instruction set of the TrueType virtual machine (this
+ * was governed by patents until May 2010, hence the name).
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ typedef enum FT_TrueTypeEngineType_
+ {
+ FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+ FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+ FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+ } FT_TrueTypeEngineType;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Get_TrueType_Engine_Type
+ *
+ * @description:
+ * Return an @FT_TrueTypeEngineType value to indicate which level of
+ * the TrueType virtual machine a given library instance supports.
+ *
+ * @input:
+ * library ::
+ * A library instance.
+ *
+ * @return:
+ * A value indicating which level is supported.
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ FT_EXPORT( FT_TrueTypeEngineType )
+ FT_Get_TrueType_Engine_Type( FT_Library library );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
new file mode 100644
index 0000000000..4ca851ed98
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
@@ -0,0 +1,194 @@
+/***************************************************************************/
+/* */
+/* ftmoderr.h */
+/* */
+/* FreeType module error offsets (specification). */
+/* */
+/* Copyright 2001-2005, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the FreeType module error codes. */
+ /* */
+ /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is */
+ /* set, the lower byte of an error value identifies the error code as */
+ /* usual. In addition, the higher byte identifies the module. For */
+ /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
+ /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error */
+ /* `T1_Err_Invalid_File_Format' has value 0x1403, etc. */
+ /* */
+ /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero, */
+ /* including the high byte. */
+ /* */
+ /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of */
+ /* an error value is set to zero. */
+ /* */
+ /* To hide the various `XXX_Err_' prefixes in the source code, FreeType */
+ /* provides some macros in `fttypes.h'. */
+ /* */
+ /* FT_ERR( err ) */
+ /* Add current error module prefix (as defined with the */
+ /* `FT_ERR_PREFIX' macro) to `err'. For example, in the BDF module */
+ /* the line */
+ /* */
+ /* error = FT_ERR( Invalid_Outline ); */
+ /* */
+ /* expands to */
+ /* */
+ /* error = BDF_Err_Invalid_Outline; */
+ /* */
+ /* For simplicity, you can always use `FT_Err_Ok' directly instead */
+ /* of `FT_ERR( Ok )'. */
+ /* */
+ /* FT_ERR_EQ( errcode, err ) */
+ /* FT_ERR_NEQ( errcode, err ) */
+ /* Compare error code `errcode' with the error `err' for equality */
+ /* and inequality, respectively. Example: */
+ /* */
+ /* if ( FT_ERR_EQ( error, Invalid_Outline ) ) */
+ /* ... */
+ /* */
+ /* Using this macro you don't have to think about error prefixes. */
+ /* Of course, if module errors are not active, the above example is */
+ /* the same as */
+ /* */
+ /* if ( error == FT_Err_Invalid_Outline ) */
+ /* ... */
+ /* */
+ /* FT_ERROR_BASE( errcode ) */
+ /* FT_ERROR_MODULE( errcode ) */
+ /* Get base error and module error code, respectively. */
+ /* */
+ /* */
+ /* It can also be used to create a module error message table easily */
+ /* with something like */
+ /* */
+ /* { */
+ /* #undef __FTMODERR_H__ */
+ /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */
+ /* #define FT_MODERR_START_LIST { */
+ /* #define FT_MODERR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int mod_err_offset; */
+ /* const char* mod_err_msg */
+ /* } ft_mod_errors[] = */
+ /* */
+ /* #include "ftmoderr.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST enum {
+#define FT_MODERR_END_LIST FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST MODULE ERROR BASES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+ FT_MODERR_START_LIST
+#endif
+
+
+ FT_MODERRDEF( Base, 0x000, "base module" )
+ FT_MODERRDEF( Autofit, 0x100, "autofitter module" )
+ FT_MODERRDEF( BDF, 0x200, "BDF module" )
+ FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" )
+ FT_MODERRDEF( Cache, 0x400, "cache module" )
+ FT_MODERRDEF( CFF, 0x500, "CFF module" )
+ FT_MODERRDEF( CID, 0x600, "CID module" )
+ FT_MODERRDEF( Gzip, 0x700, "Gzip module" )
+ FT_MODERRDEF( LZW, 0x800, "LZW module" )
+ FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" )
+ FT_MODERRDEF( PCF, 0xA00, "PCF module" )
+ FT_MODERRDEF( PFR, 0xB00, "PFR module" )
+ FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" )
+ FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" )
+ FT_MODERRDEF( PSnames, 0xE00, "PS names module" )
+ FT_MODERRDEF( Raster, 0xF00, "raster module" )
+ FT_MODERRDEF( SFNT, 0x1000, "SFNT module" )
+ FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" )
+ FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+ FT_MODERRDEF( Type1, 0x1300, "Type 1 module" )
+ FT_MODERRDEF( Type42, 0x1400, "Type 42 module" )
+ FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+ FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" )
+
+
+#ifdef FT_MODERR_END_LIST
+ FT_MODERR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
new file mode 100644
index 0000000000..e33e307c15
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/* */
+/* ftotval.h */
+/* */
+/* FreeType API for validating OpenType tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* */
+/* Warning: This module might be moved to a different library in the */
+/* future to avoid a tight dependency between FreeType and the */
+/* OpenType specification. */
+/* */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* ot_validation */
+ /* */
+ /* <Title> */
+ /* OpenType Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate OpenType tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_OTXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_OpenType_Validate to
+ * indicate which OpenType tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_BASE ::
+ * Validate BASE table.
+ *
+ * FT_VALIDATE_GDEF ::
+ * Validate GDEF table.
+ *
+ * FT_VALIDATE_GPOS ::
+ * Validate GPOS table.
+ *
+ * FT_VALIDATE_GSUB ::
+ * Validate GSUB table.
+ *
+ * FT_VALIDATE_JSTF ::
+ * Validate JSTF table.
+ *
+ * FT_VALIDATE_MATH ::
+ * Validate MATH table.
+ *
+ * FT_VALIDATE_OT ::
+ * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+ *
+ */
+#define FT_VALIDATE_BASE 0x0100
+#define FT_VALIDATE_GDEF 0x0200
+#define FT_VALIDATE_GPOS 0x0400
+#define FT_VALIDATE_GSUB 0x0800
+#define FT_VALIDATE_JSTF 0x1000
+#define FT_VALIDATE_MATH 0x2000
+
+#define FT_VALIDATE_OT FT_VALIDATE_BASE | \
+ FT_VALIDATE_GDEF | \
+ FT_VALIDATE_GPOS | \
+ FT_VALIDATE_GSUB | \
+ FT_VALIDATE_JSTF | \
+ FT_VALIDATE_MATH
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Validate
+ *
+ * @description:
+ * Validate various OpenType tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_OTXXX for possible values.
+ *
+ * @output:
+ * BASE_table ::
+ * A pointer to the BASE table.
+ *
+ * GDEF_table ::
+ * A pointer to the GDEF table.
+ *
+ * GPOS_table ::
+ * A pointer to the GPOS table.
+ *
+ * GSUB_table ::
+ * A pointer to the GSUB table.
+ *
+ * JSTF_table ::
+ * A pointer to the JSTF table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with OpenType fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the five tables with
+ * @FT_OpenType_Free. A NULL value indicates that the table either
+ * doesn't exist in the font, or the application hasn't asked for
+ * validation.
+ */
+ FT_EXPORT( FT_Error )
+ FT_OpenType_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *BASE_table,
+ FT_Bytes *GDEF_table,
+ FT_Bytes *GPOS_table,
+ FT_Bytes *GSUB_table,
+ FT_Bytes *JSTF_table );
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Free
+ *
+ * @description:
+ * Free the buffer allocated by OpenType validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_OpenType_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_OpenType_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_OpenType_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
new file mode 100644
index 0000000000..ca94947af5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
@@ -0,0 +1,560 @@
+/***************************************************************************/
+/* */
+/* ftoutln.h */
+/* */
+/* Support for the FT_Outline type used to store glyph shapes of */
+/* most scalable font formats (specification). */
+/* */
+/* Copyright 1996-2003, 2005-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /* <Title> */
+ /* Outline Processing */
+ /* */
+ /* <Abstract> */
+ /* Functions to create, transform, and render vectorial glyph images. */
+ /* */
+ /* <Description> */
+ /* This section contains routines used to create and destroy scalable */
+ /* glyph images known as `outlines'. These can also be measured, */
+ /* transformed, and converted into bitmaps and pixmaps. */
+ /* */
+ /* <Order> */
+ /* FT_Outline */
+ /* FT_OUTLINE_FLAGS */
+ /* FT_Outline_New */
+ /* FT_Outline_Done */
+ /* FT_Outline_Copy */
+ /* FT_Outline_Translate */
+ /* FT_Outline_Transform */
+ /* FT_Outline_Embolden */
+ /* FT_Outline_EmboldenXY */
+ /* FT_Outline_Reverse */
+ /* FT_Outline_Check */
+ /* */
+ /* FT_Outline_Get_CBox */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* FT_Outline_Get_Bitmap */
+ /* FT_Outline_Render */
+ /* */
+ /* FT_Outline_Decompose */
+ /* FT_Outline_Funcs */
+ /* FT_Outline_MoveTo_Func */
+ /* FT_Outline_LineTo_Func */
+ /* FT_Outline_ConicTo_Func */
+ /* FT_Outline_CubicTo_Func */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walk over an outline's structure to decompose it into individual */
+ /* segments and Bézier arcs. This function also emits `move to' */
+ /* operations to indicate the start of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* func_interface :: A table of `emitters', i.e., function pointers */
+ /* called during decomposition to indicate path */
+ /* operations. */
+ /* */
+ /* <InOut> */
+ /* user :: A typeless pointer which is passed to each */
+ /* emitter during the decomposition. It can be */
+ /* used to store the state during the */
+ /* decomposition. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Decompose( FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_New */
+ /* */
+ /* <Description> */
+ /* Create a new outline of a given size. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object from where the */
+ /* outline is allocated. Note however that the new */
+ /* outline will *not* necessarily be *freed*, when */
+ /* destroying the library, by @FT_Done_FreeType. */
+ /* */
+ /* numPoints :: The maximum number of points within the outline. */
+ /* Must be smaller than or equal to 0xFFFF (65535). */
+ /* */
+ /* numContours :: The maximum number of contours within the outline. */
+ /* This value must be in the range 0 to `numPoints'. */
+ /* */
+ /* <Output> */
+ /* anoutline :: A handle to the new outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' parameter is simply */
+ /* to use the library's memory allocator. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_New_Internal( FT_Memory memory,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Done */
+ /* */
+ /* <Description> */
+ /* Destroy an outline created with @FT_Outline_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle of the library object used to allocate the */
+ /* outline. */
+ /* */
+ /* outline :: A pointer to the outline object to be discarded. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the outline's `owner' field is not set, only the outline */
+ /* descriptor will be released. */
+ /* */
+ /* The reason why this function takes an `library' parameter is */
+ /* simply to use ft_mem_free(). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done( FT_Library library,
+ FT_Outline* outline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done_Internal( FT_Memory memory,
+ FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Check */
+ /* */
+ /* <Description> */
+ /* Check the contents of an outline descriptor. */
+ /* */
+ /* <Input> */
+ /* outline :: A handle to a source outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Check( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return an outline's `control box'. The control box encloses all */
+ /* the outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <Output> */
+ /* acbox :: The outline's control box. */
+ /* */
+ /* <Note> */
+ /* See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Get_CBox( const FT_Outline* outline,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Translate */
+ /* */
+ /* <Description> */
+ /* Apply a simple translation to the points of an outline. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* xOffset :: The horizontal offset. */
+ /* */
+ /* yOffset :: The vertical offset. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Translate( const FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Copy */
+ /* */
+ /* <Description> */
+ /* Copy an outline into another one. Both objects must have the */
+ /* same sizes (number of points & number of contours) when this */
+ /* function is called. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source outline. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Copy( const FT_Outline* source,
+ FT_Outline *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Transform */
+ /* */
+ /* <Description> */
+ /* Apply a simple 2x2 matrix to all of an outline's points. Useful */
+ /* for applying rotations, slanting, flipping, etc. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation matrix. */
+ /* */
+ /* <Note> */
+ /* You can use @FT_Outline_Translate if you need to translate the */
+ /* outline's points. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Transform( const FT_Outline* outline,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be at most 4~times */
+ /* `strength' pixels wider and higher. You may think of the left and */
+ /* bottom borders as unchanged. */
+ /* */
+ /* Negative `strength' values to reduce the outline thickness are */
+ /* possible also. */
+ /* */
+ /* <InOut> */
+ /* outline :: A handle to the target outline. */
+ /* */
+ /* <Input> */
+ /* strength :: How strong the glyph is emboldened. Expressed in */
+ /* 26.6 pixel format. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The used algorithm to increase or decrease the thickness of the */
+ /* glyph doesn't change the number of points; this means that certain */
+ /* situations like acute angles or intersections are sometimes */
+ /* handled incorrectly. */
+ /* */
+ /* If you need `better' metrics values you should call */
+ /* @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. */
+ /* */
+ /* Example call: */
+ /* */
+ /* { */
+ /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */
+ /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */
+ /* FT_Outline_Embolden( &face->slot->outline, strength ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Embolden( FT_Outline* outline,
+ FT_Pos strength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_EmboldenXY */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be `xstrength' pixels */
+ /* wider and `ystrength' pixels higher. Otherwise, it is similar to */
+ /* @FT_Outline_Embolden, which uses the same strength in both */
+ /* directions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_EmboldenXY( FT_Outline* outline,
+ FT_Pos xstrength,
+ FT_Pos ystrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Reverse */
+ /* */
+ /* <Description> */
+ /* Reverse the drawing direction of an outline. This is used to */
+ /* ensure consistent fill conventions for mirrored glyphs. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Note> */
+ /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */
+ /* the outline's `flags' field. */
+ /* */
+ /* It shouldn't be used by a normal client application, unless it */
+ /* knows what it is doing. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Reverse( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_Bitmap */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap. The outline's image is simply */
+ /* OR-ed to the target bitmap. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the target bitmap descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does NOT CREATE the bitmap, it only renders an */
+ /* outline image within the one you pass to it! Consequently, the */
+ /* various fields in `abitmap' should be set accordingly. */
+ /* */
+ /* It will use the raster corresponding to the default glyph format. */
+ /* */
+ /* The value of the `num_grays' field in `abitmap' is ignored. If */
+ /* you select the gray-level rasterizer, and you want less than 256 */
+ /* gray levels, you have to use @FT_Outline_Render directly. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ const FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Render */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap using the current scan-convert. */
+ /* This function uses an @FT_Raster_Params structure as an argument, */
+ /* allowing advanced features like direct composition, translucency, */
+ /* etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* describe the rendering operation. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should know what you are doing and how @FT_Raster_Params works */
+ /* to use this function. */
+ /* */
+ /* The field `params.source' will be set to `outline' before the scan */
+ /* converter is called, which means that the value you give to it is */
+ /* actually ignored. */
+ /* */
+ /* The gray-level rasterizer always uses 256 gray levels. If you */
+ /* want less gray levels, you have to provide your own span callback. */
+ /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */
+ /* @FT_Raster_Params structure for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params );
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_Orientation
+ *
+ * @description:
+ * A list of values used to describe an outline's contour orientation.
+ *
+ * The TrueType and PostScript specifications use different conventions
+ * to determine whether outline contours should be filled or unfilled.
+ *
+ * @values:
+ * FT_ORIENTATION_TRUETYPE ::
+ * According to the TrueType specification, clockwise contours must
+ * be filled, and counter-clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_POSTSCRIPT ::
+ * According to the PostScript specification, counter-clockwise contours
+ * must be filled, and clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_FILL_RIGHT ::
+ * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+ * remember that in TrueType, everything that is to the right of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_FILL_LEFT ::
+ * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+ * remember that in PostScript, everything that is to the left of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_NONE ::
+ * The orientation cannot be determined. That is, different parts of
+ * the glyph have different orientation.
+ *
+ */
+ typedef enum FT_Orientation_
+ {
+ FT_ORIENTATION_TRUETYPE = 0,
+ FT_ORIENTATION_POSTSCRIPT = 1,
+ FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+ FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT,
+ FT_ORIENTATION_NONE
+
+ } FT_Orientation;
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Outline_Get_Orientation
+ *
+ * @description:
+ * This function analyzes a glyph outline and tries to compute its
+ * fill orientation (see @FT_Orientation). This is done by computing
+ * the direction of each global horizontal and/or vertical extrema
+ * within the outline.
+ *
+ * Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+ * outlines.
+ *
+ * @input:
+ * outline ::
+ * A handle to the source outline.
+ *
+ * @return:
+ * The orientation.
+ *
+ */
+ FT_EXPORT( FT_Orientation )
+ FT_Outline_Get_Orientation( FT_Outline* outline );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
new file mode 100644
index 0000000000..62cd67e876
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/* */
+/* ftpfr.h */
+/* */
+/* FreeType API for accessing PFR-specific data (specification only). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* pfr_fonts */
+ /* */
+ /* <Title> */
+ /* PFR Fonts */
+ /* */
+ /* <Abstract> */
+ /* PFR/TrueDoc specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of PFR-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Metrics
+ *
+ * @description:
+ * Return the outline and metrics resolutions of a given PFR face.
+ *
+ * @input:
+ * face :: Handle to the input face. It can be a non-PFR face.
+ *
+ * @output:
+ * aoutline_resolution ::
+ * Outline resolution. This is equivalent to `face->units_per_EM'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_resolution ::
+ * Metrics resolution. This is equivalent to `outline_resolution'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_x_scale ::
+ * A 16.16 fixed-point number used to scale distance expressed
+ * in metrics units to device sub-pixels. This is equivalent to
+ * `face->size->x_scale', but for metrics only. Optional (parameter
+ * can be NULL).
+ *
+ * ametrics_y_scale ::
+ * Same as `ametrics_x_scale' but for the vertical direction.
+ * optional (parameter can be NULL).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If the input face is not a PFR, this function will return an error.
+ * However, in all cases, it will return valid values.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Metrics( FT_Face face,
+ FT_UInt *aoutline_resolution,
+ FT_UInt *ametrics_resolution,
+ FT_Fixed *ametrics_x_scale,
+ FT_Fixed *ametrics_y_scale );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Kerning
+ *
+ * @description:
+ * Return the kerning pair corresponding to two glyphs in a PFR face.
+ * The distance is expressed in metrics units, unlike the result of
+ * @FT_Get_Kerning.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * left :: Index of the left glyph.
+ *
+ * right :: Index of the right glyph.
+ *
+ * @output:
+ * avector :: A kerning vector.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function always return distances in original PFR metrics
+ * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+ * mode, which always returns distances converted to outline units.
+ *
+ * You can use the value of the `x_scale' and `y_scale' parameters
+ * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Kerning( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Advance
+ *
+ * @description:
+ * Return a given glyph advance, expressed in original metrics units,
+ * from a PFR font.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * gindex :: The glyph index.
+ *
+ * @output:
+ * aadvance :: The glyph advance in metrics units.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+ * to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
new file mode 100644
index 0000000000..b1437df76f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/* */
+/* ftrender.h */
+/* */
+/* FreeType renderer modules public interface (specification). */
+/* */
+/* Copyright 1996-2001, 2005, 2006, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include "../ft2build.h"
+#include "ftmodapi.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /*************************************************************************/
+
+
+ /* create a new glyph object */
+ typedef FT_Error
+ (*FT_Glyph_InitFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+ /* destroys a given glyph object */
+ typedef void
+ (*FT_Glyph_DoneFunc)( FT_Glyph glyph );
+
+ typedef void
+ (*FT_Glyph_TransformFunc)( FT_Glyph glyph,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+ typedef void
+ (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph,
+ FT_BBox* abbox );
+
+ typedef FT_Error
+ (*FT_Glyph_CopyFunc)( FT_Glyph source,
+ FT_Glyph target );
+
+ typedef FT_Error
+ (*FT_Glyph_PrepareFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc
+
+
+ struct FT_Glyph_Class_
+ {
+ FT_Long glyph_size;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_InitFunc glyph_init;
+ FT_Glyph_DoneFunc glyph_done;
+ FT_Glyph_CopyFunc glyph_copy;
+ FT_Glyph_TransformFunc glyph_transform;
+ FT_Glyph_GetBBoxFunc glyph_bbox;
+ FT_Glyph_PrepareFunc glyph_prepare;
+ };
+
+
+ typedef FT_Error
+ (*FT_Renderer_RenderFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_UInt mode,
+ const FT_Vector* origin );
+
+ typedef FT_Error
+ (*FT_Renderer_TransformFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+
+ typedef void
+ (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox );
+
+
+ typedef FT_Error
+ (*FT_Renderer_SetModeFunc)( FT_Renderer renderer,
+ FT_ULong mode_tag,
+ FT_Pointer mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render FT_Renderer_RenderFunc
+#define FTRenderer_transform FT_Renderer_TransformFunc
+#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode FT_Renderer_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Renderer_Class */
+ /* */
+ /* <Description> */
+ /* The renderer module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Module_Class fields. */
+ /* */
+ /* glyph_format :: The glyph image format this renderer handles. */
+ /* */
+ /* render_glyph :: A method used to render the image that is in a */
+ /* given glyph slot into a bitmap. */
+ /* */
+ /* transform_glyph :: A method used to transform the image that is in */
+ /* a given glyph slot. */
+ /* */
+ /* get_glyph_cbox :: A method used to access the glyph's cbox. */
+ /* */
+ /* set_mode :: A method used to pass additional parameters. */
+ /* */
+ /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */
+ /* This is a pointer to its raster's class. */
+ /* */
+ typedef struct FT_Renderer_Class_
+ {
+ FT_Module_Class root;
+
+ FT_Glyph_Format glyph_format;
+
+ FT_Renderer_RenderFunc render_glyph;
+ FT_Renderer_TransformFunc transform_glyph;
+ FT_Renderer_GetCBoxFunc get_glyph_cbox;
+ FT_Renderer_SetModeFunc set_mode;
+
+ FT_Raster_Funcs* raster_class;
+
+ } FT_Renderer_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Renderer */
+ /* */
+ /* <Description> */
+ /* Retrieve the current renderer for a given glyph format. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* format :: The glyph format. */
+ /* */
+ /* <Return> */
+ /* A renderer handle. 0~if none found. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */
+ /* renderer by its name, use @FT_Get_Module. */
+ /* */
+ FT_EXPORT( FT_Renderer )
+ FT_Get_Renderer( FT_Library library,
+ FT_Glyph_Format format );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Renderer */
+ /* */
+ /* <Description> */
+ /* Set the current renderer to use, and set additional mode. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* renderer :: A handle to the renderer object. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* parameters :: Additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case of success, the renderer will be used to convert glyph */
+ /* images in the renderer's known format into bitmaps. */
+ /* */
+ /* This doesn't change the current renderer for other formats. */
+ /* */
+ /* Currently, only the B/W renderer, if compiled with */
+ /* FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels */
+ /* anti-aliasing mode; this option must be set directly in */
+ /* `ftraster.c' and is undefined by default) accepts a single tag */
+ /* `pal5' to set its gray palette as a character string with */
+ /* 5~elements. Consequently, the third and fourth argument are zero */
+ /* normally. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Renderer( FT_Library library,
+ FT_Renderer renderer,
+ FT_UInt num_params,
+ FT_Parameter* parameters );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
new file mode 100644
index 0000000000..a4b449bcdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/* */
+/* ftsizes.h */
+/* */
+/* FreeType size objects management (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Typical application would normally not need to use these functions. */
+ /* However, they have been placed in a public API for the rare cases */
+ /* where they are needed. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sizes_management */
+ /* */
+ /* <Title> */
+ /* Size Management */
+ /* */
+ /* <Abstract> */
+ /* Managing multiple sizes per face. */
+ /* */
+ /* <Description> */
+ /* When creating a new face object (e.g., with @FT_New_Face), an */
+ /* @FT_Size object is automatically created and used to store all */
+ /* pixel-size dependent information, available in the `face->size' */
+ /* field. */
+ /* */
+ /* It is however possible to create more sizes for a given face, */
+ /* mostly in order to manage several character pixel sizes of the */
+ /* same font family and style. See @FT_New_Size and @FT_Done_Size. */
+ /* */
+ /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */
+ /* modify the contents of the current `active' size; you thus need */
+ /* to use @FT_Activate_Size to change it. */
+ /* */
+ /* 99% of applications won't need the functions provided here, */
+ /* especially if they use the caching sub-system, so be cautious */
+ /* when using these. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Size */
+ /* */
+ /* <Description> */
+ /* Create a new size object from a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to a new size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You need to call @FT_Activate_Size in order to select the new size */
+ /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */
+ /* @FT_Load_Glyph, @FT_Load_Char, etc. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Size( FT_Face face,
+ FT_Size* size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Size */
+ /* */
+ /* <Description> */
+ /* Discard a given size object. Note that @FT_Done_Face */
+ /* automatically discards all size objects allocated with */
+ /* @FT_New_Size. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Size( FT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Activate_Size */
+ /* */
+ /* <Description> */
+ /* Even though it is possible to create several size objects for a */
+ /* given face (see @FT_New_Size for details), functions like */
+ /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */
+ /* activated last to determine the `current character pixel size'. */
+ /* */
+ /* This function can be used to `activate' a previously created size */
+ /* object. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If `face' is the size's parent face object, this function changes */
+ /* the value of `face->size' to the input size handle. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Activate_Size( FT_Size size );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
new file mode 100644
index 0000000000..a13db81187
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/* */
+/* ftsnames.h */
+/* */
+/* Simple interface to access SFNT name tables (which are used */
+/* to hold font names, copyright info, notices, etc.) (specification). */
+/* */
+/* This is _not_ used to retrieve glyph names! */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sfnt_names */
+ /* */
+ /* <Title> */
+ /* SFNT Names */
+ /* */
+ /* <Abstract> */
+ /* Access the names embedded in TrueType and OpenType files. */
+ /* */
+ /* <Description> */
+ /* The TrueType and OpenType specifications allow the inclusion of */
+ /* a special `names table' in font files. This table contains */
+ /* textual (and internationalized) information regarding the font, */
+ /* like family name, copyright, version, etc. */
+ /* */
+ /* The definitions below are used to access them if available. */
+ /* */
+ /* Note that this has nothing to do with glyph names! */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SfntName */
+ /* */
+ /* <Description> */
+ /* A structure used to model an SFNT `name' table entry. */
+ /* */
+ /* <Fields> */
+ /* platform_id :: The platform ID for `string'. */
+ /* */
+ /* encoding_id :: The encoding ID for `string'. */
+ /* */
+ /* language_id :: The language ID for `string'. */
+ /* */
+ /* name_id :: An identifier for `string'. */
+ /* */
+ /* string :: The `name' string. Note that its format differs */
+ /* depending on the (platform,encoding) pair. It can */
+ /* be a Pascal String, a UTF-16 one, etc. */
+ /* */
+ /* Generally speaking, the string is not */
+ /* zero-terminated. Please refer to the TrueType */
+ /* specification for details. */
+ /* */
+ /* string_len :: The length of `string' in bytes. */
+ /* */
+ /* <Note> */
+ /* Possible values for `platform_id', `encoding_id', `language_id', */
+ /* and `name_id' are given in the file `ttnameid.h'. For details */
+ /* please refer to the TrueType or OpenType specification. */
+ /* */
+ /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */
+ /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */
+ /* */
+ typedef struct FT_SfntName_
+ {
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+ FT_UShort language_id;
+ FT_UShort name_id;
+
+ FT_Byte* string; /* this string is *not* null-terminated! */
+ FT_UInt string_len; /* in bytes */
+
+ } FT_SfntName;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name_Count */
+ /* */
+ /* <Description> */
+ /* Retrieve the number of name strings in the SFNT `name' table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Return> */
+ /* The number of strings in the `name' table. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Sfnt_Name_Count( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve a string of the SFNT `name' table for a given index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* idx :: The index of the `name' string. */
+ /* */
+ /* <Output> */
+ /* aname :: The indexed @FT_SfntName structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `string' array returned in the `aname' structure is not */
+ /* null-terminated. The application should deallocate it if it is no */
+ /* longer in use. */
+ /* */
+ /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */
+ /* `name' table entries, then do a loop until you get the right */
+ /* platform, encoding, and name ID. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Sfnt_Name( FT_Face face,
+ FT_UInt idx,
+ FT_SfntName *aname );
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred family subfamily names in `name'
+ * table since OpenType version 1.4. For backwards compatibility with
+ * legacy systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred subfamily names in `name' table since
+ * OpenType version 1.4. For backwards compatibility with legacy
+ * systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
new file mode 100644
index 0000000000..05f9a132f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
@@ -0,0 +1,751 @@
+/***************************************************************************/
+/* */
+/* ftstroke.h */
+/* */
+/* FreeType path stroker (specification). */
+/* */
+/* Copyright 2002-2006, 2008, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include "../ft2build.h"
+#include "ftoutln.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+ *
+ * @section:
+ * glyph_stroker
+ *
+ * @title:
+ * Glyph Stroker
+ *
+ * @abstract:
+ * Generating bordered and stroked glyphs.
+ *
+ * @description:
+ * This component generates stroked outlines of a given vectorial
+ * glyph. It also allows you to retrieve the `outside' and/or the
+ * `inside' borders of the stroke.
+ *
+ * This can be useful to generate `bordered' glyph, i.e., glyphs
+ * displayed with a coloured (and anti-aliased) border around their
+ * shape.
+ */
+
+
+ /**************************************************************
+ *
+ * @type:
+ * FT_Stroker
+ *
+ * @description:
+ * Opaque handler to a path stroker object.
+ */
+ typedef struct FT_StrokerRec_* FT_Stroker;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineJoin
+ *
+ * @description:
+ * These values determine how two joining lines are rendered
+ * in a stroker.
+ *
+ * @values:
+ * FT_STROKER_LINEJOIN_ROUND ::
+ * Used to render rounded line joins. Circular arcs are used
+ * to join two lines smoothly.
+ *
+ * FT_STROKER_LINEJOIN_BEVEL ::
+ * Used to render beveled line joins. The outer corner of
+ * the joined lines is filled by enclosing the triangular
+ * region of the corner with a straight line between the
+ * outer corners of each stroke.
+ *
+ * FT_STROKER_LINEJOIN_MITER_FIXED ::
+ * Used to render mitered line joins, with fixed bevels if the
+ * miter limit is exceeded. The outer edges of the strokes
+ * for the two segments are extended until they meet at an
+ * angle. If the segments meet at too sharp an angle (such
+ * that the miter would extend from the intersection of the
+ * segments a distance greater than the product of the miter
+ * limit value and the border radius), then a bevel join (see
+ * above) is used instead. This prevents long spikes being
+ * created. FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+ * line join as used in PostScript and PDF.
+ *
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+ * FT_STROKER_LINEJOIN_MITER ::
+ * Used to render mitered line joins, with variable bevels if
+ * the miter limit is exceeded. The intersection of the
+ * strokes is clipped at a line perpendicular to the bisector
+ * of the angle between the strokes, at the distance from the
+ * intersection of the segments equal to the product of the
+ * miter limit value and the border radius. This prevents
+ * long spikes being created.
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+ * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias
+ * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+ * backwards compatibility.
+ */
+ typedef enum FT_Stroker_LineJoin_
+ {
+ FT_STROKER_LINEJOIN_ROUND = 0,
+ FT_STROKER_LINEJOIN_BEVEL = 1,
+ FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+ FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+ FT_STROKER_LINEJOIN_MITER_FIXED = 3
+
+ } FT_Stroker_LineJoin;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineCap
+ *
+ * @description:
+ * These values determine how the end of opened sub-paths are
+ * rendered in a stroke.
+ *
+ * @values:
+ * FT_STROKER_LINECAP_BUTT ::
+ * The end of lines is rendered as a full stop on the last
+ * point itself.
+ *
+ * FT_STROKER_LINECAP_ROUND ::
+ * The end of lines is rendered as a half-circle around the
+ * last point.
+ *
+ * FT_STROKER_LINECAP_SQUARE ::
+ * The end of lines is rendered as a square around the
+ * last point.
+ */
+ typedef enum FT_Stroker_LineCap_
+ {
+ FT_STROKER_LINECAP_BUTT = 0,
+ FT_STROKER_LINECAP_ROUND,
+ FT_STROKER_LINECAP_SQUARE
+
+ } FT_Stroker_LineCap;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_StrokerBorder
+ *
+ * @description:
+ * These values are used to select a given stroke border
+ * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+ *
+ * @values:
+ * FT_STROKER_BORDER_LEFT ::
+ * Select the left border, relative to the drawing direction.
+ *
+ * FT_STROKER_BORDER_RIGHT ::
+ * Select the right border, relative to the drawing direction.
+ *
+ * @note:
+ * Applications are generally interested in the `inside' and `outside'
+ * borders. However, there is no direct mapping between these and the
+ * `left' and `right' ones, since this really depends on the glyph's
+ * drawing orientation, which varies between font formats.
+ *
+ * You can however use @FT_Outline_GetInsideBorder and
+ * @FT_Outline_GetOutsideBorder to get these.
+ */
+ typedef enum FT_StrokerBorder_
+ {
+ FT_STROKER_BORDER_LEFT = 0,
+ FT_STROKER_BORDER_RIGHT
+
+ } FT_StrokerBorder;
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetInsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `inside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetInsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetOutsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `outside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetOutsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_New
+ *
+ * @description:
+ * Create a new stroker object.
+ *
+ * @input:
+ * library ::
+ * FreeType library handle.
+ *
+ * @output:
+ * astroker ::
+ * A new stroker object handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_New( FT_Library library,
+ FT_Stroker *astroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Set
+ *
+ * @description:
+ * Reset a stroker object's attributes.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * radius ::
+ * The border radius.
+ *
+ * line_cap ::
+ * The line cap style.
+ *
+ * line_join ::
+ * The line join style.
+ *
+ * miter_limit ::
+ * The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+ * expressed as 16.16 fixed-point value.
+ *
+ * @note:
+ * The radius is expressed in the same units as the outline
+ * coordinates.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Set( FT_Stroker stroker,
+ FT_Fixed radius,
+ FT_Stroker_LineCap line_cap,
+ FT_Stroker_LineJoin line_join,
+ FT_Fixed miter_limit );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Rewind
+ *
+ * @description:
+ * Reset a stroker object without changing its attributes.
+ * You should call this function before beginning a new
+ * series of calls to @FT_Stroker_BeginSubPath or
+ * @FT_Stroker_EndSubPath.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Rewind( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ParseOutline
+ *
+ * @description:
+ * A convenience function used to parse a whole outline with
+ * the stroker. The resulting outline(s) can be retrieved
+ * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The source outline.
+ *
+ * opened ::
+ * A boolean. If~1, the outline is treated as an open path instead
+ * of a closed one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `opened' is~0 (the default), the outline is treated as a closed
+ * path, and the stroker generates two distinct `border' outlines.
+ *
+ * If `opened' is~1, the outline is processed as an open path, and the
+ * stroker generates a single `stroke' outline.
+ *
+ * This function calls @FT_Stroker_Rewind automatically.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ParseOutline( FT_Stroker stroker,
+ FT_Outline* outline,
+ FT_Bool opened );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_BeginSubPath
+ *
+ * @description:
+ * Start a new sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the start vector.
+ *
+ * open ::
+ * A boolean. If~1, the sub-path is treated as an open one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function is useful when you need to stroke a path that is
+ * not stored as an @FT_Outline object.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_BeginSubPath( FT_Stroker stroker,
+ FT_Vector* to,
+ FT_Bool open );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_EndSubPath
+ *
+ * @description:
+ * Close the current sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function after @FT_Stroker_BeginSubPath.
+ * If the subpath was not `opened', this function `draws' a
+ * single line segment to the start position when needed.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_EndSubPath( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_LineTo
+ *
+ * @description:
+ * `Draw' a single line segment in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_LineTo( FT_Stroker stroker,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ConicTo
+ *
+ * @description:
+ * `Draw' a single quadratic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control ::
+ * A pointer to a Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ConicTo( FT_Stroker stroker,
+ FT_Vector* control,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_CubicTo
+ *
+ * @description:
+ * `Draw' a single cubic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control1 ::
+ * A pointer to the first Bézier control point.
+ *
+ * control2 ::
+ * A pointer to second Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_CubicTo( FT_Stroker stroker,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetBorderCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export one of the `border' or `stroke'
+ * outlines generated by the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'.
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_GetCounts instead if you want to
+ * retrieve the counts associated to both borders.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetBorderCounts( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ExportBorder
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export the corresponding border to your own @FT_Outline
+ * structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * outline ::
+ * The target outline handle.
+ *
+ * @note:
+ * Always call this function after @FT_Stroker_GetBorderCounts to
+ * get sure that there is enough room in your @FT_Outline object to
+ * receive all new data.
+ *
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_Export instead if you want to
+ * retrieve all borders at once.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_ExportBorder( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export all points/borders from the stroked
+ * outline/path.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetCounts( FT_Stroker stroker,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Export
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export all borders to your own @FT_Outline structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The target outline handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Export( FT_Stroker stroker,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Done
+ *
+ * @description:
+ * Destroy a stroker object.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle. Can be NULL.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Done( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_Stroke
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Stroke( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool destroy );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_StrokeBorder
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker, but
+ * only return either its inside or outside border.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * inside ::
+ * A Boolean. If~1, return the inside border, otherwise
+ * the outside border.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_StrokeBorder( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool inside,
+ FT_Bool destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
new file mode 100644
index 0000000000..55f32d6956
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* ftsynth.h */
+/* */
+/* FreeType synthesizing code for emboldening and slanting */
+/* (specification). */
+/* */
+/* Copyright 2000-2001, 2003, 2006, 2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********* *********/
+ /********* WARNING, THIS IS ALPHA CODE! THIS API *********/
+ /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/
+ /********* FREETYPE DEVELOPMENT TEAM *********/
+ /********* *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* Main reason for not lifting the functions in this module to a */
+ /* `standard' API is that the used parameters for emboldening and */
+ /* slanting are not configurable. Consider the functions as a */
+ /* code resource which should be copied into the application and */
+ /* adapted to the particular needs. */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+ /* taste). This function is actually a convenience function, providing */
+ /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */
+ /* */
+ /* For emboldened outlines the height, width, and advance metrics are */
+ /* increased by the strength of the emboldening. You can also call */
+ /* @FT_Outline_Get_CBox to get precise values. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Embolden( FT_GlyphSlot slot );
+
+ /* Slant an outline glyph to the right by about 12 degrees. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Oblique( FT_GlyphSlot slot );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
new file mode 100644
index 0000000000..1e92390aca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
@@ -0,0 +1,354 @@
+/***************************************************************************/
+/* */
+/* ftsystem.h */
+/* */
+/* FreeType low-level system interface definition (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* system_interface */
+ /* */
+ /* <Title> */
+ /* System Interface */
+ /* */
+ /* <Abstract> */
+ /* How FreeType manages memory and i/o. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to memory */
+ /* management and i/o access. You need to understand this */
+ /* information if you want to use a custom memory manager or you own */
+ /* i/o streams. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* M E M O R Y M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Memory
+ *
+ * @description:
+ * A handle to a given memory manager object, defined with an
+ * @FT_MemoryRec structure.
+ *
+ */
+ typedef struct FT_MemoryRec_* FT_Memory;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Alloc_Func
+ *
+ * @description:
+ * A function used to allocate `size' bytes from `memory'.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * size ::
+ * The size in bytes to allocate.
+ *
+ * @return:
+ * Address of new memory block. 0~in case of failure.
+ *
+ */
+ typedef void*
+ (*FT_Alloc_Func)( FT_Memory memory,
+ long size );
+
+ /* Sunliang.Liu 20100915 sync 221's revison. */
+ typedef void*
+ (*FT_AllocDebug_Func)( FT_Memory memory,
+ long size, const char* filename, int line);
+
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Free_Func
+ *
+ * @description:
+ * A function used to release a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * block ::
+ * The address of the target memory block.
+ *
+ */
+ typedef void
+ (*FT_Free_Func)( FT_Memory memory,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Realloc_Func
+ *
+ * @description:
+ * A function used to re-allocate a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * cur_size ::
+ * The block's current size in bytes.
+ *
+ * new_size ::
+ * The block's requested new size.
+ *
+ * block ::
+ * The block's current address.
+ *
+ * @return:
+ * New block address. 0~in case of memory shortage.
+ *
+ * @note:
+ * In case of error, the old block must still be available.
+ *
+ */
+ typedef void*
+ (*FT_Realloc_Func)( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_MemoryRec
+ *
+ * @description:
+ * A structure used to describe a given memory manager to FreeType~2.
+ *
+ * @fields:
+ * user ::
+ * A generic typeless pointer for user data.
+ *
+ * alloc ::
+ * A pointer type to an allocation function.
+ *
+ * free ::
+ * A pointer type to an memory freeing function.
+ *
+ * realloc ::
+ * A pointer type to a reallocation function.
+ *
+ */
+ struct FT_MemoryRec_
+ {
+ void* user;
+ FT_Alloc_Func alloc;
+ FT_AllocDebug_Func allocdebug; /* Sunliang.Liu 20100915 sync 221's revison. */
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* I / O M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Stream
+ *
+ * @description:
+ * A handle to an input stream.
+ *
+ */
+ typedef struct FT_StreamRec_* FT_Stream;
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamDesc
+ *
+ * @description:
+ * A union type used to store either a long or a pointer. This is used
+ * to store a file descriptor or a `FILE*' in an input stream.
+ *
+ */
+ typedef union FT_StreamDesc_
+ {
+ long value;
+ void* pointer;
+
+ } FT_StreamDesc;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_IoFunc
+ *
+ * @description:
+ * A function used to seek and read data from a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the source stream.
+ *
+ * offset ::
+ * The offset of read in stream (always from start).
+ *
+ * buffer ::
+ * The address of the read buffer.
+ *
+ * count ::
+ * The number of bytes to read from the stream.
+ *
+ * @return:
+ * The number of bytes effectively read by the stream.
+ *
+ * @note:
+ * This function might be called to perform a seek or skip operation
+ * with a `count' of~0. A non-zero return value then indicates an
+ * error.
+ *
+ */
+ typedef unsigned long
+ (*FT_Stream_IoFunc)( FT_Stream stream,
+ unsigned long offset,
+ unsigned char* buffer,
+ unsigned long count );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_CloseFunc
+ *
+ * @description:
+ * A function used to close a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the target stream.
+ *
+ */
+ typedef void
+ (*FT_Stream_CloseFunc)( FT_Stream stream );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamRec
+ *
+ * @description:
+ * A structure used to describe an input stream.
+ *
+ * @input:
+ * base ::
+ * For memory-based streams, this is the address of the first stream
+ * byte in memory. This field should always be set to NULL for
+ * disk-based streams.
+ *
+ * size ::
+ * The stream size in bytes.
+ *
+ * pos ::
+ * The current position within the stream.
+ *
+ * descriptor ::
+ * This field is a union that can hold an integer or a pointer. It is
+ * used by stream implementations to store file descriptors or `FILE*'
+ * pointers.
+ *
+ * pathname ::
+ * This field is completely ignored by FreeType. However, it is often
+ * useful during debugging to use it to store the stream's filename
+ * (where available).
+ *
+ * read ::
+ * The stream's input function.
+ *
+ * close ::
+ * The stream's close function.
+ *
+ * memory ::
+ * The memory manager to use to preload frames. This is set
+ * internally by FreeType and shouldn't be touched by stream
+ * implementations.
+ *
+ * cursor ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ * limit ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ */
+ typedef struct FT_StreamRec_
+ {
+ unsigned char* base;
+ unsigned long size;
+ unsigned long pos;
+
+ FT_StreamDesc descriptor;
+ FT_StreamDesc pathname;
+ FT_Stream_IoFunc read;
+ FT_Stream_CloseFunc close;
+
+ FT_Memory memory;
+ unsigned char* cursor;
+ unsigned char* limit;
+
+ } FT_StreamRec;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
new file mode 100644
index 0000000000..111c63edef
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/* */
+/* fttrigon.h */
+/* */
+/* FreeType trigonometric functions (specification). */
+/* */
+/* Copyright 2001, 2003, 2005, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Angle
+ *
+ * @description:
+ * This type is used to model angle values in FreeType. Note that the
+ * angle is a 16.16 fixed-point value expressed in degrees.
+ *
+ */
+ typedef FT_Fixed FT_Angle;
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI
+ *
+ * @description:
+ * The angle pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI ( 180L << 16 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_2PI
+ *
+ * @description:
+ * The angle 2*pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI2
+ *
+ * @description:
+ * The angle pi/2 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI4
+ *
+ * @description:
+ * The angle pi/4 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 )
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Sin
+ *
+ * @description:
+ * Return the sinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The sinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Sin( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Cos
+ *
+ * @description:
+ * Return the cosinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The cosinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Cos( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Tan
+ *
+ * @description:
+ * Return the tangent of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The tangent value.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Tan( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Atan2
+ *
+ * @description:
+ * Return the arc-tangent corresponding to a given vector (x,y) in
+ * the 2d plane.
+ *
+ * @input:
+ * x ::
+ * The horizontal vector coordinate.
+ *
+ * y ::
+ * The vertical vector coordinate.
+ *
+ * @return:
+ * The arc-tangent value (i.e. angle).
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Atan2( FT_Fixed x,
+ FT_Fixed y );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Angle_Diff
+ *
+ * @description:
+ * Return the difference between two angles. The result is always
+ * constrained to the ]-PI..PI] interval.
+ *
+ * @input:
+ * angle1 ::
+ * First angle.
+ *
+ * angle2 ::
+ * Second angle.
+ *
+ * @return:
+ * Constrained value of `value2-value1'.
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Angle_Diff( FT_Angle angle1,
+ FT_Angle angle2 );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Unit
+ *
+ * @description:
+ * Return the unit vector corresponding to a given angle. After the
+ * call, the value of `vec.x' will be `sin(angle)', and the value of
+ * `vec.y' will be `cos(angle)'.
+ *
+ * This function is useful to retrieve both the sinus and cosinus of a
+ * given angle quickly.
+ *
+ * @output:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Unit( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Rotate
+ *
+ * @description:
+ * Rotate a vector by a given angle.
+ *
+ * @inout:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Rotate( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Length
+ *
+ * @description:
+ * Return the length of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of target vector.
+ *
+ * @return:
+ * The vector length, expressed in the same units that the original
+ * vector coordinates.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Vector_Length( FT_Vector* vec );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Polarize
+ *
+ * @description:
+ * Compute both the length and angle of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of source vector.
+ *
+ * @output:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Polarize( FT_Vector* vec,
+ FT_Fixed *length,
+ FT_Angle *angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_From_Polar
+ *
+ * @description:
+ * Compute vector coordinates from a length and angle.
+ *
+ * @output:
+ * vec ::
+ * The address of source vector.
+ *
+ * @input:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_From_Polar( FT_Vector* vec,
+ FT_Fixed length,
+ FT_Angle angle );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
new file mode 100644
index 0000000000..01b25a4808
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/* */
+/* ftttdrv.h */
+/* */
+/* FreeType API for controlling the TrueType driver */
+/* (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTTDRV_H__
+#define __FTTTDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * tt_driver
+ *
+ * @title:
+ * The TrueType driver
+ *
+ * @abstract:
+ * Controlling the TrueType driver module.
+ *
+ * @description:
+ * While FreeType's TrueType driver doesn't expose API functions by
+ * itself, it is possible to control its behaviour with @FT_Property_Set
+ * and @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The TrueType driver's module name is `truetype'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * interpreter-version
+ *
+ * @description:
+ * Currently, two versions are available which represent the bytecode
+ * interpreter with and without subpixel hinting support,
+ * respectively. The default is subpixel support if
+ * TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
+ * support otherwise (since it isn't available then).
+ *
+ * If subpixel hinting is on, many TrueType bytecode instructions
+ * behave differently compared to B/W or grayscale rendering. The
+ * main idea is to render at a much increased horizontal resolution,
+ * then sampling down the created output to subpixel precision.
+ * However, many older fonts are not suited to this and must be
+ * specially taken care of by applying (hardcoded) font-specific
+ * tweaks.
+ *
+ * Details on subpixel hinting and some of the necessary tweaks can be
+ * found in Greg Hitchcock's whitepaper at
+ * `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+ *
+ * The following example code demonstrates how to activate subpixel
+ * hinting (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_38;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "truetype",
+ * "interpreter-version",
+ * &interpreter_version );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * TT_INTERPRETER_VERSION_XXX
+ *
+ * @description:
+ * A list of constants used for the @interpreter-version property to
+ * select the hinting engine for Truetype fonts.
+ *
+ * The numeric value in the constant names represents the version
+ * number as returned by the `GETINFO' bytecode instruction.
+ *
+ * @values:
+ * TT_INTERPRETER_VERSION_35 ::
+ * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+ * Windows~98; only grayscale and B/W rasterizing is supported.
+ *
+ * TT_INTERPRETER_VERSION_38 ::
+ * Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+ * equivalent to the hinting provided by DirectWrite ClearType (as
+ * can be found, for example, in the Internet Explorer~9 running on
+ * Windows~7).
+ *
+ * @note:
+ * This property controls the behaviour of the bytecode interpreter
+ * and thus how outlines get hinted. It does *not* control how glyph
+ * get rasterized! In particular, it does not control subpixel color
+ * filtering.
+ *
+ * If FreeType has not been compiled with configuration option
+ * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
+ * `FT_Err_Unimplemented_Feature' error.
+ *
+ */
+#define TT_INTERPRETER_VERSION_35 35
+#define TT_INTERPRETER_VERSION_38 38
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTTTDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
new file mode 100644
index 0000000000..4d11bed469
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
@@ -0,0 +1,598 @@
+/***************************************************************************/
+/* */
+/* fttypes.h */
+/* */
+/* FreeType simple types definitions (specification only). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "ftsystem.h"
+#include "ftimage.h"
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /* <Title> */
+ /* Basic Data Types */
+ /* */
+ /* <Abstract> */
+ /* The basic data types defined by the library. */
+ /* */
+ /* <Description> */
+ /* This section contains the basic data types defined by FreeType~2, */
+ /* ranging from simple scalar types to bitmap descriptors. More */
+ /* font-specific structures are defined in a different section. */
+ /* */
+ /* <Order> */
+ /* FT_Byte */
+ /* FT_Bytes */
+ /* FT_Char */
+ /* FT_Int */
+ /* FT_UInt */
+ /* FT_Int16 */
+ /* FT_UInt16 */
+ /* FT_Int32 */
+ /* FT_UInt32 */
+ /* FT_Short */
+ /* FT_UShort */
+ /* FT_Long */
+ /* FT_ULong */
+ /* FT_Bool */
+ /* FT_Offset */
+ /* FT_PtrDist */
+ /* FT_String */
+ /* FT_Tag */
+ /* FT_Error */
+ /* FT_Fixed */
+ /* FT_Pointer */
+ /* FT_Pos */
+ /* FT_Vector */
+ /* FT_BBox */
+ /* FT_Matrix */
+ /* FT_FWord */
+ /* FT_UFWord */
+ /* FT_F2Dot14 */
+ /* FT_UnitVector */
+ /* FT_F26Dot6 */
+ /* */
+ /* */
+ /* FT_Generic */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* FT_Bitmap */
+ /* FT_Pixel_Mode */
+ /* FT_Palette_Mode */
+ /* FT_Glyph_Format */
+ /* FT_IMAGE_TAG */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bool */
+ /* */
+ /* <Description> */
+ /* A typedef of unsigned char, used for simple booleans. As usual, */
+ /* values 1 and~0 represent true and false, respectively. */
+ /* */
+ typedef unsigned char FT_Bool;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_FWord */
+ /* */
+ /* <Description> */
+ /* A signed 16-bit integer used to store a distance in original font */
+ /* units. */
+ /* */
+ typedef signed short FT_FWord; /* distance in FUnits */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UFWord */
+ /* */
+ /* <Description> */
+ /* An unsigned 16-bit integer used to store a distance in original */
+ /* font units. */
+ /* */
+ typedef unsigned short FT_UFWord; /* unsigned distance */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Char */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _signed_ char type. */
+ /* */
+ typedef signed char FT_Char;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Byte */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _unsigned_ char type. */
+ /* */
+ typedef unsigned char FT_Byte;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bytes */
+ /* */
+ /* <Description> */
+ /* A typedef for constant memory areas. */
+ /* */
+ typedef const FT_Byte* FT_Bytes;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Tag */
+ /* */
+ /* <Description> */
+ /* A typedef for 32-bit tags (as used in the SFNT format). */
+ /* */
+ typedef FT_UInt32 FT_Tag;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_String */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the char type, usually used for strings. */
+ /* */
+ typedef char FT_String;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Short */
+ /* */
+ /* <Description> */
+ /* A typedef for signed short. */
+ /* */
+ typedef signed short FT_Short;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UShort */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned short. */
+ /* */
+ typedef unsigned short FT_UShort;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int */
+ /* */
+ /* <Description> */
+ /* A typedef for the int type. */
+ /* */
+ typedef signed int FT_Int;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt */
+ /* */
+ /* <Description> */
+ /* A typedef for the unsigned int type. */
+ /* */
+ typedef unsigned int FT_UInt;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Long */
+ /* */
+ /* <Description> */
+ /* A typedef for signed long. */
+ /* */
+ typedef signed long FT_Long;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ULong */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned long. */
+ /* */
+ typedef unsigned long FT_ULong;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F2Dot14 */
+ /* */
+ /* <Description> */
+ /* A signed 2.14 fixed-point type used for unit vectors. */
+ /* */
+ typedef signed short FT_F2Dot14;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F26Dot6 */
+ /* */
+ /* <Description> */
+ /* A signed 26.6 fixed-point type used for vectorial pixel */
+ /* coordinates. */
+ /* */
+ typedef signed long FT_F26Dot6;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Fixed */
+ /* */
+ /* <Description> */
+ /* This type is used to store 16.16 fixed-point values, like scaling */
+ /* values or matrix coefficients. */
+ /* */
+ typedef signed long FT_Fixed;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Error */
+ /* */
+ /* <Description> */
+ /* The FreeType error code type. A value of~0 is always interpreted */
+ /* as a successful operation. */
+ /* */
+ typedef int FT_Error;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pointer */
+ /* */
+ /* <Description> */
+ /* A simple typedef for a typeless pointer. */
+ /* */
+ typedef void* FT_Pointer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Offset */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */
+ /* _unsigned_ integer type used to express a file size or position, */
+ /* or a memory block size. */
+ /* */
+ typedef size_t FT_Offset;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_PtrDist */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */
+ /* largest _signed_ integer type used to express the distance */
+ /* between two pointers. */
+ /* */
+ typedef ft_ptrdiff_t FT_PtrDist;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_UnitVector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector unit vector. Uses */
+ /* FT_F2Dot14 types. */
+ /* */
+ /* <Fields> */
+ /* x :: Horizontal coordinate. */
+ /* */
+ /* y :: Vertical coordinate. */
+ /* */
+ typedef struct FT_UnitVector_
+ {
+ FT_F2Dot14 x;
+ FT_F2Dot14 y;
+
+ } FT_UnitVector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Matrix */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2x2 matrix. Coefficients are */
+ /* in 16.16 fixed-point format. The computation performed is: */
+ /* */
+ /* { */
+ /* x' = x*xx + y*xy */
+ /* y' = x*yx + y*yy */
+ /* } */
+ /* */
+ /* <Fields> */
+ /* xx :: Matrix coefficient. */
+ /* */
+ /* xy :: Matrix coefficient. */
+ /* */
+ /* yx :: Matrix coefficient. */
+ /* */
+ /* yy :: Matrix coefficient. */
+ /* */
+ typedef struct FT_Matrix_
+ {
+ FT_Fixed xx, xy;
+ FT_Fixed yx, yy;
+
+ } FT_Matrix;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Data */
+ /* */
+ /* <Description> */
+ /* Read-only binary data represented as a pointer and a length. */
+ /* */
+ /* <Fields> */
+ /* pointer :: The data. */
+ /* */
+ /* length :: The length of the data in bytes. */
+ /* */
+ typedef struct FT_Data_
+ {
+ const FT_Byte* pointer;
+ FT_Int length;
+
+ } FT_Data;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* <Description> */
+ /* Describe a function used to destroy the `client' data of any */
+ /* FreeType object. See the description of the @FT_Generic type for */
+ /* details of usage. */
+ /* */
+ /* <Input> */
+ /* The address of the FreeType object which is under finalization. */
+ /* Its client data is accessed through its `generic' field. */
+ /* */
+ typedef void (*FT_Generic_Finalizer)(void* object);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Generic */
+ /* */
+ /* <Description> */
+ /* Client applications often need to associate their own data to a */
+ /* variety of FreeType core objects. For example, a text layout API */
+ /* might want to associate a glyph cache to a given size object. */
+ /* */
+ /* Some FreeType object contains a `generic' field, of type */
+ /* FT_Generic, which usage is left to client applications and font */
+ /* servers. */
+ /* */
+ /* It can be used to store a pointer to client-specific data, as well */
+ /* as the address of a `finalizer' function, which will be called by */
+ /* FreeType when the object is destroyed (for example, the previous */
+ /* client example would put the address of the glyph cache destructor */
+ /* in the `finalizer' field). */
+ /* */
+ /* <Fields> */
+ /* data :: A typeless pointer to any client-specified data. This */
+ /* field is completely ignored by the FreeType library. */
+ /* */
+ /* finalizer :: A pointer to a `generic finalizer' function, which */
+ /* will be called when the object is destroyed. If this */
+ /* field is set to NULL, no code will be called. */
+ /* */
+ typedef struct FT_Generic_
+ {
+ void* data;
+ FT_Generic_Finalizer finalizer;
+
+ } FT_Generic;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_MAKE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags which are used to label */
+ /* TrueType tables into an unsigned long to be used within FreeType. */
+ /* */
+ /* <Note> */
+ /* The produced values *must* be 32-bit integers. Don't redefine */
+ /* this macro. */
+ /* */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+ (FT_Tag) \
+ ( ( (FT_ULong)_x1 << 24 ) | \
+ ( (FT_ULong)_x2 << 16 ) | \
+ ( (FT_ULong)_x3 << 8 ) | \
+ (FT_ULong)_x4 )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* L I S T M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ListNode */
+ /* */
+ /* <Description> */
+ /* Many elements and objects in FreeType are listed through an */
+ /* @FT_List record (see @FT_ListRec). As its name suggests, an */
+ /* FT_ListNode is a handle to a single list element. */
+ /* */
+ typedef struct FT_ListNodeRec_* FT_ListNode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_List */
+ /* */
+ /* <Description> */
+ /* A handle to a list record (see @FT_ListRec). */
+ /* */
+ typedef struct FT_ListRec_* FT_List;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListNodeRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a single list element. */
+ /* */
+ /* <Fields> */
+ /* prev :: The previous element in the list. NULL if first. */
+ /* */
+ /* next :: The next element in the list. NULL if last. */
+ /* */
+ /* data :: A typeless pointer to the listed object. */
+ /* */
+ typedef struct FT_ListNodeRec_
+ {
+ FT_ListNode prev;
+ FT_ListNode next;
+ void* data;
+
+ } FT_ListNodeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a simple doubly-linked list. These are */
+ /* used in many parts of FreeType. */
+ /* */
+ /* <Fields> */
+ /* head :: The head (first element) of doubly-linked list. */
+ /* */
+ /* tail :: The tail (last element) of doubly-linked list. */
+ /* */
+ typedef struct FT_ListRec_
+ {
+ FT_ListNode head;
+ FT_ListNode tail;
+
+ } FT_ListRec;
+
+
+ /* */
+
+#define FT_IS_EMPTY( list ) ( (list).head == 0 )
+#define FT_BOOL( x ) ( (FT_Bool)( x ) )
+
+ /* concatenate C tokens */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+ /* see `ftmoderr.h' for descriptions of the following macros */
+
+#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#define FT_ERROR_BASE( x ) ( (x) & 0xFF )
+#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U )
+
+#define FT_ERR_EQ( x, e ) \
+ ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
+#define FT_ERR_NEQ( x, e ) \
+ ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
new file mode 100644
index 0000000000..af4334e200
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftwinfnt.h */
+/* */
+/* FreeType API for accessing Windows fnt-specific data. */
+/* */
+/* Copyright 2003, 2004, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* winfnt_fonts */
+ /* */
+ /* <Title> */
+ /* Window FNT Files */
+ /* */
+ /* <Abstract> */
+ /* Windows FNT specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Windows FNT specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_WinFNT_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `charset' byte in
+ * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX
+ * encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+ * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is
+ * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+ *
+ * @values:
+ * FT_WinFNT_ID_DEFAULT ::
+ * This is used for font enumeration and font creation as a
+ * `don't care' value. Valid font files don't contain this value.
+ * When querying for information about the character set of the font
+ * that is currently selected into a specified device context, this
+ * return value (of the related Windows API) simply denotes failure.
+ *
+ * FT_WinFNT_ID_SYMBOL ::
+ * There is no known mapping table available.
+ *
+ * FT_WinFNT_ID_MAC ::
+ * Mac Roman encoding.
+ *
+ * FT_WinFNT_ID_OEM ::
+ * From Michael Pöttgen <michael@poettgen.de>:
+ *
+ * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+ * is used for the charset of vector fonts, like `modern.fon',
+ * `roman.fon', and `script.fon' on Windows.
+ *
+ * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+ * specifies a character set that is operating-system dependent.
+ *
+ * The `IFIMETRICS' documentation from the `Windows Driver
+ * Development Kit' says: This font supports an OEM-specific
+ * character set. The OEM character set is system dependent.
+ *
+ * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+ * second default codepage that most international versions of
+ * Windows have. It is one of the OEM codepages from
+ *
+ * http://www.microsoft.com/globaldev/reference/cphome.mspx,
+ *
+ * and is used for the `DOS boxes', to support legacy applications.
+ * A German Windows version for example usually uses ANSI codepage
+ * 1252 and OEM codepage 850.
+ *
+ * FT_WinFNT_ID_CP874 ::
+ * A superset of Thai TIS 620 and ISO 8859-11.
+ *
+ * FT_WinFNT_ID_CP932 ::
+ * A superset of Japanese Shift-JIS (with minor deviations).
+ *
+ * FT_WinFNT_ID_CP936 ::
+ * A superset of simplified Chinese GB 2312-1980 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP949 ::
+ * A superset of Korean Hangul KS~C 5601-1987 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP950 ::
+ * A superset of traditional Chinese Big~5 ETen (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP1250 ::
+ * A superset of East European ISO 8859-2 (with slightly different
+ * ordering).
+ *
+ * FT_WinFNT_ID_CP1251 ::
+ * A superset of Russian ISO 8859-5 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1252 ::
+ * ANSI encoding. A superset of ISO 8859-1.
+ *
+ * FT_WinFNT_ID_CP1253 ::
+ * A superset of Greek ISO 8859-7 (with minor modifications).
+ *
+ * FT_WinFNT_ID_CP1254 ::
+ * A superset of Turkish ISO 8859-9.
+ *
+ * FT_WinFNT_ID_CP1255 ::
+ * A superset of Hebrew ISO 8859-8 (with some modifications).
+ *
+ * FT_WinFNT_ID_CP1256 ::
+ * A superset of Arabic ISO 8859-6 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1257 ::
+ * A superset of Baltic ISO 8859-13 (with some deviations).
+ *
+ * FT_WinFNT_ID_CP1258 ::
+ * For Vietnamese. This encoding doesn't cover all necessary
+ * characters.
+ *
+ * FT_WinFNT_ID_CP1361 ::
+ * Korean (Johab).
+ */
+
+#define FT_WinFNT_ID_CP1252 0
+#define FT_WinFNT_ID_DEFAULT 1
+#define FT_WinFNT_ID_SYMBOL 2
+#define FT_WinFNT_ID_MAC 77
+#define FT_WinFNT_ID_CP932 128
+#define FT_WinFNT_ID_CP949 129
+#define FT_WinFNT_ID_CP1361 130
+#define FT_WinFNT_ID_CP936 134
+#define FT_WinFNT_ID_CP950 136
+#define FT_WinFNT_ID_CP1253 161
+#define FT_WinFNT_ID_CP1254 162
+#define FT_WinFNT_ID_CP1258 163
+#define FT_WinFNT_ID_CP1255 177
+#define FT_WinFNT_ID_CP1256 178
+#define FT_WinFNT_ID_CP1257 186
+#define FT_WinFNT_ID_CP1251 204
+#define FT_WinFNT_ID_CP874 222
+#define FT_WinFNT_ID_CP1250 238
+#define FT_WinFNT_ID_OEM 255
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* Windows FNT Header info. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_
+ {
+ FT_UShort version;
+ FT_ULong file_size;
+ FT_Byte copyright[60];
+ FT_UShort file_type;
+ FT_UShort nominal_point_size;
+ FT_UShort vertical_resolution;
+ FT_UShort horizontal_resolution;
+ FT_UShort ascent;
+ FT_UShort internal_leading;
+ FT_UShort external_leading;
+ FT_Byte italic;
+ FT_Byte underline;
+ FT_Byte strike_out;
+ FT_UShort weight;
+ FT_Byte charset;
+ FT_UShort pixel_width;
+ FT_UShort pixel_height;
+ FT_Byte pitch_and_family;
+ FT_UShort avg_width;
+ FT_UShort max_width;
+ FT_Byte first_char;
+ FT_Byte last_char;
+ FT_Byte default_char;
+ FT_Byte break_char;
+ FT_UShort bytes_per_row;
+ FT_ULong device_offset;
+ FT_ULong face_name_offset;
+ FT_ULong bits_pointer;
+ FT_ULong bits_offset;
+ FT_Byte reserved;
+ FT_ULong flags;
+ FT_UShort A_space;
+ FT_UShort B_space;
+ FT_UShort C_space;
+ FT_UShort color_table_offset;
+ FT_ULong reserved1[4];
+
+ } FT_WinFNT_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_Header */
+ /* */
+ /* <Description> */
+ /* A handle to an @FT_WinFNT_HeaderRec structure. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_WinFNT_Header
+ *
+ * @description:
+ * Retrieve a Windows FNT font info header.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * @output:
+ * aheader :: The WinFNT header.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with Windows FNT faces, returning an error
+ * otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_WinFNT_Header( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
new file mode 100644
index 0000000000..d7e2dabc4c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* ftxf86.h */
+/* */
+/* Support functions for X11. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* font_formats */
+ /* */
+ /* <Title> */
+ /* Font Formats */
+ /* */
+ /* <Abstract> */
+ /* Getting the font format. */
+ /* */
+ /* <Description> */
+ /* The single function in this section can be used to get the font */
+ /* format. Note that this information is not needed normally; */
+ /* however, there are special cases (like in PDF devices) where it is */
+ /* important to differentiate, in spite of FreeType's uniform API. */
+ /* */
+ /* This function is in the X11/xf86 namespace for historical reasons */
+ /* and in no way depends on that windowing system. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_X11_Font_Format */
+ /* */
+ /* <Description> */
+ /* Return a string describing the format of a given face, using values */
+ /* which can be used as an X11 FONT_PROPERTY. Possible values are */
+ /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+ /* `PFR', and `Windows~FNT'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* Input face handle. */
+ /* */
+ /* <Return> */
+ /* Font format string. NULL in case of error. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_X11_Font_Format( FT_Face face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
new file mode 100644
index 0000000000..f07646d469
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
@@ -0,0 +1,244 @@
+/***************************************************************************/
+/* */
+/* autohint.h */
+/* */
+/* High-level `autohint' module-specific interface (specification). */
+/* */
+/* Copyright 1996-2002, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The auto-hinter is used to load and automatically hint glyphs if a */
+ /* format-specific hinter isn't available. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+ /*************************************************************************/
+ /* */
+ /* A small technical note regarding automatic hinting in order to */
+ /* clarify this module interface. */
+ /* */
+ /* An automatic hinter might compute two kinds of data for a given face: */
+ /* */
+ /* - global hints: Usually some metrics that describe global properties */
+ /* of the face. It is computed by scanning more or less */
+ /* aggressively the glyphs in the face, and thus can be */
+ /* very slow to compute (even if the size of global */
+ /* hints is really small). */
+ /* */
+ /* - glyph hints: These describe some important features of the glyph */
+ /* outline, as well as how to align them. They are */
+ /* generally much faster to compute than global hints. */
+ /* */
+ /* The current FreeType auto-hinter does a pretty good job while */
+ /* performing fast computations for both global and glyph hints. */
+ /* However, we might be interested in introducing more complex and */
+ /* powerful algorithms in the future, like the one described in the John */
+ /* D. Hobby paper, which unfortunately requires a lot more horsepower. */
+ /* */
+ /* Because a sufficiently sophisticated font management system would */
+ /* typically implement an LRU cache of opened face objects to reduce */
+ /* memory usage, it is a good idea to be able to avoid recomputing */
+ /* global hints every time the same face is re-opened. */
+ /* */
+ /* We thus provide the ability to cache global hints outside of the face */
+ /* object, in order to speed up font re-opening time. Of course, this */
+ /* feature is purely optional, so most client programs won't even notice */
+ /* it. */
+ /* */
+ /* I initially thought that it would be a good idea to cache the glyph */
+ /* hints too. However, my general idea now is that if you really need */
+ /* to cache these too, you are simply in need of a new font format, */
+ /* where all this information could be stored within the font file and */
+ /* decoded on the fly. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct FT_AutoHinterRec_ *FT_AutoHinter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalGetFunc */
+ /* */
+ /* <Description> */
+ /* Retrieve the global hints computed for a given face object. The */
+ /* resulting data is dissociated from the face and will survive a */
+ /* call to FT_Done_Face(). It must be discarded through the API */
+ /* FT_AutoHinter_GlobalDoneFunc(). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* global_hints :: A typeless pointer to the global hints. */
+ /* */
+ /* global_len :: The size in bytes of the global hints. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter,
+ FT_Face face,
+ void** global_hints,
+ long* global_len );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalDoneFunc */
+ /* */
+ /* <Description> */
+ /* Discard the global hints retrieved through */
+ /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */
+ /* are freed from memory. */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the auto-hinter module. */
+ /* */
+ /* global :: A pointer to retrieved global hints to discard. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter,
+ void* global );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalResetFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to recompute the global metrics in a given */
+ /* font. This is useful when global font data changes (e.g. Multiple */
+ /* Masters fonts where blend coordinates change). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the face. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter,
+ FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlyphLoadFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to load, scale, and automatically hint a */
+ /* glyph from a given face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the face. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* load_flags :: The load flags. */
+ /* */
+ /* <Note> */
+ /* This function is capable of loading composite glyphs by hinting */
+ /* each sub-glyph independently (which improves quality). */
+ /* */
+ /* It will call the font driver with @FT_Load_Glyph, with */
+ /* @FT_LOAD_NO_SCALE set. */
+ /* */
+ typedef FT_Error
+ (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter,
+ FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_AutoHinter_InterfaceRec */
+ /* */
+ /* <Description> */
+ /* The auto-hinter module's interface. */
+ /* */
+ typedef struct FT_AutoHinter_InterfaceRec_
+ {
+ FT_AutoHinter_GlobalResetFunc reset_face;
+ FT_AutoHinter_GlobalGetFunc get_global_hints;
+ FT_AutoHinter_GlobalDoneFunc done_global_hints;
+ FT_AutoHinter_GlyphLoadFunc load_glyph;
+
+ } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_AutoHinter_InterfaceRec class_ = \
+ { \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_AutoHinter_InterfaceRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->reset_face = reset_face_; \
+ clazz->get_global_hints = get_global_hints_; \
+ clazz->done_global_hints = done_global_hints_; \
+ clazz->load_glyph = load_glyph_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
new file mode 100644
index 0000000000..1f2462dcec
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/* */
+/* ftcalc.h */
+/* */
+/* Arithmetic computations (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FixedSqrt */
+ /* */
+ /* <Description> */
+ /* Computes the square root of a 16.16 fixed-point value. */
+ /* */
+ /* <Input> */
+ /* x :: The value to compute the root for. */
+ /* */
+ /* <Return> */
+ /* The result of `sqrt(x)'. */
+ /* */
+ /* <Note> */
+ /* This function is not very fast. */
+ /* */
+ FT_BASE( FT_Int32 )
+ FT_SqrtFixed( FT_Int32 x );
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv_No_Round */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* (without rounding) with maximum accuracy (it uses a 64-bit */
+ /* intermediate integer whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_BASE( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /*
+ * A variant of FT_Matrix_Multiply which scales its result afterwards.
+ * The idea is that both `a' and `b' are scaled by factors of 10 so that
+ * the values are as precise as possible to get a correct result during
+ * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of
+ * `a' and `b', respectively, then the scaling factor of the result is
+ * `sa*sb'.
+ */
+ FT_BASE( void )
+ FT_Matrix_Multiply_Scaled( const FT_Matrix* a,
+ FT_Matrix *b,
+ FT_Long scaling );
+
+
+ /*
+ * A variant of FT_Vector_Transform. See comments for
+ * FT_Matrix_Multiply_Scaled.
+ */
+ FT_BASE( void )
+ FT_Vector_Transform_Scaled( FT_Vector* vector,
+ const FT_Matrix* matrix,
+ FT_Long scaling );
+
+
+ /*
+ * Return -1, 0, or +1, depending on the orientation of a given corner.
+ * We use the Cartesian coordinate system, with positive vertical values
+ * going upwards. The function returns +1 if the corner turns to the
+ * left, -1 to the right, and 0 for undecidable cases.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+ /*
+ * Return TRUE if a corner is flat or nearly flat. This is equivalent to
+ * saying that the angle difference between the `in' and `out' vectors is
+ * very small.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_is_flat( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+
+ /*
+ * Return the most significant bit index.
+ */
+ FT_BASE( FT_Int )
+ FT_MSB( FT_UInt32 z );
+
+
+ /*
+ * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
+ * two fixed-point arguments instead.
+ */
+ FT_BASE( FT_Fixed )
+ FT_Hypot( FT_Fixed x,
+ FT_Fixed y );
+
+
+#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 )
+#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 )
+#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \
+ : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
new file mode 100644
index 0000000000..e7b14191af
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* ftdebug.h */
+/* */
+/* Debugging and logging component (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/* */
+/* IMPORTANT: A description of FreeType's debugging support can be */
+/* found in `docs/DEBUG.TXT'. Read it if you need to use or */
+/* understand this code. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+ /* is already defined; this simplifies the following #ifdefs */
+ /* */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the trace enums as well as the trace levels array when they */
+ /* are needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x ) trace_ ## x ,
+
+ /* defining the enumeration */
+ typedef enum FT_Trace_
+ {
+#include "fttrace.h"
+ trace_count
+
+ } FT_Trace;
+
+
+ /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+ extern int ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_TRACE macro */
+ /* */
+ /* IMPORTANT! */
+ /* */
+ /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+ /* value before using any TRACE macro. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat ) \
+ do \
+ { \
+ if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+ FT_Message varformat; \
+ } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Count */
+ /* */
+ /* <Description> */
+ /* Return the number of available trace components. */
+ /* */
+ /* <Return> */
+ /* The number of trace components. 0 if FreeType 2 is not built with */
+ /* FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* This function may be useful if you want to access elements of */
+ /* the internal `ft_trace_levels' array by an index. */
+ /* */
+ FT_BASE( FT_Int )
+ FT_Trace_Get_Count( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Name */
+ /* */
+ /* <Description> */
+ /* Return the name of a trace component. */
+ /* */
+ /* <Input> */
+ /* The index of the trace component. */
+ /* */
+ /* <Return> */
+ /* The name of the trace component. This is a statically allocated */
+ /* C string, so do not free it after use. NULL if FreeType 2 is not */
+ /* built with FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Trace_Get_Count to get the number of available trace */
+ /* components. */
+ /* */
+ /* This function may be useful if you want to control FreeType 2's */
+ /* debug level in your application. */
+ /* */
+ FT_BASE( const char * )
+ FT_Trace_Get_Name( FT_Int idx );
+
+
+ /*************************************************************************/
+ /* */
+ /* You need two opening and closing parentheses! */
+ /* */
+ /* Example: FT_TRACE0(( "Value is %i", foo )) */
+ /* */
+ /* Output of the FT_TRACEX macros is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat )
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ERROR macro. */
+ /* */
+ /* Output of this macro is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat ) FT_Message varformat
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw' */
+ /* makes it possible to easily set a breakpoint at this function. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition ) \
+ do \
+ { \
+ if ( !( condition ) ) \
+ FT_Panic( "assertion failed on line %d of file %s\n", \
+ __LINE__, __FILE__ ); \
+ } while ( 0 )
+
+#define FT_THROW( e ) \
+ ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \
+ __LINE__, \
+ __FILE__ ) | \
+ FT_ERR_CAT( FT_ERR_PREFIX, e ) )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition ) do { } while ( 0 )
+
+#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define `FT_Message' and `FT_Panic' when needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h" /* for vfprintf() */
+
+ /* print a message */
+ FT_BASE( void )
+ FT_Message( const char* fmt,
+ ... );
+
+ /* print a message and exit */
+ FT_BASE( void )
+ FT_Panic( const char* fmt,
+ ... );
+
+ /* report file name and line number of an error */
+ FT_BASE( int )
+ FT_Throw( FT_Error error,
+ int line,
+ const char* file );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+ FT_BASE( void )
+ ft_debug_init( void );
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
new file mode 100644
index 0000000000..5b0e863053
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
@@ -0,0 +1,409 @@
+/***************************************************************************/
+/* */
+/* ftdriver.h */
+/* */
+/* FreeType font driver interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include "../../ft2build.h"
+#include "../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef FT_Error
+ (*FT_Face_InitFunc)( FT_Stream stream,
+ FT_Face face,
+ FT_Int typeface_index,
+ FT_Int num_params,
+ FT_Parameter* parameters );
+
+ typedef void
+ (*FT_Face_DoneFunc)( FT_Face face );
+
+
+ typedef FT_Error
+ (*FT_Size_InitFunc)( FT_Size size );
+
+ typedef void
+ (*FT_Size_DoneFunc)( FT_Size size );
+
+
+ typedef FT_Error
+ (*FT_Slot_InitFunc)( FT_GlyphSlot slot );
+
+ typedef void
+ (*FT_Slot_DoneFunc)( FT_GlyphSlot slot );
+
+
+ typedef FT_Error
+ (*FT_Size_RequestFunc)( FT_Size size,
+ FT_Size_Request req );
+
+ typedef FT_Error
+ (*FT_Size_SelectFunc)( FT_Size size,
+ FT_ULong size_index );
+
+ typedef FT_Error
+ (*FT_Slot_LoadFunc)( FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ typedef FT_UInt
+ (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+ typedef FT_Long
+ (*FT_CharMap_CharNextFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+
+ typedef FT_Error
+ (*FT_Face_GetKerningFunc)( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning );
+
+
+ typedef FT_Error
+ (*FT_Face_AttachFunc)( FT_Face face,
+ FT_Stream stream );
+
+
+ typedef FT_Error
+ (*FT_Face_GetAdvancesFunc)( FT_Face face,
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed* advances );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Driver_ClassRec */
+ /* */
+ /* <Description> */
+ /* The font driver class. This structure mostly contains pointers to */
+ /* driver methods. */
+ /* */
+ /* <Fields> */
+ /* root :: The parent module. */
+ /* */
+ /* face_object_size :: The size of a face object in bytes. */
+ /* */
+ /* size_object_size :: The size of a size object in bytes. */
+ /* */
+ /* slot_object_size :: The size of a glyph object in bytes. */
+ /* */
+ /* init_face :: The format-specific face constructor. */
+ /* */
+ /* done_face :: The format-specific face destructor. */
+ /* */
+ /* init_size :: The format-specific size constructor. */
+ /* */
+ /* done_size :: The format-specific size destructor. */
+ /* */
+ /* init_slot :: The format-specific slot constructor. */
+ /* */
+ /* done_slot :: The format-specific slot destructor. */
+ /* */
+ /* */
+ /* load_glyph :: A function handle to load a glyph to a slot. */
+ /* This field is mandatory! */
+ /* */
+ /* get_kerning :: A function handle to return the unscaled */
+ /* kerning for a given pair of glyphs. Can be */
+ /* set to 0 if the format doesn't support */
+ /* kerning. */
+ /* */
+ /* attach_file :: This function handle is used to read */
+ /* additional data for a face from another */
+ /* file/stream. For example, this can be used to */
+ /* add data from AFM or PFM files on a Type 1 */
+ /* face, or a CIDMap on a CID-keyed face. */
+ /* */
+ /* get_advances :: A function handle used to return advance */
+ /* widths of `count' glyphs (in font units), */
+ /* starting at `first'. The `vertical' flag must */
+ /* be set to get vertical advance heights. The */
+ /* `advances' buffer is caller-allocated. */
+ /* The idea of this function is to be able to */
+ /* perform device-independent text layout without */
+ /* loading a single glyph image. */
+ /* */
+ /* request_size :: A handle to a function used to request the new */
+ /* character size. Can be set to 0 if the */
+ /* scaling done in the base layer suffices. */
+ /* */
+ /* select_size :: A handle to a function used to select a new */
+ /* fixed size. It is used only if */
+ /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */
+ /* to 0 if the scaling done in the base layer */
+ /* suffices. */
+ /* <Note> */
+ /* Most function pointers, with the exception of `load_glyph', can be */
+ /* set to 0 to indicate a default behaviour. */
+ /* */
+ typedef struct FT_Driver_ClassRec_
+ {
+ FT_Module_Class root;
+
+ FT_Long face_object_size;
+ FT_Long size_object_size;
+ FT_Long slot_object_size;
+
+ FT_Face_InitFunc init_face;
+ FT_Face_DoneFunc done_face;
+
+ FT_Size_InitFunc init_size;
+ FT_Size_DoneFunc done_size;
+
+ FT_Slot_InitFunc init_slot;
+ FT_Slot_DoneFunc done_slot;
+
+ FT_Slot_LoadFunc load_glyph;
+
+ FT_Face_GetKerningFunc get_kerning;
+ FT_Face_AttachFunc attach_file;
+ FT_Face_GetAdvancesFunc get_advances;
+
+ /* since version 2.2 */
+ FT_Size_RequestFunc request_size;
+ FT_Size_SelectFunc select_size;
+
+ } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of an FT_Driver_ClassRec */
+ /* struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Driver_ClassRec struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */
+ /* called with a pointer where the allocated structure is returned. */
+ /* And when it is no longer needed a `destroy' function needs to be */
+ /* called to release that allocation. */
+ /* */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains a */
+ /* mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by driver definition calling `FT_DEFINE_DRIVER' in following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_DRIVER( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Driver_ClassRec class_;
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Driver_ClassRec class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ \
+ init_face_, \
+ done_face_, \
+ \
+ init_size_, \
+ done_size_, \
+ \
+ init_slot_, \
+ done_slot_, \
+ \
+ load_glyph_, \
+ \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ \
+ request_size_, \
+ select_size_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( dclazz ) \
+ FT_FREE( dclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Driver_Class clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->face_object_size = face_object_size_; \
+ clazz->size_object_size = size_object_size_; \
+ clazz->slot_object_size = slot_object_size_; \
+ \
+ clazz->init_face = init_face_; \
+ clazz->done_face = done_face_; \
+ \
+ clazz->init_size = init_size_; \
+ clazz->done_size = done_size_; \
+ \
+ clazz->init_slot = init_slot_; \
+ clazz->done_slot = done_slot_; \
+ \
+ clazz->load_glyph = load_glyph_; \
+ \
+ clazz->get_kerning = get_kerning_; \
+ clazz->attach_file = attach_file_; \
+ clazz->get_advances = get_advances_; \
+ \
+ clazz->request_size = request_size_; \
+ clazz->select_size = select_size_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
new file mode 100644
index 0000000000..76e5a7ee58
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/* */
+/* ftgloadr.h */
+/* */
+/* The FreeType glyph loader (specification). */
+/* */
+/* Copyright 2002, 2003, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphLoader */
+ /* */
+ /* <Description> */
+ /* The glyph loader is an internal object used to load several glyphs */
+ /* together (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The glyph loader implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ;
+
+
+#if 0 /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+#endif
+
+
+ typedef struct FT_SubGlyphRec_
+ {
+ FT_Int index;
+ FT_UShort flags;
+ FT_Int arg1;
+ FT_Int arg2;
+ FT_Matrix transform;
+
+ } FT_SubGlyphRec;
+
+
+ typedef struct FT_GlyphLoadRec_
+ {
+ FT_Outline outline; /* outline */
+ FT_Vector* extra_points; /* extra points table */
+ FT_Vector* extra_points2; /* second extra points table */
+ FT_UInt num_subglyphs; /* number of subglyphs */
+ FT_SubGlyph subglyphs; /* subglyphs */
+
+ } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+ typedef struct FT_GlyphLoaderRec_
+ {
+ FT_Memory memory;
+ FT_UInt max_points;
+ FT_UInt max_contours;
+ FT_UInt max_subglyphs;
+ FT_Bool use_extra;
+
+ FT_GlyphLoadRec base;
+ FT_GlyphLoadRec current;
+
+ void* other; /* for possible future extension? */
+
+ } FT_GlyphLoaderRec;
+
+
+ /* create new empty glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_New( FT_Memory memory,
+ FT_GlyphLoader *aloader );
+
+ /* add an extra points table to a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader );
+
+ /* destroy a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Done( FT_GlyphLoader loader );
+
+ /* reset a glyph loader (frees everything int it) */
+ FT_BASE( void )
+ FT_GlyphLoader_Reset( FT_GlyphLoader loader );
+
+ /* rewind a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Rewind( FT_GlyphLoader loader );
+
+ /* check that there is enough space to add `n_points' and `n_contours' */
+ /* to the glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader,
+ FT_UInt n_points,
+ FT_UInt n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_points + \
+ (_loader)->current.outline.n_points + \
+ (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_contours + \
+ (_loader)->current.outline.n_contours + \
+ (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \
+ ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \
+ FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \
+ ? 0 \
+ : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+ /* check that there is enough space to add `n_subs' sub-glyphs to */
+ /* a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader,
+ FT_UInt n_subs );
+
+ /* prepare a glyph loader, i.e. empty the current glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Prepare( FT_GlyphLoader loader );
+
+ /* add the current glyph to the base glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Add( FT_GlyphLoader loader );
+
+ /* copy points from one glyph loader to another */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CopyPoints( FT_GlyphLoader target,
+ FT_GlyphLoader source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
new file mode 100644
index 0000000000..432a9ba6d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
@@ -0,0 +1,459 @@
+/***************************************************************************/
+/* */
+/* ftmemory.h */
+/* */
+/* The FreeType memory management macros (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2007, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../fttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_SET_ERROR */
+ /* */
+ /* <Description> */
+ /* This macro is used to set an implicit `error' variable to a given */
+ /* expression's value (usually a function call), and convert it to a */
+ /* boolean which is set whenever the value is != 0. */
+ /* */
+#undef FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+ ( ( error = (expression) ) != 0 )
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M E M O R Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*
+ * C++ refuses to handle statements like p = (void*)anything, with `p' a
+ * typed pointer. Since we don't have a `typeof' operator in standard
+ * C++, we have to use a template to emulate it.
+ */
+
+#ifdef __cplusplus
+
+ extern "C++"
+ template <typename T> inline T*
+ cplusplus_typeof( T*,
+ void *v )
+ {
+ return static_cast <T*> ( v );
+ }
+
+#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val ) (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+ FT_BASE( const char* ) _ft_debug_file;
+ FT_BASE( long ) _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp ) (exp)
+#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+ /*
+ * The allocation functions return a pointer, and the error code
+ * is written to through the `p_error' parameter. See below for
+ * for documentation.
+ */
+
+ FT_BASE( FT_Pointer )
+ ft_mem_alloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qalloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_realloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qrealloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+#ifdef _DEBUG
+//#define _XYQ_MEM_DEBUG
+#endif
+
+#ifdef _XYQ_MEM_DEBUG /* XYQ */
+ FT_BASE( FT_Pointer )
+ ft_mem_allocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qallocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_reallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qreallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+#endif
+
+
+ FT_BASE( void )
+ ft_mem_free( FT_Memory memory,
+ const void* P );
+
+
+#define FT_MEM_FREE( ptr ) \
+ FT_BEGIN_STMNT \
+ ft_mem_free( memory, (ptr) ); \
+ (ptr) = NULL; \
+ FT_END_STMNT
+#ifndef _XYQ_MEM_DEBUG
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \
+ (FT_Long)(size), \
+ &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#else
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#endif
+
+#define FT_MEM_NEW( ptr ) \
+ FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_QNEW( ptr ) \
+ FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count ) \
+ FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count ) \
+ FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count ) \
+ FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+ /*
+ * Return the maximum number of addressable elements in an array.
+ * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+ * any problems.
+ */
+#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_ALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_FREE( ptr ) FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr ) \
+ FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+ FT_BASE( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error );
+
+
+#define FT_MEM_STRDUP( dst, str ) \
+ (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str ) \
+ FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size ) \
+ (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+ /* Return >= 1 if a truncation occurs. */
+ /* Return 0 if the source string fits the buffer. */
+ /* This is *not* the same as strlcpy(). */
+ FT_BASE( FT_Int )
+ ft_mem_strcpyn( char* dst,
+ const char* src,
+ FT_ULong size );
+
+#define FT_STRCPYN( dst, src, size ) \
+ ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
new file mode 100644
index 0000000000..d6f7de3dc9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
@@ -0,0 +1,1569 @@
+/***************************************************************************/
+/* */
+/* ftobjs.h */
+/* */
+/* The FreeType private base classes (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of all internal FreeType classes. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include "../../ft2build.h"
+#include "../ftrender.h"
+#include "../ftsizes.h"
+#include "../ftlcdfil.h"
+#include "ftmemory.h"
+#include "ftgloadr.h"
+#include "ftdriver.h"
+#include "autohint.h"
+#include "ftserv.h"
+#include "ftpic.h"
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include "../ftincrem.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* Some generic definitions. */
+ /* */
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The min and max functions missing in C. As usual, be careful not to */
+ /* write things like FT_MIN( a++, b++ ) to avoid side effects. */
+ /* */
+#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x ) ( (x) & ~63 )
+#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 )
+
+
+ /*
+ * Return the highest power of 2 that is <= value; this correspond to
+ * the highest bit in a given 32-bit value.
+ */
+ FT_BASE( FT_UInt32 )
+ ft_highpow2( FT_UInt32 value );
+
+
+ /*
+ * character classification functions -- since these are used to parse
+ * font files, we must not use those in <ctypes.h> which are
+ * locale-dependent
+ */
+#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \
+ ( (unsigned)(x) - 'a' ) < 6U || \
+ ( (unsigned)(x) - 'A' ) < 6U )
+
+ /* the next two macros assume ASCII representation */
+#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U )
+#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) )
+#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** C H A R M A P S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to internal charmap object */
+ typedef struct FT_CMapRec_* FT_CMap;
+
+ /* handle to charmap class structure */
+ typedef const struct FT_CMap_ClassRec_* FT_CMap_Class;
+
+ /* internal charmap object structure */
+ typedef struct FT_CMapRec_
+ {
+ FT_CharMapRec charmap;
+ FT_CMap_Class clazz;
+
+ } FT_CMapRec;
+
+ /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x ) ((FT_CMap)( x ))
+
+ /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face
+
+
+ /* class method definitions */
+ typedef FT_Error
+ (*FT_CMap_InitFunc)( FT_CMap cmap,
+ FT_Pointer init_data );
+
+ typedef void
+ (*FT_CMap_DoneFunc)( FT_CMap cmap );
+
+ typedef FT_UInt
+ (*FT_CMap_CharIndexFunc)( FT_CMap cmap,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharNextFunc)( FT_CMap cmap,
+ FT_UInt32 *achar_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap,
+ FT_CMap unicode_cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_Bool
+ (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantListFunc)( FT_CMap cmap,
+ FT_Memory mem );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_CharVariantListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantCharListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 variant_selector );
+
+
+ typedef struct FT_CMap_ClassRec_
+ {
+ FT_ULong size;
+ FT_CMap_InitFunc init;
+ FT_CMap_DoneFunc done;
+ FT_CMap_CharIndexFunc char_index;
+ FT_CMap_CharNextFunc char_next;
+
+ /* Subsequent entries are special ones for format 14 -- the variant */
+ /* selector subtable which behaves like no other */
+
+ FT_CMap_CharVarIndexFunc char_var_index;
+ FT_CMap_CharVarIsDefaultFunc char_var_default;
+ FT_CMap_VariantListFunc variant_list;
+ FT_CMap_CharVariantListFunc charvariant_list;
+ FT_CMap_VariantCharListFunc variantchar_list;
+
+ } FT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_CMap_ClassRec class_ = \
+ { \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz );
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->size = size_; \
+ clazz->init = init_; \
+ clazz->done = done_; \
+ clazz->char_index = char_index_; \
+ clazz->char_next = char_next_; \
+ clazz->char_var_index = char_var_index_; \
+ clazz->char_var_default = char_var_default_; \
+ clazz->variant_list = variant_list_; \
+ clazz->charvariant_list = charvariant_list_; \
+ clazz->variantchar_list = variantchar_list_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* create a new charmap and add it to charmap->face */
+ FT_BASE( FT_Error )
+ FT_CMap_New( FT_CMap_Class clazz,
+ FT_Pointer init_data,
+ FT_CharMap charmap,
+ FT_CMap *acmap );
+
+ /* destroy a charmap and remove it from face's list */
+ FT_BASE( void )
+ FT_CMap_Done( FT_CMap cmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Face_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Face */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* max_points :: */
+ /* The maximum number of points used to store the vectorial outline */
+ /* of any glyph in this face. If this value cannot be known in */
+ /* advance, or if the face isn't scalable, this should be set to 0. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* max_contours :: */
+ /* The maximum number of contours used to store the vectorial */
+ /* outline of any glyph in this face. If this value cannot be */
+ /* known in advance, or if the face isn't scalable, this should be */
+ /* set to 0. Only relevant for scalable formats. */
+ /* */
+ /* transform_matrix :: */
+ /* A 2x2 matrix of 16.16 coefficients used to transform glyph */
+ /* outlines after they are loaded from the font. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* transform_delta :: */
+ /* A translation vector used to transform glyph outlines after they */
+ /* are loaded from the font. Only used by the convenience */
+ /* functions. */
+ /* */
+ /* transform_flags :: */
+ /* Some flags used to classify the transform. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* services :: */
+ /* A cache for frequently used services. It should be only */
+ /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */
+ /* */
+ /* incremental_interface :: */
+ /* If non-null, the interface through which glyph data and metrics */
+ /* are loaded incrementally for faces that do not provide all of */
+ /* this data when first opened. This field exists only if */
+ /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */
+ /* */
+ /* ignore_unpatented_hinter :: */
+ /* This boolean flag instructs the glyph loader to ignore the */
+ /* native font hinter, if one is found. This is exclusively used */
+ /* in the case when the unpatented hinter is compiled within the */
+ /* library. */
+ /* */
+ /* refcount :: */
+ /* A counter initialized to~1 at the time an @FT_Face structure is */
+ /* created. @FT_Reference_Face increments this counter, and */
+ /* @FT_Done_Face only destroys a face if the counter is~1, */
+ /* otherwise it simply decrements it. */
+ /* */
+ typedef struct FT_Face_InternalRec_
+ {
+ FT_Matrix transform_matrix;
+ FT_Vector transform_delta;
+ FT_Int transform_flags;
+
+ FT_ServiceCacheRec services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec* incremental_interface;
+#endif
+
+ FT_Bool ignore_unpatented_hinter;
+ FT_Int refcount;
+
+ } FT_Face_InternalRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Slot_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_GlyphSlot */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* loader :: The glyph loader object used to load outlines */
+ /* into the glyph slot. */
+ /* */
+ /* flags :: Possible values are zero or */
+ /* FT_GLYPH_OWN_BITMAP. The latter indicates */
+ /* that the FT_GlyphSlot structure owns the */
+ /* bitmap buffer. */
+ /* */
+ /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */
+ /* must be transformed through a specific */
+ /* font transformation. This is _not_ the same */
+ /* as the face transform set through */
+ /* FT_Set_Transform(). */
+ /* */
+ /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */
+ /* transformation, if necessary. */
+ /* */
+ /* glyph_delta :: The 2d translation vector corresponding to */
+ /* the glyph transformation, if necessary. */
+ /* */
+ /* glyph_hints :: Format-specific glyph hints management. */
+ /* */
+
+#define FT_GLYPH_OWN_BITMAP 0x1
+
+ typedef struct FT_Slot_InternalRec_
+ {
+ FT_GlyphLoader loader;
+ FT_UInt flags;
+ FT_Bool glyph_transformed;
+ FT_Matrix glyph_matrix;
+ FT_Vector glyph_delta;
+ void* glyph_hints;
+
+ } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Size */
+ /* object. Currently, it's empty. */
+ /* */
+ /*************************************************************************/
+
+ typedef struct FT_Size_InternalRec_
+ {
+ /* empty */
+
+ } FT_Size_InternalRec;
+
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M O D U L E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ModuleRec */
+ /* */
+ /* <Description> */
+ /* A module object instance. */
+ /* */
+ /* <Fields> */
+ /* clazz :: A pointer to the module's class. */
+ /* */
+ /* library :: A handle to the parent library object. */
+ /* */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ typedef struct FT_ModuleRec_
+ {
+ FT_Module_Class* clazz;
+ FT_Library library;
+ FT_Memory memory;
+
+ } FT_ModuleRec;
+
+
+ /* typecast an object to an FT_Module */
+#define FT_MODULE( x ) ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_HAS_HINTER )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module_Interface */
+ /* */
+ /* <Description> */
+ /* Finds a module and returns its specific interface as a typeless */
+ /* pointer. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module-specific interface if available, 0 otherwise. */
+ /* */
+ /* <Note> */
+ /* You should better be familiar with FreeType internals to know */
+ /* which module to look for, and what its interface is :-) */
+ /* */
+ FT_BASE( const void* )
+ FT_Get_Module_Interface( FT_Library library,
+ const char* mod_name );
+
+ FT_BASE( FT_Pointer )
+ ft_module_get_service( FT_Module module,
+ const char* service_id );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x ) ((FT_Face)(x))
+#define FT_SIZE( x ) ((FT_Size)(x))
+#define FT_SLOT( x ) ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory
+#define FT_FACE_STREAM( x ) FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x ) FT_SIZE( x )->face
+#define FT_SLOT_FACE( x ) FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x ) FT_FACE( x )->size
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* It is sometimes useful to have more than one glyph slot for a */
+ /* given face object. This function is used to create additional */
+ /* slots. All of them are automatically discarded when the face is */
+ /* destroyed. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* aslot :: A handle to a new glyph slot object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_New_GlyphSlot( FT_Face face,
+ FT_GlyphSlot *aslot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* Destroys a given glyph slot. Remember however that all slots are */
+ /* automatically destroyed with its parent. Using this function is */
+ /* not always mandatory. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to a target glyph slot. */
+ /* */
+ FT_BASE( void )
+ FT_Done_GlyphSlot( FT_GlyphSlot slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req ) \
+ ( (req)->horiResolution \
+ ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+ : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req ) \
+ ( (req)->vertResolution \
+ ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+ : (req)->height )
+
+
+ /* Set the metrics according to a bitmap strike. */
+ FT_BASE( void )
+ FT_Select_Metrics( FT_Face face,
+ FT_ULong strike_index );
+
+
+ /* Set the metrics according to a size request. */
+ FT_BASE( void )
+ FT_Request_Metrics( FT_Face face,
+ FT_Size_Request req );
+
+
+ /* Match a size request against `available_sizes'. */
+ FT_BASE( FT_Error )
+ FT_Match_Size( FT_Face face,
+ FT_Size_Request req,
+ FT_Bool ignore_width,
+ FT_ULong* size_index );
+
+
+ /* Use the horizontal metrics to synthesize the vertical metrics. */
+ /* If `advance' is zero, it is also synthesized. */
+ FT_BASE( void )
+ ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics,
+ FT_Pos advance );
+
+
+ /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+ /* was allocated with ft_glyphslot_alloc_bitmap). */
+ FT_BASE( void )
+ ft_glyphslot_free_bitmap( FT_GlyphSlot slot );
+
+
+ /* Allocate a new bitmap buffer in a glyph slot. */
+ FT_BASE( FT_Error )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
+ FT_ULong size );
+
+
+ /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */
+ /* will not be freed by a later call to ft_glyphslot_free_bitmap. */
+ FT_BASE( void )
+ ft_glyphslot_set_bitmap( FT_GlyphSlot slot,
+ FT_Byte* buffer );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** R E N D E R E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#define FT_RENDERER( x ) ((FT_Renderer)( x ))
+#define FT_GLYPH( x ) ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+ typedef struct FT_RendererRec_
+ {
+ FT_ModuleRec root;
+ FT_Renderer_Class* clazz;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_Class glyph_class;
+
+ FT_Raster raster;
+ FT_Raster_Render_Func raster_render;
+ FT_Renderer_RenderFunc render;
+
+ } FT_RendererRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F O N T D R I V E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* typecast a module into a driver easily */
+#define FT_DRIVER( x ) ((FT_Driver)(x))
+
+ /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_DriverRec */
+ /* */
+ /* <Description> */
+ /* The root font driver class. A font driver is responsible for */
+ /* managing and loading font files of a given format. */
+ /* */
+ /* <Fields> */
+ /* root :: Contains the fields of the root module class. */
+ /* */
+ /* clazz :: A pointer to the font driver's class. Note that */
+ /* this is NOT root.clazz. `class' wasn't used */
+ /* as it is a reserved word in C++. */
+ /* */
+ /* faces_list :: The list of faces currently opened by this */
+ /* driver. */
+ /* */
+ /* glyph_loader :: The glyph loader for all faces managed by this */
+ /* driver. This object isn't defined for unscalable */
+ /* formats. */
+ /* */
+ typedef struct FT_DriverRec_
+ {
+ FT_ModuleRec root;
+ FT_Driver_Class clazz;
+ FT_ListRec faces_list;
+ FT_GlyphLoader glyph_loader;
+
+ } FT_DriverRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** L I B R A R I E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* This hook is used by the TrueType debugger. It must be set to an */
+ /* alternate truetype bytecode interpreter function. */
+#define FT_DEBUG_HOOK_TRUETYPE 0
+
+
+ /* Set this debug hook to a non-null pointer to force unpatented hinting */
+ /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */
+ /* during debugging. */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1
+
+
+ typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap,
+ FT_Render_Mode render_mode,
+ FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_LibraryRec */
+ /* */
+ /* <Description> */
+ /* The FreeType library class. This is the root of all FreeType */
+ /* data. Use FT_New_Library() to create a library object, and */
+ /* FT_Done_Library() to discard it and all child objects. */
+ /* */
+ /* <Fields> */
+ /* memory :: The library's memory object. Manages memory */
+ /* allocation. */
+ /* */
+ /* version_major :: The major version number of the library. */
+ /* */
+ /* version_minor :: The minor version number of the library. */
+ /* */
+ /* version_patch :: The current patch level of the library. */
+ /* */
+ /* num_modules :: The number of modules currently registered */
+ /* within this library. This is set to 0 for new */
+ /* libraries. New modules are added through the */
+ /* FT_Add_Module() API function. */
+ /* */
+ /* modules :: A table used to store handles to the currently */
+ /* registered modules. Note that each font driver */
+ /* contains a list of its opened faces. */
+ /* */
+ /* renderers :: The list of renderers currently registered */
+ /* within the library. */
+ /* */
+ /* cur_renderer :: The current outline renderer. This is a */
+ /* shortcut used to avoid parsing the list on */
+ /* each call to FT_Outline_Render(). It is a */
+ /* handle to the current renderer for the */
+ /* FT_GLYPH_FORMAT_OUTLINE format. */
+ /* */
+ /* auto_hinter :: XXX */
+ /* */
+ /* raster_pool :: The raster object's render pool. This can */
+ /* ideally be changed dynamically at run-time. */
+ /* */
+ /* raster_pool_size :: The size of the render pool in bytes. */
+ /* */
+ /* debug_hooks :: XXX */
+ /* */
+ /* lcd_filter :: If subpixel rendering is activated, the */
+ /* selected LCD filter mode. */
+ /* */
+ /* lcd_extra :: If subpixel rendering is activated, the number */
+ /* of extra pixels needed for the LCD filter. */
+ /* */
+ /* lcd_weights :: If subpixel rendering is activated, the LCD */
+ /* filter weights, if any. */
+ /* */
+ /* lcd_filter_func :: If subpixel rendering is activated, the LCD */
+ /* filtering callback function. */
+ /* */
+ /* pic_container :: Contains global structs and tables, instead */
+ /* of defining them globallly. */
+ /* */
+ /* refcount :: A counter initialized to~1 at the time an */
+ /* @FT_Library structure is created. */
+ /* @FT_Reference_Library increments this counter, */
+ /* and @FT_Done_Library only destroys a library */
+ /* if the counter is~1, otherwise it simply */
+ /* decrements it. */
+ /* */
+ typedef struct FT_LibraryRec_
+ {
+ FT_Memory memory; /* library's memory manager */
+
+ FT_Int version_major;
+ FT_Int version_minor;
+ FT_Int version_patch;
+
+ FT_UInt num_modules;
+ FT_Module modules[FT_MAX_MODULES]; /* module objects */
+
+ FT_ListRec renderers; /* list of renderers */
+ FT_Renderer cur_renderer; /* current outline renderer */
+ FT_Module auto_hinter;
+
+ FT_Byte* raster_pool; /* scan-line conversion */
+ /* render pool */
+ FT_ULong raster_pool_size; /* size of render pool in bytes */
+
+ FT_DebugHook_Func debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_LcdFilter lcd_filter;
+ FT_Int lcd_extra; /* number of extra pixels */
+ FT_Byte lcd_weights[7]; /* filter weights, if any */
+ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_PIC_Container pic_container;
+#endif
+
+ FT_Int refcount;
+
+ } FT_LibraryRec;
+
+
+ FT_BASE( FT_Renderer )
+ FT_Lookup_Renderer( FT_Library library,
+ FT_Glyph_Format format,
+ FT_ListNode* node );
+
+ FT_BASE( FT_Error )
+ FT_Render_Glyph_Internal( FT_Library library,
+ FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+ typedef const char*
+ (*FT_Face_GetPostscriptNameFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Face_GetGlyphNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory */
+ /* */
+ /* <Description> */
+ /* Creates a new memory object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the new memory object. 0 in case of error. */
+ /* */
+ FT_BASE( FT_Memory )
+ FT_New_Memory( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Memory */
+ /* */
+ /* <Description> */
+ /* Discards memory manager. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ FT_BASE( void )
+ FT_Done_Memory( FT_Memory memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* Define default raster's interface. The default raster is located in */
+ /* `src/base/ftraster.c'. */
+ /* */
+ /* Client applications can register new rasters through the */
+ /* FT_Set_Raster() API. */
+
+#ifndef FT_NO_DEFAULT_RASTER
+ FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** P I C S U P P O R T ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* PIC support macros for ftimage.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_OUTLINE_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Outline_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static const FT_Outline_Funcs class_ = \
+ { \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static FT_Error \
+ Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \
+ { \
+ clazz->move_to = move_to_; \
+ clazz->line_to = line_to_; \
+ clazz->conic_to = conic_to_; \
+ clazz->cubic_to = cubic_to_; \
+ clazz->shift = shift_; \
+ clazz->delta = delta_; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RASTER_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Raster_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \
+ { \
+ clazz->glyph_format = glyph_format_; \
+ clazz->raster_new = raster_new_; \
+ clazz->raster_reset = raster_reset_; \
+ clazz->raster_set_mode = raster_set_mode_; \
+ clazz->raster_render = raster_render_; \
+ clazz->raster_done = raster_done_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftrender.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_GLYPH */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Glyph_Class struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated stcture to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Glyph_Class class_ = \
+ { \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \
+ { \
+ clazz->glyph_size = size_; \
+ clazz->glyph_format = format_; \
+ clazz->glyph_init = init_; \
+ clazz->glyph_done = done_; \
+ clazz->glyph_copy = copy_; \
+ clazz->glyph_transform = transform_; \
+ clazz->glyph_bbox = bbox_; \
+ clazz->glyph_prepare = prepare_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Renderer_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Renderer_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need */
+ /* to be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER( class_ ) \
+ FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Renderer_Class class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ glyph_format_, \
+ \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ \
+ raster_class_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( rclazz ) \
+ FT_FREE( rclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Renderer_Class* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->glyph_format = glyph_format_; \
+ \
+ clazz->render_glyph = render_glyph_; \
+ clazz->transform_glyph = transform_glyph_; \
+ clazz->get_glyph_cbox = get_glyph_cbox_; \
+ clazz->set_mode = set_mode_; \
+ \
+ clazz->raster_class = raster_class_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftmodapi.h **/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Creator */
+ /* */
+ /* <Description> */
+ /* A function used to create (allocate) a new module class object. */
+ /* The object's members are initialized, but the module itself is */
+ /* not. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* output_class :: Initialized with the newly allocated class. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Creator)( FT_Memory memory,
+ FT_Module_Class** output_class );
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destroyer */
+ /* */
+ /* <Description> */
+ /* A function used to destroy (deallocate) a module class object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* clazz :: Module class to destroy. */
+ /* */
+ typedef void
+ (*FT_Module_Destroyer)( FT_Memory memory,
+ FT_Module_Class* clazz );
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Module_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to */
+ /* be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the module definition calling `FT_DEFINE_MODULE' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_ROOT_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct inside */
+ /* another struct that contains it or in a function that initializes */
+ /* that containing struct. */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Module_Class class_;
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ },
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Module_Class class_ = \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ); \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz );
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ clazz->root.module_flags = flags_; \
+ clazz->root.module_size = size_; \
+ clazz->root.module_name = name_; \
+ clazz->root.module_version = version_; \
+ clazz->root.module_requires = requires_; \
+ \
+ clazz->root.module_interface = interface_; \
+ \
+ clazz->root.module_init = init_; \
+ clazz->root.module_done = done_; \
+ clazz->root.get_interface = get_interface_;
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Module_Class* clazz = NULL; \
+ FT_Error error; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ clazz->module_flags = flags_; \
+ clazz->module_size = size_; \
+ clazz->module_name = name_; \
+ clazz->module_version = version_; \
+ clazz->module_requires = requires_; \
+ \
+ clazz->module_interface = interface_; \
+ \
+ clazz->module_init = init_; \
+ clazz->module_done = done_; \
+ clazz->get_interface = get_interface_; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
new file mode 100644
index 0000000000..485ce7a24e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/* */
+/* ftpic.h */
+/* */
+/* The FreeType position independent code services (declaration). */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Modules that ordinarily have const global data that need address */
+ /* can instead define pointers here. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ typedef struct FT_PIC_Container_
+ {
+ /* pic containers for base */
+ void* base;
+
+ /* pic containers for modules */
+ void* autofit;
+ void* cff;
+ void* pshinter;
+ void* psnames;
+ void* raster;
+ void* sfnt;
+ void* smooth;
+ void* truetype;
+
+ } FT_PIC_Container;
+
+
+ /* Initialize the various function tables, structs, etc. */
+ /* stored in the container. */
+ FT_BASE( FT_Error )
+ ft_pic_container_init( FT_Library library );
+
+
+ /* Destroy the contents of the container. */
+ FT_BASE( void )
+ ft_pic_container_destroy( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
new file mode 100644
index 0000000000..061124b130
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/* */
+/* ftrfork.h */
+/* */
+/* Embedded resource forks accessor (specification). */
+/* */
+/* Copyright 2004, 2006, 2007, 2012 by */
+/* Masatake YAMATO and Redhat K.K. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of */
+/* Information-technology Promotion Agency, Japan. */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* Number of guessing rules supported in `FT_Raccess_Guess'. */
+ /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES 9
+
+
+ /* A structure to describe a reference in a resource by its resource ID */
+ /* and internal offset. The `POST' resource expects to be concatenated */
+ /* by the order of resource IDs instead of its appearance in the file. */
+
+ typedef struct FT_RFork_Ref_
+ {
+ FT_UShort res_id;
+ FT_ULong offset;
+
+ } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+ typedef FT_Error
+ (*ft_raccess_guess_func)( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ typedef enum FT_RFork_Rule_ {
+ FT_RFork_Rule_invalid = -2,
+ FT_RFork_Rule_uknown, /* -1 */
+ FT_RFork_Rule_apple_double,
+ FT_RFork_Rule_apple_single,
+ FT_RFork_Rule_darwin_ufs_export,
+ FT_RFork_Rule_darwin_newvfs,
+ FT_RFork_Rule_darwin_hfsplus,
+ FT_RFork_Rule_vfat,
+ FT_RFork_Rule_linux_cap,
+ FT_RFork_Rule_linux_double,
+ FT_RFork_Rule_linux_netatalk
+ } FT_RFork_Rule;
+
+ /* For fast translation between rule index and rule type,
+ * the macros FT_RFORK_xxx should be kept consistent with
+ * the raccess_guess_funcs table
+ */
+ typedef struct ft_raccess_guess_rec_ {
+ ft_raccess_guess_func func;
+ FT_RFork_Rule type;
+ } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+ /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ { raccess_guess_ ## func_suffix, \
+ FT_RFork_Rule_ ## type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ void \
+ FT_Init_ ## name( type* storage ) \
+ { \
+ type* local = storage; \
+ \
+ \
+ int i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ local[i].func = raccess_guess_ ## func_suffix; \
+ local[i].type = FT_RFork_Rule_ ## type_suffix; \
+ i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Guess */
+ /* */
+ /* <Description> */
+ /* Guess a file name and offset where the actual resource fork is */
+ /* stored. The macro FT_RACCESS_N_RULES holds the number of */
+ /* guessing rules; the guessed result for the Nth rule is */
+ /* represented as a triplet: a new file name (new_names[N]), a file */
+ /* offset (offsets[N]), and an error code (errors[N]). */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* base_name :: */
+ /* The (base) file name of the resource fork used for some */
+ /* guessing rules. */
+ /* */
+ /* <Output> */
+ /* new_names :: */
+ /* An array of guessed file names in which the resource forks may */
+ /* exist. If `new_names[N]' is NULL, the guessed file name is */
+ /* equal to `base_name'. */
+ /* */
+ /* offsets :: */
+ /* An array of guessed file offsets. `offsets[N]' holds the file */
+ /* offset of the possible start of the resource fork in file */
+ /* `new_names[N]'. */
+ /* */
+ /* errors :: */
+ /* An array of FreeType error codes. `errors[N]' is the error */
+ /* code of Nth guessing rule function. If `errors[N]' is not */
+ /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */
+ /* */
+ FT_BASE( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char* base_name,
+ char** new_names,
+ FT_Long* offsets,
+ FT_Error* errors );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_HeaderInfo */
+ /* */
+ /* <Description> */
+ /* Get the information from the header of resource fork. The */
+ /* information includes the file offset where the resource map */
+ /* starts, and the file offset where the resource data starts. */
+ /* `FT_Raccess_Get_DataOffsets' requires these two data. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* rfork_offset :: */
+ /* The file offset where the resource fork starts. */
+ /* */
+ /* <Output> */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_HeaderInfo( FT_Library library,
+ FT_Stream stream,
+ FT_Long rfork_offset,
+ FT_Long *map_offset,
+ FT_Long *rdata_pos );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_DataOffsets */
+ /* */
+ /* <Description> */
+ /* Get the data offsets for a tag in a resource fork. Offsets are */
+ /* stored in an array because, in some cases, resources in a resource */
+ /* fork have the same tag. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* tag :: */
+ /* The resource tag. */
+ /* */
+ /* <Output> */
+ /* offsets :: */
+ /* The stream offsets for the resource data specified by `tag'. */
+ /* This array is allocated by the function, so you have to call */
+ /* @ft_mem_free after use. */
+ /* */
+ /* count :: */
+ /* The length of offsets array. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ /* <Note> */
+ /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */
+ /* value for `map_offset' and `rdata_pos'. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_DataOffsets( FT_Library library,
+ FT_Stream stream,
+ FT_Long map_offset,
+ FT_Long rdata_pos,
+ FT_Long tag,
+ FT_Long **offsets,
+ FT_Long *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
new file mode 100644
index 0000000000..cd5fbd0fac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/* */
+/* ftserv.h */
+/* */
+/* The FreeType services (specification only). */
+/* */
+/* Copyright 2003-2007, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Each module can export one or more `services'. Each service is */
+ /* identified by a constant string and modeled by a pointer; the latter */
+ /* generally corresponds to a structure containing function pointers. */
+ /* */
+ /* Note that a service's data cannot be a mere function pointer because */
+ /* in C it is possible that function pointers might be implemented */
+ /* differently than data pointers (e.g. 48 bits instead of 32). */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from a face's driver module.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_GLOBAL_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from all modules.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E D E S C R I P T O R S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * The following structure is used to _describe_ a given service
+ * to the library. This is useful to build simple static service lists.
+ */
+ typedef struct FT_ServiceDescRec_
+ {
+ const char* serv_id; /* service name */
+ const void* serv_data; /* service pointer/data */
+
+ } FT_ServiceDescRec;
+
+ typedef const FT_ServiceDescRec* FT_ServiceDesc;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_SERVICEDESCREC1 */
+ /* FT_DEFINE_SERVICEDESCREC2 */
+ /* FT_DEFINE_SERVICEDESCREC3 */
+ /* FT_DEFINE_SERVICEDESCREC4 */
+ /* FT_DEFINE_SERVICEDESCREC5 */
+ /* FT_DEFINE_SERVICEDESCREC6 */
+ /* FT_DEFINE_SERVICEDESCREC7 */
+ /* */
+ /* <Description> */
+ /* Used to initialize an array of FT_ServiceDescRec structures. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */
+ /* be called with a pointer to return an allocated array. As soon as */
+ /* it is no longer needed, a `destroy' function needs to be called to */
+ /* release that allocation. */
+ /* */
+ /* These functions should be manually called from the `pic_init' and */
+ /* `pic_free' functions of your module (see FT_DEFINE_MODULE). */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the array will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { serv_id_7, serv_data_7 }, \
+ { NULL, NULL } \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = NULL; \
+ clazz[1].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = NULL; \
+ clazz[2].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = NULL; \
+ clazz[3].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = NULL; \
+ clazz[4].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = NULL; \
+ clazz[5].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = NULL; \
+ clazz[6].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = serv_id_7; \
+ clazz[6].serv_data = serv_data_7; \
+ clazz[7].serv_id = NULL; \
+ clazz[7].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*
+ * Parse a list of FT_ServiceDescRec descriptors and look for
+ * a specific service by ID. Note that the last element in the
+ * array must be { NULL, NULL }, and that the function should
+ * return NULL if the service isn't available.
+ *
+ * This function can be used by modules to implement their
+ * `get_service' method.
+ */
+ FT_BASE( FT_Pointer )
+ ft_service_list_lookup( FT_ServiceDesc service_descriptors,
+ const char* service_id );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E S C A C H E *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * This structure is used to store a cache for several frequently used
+ * services. It is the type of `face->internal->services'. You
+ * should only use FT_FACE_LOOKUP_SERVICE to access it.
+ *
+ * All fields should have the type FT_Pointer to relax compilation
+ * dependencies. We assume the developer isn't completely stupid.
+ *
+ * Each field must be named `service_XXXX' where `XXX' corresponds to
+ * the correct FT_SERVICE_ID_XXXX macro. See the definition of
+ * FT_FACE_LOOKUP_SERVICE below how this is implemented.
+ *
+ */
+ typedef struct FT_ServiceCacheRec_
+ {
+ FT_Pointer service_POSTSCRIPT_FONT_NAME;
+ FT_Pointer service_MULTI_MASTERS;
+ FT_Pointer service_GLYPH_DICT;
+ FT_Pointer service_PFR_METRICS;
+ FT_Pointer service_WINFNT;
+
+ } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+ /*
+ * A magic number used within the services cache.
+ */
+
+ /* ensure that value `1' has the same width as a pointer */
+#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1)
+
+
+ /*
+ * @macro:
+ * FT_FACE_LOOKUP_SERVICE
+ *
+ * @description:
+ * This macro is used to lookup a service from a face's driver module
+ * using its cache.
+ *
+ * @input:
+ * face::
+ * The source face handle containing the cache.
+ *
+ * field ::
+ * The field name in the cache.
+ *
+ * id ::
+ * The service ID.
+ *
+ * @output:
+ * ptr ::
+ * A variable receiving the service data. NULL if not available.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ *Pptr = svc; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ ptr = svc; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+ /*
+ * A macro used to define new service structure types.
+ */
+
+#define FT_DEFINE_SERVICE( name ) \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ FT_Service_ ## name ## Rec ; \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ const * FT_Service_ ## name ; \
+ struct FT_Service_ ## name ## Rec_
+
+ /* */
+
+ /*
+ * The header files containing the services.
+ */
+
+#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
new file mode 100644
index 0000000000..c1a265431a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
@@ -0,0 +1,536 @@
+/***************************************************************************/
+/* */
+/* ftstream.h */
+/* */
+/* Stream handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2006, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include "../../ft2build.h"
+#include "../ftsystem.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* format of an 8-bit frame_op value: */
+ /* */
+ /* bit 76543210 */
+ /* xxxxxxes */
+ /* */
+ /* s is set to 1 if the value is signed. */
+ /* e is set to 1 if the value is little-endian. */
+ /* xxx is a command. */
+
+#define FT_FRAME_OP_SHIFT 2
+#define FT_FRAME_OP_SIGNED 1
+#define FT_FRAME_OP_LITTLE 2
+#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+ ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END 0
+#define FT_FRAME_OP_START 1 /* start a new frame */
+#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */
+#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */
+#define FT_FRAME_OP_LONG 4 /* read 4-byte value */
+#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */
+#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */
+
+
+ typedef enum FT_Frame_Op_
+ {
+ ft_frame_end = 0,
+ ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+ ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ),
+ ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ),
+
+ ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+ ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+ ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+ ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+ ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+ ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+ ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+ ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+ ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+ ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+ ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+ ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+ ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+ ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+ } FT_Frame_Op;
+
+
+ typedef struct FT_Frame_Field_
+ {
+ FT_Byte value;
+ FT_Byte size;
+ FT_UShort offset;
+
+ } FT_Frame_Field;
+
+
+ /* Construct an FT_Frame_Field out of a structure type and a field name. */
+ /* The structure type must be set in the FT_STRUCTURE macro before */
+ /* calling the FT_FRAME_START() macro. */
+ /* */
+#define FT_FIELD_SIZE( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+ (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+ { \
+ frame_op, \
+ FT_FIELD_SIZE( field ), \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size ) { ft_frame_start, 0, size }
+#define FT_FRAME_END { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+ { \
+ ft_frame_bytes, \
+ count, \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 }
+
+
+ /*************************************************************************/
+ /* */
+ /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+ /* type `char*' or equivalent (1-byte elements). */
+ /* */
+
+#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] )
+
+#define FT_INT16( x ) ( (FT_Int16)(x) )
+#define FT_UINT16( x ) ( (FT_UInt16)(x) )
+#define FT_INT32( x ) ( (FT_Int32)(x) )
+#define FT_UINT32( x ) ( (FT_UInt32)(x) )
+
+
+#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8) | \
+ FT_BYTE_U16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+ FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_OFF3( p ) FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+
+#define FT_NEXT_CHAR( buffer ) \
+ ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer ) \
+ ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* Each GET_xxxx() macro uses an implicit `stream' variable. */
+ /* */
+#if 0
+#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR() FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE() FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT() FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT() FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3() FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG() FT_GET_MACRO( LONG )
+#define FT_GET_ULONG() FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4() FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type ) ( (type)func( stream ) )
+
+#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var ) \
+ ( var = (type)func( stream, &error ), \
+ error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /* initialize a stream for reading a regular system stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Open( FT_Stream stream,
+ const char* filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* create a new (input) stream from an FT_Open_Args structure */
+ FT_BASE( FT_Error )
+ FT_Stream_New( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Stream *astream );
+
+ /* free a stream */
+ FT_BASE( void )
+ FT_Stream_Free( FT_Stream stream,
+ FT_Int external );
+
+ /* initialize a stream for reading in-memory data */
+ FT_BASE( void )
+ FT_Stream_OpenMemory( FT_Stream stream,
+ const FT_Byte* base,
+ FT_ULong size );
+
+ /* close a stream (does not destroy the stream structure) */
+ FT_BASE( void )
+ FT_Stream_Close( FT_Stream stream );
+
+
+ /* seek within a stream. position is relative to start of stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Seek( FT_Stream stream,
+ FT_ULong pos );
+
+ /* skip bytes in a stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Skip( FT_Stream stream,
+ FT_Long distance );
+
+ /* return current stream position */
+ FT_BASE( FT_Long )
+ FT_Stream_Pos( FT_Stream stream );
+
+ /* read bytes from a stream into a user-allocated buffer, returns an */
+ /* error if not all bytes could be read. */
+ FT_BASE( FT_Error )
+ FT_Stream_Read( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* read bytes from a stream at a given position */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadAt( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* try to read bytes at the end of a stream; return number of bytes */
+ /* really available */
+ FT_BASE( FT_ULong )
+ FT_Stream_TryRead( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* Enter a frame of `count' consecutive bytes in a stream. Returns an */
+ /* error if the frame could not be read/accessed. The caller can use */
+ /* the FT_Stream_Get_XXX functions to retrieve frame data without */
+ /* error checks. */
+ /* */
+ /* You must _always_ call FT_Stream_ExitFrame() once you have entered */
+ /* a stream frame! */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_EnterFrame( FT_Stream stream,
+ FT_ULong count );
+
+ /* exit a stream frame */
+ FT_BASE( void )
+ FT_Stream_ExitFrame( FT_Stream stream );
+
+ /* Extract a stream frame. If the stream is disk-based, a heap block */
+ /* is allocated and the frame bytes are read into it. If the stream */
+ /* is memory-based, this function simply set a pointer to the data. */
+ /* */
+ /* Useful to optimize access to memory-based streams transparently. */
+ /* */
+ /* All extracted frames must be `freed' with a call to the function */
+ /* FT_Stream_ReleaseFrame(). */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_ExtractFrame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes );
+
+ /* release an extract frame (see FT_Stream_ExtractFrame) */
+ FT_BASE( void )
+ FT_Stream_ReleaseFrame( FT_Stream stream,
+ FT_Byte** pbytes );
+
+ /* read a byte from an entered frame */
+ FT_BASE( FT_Char )
+ FT_Stream_GetChar( FT_Stream stream );
+
+ /* read a 16-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShort( FT_Stream stream );
+
+ /* read a 24-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetUOffset( FT_Stream stream );
+
+ /* read a 32-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULong( FT_Stream stream );
+
+ /* read a 16-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShortLE( FT_Stream stream );
+
+ /* read a 32-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULongLE( FT_Stream stream );
+
+
+ /* read a byte from a stream */
+ FT_BASE( FT_Char )
+ FT_Stream_ReadChar( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShort( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 24-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadUOffset( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit big-endian integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULongLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* Read a structure from a stream. The structure must be described */
+ /* by an array of FT_Frame_Field records. */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadFields( FT_Stream stream,
+ const FT_Frame_Field* fields,
+ void* structure );
+
+
+#define FT_STREAM_POS() \
+ FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position ) \
+ FT_SET_ERROR( FT_Stream_Seek( stream, \
+ (FT_ULong)(position) ) )
+
+#define FT_STREAM_SKIP( distance ) \
+ FT_SET_ERROR( FT_Stream_Skip( stream, \
+ (FT_Long)(distance) ) )
+
+#define FT_STREAM_READ( buffer, count ) \
+ FT_SET_ERROR( FT_Stream_Read( stream, \
+ (FT_Byte*)(buffer), \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count ) \
+ FT_SET_ERROR( FT_Stream_ReadAt( stream, \
+ (FT_ULong)(position), \
+ (FT_Byte*)buffer, \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object ) \
+ FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \
+ (FT_ULong)(size) ) ) )
+
+#define FT_FRAME_EXIT() \
+ FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \
+ (FT_ULong)(size), \
+ (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes ) \
+ FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \
+ (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
new file mode 100644
index 0000000000..a9d98b60aa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
@@ -0,0 +1,152 @@
+/***************************************************************************/
+/* */
+/* fttrace.h */
+/* */
+/* Tracing handling (specification only). */
+/* */
+/* Copyright 2002, 2004-2007, 2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /* definitions of trace levels for FreeType 2 */
+
+ /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+ /* base components */
+FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */
+FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */
+FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */
+FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */
+FT_TRACE_DEF( list ) /* list management (ftlist.c) */
+FT_TRACE_DEF( init ) /* initialization (ftinit.c) */
+FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */
+FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */
+FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */
+FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */
+
+FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */
+FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */
+FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */
+FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */
+FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */
+FT_TRACE_DEF( bitmap ) /* bitmap checksum (ftobjs.c) */
+
+ /* Cache sub-system */
+FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */
+
+ /* SFNT driver components */
+FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */
+FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */
+FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */
+FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */
+FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */
+FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */
+FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */
+FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */
+FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */
+
+ /* TrueType driver components */
+FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */
+FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */
+FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */
+FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */
+FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */
+FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */
+
+ /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+ /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( psconv )
+
+ /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+ /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+FT_TRACE_DEF( cf2blues )
+FT_TRACE_DEF( cf2hints )
+FT_TRACE_DEF( cf2interp )
+
+ /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+ /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+ /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+ /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+ /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+ /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+ /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+ /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+ /* autofit components */
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
new file mode 100644
index 0000000000..444261317d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
@@ -0,0 +1,161 @@
+/***************************************************************************/
+/* */
+/* ftvalid.h */
+/* */
+/* FreeType validation support (specification). */
+/* */
+/* Copyright 2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include "../../ft2build.h"
+#include "../config/ftstdlib.h" /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** V A L I D A T I O N ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to a validation object */
+ typedef struct FT_ValidatorRec_ volatile* FT_Validator;
+
+
+ /*************************************************************************/
+ /* */
+ /* There are three distinct validation levels defined here: */
+ /* */
+ /* FT_VALIDATE_DEFAULT :: */
+ /* A table that passes this validation level can be used reliably by */
+ /* FreeType. It generally means that all offsets have been checked to */
+ /* prevent out-of-bound reads, that array counts are correct, etc. */
+ /* */
+ /* FT_VALIDATE_TIGHT :: */
+ /* A table that passes this validation level can be used reliably and */
+ /* doesn't contain invalid data. For example, a charmap table that */
+ /* returns invalid glyph indices will not pass, even though it can */
+ /* be used with FreeType in default mode (the library will simply */
+ /* return an error later when trying to load the glyph). */
+ /* */
+ /* It also checks that fields which must be a multiple of 2, 4, or 8, */
+ /* don't have incorrect values, etc. */
+ /* */
+ /* FT_VALIDATE_PARANOID :: */
+ /* Only for font debugging. Checks that a table follows the */
+ /* specification by 100%. Very few fonts will be able to pass this */
+ /* level anyway but it can be useful for certain tools like font */
+ /* editors/converters. */
+ /* */
+ typedef enum FT_ValidationLevel_
+ {
+ FT_VALIDATE_DEFAULT = 0,
+ FT_VALIDATE_TIGHT,
+ FT_VALIDATE_PARANOID
+
+ } FT_ValidationLevel;
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `structure was padded due to */
+ /* __declspec(align())' in order to compile cleanly with */
+ /* the maximum level of warnings. */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+ /* validator structure */
+ typedef struct FT_ValidatorRec_
+ {
+ const FT_Byte* base; /* address of table in memory */
+ const FT_Byte* limit; /* `base' + sizeof(table) in memory */
+ FT_ValidationLevel level; /* validation level */
+ FT_Error error; /* error returned. 0 means success */
+
+ ft_jmp_buf jump_buffer; /* used for exception handling */
+
+ } FT_ValidatorRec;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) )
+
+
+ FT_BASE( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level );
+
+ /* Do not use this. It's broken and will cause your validator to crash */
+ /* if you run it on an invalid font. */
+ FT_BASE( FT_Int )
+ ft_validator_run( FT_Validator valid );
+
+ /* Sets the error field in a validator, then calls `longjmp' to return */
+ /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */
+ /* error checks within the validation routines. */
+ /* */
+ FT_BASE( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error );
+
+
+ /* Calls ft_validate_error. Assumes that the `valid' local variable */
+ /* holds a pointer to the current validator object. */
+ /* */
+ /* Use preprocessor prescan to pass FT_ERR_PREFIX. */
+ /* */
+#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+ ft_validator_error( valid, _prefix ## _error )
+
+ /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+ /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+ /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
new file mode 100644
index 0000000000..262afcfa8a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* internal.h */
+/* */
+/* Internal header files (specification only). */
+/* */
+/* Copyright 1996-2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is automatically included by `ft2build.h'. */
+ /* Do not include it manually! */
+ /* */
+ /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+
+ /* We disable the warning `conditional expression is constant' here */
+ /* in order to compile cleanly with the maximum level of warnings. */
+ /* In particular, the warning complains about stuff like `while(0)' */
+ /* which is very useful in macro definitions. There is no benefit */
+ /* in having it enabled. */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
new file mode 100644
index 0000000000..3128ea4cb7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
@@ -0,0 +1,877 @@
+/***************************************************************************/
+/* */
+/* psaux.h */
+/* */
+/* Auxiliary functions and data structures related to PostScript fonts */
+/* (specification). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+#include "t1types.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct PS_TableRec_* PS_Table;
+ typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Table_FuncsRec */
+ /* */
+ /* <Description> */
+ /* A set of function pointers to manage PS_Table objects. */
+ /* */
+ /* <Fields> */
+ /* table_init :: Used to initialize a table. */
+ /* */
+ /* table_done :: Finalizes resp. destroy a given table. */
+ /* */
+ /* table_add :: Adds a new object to a table. */
+ /* */
+ /* table_release :: Releases table data, then finalizes it. */
+ /* */
+ typedef struct PS_Table_FuncsRec_
+ {
+ FT_Error
+ (*init)( PS_Table table,
+ FT_Int count,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Table table );
+
+ FT_Error
+ (*add)( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length );
+
+ void
+ (*release)( PS_Table table );
+
+ } PS_Table_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_TableRec */
+ /* */
+ /* <Description> */
+ /* A PS_Table is a simple object used to store an array of objects in */
+ /* a single memory block. */
+ /* */
+ /* <Fields> */
+ /* block :: The address in memory of the growheap's block. This */
+ /* can change between two object adds, due to */
+ /* reallocation. */
+ /* */
+ /* cursor :: The current top of the grow heap within its block. */
+ /* */
+ /* capacity :: The current size of the heap block. Increments by */
+ /* 1kByte chunks. */
+ /* */
+ /* init :: Set to 0xDEADBEEF if `elements' and `lengths' have */
+ /* been allocated. */
+ /* */
+ /* max_elems :: The maximum number of elements in table. */
+ /* */
+ /* num_elems :: The current number of elements in table. */
+ /* */
+ /* elements :: A table of element addresses within the block. */
+ /* */
+ /* lengths :: A table of element sizes within the block. */
+ /* */
+ /* memory :: The object used for memory operations */
+ /* (alloc/realloc). */
+ /* */
+ /* funcs :: A table of method pointers for this object. */
+ /* */
+ typedef struct PS_TableRec_
+ {
+ FT_Byte* block; /* current memory block */
+ FT_Offset cursor; /* current cursor in memory block */
+ FT_Offset capacity; /* current size of memory block */
+ FT_Long init;
+
+ FT_Int max_elems;
+ FT_Int num_elems;
+ FT_Byte** elements; /* addresses of table elements */
+ FT_PtrDist* lengths; /* lengths of table elements */
+
+ FT_Memory memory;
+ PS_Table_FuncsRec funcs;
+
+ } PS_TableRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 FIELDS & TOKENS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PS_ParserRec_* PS_Parser;
+
+ typedef struct T1_TokenRec_* T1_Token;
+
+ typedef struct T1_FieldRec_* T1_Field;
+
+
+ /* simple enumeration type used to identify token types */
+ typedef enum T1_TokenType_
+ {
+ T1_TOKEN_TYPE_NONE = 0,
+ T1_TOKEN_TYPE_ANY,
+ T1_TOKEN_TYPE_STRING,
+ T1_TOKEN_TYPE_ARRAY,
+ T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+ /* do not remove */
+ T1_TOKEN_TYPE_MAX
+
+ } T1_TokenType;
+
+
+ /* a simple structure used to identify tokens */
+ typedef struct T1_TokenRec_
+ {
+ FT_Byte* start; /* first character of token in input stream */
+ FT_Byte* limit; /* first character after the token */
+ T1_TokenType type; /* type of token */
+
+ } T1_TokenRec;
+
+
+ /* enumeration type used to identify object fields */
+ typedef enum T1_FieldType_
+ {
+ T1_FIELD_TYPE_NONE = 0,
+ T1_FIELD_TYPE_BOOL,
+ T1_FIELD_TYPE_INTEGER,
+ T1_FIELD_TYPE_FIXED,
+ T1_FIELD_TYPE_FIXED_1000,
+ T1_FIELD_TYPE_STRING,
+ T1_FIELD_TYPE_KEY,
+ T1_FIELD_TYPE_BBOX,
+ T1_FIELD_TYPE_MM_BBOX,
+ T1_FIELD_TYPE_INTEGER_ARRAY,
+ T1_FIELD_TYPE_FIXED_ARRAY,
+ T1_FIELD_TYPE_CALLBACK,
+
+ /* do not remove */
+ T1_FIELD_TYPE_MAX
+
+ } T1_FieldType;
+
+
+ typedef enum T1_FieldLocation_
+ {
+ T1_FIELD_LOCATION_CID_INFO,
+ T1_FIELD_LOCATION_FONT_DICT,
+ T1_FIELD_LOCATION_FONT_EXTRA,
+ T1_FIELD_LOCATION_FONT_INFO,
+ T1_FIELD_LOCATION_PRIVATE,
+ T1_FIELD_LOCATION_BBOX,
+ T1_FIELD_LOCATION_LOADER,
+ T1_FIELD_LOCATION_FACE,
+ T1_FIELD_LOCATION_BLEND,
+
+ /* do not remove */
+ T1_FIELD_LOCATION_MAX
+
+ } T1_FieldLocation;
+
+
+ typedef void
+ (*T1_Field_ParseFunc)( FT_Face face,
+ FT_Pointer parser );
+
+
+ /* structure type used to model object fields */
+ typedef struct T1_FieldRec_
+ {
+ const char* ident; /* field identifier */
+ T1_FieldLocation location;
+ T1_FieldType type; /* type of field */
+ T1_Field_ParseFunc reader;
+ FT_UInt offset; /* offset of field in object */
+ FT_Byte size; /* size of field in bytes */
+ FT_UInt array_max; /* maximum number of elements for */
+ /* array */
+ FT_UInt count_offset; /* offset of element count for */
+ /* arrays; must not be zero if in */
+ /* use -- in other words, a */
+ /* `num_FOO' element must not */
+ /* start the used structure if we */
+ /* parse a `FOO' array */
+ FT_UInt dict; /* where we expect it */
+ } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE( _fname ), \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+ { \
+ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
+ (T1_Field_ParseFunc)_reader, \
+ 0, 0, \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, \
+ FT_FIELD_OFFSET( num_ ## _fname ), \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, 0, \
+ _dict \
+ },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+ _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \
+ T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs;
+
+ typedef struct PS_Parser_FuncsRec_
+ {
+ void
+ (*init)( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Parser parser );
+
+ void
+ (*skip_spaces)( PS_Parser parser );
+ void
+ (*skip_PS_token)( PS_Parser parser );
+
+ FT_Long
+ (*to_int)( PS_Parser parser );
+ FT_Fixed
+ (*to_fixed)( PS_Parser parser,
+ FT_Int power_ten );
+
+ FT_Error
+ (*to_bytes)( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters );
+
+ FT_Int
+ (*to_coord_array)( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords );
+ FT_Int
+ (*to_fixed_array)( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten );
+
+ void
+ (*to_token)( PS_Parser parser,
+ T1_Token token );
+ void
+ (*to_token_array)( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens );
+
+ FT_Error
+ (*load_field)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_Error
+ (*load_field_table)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ } PS_Parser_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_ParserRec */
+ /* */
+ /* <Description> */
+ /* A PS_Parser is an object used to parse a Type 1 font very quickly. */
+ /* */
+ /* <Fields> */
+ /* cursor :: The current position in the text. */
+ /* */
+ /* base :: Start of the processed text. */
+ /* */
+ /* limit :: End of the processed text. */
+ /* */
+ /* error :: The last error returned. */
+ /* */
+ /* memory :: The object used for memory operations (alloc/realloc). */
+ /* */
+ /* funcs :: A table of functions for the parser. */
+ /* */
+ typedef struct PS_ParserRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Error error;
+ FT_Memory memory;
+
+ PS_Parser_FuncsRec funcs;
+
+ } PS_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_BuilderRec_* T1_Builder;
+
+
+ typedef FT_Error
+ (*T1_Builder_Check_Points_Func)( T1_Builder builder,
+ FT_Int count );
+
+ typedef void
+ (*T1_Builder_Add_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Point1_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Contour_Func)( T1_Builder builder );
+
+ typedef FT_Error
+ (*T1_Builder_Start_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef void
+ (*T1_Builder_Close_Contour_Func)( T1_Builder builder );
+
+
+ typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs;
+
+ typedef struct T1_Builder_FuncsRec_
+ {
+ void
+ (*init)( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Bool hinting );
+
+ void
+ (*done)( T1_Builder builder );
+
+ T1_Builder_Check_Points_Func check_points;
+ T1_Builder_Add_Point_Func add_point;
+ T1_Builder_Add_Point1_Func add_point1;
+ T1_Builder_Add_Contour_Func add_contour;
+ T1_Builder_Start_Point_Func start_point;
+ T1_Builder_Close_Contour_Func close_contour;
+
+ } T1_Builder_FuncsRec;
+
+
+ /* an enumeration type to handle charstring parsing states */
+ typedef enum T1_ParseState_
+ {
+ T1_Parse_Start,
+ T1_Parse_Have_Width,
+ T1_Parse_Have_Moveto,
+ T1_Parse_Have_Path
+
+ } T1_ParseState;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Structure> */
+ /* T1_BuilderRec */
+ /* */
+ /* <Description> */
+ /* A structure used during glyph loading to store its outline. */
+ /* */
+ /* <Fields> */
+ /* memory :: The current memory object. */
+ /* */
+ /* face :: The current face object. */
+ /* */
+ /* glyph :: The current glyph slot. */
+ /* */
+ /* loader :: XXX */
+ /* */
+ /* base :: The base glyph outline. */
+ /* */
+ /* current :: The current glyph outline. */
+ /* */
+ /* max_points :: maximum points in builder outline */
+ /* */
+ /* max_contours :: Maximum number of contours in builder outline. */
+ /* */
+ /* pos_x :: The horizontal translation (if composite glyph). */
+ /* */
+ /* pos_y :: The vertical translation (if composite glyph). */
+ /* */
+ /* left_bearing :: The left side bearing point. */
+ /* */
+ /* advance :: The horizontal advance vector. */
+ /* */
+ /* bbox :: Unused. */
+ /* */
+ /* parse_state :: An enumeration which controls the charstring */
+ /* parsing state. */
+ /* */
+ /* load_points :: If this flag is not set, no points are loaded. */
+ /* */
+ /* no_recurse :: Set but not used. */
+ /* */
+ /* metrics_only :: A boolean indicating that we only want to compute */
+ /* the metrics of a given glyph, not load all of its */
+ /* points. */
+ /* */
+ /* funcs :: An array of function pointers for the builder. */
+ /* */
+ typedef struct T1_BuilderRec_
+ {
+ FT_Memory memory;
+ FT_Face face;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader loader;
+ FT_Outline* base;
+ FT_Outline* current;
+
+ FT_Pos pos_x;
+ FT_Pos pos_y;
+
+ FT_Vector left_bearing;
+ FT_Vector advance;
+
+ FT_BBox bbox; /* bounding box */
+ T1_ParseState parse_state;
+ FT_Bool load_points;
+ FT_Bool no_recurse;
+
+ FT_Bool metrics_only;
+
+ void* hints_funcs; /* hinter-specific */
+ void* hints_globals; /* hinter-specific */
+
+ T1_Builder_FuncsRec funcs;
+
+ } T1_BuilderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 DECODER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 8
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 32
+
+#endif /* 0 */
+
+
+ typedef struct T1_Decoder_ZoneRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+
+ } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+ typedef struct T1_DecoderRec_* T1_Decoder;
+ typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs;
+
+
+ typedef FT_Error
+ (*T1_Decoder_Callback)( T1_Decoder decoder,
+ FT_UInt glyph_index );
+
+
+ typedef struct T1_Decoder_FuncsRec_
+ {
+ FT_Error
+ (*init)( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback callback );
+
+ void
+ (*done)( T1_Decoder decoder );
+
+ FT_Error
+ (*parse_charstrings)( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+
+ } T1_Decoder_FuncsRec;
+
+
+ typedef struct T1_DecoderRec_
+ {
+ T1_BuilderRec builder;
+
+ FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS];
+ FT_Long* top;
+
+ T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1];
+ T1_Decoder_Zone zone;
+
+ FT_Service_PsCMaps psnames; /* for seac */
+ FT_UInt num_glyphs;
+ FT_Byte** glyph_names;
+
+ FT_Int lenIV; /* internal for sub routine calls */
+ FT_UInt num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len; /* array of subrs length (optional) */
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ PS_Blend blend; /* for multiple master support */
+
+ FT_Render_Mode hint_mode;
+
+ T1_Decoder_Callback parse_callback;
+ T1_Decoder_FuncsRec funcs;
+
+ FT_Long* buildchar;
+ FT_UInt len_buildchar;
+
+ FT_Bool seac;
+
+ } T1_DecoderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** AFM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_ParserRec_* AFM_Parser;
+
+ typedef struct AFM_Parser_FuncsRec_
+ {
+ FT_Error
+ (*init)( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit );
+
+ void
+ (*done)( AFM_Parser parser );
+
+ FT_Error
+ (*parse)( AFM_Parser parser );
+
+ } AFM_Parser_FuncsRec;
+
+
+ typedef struct AFM_StreamRec_* AFM_Stream;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* AFM_ParserRec */
+ /* */
+ /* <Description> */
+ /* An AFM_Parser is a parser for the AFM files. */
+ /* */
+ /* <Fields> */
+ /* memory :: The object used for memory operations (alloc and */
+ /* realloc). */
+ /* */
+ /* stream :: This is an opaque object. */
+ /* */
+ /* FontInfo :: The result will be stored here. */
+ /* */
+ /* get_index :: A user provided function to get a glyph index by its */
+ /* name. */
+ /* */
+ typedef struct AFM_ParserRec_
+ {
+ FT_Memory memory;
+ AFM_Stream stream;
+
+ AFM_FontInfo FontInfo;
+
+ FT_Int
+ (*get_index)( const char* name,
+ FT_Offset len,
+ void* user_data );
+
+ void* user_data;
+
+ } AFM_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CHARMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes;
+
+ typedef struct T1_CMap_ClassesRec_
+ {
+ FT_CMap_Class standard;
+ FT_CMap_Class expert;
+ FT_CMap_Class custom;
+ FT_CMap_Class unicode;
+
+ } T1_CMap_ClassesRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PSAux Module Interface *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSAux_ServiceRec_
+ {
+ /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+ const PS_Table_FuncsRec* ps_table_funcs;
+ const PS_Parser_FuncsRec* ps_parser_funcs;
+ const T1_Builder_FuncsRec* t1_builder_funcs;
+ const T1_Decoder_FuncsRec* t1_decoder_funcs;
+
+ void
+ (*t1_decrypt)( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed );
+
+ T1_CMap_Classes t1_cmap_classes;
+
+ /* fields after this comment line were added after version 2.1.10 */
+ const AFM_Parser_FuncsRec* afm_parser_funcs;
+
+ } PSAux_ServiceRec, *PSAux_Service;
+
+ /* backwards-compatible type definition */
+ typedef PSAux_ServiceRec PSAux_Interface;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** Some convenience functions *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+ ( (ch) == '\r' || \
+ (ch) == '\n' )
+
+#define IS_PS_SPACE( ch ) \
+ ( (ch) == ' ' || \
+ IS_PS_NEWLINE( ch ) || \
+ (ch) == '\t' || \
+ (ch) == '\f' || \
+ (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch ) \
+ ( (ch) == '/' || \
+ (ch) == '(' || (ch) == ')' || \
+ (ch) == '<' || (ch) == '>' || \
+ (ch) == '[' || (ch) == ']' || \
+ (ch) == '{' || (ch) == '}' || \
+ (ch) == '%' )
+
+#define IS_PS_DELIM( ch ) \
+ ( IS_PS_SPACE( ch ) || \
+ IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch ) \
+ ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch ) \
+ ( IS_PS_DIGIT( ch ) || \
+ ( (ch) >= 'A' && (ch) <= 'F' ) || \
+ ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch ) \
+ ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token ) \
+ ( (char)(cur)[0] == (token)[0] && \
+ ( (cur) + sizeof ( (token) ) == (limit) || \
+ ( (cur) + sizeof( (token) ) < (limit) && \
+ IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \
+ ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
new file mode 100644
index 0000000000..f9b594079a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
@@ -0,0 +1,722 @@
+/***************************************************************************/
+/* */
+/* pshints.h */
+/* */
+/* Interface to Postscript-specific (Type 1 and Type 2) hints */
+/* recorders (specification only). These are used to support native */
+/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */
+/* */
+/* Copyright 2001-2003, 2005-2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+#include "../t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INTERNAL REPRESENTATION OF GLOBALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSH_GlobalsRec_* PSH_Globals;
+
+ typedef FT_Error
+ (*PSH_Globals_NewFunc)( FT_Memory memory,
+ T1_Private* private_dict,
+ PSH_Globals* aglobals );
+
+ typedef FT_Error
+ (*PSH_Globals_SetScaleFunc)( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta );
+
+ typedef void
+ (*PSH_Globals_DestroyFunc)( PSH_Globals globals );
+
+
+ typedef struct PSH_Globals_FuncsRec_
+ {
+ PSH_Globals_NewFunc create;
+ PSH_Globals_SetScaleFunc set_scale;
+ PSH_Globals_DestroyFunc destroy;
+
+ } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 1 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 1 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T1_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stem', `stem3', or `reset'). Note that these functions do
+ * not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * PostScript hinter.
+ *
+ */
+ typedef struct T1_HintsRec_* T1_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+ * a given @T1_Hints object.
+ *
+ */
+ typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to prepare it for a new Type 1
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * @note:
+ * You should always call the @T1_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T1_Hints_OpenFunc)( T1_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStemFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record a new horizontal or
+ * vertical stem. This corresponds to the Type 1 `hstem' and `vstem'
+ * operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * coords ::
+ * Array of 2 coordinates in 16.16 format, used as (position,length)
+ * stem descriptor.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * `coords[0]' is the absolute stem position (lowest coordinate);
+ * `coords[1]' is the length.
+ *
+ * The length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ * If the length is -21 (corresponding to a bottom ghost stem), then
+ * the real stem position is `coords[0]+coords[1]'.
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStemFunc)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStem3Func
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record three
+ * counter-controlled horizontal or vertical stems at once.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems, 1 for vertical ones.
+ *
+ * coords ::
+ * An array of 6 values in 16.16 format, holding 3 (position,length)
+ * pairs for the counter-controlled stems.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * The lengths cannot be negative (ghost stems are never
+ * counter-controlled).
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStem3Func)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ResetFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to reset the stems hints in a
+ * recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph in which the
+ * previously defined hints apply.
+ *
+ */
+ typedef void
+ (*T1_Hints_ResetFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_CloseFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called once all hints have been
+ * recorded.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font as the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_ApplyFunc)( T1_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T1_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T1_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T1 Hints recorder.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stem ::
+ * The function to set a simple stem.
+ *
+ * stem3 ::
+ * The function to set counter-controlled stems.
+ *
+ * reset ::
+ * The function to reset stem hints.
+ *
+ * apply ::
+ * The function to apply the hints to the corresponding glyph outline.
+ *
+ */
+ typedef struct T1_Hints_FuncsRec_
+ {
+ T1_Hints hints;
+ T1_Hints_OpenFunc open;
+ T1_Hints_CloseFunc close;
+ T1_Hints_SetStemFunc stem;
+ T1_Hints_SetStem3Func stem3;
+ T1_Hints_ResetFunc reset;
+ T1_Hints_ApplyFunc apply;
+
+ } T1_Hints_FuncsRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 2 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 2 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T2_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stems', `hintmask', `counters'). Note that these
+ * functions do not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * Postscript hinter.
+ *
+ */
+ typedef struct T2_HintsRec_* T2_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+ * a given @T2_Hints object.
+ *
+ */
+ typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to prepare it for a new Type 2
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * @note:
+ * You should always call the @T2_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T2_Hints_OpenFunc)( T2_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_StemsFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set the table of stems in
+ * either the vertical or horizontal dimension. Equivalent to the
+ * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * count ::
+ * The number of stems.
+ *
+ * coords ::
+ * An array of `count' (position,length) pairs in 16.16 format.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * There are `2*count' elements in the `coords' array. Each even
+ * element is an absolute position in font units, each odd element is a
+ * length in font units.
+ *
+ * A length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ */
+ typedef void
+ (*T2_Hints_StemsFunc)( T2_Hints hints,
+ FT_UInt dimension,
+ FT_UInt count,
+ FT_Fixed* coordinates );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_MaskFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given hintmask (this
+ * corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The glyph index of the last point to which the previously defined
+ * or activated hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_MaskFunc)( T2_Hints hints,
+ FT_UInt end_point,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CounterFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given counter mask
+ * (this corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * A glyph index of the last point to which the previously defined or
+ * active hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_CounterFunc)( T2_Hints hints,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_CloseFunc)( T2_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called after the `close'
+ * method.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font than the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_ApplyFunc)( T2_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T2_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T2_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T2 hints recorder object.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stems ::
+ * The function to set the dimension's stems table.
+ *
+ * hintmask ::
+ * The function to set hint masks.
+ *
+ * counter ::
+ * The function to set counter masks.
+ *
+ * apply ::
+ * The function to apply the hints on the corresponding glyph outline.
+ *
+ */
+ typedef struct T2_Hints_FuncsRec_
+ {
+ T2_Hints hints;
+ T2_Hints_OpenFunc open;
+ T2_Hints_CloseFunc close;
+ T2_Hints_StemsFunc stems;
+ T2_Hints_MaskFunc hintmask;
+ T2_Hints_CounterFunc counter;
+ T2_Hints_ApplyFunc apply;
+
+ } T2_Hints_FuncsRec;
+
+
+ /* */
+
+
+ typedef struct PSHinter_Interface_
+ {
+ PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module );
+ T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module );
+ T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module );
+
+ } PSHinter_Interface;
+
+ typedef PSHinter_Interface* PSHinter_Service;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ static const PSHinter_Interface class_ = \
+ { \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ PSHinter_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_globals_funcs = get_globals_funcs_; \
+ clazz->get_t1_funcs = get_t1_funcs_; \
+ clazz->get_t2_funcs = get_t2_funcs_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
new file mode 100644
index 0000000000..508bd1566f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/* */
+/* svbdf.h */
+/* */
+/* The FreeType BDF services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include "../../ftbdf.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF "bdf"
+
+ typedef FT_Error
+ (*FT_BDF_GetCharsetIdFunc)( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+ typedef FT_Error
+ (*FT_BDF_GetPropertyFunc)( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+
+ FT_DEFINE_SERVICE( BDF )
+ {
+ FT_BDF_GetCharsetIdFunc get_charset_id;
+ FT_BDF_GetPropertyFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ static const FT_Service_BDFRec class_ = \
+ { \
+ get_charset_id_, get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_BDFRec* clazz ) \
+ { \
+ clazz->get_charset_id = get_charset_id_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
new file mode 100644
index 0000000000..fe33c74242
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/* */
+/* svcid.h */
+/* */
+/* The FreeType CID font services (specification). */
+/* */
+/* Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID "CID"
+
+ typedef FT_Error
+ (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement );
+ typedef FT_Error
+ (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face,
+ FT_Bool *is_cid );
+ typedef FT_Error
+ (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ FT_DEFINE_SERVICE( CID )
+ {
+ FT_CID_GetRegistryOrderingSupplementFunc get_ros;
+ FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid;
+ FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ static const FT_Service_CIDRec class_ = \
+ { \
+ get_ros_, get_is_cid_, get_cid_from_glyph_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_CIDRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ros = get_ros_; \
+ clazz->get_is_cid = get_is_cid_; \
+ clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
new file mode 100644
index 0000000000..9956f74455
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* svgldict.h */
+/* */
+/* The FreeType glyph dictionary services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to retrieve glyph names, as well as to find the
+ * index of a given glyph name in a font.
+ *
+ */
+
+#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict"
+
+
+ typedef FT_Error
+ (*FT_GlyphDict_GetNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_GlyphDict_NameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+ FT_DEFINE_SERVICE( GlyphDict )
+ {
+ FT_GlyphDict_GetNameFunc get_name;
+ FT_GlyphDict_NameIndexFunc name_index; /* optional */
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ static const FT_Service_GlyphDictRec class_ = \
+ { \
+ get_name_, name_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_GlyphDictRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_name = get_name_; \
+ clazz->name_index = name_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
new file mode 100644
index 0000000000..277b6a9931
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/* */
+/* svgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005 by */
+/* Masatake YAMATO, Red Hat K.K., */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include "../../ftgxval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate"
+
+ typedef FT_Error
+ (*gxv_validate_func)( FT_Face face,
+ FT_UInt gx_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ typedef FT_Error
+ (*ckern_validate_func)( FT_Face face,
+ FT_UInt ckern_flags,
+ FT_Bytes *ckern_table );
+
+
+ FT_DEFINE_SERVICE( GXvalidate )
+ {
+ gxv_validate_func validate;
+ };
+
+ FT_DEFINE_SERVICE( CKERNvalidate )
+ {
+ ckern_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
new file mode 100644
index 0000000000..da03fef614
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* svkern.h */
+/* */
+/* The FreeType Kerning service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING "kerning"
+
+
+ typedef FT_Error
+ (*FT_Kerning_TrackGetFunc)( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+ FT_DEFINE_SERVICE( Kerning )
+ {
+ FT_Kerning_TrackGetFunc get_track;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
new file mode 100644
index 0000000000..100ff8703a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/* */
+/* svmm.h */
+/* */
+/* The FreeType Multiple Masters and GX var services (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to manage multiple-masters data in a given face.
+ *
+ * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+ *
+ */
+
+#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters"
+
+
+ typedef FT_Error
+ (*FT_Get_MM_Func)( FT_Face face,
+ FT_Multi_Master* master );
+
+ typedef FT_Error
+ (*FT_Get_MM_Var_Func)( FT_Face face,
+ FT_MM_Var* *master );
+
+ typedef FT_Error
+ (*FT_Set_MM_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+ typedef FT_Error
+ (*FT_Set_Var_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Set_MM_Blend_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ FT_DEFINE_SERVICE( MultiMasters )
+ {
+ FT_Get_MM_Func get_mm;
+ FT_Set_MM_Design_Func set_mm_design;
+ FT_Set_MM_Blend_Func set_mm_blend;
+ FT_Get_MM_Var_Func get_mm_var;
+ FT_Set_Var_Design_Func set_var_design;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ static const FT_Service_MultiMastersRec class_ = \
+ { \
+ get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \
+ { \
+ clazz->get_mm = get_mm_; \
+ clazz->set_mm_design = set_mm_design_; \
+ clazz->set_mm_blend = set_mm_blend_; \
+ clazz->get_mm_var = get_mm_var_; \
+ clazz->set_var_design = set_var_design_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
new file mode 100644
index 0000000000..37cd34f298
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svotval.h */
+/* */
+/* The FreeType OpenType validation service (specification). */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include "../../ftotval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate"
+
+
+ typedef FT_Error
+ (*otv_validate_func)( FT_Face volatile face,
+ FT_UInt ot_flags,
+ FT_Bytes *base,
+ FT_Bytes *gdef,
+ FT_Bytes *gpos,
+ FT_Bytes *gsub,
+ FT_Bytes *jstf );
+
+
+ FT_DEFINE_SERVICE( OTvalidate )
+ {
+ otv_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
new file mode 100644
index 0000000000..21a00d3750
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/* */
+/* svpfr.h */
+/* */
+/* Internal PFR service functions (specification). */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include "../../ftpfr.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics"
+
+
+ typedef FT_Error
+ (*FT_PFR_GetMetricsFunc)( FT_Face face,
+ FT_UInt *aoutline,
+ FT_UInt *ametrics,
+ FT_Fixed *ax_scale,
+ FT_Fixed *ay_scale );
+
+ typedef FT_Error
+ (*FT_PFR_GetKerningFunc)( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+ typedef FT_Error
+ (*FT_PFR_GetAdvanceFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+
+ FT_DEFINE_SERVICE( PfrMetrics )
+ {
+ FT_PFR_GetMetricsFunc get_metrics;
+ FT_PFR_GetKerningFunc get_kerning;
+ FT_PFR_GetAdvanceFunc get_advance;
+
+ };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
new file mode 100644
index 0000000000..7fe8603db2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svpostnm.h */
+/* */
+/* The FreeType PostScript name services (specification). */
+/* */
+/* Copyright 2003, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * A trivial service used to retrieve the PostScript name of a given
+ * font when available. The `get_name' field should never be NULL.
+ *
+ * The corresponding function can return NULL to indicate that the
+ * PostScript name is not available.
+ *
+ * The name is owned by the face and will be destroyed with it.
+ */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name"
+
+
+ typedef const char*
+ (*FT_PsName_GetFunc)( FT_Face face );
+
+
+ FT_DEFINE_SERVICE( PsFontName )
+ {
+ FT_PsName_GetFunc get_ps_font_name;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ static const FT_Service_PsFontNameRec class_ = \
+ { \
+ get_ps_font_name_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsFontNameRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ps_font_name = get_ps_font_name_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
new file mode 100644
index 0000000000..22da0bbc69
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svprop.h */
+/* */
+/* The FreeType property service (specification). */
+/* */
+/* Copyright 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPROP_H__
+#define __SVPROP_H__
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PROPERTIES "properties"
+
+
+ typedef FT_Error
+ (*FT_Properties_SetFunc)( FT_Module module,
+ const char* property_name,
+ const void* value );
+
+ typedef FT_Error
+ (*FT_Properties_GetFunc)( FT_Module module,
+ const char* property_name,
+ void* value );
+
+
+ FT_DEFINE_SERVICE( Properties )
+ {
+ FT_Properties_SetFunc set_property;
+ FT_Properties_GetFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ static const FT_Service_PropertiesRec class_ = \
+ { \
+ set_property_, \
+ get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_PropertiesRec* clazz ) \
+ { \
+ clazz->set_property = set_property_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPROP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
new file mode 100644
index 0000000000..592d14ff00
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/* */
+/* svpscmap.h */
+/* */
+/* The FreeType PostScript charmap service (specification). */
+/* */
+/* Copyright 2003, 2006, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include "../ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps"
+
+
+ /*
+ * Adobe glyph name to unicode value.
+ */
+ typedef FT_UInt32
+ (*PS_Unicode_ValueFunc)( const char* glyph_name );
+
+ /*
+ * Macintosh name id to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Macintosh_NameFunc)( FT_UInt name_index );
+
+ /*
+ * Adobe standard string ID to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index );
+
+
+ /*
+ * Simple unicode -> glyph index charmap built from font glyph names
+ * table.
+ */
+ typedef struct PS_UniMap_
+ {
+ FT_UInt32 unicode; /* bit 31 set: is glyph variant */
+ FT_UInt glyph_index;
+
+ } PS_UniMap;
+
+
+ typedef struct PS_UnicodesRec_* PS_Unicodes;
+
+ typedef struct PS_UnicodesRec_
+ {
+ FT_CMapRec cmap;
+ FT_UInt num_maps;
+ PS_UniMap* maps;
+
+ } PS_UnicodesRec;
+
+
+ /*
+ * A function which returns a glyph name for a given index. Returns
+ * NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_GetGlyphNameFunc)( FT_Pointer data,
+ FT_UInt string_index );
+
+ /*
+ * A function used to release the glyph name returned by
+ * PS_GetGlyphNameFunc, when needed
+ */
+ typedef void
+ (*PS_FreeGlyphNameFunc)( FT_Pointer data,
+ const char* name );
+
+ typedef FT_Error
+ (*PS_Unicodes_InitFunc)( FT_Memory memory,
+ PS_Unicodes unicodes,
+ FT_UInt num_glyphs,
+ PS_GetGlyphNameFunc get_glyph_name,
+ PS_FreeGlyphNameFunc free_glyph_name,
+ FT_Pointer glyph_data );
+
+ typedef FT_UInt
+ (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes,
+ FT_UInt32 unicode );
+
+ typedef FT_UInt32
+ (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes,
+ FT_UInt32 *unicode );
+
+
+ FT_DEFINE_SERVICE( PsCMaps )
+ {
+ PS_Unicode_ValueFunc unicode_value;
+
+ PS_Unicodes_InitFunc unicodes_init;
+ PS_Unicodes_CharIndexFunc unicodes_char_index;
+ PS_Unicodes_CharNextFunc unicodes_char_next;
+
+ PS_Macintosh_NameFunc macintosh_name;
+ PS_Adobe_Std_StringsFunc adobe_std_strings;
+ const unsigned short* adobe_std_encoding;
+ const unsigned short* adobe_expert_encoding;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ static const FT_Service_PsCMapsRec class_ = \
+ { \
+ unicode_value_, unicodes_init_, \
+ unicodes_char_index_, unicodes_char_next_, macintosh_name_, \
+ adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->unicode_value = unicode_value_; \
+ clazz->unicodes_init = unicodes_init_; \
+ clazz->unicodes_char_index = unicodes_char_index_; \
+ clazz->unicodes_char_next = unicodes_char_next_; \
+ clazz->macintosh_name = macintosh_name_; \
+ clazz->adobe_std_strings = adobe_std_strings_; \
+ clazz->adobe_std_encoding = adobe_std_encoding_; \
+ clazz->adobe_expert_encoding = adobe_expert_encoding_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
new file mode 100644
index 0000000000..fa3b30317a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/* */
+/* svpsinfo.h */
+/* */
+/* The FreeType PostScript info service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2011, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include "../ftserv.h"
+#include "../t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info"
+
+
+ typedef FT_Error
+ (*PS_GetFontInfoFunc)( FT_Face face,
+ PS_FontInfoRec* afont_info );
+
+ typedef FT_Error
+ (*PS_GetFontExtraFunc)( FT_Face face,
+ PS_FontExtraRec* afont_extra );
+
+ typedef FT_Int
+ (*PS_HasGlyphNamesFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*PS_GetFontPrivateFunc)( FT_Face face,
+ PS_PrivateRec* afont_private );
+
+ typedef FT_Long
+ (*PS_GetFontValueFunc)( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+
+ FT_DEFINE_SERVICE( PsInfo )
+ {
+ PS_GetFontInfoFunc ps_get_font_info;
+ PS_GetFontExtraFunc ps_get_font_extra;
+ PS_HasGlyphNamesFunc ps_has_glyph_names;
+ PS_GetFontPrivateFunc ps_get_font_private;
+ PS_GetFontValueFunc ps_get_font_value;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ static const FT_Service_PsInfoRec class_ = \
+ { \
+ get_font_info_, ps_get_font_extra_, has_glyph_names_, \
+ get_font_private_, get_font_value_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsInfoRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->ps_get_font_info = get_font_info_; \
+ clazz->ps_get_font_extra = ps_get_font_extra_; \
+ clazz->ps_has_glyph_names = has_glyph_names_; \
+ clazz->ps_get_font_private = get_font_private_; \
+ clazz->ps_get_font_value = get_font_value_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
new file mode 100644
index 0000000000..3425042910
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/* */
+/* svsfnt.h */
+/* */
+/* The FreeType SFNT table loading service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table"
+
+
+ /*
+ * Used to implement FT_Load_Sfnt_Table().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableLoadFunc)( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+ /*
+ * Used to implement FT_Get_Sfnt_Table().
+ */
+ typedef void*
+ (*FT_SFNT_TableGetFunc)( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /*
+ * Used to implement FT_Sfnt_Table_Info().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableInfoFunc)( FT_Face face,
+ FT_UInt idx,
+ FT_ULong *tag,
+ FT_ULong *offset,
+ FT_ULong *length );
+
+
+ FT_DEFINE_SERVICE( SFNT_Table )
+ {
+ FT_SFNT_TableLoadFunc load_table;
+ FT_SFNT_TableGetFunc get_table;
+ FT_SFNT_TableInfoFunc table_info;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ static const FT_Service_SFNT_TableRec class_ = \
+ { \
+ load_, get_, info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec* clazz ) \
+ { \
+ clazz->load_table = load_; \
+ clazz->get_table = get_; \
+ clazz->table_info = info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
new file mode 100644
index 0000000000..02542ab83f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/* */
+/* svttcmap.h */
+/* */
+/* The FreeType TrueType/sfnt cmap extra information service. */
+/* */
+/* Copyright 2003 by */
+/* Masatake YAMATO, Redhat K.K. */
+/* */
+/* Copyright 2003, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/* Development of this service is support of
+ Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP "tt-cmaps"
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_CMapInfo */
+ /* */
+ /* <Description> */
+ /* A structure used to store TrueType/sfnt specific cmap information */
+ /* which is not covered by the generic @FT_CharMap structure. This */
+ /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */
+ /* */
+ /* <Fields> */
+ /* language :: */
+ /* The language ID used in Mac fonts. Definitions of values are in */
+ /* freetype/ttnameid.h. */
+ /* */
+ /* format :: */
+ /* The cmap format. OpenType 1.5 defines the formats 0 (byte */
+ /* encoding table), 2~(high-byte mapping through table), 4~(segment */
+ /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */
+ /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */
+ /* coverage), and 14 (Unicode Variation Sequences). */
+ /* */
+ typedef struct TT_CMapInfo_
+ {
+ FT_ULong language;
+ FT_Long format;
+
+ } TT_CMapInfo;
+
+
+ typedef FT_Error
+ (*TT_CMap_Info_GetFunc)( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info );
+
+
+ FT_DEFINE_SERVICE( TTCMaps )
+ {
+ TT_CMap_Info_GetFunc get_cmap_info;
+ };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ static const FT_Service_TTCMapsRec class_ = \
+ { \
+ get_cmap_info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_TTCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_cmap_info = get_cmap_info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
new file mode 100644
index 0000000000..e567efbee5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* svtteng.h */
+/* */
+/* The FreeType TrueType engine query service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include "../ftserv.h"
+#include "../../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine"
+
+ /*
+ * Used to implement FT_Get_TrueType_Engine_Type
+ */
+
+ FT_DEFINE_SERVICE( TrueTypeEngine )
+ {
+ FT_TrueTypeEngineType engine_type;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
new file mode 100644
index 0000000000..d8824fb25b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/* */
+/* svttglyf.h */
+/* */
+/* The FreeType TrueType glyph service. */
+/* */
+/* Copyright 2007, 2009, 2012 by David Turner. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF "tt-glyf"
+
+
+ typedef FT_ULong
+ (*TT_Glyf_GetLocationFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_ULong *psize );
+
+ FT_DEFINE_SERVICE( TTGlyf )
+ {
+ TT_Glyf_GetLocationFunc get_location;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ static const FT_Service_TTGlyfRec class_ = \
+ { \
+ get_location_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_TTGlyfRec* clazz ) \
+ { \
+ clazz->get_location = get_location_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
new file mode 100644
index 0000000000..013a991683
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/* */
+/* svwinfnt.h */
+/* */
+/* The FreeType Windows FNT/FONT service (specification). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include "../ftserv.h"
+#include "../../ftwinfnt.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT "winfonts"
+
+ typedef FT_Error
+ (*FT_WinFnt_GetHeaderFunc)( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ FT_DEFINE_SERVICE( WinFnt )
+ {
+ FT_WinFnt_GetHeaderFunc get_header;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
new file mode 100644
index 0000000000..571f63d917
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svxf86nm.h */
+/* */
+/* The FreeType XFree86 services (specification only). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A trivial service used to return the name of a face's font driver,
+ * according to the XFree86 nomenclature. Note that the service data
+ * is a simple constant string pointer.
+ */
+
+#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE "TrueType"
+#define FT_XF86_FORMAT_TYPE_1 "Type 1"
+#define FT_XF86_FORMAT_BDF "BDF"
+#define FT_XF86_FORMAT_PCF "PCF"
+#define FT_XF86_FORMAT_TYPE_42 "Type 42"
+#define FT_XF86_FORMAT_CID "CID Type 1"
+#define FT_XF86_FORMAT_CFF "CFF"
+#define FT_XF86_FORMAT_PFR "PFR"
+#define FT_XF86_FORMAT_WINFNT "Windows FNT"
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
new file mode 100644
index 0000000000..2759ba3a96
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
@@ -0,0 +1,707 @@
+/***************************************************************************/
+/* */
+/* sfnt.h */
+/* */
+/* High-level `sfnt' driver interface (specification). */
+/* */
+/* Copyright 1996-2006, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include "../../ft2build.h"
+#include "ftdriver.h"
+#include "tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Init_Face_Func */
+ /* */
+ /* <Description> */
+ /* First part of the SFNT face object initialization. This finds */
+ /* the face in a SFNT file or collection, and load its format tag in */
+ /* face->format_tag. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ /* This function recognizes fonts embedded in a `TrueType */
+ /* collection'. */
+ /* */
+ /* Once the format tag has been validated by the font driver, it */
+ /* should then call the TT_Load_Face_Func() callback to read the rest */
+ /* of the SFNT tables in the object. */
+ /* */
+ typedef FT_Error
+ (*TT_Init_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Face_Func */
+ /* */
+ /* <Description> */
+ /* Second part of the SFNT face object initialization. This loads */
+ /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */
+ /* face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function must be called after TT_Init_Face_Func(). */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Done_Face_Func */
+ /* */
+ /* <Description> */
+ /* A callback used to delete the common SFNT data from a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Note> */
+ /* This function does NOT destroy the face object. */
+ /* */
+ typedef void
+ (*TT_Done_Face_Func)( TT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Any_Func */
+ /* */
+ /* <Description> */
+ /* Load any font table into client memory. */
+ /* */
+ /* <Input> */
+ /* face :: The face object to look for. */
+ /* */
+ /* tag :: The tag of table to load. Use the value 0 if you want */
+ /* to access the whole font file, else set this parameter */
+ /* to a valid TrueType table tag that you can forge with */
+ /* the MAKE_TT_TAG macro. */
+ /* */
+ /* offset :: The starting offset in the table (or the file if */
+ /* tag == 0). */
+ /* */
+ /* length :: The address of the decision variable: */
+ /* */
+ /* If length == NULL: */
+ /* Loads the whole table. Returns an error if */
+ /* `offset' == 0! */
+ /* */
+ /* If *length == 0: */
+ /* Exits immediately; returning the length of the given */
+ /* table or of the font file, depending on the value of */
+ /* `tag'. */
+ /* */
+ /* If *length != 0: */
+ /* Loads the next `length' bytes of table or font, */
+ /* starting at offset `offset' (in table or font too). */
+ /* */
+ /* <Output> */
+ /* buffer :: The address of target buffer. */
+ /* */
+ /* <Return> */
+ /* TrueType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Any_Func)( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte *buffer,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Find_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Check whether an embedded bitmap (an `sbit') exists for a given */
+ /* glyph, at a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* strike_index :: The current strike index. */
+ /* */
+ /* <Output> */
+ /* arange :: The SBit range containing the glyph index. */
+ /* */
+ /* astrike :: The SBit strike containing the glyph index. */
+ /* */
+ /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns */
+ /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */
+ /* glyph. */
+ /* */
+ typedef FT_Error
+ (*TT_Find_SBit_Image_Func)( TT_Face face,
+ FT_UInt glyph_index,
+ FT_ULong strike_index,
+ TT_SBit_Range *arange,
+ TT_SBit_Strike *astrike,
+ FT_ULong *aglyph_offset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Get the big metrics for a given embedded bitmap. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* range :: The SBit range containing the glyph. */
+ /* */
+ /* <Output> */
+ /* big_metrics :: A big SBit metrics structure for the glyph. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be positioned at the glyph's offset within */
+ /* the `EBDT' table before the call. */
+ /* */
+ /* If the image format uses variable metrics, the stream cursor is */
+ /* positioned just after the metrics header in the `EBDT' table on */
+ /* function exit. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Metrics_Func)( FT_Stream stream,
+ TT_SBit_Range range,
+ TT_SBit_Metrics metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Load a given glyph sbit image from the font resource. This also */
+ /* returns its metrics. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* The target face object. */
+ /* */
+ /* strike_index :: */
+ /* The strike index. */
+ /* */
+ /* glyph_index :: */
+ /* The current glyph index. */
+ /* */
+ /* load_flags :: */
+ /* The current load flags. */
+ /* */
+ /* stream :: */
+ /* The input stream. */
+ /* */
+ /* <Output> */
+ /* amap :: */
+ /* The target pixmap. */
+ /* */
+ /* ametrics :: */
+ /* A big sbit metrics structure for the glyph image. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* glyph sbit exists for the index. */
+ /* */
+ /* <Note> */
+ /* The `map.buffer' field is always freed before the glyph is loaded. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Image_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *amap,
+ TT_SBit_MetricsRec *ametrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Set_SBit_Strike_Func */
+ /* */
+ /* <Description> */
+ /* Select an sbit strike for a given size request. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* req :: The size request. */
+ /* */
+ /* <Output> */
+ /* astrike_index :: The index of the sbit strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* sbit strike exists for the selected ppem values. */
+ /* */
+ typedef FT_Error
+ (*TT_Set_SBit_Strike_Func)( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Strike_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the metrics of a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* strike_index :: The strike index. */
+ /* */
+ /* <Output> */
+ /* metrics :: the metrics of the strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* such sbit strike exists. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Strike_Metrics_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_PS_Name_Func */
+ /* */
+ /* <Description> */
+ /* Get the PostScript glyph name of a glyph. */
+ /* */
+ /* <Input> */
+ /* idx :: The glyph index. */
+ /* */
+ /* PSname :: The address of a string pointer. Will be NULL in case */
+ /* of error, otherwise it is a pointer to the glyph name. */
+ /* */
+ /* You must not modify the returned string! */
+ /* */
+ /* <Output> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_PS_Name_Func)( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load a metrics table, which is a table with a horizontal and a */
+ /* vertical version. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load the vertical one. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Metrics_Func)( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the horizontal or vertical header in a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load vertical metrics. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_Metrics_Func)( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short* abearing,
+ FT_UShort* aadvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Table_Func */
+ /* */
+ /* <Description> */
+ /* Load a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The function uses `face->goto_table' to seek the stream to the */
+ /* start of the table, except while loading the font directory. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Table_Func)( TT_Face face,
+ FT_Stream stream );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Free_Table_Func */
+ /* */
+ /* <Description> */
+ /* Free a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ typedef void
+ (*TT_Free_Table_Func)( TT_Face face );
+
+
+ /*
+ * @functype:
+ * TT_Face_GetKerningFunc
+ *
+ * @description:
+ * Return the horizontal kerning value between two glyphs.
+ *
+ * @input:
+ * face :: A handle to the source face object.
+ * left_glyph :: The left glyph index.
+ * right_glyph :: The right glyph index.
+ *
+ * @return:
+ * The kerning value in font units.
+ */
+ typedef FT_Int
+ (*TT_Face_GetKerningFunc)( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_Interface */
+ /* */
+ /* <Description> */
+ /* This structure holds pointers to the functions used to load and */
+ /* free the basic tables that are required in a `sfnt' font file. */
+ /* */
+ /* <Fields> */
+ /* Check the various xxx_Func() descriptions for details. */
+ /* */
+ typedef struct SFNT_Interface_
+ {
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Init_Face_Func init_face;
+ TT_Load_Face_Func load_face;
+ TT_Done_Face_Func done_face;
+ FT_Module_Requester get_interface;
+
+ TT_Load_Any_Func load_any;
+
+ /* these functions are called by `load_face' but they can also */
+ /* be called from external modules, if there is a need to do so */
+ TT_Load_Table_Func load_head;
+ TT_Load_Metrics_Func load_hhea;
+ TT_Load_Table_Func load_cmap;
+ TT_Load_Table_Func load_maxp;
+ TT_Load_Table_Func load_os2;
+ TT_Load_Table_Func load_post;
+
+ TT_Load_Table_Func load_name;
+ TT_Free_Table_Func free_name;
+
+ /* this field was called `load_kerning' up to version 2.1.10 */
+ TT_Load_Table_Func load_kern;
+
+ TT_Load_Table_Func load_gasp;
+ TT_Load_Table_Func load_pclt;
+
+ /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+ /* version 2.1.10 */
+ TT_Load_Table_Func load_bhed;
+
+ TT_Load_SBit_Image_Func load_sbit_image;
+
+ /* see `ttpost.h' */
+ TT_Get_PS_Name_Func get_psname;
+ TT_Free_Table_Func free_psnames;
+
+ /* starting here, the structure differs from version 2.1.7 */
+
+ /* this field was introduced in version 2.1.8, named `get_psname' */
+ TT_Face_GetKerningFunc get_kerning;
+
+ /* new elements introduced after version 2.1.10 */
+
+ /* load the font directory, i.e., the offset table and */
+ /* the table directory */
+ TT_Load_Table_Func load_font_dir;
+ TT_Load_Metrics_Func load_hmtx;
+
+ TT_Load_Table_Func load_eblc;
+ TT_Free_Table_Func free_eblc;
+
+ TT_Set_SBit_Strike_Func set_sbit_strike;
+ TT_Load_Strike_Metrics_Func load_strike_metrics;
+
+ TT_Get_Metrics_Func get_metrics;
+
+ } SFNT_Interface;
+
+
+ /* transitional */
+ typedef SFNT_Interface* SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ static const SFNT_Interface class_ = \
+ { \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_, \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_INTERNAL( a, a_ ) \
+ clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ SFNT_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->goto_table = goto_table_; \
+ clazz->init_face = init_face_; \
+ clazz->load_face = load_face_; \
+ clazz->done_face = done_face_; \
+ clazz->get_interface = get_interface_; \
+ clazz->load_any = load_any_; \
+ clazz->load_head = load_head_; \
+ clazz->load_hhea = load_hhea_; \
+ clazz->load_cmap = load_cmap_; \
+ clazz->load_maxp = load_maxp_; \
+ clazz->load_os2 = load_os2_; \
+ clazz->load_post = load_post_; \
+ clazz->load_name = load_name_; \
+ clazz->free_name = free_name_; \
+ clazz->load_kern = load_kern_; \
+ clazz->load_gasp = load_gasp_; \
+ clazz->load_pclt = load_pclt_; \
+ clazz->load_bhed = load_bhed_; \
+ clazz->load_sbit_image = load_sbit_image_; \
+ clazz->get_psname = get_psname_; \
+ clazz->free_psnames = free_psnames_; \
+ clazz->get_kerning = get_kerning_; \
+ clazz->load_font_dir = load_font_dir_; \
+ clazz->load_hmtx = load_hmtx_; \
+ clazz->load_eblc = load_eblc_; \
+ clazz->free_eblc = free_eblc_; \
+ clazz->set_sbit_strike = set_sbit_strike_; \
+ clazz->load_strike_metrics = load_strike_metrics_; \
+ clazz->get_metrics = get_metrics_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
new file mode 100644
index 0000000000..36deec80d0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* t1types.h */
+/* */
+/* Basic Type1/Type2 type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../t1tables.h"
+#include "pshints.h"
+#include "ftserv.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_EncodingRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling a custom encoding. */
+ /* */
+ /* <Fields> */
+ /* num_chars :: The number of character codes in the encoding. */
+ /* Usually 256. */
+ /* */
+ /* code_first :: The lowest valid character code in the encoding. */
+ /* */
+ /* code_last :: The highest valid character code in the encoding */
+ /* + 1. When equal to code_first there are no valid */
+ /* character codes. */
+ /* */
+ /* char_index :: An array of corresponding glyph indices. */
+ /* */
+ /* char_name :: An array of corresponding glyph names. */
+ /* */
+ typedef struct T1_EncodingRecRec_
+ {
+ FT_Int num_chars;
+ FT_Int code_first;
+ FT_Int code_last;
+
+ FT_UShort* char_index;
+ FT_String** char_name;
+
+ } T1_EncodingRec, *T1_Encoding;
+
+
+ /* used to hold extra data of PS_FontInfoRec that
+ * cannot be stored in the publicly defined structure.
+ *
+ * Note these can't be blended with multiple-masters.
+ */
+ typedef struct PS_FontExtraRec_
+ {
+ FT_UShort fs_type;
+
+ } PS_FontExtraRec;
+
+
+ typedef struct T1_FontRec_
+ {
+ PS_FontInfoRec font_info; /* font info dictionary */
+ PS_FontExtraRec font_extra; /* font info extra fields */
+ PS_PrivateRec private_dict; /* private dictionary */
+ FT_String* font_name; /* top-level dictionary */
+
+ T1_EncodingType encoding_type;
+ T1_EncodingRec encoding;
+
+ FT_Byte* subrs_block;
+ FT_Byte* charstrings_block;
+ FT_Byte* glyph_names_block;
+
+ FT_Int num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len;
+
+ FT_Int num_glyphs;
+ FT_String** glyph_names; /* array of glyph names */
+ FT_Byte** charstrings; /* array of glyph charstrings */
+ FT_PtrDist* charstrings_len;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+ FT_BBox font_bbox;
+ FT_Long font_id;
+
+ FT_Fixed stroke_width;
+
+ } T1_FontRec, *T1_Font;
+
+
+ typedef struct CID_SubrsRec_
+ {
+ FT_UInt num_subrs;
+ FT_Byte** code;
+
+ } CID_SubrsRec, *CID_Subrs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** AFM FONT INFORMATION STRUCTURES ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_TrackKernRec_
+ {
+ FT_Int degree;
+ FT_Fixed min_ptsize;
+ FT_Fixed min_kern;
+ FT_Fixed max_ptsize;
+ FT_Fixed max_kern;
+
+ } AFM_TrackKernRec, *AFM_TrackKern;
+
+ typedef struct AFM_KernPairRec_
+ {
+ FT_Int index1;
+ FT_Int index2;
+ FT_Int x;
+ FT_Int y;
+
+ } AFM_KernPairRec, *AFM_KernPair;
+
+ typedef struct AFM_FontInfoRec_
+ {
+ FT_Bool IsCIDFont;
+ FT_BBox FontBBox;
+ FT_Fixed Ascender;
+ FT_Fixed Descender;
+ AFM_TrackKern TrackKerns; /* free if non-NULL */
+ FT_Int NumTrackKern;
+ AFM_KernPair KernPairs; /* free if non-NULL */
+ FT_Int NumKernPair;
+
+ } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL T1_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_FaceRec_* T1_Face;
+ typedef struct CID_FaceRec_* CID_Face;
+
+
+ typedef struct T1_FaceRec_
+ {
+ FT_FaceRec root;
+ T1_FontRec type1;
+ const void* psnames;
+ const void* psaux;
+ const void* afm_data;
+ FT_CharMapRec charmaprecs[2];
+ FT_CharMap charmaps[2];
+
+ /* support for Multiple Masters fonts */
+ PS_Blend blend;
+
+ /* undocumented, optional: indices of subroutines that express */
+ /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+ /* respectively, as Type 2 charstrings; -1 if keywords not present */
+ FT_Int ndv_idx;
+ FT_Int cdv_idx;
+
+ /* undocumented, optional: has the same meaning as len_buildchar */
+ /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */
+ FT_UInt len_buildchar;
+ FT_Long* buildchar;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ const void* pshinter;
+
+ } T1_FaceRec;
+
+
+ typedef struct CID_FaceRec_
+ {
+ FT_FaceRec root;
+ void* psnames;
+ void* psaux;
+ CID_FaceInfoRec cid;
+ PS_FontExtraRec font_extra;
+#if 0
+ void* afm_data;
+#endif
+ CID_Subrs subrs;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ void* pshinter;
+
+ /* since version 2.1.8, but was originally positioned after `afm_data' */
+ FT_Byte* binary_data; /* used if hex data has been converted */
+ FT_Stream cid_stream;
+
+ } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
new file mode 100644
index 0000000000..d6c1d62852
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
@@ -0,0 +1,1440 @@
+/***************************************************************************/
+/* */
+/* tttypes.h */
+/* */
+/* Basic SFNT/TrueType type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2002, 2004-2008, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../tttables.h"
+#include "ftobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../ftmm.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TTC_HeaderRec */
+ /* */
+ /* <Description> */
+ /* TrueType collection header. This table contains the offsets of */
+ /* the font headers of each distinct TrueType face in the file. */
+ /* */
+ /* <Fields> */
+ /* tag :: Must be `ttc ' to indicate a TrueType collection. */
+ /* */
+ /* version :: The version number. */
+ /* */
+ /* count :: The number of faces in the collection. The */
+ /* specification says this should be an unsigned long, but */
+ /* we use a signed long since we need the value -1 for */
+ /* specific purposes. */
+ /* */
+ /* offsets :: The offsets of the font headers, one per face. */
+ /* */
+ typedef struct TTC_HeaderRec_
+ {
+ FT_ULong tag;
+ FT_Fixed version;
+ FT_Long count;
+ FT_ULong* offsets;
+
+ } TTC_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* SFNT file format header. */
+ /* */
+ /* <Fields> */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of tables in file. */
+ /* */
+ /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */
+ /* */
+ /* entry_selector :: Must be log2 of `search_range / 16'. */
+ /* */
+ /* range_shift :: Must be `num_tables * 16 - search_range'. */
+ /* */
+ typedef struct SFNT_HeaderRec_
+ {
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ FT_UShort search_range;
+ FT_UShort entry_selector;
+ FT_UShort range_shift;
+
+ FT_ULong offset; /* not in file */
+
+ } SFNT_HeaderRec, *SFNT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_TableRec */
+ /* */
+ /* <Description> */
+ /* This structure describes a given table of a TrueType font. */
+ /* */
+ /* <Fields> */
+ /* Tag :: A four-bytes tag describing the table. */
+ /* */
+ /* CheckSum :: The table checksum. This value can be ignored. */
+ /* */
+ /* Offset :: The offset of the table from the start of the TrueType */
+ /* font in its resource. */
+ /* */
+ /* Length :: The table length (in bytes). */
+ /* */
+ typedef struct TT_TableRec_
+ {
+ FT_ULong Tag; /* table type */
+ FT_ULong CheckSum; /* table checksum */
+ FT_ULong Offset; /* table file offset */
+ FT_ULong Length; /* table length */
+
+ } TT_TableRec, *TT_Table;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_LongMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the long metrics of the `hmtx' and `vmtx' */
+ /* TrueType tables. The values are expressed in font units. */
+ /* */
+ /* <Fields> */
+ /* advance :: The advance width or height for the glyph. */
+ /* */
+ /* bearing :: The left-side or top-side bearing for the glyph. */
+ /* */
+ typedef struct TT_LongMetricsRec_
+ {
+ FT_UShort advance;
+ FT_Short bearing;
+
+ } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_ShortMetrics */
+ /* */
+ /* <Description> */
+ /* A simple type to model the short metrics of the `hmtx' and `vmtx' */
+ /* tables. */
+ /* */
+ typedef FT_Short TT_ShortMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameEntryRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling TrueType name records. Name records are used */
+ /* to store important strings like family name, style name, */
+ /* copyright, etc. in _localized_ versions (i.e., language, encoding, */
+ /* etc). */
+ /* */
+ /* <Fields> */
+ /* platformID :: The ID of the name's encoding platform. */
+ /* */
+ /* encodingID :: The platform-specific ID for the name's encoding. */
+ /* */
+ /* languageID :: The platform-specific ID for the name's language. */
+ /* */
+ /* nameID :: The ID specifying what kind of name this is. */
+ /* */
+ /* stringLength :: The length of the string in bytes. */
+ /* */
+ /* stringOffset :: The offset to the string in the `name' table. */
+ /* */
+ /* string :: A pointer to the string's bytes. Note that these */
+ /* are usually UTF-16 encoded characters. */
+ /* */
+ typedef struct TT_NameEntryRec_
+ {
+ FT_UShort platformID;
+ FT_UShort encodingID;
+ FT_UShort languageID;
+ FT_UShort nameID;
+ FT_UShort stringLength;
+ FT_ULong stringOffset;
+
+ /* this last field is not defined in the spec */
+ /* but used by the FreeType engine */
+
+ FT_Byte* string;
+
+ } TT_NameEntryRec, *TT_NameEntry;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameTableRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType name table. */
+ /* */
+ /* <Fields> */
+ /* format :: The format of the name table. */
+ /* */
+ /* numNameRecords :: The number of names in table. */
+ /* */
+ /* storageOffset :: The offset of the name table in the `name' */
+ /* TrueType table. */
+ /* */
+ /* names :: An array of name records. */
+ /* */
+ /* stream :: the file's input stream. */
+ /* */
+ typedef struct TT_NameTableRec_
+ {
+ FT_UShort format;
+ FT_UInt numNameRecords;
+ FT_UInt storageOffset;
+ TT_NameEntryRec* names;
+ FT_Stream stream;
+
+ } TT_NameTableRec, *TT_NameTable;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRangeRec */
+ /* */
+ /* <Description> */
+ /* A tiny structure used to model a gasp range according to the */
+ /* TrueType specification. */
+ /* */
+ /* <Fields> */
+ /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */
+ /* */
+ /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */
+ /* modes to be used. */
+ /* */
+ typedef struct TT_GaspRangeRec_
+ {
+ FT_UShort maxPPEM;
+ FT_UShort gaspFlag;
+
+ } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT 0x01
+#define TT_GASP_DOGRAY 0x02
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType `gasp' table used to specify */
+ /* grid-fitting and anti-aliasing behaviour. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numRanges :: The number of gasp ranges in table. */
+ /* */
+ /* gaspRanges :: An array of gasp ranges. */
+ /* */
+ typedef struct TT_Gasp_
+ {
+ FT_UShort version;
+ FT_UShort numRanges;
+ TT_GaspRange gaspRanges;
+
+ } TT_GaspRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BITMAPS SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_MetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the big metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or `bloc' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* horiBearingX :: The horizontal left bearing. */
+ /* */
+ /* horiBearingY :: The horizontal top bearing. */
+ /* */
+ /* horiAdvance :: The horizontal advance. */
+ /* */
+ /* vertBearingX :: The vertical left bearing. */
+ /* */
+ /* vertBearingY :: The vertical top bearing. */
+ /* */
+ /* vertAdvance :: The vertical advance. */
+ /* */
+ typedef struct TT_SBit_MetricsRec_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char horiBearingX;
+ FT_Char horiBearingY;
+ FT_Byte horiAdvance;
+
+ FT_Char vertBearingX;
+ FT_Char vertBearingY;
+ FT_Byte vertAdvance;
+
+ } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_SmallMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the small metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* bearingX :: The left-side bearing. */
+ /* */
+ /* bearingY :: The top-side bearing. */
+ /* */
+ /* advance :: The advance width or height. */
+ /* */
+ typedef struct TT_SBit_Small_Metrics_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char bearingX;
+ FT_Char bearingY;
+ FT_Byte advance;
+
+ } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_LineMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe the text line metrics of a given */
+ /* bitmap strike, for either a horizontal or vertical layout. */
+ /* */
+ /* <Fields> */
+ /* ascender :: The ascender in pixels. */
+ /* */
+ /* descender :: The descender in pixels. */
+ /* */
+ /* max_width :: The maximum glyph width in pixels. */
+ /* */
+ /* caret_slope_enumerator :: Rise of the caret slope, typically set */
+ /* to 1 for non-italic fonts. */
+ /* */
+ /* caret_slope_denominator :: Rise of the caret slope, typically set */
+ /* to 0 for non-italic fonts. */
+ /* */
+ /* caret_offset :: Offset in pixels to move the caret for */
+ /* proper positioning. */
+ /* */
+ /* min_origin_SB :: Minimum of horiBearingX (resp. */
+ /* vertBearingY). */
+ /* min_advance_SB :: Minimum of */
+ /* */
+ /* horizontal advance - */
+ /* ( horiBearingX + width ) */
+ /* */
+ /* resp. */
+ /* */
+ /* vertical advance - */
+ /* ( vertBearingY + height ) */
+ /* */
+ /* max_before_BL :: Maximum of horiBearingY (resp. */
+ /* vertBearingY). */
+ /* */
+ /* min_after_BL :: Minimum of */
+ /* */
+ /* horiBearingY - height */
+ /* */
+ /* resp. */
+ /* */
+ /* vertBearingX - width */
+ /* */
+ /* pads :: Unused (to make the size of the record */
+ /* a multiple of 32 bits. */
+ /* */
+ typedef struct TT_SBit_LineMetricsRec_
+ {
+ FT_Char ascender;
+ FT_Char descender;
+ FT_Byte max_width;
+ FT_Char caret_slope_numerator;
+ FT_Char caret_slope_denominator;
+ FT_Char caret_offset;
+ FT_Char min_origin_SB;
+ FT_Char min_advance_SB;
+ FT_Char max_before_BL;
+ FT_Char min_after_BL;
+ FT_Char pads[2];
+
+ } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_RangeRec */
+ /* */
+ /* <Description> */
+ /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* first_glyph :: The first glyph index in the range. */
+ /* */
+ /* last_glyph :: The last glyph index in the range. */
+ /* */
+ /* index_format :: The format of index table. Valid values are 1 */
+ /* to 5. */
+ /* */
+ /* image_format :: The format of `EBDT' image data. */
+ /* */
+ /* image_offset :: The offset to image data in `EBDT'. */
+ /* */
+ /* image_size :: For index formats 2 and 5. This is the size in */
+ /* bytes of each glyph bitmap. */
+ /* */
+ /* big_metrics :: For index formats 2 and 5. This is the big */
+ /* metrics for each glyph bitmap. */
+ /* */
+ /* num_glyphs :: For index formats 4 and 5. This is the number of */
+ /* glyphs in the code array. */
+ /* */
+ /* glyph_offsets :: For index formats 1 and 3. */
+ /* */
+ /* glyph_codes :: For index formats 4 and 5. */
+ /* */
+ /* table_offset :: The offset of the index table in the `EBLC' */
+ /* table. Only used during strike loading. */
+ /* */
+ typedef struct TT_SBit_RangeRec_
+ {
+ FT_UShort first_glyph;
+ FT_UShort last_glyph;
+
+ FT_UShort index_format;
+ FT_UShort image_format;
+ FT_ULong image_offset;
+
+ FT_ULong image_size;
+ TT_SBit_MetricsRec metrics;
+ FT_ULong num_glyphs;
+
+ FT_ULong* glyph_offsets;
+ FT_UShort* glyph_codes;
+
+ FT_ULong table_offset;
+
+ } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_StrikeRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap strike in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* num_index_ranges :: The number of index ranges. */
+ /* */
+ /* index_ranges :: An array of glyph index ranges. */
+ /* */
+ /* color_ref :: Unused. `color_ref' is put in for future */
+ /* enhancements, but these fields are already */
+ /* in use by other platforms (e.g. Newton). */
+ /* For details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ /* hori :: The line metrics for horizontal layouts. */
+ /* */
+ /* vert :: The line metrics for vertical layouts. */
+ /* */
+ /* start_glyph :: The lowest glyph index for this strike. */
+ /* */
+ /* end_glyph :: The highest glyph index for this strike. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */
+ /* and 8. */
+ /* */
+ /* flags :: Is this a vertical or horizontal strike? For */
+ /* details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ typedef struct TT_SBit_StrikeRec_
+ {
+ FT_Int num_ranges;
+ TT_SBit_Range sbit_ranges;
+ FT_ULong ranges_offset;
+
+ FT_ULong color_ref;
+
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_UShort start_glyph;
+ FT_UShort end_glyph;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte bit_depth;
+ FT_Char flags;
+
+ } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ComponentRec */
+ /* */
+ /* <Description> */
+ /* A simple structure to describe a compound sbit element. */
+ /* */
+ /* <Fields> */
+ /* glyph_code :: The element's glyph index. */
+ /* */
+ /* x_offset :: The element's left bearing. */
+ /* */
+ /* y_offset :: The element's top bearing. */
+ /* */
+ typedef struct TT_SBit_ComponentRec_
+ {
+ FT_UShort glyph_code;
+ FT_Char x_offset;
+ FT_Char y_offset;
+
+ } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ScaleRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap scaling table, as defined */
+ /* in the `EBSC' table. */
+ /* */
+ /* <Fields> */
+ /* hori :: The horizontal line metrics. */
+ /* */
+ /* vert :: The vertical line metrics. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* x_ppem_substitute :: Substitution x_ppem value. */
+ /* */
+ /* y_ppem_substitute :: Substitution y_ppem value. */
+ /* */
+ typedef struct TT_SBit_ScaleRec_
+ {
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte x_ppem_substitute;
+ FT_Byte y_ppem_substitute;
+
+ } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_20Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.0. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of named glyphs in the table. */
+ /* */
+ /* num_names :: The number of PS names stored in the table. */
+ /* */
+ /* glyph_indices :: The indices of the glyphs in the names arrays. */
+ /* */
+ /* glyph_names :: The PS names not in Mac Encoding. */
+ /* */
+ typedef struct TT_Post_20Rec_
+ {
+ FT_UShort num_glyphs;
+ FT_UShort num_names;
+ FT_UShort* glyph_indices;
+ FT_Char** glyph_names;
+
+ } TT_Post_20Rec, *TT_Post_20;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_25Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.5. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of glyphs in the table. */
+ /* */
+ /* offsets :: An array of signed offsets in a normal Mac */
+ /* Postscript name encoding. */
+ /* */
+ typedef struct TT_Post_25_
+ {
+ FT_UShort num_glyphs;
+ FT_Char* offsets;
+
+ } TT_Post_25Rec, *TT_Post_25;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_NamesRec */
+ /* */
+ /* <Description> */
+ /* Postscript names table, either format 2.0 or 2.5. */
+ /* */
+ /* <Fields> */
+ /* loaded :: A flag to indicate whether the PS names are loaded. */
+ /* */
+ /* format_20 :: The sub-table used for format 2.0. */
+ /* */
+ /* format_25 :: The sub-table used for format 2.5. */
+ /* */
+ typedef struct TT_Post_NamesRec_
+ {
+ FT_Bool loaded;
+
+ union
+ {
+ TT_Post_20Rec format_20;
+ TT_Post_25Rec format_25;
+
+ } names;
+
+ } TT_Post_NamesRec, *TT_Post_Names;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** GX VARIATION TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ typedef struct GX_BlendRec_ *GX_Blend;
+#endif
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * These types are used to support a `BDF ' table that isn't part of the
+ * official TrueType specification. It is mainly used in SFNT-based
+ * bitmap fonts that were generated from a set of BDF fonts.
+ *
+ * The format of the table is as follows.
+ *
+ * USHORT version `BDF ' table version number, should be 0x0001.
+ * USHORT strikeCount Number of strikes (bitmap sizes) in this table.
+ * ULONG stringTable Offset (from start of BDF table) to string
+ * table.
+ *
+ * This is followed by an array of `strikeCount' descriptors, having the
+ * following format.
+ *
+ * USHORT ppem Vertical pixels per EM for this strike.
+ * USHORT numItems Number of items for this strike (properties and
+ * atoms). Maximum is 255.
+ *
+ * This array in turn is followed by `strikeCount' value sets. Each
+ * `value set' is an array of `numItems' items with the following format.
+ *
+ * ULONG item_name Offset in string table to item name.
+ * USHORT item_type The item type. Possible values are
+ * 0 => string (e.g., COMMENT)
+ * 1 => atom (e.g., FONT or even SIZE)
+ * 2 => int32
+ * 3 => uint32
+ * 0x10 => A flag to indicate a properties. This
+ * is ORed with the above values.
+ * ULONG item_value For strings => Offset into string table without
+ * the corresponding double quotes.
+ * For atoms => Offset into string table.
+ * For integers => Direct value.
+ *
+ * All strings in the string table consist of bytes and are
+ * zero-terminated.
+ *
+ */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ typedef struct TT_BDFRec_
+ {
+ FT_Byte* table;
+ FT_Byte* table_end;
+ FT_Byte* strings;
+ FT_ULong strings_size;
+ FT_UInt num_strikes;
+ FT_Bool loaded;
+
+ } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL TT_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This structure/class is defined here because it is common to the */
+ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */
+ /* */
+ /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */
+ /* shared between font drivers, and are thus defined in `ttobjs.h'. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType face/font object. A TT_Face encapsulates */
+ /* the resolution and scaling independent parts of a TrueType font */
+ /* resource. */
+ /* */
+ /* <Note> */
+ /* The TT_Face structure is also used as a `parent class' for the */
+ /* OpenType-CFF class (T2_Face). */
+ /* */
+ typedef struct TT_FaceRec_* TT_Face;
+
+
+ /* a function type used for the truetype bytecode interpreter hooks */
+ typedef FT_Error
+ (*TT_Interpreter)( void* exec_context );
+
+ /* forward declaration */
+ typedef struct TT_LoaderRec_* TT_Loader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_GotoTableFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* tag :: A 4-byte tag used to name the table. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Output> */
+ /* length :: The length of the table in bytes. Set to 0 if not */
+ /* needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_GotoTableFunc)( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_StartGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given glyph element, and opens a */
+ /* frame for it. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* glyph index :: The index of the glyph to access. */
+ /* */
+ /* offset :: The offset of the glyph according to the */
+ /* `locations' table. */
+ /* */
+ /* byte_count :: The size of the frame in bytes. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function is normally equivalent to FT_STREAM_SEEK(offset) */
+ /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */
+ /* but alternative formats (e.g. compressed ones) might use something */
+ /* different. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_StartGlyphFunc)( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_ULong offset,
+ FT_UInt byte_count );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_ReadGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Reads one glyph element (its header, a simple glyph, or a */
+ /* composite) from the loader's current stream frame. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_ReadGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_EndGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Closes the current loader stream frame for the glyph. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ typedef void
+ (*TT_Loader_EndGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType Face Type */
+ /* */
+ /* <Struct> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* The TrueType face class. These objects model the resolution and */
+ /* point-size independent data found in a TrueType font file. */
+ /* */
+ /* <Fields> */
+ /* root :: The base FT_Face structure, managed by the */
+ /* base layer. */
+ /* */
+ /* ttc_header :: The TrueType collection header, used when */
+ /* the file is a `ttc' rather than a `ttf'. */
+ /* For ordinary font files, the field */
+ /* `ttc_header.count' is set to 0. */
+ /* */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of TrueType tables in this font */
+ /* file. */
+ /* */
+ /* dir_tables :: The directory of TrueType tables for this */
+ /* font file. */
+ /* */
+ /* header :: The font's font header (`head' table). */
+ /* Read on font opening. */
+ /* */
+ /* horizontal :: The font's horizontal header (`hhea' */
+ /* table). This field also contains the */
+ /* associated horizontal metrics table */
+ /* (`hmtx'). */
+ /* */
+ /* max_profile :: The font's maximum profile table. Read on */
+ /* font opening. Note that some maximum */
+ /* values cannot be taken directly from this */
+ /* table. We thus define additional fields */
+ /* below to hold the computed maxima. */
+ /* */
+ /* vertical_info :: A boolean which is set when the font file */
+ /* contains vertical metrics. If not, the */
+ /* value of the `vertical' field is */
+ /* undefined. */
+ /* */
+ /* vertical :: The font's vertical header (`vhea' table). */
+ /* This field also contains the associated */
+ /* vertical metrics table (`vmtx'), if found. */
+ /* IMPORTANT: The contents of this field is */
+ /* undefined if the `verticalInfo' field is */
+ /* unset. */
+ /* */
+ /* num_names :: The number of name records within this */
+ /* TrueType font. */
+ /* */
+ /* name_table :: The table of name records (`name'). */
+ /* */
+ /* os2 :: The font's OS/2 table (`OS/2'). */
+ /* */
+ /* postscript :: The font's PostScript table (`post' */
+ /* table). The PostScript glyph names are */
+ /* not loaded by the driver on face opening. */
+ /* See the `ttpost' module for more details. */
+ /* */
+ /* cmap_table :: Address of the face's `cmap' SFNT table */
+ /* in memory (it's an extracted frame). */
+ /* */
+ /* cmap_size :: The size in bytes of the `cmap_table' */
+ /* described above. */
+ /* */
+ /* goto_table :: A function called by each TrueType table */
+ /* loader to position a stream's cursor to */
+ /* the start of a given table according to */
+ /* its tag. It defaults to TT_Goto_Face but */
+ /* can be different for strange formats (e.g. */
+ /* Type 42). */
+ /* */
+ /* access_glyph_frame :: A function used to access the frame of a */
+ /* given glyph within the face's font file. */
+ /* */
+ /* forget_glyph_frame :: A function used to forget the frame of a */
+ /* given glyph when all data has been loaded. */
+ /* */
+ /* read_glyph_header :: A function used to read a glyph header. */
+ /* It must be called between an `access' and */
+ /* `forget'. */
+ /* */
+ /* read_simple_glyph :: A function used to read a simple glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* read_composite_glyph :: A function used to read a composite glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* sfnt :: A pointer to the SFNT service. */
+ /* */
+ /* psnames :: A pointer to the PostScript names service. */
+ /* */
+ /* hdmx :: The face's horizontal device metrics */
+ /* (`hdmx' table). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* gasp :: The grid-fitting and scaling properties */
+ /* table (`gasp'). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* pclt :: The `pclt' SFNT table. */
+ /* */
+ /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */
+ /* sizes, embedded in this font. */
+ /* */
+ /* sbit_strikes :: An array of sbit strikes embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* num_sbit_scales :: The number of sbit scales for this font. */
+ /* */
+ /* sbit_scales :: Array of sbit scales embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* postscript_names :: A table used to store the Postscript names */
+ /* of the glyphs for this font. See the */
+ /* file `ttconfig.h' for comments on the */
+ /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */
+ /* */
+ /* num_locations :: The number of glyph locations in this */
+ /* TrueType file. This should be */
+ /* identical to the number of glyphs. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* glyph_locations :: An array of longs. These are offsets to */
+ /* glyph data within the `glyf' table. */
+ /* Ignored for Type 2 font faces. */
+ /* */
+ /* glyf_len :: The length of the `glyf' table. Needed */
+ /* for malformed `loca' tables. */
+ /* */
+ /* font_program_size :: Size in bytecodes of the face's font */
+ /* program. 0 if none defined. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* font_program :: The face's font program (bytecode stream) */
+ /* executed at load time, also used during */
+ /* glyph rendering. Comes from the `fpgm' */
+ /* table. Ignored for Type 2 font fonts. */
+ /* */
+ /* cvt_program_size :: The size in bytecodes of the face's cvt */
+ /* program. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_program :: The face's cvt program (bytecode stream) */
+ /* executed each time an instance/size is */
+ /* changed/reset. Comes from the `prep' */
+ /* table. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_size :: Size of the control value table (in */
+ /* entries). Ignored for Type 2 fonts. */
+ /* */
+ /* cvt :: The face's original control value table. */
+ /* Coordinates are expressed in unscaled font */
+ /* units. Comes from the `cvt ' table. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* num_kern_pairs :: The number of kerning pairs present in the */
+ /* font file. The engine only loads the */
+ /* first horizontal format 0 kern table it */
+ /* finds in the font file. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* kern_table_index :: The index of the kerning table in the font */
+ /* kerning directory. Ignored for Type 2 */
+ /* fonts. */
+ /* */
+ /* interpreter :: A pointer to the TrueType bytecode */
+ /* interpreters field is also used to hook */
+ /* the debugger in `ttdebug'. */
+ /* */
+ /* unpatented_hinting :: If true, use only unpatented methods in */
+ /* the bytecode interpreter. */
+ /* */
+ /* doblend :: A boolean which is set if the font should */
+ /* be blended (this is for GX var). */
+ /* */
+ /* blend :: Contains the data needed to control GX */
+ /* variation tables (rather like Multiple */
+ /* Master data). */
+ /* */
+ /* extra :: Reserved for third-party font drivers. */
+ /* */
+ /* postscript_name :: The PS name of the font. Used by the */
+ /* postscript name service. */
+ /* */
+ typedef struct TT_FaceRec_
+ {
+ FT_FaceRec root;
+
+ TTC_HeaderRec ttc_header;
+
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ TT_Table dir_tables;
+
+ TT_Header header; /* TrueType header table */
+ TT_HoriHeader horizontal; /* TrueType horizontal header */
+
+ TT_MaxProfile max_profile;
+
+ FT_Bool vertical_info;
+ TT_VertHeader vertical; /* TT Vertical header, if present */
+
+ FT_UShort num_names; /* number of name records */
+ TT_NameTableRec name_table; /* name table */
+
+ TT_OS2 os2; /* TrueType OS/2 table */
+ TT_Postscript postscript; /* TrueType Postscript table */
+
+ FT_Byte* cmap_table; /* extracted `cmap' table */
+ FT_ULong cmap_size;
+
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Loader_StartGlyphFunc access_glyph_frame;
+ TT_Loader_EndGlyphFunc forget_glyph_frame;
+ TT_Loader_ReadGlyphFunc read_glyph_header;
+ TT_Loader_ReadGlyphFunc read_simple_glyph;
+ TT_Loader_ReadGlyphFunc read_composite_glyph;
+
+ /* a typeless pointer to the SFNT_Interface table used to load */
+ /* the basic TrueType tables in the face object */
+ void* sfnt;
+
+ /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+ /* handle glyph names <-> unicode & Mac values */
+ void* psnames;
+
+
+ /***********************************************************************/
+ /* */
+ /* Optional TrueType/OpenType tables */
+ /* */
+ /***********************************************************************/
+
+ /* grid-fitting and scaling table */
+ TT_GaspRec gasp; /* the `gasp' table */
+
+ /* PCL 5 table */
+ TT_PCLT pclt;
+
+ /* embedded bitmaps support */
+ FT_ULong num_sbit_scales;
+ TT_SBit_Scale sbit_scales;
+
+ /* postscript names table */
+ TT_Post_NamesRec postscript_names;
+
+
+ /***********************************************************************/
+ /* */
+ /* TrueType-specific fields (ignored by the OTF-Type2 driver) */
+ /* */
+ /***********************************************************************/
+
+ /* the font program, if any */
+ FT_ULong font_program_size;
+ FT_Byte* font_program;
+
+ /* the cvt program, if any */
+ FT_ULong cvt_program_size;
+ FT_Byte* cvt_program;
+
+ /* the original, unscaled, control value table */
+ FT_ULong cvt_size;
+ FT_Short* cvt;
+
+ /* A pointer to the bytecode interpreter to use. This is also */
+ /* used to hook the debugger for the `ttdebug' utility. */
+ TT_Interpreter interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Use unpatented hinting only. */
+ FT_Bool unpatented_hinting;
+#endif
+
+ /***********************************************************************/
+ /* */
+ /* Other tables or fields. This is used by derivative formats like */
+ /* OpenType. */
+ /* */
+ /***********************************************************************/
+
+ FT_Generic extra;
+
+ const char* postscript_name;
+
+ FT_ULong glyf_len;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Bool doblend;
+ GX_Blend blend;
+#endif
+
+ /* since version 2.2 */
+
+ FT_Byte* horz_metrics;
+ FT_ULong horz_metrics_size;
+
+ FT_Byte* vert_metrics;
+ FT_ULong vert_metrics_size;
+
+ FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */
+ FT_Byte* glyph_locations;
+
+ FT_Byte* hdmx_table;
+ FT_ULong hdmx_table_size;
+ FT_UInt hdmx_record_count;
+ FT_ULong hdmx_record_size;
+ FT_Byte* hdmx_record_sizes;
+
+ FT_Byte* sbit_table;
+ FT_ULong sbit_table_size;
+ FT_UInt sbit_num_strikes;
+
+ FT_Byte* kern_table;
+ FT_ULong kern_table_size;
+ FT_UInt num_kern_tables;
+ FT_UInt32 kern_avail_bits;
+ FT_UInt32 kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+ TT_BDFRec bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /* since 2.3.0 */
+ FT_ULong horz_metrics_offset;
+ FT_ULong vert_metrics_offset;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* since 2.4.12 */
+ FT_ULong sph_found_func_flags; /* special functions found */
+ /* for this face */
+ FT_Bool sph_compatibility_mode;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ } TT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GlyphZoneRec */
+ /* */
+ /* <Description> */
+ /* A glyph zone is used to load, scale and hint glyph outline */
+ /* coordinates. */
+ /* */
+ /* <Fields> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ /* max_points :: The maximum size in points of the zone. */
+ /* */
+ /* max_contours :: Max size in links contours of the zone. */
+ /* */
+ /* n_points :: The current number of points in the zone. */
+ /* */
+ /* n_contours :: The current number of contours in the zone. */
+ /* */
+ /* org :: The original glyph coordinates (font */
+ /* units/scaled). */
+ /* */
+ /* cur :: The current glyph coordinates (scaled/hinted). */
+ /* */
+ /* tags :: The point control tags. */
+ /* */
+ /* contours :: The contours end points. */
+ /* */
+ /* first_point :: Offset of the current subglyph's first point. */
+ /* */
+ typedef struct TT_GlyphZoneRec_
+ {
+ FT_Memory memory;
+ FT_UShort max_points;
+ FT_UShort max_contours;
+ FT_UShort n_points; /* number of points in zone */
+ FT_Short n_contours; /* number of contours */
+
+ FT_Vector* org; /* original point coordinates */
+ FT_Vector* cur; /* current point coordinates */
+ FT_Vector* orus; /* original (unscaled) point coordinates */
+
+ FT_Byte* tags; /* current touch flags */
+ FT_UShort* contours; /* contour end points */
+
+ FT_UShort first_point; /* offset of first (#0) point */
+
+ } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+ /* handle to execution context */
+ typedef struct TT_ExecContextRec_* TT_ExecContext;
+
+ /* glyph loader structure */
+ typedef struct TT_LoaderRec_
+ {
+ FT_Face face;
+ FT_Size size;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader gloader;
+
+ FT_ULong load_flags;
+ FT_UInt glyph_index;
+
+ FT_Stream stream;
+ FT_Int byte_len;
+
+ FT_Short n_contours;
+ FT_BBox bbox;
+ FT_Int left_bearing;
+ FT_Int advance;
+ FT_Int linear;
+ FT_Bool linear_def;
+ FT_Bool preserve_pps;
+ FT_Vector pp1;
+ FT_Vector pp2;
+
+ FT_ULong glyf_offset;
+
+ /* the zone where we load our glyphs */
+ TT_GlyphZoneRec base;
+ TT_GlyphZoneRec zone;
+
+ TT_ExecContext exec;
+ FT_Byte* instructions;
+ FT_ULong ins_pos;
+
+ /* for possible extensibility in other formats */
+ void* other;
+
+ /* since version 2.1.8 */
+ FT_Int top_bearing;
+ FT_Int vadvance;
+ FT_Vector pp3;
+ FT_Vector pp4;
+
+ /* since version 2.2.1 */
+ FT_Byte* cursor;
+ FT_Byte* limit;
+
+ } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
new file mode 100644
index 0000000000..6530094d81
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/* */
+/* t1tables.h */
+/* */
+/* Basic Type 1/Type 2 tables definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* type1_tables */
+ /* */
+ /* <Title> */
+ /* Type 1 Tables */
+ /* */
+ /* <Abstract> */
+ /* Type~1 (PostScript) specific font tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of Type 1-specific tables, */
+ /* including structures related to other PostScript font formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+ /* structures in order to support Multiple Master fonts. */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* FontInfo dictionary. */
+ /* */
+ typedef struct PS_FontInfoRec_
+ {
+ FT_String* version;
+ FT_String* notice;
+ FT_String* full_name;
+ FT_String* family_name;
+ FT_String* weight;
+ FT_Long italic_angle;
+ FT_Bool is_fixed_pitch;
+ FT_Short underline_position;
+ FT_UShort underline_thickness;
+
+ } PS_FontInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_FontInfoRec structure. */
+ /* */
+ typedef struct PS_FontInfoRec_* PS_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_FontInfo */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_FontInfoRec T1_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_PrivateRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 private dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* Private dictionary. */
+ /* */
+ typedef struct PS_PrivateRec_
+ {
+ FT_Int unique_id;
+ FT_Int lenIV;
+
+ FT_Byte num_blue_values;
+ FT_Byte num_other_blues;
+ FT_Byte num_family_blues;
+ FT_Byte num_family_other_blues;
+
+ FT_Short blue_values[14];
+ FT_Short other_blues[10];
+
+ FT_Short family_blues [14];
+ FT_Short family_other_blues[10];
+
+ FT_Fixed blue_scale;
+ FT_Int blue_shift;
+ FT_Int blue_fuzz;
+
+ FT_UShort standard_width[1];
+ FT_UShort standard_height[1];
+
+ FT_Byte num_snap_widths;
+ FT_Byte num_snap_heights;
+ FT_Bool force_bold;
+ FT_Bool round_stem_up;
+
+ FT_Short snap_widths [13]; /* including std width */
+ FT_Short snap_heights[13]; /* including std height */
+
+ FT_Fixed expansion_factor;
+
+ FT_Long language_group;
+ FT_Long password;
+
+ FT_Short min_feature[2];
+
+ } PS_PrivateRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Private */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_PrivateRec structure. */
+ /* */
+ typedef struct PS_PrivateRec_* PS_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_Private */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_PrivateRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_PrivateRec T1_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_Blend_Flags */
+ /* */
+ /* <Description> */
+ /* A set of flags used to indicate which fields are present in a */
+ /* given blend dictionary (font info or private). Used to support */
+ /* Multiple Masters fonts. */
+ /* */
+ typedef enum T1_Blend_Flags_
+ {
+ /*# required fields in a FontInfo blend dictionary */
+ T1_BLEND_UNDERLINE_POSITION = 0,
+ T1_BLEND_UNDERLINE_THICKNESS,
+ T1_BLEND_ITALIC_ANGLE,
+
+ /*# required fields in a Private blend dictionary */
+ T1_BLEND_BLUE_VALUES,
+ T1_BLEND_OTHER_BLUES,
+ T1_BLEND_STANDARD_WIDTH,
+ T1_BLEND_STANDARD_HEIGHT,
+ T1_BLEND_STEM_SNAP_WIDTHS,
+ T1_BLEND_STEM_SNAP_HEIGHTS,
+ T1_BLEND_BLUE_SCALE,
+ T1_BLEND_BLUE_SHIFT,
+ T1_BLEND_FAMILY_BLUES,
+ T1_BLEND_FAMILY_OTHER_BLUES,
+ T1_BLEND_FORCE_BOLD,
+
+ /*# never remove */
+ T1_BLEND_MAX
+
+ } T1_Blend_Flags;
+
+ /* */
+
+
+ /*# backwards compatible definitions */
+#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold T1_BLEND_FORCE_BOLD
+#define t1_blend_max T1_BLEND_MAX
+
+
+ /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS 16
+
+ /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS 4
+
+ /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS 20
+
+
+ /* this structure is used to store the BlendDesignMap entry for an axis */
+ typedef struct PS_DesignMap_
+ {
+ FT_Byte num_points;
+ FT_Long* design_points;
+ FT_Fixed* blend_points;
+
+ } PS_DesignMapRec, *PS_DesignMap;
+
+ /* backwards-compatible definition */
+ typedef PS_DesignMapRec T1_DesignMap;
+
+
+ typedef struct PS_BlendRec_
+ {
+ FT_UInt num_designs;
+ FT_UInt num_axis;
+
+ FT_String* axis_names[T1_MAX_MM_AXIS];
+ FT_Fixed* design_pos[T1_MAX_MM_DESIGNS];
+ PS_DesignMapRec design_map[T1_MAX_MM_AXIS];
+
+ FT_Fixed* weight_vector;
+ FT_Fixed* default_weight_vector;
+
+ PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1];
+ PS_Private privates [T1_MAX_MM_DESIGNS + 1];
+
+ FT_ULong blend_bitflags;
+
+ FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1];
+
+ /* since 2.3.0 */
+
+ /* undocumented, optional: the default design instance; */
+ /* corresponds to default_weight_vector -- */
+ /* num_default_design_vector == 0 means it is not present */
+ /* in the font and associated metrics files */
+ FT_UInt default_design_vector[T1_MAX_MM_DESIGNS];
+ FT_UInt num_default_design_vector;
+
+ } PS_BlendRec, *PS_Blend;
+
+
+ /* backwards-compatible definition */
+ typedef PS_BlendRec T1_Blend;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDictRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent data in a CID top-level dictionary. */
+ /* */
+ typedef struct CID_FaceDictRec_
+ {
+ PS_PrivateRec private_dict;
+
+ FT_UInt len_buildchar;
+ FT_Fixed forcebold_threshold;
+ FT_Pos stroke_width;
+ FT_Fixed expansion_factor;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_UInt num_subrs;
+ FT_ULong subrmap_offset;
+ FT_Int sd_bytes;
+
+ } CID_FaceDictRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDict */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceDictRec structure. */
+ /* */
+ typedef struct CID_FaceDictRec_* CID_FaceDict;
+
+ /* */
+
+
+ /* backwards-compatible definition */
+ typedef CID_FaceDictRec CID_FontDict;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent CID Face information. */
+ /* */
+ typedef struct CID_FaceInfoRec_
+ {
+ FT_String* cid_font_name;
+ FT_Fixed cid_version;
+ FT_Int cid_font_type;
+
+ FT_String* registry;
+ FT_String* ordering;
+ FT_Int supplement;
+
+ PS_FontInfoRec font_info;
+ FT_BBox font_bbox;
+ FT_ULong uid_base;
+
+ FT_Int num_xuid;
+ FT_ULong xuid[16];
+
+ FT_ULong cidmap_offset;
+ FT_Int fd_bytes;
+ FT_Int gd_bytes;
+ FT_ULong cid_count;
+
+ FT_Int num_dicts;
+ CID_FaceDict font_dicts;
+
+ FT_ULong data_offset;
+
+ } CID_FaceInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceInfoRec structure. */
+ /* */
+ typedef struct CID_FaceInfoRec_* CID_FaceInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_Info */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef CID_FaceInfoRec CID_Info;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Has_PS_Glyph_Names
+ *
+ * @description:
+ * Return true if a given face provides reliable PostScript glyph
+ * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+ * except that certain fonts (mostly TrueType) contain incorrect
+ * glyph name tables.
+ *
+ * When this function returns true, the caller is sure that the glyph
+ * names returned by @FT_Get_Glyph_Name are reliable.
+ *
+ * @input:
+ * face ::
+ * face handle
+ *
+ * @return:
+ * Boolean. True if glyph names are reliable.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Has_PS_Glyph_Names( FT_Face face );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Info
+ *
+ * @description:
+ * Retrieve the @PS_FontInfoRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_info ::
+ * Output font info structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the font info structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function will
+ * return the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Info( FT_Face face,
+ PS_FontInfo afont_info );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Private
+ *
+ * @description:
+ * Retrieve the @PS_PrivateRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_private ::
+ * Output private dictionary structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the @PS_PrivateRec structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Private( FT_Face face,
+ PS_Private afont_private );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_EncodingType */
+ /* */
+ /* <Description> */
+ /* An enumeration describing the `Encoding' entry in a Type 1 */
+ /* dictionary. */
+ /* */
+ typedef enum T1_EncodingType_
+ {
+ T1_ENCODING_TYPE_NONE = 0,
+ T1_ENCODING_TYPE_ARRAY,
+ T1_ENCODING_TYPE_STANDARD,
+ T1_ENCODING_TYPE_ISOLATIN1,
+ T1_ENCODING_TYPE_EXPERT
+
+ } T1_EncodingType;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* PS_Dict_Keys */
+ /* */
+ /* <Description> */
+ /* An enumeration used in calls to @FT_Get_PS_Font_Value to identify */
+ /* the Type~1 dictionary entry to retrieve. */
+ /* */
+ typedef enum PS_Dict_Keys_
+ {
+ /* conventionally in the font dictionary */
+ PS_DICT_FONT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_MATRIX, /* FT_Fixed */
+ PS_DICT_FONT_BBOX, /* FT_Fixed */
+ PS_DICT_PAINT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_NAME, /* FT_String* */
+ PS_DICT_UNIQUE_ID, /* FT_Int */
+ PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */
+ PS_DICT_CHAR_STRING_KEY, /* FT_String* */
+ PS_DICT_CHAR_STRING, /* FT_String* */
+ PS_DICT_ENCODING_TYPE, /* T1_EncodingType */
+ PS_DICT_ENCODING_ENTRY, /* FT_String* */
+
+ /* conventionally in the font Private dictionary */
+ PS_DICT_NUM_SUBRS, /* FT_Int */
+ PS_DICT_SUBR, /* FT_String* */
+ PS_DICT_STD_HW, /* FT_UShort */
+ PS_DICT_STD_VW, /* FT_UShort */
+ PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */
+ PS_DICT_BLUE_VALUE, /* FT_Short */
+ PS_DICT_BLUE_FUZZ, /* FT_Int */
+ PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_OTHER_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */
+ PS_DICT_BLUE_SCALE, /* FT_Fixed */
+ PS_DICT_BLUE_SHIFT, /* FT_Int */
+ PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */
+ PS_DICT_STEM_SNAP_H, /* FT_Short */
+ PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */
+ PS_DICT_STEM_SNAP_V, /* FT_Short */
+ PS_DICT_FORCE_BOLD, /* FT_Bool */
+ PS_DICT_RND_STEM_UP, /* FT_Bool */
+ PS_DICT_MIN_FEATURE, /* FT_Short */
+ PS_DICT_LEN_IV, /* FT_Int */
+ PS_DICT_PASSWORD, /* FT_Long */
+ PS_DICT_LANGUAGE_GROUP, /* FT_Long */
+
+ /* conventionally in the font FontInfo dictionary */
+ PS_DICT_VERSION, /* FT_String* */
+ PS_DICT_NOTICE, /* FT_String* */
+ PS_DICT_FULL_NAME, /* FT_String* */
+ PS_DICT_FAMILY_NAME, /* FT_String* */
+ PS_DICT_WEIGHT, /* FT_String* */
+ PS_DICT_IS_FIXED_PITCH, /* FT_Bool */
+ PS_DICT_UNDERLINE_POSITION, /* FT_Short */
+ PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */
+ PS_DICT_FS_TYPE, /* FT_UShort */
+ PS_DICT_ITALIC_ANGLE, /* FT_Long */
+
+ PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+ } PS_Dict_Keys;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Value
+ *
+ * @description:
+ * Retrieve the value for the supplied key from a PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * key ::
+ * An enumeration value representing the dictionary key to retrieve.
+ *
+ * idx ::
+ * For array values, this specifies the index to be returned.
+ *
+ * value ::
+ * A pointer to memory into which to write the value.
+ *
+ * valen_len ::
+ * The size, in bytes, of the memory supplied for the value.
+ *
+ * @output:
+ * value ::
+ * The value matching the above key, if it exists.
+ *
+ * @return:
+ * The amount of memory (in bytes) required to hold the requested
+ * value (if it exists, -1 otherwise).
+ *
+ * @note:
+ * The values returned are not pointers into the internal structures of
+ * the face, but are `fresh' copies, so that the memory containing them
+ * belongs to the calling application. This also enforces the
+ * `read-only' nature of these values, i.e., this function cannot be
+ * used to manipulate the face.
+ *
+ * `value' is a void pointer because the values returned can be of
+ * various types.
+ *
+ * If either `value' is NULL or `value_len' is too small, just the
+ * required memory size for the requested entry is returned.
+ *
+ * The `idx' parameter is used, not only to retrieve elements of, for
+ * example, the FontMatrix or FontBBox, but also to retrieve name keys
+ * from the CharStrings dictionary, and the charstrings themselves. It
+ * is ignored for atomic values.
+ *
+ * PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000. To
+ * get the value as in the font stream, you need to divide by
+ * 65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+ *
+ * IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+ * be retrieved. So, for example, PostScript procedures such as NP,
+ * ND, and RD are not available. Arbitrary keys are, obviously, not be
+ * available either.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Long )
+ FT_Get_PS_Font_Value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
new file mode 100644
index 0000000000..862bf927c2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
@@ -0,0 +1,1237 @@
+/***************************************************************************/
+/* */
+/* ttnameid.h */
+/* */
+/* TrueType name ID definitions (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values for the `platform' identifier code in the name */
+ /* records of the TTF `name' table. */
+ /* */
+ /*************************************************************************/
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_PLATFORM_XXX
+ *
+ * @description:
+ * A list of valid values for the `platform_id' identifier code in
+ * @FT_CharMapRec and @FT_SfntName structures.
+ *
+ * @values:
+ * TT_PLATFORM_APPLE_UNICODE ::
+ * Used by Apple to indicate a Unicode character map and/or name entry.
+ * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note
+ * that name entries in this format are coded as big-endian UCS-2
+ * character codes _only_.
+ *
+ * TT_PLATFORM_MACINTOSH ::
+ * Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+ * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that
+ * most TrueType fonts contain an Apple roman charmap to be usable on
+ * MacOS systems (even if they contain a Microsoft charmap as well).
+ *
+ * TT_PLATFORM_ISO ::
+ * This value was used to specify ISO/IEC 10646 charmaps. It is however
+ * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding
+ * `encoding_id' values.
+ *
+ * TT_PLATFORM_MICROSOFT ::
+ * Used by Microsoft to indicate Windows-specific charmaps. See
+ * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+ * Note that most fonts contain a Unicode charmap using
+ * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+ *
+ * TT_PLATFORM_CUSTOM ::
+ * Used to indicate application-specific charmaps.
+ *
+ * TT_PLATFORM_ADOBE ::
+ * This value isn't part of any font format specification, but is used
+ * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+ * structure. See @TT_ADOBE_ID_XXX.
+ */
+
+#define TT_PLATFORM_APPLE_UNICODE 0
+#define TT_PLATFORM_MACINTOSH 1
+#define TT_PLATFORM_ISO 2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT 3
+#define TT_PLATFORM_CUSTOM 4
+#define TT_PLATFORM_ADOBE 7 /* artificial */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_APPLE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+ *
+ * @values:
+ * TT_APPLE_ID_DEFAULT ::
+ * Unicode version 1.0.
+ *
+ * TT_APPLE_ID_UNICODE_1_1 ::
+ * Unicode 1.1; specifies Hangul characters starting at U+34xx.
+ *
+ * TT_APPLE_ID_ISO_10646 ::
+ * Deprecated (identical to preceding).
+ *
+ * TT_APPLE_ID_UNICODE_2_0 ::
+ * Unicode 2.0 and beyond (UTF-16 BMP only).
+ *
+ * TT_APPLE_ID_UNICODE_32 ::
+ * Unicode 3.1 and beyond, using UTF-32.
+ *
+ * TT_APPLE_ID_VARIANT_SELECTOR ::
+ * From Adobe, not Apple. Not a normal cmap. Specifies variations
+ * on a real cmap.
+ */
+
+#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646 2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */
+#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MAC_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MACINTOSH charmaps and name entries.
+ *
+ * @values:
+ * TT_MAC_ID_ROMAN ::
+ * TT_MAC_ID_JAPANESE ::
+ * TT_MAC_ID_TRADITIONAL_CHINESE ::
+ * TT_MAC_ID_KOREAN ::
+ * TT_MAC_ID_ARABIC ::
+ * TT_MAC_ID_HEBREW ::
+ * TT_MAC_ID_GREEK ::
+ * TT_MAC_ID_RUSSIAN ::
+ * TT_MAC_ID_RSYMBOL ::
+ * TT_MAC_ID_DEVANAGARI ::
+ * TT_MAC_ID_GURMUKHI ::
+ * TT_MAC_ID_GUJARATI ::
+ * TT_MAC_ID_ORIYA ::
+ * TT_MAC_ID_BENGALI ::
+ * TT_MAC_ID_TAMIL ::
+ * TT_MAC_ID_TELUGU ::
+ * TT_MAC_ID_KANNADA ::
+ * TT_MAC_ID_MALAYALAM ::
+ * TT_MAC_ID_SINHALESE ::
+ * TT_MAC_ID_BURMESE ::
+ * TT_MAC_ID_KHMER ::
+ * TT_MAC_ID_THAI ::
+ * TT_MAC_ID_LAOTIAN ::
+ * TT_MAC_ID_GEORGIAN ::
+ * TT_MAC_ID_ARMENIAN ::
+ * TT_MAC_ID_MALDIVIAN ::
+ * TT_MAC_ID_SIMPLIFIED_CHINESE ::
+ * TT_MAC_ID_TIBETAN ::
+ * TT_MAC_ID_MONGOLIAN ::
+ * TT_MAC_ID_GEEZ ::
+ * TT_MAC_ID_SLAVIC ::
+ * TT_MAC_ID_VIETNAMESE ::
+ * TT_MAC_ID_SINDHI ::
+ * TT_MAC_ID_UNINTERP ::
+ */
+
+#define TT_MAC_ID_ROMAN 0
+#define TT_MAC_ID_JAPANESE 1
+#define TT_MAC_ID_TRADITIONAL_CHINESE 2
+#define TT_MAC_ID_KOREAN 3
+#define TT_MAC_ID_ARABIC 4
+#define TT_MAC_ID_HEBREW 5
+#define TT_MAC_ID_GREEK 6
+#define TT_MAC_ID_RUSSIAN 7
+#define TT_MAC_ID_RSYMBOL 8
+#define TT_MAC_ID_DEVANAGARI 9
+#define TT_MAC_ID_GURMUKHI 10
+#define TT_MAC_ID_GUJARATI 11
+#define TT_MAC_ID_ORIYA 12
+#define TT_MAC_ID_BENGALI 13
+#define TT_MAC_ID_TAMIL 14
+#define TT_MAC_ID_TELUGU 15
+#define TT_MAC_ID_KANNADA 16
+#define TT_MAC_ID_MALAYALAM 17
+#define TT_MAC_ID_SINHALESE 18
+#define TT_MAC_ID_BURMESE 19
+#define TT_MAC_ID_KHMER 20
+#define TT_MAC_ID_THAI 21
+#define TT_MAC_ID_LAOTIAN 22
+#define TT_MAC_ID_GEORGIAN 23
+#define TT_MAC_ID_ARMENIAN 24
+#define TT_MAC_ID_MALDIVIAN 25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE 25
+#define TT_MAC_ID_TIBETAN 26
+#define TT_MAC_ID_MONGOLIAN 27
+#define TT_MAC_ID_GEEZ 28
+#define TT_MAC_ID_SLAVIC 29
+#define TT_MAC_ID_VIETNAMESE 30
+#define TT_MAC_ID_SINDHI 31
+#define TT_MAC_ID_UNINTERP 32
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ISO_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ISO charmaps and name entries.
+ *
+ * Their use is now deprecated.
+ *
+ * @values:
+ * TT_ISO_ID_7BIT_ASCII ::
+ * ASCII.
+ * TT_ISO_ID_10646 ::
+ * ISO/10646.
+ * TT_ISO_ID_8859_1 ::
+ * Also known as Latin-1.
+ */
+
+#define TT_ISO_ID_7BIT_ASCII 0
+#define TT_ISO_ID_10646 1
+#define TT_ISO_ID_8859_1 2
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MS_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MICROSOFT charmaps and name entries.
+ *
+ * @values:
+ * TT_MS_ID_SYMBOL_CS ::
+ * Corresponds to Microsoft symbol encoding. See
+ * @FT_ENCODING_MS_SYMBOL.
+ *
+ * TT_MS_ID_UNICODE_CS ::
+ * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See
+ * @FT_ENCODING_UNICODE.
+ *
+ * TT_MS_ID_SJIS ::
+ * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS.
+ *
+ * TT_MS_ID_GB2312 ::
+ * Corresponds to Simplified Chinese as used in Mainland China. See
+ * @FT_ENCODING_GB2312.
+ *
+ * TT_MS_ID_BIG_5 ::
+ * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+ * See @FT_ENCODING_BIG5.
+ *
+ * TT_MS_ID_WANSUNG ::
+ * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG.
+ *
+ * TT_MS_ID_JOHAB ::
+ * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB.
+ *
+ * TT_MS_ID_UCS_4 ::
+ * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to
+ * the OpenType specification version 1.4 (mid-2001.)
+ */
+
+#define TT_MS_ID_SYMBOL_CS 0
+#define TT_MS_ID_UNICODE_CS 1
+#define TT_MS_ID_SJIS 2
+#define TT_MS_ID_GB2312 3
+#define TT_MS_ID_BIG_5 4
+#define TT_MS_ID_WANSUNG 5
+#define TT_MS_ID_JOHAB 6
+#define TT_MS_ID_UCS_4 10
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ADOBE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension!
+ *
+ * @values:
+ * TT_ADOBE_ID_STANDARD ::
+ * Adobe standard encoding.
+ * TT_ADOBE_ID_EXPERT ::
+ * Adobe expert encoding.
+ * TT_ADOBE_ID_CUSTOM ::
+ * Adobe custom encoding.
+ * TT_ADOBE_ID_LATIN_1 ::
+ * Adobe Latin~1 encoding.
+ */
+
+#define TT_ADOBE_ID_STANDARD 0
+#define TT_ADOBE_ID_EXPERT 1
+#define TT_ADOBE_ID_CUSTOM 2
+#define TT_ADOBE_ID_LATIN_1 3
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MACINTOSH. These values are also used as return values */
+ /* for function @FT_Get_CMap_Language_ID. */
+ /* */
+ /* The canonical source for the Apple assigned Language ID's is at */
+ /* */
+ /* https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html */
+ /* */
+#define TT_MAC_LANGID_ENGLISH 0
+#define TT_MAC_LANGID_FRENCH 1
+#define TT_MAC_LANGID_GERMAN 2
+#define TT_MAC_LANGID_ITALIAN 3
+#define TT_MAC_LANGID_DUTCH 4
+#define TT_MAC_LANGID_SWEDISH 5
+#define TT_MAC_LANGID_SPANISH 6
+#define TT_MAC_LANGID_DANISH 7
+#define TT_MAC_LANGID_PORTUGUESE 8
+#define TT_MAC_LANGID_NORWEGIAN 9
+#define TT_MAC_LANGID_HEBREW 10
+#define TT_MAC_LANGID_JAPANESE 11
+#define TT_MAC_LANGID_ARABIC 12
+#define TT_MAC_LANGID_FINNISH 13
+#define TT_MAC_LANGID_GREEK 14
+#define TT_MAC_LANGID_ICELANDIC 15
+#define TT_MAC_LANGID_MALTESE 16
+#define TT_MAC_LANGID_TURKISH 17
+#define TT_MAC_LANGID_CROATIAN 18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19
+#define TT_MAC_LANGID_URDU 20
+#define TT_MAC_LANGID_HINDI 21
+#define TT_MAC_LANGID_THAI 22
+#define TT_MAC_LANGID_KOREAN 23
+#define TT_MAC_LANGID_LITHUANIAN 24
+#define TT_MAC_LANGID_POLISH 25
+#define TT_MAC_LANGID_HUNGARIAN 26
+#define TT_MAC_LANGID_ESTONIAN 27
+#define TT_MAC_LANGID_LETTISH 28
+#define TT_MAC_LANGID_SAAMISK 29
+#define TT_MAC_LANGID_FAEROESE 30
+#define TT_MAC_LANGID_FARSI 31
+#define TT_MAC_LANGID_RUSSIAN 32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33
+#define TT_MAC_LANGID_FLEMISH 34
+#define TT_MAC_LANGID_IRISH 35
+#define TT_MAC_LANGID_ALBANIAN 36
+#define TT_MAC_LANGID_ROMANIAN 37
+#define TT_MAC_LANGID_CZECH 38
+#define TT_MAC_LANGID_SLOVAK 39
+#define TT_MAC_LANGID_SLOVENIAN 40
+#define TT_MAC_LANGID_YIDDISH 41
+#define TT_MAC_LANGID_SERBIAN 42
+#define TT_MAC_LANGID_MACEDONIAN 43
+#define TT_MAC_LANGID_BULGARIAN 44
+#define TT_MAC_LANGID_UKRAINIAN 45
+#define TT_MAC_LANGID_BYELORUSSIAN 46
+#define TT_MAC_LANGID_UZBEK 47
+#define TT_MAC_LANGID_KAZAKH 48
+#define TT_MAC_LANGID_AZERBAIJANI 49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50
+#define TT_MAC_LANGID_ARMENIAN 51
+#define TT_MAC_LANGID_GEORGIAN 52
+#define TT_MAC_LANGID_MOLDAVIAN 53
+#define TT_MAC_LANGID_KIRGHIZ 54
+#define TT_MAC_LANGID_TAJIKI 55
+#define TT_MAC_LANGID_TURKMEN 56
+#define TT_MAC_LANGID_MONGOLIAN 57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58
+#define TT_MAC_LANGID_PASHTO 59
+#define TT_MAC_LANGID_KURDISH 60
+#define TT_MAC_LANGID_KASHMIRI 61
+#define TT_MAC_LANGID_SINDHI 62
+#define TT_MAC_LANGID_TIBETAN 63
+#define TT_MAC_LANGID_NEPALI 64
+#define TT_MAC_LANGID_SANSKRIT 65
+#define TT_MAC_LANGID_MARATHI 66
+#define TT_MAC_LANGID_BENGALI 67
+#define TT_MAC_LANGID_ASSAMESE 68
+#define TT_MAC_LANGID_GUJARATI 69
+#define TT_MAC_LANGID_PUNJABI 70
+#define TT_MAC_LANGID_ORIYA 71
+#define TT_MAC_LANGID_MALAYALAM 72
+#define TT_MAC_LANGID_KANNADA 73
+#define TT_MAC_LANGID_TAMIL 74
+#define TT_MAC_LANGID_TELUGU 75
+#define TT_MAC_LANGID_SINHALESE 76
+#define TT_MAC_LANGID_BURMESE 77
+#define TT_MAC_LANGID_KHMER 78
+#define TT_MAC_LANGID_LAO 79
+#define TT_MAC_LANGID_VIETNAMESE 80
+#define TT_MAC_LANGID_INDONESIAN 81
+#define TT_MAC_LANGID_TAGALOG 82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84
+#define TT_MAC_LANGID_AMHARIC 85
+#define TT_MAC_LANGID_TIGRINYA 86
+#define TT_MAC_LANGID_GALLA 87
+#define TT_MAC_LANGID_SOMALI 88
+#define TT_MAC_LANGID_SWAHILI 89
+#define TT_MAC_LANGID_RUANDA 90
+#define TT_MAC_LANGID_RUNDI 91
+#define TT_MAC_LANGID_CHEWA 92
+#define TT_MAC_LANGID_MALAGASY 93
+#define TT_MAC_LANGID_ESPERANTO 94
+#define TT_MAC_LANGID_WELSH 128
+#define TT_MAC_LANGID_BASQUE 129
+#define TT_MAC_LANGID_CATALAN 130
+#define TT_MAC_LANGID_LATIN 131
+#define TT_MAC_LANGID_QUECHUA 132
+#define TT_MAC_LANGID_GUARANI 133
+#define TT_MAC_LANGID_AYMARA 134
+#define TT_MAC_LANGID_TATAR 135
+#define TT_MAC_LANGID_UIGHUR 136
+#define TT_MAC_LANGID_DZONGKHA 137
+#define TT_MAC_LANGID_JAVANESE 138
+#define TT_MAC_LANGID_SUNDANESE 139
+
+
+#if 0 /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 140
+#define TT_MAC_LANGID_IRISH_GAELIC 141
+
+#endif
+
+
+ /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN 140
+#define TT_MAC_LANGID_AFRIKAANS 141
+#define TT_MAC_LANGID_BRETON 142
+#define TT_MAC_LANGID_INUKTITUT 143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 144
+#define TT_MAC_LANGID_MANX_GAELIC 145
+#define TT_MAC_LANGID_IRISH_GAELIC 146
+#define TT_MAC_LANGID_TONGAN 147
+#define TT_MAC_LANGID_GREEK_POLYTONIC 148
+#define TT_MAC_LANGID_GREELANDIC 149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MICROSOFT. */
+ /* */
+ /* The canonical source for the MS assigned LCIDs is */
+ /* */
+ /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */
+ /* */
+
+#define TT_MS_LANGID_ARABIC_GENERAL 0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ 0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA 0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN 0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN 0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA 0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON 0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401
+#define TT_MS_LANGID_ARABIC_UAE 0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR 0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN 0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL 0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404
+#define TT_MS_LANGID_CHINESE_PRC 0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004
+
+#if 1 /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU 0x1404
+#else /* but beware, Microsoft may change its mind...
+ the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0 /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405
+#define TT_MS_LANGID_DANISH_DENMARK 0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY 0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407
+#define TT_MS_LANGID_GREEK_GREECE 0x0408
+
+ /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2 0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA 0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA 0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO 0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA 0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a
+#define TT_MS_LANGID_SPANISH_PERU 0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a
+#define TT_MS_LANGID_SPANISH_CHILE 0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a
+ /* The following ID blatantly violate MS specs by using a */
+ /* sublanguage > 0x1F. */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND 0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE 0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c
+#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO 0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION 0x200c
+#define TT_MS_LANGID_FRENCH_CONGO 0x240c
+ /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c
+#define TT_MS_LANGID_FRENCH_MALI 0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c
+#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c
+ /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY 0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814
+#define TT_MS_LANGID_POLISH_POLAND 0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a
+
+#if 0 /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a
+#else /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a
+ /* and XPsp2 Platform SDK added (2004-07-26) */
+ /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d
+#define TT_MS_LANGID_THAI_THAILAND 0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY 0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN 0x0420
+#define TT_MS_LANGID_URDU_INDIA 0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428
+#define TT_MS_LANGID_FARSI_IRAN 0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN 0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438
+#define TT_MS_LANGID_HINDI_INDIA 0x0439
+#define TT_MS_LANGID_MALTESE_MALTA 0x043a
+ /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b
+ /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+ TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA 0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444
+#define TT_MS_LANGID_BENGALI_INDIA 0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA 0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA 0x0447
+#define TT_MS_LANGID_ORIYA_INDIA 0x0448
+#define TT_MS_LANGID_TAMIL_INDIA 0x0449
+#define TT_MS_LANGID_TELUGU_INDIA 0x044a
+#define TT_MS_LANGID_KANNADA_INDIA 0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d
+#define TT_MS_LANGID_MARATHI_INDIA 0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA 0x0451
+ /* Don't use the next constant! It has */
+ /* (1) the wrong spelling (Dzonghka) */
+ /* (2) Microsoft doesn't officially define it -- */
+ /* at least it is not in the List of Local */
+ /* ID Values. */
+ /* (3) Dzongkha is not the same language as */
+ /* Tibetan, so merging it is wrong anyway. */
+ /* */
+ /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851
+
+#if 0
+ /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451
+ /* ... but it was changed; */
+#else
+ /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES 0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453
+#define TT_MS_LANGID_LAO_LAOS 0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456
+#define TT_MS_LANGID_KONKANI_INDIA 0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859
+ /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f
+ /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460
+ /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+ /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860
+ /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL 0x0461
+#define TT_MS_LANGID_NEPALI_INDIA 0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA 0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b
+#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c
+ /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+ TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+ /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA 0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA 0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873
+ /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475
+#define TT_MS_LANGID_LATIN 0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477
+ /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+ /* not written (but OTOH the peculiar writing system is worth */
+ /* studying). */
+#define TT_MS_LANGID_YI_CHINA 0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479
+ /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA 0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481
+
+#if 0 /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the `name' identifier field in the name records of */
+ /* the TTF `name' table. These values are platform independent. */
+ /* */
+#define TT_NAME_ID_COPYRIGHT 0
+#define TT_NAME_ID_FONT_FAMILY 1
+#define TT_NAME_ID_FONT_SUBFAMILY 2
+#define TT_NAME_ID_UNIQUE_ID 3
+#define TT_NAME_ID_FULL_NAME 4
+#define TT_NAME_ID_VERSION_STRING 5
+#define TT_NAME_ID_PS_NAME 6
+#define TT_NAME_ID_TRADEMARK 7
+
+ /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER 8
+#define TT_NAME_ID_DESIGNER 9
+#define TT_NAME_ID_DESCRIPTION 10
+#define TT_NAME_ID_VENDOR_URL 11
+#define TT_NAME_ID_DESIGNER_URL 12
+#define TT_NAME_ID_LICENSE 13
+#define TT_NAME_ID_LICENSE_URL 14
+ /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY 16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY 17
+#define TT_NAME_ID_MAC_FULL_NAME 18
+
+ /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT 19
+
+ /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME 20
+
+ /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY 21
+#define TT_NAME_ID_WWS_SUBFAMILY 22
+
+
+ /*************************************************************************/
+ /* */
+ /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */
+ /* */
+ /* Updated 08-Nov-2008. */
+ /* */
+
+ /* Bit 0 Basic Latin */
+#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */
+ /* Bit 1 C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */
+ /* Bit 2 Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */
+ /* Bit 3 Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */
+ /* Bit 4 IPA Extensions */
+ /* Phonetic Extensions */
+ /* Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */
+ /* U+1D00-U+1D7F */
+ /* U+1D80-U+1DBF */
+ /* Bit 5 Spacing Modifier Letters */
+ /* Modifier Tone Letters */
+#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */
+ /* U+A700-U+A71F */
+ /* Bit 6 Combining Diacritical Marks */
+ /* Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */
+ /* U+1DC0-U+1DFF */
+ /* Bit 7 Greek and Coptic */
+#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */
+ /* Bit 8 Coptic */
+#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */
+ /* Bit 9 Cyrillic */
+ /* Cyrillic Supplement */
+ /* Cyrillic Extended-A */
+ /* Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */
+ /* U+0500-U+052F */
+ /* U+2DE0-U+2DFF */
+ /* U+A640-U+A69F */
+ /* Bit 10 Armenian */
+#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */
+ /* Bit 11 Hebrew */
+#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */
+ /* Bit 12 Vai */
+#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */
+ /* Bit 13 Arabic */
+ /* Arabic Supplement */
+#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */
+ /* U+0750-U+077F */
+ /* Bit 14 NKo */
+#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */
+ /* Bit 15 Devanagari */
+#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */
+ /* Bit 16 Bengali */
+#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */
+ /* Bit 17 Gurmukhi */
+#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */
+ /* Bit 18 Gujarati */
+#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */
+ /* Bit 19 Oriya */
+#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */
+ /* Bit 20 Tamil */
+#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */
+ /* Bit 21 Telugu */
+#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */
+ /* Bit 22 Kannada */
+#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */
+ /* Bit 23 Malayalam */
+#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */
+ /* Bit 24 Thai */
+#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */
+ /* Bit 25 Lao */
+#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */
+ /* Bit 26 Georgian */
+ /* Georgian Supplement */
+#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */
+ /* U+2D00-U+2D2F */
+ /* Bit 27 Balinese */
+#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */
+ /* Bit 28 Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */
+ /* Bit 29 Latin Extended Additional */
+ /* Latin Extended-C */
+ /* Latin Extended-D */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */
+ /* U+2C60-U+2C7F */
+ /* U+A720-U+A7FF */
+ /* Bit 30 Greek Extended */
+#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */
+ /* Bit 31 General Punctuation */
+ /* Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */
+ /* U+2E00-U+2E7F */
+ /* Bit 32 Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */
+ /* Bit 33 Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */
+ /* Bit 34 Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */
+ /* Bit 35 Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */
+ /* Bit 36 Number Forms */
+#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */
+ /* Bit 37 Arrows */
+ /* Supplemental Arrows-A */
+ /* Supplemental Arrows-B */
+ /* Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */
+ /* U+27F0-U+27FF */
+ /* U+2900-U+297F */
+ /* U+2B00-U+2BFF */
+ /* Bit 38 Mathematical Operators */
+ /* Supplemental Mathematical Operators */
+ /* Miscellaneous Mathematical Symbols-A */
+ /* Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */
+ /* U+2A00-U+2AFF */
+ /* U+27C0-U+27EF */
+ /* U+2980-U+29FF */
+ /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */
+ /* Bit 40 Control Pictures */
+#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */
+ /* Bit 41 Optical Character Recognition */
+#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */
+ /* Bit 42 Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */
+ /* Bit 43 Box Drawing */
+#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */
+ /* Bit 44 Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */
+ /* Bit 45 Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */
+ /* Bit 46 Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */
+ /* Bit 47 Dingbats */
+#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */
+ /* Bit 48 CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */
+ /* Bit 49 Hiragana */
+#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */
+ /* Bit 50 Katakana */
+ /* Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */
+ /* U+31F0-U+31FF */
+ /* Bit 51 Bopomofo */
+ /* Bopomofo Extended */
+#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */
+ /* U+31A0-U+31BF */
+ /* Bit 52 Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */
+ /* Bit 53 Phags-Pa */
+#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+ /* Bit 54 Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */
+ /* Bit 55 CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */
+ /* Bit 56 Hangul Syllables */
+#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */
+ /* Bit 57 High Surrogates */
+ /* High Private Use Surrogates */
+ /* Low Surrogates */
+ /* */
+ /* According to OpenType specs v.1.3+, */
+ /* setting bit 57 implies that there is */
+ /* at least one codepoint beyond the */
+ /* Basic Multilingual Plane that is */
+ /* supported by this font. So it really */
+ /* means >= U+10000 */
+#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */
+ /* U+DB80-U+DBFF */
+ /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES
+ /* Bit 58 Phoenician */
+#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/
+ /* Bit 59 CJK Unified Ideographs */
+ /* CJK Radicals Supplement */
+ /* Kangxi Radicals */
+ /* Ideographic Description Characters */
+ /* CJK Unified Ideographs Extension A */
+ /* CJK Unified Ideographs Extension B */
+ /* Kanbun */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */
+ /* U+2E80-U+2EFF */
+ /* U+2F00-U+2FDF */
+ /* U+2FF0-U+2FFF */
+ /* U+3400-U+4DB5 */
+ /*U+20000-U+2A6DF*/
+ /* U+3190-U+319F */
+ /* Bit 60 Private Use */
+#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */
+ /* Bit 61 CJK Strokes */
+ /* CJK Compatibility Ideographs */
+ /* CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */
+ /* U+F900-U+FAFF */
+ /*U+2F800-U+2FA1F*/
+ /* Bit 62 Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */
+ /* Bit 63 Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */
+ /* Bit 64 Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */
+ /* Bit 65 Vertical forms */
+ /* CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */
+ /* U+FE30-U+FE4F */
+ /* Bit 66 Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */
+ /* Bit 67 Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */
+ /* Bit 68 Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */
+ /* Bit 69 Specials */
+#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */
+ /* Bit 70 Tibetan */
+#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */
+ /* Bit 71 Syriac */
+#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */
+ /* Bit 72 Thaana */
+#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */
+ /* Bit 73 Sinhala */
+#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */
+ /* Bit 74 Myanmar */
+#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */
+ /* Bit 75 Ethiopic */
+ /* Ethiopic Supplement */
+ /* Ethiopic Extended */
+#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */
+ /* U+1380-U+139F */
+ /* U+2D80-U+2DDF */
+ /* Bit 76 Cherokee */
+#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */
+ /* Bit 77 Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */
+ /* Bit 78 Ogham */
+#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */
+ /* Bit 79 Runic */
+#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */
+ /* Bit 80 Khmer */
+ /* Khmer Symbols */
+#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */
+ /* U+19E0-U+19FF */
+ /* Bit 81 Mongolian */
+#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */
+ /* Bit 82 Braille Patterns */
+#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */
+ /* Bit 83 Yi Syllables */
+ /* Yi Radicals */
+#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */
+ /* U+A490-U+A4CF */
+ /* Bit 84 Tagalog */
+ /* Hanunoo */
+ /* Buhid */
+ /* Tagbanwa */
+#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */
+ /* U+1720-U+173F */
+ /* U+1740-U+175F */
+ /* U+1760-U+177F */
+ /* Bit 85 Old Italic */
+#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/
+ /* Bit 86 Gothic */
+#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/
+ /* Bit 87 Deseret */
+#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/
+ /* Bit 88 Byzantine Musical Symbols */
+ /* Musical Symbols */
+ /* Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/
+ /*U+1D100-U+1D1FF*/
+ /*U+1D200-U+1D24F*/
+ /* Bit 89 Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/
+ /* Bit 90 Private Use (plane 15) */
+ /* Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/
+ /*U+100000-U+10FFFD*/
+ /* Bit 91 Variation Selectors */
+ /* Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */
+ /*U+E0100-U+E01EF*/
+ /* Bit 92 Tags */
+#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/
+ /* Bit 93 Limbu */
+#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */
+ /* Bit 94 Tai Le */
+#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */
+ /* Bit 95 New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */
+ /* Bit 96 Buginese */
+#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */
+ /* Bit 97 Glagolitic */
+#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */
+ /* Bit 98 Tifinagh */
+#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */
+ /* Bit 99 Yijing Hexagram Symbols */
+#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */
+ /* Bit 100 Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */
+ /* Bit 101 Linear B Syllabary */
+ /* Linear B Ideograms */
+ /* Aegean Numbers */
+#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/
+ /*U+10080-U+100FF*/
+ /*U+10100-U+1013F*/
+ /* Bit 102 Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/
+ /* Bit 103 Ugaritic */
+#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/
+ /* Bit 104 Old Persian */
+#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/
+ /* Bit 105 Shavian */
+#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/
+ /* Bit 106 Osmanya */
+#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/
+ /* Bit 107 Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/
+ /* Bit 108 Kharoshthi */
+#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/
+ /* Bit 109 Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/
+ /* Bit 110 Cuneiform */
+ /* Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/
+ /*U+12400-U+1247F*/
+ /* Bit 111 Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/
+ /* Bit 112 Sundanese */
+#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */
+ /* Bit 113 Lepcha */
+#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */
+ /* Bit 114 Ol Chiki */
+#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */
+ /* Bit 115 Saurashtra */
+#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */
+ /* Bit 116 Kayah Li */
+#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */
+ /* Bit 117 Rejang */
+#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */
+ /* Bit 118 Cham */
+#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */
+ /* Bit 119 Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/
+ /* Bit 120 Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/
+ /* Bit 121 Carian */
+ /* Lycian */
+ /* Lydian */
+#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/
+ /*U+10280-U+1029F*/
+ /*U+10920-U+1093F*/
+ /* Bit 122 Domino Tiles */
+ /* Mahjong Tiles */
+#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/
+ /*U+1F000-U+1F02F*/
+ /* Bit 123-127 Reserved for process-internal usage */
+
+
+ /*************************************************************************/
+ /* */
+ /* Some compilers have a very limited length of identifiers. */
+ /* */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Here some alias #defines in order to be clearer. */
+ /* */
+ /* These are not always #defined to stay within the 31~character limit */
+ /* which some compilers have. */
+ /* */
+ /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */
+ /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */
+ /* If you get a warning with such a compiler, use the -i40 switch. */
+ /* */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \
+ TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \
+ TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS \
+ TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+ TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
new file mode 100644
index 0000000000..c620550254
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
@@ -0,0 +1,777 @@
+/***************************************************************************/
+/* */
+/* tttables.h */
+/* */
+/* Basic SFNT/TrueType tables definitions and interface */
+/* (specification only). */
+/* */
+/* Copyright 1996-2005, 2008-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+ /* <Title> */
+ /* TrueType Tables */
+ /* */
+ /* <Abstract> */
+ /* TrueType specific table types and functions. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of TrueType-specific tables */
+ /* as well as some routines used to access and process them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Header */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType font header table. All */
+ /* fields follow the TrueType specification. */
+ /* */
+ typedef struct TT_Header_
+ {
+ FT_Fixed Table_Version;
+ FT_Fixed Font_Revision;
+
+ FT_Long CheckSum_Adjust;
+ FT_Long Magic_Number;
+
+ FT_UShort Flags;
+ FT_UShort Units_Per_EM;
+
+ FT_Long Created [2];
+ FT_Long Modified[2];
+
+ FT_Short xMin;
+ FT_Short yMin;
+ FT_Short xMax;
+ FT_Short yMax;
+
+ FT_UShort Mac_Style;
+ FT_UShort Lowest_Rec_PPEM;
+
+ FT_Short Font_Direction;
+ FT_Short Index_To_Loc_Format;
+ FT_Short Glyph_Data_Format;
+
+ } TT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_HoriHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType horizontal header, the `hhea' */
+ /* table, as well as the corresponding horizontal metrics table, */
+ /* i.e., the `hmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of all */
+ /* glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' field */
+ /* of the OS/2 table instead if you want */
+ /* the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the distance */
+ /* from the baseline to the bottom-most of */
+ /* all glyph points found in the font. It */
+ /* is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Width_Max :: This field is the maximum of all advance */
+ /* widths found in the font. It can be */
+ /* used to compute the maximum width of an */
+ /* arbitrary string of text. */
+ /* */
+ /* min_Left_Side_Bearing :: The minimum left side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Right_Side_Bearing :: The minimum right side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* xMax_Extent :: The maximum horizontal extent (i.e., the */
+ /* `width' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */
+ /* table -- this value can be smaller than */
+ /* the total number of glyphs in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_HoriHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Width_Max; /* advance width maximum */
+
+ FT_Short min_Left_Side_Bearing; /* minimum left-sb */
+ FT_Short min_Right_Side_Bearing; /* minimum right-sb */
+ FT_Short xMax_Extent; /* xmax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_HMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they are used to connect the metrics header to the relevant */
+ /* `HMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_HoriHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_VertHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType vertical header, the `vhea' */
+ /* table, as well as the corresponding vertical metrics table, i.e., */
+ /* the `vmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of */
+ /* all glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the */
+ /* distance from the baseline to the */
+ /* bottom-most of all glyph points found */
+ /* in the font. It is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Height_Max :: This field is the maximum of all */
+ /* advance heights found in the font. It */
+ /* can be used to compute the maximum */
+ /* height of an arbitrary string of text. */
+ /* */
+ /* min_Top_Side_Bearing :: The minimum top side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* yMax_Extent :: The maximum vertical extent (i.e., the */
+ /* `height' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* caret_Offset :: The cursor's offset for slanted fonts. */
+ /* This value is `reserved' in vmtx */
+ /* version 1.0. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of VMetrics entries in the */
+ /* `vmtx' table -- this value can be */
+ /* smaller than the total number of glyphs */
+ /* in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_VertHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Height_Max; /* advance height maximum */
+
+ FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */
+ FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */
+ FT_Short yMax_Extent; /* xmax or ymax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_VMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they're used to connect the metrics header to the relevant */
+ /* `HMTX' or `VMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_VertHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_OS2 */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType OS/2 table. This is the long */
+ /* table version. All fields comply to the TrueType specification. */
+ /* */
+ /* Note that we now support old Mac fonts which do not include an */
+ /* OS/2 table. In this case, the `version' field is always set to */
+ /* 0xFFFF. */
+ /* */
+ typedef struct TT_OS2_
+ {
+ FT_UShort version; /* 0x0001 - more or 0xFFFF */
+ FT_Short xAvgCharWidth;
+ FT_UShort usWeightClass;
+ FT_UShort usWidthClass;
+ FT_Short fsType;
+ FT_Short ySubscriptXSize;
+ FT_Short ySubscriptYSize;
+ FT_Short ySubscriptXOffset;
+ FT_Short ySubscriptYOffset;
+ FT_Short ySuperscriptXSize;
+ FT_Short ySuperscriptYSize;
+ FT_Short ySuperscriptXOffset;
+ FT_Short ySuperscriptYOffset;
+ FT_Short yStrikeoutSize;
+ FT_Short yStrikeoutPosition;
+ FT_Short sFamilyClass;
+
+ FT_Byte panose[10];
+
+ FT_ULong ulUnicodeRange1; /* Bits 0-31 */
+ FT_ULong ulUnicodeRange2; /* Bits 32-63 */
+ FT_ULong ulUnicodeRange3; /* Bits 64-95 */
+ FT_ULong ulUnicodeRange4; /* Bits 96-127 */
+
+ FT_Char achVendID[4];
+
+ FT_UShort fsSelection;
+ FT_UShort usFirstCharIndex;
+ FT_UShort usLastCharIndex;
+ FT_Short sTypoAscender;
+ FT_Short sTypoDescender;
+ FT_Short sTypoLineGap;
+ FT_UShort usWinAscent;
+ FT_UShort usWinDescent;
+
+ /* only version 1 tables: */
+
+ FT_ULong ulCodePageRange1; /* Bits 0-31 */
+ FT_ULong ulCodePageRange2; /* Bits 32-63 */
+
+ /* only version 2 tables: */
+
+ FT_Short sxHeight;
+ FT_Short sCapHeight;
+ FT_UShort usDefaultChar;
+ FT_UShort usBreakChar;
+ FT_UShort usMaxContext;
+
+ } TT_OS2;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Postscript */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PostScript table. All fields */
+ /* comply to the TrueType specification. This structure does not */
+ /* reference the PostScript glyph names, which can be nevertheless */
+ /* accessed with the `ttpost' module. */
+ /* */
+ typedef struct TT_Postscript_
+ {
+ FT_Fixed FormatType;
+ FT_Fixed italicAngle;
+ FT_Short underlinePosition;
+ FT_Short underlineThickness;
+ FT_ULong isFixedPitch;
+ FT_ULong minMemType42;
+ FT_ULong maxMemType42;
+ FT_ULong minMemType1;
+ FT_ULong maxMemType1;
+
+ /* Glyph names follow in the file, but we don't */
+ /* load them by default. See the ttpost.c file. */
+
+ } TT_Postscript;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_PCLT */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PCLT table. All fields */
+ /* comply to the TrueType specification. */
+ /* */
+ typedef struct TT_PCLT_
+ {
+ FT_Fixed Version;
+ FT_ULong FontNumber;
+ FT_UShort Pitch;
+ FT_UShort xHeight;
+ FT_UShort Style;
+ FT_UShort TypeFamily;
+ FT_UShort CapHeight;
+ FT_UShort SymbolSet;
+ FT_Char TypeFace[16];
+ FT_Char CharacterComplement[8];
+ FT_Char FileName[6];
+ FT_Char StrokeWeight;
+ FT_Char WidthType;
+ FT_Byte SerifStyle;
+ FT_Byte Reserved;
+
+ } TT_PCLT;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_MaxProfile */
+ /* */
+ /* <Description> */
+ /* The maximum profile is a table containing many max values which */
+ /* can be used to pre-allocate arrays. This ensures that no memory */
+ /* allocation occurs during a glyph load. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numGlyphs :: The number of glyphs in this TrueType */
+ /* font. */
+ /* */
+ /* maxPoints :: The maximum number of points in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositePoints'. */
+ /* */
+ /* maxContours :: The maximum number of contours in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositeContours'. */
+ /* */
+ /* maxCompositePoints :: The maximum number of points in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxPoints'. */
+ /* */
+ /* maxCompositeContours :: The maximum number of contours in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxContours'. */
+ /* */
+ /* maxZones :: The maximum number of zones used for */
+ /* glyph hinting. */
+ /* */
+ /* maxTwilightPoints :: The maximum number of points in the */
+ /* twilight zone used for glyph hinting. */
+ /* */
+ /* maxStorage :: The maximum number of elements in the */
+ /* storage area used for glyph hinting. */
+ /* */
+ /* maxFunctionDefs :: The maximum number of function */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxInstructionDefs :: The maximum number of instruction */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxStackElements :: The maximum number of stack elements used */
+ /* during bytecode interpretation. */
+ /* */
+ /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */
+ /* used for glyph hinting. */
+ /* */
+ /* maxComponentElements :: The maximum number of simple (i.e., non- */
+ /* composite) glyphs in a composite glyph. */
+ /* */
+ /* maxComponentDepth :: The maximum nesting depth of composite */
+ /* glyphs. */
+ /* */
+ /* <Note> */
+ /* This structure is only used during font loading. */
+ /* */
+ typedef struct TT_MaxProfile_
+ {
+ FT_Fixed version;
+ FT_UShort numGlyphs;
+ FT_UShort maxPoints;
+ FT_UShort maxContours;
+ FT_UShort maxCompositePoints;
+ FT_UShort maxCompositeContours;
+ FT_UShort maxZones;
+ FT_UShort maxTwilightPoints;
+ FT_UShort maxStorage;
+ FT_UShort maxFunctionDefs;
+ FT_UShort maxInstructionDefs;
+ FT_UShort maxStackElements;
+ FT_UShort maxSizeOfInstructions;
+ FT_UShort maxComponentElements;
+ FT_UShort maxComponentDepth;
+
+ } TT_MaxProfile;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Sfnt_Tag */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify the index of an SFNT table. */
+ /* Used in the @FT_Get_Sfnt_Table API function. */
+ /* */
+ typedef enum FT_Sfnt_Tag_
+ {
+ ft_sfnt_head = 0, /* TT_Header */
+ ft_sfnt_maxp = 1, /* TT_MaxProfile */
+ ft_sfnt_os2 = 2, /* TT_OS2 */
+ ft_sfnt_hhea = 3, /* TT_HoriHeader */
+ ft_sfnt_vhea = 4, /* TT_VertHeader */
+ ft_sfnt_post = 5, /* TT_Postscript */
+ ft_sfnt_pclt = 6, /* TT_PCLT */
+
+ sfnt_max /* internal end mark */
+
+ } FT_Sfnt_Tag;
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Table */
+ /* */
+ /* <Description> */
+ /* Return a pointer to a given SFNT table within a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source. */
+ /* */
+ /* tag :: The index of the SFNT table. */
+ /* */
+ /* <Return> */
+ /* A type-less pointer to the table. This will be~0 in case of */
+ /* error, or if the corresponding table was not found *OR* loaded */
+ /* from the file. */
+ /* */
+ /* Use a typecast according to `tag' to access the structure */
+ /* elements. */
+ /* */
+ /* <Note> */
+ /* The table is owned by the face object and disappears with it. */
+ /* */
+ /* This function is only useful to access SFNT tables that are loaded */
+ /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */
+ /* a list. */
+ /* */
+ /* Here an example how to access the `vhea' table: */
+ /* */
+ /* { */
+ /* TT_VertHeader* vert_header; */
+ /* */
+ /* */
+ /* vert_header = */
+ /* (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea ); */
+ /* } */
+ /* */
+ FT_EXPORT( void* )
+ FT_Get_Sfnt_Table( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Load_Sfnt_Table
+ *
+ * @description:
+ * Load any font table into client memory.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * tag ::
+ * The four-byte tag of the table to load. Use the value~0 if you want
+ * to access the whole font file. Otherwise, you can use one of the
+ * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+ * one with @FT_MAKE_TAG.
+ *
+ * offset ::
+ * The starting offset in the table (or file if tag == 0).
+ *
+ * @output:
+ * buffer ::
+ * The target buffer address. The client must ensure that the memory
+ * array is big enough to hold the data.
+ *
+ * @inout:
+ * length ::
+ * If the `length' parameter is NULL, then try to load the whole table.
+ * Return an error code if it fails.
+ *
+ * Else, if `*length' is~0, exit immediately while returning the
+ * table's (or file) full size in it.
+ *
+ * Else the number of bytes to read from the table or file, from the
+ * starting offset.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If you need to determine the table's length you should first call this
+ * function with `*length' set to~0, as in the following example:
+ *
+ * {
+ * FT_ULong length = 0;
+ *
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+ * if ( error ) { ... table does not exist ... }
+ *
+ * buffer = malloc( length );
+ * if ( buffer == NULL ) { ... not enough memory ... }
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+ * if ( error ) { ... could not load table ... }
+ * }
+ */
+ FT_EXPORT( FT_Error )
+ FT_Load_Sfnt_Table( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Sfnt_Table_Info
+ *
+ * @description:
+ * Return information on an SFNT table.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * table_index ::
+ * The index of an SFNT table. The function returns
+ * FT_Err_Table_Missing for an invalid value.
+ *
+ * @inout:
+ * tag ::
+ * The name tag of the SFNT table. If the value is NULL, `table_index'
+ * is ignored, and `length' returns the number of SFNT tables in the
+ * font.
+ *
+ * @output:
+ * length ::
+ * The length of the SFNT table (or the number of SFNT tables, depending
+ * on `tag').
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * While parsing fonts, FreeType handles SFNT tables with length zero as
+ * missing.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Sfnt_Table_Info( FT_Face face,
+ FT_UInt table_index,
+ FT_ULong *tag,
+ FT_ULong *length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Language_ID */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap language ID. Definitions of */
+ /* language ID values are in `freetype/ttnameid.h'. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The language ID of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, just return~0 as the default value. */
+ /* */
+ /* For a format~14 cmap (to access Unicode IVS), the return value is */
+ /* 0xFFFFFFFF. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_CMap_Language_ID( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Format */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap format. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The format of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, return -1. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_Get_CMap_Format( FT_CharMap charmap );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
new file mode 100644
index 0000000000..ac7de2ad79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
@@ -0,0 +1,109 @@
+/***************************************************************************/
+/* */
+/* tttags.h */
+/* */
+/* Tags for TrueType and OpenType tables (specification only). */
+/* */
+/* Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
+#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
+#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
new file mode 100644
index 0000000000..08e27599fa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/* */
+/* ttunpat.h */
+/* */
+/* Definitions for the unpatented TrueType hinting system */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* Written by Graham Asher <graham.asher@btinternet.com> */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_UNPATENTED_HINTING
+ *
+ * @description:
+ * A constant used as the tag of an @FT_Parameter structure to indicate
+ * that unpatented methods only should be used by the TrueType bytecode
+ * interpreter for a typeface opened by @FT_Open_Face.
+ *
+ */
+#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
new file mode 100644
index 0000000000..1fc812153f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* ft2build.h */
+/* */
+/* FreeType 2 build and setup macros. */
+/* (Generic version) */
+/* */
+/* Copyright 1996-2001, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file corresponds to the default `ft2build.h' file for */
+ /* FreeType 2. It uses the `freetype' include root. */
+ /* */
+ /* Note that specific platforms might use a different configuration. */
+ /* See builds/unix/ft2unix.h for an example. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include "foxitnames.h"
+#include "freetype/config/ftheader.h"
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
new file mode 100644
index 0000000000..832e8b8424
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
@@ -0,0 +1,60 @@
+# FreeType 2 src/base Jamfile
+#
+# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) base ;
+
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftadvanc ftcalc ftdbgmem ftgloadr
+ ftobjs ftoutln ftrfork ftsnames
+ ftstream fttrigon ftutil
+ basepic ftpic
+ ;
+ }
+ else
+ {
+ _sources = ftbase ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# Add the optional/replaceable files.
+#
+{
+ local _sources = bbox bdf bitmap debug gasp
+ glyph gxval init lcdfil mm
+ otval pfr stroke synth system
+ type1 winfnt xf86 patent
+ ;
+
+ Library $(FT2_LIB) : ft$(_sources).c ;
+}
+
+# Add Macintosh-specific file to the library when necessary.
+#
+if $(MAC)
+{
+ Library $(FT2_LIB) : ftmac.c ;
+}
+else if $(OS) = MACOSX
+{
+ if $(FT2_MULTI)
+ {
+ Library $(FT2_LIB) : ftmac.c ;
+ }
+}
+
+# end of src/base Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
new file mode 100644
index 0000000000..d6fc01cce8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/* */
+/* basepic.c */
+/* */
+/* The FreeType position independent code services for base. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftglyph.c */
+ void
+ FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class* clazz );
+
+ void
+ FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class* clazz );
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ /* forward declaration of PIC init function from ftrfork.c */
+ /* (not modularized) */
+ void
+ FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec* record );
+#endif
+
+ /* forward declaration of PIC init functions from ftinit.c */
+ FT_Error
+ ft_create_default_module_classes( FT_Library library );
+
+ void
+ ft_destroy_default_module_classes( FT_Library library );
+
+
+ void
+ ft_base_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->base )
+ {
+ /* destroy default module classes */
+ /* (in case FT_Add_Default_Modules was used) */
+ ft_destroy_default_module_classes( library );
+
+ FT_FREE( pic_container->base );
+ pic_container->base = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_base_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ BasePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->base = container;
+
+ /* initialize default modules list and pointers */
+ error = ft_create_default_module_classes( library );
+ if ( error )
+ goto Exit;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_outline_glyph_class(
+ &container->ft_outline_glyph_class );
+ FT_Init_Class_ft_bitmap_glyph_class(
+ &container->ft_bitmap_glyph_class );
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ FT_Init_Table_raccess_guess_table(
+ (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );
+#endif
+
+ Exit:
+ if ( error )
+ ft_base_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
new file mode 100644
index 0000000000..e2308cad26
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
@@ -0,0 +1,90 @@
+/***************************************************************************/
+/* */
+/* basepic.h */
+/* */
+/* The FreeType position independent code services for base. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __BASEPIC_H__
+#define __BASEPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class
+#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class
+#define FT_DEFAULT_MODULES_GET ft_default_modules
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table
+#endif
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftglyph.h"
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#include "../../include/freetype/internal/ftrfork.h"
+#endif
+
+
+ typedef struct BasePIC_
+ {
+ FT_Module_Class** default_module_classes;
+ FT_Glyph_Class ft_outline_glyph_class;
+ FT_Glyph_Class ft_bitmap_glyph_class;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+ ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES];
+#endif
+
+ } BasePIC;
+
+
+#define GET_PIC( lib ) ( (BasePIC*)( (lib)->pic_container.base ) )
+
+#define FT_OUTLINE_GLYPH_CLASS_GET \
+ ( &GET_PIC( library )->ft_outline_glyph_class )
+#define FT_BITMAP_GLYPH_CLASS_GET \
+ ( &GET_PIC( library )->ft_bitmap_glyph_class )
+#define FT_DEFAULT_MODULES_GET \
+ ( GET_PIC( library )->default_module_classes )
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET \
+ ( GET_PIC( library )->ft_raccess_guess_table )
+#endif
+
+
+ /* see basepic.c for the implementation */
+ void
+ ft_base_pic_free( FT_Library library );
+
+ FT_Error
+ ft_base_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __BASEPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
new file mode 100644
index 0000000000..652e51b1ed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
@@ -0,0 +1,162 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.c */
+/* */
+/* Quick computation of advance widths (body). */
+/* */
+/* Copyright 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftadvanc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ static FT_Error
+ _ft_face_scale_advances( FT_Face face,
+ FT_Fixed* advances,
+ FT_UInt count,
+ FT_Int32 flags )
+ {
+ FT_Fixed scale;
+ FT_UInt nn;
+
+
+ if ( flags & FT_LOAD_NO_SCALE )
+ return FT_Err_Ok;
+
+ if ( face->size == NULL )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ scale = face->size->metrics.y_scale;
+ else
+ scale = face->size->metrics.x_scale;
+
+ /* this must be the same scaling as to get linear{Hori,Vert}Advance */
+ /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */
+
+ for ( nn = 0; nn < count; nn++ )
+ advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* at the moment, we can perform fast advance retrieval only in */
+ /* the following cases: */
+ /* */
+ /* - unscaled load */
+ /* - unhinted load */
+ /* - light-hinted load */
+
+#define LOAD_ADVANCE_FAST_CHECK( flags ) \
+ ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \
+ FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
+
+
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Int32 flags,
+ FT_Fixed *padvance )
+ {
+ FT_Face_GetAdvancesFunc func;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( gindex >= (FT_UInt)face->num_glyphs )
+ return FT_THROW( Invalid_Glyph_Index );
+
+ func = face->driver->clazz->get_advances;
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+ {
+ FT_Error error;
+
+
+ error = func( face, gindex, 1, flags, padvance );
+ if ( !error )
+ return _ft_face_scale_advances( face, padvance, 1, flags );
+
+ if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+ return error;
+ }
+
+ return FT_Get_Advances( face, gindex, 1, flags, padvance );
+ }
+
+
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed *padvances )
+ {
+ FT_Face_GetAdvancesFunc func;
+ FT_UInt num, end, nn;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ num = (FT_UInt)face->num_glyphs;
+ end = start + count;
+ if ( start >= num || end < start || end > num )
+ return FT_THROW( Invalid_Glyph_Index );
+
+ if ( count == 0 )
+ return FT_Err_Ok;
+
+ func = face->driver->clazz->get_advances;
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+ {
+ error = func( face, start, count, flags, padvances );
+ if ( !error )
+ return _ft_face_scale_advances( face, padvances, count, flags );
+
+ if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+ return error;
+ }
+
+ error = FT_Err_Ok;
+
+ if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+ return FT_THROW( Unimplemented_Feature );
+
+ flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = FT_Load_Glyph( face, start + nn, flags );
+ if ( error )
+ break;
+
+ /* scale from 26.6 to 16.16 */
+ padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? face->glyph->advance.y << 10
+ : face->glyph->advance.x << 10;
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
new file mode 100644
index 0000000000..9ab64628d1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
@@ -0,0 +1,121 @@
+/***************************************************************************/
+/* */
+/* ftapi.c */
+/* */
+/* The FreeType compatibility functions (body). */
+/* */
+/* Copyright 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/ftoutln.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** C O M P A T I B I L I T Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* backwards compatibility API */
+
+ FT_BASE_DEF( void )
+ FT_New_Memory_Stream( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Stream stream )
+ {
+ FT_UNUSED( library );
+
+ FT_Stream_OpenMemory( stream, base, size );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Seek_Stream( FT_Stream stream,
+ FT_ULong pos )
+ {
+ return FT_Stream_Seek( stream, pos );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Skip_Stream( FT_Stream stream,
+ FT_Long distance )
+ {
+ return FT_Stream_Skip( stream, distance );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Read_Stream( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_Read( stream, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Read_Stream_At( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_ReadAt( stream, pos, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Extract_Frame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes )
+ {
+ return FT_Stream_ExtractFrame( stream, count, pbytes );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Release_Frame( FT_Stream stream,
+ FT_Byte** pbytes )
+ {
+ FT_Stream_ReleaseFrame( stream, pbytes );
+ }
+
+ FT_BASE_DEF( FT_Error )
+ FT_Access_Frame( FT_Stream stream,
+ FT_ULong count )
+ {
+ return FT_Stream_EnterFrame( stream, count );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Forget_Frame( FT_Stream stream )
+ {
+ FT_Stream_ExitFrame( stream );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
new file mode 100644
index 0000000000..dced300f76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/* */
+/* ftbase.h */
+/* */
+/* The FreeType private functions used in base module (specification). */
+/* */
+/* Copyright 2008, 2010 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBASE_H__
+#define __FTBASE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */
+ /* font, and try to load a face specified by the face_index. */
+ FT_LOCAL( FT_Error )
+ open_face_PS_from_sfnt_stream( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter *params,
+ FT_Face *aface );
+
+
+ /* Create a new FT_Face given a buffer and a driver name. */
+ /* From ftmac.c. */
+ FT_LOCAL( FT_Error )
+ open_face_from_buffer( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Long face_index,
+ const char* driver_name,
+ FT_Face *aface );
+
+
+#if defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \
+ !defined( FT_MACINTOSH )
+ /* Mac OS X/Darwin kernel often changes recommended method to access */
+ /* the resource fork and older methods makes the kernel issue the */
+ /* warning of deprecated method. To calm it down, the methods based */
+ /* on Darwin VFS should be grouped and skip the rest methods after */
+ /* the case the resource is opened but found to lack a font in it. */
+ FT_LOCAL( FT_Bool )
+ ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt rule_index );
+#endif
+
+
+FT_END_HEADER
+
+#endif /* __FTBASE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
new file mode 100644
index 0000000000..a5862c5b91
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
@@ -0,0 +1,649 @@
+/***************************************************************************/
+/* */
+/* ftbbox.c */
+/* */
+/* FreeType bbox computation (body). */
+/* */
+/* Copyright 1996-2002, 2004, 2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component has a _single_ role: to compute exact outline bounding */
+ /* boxes. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftbbox.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ typedef struct TBBox_Rec_
+ {
+ FT_Vector last;
+ FT_BBox bbox;
+
+ } TBBox_Rec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Move_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `move_to' and `line_to' emitter during */
+ /* FT_Outline_Decompose(). It simply records the destination point */
+ /* in `user->last'; no further computations are necessary since we */
+ /* use the cbox as the starting bbox which must be refined. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: A pointer to the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ static int
+ BBox_Move_To( FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ user->last = *to;
+
+ return 0;
+ }
+
+
+#define CHECK_X( p, bbox ) \
+ ( p->x < bbox.xMin || p->x > bbox.xMax )
+
+#define CHECK_Y( p, bbox ) \
+ ( p->y < bbox.yMin || p->y > bbox.yMax )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Conic_Check */
+ /* */
+ /* <Description> */
+ /* Finds the extrema of a 1-dimensional conic Bezier curve and update */
+ /* a bounding range. This version uses direct computation, as it */
+ /* doesn't need square roots. */
+ /* */
+ /* <Input> */
+ /* y1 :: The start coordinate. */
+ /* */
+ /* y2 :: The coordinate of the control point. */
+ /* */
+ /* y3 :: The end coordinate. */
+ /* */
+ /* <InOut> */
+ /* min :: The address of the current minimum. */
+ /* */
+ /* max :: The address of the current maximum. */
+ /* */
+ static void
+ BBox_Conic_Check( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ if ( y1 <= y3 && y2 == y1 ) /* flat arc */
+ goto Suite;
+
+ if ( y1 < y3 )
+ {
+ if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */
+ goto Suite;
+ }
+ else
+ {
+ if ( y2 >= y3 && y2 <= y1 ) /* descending arc */
+ {
+ y2 = y1;
+ y1 = y3;
+ y3 = y2;
+ goto Suite;
+ }
+ }
+
+ y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );
+
+ Suite:
+ if ( y1 < *min ) *min = y1;
+ if ( y3 > *max ) *max = y3;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Conic_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `conic_to' emitter during */
+ /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */
+ /* current bounding box, and computes its extrema if necessary to */
+ /* update it. */
+ /* */
+ /* <Input> */
+ /* control :: A pointer to a control point. */
+ /* */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: The address of the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ /* <Note> */
+ /* In the case of a non-monotonous arc, we compute directly the */
+ /* extremum coordinates, as it is sufficiently fast. */
+ /* */
+ static int
+ BBox_Conic_To( FT_Vector* control,
+ FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ /* we don't need to check `to' since it is always an `on' point, thus */
+ /* within the bbox */
+
+ if ( CHECK_X( control, user->bbox ) )
+ BBox_Conic_Check( user->last.x,
+ control->x,
+ to->x,
+ &user->bbox.xMin,
+ &user->bbox.xMax );
+
+ if ( CHECK_Y( control, user->bbox ) )
+ BBox_Conic_Check( user->last.y,
+ control->y,
+ to->y,
+ &user->bbox.yMin,
+ &user->bbox.yMax );
+
+ user->last = *to;
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Cubic_Check */
+ /* */
+ /* <Description> */
+ /* Finds the extrema of a 1-dimensional cubic Bezier curve and */
+ /* updates a bounding range. This version uses splitting because we */
+ /* don't want to use square roots and extra accuracy. */
+ /* */
+ /* <Input> */
+ /* p1 :: The start coordinate. */
+ /* */
+ /* p2 :: The coordinate of the first control point. */
+ /* */
+ /* p3 :: The coordinate of the second control point. */
+ /* */
+ /* p4 :: The end coordinate. */
+ /* */
+ /* <InOut> */
+ /* min :: The address of the current minimum. */
+ /* */
+ /* max :: The address of the current maximum. */
+ /* */
+
+#if 0
+
+ static void
+ BBox_Cubic_Check( FT_Pos p1,
+ FT_Pos p2,
+ FT_Pos p3,
+ FT_Pos p4,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ FT_Pos q1, q2, q3, q4;
+
+
+ q1 = p1;
+ q2 = p2;
+ q3 = p3;
+ q4 = p4;
+
+ /* for a conic segment to possibly reach new maximum */
+ /* one of its off-points must be above the current value */
+ while ( q2 > *max || q3 > *max )
+ {
+ /* determine which half contains the maximum and split */
+ if ( q1 + q2 > q3 + q4 ) /* first half */
+ {
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q2 = q2 + q1;
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q4 = ( q4 + q3 ) / 8;
+ q3 = q3 / 4;
+ q2 = q2 / 2;
+ }
+ else /* second half */
+ {
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q3 = q3 + q4;
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q1 = ( q1 + q2 ) / 8;
+ q2 = q2 / 4;
+ q3 = q3 / 2;
+ }
+
+ /* check if either end reached the maximum */
+ if ( q1 == q2 && q1 >= q3 )
+ {
+ *max = q1;
+ break;
+ }
+ if ( q3 == q4 && q2 <= q4 )
+ {
+ *max = q4;
+ break;
+ }
+ }
+
+ q1 = p1;
+ q2 = p2;
+ q3 = p3;
+ q4 = p4;
+
+ /* for a conic segment to possibly reach new minimum */
+ /* one of its off-points must be below the current value */
+ while ( q2 < *min || q3 < *min )
+ {
+ /* determine which half contains the minimum and split */
+ if ( q1 + q2 < q3 + q4 ) /* first half */
+ {
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q2 = q2 + q1;
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q4 = ( q4 + q3 ) / 8;
+ q3 = q3 / 4;
+ q2 = q2 / 2;
+ }
+ else /* second half */
+ {
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q3 = q3 + q4;
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q1 = ( q1 + q2 ) / 8;
+ q2 = q2 / 4;
+ q3 = q3 / 2;
+ }
+
+ /* check if either end reached the minimum */
+ if ( q1 == q2 && q1 <= q3 )
+ {
+ *min = q1;
+ break;
+ }
+ if ( q3 == q4 && q2 >= q4 )
+ {
+ *min = q4;
+ break;
+ }
+ }
+ }
+
+#else
+
+ static void
+ test_cubic_extrema( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos y4,
+ FT_Fixed u,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */
+ FT_Pos b = y3 - 2*y2 + y1;
+ FT_Pos c = y2 - y1;
+ FT_Pos d = y1;
+ FT_Pos y;
+ FT_Fixed uu;
+
+ FT_UNUSED ( y4 );
+
+
+ /* The polynomial is */
+ /* */
+ /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */
+ /* */
+ /* dP/dx = 3a*x^2 + 6b*x + 3c . */
+ /* */
+ /* However, we also have */
+ /* */
+ /* dP/dx(u) = 0 , */
+ /* */
+ /* which implies by subtraction that */
+ /* */
+ /* P(u) = b*u^2 + 2c*u + d . */
+
+ if ( u > 0 && u < 0x10000L )
+ {
+ uu = FT_MulFix( u, u );
+ y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );
+
+ if ( y < *min ) *min = y;
+ if ( y > *max ) *max = y;
+ }
+ }
+
+
+ static void
+ BBox_Cubic_Check( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos y4,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ /* always compare first and last points */
+ if ( y1 < *min ) *min = y1;
+ else if ( y1 > *max ) *max = y1;
+
+ if ( y4 < *min ) *min = y4;
+ else if ( y4 > *max ) *max = y4;
+
+ /* now, try to see if there are split points here */
+ if ( y1 <= y4 )
+ {
+ /* flat or ascending arc test */
+ if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )
+ return;
+ }
+ else /* y1 > y4 */
+ {
+ /* descending arc test */
+ if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )
+ return;
+ }
+
+ /* There are some split points. Find them. */
+ /* We already made sure that a, b, and c below cannot be all zero. */
+ {
+ FT_Pos a = y4 - 3*y3 + 3*y2 - y1;
+ FT_Pos b = y3 - 2*y2 + y1;
+ FT_Pos c = y2 - y1;
+ FT_Pos d;
+ FT_Fixed t;
+ FT_Int shift;
+
+
+ /* We need to solve `ax^2+2bx+c' here, without floating points! */
+ /* The trick is to normalize to a different representation in order */
+ /* to use our 16.16 fixed-point routines. */
+ /* */
+ /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */
+ /* These values must fit into a single 16.16 value. */
+ /* */
+ /* We normalize a, b, and c to `8.16' fixed-point values to ensure */
+ /* that their product is held in a `16.16' value including the sign. */
+ /* Necessarily, we need to shift `a', `b', and `c' so that the most */
+ /* significant bit of their absolute values is at position 22. */
+ /* */
+ /* This also means that we are using 23 bits of precision to compute */
+ /* the zeros, independently of the range of the original polynomial */
+ /* coefficients. */
+ /* */
+ /* This algorithm should ensure reasonably accurate values for the */
+ /* zeros. Note that they are only expressed with 16 bits when */
+ /* computing the extrema (the zeros need to be in 0..1 exclusive */
+ /* to be considered part of the arc). */
+
+ shift = FT_MSB( FT_ABS( a ) | FT_ABS( b ) | FT_ABS( c ) );
+
+ if ( shift > 22 )
+ {
+ shift -= 22;
+
+ /* this loses some bits of precision, but we use 23 of them */
+ /* for the computation anyway */
+ a >>= shift;
+ b >>= shift;
+ c >>= shift;
+ }
+ else
+ {
+ shift = 22 - shift;
+
+ a <<= shift;
+ b <<= shift;
+ c <<= shift;
+ }
+
+ /* handle a == 0 */
+ if ( a == 0 )
+ {
+ if ( b != 0 )
+ {
+ t = - FT_DivFix( c, b ) / 2;
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ }
+ else
+ {
+ /* solve the equation now */
+ d = FT_MulFix( b, b ) - FT_MulFix( a, c );
+ if ( d < 0 )
+ return;
+
+ if ( d == 0 )
+ {
+ /* there is a single split point at -b/a */
+ t = - FT_DivFix( b, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ else
+ {
+ /* there are two solutions; we need to filter them */
+ d = FT_SqrtFixed( (FT_Int32)d );
+ t = - FT_DivFix( b - d, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+
+ t = - FT_DivFix( b + d, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ }
+ }
+ }
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Cubic_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `cubic_to' emitter during */
+ /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */
+ /* current bounding box, and computes its extrema if necessary to */
+ /* update it. */
+ /* */
+ /* <Input> */
+ /* control1 :: A pointer to the first control point. */
+ /* */
+ /* control2 :: A pointer to the second control point. */
+ /* */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: The address of the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ /* <Note> */
+ /* In the case of a non-monotonous arc, we don't compute directly */
+ /* extremum coordinates, we subdivide instead. */
+ /* */
+ static int
+ BBox_Cubic_To( FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ /* we don't need to check `to' since it is always an `on' point, thus */
+ /* within the bbox */
+
+ if ( CHECK_X( control1, user->bbox ) ||
+ CHECK_X( control2, user->bbox ) )
+ BBox_Cubic_Check( user->last.x,
+ control1->x,
+ control2->x,
+ to->x,
+ &user->bbox.xMin,
+ &user->bbox.xMax );
+
+ if ( CHECK_Y( control1, user->bbox ) ||
+ CHECK_Y( control2, user->bbox ) )
+ BBox_Cubic_Check( user->last.y,
+ control1->y,
+ control2->y,
+ to->y,
+ &user->bbox.yMin,
+ &user->bbox.yMax );
+
+ user->last = *to;
+
+ return 0;
+ }
+
+FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
+ (FT_Outline_MoveTo_Func) BBox_Move_To,
+ (FT_Outline_LineTo_Func) BBox_Move_To,
+ (FT_Outline_ConicTo_Func)BBox_Conic_To,
+ (FT_Outline_CubicTo_Func)BBox_Cubic_To,
+ 0, 0
+ )
+
+ /* documentation is in ftbbox.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Get_BBox( FT_Outline* outline,
+ FT_BBox *abbox )
+ {
+ FT_BBox cbox;
+ FT_BBox bbox;
+ FT_Vector* vec;
+ FT_UShort n;
+
+
+ if ( !abbox )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !outline )
+ return FT_THROW( Invalid_Outline );
+
+ /* if outline is empty, return (0,0,0,0) */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ {
+ abbox->xMin = abbox->xMax = 0;
+ abbox->yMin = abbox->yMax = 0;
+ return 0;
+ }
+
+ /* We compute the control box as well as the bounding box of */
+ /* all `on' points in the outline. Then, if the two boxes */
+ /* coincide, we exit immediately. */
+
+ vec = outline->points;
+ bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;
+ bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;
+ vec++;
+
+ for ( n = 1; n < outline->n_points; n++ )
+ {
+ FT_Pos x = vec->x;
+ FT_Pos y = vec->y;
+
+
+ /* update control box */
+ if ( x < cbox.xMin ) cbox.xMin = x;
+ if ( x > cbox.xMax ) cbox.xMax = x;
+
+ if ( y < cbox.yMin ) cbox.yMin = y;
+ if ( y > cbox.yMax ) cbox.yMax = y;
+
+ if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
+ {
+ /* update bbox for `on' points only */
+ if ( x < bbox.xMin ) bbox.xMin = x;
+ if ( x > bbox.xMax ) bbox.xMax = x;
+
+ if ( y < bbox.yMin ) bbox.yMin = y;
+ if ( y > bbox.yMax ) bbox.yMax = y;
+ }
+
+ vec++;
+ }
+
+ /* test two boxes for equality */
+ if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
+ cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
+ {
+ /* the two boxes are different, now walk over the outline to */
+ /* get the Bezier arc extrema. */
+
+ FT_Error error;
+ TBBox_Rec user;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Outline_Funcs bbox_interface;
+ Init_Class_bbox_interface(&bbox_interface);
+#endif
+
+ user.bbox = bbox;
+
+ error = FT_Outline_Decompose( outline, &bbox_interface, &user );
+ if ( error )
+ return error;
+
+ *abbox = user.bbox;
+ }
+ else
+ *abbox = bbox;
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
new file mode 100644
index 0000000000..60bc5fc2eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* ftbdf.c */
+/* */
+/* FreeType API for accessing BDF-specific strings (body). */
+/* */
+/* Copyright 2002-2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+
+
+ /* documentation is in ftbdf.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_BDF_Charset_ID( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry )
+ {
+ FT_Error error;
+ const char* encoding = NULL;
+ const char* registry = NULL;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face )
+ {
+ FT_Service_BDF service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, BDF );
+
+ if ( service && service->get_charset_id )
+ error = service->get_charset_id( face, &encoding, &registry );
+ }
+
+ if ( acharset_encoding )
+ *acharset_encoding = encoding;
+
+ if ( acharset_registry )
+ *acharset_registry = registry;
+
+ return error;
+ }
+
+
+ /* documentation is in ftbdf.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_BDF_Property( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty )
+ {
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ aproperty->type = BDF_PROPERTY_TYPE_NONE;
+
+ if ( face )
+ {
+ FT_Service_BDF service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, BDF );
+
+ if ( service && service->get_property )
+ error = service->get_property( face, prop_name, aproperty );
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
new file mode 100644
index 0000000000..0c773cfd27
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
@@ -0,0 +1,972 @@
+/***************************************************************************/
+/* */
+/* ftcalc.c */
+/* */
+/* Arithmetic computations (body). */
+/* */
+/* Copyright 1996-2006, 2008, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Support for 1-complement arithmetic has been totally dropped in this */
+ /* release. You can still write your own code if you need it. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Implementing basic computation routines. */
+ /* */
+ /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */
+ /* and FT_FloorFix() are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+/* we need to emulate a 64-bit data type if a real one isn't available */
+
+#ifndef FT_LONG64
+
+ typedef struct FT_Int64_
+ {
+ FT_UInt32 lo;
+ FT_UInt32 hi;
+
+ } FT_Int64;
+
+#endif /* !FT_LONG64 */
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_calc
+
+
+ /* The following three functions are available regardless of whether */
+ /* FT_LONG64 is defined. */
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_RoundFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL
+ : -((-a + 0x8000L ) & ~0xFFFFL );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_CeilFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL
+ : -((-a + 0xFFFFL ) & ~0xFFFFL );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_FloorFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? a & ~0xFFFFL
+ : -((-a) & ~0xFFFFL );
+ }
+
+
+ FT_BASE_DEF ( FT_Int )
+ FT_MSB( FT_UInt32 z )
+ {
+ FT_Int shift = 0;
+
+ /* determine msb bit index in `shift' */
+ if ( z >= ( 1L << 16 ) )
+ {
+ z >>= 16;
+ shift += 16;
+ }
+ if ( z >= ( 1L << 8 ) )
+ {
+ z >>= 8;
+ shift += 8;
+ }
+ if ( z >= ( 1L << 4 ) )
+ {
+ z >>= 4;
+ shift += 4;
+ }
+ if ( z >= ( 1L << 2 ) )
+ {
+ z >>= 2;
+ shift += 2;
+ }
+ if ( z >= ( 1L << 1 ) )
+ {
+ z >>= 1;
+ shift += 1;
+ }
+
+ return shift;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Fixed )
+ FT_Hypot( FT_Fixed x,
+ FT_Fixed y )
+ {
+ FT_Vector v;
+
+
+ v.x = x;
+ v.y = y;
+
+ return FT_Vector_Length( &v );
+ }
+
+
+#ifdef FT_LONG64
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ /* documentation is in freetype.h */
+ /* if defined FT_MULFIX_INLINED, use the inline FT_MULFIX_ASSEMBLER function. */
+#ifndef FT_MULFIX_INLINED
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b )
+ {
+#ifdef FT_MULFIX_ASSEMBLER
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
+#else
+
+ FT_Int s = 1;
+ FT_Long c;
+
+
+ if ( a < 0 )
+ {
+ a = -a;
+ s = -1;
+ }
+
+ if ( b < 0 )
+ {
+ b = -b;
+ s = -s;
+ }
+
+ c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
+
+ return ( s > 0 ) ? c : -c;
+
+#endif /* FT_MULFIX_ASSEMBLER */
+ }
+ #endif/* FT_MULFIX_INLINED */
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ s = 1;
+ if ( a < 0 )
+ {
+ a = -a;
+ s = -1;
+ }
+ if ( b < 0 )
+ {
+ b = -b;
+ s = -s;
+ }
+
+ if ( b == 0 )
+ /* check for division by 0 */
+ q = 0x7FFFFFFFL;
+ else
+ /* compute result directly */
+ q = (FT_UInt32)( ( ( (FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b );
+
+ return ( s < 0 ? -(FT_Long)q : (FT_Long)q );
+ }
+
+
+#else /* !FT_LONG64 */
+
+
+ static void
+ ft_multo64( FT_UInt32 x,
+ FT_UInt32 y,
+ FT_Int64 *z )
+ {
+ FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+
+
+ lo1 = x & 0x0000FFFFU; hi1 = x >> 16;
+ lo2 = y & 0x0000FFFFU; hi2 = y >> 16;
+
+ lo = lo1 * lo2;
+ i1 = lo1 * hi2;
+ i2 = lo2 * hi1;
+ hi = hi1 * hi2;
+
+ /* Check carry overflow of i1 + i2 */
+ i1 += i2;
+ hi += (FT_UInt32)( i1 < i2 ) << 16;
+
+ hi += i1 >> 16;
+ i1 = i1 << 16;
+
+ /* Check carry overflow of i1 + lo */
+ lo += i1;
+ hi += ( lo < i1 );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ static FT_UInt32
+ ft_div64by32( FT_UInt32 hi,
+ FT_UInt32 lo,
+ FT_UInt32 y )
+ {
+ FT_UInt32 r, q;
+ FT_Int i;
+
+
+ q = 0;
+ r = hi;
+
+ if ( r >= y )
+ return (FT_UInt32)0x7FFFFFFFL;
+
+ i = 32;
+ do
+ {
+ r <<= 1;
+ q <<= 1;
+ r |= lo >> 31;
+
+ if ( r >= y )
+ {
+ r -= y;
+ q |= 1;
+ }
+ lo <<= 1;
+ } while ( --i );
+
+ return q;
+ }
+
+
+ static void
+ FT_Add64( FT_Int64* x,
+ FT_Int64* y,
+ FT_Int64 *z )
+ {
+ register FT_UInt32 lo, hi;
+
+
+ lo = x->lo + y->lo;
+ hi = x->hi + y->hi + ( lo < x->lo );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ /* The FT_MulDiv function has been optimized thanks to ideas from */
+ /* Graham Asher. The trick is to optimize computation when everything */
+ /* fits within 32-bits (a rather common case). */
+ /* */
+ /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */
+ /* */
+ /* 46340 is FLOOR(SQRT(2^31-1)). */
+ /* */
+ /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */
+ /* */
+ /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */
+ /* */
+ /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */
+ /* */
+ /* and 2*0x157F0 = 176096 */
+ /* */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ long s;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ if ( a == 0 || b == c )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+ s ^= c; c = FT_ABS( c );
+
+ if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
+ a = ( a * b + ( c >> 1 ) ) / c;
+
+ else if ( (FT_Int32)c > 0 )
+ {
+ FT_Int64 temp, temp2;
+
+
+ ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+
+ temp2.hi = 0;
+ temp2.lo = (FT_UInt32)(c >> 1);
+ FT_Add64( &temp, &temp2, &temp );
+ a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+ }
+ else
+ a = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -a : a );
+ }
+
+
+ FT_BASE_DEF( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ long s;
+
+
+ if ( a == 0 || b == c )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+ s ^= c; c = FT_ABS( c );
+
+ if ( a <= 46340L && b <= 46340L && c > 0 )
+ a = a * b / c;
+
+ else if ( (FT_Int32)c > 0 )
+ {
+ FT_Int64 temp;
+
+
+ ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+ a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+ }
+ else
+ a = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -a : a );
+ }
+
+
+ /* documentation is in freetype.h */
+ #ifndef FT_MULFIX_INLINED
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b )
+ {
+#ifdef FT_MULFIX_ASSEMBLER
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
+#elif 0
+
+ /*
+ * This code is nonportable. See comment below.
+ *
+ * However, on a platform where right-shift of a signed quantity fills
+ * the leftmost bits by copying the sign bit, it might be faster.
+ */
+
+ FT_Long sa, sb;
+ FT_ULong ua, ub;
+
+
+ if ( a == 0 || b == 0x10000L )
+ return a;
+
+ /*
+ * This is a clever way of converting a signed number `a' into its
+ * absolute value (stored back into `a') and its sign. The sign is
+ * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
+ * was negative. (Similarly for `b' and `sb').
+ *
+ * Unfortunately, it doesn't work (at least not portably).
+ *
+ * It makes the assumption that right-shift on a negative signed value
+ * fills the leftmost bits by copying the sign bit. This is wrong.
+ * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
+ * the result of right-shift of a negative signed value is
+ * implementation-defined. At least one implementation fills the
+ * leftmost bits with 0s (i.e., it is exactly the same as an unsigned
+ * right shift). This means that when `a' is negative, `sa' ends up
+ * with the value 1 rather than -1. After that, everything else goes
+ * wrong.
+ */
+ sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );
+ a = ( a ^ sa ) - sa;
+ sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );
+ b = ( b ^ sb ) - sb;
+
+ ua = (FT_ULong)a;
+ ub = (FT_ULong)b;
+
+ if ( ua <= 2048 && ub <= 1048576L )
+ ua = ( ua * ub + 0x8000U ) >> 16;
+ else
+ {
+ FT_ULong al = ua & 0xFFFFU;
+
+
+ ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) +
+ ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );
+ }
+
+ sa ^= sb,
+ ua = (FT_ULong)(( ua ^ sa ) - sa);
+
+ return (FT_Long)ua;
+
+#else /* 0 */
+
+ FT_Long s;
+ FT_ULong ua, ub;
+
+
+ if ( a == 0 || b == 0x10000L )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+
+ ua = (FT_ULong)a;
+ ub = (FT_ULong)b;
+
+ if ( ua <= 2048 && ub <= 1048576L )
+ ua = ( ua * ub + 0x8000UL ) >> 16;
+ else
+ {
+ FT_ULong al = ua & 0xFFFFUL;
+
+
+ ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) +
+ ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );
+ }
+
+ return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );
+
+#endif /* 0 */
+
+ }
+#endif
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ s = (FT_Int32)a; a = FT_ABS( a );
+ s ^= (FT_Int32)b; b = FT_ABS( b );
+
+ if ( (FT_UInt32)b == 0 )
+ {
+ /* check for division by 0 */
+ q = (FT_UInt32)0x7FFFFFFFL;
+ }
+ else if ( ( a >> 16 ) == 0 )
+ {
+ /* compute result directly */
+ q = (FT_UInt32)( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;
+ }
+ else
+ {
+ /* we need more bits; we have to do it by hand */
+ FT_Int64 temp, temp2;
+
+
+ temp.hi = (FT_Int32)( a >> 16 );
+ temp.lo = (FT_UInt32)a << 16;
+ temp2.hi = 0;
+ temp2.lo = (FT_UInt32)( b >> 1 );
+ FT_Add64( &temp, &temp2, &temp );
+ q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );
+ }
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+
+#if 0
+
+ /* documentation is in ftcalc.h */
+
+ FT_EXPORT_DEF( void )
+ FT_MulTo64( FT_Int32 x,
+ FT_Int32 y,
+ FT_Int64 *z )
+ {
+ FT_Int32 s;
+
+
+ s = x; x = FT_ABS( x );
+ s ^= y; y = FT_ABS( y );
+
+ ft_multo64( x, y, z );
+
+ if ( s < 0 )
+ {
+ z->lo = (FT_UInt32)-(FT_Int32)z->lo;
+ z->hi = ~z->hi + !( z->lo );
+ }
+ }
+
+
+ /* apparently, the second version of this code is not compiled correctly */
+ /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */
+
+#if 1
+
+ FT_EXPORT_DEF( FT_Int32 )
+ FT_Div64by32( FT_Int64* x,
+ FT_Int32 y )
+ {
+ FT_Int32 s;
+ FT_UInt32 q, r, i, lo;
+
+
+ s = x->hi;
+ if ( s < 0 )
+ {
+ x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+ x->hi = ~x->hi + !x->lo;
+ }
+ s ^= y; y = FT_ABS( y );
+
+ /* Shortcut */
+ if ( x->hi == 0 )
+ {
+ if ( y > 0 )
+ q = x->lo / y;
+ else
+ q = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+ r = x->hi;
+ lo = x->lo;
+
+ if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */
+ return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );
+ /* Return Max/Min Int32 if division overflow. */
+ /* This includes division by zero! */
+ q = 0;
+ for ( i = 0; i < 32; i++ )
+ {
+ r <<= 1;
+ q <<= 1;
+ r |= lo >> 31;
+
+ if ( r >= (FT_UInt32)y )
+ {
+ r -= y;
+ q |= 1;
+ }
+ lo <<= 1;
+ }
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+#else /* 0 */
+
+ FT_EXPORT_DEF( FT_Int32 )
+ FT_Div64by32( FT_Int64* x,
+ FT_Int32 y )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ s = x->hi;
+ if ( s < 0 )
+ {
+ x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+ x->hi = ~x->hi + !x->lo;
+ }
+ s ^= y; y = FT_ABS( y );
+
+ /* Shortcut */
+ if ( x->hi == 0 )
+ {
+ if ( y > 0 )
+ q = ( x->lo + ( y >> 1 ) ) / y;
+ else
+ q = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+ q = ft_div64by32( x->hi, x->lo, y );
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+#endif /* 0 */
+
+#endif /* 0 */
+
+
+#endif /* FT_LONG64 */
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Matrix_Multiply( const FT_Matrix* a,
+ FT_Matrix *b )
+ {
+ FT_Fixed xx, xy, yx, yy;
+
+
+ if ( !a || !b )
+ return;
+
+ xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );
+ xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );
+ yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );
+ yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );
+
+ b->xx = xx; b->xy = xy;
+ b->yx = yx; b->yy = yy;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Matrix_Invert( FT_Matrix* matrix )
+ {
+ FT_Pos delta, xx, yy;
+
+
+ if ( !matrix )
+ return FT_THROW( Invalid_Argument );
+
+ /* compute discriminant */
+ delta = FT_MulFix( matrix->xx, matrix->yy ) -
+ FT_MulFix( matrix->xy, matrix->yx );
+
+ if ( !delta )
+ return FT_THROW( Invalid_Argument ); /* matrix can't be inverted */
+
+ matrix->xy = - FT_DivFix( matrix->xy, delta );
+ matrix->yx = - FT_DivFix( matrix->yx, delta );
+
+ xx = matrix->xx;
+ yy = matrix->yy;
+
+ matrix->xx = FT_DivFix( yy, delta );
+ matrix->yy = FT_DivFix( xx, delta );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( void )
+ FT_Matrix_Multiply_Scaled( const FT_Matrix* a,
+ FT_Matrix *b,
+ FT_Long scaling )
+ {
+ FT_Fixed xx, xy, yx, yy;
+
+ FT_Long val = 0x10000L * scaling;
+
+
+ if ( !a || !b )
+ return;
+
+ xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );
+ xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );
+ yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );
+ yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );
+
+ b->xx = xx; b->xy = xy;
+ b->yx = yx; b->yy = yy;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( void )
+ FT_Vector_Transform_Scaled( FT_Vector* vector,
+ const FT_Matrix* matrix,
+ FT_Long scaling )
+ {
+ FT_Pos xz, yz;
+
+ FT_Long val = 0x10000L * scaling;
+
+
+ if ( !vector || !matrix )
+ return;
+
+ xz = FT_MulDiv( vector->x, matrix->xx, val ) +
+ FT_MulDiv( vector->y, matrix->xy, val );
+
+ yz = FT_MulDiv( vector->x, matrix->yx, val ) +
+ FT_MulDiv( vector->y, matrix->yy, val );
+
+ vector->x = xz;
+ vector->y = yz;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int32 )
+ FT_SqrtFixed( FT_Int32 x )
+ {
+ FT_UInt32 root, rem_hi, rem_lo, test_div;
+ FT_Int count;
+
+
+ root = 0;
+
+ if ( x > 0 )
+ {
+ rem_hi = 0;
+ rem_lo = x;
+ count = 24;
+ do
+ {
+ rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 );
+ rem_lo <<= 2;
+ root <<= 1;
+ test_div = ( root << 1 ) + 1;
+
+ if ( rem_hi >= test_div )
+ {
+ rem_hi -= test_div;
+ root += 1;
+ }
+ } while ( --count );
+ }
+
+ return (FT_Int32)root;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int )
+ ft_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Long result; /* avoid overflow on 16-bit system */
+
+
+ /* deal with the trivial cases quickly */
+ if ( in_y == 0 )
+ {
+ if ( in_x >= 0 )
+ result = out_y;
+ else
+ result = -out_y;
+ }
+ else if ( in_x == 0 )
+ {
+ if ( in_y >= 0 )
+ result = -out_x;
+ else
+ result = out_x;
+ }
+ else if ( out_y == 0 )
+ {
+ if ( out_x >= 0 )
+ result = in_y;
+ else
+ result = -in_y;
+ }
+ else if ( out_x == 0 )
+ {
+ if ( out_y >= 0 )
+ result = -in_x;
+ else
+ result = in_x;
+ }
+ else /* general case */
+ {
+#ifdef FT_LONG64
+
+ FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+
+
+ if ( delta == 0 )
+ result = 0;
+ else
+ result = 1 - 2 * ( delta < 0 );
+
+#else
+
+ FT_Int64 z1, z2;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );
+ ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );
+
+ if ( z1.hi > z2.hi )
+ result = +1;
+ else if ( z1.hi < z2.hi )
+ result = -1;
+ else if ( z1.lo > z2.lo )
+ result = +1;
+ else if ( z1.lo < z2.lo )
+ result = -1;
+ else
+ result = 0;
+
+#endif
+ }
+
+ /* XXX: only the sign of return value, +1/0/-1 must be used */
+ return (FT_Int)result;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int )
+ ft_corner_is_flat( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Pos ax = in_x;
+ FT_Pos ay = in_y;
+
+ FT_Pos d_in, d_out, d_corner;
+
+
+ if ( ax < 0 )
+ ax = -ax;
+ if ( ay < 0 )
+ ay = -ay;
+ d_in = ax + ay;
+
+ ax = out_x;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = out_y;
+ if ( ay < 0 )
+ ay = -ay;
+ d_out = ax + ay;
+
+ ax = out_x + in_x;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = out_y + in_y;
+ if ( ay < 0 )
+ ay = -ay;
+ d_corner = ax + ay;
+
+ return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
new file mode 100644
index 0000000000..d9817a499a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
@@ -0,0 +1,117 @@
+/***************************************************************************/
+/* */
+/* ftcid.c */
+/* */
+/* FreeType API for accessing CID font information. */
+/* */
+/* Copyright 2007, 2009, 2013 by Derek Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftcid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+ /* documentation is in ftcid.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_Registry_Ordering_Supplement( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement)
+ {
+ FT_Error error;
+ const char* r = NULL;
+ const char* o = NULL;
+ FT_Int s = 0;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_ros )
+ error = service->get_ros( face, &r, &o, &s );
+ }
+
+ if ( registry )
+ *registry = r;
+
+ if ( ordering )
+ *ordering = o;
+
+ if ( supplement )
+ *supplement = s;
+
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Bool ic = 0;
+
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_is_cid )
+ error = service->get_is_cid( face, &ic);
+ }
+
+ if ( is_cid )
+ *is_cid = ic;
+
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_From_Glyph_Index( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_UInt c = 0;
+
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_cid_from_glyph_index )
+ error = service->get_cid_from_glyph_index( face, glyph_index, &c);
+ }
+
+ if ( cid )
+ *cid = c;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
new file mode 100644
index 0000000000..55f59372d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
@@ -0,0 +1,992 @@
+/***************************************************************************/
+/* */
+/* ftdbgmem.c */
+/* */
+/* Memory debugger (body). */
+/* */
+/* Copyright 2001-2006, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+#ifdef FT_DEBUG_MEMORY
+
+#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released
+ * to the heap. This is useful to detect double-frees
+ * or weird heap corruption, but it uses large amounts of
+ * memory, however.
+ */
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+ FT_BASE_DEF( const char* ) _ft_debug_file = 0;
+ FT_BASE_DEF( long ) _ft_debug_lineno = 0;
+
+ extern void
+ FT_DumpMemory( FT_Memory memory );
+
+
+ typedef struct FT_MemSourceRec_* FT_MemSource;
+ typedef struct FT_MemNodeRec_* FT_MemNode;
+ typedef struct FT_MemTableRec_* FT_MemTable;
+
+
+#define FT_MEM_VAL( addr ) ((FT_PtrDist)(FT_Pointer)( addr ))
+
+ /*
+ * This structure holds statistics for a single allocation/release
+ * site. This is useful to know where memory operations happen the
+ * most.
+ */
+ typedef struct FT_MemSourceRec_
+ {
+ const char* file_name;
+ long line_no;
+
+ FT_Long cur_blocks; /* current number of allocated blocks */
+ FT_Long max_blocks; /* max. number of allocated blocks */
+ FT_Long all_blocks; /* total number of blocks allocated */
+
+ FT_Long cur_size; /* current cumulative allocated size */
+ FT_Long max_size; /* maximum cumulative allocated size */
+ FT_Long all_size; /* total cumulative allocated size */
+
+ FT_Long cur_max; /* current maximum allocated size */
+
+ FT_UInt32 hash;
+ FT_MemSource link;
+
+ } FT_MemSourceRec;
+
+
+ /*
+ * We don't need a resizable array for the memory sources, because
+ * their number is pretty limited within FreeType.
+ */
+#define FT_MEM_SOURCE_BUCKETS 128
+
+ /*
+ * This structure holds information related to a single allocated
+ * memory block. If KEEPALIVE is defined, blocks that are freed by
+ * FreeType are never released to the system. Instead, their `size'
+ * field is set to -size. This is mainly useful to detect double frees,
+ * at the price of large memory footprint during execution.
+ */
+ typedef struct FT_MemNodeRec_
+ {
+ FT_Byte* address;
+ FT_Long size; /* < 0 if the block was freed */
+
+ FT_MemSource source;
+
+#ifdef KEEPALIVE
+ const char* free_file_name;
+ FT_Long free_line_no;
+#endif
+
+ FT_MemNode link;
+
+ } FT_MemNodeRec;
+
+
+ /*
+ * The global structure, containing compound statistics and all hash
+ * tables.
+ */
+ typedef struct FT_MemTableRec_
+ {
+ FT_ULong size;
+ FT_ULong nodes;
+ FT_MemNode* buckets;
+
+ FT_ULong alloc_total;
+ FT_ULong alloc_current;
+ FT_ULong alloc_max;
+ FT_ULong alloc_count;
+
+ FT_Bool bound_total;
+ FT_ULong alloc_total_max;
+
+ FT_Bool bound_count;
+ FT_ULong alloc_count_max;
+
+ FT_MemSource sources[FT_MEM_SOURCE_BUCKETS];
+
+ FT_Bool keep_alive;
+
+ FT_Memory memory;
+ FT_Pointer memory_user;
+ FT_Alloc_Func alloc;
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+
+ } FT_MemTableRec;
+
+
+#define FT_MEM_SIZE_MIN 7
+#define FT_MEM_SIZE_MAX 13845163
+
+#define FT_FILENAME( x ) ((x) ? (x) : "unknown file")
+
+
+ /*
+ * Prime numbers are ugly to handle. It would be better to implement
+ * L-Hashing, which is 10% faster and doesn't require divisions.
+ */
+ static const FT_UInt ft_mem_primes[] =
+ {
+ 7,
+ 11,
+ 19,
+ 37,
+ 73,
+ 109,
+ 163,
+ 251,
+ 367,
+ 557,
+ 823,
+ 1237,
+ 1861,
+ 2777,
+ 4177,
+ 6247,
+ 9371,
+ 14057,
+ 21089,
+ 31627,
+ 47431,
+ 71143,
+ 106721,
+ 160073,
+ 240101,
+ 360163,
+ 540217,
+ 810343,
+ 1215497,
+ 1823231,
+ 2734867,
+ 4102283,
+ 6153409,
+ 9230113,
+ 13845163,
+ };
+
+
+ static FT_ULong
+ ft_mem_closest_prime( FT_ULong num )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0;
+ i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )
+ if ( ft_mem_primes[i] > num )
+ return ft_mem_primes[i];
+
+ return FT_MEM_SIZE_MAX;
+ }
+
+
+ extern void
+ ft_mem_debug_panic( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ printf( "FreeType.Debug: " );
+
+ va_start( ap, fmt );
+ vprintf( fmt, ap );
+ va_end( ap );
+
+ printf( "\n" );
+ exit( EXIT_FAILURE );
+ }
+
+
+ static FT_Pointer
+ ft_mem_table_alloc( FT_MemTable table,
+ FT_Long size )
+ {
+ FT_Memory memory = table->memory;
+ FT_Pointer block;
+
+
+ memory->user = table->memory_user;
+ block = table->alloc( memory, size );
+ memory->user = table;
+
+ return block;
+ }
+
+
+ static void
+ ft_mem_table_free( FT_MemTable table,
+ FT_Pointer block )
+ {
+ FT_Memory memory = table->memory;
+
+
+ memory->user = table->memory_user;
+ table->free( memory, block );
+ memory->user = table;
+ }
+
+
+ static void
+ ft_mem_table_resize( FT_MemTable table )
+ {
+ FT_ULong new_size;
+
+
+ new_size = ft_mem_closest_prime( table->nodes );
+ if ( new_size != table->size )
+ {
+ FT_MemNode* new_buckets;
+ FT_ULong i;
+
+
+ new_buckets = (FT_MemNode *)
+ ft_mem_table_alloc( table,
+ new_size * sizeof ( FT_MemNode ) );
+ if ( new_buckets == NULL )
+ return;
+
+ FT_ARRAY_ZERO( new_buckets, new_size );
+
+ for ( i = 0; i < table->size; i++ )
+ {
+ FT_MemNode node, next, *pnode;
+ FT_PtrDist hash;
+
+
+ node = table->buckets[i];
+ while ( node )
+ {
+ next = node->link;
+ hash = FT_MEM_VAL( node->address ) % new_size;
+ pnode = new_buckets + hash;
+
+ node->link = pnode[0];
+ pnode[0] = node;
+
+ node = next;
+ }
+ }
+
+ if ( table->buckets )
+ ft_mem_table_free( table, table->buckets );
+
+ table->buckets = new_buckets;
+ table->size = new_size;
+ }
+ }
+
+
+ static FT_MemTable
+ ft_mem_table_new( FT_Memory memory )
+ {
+ FT_MemTable table;
+
+
+ table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
+ if ( table == NULL )
+ goto Exit;
+
+ FT_ZERO( table );
+
+ table->size = FT_MEM_SIZE_MIN;
+ table->nodes = 0;
+
+ table->memory = memory;
+
+ table->memory_user = memory->user;
+
+ table->alloc = memory->alloc;
+ table->realloc = memory->realloc;
+ table->free = memory->free;
+
+ table->buckets = (FT_MemNode *)
+ memory->alloc( memory,
+ table->size * sizeof ( FT_MemNode ) );
+ if ( table->buckets )
+ FT_ARRAY_ZERO( table->buckets, table->size );
+ else
+ {
+ memory->free( memory, table );
+ table = NULL;
+ }
+
+ Exit:
+ return table;
+ }
+
+
+ static void
+ ft_mem_table_destroy( FT_MemTable table )
+ {
+ FT_ULong i;
+ FT_Long leak_count = 0;
+ FT_ULong leaks = 0;
+
+
+ FT_DumpMemory( table->memory );
+
+ /* remove all blocks from the table, revealing leaked ones */
+ for ( i = 0; i < table->size; i++ )
+ {
+ FT_MemNode *pnode = table->buckets + i, next, node = *pnode;
+
+
+ while ( node )
+ {
+ next = node->link;
+ node->link = 0;
+
+ if ( node->size > 0 )
+ {
+ printf(
+ "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
+ node->address, node->size,
+ FT_FILENAME( node->source->file_name ),
+ node->source->line_no );
+
+ leak_count++;
+ leaks += node->size;
+
+ ft_mem_table_free( table, node->address );
+ }
+
+ node->address = NULL;
+ node->size = 0;
+
+ ft_mem_table_free( table, node );
+ node = next;
+ }
+ table->buckets[i] = 0;
+ }
+
+ ft_mem_table_free( table, table->buckets );
+ table->buckets = NULL;
+
+ table->size = 0;
+ table->nodes = 0;
+
+ /* remove all sources */
+ for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )
+ {
+ FT_MemSource source, next;
+
+
+ for ( source = table->sources[i]; source != NULL; source = next )
+ {
+ next = source->link;
+ ft_mem_table_free( table, source );
+ }
+
+ table->sources[i] = NULL;
+ }
+
+ printf( "FreeType: total memory allocations = %ld\n",
+ table->alloc_total );
+ printf( "FreeType: maximum memory footprint = %ld\n",
+ table->alloc_max );
+
+ ft_mem_table_free( table, table );
+
+ if ( leak_count > 0 )
+ ft_mem_debug_panic(
+ "FreeType: %ld bytes of memory leaked in %ld blocks\n",
+ leaks, leak_count );
+
+ printf( "FreeType: no memory leaks detected\n" );
+ }
+
+
+ static FT_MemNode*
+ ft_mem_table_get_nodep( FT_MemTable table,
+ FT_Byte* address )
+ {
+ FT_PtrDist hash;
+ FT_MemNode *pnode, node;
+
+
+ hash = FT_MEM_VAL( address );
+ pnode = table->buckets + ( hash % table->size );
+
+ for (;;)
+ {
+ node = pnode[0];
+ if ( !node )
+ break;
+
+ if ( node->address == address )
+ break;
+
+ pnode = &node->link;
+ }
+ return pnode;
+ }
+
+
+ static FT_MemSource
+ ft_mem_table_get_source( FT_MemTable table )
+ {
+ FT_UInt32 hash;
+ FT_MemSource node, *pnode;
+
+
+ /* cast to FT_PtrDist first since void* can be larger */
+ /* than FT_UInt32 and GCC 4.1.1 emits a warning */
+ hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +
+ (FT_UInt32)( 5 * _ft_debug_lineno );
+ pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
+
+ for ( ;; )
+ {
+ node = *pnode;
+ if ( node == NULL )
+ break;
+
+ if ( node->file_name == _ft_debug_file &&
+ node->line_no == _ft_debug_lineno )
+ goto Exit;
+
+ pnode = &node->link;
+ }
+
+ node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
+ if ( node == NULL )
+ ft_mem_debug_panic(
+ "not enough memory to perform memory debugging\n" );
+
+ node->file_name = _ft_debug_file;
+ node->line_no = _ft_debug_lineno;
+
+ node->cur_blocks = 0;
+ node->max_blocks = 0;
+ node->all_blocks = 0;
+
+ node->cur_size = 0;
+ node->max_size = 0;
+ node->all_size = 0;
+
+ node->cur_max = 0;
+
+ node->link = NULL;
+ node->hash = hash;
+ *pnode = node;
+
+ Exit:
+ return node;
+ }
+
+
+ static void
+ ft_mem_table_set( FT_MemTable table,
+ FT_Byte* address,
+ FT_ULong size,
+ FT_Long delta )
+ {
+ FT_MemNode *pnode, node;
+
+
+ if ( table )
+ {
+ FT_MemSource source;
+
+
+ pnode = ft_mem_table_get_nodep( table, address );
+ node = *pnode;
+ if ( node )
+ {
+ if ( node->size < 0 )
+ {
+ /* This block was already freed. Our memory is now completely */
+ /* corrupted! */
+ /* This can only happen in keep-alive mode. */
+ ft_mem_debug_panic(
+ "memory heap corrupted (allocating freed block)" );
+ }
+ else
+ {
+ /* This block was already allocated. This means that our memory */
+ /* is also corrupted! */
+ ft_mem_debug_panic(
+ "memory heap corrupted (re-allocating allocated block at"
+ " %p, of size %ld)\n"
+ "org=%s:%d new=%s:%d\n",
+ node->address, node->size,
+ FT_FILENAME( node->source->file_name ), node->source->line_no,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+ }
+ }
+
+ /* we need to create a new node in this table */
+ node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
+ if ( node == NULL )
+ ft_mem_debug_panic( "not enough memory to run memory tests" );
+
+ node->address = address;
+ node->size = size;
+ node->source = source = ft_mem_table_get_source( table );
+
+ if ( delta == 0 )
+ {
+ /* this is an allocation */
+ source->all_blocks++;
+ source->cur_blocks++;
+ if ( source->cur_blocks > source->max_blocks )
+ source->max_blocks = source->cur_blocks;
+ }
+
+ if ( size > (FT_ULong)source->cur_max )
+ source->cur_max = size;
+
+ if ( delta != 0 )
+ {
+ /* we are growing or shrinking a reallocated block */
+ source->cur_size += delta;
+ table->alloc_current += delta;
+ }
+ else
+ {
+ /* we are allocating a new block */
+ source->cur_size += size;
+ table->alloc_current += size;
+ }
+
+ source->all_size += size;
+
+ if ( source->cur_size > source->max_size )
+ source->max_size = source->cur_size;
+
+ node->free_file_name = NULL;
+ node->free_line_no = 0;
+
+ node->link = pnode[0];
+
+ pnode[0] = node;
+ table->nodes++;
+
+ table->alloc_total += size;
+
+ if ( table->alloc_current > table->alloc_max )
+ table->alloc_max = table->alloc_current;
+
+ if ( table->nodes * 3 < table->size ||
+ table->size * 3 < table->nodes )
+ ft_mem_table_resize( table );
+ }
+ }
+
+
+ static void
+ ft_mem_table_remove( FT_MemTable table,
+ FT_Byte* address,
+ FT_Long delta )
+ {
+ if ( table )
+ {
+ FT_MemNode *pnode, node;
+
+
+ pnode = ft_mem_table_get_nodep( table, address );
+ node = *pnode;
+ if ( node )
+ {
+ FT_MemSource source;
+
+
+ if ( node->size < 0 )
+ ft_mem_debug_panic(
+ "freeing memory block at %p more than once at (%s:%ld)\n"
+ "block allocated at (%s:%ld) and released at (%s:%ld)",
+ address,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,
+ FT_FILENAME( node->source->file_name ), node->source->line_no,
+ FT_FILENAME( node->free_file_name ), node->free_line_no );
+
+ /* scramble the node's content for additional safety */
+ FT_MEM_SET( address, 0xF3, node->size );
+
+ if ( delta == 0 )
+ {
+ source = node->source;
+
+ source->cur_blocks--;
+ source->cur_size -= node->size;
+
+ table->alloc_current -= node->size;
+ }
+
+ if ( table->keep_alive )
+ {
+ /* we simply invert the node's size to indicate that the node */
+ /* was freed. */
+ node->size = -node->size;
+ node->free_file_name = _ft_debug_file;
+ node->free_line_no = _ft_debug_lineno;
+ }
+ else
+ {
+ table->nodes--;
+
+ *pnode = node->link;
+
+ node->size = 0;
+ node->source = NULL;
+
+ ft_mem_table_free( table, node );
+
+ if ( table->nodes * 3 < table->size ||
+ table->size * 3 < table->nodes )
+ ft_mem_table_resize( table );
+ }
+ }
+ else
+ ft_mem_debug_panic(
+ "trying to free unknown block at %p in (%s:%ld)\n",
+ address,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+ }
+ }
+
+
+ extern FT_Pointer
+ ft_mem_debug_alloc( FT_Memory memory,
+ FT_Long size )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+ FT_Byte* block;
+
+
+ if ( size <= 0 )
+ ft_mem_debug_panic( "negative block size allocation (%ld)", size );
+
+ /* return NULL if the maximum number of allocations was reached */
+ if ( table->bound_count &&
+ table->alloc_count >= table->alloc_count_max )
+ return NULL;
+
+ /* return NULL if this allocation would overflow the maximum heap size */
+ if ( table->bound_total &&
+ table->alloc_total_max - table->alloc_current > (FT_ULong)size )
+ return NULL;
+
+ block = (FT_Byte *)ft_mem_table_alloc( table, size );
+ if ( block )
+ {
+ ft_mem_table_set( table, block, (FT_ULong)size, 0 );
+
+ table->alloc_count++;
+ }
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+
+ return (FT_Pointer)block;
+ }
+
+
+ extern void
+ ft_mem_debug_free( FT_Memory memory,
+ FT_Pointer block )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( block == NULL )
+ ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
+ FT_FILENAME( _ft_debug_file ),
+ _ft_debug_lineno );
+
+ ft_mem_table_remove( table, (FT_Byte*)block, 0 );
+
+ if ( !table->keep_alive )
+ ft_mem_table_free( table, block );
+
+ table->alloc_count--;
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+ }
+
+
+ extern FT_Pointer
+ ft_mem_debug_realloc( FT_Memory memory,
+ FT_Long cur_size,
+ FT_Long new_size,
+ FT_Pointer block )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+ FT_MemNode node, *pnode;
+ FT_Pointer new_block;
+ FT_Long delta;
+
+ const char* file_name = FT_FILENAME( _ft_debug_file );
+ FT_Long line_no = _ft_debug_lineno;
+
+
+ /* unlikely, but possible */
+ if ( new_size == cur_size )
+ return block;
+
+ /* the following is valid according to ANSI C */
+#if 0
+ if ( block == NULL || cur_size == 0 )
+ ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
+ file_name, line_no );
+#endif
+
+ /* while the following is allowed in ANSI C also, we abort since */
+ /* such case should be handled by FreeType. */
+ if ( new_size <= 0 )
+ ft_mem_debug_panic(
+ "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)",
+ block, cur_size, file_name, line_no );
+
+ /* check `cur_size' value */
+ pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );
+ node = *pnode;
+ if ( !node )
+ ft_mem_debug_panic(
+ "trying to reallocate unknown block at %p in (%s:%ld)",
+ block, file_name, line_no );
+
+ if ( node->size <= 0 )
+ ft_mem_debug_panic(
+ "trying to reallocate freed block at %p in (%s:%ld)",
+ block, file_name, line_no );
+
+ if ( node->size != cur_size )
+ ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is "
+ "%ld instead of %ld in (%s:%ld)",
+ block, cur_size, node->size, file_name, line_no );
+
+ /* return NULL if the maximum number of allocations was reached */
+ if ( table->bound_count &&
+ table->alloc_count >= table->alloc_count_max )
+ return NULL;
+
+ delta = (FT_Long)( new_size - cur_size );
+
+ /* return NULL if this allocation would overflow the maximum heap size */
+ if ( delta > 0 &&
+ table->bound_total &&
+ table->alloc_current + (FT_ULong)delta > table->alloc_total_max )
+ return NULL;
+
+ new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );
+ if ( new_block == NULL )
+ return NULL;
+
+ ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
+
+ ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );
+
+ ft_mem_table_remove( table, (FT_Byte*)block, delta );
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+
+ if ( !table->keep_alive )
+ ft_mem_table_free( table, block );
+
+ return new_block;
+ }
+
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory )
+ {
+ FT_MemTable table;
+ FT_Int result = 0;
+
+
+ if (1)/* XYQ: always enable ( getenv( "FT2_DEBUG_MEMORY" ) ) */
+ {
+ table = ft_mem_table_new( memory );
+ if ( table )
+ {
+ const char* p;
+
+
+ memory->user = table;
+ memory->alloc = ft_mem_debug_alloc;
+ memory->realloc = ft_mem_debug_realloc;
+ memory->free = ft_mem_debug_free;
+
+ p = getenv( "FT2_ALLOC_TOTAL_MAX" );
+ if ( p != NULL )
+ {
+ FT_Long total_max = ft_atol( p );
+
+
+ if ( total_max > 0 )
+ {
+ table->bound_total = 1;
+ table->alloc_total_max = (FT_ULong)total_max;
+ }
+ }
+
+ p = getenv( "FT2_ALLOC_COUNT_MAX" );
+ if ( p != NULL )
+ {
+ FT_Long total_count = ft_atol( p );
+
+
+ if ( total_count > 0 )
+ {
+ table->bound_count = 1;
+ table->alloc_count_max = (FT_ULong)total_count;
+ }
+ }
+
+ p = getenv( "FT2_KEEP_ALIVE" );
+ if ( p != NULL )
+ {
+ FT_Long keep_alive = ft_atol( p );
+
+
+ if ( keep_alive > 0 )
+ table->keep_alive = 1;
+ }
+
+ result = 1;
+ }
+ }
+ return result;
+ }
+
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( table )
+ {
+ memory->free = table->free;
+ memory->realloc = table->realloc;
+ memory->alloc = table->alloc;
+
+ ft_mem_table_destroy( table );
+ memory->user = NULL;
+ }
+ }
+
+
+
+ static int
+ ft_mem_source_compare( const void* p1,
+ const void* p2 )
+ {
+ FT_MemSource s1 = *(FT_MemSource*)p1;
+ FT_MemSource s2 = *(FT_MemSource*)p2;
+
+
+ if ( s2->max_size > s1->max_size )
+ return 1;
+ else if ( s2->max_size < s1->max_size )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ extern void
+ FT_DumpMemory( FT_Memory memory )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( table )
+ {
+ FT_MemSource* bucket = table->sources;
+ FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS;
+ FT_MemSource* sources;
+ FT_UInt nn, count;
+ const char* fmt;
+
+
+ count = 0;
+ for ( ; bucket < limit; bucket++ )
+ {
+ FT_MemSource source = *bucket;
+
+
+ for ( ; source; source = source->link )
+ count++;
+ }
+
+ sources = (FT_MemSource*)ft_mem_table_alloc(
+ table, sizeof ( *sources ) * count );
+
+ count = 0;
+ for ( bucket = table->sources; bucket < limit; bucket++ )
+ {
+ FT_MemSource source = *bucket;
+
+
+ for ( ; source; source = source->link )
+ sources[count++] = source;
+ }
+
+ ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );
+
+ printf( "FreeType Memory Dump: "
+ "current=%ld max=%ld total=%ld count=%ld\n",
+ table->alloc_current, table->alloc_max,
+ table->alloc_total, table->alloc_count );
+ printf( " block block sizes sizes sizes source\n" );
+ printf( " count high sum highsum max location\n" );
+ printf( "-------------------------------------------------\n" );
+
+ fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n";
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_MemSource source = sources[nn];
+
+
+ printf( fmt,
+ source->cur_blocks, source->max_blocks,
+ source->cur_size, source->max_size, source->cur_max,
+ FT_FILENAME( source->file_name ),
+ source->line_no );
+ }
+ printf( "------------------------------------------------\n" );
+
+ ft_mem_table_free( table, sources );
+ }
+ }
+
+#else /* !FT_DEBUG_MEMORY */
+
+ /* ANSI C doesn't like empty source files */
+ typedef int _debug_mem_dummy;
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
new file mode 100644
index 0000000000..4b98cf0881
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
@@ -0,0 +1,266 @@
+/***************************************************************************/
+/* */
+/* ftdebug.c */
+/* */
+/* Debugging and logging component (body). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component contains various macros and functions used to ease the */
+ /* debugging of the FreeType engine. Its main purpose is in assertion */
+ /* checking, tracing, and error detection. */
+ /* */
+ /* There are now three debugging modes: */
+ /* */
+ /* - trace mode */
+ /* */
+ /* Error and trace messages are sent to the log file (which can be the */
+ /* standard error output). */
+ /* */
+ /* - error mode */
+ /* */
+ /* Only error messages are generated. */
+ /* */
+ /* - release mode: */
+ /* */
+ /* No error message is sent or generated. The code is free from any */
+ /* debugging parts. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( void )
+ FT_Message( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( void )
+ FT_Panic( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( int )
+ FT_Throw( FT_Error error,
+ int line,
+ const char* file )
+ {
+ FT_UNUSED( error );
+ FT_UNUSED( line );
+ FT_UNUSED( file );
+
+ return 0;
+ }
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ /* array of trace levels, initialized to 0 */
+ int ft_trace_levels[trace_count];
+
+
+ /* define array of trace toggle names */
+#define FT_TRACE_DEF( x ) #x ,
+
+ static const char* ft_trace_toggles[trace_count + 1] =
+ {
+#include "../../include/freetype/internal/fttrace.h"
+ NULL
+ };
+
+#undef FT_TRACE_DEF
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( FT_Int )
+ FT_Trace_Get_Count( void )
+ {
+ return trace_count;
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( const char * )
+ FT_Trace_Get_Name( FT_Int idx )
+ {
+ int max = FT_Trace_Get_Count();
+
+
+ if ( idx < max )
+ return ft_trace_toggles[idx];
+ else
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Initialize the tracing sub-system. This is done by retrieving the */
+ /* value of the `FT2_DEBUG' environment variable. It must be a list of */
+ /* toggles, separated by spaces, `;', or `,'. Example: */
+ /* */
+ /* export FT2_DEBUG="any:3 memory:7 stream:5" */
+ /* */
+ /* This requests that all levels be set to 3, except the trace level for */
+ /* the memory and stream components which are set to 7 and 5, */
+ /* respectively. */
+ /* */
+ /* See the file <include/freetype/internal/fttrace.h> for details of the */
+ /* available toggle names. */
+ /* */
+ /* The level must be between 0 and 7; 0 means quiet (except for serious */
+ /* runtime errors), and 7 means _very_ verbose. */
+ /* */
+ FT_BASE_DEF( void )
+ ft_debug_init( void )
+ {
+ const char* ft2_debug = getenv( "FT2_DEBUG" );
+
+
+ if ( ft2_debug )
+ {
+ const char* p = ft2_debug;
+ const char* q;
+
+
+ for ( ; *p; p++ )
+ {
+ /* skip leading whitespace and separators */
+ if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+ continue;
+
+ /* read toggle name, followed by ':' */
+ q = p;
+ while ( *p && *p != ':' )
+ p++;
+
+ if ( !*p )
+ break;
+
+ if ( *p == ':' && p > q )
+ {
+ FT_Int n, i, len = (FT_Int)( p - q );
+ FT_Int level = -1, found = -1;
+
+
+ for ( n = 0; n < trace_count; n++ )
+ {
+ const char* toggle = ft_trace_toggles[n];
+
+
+ for ( i = 0; i < len; i++ )
+ {
+ if ( toggle[i] != q[i] )
+ break;
+ }
+
+ if ( i == len && toggle[i] == 0 )
+ {
+ found = n;
+ break;
+ }
+ }
+
+ /* read level */
+ p++;
+ if ( *p )
+ {
+ level = *p - '0';
+ if ( level < 0 || level > 7 )
+ level = -1;
+ }
+
+ if ( found >= 0 && level >= 0 )
+ {
+ if ( found == trace_any )
+ {
+ /* special case for `any' */
+ for ( n = 0; n < trace_count; n++ )
+ ft_trace_levels[n] = level;
+ }
+ else
+ ft_trace_levels[found] = level;
+ }
+ }
+ }
+ }
+ }
+
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+
+ FT_BASE_DEF( void )
+ ft_debug_init( void )
+ {
+ /* nothing */
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ FT_Trace_Get_Count( void )
+ {
+ return 0;
+ }
+
+
+ FT_BASE_DEF( const char * )
+ FT_Trace_Get_Name( FT_Int idx )
+ {
+ FT_UNUSED( idx );
+
+ return NULL;
+ }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
new file mode 100644
index 0000000000..948263a64f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
@@ -0,0 +1,62 @@
+/***************************************************************************/
+/* */
+/* ftfstype.c */
+/* */
+/* FreeType utility file to access FSType data (body). */
+/* */
+/* Copyright 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UShort )
+ FT_Get_FSType_Flags( FT_Face face )
+ {
+ TT_OS2* os2;
+
+
+ /* first, try to get the fs_type directly from the font */
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_extra )
+ {
+ PS_FontExtraRec extra;
+
+
+ if ( !service->ps_get_font_extra( face, &extra ) &&
+ extra.fs_type != 0 )
+ return extra.fs_type;
+ }
+ }
+
+ /* look at FSType before fsType for Type42 */
+
+ if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&
+ os2->version != 0xFFFFU )
+ return os2->fsType;
+
+ return 0;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
new file mode 100644
index 0000000000..3187d96a11
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/* */
+/* ftgasp.c */
+/* */
+/* Access of TrueType's `gasp' table (body). */
+/* */
+/* Copyright 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftgasp.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Get_Gasp( FT_Face face,
+ FT_UInt ppem )
+ {
+ FT_Int result = FT_GASP_NO_TABLE;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( ttface->gasp.numRanges > 0 )
+ {
+ TT_GaspRange range = ttface->gasp.gaspRanges;
+ TT_GaspRange range_end = range + ttface->gasp.numRanges;
+
+
+ while ( ppem > range->maxPPEM )
+ {
+ range++;
+ if ( range >= range_end )
+ goto Exit;
+ }
+
+ result = range->gaspFlag;
+
+ /* ensure that we don't have spurious bits */
+ if ( ttface->gasp.version == 0 )
+ result &= 3;
+ }
+ }
+ Exit:
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
new file mode 100644
index 0000000000..a0dd86c2ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
@@ -0,0 +1,405 @@
+/***************************************************************************/
+/* */
+/* ftgloadr.c */
+/* */
+/* The FreeType glyph loader (body). */
+/* */
+/* Copyright 2002-2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftgloadr.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_gloader
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** G L Y P H L O A D E R *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The glyph loader is a simple object which is used to load a set of */
+ /* glyphs easily. It is critical for the correct loading of composites. */
+ /* */
+ /* Ideally, one can see it as a stack of abstract `glyph' objects. */
+ /* */
+ /* loader.base Is really the bottom of the stack. It describes a */
+ /* single glyph image made of the juxtaposition of */
+ /* several glyphs (those `in the stack'). */
+ /* */
+ /* loader.current Describes the top of the stack, on which a new */
+ /* glyph can be loaded. */
+ /* */
+ /* Rewind Clears the stack. */
+ /* Prepare Set up `loader.current' for addition of a new glyph */
+ /* image. */
+ /* Add Add the `current' glyph image to the `base' one, */
+ /* and prepare for another one. */
+ /* */
+ /* The glyph loader is now a base object. Each driver used to */
+ /* re-implement it in one way or the other, which wasted code and */
+ /* energy. */
+ /* */
+ /*************************************************************************/
+
+
+ /* create a new glyph loader */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_New( FT_Memory memory,
+ FT_GlyphLoader *aloader )
+ {
+ FT_GlyphLoader loader = NULL;
+ FT_Error error;
+
+
+ if ( !FT_NEW( loader ) )
+ {
+ loader->memory = memory;
+ *aloader = loader;
+ }
+ return error;
+ }
+
+
+ /* rewind the glyph loader - reset counters to 0 */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Rewind( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ base->outline.n_points = 0;
+ base->outline.n_contours = 0;
+ base->num_subglyphs = 0;
+
+ *current = *base;
+ }
+
+
+ /* reset the glyph loader, frees all allocated tables */
+ /* and starts from zero */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Reset( FT_GlyphLoader loader )
+ {
+ FT_Memory memory = loader->memory;
+
+
+ FT_FREE( loader->base.outline.points );
+ FT_FREE( loader->base.outline.tags );
+ FT_FREE( loader->base.outline.contours );
+ FT_FREE( loader->base.extra_points );
+ FT_FREE( loader->base.subglyphs );
+
+ loader->base.extra_points2 = NULL;
+
+ loader->max_points = 0;
+ loader->max_contours = 0;
+ loader->max_subglyphs = 0;
+
+ FT_GlyphLoader_Rewind( loader );
+ }
+
+
+ /* delete a glyph loader */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Done( FT_GlyphLoader loader )
+ {
+ if ( loader )
+ {
+ FT_Memory memory = loader->memory;
+
+
+ FT_GlyphLoader_Reset( loader );
+ FT_FREE( loader );
+ }
+ }
+
+
+ /* re-adjust the `current' outline fields */
+ static void
+ FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader )
+ {
+ FT_Outline* base = &loader->base.outline;
+ FT_Outline* current = &loader->current.outline;
+
+
+ current->points = base->points + base->n_points;
+ current->tags = base->tags + base->n_points;
+ current->contours = base->contours + base->n_contours;
+
+ /* handle extra points table - if any */
+ if ( loader->use_extra )
+ {
+ loader->current.extra_points = loader->base.extra_points +
+ base->n_points;
+
+ loader->current.extra_points2 = loader->base.extra_points2 +
+ base->n_points;
+ }
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader )
+ {
+ FT_Error error;
+ FT_Memory memory = loader->memory;
+
+
+ if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )
+ {
+ loader->use_extra = 1;
+ loader->base.extra_points2 = loader->base.extra_points +
+ loader->max_points;
+
+ FT_GlyphLoader_Adjust_Points( loader );
+ }
+ return error;
+ }
+
+
+ /* re-adjust the `current' subglyphs field */
+ static void
+ FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ current->subglyphs = base->subglyphs + base->num_subglyphs;
+ }
+
+
+ /* Ensure that we can add `n_points' and `n_contours' to our glyph. */
+ /* This function reallocates its outline tables if necessary. Note that */
+ /* it DOESN'T change the number of points within the loader! */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader,
+ FT_UInt n_points,
+ FT_UInt n_contours )
+ {
+ FT_Memory memory = loader->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Outline* base = &loader->base.outline;
+ FT_Outline* current = &loader->current.outline;
+ FT_Bool adjust = 0;
+
+ FT_UInt new_max, old_max;
+
+
+ /* check points & tags */
+ new_max = base->n_points + current->n_points + n_points;
+ old_max = loader->max_points;
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+
+ if ( new_max > FT_OUTLINE_POINTS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
+ FT_RENEW_ARRAY( base->tags, old_max, new_max ) )
+ goto Exit;
+
+ if ( loader->use_extra )
+ {
+ if ( FT_RENEW_ARRAY( loader->base.extra_points,
+ old_max * 2, new_max * 2 ) )
+ goto Exit;
+
+ FT_ARRAY_MOVE( loader->base.extra_points + new_max,
+ loader->base.extra_points + old_max,
+ old_max );
+
+ loader->base.extra_points2 = loader->base.extra_points + new_max;
+ }
+
+ adjust = 1;
+ loader->max_points = new_max;
+ }
+
+ /* check contours */
+ old_max = loader->max_contours;
+ new_max = base->n_contours + current->n_contours +
+ n_contours;
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 4 );
+
+ if ( new_max > FT_OUTLINE_CONTOURS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
+ goto Exit;
+
+ adjust = 1;
+ loader->max_contours = new_max;
+ }
+
+ if ( adjust )
+ FT_GlyphLoader_Adjust_Points( loader );
+
+ Exit:
+ if ( error )
+ FT_GlyphLoader_Reset( loader );
+
+ return error;
+ }
+
+
+ /* Ensure that we can add `n_subglyphs' to our glyph. this function */
+ /* reallocates its subglyphs table if necessary. Note that it DOES */
+ /* NOT change the number of subglyphs within the loader! */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader,
+ FT_UInt n_subs )
+ {
+ FT_Memory memory = loader->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_UInt new_max, old_max;
+
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
+ old_max = loader->max_subglyphs;
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 2 );
+ if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )
+ goto Exit;
+
+ loader->max_subglyphs = new_max;
+
+ FT_GlyphLoader_Adjust_Subglyphs( loader );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* prepare loader for the addition of a new glyph on top of the base one */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Prepare( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad current = &loader->current;
+
+
+ current->outline.n_points = 0;
+ current->outline.n_contours = 0;
+ current->num_subglyphs = 0;
+
+ FT_GlyphLoader_Adjust_Points ( loader );
+ FT_GlyphLoader_Adjust_Subglyphs( loader );
+ }
+
+
+ /* add current glyph to the base image -- and prepare for another */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Add( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base;
+ FT_GlyphLoad current;
+
+ FT_UInt n_curr_contours;
+ FT_UInt n_base_points;
+ FT_UInt n;
+
+
+ if ( !loader )
+ return;
+
+ base = &loader->base;
+ current = &loader->current;
+
+ n_curr_contours = current->outline.n_contours;
+ n_base_points = base->outline.n_points;
+
+ base->outline.n_points =
+ (short)( base->outline.n_points + current->outline.n_points );
+ base->outline.n_contours =
+ (short)( base->outline.n_contours + current->outline.n_contours );
+
+ base->num_subglyphs += current->num_subglyphs;
+
+ /* adjust contours count in newest outline */
+ for ( n = 0; n < n_curr_contours; n++ )
+ current->outline.contours[n] =
+ (short)( current->outline.contours[n] + n_base_points );
+
+ /* prepare for another new glyph image */
+ FT_GlyphLoader_Prepare( loader );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CopyPoints( FT_GlyphLoader target,
+ FT_GlyphLoader source )
+ {
+ FT_Error error;
+ FT_UInt num_points = source->base.outline.n_points;
+ FT_UInt num_contours = source->base.outline.n_contours;
+
+
+ error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );
+ if ( !error )
+ {
+ FT_Outline* out = &target->base.outline;
+ FT_Outline* in = &source->base.outline;
+
+
+ FT_ARRAY_COPY( out->points, in->points,
+ num_points );
+ FT_ARRAY_COPY( out->tags, in->tags,
+ num_points );
+ FT_ARRAY_COPY( out->contours, in->contours,
+ num_contours );
+
+ /* do we need to copy the extra points? */
+ if ( target->use_extra && source->use_extra )
+ {
+ FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,
+ num_points );
+ FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,
+ num_points );
+ }
+
+ out->n_points = (short)num_points;
+ out->n_contours = (short)num_contours;
+
+ FT_GlyphLoader_Adjust_Points( target );
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
new file mode 100644
index 0000000000..3b5884ec92
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/* */
+/* ftgxval.c */
+/* */
+/* FreeType API for validating TrueTyepGX/AAT tables (body). */
+/* */
+/* Copyright 2004-2006, 2010, 2013 by */
+/* Masatake YAMATO, Redhat K.K, */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svgxval.h"
+
+
+ /* documentation is in ftgxval.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_TrueTypeGX_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length )
+ {
+ FT_Service_GXvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( tables == NULL )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ tables,
+ table_length );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_TrueTypeGX_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+ FT_FREE( table );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_ClassicKern_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *ckern_table )
+ {
+ FT_Service_CKERNvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( ckern_table == NULL )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ ckern_table );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_ClassicKern_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( table );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
new file mode 100644
index 0000000000..76361d92cd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
@@ -0,0 +1,1061 @@
+/***************************************************************************/
+/* */
+/* ftmac.c */
+/* */
+/* Mac FOND support. Written by just@letterror.com. */
+/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */
+/* */
+/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */
+/* classic platforms built by MPW. */
+/* */
+/* Copyright 1996-2009, 2013 by */
+/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*
+ Notes
+
+ Mac suitcase files can (and often do!) contain multiple fonts. To
+ support this I use the face_index argument of FT_(Open|New)_Face()
+ functions, and pretend the suitcase file is a collection.
+
+ Warning: fbit and NFNT bitmap resources are not supported yet. In old
+ sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
+ resources instead of the `bdat' table in the sfnt resource. Therefore,
+ face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
+ resource is unavailable at present.
+
+ The Mac FOND support works roughly like this:
+
+ - Check whether the offered stream points to a Mac suitcase file. This
+ is done by checking the file type: it has to be 'FFIL' or 'tfil'. The
+ stream that gets passed to our init_face() routine is a stdio stream,
+ which isn't usable for us, since the FOND resources live in the
+ resource fork. So we just grab the stream->pathname field.
+
+ - Read the FOND resource into memory, then check whether there is a
+ TrueType font and/or(!) a Type 1 font available.
+
+ - If there is a Type 1 font available (as a separate `LWFN' file), read
+ its data into memory, massage it slightly so it becomes PFB data, wrap
+ it into a memory stream, load the Type 1 driver and delegate the rest
+ of the work to it by calling FT_Open_Face(). (XXX TODO: after this
+ has been done, the kerning data from the FOND resource should be
+ appended to the face: On the Mac there are usually no AFM files
+ available. However, this is tricky since we need to map Mac char
+ codes to ps glyph names to glyph ID's...)
+
+ - If there is a TrueType font (an `sfnt' resource), read it into memory,
+ wrap it into a memory stream, load the TrueType driver and delegate
+ the rest of the work to it, by calling FT_Open_Face().
+
+ - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
+ itself, even though it doesn't contains `POST' resources. To handle
+ this special case without opening the file an extra time, we just
+ ignore errors from the `LWFN' and fallback to the `sfnt' if both are
+ available.
+ */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ftbase.h"
+
+ /* This is for Mac OS X. Without redefinition, OS_INLINE */
+ /* expands to `static inline' which doesn't survive the */
+ /* -ansi compilation flag of GCC. */
+#if !HAVE_ANSI_OS_INLINE
+#undef OS_INLINE
+#define OS_INLINE static __inline__
+#endif
+
+ /* `configure' checks the availability of `ResourceIndex' strictly */
+ /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */
+ /* not set (e.g., a build without `configure'), the availability */
+ /* is guessed from the SDK version. */
+#ifndef HAVE_TYPE_RESOURCE_INDEX
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+ ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
+#define HAVE_TYPE_RESOURCE_INDEX 0
+#else
+#define HAVE_TYPE_RESOURCE_INDEX 1
+#endif
+#endif /* !HAVE_TYPE_RESOURCE_INDEX */
+
+#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
+ typedef short ResourceIndex;
+#endif
+
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+
+ /* Don't want warnings about our own use of deprecated functions. */
+#define FT_DEPRECATED_ATTRIBUTE
+
+#include "../../include/freetype/ftmac.h"
+
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
+
+
+ /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
+ TrueType in case *both* are available (this is not common,
+ but it *is* possible). */
+#ifndef PREFER_LWFN
+#define PREFER_LWFN 1
+#endif
+
+
+#ifdef FT_MACINTOSH
+
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFile_From_Mac_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ {
+ FT_UNUSED( fontName );
+ FT_UNUSED( pathSpec );
+ FT_UNUSED( face_index );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+
+ /* Private function. */
+ /* The FSSpec type has been discouraged for a long time, */
+ /* unfortunately an FSRef replacement API for */
+ /* ATSFontGetFileSpecification() is only available in */
+ /* Mac OS X 10.5 and later. */
+ static OSStatus
+ FT_ATSFontGetFileReference( ATSFontRef ats_font_id,
+ FSRef* ats_font_ref )
+ {
+#if defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
+
+ OSStatus err;
+
+ err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+
+ return err;
+#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
+ FT_UNUSED( ats_font_id );
+ FT_UNUSED( ats_font_ref );
+
+
+ return fnfErr;
+#else /* 32bit Carbon API on legacy platforms */
+ OSStatus err;
+ FSSpec spec;
+
+
+ err = ATSFontGetFileSpecification( ats_font_id, &spec );
+ if ( noErr == err )
+ err = FSpMakeFSRef( &spec, ats_font_ref );
+
+ return err;
+#endif
+ }
+
+
+ static FT_Error
+ FT_GetFileRef_From_Mac_ATS_Name( const char* fontName,
+ FSRef* ats_font_ref,
+ FT_Long* face_index )
+ {
+ CFStringRef cf_fontName;
+ ATSFontRef ats_font_id;
+
+
+ *face_index = 0;
+
+ cf_fontName = CFStringCreateWithCString( NULL, fontName,
+ kCFStringEncodingMacRoman );
+ ats_font_id = ATSFontFindFromName( cf_fontName,
+ kATSOptionFlagsUnRestrictedScope );
+ CFRelease( cf_fontName );
+
+ if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
+ return FT_THROW( Unknown_File_Format );
+
+ /* face_index calculation by searching preceding fontIDs */
+ /* with same FSRef */
+ {
+ ATSFontRef id2 = ats_font_id - 1;
+ FSRef ref2;
+
+
+ while ( id2 > 0 )
+ {
+ if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
+ break;
+ if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
+ break;
+
+ id2 --;
+ }
+ *face_index = ats_font_id - ( id2 + 1 );
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFilePath_From_Mac_ATS_Name( const char* fontName,
+ UInt8* path,
+ UInt32 maxPathSize,
+ FT_Long* face_index )
+ {
+ FSRef ref;
+ FT_Error err;
+
+
+ err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+ if ( err )
+ return err;
+
+ if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
+ return FT_THROW( Unknown_File_Format );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFile_From_Mac_ATS_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+ FT_UNUSED( fontName );
+ FT_UNUSED( pathSpec );
+ FT_UNUSED( face_index );
+
+ return FT_THROW( Unimplemented_Feature );
+#else
+ FSRef ref;
+ FT_Error err;
+
+
+ err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+ if ( err )
+ return err;
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
+ pathSpec, NULL ) )
+ return FT_THROW( Unknown_File_Format );
+
+ return FT_Err_Ok;
+#endif
+ }
+
+
+ static OSErr
+ FT_FSPathMakeRes( const UInt8* pathname,
+ ResFileRefNum* res )
+ {
+ OSErr err;
+ FSRef ref;
+
+
+ if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ /* at present, no support for dfont format */
+ err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
+ if ( noErr == err )
+ return err;
+
+ /* fallback to original resource-fork font */
+ *res = FSOpenResFile( &ref, fsRdPerm );
+ err = ResError();
+
+ return err;
+ }
+
+
+ /* Return the file type for given pathname */
+ static OSType
+ get_file_type_from_path( const UInt8* pathname )
+ {
+ FSRef ref;
+ FSCatalogInfo info;
+
+
+ if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+ return ( OSType ) 0;
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
+ NULL, NULL, NULL ) )
+ return ( OSType ) 0;
+
+ return ((FInfo *)(info.finderInfo))->fdType;
+ }
+
+
+ /* Given a PostScript font name, create the Macintosh LWFN file name. */
+ static void
+ create_lwfn_name( char* ps_name,
+ Str255 lwfn_file_name )
+ {
+ int max = 5, count = 0;
+ FT_Byte* p = lwfn_file_name;
+ FT_Byte* q = (FT_Byte*)ps_name;
+
+
+ lwfn_file_name[0] = 0;
+
+ while ( *q )
+ {
+ if ( ft_isupper( *q ) )
+ {
+ if ( count )
+ max = 3;
+ count = 0;
+ }
+ if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
+ {
+ *++p = *q;
+ lwfn_file_name[0]++;
+ count++;
+ }
+ q++;
+ }
+ }
+
+
+ static short
+ count_faces_sfnt( char* fond_data )
+ {
+ /* The count is 1 greater than the value in the FOND. */
+ /* Isn't that cute? :-) */
+
+ return EndianS16_BtoN( *( (short*)( fond_data +
+ sizeof ( FamRec ) ) ) ) + 1;
+ }
+
+
+ static short
+ count_faces_scalable( char* fond_data )
+ {
+ AsscEntry* assoc;
+ short i, face, face_all;
+
+
+ face_all = EndianS16_BtoN( *( (short *)( fond_data +
+ sizeof ( FamRec ) ) ) ) + 1;
+ assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+ face = 0;
+
+ for ( i = 0; i < face_all; i++ )
+ {
+ if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
+ face++;
+ }
+ return face;
+ }
+
+
+ /* Look inside the FOND data, answer whether there should be an SFNT
+ resource, and answer the name of a possible LWFN Type 1 file.
+
+ Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
+ to load a face OTHER than the first one in the FOND!
+ */
+
+
+ static void
+ parse_fond( char* fond_data,
+ short* have_sfnt,
+ ResID* sfnt_id,
+ Str255 lwfn_file_name,
+ short face_index )
+ {
+ AsscEntry* assoc;
+ AsscEntry* base_assoc;
+ FamRec* fond;
+
+
+ *sfnt_id = 0;
+ *have_sfnt = 0;
+ lwfn_file_name[0] = 0;
+
+ fond = (FamRec*)fond_data;
+ assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+ base_assoc = assoc;
+
+ /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+ if ( 47 < face_index )
+ return;
+
+ /* Let's do a little range checking before we get too excited here */
+ if ( face_index < count_faces_sfnt( fond_data ) )
+ {
+ assoc += face_index; /* add on the face_index! */
+
+ /* if the face at this index is not scalable,
+ fall back to the first one (old behavior) */
+ if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
+ {
+ *have_sfnt = 1;
+ *sfnt_id = EndianS16_BtoN( assoc->fontID );
+ }
+ else if ( base_assoc->fontSize == 0 )
+ {
+ *have_sfnt = 1;
+ *sfnt_id = EndianS16_BtoN( base_assoc->fontID );
+ }
+ }
+
+ if ( EndianS32_BtoN( fond->ffStylOff ) )
+ {
+ unsigned char* p = (unsigned char*)fond_data;
+ StyleTable* style;
+ unsigned short string_count;
+ char ps_name[256];
+ unsigned char* names[64];
+ int i;
+
+
+ p += EndianS32_BtoN( fond->ffStylOff );
+ style = (StyleTable*)p;
+ p += sizeof ( StyleTable );
+ string_count = EndianS16_BtoN( *(short*)(p) );
+ p += sizeof ( short );
+
+ for ( i = 0; i < string_count && i < 64; i++ )
+ {
+ names[i] = p;
+ p += names[i][0];
+ p++;
+ }
+
+ {
+ size_t ps_name_len = (size_t)names[0][0];
+
+
+ if ( ps_name_len != 0 )
+ {
+ ft_memcpy(ps_name, names[0] + 1, ps_name_len);
+ ps_name[ps_name_len] = 0;
+ }
+ if ( style->indexes[face_index] > 1 &&
+ style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
+ {
+ unsigned char* suffixes = names[style->indexes[face_index] - 1];
+
+
+ for ( i = 1; i <= suffixes[0]; i++ )
+ {
+ unsigned char* s;
+ size_t j = suffixes[i] - 1;
+
+
+ if ( j < string_count && ( s = names[j] ) != NULL )
+ {
+ size_t s_len = (size_t)s[0];
+
+
+ if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+ {
+ ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
+ ps_name_len += s_len;
+ ps_name[ps_name_len] = 0;
+ }
+ }
+ }
+ }
+ }
+
+ create_lwfn_name( ps_name, lwfn_file_name );
+ }
+ }
+
+
+ static FT_Error
+ lookup_lwfn_by_fond( const UInt8* path_fond,
+ ConstStr255Param base_lwfn,
+ UInt8* path_lwfn,
+ size_t path_size )
+ {
+ FSRef ref, par_ref;
+ size_t dirname_len;
+
+
+ /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
+ /* We should not extract parent directory by string manipulation. */
+
+ if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+ NULL, NULL, NULL, &par_ref ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
+ return FT_THROW( Invalid_Argument );
+
+ /* now we have absolute dirname in path_lwfn */
+ ft_strcat( (char *)path_lwfn, "/" );
+ dirname_len = ft_strlen( (char *)path_lwfn );
+ ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
+ path_lwfn[dirname_len + base_lwfn[0]] = '\0';
+
+ if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+ NULL, NULL, NULL, NULL ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ return FT_Err_Ok;
+ }
+
+
+ static short
+ count_faces( Handle fond,
+ const UInt8* pathname )
+ {
+ ResID sfnt_id;
+ short have_sfnt, have_lwfn;
+ Str255 lwfn_file_name;
+ UInt8 buff[PATH_MAX];
+ FT_Error err;
+ short num_faces;
+
+
+ have_sfnt = have_lwfn = 0;
+
+ parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
+
+ if ( lwfn_file_name[0] )
+ {
+ err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
+ buff, sizeof ( buff ) );
+ if ( !err )
+ have_lwfn = 1;
+ }
+
+ if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+ num_faces = 1;
+ else
+ num_faces = count_faces_scalable( *fond );
+
+ return num_faces;
+ }
+
+
+ /* Read Type 1 data from the POST resources inside the LWFN file,
+ return a PFB buffer. This is somewhat convoluted because the FT2
+ PFB parser wants the ASCII header as one chunk, and the LWFN
+ chunks are often not organized that way, so we glue chunks
+ of the same type together. */
+ static FT_Error
+ read_lwfn( FT_Memory memory,
+ ResFileRefNum res,
+ FT_Byte** pfb_data,
+ FT_ULong* size )
+ {
+ FT_Error error = FT_Err_Ok;
+ ResID res_id;
+ unsigned char *buffer, *p, *size_p = NULL;
+ FT_ULong total_size = 0;
+ FT_ULong old_total_size = 0;
+ FT_ULong post_size, pfb_chunk_size;
+ Handle post_data;
+ char code, last_code;
+
+
+ UseResFile( res );
+
+ /* First pass: load all POST resources, and determine the size of */
+ /* the output buffer. */
+ res_id = 501;
+ last_code = -1;
+
+ for (;;)
+ {
+ post_data = Get1Resource( TTAG_POST, res_id++ );
+ if ( post_data == NULL )
+ break; /* we are done */
+
+ code = (*post_data)[0];
+
+ if ( code != last_code )
+ {
+ if ( code == 5 )
+ total_size += 2; /* just the end code */
+ else
+ total_size += 6; /* code + 4 bytes chunk length */
+ }
+
+ total_size += GetHandleSize( post_data ) - 2;
+ last_code = code;
+
+ /* detect integer overflows */
+ if ( total_size < old_total_size )
+ {
+ error = FT_THROW( Array_Too_Large );
+ goto Error;
+ }
+
+ old_total_size = total_size;
+ }
+
+ if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
+ goto Error;
+
+ /* Second pass: append all POST data to the buffer, add PFB fields. */
+ /* Glue all consecutive chunks of the same type together. */
+ p = buffer;
+ res_id = 501;
+ last_code = -1;
+ pfb_chunk_size = 0;
+
+ for (;;)
+ {
+ post_data = Get1Resource( TTAG_POST, res_id++ );
+ if ( post_data == NULL )
+ break; /* we are done */
+
+ post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
+ code = (*post_data)[0];
+
+ if ( code != last_code )
+ {
+ if ( last_code != -1 )
+ {
+ /* we are done adding a chunk, fill in the size field */
+ if ( size_p != NULL )
+ {
+ *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+ }
+ pfb_chunk_size = 0;
+ }
+
+ *p++ = 0x80;
+ if ( code == 5 )
+ *p++ = 0x03; /* the end */
+ else if ( code == 2 )
+ *p++ = 0x02; /* binary segment */
+ else
+ *p++ = 0x01; /* ASCII segment */
+
+ if ( code != 5 )
+ {
+ size_p = p; /* save for later */
+ p += 4; /* make space for size field */
+ }
+ }
+
+ ft_memcpy( p, *post_data + 2, post_size );
+ pfb_chunk_size += post_size;
+ p += post_size;
+ last_code = code;
+ }
+
+ *pfb_data = buffer;
+ *size = total_size;
+
+ Error:
+ CloseResFile( res );
+ return error;
+ }
+
+
+ /* Create a new FT_Face from a file path to an LWFN file. */
+ static FT_Error
+ FT_New_Face_From_LWFN( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Byte* pfb_data;
+ FT_ULong pfb_size;
+ FT_Error error;
+ ResFileRefNum res;
+
+
+ if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ pfb_data = NULL;
+ pfb_size = 0;
+ error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
+ CloseResFile( res ); /* PFB is already loaded, useless anymore */
+ if ( error )
+ return error;
+
+ return open_face_from_buffer( library,
+ pfb_data,
+ pfb_size,
+ face_index,
+ "type1",
+ aface );
+ }
+
+
+ /* Create a new FT_Face from an SFNT resource, specified by res ID. */
+ static FT_Error
+ FT_New_Face_From_SFNT( FT_Library library,
+ ResID sfnt_id,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ Handle sfnt = NULL;
+ FT_Byte* sfnt_data;
+ size_t sfnt_size;
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = library->memory;
+ int is_cff, is_sfnt_ps;
+
+
+ sfnt = GetResource( TTAG_sfnt, sfnt_id );
+ if ( sfnt == NULL )
+ return FT_THROW( Invalid_Handle );
+
+ sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+ if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
+ {
+ ReleaseResource( sfnt );
+ return error;
+ }
+
+ ft_memcpy( sfnt_data, *sfnt, sfnt_size );
+ ReleaseResource( sfnt );
+
+ is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+ is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
+
+ if ( is_sfnt_ps )
+ {
+ FT_Stream stream;
+
+
+ if ( FT_NEW( stream ) )
+ goto Try_OpenType;
+
+ FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
+ if ( !open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ 0, NULL,
+ aface ) )
+ {
+ FT_Stream_Close( stream );
+ FT_FREE( stream );
+ FT_FREE( sfnt_data );
+ goto Exit;
+ }
+
+ FT_FREE( stream );
+ }
+ Try_OpenType:
+ error = open_face_from_buffer( library,
+ sfnt_data,
+ sfnt_size,
+ face_index,
+ is_cff ? "cff" : "truetype",
+ aface );
+ Exit:
+ return error;
+ }
+
+
+ /* Create a new FT_Face from a file path to a suitcase file. */
+ static FT_Error
+ FT_New_Face_From_Suitcase( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Error error = FT_ERR( Cannot_Open_Resource );
+ ResFileRefNum res_ref;
+ ResourceIndex res_index;
+ Handle fond;
+ short num_faces_in_res;
+
+
+ if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ UseResFile( res_ref );
+ if ( ResError() )
+ return FT_THROW( Cannot_Open_Resource );
+
+ num_faces_in_res = 0;
+ for ( res_index = 1; ; ++res_index )
+ {
+ short num_faces_in_fond;
+
+
+ fond = Get1IndResource( TTAG_FOND, res_index );
+ if ( ResError() )
+ break;
+
+ num_faces_in_fond = count_faces( fond, pathname );
+ num_faces_in_res += num_faces_in_fond;
+
+ if ( 0 <= face_index && face_index < num_faces_in_fond && error )
+ error = FT_New_Face_From_FOND( library, fond, face_index, aface );
+
+ face_index -= num_faces_in_fond;
+ }
+
+ CloseResFile( res_ref );
+ if ( !error && aface && *aface )
+ (*aface)->num_faces = num_faces_in_res;
+ return error;
+ }
+
+
+ /* documentation is in ftmac.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FOND( FT_Library library,
+ Handle fond,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ short have_sfnt, have_lwfn = 0;
+ ResID sfnt_id, fond_id;
+ OSType fond_type;
+ Str255 fond_name;
+ Str255 lwfn_file_name;
+ UInt8 path_lwfn[PATH_MAX];
+ OSErr err;
+ FT_Error error = FT_Err_Ok;
+
+
+ GetResInfo( fond, &fond_id, &fond_type, fond_name );
+ if ( ResError() != noErr || fond_type != TTAG_FOND )
+ return FT_THROW( Invalid_File_Format );
+
+ parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
+
+ if ( lwfn_file_name[0] )
+ {
+ ResFileRefNum res;
+
+
+ res = HomeResFile( fond );
+ if ( noErr != ResError() )
+ goto found_no_lwfn_file;
+
+ {
+ UInt8 path_fond[PATH_MAX];
+ FSRef ref;
+
+
+ err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
+ NULL, NULL, NULL, &ref, NULL );
+ if ( noErr != err )
+ goto found_no_lwfn_file;
+
+ err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
+ if ( noErr != err )
+ goto found_no_lwfn_file;
+
+ error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+ path_lwfn, sizeof ( path_lwfn ) );
+ if ( !error )
+ have_lwfn = 1;
+ }
+ }
+
+ if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+ error = FT_New_Face_From_LWFN( library,
+ path_lwfn,
+ face_index,
+ aface );
+ else
+ error = FT_THROW( Unknown_File_Format );
+
+ found_no_lwfn_file:
+ if ( have_sfnt && error )
+ error = FT_New_Face_From_SFNT( library,
+ sfnt_id,
+ face_index,
+ aface );
+
+ return error;
+ }
+
+
+ /* Common function to load a new FT_Face from a resource file. */
+ static FT_Error
+ FT_New_Face_From_Resource( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ OSType file_type;
+ FT_Error error;
+
+
+ /* LWFN is a (very) specific file format, check for it explicitly */
+ file_type = get_file_type_from_path( pathname );
+ if ( file_type == TTAG_LWFN )
+ return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
+
+ /* Otherwise the file type doesn't matter (there are more than */
+ /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */
+ /* if it works, fine. */
+
+ error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
+ if ( error == 0 )
+ return error;
+
+ /* let it fall through to normal loader (.ttf, .otf, etc.); */
+ /* we signal this by returning no error and no FT_Face */
+ *aface = NULL;
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face */
+ /* */
+ /* <Description> */
+ /* This is the Mac-specific implementation of FT_New_Face. In */
+ /* addition to the standard FT_New_Face() functionality, it also */
+ /* accepts pathnames to Mac suitcase files. For further */
+ /* documentation see the original FT_New_Face() in freetype.h. */
+ /* */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Open_Args args;
+ FT_Error error;
+
+
+ /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+ if ( !pathname )
+ return FT_THROW( Invalid_Argument );
+
+ error = FT_Err_Ok;
+ *aface = NULL;
+
+ /* try resourcefork based font: LWFN, FFIL */
+ error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
+ face_index, aface );
+ if ( error != 0 || *aface != NULL )
+ return error;
+
+ /* let it fall through to normal loader (.ttf, .otf, etc.) */
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSRef */
+ /* */
+ /* <Description> */
+ /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */
+ /* accepts an FSRef instead of a path. */
+ /* */
+ /* This function is deprecated because Carbon data types (FSRef) */
+ /* are not cross-platform, and thus not suitable for the freetype API. */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FSRef( FT_Library library,
+ const FSRef* ref,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Error error;
+ FT_Open_Args args;
+ OSErr err;
+ UInt8 pathname[PATH_MAX];
+
+
+ if ( !ref )
+ return FT_THROW( Invalid_Argument );
+
+ err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
+ if ( err )
+ error = FT_THROW( Cannot_Open_Resource );
+
+ error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+ if ( error != 0 || *aface != NULL )
+ return error;
+
+ /* fallback to datafork font */
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSSpec */
+ /* */
+ /* <Description> */
+ /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */
+ /* accepts an FSSpec instead of a path. */
+ /* */
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FSSpec( FT_Library library,
+ const FSSpec* spec,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+ FT_UNUSED( library );
+ FT_UNUSED( spec );
+ FT_UNUSED( face_index );
+ FT_UNUSED( aface );
+
+ return FT_THROW( Unimplemented_Feature );
+#else
+ FSRef ref;
+
+
+ if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
+ return FT_THROW( Invalid_Argument );
+ else
+ return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
+#endif
+ }
+
+#endif /* FT_MACINTOSH */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
new file mode 100644
index 0000000000..96d460d596
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
@@ -0,0 +1,4867 @@
+/***************************************************************************/
+/* */
+/* ftobjs.c */
+/* */
+/* The FreeType private base classes (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h" /* for SFNT_Load_Table_Func */
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svkern.h"
+#include "../../include/freetype/internal/services/svtteng.h"
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#include "ftbase.h"
+#endif
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#include "../../include/freetype/ftbitmap.h"
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `conversion from XXX to YYY, */
+ /* possible loss of data' in order to compile cleanly with */
+ /* the maximum level of warnings: `md5.c' is non-FreeType */
+ /* code, and it gets used during development builds only. */
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif /* _MSC_VER */
+
+ /* it's easiest to include `md5.c' directly */
+#define free md5_free /* suppress a shadow warning */
+#include "md5.c"
+#undef free
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#define GRID_FIT_METRICS
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_service_list_lookup( FT_ServiceDesc service_descriptors,
+ const char* service_id )
+ {
+ FT_Pointer result = NULL;
+ FT_ServiceDesc desc = service_descriptors;
+
+
+ if ( desc && service_id )
+ {
+ for ( ; desc->serv_id != NULL; desc++ )
+ {
+ if ( ft_strcmp( desc->serv_id, service_id ) == 0 )
+ {
+ result = (FT_Pointer)desc->serv_data;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level )
+ {
+ valid->base = base;
+ valid->limit = limit;
+ valid->level = level;
+ valid->error = FT_Err_Ok;
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ ft_validator_run( FT_Validator valid )
+ {
+ /* This function doesn't work! None should call it. */
+ FT_UNUSED( valid );
+
+ return -1;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error )
+ {
+ /* since the cast below also disables the compiler's */
+ /* type check, we introduce a dummy variable, which */
+ /* will be optimized away */
+ volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;
+
+
+ valid->error = error;
+
+ /* throw away volatileness; use `jump_buffer' or the */
+ /* compiler may warn about an unused local variable */
+ ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** S T R E A M ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* create a new input stream from an FT_Open_Args structure */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_New( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Stream *astream )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Stream stream = NULL;
+
+
+ *astream = 0;
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !args )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ if ( FT_NEW( stream ) )
+ goto Exit;
+
+ stream->memory = memory;
+
+ if ( args->flags & FT_OPEN_MEMORY )
+ {
+ /* create a memory-based stream */
+ FT_Stream_OpenMemory( stream,
+ (const FT_Byte*)args->memory_base,
+ args->memory_size );
+ }
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+ else if ( args->flags & FT_OPEN_PATHNAME )
+ {
+ /* create a normal system stream */
+ error = FT_Stream_Open( stream, args->pathname );
+ stream->pathname.pointer = args->pathname;
+ }
+ else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )
+ {
+ /* use an existing, user-provided stream */
+
+ /* in this case, we do not need to allocate a new stream object */
+ /* since the caller is responsible for closing it himself */
+ FT_FREE( stream );
+ stream = args->stream;
+ }
+
+#endif
+
+ else
+ error = FT_THROW( Invalid_Argument );
+
+ if ( error )
+ FT_FREE( stream );
+ else
+ stream->memory = memory; /* just to be certain */
+
+ *astream = stream;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_Free( FT_Stream stream,
+ FT_Int external )
+ {
+ if ( stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ FT_Stream_Close( stream );
+
+ if ( !external )
+ FT_FREE( stream );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static FT_Error
+ ft_glyphslot_init( FT_GlyphSlot slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Driver_Class clazz = driver->clazz;
+ FT_Memory memory = driver->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Slot_Internal internal = NULL;
+
+
+ slot->library = driver->root.library;
+
+ if ( FT_NEW( internal ) )
+ goto Exit;
+
+ slot->internal = internal;
+
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ error = FT_GlyphLoader_New( memory, &internal->loader );
+
+ if ( !error && clazz->init_slot )
+ error = clazz->init_slot( slot );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_glyphslot_free_bitmap( FT_GlyphSlot slot )
+ {
+ if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+ {
+ FT_Memory memory = FT_FACE_MEMORY( slot->face );
+
+
+ FT_FREE( slot->bitmap.buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+ else
+ {
+ /* assume that the bitmap buffer was stolen or not */
+ /* allocated from the heap */
+ slot->bitmap.buffer = NULL;
+ }
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_glyphslot_set_bitmap( FT_GlyphSlot slot,
+ FT_Byte* buffer )
+ {
+ ft_glyphslot_free_bitmap( slot );
+
+ slot->bitmap.buffer = buffer;
+
+ FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
+ FT_ULong size )
+ {
+ FT_Memory memory = FT_FACE_MEMORY( slot->face );
+ FT_Error error;
+
+
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ FT_FREE( slot->bitmap.buffer );
+ else
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ (void)FT_ALLOC( slot->bitmap.buffer, size );
+ return error;
+ }
+
+
+ static void
+ ft_glyphslot_clear( FT_GlyphSlot slot )
+ {
+ /* free bitmap if needed */
+ ft_glyphslot_free_bitmap( slot );
+
+ /* clear all public fields in the glyph slot */
+ FT_ZERO( &slot->metrics );
+ FT_ZERO( &slot->outline );
+
+ slot->bitmap.width = 0;
+ slot->bitmap.rows = 0;
+ slot->bitmap.pitch = 0;
+ slot->bitmap.pixel_mode = 0;
+ /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */
+
+ slot->bitmap_left = 0;
+ slot->bitmap_top = 0;
+ slot->num_subglyphs = 0;
+ slot->subglyphs = 0;
+ slot->control_data = 0;
+ slot->control_len = 0;
+ slot->other = 0;
+ slot->format = FT_GLYPH_FORMAT_NONE;
+
+ slot->linearHoriAdvance = 0;
+ slot->linearVertAdvance = 0;
+ slot->lsb_delta = 0;
+ slot->rsb_delta = 0;
+ }
+
+
+ static void
+ ft_glyphslot_done( FT_GlyphSlot slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Driver_Class clazz = driver->clazz;
+ FT_Memory memory = driver->root.memory;
+
+
+ if ( clazz->done_slot )
+ clazz->done_slot( slot );
+
+ /* free bitmap buffer if needed */
+ ft_glyphslot_free_bitmap( slot );
+
+ /* slot->internal might be NULL in out-of-memory situations */
+ if ( slot->internal )
+ {
+ /* free glyph loader */
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ {
+ FT_GlyphLoader_Done( slot->internal->loader );
+ slot->internal->loader = 0;
+ }
+
+ FT_FREE( slot->internal );
+ }
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_New_GlyphSlot( FT_Face face,
+ FT_GlyphSlot *aslot )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Driver_Class clazz;
+ FT_Memory memory;
+ FT_GlyphSlot slot = NULL;
+
+
+ if ( !face || !face->driver )
+ return FT_THROW( Invalid_Argument );
+
+ driver = face->driver;
+ clazz = driver->clazz;
+ memory = driver->root.memory;
+
+ FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" ));
+ if ( !FT_ALLOC( slot, clazz->slot_object_size ) )
+ {
+ slot->face = face;
+
+ error = ft_glyphslot_init( slot );
+ if ( error )
+ {
+ ft_glyphslot_done( slot );
+ FT_FREE( slot );
+ goto Exit;
+ }
+
+ slot->next = face->glyph;
+ face->glyph = slot;
+
+ if ( aslot )
+ *aslot = slot;
+ }
+ else if ( aslot )
+ *aslot = 0;
+
+
+ Exit:
+ FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ FT_Done_GlyphSlot( FT_GlyphSlot slot )
+ {
+ if ( slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Memory memory = driver->root.memory;
+ FT_GlyphSlot prev;
+ FT_GlyphSlot cur;
+
+
+ /* Remove slot from its parent face's list */
+ prev = NULL;
+ cur = slot->face->glyph;
+
+ while ( cur )
+ {
+ if ( cur == slot )
+ {
+ if ( !prev )
+ slot->face->glyph = cur->next;
+ else
+ prev->next = cur->next;
+
+ /* finalize client-specific data */
+ if ( slot->generic.finalizer )
+ slot->generic.finalizer( slot );
+
+ ft_glyphslot_done( slot );
+ FT_FREE( slot );
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+ }
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Set_Transform( FT_Face face,
+ FT_Matrix* matrix,
+ FT_Vector* delta )
+ {
+ FT_Face_Internal internal;
+
+
+ if ( !face )
+ return;
+
+ internal = face->internal;
+
+ internal->transform_flags = 0;
+
+ if ( !matrix )
+ {
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+ matrix = &internal->transform_matrix;
+ }
+ else
+ internal->transform_matrix = *matrix;
+
+ /* set transform_flags bit flag 0 if `matrix' isn't the identity */
+ if ( ( matrix->xy | matrix->yx ) ||
+ matrix->xx != 0x10000L ||
+ matrix->yy != 0x10000L )
+ internal->transform_flags |= 1;
+
+ if ( !delta )
+ {
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+ delta = &internal->transform_delta;
+ }
+ else
+ internal->transform_delta = *delta;
+
+ /* set transform_flags bit flag 1 if `delta' isn't the null vector */
+ if ( delta->x | delta->y )
+ internal->transform_flags |= 2;
+ }
+
+
+ static FT_Renderer
+ ft_lookup_glyph_renderer( FT_GlyphSlot slot );
+
+
+#ifdef GRID_FIT_METRICS
+ static void
+ ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot,
+ FT_Bool vertical )
+ {
+ FT_Glyph_Metrics* metrics = &slot->metrics;
+ FT_Pos right, bottom;
+
+
+ if ( vertical )
+ {
+ metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+ metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+ right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
+ bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+
+ metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+ metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+ metrics->width = right - metrics->vertBearingX;
+ metrics->height = bottom - metrics->vertBearingY;
+ }
+ else
+ {
+ metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+ metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+ right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );
+ bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );
+
+ metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+ metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+ metrics->width = right - metrics->horiBearingX;
+ metrics->height = metrics->horiBearingY - bottom;
+ }
+
+ metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
+ metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+ }
+#endif /* GRID_FIT_METRICS */
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Glyph( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_GlyphSlot slot;
+ FT_Library library;
+ FT_Bool autohint = FALSE;
+ FT_Module hinter;
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( !face || !face->size || !face->glyph )
+ return FT_THROW( Invalid_Face_Handle );
+
+ /* The validity test for `glyph_index' is performed by the */
+ /* font drivers. */
+
+ slot = face->glyph;
+ ft_glyphslot_clear( slot );
+
+ driver = face->driver;
+ library = driver->root.library;
+ hinter = library->auto_hinter;
+
+ /* resolve load flags dependencies */
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE |
+ FT_LOAD_IGNORE_TRANSFORM;
+
+ if ( load_flags & FT_LOAD_NO_SCALE )
+ {
+ load_flags |= FT_LOAD_NO_HINTING |
+ FT_LOAD_NO_BITMAP;
+
+ load_flags &= ~FT_LOAD_RENDER;
+ }
+
+ /*
+ * Determine whether we need to auto-hint or not.
+ * The general rules are:
+ *
+ * - Do only auto-hinting if we have a hinter module, a scalable font
+ * format dealing with outlines, and no transforms except simple
+ * slants and/or rotations by integer multiples of 90 degrees.
+ *
+ * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
+ * have a native font hinter.
+ *
+ * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't
+ * any hinting bytecode in the TrueType/OpenType font.
+ *
+ * - Exception: The font is `tricky' and requires the native hinter to
+ * load properly.
+ */
+
+ if ( hinter &&
+ !( load_flags & FT_LOAD_NO_HINTING ) &&
+ !( load_flags & FT_LOAD_NO_AUTOHINT ) &&
+ FT_DRIVER_IS_SCALABLE( driver ) &&
+ FT_DRIVER_USES_OUTLINES( driver ) &&
+ !FT_IS_TRICKY( face ) &&
+ ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) ||
+ ( face->internal->transform_matrix.yx == 0 &&
+ face->internal->transform_matrix.xx != 0 ) ||
+ ( face->internal->transform_matrix.xx == 0 &&
+ face->internal->transform_matrix.yx != 0 ) ) )
+ {
+ if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
+ !FT_DRIVER_HAS_HINTER( driver ) )
+ autohint = TRUE;
+ else
+ {
+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+ /* the check for `num_locations' assures that we actually */
+ /* test for instructions in a TTF and not in a CFF-based OTF */
+ if ( mode == FT_RENDER_MODE_LIGHT ||
+ face->internal->ignore_unpatented_hinter ||
+ ( FT_IS_SFNT( face ) &&
+ ttface->num_locations &&
+ ttface->max_profile.maxSizeOfInstructions == 0 ) )
+ autohint = TRUE;
+ }
+ }
+
+ if ( autohint )
+ {
+ FT_AutoHinter_Interface hinting;
+
+
+ /* try to load embedded bitmaps first if available */
+ /* */
+ /* XXX: This is really a temporary hack that should disappear */
+ /* promptly with FreeType 2.1! */
+ /* */
+ if ( FT_HAS_FIXED_SIZES( face ) &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ error = driver->clazz->load_glyph( slot, face->size,
+ glyph_index,
+ load_flags | FT_LOAD_SBITS_ONLY );
+
+ if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )
+ goto Load_Ok;
+ }
+
+ {
+ FT_Face_Internal internal = face->internal;
+ FT_Int transform_flags = internal->transform_flags;
+
+
+ /* since the auto-hinter calls FT_Load_Glyph by itself, */
+ /* make sure that glyphs aren't transformed */
+ internal->transform_flags = 0;
+
+ /* load auto-hinted outline */
+ hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;
+
+ error = hinting->load_glyph( (FT_AutoHinter)hinter,
+ slot, face->size,
+ glyph_index, load_flags );
+
+ internal->transform_flags = transform_flags;
+ }
+ }
+ else
+ {
+ error = driver->clazz->load_glyph( slot,
+ face->size,
+ glyph_index,
+ load_flags );
+ if ( error )
+ goto Exit;
+
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* check that the loaded outline is correct */
+ error = FT_Outline_Check( &slot->outline );
+ if ( error )
+ goto Exit;
+
+#ifdef GRID_FIT_METRICS
+ if ( !( load_flags & FT_LOAD_NO_HINTING ) )
+ ft_glyphslot_grid_fit_metrics( slot,
+ FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );
+#endif
+ }
+ }
+
+ Load_Ok:
+ /* compute the advance */
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ slot->advance.x = 0;
+ slot->advance.y = slot->metrics.vertAdvance;
+ }
+ else
+ {
+ slot->advance.x = slot->metrics.horiAdvance;
+ slot->advance.y = 0;
+ }
+
+ /* compute the linear advance in 16.16 pixels */
+ if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
+ ( FT_IS_SCALABLE( face ) ) )
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ /* it's tricky! */
+ slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
+ metrics->x_scale, 64 );
+
+ slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
+ metrics->y_scale, 64 );
+ }
+
+ if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
+ {
+ FT_Face_Internal internal = face->internal;
+
+
+ /* now, transform the glyph image if needed */
+ if ( internal->transform_flags )
+ {
+ /* get renderer */
+ FT_Renderer renderer = ft_lookup_glyph_renderer( slot );
+
+
+ if ( renderer )
+ error = renderer->clazz->transform_glyph(
+ renderer, slot,
+ &internal->transform_matrix,
+ &internal->transform_delta );
+ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* apply `standard' transformation if no renderer is available */
+ if ( internal->transform_flags & 1 )
+ FT_Outline_Transform( &slot->outline,
+ &internal->transform_matrix );
+
+ if ( internal->transform_flags & 2 )
+ FT_Outline_Translate( &slot->outline,
+ internal->transform_delta.x,
+ internal->transform_delta.y );
+ }
+
+ /* transform advance */
+ FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
+ }
+ }
+
+ FT_TRACE5(( " x advance: %d\n" , slot->advance.x ));
+ FT_TRACE5(( " y advance: %d\n" , slot->advance.y ));
+
+ FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance ));
+ FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance ));
+
+ /* do we need to render the image now? */
+ if ( !error &&
+ slot->format != FT_GLYPH_FORMAT_BITMAP &&
+ slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
+ load_flags & FT_LOAD_RENDER )
+ {
+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+ if ( mode == FT_RENDER_MODE_NORMAL &&
+ (load_flags & FT_LOAD_MONOCHROME ) )
+ mode = FT_RENDER_MODE_MONO;
+
+ error = FT_Render_Glyph( slot, mode );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_Int32 load_flags )
+ {
+ FT_UInt glyph_index;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ glyph_index = (FT_UInt)char_code;
+ if ( face->charmap )
+ glyph_index = FT_Get_Char_Index( face, char_code );
+
+ return FT_Load_Glyph( face, glyph_index, load_flags );
+ }
+
+
+ /* destructor for sizes list */
+ static void
+ destroy_size( FT_Memory memory,
+ FT_Size size,
+ FT_Driver driver )
+ {
+ /* finalize client-specific data */
+ if ( size->generic.finalizer )
+ size->generic.finalizer( size );
+
+ /* finalize format-specific stuff */
+ if ( driver->clazz->done_size )
+ driver->clazz->done_size( size );
+
+ FT_FREE( size->internal );
+ FT_FREE( size );
+ }
+
+
+ static void
+ ft_cmap_done_internal( FT_CMap cmap );
+
+
+ static void
+ destroy_charmaps( FT_Face face,
+ FT_Memory memory )
+ {
+ FT_Int n;
+
+
+ if ( !face )
+ return;
+
+ for ( n = 0; n < face->num_charmaps; n++ )
+ {
+ FT_CMap cmap = FT_CMAP( face->charmaps[n] );
+
+
+ ft_cmap_done_internal( cmap );
+
+ face->charmaps[n] = NULL;
+ }
+
+ FT_FREE( face->charmaps );
+ face->num_charmaps = 0;
+ }
+
+
+ /* destructor for faces list */
+ static void
+ destroy_face( FT_Memory memory,
+ FT_Face face,
+ FT_Driver driver )
+ {
+ FT_Driver_Class clazz = driver->clazz;
+
+
+ /* discard auto-hinting data */
+ if ( face->autohint.finalizer )
+ face->autohint.finalizer( face->autohint.data );
+
+ /* Discard glyph slots for this face. */
+ /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */
+ while ( face->glyph )
+ FT_Done_GlyphSlot( face->glyph );
+
+ /* discard all sizes for this face */
+ FT_List_Finalize( &face->sizes_list,
+ (FT_List_Destructor)destroy_size,
+ memory,
+ driver );
+ face->size = 0;
+
+ /* now discard client data */
+ if ( face->generic.finalizer )
+ face->generic.finalizer( face );
+
+ /* discard charmaps */
+ destroy_charmaps( face, memory );
+
+ /* finalize format-specific stuff */
+ if ( clazz->done_face )
+ clazz->done_face( face );
+
+ /* close the stream for this face if needed */
+ FT_Stream_Free(
+ face->stream,
+ ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
+
+ face->stream = 0;
+
+ /* get rid of it */
+ if ( face->internal )
+ {
+ FT_FREE( face->internal );
+ }
+ FT_FREE( face );
+ }
+
+
+ static void
+ Destroy_Driver( FT_Driver driver )
+ {
+ FT_List_Finalize( &driver->faces_list,
+ (FT_List_Destructor)destroy_face,
+ driver->root.memory,
+ driver );
+
+ /* check whether we need to drop the driver's glyph loader */
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ FT_GlyphLoader_Done( driver->glyph_loader );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* find_unicode_charmap */
+ /* */
+ /* <Description> */
+ /* This function finds a Unicode charmap, if there is one. */
+ /* And if there is more than one, it tries to favour the more */
+ /* extensive one, i.e., one that supports UCS-4 against those which */
+ /* are limited to the BMP (said UCS-2 encoding.) */
+ /* */
+ /* This function is called from open_face() (just below), and also */
+ /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */
+ /* */
+ static FT_Error
+ find_unicode_charmap( FT_Face face )
+ {
+ FT_CharMap* first;
+ FT_CharMap* cur;
+
+
+ /* caller should have already checked that `face' is valid */
+ FT_ASSERT( face );
+
+ first = face->charmaps;
+
+ if ( !first )
+ return FT_THROW( Invalid_CharMap_Handle );
+
+ /*
+ * The original TrueType specification(s) only specified charmap
+ * formats that are capable of mapping 8 or 16 bit character codes to
+ * glyph indices.
+ *
+ * However, recent updates to the Apple and OpenType specifications
+ * introduced new formats that are capable of mapping 32-bit character
+ * codes as well. And these are already used on some fonts, mainly to
+ * map non-BMP Asian ideographs as defined in Unicode.
+ *
+ * For compatibility purposes, these fonts generally come with
+ * *several* Unicode charmaps:
+ *
+ * - One of them in the "old" 16-bit format, that cannot access
+ * all glyphs in the font.
+ *
+ * - Another one in the "new" 32-bit format, that can access all
+ * the glyphs.
+ *
+ * This function has been written to always favor a 32-bit charmap
+ * when found. Otherwise, a 16-bit one is returned when found.
+ */
+
+ /* Since the `interesting' table, with IDs (3,10), is normally the */
+ /* last one, we loop backwards. This loses with type1 fonts with */
+ /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */
+ /* chars (.01% ?), and this is the same about 99.99% of the time! */
+
+ cur = first + face->num_charmaps; /* points after the last one */
+
+ for ( ; --cur >= first; )
+ {
+ if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+ {
+ /* XXX If some new encodings to represent UCS-4 are added, */
+ /* they should be added here. */
+ if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
+ cur[0]->encoding_id == TT_MS_ID_UCS_4 ) ||
+ ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+ cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return FT_Err_Ok;
+ }
+ }
+ }
+
+ /* We do not have any UCS-4 charmap. */
+ /* Do the loop again and search for UCS-2 charmaps. */
+ cur = first + face->num_charmaps;
+
+ for ( ; --cur >= first; )
+ {
+ if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return FT_Err_Ok;
+ }
+ }
+
+ return FT_THROW( Invalid_CharMap_Handle );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* find_variant_selector_charmap */
+ /* */
+ /* <Description> */
+ /* This function finds the variant selector charmap, if there is one. */
+ /* There can only be one (platform=0, specific=5, format=14). */
+ /* */
+ static FT_CharMap
+ find_variant_selector_charmap( FT_Face face )
+ {
+ FT_CharMap* first;
+ FT_CharMap* end;
+ FT_CharMap* cur;
+
+
+ /* caller should have already checked that `face' is valid */
+ FT_ASSERT( face );
+
+ first = face->charmaps;
+
+ if ( !first )
+ return NULL;
+
+ end = first + face->num_charmaps; /* points after the last one */
+
+ for ( cur = first; cur < end; ++cur )
+ {
+ if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+ cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
+ FT_Get_CMap_Format( cur[0] ) == 14 )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UVS cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ return cur[0];
+ }
+ }
+
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* open_face */
+ /* */
+ /* <Description> */
+ /* This function does some work for FT_Open_Face(). */
+ /* */
+ static FT_Error
+ open_face( FT_Driver driver,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter* params,
+ FT_Face *aface )
+ {
+ FT_Memory memory;
+ FT_Driver_Class clazz;
+ FT_Face face = 0;
+ FT_Error error, error2;
+ FT_Face_Internal internal = NULL;
+
+
+ clazz = driver->clazz;
+ memory = driver->root.memory;
+
+ /* allocate the face object and perform basic initialization */
+ if ( FT_ALLOC( face, clazz->face_object_size ) )
+ goto Fail;
+
+ face->driver = driver;
+ face->memory = memory;
+ face->stream = stream;
+
+ if ( FT_NEW( internal ) )
+ goto Fail;
+
+ face->internal = internal;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ {
+ int i;
+
+
+ face->internal->incremental_interface = 0;
+ for ( i = 0; i < num_params && !face->internal->incremental_interface;
+ i++ )
+ if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )
+ face->internal->incremental_interface =
+ (FT_Incremental_Interface)params[i].data;
+ }
+#endif
+
+ if ( clazz->init_face )
+ error = clazz->init_face( stream,
+ face,
+ (FT_Int)face_index,
+ num_params,
+ params );
+ if ( error )
+ goto Fail;
+
+ /* select Unicode charmap by default */
+ error2 = find_unicode_charmap( face );
+
+ /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */
+ /* is returned. */
+
+ /* no error should happen, but we want to play safe */
+ if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )
+ {
+ error = error2;
+ goto Fail;
+ }
+
+ *aface = face;
+
+ Fail:
+ if ( error )
+ {
+ destroy_charmaps( face, memory );
+ if ( clazz->done_face )
+ clazz->done_face( face );
+ FT_FREE( internal );
+ FT_FREE( face );
+ *aface = 0;
+ }
+
+ return error;
+ }
+
+
+ /* there's a Mac-specific extended implementation of FT_New_Face() */
+ /* in src/base/ftmac.c */
+
+//#ifndef FT_MACINTOSH
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* pathname,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+
+
+ /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+ if ( !pathname )
+ return FT_THROW( Invalid_Argument );
+
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ args.stream = NULL;
+
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+//#endif
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Memory_Face( FT_Library library,
+ const FT_Byte* file_base,
+ FT_Long file_size,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+
+
+ /* test for valid `library' and `face' delayed to FT_Open_Face() */
+ if ( !file_base )
+ return FT_THROW( Invalid_Argument );
+
+ args.flags = FT_OPEN_MEMORY;
+ args.memory_base = file_base;
+ args.memory_size = file_size;
+ args.stream = NULL;
+
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
+ /* The behavior here is very similar to that in base/ftmac.c, but it */
+ /* is designed to work on non-mac systems, so no mac specific calls. */
+ /* */
+ /* We look at the file and determine if it is a mac dfont file or a mac */
+ /* resource file, or a macbinary file containing a mac resource file. */
+ /* */
+ /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */
+ /* the point, especially since there may be multiple `FOND' resources. */
+ /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */
+ /* they occur in the file. */
+ /* */
+ /* Note that multiple `POST' resources do not mean multiple postscript */
+ /* fonts; they all get jammed together to make what is essentially a */
+ /* pfb file. */
+ /* */
+ /* We aren't interested in `NFNT' or `FONT' bitmap resources. */
+ /* */
+ /* As soon as we get an `sfnt' load it into memory and pass it off to */
+ /* FT_Open_Face. */
+ /* */
+ /* If we have a (set of) `POST' resources, massage them into a (memory) */
+ /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */
+ /* going to try to save the kerning info. After all that lives in the */
+ /* `FOND' which isn't in the file containing the `POST' resources so */
+ /* we don't really have access to it. */
+
+
+ /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
+ /* It frees the memory it uses. */
+ /* From ftmac.c. */
+ static void
+ memory_stream_close( FT_Stream stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ FT_FREE( stream->base );
+
+ stream->size = 0;
+ stream->base = 0;
+ stream->close = 0;
+ }
+
+
+ /* Create a new memory stream from a buffer and a size. */
+ /* From ftmac.c. */
+ static FT_Error
+ new_memory_stream( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Stream_CloseFunc close,
+ FT_Stream *astream )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Stream stream = NULL;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !base )
+ return FT_THROW( Invalid_Argument );
+
+ *astream = 0;
+ memory = library->memory;
+ if ( FT_NEW( stream ) )
+ goto Exit;
+
+ FT_Stream_OpenMemory( stream, base, size );
+
+ stream->close = close;
+
+ *astream = stream;
+
+ Exit:
+ return error;
+ }
+
+
+ /* Create a new FT_Face given a buffer and a driver name. */
+ /* from ftmac.c */
+ FT_LOCAL_DEF( FT_Error )
+ open_face_from_buffer( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Long face_index,
+ const char* driver_name,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+ FT_Error error;
+ FT_Stream stream = NULL;
+ FT_Memory memory = library->memory;
+
+
+ error = new_memory_stream( library,
+ base,
+ size,
+ memory_stream_close,
+ &stream );
+ if ( error )
+ {
+ FT_FREE( base );
+ return error;
+ }
+
+ args.flags = FT_OPEN_STREAM;
+ args.stream = stream;
+ if ( driver_name )
+ {
+ args.flags = args.flags | FT_OPEN_DRIVER;
+ args.driver = FT_Get_Module( library, driver_name );
+ }
+
+#ifdef FT_MACINTOSH
+ /* At this point, face_index has served its purpose; */
+ /* whoever calls this function has already used it to */
+ /* locate the correct font data. We should not propagate */
+ /* this index to FT_Open_Face() (unless it is negative). */
+
+ if ( face_index > 0 )
+ face_index = 0;
+#endif
+
+ error = FT_Open_Face( library, &args, face_index, aface );
+
+ if ( error == FT_Err_Ok )
+ (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
+ else
+#ifdef FT_MACINTOSH
+ FT_Stream_Free( stream, 0 );
+#else
+ {
+ FT_Stream_Close( stream );
+ FT_FREE( stream );
+ }
+#endif
+
+ return error;
+ }
+
+
+ /* Look up `TYP1' or `CID ' table from sfnt table directory. */
+ /* `offset' and `length' must exclude the binary header in tables. */
+
+ /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */
+ /* format too. Here, since we can't expect that the TrueType font */
+ /* driver is loaded unconditially, we must parse the font by */
+ /* ourselves. We are only interested in the name of the table and */
+ /* the offset. */
+
+ static FT_Error
+ ft_lookup_PS_in_sfnt_stream( FT_Stream stream,
+ FT_Long face_index,
+ FT_ULong* offset,
+ FT_ULong* length,
+ FT_Bool* is_sfnt_cid )
+ {
+ FT_Error error;
+ FT_UShort numTables;
+ FT_Long pstable_index;
+ FT_ULong tag;
+ int i;
+
+
+ *offset = 0;
+ *length = 0;
+ *is_sfnt_cid = FALSE;
+
+ /* TODO: support for sfnt-wrapped PS/CID in TTC format */
+
+ /* version check for 'typ1' (should be ignored?) */
+ if ( FT_READ_ULONG( tag ) )
+ return error;
+ if ( tag != TTAG_typ1 )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( FT_READ_USHORT( numTables ) )
+ return error;
+ if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */
+ return error;
+
+ pstable_index = -1;
+ *is_sfnt_cid = FALSE;
+
+ for ( i = 0; i < numTables; i++ )
+ {
+ if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) ||
+ FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )
+ return error;
+
+ if ( tag == TTAG_CID )
+ {
+ pstable_index++;
+ *offset += 22;
+ *length -= 22;
+ *is_sfnt_cid = TRUE;
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+ }
+ else if ( tag == TTAG_TYP1 )
+ {
+ pstable_index++;
+ *offset += 24;
+ *length -= 24;
+ *is_sfnt_cid = FALSE;
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+ }
+ if ( face_index >= 0 && pstable_index == face_index )
+ return FT_Err_Ok;
+ }
+ return FT_THROW( Table_Missing );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ open_face_PS_from_sfnt_stream( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter *params,
+ FT_Face *aface )
+ {
+ FT_Error error;
+ FT_Memory memory = library->memory;
+ FT_ULong offset, length;
+ FT_Long pos;
+ FT_Bool is_sfnt_cid;
+ FT_Byte* sfnt_ps = NULL;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+
+
+ pos = FT_Stream_Pos( stream );
+
+ error = ft_lookup_PS_in_sfnt_stream( stream,
+ face_index,
+ &offset,
+ &length,
+ &is_sfnt_cid );
+ if ( error )
+ goto Exit;
+
+ if ( FT_Stream_Seek( stream, pos + offset ) )
+ goto Exit;
+
+ if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )
+ goto Exit;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );
+ if ( error )
+ goto Exit;
+
+ error = open_face_from_buffer( library,
+ sfnt_ps,
+ length,
+ FT_MIN( face_index, 0 ),
+ is_sfnt_cid ? "cid" : "type1",
+ aface );
+ Exit:
+ {
+ FT_Error error1;
+
+
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+ error1 = FT_Stream_Seek( stream, pos );
+ if ( error1 )
+ return error1;
+ }
+
+ return error;
+ }
+ }
+
+
+#ifndef FT_MACINTOSH
+
+ /* The resource header says we've got resource_cnt `POST' (type1) */
+ /* resources in this file. They all need to be coalesced into */
+ /* one lump which gets passed on to the type1 driver. */
+ /* Here can be only one PostScript font in a file so face_index */
+ /* must be 0 (or -1). */
+ /* */
+ static FT_Error
+ Mac_Read_POST_Resource( FT_Library library,
+ FT_Stream stream,
+ FT_Long *offsets,
+ FT_Long resource_cnt,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Error error = FT_ERR( Cannot_Open_Resource );
+ FT_Memory memory = library->memory;
+ FT_Byte* pfb_data = NULL;
+ int i, type, flags;
+ FT_Long len;
+ FT_Long pfb_len, pfb_pos, pfb_lenpos;
+ FT_Long rlen, temp;
+
+
+ if ( face_index == -1 )
+ face_index = 0;
+ if ( face_index != 0 )
+ return error;
+
+ /* Find the length of all the POST resources, concatenated. Assume */
+ /* worst case (each resource in its own section). */
+ pfb_len = 0;
+ for ( i = 0; i < resource_cnt; ++i )
+ {
+ error = FT_Stream_Seek( stream, offsets[i] );
+ if ( error )
+ goto Exit;
+ if ( FT_READ_LONG( temp ) )
+ goto Exit;
+ pfb_len += temp + 6;
+ }
+
+ if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )
+ goto Exit;
+
+ pfb_data[0] = 0x80;
+ pfb_data[1] = 1; /* Ascii section */
+ pfb_data[2] = 0; /* 4-byte length, fill in later */
+ pfb_data[3] = 0;
+ pfb_data[4] = 0;
+ pfb_data[5] = 0;
+ pfb_pos = 6;
+ pfb_lenpos = 2;
+
+ len = 0;
+ type = 1;
+ for ( i = 0; i < resource_cnt; ++i )
+ {
+ error = FT_Stream_Seek( stream, offsets[i] );
+ if ( error )
+ goto Exit2;
+ if ( FT_READ_LONG( rlen ) )
+ goto Exit;
+ if ( FT_READ_USHORT( flags ) )
+ goto Exit;
+ FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+ i, offsets[i], rlen, flags ));
+
+ /* postpone the check of rlen longer than buffer until FT_Stream_Read() */
+ if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */
+ continue;
+
+ /* the flags are part of the resource, so rlen >= 2. */
+ /* but some fonts declare rlen = 0 for empty fragment */
+ if ( rlen > 2 )
+ rlen -= 2;
+ else
+ rlen = 0;
+
+ if ( ( flags >> 8 ) == type )
+ len += rlen;
+ else
+ {
+ if ( pfb_lenpos + 3 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_lenpos ] = (FT_Byte)( len );
+ pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+ pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+ pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+ if ( ( flags >> 8 ) == 5 ) /* End of font mark */
+ break;
+
+ if ( pfb_pos + 6 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_pos++] = 0x80;
+
+ type = flags >> 8;
+ len = rlen;
+
+ pfb_data[pfb_pos++] = (FT_Byte)type;
+ pfb_lenpos = pfb_pos;
+ pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */
+ pfb_data[pfb_pos++] = 0;
+ pfb_data[pfb_pos++] = 0;
+ pfb_data[pfb_pos++] = 0;
+ }
+
+ error = FT_ERR( Cannot_Open_Resource );
+ if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
+ goto Exit2;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );
+ if ( error )
+ goto Exit2;
+ pfb_pos += rlen;
+ }
+
+ if ( pfb_pos + 2 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_pos++] = 0x80;
+ pfb_data[pfb_pos++] = 3;
+
+ if ( pfb_lenpos + 3 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_lenpos ] = (FT_Byte)( len );
+ pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+ pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+ pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+ return open_face_from_buffer( library,
+ pfb_data,
+ pfb_pos,
+ face_index,
+ "type1",
+ aface );
+
+ Exit2:
+ FT_FREE( pfb_data );
+
+ Exit:
+ return error;
+ }
+
+
+ /* The resource header says we've got resource_cnt `sfnt' */
+ /* (TrueType/OpenType) resources in this file. Look through */
+ /* them for the one indicated by face_index, load it into mem, */
+ /* pass it on the the truetype driver and return it. */
+ /* */
+ static FT_Error
+ Mac_Read_sfnt_Resource( FT_Library library,
+ FT_Stream stream,
+ FT_Long *offsets,
+ FT_Long resource_cnt,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Memory memory = library->memory;
+ FT_Byte* sfnt_data = NULL;
+ FT_Error error;
+ FT_Long flag_offset;
+ FT_Long rlen;
+ int is_cff;
+ FT_Long face_index_in_resource = 0;
+
+
+ if ( face_index == -1 )
+ face_index = 0;
+ if ( face_index >= resource_cnt )
+ return FT_THROW( Cannot_Open_Resource );
+
+ flag_offset = offsets[face_index];
+ error = FT_Stream_Seek( stream, flag_offset );
+ if ( error )
+ goto Exit;
+
+ if ( FT_READ_LONG( rlen ) )
+ goto Exit;
+ if ( rlen == -1 )
+ return FT_THROW( Cannot_Open_Resource );
+
+ error = open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ 0, NULL,
+ aface );
+ if ( !error )
+ goto Exit;
+
+ /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
+ if ( FT_Stream_Seek( stream, flag_offset + 4 ) )
+ goto Exit;
+
+ if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )
+ return error;
+ error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );
+ if ( error )
+ goto Exit;
+
+ is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+ error = open_face_from_buffer( library,
+ sfnt_data,
+ rlen,
+ face_index_in_resource,
+ is_cff ? "cff" : "truetype",
+ aface );
+
+ Exit:
+ return error;
+ }
+
+
+ /* Check for a valid resource fork header, or a valid dfont */
+ /* header. In a resource fork the first 16 bytes are repeated */
+ /* at the location specified by bytes 4-7. In a dfont bytes */
+ /* 4-7 point to 16 bytes of zeroes instead. */
+ /* */
+ static FT_Error
+ IsMacResource( FT_Library library,
+ FT_Stream stream,
+ FT_Long resource_offset,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_Long map_offset, rdara_pos;
+ FT_Long *data_offsets;
+ FT_Long count;
+
+
+ error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
+ &map_offset, &rdara_pos );
+ if ( error )
+ return error;
+
+ error = FT_Raccess_Get_DataOffsets( library, stream,
+ map_offset, rdara_pos,
+ TTAG_POST,
+ &data_offsets, &count );
+ if ( !error )
+ {
+ error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
+ face_index, aface );
+ FT_FREE( data_offsets );
+ /* POST exists in an LWFN providing a single face */
+ if ( !error )
+ (*aface)->num_faces = 1;
+ return error;
+ }
+
+ error = FT_Raccess_Get_DataOffsets( library, stream,
+ map_offset, rdara_pos,
+ TTAG_sfnt,
+ &data_offsets, &count );
+ if ( !error )
+ {
+ FT_Long face_index_internal = face_index % count;
+
+
+ error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
+ face_index_internal, aface );
+ FT_FREE( data_offsets );
+ if ( !error )
+ (*aface)->num_faces = count;
+ }
+
+ return error;
+ }
+
+
+ /* Check for a valid macbinary header, and if we find one */
+ /* check that the (flattened) resource fork in it is valid. */
+ /* */
+ static FT_Error
+ IsMacBinary( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ unsigned char header[128];
+ FT_Error error;
+ FT_Long dlen, offset;
+
+
+ if ( NULL == stream )
+ return FT_THROW( Invalid_Stream_Operation );
+
+ error = FT_Stream_Seek( stream, 0 );
+ if ( error )
+ goto Exit;
+
+ error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );
+ if ( error )
+ goto Exit;
+
+ if ( header[ 0] != 0 ||
+ header[74] != 0 ||
+ header[82] != 0 ||
+ header[ 1] == 0 ||
+ header[ 1] > 33 ||
+ header[63] != 0 ||
+ header[2 + header[1]] != 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ dlen = ( header[0x53] << 24 ) |
+ ( header[0x54] << 16 ) |
+ ( header[0x55] << 8 ) |
+ header[0x56];
+#if 0
+ rlen = ( header[0x57] << 24 ) |
+ ( header[0x58] << 16 ) |
+ ( header[0x59] << 8 ) |
+ header[0x5a];
+#endif /* 0 */
+ offset = 128 + ( ( dlen + 127 ) & ~127 );
+
+ return IsMacResource( library, stream, offset, face_index, aface );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_face_in_embedded_rfork( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface,
+ const FT_Open_Args *args )
+ {
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+ FT_Memory memory = library->memory;
+ FT_Error error = FT_ERR( Unknown_File_Format );
+ int i;
+
+ char * file_names[FT_RACCESS_N_RULES];
+ FT_Long offsets[FT_RACCESS_N_RULES];
+ FT_Error errors[FT_RACCESS_N_RULES];
+ FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */
+
+ FT_Open_Args args2;
+ FT_Stream stream2 = 0;
+
+
+ FT_Raccess_Guess( library, stream,
+ args->pathname, file_names, offsets, errors );
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
+ if ( is_darwin_vfs && vfs_rfork_has_no_font )
+ {
+ FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+ " is already checked and"
+ " no font is found\n", i ));
+ continue;
+ }
+
+ if ( errors[i] )
+ {
+ FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i ));
+ continue;
+ }
+
+ args2.flags = FT_OPEN_PATHNAME;
+ args2.pathname = file_names[i] ? file_names[i] : args->pathname;
+
+ FT_TRACE3(( "Try rule %d: %s (offset=%d) ...",
+ i, args2.pathname, offsets[i] ));
+
+ error = FT_Stream_New( library, &args2, &stream2 );
+ if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )
+ vfs_rfork_has_no_font = TRUE;
+
+ if ( error )
+ {
+ FT_TRACE3(( "failed\n" ));
+ continue;
+ }
+
+ error = IsMacResource( library, stream2, offsets[i],
+ face_index, aface );
+ FT_Stream_Free( stream2, 0 );
+
+ FT_TRACE3(( "%s\n", error ? "failed": "successful" ));
+
+ if ( !error )
+ break;
+ else if ( is_darwin_vfs )
+ vfs_rfork_has_no_font = TRUE;
+ }
+
+ for (i = 0; i < FT_RACCESS_N_RULES; i++)
+ {
+ if ( file_names[i] )
+ FT_FREE( file_names[i] );
+ }
+
+ /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
+ if ( error )
+ error = FT_ERR( Unknown_File_Format );
+
+ return error;
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+ }
+
+
+ /* Check for some macintosh formats without Carbon framework. */
+ /* Is this a macbinary file? If so look at the resource fork. */
+ /* Is this a mac dfont file? */
+ /* Is this an old style resource fork? (in data) */
+ /* Else call load_face_in_embedded_rfork to try extra rules */
+ /* (defined in `ftrfork.c'). */
+ /* */
+ static FT_Error
+ load_mac_face( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface,
+ const FT_Open_Args *args )
+ {
+ FT_Error error;
+ FT_UNUSED( args );
+
+
+ error = IsMacBinary( library, stream, face_index, aface );
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+ FT_TRACE3(( "Try as dfont: %s ...", args->pathname ));
+
+ error = IsMacResource( library, stream, 0, face_index, aface );
+
+ FT_TRACE3(( "%s\n", error ? "failed" : "successful" ));
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+ }
+
+ if ( ( FT_ERR_EQ( error, Unknown_File_Format ) ||
+ FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&
+ ( args->flags & FT_OPEN_PATHNAME ) )
+ error = load_face_in_embedded_rfork( library, stream,
+ face_index, aface, args );
+ return error;
+ }
+#endif
+
+#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Open_Face( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Error error;
+ FT_Driver driver = NULL;
+ FT_Memory memory = NULL;
+ FT_Stream stream = NULL;
+ FT_Face face = NULL;
+ FT_ListNode node = NULL;
+ FT_Bool external_stream;
+ FT_Module* cur;
+ FT_Module* limit;
+
+
+ /* test for valid `library' delayed to */
+ /* FT_Stream_New() */
+
+ if ( ( !aface && face_index >= 0 ) || !args )
+ return FT_THROW( Invalid_Argument );
+
+ external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
+ args->stream );
+
+ /* create input stream */
+ error = FT_Stream_New( library, args, &stream );
+ if ( error )
+ goto Fail3;
+
+ memory = library->memory;
+
+ /* If the font driver is specified in the `args' structure, use */
+ /* it. Otherwise, we scan the list of registered drivers. */
+ if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )
+ {
+ driver = FT_DRIVER( args->driver );
+
+ /* not all modules are drivers, so check... */
+ if ( FT_MODULE_IS_DRIVER( driver ) )
+ {
+ FT_Int num_params = 0;
+ FT_Parameter* params = 0;
+
+
+ if ( args->flags & FT_OPEN_PARAMS )
+ {
+ num_params = args->num_params;
+ params = args->params;
+ }
+
+ error = open_face( driver, stream, face_index,
+ num_params, params, &face );
+ if ( !error )
+ goto Success;
+ }
+ else
+ error = FT_THROW( Invalid_Handle );
+
+ FT_Stream_Free( stream, external_stream );
+ goto Fail;
+ }
+ else
+ {
+ error = FT_ERR( Missing_Module );
+
+ /* check each font driver for an appropriate format */
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ for ( ; cur < limit; cur++ )
+ {
+ /* not all modules are font drivers, so check... */
+ if ( FT_MODULE_IS_DRIVER( cur[0] ) )
+ {
+ FT_Int num_params = 0;
+ FT_Parameter* params = 0;
+
+
+ driver = FT_DRIVER( cur[0] );
+
+ if ( args->flags & FT_OPEN_PARAMS )
+ {
+ num_params = args->num_params;
+ params = args->params;
+ }
+
+ error = open_face( driver, stream, face_index,
+ num_params, params, &face );
+ if ( !error )
+ goto Success;
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
+ FT_ERR_EQ( error, Table_Missing ) )
+ {
+ /* TrueType but essential tables are missing */
+ if ( FT_Stream_Seek( stream, 0 ) )
+ break;
+
+ error = open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ num_params,
+ params,
+ aface );
+ if ( !error )
+ {
+ FT_Stream_Free( stream, external_stream );
+ return error;
+ }
+ }
+#endif
+
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Fail3;
+ }
+ }
+
+ Fail3:
+ /* If we are on the mac, and we get an */
+ /* FT_Err_Invalid_Stream_Operation it may be because we have an */
+ /* empty data fork, so we need to check the resource fork. */
+ if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) &&
+ FT_ERR_NEQ( error, Unknown_File_Format ) &&
+ FT_ERR_NEQ( error, Invalid_Stream_Operation ) )
+ goto Fail2;
+
+#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
+ error = load_mac_face( library, stream, face_index, aface, args );
+ if ( !error )
+ {
+ /* We don't want to go to Success here. We've already done that. */
+ /* On the other hand, if we succeeded we still need to close this */
+ /* stream (we opened a different stream which extracted the */
+ /* interesting information out of this stream here. That stream */
+ /* will still be open and the face will point to it). */
+ FT_Stream_Free( stream, external_stream );
+ return error;
+ }
+
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Fail2;
+#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+ /* no driver is able to handle this format */
+ error = FT_THROW( Unknown_File_Format );
+
+ Fail2:
+ FT_Stream_Free( stream, external_stream );
+ goto Fail;
+ }
+
+ Success:
+ FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" ));
+
+ /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
+ if ( external_stream )
+ face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
+
+ /* add the face object to its driver's list */
+ if ( FT_NEW( node ) )
+ goto Fail;
+
+ node->data = face;
+ /* don't assume driver is the same as face->driver, so use */
+ /* face->driver instead. */
+ FT_List_Add( &face->driver->faces_list, node );
+
+ /* now allocate a glyph slot object for the face */
+ FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
+
+ if ( face_index >= 0 )
+ {
+ error = FT_New_GlyphSlot( face, NULL );
+ if ( error )
+ goto Fail;
+
+ /* finally, allocate a size object for the face */
+ {
+ FT_Size size;
+
+
+ FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
+
+ error = FT_New_Size( face, &size );
+ if ( error )
+ goto Fail;
+
+ face->size = size;
+ }
+ }
+
+ /* some checks */
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ if ( face->height < 0 )
+ face->height = (FT_Short)-face->height;
+
+ if ( !FT_HAS_VERTICAL( face ) )
+ face->max_advance_height = (FT_Short)face->height;
+ }
+
+ if ( FT_HAS_FIXED_SIZES( face ) )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < face->num_fixed_sizes; i++ )
+ {
+ FT_Bitmap_Size* bsize = face->available_sizes + i;
+
+
+ if ( bsize->height < 0 )
+ bsize->height = (FT_Short)-bsize->height;
+ if ( bsize->x_ppem < 0 )
+ bsize->x_ppem = (FT_Short)-bsize->x_ppem;
+ if ( bsize->y_ppem < 0 )
+ bsize->y_ppem = -bsize->y_ppem;
+ }
+ }
+
+ /* initialize internal face data */
+ {
+ FT_Face_Internal internal = face->internal;
+
+
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+
+ internal->refcount = 1;
+ }
+
+ if ( aface )
+ *aface = face;
+ else
+ FT_Done_Face( face );
+
+ goto Exit;
+
+ Fail:
+ if ( node )
+ FT_Done_Face( face ); /* face must be in the driver's list */
+ else if ( face )
+ destroy_face( memory, face, driver );
+
+ Exit:
+ FT_TRACE4(( "FT_Open_Face: Return %d\n", error ));
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Attach_File( FT_Face face,
+ const char* filepathname )
+ {
+ FT_Open_Args open;
+
+
+ /* test for valid `face' delayed to FT_Attach_Stream() */
+
+ if ( !filepathname )
+ return FT_THROW( Invalid_Argument );
+
+ open.stream = NULL;
+ open.flags = FT_OPEN_PATHNAME;
+ open.pathname = (char*)filepathname;
+
+ return FT_Attach_Stream( face, &open );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Attach_Stream( FT_Face face,
+ FT_Open_Args* parameters )
+ {
+ FT_Stream stream;
+ FT_Error error;
+ FT_Driver driver;
+
+ FT_Driver_Class clazz;
+
+
+ /* test for valid `parameters' delayed to FT_Stream_New() */
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ error = FT_Stream_New( driver->root.library, parameters, &stream );
+ if ( error )
+ goto Exit;
+
+ /* we implement FT_Attach_Stream in each driver through the */
+ /* `attach_file' interface */
+
+ error = FT_ERR( Unimplemented_Feature );
+ clazz = driver->clazz;
+ if ( clazz->attach_file )
+ error = clazz->attach_file( face, stream );
+
+ /* close the attached stream */
+ FT_Stream_Free( stream,
+ (FT_Bool)( parameters->stream &&
+ ( parameters->flags & FT_OPEN_STREAM ) ) );
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Reference_Face( FT_Face face )
+ {
+ face->internal->refcount++;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Face( FT_Face face )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_ListNode node;
+
+
+ error = FT_ERR( Invalid_Face_Handle );
+ if ( face && face->driver )
+ {
+ face->internal->refcount--;
+ if ( face->internal->refcount > 0 )
+ error = FT_Err_Ok;
+ else
+ {
+ driver = face->driver;
+ memory = driver->root.memory;
+
+ /* find face in driver's list */
+ node = FT_List_Find( &driver->faces_list, face );
+ if ( node )
+ {
+ /* remove face object from the driver's list */
+ FT_List_Remove( &driver->faces_list, node );
+ FT_FREE( node );
+
+ /* now destroy the object proper */
+ destroy_face( memory, face, driver );
+ error = FT_Err_Ok;
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Size( FT_Face face,
+ FT_Size *asize )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Driver driver;
+ FT_Driver_Class clazz;
+
+ FT_Size size = 0;
+ FT_ListNode node = 0;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !asize )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( !face->driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ *asize = 0;
+
+ driver = face->driver;
+ clazz = driver->clazz;
+ memory = face->memory;
+
+ /* Allocate new size object and perform basic initialisation */
+ if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )
+ goto Exit;
+
+ size->face = face;
+
+ /* for now, do not use any internal fields in size objects */
+ size->internal = 0;
+
+ if ( clazz->init_size )
+ error = clazz->init_size( size );
+
+ /* in case of success, add to the face's list */
+ if ( !error )
+ {
+ *asize = size;
+ node->data = size;
+ FT_List_Add( &face->sizes_list, node );
+ }
+
+ Exit:
+ if ( error )
+ {
+ FT_FREE( node );
+ FT_FREE( size );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Size( FT_Size size )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_Face face;
+ FT_ListNode node;
+
+
+ if ( !size )
+ return FT_THROW( Invalid_Size_Handle );
+
+ face = size->face;
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ memory = driver->root.memory;
+
+ error = FT_Err_Ok;
+ node = FT_List_Find( &face->sizes_list, size );
+ if ( node )
+ {
+ FT_List_Remove( &face->sizes_list, node );
+ FT_FREE( node );
+
+ if ( face->size == size )
+ {
+ face->size = 0;
+ if ( face->sizes_list.head )
+ face->size = (FT_Size)(face->sizes_list.head->data);
+ }
+
+ destroy_size( memory, size, driver );
+ }
+ else
+ error = FT_THROW( Invalid_Size_Handle );
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_Match_Size( FT_Face face,
+ FT_Size_Request req,
+ FT_Bool ignore_width,
+ FT_ULong* size_index )
+ {
+ FT_Int i;
+ FT_Long w, h;
+
+
+ if ( !FT_HAS_FIXED_SIZES( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ /* FT_Bitmap_Size doesn't provide enough info... */
+ if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+ return FT_THROW( Unimplemented_Feature );
+
+ w = FT_REQUEST_WIDTH ( req );
+ h = FT_REQUEST_HEIGHT( req );
+
+ if ( req->width && !req->height )
+ h = w;
+ else if ( !req->width && req->height )
+ w = h;
+
+ w = FT_PIX_ROUND( w );
+ h = FT_PIX_ROUND( h );
+
+ for ( i = 0; i < face->num_fixed_sizes; i++ )
+ {
+ FT_Bitmap_Size* bsize = face->available_sizes + i;
+
+
+ if ( h != FT_PIX_ROUND( bsize->y_ppem ) )
+ continue;
+
+ if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
+ {
+ FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i ));
+
+ if ( size_index )
+ *size_index = (FT_ULong)i;
+
+ return FT_Err_Ok;
+ }
+ }
+
+ return FT_THROW( Invalid_Pixel_Size );
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics,
+ FT_Pos advance )
+ {
+ FT_Pos height = metrics->height;
+
+
+ /* compensate for glyph with bbox above/below the baseline */
+ if ( metrics->horiBearingY < 0 )
+ {
+ if ( height < metrics->horiBearingY )
+ height = metrics->horiBearingY;
+ }
+ else if ( metrics->horiBearingY > 0 )
+ height -= metrics->horiBearingY;
+
+ /* the factor 1.2 is a heuristical value */
+ if ( !advance )
+ advance = height * 12 / 10;
+
+ metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;
+ metrics->vertBearingY = ( advance - height ) / 2;
+ metrics->vertAdvance = advance;
+ }
+
+
+ static void
+ ft_recompute_scaled_metrics( FT_Face face,
+ FT_Size_Metrics* metrics )
+ {
+ /* Compute root ascender, descender, test height, and max_advance */
+
+#ifdef GRID_FIT_METRICS
+ metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender,
+ metrics->y_scale ) );
+
+ metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender,
+ metrics->y_scale ) );
+
+ metrics->height = FT_PIX_ROUND( FT_MulFix( face->height,
+ metrics->y_scale ) );
+
+ metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,
+ metrics->x_scale ) );
+#else /* !GRID_FIT_METRICS */
+ metrics->ascender = FT_MulFix( face->ascender,
+ metrics->y_scale );
+
+ metrics->descender = FT_MulFix( face->descender,
+ metrics->y_scale );
+
+ metrics->height = FT_MulFix( face->height,
+ metrics->y_scale );
+
+ metrics->max_advance = FT_MulFix( face->max_advance_width,
+ metrics->x_scale );
+#endif /* !GRID_FIT_METRICS */
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Select_Metrics( FT_Face face,
+ FT_ULong strike_index )
+ {
+ FT_Size_Metrics* metrics;
+ FT_Bitmap_Size* bsize;
+
+
+ metrics = &face->size->metrics;
+ bsize = face->available_sizes + strike_index;
+
+ metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );
+ metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ metrics->x_scale = FT_DivFix( bsize->x_ppem,
+ face->units_per_EM );
+ metrics->y_scale = FT_DivFix( bsize->y_ppem,
+ face->units_per_EM );
+
+ ft_recompute_scaled_metrics( face, metrics );
+ }
+ else
+ {
+ metrics->x_scale = 1L << 16;
+ metrics->y_scale = 1L << 16;
+ metrics->ascender = bsize->y_ppem;
+ metrics->descender = 0;
+ metrics->height = bsize->height << 6;
+ metrics->max_advance = bsize->x_ppem;
+ }
+
+ FT_TRACE5(( "FT_Select_Metrics:\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Request_Metrics( FT_Face face,
+ FT_Size_Request req )
+ {
+ FT_Size_Metrics* metrics;
+
+
+ metrics = &face->size->metrics;
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0;
+
+
+ switch ( req->type )
+ {
+ case FT_SIZE_REQUEST_TYPE_NOMINAL:
+ w = h = face->units_per_EM;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+ w = h = face->ascender - face->descender;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_BBOX:
+ w = face->bbox.xMax - face->bbox.xMin;
+ h = face->bbox.yMax - face->bbox.yMin;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_CELL:
+ w = face->max_advance_width;
+ h = face->ascender - face->descender;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_SCALES:
+ metrics->x_scale = (FT_Fixed)req->width;
+ metrics->y_scale = (FT_Fixed)req->height;
+ if ( !metrics->x_scale )
+ metrics->x_scale = metrics->y_scale;
+ else if ( !metrics->y_scale )
+ metrics->y_scale = metrics->x_scale;
+ goto Calculate_Ppem;
+
+ case FT_SIZE_REQUEST_TYPE_MAX:
+ break;
+ }
+
+ /* to be on the safe side */
+ if ( w < 0 )
+ w = -w;
+
+ if ( h < 0 )
+ h = -h;
+
+ scaled_w = FT_REQUEST_WIDTH ( req );
+ scaled_h = FT_REQUEST_HEIGHT( req );
+
+ /* determine scales */
+ if ( req->width )
+ {
+ metrics->x_scale = FT_DivFix( scaled_w, w );
+
+ if ( req->height )
+ {
+ metrics->y_scale = FT_DivFix( scaled_h, h );
+
+ if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
+ {
+ if ( metrics->y_scale > metrics->x_scale )
+ metrics->y_scale = metrics->x_scale;
+ else
+ metrics->x_scale = metrics->y_scale;
+ }
+ }
+ else
+ {
+ metrics->y_scale = metrics->x_scale;
+ scaled_h = FT_MulDiv( scaled_w, h, w );
+ }
+ }
+ else
+ {
+ metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
+ scaled_w = FT_MulDiv( scaled_h, w, h );
+ }
+
+ Calculate_Ppem:
+ /* calculate the ppems */
+ if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+ {
+ scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );
+ scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );
+ }
+
+ metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );
+ metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );
+
+ ft_recompute_scaled_metrics( face, metrics );
+ }
+ else
+ {
+ FT_ZERO( metrics );
+ metrics->x_scale = 1L << 16;
+ metrics->y_scale = 1L << 16;
+ }
+
+ FT_TRACE5(( "FT_Request_Metrics:\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Select_Size( FT_Face face,
+ FT_Int strike_index )
+ {
+ FT_Driver_Class clazz;
+
+
+ if ( !face || !FT_HAS_FIXED_SIZES( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
+ return FT_THROW( Invalid_Argument );
+
+ clazz = face->driver->clazz;
+
+ if ( clazz->select_size )
+ {
+ FT_Error error;
+
+
+ error = clazz->select_size( face->size, (FT_ULong)strike_index );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+#endif
+
+ return error;
+ }
+
+ FT_Select_Metrics( face, (FT_ULong)strike_index );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Request_Size( FT_Face face,
+ FT_Size_Request req )
+ {
+ FT_Driver_Class clazz;
+ FT_ULong strike_index;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !req || req->width < 0 || req->height < 0 ||
+ req->type >= FT_SIZE_REQUEST_TYPE_MAX )
+ return FT_THROW( Invalid_Argument );
+
+ clazz = face->driver->clazz;
+
+ if ( clazz->request_size )
+ {
+ FT_Error error;
+
+
+ error = clazz->request_size( face->size, req );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+#endif
+
+ return error;
+ }
+
+ /*
+ * The reason that a driver doesn't have `request_size' defined is
+ * either that the scaling here suffices or that the supported formats
+ * are bitmap-only and size matching is not implemented.
+ *
+ * In the latter case, a simple size matching is done.
+ */
+ if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
+ {
+ FT_Error error;
+
+
+ error = FT_Match_Size( face, req, 0, &strike_index );
+ if ( error )
+ return error;
+
+ return FT_Select_Size( face, (FT_Int)strike_index );
+ }
+
+ FT_Request_Metrics( face, req );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Char_Size( FT_Face face,
+ FT_F26Dot6 char_width,
+ FT_F26Dot6 char_height,
+ FT_UInt horz_resolution,
+ FT_UInt vert_resolution )
+ {
+ FT_Size_RequestRec req;
+
+
+ if ( !char_width )
+ char_width = char_height;
+ else if ( !char_height )
+ char_height = char_width;
+
+ if ( !horz_resolution )
+ horz_resolution = vert_resolution;
+ else if ( !vert_resolution )
+ vert_resolution = horz_resolution;
+
+ if ( char_width < 1 * 64 )
+ char_width = 1 * 64;
+ if ( char_height < 1 * 64 )
+ char_height = 1 * 64;
+
+ if ( !horz_resolution )
+ horz_resolution = vert_resolution = 72;
+
+ req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
+ req.width = char_width;
+ req.height = char_height;
+ req.horiResolution = horz_resolution;
+ req.vertResolution = vert_resolution;
+
+ return FT_Request_Size( face, &req );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Pixel_Sizes( FT_Face face,
+ FT_UInt pixel_width,
+ FT_UInt pixel_height )
+ {
+ FT_Size_RequestRec req;
+
+
+ if ( pixel_width == 0 )
+ pixel_width = pixel_height;
+ else if ( pixel_height == 0 )
+ pixel_height = pixel_width;
+
+ if ( pixel_width < 1 )
+ pixel_width = 1;
+ if ( pixel_height < 1 )
+ pixel_height = 1;
+
+ /* use `>=' to avoid potential compiler warning on 16bit platforms */
+ if ( pixel_width >= 0xFFFFU )
+ pixel_width = 0xFFFFU;
+ if ( pixel_height >= 0xFFFFU )
+ pixel_height = 0xFFFFU;
+
+ req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
+ req.width = pixel_width << 6;
+ req.height = pixel_height << 6;
+ req.horiResolution = 0;
+ req.vertResolution = 0;
+
+ return FT_Request_Size( face, &req );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Kerning( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_UInt kern_mode,
+ FT_Vector *akerning )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Driver driver;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !akerning )
+ return FT_THROW( Invalid_Argument );
+
+ driver = face->driver;
+
+ akerning->x = 0;
+ akerning->y = 0;
+
+ if ( driver->clazz->get_kerning )
+ {
+ error = driver->clazz->get_kerning( face,
+ left_glyph,
+ right_glyph,
+ akerning );
+ if ( !error )
+ {
+ if ( kern_mode != FT_KERNING_UNSCALED )
+ {
+ akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );
+ akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );
+
+ if ( kern_mode != FT_KERNING_UNFITTED )
+ {
+ /* we scale down kerning values for small ppem values */
+ /* to avoid that rounding makes them too big. */
+ /* `25' has been determined heuristically. */
+ if ( face->size->metrics.x_ppem < 25 )
+ akerning->x = FT_MulDiv( akerning->x,
+ face->size->metrics.x_ppem, 25 );
+ if ( face->size->metrics.y_ppem < 25 )
+ akerning->y = FT_MulDiv( akerning->y,
+ face->size->metrics.y_ppem, 25 );
+
+ akerning->x = FT_PIX_ROUND( akerning->x );
+ akerning->y = FT_PIX_ROUND( akerning->y );
+ }
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Track_Kerning( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning )
+ {
+ FT_Service_Kerning service;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !akerning )
+ return FT_THROW( Invalid_Argument );
+
+ FT_FACE_FIND_SERVICE( face, service, KERNING );
+ if ( !service )
+ return FT_THROW( Unimplemented_Feature );
+
+ error = service->get_track( face,
+ point_size,
+ degree,
+ akerning );
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Select_Charmap( FT_Face face,
+ FT_Encoding encoding )
+ {
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( encoding == FT_ENCODING_NONE )
+ return FT_THROW( Invalid_Argument );
+
+ /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */
+ /* charmap available, i.e., one with UCS-4 characters, if possible. */
+ /* */
+ /* This is done by find_unicode_charmap() above, to share code. */
+ if ( encoding == FT_ENCODING_UNICODE )
+ return find_unicode_charmap( face );
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_THROW( Invalid_CharMap_Handle );
+
+ limit = cur + face->num_charmaps;
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0]->encoding == encoding )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ cur - face->charmaps ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return 0;
+ }
+ }
+
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Charmap( FT_Face face,
+ FT_CharMap charmap )
+ {
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_THROW( Invalid_CharMap_Handle );
+ if ( FT_Get_CMap_Format( charmap ) == 14 )
+ return FT_THROW( Invalid_Argument );
+
+ limit = cur + face->num_charmaps;
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] == charmap )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ cur - face->charmaps ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return 0;
+ }
+ }
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Get_Charmap_Index( FT_CharMap charmap )
+ {
+ FT_Int i;
+
+
+ if ( !charmap || !charmap->face )
+ return -1;
+
+ for ( i = 0; i < charmap->face->num_charmaps; i++ )
+ if ( charmap->face->charmaps[i] == charmap )
+ break;
+
+ FT_ASSERT( i < charmap->face->num_charmaps );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( i > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ i ));
+ return -i;
+ }
+#endif
+ return i;
+ }
+
+
+ static void
+ ft_cmap_done_internal( FT_CMap cmap )
+ {
+ FT_CMap_Class clazz = cmap->clazz;
+ FT_Face face = cmap->charmap.face;
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( clazz->done )
+ clazz->done( cmap );
+
+ FT_FREE( cmap );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_CMap_Done( FT_CMap cmap )
+ {
+ if ( cmap )
+ {
+ FT_Face face = cmap->charmap.face;
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ FT_Error error;
+ FT_Int i, j;
+
+
+ for ( i = 0; i < face->num_charmaps; i++ )
+ {
+ if ( (FT_CMap)face->charmaps[i] == cmap )
+ {
+ FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1];
+
+
+ if ( FT_RENEW_ARRAY( face->charmaps,
+ face->num_charmaps,
+ face->num_charmaps - 1 ) )
+ return;
+
+ /* remove it from our list of charmaps */
+ for ( j = i + 1; j < face->num_charmaps; j++ )
+ {
+ if ( j == face->num_charmaps - 1 )
+ face->charmaps[j - 1] = last_charmap;
+ else
+ face->charmaps[j - 1] = face->charmaps[j];
+ }
+
+ face->num_charmaps--;
+
+ if ( (FT_CMap)face->charmap == cmap )
+ face->charmap = NULL;
+
+ ft_cmap_done_internal( cmap );
+
+ break;
+ }
+ }
+ }
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_CMap_New( FT_CMap_Class clazz,
+ FT_Pointer init_data,
+ FT_CharMap charmap,
+ FT_CMap *acmap )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Face face;
+ FT_Memory memory;
+ FT_CMap cmap = NULL;
+
+
+ if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ face = charmap->face;
+ memory = FT_FACE_MEMORY( face );
+
+ if ( !FT_ALLOC( cmap, clazz->size ) )
+ {
+ cmap->charmap = *charmap;
+ cmap->clazz = clazz;
+
+ if ( clazz->init )
+ {
+ error = clazz->init( cmap, init_data );
+ if ( error )
+ goto Fail;
+ }
+
+ /* add it to our list of charmaps */
+ if ( FT_RENEW_ARRAY( face->charmaps,
+ face->num_charmaps,
+ face->num_charmaps + 1 ) )
+ goto Fail;
+
+ face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;
+ }
+
+ Exit:
+ if ( acmap )
+ *acmap = cmap;
+
+ return error;
+
+ Fail:
+ ft_cmap_done_internal( cmap );
+ cmap = NULL;
+ goto Exit;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && face->charmap )
+ {
+ FT_CMap cmap = FT_CMAP( face->charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
+ }
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_First_Char( FT_Face face,
+ FT_UInt *agindex )
+ {
+ FT_ULong result = 0;
+ FT_UInt gindex = 0;
+
+
+ if ( face && face->charmap && face->num_glyphs )
+ {
+ gindex = FT_Get_Char_Index( face, 0 );
+ if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+ result = FT_Get_Next_Char( face, 0, &gindex );
+ }
+
+ if ( agindex )
+ *agindex = gindex;
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong charcode,
+ FT_UInt *agindex )
+ {
+ FT_ULong result = 0;
+ FT_UInt gindex = 0;
+
+
+ if ( face && face->charmap && face->num_glyphs )
+ {
+ FT_UInt32 code = (FT_UInt32)charcode;
+ FT_CMap cmap = FT_CMAP( face->charmap );
+
+
+ do {
+ gindex = cmap->clazz->char_next( cmap, &code );
+ } while ( gindex >= (FT_UInt)face->num_glyphs );
+
+ result = ( gindex == 0 ) ? 0 : code;
+ }
+
+ if ( agindex )
+ *agindex = gindex;
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Face_GetCharVariantIndex( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && face->charmap &&
+ face->charmap->encoding == FT_ENCODING_UNICODE )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+ FT_CMap ucmap = FT_CMAP( face->charmap );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->char_var_index( vcmap, ucmap,
+ (FT_UInt32)charcode,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Face_GetCharVariantIsDefault( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector )
+ {
+ FT_Int result = -1;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->char_var_default( vcmap,
+ (FT_UInt32)charcode,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetVariantSelectors( FT_Face face )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ result = vcmap->clazz->variant_list( vcmap, memory );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetVariantsOfChar( FT_Face face,
+ FT_ULong charcode )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+
+ result = vcmap->clazz->charvariant_list( vcmap, memory,
+ (FT_UInt32)charcode );
+ }
+ }
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetCharsOfVariant( FT_Face face,
+ FT_ULong variantSelector )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->variantchar_list( vcmap, memory,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Name_Index( FT_Face face,
+ FT_String* glyph_name )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && FT_HAS_GLYPH_NAMES( face ) )
+ {
+ FT_Service_GlyphDict service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ GLYPH_DICT );
+
+ if ( service && service->name_index )
+ result = service->name_index( face, glyph_name );
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Glyph_Name( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ /* clean up buffer */
+ if ( buffer && buffer_max > 0 )
+ ((FT_Byte*)buffer)[0] = 0;
+
+ if ( face &&
+ (FT_Long)glyph_index <= face->num_glyphs &&
+ FT_HAS_GLYPH_NAMES( face ) )
+ {
+ FT_Service_GlyphDict service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ GLYPH_DICT );
+
+ if ( service && service->get_name )
+ error = service->get_name( face, glyph_index, buffer, buffer_max );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( const char* )
+ FT_Get_Postscript_Name( FT_Face face )
+ {
+ const char* result = NULL;
+
+
+ if ( !face )
+ goto Exit;
+
+ if ( !result )
+ {
+ FT_Service_PsFontName service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ POSTSCRIPT_FONT_NAME );
+
+ if ( service && service->get_ps_font_name )
+ result = service->get_ps_font_name( face );
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( void* )
+ FT_Get_Sfnt_Table( FT_Face face,
+ FT_Sfnt_Tag tag )
+ {
+ void* table = 0;
+ FT_Service_SFNT_Table service;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service != NULL )
+ table = service->get_table( face, tag );
+ }
+
+ return table;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Sfnt_Table( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length )
+ {
+ FT_Service_SFNT_Table service;
+
+
+ if ( !face || !FT_IS_SFNT( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service == NULL )
+ return FT_THROW( Unimplemented_Feature );
+
+ return service->load_table( face, tag, offset, buffer, length );
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Sfnt_Table_Info( FT_Face face,
+ FT_UInt table_index,
+ FT_ULong *tag,
+ FT_ULong *length )
+ {
+ FT_Service_SFNT_Table service;
+ FT_ULong offset;
+
+
+ if ( !face || !FT_IS_SFNT( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service == NULL )
+ return FT_THROW( Unimplemented_Feature );
+
+ return service->table_info( face, table_index, tag, &offset, length );
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_CMap_Language_ID( FT_CharMap charmap )
+ {
+ FT_Service_TTCMaps service;
+ FT_Face face;
+ TT_CMapInfo cmap_info;
+
+
+ if ( !charmap || !charmap->face )
+ return 0;
+
+ face = charmap->face;
+ FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+ if ( service == NULL )
+ return 0;
+ if ( service->get_cmap_info( charmap, &cmap_info ))
+ return 0;
+
+ return cmap_info.language;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_Get_CMap_Format( FT_CharMap charmap )
+ {
+ FT_Service_TTCMaps service;
+ FT_Face face;
+ TT_CMapInfo cmap_info;
+
+
+ if ( !charmap || !charmap->face )
+ return -1;
+
+ face = charmap->face;
+ FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+ if ( service == NULL )
+ return -1;
+ if ( service->get_cmap_info( charmap, &cmap_info ))
+ return -1;
+
+ return cmap_info.format;
+ }
+
+
+ /* documentation is in ftsizes.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Activate_Size( FT_Size size )
+ {
+ FT_Face face;
+
+
+ if ( size == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ face = size->face;
+ if ( face == NULL || face->driver == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ /* we don't need anything more complex than that; all size objects */
+ /* are already listed by the face */
+ face->size = size;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** R E N D E R E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* lookup a renderer by glyph format in the library's list */
+ FT_BASE_DEF( FT_Renderer )
+ FT_Lookup_Renderer( FT_Library library,
+ FT_Glyph_Format format,
+ FT_ListNode* node )
+ {
+ FT_ListNode cur;
+ FT_Renderer result = 0;
+
+
+ if ( !library )
+ goto Exit;
+
+ cur = library->renderers.head;
+
+ if ( node )
+ {
+ if ( *node )
+ cur = (*node)->next;
+ *node = 0;
+ }
+
+ while ( cur )
+ {
+ FT_Renderer renderer = FT_RENDERER( cur->data );
+
+
+ if ( renderer->glyph_format == format )
+ {
+ if ( node )
+ *node = cur;
+
+ result = renderer;
+ break;
+ }
+ cur = cur->next;
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ static FT_Renderer
+ ft_lookup_glyph_renderer( FT_GlyphSlot slot )
+ {
+ FT_Face face = slot->face;
+ FT_Library library = FT_FACE_LIBRARY( face );
+ FT_Renderer result = library->cur_renderer;
+
+
+ if ( !result || result->glyph_format != slot->format )
+ result = FT_Lookup_Renderer( library, slot->format, 0 );
+
+ return result;
+ }
+
+
+ static void
+ ft_set_current_renderer( FT_Library library )
+ {
+ FT_Renderer renderer;
+
+
+ renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );
+ library->cur_renderer = renderer;
+ }
+
+
+ static FT_Error
+ ft_add_renderer( FT_Module module )
+ {
+ FT_Library library = module->library;
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_ListNode node = NULL;
+
+
+ if ( FT_NEW( node ) )
+ goto Exit;
+
+ {
+ FT_Renderer render = FT_RENDERER( module );
+ FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz;
+
+
+ render->clazz = clazz;
+ render->glyph_format = clazz->glyph_format;
+
+ /* allocate raster object if needed */
+ if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ clazz->raster_class->raster_new )
+ {
+ error = clazz->raster_class->raster_new( memory, &render->raster );
+ if ( error )
+ goto Fail;
+
+ render->raster_render = clazz->raster_class->raster_render;
+ render->render = clazz->render_glyph;
+ }
+
+ /* add to list */
+ node->data = module;
+ FT_List_Add( &library->renderers, node );
+
+ ft_set_current_renderer( library );
+ }
+
+ Fail:
+ if ( error )
+ FT_FREE( node );
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ ft_remove_renderer( FT_Module module )
+ {
+ FT_Library library = module->library;
+ FT_Memory memory = library->memory;
+ FT_ListNode node;
+
+
+ node = FT_List_Find( &library->renderers, module );
+ if ( node )
+ {
+ FT_Renderer render = FT_RENDERER( module );
+
+
+ /* release raster object, if any */
+ if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ render->raster )
+ render->clazz->raster_class->raster_done( render->raster );
+
+ /* remove from list */
+ FT_List_Remove( &library->renderers, node );
+ FT_FREE( node );
+
+ ft_set_current_renderer( library );
+ }
+ }
+
+
+ /* documentation is in ftrender.h */
+
+ FT_EXPORT_DEF( FT_Renderer )
+ FT_Get_Renderer( FT_Library library,
+ FT_Glyph_Format format )
+ {
+ /* test for valid `library' delayed to FT_Lookup_Renderer() */
+
+ return FT_Lookup_Renderer( library, format, 0 );
+ }
+
+
+ /* documentation is in ftrender.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Renderer( FT_Library library,
+ FT_Renderer renderer,
+ FT_UInt num_params,
+ FT_Parameter* parameters )
+ {
+ FT_ListNode node;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !renderer )
+ return FT_THROW( Invalid_Argument );
+
+ node = FT_List_Find( &library->renderers, renderer );
+ if ( !node )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_List_Up( &library->renderers, node );
+
+ if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )
+ library->cur_renderer = renderer;
+
+ if ( num_params > 0 )
+ {
+ FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode;
+
+
+ for ( ; num_params > 0; num_params-- )
+ {
+ error = set_mode( renderer, parameters->tag, parameters->data );
+ if ( error )
+ break;
+ parameters++;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Render_Glyph_Internal( FT_Library library,
+ FT_GlyphSlot slot,
+ FT_Render_Mode render_mode )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Renderer renderer;
+
+
+ /* if it is already a bitmap, no need to do anything */
+ switch ( slot->format )
+ {
+ case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */
+ break;
+
+ default:
+ {
+ FT_ListNode node = 0;
+ FT_Bool update = 0;
+
+
+ /* small shortcut for the very common case */
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ renderer = library->cur_renderer;
+ node = library->renderers.head;
+ }
+ else
+ renderer = FT_Lookup_Renderer( library, slot->format, &node );
+
+ error = FT_ERR( Unimplemented_Feature );
+ while ( renderer )
+ {
+ error = renderer->render( renderer, slot, render_mode, NULL );
+ if ( !error ||
+ FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+ break;
+
+ /* FT_Err_Cannot_Render_Glyph is returned if the render mode */
+ /* is unsupported by the current renderer for this glyph image */
+ /* format. */
+
+ /* now, look for another renderer that supports the same */
+ /* format. */
+ renderer = FT_Lookup_Renderer( library, slot->format, &node );
+ update = 1;
+ }
+
+ /* if we changed the current renderer for the glyph image format */
+ /* we need to select it as the next current one */
+ if ( !error && update && renderer )
+ FT_Set_Renderer( library, renderer, 0, 0 );
+ }
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_bitmap
+
+ /* we convert to a single bitmap format for computing the checksum */
+ {
+ FT_Bitmap bitmap;
+ FT_Error err;
+
+
+ FT_Bitmap_New( &bitmap );
+
+ err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
+ if ( !err )
+ {
+ MD5_CTX ctx;
+ unsigned char md5[16];
+ int i;
+
+
+ MD5_Init( &ctx);
+ MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );
+ MD5_Final( md5, &ctx );
+
+ FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
+ " ",
+ bitmap.rows, bitmap.pitch ));
+ for ( i = 0; i < 16; i++ )
+ FT_TRACE3(( "%02X", md5[i] ));
+ FT_TRACE3(( "\n" ));
+ }
+
+ FT_Bitmap_Done( library, &bitmap );
+ }
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ return error;
+ }
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Render_Glyph( FT_GlyphSlot slot,
+ FT_Render_Mode render_mode )
+ {
+ FT_Library library;
+
+ if ( !slot || !slot->face )
+ return FT_THROW( Invalid_Argument );
+
+ library = FT_FACE_LIBRARY( slot->face );
+
+ return FT_Render_Glyph_Internal( library, slot, render_mode );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M O D U L E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Destroy_Module */
+ /* */
+ /* <Description> */
+ /* Destroys a given module object. For drivers, this also destroys */
+ /* all child faces. */
+ /* */
+ /* <InOut> */
+ /* module :: A handle to the target driver object. */
+ /* */
+ /* <Note> */
+ /* The driver _must_ be LOCKED! */
+ /* */
+ static void
+ Destroy_Module( FT_Module module )
+ {
+ FT_Memory memory = module->memory;
+ FT_Module_Class* clazz = module->clazz;
+ FT_Library library = module->library;
+
+
+ if ( library && library->auto_hinter == module )
+ library->auto_hinter = 0;
+
+ /* if the module is a renderer */
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ ft_remove_renderer( module );
+
+ /* if the module is a font driver, add some steps */
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ Destroy_Driver( FT_DRIVER( module ) );
+
+ /* finalize the module object */
+ if ( clazz->module_done )
+ clazz->module_done( module );
+
+ /* discard it */
+ FT_FREE( module );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Add_Module( FT_Library library,
+ const FT_Module_Class* clazz )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Module module;
+ FT_UInt nn;
+
+
+#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \
+ FREETYPE_MINOR )
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !clazz )
+ return FT_THROW( Invalid_Argument );
+
+ /* check freetype version */
+ if ( clazz->module_requires > FREETYPE_VER_FIXED )
+ return FT_THROW( Invalid_Version );
+
+ /* look for a module with the same name in the library's table */
+ for ( nn = 0; nn < library->num_modules; nn++ )
+ {
+ module = library->modules[nn];
+ if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )
+ {
+ /* this installed module has the same name, compare their versions */
+ if ( clazz->module_version <= module->clazz->module_version )
+ return FT_THROW( Lower_Module_Version );
+
+ /* remove the module from our list, then exit the loop to replace */
+ /* it by our new version.. */
+ FT_Remove_Module( library, module );
+ break;
+ }
+ }
+
+ memory = library->memory;
+ error = FT_Err_Ok;
+
+ if ( library->num_modules >= FT_MAX_MODULES )
+ {
+ error = FT_THROW( Too_Many_Drivers );
+ goto Exit;
+ }
+
+ /* allocate module object */
+ if ( FT_ALLOC( module, clazz->module_size ) )
+ goto Exit;
+
+ /* base initialization */
+ module->library = library;
+ module->memory = memory;
+ module->clazz = (FT_Module_Class*)clazz;
+
+ /* check whether the module is a renderer - this must be performed */
+ /* before the normal module initialization */
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ {
+ /* add to the renderers list */
+ error = ft_add_renderer( module );
+ if ( error )
+ goto Fail;
+ }
+
+ /* is the module a auto-hinter? */
+ if ( FT_MODULE_IS_HINTER( module ) )
+ library->auto_hinter = module;
+
+ /* if the module is a font driver */
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ {
+ /* allocate glyph loader if needed */
+ FT_Driver driver = FT_DRIVER( module );
+
+
+ driver->clazz = (FT_Driver_Class)module->clazz;
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ {
+ error = FT_GlyphLoader_New( memory, &driver->glyph_loader );
+ if ( error )
+ goto Fail;
+ }
+ }
+
+ if ( clazz->module_init )
+ {
+ error = clazz->module_init( module );
+ if ( error )
+ goto Fail;
+ }
+
+ /* add module to the library's table */
+ library->modules[library->num_modules++] = module;
+
+ Exit:
+ return error;
+
+ Fail:
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ {
+ FT_Driver driver = FT_DRIVER( module );
+
+
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ FT_GlyphLoader_Done( driver->glyph_loader );
+ }
+
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ {
+ FT_Renderer renderer = FT_RENDERER( module );
+
+
+ if ( renderer->clazz &&
+ renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ renderer->raster )
+ renderer->clazz->raster_class->raster_done( renderer->raster );
+ }
+
+ FT_FREE( module );
+ goto Exit;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Module )
+ FT_Get_Module( FT_Library library,
+ const char* module_name )
+ {
+ FT_Module result = 0;
+ FT_Module* cur;
+ FT_Module* limit;
+
+
+ if ( !library || !module_name )
+ return result;
+
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ for ( ; cur < limit; cur++ )
+ if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )
+ {
+ result = cur[0];
+ break;
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( const void* )
+ FT_Get_Module_Interface( FT_Library library,
+ const char* mod_name )
+ {
+ FT_Module module;
+
+
+ /* test for valid `library' delayed to FT_Get_Module() */
+
+ module = FT_Get_Module( library, mod_name );
+
+ return module ? module->clazz->module_interface : 0;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_module_get_service( FT_Module module,
+ const char* service_id )
+ {
+ FT_Pointer result = NULL;
+
+
+ if ( module )
+ {
+ FT_ASSERT( module->clazz && module->clazz->get_interface );
+
+ /* first, look for the service in the module */
+ if ( module->clazz->get_interface )
+ result = module->clazz->get_interface( module, service_id );
+
+ if ( result == NULL )
+ {
+ /* we didn't find it, look in all other modules then */
+ FT_Library library = module->library;
+ FT_Module* cur = library->modules;
+ FT_Module* limit = cur + library->num_modules;
+
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] != module )
+ {
+ FT_ASSERT( cur[0]->clazz );
+
+ if ( cur[0]->clazz->get_interface )
+ {
+ result = cur[0]->clazz->get_interface( cur[0], service_id );
+ if ( result != NULL )
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Remove_Module( FT_Library library,
+ FT_Module module )
+ {
+ /* try to find the module from the table, then remove it from there */
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( module )
+ {
+ FT_Module* cur = library->modules;
+ FT_Module* limit = cur + library->num_modules;
+
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] == module )
+ {
+ /* remove it from the table */
+ library->num_modules--;
+ limit--;
+ while ( cur < limit )
+ {
+ cur[0] = cur[1];
+ cur++;
+ }
+ limit[0] = 0;
+
+ /* destroy the module */
+ Destroy_Module( module );
+
+ return FT_Err_Ok;
+ }
+ }
+ }
+ return FT_THROW( Invalid_Driver_Handle );
+ }
+
+
+ FT_Error
+ ft_property_do( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value,
+ FT_Bool set )
+ {
+ FT_Module* cur;
+ FT_Module* limit;
+ FT_Module_Interface interface1;
+ FT_Service_Properties service;
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+ const FT_String* set_name = "FT_Property_Set";
+ const FT_String* get_name = "FT_Property_Get";
+ const FT_String* func_name = set ? set_name : get_name;
+#endif
+
+ FT_Bool missing_func;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !module_name || !property_name || !value )
+ return FT_THROW( Invalid_Argument );
+
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ /* search module */
+ for ( ; cur < limit; cur++ )
+ if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
+ break;
+
+ if ( cur == limit )
+ {
+ FT_ERROR(( "%s: can't find module `%s'\n",
+ func_name, module_name ));
+ return FT_THROW( Missing_Module );
+ }
+
+ /* check whether we have a service interface */
+ if ( !cur[0]->clazz->get_interface )
+ {
+ FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ /* search property service */
+ interface1 = cur[0]->clazz->get_interface( cur[0],
+ FT_SERVICE_ID_PROPERTIES );
+ if ( !interface1 )
+ {
+ FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ service = (FT_Service_Properties)interface1;
+
+ if ( set )
+ missing_func = (FT_Bool)( !service->set_property );
+ else
+ missing_func = (FT_Bool)( !service->get_property );
+
+ if ( missing_func )
+ {
+ FT_ERROR(( "%s: property service of module `%s' is broken\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ return set ? service->set_property( cur[0], property_name, value )
+ : service->get_property( cur[0], property_name, value );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Property_Set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ const void* value )
+ {
+ return ft_property_do( library,
+ module_name,
+ property_name,
+ (void*)value,
+ TRUE );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Property_Get( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value )
+ {
+ return ft_property_do( library,
+ module_name,
+ property_name,
+ value,
+ FALSE );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** L I B R A R Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Reference_Library( FT_Library library )
+ {
+ library->refcount++;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Library( FT_Memory memory,
+ FT_Library *alibrary )
+ {
+ FT_Library library = NULL;
+ FT_Error error;
+
+
+ if ( !memory )
+ return FT_THROW( Invalid_Argument );
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+ /* init debugging support */
+ ft_debug_init();
+#endif
+
+ /* first of all, allocate the library object */
+ if ( FT_NEW( library ) )
+ return error;
+
+ library->memory = memory;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ /* initialize position independent code containers */
+ error = ft_pic_container_init( library );
+ if ( error )
+ goto Fail;
+#endif
+
+ /* allocate the render pool */
+ library->raster_pool_size = FT_RENDER_POOL_SIZE;
+#if FT_RENDER_POOL_SIZE > 0
+ if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )
+ goto Fail;
+#endif
+
+ library->version_major = FREETYPE_MAJOR;
+ library->version_minor = FREETYPE_MINOR;
+ library->version_patch = FREETYPE_PATCH;
+
+ library->refcount = 1;
+
+ /* That's ok now */
+ *alibrary = library;
+
+ return FT_Err_Ok;
+
+ Fail:
+#ifdef FT_CONFIG_OPTION_PIC
+ ft_pic_container_destroy( library );
+#endif
+ FT_FREE( library );
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Library_Version( FT_Library library,
+ FT_Int *amajor,
+ FT_Int *aminor,
+ FT_Int *apatch )
+ {
+ FT_Int major = 0;
+ FT_Int minor = 0;
+ FT_Int patch = 0;
+
+
+ if ( library )
+ {
+ major = library->version_major;
+ minor = library->version_minor;
+ patch = library->version_patch;
+ }
+
+ if ( amajor )
+ *amajor = major;
+
+ if ( aminor )
+ *aminor = minor;
+
+ if ( apatch )
+ *apatch = patch;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Library( FT_Library library )
+ {
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ library->refcount--;
+ if ( library->refcount > 0 )
+ goto Exit;
+
+ memory = library->memory;
+
+ /*
+ * Close all faces in the library. If we don't do this, we can have
+ * some subtle memory leaks.
+ *
+ * Example:
+ *
+ * - the cff font driver uses the pshinter module in cff_size_done
+ * - if the pshinter module is destroyed before the cff font driver,
+ * opened FT_Face objects managed by the driver are not properly
+ * destroyed, resulting in a memory leak
+ *
+ * Some faces are dependent on other faces, like Type42 faces that
+ * depend on TrueType faces synthesized internally.
+ *
+ * The order of drivers should be specified in driver_name[].
+ */
+ {
+ FT_UInt m, n;
+ const char* driver_name[] = { "type42", NULL };
+
+
+ for ( m = 0;
+ m < sizeof ( driver_name ) / sizeof ( driver_name[0] );
+ m++ )
+ {
+ for ( n = 0; n < library->num_modules; n++ )
+ {
+ FT_Module module = library->modules[n];
+ const char* module_name = module->clazz->module_name;
+ FT_List faces;
+
+
+ if ( driver_name[m] &&
+ ft_strcmp( module_name, driver_name[m] ) != 0 )
+ continue;
+
+ if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )
+ continue;
+
+ FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name ));
+
+ faces = &FT_DRIVER( module )->faces_list;
+ while ( faces->head )
+ {
+ FT_Done_Face( FT_FACE( faces->head->data ) );
+ if ( faces->head )
+ FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" ));
+ }
+ }
+ }
+ }
+
+ /* Close all other modules in the library */
+#if 1
+ /* XXX Modules are removed in the reversed order so that */
+ /* type42 module is removed before truetype module. This */
+ /* avoids double free in some occasions. It is a hack. */
+ while ( library->num_modules > 0 )
+ FT_Remove_Module( library,
+ library->modules[library->num_modules - 1] );
+#else
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < library->num_modules; n++ )
+ {
+ FT_Module module = library->modules[n];
+
+
+ if ( module )
+ {
+ Destroy_Module( module );
+ library->modules[n] = 0;
+ }
+ }
+ }
+#endif
+
+ /* Destroy raster objects */
+ FT_FREE( library->raster_pool );
+ library->raster_pool_size = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ /* Destroy pic container contents */
+ ft_pic_container_destroy( library );
+#endif
+
+ FT_FREE( library );
+
+ Exit:
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Set_Debug_Hook( FT_Library library,
+ FT_UInt hook_index,
+ FT_DebugHook_Func debug_hook )
+ {
+ if ( library && debug_hook &&
+ hook_index <
+ ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
+ library->debug_hooks[hook_index] = debug_hook;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_TrueTypeEngineType )
+ FT_Get_TrueType_Engine_Type( FT_Library library )
+ {
+ FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE;
+
+
+ if ( library )
+ {
+ FT_Module module = FT_Get_Module( library, "truetype" );
+
+
+ if ( module )
+ {
+ FT_Service_TrueTypeEngine service;
+
+
+ service = (FT_Service_TrueTypeEngine)
+ ft_module_get_service( module,
+ FT_SERVICE_ID_TRUETYPE_ENGINE );
+ if ( service )
+ result = service->engine_type;
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_SubGlyph_Info( FT_GlyphSlot glyph,
+ FT_UInt sub_index,
+ FT_Int *p_index,
+ FT_UInt *p_flags,
+ FT_Int *p_arg1,
+ FT_Int *p_arg2,
+ FT_Matrix *p_transform )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( glyph &&
+ glyph->subglyphs &&
+ glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
+ sub_index < glyph->num_subglyphs )
+ {
+ FT_SubGlyph subg = glyph->subglyphs + sub_index;
+
+
+ *p_index = subg->index;
+ *p_flags = subg->flags;
+ *p_arg1 = subg->arg1;
+ *p_arg2 = subg->arg2;
+ *p_transform = subg->transform;
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
new file mode 100644
index 0000000000..898fd19ede
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
@@ -0,0 +1,91 @@
+/***************************************************************************/
+/* */
+/* ftotval.c */
+/* */
+/* FreeType API for validating OpenType tables (body). */
+/* */
+/* Copyright 2004, 2006, 2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svotval.h"
+#include "../../include/freetype/ftotval.h"
+
+
+ /* documentation is in ftotval.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_OpenType_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *BASE_table,
+ FT_Bytes *GDEF_table,
+ FT_Bytes *GPOS_table,
+ FT_Bytes *GSUB_table,
+ FT_Bytes *JSTF_table )
+ {
+ FT_Service_OTvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( !( BASE_table &&
+ GDEF_table &&
+ GPOS_table &&
+ GSUB_table &&
+ JSTF_table ) )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ BASE_table,
+ GDEF_table,
+ GPOS_table,
+ GSUB_table,
+ JSTF_table );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_OpenType_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+ FT_FREE( table );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
new file mode 100644
index 0000000000..61127707a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
@@ -0,0 +1,1081 @@
+/***************************************************************************/
+/* */
+/* ftoutln.c */
+/* */
+/* FreeType outline management (body). */
+/* */
+/* Copyright 1996-2008, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* All functions are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_outline
+
+
+ static
+ const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 };
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Decompose( FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user )
+ {
+#undef SCALED
+#define SCALED( x ) ( ( (x) << shift ) - delta )
+
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ FT_Error error;
+
+ FT_Int n; /* index of contour in outline */
+ FT_UInt first; /* index of first point in contour */
+ FT_Int tag; /* current point's state */
+
+ FT_Int shift;
+ FT_Pos delta;
+
+
+ if ( !outline || !func_interface )
+ return FT_THROW( Invalid_Argument );
+
+ shift = func_interface->shift;
+ delta = func_interface->delta;
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ FT_Int last; /* index of last point in contour */
+
+
+ FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+ last = outline->contours[n];
+ if ( last < 0 )
+ goto Invalid_Outline;
+ limit = outline->points + last;
+
+ v_start = outline->points[first];
+ v_start.x = SCALED( v_start.x );
+ v_start.y = SCALED( v_start.y );
+
+ v_last = outline->points[last];
+ v_last.x = SCALED( v_last.x );
+ v_last.y = SCALED( v_last.y );
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ FT_TRACE5(( " move to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->move_to( &v_start, user );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0 ));
+ error = func_interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_middle.x / 64.0, v_middle.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1.x = SCALED( point[-2].x );
+ vec1.y = SCALED( point[-2].y );
+
+ vec2.x = SCALED( point[-1].x );
+ vec2.y = SCALED( point[-1].y );
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->line_to( &v_start, user );
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
+ }
+
+ FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+ return FT_Err_Ok;
+
+ Exit:
+ FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_New_Internal( FT_Memory memory,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline )
+ {
+ FT_Error error;
+
+
+ if ( !anoutline || !memory )
+ return FT_THROW( Invalid_Argument );
+
+ *anoutline = null_outline;
+
+ if ( numContours < 0 ||
+ (FT_UInt)numContours > numPoints )
+ return FT_THROW( Invalid_Argument );
+
+ if ( numPoints > FT_OUTLINE_POINTS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_NEW_ARRAY( anoutline->points, numPoints ) ||
+ FT_NEW_ARRAY( anoutline->tags, numPoints ) ||
+ FT_NEW_ARRAY( anoutline->contours, numContours ) )
+ goto Fail;
+
+ anoutline->n_points = (FT_UShort)numPoints;
+ anoutline->n_contours = (FT_Short)numContours;
+ anoutline->flags |= FT_OUTLINE_OWNER;
+
+ return FT_Err_Ok;
+
+ Fail:
+ anoutline->flags |= FT_OUTLINE_OWNER;
+ FT_Outline_Done_Internal( memory, anoutline );
+
+ return error;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline )
+ {
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ return FT_Outline_New_Internal( library->memory, numPoints,
+ numContours, anoutline );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Check( FT_Outline* outline )
+ {
+ if ( outline )
+ {
+ FT_Int n_points = outline->n_points;
+ FT_Int n_contours = outline->n_contours;
+ FT_Int end0, end;
+ FT_Int n;
+
+
+ /* empty glyph? */
+ if ( n_points == 0 && n_contours == 0 )
+ return 0;
+
+ /* check point and contour counts */
+ if ( n_points <= 0 || n_contours <= 0 )
+ goto Bad;
+
+ end0 = end = -1;
+ for ( n = 0; n < n_contours; n++ )
+ {
+ end = outline->contours[n];
+
+ /* note that we don't accept empty contours */
+ if ( end <= end0 || end >= n_points )
+ goto Bad;
+
+ end0 = end;
+ }
+
+ if ( end != n_points - 1 )
+ goto Bad;
+
+ /* XXX: check the tags array */
+ return 0;
+ }
+
+ Bad:
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Copy( const FT_Outline* source,
+ FT_Outline *target )
+ {
+ FT_Int is_owner;
+
+
+ if ( !source || !target ||
+ source->n_points != target->n_points ||
+ source->n_contours != target->n_contours )
+ return FT_THROW( Invalid_Argument );
+
+ if ( source == target )
+ return FT_Err_Ok;
+
+ FT_ARRAY_COPY( target->points, source->points, source->n_points );
+
+ FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
+
+ FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
+
+ /* copy all flags, except the `FT_OUTLINE_OWNER' one */
+ is_owner = target->flags & FT_OUTLINE_OWNER;
+ target->flags = source->flags;
+
+ target->flags &= ~FT_OUTLINE_OWNER;
+ target->flags |= is_owner;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Done_Internal( FT_Memory memory,
+ FT_Outline* outline )
+ {
+ if ( memory && outline )
+ {
+ if ( outline->flags & FT_OUTLINE_OWNER )
+ {
+ FT_FREE( outline->points );
+ FT_FREE( outline->tags );
+ FT_FREE( outline->contours );
+ }
+ *outline = null_outline;
+
+ return FT_Err_Ok;
+ }
+ else
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Done( FT_Library library,
+ FT_Outline* outline )
+ {
+ /* check for valid `outline' in FT_Outline_Done_Internal() */
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ return FT_Outline_Done_Internal( library->memory, outline );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Get_CBox( const FT_Outline* outline,
+ FT_BBox *acbox )
+ {
+ FT_Pos xMin, yMin, xMax, yMax;
+
+
+ if ( outline && acbox )
+ {
+ if ( outline->n_points == 0 )
+ {
+ xMin = 0;
+ yMin = 0;
+ xMax = 0;
+ yMax = 0;
+ }
+ else
+ {
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = vec + outline->n_points;
+
+
+ xMin = xMax = vec->x;
+ yMin = yMax = vec->y;
+ vec++;
+
+ for ( ; vec < limit; vec++ )
+ {
+ FT_Pos x, y;
+
+
+ x = vec->x;
+ if ( x < xMin ) xMin = x;
+ if ( x > xMax ) xMax = x;
+
+ y = vec->y;
+ if ( y < yMin ) yMin = y;
+ if ( y > yMax ) yMax = y;
+ }
+ }
+ acbox->xMin = xMin;
+ acbox->xMax = xMax;
+ acbox->yMin = yMin;
+ acbox->yMax = yMax;
+ }
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Translate( const FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset )
+ {
+ FT_UShort n;
+ FT_Vector* vec;
+
+
+ if ( !outline )
+ return;
+
+ vec = outline->points;
+
+ for ( n = 0; n < outline->n_points; n++ )
+ {
+ vec->x += xOffset;
+ vec->y += yOffset;
+ vec++;
+ }
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Reverse( FT_Outline* outline )
+ {
+ FT_UShort n;
+ FT_Int first, last;
+
+
+ if ( !outline )
+ return;
+
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ last = outline->contours[n];
+
+ /* reverse point table */
+ {
+ FT_Vector* p = outline->points + first;
+ FT_Vector* q = outline->points + last;
+ FT_Vector swap;
+
+
+ while ( p < q )
+ {
+ swap = *p;
+ *p = *q;
+ *q = swap;
+ p++;
+ q--;
+ }
+ }
+
+ /* reverse tags table */
+ {
+ char* p = outline->tags + first;
+ char* q = outline->tags + last;
+ char swap;
+
+
+ while ( p < q )
+ {
+ swap = *p;
+ *p = *q;
+ *q = swap;
+ p++;
+ q--;
+ }
+ }
+
+ first = last + 1;
+ }
+
+ outline->flags ^= FT_OUTLINE_REVERSE_FILL;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params )
+ {
+ FT_Error error;
+ FT_Bool update = FALSE;
+ FT_Renderer renderer;
+ FT_ListNode node;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !outline || !params )
+ return FT_THROW( Invalid_Argument );
+
+ renderer = library->cur_renderer;
+ node = library->renderers.head;
+
+ params->source = (void*)outline;
+
+ error = FT_ERR( Cannot_Render_Glyph );
+ while ( renderer )
+ {
+ error = renderer->raster_render( renderer->raster, params );
+ if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+ break;
+
+ /* FT_Err_Cannot_Render_Glyph is returned if the render mode */
+ /* is unsupported by the current renderer for this glyph image */
+ /* format */
+
+ /* now, look for another renderer that supports the same */
+ /* format */
+ renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
+ &node );
+ update = TRUE;
+ }
+
+ /* if we changed the current renderer for the glyph image format */
+ /* we need to select it as the next current one */
+ if ( !error && update && renderer )
+ FT_Set_Renderer( library, renderer, 0, 0 );
+
+ return error;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ const FT_Bitmap *abitmap )
+ {
+ FT_Raster_Params params;
+
+
+ if ( !abitmap )
+ return FT_THROW( Invalid_Argument );
+
+ /* other checks are delayed to FT_Outline_Render() */
+
+ params.target = abitmap;
+ params.flags = 0;
+
+ if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY ||
+ abitmap->pixel_mode == FT_PIXEL_MODE_LCD ||
+ abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+ params.flags |= FT_RASTER_FLAG_AA;
+
+ return FT_Outline_Render( library, outline, &params );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Transform( FT_Vector* vector,
+ const FT_Matrix* matrix )
+ {
+ FT_Pos xz, yz;
+
+
+ if ( !vector || !matrix )
+ return;
+
+ xz = FT_MulFix( vector->x, matrix->xx ) +
+ FT_MulFix( vector->y, matrix->xy );
+
+ yz = FT_MulFix( vector->x, matrix->yx ) +
+ FT_MulFix( vector->y, matrix->yy );
+
+ vector->x = xz;
+ vector->y = yz;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Transform( const FT_Outline* outline,
+ const FT_Matrix* matrix )
+ {
+ FT_Vector* vec;
+ FT_Vector* limit;
+
+
+ if ( !outline || !matrix )
+ return;
+
+ vec = outline->points;
+ limit = vec + outline->n_points;
+
+ for ( ; vec < limit; vec++ )
+ FT_Vector_Transform( vec, matrix );
+ }
+
+
+#if 0
+
+#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \
+ do { \
+ (first) = ( c > 0 ) ? (outline)->points + \
+ (outline)->contours[c - 1] + 1 \
+ : (outline)->points; \
+ (last) = (outline)->points + (outline)->contours[c]; \
+ } while ( 0 )
+
+
+ /* Is a point in some contour? */
+ /* */
+ /* We treat every point of the contour as if it */
+ /* it were ON. That is, we allow false positives, */
+ /* but disallow false negatives. (XXX really?) */
+ static FT_Bool
+ ft_contour_has( FT_Outline* outline,
+ FT_Short c,
+ FT_Vector* point )
+ {
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Vector* a;
+ FT_Vector* b;
+ FT_UInt n = 0;
+
+
+ FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+ for ( a = first; a <= last; a++ )
+ {
+ FT_Pos x;
+ FT_Int intersect;
+
+
+ b = ( a == last ) ? first : a + 1;
+
+ intersect = ( a->y - point->y ) ^ ( b->y - point->y );
+
+ /* a and b are on the same side */
+ if ( intersect >= 0 )
+ {
+ if ( intersect == 0 && a->y == point->y )
+ {
+ if ( ( a->x <= point->x && b->x >= point->x ) ||
+ ( a->x >= point->x && b->x <= point->x ) )
+ return 1;
+ }
+
+ continue;
+ }
+
+ x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
+
+ if ( x < point->x )
+ n++;
+ else if ( x == point->x )
+ return 1;
+ }
+
+ return n & 1;
+ }
+
+
+ static FT_Bool
+ ft_contour_enclosed( FT_Outline* outline,
+ FT_UShort c )
+ {
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Short i;
+
+
+ FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+ for ( i = 0; i < outline->n_contours; i++ )
+ {
+ if ( i != c && ft_contour_has( outline, i, first ) )
+ {
+ FT_Vector* pt;
+
+
+ for ( pt = first + 1; pt <= last; pt++ )
+ if ( !ft_contour_has( outline, i, pt ) )
+ return 0;
+
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /* This version differs from the public one in that each */
+ /* part (contour not enclosed in another contour) of the */
+ /* outline is checked for orientation. This is */
+ /* necessary for some buggy CJK fonts. */
+ static FT_Orientation
+ ft_outline_get_orientation( FT_Outline* outline )
+ {
+ FT_Short i;
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Orientation orient = FT_ORIENTATION_NONE;
+
+
+ first = outline->points;
+ for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
+ {
+ FT_Vector* point;
+ FT_Vector* xmin_point;
+ FT_Pos xmin;
+
+
+ last = outline->points + outline->contours[i];
+
+ /* skip degenerate contours */
+ if ( last < first + 2 )
+ continue;
+
+ if ( ft_contour_enclosed( outline, i ) )
+ continue;
+
+ xmin = first->x;
+ xmin_point = first;
+
+ for ( point = first + 1; point <= last; point++ )
+ {
+ if ( point->x < xmin )
+ {
+ xmin = point->x;
+ xmin_point = point;
+ }
+ }
+
+ /* check the orientation of the contour */
+ {
+ FT_Vector* prev;
+ FT_Vector* next;
+ FT_Orientation o;
+
+
+ prev = ( xmin_point == first ) ? last : xmin_point - 1;
+ next = ( xmin_point == last ) ? first : xmin_point + 1;
+
+ if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
+ FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
+ o = FT_ORIENTATION_POSTSCRIPT;
+ else
+ o = FT_ORIENTATION_TRUETYPE;
+
+ if ( orient == FT_ORIENTATION_NONE )
+ orient = o;
+ else if ( orient != o )
+ return FT_ORIENTATION_NONE;
+ }
+ }
+
+ return orient;
+ }
+
+#endif /* 0 */
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Embolden( FT_Outline* outline,
+ FT_Pos strength )
+ {
+ return FT_Outline_EmboldenXY( outline, strength, strength );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_EmboldenXY( FT_Outline* outline,
+ FT_Pos xstrength,
+ FT_Pos ystrength )
+ {
+ FT_Vector* points;
+ FT_Vector v_prev, v_first, v_next, v_cur;
+ FT_Int c, n, first;
+ FT_Int orientation;
+
+
+ if ( !outline )
+ return FT_THROW( Invalid_Argument );
+
+ xstrength /= 2;
+ ystrength /= 2;
+ if ( xstrength == 0 && ystrength == 0 )
+ return FT_Err_Ok;
+
+ orientation = FT_Outline_Get_Orientation( outline );
+ if ( orientation == FT_ORIENTATION_NONE )
+ {
+ if ( outline->n_contours )
+ return FT_THROW( Invalid_Argument );
+ else
+ return FT_Err_Ok;
+ }
+
+ points = outline->points;
+
+ first = 0;
+ for ( c = 0; c < outline->n_contours; c++ )
+ {
+ FT_Vector in, out, shift;
+ FT_Fixed l_in, l_out, l, q, d;
+ int last = outline->contours[c];
+
+
+ v_first = points[first];
+ v_prev = points[last];
+ v_cur = v_first;
+
+ /* compute incoming normalized vector */
+ in.x = v_cur.x - v_prev.x;
+ in.y = v_cur.y - v_prev.y;
+ l_in = FT_Vector_Length( &in );
+ if ( l_in )
+ {
+ in.x = FT_DivFix( in.x, l_in );
+ in.y = FT_DivFix( in.y, l_in );
+ }
+
+ for ( n = first; n <= last; n++ )
+ {
+ if ( n < last )
+ v_next = points[n + 1];
+ else
+ v_next = v_first;
+
+ /* compute outgoing normalized vector */
+ out.x = v_next.x - v_cur.x;
+ out.y = v_next.y - v_cur.y;
+ l_out = FT_Vector_Length( &out );
+ if ( l_out )
+ {
+ out.x = FT_DivFix( out.x, l_out );
+ out.y = FT_DivFix( out.y, l_out );
+ }
+
+ d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
+
+ /* shift only if turn is less than ~160 degrees */
+ if ( d > -0xF000L )
+ {
+ d = d + 0x10000L;
+
+ /* shift components are aligned along lateral bisector */
+ /* and directed according to the outline orientation. */
+ shift.x = in.y + out.y;
+ shift.y = in.x + out.x;
+
+ if ( orientation == FT_ORIENTATION_TRUETYPE )
+ shift.x = -shift.x;
+ else
+ shift.y = -shift.y;
+
+ /* restrict shift magnitude to better handle collapsing segments */
+ q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
+ if ( orientation == FT_ORIENTATION_TRUETYPE )
+ q = -q;
+
+ l = FT_MIN( l_in, l_out );
+
+ /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
+ if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )
+ shift.x = FT_MulDiv( shift.x, xstrength, d );
+ else
+ shift.x = FT_MulDiv( shift.x, l, q );
+
+
+ if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )
+ shift.y = FT_MulDiv( shift.y, ystrength, d );
+ else
+ shift.y = FT_MulDiv( shift.y, l, q );
+ }
+ else
+ shift.x = shift.y = 0;
+
+ outline->points[n].x = v_cur.x + xstrength + shift.x;
+ outline->points[n].y = v_cur.y + ystrength + shift.y;
+
+ in = out;
+ l_in = l_out;
+ v_cur = v_next;
+ }
+
+ first = last + 1;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Orientation )
+ FT_Outline_Get_Orientation( FT_Outline* outline )
+ {
+ FT_BBox cbox;
+ FT_Int xshift, yshift;
+ FT_Vector* points;
+ FT_Vector v_prev, v_cur;
+ FT_Int c, n, first;
+ FT_Pos area = 0;
+
+
+ if ( !outline || outline->n_points <= 0 )
+ return FT_ORIENTATION_TRUETYPE;
+
+ /* We use the nonzero winding rule to find the orientation. */
+ /* Since glyph outlines behave much more `regular' than arbitrary */
+ /* cubic or quadratic curves, this test deals with the polygon */
+ /* only which is spanned up by the control points. */
+
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;
+ xshift = FT_MAX( xshift, 0 );
+
+ yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;
+ yshift = FT_MAX( yshift, 0 );
+
+ points = outline->points;
+
+ first = 0;
+ for ( c = 0; c < outline->n_contours; c++ )
+ {
+ FT_Int last = outline->contours[c];
+
+
+ v_prev = points[last];
+
+ for ( n = first; n <= last; n++ )
+ {
+ v_cur = points[n];
+ area += ( ( v_cur.y - v_prev.y ) >> yshift ) *
+ ( ( v_cur.x + v_prev.x ) >> xshift );
+ v_prev = v_cur;
+ }
+
+ first = last + 1;
+ }
+
+ if ( area > 0 )
+ return FT_ORIENTATION_POSTSCRIPT;
+ else if ( area < 0 )
+ return FT_ORIENTATION_TRUETYPE;
+ else
+ return FT_ORIENTATION_NONE;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
new file mode 100644
index 0000000000..589119c3bb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/* */
+/* ftpatent.c */
+/* */
+/* FreeType API for checking patented TrueType bytecode instructions */
+/* (body). */
+/* */
+/* Copyright 2007, 2008, 2010 by David Turner. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+
+
+ static FT_Bool
+ _tt_check_patents_in_range( FT_Stream stream,
+ FT_ULong size )
+ {
+ FT_Bool result = FALSE;
+ FT_Error error;
+ FT_Bytes p, end;
+
+
+ if ( FT_FRAME_ENTER( size ) )
+ return 0;
+
+ p = stream->cursor;
+ end = p + size;
+
+ while ( p < end )
+ {
+ switch (p[0])
+ {
+ case 0x06: /* SPvTL // */
+ case 0x07: /* SPvTL + */
+ case 0x08: /* SFvTL // */
+ case 0x09: /* SFvTL + */
+ case 0x0A: /* SPvFS */
+ case 0x0B: /* SFvFS */
+ result = TRUE;
+ goto Exit;
+
+ case 0x40:
+ if ( p + 1 >= end )
+ goto Exit;
+
+ p += p[1] + 2;
+ break;
+
+ case 0x41:
+ if ( p + 1 >= end )
+ goto Exit;
+
+ p += p[1] * 2 + 2;
+ break;
+
+ case 0x71: /* DELTAP2 */
+ case 0x72: /* DELTAP3 */
+ case 0x73: /* DELTAC0 */
+ case 0x74: /* DELTAC1 */
+ case 0x75: /* DELTAC2 */
+ result = TRUE;
+ goto Exit;
+
+ case 0xB0:
+ case 0xB1:
+ case 0xB2:
+ case 0xB3:
+ case 0xB4:
+ case 0xB5:
+ case 0xB6:
+ case 0xB7:
+ p += ( p[0] - 0xB0 ) + 2;
+ break;
+
+ case 0xB8:
+ case 0xB9:
+ case 0xBA:
+ case 0xBB:
+ case 0xBC:
+ case 0xBD:
+ case 0xBE:
+ case 0xBF:
+ p += ( p[0] - 0xB8 ) * 2 + 3;
+ break;
+
+ default:
+ p += 1;
+ break;
+ }
+ }
+
+ Exit:
+ FT_UNUSED( error );
+ FT_FRAME_EXIT();
+ return result;
+ }
+
+
+ static FT_Bool
+ _tt_check_patents_in_table( FT_Face face,
+ FT_ULong tag )
+ {
+ FT_Stream stream = face->stream;
+ FT_Error error = FT_Err_Ok;
+ FT_Service_SFNT_Table service;
+ FT_Bool result = FALSE;
+
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+
+ if ( service )
+ {
+ FT_UInt i = 0;
+ FT_ULong tag_i = 0, offset_i = 0, length_i = 0;
+
+
+ for ( i = 0; !error && tag_i != tag ; i++ )
+ error = service->table_info( face, i,
+ &tag_i, &offset_i, &length_i );
+
+ if ( error ||
+ FT_STREAM_SEEK( offset_i ) )
+ goto Exit;
+
+ result = _tt_check_patents_in_range( stream, length_i );
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ static FT_Bool
+ _tt_face_check_patents( FT_Face face )
+ {
+ FT_Stream stream = face->stream;
+ FT_UInt gindex;
+ FT_Error error;
+ FT_Bool result;
+
+ FT_Service_TTGlyf service;
+
+
+ result = _tt_check_patents_in_table( face, TTAG_fpgm );
+ if ( result )
+ goto Exit;
+
+ result = _tt_check_patents_in_table( face, TTAG_prep );
+ if ( result )
+ goto Exit;
+
+ FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
+ if ( service == NULL )
+ goto Exit;
+
+ for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
+ {
+ FT_ULong offset, num_ins, size;
+ FT_Int num_contours;
+
+
+ offset = service->get_location( face, gindex, &size );
+ if ( size == 0 )
+ continue;
+
+ if ( FT_STREAM_SEEK( offset ) ||
+ FT_READ_SHORT( num_contours ) )
+ continue;
+
+ if ( num_contours >= 0 ) /* simple glyph */
+ {
+ if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
+ continue;
+ }
+ else /* compound glyph */
+ {
+ FT_Bool has_instr = 0;
+
+
+ if ( FT_STREAM_SKIP( 8 ) )
+ continue;
+
+ /* now read each component */
+ for (;;)
+ {
+ FT_UInt flags, toskip;
+
+
+ if( FT_READ_USHORT( flags ) )
+ break;
+
+ toskip = 2 + 1 + 1;
+
+ if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */
+ toskip += 2;
+
+ if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */
+ toskip += 2;
+ else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */
+ toskip += 4;
+ else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */
+ toskip += 8;
+
+ if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */
+ has_instr = 1;
+
+ if ( FT_STREAM_SKIP( toskip ) )
+ goto NextGlyph;
+
+ if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */
+ break;
+ }
+
+ if ( !has_instr )
+ goto NextGlyph;
+ }
+
+ if ( FT_READ_USHORT( num_ins ) )
+ continue;
+
+ result = _tt_check_patents_in_range( stream, num_ins );
+ if ( result )
+ goto Exit;
+
+ NextGlyph:
+ ;
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Bool )
+ FT_Face_CheckTrueTypePatents( FT_Face face )
+ {
+ FT_Bool result = FALSE;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ result = _tt_face_check_patents( face );
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Bool )
+ FT_Face_SetUnpatentedHinting( FT_Face face,
+ FT_Bool value )
+ {
+ FT_Bool result = FALSE;
+
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+ !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ result = !face->internal->ignore_unpatented_hinter;
+ face->internal->ignore_unpatented_hinter = !value;
+ }
+#else
+ FT_UNUSED( face );
+ FT_UNUSED( value );
+#endif
+
+ return result;
+ }
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
new file mode 100644
index 0000000000..1ea6888efa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
@@ -0,0 +1,146 @@
+/***************************************************************************/
+/* */
+/* ftpfr.c */
+/* */
+/* FreeType API for accessing PFR-specific data (body). */
+/* */
+/* Copyright 2002-2004, 2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpfr.h"
+
+
+ /* check the format */
+ static FT_Service_PfrMetrics
+ ft_pfr_check( FT_Face face )
+ {
+ FT_Service_PfrMetrics service = NULL;
+
+
+ if ( face )
+ FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
+
+ return service;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Metrics( FT_Face face,
+ FT_UInt *aoutline_resolution,
+ FT_UInt *ametrics_resolution,
+ FT_Fixed *ametrics_x_scale,
+ FT_Fixed *ametrics_y_scale )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Service_PfrMetrics service;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+ service = ft_pfr_check( face );
+ if ( service )
+ {
+ error = service->get_metrics( face,
+ aoutline_resolution,
+ ametrics_resolution,
+ ametrics_x_scale,
+ ametrics_y_scale );
+ }
+ else
+ {
+ FT_Fixed x_scale, y_scale;
+
+
+ /* this is not a PFR font */
+ if ( aoutline_resolution )
+ *aoutline_resolution = face->units_per_EM;
+
+ if ( ametrics_resolution )
+ *ametrics_resolution = face->units_per_EM;
+
+ x_scale = y_scale = 0x10000L;
+ if ( face->size )
+ {
+ x_scale = face->size->metrics.x_scale;
+ y_scale = face->size->metrics.y_scale;
+ }
+
+ if ( ametrics_x_scale )
+ *ametrics_x_scale = x_scale;
+
+ if ( ametrics_y_scale )
+ *ametrics_y_scale = y_scale;
+
+ error = FT_THROW( Unknown_File_Format );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Kerning( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector )
+ {
+ FT_Error error;
+ FT_Service_PfrMetrics service;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+ service = ft_pfr_check( face );
+ if ( service )
+ error = service->get_kerning( face, left, right, avector );
+ else
+ error = FT_Get_Kerning( face, left, right,
+ FT_KERNING_UNSCALED, avector );
+
+ return error;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance )
+ {
+ FT_Error error;
+ FT_Service_PfrMetrics service;
+
+
+ service = ft_pfr_check( face );
+ if ( service )
+ {
+ error = service->get_advance( face, gindex, aadvance );
+ }
+ else
+ /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
+ error = FT_THROW( Invalid_Argument );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
new file mode 100644
index 0000000000..45c9ad20f1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* ftpic.c */
+/* */
+/* The FreeType position independent code services (body). */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* documentation is in ftpic.h */
+
+ FT_BASE_DEF( FT_Error )
+ ft_pic_container_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );
+
+ error = ft_base_pic_init( library );
+ if ( error )
+ return error;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* Destroy the contents of the container. */
+ FT_BASE_DEF( void )
+ ft_pic_container_destroy( FT_Library library )
+ {
+ ft_base_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
new file mode 100644
index 0000000000..8ab830ea27
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
@@ -0,0 +1,849 @@
+/***************************************************************************/
+/* */
+/* ftrfork.c */
+/* */
+/* Embedded resource forks accessor (body). */
+/* */
+/* Copyright 2004-2010, 2013 by */
+/* Masatake YAMATO and Redhat K.K. */
+/* */
+/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */
+/* derived from ftobjs.c. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of */
+/* Information-technology Promotion Agency, Japan. */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "basepic.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** Resource fork directory access ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_BASE_DEF( FT_Error )
+ FT_Raccess_Get_HeaderInfo( FT_Library library,
+ FT_Stream stream,
+ FT_Long rfork_offset,
+ FT_Long *map_offset,
+ FT_Long *rdata_pos )
+ {
+ FT_Error error;
+ unsigned char head[16], head2[16];
+ FT_Long map_pos, rdata_len;
+ int allzeros, allmatch, i;
+ FT_Long type_list;
+
+ FT_UNUSED( library );
+
+
+ error = FT_Stream_Seek( stream, rfork_offset );
+ if ( error )
+ return error;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
+ if ( error )
+ return error;
+
+ *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
+ ( head[1] << 16 ) |
+ ( head[2] << 8 ) |
+ head[3] );
+ map_pos = rfork_offset + ( ( head[4] << 24 ) |
+ ( head[5] << 16 ) |
+ ( head[6] << 8 ) |
+ head[7] );
+ rdata_len = ( head[ 8] << 24 ) |
+ ( head[ 9] << 16 ) |
+ ( head[10] << 8 ) |
+ head[11];
+
+ /* map_len = head[12] .. head[15] */
+
+ if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
+ return FT_THROW( Unknown_File_Format );
+
+ error = FT_Stream_Seek( stream, map_pos );
+ if ( error )
+ return error;
+
+ head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */
+
+ error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
+ if ( error )
+ return error;
+
+ allzeros = 1;
+ allmatch = 1;
+ for ( i = 0; i < 16; ++i )
+ {
+ if ( head2[i] != 0 )
+ allzeros = 0;
+ if ( head2[i] != head[i] )
+ allmatch = 0;
+ }
+ if ( !allzeros && !allmatch )
+ return FT_THROW( Unknown_File_Format );
+
+ /* If we have reached this point then it is probably a mac resource */
+ /* file. Now, does it contain any interesting resources? */
+ /* Skip handle to next resource map, the file resource number, and */
+ /* attributes. */
+ (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */
+ + 2 /* skip file resource number */
+ + 2 ); /* skip attributes */
+
+ if ( FT_READ_USHORT( type_list ) )
+ return error;
+ if ( type_list == -1 )
+ return FT_THROW( Unknown_File_Format );
+
+ error = FT_Stream_Seek( stream, map_pos + type_list );
+ if ( error )
+ return error;
+
+ *map_offset = map_pos + type_list;
+ return FT_Err_Ok;
+ }
+
+
+ static int
+ ft_raccess_sort_ref_by_id( FT_RFork_Ref* a,
+ FT_RFork_Ref* b )
+ {
+ if ( a->res_id < b->res_id )
+ return -1;
+ else if ( a->res_id > b->res_id )
+ return 1;
+ else
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Raccess_Get_DataOffsets( FT_Library library,
+ FT_Stream stream,
+ FT_Long map_offset,
+ FT_Long rdata_pos,
+ FT_Long tag,
+ FT_Long **offsets,
+ FT_Long *count )
+ {
+ FT_Error error;
+ int i, j, cnt, subcnt;
+ FT_Long tag_internal, rpos;
+ FT_Memory memory = library->memory;
+ FT_Long temp;
+ FT_Long *offsets_internal = NULL;
+ FT_RFork_Ref *ref = NULL;
+
+
+ error = FT_Stream_Seek( stream, map_offset );
+ if ( error )
+ return error;
+
+ if ( FT_READ_USHORT( cnt ) )
+ return error;
+ cnt++;
+
+ for ( i = 0; i < cnt; ++i )
+ {
+ if ( FT_READ_LONG( tag_internal ) ||
+ FT_READ_USHORT( subcnt ) ||
+ FT_READ_USHORT( rpos ) )
+ return error;
+
+ FT_TRACE2(( "Resource tags: %c%c%c%c\n",
+ (char)( 0xff & ( tag_internal >> 24 ) ),
+ (char)( 0xff & ( tag_internal >> 16 ) ),
+ (char)( 0xff & ( tag_internal >> 8 ) ),
+ (char)( 0xff & ( tag_internal >> 0 ) ) ));
+
+ if ( tag_internal == tag )
+ {
+ *count = subcnt + 1;
+ rpos += map_offset;
+
+ error = FT_Stream_Seek( stream, rpos );
+ if ( error )
+ return error;
+
+ if ( FT_NEW_ARRAY( ref, *count ) )
+ return error;
+
+ for ( j = 0; j < *count; ++j )
+ {
+ if ( FT_READ_USHORT( ref[j].res_id ) )
+ goto Exit;
+ if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
+ goto Exit;
+ if ( FT_READ_LONG( temp ) )
+ goto Exit;
+ if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
+ goto Exit;
+
+ ref[j].offset = temp & 0xFFFFFFL;
+ }
+
+ ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
+ ( int(*)(const void*, const void*) )
+ ft_raccess_sort_ref_by_id );
+
+ if ( FT_NEW_ARRAY( offsets_internal, *count ) )
+ goto Exit;
+
+ /* XXX: duplicated reference ID,
+ * gap between reference IDs are acceptable?
+ * further investigation on Apple implementation is needed.
+ */
+ for ( j = 0; j < *count; ++j )
+ offsets_internal[j] = rdata_pos + ref[j].offset;
+
+ *offsets = offsets_internal;
+ error = FT_Err_Ok;
+
+ Exit:
+ FT_FREE( ref );
+ return error;
+ }
+ }
+
+ return FT_THROW( Cannot_Open_Resource );
+ }
+
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** Guessing functions ****/
+ /**** ****/
+ /**** When you add a new guessing function, ****/
+ /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ raccess_guess_apple_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_apple_single( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_ufs_export( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_newvfs( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_hfsplus( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_vfat( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_cap( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_netatalk( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+
+ CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
+ ft_raccess_guess_rec)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk)
+ CONST_FT_RFORK_RULE_ARRAY_END
+
+
+ /*************************************************************************/
+ /**** ****/
+ /**** Helper functions ****/
+ /**** ****/
+ /*************************************************************************/
+
+ static FT_Error
+ raccess_guess_apple_generic( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ FT_Int32 magic,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_double_from_file_name( FT_Library library,
+ char * file_name,
+ FT_Long *result_offset );
+
+ static char *
+ raccess_make_file_name( FT_Memory memory,
+ const char *original_name,
+ const char *insertion );
+
+ FT_BASE_DEF( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char* base_name,
+ char **new_names,
+ FT_Long *offsets,
+ FT_Error *errors )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ new_names[i] = NULL;
+ if ( NULL != stream )
+ errors[i] = FT_Stream_Seek( stream, 0 );
+ else
+ errors[i] = FT_Err_Ok;
+
+ if ( errors[i] )
+ continue ;
+
+ errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
+ stream, base_name,
+ &(new_names[i]),
+ &(offsets[i]) );
+ }
+
+ return;
+ }
+
+
+#ifndef FT_MACINTOSH
+ static FT_RFork_Rule
+ raccess_get_rule_type_from_rule_index( FT_Library library,
+ FT_UInt rule_index )
+ {
+ FT_UNUSED( library );
+
+ if ( rule_index >= FT_RACCESS_N_RULES )
+ return FT_RFork_Rule_invalid;
+
+ return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
+ }
+
+
+ /*
+ * For this function, refer ftbase.h.
+ */
+ FT_LOCAL_DEF( FT_Bool )
+ ft_raccess_rule_by_darwin_vfs( FT_Library library,
+ FT_UInt rule_index )
+ {
+ switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
+ {
+ case FT_RFork_Rule_darwin_newvfs:
+ case FT_RFork_Rule_darwin_hfsplus:
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+ }
+#endif
+
+
+ static FT_Error
+ raccess_guess_apple_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic = ( 0x00 << 24 ) |
+ ( 0x05 << 16 ) |
+ ( 0x16 << 8 ) |
+ 0x07;
+
+
+ *result_file_name = NULL;
+ if ( NULL == stream )
+ return FT_THROW( Cannot_Open_Stream );
+
+ return raccess_guess_apple_generic( library, stream, base_file_name,
+ magic, result_offset );
+ }
+
+
+ static FT_Error
+ raccess_guess_apple_single( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic = ( 0x00 << 24 ) |
+ ( 0x05 << 16 ) |
+ ( 0x16 << 8 ) |
+ 0x00;
+
+
+ *result_file_name = NULL;
+ if ( NULL == stream )
+ return FT_THROW( Cannot_Open_Stream );
+
+ return raccess_guess_apple_generic( library, stream, base_file_name,
+ magic, result_offset );
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_ufs_export( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+ newpath = raccess_make_file_name( memory, base_file_name, "._" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_hfsplus( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ /*
+ Only meaningful on systems with hfs+ drivers (or Macs).
+ */
+ FT_Error error;
+ char* newpath = NULL;
+ FT_Memory memory;
+ FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ if ( base_file_len + 6 > FT_INT_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_ALLOC( newpath, base_file_len + 6 ) )
+ return error;
+
+ FT_MEM_COPY( newpath, base_file_name, base_file_len );
+ FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_newvfs( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ /*
+ Only meaningful on systems with Mac OS X (> 10.1).
+ */
+ FT_Error error;
+ char* newpath = NULL;
+ FT_Memory memory;
+ FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ if ( base_file_len + 18 > FT_INT_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_ALLOC( newpath, base_file_len + 18 ) )
+ return error;
+
+ FT_MEM_COPY( newpath, base_file_name, base_file_len );
+ FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_vfat( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name,
+ "resource.frk/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_cap( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name, "%" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_netatalk( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name,
+ ".AppleDouble/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_apple_generic( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ FT_Int32 magic,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic_from_stream;
+ FT_Error error;
+ FT_Int32 version_number = 0;
+ FT_UShort n_of_entries;
+
+ int i;
+ FT_UInt32 entry_id, entry_offset, entry_length = 0;
+
+ const FT_UInt32 resource_fork_entry_id = 0x2;
+
+ FT_UNUSED( library );
+ FT_UNUSED( base_file_name );
+ FT_UNUSED( version_number );
+ FT_UNUSED( entry_length );
+
+
+ if ( FT_READ_LONG( magic_from_stream ) )
+ return error;
+ if ( magic_from_stream != magic )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( FT_READ_LONG( version_number ) )
+ return error;
+
+ /* filler */
+ error = FT_Stream_Skip( stream, 16 );
+ if ( error )
+ return error;
+
+ if ( FT_READ_USHORT( n_of_entries ) )
+ return error;
+ if ( n_of_entries == 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ for ( i = 0; i < n_of_entries; i++ )
+ {
+ if ( FT_READ_LONG( entry_id ) )
+ return error;
+ if ( entry_id == resource_fork_entry_id )
+ {
+ if ( FT_READ_LONG( entry_offset ) ||
+ FT_READ_LONG( entry_length ) )
+ continue;
+ *result_offset = entry_offset;
+
+ return FT_Err_Ok;
+ }
+ else
+ {
+ error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */
+ if ( error )
+ return error;
+ }
+ }
+
+ return FT_THROW( Unknown_File_Format );
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_double_from_file_name( FT_Library library,
+ char *file_name,
+ FT_Long *result_offset )
+ {
+ FT_Open_Args args2;
+ FT_Stream stream2;
+ char * nouse = NULL;
+ FT_Error error;
+
+
+ args2.flags = FT_OPEN_PATHNAME;
+ args2.pathname = file_name;
+ error = FT_Stream_New( library, &args2, &stream2 );
+ if ( error )
+ return error;
+
+ error = raccess_guess_apple_double( library, stream2, file_name,
+ &nouse, result_offset );
+
+ FT_Stream_Free( stream2, 0 );
+
+ return error;
+ }
+
+
+ static char*
+ raccess_make_file_name( FT_Memory memory,
+ const char *original_name,
+ const char *insertion )
+ {
+ char* new_name = NULL;
+ const char* tmp;
+ const char* slash;
+ size_t new_length;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ new_length = ft_strlen( original_name ) + ft_strlen( insertion );
+ if ( FT_ALLOC( new_name, new_length + 1 ) )
+ return NULL;
+
+ tmp = ft_strrchr( original_name, '/' );
+ if ( tmp )
+ {
+ ft_strncpy( new_name, original_name, tmp - original_name + 1 );
+ new_name[tmp - original_name + 1] = '\0';
+ slash = tmp + 1;
+ }
+ else
+ {
+ slash = original_name;
+ new_name[0] = '\0';
+ }
+
+ ft_strcat( new_name, insertion );
+ ft_strcat( new_name, slash );
+
+ return new_name;
+ }
+
+
+#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+ /*************************************************************************/
+ /* Dummy function; just sets errors */
+ /*************************************************************************/
+
+ FT_BASE_DEF( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char *base_name,
+ char **new_names,
+ FT_Long *offsets,
+ FT_Error *errors )
+ {
+ FT_Int i;
+
+ FT_UNUSED( library );
+ FT_UNUSED( stream );
+ FT_UNUSED( base_name );
+
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ new_names[i] = NULL;
+ offsets[i] = 0;
+ errors[i] = FT_ERR( Unimplemented_Feature );
+ }
+ }
+
+
+#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
new file mode 100644
index 0000000000..b4e08ef4e3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
@@ -0,0 +1,94 @@
+/***************************************************************************/
+/* */
+/* ftsnames.c */
+/* */
+/* Simple interface to access SFNT name tables (which are used */
+/* to hold font names, copyright info, notices, etc.) (body). */
+/* */
+/* This is _not_ used to retrieve glyph names! */
+/* */
+/* Copyright 1996-2001, 2002, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsnames.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+#ifdef TT_CONFIG_OPTION_SFNT_NAMES
+
+
+ /* documentation is in ftsnames.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Sfnt_Name_Count( FT_Face face )
+ {
+ return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
+ }
+
+
+ /* documentation is in ftsnames.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Sfnt_Name( FT_Face face,
+ FT_UInt idx,
+ FT_SfntName *aname )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( aname && face && FT_IS_SFNT( face ) )
+ {
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( idx < (FT_UInt)ttface->num_names )
+ {
+ TT_NameEntryRec* entry = ttface->name_table.names + idx;
+
+
+ /* load name on demand */
+ if ( entry->stringLength > 0 && entry->string == NULL )
+ {
+ FT_Memory memory = face->memory;
+ FT_Stream stream = face->stream;
+
+
+ if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) ||
+ FT_STREAM_SEEK( entry->stringOffset ) ||
+ FT_STREAM_READ( entry->string, entry->stringLength ) )
+ {
+ FT_FREE( entry->string );
+ entry->stringLength = 0;
+ }
+ }
+
+ aname->platform_id = entry->platformID;
+ aname->encoding_id = entry->encodingID;
+ aname->language_id = entry->languageID;
+ aname->name_id = entry->nameID;
+ aname->string = (FT_Byte*)entry->string;
+ aname->string_len = entry->stringLength;
+
+ error = FT_Err_Ok;
+ }
+ }
+
+ return error;
+ }
+
+
+#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
new file mode 100644
index 0000000000..8037506fa3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
@@ -0,0 +1,865 @@
+/***************************************************************************/
+/* */
+/* ftstream.c */
+/* */
+/* I/O stream support (body). */
+/* */
+/* Copyright 2000-2002, 2004-2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_stream
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_OpenMemory( FT_Stream stream,
+ const FT_Byte* base,
+ FT_ULong size )
+ {
+ stream->base = (FT_Byte*) base;
+ stream->size = size;
+ stream->pos = 0;
+ stream->cursor = 0;
+ stream->read = 0;
+ stream->close = 0;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_Close( FT_Stream stream )
+ {
+ if ( stream && stream->close )
+ stream->close( stream );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Seek( FT_Stream stream,
+ FT_ULong pos )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stream->read )
+ {
+ if ( stream->read( stream, pos, 0, 0 ) )
+ {
+ FT_ERROR(( "FT_Stream_Seek:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+ }
+ /* note that seeking to the first position after the file is valid */
+ else if ( pos > stream->size )
+ {
+ FT_ERROR(( "FT_Stream_Seek:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+
+ if ( !error )
+ stream->pos = pos;
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Skip( FT_Stream stream,
+ FT_Long distance )
+ {
+ if ( distance < 0 )
+ return FT_THROW( Invalid_Stream_Operation );
+
+ return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );
+ }
+
+
+ FT_BASE_DEF( FT_Long )
+ FT_Stream_Pos( FT_Stream stream )
+ {
+ return stream->pos;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Read( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ReadAt( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong read_bytes;
+
+
+ if ( pos >= stream->size )
+ {
+ FT_ERROR(( "FT_Stream_ReadAt:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ return FT_THROW( Invalid_Stream_Operation );
+ }
+
+ if ( stream->read )
+ read_bytes = stream->read( stream, pos, buffer, count );
+ else
+ {
+ read_bytes = stream->size - pos;
+ if ( read_bytes > count )
+ read_bytes = count;
+
+ FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
+ }
+
+ stream->pos = pos + read_bytes;
+
+ if ( read_bytes < count )
+ {
+ FT_ERROR(( "FT_Stream_ReadAt:"
+ " invalid read; expected %lu bytes, got %lu\n",
+ count, read_bytes ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_TryRead( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ FT_ULong read_bytes = 0;
+
+
+ if ( stream->pos >= stream->size )
+ goto Exit;
+
+ if ( stream->read )
+ read_bytes = stream->read( stream, stream->pos, buffer, count );
+ else
+ {
+ read_bytes = stream->size - stream->pos;
+ if ( read_bytes > count )
+ read_bytes = count;
+
+ FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
+ }
+
+ stream->pos += read_bytes;
+
+ Exit:
+ return read_bytes;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ExtractFrame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes )
+ {
+ FT_Error error;
+
+
+ error = FT_Stream_EnterFrame( stream, count );
+ if ( !error )
+ {
+ *pbytes = (FT_Byte*)stream->cursor;
+
+ /* equivalent to FT_Stream_ExitFrame(), with no memory block release */
+ stream->cursor = 0;
+ stream->limit = 0;
+ }
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_ReleaseFrame( FT_Stream stream,
+ FT_Byte** pbytes )
+ {
+ if ( stream && stream->read )
+ {
+ FT_Memory memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_free( memory, *pbytes );
+ *pbytes = NULL;
+#else
+ FT_FREE( *pbytes );
+#endif
+ }
+ *pbytes = 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_EnterFrame( FT_Stream stream,
+ FT_ULong count )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong read_bytes;
+
+
+ /* check for nested frame access */
+ FT_ASSERT( stream && stream->cursor == 0 );
+
+ if ( stream->read )
+ {
+ /* allocate the frame in memory */
+ FT_Memory memory = stream->memory;
+
+
+ /* simple sanity check */
+ if ( count > stream->size )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " frame size (%lu) larger than stream size (%lu)\n",
+ count, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+#ifdef FT_DEBUG_MEMORY
+ /* assume _ft_debug_file and _ft_debug_lineno are already set */
+ stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );
+ if ( error )
+ goto Exit;
+#else
+ if ( FT_QALLOC( stream->base, count ) )
+ goto Exit;
+#endif
+ /* read it */
+ read_bytes = stream->read( stream, stream->pos,
+ stream->base, count );
+ if ( read_bytes < count )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " invalid read; expected %lu bytes, got %lu\n",
+ count, read_bytes ));
+
+ FT_FREE( stream->base );
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+ stream->cursor = stream->base;
+ stream->limit = stream->cursor + count;
+ stream->pos += read_bytes;
+ }
+ else
+ {
+ /* check current and new position */
+ if ( stream->pos >= stream->size ||
+ stream->size - stream->pos < count )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
+ stream->pos, count, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+ /* set cursor */
+ stream->cursor = stream->base + stream->pos;
+ stream->limit = stream->cursor + count;
+ stream->pos += count;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_ExitFrame( FT_Stream stream )
+ {
+ /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */
+ /* that it is possible to access a frame of length 0 in */
+ /* some weird fonts (usually, when accessing an array of */
+ /* 0 records, like in some strange kern tables). */
+ /* */
+ /* In this case, the loader code handles the 0-length table */
+ /* gracefully; however, stream.cursor is really set to 0 by the */
+ /* FT_Stream_EnterFrame() call, and this is not an error. */
+ /* */
+ FT_ASSERT( stream );
+
+ if ( stream->read )
+ {
+ FT_Memory memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_free( memory, stream->base );
+ stream->base = NULL;
+#else
+ FT_FREE( stream->base );
+#endif
+ }
+ stream->cursor = 0;
+ stream->limit = 0;
+ }
+
+
+ FT_BASE_DEF( FT_Char )
+ FT_Stream_GetChar( FT_Stream stream )
+ {
+ FT_Char result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ if ( stream->cursor < stream->limit )
+ result = *stream->cursor++;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_GetUShort( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Short result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 1 < stream->limit )
+ result = FT_NEXT_USHORT( p );
+ stream->cursor = p;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_GetUShortLE( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Short result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 1 < stream->limit )
+ result = FT_NEXT_USHORT_LE( p );
+ stream->cursor = p;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetUOffset( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 2 < stream->limit )
+ result = FT_NEXT_UOFF3( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetULong( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 3 < stream->limit )
+ result = FT_NEXT_ULONG( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetULongLE( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 3 < stream->limit )
+ result = FT_NEXT_ULONG_LE( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_Char )
+ FT_Stream_ReadChar( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
+ goto Fail;
+ }
+ else
+ {
+ if ( stream->pos < stream->size )
+ result = stream->base[stream->pos];
+ else
+ goto Fail;
+ }
+ stream->pos++;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadChar:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_ReadUShort( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[2];
+ FT_Byte* p = 0;
+ FT_Short result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 1 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_USHORT( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 2;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUShort:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[2];
+ FT_Byte* p = 0;
+ FT_Short result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 1 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_USHORT_LE( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 2;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUShortLE:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadUOffset( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[3];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 2 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_UOFF3( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 3;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUOffset:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[4];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 3 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_ULONG( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 4;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadULong:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadULongLE( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[4];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 3 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_ULONG_LE( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 4;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadULongLE:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ReadFields( FT_Stream stream,
+ const FT_Frame_Field* fields,
+ void* structure )
+ {
+ FT_Error error;
+ FT_Bool frame_accessed = 0;
+ FT_Byte* cursor;
+
+
+ if ( !fields || !stream )
+ return FT_THROW( Invalid_Argument );
+
+ cursor = stream->cursor;
+
+ error = FT_Err_Ok;
+ do
+ {
+ FT_ULong value;
+ FT_Int sign_shift;
+ FT_Byte* p;
+
+
+ switch ( fields->value )
+ {
+ case ft_frame_start: /* access a new frame */
+ error = FT_Stream_EnterFrame( stream, fields->offset );
+ if ( error )
+ goto Exit;
+
+ frame_accessed = 1;
+ cursor = stream->cursor;
+ fields++;
+ continue; /* loop! */
+
+ case ft_frame_bytes: /* read a byte sequence */
+ case ft_frame_skip: /* skip some bytes */
+ {
+ FT_UInt len = fields->size;
+
+
+ if ( cursor + len > stream->limit )
+ {
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+ if ( fields->value == ft_frame_bytes )
+ {
+ p = (FT_Byte*)structure + fields->offset;
+ FT_MEM_COPY( p, cursor, len );
+ }
+ cursor += len;
+ fields++;
+ continue;
+ }
+
+ case ft_frame_byte:
+ case ft_frame_schar: /* read a single byte */
+ value = FT_NEXT_BYTE( cursor );
+ sign_shift = 24;
+ break;
+
+ case ft_frame_short_be:
+ case ft_frame_ushort_be: /* read a 2-byte big-endian short */
+ value = FT_NEXT_USHORT( cursor) ;
+ sign_shift = 16;
+ break;
+
+ case ft_frame_short_le:
+ case ft_frame_ushort_le: /* read a 2-byte little-endian short */
+ value = FT_NEXT_USHORT_LE( cursor );
+ sign_shift = 16;
+ break;
+
+ case ft_frame_long_be:
+ case ft_frame_ulong_be: /* read a 4-byte big-endian long */
+ value = FT_NEXT_ULONG( cursor );
+ sign_shift = 0;
+ break;
+
+ case ft_frame_long_le:
+ case ft_frame_ulong_le: /* read a 4-byte little-endian long */
+ value = FT_NEXT_ULONG_LE( cursor );
+ sign_shift = 0;
+ break;
+
+ case ft_frame_off3_be:
+ case ft_frame_uoff3_be: /* read a 3-byte big-endian long */
+ value = FT_NEXT_UOFF3( cursor );
+ sign_shift = 8;
+ break;
+
+ case ft_frame_off3_le:
+ case ft_frame_uoff3_le: /* read a 3-byte little-endian long */
+ value = FT_NEXT_UOFF3_LE( cursor );
+ sign_shift = 8;
+ break;
+
+ default:
+ /* otherwise, exit the loop */
+ stream->cursor = cursor;
+ goto Exit;
+ }
+
+ /* now, compute the signed value is necessary */
+ if ( fields->value & FT_FRAME_OP_SIGNED )
+ value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
+
+ /* finally, store the value in the object */
+
+ p = (FT_Byte*)structure + fields->offset;
+ switch ( fields->size )
+ {
+ case ( 8 / FT_CHAR_BIT ):
+ *(FT_Byte*)p = (FT_Byte)value;
+ break;
+
+ case ( 16 / FT_CHAR_BIT ):
+ *(FT_UShort*)p = (FT_UShort)value;
+ break;
+
+ case ( 32 / FT_CHAR_BIT ):
+ *(FT_UInt32*)p = (FT_UInt32)value;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_ULong*)p = (FT_ULong)value;
+ }
+
+ /* go to next field */
+ fields++;
+ }
+ while ( 1 );
+
+ Exit:
+ /* close the frame if it was opened by this read */
+ if ( frame_accessed )
+ FT_Stream_ExitFrame( stream );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
new file mode 100644
index 0000000000..c15aaafef6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
@@ -0,0 +1,2418 @@
+/***************************************************************************/
+/* */
+/* ftstroke.c */
+/* */
+/* FreeType path stroker (body). */
+/* */
+/* Copyright 2002-2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftstroke.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_StrokerBorder )
+ FT_Outline_GetInsideBorder( FT_Outline* outline )
+ {
+ FT_Orientation o = FT_Outline_Get_Orientation( outline );
+
+
+ return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT
+ : FT_STROKER_BORDER_LEFT;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_StrokerBorder )
+ FT_Outline_GetOutsideBorder( FT_Outline* outline )
+ {
+ FT_Orientation o = FT_Outline_Get_Orientation( outline );
+
+
+ return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT
+ : FT_STROKER_BORDER_RIGHT;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BEZIER COMPUTATIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 )
+#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 )
+
+#define FT_EPSILON 2
+
+#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON )
+
+
+ static FT_Pos
+ ft_pos_abs( FT_Pos x )
+ {
+ return x >= 0 ? x : -x;
+ }
+
+
+ static void
+ ft_conic_split( FT_Vector* base )
+ {
+ FT_Pos a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+ }
+
+
+ static FT_Bool
+ ft_conic_is_small_enough( FT_Vector* base,
+ FT_Angle *angle_in,
+ FT_Angle *angle_out )
+ {
+ FT_Vector d1, d2;
+ FT_Angle theta;
+ FT_Int close1, close2;
+
+
+ d1.x = base[1].x - base[2].x;
+ d1.y = base[1].y - base[2].y;
+ d2.x = base[0].x - base[1].x;
+ d2.y = base[0].y - base[1].y;
+
+ close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+ close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+
+ if ( close1 )
+ {
+ if ( close2 )
+ {
+ /* basically a point; */
+ /* do nothing to retain original direction */
+ }
+ else
+ {
+ *angle_in =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ }
+ else /* !close1 */
+ {
+ if ( close2 )
+ {
+ *angle_in =
+ *angle_out = FT_Atan2( d1.x, d1.y );
+ }
+ else
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ }
+
+ theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );
+
+ return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );
+ }
+
+
+ static void
+ ft_cubic_split( FT_Vector* base )
+ {
+ FT_Pos a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c ) / 2;
+ base[5].x = b = ( base[3].x + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].x = a = ( a + c ) / 2;
+ base[4].x = b = ( b + c ) / 2;
+ base[3].x = ( a + b ) / 2;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c ) / 2;
+ base[5].y = b = ( base[3].y + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].y = a = ( a + c ) / 2;
+ base[4].y = b = ( b + c ) / 2;
+ base[3].y = ( a + b ) / 2;
+ }
+
+
+ /* Return the average of `angle1' and `angle2'. */
+ /* This gives correct result even if `angle1' and `angle2' */
+ /* have opposite signs. */
+ static FT_Angle
+ ft_angle_mean( FT_Angle angle1,
+ FT_Angle angle2 )
+ {
+ return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;
+ }
+
+
+ static FT_Bool
+ ft_cubic_is_small_enough( FT_Vector* base,
+ FT_Angle *angle_in,
+ FT_Angle *angle_mid,
+ FT_Angle *angle_out )
+ {
+ FT_Vector d1, d2, d3;
+ FT_Angle theta1, theta2;
+ FT_Int close1, close2, close3;
+
+
+ d1.x = base[2].x - base[3].x;
+ d1.y = base[2].y - base[3].y;
+ d2.x = base[1].x - base[2].x;
+ d2.y = base[1].y - base[2].y;
+ d3.x = base[0].x - base[1].x;
+ d3.y = base[0].y - base[1].y;
+
+ close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+ close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+ close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );
+
+ if ( close1 )
+ {
+ if ( close2 )
+ {
+ if ( close3 )
+ {
+ /* basically a point; */
+ /* do nothing to retain original direction */
+ }
+ else /* !close3 */
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ else /* !close2 */
+ {
+ if ( close3 )
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in =
+ *angle_mid = FT_Atan2( d2.x, d2.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ }
+ else /* !close1 */
+ {
+ if ( close2 )
+ {
+ if ( close3 )
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d1.x, d1.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ *angle_mid = ft_angle_mean( *angle_in, *angle_out );
+ }
+ }
+ else /* !close2 */
+ {
+ if ( close3 )
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_mid =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_mid = FT_Atan2( d2.x, d2.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ }
+
+ theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) );
+ theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );
+
+ return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&
+ theta2 < FT_SMALL_CUBIC_THRESHOLD );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STROKE BORDERS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef enum FT_StrokeTags_
+ {
+ FT_STROKE_TAG_ON = 1, /* on-curve point */
+ FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */
+ FT_STROKE_TAG_BEGIN = 4, /* sub-path start */
+ FT_STROKE_TAG_END = 8 /* sub-path end */
+
+ } FT_StrokeTags;
+
+#define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )
+
+ typedef struct FT_StrokeBorderRec_
+ {
+ FT_UInt num_points;
+ FT_UInt max_points;
+ FT_Vector* points;
+ FT_Byte* tags;
+ FT_Bool movable; /* TRUE for ends of lineto borders */
+ FT_Int start; /* index of current sub-path start point */
+ FT_Memory memory;
+ FT_Bool valid;
+
+ } FT_StrokeBorderRec, *FT_StrokeBorder;
+
+
+ static FT_Error
+ ft_stroke_border_grow( FT_StrokeBorder border,
+ FT_UInt new_points )
+ {
+ FT_UInt old_max = border->max_points;
+ FT_UInt new_max = border->num_points + new_points;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ FT_UInt cur_max = old_max;
+ FT_Memory memory = border->memory;
+
+
+ while ( cur_max < new_max )
+ cur_max += ( cur_max >> 1 ) + 16;
+
+ if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||
+ FT_RENEW_ARRAY( border->tags, old_max, cur_max ) )
+ goto Exit;
+
+ border->max_points = cur_max;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ ft_stroke_border_close( FT_StrokeBorder border,
+ FT_Bool reverse )
+ {
+ FT_UInt start = border->start;
+ FT_UInt count = border->num_points;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ /* don't record empty paths! */
+ if ( count <= start + 1U )
+ border->num_points = start;
+ else
+ {
+ /* copy the last point to the start of this sub-path, since */
+ /* it contains the `adjusted' starting coordinates */
+ border->num_points = --count;
+ border->points[start] = border->points[count];
+
+ if ( reverse )
+ {
+ /* reverse the points */
+ {
+ FT_Vector* vec1 = border->points + start + 1;
+ FT_Vector* vec2 = border->points + count - 1;
+
+
+ for ( ; vec1 < vec2; vec1++, vec2-- )
+ {
+ FT_Vector tmp;
+
+
+ tmp = *vec1;
+ *vec1 = *vec2;
+ *vec2 = tmp;
+ }
+ }
+
+ /* then the tags */
+ {
+ FT_Byte* tag1 = border->tags + start + 1;
+ FT_Byte* tag2 = border->tags + count - 1;
+
+
+ for ( ; tag1 < tag2; tag1++, tag2-- )
+ {
+ FT_Byte tmp;
+
+
+ tmp = *tag1;
+ *tag1 = *tag2;
+ *tag2 = tmp;
+ }
+ }
+ }
+
+ border->tags[start ] |= FT_STROKE_TAG_BEGIN;
+ border->tags[count - 1] |= FT_STROKE_TAG_END;
+ }
+
+ border->start = -1;
+ border->movable = FALSE;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_lineto( FT_StrokeBorder border,
+ FT_Vector* to,
+ FT_Bool movable )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ if ( border->movable )
+ {
+ /* move last point */
+ border->points[border->num_points - 1] = *to;
+ }
+ else
+ {
+ /* don't add zero-length lineto */
+ if ( border->num_points > 0 &&
+ FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&
+ FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )
+ return error;
+
+ /* add one point */
+ error = ft_stroke_border_grow( border, 1 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *to;
+ tag[0] = FT_STROKE_TAG_ON;
+
+ border->num_points += 1;
+ }
+ }
+ border->movable = movable;
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_conicto( FT_StrokeBorder border,
+ FT_Vector* control,
+ FT_Vector* to )
+ {
+ FT_Error error;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ error = ft_stroke_border_grow( border, 2 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *control;
+ vec[1] = *to;
+
+ tag[0] = 0;
+ tag[1] = FT_STROKE_TAG_ON;
+
+ border->num_points += 2;
+ }
+
+ border->movable = FALSE;
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_cubicto( FT_StrokeBorder border,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to )
+ {
+ FT_Error error;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ error = ft_stroke_border_grow( border, 3 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *control1;
+ vec[1] = *control2;
+ vec[2] = *to;
+
+ tag[0] = FT_STROKE_TAG_CUBIC;
+ tag[1] = FT_STROKE_TAG_CUBIC;
+ tag[2] = FT_STROKE_TAG_ON;
+
+ border->num_points += 3;
+ }
+
+ border->movable = FALSE;
+
+ return error;
+ }
+
+
+#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 )
+
+
+ static FT_Error
+ ft_stroke_border_arcto( FT_StrokeBorder border,
+ FT_Vector* center,
+ FT_Fixed radius,
+ FT_Angle angle_start,
+ FT_Angle angle_diff )
+ {
+ FT_Angle total, angle, step, rotate, next, theta;
+ FT_Vector a, b, a2, b2;
+ FT_Fixed length;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* compute start point */
+ FT_Vector_From_Polar( &a, radius, angle_start );
+ a.x += center->x;
+ a.y += center->y;
+
+ total = angle_diff;
+ angle = angle_start;
+ rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;
+
+ while ( total != 0 )
+ {
+ step = total;
+ if ( step > FT_ARC_CUBIC_ANGLE )
+ step = FT_ARC_CUBIC_ANGLE;
+
+ else if ( step < -FT_ARC_CUBIC_ANGLE )
+ step = -FT_ARC_CUBIC_ANGLE;
+
+ next = angle + step;
+ theta = step;
+ if ( theta < 0 )
+ theta = -theta;
+
+ theta >>= 1;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &b, radius, next );
+ b.x += center->x;
+ b.y += center->y;
+
+ /* compute first and second control points */
+ length = FT_MulDiv( radius, FT_Sin( theta ) * 4,
+ ( 0x10000L + FT_Cos( theta ) ) * 3 );
+
+ FT_Vector_From_Polar( &a2, length, angle + rotate );
+ a2.x += a.x;
+ a2.y += a.y;
+
+ FT_Vector_From_Polar( &b2, length, next - rotate );
+ b2.x += b.x;
+ b2.y += b.y;
+
+ /* add cubic arc */
+ error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
+ if ( error )
+ break;
+
+ /* process the rest of the arc ?? */
+ a = b;
+ total -= step;
+ angle = next;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_moveto( FT_StrokeBorder border,
+ FT_Vector* to )
+ {
+ /* close current open path if any ? */
+ if ( border->start >= 0 )
+ ft_stroke_border_close( border, FALSE );
+
+ border->start = border->num_points;
+ border->movable = FALSE;
+
+ return ft_stroke_border_lineto( border, to, FALSE );
+ }
+
+
+ static void
+ ft_stroke_border_init( FT_StrokeBorder border,
+ FT_Memory memory )
+ {
+ border->memory = memory;
+ border->points = NULL;
+ border->tags = NULL;
+
+ border->num_points = 0;
+ border->max_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static void
+ ft_stroke_border_reset( FT_StrokeBorder border )
+ {
+ border->num_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static void
+ ft_stroke_border_done( FT_StrokeBorder border )
+ {
+ FT_Memory memory = border->memory;
+
+
+ FT_FREE( border->points );
+ FT_FREE( border->tags );
+
+ border->num_points = 0;
+ border->max_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_get_counts( FT_StrokeBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt num_points = 0;
+ FT_UInt num_contours = 0;
+
+ FT_UInt count = border->num_points;
+ FT_Vector* point = border->points;
+ FT_Byte* tags = border->tags;
+ FT_Int in_contour = 0;
+
+
+ for ( ; count > 0; count--, num_points++, point++, tags++ )
+ {
+ if ( tags[0] & FT_STROKE_TAG_BEGIN )
+ {
+ if ( in_contour != 0 )
+ goto Fail;
+
+ in_contour = 1;
+ }
+ else if ( in_contour == 0 )
+ goto Fail;
+
+ if ( tags[0] & FT_STROKE_TAG_END )
+ {
+ in_contour = 0;
+ num_contours++;
+ }
+ }
+
+ if ( in_contour != 0 )
+ goto Fail;
+
+ border->valid = TRUE;
+
+ Exit:
+ *anum_points = num_points;
+ *anum_contours = num_contours;
+ return error;
+
+ Fail:
+ num_points = 0;
+ num_contours = 0;
+ goto Exit;
+ }
+
+
+ static void
+ ft_stroke_border_export( FT_StrokeBorder border,
+ FT_Outline* outline )
+ {
+ /* copy point locations */
+ FT_ARRAY_COPY( outline->points + outline->n_points,
+ border->points,
+ border->num_points );
+
+ /* copy tags */
+ {
+ FT_UInt count = border->num_points;
+ FT_Byte* read = border->tags;
+ FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points;
+
+
+ for ( ; count > 0; count--, read++, write++ )
+ {
+ if ( *read & FT_STROKE_TAG_ON )
+ *write = FT_CURVE_TAG_ON;
+ else if ( *read & FT_STROKE_TAG_CUBIC )
+ *write = FT_CURVE_TAG_CUBIC;
+ else
+ *write = FT_CURVE_TAG_CONIC;
+ }
+ }
+
+ /* copy contours */
+ {
+ FT_UInt count = border->num_points;
+ FT_Byte* tags = border->tags;
+ FT_Short* write = outline->contours + outline->n_contours;
+ FT_Short idx = (FT_Short)outline->n_points;
+
+
+ for ( ; count > 0; count--, tags++, idx++ )
+ {
+ if ( *tags & FT_STROKE_TAG_END )
+ {
+ *write++ = idx;
+ outline->n_contours++;
+ }
+ }
+ }
+
+ outline->n_points = (short)( outline->n_points + border->num_points );
+
+ FT_ASSERT( FT_Outline_Check( outline ) == 0 );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STROKER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )
+
+ typedef struct FT_StrokerRec_
+ {
+ FT_Angle angle_in; /* direction into curr join */
+ FT_Angle angle_out; /* direction out of join */
+ FT_Vector center; /* current position */
+ FT_Fixed line_length; /* length of last lineto */
+ FT_Bool first_point; /* is this the start? */
+ FT_Bool subpath_open; /* is the subpath open? */
+ FT_Angle subpath_angle; /* subpath start direction */
+ FT_Vector subpath_start; /* subpath start position */
+ FT_Fixed subpath_line_length; /* subpath start lineto len */
+ FT_Bool handle_wide_strokes; /* use wide strokes logic? */
+
+ FT_Stroker_LineCap line_cap;
+ FT_Stroker_LineJoin line_join;
+ FT_Stroker_LineJoin line_join_saved;
+ FT_Fixed miter_limit;
+ FT_Fixed radius;
+
+ FT_StrokeBorderRec borders[2];
+ FT_Library library;
+
+ } FT_StrokerRec;
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_New( FT_Library library,
+ FT_Stroker *astroker )
+ {
+ FT_Error error; /* assigned in FT_NEW */
+ FT_Memory memory;
+ FT_Stroker stroker = NULL;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ if ( !FT_NEW( stroker ) )
+ {
+ stroker->library = library;
+
+ ft_stroke_border_init( &stroker->borders[0], memory );
+ ft_stroke_border_init( &stroker->borders[1], memory );
+ }
+
+ *astroker = stroker;
+
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Set( FT_Stroker stroker,
+ FT_Fixed radius,
+ FT_Stroker_LineCap line_cap,
+ FT_Stroker_LineJoin line_join,
+ FT_Fixed miter_limit )
+ {
+ stroker->radius = radius;
+ stroker->line_cap = line_cap;
+ stroker->line_join = line_join;
+ stroker->miter_limit = miter_limit;
+
+ /* ensure miter limit has sensible value */
+ if ( stroker->miter_limit < 0x10000 )
+ stroker->miter_limit = 0x10000;
+
+ /* save line join style: */
+ /* line join style can be temporarily changed when stroking curves */
+ stroker->line_join_saved = line_join;
+
+ FT_Stroker_Rewind( stroker );
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Rewind( FT_Stroker stroker )
+ {
+ if ( stroker )
+ {
+ ft_stroke_border_reset( &stroker->borders[0] );
+ ft_stroke_border_reset( &stroker->borders[1] );
+ }
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Done( FT_Stroker stroker )
+ {
+ if ( stroker )
+ {
+ FT_Memory memory = stroker->library->memory;
+
+
+ ft_stroke_border_done( &stroker->borders[0] );
+ ft_stroke_border_done( &stroker->borders[1] );
+
+ stroker->library = NULL;
+ FT_FREE( stroker );
+ }
+ }
+
+
+ /* create a circular arc at a corner or cap */
+ static FT_Error
+ ft_stroker_arcto( FT_Stroker stroker,
+ FT_Int side )
+ {
+ FT_Angle total, rotate;
+ FT_Fixed radius = stroker->radius;
+ FT_Error error = FT_Err_Ok;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+ if ( total == FT_ANGLE_PI )
+ total = -rotate * 2;
+
+ error = ft_stroke_border_arcto( border,
+ &stroker->center,
+ radius,
+ stroker->angle_in + rotate,
+ total );
+ border->movable = FALSE;
+ return error;
+ }
+
+
+ /* add a cap at the end of an opened path */
+ static FT_Error
+ ft_stroker_cap( FT_Stroker stroker,
+ FT_Angle angle,
+ FT_Int side )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )
+ {
+ /* add a round cap */
+ stroker->angle_in = angle;
+ stroker->angle_out = angle + FT_ANGLE_PI;
+
+ error = ft_stroker_arcto( stroker, side );
+ }
+ else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )
+ {
+ /* add a square cap */
+ FT_Vector delta, delta2;
+ FT_Angle rotate = FT_SIDE_TO_ROTATE( side );
+ FT_Fixed radius = stroker->radius;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ FT_Vector_From_Polar( &delta2, radius, angle + rotate );
+ FT_Vector_From_Polar( &delta, radius, angle );
+
+ delta.x += stroker->center.x + delta2.x;
+ delta.y += stroker->center.y + delta2.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ FT_Vector_From_Polar( &delta2, radius, angle - rotate );
+ FT_Vector_From_Polar( &delta, radius, angle );
+
+ delta.x += delta2.x + stroker->center.x;
+ delta.y += delta2.y + stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )
+ {
+ /* add a butt ending */
+ FT_Vector delta;
+ FT_Angle rotate = FT_SIDE_TO_ROTATE( side );
+ FT_Fixed radius = stroker->radius;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ FT_Vector_From_Polar( &delta, radius, angle + rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ FT_Vector_From_Polar( &delta, radius, angle - rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* process an inside corner, i.e. compute intersection */
+ static FT_Error
+ ft_stroker_inside( FT_Stroker stroker,
+ FT_Int side,
+ FT_Fixed line_length )
+ {
+ FT_StrokeBorder border = stroker->borders + side;
+ FT_Angle phi, theta, rotate;
+ FT_Fixed length, thcos;
+ FT_Vector delta;
+ FT_Error error = FT_Err_Ok;
+ FT_Bool intersect; /* use intersection of lines? */
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
+
+ /* Only intersect borders if between two lineto's and both */
+ /* lines are long enough (line_length is zero for curves). */
+ if ( !border->movable || line_length == 0 )
+ intersect = FALSE;
+ else
+ {
+ /* compute minimum required length of lines */
+ FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius,
+ FT_Tan( theta ) ) );
+
+
+ intersect = FT_BOOL( stroker->line_length >= min_length &&
+ line_length >= min_length );
+ }
+
+ if ( !intersect )
+ {
+ FT_Vector_From_Polar( &delta, stroker->radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ border->movable = FALSE;
+ }
+ else
+ {
+ /* compute median angle */
+ phi = stroker->angle_in + theta;
+
+ thcos = FT_Cos( theta );
+
+ length = FT_DivFix( stroker->radius, thcos );
+
+ FT_Vector_From_Polar( &delta, length, phi + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+ }
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+
+ return error;
+ }
+
+
+ /* process an outside corner, i.e. compute bevel/miter/round */
+ static FT_Error
+ ft_stroker_outside( FT_Stroker stroker,
+ FT_Int side,
+ FT_Fixed line_length )
+ {
+ FT_StrokeBorder border = stroker->borders + side;
+ FT_Error error;
+ FT_Angle rotate;
+
+
+ if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )
+ error = ft_stroker_arcto( stroker, side );
+ else
+ {
+ /* this is a mitered (pointed) or beveled (truncated) corner */
+ FT_Fixed sigma = 0, radius = stroker->radius;
+ FT_Angle theta = 0, phi = 0;
+ FT_Fixed thcos = 0;
+ FT_Bool bevel, fixed_bevel;
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ bevel =
+ FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );
+
+ fixed_bevel =
+ FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );
+
+ if ( !bevel )
+ {
+ theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+ if ( theta == FT_ANGLE_PI )
+ {
+ theta = rotate;
+ phi = stroker->angle_in;
+ }
+ else
+ {
+ theta /= 2;
+ phi = stroker->angle_in + theta + rotate;
+ }
+
+ thcos = FT_Cos( theta );
+ sigma = FT_MulFix( stroker->miter_limit, thcos );
+
+ /* is miter limit exceeded? */
+ if ( sigma < 0x10000L )
+ {
+ /* don't create variable bevels for very small deviations; */
+ /* FT_Sin(x) = 0 for x <= 57 */
+ if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
+ bevel = TRUE;
+ }
+ }
+
+ if ( bevel ) /* this is a bevel (broken angle) */
+ {
+ if ( fixed_bevel )
+ {
+ /* the outer corners are simply joined together */
+ FT_Vector delta;
+
+
+ /* add bevel */
+ FT_Vector_From_Polar( &delta,
+ radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ else /* variable bevel */
+ {
+ /* the miter is truncated */
+ FT_Vector middle, delta;
+ FT_Fixed length;
+
+
+ /* compute middle point */
+ FT_Vector_From_Polar( &middle,
+ FT_MulFix( radius, stroker->miter_limit ),
+ phi );
+ middle.x += stroker->center.x;
+ middle.y += stroker->center.y;
+
+ /* compute first angle point */
+ length = FT_MulDiv( radius, 0x10000L - sigma,
+ ft_pos_abs( FT_Sin( theta ) ) );
+
+ FT_Vector_From_Polar( &delta, length, phi + rotate );
+ delta.x += middle.x;
+ delta.y += middle.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* compute second angle point */
+ FT_Vector_From_Polar( &delta, length, phi - rotate );
+ delta.x += middle.x;
+ delta.y += middle.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* finally, add an end point; only needed if not lineto */
+ /* (line_length is zero for curves) */
+ if ( line_length == 0 )
+ {
+ FT_Vector_From_Polar( &delta,
+ radius,
+ stroker->angle_out + rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ }
+ }
+ else /* this is a miter (intersection) */
+ {
+ FT_Fixed length;
+ FT_Vector delta;
+
+
+ length = FT_DivFix( stroker->radius, thcos );
+
+ FT_Vector_From_Polar( &delta, length, phi );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* now add an end point; only needed if not lineto */
+ /* (line_length is zero for curves) */
+ if ( line_length == 0 )
+ {
+ FT_Vector_From_Polar( &delta,
+ stroker->radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroker_process_corner( FT_Stroker stroker,
+ FT_Fixed line_length )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Angle turn;
+ FT_Int inside_side;
+
+
+ turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+ /* no specific corner processing is required if the turn is 0 */
+ if ( turn == 0 )
+ goto Exit;
+
+ /* when we turn to the right, the inside side is 0 */
+ inside_side = 0;
+
+ /* otherwise, the inside side is 1 */
+ if ( turn < 0 )
+ inside_side = 1;
+
+ /* process the inside side */
+ error = ft_stroker_inside( stroker, inside_side, line_length );
+ if ( error )
+ goto Exit;
+
+ /* process the outside side */
+ error = ft_stroker_outside( stroker, 1 - inside_side, line_length );
+
+ Exit:
+ return error;
+ }
+
+
+ /* add two points to the left and right borders corresponding to the */
+ /* start of the subpath */
+ static FT_Error
+ ft_stroker_subpath_start( FT_Stroker stroker,
+ FT_Angle start_angle,
+ FT_Fixed line_length )
+ {
+ FT_Vector delta;
+ FT_Vector point;
+ FT_Error error;
+ FT_StrokeBorder border;
+
+
+ FT_Vector_From_Polar( &delta, stroker->radius,
+ start_angle + FT_ANGLE_PI2 );
+
+ point.x = stroker->center.x + delta.x;
+ point.y = stroker->center.y + delta.y;
+
+ border = stroker->borders;
+ error = ft_stroke_border_moveto( border, &point );
+ if ( error )
+ goto Exit;
+
+ point.x = stroker->center.x - delta.x;
+ point.y = stroker->center.y - delta.y;
+
+ border++;
+ error = ft_stroke_border_moveto( border, &point );
+
+ /* save angle, position, and line length for last join */
+ /* (line_length is zero for curves) */
+ stroker->subpath_angle = start_angle;
+ stroker->first_point = FALSE;
+ stroker->subpath_line_length = line_length;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_LineTo( FT_Stroker stroker,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_StrokeBorder border;
+ FT_Vector delta;
+ FT_Angle angle;
+ FT_Int side;
+ FT_Fixed line_length;
+
+
+ delta.x = to->x - stroker->center.x;
+ delta.y = to->y - stroker->center.y;
+
+ /* a zero-length lineto is a no-op; avoid creating a spurious corner */
+ if ( delta.x == 0 && delta.y == 0 )
+ goto Exit;
+
+ /* compute length of line */
+ line_length = FT_Vector_Length( &delta );
+
+ angle = FT_Atan2( delta.x, delta.y );
+ FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ {
+ /* This is the first segment of a subpath. We need to */
+ /* add a point to each border at their respective starting */
+ /* point locations. */
+ error = ft_stroker_subpath_start( stroker, angle, line_length );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* process the current corner */
+ stroker->angle_out = angle;
+ error = ft_stroker_process_corner( stroker, line_length );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now add a line segment to both the `inside' and `outside' paths */
+ for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )
+ {
+ FT_Vector point;
+
+
+ point.x = to->x + delta.x;
+ point.y = to->y + delta.y;
+
+ /* the ends of lineto borders are movable */
+ error = ft_stroke_border_lineto( border, &point, TRUE );
+ if ( error )
+ goto Exit;
+
+ delta.x = -delta.x;
+ delta.y = -delta.y;
+ }
+
+ stroker->angle_in = angle;
+ stroker->center = *to;
+ stroker->line_length = line_length;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_ConicTo( FT_Stroker stroker,
+ FT_Vector* control,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Vector bez_stack[34];
+ FT_Vector* arc;
+ FT_Vector* limit = bez_stack + 30;
+ FT_Bool first_arc = TRUE;
+
+
+ /* if all control points are coincident, this is a no-op; */
+ /* avoid creating a spurious corner */
+ if ( FT_IS_SMALL( stroker->center.x - control->x ) &&
+ FT_IS_SMALL( stroker->center.y - control->y ) &&
+ FT_IS_SMALL( control->x - to->x ) &&
+ FT_IS_SMALL( control->y - to->y ) )
+ {
+ stroker->center = *to;
+ goto Exit;
+ }
+
+ arc = bez_stack;
+ arc[0] = *to;
+ arc[1] = *control;
+ arc[2] = stroker->center;
+
+ while ( arc >= bez_stack )
+ {
+ FT_Angle angle_in, angle_out;
+
+
+ /* initialize with current direction */
+ angle_in = angle_out = stroker->angle_in;
+
+ if ( arc < limit &&
+ !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
+ {
+ if ( stroker->first_point )
+ stroker->angle_in = angle_in;
+
+ ft_conic_split( arc );
+ arc += 2;
+ continue;
+ }
+
+ if ( first_arc )
+ {
+ first_arc = FALSE;
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+ else
+ {
+ stroker->angle_out = angle_in;
+ error = ft_stroker_process_corner( stroker, 0 );
+ }
+ }
+ else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+ FT_SMALL_CONIC_THRESHOLD / 4 )
+ {
+ /* if the deviation from one arc to the next is too great, */
+ /* add a round corner */
+ stroker->center = arc[2];
+ stroker->angle_out = angle_in;
+ stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+ error = ft_stroker_process_corner( stroker, 0 );
+
+ /* reinstate line join style */
+ stroker->line_join = stroker->line_join_saved;
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* the arc's angle is small enough; we can add it directly to each */
+ /* border */
+ {
+ FT_Vector ctrl, end;
+ FT_Angle theta, phi, rotate, alpha0 = 0;
+ FT_Fixed length;
+ FT_StrokeBorder border;
+ FT_Int side;
+
+
+ theta = FT_Angle_Diff( angle_in, angle_out ) / 2;
+ phi = angle_in + theta;
+ length = FT_DivFix( stroker->radius, FT_Cos( theta ) );
+
+ /* compute direction of original arc */
+ if ( stroker->handle_wide_strokes )
+ alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );
+
+ for ( border = stroker->borders, side = 0;
+ side <= 1;
+ side++, border++ )
+ {
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ /* compute control point */
+ FT_Vector_From_Polar( &ctrl, length, phi + rotate );
+ ctrl.x += arc[1].x;
+ ctrl.y += arc[1].y;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+ end.x += arc[0].x;
+ end.y += arc[0].y;
+
+ if ( stroker->handle_wide_strokes )
+ {
+ FT_Vector start;
+ FT_Angle alpha1;
+
+
+ /* determine whether the border radius is greater than the */
+ /* radius of curvature of the original arc */
+ start = border->points[border->num_points - 1];
+
+ alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+ /* is the direction of the border arc opposite to */
+ /* that of the original arc? */
+ if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+ FT_ANGLE_PI / 2 )
+ {
+ FT_Angle beta, gamma;
+ FT_Vector bvec, delta;
+ FT_Fixed blen, sinA, sinB, alen;
+
+
+ /* use the sine rule to find the intersection point */
+ beta = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );
+ gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y );
+
+ bvec.x = end.x - start.x;
+ bvec.y = end.y - start.y;
+
+ blen = FT_Vector_Length( &bvec );
+
+ sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+ sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+ alen = FT_MulDiv( blen, sinA, sinB );
+
+ FT_Vector_From_Polar( &delta, alen, beta );
+ delta.x += start.x;
+ delta.y += start.y;
+
+ /* circumnavigate the negative sector backwards */
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_conicto( border, &ctrl, &start );
+ if ( error )
+ goto Exit;
+ /* and then move to the endpoint */
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+
+ continue;
+ }
+
+ /* else fall through */
+ }
+
+ /* simply add an arc */
+ error = ft_stroke_border_conicto( border, &ctrl, &end );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ arc -= 2;
+
+ stroker->angle_in = angle_out;
+ }
+
+ stroker->center = *to;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_CubicTo( FT_Stroker stroker,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Vector bez_stack[37];
+ FT_Vector* arc;
+ FT_Vector* limit = bez_stack + 32;
+ FT_Bool first_arc = TRUE;
+
+
+ /* if all control points are coincident, this is a no-op; */
+ /* avoid creating a spurious corner */
+ if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&
+ FT_IS_SMALL( stroker->center.y - control1->y ) &&
+ FT_IS_SMALL( control1->x - control2->x ) &&
+ FT_IS_SMALL( control1->y - control2->y ) &&
+ FT_IS_SMALL( control2->x - to->x ) &&
+ FT_IS_SMALL( control2->y - to->y ) )
+ {
+ stroker->center = *to;
+ goto Exit;
+ }
+
+ arc = bez_stack;
+ arc[0] = *to;
+ arc[1] = *control2;
+ arc[2] = *control1;
+ arc[3] = stroker->center;
+
+ while ( arc >= bez_stack )
+ {
+ FT_Angle angle_in, angle_mid, angle_out;
+
+
+ /* initialize with current direction */
+ angle_in = angle_out = angle_mid = stroker->angle_in;
+
+ if ( arc < limit &&
+ !ft_cubic_is_small_enough( arc, &angle_in,
+ &angle_mid, &angle_out ) )
+ {
+ if ( stroker->first_point )
+ stroker->angle_in = angle_in;
+
+ ft_cubic_split( arc );
+ arc += 3;
+ continue;
+ }
+
+ if ( first_arc )
+ {
+ first_arc = FALSE;
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+ else
+ {
+ stroker->angle_out = angle_in;
+ error = ft_stroker_process_corner( stroker, 0 );
+ }
+ }
+ else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+ FT_SMALL_CUBIC_THRESHOLD / 4 )
+ {
+ /* if the deviation from one arc to the next is too great, */
+ /* add a round corner */
+ stroker->center = arc[3];
+ stroker->angle_out = angle_in;
+ stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+ error = ft_stroker_process_corner( stroker, 0 );
+
+ /* reinstate line join style */
+ stroker->line_join = stroker->line_join_saved;
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* the arc's angle is small enough; we can add it directly to each */
+ /* border */
+ {
+ FT_Vector ctrl1, ctrl2, end;
+ FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0;
+ FT_Fixed length1, length2;
+ FT_StrokeBorder border;
+ FT_Int side;
+
+
+ theta1 = FT_Angle_Diff( angle_in, angle_mid ) / 2;
+ theta2 = FT_Angle_Diff( angle_mid, angle_out ) / 2;
+ phi1 = ft_angle_mean( angle_in, angle_mid );
+ phi2 = ft_angle_mean( angle_mid, angle_out );
+ length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );
+ length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );
+
+ /* compute direction of original arc */
+ if ( stroker->handle_wide_strokes )
+ alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );
+
+ for ( border = stroker->borders, side = 0;
+ side <= 1;
+ side++, border++ )
+ {
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ /* compute control points */
+ FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );
+ ctrl1.x += arc[2].x;
+ ctrl1.y += arc[2].y;
+
+ FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );
+ ctrl2.x += arc[1].x;
+ ctrl2.y += arc[1].y;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+ end.x += arc[0].x;
+ end.y += arc[0].y;
+
+ if ( stroker->handle_wide_strokes )
+ {
+ FT_Vector start;
+ FT_Angle alpha1;
+
+
+ /* determine whether the border radius is greater than the */
+ /* radius of curvature of the original arc */
+ start = border->points[border->num_points - 1];
+
+ alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+ /* is the direction of the border arc opposite to */
+ /* that of the original arc? */
+ if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+ FT_ANGLE_PI / 2 )
+ {
+ FT_Angle beta, gamma;
+ FT_Vector bvec, delta;
+ FT_Fixed blen, sinA, sinB, alen;
+
+
+ /* use the sine rule to find the intersection point */
+ beta = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );
+ gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y );
+
+ bvec.x = end.x - start.x;
+ bvec.y = end.y - start.y;
+
+ blen = FT_Vector_Length( &bvec );
+
+ sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+ sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+ alen = FT_MulDiv( blen, sinA, sinB );
+
+ FT_Vector_From_Polar( &delta, alen, beta );
+ delta.x += start.x;
+ delta.y += start.y;
+
+ /* circumnavigate the negative sector backwards */
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_cubicto( border,
+ &ctrl2,
+ &ctrl1,
+ &start );
+ if ( error )
+ goto Exit;
+ /* and then move to the endpoint */
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+
+ continue;
+ }
+
+ /* else fall through */
+ }
+
+ /* simply add an arc */
+ error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ arc -= 3;
+
+ stroker->angle_in = angle_out;
+ }
+
+ stroker->center = *to;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_BeginSubPath( FT_Stroker stroker,
+ FT_Vector* to,
+ FT_Bool open )
+ {
+ /* We cannot process the first point, because there is not enough */
+ /* information regarding its corner/cap. The latter will be processed */
+ /* in the `FT_Stroker_EndSubPath' routine. */
+ /* */
+ stroker->first_point = TRUE;
+ stroker->center = *to;
+ stroker->subpath_open = open;
+
+ /* Determine if we need to check whether the border radius is greater */
+ /* than the radius of curvature of a curve, to handle this case */
+ /* specially. This is only required if bevel joins or butt caps may */
+ /* be created, because round & miter joins and round & square caps */
+ /* cover the negative sector created with wide strokes. */
+ stroker->handle_wide_strokes =
+ FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND ||
+ ( stroker->subpath_open &&
+ stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );
+
+ /* record the subpath start point for each border */
+ stroker->subpath_start = *to;
+
+ stroker->angle_in = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ ft_stroker_add_reverse_left( FT_Stroker stroker,
+ FT_Bool open )
+ {
+ FT_StrokeBorder right = stroker->borders + 0;
+ FT_StrokeBorder left = stroker->borders + 1;
+ FT_Int new_points;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( left->start >= 0 );
+
+ new_points = left->num_points - left->start;
+ if ( new_points > 0 )
+ {
+ error = ft_stroke_border_grow( right, (FT_UInt)new_points );
+ if ( error )
+ goto Exit;
+
+ {
+ FT_Vector* dst_point = right->points + right->num_points;
+ FT_Byte* dst_tag = right->tags + right->num_points;
+ FT_Vector* src_point = left->points + left->num_points - 1;
+ FT_Byte* src_tag = left->tags + left->num_points - 1;
+
+
+ while ( src_point >= left->points + left->start )
+ {
+ *dst_point = *src_point;
+ *dst_tag = *src_tag;
+
+ if ( open )
+ dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;
+ else
+ {
+ FT_Byte ttag =
+ (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );
+
+
+ /* switch begin/end tags if necessary */
+ if ( ttag == FT_STROKE_TAG_BEGIN ||
+ ttag == FT_STROKE_TAG_END )
+ dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;
+ }
+
+ src_point--;
+ src_tag--;
+ dst_point++;
+ dst_tag++;
+ }
+ }
+
+ left->num_points = left->start;
+ right->num_points += new_points;
+
+ right->movable = FALSE;
+ left->movable = FALSE;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ /* there's a lot of magic in this function! */
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_EndSubPath( FT_Stroker stroker )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stroker->subpath_open )
+ {
+ FT_StrokeBorder right = stroker->borders;
+
+
+ /* All right, this is an opened path, we need to add a cap between */
+ /* right & left, add the reverse of left, then add a final cap */
+ /* between left & right. */
+ error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
+ if ( error )
+ goto Exit;
+
+ /* add reversed points from `left' to `right' */
+ error = ft_stroker_add_reverse_left( stroker, TRUE );
+ if ( error )
+ goto Exit;
+
+ /* now add the final cap */
+ stroker->center = stroker->subpath_start;
+ error = ft_stroker_cap( stroker,
+ stroker->subpath_angle + FT_ANGLE_PI, 0 );
+ if ( error )
+ goto Exit;
+
+ /* Now end the right subpath accordingly. The left one is */
+ /* rewind and doesn't need further processing. */
+ ft_stroke_border_close( right, FALSE );
+ }
+ else
+ {
+ FT_Angle turn;
+ FT_Int inside_side;
+
+
+ /* close the path if needed */
+ if ( stroker->center.x != stroker->subpath_start.x ||
+ stroker->center.y != stroker->subpath_start.y )
+ {
+ error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );
+ if ( error )
+ goto Exit;
+ }
+
+ /* process the corner */
+ stroker->angle_out = stroker->subpath_angle;
+ turn = FT_Angle_Diff( stroker->angle_in,
+ stroker->angle_out );
+
+ /* no specific corner processing is required if the turn is 0 */
+ if ( turn != 0 )
+ {
+ /* when we turn to the right, the inside side is 0 */
+ inside_side = 0;
+
+ /* otherwise, the inside side is 1 */
+ if ( turn < 0 )
+ inside_side = 1;
+
+ error = ft_stroker_inside( stroker,
+ inside_side,
+ stroker->subpath_line_length );
+ if ( error )
+ goto Exit;
+
+ /* process the outside side */
+ error = ft_stroker_outside( stroker,
+ 1 - inside_side,
+ stroker->subpath_line_length );
+ if ( error )
+ goto Exit;
+ }
+
+ /* then end our two subpaths */
+ ft_stroke_border_close( stroker->borders + 0, FALSE );
+ ft_stroke_border_close( stroker->borders + 1, TRUE );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_GetBorderCounts( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_UInt num_points = 0, num_contours = 0;
+ FT_Error error;
+
+
+ if ( !stroker || border > 1 )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ error = ft_stroke_border_get_counts( stroker->borders + border,
+ &num_points, &num_contours );
+ Exit:
+ if ( anum_points )
+ *anum_points = num_points;
+
+ if ( anum_contours )
+ *anum_contours = num_contours;
+
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_GetCounts( FT_Stroker stroker,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_UInt count1, count2, num_points = 0;
+ FT_UInt count3, count4, num_contours = 0;
+ FT_Error error;
+
+
+ error = ft_stroke_border_get_counts( stroker->borders + 0,
+ &count1, &count2 );
+ if ( error )
+ goto Exit;
+
+ error = ft_stroke_border_get_counts( stroker->borders + 1,
+ &count3, &count4 );
+ if ( error )
+ goto Exit;
+
+ num_points = count1 + count3;
+ num_contours = count2 + count4;
+
+ Exit:
+ *anum_points = num_points;
+ *anum_contours = num_contours;
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_ExportBorder( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_Outline* outline )
+ {
+ if ( border == FT_STROKER_BORDER_LEFT ||
+ border == FT_STROKER_BORDER_RIGHT )
+ {
+ FT_StrokeBorder sborder = & stroker->borders[border];
+
+
+ if ( sborder->valid )
+ ft_stroke_border_export( sborder, outline );
+ }
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Export( FT_Stroker stroker,
+ FT_Outline* outline )
+ {
+ FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );
+ FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ /*
+ * The following is very similar to FT_Outline_Decompose, except
+ * that we do support opened paths, and do not scale the outline.
+ */
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_ParseOutline( FT_Stroker stroker,
+ FT_Outline* outline,
+ FT_Bool opened )
+ {
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ FT_Error error;
+
+ FT_Int n; /* index of contour in outline */
+ FT_UInt first; /* index of first point in contour */
+ FT_Int tag; /* current point's state */
+
+
+ if ( !outline || !stroker )
+ return FT_THROW( Invalid_Argument );
+
+ FT_Stroker_Rewind( stroker );
+
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ FT_UInt last; /* index of last point in contour */
+
+
+ last = outline->contours[n];
+ limit = outline->points + last;
+
+ /* skip empty points; we don't stroke these */
+ if ( last <= first )
+ {
+ first = last + 1;
+ continue;
+ }
+
+ v_start = outline->points[first];
+ v_last = outline->points[last];
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* First point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+ }
+ point--;
+ tags--;
+ }
+
+ error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = point->x;
+ vec.y = point->y;
+
+ error = FT_Stroker_LineTo( stroker, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = point->x;
+ v_control.y = point->y;
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec = point[0];
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ error = FT_Stroker_ConicTo( stroker, &v_control, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1 = point[-2];
+ vec2 = point[-1];
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec = point[0];
+
+ error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );
+ goto Close;
+ }
+ }
+ }
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ /* don't try to end the path if no segments have been generated */
+ if ( !stroker->first_point )
+ {
+ error = FT_Stroker_EndSubPath( stroker );
+ if ( error )
+ goto Exit;
+ }
+
+ first = last + 1;
+ }
+
+ return FT_Err_Ok;
+
+ Exit:
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+
+ /* declare an extern to access `ft_outline_glyph_class' globally */
+ /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
+ /* macro to access it when FT_CONFIG_OPTION_PIC is defined */
+#ifndef FT_CONFIG_OPTION_PIC
+ extern const FT_Glyph_Class ft_outline_glyph_class;
+#endif
+#include "basepic.h"
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Stroke( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool destroy )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Glyph glyph = NULL;
+ FT_Library library = stroker->library;
+
+ FT_UNUSED( library );
+
+
+ if ( pglyph == NULL )
+ goto Exit;
+
+ glyph = *pglyph;
+ if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+ goto Exit;
+
+ {
+ FT_Glyph copy;
+
+
+ error = FT_Glyph_Copy( glyph, &copy );
+ if ( error )
+ goto Exit;
+
+ glyph = copy;
+ }
+
+ {
+ FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph;
+ FT_Outline* outline = &oglyph->outline;
+ FT_UInt num_points, num_contours;
+
+
+ error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+ if ( error )
+ goto Fail;
+
+ (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );
+
+ FT_Outline_Done( glyph->library, outline );
+
+ error = FT_Outline_New( glyph->library,
+ num_points, num_contours, outline );
+ if ( error )
+ goto Fail;
+
+ outline->n_points = 0;
+ outline->n_contours = 0;
+
+ FT_Stroker_Export( stroker, outline );
+ }
+
+ if ( destroy )
+ FT_Done_Glyph( *pglyph );
+
+ *pglyph = glyph;
+ goto Exit;
+
+ Fail:
+ FT_Done_Glyph( glyph );
+ glyph = NULL;
+
+ if ( !destroy )
+ *pglyph = NULL;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_StrokeBorder( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool inside,
+ FT_Bool destroy )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Glyph glyph = NULL;
+ FT_Library library = stroker->library;
+
+ FT_UNUSED( library );
+
+
+ if ( pglyph == NULL )
+ goto Exit;
+
+ glyph = *pglyph;
+ if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+ goto Exit;
+
+ {
+ FT_Glyph copy;
+
+
+ error = FT_Glyph_Copy( glyph, &copy );
+ if ( error )
+ goto Exit;
+
+ glyph = copy;
+ }
+
+ {
+ FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph;
+ FT_StrokerBorder border;
+ FT_Outline* outline = &oglyph->outline;
+ FT_UInt num_points, num_contours;
+
+
+ border = FT_Outline_GetOutsideBorder( outline );
+ if ( inside )
+ {
+ if ( border == FT_STROKER_BORDER_LEFT )
+ border = FT_STROKER_BORDER_RIGHT;
+ else
+ border = FT_STROKER_BORDER_LEFT;
+ }
+
+ error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+ if ( error )
+ goto Fail;
+
+ (void)FT_Stroker_GetBorderCounts( stroker, border,
+ &num_points, &num_contours );
+
+ FT_Outline_Done( glyph->library, outline );
+
+ error = FT_Outline_New( glyph->library,
+ num_points,
+ num_contours,
+ outline );
+ if ( error )
+ goto Fail;
+
+ outline->n_points = 0;
+ outline->n_contours = 0;
+
+ FT_Stroker_ExportBorder( stroker, border, outline );
+ }
+
+ if ( destroy )
+ FT_Done_Glyph( *pglyph );
+
+ *pglyph = glyph;
+ goto Exit;
+
+ Fail:
+ FT_Done_Glyph( glyph );
+ glyph = NULL;
+
+ if ( !destroy )
+ *pglyph = NULL;
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
new file mode 100644
index 0000000000..2142261bf3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
@@ -0,0 +1,153 @@
+/***************************************************************************/
+/* */
+/* ftsynth.c */
+/* */
+/* FreeType synthesizing code for emboldening and slanting (body). */
+/* */
+/* Copyright 2000-2006, 2010, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsynth.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_synth
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** EXPERIMENTAL OBLIQUING SUPPORT ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* documentation is in ftsynth.h */
+
+ FT_EXPORT_DEF( void )
+ FT_GlyphSlot_Oblique( FT_GlyphSlot slot )
+ {
+ FT_Matrix transform;
+ FT_Outline* outline = &slot->outline;
+
+
+ /* only oblique outline glyphs */
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+ return;
+
+ /* we don't touch the advance width */
+
+ /* For italic, simply apply a shear transform, with an angle */
+ /* of about 12 degrees. */
+
+ transform.xx = 0x10000L;
+ transform.yx = 0x00000L;
+
+ transform.xy = 0x0366AL;
+ transform.yy = 0x10000L;
+
+ FT_Outline_Transform( outline, &transform );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* documentation is in ftsynth.h */
+
+ FT_EXPORT_DEF( void )
+ FT_GlyphSlot_Embolden( FT_GlyphSlot slot )
+ {
+ FT_Library library = slot->library;
+ FT_Face face = slot->face;
+ FT_Error error;
+ FT_Pos xstr, ystr;
+
+
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
+ slot->format != FT_GLYPH_FORMAT_BITMAP )
+ return;
+
+ /* some reasonable strength */
+ xstr = FT_MulFix( face->units_per_EM,
+ face->size->metrics.y_scale ) / 24;
+ ystr = xstr;
+
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* ignore error */
+ (void)FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
+ }
+ else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
+ {
+ /* round to full pixels */
+ xstr &= ~63;
+ if ( xstr == 0 )
+ xstr = 1 << 6;
+ ystr &= ~63;
+
+ /*
+ * XXX: overflow check for 16-bit system, for compatibility
+ * with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+ * unfortunately, this function return no informations
+ * about the cause of error.
+ */
+ if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
+ {
+ FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
+ FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
+ return;
+ }
+ error = FT_GlyphSlot_Own_Bitmap( slot );
+ if ( error )
+ return;
+
+ error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
+ if ( error )
+ return;
+ }
+
+ if ( slot->advance.x )
+ slot->advance.x += xstr;
+
+ if ( slot->advance.y )
+ slot->advance.y += ystr;
+
+ slot->metrics.width += xstr;
+ slot->metrics.height += ystr;
+ slot->metrics.horiAdvance += xstr;
+ slot->metrics.vertAdvance += ystr;
+
+ /* XXX: 16-bit overflow case must be excluded before here */
+ if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+ slot->bitmap_top += (FT_Int)( ystr >> 6 );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
new file mode 100644
index 0000000000..aae71f7087
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
@@ -0,0 +1,492 @@
+/***************************************************************************/
+/* */
+/* fttrigon.c */
+/* */
+/* FreeType trigonometric functions (body). */
+/* */
+/* Copyright 2001-2005, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This is a fixed-point CORDIC implementation of trigonometric */
+ /* functions as well as transformations between Cartesian and polar */
+ /* coordinates. The angles are represented as 16.16 fixed-point values */
+ /* in degrees, i.e., the angular resolution is 2^-16 degrees. Note that */
+ /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a */
+ /* discrete Cartesian grid can have the same or better angular */
+ /* resolution. Therefore, to maintain this precision, some functions */
+ /* require an interim upscaling of the vectors, whereas others operate */
+ /* with 24-bit long vectors directly. */
+ /* */
+ /*************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+ /* the Cordic shrink factor 0.858785336480436 * 2^32 */
+#define FT_TRIG_SCALE 0xDBD95B16UL
+
+ /* the highest bit in overflow-safe vector components, */
+ /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */
+#define FT_TRIG_SAFE_MSB 29
+
+ /* this table was generated for FT_PI = 180L << 16, i.e. degrees */
+#define FT_TRIG_MAX_ITERS 23
+
+ static const FT_Fixed
+ ft_trig_arctan_table[] =
+ {
+ 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,
+ 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,
+ 57L, 29L, 14L, 7L, 4L, 2L, 1L
+ };
+
+
+#ifdef FT_LONG64
+
+ /* multiply a given value by the CORDIC shrink factor */
+ static FT_Fixed
+ ft_trig_downscale( FT_Fixed val )
+ {
+ FT_Fixed s;
+ FT_Int64 v;
+
+
+ s = val;
+ val = FT_ABS( val );
+
+ v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;
+ val = (FT_Fixed)( v >> 32 );
+
+ return ( s >= 0 ) ? val : -val;
+ }
+
+#else /* !FT_LONG64 */
+
+ /* multiply a given value by the CORDIC shrink factor */
+ static FT_Fixed
+ ft_trig_downscale( FT_Fixed val )
+ {
+ FT_Fixed s;
+ FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3;
+
+
+ s = val;
+ val = FT_ABS( val );
+
+ v1 = (FT_UInt32)val >> 16;
+ v2 = (FT_UInt32)( val & 0xFFFFL );
+
+ k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */
+ k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL ); /* constant */
+
+ hi = k1 * v1;
+ lo1 = k1 * v2 + k2 * v1; /* can't overflow */
+
+ lo2 = ( k2 * v2 ) >> 16;
+ lo3 = FT_MAX( lo1, lo2 );
+ lo1 += lo2;
+
+ hi += lo1 >> 16;
+ if ( lo1 < lo3 )
+ hi += (FT_UInt32)0x10000UL;
+
+ val = (FT_Fixed)hi;
+
+ return ( s >= 0 ) ? val : -val;
+ }
+
+#endif /* !FT_LONG64 */
+
+
+ static FT_Int
+ ft_trig_prenorm( FT_Vector* vec )
+ {
+ FT_Pos x, y;
+ FT_Int shift;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ shift = FT_MSB( FT_ABS( x ) | FT_ABS( y ) );
+
+ if ( shift <= FT_TRIG_SAFE_MSB )
+ {
+ shift = FT_TRIG_SAFE_MSB - shift;
+ vec->x = (FT_Pos)( (FT_ULong)x << shift );
+ vec->y = (FT_Pos)( (FT_ULong)y << shift );
+ }
+ else
+ {
+ shift -= FT_TRIG_SAFE_MSB;
+ vec->x = x >> shift;
+ vec->y = y >> shift;
+ shift = -shift;
+ }
+
+ return shift;
+ }
+
+
+ static void
+ ft_trig_pseudo_rotate( FT_Vector* vec,
+ FT_Angle theta )
+ {
+ FT_Int i;
+ FT_Fixed x, y, xtemp, b;
+ const FT_Fixed *arctanptr;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ /* Rotate inside [-PI/4,PI/4] sector */
+ while ( theta < -FT_ANGLE_PI4 )
+ {
+ xtemp = y;
+ y = -x;
+ x = xtemp;
+ theta += FT_ANGLE_PI2;
+ }
+
+ while ( theta > FT_ANGLE_PI4 )
+ {
+ xtemp = -y;
+ y = x;
+ x = xtemp;
+ theta -= FT_ANGLE_PI2;
+ }
+
+ arctanptr = ft_trig_arctan_table;
+
+ /* Pseudorotations, with right shifts */
+ for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+ {
+ if ( theta < 0 )
+ {
+ xtemp = x + ( ( y + b ) >> i );
+ y = y - ( ( x + b ) >> i );
+ x = xtemp;
+ theta += *arctanptr++;
+ }
+ else
+ {
+ xtemp = x - ( ( y + b ) >> i );
+ y = y + ( ( x + b ) >> i );
+ x = xtemp;
+ theta -= *arctanptr++;
+ }
+ }
+
+ vec->x = x;
+ vec->y = y;
+ }
+
+
+ static void
+ ft_trig_pseudo_polarize( FT_Vector* vec )
+ {
+ FT_Angle theta;
+ FT_Int i;
+ FT_Fixed x, y, xtemp, b;
+ const FT_Fixed *arctanptr;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ /* Get the vector into [-PI/4,PI/4] sector */
+ if ( y > x )
+ {
+ if ( y > -x )
+ {
+ theta = FT_ANGLE_PI2;
+ xtemp = y;
+ y = -x;
+ x = xtemp;
+ }
+ else
+ {
+ theta = y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;
+ x = -x;
+ y = -y;
+ }
+ }
+ else
+ {
+ if ( y < -x )
+ {
+ theta = -FT_ANGLE_PI2;
+ xtemp = -y;
+ y = x;
+ x = xtemp;
+ }
+ else
+ {
+ theta = 0;
+ }
+ }
+
+ arctanptr = ft_trig_arctan_table;
+
+ /* Pseudorotations, with right shifts */
+ for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+ {
+ if ( y > 0 )
+ {
+ xtemp = x + ( ( y + b ) >> i );
+ y = y - ( ( x + b ) >> i );
+ x = xtemp;
+ theta += *arctanptr++;
+ }
+ else
+ {
+ xtemp = x - ( ( y + b ) >> i );
+ y = y + ( ( x + b ) >> i );
+ x = xtemp;
+ theta -= *arctanptr++;
+ }
+ }
+
+ /* round theta */
+ if ( theta >= 0 )
+ theta = FT_PAD_ROUND( theta, 32 );
+ else
+ theta = -FT_PAD_ROUND( -theta, 32 );
+
+ vec->x = x;
+ vec->y = theta;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Cos( FT_Angle angle )
+ {
+ FT_Vector v;
+
+
+ v.x = FT_TRIG_SCALE >> 8;
+ v.y = 0;
+ ft_trig_pseudo_rotate( &v, angle );
+
+ return ( v.x + 0x80L ) >> 8;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Sin( FT_Angle angle )
+ {
+ return FT_Cos( FT_ANGLE_PI2 - angle );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Tan( FT_Angle angle )
+ {
+ FT_Vector v;
+
+
+ v.x = FT_TRIG_SCALE >> 8;
+ v.y = 0;
+ ft_trig_pseudo_rotate( &v, angle );
+
+ return FT_DivFix( v.y, v.x );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Angle )
+ FT_Atan2( FT_Fixed dx,
+ FT_Fixed dy )
+ {
+ FT_Vector v;
+
+
+ if ( dx == 0 && dy == 0 )
+ return 0;
+
+ v.x = dx;
+ v.y = dy;
+ ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ return v.y;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Unit( FT_Vector* vec,
+ FT_Angle angle )
+ {
+ vec->x = FT_TRIG_SCALE >> 8;
+ vec->y = 0;
+ ft_trig_pseudo_rotate( vec, angle );
+ vec->x = ( vec->x + 0x80L ) >> 8;
+ vec->y = ( vec->y + 0x80L ) >> 8;
+ }
+
+
+ /* these macros return 0 for positive numbers,
+ and -1 for negative ones */
+#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )
+#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )
+#define FT_SIGN_INT32( x ) ( (x) >> 31 )
+#define FT_SIGN_INT16( x ) ( (x) >> 15 )
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Rotate( FT_Vector* vec,
+ FT_Angle angle )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v.x = vec->x;
+ v.y = vec->y;
+
+ if ( angle && ( v.x != 0 || v.y != 0 ) )
+ {
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_rotate( &v, angle );
+ v.x = ft_trig_downscale( v.x );
+ v.y = ft_trig_downscale( v.y );
+
+ if ( shift > 0 )
+ {
+ FT_Int32 half = (FT_Int32)1L << ( shift - 1 );
+
+
+ vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;
+ vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;
+ }
+ else
+ {
+ shift = -shift;
+ vec->x = (FT_Pos)( (FT_ULong)v.x << shift );
+ vec->y = (FT_Pos)( (FT_ULong)v.y << shift );
+ }
+ }
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Vector_Length( FT_Vector* vec )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v = *vec;
+
+ /* handle trivial cases */
+ if ( v.x == 0 )
+ {
+ return FT_ABS( v.y );
+ }
+ else if ( v.y == 0 )
+ {
+ return FT_ABS( v.x );
+ }
+
+ /* general case */
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ v.x = ft_trig_downscale( v.x );
+
+ if ( shift > 0 )
+ return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;
+
+ return (FT_Fixed)( (FT_UInt32)v.x << -shift );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Polarize( FT_Vector* vec,
+ FT_Fixed *length,
+ FT_Angle *angle )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v = *vec;
+
+ if ( v.x == 0 && v.y == 0 )
+ return;
+
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ v.x = ft_trig_downscale( v.x );
+
+ *length = ( shift >= 0 ) ? ( v.x >> shift )
+ : (FT_Fixed)( (FT_UInt32)v.x << -shift );
+ *angle = v.y;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_From_Polar( FT_Vector* vec,
+ FT_Fixed length,
+ FT_Angle angle )
+ {
+ vec->x = length;
+ vec->y = 0;
+
+ FT_Vector_Rotate( vec, angle );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Angle )
+ FT_Angle_Diff( FT_Angle angle1,
+ FT_Angle angle2 )
+ {
+ FT_Angle delta = angle2 - angle1;
+
+
+ delta %= FT_ANGLE_2PI;
+ if ( delta < 0 )
+ delta += FT_ANGLE_2PI;
+
+ if ( delta > FT_ANGLE_PI )
+ delta -= FT_ANGLE_2PI;
+
+ return delta;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
new file mode 100644
index 0000000000..b7167b75b5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/* */
+/* fttype1.c */
+/* */
+/* FreeType utility file for PS names support (body). */
+/* */
+/* Copyright 2002-2004, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PS_Font_Info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_info )
+ error = service->ps_get_font_info( face, afont_info );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Has_PS_Glyph_Names( FT_Face face )
+ {
+ FT_Int result = 0;
+ FT_Service_PsInfo service = NULL;
+
+
+ if ( face )
+ {
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_has_glyph_names )
+ result = service->ps_has_glyph_names( face );
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PS_Font_Private( FT_Face face,
+ PS_PrivateRec* afont_private )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_private )
+ error = service->ps_get_font_private( face, afont_private );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_Get_PS_Font_Value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len )
+ {
+ FT_Int result = 0;
+ FT_Service_PsInfo service = NULL;
+
+
+ if ( face )
+ {
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_value )
+ result = service->ps_get_font_value( face, key, idx,
+ value, value_len );
+ }
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
new file mode 100644
index 0000000000..4c0b916fe1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
@@ -0,0 +1,548 @@
+/***************************************************************************/
+/* */
+/* ftutil.c */
+/* */
+/* FreeType utility file for memory and list management (body). */
+/* */
+/* Copyright 2002, 2004-2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftlist.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_memory
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** M E M O R Y M A N A G E M E N T *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_alloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer block = ft_mem_qalloc( memory, size, &error );
+
+ if ( !error && size > 0 )
+ FT_MEM_ZERO( block, size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qalloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Pointer block = NULL;
+
+
+ if ( size > 0 )
+ {
+ block = memory->alloc( memory, size );
+ if ( block == NULL )
+ error = FT_THROW( Out_Of_Memory );
+ }
+ else if ( size < 0 )
+ {
+ /* may help catch/prevent security issues */
+ error = FT_THROW( Invalid_Argument );
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_realloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ block = ft_mem_qrealloc( memory, item_size,
+ cur_count, new_count, block, &error );
+ if ( !error && new_count > cur_count )
+ FT_MEM_ZERO( (char*)block + cur_count * item_size,
+ ( new_count - cur_count ) * item_size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qrealloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ /* Note that we now accept `item_size == 0' as a valid parameter, in
+ * order to cover very weird cases where an ALLOC_MULT macro would be
+ * called.
+ */
+ if ( cur_count < 0 || new_count < 0 || item_size < 0 )
+ {
+ /* may help catch/prevent nasty security issues */
+ error = FT_THROW( Invalid_Argument );
+ }
+ else if ( new_count == 0 || item_size == 0 )
+ {
+ ft_mem_free( memory, block );
+ block = NULL;
+ }
+ else if ( new_count > FT_INT_MAX/item_size )
+ {
+ error = FT_THROW( Array_Too_Large );
+ }
+ else if ( cur_count == 0 )
+ {
+ FT_ASSERT( block == NULL );
+
+ block = ft_mem_alloc( memory, new_count*item_size, &error );
+ }
+ else
+ {
+ FT_Pointer block2;
+ FT_Long cur_size = cur_count*item_size;
+ FT_Long new_size = new_count*item_size;
+
+
+ block2 = memory->realloc( memory, cur_size, new_size, block );
+ if ( block2 == NULL )
+ error = FT_THROW( Out_Of_Memory );
+ else
+ block = block2;
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+ #ifdef _XYQ_MEM_DEBUG /** XYQ 2006-10-12 */
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_allocdebug( FT_Memory memory,
+ FT_Long size, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer block = ft_mem_qallocdebug( memory, size, file, line, &error );
+
+ if ( !error && size > 0 )
+ FT_MEM_ZERO( block, size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qallocdebug( FT_Memory memory,
+ FT_Long size, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Pointer block = NULL;
+
+
+ if ( size > 0 )
+ {
+ block = memory->allocdebug( memory, size, file, line );
+ if ( block == NULL )
+ error = FT_Err_Out_Of_Memory;
+ }
+ else if ( size < 0 )
+ {
+ /* may help catch/prevent security issues */
+ error = FT_Err_Invalid_Argument;
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_reallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+ block = ft_mem_qreallocdebug( memory, item_size,
+ cur_count, new_count, block, file, line, &error );
+ if ( !error && new_count > cur_count )
+ FT_MEM_ZERO( (char*)block + cur_count * item_size,
+ ( new_count - cur_count ) * item_size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qreallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( cur_count < 0 || new_count < 0 || item_size <= 0 )
+ {
+ /* may help catch/prevent nasty security issues */
+ error = FT_Err_Invalid_Argument;
+ }
+ else if ( new_count == 0 )
+ {
+ ft_mem_free( memory, block );
+ block = NULL;
+ }
+ else if ( new_count > FT_INT_MAX/item_size )
+ {
+ error = FT_Err_Array_Too_Large;
+ }
+ else if ( cur_count == 0 )
+ {
+ FT_ASSERT( block == NULL );
+
+ block = ft_mem_allocdebug( memory, new_count*item_size, file, line, &error );
+ }
+ else
+ {
+ FT_Pointer block2;
+ FT_Long cur_size = cur_count*item_size;
+ FT_Long new_size = new_count*item_size;
+
+
+ block2 = memory->realloc( memory, cur_size, new_size, block );
+ if ( block2 == NULL )
+ error = FT_Err_Out_Of_Memory;
+ else
+ block = block2;
+ }
+
+ *p_error = error;
+ return block;
+ }
+#endif
+ FT_BASE_DEF( void )
+ ft_mem_free( FT_Memory memory,
+ const void *P )
+ {
+ if ( P )
+ memory->free( memory, (void*)P );
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer p = ft_mem_qalloc( memory, size, &error );
+
+
+ if ( !error && address )
+ ft_memcpy( p, address, size );
+
+ *p_error = error;
+ return p;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error )
+ {
+ FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1
+ : 0;
+
+
+ return ft_mem_dup( memory, str, len, p_error );
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ ft_mem_strcpyn( char* dst,
+ const char* src,
+ FT_ULong size )
+ {
+ while ( size > 1 && *src != 0 )
+ {
+ *dst++ = *src++;
+ size--;
+ }
+
+ *dst = 0; /* always zero-terminate */
+
+ return *src != 0;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** D O U B L Y L I N K E D L I S T S *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_list
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( FT_ListNode )
+ FT_List_Find( FT_List list,
+ void* data )
+ {
+ FT_ListNode cur;
+
+
+ cur = list->head;
+ while ( cur )
+ {
+ if ( cur->data == data )
+ return cur;
+
+ cur = cur->next;
+ }
+
+ return (FT_ListNode)0;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Add( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before = list->tail;
+
+
+ node->next = 0;
+ node->prev = before;
+
+ if ( before )
+ before->next = node;
+ else
+ list->head = node;
+
+ list->tail = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Insert( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode after = list->head;
+
+
+ node->next = after;
+ node->prev = 0;
+
+ if ( !after )
+ list->tail = node;
+ else
+ after->prev = node;
+
+ list->head = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Remove( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before, after;
+
+
+ before = node->prev;
+ after = node->next;
+
+ if ( before )
+ before->next = after;
+ else
+ list->head = after;
+
+ if ( after )
+ after->prev = before;
+ else
+ list->tail = before;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Up( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before, after;
+
+
+ before = node->prev;
+ after = node->next;
+
+ /* check whether we are already on top of the list */
+ if ( !before )
+ return;
+
+ before->next = after;
+
+ if ( after )
+ after->prev = before;
+ else
+ list->tail = before;
+
+ node->prev = 0;
+ node->next = list->head;
+ list->head->prev = node;
+ list->head = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_List_Iterate( FT_List list,
+ FT_List_Iterator iterator,
+ void* user )
+ {
+ FT_ListNode cur = list->head;
+ FT_Error error = FT_Err_Ok;
+
+
+ while ( cur )
+ {
+ FT_ListNode next = cur->next;
+
+
+ error = iterator( cur, user );
+ if ( error )
+ break;
+
+ cur = next;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Finalize( FT_List list,
+ FT_List_Destructor destroy,
+ FT_Memory memory,
+ void* user )
+ {
+ FT_ListNode cur;
+
+
+ cur = list->head;
+ while ( cur )
+ {
+ FT_ListNode next = cur->next;
+ void* data = cur->data;
+
+
+ if ( destroy )
+ destroy( memory, data, user );
+
+ FT_FREE( cur );
+ cur = next;
+ }
+
+ list->head = 0;
+ list->tail = 0;
+ }
+
+
+ FT_BASE_DEF( FT_UInt32 )
+ ft_highpow2( FT_UInt32 value )
+ {
+ FT_UInt32 value2;
+
+
+ /*
+ * We simply clear the lowest bit in each iteration. When
+ * we reach 0, we know that the previous value was our result.
+ */
+ for ( ;; )
+ {
+ value2 = value & (value - 1); /* clear lowest bit */
+ if ( value2 == 0 )
+ break;
+
+ value = value2;
+ }
+ return value;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
new file mode 100644
index 0000000000..d5b81baf97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* ftwinfnt.c */
+/* */
+/* FreeType API for accessing Windows FNT specific info (body). */
+/* */
+/* Copyright 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftwinfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svwinfnt.h"
+
+
+ /* documentation is in ftwinfnt.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_WinFNT_Header( FT_Face face,
+ FT_WinFNT_HeaderRec *header )
+ {
+ FT_Service_WinFnt service;
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face != NULL )
+ {
+ FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );
+
+ if ( service != NULL )
+ {
+ error = service->get_header( face, header );
+ }
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
new file mode 100644
index 0000000000..229f29b559
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* ftxf86.c */
+/* */
+/* FreeType utility file for X11 support (body). */
+/* */
+/* Copyright 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftxf86.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+
+ /* documentation is in ftxf86.h */
+
+ FT_EXPORT_DEF( const char* )
+ FT_Get_X11_Font_Format( FT_Face face )
+ {
+ const char* result = NULL;
+
+
+ if ( face )
+ FT_FACE_FIND_SERVICE( face, result, XF86_NAME );
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
new file mode 100644
index 0000000000..239223a717
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
@@ -0,0 +1,44 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftbase.c */
+/* */
+/* Single object library component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ftpic.c"
+#include "basepic.c"
+#include "ftadvanc.c"
+#include "ftcalc.c"
+#include "ftdbgmem.c"
+#include "ftgloadr.c"
+#include "ftobjs.c"
+#include "ftoutln.c"
+#include "ftrfork.c"
+#include "ftsnames.c"
+#include "ftstream.c"
+#include "fttrigon.c"
+#include "ftutil.c"
+#include "ftxf86.c"
+
+#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON )
+/*#include "ftmac.c"*/
+#endif
+
+/* END */
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
new file mode 100644
index 0000000000..7f1ef189dc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
@@ -0,0 +1,760 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftbitmap.c */
+/* */
+/* FreeType utility functions for bitmaps (body). */
+/* */
+/* Copyright 2004-2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ static
+ const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Bitmap_New( FT_Bitmap *abitmap )
+ {
+ *abitmap = null_bitmap;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target)
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Int pitch = source->pitch;
+ FT_ULong size;
+
+
+ if ( source == target )
+ return FT_Err_Ok;
+
+ if ( source->buffer == NULL )
+ {
+ *target = *source;
+
+ return FT_Err_Ok;
+ }
+
+ if ( pitch < 0 )
+ pitch = -pitch;
+ size = (FT_ULong)( pitch * source->rows );
+
+ if ( target->buffer )
+ {
+ FT_Int target_pitch = target->pitch;
+ FT_ULong target_size;
+
+
+ if ( target_pitch < 0 )
+ target_pitch = -target_pitch;
+ target_size = (FT_ULong)( target_pitch * target->rows );
+
+ if ( target_size != size )
+ (void)FT_QREALLOC( target->buffer, target_size, size );
+ }
+ else
+ (void)FT_QALLOC( target->buffer, size );
+
+ if ( !error )
+ {
+ unsigned char *p;
+
+
+ p = target->buffer;
+ *target = *source;
+ target->buffer = p;
+
+ FT_MEM_COPY( target->buffer, source->buffer, size );
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_bitmap_assure_buffer( FT_Memory memory,
+ FT_Bitmap* bitmap,
+ FT_UInt xpixels,
+ FT_UInt ypixels )
+ {
+ FT_Error error;
+ int pitch;
+ int new_pitch;
+ FT_UInt bpp;
+ FT_Int i, width, height;
+ unsigned char* buffer = NULL;
+
+
+ width = bitmap->width;
+ height = bitmap->rows;
+ pitch = bitmap->pitch;
+ if ( pitch < 0 )
+ pitch = -pitch;
+
+ switch ( bitmap->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ bpp = 1;
+ new_pitch = ( width + xpixels + 7 ) >> 3;
+ break;
+ case FT_PIXEL_MODE_GRAY2:
+ bpp = 2;
+ new_pitch = ( width + xpixels + 3 ) >> 2;
+ break;
+ case FT_PIXEL_MODE_GRAY4:
+ bpp = 4;
+ new_pitch = ( width + xpixels + 1 ) >> 1;
+ break;
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ bpp = 8;
+ new_pitch = ( width + xpixels );
+ break;
+ default:
+ return FT_THROW( Invalid_Glyph_Format );
+ }
+
+ /* if no need to allocate memory */
+ if ( ypixels == 0 && new_pitch <= pitch )
+ {
+ /* zero the padding */
+ FT_Int bit_width = pitch * 8;
+ FT_Int bit_last = ( width + xpixels ) * bpp;
+
+
+ if ( bit_last < bit_width )
+ {
+ FT_Byte* line = bitmap->buffer + ( bit_last >> 3 );
+ FT_Byte* end = bitmap->buffer + pitch;
+ FT_Int shift = bit_last & 7;
+ FT_UInt mask = 0xFF00U >> shift;
+ FT_Int count = height;
+
+
+ for ( ; count > 0; count--, line += pitch, end += pitch )
+ {
+ FT_Byte* write = line;
+
+
+ if ( shift > 0 )
+ {
+ write[0] = (FT_Byte)( write[0] & mask );
+ write++;
+ }
+ if ( write < end )
+ FT_MEM_ZERO( write, end-write );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+ if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+ return error;
+
+ if ( bitmap->pitch > 0 )
+ {
+ FT_Int len = ( width * bpp + 7 ) >> 3;
+
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),
+ bitmap->buffer + pitch * i, len );
+ }
+ else
+ {
+ FT_Int len = ( width * bpp + 7 ) >> 3;
+
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ FT_MEM_COPY( buffer + new_pitch * i,
+ bitmap->buffer + pitch * i, len );
+ }
+
+ FT_FREE( bitmap->buffer );
+ bitmap->buffer = buffer;
+
+ if ( bitmap->pitch < 0 )
+ new_pitch = -new_pitch;
+
+ /* set pitch only, width and height are left untouched */
+ bitmap->pitch = new_pitch;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Embolden( FT_Library library,
+ FT_Bitmap* bitmap,
+ FT_Pos xStrength,
+ FT_Pos yStrength )
+ {
+ FT_Error error;
+ unsigned char* p;
+ FT_Int i, x, y, pitch;
+ FT_Int xstr, ystr;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !bitmap || !bitmap->buffer )
+ return FT_THROW( Invalid_Argument );
+
+ if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||
+ ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )
+ return FT_THROW( Invalid_Argument );
+
+ xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;
+ ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;
+
+ if ( xstr == 0 && ystr == 0 )
+ return FT_Err_Ok;
+ else if ( xstr < 0 || ystr < 0 )
+ return FT_THROW( Invalid_Argument );
+
+ switch ( bitmap->pixel_mode )
+ {
+ case FT_PIXEL_MODE_GRAY2:
+ case FT_PIXEL_MODE_GRAY4:
+ {
+ FT_Bitmap tmp;
+ FT_Int align;
+
+
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )
+ align = ( bitmap->width + xstr + 3 ) / 4;
+ else
+ align = ( bitmap->width + xstr + 1 ) / 2;
+
+ FT_Bitmap_New( &tmp );
+
+ error = FT_Bitmap_Convert( library, bitmap, &tmp, align );
+ if ( error )
+ return error;
+
+ FT_Bitmap_Done( library, bitmap );
+ *bitmap = tmp;
+ }
+ break;
+
+ case FT_PIXEL_MODE_MONO:
+ if ( xstr > 8 )
+ xstr = 8;
+ break;
+
+ case FT_PIXEL_MODE_LCD:
+ xstr *= 3;
+ break;
+
+ case FT_PIXEL_MODE_LCD_V:
+ ystr *= 3;
+ break;
+
+ case FT_PIXEL_MODE_BGRA:
+ /* We don't embolden color glyphs. */
+ return FT_Err_Ok;
+ }
+
+ error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );
+ if ( error )
+ return error;
+
+ pitch = bitmap->pitch;
+ if ( pitch > 0 )
+ p = bitmap->buffer + pitch * ystr;
+ else
+ {
+ pitch = -pitch;
+ p = bitmap->buffer + pitch * ( bitmap->rows - 1 );
+ }
+
+ /* for each row */
+ for ( y = 0; y < bitmap->rows ; y++ )
+ {
+ /*
+ * Horizontally:
+ *
+ * From the last pixel on, make each pixel or'ed with the
+ * `xstr' pixels before it.
+ */
+ for ( x = pitch - 1; x >= 0; x-- )
+ {
+ unsigned char tmp;
+
+
+ tmp = p[x];
+ for ( i = 1; i <= xstr; i++ )
+ {
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )
+ {
+ p[x] |= tmp >> i;
+
+ /* the maximum value of 8 for `xstr' comes from here */
+ if ( x > 0 )
+ p[x] |= p[x - 1] << ( 8 - i );
+
+#if 0
+ if ( p[x] == 0xff )
+ break;
+#endif
+ }
+ else
+ {
+ if ( x - i >= 0 )
+ {
+ if ( p[x] + p[x - i] > bitmap->num_grays - 1 )
+ {
+ p[x] = (unsigned char)(bitmap->num_grays - 1);
+ break;
+ }
+ else
+ {
+ p[x] = (unsigned char)(p[x] + p[x-i]);
+ if ( p[x] == bitmap->num_grays - 1 )
+ break;
+ }
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ /*
+ * Vertically:
+ *
+ * Make the above `ystr' rows or'ed with it.
+ */
+ for ( x = 1; x <= ystr; x++ )
+ {
+ unsigned char* q;
+
+
+ q = p - bitmap->pitch * x;
+ for ( i = 0; i < pitch; i++ )
+ q[i] |= p[i];
+ }
+
+ p += bitmap->pitch;
+ }
+
+ bitmap->width += xstr;
+ bitmap->rows += ystr;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_Byte
+ ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra )
+ {
+ FT_Long a = bgra[3];
+ FT_Long b = bgra[0];
+ FT_Long g = bgra[1];
+ FT_Long r = bgra[2];
+ FT_Long l;
+
+
+ /*
+ * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722
+ * coefficients for RGB channels *on the linear colors*.
+ * A gamma of 2.2 is fair to assume. And then, we need to
+ * undo the premultiplication too.
+ *
+ * http://accessibility.kde.org/hsl-adjusted.php
+ *
+ * We do the computation with integers only.
+ */
+
+ /* Undo premultification, get the number in a 16.16 form. */
+ b = FT_MulDiv( b, 65536, a );
+ g = FT_MulDiv( g, 65536, a );
+ r = FT_MulDiv( r, 65536, a );
+ a = a * 256;
+
+ /* Apply gamma of 2.0 instead of 2.2. */
+ b = FT_MulFix( b, b );
+ g = FT_MulFix( g, g );
+ r = FT_MulFix( r, r );
+
+ /* Apply coefficients. */
+ b = FT_MulFix( b, 4731 /* 0.0722 * 65536 */ );
+ g = FT_MulFix( g, 46871 /* 0.7152 * 65536 */ );
+ r = FT_MulFix( r, 13933 /* 0.2126 * 65536 */ );
+
+ l = r + g + b;
+
+ /*
+ * Final transparency can be determined this way:
+ *
+ * - If alpha is zero, we want 0.
+ * - If alpha is zero and luminosity is zero, we want 255.
+ * - If alpha is zero and luminosity is one, we want 0.
+ *
+ * So the formula is a * (1 - l).
+ */
+
+ return (FT_Byte)( FT_MulFix( 65535 - l, a ) >> 8 );
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Convert( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target,
+ FT_Int alignment )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ memory = library->memory;
+
+ switch ( source->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_GRAY2:
+ case FT_PIXEL_MODE_GRAY4:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ case FT_PIXEL_MODE_BGRA:
+ {
+ FT_Int pad;
+ FT_Long old_size;
+
+
+ old_size = target->rows * target->pitch;
+ if ( old_size < 0 )
+ old_size = -old_size;
+
+ target->pixel_mode = FT_PIXEL_MODE_GRAY;
+ target->rows = source->rows;
+ target->width = source->width;
+
+ pad = 0;
+ if ( alignment > 0 )
+ {
+ pad = source->width % alignment;
+ if ( pad != 0 )
+ pad = alignment - pad;
+ }
+
+ target->pitch = source->width + pad;
+
+ if ( target->pitch > 0 &&
+ (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )
+ return FT_THROW( Invalid_Argument );
+
+ if ( target->rows * target->pitch > old_size &&
+ FT_QREALLOC( target->buffer,
+ old_size, target->rows * target->pitch ) )
+ return error;
+ }
+ break;
+
+ default:
+ error = FT_THROW( Invalid_Argument );
+ }
+
+ switch ( source->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 2;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 3; j > 0; j-- )
+ {
+ FT_Int val = ss[0]; /* avoid a byte->int cast on each line */
+
+
+ tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
+ tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
+ tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
+ tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
+ tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
+ tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
+ tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
+ tt[7] = (FT_Byte)( val & 0x01 );
+
+ tt += 8;
+ ss += 1;
+ }
+
+ /* get remaining pixels (if any) */
+ j = source->width & 7;
+ if ( j > 0 )
+ {
+ FT_Int val = *ss;
+
+
+ for ( ; j > 0; j-- )
+ {
+ tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
+ val <<= 1;
+ tt += 1;
+ }
+ }
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ {
+ FT_Int width = source->width;
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int s_pitch = source->pitch;
+ FT_Int t_pitch = target->pitch;
+ FT_Int i;
+
+
+ target->num_grays = 256;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_ARRAY_COPY( t, s, width );
+
+ s += s_pitch;
+ t += t_pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY2:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 4;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 2; j > 0; j-- )
+ {
+ FT_Int val = ss[0];
+
+
+ tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+ tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );
+ tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );
+ tt[3] = (FT_Byte)( ( val & 0x03 ) );
+
+ ss += 1;
+ tt += 4;
+ }
+
+ j = source->width & 3;
+ if ( j > 0 )
+ {
+ FT_Int val = ss[0];
+
+
+ for ( ; j > 0; j-- )
+ {
+ tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+ val <<= 2;
+ tt += 1;
+ }
+ }
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY4:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 16;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 1; j > 0; j-- )
+ {
+ FT_Int val = ss[0];
+
+
+ tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );
+ tt[1] = (FT_Byte)( ( val & 0x0F ) );
+
+ ss += 1;
+ tt += 2;
+ }
+
+ if ( source->width & 1 )
+ tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+ case FT_PIXEL_MODE_BGRA:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int s_pitch = source->pitch;
+ FT_Int t_pitch = target->pitch;
+ FT_Int i;
+
+
+ target->num_grays = 256;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ for ( j = source->width; j > 0; j-- )
+ {
+ tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss );
+
+ ss += 4;
+ tt += 1;
+ }
+
+ s += s_pitch;
+ t += t_pitch;
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot )
+ {
+ if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP &&
+ !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+ {
+ FT_Bitmap bitmap;
+ FT_Error error;
+
+
+ FT_Bitmap_New( &bitmap );
+ error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
+ if ( error )
+ return error;
+
+ slot->bitmap = bitmap;
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Done( FT_Library library,
+ FT_Bitmap *bitmap )
+ {
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !bitmap )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ FT_FREE( bitmap->buffer );
+ *bitmap = null_bitmap;
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
new file mode 100644
index 0000000000..9ed83d21eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
@@ -0,0 +1,631 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftglyph.c */
+/* */
+/* FreeType convenience functions to handle glyphs (body). */
+/* */
+/* Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of several convenience functions */
+ /* that can be used by client applications to easily retrieve glyph */
+ /* bitmaps and outlines from a given face. */
+ /* */
+ /* These functions should be optional if you are writing a font server */
+ /* or text layout engine on top of FreeType. However, they are pretty */
+ /* handy for many other simple uses of the library. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "basepic.h"
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_glyph
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_BitmapGlyph support ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_bitmap_glyph_init( FT_Glyph bitmap_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = FT_GLYPH( glyph )->library;
+
+
+ if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ glyph->left = slot->bitmap_left;
+ glyph->top = slot->bitmap_top;
+
+ /* do lazy copying whenever possible */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ glyph->bitmap = slot->bitmap;
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+ else
+ {
+ FT_Bitmap_New( &glyph->bitmap );
+ error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_bitmap_glyph_copy( FT_Glyph bitmap_source,
+ FT_Glyph bitmap_target )
+ {
+ FT_Library library = bitmap_source->library;
+ FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source;
+ FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target;
+
+
+ target->left = source->left;
+ target->top = source->top;
+
+ return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_bitmap_glyph_done( FT_Glyph bitmap_glyph )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+ FT_Library library = FT_GLYPH( glyph )->library;
+
+
+ FT_Bitmap_Done( library, &glyph->bitmap );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph,
+ FT_BBox* cbox )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+
+
+ cbox->xMin = glyph->left << 6;
+ cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );
+ cbox->yMax = glyph->top << 6;
+ cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );
+ }
+
+
+ FT_DEFINE_GLYPH(ft_bitmap_glyph_class,
+ sizeof ( FT_BitmapGlyphRec ),
+ FT_GLYPH_FORMAT_BITMAP,
+
+ ft_bitmap_glyph_init,
+ ft_bitmap_glyph_done,
+ ft_bitmap_glyph_copy,
+ 0, /* FT_Glyph_TransformFunc */
+ ft_bitmap_glyph_bbox,
+ 0 /* FT_Glyph_PrepareFunc */
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_OutlineGlyph support ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_init( FT_Glyph outline_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = FT_GLYPH( glyph )->library;
+ FT_Outline* source = &slot->outline;
+ FT_Outline* target = &glyph->outline;
+
+
+ /* check format in glyph slot */
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ /* allocate new outline */
+ error = FT_Outline_New( library, source->n_points, source->n_contours,
+ &glyph->outline );
+ if ( error )
+ goto Exit;
+
+ FT_Outline_Copy( source, target );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_done( FT_Glyph outline_glyph )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_copy( FT_Glyph outline_source,
+ FT_Glyph outline_target )
+ {
+ FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source;
+ FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target;
+ FT_Error error;
+ FT_Library library = FT_GLYPH( source )->library;
+
+
+ error = FT_Outline_New( library, source->outline.n_points,
+ source->outline.n_contours, &target->outline );
+ if ( !error )
+ FT_Outline_Copy( &source->outline, &target->outline );
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_transform( FT_Glyph outline_glyph,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ if ( matrix )
+ FT_Outline_Transform( &glyph->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &glyph->outline, delta->x, delta->y );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_bbox( FT_Glyph outline_glyph,
+ FT_BBox* bbox )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ FT_Outline_Get_CBox( &glyph->outline, bbox );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_prepare( FT_Glyph outline_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ slot->format = FT_GLYPH_FORMAT_OUTLINE;
+ slot->outline = glyph->outline;
+ slot->outline.flags &= ~FT_OUTLINE_OWNER;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_GLYPH( ft_outline_glyph_class,
+ sizeof ( FT_OutlineGlyphRec ),
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ ft_outline_glyph_init,
+ ft_outline_glyph_done,
+ ft_outline_glyph_copy,
+ ft_outline_glyph_transform,
+ ft_outline_glyph_bbox,
+ ft_outline_glyph_prepare
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_Glyph class and API ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ ft_new_glyph( FT_Library library,
+ const FT_Glyph_Class* clazz,
+ FT_Glyph* aglyph )
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_Glyph glyph = NULL;
+
+
+ *aglyph = 0;
+
+ if ( !FT_ALLOC( glyph, clazz->glyph_size ) )
+ {
+ glyph->library = library;
+ glyph->clazz = clazz;
+ glyph->format = clazz->glyph_format;
+
+ *aglyph = glyph;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Copy( FT_Glyph source,
+ FT_Glyph *target )
+ {
+ FT_Glyph copy;
+ FT_Error error;
+ const FT_Glyph_Class* clazz;
+
+
+ /* check arguments */
+ if ( !target )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ *target = 0;
+
+ if ( !source || !source->clazz )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ clazz = source->clazz;
+ error = ft_new_glyph( source->library, clazz, &copy );
+ if ( error )
+ goto Exit;
+
+ copy->advance = source->advance;
+ copy->format = source->format;
+
+ if ( clazz->glyph_copy )
+ error = clazz->glyph_copy( source, copy );
+
+ if ( error )
+ FT_Done_Glyph( copy );
+ else
+ *target = copy;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Glyph( FT_GlyphSlot slot,
+ FT_Glyph *aglyph )
+ {
+ FT_Library library;
+ FT_Error error;
+ FT_Glyph glyph;
+
+ const FT_Glyph_Class* clazz = 0;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ library = slot->library;
+
+ if ( !aglyph )
+ return FT_THROW( Invalid_Argument );
+
+ /* if it is a bitmap, that's easy :-) */
+ if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+ clazz = FT_BITMAP_GLYPH_CLASS_GET;
+
+ /* if it is an outline */
+ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ clazz = FT_OUTLINE_GLYPH_CLASS_GET;
+
+ else
+ {
+ /* try to find a renderer that supports the glyph image format */
+ FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 );
+
+
+ if ( render )
+ clazz = &render->glyph_class;
+ }
+
+ if ( !clazz )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ /* create FT_Glyph object */
+ error = ft_new_glyph( library, clazz, &glyph );
+ if ( error )
+ goto Exit;
+
+ /* copy advance while converting it to 16.16 format */
+ glyph->advance.x = slot->advance.x << 10;
+ glyph->advance.y = slot->advance.y << 10;
+
+ /* now import the image from the glyph slot */
+ error = clazz->glyph_init( glyph, slot );
+
+ /* if an error occurred, destroy the glyph */
+ if ( error )
+ FT_Done_Glyph( glyph );
+ else
+ *aglyph = glyph;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Transform( FT_Glyph glyph,
+ FT_Matrix* matrix,
+ FT_Vector* delta )
+ {
+ const FT_Glyph_Class* clazz;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !glyph || !glyph->clazz )
+ error = FT_THROW( Invalid_Argument );
+ else
+ {
+ clazz = glyph->clazz;
+ if ( clazz->glyph_transform )
+ {
+ /* transform glyph image */
+ clazz->glyph_transform( glyph, matrix, delta );
+
+ /* transform advance vector */
+ if ( matrix )
+ FT_Vector_Transform( &glyph->advance, matrix );
+ }
+ else
+ error = FT_THROW( Invalid_Glyph_Format );
+ }
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Glyph_Get_CBox( FT_Glyph glyph,
+ FT_UInt bbox_mode,
+ FT_BBox *acbox )
+ {
+ const FT_Glyph_Class* clazz;
+
+
+ if ( !acbox )
+ return;
+
+ acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;
+
+ if ( !glyph || !glyph->clazz )
+ return;
+ else
+ {
+ clazz = glyph->clazz;
+ if ( !clazz->glyph_bbox )
+ return;
+ else
+ {
+ /* retrieve bbox in 26.6 coordinates */
+ clazz->glyph_bbox( glyph, acbox );
+
+ /* perform grid fitting if needed */
+ if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||
+ bbox_mode == FT_GLYPH_BBOX_PIXELS )
+ {
+ acbox->xMin = FT_PIX_FLOOR( acbox->xMin );
+ acbox->yMin = FT_PIX_FLOOR( acbox->yMin );
+ acbox->xMax = FT_PIX_CEIL( acbox->xMax );
+ acbox->yMax = FT_PIX_CEIL( acbox->yMax );
+ }
+
+ /* convert to integer pixels if needed */
+ if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||
+ bbox_mode == FT_GLYPH_BBOX_PIXELS )
+ {
+ acbox->xMin >>= 6;
+ acbox->yMin >>= 6;
+ acbox->xMax >>= 6;
+ acbox->yMax >>= 6;
+ }
+ }
+ }
+ return;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_To_Bitmap( FT_Glyph* the_glyph,
+ FT_Render_Mode render_mode,
+ FT_Vector* origin,
+ FT_Bool destroy )
+ {
+ FT_GlyphSlotRec dummy;
+ FT_GlyphSlot_InternalRec dummy_internal;
+ FT_Error error = FT_Err_Ok;
+ FT_Glyph b, glyph;
+ FT_BitmapGlyph bitmap = NULL;
+ const FT_Glyph_Class* clazz;
+
+ /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */
+ FT_Library library;
+
+
+ /* check argument */
+ if ( !the_glyph )
+ goto Bad;
+ glyph = *the_glyph;
+ if ( !glyph )
+ goto Bad;
+
+ clazz = glyph->clazz;
+ library = glyph->library;
+ if ( !library || !clazz )
+ goto Bad;
+
+ /* when called with a bitmap glyph, do nothing and return successfully */
+ if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )
+ goto Exit;
+
+ if ( !clazz->glyph_prepare )
+ goto Bad;
+
+ /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
+ /* then calling FT_Render_Glyph_Internal() */
+
+ FT_MEM_ZERO( &dummy, sizeof ( dummy ) );
+ FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );
+ dummy.internal = &dummy_internal;
+ dummy.library = library;
+ dummy.format = clazz->glyph_format;
+
+ /* create result bitmap glyph */
+ error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );
+ if ( error )
+ goto Exit;
+ bitmap = (FT_BitmapGlyph)b;
+
+#if 1
+ /* if `origin' is set, translate the glyph image */
+ if ( origin )
+ FT_Glyph_Transform( glyph, 0, origin );
+#else
+ FT_UNUSED( origin );
+#endif
+
+ /* prepare dummy slot for rendering */
+ error = clazz->glyph_prepare( glyph, &dummy );
+ if ( !error )
+ error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );
+
+#if 1
+ if ( !destroy && origin )
+ {
+ FT_Vector v;
+
+
+ v.x = -origin->x;
+ v.y = -origin->y;
+ FT_Glyph_Transform( glyph, 0, &v );
+ }
+#endif
+
+ if ( error )
+ goto Exit;
+
+ /* in case of success, copy the bitmap to the glyph bitmap */
+ error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );
+ if ( error )
+ goto Exit;
+
+ /* copy advance */
+ bitmap->root.advance = glyph->advance;
+
+ if ( destroy )
+ FT_Done_Glyph( glyph );
+
+ *the_glyph = FT_GLYPH( bitmap );
+
+ Exit:
+ if ( error && bitmap )
+ FT_Done_Glyph( FT_GLYPH( bitmap ) );
+
+ return error;
+
+ Bad:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Done_Glyph( FT_Glyph glyph )
+ {
+ if ( glyph )
+ {
+ FT_Memory memory = glyph->library->memory;
+ const FT_Glyph_Class* clazz = glyph->clazz;
+
+
+ if ( clazz->glyph_done )
+ clazz->glyph_done( glyph );
+
+ FT_FREE( glyph );
+ }
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
new file mode 100644
index 0000000000..c7bf1f9537
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
@@ -0,0 +1,285 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftinit.c */
+/* */
+/* FreeType initialization layer (body). */
+/* */
+/* Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The purpose of this file is to implement the following two */
+ /* functions: */
+ /* */
+ /* FT_Add_Default_Modules(): */
+ /* This function is used to add the set of default modules to a */
+ /* fresh new library object. The set is taken from the header file */
+ /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */
+ /* Build System' for more information. */
+ /* */
+ /* FT_Init_FreeType(): */
+ /* This function creates a system object for the current platform, */
+ /* builds a library out of it, then calls FT_Default_Drivers(). */
+ /* */
+ /* Note that even if FT_Init_FreeType() uses the implementation of the */
+ /* system object defined at build time, client applications are still */
+ /* able to provide their own `ftsystem.c'. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmodapi.h"
+#include "basepic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_init
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef FT_USE_MODULE
+#ifdef __cplusplus
+#define FT_USE_MODULE( type, x ) extern "C" const type x;
+#else
+#define FT_USE_MODULE( type, x ) extern const type x;
+#endif
+
+#include "../../include/freetype/config/ftmodule.h"
+
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x),
+
+ static
+ const FT_Module_Class* const ft_default_modules[] =
+ {
+#include "../../include/freetype/config/ftmodule.h"
+ 0
+ };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+#ifdef __cplusplus
+#define FT_EXTERNC extern "C"
+#else
+#define FT_EXTERNC extern
+#endif
+
+ /* declare the module's class creation/destruction functions */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ FT_EXTERNC FT_Error \
+ FT_Create_Class_ ## x( FT_Library library, \
+ FT_Module_Class* *output_class ); \
+ FT_EXTERNC void \
+ FT_Destroy_Class_ ## x( FT_Library library, \
+ FT_Module_Class* clazz );
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ /* count all module classes */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) MODULE_CLASS_ ## x,
+
+ enum
+ {
+#include "../../include/freetype/config/ftmodule.h"
+ FT_NUM_MODULE_CLASSES
+ };
+
+ /* destroy all module classes */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ if ( classes[i] ) \
+ { \
+ FT_Destroy_Class_ ## x( library, classes[i] ); \
+ } \
+ i++;
+
+
+ FT_BASE_DEF( void )
+ ft_destroy_default_module_classes( FT_Library library )
+ {
+ FT_Module_Class* *classes;
+ FT_Memory memory;
+ FT_UInt i;
+ BasePIC* pic_container = (BasePIC*)library->pic_container.base;
+
+
+ if ( !pic_container->default_module_classes )
+ return;
+
+ memory = library->memory;
+ classes = pic_container->default_module_classes;
+ i = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ FT_FREE( classes );
+ pic_container->default_module_classes = 0;
+ }
+
+
+ /* initialize all module classes and the pointer table */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ error = FT_Create_Class_ ## x( library, &clazz ); \
+ if ( error ) \
+ goto Exit; \
+ classes[i++] = clazz;
+
+
+ FT_BASE_DEF( FT_Error )
+ ft_create_default_module_classes( FT_Library library )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Module_Class* *classes = NULL;
+ FT_Module_Class* clazz;
+ FT_UInt i;
+ BasePIC* pic_container = (BasePIC*)library->pic_container.base;
+
+
+ memory = library->memory;
+
+ pic_container->default_module_classes = 0;
+
+ if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
+ ( FT_NUM_MODULE_CLASSES + 1 ) ) )
+ return error;
+
+ /* initialize all pointers to 0, especially the last one */
+ for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
+ classes[i] = 0;
+ classes[FT_NUM_MODULE_CLASSES] = 0;
+
+ i = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ Exit:
+ if ( error )
+ ft_destroy_default_module_classes( library );
+ else
+ pic_container->default_module_classes = classes;
+
+ return error;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Add_Default_Modules( FT_Library library )
+ {
+ FT_Error error;
+ const FT_Module_Class* const* cur;
+
+
+ /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !library )
+ return;
+#endif
+
+ /* GCC 4.6 warns the type difference:
+ * FT_Module_Class** != const FT_Module_Class* const*
+ */
+ cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
+
+ /* test for valid `library' delayed to FT_Add_Module() */
+ while ( *cur )
+ {
+ error = FT_Add_Module( library, *cur );
+ /* notify errors, but don't stop */
+ if ( error )
+ FT_TRACE0(( "FT_Add_Default_Module:"
+ " Cannot install `%s', error = 0x%x\n",
+ (*cur)->module_name, error ));
+ cur++;
+ }
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Init_FreeType( FT_Library *alibrary )
+ {
+ FT_Error error;
+ FT_Memory memory;
+
+
+ /* First of all, allocate a new system object -- this function is part */
+ /* of the system-specific component, i.e. `ftsystem.c'. */
+
+ memory = FT_New_Memory();
+ if ( !memory )
+ {
+ FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ /* build a library out of it, then fill it with the set of */
+ /* default drivers. */
+
+ error = FT_New_Library( memory, alibrary );
+ if ( error )
+ FT_Done_Memory( memory );
+ else
+ FT_Add_Default_Modules( *alibrary );
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_FreeType( FT_Library library )
+ {
+ if ( library )
+ {
+ FT_Memory memory = library->memory;
+
+
+ /* Discard the library object */
+ FT_Done_Library( library );
+
+ /* discard memory manager */
+ FT_Done_Memory( memory );
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
new file mode 100644
index 0000000000..66676de916
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
@@ -0,0 +1,381 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftlcdfil.c */
+/* */
+/* FreeType API for color filtering of subpixel bitmap glyphs (body). */
+/* */
+/* Copyright 2006, 2008-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftlcdfil.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+/* define USE_LEGACY to implement the legacy filter */
+#define USE_LEGACY
+
+ /* FIR filter used by the default and light filters */
+ static void
+ _ft_lcd_filter_fir( FT_Bitmap* bitmap,
+ FT_Render_Mode mode,
+ FT_Library library )
+ {
+ FT_Byte* weights = library->lcd_weights;
+ FT_UInt width = (FT_UInt)bitmap->width;
+ FT_UInt height = (FT_UInt)bitmap->rows;
+
+
+ /* horizontal in-place FIR filter */
+ if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+ {
+ FT_Byte* line = bitmap->buffer;
+
+
+ for ( ; height > 0; height--, line += bitmap->pitch )
+ {
+ FT_UInt fir[5];
+ FT_UInt val1, xx;
+
+
+ val1 = line[0];
+ fir[0] = weights[2] * val1;
+ fir[1] = weights[3] * val1;
+ fir[2] = weights[4] * val1;
+ fir[3] = 0;
+ fir[4] = 0;
+
+ val1 = line[1];
+ fir[0] += weights[1] * val1;
+ fir[1] += weights[2] * val1;
+ fir[2] += weights[3] * val1;
+ fir[3] += weights[4] * val1;
+
+ for ( xx = 2; xx < width; xx++ )
+ {
+ FT_UInt val, pix;
+
+
+ val = line[xx];
+ pix = fir[0] + weights[0] * val;
+ fir[0] = fir[1] + weights[1] * val;
+ fir[1] = fir[2] + weights[2] * val;
+ fir[2] = fir[3] + weights[3] * val;
+ fir[3] = weights[4] * val;
+
+ pix >>= 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 2] = (FT_Byte)pix;
+ }
+
+ {
+ FT_UInt pix;
+
+
+ pix = fir[0] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 2] = (FT_Byte)pix;
+
+ pix = fir[1] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 1] = (FT_Byte)pix;
+ }
+ }
+ }
+
+ /* vertical in-place FIR filter */
+ else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+ {
+ FT_Byte* column = bitmap->buffer;
+ FT_Int pitch = bitmap->pitch;
+
+
+ for ( ; width > 0; width--, column++ )
+ {
+ FT_Byte* col = column;
+ FT_UInt fir[5];
+ FT_UInt val1, yy;
+
+
+ val1 = col[0];
+ fir[0] = weights[2] * val1;
+ fir[1] = weights[3] * val1;
+ fir[2] = weights[4] * val1;
+ fir[3] = 0;
+ fir[4] = 0;
+ col += pitch;
+
+ val1 = col[0];
+ fir[0] += weights[1] * val1;
+ fir[1] += weights[2] * val1;
+ fir[2] += weights[3] * val1;
+ fir[3] += weights[4] * val1;
+ col += pitch;
+
+ for ( yy = 2; yy < height; yy++ )
+ {
+ FT_UInt val, pix;
+
+
+ val = col[0];
+ pix = fir[0] + weights[0] * val;
+ fir[0] = fir[1] + weights[1] * val;
+ fir[1] = fir[2] + weights[2] * val;
+ fir[2] = fir[3] + weights[3] * val;
+ fir[3] = weights[4] * val;
+
+ pix >>= 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-2 * pitch] = (FT_Byte)pix;
+ col += pitch;
+ }
+
+ {
+ FT_UInt pix;
+
+
+ pix = fir[0] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-2 * pitch] = (FT_Byte)pix;
+
+ pix = fir[1] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-pitch] = (FT_Byte)pix;
+ }
+ }
+ }
+ }
+
+
+#ifdef USE_LEGACY
+
+ /* intra-pixel filter used by the legacy filter */
+ static void
+ _ft_lcd_filter_legacy( FT_Bitmap* bitmap,
+ FT_Render_Mode mode,
+ FT_Library library )
+ {
+ FT_UInt width = (FT_UInt)bitmap->width;
+ FT_UInt height = (FT_UInt)bitmap->rows;
+ FT_Int pitch = bitmap->pitch;
+
+ static const int filters[3][3] =
+ {
+ { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
+ { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
+ { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
+ };
+
+ FT_UNUSED( library );
+
+
+ /* horizontal in-place intra-pixel filter */
+ if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
+ {
+ FT_Byte* line = bitmap->buffer;
+
+
+ for ( ; height > 0; height--, line += pitch )
+ {
+ FT_UInt xx;
+
+
+ for ( xx = 0; xx < width; xx += 3 )
+ {
+ FT_UInt r = 0;
+ FT_UInt g = 0;
+ FT_UInt b = 0;
+ FT_UInt p;
+
+
+ p = line[xx];
+ r += filters[0][0] * p;
+ g += filters[0][1] * p;
+ b += filters[0][2] * p;
+
+ p = line[xx + 1];
+ r += filters[1][0] * p;
+ g += filters[1][1] * p;
+ b += filters[1][2] * p;
+
+ p = line[xx + 2];
+ r += filters[2][0] * p;
+ g += filters[2][1] * p;
+ b += filters[2][2] * p;
+
+ line[xx] = (FT_Byte)( r / 65536 );
+ line[xx + 1] = (FT_Byte)( g / 65536 );
+ line[xx + 2] = (FT_Byte)( b / 65536 );
+ }
+ }
+ }
+ else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
+ {
+ FT_Byte* column = bitmap->buffer;
+
+
+ for ( ; width > 0; width--, column++ )
+ {
+ FT_Byte* col = column;
+ FT_Byte* col_end = col + height * pitch;
+
+
+ for ( ; col < col_end; col += 3 * pitch )
+ {
+ FT_UInt r = 0;
+ FT_UInt g = 0;
+ FT_UInt b = 0;
+ FT_UInt p;
+
+
+ p = col[0];
+ r += filters[0][0] * p;
+ g += filters[0][1] * p;
+ b += filters[0][2] * p;
+
+ p = col[pitch];
+ r += filters[1][0] * p;
+ g += filters[1][1] * p;
+ b += filters[1][2] * p;
+
+ p = col[pitch * 2];
+ r += filters[2][0] * p;
+ g += filters[2][1] * p;
+ b += filters[2][2] * p;
+
+ col[0] = (FT_Byte)( r / 65536 );
+ col[pitch] = (FT_Byte)( g / 65536 );
+ col[2 * pitch] = (FT_Byte)( b / 65536 );
+ }
+ }
+ }
+ }
+
+#endif /* USE_LEGACY */
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights )
+ {
+ if ( !library || !weights )
+ return FT_THROW( Invalid_Argument );
+
+ ft_memcpy( library->lcd_weights, weights, 5 );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter )
+ {
+ static const FT_Byte light_filter[5] =
+ { 0x00, 0x55, 0x56, 0x55, 0x00 };
+ /* the values here sum up to a value larger than 256, */
+ /* providing a cheap gamma correction */
+ static const FT_Byte default_filter[5] =
+ { 0x10, 0x40, 0x70, 0x40, 0x10 };
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Argument );
+
+ switch ( filter )
+ {
+ case FT_LCD_FILTER_NONE:
+ library->lcd_filter_func = NULL;
+ library->lcd_extra = 0;
+ break;
+
+ case FT_LCD_FILTER_DEFAULT:
+#if defined( FT_FORCE_LEGACY_LCD_FILTER )
+
+ library->lcd_filter_func = _ft_lcd_filter_legacy;
+ library->lcd_extra = 0;
+
+#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
+
+ ft_memcpy( library->lcd_weights, light_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+
+#else
+
+ ft_memcpy( library->lcd_weights, default_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+
+#endif
+
+ break;
+
+ case FT_LCD_FILTER_LIGHT:
+ ft_memcpy( library->lcd_weights, light_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+ break;
+
+#ifdef USE_LEGACY
+
+ case FT_LCD_FILTER_LEGACY:
+ library->lcd_filter_func = _ft_lcd_filter_legacy;
+ library->lcd_extra = 0;
+ break;
+
+#endif
+
+ default:
+ return FT_THROW( Invalid_Argument );
+ }
+
+ library->lcd_filter = filter;
+
+ return FT_Err_Ok;
+ }
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights )
+ {
+ FT_UNUSED( library );
+ FT_UNUSED( weights );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter )
+ {
+ FT_UNUSED( library );
+ FT_UNUSED( filter );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
new file mode 100644
index 0000000000..2f320d524c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
@@ -0,0 +1,206 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftmm.c */
+/* */
+/* Multiple Master font support (body). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svmm.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_mm
+
+
+ static FT_Error
+ ft_face_get_mm_service( FT_Face face,
+ FT_Service_MultiMasters *aservice )
+ {
+ FT_Error error;
+
+
+ *aservice = NULL;
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( FT_HAS_MULTIPLE_MASTERS( face ) )
+ {
+ FT_FACE_LOOKUP_SERVICE( face,
+ *aservice,
+ MULTI_MASTERS );
+
+ if ( *aservice )
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Multi_Master( FT_Face face,
+ FT_Multi_Master *amaster )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->get_mm )
+ error = service->get_mm( face, amaster );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_MM_Var( FT_Face face,
+ FT_MM_Var* *amaster )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->get_mm_var )
+ error = service->get_mm_var( face, amaster );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_MM_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_design )
+ error = service->set_mm_design( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Var_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_var_design )
+ error = service->set_var_design( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_MM_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_blend )
+ error = service->set_mm_blend( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ /* This is exactly the same as the previous function. It exists for */
+ /* orthogonality. */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Var_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_blend )
+ error = service->set_mm_blend( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
new file mode 100644
index 0000000000..ff7137fc1f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
@@ -0,0 +1,375 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftsystem.c */
+/* */
+/* ANSI-specific FreeType low-level system interface (body). */
+/* */
+/* Copyright 1996-2002, 2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the default interface used by FreeType to access */
+ /* low-level, i.e. memory management, i/o access as well as thread */
+ /* synchronisation. It can be replaced by user-specific routines if */
+ /* necessary. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* MEMORY MANAGEMENT INTERFACE */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* It is not necessary to do any error checking for the */
+ /* allocation-related functions. This will be done by the higher level */
+ /* routines like ft_mem_alloc() or ft_mem_realloc(). */
+ /* */
+ /*************************************************************************/
+
+#define _FOXIT_MEM_MANAGER_
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+/** Allocate number of bytes */
+void* FXMEM_DefaultAlloc(int byte_size, int flags);
+
+/** Allocate with debug information */
+void* FXMEM_DefaultAllocDebug(int size, int flags, const char* file, int line);
+
+void* FXMEM_DefaultRealloc(void* pointer, int new_size, int flags);
+
+/** Free previously allocated memory */
+void FXMEM_DefaultFree(void* pointer, int flags);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_alloc */
+ /* */
+ /* <Description> */
+ /* The memory allocation function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* size :: The requested size in bytes. */
+ /* */
+ /* <Return> */
+ /* The address of newly allocated block. */
+ /* */
+ FT_CALLBACK_DEF( void* )
+ ft_alloc( FT_Memory memory,
+ long size )
+ {
+ FT_UNUSED( memory );
+ #ifdef _FOXIT_MEM_MANAGER_
+ return FXMEM_DefaultAlloc(size, 0);
+#else
+ return ft_smalloc( size );
+#endif
+ }
+
+ /* XYQ 2006-10-12 */
+#ifdef _XYQ_MEM_DEBUG
+ FT_CALLBACK_DEF( void* )
+ ft_allocdebug( FT_Memory memory,
+ long size, const char* filename, int line)
+ {
+ FT_UNUSED( memory );
+
+ return FXMEM_DefaultAllocDebug( size, 0, filename, line );
+ }
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_realloc */
+ /* */
+ /* <Description> */
+ /* The memory reallocation function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* cur_size :: The current size of the allocated memory block. */
+ /* */
+ /* new_size :: The newly requested size in bytes. */
+ /* */
+ /* block :: The current address of the block in memory. */
+ /* */
+ /* <Return> */
+ /* The address of the reallocated memory block. */
+ /* */
+ FT_CALLBACK_DEF( void* )
+ ft_realloc( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block )
+ {
+ FT_UNUSED( memory );
+ FT_UNUSED( cur_size );
+
+#ifdef _FOXIT_MEM_MANAGER_
+ return FXMEM_DefaultRealloc(block, new_size, 0);
+#else
+ return ft_srealloc( block, new_size );
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_free */
+ /* */
+ /* <Description> */
+ /* The memory release function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* block :: The address of block in memory to be freed. */
+ /* */
+ FT_CALLBACK_DEF( void )
+ ft_free( FT_Memory memory,
+ void* block )
+ {
+ FT_UNUSED( memory );
+
+#ifdef _FOXIT_MEM_MANAGER_
+ FXMEM_DefaultFree(block, 0);
+#else
+ ft_sfree( block );
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RESOURCE MANAGEMENT INTERFACE */
+ /* */
+ /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_io
+
+ /* We use the macro STREAM_FILE for convenience to extract the */
+ /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_ansi_stream_close */
+ /* */
+ /* <Description> */
+ /* The function to close a stream. */
+ /* */
+ /* <Input> */
+ /* stream :: A pointer to the stream object. */
+ /* */
+ FT_CALLBACK_DEF( void )
+ ft_ansi_stream_close( FT_Stream stream )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ ft_fclose( STREAM_FILE( stream ) );
+
+ stream->descriptor.pointer = NULL;
+ stream->size = 0;
+ stream->base = 0;
+//#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_ansi_stream_io */
+ /* */
+ /* <Description> */
+ /* The function to open a stream. */
+ /* */
+ /* <Input> */
+ /* stream :: A pointer to the stream object. */
+ /* */
+ /* offset :: The position in the data stream to start reading. */
+ /* */
+ /* buffer :: The address of buffer to store the read data. */
+ /* */
+ /* count :: The number of bytes to read from the stream. */
+ /* */
+ /* <Return> */
+ /* The number of bytes actually read. If `count' is zero (this is, */
+ /* the function is used for seeking), a non-zero return value */
+ /* indicates an error. */
+ /* */
+ FT_CALLBACK_DEF( unsigned long )
+ ft_ansi_stream_io( FT_Stream stream,
+ unsigned long offset,
+ unsigned char* buffer,
+ unsigned long count )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ FT_FILE* file;
+
+
+ if ( !count && offset > stream->size )
+ return 1;
+
+ file = STREAM_FILE( stream );
+
+ if ( stream->pos != offset )
+ ft_fseek( file, offset, SEEK_SET );
+
+ return (unsigned long)ft_fread( buffer, 1, count, file );
+//#else
+// return 0;
+//#endif
+ }
+
+
+ /* documentation is in ftstream.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Open( FT_Stream stream,
+ const char* filepathname )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ FT_FILE* file;
+
+
+ if ( !stream )
+ return FT_THROW( Invalid_Stream_Handle );
+
+ stream->descriptor.pointer = NULL;
+ stream->pathname.pointer = (char*)filepathname;
+ stream->base = 0;
+ stream->pos = 0;
+ stream->read = NULL;
+ stream->close = NULL;
+
+ file = ft_fopen( filepathname, "rb" );
+ if ( !file )
+ {
+ FT_ERROR(( "FT_Stream_Open:"
+ " could not open `%s'\n", filepathname ));
+
+ return FT_THROW( Cannot_Open_Resource );
+ }
+
+ ft_fseek( file, 0, FXSYS_SEEK_END );
+ stream->size = ft_ftell( file );
+ if ( !stream->size )
+ {
+ FT_ERROR(( "FT_Stream_Open:" ));
+ FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+ ft_fclose( file );
+ return FT_THROW( Cannot_Open_Stream );
+ }
+ ft_fseek( file, 0, FXSYS_SEEK_SET );
+
+ stream->descriptor.pointer = file;
+ stream->read = ft_ansi_stream_io;
+ stream->close = ft_ansi_stream_close;
+
+ FT_TRACE1(( "FT_Stream_Open:" ));
+ FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+ filepathname, stream->size ));
+//#endif
+
+ return FT_Err_Ok;
+ }
+
+#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+#ifdef FT_DEBUG_MEMORY
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory );
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory );
+
+#endif
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Memory )
+ FT_New_Memory( void )
+ {
+ FT_Memory memory;
+
+
+ memory = (FT_Memory)FXMEM_DefaultAlloc( sizeof ( *memory ), 0 );
+ if ( memory )
+ {
+ memory->user = 0;
+ memory->alloc = ft_alloc;
+#ifdef _XYQ_MEM_DEBUG
+ memory->allocdebug = ft_allocdebug;
+#endif
+ memory->realloc = ft_realloc;
+ memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
+ }
+
+ return memory;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ FT_Done_Memory( FT_Memory memory )
+ {
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_done( memory );
+#endif
+ FXMEM_DefaultFree( memory, 0 );
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
new file mode 100644
index 0000000000..2f01c9302c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
@@ -0,0 +1,295 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001. No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * (This is a heavily cut-down "BSD license".)
+ *
+ * This differs from Colin Plumb's older public domain implementation in that
+ * no exactly 32-bit integer data type is required (any 32-bit or wider
+ * unsigned integer data type will do), there's no compile-time endianness
+ * configuration, and the function prototypes match OpenSSL's. No code from
+ * Colin Plumb's implementation has been reused; this comment merely compares
+ * the properties of the two independent implementations.
+ *
+ * The primary goals of this implementation are portability and ease of use.
+ * It is meant to be fast, but not as fast as possible. Some known
+ * optimizations are not included to reduce source code size and avoid
+ * compile-time configuration.
+ */
+
+#ifndef HAVE_OPENSSL
+
+#include <string.h>
+
+#include "md5.h"
+
+/*
+ * The basic MD5 functions.
+ *
+ * F and G are optimized compared to their RFC 1321 definitions for
+ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
+ * implementation.
+ */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))
+
+/*
+ * The MD5 transformation for all four rounds.
+ */
+#define STEP(f, a, b, c, d, x, t, s) \
+ (a) += f((b), (c), (d)) + (x) + (t); \
+ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
+ (a) += (b);
+
+/*
+ * SET reads 4 input bytes in little-endian byte order and stores them
+ * in a properly aligned word in host byte order.
+ *
+ * The check for little-endian architectures that tolerate unaligned
+ * memory accesses is just an optimization. Nothing will break if it
+ * doesn't work.
+ */
+#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
+#define SET(n) \
+ (*(MD5_u32plus *)&ptr[(n) * 4])
+#define GET(n) \
+ SET(n)
+#else
+#define SET(n) \
+ (ctx->block[(n)] = \
+ (MD5_u32plus)ptr[(n) * 4] | \
+ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
+ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
+ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
+#define GET(n) \
+ (ctx->block[(n)])
+#endif
+
+/*
+ * This processes one or more 64-byte data blocks, but does NOT update
+ * the bit counters. There are no alignment requirements.
+ */
+static void *body(MD5_CTX *ctx, void *data, unsigned long size)
+{
+ unsigned char *ptr;
+ MD5_u32plus a, b, c, d;
+ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
+
+ ptr = (unsigned char *)data;
+
+ a = ctx->a;
+ b = ctx->b;
+ c = ctx->c;
+ d = ctx->d;
+
+ do {
+ saved_a = a;
+ saved_b = b;
+ saved_c = c;
+ saved_d = d;
+
+/* Round 1 */
+ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
+ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+
+/* Round 2 */
+ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+
+/* Round 3 */
+ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+ STEP(H, d, a, b, c, GET(8), 0x8771f681, 11)
+ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+ STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)
+ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+ STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+ STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)
+ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+ STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)
+ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+ STEP(H, b, c, d, a, GET(6), 0x04881d05, 23)
+ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+ STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)
+ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+ STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)
+
+/* Round 4 */
+ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+ a += saved_a;
+ b += saved_b;
+ c += saved_c;
+ d += saved_d;
+
+ ptr += 64;
+ } while (size -= 64);
+
+ ctx->a = a;
+ ctx->b = b;
+ ctx->c = c;
+ ctx->d = d;
+
+ return ptr;
+}
+
+void MD5_Init(MD5_CTX *ctx)
+{
+ ctx->a = 0x67452301;
+ ctx->b = 0xefcdab89;
+ ctx->c = 0x98badcfe;
+ ctx->d = 0x10325476;
+
+ ctx->lo = 0;
+ ctx->hi = 0;
+}
+
+void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size)
+{
+ MD5_u32plus saved_lo;
+ unsigned long used, free;
+
+ saved_lo = ctx->lo;
+ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+ ctx->hi++;
+ ctx->hi += size >> 29;
+
+ used = saved_lo & 0x3f;
+
+ if (used) {
+ free = 64 - used;
+
+ if (size < free) {
+ memcpy(&ctx->buffer[used], data, size);
+ return;
+ }
+
+ memcpy(&ctx->buffer[used], data, free);
+ data = (unsigned char *)data + free;
+ size -= free;
+ body(ctx, ctx->buffer, 64);
+ }
+
+ if (size >= 64) {
+ data = body(ctx, data, size & ~(unsigned long)0x3f);
+ size &= 0x3f;
+ }
+
+ memcpy(ctx->buffer, data, size);
+}
+
+void MD5_Final(unsigned char *result, MD5_CTX *ctx)
+{
+ unsigned long used, free;
+
+ used = ctx->lo & 0x3f;
+
+ ctx->buffer[used++] = 0x80;
+
+ free = 64 - used;
+
+ if (free < 8) {
+ memset(&ctx->buffer[used], 0, free);
+ body(ctx, ctx->buffer, 64);
+ used = 0;
+ free = 64;
+ }
+
+ memset(&ctx->buffer[used], 0, free - 8);
+
+ ctx->lo <<= 3;
+ ctx->buffer[56] = ctx->lo;
+ ctx->buffer[57] = ctx->lo >> 8;
+ ctx->buffer[58] = ctx->lo >> 16;
+ ctx->buffer[59] = ctx->lo >> 24;
+ ctx->buffer[60] = ctx->hi;
+ ctx->buffer[61] = ctx->hi >> 8;
+ ctx->buffer[62] = ctx->hi >> 16;
+ ctx->buffer[63] = ctx->hi >> 24;
+
+ body(ctx, ctx->buffer, 64);
+
+ result[0] = ctx->a;
+ result[1] = ctx->a >> 8;
+ result[2] = ctx->a >> 16;
+ result[3] = ctx->a >> 24;
+ result[4] = ctx->b;
+ result[5] = ctx->b >> 8;
+ result[6] = ctx->b >> 16;
+ result[7] = ctx->b >> 24;
+ result[8] = ctx->c;
+ result[9] = ctx->c >> 8;
+ result[10] = ctx->c >> 16;
+ result[11] = ctx->c >> 24;
+ result[12] = ctx->d;
+ result[13] = ctx->d >> 8;
+ result[14] = ctx->d >> 16;
+ result[15] = ctx->d >> 24;
+
+ memset(ctx, 0, sizeof(*ctx));
+}
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
new file mode 100644
index 0000000000..f1a6857640
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
@@ -0,0 +1,45 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001. No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * See md5.c for more information.
+ */
+
+#ifdef HAVE_OPENSSL
+#include <openssl/md5.h>
+#elif !defined(_MD5_H)
+#define _MD5_H
+
+/* Any 32-bit or wider unsigned integer data type will do */
+typedef unsigned int MD5_u32plus;
+
+typedef struct {
+ MD5_u32plus lo, hi;
+ MD5_u32plus a, b, c, d;
+ unsigned char buffer[64];
+ MD5_u32plus block[16];
+} MD5_CTX;
+
+extern void MD5_Init(MD5_CTX *ctx);
+extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size);
+extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
new file mode 100644
index 0000000000..e932191157
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
@@ -0,0 +1,99 @@
+#
+# FreeType 2 base layer configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2009, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# It sets the following variables which are used by the master Makefile
+# after the call:
+#
+# BASE_OBJ_S: The single-object base layer.
+# BASE_OBJ_M: A list of all objects for a multiple-objects build.
+# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found
+# in `freetype/src/base' which are not compiled within the
+# base layer proper.
+
+
+BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base)
+
+
+# Base layer sources
+#
+# ftsystem, ftinit, and ftdebug are handled by freetype.mk
+#
+# All files listed here should be included in `ftbase.c' (for a `single'
+# build).
+#
+BASE_SRC := $(BASE_DIR)/ftadvanc.c \
+ $(BASE_DIR)/ftcalc.c \
+ $(BASE_DIR)/ftdbgmem.c \
+ $(BASE_DIR)/ftgloadr.c \
+ $(BASE_DIR)/ftobjs.c \
+ $(BASE_DIR)/ftoutln.c \
+ $(BASE_DIR)/ftrfork.c \
+ $(BASE_DIR)/ftsnames.c \
+ $(BASE_DIR)/ftstream.c \
+ $(BASE_DIR)/fttrigon.c \
+ $(BASE_DIR)/ftutil.c
+
+
+ifneq ($(ftmac_c),)
+ BASE_SRC += $(BASE_DIR)/$(ftmac_c)
+endif
+
+# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h')
+BASE_H := $(BASE_DIR)/ftbase.h \
+ $(BASE_DIR)/md5.c \
+ $(BASE_DIR)/md5.h
+
+# Base layer `extensions' sources
+#
+# An extension is added to the library file as a separate object. It is
+# then linked to the final executable only if one of its symbols is used by
+# the application.
+#
+BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS))
+
+# Default extensions objects
+#
+BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+
+
+# Base layer object(s)
+#
+# BASE_OBJ_M is used during `multi' builds (each base source file compiles
+# to a single object file).
+#
+# BASE_OBJ_S is used during `single' builds (the whole base layer is
+# compiled as a single object file using ftbase.c).
+#
+BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O
+
+# Base layer root source file for single build
+#
+BASE_SRC_S := $(BASE_DIR)/ftbase.c
+
+
+# Base layer - single object build
+#
+$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H)
+ $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S))
+
+
+# Multiple objects build + extensions
+#
+$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H)
+ $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
new file mode 100644
index 0000000000..6705d3cfdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cff Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) cff ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;
+ }
+ else
+ {
+ _sources = cff ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cff Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
new file mode 100644
index 0000000000..fa967ebd97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
@@ -0,0 +1,241 @@
+/***************************************************************************/
+/* */
+/* cf2arrst.c */
+/* */
+/* Adobe's code for Array Stacks (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2arrst.h"
+
+#include "cf2error.h"
+
+
+ /*
+ * CF2_ArrStack uses an error pointer, to enable shared errors.
+ * Shared errors are necessary when multiple objects allow the program
+ * to continue after detecting errors. Only the first error should be
+ * recorded.
+ */
+
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_init( CF2_ArrStack arrstack,
+ FT_Memory memory,
+ FT_Error* error,
+ size_t sizeItem )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ /* initialize the structure */
+ arrstack->memory = memory;
+ arrstack->error = error;
+ arrstack->sizeItem = sizeItem;
+ arrstack->allocated = 0;
+ arrstack->chunk = 10; /* chunks of 10 items */
+ arrstack->count = 0;
+ arrstack->totalSize = 0;
+ arrstack->ptr = NULL;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_finalize( CF2_ArrStack arrstack )
+ {
+ FT_Memory memory = arrstack->memory; /* for FT_FREE */
+
+
+ FT_ASSERT( arrstack != NULL );
+
+ arrstack->allocated = 0;
+ arrstack->count = 0;
+ arrstack->totalSize = 0;
+
+ /* free the data buffer */
+ FT_FREE( arrstack->ptr );
+ }
+
+
+ /* allocate or reallocate the buffer size; */
+ /* return false on memory error */
+ static FT_Bool
+ cf2_arrstack_setNumElements( CF2_ArrStack arrstack,
+ size_t numElements )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ {
+ FT_Error error = FT_Err_Ok; /* for FT_REALLOC */
+ FT_Memory memory = arrstack->memory; /* for FT_REALLOC */
+
+ FT_Long newSize = (FT_Long)( numElements * arrstack->sizeItem );
+
+
+ if ( numElements > LONG_MAX / arrstack->sizeItem )
+ goto exit;
+
+
+ FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */
+
+ if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )
+ {
+ arrstack->allocated = numElements;
+ arrstack->totalSize = newSize;
+
+ if ( arrstack->count > numElements )
+ {
+ /* we truncated the list! */
+ CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+ arrstack->count = numElements;
+ return FALSE;
+ }
+
+ return TRUE; /* success */
+ }
+ }
+
+ exit:
+ /* if there's not already an error, store this one */
+ CF2_SET_ERROR( arrstack->error, Out_Of_Memory );
+
+ return FALSE;
+ }
+
+
+ /* set the count, ensuring allocation is sufficient */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_setCount( CF2_ArrStack arrstack,
+ size_t numElements )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ if ( numElements > arrstack->allocated )
+ {
+ /* expand the allocation first */
+ if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )
+ return;
+ }
+
+ arrstack->count = numElements;
+ }
+
+
+ /* clear the count */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_clear( CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ arrstack->count = 0;
+ }
+
+
+ /* current number of items */
+ FT_LOCAL_DEF( size_t )
+ cf2_arrstack_size( const CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ return arrstack->count;
+ }
+
+
+ FT_LOCAL_DEF( void* )
+ cf2_arrstack_getBuffer( const CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ return arrstack->ptr;
+ }
+
+
+ /* return pointer to the given element */
+ FT_LOCAL_DEF( void* )
+ cf2_arrstack_getPointer( const CF2_ArrStack arrstack,
+ size_t idx )
+ {
+ void* newPtr;
+
+
+ FT_ASSERT( arrstack != NULL );
+
+ if ( idx >= arrstack->count )
+ {
+ /* overflow */
+ CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+ idx = 0; /* choose safe default */
+ }
+
+ newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;
+
+ return newPtr;
+ }
+
+
+ /* push (append) an element at the end of the list; */
+ /* return false on memory error */
+ /* TODO: should there be a length param for extra checking? */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_push( CF2_ArrStack arrstack,
+ const void* ptr )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ if ( arrstack->count == arrstack->allocated )
+ {
+ /* grow the buffer by one chunk */
+ if ( !cf2_arrstack_setNumElements(
+ arrstack, arrstack->allocated + arrstack->chunk ) )
+ {
+ /* on error, ignore the push */
+ return;
+ }
+ }
+
+ FT_ASSERT( ptr != NULL );
+
+ {
+ size_t offset = arrstack->count * arrstack->sizeItem;
+ void* newPtr = (FT_Byte*)arrstack->ptr + offset;
+
+
+ FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );
+ arrstack->count += 1;
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
new file mode 100644
index 0000000000..ff5ad8b126
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
@@ -0,0 +1,100 @@
+/***************************************************************************/
+/* */
+/* cf2arrst.h */
+/* */
+/* Adobe's code for Array Stacks (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2ARRST_H__
+#define __CF2ARRST_H__
+
+
+#include "cf2error.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* need to define the struct here (not opaque) so it can be allocated by */
+ /* clients */
+ typedef struct CF2_ArrStackRec_
+ {
+ FT_Memory memory;
+ FT_Error* error;
+
+ size_t sizeItem; /* bytes per element */
+ size_t allocated; /* items allocated */
+ size_t chunk; /* allocation increment in items */
+ size_t count; /* number of elements allocated */
+ size_t totalSize; /* total bytes allocated */
+
+ void* ptr; /* ptr to data */
+
+ } CF2_ArrStackRec, *CF2_ArrStack;
+
+
+ FT_LOCAL( void )
+ cf2_arrstack_init( CF2_ArrStack arrstack,
+ FT_Memory memory,
+ FT_Error* error,
+ size_t sizeItem );
+ FT_LOCAL( void )
+ cf2_arrstack_finalize( CF2_ArrStack arrstack );
+
+ FT_LOCAL( void )
+ cf2_arrstack_setCount( CF2_ArrStack arrstack,
+ size_t numElements );
+ FT_LOCAL( void )
+ cf2_arrstack_clear( CF2_ArrStack arrstack );
+ FT_LOCAL( size_t )
+ cf2_arrstack_size( const CF2_ArrStack arrstack );
+
+ FT_LOCAL( void* )
+ cf2_arrstack_getBuffer( const CF2_ArrStack arrstack );
+ FT_LOCAL( void* )
+ cf2_arrstack_getPointer( const CF2_ArrStack arrstack,
+ size_t idx );
+
+ FT_LOCAL( void )
+ cf2_arrstack_push( CF2_ArrStack arrstack,
+ const void* ptr );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ARRST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
new file mode 100644
index 0000000000..82943428e4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
@@ -0,0 +1,578 @@
+/***************************************************************************/
+/* */
+/* cf2blues.c */
+/* */
+/* Adobe's code for handling Blue Zones (body). */
+/* */
+/* Copyright 2009-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2blues.h"
+#include "cf2hints.h"
+#include "cf2font.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2blues
+
+
+ /*
+ * For blue values, the FreeType parser produces an array of integers,
+ * while the Adobe CFF engine produces an array of fixed.
+ * Define a macro to convert FreeType to fixed.
+ */
+#define cf2_blueToFixed( x ) cf2_intToFixed( x )
+
+
+ FT_LOCAL_DEF( void )
+ cf2_blues_init( CF2_Blues blues,
+ CF2_Font font )
+ {
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ CF2_Fixed zoneHeight;
+ CF2_Fixed maxZoneHeight = 0;
+ CF2_Fixed csUnitsPerPixel;
+
+ size_t numBlueValues;
+ size_t numOtherBlues;
+ size_t numFamilyBlues;
+ size_t numFamilyOtherBlues;
+
+ FT_Pos* blueValues;
+ FT_Pos* otherBlues;
+ FT_Pos* familyBlues;
+ FT_Pos* familyOtherBlues;
+
+ size_t i;
+ CF2_Fixed emBoxBottom, emBoxTop;
+
+ CF2_Int unitsPerEm = font->unitsPerEm;
+
+
+ if ( unitsPerEm == 0 )
+ unitsPerEm = 1000;
+
+ FT_ZERO( blues );
+ blues->scale = font->innerTransform.d;
+
+ cf2_getBlueMetrics( decoder,
+ &blues->blueScale,
+ &blues->blueShift,
+ &blues->blueFuzz );
+
+ cf2_getBlueValues( decoder, &numBlueValues, &blueValues );
+ cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );
+ cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );
+ cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );
+
+ /*
+ * synthetic em box hint heuristic
+ *
+ * Apply this when ideographic dictionary (LanguageGroup 1) has no
+ * real alignment zones. Adobe tools generate dummy zones at -250 and
+ * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones
+ * should not enable the heuristic. When the heuristic is enabled,
+ * the font's blue zones are ignored.
+ *
+ */
+
+ /* get em box from OS/2 typoAscender/Descender */
+ /* TODO: FreeType does not parse these metrics. Skip them for now. */
+#if 0
+ FCM_getHorizontalLineMetrics( &e,
+ font->font,
+ &ascender,
+ &descender,
+ &linegap );
+ if ( ascender - descender == unitsPerEm )
+ {
+ emBoxBottom = cf2_intToFixed( descender );
+ emBoxTop = cf2_intToFixed( ascender );
+ }
+ else
+#endif
+ {
+ emBoxBottom = CF2_ICF_Bottom;
+ emBoxTop = CF2_ICF_Top;
+ }
+
+ if ( cf2_getLanguageGroup( decoder ) == 1 &&
+ ( numBlueValues == 0 ||
+ ( numBlueValues == 4 &&
+ cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&
+ cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&
+ cf2_blueToFixed( blueValues[2] ) > emBoxTop &&
+ cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) )
+ {
+ /*
+ * Construct hint edges suitable for synthetic ghost hints at top
+ * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted
+ * features above or below the last hinted edge. This also gives a
+ * net 1 pixel boost to the height of ideographic glyphs.
+ *
+ * Note: Adjust synthetic hints outward by epsilon (0x.0001) to
+ * avoid interference. E.g., some fonts have real hints at
+ * 880 and -120.
+ */
+
+ blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;
+ blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(
+ FT_MulFix(
+ blues->emBoxBottomEdge.csCoord,
+ blues->scale ) ) -
+ CF2_MIN_COUNTER;
+ blues->emBoxBottomEdge.scale = blues->scale;
+ blues->emBoxBottomEdge.flags = CF2_GhostBottom |
+ CF2_Locked |
+ CF2_Synthetic;
+
+ blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +
+ 2 * font->darkenY;
+ blues->emBoxTopEdge.dsCoord = cf2_fixedRound(
+ FT_MulFix(
+ blues->emBoxTopEdge.csCoord,
+ blues->scale ) ) +
+ CF2_MIN_COUNTER;
+ blues->emBoxTopEdge.scale = blues->scale;
+ blues->emBoxTopEdge.flags = CF2_GhostTop |
+ CF2_Locked |
+ CF2_Synthetic;
+
+ blues->doEmBoxHints = TRUE; /* enable the heuristic */
+
+ return;
+ }
+
+ /* copy `BlueValues' and `OtherBlues' to a combined array of top and */
+ /* bottom zones */
+ for ( i = 0; i < numBlueValues; i += 2 )
+ {
+ blues->zone[blues->count].csBottomEdge =
+ cf2_blueToFixed( blueValues[i] );
+ blues->zone[blues->count].csTopEdge =
+ cf2_blueToFixed( blueValues[i + 1] );
+
+ zoneHeight = blues->zone[blues->count].csTopEdge -
+ blues->zone[blues->count].csBottomEdge;
+
+ if ( zoneHeight < 0 )
+ {
+ FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+ continue; /* reject this zone */
+ }
+
+ if ( zoneHeight > maxZoneHeight )
+ {
+ /* take maximum before darkening adjustment */
+ /* so overshoot suppression point doesn't change */
+ maxZoneHeight = zoneHeight;
+ }
+
+ /* adjust both edges of top zone upward by twice darkening amount */
+ if ( i != 0 )
+ {
+ blues->zone[blues->count].csTopEdge += 2 * font->darkenY;
+ blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;
+ }
+
+ /* first `BlueValue' is bottom zone; others are top */
+ if ( i == 0 )
+ {
+ blues->zone[blues->count].bottomZone =
+ TRUE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csTopEdge;
+ }
+ else
+ {
+ blues->zone[blues->count].bottomZone =
+ FALSE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csBottomEdge;
+ }
+
+ blues->count += 1;
+ }
+
+ for ( i = 0; i < numOtherBlues; i += 2 )
+ {
+ blues->zone[blues->count].csBottomEdge =
+ cf2_blueToFixed( otherBlues[i] );
+ blues->zone[blues->count].csTopEdge =
+ cf2_blueToFixed( otherBlues[i + 1] );
+
+ zoneHeight = blues->zone[blues->count].csTopEdge -
+ blues->zone[blues->count].csBottomEdge;
+
+ if ( zoneHeight < 0 )
+ {
+ FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+ continue; /* reject this zone */
+ }
+
+ if ( zoneHeight > maxZoneHeight )
+ {
+ /* take maximum before darkening adjustment */
+ /* so overshoot suppression point doesn't change */
+ maxZoneHeight = zoneHeight;
+ }
+
+ /* Note: bottom zones are not adjusted for darkening amount */
+
+ /* all OtherBlues are bottom zone */
+ blues->zone[blues->count].bottomZone =
+ TRUE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csTopEdge;
+
+ blues->count += 1;
+ }
+
+ /* Adjust for FamilyBlues */
+
+ /* Search for the nearest flat edge in `FamilyBlues' or */
+ /* `FamilyOtherBlues'. According to the Black Book, any matching edge */
+ /* must be within one device pixel */
+
+ csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );
+
+ /* loop on all zones in this font */
+ for ( i = 0; i < blues->count; i++ )
+ {
+ size_t j;
+ CF2_Fixed minDiff;
+ CF2_Fixed flatFamilyEdge, diff;
+ /* value for this font */
+ CF2_Fixed flatEdge = blues->zone[i].csFlatEdge;
+
+
+ if ( blues->zone[i].bottomZone )
+ {
+ /* In a bottom zone, the top edge is the flat edge. */
+ /* Search `FamilyOtherBlues' for bottom zones; look for closest */
+ /* Family edge that is within the one pixel threshold. */
+
+ minDiff = CF2_FIXED_MAX;
+
+ for ( j = 0; j < numFamilyOtherBlues; j += 2 )
+ {
+ /* top edge */
+ flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ {
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ minDiff = diff;
+
+ if ( diff == 0 )
+ break;
+ }
+ }
+
+ /* check the first member of FamilyBlues, which is a bottom zone */
+ if ( numFamilyBlues >= 2 )
+ {
+ /* top edge */
+ flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ }
+ }
+ else
+ {
+ /* In a top zone, the bottom edge is the flat edge. */
+ /* Search `FamilyBlues' for top zones; skip first zone, which is a */
+ /* bottom zone; look for closest Family edge that is within the */
+ /* one pixel threshold */
+
+ minDiff = CF2_FIXED_MAX;
+
+ for ( j = 2; j < numFamilyBlues; j += 2 )
+ {
+ /* bottom edge */
+ flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );
+
+ /* adjust edges of top zone upward by twice darkening amount */
+ flatFamilyEdge += 2 * font->darkenY; /* bottom edge */
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ {
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ minDiff = diff;
+
+ if ( diff == 0 )
+ break;
+ }
+ }
+ }
+ }
+
+ /* TODO: enforce separation of zones, including BlueFuzz */
+
+ /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */
+ /* `bcsetup.c'. */
+
+ if ( maxZoneHeight > 0 )
+ {
+ if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),
+ maxZoneHeight ) )
+ {
+ /* clamp at maximum scale */
+ blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),
+ maxZoneHeight );
+ }
+
+ /*
+ * TODO: Revisit the bug fix for 613448. The minimum scale
+ * requirement catches a number of library fonts. For
+ * example, with default BlueScale (.039625) and 0.4 minimum,
+ * the test below catches any font with maxZoneHeight < 10.1.
+ * There are library fonts ranging from 2 to 10 that get
+ * caught, including e.g., Eurostile LT Std Medium with
+ * maxZoneHeight of 6.
+ *
+ */
+#if 0
+ if ( blueScale < .4 / maxZoneHeight )
+ {
+ tetraphilia_assert( 0 );
+ /* clamp at minimum scale, per bug 0613448 fix */
+ blueScale = .4 / maxZoneHeight;
+ }
+#endif
+
+ }
+
+ /*
+ * Suppress overshoot and boost blue zones at small sizes. Boost
+ * amount varies linearly from 0.5 pixel near 0 to 0 pixel at
+ * blueScale cutoff.
+ * Note: This boost amount is different from the coretype heuristic.
+ *
+ */
+
+ if ( blues->scale < blues->blueScale )
+ {
+ blues->suppressOvershoot = TRUE;
+
+ /* Change rounding threshold for `dsFlatEdge'. */
+ /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */
+ /* 10ppem Arial */
+
+ blues->boost = FT_MulFix(
+ cf2_floatToFixed( .6 ),
+ ( cf2_intToFixed( 1 ) -
+ FT_DivFix( blues->scale,
+ blues->blueScale ) ) );
+ if ( blues->boost > 0x7FFF )
+ {
+ /* boost must remain less than 0.5, or baseline could go negative */
+ blues->boost = 0x7FFF;
+ }
+ }
+
+ /* boost and darkening have similar effects; don't do both */
+ if ( font->stemDarkened )
+ blues->boost = 0;
+
+ /* set device space alignment for each zone; */
+ /* apply boost amount before rounding flat edge */
+
+ for ( i = 0; i < blues->count; i++ )
+ {
+ if ( blues->zone[i].bottomZone )
+ blues->zone[i].dsFlatEdge = cf2_fixedRound(
+ FT_MulFix(
+ blues->zone[i].csFlatEdge,
+ blues->scale ) -
+ blues->boost );
+ else
+ blues->zone[i].dsFlatEdge = cf2_fixedRound(
+ FT_MulFix(
+ blues->zone[i].csFlatEdge,
+ blues->scale ) +
+ blues->boost );
+ }
+ }
+
+
+ /*
+ * Check whether `stemHint' is captured by one of the blue zones.
+ *
+ * Zero, one or both edges may be valid; only valid edges can be
+ * captured. For compatibility with CoolType, search top and bottom
+ * zones in the same pass (see `BlueLock'). If a hint is captured,
+ * return true and position the edge(s) in one of 3 ways:
+ *
+ * 1) If `BlueScale' suppresses overshoot, position the captured edge
+ * at the flat edge of the zone.
+ * 2) If overshoot is not suppressed and `BlueShift' requires
+ * overshoot, position the captured edge a minimum of 1 device pixel
+ * from the flat edge.
+ * 3) If overshoot is not suppressed or required, position the captured
+ * edge at the nearest device pixel.
+ *
+ */
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_blues_capture( const CF2_Blues blues,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge )
+ {
+ /* TODO: validate? */
+ CF2_Fixed csFuzz = blues->blueFuzz;
+
+ /* new position of captured edge */
+ CF2_Fixed dsNew;
+
+ /* amount that hint is moved when positioned */
+ CF2_Fixed dsMove = 0;
+
+ FT_Bool captured = FALSE;
+ CF2_UInt i;
+
+
+ /* assert edge flags are consistent */
+ FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&
+ !cf2_hint_isBottom( topHintEdge ) );
+
+ /* TODO: search once without blue fuzz for compatibility with coretype? */
+ for ( i = 0; i < blues->count; i++ )
+ {
+ if ( blues->zone[i].bottomZone &&
+ cf2_hint_isBottom( bottomHintEdge ) )
+ {
+ if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+ bottomHintEdge->csCoord &&
+ bottomHintEdge->csCoord <=
+ ( blues->zone[i].csTopEdge + csFuzz ) )
+ {
+ /* bottom edge captured by bottom zone */
+
+ if ( blues->suppressOvershoot )
+ dsNew = blues->zone[i].dsFlatEdge;
+
+ else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=
+ blues->blueShift )
+ {
+ /* guarantee minimum of 1 pixel overshoot */
+ dsNew = FT_MIN(
+ cf2_fixedRound( bottomHintEdge->dsCoord ),
+ blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );
+ }
+
+ else
+ {
+ /* simply round captured edge */
+ dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
+ }
+
+ dsMove = dsNew - bottomHintEdge->dsCoord;
+ captured = TRUE;
+
+ break;
+ }
+ }
+
+ if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
+ {
+ if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+ topHintEdge->csCoord &&
+ topHintEdge->csCoord <=
+ ( blues->zone[i].csTopEdge + csFuzz ) )
+ {
+ /* top edge captured by top zone */
+
+ if ( blues->suppressOvershoot )
+ dsNew = blues->zone[i].dsFlatEdge;
+
+ else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=
+ blues->blueShift )
+ {
+ /* guarantee minimum of 1 pixel overshoot */
+ dsNew = FT_MAX(
+ cf2_fixedRound( topHintEdge->dsCoord ),
+ blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );
+ }
+
+ else
+ {
+ /* simply round captured edge */
+ dsNew = cf2_fixedRound( topHintEdge->dsCoord );
+ }
+
+ dsMove = dsNew - topHintEdge->dsCoord;
+ captured = TRUE;
+
+ break;
+ }
+ }
+ }
+
+ if ( captured )
+ {
+ /* move both edges and flag them `locked' */
+ if ( cf2_hint_isValid( bottomHintEdge ) )
+ {
+ bottomHintEdge->dsCoord += dsMove;
+ cf2_hint_lock( bottomHintEdge );
+ }
+
+ if ( cf2_hint_isValid( topHintEdge ) )
+ {
+ topHintEdge->dsCoord += dsMove;
+ cf2_hint_lock( topHintEdge );
+ }
+ }
+
+ return captured;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
new file mode 100644
index 0000000000..2f38fcad8f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
@@ -0,0 +1,185 @@
+/***************************************************************************/
+/* */
+/* cf2blues.h */
+/* */
+/* Adobe's code for handling Blue Zones (specification). */
+/* */
+/* Copyright 2009-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+ /*
+ * A `CF2_Blues' object stores the blue zones (horizontal alignment
+ * zones) of a font. These are specified in the CFF private dictionary
+ * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.
+ * Each zone is defined by a top and bottom edge in character space.
+ * Further, each zone is either a top zone or a bottom zone, as recorded
+ * by `bottomZone'.
+ *
+ * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.
+ * However, these are combined to produce a total of 7 zones.
+ * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'
+ * is 5 and these are combined to produce an additional 5 zones.
+ *
+ * Blue zones are used to `capture' hints and force them to a common
+ * alignment point. This alignment is recorded in device space in
+ * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be
+ * constructed independently of scaling. Construction may occur once
+ * the matrix is known. Other features implemented in the Capture
+ * method are overshoot suppression, overshoot enforcement, and Blue
+ * Boost.
+ *
+ * Capture is determined by `BlueValues' and `OtherBlues', but the
+ * alignment point may be adjusted to the scaled flat edge of
+ * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the
+ * curved edge of a zone.
+ *
+ */
+
+
+#ifndef __CF2BLUES_H__
+#define __CF2BLUES_H__
+
+
+#include "cf2glue.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * `CF2_Hint' is shared by `cf2hints.h' and
+ * `cf2blues.h', but `cf2blues.h' depends on
+ * `cf2hints.h', so define it here. Note: The typedef is in
+ * `cf2glue.h'.
+ *
+ */
+ enum
+ {
+ CF2_GhostBottom = 0x1, /* a single bottom edge */
+ CF2_GhostTop = 0x2, /* a single top edge */
+ CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */
+ CF2_PairTop = 0x8, /* the top edge of a stem hint */
+ CF2_Locked = 0x10, /* this edge has been aligned */
+ /* by a blue zone */
+ CF2_Synthetic = 0x20 /* this edge was synthesized */
+ };
+
+
+ /*
+ * Default value for OS/2 typoAscender/Descender when their difference
+ * is not equal to `unitsPerEm'. The default is based on -250 and 1100
+ * in `CF2_Blues', assuming 1000 units per em here.
+ *
+ */
+ enum
+ {
+ CF2_ICF_Top = cf2_intToFixed( 880 ),
+ CF2_ICF_Bottom = cf2_intToFixed( -120 )
+ };
+
+
+ /*
+ * Constant used for hint adjustment and for synthetic em box hint
+ * placement.
+ */
+#define CF2_MIN_COUNTER cf2_floatToFixed( 0.5 )
+
+
+ /* shared typedef is in cf2glue.h */
+ struct CF2_HintRec_
+ {
+ CF2_UInt flags; /* attributes of the edge */
+ size_t index; /* index in original stem hint array */
+ /* (if not synthetic) */
+ CF2_Fixed csCoord;
+ CF2_Fixed dsCoord;
+ CF2_Fixed scale;
+ };
+
+
+ typedef struct CF2_BlueRec_
+ {
+ CF2_Fixed csBottomEdge;
+ CF2_Fixed csTopEdge;
+ CF2_Fixed csFlatEdge; /* may be from either local or Family zones */
+ CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */
+ /* of top zone (rounded) */
+ FT_Bool bottomZone;
+
+ } CF2_BlueRec;
+
+
+ /* max total blue zones is 12 */
+ enum
+ {
+ CF2_MAX_BLUES = 7,
+ CF2_MAX_OTHERBLUES = 5
+ };
+
+
+ typedef struct CF2_BluesRec_
+ {
+ CF2_Fixed scale;
+ CF2_UInt count;
+ FT_Bool suppressOvershoot;
+ FT_Bool doEmBoxHints;
+
+ CF2_Fixed blueScale;
+ CF2_Fixed blueShift;
+ CF2_Fixed blueFuzz;
+
+ CF2_Fixed boost;
+
+ CF2_HintRec emBoxTopEdge;
+ CF2_HintRec emBoxBottomEdge;
+
+ CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];
+
+ } CF2_BluesRec, *CF2_Blues;
+
+
+ FT_LOCAL( void )
+ cf2_blues_init( CF2_Blues blues,
+ CF2_Font font );
+ FT_LOCAL( FT_Bool )
+ cf2_blues_capture( const CF2_Blues blues,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2BLUES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
new file mode 100644
index 0000000000..b5595a3d1f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/* */
+/* cf2error.c */
+/* */
+/* Adobe's code for error handling (body). */
+/* */
+/* Copyright 2006-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "cf2error.h"
+
+
+ FT_LOCAL_DEF( void )
+ cf2_setError( FT_Error* error,
+ FT_Error value )
+ {
+ if ( error && *error == 0 )
+ *error = value;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
new file mode 100644
index 0000000000..428775c162
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/* */
+/* cf2error.h */
+/* */
+/* Adobe's code for error handling (specification). */
+/* */
+/* Copyright 2006-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2ERROR_H__
+#define __CF2ERROR_H__
+
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CF2_Err_
+#define FT_ERR_BASE FT_Mod_Err_CF2
+
+
+#include "../../include/freetype/fterrors.h"
+#include "cf2ft.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A poor-man error facility.
+ *
+ * This code being written in vanilla C, doesn't have the luxury of a
+ * language-supported exception mechanism such as the one available in
+ * Java. Instead, we are stuck with using error codes that must be
+ * carefully managed and preserved. However, it is convenient for us to
+ * model our error mechanism on a Java-like exception mechanism.
+ * When we assign an error code we are thus `throwing' an error.
+ *
+ * The perservation of an error code is done by coding convention.
+ * Upon a function call if the error code is anything other than
+ * `FT_Err_Ok', which is guaranteed to be zero, we
+ * will return without altering that error. This will allow the
+ * error to propogate and be handled at the appropriate location in
+ * the code.
+ *
+ * This allows a style of code where the error code is initialized
+ * up front and a block of calls are made with the error code only
+ * being checked after the block. If a new error occurs, the original
+ * error will be preserved and a functional no-op should result in any
+ * subsequent function that has an initial error code not equal to
+ * `FT_Err_Ok'.
+ *
+ * Errors are encoded by calling the `FT_THROW' macro. For example,
+ *
+ * {
+ * FT_Error e;
+ *
+ *
+ * ...
+ * e = FT_THROW( Out_Of_Memory );
+ * }
+ *
+ */
+
+
+ /* Set error code to a particular value. */
+ FT_LOCAL( void )
+ cf2_setError( FT_Error* error,
+ FT_Error value );
+
+
+ /*
+ * A macro that conditionally sets an error code.
+ *
+ * This macro will first check whether `error' is set;
+ * if not, it will set it to `e'.
+ *
+ */
+#define CF2_SET_ERROR( error, e ) \
+ cf2_setError( error, FT_THROW( e ) )
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ERROR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
new file mode 100644
index 0000000000..ed1452a7da
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
@@ -0,0 +1,95 @@
+/***************************************************************************/
+/* */
+/* cf2fixed.h */
+/* */
+/* Adobe's code for Fixed Point Mathematics (specification only). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FIXED_H__
+#define __CF2FIXED_H__
+
+
+FT_BEGIN_HEADER
+
+
+ /* rasterizer integer and fixed point arithmetic must be 32-bit */
+
+#define CF2_Fixed CF2_F16Dot16
+ typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */
+
+
+#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL )
+#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L )
+#define CF2_FIXED_ONE 0x10000L
+#define CF2_FIXED_EPSILON 0x0001
+
+ /* in C 89, left and right shift of negative numbers is */
+ /* implementation specific behaviour in the general case */
+
+#define cf2_intToFixed( i ) \
+ ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )
+#define cf2_fixedToInt( x ) \
+ ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+#define cf2_fixedRound( x ) \
+ ( (CF2_Fixed)( ( (x) + 0x8000 ) & 0xFFFF0000L ) )
+#define cf2_floatToFixed( f ) \
+ ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
+#define cf2_fixedAbs( x ) \
+ ( (x) < 0 ? -(x) : (x) )
+#define cf2_fixedFloor( x ) \
+ ( (CF2_Fixed)( (x) & 0xFFFF0000L ) )
+#define cf2_fixedFraction( x ) \
+ ( (x) - cf2_fixedFloor( x ) )
+#define cf2_fracToFixed( x ) \
+ ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \
+ : ( ( (x) + 0x2000 ) >> 14 ) )
+
+
+ /* signed numeric types */
+ typedef enum CF2_NumberType_
+ {
+ CF2_NumberFixed, /* 16.16 */
+ CF2_NumberFrac, /* 2.30 */
+ CF2_NumberInt /* 32.0 */
+
+ } CF2_NumberType;
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FIXED_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
new file mode 100644
index 0000000000..c1eeec289a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
@@ -0,0 +1,404 @@
+/***************************************************************************/
+/* */
+/* cf2font.c */
+/* */
+/* Adobe's code for font instances (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2error.h"
+#include "cf2intrp.h"
+
+
+ /* Compute a stem darkening amount in character space. */
+ static void
+ cf2_computeDarkening( CF2_Fixed emRatio,
+ CF2_Fixed ppem,
+ CF2_Fixed stemWidth,
+ CF2_Fixed* darkenAmount,
+ CF2_Fixed boldenAmount,
+ FT_Bool stemDarkened )
+ {
+ /* Internal calculations are done in units per thousand for */
+ /* convenience. */
+ CF2_Fixed stemWidthPer1000, scaledStem;
+
+
+ *darkenAmount = 0;
+
+ if ( boldenAmount == 0 && !stemDarkened )
+ return;
+
+ /* protect against range problems and divide by zero */
+ if ( emRatio < cf2_floatToFixed( .01 ) )
+ return;
+
+ if ( stemDarkened )
+ {
+ /* convert from true character space to 1000 unit character space; */
+ /* add synthetic emboldening effect */
+
+ /* we have to assure that the computation of `scaledStem' */
+ /* and `stemWidthPer1000' don't overflow */
+
+ stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );
+
+ if ( emRatio > CF2_FIXED_ONE &&
+ stemWidthPer1000 <= ( stemWidth + boldenAmount ) )
+ {
+ stemWidthPer1000 = 0; /* to pacify compiler */
+ scaledStem = cf2_intToFixed( 2333 );
+ }
+ else
+ {
+ scaledStem = FT_MulFix( stemWidthPer1000, ppem );
+
+ if ( ppem > CF2_FIXED_ONE &&
+ scaledStem <= stemWidthPer1000 )
+ scaledStem = cf2_intToFixed( 2333 );
+ }
+
+ /*
+ * Total darkening amount is computed in 1000 unit character space
+ * using the modified 5 part curve as Avalon rasterizer.
+ * The darkening amount is smaller for thicker stems.
+ * It becomes zero when the stem is thicker than 2.333 pixels.
+ *
+ * In Avalon rasterizer,
+ *
+ * darkenAmount = 0.5 pixels if scaledStem <= 0.5 pixels,
+ * darkenAmount = 0.333 pixels if 1 <= scaledStem <= 1.667 pixels,
+ * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels,
+ *
+ * and piecewise linear in-between.
+ *
+ */
+ if ( scaledStem < cf2_intToFixed( 500 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 400 ), ppem );
+
+ else if ( scaledStem < cf2_intToFixed( 1000 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 525 ), ppem ) -
+ FT_MulFix( stemWidthPer1000,
+ cf2_floatToFixed( .25 ) );
+
+ else if ( scaledStem < cf2_intToFixed( 1667 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 275 ), ppem );
+
+ else if ( scaledStem < cf2_intToFixed( 2333 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 963 ), ppem ) -
+ FT_MulFix( stemWidthPer1000,
+ cf2_floatToFixed( .413 ) );
+
+ /* use half the amount on each side and convert back to true */
+ /* character space */
+ *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );
+ }
+
+ /* add synthetic emboldening effect in character space */
+ *darkenAmount += boldenAmount / 2;
+ }
+
+
+ /* set up values for the current FontDict and matrix */
+
+ /* caller's transform is adjusted for subpixel positioning */
+ static void
+ cf2_font_setup( CF2_Font font,
+ const CF2_Matrix* transform )
+ {
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ FT_Bool needExtraSetup;
+
+ /* character space units */
+ CF2_Fixed boldenX = font->syntheticEmboldeningAmountX;
+ CF2_Fixed boldenY = font->syntheticEmboldeningAmountY;
+
+ CF2_Fixed ppem;
+
+
+ /* clear previous error */
+ font->error = FT_Err_Ok;
+
+ /* if a CID fontDict has changed, we need to recompute some cached */
+ /* data */
+ needExtraSetup =
+ (FT_Bool)( font->lastSubfont != cf2_getSubfont( decoder ) );
+
+ /* if ppem has changed, we need to recompute some cached data */
+ /* note: because of CID font matrix concatenation, ppem and transform */
+ /* do not necessarily track. */
+ ppem = cf2_getPpemY( decoder );
+ if ( font->ppem != ppem )
+ {
+ font->ppem = ppem;
+ needExtraSetup = TRUE;
+ }
+
+ /* copy hinted flag on each call */
+ font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted );
+
+ /* determine if transform has changed; */
+ /* include Fontmatrix but ignore translation */
+ if ( ft_memcmp( transform,
+ &font->currentTransform,
+ 4 * sizeof ( CF2_Fixed ) ) != 0 )
+ {
+ /* save `key' information for `cache of one' matrix data; */
+ /* save client transform, without the translation */
+ font->currentTransform = *transform;
+ font->currentTransform.tx =
+ font->currentTransform.ty = cf2_intToFixed( 0 );
+
+ /* TODO: FreeType transform is simple scalar; for now, use identity */
+ /* for outer */
+ font->innerTransform = *transform;
+ font->outerTransform.a =
+ font->outerTransform.d = cf2_intToFixed( 1 );
+ font->outerTransform.b =
+ font->outerTransform.c = cf2_intToFixed( 0 );
+
+ needExtraSetup = TRUE;
+ }
+
+ /*
+ * font->darkened is set to true if there is a stem darkening request or
+ * the font is synthetic emboldened.
+ * font->darkened controls whether to adjust blue zones, winding order,
+ * and hinting.
+ *
+ */
+ if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )
+ {
+ font->stemDarkened =
+ (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened );
+
+ /* blue zones depend on darkened flag */
+ needExtraSetup = TRUE;
+ }
+
+ /* recompute variables that are dependent on transform or FontDict or */
+ /* darken flag */
+ if ( needExtraSetup )
+ {
+ /* StdVW is found in the private dictionary; */
+ /* recompute darkening amounts whenever private dictionary or */
+ /* transform change */
+ /* Note: a rendering flag turns darkening on or off, so we want to */
+ /* store the `on' amounts; */
+ /* darkening amount is computed in character space */
+ /* TODO: testing size-dependent darkening here; */
+ /* what to do for rotations? */
+
+ CF2_Fixed emRatio;
+ CF2_Fixed stdHW;
+ CF2_Int unitsPerEm = font->unitsPerEm;
+
+
+ if ( unitsPerEm == 0 )
+ unitsPerEm = 1000;
+
+ ppem = FT_MAX( cf2_intToFixed( 4 ),
+ font->ppem ); /* use minimum ppem of 4 */
+
+#if 0
+ /* since vstem is measured in the x-direction, we use the `a' member */
+ /* of the fontMatrix */
+ emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );
+#endif
+
+ /* Freetype does not preserve the fontMatrix when parsing; use */
+ /* unitsPerEm instead. */
+ /* TODO: check precision of this */
+ emRatio = cf2_intToFixed( 1000 ) / unitsPerEm;
+ font->stdVW = cf2_getStdVW( decoder );
+
+ if ( font->stdVW <= 0 )
+ font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+
+ if ( boldenX > 0 )
+ {
+ /* Ensure that boldenX is at least 1 pixel for synthetic bold font */
+ /* (similar to what Avalon does) */
+ boldenX = FT_MAX( boldenX,
+ FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );
+
+ /* Synthetic emboldening adds at least 1 pixel to darkenX, while */
+ /* stem darkening adds at most half pixel. Since the purpose of */
+ /* stem darkening (readability at small sizes) is met with */
+ /* synthetic emboldening, no need to add stem darkening for a */
+ /* synthetic bold font. */
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdVW,
+ &font->darkenX,
+ boldenX,
+ FALSE );
+ }
+ else
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdVW,
+ &font->darkenX,
+ 0,
+ font->stemDarkened );
+
+#if 0
+ /* since hstem is measured in the y-direction, we use the `d' member */
+ /* of the fontMatrix */
+ /* TODO: use the same units per em as above; check this */
+ emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );
+#endif
+
+ /* set the default stem width, because it must be the same for all */
+ /* family members; */
+ /* choose a constant for StdHW that depends on font contrast */
+ stdHW = cf2_getStdHW( decoder );
+
+ if ( stdHW > 0 && font->stdVW > 2 * stdHW )
+ font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+ else
+ {
+ /* low contrast font gets less hstem darkening */
+ font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );
+ }
+
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdHW,
+ &font->darkenY,
+ boldenY,
+ font->stemDarkened );
+
+ if ( font->darkenX != 0 || font->darkenY != 0 )
+ font->darkened = TRUE;
+ else
+ font->darkened = FALSE;
+
+ font->reverseWinding = FALSE; /* initial expectation is CCW */
+
+ /* compute blue zones for this instance */
+ cf2_blues_init( &font->blues, font );
+ }
+ }
+
+
+ /* equivalent to AdobeGetOutline */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_getGlyphOutline( CF2_Font font,
+ CF2_Buffer charstring,
+ const CF2_Matrix* transform,
+ CF2_F16Dot16* glyphWidth )
+ {
+ FT_Error lastError = FT_Err_Ok;
+
+ FT_Vector translation;
+ int refCount = 0;
+
+#if 0
+ FT_Vector advancePoint;
+#endif
+
+ CF2_Fixed advWidth = 0;
+ FT_Bool needWinding;
+
+
+ /* Note: use both integer and fraction for outlines. This allows bbox */
+ /* to come out directly. */
+
+ translation.x = transform->tx;
+ translation.y = transform->ty;
+
+ /* set up values based on transform */
+ cf2_font_setup( font, transform );
+ if ( font->error )
+ goto exit; /* setup encountered an error */
+
+ /* reset darken direction */
+ font->reverseWinding = FALSE;
+
+ /* winding order only affects darkening */
+ needWinding = font->darkened;
+
+ while ( refCount++ < 1024)
+ {
+ /* reset output buffer */
+ cf2_outline_reset( &font->outline );
+
+ /* build the outline, passing the full translation */
+ cf2_interpT2CharString( font,
+ charstring,
+ (CF2_OutlineCallbacks)&font->outline,
+ &translation,
+ FALSE,
+ 0,
+ 0,
+ &advWidth );
+
+ if ( font->error )
+ goto exit;
+
+ if ( !needWinding )
+ break;
+
+ /* check winding order */
+ if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */
+ break;
+
+ /* invert darkening and render again */
+ /* TODO: this should be a parameter to getOutline-computeOffset */
+ font->reverseWinding = TRUE;
+
+ needWinding = FALSE; /* exit after next iteration */
+ }
+
+ /* finish storing client outline */
+ cf2_outline_close( &font->outline );
+
+ exit:
+ /* FreeType just wants the advance width; there is no translation */
+ *glyphWidth = advWidth;
+
+ /* free resources and collect errors from objects we've used */
+ cf2_setError( &font->error, lastError );
+
+ return font->error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
new file mode 100644
index 0000000000..f9dd1bbd40
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/* */
+/* cf2font.h */
+/* */
+/* Adobe's code for font instances (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FONT_H__
+#define __CF2FONT_H__
+
+
+#include "cf2ft.h"
+#include "cf2blues.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CF2_OPERAND_STACK_SIZE 48
+#define CF2_MAX_SUBR 10 /* maximum subroutine nesting */
+
+
+ /* typedef is in `cf2glue.h' */
+ struct CF2_FontRec_
+ {
+ FT_Memory memory;
+ FT_Error error; /* shared error for this instance */
+
+ CF2_RenderingFlags renderingFlags;
+
+ /* variables that depend on Transform: */
+ /* the following have zero translation; */
+ /* inner * outer = font * original */
+
+ CF2_Matrix currentTransform; /* original client matrix */
+ CF2_Matrix innerTransform; /* for hinting; erect, scaled */
+ CF2_Matrix outerTransform; /* post hinting; includes rotations */
+ CF2_Fixed ppem; /* transform-dependent */
+
+ CF2_Int unitsPerEm;
+
+ CF2_Fixed syntheticEmboldeningAmountX; /* character space units */
+ CF2_Fixed syntheticEmboldeningAmountY; /* character space units */
+
+ /* FreeType related members */
+ CF2_OutlineRec outline; /* freetype glyph outline functions */
+ CFF_Decoder* decoder;
+ CFF_SubFont lastSubfont; /* FreeType parsed data; */
+ /* top font or subfont */
+
+ /* these flags can vary from one call to the next */
+ FT_Bool hinted;
+ FT_Bool darkened; /* true if stemDarkened or synthetic bold */
+ /* i.e. darkenX != 0 || darkenY != 0 */
+ FT_Bool stemDarkened;
+
+ /* variables that depend on both FontDict and Transform */
+ CF2_Fixed stdVW; /* in character space; depends on dict entry */
+ CF2_Fixed stdHW; /* in character space; depends on dict entry */
+ CF2_Fixed darkenX; /* character space units */
+ CF2_Fixed darkenY; /* depends on transform */
+ /* and private dict (StdVW) */
+ FT_Bool reverseWinding; /* darken assuming */
+ /* counterclockwise winding */
+
+ CF2_BluesRec blues; /* computed zone data */
+ };
+
+
+ FT_LOCAL( FT_Error )
+ cf2_getGlyphOutline( CF2_Font font,
+ CF2_Buffer charstring,
+ const CF2_Matrix* transform,
+ CF2_F16Dot16* glyphWidth );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FONT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
new file mode 100644
index 0000000000..4311d10756
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
@@ -0,0 +1,639 @@
+/***************************************************************************/
+/* */
+/* cf2ft.c */
+/* */
+/* FreeType Glue Component to Adobe's Interpreter (body). */
+/* */
+/* Copyright 2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2font.h"
+#include "cf2error.h"
+
+
+#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */
+
+
+ /*
+ * This check should avoid most internal overflow cases. Clients should
+ * generally respond to `Glyph_Too_Big' by getting a glyph outline
+ * at EM size, scaling it and filling it as a graphics operation.
+ *
+ */
+ static FT_Error
+ cf2_checkTransform( const CF2_Matrix* transform,
+ CF2_Int unitsPerEm )
+ {
+ CF2_Fixed maxScale;
+
+
+ FT_ASSERT( unitsPerEm > 0 );
+
+ FT_ASSERT( transform->a > 0 && transform->d > 0 );
+ FT_ASSERT( transform->b == 0 && transform->c == 0 );
+ FT_ASSERT( transform->tx == 0 && transform->ty == 0 );
+
+ if ( unitsPerEm > 0x7FFF )
+ return FT_THROW( Glyph_Too_Big );
+
+ maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );
+
+ if ( transform->a > maxScale || transform->d > maxScale )
+ return FT_THROW( Glyph_Too_Big );
+
+ return FT_Err_Ok;
+ }
+
+
+ static void
+ cf2_setGlyphWidth( CF2_Outline outline,
+ CF2_Fixed width )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ decoder->glyph_width = cf2_fixedToInt( width );
+ }
+
+
+ /* Clean up font instance. */
+ static void
+ cf2_free_instance( void* ptr )
+ {
+ CF2_Font font = (CF2_Font)ptr;
+
+
+ if ( font )
+ {
+ FT_Memory memory = font->memory;
+
+
+ (void)memory;
+ }
+ }
+
+
+ /********************************************/
+ /* */
+ /* functions for handling client outline; */
+ /* FreeType uses coordinates in 26.6 format */
+ /* */
+ /********************************************/
+
+ static void
+ cf2_builder_moveTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+ (void)params; /* only used in debug mode */
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpMoveTo );
+
+ builder = &outline->decoder->builder;
+
+ /* note: two successive moves simply close the contour twice */
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ }
+
+
+ static void
+ cf2_builder_lineTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpLineTo );
+
+ builder = &outline->decoder->builder;
+
+ if ( !builder->path_begun )
+ {
+ /* record the move before the line; also check points and set */
+ /* `path_begun' */
+ cff_builder_start_point( builder,
+ params->pt0.x,
+ params->pt0.y );
+ }
+
+ /* `cff_builder_add_point1' includes a check_points call for one point */
+ cff_builder_add_point1( builder,
+ params->pt1.x,
+ params->pt1.y );
+ }
+
+
+ static void
+ cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpCubeTo );
+
+ builder = &outline->decoder->builder;
+
+ if ( !builder->path_begun )
+ {
+ /* record the move before the line; also check points and set */
+ /* `path_begun' */
+ cff_builder_start_point( builder,
+ params->pt0.x,
+ params->pt0.y );
+ }
+
+ /* prepare room for 3 points: 2 off-curve, 1 on-curve */
+ cff_check_points( builder, 3 );
+
+ cff_builder_add_point( builder,
+ params->pt1.x,
+ params->pt1.y, 0 );
+ cff_builder_add_point( builder,
+ params->pt2.x,
+ params->pt2.y, 0 );
+ cff_builder_add_point( builder,
+ params->pt3.x,
+ params->pt3.y, 1 );
+ }
+
+
+ static void
+ cf2_outline_init( CF2_Outline outline,
+ FT_Memory memory,
+ FT_Error* error )
+ {
+ FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );
+
+ outline->root.memory = memory;
+ outline->root.error = error;
+
+ outline->root.moveTo = cf2_builder_moveTo;
+ outline->root.lineTo = cf2_builder_lineTo;
+ outline->root.cubeTo = cf2_builder_cubeTo;
+ }
+
+
+ /* get scaling and hint flag from GlyphSlot */
+ static void
+ cf2_getScaleAndHintFlag( CFF_Decoder* decoder,
+ CF2_Fixed* x_scale,
+ CF2_Fixed* y_scale,
+ FT_Bool* hinted,
+ FT_Bool* scaled )
+ {
+ FT_ASSERT( decoder && decoder->builder.glyph );
+
+ /* note: FreeType scale includes a factor of 64 */
+ *hinted = decoder->builder.glyph->hint;
+ *scaled = decoder->builder.glyph->scaled;
+
+ if ( *hinted )
+ {
+ *x_scale = FT_DivFix( decoder->builder.glyph->x_scale,
+ cf2_intToFixed( 64 ) );
+ *y_scale = FT_DivFix( decoder->builder.glyph->y_scale,
+ cf2_intToFixed( 64 ) );
+ }
+ else
+ {
+ /* for unhinted outlines, `cff_slot_load' does the scaling, */
+ /* thus render at `unity' scale */
+
+ *x_scale = 0x0400; /* 1/64 as 16.16 */
+ *y_scale = 0x0400;
+ }
+ }
+
+
+ /* get units per em from `FT_Face' */
+ /* TODO: should handle font matrix concatenation? */
+ static FT_UShort
+ cf2_getUnitsPerEm( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->builder.face );
+ FT_ASSERT( decoder->builder.face->root.units_per_EM );
+
+ return decoder->builder.face->root.units_per_EM;
+ }
+
+
+ /* Main entry point: Render one glyph. */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len )
+ {
+ FT_Memory memory;
+ FT_Error error = FT_Err_Ok;
+ CF2_Font font;
+
+
+ FT_ASSERT( decoder && decoder->cff );
+
+ memory = decoder->builder.memory;
+
+ /* CF2 data is saved here across glyphs */
+ font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+ /* on first glyph, allocate instance structure */
+ if ( decoder->cff->cf2_instance.data == NULL )
+ {
+ decoder->cff->cf2_instance.finalizer =
+ (FT_Generic_Finalizer)cf2_free_instance;
+
+ if ( FT_ALLOC( decoder->cff->cf2_instance.data,
+ sizeof ( CF2_FontRec ) ) )
+ return FT_THROW( Out_Of_Memory );
+
+ font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+ font->memory = memory;
+
+ /* initialize a client outline, to be shared by each glyph rendered */
+ cf2_outline_init( &font->outline, font->memory, &font->error );
+ }
+
+ /* save decoder; it is a stack variable and will be different on each */
+ /* call */
+ font->decoder = decoder;
+ font->outline.decoder = decoder;
+
+ {
+ /* build parameters for Adobe engine */
+
+ CFF_Builder* builder = &decoder->builder;
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+ /* local error */
+ FT_Error error2 = FT_Err_Ok;
+ CF2_BufferRec buf;
+ CF2_Matrix transform;
+ CF2_F16Dot16 glyphWidth;
+
+ FT_Bool hinted;
+ FT_Bool scaled;
+
+
+ /* FreeType has already looked up the GID; convert to */
+ /* `RegionBuffer', assuming that the input has been validated */
+ FT_ASSERT( charstring_base + charstring_len >= charstring_base );
+
+ FT_ZERO( &buf );
+ buf.start =
+ buf.ptr = charstring_base;
+ buf.end = charstring_base + charstring_len;
+
+ FT_ZERO( &transform );
+
+ cf2_getScaleAndHintFlag( decoder,
+ &transform.a,
+ &transform.d,
+ &hinted,
+ &scaled );
+
+ font->renderingFlags = 0;
+ if ( hinted )
+ font->renderingFlags |= CF2_FlagsHinted;
+ if ( scaled && !driver->no_stem_darkening )
+ font->renderingFlags |= CF2_FlagsDarkened;
+
+ /* now get an outline for this glyph; */
+ /* also get units per em to validate scale */
+ font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );
+
+ error2 = cf2_checkTransform( &transform, font->unitsPerEm );
+ if ( error2 )
+ return error2;
+
+ error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );
+ if ( error2 )
+ return FT_ERR( Invalid_File_Format );
+
+ cf2_setGlyphWidth( &font->outline, glyphWidth );
+
+ return FT_Err_Ok;
+ }
+ }
+
+
+ /* get pointer to current FreeType subfont (based on current glyphID) */
+ FT_LOCAL_DEF( CFF_SubFont )
+ cf2_getSubfont( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return decoder->current_subfont;
+ }
+
+
+ /* get `y_ppem' from `CFF_Size' */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getPpemY( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder &&
+ decoder->builder.face &&
+ decoder->builder.face->root.size );
+ FT_ASSERT( decoder->builder.face->root.size->metrics.y_ppem );
+
+ return cf2_intToFixed(
+ decoder->builder.face->root.size->metrics.y_ppem );
+ }
+
+
+ /* get standard stem widths for the current subfont; */
+ /* FreeType stores these as integer font units */
+ /* (note: variable names seem swapped) */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getStdVW( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.standard_height );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getStdHW( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.standard_width );
+ }
+
+
+ /* note: FreeType stores 1000 times the actual value for `BlueScale' */
+ FT_LOCAL_DEF( void )
+ cf2_getBlueMetrics( CFF_Decoder* decoder,
+ CF2_Fixed* blueScale,
+ CF2_Fixed* blueShift,
+ CF2_Fixed* blueFuzz )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *blueScale = FT_DivFix(
+ decoder->current_subfont->private_dict.blue_scale,
+ cf2_intToFixed( 1000 ) );
+ *blueShift = cf2_intToFixed(
+ decoder->current_subfont->private_dict.blue_shift );
+ *blueFuzz = cf2_intToFixed(
+ decoder->current_subfont->private_dict.blue_fuzz );
+ }
+
+
+ /* get blue values counts and arrays; the FreeType parser has validated */
+ /* the counts and verified that each is an even number */
+ FT_LOCAL_DEF( void )
+ cf2_getBlueValues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_blue_values;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.blue_values;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_other_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.other_blues;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getFamilyBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_family_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.family_blues;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getFamilyOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_family_other_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.family_other_blues;
+ }
+
+
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_getLanguageGroup( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return decoder->current_subfont->private_dict.language_group;
+ }
+
+
+ /* convert unbiased subroutine index to `CF2_Buffer' and */
+ /* return 0 on success */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_initGlobalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder && decoder->globals );
+
+ FT_ZERO( buf );
+
+ idx += decoder->globals_bias;
+ if ( idx >= decoder->num_globals )
+ return TRUE; /* error */
+
+ buf->start =
+ buf->ptr = decoder->globals[idx];
+ buf->end = decoder->globals[idx + 1];
+
+ return FALSE; /* success */
+ }
+
+
+ /* convert AdobeStandardEncoding code to CF2_Buffer; */
+ /* used for seac component */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_getSeacComponent( CFF_Decoder* decoder,
+ CF2_UInt code,
+ CF2_Buffer buf )
+ {
+ CF2_Int gid;
+ FT_Byte* charstring;
+ FT_ULong len;
+ FT_Error error;
+
+
+ FT_ASSERT( decoder );
+
+ FT_ZERO( buf );
+
+ gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );
+ if ( gid < 0 )
+ return FT_THROW( Invalid_Glyph_Format );
+
+ error = cff_get_glyph_data( decoder->builder.face,
+ gid,
+ &charstring,
+ &len );
+ /* TODO: for now, just pass the FreeType error through */
+ if ( error )
+ return error;
+
+ /* assume input has been validated */
+ FT_ASSERT( charstring + len >= charstring );
+
+ buf->start = charstring;
+ buf->end = charstring + len;
+ buf->ptr = buf->start;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_freeSeacComponent( CFF_Decoder* decoder,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder );
+
+ cff_free_glyph_data( decoder->builder.face,
+ (FT_Byte**)&buf->start,
+ (FT_ULong)( buf->end - buf->start ) );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_initLocalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder && decoder->locals );
+
+ FT_ZERO( buf );
+
+ idx += decoder->locals_bias;
+ if ( idx >= decoder->num_locals )
+ return TRUE; /* error */
+
+ buf->start =
+ buf->ptr = decoder->locals[idx];
+ buf->end = decoder->locals[idx + 1];
+
+ return FALSE; /* success */
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getDefaultWidthX( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.default_width );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getNominalWidthX( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.nominal_width );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_outline_reset( CF2_Outline outline )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ outline->root.windingMomentum = 0;
+
+ FT_GlyphLoader_Rewind( decoder->builder.loader );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_outline_close( CF2_Outline outline )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ cff_builder_close_contour( &decoder->builder );
+
+ FT_GlyphLoader_Add( decoder->builder.loader );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
new file mode 100644
index 0000000000..70a0ed4db4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
@@ -0,0 +1,147 @@
+/***************************************************************************/
+/* */
+/* cf2ft.h */
+/* */
+/* FreeType Glue Component to Adobe's Interpreter (specification). */
+/* */
+/* Copyright 2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FT_H__
+#define __CF2FT_H__
+
+
+#include "cf2types.h"
+
+
+ /* TODO: disable asserts for now */
+#define CF2_NDEBUG
+
+
+#include "../../include/freetype/ftsystem.h"
+
+#include "cf2glue.h"
+#include "cffgload.h" /* for CFF_Decoder */
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ cf2_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+
+ FT_LOCAL( CFF_SubFont )
+ cf2_getSubfont( CFF_Decoder* decoder );
+
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_getPpemY( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getStdVW( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getStdHW( CFF_Decoder* decoder );
+
+ FT_LOCAL( void )
+ cf2_getBlueMetrics( CFF_Decoder* decoder,
+ CF2_Fixed* blueScale,
+ CF2_Fixed* blueShift,
+ CF2_Fixed* blueFuzz );
+ FT_LOCAL( void )
+ cf2_getBlueValues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getFamilyBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getFamilyOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+
+ FT_LOCAL( CF2_Int )
+ cf2_getLanguageGroup( CFF_Decoder* decoder );
+
+ FT_LOCAL( CF2_Int )
+ cf2_initGlobalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf );
+ FT_LOCAL( FT_Error )
+ cf2_getSeacComponent( CFF_Decoder* decoder,
+ CF2_UInt code,
+ CF2_Buffer buf );
+ FT_LOCAL( void )
+ cf2_freeSeacComponent( CFF_Decoder* decoder,
+ CF2_Buffer buf );
+ FT_LOCAL( CF2_Int )
+ cf2_initLocalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf );
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_getDefaultWidthX( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getNominalWidthX( CFF_Decoder* decoder );
+
+
+ /*
+ * FreeType client outline
+ *
+ * process output from the charstring interpreter
+ */
+ typedef struct CF2_OutlineRec_
+ {
+ CF2_OutlineCallbacksRec root; /* base class must be first */
+ CFF_Decoder* decoder;
+
+ } CF2_OutlineRec, *CF2_Outline;
+
+
+ FT_LOCAL( void )
+ cf2_outline_reset( CF2_Outline outline );
+ FT_LOCAL( void )
+ cf2_outline_close( CF2_Outline outline );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
new file mode 100644
index 0000000000..a24da39e93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
@@ -0,0 +1,144 @@
+/***************************************************************************/
+/* */
+/* cf2glue.h */
+/* */
+/* Adobe's code for shared stuff (specification only). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2GLUE_H__
+#define __CF2GLUE_H__
+
+
+/* common includes for other modules */
+#include "cf2error.h"
+#include "cf2fixed.h"
+#include "cf2arrst.h"
+#include "cf2read.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* rendering parameters */
+
+ /* apply hints to rendered glyphs */
+#define CF2_FlagsHinted 1
+ /* for testing */
+#define CF2_FlagsDarkened 2
+
+ /* type for holding the flags */
+ typedef CF2_Int CF2_RenderingFlags;
+
+
+ /* elements of a glyph outline */
+ typedef enum CF2_PathOp_
+ {
+ CF2_PathOpMoveTo = 1, /* change the current point */
+ CF2_PathOpLineTo = 2, /* line */
+ CF2_PathOpQuadTo = 3, /* quadratic curve */
+ CF2_PathOpCubeTo = 4 /* cubic curve */
+
+ } CF2_PathOp;
+
+
+ /* a matrix of fixed point values */
+ typedef struct CF2_Matrix_
+ {
+ CF2_F16Dot16 a;
+ CF2_F16Dot16 b;
+ CF2_F16Dot16 c;
+ CF2_F16Dot16 d;
+ CF2_F16Dot16 tx;
+ CF2_F16Dot16 ty;
+
+ } CF2_Matrix;
+
+
+ /* these typedefs are needed by more than one header file */
+ /* and gcc compiler doesn't allow redefinition */
+ typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font;
+ typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint;
+
+
+ /* A common structure for all callback parameters. */
+ /* */
+ /* Some members may be unused. For example, `pt0' is not used for */
+ /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */
+ /* is included for each path element for generality; curve conversions */
+ /* need it. The `op' parameter allows one function to handle multiple */
+ /* element types. */
+
+ typedef struct CF2_CallbackParamsRec_
+ {
+ FT_Vector pt0;
+ FT_Vector pt1;
+ FT_Vector pt2;
+ FT_Vector pt3;
+
+ CF2_Int op;
+
+ } CF2_CallbackParamsRec, *CF2_CallbackParams;
+
+
+ /* forward reference */
+ typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec,
+ *CF2_OutlineCallbacks;
+
+ /* callback function pointers */
+ typedef void
+ (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params );
+
+
+ struct CF2_OutlineCallbacksRec_
+ {
+ CF2_Callback_Type moveTo;
+ CF2_Callback_Type lineTo;
+ CF2_Callback_Type quadTo;
+ CF2_Callback_Type cubeTo;
+
+ CF2_Int windingMomentum; /* for winding order detection */
+
+ FT_Memory memory;
+ FT_Error* error;
+ };
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2GLUE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
new file mode 100644
index 0000000000..b3f6a04fca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
@@ -0,0 +1,1747 @@
+/***************************************************************************/
+/* */
+/* cf2hints.c */
+/* */
+/* Adobe's code for handling CFF hints (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2hints.h"
+#include "cf2intrp.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2hints
+
+
+ typedef struct CF2_HintMoveRec_
+ {
+ size_t j; /* index of upper hint map edge */
+ CF2_Fixed moveUp; /* adjustment to optimum position */
+
+ } CF2_HintMoveRec, *CF2_HintMove;
+
+
+ /* Compute angular momentum for winding order detection. It is called */
+ /* for all lines and curves, but not necessarily in element order. */
+ static CF2_Int
+ cf2_getWindingMomentum( CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2 )
+ {
+ /* cross product of pt1 position from origin with pt2 position from */
+ /* pt1; we reduce the precision so that the result fits into 32 bits */
+
+ return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -
+ ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );
+ }
+
+
+ /*
+ * Construct from a StemHint; this is used as a parameter to
+ * `cf2_blues_capture'.
+ * `hintOrigin' is the character space displacement of a seac accent.
+ * Adjust stem hint for darkening here.
+ *
+ */
+ static void
+ cf2_hint_init( CF2_Hint hint,
+ const CF2_ArrStack stemHintArray,
+ size_t indexStemHint,
+ const CF2_Font font,
+ CF2_Fixed hintOrigin,
+ CF2_Fixed scale,
+ FT_Bool bottom )
+ {
+ CF2_Fixed width;
+ const CF2_StemHintRec* stemHint;
+
+
+ FT_ZERO( hint );
+
+ stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(
+ stemHintArray,
+ indexStemHint );
+
+ width = stemHint->max - stemHint->min;
+
+ if ( width == cf2_intToFixed( -21 ) )
+ {
+ /* ghost bottom */
+
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_GhostBottom;
+ }
+ else
+ hint->flags = 0;
+ }
+
+ else if ( width == cf2_intToFixed( -20 ) )
+ {
+ /* ghost top */
+
+ if ( bottom )
+ hint->flags = 0;
+ else
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_GhostTop;
+ }
+ }
+
+ else if ( width < 0 )
+ {
+ /* inverted pair */
+
+ /*
+ * Hints with negative widths were produced by an early version of a
+ * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints
+ * with negative widths, but says
+ *
+ * All other negative widths have undefined meaning.
+ *
+ * CoolType has a silent workaround that negates the hint width; for
+ * permissive mode, we do the same here.
+ *
+ * Note: Such fonts cannot use ghost hints, but should otherwise work.
+ * Note: Some poor hints in our faux fonts can produce negative
+ * widths at some blends. For example, see a light weight of
+ * `u' in ASerifMM.
+ *
+ */
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_PairBottom;
+ }
+ else
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_PairTop;
+ }
+ }
+
+ else
+ {
+ /* normal pair */
+
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_PairBottom;
+ }
+ else
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_PairTop;
+ }
+ }
+
+ /* Now that ghost hints have been detected, adjust this edge for */
+ /* darkening. Bottoms are not changed; tops are incremented by twice */
+ /* `darkenY'. */
+ if ( cf2_hint_isTop( hint ) )
+ hint->csCoord += 2 * font->darkenY;
+
+ hint->csCoord += hintOrigin;
+ hint->scale = scale;
+ hint->index = indexStemHint; /* index in original stem hint array */
+
+ /* if original stem hint has been used, use the same position */
+ if ( hint->flags != 0 && stemHint->used )
+ {
+ if ( cf2_hint_isTop( hint ) )
+ hint->dsCoord = stemHint->maxDS;
+ else
+ hint->dsCoord = stemHint->minDS;
+
+ cf2_hint_lock( hint );
+ }
+ else
+ hint->dsCoord = FT_MulFix( hint->csCoord, scale );
+ }
+
+
+ /* initialize an invalid hint map element */
+ static void
+ cf2_hint_initZero( CF2_Hint hint )
+ {
+ FT_ZERO( hint );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isValid( const CF2_Hint hint )
+ {
+ return (FT_Bool)( hint->flags != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isPair( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairBottom | CF2_PairTop ) ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isPairTop( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isTop( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairTop | CF2_GhostTop ) ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isBottom( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isLocked( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isSynthetic( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hint_lock( CF2_Hint hint )
+ {
+ hint->flags |= CF2_Locked;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmap_init( CF2_HintMap hintmap,
+ CF2_Font font,
+ CF2_HintMap initialMap,
+ CF2_ArrStack hintMoves,
+ CF2_Fixed scale )
+ {
+ FT_ZERO( hintmap );
+
+ /* copy parameters from font instance */
+ hintmap->hinted = font->hinted;
+ hintmap->scale = scale;
+ hintmap->font = font;
+ hintmap->initialHintMap = initialMap;
+ /* will clear in `cf2_hintmap_adjustHints' */
+ hintmap->hintMoves = hintMoves;
+ }
+
+
+ static FT_Bool
+ cf2_hintmap_isValid( const CF2_HintMap hintmap )
+ {
+ return hintmap->isValid;
+ }
+
+
+ /* transform character space coordinate to device space using hint map */
+ static CF2_Fixed
+ cf2_hintmap_map( CF2_HintMap hintmap,
+ CF2_Fixed csCoord )
+ {
+ FT_ASSERT( hintmap->isValid ); /* must call Build before Map */
+ FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
+
+ if ( hintmap->count == 0 || ! hintmap->hinted )
+ {
+ /* there are no hints; use uniform scale and zero offset */
+ return FT_MulFix( csCoord, hintmap->scale );
+ }
+ else
+ {
+ /* start linear search from last hit */
+ CF2_UInt i = hintmap->lastIndex;
+
+
+ /* search up */
+ while ( i < hintmap->count - 1 &&
+ csCoord >= hintmap->edge[i + 1].csCoord )
+ i += 1;
+
+ /* search down */
+ while ( i > 0 && csCoord < hintmap->edge[i].csCoord )
+ i -= 1;
+
+ hintmap->lastIndex = i;
+
+ if ( i == 0 && csCoord < hintmap->edge[0].csCoord )
+ {
+ /* special case for points below first edge: use uniform scale */
+ return FT_MulFix( csCoord - hintmap->edge[0].csCoord,
+ hintmap->scale ) +
+ hintmap->edge[0].dsCoord;
+ }
+ else
+ {
+ /*
+ * Note: entries with duplicate csCoord are allowed.
+ * Use edge[i], the highest entry where csCoord >= entry[i].csCoord
+ */
+ return FT_MulFix( csCoord - hintmap->edge[i].csCoord,
+ hintmap->edge[i].scale ) +
+ hintmap->edge[i].dsCoord;
+ }
+ }
+ }
+
+
+ /*
+ * This hinting policy moves a hint pair in device space so that one of
+ * its two edges is on a device pixel boundary (its fractional part is
+ * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS
+ * space. Ensure here that there is no overlap in DS.
+ *
+ * In the first pass, edges are adjusted relative to adjacent hints.
+ * Those that are below have already been adjusted. Those that are
+ * above have not yet been adjusted. If a hint above blocks an
+ * adjustment to an optimal position, we will try again in a second
+ * pass. The second pass is top-down.
+ *
+ */
+
+ static void
+ cf2_hintmap_adjustHints( CF2_HintMap hintmap )
+ {
+ size_t i, j;
+
+
+ cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */
+
+ /*
+ * First pass is bottom-up (font hint order) without look-ahead.
+ * Locked edges are already adjusted.
+ * Unlocked edges begin with dsCoord from `initialHintMap'.
+ * Save edges that are not optimally adjusted in `hintMoves' array,
+ * and process them in second pass.
+ */
+
+ for ( i = 0; i < hintmap->count; i++ )
+ {
+ FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] );
+
+
+ /* index of upper edge (same value for ghost hint) */
+ j = isPair ? i + 1 : i;
+
+ FT_ASSERT( j < hintmap->count );
+ FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );
+ FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );
+ FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==
+ cf2_hint_isLocked( &hintmap->edge[j] ) );
+
+ if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )
+ {
+ /* hint edge is not locked, we can adjust it */
+ CF2_Fixed fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );
+ CF2_Fixed fracUp = cf2_fixedFraction( hintmap->edge[j].dsCoord );
+
+ /* calculate all four possibilities; moves down are negative */
+ CF2_Fixed downMoveDown = 0 - fracDown;
+ CF2_Fixed upMoveDown = 0 - fracUp;
+ CF2_Fixed downMoveUp = fracDown == 0
+ ? 0
+ : cf2_intToFixed( 1 ) - fracDown;
+ CF2_Fixed upMoveUp = fracUp == 0
+ ? 0
+ : cf2_intToFixed( 1 ) - fracUp;
+
+ /* smallest move up */
+ CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp );
+ /* smallest move down */
+ CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown );
+
+ /* final amount to move edge or edge pair */
+ CF2_Fixed move;
+
+ CF2_Fixed downMinCounter = CF2_MIN_COUNTER;
+ CF2_Fixed upMinCounter = CF2_MIN_COUNTER;
+ FT_Bool saveEdge = FALSE;
+
+
+ /* minimum counter constraint doesn't apply when adjacent edges */
+ /* are synthetic */
+ /* TODO: doesn't seem a big effect; for now, reduce the code */
+#if 0
+ if ( i == 0 ||
+ cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )
+ downMinCounter = 0;
+
+ if ( j >= hintmap->count - 1 ||
+ cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )
+ upMinCounter = 0;
+#endif
+
+ /* is there room to move up? */
+ /* there is if we are at top of array or the next edge is at or */
+ /* beyond proposed move up? */
+ if ( j >= hintmap->count - 1 ||
+ hintmap->edge[j + 1].dsCoord >=
+ hintmap->edge[j].dsCoord + moveUp + upMinCounter )
+ {
+ /* there is room to move up; is there also room to move down? */
+ if ( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <=
+ hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+ {
+ /* move smaller absolute amount */
+ move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */
+ }
+ else
+ move = moveUp;
+ }
+ else
+ {
+ /* is there room to move down? */
+ if ( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <=
+ hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+ {
+ move = moveDown;
+ /* true if non-optimum move */
+ saveEdge = (FT_Bool)( moveUp < -moveDown );
+ }
+ else
+ {
+ /* no room to move either way without overlapping or reducing */
+ /* the counter too much */
+ move = 0;
+ saveEdge = TRUE;
+ }
+ }
+
+ /* Identify non-moves and moves down that aren't optimal, and save */
+ /* them for second pass. */
+ /* Do this only if there is an unlocked edge above (which could */
+ /* possibly move). */
+ if ( saveEdge &&
+ j < hintmap->count - 1 &&
+ !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )
+ {
+ CF2_HintMoveRec savedMove;
+
+
+ savedMove.j = j;
+ /* desired adjustment in second pass */
+ savedMove.moveUp = moveUp - move;
+
+ cf2_arrstack_push( hintmap->hintMoves, &savedMove );
+ }
+
+ /* move the edge(s) */
+ hintmap->edge[i].dsCoord += move;
+ if ( isPair )
+ hintmap->edge[j].dsCoord += move;
+ }
+
+ /* assert there are no overlaps in device space */
+ FT_ASSERT( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );
+ FT_ASSERT( i < j ||
+ hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );
+
+ /* adjust the scales, avoiding divide by zero */
+ if ( i > 0 )
+ {
+ if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )
+ hintmap->edge[i - 1].scale =
+ FT_DivFix(
+ hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,
+ hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );
+ }
+
+ if ( isPair )
+ {
+ if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )
+ hintmap->edge[j - 1].scale =
+ FT_DivFix(
+ hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,
+ hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );
+
+ i += 1; /* skip upper edge on next loop */
+ }
+ }
+
+ /* second pass tries to move non-optimal hints up, in case there is */
+ /* room now */
+ for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )
+ {
+ CF2_HintMove hintMove = (CF2_HintMove)
+ cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );
+
+
+ j = hintMove->j;
+
+ /* this was tested before the push, above */
+ FT_ASSERT( j < hintmap->count - 1 );
+
+ /* is there room to move up? */
+ if ( hintmap->edge[j + 1].dsCoord >=
+ hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
+ {
+ /* there is more room now, move edge up */
+ hintmap->edge[j].dsCoord += hintMove->moveUp;
+
+ if ( cf2_hint_isPair( &hintmap->edge[j] ) )
+ {
+ FT_ASSERT( j > 0 );
+ hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
+ }
+ }
+ }
+ }
+
+
+ /* insert hint edges into map, sorted by csCoord */
+ static void
+ cf2_hintmap_insertHint( CF2_HintMap hintmap,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge )
+ {
+ CF2_UInt indexInsert;
+
+ /* set default values, then check for edge hints */
+ FT_Bool isPair = TRUE;
+ CF2_Hint firstHintEdge = bottomHintEdge;
+ CF2_Hint secondHintEdge = topHintEdge;
+
+
+ /* one or none of the input params may be invalid when dealing with */
+ /* edge hints; at least one edge must be valid */
+ FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||
+ cf2_hint_isValid( topHintEdge ) );
+
+ /* determine how many and which edges to insert */
+ if ( !cf2_hint_isValid( bottomHintEdge ) )
+ {
+ /* insert only the top edge */
+ firstHintEdge = topHintEdge;
+ isPair = FALSE;
+ }
+ else if ( !cf2_hint_isValid( topHintEdge ) )
+ {
+ /* insert only the bottom edge */
+ isPair = FALSE;
+ }
+
+ /* paired edges must be in proper order */
+ FT_ASSERT( !isPair ||
+ topHintEdge->csCoord >= bottomHintEdge->csCoord );
+
+ /* linear search to find index value of insertion point */
+ indexInsert = 0;
+ for ( ; indexInsert < hintmap->count; indexInsert++ )
+ {
+ if ( hintmap->edge[indexInsert].csCoord > firstHintEdge->csCoord )
+ break;
+ }
+
+ /*
+ * Discard any hints that overlap in character space. Most often,
+ * this is while building the initial map, but in theory, it can also
+ * occur because of darkening.
+ *
+ */
+ if ( indexInsert < hintmap->count )
+ {
+ /* we are inserting before an existing edge: */
+ /* verify that a new pair does not straddle the next edge */
+ if ( isPair &&
+ hintmap->edge[indexInsert].csCoord < secondHintEdge->csCoord )
+ return; /* ignore overlapping stem hint */
+
+ /* verify that we are not inserting between paired edges */
+ if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )
+ return; /* ignore overlapping stem hint */
+ }
+
+ /* recompute device space locations using initial hint map */
+ if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&
+ !cf2_hint_isLocked( firstHintEdge ) )
+ {
+ if ( isPair )
+ {
+ /* Use hint map to position the center of stem, and nominal scale */
+ /* to position the two edges. This preserves the stem width. */
+ CF2_Fixed midpoint = cf2_hintmap_map(
+ hintmap->initialHintMap,
+ ( secondHintEdge->csCoord +
+ firstHintEdge->csCoord ) / 2 );
+ CF2_Fixed halfWidth = FT_MulFix(
+ ( secondHintEdge->csCoord -
+ firstHintEdge->csCoord ) / 2,
+ hintmap->scale );
+
+
+ firstHintEdge->dsCoord = midpoint - halfWidth;
+ secondHintEdge->dsCoord = midpoint + halfWidth;
+ }
+ else
+ firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
+ firstHintEdge->csCoord );
+ }
+
+ /* discard any hints that overlap in device space; this can occur */
+ /* because locked hints have been moved to align with blue zones */
+ if ( indexInsert > 0 )
+ {
+ /* we are inserting after an existing edge */
+ if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )
+ return;
+ }
+
+ if ( indexInsert < hintmap->count )
+ {
+ /* we are inserting before an existing edge */
+ if ( isPair )
+ {
+ if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+ return;
+ }
+ else
+ {
+ if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+ return;
+ }
+ }
+
+ /* make room to insert */
+ {
+ CF2_Int iSrc = hintmap->count - 1;
+ CF2_Int iDst = isPair ? hintmap->count + 1 : hintmap->count;
+
+ CF2_Int count = hintmap->count - indexInsert;
+
+
+ if ( iDst >= CF2_MAX_HINT_EDGES )
+ {
+ FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" ));
+ return;
+ }
+
+ while ( count-- )
+ hintmap->edge[iDst--] = hintmap->edge[iSrc--];
+
+ /* insert first edge */
+ hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */
+ hintmap->count += 1;
+
+ if ( isPair )
+ {
+ /* insert second edge */
+ hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */
+ hintmap->count += 1;
+ }
+ }
+
+ return;
+ }
+
+
+ /*
+ * Build a map from hints and mask.
+ *
+ * This function may recur one level if `hintmap->initialHintMap' is not yet
+ * valid.
+ * If `initialMap' is true, simply build initial map.
+ *
+ * Synthetic hints are used in two ways. A hint at zero is inserted, if
+ * needed, in the initial hint map, to prevent translations from
+ * propagating across the origin. If synthetic em box hints are enabled
+ * for ideographic dictionaries, then they are inserted in all hint
+ * maps, including the initial one.
+ *
+ */
+ FT_LOCAL_DEF( void )
+ cf2_hintmap_build( CF2_HintMap hintmap,
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ FT_Bool initialMap )
+ {
+ FT_Byte* maskPtr;
+ FT_Byte* maskEndPtr; // add by Xiaochuan_Liu
+
+ CF2_Font font = hintmap->font;
+ CF2_HintMaskRec tempHintMask;
+
+ size_t bitCount, i;
+ FT_Byte maskByte;
+
+
+ /* check whether initial map is constructed */
+ if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )
+ {
+ /* make recursive call with initialHintMap and temporary mask; */
+ /* temporary mask will get all bits set, below */
+ cf2_hintmask_init( &tempHintMask, hintMask->error );
+ cf2_hintmap_build( hintmap->initialHintMap,
+ hStemHintArray,
+ vStemHintArray,
+ &tempHintMask,
+ hintOrigin,
+ TRUE );
+ }
+
+ if ( !cf2_hintmask_isValid( hintMask ) )
+ {
+ /* without a hint mask, assume all hints are active */
+ cf2_hintmask_setAll( hintMask,
+ cf2_arrstack_size( hStemHintArray ) +
+ cf2_arrstack_size( vStemHintArray ) );
+ }
+
+ /* begin by clearing the map */
+ hintmap->count = 0;
+ hintmap->lastIndex = 0;
+
+ /* make a copy of the hint mask so we can modify it */
+ tempHintMask = *hintMask;
+ maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
+ maskEndPtr = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+
+ /* use the hStem hints only, which are first in the mask */
+ /* TODO: compare this to cffhintmaskGetBitCount */
+ bitCount = cf2_arrstack_size( hStemHintArray );
+
+ /* synthetic embox hints get highest priority */
+ if ( font->blues.doEmBoxHints )
+ {
+ CF2_HintRec dummy;
+
+
+ cf2_hint_initZero( &dummy ); /* invalid hint map element */
+
+ /* ghost bottom */
+ cf2_hintmap_insertHint( hintmap,
+ &font->blues.emBoxBottomEdge,
+ &dummy );
+ /* ghost top */
+ cf2_hintmap_insertHint( hintmap,
+ &dummy,
+ &font->blues.emBoxTopEdge );
+ }
+
+ /* insert hints captured by a blue zone or already locked (higher */
+ /* priority) */
+ for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+ {
+ if ( maskByte & *maskPtr )
+ {
+ /* expand StemHint into two `CF2_Hint' elements */
+ CF2_HintRec bottomHintEdge, topHintEdge;
+
+
+ cf2_hint_init( &bottomHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ TRUE /* bottom */ );
+ cf2_hint_init( &topHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ FALSE /* top */ );
+
+ if ( cf2_hint_isLocked( &bottomHintEdge ) ||
+ cf2_hint_isLocked( &topHintEdge ) ||
+ cf2_blues_capture( &font->blues,
+ &bottomHintEdge,
+ &topHintEdge ) )
+ {
+ /* insert captured hint into map */
+ cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+
+ *maskPtr &= ~maskByte; /* turn off the bit for this hint */
+ }
+ }
+
+ if ( ( i & 7 ) == 7 )
+ {
+ /* move to next mask byte */
+ maskPtr++;
+ if (maskEndPtr >= maskEndPtr)
+ {
+ break;
+ }
+
+ maskByte = 0x80;
+ }
+ else
+ maskByte >>= 1;
+ }
+
+ /* initial hint map includes only captured hints plus maybe one at 0 */
+
+ /*
+ * TODO: There is a problem here because we are trying to build a
+ * single hint map containing all captured hints. It is
+ * possible for there to be conflicts between captured hints,
+ * either because of darkening or because the hints are in
+ * separate hint zones (we are ignoring hint zones for the
+ * initial map). An example of the latter is MinionPro-Regular
+ * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.
+ * A stem hint for the psili conflicts with the top edge hint
+ * for the base character. The stem hint gets priority because
+ * of its sort order. In glyph 884 (Greek Capital Alpha with
+ * Psili and Oxia), the top of the base character gets a stem
+ * hint, and the psili does not. This creates different initial
+ * maps for the two glyphs resulting in different renderings of
+ * the base character. Will probably defer this either as not
+ * worth the cost or as a font bug. I don't think there is any
+ * good reason for an accent to be captured by an alignment
+ * zone. -darnold 2/12/10
+ */
+
+ if ( initialMap )
+ {
+ /* Apply a heuristic that inserts a point for (0,0), unless it's */
+ /* already covered by a mapping. This locks the baseline for glyphs */
+ /* that have no baseline hints. */
+
+ if ( hintmap->count == 0 ||
+ hintmap->edge[0].csCoord > 0 ||
+ hintmap->edge[hintmap->count - 1].csCoord < 0 )
+ {
+ /* all edges are above 0 or all edges are below 0; */
+ /* construct a locked edge hint at 0 */
+
+ CF2_HintRec edge, invalid;
+
+
+ cf2_hint_initZero( &edge );
+
+ edge.flags = CF2_GhostBottom |
+ CF2_Locked |
+ CF2_Synthetic;
+ edge.scale = hintmap->scale;
+
+ cf2_hint_initZero( &invalid );
+ cf2_hintmap_insertHint( hintmap, &edge, &invalid );
+ }
+ }
+ else
+ {
+ /* insert remaining hints */
+
+ maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
+ maskEndPtr = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+ for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+ {
+ if ( maskByte & *maskPtr )
+ {
+ CF2_HintRec bottomHintEdge, topHintEdge;
+
+
+ cf2_hint_init( &bottomHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ TRUE /* bottom */ );
+ cf2_hint_init( &topHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ FALSE /* top */ );
+
+ cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+ }
+
+ if ( ( i & 7 ) == 7 )
+ {
+ /* move to next mask byte */
+ maskPtr++;
+ if (maskPtr >= maskEndPtr)
+ {
+ break;
+ }
+ maskByte = 0x80;
+ }
+ else
+ maskByte >>= 1;
+ }
+ }
+
+ /*
+ * Note: The following line is a convenient place to break when
+ * debugging hinting. Examine `hintmap->edge' for the list of
+ * enabled hints, then step over the call to see the effect of
+ * adjustment. We stop here first on the recursive call that
+ * creates the initial map, and then on each counter group and
+ * hint zone.
+ */
+
+ /* adjust positions of hint edges that are not locked to blue zones */
+ cf2_hintmap_adjustHints( hintmap );
+
+ /* save the position of all hints that were used in this hint map; */
+ /* if we use them again, we'll locate them in the same position */
+ if ( !initialMap )
+ {
+ for ( i = 0; i < hintmap->count; i++ )
+ {
+ if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )
+ {
+ /* Note: include both valid and invalid edges */
+ /* Note: top and bottom edges are copied back separately */
+ CF2_StemHint stemhint = (CF2_StemHint)
+ cf2_arrstack_getPointer( hStemHintArray,
+ hintmap->edge[i].index );
+
+
+ if ( cf2_hint_isTop( &hintmap->edge[i] ) )
+ stemhint->maxDS = hintmap->edge[i].dsCoord;
+ else
+ stemhint->minDS = hintmap->edge[i].dsCoord;
+
+ stemhint->used = TRUE;
+ }
+ }
+ }
+
+ /* hint map is ready to use */
+ hintmap->isValid = TRUE;
+
+ /* remember this mask has been used */
+ cf2_hintmask_setNew( hintMask, FALSE );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_init( CF2_GlyphPath glyphpath,
+ CF2_Font font,
+ CF2_OutlineCallbacks callbacks,
+ CF2_Fixed scaleY,
+ /* CF2_Fixed hShift, */
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOriginY,
+ const CF2_Blues blues,
+ const FT_Vector* fractionalTranslation )
+ {
+ FT_ZERO( glyphpath );
+
+ glyphpath->font = font;
+ glyphpath->callbacks = callbacks;
+
+ cf2_arrstack_init( &glyphpath->hintMoves,
+ font->memory,
+ &font->error,
+ sizeof ( CF2_HintMoveRec ) );
+
+ cf2_hintmap_init( &glyphpath->initialHintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+ cf2_hintmap_init( &glyphpath->firstHintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+ cf2_hintmap_init( &glyphpath->hintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+
+ glyphpath->scaleX = font->innerTransform.a;
+ glyphpath->scaleC = font->innerTransform.c;
+ glyphpath->scaleY = font->innerTransform.d;
+
+ glyphpath->fractionalTranslation = *fractionalTranslation;
+
+#if 0
+ glyphpath->hShift = hShift; /* for fauxing */
+#endif
+
+ glyphpath->hStemHintArray = hStemHintArray;
+ glyphpath->vStemHintArray = vStemHintArray;
+ glyphpath->hintMask = hintMask; /* ptr to current mask */
+ glyphpath->hintOriginY = hintOriginY;
+ glyphpath->blues = blues;
+ glyphpath->darken = font->darkened; /* TODO: should we make copies? */
+ glyphpath->xOffset = font->darkenX;
+ glyphpath->yOffset = font->darkenY;
+ glyphpath->miterLimit = 2 * FT_MAX(
+ cf2_fixedAbs( glyphpath->xOffset ),
+ cf2_fixedAbs( glyphpath->yOffset ) );
+
+ /* .1 character space unit */
+ glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
+
+ glyphpath->moveIsPending = TRUE;
+ glyphpath->pathIsOpen = FALSE;
+ glyphpath->elemIsQueued = FALSE;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_finalize( CF2_GlyphPath glyphpath )
+ {
+ cf2_arrstack_finalize( &glyphpath->hintMoves );
+ }
+
+
+ /*
+ * Hint point in y-direction and apply outerTransform.
+ * Input `current' hint map (which is actually delayed by one element).
+ * Input x,y point in Character Space.
+ * Output x,y point in Device Space, including translation.
+ */
+ static void
+ cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath,
+ CF2_HintMap hintmap,
+ FT_Vector* ppt,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ FT_Vector pt; /* hinted point in upright DS */
+
+
+ pt.x = FT_MulFix( glyphpath->scaleX, x ) +
+ FT_MulFix( glyphpath->scaleC, y );
+ pt.y = cf2_hintmap_map( hintmap, y );
+
+ ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x ) +
+ FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +
+ glyphpath->fractionalTranslation.x;
+ ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x ) +
+ FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +
+ glyphpath->fractionalTranslation.y;
+ }
+
+
+ /*
+ * From two line segments, (u1,u2) and (v1,v2), compute a point of
+ * intersection on the corresponding lines.
+ * Return false if no intersection is found, or if the intersection is
+ * too far away from the ends of the line segments, u2 and v1.
+ *
+ */
+ static FT_Bool
+ cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath,
+ const FT_Vector* u1,
+ const FT_Vector* u2,
+ const FT_Vector* v1,
+ const FT_Vector* v2,
+ FT_Vector* intersection )
+ {
+ /*
+ * Let `u' be a zero-based vector from the first segment, `v' from the
+ * second segment.
+ * Let `w 'be the zero-based vector from `u1' to `v1'.
+ * `perp' is the `perpendicular dot product'; see
+ * http://mathworld.wolfram.com/PerpDotProduct.html.
+ * `s' is the parameter for the parametric line for the first segment
+ * (`u').
+ *
+ * See notation in
+ * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.
+ * Calculations are done in 16.16, but must handle the squaring of
+ * line lengths in character space. We scale all vectors by 1/32 to
+ * avoid overflow. This allows values up to 4095 to be squared. The
+ * scale factor cancels in the divide.
+ *
+ * TODO: the scale factor could be computed from UnitsPerEm.
+ *
+ */
+
+#define cf2_perp( a, b ) \
+ ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )
+
+ /* round and divide by 32 */
+#define CF2_CS_SCALE( x ) \
+ ( ( (x) + 0x10 ) >> 5 )
+
+ FT_Vector u, v, w; /* scaled vectors */
+ CF2_Fixed denominator, s;
+
+
+ u.x = CF2_CS_SCALE( u2->x - u1->x );
+ u.y = CF2_CS_SCALE( u2->y - u1->y );
+ v.x = CF2_CS_SCALE( v2->x - v1->x );
+ v.y = CF2_CS_SCALE( v2->y - v1->y );
+ w.x = CF2_CS_SCALE( v1->x - u1->x );
+ w.y = CF2_CS_SCALE( v1->y - u1->y );
+
+ denominator = cf2_perp( u, v );
+
+ if ( denominator == 0 )
+ return FALSE; /* parallel or coincident lines */
+
+ s = FT_DivFix( cf2_perp( w, v ), denominator );
+
+ intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );
+ intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );
+
+ /*
+ * Special case snapping for horizontal and vertical lines.
+ * This cleans up intersections and reduces problems with winding
+ * order detection.
+ * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.
+ * Note: these calculations are in character space.
+ *
+ */
+
+ if ( u1->x == u2->x &&
+ cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
+ intersection->x = u1->x;
+ if ( u1->y == u2->y &&
+ cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
+ intersection->y = u1->y;
+
+ if ( v1->x == v2->x &&
+ cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
+ intersection->x = v1->x;
+ if ( v1->y == v2->y &&
+ cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )
+ intersection->y = v1->y;
+
+ /* limit the intersection distance from midpoint of u2 and v1 */
+ if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >
+ glyphpath->miterLimit ||
+ cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >
+ glyphpath->miterLimit )
+ return FALSE;
+
+ return TRUE;
+ }
+
+
+ /*
+ * Push the cached element (glyphpath->prevElem*) to the outline
+ * consumer. When a darkening offset is used, the end point of the
+ * cached element may be adjusted to an intersection point or it may be
+ * connected by a line to the current element. This calculation must
+ * use a HintMap that was valid at the time the element was saved. For
+ * the first point in a subpath, that is a saved HintMap. For most
+ * elements, it just means the caller has delayed building a HintMap
+ * from the current HintMask.
+ *
+ * Transform each point with outerTransform and call the outline
+ * callbacks. This is a general 3x3 transform:
+ *
+ * x' = a*x + c*y + tx, y' = b*x + d*y + ty
+ *
+ * but it uses 4 elements from CF2_Font and the translation part
+ * from CF2_GlyphPath.
+ *
+ */
+ static void
+ cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath,
+ CF2_HintMap hintmap,
+ FT_Vector* nextP0,
+ FT_Vector nextP1,
+ FT_Bool close )
+ {
+ CF2_CallbackParamsRec params;
+
+ FT_Vector* prevP0;
+ FT_Vector* prevP1;
+
+ FT_Vector intersection = { 0, 0 };
+ FT_Bool useIntersection = FALSE;
+
+
+ FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||
+ glyphpath->prevElemOp == CF2_PathOpCubeTo );
+
+ if ( glyphpath->prevElemOp == CF2_PathOpLineTo )
+ {
+ prevP0 = &glyphpath->prevElemP0;
+ prevP1 = &glyphpath->prevElemP1;
+ }
+ else
+ {
+ prevP0 = &glyphpath->prevElemP2;
+ prevP1 = &glyphpath->prevElemP3;
+ }
+
+ /* optimization: if previous and next elements are offset by the same */
+ /* amount, then there will be no gap, and no need to compute an */
+ /* intersection. */
+ if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )
+ {
+ /* previous element does not join next element: */
+ /* adjust end point of previous element to the intersection */
+ useIntersection = cf2_glyphpath_computeIntersection( glyphpath,
+ prevP0,
+ prevP1,
+ nextP0,
+ &nextP1,
+ &intersection );
+ if ( useIntersection )
+ {
+ /* modify the last point of the cached element (either line or */
+ /* curve) */
+ *prevP1 = intersection;
+ }
+ }
+
+ params.pt0 = glyphpath->currentDS;
+
+ switch( glyphpath->prevElemOp )
+ {
+ case CF2_PathOpLineTo:
+ params.op = CF2_PathOpLineTo;
+
+ /* note: pt2 and pt3 are unused */
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ glyphpath->prevElemP1.x,
+ glyphpath->prevElemP1.y );
+
+ glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+
+ break;
+
+ case CF2_PathOpCubeTo:
+ params.op = CF2_PathOpCubeTo;
+
+ /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ glyphpath->prevElemP1.x,
+ glyphpath->prevElemP1.y );
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt2,
+ glyphpath->prevElemP2.x,
+ glyphpath->prevElemP2.y );
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt3,
+ glyphpath->prevElemP3.x,
+ glyphpath->prevElemP3.y );
+
+ glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt3;
+
+ break;
+ }
+
+ if ( !useIntersection || close )
+ {
+ /* insert connecting line between end of previous element and start */
+ /* of current one */
+ /* note: at the end of a subpath, we might do both, so use `nextP0' */
+ /* before we change it, below */
+
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ nextP0->x,
+ nextP0->y );
+
+ if ( params.pt1.x != glyphpath->currentDS.x ||
+ params.pt1.y != glyphpath->currentDS.y )
+ {
+ /* length is nonzero */
+ params.op = CF2_PathOpLineTo;
+ params.pt0 = glyphpath->currentDS;
+
+ /* note: pt2 and pt3 are unused */
+ glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+ }
+ }
+
+ if ( useIntersection )
+ {
+ /* return intersection point to caller */
+ *nextP0 = intersection;
+ }
+ }
+
+
+ /* push a MoveTo element based on current point and offset of current */
+ /* element */
+ static void
+ cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath,
+ FT_Vector start )
+ {
+ CF2_CallbackParamsRec params;
+
+
+ params.op = CF2_PathOpMoveTo;
+ params.pt0 = glyphpath->currentDS;
+
+ /* Test if move has really happened yet; it would have called */
+ /* `cf2_hintmap_build' to set `isValid'. */
+ if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )
+ {
+ /* we are here iff first subpath is missing a moveto operator: */
+ /* synthesize first moveTo to finish initialization of hintMap */
+ cf2_glyphpath_moveTo( glyphpath,
+ glyphpath->start.x,
+ glyphpath->start.y );
+ }
+
+ cf2_glyphpath_hintPoint( glyphpath,
+ &glyphpath->hintMap,
+ &params.pt1,
+ start.x,
+ start.y );
+
+ /* note: pt2 and pt3 are unused */
+ glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+ glyphpath->offsetStart0 = start;
+ }
+
+
+ /*
+ * All coordinates are in character space.
+ * On input, (x1, y1) and (x2, y2) give line segment.
+ * On output, (x, y) give offset vector.
+ * We use a piecewise approximation to trig functions.
+ *
+ * TODO: Offset true perpendicular and proper length
+ * supply the y-translation for hinting here, too,
+ * that adds yOffset unconditionally to *y.
+ */
+ static void
+ cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed* x,
+ CF2_Fixed* y )
+ {
+ CF2_Fixed dx = x2 - x1;
+ CF2_Fixed dy = y2 - y1;
+
+
+ /* note: negative offsets don't work here; negate deltas to change */
+ /* quadrants, below */
+ if ( glyphpath->font->reverseWinding )
+ {
+ dx = -dx;
+ dy = -dy;
+ }
+
+ *x = *y = 0;
+
+ if ( !glyphpath->darken )
+ return;
+
+ /* add momentum for this path element */
+ glyphpath->callbacks->windingMomentum +=
+ cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+ /* note: allow mixed integer and fixed multiplication here */
+ if ( dx >= 0 )
+ {
+ if ( dy >= 0 )
+ {
+ /* first quadrant, +x +y */
+
+ if ( dx > 2 * dy )
+ {
+ /* +x */
+ *x = 0;
+ *y = 0;
+ }
+ else if ( dy > 2 * dx )
+ {
+ /* +y */
+ *x = glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* +x +y */
+ *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ else
+ {
+ /* fourth quadrant, +x -y */
+
+ if ( dx > -2 * dy )
+ {
+ /* +x */
+ *x = 0;
+ *y = 0;
+ }
+ else if ( -dy > 2 * dx )
+ {
+ /* -y */
+ *x = -glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* +x -y */
+ *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ }
+ else
+ {
+ if ( dy >= 0 )
+ {
+ /* second quadrant, -x +y */
+
+ if ( -dx > 2 * dy )
+ {
+ /* -x */
+ *x = 0;
+ *y = 2 * glyphpath->yOffset;
+ }
+ else if ( dy > -2 * dx )
+ {
+ /* +y */
+ *x = glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* -x +y */
+ *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ else
+ {
+ /* third quadrant, -x -y */
+
+ if ( -dx > -2 * dy )
+ {
+ /* -x */
+ *x = 0;
+ *y = 2 * glyphpath->yOffset;
+ }
+ else if ( -dy > -2 * dx )
+ {
+ /* -y */
+ *x = -glyphpath->xOffset;
+ *y = glyphpath->xOffset;
+ }
+ else
+ {
+ /* -x -y */
+ *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ cf2_glyphpath_closeOpenPath( glyphpath );
+
+ /* save the parameters of the move for later, when we'll know how to */
+ /* offset it; */
+ /* also save last move point */
+ glyphpath->currentCS.x = glyphpath->start.x = x;
+ glyphpath->currentCS.y = glyphpath->start.y = y;
+
+ glyphpath->moveIsPending = TRUE;
+
+ /* ensure we have a valid map with current mask */
+ if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||
+ cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ /* save a copy of current HintMap to use when drawing initial point */
+ glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ CF2_Fixed xOffset, yOffset;
+ FT_Vector P0, P1;
+
+
+ /* can't compute offset of zero length line, so ignore them */
+ if ( glyphpath->currentCS.x == x && glyphpath->currentCS.y == y )
+ return;
+
+ cf2_glyphpath_computeOffset( glyphpath,
+ glyphpath->currentCS.x,
+ glyphpath->currentCS.y,
+ x,
+ y,
+ &xOffset,
+ &yOffset );
+
+ /* construct offset points */
+ P0.x = glyphpath->currentCS.x + xOffset;
+ P0.y = glyphpath->currentCS.y + yOffset;
+ P1.x = x + xOffset;
+ P1.y = y + yOffset;
+
+ if ( glyphpath->moveIsPending )
+ {
+ /* emit offset 1st point as MoveTo */
+ cf2_glyphpath_pushMove( glyphpath, P0 );
+
+ glyphpath->moveIsPending = FALSE; /* adjust state machine */
+ glyphpath->pathIsOpen = TRUE;
+
+ glyphpath->offsetStart1 = P1; /* record second point */
+ }
+
+ if ( glyphpath->elemIsQueued )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->hintMap,
+ &P0,
+ P1,
+ FALSE );
+ }
+
+ /* queue the current element with offset points */
+ glyphpath->elemIsQueued = TRUE;
+ glyphpath->prevElemOp = CF2_PathOpLineTo;
+ glyphpath->prevElemP0 = P0;
+ glyphpath->prevElemP1 = P1;
+
+ /* update current map */
+ if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ glyphpath->currentCS.x = x; /* pre-offset current point */
+ glyphpath->currentCS.y = y;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed x3,
+ CF2_Fixed y3 )
+ {
+ CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3;
+ FT_Vector P0, P1, P2, P3;
+
+
+ /* TODO: ignore zero length portions of curve?? */
+ cf2_glyphpath_computeOffset( glyphpath,
+ glyphpath->currentCS.x,
+ glyphpath->currentCS.y,
+ x1,
+ y1,
+ &xOffset1,
+ &yOffset1 );
+ cf2_glyphpath_computeOffset( glyphpath,
+ x2,
+ y2,
+ x3,
+ y3,
+ &xOffset3,
+ &yOffset3 );
+
+ /* add momentum from the middle segment */
+ glyphpath->callbacks->windingMomentum +=
+ cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+ /* construct offset points */
+ P0.x = glyphpath->currentCS.x + xOffset1;
+ P0.y = glyphpath->currentCS.y + yOffset1;
+ P1.x = x1 + xOffset1;
+ P1.y = y1 + yOffset1;
+ /* note: preserve angle of final segment by using offset3 at both ends */
+ P2.x = x2 + xOffset3;
+ P2.y = y2 + yOffset3;
+ P3.x = x3 + xOffset3;
+ P3.y = y3 + yOffset3;
+
+ if ( glyphpath->moveIsPending )
+ {
+ /* emit offset 1st point as MoveTo */
+ cf2_glyphpath_pushMove( glyphpath, P0 );
+
+ glyphpath->moveIsPending = FALSE;
+ glyphpath->pathIsOpen = TRUE;
+
+ glyphpath->offsetStart1 = P1; /* record second point */
+ }
+
+ if ( glyphpath->elemIsQueued )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->hintMap,
+ &P0,
+ P1,
+ FALSE );
+ }
+
+ /* queue the current element with offset points */
+ glyphpath->elemIsQueued = TRUE;
+ glyphpath->prevElemOp = CF2_PathOpCubeTo;
+ glyphpath->prevElemP0 = P0;
+ glyphpath->prevElemP1 = P1;
+ glyphpath->prevElemP2 = P2;
+ glyphpath->prevElemP3 = P3;
+
+ /* update current map */
+ if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ glyphpath->currentCS.x = x3; /* pre-offset current point */
+ glyphpath->currentCS.y = y3;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath )
+ {
+ if ( glyphpath->pathIsOpen )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->firstHintMap ) );
+
+ /* since we need to apply an offset to the implicit lineto, we make */
+ /* it explicit here */
+ cf2_glyphpath_lineTo( glyphpath,
+ glyphpath->start.x,
+ glyphpath->start.y );
+
+ /* Draw previous element (the explicit LineTo we just created, */
+ /* above) and connect it to the start point, but with the offset we */
+ /* saved from the first element. */
+ /* Use the saved HintMap, too. */
+ FT_ASSERT( glyphpath->elemIsQueued );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->firstHintMap,
+ &glyphpath->offsetStart0,
+ glyphpath->offsetStart1,
+ TRUE );
+
+ /* reset state machine */
+ glyphpath->moveIsPending = TRUE;
+ glyphpath->pathIsOpen = FALSE;
+ glyphpath->elemIsQueued = FALSE;
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
new file mode 100644
index 0000000000..c4fa922a39
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
@@ -0,0 +1,287 @@
+/***************************************************************************/
+/* */
+/* cf2hints.h */
+/* */
+/* Adobe's code for handling CFF hints (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2HINTS_H__
+#define __CF2HINTS_H__
+
+
+FT_BEGIN_HEADER
+
+
+ enum
+ {
+ CF2_MAX_HINTS = 96 /* maximum # of hints */
+ };
+
+
+ /*
+ * A HintMask object stores a bit mask that specifies which hints in the
+ * charstring are active at a given time. Hints in CFF must be declared
+ * at the start, before any drawing operators, with horizontal hints
+ * preceding vertical hints. The HintMask is ordered the same way, with
+ * horizontal hints immediately followed by vertical hints. Clients are
+ * responsible for knowing how many of each type are present.
+ *
+ * The maximum total number of hints is 96, as specified by the CFF
+ * specification.
+ *
+ * A HintMask is built 0 or more times while interpreting a charstring, by
+ * the HintMask operator. There is only one HintMask, but it is built or
+ * rebuilt each time there is a hint substitution (HintMask operator) in
+ * the charstring. A default HintMask with all bits set is built if there
+ * has been no HintMask operator prior to the first drawing operator.
+ *
+ */
+
+ typedef struct CF2_HintMaskRec_
+ {
+ FT_Error* error;
+
+ FT_Bool isValid;
+ FT_Bool isNew;
+
+ size_t bitCount;
+ size_t byteCount;
+
+ FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8];
+
+ } CF2_HintMaskRec, *CF2_HintMask;
+
+
+ typedef struct CF2_StemHintRec_
+ {
+ FT_Bool used; /* DS positions are valid */
+
+ CF2_Fixed min; /* original character space value */
+ CF2_Fixed max;
+
+ CF2_Fixed minDS; /* DS position after first use */
+ CF2_Fixed maxDS;
+
+ } CF2_StemHintRec, *CF2_StemHint;
+
+
+ /*
+ * A HintMap object stores a piecewise linear function for mapping
+ * y-coordinates from character space to device space, providing
+ * appropriate pixel alignment to stem edges.
+ *
+ * The map is implemented as an array of `CF2_Hint' elements, each
+ * representing an edge. When edges are paired, as from stem hints, the
+ * bottom edge must immediately precede the top edge in the array.
+ * Element character space AND device space positions must both increase
+ * monotonically in the array. `CF2_Hint' elements are also used as
+ * parameters to `cf2_blues_capture'.
+ *
+ * The `cf2_hintmap_build' method must be called before any drawing
+ * operation (beginning with a Move operator) and at each hint
+ * substitution (HintMask operator).
+ *
+ * The `cf2_hintmap_map' method is called to transform y-coordinates at
+ * each drawing operation (move, line, curve).
+ *
+ */
+
+ /* TODO: make this a CF2_ArrStack and add a deep copy method */
+ enum
+ {
+ CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2
+ };
+
+
+ typedef struct CF2_HintMapRec_
+ {
+ CF2_Font font;
+
+ /* initial map based on blue zones */
+ struct CF2_HintMapRec_* initialHintMap;
+
+ /* working storage for 2nd pass adjustHints */
+ CF2_ArrStack hintMoves;
+
+ FT_Bool isValid;
+ FT_Bool hinted;
+
+ CF2_Fixed scale;
+ CF2_UInt count;
+
+ /* start search from this index */
+ CF2_UInt lastIndex;
+
+ CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */
+
+ } CF2_HintMapRec, *CF2_HintMap;
+
+
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isValid( const CF2_Hint hint );
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isTop( const CF2_Hint hint );
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isBottom( const CF2_Hint hint );
+ FT_LOCAL( void )
+ cf2_hint_lock( CF2_Hint hint );
+
+
+ FT_LOCAL( void )
+ cf2_hintmap_init( CF2_HintMap hintmap,
+ CF2_Font font,
+ CF2_HintMap initialMap,
+ CF2_ArrStack hintMoves,
+ CF2_Fixed scale );
+ FT_LOCAL( void )
+ cf2_hintmap_build( CF2_HintMap hintmap,
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ FT_Bool initialMap );
+
+
+ /*
+ * GlyphPath is a wrapper for drawing operations that scales the
+ * coordinates according to the render matrix and HintMap. It also tracks
+ * open paths to control ClosePath and to insert MoveTo for broken fonts.
+ *
+ */
+ typedef struct CF2_GlyphPathRec_
+ {
+ /* TODO: gather some of these into a hinting context */
+
+ CF2_Font font; /* font instance */
+ CF2_OutlineCallbacks callbacks; /* outline consumer */
+
+
+ CF2_HintMapRec hintMap; /* current hint map */
+ CF2_HintMapRec firstHintMap; /* saved copy */
+ CF2_HintMapRec initialHintMap; /* based on all captured hints */
+
+ CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */
+
+ CF2_Fixed scaleX; /* matrix a */
+ CF2_Fixed scaleC; /* matrix c */
+ CF2_Fixed scaleY; /* matrix d */
+
+ FT_Vector fractionalTranslation; /* including deviceXScale */
+#if 0
+ CF2_Fixed hShift; /* character space horizontal shift */
+ /* (for fauxing) */
+#endif
+
+ FT_Bool pathIsOpen; /* true after MoveTo */
+ FT_Bool darken; /* true if stem darkening */
+ FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */
+
+ /* references used to call `cf2_hintmap_build', if necessary */
+ CF2_ArrStack hStemHintArray;
+ CF2_ArrStack vStemHintArray;
+ CF2_HintMask hintMask; /* ptr to the current mask */
+ CF2_Fixed hintOriginY; /* copy of current origin */
+ const CF2_BluesRec* blues;
+
+ CF2_Fixed xOffset; /* character space offsets */
+ CF2_Fixed yOffset;
+
+ /* character space miter limit threshold */
+ CF2_Fixed miterLimit;
+ /* vertical/horzizontal snap distance in character space */
+ CF2_Fixed snapThreshold;
+
+ FT_Vector offsetStart0; /* first and second points of first */
+ FT_Vector offsetStart1; /* element with offset applied */
+
+ /* current point, character space, before offset */
+ FT_Vector currentCS;
+ /* current point, device space */
+ FT_Vector currentDS;
+ FT_Vector start; /* start point of subpath */
+
+ /* the following members constitute the `queue' of one element */
+ FT_Bool elemIsQueued;
+ CF2_Int prevElemOp;
+
+ FT_Vector prevElemP0;
+ FT_Vector prevElemP1;
+ FT_Vector prevElemP2;
+ FT_Vector prevElemP3;
+
+ } CF2_GlyphPathRec, *CF2_GlyphPath;
+
+
+ FT_LOCAL( void )
+ cf2_glyphpath_init( CF2_GlyphPath glyphpath,
+ CF2_Font font,
+ CF2_OutlineCallbacks callbacks,
+ CF2_Fixed scaleY,
+ /* CF2_Fixed hShift, */
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ const CF2_Blues blues,
+ const FT_Vector* fractionalTranslation );
+ FT_LOCAL( void )
+ cf2_glyphpath_finalize( CF2_GlyphPath glyphpath );
+
+ FT_LOCAL( void )
+ cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y );
+ FT_LOCAL( void )
+ cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y );
+ FT_LOCAL( void )
+ cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed x3,
+ CF2_Fixed y3 );
+ FT_LOCAL( void )
+ cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2HINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
new file mode 100644
index 0000000000..12f5dd79e7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
@@ -0,0 +1,1540 @@
+/***************************************************************************/
+/* */
+/* cf2intrp.c */
+/* */
+/* Adobe's CFF Interpreter (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+#include "cf2hints.h"
+
+#include "cf2error.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2interp
+
+
+ /* some operators are not implemented yet */
+#define CF2_FIXME FT_TRACE4(( "cf2_interpT2CharString:" \
+ " operator not implemented yet\n" ))
+
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_init( CF2_HintMask hintmask,
+ FT_Error* error )
+ {
+ FT_ZERO( hintmask );
+
+ hintmask->error = error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hintmask_isValid( const CF2_HintMask hintmask )
+ {
+ return hintmask->isValid;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hintmask_isNew( const CF2_HintMask hintmask )
+ {
+ return hintmask->isNew;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_setNew( CF2_HintMask hintmask,
+ FT_Bool val )
+ {
+ hintmask->isNew = val;
+ }
+
+
+ /* clients call `getMaskPtr' in order to iterate */
+ /* through hint mask */
+
+ FT_LOCAL_DEF( FT_Byte* )
+ cf2_hintmask_getMaskPtr( CF2_HintMask hintmask )
+ {
+ return hintmask->mask;
+ }
+
+
+ static size_t
+ cf2_hintmask_setCounts( CF2_HintMask hintmask,
+ size_t bitCount )
+ {
+ if ( bitCount > CF2_MAX_HINTS )
+ {
+ /* total of h and v stems must be <= 96 */
+ CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
+ return 0;
+ }
+
+ hintmask->bitCount = bitCount;
+ hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
+
+ hintmask->isValid = TRUE;
+ hintmask->isNew = TRUE;
+
+ return bitCount;
+ }
+
+
+ /* consume the hintmask bytes from the charstring, advancing the src */
+ /* pointer */
+ static void
+ cf2_hintmask_read( CF2_HintMask hintmask,
+ CF2_Buffer charstring,
+ size_t bitCount )
+ {
+ size_t i;
+
+#ifndef CF2_NDEBUG
+ /* these are the bits in the final mask byte that should be zero */
+ /* Note: this variable is only used in an assert expression below */
+ /* and then only if CF2_NDEBUG is not defined */
+ CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+#endif
+
+
+ /* initialize counts and isValid */
+ if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+ return;
+
+ FT_ASSERT( hintmask->byteCount > 0 );
+
+ FT_TRACE4(( " (maskbytes:" ));
+
+ /* set mask and advance interpreter's charstring pointer */
+ for ( i = 0; i < hintmask->byteCount; i++ )
+ {
+ hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
+ FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
+ }
+
+ FT_TRACE4(( ")\n" ));
+
+ /* assert any unused bits in last byte are zero unless there's a prior */
+ /* error */
+ /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+#ifndef CF2_NDEBUG
+ FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
+ *hintmask->error );
+#endif
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_setAll( CF2_HintMask hintmask,
+ size_t bitCount )
+ {
+ size_t i;
+ CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+
+
+ /* initialize counts and isValid */
+ if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+ return;
+
+ FT_ASSERT( hintmask->byteCount > 0 );
+ FT_ASSERT( hintmask->byteCount <
+ sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
+
+ /* set mask to all ones */
+ for ( i = 0; i < hintmask->byteCount; i++ )
+ hintmask->mask[i] = 0xFF;
+
+ /* clear unused bits */
+ /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+ hintmask->mask[hintmask->byteCount - 1] &= ~mask;
+ }
+
+
+ /* Type2 charstring opcodes */
+ enum
+ {
+ cf2_cmdRESERVED_0, /* 0 */
+ cf2_cmdHSTEM, /* 1 */
+ cf2_cmdRESERVED_2, /* 2 */
+ cf2_cmdVSTEM, /* 3 */
+ cf2_cmdVMOVETO, /* 4 */
+ cf2_cmdRLINETO, /* 5 */
+ cf2_cmdHLINETO, /* 6 */
+ cf2_cmdVLINETO, /* 7 */
+ cf2_cmdRRCURVETO, /* 8 */
+ cf2_cmdRESERVED_9, /* 9 */
+ cf2_cmdCALLSUBR, /* 10 */
+ cf2_cmdRETURN, /* 11 */
+ cf2_cmdESC, /* 12 */
+ cf2_cmdRESERVED_13, /* 13 */
+ cf2_cmdENDCHAR, /* 14 */
+ cf2_cmdRESERVED_15, /* 15 */
+ cf2_cmdRESERVED_16, /* 16 */
+ cf2_cmdRESERVED_17, /* 17 */
+ cf2_cmdHSTEMHM, /* 18 */
+ cf2_cmdHINTMASK, /* 19 */
+ cf2_cmdCNTRMASK, /* 20 */
+ cf2_cmdRMOVETO, /* 21 */
+ cf2_cmdHMOVETO, /* 22 */
+ cf2_cmdVSTEMHM, /* 23 */
+ cf2_cmdRCURVELINE, /* 24 */
+ cf2_cmdRLINECURVE, /* 25 */
+ cf2_cmdVVCURVETO, /* 26 */
+ cf2_cmdHHCURVETO, /* 27 */
+ cf2_cmdEXTENDEDNMBR, /* 28 */
+ cf2_cmdCALLGSUBR, /* 29 */
+ cf2_cmdVHCURVETO, /* 30 */
+ cf2_cmdHVCURVETO /* 31 */
+ };
+
+ enum
+ {
+ cf2_escDOTSECTION, /* 0 */
+ cf2_escRESERVED_1, /* 1 */
+ cf2_escRESERVED_2, /* 2 */
+ cf2_escAND, /* 3 */
+ cf2_escOR, /* 4 */
+ cf2_escNOT, /* 5 */
+ cf2_escRESERVED_6, /* 6 */
+ cf2_escRESERVED_7, /* 7 */
+ cf2_escRESERVED_8, /* 8 */
+ cf2_escABS, /* 9 */
+ cf2_escADD, /* 10 like otherADD */
+ cf2_escSUB, /* 11 like otherSUB */
+ cf2_escDIV, /* 12 */
+ cf2_escRESERVED_13, /* 13 */
+ cf2_escNEG, /* 14 */
+ cf2_escEQ, /* 15 */
+ cf2_escRESERVED_16, /* 16 */
+ cf2_escRESERVED_17, /* 17 */
+ cf2_escDROP, /* 18 */
+ cf2_escRESERVED_19, /* 19 */
+ cf2_escPUT, /* 20 like otherPUT */
+ cf2_escGET, /* 21 like otherGET */
+ cf2_escIFELSE, /* 22 like otherIFELSE */
+ cf2_escRANDOM, /* 23 like otherRANDOM */
+ cf2_escMUL, /* 24 like otherMUL */
+ cf2_escRESERVED_25, /* 25 */
+ cf2_escSQRT, /* 26 */
+ cf2_escDUP, /* 27 like otherDUP */
+ cf2_escEXCH, /* 28 like otherEXCH */
+ cf2_escINDEX, /* 29 */
+ cf2_escROLL, /* 30 */
+ cf2_escRESERVED_31, /* 31 */
+ cf2_escRESERVED_32, /* 32 */
+ cf2_escRESERVED_33, /* 33 */
+ cf2_escHFLEX, /* 34 */
+ cf2_escFLEX, /* 35 */
+ cf2_escHFLEX1, /* 36 */
+ cf2_escFLEX1 /* 37 */
+ };
+
+
+ /* `stemHintArray' does not change once we start drawing the outline. */
+ static void
+ cf2_doStems( const CF2_Font font,
+ CF2_Stack opStack,
+ CF2_ArrStack stemHintArray,
+ CF2_Fixed* width,
+ FT_Bool* haveWidth,
+ CF2_Fixed hintOffset )
+ {
+ CF2_UInt i;
+ CF2_UInt count = cf2_stack_count( opStack );
+ FT_Bool hasWidthArg = (FT_Bool)( count & 1 );
+
+ /* variable accumulates delta values from operand stack */
+ CF2_Fixed position = hintOffset;
+
+ if ( hasWidthArg && ! *haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) +
+ cf2_getNominalWidthX( font->decoder );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
+ {
+ /* construct a CF2_StemHint and push it onto the list */
+ CF2_StemHintRec stemhint;
+
+
+ stemhint.min =
+ position += cf2_stack_getReal( opStack, i );
+ stemhint.max =
+ position += cf2_stack_getReal( opStack, i + 1 );
+
+ stemhint.used = FALSE;
+ stemhint.maxDS =
+ stemhint.minDS = 0;
+
+ cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
+ }
+
+ cf2_stack_clear( opStack );
+
+ exit:
+ /* cf2_doStems must define a width (may be default) */
+ *haveWidth = TRUE;
+ }
+
+
+ static void
+ cf2_doFlex( CF2_Stack opStack,
+ CF2_Fixed* curX,
+ CF2_Fixed* curY,
+ CF2_GlyphPath glyphPath,
+ const FT_Bool* readFromStack,
+ FT_Bool doConditionalLastRead )
+ {
+ CF2_Fixed vals[14];
+ CF2_UInt index;
+ FT_Bool isHFlex;
+ CF2_Int top, i, j;
+
+
+ vals[0] = *curX;
+ vals[1] = *curY;
+ index = 0;
+ isHFlex = readFromStack[9] == FALSE;
+ top = isHFlex ? 9 : 10;
+
+ for ( i = 0; i < top; i++ )
+ {
+ vals[i + 2] = vals[i];
+ if ( readFromStack[i] )
+ vals[i + 2] += cf2_stack_getReal( opStack, index++ );
+ }
+
+ if ( isHFlex )
+ vals[9 + 2] = *curY;
+
+ if ( doConditionalLastRead )
+ {
+ FT_Bool lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >
+ cf2_fixedAbs( vals[11] - *curY ) );
+ CF2_Fixed lastVal = cf2_stack_getReal( opStack, index );
+
+
+ if ( lastIsX )
+ {
+ vals[12] = vals[10] + lastVal;
+ vals[13] = *curY;
+ }
+ else
+ {
+ vals[12] = *curX;
+ vals[13] = vals[11] + lastVal;
+ }
+ }
+ else
+ {
+ if ( readFromStack[10] )
+ vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );
+ else
+ vals[12] = *curX;
+
+ if ( readFromStack[11] )
+ vals[13] = vals[11] + cf2_stack_getReal( opStack, index );
+ else
+ vals[13] = *curY;
+ }
+
+ for ( j = 0; j < 2; j++ )
+ cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
+ vals[j * 6 + 3],
+ vals[j * 6 + 4],
+ vals[j * 6 + 5],
+ vals[j * 6 + 6],
+ vals[j * 6 + 7] );
+
+ cf2_stack_clear( opStack );
+
+ *curX = vals[12];
+ *curY = vals[13];
+ }
+
+
+ /*
+ * `error' is a shared error code used by many objects in this
+ * routine. Before the code continues from an error, it must check and
+ * record the error in `*error'. The idea is that this shared
+ * error code will record the first error encountered. If testing
+ * for an error anyway, the cost of `goto exit' is small, so we do it,
+ * even if continuing would be safe. In this case, `lastError' is
+ * set, so the testing and storing can be done in one place, at `exit'.
+ *
+ * Continuing after an error is intended for objects which do their own
+ * testing of `*error', e.g., array stack functions. This allows us to
+ * avoid an extra test after the call.
+ *
+ * Unimplemented opcodes are ignored.
+ *
+ */
+ FT_LOCAL_DEF( void )
+ cf2_interpT2CharString( CF2_Font font,
+ CF2_Buffer buf,
+ CF2_OutlineCallbacks callbacks,
+ const FT_Vector* translation,
+ FT_Bool doingSeac,
+ CF2_Fixed curX,
+ CF2_Fixed curY,
+ CF2_Fixed* width )
+ {
+ /* lastError is used for errors that are immediately tested */
+ FT_Error lastError = FT_Err_Ok;
+
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ FT_Error* error = &font->error;
+ FT_Memory memory = font->memory;
+
+ CF2_Fixed scaleY = font->innerTransform.d;
+ CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder );
+
+ /* save this for hinting seac accents */
+ CF2_Fixed hintOriginY = curY;
+
+ CF2_Stack opStack = NULL;
+ FT_Byte op1; /* first opcode byte */
+
+ /* instruction limit; 20,000,000 matches Avalon */
+ FT_UInt32 instructionLimit = 20000000UL;
+
+ CF2_ArrStackRec subrStack;
+
+ FT_Bool haveWidth;
+ CF2_Buffer charstring = NULL;
+
+ CF2_Int charstringIndex = -1; /* initialize to empty */
+
+ /* TODO: placeholders for hint structures */
+
+ /* objects used for hinting */
+ CF2_ArrStackRec hStemHintArray;
+ CF2_ArrStackRec vStemHintArray;
+
+ CF2_HintMaskRec hintMask;
+ CF2_GlyphPathRec glyphPath;
+
+ int refCount = 0;
+
+
+ /* initialize the remaining objects */
+ cf2_arrstack_init( &subrStack,
+ memory,
+ error,
+ sizeof ( CF2_BufferRec ) );
+ cf2_arrstack_init( &hStemHintArray,
+ memory,
+ error,
+ sizeof ( CF2_StemHintRec ) );
+ cf2_arrstack_init( &vStemHintArray,
+ memory,
+ error,
+ sizeof ( CF2_StemHintRec ) );
+
+ /* initialize CF2_StemHint arrays */
+ cf2_hintmask_init( &hintMask, error );
+
+ /* initialize path map to manage drawing operations */
+
+ /* Note: last 4 params are used to handle `MoveToPermissive', which */
+ /* may need to call `hintMap.Build' */
+ /* TODO: MoveToPermissive is gone; are these still needed? */
+ cf2_glyphpath_init( &glyphPath,
+ font,
+ callbacks,
+ scaleY,
+ /* hShift, */
+ &hStemHintArray,
+ &vStemHintArray,
+ &hintMask,
+ hintOriginY,
+ &font->blues,
+ translation );
+
+ /*
+ * Initialize state for width parsing. From the CFF Spec:
+ *
+ * The first stack-clearing operator, which must be one of hstem,
+ * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
+ * rmoveto, or endchar, takes an additional argument - the width (as
+ * described earlier), which may be expressed as zero or one numeric
+ * argument.
+ *
+ * What we implement here uses the first validly specified width, but
+ * does not detect errors for specifying more than one width.
+ *
+ * If one of the above operators occurs without explicitly specifying
+ * a width, we assume the default width.
+ *
+ */
+ haveWidth = FALSE;
+ *width = cf2_getDefaultWidthX( decoder );
+
+ /*
+ * Note: at this point, all pointers to resources must be NULL
+ * and all local objects must be initialized.
+ * There must be no branches to exit: above this point.
+ *
+ */
+
+ /* allocate an operand stack */
+ opStack = cf2_stack_init( memory, error );
+ if ( !opStack )
+ {
+ lastError = FT_THROW( Out_Of_Memory );
+ goto exit;
+ }
+
+ /* initialize subroutine stack by placing top level charstring as */
+ /* first element (max depth plus one for the charstring) */
+ /* Note: Caller owns and must finalize the first charstring. */
+ /* Our copy of it does not change that requirement. */
+ cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
+
+ charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+ *charstring = *buf; /* structure copy */
+
+ charstringIndex = 0; /* entry is valid now */
+
+ /* catch errors so far */
+ if ( *error )
+ goto exit;
+
+ /* main interpreter loop */
+ while ( refCount++ < 10240 )
+ {
+ if ( cf2_buf_isEnd( charstring ) )
+ {
+ /* If we've reached the end of the charstring, simulate a */
+ /* cf2_cmdRETURN or cf2_cmdENDCHAR. */
+ if ( charstringIndex )
+ op1 = cf2_cmdRETURN; /* end of buffer for subroutine */
+ else
+ op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
+ }
+ else
+ op1 = (FT_Byte)cf2_buf_readByte( charstring );
+
+ /* check for errors once per loop */
+ if ( *error )
+ goto exit;
+
+ instructionLimit--;
+ if ( instructionLimit == 0 )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit;
+ }
+
+ switch( op1 )
+ {
+ case cf2_cmdRESERVED_0:
+ case cf2_cmdRESERVED_2:
+ case cf2_cmdRESERVED_9:
+ case cf2_cmdRESERVED_13:
+ case cf2_cmdRESERVED_15:
+ case cf2_cmdRESERVED_16:
+ case cf2_cmdRESERVED_17:
+ /* we may get here if we have a prior error */
+ FT_TRACE4(( " unknown op (%d)\n", op1 ));
+ break;
+
+ case cf2_cmdHSTEMHM:
+ case cf2_cmdHSTEM:
+ FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
+
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " invalid horizontal hint mask\n" ));
+
+ cf2_doStems( font,
+ opStack,
+ &hStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ break;
+
+ case cf2_cmdVSTEMHM:
+ case cf2_cmdVSTEM:
+ FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
+
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " invalid vertical hint mask\n" ));
+
+ cf2_doStems( font,
+ opStack,
+ &vStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ break;
+
+ case cf2_cmdVMOVETO:
+ FT_TRACE4(( " vmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curY += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdRLINETO:
+ {
+ CF2_UInt index;
+ CF2_UInt count = cf2_stack_count( opStack );
+
+
+ FT_TRACE4(( " rlineto\n" ));
+
+ for ( index = 0; index < count; index += 2 )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdHLINETO:
+ case cf2_cmdVLINETO:
+ {
+ CF2_UInt index;
+ CF2_UInt count = cf2_stack_count( opStack );
+
+ FT_Bool isX = op1 == cf2_cmdHLINETO;
+
+
+ FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
+
+ for ( index = 0; index < count; index++ )
+ {
+ CF2_Fixed v = cf2_stack_getReal( opStack, index );
+
+
+ if ( isX )
+ curX += v;
+ else
+ curY += v;
+
+ isX = !isX;
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue;
+
+ case cf2_cmdRCURVELINE:
+ case cf2_cmdRRCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
+ : " rrcurveto\n" ));
+
+ while ( index + 6 <= count )
+ {
+ CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+ CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+ CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+ CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+ CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 6;
+ }
+
+ if ( op1 == cf2_cmdRCURVELINE )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdCALLGSUBR:
+ case cf2_cmdCALLSUBR:
+ {
+ CF2_UInt subrIndex;
+
+
+ FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
+ : " callsubr" ));
+
+ if ( charstringIndex > CF2_MAX_SUBR )
+ {
+ /* max subr plus one for charstring */
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* overflow of stack */
+ }
+
+ /* push our current CFF charstring region on subrStack */
+ charstring = (CF2_Buffer)
+ cf2_arrstack_getPointer( &subrStack,
+ charstringIndex + 1 );
+
+ /* set up the new CFF region and pointer */
+ subrIndex = cf2_stack_popInt( opStack );
+
+ switch ( op1 )
+ {
+ case cf2_cmdCALLGSUBR:
+ FT_TRACE4(( "(%d)\n", subrIndex + decoder->globals_bias ));
+
+ if ( cf2_initGlobalRegionBuffer( decoder,
+ subrIndex,
+ charstring ) )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* subroutine lookup or stream error */
+ }
+ break;
+
+ default:
+ /* cf2_cmdCALLSUBR */
+ FT_TRACE4(( "(%d)\n", subrIndex + decoder->locals_bias ));
+
+ if ( cf2_initLocalRegionBuffer( decoder,
+ subrIndex,
+ charstring ) )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* subroutine lookup or stream error */
+ }
+ }
+
+ charstringIndex += 1; /* entry is valid now */
+ }
+ continue; /* do not clear the stack */
+
+ case cf2_cmdRETURN:
+ FT_TRACE4(( " return\n" ));
+
+ if ( charstringIndex < 1 )
+ {
+ /* Note: cannot return from top charstring */
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* underflow of stack */
+ }
+
+ /* restore position in previous charstring */
+ charstring = (CF2_Buffer)
+ cf2_arrstack_getPointer( &subrStack,
+ --charstringIndex );
+ continue; /* do not clear the stack */
+
+ case cf2_cmdESC:
+ {
+ FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring );
+
+
+ switch ( op2 )
+ {
+ case cf2_escDOTSECTION:
+ /* something about `flip type of locking' -- ignore it */
+ FT_TRACE4(( " dotsection\n" ));
+
+ break;
+
+ /* TODO: should these operators be supported? */
+ case cf2_escAND: /* in spec */
+ FT_TRACE4(( " and\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escOR: /* in spec */
+ FT_TRACE4(( " or\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escNOT: /* in spec */
+ FT_TRACE4(( " not\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escABS: /* in spec */
+ FT_TRACE4(( " abs\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escADD: /* in spec */
+ FT_TRACE4(( " add\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escSUB: /* in spec */
+ FT_TRACE4(( " sub\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDIV: /* in spec */
+ FT_TRACE4(( " div\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escNEG: /* in spec */
+ FT_TRACE4(( " neg\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escEQ: /* in spec */
+ FT_TRACE4(( " eq\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDROP: /* in spec */
+ FT_TRACE4(( " drop\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escPUT: /* in spec */
+ FT_TRACE4(( " put\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escGET: /* in spec */
+ FT_TRACE4(( " get\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escIFELSE: /* in spec */
+ FT_TRACE4(( " ifelse\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escRANDOM: /* in spec */
+ FT_TRACE4(( " random\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escMUL: /* in spec */
+ FT_TRACE4(( " mul\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escSQRT: /* in spec */
+ FT_TRACE4(( " sqrt\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDUP: /* in spec */
+ FT_TRACE4(( " dup\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escEXCH: /* in spec */
+ FT_TRACE4(( " exch\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escINDEX: /* in spec */
+ FT_TRACE4(( " index\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escROLL: /* in spec */
+ FT_TRACE4(( " roll\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escHFLEX:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, FALSE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, FALSE /* dy3 */,
+ TRUE /* dx4 */, FALSE /* dy4 */,
+ TRUE /* dx5 */, FALSE /* dy5 */,
+ TRUE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " hflex\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escFLEX:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, TRUE /* dy3 */,
+ TRUE /* dx4 */, TRUE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ TRUE /* dx6 */, TRUE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " flex\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ break; /* TODO: why is this not a continue? */
+
+ case cf2_escHFLEX1:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, FALSE /* dy3 */,
+ TRUE /* dx4 */, FALSE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ TRUE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " hflex1\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escFLEX1:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, TRUE /* dy3 */,
+ TRUE /* dx4 */, TRUE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ FALSE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " flex1\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ TRUE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escRESERVED_1:
+ case cf2_escRESERVED_2:
+ case cf2_escRESERVED_6:
+ case cf2_escRESERVED_7:
+ case cf2_escRESERVED_8:
+ case cf2_escRESERVED_13:
+ case cf2_escRESERVED_16:
+ case cf2_escRESERVED_17:
+ case cf2_escRESERVED_19:
+ case cf2_escRESERVED_25:
+ case cf2_escRESERVED_31:
+ case cf2_escRESERVED_32:
+ case cf2_escRESERVED_33:
+ default:
+ FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+
+ }; /* end of switch statement checking `op2' */
+
+ } /* case cf2_cmdESC */
+ break;
+
+ case cf2_cmdENDCHAR:
+ FT_TRACE4(( " endchar\n" ));
+
+ if ( cf2_stack_count( opStack ) == 1 ||
+ cf2_stack_count( opStack ) == 5 )
+ {
+ if ( !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+ }
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ /* close path if still open */
+ cf2_glyphpath_closeOpenPath( &glyphPath );
+
+ if ( cf2_stack_count( opStack ) > 1 )
+ {
+ /* must be either 4 or 5 -- */
+ /* this is a (deprecated) implied `seac' operator */
+
+ CF2_UInt achar;
+ CF2_UInt bchar;
+ CF2_BufferRec component;
+ CF2_Fixed dummyWidth; /* ignore component width */
+ FT_Error error2;
+
+
+ if ( doingSeac )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* nested seac */
+ }
+
+ achar = cf2_stack_popInt( opStack );
+ bchar = cf2_stack_popInt( opStack );
+
+ curY = cf2_stack_popFixed( opStack );
+ curX = cf2_stack_popFixed( opStack );
+
+ error2 = cf2_getSeacComponent( decoder, achar, &component );
+ if ( error2 )
+ {
+ lastError = error2; /* pass FreeType error through */
+ goto exit;
+ }
+ cf2_interpT2CharString( font,
+ &component,
+ callbacks,
+ translation,
+ TRUE,
+ curX,
+ curY,
+ &dummyWidth );
+ cf2_freeSeacComponent( decoder, &component );
+
+ error2 = cf2_getSeacComponent( decoder, bchar, &component );
+ if ( error2 )
+ {
+ lastError = error2; /* pass FreeType error through */
+ goto exit;
+ }
+ cf2_interpT2CharString( font,
+ &component,
+ callbacks,
+ translation,
+ TRUE,
+ 0,
+ 0,
+ &dummyWidth );
+ cf2_freeSeacComponent( decoder, &component );
+ }
+ goto exit;
+
+ case cf2_cmdCNTRMASK:
+ case cf2_cmdHINTMASK:
+ /* the final \n in the tracing message gets added in */
+ /* `cf2_hintmask_read' (which also traces the mask bytes) */
+ FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
+
+ /* if there are arguments on the stack, there this is an */
+ /* implied cf2_cmdVSTEMHM */
+ if ( cf2_stack_count( opStack ) != 0 )
+ {
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
+ }
+
+ cf2_doStems( font,
+ opStack,
+ &vStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ if ( op1 == cf2_cmdHINTMASK )
+ {
+ /* consume the hint mask bytes which follow the operator */
+ cf2_hintmask_read( &hintMask,
+ charstring,
+ cf2_arrstack_size( &hStemHintArray ) +
+ cf2_arrstack_size( &vStemHintArray ) );
+ }
+ else
+ {
+ /*
+ * Consume the counter mask bytes which follow the operator:
+ * Build a temporary hint map, just to place and lock those
+ * stems participating in the counter mask. These are most
+ * likely the dominant hstems, and are grouped together in a
+ * few counter groups, not necessarily in correspondence
+ * with the hint groups. This reduces the chances of
+ * conflicts between hstems that are initially placed in
+ * separate hint groups and then brought together. The
+ * positions are copied back to `hStemHintArray', so we can
+ * discard `counterMask' and `counterHintMap'.
+ *
+ */
+ CF2_HintMapRec counterHintMap;
+ CF2_HintMaskRec counterMask;
+
+
+ cf2_hintmap_init( &counterHintMap,
+ font,
+ &glyphPath.initialHintMap,
+ &glyphPath.hintMoves,
+ scaleY );
+ cf2_hintmask_init( &counterMask, error );
+
+ cf2_hintmask_read( &counterMask,
+ charstring,
+ cf2_arrstack_size( &hStemHintArray ) +
+ cf2_arrstack_size( &vStemHintArray ) );
+ cf2_hintmap_build( &counterHintMap,
+ &hStemHintArray,
+ &vStemHintArray,
+ &counterMask,
+ 0,
+ FALSE );
+ }
+ break;
+
+ case cf2_cmdRMOVETO:
+ FT_TRACE4(( " rmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curY += cf2_stack_popFixed( opStack );
+ curX += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdHMOVETO:
+ FT_TRACE4(( " hmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curX += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdRLINECURVE:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " rlinecurve\n" ));
+
+ while ( index + 6 < count )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ index += 2;
+ }
+
+ while ( index < count )
+ {
+ CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+ CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+ CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+ CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+ CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 6;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdVVCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " vvcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, y1, x2, y2, x3, y3;
+
+
+ if ( ( count - index ) & 1 )
+ {
+ x1 = cf2_stack_getReal( opStack, index ) + curX;
+
+ ++index;
+ }
+ else
+ x1 = curX;
+
+ y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = x2;
+ y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdHHCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " hhcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, y1, x2, y2, x3, y3;
+
+
+ if ( ( count - index ) & 1 )
+ {
+ y1 = cf2_stack_getReal( opStack, index ) + curY;
+
+ ++index;
+ }
+ else
+ y1 = curY;
+
+ x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+ y3 = y2;
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdVHCURVETO:
+ case cf2_cmdHVCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+ FT_Bool alternate = op1 == cf2_cmdHVCURVETO;
+
+
+ FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, x2, x3, y1, y2, y3;
+
+
+ if ( alternate )
+ {
+ x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ y1 = curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+ if ( count - index == 5 )
+ {
+ x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+
+ ++index;
+ }
+ else
+ x3 = x2;
+
+ alternate = FALSE;
+ }
+ else
+ {
+ x1 = curX;
+ y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+
+ if ( count - index == 5 )
+ {
+ y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;
+
+ ++index;
+ }
+ else
+ y3 = y2;
+
+ alternate = TRUE;
+ }
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdEXTENDEDNMBR:
+ {
+ CF2_Int v;
+
+
+ v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |
+ cf2_buf_readByte( charstring ) );
+
+ FT_TRACE4(( " %d", v ));
+
+ cf2_stack_pushInt( opStack, v );
+ }
+ continue;
+
+ default:
+ /* numbers */
+ {
+ if ( /* op1 >= 32 && */ op1 <= 246 )
+ {
+ CF2_Int v;
+
+
+ v = op1 - 139;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* -107 .. 107 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else if ( /* op1 >= 247 && */ op1 <= 250 )
+ {
+ CF2_Int v;
+
+
+ v = op1;
+ v -= 247;
+ v *= 256;
+ v += cf2_buf_readByte( charstring );
+ v += 108;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* 108 .. 1131 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else if ( /* op1 >= 251 && */ op1 <= 254 )
+ {
+ CF2_Int v;
+
+
+ v = op1;
+ v -= 251;
+ v *= 256;
+ v += cf2_buf_readByte( charstring );
+ v = -v - 108;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* -1131 .. -108 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else /* op1 == 255 */
+ {
+ CF2_Fixed v;
+
+
+ v = (CF2_Fixed)
+ ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |
+ ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |
+ ( (FT_UInt32)cf2_buf_readByte( charstring ) << 8 ) |
+ (FT_UInt32)cf2_buf_readByte( charstring ) );
+
+ FT_TRACE4(( " %.2f", v / 65536.0 ));
+
+ cf2_stack_pushFixed( opStack, v );
+ }
+ }
+ continue; /* don't clear stack */
+
+ } /* end of switch statement checking `op1' */
+
+ cf2_stack_clear( opStack );
+
+ } /* end of main interpreter loop */
+
+ /* we get here if the charstring ends without cf2_cmdENDCHAR */
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " charstring ends without ENDCHAR\n" ));
+
+ exit:
+ /* check whether last error seen is also the first one */
+ cf2_setError( error, lastError );
+
+ /* free resources from objects we've used */
+ cf2_glyphpath_finalize( &glyphPath );
+ cf2_arrstack_finalize( &vStemHintArray );
+ cf2_arrstack_finalize( &hStemHintArray );
+ cf2_arrstack_finalize( &subrStack );
+ cf2_stack_free( opStack );
+
+ FT_TRACE4(( "\n" ));
+
+ return;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
new file mode 100644
index 0000000000..b5d8947838
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* cf2font.h */
+/* */
+/* Adobe's CFF Interpreter (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2INTRP_H__
+#define __CF2INTRP_H__
+
+
+#include "cf2ft.h"
+#include "cf2hints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ cf2_hintmask_init( CF2_HintMask hintmask,
+ FT_Error* error );
+ FT_LOCAL( FT_Bool )
+ cf2_hintmask_isValid( const CF2_HintMask hintmask );
+ FT_LOCAL( FT_Bool )
+ cf2_hintmask_isNew( const CF2_HintMask hintmask );
+ FT_LOCAL( void )
+ cf2_hintmask_setNew( CF2_HintMask hintmask,
+ FT_Bool val );
+ FT_LOCAL( FT_Byte* )
+ cf2_hintmask_getMaskPtr( CF2_HintMask hintmask );
+ FT_LOCAL( void )
+ cf2_hintmask_setAll( CF2_HintMask hintmask,
+ size_t bitCount );
+
+ FT_LOCAL( void )
+ cf2_interpT2CharString( CF2_Font font,
+ CF2_Buffer charstring,
+ CF2_OutlineCallbacks callbacks,
+ const FT_Vector* translation,
+ FT_Bool doingSeac,
+ CF2_Fixed curX,
+ CF2_Fixed curY,
+ CF2_Fixed* width );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2INTRP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
new file mode 100644
index 0000000000..20e9294940
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* cf2read.c */
+/* */
+/* Adobe's code for stream handling (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+
+#include "cf2error.h"
+
+
+ /* Define CF2_IO_FAIL as 1 to enable random errors and random */
+ /* value errors in I/O. */
+#define CF2_IO_FAIL 0
+
+
+#if CF2_IO_FAIL
+
+ /* set the .00 value to a nonzero probability */
+ static int
+ randomError2( void )
+ {
+ /* for region buffer ReadByte (interp) function */
+ return (double)rand() / RAND_MAX < .00;
+ }
+
+ /* set the .00 value to a nonzero probability */
+ static CF2_Int
+ randomValue()
+ {
+ return (double)rand() / RAND_MAX < .00 ? rand() : 0;
+ }
+
+#endif /* CF2_IO_FAIL */
+
+
+ /* Region Buffer */
+ /* */
+ /* Can be constructed from a copied buffer managed by */
+ /* `FCM_getDatablock'. */
+ /* Reads bytes with check for end of buffer. */
+
+ /* reading past the end of the buffer sets error and returns zero */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_buf_readByte( CF2_Buffer buf )
+ {
+ if ( buf->ptr < buf->end )
+ {
+#if CF2_IO_FAIL
+ if ( randomError2() )
+ {
+ CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+ return 0;
+ }
+
+ return *(buf->ptr)++ + randomValue();
+#else
+ return *(buf->ptr)++;
+#endif
+ }
+ else
+ {
+ CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+ return 0;
+ }
+ }
+
+
+ /* note: end condition can occur without error */
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_buf_isEnd( CF2_Buffer buf )
+ {
+ return (FT_Bool)( buf->ptr >= buf->end );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
new file mode 100644
index 0000000000..7ef7c8c149
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/* */
+/* cf2read.h */
+/* */
+/* Adobe's code for stream handling (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2READ_H__
+#define __CF2READ_H__
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct CF2_BufferRec_
+ {
+ FT_Error* error;
+ const FT_Byte* start;
+ const FT_Byte* end;
+ const FT_Byte* ptr;
+
+ } CF2_BufferRec, *CF2_Buffer;
+
+
+ FT_LOCAL( CF2_Int )
+ cf2_buf_readByte( CF2_Buffer buf );
+ FT_LOCAL( FT_Bool )
+ cf2_buf_isEnd( CF2_Buffer buf );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2READ_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
new file mode 100644
index 0000000000..7930a22cfe
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
@@ -0,0 +1,205 @@
+/***************************************************************************/
+/* */
+/* cf2stack.c */
+/* */
+/* Adobe's code for emulating a CFF stack (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+
+#include "cf2error.h"
+
+
+ /* Allocate and initialize an instance of CF2_Stack. */
+ /* Note: This function returns NULL on error (does not set */
+ /* `error'). */
+ FT_LOCAL_DEF( CF2_Stack )
+ cf2_stack_init( FT_Memory memory,
+ FT_Error* e )
+ {
+ FT_Error error = FT_Err_Ok; /* for FT_QNEW */
+
+ CF2_Stack stack = NULL;
+
+
+ if ( !FT_QNEW( stack ) )
+ {
+ /* initialize the structure; FT_QNEW zeroes it */
+ stack->memory = memory;
+ stack->error = e;
+ stack->top = &stack->buffer[0]; /* empty stack */
+ }
+
+ return stack;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_free( CF2_Stack stack )
+ {
+ if ( stack )
+ {
+ FT_Memory memory = stack->memory;
+
+
+ /* free the main structure */
+ FT_FREE( stack );
+ }
+ }
+
+
+ FT_LOCAL_DEF( CF2_UInt )
+ cf2_stack_count( CF2_Stack stack )
+ {
+ return (CF2_UInt)( stack->top - &stack->buffer[0] );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_pushInt( CF2_Stack stack,
+ CF2_Int val )
+ {
+ if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return; /* stack overflow */
+ }
+
+ stack->top->u.i = val;
+ stack->top->type = CF2_NumberInt;
+ ++stack->top;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_pushFixed( CF2_Stack stack,
+ CF2_Fixed val )
+ {
+ if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return; /* stack overflow */
+ }
+
+ stack->top->u.r = val;
+ stack->top->type = CF2_NumberFixed;
+ ++stack->top;
+ }
+
+
+ /* this function is only allowed to pop an integer type */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_stack_popInt( CF2_Stack stack )
+ {
+ if ( stack->top == &stack->buffer[0] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Underflow );
+ return 0; /* underflow */
+ }
+ if ( stack->top[-1].type != CF2_NumberInt )
+ {
+ CF2_SET_ERROR( stack->error, Syntax_Error );
+ return 0; /* type mismatch */
+ }
+
+ --stack->top;
+
+ return stack->top->u.i;
+ }
+
+
+ /* Note: type mismatch is silently cast */
+ /* TODO: check this */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_stack_popFixed( CF2_Stack stack )
+ {
+ if ( stack->top == &stack->buffer[0] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Underflow );
+ return cf2_intToFixed( 0 ); /* underflow */
+ }
+
+ --stack->top;
+
+ switch ( stack->top->type )
+ {
+ case CF2_NumberInt:
+ return cf2_intToFixed( stack->top->u.i );
+ case CF2_NumberFrac:
+ return cf2_fracToFixed( stack->top->u.f );
+ default:
+ return stack->top->u.r;
+ }
+ }
+
+
+ /* Note: type mismatch is silently cast */
+ /* TODO: check this */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_stack_getReal( CF2_Stack stack,
+ CF2_UInt idx )
+ {
+ FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );
+
+ if ( idx >= cf2_stack_count( stack ) )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return cf2_intToFixed( 0 ); /* bounds error */
+ }
+
+ switch ( stack->buffer[idx].type )
+ {
+ case CF2_NumberInt:
+ return cf2_intToFixed( stack->buffer[idx].u.i );
+ case CF2_NumberFrac:
+ return cf2_fracToFixed( stack->buffer[idx].u.f );
+ default:
+ return stack->buffer[idx].u.r;
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_clear( CF2_Stack stack )
+ {
+ stack->top = &stack->buffer[0];
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
new file mode 100644
index 0000000000..7d6d1961fe
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/* */
+/* cf2stack.h */
+/* */
+/* Adobe's code for emulating a CFF stack (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2STACK_H__
+#define __CF2STACK_H__
+
+
+FT_BEGIN_HEADER
+
+
+ /* CFF operand stack; specified maximum of 48 or 192 values */
+ typedef struct CF2_StackNumber_
+ {
+ union
+ {
+ CF2_Fixed r; /* 16.16 fixed point */
+ CF2_Frac f; /* 2.30 fixed point (for font matrix) */
+ CF2_Int i;
+ } u;
+
+ CF2_NumberType type;
+
+ } CF2_StackNumber;
+
+
+ typedef struct CF2_StackRec_
+ {
+ FT_Memory memory;
+ FT_Error* error;
+ CF2_StackNumber buffer[CF2_OPERAND_STACK_SIZE];
+ CF2_StackNumber* top;
+
+ } CF2_StackRec, *CF2_Stack;
+
+
+ FT_LOCAL( CF2_Stack )
+ cf2_stack_init( FT_Memory memory,
+ FT_Error* error );
+ FT_LOCAL( void )
+ cf2_stack_free( CF2_Stack stack );
+
+ FT_LOCAL( CF2_UInt )
+ cf2_stack_count( CF2_Stack stack );
+
+ FT_LOCAL( void )
+ cf2_stack_pushInt( CF2_Stack stack,
+ CF2_Int val );
+ FT_LOCAL( void )
+ cf2_stack_pushFixed( CF2_Stack stack,
+ CF2_Fixed val );
+
+ FT_LOCAL( CF2_Int )
+ cf2_stack_popInt( CF2_Stack stack );
+ FT_LOCAL( CF2_Fixed )
+ cf2_stack_popFixed( CF2_Stack stack );
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_stack_getReal( CF2_Stack stack,
+ CF2_UInt idx );
+
+ FT_LOCAL( void )
+ cf2_stack_clear( CF2_Stack stack );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2STACK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
new file mode 100644
index 0000000000..cbbef712ff
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
@@ -0,0 +1,78 @@
+/***************************************************************************/
+/* */
+/* cf2types.h */
+/* */
+/* Adobe's code for defining data types (specification only). */
+/* */
+/* Copyright 2011-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2TYPES_H__
+#define __CF2TYPES_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * The data models that we expect to support are as follows:
+ *
+ * name char short int long long-long pointer example
+ * -----------------------------------------------------
+ * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86
+ * LLP64 8 16 32 32 64 64 x64
+ * LP64 8 16 32 64 64 64 64-bit MacOS
+ *
+ * *) type may be supported by emulation on a 32-bit architecture
+ *
+ */
+
+
+ /* integers at least 32 bits wide */
+#define CF2_UInt FT_UFast
+#define CF2_Int FT_Fast
+
+
+ /* fixed-float numbers */
+ typedef FT_Int32 CF2_F16Dot16;
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
new file mode 100644
index 0000000000..4aebe4682a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
@@ -0,0 +1,210 @@
+/***************************************************************************/
+/* */
+/* cffcmap.c */
+/* */
+/* CFF character mapping table (cmap) support (body). */
+/* */
+/* Copyright 2002-2007, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "cffcmap.h"
+#include "cffload.h"
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_cmap_encoding_init( CFF_CMapStd cmap )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Encoding encoding = &cff->encoding;
+
+
+ cmap->gids = encoding->codes;
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ cff_cmap_encoding_done( CFF_CMapStd cmap )
+ {
+ cmap->gids = NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ cff_cmap_encoding_char_index( CFF_CMapStd cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( char_code < 256 )
+ result = cmap->gids[char_code];
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ cff_cmap_encoding_char_next( CFF_CMapStd cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code;
+
+
+ *pchar_code = 0;
+
+ if ( char_code < 255 )
+ {
+ FT_UInt code = (FT_UInt)(char_code + 1);
+
+
+ for (;;)
+ {
+ if ( code >= 256 )
+ break;
+
+ result = cmap->gids[code];
+ if ( result != 0 )
+ {
+ *pchar_code = code;
+ break;
+ }
+
+ code++;
+ }
+ }
+ return result;
+ }
+
+
+ FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
+ sizeof ( CFF_CMapStdRec ),
+
+ (FT_CMap_InitFunc) cff_cmap_encoding_init,
+ (FT_CMap_DoneFunc) cff_cmap_encoding_done,
+ (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
+ (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( const char* )
+ cff_sid_to_glyph_name( TT_Face face,
+ FT_UInt idx )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Charset charset = &cff->charset;
+ FT_UInt sid = charset->sids[idx];
+
+
+ return cff_index_get_sid_string( cff, sid );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_cmap_unicode_init( PS_Unicodes unicodes )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Charset charset = &cff->charset;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ /* can't build Unicode map for CID-keyed font */
+ /* because we don't know glyph names. */
+ if ( !charset->sids )
+ return FT_THROW( No_Unicode_Glyph_Name );
+
+ return psnames->unicodes_init( memory,
+ unicodes,
+ cff->num_glyphs,
+ (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
+ (PS_FreeGlyphNameFunc)NULL,
+ (FT_Pointer)face );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ cff_cmap_unicode_done( PS_Unicodes unicodes )
+ {
+ FT_Face face = FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( unicodes->maps );
+ unicodes->num_maps = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ cff_cmap_unicode_char_index( PS_Unicodes unicodes,
+ FT_UInt32 char_code )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ return psnames->unicodes_char_index( unicodes, char_code );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ cff_cmap_unicode_char_next( PS_Unicodes unicodes,
+ FT_UInt32 *pchar_code )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ return psnames->unicodes_char_next( unicodes, pchar_code );
+ }
+
+
+ FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
+ sizeof ( PS_UnicodesRec ),
+
+ (FT_CMap_InitFunc) cff_cmap_unicode_init,
+ (FT_CMap_DoneFunc) cff_cmap_unicode_done,
+ (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
+ (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
new file mode 100644
index 0000000000..3f7f67bbe0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/* */
+/* cffcmap.h */
+/* */
+/* CFF character mapping table (cmap) support (specification). */
+/* */
+/* Copyright 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFCMAP_H__
+#define __CFFCMAP_H__
+
+#include "cffobjs.h"
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* standard (and expert) encoding cmaps */
+ typedef struct CFF_CMapStdRec_* CFF_CMapStd;
+
+ typedef struct CFF_CMapStdRec_
+ {
+ FT_CMapRec cmap;
+ FT_UShort* gids; /* up to 256 elements */
+
+ } CFF_CMapStdRec;
+
+
+ FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* unicode (synthetic) cmaps */
+
+ FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)
+
+
+FT_END_HEADER
+
+#endif /* __CFFCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
new file mode 100644
index 0000000000..84f305c90a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
@@ -0,0 +1,787 @@
+/***************************************************************************/
+/* */
+/* cffdrivr.c */
+/* */
+/* OpenType font driver implementation (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#include "cffdrivr.h"
+#include "cffgload.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffdriver
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#undef PAIR_TAG
+#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \
+ (FT_ULong)right )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_get_kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings, are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ FT_CALLBACK_DEF( FT_Error )
+ cff_get_kerning( FT_Face ttface, /* TT_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ TT_Face face = (TT_Face)ttface;
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( sfnt )
+ kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+ return FT_Err_Ok;
+ }
+
+
+#undef PAIR_TAG
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_glyph_load */
+ /* */
+ /* <Description> */
+ /* A driver method used to load a glyph within a given glyph slot. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled, loaded, etc. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_??? constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_CALLBACK_DEF( FT_Error )
+ cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */
+ FT_Size cffsize, /* CFF_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot;
+ CFF_Size size = (CFF_Size)cffsize;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ /* check whether we want a scaled outline or bitmap */
+ if ( !size )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ /* reset the size object if necessary */
+ if ( load_flags & FT_LOAD_NO_SCALE )
+ size = NULL;
+
+ if ( size )
+ {
+ /* these two objects must have the same parent */
+ if ( cffsize->face != cffslot->face )
+ return FT_THROW( Invalid_Face_Handle );
+ }
+
+ /* now load the glyph outline if necessary */
+ error = cff_slot_load( slot, size, glyph_index, load_flags );
+
+ /* force drop-out mode to 2 - irrelevant now */
+ /* slot->outline.dropout_mode = 2; */
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_get_advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed* advances )
+ {
+ FT_UInt nn;
+ FT_Error error = FT_Err_Ok;
+ FT_GlyphSlot slot = face->glyph;
+
+
+ flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = cff_glyph_load( slot, face->size, start + nn, flags );
+ if ( error )
+ break;
+
+ advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? slot->linearVertAdvance
+ : slot->linearHoriAdvance;
+ }
+
+ return error;
+ }
+
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ cff_get_glyph_name( CFF_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ CFF_Font font = (CFF_Font)face->extra.data;
+ FT_String* gname;
+ FT_UShort sid;
+ FT_Error error;
+
+
+ if ( !font->psnames )
+ {
+ FT_ERROR(( "cff_get_glyph_name:"
+ " cannot get glyph name from CFF & CEF fonts\n"
+ " "
+ " without the `PSNames' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ /* first, locate the sid in the charset table */
+ sid = font->charset.sids[glyph_index];
+
+ /* now, lookup the name itself */
+ gname = cff_index_get_sid_string( font, sid );
+
+ if ( gname )
+ FT_STRCPYN( buffer, gname, buffer_max );
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_UInt
+ cff_get_name_index( CFF_Face face,
+ FT_String* glyph_name )
+ {
+ CFF_Font cff;
+ CFF_Charset charset;
+ FT_Service_PsCMaps psnames;
+ FT_String* name;
+ FT_UShort sid;
+ FT_UInt i;
+
+
+ cff = (CFF_FontRec *)face->extra.data;
+ charset = &cff->charset;
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ if ( !psnames )
+ return 0;
+
+ for ( i = 0; i < cff->num_glyphs; i++ )
+ {
+ sid = charset->sids[i];
+
+ if ( sid > 390 )
+ name = cff_index_get_string( cff, sid - 391 );
+ else
+ name = (FT_String *)psnames->adobe_std_strings( sid );
+
+ if ( !name )
+ continue;
+
+ if ( !ft_strcmp( glyph_name, name ) )
+ return i;
+ }
+
+ return 0;
+ }
+
+
+ FT_DEFINE_SERVICE_GLYPHDICTREC(
+ cff_service_glyph_dict,
+ (FT_GlyphDict_GetNameFunc) cff_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)cff_get_name_index
+ )
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Int
+ cff_ps_has_glyph_names( FT_Face face )
+ {
+ return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
+ }
+
+
+ static FT_Error
+ cff_ps_get_font_info( CFF_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( cff && cff->font_info == NULL )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+ PS_FontInfoRec *font_info = NULL;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
+ goto Fail;
+
+ font_info->version = cff_index_get_sid_string( cff,
+ dict->version );
+ font_info->notice = cff_index_get_sid_string( cff,
+ dict->notice );
+ font_info->full_name = cff_index_get_sid_string( cff,
+ dict->full_name );
+ font_info->family_name = cff_index_get_sid_string( cff,
+ dict->family_name );
+ font_info->weight = cff_index_get_sid_string( cff,
+ dict->weight );
+ font_info->italic_angle = dict->italic_angle;
+ font_info->is_fixed_pitch = dict->is_fixed_pitch;
+ font_info->underline_position = (FT_Short)dict->underline_position;
+ font_info->underline_thickness = (FT_Short)dict->underline_thickness;
+
+ cff->font_info = font_info;
+ }
+
+ if ( cff )
+ *afont_info = *cff->font_info;
+
+ Fail:
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_PSINFOREC(
+ cff_service_ps_info,
+ (PS_GetFontInfoFunc) cff_ps_get_font_info,
+ (PS_GetFontExtraFunc) NULL,
+ (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
+ (PS_GetFontPrivateFunc)NULL, /* unsupported with CFF fonts */
+ (PS_GetFontValueFunc) NULL /* not implemented */
+ )
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ cff_get_ps_name( CFF_Face face )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ return (const char*)cff->font_name;
+ }
+
+
+ FT_DEFINE_SERVICE_PSFONTNAMEREC(
+ cff_service_ps_name,
+ (FT_PsName_GetFunc)cff_get_ps_name
+ )
+
+
+ /*
+ * TT CMAP INFO
+ *
+ * If the charmap is a synthetic Unicode encoding cmap or
+ * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
+ * service defined in SFNT module.
+ *
+ * Otherwise call the service function in the sfnt module.
+ *
+ */
+ static FT_Error
+ cff_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_CMap cmap = FT_CMAP( charmap );
+ FT_Error error = FT_Err_Ok;
+
+ FT_Face face = FT_CMAP_FACE( cmap );
+ FT_Library library = FT_FACE_LIBRARY( face );
+
+
+ cmap_info->language = 0;
+ cmap_info->format = 0;
+
+ if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&
+ cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET )
+ {
+ FT_Module sfnt = FT_Get_Module( library, "sfnt" );
+ FT_Service_TTCMaps service =
+ (FT_Service_TTCMaps)ft_module_get_service( sfnt,
+ FT_SERVICE_ID_TT_CMAP );
+
+
+ if ( service && service->get_cmap_info )
+ error = service->get_cmap_info( charmap, cmap_info );
+ }
+
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_TTCMAPSREC(
+ cff_service_get_cmap_info,
+ (TT_CMap_Info_GetFunc)cff_get_cmap_info
+ )
+
+
+ /*
+ * CID INFO SERVICE
+ *
+ */
+ static FT_Error
+ cff_get_ros( CFF_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ if ( cff )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ if ( registry )
+ {
+ if ( cff->registry == NULL )
+ cff->registry = cff_index_get_sid_string( cff,
+ dict->cid_registry );
+ *registry = cff->registry;
+ }
+
+ if ( ordering )
+ {
+ if ( cff->ordering == NULL )
+ cff->ordering = cff_index_get_sid_string( cff,
+ dict->cid_ordering );
+ *ordering = cff->ordering;
+ }
+
+ /*
+ * XXX: According to Adobe TechNote #5176, the supplement in CFF
+ * can be a real number. We truncate it to fit public API
+ * since freetype-2.3.6.
+ */
+ if ( supplement )
+ {
+ if ( dict->cid_supplement < FT_INT_MIN ||
+ dict->cid_supplement > FT_INT_MAX )
+ FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
+ dict->cid_supplement ));
+ *supplement = (FT_Int)dict->cid_supplement;
+ }
+ }
+
+ Fail:
+ return error;
+ }
+
+
+ static FT_Error
+ cff_get_is_cid( CFF_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ *is_cid = 0;
+
+ if ( cff )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry != 0xFFFFU )
+ *is_cid = 1;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_get_cid_from_glyph_index( CFF_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff;
+
+
+ cff = (CFF_Font)face->extra.data;
+
+ if ( cff )
+ {
+ FT_UInt c;
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ if ( glyph_index > cff->num_glyphs )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ c = cff->charset.sids[glyph_index];
+
+ if ( cid )
+ *cid = c;
+ }
+
+ Fail:
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_CIDREC(
+ cff_service_cid_info,
+ (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
+ (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid,
+ (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index
+ )
+
+
+ /*
+ * PROPERTY SERVICE
+ *
+ */
+ static FT_Error
+ cff_property_set( FT_Module module, /* CFF_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Driver driver = (CFF_Driver)module;
+
+
+ if ( !ft_strcmp( property_name, "hinting-engine" ) )
+ {
+ FT_UInt* hinting_engine = (FT_UInt*)value;
+
+
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
+ if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
+ error = FT_ERR( Unimplemented_Feature );
+ else
+#endif
+ driver->hinting_engine = *hinting_engine;
+
+ return error;
+ }
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+ {
+ FT_Bool* no_stem_darkening = (FT_Bool*)value;
+
+
+ driver->no_stem_darkening = *no_stem_darkening;
+
+ return error;
+ }
+
+ FT_TRACE0(( "cff_property_set: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ static FT_Error
+ cff_property_get( FT_Module module, /* CFF_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Driver driver = (CFF_Driver)module;
+
+ FT_UInt hinting_engine = driver->hinting_engine;
+ FT_Bool no_stem_darkening = driver->no_stem_darkening;
+
+
+ if ( !ft_strcmp( property_name, "hinting-engine" ) )
+ {
+ FT_UInt* val = (FT_UInt*)value;
+
+
+ *val = hinting_engine;
+
+ return error;
+ }
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+ {
+ FT_Bool* val = (FT_Bool*)value;
+
+
+ *val = no_stem_darkening;
+
+ return error;
+ }
+
+ FT_TRACE0(( "cff_property_get: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ FT_DEFINE_SERVICE_PROPERTIESREC(
+ cff_service_properties,
+ (FT_Properties_SetFunc)cff_property_set,
+ (FT_Properties_GetFunc)cff_property_get )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** D R I V E R I N T E R F A C E ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+ FT_DEFINE_SERVICEDESCREC7(
+ cff_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
+ FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET,
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET,
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET
+ )
+#else
+ FT_DEFINE_SERVICEDESCREC6(
+ cff_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
+ FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET,
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET,
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET
+ )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ cff_get_interface( FT_Module driver, /* CFF_Driver */
+ const char* module_interface )
+ {
+ FT_Library library;
+ FT_Module sfnt;
+ FT_Module_Interface result;
+
+
+ /* CFF_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
+ if ( result != NULL )
+ return result;
+
+ /* `driver' is not yet evaluated in non-PIC mode */
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ /* we pass our request to the `sfnt' module */
+ sfnt = FT_Get_Module( library, "sfnt" );
+
+ return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
+ }
+
+
+ /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define CFF_SIZE_SELECT cff_size_select
+#else
+#define CFF_SIZE_SELECT 0
+#endif
+
+ FT_DEFINE_DRIVER(
+ cff_driver_class,
+
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( CFF_DriverRec ),
+ "cff",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module-specific interface */
+
+ cff_driver_init,
+ cff_driver_done,
+ cff_get_interface,
+
+ /* now the specific driver fields */
+ sizeof ( TT_FaceRec ),
+ sizeof ( CFF_SizeRec ),
+ sizeof ( CFF_GlyphSlotRec ),
+
+ cff_face_init,
+ cff_face_done,
+ cff_size_init,
+ cff_size_done,
+ cff_slot_init,
+ cff_slot_done,
+
+ cff_glyph_load,
+
+ cff_get_kerning,
+ 0, /* FT_Face_AttachFunc */
+ cff_get_advances,
+
+ cff_size_request,
+
+ CFF_SIZE_SELECT
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
new file mode 100644
index 0000000000..cd41f57e9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* cffdrivr.h */
+/* */
+/* High-level OpenType driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFDRIVER_H__
+#define __CFFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_DRIVER( cff_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __CFFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
new file mode 100644
index 0000000000..47e755c8a5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* cfferrs.h */
+/* */
+/* CFF error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the CFF error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __CFFERRS_H__
+#define __CFFERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CFF_Err_
+#define FT_ERR_BASE FT_Mod_Err_CFF
+
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CFFERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
new file mode 100644
index 0000000000..bbb75ab924
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
@@ -0,0 +1,3072 @@
+/***************************************************************************/
+/* */
+/* cffgload.c */
+/* */
+/* OpenType Glyph Loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffgload.h"
+#include "cf2ft.h" /* for cf2_decoder_parse_charstrings */
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffgload
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+ typedef enum CFF_Operator_
+ {
+ cff_op_unknown = 0,
+
+ cff_op_rmoveto,
+ cff_op_hmoveto,
+ cff_op_vmoveto,
+
+ cff_op_rlineto,
+ cff_op_hlineto,
+ cff_op_vlineto,
+
+ cff_op_rrcurveto,
+ cff_op_hhcurveto,
+ cff_op_hvcurveto,
+ cff_op_rcurveline,
+ cff_op_rlinecurve,
+ cff_op_vhcurveto,
+ cff_op_vvcurveto,
+
+ cff_op_flex,
+ cff_op_hflex,
+ cff_op_hflex1,
+ cff_op_flex1,
+
+ cff_op_endchar,
+
+ cff_op_hstem,
+ cff_op_vstem,
+ cff_op_hstemhm,
+ cff_op_vstemhm,
+
+ cff_op_hintmask,
+ cff_op_cntrmask,
+ cff_op_dotsection, /* deprecated, acts as no-op */
+
+ cff_op_abs,
+ cff_op_add,
+ cff_op_sub,
+ cff_op_div,
+ cff_op_neg,
+ cff_op_random,
+ cff_op_mul,
+ cff_op_sqrt,
+
+ cff_op_blend,
+
+ cff_op_drop,
+ cff_op_exch,
+ cff_op_index,
+ cff_op_roll,
+ cff_op_dup,
+
+ cff_op_put,
+ cff_op_get,
+ cff_op_store,
+ cff_op_load,
+
+ cff_op_and,
+ cff_op_or,
+ cff_op_not,
+ cff_op_eq,
+ cff_op_ifelse,
+
+ cff_op_callsubr,
+ cff_op_callgsubr,
+ cff_op_return,
+
+ /* Type 1 opcodes: invalid but seen in real life */
+ cff_op_hsbw,
+ cff_op_closepath,
+ cff_op_callothersubr,
+ cff_op_pop,
+ cff_op_seac,
+ cff_op_sbw,
+ cff_op_setcurrentpoint,
+
+ /* do not remove */
+ cff_op_max
+
+ } CFF_Operator;
+
+
+#define CFF_COUNT_CHECK_WIDTH 0x80
+#define CFF_COUNT_EXACT 0x40
+#define CFF_COUNT_CLEAR_STACK 0x20
+
+ /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */
+ /* used for checking the width and requested numbers of arguments */
+ /* only; they are set to zero afterwards */
+
+ /* the other two flags are informative only and unused currently */
+
+ static const FT_Byte cff_argument_counts[] =
+ {
+ 0, /* unknown */
+
+ 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
+ 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+ 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+
+ 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+
+ 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+
+ 13, /* flex */
+ 7,
+ 9,
+ 11,
+
+ 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
+
+ 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
+ 2 | CFF_COUNT_CHECK_WIDTH,
+ 2 | CFF_COUNT_CHECK_WIDTH,
+ 2 | CFF_COUNT_CHECK_WIDTH,
+
+ 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+ 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
+ 0, /* dotsection */
+
+ 1, /* abs */
+ 2,
+ 2,
+ 2,
+ 1,
+ 0,
+ 2,
+ 1,
+
+ 1, /* blend */
+
+ 1, /* drop */
+ 2,
+ 1,
+ 2,
+ 1,
+
+ 2, /* put */
+ 1,
+ 4,
+ 3,
+
+ 2, /* and */
+ 2,
+ 1,
+ 2,
+ 4,
+
+ 1, /* callsubr */
+ 1,
+ 0,
+
+ 2, /* hsbw */
+ 0,
+ 0,
+ 0,
+ 5, /* seac */
+ 4, /* sbw */
+ 2 /* setcurrentpoint */
+ };
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** GENERIC CHARSTRING PARSING *********/
+ /********** *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_builder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph builder. */
+ /* */
+ /* <InOut> */
+ /* builder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* glyph :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting is active. */
+ /* */
+ static void
+ cff_builder_init( CFF_Builder* builder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot glyph,
+ FT_Bool hinting )
+ {
+ builder->path_begun = 0;
+ builder->load_points = 1;
+
+ builder->face = face;
+ builder->glyph = glyph;
+ builder->memory = face->root.memory;
+
+ if ( glyph )
+ {
+ FT_GlyphLoader loader = glyph->root.internal->loader;
+
+
+ builder->loader = loader;
+ builder->base = &loader->base.outline;
+ builder->current = &loader->current.outline;
+ FT_GlyphLoader_Rewind( loader );
+
+ builder->hints_globals = 0;
+ builder->hints_funcs = 0;
+
+ if ( hinting && size )
+ {
+ CFF_Internal internal = (CFF_Internal)size->root.internal;
+
+
+ builder->hints_globals = (void *)internal->topfont;
+ builder->hints_funcs = glyph->root.internal->glyph_hints;
+ }
+ }
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+ builder->advance.x = 0;
+ builder->advance.y = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_builder_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given glyph builder. Its contents can still be used */
+ /* after the call, but the function saves important information */
+ /* within the corresponding glyph slot. */
+ /* */
+ /* <Input> */
+ /* builder :: A pointer to the glyph builder to finalize. */
+ /* */
+ static void
+ cff_builder_done( CFF_Builder* builder )
+ {
+ CFF_GlyphSlot glyph = builder->glyph;
+
+
+ if ( glyph )
+ glyph->root.outline = *builder->base;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_compute_bias */
+ /* */
+ /* <Description> */
+ /* Computes the bias value in dependence of the number of glyph */
+ /* subroutines. */
+ /* */
+ /* <Input> */
+ /* in_charstring_type :: The `CharstringType' value of the top DICT */
+ /* dictionary. */
+ /* */
+ /* num_subrs :: The number of glyph subroutines. */
+ /* */
+ /* <Return> */
+ /* The bias value. */
+ static FT_Int
+ cff_compute_bias( FT_Int in_charstring_type,
+ FT_UInt num_subrs )
+ {
+ FT_Int result;
+
+
+ if ( in_charstring_type == 1 )
+ result = 0;
+ else if ( num_subrs < 1240 )
+ result = 107;
+ else if ( num_subrs < 33900U )
+ result = 1131;
+ else
+ result = 32768U;
+
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_decoder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph decoder. */
+ /* */
+ /* <InOut> */
+ /* decoder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* slot :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting is active. */
+ /* */
+ /* hint_mode :: The hinting mode. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cff_decoder_init( CFF_Decoder* decoder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot slot,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ /* clear everything */
+ FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+ /* initialize builder */
+ cff_builder_init( &decoder->builder, face, size, slot, hinting );
+
+ /* initialize Type2 decoder */
+ decoder->cff = cff;
+ decoder->num_globals = cff->global_subrs_index.count;
+ decoder->globals = cff->global_subrs;
+ decoder->globals_bias = cff_compute_bias(
+ cff->top_font.font_dict.charstring_type,
+ decoder->num_globals );
+
+ decoder->hint_mode = hint_mode;
+ }
+
+
+ /* this function is used to select the subfont */
+ /* and the locals subrs array */
+ FT_LOCAL_DEF( FT_Error )
+ cff_decoder_prepare( CFF_Decoder* decoder,
+ CFF_Size size,
+ FT_UInt glyph_index )
+ {
+ CFF_Builder *builder = &decoder->builder;
+ CFF_Font cff = (CFF_Font)builder->face->extra.data;
+ CFF_SubFont sub = &cff->top_font;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* manage CID fonts */
+ if ( cff->num_subfonts )
+ {
+ FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
+
+
+ if ( fd_index >= cff->num_subfonts )
+ {
+ FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index ));
+
+ sub = cff->subfonts[fd_index];
+
+ if ( builder->hints_funcs && size )
+ {
+ CFF_Internal internal = (CFF_Internal)size->root.internal;
+
+
+ /* for CFFs without subfonts, this value has already been set */
+ builder->hints_globals = (void *)internal->subfonts[fd_index];
+ }
+ }
+#ifdef FT_DEBUG_LEVEL_TRACE
+ else
+ FT_TRACE3(( "glyph index %d:\n", glyph_index ));
+#endif
+
+ decoder->num_locals = sub->local_subrs_index.count;
+ decoder->locals = sub->local_subrs;
+ decoder->locals_bias = cff_compute_bias(
+ decoder->cff->top_font.font_dict.charstring_type,
+ decoder->num_locals );
+
+ decoder->glyph_width = sub->private_dict.default_width;
+ decoder->nominal_width = sub->private_dict.nominal_width;
+
+ decoder->current_subfont = sub; /* for Adobe's CFF handler */
+
+ Exit:
+ return error;
+ }
+
+
+ /* check that there is enough space for `count' more points */
+ FT_LOCAL_DEF( FT_Error )
+ cff_check_points( CFF_Builder* builder,
+ FT_Int count )
+ {
+ return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+ }
+
+
+ /* add a new point, do not check space */
+ FT_LOCAL_DEF( void )
+ cff_builder_add_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag )
+ {
+ FT_Outline* outline = builder->current;
+
+
+ if ( builder->load_points )
+ {
+ FT_Vector* point = outline->points + outline->n_points;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+
+ if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+ {
+ point->x = x >> 16;
+ point->y = y >> 16;
+ }
+ else
+#endif
+ {
+ /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+ point->x = x >> 10;
+ point->y = y >> 10;
+ }
+ *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+ }
+
+ outline->n_points++;
+ }
+
+
+ /* check space for a new on-curve point, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ cff_builder_add_point1( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error;
+
+
+ error = cff_check_points( builder, 1 );
+ if ( !error )
+ cff_builder_add_point( builder, x, y, 1 );
+
+ return error;
+ }
+
+
+ /* check space for a new contour, then add it */
+ static FT_Error
+ cff_builder_add_contour( CFF_Builder* builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Error error;
+
+
+ if ( !builder->load_points )
+ {
+ outline->n_contours++;
+ return FT_Err_Ok;
+ }
+
+ error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+ if ( !error )
+ {
+ if ( outline->n_contours > 0 )
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+
+ outline->n_contours++;
+ }
+
+ return error;
+ }
+
+
+ /* if a path was begun, add its first on-curve point */
+ FT_LOCAL_DEF( FT_Error )
+ cff_builder_start_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ /* test whether we are building a new contour */
+ if ( !builder->path_begun )
+ {
+ builder->path_begun = 1;
+ error = cff_builder_add_contour( builder );
+ if ( !error )
+ error = cff_builder_add_point1( builder, x, y );
+ }
+
+ return error;
+ }
+
+
+ /* close the current contour */
+ FT_LOCAL_DEF( void )
+ cff_builder_close_contour( CFF_Builder* builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Int first;
+
+
+ if ( !outline )
+ return;
+
+ first = outline->n_contours <= 1
+ ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+ /* We must not include the last point in the path if it */
+ /* is located on the first point. */
+ if ( outline->n_points > 1 )
+ {
+ FT_Vector* p1 = outline->points + first;
+ FT_Vector* p2 = outline->points + outline->n_points - 1;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+ /* `delete' last point only if it coincides with the first */
+ /* point and if it is not a control point (which can happen). */
+ if ( p1->x == p2->x && p1->y == p2->y )
+ if ( *control == FT_CURVE_TAG_ON )
+ outline->n_points--;
+ }
+
+ if ( outline->n_contours > 0 )
+ {
+ /* Don't add contours only consisting of one point, i.e., */
+ /* check whether begin point and last point are the same. */
+ if ( first == outline->n_points - 1 )
+ {
+ outline->n_contours--;
+ outline->n_points--;
+ }
+ else
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ cff_lookup_glyph_by_stdcharcode( CFF_Font cff,
+ FT_Int charcode )
+ {
+ FT_UInt n;
+ FT_UShort glyph_sid;
+
+
+ /* CID-keyed fonts don't have glyph names */
+ if ( !cff->charset.sids )
+ return -1;
+
+ /* check range of standard char code */
+ if ( charcode < 0 || charcode > 255 )
+ return -1;
+
+ /* Get code to SID mapping from `cff_standard_encoding'. */
+ glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
+
+ for ( n = 0; n < cff->num_glyphs; n++ )
+ {
+ if ( cff->charset.sids[n] == glyph_sid )
+ return n;
+ }
+
+ return -1;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_get_glyph_data( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Byte** pointer,
+ FT_ULong* length )
+ {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( face->root.internal->incremental_interface )
+ {
+ FT_Data data;
+ FT_Error error =
+ face->root.internal->incremental_interface->funcs->get_glyph_data(
+ face->root.internal->incremental_interface->object,
+ glyph_index, &data );
+
+
+ *pointer = (FT_Byte*)data.pointer;
+ *length = data.length;
+
+ return error;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ return cff_index_access_element( &cff->charstrings_index, glyph_index,
+ pointer, length );
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_free_glyph_data( TT_Face face,
+ FT_Byte** pointer,
+ FT_ULong length )
+ {
+#ifndef FT_CONFIG_OPTION_INCREMENTAL
+ FT_UNUSED( length );
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( face->root.internal->incremental_interface )
+ {
+ FT_Data data;
+
+
+ data.pointer = *pointer;
+ data.length = length;
+
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object, &data );
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ cff_index_forget_element( &cff->charstrings_index, pointer );
+ }
+ }
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+ static FT_Error
+ cff_operator_seac( CFF_Decoder* decoder,
+ FT_Pos asb,
+ FT_Pos adx,
+ FT_Pos ady,
+ FT_Int bchar,
+ FT_Int achar )
+ {
+ FT_Error error;
+ CFF_Builder* builder = &decoder->builder;
+ FT_Int bchar_index, achar_index;
+ TT_Face face = decoder->builder.face;
+ FT_Vector left_bearing, advance;
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+ FT_Pos glyph_width;
+
+
+ if ( decoder->seac )
+ {
+ FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ adx += decoder->builder.left_bearing.x;
+ ady += decoder->builder.left_bearing.y;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* Incremental fonts don't necessarily have valid charsets. */
+ /* They use the character code, not the glyph index, in this case. */
+ if ( face->root.internal->incremental_interface )
+ {
+ bchar_index = bchar;
+ achar_index = achar;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+ achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+ }
+
+ if ( bchar_index < 0 || achar_index < 0 )
+ {
+ FT_ERROR(( "cff_operator_seac:"
+ " invalid seac character code arguments\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* If we are trying to load a composite glyph, do not load the */
+ /* accent character and return the array of subglyphs. */
+ if ( builder->no_recurse )
+ {
+ FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph;
+ FT_GlyphLoader loader = glyph->internal->loader;
+ FT_SubGlyph subg;
+
+
+ /* reallocate subglyph array if necessary */
+ error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+ if ( error )
+ goto Exit;
+
+ subg = loader->current.subglyphs;
+
+ /* subglyph 0 = base character */
+ subg->index = bchar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+ FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+ subg->arg1 = 0;
+ subg->arg2 = 0;
+ subg++;
+
+ /* subglyph 1 = accent character */
+ subg->index = achar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+ subg->arg1 = (FT_Int)( adx >> 16 );
+ subg->arg2 = (FT_Int)( ady >> 16 );
+
+ /* set up remaining glyph fields */
+ glyph->num_subglyphs = 2;
+ glyph->subglyphs = loader->base.subglyphs;
+ glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ loader->current.num_subglyphs = 2;
+ }
+
+ FT_GlyphLoader_Prepare( builder->loader );
+
+ /* First load `bchar' in builder */
+ error = cff_get_glyph_data( face, bchar_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = cff_decoder_parse_charstrings( decoder, charstring,
+ charstring_len );
+ decoder->seac = FALSE;
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Exit;
+ }
+
+ /* Save the left bearing, advance and glyph width of the base */
+ /* character as they will be erased by the next load. */
+
+ left_bearing = builder->left_bearing;
+ advance = builder->advance;
+ glyph_width = decoder->glyph_width;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+
+ builder->pos_x = adx - asb;
+ builder->pos_y = ady;
+
+ /* Now load `achar' on top of the base outline. */
+ error = cff_get_glyph_data( face, achar_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = cff_decoder_parse_charstrings( decoder, charstring,
+ charstring_len );
+ decoder->seac = FALSE;
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Exit;
+ }
+
+ /* Restore the left side bearing, advance and glyph width */
+ /* of the base character. */
+ builder->left_bearing = left_bearing;
+ builder->advance = advance;
+ decoder->glyph_width = glyph_width;
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_decoder_parse_charstrings */
+ /* */
+ /* <Description> */
+ /* Parses a given Type 2 charstrings program. */
+ /* */
+ /* <InOut> */
+ /* decoder :: The current Type 1 decoder. */
+ /* */
+ /* <Input> */
+ /* charstring_base :: The base of the charstring stream. */
+ /* */
+ /* charstring_len :: The length in bytes of the charstring stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cff_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len )
+ {
+ FT_Error error;
+ CFF_Decoder_Zone* zone;
+ FT_Byte* ip;
+ FT_Byte* limit;
+ CFF_Builder* builder = &decoder->builder;
+ FT_Pos x, y;
+ FT_Fixed seed;
+ FT_Fixed* stack;
+ FT_Int charstring_type =
+ decoder->cff->top_font.font_dict.charstring_type;
+
+ T2_Hints_Funcs hinter;
+
+
+ /* set default width */
+ decoder->num_hints = 0;
+ decoder->read_width = 1;
+
+ /* compute random seed from stack address of parameter */
+ seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^
+ (FT_PtrDist)(char*)&decoder ^
+ (FT_PtrDist)(char*)&charstring_base ) &
+ FT_ULONG_MAX ) ;
+ seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+ if ( seed == 0 )
+ seed = 0x7384;
+
+ /* initialize the decoder */
+ decoder->top = decoder->stack;
+ decoder->zone = decoder->zones;
+ zone = decoder->zones;
+ stack = decoder->top;
+
+ hinter = (T2_Hints_Funcs)builder->hints_funcs;
+
+ builder->path_begun = 0;
+
+ zone->base = charstring_base;
+ limit = zone->limit = charstring_base + charstring_len;
+ ip = zone->cursor = zone->base;
+
+ error = FT_Err_Ok;
+
+ x = builder->pos_x;
+ y = builder->pos_y;
+
+ /* begin hints recording session, if any */
+ if ( hinter )
+ hinter->open( hinter->hints );
+
+ /* now execute loop */
+ while ( ip < limit )
+ {
+ CFF_Operator op;
+ FT_Byte v;
+
+
+ /********************************************************************/
+ /* */
+ /* Decode operator or operand */
+ /* */
+ v = *ip++;
+ if ( v >= 32 || v == 28 )
+ {
+ FT_Int shift = 16;
+ FT_Int32 val;
+
+
+ /* this is an operand, push it on the stack */
+
+ /* if we use shifts, all computations are done with unsigned */
+ /* values; the conversion to a signed value is the last step */
+ if ( v == 28 )
+ {
+ if ( ip + 1 >= limit )
+ goto Syntax_Error;
+ val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
+ ip += 2;
+ }
+ else if ( v < 247 )
+ val = (FT_Int32)v - 139;
+ else if ( v < 251 )
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
+ }
+ else if ( v < 255 )
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
+ }
+ else
+ {
+ if ( ip + 3 >= limit )
+ goto Syntax_Error;
+ val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+ ( (FT_UInt32)ip[1] << 16 ) |
+ ( (FT_UInt32)ip[2] << 8 ) |
+ (FT_UInt32)ip[3] );
+ ip += 4;
+ if ( charstring_type == 2 )
+ shift = 0;
+ }
+ if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+ goto Stack_Overflow;
+
+ val = (FT_Int32)( (FT_UInt32)val << shift );
+ *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( !( val & 0xFFFFL ) )
+ FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
+ else
+ FT_TRACE4(( " %.2f", val / 65536.0 ));
+#endif
+
+ }
+ else
+ {
+ /* The specification says that normally arguments are to be taken */
+ /* from the bottom of the stack. However, this seems not to be */
+ /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
+ /* arguments similar to a PS interpreter. */
+
+ FT_Fixed* args = decoder->top;
+ FT_Int num_args = (FT_Int)( args - decoder->stack );
+ FT_Int req_args;
+
+
+ /* find operator */
+ op = cff_op_unknown;
+
+ switch ( v )
+ {
+ case 1:
+ op = cff_op_hstem;
+ break;
+ case 3:
+ op = cff_op_vstem;
+ break;
+ case 4:
+ op = cff_op_vmoveto;
+ break;
+ case 5:
+ op = cff_op_rlineto;
+ break;
+ case 6:
+ op = cff_op_hlineto;
+ break;
+ case 7:
+ op = cff_op_vlineto;
+ break;
+ case 8:
+ op = cff_op_rrcurveto;
+ break;
+ case 9:
+ op = cff_op_closepath;
+ break;
+ case 10:
+ op = cff_op_callsubr;
+ break;
+ case 11:
+ op = cff_op_return;
+ break;
+ case 12:
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ v = *ip++;
+
+ switch ( v )
+ {
+ case 0:
+ op = cff_op_dotsection;
+ break;
+ case 1: /* this is actually the Type1 vstem3 operator */
+ op = cff_op_vstem;
+ break;
+ case 2: /* this is actually the Type1 hstem3 operator */
+ op = cff_op_hstem;
+ break;
+ case 3:
+ op = cff_op_and;
+ break;
+ case 4:
+ op = cff_op_or;
+ break;
+ case 5:
+ op = cff_op_not;
+ break;
+ case 6:
+ op = cff_op_seac;
+ break;
+ case 7:
+ op = cff_op_sbw;
+ break;
+ case 8:
+ op = cff_op_store;
+ break;
+ case 9:
+ op = cff_op_abs;
+ break;
+ case 10:
+ op = cff_op_add;
+ break;
+ case 11:
+ op = cff_op_sub;
+ break;
+ case 12:
+ op = cff_op_div;
+ break;
+ case 13:
+ op = cff_op_load;
+ break;
+ case 14:
+ op = cff_op_neg;
+ break;
+ case 15:
+ op = cff_op_eq;
+ break;
+ case 16:
+ op = cff_op_callothersubr;
+ break;
+ case 17:
+ op = cff_op_pop;
+ break;
+ case 18:
+ op = cff_op_drop;
+ break;
+ case 20:
+ op = cff_op_put;
+ break;
+ case 21:
+ op = cff_op_get;
+ break;
+ case 22:
+ op = cff_op_ifelse;
+ break;
+ case 23:
+ op = cff_op_random;
+ break;
+ case 24:
+ op = cff_op_mul;
+ break;
+ case 26:
+ op = cff_op_sqrt;
+ break;
+ case 27:
+ op = cff_op_dup;
+ break;
+ case 28:
+ op = cff_op_exch;
+ break;
+ case 29:
+ op = cff_op_index;
+ break;
+ case 30:
+ op = cff_op_roll;
+ break;
+ case 33:
+ op = cff_op_setcurrentpoint;
+ break;
+ case 34:
+ op = cff_op_hflex;
+ break;
+ case 35:
+ op = cff_op_flex;
+ break;
+ case 36:
+ op = cff_op_hflex1;
+ break;
+ case 37:
+ op = cff_op_flex1;
+ break;
+ /*default: */ /* XYQ 2007-9-6: we can't just quit if we see some reserved op */
+ /* decrement ip for syntax error message */
+ /* ip--;*/
+ }
+ }
+ break;
+ case 13:
+ op = cff_op_hsbw;
+ break;
+ case 14:
+ op = cff_op_endchar;
+ break;
+ case 16:
+ op = cff_op_blend;
+ break;
+ case 18:
+ op = cff_op_hstemhm;
+ break;
+ case 19:
+ op = cff_op_hintmask;
+ break;
+ case 20:
+ op = cff_op_cntrmask;
+ break;
+ case 21:
+ op = cff_op_rmoveto;
+ break;
+ case 22:
+ op = cff_op_hmoveto;
+ break;
+ case 23:
+ op = cff_op_vstemhm;
+ break;
+ case 24:
+ op = cff_op_rcurveline;
+ break;
+ case 25:
+ op = cff_op_rlinecurve;
+ break;
+ case 26:
+ op = cff_op_vvcurveto;
+ break;
+ case 27:
+ op = cff_op_hhcurveto;
+ break;
+ case 29:
+ op = cff_op_callgsubr;
+ break;
+ case 30:
+ op = cff_op_vhcurveto;
+ break;
+ case 31:
+ op = cff_op_hvcurveto;
+ break;
+ default:
+ FT_TRACE4(( " unknown op (%d)\n", v ));
+ break;
+ }
+
+ if ( op == cff_op_unknown )
+ continue;
+
+ /* check arguments */
+ req_args = cff_argument_counts[op];
+ if ( req_args & CFF_COUNT_CHECK_WIDTH )
+ {
+ if ( num_args > 0 && decoder->read_width )
+ {
+ /* If `nominal_width' is non-zero, the number is really a */
+ /* difference against `nominal_width'. Else, the number here */
+ /* is truly a width, not a difference against `nominal_width'. */
+ /* If the font does not set `nominal_width', then */
+ /* `nominal_width' defaults to zero, and so we can set */
+ /* `glyph_width' to `nominal_width' plus number on the stack */
+ /* -- for either case. */
+
+ FT_Int set_width_ok;
+
+
+ switch ( op )
+ {
+ case cff_op_hmoveto:
+ case cff_op_vmoveto:
+ set_width_ok = num_args & 2;
+ break;
+
+ case cff_op_hstem:
+ case cff_op_vstem:
+ case cff_op_hstemhm:
+ case cff_op_vstemhm:
+ case cff_op_rmoveto:
+ case cff_op_hintmask:
+ case cff_op_cntrmask:
+ set_width_ok = num_args & 1;
+ break;
+
+ case cff_op_endchar:
+ /* If there is a width specified for endchar, we either have */
+ /* 1 argument or 5 arguments. We like to argue. */
+ set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
+ break;
+
+ default:
+ set_width_ok = 0;
+ break;
+ }
+
+ if ( set_width_ok )
+ {
+ decoder->glyph_width = decoder->nominal_width +
+ ( stack[0] >> 16 );
+
+ if ( decoder->width_only )
+ {
+ /* we only want the advance width; stop here */
+ break;
+ }
+
+ /* Consumed an argument. */
+ num_args--;
+ }
+ }
+
+ decoder->read_width = 0;
+ req_args = 0;
+ }
+
+ req_args &= 0x000F;
+ if ( num_args < req_args )
+ goto Stack_Underflow;
+ args -= req_args;
+ num_args -= req_args;
+
+ /* Sunliang.Liu sync 221's revison. */
+ if (args > decoder->stack + CFF_MAX_OPERANDS)
+ goto Stack_Overflow;
+
+ /* At this point, `args' points to the first argument of the */
+ /* operand in case `req_args' isn't zero. Otherwise, we have */
+ /* to adjust `args' manually. */
+
+ /* Note that we only pop arguments from the stack which we */
+ /* really need and can digest so that we can continue in case */
+ /* of superfluous stack elements. */
+
+ switch ( op )
+ {
+ case cff_op_hstem:
+ case cff_op_vstem:
+ case cff_op_hstemhm:
+ case cff_op_vstemhm:
+ /* the number of arguments is always even here */
+ FT_TRACE4((
+ op == cff_op_hstem ? " hstem\n" :
+ ( op == cff_op_vstem ? " vstem\n" :
+ ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
+
+ if ( hinter )
+ hinter->stems( hinter->hints,
+ ( op == cff_op_hstem || op == cff_op_hstemhm ),
+ num_args / 2,
+ args - ( num_args & ~1 ) );
+
+ decoder->num_hints += num_args / 2;
+ args = stack;
+ break;
+
+ case cff_op_hintmask:
+ case cff_op_cntrmask:
+ FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+ /* implement vstem when needed -- */
+ /* the specification doesn't say it, but this also works */
+ /* with the 'cntrmask' operator */
+ /* */
+ if ( num_args > 0 )
+ {
+ if ( hinter )
+ hinter->stems( hinter->hints,
+ 0,
+ num_args / 2,
+ args - ( num_args & ~1 ) );
+
+ decoder->num_hints += num_args / 2;
+ }
+
+ /* In a valid charstring there must be at least one byte */
+ /* after `hintmask' or `cntrmask' (e.g., for a `return' */
+ /* instruction). Additionally, there must be space for */
+ /* `num_hints' bits. */
+
+ if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
+ goto Syntax_Error;
+
+ if ( hinter )
+ {
+ if ( op == cff_op_hintmask )
+ hinter->hintmask( hinter->hints,
+ builder->current->n_points,
+ decoder->num_hints,
+ ip );
+ else
+ hinter->counter( hinter->hints,
+ decoder->num_hints,
+ ip );
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_UInt maskbyte;
+
+
+ FT_TRACE4(( " (maskbytes:" ));
+
+ for ( maskbyte = 0;
+ maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
+ maskbyte++, ip++ )
+ FT_TRACE4(( " 0x%02X", *ip ));
+
+ FT_TRACE4(( ")\n" ));
+ }
+#else
+ ip += ( decoder->num_hints + 7 ) >> 3;
+#endif
+ args = stack;
+ break;
+
+ case cff_op_rmoveto:
+ FT_TRACE4(( " rmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ x += args[-2];
+ y += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_vmoveto:
+ FT_TRACE4(( " vmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ y += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_hmoveto:
+ FT_TRACE4(( " hmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ x += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_rlineto:
+ FT_TRACE4(( " rlineto\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_args / 2 ) )
+ goto Fail;
+
+ if ( num_args < 2 )
+ goto Stack_Underflow;
+
+ args -= num_args & ~1;
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 2;
+ }
+ args = stack;
+ break;
+
+ case cff_op_hlineto:
+ case cff_op_vlineto:
+ {
+ FT_Int phase = ( op == cff_op_hlineto );
+
+
+ FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
+ : " vlineto\n" ));
+
+ if ( num_args < 0 )
+ goto Stack_Underflow;
+
+ /* there exist subsetted fonts (found in PDFs) */
+ /* which call `hlineto' without arguments */
+ if ( num_args == 0 )
+ break;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_args ) )
+ goto Fail;
+
+ args = stack;
+ while ( args < decoder->top )
+ {
+ if ( phase )
+ x += args[0];
+ else
+ y += args[0];
+
+ if ( cff_builder_add_point1( builder, x, y ) )
+ goto Fail;
+
+ args++;
+ phase ^= 1;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_rrcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rrcurveto\n" ));
+
+ if ( num_args < 6 )
+ goto Stack_Underflow;
+
+ nargs = num_args - num_args % 6;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, nargs / 2 ) )
+ goto Fail;
+
+ args -= nargs;
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 6;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_vvcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " vvcurveto\n" ));
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 4n or 4n+1, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ args -= nargs;
+
+ if ( nargs & 1 )
+ {
+ x += args[0];
+ args++;
+ nargs--;
+ }
+
+ if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+ goto Fail;
+
+ while ( args < decoder->top )
+ {
+ y += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 4;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_hhcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " hhcurveto\n" ));
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 4n or 4n+1, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ args -= nargs;
+ if ( nargs & 1 )
+ {
+ y += args[0];
+ args++;
+ nargs--;
+ }
+
+ if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+ goto Fail;
+
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 4;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_vhcurveto:
+ case cff_op_hvcurveto:
+ {
+ FT_Int phase;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
+ : " hvcurveto\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ args -= nargs;
+ if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
+ goto Stack_Underflow;
+
+ phase = ( op == cff_op_hvcurveto );
+
+ while ( nargs >= 4 )
+ {
+ nargs -= 4;
+ if ( phase )
+ {
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ y += args[3];
+ if ( nargs == 1 )
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+ }
+ else
+ {
+ y += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[3];
+ if ( nargs == 1 )
+ y += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+ }
+ args += 4;
+ phase ^= 1;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_rlinecurve:
+ {
+ FT_Int num_lines;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rlinecurve\n" ));
+
+ if ( num_args < 8 )
+ goto Stack_Underflow;
+
+ nargs = num_args & ~1;
+ num_lines = ( nargs - 6 ) / 2;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_lines + 3 ) )
+ goto Fail;
+
+ args -= nargs;
+
+ /* first, add the line segments */
+ while ( num_lines > 0 )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 2;
+ num_lines--;
+ }
+
+ /* then the curve */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args = stack;
+ }
+ break;
+
+ case cff_op_rcurveline:
+ {
+ FT_Int num_curves;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rcurveline\n" ));
+
+ if ( num_args < 8 )
+ goto Stack_Underflow;
+
+ nargs = num_args - 2;
+ nargs = nargs - nargs % 6 + 2;
+ num_curves = ( nargs - 2 ) / 6;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_curves * 3 + 2 ) )
+ goto Fail;
+
+ args -= nargs;
+
+ /* first, add the curves */
+ while ( num_curves > 0 )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 6;
+ num_curves--;
+ }
+
+ /* then the final line */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args = stack;
+ }
+ break;
+
+ case cff_op_hflex1:
+ {
+ FT_Pos start_y;
+
+
+ FT_TRACE4(( " hflex1\n" ));
+
+ /* adding five more points: 4 control points, 1 on-curve point */
+ /* -- make sure we have enough space for the start point if it */
+ /* needs to be added */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's y position for later use */
+ start_y = y;
+
+ /* first control point */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* second control point */
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* join point; on curve, with y-value the same as the last */
+ /* control point's y-value */
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ /* third control point, with y-value the same as the join */
+ /* point's y-value */
+ x += args[5];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* fourth control point */
+ x += args[6];
+ y += args[7];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* ending point, with y-value the same as the start */
+ x += args[8];
+ y = start_y;
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_hflex:
+ {
+ FT_Pos start_y;
+
+
+ FT_TRACE4(( " hflex\n" ));
+
+ /* adding six more points; 4 control points, 2 on-curve points */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's y-position for later use */
+ start_y = y;
+
+ /* first control point */
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* second control point */
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* join point; on curve, with y-value the same as the last */
+ /* control point's y-value */
+ x += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ /* third control point, with y-value the same as the join */
+ /* point's y-value */
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* fourth control point */
+ x += args[5];
+ y = start_y;
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* ending point, with y-value the same as the start point's */
+ /* y-value -- we don't add this point, though */
+ x += args[6];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_flex1:
+ {
+ FT_Pos start_x, start_y; /* record start x, y values for */
+ /* alter use */
+ FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */
+ /* algorithm below */
+ FT_Int horizontal, count;
+ FT_Fixed* temp;
+
+
+ FT_TRACE4(( " flex1\n" ));
+
+ /* adding six more points; 4 control points, 2 on-curve points */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's x, y position for later use */
+ start_x = x;
+ start_y = y;
+
+ /* XXX: figure out whether this is supposed to be a horizontal */
+ /* or vertical flex; the Type 2 specification is vague... */
+
+ temp = args;
+
+ /* grab up to the last argument */
+ for ( count = 5; count > 0; count-- )
+ {
+ dx += temp[0];
+ dy += temp[1];
+ temp += 2;
+ }
+
+ if ( dx < 0 )
+ dx = -dx;
+ if ( dy < 0 )
+ dy = -dy;
+
+ /* strange test, but here it is... */
+ horizontal = ( dx > dy );
+
+ for ( count = 5; count > 0; count-- )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y,
+ (FT_Bool)( count == 3 ) );
+ args += 2;
+ }
+
+ /* is last operand an x- or y-delta? */
+ if ( horizontal )
+ {
+ x += args[0];
+ y = start_y;
+ }
+ else
+ {
+ x = start_x;
+ y += args[0];
+ }
+
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_flex:
+ {
+ FT_UInt count;
+
+
+ FT_TRACE4(( " flex\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ for ( count = 6; count > 0; count-- )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y,
+ (FT_Bool)( count == 4 || count == 1 ) );
+ args += 2;
+ }
+
+ args = stack;
+ }
+ break;
+
+ case cff_op_seac:
+ FT_TRACE4(( " seac\n" ));
+
+ error = cff_operator_seac( decoder,
+ args[0], args[1], args[2],
+ (FT_Int)( args[3] >> 16 ),
+ (FT_Int)( args[4] >> 16 ) );
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+
+ /* return now! */
+ FT_TRACE4(( "\n" ));
+ return error;
+
+ case cff_op_endchar:
+ FT_TRACE4(( " endchar\n" ));
+
+ /* We are going to emulate the seac operator. */
+ if ( num_args >= 4 )
+ {
+ /* Save glyph width so that the subglyphs don't overwrite it. */
+ FT_Pos glyph_width = decoder->glyph_width;
+
+
+ error = cff_operator_seac( decoder,
+ 0L, args[-4], args[-3],
+ (FT_Int)( args[-2] >> 16 ),
+ (FT_Int)( args[-1] >> 16 ) );
+
+ decoder->glyph_width = glyph_width;
+ }
+ else
+ {
+ if ( !error )
+ error = FT_Err_Ok;
+
+ cff_builder_close_contour( builder );
+
+ /* close hints recording session */
+ if ( hinter )
+ {
+ if ( hinter->close( hinter->hints,
+ builder->current->n_points ) )
+ goto Syntax_Error;
+
+ /* apply hints to the loaded glyph outline now */
+ hinter->apply( hinter->hints,
+ builder->current,
+ (PSH_Globals)builder->hints_globals,
+ decoder->hint_mode );
+ }
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+ }
+
+ /* return now! */
+ FT_TRACE4(( "\n" ));
+ return error;
+
+ case cff_op_abs:
+ FT_TRACE4(( " abs\n" ));
+
+ if ( args[0] < 0 )
+ args[0] = -args[0];
+ args++;
+ break;
+
+ case cff_op_add:
+ FT_TRACE4(( " add\n" ));
+
+ args[0] += args[1];
+ args++;
+ break;
+
+ case cff_op_sub:
+ FT_TRACE4(( " sub\n" ));
+
+ args[0] -= args[1];
+ args++;
+ break;
+
+ case cff_op_div:
+ FT_TRACE4(( " div\n" ));
+
+ args[0] = FT_DivFix( args[0], args[1] );
+ args++;
+ break;
+
+ case cff_op_neg:
+ FT_TRACE4(( " neg\n" ));
+
+ args[0] = -args[0];
+ args++;
+ break;
+
+ case cff_op_random:
+ {
+ FT_Fixed Rand;
+
+
+ FT_TRACE4(( " rand\n" ));
+
+ Rand = seed;
+ if ( Rand >= 0x8000L )
+ Rand++;
+
+ args[0] = Rand;
+ seed = FT_MulFix( seed, 0x10000L - seed );
+ if ( seed == 0 )
+ seed += 0x2873;
+ args++;
+ }
+ break;
+
+ case cff_op_mul:
+ FT_TRACE4(( " mul\n" ));
+
+ args[0] = FT_MulFix( args[0], args[1] );
+ args++;
+ break;
+
+ case cff_op_sqrt:
+ FT_TRACE4(( " sqrt\n" ));
+
+ if ( args[0] > 0 )
+ {
+ FT_Int count = 9;
+ FT_Fixed root = args[0];
+ FT_Fixed new_root;
+
+
+ for (;;)
+ {
+ new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+ if ( new_root == root || count <= 0 )
+ break;
+ root = new_root;
+ }
+ args[0] = new_root;
+ }
+ else
+ args[0] = 0;
+ args++;
+ break;
+
+ case cff_op_drop:
+ /* nothing */
+ FT_TRACE4(( " drop\n" ));
+
+ break;
+
+ case cff_op_exch:
+ {
+ FT_Fixed tmp;
+
+
+ FT_TRACE4(( " exch\n" ));
+
+ tmp = args[0];
+ args[0] = args[1];
+ args[1] = tmp;
+ args += 2;
+ }
+ break;
+
+ case cff_op_index:
+ {
+ FT_Int idx = (FT_Int)( args[0] >> 16 );
+
+
+ FT_TRACE4(( " index\n" ));
+
+ if ( idx < 0 )
+ idx = 0;
+ else if ( idx > num_args - 2 )
+ idx = num_args - 2;
+ args[0] = args[-( idx + 1 )];
+ args++;
+ }
+ break;
+
+ case cff_op_roll:
+ {
+ FT_Int count = (FT_Int)( args[0] >> 16 );
+ FT_Int idx = (FT_Int)( args[1] >> 16 );
+
+
+ FT_TRACE4(( " roll\n" ));
+
+ if ( count <= 0 )
+ count = 1;
+
+ args -= count;
+ if ( args < stack )
+ goto Stack_Underflow;
+
+ if ( idx >= 0 )
+ {
+ while ( idx > 0 )
+ {
+ FT_Fixed tmp = args[count - 1];
+ FT_Int i;
+
+
+ for ( i = count - 2; i >= 0; i-- )
+ args[i + 1] = args[i];
+ args[0] = tmp;
+ idx--;
+ }
+ }
+ else
+ {
+ while ( idx < 0 )
+ {
+ FT_Fixed tmp = args[0];
+ FT_Int i;
+
+
+ for ( i = 0; i < count - 1; i++ )
+ args[i] = args[i + 1];
+ args[count - 1] = tmp;
+ idx++;
+ }
+ }
+ args += count;
+ }
+ break;
+
+ case cff_op_dup:
+ FT_TRACE4(( " dup\n" ));
+
+ args[1] = args[0];
+ args += 2;
+ break;
+
+ case cff_op_put:
+ {
+ FT_Fixed val = args[0];
+ FT_Int idx = (FT_Int)( args[1] >> 16 );
+
+
+ FT_TRACE4(( " put\n" ));
+
+ if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+ decoder->buildchar[idx] = val;
+ }
+ break;
+
+ case cff_op_get:
+ {
+ FT_Int idx = (FT_Int)( args[0] >> 16 );
+ FT_Fixed val = 0;
+
+
+ FT_TRACE4(( " get\n" ));
+
+ if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+ val = decoder->buildchar[idx];
+
+ args[0] = val;
+ args++;
+ }
+ break;
+
+ case cff_op_store:
+ FT_TRACE4(( " store\n"));
+
+ goto Unimplemented;
+
+ case cff_op_load:
+ FT_TRACE4(( " load\n" ));
+
+ goto Unimplemented;
+
+ case cff_op_dotsection:
+ /* this operator is deprecated and ignored by the parser */
+ FT_TRACE4(( " dotsection\n" ));
+ break;
+
+ case cff_op_closepath:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " closepath (invalid op)\n" ));
+
+ args = stack;
+ break;
+
+ case cff_op_hsbw:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " hsbw (invalid op)\n" ));
+
+ decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
+
+ decoder->builder.left_bearing.x = args[0];
+ decoder->builder.left_bearing.y = 0;
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y;
+ args = stack;
+ break;
+
+ case cff_op_sbw:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " sbw (invalid op)\n" ));
+
+ decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
+
+ decoder->builder.left_bearing.x = args[0];
+ decoder->builder.left_bearing.y = args[1];
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y + args[1];
+ args = stack;
+ break;
+
+ case cff_op_setcurrentpoint:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y + args[1];
+ args = stack;
+ break;
+
+ case cff_op_callothersubr:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " callothersubr (invalid op)\n" ));
+
+ /* subsequent `pop' operands should add the arguments, */
+ /* this is the implementation described for `unknown' other */
+ /* subroutines in the Type1 spec. */
+ /* */
+ /* XXX Fix return arguments (see discussion below). */
+ args -= 2 + ( args[-2] >> 16 );
+ if ( args < stack )
+ goto Stack_Underflow;
+ break;
+
+ case cff_op_pop:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " pop (invalid op)\n" ));
+
+ /* XXX Increasing `args' is wrong: After a certain number of */
+ /* `pop's we get a stack overflow. Reason for doing it is */
+ /* code like this (actually found in a CFF font): */
+ /* */
+ /* 17 1 3 callothersubr */
+ /* pop */
+ /* callsubr */
+ /* */
+ /* Since we handle `callothersubr' as a no-op, and */
+ /* `callsubr' needs at least one argument, `pop' can't be a */
+ /* no-op too as it basically should be. */
+ /* */
+ /* The right solution would be to provide real support for */
+ /* `callothersubr' as done in `t1decode.c', however, given */
+ /* the fact that CFF fonts with `pop' are invalid, it is */
+ /* questionable whether it is worth the time. */
+ args++;
+ break;
+
+ case cff_op_and:
+ {
+ FT_Fixed cond = args[0] && args[1];
+
+
+ FT_TRACE4(( " and\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_or:
+ {
+ FT_Fixed cond = args[0] || args[1];
+
+
+ FT_TRACE4(( " or\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_eq:
+ {
+ FT_Fixed cond = !args[0];
+
+
+ FT_TRACE4(( " eq\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_ifelse:
+ {
+ FT_Fixed cond = ( args[2] <= args[3] );
+
+
+ FT_TRACE4(( " ifelse\n" ));
+
+ if ( !cond )
+ args[0] = args[1];
+ args++;
+ }
+ break;
+
+ case cff_op_callsubr:
+ {
+ FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
+ decoder->locals_bias );
+
+
+ FT_TRACE4(( " callsubr(%d)\n", idx ));
+
+ if ( idx >= decoder->num_locals )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invalid local subr index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+ zone->base = decoder->locals[idx];
+ zone->limit = decoder->locals[idx + 1];
+ zone->cursor = zone->base;
+
+ if ( !zone->base || zone->limit == zone->base )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ }
+ break;
+
+ case cff_op_callgsubr:
+ {
+ FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
+ decoder->globals_bias );
+
+
+ FT_TRACE4(( " callgsubr(%d)\n", idx ));
+
+ if ( idx >= decoder->num_globals )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invalid global subr index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+ zone->base = decoder->globals[idx];
+ zone->limit = decoder->globals[idx + 1];
+ zone->cursor = zone->base;
+
+ if ( !zone->base || zone->limit == zone->base )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ }
+ break;
+
+ case cff_op_return:
+ FT_TRACE4(( " return\n" ));
+
+ if ( decoder->zone <= decoder->zones )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " unexpected return\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone--;
+ zone = decoder->zone;
+ ip = zone->cursor;
+ limit = zone->limit;
+ break;
+
+ default:
+ Unimplemented:
+ FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+ if ( ip[-1] == 12 )
+ FT_ERROR(( " %d", ip[0] ));
+ FT_ERROR(( "\n" ));
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ decoder->top = args;
+
+ if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+ goto Stack_Overflow;
+
+ } /* general operator processing */
+
+ } /* while ip < limit */
+
+ FT_TRACE4(( "..end..\n\n" ));
+
+ Fail:
+ return error;
+
+ Syntax_Error:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+ return FT_THROW( Invalid_File_Format );
+
+ Stack_Underflow:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+ return FT_THROW( Too_Few_Arguments );
+
+ Stack_Overflow:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+ return FT_THROW( Stack_Overflow );
+ }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#if 0 /* unused until we support pure CFF fonts */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_compute_max_advance( TT_Face face,
+ FT_Int* max_advance )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Decoder decoder;
+ FT_Int glyph_index;
+ CFF_Font cff = (CFF_Font)face->other;
+
+
+ *max_advance = 0;
+
+ /* Initialize load decoder */
+ cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ /* For each glyph, parse the glyph charstring and extract */
+ /* the advance width. */
+ for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+ glyph_index++ )
+ {
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+
+
+ /* now get load the unscaled outline */
+ error = cff_get_glyph_data( face, glyph_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ error = cff_decoder_prepare( &decoder, size, glyph_index );
+ if ( !error )
+ error = cff_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+
+ cff_free_glyph_data( face, &charstring, &charstring_len );
+ }
+
+ /* ignore the error if one has occurred -- skip to next glyph */
+ error = FT_Err_Ok;
+ }
+
+ *max_advance = decoder.builder.advance.x;
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_slot_load( CFF_GlyphSlot glyph,
+ CFF_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ CFF_Decoder decoder;
+ TT_Face face = (TT_Face)glyph->root.face;
+ FT_Bool hinting, scaled, force_scaling;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+
+ force_scaling = FALSE;
+
+ /* in a CID-keyed font, consider `glyph_index' as a CID and map */
+ /* it immediately to the real glyph_index -- if it isn't a */
+ /* subsetted font, glyph_indices and CIDs are identical, though */
+ if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
+ cff->charset.cids )
+ {
+ /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
+ if ( glyph_index != 0 )
+ {
+ glyph_index = cff_charset_cid_to_gindex( &cff->charset,
+ glyph_index );
+ if ( glyph_index == 0 )
+ return FT_THROW( Invalid_Argument );
+ }
+ }
+ else if ( glyph_index >= cff->num_glyphs )
+ return FT_THROW( Invalid_Argument );
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ glyph->x_scale = 0x10000L;
+ glyph->y_scale = 0x10000L;
+ if ( size )
+ {
+ glyph->x_scale = size->root.metrics.x_scale;
+ glyph->y_scale = size->root.metrics.y_scale;
+ }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /* try to load embedded bitmap if any */
+ /* */
+ /* XXX: The convention should be emphasized in */
+ /* the documents because it can be confusing. */
+ if ( size )
+ {
+ CFF_Face cff_face = (CFF_Face)size->root.face;
+ SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt;
+ FT_Stream stream = cff_face->root.stream;
+
+
+ if ( size->strike_index != 0xFFFFFFFFUL &&
+ sfnt->load_eblc &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ TT_SBit_MetricsRec metrics;
+
+
+ error = sfnt->load_sbit_image( face,
+ size->strike_index,
+ glyph_index,
+ (FT_Int)load_flags,
+ stream,
+ &glyph->root.bitmap,
+ &metrics );
+
+ if ( !error )
+ {
+ FT_Bool has_vertical_info;
+ FT_UShort advance;
+ FT_Short dummy;
+
+
+ glyph->root.outline.n_points = 0;
+ glyph->root.outline.n_contours = 0;
+
+ glyph->root.metrics.width = (FT_Pos)metrics.width << 6;
+ glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
+
+ glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+ glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+ glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
+
+ glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+ glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+ glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
+
+ glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ glyph->root.bitmap_left = metrics.vertBearingX;
+ glyph->root.bitmap_top = metrics.vertBearingY;
+ }
+ else
+ {
+ glyph->root.bitmap_left = metrics.horiBearingX;
+ glyph->root.bitmap_top = metrics.horiBearingY;
+ }
+
+ /* compute linear advance widths */
+
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
+ glyph_index,
+ &dummy,
+ &advance );
+ glyph->root.linearHoriAdvance = advance;
+
+ has_vertical_info = FT_BOOL(
+ face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 );
+
+ /* get the vertical metrics from the vtmx table if we have one */
+ if ( has_vertical_info )
+ {
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+ glyph_index,
+ &dummy,
+ &advance );
+ glyph->root.linearVertAdvance = advance;
+ }
+ else
+ {
+ /* make up vertical ones */
+ if ( face->os2.version != 0xFFFFU )
+ glyph->root.linearVertAdvance = (FT_Pos)
+ ( face->os2.sTypoAscender - face->os2.sTypoDescender );
+ else
+ glyph->root.linearVertAdvance = (FT_Pos)
+ ( face->horizontal.Ascender - face->horizontal.Descender );
+ }
+
+ return error;
+ }
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* return immediately if we only want the embedded bitmaps */
+ if ( load_flags & FT_LOAD_SBITS_ONLY )
+ return FT_THROW( Invalid_Argument );
+
+ /* if we have a CID subfont, use its matrix (which has already */
+ /* been multiplied with the root matrix) */
+
+ /* this scaling is only relevant if the PS hinter isn't active */
+ if ( cff->num_subfonts )
+ {
+ FT_ULong top_upm, sub_upm;
+ FT_Byte fd_index = cff_fd_select_get( &cff->fd_select,
+ glyph_index );
+
+
+ if ( fd_index >= cff->num_subfonts )
+ fd_index = (FT_Byte)( cff->num_subfonts - 1 );
+
+ top_upm = cff->top_font.font_dict.units_per_em;
+ sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;
+
+
+ font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
+ font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
+
+ if ( top_upm != sub_upm )
+ {
+ glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
+ glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
+
+ force_scaling = TRUE;
+ }
+ }
+ else
+ {
+ font_matrix = cff->top_font.font_dict.font_matrix;
+ font_offset = cff->top_font.font_dict.font_offset;
+ }
+
+ glyph->root.outline.n_points = 0;
+ glyph->root.outline.n_contours = 0;
+
+ /* top-level code ensures that FT_LOAD_NO_HINTING is set */
+ /* if FT_LOAD_NO_SCALE is active */
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+ scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
+
+ glyph->hint = hinting;
+ glyph->scaled = scaled;
+ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */
+
+ {
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face );
+#endif
+
+
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+
+
+ cff_decoder_init( &decoder, face, size, glyph, hinting,
+ FT_LOAD_TARGET_MODE( load_flags ) );
+
+ if ( load_flags & FT_LOAD_ADVANCE_ONLY )
+ decoder.width_only = TRUE;
+
+ decoder.builder.no_recurse =
+ (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
+
+ /* now load the unscaled outline */
+ error = cff_get_glyph_data( face, glyph_index,
+ &charstring, &charstring_len );
+ if ( error )
+ goto Glyph_Build_Finished;
+
+ error = cff_decoder_prepare( &decoder, size, glyph_index );
+ if ( error )
+ goto Glyph_Build_Finished;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ /* choose which CFF renderer to use */
+ if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+ error = cff_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+ else
+#endif
+ {
+ error = cf2_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+
+ /* Adobe's engine uses 16.16 numbers everywhere; */
+ /* as a consequence, glyphs larger than 2000ppem get rejected */
+ if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+ {
+ /* this time, we retry unhinted and scale up the glyph later on */
+ /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+ /* 0x400 for both `x_scale' and `y_scale' in this case) */
+ hinting = FALSE;
+ force_scaling = TRUE;
+ glyph->hint = hinting;
+
+ error = cf2_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+ }
+ }
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Glyph_Build_Finished;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* Control data and length may not be available for incremental */
+ /* fonts. */
+ if ( face->root.internal->incremental_interface )
+ {
+ glyph->root.control_data = 0;
+ glyph->root.control_len = 0;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* We set control_data and control_len if charstrings is loaded. */
+ /* See how charstring loads at cff_index_access_element() in */
+ /* cffload.c. */
+ {
+ CFF_Index csindex = &cff->charstrings_index;
+
+
+ if ( csindex->offsets )
+ {
+ glyph->root.control_data = csindex->bytes +
+ csindex->offsets[glyph_index] - 1;
+ glyph->root.control_len = charstring_len;
+ }
+ }
+
+ Glyph_Build_Finished:
+ /* save new glyph tables, if no error */
+ if ( !error )
+ cff_builder_done( &decoder.builder );
+ /* XXX: anything to do for broken glyph entry? */
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error &&
+ face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = decoder.builder.left_bearing.x;
+ metrics.bearing_y = 0;
+ metrics.advance = decoder.builder.advance.x;
+ metrics.advance_v = decoder.builder.advance.y;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder.builder.left_bearing.x = metrics.bearing_x;
+ decoder.builder.advance.x = metrics.advance;
+ decoder.builder.advance.y = metrics.advance_v;
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ if ( !error )
+ {
+ /* Now, set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax. */
+
+ /* For composite glyphs, return only left side bearing and */
+ /* advance width. */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = glyph->root.internal;
+
+
+ glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
+ glyph->root.metrics.horiAdvance = decoder.glyph_width;
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &glyph->root.metrics;
+ FT_Vector advance;
+ FT_Bool has_vertical_info;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance = decoder.glyph_width;
+ glyph->root.linearHoriAdvance = decoder.glyph_width;
+ glyph->root.internal->glyph_transformed = 0;
+
+ has_vertical_info = FT_BOOL( face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 );
+
+ /* get the vertical metrics from the vtmx table if we have one */
+ if ( has_vertical_info )
+ {
+ FT_Short vertBearingY = 0;
+ FT_UShort vertAdvance = 0;
+
+
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+ glyph_index,
+ &vertBearingY,
+ &vertAdvance );
+ metrics->vertBearingY = vertBearingY;
+ metrics->vertAdvance = vertAdvance;
+ }
+ else
+ {
+ /* make up vertical ones */
+ if ( face->os2.version != 0xFFFFU )
+ metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
+ face->os2.sTypoDescender );
+ else
+ metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
+ face->horizontal.Descender );
+ }
+
+ glyph->root.linearVertAdvance = metrics->vertAdvance;
+
+ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+ glyph->root.outline.flags = 0;
+ if ( size && size->root.metrics.y_ppem < 24 )
+ glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ if ( !( font_matrix.xx == 0x10000L &&
+ font_matrix.yy == 0x10000L &&
+ font_matrix.xy == 0 &&
+ font_matrix.yx == 0 ) )
+ FT_Outline_Transform( &glyph->root.outline, &font_matrix );
+
+ if ( !( font_offset.x == 0 &&
+ font_offset.y == 0 ) )
+ FT_Outline_Translate( &glyph->root.outline,
+ font_offset.x, font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = &glyph->root.outline;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points */
+ if ( !hinting || !decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( has_vertical_info )
+ metrics->vertBearingX = metrics->horiBearingX -
+ metrics->horiAdvance / 2;
+ else
+ {
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
new file mode 100644
index 0000000000..986bba114d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
@@ -0,0 +1,240 @@
+/***************************************************************************/
+/* */
+/* cffgload.h */
+/* */
+/* OpenType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2004, 2006-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFGLOAD_H__
+#define __CFFGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "cffobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_OPERANDS 48
+#define CFF_MAX_SUBRS_CALLS 32
+#define CFF_MAX_TRANS_ELEMENTS 32
+
+
+ /*************************************************************************/
+ /* */
+ /* <Structure> */
+ /* CFF_Builder */
+ /* */
+ /* <Description> */
+ /* A structure used during glyph loading to store its outline. */
+ /* */
+ /* <Fields> */
+ /* memory :: The current memory object. */
+ /* */
+ /* face :: The current face object. */
+ /* */
+ /* glyph :: The current glyph slot. */
+ /* */
+ /* loader :: The current glyph loader. */
+ /* */
+ /* base :: The base glyph outline. */
+ /* */
+ /* current :: The current glyph outline. */
+ /* */
+ /* pos_x :: The horizontal translation (if composite glyph). */
+ /* */
+ /* pos_y :: The vertical translation (if composite glyph). */
+ /* */
+ /* left_bearing :: The left side bearing point. */
+ /* */
+ /* advance :: The horizontal advance vector. */
+ /* */
+ /* bbox :: Unused. */
+ /* */
+ /* path_begun :: A flag which indicates that a new path has begun. */
+ /* */
+ /* load_points :: If this flag is not set, no points are loaded. */
+ /* */
+ /* no_recurse :: Set but not used. */
+ /* */
+ /* metrics_only :: A boolean indicating that we only want to compute */
+ /* the metrics of a given glyph, not load all of its */
+ /* points. */
+ /* */
+ /* hints_funcs :: Auxiliary pointer for hinting. */
+ /* */
+ /* hints_globals :: Auxiliary pointer for hinting. */
+ /* */
+ typedef struct CFF_Builder_
+ {
+ FT_Memory memory;
+ TT_Face face;
+ CFF_GlyphSlot glyph;
+ FT_GlyphLoader loader;
+ FT_Outline* base;
+ FT_Outline* current;
+
+ FT_Pos pos_x;
+ FT_Pos pos_y;
+
+ FT_Vector left_bearing;
+ FT_Vector advance;
+
+ FT_BBox bbox; /* bounding box */
+ FT_Bool path_begun;
+ FT_Bool load_points;
+ FT_Bool no_recurse;
+
+ FT_Bool metrics_only;
+
+ void* hints_funcs; /* hinter-specific */
+ void* hints_globals; /* hinter-specific */
+
+ } CFF_Builder;
+
+
+ FT_LOCAL( FT_Error )
+ cff_check_points( CFF_Builder* builder,
+ FT_Int count );
+
+ FT_LOCAL( void )
+ cff_builder_add_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+ FT_LOCAL( FT_Error )
+ cff_builder_add_point1( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ FT_LOCAL( FT_Error )
+ cff_builder_start_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ FT_LOCAL( void )
+ cff_builder_close_contour( CFF_Builder* builder );
+
+
+ FT_LOCAL( FT_Int )
+ cff_lookup_glyph_by_stdcharcode( CFF_Font cff,
+ FT_Int charcode );
+ FT_LOCAL( FT_Error )
+ cff_get_glyph_data( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Byte** pointer,
+ FT_ULong* length );
+ FT_LOCAL( void )
+ cff_free_glyph_data( TT_Face face,
+ FT_Byte** pointer,
+ FT_ULong length );
+
+
+ /* execution context charstring zone */
+
+ typedef struct CFF_Decoder_Zone_
+ {
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Byte* cursor;
+
+ } CFF_Decoder_Zone;
+
+
+ typedef struct CFF_Decoder_
+ {
+ CFF_Builder builder;
+ CFF_Font cff;
+
+ FT_Fixed stack[CFF_MAX_OPERANDS + 1];
+ FT_Fixed* top;
+
+ CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1];
+ CFF_Decoder_Zone* zone;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ FT_Pos glyph_width;
+ FT_Pos nominal_width;
+
+ FT_Bool read_width;
+ FT_Bool width_only;
+ FT_Int num_hints;
+ FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS];
+
+ FT_UInt num_locals;
+ FT_UInt num_globals;
+
+ FT_Int locals_bias;
+ FT_Int globals_bias;
+
+ FT_Byte** locals;
+ FT_Byte** globals;
+
+ FT_Byte** glyph_names; /* for pure CFF fonts only */
+ FT_UInt num_glyphs; /* number of glyphs in font */
+
+ FT_Render_Mode hint_mode;
+
+ FT_Bool seac;
+
+ CFF_SubFont current_subfont; /* for current glyph_index */
+
+ } CFF_Decoder;
+
+
+ FT_LOCAL( void )
+ cff_decoder_init( CFF_Decoder* decoder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot slot,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode );
+
+ FT_LOCAL( FT_Error )
+ cff_decoder_prepare( CFF_Decoder* decoder,
+ CFF_Size size,
+ FT_UInt glyph_index );
+
+#if 0 /* unused until we support pure CFF fonts */
+
+ /* Compute the maximum advance width of a font through quick parsing */
+ FT_LOCAL( FT_Error )
+ cff_compute_max_advance( TT_Face face,
+ FT_Int* max_advance );
+
+#endif /* 0 */
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ FT_LOCAL( FT_Error )
+ cff_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+#endif
+
+ FT_LOCAL( FT_Error )
+ cff_slot_load( CFF_GlyphSlot glyph,
+ CFF_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CFFGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
new file mode 100644
index 0000000000..2e5cd9de46
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
@@ -0,0 +1,1696 @@
+/***************************************************************************/
+/* */
+/* cffload.c */
+/* */
+/* OpenType and CFF data/program tables loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/t1tables.h"
+
+#include "cffload.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+
+
+#if 1
+
+ static const FT_UShort cff_isoadobe_charset[229] =
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71,
+ 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87,
+ 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103,
+ 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167,
+ 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183,
+ 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199,
+ 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215,
+ 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228
+ };
+
+ static const FT_UShort cff_expert_charset[166] =
+ {
+ 0, 1, 229, 230, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99,
+ 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 252,
+ 253, 254, 255, 256, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, 266, 109, 110,
+ 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, 286, 287, 288, 289, 290,
+ 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306,
+ 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 158, 155, 163, 319,
+ 320, 321, 322, 323, 324, 325, 326, 150,
+ 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340,
+ 341, 342, 343, 344, 345, 346, 347, 348,
+ 349, 350, 351, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+ };
+
+ static const FT_UShort cff_expertsubset_charset[87] =
+ {
+ 0, 1, 231, 232, 235, 236, 237, 238,
+ 13, 14, 15, 99, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 27, 28,
+ 249, 250, 251, 253, 254, 255, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 109, 110, 267, 268, 269, 270, 272,
+ 300, 301, 302, 305, 314, 315, 158, 155,
+ 163, 320, 321, 322, 323, 324, 325, 326,
+ 150, 164, 169, 327, 328, 329, 330, 331,
+ 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346
+ };
+
+ static const FT_UShort cff_standard_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56,
+ 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99, 100, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, 110,
+ 0, 111, 112, 113, 114, 0, 115, 116,
+ 117, 118, 119, 120, 121, 122, 0, 123,
+ 0, 124, 125, 126, 127, 128, 129, 130,
+ 131, 0, 132, 133, 0, 134, 135, 136,
+ 137, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 138, 0, 139, 0, 0, 0, 0,
+ 140, 141, 142, 143, 0, 0, 0, 0,
+ 0, 144, 0, 0, 0, 145, 0, 0,
+ 146, 147, 148, 149, 0, 0, 0, 0
+ };
+
+ static const FT_UShort cff_expert_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 229, 230, 0, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99,
+ 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 252,
+ 0, 253, 254, 255, 256, 257, 0, 0,
+ 0, 258, 0, 0, 259, 260, 261, 262,
+ 0, 0, 263, 264, 265, 0, 266, 109,
+ 110, 267, 268, 269, 0, 270, 271, 272,
+ 273, 274, 275, 276, 277, 278, 279, 280,
+ 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 304, 305, 306, 0, 0, 307, 308,
+ 309, 310, 311, 0, 312, 0, 0, 312,
+ 0, 0, 314, 315, 0, 0, 316, 317,
+ 318, 0, 0, 0, 158, 155, 163, 319,
+ 320, 321, 322, 323, 324, 325, 0, 0,
+ 326, 150, 164, 169, 327, 328, 329, 330,
+ 331, 332, 333, 334, 335, 336, 337, 338,
+ 339, 340, 341, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370,
+ 371, 372, 373, 374, 375, 376, 377, 378
+ };
+
+#endif /* 1 */
+
+
+ FT_LOCAL_DEF( FT_UShort )
+ cff_get_standard_encoding( FT_UInt charcode )
+ {
+ return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
+ : 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffload
+
+
+ /* read an offset from the index's stream current position */
+ static FT_ULong
+ cff_index_read_offset( CFF_Index idx,
+ FT_Error *errorp )
+ {
+ FT_Error error;
+ FT_Stream stream = idx->stream;
+ FT_Byte tmp[4];
+ FT_ULong result = 0;
+
+
+ if ( !FT_STREAM_READ( tmp, idx->off_size ) )
+ {
+ FT_Int nn;
+
+
+ for ( nn = 0; nn < idx->off_size; nn++ )
+ result = ( result << 8 ) | tmp[nn];
+ }
+
+ *errorp = error;
+ return result;
+ }
+
+
+ static FT_Error
+ cff_index_init( CFF_Index idx,
+ FT_Stream stream,
+ FT_Bool load )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_UShort count;
+
+
+ FT_MEM_ZERO( idx, sizeof ( *idx ) );
+
+ idx->stream = stream;
+ idx->start = FT_STREAM_POS();
+ if ( !FT_READ_USHORT( count ) &&
+ count > 0 )
+ {
+ FT_Byte offsize;
+ FT_ULong size;
+
+
+ /* there is at least one element; read the offset size, */
+ /* then access the offset table to compute the index's total size */
+ if ( FT_READ_BYTE( offsize ) )
+ goto Exit;
+
+ if ( offsize < 1 || offsize > 4 )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ idx->count = count;
+ idx->off_size = offsize;
+ size = (FT_ULong)( count + 1 ) * offsize;
+
+ idx->data_offset = idx->start + 3 + size;
+
+ if ( FT_STREAM_SKIP( size - offsize ) )
+ goto Exit;
+
+ size = cff_index_read_offset( idx, &error );
+ if ( error )
+ goto Exit;
+
+ if ( size == 0 )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ idx->data_size = --size;
+
+ if ( load )
+ {
+ /* load the data */
+ if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
+ goto Exit;
+ }
+ else
+ {
+ /* skip the data */
+ if ( FT_STREAM_SKIP( size ) )
+ goto Exit;
+ }
+ }
+
+ Exit:
+ if ( error )
+ FT_FREE( idx->offsets );
+
+ return error;
+ }
+
+
+ static void
+ cff_index_done( CFF_Index idx )
+ {
+ if ( idx->stream )
+ {
+ FT_Stream stream = idx->stream;
+ FT_Memory memory = stream->memory;
+
+
+ if ( idx->bytes )
+ FT_FRAME_RELEASE( idx->bytes );
+
+ FT_FREE( idx->offsets );
+ FT_MEM_ZERO( idx, sizeof ( *idx ) );
+ }
+ }
+
+
+ static FT_Error
+ cff_index_load_offsets( CFF_Index idx )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Stream stream = idx->stream;
+ FT_Memory memory = stream->memory;
+
+
+ if ( idx->count > 0 && idx->offsets == NULL )
+ {
+ FT_Byte offsize = idx->off_size;
+ FT_ULong data_size;
+ FT_Byte* p;
+ FT_Byte* p_end;
+ FT_ULong* poff;
+
+
+ data_size = (FT_ULong)( idx->count + 1 ) * offsize;
+
+ if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
+ FT_STREAM_SEEK( idx->start + 3 ) ||
+ FT_FRAME_ENTER( data_size ) )
+ goto Exit;
+
+ poff = idx->offsets;
+ p = (FT_Byte*)stream->cursor;
+ p_end = p + data_size;
+
+ switch ( offsize )
+ {
+ case 1:
+ for ( ; p < p_end; p++, poff++ )
+ poff[0] = p[0];
+ break;
+
+ case 2:
+ for ( ; p < p_end; p += 2, poff++ )
+ poff[0] = FT_PEEK_USHORT( p );
+ break;
+
+ case 3:
+ for ( ; p < p_end; p += 3, poff++ )
+ poff[0] = FT_PEEK_OFF3( p );
+ break;
+
+ default:
+ for ( ; p < p_end; p += 4, poff++ )
+ poff[0] = FT_PEEK_ULONG( p );
+ }
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ if ( error )
+ FT_FREE( idx->offsets );
+
+ return error;
+ }
+
+
+ /* Allocate a table containing pointers to an index's elements. */
+ /* The `pool' argument makes this function convert the index */
+ /* entries to C-style strings (this is, NULL-terminated). */
+ static FT_Error
+ cff_index_get_pointers( CFF_Index idx,
+ FT_Byte*** table,
+ FT_Byte** pool )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = idx->stream->memory;
+
+ FT_Byte** t = NULL;
+ FT_Byte* new_bytes = NULL;
+
+
+ *table = NULL;
+
+ if ( idx->offsets == NULL )
+ {
+ error = cff_index_load_offsets( idx );
+ if ( error )
+ goto Exit;
+ }
+
+ if ( idx->count > 0 &&
+ !FT_NEW_ARRAY( t, idx->count + 1 ) &&
+ ( !pool || !FT_ALLOC( new_bytes,
+ idx->data_size + idx->count ) ) )
+ {
+ FT_ULong n, cur_offset;
+ FT_ULong extra = 0;
+ FT_Byte* org_bytes = idx->bytes;
+
+
+ /* at this point, `idx->offsets' can't be NULL */
+ cur_offset = idx->offsets[0] - 1;
+
+ /* sanity check */
+ if ( cur_offset >= idx->data_size )
+ {
+ FT_TRACE0(( "cff_index_get_pointers:"
+ " invalid first offset value %d set to zero\n",
+ cur_offset ));
+ cur_offset = 0;
+ }
+
+ if ( !pool )
+ t[0] = org_bytes + cur_offset;
+ else
+ t[0] = new_bytes + cur_offset;
+
+ for ( n = 1; n <= idx->count; n++ )
+ {
+ FT_ULong next_offset = idx->offsets[n] - 1;
+
+
+ /* empty slot + two sanity checks for invalid offset tables */
+ if ( next_offset == 0 ||
+ next_offset < cur_offset ||
+ ( next_offset >= idx->data_size && n < idx->count ) )
+ next_offset = cur_offset;
+
+ if ( !pool )
+ t[n] = org_bytes + next_offset;
+ else
+ {
+ t[n] = new_bytes + next_offset + extra;
+
+ if ( next_offset != cur_offset )
+ {
+ FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
+ t[n][0] = '\0';
+ t[n] += 1;
+ extra++;
+ }
+ }
+
+ cur_offset = next_offset;
+ }
+ *table = t;
+
+ if ( pool )
+ *pool = new_bytes;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_index_access_element( CFF_Index idx,
+ FT_UInt element,
+ FT_Byte** pbytes,
+ FT_ULong* pbyte_len )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( idx && idx->count > element )
+ {
+ /* compute start and end offsets */
+ FT_Stream stream = idx->stream;
+ FT_ULong off1, off2 = 0;
+
+
+ /* load offsets from file or the offset table */
+ if ( !idx->offsets )
+ {
+ FT_ULong pos = element * idx->off_size;
+
+
+ if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
+ goto Exit;
+
+ off1 = cff_index_read_offset( idx, &error );
+ if ( error )
+ goto Exit;
+
+ if ( off1 != 0 )
+ {
+ do
+ {
+ element++;
+ off2 = cff_index_read_offset( idx, &error );
+ }
+ while ( off2 == 0 && element < idx->count );
+ }
+ }
+ else /* use offsets table */
+ {
+ off1 = idx->offsets[element];
+ if ( off1 )
+ {
+ do
+ {
+ element++;
+ off2 = idx->offsets[element];
+
+ } while ( off2 == 0 && element < idx->count );
+ }
+ }
+
+ /* XXX: should check off2 does not exceed the end of this entry; */
+ /* at present, only truncate off2 at the end of this stream */
+ if ( off2 > stream->size + 1 ||
+ idx->data_offset > stream->size - off2 + 1 )
+ {
+ FT_ERROR(( "cff_index_access_element:"
+ " offset to next entry (%d)"
+ " exceeds the end of stream (%d)\n",
+ off2, stream->size - idx->data_offset + 1 ));
+ off2 = stream->size - idx->data_offset + 1;
+ }
+
+ /* access element */
+ if ( off1 && off2 > off1 )
+ {
+ *pbyte_len = off2 - off1;
+
+ if ( idx->bytes )
+ {
+ /* this index was completely loaded in memory, that's easy */
+ *pbytes = idx->bytes + off1 - 1;
+ }
+ else
+ {
+ /* this index is still on disk/file, access it through a frame */
+ if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
+ FT_FRAME_EXTRACT( off2 - off1, *pbytes ) )
+ goto Exit;
+ }
+ }
+ else
+ {
+ /* empty index element */
+ *pbytes = 0;
+ *pbyte_len = 0;
+ }
+ }
+ else
+ error = FT_THROW( Invalid_Argument );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_index_forget_element( CFF_Index idx,
+ FT_Byte** pbytes )
+ {
+ if ( idx->bytes == 0 )
+ {
+ FT_Stream stream = idx->stream;
+
+
+ FT_FRAME_RELEASE( *pbytes );
+ }
+ }
+
+
+ /* get an entry from Name INDEX */
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_name( CFF_Font font,
+ FT_UInt element )
+ {
+ CFF_Index idx = &font->name_index;
+ FT_Memory memory = idx->stream->memory;
+ FT_Byte* bytes;
+ FT_ULong byte_len;
+ FT_Error error;
+ FT_String* name = 0;
+
+
+ error = cff_index_access_element( idx, element, &bytes, &byte_len );
+ if ( error )
+ goto Exit;
+
+ if ( !FT_ALLOC( name, byte_len + 1 ) )
+ {
+ FT_MEM_COPY( name, bytes, byte_len );
+ name[byte_len] = 0;
+ }
+ cff_index_forget_element( idx, &bytes );
+
+ Exit:
+ return name;
+ }
+
+
+ /* get an entry from String INDEX */
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_string( CFF_Font font,
+ FT_UInt element )
+ {
+ return ( element < font->num_strings )
+ ? (FT_String*)font->strings[element]
+ : NULL;
+ }
+
+
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_sid_string( CFF_Font font,
+ FT_UInt sid )
+ {
+ /* value 0xFFFFU indicates a missing dictionary entry */
+ if ( sid == 0xFFFFU )
+ return NULL;
+
+ /* if it is not a standard string, return it */
+ if ( sid > 390 )
+ return cff_index_get_string( font, sid - 391 );
+
+ /* CID-keyed CFF fonts don't have glyph names */
+ if ( !font->psnames )
+ return NULL;
+
+ /* this is a standard string */
+ return (FT_String *)font->psnames->adobe_std_strings( sid );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** FD Select table support ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static void
+ CFF_Done_FD_Select( CFF_FDSelect fdselect,
+ FT_Stream stream )
+ {
+ if ( fdselect->data )
+ FT_FRAME_RELEASE( fdselect->data );
+
+ fdselect->data_size = 0;
+ fdselect->format = 0;
+ fdselect->range_count = 0;
+ }
+
+
+ static FT_Error
+ CFF_Load_FD_Select( CFF_FDSelect fdselect,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong offset )
+ {
+ FT_Error error;
+ FT_Byte format;
+ FT_UInt num_ranges;
+
+
+ /* read format */
+ if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
+ goto Exit;
+
+ fdselect->format = format;
+ fdselect->cache_count = 0; /* clear cache */
+
+ switch ( format )
+ {
+ case 0: /* format 0, that's simple */
+ fdselect->data_size = num_glyphs;
+ goto Load_Data;
+
+ case 3: /* format 3, a tad more complex */
+ if ( FT_READ_USHORT( num_ranges ) )
+ goto Exit;
+
+ fdselect->data_size = num_ranges * 3 + 2;
+
+ Load_Data:
+ if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
+ goto Exit;
+ break;
+
+ default: /* hmm... that's wrong */
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Byte )
+ cff_fd_select_get( CFF_FDSelect fdselect,
+ FT_UInt glyph_index )
+ {
+ FT_Byte fd = 0;
+
+
+ switch ( fdselect->format )
+ {
+ case 0:
+ fd = fdselect->data[glyph_index];
+ break;
+
+ case 3:
+ /* first, compare to cache */
+ if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
+ fdselect->cache_count )
+ {
+ fd = fdselect->cache_fd;
+ break;
+ }
+
+ /* then, lookup the ranges array */
+ {
+ FT_Byte* p = fdselect->data;
+ FT_Byte* p_limit = p + fdselect->data_size;
+ FT_Byte fd2;
+ FT_UInt first, limit;
+
+
+ first = FT_NEXT_USHORT( p );
+ do
+ {
+ if ( glyph_index < first )
+ break;
+
+ fd2 = *p++;
+ limit = FT_NEXT_USHORT( p );
+
+ if ( glyph_index < limit )
+ {
+ fd = fd2;
+
+ /* update cache */
+ fdselect->cache_first = first;
+ fdselect->cache_count = limit-first;
+ fdselect->cache_fd = fd2;
+ break;
+ }
+ first = limit;
+
+ } while ( p < p_limit );
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return fd;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** CFF font support ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ cff_charset_compute_cids( CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt i;
+ FT_Long j;
+ FT_UShort max_cid = 0;
+
+
+ if ( charset->max_cid > 0 )
+ goto Exit;
+
+ for ( i = 0; i < num_glyphs; i++ )
+ {
+ if ( charset->sids[i] > max_cid )
+ max_cid = charset->sids[i];
+ }
+
+ if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
+ goto Exit;
+
+ /* When multiple GIDs map to the same CID, we choose the lowest */
+ /* GID. This is not described in any spec, but it matches the */
+ /* behaviour of recent Acroread versions. */
+ for ( j = num_glyphs - 1; j >= 0 ; j-- )
+ charset->cids[charset->sids[j]] = (FT_UShort)j;
+
+ charset->max_cid = max_cid;
+ charset->num_glyphs = num_glyphs;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ cff_charset_cid_to_gindex( CFF_Charset charset,
+ FT_UInt cid )
+ {
+ FT_UInt result = 0;
+
+
+ if ( cid <= charset->max_cid )
+ result = charset->cids[cid];
+
+ return result;
+ }
+
+
+ static void
+ cff_charset_free_cids( CFF_Charset charset,
+ FT_Memory memory )
+ {
+ FT_FREE( charset->cids );
+ charset->max_cid = 0;
+ }
+
+
+ static void
+ cff_charset_done( CFF_Charset charset,
+ FT_Stream stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ cff_charset_free_cids( charset, memory );
+
+ FT_FREE( charset->sids );
+ charset->format = 0;
+ charset->offset = 0;
+ }
+
+
+ static FT_Error
+ cff_charset_load( CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_ULong offset,
+ FT_Bool invert )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_UShort glyph_sid;
+
+
+ /* If the the offset is greater than 2, we have to parse the */
+ /* charset table. */
+ if ( offset > 2 )
+ {
+ FT_UInt j;
+
+
+ charset->offset = base_offset + offset;
+
+ /* Get the format of the table. */
+ if ( FT_STREAM_SEEK( charset->offset ) ||
+ FT_READ_BYTE( charset->format ) )
+ goto Exit;
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* assign the .notdef glyph */
+ charset->sids[0] = 0;
+
+ switch ( charset->format )
+ {
+ case 0:
+ if ( num_glyphs > 0 )
+ {
+ if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
+ goto Exit;
+
+ for ( j = 1; j < num_glyphs; j++ )
+ charset->sids[j] = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+ }
+ break;
+
+ case 1:
+ case 2:
+ {
+ FT_UInt nleft;
+ FT_UInt i;
+
+
+ j = 1;
+
+ while ( j < num_glyphs )
+ {
+ /* Read the first glyph sid of the range. */
+ if ( FT_READ_USHORT( glyph_sid ) )
+ goto Exit;
+
+ /* Read the number of glyphs in the range. */
+ if ( charset->format == 2 )
+ {
+ if ( FT_READ_USHORT( nleft ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_READ_BYTE( nleft ) )
+ goto Exit;
+ }
+
+ /* try to rescue some of the SIDs if `nleft' is too large */
+ if ( glyph_sid > 0xFFFFL - nleft )
+ {
+ FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
+ " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
+ nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
+ }
+
+ /* Fill in the range of sids -- `nleft + 1' glyphs. */
+ for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
+ charset->sids[j] = glyph_sid;
+ }
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_charset_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+ else
+ {
+ /* Parse default tables corresponding to offset == 0, 1, or 2. */
+ /* CFF specification intimates the following: */
+ /* */
+ /* In order to use a predefined charset, the following must be */
+ /* true: The charset constructed for the glyphs in the font's */
+ /* charstrings dictionary must match the predefined charset in */
+ /* the first num_glyphs. */
+
+ charset->offset = offset; /* record charset type */
+
+ switch ( (FT_UInt)offset )
+ {
+ case 0:
+ if ( num_glyphs > 229 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe ISO-Latin)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
+
+ break;
+
+ case 1:
+ if ( num_glyphs > 166 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe Expert)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
+
+ break;
+
+ case 2:
+ if ( num_glyphs > 87 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe Expert Subset)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
+
+ break;
+
+ default:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* we have to invert the `sids' array for subsetted CID-keyed fonts */
+ if ( invert )
+ error = cff_charset_compute_cids( charset, num_glyphs, memory );
+
+ Exit:
+ /* Clean up if there was an error. */
+ if ( error )
+ {
+ FT_FREE( charset->sids );
+ FT_FREE( charset->cids );
+ charset->format = 0;
+ charset->offset = 0;
+ charset->sids = 0;
+ }
+
+ return error;
+ }
+
+
+ static void
+ cff_encoding_done( CFF_Encoding encoding )
+ {
+ encoding->format = 0;
+ encoding->offset = 0;
+ encoding->count = 0;
+ }
+
+
+ static FT_Error
+ cff_encoding_load( CFF_Encoding encoding,
+ CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_ULong offset )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ FT_UInt j;
+ FT_UShort glyph_sid;
+ FT_UInt glyph_code;
+
+
+ /* Check for charset->sids. If we do not have this, we fail. */
+ if ( !charset->sids )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Zero out the code to gid/sid mappings. */
+ for ( j = 0; j < 256; j++ )
+ {
+ encoding->sids [j] = 0;
+ encoding->codes[j] = 0;
+ }
+
+ /* Note: The encoding table in a CFF font is indexed by glyph index; */
+ /* the first encoded glyph index is 1. Hence, we read the character */
+ /* code (`glyph_code') at index j and make the assignment: */
+ /* */
+ /* encoding->codes[glyph_code] = j + 1 */
+ /* */
+ /* We also make the assignment: */
+ /* */
+ /* encoding->sids[glyph_code] = charset->sids[j + 1] */
+ /* */
+ /* This gives us both a code to GID and a code to SID mapping. */
+
+ if ( offset > 1 )
+ {
+ encoding->offset = base_offset + offset;
+
+ /* we need to parse the table to determine its size */
+ if ( FT_STREAM_SEEK( encoding->offset ) ||
+ FT_READ_BYTE( encoding->format ) ||
+ FT_READ_BYTE( count ) )
+ goto Exit;
+
+ switch ( encoding->format & 0x7F )
+ {
+ case 0:
+ {
+ FT_Byte* p;
+
+
+ /* By convention, GID 0 is always ".notdef" and is never */
+ /* coded in the font. Hence, the number of codes found */
+ /* in the table is `count+1'. */
+ /* */
+ encoding->count = count + 1;
+
+ if ( FT_FRAME_ENTER( count ) )
+ goto Exit;
+
+ p = (FT_Byte*)stream->cursor;
+
+ for ( j = 1; j <= count; j++ )
+ {
+ glyph_code = *p++;
+
+ /* Make sure j is not too big. */
+ if ( j < num_glyphs )
+ {
+ /* Assign code to GID mapping. */
+ encoding->codes[glyph_code] = (FT_UShort)j;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = charset->sids[j];
+ }
+ }
+
+ FT_FRAME_EXIT();
+ }
+ break;
+
+ case 1:
+ {
+ FT_UInt nleft;
+ FT_UInt i = 1;
+ FT_UInt k;
+
+
+ encoding->count = 0;
+
+ /* Parse the Format1 ranges. */
+ for ( j = 0; j < count; j++, i += nleft )
+ {
+ /* Read the first glyph code of the range. */
+ if ( FT_READ_BYTE( glyph_code ) )
+ goto Exit;
+
+ /* Read the number of codes in the range. */
+ if ( FT_READ_BYTE( nleft ) )
+ goto Exit;
+
+ /* Increment nleft, so we read `nleft + 1' codes/sids. */
+ nleft++;
+
+ /* compute max number of character codes */
+ if ( (FT_UInt)nleft > encoding->count )
+ encoding->count = nleft;
+
+ /* Fill in the range of codes/sids. */
+ for ( k = i; k < nleft + i; k++, glyph_code++ )
+ {
+ /* Make sure k is not too big. */
+ if ( k < num_glyphs && glyph_code < 256 )
+ {
+ /* Assign code to GID mapping. */
+ encoding->codes[glyph_code] = (FT_UShort)k;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = charset->sids[k];
+ }
+ }
+ }
+
+ /* simple check; one never knows what can be found in a font */
+ if ( encoding->count > 256 )
+ encoding->count = 256;
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Parse supplemental encodings, if any. */
+ if ( encoding->format & 0x80 )
+ {
+ FT_UInt gindex;
+
+
+ /* count supplements */
+ if ( FT_READ_BYTE( count ) )
+ goto Exit;
+
+ for ( j = 0; j < count; j++ )
+ {
+ /* Read supplemental glyph code. */
+ if ( FT_READ_BYTE( glyph_code ) )
+ goto Exit;
+
+ /* Read the SID associated with this glyph code. */
+ if ( FT_READ_USHORT( glyph_sid ) )
+ goto Exit;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = glyph_sid;
+
+ /* First, look up GID which has been assigned to */
+ /* SID glyph_sid. */
+ for ( gindex = 0; gindex < num_glyphs; gindex++ )
+ {
+ if ( charset->sids[gindex] == glyph_sid )
+ {
+ encoding->codes[glyph_code] = (FT_UShort)gindex;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* We take into account the fact a CFF font can use a predefined */
+ /* encoding without containing all of the glyphs encoded by this */
+ /* encoding (see the note at the end of section 12 in the CFF */
+ /* specification). */
+
+ switch ( (FT_UInt)offset )
+ {
+ case 0:
+ /* First, copy the code to SID mapping. */
+ FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
+ goto Populate;
+
+ case 1:
+ /* First, copy the code to SID mapping. */
+ FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
+
+ Populate:
+ /* Construct code to GID mapping from code to SID mapping */
+ /* and charset. */
+
+ encoding->count = 0;
+
+ error = cff_charset_compute_cids( charset, num_glyphs,
+ stream->memory );
+ if ( error )
+ goto Exit;
+
+ for ( j = 0; j < 256; j++ )
+ {
+ FT_UInt sid = encoding->sids[j];
+ FT_UInt gid = 0;
+
+
+ if ( sid )
+ gid = cff_charset_cid_to_gindex( charset, sid );
+
+ if ( gid != 0 )
+ {
+ encoding->codes[j] = (FT_UShort)gid;
+ encoding->count = j + 1;
+ }
+ else
+ {
+ encoding->codes[j] = 0;
+ encoding->sids [j] = 0;
+ }
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ Exit:
+
+ /* Clean up if there was an error. */
+ return error;
+ }
+
+
+ static FT_Error
+ cff_subfont_load( CFF_SubFont font,
+ CFF_Index idx,
+ FT_UInt font_index,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_Library library )
+ {
+ FT_Error error;
+ CFF_ParserRec parser;
+ FT_Byte* dict = NULL;
+ FT_ULong dict_len;
+ CFF_FontRecDict top = &font->font_dict;
+ CFF_Private priv = &font->private_dict;
+
+
+ cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
+
+ /* set defaults */
+ FT_MEM_ZERO( top, sizeof ( *top ) );
+
+ top->underline_position = -( 100L << 16 );
+ top->underline_thickness = 50L << 16;
+ top->charstring_type = 2;
+ top->font_matrix.xx = 0x10000L;
+ top->font_matrix.yy = 0x10000L;
+ top->cid_count = 8720;
+
+ /* we use the implementation specific SID value 0xFFFF to indicate */
+ /* missing entries */
+ top->version = 0xFFFFU;
+ top->notice = 0xFFFFU;
+ top->copyright = 0xFFFFU;
+ top->full_name = 0xFFFFU;
+ top->family_name = 0xFFFFU;
+ top->weight = 0xFFFFU;
+ top->embedded_postscript = 0xFFFFU;
+
+ top->cid_registry = 0xFFFFU;
+ top->cid_ordering = 0xFFFFU;
+ top->cid_font_name = 0xFFFFU;
+
+ error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+ if ( !error )
+ {
+ FT_TRACE4(( " top dictionary:\n" ));
+ error = cff_parser_run( &parser, dict, dict + dict_len );
+ }
+
+ cff_index_forget_element( idx, &dict );
+
+ if ( error )
+ goto Exit;
+
+ /* if it is a CID font, we stop there */
+ if ( top->cid_registry != 0xFFFFU )
+ goto Exit;
+
+ /* parse the private dictionary, if any */
+ if ( top->private_offset && top->private_size )
+ {
+ /* set defaults */
+ FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+ priv->blue_shift = 7;
+ priv->blue_fuzz = 1;
+ priv->lenIV = -1;
+ priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+ priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+ cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );
+
+ if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
+ FT_FRAME_ENTER( font->font_dict.private_size ) )
+ goto Exit;
+
+ FT_TRACE4(( " private dictionary:\n" ));
+ error = cff_parser_run( &parser,
+ (FT_Byte*)stream->cursor,
+ (FT_Byte*)stream->limit );
+ FT_FRAME_EXIT();
+ if ( error )
+ goto Exit;
+
+ /* ensure that `num_blue_values' is even */
+ priv->num_blue_values &= ~1;
+ }
+
+ /* read the local subrs, if any */
+ if ( priv->local_subrs_offset )
+ {
+ if ( FT_STREAM_SEEK( base_offset + top->private_offset +
+ priv->local_subrs_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &font->local_subrs_index, stream, 1 );
+ if ( error )
+ goto Exit;
+
+ error = cff_index_get_pointers( &font->local_subrs_index,
+ &font->local_subrs, NULL );
+ if ( error )
+ goto Exit;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ cff_subfont_done( FT_Memory memory,
+ CFF_SubFont subfont )
+ {
+ if ( subfont )
+ {
+ cff_index_done( &subfont->local_subrs_index );
+ FT_FREE( subfont->local_subrs );
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_font_load( FT_Library library,
+ FT_Stream stream,
+ FT_Int face_index,
+ CFF_Font font,
+ FT_Bool pure_cff )
+ {
+ static const FT_Frame_Field cff_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_FontRec
+
+ FT_FRAME_START( 4 ),
+ FT_FRAME_BYTE( version_major ),
+ FT_FRAME_BYTE( version_minor ),
+ FT_FRAME_BYTE( header_size ),
+ FT_FRAME_BYTE( absolute_offsize ),
+ FT_FRAME_END
+ };
+
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong base_offset;
+ CFF_FontRecDict dict;
+ CFF_IndexRec string_index;
+ FT_Int subfont_index;
+
+
+ FT_ZERO( font );
+ FT_ZERO( &string_index );
+
+ font->stream = stream;
+ font->memory = memory;
+ dict = &font->top_font.font_dict;
+ base_offset = FT_STREAM_POS();
+
+ /* read CFF font header */
+ if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
+ goto Exit;
+
+ /* check format */
+ if ( font->version_major != 1 ||
+ font->header_size < 4 ||
+ font->absolute_offsize > 4 )
+ {
+ FT_TRACE2(( " not a CFF font header\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* skip the rest of the header */
+ if ( FT_STREAM_SKIP( font->header_size - 4 ) )
+ goto Exit;
+
+ /* read the name, top dict, string and global subrs index */
+ if ( FT_SET_ERROR( cff_index_init( &font->name_index,
+ stream, 0 ) ) ||
+ FT_SET_ERROR( cff_index_init( &font->font_dict_index,
+ stream, 0 ) ) ||
+ FT_SET_ERROR( cff_index_init( &string_index,
+ stream, 1 ) ) ||
+ FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+ stream, 1 ) ) ||
+ FT_SET_ERROR( cff_index_get_pointers( &string_index,
+ &font->strings,
+ &font->string_pool ) ) )
+ goto Exit;
+
+ font->num_strings = string_index.count;
+
+ if ( pure_cff )
+ {
+ /* well, we don't really forget the `disabled' fonts... */
+ subfont_index = face_index;
+
+ if ( subfont_index >= (FT_Int)font->name_index.count )
+ {
+ FT_ERROR(( "cff_font_load:"
+ " invalid subfont index for pure CFF font (%d)\n",
+ subfont_index ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ font->num_faces = font->name_index.count;
+ }
+ else
+ {
+ subfont_index = 0;
+
+ if ( font->name_index.count > 1 )
+ {
+ FT_ERROR(( "cff_font_load:"
+ " invalid CFF font with multiple subfonts\n"
+ " "
+ " in SFNT wrapper\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* in case of a font format check, simply exit now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* now, parse the top-level font dictionary */
+ FT_TRACE4(( "parsing top-level\n" ));
+ error = cff_subfont_load( &font->top_font,
+ &font->font_dict_index,
+ subfont_index,
+ stream,
+ base_offset,
+ library );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &font->charstrings_index, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ /* now, check for a CID font */
+ if ( dict->cid_registry != 0xFFFFU )
+ {
+ CFF_IndexRec fd_index;
+ CFF_SubFont sub = NULL;
+ FT_UInt idx;
+
+
+ /* this is a CID-keyed font, we must now allocate a table of */
+ /* sub-fonts, then load each of them separately */
+ if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &fd_index, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( fd_index.count > CFF_MAX_CID_FONTS )
+ {
+ FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
+ goto Fail_CID;
+ }
+
+ /* allocate & read each font dict independently */
+ font->num_subfonts = fd_index.count;
+ if ( FT_NEW_ARRAY( sub, fd_index.count ) )
+ goto Fail_CID;
+
+ /* set up pointer table */
+ for ( idx = 0; idx < fd_index.count; idx++ )
+ font->subfonts[idx] = sub + idx;
+
+ /* now load each subfont independently */
+ for ( idx = 0; idx < fd_index.count; idx++ )
+ {
+ sub = font->subfonts[idx];
+ FT_TRACE4(( "parsing subfont %u\n", idx ));
+ error = cff_subfont_load( sub, &fd_index, idx,
+ stream, base_offset, library );
+ if ( error )
+ goto Fail_CID;
+ }
+
+ /* now load the FD Select array */
+ error = CFF_Load_FD_Select( &font->fd_select,
+ font->charstrings_index.count,
+ stream,
+ base_offset + dict->cid_fd_select_offset );
+
+ Fail_CID:
+ cff_index_done( &fd_index );
+
+ if ( error )
+ goto Exit;
+ }
+ else
+ font->num_subfonts = 0;
+
+ /* read the charstrings index now */
+ if ( dict->charstrings_offset == 0 )
+ {
+ FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ font->num_glyphs = font->charstrings_index.count;
+
+ error = cff_index_get_pointers( &font->global_subrs_index,
+ &font->global_subrs, NULL );
+
+ if ( error )
+ goto Exit;
+
+ /* read the Charset and Encoding tables if available */
+ if ( font->num_glyphs > 0 )
+ {
+ FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
+
+
+ error = cff_charset_load( &font->charset, font->num_glyphs, stream,
+ base_offset, dict->charset_offset, invert );
+ if ( error )
+ goto Exit;
+
+ /* CID-keyed CFFs don't have an encoding */
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = cff_encoding_load( &font->encoding,
+ &font->charset,
+ font->num_glyphs,
+ stream,
+ base_offset,
+ dict->encoding_offset );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ /* get the font name (/CIDFontName for CID-keyed fonts, */
+ /* /FontName otherwise) */
+ font->font_name = cff_index_get_name( font, subfont_index );
+
+ Exit:
+ cff_index_done( &string_index );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_font_done( CFF_Font font )
+ {
+ FT_Memory memory = font->memory;
+ FT_UInt idx;
+
+
+ cff_index_done( &font->global_subrs_index );
+ cff_index_done( &font->font_dict_index );
+ cff_index_done( &font->name_index );
+ cff_index_done( &font->charstrings_index );
+
+ /* release font dictionaries, but only if working with */
+ /* a CID keyed CFF font */
+ if ( font->num_subfonts > 0 )
+ {
+ for ( idx = 0; idx < font->num_subfonts; idx++ )
+ cff_subfont_done( memory, font->subfonts[idx] );
+
+ /* the subfonts array has been allocated as a single block */
+ FT_FREE( font->subfonts[0] );
+ }
+
+ cff_encoding_done( &font->encoding );
+ cff_charset_done( &font->charset, font->stream );
+
+ cff_subfont_done( memory, &font->top_font );
+
+ CFF_Done_FD_Select( &font->fd_select, font->stream );
+
+ FT_FREE( font->font_info );
+
+ FT_FREE( font->font_name );
+ FT_FREE( font->global_subrs );
+ FT_FREE( font->strings );
+ FT_FREE( font->string_pool );
+
+ if ( font->cf2_instance.finalizer )
+ {
+ font->cf2_instance.finalizer( font->cf2_instance.data );
+ FT_FREE( font->cf2_instance.data );
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
new file mode 100644
index 0000000000..50d8017250
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* cffload.h */
+/* */
+/* OpenType & CFF data/program tables loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFLOAD_H__
+#define __CFFLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+
+
+FT_BEGIN_HEADER
+
+ FT_LOCAL( FT_UShort )
+ cff_get_standard_encoding( FT_UInt charcode );
+
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_string( CFF_Font font,
+ FT_UInt element );
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_sid_string( CFF_Font font,
+ FT_UInt sid );
+
+
+ FT_LOCAL( FT_Error )
+ cff_index_access_element( CFF_Index idx,
+ FT_UInt element,
+ FT_Byte** pbytes,
+ FT_ULong* pbyte_len );
+
+ FT_LOCAL( void )
+ cff_index_forget_element( CFF_Index idx,
+ FT_Byte** pbytes );
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_name( CFF_Font font,
+ FT_UInt element );
+
+
+ FT_LOCAL( FT_UInt )
+ cff_charset_cid_to_gindex( CFF_Charset charset,
+ FT_UInt cid );
+
+
+ FT_LOCAL( FT_Error )
+ cff_font_load( FT_Library library,
+ FT_Stream stream,
+ FT_Int face_index,
+ CFF_Font font,
+ FT_Bool pure_cff );
+
+ FT_LOCAL( void )
+ cff_font_done( CFF_Font font );
+
+
+ FT_LOCAL( FT_Byte )
+ cff_fd_select_get( CFF_FDSelect fdselect,
+ FT_UInt glyph_index );
+
+
+FT_END_HEADER
+
+#endif /* __CFFLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
new file mode 100644
index 0000000000..b0ec7423b8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
@@ -0,0 +1,1082 @@
+/***************************************************************************/
+/* */
+/* cffobjs.c */
+/* */
+/* OpenType objects manager (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffobjs
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /* Note that we store the global hints in the size's `internal' root */
+ /* field. */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ cff_size_get_globals_funcs( CFF_Size size )
+ {
+ CFF_Face face = (CFF_Face)size->root.face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ PSHinter_Service pshinter = font->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_size_done( FT_Size cffsize ) /* CFF_Size */
+ {
+ CFF_Size size = (CFF_Size)cffsize;
+ CFF_Face face = (CFF_Face)size->root.face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = (CFF_Internal)cffsize->internal;
+
+
+ if ( internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = cff_size_get_globals_funcs( size );
+ if ( funcs )
+ {
+ FT_UInt i;
+
+
+ funcs->destroy( internal->topfont );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ funcs->destroy( internal->subfonts[i - 1] );
+ }
+
+ /* `internal' is freed by destroy_size (in ftobjs.c) */
+ }
+ }
+
+
+ /* CFF and Type 1 private dictionaries have slightly different */
+ /* structures; we need to synthesize a Type 1 dictionary on the fly */
+
+ static void
+ cff_make_private_dict( CFF_SubFont subfont,
+ PS_Private priv )
+ {
+ CFF_Private cpriv = &subfont->private_dict;
+ FT_UInt n, count;
+
+
+ FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+ count = priv->num_blue_values = cpriv->num_blue_values;
+ for ( n = 0; n < count; n++ )
+ priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
+
+ count = priv->num_other_blues = cpriv->num_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
+
+ count = priv->num_family_blues = cpriv->num_family_blues;
+ for ( n = 0; n < count; n++ )
+ priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
+
+ count = priv->num_family_other_blues = cpriv->num_family_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
+
+ priv->blue_scale = cpriv->blue_scale;
+ priv->blue_shift = (FT_Int)cpriv->blue_shift;
+ priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz;
+
+ priv->standard_width[0] = (FT_UShort)cpriv->standard_width;
+ priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
+
+ count = priv->num_snap_widths = cpriv->num_snap_widths;
+ for ( n = 0; n < count; n++ )
+ priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
+
+ count = priv->num_snap_heights = cpriv->num_snap_heights;
+ for ( n = 0; n < count; n++ )
+ priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
+
+ priv->force_bold = cpriv->force_bold;
+ priv->language_group = cpriv->language_group;
+ priv->lenIV = cpriv->lenIV;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_init( FT_Size cffsize ) /* CFF_Size */
+ {
+ CFF_Size size = (CFF_Size)cffsize;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size );
+
+
+ if ( funcs )
+ {
+ CFF_Face face = (CFF_Face)cffsize->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = NULL;
+
+ PS_PrivateRec priv;
+ FT_Memory memory = cffsize->face->memory;
+
+ FT_UInt i;
+
+
+ if ( FT_NEW( internal ) )
+ goto Exit;
+
+ cff_make_private_dict( &font->top_font, &priv );
+ error = funcs->create( cffsize->face->memory, &priv,
+ &internal->topfont );
+ if ( error )
+ goto Exit;
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+
+
+ cff_make_private_dict( sub, &priv );
+ error = funcs->create( cffsize->face->memory, &priv,
+ &internal->subfonts[i - 1] );
+ if ( error )
+ goto Exit;
+ }
+
+ cffsize->internal = (FT_Size_Internal)(void*)internal;
+ }
+
+ size->strike_index = 0xFFFFFFFFUL;
+
+ Exit:
+ return error;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_select( FT_Size size,
+ FT_ULong strike_index )
+ {
+ CFF_Size cffsize = (CFF_Size)size;
+ PSH_Globals_Funcs funcs;
+
+
+ cffsize->strike_index = strike_index;
+
+ FT_Select_Metrics( size->face, strike_index );
+
+ funcs = cff_size_get_globals_funcs( cffsize );
+
+ if ( funcs )
+ {
+ CFF_Face face = (CFF_Face)size->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = (CFF_Internal)size->internal;
+
+ FT_ULong top_upm = font->top_font.font_dict.units_per_em;
+ FT_UInt i;
+
+
+ funcs->set_scale( internal->topfont,
+ size->metrics.x_scale, size->metrics.y_scale,
+ 0, 0 );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+ FT_ULong sub_upm = sub->font_dict.units_per_em;
+ FT_Pos x_scale, y_scale;
+
+
+ if ( top_upm != sub_upm )
+ {
+ x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+ y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+ }
+ else
+ {
+ x_scale = size->metrics.x_scale;
+ y_scale = size->metrics.y_scale;
+ }
+
+ funcs->set_scale( internal->subfonts[i - 1],
+ x_scale, y_scale, 0, 0 );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ CFF_Size cffsize = (CFF_Size)size;
+ PSH_Globals_Funcs funcs;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ if ( FT_HAS_FIXED_SIZES( size->face ) )
+ {
+ CFF_Face cffface = (CFF_Face)size->face;
+ SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
+ FT_ULong strike_index;
+
+
+ if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
+ cffsize->strike_index = 0xFFFFFFFFUL;
+ else
+ return cff_size_select( size, strike_index );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ FT_Request_Metrics( size->face, req );
+
+ funcs = cff_size_get_globals_funcs( cffsize );
+
+ if ( funcs )
+ {
+ CFF_Face cffface = (CFF_Face)size->face;
+ CFF_Font font = (CFF_Font)cffface->extra.data;
+ CFF_Internal internal = (CFF_Internal)size->internal;
+
+ FT_ULong top_upm = font->top_font.font_dict.units_per_em;
+ FT_UInt i;
+
+
+ funcs->set_scale( internal->topfont,
+ size->metrics.x_scale, size->metrics.y_scale,
+ 0, 0 );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+ FT_ULong sub_upm = sub->font_dict.units_per_em;
+ FT_Pos x_scale, y_scale;
+
+
+ if ( top_upm != sub_upm )
+ {
+ x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+ y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+ }
+ else
+ {
+ x_scale = size->metrics.x_scale;
+ y_scale = size->metrics.y_scale;
+ }
+
+ funcs->set_scale( internal->subfonts[i - 1],
+ x_scale, y_scale, 0, 0 );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ cff_slot_done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_slot_init( FT_GlyphSlot slot )
+ {
+ CFF_Face face = (CFF_Face)slot->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ PSHinter_Service pshinter = font->pshinter;
+
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T2_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t2_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ static FT_String*
+ cff_strcpy( FT_Memory memory,
+ const FT_String* source )
+ {
+ FT_Error error;
+ FT_String* result;
+
+
+ (void)FT_STRDUP( result, source );
+
+ FT_UNUSED( error );
+
+ return result;
+ }
+
+
+ /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */
+ /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */
+ /* have been seen in the wild. */
+
+ static void
+ remove_subset_prefix( FT_String* name )
+ {
+ FT_Int32 idx = 0;
+ FT_Int32 length = (FT_Int32)strlen( name ) + 1;
+ FT_Bool continue_search = 1;
+
+
+ while ( continue_search )
+ {
+ if ( length >= 7 && name[6] == '+' )
+ {
+ for ( idx = 0; idx < 6; idx++ )
+ {
+ /* ASCII uppercase letters */
+ if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
+ continue_search = 0;
+ }
+
+ if ( continue_search )
+ {
+ for ( idx = 7; idx < length; idx++ )
+ name[idx - 7] = name[idx];
+ length -= 7;
+ }
+ }
+ else
+ continue_search = 0;
+ }
+ }
+
+
+ /* Remove the style part from the family name (if present). */
+
+ static void
+ remove_style( FT_String* family_name,
+ const FT_String* style_name )
+ {
+ FT_Int32 family_name_length, style_name_length;
+
+
+ family_name_length = (FT_Int32)strlen( family_name );
+ style_name_length = (FT_Int32)strlen( style_name );
+
+ if ( family_name_length > style_name_length )
+ {
+ FT_Int idx;
+
+
+ for ( idx = 1; idx <= style_name_length; ++idx )
+ {
+ if ( family_name[family_name_length - idx] !=
+ style_name[style_name_length - idx] )
+ break;
+ }
+
+ if ( idx > style_name_length )
+ {
+ /* family_name ends with style_name; remove it */
+ idx = family_name_length - style_name_length - 1;
+
+ /* also remove special characters */
+ /* between real family name and style */
+ while ( idx > 0 &&
+ ( family_name[idx] == '-' ||
+ family_name[idx] == ' ' ||
+ family_name[idx] == '_' ||
+ family_name[idx] == '+' ) )
+ --idx;
+
+ if ( idx > 0 )
+ family_name[idx + 1] = '\0';
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_face_init( FT_Stream stream,
+ FT_Face cffface, /* CFF_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ CFF_Face face = (CFF_Face)cffface;
+ FT_Error error;
+ SFNT_Service sfnt;
+ FT_Service_PsCMaps psnames;
+ PSHinter_Service pshinter;
+ FT_Bool pure_cff = 1;
+ FT_Bool sfnt_format = 0;
+ FT_Library library = cffface->driver->root.library;
+
+
+ sfnt = (SFNT_Service)FT_Get_Module_Interface(
+ library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+
+ pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+ library, "pshinter" );
+
+ FT_TRACE2(( "CFF driver\n" ));
+
+ /* create input stream from resource */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ /* check whether we have a valid OpenType file */
+ error = sfnt->init_face( stream, face, face_index, num_params, params );
+ if ( !error )
+ {
+ if ( face->format_tag != TTAG_OTTO &&
+ face->format_tag != 0x00010000UL ) /* `OTTO'; OpenType/CFF font */
+ {
+ FT_TRACE2(( " not an OpenType/CFF font\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* if we are performing a simple font format check, exit immediately */
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+
+ sfnt_format = 1;
+
+ /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
+ /* font; in the latter case it doesn't have a `head' table */
+ error = face->goto_table( face, TTAG_head, stream, 0 );
+ if ( !error )
+ {
+ pure_cff = 0;
+
+ /* load font directory */
+ error = sfnt->load_face( stream, face, face_index,
+ num_params, params );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* load the `cmap' table explicitly */
+ error = sfnt->load_cmap( face, stream );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now load the CFF part of the file */
+ error = face->goto_table( face, TTAG_CFF, stream, 0 );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* rewind to start of file; we are going to load a pure-CFF font */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+ error = FT_Err_Ok;
+ }
+
+ /* now load and parse the CFF table in the file */
+ {
+ CFF_Font cff = NULL;
+ CFF_FontRecDict dict;
+ FT_Memory memory = cffface->memory;
+ FT_Int32 flags;
+ FT_UInt i;
+
+
+ if ( FT_NEW( cff ) )
+ goto Exit;
+
+ face->extra.data = cff;
+ error = cff_font_load( library, stream, face_index, cff, pure_cff );
+ if ( error )
+ goto Exit;
+
+ cff->pshinter = pshinter;
+ cff->psnames = psnames;
+
+ cffface->face_index = face_index;
+
+ /* Complement the root flags with some interesting information. */
+ /* Note that this is only necessary for pure CFF and CEF fonts; */
+ /* SFNT based fonts use the `name' table instead. */
+
+ cffface->num_glyphs = cff->num_glyphs;
+
+ dict = &cff->top_font.font_dict;
+
+ /* we need the `PSNames' module for CFF and CEF formats */
+ /* which aren't CID-keyed */
+ if ( dict->cid_registry == 0xFFFFU && !psnames )
+ {
+ FT_ERROR(( "cff_face_init:"
+ " cannot open CFF & CEF fonts\n"
+ " "
+ " without the `PSNames' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_UInt idx;
+ FT_String* s;
+
+
+ FT_TRACE4(( "SIDs\n" ));
+
+ /* dump string index, including default strings for convenience */
+ for ( idx = 0; idx < cff->num_strings + 390; idx++ )
+ {
+ s = cff_index_get_sid_string( cff, idx );
+ if ( s )
+ FT_TRACE4((" %5d %s\n", idx, s ));
+ }
+ }
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ if ( !dict->has_font_matrix )
+ dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
+
+ /* Normalize the font matrix so that `matrix->xx' is 1; the */
+ /* scaling is done with `units_per_em' then (at this point, */
+ /* it already contains the scaling factor, but without */
+ /* normalization of the matrix). */
+ /* */
+ /* Note that the offsets must be expressed in integer font */
+ /* units. */
+
+ {
+ FT_Matrix* matrix = &dict->font_matrix;
+ FT_Vector* offset = &dict->font_offset;
+ FT_ULong* upm = &dict->units_per_em;
+ FT_Fixed temp = FT_ABS( matrix->yy );
+
+
+ if ( temp != 0x10000L )
+ {
+ *upm = FT_DivFix( *upm, temp );
+
+ matrix->xx = FT_DivFix( matrix->xx, temp );
+ matrix->yx = FT_DivFix( matrix->yx, temp );
+ matrix->xy = FT_DivFix( matrix->xy, temp );
+ matrix->yy = FT_DivFix( matrix->yy, temp );
+ offset->x = FT_DivFix( offset->x, temp );
+ offset->y = FT_DivFix( offset->y, temp );
+ }
+
+ offset->x >>= 16;
+ offset->y >>= 16;
+ }
+
+ for ( i = cff->num_subfonts; i > 0; i-- )
+ {
+ CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict;
+ CFF_FontRecDict top = &cff->top_font.font_dict;
+
+ FT_Matrix* matrix;
+ FT_Vector* offset;
+ FT_ULong* upm;
+ FT_Fixed temp;
+
+
+ if ( sub->has_font_matrix )
+ {
+ FT_Long scaling;
+
+
+ /* if we have a top-level matrix, */
+ /* concatenate the subfont matrix */
+
+ if ( top->has_font_matrix )
+ {
+ if ( top->units_per_em > 1 && sub->units_per_em > 1 )
+ scaling = FT_MIN( top->units_per_em, sub->units_per_em );
+ else
+ scaling = 1;
+
+ FT_Matrix_Multiply_Scaled( &top->font_matrix,
+ &sub->font_matrix,
+ scaling );
+ FT_Vector_Transform_Scaled( &sub->font_offset,
+ &top->font_matrix,
+ scaling );
+
+ sub->units_per_em = FT_MulDiv( sub->units_per_em,
+ top->units_per_em,
+ scaling );
+ }
+ }
+ else
+ {
+ sub->font_matrix = top->font_matrix;
+ sub->font_offset = top->font_offset;
+
+ sub->units_per_em = top->units_per_em;
+ }
+
+ matrix = &sub->font_matrix;
+ offset = &sub->font_offset;
+ upm = &sub->units_per_em;
+ temp = FT_ABS( matrix->yy );
+
+ if ( temp != 0x10000L )
+ {
+ *upm = FT_DivFix( *upm, temp );
+
+ matrix->xx = FT_DivFix( matrix->xx, temp );
+ matrix->yx = FT_DivFix( matrix->yx, temp );
+ matrix->xy = FT_DivFix( matrix->xy, temp );
+ matrix->yy = FT_DivFix( matrix->yy, temp );
+ offset->x = FT_DivFix( offset->x, temp );
+ offset->y = FT_DivFix( offset->y, temp );
+ }
+
+ offset->x >>= 16;
+ offset->y >>= 16;
+ }
+
+ if ( pure_cff )
+ {
+ char* style_name = NULL;
+
+
+ /* set up num_faces */
+ cffface->num_faces = cff->num_faces;
+
+ /* compute number of glyphs */
+ if ( dict->cid_registry != 0xFFFFU )
+ cffface->num_glyphs = cff->charset.max_cid + 1;
+ else
+ cffface->num_glyphs = cff->charstrings_index.count;
+
+ /* set global bbox, as well as EM size */
+ cffface->bbox.xMin = dict->font_bbox.xMin >> 16;
+ cffface->bbox.yMin = dict->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
+ cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
+
+ cffface->ascender = (FT_Short)( cffface->bbox.yMax );
+ cffface->descender = (FT_Short)( cffface->bbox.yMin );
+
+ cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
+ if ( cffface->height < cffface->ascender - cffface->descender )
+ cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
+
+ cffface->underline_position =
+ (FT_Short)( dict->underline_position >> 16 );
+ cffface->underline_thickness =
+ (FT_Short)( dict->underline_thickness >> 16 );
+
+ /* retrieve font family & style name */
+ cffface->family_name = cff_index_get_name( cff, face_index );
+ if ( cffface->family_name )
+ {
+ char* full = cff_index_get_sid_string( cff,
+ dict->full_name );
+ char* fullp = full;
+ char* family = cffface->family_name;
+ char* family_name = NULL;
+
+
+ remove_subset_prefix( cffface->family_name );
+
+ if ( dict->family_name )
+ {
+ family_name = cff_index_get_sid_string( cff,
+ dict->family_name );
+ if ( family_name )
+ family = family_name;
+ }
+
+ /* We try to extract the style name from the full name. */
+ /* We need to ignore spaces and dashes during the search. */
+ if ( full && family )
+ {
+ while ( *fullp )
+ {
+ /* skip common characters at the start of both strings */
+ if ( *fullp == *family )
+ {
+ family++;
+ fullp++;
+ continue;
+ }
+
+ /* ignore spaces and dashes in full name during comparison */
+ if ( *fullp == ' ' || *fullp == '-' )
+ {
+ fullp++;
+ continue;
+ }
+
+ /* ignore spaces and dashes in family name during comparison */
+ if ( *family == ' ' || *family == '-' )
+ {
+ family++;
+ continue;
+ }
+
+ if ( !*family && *fullp )
+ {
+ /* The full name begins with the same characters as the */
+ /* family name, with spaces and dashes removed. In this */
+ /* case, the remaining string in `fullp' will be used as */
+ /* the style name. */
+ style_name = cff_strcpy( memory, fullp );
+
+ /* remove the style part from the family name (if present) */
+ remove_style( cffface->family_name, style_name );
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ char *cid_font_name =
+ cff_index_get_sid_string( cff,
+ dict->cid_font_name );
+
+
+ /* do we have a `/FontName' for a CID-keyed font? */
+ if ( cid_font_name )
+ cffface->family_name = cff_strcpy( memory, cid_font_name );
+ }
+
+ if ( style_name )
+ cffface->style_name = style_name;
+ else
+ /* assume "Regular" style if we don't know better */
+ cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
+
+ /*******************************************************************/
+ /* */
+ /* Compute face flags. */
+ /* */
+ flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
+ FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
+ FT_FACE_FLAG_HINTER; /* has native hinter */
+
+ if ( sfnt_format )
+ flags |= FT_FACE_FLAG_SFNT;
+
+ /* fixed width font? */
+ if ( dict->is_fixed_pitch )
+ flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
+#if 0
+ /* kerning available? */
+ if ( face->kern_pairs )
+ flags |= FT_FACE_FLAG_KERNING;
+#endif
+
+ cffface->face_flags = flags;
+
+ /*******************************************************************/
+ /* */
+ /* Compute style flags. */
+ /* */
+ flags = 0;
+
+ if ( dict->italic_angle )
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ {
+ char *weight = cff_index_get_sid_string( cff,
+ dict->weight );
+
+
+ if ( weight )
+ if ( !ft_strcmp( weight, "Bold" ) ||
+ !ft_strcmp( weight, "Black" ) )
+ flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* double check */
+ if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
+ if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) ||
+ !ft_strncmp( cffface->style_name, "Black", 5 ) )
+ flags |= FT_STYLE_FLAG_BOLD;
+
+ if ( !(flags & FT_STYLE_FLAG_ITALIC) && cffface->style_name )
+ if ( !ft_strncmp( cffface->style_name, "Italic", 6 ) )
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ cffface->style_flags = flags;
+ }
+
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+ /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
+ /* has unset this flag because of the 3.0 `post' table. */
+ if ( dict->cid_registry == 0xFFFFU )
+ cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+ if ( dict->cid_registry != 0xFFFFU && pure_cff )
+ cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
+
+
+ /*******************************************************************/
+ /* */
+ /* Compute char maps. */
+ /* */
+
+ /* Try to synthesize a Unicode charmap if there is none available */
+ /* already. If an OpenType font contains a Unicode "cmap", we */
+ /* will use it, whatever be in the CFF part of the file. */
+ {
+ FT_CharMapRec cmaprec;
+ FT_CharMap cmap;
+ FT_UInt nn;
+ CFF_Encoding encoding = &cff->encoding;
+
+
+ for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
+ {
+ cmap = cffface->charmaps[nn];
+
+ /* Windows Unicode? */
+ if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
+ cmap->encoding_id == TT_MS_ID_UNICODE_CS )
+ goto Skip_Unicode;
+
+ /* Apple Unicode platform id? */
+ if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
+ goto Skip_Unicode; /* Apple Unicode */
+ }
+
+ /* since CID-keyed fonts don't contain glyph names, we can't */
+ /* construct a cmap */
+ if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
+ goto Exit;
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "cff_face_init: no Unicode cmap is found, "
+ "and too many subtables (%d) to add synthesized cmap\n",
+ nn ));
+ goto Exit;
+ }
+#endif
+
+ /* we didn't find a Unicode charmap -- synthesize one */
+ cmaprec.face = cffface;
+ cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+ cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+ cmaprec.encoding = FT_ENCODING_UNICODE;
+
+ nn = (FT_UInt)cffface->num_charmaps;
+
+ error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
+ &cmaprec, NULL );
+ if ( error &&
+ FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+ goto Exit;
+ error = FT_Err_Ok;
+
+ /* if no Unicode charmap was previously selected, select this one */
+ if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
+ cffface->charmap = cffface->charmaps[nn];
+
+ Skip_Unicode:
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( nn > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "cff_face_init: Unicode cmap is found, "
+ "but too many preceding subtables (%d) to access\n",
+ nn - 1 ));
+ goto Exit;
+ }
+#endif
+ if ( encoding->count > 0 )
+ {
+ FT_CMap_Class clazz;
+
+
+ cmaprec.face = cffface;
+ cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */
+
+ if ( encoding->offset == 0 )
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
+ cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+ else if ( encoding->offset == 1 )
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
+ cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+ else
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
+ cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+
+ error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_face_done( FT_Face cffface ) /* CFF_Face */
+ {
+ CFF_Face face = (CFF_Face)cffface;
+ FT_Memory memory;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = cffface->memory;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ if ( sfnt )
+ sfnt->done_face( face );
+
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ if ( cff )
+ {
+ cff_font_done( cff );
+ FT_FREE( face->extra.data );
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_driver_init( FT_Module module ) /* CFF_Driver */
+ {
+ CFF_Driver driver = (CFF_Driver)module;
+
+
+ /* set default property values */
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
+#else
+ driver->hinting_engine = FT_CFF_HINTING_ADOBE;
+#endif
+ driver->no_stem_darkening = FALSE;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_driver_done( FT_Module module ) /* CFF_Driver */
+ {
+ FT_UNUSED( module );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
new file mode 100644
index 0000000000..a10232f864
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
@@ -0,0 +1,183 @@
+/***************************************************************************/
+/* */
+/* cffobjs.h */
+/* */
+/* OpenType objects manager (specification). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFOBJS_H__
+#define __CFFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType driver object. */
+ /* */
+ typedef struct CFF_DriverRec_* CFF_Driver;
+
+ typedef TT_Face CFF_Face;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Size */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType size object. */
+ /* */
+ typedef struct CFF_SizeRec_
+ {
+ FT_SizeRec root;
+ FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */
+
+ } CFF_SizeRec, *CFF_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType glyph slot object. */
+ /* */
+ typedef struct CFF_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } CFF_GlyphSlotRec, *CFF_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Internal */
+ /* */
+ /* <Description> */
+ /* The interface to the `internal' field of `FT_Size'. */
+ /* */
+ typedef struct CFF_InternalRec_
+ {
+ PSH_Globals topfont;
+ PSH_Globals subfonts[CFF_MAX_CID_FONTS];
+
+ } CFF_InternalRec, *CFF_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* Subglyph transformation record. */
+ /* */
+ typedef struct CFF_Transform_
+ {
+ FT_Fixed xx, xy; /* transformation matrix coefficients */
+ FT_Fixed yx, yy;
+ FT_F26Dot6 ox, oy; /* offsets */
+
+ } CFF_Transform;
+
+
+ /***********************************************************************/
+ /* */
+ /* CFF driver class. */
+ /* */
+ typedef struct CFF_DriverRec_
+ {
+ FT_DriverRec root;
+
+ FT_UInt hinting_engine;
+ FT_Bool no_stem_darkening;
+
+ } CFF_DriverRec;
+
+
+ FT_LOCAL( FT_Error )
+ cff_size_init( FT_Size size ); /* CFF_Size */
+
+ FT_LOCAL( void )
+ cff_size_done( FT_Size size ); /* CFF_Size */
+
+ FT_LOCAL( FT_Error )
+ cff_size_request( FT_Size size,
+ FT_Size_Request req );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL( FT_Error )
+ cff_size_select( FT_Size size,
+ FT_ULong strike_index );
+
+#endif
+
+ FT_LOCAL( void )
+ cff_slot_done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ cff_slot_init( FT_GlyphSlot slot );
+
+
+ /*************************************************************************/
+ /* */
+ /* Face functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ cff_face_init( FT_Stream stream,
+ FT_Face face, /* CFF_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ cff_face_done( FT_Face face ); /* CFF_Face */
+
+
+ /*************************************************************************/
+ /* */
+ /* Driver functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ cff_driver_init( FT_Module module ); /* CFF_Driver */
+
+ FT_LOCAL( void )
+ cff_driver_done( FT_Module module ); /* CFF_Driver */
+
+
+FT_END_HEADER
+
+#endif /* __CFFOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
new file mode 100644
index 0000000000..b2d8553956
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/* */
+/* cffparse.c */
+/* */
+/* CFF token stream parser (body) */
+/* */
+/* Copyright 1996-2004, 2007-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffparse
+
+
+ FT_LOCAL_DEF( void )
+ cff_parser_init( CFF_Parser parser,
+ FT_UInt code,
+ void* object,
+ FT_Library library)
+ {
+ FT_MEM_ZERO( parser, sizeof ( *parser ) );
+
+ parser->top = parser->stack;
+ parser->object_code = code;
+ parser->object = object;
+ parser->library = library;
+ }
+
+
+ /* read an integer */
+ static FT_Long
+ cff_parse_integer( FT_Byte* start,
+ FT_Byte* limit )
+ {
+ FT_Byte* p = start;
+ FT_Int v = *p++;
+ FT_Long val = 0;
+
+
+ if ( v == 28 )
+ {
+ if ( p + 2 > limit )
+ goto Bad;
+
+ val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
+ p += 2;
+ }
+ else if ( v == 29 )
+ {
+ if ( p + 4 > limit )
+ goto Bad;
+
+ val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
+ ( (FT_ULong)p[1] << 16 ) |
+ ( (FT_ULong)p[2] << 8 ) |
+ (FT_ULong)p[3] );
+ p += 4;
+ }
+ else if ( v < 247 )
+ {
+ val = v - 139;
+ }
+ else if ( v < 251 )
+ {
+ if ( p + 1 > limit )
+ goto Bad;
+
+ val = ( v - 247 ) * 256 + p[0] + 108;
+ p++;
+ }
+ else
+ {
+ if ( p + 1 > limit )
+ goto Bad;
+
+ val = -( v - 251 ) * 256 - p[0] - 108;
+ p++;
+ }
+
+ Exit:
+ return val;
+
+ Bad:
+ val = 0;
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ goto Exit;
+ }
+
+
+ static const FT_Long power_tens[] =
+ {
+ 1L,
+ 10L,
+ 100L,
+ 1000L,
+ 10000L,
+ 100000L,
+ 1000000L,
+ 10000000L,
+ 100000000L,
+ 1000000000L
+ };
+
+
+ /* read a real */
+ static FT_Fixed
+ cff_parse_real( FT_Byte* start,
+ FT_Byte* limit,
+ FT_Long power_ten,
+ FT_Long* scaling )
+ {
+ FT_Byte* p = start;
+ FT_UInt nib;
+ FT_UInt phase;
+
+ FT_Long result, number, exponent;
+ FT_Int sign = 0, exponent_sign = 0, have_overflow = 0;
+ FT_Long exponent_add, integer_length, fraction_length;
+
+
+ if ( scaling )
+ *scaling = 0;
+
+ result = 0;
+
+ number = 0;
+ exponent = 0;
+
+ exponent_add = 0;
+ integer_length = 0;
+ fraction_length = 0;
+
+ /* First of all, read the integer part. */
+ phase = 4;
+
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, we need to */
+ /* read a new byte. This also skips past the initial 0x1E. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+
+ if ( nib == 0xE )
+ sign = 1;
+ else if ( nib > 9 )
+ break;
+ else
+ {
+ /* Increase exponent if we can't add the digit. */
+ if ( number >= 0xCCCCCCCL )
+ exponent_add++;
+ /* Skip leading zeros. */
+ else if ( nib || number )
+ {
+ integer_length++;
+ number = number * 10 + nib;
+ }
+ }
+ }
+
+ /* Read fraction part, if any. */
+ if ( nib == 0xa )
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, we need */
+ /* to read a new byte. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+ if ( nib >= 10 )
+ break;
+
+ /* Skip leading zeros if possible. */
+ if ( !nib && !number )
+ exponent_add--;
+ /* Only add digit if we don't overflow. */
+ else if ( number < 0xCCCCCCCL && fraction_length < 9 )
+ {
+ fraction_length++;
+ number = number * 10 + nib;
+ }
+ }
+
+ /* Read exponent, if any. */
+ if ( nib == 12 )
+ {
+ exponent_sign = 1;
+ nib = 11;
+ }
+
+ if ( nib == 11 )
+ {
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, */
+ /* we need to read a new byte. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+ if ( nib >= 10 )
+ break;
+
+ /* Arbitrarily limit exponent. */
+ if ( exponent > 1000 )
+ have_overflow = 1;
+ else
+ exponent = exponent * 10 + nib;
+ }
+
+ if ( exponent_sign )
+ exponent = -exponent;
+ }
+
+ if ( !number )
+ goto Exit;
+
+ if ( have_overflow )
+ {
+ if ( exponent_sign )
+ goto Underflow;
+ else
+ goto Overflow;
+ }
+
+ /* We don't check `power_ten' and `exponent_add'. */
+ exponent += power_ten + exponent_add;
+
+ if ( scaling )
+ {
+ /* Only use `fraction_length'. */
+ fraction_length += integer_length;
+ exponent += integer_length;
+
+ if ( fraction_length <= 5 )
+ {
+ if ( number > 0x7FFFL )
+ {
+ result = FT_DivFix( number, 10 );
+ *scaling = exponent - fraction_length + 1;
+ }
+ else
+ {
+ if ( exponent > 0 )
+ {
+ FT_Long new_fraction_length, shift;
+
+
+ /* Make `scaling' as small as possible. */
+ new_fraction_length = FT_MIN( exponent, 5 );
+ shift = new_fraction_length - fraction_length;
+
+ if ( shift > 0 )
+ {
+ exponent -= new_fraction_length;
+ number *= power_tens[shift];
+ if ( number > 0x7FFFL )
+ {
+ number /= 10;
+ exponent += 1;
+ }
+ }
+ else
+ exponent -= fraction_length;
+ }
+ else
+ exponent -= fraction_length;
+
+ result = (FT_Long)( (FT_ULong)number << 16 );
+ *scaling = exponent;
+ }
+ }
+ else
+ {
+ if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
+ {
+ result = FT_DivFix( number, power_tens[fraction_length - 4] );
+ *scaling = exponent - 4;
+ }
+ else
+ {
+ result = FT_DivFix( number, power_tens[fraction_length - 5] );
+ *scaling = exponent - 5;
+ }
+ }
+ }
+ else
+ {
+ integer_length += exponent;
+ fraction_length -= exponent;
+
+ if ( integer_length > 5 )
+ goto Overflow;
+ if ( integer_length < -5 )
+ goto Underflow;
+
+ /* Remove non-significant digits. */
+ if ( integer_length < 0 )
+ {
+ number /= power_tens[-integer_length];
+ fraction_length += integer_length;
+ }
+
+ /* this can only happen if exponent was non-zero */
+ if ( fraction_length == 10 )
+ {
+ number /= 10;
+ fraction_length -= 1;
+ }
+
+ /* Convert into 16.16 format. */
+ if ( fraction_length > 0 )
+ {
+ if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
+ goto Exit;
+
+ result = FT_DivFix( number, power_tens[fraction_length] );
+ }
+ else
+ {
+ number *= power_tens[-fraction_length];
+
+ if ( number > 0x7FFFL )
+ goto Overflow;
+
+ result = (FT_Long)( (FT_ULong)number << 16 );
+ }
+ }
+
+ Exit:
+ if ( sign )
+ result = -result;
+
+ return result;
+
+ Overflow:
+ result = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ goto Exit;
+
+ Underflow:
+ result = 0;
+ FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+ goto Exit;
+
+ Bad:
+ result = 0;
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ goto Exit;
+ }
+
+
+ /* read a number, either integer or real */
+ static FT_Long
+ cff_parse_num( FT_Byte** d )
+ {
+ return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
+ : cff_parse_integer( d[0], d[1] );
+ }
+
+
+ /* read a floating point number, either integer or real */
+ static FT_Fixed
+ do_fixed( FT_Byte** d,
+ FT_Long scaling )
+ {
+ if ( **d == 30 )
+ return cff_parse_real( d[0], d[1], scaling, NULL );
+ else
+ {
+ FT_Long val = cff_parse_integer( d[0], d[1] );
+
+
+ if ( scaling )
+ val *= power_tens[scaling];
+
+ if ( val > 0x7FFF )
+ {
+ val = 0x7FFFFFFFL;
+ goto Overflow;
+ }
+ else if ( val < -0x7FFF )
+ {
+ val = -0x7FFFFFFFL;
+ goto Overflow;
+ }
+
+ return (FT_Long)( (FT_ULong)val << 16 );
+
+ Overflow:
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ return val;
+ }
+ }
+
+
+ /* read a floating point number, either integer or real */
+ static FT_Fixed
+ cff_parse_fixed( FT_Byte** d )
+ {
+ return do_fixed( d, 0 );
+ }
+
+
+ /* read a floating point number, either integer or real, */
+ /* but return `10^scaling' times the number read in */
+ static FT_Fixed
+ cff_parse_fixed_scaled( FT_Byte** d,
+ FT_Long scaling )
+ {
+ return do_fixed( d, scaling );
+ }
+
+
+ /* read a floating point number, either integer or real, */
+ /* and return it as precise as possible -- `scaling' returns */
+ /* the scaling factor (as a power of 10) */
+ static FT_Fixed
+ cff_parse_fixed_dynamic( FT_Byte** d,
+ FT_Long* scaling )
+ {
+ FT_ASSERT( scaling );
+
+ if ( **d == 30 )
+ return cff_parse_real( d[0], d[1], 0, scaling );
+ else
+ {
+ FT_Long number;
+ FT_Int integer_length;
+
+
+ number = cff_parse_integer( d[0], d[1] );
+
+ if ( number > 0x7FFFL )
+ {
+ for ( integer_length = 5; integer_length < 10; integer_length++ )
+ if ( number < power_tens[integer_length] )
+ break;
+
+ if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
+ {
+ *scaling = integer_length - 4;
+ return FT_DivFix( number, power_tens[integer_length - 4] );
+ }
+ else
+ {
+ *scaling = integer_length - 5;
+ return FT_DivFix( number, power_tens[integer_length - 5] );
+ }
+ }
+ else
+ {
+ *scaling = 0;
+ return (FT_Long)( (FT_ULong)number << 16 );
+ }
+ }
+ }
+
+
+ static FT_Error
+ cff_parse_font_matrix( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Matrix* matrix = &dict->font_matrix;
+ FT_Vector* offset = &dict->font_offset;
+ FT_ULong* upm = &dict->units_per_em;
+ FT_Byte** data = parser->stack;
+ FT_Error error = FT_ERR( Stack_Underflow );
+
+
+ if ( parser->top >= parser->stack + 6 )
+ {
+ FT_Long scaling;
+
+
+ error = FT_Err_Ok;
+
+ dict->has_font_matrix = TRUE;
+
+ /* We expect a well-formed font matrix, this is, the matrix elements */
+ /* `xx' and `yy' are of approximately the same magnitude. To avoid */
+ /* loss of precision, we use the magnitude of element `xx' to scale */
+ /* all other elements. The scaling factor is then contained in the */
+ /* `units_per_em' value. */
+
+ matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
+
+ scaling = -scaling;
+
+ if ( scaling < 0 || scaling > 9 )
+ {
+ /* Return default matrix in case of unlikely values. */
+
+ FT_TRACE1(( "cff_parse_font_matrix:"
+ " strange scaling value for xx element (%d),\n"
+ " "
+ " using default matrix\n", scaling ));
+
+ matrix->xx = 0x10000L;
+ matrix->yx = 0;
+ matrix->xy = 0;
+ matrix->yy = 0x10000L;
+ offset->x = 0;
+ offset->y = 0;
+ *upm = 1;
+
+ goto Exit;
+ }
+
+ matrix->yx = cff_parse_fixed_scaled( data++, scaling );
+ matrix->xy = cff_parse_fixed_scaled( data++, scaling );
+ matrix->yy = cff_parse_fixed_scaled( data++, scaling );
+ offset->x = cff_parse_fixed_scaled( data++, scaling );
+ offset->y = cff_parse_fixed_scaled( data, scaling );
+
+ *upm = power_tens[scaling];
+
+ FT_TRACE4(( " [%f %f %f %f %f %f]\n",
+ (double)matrix->xx / *upm / 65536,
+ (double)matrix->xy / *upm / 65536,
+ (double)matrix->yx / *upm / 65536,
+ (double)matrix->yy / *upm / 65536,
+ (double)offset->x / *upm / 65536,
+ (double)offset->y / *upm / 65536 ));
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_font_bbox( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_BBox* bbox = &dict->font_bbox;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 4 )
+ {
+ bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) );
+ error = FT_Err_Ok;
+
+ FT_TRACE4(( " [%d %d %d %d]\n",
+ bbox->xMin / 65536,
+ bbox->yMin / 65536,
+ bbox->xMax / 65536,
+ bbox->yMax / 65536 ));
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_private_dict( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 2 )
+ {
+ dict->private_size = cff_parse_num( data++ );
+ dict->private_offset = cff_parse_num( data );
+ FT_TRACE4(( " %lu %lu\n",
+ dict->private_size, dict->private_offset ));
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_cid_ros( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 3 )
+ {
+ dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
+ dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
+ if ( **data == 30 )
+ FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
+ dict->cid_supplement = cff_parse_num( data );
+ if ( dict->cid_supplement < 0 )
+ FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
+ dict->cid_supplement ));
+ error = FT_Err_Ok;
+
+ FT_TRACE4(( " %d %d %d\n",
+ dict->cid_registry,
+ dict->cid_ordering,
+ dict->cid_supplement ));
+ }
+
+ return error;
+ }
+
+
+#define CFF_FIELD_NUM( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_num )
+#define CFF_FIELD_FIXED( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_fixed )
+#define CFF_FIELD_FIXED_1000( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
+#define CFF_FIELD_STRING( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_string )
+#define CFF_FIELD_BOOL( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_bool )
+
+#define CFFCODE_TOPDICT 0x1000
+#define CFFCODE_PRIVATE 0x2000
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef CFF_FIELD
+#undef CFF_FIELD_DELTA
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+ { \
+ cff_kind_callback, \
+ code | CFFCODE, \
+ 0, 0, \
+ cff_parse_ ## name, \
+ 0, 0 \
+ },
+
+#define CFF_FIELD( code, name, id, kind ) \
+ { \
+ kind, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE( name ), \
+ 0, 0, 0 \
+ },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+ { \
+ cff_kind_delta, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE_DELTA( name ), \
+ 0, \
+ max, \
+ FT_FIELD_OFFSET( num_ ## name ) \
+ },
+
+ static const CFF_Field_Handler cff_field_handlers[] =
+ {
+
+#include "cfftoken.h"
+
+ { 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+ { \
+ cff_kind_callback, \
+ code | CFFCODE, \
+ 0, 0, \
+ cff_parse_ ## name, \
+ 0, 0, \
+ id \
+ },
+
+#define CFF_FIELD( code, name, id, kind ) \
+ { \
+ kind, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE( name ), \
+ 0, 0, 0, \
+ id \
+ },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+ { \
+ cff_kind_delta, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE_DELTA( name ), \
+ 0, \
+ max, \
+ FT_FIELD_OFFSET( num_ ## name ), \
+ id \
+ },
+
+ static const CFF_Field_Handler cff_field_handlers[] =
+ {
+
+#include "cfftoken.h"
+
+ { 0, 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+ void
+ FT_Destroy_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler* clazz )
+ {
+ FT_Memory memory = library->memory;
+
+
+ if ( clazz )
+ FT_FREE( clazz );
+ }
+
+
+ FT_Error
+ FT_Create_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler** output_class )
+ {
+ CFF_Field_Handler* clazz = NULL;
+ FT_Error error;
+ FT_Memory memory = library->memory;
+
+ int i = 0;
+
+
+#undef CFF_FIELD
+#define CFF_FIELD( code, name, id, kind ) i++;
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code, name, max, id ) i++;
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code, name, id ) i++;
+
+#include "cfftoken.h"
+
+ i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
+
+ if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
+ return error;
+
+ i = 0;
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
+ clazz[i].kind = cff_kind_callback; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = 0; \
+ clazz[i].size = 0; \
+ clazz[i].reader = cff_parse_ ## name_; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ i++;
+
+#undef CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ ) \
+ clazz[i].kind = kind_; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ i++; \
+
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
+ clazz[i].kind = cff_kind_delta; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = max_; \
+ clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+ i++;
+
+#include "cfftoken.h"
+
+ clazz[i].kind = 0;
+ clazz[i].code = 0;
+ clazz[i].offset = 0;
+ clazz[i].size = 0;
+ clazz[i].reader = 0;
+ clazz[i].array_max = 0;
+ clazz[i].count_offset = 0;
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
+ clazz[i].kind = cff_kind_callback; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = 0; \
+ clazz[i].size = 0; \
+ clazz[i].reader = cff_parse_ ## name_; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ clazz[i].id = id_; \
+ i++;
+
+#undef CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ ) \
+ clazz[i].kind = kind_; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ clazz[i].id = id_; \
+ i++; \
+
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
+ clazz[i].kind = cff_kind_delta; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = max_; \
+ clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+ clazz[i].id = id_; \
+ i++;
+
+#include "cfftoken.h"
+
+ clazz[i].kind = 0;
+ clazz[i].code = 0;
+ clazz[i].offset = 0;
+ clazz[i].size = 0;
+ clazz[i].reader = 0;
+ clazz[i].array_max = 0;
+ clazz[i].count_offset = 0;
+ clazz[i].id = 0;
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ *output_class = clazz;
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_parser_run( CFF_Parser parser,
+ FT_Byte* start,
+ FT_Byte* limit )
+ {
+ FT_Byte* p = start;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = parser->library;
+ FT_UNUSED( library );
+
+
+ parser->top = parser->stack;
+ parser->start = start;
+ parser->limit = limit;
+ parser->cursor = start;
+
+ while ( p < limit )
+ {
+ FT_UInt v = *p;
+
+
+ if ( v >= 27 && v != 31 )
+ {
+ /* it's a number; we will push its position on the stack */
+ if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
+ goto Stack_Overflow;
+
+ *parser->top ++ = p;
+
+ /* now, skip it */
+ if ( v == 30 )
+ {
+ /* skip real number */
+ p++;
+ for (;;)
+ {
+ /* An unterminated floating point number at the */
+ /* end of a dictionary is invalid but harmless. */
+ if ( p >= limit )
+ goto Exit;
+ v = p[0] >> 4;
+ if ( v == 15 )
+ break;
+ v = p[0] & 0xF;
+ if ( v == 15 )
+ break;
+ p++;
+ }
+ }
+ else if ( v == 28 )
+ p += 2;
+ else if ( v == 29 )
+ p += 4;
+ else if ( v > 246 )
+ p += 1;
+ }
+ else
+ {
+ /* This is not a number, hence it's an operator. Compute its code */
+ /* and look for it in our current list. */
+
+ FT_UInt code;
+ FT_UInt num_args = (FT_UInt)
+ ( parser->top - parser->stack );
+ const CFF_Field_Handler* field;
+
+
+ *parser->top = p;
+ code = v;
+ if ( v == 12 )
+ {
+ /* two byte operator */
+ p++;
+ if ( p >= limit )
+ goto Syntax_Error;
+
+ code = 0x100 | p[0];
+ }
+ code = code | parser->object_code;
+
+ for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
+ {
+ if ( field->code == (FT_Int)code )
+ {
+ /* we found our field's handler; read it */
+ FT_Long val;
+ FT_Byte* q = (FT_Byte*)parser->object + field->offset;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( " %s", field->id ));
+#endif
+
+ /* check that we have enough arguments -- except for */
+ /* delta encoded arrays, which can be empty */
+ if ( field->kind != cff_kind_delta && num_args < 1 )
+ goto Stack_Underflow;
+
+ switch ( field->kind )
+ {
+ case cff_kind_bool:
+ case cff_kind_string:
+ case cff_kind_num:
+ val = cff_parse_num( parser->stack );
+ goto Store_Number;
+
+ case cff_kind_fixed:
+ val = cff_parse_fixed( parser->stack );
+ goto Store_Number;
+
+ case cff_kind_fixed_thousand:
+ val = cff_parse_fixed_scaled( parser->stack, 3 );
+
+ Store_Number:
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_Short*)q = (FT_Short)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_Int32*)q = (FT_Int)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ switch ( field->kind )
+ {
+ case cff_kind_bool:
+ FT_TRACE4(( " %s\n", val ? "true" : "false" ));
+ break;
+
+ case cff_kind_string:
+ FT_TRACE4(( " %ld (SID)\n", val ));
+ break;
+
+ case cff_kind_num:
+ FT_TRACE4(( " %ld\n", val ));
+ break;
+
+ case cff_kind_fixed:
+ FT_TRACE4(( " %f\n", (double)val / 65536 ));
+ break;
+
+ case cff_kind_fixed_thousand:
+ FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
+
+ default:
+ ; /* never reached */
+ }
+#endif
+
+ break;
+
+ case cff_kind_delta:
+ {
+ FT_Byte* qcount = (FT_Byte*)parser->object +
+ field->count_offset;
+
+ FT_Byte** data = parser->stack;
+
+
+ if ( num_args > field->array_max )
+ num_args = field->array_max;
+
+ FT_TRACE4(( " [" ));
+
+ /* store count */
+ *qcount = (FT_Byte)num_args;
+
+ val = 0;
+ while ( num_args > 0 )
+ {
+ val += cff_parse_num( data++ );
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_Short*)q = (FT_Short)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_Int32*)q = (FT_Int)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+
+ FT_TRACE4(( " %ld", val ));
+
+ q += field->size;
+ num_args--;
+ }
+
+ FT_TRACE4(( "]\n" ));
+ }
+ break;
+
+ default: /* callback */
+ error = field->reader( parser );
+ if ( error )
+ goto Exit;
+ }
+ goto Found;
+ }
+ }
+
+ /* this is an unknown operator, or it is unsupported; */
+ /* we will ignore it for now. */
+
+ Found:
+ /* clear stack */
+ parser->top = parser->stack;
+ }
+ p++;
+ }
+
+ Exit:
+ return error;
+
+ Stack_Overflow:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+
+ Stack_Underflow:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+
+ Syntax_Error:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
new file mode 100644
index 0000000000..3371fd0e76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/* */
+/* cffparse.h */
+/* */
+/* CFF token stream parser (specification) */
+/* */
+/* Copyright 1996-2003, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFF_PARSE_H__
+#define __CFF_PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_STACK_DEPTH 96
+
+#define CFF_CODE_TOPDICT 0x1000
+#define CFF_CODE_PRIVATE 0x2000
+
+
+ typedef struct CFF_ParserRec_
+ {
+ FT_Library library;
+ FT_Byte* start;
+ FT_Byte* limit;
+ FT_Byte* cursor;
+
+ FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1];
+ FT_Byte** top;
+
+ FT_UInt object_code;
+ void* object;
+
+ } CFF_ParserRec, *CFF_Parser;
+
+
+ FT_LOCAL( void )
+ cff_parser_init( CFF_Parser parser,
+ FT_UInt code,
+ void* object,
+ FT_Library library);
+
+ FT_LOCAL( FT_Error )
+ cff_parser_run( CFF_Parser parser,
+ FT_Byte* start,
+ FT_Byte* limit );
+
+
+ enum
+ {
+ cff_kind_none = 0,
+ cff_kind_num,
+ cff_kind_fixed,
+ cff_kind_fixed_thousand,
+ cff_kind_string,
+ cff_kind_bool,
+ cff_kind_delta,
+ cff_kind_callback,
+
+ cff_kind_max /* do not remove */
+ };
+
+
+ /* now generate handlers for the most simple fields */
+ typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser );
+
+ typedef struct CFF_Field_Handler_
+ {
+ int kind;
+ int code;
+ FT_UInt offset;
+ FT_Byte size;
+ CFF_Field_Reader reader;
+ FT_UInt array_max;
+ FT_UInt count_offset;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ const char* id;
+#endif
+
+ } CFF_Field_Handler;
+
+
+FT_END_HEADER
+
+
+#endif /* __CFF_PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
new file mode 100644
index 0000000000..5675e73155
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
@@ -0,0 +1,138 @@
+/***************************************************************************/
+/* */
+/* cffpic.c */
+/* */
+/* The FreeType position independent code services for cff module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+#include "cfferrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from cffdrivr.c */
+ FT_Error
+ FT_Create_Class_cff_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_cff_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_cff_service_ps_info( FT_Library library,
+ FT_Service_PsInfoRec* clazz );
+ void
+ FT_Init_Class_cff_service_glyph_dict( FT_Library library,
+ FT_Service_GlyphDictRec* clazz );
+ void
+ FT_Init_Class_cff_service_ps_name( FT_Library library,
+ FT_Service_PsFontNameRec* clazz );
+ void
+ FT_Init_Class_cff_service_get_cmap_info( FT_Library library,
+ FT_Service_TTCMapsRec* clazz );
+ void
+ FT_Init_Class_cff_service_cid_info( FT_Library library,
+ FT_Service_CIDRec* clazz );
+
+ /* forward declaration of PIC init functions from cffparse.c */
+ FT_Error
+ FT_Create_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler** output_class );
+ void
+ FT_Destroy_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler* clazz );
+
+
+ void
+ cff_driver_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->cff )
+ {
+ CffModulePIC* container = (CffModulePIC*)pic_container->cff;
+
+
+ if ( container->cff_services )
+ FT_Destroy_Class_cff_services( library,
+ container->cff_services );
+ container->cff_services = NULL;
+ if ( container->cff_field_handlers )
+ FT_Destroy_Class_cff_field_handlers(
+ library, container->cff_field_handlers );
+ container->cff_field_handlers = NULL;
+ FT_FREE( container );
+ pic_container->cff = NULL;
+ }
+ }
+
+
+ FT_Error
+ cff_driver_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ CffModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->cff = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_cff_services( library,
+ &container->cff_services );
+ if ( error )
+ goto Exit;
+
+ error = FT_Create_Class_cff_field_handlers(
+ library, &container->cff_field_handlers );
+ if ( error )
+ goto Exit;
+
+ FT_Init_Class_cff_service_ps_info(
+ library, &container->cff_service_ps_info );
+ FT_Init_Class_cff_service_glyph_dict(
+ library, &container->cff_service_glyph_dict );
+ FT_Init_Class_cff_service_ps_name(
+ library, &container->cff_service_ps_name );
+ FT_Init_Class_cff_service_get_cmap_info(
+ library, &container->cff_service_get_cmap_info );
+ FT_Init_Class_cff_service_cid_info(
+ library, &container->cff_service_cid_info );
+ FT_Init_Class_cff_cmap_encoding_class_rec(
+ library, &container->cff_cmap_encoding_class_rec );
+ FT_Init_Class_cff_cmap_unicode_class_rec(
+ library, &container->cff_cmap_unicode_class_rec );
+
+ Exit:
+ if ( error )
+ cff_driver_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
new file mode 100644
index 0000000000..7fb76e5937
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/* */
+/* cffpic.h */
+/* */
+/* The FreeType position independent code services for cff module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFPIC_H__
+#define __CFFPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define CFF_SERVICE_PS_INFO_GET cff_service_ps_info
+#define CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict
+#define CFF_SERVICE_PS_NAME_GET cff_service_ps_name
+#define CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info
+#define CFF_SERVICE_CID_INFO_GET cff_service_cid_info
+#define CFF_SERVICE_PROPERTIES_GET cff_service_properties
+#define CFF_SERVICES_GET cff_services
+#define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec
+#define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec
+#define CFF_FIELD_HANDLERS_GET cff_field_handlers
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+ typedef struct CffModulePIC_
+ {
+ FT_ServiceDescRec* cff_services;
+ CFF_Field_Handler* cff_field_handlers;
+ FT_Service_PsInfoRec cff_service_ps_info;
+ FT_Service_GlyphDictRec cff_service_glyph_dict;
+ FT_Service_PsFontNameRec cff_service_ps_name;
+ FT_Service_TTCMapsRec cff_service_get_cmap_info;
+ FT_Service_CIDRec cff_service_cid_info;
+ FT_Service_PropertiesRec cff_service_properties;
+ FT_CMap_ClassRec cff_cmap_encoding_class_rec;
+ FT_CMap_ClassRec cff_cmap_unicode_class_rec;
+
+ } CffModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (CffModulePIC*)( (lib)->pic_container.cff ) )
+
+#define CFF_SERVICE_PS_INFO_GET \
+ ( GET_PIC( library )->cff_service_ps_info )
+#define CFF_SERVICE_GLYPH_DICT_GET \
+ ( GET_PIC( library )->cff_service_glyph_dict )
+#define CFF_SERVICE_PS_NAME_GET \
+ ( GET_PIC( library )->cff_service_ps_name )
+#define CFF_SERVICE_GET_CMAP_INFO_GET \
+ ( GET_PIC( library )->cff_service_get_cmap_info )
+#define CFF_SERVICE_CID_INFO_GET \
+ ( GET_PIC( library )->cff_service_cid_info )
+#define CFF_SERVICE_PROPERTIES_GET \
+ ( GET_PIC( library )->cff_service_properties )
+#define CFF_SERVICES_GET \
+ ( GET_PIC( library )->cff_services )
+#define CFF_CMAP_ENCODING_CLASS_REC_GET \
+ ( GET_PIC( library )->cff_cmap_encoding_class_rec )
+#define CFF_CMAP_UNICODE_CLASS_REC_GET \
+ ( GET_PIC( library )->cff_cmap_unicode_class_rec )
+#define CFF_FIELD_HANDLERS_GET \
+ ( GET_PIC( library )->cff_field_handlers )
+
+ /* see cffpic.c for the implementation */
+ void
+ cff_driver_class_pic_free( FT_Library library );
+
+ FT_Error
+ cff_driver_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __CFFPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
new file mode 100644
index 0000000000..bcb4276a78
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/* */
+/* cfftoken.h */
+/* */
+/* CFF token definitions (specification only). */
+/* */
+/* Copyright 1996-2003, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_FontRecDictRec
+
+#undef CFFCODE
+#define CFFCODE CFFCODE_TOPDICT
+
+ CFF_FIELD_STRING ( 0, version, "Version" )
+ CFF_FIELD_STRING ( 1, notice, "Notice" )
+ CFF_FIELD_STRING ( 0x100, copyright, "Copyright" )
+ CFF_FIELD_STRING ( 2, full_name, "FullName" )
+ CFF_FIELD_STRING ( 3, family_name, "FamilyName" )
+ CFF_FIELD_STRING ( 4, weight, "Weight" )
+ CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" )
+ CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" )
+ CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" )
+ CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" )
+ CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" )
+ CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" )
+ CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" )
+ CFF_FIELD_NUM ( 13, unique_id, "UniqueID" )
+ CFF_FIELD_CALLBACK( 5, font_bbox, "FontBBox" )
+ CFF_FIELD_NUM ( 0x108, stroke_width, "StrokeWidth" )
+ CFF_FIELD_NUM ( 15, charset_offset, "charset" )
+ CFF_FIELD_NUM ( 16, encoding_offset, "Encoding" )
+ CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" )
+ CFF_FIELD_CALLBACK( 18, private_dict, "Private" )
+ CFF_FIELD_NUM ( 0x114, synthetic_base, "SyntheticBase" )
+ CFF_FIELD_STRING ( 0x115, embedded_postscript, "PostScript" )
+
+#if 0
+ CFF_FIELD_STRING ( 0x116, base_font_name, "BaseFontName" )
+ CFF_FIELD_DELTA ( 0x117, base_font_blend, 16, "BaseFontBlend" )
+ CFF_FIELD_CALLBACK( 0x118, multiple_master, "MultipleMaster" )
+ CFF_FIELD_CALLBACK( 0x119, blend_axis_types, "BlendAxisTypes" )
+#endif
+
+ CFF_FIELD_CALLBACK( 0x11E, cid_ros, "ROS" )
+ CFF_FIELD_NUM ( 0x11F, cid_font_version, "CIDFontVersion" )
+ CFF_FIELD_NUM ( 0x120, cid_font_revision, "CIDFontRevision" )
+ CFF_FIELD_NUM ( 0x121, cid_font_type, "CIDFontType" )
+ CFF_FIELD_NUM ( 0x122, cid_count, "CIDCount" )
+ CFF_FIELD_NUM ( 0x123, cid_uid_base, "UIDBase" )
+ CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" )
+ CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" )
+ CFF_FIELD_STRING ( 0x126, cid_font_name, "FontName" )
+
+#if 0
+ CFF_FIELD_NUM ( 0x127, chameleon, "Chameleon" )
+#endif
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_PrivateRec
+#undef CFFCODE
+#define CFFCODE CFFCODE_PRIVATE
+
+ CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" )
+ CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" )
+ CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" )
+ CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" )
+ CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" )
+ CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" )
+ CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" )
+ CFF_FIELD_NUM ( 10, standard_width, "StdHW" )
+ CFF_FIELD_NUM ( 11, standard_height, "StdVW" )
+ CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" )
+ CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" )
+ CFF_FIELD_BOOL ( 0x10E, force_bold, "ForceBold" )
+ CFF_FIELD_FIXED ( 0x10F, force_bold_threshold, "ForceBoldThreshold" )
+ CFF_FIELD_NUM ( 0x110, lenIV, "lenIV" )
+ CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" )
+ CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" )
+ CFF_FIELD_NUM ( 0x113, initial_random_seed, "initialRandomSeed" )
+ CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" )
+ CFF_FIELD_NUM ( 20, default_width, "defaultWidthX" )
+ CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
new file mode 100644
index 0000000000..f08e064fb3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
@@ -0,0 +1,284 @@
+/***************************************************************************/
+/* */
+/* cfftypes.h */
+/* */
+/* Basic OpenType/CFF type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2003, 2006-2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFTYPES_H__
+#define __CFFTYPES_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CFF_IndexRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a CFF Index table. */
+ /* */
+ /* <Fields> */
+ /* stream :: The source input stream. */
+ /* */
+ /* start :: The position of the first index byte in the */
+ /* input stream. */
+ /* */
+ /* count :: The number of elements in the index. */
+ /* */
+ /* off_size :: The size in bytes of object offsets in index. */
+ /* */
+ /* data_offset :: The position of first data byte in the index's */
+ /* bytes. */
+ /* */
+ /* data_size :: The size of the data table in this index. */
+ /* */
+ /* offsets :: A table of element offsets in the index. Must be */
+ /* loaded explicitly. */
+ /* */
+ /* bytes :: If the index is loaded in memory, its bytes. */
+ /* */
+ typedef struct CFF_IndexRec_
+ {
+ FT_Stream stream;
+ FT_ULong start;
+ FT_UInt count;
+ FT_Byte off_size;
+ FT_ULong data_offset;
+ FT_ULong data_size;
+
+ FT_ULong* offsets;
+ FT_Byte* bytes;
+
+ } CFF_IndexRec, *CFF_Index;
+
+
+ typedef struct CFF_EncodingRec_
+ {
+ FT_UInt format;
+ FT_ULong offset;
+
+ FT_UInt count;
+ FT_UShort sids [256]; /* avoid dynamic allocations */
+ FT_UShort codes[256];
+
+ } CFF_EncodingRec, *CFF_Encoding;
+
+
+ typedef struct CFF_CharsetRec_
+ {
+
+ FT_UInt format;
+ FT_ULong offset;
+
+ FT_UShort* sids;
+ FT_UShort* cids; /* the inverse mapping of `sids'; only needed */
+ /* for CID-keyed fonts */
+ FT_UInt max_cid;
+ FT_UInt num_glyphs;
+
+ } CFF_CharsetRec, *CFF_Charset;
+
+
+ typedef struct CFF_FontRecDictRec_
+ {
+ FT_UInt version;
+ FT_UInt notice;
+ FT_UInt copyright;
+ FT_UInt full_name;
+ FT_UInt family_name;
+ FT_UInt weight;
+ FT_Bool is_fixed_pitch;
+ FT_Fixed italic_angle;
+ FT_Fixed underline_position;
+ FT_Fixed underline_thickness;
+ FT_Int paint_type;
+ FT_Int charstring_type;
+ FT_Matrix font_matrix;
+ FT_Bool has_font_matrix;
+ FT_ULong units_per_em; /* temporarily used as scaling value also */
+ FT_Vector font_offset;
+ FT_ULong unique_id;
+ FT_BBox font_bbox;
+ FT_Pos stroke_width;
+ FT_ULong charset_offset;
+ FT_ULong encoding_offset;
+ FT_ULong charstrings_offset;
+ FT_ULong private_offset;
+ FT_ULong private_size;
+ FT_Long synthetic_base;
+ FT_UInt embedded_postscript;
+
+ /* these should only be used for the top-level font dictionary */
+ FT_UInt cid_registry;
+ FT_UInt cid_ordering;
+ FT_Long cid_supplement;
+
+ FT_Long cid_font_version;
+ FT_Long cid_font_revision;
+ FT_Long cid_font_type;
+ FT_ULong cid_count;
+ FT_ULong cid_uid_base;
+ FT_ULong cid_fd_array_offset;
+ FT_ULong cid_fd_select_offset;
+ FT_UInt cid_font_name;
+
+ } CFF_FontRecDictRec, *CFF_FontRecDict;
+
+
+ typedef struct CFF_PrivateRec_
+ {
+ FT_Byte num_blue_values;
+ FT_Byte num_other_blues;
+ FT_Byte num_family_blues;
+ FT_Byte num_family_other_blues;
+
+ FT_Pos blue_values[14];
+ FT_Pos other_blues[10];
+ FT_Pos family_blues[14];
+ FT_Pos family_other_blues[10];
+
+ FT_Fixed blue_scale;
+ FT_Pos blue_shift;
+ FT_Pos blue_fuzz;
+ FT_Pos standard_width;
+ FT_Pos standard_height;
+
+ FT_Byte num_snap_widths;
+ FT_Byte num_snap_heights;
+ FT_Pos snap_widths[13];
+ FT_Pos snap_heights[13];
+ FT_Bool force_bold;
+ FT_Fixed force_bold_threshold;
+ FT_Int lenIV;
+ FT_Int language_group;
+ FT_Fixed expansion_factor;
+ FT_Long initial_random_seed;
+ FT_ULong local_subrs_offset;
+ FT_Pos default_width;
+ FT_Pos nominal_width;
+
+ } CFF_PrivateRec, *CFF_Private;
+
+
+ typedef struct CFF_FDSelectRec_
+ {
+ FT_Byte format;
+ FT_UInt range_count;
+
+ /* that's the table, taken from the file `as is' */
+ FT_Byte* data;
+ FT_UInt data_size;
+
+ /* small cache for format 3 only */
+ FT_UInt cache_first;
+ FT_UInt cache_count;
+ FT_Byte cache_fd;
+
+ } CFF_FDSelectRec, *CFF_FDSelect;
+
+
+ /* A SubFont packs a font dict and a private dict together. They are */
+ /* needed to support CID-keyed CFF fonts. */
+ typedef struct CFF_SubFontRec_
+ {
+ CFF_FontRecDictRec font_dict;
+ CFF_PrivateRec private_dict;
+
+ CFF_IndexRec local_subrs_index;
+ FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */
+
+ } CFF_SubFontRec, *CFF_SubFont;
+
+
+#define CFF_MAX_CID_FONTS 256
+
+
+ typedef struct CFF_FontRec_
+ {
+ FT_Stream stream;
+ FT_Memory memory;
+ FT_UInt num_faces;
+ FT_UInt num_glyphs;
+
+ FT_Byte version_major;
+ FT_Byte version_minor;
+ FT_Byte header_size;
+ FT_Byte absolute_offsize;
+
+
+ CFF_IndexRec name_index;
+ CFF_IndexRec top_dict_index;
+ CFF_IndexRec global_subrs_index;
+
+ CFF_EncodingRec encoding;
+ CFF_CharsetRec charset;
+
+ CFF_IndexRec charstrings_index;
+ CFF_IndexRec font_dict_index;
+ CFF_IndexRec private_index;
+ CFF_IndexRec local_subrs_index;
+
+ FT_String* font_name;
+
+ /* array of pointers into Global Subrs INDEX data */
+ FT_Byte** global_subrs;
+
+ /* array of pointers into String INDEX data stored at string_pool */
+ FT_UInt num_strings;
+ FT_Byte** strings;
+ FT_Byte* string_pool;
+
+ CFF_SubFontRec top_font;
+ FT_UInt num_subfonts;
+ CFF_SubFont subfonts[CFF_MAX_CID_FONTS];
+
+ CFF_FDSelectRec fd_select;
+
+ /* interface to PostScript hinter */
+ PSHinter_Service pshinter;
+
+ /* interface to Postscript Names service */
+ FT_Service_PsCMaps psnames;
+
+ /* since version 2.3.0 */
+ PS_FontInfoRec* font_info; /* font info dictionary */
+
+ /* since version 2.3.6 */
+ FT_String* registry;
+ FT_String* ordering;
+
+ /* since version 2.4.12 */
+ FT_Generic cf2_instance;
+
+ } CFF_FontRec, *CFF_Font;
+
+
+FT_END_HEADER
+
+#endif /* __CFFTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
new file mode 100644
index 0000000000..34dbabb91f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
@@ -0,0 +1,45 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* cff.c */
+/* */
+/* FreeType OpenType driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+
+#include "cffpic.c"
+#include "cffdrivr.c"
+#include "cffparse.c"
+#include "cffload.c"
+#include "cffobjs.c"
+#include "cffgload.c"
+#include "cffcmap.c"
+
+#include "cf2arrst.c"
+#include "cf2blues.c"
+#include "cf2error.c"
+#include "cf2font.c"
+#include "cf2ft.c"
+#include "cf2hints.c"
+#include "cf2intrp.c"
+#include "cf2read.c"
+#include "cf2stack.c"
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
new file mode 100644
index 0000000000..ef1391c279
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CFF module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += CFF_DRIVER
+
+define CFF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
new file mode 100644
index 0000000000..13115c2550
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
@@ -0,0 +1,86 @@
+#
+# FreeType 2 OpenType/CFF driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# OpenType driver directory
+#
+CFF_DIR := $(SRC_DIR)/cff
+
+
+CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR))
+
+
+# CFF driver sources (i.e., C files)
+#
+CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c \
+ $(CFF_DIR)/cffdrivr.c \
+ $(CFF_DIR)/cffgload.c \
+ $(CFF_DIR)/cffload.c \
+ $(CFF_DIR)/cffobjs.c \
+ $(CFF_DIR)/cffparse.c \
+ $(CFF_DIR)/cffpic.c \
+ $(CFF_DIR)/cf2arrst.c \
+ $(CFF_DIR)/cf2blues.c \
+ $(CFF_DIR)/cf2error.c \
+ $(CFF_DIR)/cf2font.c \
+ $(CFF_DIR)/cf2ft.c \
+ $(CFF_DIR)/cf2hints.c \
+ $(CFF_DIR)/cf2intrp.c \
+ $(CFF_DIR)/cf2read.c \
+ $(CFF_DIR)/cf2stack.c
+
+
+# CFF driver headers
+#
+CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \
+ $(CFF_DIR)/cfferrs.h \
+ $(CFF_DIR)/cfftoken.h \
+ $(CFF_DIR)/cfftypes.h \
+ $(CFF_DIR)/cf2fixed.h \
+ $(CFF_DIR)/cf2glue.h \
+ $(CFF_DIR)/cf2types.h
+
+
+# CFF driver object(s)
+#
+# CFF_DRV_OBJ_M is used during `multi' builds
+# CFF_DRV_OBJ_S is used during `single' builds
+#
+CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O
+
+# CFF driver source file for single build
+#
+CFF_DRV_SRC_S := $(CFF_DIR)/cff.c
+
+
+# CFF driver - single object
+#
+$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H)
+ $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S))
+
+
+# CFF driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H)
+ $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CFF_DRV_OBJ_S)
+DRV_OBJS_M += $(CFF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
new file mode 100644
index 0000000000..ebeaed54ea
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cid Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) cid ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = cidobjs cidload cidgload cidriver cidparse ;
+ }
+ else
+ {
+ _sources = type1cid ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cid Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
new file mode 100644
index 0000000000..1fdc24f168
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* ciderrs.h */
+/* */
+/* CID error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the CID error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __CIDERRS_H__
+#define __CIDERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CID_Err_
+#define FT_ERR_BASE FT_Mod_Err_CID
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CIDERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
new file mode 100644
index 0000000000..bb04ed4a21
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/* */
+/* cidgload.c */
+/* */
+/* CID-keyed Type1 Glyph Loader (body). */
+/* */
+/* Copyright 1996-2007, 2009, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidload.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidgload
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cid_load_glyph( T1_Decoder decoder,
+ FT_UInt glyph_index )
+ {
+ CID_Face face = (CID_Face)decoder->builder.face;
+ CID_FaceInfo cid = &face->cid;
+ FT_Byte* p;
+ FT_UInt fd_select;
+ FT_Stream stream = face->cid_stream;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* charstring = 0;
+ FT_Memory memory = face->root.memory;
+ FT_ULong glyph_length = 0;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec *inc =
+ face->root.internal->incremental_interface;
+#endif
+
+
+ FT_TRACE4(( "cid_load_glyph: glyph index %d\n", glyph_index ));
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* For incremental fonts get the character data using */
+ /* the callback function. */
+ if ( inc )
+ {
+ FT_Data glyph_data;
+
+
+ error = inc->funcs->get_glyph_data( inc->object,
+ glyph_index, &glyph_data );
+ if ( error )
+ goto Exit;
+
+ p = (FT_Byte*)glyph_data.pointer;
+ fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+
+ if ( glyph_data.length != 0 )
+ {
+ glyph_length = glyph_data.length - cid->fd_bytes;
+ (void)FT_ALLOC( charstring, glyph_length );
+ if ( !error )
+ ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
+ glyph_length );
+ }
+
+ inc->funcs->free_glyph_data( inc->object, &glyph_data );
+
+ if ( error )
+ goto Exit;
+ }
+
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* For ordinary fonts read the CID font dictionary index */
+ /* and charstring offset from the CIDMap. */
+ {
+ FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes;
+ FT_ULong off1;
+
+
+ if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
+ glyph_index * entry_len ) ||
+ FT_FRAME_ENTER( 2 * entry_len ) )
+ goto Exit;
+
+ p = (FT_Byte*)stream->cursor;
+ fd_select = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+ off1 = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
+ p += cid->fd_bytes;
+ glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
+ FT_FRAME_EXIT();
+
+ if ( fd_select >= (FT_UInt)cid->num_dicts )
+ {
+ error = FT_THROW( Invalid_Offset );
+ goto Exit;
+ }
+ if ( glyph_length == 0 )
+ goto Exit;
+ if ( FT_ALLOC( charstring, glyph_length ) )
+ goto Exit;
+ if ( FT_STREAM_READ_AT( cid->data_offset + off1,
+ charstring, glyph_length ) )
+ goto Exit;
+ }
+
+ /* Now set up the subrs array and parse the charstrings. */
+ {
+ CID_FaceDict dict;
+ CID_Subrs cid_subrs = face->subrs + fd_select;
+ FT_Int cs_offset;
+
+
+ /* Set up subrs */
+ decoder->num_subrs = cid_subrs->num_subrs;
+ decoder->subrs = cid_subrs->code;
+ decoder->subrs_len = 0;
+
+ /* Set up font matrix */
+ dict = cid->font_dicts + fd_select;
+
+ decoder->font_matrix = dict->font_matrix;
+ decoder->font_offset = dict->font_offset;
+ decoder->lenIV = dict->private_dict.lenIV;
+
+ /* Decode the charstring. */
+
+ /* Adjustment for seed bytes. */
+ cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+
+ /* Decrypt only if lenIV >= 0. */
+ if ( decoder->lenIV >= 0 )
+ psaux->t1_decrypt( charstring, glyph_length, 4330 );
+
+ error = decoder->funcs.parse_charstrings(
+ decoder, charstring + cs_offset,
+ (FT_Int)glyph_length - cs_offset );
+ }
+
+ FT_FREE( charstring );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error && inc && inc->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+ metrics.bearing_y = 0;
+ metrics.advance = FIXED_TO_INT( decoder->builder.advance.x );
+ metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+ error = inc->funcs->get_glyph_metrics( inc->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+ decoder->builder.advance.x = INT_TO_FIXED( metrics.advance );
+ decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ Exit:
+ return error;
+ }
+
+
+#if 0
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_compute_max_advance( CID_Face face,
+ FT_Int* max_advance )
+ {
+ FT_Error error;
+ T1_DecoderRec decoder;
+ FT_Int glyph_index;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ *max_advance = 0;
+
+ /* Initialize load decoder */
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ 0, /* glyph names! XXX */
+ 0, /* blend == 0 */
+ 0, /* hinting == 0 */
+ cid_load_glyph );
+ if ( error )
+ return error;
+
+ /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+ /* if we ever support CID-keyed multiple master fonts */
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ /* for each glyph, parse the glyph charstring and extract */
+ /* the advance width */
+ for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+ glyph_index++ )
+ {
+ /* now get load the unscaled outline */
+ error = cid_load_glyph( &decoder, glyph_index );
+ /* ignore the error if one occurred - skip to next glyph */
+ }
+
+ *max_advance = FIXED_TO_INT( decoder.builder.advance.x );
+
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */
+ FT_Size cidsize, /* CID_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph;
+ FT_Error error;
+ T1_DecoderRec decoder;
+ CID_Face face = (CID_Face)cidglyph->face;
+ FT_Bool hinting;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ glyph->x_scale = cidsize->metrics.x_scale;
+ glyph->y_scale = cidsize->metrics.y_scale;
+
+ cidglyph->outline.n_points = 0;
+ cidglyph->outline.n_contours = 0;
+
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 &&
+ ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ cidglyph->face,
+ cidsize,
+ cidglyph,
+ 0, /* glyph names -- XXX */
+ 0, /* blend == 0 */
+ hinting,
+ FT_LOAD_TARGET_MODE( load_flags ),
+ cid_load_glyph );
+ if ( error )
+ goto Exit;
+
+ /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+ /* if we ever support CID-keyed multiple master fonts */
+
+ /* set up the decoder */
+ decoder.builder.no_recurse = FT_BOOL(
+ ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
+
+ error = cid_load_glyph( &decoder, glyph_index );
+ if ( error )
+ goto Exit;
+
+ font_matrix = decoder.font_matrix;
+ font_offset = decoder.font_offset;
+
+ /* save new glyph tables */
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ /* now set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax */
+ cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+ cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ /* for composite glyphs, return only left side bearing and */
+ /* advance width */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = cidglyph->internal;
+
+
+ cidglyph->metrics.horiBearingX =
+ FIXED_TO_INT( decoder.builder.left_bearing.x );
+ cidglyph->metrics.horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &cidglyph->metrics;
+ FT_Vector advance;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ cidglyph->linearHoriAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ cidglyph->internal->glyph_transformed = 0;
+
+ /* make up vertical ones */
+ metrics->vertAdvance = ( face->cid.font_bbox.yMax -
+ face->cid.font_bbox.yMin ) >> 16;
+ cidglyph->linearVertAdvance = metrics->vertAdvance;
+
+ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ if ( cidsize->metrics.y_ppem < 24 )
+ cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ /* apply the font matrix */
+ FT_Outline_Transform( &cidglyph->outline, &font_matrix );
+
+ FT_Outline_Translate( &cidglyph->outline,
+ font_offset.x,
+ font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = decoder.builder.base;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points */
+ if ( !hinting || !decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
new file mode 100644
index 0000000000..e701793e19
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* cidgload.h */
+/* */
+/* OpenType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDGLOAD_H__
+#define __CIDGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cidobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#if 0
+
+ /* Compute the maximum advance width of a font through quick parsing */
+ FT_LOCAL( FT_Error )
+ cid_face_compute_max_advance( CID_Face face,
+ FT_Int* max_advance );
+
+#endif /* 0 */
+
+ FT_LOCAL( FT_Error )
+ cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */
+ FT_Size size, /* CID_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CIDGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
new file mode 100644
index 0000000000..bfb25dc37d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
@@ -0,0 +1,690 @@
+/***************************************************************************/
+/* */
+/* cidload.c */
+/* */
+/* CID-keyed Type1 font loader (body). */
+/* */
+/* Copyright 1996-2006, 2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+
+#include "cidload.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidload
+
+
+ /* read a single offset */
+ FT_LOCAL_DEF( FT_Long )
+ cid_get_offset( FT_Byte* *start,
+ FT_Byte offsize )
+ {
+ FT_ULong result;
+ FT_Byte* p = *start;
+
+
+ for ( result = 0; offsize > 0; offsize-- )
+ {
+ result <<= 8;
+ result |= *p++;
+ }
+
+ *start = p;
+ return (FT_Long)result;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 SYMBOL PARSING *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static FT_Error
+ cid_load_keyword( CID_Face face,
+ CID_Loader* loader,
+ const T1_Field keyword )
+ {
+ FT_Error error;
+ CID_Parser* parser = &loader->parser;
+ FT_Byte* object;
+ void* dummy_object;
+ CID_FaceInfo cid = &face->cid;
+
+
+ /* if the keyword has a dedicated callback, call it */
+ if ( keyword->type == T1_FIELD_TYPE_CALLBACK )
+ {
+ keyword->reader( (FT_Face)face, parser );
+ error = parser->root.error;
+ goto Exit;
+ }
+
+ /* we must now compute the address of our target object */
+ switch ( keyword->location )
+ {
+ case T1_FIELD_LOCATION_CID_INFO:
+ object = (FT_Byte*)cid;
+ break;
+
+ case T1_FIELD_LOCATION_FONT_INFO:
+ object = (FT_Byte*)&cid->font_info;
+ break;
+
+ case T1_FIELD_LOCATION_FONT_EXTRA:
+ object = (FT_Byte*)&face->font_extra;
+ break;
+
+ case T1_FIELD_LOCATION_BBOX:
+ object = (FT_Byte*)&cid->font_bbox;
+ break;
+
+ default:
+ {
+ CID_FaceDict dict;
+
+
+ if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )
+ {
+ FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n",
+ keyword->ident ));
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ dict = cid->font_dicts + parser->num_dict;
+ switch ( keyword->location )
+ {
+ case T1_FIELD_LOCATION_PRIVATE:
+ object = (FT_Byte*)&dict->private_dict;
+ break;
+
+ default:
+ object = (FT_Byte*)dict;
+ }
+ }
+ }
+
+ dummy_object = object;
+
+ /* now, load the keyword data in the object's field(s) */
+ if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+ keyword->type == T1_FIELD_TYPE_FIXED_ARRAY )
+ error = cid_parser_load_field_table( &loader->parser, keyword,
+ &dummy_object );
+ else
+ error = cid_parser_load_field( &loader->parser,
+ keyword, &dummy_object );
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cid_parse_font_matrix( CID_Face face,
+ CID_Parser* parser )
+ {
+ FT_Matrix* matrix;
+ FT_Vector* offset;
+ CID_FaceDict dict;
+ FT_Face root = (FT_Face)&face->root;
+ FT_Fixed temp[6];
+ FT_Fixed temp_scale;
+
+
+ if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+ {
+ dict = face->cid.font_dicts + parser->num_dict;
+ matrix = &dict->font_matrix;
+ offset = &dict->font_offset;
+
+ (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );
+
+ temp_scale = FT_ABS( temp[3] );
+
+ /* Set Units per EM based on FontMatrix values. We set the value to */
+ /* 1000 / temp_scale, because temp_scale was already multiplied by */
+ /* 1000 (in t1_tofixed, from psobjs.c). */
+
+ root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+ /* we need to scale the values by 1.0/temp[3] */
+ if ( temp_scale != 0x10000L )
+ {
+ temp[0] = FT_DivFix( temp[0], temp_scale );
+ temp[1] = FT_DivFix( temp[1], temp_scale );
+ temp[2] = FT_DivFix( temp[2], temp_scale );
+ temp[4] = FT_DivFix( temp[4], temp_scale );
+ temp[5] = FT_DivFix( temp[5], temp_scale );
+ temp[3] = 0x10000L;
+ }
+
+ matrix->xx = temp[0];
+ matrix->yx = temp[1];
+ matrix->xy = temp[2];
+ matrix->yy = temp[3];
+
+ /* note that the font offsets are expressed in integer font units */
+ offset->x = temp[4] >> 16;
+ offset->y = temp[5] >> 16;
+ }
+
+ return FT_Err_Ok; /* this is a callback function; */
+ /* we must return an error code */
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ parse_fd_array( CID_Face face,
+ CID_Parser* parser )
+ {
+ CID_FaceInfo cid = &face->cid;
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Long num_dicts;
+
+
+ num_dicts = cid_parser_to_int( parser );
+
+ if ( !cid->font_dicts )
+ {
+ FT_Int n;
+
+
+ if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )
+ goto Exit;
+
+ cid->num_dicts = (FT_UInt)num_dicts;
+
+ /* don't forget to set a few defaults */
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ CID_FaceDict dict = cid->font_dicts + n;
+
+
+ /* default value for lenIV */
+ dict->private_dict.lenIV = 4;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* by mistake, `expansion_factor' appears both in PS_PrivateRec */
+ /* and CID_FaceDictRec (both are public header files and can't */
+ /* changed); we simply copy the value */
+
+ FT_CALLBACK_DEF( FT_Error )
+ parse_expansion_factor( CID_Face face,
+ CID_Parser* parser )
+ {
+ CID_FaceDict dict;
+
+
+ if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+ {
+ dict = face->cid.font_dicts + parser->num_dict;
+
+ dict->expansion_factor = cid_parser_to_fixed( parser, 0 );
+ dict->private_dict.expansion_factor = dict->expansion_factor;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ static
+ const T1_FieldRec cid_field_records[] =
+ {
+
+#include "cidtoken.h"
+
+ T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 )
+ T1_FIELD_CALLBACK( "FontMatrix", cid_parse_font_matrix, 0 )
+ T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 )
+
+ { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+ static FT_Error
+ cid_parse_dict( CID_Face face,
+ CID_Loader* loader,
+ FT_Byte* base,
+ FT_Long size )
+ {
+ CID_Parser* parser = &loader->parser;
+
+
+ parser->root.cursor = base;
+ parser->root.limit = base + size;
+ parser->root.error = FT_Err_Ok;
+
+ {
+ FT_Byte* cur = base;
+ FT_Byte* limit = cur + size;
+
+
+ for (;;)
+ {
+ FT_Byte* newlimit;
+
+
+ parser->root.cursor = cur;
+ cid_parser_skip_spaces( parser );
+
+ if ( parser->root.cursor >= limit )
+ newlimit = limit - 1 - 17;
+ else
+ newlimit = parser->root.cursor - 17;
+
+ /* look for `%ADOBeginFontDict' */
+ for ( ; cur < newlimit; cur++ )
+ {
+ if ( *cur == '%' &&
+ ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 )
+ {
+ /* if /FDArray was found, then cid->num_dicts is > 0, and */
+ /* we can start increasing parser->num_dict */
+ if ( face->cid.num_dicts > 0 )
+ parser->num_dict++;
+ }
+ }
+
+ cur = parser->root.cursor;
+ /* no error can occur in cid_parser_skip_spaces */
+ if ( cur >= limit )
+ break;
+
+ cid_parser_skip_PS_token( parser );
+ if ( parser->root.cursor >= limit || parser->root.error )
+ break;
+
+ /* look for immediates */
+ if ( *cur == '/' && cur + 2 < limit )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+ len = parser->root.cursor - cur;
+
+ if ( len > 0 && len < 22 )
+ {
+ /* now compare the immediate name to the keyword table */
+ T1_Field keyword = (T1_Field)cid_field_records;
+
+
+ for (;;)
+ {
+ FT_Byte* name;
+
+
+ name = (FT_Byte*)keyword->ident;
+ if ( !name )
+ break;
+
+ if ( cur[0] == name[0] &&
+ len == (FT_PtrDist)ft_strlen( (const char*)name ) )
+ {
+ FT_PtrDist n;
+
+
+ for ( n = 1; n < len; n++ )
+ if ( cur[n] != name[n] )
+ break;
+
+ if ( n >= len )
+ {
+ /* we found it - run the parsing callback */
+ parser->root.error = cid_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error )
+ return parser->root.error;
+ break;
+ }
+ }
+ keyword++;
+ }
+ }
+ }
+
+ cur = parser->root.cursor;
+ }
+ }
+ return parser->root.error;
+ }
+
+
+ /* read the subrmap and the subrs of each font dict */
+ static FT_Error
+ cid_read_subrs( CID_Face face )
+ {
+ CID_FaceInfo cid = &face->cid;
+ FT_Memory memory = face->root.memory;
+ FT_Stream stream = face->cid_stream;
+ FT_Error error;
+ FT_Int n;
+ CID_Subrs subr;
+ FT_UInt max_offsets = 0;
+ FT_ULong* offsets = 0;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )
+ goto Exit;
+
+ subr = face->subrs;
+ for ( n = 0; n < cid->num_dicts; n++, subr++ )
+ {
+ CID_FaceDict dict = cid->font_dicts + n;
+ FT_Int lenIV = dict->private_dict.lenIV;
+ FT_UInt count, num_subrs = dict->num_subrs;
+ FT_ULong data_len;
+ FT_Byte* p;
+
+
+ /* Check for possible overflow. */
+ if ( num_subrs == FT_UINT_MAX )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Fail;
+ }
+
+ /* reallocate offsets array if needed */
+ if ( num_subrs + 1 > max_offsets )
+ {
+ FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 );
+
+
+ if ( new_max <= max_offsets )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Fail;
+ }
+
+ if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )
+ goto Fail;
+
+ max_offsets = new_max;
+ }
+
+ /* read the subrmap's offsets */
+ if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
+ FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) )
+ goto Fail;
+
+ p = (FT_Byte*)stream->cursor;
+ for ( count = 0; count <= num_subrs; count++ )
+ offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );
+
+ FT_FRAME_EXIT();
+
+ /* offsets must be ordered */
+ for ( count = 1; count <= num_subrs; count++ )
+ if ( offsets[count - 1] > offsets[count] )
+ goto Fail;
+
+ /* now, compute the size of subrs charstrings, */
+ /* allocate, and read them */
+ data_len = offsets[num_subrs] - offsets[0];
+
+ if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||
+ FT_ALLOC( subr->code[0], data_len ) )
+ goto Fail;
+
+ if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
+ FT_STREAM_READ( subr->code[0], data_len ) )
+ goto Fail;
+
+ /* set up pointers */
+ for ( count = 1; count <= num_subrs; count++ )
+ {
+ FT_ULong len;
+
+
+ len = offsets[count] - offsets[count - 1];
+ subr->code[count] = subr->code[count - 1] + len;
+ }
+
+ /* decrypt subroutines, but only if lenIV >= 0 */
+ if ( lenIV >= 0 )
+ {
+ for ( count = 0; count < num_subrs; count++ )
+ {
+ FT_ULong len;
+
+
+ len = offsets[count + 1] - offsets[count];
+ psaux->t1_decrypt( subr->code[count], len, 4330 );
+ }
+ }
+
+ subr->num_subrs = num_subrs;
+ }
+
+ Exit:
+ FT_FREE( offsets );
+ return error;
+
+ Fail:
+ if ( face->subrs )
+ {
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ if ( face->subrs[n].code )
+ FT_FREE( face->subrs[n].code[0] );
+
+ FT_FREE( face->subrs[n].code );
+ }
+ FT_FREE( face->subrs );
+ }
+ goto Exit;
+ }
+
+
+ static void
+ cid_init_loader( CID_Loader* loader,
+ CID_Face face )
+ {
+ FT_UNUSED( face );
+
+ FT_MEM_ZERO( loader, sizeof ( *loader ) );
+ }
+
+
+ static void
+ cid_done_loader( CID_Loader* loader )
+ {
+ CID_Parser* parser = &loader->parser;
+
+
+ /* finalize parser */
+ cid_parser_done( parser );
+ }
+
+
+ static FT_Error
+ cid_hex_to_binary( FT_Byte* data,
+ FT_Long data_len,
+ FT_ULong offset,
+ CID_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Error error;
+
+ FT_Byte buffer[256];
+ FT_Byte *p, *plimit;
+ FT_Byte *d, *dlimit;
+ FT_Byte val;
+
+ FT_Bool upper_nibble, done;
+
+
+ if ( FT_STREAM_SEEK( offset ) )
+ goto Exit;
+
+ d = data;
+ dlimit = d + data_len;
+ p = buffer;
+ plimit = p;
+
+ upper_nibble = 1;
+ done = 0;
+
+ while ( d < dlimit )
+ {
+ if ( p >= plimit )
+ {
+ FT_ULong oldpos = FT_STREAM_POS();
+ FT_ULong size = stream->size - oldpos;
+
+
+ if ( size == 0 )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
+ goto Exit;
+ p = buffer;
+ plimit = p + FT_STREAM_POS() - oldpos;
+ }
+
+ if ( ft_isdigit( *p ) )
+ val = (FT_Byte)( *p - '0' );
+ else if ( *p >= 'a' && *p <= 'f' )
+ val = (FT_Byte)( *p - 'a' );
+ else if ( *p >= 'A' && *p <= 'F' )
+ val = (FT_Byte)( *p - 'A' + 10 );
+ else if ( *p == ' ' ||
+ *p == '\t' ||
+ *p == '\r' ||
+ *p == '\n' ||
+ *p == '\f' ||
+ *p == '\0' )
+ {
+ p++;
+ continue;
+ }
+ else if ( *p == '>' )
+ {
+ val = 0;
+ done = 1;
+ }
+ else
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ if ( upper_nibble )
+ *d = (FT_Byte)( val << 4 );
+ else
+ {
+ *d = (FT_Byte)( *d + val );
+ d++;
+ }
+
+ upper_nibble = (FT_Byte)( 1 - upper_nibble );
+
+ if ( done )
+ break;
+
+ p++;
+ }
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_open( CID_Face face,
+ FT_Int face_index )
+ {
+ CID_Loader loader;
+ CID_Parser* parser;
+ FT_Memory memory = face->root.memory;
+ FT_Error error;
+
+
+ cid_init_loader( &loader, face );
+
+ parser = &loader.parser;
+ error = cid_parser_new( parser, face->root.stream, face->root.memory,
+ (PSAux_Service)face->psaux );
+ if ( error )
+ goto Exit;
+
+ error = cid_parse_dict( face, &loader,
+ parser->postscript,
+ parser->postscript_len );
+ if ( error )
+ goto Exit;
+
+ if ( face_index < 0 )
+ goto Exit;
+
+ if ( FT_NEW( face->cid_stream ) )
+ goto Exit;
+
+ if ( parser->binary_length )
+ {
+ /* we must convert the data section from hexadecimal to binary */
+ if ( FT_ALLOC( face->binary_data, parser->binary_length ) ||
+ cid_hex_to_binary( face->binary_data, parser->binary_length,
+ parser->data_offset, face ) )
+ goto Exit;
+
+ FT_Stream_OpenMemory( face->cid_stream,
+ face->binary_data, parser->binary_length );
+ face->cid.data_offset = 0;
+ }
+ else
+ {
+ *face->cid_stream = *face->root.stream;
+ face->cid.data_offset = loader.parser.data_offset;
+ }
+
+ error = cid_read_subrs( face );
+
+ Exit:
+ cid_done_loader( &loader );
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
new file mode 100644
index 0000000000..523f7ee92b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* cidload.h */
+/* */
+/* CID-keyed Type1 font loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDLOAD_H__
+#define __CIDLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "cidparse.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct CID_Loader_
+ {
+ CID_Parser parser; /* parser used to read the stream */
+ FT_Int num_chars; /* number of characters in encoding */
+
+ } CID_Loader;
+
+
+ FT_LOCAL( FT_Long )
+ cid_get_offset( FT_Byte** start,
+ FT_Byte offsize );
+
+ FT_LOCAL( FT_Error )
+ cid_face_open( CID_Face face,
+ FT_Int face_index );
+
+
+FT_END_HEADER
+
+#endif /* __CIDLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
new file mode 100644
index 0000000000..7708600d1c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
@@ -0,0 +1,491 @@
+/***************************************************************************/
+/* */
+/* cidobjs.c */
+/* */
+/* CID objects manager (body). */
+/* */
+/* Copyright 1996-2006, 2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidgload.h"
+#include "cidload.h"
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/pshints.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidobjs
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ cid_slot_done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_slot_init( FT_GlyphSlot slot )
+ {
+ CID_Face face;
+ PSHinter_Service pshinter;
+
+
+ face = (CID_Face)slot->face;
+ pshinter = (PSHinter_Service)face->pshinter;
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T1_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t1_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ cid_size_get_globals_funcs( CID_Size size )
+ {
+ CID_Face face = (CID_Face)size->root.face;
+ PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cid_size_done( FT_Size cidsize ) /* CID_Size */
+ {
+ CID_Size size = (CID_Size)cidsize;
+
+
+ if ( cidsize->internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = cid_size_get_globals_funcs( size );
+ if ( funcs )
+ funcs->destroy( (PSH_Globals)cidsize->internal );
+
+ cidsize->internal = 0;
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_size_init( FT_Size cidsize ) /* CID_Size */
+ {
+ CID_Size size = (CID_Size)cidsize;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size );
+
+
+ if ( funcs )
+ {
+ PSH_Globals globals;
+ CID_Face face = (CID_Face)cidsize->face;
+ CID_FaceDict dict = face->cid.font_dicts + face->root.face_index;
+ PS_Private priv = &dict->private_dict;
+
+
+ error = funcs->create( cidsize->face->memory, priv, &globals );
+ if ( !error )
+ cidsize->internal = (FT_Size_Internal)(void*)globals;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ cid_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ FT_Request_Metrics( size->face, req );
+
+ funcs = cid_size_get_globals_funcs( (CID_Size)size );
+
+ if ( funcs )
+ funcs->set_scale( (PSH_Globals)size->internal,
+ size->metrics.x_scale,
+ size->metrics.y_scale,
+ 0, 0 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_face_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cid_face_done( FT_Face cidface ) /* CID_Face */
+ {
+ CID_Face face = (CID_Face)cidface;
+ FT_Memory memory;
+ CID_FaceInfo cid;
+ PS_FontInfo info;
+
+
+ if ( !face )
+ return;
+
+ cid = &face->cid;
+ info = &cid->font_info;
+ memory = cidface->memory;
+
+ /* release subrs */
+ if ( face->subrs )
+ {
+ FT_Int n;
+
+
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ CID_Subrs subr = face->subrs + n;
+
+
+ if ( subr->code )
+ {
+ FT_FREE( subr->code[0] );
+ FT_FREE( subr->code );
+ }
+ }
+
+ FT_FREE( face->subrs );
+ }
+
+ /* release FontInfo strings */
+ FT_FREE( info->version );
+ FT_FREE( info->notice );
+ FT_FREE( info->full_name );
+ FT_FREE( info->family_name );
+ FT_FREE( info->weight );
+
+ /* release font dictionaries */
+ FT_FREE( cid->font_dicts );
+ cid->num_dicts = 0;
+
+ /* release other strings */
+ FT_FREE( cid->cid_font_name );
+ FT_FREE( cid->registry );
+ FT_FREE( cid->ordering );
+
+ cidface->family_name = 0;
+ cidface->style_name = 0;
+
+ FT_FREE( face->binary_data );
+ FT_FREE( face->cid_stream );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_face_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given CID face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The source font stream. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The newly built face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_init( FT_Stream stream,
+ FT_Face cidface, /* CID_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ CID_Face face = (CID_Face)cidface;
+ FT_Error error;
+ PSAux_Service psaux;
+ PSHinter_Service pshinter;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+ FT_UNUSED( stream );
+
+
+ cidface->num_faces = 1;
+
+ psaux = (PSAux_Service)face->psaux;
+ if ( !psaux )
+ {
+ psaux = (PSAux_Service)FT_Get_Module_Interface(
+ FT_FACE_LIBRARY( face ), "psaux" );
+
+ if ( !psaux )
+ {
+ FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ face->psaux = psaux;
+ }
+
+ pshinter = (PSHinter_Service)face->pshinter;
+ if ( !pshinter )
+ {
+ pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+ FT_FACE_LIBRARY( face ), "pshinter" );
+
+ face->pshinter = pshinter;
+ }
+
+ FT_TRACE2(( "CID driver\n" ));
+
+ /* open the tokenizer; this will also check the font format */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ error = cid_face_open( face, face_index );
+ if ( error )
+ goto Exit;
+
+ /* if we just wanted to check the format, leave successfully now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* check the face index */
+ /* XXX: handle CID fonts with more than a single face */
+ if ( face_index != 0 )
+ {
+ FT_ERROR(( "cid_face_init: invalid face index\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* now load the font program into the face object */
+
+ /* initialize the face object fields */
+
+ /* set up root face fields */
+ {
+ CID_FaceInfo cid = &face->cid;
+ PS_FontInfo info = &cid->font_info;
+
+
+ cidface->num_glyphs = cid->cid_count;
+ cidface->num_charmaps = 0;
+
+ cidface->face_index = face_index;
+ cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
+ FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
+ FT_FACE_FLAG_HINTER; /* has native hinter */
+
+ if ( info->is_fixed_pitch )
+ cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* XXX: TODO: add kerning with .afm support */
+
+ /* get style name -- be careful, some broken fonts only */
+ /* have a /FontName dictionary entry! */
+ cidface->family_name = info->family_name;
+ /* assume "Regular" style if we don't know better */
+ cidface->style_name = (char *)"Regular";
+ if ( cidface->family_name )
+ {
+ char* full = info->full_name;
+ char* family = cidface->family_name;
+
+
+ if ( full )
+ {
+ while ( *full )
+ {
+ if ( *full == *family )
+ {
+ family++;
+ full++;
+ }
+ else
+ {
+ if ( *full == ' ' || *full == '-' )
+ full++;
+ else if ( *family == ' ' || *family == '-' )
+ family++;
+ else
+ {
+ if ( !*family )
+ cidface->style_name = full;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* do we have a `/FontName'? */
+ if ( cid->cid_font_name )
+ cidface->family_name = cid->cid_font_name;
+ }
+
+ /* compute style flags */
+ cidface->style_flags = 0;
+ if ( info->italic_angle )
+ cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
+ if ( info->weight )
+ {
+ if ( !ft_strcmp( info->weight, "Bold" ) ||
+ !ft_strcmp( info->weight, "Black" ) )
+ cidface->style_flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* no embedded bitmap support */
+ cidface->num_fixed_sizes = 0;
+ cidface->available_sizes = 0;
+
+ cidface->bbox.xMin = cid->font_bbox.xMin >> 16;
+ cidface->bbox.yMin = cid->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
+ cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ if ( !cidface->units_per_EM )
+ cidface->units_per_EM = 1000;
+
+ cidface->ascender = (FT_Short)( cidface->bbox.yMax );
+ cidface->descender = (FT_Short)( cidface->bbox.yMin );
+
+ cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
+ if ( cidface->height < cidface->ascender - cidface->descender )
+ cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
+
+ cidface->underline_position = (FT_Short)info->underline_position;
+ cidface->underline_thickness = (FT_Short)info->underline_thickness;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_driver_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given CID driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cid_driver_init( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_driver_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given CID driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target CID driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cid_driver_done( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
new file mode 100644
index 0000000000..53c4c392f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
@@ -0,0 +1,154 @@
+/***************************************************************************/
+/* */
+/* cidobjs.h */
+/* */
+/* CID objects manager (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDOBJS_H__
+#define __CIDOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* The following structures must be defined by the hinter */
+ typedef struct CID_Size_Hints_ CID_Size_Hints;
+ typedef struct CID_Glyph_Hints_ CID_Glyph_Hints;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 driver object. */
+ /* */
+ typedef struct CID_DriverRec_* CID_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_Size */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 size object. */
+ /* */
+ typedef struct CID_SizeRec_* CID_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 glyph slot object. */
+ /* */
+ typedef struct CID_GlyphSlotRec_* CID_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 character mapping object. */
+ /* */
+ /* <Note> */
+ /* The Type 1 format doesn't use a charmap but an encoding table. */
+ /* The driver is responsible for making up charmap objects */
+ /* corresponding to these tables. */
+ /* */
+ typedef struct CID_CharMapRec_* CID_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */
+ /* */
+ /*************************************************************************/
+
+
+ typedef struct CID_SizeRec_
+ {
+ FT_SizeRec root;
+ FT_Bool valid;
+
+ } CID_SizeRec;
+
+
+ typedef struct CID_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } CID_GlyphSlotRec;
+
+
+ FT_LOCAL( void )
+ cid_slot_done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ cid_slot_init( FT_GlyphSlot slot );
+
+
+ FT_LOCAL( void )
+ cid_size_done( FT_Size size ); /* CID_Size */
+
+ FT_LOCAL( FT_Error )
+ cid_size_init( FT_Size size ); /* CID_Size */
+
+ FT_LOCAL( FT_Error )
+ cid_size_request( FT_Size size, /* CID_Size */
+ FT_Size_Request req );
+
+ FT_LOCAL( FT_Error )
+ cid_face_init( FT_Stream stream,
+ FT_Face face, /* CID_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ cid_face_done( FT_Face face ); /* CID_Face */
+
+
+ FT_LOCAL( FT_Error )
+ cid_driver_init( FT_Module driver );
+
+ FT_LOCAL( void )
+ cid_driver_done( FT_Module driver );
+
+
+FT_END_HEADER
+
+#endif /* __CIDOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
new file mode 100644
index 0000000000..dccc4db7f8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
@@ -0,0 +1,225 @@
+/***************************************************************************/
+/* */
+/* cidparse.c */
+/* */
+/* CID-keyed Type1 parser (body). */
+/* */
+/* Copyright 1996-2007, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidparse.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidparse
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INPUT STREAM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_parser_new( CID_Parser* parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux )
+ {
+ FT_Error error;
+ FT_ULong base_offset, offset, ps_len;
+ FT_Byte *cur, *limit;
+ FT_Byte *arg1, *arg2;
+
+
+ FT_MEM_ZERO( parser, sizeof ( *parser ) );
+ psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+ parser->stream = stream;
+
+ base_offset = FT_STREAM_POS();
+
+ /* first of all, check the font format in the header */
+ if ( FT_FRAME_ENTER( 31 ) )
+ goto Exit;
+
+ if ( ft_strncmp( (char *)stream->cursor,
+ "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
+ {
+ FT_TRACE2(( " not a CID-keyed font\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ }
+
+ FT_FRAME_EXIT();
+ if ( error )
+ goto Exit;
+
+ Again:
+ /* now, read the rest of the file until we find */
+ /* `StartData' or `/sfnts' */
+ {
+ FT_Byte buffer[256 + 10];
+ FT_Long read_len = 256 + 10; /* same as signed FT_Stream->size */
+ FT_Byte* p = buffer;
+
+
+ for ( offset = FT_STREAM_POS(); ; offset += 256 )
+ {
+ FT_Long stream_len; /* same as signed FT_Stream->size */
+
+
+ stream_len = stream->size - FT_STREAM_POS();
+ if ( stream_len == 0 )
+ {
+ FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ read_len = FT_MIN( read_len, stream_len );
+ if ( FT_STREAM_READ( p, read_len ) )
+ goto Exit;
+
+ if ( read_len < 256 )
+ p[read_len] = '\0';
+
+ limit = p + read_len - 10;
+
+ for ( p = buffer; p < limit; p++ )
+ {
+ if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 )
+ {
+ /* save offset of binary data after `StartData' */
+ offset += (FT_ULong)( p - buffer + 10 );
+ goto Found;
+ }
+ else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
+ {
+ offset += (FT_ULong)( p - buffer + 7 );
+ goto Found;
+ }
+ }
+
+ FT_MEM_MOVE( buffer, p, 10 );
+ read_len = 256;
+ p = buffer + 10;
+ }
+ }
+
+ Found:
+ /* We have found the start of the binary data or the `/sfnts' token. */
+ /* Now rewind and extract the frame corresponding to this PostScript */
+ /* section. */
+
+ ps_len = offset - base_offset;
+ if ( FT_STREAM_SEEK( base_offset ) ||
+ FT_FRAME_EXTRACT( ps_len, parser->postscript ) )
+ goto Exit;
+
+ parser->data_offset = offset;
+ parser->postscript_len = ps_len;
+ parser->root.base = parser->postscript;
+ parser->root.cursor = parser->postscript;
+ parser->root.limit = parser->root.cursor + ps_len;
+ parser->num_dict = -1;
+
+ /* Finally, we check whether `StartData' or `/sfnts' was real -- */
+ /* it could be in a comment or string. We also get the arguments */
+ /* of `StartData' to find out whether the data is represented in */
+ /* binary or hex format. */
+
+ arg1 = parser->root.cursor;
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+ arg2 = parser->root.cursor;
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+
+ limit = parser->root.limit;
+ cur = parser->root.cursor;
+
+ while ( cur < limit )
+ {
+ if ( parser->root.error )
+ {
+ error = parser->root.error;
+ goto Exit;
+ }
+
+ if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+ {
+ if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
+ parser->binary_length = ft_atol( (const char *)arg2 );
+
+ limit = parser->root.limit;
+ cur = parser->root.cursor;
+ goto Exit;
+ }
+ else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+ {
+ FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+ arg1 = arg2;
+ arg2 = cur;
+ cur = parser->root.cursor;
+ }
+
+ /* we haven't found the correct `StartData'; go back and continue */
+ /* searching */
+ FT_FRAME_RELEASE( parser->postscript );
+ if ( !FT_STREAM_SEEK( offset ) )
+ goto Again;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cid_parser_done( CID_Parser* parser )
+ {
+ /* always free the private dictionary */
+ if ( parser->postscript )
+ {
+ FT_Stream stream = parser->stream;
+
+
+ FT_FRAME_RELEASE( parser->postscript );
+ }
+ parser->root.funcs.done( &parser->root );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
new file mode 100644
index 0000000000..46284d2380
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
@@ -0,0 +1,123 @@
+/***************************************************************************/
+/* */
+/* cidparse.h */
+/* */
+/* CID-keyed Type1 parser (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDPARSE_H__
+#define __CIDPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_Parser */
+ /* */
+ /* <Description> */
+ /* A CID_Parser is an object used to parse a Type 1 fonts very */
+ /* quickly. */
+ /* */
+ /* <Fields> */
+ /* root :: The root PS_ParserRec fields. */
+ /* */
+ /* stream :: The current input stream. */
+ /* */
+ /* postscript :: A pointer to the data to be parsed. */
+ /* */
+ /* postscript_len :: The length of the data to be parsed. */
+ /* */
+ /* data_offset :: The start position of the binary data (i.e., the */
+ /* end of the data to be parsed. */
+ /* */
+ /* binary_length :: The length of the data after the `StartData' */
+ /* command if the data format is hexadecimal. */
+ /* */
+ /* cid :: A structure which holds the information about */
+ /* the current font. */
+ /* */
+ /* num_dict :: The number of font dictionaries. */
+ /* */
+ typedef struct CID_Parser_
+ {
+ PS_ParserRec root;
+ FT_Stream stream;
+
+ FT_Byte* postscript;
+ FT_Long postscript_len;
+
+ FT_ULong data_offset;
+
+ FT_Long binary_length;
+
+ CID_FaceInfo cid;
+ FT_Int num_dict;
+
+ } CID_Parser;
+
+
+ FT_LOCAL( FT_Error )
+ cid_parser_new( CID_Parser* parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux );
+
+ FT_LOCAL( void )
+ cid_parser_done( CID_Parser* parser );
+
+
+ /*************************************************************************/
+ /* */
+ /* PARSING ROUTINES */
+ /* */
+ /*************************************************************************/
+
+#define cid_parser_skip_spaces( p ) \
+ (p)->root.funcs.skip_spaces( &(p)->root )
+#define cid_parser_skip_PS_token( p ) \
+ (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root )
+#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define cid_parser_to_coord_array( p, m, c ) \
+ (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define cid_parser_to_fixed_array( p, m, f, t ) \
+ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define cid_parser_to_token( p, t ) \
+ (p)->root.funcs.to_token( &(p)->root, t )
+#define cid_parser_to_token_array( p, t, m, c ) \
+ (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define cid_parser_load_field( p, f, o ) \
+ (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )
+#define cid_parser_load_field_table( p, f, o ) \
+ (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )
+
+
+FT_END_HEADER
+
+#endif /* __CIDPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
new file mode 100644
index 0000000000..37d251fb80
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
@@ -0,0 +1,236 @@
+/***************************************************************************/
+/* */
+/* cidriver.c */
+/* */
+/* CID driver interface (body). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidriver.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "ciderrs.h"
+
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ciddriver
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ cid_get_postscript_name( CID_Face face )
+ {
+ const char* result = face->cid.cid_font_name;
+
+
+ if ( result && result[0] == '/' )
+ result++;
+
+ return result;
+ }
+
+
+ static const FT_Service_PsFontNameRec cid_service_ps_name =
+ {
+ (FT_PsName_GetFunc) cid_get_postscript_name
+ };
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Error
+ cid_ps_get_font_info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ *afont_info = ((CID_Face)face)->cid.font_info;
+
+ return FT_Err_Ok;
+ }
+
+ static FT_Error
+ cid_ps_get_font_extra( FT_Face face,
+ PS_FontExtraRec* afont_extra )
+ {
+ *afont_extra = ((CID_Face)face)->font_extra;
+
+ return FT_Err_Ok;
+ }
+
+ static const FT_Service_PsInfoRec cid_service_ps_info =
+ {
+ (PS_GetFontInfoFunc) cid_ps_get_font_info,
+ (PS_GetFontExtraFunc) cid_ps_get_font_extra,
+ (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */
+ (PS_GetFontPrivateFunc)NULL, /* unsupported */
+ (PS_GetFontValueFunc) NULL /* not implemented */
+ };
+
+
+ /*
+ * CID INFO SERVICE
+ *
+ */
+ static FT_Error
+ cid_get_ros( CID_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement )
+ {
+ CID_FaceInfo cid = &face->cid;
+
+
+ if ( registry )
+ *registry = cid->registry;
+
+ if ( ordering )
+ *ordering = cid->ordering;
+
+ if ( supplement )
+ *supplement = cid->supplement;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ cid_get_is_cid( CID_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UNUSED( face );
+
+
+ if ( is_cid )
+ *is_cid = 1; /* cid driver is only used for CID keyed fonts */
+
+ return error;
+ }
+
+
+ static FT_Error
+ cid_get_cid_from_glyph_index( CID_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UNUSED( face );
+
+
+ if ( cid )
+ *cid = glyph_index; /* identity mapping */
+
+ return error;
+ }
+
+
+ static const FT_Service_CIDRec cid_service_cid_info =
+ {
+ (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,
+ (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid,
+ (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index
+ };
+
+
+ /*
+ * SERVICE LIST
+ *
+ */
+
+ static const FT_ServiceDescRec cid_services[] =
+ {
+ { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID },
+ { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
+ { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info },
+ { FT_SERVICE_ID_CID, &cid_service_cid_info },
+ { NULL, NULL }
+ };
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ cid_get_interface( FT_Module module,
+ const char* cid_interface )
+ {
+ FT_UNUSED( module );
+
+ return ft_service_list_lookup( cid_services, cid_interface );
+ }
+
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Driver_ClassRec t1cid_driver_class =
+ {
+ /* first of all, the FT_Module_Class fields */
+ {
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( FT_DriverRec ),
+ "t1cid", /* module name */
+ 0x10000L, /* version 1.0 of driver */
+ 0x20000L, /* requires FreeType 2.0 */
+
+ 0,
+
+ cid_driver_init,
+ cid_driver_done,
+ cid_get_interface
+ },
+
+ /* then the other font drivers fields */
+ sizeof ( CID_FaceRec ),
+ sizeof ( CID_SizeRec ),
+ sizeof ( CID_GlyphSlotRec ),
+
+ cid_face_init,
+ cid_face_done,
+
+ cid_size_init,
+ cid_size_done,
+ cid_slot_init,
+ cid_slot_done,
+
+ cid_slot_load_glyph,
+
+ 0, /* FT_Face_GetKerningFunc */
+ 0, /* FT_Face_AttachFunc */
+
+ 0, /* FT_Face_GetAdvancesFunc */
+
+ cid_size_request,
+ 0 /* FT_Size_SelectFunc */
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
new file mode 100644
index 0000000000..fe98bf34e9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/* */
+/* cidriver.h */
+/* */
+/* High-level CID driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDRIVER_H__
+#define __CIDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_CALLBACK_TABLE
+ const FT_Driver_ClassRec t1cid_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __CIDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
new file mode 100644
index 0000000000..904cb09cf4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* cidtoken.h */
+/* */
+/* CID token definitions (specification only). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CID_FaceInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_CID_INFO
+
+ T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 )
+ T1_FIELD_FIXED ( "CIDFontVersion", cid_version, 0 )
+ T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 )
+ T1_FIELD_STRING( "Registry", registry, 0 )
+ T1_FIELD_STRING( "Ordering", ordering, 0 )
+ T1_FIELD_NUM ( "Supplement", supplement, 0 )
+ T1_FIELD_NUM ( "UIDBase", uid_base, 0 )
+ T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 )
+ T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 )
+ T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 )
+ T1_FIELD_NUM ( "CIDCount", cid_count, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_INFO
+
+ T1_FIELD_STRING( "version", version, 0 )
+ T1_FIELD_STRING( "Notice", notice, 0 )
+ T1_FIELD_STRING( "FullName", full_name, 0 )
+ T1_FIELD_STRING( "FamilyName", family_name, 0 )
+ T1_FIELD_STRING( "Weight", weight, 0 )
+ T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 )
+ T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 )
+ T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontExtraRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA
+
+ T1_FIELD_NUM ( "FSType", fs_type, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CID_FaceDictRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+
+ T1_FIELD_NUM ( "PaintType", paint_type, 0 )
+ T1_FIELD_NUM ( "FontType", font_type, 0 )
+ T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 )
+ T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 )
+ T1_FIELD_NUM ( "SubrCount", num_subrs, 0 )
+ T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 )
+ T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_PrivateRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_PRIVATE
+
+ T1_FIELD_NUM ( "UniqueID", unique_id, 0 )
+ T1_FIELD_NUM ( "lenIV", lenIV, 0 )
+ T1_FIELD_NUM ( "LanguageGroup", language_group, 0 )
+ T1_FIELD_NUM ( "password", password, 0 )
+
+ T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 )
+ T1_FIELD_NUM ( "BlueShift", blue_shift, 0 )
+ T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 )
+
+ T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 )
+ T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 )
+ T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 )
+ T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
+
+ T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 )
+ T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 )
+ T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 )
+
+ T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 )
+ T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 )
+
+ T1_FIELD_BOOL ( "ForceBold", force_bold, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE FT_BBox
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BBOX
+
+ T1_FIELD_BBOX( "FontBBox", xMin, 0 )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
new file mode 100644
index 0000000000..fe755718c7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* type1cid.c */
+/* */
+/* FreeType OpenType driver component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "cidparse.c"
+#include "cidload.c"
+#include "cidobjs.c"
+#include "cidriver.c"
+#include "cidgload.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
new file mode 100644
index 0000000000..ce30bfd7ae
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CID module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1CID_DRIVER
+
+define TYPE1CID_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
new file mode 100644
index 0000000000..f362744612
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 CID driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# CID driver directory
+#
+CID_DIR := $(SRC_DIR)/cid
+
+
+CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR))
+
+
+# CID driver sources (i.e., C files)
+#
+CID_DRV_SRC := $(CID_DIR)/cidparse.c \
+ $(CID_DIR)/cidload.c \
+ $(CID_DIR)/cidriver.c \
+ $(CID_DIR)/cidgload.c \
+ $(CID_DIR)/cidobjs.c
+
+# CID driver headers
+#
+CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \
+ $(CID_DIR)/cidtoken.h \
+ $(CID_DIR)/ciderrs.h
+
+
+# CID driver object(s)
+#
+# CID_DRV_OBJ_M is used during `multi' builds
+# CID_DRV_OBJ_S is used during `single' builds
+#
+CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O
+
+# CID driver source file for single build
+#
+CID_DRV_SRC_S := $(CID_DIR)/type1cid.c
+
+
+# CID driver - single object
+#
+$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H)
+ $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S))
+
+
+# CID driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H)
+ $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CID_DRV_OBJ_S)
+DRV_OBJS_M += $(CID_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
new file mode 100644
index 0000000000..faeded9044
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
@@ -0,0 +1,31 @@
+# FreeType 2 src/psaux Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) psaux ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = psauxmod psobjs t1decode t1cmap
+ psconv afmparse
+ ;
+ }
+ else
+ {
+ _sources = psaux ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psaux Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
new file mode 100644
index 0000000000..9a1cd3d6c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
@@ -0,0 +1,964 @@
+/***************************************************************************/
+/* */
+/* afmparse.c */
+/* */
+/* AFM parser (body). */
+/* */
+/* Copyright 2006-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "afmparse.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+/***************************************************************************/
+/* */
+/* AFM_Stream */
+/* */
+/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */
+/* */
+/* */
+
+ enum
+ {
+ AFM_STREAM_STATUS_NORMAL,
+ AFM_STREAM_STATUS_EOC,
+ AFM_STREAM_STATUS_EOL,
+ AFM_STREAM_STATUS_EOF
+ };
+
+
+ typedef struct AFM_StreamRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+
+ FT_Int status;
+
+ } AFM_StreamRec;
+
+
+#ifndef EOF
+#define EOF -1
+#endif
+
+
+ /* this works because empty lines are ignored */
+#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' )
+
+#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' )
+#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' )
+
+ /* column separator; there is no `column' in the spec actually */
+#define AFM_IS_SEP( ch ) ( (ch) == ';' )
+
+#define AFM_GETC() \
+ ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
+ : EOF )
+
+#define AFM_STREAM_KEY_BEGIN( stream ) \
+ (char*)( (stream)->cursor - 1 )
+
+#define AFM_STREAM_KEY_LEN( stream, key ) \
+ ( (char*)(stream)->cursor - key - 1 )
+
+#define AFM_STATUS_EOC( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOC )
+
+#define AFM_STATUS_EOL( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOL )
+
+#define AFM_STATUS_EOF( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOF )
+
+
+ static int
+ afm_stream_skip_spaces( AFM_Stream stream )
+ {
+ int ch = 0; /* make stupid compiler happy */
+
+
+ if ( AFM_STATUS_EOC( stream ) )
+ return ';';
+
+ while ( 1 )
+ {
+ ch = AFM_GETC();
+ if ( !AFM_IS_SPACE( ch ) )
+ break;
+ }
+
+ if ( AFM_IS_NEWLINE( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOL;
+ else if ( AFM_IS_SEP( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOC;
+ else if ( AFM_IS_EOF( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOF;
+
+ return ch;
+ }
+
+
+ /* read a key or value in current column */
+ static char*
+ afm_stream_read_one( AFM_Stream stream )
+ {
+ char* str;
+
+
+ afm_stream_skip_spaces( stream );
+ if ( AFM_STATUS_EOC( stream ) )
+ return NULL;
+
+ str = AFM_STREAM_KEY_BEGIN( stream );
+
+ while ( 1 )
+ {
+ int ch = AFM_GETC();
+
+
+ if ( AFM_IS_SPACE( ch ) )
+ break;
+ else if ( AFM_IS_NEWLINE( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOL;
+ break;
+ }
+ else if ( AFM_IS_SEP( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOC;
+ break;
+ }
+ else if ( AFM_IS_EOF( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOF;
+ break;
+ }
+ }
+
+ return str;
+ }
+
+
+ /* read a string (i.e., read to EOL) */
+ static char*
+ afm_stream_read_string( AFM_Stream stream )
+ {
+ char* str;
+
+
+ afm_stream_skip_spaces( stream );
+ if ( AFM_STATUS_EOL( stream ) )
+ return NULL;
+
+ str = AFM_STREAM_KEY_BEGIN( stream );
+
+ /* scan to eol */
+ while ( 1 )
+ {
+ int ch = AFM_GETC();
+
+
+ if ( AFM_IS_NEWLINE( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOL;
+ break;
+ }
+ else if ( AFM_IS_EOF( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOF;
+ break;
+ }
+ }
+
+ return str;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AFM_Parser */
+ /* */
+ /* */
+
+ /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
+ typedef enum AFM_Token_
+ {
+ AFM_TOKEN_ASCENDER,
+ AFM_TOKEN_AXISLABEL,
+ AFM_TOKEN_AXISTYPE,
+ AFM_TOKEN_B,
+ AFM_TOKEN_BLENDAXISTYPES,
+ AFM_TOKEN_BLENDDESIGNMAP,
+ AFM_TOKEN_BLENDDESIGNPOSITIONS,
+ AFM_TOKEN_C,
+ AFM_TOKEN_CC,
+ AFM_TOKEN_CH,
+ AFM_TOKEN_CAPHEIGHT,
+ AFM_TOKEN_CHARWIDTH,
+ AFM_TOKEN_CHARACTERSET,
+ AFM_TOKEN_CHARACTERS,
+ AFM_TOKEN_DESCENDER,
+ AFM_TOKEN_ENCODINGSCHEME,
+ AFM_TOKEN_ENDAXIS,
+ AFM_TOKEN_ENDCHARMETRICS,
+ AFM_TOKEN_ENDCOMPOSITES,
+ AFM_TOKEN_ENDDIRECTION,
+ AFM_TOKEN_ENDFONTMETRICS,
+ AFM_TOKEN_ENDKERNDATA,
+ AFM_TOKEN_ENDKERNPAIRS,
+ AFM_TOKEN_ENDTRACKKERN,
+ AFM_TOKEN_ESCCHAR,
+ AFM_TOKEN_FAMILYNAME,
+ AFM_TOKEN_FONTBBOX,
+ AFM_TOKEN_FONTNAME,
+ AFM_TOKEN_FULLNAME,
+ AFM_TOKEN_ISBASEFONT,
+ AFM_TOKEN_ISCIDFONT,
+ AFM_TOKEN_ISFIXEDPITCH,
+ AFM_TOKEN_ISFIXEDV,
+ AFM_TOKEN_ITALICANGLE,
+ AFM_TOKEN_KP,
+ AFM_TOKEN_KPH,
+ AFM_TOKEN_KPX,
+ AFM_TOKEN_KPY,
+ AFM_TOKEN_L,
+ AFM_TOKEN_MAPPINGSCHEME,
+ AFM_TOKEN_METRICSSETS,
+ AFM_TOKEN_N,
+ AFM_TOKEN_NOTICE,
+ AFM_TOKEN_PCC,
+ AFM_TOKEN_STARTAXIS,
+ AFM_TOKEN_STARTCHARMETRICS,
+ AFM_TOKEN_STARTCOMPOSITES,
+ AFM_TOKEN_STARTDIRECTION,
+ AFM_TOKEN_STARTFONTMETRICS,
+ AFM_TOKEN_STARTKERNDATA,
+ AFM_TOKEN_STARTKERNPAIRS,
+ AFM_TOKEN_STARTKERNPAIRS0,
+ AFM_TOKEN_STARTKERNPAIRS1,
+ AFM_TOKEN_STARTTRACKKERN,
+ AFM_TOKEN_STDHW,
+ AFM_TOKEN_STDVW,
+ AFM_TOKEN_TRACKKERN,
+ AFM_TOKEN_UNDERLINEPOSITION,
+ AFM_TOKEN_UNDERLINETHICKNESS,
+ AFM_TOKEN_VV,
+ AFM_TOKEN_VVECTOR,
+ AFM_TOKEN_VERSION,
+ AFM_TOKEN_W,
+ AFM_TOKEN_W0,
+ AFM_TOKEN_W0X,
+ AFM_TOKEN_W0Y,
+ AFM_TOKEN_W1,
+ AFM_TOKEN_W1X,
+ AFM_TOKEN_W1Y,
+ AFM_TOKEN_WX,
+ AFM_TOKEN_WY,
+ AFM_TOKEN_WEIGHT,
+ AFM_TOKEN_WEIGHTVECTOR,
+ AFM_TOKEN_XHEIGHT,
+ N_AFM_TOKENS,
+ AFM_TOKEN_UNKNOWN
+
+ } AFM_Token;
+
+
+ static const char* const afm_key_table[N_AFM_TOKENS] =
+ {
+ "Ascender",
+ "AxisLabel",
+ "AxisType",
+ "B",
+ "BlendAxisTypes",
+ "BlendDesignMap",
+ "BlendDesignPositions",
+ "C",
+ "CC",
+ "CH",
+ "CapHeight",
+ "CharWidth",
+ "CharacterSet",
+ "Characters",
+ "Descender",
+ "EncodingScheme",
+ "EndAxis",
+ "EndCharMetrics",
+ "EndComposites",
+ "EndDirection",
+ "EndFontMetrics",
+ "EndKernData",
+ "EndKernPairs",
+ "EndTrackKern",
+ "EscChar",
+ "FamilyName",
+ "FontBBox",
+ "FontName",
+ "FullName",
+ "IsBaseFont",
+ "IsCIDFont",
+ "IsFixedPitch",
+ "IsFixedV",
+ "ItalicAngle",
+ "KP",
+ "KPH",
+ "KPX",
+ "KPY",
+ "L",
+ "MappingScheme",
+ "MetricsSets",
+ "N",
+ "Notice",
+ "PCC",
+ "StartAxis",
+ "StartCharMetrics",
+ "StartComposites",
+ "StartDirection",
+ "StartFontMetrics",
+ "StartKernData",
+ "StartKernPairs",
+ "StartKernPairs0",
+ "StartKernPairs1",
+ "StartTrackKern",
+ "StdHW",
+ "StdVW",
+ "TrackKern",
+ "UnderlinePosition",
+ "UnderlineThickness",
+ "VV",
+ "VVector",
+ "Version",
+ "W",
+ "W0",
+ "W0X",
+ "W0Y",
+ "W1",
+ "W1X",
+ "W1Y",
+ "WX",
+ "WY",
+ "Weight",
+ "WeightVector",
+ "XHeight"
+ };
+
+
+ /*
+ * `afm_parser_read_vals' and `afm_parser_next_key' provide
+ * high-level operations to an AFM_Stream. The rest of the
+ * parser functions should use them without accessing the
+ * AFM_Stream directly.
+ */
+
+ FT_LOCAL_DEF( FT_Int )
+ afm_parser_read_vals( AFM_Parser parser,
+ AFM_Value vals,
+ FT_UInt n )
+ {
+ AFM_Stream stream = parser->stream;
+ char* str;
+ FT_UInt i;
+
+
+ if ( n > AFM_MAX_ARGUMENTS )
+ return 0;
+
+ for ( i = 0; i < n; i++ )
+ {
+ FT_Offset len;
+ AFM_Value val = vals + i;
+
+
+ if ( val->type == AFM_VALUE_TYPE_STRING )
+ str = afm_stream_read_string( stream );
+ else
+ str = afm_stream_read_one( stream );
+
+ if ( !str )
+ break;
+
+ len = AFM_STREAM_KEY_LEN( stream, str );
+
+ switch ( val->type )
+ {
+ case AFM_VALUE_TYPE_STRING:
+ case AFM_VALUE_TYPE_NAME:
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( !FT_QALLOC( val->u.s, len + 1 ) )
+ {
+ ft_memcpy( val->u.s, str, len );
+ val->u.s[len] = '\0';
+ }
+ }
+ break;
+
+ case AFM_VALUE_TYPE_FIXED:
+ val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
+ (FT_Byte*)str + len, 0 );
+ break;
+
+ case AFM_VALUE_TYPE_INTEGER:
+ val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
+ (FT_Byte*)str + len );
+ break;
+
+ case AFM_VALUE_TYPE_BOOL:
+ val->u.b = FT_BOOL( len == 4 &&
+ !ft_strncmp( str, "true", 4 ) );
+ break;
+
+ case AFM_VALUE_TYPE_INDEX:
+ if ( parser->get_index )
+ val->u.i = parser->get_index( str, len, parser->user_data );
+ else
+ val->u.i = 0;
+ break;
+ }
+ }
+
+ return i;
+ }
+
+
+ FT_LOCAL_DEF( char* )
+ afm_parser_next_key( AFM_Parser parser,
+ FT_Bool line,
+ FT_Offset* len )
+ {
+ AFM_Stream stream = parser->stream;
+ char* key = 0; /* make stupid compiler happy */
+
+
+ if ( line )
+ {
+ while ( 1 )
+ {
+ /* skip current line */
+ if ( !AFM_STATUS_EOL( stream ) )
+ afm_stream_read_string( stream );
+
+ stream->status = AFM_STREAM_STATUS_NORMAL;
+ key = afm_stream_read_one( stream );
+
+ /* skip empty line */
+ if ( !key &&
+ !AFM_STATUS_EOF( stream ) &&
+ AFM_STATUS_EOL( stream ) )
+ continue;
+
+ break;
+ }
+ }
+ else
+ {
+ while ( 1 )
+ {
+ /* skip current column */
+ while ( !AFM_STATUS_EOC( stream ) )
+ afm_stream_read_one( stream );
+
+ stream->status = AFM_STREAM_STATUS_NORMAL;
+ key = afm_stream_read_one( stream );
+
+ /* skip empty column */
+ if ( !key &&
+ !AFM_STATUS_EOF( stream ) &&
+ AFM_STATUS_EOC( stream ) )
+ continue;
+
+ break;
+ }
+ }
+
+ if ( len )
+ *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
+ : 0;
+
+ return key;
+ }
+
+
+ static AFM_Token
+ afm_tokenize( const char* key,
+ FT_Offset len )
+ {
+ int n;
+
+
+ for ( n = 0; n < N_AFM_TOKENS; n++ )
+ {
+ if ( *( afm_key_table[n] ) == *key )
+ {
+ for ( ; n < N_AFM_TOKENS; n++ )
+ {
+ if ( *( afm_key_table[n] ) != *key )
+ return AFM_TOKEN_UNKNOWN;
+
+ if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
+ return (AFM_Token) n;
+ }
+ }
+ }
+
+ return AFM_TOKEN_UNKNOWN;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_init( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit )
+ {
+ AFM_Stream stream = NULL;
+ FT_Error error;
+
+
+ if ( FT_NEW( stream ) )
+ return error;
+
+ stream->cursor = stream->base = base;
+ stream->limit = limit;
+
+ /* don't skip the first line during the first call */
+ stream->status = AFM_STREAM_STATUS_EOL;
+
+ parser->memory = memory;
+ parser->stream = stream;
+ parser->FontInfo = NULL;
+ parser->get_index = NULL;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL( void )
+ afm_parser_done( AFM_Parser parser )
+ {
+ FT_Memory memory = parser->memory;
+
+
+ FT_FREE( parser->stream );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_read_int( AFM_Parser parser,
+ FT_Int* aint )
+ {
+ AFM_ValueRec val;
+
+
+ val.type = AFM_VALUE_TYPE_INTEGER;
+
+ if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
+ {
+ *aint = val.u.i;
+
+ return FT_Err_Ok;
+ }
+ else
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parse_track_kern( AFM_Parser parser )
+ {
+ AFM_FontInfo fi = parser->FontInfo;
+ AFM_TrackKern tk;
+ char* key;
+ FT_Offset len;
+ int n = -1;
+
+
+ if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
+ goto Fail;
+
+ if ( fi->NumTrackKern )
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
+ return error;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_ValueRec shared_vals[5];
+
+
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_TRACKKERN:
+ n++;
+
+ if ( n >= fi->NumTrackKern )
+ goto Fail;
+
+ tk = fi->TrackKerns + n;
+
+ shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
+ shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
+ goto Fail;
+
+ tk->degree = shared_vals[0].u.i;
+ tk->min_ptsize = shared_vals[1].u.f;
+ tk->min_kern = shared_vals[2].u.f;
+ tk->max_ptsize = shared_vals[3].u.f;
+ tk->max_kern = shared_vals[4].u.f;
+
+ break;
+
+ case AFM_TOKEN_ENDTRACKKERN:
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ fi->NumTrackKern = n + 1;
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+#undef KERN_INDEX
+#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 )
+
+
+ /* compare two kerning pairs */
+ FT_CALLBACK_DEF( int )
+ afm_compare_kern_pairs( const void* a,
+ const void* b )
+ {
+ AFM_KernPair kp1 = (AFM_KernPair)a;
+ AFM_KernPair kp2 = (AFM_KernPair)b;
+
+ FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 );
+ FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 );
+
+
+ if ( index1 > index2 )
+ return 1;
+ else if ( index1 < index2 )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ static FT_Error
+ afm_parse_kern_pairs( AFM_Parser parser )
+ {
+ AFM_FontInfo fi = parser->FontInfo;
+ AFM_KernPair kp;
+ char* key;
+ FT_Offset len;
+ int n = -1;
+
+
+ if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
+ goto Fail;
+
+ if ( fi->NumKernPair )
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+ return error;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_Token token = afm_tokenize( key, len );
+
+
+ switch ( token )
+ {
+ case AFM_TOKEN_KP:
+ case AFM_TOKEN_KPX:
+ case AFM_TOKEN_KPY:
+ {
+ FT_Int r;
+ AFM_ValueRec shared_vals[4];
+
+
+ n++;
+
+ if ( n >= fi->NumKernPair )
+ goto Fail;
+
+ kp = fi->KernPairs + n;
+
+ shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
+ shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
+ shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
+ shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
+ r = afm_parser_read_vals( parser, shared_vals, 4 );
+ if ( r < 3 )
+ goto Fail;
+
+ kp->index1 = shared_vals[0].u.i;
+ kp->index2 = shared_vals[1].u.i;
+ if ( token == AFM_TOKEN_KPY )
+ {
+ kp->x = 0;
+ kp->y = shared_vals[2].u.i;
+ }
+ else
+ {
+ kp->x = shared_vals[2].u.i;
+ kp->y = ( token == AFM_TOKEN_KP && r == 4 )
+ ? shared_vals[3].u.i : 0;
+ }
+ }
+ break;
+
+ case AFM_TOKEN_ENDKERNPAIRS:
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ fi->NumKernPair = n + 1;
+ ft_qsort( fi->KernPairs, fi->NumKernPair,
+ sizeof ( AFM_KernPairRec ),
+ afm_compare_kern_pairs );
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parse_kern_data( AFM_Parser parser )
+ {
+ FT_Error error;
+ char* key;
+ FT_Offset len;
+
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_STARTTRACKKERN:
+ error = afm_parse_track_kern( parser );
+ if ( error )
+ return error;
+ break;
+
+ case AFM_TOKEN_STARTKERNPAIRS:
+ case AFM_TOKEN_STARTKERNPAIRS0:
+ error = afm_parse_kern_pairs( parser );
+ if ( error )
+ return error;
+ break;
+
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parser_skip_section( AFM_Parser parser,
+ FT_UInt n,
+ AFM_Token end_section )
+ {
+ char* key;
+ FT_Offset len;
+
+
+ while ( n-- > 0 )
+ {
+ key = afm_parser_next_key( parser, 1, NULL );
+ if ( !key )
+ goto Fail;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_Token token = afm_tokenize( key, len );
+
+
+ if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
+ return FT_Err_Ok;
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_parse( AFM_Parser parser )
+ {
+ FT_Memory memory = parser->memory;
+ AFM_FontInfo fi = parser->FontInfo;
+ FT_Error error = FT_ERR( Syntax_Error );
+ char* key;
+ FT_Offset len;
+ FT_Int metrics_sets = 0;
+
+
+ if ( !fi )
+ return FT_THROW( Invalid_Argument );
+
+ key = afm_parser_next_key( parser, 1, &len );
+ if ( !key || len != 16 ||
+ ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_ValueRec shared_vals[4];
+
+
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_METRICSSETS:
+ if ( afm_parser_read_int( parser, &metrics_sets ) )
+ goto Fail;
+
+ if ( metrics_sets != 0 && metrics_sets != 2 )
+ {
+ error = FT_THROW( Unimplemented_Feature );
+
+ goto Fail;
+ }
+ break;
+
+ case AFM_TOKEN_ISCIDFONT:
+ shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->IsCIDFont = shared_vals[0].u.b;
+ break;
+
+ case AFM_TOKEN_FONTBBOX:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
+ goto Fail;
+
+ fi->FontBBox.xMin = shared_vals[0].u.f;
+ fi->FontBBox.yMin = shared_vals[1].u.f;
+ fi->FontBBox.xMax = shared_vals[2].u.f;
+ fi->FontBBox.yMax = shared_vals[3].u.f;
+ break;
+
+ case AFM_TOKEN_ASCENDER:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->Ascender = shared_vals[0].u.f;
+ break;
+
+ case AFM_TOKEN_DESCENDER:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->Descender = shared_vals[0].u.f;
+ break;
+
+ case AFM_TOKEN_STARTCHARMETRICS:
+ {
+ FT_Int n = 0;
+
+
+ if ( afm_parser_read_int( parser, &n ) )
+ goto Fail;
+
+ error = afm_parser_skip_section( parser, n,
+ AFM_TOKEN_ENDCHARMETRICS );
+ if ( error )
+ return error;
+ }
+ break;
+
+ case AFM_TOKEN_STARTKERNDATA:
+ error = afm_parse_kern_data( parser );
+ if ( error )
+ goto Fail;
+ /* fall through since we only support kern data */
+
+ case AFM_TOKEN_ENDFONTMETRICS:
+ return FT_Err_Ok;
+
+ default:
+ break;
+ }
+ }
+
+ Fail:
+ FT_FREE( fi->TrackKerns );
+ fi->NumTrackKern = 0;
+
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+
+ fi->IsCIDFont = 0;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
new file mode 100644
index 0000000000..ffa60d4aab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* afmparse.h */
+/* */
+/* AFM parser (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __AFMPARSE_H__
+#define __AFMPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ afm_parser_init( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit );
+
+
+ FT_LOCAL( void )
+ afm_parser_done( AFM_Parser parser );
+
+
+ FT_LOCAL( FT_Error )
+ afm_parser_parse( AFM_Parser parser );
+
+
+ enum AFM_ValueType_
+ {
+ AFM_VALUE_TYPE_STRING,
+ AFM_VALUE_TYPE_NAME,
+ AFM_VALUE_TYPE_FIXED, /* real number */
+ AFM_VALUE_TYPE_INTEGER,
+ AFM_VALUE_TYPE_BOOL,
+ AFM_VALUE_TYPE_INDEX /* glyph index */
+ };
+
+
+ typedef struct AFM_ValueRec_
+ {
+ enum AFM_ValueType_ type;
+ union
+ {
+ char* s;
+ FT_Fixed f;
+ FT_Int i;
+ FT_Bool b;
+
+ } u;
+
+ } AFM_ValueRec, *AFM_Value;
+
+#define AFM_MAX_ARGUMENTS 5
+
+ FT_LOCAL( FT_Int )
+ afm_parser_read_vals( AFM_Parser parser,
+ AFM_Value vals,
+ FT_UInt n );
+
+ /* read the next key from the next line or column */
+ FT_LOCAL( char* )
+ afm_parser_next_key( AFM_Parser parser,
+ FT_Bool line,
+ FT_Offset* len );
+
+FT_END_HEADER
+
+#endif /* __AFMPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
new file mode 100644
index 0000000000..59aad0483f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
@@ -0,0 +1,38 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* psaux.c */
+/* */
+/* FreeType auxiliary PostScript driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "psobjs.c"
+#include "psauxmod.c"
+#include "t1decode.c"
+#include "t1cmap.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.c"
+#endif
+
+#include "psconv.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
new file mode 100644
index 0000000000..42bf6f5199
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSaux module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSAUX_MODULE
+
+define PSAUX_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
new file mode 100644
index 0000000000..257f17a32d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psauxerr.h */
+/* */
+/* PS auxiliary module error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PS auxiliary module error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSAUXERR_H__
+#define __PSAUXERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSaux_Err_
+#define FT_ERR_BASE FT_Mod_Err_PSaux
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSAUXERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
new file mode 100644
index 0000000000..f8d886651e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
@@ -0,0 +1,139 @@
+/***************************************************************************/
+/* */
+/* psauxmod.c */
+/* */
+/* FreeType auxiliary PostScript module implementation (body). */
+/* */
+/* Copyright 2000-2001, 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "psauxmod.h"
+#include "psobjs.h"
+#include "t1decode.h"
+#include "t1cmap.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.h"
+#endif
+
+
+ FT_CALLBACK_TABLE_DEF
+ const PS_Table_FuncsRec ps_table_funcs =
+ {
+ ps_table_new,
+ ps_table_done,
+ ps_table_add,
+ ps_table_release
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const PS_Parser_FuncsRec ps_parser_funcs =
+ {
+ ps_parser_init,
+ ps_parser_done,
+ ps_parser_skip_spaces,
+ ps_parser_skip_PS_token,
+ ps_parser_to_int,
+ ps_parser_to_fixed,
+ ps_parser_to_bytes,
+ ps_parser_to_coord_array,
+ ps_parser_to_fixed_array,
+ ps_parser_to_token,
+ ps_parser_to_token_array,
+ ps_parser_load_field,
+ ps_parser_load_field_table
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_Builder_FuncsRec t1_builder_funcs =
+ {
+ t1_builder_init,
+ t1_builder_done,
+ t1_builder_check_points,
+ t1_builder_add_point,
+ t1_builder_add_point1,
+ t1_builder_add_contour,
+ t1_builder_start_point,
+ t1_builder_close_contour
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_Decoder_FuncsRec t1_decoder_funcs =
+ {
+ t1_decoder_init,
+ t1_decoder_done,
+ t1_decoder_parse_charstrings
+ };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ FT_CALLBACK_TABLE_DEF
+ const AFM_Parser_FuncsRec afm_parser_funcs =
+ {
+ afm_parser_init,
+ afm_parser_done,
+ afm_parser_parse
+ };
+#endif
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_CMap_ClassesRec t1_cmap_classes =
+ {
+ &t1_cmap_standard_class_rec,
+ &t1_cmap_expert_class_rec,
+ &t1_cmap_custom_class_rec,
+ &t1_cmap_unicode_class_rec
+ };
+
+
+ static
+ const PSAux_Interface psaux_interface =
+ {
+ &ps_table_funcs,
+ &ps_parser_funcs,
+ &t1_builder_funcs,
+ &t1_decoder_funcs,
+ t1_decrypt,
+
+ (const T1_CMap_ClassesRec*) &t1_cmap_classes,
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ &afm_parser_funcs,
+#else
+ 0,
+#endif
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Module_Class psaux_module_class =
+ {
+ 0,
+ sizeof ( FT_ModuleRec ),
+ "psaux",
+ 0x20000L,
+ 0x20000L,
+
+ &psaux_interface, /* module-specific interface */
+
+ (FT_Module_Constructor)0,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
new file mode 100644
index 0000000000..cf677ed8b4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psauxmod.h */
+/* */
+/* FreeType auxiliary PostScript module implementation (specification). */
+/* */
+/* Copyright 2000-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSAUXMOD_H__
+#define __PSAUXMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __PSAUXMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
new file mode 100644
index 0000000000..22e2f7d9ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/* */
+/* psconv.c */
+/* */
+/* Some convenience conversions (body). */
+/* */
+/* Copyright 2006, 2008, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psconv.h"
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_psconv
+
+
+ /* The following array is used by various functions to quickly convert */
+ /* digits (both decimal and non-decimal) into numbers. */
+
+#if 'A' == 65
+ /* ASCII */
+
+ static const FT_Char ft_char_table[128] =
+ {
+ /* 0x00 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ };
+
+ /* no character >= 0x80 can represent a valid number */
+#define OP >=
+
+#endif /* 'A' == 65 */
+
+#if 'A' == 193
+ /* EBCDIC */
+
+ static const FT_Char ft_char_table[128] =
+ {
+ /* 0x80 */
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+ -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+ -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+ -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+ -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ };
+
+ /* no character < 0x80 can represent a valid number */
+#define OP <
+
+#endif /* 'A' == 193 */
+
+
+ FT_LOCAL_DEF( FT_Long )
+ PS_Conv_Strtol( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long base )
+ {
+ FT_Byte* p = *cursor;
+
+ FT_Long num = 0;
+ FT_Bool sign = 0;
+ FT_Bool have_overflow = 0;
+
+ FT_Long num_limit;
+ FT_Char c_limit;
+
+
+ if ( p >= limit )
+ goto Bad;
+
+ if ( base < 2 || base > 36 )
+ {
+ FT_TRACE4(( "!!!INVALID BASE:!!!" ));
+ return 0;
+ }
+
+ if ( *p == '-' || *p == '+' )
+ {
+ sign = FT_BOOL( *p == '-' );
+
+ p++;
+ if ( p == limit )
+ goto Bad;
+ }
+
+ num_limit = 0x7FFFFFFFL / base;
+ c_limit = (FT_Char)( 0x7FFFFFFFL % base );
+
+ for ( ; p < limit; p++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( c < 0 || c >= base )
+ break;
+
+ if ( num > num_limit || ( num == num_limit && c > c_limit ) )
+ have_overflow = 1;
+ else
+ num = num * base + c;
+ }
+
+ *cursor = p;
+
+ if ( have_overflow )
+ {
+ num = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ }
+
+ if ( sign )
+ num = -num;
+
+ return num;
+
+ Bad:
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ return 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Long )
+ PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit )
+
+ {
+ FT_Byte* p = *cursor;
+ FT_Byte* curp;
+
+ FT_Long num;
+
+
+ curp = p;
+ num = PS_Conv_Strtol( &p, limit, 10 );
+
+ if ( p == curp )
+ return 0;
+
+ if ( p < limit && *p == '#' )
+ {
+ p++;
+
+ curp = p;
+ num = PS_Conv_Strtol( &p, limit, num );
+
+ if ( p == curp )
+ return 0;
+ }
+
+ *cursor = p;
+
+ return num;
+ }
+
+
+ FT_LOCAL_DEF( FT_Fixed )
+ PS_Conv_ToFixed( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long power_ten )
+ {
+ FT_Byte* p = *cursor;
+ FT_Byte* curp;
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // We must use 64-bit integer to avoid overflow. If there is some 64-bit integer support.
+ // Since some platform doesn't support 64-bit integer, then use integer instead.
+#if defined(FT_INT64)
+ FT_INT64 integral = 0;
+ FT_INT64 decimal = 0;
+#else
+ FT_Long integral;
+ FT_Long decimal = 0;
+ FT_Int temp0 = 65536;
+ FT_Int temp1 = power_ten;
+#endif
+ FT_Long divider = 1;
+
+ FT_Bool sign = 0;
+ FT_Bool have_overflow = 0;
+ FT_Bool have_underflow = 0;
+
+ if ( p >= limit )
+ goto Bad;
+
+ if ( *p == '-' || *p == '+' )
+ {
+ sign = FT_BOOL( *p == '-' );
+
+ p++;
+ if ( p == limit )
+ goto Bad;
+ }
+
+ /* read the integer part */
+ if ( *p != '.' )
+ {
+ curp = p;
+
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+ // Do accurate overflow check if FT_INT64 supported, otherwise vague check.
+#if defined(FT_INT64)
+ integral = ((FT_INT64)PS_Conv_ToInt( &p, limit )) << 16;
+#else
+ // We use 'power_ten' and 2^16 to compute the coefficient.
+ //while ( temp1 > 0 ) { temp0 *= 10; temp1 --; }
+ //while ( temp1 < 0 ) { temp0 /= 10; temp1 ++; }
+
+ integral = PS_Conv_ToInt( &p, limit );
+ if ( p == curp )
+ return 0;
+ if ( integral > 0x7FFF )
+ have_overflow = 1;
+ else
+ integral = integral << 16;
+#endif
+ }
+
+ /* read the decimal part */
+ if ( p < limit && *p == '.' )
+ {
+ p++;
+
+ for ( ; p < limit; p++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( c < 0 || c >= 10 )
+ break;
+
+ if ( decimal < 0xCCCCCCCL )
+ {
+ decimal = decimal * 10 + c;
+
+ if ( !integral && power_ten > 0 )
+ power_ten--;
+ else
+ divider *= 10;
+ }
+ }
+ }
+
+ /* read exponent, if any */
+ if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )
+ {
+ FT_Long exponent;
+
+
+ p++;
+
+ curp = p;
+ exponent = PS_Conv_ToInt( &p, limit );
+
+ if ( curp == p )
+ return 0;
+
+ /* arbitrarily limit exponent */
+ if ( exponent > 1000 )
+ have_overflow = 1;
+ else if ( exponent < -1000 )
+ have_underflow = 1;
+ else
+ power_ten += exponent;
+ }
+
+ *cursor = p;
+
+ if ( !integral && !decimal )
+ return 0;
+
+ if ( have_overflow )
+ goto Overflow;
+ if ( have_underflow )
+ goto Underflow;
+
+ while ( power_ten > 0 )
+ {
+ if ( integral >= 0xCCCCCCCL )
+ goto Overflow;
+ integral *= 10;
+
+ if ( decimal >= 0xCCCCCCCL )
+ {
+ if ( divider == 1 )
+ goto Overflow;
+ divider /= 10;
+ }
+ else
+ decimal *= 10;
+
+ power_ten--;
+ }
+
+ while ( power_ten < 0 )
+ {
+ integral /= 10;
+ if ( divider < 0xCCCCCCCL )
+ divider *= 10;
+ else
+ decimal /= 10;
+
+ if ( !integral && !decimal )
+ goto Underflow;
+
+ power_ten++;
+ }
+
+// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+ // Do accurate overflow check if FT_INT64 supported, otherwise ignore the check at this moment.
+ // Since there is also a check using divider < 10000000L.
+#if defined(FT_INT64)
+ if ( decimal ) {
+ integral += FT_DivFix( (FT_Long)decimal, divider );
+ }
+ if ( integral > 2147483647) integral = 2147483647;
+#else
+ if ( decimal ) {
+ integral += FT_DivFix( decimal, divider );
+ }
+#endif
+
+
+ Exit:
+ if ( sign )
+ integral = -integral;
+
+ return (FT_Long)integral;
+
+ Bad:
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ return 0;
+
+ Overflow:
+ integral = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ goto Exit;
+
+ Underflow:
+ FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+ return 0;
+ }
+
+
+#if 0
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_StringDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n )
+ {
+ FT_Byte* p;
+ FT_UInt r = 0;
+
+
+ for ( p = *cursor; r < n && p < limit; p++ )
+ {
+ FT_Byte b;
+
+
+ if ( *p != '\\' )
+ {
+ buffer[r++] = *p;
+
+ continue;
+ }
+
+ p++;
+
+ switch ( *p )
+ {
+ case 'n':
+ b = '\n';
+ break;
+ case 'r':
+ b = '\r';
+ break;
+ case 't':
+ b = '\t';
+ break;
+ case 'b':
+ b = '\b';
+ break;
+ case 'f':
+ b = '\f';
+ break;
+ case '\r':
+ p++;
+ if ( *p != '\n' )
+ {
+ b = *p;
+
+ break;
+ }
+ /* no break */
+ case '\n':
+ continue;
+ break;
+ default:
+ if ( IS_PS_DIGIT( *p ) )
+ {
+ b = *p - '0';
+
+ p++;
+
+ if ( IS_PS_DIGIT( *p ) )
+ {
+ b = b * 8 + *p - '0';
+
+ p++;
+
+ if ( IS_PS_DIGIT( *p ) )
+ b = b * 8 + *p - '0';
+ else
+ {
+ buffer[r++] = b;
+ b = *p;
+ }
+ }
+ else
+ {
+ buffer[r++] = b;
+ b = *p;
+ }
+ }
+ else
+ b = *p;
+ break;
+ }
+
+ buffer[r++] = b;
+ }
+
+ *cursor = p;
+
+ return r;
+ }
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_ASCIIHexDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n )
+ {
+ FT_Byte* p;
+ FT_UInt r = 0;
+ FT_UInt w = 0;
+ FT_UInt pad = 0x01;
+
+
+ n *= 2;
+
+#if 1
+
+ p = *cursor;
+
+ if ( p >= limit )
+ return 0;
+
+ if ( n > (FT_UInt)( limit - p ) )
+ n = (FT_UInt)( limit - p );
+
+ /* we try to process two nibbles at a time to be as fast as possible */
+ for ( ; r < n; r++ )
+ {
+ FT_UInt c = p[r];
+
+
+ if ( IS_PS_SPACE( c ) )
+ continue;
+
+ if ( c OP 0x80 )
+ break;
+
+ c = ft_char_table[c & 0x7F];
+ if ( (unsigned)c >= 16 )
+ break;
+
+ pad = ( pad << 4 ) | c;
+ if ( pad & 0x100 )
+ {
+ buffer[w++] = (FT_Byte)pad;
+ pad = 0x01;
+ }
+ }
+
+ if ( pad != 0x01 )
+ buffer[w++] = (FT_Byte)( pad << 4 );
+
+ *cursor = p + r;
+
+ return w;
+
+#else /* 0 */
+
+ for ( r = 0; r < n; r++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) )
+ continue;
+
+ if ( *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( (unsigned)c >= 16 )
+ break;
+
+ if ( r & 1 )
+ {
+ *buffer = (FT_Byte)(*buffer + c);
+ buffer++;
+ }
+ else
+ *buffer = (FT_Byte)(c << 4);
+
+ r++;
+ }
+
+ *cursor = p;
+
+ return ( r + 1 ) / 2;
+
+#endif /* 0 */
+
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_EexecDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n,
+ FT_UShort* seed )
+ {
+ FT_Byte* p;
+ FT_UInt r;
+ FT_UInt s = *seed;
+
+
+#if 1
+
+ p = *cursor;
+
+ if ( p >= limit )
+ return 0;
+
+ if ( n > (FT_UInt)(limit - p) )
+ n = (FT_UInt)(limit - p);
+
+ for ( r = 0; r < n; r++ )
+ {
+ FT_UInt val = p[r];
+ FT_UInt b = ( val ^ ( s >> 8 ) );
+
+
+ s = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
+ buffer[r] = (FT_Byte) b;
+ }
+
+ *cursor = p + n;
+ *seed = (FT_UShort)s;
+
+#else /* 0 */
+
+ for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
+ {
+ FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) );
+
+
+ s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );
+ *buffer++ = b;
+ }
+ *cursor = p;
+ *seed = s;
+
+#endif /* 0 */
+
+ return r;
+ }
+
+FT_LOCAL_DEF( FT_Bool )
+ xyq_PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit, FT_Long* val )
+
+ {
+ FT_Byte first_char = **cursor;
+ if (first_char == '+' || first_char == '-' || (first_char >= '0' && first_char <= '9')) {
+ *val = PS_Conv_ToInt(cursor, limit);
+ return 1;
+ }
+ return 0;
+ }
+
+/* END */
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
new file mode 100644
index 0000000000..7fa77278ae
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/* */
+/* psconv.h */
+/* */
+/* Some convenience conversions (specification). */
+/* */
+/* Copyright 2006, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSCONV_H__
+#define __PSCONV_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Long )
+ PS_Conv_Strtol( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long base );
+
+
+ FT_LOCAL( FT_Long )
+ PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit );
+ FT_LOCAL( FT_Bool )
+ xyq_PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit, FT_Long* val ); /* XYQ 2007-10-10: we add return value indicating whether it's actually a number */
+
+ FT_LOCAL( FT_Fixed )
+ PS_Conv_ToFixed( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long power_ten );
+
+#if 0
+ FT_LOCAL( FT_UInt )
+ PS_Conv_StringDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n );
+#endif
+
+ FT_LOCAL( FT_UInt )
+ PS_Conv_ASCIIHexDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n );
+
+ FT_LOCAL( FT_UInt )
+ PS_Conv_EexecDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n,
+ FT_UShort* seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSCONV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
new file mode 100644
index 0000000000..2cd90039d0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
@@ -0,0 +1,1767 @@
+/***************************************************************************/
+/* */
+/* psobjs.c */
+/* */
+/* Auxiliary functions for PostScript fonts (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "psobjs.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_psobjs
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_new */
+ /* */
+ /* <Description> */
+ /* Initializes a PS_Table. */
+ /* */
+ /* <InOut> */
+ /* table :: The address of the target table. */
+ /* */
+ /* <Input> */
+ /* count :: The table size = the maximum number of elements. */
+ /* */
+ /* memory :: The memory object to use for all subsequent */
+ /* reallocations. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ ps_table_new( PS_Table table,
+ FT_Int count,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ table->memory = memory;
+ if ( FT_NEW_ARRAY( table->elements, count ) ||
+ FT_NEW_ARRAY( table->lengths, count ) )
+ goto Exit;
+
+ table->max_elems = count;
+ table->init = 0xDEADBEEFUL;
+ table->num_elems = 0;
+ table->block = 0;
+ table->capacity = 0;
+ table->cursor = 0;
+
+ *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;
+
+ Exit:
+ if ( error )
+ FT_FREE( table->elements );
+
+ return error;
+ }
+
+
+ static void
+ shift_elements( PS_Table table,
+ FT_Byte* old_base )
+ {
+ FT_PtrDist delta = table->block - old_base;
+ FT_Byte** offset = table->elements;
+ FT_Byte** limit = offset + table->max_elems;
+
+
+ for ( ; offset < limit; offset++ )
+ {
+ if ( offset[0] )
+ offset[0] += delta;
+ }
+ }
+
+
+ static FT_Error
+ reallocate_t1_table( PS_Table table,
+ FT_Offset new_size )
+ {
+ FT_Memory memory = table->memory;
+ FT_Byte* old_base = table->block;
+ FT_Error error;
+
+
+ /* allocate new base block */
+ if ( FT_ALLOC( table->block, new_size ) )
+ {
+ table->block = old_base;
+ return error;
+ }
+
+ /* copy elements and shift offsets */
+ if ( old_base )
+ {
+ FT_MEM_COPY( table->block, old_base, table->capacity );
+ shift_elements( table, old_base );
+ FT_FREE( old_base );
+ }
+
+ table->capacity = new_size;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_add */
+ /* */
+ /* <Description> */
+ /* Adds an object to a PS_Table, possibly growing its memory block. */
+ /* */
+ /* <InOut> */
+ /* table :: The target table. */
+ /* */
+ /* <Input> */
+ /* idx :: The index of the object in the table. */
+ /* */
+ /* object :: The address of the object to copy in memory. */
+ /* */
+ /* length :: The length in bytes of the source object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. An error is returned if a */
+ /* reallocation fails. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ ps_table_add( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length )
+ {
+ if ( idx < 0 || idx >= table->max_elems )
+ {
+ FT_ERROR(( "ps_table_add: invalid index\n" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+ if ( length < 0 )
+ {
+ FT_ERROR(( "ps_table_add: invalid length\n" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+ /* grow the base block if needed */
+ if ( table->cursor + length > table->capacity )
+ {
+ FT_Error error;
+ FT_Offset new_size = table->capacity;
+ FT_PtrDist in_offset;
+
+
+ in_offset = (FT_Byte*)object - table->block;
+ if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )
+ in_offset = -1;
+
+ while ( new_size < table->cursor + length )
+ {
+ /* increase size by 25% and round up to the nearest multiple
+ of 1024 */
+ new_size += ( new_size >> 2 ) + 1;
+ new_size = FT_PAD_CEIL( new_size, 1024 );
+ }
+
+ error = reallocate_t1_table( table, new_size );
+ if ( error )
+ return error;
+
+ if ( in_offset >= 0 )
+ object = table->block + in_offset;
+ }
+
+ /* add the object to the base block and adjust offset */
+ table->elements[idx] = table->block + table->cursor;
+ table->lengths [idx] = length;
+ FT_MEM_COPY( table->block + table->cursor, object, length );
+
+ table->cursor += length;
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a PS_TableRec (i.e., reallocate it to its current */
+ /* cursor). */
+ /* */
+ /* <InOut> */
+ /* table :: The target table. */
+ /* */
+ /* <Note> */
+ /* This function does NOT release the heap's memory block. It is up */
+ /* to the caller to clean it, or reference it in its own structures. */
+ /* */
+ FT_LOCAL_DEF( void )
+ ps_table_done( PS_Table table )
+ {
+ FT_Memory memory = table->memory;
+ FT_Error error;
+ FT_Byte* old_base = table->block;
+
+
+ /* should never fail, because rec.cursor <= rec.size */
+ if ( !old_base )
+ return;
+
+ if ( FT_ALLOC( table->block, table->cursor ) )
+ return;
+ FT_MEM_COPY( table->block, old_base, table->cursor );
+ shift_elements( table, old_base );
+
+ table->capacity = table->cursor;
+ FT_FREE( old_base );
+
+ FT_UNUSED( error );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_table_release( PS_Table table )
+ {
+ FT_Memory memory = table->memory;
+
+
+ if ( (FT_ULong)table->init == 0xDEADBEEFUL )
+ {
+ FT_FREE( table->block );
+ FT_FREE( table->elements );
+ FT_FREE( table->lengths );
+ table->init = 0;
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* first character must be already part of the comment */
+
+ static void
+ skip_comment( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+
+
+ while ( cur < limit )
+ {
+ if ( IS_PS_NEWLINE( *cur ) )
+ break;
+ cur++;
+ }
+
+ *acur = cur;
+ }
+
+
+ static void
+ skip_spaces( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+
+
+ while ( cur < limit )
+ {
+ if ( !IS_PS_SPACE( *cur ) )
+ {
+ if ( *cur == '%' )
+ /* According to the PLRM, a comment is equal to a space. */
+ skip_comment( &cur, limit );
+ else
+ break;
+ }
+ cur++;
+ }
+
+ *acur = cur;
+ }
+
+
+#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )
+
+
+ /* first character must be `('; */
+ /* *acur is positioned at the character after the closing `)' */
+
+ static FT_Error
+ skip_literal_string( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int embed = 0;
+ FT_Error error = FT_ERR( Invalid_File_Format );
+ unsigned int i;
+
+
+ while ( cur < limit )
+ {
+ FT_Byte c = *cur;
+
+
+ ++cur;
+
+ if ( c == '\\' )
+ {
+ /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */
+ /* A backslash can introduce three different types */
+ /* of escape sequences: */
+ /* - a special escaped char like \r, \n, etc. */
+ /* - a one-, two-, or three-digit octal number */
+ /* - none of the above in which case the backslash is ignored */
+
+ if ( cur == limit )
+ /* error (or to be ignored?) */
+ break;
+
+ switch ( *cur )
+ {
+ /* skip `special' escape */
+ case 'n':
+ case 'r':
+ case 't':
+ case 'b':
+ case 'f':
+ case '\\':
+ case '(':
+ case ')':
+ ++cur;
+ break;
+
+ default:
+ /* skip octal escape or ignore backslash */
+ for ( i = 0; i < 3 && cur < limit; ++i )
+ {
+ if ( !IS_OCTAL_DIGIT( *cur ) )
+ break;
+
+ ++cur;
+ }
+ }
+ }
+ else if ( c == '(' )
+ embed++;
+ else if ( c == ')' )
+ {
+ embed--;
+ if ( embed == 0 )
+ {
+ error = FT_Err_Ok;
+ break;
+ }
+ }
+ }
+
+ *acur = cur;
+
+ return error;
+ }
+
+
+ /* first character must be `<' */
+
+ static FT_Error
+ skip_string( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Error err = FT_Err_Ok;
+
+
+ while ( ++cur < limit )
+ {
+ /* All whitespace characters are ignored. */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ break;
+
+ if ( !IS_PS_XDIGIT( *cur ) )
+ break;
+ }
+
+ if ( cur < limit && *cur != '>' )
+ {
+ FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
+ err = FT_THROW( Invalid_File_Format );
+ }
+ else
+ cur++;
+
+ *acur = cur;
+ return err;
+ }
+
+
+ /* first character must be the opening brace that */
+ /* starts the procedure */
+
+ /* NB: [ and ] need not match: */
+ /* `/foo {[} def' is a valid PostScript fragment, */
+ /* even within a Type1 font */
+
+ static FT_Error
+ skip_procedure( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur;
+ FT_Int embed = 0;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( **acur == '{' );
+
+ for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )
+ {
+ switch ( *cur )
+ {
+ case '{':
+ ++embed;
+ break;
+
+ case '}':
+ --embed;
+ if ( embed == 0 )
+ {
+ ++cur;
+ goto end;
+ }
+ break;
+
+ case '(':
+ error = skip_literal_string( &cur, limit );
+ break;
+
+ case '<':
+ error = skip_string( &cur, limit );
+ break;
+
+ case '%':
+ skip_comment( &cur, limit );
+ break;
+ }
+ }
+
+ end:
+ if ( embed != 0 )
+ error = FT_THROW( Invalid_File_Format );
+
+ *acur = cur;
+
+ return error;
+ }
+
+
+ /***********************************************************************/
+ /* */
+ /* All exported parsing routines handle leading whitespace and stop at */
+ /* the first character which isn't part of the just handled token. */
+ /* */
+ /***********************************************************************/
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_skip_PS_token( PS_Parser parser )
+ {
+ /* Note: PostScript allows any non-delimiting, non-whitespace */
+ /* character in a name (PS Ref Manual, 3rd ed, p31). */
+ /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */
+
+ FT_Byte* cur = parser->cursor;
+ FT_Byte* limit = parser->limit;
+ FT_Error error = FT_Err_Ok;
+
+
+ skip_spaces( &cur, limit ); /* this also skips comments */
+ if ( cur >= limit )
+ goto Exit;
+
+ /* self-delimiting, single-character tokens */
+ if ( *cur == '[' || *cur == ']' )
+ {
+ cur++;
+ goto Exit;
+ }
+
+ /* skip balanced expressions (procedures and strings) */
+
+ if ( *cur == '{' ) /* {...} */
+ {
+ error = skip_procedure( &cur, limit );
+ goto Exit;
+ }
+
+ if ( *cur == '(' ) /* (...) */
+ {
+ error = skip_literal_string( &cur, limit );
+ goto Exit;
+ }
+
+ if ( *cur == '<' ) /* <...> */
+ {
+ if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */
+ {
+ cur++;
+ cur++;
+ }
+ else
+ error = skip_string( &cur, limit );
+
+ goto Exit;
+ }
+
+ if ( *cur == '>' )
+ {
+ cur++;
+ if ( cur >= limit || *cur != '>' ) /* >> */
+ {
+ FT_ERROR(( "ps_parser_skip_PS_token:"
+ " unexpected closing delimiter `>'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ cur++;
+ goto Exit;
+ }
+
+ if ( *cur == '/' )
+ cur++;
+
+ /* anything else */
+ while ( cur < limit )
+ {
+ /* *cur might be invalid (e.g., ')' or '}'), but this */
+ /* is handled by the test `cur == parser->cursor' below */
+ if ( IS_PS_DELIM( *cur ) )
+ break;
+
+ cur++;
+ }
+
+ Exit:
+ if ( cur < limit && cur == parser->cursor )
+ {
+ FT_ERROR(( "ps_parser_skip_PS_token:"
+ " current token is `%c' which is self-delimiting\n"
+ " "
+ " but invalid at this point\n",
+ *cur ));
+
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ parser->error = error;
+ parser->cursor = cur;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_skip_spaces( PS_Parser parser )
+ {
+ skip_spaces( &parser->cursor, parser->limit );
+ }
+
+
+ /* `token' here means either something between balanced delimiters */
+ /* or the next token; the delimiters are not removed. */
+
+ FT_LOCAL_DEF( void )
+ ps_parser_to_token( PS_Parser parser,
+ T1_Token token )
+ {
+ FT_Byte* cur;
+ FT_Byte* limit;
+ FT_Int embed;
+
+
+ token->type = T1_TOKEN_TYPE_NONE;
+ token->start = 0;
+ token->limit = 0;
+
+ /* first of all, skip leading whitespace */
+ ps_parser_skip_spaces( parser );
+
+ cur = parser->cursor;
+ limit = parser->limit;
+
+ if ( cur >= limit )
+ return;
+
+ switch ( *cur )
+ {
+ /************* check for literal string *****************/
+ case '(':
+ token->type = T1_TOKEN_TYPE_STRING;
+ token->start = cur;
+
+ if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )
+ token->limit = cur;
+ break;
+
+ /************* check for programs/array *****************/
+ case '{':
+ token->type = T1_TOKEN_TYPE_ARRAY;
+ token->start = cur;
+
+ if ( skip_procedure( &cur, limit ) == FT_Err_Ok )
+ token->limit = cur;
+ break;
+
+ /************* check for table/array ********************/
+ /* XXX: in theory we should also look for "<<" */
+ /* since this is semantically equivalent to "["; */
+ /* in practice it doesn't matter (?) */
+ case '[':
+ token->type = T1_TOKEN_TYPE_ARRAY;
+ embed = 1;
+ token->start = cur++;
+
+ /* we need this to catch `[ ]' */
+ parser->cursor = cur;
+ ps_parser_skip_spaces( parser );
+ cur = parser->cursor;
+
+ while ( cur < limit && !parser->error )
+ {
+ /* XXX: this is wrong because it does not */
+ /* skip comments, procedures, and strings */
+ if ( *cur == '[' )
+ embed++;
+ else if ( *cur == ']' )
+ {
+ embed--;
+ if ( embed <= 0 )
+ {
+ token->limit = ++cur;
+ break;
+ }
+ }
+
+ parser->cursor = cur;
+ ps_parser_skip_PS_token( parser );
+ /* we need this to catch `[XXX ]' */
+ ps_parser_skip_spaces ( parser );
+ cur = parser->cursor;
+ }
+ break;
+
+ /* ************ otherwise, it is any token **************/
+ default:
+ token->start = cur;
+ token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
+ ps_parser_skip_PS_token( parser );
+ cur = parser->cursor;
+ if ( !parser->error )
+ token->limit = cur;
+ }
+
+ if ( !token->limit )
+ {
+ token->start = 0;
+ token->type = T1_TOKEN_TYPE_NONE;
+ }
+
+ parser->cursor = cur;
+ }
+
+
+ /* NB: `tokens' can be NULL if we only want to count */
+ /* the number of array elements */
+
+ FT_LOCAL_DEF( void )
+ ps_parser_to_token_array( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens )
+ {
+ T1_TokenRec master;
+
+
+ *pnum_tokens = -1;
+
+ /* this also handles leading whitespace */
+ ps_parser_to_token( parser, &master );
+
+ if ( master.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ FT_Byte* old_cursor = parser->cursor;
+ FT_Byte* old_limit = parser->limit;
+ T1_Token cur = tokens;
+ T1_Token limit = cur + max_tokens;
+
+
+ /* don't include outermost delimiters */
+ parser->cursor = master.start + 1;
+ parser->limit = master.limit - 1;
+
+ while ( parser->cursor < parser->limit )
+ {
+ T1_TokenRec token;
+
+
+ ps_parser_to_token( parser, &token );
+ if ( !token.type )
+ break;
+
+ if ( tokens != NULL && cur < limit )
+ *cur = token;
+
+ cur++;
+ }
+
+ *pnum_tokens = (FT_Int)( cur - tokens );
+
+ parser->cursor = old_cursor;
+ parser->limit = old_limit;
+ }
+ }
+
+
+ /* first character must be a delimiter or a part of a number */
+ /* NB: `coords' can be NULL if we just want to skip the */
+ /* array; in this case we ignore `max_coords' */
+
+ static FT_Int
+ ps_tocoordarray( FT_Byte* *acur,
+ FT_Byte* limit,
+ FT_Int max_coords,
+ FT_Short* coords )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int count = 0;
+ FT_Byte c, ender;
+
+
+ if ( cur >= limit )
+ goto Exit;
+
+ /* check for the beginning of an array; otherwise, only one number */
+ /* will be read */
+ c = *cur;
+ ender = 0;
+
+ if ( c == '[' )
+ ender = ']';
+ else if ( c == '{' )
+ ender = '}';
+
+ if ( ender )
+ cur++;
+
+ /* now, read the coordinates */
+ while ( cur < limit )
+ {
+ FT_Short dummy;
+ FT_Byte* old_cur;
+
+
+ /* skip whitespace in front of data */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ goto Exit;
+
+ if ( *cur == ender )
+ {
+ cur++;
+ break;
+ }
+
+ old_cur = cur;
+
+ if ( coords != NULL && count >= max_coords )
+ break;
+
+ /* call PS_Conv_ToFixed() even if coords == NULL */
+ /* to properly parse number at `cur' */
+ *( coords != NULL ? &coords[count] : &dummy ) =
+ (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
+
+ if ( old_cur == cur )
+ {
+ count = -1;
+ goto Exit;
+ }
+ else
+ count++;
+
+ if ( !ender )
+ break;
+ }
+
+ Exit:
+ *acur = cur;
+ return count;
+ }
+
+
+ /* first character must be a delimiter or a part of a number */
+ /* NB: `values' can be NULL if we just want to skip the */
+ /* array; in this case we ignore `max_values' */
+
+ static FT_Int
+ ps_tofixedarray( FT_Byte* *acur,
+ FT_Byte* limit,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int count = 0;
+ FT_Byte c, ender;
+
+
+ if ( cur >= limit )
+ goto Exit;
+
+ /* Check for the beginning of an array. Otherwise, only one number */
+ /* will be read. */
+ c = *cur;
+ ender = 0;
+
+ if ( c == '[' )
+ ender = ']';
+ else if ( c == '{' )
+ ender = '}';
+
+ if ( ender )
+ cur++;
+
+ /* now, read the values */
+ while ( cur < limit )
+ {
+ FT_Fixed dummy;
+ FT_Byte* old_cur;
+
+
+ /* skip whitespace in front of data */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ goto Exit;
+
+ if ( *cur == ender )
+ {
+ cur++;
+ break;
+ }
+
+ old_cur = cur;
+
+ if ( values != NULL && count >= max_values )
+ break;
+
+ /* call PS_Conv_ToFixed() even if coords == NULL */
+ /* to properly parse number at `cur' */
+ *( values != NULL ? &values[count] : &dummy ) =
+ PS_Conv_ToFixed( &cur, limit, power_ten );
+
+ if ( old_cur == cur )
+ {
+ count = -1;
+ goto Exit;
+ }
+ else
+ count++;
+
+ if ( !ender )
+ break;
+ }
+
+ Exit:
+ *acur = cur;
+ return count;
+ }
+
+
+#if 0
+
+ static FT_String*
+ ps_tostring( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Memory memory )
+ {
+ FT_Byte* cur = *cursor;
+ FT_PtrDist len = 0;
+ FT_Int count;
+ FT_String* result;
+ FT_Error error;
+
+
+ /* XXX: some stupid fonts have a `Notice' or `Copyright' string */
+ /* that simply doesn't begin with an opening parenthesis, even */
+ /* though they have a closing one! E.g. "amuncial.pfb" */
+ /* */
+ /* We must deal with these ill-fated cases there. Note that */
+ /* these fonts didn't work with the old Type 1 driver as the */
+ /* notice/copyright was not recognized as a valid string token */
+ /* and made the old token parser commit errors. */
+
+ while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) )
+ cur++;
+ if ( cur + 1 >= limit )
+ return 0;
+
+ if ( *cur == '(' )
+ cur++; /* skip the opening parenthesis, if there is one */
+
+ *cursor = cur;
+ count = 0;
+
+ /* then, count its length */
+ for ( ; cur < limit; cur++ )
+ {
+ if ( *cur == '(' )
+ count++;
+
+ else if ( *cur == ')' )
+ {
+ count--;
+ if ( count < 0 )
+ break;
+ }
+ }
+
+ len = cur - *cursor;
+ if ( cur >= limit || FT_ALLOC( result, len + 1 ) )
+ return 0;
+
+ /* now copy the string */
+ FT_MEM_COPY( result, *cursor, len );
+ result[len] = '\0';
+ *cursor = cur;
+ return result;
+ }
+
+#endif /* 0 */
+
+
+ static int
+ ps_tobool( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Bool result = 0;
+
+
+ /* return 1 if we find `true', 0 otherwise */
+ if ( cur + 3 < limit &&
+ cur[0] == 't' &&
+ cur[1] == 'r' &&
+ cur[2] == 'u' &&
+ cur[3] == 'e' )
+ {
+ result = 1;
+ cur += 5;
+ }
+ else if ( cur + 4 < limit &&
+ cur[0] == 'f' &&
+ cur[1] == 'a' &&
+ cur[2] == 'l' &&
+ cur[3] == 's' &&
+ cur[4] == 'e' )
+ {
+ result = 0;
+ cur += 6;
+ }
+
+ *acur = cur;
+ return result;
+ }
+
+
+ /* load a simple field (i.e. non-table) into the current list of objects */
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_load_field( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags )
+ {
+ T1_TokenRec token;
+ FT_Byte* cur;
+ FT_Byte* limit;
+ FT_UInt count;
+ FT_UInt idx;
+ FT_Error error;
+ T1_FieldType type;
+
+
+ /* this also skips leading whitespace */
+ ps_parser_to_token( parser, &token );
+ if ( !token.type )
+ goto Fail;
+
+ count = 1;
+ idx = 0;
+ cur = token.start;
+ limit = token.limit;
+
+ type = field->type;
+
+ /* we must detect arrays in /FontBBox */
+ if ( type == T1_FIELD_TYPE_BBOX )
+ {
+ T1_TokenRec token2;
+ FT_Byte* old_cur = parser->cursor;
+ FT_Byte* old_limit = parser->limit;
+
+
+ /* don't include delimiters */
+ parser->cursor = token.start + 1;
+ parser->limit = token.limit - 1;
+
+ ps_parser_to_token( parser, &token2 );
+ parser->cursor = old_cur;
+ parser->limit = old_limit;
+
+ if ( token2.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ type = T1_FIELD_TYPE_MM_BBOX;
+ goto FieldArray;
+ }
+ }
+ else if ( token.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ count = max_objects;
+
+ FieldArray:
+ /* if this is an array and we have no blend, an error occurs */
+ if ( max_objects == 0 )
+ goto Fail;
+
+ idx = 1;
+
+ /* don't include delimiters */
+ cur++;
+ limit--;
+ }
+
+ for ( ; count > 0; count--, idx++ )
+ {
+ FT_Byte* q = (FT_Byte*)objects[idx] + field->offset;
+ FT_Long val;
+ FT_String* string;
+
+
+ skip_spaces( &cur, limit );
+
+ switch ( type )
+ {
+ case T1_FIELD_TYPE_BOOL:
+ val = ps_tobool( &cur, limit );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_FIXED:
+ val = PS_Conv_ToFixed( &cur, limit, 0 );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_FIXED_1000:
+ val = PS_Conv_ToFixed( &cur, limit, 3 );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_INTEGER:
+ { FT_Bool ret = xyq_PS_Conv_ToInt( &cur, limit, &val ); /* XYQ 2007-10-10: abort if not a number*/
+ if (!ret) break; }
+ /* fall through */
+
+ Store_Integer:
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_UShort*)q = (FT_UShort)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_UInt32*)q = (FT_UInt32)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+ break;
+
+ case T1_FIELD_TYPE_STRING:
+ case T1_FIELD_TYPE_KEY:
+ {
+ FT_Memory memory = parser->memory;
+ FT_UInt len = (FT_UInt)( limit - cur );
+
+
+ if ( cur >= limit )
+ break;
+
+ /* we allow both a string or a name */
+ /* for cases like /FontName (foo) def */
+ if ( token.type == T1_TOKEN_TYPE_KEY )
+ {
+ /* don't include leading `/' */
+ len--;
+ cur++;
+ }
+ else if ( token.type == T1_TOKEN_TYPE_STRING )
+ {
+ /* don't include delimiting parentheses */
+ /* XXX we don't handle <<...>> here */
+ /* XXX should we convert octal escapes? */
+ /* if so, what encoding should we use? */
+ cur++;
+ len -= 2;
+ }
+ else
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected a name or string\n"
+ " "
+ " but found token of type %d instead\n",
+ token.type ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* for this to work (FT_String**)q must have been */
+ /* initialized to NULL */
+ if ( *(FT_String**)q != NULL )
+ {
+ FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
+ field->ident ));
+ FT_FREE( *(FT_String**)q );
+ *(FT_String**)q = NULL;
+ }
+
+ if ( FT_ALLOC( string, len + 1 ) )
+ goto Exit;
+
+ FT_MEM_COPY( string, cur, len );
+ string[len] = 0;
+
+ *(FT_String**)q = string;
+ }
+ break;
+
+ case T1_FIELD_TYPE_BBOX:
+ {
+ // Add by Johnson, fix a Error #1: UNINITIALIZED READ. #testdoc 1282.pdf
+ FT_Fixed temp[4] = {0,0,0,0};
+ FT_BBox* bbox = (FT_BBox*)q;
+ FT_Int result;
+
+
+ result = ps_tofixedarray( &cur, limit, 4, temp, 0 );
+
+ if ( result < 0 )
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected four integers in bounding box\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ bbox->xMin = FT_RoundFix( temp[0] );
+ bbox->yMin = FT_RoundFix( temp[1] );
+ bbox->xMax = FT_RoundFix( temp[2] );
+ bbox->yMax = FT_RoundFix( temp[3] );
+ }
+ break;
+
+ case T1_FIELD_TYPE_MM_BBOX:
+ {
+ FT_Memory memory = parser->memory;
+ FT_Fixed* temp;
+ FT_Int result;
+ FT_UInt i;
+
+
+ if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )
+ goto Exit;
+
+ for ( i = 0; i < 4; i++ )
+ {
+ result = ps_tofixedarray( &cur, limit, max_objects,
+ temp + i * max_objects, 0 );
+ if ( result < 0 )
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected %d integers in the %s subarray\n"
+ " "
+ " of /FontBBox in the /Blend dictionary\n",
+ max_objects,
+ i == 0 ? "first"
+ : ( i == 1 ? "second"
+ : ( i == 2 ? "third"
+ : "fourth" ) ) ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ skip_spaces( &cur, limit );
+ }
+
+ for ( i = 0; i < max_objects; i++ )
+ {
+ FT_BBox* bbox = (FT_BBox*)objects[i];
+
+
+ bbox->xMin = FT_RoundFix( temp[i ] );
+ bbox->yMin = FT_RoundFix( temp[i + max_objects] );
+ bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
+ bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
+ }
+
+ FT_FREE( temp );
+ }
+ break;
+
+ default:
+ /* an error occurred */
+ goto Fail;
+ }
+ }
+
+#if 0 /* obsolete -- keep for reference */
+ if ( pflags )
+ *pflags |= 1L << field->flag_bit;
+#else
+ FT_UNUSED( pflags );
+#endif
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+#define T1_MAX_TABLE_ELEMENTS 32
+
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_load_field_table( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags )
+ {
+ T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS];
+ T1_Token token;
+ FT_Int num_elements;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+ T1_FieldRec fieldrec = *(T1_Field)field;
+
+
+ fieldrec.type = T1_FIELD_TYPE_INTEGER;
+ if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||
+ field->type == T1_FIELD_TYPE_BBOX )
+ fieldrec.type = T1_FIELD_TYPE_FIXED;
+
+ ps_parser_to_token_array( parser, elements,
+ T1_MAX_TABLE_ELEMENTS, &num_elements );
+ if ( num_elements < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( (FT_UInt)num_elements > field->array_max )
+ num_elements = field->array_max;
+
+ old_cursor = parser->cursor;
+ old_limit = parser->limit;
+
+ /* we store the elements count if necessary; */
+ /* we further assume that `count_offset' can't be zero */
+ if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
+ *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
+ (FT_Byte)num_elements;
+
+ /* we now load each element, adjusting the field.offset on each one */
+ token = elements;
+ for ( ; num_elements > 0; num_elements--, token++ )
+ {
+ parser->cursor = token->start;
+ parser->limit = token->limit;
+ ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );
+ fieldrec.offset += fieldrec.size;
+ }
+
+#if 0 /* obsolete -- keep for reference */
+ if ( pflags )
+ *pflags |= 1L << field->flag_bit;
+#else
+ FT_UNUSED( pflags );
+#endif
+
+ parser->cursor = old_cursor;
+ parser->limit = old_limit;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Long )
+ ps_parser_to_int( PS_Parser parser )
+ {
+ ps_parser_skip_spaces( parser );
+ return PS_Conv_ToInt( &parser->cursor, parser->limit );
+ }
+
+
+ /* first character must be `<' if `delimiters' is non-zero */
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_to_bytes( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* cur;
+
+
+ ps_parser_skip_spaces( parser );
+ cur = parser->cursor;
+
+ if ( cur >= parser->limit )
+ goto Exit;
+
+ if ( delimiters )
+ {
+ if ( *cur != '<' )
+ {
+ FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ cur++;
+ }
+
+ *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
+ parser->limit,
+ bytes,
+ max_bytes );
+
+ if ( delimiters )
+ {
+ if ( cur < parser->limit && *cur != '>' )
+ {
+ FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ cur++;
+ }
+
+ parser->cursor = cur;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Fixed )
+ ps_parser_to_fixed( PS_Parser parser,
+ FT_Int power_ten )
+ {
+ ps_parser_skip_spaces( parser );
+ return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ ps_parser_to_coord_array( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords )
+ {
+ ps_parser_skip_spaces( parser );
+ return ps_tocoordarray( &parser->cursor, parser->limit,
+ max_coords, coords );
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ ps_parser_to_fixed_array( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten )
+ {
+ ps_parser_skip_spaces( parser );
+ return ps_tofixedarray( &parser->cursor, parser->limit,
+ max_values, values, power_ten );
+ }
+
+
+#if 0
+
+ FT_LOCAL_DEF( FT_String* )
+ T1_ToString( PS_Parser parser )
+ {
+ return ps_tostring( &parser->cursor, parser->limit, parser->memory );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ T1_ToBool( PS_Parser parser )
+ {
+ return ps_tobool( &parser->cursor, parser->limit );
+ }
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_init( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory )
+ {
+ parser->error = FT_Err_Ok;
+ parser->base = base;
+ parser->limit = limit;
+ parser->cursor = base;
+ parser->memory = memory;
+ parser->funcs = ps_parser_funcs;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_done( PS_Parser parser )
+ {
+ FT_UNUSED( parser );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_builder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph builder. */
+ /* */
+ /* <InOut> */
+ /* builder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* glyph :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting should be applied. */
+ /* */
+ FT_LOCAL_DEF( void )
+ t1_builder_init( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot glyph,
+ FT_Bool hinting )
+ {
+ builder->parse_state = T1_Parse_Start;
+ builder->load_points = 1;
+
+ builder->face = face;
+ builder->glyph = glyph;
+ builder->memory = face->memory;
+
+ if ( glyph )
+ {
+ FT_GlyphLoader loader = glyph->internal->loader;
+
+
+ builder->loader = loader;
+ builder->base = &loader->base.outline;
+ builder->current = &loader->current.outline;
+ FT_GlyphLoader_Rewind( loader );
+
+ builder->hints_globals = size->internal;
+ builder->hints_funcs = 0;
+
+ if ( hinting )
+ builder->hints_funcs = glyph->internal->glyph_hints;
+ }
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+ builder->advance.x = 0;
+ builder->advance.y = 0;
+
+ builder->funcs = t1_builder_funcs;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_builder_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given glyph builder. Its contents can still be used */
+ /* after the call, but the function saves important information */
+ /* within the corresponding glyph slot. */
+ /* */
+ /* <Input> */
+ /* builder :: A pointer to the glyph builder to finalize. */
+ /* */
+ FT_LOCAL_DEF( void )
+ t1_builder_done( T1_Builder builder )
+ {
+ FT_GlyphSlot glyph = builder->glyph;
+
+
+ if ( glyph )
+ glyph->outline = *builder->base;
+ }
+
+
+ /* check that there is enough space for `count' more points */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_check_points( T1_Builder builder,
+ FT_Int count )
+ {
+ return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+ }
+
+
+ /* add a new point, do not check space */
+ FT_LOCAL_DEF( void )
+ t1_builder_add_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag )
+ {
+ FT_Outline* outline = builder->current;
+
+
+ if ( builder->load_points )
+ {
+ FT_Vector* point = outline->points + outline->n_points;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
+
+
+ point->x = FIXED_TO_INT( x );
+ point->y = FIXED_TO_INT( y );
+ *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+ }
+ outline->n_points++;
+ }
+
+
+ /* check space for a new on-curve point, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_add_point1( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error;
+
+
+ error = t1_builder_check_points( builder, 1 );
+ if ( !error )
+ t1_builder_add_point( builder, x, y, 1 );
+
+ return error;
+ }
+
+
+ /* check space for a new contour, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_add_contour( T1_Builder builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Error error;
+
+
+ /* this might happen in invalid fonts */
+ if ( !outline )
+ {
+ FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" ));
+ return FT_THROW( Invalid_File_Format );
+ }
+
+ if ( !builder->load_points )
+ {
+ outline->n_contours++;
+ return FT_Err_Ok;
+ }
+
+ error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+ if ( !error )
+ {
+ if ( outline->n_contours > 0 )
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+
+ outline->n_contours++;
+ }
+
+ return error;
+ }
+
+
+ /* if a path was begun, add its first on-curve point */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_start_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error = FT_ERR( Invalid_File_Format );
+
+
+ /* test whether we are building a new contour */
+
+ if ( builder->parse_state == T1_Parse_Have_Path )
+ error = FT_Err_Ok;
+ else
+ {
+ builder->parse_state = T1_Parse_Have_Path;
+ error = t1_builder_add_contour( builder );
+ if ( !error )
+ error = t1_builder_add_point1( builder, x, y );
+ }
+
+ return error;
+ }
+
+
+ /* close the current contour */
+ FT_LOCAL_DEF( void )
+ t1_builder_close_contour( T1_Builder builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Int first;
+
+
+ if ( !outline )
+ return;
+
+ first = outline->n_contours <= 1
+ ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+ /* We must not include the last point in the path if it */
+ /* is located on the first point. */
+ if ( outline->n_points > 1 )
+ {
+ FT_Vector* p1 = outline->points + first;
+ FT_Vector* p2 = outline->points + outline->n_points - 1;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+ /* `delete' last point only if it coincides with the first */
+ /* point and it is not a control point (which can happen). */
+ if ( p1->x == p2->x && p1->y == p2->y )
+ if ( *control == FT_CURVE_TAG_ON )
+ outline->n_points--;
+ }
+
+ if ( outline->n_contours > 0 )
+ {
+ /* Don't add contours only consisting of one point, i.e., */
+ /* check whether the first and the last point is the same. */
+ if ( first == outline->n_points - 1 )
+ {
+ outline->n_contours--;
+ outline->n_points--;
+ }
+ else
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** OTHER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ t1_decrypt( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed )
+ {
+ PS_Conv_EexecDecode( &buffer,
+ buffer + length,
+ buffer,
+ length,
+ &seed );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
new file mode 100644
index 0000000000..cbb05ec9ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
@@ -0,0 +1,212 @@
+/***************************************************************************/
+/* */
+/* psobjs.h */
+/* */
+/* Auxiliary functions for PostScript fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSOBJS_H__
+#define __PSOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_TABLE
+ const PS_Table_FuncsRec ps_table_funcs;
+
+ FT_CALLBACK_TABLE
+ const PS_Parser_FuncsRec ps_parser_funcs;
+
+ FT_CALLBACK_TABLE
+ const T1_Builder_FuncsRec t1_builder_funcs;
+
+
+ FT_LOCAL( FT_Error )
+ ps_table_new( PS_Table table,
+ FT_Int count,
+ FT_Memory memory );
+
+ FT_LOCAL( FT_Error )
+ ps_table_add( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length );
+
+ FT_LOCAL( void )
+ ps_table_done( PS_Table table );
+
+
+ FT_LOCAL( void )
+ ps_table_release( PS_Table table );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL( void )
+ ps_parser_skip_spaces( PS_Parser parser );
+
+ FT_LOCAL( void )
+ ps_parser_skip_PS_token( PS_Parser parser );
+
+ FT_LOCAL( void )
+ ps_parser_to_token( PS_Parser parser,
+ T1_Token token );
+
+ FT_LOCAL( void )
+ ps_parser_to_token_array( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens );
+
+ FT_LOCAL( FT_Error )
+ ps_parser_load_field( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_LOCAL( FT_Error )
+ ps_parser_load_field_table( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_LOCAL( FT_Long )
+ ps_parser_to_int( PS_Parser parser );
+
+
+ FT_LOCAL( FT_Error )
+ ps_parser_to_bytes( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters );
+
+
+ FT_LOCAL( FT_Fixed )
+ ps_parser_to_fixed( PS_Parser parser,
+ FT_Int power_ten );
+
+
+ FT_LOCAL( FT_Int )
+ ps_parser_to_coord_array( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords );
+
+ FT_LOCAL( FT_Int )
+ ps_parser_to_fixed_array( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten );
+
+
+ FT_LOCAL( void )
+ ps_parser_init( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory );
+
+ FT_LOCAL( void )
+ ps_parser_done( PS_Parser parser );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL( void )
+ t1_builder_init( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot glyph,
+ FT_Bool hinting );
+
+ FT_LOCAL( void )
+ t1_builder_done( T1_Builder builder );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_check_points( T1_Builder builder,
+ FT_Int count );
+
+ FT_LOCAL( void )
+ t1_builder_add_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_add_point1( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_add_contour( T1_Builder builder );
+
+
+ FT_LOCAL( FT_Error )
+ t1_builder_start_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+
+ FT_LOCAL( void )
+ t1_builder_close_contour( T1_Builder builder );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** OTHER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL( void )
+ t1_decrypt( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
new file mode 100644
index 0000000000..7a1be37b69
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSaux driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSAUX driver directory
+#
+PSAUX_DIR := $(SRC_DIR)/psaux
+
+
+# compilation flags for the driver
+#
+PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR))
+
+
+# PSAUX driver sources (i.e., C files)
+#
+PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \
+ $(PSAUX_DIR)/t1decode.c \
+ $(PSAUX_DIR)/t1cmap.c \
+ $(PSAUX_DIR)/afmparse.c \
+ $(PSAUX_DIR)/psconv.c \
+ $(PSAUX_DIR)/psauxmod.c
+
+# PSAUX driver headers
+#
+PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \
+ $(PSAUX_DIR)/psauxerr.h
+
+
+# PSAUX driver object(s)
+#
+# PSAUX_DRV_OBJ_M is used during `multi' builds.
+# PSAUX_DRV_OBJ_S is used during `single' builds.
+#
+PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O
+
+# PSAUX driver source file for single build
+#
+PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c
+
+
+# PSAUX driver - single object
+#
+$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \
+ $(FREETYPE_H) $(PSAUX_DRV_H)
+ $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S))
+
+
+# PSAUX driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H)
+ $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSAUX_DRV_OBJ_S)
+DRV_OBJS_M += $(PSAUX_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
new file mode 100644
index 0000000000..4070306c52
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
@@ -0,0 +1,341 @@
+/***************************************************************************/
+/* */
+/* t1cmap.c */
+/* */
+/* Type 1 character map support (body). */
+/* */
+/* Copyright 2002, 2003, 2006, 2007, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "t1cmap.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t1_cmap_std_init( T1_CMapStd cmap,
+ FT_Int is_expert )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ cmap->num_glyphs = face->type1.num_glyphs;
+ cmap->glyph_names = (const char* const*)face->type1.glyph_names;
+ cmap->sid_to_string = psnames->adobe_std_strings;
+ cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding
+ : psnames->adobe_std_encoding;
+
+ FT_ASSERT( cmap->code_to_sid != NULL );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_std_done( T1_CMapStd cmap )
+ {
+ cmap->num_glyphs = 0;
+ cmap->glyph_names = NULL;
+ cmap->sid_to_string = NULL;
+ cmap->code_to_sid = NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_std_char_index( T1_CMapStd cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( char_code < 256 )
+ {
+ FT_UInt code, n;
+ const char* glyph_name;
+
+
+ /* convert character code to Adobe SID string */
+ code = cmap->code_to_sid[char_code];
+ glyph_name = cmap->sid_to_string( code );
+
+ /* look for the corresponding glyph name */
+ for ( n = 0; n < cmap->num_glyphs; n++ )
+ {
+ const char* gname = cmap->glyph_names[n];
+
+
+ if ( gname && gname[0] == glyph_name[0] &&
+ ft_strcmp( gname, glyph_name ) == 0 )
+ {
+ result = n;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_std_char_next( T1_CMapStd cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+
+
+ while ( char_code < 256 )
+ {
+ result = t1_cmap_std_char_index( cmap, char_code );
+ if ( result != 0 )
+ goto Exit;
+
+ char_code++;
+ }
+ char_code = 0;
+
+ Exit:
+ *pchar_code = char_code;
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_standard_init( T1_CMapStd cmap )
+ {
+ t1_cmap_std_init( cmap, 0 );
+ return 0;
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_standard_class_rec =
+ {
+ sizeof ( T1_CMapStdRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_standard_init,
+ (FT_CMap_DoneFunc) t1_cmap_std_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_expert_init( T1_CMapStd cmap )
+ {
+ t1_cmap_std_init( cmap, 1 );
+ return 0;
+ }
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_expert_class_rec =
+ {
+ sizeof ( T1_CMapStdRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_expert_init,
+ (FT_CMap_DoneFunc) t1_cmap_std_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CUSTOM ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_custom_init( T1_CMapCustom cmap )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
+ T1_Encoding encoding = &face->type1.encoding;
+
+
+ cmap->first = encoding->code_first;
+ cmap->count = (FT_UInt)( encoding->code_last - cmap->first );
+ cmap->indices = encoding->char_index;
+
+ FT_ASSERT( cmap->indices != NULL );
+ FT_ASSERT( encoding->code_first <= encoding->code_last );
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_custom_done( T1_CMapCustom cmap )
+ {
+ cmap->indices = NULL;
+ cmap->first = 0;
+ cmap->count = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_custom_char_index( T1_CMapCustom cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( ( char_code >= cmap->first ) &&
+ ( char_code < ( cmap->first + cmap->count ) ) )
+ result = cmap->indices[char_code];
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_custom_char_next( T1_CMapCustom cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code;
+
+
+ ++char_code;
+
+ if ( char_code < cmap->first )
+ char_code = cmap->first;
+
+ for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
+ {
+ result = cmap->indices[char_code];
+ if ( result != 0 )
+ goto Exit;
+ }
+
+ char_code = 0;
+
+ Exit:
+ *pchar_code = char_code;
+ return result;
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_custom_class_rec =
+ {
+ sizeof ( T1_CMapCustomRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_custom_init,
+ (FT_CMap_DoneFunc) t1_cmap_custom_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( const char * )
+ psaux_get_glyph_name( T1_Face face,
+ FT_UInt idx )
+ {
+ return face->type1.glyph_names[idx];
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_unicode_init( PS_Unicodes unicodes )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_init( memory,
+ unicodes,
+ face->type1.num_glyphs,
+ (PS_GetGlyphNameFunc)&psaux_get_glyph_name,
+ (PS_FreeGlyphNameFunc)NULL,
+ (FT_Pointer)face );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_unicode_done( PS_Unicodes unicodes )
+ {
+ FT_Face face = FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( unicodes->maps );
+ unicodes->num_maps = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_unicode_char_index( PS_Unicodes unicodes,
+ FT_UInt32 char_code )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_char_index( unicodes, char_code );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_unicode_char_next( PS_Unicodes unicodes,
+ FT_UInt32 *pchar_code )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_char_next( unicodes, pchar_code );
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_unicode_class_rec =
+ {
+ sizeof ( PS_UnicodesRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_unicode_init,
+ (FT_CMap_DoneFunc) t1_cmap_unicode_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
new file mode 100644
index 0000000000..c32e0eb197
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
@@ -0,0 +1,105 @@
+/***************************************************************************/
+/* */
+/* t1cmap.h */
+/* */
+/* Type 1 character map support (specification). */
+/* */
+/* Copyright 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1CMAP_H__
+#define __T1CMAP_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* standard (and expert) encoding cmaps */
+ typedef struct T1_CMapStdRec_* T1_CMapStd;
+
+ typedef struct T1_CMapStdRec_
+ {
+ FT_CMapRec cmap;
+
+ const FT_UShort* code_to_sid;
+ PS_Adobe_Std_StringsFunc sid_to_string;
+
+ FT_UInt num_glyphs;
+ const char* const* glyph_names;
+
+ } T1_CMapStdRec;
+
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_standard_class_rec;
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_expert_class_rec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CUSTOM ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct T1_CMapCustomRec_* T1_CMapCustom;
+
+ typedef struct T1_CMapCustomRec_
+ {
+ FT_CMapRec cmap;
+ FT_UInt first;
+ FT_UInt count;
+ FT_UShort* indices;
+
+ } T1_CMapCustomRec;
+
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_custom_class_rec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* unicode (synthetic) cmaps */
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_unicode_class_rec;
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __T1CMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
new file mode 100644
index 0000000000..abf1d74151
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
@@ -0,0 +1,1620 @@
+/***************************************************************************/
+/* */
+/* t1decode.c */
+/* */
+/* PostScript Type 1 decoding routines (body). */
+/* */
+/* Copyright 2000-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "t1decode.h"
+#include "psobjs.h"
+
+#include "psauxerr.h"
+
+/* ensure proper sign extension */
+#define Fix2Int( f ) ( (FT_Int)(FT_Short)( (f) >> 16 ) )
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1decode
+
+
+ typedef enum T1_Operator_
+ {
+ op_none = 0,
+ op_endchar,
+ op_hsbw,
+ op_seac,
+ op_sbw,
+ op_closepath,
+ op_hlineto,
+ op_hmoveto,
+ op_hvcurveto,
+ op_rlineto,
+ op_rmoveto,
+ op_rrcurveto,
+ op_vhcurveto,
+ op_vlineto,
+ op_vmoveto,
+ op_dotsection,
+ op_hstem,
+ op_hstem3,
+ op_vstem,
+ op_vstem3,
+ op_div,
+ op_callothersubr,
+ op_callsubr,
+ op_pop,
+ op_return,
+ op_setcurrentpoint,
+ op_unknown15,
+
+ op_max /* never remove this one */
+
+ } T1_Operator;
+
+
+ static
+ const FT_Int t1_args_count[op_max] =
+ {
+ 0, /* none */
+ 0, /* endchar */
+ 2, /* hsbw */
+ 5, /* seac */
+ 4, /* sbw */
+ 0, /* closepath */
+ 1, /* hlineto */
+ 1, /* hmoveto */
+ 4, /* hvcurveto */
+ 2, /* rlineto */
+ 2, /* rmoveto */
+ 6, /* rrcurveto */
+ 4, /* vhcurveto */
+ 1, /* vlineto */
+ 1, /* vmoveto */
+ 0, /* dotsection */
+ 2, /* hstem */
+ 6, /* hstem3 */
+ 2, /* vstem */
+ 6, /* vstem3 */
+ 2, /* div */
+ -1, /* callothersubr */
+ 1, /* callsubr */
+ 0, /* pop */
+ 0, /* return */
+ 2, /* setcurrentpoint */
+ 2 /* opcode 15 (undocumented and obsolete) */
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_lookup_glyph_by_stdcharcode */
+ /* */
+ /* <Description> */
+ /* Looks up a given glyph by its StandardEncoding charcode. Used to */
+ /* implement the SEAC Type 1 operator. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* charcode :: The character code to look for. */
+ /* */
+ /* <Return> */
+ /* A glyph index in the font face. Returns -1 if the corresponding */
+ /* glyph wasn't found. */
+ /* */
+ static FT_Int
+ t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder,
+ FT_Int charcode )
+ {
+ FT_UInt n;
+ const FT_String* glyph_name;
+ FT_Service_PsCMaps psnames = decoder->psnames;
+
+
+ /* check range of standard char code */
+ if ( charcode < 0 || charcode > 255 )
+ return -1;
+
+ glyph_name = psnames->adobe_std_strings(
+ psnames->adobe_std_encoding[charcode]);
+
+ for ( n = 0; n < decoder->num_glyphs; n++ )
+ {
+ FT_String* name = (FT_String*)decoder->glyph_names[n];
+
+
+ if ( name &&
+ name[0] == glyph_name[0] &&
+ ft_strcmp( name, glyph_name ) == 0 )
+ return n;
+ }
+
+ return -1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1operator_seac */
+ /* */
+ /* <Description> */
+ /* Implements the `seac' Type 1 operator for a Type 1 decoder. */
+ /* */
+ /* <Input> */
+ /* decoder :: The current CID decoder. */
+ /* */
+ /* asb :: The accent's side bearing. */
+ /* */
+ /* adx :: The horizontal offset of the accent. */
+ /* */
+ /* ady :: The vertical offset of the accent. */
+ /* */
+ /* bchar :: The base character's StandardEncoding charcode. */
+ /* */
+ /* achar :: The accent character's StandardEncoding charcode. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ t1operator_seac( T1_Decoder decoder,
+ FT_Pos asb,
+ FT_Pos adx,
+ FT_Pos ady,
+ FT_Int bchar,
+ FT_Int achar )
+ {
+ FT_Error error;
+ FT_Int bchar_index, achar_index;
+#if 0
+ FT_Int n_base_points;
+ FT_Outline* base = decoder->builder.base;
+#endif
+ FT_Vector left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ T1_Face face = (T1_Face)decoder->builder.face;
+#endif
+
+
+ if ( decoder->seac )
+ {
+ FT_ERROR(( "t1operator_seac: invalid nested seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ if ( decoder->builder.metrics_only )
+ {
+ FT_ERROR(( "t1operator_seac: unexpected seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* seac weirdness */
+ adx += decoder->builder.left_bearing.x;
+
+ /* `glyph_names' is set to 0 for CID fonts which do not */
+ /* include an encoding. How can we deal with these? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( decoder->glyph_names == 0 &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( decoder->glyph_names == 0 )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ FT_ERROR(( "t1operator_seac:"
+ " glyph names table not available in this font\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( face->root.internal->incremental_interface )
+ {
+ /* the caller must handle the font encoding also */
+ bchar_index = bchar;
+ achar_index = achar;
+ }
+ else
+#endif
+ {
+ bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );
+ achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );
+ }
+
+ if ( bchar_index < 0 || achar_index < 0 )
+ {
+ FT_ERROR(( "t1operator_seac:"
+ " invalid seac character code arguments\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* if we are trying to load a composite glyph, do not load the */
+ /* accent character and return the array of subglyphs. */
+ if ( decoder->builder.no_recurse )
+ {
+ FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph;
+ FT_GlyphLoader loader = glyph->internal->loader;
+ FT_SubGlyph subg;
+
+
+ /* reallocate subglyph array if necessary */
+ error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+ if ( error )
+ goto Exit;
+
+ subg = loader->current.subglyphs;
+
+ /* subglyph 0 = base character */
+ subg->index = bchar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+ FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+ subg->arg1 = 0;
+ subg->arg2 = 0;
+ subg++;
+
+ /* subglyph 1 = accent character */
+ subg->index = achar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+ subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb );
+ subg->arg2 = (FT_Int)FIXED_TO_INT( ady );
+
+ /* set up remaining glyph fields */
+ glyph->num_subglyphs = 2;
+ glyph->subglyphs = loader->base.subglyphs;
+ glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ loader->current.num_subglyphs = 2;
+ goto Exit;
+ }
+
+ /* First load `bchar' in builder */
+ /* now load the unscaled outline */
+
+ FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */
+
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = t1_decoder_parse_glyph( decoder, bchar_index );
+ decoder->seac = FALSE;
+ if ( error )
+ goto Exit;
+
+ /* save the left bearing and width of the base character */
+ /* as they will be erased by the next load. */
+
+ left_bearing = decoder->builder.left_bearing;
+ advance = decoder->builder.advance;
+
+ decoder->builder.left_bearing.x = 0;
+ decoder->builder.left_bearing.y = 0;
+
+ decoder->builder.pos_x = adx - asb;
+ decoder->builder.pos_y = ady;
+
+ /* Now load `achar' on top of */
+ /* the base outline */
+
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = t1_decoder_parse_glyph( decoder, achar_index );
+ decoder->seac = FALSE;
+ if ( error )
+ goto Exit;
+
+ /* restore the left side bearing and */
+ /* advance width of the base character */
+
+ decoder->builder.left_bearing = left_bearing;
+ decoder->builder.advance = advance;
+
+ decoder->builder.pos_x = 0;
+ decoder->builder.pos_y = 0;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_decoder_parse_charstrings */
+ /* */
+ /* <Description> */
+ /* Parses a given Type 1 charstrings program. */
+ /* */
+ /* <Input> */
+ /* decoder :: The current Type 1 decoder. */
+ /* */
+ /* charstring_base :: The base address of the charstring stream. */
+ /* */
+ /* charstring_len :: The length in bytes of the charstring stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_parse_charstrings( T1_Decoder decoder,
+ FT_Byte* charstring_base,
+ FT_UInt charstring_len )
+ {
+ FT_Error error;
+ T1_Decoder_Zone zone;
+ FT_Byte* ip;
+ FT_Byte* limit;
+ T1_Builder builder = &decoder->builder;
+ FT_Pos x, y, orig_x, orig_y;
+ FT_Int known_othersubr_result_cnt = 0;
+ FT_Int unknown_othersubr_result_cnt = 0;
+ FT_Bool large_int;
+ FT_Fixed seed;
+
+ T1_Hints_Funcs hinter;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_Bool bol = TRUE;
+#endif
+
+
+ /* compute random seed from stack address of parameter */
+ seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^
+ (FT_PtrDist)(char*)&decoder ^
+ (FT_PtrDist)(char*)&charstring_base ) &
+ FT_ULONG_MAX ) ;
+ seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+ if ( seed == 0 )
+ seed = 0x7384;
+
+ /* First of all, initialize the decoder */
+ decoder->top = decoder->stack;
+ decoder->zone = decoder->zones;
+ zone = decoder->zones;
+
+ builder->parse_state = T1_Parse_Start;
+
+ hinter = (T1_Hints_Funcs)builder->hints_funcs;
+
+ /* a font that reads BuildCharArray without setting */
+ /* its values first is buggy, but ... */
+ FT_ASSERT( ( decoder->len_buildchar == 0 ) ==
+ ( decoder->buildchar == NULL ) );
+
+ if ( decoder->buildchar && decoder->len_buildchar > 0 )
+ ft_memset( &decoder->buildchar[0],
+ 0,
+ sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );
+
+ FT_TRACE4(( "\n"
+ "Start charstring\n" ));
+
+ zone->base = charstring_base;
+ limit = zone->limit = charstring_base + charstring_len;
+ ip = zone->cursor = zone->base;
+
+ error = FT_Err_Ok;
+
+ x = orig_x = builder->pos_x;
+ y = orig_y = builder->pos_y;
+
+ /* begin hints recording session, if any */
+ if ( hinter )
+ hinter->open( hinter->hints );
+
+ large_int = FALSE;
+
+ /* now, execute loop */
+ while ( ip < limit )
+ {
+ FT_Long* top = decoder->top;
+ T1_Operator op = op_none;
+ FT_Int32 value = 0;
+
+
+ FT_ASSERT( known_othersubr_result_cnt == 0 ||
+ unknown_othersubr_result_cnt == 0 );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( bol )
+ {
+ FT_TRACE5(( " (%d)", decoder->top - decoder->stack ));
+ bol = FALSE;
+ }
+#endif
+
+ /*********************************************************************/
+ /* */
+ /* Decode operator or operand */
+ /* */
+ /* */
+
+ /* first of all, decompress operator or value */
+ switch ( *ip++ )
+ {
+ case 1:
+ op = op_hstem;
+ break;
+
+ case 3:
+ op = op_vstem;
+ break;
+ case 4:
+ op = op_vmoveto;
+ break;
+ case 5:
+ op = op_rlineto;
+ break;
+ case 6:
+ op = op_hlineto;
+ break;
+ case 7:
+ op = op_vlineto;
+ break;
+ case 8:
+ op = op_rrcurveto;
+ break;
+ case 9:
+ op = op_closepath;
+ break;
+ case 10:
+ op = op_callsubr;
+ break;
+ case 11:
+ op = op_return;
+ break;
+
+ case 13:
+ op = op_hsbw;
+ break;
+ case 14:
+ op = op_endchar;
+ break;
+
+ case 15: /* undocumented, obsolete operator */
+ op = op_unknown15;
+ break;
+
+ case 21:
+ op = op_rmoveto;
+ break;
+ case 22:
+ op = op_hmoveto;
+ break;
+
+ case 30:
+ op = op_vhcurveto;
+ break;
+ case 31:
+ op = op_hvcurveto;
+ break;
+
+ case 12:
+ if ( ip > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid escape (12+EOF)\n" ));
+ goto Syntax_Error;
+ }
+
+ switch ( *ip++ )
+ {
+ case 0:
+ op = op_dotsection;
+ break;
+ case 1:
+ op = op_vstem3;
+ break;
+ case 2:
+ op = op_hstem3;
+ break;
+ case 6:
+ op = op_seac;
+ break;
+ case 7:
+ op = op_sbw;
+ break;
+ case 12:
+ op = op_div;
+ break;
+ case 16:
+ op = op_callothersubr;
+ break;
+ case 17:
+ op = op_pop;
+ break;
+ case 33:
+ op = op_setcurrentpoint;
+ break;
+
+ default:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid escape (12+%d)\n",
+ ip[-1] ));
+ goto Syntax_Error;
+ }
+ break;
+
+ case 255: /* four bytes integer */
+ if ( ip + 4 > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected EOF in integer\n" ));
+ goto Syntax_Error;
+ }
+
+ value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+ ( (FT_UInt32)ip[1] << 16 ) |
+ ( (FT_UInt32)ip[2] << 8 ) |
+ (FT_UInt32)ip[3] );
+ ip += 4;
+
+ /* According to the specification, values > 32000 or < -32000 must */
+ /* be followed by a `div' operator to make the result be in the */
+ /* range [-32000;32000]. We expect that the second argument of */
+ /* `div' is not a large number. Additionally, we don't handle */
+ /* stuff like `<large1> <large2> <num> div <num> div' or */
+ /* <large1> <large2> <num> div div'. This is probably not allowed */
+ /* anyway. */
+ if ( value > 32000 || value < -32000 )
+ {
+ if ( large_int )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no `div' after large integer\n" ));
+ }
+ else
+ large_int = TRUE;
+ }
+ else
+ {
+ if ( !large_int )
+ value = (FT_Int32)( (FT_UInt32)value << 16 );
+ }
+
+ break;
+
+ default:
+ if ( ip[-1] >= 32 )
+ {
+ if ( ip[-1] < 247 )
+ value = (FT_Int32)ip[-1] - 139;
+ else
+ {
+ if ( ++ip > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected EOF in integer\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( ip[-2] < 251 )
+ value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;
+ else
+ value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );
+ }
+
+ if ( !large_int )
+ value = (FT_Int32)( (FT_UInt32)value << 16 );
+ }
+ else
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid byte (%d)\n", ip[-1] ));
+ goto Syntax_Error;
+ }
+ }
+
+ if ( unknown_othersubr_result_cnt > 0 )
+ {
+ switch ( op )
+ {
+ case op_callsubr:
+ case op_return:
+ case op_none:
+ case op_pop:
+ break;
+
+ default:
+ /* all operands have been transferred by previous pops */
+ unknown_othersubr_result_cnt = 0;
+ break;
+ }
+ }
+
+ if ( large_int && !( op == op_none || op == op_div ) )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no `div' after large integer\n" ));
+
+ large_int = FALSE;
+ }
+
+ /*********************************************************************/
+ /* */
+ /* Push value on stack, or process operator */
+ /* */
+ /* */
+ if ( op == op_none )
+ {
+ if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" ));
+ goto Syntax_Error;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( large_int )
+ FT_TRACE4(( " %ld", value ));
+ else
+ FT_TRACE4(( " %ld", Fix2Int( value ) ));
+#endif
+
+ *top++ = value;
+ decoder->top = top;
+ }
+ else if ( op == op_callothersubr ) /* callothersubr */
+ {
+ FT_Int subr_no;
+ FT_Int arg_cnt;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( " callothersubr\n" ));
+ bol = TRUE;
+#endif
+
+ if ( top - decoder->stack < 2 )
+ goto Stack_Underflow;
+
+ top -= 2;
+
+ subr_no = Fix2Int( top[1] );
+ arg_cnt = Fix2Int( top[0] );
+
+ /***********************************************************/
+ /* */
+ /* remove all operands to callothersubr from the stack */
+ /* */
+ /* for handled othersubrs, where we know the number of */
+ /* arguments, we increase the stack by the value of */
+ /* known_othersubr_result_cnt */
+ /* */
+ /* for unhandled othersubrs the following pops adjust the */
+ /* stack pointer as necessary */
+
+ if ( arg_cnt > top - decoder->stack )
+ goto Stack_Underflow;
+
+ top -= arg_cnt;
+
+ known_othersubr_result_cnt = 0;
+ unknown_othersubr_result_cnt = 0;
+
+ /* XXX TODO: The checks to `arg_count == <whatever>' */
+ /* might not be correct; an othersubr expects a certain */
+ /* number of operands on the PostScript stack (as opposed */
+ /* to the T1 stack) but it doesn't have to put them there */
+ /* by itself; previous othersubrs might have left the */
+ /* operands there if they were not followed by an */
+ /* appropriate number of pops */
+ /* */
+ /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */
+ /* accept a font that contains charstrings like */
+ /* */
+ /* 100 200 2 20 callothersubr */
+ /* 300 1 20 callothersubr pop */
+ /* */
+ /* Perhaps this is the reason why BuildCharArray exists. */
+
+ switch ( subr_no )
+ {
+ case 0: /* end flex feature */
+ if ( arg_cnt != 3 )
+ goto Unexpected_OtherSubr;
+
+ if ( decoder->flex_state == 0 ||
+ decoder->num_flex_vectors != 7 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected flex end\n" ));
+ goto Syntax_Error;
+ }
+
+ /* the two `results' are popped by the following setcurrentpoint */
+ top[0] = x;
+ top[1] = y;
+ known_othersubr_result_cnt = 2;
+ break;
+
+ case 1: /* start flex feature */
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ decoder->flex_state = 1;
+ decoder->num_flex_vectors = 0;
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 6 ) )
+ != FT_Err_Ok )
+ goto Fail;
+ break;
+
+ case 2: /* add flex vectors */
+ {
+ FT_Int idx;
+
+
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ if ( decoder->flex_state == 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " missing flex start\n" ));
+ goto Syntax_Error;
+ }
+
+ /* note that we should not add a point for index 0; */
+ /* this will move our current position to the flex */
+ /* point without adding any point to the outline */
+ idx = decoder->num_flex_vectors++;
+ if ( idx > 0 && idx < 7 )
+ t1_builder_add_point( builder,
+ x,
+ y,
+ (FT_Byte)( idx == 3 || idx == 6 ) );
+ }
+ break;
+
+ case 3: /* change hints */
+ if ( arg_cnt != 1 )
+ goto Unexpected_OtherSubr;
+
+ known_othersubr_result_cnt = 1;
+
+ if ( hinter )
+ hinter->reset( hinter->hints, builder->current->n_points );
+ break;
+
+ case 12:
+ case 13:
+ /* counter control hints, clear stack */
+ top = decoder->stack;
+ break;
+
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18: /* multiple masters */
+ {
+ PS_Blend blend = decoder->blend;
+ FT_UInt num_points, nn, mm;
+ FT_Long* delta;
+ FT_Long* values;
+
+
+ if ( !blend )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected multiple masters operator\n" ));
+ goto Syntax_Error;
+ }
+
+ num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );
+ if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " incorrect number of multiple masters arguments\n" ));
+ goto Syntax_Error;
+ }
+
+ /* We want to compute */
+ /* */
+ /* a0*w0 + a1*w1 + ... + ak*wk */
+ /* */
+ /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */
+ /* */
+ /* However, given that w0 + w1 + ... + wk == 1, we can */
+ /* rewrite it easily as */
+ /* */
+ /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */
+ /* */
+ /* where k == num_designs-1. */
+ /* */
+ /* I guess that's why it's written in this `compact' */
+ /* form. */
+ /* */
+ delta = top + num_points;
+ values = top;
+ for ( nn = 0; nn < num_points; nn++ )
+ {
+ FT_Long tmp = values[0];
+
+
+ for ( mm = 1; mm < blend->num_designs; mm++ )
+ tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+
+ *values++ = tmp;
+ }
+
+ known_othersubr_result_cnt = num_points;
+ break;
+ }
+
+ case 19:
+ /* <idx> 1 19 callothersubr */
+ /* => replace elements starting from index cvi( <idx> ) */
+ /* of BuildCharArray with WeightVector */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 1 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[0] );
+
+ if ( idx < 0 ||
+ idx + blend->num_designs > decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ ft_memcpy( &decoder->buildchar[idx],
+ blend->weight_vector,
+ blend->num_designs *
+ sizeof ( blend->weight_vector[0] ) );
+ }
+ break;
+
+ case 20:
+ /* <arg1> <arg2> 2 20 callothersubr pop */
+ /* ==> push <arg1> + <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] += top[1]; /* XXX (over|under)flow */
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 21:
+ /* <arg1> <arg2> 2 21 callothersubr pop */
+ /* ==> push <arg1> - <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] -= top[1]; /* XXX (over|under)flow */
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 22:
+ /* <arg1> <arg2> 2 22 callothersubr pop */
+ /* ==> push <arg1> * <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] = FT_MulFix( top[0], top[1] );
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 23:
+ /* <arg1> <arg2> 2 23 callothersubr pop */
+ /* ==> push <arg1> / <arg2> onto T1 stack */
+ if ( arg_cnt != 2 || top[1] == 0 )
+ goto Unexpected_OtherSubr;
+
+ top[0] = FT_DivFix( top[0], top[1] );
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 24:
+ /* <val> <idx> 2 24 callothersubr */
+ /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 2 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[1] );
+
+ if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ decoder->buildchar[idx] = top[0];
+ }
+ break;
+
+ case 25:
+ /* <idx> 1 25 callothersubr pop */
+ /* ==> push BuildCharArray[cvi( idx )] */
+ /* onto T1 stack */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 1 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[0] );
+
+ if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ top[0] = decoder->buildchar[idx];
+ }
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+#if 0
+ case 26:
+ /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */
+ /* leave mark on T1 stack */
+ /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */
+ XXX which routine has left its mark on the (PostScript) stack?;
+ break;
+#endif
+
+ case 27:
+ /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */
+ /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */
+ /* otherwise push <res2> */
+ if ( arg_cnt != 4 )
+ goto Unexpected_OtherSubr;
+
+ if ( top[2] > top[3] )
+ top[0] = top[1];
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 28:
+ /* 0 28 callothersubr pop */
+ /* => push random value from interval [0, 1) onto stack */
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ {
+ FT_Fixed Rand;
+
+
+ Rand = seed;
+ if ( Rand >= 0x8000L )
+ Rand++;
+
+ top[0] = Rand;
+
+ seed = FT_MulFix( seed, 0x10000L - seed );
+ if ( seed == 0 )
+ seed += 0x2873;
+ }
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ default:
+ if ( arg_cnt >= 0 && subr_no >= 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unknown othersubr [%d %d], wish me luck\n",
+ arg_cnt, subr_no ));
+ unknown_othersubr_result_cnt = arg_cnt;
+ break;
+ }
+ /* fall through */
+
+ Unexpected_OtherSubr:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid othersubr [%d %d]\n", arg_cnt, subr_no ));
+ goto Syntax_Error;
+ }
+
+ top += known_othersubr_result_cnt;
+
+ decoder->top = top;
+ }
+ else /* general operator */
+ {
+ FT_Int num_args = t1_args_count[op];
+
+
+ FT_ASSERT( num_args >= 0 );
+
+ if ( top - decoder->stack < num_args )
+ goto Stack_Underflow;
+
+ /* XXX Operators usually take their operands from the */
+ /* bottom of the stack, i.e., the operands are */
+ /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */
+ /* only div, callsubr, and callothersubr are different. */
+ /* In practice it doesn't matter (?). */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ switch ( op )
+ {
+ case op_callsubr:
+ case op_div:
+ case op_callothersubr:
+ case op_pop:
+ case op_return:
+ break;
+
+ default:
+ if ( top - decoder->stack != num_args )
+ FT_TRACE0(( "t1_decoder_parse_charstrings:"
+ " too much operands on the stack"
+ " (seen %d, expected %d)\n",
+ top - decoder->stack, num_args ));
+ break;
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ top -= num_args;
+
+ switch ( op )
+ {
+ case op_endchar:
+ FT_TRACE4(( " endchar\n" ));
+
+ t1_builder_close_contour( builder );
+
+ /* close hints recording session */
+ if ( hinter )
+ {
+ if ( hinter->close( hinter->hints, builder->current->n_points ) )
+ goto Syntax_Error;
+
+ /* apply hints to the loaded glyph outline now */
+ hinter->apply( hinter->hints,
+ builder->current,
+ (PSH_Globals)builder->hints_globals,
+ decoder->hint_mode );
+ }
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+
+ /* the compiler should optimize away this empty loop but ... */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( decoder->len_buildchar > 0 )
+ {
+ FT_UInt i;
+
+
+ FT_TRACE4(( "BuildCharArray = [ " ));
+
+ for ( i = 0; i < decoder->len_buildchar; ++i )
+ FT_TRACE4(( "%d ", decoder->buildchar[i] ));
+
+ FT_TRACE4(( "]\n" ));
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ FT_TRACE4(( "\n" ));
+
+ /* return now! */
+ return FT_Err_Ok;
+
+ case op_hsbw:
+ FT_TRACE4(( " hsbw" ));
+
+ builder->parse_state = T1_Parse_Have_Width;
+
+ builder->left_bearing.x += top[0];
+ builder->advance.x = top[1];
+ builder->advance.y = 0;
+
+ orig_x = x = builder->pos_x + top[0];
+ orig_y = y = builder->pos_y;
+
+ FT_UNUSED( orig_y );
+
+ /* the `metrics_only' indicates that we only want to compute */
+ /* the glyph's metrics (lsb + advance width), not load the */
+ /* rest of it; so exit immediately */
+ if ( builder->metrics_only )
+ return FT_Err_Ok;
+
+ break;
+
+ case op_seac:
+ return t1operator_seac( decoder,
+ top[0],
+ top[1],
+ top[2],
+ Fix2Int( top[3] ),
+ Fix2Int( top[4] ) );
+
+ case op_sbw:
+ FT_TRACE4(( " sbw" ));
+
+ builder->parse_state = T1_Parse_Have_Width;
+
+ builder->left_bearing.x += top[0];
+ builder->left_bearing.y += top[1];
+ builder->advance.x = top[2];
+ builder->advance.y = top[3];
+
+ x = builder->pos_x + top[0];
+ y = builder->pos_y + top[1];
+
+ /* the `metrics_only' indicates that we only want to compute */
+ /* the glyph's metrics (lsb + advance width), not load the */
+ /* rest of it; so exit immediately */
+ if ( builder->metrics_only )
+ return FT_Err_Ok;
+
+ break;
+
+ case op_closepath:
+ FT_TRACE4(( " closepath" ));
+
+ /* if there is no path, `closepath' is a no-op */
+ if ( builder->parse_state == T1_Parse_Have_Path ||
+ builder->parse_state == T1_Parse_Have_Moveto )
+ t1_builder_close_contour( builder );
+
+ builder->parse_state = T1_Parse_Have_Width;
+ break;
+
+ case op_hlineto:
+ FT_TRACE4(( " hlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ goto Add_Line;
+
+ case op_hmoveto:
+ FT_TRACE4(( " hmoveto" ));
+
+ x += top[0];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_hvcurveto:
+ FT_TRACE4(( " hvcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[1];
+ y += top[2];
+ t1_builder_add_point( builder, x, y, 0 );
+ y += top[3];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_rlineto:
+ FT_TRACE4(( " rlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ y += top[1];
+
+ Add_Line:
+ if ( ( error = t1_builder_add_point1( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+ break;
+
+ case op_rmoveto:
+ FT_TRACE4(( " rmoveto" ));
+
+ x += top[0];
+ y += top[1];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_rrcurveto:
+ FT_TRACE4(( " rrcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ y += top[1];
+ t1_builder_add_point( builder, x, y, 0 );
+
+ x += top[2];
+ y += top[3];
+ t1_builder_add_point( builder, x, y, 0 );
+
+ x += top[4];
+ y += top[5];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_vhcurveto:
+ FT_TRACE4(( " vhcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ y += top[0];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[1];
+ y += top[2];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[3];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_vlineto:
+ FT_TRACE4(( " vlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ y += top[0];
+ goto Add_Line;
+
+ case op_vmoveto:
+ FT_TRACE4(( " vmoveto" ));
+
+ y += top[0];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_div:
+ FT_TRACE4(( " div" ));
+
+ /* if `large_int' is set, we divide unscaled numbers; */
+ /* otherwise, we divide numbers in 16.16 format -- */
+ /* in both cases, it is the same operation */
+ *top = FT_DivFix( top[0], top[1] );
+ ++top;
+
+ large_int = FALSE;
+ break;
+
+ case op_callsubr:
+ {
+ FT_Int idx;
+
+
+ FT_TRACE4(( " callsubr" ));
+
+ idx = Fix2Int( top[0] );
+ if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid subrs index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+
+ /* The Type 1 driver stores subroutines without the seed bytes. */
+ /* The CID driver stores subroutines with seed bytes. This */
+ /* case is taken care of when decoder->subrs_len == 0. */
+ zone->base = decoder->subrs[idx];
+
+ if ( decoder->subrs_len )
+ zone->limit = zone->base + decoder->subrs_len[idx];
+ else
+ {
+ /* We are using subroutines from a CID font. We must adjust */
+ /* for the seed bytes. */
+ zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+ zone->limit = decoder->subrs[idx + 1];
+ }
+
+ zone->cursor = zone->base;
+
+ if ( !zone->base )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ break;
+ }
+
+ case op_pop:
+ FT_TRACE4(( " pop" ));
+
+ if ( known_othersubr_result_cnt > 0 )
+ {
+ known_othersubr_result_cnt--;
+ /* ignore, we pushed the operands ourselves */
+ break;
+ }
+
+ if ( unknown_othersubr_result_cnt == 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no more operands for othersubr\n" ));
+ goto Syntax_Error;
+ }
+
+ unknown_othersubr_result_cnt--;
+ top++; /* `push' the operand to callothersubr onto the stack */
+ break;
+
+ case op_return:
+ FT_TRACE4(( " return" ));
+
+ if ( zone <= decoder->zones )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected return\n" ));
+ goto Syntax_Error;
+ }
+
+ zone--;
+ ip = zone->cursor;
+ limit = zone->limit;
+ decoder->zone = zone;
+ break;
+
+ case op_dotsection:
+ FT_TRACE4(( " dotsection" ));
+
+ break;
+
+ case op_hstem:
+ FT_TRACE4(( " hstem" ));
+
+ /* record horizontal hint */
+ if ( hinter )
+ {
+ /* top[0] += builder->left_bearing.y; */
+ hinter->stem( hinter->hints, 1, top );
+ }
+ break;
+
+ case op_hstem3:
+ FT_TRACE4(( " hstem3" ));
+
+ /* record horizontal counter-controlled hints */
+ if ( hinter )
+ hinter->stem3( hinter->hints, 1, top );
+ break;
+
+ case op_vstem:
+ FT_TRACE4(( " vstem" ));
+
+ /* record vertical hint */
+ if ( hinter )
+ {
+ top[0] += orig_x;
+ hinter->stem( hinter->hints, 0, top );
+ }
+ break;
+
+ case op_vstem3:
+ FT_TRACE4(( " vstem3" ));
+
+ /* record vertical counter-controlled hints */
+ if ( hinter )
+ {
+ FT_Pos dx = orig_x;
+
+
+ top[0] += dx;
+ top[2] += dx;
+ top[4] += dx;
+ hinter->stem3( hinter->hints, 0, top );
+ }
+ break;
+
+ case op_setcurrentpoint:
+ FT_TRACE4(( " setcurrentpoint" ));
+
+ /* From the T1 specification, section 6.4: */
+ /* */
+ /* The setcurrentpoint command is used only in */
+ /* conjunction with results from OtherSubrs procedures. */
+
+ /* known_othersubr_result_cnt != 0 is already handled */
+ /* above. */
+
+ /* Note, however, that both Ghostscript and Adobe */
+ /* Distiller handle this situation by silently ignoring */
+ /* the inappropriate `setcurrentpoint' instruction. So */
+ /* we do the same. */
+#if 0
+
+ if ( decoder->flex_state != 1 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected `setcurrentpoint'\n" ));
+ goto Syntax_Error;
+ }
+ else
+ ...
+#endif
+
+ x = top[0];
+ y = top[1];
+ decoder->flex_state = 0;
+ break;
+
+ case op_unknown15:
+ FT_TRACE4(( " opcode_15" ));
+ /* nothing to do except to pop the two arguments */
+ break;
+
+ default:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unhandled opcode %d\n", op ));
+ goto Syntax_Error;
+ }
+
+ /* XXX Operators usually clear the operand stack; */
+ /* only div, callsubr, callothersubr, pop, and */
+ /* return are different. */
+ /* In practice it doesn't matter (?). */
+
+ decoder->top = top;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( "\n" ));
+ bol = TRUE;
+#endif
+
+ } /* general operator processing */
+
+ } /* while ip < limit */
+
+ FT_TRACE4(( "..end..\n\n" ));
+
+ Fail:
+ return error;
+
+ Syntax_Error:
+ return FT_THROW( Syntax_Error );
+
+ Stack_Underflow:
+ return FT_THROW( Stack_Underflow );
+ }
+
+
+ /* parse a single Type 1 glyph */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_parse_glyph( T1_Decoder decoder,
+ FT_UInt glyph )
+ {
+ return decoder->parse_callback( decoder, glyph );
+ }
+
+
+ /* initialize T1 decoder */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_init( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback parse_callback )
+ {
+ FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+ /* retrieve PSNames interface from list of current modules */
+ {
+ FT_Service_PsCMaps psnames = 0;
+
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ if ( !psnames )
+ {
+ FT_ERROR(( "t1_decoder_init:"
+ " the `psnames' module is not available\n" ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ decoder->psnames = psnames;
+ }
+
+ t1_builder_init( &decoder->builder, face, size, slot, hinting );
+
+ /* decoder->buildchar and decoder->len_buildchar have to be */
+ /* initialized by the caller since we cannot know the length */
+ /* of the BuildCharArray */
+
+ decoder->num_glyphs = (FT_UInt)face->num_glyphs;
+ decoder->glyph_names = glyph_names;
+ decoder->hint_mode = hint_mode;
+ decoder->blend = blend;
+ decoder->parse_callback = parse_callback;
+
+ decoder->funcs = t1_decoder_funcs;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* finalize T1 decoder */
+ FT_LOCAL_DEF( void )
+ t1_decoder_done( T1_Decoder decoder )
+ {
+ t1_builder_done( &decoder->builder );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
new file mode 100644
index 0000000000..23bd99fa63
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/* */
+/* t1decode.h */
+/* */
+/* PostScript Type 1 decoding routines (specification). */
+/* */
+/* Copyright 2000-2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1DECODE_H__
+#define __T1DECODE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_CALLBACK_TABLE
+ const T1_Decoder_FuncsRec t1_decoder_funcs;
+
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_parse_glyph( T1_Decoder decoder,
+ FT_UInt glyph_index );
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_parse_charstrings( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_init( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback parse_glyph );
+
+ FT_LOCAL( void )
+ t1_decoder_done( T1_Decoder decoder );
+
+
+FT_END_HEADER
+
+#endif /* __T1DECODE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
new file mode 100644
index 0000000000..779f1b0b82
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/pshinter Jamfile
+#
+# Copyright 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = pshrec pshglob pshalgo pshmod pshpic ;
+ }
+ else
+ {
+ _sources = pshinter ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pshinter Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
new file mode 100644
index 0000000000..27cf308a76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* pshinter.c */
+/* */
+/* FreeType PostScript Hinting module */
+/* */
+/* Copyright 2001, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "pshpic.c"
+#include "pshrec.c"
+#include "pshglob.c"
+#include "pshalgo.c"
+#include "pshmod.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
new file mode 100644
index 0000000000..ed24eb7fa8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSHinter module definition
+#
+
+
+# Copyright 1996-2001, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSHINTER_MODULE
+
+define PSHINTER_MODULE
+$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
new file mode 100644
index 0000000000..96f2cd502d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
@@ -0,0 +1,2305 @@
+/***************************************************************************/
+/* */
+/* pshalgo.c */
+/* */
+/* PostScript hinting algorithm (body). */
+/* */
+/* Copyright 2001-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_pshalgo2
+
+
+#ifdef DEBUG_HINTER
+ PSH_Hint_Table ps_debug_hint_table = 0;
+ PSH_HintFunc ps_debug_hint_func = 0;
+ PSH_Glyph ps_debug_glyph = 0;
+#endif
+
+
+#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */
+ /* and similar glyphs */
+#define STRONGER /* slightly increase the contrast of smooth */
+ /* hinting */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BASIC HINTS RECORDINGS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* return true if two stem hints overlap */
+ static FT_Int
+ psh_hint_overlap( PSH_Hint hint1,
+ PSH_Hint hint2 )
+ {
+ return hint1->org_pos + hint1->org_len >= hint2->org_pos &&
+ hint2->org_pos + hint2->org_len >= hint1->org_pos;
+ }
+
+
+ /* destroy hints table */
+ static void
+ psh_hint_table_done( PSH_Hint_Table table,
+ FT_Memory memory )
+ {
+ FT_FREE( table->zones );
+ table->num_zones = 0;
+ table->zone = 0;
+
+ FT_FREE( table->sort );
+ FT_FREE( table->hints );
+ table->num_hints = 0;
+ table->max_hints = 0;
+ table->sort_global = 0;
+ }
+
+
+ /* deactivate all hints in a table */
+ static void
+ psh_hint_table_deactivate( PSH_Hint_Table table )
+ {
+ FT_UInt count = table->max_hints;
+ PSH_Hint hint = table->hints;
+
+
+ for ( ; count > 0; count--, hint++ )
+ {
+ psh_hint_deactivate( hint );
+ hint->order = -1;
+ }
+ }
+
+
+ /* internal function to record a new hint */
+ static void
+ psh_hint_table_record( PSH_Hint_Table table,
+ FT_UInt idx )
+ {
+ PSH_Hint hint = table->hints + idx;
+
+
+ if ( idx >= table->max_hints )
+ {
+ FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+ return;
+ }
+
+ /* ignore active hints */
+ if ( psh_hint_is_active( hint ) )
+ return;
+
+ psh_hint_activate( hint );
+
+ /* now scan the current active hint set to check */
+ /* whether `hint' overlaps with another hint */
+ {
+ PSH_Hint* sorted = table->sort_global;
+ FT_UInt count = table->num_hints;
+ PSH_Hint hint2;
+
+
+ hint->parent = 0;
+ for ( ; count > 0; count--, sorted++ )
+ {
+ hint2 = sorted[0];
+
+ if ( psh_hint_overlap( hint, hint2 ) )
+ {
+ hint->parent = hint2;
+ break;
+ }
+ }
+ }
+
+ if ( table->num_hints < table->max_hints )
+ table->sort_global[table->num_hints++] = hint;
+ else
+ FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" ));
+ }
+
+
+ static void
+ psh_hint_table_record_mask( PSH_Hint_Table table,
+ PS_Mask hint_mask )
+ {
+ FT_Int mask = 0, val = 0;
+ FT_Byte* cursor = hint_mask->bytes;
+ FT_UInt idx, limit;
+
+
+ limit = hint_mask->num_bits;
+
+ for ( idx = 0; idx < limit; idx++ )
+ {
+ if ( mask == 0 )
+ {
+ val = *cursor++;
+ mask = 0x80;
+ }
+
+ if ( val & mask )
+ psh_hint_table_record( table, idx );
+
+ mask >>= 1;
+ }
+ }
+
+
+ /* create hints table */
+ static FT_Error
+ psh_hint_table_init( PSH_Hint_Table table,
+ PS_Hint_Table hints,
+ PS_Mask_Table hint_masks,
+ PS_Mask_Table counter_masks,
+ FT_Memory memory )
+ {
+ FT_UInt count;
+ FT_Error error;
+
+ FT_UNUSED( counter_masks );
+
+
+ count = hints->num_hints;
+
+ /* allocate our tables */
+ if ( FT_NEW_ARRAY( table->sort, 2 * count ) ||
+ FT_NEW_ARRAY( table->hints, count ) ||
+ FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )
+ goto Exit;
+
+ table->max_hints = count;
+ table->sort_global = table->sort + count;
+ table->num_hints = 0;
+ table->num_zones = 0;
+ table->zone = 0;
+
+ /* initialize the `table->hints' array */
+ {
+ PSH_Hint write = table->hints;
+ PS_Hint read = hints->hints;
+
+
+ for ( ; count > 0; count--, write++, read++ )
+ {
+ write->org_pos = read->pos;
+ write->org_len = read->len;
+ write->flags = read->flags;
+ }
+ }
+
+ /* we now need to determine the initial `parent' stems; first */
+ /* activate the hints that are given by the initial hint masks */
+ if ( hint_masks )
+ {
+ PS_Mask mask = hint_masks->masks;
+
+
+ count = hint_masks->num_masks;
+ table->hint_masks = hint_masks;
+
+ for ( ; count > 0; count--, mask++ )
+ psh_hint_table_record_mask( table, mask );
+ }
+
+ /* finally, do a linear parse in case some hints were left alone */
+ if ( table->num_hints != table->max_hints )
+ {
+ FT_UInt idx;
+
+
+ FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" ));
+
+ count = table->max_hints;
+ for ( idx = 0; idx < count; idx++ )
+ psh_hint_table_record( table, idx );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ psh_hint_table_activate_mask( PSH_Hint_Table table,
+ PS_Mask hint_mask )
+ {
+ FT_Int mask = 0, val = 0;
+ FT_Byte* cursor = hint_mask->bytes;
+ FT_UInt idx, limit, count;
+
+
+ limit = hint_mask->num_bits;
+ count = 0;
+
+ psh_hint_table_deactivate( table );
+
+ for ( idx = 0; idx < limit; idx++ )
+ {
+ if ( mask == 0 )
+ {
+ val = *cursor++;
+ mask = 0x80;
+ }
+
+ if ( val & mask )
+ {
+ PSH_Hint hint = &table->hints[idx];
+
+
+ if ( !psh_hint_is_active( hint ) )
+ {
+ FT_UInt count2;
+
+#if 0
+ PSH_Hint* sort = table->sort;
+ PSH_Hint hint2;
+
+
+ for ( count2 = count; count2 > 0; count2--, sort++ )
+ {
+ hint2 = sort[0];
+ if ( psh_hint_overlap( hint, hint2 ) )
+ FT_TRACE0(( "psh_hint_table_activate_mask:"
+ " found overlapping hints\n" ))
+ }
+#else
+ count2 = 0;
+#endif
+
+ if ( count2 == 0 )
+ {
+ psh_hint_activate( hint );
+ if ( count < table->max_hints )
+ table->sort[count++] = hint;
+ else
+ FT_TRACE0(( "psh_hint_tableactivate_mask:"
+ " too many active hints\n" ));
+ }
+ }
+ }
+
+ mask >>= 1;
+ }
+ table->num_hints = count;
+
+ /* now, sort the hints; they are guaranteed to not overlap */
+ /* so we can compare their "org_pos" field directly */
+ {
+ FT_Int i1, i2;
+ PSH_Hint hint1, hint2;
+ PSH_Hint* sort = table->sort;
+
+
+ /* a simple bubble sort will do, since in 99% of cases, the hints */
+ /* will be already sorted -- and the sort will be linear */
+ for ( i1 = 1; i1 < (FT_Int)count; i1++ )
+ {
+ hint1 = sort[i1];
+ for ( i2 = i1 - 1; i2 >= 0; i2-- )
+ {
+ hint2 = sort[i2];
+
+ if ( hint2->org_pos < hint1->org_pos )
+ break;
+
+ sort[i2 + 1] = hint2;
+ sort[i2] = hint1;
+ }
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HINTS GRID-FITTING AND OPTIMIZATION *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 1
+ static FT_Pos
+ psh_dimension_quantize_len( PSH_Dimension dim,
+ FT_Pos len,
+ FT_Bool do_snapping )
+ {
+ if ( len <= 64 )
+ len = 64;
+ else
+ {
+ FT_Pos delta = len - dim->stdw.widths[0].cur;
+
+
+ if ( delta < 0 )
+ delta = -delta;
+
+ if ( delta < 40 )
+ {
+ len = dim->stdw.widths[0].cur;
+ if ( len < 48 )
+ len = 48;
+ }
+
+ if ( len < 3 * 64 )
+ {
+ delta = ( len & 63 );
+ len &= -64;
+
+ if ( delta < 10 )
+ len += delta;
+
+ else if ( delta < 32 )
+ len += 10;
+
+ else if ( delta < 54 )
+ len += 54;
+
+ else
+ len += delta;
+ }
+ else
+ len = FT_PIX_ROUND( len );
+ }
+
+ if ( do_snapping )
+ len = FT_PIX_ROUND( len );
+
+ return len;
+ }
+#endif /* 0 */
+
+
+#ifdef DEBUG_HINTER
+
+ static void
+ ps_simple_scale( PSH_Hint_Table table,
+ FT_Fixed scale,
+ FT_Fixed delta,
+ FT_Int dimension )
+ {
+ FT_UInt count;
+
+
+ for ( count = 0; count < table->max_hints; count++ )
+ {
+ PSH_Hint hint = table->hints + count;
+
+
+ hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ hint->cur_len = FT_MulFix( hint->org_len, scale );
+
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+ }
+ }
+
+#endif /* DEBUG_HINTER */
+
+
+ static FT_Fixed
+ psh_hint_snap_stem_side_delta( FT_Fixed pos,
+ FT_Fixed len )
+ {
+ FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos;
+ FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len;
+
+
+ if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )
+ return delta1;
+ else
+ return delta2;
+ }
+
+
+ static void
+ psh_hint_align( PSH_Hint hint,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( !psh_hint_is_fitted( hint ) )
+ {
+ FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ FT_Pos len = FT_MulFix( hint->org_len, scale );
+
+ FT_Int do_snapping;
+ FT_Pos fit_len;
+ PSH_AlignmentRec align;
+
+
+ /* ignore stem alignments when requested through the hint flags */
+ if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+ ( dimension == 1 && !glyph->do_vert_hints ) )
+ {
+ hint->cur_pos = pos;
+ hint->cur_len = len;
+
+ psh_hint_set_fitted( hint );
+ return;
+ }
+
+ /* perform stem snapping when requested - this is necessary
+ * for monochrome and LCD hinting modes only
+ */
+ do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||
+ ( dimension == 1 && glyph->do_vert_snapping );
+
+ hint->cur_len = fit_len = len;
+
+ /* check blue zones for horizontal stems */
+ align.align = PSH_BLUE_ALIGN_NONE;
+ align.align_bot = align.align_top = 0;
+
+ if ( dimension == 1 )
+ psh_blues_snap_stem( &globals->blues,
+ hint->org_pos + hint->org_len,
+ hint->org_pos,
+ &align );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ /* the top of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_top - fit_len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ /* the bottom of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_bot;
+ break;
+
+ case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+ /* both edges of the stem are aligned against blue zones */
+ hint->cur_pos = align.align_bot;
+ hint->cur_len = align.align_top - align.align_bot;
+ break;
+
+ default:
+ {
+ PSH_Hint parent = hint->parent;
+
+
+ if ( parent )
+ {
+ FT_Pos par_org_center, par_cur_center;
+ FT_Pos cur_org_center, cur_delta;
+
+
+ /* ensure that parent is already fitted */
+ if ( !psh_hint_is_fitted( parent ) )
+ psh_hint_align( parent, globals, dimension, glyph );
+
+ /* keep original relation between hints, this is, use the */
+ /* scaled distance between the centers of the hints to */
+ /* compute the new position */
+ par_org_center = parent->org_pos + ( parent->org_len >> 1 );
+ par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );
+ cur_org_center = hint->org_pos + ( hint->org_len >> 1 );
+
+ cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+ pos = par_cur_center + cur_delta - ( len >> 1 );
+ }
+
+ hint->cur_pos = pos;
+ hint->cur_len = fit_len;
+
+ /* Stem adjustment tries to snap stem widths to standard
+ * ones. This is important to prevent unpleasant rounding
+ * artefacts.
+ */
+ if ( glyph->do_stem_adjust )
+ {
+ if ( len <= 64 )
+ {
+ /* the stem is less than one pixel; we will center it
+ * around the nearest pixel center
+ */
+ if ( len >= 32 )
+ {
+ /* This is a special case where we also widen the stem
+ * and align it to the pixel grid.
+ *
+ * stem_center = pos + (len/2)
+ * nearest_pixel_center = FT_ROUND(stem_center-32)+32
+ * new_pos = nearest_pixel_center-32
+ * = FT_ROUND(stem_center-32)
+ * = FT_FLOOR(stem_center-32+32)
+ * = FT_FLOOR(stem_center)
+ * new_len = 64
+ */
+ pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );
+ len = 64;
+ }
+ else if ( len > 0 )
+ {
+ /* This is a very small stem; we simply align it to the
+ * pixel grid, trying to find the minimum displacement.
+ *
+ * left = pos
+ * right = pos + len
+ * left_nearest_edge = ROUND(pos)
+ * right_nearest_edge = ROUND(right)
+ *
+ * if ( ABS(left_nearest_edge - left) <=
+ * ABS(right_nearest_edge - right) )
+ * new_pos = left
+ * else
+ * new_pos = right
+ */
+ FT_Pos left_nearest = FT_PIX_ROUND( pos );
+ FT_Pos right_nearest = FT_PIX_ROUND( pos + len );
+ FT_Pos left_disp = left_nearest - pos;
+ FT_Pos right_disp = right_nearest - ( pos + len );
+
+
+ if ( left_disp < 0 )
+ left_disp = -left_disp;
+ if ( right_disp < 0 )
+ right_disp = -right_disp;
+ if ( left_disp <= right_disp )
+ pos = left_nearest;
+ else
+ pos = right_nearest;
+ }
+ else
+ {
+ /* this is a ghost stem; we simply round it */
+ pos = FT_PIX_ROUND( pos );
+ }
+ }
+ else
+ {
+ len = psh_dimension_quantize_len( dim, len, 0 );
+ }
+ }
+
+ /* now that we have a good hinted stem width, try to position */
+ /* the stem along a pixel grid integer coordinate */
+ hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );
+ hint->cur_len = len;
+ }
+ }
+
+ if ( do_snapping )
+ {
+ pos = hint->cur_pos;
+ len = hint->cur_len;
+
+ if ( len < 64 )
+ len = 64;
+ else
+ len = FT_PIX_ROUND( len );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ hint->cur_pos = align.align_top - len;
+ hint->cur_len = len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ hint->cur_len = len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:
+ /* don't touch */
+ break;
+
+
+ default:
+ hint->cur_len = len;
+ if ( len & 64 )
+ pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;
+ else
+ pos = FT_PIX_ROUND( pos + ( len >> 1 ) );
+
+ hint->cur_pos = pos - ( len >> 1 );
+ hint->cur_len = len;
+ }
+ }
+
+ psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+#endif
+ }
+ }
+
+
+#if 0 /* not used for now, experimental */
+
+ /*
+ * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT)
+ * of stems
+ */
+ static void
+ psh_hint_align_light( PSH_Hint hint,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( !psh_hint_is_fitted( hint ) )
+ {
+ FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ FT_Pos len = FT_MulFix( hint->org_len, scale );
+
+ FT_Pos fit_len;
+
+ PSH_AlignmentRec align;
+
+
+ /* ignore stem alignments when requested through the hint flags */
+ if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+ ( dimension == 1 && !glyph->do_vert_hints ) )
+ {
+ hint->cur_pos = pos;
+ hint->cur_len = len;
+
+ psh_hint_set_fitted( hint );
+ return;
+ }
+
+ fit_len = len;
+
+ hint->cur_len = fit_len;
+
+ /* check blue zones for horizontal stems */
+ align.align = PSH_BLUE_ALIGN_NONE;
+ align.align_bot = align.align_top = 0;
+
+ if ( dimension == 1 )
+ psh_blues_snap_stem( &globals->blues,
+ hint->org_pos + hint->org_len,
+ hint->org_pos,
+ &align );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ /* the top of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_top - fit_len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ /* the bottom of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_bot;
+ break;
+
+ case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+ /* both edges of the stem are aligned against blue zones */
+ hint->cur_pos = align.align_bot;
+ hint->cur_len = align.align_top - align.align_bot;
+ break;
+
+ default:
+ {
+ PSH_Hint parent = hint->parent;
+
+
+ if ( parent )
+ {
+ FT_Pos par_org_center, par_cur_center;
+ FT_Pos cur_org_center, cur_delta;
+
+
+ /* ensure that parent is already fitted */
+ if ( !psh_hint_is_fitted( parent ) )
+ psh_hint_align_light( parent, globals, dimension, glyph );
+
+ par_org_center = parent->org_pos + ( parent->org_len / 2 );
+ par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );
+ cur_org_center = hint->org_pos + ( hint->org_len / 2 );
+
+ cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+ pos = par_cur_center + cur_delta - ( len >> 1 );
+ }
+
+ /* Stems less than one pixel wide are easy -- we want to
+ * make them as dark as possible, so they must fall within
+ * one pixel. If the stem is split between two pixels
+ * then snap the edge that is nearer to the pixel boundary
+ * to the pixel boundary.
+ */
+ if ( len <= 64 )
+ {
+ if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 )
+ pos += psh_hint_snap_stem_side_delta ( pos, len );
+ }
+
+ /* Position stems other to minimize the amount of mid-grays.
+ * There are, in general, two positions that do this,
+ * illustrated as A) and B) below.
+ *
+ * + + + +
+ *
+ * A) |--------------------------------|
+ * B) |--------------------------------|
+ * C) |--------------------------------|
+ *
+ * Position A) (split the excess stem equally) should be better
+ * for stems of width N + f where f < 0.5.
+ *
+ * Position B) (split the deficiency equally) should be better
+ * for stems of width N + f where f > 0.5.
+ *
+ * It turns out though that minimizing the total number of lit
+ * pixels is also important, so position C), with one edge
+ * aligned with a pixel boundary is actually preferable
+ * to A). There are also more possibile positions for C) than
+ * for A) or B), so it involves less distortion of the overall
+ * character shape.
+ */
+ else /* len > 64 */
+ {
+ FT_Fixed frac_len = len & 63;
+ FT_Fixed center = pos + ( len >> 1 );
+ FT_Fixed delta_a, delta_b;
+
+
+ if ( ( len / 64 ) & 1 )
+ {
+ delta_a = FT_PIX_FLOOR( center ) + 32 - center;
+ delta_b = FT_PIX_ROUND( center ) - center;
+ }
+ else
+ {
+ delta_a = FT_PIX_ROUND( center ) - center;
+ delta_b = FT_PIX_FLOOR( center ) + 32 - center;
+ }
+
+ /* We choose between B) and C) above based on the amount
+ * of fractinal stem width; for small amounts, choose
+ * C) always, for large amounts, B) always, and inbetween,
+ * pick whichever one involves less stem movement.
+ */
+ if ( frac_len < 32 )
+ {
+ pos += psh_hint_snap_stem_side_delta ( pos, len );
+ }
+ else if ( frac_len < 48 )
+ {
+ FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos,
+ len );
+
+ if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )
+ pos += side_delta;
+ else
+ pos += delta_b;
+ }
+ else
+ {
+ pos += delta_b;
+ }
+ }
+
+ hint->cur_pos = pos;
+ }
+ } /* switch */
+
+ psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+#endif
+ }
+ }
+
+#endif /* 0 */
+
+
+ static void
+ psh_hint_table_align_hints( PSH_Hint_Table table,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Hint hint;
+ FT_UInt count;
+
+#ifdef DEBUG_HINTER
+
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( ps_debug_no_vert_hints && dimension == 0 )
+ {
+ ps_simple_scale( table, scale, delta, dimension );
+ return;
+ }
+
+ if ( ps_debug_no_horz_hints && dimension == 1 )
+ {
+ ps_simple_scale( table, scale, delta, dimension );
+ return;
+ }
+
+#endif /* DEBUG_HINTER*/
+
+ hint = table->hints;
+ count = table->max_hints;
+
+ for ( ; count > 0; count--, hint++ )
+ psh_hint_align( hint, globals, dimension, glyph );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** POINTS INTERPOLATION ROUTINES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define PSH_ZONE_MIN -3200000L
+#define PSH_ZONE_MAX +3200000L
+
+#define xxDEBUG_ZONES
+
+
+#ifdef DEBUG_ZONES
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+ static void
+ psh_print_zone( PSH_Zone zone )
+ {
+ printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
+ zone->scale / 65536.0,
+ zone->delta / 64.0,
+ zone->min,
+ zone->max );
+ }
+
+#else
+
+#define psh_print_zone( x ) do { } while ( 0 )
+
+#endif /* DEBUG_ZONES */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HINTER GLYPH MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 1
+
+#define psh_corner_is_flat ft_corner_is_flat
+#define psh_corner_orientation ft_corner_orientation
+
+#else
+
+ FT_LOCAL_DEF( FT_Int )
+ psh_corner_is_flat( FT_Pos x_in,
+ FT_Pos y_in,
+ FT_Pos x_out,
+ FT_Pos y_out )
+ {
+ FT_Pos ax = x_in;
+ FT_Pos ay = y_in;
+
+ FT_Pos d_in, d_out, d_corner;
+
+
+ if ( ax < 0 )
+ ax = -ax;
+ if ( ay < 0 )
+ ay = -ay;
+ d_in = ax + ay;
+
+ ax = x_out;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = y_out;
+ if ( ay < 0 )
+ ay = -ay;
+ d_out = ax + ay;
+
+ ax = x_out + x_in;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = y_out + y_in;
+ if ( ay < 0 )
+ ay = -ay;
+ d_corner = ax + ay;
+
+ return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+ }
+
+ static FT_Int
+ psh_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Int result;
+
+
+ /* deal with the trivial cases quickly */
+ if ( in_y == 0 )
+ {
+ if ( in_x >= 0 )
+ result = out_y;
+ else
+ result = -out_y;
+ }
+ else if ( in_x == 0 )
+ {
+ if ( in_y >= 0 )
+ result = -out_x;
+ else
+ result = out_x;
+ }
+ else if ( out_y == 0 )
+ {
+ if ( out_x >= 0 )
+ result = in_y;
+ else
+ result = -in_y;
+ }
+ else if ( out_x == 0 )
+ {
+ if ( out_y >= 0 )
+ result = -in_x;
+ else
+ result = in_x;
+ }
+ else /* general case */
+ {
+ long long delta = (long long)in_x * out_y - (long long)in_y * out_x;
+
+ if ( delta == 0 )
+ result = 0;
+ else
+ result = 1 - 2 * ( delta < 0 );
+ }
+
+ return result;
+ }
+
+#endif /* !1 */
+
+
+#ifdef COMPUTE_INFLEXS
+
+ /* compute all inflex points in a given glyph */
+ static void
+ psh_glyph_compute_inflections( PSH_Glyph glyph )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ PSH_Point first, start, end, before, after;
+ FT_Pos in_x, in_y, out_x, out_y;
+ FT_Int orient_prev, orient_cur;
+ FT_Int finished = 0;
+
+
+ /* we need at least 4 points to create an inflection point */
+ if ( glyph->contours[n].count < 4 )
+ continue;
+
+ /* compute first segment in contour */
+ first = glyph->contours[n].start;
+
+ start = end = first;
+ do
+ {
+ end = end->next;
+ if ( end == first )
+ goto Skip;
+
+ in_x = end->org_u - start->org_u;
+ in_y = end->org_v - start->org_v;
+
+ } while ( in_x == 0 && in_y == 0 );
+
+ /* extend the segment start whenever possible */
+ before = start;
+ do
+ {
+ do
+ {
+ start = before;
+ before = before->prev;
+ if ( before == first )
+ goto Skip;
+
+ out_x = start->org_u - before->org_u;
+ out_y = start->org_v - before->org_v;
+
+ } while ( out_x == 0 && out_y == 0 );
+
+ orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+ } while ( orient_prev == 0 );
+
+ first = start;
+ in_x = out_x;
+ in_y = out_y;
+
+ /* now, process all segments in the contour */
+ do
+ {
+ /* first, extend current segment's end whenever possible */
+ after = end;
+ do
+ {
+ do
+ {
+ end = after;
+ after = after->next;
+ if ( after == first )
+ finished = 1;
+
+ out_x = after->org_u - end->org_u;
+ out_y = after->org_v - end->org_v;
+
+ } while ( out_x == 0 && out_y == 0 );
+
+ orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+ } while ( orient_cur == 0 );
+
+ if ( ( orient_cur ^ orient_prev ) < 0 )
+ {
+ do
+ {
+ psh_point_set_inflex( start );
+ start = start->next;
+ }
+ while ( start != end );
+
+ psh_point_set_inflex( start );
+ }
+
+ start = end;
+ end = after;
+ orient_prev = orient_cur;
+ in_x = out_x;
+ in_y = out_y;
+
+ } while ( !finished );
+
+ Skip:
+ ;
+ }
+ }
+
+#endif /* COMPUTE_INFLEXS */
+
+
+ static void
+ psh_glyph_done( PSH_Glyph glyph )
+ {
+ FT_Memory memory = glyph->memory;
+
+
+ psh_hint_table_done( &glyph->hint_tables[1], memory );
+ psh_hint_table_done( &glyph->hint_tables[0], memory );
+
+ FT_FREE( glyph->points );
+ FT_FREE( glyph->contours );
+
+ glyph->num_points = 0;
+ glyph->num_contours = 0;
+
+ glyph->memory = 0;
+ }
+
+
+ static int
+ psh_compute_dir( FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_Pos ax, ay;
+ int result = PSH_DIR_NONE;
+
+
+ ax = FT_ABS( dx );
+ ay = FT_ABS( dy );
+
+ if ( ay * 12 < ax )
+ {
+ /* |dy| <<< |dx| means a near-horizontal segment */
+ result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;
+ }
+ else if ( ax * 12 < ay )
+ {
+ /* |dx| <<< |dy| means a near-vertical segment */
+ result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;
+ }
+
+ return result;
+ }
+
+
+ /* load outline point coordinates into hinter glyph */
+ static void
+ psh_glyph_load_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ FT_Vector* vec = glyph->outline->points;
+ PSH_Point point = glyph->points;
+ FT_UInt count = glyph->num_points;
+
+
+ for ( ; count > 0; count--, point++, vec++ )
+ {
+ point->flags2 = 0;
+ point->hint = NULL;
+ if ( dimension == 0 )
+ {
+ point->org_u = vec->x;
+ point->org_v = vec->y;
+ }
+ else
+ {
+ point->org_u = vec->y;
+ point->org_v = vec->x;
+ }
+
+#ifdef DEBUG_HINTER
+ point->org_x = vec->x;
+ point->org_y = vec->y;
+#endif
+
+ }
+ }
+
+
+ /* save hinted point coordinates back to outline */
+ static void
+ psh_glyph_save_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ FT_UInt n;
+ PSH_Point point = glyph->points;
+ FT_Vector* vec = glyph->outline->points;
+ char* tags = glyph->outline->tags;
+
+
+ for ( n = 0; n < glyph->num_points; n++ )
+ {
+ if ( dimension == 0 )
+ vec[n].x = point->cur_u;
+ else
+ vec[n].y = point->cur_u;
+
+ if ( psh_point_is_strong( point ) )
+ tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );
+
+#ifdef DEBUG_HINTER
+
+ if ( dimension == 0 )
+ {
+ point->cur_x = point->cur_u;
+ point->flags_x = point->flags2 | point->flags;
+ }
+ else
+ {
+ point->cur_y = point->cur_u;
+ point->flags_y = point->flags2 | point->flags;
+ }
+
+#endif
+
+ point++;
+ }
+ }
+
+
+ static FT_Error
+ psh_glyph_init( PSH_Glyph glyph,
+ FT_Outline* outline,
+ PS_Hints ps_hints,
+ PSH_Globals globals )
+ {
+ FT_Error error;
+ FT_Memory memory;
+
+
+ /* clear all fields */
+ FT_MEM_ZERO( glyph, sizeof ( *glyph ) );
+
+ memory = glyph->memory = globals->memory;
+
+ /* allocate and setup points + contours arrays */
+ if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) ||
+ FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )
+ goto Exit;
+
+ glyph->num_points = outline->n_points;
+ glyph->num_contours = outline->n_contours;
+
+ {
+ FT_UInt first = 0, next, n;
+ PSH_Point points = glyph->points;
+ PSH_Contour contour = glyph->contours;
+
+
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ FT_Int count;
+ PSH_Point point;
+
+
+ next = outline->contours[n] + 1;
+ count = next - first;
+
+ contour->start = points + first;
+ contour->count = (FT_UInt)count;
+
+ if ( count > 0 )
+ {
+ point = points + first;
+
+ point->prev = points + next - 1;
+ point->contour = contour;
+
+ for ( ; count > 1; count-- )
+ {
+ point[0].next = point + 1;
+ point[1].prev = point;
+ point++;
+ point->contour = contour;
+ }
+ point->next = points + first;
+ }
+
+ contour++;
+ first = next;
+ }
+ }
+
+ {
+ PSH_Point points = glyph->points;
+ PSH_Point point = points;
+ FT_Vector* vec = outline->points;
+ FT_UInt n;
+
+
+ for ( n = 0; n < glyph->num_points; n++, point++ )
+ {
+ FT_Int n_prev = (FT_Int)( point->prev - points );
+ FT_Int n_next = (FT_Int)( point->next - points );
+ FT_Pos dxi, dyi, dxo, dyo;
+
+
+ if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )
+ point->flags = PSH_POINT_OFF;
+
+ dxi = vec[n].x - vec[n_prev].x;
+ dyi = vec[n].y - vec[n_prev].y;
+
+ point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );
+
+ dxo = vec[n_next].x - vec[n].x;
+ dyo = vec[n_next].y - vec[n].y;
+
+ point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );
+
+ /* detect smooth points */
+ if ( point->flags & PSH_POINT_OFF )
+ point->flags |= PSH_POINT_SMOOTH;
+
+ else if ( point->dir_in == point->dir_out )
+ {
+ if ( point->dir_out != PSH_DIR_NONE ||
+ psh_corner_is_flat( dxi, dyi, dxo, dyo ) )
+ point->flags |= PSH_POINT_SMOOTH;
+ }
+ }
+ }
+
+ glyph->outline = outline;
+ glyph->globals = globals;
+
+#ifdef COMPUTE_INFLEXS
+ psh_glyph_load_points( glyph, 0 );
+ psh_glyph_compute_inflections( glyph );
+#endif /* COMPUTE_INFLEXS */
+
+ /* now deal with hints tables */
+ error = psh_hint_table_init( &glyph->hint_tables [0],
+ &ps_hints->dimension[0].hints,
+ &ps_hints->dimension[0].masks,
+ &ps_hints->dimension[0].counters,
+ memory );
+ if ( error )
+ goto Exit;
+
+ error = psh_hint_table_init( &glyph->hint_tables [1],
+ &ps_hints->dimension[1].hints,
+ &ps_hints->dimension[1].masks,
+ &ps_hints->dimension[1].counters,
+ memory );
+ if ( error )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /* compute all extrema in a glyph for a given dimension */
+ static void
+ psh_glyph_compute_extrema( PSH_Glyph glyph )
+ {
+ FT_UInt n;
+
+
+ /* first of all, compute all local extrema */
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ PSH_Point first = glyph->contours[n].start;
+ PSH_Point point, before, after;
+
+
+ if ( glyph->contours[n].count == 0 )
+ continue;
+
+ point = first;
+ before = point;
+ after = point;
+
+ do
+ {
+ before = before->prev;
+ if ( before == first )
+ goto Skip;
+
+ } while ( before->org_u == point->org_u );
+
+ first = point = before->next;
+
+ for (;;)
+ {
+ after = point;
+ do
+ {
+ after = after->next;
+ if ( after == first )
+ goto Next;
+
+ } while ( after->org_u == point->org_u );
+
+ if ( before->org_u < point->org_u )
+ {
+ if ( after->org_u < point->org_u )
+ {
+ /* local maximum */
+ goto Extremum;
+ }
+ }
+ else /* before->org_u > point->org_u */
+ {
+ if ( after->org_u > point->org_u )
+ {
+ /* local minimum */
+ Extremum:
+ do
+ {
+ psh_point_set_extremum( point );
+ point = point->next;
+
+ } while ( point != after );
+ }
+ }
+
+ before = after->prev;
+ point = after;
+
+ } /* for */
+
+ Next:
+ ;
+ }
+
+ /* for each extremum, determine its direction along the */
+ /* orthogonal axis */
+ for ( n = 0; n < glyph->num_points; n++ )
+ {
+ PSH_Point point, before, after;
+
+
+ point = &glyph->points[n];
+ before = point;
+ after = point;
+
+ if ( psh_point_is_extremum( point ) )
+ {
+ do
+ {
+ before = before->prev;
+ if ( before == point )
+ goto Skip;
+
+ } while ( before->org_v == point->org_v );
+
+ do
+ {
+ after = after->next;
+ if ( after == point )
+ goto Skip;
+
+ } while ( after->org_v == point->org_v );
+ }
+
+ if ( before->org_v < point->org_v &&
+ after->org_v > point->org_v )
+ {
+ psh_point_set_positive( point );
+ }
+ else if ( before->org_v > point->org_v &&
+ after->org_v < point->org_v )
+ {
+ psh_point_set_negative( point );
+ }
+
+ Skip:
+ ;
+ }
+ }
+
+
+ /* major_dir is the direction for points on the bottom/left of the stem; */
+ /* Points on the top/right of the stem will have a direction of */
+ /* -major_dir. */
+
+ static void
+ psh_hint_table_find_strong_points( PSH_Hint_Table table,
+ PSH_Point point,
+ FT_UInt count,
+ FT_Int threshold,
+ FT_Int major_dir )
+ {
+ PSH_Hint* sort = table->sort;
+ FT_UInt num_hints = table->num_hints;
+
+
+ for ( ; count > 0; count--, point++ )
+ {
+ FT_Int point_dir = 0;
+ FT_Pos org_u = point->org_u;
+
+
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )
+ point_dir = point->dir_in;
+
+ else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )
+ point_dir = point->dir_out;
+
+ if ( point_dir )
+ {
+ if ( point_dir == major_dir )
+ {
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ psh_point_set_strong( point );
+ point->flags2 |= PSH_POINT_EDGE_MIN;
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ else if ( point_dir == -major_dir )
+ {
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos - hint->org_len;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ psh_point_set_strong( point );
+ point->flags2 |= PSH_POINT_EDGE_MAX;
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ }
+
+#if 1
+ else if ( psh_point_is_extremum( point ) )
+ {
+ /* treat extrema as special cases for stem edge alignment */
+ FT_UInt nn, min_flag, max_flag;
+
+
+ if ( major_dir == PSH_DIR_HORIZONTAL )
+ {
+ min_flag = PSH_POINT_POSITIVE;
+ max_flag = PSH_POINT_NEGATIVE;
+ }
+ else
+ {
+ min_flag = PSH_POINT_NEGATIVE;
+ max_flag = PSH_POINT_POSITIVE;
+ }
+
+ if ( point->flags2 & min_flag )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ point->flags2 |= PSH_POINT_EDGE_MIN;
+ point->hint = hint;
+ psh_point_set_strong( point );
+ break;
+ }
+ }
+ }
+ else if ( point->flags2 & max_flag )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos - hint->org_len;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ point->flags2 |= PSH_POINT_EDGE_MAX;
+ point->hint = hint;
+ psh_point_set_strong( point );
+ break;
+ }
+ }
+ }
+
+ if ( point->hint == NULL )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+
+
+ if ( org_u >= hint->org_pos &&
+ org_u <= hint->org_pos + hint->org_len )
+ {
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ }
+
+#endif /* 1 */
+ }
+ }
+
+
+ /* the accepted shift for strong points in fractional pixels */
+#define PSH_STRONG_THRESHOLD 32
+
+ /* the maximum shift value in font units */
+#define PSH_STRONG_THRESHOLD_MAXIMUM 30
+
+
+ /* find strong points in a glyph */
+ static void
+ psh_glyph_find_strong_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ /* a point is `strong' if it is located on a stem edge and */
+ /* has an `in' or `out' tangent parallel to the hint's direction */
+
+ PSH_Hint_Table table = &glyph->hint_tables[dimension];
+ PS_Mask mask = table->hint_masks->masks;
+ FT_UInt num_masks = table->hint_masks->num_masks;
+ FT_UInt first = 0;
+ FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL
+ : PSH_DIR_HORIZONTAL;
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Int threshold;
+
+
+ threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );
+ if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )
+ threshold = PSH_STRONG_THRESHOLD_MAXIMUM;
+
+ /* process secondary hints to `selected' points */
+ if ( num_masks > 1 && glyph->num_points > 0 )
+ {
+ /* the `endchar' op can reduce the number of points */
+ first = mask->end_point > glyph->num_points
+ ? glyph->num_points
+ : mask->end_point;
+ mask++;
+ for ( ; num_masks > 1; num_masks--, mask++ )
+ {
+ FT_UInt next;
+ FT_Int count;
+
+
+ next = mask->end_point > glyph->num_points
+ ? glyph->num_points
+ : mask->end_point;
+ count = next - first;
+ if ( count > 0 )
+ {
+ PSH_Point point = glyph->points + first;
+
+
+ psh_hint_table_activate_mask( table, mask );
+
+ psh_hint_table_find_strong_points( table, point, count,
+ threshold, major_dir );
+ }
+ first = next;
+ }
+ }
+
+ /* process primary hints for all points */
+ if ( num_masks == 1 )
+ {
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ psh_hint_table_activate_mask( table, table->hint_masks->masks );
+
+ psh_hint_table_find_strong_points( table, point, count,
+ threshold, major_dir );
+ }
+
+ /* now, certain points may have been attached to a hint and */
+ /* not marked as strong; update their flags then */
+ {
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; count > 0; count--, point++ )
+ if ( point->hint && !psh_point_is_strong( point ) )
+ psh_point_set_strong( point );
+ }
+ }
+
+
+ /* find points in a glyph which are in a blue zone and have `in' or */
+ /* `out' tangents parallel to the horizontal axis */
+ static void
+ psh_glyph_find_blue_points( PSH_Blues blues,
+ PSH_Glyph glyph )
+ {
+ PSH_Blue_Table table;
+ PSH_Blue_Zone zone;
+ FT_UInt glyph_count = glyph->num_points;
+ FT_UInt blue_count;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; glyph_count > 0; glyph_count--, point++ )
+ {
+ FT_Pos y;
+
+
+ /* check tangents */
+ if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) &&
+ !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )
+ continue;
+
+ /* skip strong points */
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ y = point->org_u;
+
+ /* look up top zones */
+ table = &blues->normal_top;
+ blue_count = table->count;
+ zone = table->zones;
+
+ for ( ; blue_count > 0; blue_count--, zone++ )
+ {
+ FT_Pos delta = y - zone->org_bottom;
+
+
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( y <= zone->org_top + blues->blue_fuzz )
+ if ( blues->no_overshoots || delta <= blues->blue_threshold )
+ {
+ point->cur_u = zone->cur_bottom;
+ psh_point_set_strong( point );
+ psh_point_set_fitted( point );
+ }
+ }
+
+ /* look up bottom zones */
+ table = &blues->normal_bottom;
+ blue_count = table->count;
+ zone = table->zones + blue_count - 1;
+
+ for ( ; blue_count > 0; blue_count--, zone-- )
+ {
+ FT_Pos delta = zone->org_top - y;
+
+
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( y >= zone->org_bottom - blues->blue_fuzz )
+ if ( blues->no_overshoots || delta < blues->blue_threshold )
+ {
+ point->cur_u = zone->cur_top;
+ psh_point_set_strong( point );
+ psh_point_set_fitted( point );
+ }
+ }
+ }
+ }
+
+
+ /* interpolate strong points with the help of hinted coordinates */
+ static void
+ psh_glyph_interpolate_strong_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; count > 0; count--, point++ )
+ {
+ PSH_Hint hint = point->hint;
+
+
+ if ( hint )
+ {
+ FT_Pos delta;
+
+
+ if ( psh_point_is_edge_min( point ) )
+ point->cur_u = hint->cur_pos;
+
+ else if ( psh_point_is_edge_max( point ) )
+ point->cur_u = hint->cur_pos + hint->cur_len;
+
+ else
+ {
+ delta = point->org_u - hint->org_pos;
+
+ if ( delta <= 0 )
+ point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );
+
+ else if ( delta >= hint->org_len )
+ point->cur_u = hint->cur_pos + hint->cur_len +
+ FT_MulFix( delta - hint->org_len, scale );
+
+ else /* hint->org_len > 0 */
+ point->cur_u = hint->cur_pos +
+ FT_MulDiv( delta, hint->cur_len,
+ hint->org_len );
+ }
+ psh_point_set_fitted( point );
+ }
+ }
+ }
+
+
+#define PSH_MAX_STRONG_INTERNAL 16
+
+ static void
+ psh_glyph_interpolate_normal_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+
+#if 1
+ /* first technique: a point is strong if it is a local extremum */
+
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Memory memory = glyph->memory;
+
+ PSH_Point* strongs = NULL;
+ PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL];
+ FT_UInt num_strongs = 0;
+
+ PSH_Point points = glyph->points;
+ PSH_Point points_end = points + glyph->num_points;
+ PSH_Point point;
+
+
+ /* first count the number of strong points */
+ for ( point = points; point < points_end; point++ )
+ {
+ if ( psh_point_is_strong( point ) )
+ num_strongs++;
+ }
+
+ if ( num_strongs == 0 ) /* nothing to do here */
+ return;
+
+ /* allocate an array to store a list of points, */
+ /* stored in increasing org_u order */
+ if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )
+ strongs = strongs_0;
+ else
+ {
+ FT_Error error;
+
+
+ if ( FT_NEW_ARRAY( strongs, num_strongs ) )
+ return;
+ }
+
+ num_strongs = 0;
+ for ( point = points; point < points_end; point++ )
+ {
+ PSH_Point* insert;
+
+
+ if ( !psh_point_is_strong( point ) )
+ continue;
+
+ for ( insert = strongs + num_strongs; insert > strongs; insert-- )
+ {
+ if ( insert[-1]->org_u <= point->org_u )
+ break;
+
+ insert[0] = insert[-1];
+ }
+ insert[0] = point;
+ num_strongs++;
+ }
+
+ /* now try to interpolate all normal points */
+ for ( point = points; point < points_end; point++ )
+ {
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ /* sometimes, some local extrema are smooth points */
+ if ( psh_point_is_smooth( point ) )
+ {
+ if ( point->dir_in == PSH_DIR_NONE ||
+ point->dir_in != point->dir_out )
+ continue;
+
+ if ( !psh_point_is_extremum( point ) &&
+ !psh_point_is_inflex( point ) )
+ continue;
+
+ point->flags &= ~PSH_POINT_SMOOTH;
+ }
+
+ /* find best enclosing point coordinates then interpolate */
+ {
+ PSH_Point before, after;
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_strongs; nn++ )
+ if ( strongs[nn]->org_u > point->org_u )
+ break;
+
+ if ( nn == 0 ) /* point before the first strong point */
+ {
+ after = strongs[0];
+
+ point->cur_u = after->cur_u +
+ FT_MulFix( point->org_u - after->org_u,
+ scale );
+ }
+ else
+ {
+ before = strongs[nn - 1];
+
+ for ( nn = num_strongs; nn > 0; nn-- )
+ if ( strongs[nn - 1]->org_u < point->org_u )
+ break;
+
+ if ( nn == num_strongs ) /* point is after last strong point */
+ {
+ before = strongs[nn - 1];
+
+ point->cur_u = before->cur_u +
+ FT_MulFix( point->org_u - before->org_u,
+ scale );
+ }
+ else
+ {
+ FT_Pos u;
+
+
+ after = strongs[nn];
+
+ /* now interpolate point between before and after */
+ u = point->org_u;
+
+ if ( u == before->org_u )
+ point->cur_u = before->cur_u;
+
+ else if ( u == after->org_u )
+ point->cur_u = after->cur_u;
+
+ else
+ point->cur_u = before->cur_u +
+ FT_MulDiv( u - before->org_u,
+ after->cur_u - before->cur_u,
+ after->org_u - before->org_u );
+ }
+ }
+ psh_point_set_fitted( point );
+ }
+ }
+
+ if ( strongs != strongs_0 )
+ FT_FREE( strongs );
+
+#endif /* 1 */
+
+ }
+
+
+ /* interpolate other points */
+ static void
+ psh_glyph_interpolate_other_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+ PSH_Contour contour = glyph->contours;
+ FT_UInt num_contours = glyph->num_contours;
+
+
+ for ( ; num_contours > 0; num_contours--, contour++ )
+ {
+ PSH_Point start = contour->start;
+ PSH_Point first, next, point;
+ FT_UInt fit_count;
+
+
+ /* count the number of strong points in this contour */
+ next = start + contour->count;
+ fit_count = 0;
+ first = 0;
+
+ for ( point = start; point < next; point++ )
+ if ( psh_point_is_fitted( point ) )
+ {
+ if ( !first )
+ first = point;
+
+ fit_count++;
+ }
+
+ /* if there are less than 2 fitted points in the contour, we */
+ /* simply scale and eventually translate the contour points */
+ if ( fit_count < 2 )
+ {
+ if ( fit_count == 1 )
+ delta = first->cur_u - FT_MulFix( first->org_u, scale );
+
+ for ( point = start; point < next; point++ )
+ if ( point != first )
+ point->cur_u = FT_MulFix( point->org_u, scale ) + delta;
+
+ goto Next_Contour;
+ }
+
+ /* there are more than 2 strong points in this contour; we */
+ /* need to interpolate weak points between them */
+ start = first;
+ do
+ {
+ point = first;
+
+ /* skip consecutive fitted points */
+ for (;;)
+ {
+ next = first->next;
+ if ( next == start )
+ goto Next_Contour;
+
+ if ( !psh_point_is_fitted( next ) )
+ break;
+
+ first = next;
+ }
+
+ /* find next fitted point after unfitted one */
+ for (;;)
+ {
+ next = next->next;
+ if ( psh_point_is_fitted( next ) )
+ break;
+ }
+
+ /* now interpolate between them */
+ {
+ FT_Pos org_a, org_ab, cur_a, cur_ab;
+ FT_Pos org_c, org_ac, cur_c;
+ FT_Fixed scale_ab;
+
+
+ if ( first->org_u <= next->org_u )
+ {
+ org_a = first->org_u;
+ cur_a = first->cur_u;
+ org_ab = next->org_u - org_a;
+ cur_ab = next->cur_u - cur_a;
+ }
+ else
+ {
+ org_a = next->org_u;
+ cur_a = next->cur_u;
+ org_ab = first->org_u - org_a;
+ cur_ab = first->cur_u - cur_a;
+ }
+
+ scale_ab = 0x10000L;
+ if ( org_ab > 0 )
+ scale_ab = FT_DivFix( cur_ab, org_ab );
+
+ point = first->next;
+ do
+ {
+ org_c = point->org_u;
+ org_ac = org_c - org_a;
+
+ if ( org_ac <= 0 )
+ {
+ /* on the left of the interpolation zone */
+ cur_c = cur_a + FT_MulFix( org_ac, scale );
+ }
+ else if ( org_ac >= org_ab )
+ {
+ /* on the right on the interpolation zone */
+ cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );
+ }
+ else
+ {
+ /* within the interpolation zone */
+ cur_c = cur_a + FT_MulFix( org_ac, scale_ab );
+ }
+
+ point->cur_u = cur_c;
+
+ point = point->next;
+
+ } while ( point != next );
+ }
+
+ /* keep going until all points in the contours have been processed */
+ first = next;
+
+ } while ( first != start );
+
+ Next_Contour:
+ ;
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HIGH-LEVEL INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_Error
+ ps_hints_apply( PS_Hints ps_hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode )
+ {
+ PSH_GlyphRec glyphrec;
+ PSH_Glyph glyph = &glyphrec;
+ FT_Error error;
+#ifdef DEBUG_HINTER
+ FT_Memory memory;
+#endif
+ FT_Int dimension;
+
+
+ /* something to do? */
+ if ( outline->n_points == 0 || outline->n_contours == 0 )
+ return FT_Err_Ok;
+
+#ifdef DEBUG_HINTER
+
+ memory = globals->memory;
+
+ if ( ps_debug_glyph )
+ {
+ psh_glyph_done( ps_debug_glyph );
+ FT_FREE( ps_debug_glyph );
+ }
+
+ if ( FT_NEW( glyph ) )
+ return error;
+
+ ps_debug_glyph = glyph;
+
+#endif /* DEBUG_HINTER */
+
+ error = psh_glyph_init( glyph, outline, ps_hints, globals );
+ if ( error )
+ goto Exit;
+
+ /* try to optimize the y_scale so that the top of non-capital letters
+ * is aligned on a pixel boundary whenever possible
+ */
+ {
+ PSH_Dimension dim_x = &glyph->globals->dimension[0];
+ PSH_Dimension dim_y = &glyph->globals->dimension[1];
+
+ FT_Fixed x_scale = dim_x->scale_mult;
+ FT_Fixed y_scale = dim_y->scale_mult;
+
+ FT_Fixed old_x_scale = x_scale;
+ FT_Fixed old_y_scale = y_scale;
+
+ FT_Fixed scaled;
+ FT_Fixed fitted;
+
+ FT_Bool rescale = FALSE;
+
+
+ scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );
+ fitted = FT_PIX_ROUND( scaled );
+
+ if ( fitted != 0 && scaled != fitted )
+ {
+ rescale = TRUE;
+
+ y_scale = FT_MulDiv( y_scale, fitted, scaled );
+
+ if ( fitted < scaled )
+ x_scale -= x_scale / 50;
+
+ psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );
+ }
+
+ glyph->do_horz_hints = 1;
+ glyph->do_vert_hints = 1;
+
+ glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+ hint_mode == FT_RENDER_MODE_LCD );
+
+ glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+ hint_mode == FT_RENDER_MODE_LCD_V );
+
+ glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );
+
+ for ( dimension = 0; dimension < 2; dimension++ )
+ {
+ /* load outline coordinates into glyph */
+ psh_glyph_load_points( glyph, dimension );
+
+ /* compute local extrema */
+ psh_glyph_compute_extrema( glyph );
+
+ /* compute aligned stem/hints positions */
+ psh_hint_table_align_hints( &glyph->hint_tables[dimension],
+ glyph->globals,
+ dimension,
+ glyph );
+
+ /* find strong points, align them, then interpolate others */
+ psh_glyph_find_strong_points( glyph, dimension );
+ if ( dimension == 1 )
+ psh_glyph_find_blue_points( &globals->blues, glyph );
+ psh_glyph_interpolate_strong_points( glyph, dimension );
+ psh_glyph_interpolate_normal_points( glyph, dimension );
+ psh_glyph_interpolate_other_points( glyph, dimension );
+
+ /* save hinted coordinates back to outline */
+ psh_glyph_save_points( glyph, dimension );
+
+ if ( rescale )
+ psh_globals_set_scale( glyph->globals,
+ old_x_scale, old_y_scale, 0, 0 );
+ }
+ }
+
+ Exit:
+
+#ifndef DEBUG_HINTER
+ psh_glyph_done( glyph );
+#endif
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
new file mode 100644
index 0000000000..c70f31ea94
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
@@ -0,0 +1,246 @@
+/***************************************************************************/
+/* */
+/* pshalgo.h */
+/* */
+/* PostScript hinting algorithm (specification). */
+/* */
+/* Copyright 2001-2003, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHALGO_H__
+#define __PSHALGO_H__
+
+
+#include "pshrec.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* handle to Hint structure */
+ typedef struct PSH_HintRec_* PSH_Hint;
+
+ /* hint bit-flags */
+ typedef enum PSH_Hint_Flags_
+ {
+ PSH_HINT_GHOST = PS_HINT_FLAG_GHOST,
+ PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
+ PSH_HINT_ACTIVE = 4,
+ PSH_HINT_FITTED = 8
+
+ } PSH_Hint_Flags;
+
+
+#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
+#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 )
+#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
+
+#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE
+#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE
+#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED
+
+ /* hint structure */
+ typedef struct PSH_HintRec_
+ {
+ FT_Int org_pos;
+ FT_Int org_len;
+ FT_Pos cur_pos;
+ FT_Pos cur_len;
+ FT_UInt flags;
+ PSH_Hint parent;
+ FT_Int order;
+
+ } PSH_HintRec;
+
+
+ /* this is an interpolation zone used for strong points; */
+ /* weak points are interpolated according to their strong */
+ /* neighbours */
+ typedef struct PSH_ZoneRec_
+ {
+ FT_Fixed scale;
+ FT_Fixed delta;
+ FT_Pos min;
+ FT_Pos max;
+
+ } PSH_ZoneRec, *PSH_Zone;
+
+
+ typedef struct PSH_Hint_TableRec_
+ {
+ FT_UInt max_hints;
+ FT_UInt num_hints;
+ PSH_Hint hints;
+ PSH_Hint* sort;
+ PSH_Hint* sort_global;
+ FT_UInt num_zones;
+ PSH_ZoneRec* zones;
+ PSH_Zone zone;
+ PS_Mask_Table hint_masks;
+ PS_Mask_Table counter_masks;
+
+ } PSH_Hint_TableRec, *PSH_Hint_Table;
+
+
+ typedef struct PSH_PointRec_* PSH_Point;
+ typedef struct PSH_ContourRec_* PSH_Contour;
+
+ enum
+ {
+ PSH_DIR_NONE = 4,
+ PSH_DIR_UP = -1,
+ PSH_DIR_DOWN = 1,
+ PSH_DIR_LEFT = -2,
+ PSH_DIR_RIGHT = 2
+ };
+
+#define PSH_DIR_HORIZONTAL 2
+#define PSH_DIR_VERTICAL 1
+
+#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) )
+#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
+#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
+
+
+ /* the following bit-flags are computed once by the glyph */
+ /* analyzer, for both dimensions */
+ enum
+ {
+ PSH_POINT_OFF = 1, /* point is off the curve */
+ PSH_POINT_SMOOTH = 2, /* point is smooth */
+ PSH_POINT_INFLEX = 4 /* point is inflection */
+ };
+
+#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH )
+#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF )
+#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX )
+
+#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH
+#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF
+#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX
+
+ /* the following bit-flags are re-computed for each dimension */
+ enum
+ {
+ PSH_POINT_STRONG = 16, /* point is strong */
+ PSH_POINT_FITTED = 32, /* point is already fitted */
+ PSH_POINT_EXTREMUM = 64, /* point is local extremum */
+ PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */
+ PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */
+ PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */
+ PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */
+ };
+
+#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG )
+#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED )
+#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM )
+#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE )
+#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE )
+#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN )
+#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX )
+
+#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG
+#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED
+#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM
+#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE
+#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE
+#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN
+#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX
+
+
+ typedef struct PSH_PointRec_
+ {
+ PSH_Point prev;
+ PSH_Point next;
+ PSH_Contour contour;
+ FT_UInt flags;
+ FT_UInt flags2;
+ FT_Char dir_in;
+ FT_Char dir_out;
+ PSH_Hint hint;
+ FT_Pos org_u;
+ FT_Pos org_v;
+ FT_Pos cur_u;
+#ifdef DEBUG_HINTER
+ FT_Pos org_x;
+ FT_Pos cur_x;
+ FT_Pos org_y;
+ FT_Pos cur_y;
+ FT_UInt flags_x;
+ FT_UInt flags_y;
+#endif
+
+ } PSH_PointRec;
+
+
+ typedef struct PSH_ContourRec_
+ {
+ PSH_Point start;
+ FT_UInt count;
+
+ } PSH_ContourRec;
+
+
+ typedef struct PSH_GlyphRec_
+ {
+ FT_UInt num_points;
+ FT_UInt num_contours;
+
+ PSH_Point points;
+ PSH_Contour contours;
+
+ FT_Memory memory;
+ FT_Outline* outline;
+ PSH_Globals globals;
+ PSH_Hint_TableRec hint_tables[2];
+
+ FT_Bool vertical;
+ FT_Int major_dir;
+ FT_Int minor_dir;
+
+ FT_Bool do_horz_hints;
+ FT_Bool do_vert_hints;
+ FT_Bool do_horz_snapping;
+ FT_Bool do_vert_snapping;
+ FT_Bool do_stem_adjust;
+
+ } PSH_GlyphRec, *PSH_Glyph;
+
+
+#ifdef DEBUG_HINTER
+ extern PSH_Hint_Table ps_debug_hint_table;
+
+ typedef void
+ (*PSH_HintFunc)( PSH_Hint hint,
+ FT_Bool vertical );
+
+ extern PSH_HintFunc ps_debug_hint_func;
+
+ extern PSH_Glyph ps_debug_glyph;
+#endif
+
+
+ extern FT_Error
+ ps_hints_apply( PS_Hints ps_hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHALGO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
new file mode 100644
index 0000000000..9e086dca41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
@@ -0,0 +1,805 @@
+/***************************************************************************/
+/* */
+/* pshglob.c */
+/* */
+/* PostScript hinter global hinting management (body). */
+/* Inspired by the new auto-hinter module. */
+/* */
+/* Copyright 2001-2004, 2006, 2010, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshglob.h"
+
+#ifdef DEBUG_HINTER
+ PSH_Globals ps_debug_globals = 0;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STANDARD WIDTHS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* scale the widths/heights table */
+ static void
+ psh_globals_scale_widths( PSH_Globals globals,
+ FT_UInt direction )
+ {
+ PSH_Dimension dim = &globals->dimension[direction];
+ PSH_Widths stdw = &dim->stdw;
+ FT_UInt count = stdw->count;
+ PSH_Width width = stdw->widths;
+ PSH_Width stand = width; /* standard width/height */
+ FT_Fixed scale = dim->scale_mult;
+
+
+ if ( count > 0 )
+ {
+ width->cur = FT_MulFix( width->org, scale );
+ width->fit = FT_PIX_ROUND( width->cur );
+
+ width++;
+ count--;
+
+ for ( ; count > 0; count--, width++ )
+ {
+ FT_Pos w, dist;
+
+
+ w = FT_MulFix( width->org, scale );
+ dist = w - stand->cur;
+
+ if ( dist < 0 )
+ dist = -dist;
+
+ if ( dist < 128 )
+ w = stand->cur;
+
+ width->cur = w;
+ width->fit = FT_PIX_ROUND( w );
+ }
+ }
+ }
+
+
+#if 0
+
+ /* org_width is is font units, result in device pixels, 26.6 format */
+ FT_LOCAL_DEF( FT_Pos )
+ psh_dimension_snap_width( PSH_Dimension dimension,
+ FT_Int org_width )
+ {
+ FT_UInt n;
+ FT_Pos width = FT_MulFix( org_width, dimension->scale_mult );
+ FT_Pos best = 64 + 32 + 2;
+ FT_Pos reference = width;
+
+
+ for ( n = 0; n < dimension->stdw.count; n++ )
+ {
+ FT_Pos w;
+ FT_Pos dist;
+
+
+ w = dimension->stdw.widths[n].cur;
+ dist = width - w;
+ if ( dist < 0 )
+ dist = -dist;
+ if ( dist < best )
+ {
+ best = dist;
+ reference = w;
+ }
+ }
+
+ if ( width >= reference )
+ {
+ width -= 0x21;
+ if ( width < reference )
+ width = reference;
+ }
+ else
+ {
+ width += 0x21;
+ if ( width > reference )
+ width = reference;
+ }
+
+ return width;
+ }
+
+#endif /* 0 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BLUE ZONES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ psh_blues_set_zones_0( PSH_Blues target,
+ FT_Bool is_others,
+ FT_UInt read_count,
+ FT_Short* read,
+ PSH_Blue_Table top_table,
+ PSH_Blue_Table bot_table )
+ {
+ FT_UInt count_top = top_table->count;
+ FT_UInt count_bot = bot_table->count;
+ FT_Bool first = 1;
+
+ FT_UNUSED( target );
+
+
+ for ( ; read_count > 1; read_count -= 2 )
+ {
+ FT_Int reference, delta;
+ FT_UInt count;
+ PSH_Blue_Zone zones, zone;
+ FT_Bool top;
+
+
+ /* read blue zone entry, and select target top/bottom zone */
+ top = 0;
+ if ( first || is_others )
+ {
+ reference = read[1];
+ delta = read[0] - reference;
+
+ zones = bot_table->zones;
+ count = count_bot;
+ first = 0;
+ }
+ else
+ {
+ reference = read[0];
+ delta = read[1] - reference;
+
+ zones = top_table->zones;
+ count = count_top;
+ top = 1;
+ }
+
+ /* insert into sorted table */
+ zone = zones;
+ for ( ; count > 0; count--, zone++ )
+ {
+ if ( reference < zone->org_ref )
+ break;
+
+ if ( reference == zone->org_ref )
+ {
+ FT_Int delta0 = zone->org_delta;
+
+
+ /* we have two zones on the same reference position -- */
+ /* only keep the largest one */
+ if ( delta < 0 )
+ {
+ if ( delta < delta0 )
+ zone->org_delta = delta;
+ }
+ else
+ {
+ if ( delta > delta0 )
+ zone->org_delta = delta;
+ }
+ goto Skip;
+ }
+ }
+
+ for ( ; count > 0; count-- )
+ zone[count] = zone[count-1];
+
+ zone->org_ref = reference;
+ zone->org_delta = delta;
+
+ if ( top )
+ count_top++;
+ else
+ count_bot++;
+
+ Skip:
+ read += 2;
+ }
+
+ top_table->count = count_top;
+ bot_table->count = count_bot;
+ }
+
+
+ /* Re-read blue zones from the original fonts and store them into out */
+ /* private structure. This function re-orders, sanitizes and */
+ /* fuzz-expands the zones as well. */
+ static void
+ psh_blues_set_zones( PSH_Blues target,
+ FT_UInt count,
+ FT_Short* blues,
+ FT_UInt count_others,
+ FT_Short* other_blues,
+ FT_Int fuzz,
+ FT_Int family )
+ {
+ PSH_Blue_Table top_table, bot_table;
+ FT_Int count_top, count_bot;
+
+
+ if ( family )
+ {
+ top_table = &target->family_top;
+ bot_table = &target->family_bottom;
+ }
+ else
+ {
+ top_table = &target->normal_top;
+ bot_table = &target->normal_bottom;
+ }
+
+ /* read the input blue zones, and build two sorted tables */
+ /* (one for the top zones, the other for the bottom zones) */
+ top_table->count = 0;
+ bot_table->count = 0;
+
+ /* first, the blues */
+ psh_blues_set_zones_0( target, 0,
+ count, blues, top_table, bot_table );
+ psh_blues_set_zones_0( target, 1,
+ count_others, other_blues, top_table, bot_table );
+
+ count_top = top_table->count;
+ count_bot = bot_table->count;
+
+ /* sanitize top table */
+ if ( count_top > 0 )
+ {
+ PSH_Blue_Zone zone = top_table->zones;
+
+
+ for ( count = count_top; count > 0; count--, zone++ )
+ {
+ FT_Int delta;
+
+
+ if ( count > 1 )
+ {
+ delta = zone[1].org_ref - zone[0].org_ref;
+ if ( zone->org_delta > delta )
+ zone->org_delta = delta;
+ }
+
+ zone->org_bottom = zone->org_ref;
+ zone->org_top = zone->org_delta + zone->org_ref;
+ }
+ }
+
+ /* sanitize bottom table */
+ if ( count_bot > 0 )
+ {
+ PSH_Blue_Zone zone = bot_table->zones;
+
+
+ for ( count = count_bot; count > 0; count--, zone++ )
+ {
+ FT_Int delta;
+
+
+ if ( count > 1 )
+ {
+ delta = zone[0].org_ref - zone[1].org_ref;
+ if ( zone->org_delta < delta )
+ zone->org_delta = delta;
+ }
+
+ zone->org_top = zone->org_ref;
+ zone->org_bottom = zone->org_delta + zone->org_ref;
+ // XYQ 2006-3-11: FT PS hinter doesn't process wide zone well (all points shrinked to one horizontal line)
+ // therefore, we have to do some nasty thing here, because some fonts do give wide bottom zones.
+ // Our principle is to preserve the bottom line
+ // TEST DOC: bug#395 csl.pdf letters "y", "j", etc.
+ if (zone->org_top - zone->org_bottom > 10) {
+ zone->org_top = zone->org_bottom;
+ zone->org_delta = 0;
+ }
+ }
+ }
+
+ /* expand top and bottom tables with blue fuzz */
+ {
+ FT_Int dim, top, bot, delta;
+ PSH_Blue_Zone zone;
+
+
+ zone = top_table->zones;
+ count = count_top;
+
+ for ( dim = 1; dim >= 0; dim-- )
+ {
+ if ( count > 0 )
+ {
+ /* expand the bottom of the lowest zone normally */
+ zone->org_bottom -= fuzz;
+
+ /* expand the top and bottom of intermediate zones; */
+ /* checking that the interval is smaller than the fuzz */
+ top = zone->org_top;
+
+ for ( count--; count > 0; count-- )
+ {
+ bot = zone[1].org_bottom;
+ delta = bot - top;
+
+ if ( delta < 2 * fuzz )
+ zone[0].org_top = zone[1].org_bottom = top + delta / 2;
+ else
+ {
+ zone[0].org_top = top + fuzz;
+ zone[1].org_bottom = bot - fuzz;
+ }
+
+ zone++;
+ top = zone->org_top;
+ }
+
+ /* expand the top of the highest zone normally */
+ zone->org_top = top + fuzz;
+ }
+ zone = bot_table->zones;
+ count = count_bot;
+ }
+ }
+ }
+
+
+ /* reset the blues table when the device transform changes */
+ static void
+ psh_blues_scale_zones( PSH_Blues blues,
+ FT_Fixed scale,
+ FT_Pos delta )
+ {
+ FT_UInt count;
+ FT_UInt num;
+ PSH_Blue_Table table = 0;
+
+ /* */
+ /* Determine whether we need to suppress overshoots or */
+ /* not. We simply need to compare the vertical scale */
+ /* parameter to the raw bluescale value. Here is why: */
+ /* */
+ /* We need to suppress overshoots for all pointsizes. */
+ /* At 300dpi that satisfies: */
+ /* */
+ /* pointsize < 240*bluescale + 0.49 */
+ /* */
+ /* This corresponds to: */
+ /* */
+ /* pixelsize < 1000*bluescale + 49/24 */
+ /* */
+ /* scale*EM_Size < 1000*bluescale + 49/24 */
+ /* */
+ /* However, for normal Type 1 fonts, EM_Size is 1000! */
+ /* We thus only check: */
+ /* */
+ /* scale < bluescale + 49/24000 */
+ /* */
+ /* which we shorten to */
+ /* */
+ /* "scale < bluescale" */
+ /* */
+ /* Note that `blue_scale' is stored 1000 times its real */
+ /* value, and that `scale' converts from font units to */
+ /* fractional pixels. */
+ /* */
+
+ /* 1000 / 64 = 125 / 8 */
+ if ( scale >= 0x20C49BAL )
+ blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
+ else
+ blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+
+ /* */
+ /* The blue threshold is the font units distance under */
+ /* which overshoots are suppressed due to the BlueShift */
+ /* even if the scale is greater than BlueScale. */
+ /* */
+ /* It is the smallest distance such that */
+ /* */
+ /* dist <= BlueShift && dist*scale <= 0.5 pixels */
+ /* */
+ {
+ FT_Int threshold = blues->blue_shift;
+
+
+ while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+ threshold--;
+
+ blues->blue_threshold = threshold;
+ }
+
+ for ( num = 0; num < 4; num++ )
+ {
+ PSH_Blue_Zone zone;
+
+
+ switch ( num )
+ {
+ case 0:
+ table = &blues->normal_top;
+ break;
+ case 1:
+ table = &blues->normal_bottom;
+ break;
+ case 2:
+ table = &blues->family_top;
+ break;
+ default:
+ table = &blues->family_bottom;
+ break;
+ }
+
+ zone = table->zones;
+ count = table->count;
+ for ( ; count > 0; count--, zone++ )
+ {
+ zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta;
+ zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;
+ zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta;
+ zone->cur_delta = FT_MulFix( zone->org_delta, scale );
+
+ /* round scaled reference position */
+ zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );
+
+#if 0
+ if ( zone->cur_ref > zone->cur_top )
+ zone->cur_ref -= 64;
+ else if ( zone->cur_ref < zone->cur_bottom )
+ zone->cur_ref += 64;
+#endif
+ }
+ }
+
+ /* process the families now */
+
+ for ( num = 0; num < 2; num++ )
+ {
+ PSH_Blue_Zone zone1, zone2;
+ FT_UInt count1, count2;
+ PSH_Blue_Table normal, family;
+
+
+ switch ( num )
+ {
+ case 0:
+ normal = &blues->normal_top;
+ family = &blues->family_top;
+ break;
+
+ default:
+ normal = &blues->normal_bottom;
+ family = &blues->family_bottom;
+ }
+
+ zone1 = normal->zones;
+ count1 = normal->count;
+
+ for ( ; count1 > 0; count1--, zone1++ )
+ {
+ /* try to find a family zone whose reference position is less */
+ /* than 1 pixel far from the current zone */
+ zone2 = family->zones;
+ count2 = family->count;
+
+ for ( ; count2 > 0; count2--, zone2++ )
+ {
+ FT_Pos Delta;
+
+
+ Delta = zone1->org_ref - zone2->org_ref;
+ if ( Delta < 0 )
+ Delta = -Delta;
+
+ if ( FT_MulFix( Delta, scale ) < 64 )
+ {
+ zone1->cur_top = zone2->cur_top;
+ zone1->cur_bottom = zone2->cur_bottom;
+ zone1->cur_ref = zone2->cur_ref;
+ zone1->cur_delta = zone2->cur_delta;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+
+ /* calculate the maximum height of given blue zones */
+ static FT_Short
+ psh_calc_max_height( FT_UInt num,
+ const FT_Short* values,
+ FT_Short cur_max )
+ {
+ FT_UInt count;
+
+
+ for ( count = 0; count < num; count += 2 )
+ {
+ FT_Short cur_height = values[count + 1] - values[count];
+
+
+ if ( cur_height > cur_max )
+ cur_max = cur_height;
+ }
+
+ return cur_max;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ psh_blues_snap_stem( PSH_Blues blues,
+ FT_Int stem_top,
+ FT_Int stem_bot,
+ PSH_Alignment alignment )
+ {
+ PSH_Blue_Table table;
+ FT_UInt count;
+ FT_Pos delta;
+ PSH_Blue_Zone zone;
+ FT_Int no_shoots;
+
+
+ alignment->align = PSH_BLUE_ALIGN_NONE;
+
+ no_shoots = blues->no_overshoots;
+
+ /* look up stem top in top zones table */
+ table = &blues->normal_top;
+ count = table->count;
+ zone = table->zones;
+
+ for ( ; count > 0; count--, zone++ )
+ {
+ delta = stem_top - zone->org_bottom;
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( stem_top <= zone->org_top + blues->blue_fuzz )
+ {
+ if ( no_shoots || delta <= blues->blue_threshold )
+ {
+ alignment->align |= PSH_BLUE_ALIGN_TOP;
+ alignment->align_top = zone->cur_ref;
+ }
+ break;
+ }
+ }
+
+ /* look up stem bottom in bottom zones table */
+ table = &blues->normal_bottom;
+ count = table->count;
+ zone = table->zones + count-1;
+
+ for ( ; count > 0; count--, zone-- )
+ {
+ delta = zone->org_top - stem_bot;
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )
+ {
+ if ( no_shoots || delta < blues->blue_threshold )
+ {
+ alignment->align |= PSH_BLUE_ALIGN_BOT;
+ alignment->align_bot = zone->cur_ref;
+ }
+ break;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLOBAL HINTS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ psh_globals_destroy( PSH_Globals globals )
+ {
+ if ( globals )
+ {
+ FT_Memory memory;
+
+
+ memory = globals->memory;
+ globals->dimension[0].stdw.count = 0;
+ globals->dimension[1].stdw.count = 0;
+
+ globals->blues.normal_top.count = 0;
+ globals->blues.normal_bottom.count = 0;
+ globals->blues.family_top.count = 0;
+ globals->blues.family_bottom.count = 0;
+
+ FT_FREE( globals );
+
+#ifdef DEBUG_HINTER
+ ps_debug_globals = 0;
+#endif
+ }
+ }
+
+
+ static FT_Error
+ psh_globals_new( FT_Memory memory,
+ T1_Private* priv,
+ PSH_Globals *aglobals )
+ {
+ PSH_Globals globals = NULL;
+ FT_Error error;
+
+
+ if ( !FT_NEW( globals ) )
+ {
+ FT_UInt count;
+ FT_Short* read;
+
+
+ globals->memory = memory;
+
+ /* copy standard widths */
+ {
+ PSH_Dimension dim = &globals->dimension[1];
+ PSH_Width write = dim->stdw.widths;
+
+
+ write->org = priv->standard_width[0];
+ write++;
+
+ read = priv->snap_widths;
+ for ( count = priv->num_snap_widths; count > 0; count-- )
+ {
+ write->org = *read;
+ write++;
+ read++;
+ }
+
+ dim->stdw.count = priv->num_snap_widths + 1;
+ }
+
+ /* copy standard heights */
+ {
+ PSH_Dimension dim = &globals->dimension[0];
+ PSH_Width write = dim->stdw.widths;
+
+
+ write->org = priv->standard_height[0];
+ write++;
+ read = priv->snap_heights;
+ for ( count = priv->num_snap_heights; count > 0; count-- )
+ {
+ write->org = *read;
+ write++;
+ read++;
+ }
+
+ dim->stdw.count = priv->num_snap_heights + 1;
+ }
+
+ /* copy blue zones */
+ psh_blues_set_zones( &globals->blues, priv->num_blue_values,
+ priv->blue_values, priv->num_other_blues,
+ priv->other_blues, priv->blue_fuzz, 0 );
+
+ psh_blues_set_zones( &globals->blues, priv->num_family_blues,
+ priv->family_blues, priv->num_family_other_blues,
+ priv->family_other_blues, priv->blue_fuzz, 1 );
+
+ /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
+ {
+ FT_Fixed max_scale;
+ FT_Short max_height = 1;
+
+
+ max_height = psh_calc_max_height( priv->num_blue_values,
+ priv->blue_values,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_other_blues,
+ priv->other_blues,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_family_blues,
+ priv->family_blues,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_family_other_blues,
+ priv->family_other_blues,
+ max_height );
+
+ /* BlueScale is scaled 1000 times */
+ max_scale = FT_DivFix( 1000, max_height );
+ globals->blues.blue_scale = priv->blue_scale < max_scale
+ ? priv->blue_scale
+ : max_scale;
+ }
+
+ globals->blues.blue_shift = priv->blue_shift;
+ globals->blues.blue_fuzz = priv->blue_fuzz;
+
+ globals->dimension[0].scale_mult = 0;
+ globals->dimension[0].scale_delta = 0;
+ globals->dimension[1].scale_mult = 0;
+ globals->dimension[1].scale_delta = 0;
+
+#ifdef DEBUG_HINTER
+ ps_debug_globals = globals;
+#endif
+ }
+
+ *aglobals = globals;
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ psh_globals_set_scale( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta )
+ {
+ PSH_Dimension dim = &globals->dimension[0];
+
+
+ dim = &globals->dimension[0];
+ if ( x_scale != dim->scale_mult ||
+ x_delta != dim->scale_delta )
+ {
+ dim->scale_mult = x_scale;
+ dim->scale_delta = x_delta;
+
+ psh_globals_scale_widths( globals, 0 );
+ }
+
+ dim = &globals->dimension[1];
+ if ( y_scale != dim->scale_mult ||
+ y_delta != dim->scale_delta )
+ {
+ dim->scale_mult = y_scale;
+ dim->scale_delta = y_delta;
+
+ psh_globals_scale_widths( globals, 1 );
+ psh_blues_scale_zones( &globals->blues, y_scale, y_delta );
+ }
+
+ return 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs )
+ {
+ funcs->create = psh_globals_new;
+ funcs->set_scale = psh_globals_set_scale;
+ funcs->destroy = psh_globals_destroy;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
new file mode 100644
index 0000000000..cfc2001d2d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
@@ -0,0 +1,196 @@
+/***************************************************************************/
+/* */
+/* pshglob.h */
+/* */
+/* PostScript hinter global hinting management. */
+/* */
+/* Copyright 2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHGLOB_H__
+#define __PSHGLOB_H__
+
+
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLOBAL HINTS INTERNALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* @constant: */
+ /* PS_GLOBALS_MAX_BLUE_ZONES */
+ /* */
+ /* @description: */
+ /* The maximum number of blue zones in a font global hints structure. */
+ /* See @PS_Globals_BluesRec. */
+ /* */
+#define PS_GLOBALS_MAX_BLUE_ZONES 16
+
+
+ /*************************************************************************/
+ /* */
+ /* @constant: */
+ /* PS_GLOBALS_MAX_STD_WIDTHS */
+ /* */
+ /* @description: */
+ /* The maximum number of standard and snap widths in either the */
+ /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */
+ /* */
+#define PS_GLOBALS_MAX_STD_WIDTHS 16
+
+
+ /* standard and snap width */
+ typedef struct PSH_WidthRec_
+ {
+ FT_Int org;
+ FT_Pos cur;
+ FT_Pos fit;
+
+ } PSH_WidthRec, *PSH_Width;
+
+
+ /* standard and snap widths table */
+ typedef struct PSH_WidthsRec_
+ {
+ FT_UInt count;
+ PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS];
+
+ } PSH_WidthsRec, *PSH_Widths;
+
+
+ typedef struct PSH_DimensionRec_
+ {
+ PSH_WidthsRec stdw;
+ FT_Fixed scale_mult;
+ FT_Fixed scale_delta;
+
+ } PSH_DimensionRec, *PSH_Dimension;
+
+
+ /* blue zone descriptor */
+ typedef struct PSH_Blue_ZoneRec_
+ {
+ FT_Int org_ref;
+ FT_Int org_delta;
+ FT_Int org_top;
+ FT_Int org_bottom;
+
+ FT_Pos cur_ref;
+ FT_Pos cur_delta;
+ FT_Pos cur_bottom;
+ FT_Pos cur_top;
+
+ } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
+
+
+ typedef struct PSH_Blue_TableRec_
+ {
+ FT_UInt count;
+ PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES];
+
+ } PSH_Blue_TableRec, *PSH_Blue_Table;
+
+
+ /* blue zones table */
+ typedef struct PSH_BluesRec_
+ {
+ PSH_Blue_TableRec normal_top;
+ PSH_Blue_TableRec normal_bottom;
+ PSH_Blue_TableRec family_top;
+ PSH_Blue_TableRec family_bottom;
+
+ FT_Fixed blue_scale;
+ FT_Int blue_shift;
+ FT_Int blue_threshold;
+ FT_Int blue_fuzz;
+ FT_Bool no_overshoots;
+
+ } PSH_BluesRec, *PSH_Blues;
+
+
+ /* font globals. */
+ /* dimension 0 => X coordinates + vertical hints/stems */
+ /* dimension 1 => Y coordinates + horizontal hints/stems */
+ typedef struct PSH_GlobalsRec_
+ {
+ FT_Memory memory;
+ PSH_DimensionRec dimension[2];
+ PSH_BluesRec blues;
+
+ } PSH_GlobalsRec;
+
+
+#define PSH_BLUE_ALIGN_NONE 0
+#define PSH_BLUE_ALIGN_TOP 1
+#define PSH_BLUE_ALIGN_BOT 2
+
+
+ typedef struct PSH_AlignmentRec_
+ {
+ int align;
+ FT_Pos align_top;
+ FT_Pos align_bot;
+
+ } PSH_AlignmentRec, *PSH_Alignment;
+
+
+ FT_LOCAL( void )
+ psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs );
+
+
+#if 0
+ /* snap a stem width to fitter coordinates. `org_width' is in font */
+ /* units. The result is in device pixels (26.6 format). */
+ FT_LOCAL( FT_Pos )
+ psh_dimension_snap_width( PSH_Dimension dimension,
+ FT_Int org_width );
+#endif
+
+ FT_LOCAL( FT_Error )
+ psh_globals_set_scale( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta );
+
+ /* snap a stem to one or two blue zones */
+ FT_LOCAL( void )
+ psh_blues_snap_stem( PSH_Blues blues,
+ FT_Int stem_top,
+ FT_Int stem_bot,
+ PSH_Alignment alignment );
+ /* */
+
+#ifdef DEBUG_HINTER
+ extern PSH_Globals ps_debug_globals;
+#endif
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHGLOB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
new file mode 100644
index 0000000000..80edad8ecb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/* */
+/* pshmod.c */
+/* */
+/* FreeType PostScript hinter module implementation (body). */
+/* */
+/* Copyright 2001, 2002, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshrec.h"
+#include "pshalgo.h"
+#include "pshpic.h"
+
+
+ /* the Postscript Hinter module structure */
+ typedef struct PS_Hinter_Module_Rec_
+ {
+ FT_ModuleRec root;
+ PS_HintsRec ps_hints;
+
+ PSH_Globals_FuncsRec globals_funcs;
+ T1_Hints_FuncsRec t1_funcs;
+ T2_Hints_FuncsRec t2_funcs;
+
+ } PS_Hinter_ModuleRec, *PS_Hinter_Module;
+
+
+ /* finalize module */
+ FT_CALLBACK_DEF( void )
+ ps_hinter_done( PS_Hinter_Module module )
+ {
+ module->t1_funcs.hints = NULL;
+ module->t2_funcs.hints = NULL;
+
+ ps_hints_done( &module->ps_hints );
+ }
+
+
+ /* initialize module, create hints recorder and the interface */
+ FT_CALLBACK_DEF( FT_Error )
+ ps_hinter_init( PS_Hinter_Module module )
+ {
+ FT_Memory memory = module->root.memory;
+ void* ph = &module->ps_hints;
+
+
+ ps_hints_init( &module->ps_hints, memory );
+
+ psh_globals_funcs_init( &module->globals_funcs );
+
+ t1_hints_funcs_init( &module->t1_funcs );
+ module->t1_funcs.hints = (T1_Hints)ph;
+
+ t2_hints_funcs_init( &module->t2_funcs );
+ module->t2_funcs.hints = (T2_Hints)ph;
+
+ return 0;
+ }
+
+
+ /* returns global hints interface */
+ FT_CALLBACK_DEF( PSH_Globals_Funcs )
+ pshinter_get_globals_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->globals_funcs;
+ }
+
+
+ /* return Type 1 hints interface */
+ FT_CALLBACK_DEF( T1_Hints_Funcs )
+ pshinter_get_t1_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->t1_funcs;
+ }
+
+
+ /* return Type 2 hints interface */
+ FT_CALLBACK_DEF( T2_Hints_Funcs )
+ pshinter_get_t2_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->t2_funcs;
+ }
+
+
+ FT_DEFINE_PSHINTER_INTERFACE(
+ pshinter_interface,
+ pshinter_get_globals_funcs,
+ pshinter_get_t1_funcs,
+ pshinter_get_t2_funcs )
+
+
+ FT_DEFINE_MODULE(
+ pshinter_module_class,
+
+ 0,
+ sizeof ( PS_Hinter_ModuleRec ),
+ "pshinter",
+ 0x10000L,
+ 0x20000L,
+
+ &PSHINTER_INTERFACE_GET, /* module-specific interface */
+
+ (FT_Module_Constructor)ps_hinter_init,
+ (FT_Module_Destructor) ps_hinter_done,
+ (FT_Module_Requester) NULL ) /* no additional interface for now */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
new file mode 100644
index 0000000000..c2143ac405
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/* */
+/* pshmod.h */
+/* */
+/* PostScript hinter module interface (specification). */
+/* */
+/* Copyright 2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHMOD_H__
+#define __PSHMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( pshinter_module_class )
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
new file mode 100644
index 0000000000..472fdbf339
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* pshnterr.h */
+/* */
+/* PS Hinter error codes (specification only). */
+/* */
+/* Copyright 2003, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PSHinter error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSHNTERR_H__
+#define __PSHNTERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSH_Err_
+#define FT_ERR_BASE FT_Mod_Err_PShinter
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSHNTERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
new file mode 100644
index 0000000000..a35c99e701
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
@@ -0,0 +1,76 @@
+/***************************************************************************/
+/* */
+/* pshpic.c */
+/* */
+/* The FreeType position independent code services for pshinter module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshpic.h"
+#include "pshnterr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from pshmod.c */
+ void
+ FT_Init_Class_pshinter_interface( FT_Library library,
+ PSHinter_Interface* clazz );
+
+ void
+ pshinter_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->pshinter )
+ {
+ FT_FREE( pic_container->pshinter );
+ pic_container->pshinter = NULL;
+ }
+ }
+
+
+ FT_Error
+ pshinter_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ PSHinterPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->pshinter = container;
+
+ /* add call to initialization function when you add new scripts */
+ FT_Init_Class_pshinter_interface(
+ library, &container->pshinter_interface );
+
+ if ( error )
+ pshinter_module_class_pic_free( library );
+
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
new file mode 100644
index 0000000000..8721aaa953
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* pshpic.h */
+/* */
+/* The FreeType position independent code services for pshinter module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHPIC_H__
+#define __PSHPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSHINTER_INTERFACE_GET pshinter_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/pshints.h"
+
+ typedef struct PSHinterPIC_
+ {
+ PSHinter_Interface pshinter_interface;
+
+ } PSHinterPIC;
+
+
+#define GET_PIC( lib ) ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )
+
+#define PSHINTER_INTERFACE_GET ( GET_PIC( library )->pshinter_interface )
+
+ /* see pshpic.c for the implementation */
+ void
+ pshinter_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ pshinter_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSHPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
new file mode 100644
index 0000000000..8fc9a302d7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
@@ -0,0 +1,1225 @@
+/***************************************************************************/
+/* */
+/* pshrec.c */
+/* */
+/* FreeType PostScript hints recorder (body). */
+/* */
+/* Copyright 2001-2004, 2007, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "pshrec.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_pshrec
+
+#ifdef DEBUG_HINTER
+ PS_Hints ps_debug_hints = 0;
+ int ps_debug_no_horz_hints = 0;
+ int ps_debug_no_vert_hints = 0;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_HINT MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* destroy hints table */
+ static void
+ ps_hint_table_done( PS_Hint_Table table,
+ FT_Memory memory )
+ {
+ FT_FREE( table->hints );
+ table->num_hints = 0;
+ table->max_hints = 0;
+ }
+
+
+ /* ensure that a table can contain "count" elements */
+ static FT_Error
+ ps_hint_table_ensure( PS_Hint_Table table,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = table->max_hints;
+ FT_UInt new_max = count;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ /* try to grow the table */
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
+ table->max_hints = new_max;
+ }
+ return error;
+ }
+
+
+ static FT_Error
+ ps_hint_table_alloc( PS_Hint_Table table,
+ FT_Memory memory,
+ PS_Hint *ahint )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ PS_Hint hint = 0;
+
+
+ count = table->num_hints;
+ count++;
+
+ if ( count >= table->max_hints )
+ {
+ error = ps_hint_table_ensure( table, count, memory );
+ if ( error )
+ goto Exit;
+ }
+
+ hint = table->hints + count - 1;
+ hint->pos = 0;
+ hint->len = 0;
+ hint->flags = 0;
+
+ table->num_hints = count;
+
+ Exit:
+ *ahint = hint;
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_MASK MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* destroy mask */
+ static void
+ ps_mask_done( PS_Mask mask,
+ FT_Memory memory )
+ {
+ FT_FREE( mask->bytes );
+ mask->num_bits = 0;
+ mask->max_bits = 0;
+ mask->end_point = 0;
+ }
+
+
+ /* ensure that a mask can contain "count" bits */
+ static FT_Error
+ ps_mask_ensure( PS_Mask mask,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = ( mask->max_bits + 7 ) >> 3;
+ FT_UInt new_max = ( count + 7 ) >> 3;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
+ mask->max_bits = new_max * 8;
+ }
+ return error;
+ }
+
+
+ /* test a bit value in a given mask */
+ static FT_Int
+ ps_mask_test_bit( PS_Mask mask,
+ FT_Int idx )
+ {
+ if ( (FT_UInt)idx >= mask->num_bits )
+ return 0;
+
+ return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
+ }
+
+
+ /* clear a given bit */
+ static void
+ ps_mask_clear_bit( PS_Mask mask,
+ FT_Int idx )
+ {
+ FT_Byte* p;
+
+
+ if ( (FT_UInt)idx >= mask->num_bits )
+ return;
+
+ p = mask->bytes + ( idx >> 3 );
+ p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
+ }
+
+
+ /* set a given bit, possibly grow the mask */
+ static FT_Error
+ ps_mask_set_bit( PS_Mask mask,
+ FT_Int idx,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* p;
+
+
+ if ( idx < 0 )
+ goto Exit;
+
+ if ( (FT_UInt)idx >= mask->num_bits )
+ {
+ error = ps_mask_ensure( mask, idx + 1, memory );
+ if ( error )
+ goto Exit;
+
+ mask->num_bits = idx + 1;
+ }
+
+ p = mask->bytes + ( idx >> 3 );
+ p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );
+
+ Exit:
+ return error;
+ }
+
+
+ /* destroy mask table */
+ static void
+ ps_mask_table_done( PS_Mask_Table table,
+ FT_Memory memory )
+ {
+ FT_UInt count = table->max_masks;
+ PS_Mask mask = table->masks;
+
+
+ for ( ; count > 0; count--, mask++ )
+ ps_mask_done( mask, memory );
+
+ FT_FREE( table->masks );
+ table->num_masks = 0;
+ table->max_masks = 0;
+ }
+
+
+ /* ensure that a mask table can contain "count" masks */
+ static FT_Error
+ ps_mask_table_ensure( PS_Mask_Table table,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = table->max_masks;
+ FT_UInt new_max = count;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )
+ table->max_masks = new_max;
+ }
+ return error;
+ }
+
+
+ /* allocate a new mask in a table */
+ static FT_Error
+ ps_mask_table_alloc( PS_Mask_Table table,
+ FT_Memory memory,
+ PS_Mask *amask )
+ {
+ FT_UInt count;
+ FT_Error error = FT_Err_Ok;
+ PS_Mask mask = 0;
+
+
+ count = table->num_masks;
+ count++;
+
+ if ( count > table->max_masks )
+ {
+ error = ps_mask_table_ensure( table, count, memory );
+ if ( error )
+ goto Exit;
+ }
+
+ mask = table->masks + count - 1;
+ mask->num_bits = 0;
+ mask->end_point = 0;
+ table->num_masks = count;
+
+ Exit:
+ *amask = mask;
+ return error;
+ }
+
+
+ /* return last hint mask in a table, create one if the table is empty */
+ static FT_Error
+ ps_mask_table_last( PS_Mask_Table table,
+ FT_Memory memory,
+ PS_Mask *amask )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ PS_Mask mask;
+
+
+ count = table->num_masks;
+ if ( count == 0 )
+ {
+ error = ps_mask_table_alloc( table, memory, &mask );
+ if ( error )
+ goto Exit;
+ }
+ else
+ mask = table->masks + count - 1;
+
+ Exit:
+ *amask = mask;
+ return error;
+ }
+
+
+ /* set a new mask to a given bit range */
+ static FT_Error
+ ps_mask_table_set_bits( PS_Mask_Table table,
+ const FT_Byte* source,
+ FT_UInt bit_pos,
+ FT_UInt bit_count,
+ FT_Memory memory )
+ {
+ FT_Error error;
+ PS_Mask mask;
+
+
+ error = ps_mask_table_last( table, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_ensure( mask, bit_count, memory );
+ if ( error )
+ goto Exit;
+
+ mask->num_bits = bit_count;
+
+ /* now, copy bits */
+ {
+ FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 );
+ FT_Int rmask = 0x80 >> ( bit_pos & 7 );
+ FT_Byte* write = mask->bytes;
+ FT_Int wmask = 0x80;
+ FT_Int val;
+
+
+ for ( ; bit_count > 0; bit_count-- )
+ {
+ val = write[0] & ~wmask;
+
+ if ( read[0] & rmask )
+ val |= wmask;
+
+ write[0] = (FT_Byte)val;
+
+ rmask >>= 1;
+ if ( rmask == 0 )
+ {
+ read++;
+ rmask = 0x80;
+ }
+
+ wmask >>= 1;
+ if ( wmask == 0 )
+ {
+ write++;
+ wmask = 0x80;
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* test whether two masks in a table intersect */
+ static FT_Int
+ ps_mask_table_test_intersect( PS_Mask_Table table,
+ FT_Int index1,
+ FT_Int index2 )
+ {
+ PS_Mask mask1 = table->masks + index1;
+ PS_Mask mask2 = table->masks + index2;
+ FT_Byte* p1 = mask1->bytes;
+ FT_Byte* p2 = mask2->bytes;
+ FT_UInt count1 = mask1->num_bits;
+ FT_UInt count2 = mask2->num_bits;
+ FT_UInt count;
+
+
+ count = FT_MIN( count1, count2 );
+ for ( ; count >= 8; count -= 8 )
+ {
+ if ( p1[0] & p2[0] )
+ return 1;
+
+ p1++;
+ p2++;
+ }
+
+ if ( count == 0 )
+ return 0;
+
+ return ( p1[0] & p2[0] ) & ~( 0xFF >> count );
+ }
+
+
+ /* merge two masks, used by ps_mask_table_merge_all */
+ static FT_Error
+ ps_mask_table_merge( PS_Mask_Table table,
+ FT_Int index1,
+ FT_Int index2,
+ FT_Memory memory )
+ {
+ FT_UInt temp;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* swap index1 and index2 so that index1 < index2 */
+ if ( index1 > index2 )
+ {
+ temp = index1;
+ index1 = index2;
+ index2 = temp;
+ }
+
+ if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )
+ {
+ /* we need to merge the bitsets of index1 and index2 with a */
+ /* simple union */
+ PS_Mask mask1 = table->masks + index1;
+ PS_Mask mask2 = table->masks + index2;
+ FT_UInt count1 = mask1->num_bits;
+ FT_UInt count2 = mask2->num_bits;
+ FT_Int delta;
+
+
+ if ( count2 > 0 )
+ {
+ FT_UInt pos;
+ FT_Byte* read;
+ FT_Byte* write;
+
+
+ /* if "count2" is greater than "count1", we need to grow the */
+ /* first bitset, and clear the highest bits */
+ if ( count2 > count1 )
+ {
+ error = ps_mask_ensure( mask1, count2, memory );
+ if ( error )
+ goto Exit;
+
+ for ( pos = count1; pos < count2; pos++ )
+ ps_mask_clear_bit( mask1, pos );
+ }
+
+ /* merge (unite) the bitsets */
+ read = mask2->bytes;
+ write = mask1->bytes;
+ pos = (FT_UInt)( ( count2 + 7 ) >> 3 );
+
+ for ( ; pos > 0; pos-- )
+ {
+ write[0] = (FT_Byte)( write[0] | read[0] );
+ write++;
+ read++;
+ }
+ }
+
+ /* Now, remove "mask2" from the list. We need to keep the masks */
+ /* sorted in order of importance, so move table elements. */
+ mask2->num_bits = 0;
+ mask2->end_point = 0;
+
+ delta = table->num_masks - 1 - index2; /* number of masks to move */
+ if ( delta > 0 )
+ {
+ /* move to end of table for reuse */
+ PS_MaskRec dummy = *mask2;
+
+
+ ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );
+
+ mask2[delta] = dummy;
+ }
+
+ table->num_masks--;
+ }
+ else
+ FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+ index1, index2 ));
+
+ Exit:
+ return error;
+ }
+
+
+ /* Try to merge all masks in a given table. This is used to merge */
+ /* all counter masks into independent counter "paths". */
+ /* */
+ static FT_Error
+ ps_mask_table_merge_all( PS_Mask_Table table,
+ FT_Memory memory )
+ {
+ FT_Int index1, index2;
+ FT_Error error = FT_Err_Ok;
+
+
+ for ( index1 = table->num_masks - 1; index1 > 0; index1-- )
+ {
+ for ( index2 = index1 - 1; index2 >= 0; index2-- )
+ {
+ if ( ps_mask_table_test_intersect( table, index1, index2 ) )
+ {
+ error = ps_mask_table_merge( table, index2, index1, memory );
+ if ( error )
+ goto Exit;
+
+ break;
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_DIMENSION MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* finalize a given dimension */
+ static void
+ ps_dimension_done( PS_Dimension dimension,
+ FT_Memory memory )
+ {
+ ps_mask_table_done( &dimension->counters, memory );
+ ps_mask_table_done( &dimension->masks, memory );
+ ps_hint_table_done( &dimension->hints, memory );
+ }
+
+
+ /* initialize a given dimension */
+ static void
+ ps_dimension_init( PS_Dimension dimension )
+ {
+ dimension->hints.num_hints = 0;
+ dimension->masks.num_masks = 0;
+ dimension->counters.num_masks = 0;
+ }
+
+
+#if 0
+
+ /* set a bit at a given index in the current hint mask */
+ static FT_Error
+ ps_dimension_set_mask_bit( PS_Dimension dim,
+ FT_UInt idx,
+ FT_Memory memory )
+ {
+ PS_Mask mask;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* get last hint mask */
+ error = ps_mask_table_last( &dim->masks, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( mask, idx, memory );
+
+ Exit:
+ return error;
+ }
+
+#endif
+
+ /* set the end point in a mask, called from "End" & "Reset" methods */
+ static void
+ ps_dimension_end_mask( PS_Dimension dim,
+ FT_UInt end_point )
+ {
+ FT_UInt count = dim->masks.num_masks;
+
+
+ if ( count > 0 )
+ {
+ PS_Mask mask = dim->masks.masks + count - 1;
+
+
+ mask->end_point = end_point;
+ }
+ }
+
+
+ /* set the end point in the current mask, then create a new empty one */
+ /* (called by "Reset" method) */
+ static FT_Error
+ ps_dimension_reset_mask( PS_Dimension dim,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ PS_Mask mask;
+
+
+ /* end current mask */
+ ps_dimension_end_mask( dim, end_point );
+
+ /* allocate new one */
+ return ps_mask_table_alloc( &dim->masks, memory, &mask );
+ }
+
+
+ /* set a new mask, called from the "T2Stem" method */
+ static FT_Error
+ ps_dimension_set_mask_bits( PS_Dimension dim,
+ const FT_Byte* source,
+ FT_UInt source_pos,
+ FT_UInt source_bits,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ /* reset current mask, if any */
+ error = ps_dimension_reset_mask( dim, end_point, memory );
+ if ( error )
+ goto Exit;
+
+ /* set bits in new mask */
+ error = ps_mask_table_set_bits( &dim->masks, source,
+ source_pos, source_bits, memory );
+
+ Exit:
+ return error;
+ }
+
+
+ /* add a new single stem (called from "T1Stem" method) */
+ static FT_Error
+ ps_dimension_add_t1stem( PS_Dimension dim,
+ FT_Int pos,
+ FT_Int len,
+ FT_Memory memory,
+ FT_Int *aindex )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt flags = 0;
+
+
+ /* detect ghost stem */
+ if ( len < 0 )
+ {
+ flags |= PS_HINT_FLAG_GHOST;
+ if ( len == -21 )
+ {
+ flags |= PS_HINT_FLAG_BOTTOM;
+ pos += len;
+ }
+ len = 0;
+ }
+
+ if ( aindex )
+ *aindex = -1;
+
+ /* now, lookup stem in the current hints table */
+ {
+ PS_Mask mask;
+ FT_UInt idx;
+ FT_UInt max = dim->hints.num_hints;
+ PS_Hint hint = dim->hints.hints;
+
+
+ for ( idx = 0; idx < max; idx++, hint++ )
+ {
+ if ( hint->pos == pos && hint->len == len )
+ break;
+ }
+
+ /* we need to create a new hint in the table */
+ if ( idx >= max )
+ {
+ error = ps_hint_table_alloc( &dim->hints, memory, &hint );
+ if ( error )
+ goto Exit;
+
+ hint->pos = pos;
+ hint->len = len;
+ hint->flags = flags;
+ }
+
+ /* now, store the hint in the current mask */
+ error = ps_mask_table_last( &dim->masks, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( mask, idx, memory );
+ if ( error )
+ goto Exit;
+
+ if ( aindex )
+ *aindex = (FT_Int)idx;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* add a "hstem3/vstem3" counter to our dimension table */
+ static FT_Error
+ ps_dimension_add_counter( PS_Dimension dim,
+ FT_Int hint1,
+ FT_Int hint2,
+ FT_Int hint3,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count = dim->counters.num_masks;
+ PS_Mask counter = dim->counters.masks;
+
+
+ /* try to find an existing counter mask that already uses */
+ /* one of these stems here */
+ for ( ; count > 0; count--, counter++ )
+ {
+ if ( ps_mask_test_bit( counter, hint1 ) ||
+ ps_mask_test_bit( counter, hint2 ) ||
+ ps_mask_test_bit( counter, hint3 ) )
+ break;
+ }
+
+ /* create a new counter when needed */
+ if ( count == 0 )
+ {
+ error = ps_mask_table_alloc( &dim->counters, memory, &counter );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now, set the bits for our hints in the counter mask */
+ error = ps_mask_set_bit( counter, hint1, memory );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( counter, hint2, memory );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( counter, hint3, memory );
+ if ( error )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /* end of recording session for a given dimension */
+ static FT_Error
+ ps_dimension_end( PS_Dimension dim,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ /* end hint mask table */
+ ps_dimension_end_mask( dim, end_point );
+
+ /* merge all counter masks into independent "paths" */
+ return ps_mask_table_merge_all( &dim->counters, memory );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_RECORDER MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* destroy hints */
+ FT_LOCAL( void )
+ ps_hints_done( PS_Hints hints )
+ {
+ FT_Memory memory = hints->memory;
+
+
+ ps_dimension_done( &hints->dimension[0], memory );
+ ps_dimension_done( &hints->dimension[1], memory );
+
+ hints->error = FT_Err_Ok;
+ hints->memory = 0;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ ps_hints_init( PS_Hints hints,
+ FT_Memory memory )
+ {
+ FT_MEM_ZERO( hints, sizeof ( *hints ) );
+ hints->memory = memory;
+ return FT_Err_Ok;
+ }
+
+
+ /* initialize a hints for a new session */
+ static void
+ ps_hints_open( PS_Hints hints,
+ PS_Hint_Type hint_type )
+ {
+ switch ( hint_type )
+ {
+ case PS_HINT_TYPE_1:
+ case PS_HINT_TYPE_2:
+ hints->error = FT_Err_Ok;
+ hints->hint_type = hint_type;
+
+ ps_dimension_init( &hints->dimension[0] );
+ ps_dimension_init( &hints->dimension[1] );
+ break;
+
+ default:
+ hints->error = FT_THROW( Invalid_Argument );
+ hints->hint_type = hint_type;
+
+ FT_TRACE0(( "ps_hints_open: invalid charstring type\n" ));
+ break;
+ }
+ }
+
+
+ /* add one or more stems to the current hints table */
+ static void
+ ps_hints_stem( PS_Hints hints,
+ FT_Int dimension,
+ FT_UInt count,
+ FT_Long* stems )
+ {
+ if ( !hints->error )
+ {
+ /* limit "dimension" to 0..1 */
+ if ( dimension < 0 || dimension > 1 )
+ {
+ FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+ dimension ));
+ dimension = ( dimension != 0 );
+ }
+
+ /* record the stems in the current hints/masks table */
+ switch ( hints->hint_type )
+ {
+ case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */
+ case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */
+ {
+ PS_Dimension dim = &hints->dimension[dimension];
+
+
+ for ( ; count > 0; count--, stems += 2 )
+ {
+ FT_Error error;
+ FT_Memory memory = hints->memory;
+
+
+ error = ps_dimension_add_t1stem(
+ dim, (FT_Int)stems[0], (FT_Int)stems[1],
+ memory, NULL );
+ if ( error )
+ {
+ FT_ERROR(( "ps_hints_stem: could not add stem"
+ " (%d,%d) to hints table\n", stems[0], stems[1] ));
+
+ hints->error = error;
+ return;
+ }
+ }
+ break;
+ }
+
+ default:
+ FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n",
+ hints->hint_type ));
+ break;
+ }
+ }
+ }
+
+
+ /* add one Type1 counter stem to the current hints table */
+ static void
+ ps_hints_t1stem3( PS_Hints hints,
+ FT_Int dimension,
+ FT_Fixed* stems )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim;
+ FT_Memory memory = hints->memory;
+ FT_Int count;
+ FT_Int idx[3];
+
+
+ /* limit "dimension" to 0..1 */
+ if ( dimension < 0 || dimension > 1 )
+ {
+ FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+ dimension ));
+ dimension = ( dimension != 0 );
+ }
+
+ dim = &hints->dimension[dimension];
+
+ /* there must be 6 elements in the 'stem' array */
+ if ( hints->hint_type == PS_HINT_TYPE_1 )
+ {
+ /* add the three stems to our hints/masks table */
+ for ( count = 0; count < 3; count++, stems += 2 )
+ {
+ error = ps_dimension_add_t1stem( dim,
+ (FT_Int)FIXED_TO_INT( stems[0] ),
+ (FT_Int)FIXED_TO_INT( stems[1] ),
+ memory, &idx[count] );
+ if ( error )
+ goto Fail;
+ }
+
+ /* now, add the hints to the counters table */
+ error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],
+ memory );
+ if ( error )
+ goto Fail;
+ }
+ else
+ {
+ FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+ }
+
+ return;
+
+ Fail:
+ FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));
+ hints->error = error;
+ }
+
+
+ /* reset hints (only with Type 1 hints) */
+ static void
+ ps_hints_t1reset( PS_Hints hints,
+ FT_UInt end_point )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !hints->error )
+ {
+ FT_Memory memory = hints->memory;
+
+
+ if ( hints->hint_type == PS_HINT_TYPE_1 )
+ {
+ error = ps_dimension_reset_mask( &hints->dimension[0],
+ end_point, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_reset_mask( &hints->dimension[1],
+ end_point, memory );
+ if ( error )
+ goto Fail;
+ }
+ else
+ {
+ /* invalid hint type */
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ /* Type2 "hintmask" operator, add a new hintmask to each direction */
+ static void
+ ps_hints_t2mask( PS_Hints hints,
+ FT_UInt end_point,
+ FT_UInt bit_count,
+ const FT_Byte* bytes )
+ {
+ FT_Error error;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim = hints->dimension;
+ FT_Memory memory = hints->memory;
+ FT_UInt count1 = dim[0].hints.num_hints;
+ FT_UInt count2 = dim[1].hints.num_hints;
+
+
+ /* check bit count; must be equal to current total hint count */
+ if ( bit_count != count1 + count2 )
+ {
+ FT_TRACE0(( "ps_hints_t2mask:"
+ " called with invalid bitcount %d (instead of %d)\n",
+ bit_count, count1 + count2 ));
+
+ /* simply ignore the operator */
+ return;
+ }
+
+ /* set-up new horizontal and vertical hint mask now */
+ error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,
+ end_point, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,
+ end_point, memory );
+ if ( error )
+ goto Fail;
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ static void
+ ps_hints_t2counter( PS_Hints hints,
+ FT_UInt bit_count,
+ const FT_Byte* bytes )
+ {
+ FT_Error error;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim = hints->dimension;
+ FT_Memory memory = hints->memory;
+ FT_UInt count1 = dim[0].hints.num_hints;
+ FT_UInt count2 = dim[1].hints.num_hints;
+
+
+ /* check bit count, must be equal to current total hint count */
+ if ( bit_count != count1 + count2 )
+ {
+ FT_TRACE0(( "ps_hints_t2counter:"
+ " called with invalid bitcount %d (instead of %d)\n",
+ bit_count, count1 + count2 ));
+
+ /* simply ignore the operator */
+ return;
+ }
+
+ /* set-up new horizontal and vertical hint mask now */
+ error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,
+ 0, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,
+ 0, memory );
+ if ( error )
+ goto Fail;
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ /* end recording session */
+ static FT_Error
+ ps_hints_close( PS_Hints hints,
+ FT_UInt end_point )
+ {
+ FT_Error error;
+
+
+ error = hints->error;
+ if ( !error )
+ {
+ FT_Memory memory = hints->memory;
+ PS_Dimension dim = hints->dimension;
+
+
+ error = ps_dimension_end( &dim[0], end_point, memory );
+ if ( !error )
+ {
+ error = ps_dimension_end( &dim[1], end_point, memory );
+ }
+ }
+
+#ifdef DEBUG_HINTER
+ if ( !error )
+ ps_debug_hints = hints;
+#endif
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 HINTS RECORDING INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t1_hints_open( T1_Hints hints )
+ {
+ ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );
+ }
+
+ static void
+ t1_hints_stem( T1_Hints hints,
+ FT_Int dimension,
+ FT_Fixed* coords )
+ {
+ FT_Pos stems[2];
+
+
+ stems[0] = FIXED_TO_INT( coords[0] );
+ stems[1] = FIXED_TO_INT( coords[1] );
+
+ ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ t1_hints_funcs_init( T1_Hints_FuncsRec* funcs )
+ {
+ FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );
+
+ funcs->open = (T1_Hints_OpenFunc) t1_hints_open;
+ funcs->close = (T1_Hints_CloseFunc) ps_hints_close;
+ funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem;
+ funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;
+ funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset;
+ funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 2 HINTS RECORDING INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t2_hints_open( T2_Hints hints )
+ {
+ ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );
+ }
+
+
+ static void
+ t2_hints_stems( T2_Hints hints,
+ FT_Int dimension,
+ FT_Int count,
+ FT_Fixed* coords )
+ {
+ FT_Pos stems[32], y, n;
+ FT_Int total = count;
+
+
+ y = 0;
+ while ( total > 0 )
+ {
+ /* determine number of stems to write */
+ count = total;
+ if ( count > 16 )
+ count = 16;
+
+ /* compute integer stem positions in font units */
+ for ( n = 0; n < count * 2; n++ )
+ {
+ y += coords[n];
+ stems[n] = FIXED_TO_INT( y );
+ }
+
+ /* compute lengths */
+ for ( n = 0; n < count * 2; n += 2 )
+ stems[n + 1] = stems[n + 1] - stems[n];
+
+ /* add them to the current dimension */
+ ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
+
+ total -= count;
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ t2_hints_funcs_init( T2_Hints_FuncsRec* funcs )
+ {
+ FT_MEM_ZERO( funcs, sizeof ( *funcs ) );
+
+ funcs->open = (T2_Hints_OpenFunc) t2_hints_open;
+ funcs->close = (T2_Hints_CloseFunc) ps_hints_close;
+ funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems;
+ funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask;
+ funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;
+ funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
new file mode 100644
index 0000000000..91825db89d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
@@ -0,0 +1,176 @@
+/***************************************************************************/
+/* */
+/* pshrec.h */
+/* */
+/* Postscript (Type1/Type2) hints recorder (specification). */
+/* */
+/* Copyright 2001, 2002, 2003, 2006, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /**************************************************************************/
+ /* */
+ /* The functions defined here are called from the Type 1, CID and CFF */
+ /* font drivers to record the hints of a given character/glyph. */
+ /* */
+ /* The hints are recorded in a unified format, and are later processed */
+ /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */
+ /* grid. */
+ /* */
+ /**************************************************************************/
+
+
+#ifndef __PSHREC_H__
+#define __PSHREC_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLYPH HINTS RECORDER INTERNALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to hint record */
+ typedef struct PS_HintRec_* PS_Hint;
+
+ /* hint types */
+ typedef enum PS_Hint_Type_
+ {
+ PS_HINT_TYPE_1 = 1,
+ PS_HINT_TYPE_2 = 2
+
+ } PS_Hint_Type;
+
+
+ /* hint flags */
+ typedef enum PS_Hint_Flags_
+ {
+ PS_HINT_FLAG_GHOST = 1,
+ PS_HINT_FLAG_BOTTOM = 2
+
+ } PS_Hint_Flags;
+
+
+ /* hint descriptor */
+ typedef struct PS_HintRec_
+ {
+ FT_Int pos;
+ FT_Int len;
+ FT_UInt flags;
+
+ } PS_HintRec;
+
+
+#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE )
+#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST )
+#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM )
+
+
+ /* hints table descriptor */
+ typedef struct PS_Hint_TableRec_
+ {
+ FT_UInt num_hints;
+ FT_UInt max_hints;
+ PS_Hint hints;
+
+ } PS_Hint_TableRec, *PS_Hint_Table;
+
+
+ /* hint and counter mask descriptor */
+ typedef struct PS_MaskRec_
+ {
+ FT_UInt num_bits;
+ FT_UInt max_bits;
+ FT_Byte* bytes;
+ FT_UInt end_point;
+
+ } PS_MaskRec, *PS_Mask;
+
+
+ /* masks and counters table descriptor */
+ typedef struct PS_Mask_TableRec_
+ {
+ FT_UInt num_masks;
+ FT_UInt max_masks;
+ PS_Mask masks;
+
+ } PS_Mask_TableRec, *PS_Mask_Table;
+
+
+ /* dimension-specific hints descriptor */
+ typedef struct PS_DimensionRec_
+ {
+ PS_Hint_TableRec hints;
+ PS_Mask_TableRec masks;
+ PS_Mask_TableRec counters;
+
+ } PS_DimensionRec, *PS_Dimension;
+
+
+ /* glyph hints descriptor */
+ /* dimension 0 => X coordinates + vertical hints/stems */
+ /* dimension 1 => Y coordinates + horizontal hints/stems */
+ typedef struct PS_HintsRec_
+ {
+ FT_Memory memory;
+ FT_Error error;
+ FT_UInt32 magic;
+ PS_Hint_Type hint_type;
+ PS_DimensionRec dimension[2];
+
+ } PS_HintsRec, *PS_Hints;
+
+ /* */
+
+ /* initialize hints recorder */
+ FT_LOCAL( FT_Error )
+ ps_hints_init( PS_Hints hints,
+ FT_Memory memory );
+
+ /* finalize hints recorder */
+ FT_LOCAL( void )
+ ps_hints_done( PS_Hints hints );
+
+ /* initialize Type1 hints recorder interface */
+ FT_LOCAL( void )
+ t1_hints_funcs_init( T1_Hints_FuncsRec* funcs );
+
+ /* initialize Type2 hints recorder interface */
+ FT_LOCAL( void )
+ t2_hints_funcs_init( T2_Hints_FuncsRec* funcs );
+
+
+#ifdef DEBUG_HINTER
+ extern PS_Hints ps_debug_hints;
+ extern int ps_debug_no_horz_hints;
+ extern int ps_debug_no_vert_hints;
+#endif
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __PS_HINTER_RECORD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
new file mode 100644
index 0000000000..888ece1058
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSHinter driver configuration rules
+#
+
+
+# Copyright 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSHINTER driver directory
+#
+PSHINTER_DIR := $(SRC_DIR)/pshinter
+
+
+# compilation flags for the driver
+#
+PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR))
+
+
+# PSHINTER driver sources (i.e., C files)
+#
+PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \
+ $(PSHINTER_DIR)/pshglob.c \
+ $(PSHINTER_DIR)/pshmod.c \
+ $(PSHINTER_DIR)/pshpic.c \
+ $(PSHINTER_DIR)/pshrec.c
+
+
+# PSHINTER driver headers
+#
+PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \
+ $(PSHINTER_DIR)/pshnterr.h
+
+
+# PSHINTER driver object(s)
+#
+# PSHINTER_DRV_OBJ_M is used during `multi' builds.
+# PSHINTER_DRV_OBJ_S is used during `single' builds.
+#
+PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O
+
+# PSHINTER driver source file for single build
+#
+PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c
+
+
+# PSHINTER driver - single object
+#
+$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \
+ $(FREETYPE_H) $(PSHINTER_DRV_H)
+ $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S))
+
+
+# PSHINTER driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H)
+ $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S)
+DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
new file mode 100644
index 0000000000..06c0dda66f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/psnames Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) psnames ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = psmodule pspic ;
+ }
+ else
+ {
+ _sources = psnames ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psnames Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
new file mode 100644
index 0000000000..595aa87671
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
@@ -0,0 +1,670 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* psmodule.c */
+/* */
+/* PSNames module implementation (body). */
+/* */
+/* Copyright 1996-2003, 2005-2008, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#include "psmodule.h"
+#include "pstables.h"
+
+#include "psnamerr.h"
+#include "pspic.h"
+
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+#define VARIANT_BIT 0x80000000UL
+#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ /* Return the Unicode value corresponding to a given glyph. Note that */
+ /* we do deal with glyph variants by detecting a non-initial dot in */
+ /* the name, as in `A.swash' or `e.final'; in this case, the */
+ /* VARIANT_BIT is set in the return value. */
+ /* */
+int FXFT_unicode_from_adobe_name( const char* glyph_name )
+ {
+ /* If the name begins with `uni', then the glyph name may be a */
+ /* hard-coded unicode character code. */
+ if ( glyph_name[0] == 'u' &&
+ glyph_name[1] == 'n' &&
+ glyph_name[2] == 'i' )
+ {
+ /* determine whether the next four characters following are */
+ /* hexadecimal. */
+
+ /* XXX: Add code to deal with ligatures, i.e. glyph names like */
+ /* `uniXXXXYYYYZZZZ'... */
+
+ FT_Int count;
+ FT_UInt32 value = 0;
+ const char* p = glyph_name + 3;
+
+
+ for ( count = 4; count > 0; count--, p++ )
+ {
+ char c = *p;
+ unsigned int d;
+
+
+ d = (unsigned char)c - '0';
+ if ( d >= 10 )
+ {
+ d = (unsigned char)c - 'A';
+ if ( d >= 6 )
+ d = 16;
+ else
+ d += 10;
+ }
+
+ /* Exit if a non-uppercase hexadecimal character was found */
+ /* -- this also catches character codes below `0' since such */
+ /* negative numbers cast to `unsigned int' are far too big. */
+ if ( d >= 16 )
+ break;
+
+ value = ( value << 4 ) + d;
+ }
+
+ /* there must be exactly four hex digits */
+ if ( count == 0 )
+ {
+ if ( *p == '\0' )
+ return value;
+ if ( *p == '.' )
+ return (FT_UInt32)( value | VARIANT_BIT );
+ }
+ }
+
+ /* If the name begins with `u', followed by four to six uppercase */
+ /* hexadecimal digits, it is a hard-coded unicode character code. */
+ if ( glyph_name[0] == 'u' )
+ {
+ FT_Int count;
+ FT_UInt32 value = 0;
+ const char* p = glyph_name + 1;
+
+
+ for ( count = 6; count > 0; count--, p++ )
+ {
+ char c = *p;
+ unsigned int d;
+
+
+ d = (unsigned char)c - '0';
+ if ( d >= 10 )
+ {
+ d = (unsigned char)c - 'A';
+ if ( d >= 6 )
+ d = 16;
+ else
+ d += 10;
+ }
+
+ if ( d >= 16 )
+ break;
+
+ value = ( value << 4 ) + d;
+ }
+
+ if ( count <= 2 )
+ {
+ if ( *p == '\0' )
+ return value;
+ if ( *p == '.' )
+ return (FT_UInt32)( value | VARIANT_BIT );
+ }
+ }
+
+ /* Look for a non-initial dot in the glyph name in order to */
+ /* find variants like `A.swash', `e.final', etc. */
+ {
+ const char* p = glyph_name;
+ const char* dot = NULL;
+
+
+ for ( ; *p; p++ )
+ {
+ if ( *p == '.' && p > glyph_name )
+ {
+ dot = p;
+ break;
+ }
+ }
+
+ /* now look up the glyph in the Adobe Glyph List */
+ if ( !dot )
+ return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
+ else
+ return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
+ VARIANT_BIT );
+ }
+ }
+ #ifdef __cplusplus
+}
+#endif
+
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, FT_UInt32 unicode)
+{
+ int i, count;
+
+ // copy letters
+ while (1) {
+ glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
+ name_offset ++;
+ table_offset ++;
+ if (!(ft_adobe_glyph_list[table_offset-1] & 0x80)) break;
+ }
+ glyph_name[name_offset] = 0;
+
+ // get child count
+ count = ft_adobe_glyph_list[table_offset] & 0x7f;
+
+ // check if we have value for this node
+ if (ft_adobe_glyph_list[table_offset] & 0x80) {
+ unsigned short thiscode = ft_adobe_glyph_list[table_offset+1] * 256 + ft_adobe_glyph_list[table_offset+2];
+ if (thiscode == unicode) // found it!
+ return 1;
+ table_offset += 3;
+ } else
+ table_offset ++;
+
+ // now search in sub-nodes
+ if (count == 0) return 0;
+ for (i = 0; i < count; i ++) {
+ int child_offset = ft_adobe_glyph_list[table_offset+i*2] * 256 + ft_adobe_glyph_list[table_offset+i*2+1];
+ if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
+ // found in child
+ return 1;
+ }
+ return 0;
+}
+
+// XYQ: function for searching Unicode in the glyph list
+void FXFT_adobe_name_from_unicode(char* glyph_name, FT_UInt32 unicode)
+{
+ int i, count;
+
+ // start from top level node
+ count = ft_adobe_glyph_list[1];
+ for (i = 0; i < count; i ++) {
+ int child_offset = ft_adobe_glyph_list[i*2+2] * 256 + ft_adobe_glyph_list[i*2+3];
+ if (xyq_search_node(glyph_name, 0, child_offset, unicode))
+ return;
+ }
+
+ // failed, clear the buffer
+ glyph_name[0] = 0;
+}
+#endif
+
+ /* ft_qsort callback to sort the unicode map */
+ FT_CALLBACK_DEF( int )
+ compare_uni_maps( const void* a,
+ const void* b )
+ {
+ PS_UniMap* map1 = (PS_UniMap*)a;
+ PS_UniMap* map2 = (PS_UniMap*)b;
+ FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode );
+ FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode );
+
+
+ /* sort base glyphs before glyph variants */
+ if ( unicode1 == unicode2 )
+ {
+ if ( map1->unicode > map2->unicode )
+ return 1;
+ else if ( map1->unicode < map2->unicode )
+ return -1;
+ else
+ return 0;
+ }
+ else
+ {
+ if ( unicode1 > unicode2 )
+ return 1;
+ else if ( unicode1 < unicode2 )
+ return -1;
+ else
+ return 0;
+ }
+ }
+
+
+ /* support for extra glyphs not handled (well) in AGL; */
+ /* we add extra mappings for them if necessary */
+
+#define EXTRA_GLYPH_LIST_SIZE 10
+
+ static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
+ {
+ /* WGL 4 */
+ 0x0394,
+ 0x03A9,
+ 0x2215,
+ 0x00AD,
+ 0x02C9,
+ 0x03BC,
+ 0x2219,
+ 0x00A0,
+ /* Romanian */
+ 0x021A,
+ 0x021B
+ };
+
+ static const char ft_extra_glyph_names[] =
+ {
+ 'D','e','l','t','a',0,
+ 'O','m','e','g','a',0,
+ 'f','r','a','c','t','i','o','n',0,
+ 'h','y','p','h','e','n',0,
+ 'm','a','c','r','o','n',0,
+ 'm','u',0,
+ 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+ 's','p','a','c','e',0,
+ 'T','c','o','m','m','a','a','c','c','e','n','t',0,
+ 't','c','o','m','m','a','a','c','c','e','n','t',0
+ };
+
+ static const FT_Int
+ ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
+ {
+ 0,
+ 6,
+ 12,
+ 21,
+ 28,
+ 35,
+ 38,
+ 53,
+ 59,
+ 72
+ };
+
+
+ static void
+ ps_check_extra_glyph_name( const char* gname,
+ FT_UInt glyph,
+ FT_UInt* extra_glyphs,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( ft_strcmp( ft_extra_glyph_names +
+ ft_extra_glyph_name_offsets[n], gname ) == 0 )
+ {
+ if ( states[n] == 0 )
+ {
+ /* mark this extra glyph as a candidate for the cmap */
+ states[n] = 1;
+ extra_glyphs[n] = glyph;
+ }
+
+ return;
+ }
+ }
+ }
+
+
+ static void
+ ps_check_extra_glyph_unicode( FT_UInt32 uni_char,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( uni_char == ft_extra_glyph_unicodes[n] )
+ {
+ /* disable this extra glyph from being added to the cmap */
+ states[n] = 2;
+
+ return;
+ }
+ }
+ }
+
+
+ /* Build a table that maps Unicode values to glyph indices. */
+ static FT_Error
+ ps_unicodes_init( FT_Memory memory,
+ PS_Unicodes table,
+ FT_UInt num_glyphs,
+ PS_GetGlyphNameFunc get_glyph_name,
+ PS_FreeGlyphNameFunc free_glyph_name,
+ FT_Pointer glyph_data )
+ {
+ FT_Error error;
+
+ FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
+
+
+ /* we first allocate the table */
+ table->num_maps = 0;
+ table->maps = 0;
+
+ if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
+ {
+ FT_UInt n;
+ FT_UInt count;
+ PS_UniMap* map;
+ FT_UInt32 uni_char;
+
+
+ map = table->maps;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ const char* gname = get_glyph_name( glyph_data, n );
+
+
+ if ( gname )
+ {
+ ps_check_extra_glyph_name( gname, n,
+ extra_glyphs, extra_glyph_list_states );
+ uni_char = FXFT_unicode_from_adobe_name( gname );
+
+ if ( BASE_GLYPH( uni_char ) != 0 )
+ {
+ ps_check_extra_glyph_unicode( uni_char,
+ extra_glyph_list_states );
+ map->unicode = uni_char;
+ map->glyph_index = n;
+ map++;
+ }
+
+ if ( free_glyph_name )
+ free_glyph_name( glyph_data, gname );
+ }
+ }
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( extra_glyph_list_states[n] == 1 )
+ {
+ /* This glyph name has an additional representation. */
+ /* Add it to the cmap. */
+
+ map->unicode = ft_extra_glyph_unicodes[n];
+ map->glyph_index = extra_glyphs[n];
+ map++;
+ }
+ }
+
+ /* now compress the table a bit */
+ count = (FT_UInt)( map - table->maps );
+
+ if ( count == 0 )
+ {
+ /* No unicode chars here! */
+ FT_FREE( table->maps );
+ if ( !error )
+ error = FT_THROW( No_Unicode_Glyph_Name );
+ }
+ else
+ {
+ /* Reallocate if the number of used entries is much smaller. */
+ if ( count < num_glyphs / 2 )
+ {
+ (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
+ error = FT_Err_Ok;
+ }
+
+ /* Sort the table in increasing order of unicode values, */
+ /* taking care of glyph variants. */
+ ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
+ compare_uni_maps );
+ }
+
+ table->num_maps = count;
+ }
+
+ return error;
+ }
+
+
+ static FT_UInt
+ ps_unicodes_char_index( PS_Unicodes table,
+ FT_UInt32 unicode )
+ {
+ PS_UniMap *min, *max, *mid, *result = NULL;
+
+
+ /* Perform a binary search on the table. */
+
+ min = table->maps;
+ max = min + table->num_maps - 1;
+
+ while ( min <= max )
+ {
+ FT_UInt32 base_glyph;
+
+
+ mid = min + ( ( max - min ) >> 1 );
+
+ if ( mid->unicode == unicode )
+ {
+ result = mid;
+ break;
+ }
+
+ base_glyph = BASE_GLYPH( mid->unicode );
+
+ if ( base_glyph == unicode )
+ result = mid; /* remember match but continue search for base glyph */
+
+ if ( min == max )
+ break;
+
+ if ( base_glyph < unicode )
+ min = mid + 1;
+ else
+ max = mid - 1;
+ }
+
+ if ( result )
+ return result->glyph_index;
+ else
+ return 0;
+ }
+
+
+ static FT_UInt32
+ ps_unicodes_char_next( PS_Unicodes table,
+ FT_UInt32 *unicode )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *unicode + 1;
+
+
+ {
+ FT_UInt min = 0;
+ FT_UInt max = table->num_maps;
+ FT_UInt mid;
+ PS_UniMap* map;
+ FT_UInt32 base_glyph;
+
+
+ while ( min < max )
+ {
+ mid = min + ( ( max - min ) >> 1 );
+ map = table->maps + mid;
+
+ if ( map->unicode == char_code )
+ {
+ result = map->glyph_index;
+ goto Exit;
+ }
+
+ base_glyph = BASE_GLYPH( map->unicode );
+
+ if ( base_glyph == char_code )
+ result = map->glyph_index;
+
+ if ( base_glyph < char_code )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+
+ if ( result )
+ goto Exit; /* we have a variant glyph */
+
+ /* we didn't find it; check whether we have a map just above it */
+ char_code = 0;
+
+ if ( min < table->num_maps )
+ {
+ map = table->maps + min;
+ result = map->glyph_index;
+ char_code = BASE_GLYPH( map->unicode );
+ }
+ }
+
+ Exit:
+ *unicode = char_code;
+ return result;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+ static const char*
+ ps_get_macintosh_name( FT_UInt name_index )
+ {
+ if ( name_index >= FT_NUM_MAC_NAMES )
+ name_index = 0;
+
+ return ft_standard_glyph_names + ft_mac_names[name_index];
+ }
+
+
+ static const char*
+ ps_get_standard_strings( FT_UInt sid )
+ {
+ if ( sid >= FT_NUM_SID_NAMES )
+ return 0;
+
+ return ft_standard_glyph_names + ft_sid_names[sid];
+ }
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+ FT_DEFINE_SERVICE_PSCMAPSREC(
+ pscmaps_interface,
+ (PS_Unicode_ValueFunc) FXFT_unicode_from_adobe_name,
+ (PS_Unicodes_InitFunc) ps_unicodes_init,
+ (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,
+ (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,
+
+ (PS_Macintosh_NameFunc) ps_get_macintosh_name,
+ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+ t1_standard_encoding,
+ t1_expert_encoding )
+
+#else
+
+ FT_DEFINE_SERVICE_PSCMAPSREC(
+ pscmaps_interface,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ (PS_Macintosh_NameFunc) ps_get_macintosh_name,
+ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+ t1_standard_encoding,
+ t1_expert_encoding )
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+ FT_DEFINE_SERVICEDESCREC1(
+ pscmaps_services,
+ FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )
+
+
+ static FT_Pointer
+ psnames_get_service( FT_Module module,
+ const char* service_id )
+ {
+ /* PSCMAPS_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Library library;
+
+
+ if ( !module )
+ return NULL;
+ library = module->library;
+ if ( !library )
+ return NULL;
+#else
+ FT_UNUSED( module );
+#endif
+
+ return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );
+ }
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES_SERVICE( a ) NULL
+#else
+#define PUT_PS_NAMES_SERVICE( a ) a
+#endif
+
+ FT_DEFINE_MODULE(
+ psnames_module_class,
+
+ 0, /* this is not a font driver, nor a renderer */
+ sizeof ( FT_ModuleRec ),
+
+ "psnames", /* driver name */
+ 0x10000L, /* driver version */
+ 0x20000L, /* driver requires FreeType 2 or above */
+
+ PUT_PS_NAMES_SERVICE(
+ (void*)&PSCMAPS_INTERFACE_GET ), /* module specific interface */
+ (FT_Module_Constructor)NULL,
+ (FT_Module_Destructor) NULL,
+ (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) )
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
new file mode 100644
index 0000000000..a6e908257c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSnames module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSNAMES_MODULE
+
+define PSNAMES_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
new file mode 100644
index 0000000000..1f37a8b8a1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* psmodule.h */
+/* */
+/* High-level PSNames module interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSMODULE_H__
+#define __PSMODULE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( psnames_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __PSMODULE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
new file mode 100644
index 0000000000..9cb6c7ebaf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psnamerr.h */
+/* */
+/* PS names module error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PS names module error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSNAMERR_H__
+#define __PSNAMERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSnames_Err_
+#define FT_ERR_BASE FT_Mod_Err_PSnames
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSNAMERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
new file mode 100644
index 0000000000..efc9594e70
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
@@ -0,0 +1,26 @@
+/***************************************************************************/
+/* */
+/* psnames.c */
+/* */
+/* FreeType PSNames module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "../../include/ft2build.h"
+#include "pspic.c"
+#include "psmodule.c"
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
new file mode 100644
index 0000000000..70dfcd9def
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/* */
+/* pspic.c */
+/* */
+/* The FreeType position independent code services for psnames module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pspic.h"
+#include "psnamerr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from psmodule.c */
+ FT_Error
+ FT_Create_Class_pscmaps_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_pscmaps_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+
+ void
+ FT_Init_Class_pscmaps_interface( FT_Library library,
+ FT_Service_PsCMapsRec* clazz );
+
+
+ void
+ psnames_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->psnames )
+ {
+ PSModulePIC* container = (PSModulePIC*)pic_container->psnames;
+
+
+ if ( container->pscmaps_services )
+ FT_Destroy_Class_pscmaps_services( library,
+ container->pscmaps_services );
+ container->pscmaps_services = NULL;
+ FT_FREE( container );
+ pic_container->psnames = NULL;
+ }
+ }
+
+
+ FT_Error
+ psnames_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ PSModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->psnames = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_pscmaps_services(
+ library, &container->pscmaps_services );
+ if ( error )
+ goto Exit;
+ FT_Init_Class_pscmaps_interface( library,
+ &container->pscmaps_interface );
+
+ Exit:
+ if ( error )
+ psnames_module_class_pic_free( library );
+ return error;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
new file mode 100644
index 0000000000..f055e33511
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/* */
+/* pspic.h */
+/* */
+/* The FreeType position independent code services for psnames module. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSPIC_H__
+#define __PSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSCMAPS_SERVICES_GET pscmaps_services
+#define PSCMAPS_INTERFACE_GET pscmaps_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+ typedef struct PSModulePIC_
+ {
+ FT_ServiceDescRec* pscmaps_services;
+ FT_Service_PsCMapsRec pscmaps_interface;
+
+ } PSModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (PSModulePIC*)((lib)->pic_container.psnames) )
+#define PSCMAPS_SERVICES_GET ( GET_PIC( library )->pscmaps_services )
+#define PSCMAPS_INTERFACE_GET ( GET_PIC( library )->pscmaps_interface )
+
+
+ /* see pspic.c for the implementation */
+ void
+ psnames_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ psnames_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
new file mode 100644
index 0000000000..66f039ec41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
@@ -0,0 +1,4184 @@
+/***************************************************************************/
+/* */
+/* pstables.h */
+/* */
+/* PostScript glyph names. */
+/* */
+/* Copyright 2005, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /* This file has been generated automatically -- do not edit! */
+
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const char ft_standard_glyph_names[3696] =
+ {
+ '.','n','u','l','l', 0,
+ 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
+ 'n','o','t','e','q','u','a','l', 0,
+ 'i','n','f','i','n','i','t','y', 0,
+ 'l','e','s','s','e','q','u','a','l', 0,
+ 'g','r','e','a','t','e','r','e','q','u','a','l', 0,
+ 'p','a','r','t','i','a','l','d','i','f','f', 0,
+ 's','u','m','m','a','t','i','o','n', 0,
+ 'p','r','o','d','u','c','t', 0,
+ 'p','i', 0,
+ 'i','n','t','e','g','r','a','l', 0,
+ 'O','m','e','g','a', 0,
+ 'r','a','d','i','c','a','l', 0,
+ 'a','p','p','r','o','x','e','q','u','a','l', 0,
+ 'D','e','l','t','a', 0,
+ 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,
+ 'l','o','z','e','n','g','e', 0,
+ 'a','p','p','l','e', 0,
+ 'f','r','a','n','c', 0,
+ 'G','b','r','e','v','e', 0,
+ 'g','b','r','e','v','e', 0,
+ 'I','d','o','t','a','c','c','e','n','t', 0,
+ 'S','c','e','d','i','l','l','a', 0,
+ 's','c','e','d','i','l','l','a', 0,
+ 'C','a','c','u','t','e', 0,
+ 'c','a','c','u','t','e', 0,
+ 'C','c','a','r','o','n', 0,
+ 'c','c','a','r','o','n', 0,
+ 'd','c','r','o','a','t', 0,
+ '.','n','o','t','d','e','f', 0,
+ 's','p','a','c','e', 0,
+ 'e','x','c','l','a','m', 0,
+ 'q','u','o','t','e','d','b','l', 0,
+ 'n','u','m','b','e','r','s','i','g','n', 0,
+ 'd','o','l','l','a','r', 0,
+ 'p','e','r','c','e','n','t', 0,
+ 'a','m','p','e','r','s','a','n','d', 0,
+ 'q','u','o','t','e','r','i','g','h','t', 0,
+ 'p','a','r','e','n','l','e','f','t', 0,
+ 'p','a','r','e','n','r','i','g','h','t', 0,
+ 'a','s','t','e','r','i','s','k', 0,
+ 'p','l','u','s', 0,
+ 'c','o','m','m','a', 0,
+ 'h','y','p','h','e','n', 0,
+ 'p','e','r','i','o','d', 0,
+ 's','l','a','s','h', 0,
+ 'z','e','r','o', 0,
+ 'o','n','e', 0,
+ 't','w','o', 0,
+ 't','h','r','e','e', 0,
+ 'f','o','u','r', 0,
+ 'f','i','v','e', 0,
+ 's','i','x', 0,
+ 's','e','v','e','n', 0,
+ 'e','i','g','h','t', 0,
+ 'n','i','n','e', 0,
+ 'c','o','l','o','n', 0,
+ 's','e','m','i','c','o','l','o','n', 0,
+ 'l','e','s','s', 0,
+ 'e','q','u','a','l', 0,
+ 'g','r','e','a','t','e','r', 0,
+ 'q','u','e','s','t','i','o','n', 0,
+ 'a','t', 0,
+ 'A', 0,
+ 'B', 0,
+ 'C', 0,
+ 'D', 0,
+ 'E', 0,
+ 'F', 0,
+ 'G', 0,
+ 'H', 0,
+ 'I', 0,
+ 'J', 0,
+ 'K', 0,
+ 'L', 0,
+ 'M', 0,
+ 'N', 0,
+ 'O', 0,
+ 'P', 0,
+ 'Q', 0,
+ 'R', 0,
+ 'S', 0,
+ 'T', 0,
+ 'U', 0,
+ 'V', 0,
+ 'W', 0,
+ 'X', 0,
+ 'Y', 0,
+ 'Z', 0,
+ 'b','r','a','c','k','e','t','l','e','f','t', 0,
+ 'b','a','c','k','s','l','a','s','h', 0,
+ 'b','r','a','c','k','e','t','r','i','g','h','t', 0,
+ 'a','s','c','i','i','c','i','r','c','u','m', 0,
+ 'u','n','d','e','r','s','c','o','r','e', 0,
+ 'q','u','o','t','e','l','e','f','t', 0,
+ 'a', 0,
+ 'b', 0,
+ 'c', 0,
+ 'd', 0,
+ 'e', 0,
+ 'f', 0,
+ 'g', 0,
+ 'h', 0,
+ 'i', 0,
+ 'j', 0,
+ 'k', 0,
+ 'l', 0,
+ 'm', 0,
+ 'n', 0,
+ 'o', 0,
+ 'p', 0,
+ 'q', 0,
+ 'r', 0,
+ 's', 0,
+ 't', 0,
+ 'u', 0,
+ 'v', 0,
+ 'w', 0,
+ 'x', 0,
+ 'y', 0,
+ 'z', 0,
+ 'b','r','a','c','e','l','e','f','t', 0,
+ 'b','a','r', 0,
+ 'b','r','a','c','e','r','i','g','h','t', 0,
+ 'a','s','c','i','i','t','i','l','d','e', 0,
+ 'e','x','c','l','a','m','d','o','w','n', 0,
+ 'c','e','n','t', 0,
+ 's','t','e','r','l','i','n','g', 0,
+ 'f','r','a','c','t','i','o','n', 0,
+ 'y','e','n', 0,
+ 'f','l','o','r','i','n', 0,
+ 's','e','c','t','i','o','n', 0,
+ 'c','u','r','r','e','n','c','y', 0,
+ 'q','u','o','t','e','s','i','n','g','l','e', 0,
+ 'q','u','o','t','e','d','b','l','l','e','f','t', 0,
+ 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,
+ 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,
+ 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,
+ 'f','i', 0,
+ 'f','l', 0,
+ 'e','n','d','a','s','h', 0,
+ 'd','a','g','g','e','r', 0,
+ 'd','a','g','g','e','r','d','b','l', 0,
+ 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,
+ 'p','a','r','a','g','r','a','p','h', 0,
+ 'b','u','l','l','e','t', 0,
+ 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,
+ 'q','u','o','t','e','d','b','l','b','a','s','e', 0,
+ 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,
+ 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,
+ 'e','l','l','i','p','s','i','s', 0,
+ 'p','e','r','t','h','o','u','s','a','n','d', 0,
+ 'q','u','e','s','t','i','o','n','d','o','w','n', 0,
+ 'g','r','a','v','e', 0,
+ 'a','c','u','t','e', 0,
+ 'c','i','r','c','u','m','f','l','e','x', 0,
+ 't','i','l','d','e', 0,
+ 'm','a','c','r','o','n', 0,
+ 'b','r','e','v','e', 0,
+ 'd','o','t','a','c','c','e','n','t', 0,
+ 'd','i','e','r','e','s','i','s', 0,
+ 'r','i','n','g', 0,
+ 'c','e','d','i','l','l','a', 0,
+ 'h','u','n','g','a','r','u','m','l','a','u','t', 0,
+ 'o','g','o','n','e','k', 0,
+ 'c','a','r','o','n', 0,
+ 'e','m','d','a','s','h', 0,
+ 'A','E', 0,
+ 'o','r','d','f','e','m','i','n','i','n','e', 0,
+ 'L','s','l','a','s','h', 0,
+ 'O','s','l','a','s','h', 0,
+ 'O','E', 0,
+ 'o','r','d','m','a','s','c','u','l','i','n','e', 0,
+ 'a','e', 0,
+ 'd','o','t','l','e','s','s','i', 0,
+ 'l','s','l','a','s','h', 0,
+ 'o','s','l','a','s','h', 0,
+ 'o','e', 0,
+ 'g','e','r','m','a','n','d','b','l','s', 0,
+ 'o','n','e','s','u','p','e','r','i','o','r', 0,
+ 'l','o','g','i','c','a','l','n','o','t', 0,
+ 'm','u', 0,
+ 't','r','a','d','e','m','a','r','k', 0,
+ 'E','t','h', 0,
+ 'o','n','e','h','a','l','f', 0,
+ 'p','l','u','s','m','i','n','u','s', 0,
+ 'T','h','o','r','n', 0,
+ 'o','n','e','q','u','a','r','t','e','r', 0,
+ 'd','i','v','i','d','e', 0,
+ 'b','r','o','k','e','n','b','a','r', 0,
+ 'd','e','g','r','e','e', 0,
+ 't','h','o','r','n', 0,
+ 't','h','r','e','e','q','u','a','r','t','e','r','s', 0,
+ 't','w','o','s','u','p','e','r','i','o','r', 0,
+ 'r','e','g','i','s','t','e','r','e','d', 0,
+ 'm','i','n','u','s', 0,
+ 'e','t','h', 0,
+ 'm','u','l','t','i','p','l','y', 0,
+ 't','h','r','e','e','s','u','p','e','r','i','o','r', 0,
+ 'c','o','p','y','r','i','g','h','t', 0,
+ 'A','a','c','u','t','e', 0,
+ 'A','c','i','r','c','u','m','f','l','e','x', 0,
+ 'A','d','i','e','r','e','s','i','s', 0,
+ 'A','g','r','a','v','e', 0,
+ 'A','r','i','n','g', 0,
+ 'A','t','i','l','d','e', 0,
+ 'C','c','e','d','i','l','l','a', 0,
+ 'E','a','c','u','t','e', 0,
+ 'E','c','i','r','c','u','m','f','l','e','x', 0,
+ 'E','d','i','e','r','e','s','i','s', 0,
+ 'E','g','r','a','v','e', 0,
+ 'I','a','c','u','t','e', 0,
+ 'I','c','i','r','c','u','m','f','l','e','x', 0,
+ 'I','d','i','e','r','e','s','i','s', 0,
+ 'I','g','r','a','v','e', 0,
+ 'N','t','i','l','d','e', 0,
+ 'O','a','c','u','t','e', 0,
+ 'O','c','i','r','c','u','m','f','l','e','x', 0,
+ 'O','d','i','e','r','e','s','i','s', 0,
+ 'O','g','r','a','v','e', 0,
+ 'O','t','i','l','d','e', 0,
+ 'S','c','a','r','o','n', 0,
+ 'U','a','c','u','t','e', 0,
+ 'U','c','i','r','c','u','m','f','l','e','x', 0,
+ 'U','d','i','e','r','e','s','i','s', 0,
+ 'U','g','r','a','v','e', 0,
+ 'Y','a','c','u','t','e', 0,
+ 'Y','d','i','e','r','e','s','i','s', 0,
+ 'Z','c','a','r','o','n', 0,
+ 'a','a','c','u','t','e', 0,
+ 'a','c','i','r','c','u','m','f','l','e','x', 0,
+ 'a','d','i','e','r','e','s','i','s', 0,
+ 'a','g','r','a','v','e', 0,
+ 'a','r','i','n','g', 0,
+ 'a','t','i','l','d','e', 0,
+ 'c','c','e','d','i','l','l','a', 0,
+ 'e','a','c','u','t','e', 0,
+ 'e','c','i','r','c','u','m','f','l','e','x', 0,
+ 'e','d','i','e','r','e','s','i','s', 0,
+ 'e','g','r','a','v','e', 0,
+ 'i','a','c','u','t','e', 0,
+ 'i','c','i','r','c','u','m','f','l','e','x', 0,
+ 'i','d','i','e','r','e','s','i','s', 0,
+ 'i','g','r','a','v','e', 0,
+ 'n','t','i','l','d','e', 0,
+ 'o','a','c','u','t','e', 0,
+ 'o','c','i','r','c','u','m','f','l','e','x', 0,
+ 'o','d','i','e','r','e','s','i','s', 0,
+ 'o','g','r','a','v','e', 0,
+ 'o','t','i','l','d','e', 0,
+ 's','c','a','r','o','n', 0,
+ 'u','a','c','u','t','e', 0,
+ 'u','c','i','r','c','u','m','f','l','e','x', 0,
+ 'u','d','i','e','r','e','s','i','s', 0,
+ 'u','g','r','a','v','e', 0,
+ 'y','a','c','u','t','e', 0,
+ 'y','d','i','e','r','e','s','i','s', 0,
+ 'z','c','a','r','o','n', 0,
+ 'e','x','c','l','a','m','s','m','a','l','l', 0,
+ 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,
+ 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,
+ 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,
+ 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,
+ 'A','c','u','t','e','s','m','a','l','l', 0,
+ 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,
+ 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+ 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,
+ 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,
+ 'z','e','r','o','o','l','d','s','t','y','l','e', 0,
+ 'o','n','e','o','l','d','s','t','y','l','e', 0,
+ 't','w','o','o','l','d','s','t','y','l','e', 0,
+ 't','h','r','e','e','o','l','d','s','t','y','l','e', 0,
+ 'f','o','u','r','o','l','d','s','t','y','l','e', 0,
+ 'f','i','v','e','o','l','d','s','t','y','l','e', 0,
+ 's','i','x','o','l','d','s','t','y','l','e', 0,
+ 's','e','v','e','n','o','l','d','s','t','y','l','e', 0,
+ 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,
+ 'n','i','n','e','o','l','d','s','t','y','l','e', 0,
+ 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,
+ 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,
+ 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,
+ 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,
+ 'a','s','u','p','e','r','i','o','r', 0,
+ 'b','s','u','p','e','r','i','o','r', 0,
+ 'c','e','n','t','s','u','p','e','r','i','o','r', 0,
+ 'd','s','u','p','e','r','i','o','r', 0,
+ 'e','s','u','p','e','r','i','o','r', 0,
+ 'i','s','u','p','e','r','i','o','r', 0,
+ 'l','s','u','p','e','r','i','o','r', 0,
+ 'm','s','u','p','e','r','i','o','r', 0,
+ 'n','s','u','p','e','r','i','o','r', 0,
+ 'o','s','u','p','e','r','i','o','r', 0,
+ 'r','s','u','p','e','r','i','o','r', 0,
+ 's','s','u','p','e','r','i','o','r', 0,
+ 't','s','u','p','e','r','i','o','r', 0,
+ 'f','f', 0,
+ 'f','f','i', 0,
+ 'f','f','l', 0,
+ 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,
+ 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+ 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,
+ 'G','r','a','v','e','s','m','a','l','l', 0,
+ 'A','s','m','a','l','l', 0,
+ 'B','s','m','a','l','l', 0,
+ 'C','s','m','a','l','l', 0,
+ 'D','s','m','a','l','l', 0,
+ 'E','s','m','a','l','l', 0,
+ 'F','s','m','a','l','l', 0,
+ 'G','s','m','a','l','l', 0,
+ 'H','s','m','a','l','l', 0,
+ 'I','s','m','a','l','l', 0,
+ 'J','s','m','a','l','l', 0,
+ 'K','s','m','a','l','l', 0,
+ 'L','s','m','a','l','l', 0,
+ 'M','s','m','a','l','l', 0,
+ 'N','s','m','a','l','l', 0,
+ 'O','s','m','a','l','l', 0,
+ 'P','s','m','a','l','l', 0,
+ 'Q','s','m','a','l','l', 0,
+ 'R','s','m','a','l','l', 0,
+ 'S','s','m','a','l','l', 0,
+ 'T','s','m','a','l','l', 0,
+ 'U','s','m','a','l','l', 0,
+ 'V','s','m','a','l','l', 0,
+ 'W','s','m','a','l','l', 0,
+ 'X','s','m','a','l','l', 0,
+ 'Y','s','m','a','l','l', 0,
+ 'Z','s','m','a','l','l', 0,
+ 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,
+ 'o','n','e','f','i','t','t','e','d', 0,
+ 'r','u','p','i','a','h', 0,
+ 'T','i','l','d','e','s','m','a','l','l', 0,
+ 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,
+ 'c','e','n','t','o','l','d','s','t','y','l','e', 0,
+ 'L','s','l','a','s','h','s','m','a','l','l', 0,
+ 'S','c','a','r','o','n','s','m','a','l','l', 0,
+ 'Z','c','a','r','o','n','s','m','a','l','l', 0,
+ 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'B','r','e','v','e','s','m','a','l','l', 0,
+ 'C','a','r','o','n','s','m','a','l','l', 0,
+ 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,
+ 'M','a','c','r','o','n','s','m','a','l','l', 0,
+ 'f','i','g','u','r','e','d','a','s','h', 0,
+ 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,
+ 'O','g','o','n','e','k','s','m','a','l','l', 0,
+ 'R','i','n','g','s','m','a','l','l', 0,
+ 'C','e','d','i','l','l','a','s','m','a','l','l', 0,
+ 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,
+ 'o','n','e','e','i','g','h','t','h', 0,
+ 't','h','r','e','e','e','i','g','h','t','h','s', 0,
+ 'f','i','v','e','e','i','g','h','t','h','s', 0,
+ 's','e','v','e','n','e','i','g','h','t','h','s', 0,
+ 'o','n','e','t','h','i','r','d', 0,
+ 't','w','o','t','h','i','r','d','s', 0,
+ 'z','e','r','o','s','u','p','e','r','i','o','r', 0,
+ 'f','o','u','r','s','u','p','e','r','i','o','r', 0,
+ 'f','i','v','e','s','u','p','e','r','i','o','r', 0,
+ 's','i','x','s','u','p','e','r','i','o','r', 0,
+ 's','e','v','e','n','s','u','p','e','r','i','o','r', 0,
+ 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+ 'n','i','n','e','s','u','p','e','r','i','o','r', 0,
+ 'z','e','r','o','i','n','f','e','r','i','o','r', 0,
+ 'o','n','e','i','n','f','e','r','i','o','r', 0,
+ 't','w','o','i','n','f','e','r','i','o','r', 0,
+ 't','h','r','e','e','i','n','f','e','r','i','o','r', 0,
+ 'f','o','u','r','i','n','f','e','r','i','o','r', 0,
+ 'f','i','v','e','i','n','f','e','r','i','o','r', 0,
+ 's','i','x','i','n','f','e','r','i','o','r', 0,
+ 's','e','v','e','n','i','n','f','e','r','i','o','r', 0,
+ 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+ 'n','i','n','e','i','n','f','e','r','i','o','r', 0,
+ 'c','e','n','t','i','n','f','e','r','i','o','r', 0,
+ 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,
+ 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,
+ 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,
+ 'A','g','r','a','v','e','s','m','a','l','l', 0,
+ 'A','a','c','u','t','e','s','m','a','l','l', 0,
+ 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'A','t','i','l','d','e','s','m','a','l','l', 0,
+ 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'A','r','i','n','g','s','m','a','l','l', 0,
+ 'A','E','s','m','a','l','l', 0,
+ 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,
+ 'E','g','r','a','v','e','s','m','a','l','l', 0,
+ 'E','a','c','u','t','e','s','m','a','l','l', 0,
+ 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'I','g','r','a','v','e','s','m','a','l','l', 0,
+ 'I','a','c','u','t','e','s','m','a','l','l', 0,
+ 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'E','t','h','s','m','a','l','l', 0,
+ 'N','t','i','l','d','e','s','m','a','l','l', 0,
+ 'O','g','r','a','v','e','s','m','a','l','l', 0,
+ 'O','a','c','u','t','e','s','m','a','l','l', 0,
+ 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'O','t','i','l','d','e','s','m','a','l','l', 0,
+ 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'O','E','s','m','a','l','l', 0,
+ 'O','s','l','a','s','h','s','m','a','l','l', 0,
+ 'U','g','r','a','v','e','s','m','a','l','l', 0,
+ 'U','a','c','u','t','e','s','m','a','l','l', 0,
+ 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'Y','a','c','u','t','e','s','m','a','l','l', 0,
+ 'T','h','o','r','n','s','m','a','l','l', 0,
+ 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ '0','0','1','.','0','0','0', 0,
+ '0','0','1','.','0','0','1', 0,
+ '0','0','1','.','0','0','2', 0,
+ '0','0','1','.','0','0','3', 0,
+ 'B','l','a','c','k', 0,
+ 'B','o','l','d', 0,
+ 'B','o','o','k', 0,
+ 'L','i','g','h','t', 0,
+ 'M','e','d','i','u','m', 0,
+ 'R','e','g','u','l','a','r', 0,
+ 'R','o','m','a','n', 0,
+ 'S','e','m','i','b','o','l','d', 0,
+ };
+
+
+#define FT_NUM_MAC_NAMES 258
+
+ /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const short ft_mac_names[FT_NUM_MAC_NAMES] =
+ {
+ 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
+ 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,
+ 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,
+ 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
+ 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,
+ 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,
+ 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,
+ 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,
+ 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,
+ 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,
+ 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76,
+ 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,
+ 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,
+ 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,
+ 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,
+ 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,
+ 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,
+ 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
+ 209, 218, 225, 232, 239, 246
+ };
+
+
+#define FT_NUM_SID_NAMES 391
+
+ /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const short ft_sid_names[FT_NUM_SID_NAMES] =
+ {
+ 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
+ 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,
+ 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,
+ 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,
+ 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,
+ 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,
+ 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,
+ 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,
+ 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,
+ 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,
+ 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,
+ 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,
+ 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,
+ 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,
+ 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,
+ 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,
+ 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,
+ 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,
+ 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,
+ 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,
+ 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,
+ 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,
+ 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,
+ 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,
+ 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,
+ 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,
+ 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,
+ 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687
+ };
+
+
+ /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned short t1_standard_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,
+ 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123,
+ 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136,
+ 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0,
+ 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0
+ };
+
+
+ /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned short t1_expert_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,
+ 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,
+ 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262,
+ 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272,
+ 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
+ 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313,
+ 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319,
+ 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330,
+ 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,
+ 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,
+ 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378
+ };
+
+
+ /*
+ * This table is a compressed version of the Adobe Glyph List (AGL),
+ * optimized for efficient searching. It has been generated by the
+ * `glnames.py' python script located in the `src/tools' directory.
+ *
+ * The lookup function to get the Unicode value for a given string
+ * is defined below the table.
+ */
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned char ft_adobe_glyph_list[55997L] =
+ {
+ 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23,
+ 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,
+ 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,
+ 32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,
+ 88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,
+ 135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,
+ 202, 25,204,166,208,209,209, 81,215, 26, 65,143, 0, 65, 0,140,
+ 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40,
+ 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198,
+ 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225,
+ 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225,
+ 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247,
+ 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0,
+ 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242,
+ 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119,
+ 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,
+ 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,
+ 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205,
+ 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230,
+ 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105,
+ 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,
+ 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,
+ 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,
+ 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1,
+ 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,
+ 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225,
+ 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1,
+ 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210,
+ 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247,
+ 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160,
+ 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0,
+ 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,
+ 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249,
+ 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228,
+ 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2,
+ 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225,
+ 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128,
+ 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131,
+ 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250,
+ 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229,
+ 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195,
+ 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,
+ 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2,
+ 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242,
+ 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227,
+ 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101,
+ 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128,
+ 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97,
+ 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229,
+ 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128,
+ 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,
+ 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67,
+ 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4,
+ 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237,
+ 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242,
+ 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99,
+ 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228,
+ 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101,
+ 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3,
+ 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1,
+ 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128,
+ 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,
+ 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238,
+ 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103,
+ 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99,
+ 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229,
+ 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227,
+ 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236,
+ 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233,
+ 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110,
+ 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236,
+ 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,
+ 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237,
+ 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,
+ 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,
+ 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68,
+ 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231,
+ 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241,
+ 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27,
+ 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225,
+ 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242,
+ 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,
+ 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229,
+ 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16,
+ 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30,
+ 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5,
+ 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240,
+ 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242,
+ 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5,
+ 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202,
+ 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,
+ 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,
+ 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233,
+ 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14,
+ 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,
+ 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34,
+ 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100,
+ 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6,
+ 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6,
+ 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5,
+ 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0,
+ 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7,
+ 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9,
+ 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243,
+ 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99,
+ 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128,
+ 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,
+ 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2,
+ 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135,
+ 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71,
+ 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,
+ 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,
+ 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,
+ 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,
+ 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7,
+ 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243,
+ 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239,
+ 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1,
+ 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,
+ 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243,
+ 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237,
+ 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101,
+ 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239,
+ 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233,
+ 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242,
+ 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225,
+ 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239,
+ 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22,
+ 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,
+ 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4,
+ 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99,
+ 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,
+ 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227,
+ 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249,
+ 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231,
+ 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233,
+ 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136,
+ 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4,
+ 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242,
+ 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33,
+ 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243,
+ 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,
+ 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52,
+ 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238,
+ 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129,
+ 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101,
+ 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111,
+ 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239,
+ 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70,
+ 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10,
+ 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,
+ 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225,
+ 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233,
+ 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9,
+ 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229,
+ 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,
+ 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,
+ 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10,
+ 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,
+ 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10,
+ 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129,
+ 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231,
+ 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101,
+ 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239,
+ 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99,
+ 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,
+ 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34,
+ 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1,
+ 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10,
+ 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,
+ 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,
+ 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243,
+ 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146,
+ 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4,
+ 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225,
+ 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4,
+ 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,
+ 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,
+ 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11,
+ 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2,
+ 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11,
+ 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,
+ 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179,
+ 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,
+ 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,
+ 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225,
+ 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227,
+ 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178,
+ 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4,
+ 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229,
+ 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228,
+ 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236,
+ 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12,
+ 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2,
+ 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,
+ 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,
+ 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,
+ 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225,
+ 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,
+ 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,
+ 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12,
+ 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,
+ 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,
+ 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213,
+ 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101,
+ 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,
+ 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239,
+ 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36,
+ 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236,
+ 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3,
+ 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8,
+ 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147,
+ 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,
+ 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48,
+ 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236,
+ 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229,
+ 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236,
+ 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17,
+ 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128,
+ 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3,
+ 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4,
+ 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10,
+ 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25,
+ 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64,
+ 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240,
+ 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,
+ 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236,
+ 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97,
+ 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,
+ 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239,
+ 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108,
+ 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101,
+ 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,
+ 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99,
+ 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,
+ 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41,
+ 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,
+ 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191,
+ 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110,
+ 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,
+ 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15,
+ 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,
+ 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,
+ 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15,
+ 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,
+ 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245,
+ 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228,
+ 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,
+ 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,
+ 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249,
+ 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225,
+ 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,
+ 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,
+ 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236,
+ 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1,
+ 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82,
+ 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225,
+ 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126,
+ 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233,
+ 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234,
+ 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229,
+ 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,
+ 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242,
+ 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222,
+ 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,
+ 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17,
+ 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,
+ 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227,
+ 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17,
+ 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228,
+ 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236,
+ 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,
+ 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228,
+ 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128,
+ 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,
+ 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,
+ 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30,
+ 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17,
+ 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236,
+ 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17,
+ 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,
+ 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2,
+ 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,
+ 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,
+ 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128,
+ 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,
+ 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101,
+ 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,
+ 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138,
+ 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45,
+ 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128,
+ 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,
+ 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2,
+ 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229,
+ 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,
+ 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110,
+ 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30,
+ 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,
+ 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128,
+ 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236,
+ 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132,
+ 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,
+ 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236,
+ 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237,
+ 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229,
+ 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4,
+ 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19,
+ 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229,
+ 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19,
+ 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0,
+ 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,
+ 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,
+ 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,
+ 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,
+ 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3,
+ 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245,
+ 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242,
+ 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236,
+ 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244,
+ 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238,
+ 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0,
+ 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20,
+ 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85,
+ 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246,
+ 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21,
+ 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,
+ 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,
+ 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,
+ 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80,
+ 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225,
+ 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101,
+ 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,
+ 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,
+ 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238,
+ 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162,
+ 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,
+ 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159,
+ 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225,
+ 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,
+ 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237,
+ 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3,
+ 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22,
+ 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247,
+ 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,
+ 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236,
+ 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22,
+ 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,
+ 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,
+ 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,
+ 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,
+ 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,
+ 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,
+ 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233,
+ 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,
+ 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107,
+ 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238,
+ 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128,
+ 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249,
+ 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112,
+ 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,
+ 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,
+ 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23,
+ 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,
+ 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76,
+ 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23,
+ 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1,
+ 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,
+ 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242,
+ 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227,
+ 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,
+ 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,
+ 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28,
+ 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225,
+ 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,
+ 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,
+ 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,
+ 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129,
+ 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0,
+ 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,
+ 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25,
+ 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24,
+ 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,
+ 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,
+ 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,
+ 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,
+ 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,
+ 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,
+ 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37,
+ 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,
+ 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,
+ 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,
+ 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,
+ 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,
+ 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25,
+ 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,
+ 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,
+ 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,
+ 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,
+ 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,
+ 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,
+ 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,
+ 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,
+ 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25,
+ 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37,
+ 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,
+ 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,
+ 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32,
+ 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,
+ 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26,
+ 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239,
+ 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,
+ 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1,
+ 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216,
+ 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,
+ 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200,
+ 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227,
+ 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227,
+ 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,
+ 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26,
+ 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246,
+ 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34,
+ 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229,
+ 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128,
+ 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41,
+ 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242,
+ 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233,
+ 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163,
+ 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,
+ 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,
+ 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244,
+ 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84,
+ 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177,
+ 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226,
+ 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225,
+ 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233,
+ 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,
+ 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225,
+ 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,
+ 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,
+ 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249,
+ 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128,
+ 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180,
+ 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2,
+ 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128,
+ 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,
+ 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236,
+ 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5,
+ 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,
+ 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225,
+ 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28,
+ 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132,
+ 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232,
+ 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227,
+ 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2,
+ 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,
+ 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29,
+ 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,
+ 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0,
+ 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,
+ 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128,
+ 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245,
+ 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239,
+ 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,
+ 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108,
+ 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225,
+ 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29,
+ 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,
+ 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30,
+ 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128,
+ 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110,
+ 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,
+ 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243,
+ 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30,
+ 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,
+ 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,
+ 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,
+ 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,
+ 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,
+ 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236,
+ 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242,
+ 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128,
+ 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106,
+ 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228,
+ 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,
+ 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243,
+ 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,
+ 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232,
+ 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3,
+ 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243,
+ 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239,
+ 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237,
+ 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233,
+ 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242,
+ 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108,
+ 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227,
+ 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229,
+ 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101,
+ 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,
+ 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32,
+ 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,
+ 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,
+ 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18,
+ 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107,
+ 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,
+ 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108,
+ 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32,
+ 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,
+ 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36,
+ 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170,
+ 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32,
+ 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,
+ 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,
+ 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,
+ 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,
+ 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242,
+ 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,
+ 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105,
+ 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,
+ 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33,
+ 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,
+ 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96,
+ 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,
+ 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128,
+ 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33,
+ 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225,
+ 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229,
+ 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2,
+ 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43,
+ 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107,
+ 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34,
+ 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69,
+ 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237,
+ 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227,
+ 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,
+ 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34,
+ 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239,
+ 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4,
+ 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233,
+ 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227,
+ 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174,
+ 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2,
+ 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227,
+ 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110,
+ 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,
+ 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,
+ 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227,
+ 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3,
+ 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4,
+ 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,
+ 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233,
+ 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3,
+ 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,
+ 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233,
+ 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128,
+ 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242,
+ 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243,
+ 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238,
+ 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,
+ 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128,
+ 247,122,244,242,239,235,101,128, 1,181, 97,158, 0, 97, 36, 26,
+ 38,154, 39, 4, 39, 68, 39,132, 39,196, 40, 4, 40, 68, 40,126,
+ 40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,
+ 50, 0, 50,225, 51, 7, 52, 96, 52,168, 53,123, 53,132, 54, 5,
+ 56, 13, 57, 3, 57, 50, 57,201, 57,215, 49,138, 39, 1, 36, 50,
+ 36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,
+ 38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,
+ 36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,
+ 39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,
+ 39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,
+ 38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,
+ 36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,
+ 39, 9, 56,128, 39, 8, 57,128, 39, 7, 50,138, 38, 30, 36,178,
+ 36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,
+ 36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,
+ 36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,
+ 36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,
+ 36,246, 36,250, 36,254, 37, 2, 37, 6, 37, 10, 37, 14, 37, 18,
+ 37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,
+ 39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,
+ 39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,
+ 37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,
+ 37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,
+ 39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,
+ 39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,
+ 37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,
+ 37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,
+ 39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,
+ 39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,
+ 37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,
+ 37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,
+ 33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,
+ 39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,
+ 37,246, 37,250, 37,254, 38, 2, 38, 6, 38, 10, 38, 14, 38, 18,
+ 38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,
+ 39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,
+ 39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,
+ 38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,
+ 38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,
+ 39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,
+ 39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,
+ 38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,
+ 38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,
+ 39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,
+ 39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39, 2, 38,178,
+ 38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,
+ 39, 0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,
+ 38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39, 3,
+ 51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,
+ 49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,
+ 53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,
+ 57,128, 39, 34, 51,138, 39, 4, 39, 28, 39, 32, 39, 36, 39, 40,
+ 39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,
+ 49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,
+ 53,128, 38, 5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,
+ 57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,
+ 39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,
+ 49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,
+ 53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,
+ 57,128, 39, 54, 53,138, 39, 6, 39,156, 39,160, 39,164, 39,168,
+ 39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,
+ 49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,
+ 53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,
+ 57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,
+ 39,236, 39,240, 39,244, 39,248, 39,252, 40, 0, 48,128, 39, 65,
+ 49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,
+ 53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,
+ 57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,
+ 40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,
+ 49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,
+ 53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,
+ 57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,
+ 40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,
+ 39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,
+ 39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,
+ 39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,
+ 40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,
+ 39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,
+ 39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97, 7,
+ 40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,
+ 238,231,225,236,105,128, 9,134,227,245,244,101,128, 0,225,228,
+ 229,246, 97,128, 9, 6,231,117, 2, 40,237, 40,246,234,225,242,
+ 225,244,105,128, 10,134,242,237,245,235,232,105,128, 10, 6,237,
+ 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,
+ 245,243,241,245,225,242,101,128, 51, 3,246,239,247,229,236,243,
+ 233,231,110, 3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,
+ 105,128, 9,190,228,229,246, 97,128, 9, 62,231,245,234,225,242,
+ 225,244,105,128, 10,190, 98, 4, 41, 80, 41,121, 41,130, 41,140,
+ 226,242,229,246,233,225,244,233,239,110, 2, 41, 95, 41,110,237,
+ 225,242,235,225,242,237,229,238,233,225,110,128, 5, 95,243,233,
+ 231,238,228,229,246, 97,128, 9,112,229,238,231,225,236,105,128,
+ 9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,
+ 134, 1, 3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,
+ 227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,
+ 4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,
+ 246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,
+ 179,244,233,236,228,101,128, 30,181, 99, 4, 41,227, 41,234, 42,
+ 57, 42,127,225,242,239,110,128, 1,206,233,242, 99, 2, 41,242,
+ 41,247,236,101,128, 36,208,245,237,230,236,229,120,133, 0,226,
+ 42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,
+ 30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,
+ 246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,
+ 169,244,233,236,228,101,128, 30,171,245,244,101,133, 0,180, 42,
+ 73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,
+ 98,128, 3, 23, 99, 2, 42, 90, 42, 95,237, 98,128, 3, 1,239,
+ 237, 98,128, 3, 1,228,229,246, 97,128, 9, 84,236,239,247,237,
+ 239,100,128, 2,207,244,239,238,229,227,237, 98,128, 3, 65,249,
+ 242,233,236,236,233, 99,128, 4, 48,100, 5, 42,149, 42,159, 42,
+ 173, 42,179, 42,213,226,236,231,242,225,246,101,128, 2, 1,228,
+ 225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,
+ 128, 9, 5,233,229,242,229,243,233,115,130, 0,228, 42,193, 42,
+ 204,227,249,242,233,236,236,233, 99,128, 4,211,237,225,227,242,
+ 239,110,128, 1,223,239,116, 2, 42,220, 42,228,226,229,236,239,
+ 119,128, 30,161,237,225,227,242,239,110,128, 1,225,101,131, 0,
+ 230, 42,247, 42,255, 43, 8,225,227,245,244,101,128, 1,253,235,
+ 239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128, 1,
+ 227,230,233,105, 6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,
+ 111, 48, 2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,
+ 180, 49,128, 32,164,177, 48, 3, 43, 62, 45, 86, 45,221, 48, 9,
+ 43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,
+ 45, 24, 49, 3, 43, 90, 43, 94, 43, 98, 55,128, 4, 16, 56,128,
+ 4, 17, 57,128, 4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,
+ 43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128, 4, 19,
+ 49,128, 4, 20, 50,128, 4, 21, 51,128, 4, 1, 52,128, 4, 22,
+ 53,128, 4, 23, 54,128, 4, 24, 55,128, 4, 25, 56,128, 4, 26,
+ 57,128, 4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,
+ 43,206, 43,210, 43,214, 43,218, 43,222, 48,128, 4, 28, 49,128,
+ 4, 29, 50,128, 4, 30, 51,128, 4, 31, 52,128, 4, 32, 53,128,
+ 4, 33, 54,128, 4, 34, 55,128, 4, 35, 56,128, 4, 36, 57,128,
+ 4, 37, 52, 10, 43,248, 43,252, 44, 0, 44, 4, 44, 8, 44, 12,
+ 44, 16, 44, 20, 44, 24, 44, 28, 48,128, 4, 38, 49,128, 4, 39,
+ 50,128, 4, 40, 51,128, 4, 41, 52,128, 4, 42, 53,128, 4, 43,
+ 54,128, 4, 44, 55,128, 4, 45, 56,128, 4, 46, 57,128, 4, 47,
+ 53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,
+ 44, 82, 44, 86, 44, 90, 48,128, 4,144, 49,128, 4, 2, 50,128,
+ 4, 3, 51,128, 4, 4, 52,128, 4, 5, 53,128, 4, 6, 54,128,
+ 4, 7, 55,128, 4, 8, 56,128, 4, 9, 57,128, 4, 10, 54, 10,
+ 44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,
+ 44,148, 44,152, 48,128, 4, 11, 49,128, 4, 12, 50,128, 4, 14,
+ 51,128,246,196, 52,128,246,197, 53,128, 4, 48, 54,128, 4, 49,
+ 55,128, 4, 50, 56,128, 4, 51, 57,128, 4, 52, 55, 10, 44,178,
+ 44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,
+ 44,214, 48,128, 4, 53, 49,128, 4, 81, 50,128, 4, 54, 51,128,
+ 4, 55, 52,128, 4, 56, 53,128, 4, 57, 54,128, 4, 58, 55,128,
+ 4, 59, 56,128, 4, 60, 57,128, 4, 61, 56, 10, 44,240, 44,244,
+ 44,248, 44,252, 45, 0, 45, 4, 45, 8, 45, 12, 45, 16, 45, 20,
+ 48,128, 4, 62, 49,128, 4, 63, 50,128, 4, 64, 51,128, 4, 65,
+ 52,128, 4, 66, 53,128, 4, 67, 54,128, 4, 68, 55,128, 4, 69,
+ 56,128, 4, 70, 57,128, 4, 71, 57, 10, 45, 46, 45, 50, 45, 54,
+ 45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,
+ 4, 72, 49,128, 4, 73, 50,128, 4, 74, 51,128, 4, 75, 52,128,
+ 4, 76, 53,128, 4, 77, 54,128, 4, 78, 55,128, 4, 79, 56,128,
+ 4,145, 57,128, 4, 82, 49, 4, 45, 96, 45,158, 45,163, 45,189,
+ 48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,
+ 45,146, 45,150, 45,154, 48,128, 4, 83, 49,128, 4, 84, 50,128,
+ 4, 85, 51,128, 4, 86, 52,128, 4, 87, 53,128, 4, 88, 54,128,
+ 4, 89, 55,128, 4, 90, 56,128, 4, 91, 57,128, 4, 92,177, 48,
+ 128, 4, 94, 52, 4, 45,173, 45,177, 45,181, 45,185, 53,128, 4,
+ 15, 54,128, 4, 98, 55,128, 4,114, 56,128, 4,116, 57, 5, 45,
+ 201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128, 4,
+ 95, 52,128, 4, 99, 53,128, 4,115, 54,128, 4,117, 56, 2, 45,
+ 227, 45,241, 51, 2, 45,233, 45,237, 49,128,246,199, 50,128,246,
+ 200,180, 54,128, 4,217,178,185, 57,128, 32, 14,179, 48, 2, 46,
+ 3, 46, 7, 48,128, 32, 15, 49,128, 32, 13,181, 55, 7, 46, 28,
+ 46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51, 2, 46, 34,
+ 46, 48, 56, 2, 46, 40, 46, 44, 49,128, 6,106, 56,128, 6, 12,
+ 57, 8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,
+ 46, 94, 50,128, 6, 96, 51,128, 6, 97, 52,128, 6, 98, 53,128,
+ 6, 99, 54,128, 6,100, 55,128, 6,101, 56,128, 6,102, 57,128,
+ 6,103, 52, 7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,
+ 47,158, 48, 5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,
+ 6,104, 49,128, 6,105, 51,128, 6, 27, 55,128, 6, 31, 57,128,
+ 6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,
+ 46,192, 46,196, 46,200, 46,204, 48,128, 6, 34, 49,128, 6, 35,
+ 50,128, 6, 36, 51,128, 6, 37, 52,128, 6, 38, 53,128, 6, 39,
+ 54,128, 6, 40, 55,128, 6, 41, 56,128, 6, 42, 57,128, 6, 43,
+ 50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,
+ 47, 2, 47, 6, 47, 10, 48,128, 6, 44, 49,128, 6, 45, 50,128,
+ 6, 46, 51,128, 6, 47, 52,128, 6, 48, 53,128, 6, 49, 54,128,
+ 6, 50, 55,128, 6, 51, 56,128, 6, 52, 57,128, 6, 53, 51, 5,
+ 47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128, 6, 54, 49,128,
+ 6, 55, 50,128, 6, 56, 51,128, 6, 57, 52,128, 6, 58, 52, 9,
+ 47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,
+ 47, 98, 48,128, 6, 64, 49,128, 6, 65, 50,128, 6, 66, 51,128,
+ 6, 67, 52,128, 6, 68, 53,128, 6, 69, 54,128, 6, 70, 56,128,
+ 6, 72, 57,128, 6, 73, 53, 9, 47,122, 47,126, 47,130, 47,134,
+ 47,138, 47,142, 47,146, 47,150, 47,154, 48,128, 6, 74, 49,128,
+ 6, 75, 50,128, 6, 76, 51,128, 6, 77, 52,128, 6, 78, 53,128,
+ 6, 79, 54,128, 6, 80, 55,128, 6, 81, 56,128, 6, 82,183, 48,
+ 128, 6, 71, 53, 3, 47,171, 47,203, 47,235, 48, 5, 47,183, 47,
+ 187, 47,191, 47,195, 47,199, 53,128, 6,164, 54,128, 6,126, 55,
+ 128, 6,134, 56,128, 6,152, 57,128, 6,175, 49, 5, 47,215, 47,
+ 219, 47,223, 47,227, 47,231, 49,128, 6,121, 50,128, 6,136, 51,
+ 128, 6,145, 52,128, 6,186, 57,128, 6,210,179, 52,128, 6,213,
+ 54, 7, 48, 0, 48, 5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,
+ 179, 54,128, 32,170,180, 53,128, 5,190,181, 56,128, 5,195, 54,
+ 6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128, 5,
+ 208, 53,128, 5,209, 54,128, 5,210, 55,128, 5,211, 56,128, 5,
+ 212, 57,128, 5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,
+ 91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128, 5,214, 49,
+ 128, 5,215, 50,128, 5,216, 51,128, 5,217, 52,128, 5,218, 53,
+ 128, 5,219, 54,128, 5,220, 55,128, 5,221, 56,128, 5,222, 57,
+ 128, 5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,
+ 157, 48,161, 48,165, 48,169, 48,173, 48,128, 5,224, 49,128, 5,
+ 225, 50,128, 5,226, 51,128, 5,227, 52,128, 5,228, 53,128, 5,
+ 229, 54,128, 5,230, 55,128, 5,231, 56,128, 5,232, 57,128, 5,
+ 233, 57, 3, 48,185, 48,189, 48,193, 48,128, 5,234, 52,128,251,
+ 42, 53,128,251, 43, 55, 4, 48,207, 48,221, 48,241, 48,246, 48,
+ 2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49, 3, 48,
+ 229, 48,233, 48,237, 54,128, 5,240, 55,128, 5,241, 56,128, 5,
+ 242,178, 51,128,251, 53, 57, 7, 49, 6, 49, 10, 49, 14, 49, 18,
+ 49, 22, 49, 26, 49, 30, 51,128, 5,180, 52,128, 5,181, 53,128,
+ 5,182, 54,128, 5,187, 55,128, 5,184, 56,128, 5,183, 57,128,
+ 5,176, 56, 3, 49, 42, 49, 86, 49, 91, 48, 7, 49, 58, 49, 62,
+ 49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128, 5,178, 49,128,
+ 5,177, 50,128, 5,179, 51,128, 5,194, 52,128, 5,193, 54,128,
+ 5,185, 55,128, 5,188,179, 57,128, 5,189, 52, 2, 49, 97, 49,
+ 101, 49,128, 5,191, 50,128, 5,192,185,178, 57,128, 2,188, 54,
+ 3, 49,119, 49,178, 49,185, 49, 4, 49,129, 49,145, 49,151, 49,
+ 172, 50, 2, 49,135, 49,140,180, 56,128, 33, 5,184, 57,128, 33,
+ 19,179,181, 50,128, 33, 22,181, 55, 3, 49,160, 49,164, 49,168,
+ 51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,
+ 32, 12,179,177,182, 55,128, 6,109,180,185,179, 55,128, 2,189,
+ 103, 2, 49,198, 49,205,242,225,246,101,128, 0,224,117, 2, 49,
+ 211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,
+ 232,105,128, 10, 5,104, 2, 49,235, 49,245,233,242,225,231,225,
+ 238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,
+ 105, 7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,
+ 98, 2, 50, 22, 50, 31,229,238,231,225,236,105,128, 9,144,239,
+ 240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128, 9, 16,
+ 229,227,249,242,233,236,236,233, 99,128, 4,213,231,117, 2, 50,
+ 67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,
+ 232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,
+ 232,105,128, 10, 72,110, 5, 50,113, 50,122, 50,136, 50,152, 50,
+ 167,225,242,225,226,233, 99,128, 6, 57,230,233,238,225,236,225,
+ 242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,
+ 225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 3,246,239,247,229,236,243,233,231,110, 3, 50,
+ 197, 50,207, 50,214,226,229,238,231,225,236,105,128, 9,200,228,
+ 229,246, 97,128, 9, 72,231,245,234,225,242,225,244,105,128, 10,
+ 200,107, 2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,
+ 162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,
+ 242,229,225,110,128, 49, 79,108, 3, 51, 15, 52, 71, 52, 80,101,
+ 2, 51, 21, 52, 66,102,136, 5,208, 51, 41, 51, 50, 51, 65, 51,
+ 79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,
+ 6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,
+ 48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,
+ 2, 51, 85, 51,160,225,237,250, 97, 2, 51, 94, 51,127,225,226,
+ 239,246,101, 2, 51,104, 51,113,225,242,225,226,233, 99,128, 6,
+ 35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,
+ 229,236,239,119, 2, 51,137, 51,146,225,242,225,226,233, 99,128,
+ 6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,
+ 229,226,242,229,119,128, 5,208,236,225,237,229,228,232,229,226,
+ 242,229,119,128,251, 79,237, 97, 2, 51,189, 51,225,228,228,225,
+ 225,226,239,246,101, 2, 51,202, 51,211,225,242,225,226,233, 99,
+ 128, 6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 130,235,243,245,242, 97, 4, 51,239, 51,248, 52, 6, 52, 22,225,
+ 242,225,226,233, 99,128, 6, 73,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,
+ 233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,
+ 128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,
+ 251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,
+ 240,232, 97,129, 3,177, 52, 88,244,239,238,239,115,128, 3,172,
+ 109, 4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,
+ 1, 1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,
+ 243,225,238,100,130, 0, 38, 52,139, 52,151,237,239,238,239,243,
+ 240,225,227,101,128,255, 6,243,237,225,236,108,128,247, 38,243,
+ 241,245,225,242,101,128, 51,194,110, 4, 52,178, 52,189, 53, 55,
+ 53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103, 4, 52,
+ 199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,
+ 49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,
+ 236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,
+ 229,116, 2, 52,247, 53, 11,236,229,230,116,129, 48, 8, 53, 0,
+ 246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,
+ 129, 48, 9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,
+ 236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,
+ 244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128, 3,
+ 135,117, 2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,
+ 128, 9, 82,243,246,225,242, 97, 3, 53, 95, 53,105, 53,112,226,
+ 229,238,231,225,236,105,128, 9,130,228,229,246, 97,128, 9, 2,
+ 231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,
+ 107,128, 1, 5,112, 3, 53,140, 53,164, 53,194, 97, 2, 53,146,
+ 53,158,225,244,239,243,241,245,225,242,101,128, 51, 0,242,229,
+ 110,128, 36,156,239,243,244,242,239,240,232,101, 2, 53,177, 53,
+ 188,225,242,237,229,238,233,225,110,128, 5, 90,237,239,100,128,
+ 2,188,112, 2, 53,200, 53,205,236,101,128,248,255,242,111, 2,
+ 53,212, 53,220,225,227,232,229,115,128, 34, 80,120, 2, 53,226,
+ 53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,
+ 225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,
+ 225,108,128, 34, 69,114, 4, 54, 15, 54, 42, 54, 46, 54, 91,225,
+ 229, 97, 2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,
+ 142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105, 2,
+ 54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,
+ 30,154,238,103,130, 0,229, 54, 75, 54, 83,225,227,245,244,101,
+ 128, 1,251,226,229,236,239,119,128, 30, 1,242,239,119, 8, 54,
+ 111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56, 4,226,
+ 239,244,104,128, 33,148,100, 3, 54,126, 54,165, 54,212,225,243,
+ 104, 4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,
+ 227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,
+ 245,112,128, 33,225,226,108, 5, 54,178, 54,185, 54,192, 54,199,
+ 54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,
+ 236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,
+ 112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,
+ 236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,
+ 232,233,244,101,128, 33,233,104, 2, 54,253, 55, 48,229,225,100,
+ 4, 55, 9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,
+ 128, 2,197,236,229,230,244,237,239,100,128, 2,194,242,233,231,
+ 232,244,237,239,100,128, 2,195,245,240,237,239,100,128, 2,196,
+ 239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,
+ 55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,
+ 242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,
+ 128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,
+ 132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,
+ 242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,
+ 246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,
+ 33,232,244,225, 98, 2, 55,170, 55,177,236,229,230,116,128, 33,
+ 228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,
+ 55,226, 55,244, 55,252,100, 2, 55,204, 55,216,110,129, 33,149,
+ 55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,
+ 33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,
+ 110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,
+ 101,128, 33,231,246,229,242,244,229,120,128,248,230,115, 5, 56,
+ 25, 56,101, 56,146, 56,229, 56,239, 99, 2, 56, 31, 56, 83,233,
+ 105, 2, 56, 38, 56, 61,227,233,242,227,245,109,129, 0, 94, 56,
+ 49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,
+ 228,101,129, 0,126, 56, 71,237,239,238,239,243,240,225,227,101,
+ 128,255, 94,242,233,240,116,129, 2, 81, 56, 92,244,245,242,238,
+ 229,100,128, 2, 82,237,225,236,108, 2, 56,110, 56,121,232,233,
+ 242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,
+ 97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,
+ 255,103,244,229,242,233,115, 2, 56,156, 56,225,107,131, 0, 42,
+ 56,166, 56,194, 56,217, 97, 2, 56,172, 56,186,236,244,239,238,
+ 229,225,242,225,226,233, 99,128, 6,109,242,225,226,233, 99,128,
+ 6,109,109, 2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,
+ 239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,
+ 97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,
+ 237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,
+ 128, 34, 67,116,132, 0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,
+ 236,228,101,128, 0,227,237,239,238,239,243,240,225,227,101,128,
+ 255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,
+ 2, 80,117, 6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,
+ 98, 2, 57, 70, 57, 79,229,238,231,225,236,105,128, 9,148,239,
+ 240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128, 9, 20,
+ 231,117, 2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,
+ 242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,
+ 225,242,235,226,229,238,231,225,236,105,128, 9,215,237,225,244,
+ 242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,
+ 229,236,243,233,231,110, 3, 57,173, 57,183, 57,190,226,229,238,
+ 231,225,236,105,128, 9,204,228,229,246, 97,128, 9, 76,231,245,
+ 234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,
+ 228,229,246, 97,128, 9, 61,121, 2, 57,221, 57,233,226,225,242,
+ 237,229,238,233,225,110,128, 5, 97,233,110,130, 5,226, 57,242,
+ 58, 1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,
+ 32,232,229,226,242,229,119,128, 5,226, 98,144, 0, 98, 58, 46,
+ 58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,
+ 62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97, 7,
+ 58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,
+ 238,231,225,236,105,128, 9,172,227,235,243,236,225,243,104,129,
+ 0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,
+ 228,229,246, 97,128, 9, 44,231,117, 2, 58,110, 58,119,234,225,
+ 242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,
+ 104, 2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,
+ 244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,
+ 128, 48,208,114,129, 0,124, 58,169,237,239,238,239,243,240,225,
+ 227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49, 5,
+ 227,233,242,227,236,101,128, 36,209,228,239,116, 2, 58,209, 58,
+ 218,225,227,227,229,238,116,128, 30, 3,226,229,236,239,119,128,
+ 30, 5,101, 6, 58,240, 59, 5, 59, 28, 59,170, 59,181, 59,193,
+ 225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,
+ 229,115,128, 38,108, 99, 2, 59, 11, 59, 18,225,245,243,101,128,
+ 34, 53,249,242,233,236,236,233, 99,128, 4, 49,104, 5, 59, 40,
+ 59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128, 6,
+ 40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,
+ 2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101, 2,
+ 59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 146,229,237,105, 2, 59,121, 59,136,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,
+ 242,225,226,233, 99,128,252, 8,238,239,239,238,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,
+ 238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128, 5,
+ 98,116,132, 5,209, 59,205, 59,225, 59,245, 59,254, 97,129, 3,
+ 178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128, 3,
+ 208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,
+ 229,119,128,251, 49,232,229,226,242,229,119,128, 5,209,242,225,
+ 230,229,232,229,226,242,229,119,128,251, 76,104, 2, 60, 17, 60,
+ 67, 97, 3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,
+ 128, 9,173,228,229,246, 97,128, 9, 45,231,117, 2, 60, 49, 60,
+ 58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,
+ 128, 10, 45,239,239,107,128, 2, 83,105, 5, 60, 85, 60, 96, 60,
+ 107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,
+ 235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,
+ 236,227,236,233,227,107,128, 2,152,238,228,233,231,245,242,237,
+ 245,235,232,105,128, 10, 2,242,245,243,241,245,225,242,101,128,
+ 51, 49,108, 3, 60,154, 62, 55, 62, 66, 97, 2, 60,160, 62, 50,
+ 227,107, 6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,
+ 233,242,227,236,101,128, 37,207,100, 2, 60,190, 60,199,233,225,
+ 237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,
+ 238,231,244,242,233,225,238,231,236,101,128, 37,188,108, 2, 60,
+ 227, 61, 74,101, 2, 60,233, 61, 13,230,244,240,239,233,238,244,
+ 233,238,103, 2, 60,248, 61, 2,240,239,233,238,244,229,114,128,
+ 37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,
+ 227,245,236,225,242,226,242,225,227,235,229,116, 2, 61, 33, 61,
+ 53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,
+ 225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,
+ 229,242,244,233,227,225,108,128,254, 60,239,247,229,114, 2, 61,
+ 83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,
+ 37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,
+ 37,226,114, 2, 61,120, 61,131,229,227,244,225,238,231,236,101,
+ 128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103, 2,
+ 61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,
+ 233,225,238,231,236,101,128, 37,182,115, 3, 61,177, 61,207, 61,
+ 215,109, 2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,
+ 128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,
+ 245,225,242,101,128, 37,160,244,225,114,128, 38, 5,245,240,112,
+ 2, 61,229, 62, 11,229,114, 2, 61,236, 61,251,236,229,230,244,
+ 244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,
+ 244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,
+ 238,103, 2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,
+ 37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,
+ 30, 7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,
+ 101,128,255, 66,111, 3, 62, 92, 62,105, 62,116,226,225,233,237,
+ 225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,
+ 97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,
+ 225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,
+ 195,114, 4, 62,155, 63,149, 63,222, 64, 5,225, 99, 2, 62,162,
+ 63, 56,101, 3, 62,170, 62,175, 62,243,229,120,128,248,244,236,
+ 229,230,116,133, 0,123, 62,192, 62,197, 62,219, 62,227, 62,232,
+ 226,116,128,248,243,109, 2, 62,203, 62,208,233,100,128,248,242,
+ 239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,
+ 128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,
+ 128,254, 55,242,233,231,232,116,133, 0,125, 63, 5, 63, 10, 63,
+ 32, 63, 40, 63, 45,226,116,128,248,254,109, 2, 63, 16, 63, 21,
+ 233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,
+ 243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,
+ 244,233,227,225,108,128,254, 56,235,229,116, 2, 63, 64, 63,106,
+ 236,229,230,116,132, 0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,
+ 116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,
+ 227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,
+ 0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,
+ 120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,
+ 244,112,128,248,249,229,246,101,131, 2,216, 63,161, 63,172, 63,
+ 178,226,229,236,239,247,227,237, 98,128, 3, 46,227,237, 98,128,
+ 3, 6,233,238,246,229,242,244,229,100, 3, 63,193, 63,204, 63,
+ 210,226,229,236,239,247,227,237, 98,128, 3, 47,227,237, 98,128,
+ 3, 17,228,239,245,226,236,229,227,237, 98,128, 3, 97,233,228,
+ 231,101, 2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,
+ 3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,
+ 237, 98,128, 3, 58,239,235,229,238,226,225,114,128, 0,166,115,
+ 2, 64, 21, 64, 29,244,242,239,235,101,128, 1,128,245,240,229,
+ 242,233,239,114,128,246,234,244,239,240,226,225,114,128, 1,131,
+ 117, 3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,
+ 128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,
+ 2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,
+ 246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,
+ 128, 34, 25,243,229,249,101,128, 37,206, 99,143, 0, 99, 64,156,
+ 65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,
+ 69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97, 9, 64,176,
+ 64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,
+ 225,242,237,229,238,233,225,110,128, 5,110,226,229,238,231,225,
+ 236,105,128, 9,154,227,245,244,101,128, 1, 7,228,229,246, 97,
+ 128, 9, 26,231,117, 2, 64,218, 64,227,234,225,242,225,244,105,
+ 128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,
+ 225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117, 4,
+ 65, 8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,
+ 9,129,227,237, 98,128, 3, 16,228,229,246, 97,128, 9, 1,231,
+ 245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,
+ 128, 33,234,114, 3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,
+ 5,239,110,130, 2,199, 65, 74, 65, 85,226,229,236,239,247,227,
+ 237, 98,128, 3, 44,227,237, 98,128, 3, 12,242,233,225,231,229,
+ 242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,
+ 111,128, 49, 24, 99, 4, 65,126, 65,133, 65,152, 65,174,225,242,
+ 239,110,128, 1, 13,229,228,233,236,236, 97,129, 0,231, 65,144,
+ 225,227,245,244,101,128, 30, 9,233,242, 99, 2, 65,160, 65,165,
+ 236,101,128, 36,210,245,237,230,236,229,120,128, 1, 9,245,242,
+ 108,128, 2, 85,100, 2, 65,186, 65,202,239,116,129, 1, 11, 65,
+ 193,225,227,227,229,238,116,128, 1, 11,243,241,245,225,242,101,
+ 128, 51,197,101, 2, 65,217, 65,233,228,233,236,236, 97,129, 0,
+ 184, 65,227,227,237, 98,128, 3, 39,238,116,132, 0,162, 65,246,
+ 66, 14, 66, 26, 66, 37,105, 2, 65,252, 66, 4,231,242,225,228,
+ 101,128, 33, 3,238,230,229,242,233,239,114,128,246,223,237,239,
+ 238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,
+ 236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,
+ 104, 5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97, 4, 66, 70,
+ 66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128, 5,
+ 121,226,229,238,231,225,236,105,128, 9,155,228,229,246, 97,128,
+ 9, 27,231,117, 2, 66,105, 66,114,234,225,242,225,244,105,128,
+ 10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,
+ 239,230,111,128, 49, 20,101, 6, 66,148, 66,168, 66,192, 67, 4,
+ 67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,189, 99, 2, 66,174, 66,182,235,237,
+ 225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128, 4, 71,
+ 100, 2, 66,198, 66,242,229,243,227,229,238,228,229,114, 2, 66,
+ 211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,
+ 236,236,233, 99,128, 4,191,227,249,242,233,236,236,233, 99,128,
+ 4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,245,232,225,242,237,229,238,233,225,110,128, 5,115,
+ 235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,204,246,229,242,244,233,227,225,236,243,244,242,
+ 239,235,229,227,249,242,233,236,236,233, 99,128, 4,185,105,129,
+ 3,199, 67, 68,229,245,227,104, 4, 67, 81, 67,116, 67,131, 67,
+ 140, 97, 2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,
+ 128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,
+ 238,235,239,242,229,225,110,128, 50, 9,111, 2, 67,160, 67,210,
+ 227,104, 3, 67,169, 67,191, 67,201,225,110, 2, 67,176, 67,184,
+ 231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14, 8,233,
+ 238,231,244,232,225,105,128, 14, 9,239,229,244,232,225,105,128,
+ 14, 12,239,107,128, 1,136,105, 2, 67,221, 68, 67,229,245, 99,
+ 5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97, 2, 67,241, 68,
+ 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,
+ 229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 8,245,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 28,242, 99, 2, 68, 74, 68,169,236,101,132, 37,203, 68,
+ 87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,
+ 34,151,239,116,128, 34,153,112, 2, 68,109, 68,115,236,245,115,
+ 128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,
+ 233,244,104, 2, 68,136, 68,152,236,229,230,244,232,225,236,230,
+ 226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,
+ 230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,
+ 2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128, 3,
+ 45,227,237, 98,128, 3, 2,108, 3, 68,207, 68,213, 69, 11,229,
+ 225,114,128, 35, 39,233,227,107, 4, 68,225, 68,236, 68,245, 68,
+ 255,225,236,246,229,239,236,225,114,128, 1,194,228,229,238,244,
+ 225,108,128, 1,192,236,225,244,229,242,225,108,128, 1,193,242,
+ 229,244,242,239,230,236,229,120,128, 1,195,245, 98,129, 38, 99,
+ 69, 18,243,245,233,116, 2, 69, 27, 69, 35,226,236,225,227,107,
+ 128, 38, 99,247,232,233,244,101,128, 38,103,109, 3, 69, 51, 69,
+ 65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,
+ 164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,
+ 242,229,228,243,241,245,225,242,101,128, 51,160,111, 8, 69,110,
+ 69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,
+ 237,229,238,233,225,110,128, 5,129,236,239,110,131, 0, 58, 69,
+ 133, 69,158, 69,177,237,239,110, 2, 69,141, 69,149,229,244,225,
+ 242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115, 2,
+ 69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,
+ 85,244,242,233,225,238,231,245,236,225,114, 2, 69,192, 69,202,
+ 232,225,236,230,237,239,100,128, 2,209,237,239,100,128, 2,208,
+ 109, 2, 69,214, 70,143,237, 97,134, 0, 44, 69,231, 70, 39, 70,
+ 50, 70, 62, 70, 92, 70,115, 97, 3, 69,239, 70, 9, 70, 17,226,
+ 239,246,101, 2, 69,248, 69,254,227,237, 98,128, 3, 19,242,233,
+ 231,232,244,227,237, 98,128, 3, 21,227,227,229,238,116,128,246,
+ 195,114, 2, 70, 23, 70, 30,225,226,233, 99,128, 6, 12,237,229,
+ 238,233,225,110,128, 5, 93,233,238,230,229,242,233,239,114,128,
+ 246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,
+ 246,229,242,243,229,100, 2, 70, 75, 70, 86,225,226,239,246,229,
+ 227,237, 98,128, 3, 20,237,239,100,128, 2,189,115, 2, 70, 98,
+ 70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,
+ 128,246,226,244,245,242,238,229,100, 2, 70,126, 70,137,225,226,
+ 239,246,229,227,237, 98,128, 3, 18,237,239,100,128, 2,187,240,
+ 225,243,115,128, 38, 60,110, 2, 70,156, 70,165,231,242,245,229,
+ 238,116,128, 34, 69,116, 2, 70,171, 70,185,239,245,242,233,238,
+ 244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35, 3, 70,
+ 219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,
+ 112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128, 0,
+ 6, 66, 2, 70,231, 70,236,197, 76,128, 0, 7, 83,128, 0, 8,
+ 67, 2, 70,246, 70,251,193, 78,128, 0, 24, 82,128, 0, 13, 68,
+ 3, 71, 7, 71, 33, 71, 38, 67, 4, 71, 17, 71, 21, 71, 25, 71,
+ 29, 49,128, 0, 17, 50,128, 0, 18, 51,128, 0, 19, 52,128, 0,
+ 20,197, 76,128, 0,127,204, 69,128, 0, 16, 69, 5, 71, 55, 71,
+ 59, 71, 64, 71, 69, 71, 74, 77,128, 0, 25,206, 81,128, 0, 5,
+ 207, 84,128, 0, 4,211, 67,128, 0, 27, 84, 2, 71, 80, 71, 84,
+ 66,128, 0, 23, 88,128, 0, 3, 70, 2, 71, 94, 71, 98, 70,128,
+ 0, 12, 83,128, 0, 28,199, 83,128, 0, 29,200, 84,128, 0, 9,
+ 204, 70,128, 0, 10,206,193, 75,128, 0, 21,210, 83,128, 0, 30,
+ 83, 5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128, 0, 15,
+ 79,129, 0, 14, 71,150, 84,128, 0, 2,212, 88,128, 0, 1,213,
+ 66,128, 0, 26,217, 78,128, 0, 22,213, 83,128, 0, 31,214, 84,
+ 128, 0, 11,240,249,242,233,231,232,116,129, 0,169, 71,191,115,
+ 2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,
+ 246,217,114, 2, 71,216, 72, 44,238,229,242,226,242,225,227,235,
+ 229,116, 2, 71,231, 72, 9,236,229,230,116,130, 48, 12, 71,242,
+ 71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,
+ 242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,
+ 13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,
+ 99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,
+ 244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,
+ 225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,
+ 101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,
+ 233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,
+ 2,151,245,114, 2, 72,121, 72,139,236,121, 2, 72,128, 72,134,
+ 225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,
+ 128, 0,164,249,114, 4, 72,158, 72,166, 72,173, 72,181,194,242,
+ 229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,
+ 246,101,128,246,212,230,236,229,120,128,246,213,100,146, 0,100,
+ 72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,
+ 78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,
+ 79,247, 80, 19, 97, 11, 72,252, 73, 7, 73, 17, 73, 89, 73,152,
+ 73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,
+ 238,233,225,110,128, 5,100,226,229,238,231,225,236,105,128, 9,
+ 166,100, 5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,
+ 226,233, 99,128, 6, 54,229,246, 97,128, 9, 38,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,
+ 225,242,225,226,233, 99,128,254,192,103, 3, 73, 97, 73,114, 73,
+ 128,229,243,104,129, 5,188, 73,105,232,229,226,242,229,119,128,
+ 5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,
+ 117, 2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,
+ 237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,
+ 128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108, 3,
+ 73,182, 73,191, 73,229,225,242,225,226,233, 99,128, 6, 47,229,
+ 116,130, 5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,
+ 51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,
+ 229,119,128, 5,211,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,170,237,237, 97, 3, 73,253, 74, 6, 74, 18,225,242,225,
+ 226,233, 99,128, 6, 79,236,239,247,225,242,225,226,233, 99,128,
+ 6, 79,244,225,238, 97, 2, 74, 27, 74, 41,236,244,239,238,229,
+ 225,242,225,226,233, 99,128, 6, 76,242,225,226,233, 99,128, 6,
+ 76,238,228, 97,128, 9,100,242,231, 97, 2, 74, 63, 74, 72,232,
+ 229,226,242,229,119,128, 5,167,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,167,243,233,225,240,238,229,245,237,225,244,225,
+ 227,249,242,233,236,236,233,227,227,237, 98,128, 4,133, 98, 3,
+ 74,118, 75,115, 75,125,108, 9, 74,138, 74,146, 75, 3, 75, 11,
+ 75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,
+ 246,211, 97, 2, 74,152, 74,209,238,231,236,229,226,242,225,227,
+ 235,229,116, 2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,
+ 177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,
+ 116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,
+ 62,114, 2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,
+ 228,226,229,236,239,247,227,237, 98,128, 3, 43,242,239,119, 2,
+ 74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,
+ 128, 33,210,228,225,238,228, 97,128, 9,101,231,242,225,246,101,
+ 129,246,214, 75, 21,227,237, 98,128, 3, 15,233,238,244,229,231,
+ 242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,
+ 75, 50,227,237, 98,128, 3, 51,239,246,229,242,236,233,238,229,
+ 227,237, 98,128, 3, 63,240,242,233,237,229,237,239,100,128, 2,
+ 186,246,229,242,244,233,227,225,108, 2, 75, 94, 75,100,226,225,
+ 114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,
+ 128, 3, 14,239,240,239,237,239,230,111,128, 49, 9,243,241,245,
+ 225,242,101,128, 51,200, 99, 4, 75,144, 75,151, 75,160, 75,187,
+ 225,242,239,110,128, 1, 15,229,228,233,236,236, 97,128, 30, 17,
+ 233,242, 99, 2, 75,168, 75,173,236,101,128, 36,211,245,237,230,
+ 236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,
+ 1, 17,100, 4, 75,204, 76, 29, 76, 39, 76, 90, 97, 4, 75,214,
+ 75,224, 75,231, 76, 0,226,229,238,231,225,236,105,128, 9,161,
+ 228,229,246, 97,128, 9, 33,231,117, 2, 75,238, 75,247,234,225,
+ 242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,
+ 108, 2, 76, 6, 76, 15,225,242,225,226,233, 99,128, 6,136,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,
+ 228,229,246, 97,128, 9, 92,232, 97, 3, 76, 48, 76, 58, 76, 65,
+ 226,229,238,231,225,236,105,128, 9,162,228,229,246, 97,128, 9,
+ 34,231,117, 2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,
+ 162,242,237,245,235,232,105,128, 10, 34,239,116, 2, 76, 97, 76,
+ 106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,
+ 30, 13,101, 8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,
+ 77, 27, 77, 63, 99, 2, 76,138, 76,175,233,237,225,236,243,229,
+ 240,225,242,225,244,239,114, 2, 76,156, 76,165,225,242,225,226,
+ 233, 99,128, 6,107,240,229,242,243,233,225,110,128, 6,107,249,
+ 242,233,236,236,233, 99,128, 4, 52,231,242,229,101,128, 0,176,
+ 232,105, 2, 76,199, 76,208,232,229,226,242,229,119,128, 5,173,
+ 242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,
+ 128, 3,239,235,225,244,225,235,225,238, 97,128, 48,199,108, 2,
+ 76,244, 77, 11,229,244,101, 2, 76,252, 77, 3,236,229,230,116,
+ 128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129, 3,180,
+ 77, 18,244,245,242,238,229,100,128, 1,141,238,239,237,233,238,
+ 225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,
+ 242,225,244,239,242,226,229,238,231,225,236,105,128, 9,248,250,
+ 104,128, 2,164,104, 2, 77, 74, 77,124, 97, 3, 77, 82, 77, 92,
+ 77, 99,226,229,238,231,225,236,105,128, 9,167,228,229,246, 97,
+ 128, 9, 39,231,117, 2, 77,106, 77,115,234,225,242,225,244,105,
+ 128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,
+ 2, 87,105, 6, 77,144, 77,193, 77,253, 78, 8, 78, 19, 78, 29,
+ 97, 2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,
+ 115,129, 3,133, 77,166,227,237, 98,128, 3, 68,237,239,238,100,
+ 129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,
+ 98,229,242,229,243,233,115,133, 0,168, 77,212, 77,220, 77,231,
+ 77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,
+ 247,227,237, 98,128, 3, 36,227,237, 98,128, 3, 8,231,242,225,
+ 246,101,128,246,216,244,239,238,239,115,128, 3,133,232,233,242,
+ 225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,
+ 128, 48,194,244,244,239,237,225,242,107,128, 48, 3,246,105, 2,
+ 78, 36, 78, 47,228,101,129, 0,247, 78, 43,115,128, 34, 35,243,
+ 233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,
+ 233,236,236,233, 99,128, 4, 82,235,243,232,225,228,101,128, 37,
+ 147,108, 2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,
+ 30, 15,243,241,245,225,242,101,128, 51,151,109, 2, 78,113, 78,
+ 121,225,227,242,239,110,128, 1, 17,239,238,239,243,240,225,227,
+ 101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,
+ 163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,
+ 154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,
+ 229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,
+ 97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,
+ 236,225,114,132, 0, 36, 78,222, 78,233, 78,245, 79, 0,233,238,
+ 230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,
+ 227,101,128,255, 4,239,236,228,243,244,249,236,101,128,247, 36,
+ 115, 2, 79, 6, 79, 13,237,225,236,108,128,254,105,245,240,229,
+ 242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,
+ 245,225,242,101,128, 51, 38,116, 6, 79, 53, 79, 70, 79, 92, 79,
+ 103, 79,135, 79,142,225,227,227,229,238,116,129, 2,217, 79, 64,
+ 227,237, 98,128, 3, 7,226,229,236,239,247, 99, 2, 79, 81, 79,
+ 86,237, 98,128, 3, 35,239,237, 98,128, 3, 35,235,225,244,225,
+ 235,225,238, 97,128, 48,251,236,229,243,115, 2, 79,112, 79,116,
+ 105,128, 1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,
+ 232,239,239,107,128, 2,132,237,225,244,104,128, 34,197,244,229,
+ 228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,
+ 228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,
+ 119,128,251, 31,247,238,244,225,227,107, 2, 79,191, 79,202,226,
+ 229,236,239,247,227,237, 98,128, 3, 30,237,239,100,128, 2,213,
+ 240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,
+ 128,246,235,116, 2, 79,233, 79,239,225,233,108,128, 2, 86,239,
+ 240,226,225,114,128, 1,140,117, 2, 79,253, 80, 8,232,233,242,
+ 225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,
+ 128, 48,197,122,132, 1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,
+ 236,244,239,238,101,128, 2,163, 99, 2, 80, 46, 80, 53,225,242,
+ 239,110,128, 1,198,245,242,108,128, 2,165,101, 2, 80, 65, 80,
+ 85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,225,227,249,242,233,236,236,233, 99,128, 4, 85,
+ 232,229,227,249,242,233,236,236,233, 99,128, 4, 95,101,151, 0,
+ 101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,
+ 60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,
+ 230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,
+ 2, 80,165, 80,172,227,245,244,101,128, 0,233,242,244,104,128,
+ 38, 65, 98, 3, 80,186, 80,195, 80,205,229,238,231,225,236,105,
+ 128, 9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,
+ 101,128, 1, 21, 99, 5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,
+ 97, 2, 80,230, 81, 35,238,228,242, 97, 3, 80,241, 80,248, 81,
+ 3,228,229,246, 97,128, 9, 13,231,245,234,225,242,225,244,105,
+ 128, 10,141,246,239,247,229,236,243,233,231,110, 2, 81, 17, 81,
+ 24,228,229,246, 97,128, 9, 69,231,245,234,225,242,225,244,105,
+ 128, 10,197,242,239,110,128, 1, 27,229,228,233,236,236,225,226,
+ 242,229,246,101,128, 30, 29,104, 2, 81, 61, 81, 72,225,242,237,
+ 229,238,233,225,110,128, 5,101,249,233,247,238,225,242,237,229,
+ 238,233,225,110,128, 5,135,233,242, 99, 2, 81, 95, 81,100,236,
+ 101,128, 36,212,245,237,230,236,229,120,134, 0,234, 81,121, 81,
+ 129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,
+ 191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,
+ 119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,
+ 225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,
+ 249,242,233,236,236,233, 99,128, 4, 84,100, 4, 81,196, 81,206,
+ 81,212, 81,222,226,236,231,242,225,246,101,128, 2, 5,229,246,
+ 97,128, 9, 15,233,229,242,229,243,233,115,128, 0,235,239,116,
+ 130, 1, 23, 81,231, 81,240,225,227,227,229,238,116,128, 1, 23,
+ 226,229,236,239,119,128, 30,185,101, 2, 81,254, 82, 9,231,245,
+ 242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,
+ 242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,
+ 233, 99,128, 4, 68,103, 2, 82, 43, 82, 50,242,225,246,101,128,
+ 0,232,245,234,225,242,225,244,105,128, 10,143,104, 4, 82, 70,
+ 82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128, 5,
+ 103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,
+ 225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,
+ 187,105, 4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,
+ 239,230,111,128, 49, 31,231,232,116,142, 0, 56, 82,168, 82,177,
+ 82,187, 82,217, 82,224, 83, 6, 83, 31, 83, 76, 83,110, 83,122,
+ 83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128, 6,
+ 104,226,229,238,231,225,236,105,128, 9,238,227,233,242,227,236,
+ 101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,
+ 243,243,229,242,233,102,128, 39,145,228,229,246, 97,128, 9,110,
+ 229,229,110, 2, 82,232, 82,241,227,233,242,227,236,101,128, 36,
+ 113,112, 2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,
+ 233,239,100,128, 36,153,231,117, 2, 83, 13, 83, 22,234,225,242,
+ 225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,
+ 2, 83, 37, 83, 63, 97, 2, 83, 43, 83, 54,227,235,225,242,225,
+ 226,233, 99,128, 6,104,238,231,250,232,239,117,128, 48, 40,238,
+ 239,244,229,226,229,225,237,229,100,128, 38,107,105, 2, 83, 82,
+ 83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,
+ 238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,
+ 236,101,128,247, 56,112, 2, 83,139, 83,146,225,242,229,110,128,
+ 36,123,229,114, 2, 83,153, 83,159,233,239,100,128, 36,143,243,
+ 233,225,110,128, 6,248,242,239,237,225,110,128, 33,119,243,245,
+ 240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,
+ 238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 7,239,
+ 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4,
+ 101,107, 2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,
+ 168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,
+ 2, 84, 5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,
+ 105,128, 10,116,242,229,225,110,128, 49, 84,108, 3, 84, 35, 84,
+ 46, 84,107,227,249,242,233,236,236,233, 99,128, 4, 59,101, 2,
+ 84, 52, 84, 59,237,229,238,116,128, 34, 8,246,229,110, 3, 84,
+ 69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112, 2,
+ 84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,
+ 128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,
+ 115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,
+ 238,109, 5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,
+ 239,110,130, 1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,
+ 23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,
+ 99,128, 4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,
+ 244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,
+ 128,255, 69,112, 2, 84,217, 84,237,232,225,243,233,243,237,225,
+ 242,235,225,242,237,229,238,233,225,110,128, 5, 91,244,249,243,
+ 229,116,128, 34, 5,110, 6, 85, 3, 85, 14, 85, 25, 85, 69, 85,
+ 101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,
+ 242,233,236,236,233, 99,128, 4, 61,100, 2, 85, 31, 85, 50,225,
+ 243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,
+ 254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+ 233, 99,128, 4,163,103,130, 1, 75, 85, 77, 85, 88,226,239,240,
+ 239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,
+ 233, 99,128, 4,165,232,239,239,235,227,249,242,233,236,236,233,
+ 99,128, 4,200,243,240,225,227,101,128, 32, 2,111, 3, 85,132,
+ 85,140, 85,149,231,239,238,229,107,128, 1, 25,235,239,242,229,
+ 225,110,128, 49, 83,240,229,110,130, 2, 91, 85,159, 85,168,227,
+ 236,239,243,229,100,128, 2,154,242,229,246,229,242,243,229,100,
+ 130, 2, 92, 85,183, 85,192,227,236,239,243,229,100,128, 2, 94,
+ 232,239,239,107,128, 2, 93,112, 2, 85,205, 85,212,225,242,229,
+ 110,128, 36,160,243,233,236,239,110,129, 3,181, 85,222,244,239,
+ 238,239,115,128, 3,173,241,117, 2, 85,237, 86, 25,225,108,130,
+ 0, 61, 85,246, 86, 2,237,239,238,239,243,240,225,227,101,128,
+ 255, 29,115, 2, 86, 8, 86, 15,237,225,236,108,128,254,102,245,
+ 240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,
+ 101,128, 34, 97,114, 3, 86, 44, 86, 55, 86, 66,226,239,240,239,
+ 237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,
+ 4, 64,229,246,229,242,243,229,100,129, 2, 88, 86, 78,227,249,
+ 242,233,236,236,233, 99,128, 4, 77,115, 6, 86,103, 86,114, 86,
+ 134, 86,215, 87, 4, 87, 14,227,249,242,233,236,236,233, 99,128,
+ 4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,
+ 236,233, 99,128, 4,171,104,132, 2,131, 86,146, 86,153, 86,184,
+ 86,199,227,245,242,108,128, 2,134,239,242,116, 2, 86,161, 86,
+ 168,228,229,246, 97,128, 9, 14,246,239,247,229,236,243,233,231,
+ 238,228,229,246, 97,128, 9, 70,242,229,246,229,242,243,229,228,
+ 236,239,239,112,128, 1,170,243,241,245,225,244,242,229,246,229,
+ 242,243,229,100,128, 2,133,237,225,236,108, 2, 86,224, 86,235,
+ 232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,
+ 225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,
+ 104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,
+ 229,242,233,239,114,128,246,236,116, 5, 87, 36, 87, 62, 87, 66,
+ 87, 83, 87,149, 97,130, 3,183, 87, 44, 87, 54,242,237,229,238,
+ 233,225,110,128, 5,104,244,239,238,239,115,128, 3,174,104,128,
+ 0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,
+ 128, 30, 27,238,225,232,244, 97, 3, 87, 95, 87,127, 87,136,230,
+ 239,245,235,104, 2, 87,105, 87,114,232,229,226,242,229,119,128,
+ 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,232,
+ 229,226,242,229,119,128, 5,145,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,145,245,242,238,229,100,128, 1,221,117, 2, 87,
+ 163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,
+ 172,246,239,247,229,236,243,233,231,110, 3, 87,193, 87,203, 87,
+ 210,226,229,238,231,225,236,105,128, 9,199,228,229,246, 97,128,
+ 9, 71,231,245,234,225,242,225,244,105,128, 10,199,120, 2, 87,
+ 227, 88, 44,227,236,225,109,132, 0, 33, 87,242, 87,253, 88, 24,
+ 88, 36,225,242,237,229,238,233,225,110,128, 5, 92,100, 2, 88,
+ 3, 88, 8,226,108,128, 32, 60,239,247,110,129, 0,161, 88, 16,
+ 243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,
+ 101,128,255, 1,243,237,225,236,108,128,247, 33,233,243,244,229,
+ 238,244,233,225,108,128, 34, 3,250,104,131, 2,146, 88, 67, 88,
+ 86, 88, 97, 99, 2, 88, 73, 88, 80,225,242,239,110,128, 1,239,
+ 245,242,108,128, 2,147,242,229,246,229,242,243,229,100,128, 1,
+ 185,244,225,233,108,128, 1,186,102,140, 0,102, 88,132, 88,214,
+ 88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,
+ 93, 33, 93, 41, 97, 4, 88,142, 88,149, 88,160, 88,171,228,229,
+ 246, 97,128, 9, 94,231,245,242,237,245,235,232,105,128, 10, 94,
+ 232,242,229,238,232,229,233,116,128, 33, 9,244,232, 97, 3, 88,
+ 181, 88,190, 88,202,225,242,225,226,233, 99,128, 6, 78,236,239,
+ 247,225,242,225,226,233, 99,128, 6, 78,244,225,238,225,242,225,
+ 226,233, 99,128, 6, 75,226,239,240,239,237,239,230,111,128, 49,
+ 8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,
+ 229,238,116,128, 30, 31,101, 3, 88,254, 89, 76, 89, 86,104, 4,
+ 89, 8, 89, 31, 89, 45, 89, 61,225,114, 2, 89, 15, 89, 22,225,
+ 226,233, 99,128, 6, 65,237,229,238,233,225,110,128, 5,134,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,
+ 233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,
+ 244,233, 99,128, 3,229,237,225,236,101,128, 38, 64,102,130,251,
+ 0, 89,101, 89,105,105,128,251, 3,108,128,251, 4,105,136,251,
+ 1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,
+ 106,230,244,229,229,110, 2, 89,139, 89,148,227,233,242,227,236,
+ 101,128, 36,110,112, 2, 89,154, 89,161,225,242,229,110,128, 36,
+ 130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,
+ 104,128, 32, 18,236,236,229,100, 2, 89,189, 89,195,226,239,120,
+ 128, 37,160,242,229,227,116,128, 37,172,238,225,108, 5, 89,216,
+ 89,255, 90, 16, 90, 33, 90, 49,235,225,102,130, 5,218, 89,226,
+ 89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,
+ 242,229,119,128,251, 58,232,229,226,242,229,119,128, 5,218,237,
+ 229,109,129, 5,221, 90, 7,232,229,226,242,229,119,128, 5,221,
+ 238,245,110,129, 5,223, 90, 24,232,229,226,242,229,119,128, 5,
+ 223,240,101,129, 5,227, 90, 40,232,229,226,242,229,119,128, 5,
+ 227,244,243,225,228,105,129, 5,229, 90, 59,232,229,226,242,229,
+ 119,128, 5,229,242,243,244,244,239,238,229,227,232,233,238,229,
+ 243,101,128, 2,201,243,232,229,249,101,128, 37,201,244,225,227,
+ 249,242,233,236,236,233, 99,128, 4,115,246,101,142, 0, 53, 90,
+ 139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91, 1, 91,
+ 35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,
+ 99,128, 6,101,226,229,238,231,225,236,105,128, 9,235,227,233,
+ 242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,
+ 243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,
+ 128, 9,107,229,233,231,232,244,232,115,128, 33, 93,231,117, 2,
+ 90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,
+ 235,232,105,128, 10,107,232, 97, 2, 90,237, 90,248,227,235,225,
+ 242,225,226,233, 99,128, 6,101,238,231,250,232,239,117,128, 48,
+ 37,105, 2, 91, 7, 91, 25,228,229,239,231,242,225,240,232,233,
+ 227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,
+ 128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,
+ 236,228,243,244,249,236,101,128,247, 53,112, 2, 91, 64, 91, 71,
+ 225,242,229,110,128, 36,120,229,114, 2, 91, 78, 91, 84,233,239,
+ 100,128, 36,140,243,233,225,110,128, 6,245,242,239,237,225,110,
+ 128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,
+ 225,105,128, 14, 85,108,129,251, 2, 91,123,239,242,233,110,128,
+ 1,146,109, 2, 91,136, 91,147,239,238,239,243,240,225,227,101,
+ 128,255, 70,243,241,245,225,242,101,128, 51,153,111, 4, 91,166,
+ 91,188, 91,200, 91,207,230, 97, 2, 91,173, 91,181,238,244,232,
+ 225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,
+ 238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34, 0,245,
+ 114,142, 0, 52, 91,240, 91,249, 92, 3, 92, 33, 92, 40, 92, 65,
+ 92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,
+ 225,242,225,226,233, 99,128, 6,100,226,229,238,231,225,236,105,
+ 128, 9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,
+ 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,
+ 141,228,229,246, 97,128, 9,106,231,117, 2, 92, 47, 92, 56,234,
+ 225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,
+ 106,232, 97, 2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,
+ 128, 6,100,238,231,250,232,239,117,128, 48, 36,105, 2, 92, 98,
+ 92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,
+ 238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,
+ 244,239,242,226,229,238,231,225,236,105,128, 9,247,239,236,228,
+ 243,244,249,236,101,128,247, 52,112, 2, 92,174, 92,181,225,242,
+ 229,110,128, 36,119,229,114, 2, 92,188, 92,194,233,239,100,128,
+ 36,139,243,233,225,110,128, 6,244,242,239,237,225,110,128, 33,
+ 115,243,245,240,229,242,233,239,114,128, 32,116,116, 2, 92,226,
+ 93, 8,229,229,110, 2, 92,234, 92,243,227,233,242,227,236,101,
+ 128, 36,109,112, 2, 92,249, 93, 0,225,242,229,110,128, 36,129,
+ 229,242,233,239,100,128, 36,149,104, 2, 93, 14, 93, 19,225,105,
+ 128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128, 2,
+ 203,240,225,242,229,110,128, 36,161,242, 97, 2, 93, 48, 93, 56,
+ 227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144, 0,
+ 103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,
+ 143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,
+ 158, 97, 9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,
+ 241, 93,252, 94, 30,226,229,238,231,225,236,105,128, 9,151,227,
+ 245,244,101,128, 1,245,228,229,246, 97,128, 9, 23,102, 4, 93,
+ 151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128, 6,175,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,
+ 228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117, 2,
+ 93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,
+ 235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,
+ 76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,
+ 3,179, 94, 6, 94, 19,236,225,244,233,238,243,237,225,236,108,
+ 128, 2, 99,243,245,240,229,242,233,239,114,128, 2,224,238,231,
+ 233,225,227,239,240,244,233, 99,128, 3,235, 98, 2, 94, 49, 94,
+ 59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,
+ 1, 31, 99, 4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,
+ 128, 1,231,229,228,233,236,236, 97,128, 1, 35,233,242, 99, 2,
+ 94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,
+ 1, 29,239,237,237,225,225,227,227,229,238,116,128, 1, 35,228,
+ 239,116,129, 1, 33, 94,135,225,227,227,229,238,116,128, 1, 33,
+ 101, 6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,
+ 242,233,236,236,233, 99,128, 4, 51,232,233,242,225,231,225,238,
+ 97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,
+ 237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,
+ 34, 81,114, 3, 94,218, 95, 11, 95, 21,229,243,104, 3, 94,228,
+ 94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,
+ 128, 5,156,232,229,226,242,229,119,128, 5,243,237,245,241,228,
+ 225,237,232,229,226,242,229,119,128, 5,157,237,225,238,228,226,
+ 236,115,128, 0,223,243,232,225,249,233,109, 2, 95, 32, 95, 47,
+ 225,227,227,229,238,244,232,229,226,242,229,119,128, 5,158,232,
+ 229,226,242,229,119,128, 5,244,244,225,237,225,242,107,128, 48,
+ 19,104, 5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97, 4, 95,
+ 87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128, 9,
+ 152,100, 2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,
+ 5,114,229,246, 97,128, 9, 24,231,117, 2, 95,127, 95,136,234,
+ 225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,
+ 24,233,110, 4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,
+ 233, 99,128, 6, 58,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,
+ 128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+ 254,208,101, 3, 95,218, 95,239, 96, 0,237,233,228,228,236,229,
+ 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,149,243,
+ 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,147,
+ 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4,
+ 145,232, 97, 2, 96, 24, 96, 31,228,229,246, 97,128, 9, 90,231,
+ 245,242,237,245,235,232,105,128, 10, 90,239,239,107,128, 2, 96,
+ 250,243,241,245,225,242,101,128, 51,147,105, 3, 96, 66, 96, 77,
+ 96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,
+ 225,235,225,238, 97,128, 48,174,109, 2, 96, 94, 96,105,225,242,
+ 237,229,238,233,225,110,128, 5, 99,229,108,130, 5,210, 96,114,
+ 96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,
+ 242,229,119,128,251, 50,232,229,226,242,229,119,128, 5,210,234,
+ 229,227,249,242,233,236,236,233, 99,128, 4, 83,236,239,244,244,
+ 225,108, 2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,
+ 244,242,239,235,101,128, 1,190,243,244,239,112,132, 2,148, 96,
+ 199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,
+ 2,150,237,239,100,128, 2,192,242,229,246,229,242,243,229,100,
+ 130, 2,149, 96,231, 96,237,237,239,100,128, 2,193,243,245,240,
+ 229,242,233,239,114,128, 2,228,243,244,242,239,235,101,129, 2,
+ 161, 97, 3,242,229,246,229,242,243,229,100,128, 2,162,109, 2,
+ 97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,
+ 240,225,227,101,128,255, 71,111, 2, 97, 45, 97, 56,232,233,242,
+ 225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,
+ 128, 48,180,240, 97, 2, 97, 74, 97, 80,242,229,110,128, 36,162,
+ 243,241,245,225,242,101,128, 51,172,114, 2, 97, 95, 97,192, 97,
+ 2, 97,101, 97,109,228,233,229,238,116,128, 34, 7,246,101,134,
+ 0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,
+ 236,239,247,227,237, 98,128, 3, 22, 99, 2, 97,143, 97,148,237,
+ 98,128, 3, 0,239,237, 98,128, 3, 0,228,229,246, 97,128, 9,
+ 83,236,239,247,237,239,100,128, 2,206,237,239,238,239,243,240,
+ 225,227,101,128,255, 64,244,239,238,229,227,237, 98,128, 3, 64,
+ 229,225,244,229,114,132, 0, 62, 97,208, 97,227, 97,239, 98, 26,
+ 229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,
+ 128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,
+ 2, 97,245, 98, 15,114, 2, 97,251, 98, 8,229,241,245,233,246,
+ 225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,
+ 229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,
+ 254,101,115, 2, 98, 40, 98, 48,227,242,233,240,116,128, 2, 97,
+ 244,242,239,235,101,128, 1,229,117, 4, 98, 66, 98, 77, 98,134,
+ 98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108, 2,
+ 98, 84, 98,109,236,229,237,239,116, 2, 98, 94, 98,101,236,229,
+ 230,116,128, 0,171,242,233,231,232,116,128, 0,187,243,233,238,
+ 231,108, 2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,
+ 231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,
+ 176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,
+ 241,245,225,242,101,128, 51,201,104,144, 0,104, 98,204,101, 90,
+ 101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,
+ 105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,
+ 99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,
+ 99,239, 99,252,100, 54,100, 63, 97, 2, 98,238, 99, 1,226,235,
+ 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,
+ 169,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,226,
+ 229,238,231,225,236,105,128, 9,185,228,101, 2, 99, 32, 99, 50,
+ 243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,
+ 4,179,246, 97,128, 9, 57,231,117, 2, 99, 62, 99, 71,234,225,
+ 242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,
+ 104, 4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,
+ 128, 6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 162,105, 2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,
+ 229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,
+ 245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,
+ 238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,
+ 128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,
+ 10, 77,237,250, 97, 2, 99,218, 99,227,225,242,225,226,233, 99,
+ 128, 6, 33,236,239,247,225,242,225,226,233, 99,128, 6, 33,238,
+ 231,245,236,230,233,236,236,229,114,128, 49,100,114, 2,100, 2,
+ 100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,
+ 4, 74,240,239,239,110, 2,100, 27,100, 40,236,229,230,244,226,
+ 225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,
+ 226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,
+ 225,102, 3,100, 73,100,165,101, 0,240,225,244,225,104,134, 5,
+ 178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,
+ 5,178, 50, 2,100,104,100,108, 51,128, 5,178,102,128, 5,178,
+ 232,229,226,242,229,119,128, 5,178,238,225,242,242,239,247,232,
+ 229,226,242,229,119,128, 5,178,241,245,225,242,244,229,242,232,
+ 229,226,242,229,119,128, 5,178,247,233,228,229,232,229,226,242,
+ 229,119,128, 5,178,241,225,237,225,244,115,135, 5,179,100,188,
+ 100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128, 5,
+ 179,178, 56,128, 5,179,179, 52,128, 5,179,232,229,226,242,229,
+ 119,128, 5,179,238,225,242,242,239,247,232,229,226,242,229,119,
+ 128, 5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,
+ 128, 5,179,247,233,228,229,232,229,226,242,229,119,128, 5,179,
+ 243,229,231,239,108,135, 5,177,101, 22,101, 27,101, 32,101, 37,
+ 101, 46,101, 61,101, 77,177, 55,128, 5,177,178, 52,128, 5,177,
+ 179, 48,128, 5,177,232,229,226,242,229,119,128, 5,177,238,225,
+ 242,242,239,247,232,229,226,242,229,119,128, 5,177,241,245,225,
+ 242,244,229,242,232,229,226,242,229,119,128, 5,177,247,233,228,
+ 229,232,229,226,242,229,119,128, 5,177, 98, 3,101, 98,101,103,
+ 101,113,225,114,128, 1, 39,239,240,239,237,239,230,111,128, 49,
+ 15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99, 2,101,
+ 131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99, 2,
+ 101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,
+ 1, 37,100, 2,101,168,101,178,233,229,242,229,243,233,115,128,
+ 30, 39,239,116, 2,101,185,101,194,225,227,227,229,238,116,128,
+ 30, 35,226,229,236,239,119,128, 30, 37,101,136, 5,212,101,222,
+ 101,255,102, 19,102,248,103, 8,103, 53,103, 62,103, 75,225,242,
+ 116,129, 38,101,101,230,243,245,233,116, 2,101,239,101,247,226,
+ 236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,
+ 225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,
+ 128,251, 52,104, 6,102, 33,102, 61,102, 69,102,119,102,165,102,
+ 214, 97, 2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,
+ 233, 99,128, 6,193,242,225,226,233, 99,128, 6, 71,229,226,242,
+ 229,119,128, 5,212,230,233,238,225,236, 97, 2,102, 80,102,111,
+ 236,116, 2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,
+ 128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,
+ 225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,
+ 101, 2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,
+ 99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,
+ 233, 99,128,251,164,105, 2,102,171,102,205,238,233,244,233,225,
+ 236, 97, 2,102,183,102,197,236,244,239,238,229,225,242,225,226,
+ 233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,
+ 225,238, 97,128, 48,120,237,229,228,233,225,236, 97, 2,102,226,
+ 102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,
+ 242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,
+ 241,245,225,242,101,128, 51,123,107, 2,103, 14,103, 38,225,244,
+ 225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,
+ 228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,
+ 242,101,128, 51, 54,238,231,232,239,239,107,128, 2,103,242,245,
+ 244,245,243,241,245,225,242,101,128, 51, 57,116,129, 5,215,103,
+ 81,232,229,226,242,229,119,128, 5,215,232,239,239,107,129, 2,
+ 102,103, 99,243,245,240,229,242,233,239,114,128, 2,177,105, 4,
+ 103,120,103,205,103,216,103,241,229,245,104, 4,103,132,103,167,
+ 103,182,103,191, 97, 2,103,138,103,153,227,233,242,227,236,229,
+ 235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,
+ 242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,
+ 225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,
+ 129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,
+ 139,242,233,113,134, 5,180,104, 3,104, 8,104, 22,104, 31,104,
+ 46,104, 62,177, 52,128, 5,180, 50, 2,104, 14,104, 18, 49,128,
+ 5,180,100,128, 5,180,232,229,226,242,229,119,128, 5,180,238,
+ 225,242,242,239,247,232,229,226,242,229,119,128, 5,180,241,245,
+ 225,242,244,229,242,232,229,226,242,229,119,128, 5,180,247,233,
+ 228,229,232,229,226,242,229,119,128, 5,180,236,233,238,229,226,
+ 229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,
+ 128,255, 72,111, 9,104,119,104,130,104,154,104,179,105, 11,105,
+ 24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,
+ 5,112,232,105, 2,104,137,104,145,240,244,232,225,105,128, 14,
+ 43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,
+ 238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,
+ 128,255,142,236,225,109,135, 5,185,104,199,104,204,104,209,104,
+ 214,104,223,104,238,104,254,177, 57,128, 5,185,178, 54,128, 5,
+ 185,179, 50,128, 5,185,232,229,226,242,229,119,128, 5,185,238,
+ 225,242,242,239,247,232,229,226,242,229,119,128, 5,185,241,245,
+ 225,242,244,229,242,232,229,226,242,229,119,128, 5,185,247,233,
+ 228,229,232,229,226,242,229,119,128, 5,185,238,239,235,232,245,
+ 235,244,232,225,105,128, 14, 46,111, 2,105, 30,105,100,107, 4,
+ 105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,
+ 98,128, 3, 9,227,237, 98,128, 3, 9,240,225,236,225,244,225,
+ 236,233,250,229,228,226,229,236,239,247,227,237, 98,128, 3, 33,
+ 242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,
+ 98,128, 3, 34,238,243,241,245,225,242,101,128, 51, 66,114, 2,
+ 105,116,105,143,105, 2,105,122,105,131,227,239,240,244,233, 99,
+ 128, 3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,
+ 227,237, 98,128, 3, 27,244,243,240,242,233,238,231,115,128, 38,
+ 104,245,243,101,128, 35, 2,240,225,242,229,110,128, 36,163,243,
+ 245,240,229,242,233,239,114,128, 2,176,244,245,242,238,229,100,
+ 128, 2,101,117, 4,105,205,105,216,105,229,105,254,232,233,242,
+ 225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,
+ 242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,
+ 105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,
+ 225,242,245,237,236,225,245,116,129, 2,221,106, 13,227,237, 98,
+ 128, 3, 11,118,128, 1,149,249,240,232,229,110,132, 0, 45,106,
+ 39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,
+ 246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115, 2,
+ 106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,
+ 239,114,128,246,230,244,247,111,128, 32, 16,105,149, 0,105,106,
+ 137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,
+ 213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,
+ 110,113,197,113,254,114, 26,114, 70,225, 99, 2,106,144,106,150,
+ 245,244,101,128, 0,237,249,242,233,236,236,233, 99,128, 4, 79,
+ 98, 3,106,168,106,177,106,187,229,238,231,225,236,105,128, 9,
+ 135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,
+ 1, 45, 99, 3,106,202,106,209,106,231,225,242,239,110,128, 1,
+ 208,233,242, 99, 2,106,217,106,222,236,101,128, 36,216,245,237,
+ 230,236,229,120,128, 0,238,249,242,233,236,236,233, 99,128, 4,
+ 86,100, 4,106,251,107, 5,110, 80,110,113,226,236,231,242,225,
+ 246,101,128, 2, 9,101, 2,107, 11,110, 75,239,231,242,225,240,
+ 104, 7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,
+ 229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,
+ 242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,
+ 107,106,107,205,108, 3,108, 69,108, 98,108,114,108,171,108,220,
+ 108,232,109, 3,109, 70,109,208,109,237,225,236,236,233,225,238,
+ 227,229,240,225,242,229,110,128, 50, 63, 99, 4,107,116,107,127,
+ 107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,
+ 238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,
+ 101,128, 48, 6,111, 3,107,156,107,171,107,191,237,237, 97,129,
+ 48, 1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,
+ 245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,
+ 242,229,227,244,227,233,242,227,236,101,128, 50,163,101, 3,107,
+ 213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,
+ 47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,
+ 50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,
+ 128, 50,157,102, 2,108, 9,108, 24,229,243,244,233,246,225,236,
+ 240,225,242,229,110,128, 50, 64,105, 2,108, 30,108, 59,238,225,
+ 238,227,233,225,108, 2,108, 42,108, 51,227,233,242,227,236,101,
+ 128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,
+ 229,110,128, 50, 43,104, 2,108, 75,108, 86,225,246,229,240,225,
+ 242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,
+ 50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,
+ 48, 5,108, 3,108,122,108,148,108,160,225,226,239,114, 2,108,
+ 131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,
+ 110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,
+ 239,247,227,233,242,227,236,101,128, 50,166,109, 2,108,177,108,
+ 209,101, 2,108,183,108,198,228,233,227,233,238,229,227,233,242,
+ 227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,
+ 46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,
+ 240,225,242,229,110,128, 50, 52,112, 2,108,238,108,246,229,242,
+ 233,239,100,128, 48, 2,242,233,238,244,227,233,242,227,236,101,
+ 128, 50,158,114, 2,109, 9,109, 57,101, 3,109, 17,109, 28,109,
+ 43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,
+ 229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,
+ 229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,
+ 227,236,101,128, 50,168,115, 5,109, 82,109,111,109,125,109,150,
+ 109,178,101, 2,109, 88,109,101,227,242,229,244,227,233,242,227,
+ 236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,
+ 227,233,229,244,249,240,225,242,229,110,128, 50, 51,112, 2,109,
+ 131,109,137,225,227,101,128, 48, 0,229,227,233,225,236,240,225,
+ 242,229,110,128, 50, 53,116, 2,109,156,109,167,239,227,235,240,
+ 225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,
+ 50, 59,117, 2,109,184,109,193,238,240,225,242,229,110,128, 50,
+ 48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,
+ 119, 2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,
+ 50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,
+ 111,128, 48, 7,109, 2,109,250,110, 7,229,244,225,236,227,233,
+ 242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,
+ 128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,
+ 243,245,238,227,233,242,227,236,101,128, 50,144,119, 2,110, 50,
+ 110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,
+ 239,228,227,233,242,227,236,101,128, 50,141,246, 97,128, 9, 7,
+ 233,229,242,229,243,233,115,130, 0,239,110, 94,110,102,225,227,
+ 245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128, 4,
+ 229,239,244,226,229,236,239,119,128, 30,203,101, 3,110,131,110,
+ 147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,
+ 128, 4,215,227,249,242,233,236,236,233, 99,128, 4, 53,245,238,
+ 103, 4,110,170,110,205,110,220,110,229, 97, 2,110,176,110,191,
+ 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,
+ 227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,
+ 225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 7,103, 2,110,249,111, 0,242,225,246,101,128, 0,236,
+ 117, 2,111, 6,111, 15,234,225,242,225,244,105,128, 10,135,242,
+ 237,245,235,232,105,128, 10, 7,104, 2,111, 30,111, 40,233,242,
+ 225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,
+ 128, 30,201,105, 8,111, 69,111, 79,111, 90,111, 97,111,122,111,
+ 138,111,153,111,169,226,229,238,231,225,236,105,128, 9,136,227,
+ 249,242,233,236,236,233, 99,128, 4, 56,228,229,246, 97,128, 9,
+ 8,231,117, 2,111,104,111,113,234,225,242,225,244,105,128, 10,
+ 136,242,237,245,235,232,105,128, 10, 8,237,225,244,242,225,231,
+ 245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,
+ 228,226,242,229,246,101,128, 2, 11,243,232,239,242,244,227,249,
+ 242,233,236,236,233, 99,128, 4, 57,246,239,247,229,236,243,233,
+ 231,110, 3,111,185,111,195,111,202,226,229,238,231,225,236,105,
+ 128, 9,192,228,229,246, 97,128, 9, 64,231,245,234,225,242,225,
+ 244,105,128, 10,192,106,128, 1, 51,107, 2,111,223,111,247,225,
+ 244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,
+ 233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,
+ 2,112, 5,112, 10,228,101,128, 2,220,245,249,232,229,226,242,
+ 229,119,128, 5,172,109, 2,112, 27,112, 94, 97, 3,112, 35,112,
+ 55,112, 80,227,242,239,110,129, 1, 43,112, 44,227,249,242,233,
+ 236,236,233, 99,128, 4,227,231,229,239,242,225,240,240,242,239,
+ 248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,
+ 244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,
+ 239,243,240,225,227,101,128,255, 73,110, 5,112,117,112,127,112,
+ 136,112,148,112,232,227,242,229,237,229,238,116,128, 34, 6,230,
+ 233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,
+ 110,128, 5,107,116, 2,112,154,112,222,101, 2,112,160,112,211,
+ 231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98, 2,112,
+ 179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,
+ 120,128,248,245,116, 2,112,202,112,207,239,112,128, 35, 32,112,
+ 128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,
+ 241,245,225,242,101,128, 51, 5,118, 3,112,240,112,249,113, 2,
+ 226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,
+ 37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111, 3,
+ 113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128, 4,
+ 81,231,239,238,229,107,128, 1, 47,244, 97,131, 3,185,113, 52,
+ 113, 73,113, 81,228,233,229,242,229,243,233,115,129, 3,202,113,
+ 65,244,239,238,239,115,128, 3,144,236,225,244,233,110,128, 2,
+ 105,244,239,238,239,115,128, 3,175,240,225,242,229,110,128, 36,
+ 164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115, 4,
+ 113,120,113,165,113,179,113,187,237,225,236,108, 2,113,129,113,
+ 140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,
+ 235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,
+ 244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,
+ 128, 9,250,244,242,239,235,101,128, 2,104,245,240,229,242,233,
+ 239,114,128,246,237,116, 2,113,203,113,237,229,242,225,244,233,
+ 239,110, 2,113,215,113,226,232,233,242,225,231,225,238, 97,128,
+ 48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,
+ 101,129, 1, 41,113,246,226,229,236,239,119,128, 30, 45,117, 2,
+ 114, 4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,
+ 249,242,233,236,236,233, 99,128, 4, 78,246,239,247,229,236,243,
+ 233,231,110, 3,114, 42,114, 52,114, 59,226,229,238,231,225,236,
+ 105,128, 9,191,228,229,246, 97,128, 9, 63,231,245,234,225,242,
+ 225,244,105,128, 10,191,250,232,233,244,243, 97, 2,114, 81,114,
+ 92,227,249,242,233,236,236,233, 99,128, 4,117,228,226,236,231,
+ 242,225,246,229,227,249,242,233,236,236,233, 99,128, 4,119,106,
+ 138, 0,106,114,135,114,198,114,209,115, 3,115, 19,115,132,115,
+ 201,115,206,115,218,115,226, 97, 4,114,145,114,156,114,166,114,
+ 173,225,242,237,229,238,233,225,110,128, 5,113,226,229,238,231,
+ 225,236,105,128, 9,156,228,229,246, 97,128, 9, 28,231,117, 2,
+ 114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,
+ 235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,
+ 16, 99, 3,114,217,114,224,114,246,225,242,239,110,128, 1,240,
+ 233,242, 99, 2,114,232,114,237,236,101,128, 36,217,245,237,230,
+ 236,229,120,128, 1, 53,242,239,243,243,229,228,244,225,233,108,
+ 128, 2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,
+ 128, 2, 95,101, 3,115, 27,115, 38,115,103,227,249,242,233,236,
+ 236,233, 99,128, 4, 88,229,109, 4,115, 49,115, 58,115, 72,115,
+ 88,225,242,225,226,233, 99,128, 6, 44,230,233,238,225,236,225,
+ 242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,
+ 225,226,233, 99,128,254,160,104, 2,115,109,115,118,225,242,225,
+ 226,233, 99,128, 6,152,230,233,238,225,236,225,242,225,226,233,
+ 99,128,251,139,104, 2,115,138,115,188, 97, 3,115,146,115,156,
+ 115,163,226,229,238,231,225,236,105,128, 9,157,228,229,246, 97,
+ 128, 9, 29,231,117, 2,115,170,115,179,234,225,242,225,244,105,
+ 128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,
+ 237,229,238,233,225,110,128, 5,123,233,115,128, 48, 4,237,239,
+ 238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,
+ 36,165,243,245,240,229,242,233,239,114,128, 2,178,107,146, 0,
+ 107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,
+ 150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,
+ 118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,
+ 245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,
+ 2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,
+ 236,233, 99,128, 4,161,229,238,231,225,236,105,128, 9,149, 99,
+ 2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,
+ 233, 99,128, 4, 58,228,101, 2,116,108,116,126,243,227,229,238,
+ 228,229,242,227,249,242,233,236,236,233, 99,128, 4,155,246, 97,
+ 128, 9, 21,102,135, 5,219,116,149,116,158,116,178,116,192,116,
+ 201,116,217,116,232,225,242,225,226,233, 99,128, 6, 67,228,225,
+ 231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,
+ 251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,
+ 232,229,226,242,229,119,128, 5,219,233,238,233,244,233,225,236,
+ 225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,
+ 229,119,128,251, 77,231,117, 2,116,252,117, 5,234,225,242,225,
+ 244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104, 2,
+ 117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,
+ 235,227,249,242,233,236,236,233, 99,128, 4,196,235,225,244,225,
+ 235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,
+ 244,104,128,255,118,112, 2,117, 75,117, 96,240, 97,129, 3,186,
+ 117, 82,243,249,237,226,239,236,231,242,229,229,107,128, 3,240,
+ 249,229,239,245,110, 3,117,108,117,122,117,156,237,233,229,245,
+ 237,235,239,242,229,225,110,128, 49,113,112, 2,117,128,117,143,
+ 232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,
+ 229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,
+ 231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,
+ 239,242,233,233,243,241,245,225,242,101,128, 51, 13,115, 5,117,
+ 201,117,245,118, 4,118, 12,118, 40,232,233,228,225,225,245,244,
+ 111, 2,117,214,117,223,225,242,225,226,233, 99,128, 6, 64,238,
+ 239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,
+ 233, 99,128, 6, 64,237,225,236,236,235,225,244,225,235,225,238,
+ 97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97, 2,118,
+ 19,118, 28,225,242,225,226,233, 99,128, 6, 80,244,225,238,225,
+ 242,225,226,233, 99,128, 6, 77,244,242,239,235,229,227,249,242,
+ 233,236,236,233, 99,128, 4,159,244,225,232,233,242,225,240,242,
+ 239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,
+ 244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,
+ 239,235,229,227,249,242,233,236,236,233, 99,128, 4,157,226,239,
+ 240,239,237,239,230,111,128, 49, 14, 99, 4,118,131,118,153,118,
+ 162,118,170, 97, 2,118,137,118,147,236,243,241,245,225,242,101,
+ 128, 51,137,242,239,110,128, 1,233,229,228,233,236,236, 97,128,
+ 1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 55,228,239,244,226,229,236,239,119,128,
+ 30, 51,101, 4,118,204,118,231,119, 0,119, 12,104, 2,118,210,
+ 118,221,225,242,237,229,238,233,225,110,128, 5,132,233,242,225,
+ 231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,
+ 48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,
+ 238,225,242,237,229,238,233,225,110,128, 5,111,243,237,225,236,
+ 236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,
+ 238,236,225,238,228,233, 99,128, 1, 56,104, 6,119, 56,119,185,
+ 119,196,119,221,120, 52,120,140, 97, 5,119, 68,119, 78,119, 89,
+ 119, 96,119,121,226,229,238,231,225,236,105,128, 9,150,227,249,
+ 242,233,236,236,233, 99,128, 4, 69,228,229,246, 97,128, 9, 22,
+ 231,117, 2,119,103,119,112,234,225,242,225,244,105,128, 10,150,
+ 242,237,245,235,232,105,128, 10, 22,104, 4,119,131,119,140,119,
+ 154,119,170,225,242,225,226,233, 99,128, 6, 46,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,
+ 225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,
+ 99,128, 3,231,232, 97, 2,119,203,119,210,228,229,246, 97,128,
+ 9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,
+ 235,104, 4,119,235,120, 14,120, 29,120, 38, 97, 2,119,241,120,
+ 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,
+ 229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 10,111, 4,120, 62,120,111,120,121,120,126,235,104,
+ 4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,
+ 14, 2,239,238,244,232,225,105,128, 14, 5,245,225,244,244,232,
+ 225,105,128, 14, 3,247,225,233,244,232,225,105,128, 14, 4,237,
+ 245,244,244,232,225,105,128, 14, 91,239,107,128, 1,153,242,225,
+ 235,232,225,238,231,244,232,225,105,128, 14, 6,250,243,241,245,
+ 225,242,101,128, 51,145,105, 4,120,160,120,171,120,196,120,245,
+ 232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,
+ 225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,
+ 104,128,255,119,242,111, 3,120,205,120,220,120,236,231,245,242,
+ 225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,
+ 239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,
+ 242,101,128, 51, 20,249,229,239,107, 5,121, 4,121, 39,121, 54,
+ 121, 63,121, 77, 97, 2,121, 10,121, 25,227,233,242,227,236,229,
+ 235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,
+ 242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 0,243,233,239,
+ 243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 92,108, 2,121,109,121,120,233,238,229,
+ 226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,
+ 152,109, 3,121,137,121,151,121,162,227,245,226,229,228,243,241,
+ 245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,
+ 255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,
+ 51,162,111, 5,121,190,121,216,121,254,122, 10,122, 24,104, 2,
+ 121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,
+ 241,245,225,242,101,128, 51,192,235, 97, 2,121,223,121,231,233,
+ 244,232,225,105,128, 14, 1,244,225,235,225,238, 97,129, 48,179,
+ 121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,
+ 239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,
+ 233,236,236,233, 99,128, 4,129,114, 2,122, 30,122, 50,229,225,
+ 238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,
+ 50,127,239,238,233,243,227,237, 98,128, 3, 67,240, 97, 2,122,
+ 67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,
+ 51,170,243,233,227,249,242,233,236,236,233, 99,128, 4,111,116,
+ 2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,
+ 238,229,100,128, 2,158,117, 2,122,124,122,135,232,233,242,225,
+ 231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,
+ 48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,
+ 246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,
+ 101,128, 51,190,108,146, 0,108,122,220,124,247,125, 20,125, 86,
+ 125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,
+ 127,125,127,133,127,166,127,175,127,183,127,245, 97, 7,122,236,
+ 122,246,122,253,123, 4,123, 29,123, 45,124,235,226,229,238,231,
+ 225,236,105,128, 9,178,227,245,244,101,128, 1, 58,228,229,246,
+ 97,128, 9, 50,231,117, 2,123, 11,123, 20,234,225,242,225,244,
+ 105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,
+ 225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,
+ 67,124, 6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,
+ 150,124,173, 97, 2,123, 73,123,254,236,229,102, 4,123, 85,123,
+ 99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,252,232,225,237,250, 97, 2,123,109,123,150,225,226,239,
+ 246,101, 2,123,119,123,133,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,
+ 226,233, 99,128,254,247,226,229,236,239,119, 2,123,160,123,174,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,
+ 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,
+ 237,225,228,228,225,225,226,239,246,101, 2,123,223,123,237,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,
+ 236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,
+ 226,233, 99,128, 6, 68,226,228, 97,129, 3,187,124, 14,243,244,
+ 242,239,235,101,128, 1,155,229,100,130, 5,220,124, 32,124, 52,
+ 228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,
+ 119,128,251, 60,232,229,226,242,229,119,128, 5,220,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,
+ 229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,
+ 225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101, 2,
+ 124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 224,229,109, 2,124,200,124,219,232,225,232,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,
+ 242,227,236,101,128, 37,239, 98, 3,124,255,125, 4,125, 10,225,
+ 114,128, 1,154,229,236,116,128, 2,108,239,240,239,237,239,230,
+ 111,128, 49, 12, 99, 4,125, 30,125, 37,125, 46,125, 73,225,242,
+ 239,110,128, 1, 62,229,228,233,236,236, 97,128, 1, 60,233,242,
+ 99, 2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,
+ 248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,
+ 229,238,116,128, 1, 60,228,239,116,130, 1, 64,125, 96,125,105,
+ 225,227,227,229,238,116,128, 1, 64,226,229,236,239,119,129, 30,
+ 55,125,115,237,225,227,242,239,110,128, 30, 57,101, 3,125,132,
+ 125,170,126, 15,230,116, 2,125,139,125,155,225,238,231,236,229,
+ 225,226,239,246,229,227,237, 98,128, 3, 26,244,225,227,235,226,
+ 229,236,239,247,227,237, 98,128, 3, 24,243,115,132, 0, 60,125,
+ 183,125,205,125,217,126, 7,229,241,245,225,108,129, 34,100,125,
+ 193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,
+ 239,243,240,225,227,101,128,255, 28,111, 2,125,223,125,252,114,
+ 2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,
+ 34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,
+ 241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,
+ 104,128, 2,110,230,226,236,239,227,107,128, 37,140,232,239,239,
+ 235,242,229,244,242,239,230,236,229,120,128, 2,109,105, 2,126,
+ 51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,
+ 225,110,128, 5,108,106,129, 1,201,126, 75,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 89,108,132,246,192,126, 99,126,123,126,
+ 134,126,143, 97, 2,126,105,126,112,228,229,246, 97,128, 9, 51,
+ 231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,
+ 236,239,119,128, 30, 59,236,225,228,229,246, 97,128, 9, 52,246,
+ 239,227,225,236,233, 99, 3,126,157,126,167,126,174,226,229,238,
+ 231,225,236,105,128, 9,225,228,229,246, 97,128, 9, 97,246,239,
+ 247,229,236,243,233,231,110, 2,126,188,126,198,226,229,238,231,
+ 225,236,105,128, 9,227,228,229,246, 97,128, 9, 99,109, 3,126,
+ 213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,
+ 2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,
+ 225,242,101,128, 51,208,111, 6,127, 4,127, 16,127, 58,127, 69,
+ 127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,
+ 231,233,227,225,108, 3,127, 28,127, 34,127, 53,225,238,100,128,
+ 34, 39,238,239,116,129, 0,172,127, 42,242,229,246,229,242,243,
+ 229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,
+ 225,105,128, 14, 37,238,231,115,128, 1,127,247,236,233,238,101,
+ 2,127, 85,127,108, 99, 2,127, 91,127,103,229,238,244,229,242,
+ 236,233,238,101,128,254, 78,237, 98,128, 3, 50,228,225,243,232,
+ 229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,
+ 229,110,128, 36,167,115, 3,127,141,127,148,127,156,236,225,243,
+ 104,128, 1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,
+ 233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,
+ 244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99, 3,127,
+ 197,127,207,127,214,226,229,238,231,225,236,105,128, 9,140,228,
+ 229,246, 97,128, 9, 12,246,239,247,229,236,243,233,231,110, 2,
+ 127,228,127,238,226,229,238,231,225,236,105,128, 9,226,228,229,
+ 246, 97,128, 9, 98,248,243,241,245,225,242,101,128, 51,211,109,
+ 144, 0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,
+ 40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,
+ 108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,
+ 215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,
+ 231,225,236,105,128, 9,174, 99, 2,128, 77,128,129,242,239,110,
+ 132, 0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,
+ 227,237, 98,128, 3, 49,227,237, 98,128, 3, 4,236,239,247,237,
+ 239,100,128, 2,205,237,239,238,239,243,240,225,227,101,128,255,
+ 227,245,244,101,128, 30, 63,228,229,246, 97,128, 9, 46,231,117,
+ 2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,
+ 245,235,232,105,128, 10, 46,104, 2,128,173,128,205,225,240,225,
+ 235,104, 2,128,183,128,192,232,229,226,242,229,119,128, 5,164,
+ 236,229,230,244,232,229,226,242,229,119,128, 5,164,233,242,225,
+ 231,225,238, 97,128, 48,126,105, 5,128,227,129, 40,129,103,129,
+ 133,130, 39,227,232,225,244,244,225,247, 97, 3,128,242,129, 17,
+ 129, 24,236,239,119, 2,128,250,129, 5,236,229,230,244,244,232,
+ 225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,
+ 148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,
+ 244,244,232,225,105,128,248,147,229,107, 3,129, 49,129, 80,129,
+ 87,236,239,119, 2,129, 57,129, 68,236,229,230,244,244,232,225,
+ 105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,
+ 244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,
+ 244,232,225,105,128,248,138,232,225,238,225,235,225,116, 2,129,
+ 115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,
+ 225,105,128, 14, 49,116, 3,129,141,129,169,129,232,225,233,235,
+ 232,117, 2,129,151,129,162,236,229,230,244,244,232,225,105,128,
+ 248,137,244,232,225,105,128, 14, 71,232,111, 3,129,178,129,209,
+ 129,216,236,239,119, 2,129,186,129,197,236,229,230,244,244,232,
+ 225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,
+ 142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,
+ 244,244,232,225,105,128,248,141,242,105, 3,129,241,130, 16,130,
+ 23,236,239,119, 2,129,249,130, 4,236,229,230,244,244,232,225,
+ 105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,
+ 244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,
+ 244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,
+ 128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,
+ 232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,
+ 66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,
+ 225,230,232,229,226,242,229,119,128, 5,190,242,115,128, 38, 66,
+ 115, 2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,
+ 229,226,242,229,119,128, 5,175,241,245,225,242,101,128, 51,131,
+ 98, 2,130,150,130,160,239,240,239,237,239,230,111,128, 49, 7,
+ 243,241,245,225,242,101,128, 51,212, 99, 2,130,175,130,183,233,
+ 242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,
+ 101,128, 51,165,228,239,116, 2,130,204,130,213,225,227,227,229,
+ 238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101, 7,130,
+ 237,131,108,131,119,131,134,131,159,131,196,131,208,101, 2,130,
+ 243,131, 95,109, 4,130,253,131, 6,131, 20,131, 36,225,242,225,
+ 226,233, 99,128, 6, 69,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,227,237,101, 2,131, 43,131, 56,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,228,229,237,105, 2,131, 64,131, 79,
+ 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,
+ 239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,
+ 231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,
+ 225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,
+ 225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,
+ 130, 5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,
+ 131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,
+ 119,128, 5,222,238,225,242,237,229,238,233,225,110,128, 5,116,
+ 242,235,232, 97, 3,131,219,131,228,132, 5,232,229,226,242,229,
+ 119,128, 5,165,235,229,230,245,236, 97, 2,131,239,131,248,232,
+ 229,226,242,229,119,128, 5,166,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,166,236,229,230,244,232,229,226,242,229,119,128,
+ 5,165,104, 2,132, 24,132, 30,239,239,107,128, 2,113,250,243,
+ 241,245,225,242,101,128, 51,146,105, 6,132, 54,132, 91,132,228,
+ 132,239,133, 8,133, 65,228,100, 2,132, 61,132, 86,236,229,228,
+ 239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,
+ 228,244,104,128,255,101,239,116,128, 0,183,229,245,109, 5,132,
+ 105,132,140,132,155,132,164,132,215, 97, 2,132,111,132,126,227,
+ 233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,
+ 242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,
+ 236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,
+ 110,128, 49, 65,112, 2,132,170,132,202, 97, 2,132,176,132,190,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,
+ 238,235,239,242,229,225,110,128, 50, 4,233,229,245,240,235,239,
+ 242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,
+ 110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,
+ 225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,
+ 247,233,228,244,104,128,255,144,238,117, 2,133, 15,133, 60,115,
+ 132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,
+ 227,237, 98,128, 3, 32,227,233,242,227,236,101,128, 34,150,237,
+ 239,100,128, 2,215,240,236,245,115,128, 34, 19,244,101,128, 32,
+ 50,242,105, 2,133, 72,133, 86,226,225,225,242,245,243,241,245,
+ 225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,
+ 2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,
+ 100,128, 2,112,243,241,245,225,242,101,128, 51,150,109, 3,133,
+ 133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,
+ 128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,
+ 245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111, 5,
+ 133,186,133,212,133,237,133,247,134, 0,104, 2,133,192,133,202,
+ 233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,
+ 101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,
+ 225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,
+ 245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,
+ 246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,
+ 243,241,245,225,242,101,128, 51,168,240, 97, 2,134, 32,134, 38,
+ 242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,
+ 2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,
+ 229,242,233,239,114,128,246,239,244,245,242,238,229,100,128, 2,
+ 111,117,141, 0,181,134,111,134,115,134,125,134,149,134,159,134,
+ 181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,
+ 128, 0,181,225,243,241,245,225,242,101,128, 51,130,227,104, 2,
+ 134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,
+ 243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,
+ 2,134,165,134,172,242,229,229,107,128, 3,188,243,241,245,225,
+ 242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,
+ 235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,
+ 230,247,233,228,244,104,128,255,145,108, 2,134,223,134,232,243,
+ 241,245,225,242,101,128, 51,149,244,233,240,236,121,128, 0,215,
+ 237,243,241,245,225,242,101,128, 51,155,238,225,104, 2,135, 2,
+ 135, 11,232,229,226,242,229,119,128, 5,163,236,229,230,244,232,
+ 229,226,242,229,119,128, 5,163,115, 2,135, 30,135, 79,233, 99,
+ 3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,
+ 135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,
+ 128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,
+ 241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,
+ 51,182,247,243,241,245,225,242,101,128, 51,188,118, 2,135,114,
+ 135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,
+ 241,245,225,242,101,128, 51,183,119, 2,135,142,135,155,237,229,
+ 231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,
+ 101,128, 51,189,110,150, 0,110,135,212,136, 90,136,114,136,180,
+ 136,205,137, 7,137, 17,137, 84,137,127,139,161,139,179,139,204,
+ 139,235,140, 5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,
+ 143, 71,143, 81, 97, 8,135,230,135,250,136, 1,136, 8,136, 33,
+ 136, 44,136, 69,136, 81, 98, 2,135,236,135,245,229,238,231,225,
+ 236,105,128, 9,168,236, 97,128, 34, 7,227,245,244,101,128, 1,
+ 68,228,229,246, 97,128, 9, 40,231,117, 2,136, 15,136, 24,234,
+ 225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,
+ 40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,
+ 235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,
+ 244,104,128,255,133,240,239,243,244,242,239,240,232,101,128, 1,
+ 73,243,241,245,225,242,101,128, 51,129, 98, 2,136, 96,136,106,
+ 239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,
+ 0,160, 99, 4,136,124,136,131,136,140,136,167,225,242,239,110,
+ 128, 1, 72,229,228,233,236,236, 97,128, 1, 70,233,242, 99, 2,
+ 136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 70,228,239,116, 2,136,188,136,197,225,227,227,229,
+ 238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101, 3,136,
+ 213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,
+ 235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,
+ 230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,
+ 243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,
+ 139,103, 2,137, 23,137, 73, 97, 3,137, 31,137, 41,137, 48,226,
+ 229,238,231,225,236,105,128, 9,153,228,229,246, 97,128, 9, 25,
+ 231,117, 2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,
+ 242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,
+ 105,128, 14, 7,104, 2,137, 90,137,100,233,242,225,231,225,238,
+ 97,128, 48,147,239,239,107, 2,137,108,137,115,236,229,230,116,
+ 128, 2,114,242,229,244,242,239,230,236,229,120,128, 2,115,105,
+ 4,137,137,138, 50,138, 61,138,119,229,245,110, 7,137,155,137,
+ 190,137,222,137,236,137,245,138, 22,138, 35, 97, 2,137,161,137,
+ 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,
+ 2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,
+ 53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,
+ 225,110,128, 49, 52,240, 97, 2,137,252,138, 10,238,243,233,239,
+ 243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,
+ 229,225,110,128, 50, 1,243,233,239,243,235,239,242,229,225,110,
+ 128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,
+ 49,102,232,233,242,225,231,225,238, 97,128, 48,107,107, 2,138,
+ 67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,
+ 225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,
+ 2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,
+ 244,232,225,105,128, 14, 77,238,101,141, 0, 57,138,150,138,159,
+ 138,169,138,199,138,206,138,231,139, 2,139, 36,139, 48,139, 59,
+ 139, 92,139,100,139,111,225,242,225,226,233, 99,128, 6,105,226,
+ 229,238,231,225,236,105,128, 9,239,227,233,242,227,236,101,129,
+ 36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,
+ 229,242,233,102,128, 39,146,228,229,246, 97,128, 9,111,231,117,
+ 2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,
+ 245,235,232,105,128, 10,111,232, 97, 2,138,238,138,249,227,235,
+ 225,242,225,226,233, 99,128, 6,105,238,231,250,232,239,117,128,
+ 48, 41,105, 2,139, 8,139, 26,228,229,239,231,242,225,240,232,
+ 233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,
+ 114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,
+ 239,236,228,243,244,249,236,101,128,247, 57,112, 2,139, 65,139,
+ 72,225,242,229,110,128, 36,124,229,114, 2,139, 79,139, 85,233,
+ 239,100,128, 36,144,243,233,225,110,128, 6,249,242,239,237,225,
+ 110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,
+ 2,139,117,139,155,229,229,110, 2,139,125,139,134,227,233,242,
+ 227,236,101,128, 36,114,112, 2,139,140,139,147,225,242,229,110,
+ 128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,
+ 89,106,129, 1,204,139,167,229,227,249,242,233,236,236,233, 99,
+ 128, 4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,
+ 232,225,236,230,247,233,228,244,104,128,255,157,108, 2,139,210,
+ 139,224,229,231,242,233,231,232,244,236,239,238,103,128, 1,158,
+ 233,238,229,226,229,236,239,119,128, 30, 73,109, 2,139,241,139,
+ 252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,
+ 242,101,128, 51,154,110, 2,140, 11,140, 61, 97, 3,140, 19,140,
+ 29,140, 36,226,229,238,231,225,236,105,128, 9,163,228,229,246,
+ 97,128, 9, 35,231,117, 2,140, 43,140, 52,234,225,242,225,244,
+ 105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,
+ 229,246, 97,128, 9, 41,111, 6,140, 84,140, 95,140,120,140,161,
+ 141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,
+ 225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,
+ 247,233,228,244,104,128,255,137,110, 3,140,128,140,144,140,153,
+ 226,242,229,225,235,233,238,231,243,240,225,227,101,128, 0,160,
+ 229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,
+ 25,239,110, 7,140,178,140,187,140,201,140,235,140,251,141, 36,
+ 141, 95,225,242,225,226,233, 99,128, 6, 70,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97, 2,
+ 140,212,140,221,225,242,225,226,233, 99,128, 6,186,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,
+ 2,141, 5,141, 20,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,
+ 99,128,252, 75,237,101, 2,141, 43,141, 56,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,232,229,237,105, 2,141, 64,141, 79,
+ 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,
+ 239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,
+ 141,116, 7,141,129,141,140,141,169,141,204,141,216,141,236,142,
+ 6,227,239,238,244,225,233,238,115,128, 34, 12,101, 2,141,146,
+ 141,162,236,229,237,229,238,116,129, 34, 9,141,157,239,102,128,
+ 34, 9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,
+ 129, 34,111,141,181,238,239,114, 2,141,189,141,197,229,241,245,
+ 225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,
+ 244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,
+ 225,238,239,242,229,241,245,225,108,128, 34,112,112, 2,141,242,
+ 141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,
+ 228,229,115,128, 34,128,243,117, 3,142, 15,142, 22,142, 31,226,
+ 243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,
+ 229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,
+ 110,128, 5,118,240,225,242,229,110,128, 36,169,115, 2,142, 66,
+ 142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,
+ 239,114,128, 32,127,244,233,236,228,101,128, 0,241,117,132, 3,
+ 189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,
+ 97,128, 48,108,107, 2,142,122,142,146,225,244,225,235,225,238,
+ 97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,
+ 255,135,244, 97, 3,142,155,142,165,142,172,226,229,238,231,225,
+ 236,105,128, 9,188,228,229,246, 97,128, 9, 60,231,117, 2,142,
+ 179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,
+ 232,105,128, 10, 60,109, 2,142,203,142,237,226,229,242,243,233,
+ 231,110,130, 0, 35,142,217,142,229,237,239,238,239,243,240,225,
+ 227,101,128,255, 3,243,237,225,236,108,128,254, 95,229,114, 2,
+ 142,244,143, 20,225,236,243,233,231,110, 2,142,255,143, 7,231,
+ 242,229,229,107,128, 3,116,236,239,247,229,242,231,242,229,229,
+ 107,128, 3,117,111,128, 33, 22,110,130, 5,224,143, 32,143, 52,
+ 228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,
+ 119,128,251, 64,232,229,226,242,229,119,128, 5,224,246,243,241,
+ 245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,
+ 187,249, 97, 3,143, 90,143,100,143,107,226,229,238,231,225,236,
+ 105,128, 9,158,228,229,246, 97,128, 9, 30,231,117, 2,143,114,
+ 143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,
+ 105,128, 10, 30,111,147, 0,111,143,174,143,196,144, 18,144,188,
+ 145, 4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,
+ 148, 8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97, 2,
+ 143,180,143,187,227,245,244,101,128, 0,243,238,231,244,232,225,
+ 105,128, 14, 45, 98, 4,143,206,143,248,144, 1,144, 11,225,242,
+ 242,229,100,130, 2,117,143,218,143,229,227,249,242,233,236,236,
+ 233, 99,128, 4,233,228,233,229,242,229,243,233,243,227,249,242,
+ 233,236,236,233, 99,128, 4,235,229,238,231,225,236,105,128, 9,
+ 147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,
+ 1, 79, 99, 3,144, 26,144, 99,144,178, 97, 2,144, 32,144, 93,
+ 238,228,242, 97, 3,144, 43,144, 50,144, 61,228,229,246, 97,128,
+ 9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,
+ 229,236,243,233,231,110, 2,144, 75,144, 82,228,229,246, 97,128,
+ 9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,
+ 128, 1,210,233,242, 99, 2,144,107,144,112,236,101,128, 36,222,
+ 245,237,230,236,229,120,133, 0,244,144,131,144,139,144,150,144,
+ 158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,
+ 236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,
+ 239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,
+ 30,215,249,242,233,236,236,233, 99,128, 4, 62,100, 4,144,198,
+ 144,221,144,227,144,250,226,108, 2,144,205,144,213,225,227,245,
+ 244,101,128, 1, 81,231,242,225,246,101,128, 2, 13,229,246, 97,
+ 128, 9, 19,233,229,242,229,243,233,115,129, 0,246,144,239,227,
+ 249,242,233,236,236,233, 99,128, 4,231,239,244,226,229,236,239,
+ 119,128, 30,205,101,129, 1, 83,145, 10,235,239,242,229,225,110,
+ 128, 49, 90,103, 3,145, 27,145, 42,145, 49,239,238,229,107,129,
+ 2,219,145, 36,227,237, 98,128, 3, 40,242,225,246,101,128, 0,
+ 242,245,234,225,242,225,244,105,128, 10,147,104, 4,145, 69,145,
+ 80,145, 90,145,168,225,242,237,229,238,233,225,110,128, 5,133,
+ 233,242,225,231,225,238, 97,128, 48, 74,111, 2,145, 96,145,106,
+ 239,235,225,226,239,246,101,128, 30,207,242,110,133, 1,161,145,
+ 121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,
+ 219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,
+ 101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,
+ 244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,
+ 225,245,116,128, 1, 81,105,129, 1,163,145,188,238,246,229,242,
+ 244,229,228,226,242,229,246,101,128, 2, 15,107, 2,145,209,145,
+ 233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,
+ 230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,
+ 87,236,229,232,229,226,242,229,119,128, 5,171,109, 6,146, 10,
+ 146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,
+ 1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,
+ 225,246,101,128, 30, 81,228,229,246, 97,128, 9, 80,229,231, 97,
+ 133, 3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128, 3,
+ 214,227,249,242,233,236,236,233, 99,128, 4, 97,236,225,244,233,
+ 238,227,236,239,243,229,100,128, 2,119,242,239,245,238,228,227,
+ 249,242,233,236,236,233, 99,128, 4,123,116, 2,146,112,146,127,
+ 233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,125,239,
+ 238,239,115,128, 3,206,231,245,234,225,242,225,244,105,128, 10,
+ 208,233,227,242,239,110,129, 3,191,146,155,244,239,238,239,115,
+ 128, 3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,
+ 145, 0, 49,146,213,146,222,146,232,147, 6,147, 31,147, 40,147,
+ 49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,
+ 227,147,235,147,246,225,242,225,226,233, 99,128, 6, 97,226,229,
+ 238,231,225,236,105,128, 9,231,227,233,242,227,236,101,129, 36,
+ 96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,
+ 242,233,102,128, 39,138,100, 2,147, 12,147, 18,229,246, 97,128,
+ 9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,
+ 233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,
+ 220,231,117, 2,147, 56,147, 65,234,225,242,225,244,105,128, 10,
+ 231,242,237,245,235,232,105,128, 10,103,232, 97, 3,147, 83,147,
+ 94,147, 99,227,235,225,242,225,226,233, 99,128, 6, 97,236,102,
+ 128, 0,189,238,231,250,232,239,117,128, 48, 33,105, 2,147,114,
+ 147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,
+ 238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,
+ 244,239,242,226,229,238,231,225,236,105,128, 9,244,239,236,228,
+ 243,244,249,236,101,128,247, 49,112, 2,147,190,147,197,225,242,
+ 229,110,128, 36,116,229,114, 2,147,204,147,210,233,239,100,128,
+ 36,136,243,233,225,110,128, 6,241,241,245,225,242,244,229,114,
+ 128, 0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,
+ 233,239,114,128, 0,185,244,104, 2,147,253,148, 2,225,105,128,
+ 14, 81,233,242,100,128, 33, 83,111, 3,148, 16,148, 50,148, 66,
+ 103, 2,148, 22,148, 40,239,238,229,107,129, 1,235,148, 31,237,
+ 225,227,242,239,110,128, 1,237,245,242,237,245,235,232,105,128,
+ 10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,
+ 10, 75,240,229,110,128, 2, 84,112, 3,148, 80,148, 87,148, 98,
+ 225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,
+ 37,230,244,233,239,110,128, 35, 37,114, 2,148,111,148,140,100,
+ 2,148,117,148,128,230,229,237,233,238,233,238,101,128, 0,170,
+ 237,225,243,227,245,236,233,238,101,128, 0,186,244,232,239,231,
+ 239,238,225,108,128, 34, 31,115, 5,148,163,148,195,148,212,149,
+ 1,149, 14,232,239,242,116, 2,148,172,148,179,228,229,246, 97,
+ 128, 9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,
+ 128, 9, 74,236,225,243,104,129, 0,248,148,204,225,227,245,244,
+ 101,128, 1,255,237,225,236,108, 2,148,221,148,232,232,233,242,
+ 225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,
+ 129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,
+ 107,244,242,239,235,229,225,227,245,244,101,128, 1,255,245,240,
+ 229,242,233,239,114,128,246,240,116, 2,149, 30,149, 41,227,249,
+ 242,233,236,236,233, 99,128, 4,127,233,236,228,101,130, 0,245,
+ 149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,
+ 229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,
+ 128, 49, 33,118, 2,149, 89,149,170,229,114, 2,149, 96,149,162,
+ 236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99, 2,149,
+ 115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,
+ 98,128, 3, 5,100, 2,149,138,149,146,225,243,232,229,100,128,
+ 254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,
+ 254, 75,243,227,239,242,101,128, 0,175,239,247,229,236,243,233,
+ 231,110, 3,149,185,149,195,149,202,226,229,238,231,225,236,105,
+ 128, 9,203,228,229,246, 97,128, 9, 75,231,245,234,225,242,225,
+ 244,105,128, 10,203,112,145, 0,112,149,251,152,123,152,134,152,
+ 143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,
+ 92,157,100,158, 2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,
+ 57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,
+ 212,150,226,151,238,152, 21,152,111, 97, 2,150, 31,150, 43,237,
+ 240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,
+ 243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,
+ 128, 9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128, 9,
+ 42,103, 2,150, 87,150,105,101, 2,150, 93,150,100,228,239,247,
+ 110,128, 33,223,245,112,128, 33,222,117, 2,150,111,150,120,234,
+ 225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,
+ 42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,
+ 238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,
+ 238, 97,128, 48,209,108, 2,150,171,150,196,225,244,225,236,233,
+ 250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,
+ 98,128, 4,132,239,227,232,235,225,227,249,242,233,236,236,233,
+ 99,128, 4,192,238,243,233,239,243,235,239,242,229,225,110,128,
+ 49,127,114, 3,150,234,150,255,151,227, 97, 2,150,240,150,248,
+ 231,242,225,240,104,128, 0,182,236,236,229,108,128, 34, 37,229,
+ 110, 2,151, 6,151,116,236,229,230,116,136, 0, 40,151, 29,151,
+ 44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,
+ 239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,
+ 237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,
+ 141,237,239,238,239,243,240,225,227,101,128,255, 8,115, 2,151,
+ 83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,
+ 114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,
+ 108,128,254, 53,242,233,231,232,116,136, 0, 41,151,140,151,155,
+ 151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,
+ 238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,
+ 229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,
+ 237,239,238,239,243,240,225,227,101,128,255, 9,115, 2,151,194,
+ 151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,
+ 128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,
+ 128,254, 54,244,233,225,236,228,233,230,102,128, 34, 2,115, 3,
+ 151,246,152, 1,152, 13,229,241,232,229,226,242,229,119,128, 5,
+ 192,232,244,225,232,229,226,242,229,119,128, 5,153,241,245,225,
+ 242,101,128, 51,169,244,225,104,134, 5,183,152, 39,152, 53,152,
+ 58,152, 67,152, 82,152, 98, 49, 2,152, 45,152, 49, 49,128, 5,
+ 183,100,128, 5,183,178, 97,128, 5,183,232,229,226,242,229,119,
+ 128, 5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,
+ 5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+ 5,183,247,233,228,229,232,229,226,242,229,119,128, 5,183,250,
+ 229,242,232,229,226,242,229,119,128, 5,161,226,239,240,239,237,
+ 239,230,111,128, 49, 6,227,233,242,227,236,101,128, 36,223,228,
+ 239,244,225,227,227,229,238,116,128, 30, 87,101,137, 5,228,152,
+ 177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,
+ 73,227,249,242,233,236,236,233, 99,128, 4, 63,228,225,231,229,
+ 243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,
+ 229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,
+ 236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,
+ 104, 5,152,252,153, 19,153, 27,153, 41,153, 71,225,114, 2,153,
+ 3,153, 10,225,226,233, 99,128, 6,126,237,229,238,233,225,110,
+ 128, 5,122,229,226,242,229,119,128, 5,228,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,251, 87,105, 2,153, 47,153, 62,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,
+ 231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,
+ 226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,
+ 218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,
+ 236,233, 99,128, 4,167,114, 5,153,130,153,142,153,184,154, 49,
+ 154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,
+ 238,116,131, 0, 37,153,155,153,164,153,176,225,242,225,226,233,
+ 99,128, 6,106,237,239,238,239,243,240,225,227,101,128,255, 5,
+ 243,237,225,236,108,128,254,106,105, 2,153,190,154, 31,239,100,
+ 134, 0, 46,153,207,153,218,153,229,153,241,153,252,154, 8,225,
+ 242,237,229,238,233,225,110,128, 5,137,227,229,238,244,229,242,
+ 229,100,128, 0,183,232,225,236,230,247,233,228,244,104,128,255,
+ 97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,
+ 243,240,225,227,101,128,255, 14,115, 2,154, 14,154, 21,237,225,
+ 236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,
+ 240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128, 3,
+ 66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,
+ 239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,
+ 230,243,241,245,225,242,101,128, 51,138,104, 3,154, 98,154,148,
+ 155, 29, 97, 3,154,106,154,116,154,123,226,229,238,231,225,236,
+ 105,128, 9,171,228,229,246, 97,128, 9, 43,231,117, 2,154,130,
+ 154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,
+ 105,128, 10, 43,105,133, 3,198,154,162,154,166,154,252,155, 4,
+ 155, 15, 49,128, 3,213,229,245,240,104, 4,154,179,154,214,154,
+ 229,154,238, 97, 2,154,185,154,200,227,233,242,227,236,229,235,
+ 239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,
+ 229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,
+ 225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,
+ 242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,
+ 110,128, 2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,
+ 249,237,226,239,236,231,242,229,229,107,128, 3,213,111, 3,155,
+ 37,155, 42,155, 68,239,107,128, 1,165,240,104, 2,155, 49,155,
+ 58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,
+ 105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,
+ 14, 32,105,133, 3,192,155, 96,156, 52,156, 63,156, 74,156, 88,
+ 229,245,112, 6,155,112,155,147,155,179,155,207,155,221,156, 17,
+ 97, 2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,
+ 225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 19,227,105, 2,155,154,155,166,229,245,227,235,239,242,
+ 229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,
+ 128, 50,101,107, 2,155,185,155,199,233,249,229,239,235,235,239,
+ 242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 5,243,233,239,
+ 115, 2,155,230,156, 2,107, 2,155,236,155,250,233,249,229,239,
+ 235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,
+ 49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,
+ 117,116, 2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,
+ 229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,
+ 110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,
+ 225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,
+ 231,242,229,229,107,128, 3,214,247,242,225,242,237,229,238,233,
+ 225,110,128, 5,131,236,245,115,132, 0, 43,156,115,156,126,156,
+ 135,156,168,226,229,236,239,247,227,237, 98,128, 3, 31,227,233,
+ 242,227,236,101,128, 34,149,109, 2,156,141,156,148,233,238,245,
+ 115,128, 0,177,111, 2,156,154,156,158,100,128, 2,214,238,239,
+ 243,240,225,227,101,128,255, 11,115, 2,156,174,156,181,237,225,
+ 236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,
+ 2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,
+ 243,241,245,225,242,101,128, 51,216,111, 5,156,229,156,240,157,
+ 51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,
+ 233,238,244,233,238,231,233,238,228,229,120, 4,157, 4,157, 16,
+ 157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,
+ 236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,
+ 244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,
+ 128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,
+ 225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,
+ 129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,
+ 110,128, 36,171,114, 3,157,108,157,134,157,159,101, 2,157,114,
+ 157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,
+ 233,239,110,128, 33, 30,233,237,101, 2,157,142,157,148,237,239,
+ 100,128, 2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,
+ 4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,
+ 234,229,227,244,233,246,101,128, 35, 5,236,239,238,231,229,228,
+ 235,225,238, 97,128, 48,252,112, 2,157,205,157,242,101, 2,157,
+ 211,157,218,236,236,239,114,128, 35, 24,242,243,117, 2,157,226,
+ 157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,
+ 34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,
+ 34, 29,115, 2,158, 8,158, 51,105,130, 3,200,158, 16,158, 27,
+ 227,249,242,233,236,236,233, 99,128, 4,113,236,233,240,238,229,
+ 245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,
+ 128, 4,134,243,241,245,225,242,101,128, 51,176,117, 2,158, 66,
+ 158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,
+ 225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,
+ 51,180,247,243,241,245,225,242,101,128, 51,186,113,136, 0,113,
+ 158,128,159,177,159,188,159,197,159,204,159,216,159,254,160, 6,
+ 97, 4,158,138,158,161,158,225,159,160,100, 2,158,144,158,150,
+ 229,246, 97,128, 9, 88,237,225,232,229,226,242,229,119,128, 5,
+ 168,102, 4,158,171,158,180,158,194,158,210,225,242,225,226,233,
+ 99,128, 6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,
+ 254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 216,237,225,244,115,136, 5,184,158,248,159, 12,159, 26,159, 31,
+ 159, 36,159, 45,159, 60,159,147, 49, 3,159, 0,159, 4,159, 8,
+ 48,128, 5,184, 97,128, 5,184, 99,128, 5,184, 50, 2,159, 18,
+ 159, 22, 55,128, 5,184, 57,128, 5,184,179, 51,128, 5,184,228,
+ 101,128, 5,184,232,229,226,242,229,119,128, 5,184,238,225,242,
+ 242,239,247,232,229,226,242,229,119,128, 5,184,113, 2,159, 66,
+ 159,132,225,244,225,110, 4,159, 79,159, 88,159,103,159,119,232,
+ 229,226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,
+ 226,242,229,119,128, 5,184,241,245,225,242,244,229,242,232,229,
+ 226,242,229,119,128, 5,184,247,233,228,229,232,229,226,242,229,
+ 119,128, 5,184,245,225,242,244,229,242,232,229,226,242,229,119,
+ 128, 5,184,247,233,228,229,232,229,226,242,229,119,128, 5,184,
+ 242,238,229,249,240,225,242,225,232,229,226,242,229,119,128, 5,
+ 159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,
+ 236,101,128, 36,224,232,239,239,107,128, 2,160,237,239,238,239,
+ 243,240,225,227,101,128,255, 81,239,102,130, 5,231,159,225,159,
+ 245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,
+ 229,119,128,251, 71,232,229,226,242,229,119,128, 5,231,240,225,
+ 242,229,110,128, 36,172,117, 4,160, 16,160, 28,160,117,160,204,
+ 225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,
+ 135, 5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,
+ 104,177, 56,128, 5,187,178, 53,128, 5,187,179, 49,128, 5,187,
+ 232,229,226,242,229,119,128, 5,187,238,225,242,242,239,247,232,
+ 229,226,242,229,119,128, 5,187,241,245,225,242,244,229,242,232,
+ 229,226,242,229,119,128, 5,187,247,233,228,229,232,229,226,242,
+ 229,119,128, 5,187,229,243,244,233,239,110,133, 0, 63,160,136,
+ 160,159,160,176,160,184,160,196,225,114, 2,160,143,160,150,225,
+ 226,233, 99,128, 6, 31,237,229,238,233,225,110,128, 5, 94,228,
+ 239,247,110,129, 0,191,160,168,243,237,225,236,108,128,247,191,
+ 231,242,229,229,107,128, 3,126,237,239,238,239,243,240,225,227,
+ 101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101, 4,
+ 160,216,161, 31,161, 51,161, 80,228,226,108,133, 0, 34,160,232,
+ 160,239,160,246,161, 2,161, 23,226,225,243,101,128, 32, 30,236,
+ 229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,
+ 255, 2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,
+ 242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,
+ 229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,
+ 128, 32, 27,114, 2,161, 57,161, 67,229,246,229,242,243,229,100,
+ 128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128, 1, 73,
+ 243,233,238,231,108, 2,161, 90,161, 97,226,225,243,101,128, 32,
+ 26,101,129, 0, 39,161,103,237,239,238,239,243,240,225,227,101,
+ 128,255, 7,114,145, 0,114,161,153,162,157,162,168,162,215,163,
+ 10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,
+ 35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,
+ 198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,
+ 151,225,242,237,229,238,233,225,110,128, 5,124,226,229,238,231,
+ 225,236,105,128, 9,176,227,245,244,101,128, 1, 85,100, 4,161,
+ 215,161,221,161,235,162, 5,229,246, 97,128, 9, 48,233,227,225,
+ 108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,
+ 243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,
+ 242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,
+ 129, 5,191,162, 21,232,229,226,242,229,119,128, 5,191,231,117,
+ 2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,
+ 245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,
+ 48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,
+ 225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,
+ 228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,
+ 9,241,109, 2,162,120,162,143,233,228,228,236,229,228,233,225,
+ 231,239,238,225,236,226,229,238,231,225,236,105,128, 9,240,243,
+ 232,239,242,110,128, 2,100,244,233,111,128, 34, 54,226,239,240,
+ 239,237,239,230,111,128, 49, 22, 99, 4,162,178,162,185,162,194,
+ 162,202,225,242,239,110,128, 1, 89,229,228,233,236,236, 97,128,
+ 1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 87,100, 2,162,221,162,231,226,236,231,
+ 242,225,246,101,128, 2, 17,239,116, 2,162,238,162,247,225,227,
+ 227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,
+ 1,237,225,227,242,239,110,128, 30, 93,101, 6,163, 24,163, 69,
+ 163,104,163,159,163,184,163,217,102, 2,163, 30,163, 43,229,242,
+ 229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,
+ 2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,
+ 229,116,128, 34,135,231,233,243,244,229,114, 2,163, 80,163, 85,
+ 229,100,128, 0,174,115, 2,163, 91,163, 97,225,238,115,128,248,
+ 232,229,242,233,102,128,246,218,104, 3,163,112,163,135,163,149,
+ 225,114, 2,163,119,163,126,225,226,233, 99,128, 6, 49,237,229,
+ 238,233,225,110,128, 5,128,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,
+ 225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,
+ 247,233,228,244,104,128,255,154,243,104,130, 5,232,163,193,163,
+ 208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,
+ 232,229,226,242,229,119,128, 5,232,118, 3,163,225,163,238,164,
+ 14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,
+ 2,163,245,163,254,232,229,226,242,229,119,128, 5,151,237,245,
+ 231,242,225,243,232,232,229,226,242,229,119,128, 5,151,236,239,
+ 231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,
+ 239,239,107,129, 2,126,164, 40,242,229,246,229,242,243,229,100,
+ 128, 2,127,104, 2,164, 57,164, 80, 97, 2,164, 63,164, 73,226,
+ 229,238,231,225,236,105,128, 9,221,228,229,246, 97,128, 9, 93,
+ 111,131, 3,193,164, 90,164,119,164,133,239,107,129, 2,125,164,
+ 97,244,245,242,238,229,100,129, 2,123,164,108,243,245,240,229,
+ 242,233,239,114,128, 2,181,243,249,237,226,239,236,231,242,229,
+ 229,107,128, 3,241,244,233,227,232,239,239,235,237,239,100,128,
+ 2,222,105, 6,164,160,165,204,165,250,166, 5,166, 30,166,166,
+ 229,245,108, 9,164,182,164,217,164,232,164,246,165, 36,165, 50,
+ 165,136,165,149,165,184, 97, 2,164,188,164,203,227,233,242,227,
+ 236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,
+ 235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,
+ 239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,
+ 229,225,110,128, 49, 64,107, 2,164,252,165, 28,233,249,229,239,
+ 107, 2,165, 6,165, 15,235,239,242,229,225,110,128, 49, 58,243,
+ 233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,
+ 110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,
+ 49, 59,112, 3,165, 58,165, 90,165,105, 97, 2,165, 64,165, 78,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,
+ 238,235,239,242,229,225,110,128, 50, 3,232,233,229,245,240,232,
+ 235,239,242,229,225,110,128, 49, 63,233,229,245,112, 2,165,114,
+ 165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,
+ 239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,
+ 225,110,128, 49, 61,116, 2,165,155,165,170,232,233,229,245,244,
+ 232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,
+ 239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116, 2,
+ 165,212,165,220,225,238,231,236,101,128, 34, 31,116, 2,165,226,
+ 165,240,225,227,235,226,229,236,239,247,227,237, 98,128, 3, 25,
+ 242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,
+ 238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,
+ 166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110, 2,
+ 166, 36,166,152,103,131, 2,218,166, 46,166, 57,166, 63,226,229,
+ 236,239,247,227,237, 98,128, 3, 37,227,237, 98,128, 3, 10,232,
+ 225,236,102, 2,166, 72,166,118,236,229,230,116,131, 2,191,166,
+ 85,166, 96,166,107,225,242,237,229,238,233,225,110,128, 5, 89,
+ 226,229,236,239,247,227,237, 98,128, 3, 28,227,229,238,244,229,
+ 242,229,100,128, 2,211,242,233,231,232,116,130, 2,190,166,130,
+ 166,141,226,229,236,239,247,227,237, 98,128, 3, 57,227,229,238,
+ 244,229,242,229,100,128, 2,210,246,229,242,244,229,228,226,242,
+ 229,246,101,128, 2, 19,244,244,239,242,245,243,241,245,225,242,
+ 101,128, 51, 81,108, 2,166,186,166,197,233,238,229,226,229,236,
+ 239,119,128, 30, 95,239,238,231,236,229,103,129, 2,124,166,208,
+ 244,245,242,238,229,100,128, 2,122,237,239,238,239,243,240,225,
+ 227,101,128,255, 82,111, 3,166,237,166,248,167, 17,232,233,242,
+ 225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,
+ 129, 48,237,167, 5,232,225,236,230,247,233,228,244,104,128,255,
+ 155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,
+ 128, 36,173,114, 3,167, 43,167, 79,167,109, 97, 3,167, 51,167,
+ 61,167, 68,226,229,238,231,225,236,105,128, 9,220,228,229,246,
+ 97,128, 9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,
+ 104, 2,167, 86,167, 95,225,242,225,226,233, 99,128, 6,145,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,
+ 225,236,233, 99, 4,167,125,167,135,167,142,167,153,226,229,238,
+ 231,225,236,105,128, 9,224,228,229,246, 97,128, 9, 96,231,245,
+ 234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,
+ 231,110, 3,167,169,167,179,167,186,226,229,238,231,225,236,105,
+ 128, 9,196,228,229,246, 97,128, 9, 68,231,245,234,225,242,225,
+ 244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,
+ 116, 2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,
+ 238,229,100,129, 2,121,167,232,243,245,240,229,242,233,239,114,
+ 128, 2,180,117, 4,167,253,168, 8,168, 33,168, 80,232,233,242,
+ 225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,
+ 129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,
+ 153,112, 2,168, 39,168, 74,229,101, 2,168, 46,168, 60,237,225,
+ 242,235,226,229,238,231,225,236,105,128, 9,242,243,233,231,238,
+ 226,229,238,231,225,236,105,128, 9,243,233,225,104,128,246,221,
+ 244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99, 4,168,
+ 103,168,113,168,120,168,131,226,229,238,231,225,236,105,128, 9,
+ 139,228,229,246, 97,128, 9, 11,231,245,234,225,242,225,244,105,
+ 128, 10,139,246,239,247,229,236,243,233,231,110, 3,168,147,168,
+ 157,168,164,226,229,238,231,225,236,105,128, 9,195,228,229,246,
+ 97,128, 9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,
+ 147, 0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,
+ 60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,
+ 203,182,133,182,206,183,120,183,130, 97, 9,168,237,168,247,169,
+ 12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,
+ 231,225,236,105,128, 9,184,227,245,244,101,129, 1, 91,169, 0,
+ 228,239,244,225,227,227,229,238,116,128, 30,101,100, 5,169, 24,
+ 169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128, 6,
+ 53,229,246, 97,128, 9, 56,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,
+ 99,128,254,188,231,117, 2,169, 91,169,100,234,225,242,225,244,
+ 105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,
+ 225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,
+ 129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,
+ 123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,
+ 247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,
+ 250,237,229,235,104,130, 5,225,169,188,169,208,228,225,231,229,
+ 243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,
+ 232,229,226,242,229,119,128, 5,225,242, 97, 5,169,230,170, 48,
+ 170, 56,170,106,170,114, 97, 5,169,242,169,250,170, 2,170, 33,
+ 170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,
+ 14, 65,233,237,225,233,109, 2,170, 12,170, 23,225,236,225,233,
+ 244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,
+ 67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,
+ 229,244,232,225,105,128, 14, 64,105, 3,170, 64,170, 88,170, 99,
+ 105, 2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,
+ 134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,
+ 128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,
+ 14, 66,117, 3,170,122,170,172,170,179,101, 3,170,130,170,154,
+ 170,165,101, 2,170,136,170,147,236,229,230,244,244,232,225,105,
+ 128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,
+ 225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,
+ 128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,
+ 239,230,111,128, 49, 25, 99, 5,170,210,170,231,170,240,171, 33,
+ 171, 55,225,242,239,110,129, 1, 97,170,219,228,239,244,225,227,
+ 227,229,238,116,128, 30,103,229,228,233,236,236, 97,128, 1, 95,
+ 232,247, 97,131, 2, 89,170,252,171, 7,171, 26,227,249,242,233,
+ 236,236,233, 99,128, 4,217,228,233,229,242,229,243,233,243,227,
+ 249,242,233,236,236,233, 99,128, 4,219,232,239,239,107,128, 2,
+ 90,233,242, 99, 2,171, 41,171, 46,236,101,128, 36,226,245,237,
+ 230,236,229,120,128, 1, 93,239,237,237,225,225,227,227,229,238,
+ 116,128, 2, 25,228,239,116, 2,171, 76,171, 85,225,227,227,229,
+ 238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,
+ 239,244,225,227,227,229,238,116,128, 30,105,101, 9,171,127,171,
+ 143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,
+ 231,245,236,236,226,229,236,239,247,227,237, 98,128, 3, 60, 99,
+ 2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,
+ 229,227,232,233,238,229,243,101,128, 2,202,244,233,239,110,128,
+ 0,167,229,110, 4,171,189,171,198,171,212,171,228,225,242,225,
+ 226,233, 99,128, 6, 51,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,
+ 128,254,180,231,239,108,135, 5,182,172, 7,172, 21,172, 26,172,
+ 35,172, 50,172, 66,172, 77, 49, 2,172, 13,172, 17, 51,128, 5,
+ 182,102,128, 5,182,178, 99,128, 5,182,232,229,226,242,229,119,
+ 128, 5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,
+ 5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+ 5,182,244,225,232,229,226,242,229,119,128, 5,146,247,233,228,
+ 229,232,229,226,242,229,119,128, 5,182,104, 2,172, 96,172,107,
+ 225,242,237,229,238,233,225,110,128, 5,125,233,242,225,231,225,
+ 238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,
+ 172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,
+ 2,172,149,172,192,227,239,236,239,110,131, 0, 59,172,163,172,
+ 172,172,184,225,242,225,226,233, 99,128, 6, 27,237,239,238,239,
+ 243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,
+ 246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,
+ 156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,
+ 116, 2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,
+ 239,243,241,245,225,242,101,128, 51, 35,246,229,110,142, 0, 55,
+ 173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,
+ 173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,
+ 233, 99,128, 6,103,226,229,238,231,225,236,105,128, 9,237,227,
+ 233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,
+ 229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,
+ 97,128, 9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,
+ 2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,
+ 245,235,232,105,128, 10,109,232, 97, 2,173,126,173,137,227,235,
+ 225,242,225,226,233, 99,128, 6,103,238,231,250,232,239,117,128,
+ 48, 39,105, 2,173,152,173,170,228,229,239,231,242,225,240,232,
+ 233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,
+ 114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,
+ 239,236,228,243,244,249,236,101,128,247, 55,112, 2,173,209,173,
+ 216,225,242,229,110,128, 36,122,229,114, 2,173,223,173,229,233,
+ 239,100,128, 36,142,243,233,225,110,128, 6,247,242,239,237,225,
+ 110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,
+ 2,174, 5,174, 43,229,229,110, 2,174, 13,174, 22,227,233,242,
+ 227,236,101,128, 36,112,112, 2,174, 28,174, 35,225,242,229,110,
+ 128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,
+ 87,230,244,232,249,240,232,229,110,128, 0,173,104, 7,174, 76,
+ 175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97, 6,174, 90,
+ 174,101,174,111,174,122,175, 9,175, 34,225,242,237,229,238,233,
+ 225,110,128, 5,119,226,229,238,231,225,236,105,128, 9,182,227,
+ 249,242,233,236,236,233, 99,128, 4, 72,100, 2,174,128,174,224,
+ 228, 97, 4,174,139,174,148,174,179,174,193,225,242,225,226,233,
+ 99,128, 6, 81,228,225,237,237, 97, 2,174,158,174,167,225,242,
+ 225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,
+ 128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,
+ 96,235,225,243,242, 97, 2,174,203,174,212,225,242,225,226,233,
+ 99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,
+ 101,132, 37,146,174,236,174,243,174,251,175, 4,228,225,242,107,
+ 128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,
+ 109,128, 37,146,246, 97,128, 9, 54,231,117, 2,175, 16,175, 25,
+ 234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,
+ 10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,
+ 5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,
+ 227,249,242,233,236,236,233, 99,128, 4, 73,101, 4,175, 85,175,
+ 150,175,160,175,177,229,110, 4,175, 96,175,105,175,119,175,135,
+ 225,242,225,226,233, 99,128, 6, 52,230,233,238,225,236,225,242,
+ 225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,
+ 225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,
+ 226,233, 99,128,254,184,233,227,239,240,244,233, 99,128, 3,227,
+ 241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,
+ 170,246, 97,134, 5,176,175,194,175,209,175,223,175,232,175,247,
+ 176, 7, 49, 2,175,200,175,205,177, 53,128, 5,176, 53,128, 5,
+ 176, 50, 2,175,215,175,219, 50,128, 5,176,101,128, 5,176,232,
+ 229,226,242,229,119,128, 5,176,238,225,242,242,239,247,232,229,
+ 226,242,229,119,128, 5,176,241,245,225,242,244,229,242,232,229,
+ 226,242,229,119,128, 5,176,247,233,228,229,232,229,226,242,229,
+ 119,128, 5,176,232,225,227,249,242,233,236,236,233, 99,128, 4,
+ 187,105, 2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,
+ 3,237,110,131, 5,233,176, 60,176,143,176,152,100, 2,176, 66,
+ 176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,
+ 226,242,229,119,128,251, 73,115, 2,176, 93,176,113,232,233,238,
+ 228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,
+ 44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,
+ 119,128,251, 45,239,244,232,229,226,242,229,119,128, 5,193,232,
+ 229,226,242,229,119,128, 5,233,115, 2,176,158,176,178,232,233,
+ 238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,
+ 251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,
+ 229,119,128,251, 43,239,239,107,128, 2,130,105, 8,176,221,177,
+ 9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,
+ 131, 3,195,176,233,176,237,176,245, 49,128, 3,194,230,233,238,
+ 225,108,128, 3,194,236,245,238,225,244,229,243,249,237,226,239,
+ 236,231,242,229,229,107,128, 3,242,232,233,242,225,231,225,238,
+ 97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,
+ 33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,
+ 2,177, 53,177, 62,232,229,226,242,229,119,128, 5,189,236,229,
+ 230,244,232,229,226,242,229,119,128, 5,189,237,233,236,225,114,
+ 128, 34, 60,238,228,239,244,232,229,226,242,229,119,128, 5,194,
+ 239,115, 6,177,111,177,146,177,178,177,206,177,220,177,252, 97,
+ 2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,
+ 110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,
+ 50, 20,227,105, 2,177,153,177,165,229,245,227,235,239,242,229,
+ 225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,
+ 50,102,107, 2,177,184,177,198,233,249,229,239,235,235,239,242,
+ 229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,
+ 229,245,238,235,239,242,229,225,110,128, 49,123,112, 2,177,226,
+ 177,239,225,242,229,238,235,239,242,229,225,110,128, 50, 6,233,
+ 229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,
+ 245,244,235,239,242,229,225,110,128, 49,124,120,141, 0, 54,178,
+ 41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,
+ 195,178,206,178,239,178,247,179, 2,225,242,225,226,233, 99,128,
+ 6,102,226,229,238,231,225,236,105,128, 9,236,227,233,242,227,
+ 236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,
+ 238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128, 9,
+ 108,231,117, 2,178,104,178,113,234,225,242,225,244,105,128, 10,
+ 236,242,237,245,235,232,105,128, 10,108,232, 97, 2,178,129,178,
+ 140,227,235,225,242,225,226,233, 99,128, 6,102,238,231,250,232,
+ 239,117,128, 48, 38,105, 2,178,155,178,173,228,229,239,231,242,
+ 225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,
+ 242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,
+ 128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112, 2,
+ 178,212,178,219,225,242,229,110,128, 36,121,229,114, 2,178,226,
+ 178,232,233,239,100,128, 36,141,243,233,225,110,128, 6,246,242,
+ 239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,
+ 32,118,116, 2,179, 8,179, 79,229,229,110, 2,179, 16,179, 58,
+ 99, 2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,
+ 242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,
+ 226,229,238,231,225,236,105,128, 9,249,112, 2,179, 64,179, 71,
+ 225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,
+ 225,105,128, 14, 86,108, 2,179, 91,179,111,225,243,104,129, 0,
+ 47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,
+ 238,103,129, 1,127,179,119,228,239,244,225,227,227,229,238,116,
+ 128, 30,155,109, 2,179,137,179,147,233,236,229,230,225,227,101,
+ 128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111, 6,
+ 179,172,179,222,179,233,180, 2,180, 47,180, 58,102, 2,179,178,
+ 179,192,240,225,243,245,241,232,229,226,242,229,119,128, 5,195,
+ 116, 2,179,198,179,207,232,249,240,232,229,110,128, 0,173,243,
+ 233,231,238,227,249,242,233,236,236,233, 99,128, 4, 76,232,233,
+ 242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,
+ 97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,
+ 255,127,236,233,228,245,115, 2,180, 12,180, 29,236,239,238,231,
+ 239,246,229,242,236,225,249,227,237, 98,128, 3, 56,243,232,239,
+ 242,244,239,246,229,242,236,225,249,227,237, 98,128, 3, 55,242,
+ 245,243,233,244,232,225,105,128, 14, 41,115, 3,180, 66,180, 76,
+ 180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,
+ 105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97, 3,
+ 180,102,180,122,180,154,227,101,129, 0, 32,180,109,232,225,227,
+ 235,225,242,225,226,233, 99,128, 0, 32,228,101,129, 38, 96,180,
+ 129,243,245,233,116, 2,180,138,180,146,226,236,225,227,107,128,
+ 38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,
+ 241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,
+ 181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,
+ 247,227,237, 98,128, 3, 59, 99, 2,180,205,180,209, 99,128, 51,
+ 196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,
+ 243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,
+ 242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,
+ 2,181, 5,181, 9,103,128, 51,143,109,129, 51,158,181, 15,227,
+ 225,240,233,244,225,108,128, 51,206,108, 2,181, 31,181, 35,110,
+ 128, 51,209,239,103,128, 51,210,109, 4,181, 50,181, 54,181, 59,
+ 181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,
+ 241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,
+ 238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,
+ 108,128, 37,166,245,240,240,229,114, 2,181,110,181,133,236,229,
+ 230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,
+ 236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,
+ 242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,
+ 233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,
+ 247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,
+ 163,242,243,241,245,225,242,101,128, 51,219,115, 2,181,209,182,
+ 123, 97, 4,181,219,181,229,181,236,181,247,226,229,238,231,225,
+ 236,105,128, 9,183,228,229,246, 97,128, 9, 55,231,245,234,225,
+ 242,225,244,105,128, 10,183,238,103, 8,182, 10,182, 24,182, 38,
+ 182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,
+ 239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,
+ 229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,
+ 110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,
+ 128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,
+ 101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,
+ 233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,
+ 245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,
+ 239,114,128,246,242,116, 2,182,139,182,162,229,242,236,233,238,
+ 103,129, 0,163,182,150,237,239,238,239,243,240,225,227,101,128,
+ 255,225,242,239,235,101, 2,182,171,182,188,236,239,238,231,239,
+ 246,229,242,236,225,249,227,237, 98,128, 3, 54,243,232,239,242,
+ 244,239,246,229,242,236,225,249,227,237, 98,128, 3, 53,117, 7,
+ 182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,
+ 229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,
+ 108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99, 2,
+ 183, 4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,
+ 116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,
+ 2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,
+ 49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,
+ 242,225,226,233, 99,128, 6, 82,237,237,225,244,233,239,110,128,
+ 34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,
+ 99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,
+ 229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,
+ 51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,
+ 128, 51,124,116,144, 0,116,183,183,184,192,184,213,185,100,185,
+ 140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,
+ 57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,
+ 243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,
+ 231,225,236,105,128, 9,164,227,107, 2,183,222,183,229,228,239,
+ 247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,
+ 128, 9, 36,231,117, 2,183,250,184, 3,234,225,242,225,244,105,
+ 128, 10,164,242,237,245,235,232,105,128, 10, 36,104, 4,184, 22,
+ 184, 31,184, 45,184, 75,225,242,225,226,233, 99,128, 6, 55,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,194,105, 2,184,
+ 51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,
+ 242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,
+ 225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,
+ 104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,
+ 6, 64,117,128, 3,196,118,130, 5,234,184,158,184,183,228,225,
+ 231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,
+ 226,242,229,119,128,251, 74,232,229,226,242,229,119,128, 5,234,
+ 98, 2,184,198,184,203,225,114,128, 1,103,239,240,239,237,239,
+ 230,111,128, 49, 10, 99, 6,184,227,184,234,184,241,184,250,185,
+ 60,185, 87,225,242,239,110,128, 1,101,227,245,242,108,128, 2,
+ 168,229,228,233,236,236, 97,128, 1, 99,232,229,104, 4,185, 6,
+ 185, 15,185, 29,185, 45,225,242,225,226,233, 99,128, 6,134,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,
+ 233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99, 2,
+ 185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 99,100, 2,185,106,185,116,233,229,242,229,243,233,
+ 115,128, 30,151,239,116, 2,185,123,185,132,225,227,227,229,238,
+ 116,128, 30,107,226,229,236,239,119,128, 30,109,101, 9,185,160,
+ 185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,
+ 227,249,242,233,236,236,233, 99,128, 4, 66,228,229,243,227,229,
+ 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,173,104,
+ 7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,
+ 242,225,226,233, 99,128, 6, 42,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,254,150,232,225,232,105, 2,185,239,185,254,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,
+ 236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105, 2,
+ 186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,
+ 128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,
+ 105, 2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,
+ 233, 99,128,252, 11,109, 2,186, 91,186,125,225,242,226,245,244,
+ 97, 2,186,102,186,111,225,242,225,226,233, 99,128, 6, 41,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,148,101, 2,186,
+ 131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,
+ 229,237,105, 2,186,152,186,167,238,233,244,233,225,236,225,242,
+ 225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,
+ 225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,
+ 97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,
+ 255,131,108, 2,186,232,186,251,229,240,232,239,238,101,129, 33,
+ 33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97, 2,
+ 187, 4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,
+ 128, 5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,
+ 5,169,110, 4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,
+ 236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,
+ 240,225,242,229,110,128, 50, 41,112, 2,187, 78,187, 85,225,242,
+ 229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,
+ 225,110,128, 33,121,243,104,128, 2,167,116,131, 5,216,187,116,
+ 187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,
+ 229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128, 5,
+ 216,243,229,227,249,242,233,236,236,233, 99,128, 4,181,246,233,
+ 114, 2,187,166,187,175,232,229,226,242,229,119,128, 5,155,236,
+ 229,230,244,232,229,226,242,229,119,128, 5,155,104, 6,187,202,
+ 188, 98,188,220,189, 96,190, 3,191, 60, 97, 5,187,214,187,224,
+ 187,231,188, 0,188, 29,226,229,238,231,225,236,105,128, 9,165,
+ 228,229,246, 97,128, 9, 37,231,117, 2,187,238,187,247,234,225,
+ 242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,
+ 108, 2,188, 6,188, 15,225,242,225,226,233, 99,128, 6, 48,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,
+ 225,235,232,225,116, 3,188, 44,188, 75,188, 82,236,239,119, 2,
+ 188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,
+ 233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,
+ 14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,
+ 248,150,101, 3,188,106,188,170,188,193,104, 4,188,116,188,125,
+ 188,139,188,155,225,242,225,226,233, 99,128, 6, 43,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,254,156,242,101, 2,188,177,188,
+ 186,229,248,233,243,244,115,128, 34, 3,230,239,242,101,128, 34,
+ 52,244, 97,130, 3,184,188,202,188,206, 49,128, 3,209,243,249,
+ 237,226,239,236,231,242,229,229,107,128, 3,209,105, 2,188,226,
+ 189, 56,229,245,244,104, 4,188,239,189, 18,189, 33,189, 42, 97,
+ 2,188,245,189, 4,227,233,242,227,236,229,235,239,242,229,225,
+ 110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,
+ 50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,
+ 107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,
+ 239,242,229,225,110,128, 50, 11,242,244,229,229,110, 2,189, 66,
+ 189, 75,227,233,242,227,236,101,128, 36,108,112, 2,189, 81,189,
+ 88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,
+ 111, 6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,
+ 238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,
+ 107,128, 1,173,240,232,245,244,232,225,239,244,232,225,105,128,
+ 14, 18,242,110,128, 0,254,244,104, 3,189,160,189,184,189,194,
+ 97, 2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,
+ 238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,
+ 14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,
+ 100, 2,189,214,189,225,227,249,242,233,236,236,233, 99,128, 4,
+ 130,243,243,229,240,225,242,225,244,239,114, 2,189,240,189,249,
+ 225,242,225,226,233, 99,128, 6,108,240,229,242,243,233,225,110,
+ 128, 6,108,242,229,101,144, 0, 51,190, 41,190, 50,190, 60,190,
+ 90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,
+ 235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,
+ 6, 99,226,229,238,231,225,236,105,128, 9,233,227,233,242,227,
+ 236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,
+ 238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128, 9,
+ 105,229,233,231,232,244,232,115,128, 33, 92,231,117, 2,190,114,
+ 190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,
+ 105,128, 10,105,232, 97, 2,190,139,190,150,227,235,225,242,225,
+ 226,233, 99,128, 6, 99,238,231,250,232,239,117,128, 48, 35,105,
+ 2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,
+ 225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,
+ 131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,
+ 229,242,225,244,239,242,226,229,238,231,225,236,105,128, 9,246,
+ 239,236,228,243,244,249,236,101,128,247, 51,112, 2,190,241,190,
+ 248,225,242,229,110,128, 36,118,229,114, 2,190,255,191, 5,233,
+ 239,100,128, 36,138,243,233,225,110,128, 6,243,241,245,225,242,
+ 244,229,242,115,129, 0,190,191, 25,229,237,228,225,243,104,128,
+ 246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,
+ 239,114,128, 0,179,244,232,225,105,128, 14, 83,250,243,241,245,
+ 225,242,101,128, 51,148,105, 7,191, 86,191, 97,191,212,192, 54,
+ 192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,
+ 97,107, 2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,
+ 193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,
+ 245,116, 4,191,139,191,174,191,189,191,198, 97, 2,191,145,191,
+ 160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,
+ 229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 2,236,228,101,133, 2,220,191,228,191,239,192, 0,
+ 192, 12,192, 40,226,229,236,239,247,227,237, 98,128, 3, 48, 99,
+ 2,191,245,191,250,237, 98,128, 3, 3,239,237, 98,128, 3, 3,
+ 228,239,245,226,236,229,227,237, 98,128, 3, 96,111, 2,192, 18,
+ 192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,
+ 225,249,227,237, 98,128, 3, 52,246,229,242,244,233,227,225,236,
+ 227,237, 98,128, 3, 62,237,229,243,227,233,242,227,236,101,128,
+ 34,151,112, 2,192, 72,192,102,229,232, 97, 2,192, 80,192, 89,
+ 232,229,226,242,229,119,128, 5,150,236,229,230,244,232,229,226,
+ 242,229,119,128, 5,150,240,233,231,245,242,237,245,235,232,105,
+ 128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,
+ 98,128, 4,131,247,238,225,242,237,229,238,233,225,110,128, 5,
+ 127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,
+ 239,243,240,225,227,101,128,255, 84,111, 7,192,185,192,196,192,
+ 207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,
+ 110,128, 5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,
+ 225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,
+ 247,233,228,244,104,128,255,132,110, 3,192,240,193, 82,193, 87,
+ 101, 4,192,250,193, 63,193, 70,193, 76,226,225,114, 4,193, 6,
+ 193, 35,193, 45,193, 54,229,248,244,242, 97, 2,193, 16,193, 26,
+ 232,233,231,232,237,239,100,128, 2,229,236,239,247,237,239,100,
+ 128, 2,233,232,233,231,232,237,239,100,128, 2,230,236,239,247,
+ 237,239,100,128, 2,232,237,233,228,237,239,100,128, 2,231,230,
+ 233,246,101,128, 1,189,243,233,120,128, 1,133,244,247,111,128,
+ 1,168,239,115,128, 3,132,243,241,245,225,242,101,128, 51, 39,
+ 240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,
+ 243,229,243,232,229,236,236,226,242,225,227,235,229,116, 2,193,
+ 131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,
+ 225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,
+ 57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,
+ 236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,
+ 244,225,239,244,232,225,105,128, 14, 21,240, 97, 2,193,209,193,
+ 221,236,225,244,225,236,232,239,239,107,128, 1,171,242,229,110,
+ 128, 36,175,114, 3,193,235,194, 10,194, 25,225,228,229,237,225,
+ 242,107,129, 33, 34,193,247,115, 2,193,253,194, 3,225,238,115,
+ 128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,
+ 229,248,232,239,239,107,128, 2,136,233,225,103, 4,194, 37,194,
+ 42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,
+ 116,128, 37,186,245,112,128, 37,178,115,132, 2,166,194, 69,194,
+ 108,194,214,194,227,225,228,105,130, 5,230,194, 79,194, 99,228,
+ 225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,
+ 128,251, 70,232,229,226,242,229,119,128, 5,230,101, 2,194,114,
+ 194,125,227,249,242,233,236,236,233, 99,128, 4, 70,242,101,134,
+ 5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49, 2,
+ 194,148,194,152, 50,128, 5,181,101,128, 5,181,178, 98,128, 5,
+ 181,232,229,226,242,229,119,128, 5,181,238,225,242,242,239,247,
+ 232,229,226,242,229,119,128, 5,181,241,245,225,242,244,229,242,
+ 232,229,226,242,229,119,128, 5,181,247,233,228,229,232,229,226,
+ 242,229,119,128, 5,181,232,229,227,249,242,233,236,236,233, 99,
+ 128, 4, 91,245,240,229,242,233,239,114,128,246,243,116, 4,194,
+ 247,195, 41,195,106,195,157, 97, 3,194,255,195, 9,195, 16,226,
+ 229,238,231,225,236,105,128, 9,159,228,229,246, 97,128, 9, 31,
+ 231,117, 2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,
+ 242,237,245,235,232,105,128, 10, 31,229,104, 4,195, 52,195, 61,
+ 195, 75,195, 91,225,242,225,226,233, 99,128, 6,121,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,251,105,232, 97, 3,195,115,195,
+ 125,195,132,226,229,238,231,225,236,105,128, 9,160,228,229,246,
+ 97,128, 9, 32,231,117, 2,195,139,195,148,234,225,242,225,244,
+ 105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,
+ 229,100,128, 2,135,117, 3,195,173,195,184,195,209,232,233,242,
+ 225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,
+ 129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,
+ 130,243,237,225,236,108, 2,195,219,195,230,232,233,242,225,231,
+ 225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,
+ 195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,
+ 2,196, 5,196,110,101, 2,196, 11,196, 59,236,246,101, 3,196,
+ 21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112, 2,
+ 196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,
+ 128, 36,147,242,239,237,225,110,128, 33,123,238,244,121, 3,196,
+ 69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,
+ 238,231,250,232,239,117,128, 83, 68,112, 2,196, 95,196,102,225,
+ 242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,
+ 0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,
+ 197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,
+ 225,226,233, 99,128, 6, 98,226,229,238,231,225,236,105,128, 9,
+ 232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,
+ 242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,
+ 2,196,197,196,203,229,246, 97,128, 9,104,239,116, 2,196,210,
+ 196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,
+ 228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,
+ 128,254, 48,231,117, 2,196,250,197, 3,234,225,242,225,244,105,
+ 128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97, 2,197,
+ 19,197, 30,227,235,225,242,225,226,233, 99,128, 6, 98,238,231,
+ 250,232,239,117,128, 48, 34,105, 2,197, 45,197, 63,228,229,239,
+ 231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,
+ 230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,
+ 227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,
+ 238,231,225,236,105,128, 9,245,239,236,228,243,244,249,236,101,
+ 128,247, 50,112, 2,197,121,197,128,225,242,229,110,128, 36,117,
+ 229,114, 2,197,135,197,141,233,239,100,128, 36,137,243,233,225,
+ 110,128, 6,242,242,239,237,225,110,128, 33,113,115, 2,197,162,
+ 197,170,244,242,239,235,101,128, 1,187,245,240,229,242,233,239,
+ 114,128, 0,178,244,104, 2,197,187,197,192,225,105,128, 14, 82,
+ 233,242,228,115,128, 33, 84,117,145, 0,117,197,237,197,245,198,
+ 30,198, 87,198,225,199, 6,199,129,199,145,199,196,200, 10,200,
+ 91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,
+ 244,101,128, 0,250, 98, 4,197,255,198, 4,198, 13,198, 23,225,
+ 114,128, 2,137,229,238,231,225,236,105,128, 9,137,239,240,239,
+ 237,239,230,111,128, 49, 40,242,229,246,101,128, 1,109, 99, 3,
+ 198, 38,198, 45,198, 77,225,242,239,110,128, 1,212,233,242, 99,
+ 2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,
+ 129, 0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,
+ 236,236,233, 99,128, 4, 67,100, 5,198, 99,198,110,198,133,198,
+ 139,198,215,225,244,244,225,228,229,246, 97,128, 9, 81,226,108,
+ 2,198,117,198,125,225,227,245,244,101,128, 1,113,231,242,225,
+ 246,101,128, 2, 21,229,246, 97,128, 9, 9,233,229,242,229,243,
+ 233,115,133, 0,252,198,159,198,167,198,175,198,198,198,206,225,
+ 227,245,244,101,128, 1,216,226,229,236,239,119,128, 30,115, 99,
+ 2,198,181,198,188,225,242,239,110,128, 1,218,249,242,233,236,
+ 236,233, 99,128, 4,241,231,242,225,246,101,128, 1,220,237,225,
+ 227,242,239,110,128, 1,214,239,244,226,229,236,239,119,128, 30,
+ 229,103, 2,198,231,198,238,242,225,246,101,128, 0,249,117, 2,
+ 198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,
+ 235,232,105,128, 10, 9,104, 3,199, 14,199, 24,199,102,233,242,
+ 225,231,225,238, 97,128, 48, 70,111, 2,199, 30,199, 40,239,235,
+ 225,226,239,246,101,128, 30,231,242,110,133, 1,176,199, 55,199,
+ 63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,
+ 239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,
+ 30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,
+ 236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,
+ 116,129, 1,113,199,118,227,249,242,233,236,236,233, 99,128, 4,
+ 243,233,238,246,229,242,244,229,228,226,242,229,246,101,128, 2,
+ 23,107, 3,199,153,199,177,199,188,225,244,225,235,225,238, 97,
+ 129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,
+ 115,227,249,242,233,236,236,233, 99,128, 4,121,239,242,229,225,
+ 110,128, 49, 92,109, 2,199,202,199,255, 97, 2,199,208,199,241,
+ 227,242,239,110,130, 1,107,199,219,199,230,227,249,242,233,236,
+ 236,233, 99,128, 4,239,228,233,229,242,229,243,233,115,128, 30,
+ 123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,
+ 238,239,243,240,225,227,101,128,255, 85,110, 2,200, 16,200, 71,
+ 228,229,242,243,227,239,242,101,132, 0, 95,200, 35,200, 41,200,
+ 53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,
+ 227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,
+ 247,225,246,121,128,254, 79,105, 2,200, 77,200, 82,239,110,128,
+ 34, 42,246,229,242,243,225,108,128, 34, 0,239,231,239,238,229,
+ 107,128, 1,115,112, 5,200,112,200,119,200,127,200,142,200,193,
+ 225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,
+ 229,242,228,239,244,232,229,226,242,229,119,128, 5,196,243,233,
+ 236,239,110,131, 3,197,200,156,200,177,200,185,228,233,229,242,
+ 229,243,233,115,129, 3,203,200,169,244,239,238,239,115,128, 3,
+ 176,236,225,244,233,110,128, 2,138,244,239,238,239,115,128, 3,
+ 205,244,225,227,107, 2,200,202,200,213,226,229,236,239,247,227,
+ 237, 98,128, 3, 29,237,239,100,128, 2,212,114, 2,200,225,200,
+ 237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,
+ 128, 1,111,115, 3,200,251,201, 10,201, 55,232,239,242,244,227,
+ 249,242,233,236,236,233, 99,128, 4, 94,237,225,236,108, 2,201,
+ 19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,
+ 244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,
+ 233,228,244,104,128,255,105,244,242,225,233,231,232,116, 2,201,
+ 67,201, 78,227,249,242,233,236,236,233, 99,128, 4,175,243,244,
+ 242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,177,244,
+ 233,236,228,101,130, 1,105,201,107,201,115,225,227,245,244,101,
+ 128, 30,121,226,229,236,239,119,128, 30,117,117, 5,201,135,201,
+ 145,201,152,201,177,201,193,226,229,238,231,225,236,105,128, 9,
+ 138,228,229,246, 97,128, 9, 10,231,117, 2,201,159,201,168,234,
+ 225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,
+ 10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,
+ 66,246,239,247,229,236,243,233,231,110, 3,201,209,201,219,201,
+ 226,226,229,238,231,225,236,105,128, 9,194,228,229,246, 97,128,
+ 9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,
+ 229,236,243,233,231,110, 3,201,253,202, 7,202, 14,226,229,238,
+ 231,225,236,105,128, 9,193,228,229,246, 97,128, 9, 65,231,245,
+ 234,225,242,225,244,105,128, 10,193,118,139, 0,118,202, 51,202,
+ 199,202,208,202,219,203,148,203,155,203,253,204, 9,204,109,204,
+ 117,204,138, 97, 4,202, 61,202, 68,202, 93,202,104,228,229,246,
+ 97,128, 9, 53,231,117, 2,202, 75,202, 84,234,225,242,225,244,
+ 105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,
+ 225,235,225,238, 97,128, 48,247,118,132, 5,213,202,116,202,143,
+ 202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,
+ 134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,
+ 2,202,149,202,157,229,226,242,229,119,128, 5,213,239,236,225,
+ 109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,
+ 225,246,232,229,226,242,229,119,128, 5,240,249,239,228,232,229,
+ 226,242,229,119,128, 5,241,227,233,242,227,236,101,128, 36,229,
+ 228,239,244,226,229,236,239,119,128, 30,127,101, 6,202,233,202,
+ 244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,
+ 99,128, 4, 50,104, 4,202,254,203, 7,203, 21,203, 37,225,242,
+ 225,226,233, 99,128, 6,164,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,
+ 99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,
+ 245,115,128, 38, 64,242,244,233,227,225,108, 2,203, 80,203, 86,
+ 226,225,114,128, 0,124,236,233,238,101, 4,203, 99,203,110,203,
+ 121,203,130,225,226,239,246,229,227,237, 98,128, 3, 13,226,229,
+ 236,239,247,227,237, 98,128, 3, 41,236,239,247,237,239,100,128,
+ 2,204,237,239,100,128, 2,200,247,225,242,237,229,238,233,225,
+ 110,128, 5,126,232,239,239,107,128, 2,139,105, 3,203,163,203,
+ 174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,
+ 237, 97, 3,203,185,203,195,203,202,226,229,238,231,225,236,105,
+ 128, 9,205,228,229,246, 97,128, 9, 77,231,245,234,225,242,225,
+ 244,105,128, 10,205,243,225,242,231, 97, 3,203,225,203,235,203,
+ 242,226,229,238,231,225,236,105,128, 9,131,228,229,246, 97,128,
+ 9, 3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,
+ 239,243,240,225,227,101,128,255, 86,111, 3,204, 17,204, 28,204,
+ 98,225,242,237,229,238,233,225,110,128, 5,120,233,227,229,100,
+ 2,204, 37,204, 73,233,244,229,242,225,244,233,239,110, 2,204,
+ 51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,
+ 244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,
+ 97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,
+ 255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,
+ 229,110,128, 36,177,116, 2,204,123,204,130,233,236,228,101,128,
+ 30,125,245,242,238,229,100,128, 2,140,117, 2,204,144,204,155,
+ 232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,
+ 225,238, 97,128, 48,244,119,143, 0,119,204,200,205,177,205,187,
+ 205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,
+ 208,176,208,183,208,194,208,203, 97, 8,204,218,204,225,204,235,
+ 204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,
+ 131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,
+ 225,238, 97,128, 48,143,107, 2,204,252,205, 20,225,244,225,235,
+ 225,238, 97,129, 48,239,205, 8,232,225,236,230,247,233,228,244,
+ 104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,
+ 108, 2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,
+ 142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,
+ 241,245,225,242,101,128, 51, 87,118, 2,205, 78,205, 86,229,228,
+ 225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,
+ 229,246,229,242,244,233,227,225,108,128,254, 52,119, 3,205,116,
+ 205,125,205,139,225,242,225,226,233, 99,128, 6, 72,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,
+ 225,226,239,246,101, 2,205,154,205,163,225,242,225,226,233, 99,
+ 128, 6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99, 2,
+ 205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,
+ 1,117,100, 2,205,216,205,226,233,229,242,229,243,233,115,128,
+ 30,133,239,116, 2,205,233,205,242,225,227,227,229,238,116,128,
+ 30,135,226,229,236,239,119,128, 30,137,101, 4,206, 4,206, 15,
+ 206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,
+ 229,242,243,244,242,225,243,115,128, 33, 24,107, 2,206, 33,206,
+ 43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,
+ 128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,
+ 246,101,128, 30,129,232,233,244,101, 8,206, 90,206, 99,206,183,
+ 207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,
+ 128, 37,230, 99, 2,206,105,206,125,233,242,227,236,101,129, 37,
+ 203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,
+ 229,242,226,242,225,227,235,229,116, 2,206,142,206,162,236,229,
+ 230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,
+ 254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,
+ 233,227,225,108,128,254, 68,100, 2,206,189,206,230,233,225,237,
+ 239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,
+ 238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,
+ 239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,
+ 103, 2,206,246,207, 6,243,237,225,236,236,244,242,233,225,238,
+ 231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,
+ 189,236,101, 2,207, 24,207, 66,230,244,240,239,233,238,244,233,
+ 238,103, 2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,
+ 37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,
+ 116, 2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,
+ 232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,
+ 238,103, 2,207,119,207,135,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,
+ 37,183,115, 3,207,154,207,184,207,192,109, 2,207,160,207,172,
+ 225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,
+ 231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,
+ 244,225,114,128, 38, 6,116, 2,207,204,207,215,229,236,229,240,
+ 232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,
+ 229,236,236,226,242,225,227,235,229,116, 2,207,239,207,246,236,
+ 229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,
+ 240,239,233,238,244,233,238,103, 2,208, 13,208, 29,243,237,225,
+ 236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,
+ 225,238,231,236,101,128, 37,179,105, 2,208, 46,208, 57,232,233,
+ 242,225,231,225,238, 97,128, 48,144,107, 2,208, 63,208, 73,225,
+ 244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,
+ 95,237,239,238,239,243,240,225,227,101,128,255, 87,111, 4,208,
+ 103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,
+ 48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,
+ 225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,
+ 145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,
+ 238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,
+ 242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,
+ 2,183,244,245,242,238,229,100,128, 2,141,249,238,110,128, 1,
+ 191,120,137, 0,120,208,231,208,242,208,253,209, 6,209, 33,209,
+ 46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,
+ 3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,
+ 227,236,101,128, 36,231,100, 2,209, 12,209, 22,233,229,242,229,
+ 243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,
+ 139,229,232,225,242,237,229,238,233,225,110,128, 5,109,105,128,
+ 3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,
+ 242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128, 2,
+ 227,121,143, 0,121,209,115,210, 74,210, 97,210,137,212,103,212,
+ 111,212,128,212,192,212,204,213,201,213,241,213,253,214, 8,214,
+ 29,215, 2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,
+ 185,209,210,209,221,210, 3,210, 16,210, 62,225,228,239,243,241,
+ 245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128, 9,
+ 175,227,245,244,101,128, 0,253,228,229,246, 97,128, 9, 47,229,
+ 235,239,242,229,225,110,128, 49, 82,231,117, 2,209,192,209,201,
+ 234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,
+ 10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107, 2,209,
+ 227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,
+ 225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,
+ 128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,
+ 243,237,225,236,108, 2,210, 26,210, 37,232,233,242,225,231,225,
+ 238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,
+ 210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,
+ 249,242,233,236,236,233, 99,128, 4, 99,227,233,242, 99, 2,210,
+ 83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128, 1,
+ 119,100, 2,210,103,210,113,233,229,242,229,243,233,115,128, 0,
+ 255,239,116, 2,210,120,210,129,225,227,227,229,238,116,128, 30,
+ 143,226,229,236,239,119,128, 30,245,101, 7,210,153,211,161,211,
+ 170,211,188,211,220,212, 40,212, 91,104, 8,210,171,210,180,210,
+ 214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,
+ 99,128, 6, 74,226,225,242,242,229,101, 2,210,191,210,200,225,
+ 242,225,226,233, 99,128, 6,210,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,242,232,225,237,250,225,225,226,239,246,101, 4,210,
+ 247,211, 0,211, 14,211, 30,225,242,225,226,233, 99,128, 6, 38,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,
+ 228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101, 2,
+ 211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 244,229,237,105, 2,211, 89,211,104,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,
+ 242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,
+ 239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128, 6,
+ 209,235,239,242,229,225,110,128, 49, 86,110,129, 0,165,211,176,
+ 237,239,238,239,243,240,225,227,101,128,255,229,111, 2,211,194,
+ 211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49,134,114, 3,211,228,
+ 212, 8,212, 20,225,232,226,229,238,249,239,237,111, 2,211,242,
+ 211,251,232,229,226,242,229,119,128, 5,170,236,229,230,244,232,
+ 229,226,242,229,119,128, 5,170,233,227,249,242,233,236,236,233,
+ 99,128, 4, 75,245,228,233,229,242,229,243,233,243,227,249,242,
+ 233,236,236,233, 99,128, 4,249,243,233,229,245,238,103, 3,212,
+ 53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,
+ 239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,
+ 226,242,229,119,128, 5,154,231,242,225,246,101,128, 30,243,232,
+ 239,239,107,129, 1,180,212,120,225,226,239,246,101,128, 30,247,
+ 105, 5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,
+ 238,233,225,110,128, 5,117,227,249,242,233,236,236,233, 99,128,
+ 4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,
+ 128, 38, 47,247,238,225,242,237,229,238,233,225,110,128, 5,130,
+ 237,239,238,239,243,240,225,227,101,128,255, 89,111, 7,212,220,
+ 213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131, 5,217,
+ 212,230,212,250,213, 3,228,225,231,229,243,104,129,251, 57,212,
+ 241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,
+ 128, 5,217,249,239,100, 2,213, 11,213, 20,232,229,226,242,229,
+ 119,128, 5,242,240,225,244,225,232,232,229,226,242,229,119,128,
+ 251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,
+ 242,229,225,110,128, 49,137,107, 2,213, 61,213, 85,225,244,225,
+ 235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,
+ 244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,
+ 236,108, 2,213,103,213,114,232,233,242,225,231,225,238, 97,128,
+ 48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,
+ 225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,
+ 107,128, 3,243,121, 2,213,154,213,191, 97, 2,213,160,213,170,
+ 229,235,239,242,229,225,110,128, 49,136,107, 2,213,176,213,184,
+ 239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,
+ 238,231,244,232,225,105,128, 14, 13,112, 2,213,207,213,214,225,
+ 242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,
+ 105,129, 3,122,213,230,231,242,229,229,235,227,237, 98,128, 3,
+ 69,114,129, 1,166,213,247,233,238,103,128, 30,153,243,245,240,
+ 229,242,233,239,114,128, 2,184,116, 2,214, 14,214, 21,233,236,
+ 228,101,128, 30,249,245,242,238,229,100,128, 2,142,117, 5,214,
+ 41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,
+ 97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107, 2,
+ 214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,
+ 232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,
+ 110,128, 49, 96,115, 3,214,108,214,146,214,187,226,233,103, 2,
+ 214,116,214,127,227,249,242,233,236,236,233, 99,128, 4,107,233,
+ 239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,
+ 4,109,236,233,244,244,236,101, 2,214,157,214,168,227,249,242,
+ 233,236,236,233, 99,128, 4,103,233,239,244,233,230,233,229,228,
+ 227,249,242,233,236,236,233, 99,128, 4,105,237,225,236,108, 2,
+ 214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,
+ 225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,
+ 247,233,228,244,104,128,255,109,249,101, 2,214,239,214,248,235,
+ 239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,
+ 49,138,249, 97, 2,215, 9,215, 19,226,229,238,231,225,236,105,
+ 128, 9,223,228,229,246, 97,128, 9, 95,122,142, 0,122,215, 58,
+ 216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,
+ 218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,
+ 215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,
+ 225,242,237,229,238,233,225,110,128, 5,102,227,245,244,101,128,
+ 1,122,228,229,246, 97,128, 9, 91,231,245,242,237,245,235,232,
+ 105,128, 10, 91,104, 4,215,126,215,135,215,149,215,179,225,242,
+ 225,226,233, 99,128, 6, 56,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,198,105, 2,215,155,215,170,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,
+ 128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+ 254,200,233,110, 2,215,201,215,210,225,242,225,226,233, 99,128,
+ 6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,
+ 235,225,244,225,235,225,238, 97,128, 48,182,241,229,102, 2,215,
+ 243,216, 1,231,225,228,239,236,232,229,226,242,229,119,128, 5,
+ 149,241,225,244,225,238,232,229,226,242,229,119,128, 5,148,242,
+ 241,225,232,229,226,242,229,119,128, 5,152,249,233,110,130, 5,
+ 214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,
+ 232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,
+ 5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99, 3,216,
+ 85,216, 92,216,114,225,242,239,110,128, 1,126,233,242, 99, 2,
+ 216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,
+ 30,145,245,242,108,128, 2,145,228,239,116,130, 1,124,216,130,
+ 216,139,225,227,227,229,238,116,128, 1,124,226,229,236,239,119,
+ 128, 30,147,101, 6,216,161,216,172,216,215,216,226,216,237,217,
+ 177,227,249,242,233,236,236,233, 99,128, 4, 55,100, 2,216,178,
+ 216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+ 233, 99,128, 4,153,233,229,242,229,243,233,243,227,249,242,233,
+ 236,236,233, 99,128, 4,223,232,233,242,225,231,225,238, 97,128,
+ 48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,
+ 0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,
+ 217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,
+ 128, 6, 96,226,229,238,231,225,236,105,128, 9,230,228,229,246,
+ 97,128, 9,102,231,117, 2,217, 43,217, 52,234,225,242,225,244,
+ 105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,
+ 235,225,242,225,226,233, 99,128, 6, 96,233,238,230,229,242,233,
+ 239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,
+ 16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,
+ 233,225,110,128, 6,240,243,245,240,229,242,233,239,114,128, 32,
+ 112,244,232,225,105,128, 14, 80,247,233,228,244,104, 3,217,148,
+ 217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,
+ 234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,
+ 11,244, 97,128, 3,182,104, 2,217,188,217,199,226,239,240,239,
+ 237,239,230,111,128, 49, 19,101, 4,217,209,217,220,217,236,217,
+ 247,225,242,237,229,238,233,225,110,128, 5,106,226,242,229,246,
+ 229,227,249,242,233,236,236,233, 99,128, 4,194,227,249,242,233,
+ 236,236,233, 99,128, 4, 54,100, 2,217,253,218, 16,229,243,227,
+ 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,151,
+ 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,
+ 4,221,105, 3,218, 42,218, 53,218, 64,232,233,242,225,231,225,
+ 238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,
+ 238,239,242,232,229,226,242,229,119,128, 5,174,236,233,238,229,
+ 226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,
+ 101,128,255, 90,111, 2,218,106,218,117,232,233,242,225,231,225,
+ 238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,
+ 240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,
+ 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1,
+ 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128,
+ 48, 90,235,225,244,225,235,225,238, 97,128, 48,186
+ };
+
+
+ /*
+ * This function searches the compressed table efficiently.
+ */
+ static unsigned long
+ ft_get_adobe_glyph_index( const char* name,
+ const char* limit )
+ {
+ int c = 0;
+ int count, min, max;
+ const unsigned char* p = ft_adobe_glyph_list;
+
+
+ if ( name == 0 || name >= limit )
+ goto NotFound;
+
+ c = *name++;
+ count = p[1];
+ p += 2;
+
+ min = 0;
+ max = count;
+
+ while ( min < max )
+ {
+ int mid = ( min + max ) >> 1;
+ const unsigned char* q = p + mid * 2;
+ int c2;
+
+
+ q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
+
+ c2 = q[0] & 127;
+ if ( c2 == c )
+ {
+ p = q;
+ goto Found;
+ }
+ if ( c2 < c )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+ goto NotFound;
+
+ Found:
+ for (;;)
+ {
+ /* assert (*p & 127) == c */
+
+ if ( name >= limit )
+ {
+ if ( (p[0] & 128) == 0 &&
+ (p[1] & 128) != 0 )
+ return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
+
+ goto NotFound;
+ }
+ c = *name++;
+ if ( p[0] & 128 )
+ {
+ p++;
+ if ( c != (p[0] & 127) )
+ goto NotFound;
+
+ continue;
+ }
+
+ p++;
+ count = p[0] & 127;
+ if ( p[0] & 128 )
+ p += 2;
+
+ p++;
+
+ for ( ; count > 0; count--, p += 2 )
+ {
+ int offset = ( (int)p[0] << 8 ) | p[1];
+ const unsigned char* q = ft_adobe_glyph_list + offset;
+
+ if ( c == ( q[0] & 127 ) )
+ {
+ p = q;
+ goto NextIter;
+ }
+ }
+ goto NotFound;
+
+ NextIter:
+ ;
+ }
+
+ NotFound:
+ return 0;
+ }
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
new file mode 100644
index 0000000000..4cd39a8ccf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
@@ -0,0 +1,71 @@
+#
+# FreeType 2 PSNames driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSNames driver directory
+#
+PSNAMES_DIR := $(SRC_DIR)/psnames
+
+
+# compilation flags for the driver
+#
+PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR))
+
+
+# PSNames driver sources (i.e., C files)
+#
+PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \
+ $(PSNAMES_DIR)/pspic.c
+
+
+# PSNames driver headers
+#
+PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \
+ $(PSNAMES_DIR)/psnamerr.h \
+ $(PSNAMES_DIR)/pstables.h
+
+
+# PSNames driver object(s)
+#
+# PSNAMES_DRV_OBJ_M is used during `multi' builds
+# PSNAMES_DRV_OBJ_S is used during `single' builds
+#
+PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O
+
+# PSNames driver source file for single build
+#
+PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c
+
+
+# PSNames driver - single object
+#
+$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \
+ $(FREETYPE_H) $(PSNAMES_DRV_H)
+ $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S))
+
+
+# PSNames driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H)
+ $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S)
+DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
new file mode 100644
index 0000000000..4f60e87c78
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/raster Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) raster ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftraster ftrend1 rastpic ;
+ }
+ else
+ {
+ _sources = raster ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/raster Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
new file mode 100644
index 0000000000..c551e89c0f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/* */
+/* ftmisc.h */
+/* */
+/* Miscellaneous macros for stand-alone rasterizer (specification */
+/* only). */
+/* */
+/* Copyright 2005, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /***************************************************/
+ /* */
+ /* This file is *not* portable! You have to adapt */
+ /* its definitions to your platform. */
+ /* */
+ /***************************************************/
+
+#ifndef __FTMISC_H__
+#define __FTMISC_H__
+
+
+ /* memset */
+#include "../../include/freetype/config/ftstdlib.h"
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#define FT_LOCAL_DEF( x ) static x
+
+
+ /* from include/freetype2/fttypes.h */
+
+ typedef unsigned char FT_Byte;
+ typedef signed int FT_Int;
+ typedef unsigned int FT_UInt;
+ typedef signed long FT_Long;
+ typedef unsigned long FT_ULong;
+ typedef signed long FT_F26Dot6;
+ typedef int FT_Error;
+
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+ ( ( (FT_ULong)_x1 << 24 ) | \
+ ( (FT_ULong)_x2 << 16 ) | \
+ ( (FT_ULong)_x3 << 8 ) | \
+ (FT_ULong)_x4 )
+
+
+ /* from include/freetype2/ftsystem.h */
+
+ typedef struct FT_MemoryRec_* FT_Memory;
+
+ typedef void* (*FT_Alloc_Func)( FT_Memory memory,
+ long size );
+
+ typedef void (*FT_Free_Func)( FT_Memory memory,
+ void* block );
+
+ typedef void* (*FT_Realloc_Func)( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block );
+
+ typedef struct FT_MemoryRec_
+ {
+ void* user;
+
+ FT_Alloc_Func alloc;
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+
+ } FT_MemoryRec;
+
+
+ /* from src/ftcalc.c */
+
+#if ( defined _WIN32 || defined _WIN64 )
+
+ typedef __int64 FT_Int64;
+
+#else
+
+#include "inttypes.h"
+
+ typedef int64_t FT_Int64;
+
+#endif
+
+
+ static FT_Long
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ static FT_Long
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+#endif /* __FTMISC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
new file mode 100644
index 0000000000..264f6b0957
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
@@ -0,0 +1,3640 @@
+/***************************************************************************/
+/* */
+/* ftraster.c */
+/* */
+/* The FreeType glyph rasterizer (body). */
+/* */
+/* Copyright 1996-2003, 2005, 2007-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file can be compiled without the rest of the FreeType engine, by */
+ /* defining the _STANDALONE_ macro when compiling it. You also need to */
+ /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */
+ /* directory. Typically, you should do something like */
+ /* */
+ /* - copy `src/raster/ftraster.c' (this file) to your current directory */
+ /* */
+ /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */
+ /* to your current directory */
+ /* */
+ /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */
+ /* */
+ /* cc -c -D_STANDALONE_ ftraster.c */
+ /* */
+ /* The renderer can be initialized with a call to */
+ /* `ft_standard_raster.raster_new'; a bitmap can be generated */
+ /* with a call to `ft_standard_raster.raster_render'. */
+ /* */
+ /* See the comments and documentation in the file `ftimage.h' for more */
+ /* details on how the raster works. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This is a rewrite of the FreeType 1.x scan-line converter */
+ /* */
+ /*************************************************************************/
+
+#ifdef _STANDALONE_
+
+#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h>
+
+#include <string.h> /* for memset */
+
+#include "ftmisc.h"
+#include "ftimage.h"
+
+#else /* !_STANDALONE_ */
+
+#include "../../include/ft2build.h"
+#include "ftraster.h"
+#include "../../include/freetype/internal/ftcalc.h" /* for FT_MulDiv and FT_MulDiv_No_Round */
+
+#include "rastpic.h"
+
+#endif /* !_STANDALONE_ */
+
+
+ /*************************************************************************/
+ /* */
+ /* A simple technical note on how the raster works */
+ /* ----------------------------------------------- */
+ /* */
+ /* Converting an outline into a bitmap is achieved in several steps: */
+ /* */
+ /* 1 - Decomposing the outline into successive `profiles'. Each */
+ /* profile is simply an array of scanline intersections on a given */
+ /* dimension. A profile's main attributes are */
+ /* */
+ /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */
+ /* */
+ /* o an array of intersection coordinates for each scanline */
+ /* between `Ymin' and `Ymax' */
+ /* */
+ /* o a direction, indicating whether it was built going `up' or */
+ /* `down', as this is very important for filling rules */
+ /* */
+ /* o its drop-out mode */
+ /* */
+ /* 2 - Sweeping the target map's scanlines in order to compute segment */
+ /* `spans' which are then filled. Additionally, this pass */
+ /* performs drop-out control. */
+ /* */
+ /* The outline data is parsed during step 1 only. The profiles are */
+ /* built from the bottom of the render pool, used as a stack. The */
+ /* following graphics shows the profile list under construction: */
+ /* */
+ /* __________________________________________________________ _ _ */
+ /* | | | | | */
+ /* | profile | coordinates for | profile | coordinates for |--> */
+ /* | 1 | profile 1 | 2 | profile 2 |--> */
+ /* |_________|_________________|_________|_________________|__ _ _ */
+ /* */
+ /* ^ ^ */
+ /* | | */
+ /* start of render pool top */
+ /* */
+ /* The top of the profile stack is kept in the `top' variable. */
+ /* */
+ /* As you can see, a profile record is pushed on top of the render */
+ /* pool, which is then followed by its coordinates/intersections. If */
+ /* a change of direction is detected in the outline, a new profile is */
+ /* generated until the end of the outline. */
+ /* */
+ /* Note that when all profiles have been generated, the function */
+ /* Finalize_Profile_Table() is used to record, for each profile, its */
+ /* bottom-most scanline as well as the scanline above its upmost */
+ /* boundary. These positions are called `y-turns' because they (sort */
+ /* of) correspond to local extrema. They are stored in a sorted list */
+ /* built from the top of the render pool as a downwards stack: */
+ /* */
+ /* _ _ _______________________________________ */
+ /* | | */
+ /* <--| sorted list of | */
+ /* <--| extrema scanlines | */
+ /* _ _ __________________|____________________| */
+ /* */
+ /* ^ ^ */
+ /* | | */
+ /* maxBuff sizeBuff = end of pool */
+ /* */
+ /* This list is later used during the sweep phase in order to */
+ /* optimize performance (see technical note on the sweep below). */
+ /* */
+ /* Of course, the raster detects whether the two stacks collide and */
+ /* handles the situation properly. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** CONFIGURATION MACROS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* define DEBUG_RASTER if you want to compile a debugging version */
+/* #define DEBUG_RASTER */
+
+ /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */
+ /* 5-levels anti-aliasing */
+/* #define FT_RASTER_OPTION_ANTI_ALIASING */
+
+ /* The size of the two-lines intermediate bitmap used */
+ /* for anti-aliasing, in bytes. */
+#define RASTER_GRAY_LINES 2048
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** OTHER MACROS (do not change) **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raster
+
+
+#ifdef _STANDALONE_
+
+ /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+ /* This macro is used to indicate that a function parameter is unused. */
+ /* Its purpose is simply to reduce compiler warnings. Note also that */
+ /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+ /* ANSI compilers (e.g. LCC). */
+#define FT_UNUSED( x ) (x) = (x)
+
+ /* Disable the tracing mechanism for simplicity -- developers can */
+ /* activate it easily by redefining these macros. */
+#ifndef FT_ERROR
+#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */
+#endif
+
+#ifndef FT_TRACE
+#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */
+#endif
+
+#ifndef FT_THROW
+#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e )
+#endif
+
+#define Raster_Err_None 0
+#define Raster_Err_Not_Ini -1
+#define Raster_Err_Overflow -2
+#define Raster_Err_Neg_Height -3
+#define Raster_Err_Invalid -4
+#define Raster_Err_Unsupported -5
+
+#define ft_memset memset
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
+ raster_reset_, raster_set_mode_, \
+ raster_render_, raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h" /* for FT_TRACE, FT_ERROR, and FT_THROW */
+
+#include "rasterrs.h"
+
+#define Raster_Err_None FT_Err_Ok
+#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized
+#define Raster_Err_Overflow Raster_Err_Raster_Overflow
+#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height
+#define Raster_Err_Invalid Raster_Err_Invalid_Outline
+#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+#endif
+
+ /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */
+ /* typically a small value and the result of a*b is known to fit into */
+ /* 32 bits. */
+#define FMulDiv( a, b, c ) ( (a) * (b) / (c) )
+
+ /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
+ /* for clipping computations. It simply uses the FT_MulDiv() function */
+ /* defined in `ftcalc.h'. */
+#define SMulDiv FT_MulDiv
+#define SMulDiv_No_Round FT_MulDiv_No_Round
+
+ /* The rasterizer is a very general purpose component; please leave */
+ /* the following redefinitions there (you never know your target */
+ /* environment). */
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS 0
+#endif
+
+#ifndef FAILURE
+#define FAILURE 1
+#endif
+
+
+#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */
+ /* Setting this constant to more than 32 is a */
+ /* pure waste of space. */
+
+#define Pixel_Bits 6 /* fractional bits of *input* coordinates */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SIMPLE TYPE DECLARATIONS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef int Int;
+ typedef unsigned int UInt;
+ typedef short Short;
+ typedef unsigned short UShort, *PUShort;
+ typedef long Long, *PLong;
+ typedef unsigned long ULong;
+
+ typedef unsigned char Byte, *PByte;
+ typedef char Bool;
+
+
+ typedef union Alignment_
+ {
+ long l;
+ void* p;
+ void (*f)(void);
+
+ } Alignment, *PAlignment;
+
+
+ typedef struct TPoint_
+ {
+ Long x;
+ Long y;
+
+ } TPoint;
+
+
+ /* values for the `flags' bit field */
+#define Flow_Up 0x8
+#define Overshoot_Top 0x10
+#define Overshoot_Bottom 0x20
+
+
+ /* States of each line, arc, and profile */
+ typedef enum TStates_
+ {
+ Unknown_State,
+ Ascending_State,
+ Descending_State,
+ Flat_State
+
+ } TStates;
+
+
+ typedef struct TProfile_ TProfile;
+ typedef TProfile* PProfile;
+
+ struct TProfile_
+ {
+ FT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile (various purposes) */
+ PLong offset; /* start of profile's data in render pool */
+ unsigned flags; /* Bit 0-2: drop-out mode */
+ /* Bit 3: profile orientation (up/down) */
+ /* Bit 4: is top profile? */
+ /* Bit 5: is bottom profile? */
+ long height; /* profile's height in scanlines */
+ long start; /* profile's starting scanline */
+
+ unsigned countL; /* number of lines to step before this */
+ /* profile becomes drawable */
+
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
+ };
+
+ typedef PProfile TProfileList;
+ typedef PProfile* PProfileList;
+
+
+ /* Simple record used to implement a stack of bands, required */
+ /* by the sub-banding mechanism */
+ typedef struct black_TBand_
+ {
+ Short y_min; /* band's minimum */
+ Short y_max; /* band's maximum */
+
+ } black_TBand;
+
+
+#define AlignProfileSize \
+ ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )
+
+
+#undef RAS_ARG
+#undef RAS_ARGS
+#undef RAS_VAR
+#undef RAS_VARS
+
+#ifdef FT_STATIC_RASTER
+
+
+#define RAS_ARGS /* void */
+#define RAS_ARG /* void */
+
+#define RAS_VARS /* void */
+#define RAS_VAR /* void */
+
+#define FT_UNUSED_RASTER do { } while ( 0 )
+
+
+#else /* !FT_STATIC_RASTER */
+
+
+#define RAS_ARGS black_PWorker worker,
+#define RAS_ARG black_PWorker worker
+
+#define RAS_VARS worker,
+#define RAS_VAR worker
+
+#define FT_UNUSED_RASTER FT_UNUSED( worker )
+
+
+#endif /* !FT_STATIC_RASTER */
+
+
+ typedef struct black_TWorker_ black_TWorker, *black_PWorker;
+
+
+ /* prototypes used for sweep function dispatch */
+ typedef void
+ Function_Sweep_Init( RAS_ARGS Short* min,
+ Short* max );
+
+ typedef void
+ Function_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right );
+
+ typedef void
+ Function_Sweep_Step( RAS_ARG );
+
+
+ /* NOTE: These operations are only valid on 2's complement processors */
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define FLOOR( x ) ( (x) & -ras.precision )
+#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision )
+#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits )
+#define FRAC( x ) ( (x) & ( ras.precision - 1 ) )
+#define SCALED( x ) ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )
+
+#define IS_BOTTOM_OVERSHOOT( x ) \
+ (Bool)( CEILING( x ) - x >= ras.precision_half )
+#define IS_TOP_OVERSHOOT( x ) \
+ (Bool)( x - FLOOR( x ) >= ras.precision_half )
+
+ /* The most used variables are positioned at the top of the structure. */
+ /* Thus, their offset can be coded with less opcodes, resulting in a */
+ /* smaller executable. */
+
+ struct black_TWorker_
+ {
+ Int precision_bits; /* precision related variables */
+ Int precision;
+ Int precision_half;
+ Int precision_shift;
+ Int precision_step;
+ Int precision_jitter;
+
+ Int scale_shift; /* == precision_shift for bitmaps */
+ /* == precision_shift+1 for pixmaps */
+
+ PLong buff; /* The profiles buffer */
+ PLong sizeBuff; /* Render pool size */
+ PLong maxBuff; /* Profiles buffer size */
+ PLong top; /* Current cursor in buffer */
+
+ FT_Error error;
+
+ Int numTurns; /* number of Y-turns in outline */
+
+ TPoint* arc; /* current Bezier arc pointer */
+
+ UShort bWidth; /* target bitmap width */
+ PByte bTarget; /* target bitmap buffer */
+ PByte gTarget; /* target pixmap buffer */
+
+ Long lastX, lastY;
+ Long minY, maxY;
+
+ UShort num_Profs; /* current number of profiles */
+
+ Bool fresh; /* signals a fresh new profile which */
+ /* `start' field must be completed */
+ Bool joint; /* signals that the last arc ended */
+ /* exactly on a scanline. Allows */
+ /* removal of doublets */
+ PProfile cProfile; /* current profile */
+ PProfile fProfile; /* head of linked list of profiles */
+ PProfile gProfile; /* contour's first profile in case */
+ /* of impact */
+
+ TStates state; /* rendering state */
+
+ FT_Bitmap target; /* description of target bit/pixmap */
+ FT_Outline outline;
+
+ Long traceOfs; /* current offset in target bitmap */
+ Long traceG; /* current offset in target pixmap */
+
+ Short traceIncr; /* sweep's increment in target bitmap */
+
+ Short gray_min_x; /* current min x during gray rendering */
+ Short gray_max_x; /* current max x during gray rendering */
+
+ /* dispatch variables */
+
+ Function_Sweep_Init* Proc_Sweep_Init;
+ Function_Sweep_Span* Proc_Sweep_Span;
+ Function_Sweep_Span* Proc_Sweep_Drop;
+ Function_Sweep_Step* Proc_Sweep_Step;
+
+ Byte dropOutControl; /* current drop_out control method */
+
+ Bool second_pass; /* indicates whether a horizontal pass */
+ /* should be performed to control */
+ /* drop-out accurately when calling */
+ /* Render_Glyph. Note that there is */
+ /* no horizontal pass during gray */
+ /* rendering. */
+
+ TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */
+
+ black_TBand band_stack[16]; /* band stack used for sub-banding */
+ Int band_top; /* band stack top */
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ Byte* grays;
+
+ Byte gray_lines[RASTER_GRAY_LINES];
+ /* Intermediate table used to render the */
+ /* graylevels pixmaps. */
+ /* gray_lines is a buffer holding two */
+ /* monochrome scanlines */
+
+ Short gray_width; /* width in bytes of one monochrome */
+ /* intermediate scanline of gray_lines. */
+ /* Each gray pixel takes 2 bits long there */
+
+ /* The gray_lines must hold 2 lines, thus with size */
+ /* in bytes of at least `gray_width*2'. */
+
+#endif /* FT_RASTER_ANTI_ALIASING */
+
+ };
+
+
+ typedef struct black_TRaster_
+ {
+ char* buffer;
+ long buffer_size;
+ void* memory;
+ black_PWorker worker;
+ Byte grays[5];
+ Short gray_width;
+
+ } black_TRaster, *black_PRaster;
+
+#ifdef FT_STATIC_RASTER
+
+ static black_TWorker cur_ras;
+#define ras cur_ras
+
+#else /* !FT_STATIC_RASTER */
+
+#define ras (*worker)
+
+#endif /* !FT_STATIC_RASTER */
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ /* A lookup table used to quickly count set bits in four gray 2x2 */
+ /* cells. The values of the table have been produced with the */
+ /* following code: */
+ /* */
+ /* for ( i = 0; i < 256; i++ ) */
+ /* { */
+ /* l = 0; */
+ /* j = i; */
+ /* */
+ /* for ( c = 0; c < 4; c++ ) */
+ /* { */
+ /* l <<= 4; */
+ /* */
+ /* if ( j & 0x80 ) l++; */
+ /* if ( j & 0x40 ) l++; */
+ /* */
+ /* j = ( j << 2 ) & 0xFF; */
+ /* } */
+ /* printf( "0x%04X", l ); */
+ /* } */
+ /* */
+
+ static const short count_table[256] =
+ {
+ 0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,
+ 0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,
+ 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+ 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+ 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+ 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+ 0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,
+ 0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,
+ 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+ 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+ 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+ 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+ 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+ 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+ 0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,
+ 0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,
+ 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+ 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+ 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+ 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+ 0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,
+ 0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222
+ };
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** PROFILES COMPUTATION **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Set_High_Precision */
+ /* */
+ /* <Description> */
+ /* Set precision variables according to param flag. */
+ /* */
+ /* <Input> */
+ /* High :: Set to True for high precision (typically for ppem < 24), */
+ /* false otherwise. */
+ /* */
+ static void
+ Set_High_Precision( RAS_ARGS Int High )
+ {
+ /*
+ * `precision_step' is used in `Bezier_Up' to decide when to split a
+ * given y-monotonous Bezier arc that crosses a scanline before
+ * approximating it as a straight segment. The default value of 32 (for
+ * low accuracy) corresponds to
+ *
+ * 32 / 64 == 0.5 pixels ,
+ *
+ * while for the high accuracy case we have
+ *
+ * 256/ (1 << 12) = 0.0625 pixels .
+ *
+ * `precision_jitter' is an epsilon threshold used in
+ * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
+ * decomposition (after all, we are working with approximations only);
+ * it avoids switching on additional pixels which would cause artifacts
+ * otherwise.
+ *
+ * The value of `precision_jitter' has been determined heuristically.
+ *
+ */
+
+ if ( High )
+ {
+ ras.precision_bits = 12;
+ ras.precision_step = 256;
+ ras.precision_jitter = 30;
+ }
+ else
+ {
+ ras.precision_bits = 6;
+ ras.precision_step = 32;
+ ras.precision_jitter = 2;
+ }
+
+ FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
+
+ ras.precision = 1 << ras.precision_bits;
+ ras.precision_half = ras.precision / 2;
+ ras.precision_shift = ras.precision_bits - Pixel_Bits;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* New_Profile */
+ /* */
+ /* <Description> */
+ /* Create a new profile in the render pool. */
+ /* */
+ /* <Input> */
+ /* aState :: The state/orientation of the new profile. */
+ /* */
+ /* overshoot :: Whether the profile's unrounded start position */
+ /* differs by at least a half pixel. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or of incoherent */
+ /* profile. */
+ /* */
+ static Bool
+ New_Profile( RAS_ARGS TStates aState,
+ Bool overshoot )
+ {
+ if ( !ras.fProfile )
+ {
+ ras.cProfile = (PProfile)ras.top;
+ ras.fProfile = ras.cProfile;
+ ras.top += AlignProfileSize;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ ras.cProfile->flags = 0;
+ ras.cProfile->start = 0;
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+ ras.cProfile->link = (PProfile)0;
+ ras.cProfile->next = (PProfile)0;
+ ras.cProfile->flags = ras.dropOutControl;
+
+ switch ( aState )
+ {
+ case Ascending_State:
+ ras.cProfile->flags |= Flow_Up;
+ if ( overshoot )
+ ras.cProfile->flags |= Overshoot_Bottom;
+
+ FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile ));
+ break;
+
+ case Descending_State:
+ if ( overshoot )
+ ras.cProfile->flags |= Overshoot_Top;
+ FT_TRACE6(( "New descending profile = %p\n", ras.cProfile ));
+ break;
+
+ default:
+ FT_ERROR(( "New_Profile: invalid profile direction\n" ));
+ ras.error = FT_THROW( Invalid );
+ return FAILURE;
+ }
+
+ if ( !ras.gProfile )
+ ras.gProfile = ras.cProfile;
+
+ ras.state = aState;
+ ras.fresh = TRUE;
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* End_Profile */
+ /* */
+ /* <Description> */
+ /* Finalize the current profile. */
+ /* */
+ /* <Input> */
+ /* overshoot :: Whether the profile's unrounded end position differs */
+ /* by at least a half pixel. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or incoherency. */
+ /* */
+ static Bool
+ End_Profile( RAS_ARGS Bool overshoot )
+ {
+ Long h;
+
+
+ h = (Long)( ras.top - ras.cProfile->offset );
+
+ if ( h < 0 )
+ {
+ FT_ERROR(( "End_Profile: negative height encountered\n" ));
+ ras.error = FT_THROW( Neg_Height );
+ return FAILURE;
+ }
+
+ if ( h > 0 )
+ {
+ PProfile oldProfile;
+
+
+ FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n",
+ ras.cProfile, ras.cProfile->start, h ));
+
+ ras.cProfile->height = h;
+ if ( overshoot )
+ {
+ if ( ras.cProfile->flags & Flow_Up )
+ ras.cProfile->flags |= Overshoot_Top;
+ else
+ ras.cProfile->flags |= Overshoot_Bottom;
+ }
+
+ oldProfile = ras.cProfile;
+ ras.cProfile = (PProfile)ras.top;
+
+ ras.top += AlignProfileSize;
+
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+
+ oldProfile->next = ras.cProfile;
+ ras.num_Profs++;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ FT_TRACE1(( "overflow in End_Profile\n" ));
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Insert_Y_Turn */
+ /* */
+ /* <Description> */
+ /* Insert a salient into the sorted list placed on top of the render */
+ /* pool. */
+ /* */
+ /* <Input> */
+ /* New y scanline position. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
+ static Bool
+ Insert_Y_Turn( RAS_ARGS Int y )
+ {
+ PLong y_turns;
+ Int n;
+
+
+ n = ras.numTurns - 1;
+ y_turns = ras.sizeBuff - ras.numTurns;
+
+ /* look for first y value that is <= */
+ while ( n >= 0 && y < y_turns[n] )
+ n--;
+
+ /* if it is <, simply insert it, ignore if == */
+ if ( n >= 0 && y > y_turns[n] )
+ while ( n >= 0 )
+ {
+ Int y2 = (Int)y_turns[n];
+
+
+ y_turns[n] = y;
+ y = y2;
+ n--;
+ }
+
+ if ( n < 0 )
+ {
+ ras.maxBuff--;
+ if ( ras.maxBuff <= ras.top )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+ ras.numTurns++;
+ ras.sizeBuff[-ras.numTurns] = y;
+ }
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Finalize_Profile_Table */
+ /* */
+ /* <Description> */
+ /* Adjust all links in the profiles list. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
+ static Bool
+ Finalize_Profile_Table( RAS_ARG )
+ {
+ UShort n;
+ PProfile p;
+
+
+ n = ras.num_Profs;
+ p = ras.fProfile;
+
+ if ( n > 1 && p )
+ {
+ while ( n > 0 )
+ {
+ Int bottom, top;
+
+
+ if ( n > 1 )
+ p->link = (PProfile)( p->offset + p->height );
+ else
+ p->link = NULL;
+
+ if ( p->flags & Flow_Up )
+ {
+ bottom = (Int)p->start;
+ top = (Int)( p->start + p->height - 1 );
+ }
+ else
+ {
+ bottom = (Int)( p->start - p->height + 1 );
+ top = (Int)p->start;
+ p->start = bottom;
+ p->offset += p->height - 1;
+ }
+
+ if ( Insert_Y_Turn( RAS_VARS bottom ) ||
+ Insert_Y_Turn( RAS_VARS top + 1 ) )
+ return FAILURE;
+
+ p = p->link;
+ n--;
+ }
+ }
+ else
+ ras.fProfile = NULL;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Split_Conic */
+ /* */
+ /* <Description> */
+ /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */
+ /* stack. */
+ /* */
+ /* <Input> */
+ /* None (subdivided Bezier is taken from the top of the stack). */
+ /* */
+ /* <Note> */
+ /* This routine is the `beef' of this component. It is _the_ inner */
+ /* loop that should be optimized to hell to get the best performance. */
+ /* */
+ static void
+ Split_Conic( TPoint* base )
+ {
+ Long a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+
+ /* hand optimized. gcc doesn't seem to be too good at common */
+ /* expression substitution and instruction scheduling ;-) */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Split_Cubic */
+ /* */
+ /* <Description> */
+ /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */
+ /* Bezier stack. */
+ /* */
+ /* <Note> */
+ /* This routine is the `beef' of the component. It is one of _the_ */
+ /* inner loops that should be optimized like hell to get the best */
+ /* performance. */
+ /* */
+ static void
+ Split_Cubic( TPoint* base )
+ {
+ Long a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c + 1 ) >> 1;
+ base[5].x = b = ( base[3].x + d + 1 ) >> 1;
+ c = ( c + d + 1 ) >> 1;
+ base[2].x = a = ( a + c + 1 ) >> 1;
+ base[4].x = b = ( b + c + 1 ) >> 1;
+ base[3].x = ( a + b + 1 ) >> 1;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c + 1 ) >> 1;
+ base[5].y = b = ( base[3].y + d + 1 ) >> 1;
+ c = ( c + d + 1 ) >> 1;
+ base[2].y = a = ( a + c + 1 ) >> 1;
+ base[4].y = b = ( b + c + 1 ) >> 1;
+ base[3].y = ( a + b + 1 ) >> 1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Up */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an ascending line segment and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Line_Up( RAS_ARGS Long x1,
+ Long y1,
+ Long x2,
+ Long y2,
+ Long miny,
+ Long maxy )
+ {
+ Long Dx, Dy;
+ Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */
+ Long Ix, Rx, Ax;
+
+ PLong top;
+
+
+ Dx = x2 - x1;
+ Dy = y2 - y1;
+
+ if ( Dy <= 0 || y2 < miny || y1 > maxy )
+ return SUCCESS;
+
+ if ( y1 < miny )
+ {
+ /* Take care: miny-y1 can be a very large value; we use */
+ /* a slow MulDiv function to avoid clipping bugs */
+ x1 += SMulDiv( Dx, miny - y1, Dy );
+ e1 = (Int)TRUNC( miny );
+ f1 = 0;
+ }
+ else
+ {
+ e1 = (Int)TRUNC( y1 );
+ f1 = (Int)FRAC( y1 );
+ }
+
+ if ( y2 > maxy )
+ {
+ /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */
+ e2 = (Int)TRUNC( maxy );
+ f2 = 0;
+ }
+ else
+ {
+ e2 = (Int)TRUNC( y2 );
+ f2 = (Int)FRAC( y2 );
+ }
+
+ if ( f1 > 0 )
+ {
+ if ( e1 == e2 )
+ return SUCCESS;
+ else
+ {
+ x1 += SMulDiv( Dx, ras.precision - f1, Dy );
+ e1 += 1;
+ }
+ }
+ else
+ if ( ras.joint )
+ {
+ ras.top--;
+ ras.joint = FALSE;
+ }
+
+ ras.joint = (char)( f2 == 0 );
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = e1;
+ ras.fresh = FALSE;
+ }
+
+ size = e2 - e1 + 1;
+ if ( ras.top + size >= ras.maxBuff )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ if ( Dx > 0 )
+ {
+ Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
+ Rx = ( ras.precision * Dx ) % Dy;
+ Dx = 1;
+ }
+ else
+ {
+ Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
+ Rx = ( ras.precision * -Dx ) % Dy;
+ Dx = -1;
+ }
+
+ Ax = -Dy;
+ top = ras.top;
+
+ while ( size > 0 )
+ {
+ *top++ = x1;
+
+ x1 += Ix;
+ Ax += Rx;
+ if ( Ax >= 0 )
+ {
+ Ax -= Dy;
+ x1 += Dx;
+ }
+ size--;
+ }
+
+ ras.top = top;
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Down */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an descending line segment and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Line_Down( RAS_ARGS Long x1,
+ Long y1,
+ Long x2,
+ Long y2,
+ Long miny,
+ Long maxy )
+ {
+ Bool result, fresh;
+
+
+ fresh = ras.fresh;
+
+ result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ return result;
+ }
+
+
+ /* A function type describing the functions used to split Bezier arcs */
+ typedef void (*TSplitter)( TPoint* base );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Up */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an ascending Bezier arc and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Bezier_Up( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
+ {
+ Long y1, y2, e, e2, e0;
+ Short f1;
+
+ TPoint* arc;
+ TPoint* start_arc;
+
+ PLong top;
+
+
+ arc = ras.arc;
+ y1 = arc[degree].y;
+ y2 = arc[0].y;
+ top = ras.top;
+
+ if ( y2 < miny || y1 > maxy )
+ goto Fin;
+
+ e2 = FLOOR( y2 );
+
+ if ( e2 > maxy )
+ e2 = maxy;
+
+ e0 = miny;
+
+ if ( y1 < miny )
+ e = miny;
+ else
+ {
+ e = CEILING( y1 );
+ f1 = (Short)( FRAC( y1 ) );
+ e0 = e;
+
+ if ( f1 == 0 )
+ {
+ if ( ras.joint )
+ {
+ top--;
+ ras.joint = FALSE;
+ }
+
+ *top++ = arc[degree].x;
+
+ e += ras.precision;
+ }
+ }
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = TRUNC( e0 );
+ ras.fresh = FALSE;
+ }
+
+ if ( e2 < e )
+ goto Fin;
+
+ if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
+ {
+ ras.top = top;
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ start_arc = arc;
+
+ while ( arc >= start_arc && e <= e2 )
+ {
+ ras.joint = FALSE;
+
+ y2 = arc[0].y;
+
+ if ( y2 > e )
+ {
+ y1 = arc[degree].y;
+ if ( y2 - y1 >= ras.precision_step )
+ {
+ splitter( arc );
+ arc += degree;
+ }
+ else
+ {
+ *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
+ e - y1, y2 - y1 );
+ arc -= degree;
+ e += ras.precision;
+ }
+ }
+ else
+ {
+ if ( y2 == e )
+ {
+ ras.joint = TRUE;
+ *top++ = arc[0].x;
+
+ e += ras.precision;
+ }
+ arc -= degree;
+ }
+ }
+
+ Fin:
+ ras.top = top;
+ ras.arc -= degree;
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Down */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an descending Bezier arc and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Bezier_Down( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
+ {
+ TPoint* arc = ras.arc;
+ Bool result, fresh;
+
+
+ arc[0].y = -arc[0].y;
+ arc[1].y = -arc[1].y;
+ arc[2].y = -arc[2].y;
+ if ( degree > 2 )
+ arc[3].y = -arc[3].y;
+
+ fresh = ras.fresh;
+
+ result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ arc[0].y = -arc[0].y;
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_To */
+ /* */
+ /* <Description> */
+ /* Inject a new line segment and adjust the Profiles list. */
+ /* */
+ /* <Input> */
+ /* x :: The x-coordinate of the segment's end point (its start point */
+ /* is stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the segment's end point (its start point */
+ /* is stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Line_To( RAS_ARGS Long x,
+ Long y )
+ {
+ /* First, detect a change of direction */
+
+ switch ( ras.state )
+ {
+ case Unknown_State:
+ if ( y > ras.lastY )
+ {
+ if ( New_Profile( RAS_VARS Ascending_State,
+ IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ else
+ {
+ if ( y < ras.lastY )
+ if ( New_Profile( RAS_VARS Descending_State,
+ IS_TOP_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ case Ascending_State:
+ if ( y < ras.lastY )
+ {
+ if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
+ New_Profile( RAS_VARS Descending_State,
+ IS_TOP_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ case Descending_State:
+ if ( y > ras.lastY )
+ {
+ if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
+ New_Profile( RAS_VARS Ascending_State,
+ IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ /* Then compute the lines */
+
+ switch ( ras.state )
+ {
+ case Ascending_State:
+ if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ case Descending_State:
+ if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ default:
+ ;
+ }
+
+ ras.lastX = x;
+ ras.lastY = y;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Conic_To */
+ /* */
+ /* <Description> */
+ /* Inject a new conic arc and adjust the profile list. */
+ /* */
+ /* <Input> */
+ /* cx :: The x-coordinate of the arc's new control point. */
+ /* */
+ /* cy :: The y-coordinate of the arc's new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Conic_To( RAS_ARGS Long cx,
+ Long cy,
+ Long x,
+ Long y )
+ {
+ Long y1, y2, y3, x3, ymin, ymax;
+ TStates state_bez;
+
+
+ ras.arc = ras.arcs;
+ ras.arc[2].x = ras.lastX;
+ ras.arc[2].y = ras.lastY;
+ ras.arc[1].x = cx;
+ ras.arc[1].y = cy;
+ ras.arc[0].x = x;
+ ras.arc[0].y = y;
+
+ do
+ {
+ y1 = ras.arc[2].y;
+ y2 = ras.arc[1].y;
+ y3 = ras.arc[0].y;
+ x3 = ras.arc[0].x;
+
+ /* first, categorize the Bezier arc */
+
+ if ( y1 <= y3 )
+ {
+ ymin = y1;
+ ymax = y3;
+ }
+ else
+ {
+ ymin = y3;
+ ymax = y1;
+ }
+
+ if ( y2 < ymin || y2 > ymax )
+ {
+ /* this arc has no given direction, split it! */
+ Split_Conic( ras.arc );
+ ras.arc += 2;
+ }
+ else if ( y1 == y3 )
+ {
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
+ ras.arc -= 2;
+ }
+ else
+ {
+ /* the arc is y-monotonous, either ascending or descending */
+ /* detect a change of direction */
+ state_bez = y1 < y3 ? Ascending_State : Descending_State;
+ if ( ras.state != state_bez )
+ {
+ Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+ : IS_TOP_OVERSHOOT( y1 );
+
+
+ /* finalize current profile if any */
+ if ( ras.state != Unknown_State &&
+ End_Profile( RAS_VARS o ) )
+ goto Fail;
+
+ /* create a new profile */
+ if ( New_Profile( RAS_VARS state_bez, o ) )
+ goto Fail;
+ }
+
+ /* now call the appropriate routine */
+ if ( state_bez == Ascending_State )
+ {
+ if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+ else
+ if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+
+ } while ( ras.arc >= ras.arcs );
+
+ ras.lastX = x3;
+ ras.lastY = y3;
+
+ return SUCCESS;
+
+ Fail:
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Cubic_To */
+ /* */
+ /* <Description> */
+ /* Inject a new cubic arc and adjust the profile list. */
+ /* */
+ /* <Input> */
+ /* cx1 :: The x-coordinate of the arc's first new control point. */
+ /* */
+ /* cy1 :: The y-coordinate of the arc's first new control point. */
+ /* */
+ /* cx2 :: The x-coordinate of the arc's second new control point. */
+ /* */
+ /* cy2 :: The y-coordinate of the arc's second new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Cubic_To( RAS_ARGS Long cx1,
+ Long cy1,
+ Long cx2,
+ Long cy2,
+ Long x,
+ Long y )
+ {
+ Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
+ TStates state_bez;
+
+
+ ras.arc = ras.arcs;
+ ras.arc[3].x = ras.lastX;
+ ras.arc[3].y = ras.lastY;
+ ras.arc[2].x = cx1;
+ ras.arc[2].y = cy1;
+ ras.arc[1].x = cx2;
+ ras.arc[1].y = cy2;
+ ras.arc[0].x = x;
+ ras.arc[0].y = y;
+
+ do
+ {
+ y1 = ras.arc[3].y;
+ y2 = ras.arc[2].y;
+ y3 = ras.arc[1].y;
+ y4 = ras.arc[0].y;
+ x4 = ras.arc[0].x;
+
+ /* first, categorize the Bezier arc */
+
+ if ( y1 <= y4 )
+ {
+ ymin1 = y1;
+ ymax1 = y4;
+ }
+ else
+ {
+ ymin1 = y4;
+ ymax1 = y1;
+ }
+
+ if ( y2 <= y3 )
+ {
+ ymin2 = y2;
+ ymax2 = y3;
+ }
+ else
+ {
+ ymin2 = y3;
+ ymax2 = y2;
+ }
+
+ if ( ymin2 < ymin1 || ymax2 > ymax1 )
+ {
+ /* this arc has no given direction, split it! */
+ Split_Cubic( ras.arc );
+ ras.arc += 3;
+ }
+ else if ( y1 == y4 )
+ {
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
+ ras.arc -= 3;
+ }
+ else
+ {
+ state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
+
+ /* detect a change of direction */
+ if ( ras.state != state_bez )
+ {
+ Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+ : IS_TOP_OVERSHOOT( y1 );
+
+
+ /* finalize current profile if any */
+ if ( ras.state != Unknown_State &&
+ End_Profile( RAS_VARS o ) )
+ goto Fail;
+
+ if ( New_Profile( RAS_VARS state_bez, o ) )
+ goto Fail;
+ }
+
+ /* compute intersections */
+ if ( state_bez == Ascending_State )
+ {
+ if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+ else
+ if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+
+ } while ( ras.arc >= ras.arcs );
+
+ ras.lastX = x4;
+ ras.lastY = y4;
+
+ return SUCCESS;
+
+ Fail:
+ return FAILURE;
+ }
+
+
+#undef SWAP_
+#define SWAP_( x, y ) do \
+ { \
+ Long swap = x; \
+ \
+ \
+ x = y; \
+ y = swap; \
+ } while ( 0 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Decompose_Curve */
+ /* */
+ /* <Description> */
+ /* Scan the outline arrays in order to emit individual segments and */
+ /* Beziers by calling Line_To() and Bezier_To(). It handles all */
+ /* weird cases, like when the first point is off the curve, or when */
+ /* there are simply no `on' points in the contour! */
+ /* */
+ /* <Input> */
+ /* first :: The index of the first point in the contour. */
+ /* */
+ /* last :: The index of the last point in the contour. */
+ /* */
+ /* flipped :: If set, flip the direction of the curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on error. */
+ /* */
+ static Bool
+ Decompose_Curve( RAS_ARGS UShort first,
+ UShort last,
+ int flipped )
+ {
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* points;
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ unsigned tag; /* current point's state */
+
+
+ points = ras.outline.points;
+ limit = points + last;
+
+ v_start.x = SCALED( points[first].x );
+ v_start.y = SCALED( points[first].y );
+ v_last.x = SCALED( points[last].x );
+ v_last.y = SCALED( points[last].y );
+
+ if ( flipped )
+ {
+ SWAP_( v_start.x, v_start.y );
+ SWAP_( v_last.x, v_last.y );
+ }
+
+ v_control = v_start;
+
+ point = points + first;
+ tags = ras.outline.tags + first;
+
+ /* set scan mode if necessary */
+ if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
+ ras.dropOutControl = (Byte)tags[0] >> 5;
+
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ ras.lastX = v_start.x;
+ ras.lastY = v_start.y;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ Long x, y;
+
+
+ x = SCALED( point->x );
+ y = SCALED( point->y );
+ if ( flipped )
+ SWAP_( x, y );
+
+ if ( Line_To( RAS_VARS x, y ) )
+ goto Fail;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point[0].x );
+ v_control.y = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( v_control.x, v_control.y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector v_middle;
+ Long x, y;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ x = SCALED( point[0].x );
+ y = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( x, y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
+ goto Fail;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + x ) / 2;
+ v_middle.y = ( v_control.y + y ) / 2;
+
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_middle.x, v_middle.y ) )
+ goto Fail;
+
+ v_control.x = x;
+ v_control.y = y;
+
+ goto Do_Conic;
+ }
+
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_start.x, v_start.y ) )
+ goto Fail;
+
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ Long x1, y1, x2, y2, x3, y3;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ x1 = SCALED( point[-2].x );
+ y1 = SCALED( point[-2].y );
+ x2 = SCALED( point[-1].x );
+ y2 = SCALED( point[-1].y );
+
+ if ( flipped )
+ {
+ SWAP_( x1, y1 );
+ SWAP_( x2, y2 );
+ }
+
+ if ( point <= limit )
+ {
+ x3 = SCALED( point[0].x );
+ y3 = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( x3, y3 );
+
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
+ goto Fail;
+ continue;
+ }
+
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
+ goto Fail;
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
+ goto Fail;
+
+ Close:
+ return SUCCESS;
+
+ Invalid_Outline:
+ ras.error = FT_THROW( Invalid );
+
+ Fail:
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Convert_Glyph */
+ /* */
+ /* <Description> */
+ /* Convert a glyph into a series of segments and arcs and make a */
+ /* profiles list with them. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE if any error was encountered during */
+ /* rendering. */
+ /* */
+ static Bool
+ Convert_Glyph( RAS_ARGS int flipped )
+ {
+ int i;
+ unsigned start;
+
+
+ ras.fProfile = NULL;
+ ras.joint = FALSE;
+ ras.fresh = FALSE;
+
+ ras.maxBuff = ras.sizeBuff - AlignProfileSize;
+
+ ras.numTurns = 0;
+
+ ras.cProfile = (PProfile)ras.top;
+ ras.cProfile->offset = ras.top;
+ ras.num_Profs = 0;
+
+ start = 0;
+
+ for ( i = 0; i < ras.outline.n_contours; i++ )
+ {
+ PProfile lastProfile;
+ Bool o;
+
+
+ ras.state = Unknown_State;
+ ras.gProfile = NULL;
+
+ if ( Decompose_Curve( RAS_VARS (unsigned short)start,
+ ras.outline.contours[i],
+ flipped ) )
+ return FAILURE;
+
+ start = ras.outline.contours[i] + 1;
+
+ /* we must now check whether the extreme arcs join or not */
+ if ( FRAC( ras.lastY ) == 0 &&
+ ras.lastY >= ras.minY &&
+ ras.lastY <= ras.maxY )
+ if ( ras.gProfile &&
+ ( ras.gProfile->flags & Flow_Up ) ==
+ ( ras.cProfile->flags & Flow_Up ) )
+ ras.top--;
+ /* Note that ras.gProfile can be nil if the contour was too small */
+ /* to be drawn. */
+
+ lastProfile = ras.cProfile;
+ if ( ras.cProfile->flags & Flow_Up )
+ o = IS_TOP_OVERSHOOT( ras.lastY );
+ else
+ o = IS_BOTTOM_OVERSHOOT( ras.lastY );
+ if ( End_Profile( RAS_VARS o ) )
+ return FAILURE;
+
+ /* close the `next profile in contour' linked list */
+ if ( ras.gProfile )
+ lastProfile->next = ras.gProfile;
+ }
+
+ if ( Finalize_Profile_Table( RAS_VAR ) )
+ return FAILURE;
+
+ return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SCAN-LINE SWEEPS AND DRAWING **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Init_Linked */
+ /* */
+ /* Initializes an empty linked list. */
+ /* */
+ static void
+ Init_Linked( TProfileList* l )
+ {
+ *l = NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* InsNew */
+ /* */
+ /* Inserts a new profile in a linked list. */
+ /* */
+ static void
+ InsNew( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+ Long x;
+
+
+ old = list;
+ current = *old;
+ x = profile->X;
+
+ while ( current )
+ {
+ if ( x < current->X )
+ break;
+ old = &current->link;
+ current = *old;
+ }
+
+ profile->link = current;
+ *old = profile;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DelOld */
+ /* */
+ /* Removes an old profile from a linked list. */
+ /* */
+ static void
+ DelOld( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+
+
+ old = list;
+ current = *old;
+
+ while ( current )
+ {
+ if ( current == profile )
+ {
+ *old = current->link;
+ return;
+ }
+
+ old = &current->link;
+ current = *old;
+ }
+
+ /* we should never get there, unless the profile was not part of */
+ /* the list. */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Sort */
+ /* */
+ /* Sorts a trace list. In 95%, the list is already sorted. We need */
+ /* an algorithm which is fast in this case. Bubble sort is enough */
+ /* and simple. */
+ /* */
+ static void
+ Sort( PProfileList list )
+ {
+ PProfile *old, current, next;
+
+
+ /* First, set the new X coordinate of each profile */
+ current = *list;
+ while ( current )
+ {
+ current->X = *current->offset;
+ current->offset += current->flags & Flow_Up ? 1 : -1;
+ current->height--;
+ current = current->link;
+ }
+
+ /* Then sort them */
+ old = list;
+ current = *old;
+
+ if ( !current )
+ return;
+
+ next = current->link;
+
+ while ( next )
+ {
+ if ( current->X <= next->X )
+ {
+ old = &current->link;
+ current = *old;
+
+ if ( !current )
+ return;
+ }
+ else
+ {
+ *old = next;
+ current->link = next->link;
+ next->link = current;
+
+ old = list;
+ current = *old;
+ }
+
+ next = current->link;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Vertical Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the vertical black/white sweep */
+ /* phase by the generic Draw_Sweep() function. */
+ /* */
+ /*************************************************************************/
+
+ static void
+ Vertical_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ Long pitch = ras.target.pitch;
+
+ FT_UNUSED( max );
+
+
+ ras.traceIncr = (Short)-pitch;
+ ras.traceOfs = -*min * pitch;
+ if ( pitch > 0 )
+ ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
+
+ ras.gray_min_x = 0;
+ ras.gray_max_x = 0;
+ }
+
+
+ static void
+ Vertical_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ Byte* target;
+
+ FT_UNUSED( y );
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+
+
+ /* Drop-out control */
+
+ e1 = TRUNC( CEILING( x1 ) );
+
+ if ( x2 - x1 - ras.precision <= ras.precision_jitter )
+ e2 = e1;
+ else
+ e2 = TRUNC( FLOOR( x2 ) );
+
+ if ( e2 >= 0 && e1 < ras.bWidth )
+ {
+ int c1, c2;
+ Byte f1, f2;
+
+
+ if ( e1 < 0 )
+ e1 = 0;
+ if ( e2 >= ras.bWidth )
+ e2 = ras.bWidth - 1;
+
+ c1 = (Short)( e1 >> 3 );
+ c2 = (Short)( e2 >> 3 );
+
+ f1 = (Byte) ( 0xFF >> ( e1 & 7 ) );
+ f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
+
+ if ( ras.gray_min_x > c1 )
+ ras.gray_min_x = (short)c1;
+ if ( ras.gray_max_x < c2 )
+ ras.gray_max_x = (short)c2;
+
+ target = ras.bTarget + ras.traceOfs + c1;
+ c2 -= c1;
+
+ if ( c2 > 0 )
+ {
+ target[0] |= f1;
+
+ /* memset() is slower than the following code on many platforms. */
+ /* This is due to the fact that, in the vast majority of cases, */
+ /* the span length in bytes is relatively small. */
+ c2--;
+ while ( c2 > 0 )
+ {
+ *(++target) = 0xFF;
+ c2--;
+ }
+ target[1] |= f2;
+ }
+ else
+ *target |= ( f1 & f2 );
+ }
+ }
+
+
+ static void
+ Vertical_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2, pxl;
+ Short c1, f1;
+
+
+ /* Drop-out control */
+
+ /* e2 x2 x1 e1 */
+ /* */
+ /* ^ | */
+ /* | | */
+ /* +-------------+---------------------+------------+ */
+ /* | | */
+ /* | v */
+ /* */
+ /* pixel contour contour pixel */
+ /* center center */
+
+ /* drop-out mode scan conversion rules (as defined in OpenType) */
+ /* --------------------------------------------------------------- */
+ /* 0 1, 2, 3 */
+ /* 1 1, 2, 4 */
+ /* 2 1, 2 */
+ /* 3 same as mode 2 */
+ /* 4 1, 2, 5 */
+ /* 5 1, 2, 6 */
+ /* 6, 7 same as mode 2 */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+ pxl = e1;
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ pxl = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+
+ /* Drop-out Control Rules #4 and #6 */
+
+ /* The specification neither provides an exact definition */
+ /* of a `stub' nor gives exact rules to exclude them. */
+ /* */
+ /* Here the constraints we use to recognize a stub. */
+ /* */
+ /* upper stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Right is the successor of P_Left in that contour */
+ /* - y is the top of P_Left and P_Right */
+ /* */
+ /* lower stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Left is the successor of P_Right in that contour */
+ /* - y is the bottom of P_Left */
+ /* */
+ /* We draw a stub if the following constraints are met. */
+ /* */
+ /* - for an upper or lower stub, there is top or bottom */
+ /* overshoot, respectively */
+ /* - the covered interval is greater or equal to a half */
+ /* pixel */
+
+ /* upper stub test */
+ if ( left->next == right &&
+ left->height <= 0 &&
+ !( left->flags & Overshoot_Top &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ /* lower stub test */
+ if ( right->next == left &&
+ left->start == y &&
+ !( left->flags & Overshoot_Bottom &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ if ( dropOutControl == 1 )
+ pxl = e2;
+ else
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+
+ /* undocumented but confirmed: If the drop-out would result in a */
+ /* pixel outside of the bounding box, use the pixel inside of the */
+ /* bounding box instead */
+ if ( pxl < 0 )
+ pxl = e1;
+ else if ( TRUNC( pxl ) >= ras.bWidth )
+ pxl = e2;
+
+ /* check that the other pixel isn't set */
+ e1 = pxl == e1 ? e2 : e1;
+
+ e1 = TRUNC( e1 );
+
+ c1 = (Short)( e1 >> 3 );
+ f1 = (Short)( e1 & 7 );
+
+ if ( e1 >= 0 && e1 < ras.bWidth &&
+ ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
+ return;
+ }
+ else
+ return;
+ }
+
+ e1 = TRUNC( pxl );
+
+ if ( e1 >= 0 && e1 < ras.bWidth )
+ {
+ c1 = (Short)( e1 >> 3 );
+ f1 = (Short)( e1 & 7 );
+
+ if ( ras.gray_min_x > c1 )
+ ras.gray_min_x = c1;
+ if ( ras.gray_max_x < c1 )
+ ras.gray_max_x = c1;
+
+ ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
+ }
+ }
+
+
+ static void
+ Vertical_Sweep_Step( RAS_ARG )
+ {
+ ras.traceOfs += ras.traceIncr;
+ }
+
+
+ /***********************************************************************/
+ /* */
+ /* Horizontal Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the horizontal black/white */
+ /* sweep phase by the generic Draw_Sweep() function. */
+ /* */
+ /***********************************************************************/
+
+ static void
+ Horizontal_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ /* nothing, really */
+ FT_UNUSED_RASTER;
+ FT_UNUSED( min );
+ FT_UNUSED( max );
+ }
+
+
+ static void
+ Horizontal_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+
+
+ if ( x2 - x1 < ras.precision )
+ {
+ Long e1, e2;
+
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 == e2 )
+ {
+ Byte f1;
+ PByte bits;
+
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ e1 = TRUNC( e1 );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ PByte p;
+
+
+ p = bits - e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ p += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ p[0] |= f1;
+ }
+ }
+ }
+ }
+
+
+ static void
+ Horizontal_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2, pxl;
+ PByte bits;
+ Byte f1;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+
+ /* e1 + <-- pixel center */
+ /* | */
+ /* x1 ---+--> <-- contour */
+ /* | */
+ /* | */
+ /* x2 <--+--- <-- contour */
+ /* | */
+ /* | */
+ /* e2 + <-- pixel center */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+ pxl = e1;
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ pxl = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+ /* see Vertical_Sweep_Drop for details */
+
+ /* rightmost stub test */
+ if ( left->next == right &&
+ left->height <= 0 &&
+ !( left->flags & Overshoot_Top &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ /* leftmost stub test */
+ if ( right->next == left &&
+ left->start == y &&
+ !( left->flags & Overshoot_Bottom &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ if ( dropOutControl == 1 )
+ pxl = e2;
+ else
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+
+ /* undocumented but confirmed: If the drop-out would result in a */
+ /* pixel outside of the bounding box, use the pixel inside of the */
+ /* bounding box instead */
+ if ( pxl < 0 )
+ pxl = e1;
+ else if ( TRUNC( pxl ) >= ras.target.rows )
+ pxl = e2;
+
+ /* check that the other pixel isn't set */
+ e1 = pxl == e1 ? e2 : e1;
+
+ e1 = TRUNC( e1 );
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ if ( e1 >= 0 &&
+ e1 < ras.target.rows &&
+ *bits & f1 )
+ return;
+ }
+ else
+ return;
+ }
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ e1 = TRUNC( pxl );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ bits[0] |= f1;
+ }
+ }
+
+
+ static void
+ Horizontal_Sweep_Step( RAS_ARG )
+ {
+ /* Nothing, really */
+ FT_UNUSED_RASTER;
+ }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+
+ /*************************************************************************/
+ /* */
+ /* Vertical Gray Sweep Procedure Set */
+ /* */
+ /* These two routines are used during the vertical gray-levels sweep */
+ /* phase by the generic Draw_Sweep() function. */
+ /* */
+ /* NOTES */
+ /* */
+ /* - The target pixmap's width *must* be a multiple of 4. */
+ /* */
+ /* - You have to use the function Vertical_Sweep_Span() for the gray */
+ /* span call. */
+ /* */
+ /*************************************************************************/
+
+ static void
+ Vertical_Gray_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ Long pitch, byte_len;
+
+
+ *min = *min & -2;
+ *max = ( *max + 3 ) & -2;
+
+ ras.traceOfs = 0;
+ pitch = ras.target.pitch;
+ byte_len = -pitch;
+ ras.traceIncr = (Short)byte_len;
+ ras.traceG = ( *min / 2 ) * byte_len;
+
+ if ( pitch > 0 )
+ {
+ ras.traceG += ( ras.target.rows - 1 ) * pitch;
+ byte_len = -byte_len;
+ }
+
+ ras.gray_min_x = (Short)byte_len;
+ ras.gray_max_x = -(Short)byte_len;
+ }
+
+
+ static void
+ Vertical_Gray_Sweep_Step( RAS_ARG )
+ {
+ short* count = (short*)count_table;
+ Byte* grays;
+
+
+ ras.traceOfs += ras.gray_width;
+
+ if ( ras.traceOfs > ras.gray_width )
+ {
+ PByte pix;
+
+
+ pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
+ grays = ras.grays;
+
+ if ( ras.gray_max_x >= 0 )
+ {
+ Long last_pixel = ras.target.width - 1;
+ Int last_cell = last_pixel >> 2;
+ Int last_bit = last_pixel & 3;
+ Bool over = 0;
+
+ Int c1, c2;
+ PByte bit, bit2;
+
+
+ if ( ras.gray_max_x >= last_cell && last_bit != 3 )
+ {
+ ras.gray_max_x = last_cell - 1;
+ over = 1;
+ }
+
+ if ( ras.gray_min_x < 0 )
+ ras.gray_min_x = 0;
+
+ bit = ras.bTarget + ras.gray_min_x;
+ bit2 = bit + ras.gray_width;
+
+ c1 = ras.gray_max_x - ras.gray_min_x;
+
+ while ( c1 >= 0 )
+ {
+ c2 = count[*bit] + count[*bit2];
+
+ if ( c2 )
+ {
+ pix[0] = grays[(c2 >> 12) & 0x000F];
+ pix[1] = grays[(c2 >> 8 ) & 0x000F];
+ pix[2] = grays[(c2 >> 4 ) & 0x000F];
+ pix[3] = grays[ c2 & 0x000F];
+
+ *bit = 0;
+ *bit2 = 0;
+ }
+
+ bit++;
+ bit2++;
+ pix += 4;
+ c1--;
+ }
+
+ if ( over )
+ {
+ c2 = count[*bit] + count[*bit2];
+ if ( c2 )
+ {
+ switch ( last_bit )
+ {
+ case 2:
+ pix[2] = grays[(c2 >> 4 ) & 0x000F];
+ case 1:
+ pix[1] = grays[(c2 >> 8 ) & 0x000F];
+ default:
+ pix[0] = grays[(c2 >> 12) & 0x000F];
+ }
+
+ *bit = 0;
+ *bit2 = 0;
+ }
+ }
+ }
+
+ ras.traceOfs = 0;
+ ras.traceG += ras.traceIncr;
+
+ ras.gray_min_x = 32000;
+ ras.gray_max_x = -32000;
+ }
+ }
+
+
+ static void
+ Horizontal_Gray_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ /* nothing, really */
+ FT_UNUSED_RASTER;
+ FT_UNUSED( y );
+ FT_UNUSED( x1 );
+ FT_UNUSED( x2 );
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+ }
+
+
+ static void
+ Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ PByte pixel;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ e1 = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+ /* see Vertical_Sweep_Drop for details */
+
+ /* rightmost stub test */
+ if ( left->next == right && left->height <= 0 )
+ return;
+
+ /* leftmost stub test */
+ if ( right->next == left && left->start == y )
+ return;
+
+ if ( dropOutControl == 1 )
+ e1 = e2;
+ else
+ e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+ }
+ else
+ return;
+ }
+
+ if ( e1 >= 0 )
+ {
+ Byte color;
+
+
+ if ( x2 - x1 >= ras.precision_half )
+ color = ras.grays[2];
+ else
+ color = ras.grays[1];
+
+ e1 = TRUNC( e1 ) / 2;
+ if ( e1 < ras.target.rows )
+ {
+ pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
+ if ( ras.target.pitch > 0 )
+ pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ if ( pixel[0] == ras.grays[0] )
+ pixel[0] = color;
+ }
+ }
+ }
+
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+ /*************************************************************************/
+ /* */
+ /* Generic Sweep Drawing routine */
+ /* */
+ /*************************************************************************/
+
+ static Bool
+ Draw_Sweep( RAS_ARG )
+ {
+ Short y, y_change, y_height;
+
+ PProfile P, Q, P_Left, P_Right;
+
+ Short min_Y, max_Y, top, bottom, dropouts;
+
+ Long x1, x2, xs, e1, e2;
+
+ TProfileList waiting;
+ TProfileList draw_left, draw_right;
+
+
+ /* initialize empty linked lists */
+
+ Init_Linked( &waiting );
+
+ Init_Linked( &draw_left );
+ Init_Linked( &draw_right );
+
+ /* first, compute min and max Y */
+
+ P = ras.fProfile;
+ max_Y = (Short)TRUNC( ras.minY );
+ min_Y = (Short)TRUNC( ras.maxY );
+
+ while ( P )
+ {
+ Q = P->link;
+
+ bottom = (Short)P->start;
+ top = (Short)( P->start + P->height - 1 );
+
+ if ( min_Y > bottom )
+ min_Y = bottom;
+ if ( max_Y < top )
+ max_Y = top;
+
+ P->X = 0;
+ InsNew( &waiting, P );
+
+ P = Q;
+ }
+
+ /* check the Y-turns */
+ if ( ras.numTurns == 0 )
+ {
+ ras.error = FT_THROW( Invalid );
+ return FAILURE;
+ }
+
+ /* now initialize the sweep */
+
+ ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+
+ /* then compute the distance of each profile from min_Y */
+
+ P = waiting;
+
+ while ( P )
+ {
+ P->countL = (UShort)( P->start - min_Y );
+ P = P->link;
+ }
+
+ /* let's go */
+
+ y = min_Y;
+ y_height = 0;
+
+ if ( ras.numTurns > 0 &&
+ ras.sizeBuff[-ras.numTurns] == min_Y )
+ ras.numTurns--;
+
+ while ( ras.numTurns > 0 )
+ {
+ /* check waiting list for new activations */
+
+ P = waiting;
+
+ while ( P )
+ {
+ Q = P->link;
+ P->countL -= y_height;
+ if ( P->countL == 0 )
+ {
+ DelOld( &waiting, P );
+
+ if ( P->flags & Flow_Up )
+ InsNew( &draw_left, P );
+ else
+ InsNew( &draw_right, P );
+ }
+
+ P = Q;
+ }
+
+ /* sort the drawing lists */
+
+ Sort( &draw_left );
+ Sort( &draw_right );
+
+ y_change = (Short)ras.sizeBuff[-ras.numTurns--];
+ y_height = (Short)( y_change - y );
+
+ while ( y < y_change )
+ {
+ /* let's trace */
+
+ dropouts = 0;
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ x1 = P_Left ->X;
+ x2 = P_Right->X;
+
+ if ( x1 > x2 )
+ {
+ xs = x1;
+ x1 = x2;
+ x2 = xs;
+ }
+
+ e1 = FLOOR( x1 );
+ e2 = CEILING( x2 );
+
+ if ( x2 - x1 <= ras.precision &&
+ e1 != x1 && e2 != x2 )
+ {
+ if ( e1 > e2 || e2 == e1 + ras.precision )
+ {
+ Int dropOutControl = P_Left->flags & 7;
+
+
+ if ( dropOutControl != 2 )
+ {
+ /* a drop-out was detected */
+
+ P_Left ->X = x1;
+ P_Right->X = x2;
+
+ /* mark profile for drop-out processing */
+ P_Left->countL = 1;
+ dropouts++;
+ }
+
+ goto Skip_To_Next;
+ }
+ }
+
+ ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+
+ Skip_To_Next:
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ /* handle drop-outs _after_ the span drawing -- */
+ /* drop-out processing has been moved out of the loop */
+ /* for performance tuning */
+ if ( dropouts > 0 )
+ goto Scan_DropOuts;
+
+ Next_Line:
+
+ ras.Proc_Sweep_Step( RAS_VAR );
+
+ y++;
+
+ if ( y < y_change )
+ {
+ Sort( &draw_left );
+ Sort( &draw_right );
+ }
+ }
+
+ /* now finalize the profiles that need it */
+
+ P = draw_left;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_left, P );
+ P = Q;
+ }
+
+ P = draw_right;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_right, P );
+ P = Q;
+ }
+ }
+
+ /* for gray-scaling, flush the bitmap scanline cache */
+ while ( y <= max_Y )
+ {
+ ras.Proc_Sweep_Step( RAS_VAR );
+ y++;
+ }
+
+ return SUCCESS;
+
+ Scan_DropOuts:
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ if ( P_Left->countL )
+ {
+ P_Left->countL = 0;
+#if 0
+ dropouts--; /* -- this is useful when debugging only */
+#endif
+ ras.Proc_Sweep_Drop( RAS_VARS y,
+ P_Left->X,
+ P_Right->X,
+ P_Left,
+ P_Right );
+ }
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ goto Next_Line;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Single_Pass */
+ /* */
+ /* <Description> */
+ /* Perform one sweep with sub-banding. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of the outline. */
+ /* */
+ /* <Return> */
+ /* Renderer error code. */
+ /* */
+ static int
+ Render_Single_Pass( RAS_ARGS Bool flipped )
+ {
+ Short i, j, k;
+
+
+ while ( ras.band_top >= 0 )
+ {
+ ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
+ ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
+
+ ras.top = ras.buff;
+
+ ras.error = Raster_Err_None;
+
+ if ( Convert_Glyph( RAS_VARS flipped ) )
+ {
+ if ( ras.error != Raster_Err_Overflow )
+ return FAILURE;
+
+ ras.error = Raster_Err_None;
+
+ /* sub-banding */
+
+#ifdef DEBUG_RASTER
+ ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
+
+ i = ras.band_stack[ras.band_top].y_min;
+ j = ras.band_stack[ras.band_top].y_max;
+
+ k = (Short)( ( i + j ) / 2 );
+
+ if ( ras.band_top >= 7 || k < i )
+ {
+ ras.band_top = 0;
+ ras.error = FT_THROW( Invalid );
+
+ return ras.error;
+ }
+
+ ras.band_stack[ras.band_top + 1].y_min = k;
+ ras.band_stack[ras.band_top + 1].y_max = j;
+
+ ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
+
+ ras.band_top++;
+ }
+ else
+ {
+ if ( ras.fProfile )
+ if ( Draw_Sweep( RAS_VAR ) )
+ return ras.error;
+ ras.band_top--;
+ }
+ }
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Render a glyph in a bitmap. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Render_Glyph( RAS_ARG )
+ {
+ FT_Error error;
+
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ FT_OUTLINE_HIGH_PRECISION );
+ ras.scale_shift = ras.precision_shift;
+
+ if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+ ras.dropOutControl = 2;
+ else
+ {
+ if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+ ras.dropOutControl = 4;
+ else
+ ras.dropOutControl = 0;
+
+ if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+ ras.dropOutControl += 1;
+ }
+
+ ras.second_pass = (FT_Byte)( !( ras.outline.flags &
+ FT_OUTLINE_SINGLE_PASS ) );
+
+ /* Vertical Sweep */
+ ras.Proc_Sweep_Init = Vertical_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );
+
+ ras.bWidth = (unsigned short)ras.target.width;
+ ras.bTarget = (Byte*)ras.target.buffer;
+
+ if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
+ return error;
+
+ /* Horizontal Sweep */
+ if ( ras.second_pass && ras.dropOutControl != 2 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = (short)( ras.target.width - 1 );
+
+ if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
+ return error;
+ }
+
+ return Raster_Err_None;
+ }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Gray_Glyph */
+ /* */
+ /* <Description> */
+ /* Render a glyph with grayscaling. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Render_Gray_Glyph( RAS_ARG )
+ {
+ Long pixel_width;
+ FT_Error error;
+
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ FT_OUTLINE_HIGH_PRECISION );
+ ras.scale_shift = ras.precision_shift + 1;
+
+ if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+ ras.dropOutControl = 2;
+ else
+ {
+ if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+ ras.dropOutControl = 4;
+ else
+ ras.dropOutControl = 0;
+
+ if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+ ras.dropOutControl += 1;
+ }
+
+ ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );
+
+ /* Vertical Sweep */
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
+
+ ras.bWidth = ras.gray_width;
+ pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
+
+ if ( ras.bWidth > pixel_width )
+ ras.bWidth = pixel_width;
+
+ ras.bWidth = ras.bWidth * 8;
+ ras.bTarget = (Byte*)ras.gray_lines;
+ ras.gTarget = (Byte*)ras.target.buffer;
+
+ ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
+
+ error = Render_Single_Pass( RAS_VARS 0 );
+ if ( error )
+ return error;
+
+ /* Horizontal Sweep */
+ if ( ras.second_pass && ras.dropOutControl != 2 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = ras.target.width * 2 - 1;
+
+ error = Render_Single_Pass( RAS_VARS 1 );
+ if ( error )
+ return error;
+ }
+
+ return Raster_Err_None;
+ }
+
+#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+ FT_LOCAL_DEF( FT_Error )
+ Render_Gray_Glyph( RAS_ARG )
+ {
+ FT_UNUSED_RASTER;
+
+ return FT_THROW( Unsupported );
+ }
+
+#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+ static void
+ ft_black_init( black_PRaster raster )
+ {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+ FT_UInt n;
+
+
+ /* set default 5-levels gray palette */
+ for ( n = 0; n < 5; n++ )
+ raster->grays[n] = n * 255 / 4;
+
+ raster->gray_width = RASTER_GRAY_LINES / 2;
+#else
+ FT_UNUSED( raster );
+#endif
+ }
+
+
+ /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+ /**** a static object. *****/
+
+
+#ifdef _STANDALONE_
+
+
+ static int
+ ft_black_new( void* memory,
+ FT_Raster *araster )
+ {
+ static black_TRaster the_raster;
+ FT_UNUSED( memory );
+
+
+ *araster = (FT_Raster)&the_raster;
+ FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+ ft_black_init( &the_raster );
+
+ return 0;
+ }
+
+
+ static void
+ ft_black_done( FT_Raster raster )
+ {
+ /* nothing */
+ FT_UNUSED( raster );
+ }
+
+
+#else /* !_STANDALONE_ */
+
+
+ static int
+ ft_black_new( FT_Memory memory,
+ black_PRaster *araster )
+ {
+ FT_Error error;
+ black_PRaster raster = NULL;
+
+
+ *araster = 0;
+ if ( !FT_NEW( raster ) )
+ {
+ raster->memory = memory;
+ ft_black_init( raster );
+
+ *araster = raster;
+ }
+
+ return error;
+ }
+
+
+ static void
+ ft_black_done( black_PRaster raster )
+ {
+ FT_Memory memory = (FT_Memory)raster->memory;
+
+
+ FT_FREE( raster );
+ }
+
+
+#endif /* !_STANDALONE_ */
+
+
+ static void
+ ft_black_reset( black_PRaster raster,
+ char* pool_base,
+ long pool_size )
+ {
+ if ( raster )
+ {
+ if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )
+ {
+ black_PWorker worker = (black_PWorker)pool_base;
+
+
+ raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );
+ raster->buffer_size = (long)( pool_base + pool_size -
+ (char*)raster->buffer );
+ raster->worker = worker;
+ }
+ else
+ {
+ raster->buffer = NULL;
+ raster->buffer_size = 0;
+ raster->worker = NULL;
+ }
+ }
+ }
+
+
+ static void
+ ft_black_set_mode( black_PRaster raster,
+ unsigned long mode,
+ const char* palette )
+ {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
+ {
+ /* set 5-levels gray palette */
+ raster->grays[0] = palette[0];
+ raster->grays[1] = palette[1];
+ raster->grays[2] = palette[2];
+ raster->grays[3] = palette[3];
+ raster->grays[4] = palette[4];
+ }
+
+#else
+
+ FT_UNUSED( raster );
+ FT_UNUSED( mode );
+ FT_UNUSED( palette );
+
+#endif
+ }
+
+
+ static int
+ ft_black_render( black_PRaster raster,
+ const FT_Raster_Params* params )
+ {
+ const FT_Outline* outline = (const FT_Outline*)params->source;
+ const FT_Bitmap* target_map = params->target;
+ black_PWorker worker;
+
+
+ if ( !raster || !raster->buffer || !raster->buffer_size )
+ return FT_THROW( Not_Ini );
+
+ if ( !outline )
+ return FT_THROW( Invalid );
+
+ /* return immediately if the outline is empty */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ return Raster_Err_None;
+
+ if ( !outline->contours || !outline->points )
+ return FT_THROW( Invalid );
+
+ if ( outline->n_points !=
+ outline->contours[outline->n_contours - 1] + 1 )
+ return FT_THROW( Invalid );
+
+ worker = raster->worker;
+
+ /* this version of the raster does not support direct rendering, sorry */
+ if ( params->flags & FT_RASTER_FLAG_DIRECT )
+ return FT_THROW( Unsupported );
+
+ if ( !target_map )
+ return FT_THROW( Invalid );
+
+ /* nothing to do */
+ if ( !target_map->width || !target_map->rows )
+ return Raster_Err_None;
+
+ if ( !target_map->buffer )
+ return FT_THROW( Invalid );
+
+ ras.outline = *outline;
+ ras.target = *target_map;
+
+ worker->buff = (PLong) raster->buffer;
+ worker->sizeBuff = worker->buff +
+ raster->buffer_size / sizeof ( Long );
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+ worker->grays = raster->grays;
+ worker->gray_width = raster->gray_width;
+
+ FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );
+#endif
+
+ return ( params->flags & FT_RASTER_FLAG_AA )
+ ? Render_Gray_Glyph( RAS_VAR )
+ : Render_Glyph( RAS_VAR );
+ }
+
+
+ FT_DEFINE_RASTER_FUNCS( ft_standard_raster,
+ FT_GLYPH_FORMAT_OUTLINE,
+ (FT_Raster_New_Func) ft_black_new,
+ (FT_Raster_Reset_Func) ft_black_reset,
+ (FT_Raster_Set_Mode_Func)ft_black_set_mode,
+ (FT_Raster_Render_Func) ft_black_render,
+ (FT_Raster_Done_Func) ft_black_done
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
new file mode 100644
index 0000000000..b77260f7d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ftraster.h */
+/* */
+/* The FreeType glyph rasterizer (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTRASTER_H__
+#define __FTRASTER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftimage.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* Uncomment the following line if you are using ftraster.c as a */
+ /* standalone module, fully independent of FreeType. */
+ /* */
+/* #define _STANDALONE_ */
+
+ FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster;
+
+
+FT_END_HEADER
+
+#endif /* __FTRASTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
new file mode 100644
index 0000000000..0f4ffabf97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/* */
+/* ftrend1.c */
+/* */
+/* The FreeType glyph rasterizer interface (body). */
+/* */
+/* Copyright 1996-2003, 2005, 2006, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftrend1.h"
+#include "ftraster.h"
+#include "rastpic.h"
+
+#include "rasterrs.h"
+
+
+ /* initialize renderer -- init its raster */
+ static FT_Error
+ ft_raster1_init( FT_Renderer render )
+ {
+ FT_Library library = FT_MODULE_LIBRARY( render );
+
+
+ render->clazz->raster_class->raster_reset( render->raster,
+ library->raster_pool,
+ library->raster_pool_size );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* set render-specific mode */
+ static FT_Error
+ ft_raster1_set_mode( FT_Renderer render,
+ FT_ULong mode_tag,
+ FT_Pointer data )
+ {
+ /* we simply pass it to the raster */
+ return render->clazz->raster_class->raster_set_mode( render->raster,
+ mode_tag,
+ data );
+ }
+
+
+ /* transform a given glyph image */
+ static FT_Error
+ ft_raster1_transform( FT_Renderer render,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( matrix )
+ FT_Outline_Transform( &slot->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+ Exit:
+ return error;
+ }
+
+
+ /* return the glyph's control box */
+ static void
+ ft_raster1_get_cbox( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox )
+ {
+ FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+ if ( slot->format == render->glyph_format )
+ FT_Outline_Get_CBox( &slot->outline, cbox );
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_raster1_render( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+ FT_Outline* outline;
+ FT_BBox cbox;
+ FT_UInt width, height, pitch;
+ FT_Bitmap* bitmap;
+ FT_Memory memory;
+
+ FT_Raster_Params params;
+
+
+ /* check glyph image format */
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* check rendering mode */
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( mode != FT_RENDER_MODE_MONO )
+ {
+ /* raster1 is only capable of producing monochrome bitmaps */
+ if ( render->clazz == &ft_raster1_renderer_class )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+ else
+ {
+ /* raster5 is only capable of producing 5-gray-levels bitmaps */
+ if ( render->clazz == &ft_raster5_renderer_class )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+#else /* FT_CONFIG_OPTION_PIC */
+ /* When PIC is enabled, we cannot get to the class object */
+ /* so instead we check the final character in the class name */
+ /* ("raster5" or "raster1"). Yes this is a hack. */
+ /* The "correct" thing to do is have different render function */
+ /* for each of the classes. */
+ if ( mode != FT_RENDER_MODE_MONO )
+ {
+ /* raster1 is only capable of producing monochrome bitmaps */
+ if ( render->clazz->root.module_name[6] == '1' )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+ else
+ {
+ /* raster5 is only capable of producing 5-gray-levels bitmaps */
+ if ( render->clazz->root.module_name[6] == '5' )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ outline = &slot->outline;
+
+ /* translate the outline to the new origin if needed */
+ if ( origin )
+ FT_Outline_Translate( outline, origin->x, origin->y );
+
+ /* compute the control box, and grid fit it */
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ /* undocumented but confirmed: bbox values get rounded */
+#if 1
+ cbox.xMin = FT_PIX_ROUND( cbox.xMin );
+ cbox.yMin = FT_PIX_ROUND( cbox.yMin );
+ cbox.xMax = FT_PIX_ROUND( cbox.xMax );
+ cbox.yMax = FT_PIX_ROUND( cbox.yMax );
+#else
+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+ cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+#endif
+
+ width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
+ height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
+
+ if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ bitmap = &slot->bitmap;
+ memory = render->root.memory;
+
+ /* release old bitmap buffer */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ /* allocate new one, depends on pixel format */
+ if ( !( mode & FT_RENDER_MODE_MONO ) )
+ {
+ /* we pad to 32 bits, only for backwards compatibility with FT 1.x */
+ pitch = FT_PAD_CEIL( width, 4 );
+ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+ bitmap->num_grays = 256;
+ }
+ else
+ {
+ pitch = ( ( width + 15 ) >> 4 ) << 1;
+ bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+ }
+
+ bitmap->width = width;
+ bitmap->rows = height;
+ bitmap->pitch = pitch;
+
+ if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+ goto Exit;
+
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ /* translate outline to render it into the bitmap */
+ FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+
+ /* set up parameters */
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = 0;
+
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )
+ params.flags |= FT_RASTER_FLAG_AA;
+
+ /* render outline into the bitmap */
+ error = render->raster_render( render->raster, &params );
+
+ FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
+
+ if ( error )
+ goto Exit;
+
+ slot->format = FT_GLYPH_FORMAT_BITMAP;
+ slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
+ slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_DEFINE_RENDERER( ft_raster1_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "raster1",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_raster1_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_raster1_render,
+ (FT_Renderer_TransformFunc)ft_raster1_transform,
+ (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
+
+ (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
+ )
+
+
+ /* This renderer is _NOT_ part of the default modules; you will need */
+ /* to register it by hand in your application. It should only be */
+ /* used for backwards-compatibility with FT 1.x anyway. */
+ /* */
+ FT_DEFINE_RENDERER( ft_raster5_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "raster5",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_raster1_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_raster1_render,
+ (FT_Renderer_TransformFunc)ft_raster1_transform,
+ (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
+
+ (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
new file mode 100644
index 0000000000..9767e120ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
@@ -0,0 +1,44 @@
+/***************************************************************************/
+/* */
+/* ftrend1.h */
+/* */
+/* The FreeType glyph rasterizer interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTREND1_H__
+#define __FTREND1_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_RENDERER( ft_raster1_renderer_class )
+
+ /* this renderer is _NOT_ part of the default modules, you'll need */
+ /* to register it by hand in your application. It should only be */
+ /* used for backwards-compatibility with FT 1.x anyway. */
+ /* */
+ FT_DECLARE_RENDERER( ft_raster5_renderer_class )
+
+
+FT_END_HEADER
+
+#endif /* __FTREND1_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
new file mode 100644
index 0000000000..231e12fe3c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
@@ -0,0 +1,35 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* raster.c */
+/* */
+/* FreeType monochrome rasterer module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "rastpic.c"
+#ifdef _FX_MANAGED_CODE_
+#define TWorker_ TWorker_raster
+#define TRaster_ TRaster_raster
+#endif
+#include "ftraster.c"
+#include "ftrend1.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
new file mode 100644
index 0000000000..cbff5df96e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += RASTER_MODULE
+
+define RASTER_MODULE
+$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
new file mode 100644
index 0000000000..86d13d25cc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* rasterrs.h */
+/* */
+/* monochrome renderer error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the monochrome renderer error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __RASTERRS_H__
+#define __RASTERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX Raster_Err_
+#define FT_ERR_BASE FT_Mod_Err_Raster
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __RASTERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
new file mode 100644
index 0000000000..a749b941e0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/* */
+/* rastpic.c */
+/* */
+/* The FreeType position independent code services for raster module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "rastpic.h"
+#include "rasterrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftraster.c */
+ void
+ FT_Init_Class_ft_standard_raster( FT_Raster_Funcs* funcs );
+
+
+ void
+ ft_raster1_renderer_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->raster )
+ {
+ RasterPIC* container = (RasterPIC*)pic_container->raster;
+
+
+ if ( --container->ref_count )
+ return;
+ FT_FREE( container );
+ pic_container->raster = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_raster1_renderer_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ RasterPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* since this function also serves raster5 renderer, */
+ /* it implements reference counting */
+ if ( pic_container->raster )
+ {
+ ((RasterPIC*)pic_container->raster)->ref_count++;
+ return error;
+ }
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->raster = container;
+
+ container->ref_count = 1;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );
+
+ return error;
+ }
+
+
+ /* re-route these init and free functions to the above functions */
+ FT_Error
+ ft_raster5_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_raster1_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_raster5_renderer_class_pic_free( FT_Library library )
+ {
+ ft_raster1_renderer_class_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
new file mode 100644
index 0000000000..bba362fa7b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/* */
+/* rastpic.h */
+/* */
+/* The FreeType position independent code services for raster module. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __RASTPIC_H__
+#define __RASTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_STANDARD_RASTER_GET ft_standard_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ typedef struct RasterPIC_
+ {
+ int ref_count;
+ FT_Raster_Funcs ft_standard_raster;
+
+ } RasterPIC;
+
+
+#define GET_PIC( lib ) \
+ ( (RasterPIC*)( (lib)->pic_container.raster ) )
+#define FT_STANDARD_RASTER_GET ( GET_PIC( library )->ft_standard_raster )
+
+
+ /* see rastpic.c for the implementation */
+ void
+ ft_raster1_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_raster5_renderer_class_pic_free( FT_Library library );
+
+ FT_Error
+ ft_raster1_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_raster5_renderer_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __RASTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
new file mode 100644
index 0000000000..0e0b5e4ebd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2008, 2009, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# raster driver directory
+#
+RASTER_DIR := $(SRC_DIR)/raster
+
+# compilation flags for the driver
+#
+RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR))
+
+
+# raster driver sources (i.e., C files)
+#
+RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \
+ $(RASTER_DIR)/ftrend1.c \
+ $(RASTER_DIR)/rastpic.c
+
+
+# raster driver headers
+#
+RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \
+ $(RASTER_DIR)/rasterrs.h
+
+
+# raster driver object(s)
+#
+# RASTER_DRV_OBJ_M is used during `multi' builds.
+# RASTER_DRV_OBJ_S is used during `single' builds.
+#
+RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O
+
+# raster driver source file for single build
+#
+RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c
+
+
+# raster driver - single object
+#
+$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \
+ $(FREETYPE_H) $(RASTER_DRV_H)
+ $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S))
+
+
+# raster driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H)
+ $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(RASTER_DRV_OBJ_S)
+DRV_OBJS_M += $(RASTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
new file mode 100644
index 0000000000..cb20b1b04b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/sfnt Jamfile
+#
+# Copyright 2001, 2002, 2004, 2005 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;
+ }
+ else
+ {
+ _sources = sfnt ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/sfnt Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
new file mode 100644
index 0000000000..d0c6ba4765
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
@@ -0,0 +1,47 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* sfnt.c */
+/* */
+/* Single object library component. */
+/* */
+/* Copyright 1996-2006, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "sfntpic.c"
+#include "ttload.c"
+#include "ttmtx.c"
+#include "ttcmap.c"
+#include "ttkern.c"
+#include "sfobjs.c"
+#include "sfdriver.c"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "pngshim.c"
+#include "ttsbit.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.c"
+#endif
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
new file mode 100644
index 0000000000..95fd6a3143
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 SFNT module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SFNT_MODULE
+
+define SFNT_MODULE
+$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
new file mode 100644
index 0000000000..a1478c613e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
@@ -0,0 +1,336 @@
+/***************************************************************************/
+/* */
+/* pngshim.c */
+/* */
+/* PNG Bitmap glyph support. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Written by Stuart Gill and Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/config/ftstdlib.h"
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ /* We always include <stjmp.h>, so make libpng shut up! */
+#define PNG_SKIP_SETJMP_CHECK 1
+#include <png.h>
+#include "pngshim.h"
+
+#include "sferrors.h"
+
+
+ /* This code is freely based on cairo-png.c. There's so many ways */
+ /* to call libpng, and the way cairo does it is defacto standard. */
+
+ static int
+ multiply_alpha( int alpha,
+ int color )
+ {
+ int temp = ( alpha * color ) + 0x80;
+
+
+ return ( temp + ( temp >> 8 ) ) >> 8;
+ }
+
+
+ /* Premultiplies data and converts RGBA bytes => native endian. */
+ static void
+ premultiply_data( png_structp png,
+ png_row_infop row_info,
+ png_bytep data )
+ {
+ unsigned int i;
+
+ FT_UNUSED( png );
+
+
+ for ( i = 0; i < row_info->rowbytes; i += 4 )
+ {
+ unsigned char* base = &data[i];
+ unsigned int alpha = base[3];
+
+
+ if ( alpha == 0 )
+ base[0] = base[1] = base[2] = base[3] = 0;
+
+ else
+ {
+ unsigned int red = base[0];
+ unsigned int green = base[1];
+ unsigned int blue = base[2];
+
+
+ if ( alpha != 0xFF )
+ {
+ red = multiply_alpha( alpha, red );
+ green = multiply_alpha( alpha, green );
+ blue = multiply_alpha( alpha, blue );
+ }
+
+ base[0] = blue;
+ base[1] = green;
+ base[2] = red;
+ base[3] = alpha;
+ }
+ }
+ }
+
+
+ /* Converts RGBx bytes to BGRA. */
+ static void
+ convert_bytes_to_data( png_structp png,
+ png_row_infop row_info,
+ png_bytep data )
+ {
+ unsigned int i;
+
+ FT_UNUSED( png );
+
+
+ for ( i = 0; i < row_info->rowbytes; i += 4 )
+ {
+ unsigned char* base = &data[i];
+ unsigned int red = base[0];
+ unsigned int green = base[1];
+ unsigned int blue = base[2];
+
+
+ base[0] = blue;
+ base[1] = green;
+ base[2] = red;
+ base[3] = 0xFF;
+ }
+ }
+
+
+ /* Use error callback to avoid png writing to stderr. */
+ static void
+ error_callback( png_structp png,
+ png_const_charp error_msg )
+ {
+ FT_Error* error = png_get_error_ptr( png );
+
+ FT_UNUSED( error_msg );
+
+
+ *error = FT_THROW( Out_Of_Memory );
+#ifdef PNG_SETJMP_SUPPORTED
+ longjmp( png_jmpbuf( png ), 1 );
+#endif
+ /* if we get here, then we have no choice but to abort ... */
+ }
+
+
+ /* Use warning callback to avoid png writing to stderr. */
+ static void
+ warning_callback( png_structp png,
+ png_const_charp error_msg )
+ {
+ FT_UNUSED( png );
+ FT_UNUSED( error_msg );
+
+ /* Just ignore warnings. */
+ }
+
+
+ static void
+ read_data_from_FT_Stream( png_structp png,
+ png_bytep data,
+ png_size_t length )
+ {
+ FT_Error error;
+ png_voidp p = png_get_io_ptr( png );
+ FT_Stream stream = (FT_Stream)p;
+
+
+ if ( FT_FRAME_ENTER( length ) )
+ {
+ FT_Error* e = png_get_error_ptr( png );
+
+
+ *e = FT_THROW( Invalid_Stream_Read );
+ png_error( png, NULL );
+
+ return;
+ }
+
+ memcpy( data, stream->cursor, length );
+
+ FT_FRAME_EXIT();
+ }
+
+
+ static FT_Error
+ Load_SBit_Png( FT_Bitmap* map,
+ FT_Int x_offset,
+ FT_Int y_offset,
+ FT_Int pix_bits,
+ TT_SBit_Metrics metrics,
+ FT_Memory memory,
+ FT_Byte* data,
+ FT_UInt png_len )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_StreamRec stream;
+
+ png_structp png;
+ png_infop info;
+ png_uint_32 imgWidth, imgHeight;
+
+ int bitdepth, color_type, interlace;
+ FT_Int i;
+ png_byte* *rows;
+
+
+ if ( x_offset < 0 || x_offset + metrics->width > map->width ||
+ y_offset < 0 || y_offset + metrics->height > map->rows ||
+ pix_bits != 32 || map->pixel_mode != FT_PIXEL_MODE_BGRA )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_Stream_OpenMemory( &stream, data, png_len );
+
+ png = png_create_read_struct( PNG_LIBPNG_VER_STRING,
+ &error,
+ error_callback,
+ warning_callback );
+ if ( !png )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ goto Exit;
+ }
+
+ info = png_create_info_struct( png );
+ if ( !info )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ png_destroy_read_struct( &png, NULL, NULL );
+ goto Exit;
+ }
+
+ if ( ft_setjmp( png_jmpbuf( png ) ) )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto DestroyExit;
+ }
+
+ png_set_read_fn( png, &stream, read_data_from_FT_Stream );
+
+ png_read_info( png, info );
+ png_get_IHDR( png, info,
+ &imgWidth, &imgHeight,
+ &bitdepth, &color_type, &interlace,
+ NULL, NULL );
+
+ if ( error != FT_Err_Ok ||
+ (FT_Int)imgWidth != metrics->width ||
+ (FT_Int)imgHeight != metrics->height )
+ goto DestroyExit;
+
+ /* convert palette/gray image to rgb */
+ if ( color_type == PNG_COLOR_TYPE_PALETTE )
+ png_set_palette_to_rgb( png );
+
+ /* expand gray bit depth if needed */
+ if ( color_type == PNG_COLOR_TYPE_GRAY )
+ {
+#if PNG_LIBPNG_VER >= 10209
+ png_set_expand_gray_1_2_4_to_8( png );
+#else
+ png_set_gray_1_2_4_to_8( png );
+#endif
+ }
+
+ /* transform transparency to alpha */
+ if ( png_get_valid(png, info, PNG_INFO_tRNS ) )
+ png_set_tRNS_to_alpha( png );
+
+ if ( bitdepth == 16 )
+ png_set_strip_16( png );
+
+ if ( bitdepth < 8 )
+ png_set_packing( png );
+
+ /* convert grayscale to RGB */
+ if ( color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
+ png_set_gray_to_rgb( png );
+
+ if ( interlace != PNG_INTERLACE_NONE )
+ png_set_interlace_handling( png );
+
+ png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
+
+ /* recheck header after setting EXPAND options */
+ png_read_update_info(png, info );
+ png_get_IHDR( png, info,
+ &imgWidth, &imgHeight,
+ &bitdepth, &color_type, &interlace,
+ NULL, NULL );
+
+ if ( bitdepth != 8 ||
+ !( color_type == PNG_COLOR_TYPE_RGB ||
+ color_type == PNG_COLOR_TYPE_RGB_ALPHA ) )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto DestroyExit;
+ }
+
+ switch ( color_type )
+ {
+ default:
+ /* Shouldn't happen, but fall through. */
+
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ png_set_read_user_transform_fn( png, premultiply_data );
+ break;
+
+ case PNG_COLOR_TYPE_RGB:
+ /* Humm, this smells. Carry on though. */
+ png_set_read_user_transform_fn( png, convert_bytes_to_data );
+ break;
+ }
+
+ if ( FT_NEW_ARRAY( rows, imgHeight ) )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ goto DestroyExit;
+ }
+
+ for ( i = 0; i < (FT_Int)imgHeight; i++ )
+ rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4;
+
+ png_read_image( png, rows );
+
+ FT_FREE( rows );
+
+ png_read_end( png, info );
+
+ DestroyExit:
+ png_destroy_read_struct( &png, &info, NULL );
+ FT_Stream_Close( &stream );
+
+ Exit:
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
new file mode 100644
index 0000000000..a25086b157
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
@@ -0,0 +1,48 @@
+/***************************************************************************/
+/* */
+/* pngshim.h */
+/* */
+/* PNG Bitmap glyph support. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Written by Stuart Gill and Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PNGSHIM_H__
+#define __PNGSHIM_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ FT_LOCAL( FT_Error )
+ Load_SBit_Png( FT_Bitmap* map,
+ FT_Int x_offset,
+ FT_Int y_offset,
+ FT_Int pix_bits,
+ TT_SBit_Metrics metrics,
+ FT_Memory memory,
+ FT_Byte* data,
+ FT_UInt png_len );
+
+#endif
+
+FT_END_HEADER
+
+#endif /* __PNGSHIM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
new file mode 100644
index 0000000000..a6c956ab65
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
@@ -0,0 +1,78 @@
+#
+# FreeType 2 SFNT driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2007, 2009, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# SFNT driver directory
+#
+SFNT_DIR := $(SRC_DIR)/sfnt
+
+
+# compilation flags for the driver
+#
+SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR))
+
+
+# SFNT driver sources (i.e., C files)
+#
+SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \
+ $(SFNT_DIR)/ttmtx.c \
+ $(SFNT_DIR)/ttcmap.c \
+ $(SFNT_DIR)/ttsbit.c \
+ $(SFNT_DIR)/ttpost.c \
+ $(SFNT_DIR)/ttkern.c \
+ $(SFNT_DIR)/ttbdf.c \
+ $(SFNT_DIR)/sfobjs.c \
+ $(SFNT_DIR)/sfdriver.c \
+ $(SFNT_DIR)/sfntpic.c \
+ $(SFNT_DIR)/pngshim.c
+
+# SFNT driver headers
+#
+SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \
+ $(SFNT_DIR)/sferrors.h
+
+
+# SFNT driver object(s)
+#
+# SFNT_DRV_OBJ_M is used during `multi' builds.
+# SFNT_DRV_OBJ_S is used during `single' builds.
+#
+SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O
+
+# SFNT driver source file for single build
+#
+SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c
+
+
+# SFNT driver - single object
+#
+$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \
+ $(FREETYPE_H) $(SFNT_DRV_H)
+ $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S))
+
+
+# SFNT driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H)
+ $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SFNT_DRV_OBJ_S)
+DRV_OBJS_M += $(SFNT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
new file mode 100644
index 0000000000..175838348d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
@@ -0,0 +1,529 @@
+/***************************************************************************/
+/* */
+/* sfdriver.c */
+/* */
+/* High-level SFNT driver interface (body). */
+/* */
+/* Copyright 1996-2007, 2009-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "sfdriver.h"
+#include "ttload.h"
+#include "sfobjs.h"
+#include "sfntpic.h"
+
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "ttsbit.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "ttmtx.h"
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_sfdriver
+
+
+ /*
+ * SFNT TABLE SERVICE
+ *
+ */
+
+ static void*
+ get_sfnt_table( TT_Face face,
+ FT_Sfnt_Tag tag )
+ {
+ void* table;
+
+
+ switch ( tag )
+ {
+ case ft_sfnt_head:
+ table = &face->header;
+ break;
+
+ case ft_sfnt_hhea:
+ table = &face->horizontal;
+ break;
+
+ case ft_sfnt_vhea:
+ table = face->vertical_info ? &face->vertical : 0;
+ break;
+
+ case ft_sfnt_os2:
+ table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
+ break;
+
+ case ft_sfnt_post:
+ table = &face->postscript;
+ break;
+
+ case ft_sfnt_maxp:
+ table = &face->max_profile;
+ break;
+
+ case ft_sfnt_pclt:
+ table = face->pclt.Version ? &face->pclt : 0;
+ break;
+
+ default:
+ table = 0;
+ }
+
+ return table;
+ }
+
+
+ static FT_Error
+ sfnt_table_info( TT_Face face,
+ FT_UInt idx,
+ FT_ULong *tag,
+ FT_ULong *offset,
+ FT_ULong *length )
+ {
+ if ( !offset || !length )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !tag )
+ *length = face->num_tables;
+ else
+ {
+ if ( idx >= face->num_tables )
+ return FT_THROW( Table_Missing );
+
+ *tag = face->dir_tables[idx].Tag;
+ *offset = face->dir_tables[idx].Offset;
+ *length = face->dir_tables[idx].Length;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_SERVICE_SFNT_TABLEREC(
+ sfnt_service_sfnt_table,
+ (FT_SFNT_TableLoadFunc)tt_face_load_any,
+ (FT_SFNT_TableGetFunc) get_sfnt_table,
+ (FT_SFNT_TableInfoFunc)sfnt_table_info )
+
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ sfnt_get_glyph_name( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_String* gname;
+ FT_Error error;
+
+
+ error = tt_face_get_ps_name( face, glyph_index, &gname );
+ if ( !error )
+ FT_STRCPYN( buffer, gname, buffer_max );
+
+ return error;
+ }
+
+
+ static FT_UInt
+ sfnt_get_name_index( TT_Face face,
+ FT_String* glyph_name )
+ {
+ FT_Face root = &face->root;
+
+ FT_UInt i, max_gid = FT_UINT_MAX;
+
+
+ if ( root->num_glyphs < 0 )
+ return 0;
+ else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
+ max_gid = (FT_UInt)root->num_glyphs;
+ else
+ FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
+ FT_UINT_MAX, root->num_glyphs ));
+
+ for ( i = 0; i < max_gid; i++ )
+ {
+ FT_String* gname;
+ FT_Error error = tt_face_get_ps_name( face, i, &gname );
+
+
+ if ( error )
+ continue;
+
+ if ( !ft_strcmp( glyph_name, gname ) )
+ return i;
+ }
+
+ return 0;
+ }
+
+
+ FT_DEFINE_SERVICE_GLYPHDICTREC(
+ sfnt_service_glyph_dict,
+ (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
+
+
+#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ sfnt_get_ps_name( TT_Face face )
+ {
+ FT_Int n, found_win, found_apple;
+ const char* result = NULL;
+
+
+ /* shouldn't happen, but just in case to avoid memory leaks */
+ if ( face->postscript_name )
+ return face->postscript_name;
+
+ /* scan the name table to see whether we have a Postscript name here, */
+ /* either in Macintosh or Windows platform encodings */
+ found_win = -1;
+ found_apple = -1;
+
+ for ( n = 0; n < face->num_names; n++ )
+ {
+ TT_NameEntryRec* name = face->name_table.names + n;
+
+
+ if ( name->nameID == 6 && name->stringLength > 0 )
+ {
+ if ( name->platformID == 3 &&
+ name->encodingID == 1 &&
+ name->languageID == 0x409 )
+ found_win = n;
+
+ if ( name->platformID == 1 &&
+ name->encodingID == 0 &&
+ name->languageID == 0 )
+ found_apple = n;
+ }
+ }
+
+ if ( found_win != -1 )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_NameEntryRec* name = face->name_table.names + found_win;
+ FT_UInt len = name->stringLength / 2;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( !FT_ALLOC( result, name->stringLength + 1 ) )
+ {
+ FT_Stream stream = face->name_table.stream;
+ FT_String* r = (FT_String*)result;
+ FT_Byte* p = (FT_Byte*)name->string;
+
+
+ if ( FT_STREAM_SEEK( name->stringOffset ) ||
+ FT_FRAME_ENTER( name->stringLength ) )
+ {
+ FT_FREE( result );
+ name->stringLength = 0;
+ name->stringOffset = 0;
+ FT_FREE( name->string );
+
+ goto Exit;
+ }
+
+ p = (FT_Byte*)stream->cursor;
+
+ for ( ; len > 0; len--, p += 2 )
+ {
+ if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
+ *r++ = p[1];
+ }
+ *r = '\0';
+
+ FT_FRAME_EXIT();
+ }
+ goto Exit;
+ }
+
+ if ( found_apple != -1 )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_NameEntryRec* name = face->name_table.names + found_apple;
+ FT_UInt len = name->stringLength;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( !FT_ALLOC( result, len + 1 ) )
+ {
+ FT_Stream stream = face->name_table.stream;
+
+
+ if ( FT_STREAM_SEEK( name->stringOffset ) ||
+ FT_STREAM_READ( result, len ) )
+ {
+ name->stringOffset = 0;
+ name->stringLength = 0;
+ FT_FREE( name->string );
+ FT_FREE( result );
+ goto Exit;
+ }
+ ((char*)result)[len] = '\0';
+ }
+ }
+
+ Exit:
+ face->postscript_name = result;
+ return result;
+ }
+
+
+ FT_DEFINE_SERVICE_PSFONTNAMEREC(
+ sfnt_service_ps_name,
+ (FT_PsName_GetFunc)sfnt_get_ps_name )
+
+
+ /*
+ * TT CMAP INFO
+ */
+ FT_DEFINE_SERVICE_TTCMAPSREC(
+ tt_service_get_cmap_info,
+ (TT_CMap_Info_GetFunc)tt_get_cmap_info )
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ static FT_Error
+ sfnt_get_charset_id( TT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry )
+ {
+ BDF_PropertyRec encoding, registry;
+ FT_Error error;
+
+
+ /* XXX: I don't know whether this is correct, since
+ * tt_face_find_bdf_prop only returns something correct if we have
+ * previously selected a size that is listed in the BDF table.
+ * Should we change the BDF table format to include single offsets
+ * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
+ */
+ error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
+ if ( !error )
+ {
+ error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
+ if ( !error )
+ {
+ if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
+ encoding.type == BDF_PROPERTY_TYPE_ATOM )
+ {
+ *acharset_encoding = encoding.u.atom;
+ *acharset_registry = registry.u.atom;
+ }
+ else
+ error = FT_THROW( Invalid_Argument );
+ }
+ }
+
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_BDFRec(
+ sfnt_service_bdf,
+ (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
+ (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
+
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+ /*
+ * SERVICE LIST
+ */
+
+#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
+ FT_DEFINE_SERVICEDESCREC5(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_DEFINE_SERVICEDESCREC4(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_BDF
+ FT_DEFINE_SERVICEDESCREC4(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#else
+ FT_DEFINE_SERVICEDESCREC3(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ sfnt_get_interface( FT_Module module,
+ const char* module_interface )
+ {
+ /* SFNT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Library library;
+
+
+ if ( !module )
+ return NULL;
+ library = module->library;
+ if ( !library )
+ return NULL;
+#else
+ FT_UNUSED( module );
+#endif
+
+ return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define PUT_EMBEDDED_BITMAPS( a ) a
+#else
+#define PUT_EMBEDDED_BITMAPS( a ) NULL
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES( a ) a
+#else
+#define PUT_PS_NAMES( a ) NULL
+#endif
+
+ FT_DEFINE_SFNT_INTERFACE(
+ sfnt_interface,
+ tt_face_goto_table,
+
+ sfnt_init_face,
+ sfnt_load_face,
+ sfnt_done_face,
+ sfnt_get_interface,
+
+ tt_face_load_any,
+
+ tt_face_load_head,
+ tt_face_load_hhea,
+ tt_face_load_cmap,
+ tt_face_load_maxp,
+ tt_face_load_os2,
+ tt_face_load_post,
+
+ tt_face_load_name,
+ tt_face_free_name,
+
+ tt_face_load_kern,
+ tt_face_load_gasp,
+ tt_face_load_pclt,
+
+ /* see `ttload.h' */
+ PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
+
+ PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
+
+ /* see `ttpost.h' */
+ PUT_PS_NAMES( tt_face_get_ps_name ),
+ PUT_PS_NAMES( tt_face_free_ps_names ),
+
+ /* since version 2.1.8 */
+ tt_face_get_kerning,
+
+ /* since version 2.2 */
+ tt_face_load_font_dir,
+ tt_face_load_hmtx,
+
+ /* see `ttsbit.h' and `sfnt.h' */
+ PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),
+ PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),
+
+ PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ),
+ PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
+
+ tt_face_get_metrics
+ )
+
+
+ FT_DEFINE_MODULE(
+ sfnt_module_class,
+
+ 0, /* not a font driver or renderer */
+ sizeof ( FT_ModuleRec ),
+
+ "sfnt", /* driver name */
+ 0x10000L, /* driver version 1.0 */
+ 0x20000L, /* driver requires FreeType 2.0 or higher */
+
+ (const void*)&SFNT_INTERFACE_GET, /* module specific interface */
+
+ (FT_Module_Constructor)0,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) sfnt_get_interface )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
new file mode 100644
index 0000000000..7c743f949f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* sfdriver.h */
+/* */
+/* High-level SFNT driver interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFDRIVER_H__
+#define __SFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( sfnt_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
new file mode 100644
index 0000000000..f313707fd2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* sferrors.h */
+/* */
+/* SFNT error codes (specification only). */
+/* */
+/* Copyright 2001, 2004, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the SFNT error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __SFERRORS_H__
+#define __SFERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX SFNT_Err_
+#define FT_ERR_BASE FT_Mod_Err_SFNT
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __SFERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
new file mode 100644
index 0000000000..7d34eee25a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/* */
+/* sfntpic.c */
+/* */
+/* The FreeType position independent code services for sfnt module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "sfntpic.h"
+#include "sferrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from sfdriver.c */
+ FT_Error
+ FT_Create_Class_sfnt_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_sfnt_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz );
+ void
+ FT_Init_Class_sfnt_interface( FT_Library library,
+ SFNT_Interface* clazz );
+ void
+ FT_Init_Class_sfnt_service_glyph_dict(
+ FT_Library library,
+ FT_Service_GlyphDictRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_ps_name(
+ FT_Library library,
+ FT_Service_PsFontNameRec* clazz );
+ void
+ FT_Init_Class_tt_service_get_cmap_info(
+ FT_Library library,
+ FT_Service_TTCMapsRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_sfnt_table(
+ FT_Service_SFNT_TableRec* clazz );
+
+
+ /* forward declaration of PIC init functions from ttcmap.c */
+ FT_Error
+ FT_Create_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class** output_class );
+ void
+ FT_Destroy_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class* clazz );
+
+
+ void
+ sfnt_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->sfnt )
+ {
+ sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt;
+
+
+ if ( container->sfnt_services )
+ FT_Destroy_Class_sfnt_services( library,
+ container->sfnt_services );
+ container->sfnt_services = NULL;
+
+ if ( container->tt_cmap_classes )
+ FT_Destroy_Class_tt_cmap_classes( library,
+ container->tt_cmap_classes );
+ container->tt_cmap_classes = NULL;
+
+ FT_FREE( container );
+ pic_container->sfnt = NULL;
+ }
+ }
+
+
+ FT_Error
+ sfnt_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ sfntModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->sfnt = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_sfnt_services( library,
+ &container->sfnt_services );
+ if ( error )
+ goto Exit;
+
+ error = FT_Create_Class_tt_cmap_classes( library,
+ &container->tt_cmap_classes );
+ if ( error )
+ goto Exit;
+
+ FT_Init_Class_sfnt_service_glyph_dict(
+ library, &container->sfnt_service_glyph_dict );
+ FT_Init_Class_sfnt_service_ps_name(
+ library, &container->sfnt_service_ps_name );
+ FT_Init_Class_tt_service_get_cmap_info(
+ library, &container->tt_service_get_cmap_info );
+ FT_Init_Class_sfnt_service_sfnt_table(
+ &container->sfnt_service_sfnt_table );
+#ifdef TT_CONFIG_OPTION_BDF
+ FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );
+#endif
+ FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );
+
+ Exit:
+ if ( error )
+ sfnt_module_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
new file mode 100644
index 0000000000..470f2286c5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/* */
+/* sfntpic.h */
+/* */
+/* The FreeType position independent code services for sfnt module. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFNTPIC_H__
+#define __SFNTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define SFNT_SERVICES_GET sfnt_services
+#define SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict
+#define SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name
+#define TT_SERVICE_CMAP_INFO_GET tt_service_get_cmap_info
+#define SFNT_SERVICES_GET sfnt_services
+#define TT_CMAP_CLASSES_GET tt_cmap_classes
+#define SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table
+#define SFNT_SERVICE_BDF_GET sfnt_service_bdf
+#define SFNT_INTERFACE_GET sfnt_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ /* some include files required for members of sfntModulePIC */
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "ttcmap.h"
+
+
+ typedef struct sfntModulePIC_
+ {
+ FT_ServiceDescRec* sfnt_services;
+ FT_Service_GlyphDictRec sfnt_service_glyph_dict;
+ FT_Service_PsFontNameRec sfnt_service_ps_name;
+ FT_Service_TTCMapsRec tt_service_get_cmap_info;
+ TT_CMap_Class* tt_cmap_classes;
+ FT_Service_SFNT_TableRec sfnt_service_sfnt_table;
+#ifdef TT_CONFIG_OPTION_BDF
+ FT_Service_BDFRec sfnt_service_bdf;
+#endif
+ SFNT_Interface sfnt_interface;
+
+ } sfntModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )
+
+#define SFNT_SERVICES_GET \
+ ( GET_PIC( library )->sfnt_services )
+#define SFNT_SERVICE_GLYPH_DICT_GET \
+ ( GET_PIC( library )->sfnt_service_glyph_dict )
+#define SFNT_SERVICE_PS_NAME_GET \
+ ( GET_PIC( library )->sfnt_service_ps_name )
+#define TT_SERVICE_CMAP_INFO_GET \
+ ( GET_PIC( library )->tt_service_get_cmap_info )
+#define SFNT_SERVICES_GET \
+ ( GET_PIC( library )->sfnt_services )
+#define TT_CMAP_CLASSES_GET \
+ ( GET_PIC( library )->tt_cmap_classes )
+#define SFNT_SERVICE_SFNT_TABLE_GET \
+ ( GET_PIC( library )->sfnt_service_sfnt_table )
+#define SFNT_SERVICE_BDF_GET \
+ ( GET_PIC( library )->sfnt_service_bdf )
+#define SFNT_INTERFACE_GET \
+ ( GET_PIC( library )->sfnt_interface )
+
+
+ /* see sfntpic.c for the implementation */
+ void
+ sfnt_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ sfnt_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SFNTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
new file mode 100644
index 0000000000..2d5a388ca8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
@@ -0,0 +1,1165 @@
+/***************************************************************************/
+/* */
+/* sfobjs.c */
+/* */
+/* SFNT object management (base). */
+/* */
+/* Copyright 1996-2008, 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "sfobjs.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/ftsnames.h"
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_sfobjs
+
+
+
+ /* convert a UTF-16 name entry to ASCII */
+ static FT_String*
+ tt_name_entry_ascii_from_utf16( TT_NameEntry entry,
+ FT_Memory memory )
+ {
+ FT_String* string = NULL;
+ FT_UInt len, code, n;
+ FT_Byte* read = (FT_Byte*)entry->string;
+ FT_Error error;
+
+
+ len = (FT_UInt)entry->stringLength / 2;
+
+ if ( FT_NEW_ARRAY( string, len + 1 ) )
+ return NULL;
+
+ for ( n = 0; n < len; n++ )
+ {
+ code = FT_NEXT_USHORT( read );
+
+ if ( code == 0 )
+ break;
+
+ if (code > 255) /*Johnson 2010-10-09, #TESTDOC:0000042_QUT20005_5.pdf.*/
+ code = code>>8&0x00ff;
+ if ( code < 32 || code > 127 )
+ code = '?';
+
+ string[n] = (char)code;
+ }
+
+ string[n] = 0;
+
+ return string;
+ }
+
+
+ /* convert an Apple Roman or symbol name entry to ASCII */
+ static FT_String*
+ tt_name_entry_ascii_from_other( TT_NameEntry entry,
+ FT_Memory memory )
+ {
+ FT_String* string = NULL;
+ FT_UInt len, code, n;
+ FT_Byte* read = (FT_Byte*)entry->string;
+ FT_Error error;
+
+
+ len = (FT_UInt)entry->stringLength;
+
+ if ( FT_NEW_ARRAY( string, len + 1 ) )
+ return NULL;
+
+ for ( n = 0; n < len; n++ )
+ {
+ code = *read++;
+
+ if ( code == 0 )
+ break;
+
+ if ( code < 32 || code > 127 )
+ code = '?';
+
+ string[n] = (char)code;
+ }
+
+ string[n] = 0;
+
+ return string;
+ }
+
+
+ typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry,
+ FT_Memory memory );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_name */
+ /* */
+ /* <Description> */
+ /* Returns a given ENGLISH name record in ASCII. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* nameid :: The name id of the name record to return. */
+ /* */
+ /* <InOut> */
+ /* name :: The address of a string pointer. NULL if no name is */
+ /* present. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_face_get_name( TT_Face face,
+ FT_UShort nameid,
+ FT_String** name )
+ {
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_String* result = NULL;
+ FT_UShort n;
+ TT_NameEntryRec* rec;
+ FT_Int found_apple = -1;
+ FT_Int found_apple_roman = -1;
+ FT_Int found_apple_english = -1;
+ FT_Int found_win = -1;
+ FT_Int found_unicode = -1;
+
+ FT_Bool is_english = 0;
+
+ TT_NameEntry_ConvertFunc convert;
+
+
+ FT_ASSERT( name );
+
+ rec = face->name_table.names;
+ for ( n = 0; n < face->num_names; n++, rec++ )
+ {
+ /* According to the OpenType 1.3 specification, only Microsoft or */
+ /* Apple platform IDs might be used in the `name' table. The */
+ /* `Unicode' platform is reserved for the `cmap' table, and the */
+ /* `ISO' one is deprecated. */
+ /* */
+ /* However, the Apple TrueType specification doesn't say the same */
+ /* thing and goes to suggest that all Unicode `name' table entries */
+ /* should be coded in UTF-16 (in big-endian format I suppose). */
+ /* */
+ if ( rec->nameID == nameid && rec->stringLength > 0 )
+ {
+ switch ( rec->platformID )
+ {
+ case TT_PLATFORM_APPLE_UNICODE:
+ case TT_PLATFORM_ISO:
+ /* there is `languageID' to check there. We should use this */
+ /* field only as a last solution when nothing else is */
+ /* available. */
+ /* */
+ found_unicode = n;
+ break;
+
+ case TT_PLATFORM_MACINTOSH:
+ /* This is a bit special because some fonts will use either */
+ /* an English language id, or a Roman encoding id, to indicate */
+ /* the English version of its font name. */
+ /* */
+ if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
+ found_apple_english = n;
+ else if ( rec->encodingID == TT_MAC_ID_ROMAN )
+ found_apple_roman = n;
+ break;
+
+ case TT_PLATFORM_MICROSOFT:
+ /* we only take a non-English name when there is nothing */
+ /* else available in the font */
+ /* */
+ if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
+ {
+ switch ( rec->encodingID )
+ {
+ case TT_MS_ID_SYMBOL_CS:
+ case TT_MS_ID_UNICODE_CS:
+ case TT_MS_ID_UCS_4:
+ is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
+ found_win = n;
+ break;
+
+ default:
+ ;
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+ }
+ }
+
+ found_apple = found_apple_roman;
+ if ( found_apple_english >= 0 )
+ found_apple = found_apple_english;
+
+ /* some fonts contain invalid Unicode or Macintosh formatted entries; */
+ /* we will thus favor names encoded in Windows formats if available */
+ /* (provided it is an English name) */
+ /* */
+ convert = NULL;
+ if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
+ {
+ rec = face->name_table.names + found_win;
+ switch ( rec->encodingID )
+ {
+ /* all Unicode strings are encoded using UTF-16BE */
+ case TT_MS_ID_UNICODE_CS:
+ case TT_MS_ID_SYMBOL_CS:
+ convert = tt_name_entry_ascii_from_utf16;
+ break;
+
+ case TT_MS_ID_UCS_4:
+ /* Apparently, if this value is found in a name table entry, it is */
+ /* documented as `full Unicode repertoire'. Experience with the */
+ /* MsGothic font shipped with Windows Vista shows that this really */
+ /* means UTF-16 encoded names (UCS-4 values are only used within */
+ /* charmaps). */
+ convert = tt_name_entry_ascii_from_utf16;
+ break;
+
+ default:
+ ;
+ }
+ }
+ else if ( found_apple >= 0 )
+ {
+ rec = face->name_table.names + found_apple;
+ convert = tt_name_entry_ascii_from_other;
+ }
+ else if ( found_unicode >= 0 )
+ {
+ rec = face->name_table.names + found_unicode;
+ convert = tt_name_entry_ascii_from_utf16;
+ }
+
+ if ( rec && convert )
+ {
+ if ( rec->string == NULL )
+ {
+ FT_Stream stream = face->name_table.stream;
+
+
+ if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
+ FT_STREAM_SEEK( rec->stringOffset ) ||
+ FT_STREAM_READ( rec->string, rec->stringLength ) )
+ {
+ FT_FREE( rec->string );
+ rec->stringLength = 0;
+ result = NULL;
+ goto Exit;
+ }
+ }
+
+ result = convert( rec, memory );
+ }
+
+ Exit:
+ *name = result;
+ return error;
+ }
+
+
+ static FT_Encoding
+ sfnt_find_encoding( int platform_id,
+ int encoding_id )
+ {
+ typedef struct TEncoding_
+ {
+ int platform_id;
+ int encoding_id;
+ FT_Encoding encoding;
+
+ } TEncoding;
+
+ static
+ const TEncoding tt_encodings[] =
+ {
+ { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE },
+
+ { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE },
+
+ { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN },
+
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB }
+ };
+
+ const TEncoding *cur, *limit;
+
+
+ cur = tt_encodings;
+ limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur->platform_id == platform_id )
+ {
+ if ( cur->encoding_id == encoding_id ||
+ cur->encoding_id == -1 )
+ return cur->encoding;
+ }
+ }
+
+ return FT_ENCODING_NONE;
+ }
+
+
+ /* Fill in face->ttc_header. If the font is not a TTC, it is */
+ /* synthesized into a TTC with one offset table. */
+ static FT_Error
+ sfnt_open_font( FT_Stream stream,
+ TT_Face face )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+ FT_ULong tag, offset;
+
+ static const FT_Frame_Field ttc_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TTC_HeaderRec
+
+ FT_FRAME_START( 8 ),
+ FT_FRAME_LONG( version ),
+ FT_FRAME_LONG( count ), /* this is ULong in the specs */
+ FT_FRAME_END
+ };
+
+
+ face->ttc_header.tag = 0;
+ face->ttc_header.version = 0;
+ face->ttc_header.count = 0;
+
+ offset = FT_STREAM_POS();
+
+ if ( FT_READ_ULONG( tag ) )
+ return error;
+
+ if ( tag != 0x00010000UL &&
+ tag != TTAG_ttcf &&
+ tag != TTAG_OTTO &&
+ tag != TTAG_true &&
+ tag != TTAG_typ1 &&
+ tag != 0x00020000UL )
+ {
+ FT_TRACE2(( " not a font using the SFNT container format\n" ));
+ return FT_THROW( Unknown_File_Format );
+ }
+
+ face->ttc_header.tag = TTAG_ttcf;
+
+ if ( tag == TTAG_ttcf )
+ {
+ FT_Int n;
+
+
+ FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
+
+ if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
+ return error;
+
+ if ( face->ttc_header.count == 0 )
+ return FT_THROW( Invalid_Table );
+
+ /* a rough size estimate: let's conservatively assume that there */
+ /* is just a single table info in each subfont header (12 + 16*1 = */
+ /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
+ /* size of the TTC header plus `28*count' bytes for all subfont */
+ /* headers */
+ if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
+ return FT_THROW( Array_Too_Large );
+
+ /* now read the offsets of each font in the file */
+ if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
+ return error;
+
+ if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
+ return error;
+
+ for ( n = 0; n < face->ttc_header.count; n++ )
+ face->ttc_header.offsets[n] = FT_GET_ULONG();
+
+ FT_FRAME_EXIT();
+ }
+ else
+ {
+ FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
+
+ face->ttc_header.version = 1 << 16;
+ face->ttc_header.count = 1;
+
+ if ( FT_NEW( face->ttc_header.offsets ) )
+ return error;
+
+ face->ttc_header.offsets[0] = offset;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ sfnt_init_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+ FT_Library library = face->root.driver->root.library;
+ SFNT_Service sfnt;
+
+
+ /* for now, parameters are unused */
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+
+
+ sfnt = (SFNT_Service)face->sfnt;
+ if ( !sfnt )
+ {
+ sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
+ return FT_THROW( Missing_Module );
+ }
+
+ face->sfnt = sfnt;
+ face->goto_table = sfnt->goto_table;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
+
+ FT_TRACE2(( "SFNT driver\n" ));
+
+ error = sfnt_open_font( stream, face );
+ if ( error )
+ return error;
+
+ FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
+
+ if ( face_index < 0 )
+ face_index = 0;
+
+ if ( face_index >= face->ttc_header.count )
+ return FT_THROW( Invalid_Argument );
+
+ if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
+ return error;
+
+ /* check that we have a valid TrueType file */
+ error = sfnt->load_font_dir( face, stream );
+ if ( error )
+ return error;
+
+ face->root.num_faces = face->ttc_header.count;
+ face->root.face_index = face_index;
+
+ return error;
+ }
+
+
+#define LOAD_( x ) \
+ do { \
+ FT_TRACE2(( "`" #x "' " )); \
+ FT_TRACE3(( "-->\n" )); \
+ \
+ error = sfnt->load_ ## x( face, stream ); \
+ \
+ FT_TRACE2(( "%s\n", ( !error ) \
+ ? "loaded" \
+ : FT_ERR_EQ( error, Table_Missing ) \
+ ? "missing" \
+ : "failed to load" )); \
+ FT_TRACE3(( "\n" )); \
+ } while ( 0 )
+
+#define LOADM_( x, vertical ) \
+ do { \
+ FT_TRACE2(( "`%s" #x "' ", \
+ vertical ? "vertical " : "" )); \
+ FT_TRACE3(( "-->\n" )); \
+ \
+ error = sfnt->load_ ## x( face, stream, vertical ); \
+ \
+ FT_TRACE2(( "%s\n", ( !error ) \
+ ? "loaded" \
+ : FT_ERR_EQ( error, Table_Missing ) \
+ ? "missing" \
+ : "failed to load" )); \
+ FT_TRACE3(( "\n" )); \
+ } while ( 0 )
+
+#define GET_NAME( id, field ) \
+ do { \
+ error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \
+ if ( error ) \
+ goto Exit; \
+ } while ( 0 )
+
+
+ FT_LOCAL_DEF( FT_Error )
+ sfnt_load_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_Error psnames_error;
+#endif
+ FT_Bool has_outline;
+ FT_Bool is_apple_sbit;
+ FT_Bool ignore_preferred_family = FALSE;
+ FT_Bool ignore_preferred_subfamily = FALSE;
+
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+ FT_UNUSED( face_index );
+
+
+ /* Check parameters */
+
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < num_params; i++ )
+ {
+ if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
+ ignore_preferred_family = TRUE;
+ else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
+ ignore_preferred_subfamily = TRUE;
+ }
+ }
+
+ /* Load tables */
+
+ /* We now support two SFNT-based bitmapped font formats. They */
+ /* are recognized easily as they do not include a `glyf' */
+ /* table. */
+ /* */
+ /* The first format comes from Apple, and uses a table named */
+ /* `bhed' instead of `head' to store the font header (using */
+ /* the same format). It also doesn't include horizontal and */
+ /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */
+ /* missing). */
+ /* */
+ /* The other format comes from Microsoft, and is used with */
+ /* WinCE/PocketPC. It looks like a standard TTF, except that */
+ /* it doesn't contain outlines. */
+ /* */
+
+ FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
+
+ /* do we have outlines in there? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
+ tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+ tt_face_lookup_table( face, TTAG_CFF ) != 0 );
+#else
+ has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+ tt_face_lookup_table( face, TTAG_CFF ) != 0 );
+#endif
+
+ is_apple_sbit = 0;
+
+ /* if this font doesn't contain outlines, we try to load */
+ /* a `bhed' table */
+ if ( !has_outline && sfnt->load_bhed )
+ {
+ LOAD_( bhed );
+ is_apple_sbit = FT_BOOL( !error );
+ }
+
+ /* load the font header (`head' table) if this isn't an Apple */
+ /* sbit font file */
+ if ( !is_apple_sbit )
+ {
+ LOAD_( head );
+ if ( error )
+ goto Exit;
+ }
+
+ if ( face->header.Units_Per_EM == 0 )
+ {
+ error = FT_THROW( Invalid_Table );
+
+ goto Exit;
+ }
+
+ /* the following tables are often not present in embedded TrueType */
+ /* fonts within PDF documents, so don't check for them. */
+ LOAD_( maxp );
+ LOAD_( cmap );
+
+ /* the following tables are optional in PCL fonts -- */
+ /* don't check for errors */
+ LOAD_( name );
+ LOAD_( post );
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ psnames_error = error;
+#endif
+
+ /* do not load the metrics headers and tables if this is an Apple */
+ /* sbit font file */
+ if ( !is_apple_sbit )
+ {
+ /* load the `hhea' and `hmtx' tables */
+ LOADM_( hhea, 0 );
+ if ( !error )
+ {
+ LOADM_( hmtx, 0 );
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ {
+ error = FT_THROW( Hmtx_Table_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* If this is an incrementally loaded font and there are */
+ /* overriding metrics, tolerate a missing `hmtx' table. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->
+ get_glyph_metrics )
+ {
+ face->horizontal.number_Of_HMetrics = 0;
+ error = FT_Err_Ok;
+ }
+#endif
+ }
+ }
+ else if ( FT_ERR_EQ( error, Table_Missing ) )
+ {
+ /* No `hhea' table necessary for SFNT Mac fonts. */
+ if ( face->format_tag == TTAG_true )
+ {
+ FT_TRACE2(( "This is an SFNT Mac font.\n" ));
+
+ has_outline = 0;
+ error = FT_Err_Ok;
+ }
+ else
+ {
+ error = FT_THROW( Horiz_Header_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* If this is an incrementally loaded font and there are */
+ /* overriding metrics, tolerate a missing `hhea' table. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->
+ get_glyph_metrics )
+ {
+ face->horizontal.number_Of_HMetrics = 0;
+ error = FT_Err_Ok;
+ }
+#endif
+
+ }
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* try to load the `vhea' and `vmtx' tables */
+ LOADM_( hhea, 1 );
+ if ( !error )
+ {
+ LOADM_( hmtx, 1 );
+ if ( !error )
+ face->vertical_info = 1;
+ }
+
+ if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+ goto Exit;
+
+ LOAD_( os2 );
+ if ( error )
+ {
+ /* we treat the table as missing if there are any errors */
+ face->os2.version = 0xFFFFU;
+ }
+ }
+
+ /* the optional tables */
+
+ /* embedded bitmap support */
+ if ( sfnt->load_eblc )
+ {
+ LOAD_( eblc );
+ if ( error )
+ {
+ /* a font which contains neither bitmaps nor outlines is */
+ /* still valid (although rather useless in most cases); */
+ /* however, you can find such stripped fonts in PDFs */
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ error = FT_Err_Ok;
+ else
+ goto Exit;
+ }
+ }
+
+ LOAD_( pclt );
+ if ( error )
+ {
+ if ( FT_ERR_NEQ( error, Table_Missing ) )
+ goto Exit;
+
+ face->pclt.Version = 0;
+ }
+
+ /* consider the kerning and gasp tables as optional */
+ LOAD_( gasp );
+ LOAD_( kern );
+
+ face->root.num_glyphs = face->max_profile.numGlyphs;
+
+ /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */
+ /* a WWS-only font face. `WWS' stands for `weight', width', and */
+ /* `slope', a term used by Microsoft's Windows Presentation */
+ /* Foundation (WPF). This flag has been introduced in version */
+ /* 1.5 of the OpenType specification (May 2008). */
+
+ face->root.family_name = NULL;
+ face->root.style_name = NULL;
+ if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
+ {
+ if ( !ignore_preferred_family )
+ GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name )
+ GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+ if ( !ignore_preferred_subfamily )
+ GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name )
+ GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+ }
+ else
+ {
+ GET_NAME( WWS_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name && !ignore_preferred_family )
+ GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name )
+ GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+ GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name && !ignore_preferred_subfamily )
+ GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name )
+ GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+ }
+
+ /* now set up root fields */
+ {
+ FT_Face root = &face->root;
+ FT_Long flags = root->face_flags;
+
+
+ /*********************************************************************/
+ /* */
+ /* Compute face flags. */
+ /* */
+ if ( has_outline == TRUE )
+ flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */
+
+ /* The sfnt driver only supports bitmap fonts natively, thus we */
+ /* don't set FT_FACE_FLAG_HINTER. */
+ flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */
+ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ if ( !psnames_error &&
+ face->postscript.FormatType != 0x00030000L )
+ flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+ /* fixed width font? */
+ if ( face->postscript.isFixedPitch )
+ flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* vertical information? */
+ if ( face->vertical_info )
+ flags |= FT_FACE_FLAG_VERTICAL;
+
+ /* kerning available ? */
+ if ( TT_FACE_HAS_KERNING( face ) )
+ flags |= FT_FACE_FLAG_KERNING;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ /* Don't bother to load the tables unless somebody asks for them. */
+ /* No need to do work which will (probably) not be used. */
+ if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
+ tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
+ tt_face_lookup_table( face, TTAG_gvar ) != 0 )
+ flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+#endif
+
+ root->face_flags = flags;
+
+ /*********************************************************************/
+ /* */
+ /* Compute style flags. */
+ /* */
+
+ flags = 0;
+ if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
+ {
+ /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */
+ /* indicates an oblique font face. This flag has been */
+ /* introduced in version 1.5 of the OpenType specification. */
+
+ if ( face->os2.fsSelection & 512 ) /* bit 9 */
+ flags |= FT_STYLE_FLAG_ITALIC;
+ else if ( face->os2.fsSelection & 1 ) /* bit 0 */
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ if ( face->os2.fsSelection & 32 ) /* bit 5 */
+ flags |= FT_STYLE_FLAG_BOLD;
+ }
+ else
+ {
+ /* this is an old Mac font, use the header field */
+
+ if ( face->header.Mac_Style & 1 )
+ flags |= FT_STYLE_FLAG_BOLD;
+
+ if ( face->header.Mac_Style & 2 )
+ flags |= FT_STYLE_FLAG_ITALIC;
+ }
+
+ root->style_flags = flags;
+
+ /*********************************************************************/
+ /* */
+ /* Polish the charmaps. */
+ /* */
+ /* Try to set the charmap encoding according to the platform & */
+ /* encoding ID of each charmap. */
+ /* */
+
+ tt_face_build_cmaps( face ); /* ignore errors */
+
+
+ /* set the encoding fields */
+ {
+ FT_Int m;
+
+
+ for ( m = 0; m < root->num_charmaps; m++ )
+ {
+ FT_CharMap charmap = root->charmaps[m];
+
+
+ charmap->encoding = sfnt_find_encoding( charmap->platform_id,
+ charmap->encoding_id );
+
+#if 0
+ if ( root->charmap == NULL &&
+ charmap->encoding == FT_ENCODING_UNICODE )
+ {
+ /* set 'root->charmap' to the first Unicode encoding we find */
+ root->charmap = charmap;
+ }
+#endif
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /*
+ * Now allocate the root array of FT_Bitmap_Size records and
+ * populate them. Unfortunately, it isn't possible to indicate bit
+ * depths in the FT_Bitmap_Size record. This is a design error.
+ */
+ {
+ FT_UInt i, count;
+
+
+ count = face->sbit_num_strikes;
+
+ if ( count > 0 )
+ {
+ FT_Memory memory = face->root.stream->memory;
+ FT_UShort em_size = face->header.Units_Per_EM;
+ FT_Short avgwidth = face->os2.xAvgCharWidth;
+ FT_Size_Metrics metrics;
+
+
+ if ( em_size == 0 || face->os2.version == 0xFFFFU )
+ {
+ avgwidth = 0;
+ em_size = 1;
+ }
+
+ if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+ goto Exit;
+
+ for ( i = 0; i < count; i++ )
+ {
+ FT_Bitmap_Size* bsize = root->available_sizes + i;
+
+
+ error = sfnt->load_strike_metrics( face, i, &metrics );
+ if ( error )
+ goto Exit;
+
+ bsize->height = (FT_Short)( metrics.height >> 6 );
+ bsize->width = (FT_Short)(
+ ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
+
+ bsize->x_ppem = metrics.x_ppem << 6;
+ bsize->y_ppem = metrics.y_ppem << 6;
+
+ /* assume 72dpi */
+ bsize->size = metrics.y_ppem << 6;
+ }
+
+ root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
+ root->num_fixed_sizes = (FT_Int)count;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* a font with no bitmaps and no outlines is scalable; */
+ /* it has only empty glyphs then */
+ if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
+ root->face_flags |= FT_FACE_FLAG_SCALABLE;
+
+
+ /*********************************************************************/
+ /* */
+ /* Set up metrics. */
+ /* */
+ if ( FT_IS_SCALABLE( root ) )
+ {
+ /* XXX What about if outline header is missing */
+ /* (e.g. sfnt wrapped bitmap)? */
+ root->bbox.xMin = face->header.xMin;
+ root->bbox.yMin = face->header.yMin;
+ root->bbox.xMax = face->header.xMax;
+ root->bbox.yMax = face->header.yMax;
+ root->units_per_EM = face->header.Units_Per_EM;
+
+
+ /* XXX: Computing the ascender/descender/height is very different */
+ /* from what the specification tells you. Apparently, we */
+ /* must be careful because */
+ /* */
+ /* - not all fonts have an OS/2 table; in this case, we take */
+ /* the values in the horizontal header. However, these */
+ /* values very often are not reliable. */
+ /* */
+ /* - otherwise, the correct typographic values are in the */
+ /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */
+ /* */
+ /* However, certain fonts have these fields set to 0. */
+ /* Rather, they have usWinAscent & usWinDescent correctly */
+ /* set (but with different values). */
+ /* */
+ /* As an example, Arial Narrow is implemented through four */
+ /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
+ /* */
+ /* Strangely, all fonts have the same values in their */
+ /* sTypoXXX fields, except ARIALNB which sets them to 0. */
+ /* */
+ /* On the other hand, they all have different */
+ /* usWinAscent/Descent values -- as a conclusion, the OS/2 */
+ /* table cannot be used to compute the text height reliably! */
+ /* */
+
+ /* The ascender and descender are taken from the `hhea' table. */
+ /* If zero, they are taken from the `OS/2' table. */
+
+ root->ascender = face->horizontal.Ascender;
+ root->descender = face->horizontal.Descender;
+
+ root->height = (FT_Short)( root->ascender - root->descender +
+ face->horizontal.Line_Gap );
+
+ if ( !( root->ascender || root->descender ) )
+ {
+ if ( face->os2.version != 0xFFFFU )
+ {
+ if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+ {
+ root->ascender = face->os2.sTypoAscender;
+ root->descender = face->os2.sTypoDescender;
+
+ root->height = (FT_Short)( root->ascender - root->descender +
+ face->os2.sTypoLineGap );
+ }
+ else
+ {
+ root->ascender = (FT_Short)face->os2.usWinAscent;
+ root->descender = -(FT_Short)face->os2.usWinDescent;
+
+ root->height = (FT_UShort)( root->ascender - root->descender );
+ }
+ }
+ }
+
+ root->max_advance_width = face->horizontal.advance_Width_Max;
+ root->max_advance_height = (FT_Short)( face->vertical_info
+ ? face->vertical.advance_Height_Max
+ : root->height );
+
+ /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
+ /* Adjust underline position from top edge to centre of */
+ /* stroke to convert TrueType meaning to FreeType meaning. */
+ root->underline_position = face->postscript.underlinePosition -
+ face->postscript.underlineThickness / 2;
+ root->underline_thickness = face->postscript.underlineThickness;
+ }
+
+ }
+
+ Exit:
+ FT_TRACE2(( "sfnt_load_face: done\n" ));
+
+ return error;
+ }
+
+
+#undef LOAD_
+#undef LOADM_
+#undef GET_NAME
+
+
+ FT_LOCAL_DEF( void )
+ sfnt_done_face( TT_Face face )
+ {
+ FT_Memory memory;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = face->root.memory;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ if ( sfnt )
+ {
+ /* destroy the postscript names table if it is loaded */
+ if ( sfnt->free_psnames )
+ sfnt->free_psnames( face );
+
+ /* destroy the embedded bitmaps table if it is loaded */
+ if ( sfnt->free_eblc )
+ sfnt->free_eblc( face );
+ }
+
+#ifdef TT_CONFIG_OPTION_BDF
+ /* freeing the embedded BDF properties */
+ tt_face_free_bdf_props( face );
+#endif
+
+ /* freeing the kerning table */
+ tt_face_done_kern( face );
+
+ /* freeing the collection table */
+ FT_FREE( face->ttc_header.offsets );
+ face->ttc_header.count = 0;
+
+ /* freeing table directory */
+ FT_FREE( face->dir_tables );
+ face->num_tables = 0;
+
+ {
+ FT_Stream stream = FT_FACE_STREAM( face );
+
+
+ /* simply release the 'cmap' table frame */
+ FT_FRAME_RELEASE( face->cmap_table );
+ face->cmap_size = 0;
+ }
+
+ /* freeing the horizontal metrics */
+ {
+ FT_Stream stream = FT_FACE_STREAM( face );
+
+
+ FT_FRAME_RELEASE( face->horz_metrics );
+ FT_FRAME_RELEASE( face->vert_metrics );
+ face->horz_metrics_size = 0;
+ face->vert_metrics_size = 0;
+ }
+
+ /* freeing the vertical ones, if any */
+ if ( face->vertical_info )
+ {
+ FT_FREE( face->vertical.long_metrics );
+ FT_FREE( face->vertical.short_metrics );
+ face->vertical_info = 0;
+ }
+
+ /* freeing the gasp table */
+ FT_FREE( face->gasp.gaspRanges );
+ face->gasp.numRanges = 0;
+
+ /* freeing the name table */
+ if ( sfnt )
+ sfnt->free_name( face );
+
+ /* freeing family and style name */
+ FT_FREE( face->root.family_name );
+ FT_FREE( face->root.style_name );
+
+ /* freeing sbit size table */
+ FT_FREE( face->root.available_sizes );
+ face->root.num_fixed_sizes = 0;
+
+ FT_FREE( face->postscript_name );
+
+ face->sfnt = 0;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
new file mode 100644
index 0000000000..10be62c5f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/* */
+/* sfobjs.h */
+/* */
+/* SFNT object management (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFOBJS_H__
+#define __SFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ sfnt_init_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( FT_Error )
+ sfnt_load_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ sfnt_done_face( TT_Face face );
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
new file mode 100644
index 0000000000..7fb6365a38
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
@@ -0,0 +1,250 @@
+/***************************************************************************/
+/* */
+/* ttbdf.c */
+/* */
+/* TrueType and OpenType embedded BDF properties (body). */
+/* */
+/* Copyright 2005, 2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttbdf.h"
+
+#include "sferrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttbdf
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_bdf_props( TT_Face face )
+ {
+ TT_BDF bdf = &face->bdf;
+
+
+ if ( bdf->loaded )
+ {
+ FT_Stream stream = FT_FACE(face)->stream;
+
+
+ if ( bdf->table != NULL )
+ FT_FRAME_RELEASE( bdf->table );
+
+ bdf->table_end = NULL;
+ bdf->strings = NULL;
+ bdf->strings_size = 0;
+ }
+ }
+
+
+ static FT_Error
+ tt_face_load_bdf_props( TT_Face face,
+ FT_Stream stream )
+ {
+ TT_BDF bdf = &face->bdf;
+ FT_ULong length;
+ FT_Error error;
+
+
+ FT_ZERO( bdf );
+
+ error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
+ if ( error ||
+ length < 8 ||
+ FT_FRAME_EXTRACT( length, bdf->table ) )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ bdf->table_end = bdf->table + length;
+
+ {
+ FT_Byte* p = bdf->table;
+ FT_UInt version = FT_NEXT_USHORT( p );
+ FT_UInt num_strikes = FT_NEXT_USHORT( p );
+ FT_ULong strings = FT_NEXT_ULONG ( p );
+ FT_UInt count;
+ FT_Byte* strike;
+
+
+ if ( version != 0x0001 ||
+ strings < 8 ||
+ ( strings - 8 ) / 4 < num_strikes ||
+ strings + 1 > length )
+ {
+ goto BadTable;
+ }
+
+ bdf->num_strikes = num_strikes;
+ bdf->strings = bdf->table + strings;
+ bdf->strings_size = length - strings;
+
+ count = bdf->num_strikes;
+ p = bdf->table + 8;
+ strike = p + count * 4;
+
+
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt num_items = FT_PEEK_USHORT( p + 2 );
+
+ /*
+ * We don't need to check the value sets themselves, since this
+ * is done later.
+ */
+ strike += 10 * num_items;
+
+ p += 4;
+ }
+
+ if ( strike > bdf->strings )
+ goto BadTable;
+ }
+
+ bdf->loaded = 1;
+
+ Exit:
+ return error;
+
+ BadTable:
+ FT_FRAME_RELEASE( bdf->table );
+ FT_ZERO( bdf );
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_find_bdf_prop( TT_Face face,
+ const char* property_name,
+ BDF_PropertyRec *aprop )
+ {
+ TT_BDF bdf = &face->bdf;
+ FT_Size size = FT_FACE(face)->size;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* p;
+ FT_UInt count;
+ FT_Byte* strike;
+ FT_Offset property_len;
+
+
+ aprop->type = BDF_PROPERTY_TYPE_NONE;
+
+ if ( bdf->loaded == 0 )
+ {
+ error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+ if ( error )
+ goto Exit;
+ }
+
+ count = bdf->num_strikes;
+ p = bdf->table + 8;
+ strike = p + 4 * count;
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( size == NULL || property_name == NULL )
+ goto Exit;
+
+ property_len = ft_strlen( property_name );
+ if ( property_len == 0 )
+ goto Exit;
+
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt _ppem = FT_NEXT_USHORT( p );
+ FT_UInt _count = FT_NEXT_USHORT( p );
+
+ if ( _ppem == size->metrics.y_ppem )
+ {
+ count = _count;
+ goto FoundStrike;
+ }
+
+ strike += 10 * _count;
+ }
+ goto Exit;
+
+ FoundStrike:
+ p = strike;
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt type = FT_PEEK_USHORT( p + 4 );
+
+ if ( ( type & 0x10 ) != 0 )
+ {
+ FT_UInt32 name_offset = FT_PEEK_ULONG( p );
+ FT_UInt32 value = FT_PEEK_ULONG( p + 6 );
+
+ /* be a bit paranoid for invalid entries here */
+ if ( name_offset < bdf->strings_size &&
+ property_len < bdf->strings_size - name_offset &&
+ ft_strncmp( property_name,
+ (const char*)bdf->strings + name_offset,
+ bdf->strings_size - name_offset ) == 0 )
+ {
+ switch ( type & 0x0F )
+ {
+ case 0x00: /* string */
+ case 0x01: /* atoms */
+ /* check that the content is really 0-terminated */
+ if ( value < bdf->strings_size &&
+ ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
+ {
+ aprop->type = BDF_PROPERTY_TYPE_ATOM;
+ aprop->u.atom = (const char*)bdf->strings + value;
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+ break;
+
+ case 0x02:
+ aprop->type = BDF_PROPERTY_TYPE_INTEGER;
+ aprop->u.integer = (FT_Int32)value;
+ error = FT_Err_Ok;
+ goto Exit;
+
+ case 0x03:
+ aprop->type = BDF_PROPERTY_TYPE_CARDINAL;
+ aprop->u.cardinal = value;
+ error = FT_Err_Ok;
+ goto Exit;
+
+ default:
+ ;
+ }
+ }
+ }
+ p += 10;
+ }
+
+ Exit:
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
new file mode 100644
index 0000000000..f9d202274a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ttbdf.h */
+/* */
+/* TrueType and OpenType embedded BDF properties (specification). */
+/* */
+/* Copyright 2005 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTBDF_H__
+#define __TTBDF_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+#include "../../include/freetype/ftbdf.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ tt_face_free_bdf_props( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_find_bdf_prop( TT_Face face,
+ const char* property_name,
+ BDF_PropertyRec *aprop );
+
+
+FT_END_HEADER
+
+#endif /* __TTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
new file mode 100644
index 0000000000..668ea7d0d5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
@@ -0,0 +1,3560 @@
+/***************************************************************************/
+/* */
+/* ttcmap.c */
+/* */
+/* TrueType character mapping table (cmap) support (body). */
+/* */
+/* Copyright 2002-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "sfntpic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttcmap
+
+
+#define TT_PEEK_SHORT FT_PEEK_SHORT
+#define TT_PEEK_USHORT FT_PEEK_USHORT
+#define TT_PEEK_UINT24 FT_PEEK_UOFF3
+#define TT_PEEK_LONG FT_PEEK_LONG
+#define TT_PEEK_ULONG FT_PEEK_ULONG
+
+#define TT_NEXT_SHORT FT_NEXT_SHORT
+#define TT_NEXT_USHORT FT_NEXT_USHORT
+#define TT_NEXT_UINT24 FT_NEXT_UOFF3
+#define TT_NEXT_LONG FT_NEXT_LONG
+#define TT_NEXT_ULONG FT_NEXT_ULONG
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap_init( TT_CMap cmap,
+ FT_Byte* table )
+ {
+ cmap->data = table;
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 0 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 0 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* glyph_ids 6 BYTE[256] array of glyph indices */
+ /* 262 */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap0_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2;
+ FT_UInt length = TT_NEXT_USHORT( p );
+
+
+ if ( table + length > valid->limit || length < 262 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices whenever necessary */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt n, idx;
+
+
+ p = table + 6;
+ for ( n = 0; n < 256; n++ )
+ {
+ idx = *p++;
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap0_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+
+
+ return char_code < 256 ? table[6 + char_code] : 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap0_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 charcode = *pchar_code;
+ FT_UInt32 result = 0;
+ FT_UInt gindex = 0;
+
+
+ table += 6; /* go to glyph IDs */
+ while ( ++charcode < 256 )
+ {
+ gindex = table[charcode];
+ if ( gindex != 0 )
+ {
+ result = charcode;
+ break;
+ }
+ }
+
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap0_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 0;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap0_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap0_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 0,
+ (TT_CMap_ValidateFunc)tt_cmap0_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap0_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_0 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 2 *****/
+ /***** *****/
+ /***** This is used for certain CJK encodings that encode text in a *****/
+ /***** mixed 8/16 bits encoding along the following lines: *****/
+ /***** *****/
+ /***** * Certain byte values correspond to an 8-bit character code *****/
+ /***** (typically in the range 0..127 for ASCII compatibility). *****/
+ /***** *****/
+ /***** * Certain byte values signal the first byte of a 2-byte *****/
+ /***** character code (but these values are also valid as the *****/
+ /***** second byte of a 2-byte character). *****/
+ /***** *****/
+ /***** The following charmap lookup and iteration functions all *****/
+ /***** assume that the value "charcode" correspond to following: *****/
+ /***** *****/
+ /***** - For one byte characters, "charcode" is simply the *****/
+ /***** character code. *****/
+ /***** *****/
+ /***** - For two byte characters, "charcode" is the 2-byte *****/
+ /***** character code in big endian format. More exactly: *****/
+ /***** *****/
+ /***** (charcode >> 8) is the first byte value *****/
+ /***** (charcode & 0xFF) is the second byte value *****/
+ /***** *****/
+ /***** Note that not all values of "charcode" are valid according *****/
+ /***** to these rules, and the function moderately check the *****/
+ /***** arguments. *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 2 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* keys 6 USHORT[256] sub-header keys */
+ /* subs 518 SUBHEAD[NSUBS] sub-headers array */
+ /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */
+ /* */
+ /* The `keys' table is used to map charcode high-bytes to sub-headers. */
+ /* The value of `NSUBS' is the number of sub-headers defined in the */
+ /* table and is computed by finding the maximum of the `keys' table. */
+ /* */
+ /* Note that for any n, `keys[n]' is a byte offset within the `subs' */
+ /* table, i.e., it is the corresponding sub-header index multiplied */
+ /* by 8. */
+ /* */
+ /* Each sub-header has the following format: */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* first 0 USHORT first valid low-byte */
+ /* count 2 USHORT number of valid low-bytes */
+ /* delta 4 SHORT see below */
+ /* offset 6 USHORT see below */
+ /* */
+ /* A sub-header defines, for each high-byte, the range of valid */
+ /* low-bytes within the charmap. Note that the range defined by `first' */
+ /* and `count' must be completely included in the interval [0..255] */
+ /* according to the specification. */
+ /* */
+ /* If a character code is contained within a given sub-header, then */
+ /* mapping it to a glyph index is done as follows: */
+ /* */
+ /* * The value of `offset' is read. This is a _byte_ distance from the */
+ /* location of the `offset' field itself into a slice of the */
+ /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */
+ /* */
+ /* * The value `slice[char.lo - first]' is read. If it is 0, there is */
+ /* no glyph for the charcode. Otherwise, the value of `delta' is */
+ /* added to it (modulo 65536) to form a new glyph index. */
+ /* */
+ /* It is up to the validation routine to check that all offsets fall */
+ /* within the glyph IDs table (and not within the `subs' table itself or */
+ /* outside of the CMap). */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap2_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2; /* skip format */
+ FT_UInt length = TT_PEEK_USHORT( p );
+ FT_UInt n, max_subs;
+ FT_Byte* keys; /* keys table */
+ FT_Byte* subs; /* sub-headers */
+ FT_Byte* glyph_ids; /* glyph ID array */
+
+
+ if ( table + length > valid->limit || length < 6 + 512 )
+ FT_INVALID_TOO_SHORT;
+
+ keys = table + 6;
+
+ /* parse keys to compute sub-headers count */
+ p = keys;
+ max_subs = 0;
+ for ( n = 0; n < 256; n++ )
+ {
+ FT_UInt idx = TT_NEXT_USHORT( p );
+
+
+ /* value must be multiple of 8 */
+ if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
+ FT_INVALID_DATA;
+
+ idx >>= 3;
+
+ if ( idx > max_subs )
+ max_subs = idx;
+ }
+
+ FT_ASSERT( p == table + 518 );
+
+ subs = p;
+ glyph_ids = subs + (max_subs + 1) * 8;
+ if ( glyph_ids > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ /* parse sub-headers */
+ for ( n = 0; n <= max_subs; n++ )
+ {
+ FT_UInt first_code, code_count, offset;
+ FT_Int delta;
+ FT_Byte* ids;
+
+
+ first_code = TT_NEXT_USHORT( p );
+ code_count = TT_NEXT_USHORT( p );
+ delta = TT_NEXT_SHORT( p );
+ offset = TT_NEXT_USHORT( p );
+
+ /* many Dynalab fonts have empty sub-headers */
+ if ( code_count == 0 )
+ continue;
+
+ /* check range within 0..255 */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ if ( first_code >= 256 || first_code + code_count > 256 )
+ FT_INVALID_DATA;
+ }
+
+ /* check offset */
+ if ( offset != 0 )
+ {
+ ids = p - 2 + offset;
+ if ( ids < glyph_ids || ids + code_count*2 > table + length )
+ FT_INVALID_OFFSET;
+
+ /* check glyph IDs */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_Byte* limit = p + code_count * 2;
+ FT_UInt idx;
+
+
+ for ( ; p < limit; )
+ {
+ idx = TT_NEXT_USHORT( p );
+ if ( idx != 0 )
+ {
+ idx = ( idx + delta ) & 0xFFFFU;
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* return sub header corresponding to a given character code */
+ /* NULL on invalid charcode */
+ static FT_Byte*
+ tt_cmap2_get_subheader( FT_Byte* table,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* result = NULL;
+
+
+ if ( char_code < 0x10000UL )
+ {
+ FT_UInt char_lo = (FT_UInt)( char_code & 0xFF );
+ FT_UInt char_hi = (FT_UInt)( char_code >> 8 );
+ FT_Byte* p = table + 6; /* keys table */
+ FT_Byte* subs = table + 518; /* subheaders table */
+ FT_Byte* sub;
+
+
+ if ( char_hi == 0 )
+ {
+ /* an 8-bit character code -- we use subHeader 0 in this case */
+ /* to test whether the character code is in the charmap */
+ /* */
+ sub = subs; /* jump to first sub-header */
+
+ /* check that the sub-header for this byte is 0, which */
+ /* indicates that it is really a valid one-byte value */
+ /* Otherwise, return 0 */
+ /* */
+ p += char_lo * 2;
+ if ( TT_PEEK_USHORT( p ) != 0 )
+ goto Exit;
+ }
+ else
+ {
+ /* a 16-bit character code */
+
+ /* jump to key entry */
+ p += char_hi * 2;
+ /* jump to sub-header */
+ sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
+
+ /* check that the high byte isn't a valid one-byte value */
+ if ( sub == subs )
+ goto Exit;
+ }
+ result = sub;
+ }
+ Exit:
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap2_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* subheader;
+
+
+ subheader = tt_cmap2_get_subheader( table, char_code );
+ if ( subheader )
+ {
+ FT_Byte* p = subheader;
+ FT_UInt idx = (FT_UInt)(char_code & 0xFF);
+ FT_UInt start, count;
+ FT_Int delta;
+ FT_UInt offset;
+
+
+ start = TT_NEXT_USHORT( p );
+ count = TT_NEXT_USHORT( p );
+ delta = TT_NEXT_SHORT ( p );
+ offset = TT_PEEK_USHORT( p );
+
+ idx -= start;
+ if ( idx < count && offset != 0 )
+ {
+ p += offset + 2 * idx;
+ idx = TT_PEEK_USHORT( p );
+
+ if ( idx != 0 )
+ result = (FT_UInt)( idx + delta ) & 0xFFFFU;
+ }
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap2_char_next( TT_CMap cmap,
+ FT_UInt32 *pcharcode )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt gindex = 0;
+ FT_UInt32 result = 0;
+ FT_UInt32 charcode = *pcharcode + 1;
+ FT_Byte* subheader;
+
+
+ while ( charcode < 0x10000UL )
+ {
+ subheader = tt_cmap2_get_subheader( table, charcode );
+ if ( subheader )
+ {
+ FT_Byte* p = subheader;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_Int delta = TT_NEXT_SHORT ( p );
+ FT_UInt offset = TT_PEEK_USHORT( p );
+ FT_UInt char_lo = (FT_UInt)( charcode & 0xFF );
+ FT_UInt pos, idx;
+
+
+ if ( offset == 0 )
+ goto Next_SubHeader;
+
+ if ( char_lo < start )
+ {
+ char_lo = start;
+ pos = 0;
+ }
+ else
+ pos = (FT_UInt)( char_lo - start );
+
+ p += offset + pos * 2;
+ charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
+
+ for ( ; pos < count; pos++, charcode++ )
+ {
+ idx = TT_NEXT_USHORT( p );
+
+ if ( idx != 0 )
+ {
+ gindex = ( idx + delta ) & 0xFFFFU;
+ if ( gindex != 0 )
+ {
+ result = charcode;
+ goto Exit;
+ }
+ }
+ }
+ }
+
+ /* jump to next sub-header, i.e. higher byte value */
+ Next_SubHeader:
+ charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+ }
+
+ Exit:
+ *pcharcode = result;
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap2_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 2;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap2_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap2_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 2,
+ (TT_CMap_ValidateFunc)tt_cmap2_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap2_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_2 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 4 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 4 */
+ /* length 2 USHORT table length */
+ /* in bytes */
+ /* language 4 USHORT Mac language code */
+ /* */
+ /* segCountX2 6 USHORT 2*NUM_SEGS */
+ /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */
+ /* entrySelector 10 USHORT LOG_SEGS */
+ /* rangeShift 12 USHORT segCountX2 - */
+ /* searchRange */
+ /* */
+ /* endCount 14 USHORT[NUM_SEGS] end charcode for */
+ /* each segment; last */
+ /* is 0xFFFF */
+ /* */
+ /* pad 14+NUM_SEGS*2 USHORT padding */
+ /* */
+ /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */
+ /* each segment */
+ /* */
+ /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */
+ /* segment */
+ /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */
+ /* each segment; can be */
+ /* zero */
+ /* */
+ /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */
+ /* ranges */
+ /* */
+ /* Character codes are modelled by a series of ordered (increasing) */
+ /* intervals called segments. Each segment has start and end codes, */
+ /* provided by the `startCount' and `endCount' arrays. Segments must */
+ /* not overlap, and the last segment should always contain the value */
+ /* 0xFFFF for `endCount'. */
+ /* */
+ /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
+ /* ignored (they are traces of over-engineering in the TrueType */
+ /* specification). */
+ /* */
+ /* Each segment also has a signed `delta', as well as an optional offset */
+ /* within the `glyphIds' table. */
+ /* */
+ /* If a segment's idOffset is 0, the glyph index corresponding to any */
+ /* charcode within the segment is obtained by adding the value of */
+ /* `idDelta' directly to the charcode, modulo 65536. */
+ /* */
+ /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */
+ /* the segment, and the value of `idDelta' is added to it. */
+ /* */
+ /* */
+ /* Finally, note that a lot of fonts contain an invalid last segment, */
+ /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */
+ /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */
+ /* OpenOffice.org). We need special code to deal with them correctly. */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+
+ typedef struct TT_CMap4Rec_
+ {
+ TT_CMapRec cmap;
+ FT_UInt32 cur_charcode; /* current charcode */
+ FT_UInt cur_gindex; /* current glyph index */
+
+ FT_UInt num_ranges;
+ FT_UInt cur_range;
+ FT_UInt cur_start;
+ FT_UInt cur_end;
+ FT_Int cur_delta;
+ FT_Byte* cur_values;
+
+ } TT_CMap4Rec, *TT_CMap4;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_init( TT_CMap4 cmap,
+ FT_Byte* table )
+ {
+ FT_Byte* p;
+
+
+ cmap->cmap.data = table;
+
+ p = table + 6;
+ cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1;
+ cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+ cmap->cur_gindex = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Int
+ tt_cmap4_set_range( TT_CMap4 cmap,
+ FT_UInt range_index )
+ {
+ FT_Byte* table = cmap->cmap.data;
+ FT_Byte* p;
+ FT_UInt num_ranges = cmap->num_ranges;
+
+
+ while ( range_index < num_ranges )
+ {
+ FT_UInt offset;
+
+
+ p = table + 14 + range_index * 2;
+ cmap->cur_end = FT_PEEK_USHORT( p );
+
+ p += 2 + num_ranges * 2;
+ cmap->cur_start = FT_PEEK_USHORT( p );
+
+ p += num_ranges * 2;
+ cmap->cur_delta = FT_PEEK_SHORT( p );
+
+ p += num_ranges * 2;
+ offset = FT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( range_index >= num_ranges - 1 &&
+ cmap->cur_start == 0xFFFFU &&
+ cmap->cur_end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ cmap->cur_delta = 1;
+ offset = 0;
+ }
+ }
+
+ if ( offset != 0xFFFFU )
+ {
+ cmap->cur_values = offset ? p + offset : NULL;
+ cmap->cur_range = range_index;
+ return 0;
+ }
+
+ /* we skip empty segments */
+ range_index++;
+ }
+
+ return -1;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode; */
+ /* caller should call tt_cmap4_set_range with proper range */
+ /* before calling this function */
+ /* */
+ static void
+ tt_cmap4_next( TT_CMap4 cmap )
+ {
+ FT_UInt charcode;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFUL )
+ goto Fail;
+
+ charcode = (FT_UInt)cmap->cur_charcode + 1;
+
+ if ( charcode < cmap->cur_start )
+ charcode = cmap->cur_start;
+
+ for ( ;; )
+ {
+ FT_Byte* values = cmap->cur_values;
+ FT_UInt end = cmap->cur_end;
+ FT_Int delta = cmap->cur_delta;
+
+
+ if ( charcode <= end )
+ {
+ if ( values )
+ {
+ FT_Byte* p = values + 2 * ( charcode - cmap->cur_start );
+
+
+ do
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex != 0 )
+ {
+ gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
+ if ( gindex != 0 )
+ {
+ cmap->cur_charcode = charcode;
+ cmap->cur_gindex = gindex;
+ return;
+ }
+ }
+ } while ( ++charcode <= end );
+ }
+ else
+ {
+ do
+ {
+ FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
+
+
+ if ( gindex != 0 )
+ {
+ cmap->cur_charcode = charcode;
+ cmap->cur_gindex = gindex;
+ return;
+ }
+ } while ( ++charcode <= end );
+ }
+ }
+
+ /* we need to find another range */
+ if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
+ break;
+
+ if ( charcode < cmap->cur_start )
+ charcode = cmap->cur_start;
+ }
+
+ Fail:
+ cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+ cmap->cur_gindex = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2; /* skip format */
+ FT_UInt length = TT_NEXT_USHORT( p );
+ FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids;
+ FT_UInt num_segs;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( length < 16 )
+ FT_INVALID_TOO_SHORT;
+
+ /* in certain fonts, the `length' field is invalid and goes */
+ /* out of bound. We try to correct this here... */
+ if ( table + length > valid->limit )
+ {
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ FT_INVALID_TOO_SHORT;
+
+ length = (FT_UInt)( valid->limit - table );
+ }
+
+ p = table + 6;
+ num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */
+
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ /* check that we have an even value here */
+ if ( num_segs & 1 )
+ FT_INVALID_DATA;
+ }
+
+ num_segs /= 2;
+
+ if ( length < 16 + num_segs * 2 * 4 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check the search parameters - even though we never use them */
+ /* */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ /* check the values of `searchRange', `entrySelector', `rangeShift' */
+ FT_UInt search_range = TT_NEXT_USHORT( p );
+ FT_UInt entry_selector = TT_NEXT_USHORT( p );
+ FT_UInt range_shift = TT_NEXT_USHORT( p );
+
+
+ if ( ( search_range | range_shift ) & 1 ) /* must be even values */
+ FT_INVALID_DATA;
+
+ search_range /= 2;
+ range_shift /= 2;
+
+ /* `search range' is the greatest power of 2 that is <= num_segs */
+
+ if ( search_range > num_segs ||
+ search_range * 2 < num_segs ||
+ search_range + range_shift != num_segs ||
+ search_range != ( 1U << entry_selector ) )
+ FT_INVALID_DATA;
+ }
+
+ ends = table + 14;
+ starts = table + 16 + num_segs * 2;
+ deltas = starts + num_segs * 2;
+ offsets = deltas + num_segs * 2;
+ glyph_ids = offsets + num_segs * 2;
+
+ /* check last segment; its end count value must be 0xFFFF */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ p = ends + ( num_segs - 1 ) * 2;
+ if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
+ FT_INVALID_DATA;
+ }
+
+ {
+ FT_UInt start, end, offset, n;
+ FT_UInt last_start = 0, last_end = 0;
+ FT_Int delta;
+ FT_Byte* p_start = starts;
+ FT_Byte* p_end = ends;
+ FT_Byte* p_delta = deltas;
+ FT_Byte* p_offset = offsets;
+
+
+ for ( n = 0; n < num_segs; n++ )
+ {
+ p = p_offset;
+ start = TT_NEXT_USHORT( p_start );
+ end = TT_NEXT_USHORT( p_end );
+ delta = TT_NEXT_SHORT( p_delta );
+ offset = TT_NEXT_USHORT( p_offset );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ /* this test should be performed at default validation level; */
+ /* unfortunately, some popular Asian fonts have overlapping */
+ /* ranges in their charmaps */
+ /* */
+ if ( start <= last_end && n > 0 )
+ {
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ FT_INVALID_DATA;
+ else
+ {
+ /* allow overlapping segments, provided their start points */
+ /* and end points, respectively, are in ascending order */
+ /* */
+ if ( last_start > start || last_end > end )
+ error |= TT_CMAP_FLAG_UNSORTED;
+ else
+ error |= TT_CMAP_FLAG_OVERLAPPING;
+ }
+ }
+
+ if ( offset && offset != 0xFFFFU )
+ {
+ p += offset; /* start of glyph ID array */
+
+ /* check that we point within the glyph IDs table only */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( p < glyph_ids ||
+ p + ( end - start + 1 ) * 2 > table + length )
+ FT_INVALID_DATA;
+ }
+ /* Some fonts handle the last segment incorrectly. In */
+ /* theory, 0xFFFF might point to an ordinary glyph -- */
+ /* a cmap 4 is versatile and could be used for any */
+ /* encoding, not only Unicode. However, reality shows */
+ /* that far too many fonts are sloppy and incorrectly */
+ /* set all fields but `start' and `end' for the last */
+ /* segment if it contains only a single character. */
+ /* */
+ /* We thus omit the test here, delaying it to the */
+ /* routines which actually access the cmap. */
+ else if ( n != num_segs - 1 ||
+ !( start == 0xFFFFU && end == 0xFFFFU ) )
+ {
+ if ( p < glyph_ids ||
+ p + ( end - start + 1 ) * 2 > valid->limit )
+ FT_INVALID_DATA;
+ }
+
+ /* check glyph indices within the segment range */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt i, idx;
+
+
+ for ( i = start; i < end; i++ )
+ {
+ idx = FT_NEXT_USHORT( p );
+ if ( idx != 0 )
+ {
+ idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
+
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+ else if ( offset == 0xFFFFU )
+ {
+ /* some fonts (erroneously?) use a range offset of 0xFFFF */
+ /* to mean missing glyph in cmap table */
+ /* */
+ if ( valid->level >= FT_VALIDATE_PARANOID ||
+ n != num_segs - 1 ||
+ !( start == 0xFFFFU && end == 0xFFFFU ) )
+ FT_INVALID_DATA;
+ }
+
+ last_start = start;
+ last_end = end;
+ }
+ }
+
+ return error;
+ }
+
+
+ static FT_UInt
+ tt_cmap4_char_map_linear( TT_CMap cmap,
+ FT_UInt32* pcharcode,
+ FT_Bool next )
+ {
+ FT_UInt num_segs2, start, end, offset;
+ FT_Int delta;
+ FT_UInt i, num_segs;
+ FT_UInt32 charcode = *pcharcode;
+ FT_UInt gindex = 0;
+ FT_Byte* p;
+
+
+ p = cmap->data + 6;
+ num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+ num_segs = num_segs2 >> 1;
+
+ if ( !num_segs )
+ return 0;
+
+ if ( next )
+ charcode++;
+
+ /* linear search */
+ for ( ; charcode <= 0xFFFFU; charcode++ )
+ {
+ FT_Byte* q;
+
+
+ p = cmap->data + 14; /* ends table */
+ q = cmap->data + 16 + num_segs2; /* starts table */
+
+ for ( i = 0; i < num_segs; i++ )
+ {
+ end = TT_NEXT_USHORT( p );
+ start = TT_NEXT_USHORT( q );
+
+ if ( charcode >= start && charcode <= end )
+ {
+ p = q - 2 + num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( i >= num_segs - 1 &&
+ start == 0xFFFFU && end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ delta = 1;
+ offset = 0;
+ }
+ }
+
+ if ( offset == 0xFFFFU )
+ continue;
+
+ if ( offset )
+ {
+ p += offset + ( charcode - start ) * 2;
+ gindex = TT_PEEK_USHORT( p );
+ if ( gindex != 0 )
+ gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+ }
+ else
+ gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+ break;
+ }
+ }
+
+ if ( !next || gindex )
+ break;
+ }
+
+ if ( next && gindex )
+ *pcharcode = charcode;
+
+ return gindex;
+ }
+
+
+ static FT_UInt
+ tt_cmap4_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pcharcode,
+ FT_Bool next )
+ {
+ FT_UInt num_segs2, start, end, offset;
+ FT_Int delta;
+ FT_UInt max, min, mid, num_segs;
+ FT_UInt charcode = (FT_UInt)*pcharcode;
+ FT_UInt gindex = 0;
+ FT_Byte* p;
+
+
+ p = cmap->data + 6;
+ num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+ if ( !num_segs2 )
+ return 0;
+
+ num_segs = num_segs2 >> 1;
+
+ /* make compiler happy */
+ mid = num_segs;
+ end = 0xFFFFU;
+
+ if ( next )
+ charcode++;
+
+ min = 0;
+ max = num_segs;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 14 + mid * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+
+ if ( charcode < start )
+ max = mid;
+ else if ( charcode > end )
+ min = mid + 1;
+ else
+ {
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( mid >= num_segs - 1 &&
+ start == 0xFFFFU && end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ delta = 1;
+ offset = 0;
+ }
+ }
+
+ /* search the first segment containing `charcode' */
+ if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
+ {
+ FT_UInt i;
+
+
+ /* call the current segment `max' */
+ max = mid;
+
+ if ( offset == 0xFFFFU )
+ mid = max + 1;
+
+ /* search in segments before the current segment */
+ for ( i = max ; i > 0; i-- )
+ {
+ FT_UInt prev_end;
+ FT_Byte* old_p;
+
+
+ old_p = p;
+ p = cmap->data + 14 + ( i - 1 ) * 2;
+ prev_end = TT_PEEK_USHORT( p );
+
+ if ( charcode > prev_end )
+ {
+ p = old_p;
+ break;
+ }
+
+ end = prev_end;
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ if ( offset != 0xFFFFU )
+ mid = i - 1;
+ }
+
+ /* no luck */
+ if ( mid == max + 1 )
+ {
+ if ( i != max )
+ {
+ p = cmap->data + 14 + max * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+ }
+
+ mid = max;
+
+ /* search in segments after the current segment */
+ for ( i = max + 1; i < num_segs; i++ )
+ {
+ FT_UInt next_end, next_start;
+
+
+ p = cmap->data + 14 + i * 2;
+ next_end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ next_start = TT_PEEK_USHORT( p );
+
+ if ( charcode < next_start )
+ break;
+
+ end = next_end;
+ start = next_start;
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ if ( offset != 0xFFFFU )
+ mid = i;
+ }
+ i--;
+
+ /* still no luck */
+ if ( mid == max )
+ {
+ mid = i;
+
+ break;
+ }
+ }
+
+ /* end, start, delta, and offset are for the i'th segment */
+ if ( mid != i )
+ {
+ p = cmap->data + 14 + mid * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+ }
+ }
+ else
+ {
+ if ( offset == 0xFFFFU )
+ break;
+ }
+
+ if ( offset )
+ {
+ p += offset + ( charcode - start ) * 2;
+ gindex = TT_PEEK_USHORT( p );
+ if ( gindex != 0 )
+ gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+ }
+ else
+ gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap4 cmap4 = (TT_CMap4)cmap;
+
+
+ /* if `charcode' is not in any segment, then `mid' is */
+ /* the segment nearest to `charcode' */
+ /* */
+
+ if ( charcode > end )
+ {
+ mid++;
+ if ( mid == num_segs )
+ return 0;
+ }
+
+ if ( tt_cmap4_set_range( cmap4, mid ) )
+ {
+ if ( gindex )
+ *pcharcode = charcode;
+ }
+ else
+ {
+ cmap4->cur_charcode = charcode;
+
+ if ( gindex )
+ cmap4->cur_gindex = gindex;
+ else
+ {
+ cmap4->cur_charcode = charcode;
+ tt_cmap4_next( cmap4 );
+ gindex = cmap4->cur_gindex;
+ }
+
+ if ( gindex )
+ *pcharcode = cmap4->cur_charcode;
+ }
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap4_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ if ( char_code >= 0x10000UL )
+ return 0;
+
+ if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+ return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
+ else
+ return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap4_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt gindex;
+
+
+ if ( *pchar_code >= 0xFFFFU )
+ return 0;
+
+ if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+ gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
+ else
+ {
+ TT_CMap4 cmap4 = (TT_CMap4)cmap;
+
+
+ /* no need to search */
+ if ( *pchar_code == cmap4->cur_charcode )
+ {
+ tt_cmap4_next( cmap4 );
+ gindex = cmap4->cur_gindex;
+ if ( gindex )
+ *pchar_code = cmap4->cur_charcode;
+ }
+ else
+ gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 4;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap4_class_rec,
+ sizeof ( TT_CMap4Rec ),
+ (FT_CMap_InitFunc) tt_cmap4_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap4_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 4,
+ (TT_CMap_ValidateFunc)tt_cmap4_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap4_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_4 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 6 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 4 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* */
+ /* first 6 USHORT first segment code */
+ /* count 8 USHORT segment size in chars */
+ /* glyphIds 10 USHORT[count] glyph IDs */
+ /* */
+ /* A very simplified segment mapping. */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap6_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_UInt length, count;
+
+
+ if ( table + 10 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 2;
+ length = TT_NEXT_USHORT( p );
+
+ p = table + 8; /* skip language and start index */
+ count = TT_NEXT_USHORT( p );
+
+ if ( table + length > valid->limit || length < 10 + count/* * 2 */) // Zhangxuefeng 2013.12.23. remove count multiply 2.
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt gindex;
+
+
+ for ( ; count > 0; count-- )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap6_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 6;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_UInt idx = (FT_UInt)( char_code - start );
+
+
+ if ( idx < count )
+ {
+ p += 2 * idx;
+ result = TT_PEEK_USHORT( p );
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap6_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+
+ FT_Byte* p = table + 6;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_UInt idx;
+
+
+ if ( char_code >= 0x10000UL )
+ goto Exit;
+
+ if ( char_code < start )
+ char_code = start;
+
+ idx = (FT_UInt)( char_code - start );
+ p += 2 * idx;
+
+ for ( ; idx < count; idx++ )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex != 0 )
+ {
+ result = char_code;
+ break;
+ }
+ char_code++;
+ }
+
+ Exit:
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap6_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 6;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap6_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap6_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 6,
+ (TT_CMap_ValidateFunc)tt_cmap6_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap6_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_6 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 8 *****/
+ /***** *****/
+ /***** It is hard to completely understand what the OpenType spec *****/
+ /***** says about this format, but here is my conclusion. *****/
+ /***** *****/
+ /***** The purpose of this format is to easily map UTF-16 text to *****/
+ /***** glyph indices. Basically, the `char_code' must be in one of *****/
+ /***** the following formats: *****/
+ /***** *****/
+ /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/
+ /***** Area (i.e. U+D800-U+DFFF). *****/
+ /***** *****/
+ /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/
+ /***** `char_code = (char_hi << 16) | char_lo', then both *****/
+ /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/
+ /***** Area. *****/
+ /***** *****/
+ /***** The `is32' table embedded in the charmap indicates whether a *****/
+ /***** given 16-bit value is in the surrogates area or not. *****/
+ /***** *****/
+ /***** So, for any given `char_code', we can assert the following: *****/
+ /***** *****/
+ /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/
+ /***** *****/
+ /***** If `char_hi != 0' then we must have both *****/
+ /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 8 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* is32 12 BYTE[8192] 32-bitness bitmap */
+ /* count 8204 ULONG number of groups */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* startId 8 ULONG start glyph ID for the group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap8_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 4;
+ FT_Byte* is32;
+ FT_UInt32 length;
+ FT_UInt32 num_groups;
+
+
+ if ( table + 16 + 8192 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ length = TT_NEXT_ULONG( p );
+ if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
+ FT_INVALID_TOO_SHORT;
+
+ is32 = table + 12;
+ p = is32 + 8192; /* skip `is32' array */
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( p + num_groups * 12 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_UInt32 n, start, end, start_id, count, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ FT_UInt hi, lo;
+
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+
+ count = (FT_UInt32)( end - start + 1 );
+
+ if ( start & ~0xFFFFU )
+ {
+ /* start_hi != 0; check that is32[i] is 1 for each i in */
+ /* the `hi' and `lo' of the range [start..end] */
+ for ( ; count > 0; count--, start++ )
+ {
+ hi = (FT_UInt)( start >> 16 );
+ lo = (FT_UInt)( start & 0xFFFFU );
+
+ if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
+ FT_INVALID_DATA;
+
+ if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
+ FT_INVALID_DATA;
+ }
+ }
+ else
+ {
+ /* start_hi == 0; check that is32[i] is 0 for each i in */
+ /* the range [start..end] */
+
+ /* end_hi cannot be != 0! */
+ if ( end & ~0xFFFFU )
+ FT_INVALID_DATA;
+
+ for ( ; count > 0; count--, start++ )
+ {
+ lo = (FT_UInt)( start & 0xFFFFU );
+
+ if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
+ FT_INVALID_DATA;
+ }
+ }
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap8_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 8204;
+ FT_UInt32 num_groups = TT_NEXT_ULONG( p );
+ FT_UInt32 start, end, start_id;
+
+
+ for ( ; num_groups > 0; num_groups-- )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ break;
+
+ if ( char_code <= end )
+ {
+ result = (FT_UInt)( start_id + char_code - start );
+ break;
+ }
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap8_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt32 result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+ FT_Byte* table = cmap->data;
+ FT_Byte* p = table + 8204;
+ FT_UInt32 num_groups = TT_NEXT_ULONG( p );
+ FT_UInt32 start, end, start_id;
+
+
+ p = table + 8208;
+
+ for ( ; num_groups > 0; num_groups-- )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ if ( char_code <= end )
+ {
+ gindex = (FT_UInt)( char_code - start + start_id );
+ if ( gindex != 0 )
+ {
+ result = char_code;
+ goto Exit;
+ }
+ }
+ }
+
+ Exit:
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap8_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 8;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap8_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap8_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 8,
+ (TT_CMap_ValidateFunc)tt_cmap8_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap8_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_8 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 10 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 10 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* */
+ /* start 12 ULONG first char in range */
+ /* count 16 ULONG number of chars in range */
+ /* glyphIds 20 USHORT[count] glyph indices covered */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap10_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 4;
+ FT_ULong length, count;
+
+
+ if ( table + 20 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ length = TT_NEXT_ULONG( p );
+ p = table + 16;
+ count = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 20 + count * 2 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt gindex;
+
+
+ for ( ; count > 0; count-- )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap10_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 12;
+ FT_UInt32 start = TT_NEXT_ULONG( p );
+ FT_UInt32 count = TT_NEXT_ULONG( p );
+ FT_UInt32 idx = (FT_ULong)( char_code - start );
+
+
+ if ( idx < count )
+ {
+ p += 2 * idx;
+ result = TT_PEEK_USHORT( p );
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap10_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+ FT_Byte* p = table + 12;
+ FT_UInt32 start = TT_NEXT_ULONG( p );
+ FT_UInt32 count = TT_NEXT_ULONG( p );
+ FT_UInt32 idx;
+
+
+ if ( char_code < start )
+ char_code = start;
+
+ idx = (FT_UInt32)( char_code - start );
+ p += 2 * idx;
+
+ for ( ; idx < count; idx++ )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex != 0 )
+ break;
+ char_code++;
+ }
+
+ *pchar_code = char_code;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap10_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 10;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap10_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap10_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 10,
+ (TT_CMap_ValidateFunc)tt_cmap10_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap10_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_10 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 12 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 12 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* count 12 ULONG number of groups */
+ /* 16 */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* startId 8 ULONG start glyph ID for the group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+
+ typedef struct TT_CMap12Rec_
+ {
+ TT_CMapRec cmap;
+ FT_Bool valid;
+ FT_ULong cur_charcode;
+ FT_UInt cur_gindex;
+ FT_ULong cur_group;
+ FT_ULong num_groups;
+
+ } TT_CMap12Rec, *TT_CMap12;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_init( TT_CMap12 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 12;
+ cmap->num_groups = FT_PEEK_ULONG( table );
+
+ cmap->valid = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_ULong length;
+ FT_ULong num_groups;
+
+
+ if ( table + 16 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 4;
+ length = TT_NEXT_ULONG( p );
+
+ p = table + 12;
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 16 + 12 * num_groups )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_ULong n, start, end, start_id, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode */
+ /* cmap->cur_group should be set up properly by caller */
+ /* */
+ static void
+ tt_cmap12_next( TT_CMap12 cmap )
+ {
+ FT_Byte* p;
+ FT_ULong start, end, start_id, char_code;
+ FT_ULong n;
+ FT_UInt gindex;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+ goto Fail;
+
+ char_code = cmap->cur_charcode + 1;
+
+ n = cmap->cur_group;
+
+ for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+ {
+ p = cmap->cmap.data + 16 + 12 * n;
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_PEEK_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ for ( ; char_code <= end; char_code++ )
+ {
+ gindex = (FT_UInt)( start_id + char_code - start );
+
+ if ( gindex )
+ {
+ cmap->cur_charcode = char_code;;
+ cmap->cur_gindex = gindex;
+ cmap->cur_group = n;
+
+ return;
+ }
+ }
+ }
+
+ Fail:
+ cmap->valid = 0;
+ }
+
+
+ static FT_UInt
+ tt_cmap12_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pchar_code,
+ FT_Bool next )
+ {
+ FT_UInt gindex = 0;
+ FT_Byte* p = cmap->data + 12;
+ FT_UInt32 num_groups = TT_PEEK_ULONG( p );
+ FT_UInt32 char_code = *pchar_code;
+ FT_UInt32 start, end, start_id;
+ FT_UInt32 max, min, mid;
+
+
+ if ( !num_groups )
+ return 0;
+
+ /* make compiler happy */
+ mid = num_groups;
+ end = 0xFFFFFFFFUL;
+
+ if ( next )
+ char_code++;
+
+ min = 0;
+ max = num_groups;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 16 + 12 * mid;
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > end )
+ min = mid + 1;
+ else
+ {
+ start_id = TT_PEEK_ULONG( p );
+ gindex = (FT_UInt)( start_id + char_code - start );
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap12 cmap12 = (TT_CMap12)cmap;
+
+
+ /* if `char_code' is not in any group, then `mid' is */
+ /* the group nearest to `char_code' */
+ /* */
+
+ if ( char_code > end )
+ {
+ mid++;
+ if ( mid == num_groups )
+ return 0;
+ }
+
+ cmap12->valid = 1;
+ cmap12->cur_charcode = char_code;
+ cmap12->cur_group = mid;
+
+ if ( !gindex )
+ {
+ tt_cmap12_next( cmap12 );
+
+ if ( cmap12->valid )
+ gindex = cmap12->cur_gindex;
+ }
+ else
+ cmap12->cur_gindex = gindex;
+
+ if ( gindex )
+ *pchar_code = cmap12->cur_charcode;
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap12_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap12_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ TT_CMap12 cmap12 = (TT_CMap12)cmap;
+ FT_ULong gindex;
+
+
+ if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
+ return 0;
+
+ /* no need to search */
+ if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
+ {
+ tt_cmap12_next( cmap12 );
+ if ( cmap12->valid )
+ {
+ gindex = cmap12->cur_gindex;
+
+ /* XXX: check cur_charcode overflow is expected */
+ if ( gindex )
+ *pchar_code = (FT_UInt32)cmap12->cur_charcode;
+ }
+ else
+ gindex = 0;
+ }
+ else
+ gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
+
+ /* XXX: check gindex overflow is expected */
+ return (FT_UInt32)gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 12;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap12_class_rec,
+ sizeof ( TT_CMap12Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap12_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap12_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 12,
+ (TT_CMap_ValidateFunc)tt_cmap12_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap12_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_12 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 13 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 13 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* count 12 ULONG number of groups */
+ /* 16 */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* glyphId 8 ULONG glyph ID for the whole group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+
+ typedef struct TT_CMap13Rec_
+ {
+ TT_CMapRec cmap;
+ FT_Bool valid;
+ FT_ULong cur_charcode;
+ FT_UInt cur_gindex;
+ FT_ULong cur_group;
+ FT_ULong num_groups;
+
+ } TT_CMap13Rec, *TT_CMap13;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_init( TT_CMap13 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 12;
+ cmap->num_groups = FT_PEEK_ULONG( table );
+
+ cmap->valid = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_ULong length;
+ FT_ULong num_groups;
+
+
+ if ( table + 16 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 4;
+ length = TT_NEXT_ULONG( p );
+
+ p = table + 12;
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 16 + 12 * num_groups )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_ULong n, start, end, glyph_id, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ glyph_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode */
+ /* cmap->cur_group should be set up properly by caller */
+ /* */
+ static void
+ tt_cmap13_next( TT_CMap13 cmap )
+ {
+ FT_Byte* p;
+ FT_ULong start, end, glyph_id, char_code;
+ FT_ULong n;
+ FT_UInt gindex;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+ goto Fail;
+
+ char_code = cmap->cur_charcode + 1;
+
+ n = cmap->cur_group;
+
+ for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+ {
+ p = cmap->cmap.data + 16 + 12 * n;
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ glyph_id = TT_PEEK_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ if ( char_code <= end )
+ {
+ gindex = (FT_UInt)glyph_id;
+
+ if ( gindex )
+ {
+ cmap->cur_charcode = char_code;;
+ cmap->cur_gindex = gindex;
+ cmap->cur_group = n;
+
+ return;
+ }
+ }
+ }
+
+ Fail:
+ cmap->valid = 0;
+ }
+
+
+ static FT_UInt
+ tt_cmap13_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pchar_code,
+ FT_Bool next )
+ {
+ FT_UInt gindex = 0;
+ FT_Byte* p = cmap->data + 12;
+ FT_UInt32 num_groups = TT_PEEK_ULONG( p );
+ FT_UInt32 char_code = *pchar_code;
+ FT_UInt32 start, end;
+ FT_UInt32 max, min, mid;
+
+
+ if ( !num_groups )
+ return 0;
+
+ /* make compiler happy */
+ mid = num_groups;
+ end = 0xFFFFFFFFUL;
+
+ if ( next )
+ char_code++;
+
+ min = 0;
+ max = num_groups;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 16 + 12 * mid;
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > end )
+ min = mid + 1;
+ else
+ {
+ gindex = (FT_UInt)TT_PEEK_ULONG( p );
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap13 cmap13 = (TT_CMap13)cmap;
+
+
+ /* if `char_code' is not in any group, then `mid' is */
+ /* the group nearest to `char_code' */
+
+ if ( char_code > end )
+ {
+ mid++;
+ if ( mid == num_groups )
+ return 0;
+ }
+
+ cmap13->valid = 1;
+ cmap13->cur_charcode = char_code;
+ cmap13->cur_group = mid;
+
+ if ( !gindex )
+ {
+ tt_cmap13_next( cmap13 );
+
+ if ( cmap13->valid )
+ gindex = cmap13->cur_gindex;
+ }
+ else
+ cmap13->cur_gindex = gindex;
+
+ if ( gindex )
+ *pchar_code = cmap13->cur_charcode;
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap13_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap13_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ TT_CMap13 cmap13 = (TT_CMap13)cmap;
+ FT_UInt gindex;
+
+
+ if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
+ return 0;
+
+ /* no need to search */
+ if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
+ {
+ tt_cmap13_next( cmap13 );
+ if ( cmap13->valid )
+ {
+ gindex = cmap13->cur_gindex;
+ if ( gindex )
+ *pchar_code = cmap13->cur_charcode;
+ }
+ else
+ gindex = 0;
+ }
+ else
+ gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 13;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap13_class_rec,
+ sizeof ( TT_CMap13Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap13_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap13_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 13,
+ (TT_CMap_ValidateFunc)tt_cmap13_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap13_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_13 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 14 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 14 */
+ /* length 2 ULONG table length in bytes */
+ /* numSelector 6 ULONG number of variation sel. records */
+ /* */
+ /* Followed by numSelector records, each of which looks like */
+ /* */
+ /* varSelector 0 UINT24 Unicode codepoint of sel. */
+ /* defaultOff 3 ULONG offset to a default UVS table */
+ /* describing any variants to be found in */
+ /* the normal Unicode subtable. */
+ /* nonDefOff 7 ULONG offset to a non-default UVS table */
+ /* describing any variants not in the */
+ /* standard cmap, with GIDs here */
+ /* (either offset may be 0 NULL) */
+ /* */
+ /* Selectors are sorted by code point. */
+ /* */
+ /* A default Unicode Variation Selector (UVS) subtable is just a list of */
+ /* ranges of code points which are to be found in the standard cmap. No */
+ /* glyph IDs (GIDs) here. */
+ /* */
+ /* numRanges 0 ULONG number of ranges following */
+ /* */
+ /* A range looks like */
+ /* */
+ /* uniStart 0 UINT24 code point of the first character in */
+ /* this range */
+ /* additionalCnt 3 UBYTE count of additional characters in this */
+ /* range (zero means a range of a single */
+ /* character) */
+ /* */
+ /* Ranges are sorted by `uniStart'. */
+ /* */
+ /* A non-default Unicode Variation Selector (UVS) subtable is a list of */
+ /* mappings from codepoint to GID. */
+ /* */
+ /* numMappings 0 ULONG number of mappings */
+ /* */
+ /* A range looks like */
+ /* */
+ /* uniStart 0 UINT24 code point of the first character in */
+ /* this range */
+ /* GID 3 USHORT and its GID */
+ /* */
+ /* Ranges are sorted by `uniStart'. */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+
+ typedef struct TT_CMap14Rec_
+ {
+ TT_CMapRec cmap;
+ FT_ULong num_selectors;
+
+ /* This array is used to store the results of various
+ * cmap 14 query functions. The data is overwritten
+ * on each call to these functions.
+ */
+ FT_UInt32 max_results;
+ FT_UInt32* results;
+ FT_Memory memory;
+
+ } TT_CMap14Rec, *TT_CMap14;
+
+
+ FT_CALLBACK_DEF( void )
+ tt_cmap14_done( TT_CMap14 cmap )
+ {
+ FT_Memory memory = cmap->memory;
+
+
+ cmap->max_results = 0;
+ if ( memory != NULL && cmap->results != NULL )
+ FT_FREE( cmap->results );
+ }
+
+
+ static FT_Error
+ tt_cmap14_ensure( TT_CMap14 cmap,
+ FT_UInt32 num_results,
+ FT_Memory memory )
+ {
+ FT_UInt32 old_max = cmap->max_results;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( num_results > cmap->max_results )
+ {
+ cmap->memory = memory;
+
+ if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
+ return error;
+
+ cmap->max_results = num_results;
+ }
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_init( TT_CMap14 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 6;
+ cmap->num_selectors = FT_PEEK_ULONG( table );
+ cmap->max_results = 0;
+ cmap->results = NULL;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2;
+ FT_ULong length = TT_NEXT_ULONG( p );
+ FT_ULong num_selectors = TT_NEXT_ULONG( p );
+
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 10 + 11 * num_selectors )
+ FT_INVALID_TOO_SHORT;
+
+ /* check selectors, they must be in increasing order */
+ {
+ /* we start lastVarSel at 1 because a variant selector value of 0
+ * isn't valid.
+ */
+ FT_ULong n, lastVarSel = 1;
+
+
+ for ( n = 0; n < num_selectors; n++ )
+ {
+ FT_ULong varSel = TT_NEXT_UINT24( p );
+ FT_ULong defOff = TT_NEXT_ULONG( p );
+ FT_ULong nondefOff = TT_NEXT_ULONG( p );
+
+
+ if ( defOff >= length || nondefOff >= length )
+ FT_INVALID_TOO_SHORT;
+
+ if ( varSel < lastVarSel )
+ FT_INVALID_DATA;
+
+ lastVarSel = varSel + 1;
+
+ /* check the default table (these glyphs should be reached */
+ /* through the normal Unicode cmap, no GIDs, just check order) */
+ if ( defOff != 0 )
+ {
+ FT_Byte* defp = table + defOff;
+ FT_ULong numRanges = TT_NEXT_ULONG( defp );
+ FT_ULong i;
+ FT_ULong lastBase = 0;
+
+
+ if ( defp + numRanges * 4 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ for ( i = 0; i < numRanges; ++i )
+ {
+ FT_ULong base = TT_NEXT_UINT24( defp );
+ FT_ULong cnt = FT_NEXT_BYTE( defp );
+
+
+ if ( base + cnt >= 0x110000UL ) /* end of Unicode */
+ FT_INVALID_DATA;
+
+ if ( base < lastBase )
+ FT_INVALID_DATA;
+
+ lastBase = base + cnt + 1U;
+ }
+ }
+
+ /* and the non-default table (these glyphs are specified here) */
+ if ( nondefOff != 0 )
+ {
+ FT_Byte* ndp = table + nondefOff;
+ FT_ULong numMappings = TT_NEXT_ULONG( ndp );
+ FT_ULong i, lastUni = 0;
+
+
+ if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )
+ FT_INVALID_TOO_SHORT;
+
+ for ( i = 0; i < numMappings; ++i )
+ {
+ FT_ULong uni = TT_NEXT_UINT24( ndp );
+ FT_ULong gid = TT_NEXT_USHORT( ndp );
+
+
+ if ( uni >= 0x110000UL ) /* end of Unicode */
+ FT_INVALID_DATA;
+
+ if ( uni < lastUni )
+ FT_INVALID_DATA;
+
+ lastUni = uni + 1U;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT &&
+ gid >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap14_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UNUSED( cmap );
+ FT_UNUSED( char_code );
+
+ /* This can't happen */
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap14_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UNUSED( cmap );
+
+ /* This can't happen */
+ *pchar_code = 0;
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_UNUSED( cmap );
+
+ cmap_info->format = 14;
+ /* subtable 14 does not define a language field */
+ cmap_info->language = 0xFFFFFFFFUL;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_char_map_def_binary( FT_Byte *base,
+ FT_UInt32 char_code )
+ {
+ FT_UInt32 numRanges = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numRanges;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 4 * mid;
+ FT_ULong start = TT_NEXT_UINT24( p );
+ FT_UInt cnt = FT_NEXT_BYTE( p );
+
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > start+cnt )
+ min = mid + 1;
+ else
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_char_map_nondef_binary( FT_Byte *base,
+ FT_UInt32 char_code )
+ {
+ FT_UInt32 numMappings = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numMappings;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 5 * mid;
+ FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+ if ( char_code < uni )
+ max = mid;
+ else if ( char_code > uni )
+ min = mid + 1;
+ else
+ return TT_PEEK_USHORT( p );
+ }
+
+ return 0;
+ }
+
+
+ static FT_Byte*
+ tt_cmap14_find_variant( FT_Byte *base,
+ FT_UInt32 variantCode )
+ {
+ FT_UInt32 numVar = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numVar;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 11 * mid;
+ FT_ULong varSel = TT_NEXT_UINT24( p );
+
+
+ if ( variantCode < varSel )
+ max = mid;
+ else if ( variantCode > varSel )
+ min = mid + 1;
+ else
+ return p;
+ }
+
+ return NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap14_char_var_index( TT_CMap cmap,
+ TT_CMap ucmap,
+ FT_UInt32 charcode,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return 0;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_PEEK_ULONG( p );
+
+ if ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+ {
+ /* This is the default variant of this charcode. GID not stored */
+ /* here; stored in the normal Unicode charmap instead. */
+ return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
+ }
+
+ if ( nondefOff != 0 )
+ return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charcode );
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Int )
+ tt_cmap14_char_var_isdefault( TT_CMap cmap,
+ FT_UInt32 charcode,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return -1;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_NEXT_ULONG( p );
+
+ if ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+ return 1;
+
+ if ( nondefOff != 0 &&
+ tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charcode ) != 0 )
+ return 0;
+
+ return -1;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32* )
+ tt_cmap14_variants( TT_CMap cmap,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14)cmap;
+ FT_UInt32 count = cmap14->num_selectors;
+ FT_Byte* p = cmap->data + 10;
+ FT_UInt32* result;
+ FT_UInt32 i;
+
+
+ if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+ return NULL;
+
+ result = cmap14->results;
+ for ( i = 0; i < count; ++i )
+ {
+ result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 8;
+ }
+ result[i] = 0;
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 * )
+ tt_cmap14_char_variants( TT_CMap cmap,
+ FT_Memory memory,
+ FT_UInt32 charCode )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 count = cmap14->num_selectors;
+ FT_Byte* p = cmap->data + 10;
+ FT_UInt32* q;
+
+
+ if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+ return NULL;
+
+ for ( q = cmap14->results; count > 0; --count )
+ {
+ FT_UInt32 varSel = TT_NEXT_UINT24( p );
+ FT_ULong defOff = TT_NEXT_ULONG( p );
+ FT_ULong nondefOff = TT_NEXT_ULONG( p );
+
+
+ if ( ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff,
+ charCode ) ) ||
+ ( nondefOff != 0 &&
+ tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charCode ) != 0 ) )
+ {
+ q[0] = varSel;
+ q++;
+ }
+ }
+ q[0] = 0;
+
+ return cmap14->results;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_def_char_count( FT_Byte *p )
+ {
+ FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+ FT_UInt tot = 0;
+
+
+ p += 3; /* point to the first `cnt' field */
+ for ( ; numRanges > 0; numRanges-- )
+ {
+ tot += 1 + p[0];
+ p += 4;
+ }
+
+ return tot;
+ }
+
+
+ static FT_UInt32*
+ tt_cmap14_get_def_chars( TT_CMap cmap,
+ FT_Byte* p,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numRanges;
+ FT_UInt cnt;
+ FT_UInt32* q;
+
+
+ cnt = tt_cmap14_def_char_count( p );
+ numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+
+ if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
+ return NULL;
+
+ for ( q = cmap14->results; numRanges > 0; --numRanges )
+ {
+ FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+ cnt = FT_NEXT_BYTE( p ) + 1;
+ do
+ {
+ q[0] = uni;
+ uni += 1;
+ q += 1;
+
+ } while ( --cnt != 0 );
+ }
+ q[0] = 0;
+
+ return cmap14->results;
+ }
+
+
+ static FT_UInt32*
+ tt_cmap14_get_nondef_chars( TT_CMap cmap,
+ FT_Byte *p,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numMappings;
+ FT_UInt i;
+ FT_UInt32 *ret;
+
+
+ numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+
+ if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
+ return NULL;
+
+ ret = cmap14->results;
+ for ( i = 0; i < numMappings; ++i )
+ {
+ ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ }
+ ret[i] = 0;
+
+ return ret;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 * )
+ tt_cmap14_variant_chars( TT_CMap cmap,
+ FT_Memory memory,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6,
+ variantSelector );
+ FT_UInt32 *ret;
+ FT_Int i;
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return NULL;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_NEXT_ULONG( p );
+
+ if ( defOff == 0 && nondefOff == 0 )
+ return NULL;
+
+ if ( defOff == 0 )
+ return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+ memory );
+ else if ( nondefOff == 0 )
+ return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+ memory );
+ else
+ {
+ /* Both a default and a non-default glyph set? That's probably not */
+ /* good font design, but the spec allows for it... */
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numRanges;
+ FT_UInt32 numMappings;
+ FT_UInt32 duni;
+ FT_UInt32 dcnt;
+ FT_UInt32 nuni;
+ FT_Byte* dp;
+ FT_UInt di, ni, k;
+
+
+ p = cmap->data + nondefOff;
+ dp = cmap->data + defOff;
+
+ numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+ dcnt = tt_cmap14_def_char_count( dp );
+ numRanges = (FT_UInt32)TT_NEXT_ULONG( dp );
+
+ if ( numMappings == 0 )
+ return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+ memory );
+ if ( dcnt == 0 )
+ return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+ memory );
+
+ if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
+ return NULL;
+
+ ret = cmap14->results;
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+ di = 1;
+ nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ ni = 1;
+ i = 0;
+
+ for ( ;; )
+ {
+ if ( nuni > duni + dcnt )
+ {
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+
+ ++di;
+
+ if ( di > numRanges )
+ break;
+
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+ }
+ else
+ {
+ if ( nuni < duni )
+ ret[i++] = nuni;
+ /* If it is within the default range then ignore it -- */
+ /* that should not have happened */
+ ++ni;
+ if ( ni > numMappings )
+ break;
+
+ nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ }
+ }
+
+ if ( ni <= numMappings )
+ {
+ /* If we get here then we have run out of all default ranges. */
+ /* We have read one non-default mapping which we haven't stored */
+ /* and there may be others that need to be read. */
+ ret[i++] = nuni;
+ while ( ni < numMappings )
+ {
+ ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ ++ni;
+ }
+ }
+ else if ( di <= numRanges )
+ {
+ /* If we get here then we have run out of all non-default */
+ /* mappings. We have read one default range which we haven't */
+ /* stored and there may be others that need to be read. */
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+
+ while ( di < numRanges )
+ {
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+ ++di;
+ }
+ }
+
+ ret[i] = 0;
+
+ return ret;
+ }
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap14_class_rec,
+ sizeof ( TT_CMap14Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap14_init,
+ (FT_CMap_DoneFunc) tt_cmap14_done,
+ (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap14_char_next,
+
+ /* Format 14 extension functions */
+ (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index,
+ (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
+ (FT_CMap_VariantListFunc) tt_cmap14_variants,
+ (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
+ (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,
+
+ 14,
+ (TT_CMap_ValidateFunc)tt_cmap14_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap14_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_14 */
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+ static const TT_CMap_Class tt_cmap_classes[] =
+ {
+#define TTCMAPCITEM( a ) &a,
+#include "ttcmapc.h"
+ NULL,
+ };
+
+#else /*FT_CONFIG_OPTION_PIC*/
+
+ void
+ FT_Destroy_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class* clazz )
+ {
+ FT_Memory memory = library->memory;
+
+
+ if ( clazz )
+ FT_FREE( clazz );
+ }
+
+
+ FT_Error
+ FT_Create_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class** output_class )
+ {
+ TT_CMap_Class* clazz = NULL;
+ TT_CMap_ClassRec* recs;
+ FT_Error error;
+ FT_Memory memory = library->memory;
+
+ int i = 0;
+
+
+#define TTCMAPCITEM( a ) i++;
+#include "ttcmapc.h"
+
+ /* allocate enough space for both the pointers */
+ /* plus terminator and the class instances */
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +
+ sizeof ( TT_CMap_ClassRec ) * i ) )
+ return error;
+
+ /* the location of the class instances follows the array of pointers */
+ recs = (TT_CMap_ClassRec*)( (char*)clazz +
+ sizeof ( *clazz ) * ( i + 1 ) );
+ i = 0;
+
+#undef TTCMAPCITEM
+#define TTCMAPCITEM( a ) \
+ FT_Init_Class_ ## a( &recs[i] ); \
+ clazz[i] = &recs[i]; \
+ i++;
+#include "ttcmapc.h"
+
+ clazz[i] = NULL;
+
+ *output_class = clazz;
+ return FT_Err_Ok;
+ }
+
+#endif /*FT_CONFIG_OPTION_PIC*/
+
+
+ /* parse the `cmap' table and build the corresponding TT_CMap objects */
+ /* in the current face */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_build_cmaps( TT_Face face )
+ {
+ FT_Byte* table = face->cmap_table;
+ FT_Byte* limit = table + face->cmap_size;
+ FT_UInt volatile num_cmaps;
+ FT_Byte* volatile p = table;
+ FT_Library library = FT_FACE_LIBRARY( face );
+
+ FT_UNUSED( library );
+
+
+ if ( !p || p + 4 > limit )
+ return FT_THROW( Invalid_Table );
+
+ /* only recognize format 0 */
+ if ( TT_NEXT_USHORT( p ) != 0 )
+ {
+ p -= 2;
+ FT_ERROR(( "tt_face_build_cmaps:"
+ " unsupported `cmap' table format = %d\n",
+ TT_PEEK_USHORT( p ) ));
+ return FT_THROW( Invalid_Table );
+ }
+
+ num_cmaps = TT_NEXT_USHORT( p );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )
+ FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables (%d)\n"
+ " subtable #%d and higher are loaded"
+ " but cannot be searched\n",
+ num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));
+#endif
+
+ for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
+ {
+ FT_CharMapRec charmap;
+ FT_UInt32 offset;
+
+
+ charmap.platform_id = TT_NEXT_USHORT( p );
+ charmap.encoding_id = TT_NEXT_USHORT( p );
+ charmap.face = FT_FACE( face );
+ charmap.encoding = FT_ENCODING_NONE; /* will be filled later */
+ offset = TT_NEXT_ULONG( p );
+
+ if ( offset && offset <= face->cmap_size - 2 )
+ {
+ FT_Byte* volatile cmap = table + offset;
+ volatile FT_UInt format = TT_PEEK_USHORT( cmap );
+ const TT_CMap_Class* volatile pclazz = TT_CMAP_CLASSES_GET;
+ TT_CMap_Class volatile clazz;
+
+
+ for ( ; *pclazz; pclazz++ )
+ {
+ clazz = *pclazz;
+ if ( clazz->format == format )
+ {
+ volatile TT_ValidatorRec valid;
+ volatile FT_Error error = FT_Err_Ok;
+
+
+ ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
+ FT_VALIDATE_DEFAULT );
+
+ valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
+#ifndef _FX_MANAGED_CODE_
+ if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )
+ {
+#endif
+ /* validate this cmap sub-table */
+ error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
+#ifndef _FX_MANAGED_CODE_
+ }
+#endif
+
+ if ( valid.validator.error == 0 )
+ {
+ FT_CMap ttcmap;
+
+
+ /* It might make sense to store the single variation */
+ /* selector cmap somewhere special. But it would have to be */
+ /* in the public FT_FaceRec, and we can't change that. */
+
+ if ( !FT_CMap_New( (FT_CMap_Class)clazz,
+ cmap, &charmap, &ttcmap ) )
+ {
+ /* it is simpler to directly set `flags' than adding */
+ /* a parameter to FT_CMap_New */
+ ((TT_CMap)ttcmap)->flags = (FT_Int)error;
+ }
+ }
+ else
+ {
+ FT_TRACE0(( "tt_face_build_cmaps:"
+ " broken cmap sub-table ignored\n" ));
+ }
+ break;
+ }
+ }
+
+ if ( *pclazz == NULL )
+ {
+ FT_TRACE0(( "tt_face_build_cmaps:"
+ " unsupported cmap sub-table ignored\n" ));
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ tt_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_CMap cmap = (FT_CMap)charmap;
+ TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz;
+
+
+ return clazz->get_cmap_info( charmap, cmap_info );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
new file mode 100644
index 0000000000..3862494991
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
@@ -0,0 +1,158 @@
+/***************************************************************************/
+/* */
+/* ttcmap.h */
+/* */
+/* TrueType character mapping table (cmap) support (specification). */
+/* */
+/* Copyright 2002-2005, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTCMAP_H__
+#define __TTCMAP_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+FT_BEGIN_HEADER
+
+
+#define TT_CMAP_FLAG_UNSORTED 1
+#define TT_CMAP_FLAG_OVERLAPPING 2
+
+ typedef struct TT_CMapRec_
+ {
+ FT_CMapRec cmap;
+ FT_Byte* data; /* pointer to in-memory cmap table */
+ FT_Int flags; /* for format 4 only */
+
+ } TT_CMapRec, *TT_CMap;
+
+ typedef const struct TT_CMap_ClassRec_* TT_CMap_Class;
+
+
+ typedef FT_Error
+ (*TT_CMap_ValidateFunc)( FT_Byte* data,
+ FT_Validator valid );
+
+ typedef struct TT_CMap_ClassRec_
+ {
+ FT_CMap_ClassRec clazz;
+ FT_UInt format;
+ TT_CMap_ValidateFunc validate;
+ TT_CMap_Info_GetFunc get_cmap_info;
+
+ } TT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_TT_CMAP( class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_, \
+ format_, \
+ validate_, \
+ get_cmap_info_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const TT_CMap_ClassRec class_ = \
+ { \
+ { size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ \
+ }, \
+ \
+ format_, \
+ validate_, \
+ get_cmap_info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_TT_CMAP( class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_, \
+ format_, \
+ validate_, \
+ get_cmap_info_ ) \
+ void \
+ FT_Init_Class_ ## class_( TT_CMap_ClassRec* clazz ) \
+ { \
+ clazz->clazz.size = size_; \
+ clazz->clazz.init = init_; \
+ clazz->clazz.done = done_; \
+ clazz->clazz.char_index = char_index_; \
+ clazz->clazz.char_next = char_next_; \
+ clazz->clazz.char_var_index = char_var_index_; \
+ clazz->clazz.char_var_default = char_var_default_; \
+ clazz->clazz.variant_list = variant_list_; \
+ clazz->clazz.charvariant_list = charvariant_list_; \
+ clazz->clazz.variantchar_list = variantchar_list_; \
+ clazz->format = format_; \
+ clazz->validate = validate_; \
+ clazz->get_cmap_info = get_cmap_info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ typedef struct TT_ValidatorRec_
+ {
+ FT_ValidatorRec validator;
+ FT_UInt num_glyphs;
+
+ } TT_ValidatorRec, *TT_Validator;
+
+
+#define TT_VALIDATOR( x ) ( (TT_Validator)( x ) )
+#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_build_cmaps( TT_Face face );
+
+ /* used in tt-cmaps service */
+ FT_LOCAL( FT_Error )
+ tt_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info );
+
+
+FT_END_HEADER
+
+#endif /* __TTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
new file mode 100644
index 0000000000..2ea204309c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
@@ -0,0 +1,56 @@
+/***************************************************************************/
+/* */
+/* ttcmapc.h */
+/* */
+/* TT CMAP classes definitions (specification only). */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+ TTCMAPCITEM( tt_cmap0_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+ TTCMAPCITEM( tt_cmap2_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+ TTCMAPCITEM( tt_cmap4_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+ TTCMAPCITEM( tt_cmap6_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+ TTCMAPCITEM( tt_cmap8_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+ TTCMAPCITEM( tt_cmap10_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+ TTCMAPCITEM( tt_cmap12_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+ TTCMAPCITEM( tt_cmap13_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+ TTCMAPCITEM( tt_cmap14_class_rec )
+#endif
+
+
+ /* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
new file mode 100644
index 0000000000..da38cf7d30
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/* */
+/* ttkern.c */
+/* */
+/* Load the basic TrueType kerning table. This doesn't handle */
+/* kerning data within the GPOS table at the moment. */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttkern.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttkern
+
+
+#undef TT_KERN_INDEX
+#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_kern( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_ULong table_size;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_UInt nn, num_tables;
+ FT_UInt32 avail = 0, ordered = 0;
+
+
+ /* the kern table is optional; exit silently if it is missing */
+ error = face->goto_table( face, TTAG_kern, stream, &table_size );
+ if ( error )
+ goto Exit;
+
+ if ( table_size < 4 ) /* the case of a malformed table */
+ {
+ FT_ERROR(( "tt_face_load_kern:"
+ " kerning table is too small - ignored\n" ));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
+ {
+ FT_ERROR(( "tt_face_load_kern:"
+ " could not extract kerning table\n" ));
+ goto Exit;
+ }
+
+ face->kern_table_size = table_size;
+
+ p = face->kern_table;
+ p_limit = p + table_size;
+
+ p += 2; /* skip version */
+ num_tables = FT_NEXT_USHORT( p );
+
+ if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
+ num_tables = 32;
+
+ for ( nn = 0; nn < num_tables; nn++ )
+ {
+ FT_UInt num_pairs, length, coverage;
+ FT_Byte* p_next;
+ FT_UInt32 mask = (FT_UInt32)1UL << nn;
+
+
+ if ( p + 6 > p_limit )
+ break;
+
+ p_next = p;
+
+ p += 2; /* skip version */
+ length = FT_NEXT_USHORT( p );
+ coverage = FT_NEXT_USHORT( p );
+
+ if ( length <= 6 )
+ break;
+
+ p_next += length;
+
+ if ( p_next > p_limit ) /* handle broken table */
+ p_next = p_limit;
+
+ /* only use horizontal kerning tables */
+ if ( ( coverage & ~8 ) != 0x0001 ||
+ p + 8 > p_limit )
+ goto NextTable;
+
+ num_pairs = FT_NEXT_USHORT( p );
+ p += 6;
+
+ if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+ num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
+
+ avail |= mask;
+
+ /*
+ * Now check whether the pairs in this table are ordered.
+ * We then can use binary search.
+ */
+ if ( num_pairs > 0 )
+ {
+ FT_ULong count;
+ FT_ULong old_pair;
+
+
+ old_pair = FT_NEXT_ULONG( p );
+ p += 2;
+
+ for ( count = num_pairs - 1; count > 0; count-- )
+ {
+ FT_UInt32 cur_pair;
+
+
+ cur_pair = FT_NEXT_ULONG( p );
+ if ( cur_pair <= old_pair )
+ break;
+
+ p += 2;
+ old_pair = cur_pair;
+ }
+
+ if ( count == 0 )
+ ordered |= mask;
+ }
+
+ NextTable:
+ p = p_next;
+ }
+
+ face->num_kern_tables = nn;
+ face->kern_avail_bits = avail;
+ face->kern_order_bits = ordered;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_done_kern( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->kern_table );
+ face->kern_table_size = 0;
+ face->num_kern_tables = 0;
+ face->kern_avail_bits = 0;
+ face->kern_order_bits = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ tt_face_get_kerning( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph )
+ {
+ FT_Int result = 0;
+ FT_UInt count, mask = 1;
+ FT_Byte* p = face->kern_table;
+ FT_Byte* p_limit = p + face->kern_table_size;
+
+
+ p += 4;
+ mask = 0x0001;
+
+ for ( count = face->num_kern_tables;
+ count > 0 && p + 6 <= p_limit;
+ count--, mask <<= 1 )
+ {
+ FT_Byte* base = p;
+ FT_Byte* next = base;
+ FT_UInt version = FT_NEXT_USHORT( p );
+ FT_UInt length = FT_NEXT_USHORT( p );
+ FT_UInt coverage = FT_NEXT_USHORT( p );
+ FT_UInt num_pairs;
+ FT_Int value = 0;
+
+ FT_UNUSED( version );
+
+
+ next = base + length;
+
+ if ( next > p_limit ) /* handle broken table */
+ next = p_limit;
+
+ if ( ( face->kern_avail_bits & mask ) == 0 )
+ goto NextTable;
+
+ if ( p + 8 > next )
+ goto NextTable;
+
+ num_pairs = FT_NEXT_USHORT( p );
+ p += 6;
+
+ if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+ num_pairs = (FT_UInt)( ( next - p ) / 6 );
+
+ switch ( coverage >> 8 )
+ {
+ case 0:
+ {
+ FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph );
+
+
+ if ( face->kern_order_bits & mask ) /* binary search */
+ {
+ FT_UInt min = 0;
+ FT_UInt max = num_pairs;
+
+
+ while ( min < max )
+ {
+ FT_UInt mid = ( min + max ) >> 1;
+ FT_Byte* q = p + 6 * mid;
+ FT_ULong key;
+
+
+ key = FT_NEXT_ULONG( q );
+
+ if ( key == key0 )
+ {
+ value = FT_PEEK_SHORT( q );
+ goto Found;
+ }
+ if ( key < key0 )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+ }
+ else /* linear search */
+ {
+ FT_UInt count2;
+
+
+ for ( count2 = num_pairs; count2 > 0; count2-- )
+ {
+ FT_ULong key = FT_NEXT_ULONG( p );
+
+
+ if ( key == key0 )
+ {
+ value = FT_PEEK_SHORT( p );
+ goto Found;
+ }
+ p += 2;
+ }
+ }
+ }
+ break;
+
+ /*
+ * We don't support format 2 because we haven't seen a single font
+ * using it in real life...
+ */
+
+ default:
+ ;
+ }
+
+ goto NextTable;
+
+ Found:
+ if ( coverage & 8 ) /* override or add */
+ result = value;
+ else
+ result += value;
+
+ NextTable:
+ p = next;
+ }
+
+ return result;
+ }
+
+#undef TT_KERN_INDEX
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
new file mode 100644
index 0000000000..c2f1a93d50
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/* */
+/* ttkern.h */
+/* */
+/* Load the basic TrueType kerning table. This doesn't handle */
+/* kerning data within the GPOS table at the moment. */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTKERN_H__
+#define __TTKERN_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_kern( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_done_kern( TT_Face face );
+
+ FT_LOCAL( FT_Int )
+ tt_face_get_kerning( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph );
+
+#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
new file mode 100644
index 0000000000..38b7559e13
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
@@ -0,0 +1,1295 @@
+/***************************************************************************/
+/* */
+/* ttload.c */
+/* */
+/* Load the basic TrueType tables, i.e., tables that can be either in */
+/* TTF or OTF fonts (body). */
+/* */
+/* Copyright 1996-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttload.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttload
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_lookup_table */
+ /* */
+ /* <Description> */
+ /* Looks for a TrueType table by name. */
+ /* */
+ /* <Input> */
+ /* face :: A face object handle. */
+ /* */
+ /* tag :: The searched tag. */
+ /* */
+ /* <Return> */
+ /* A pointer to the table directory entry. 0 if not found. */
+ /* */
+ FT_LOCAL_DEF( TT_Table )
+ tt_face_get_nexttable(TT_Table first, TT_Table limit, TT_Table entry)
+ {
+ TT_Table temp = NULL;
+ if (!entry) return NULL;
+
+ for (first; first < limit; first++){
+ if (entry->Offset + entry->Length <= first->Offset){
+ if (!temp || first->Offset < temp->Offset){
+ temp = first;
+ }
+ }
+ }
+ return temp;
+ }
+
+ FT_LOCAL_DEF( TT_Table )
+ tt_face_lookup_table( TT_Face face,
+ FT_ULong tag )
+ {
+ TT_Table entry;
+ TT_Table limit;
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_Bool zero_length = FALSE;
+#endif
+
+
+ FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
+ face,
+ (FT_Char)( tag >> 24 ),
+ (FT_Char)( tag >> 16 ),
+ (FT_Char)( tag >> 8 ),
+ (FT_Char)( tag ) ));
+
+ entry = face->dir_tables;
+ limit = entry + face->num_tables;
+
+ for ( ; entry < limit; entry++ )
+ {
+ /* For compatibility with Windows, we consider */
+ /* zero-length tables the same as missing tables. */
+ if ( entry->Tag == tag )
+ {
+ if ( entry->Length != 0 )
+ {
+ if (tag == TTAG_loca){
+ TT_Table next = tt_face_get_nexttable(face->dir_tables, limit, entry);
+ if (next && entry->Offset + entry->Length < next->Offset)
+ entry->Length = next->Offset - entry->Offset;
+ }
+ FT_TRACE4(( "found table.\n" ));
+ return entry;
+ }
+#ifdef FT_DEBUG_LEVEL_TRACE
+ zero_length = TRUE;
+#endif
+ }
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( zero_length )
+ FT_TRACE4(( "ignoring empty table\n" ));
+ else
+ FT_TRACE4(( "could not find table\n" ));
+#endif
+
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_goto_table */
+ /* */
+ /* <Description> */
+ /* Looks for a TrueType table by name, then seek a stream to it. */
+ /* */
+ /* <Input> */
+ /* face :: A face object handle. */
+ /* */
+ /* tag :: The searched tag. */
+ /* */
+ /* stream :: The stream to seek when the table is found. */
+ /* */
+ /* <Output> */
+ /* length :: The length of the table if found, undefined otherwise. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_goto_table( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length )
+ {
+ TT_Table table;
+ FT_Error error = 0;
+
+
+ table = tt_face_lookup_table( face, tag );
+ if ( table )
+ {
+ if ( length )
+ *length = table->Length;
+
+ if ( FT_STREAM_SEEK( table->Offset ) )
+ goto Exit;
+ }
+ else
+ error = FT_THROW( Table_Missing );
+
+ Exit:
+ return error;
+ }
+
+
+ /* Here, we */
+ /* */
+ /* - check that `num_tables' is valid (and adjust it if necessary) */
+ /* */
+ /* - look for a `head' table, check its size, and parse it to check */
+ /* whether its `magic' field is correctly set */
+ /* */
+ /* - errors (except errors returned by stream handling) */
+ /* */
+ /* SFNT_Err_Unknown_File_Format: */
+ /* no table is defined in directory, it is not sfnt-wrapped */
+ /* data */
+ /* SFNT_Err_Table_Missing: */
+ /* table directory is valid, but essential tables */
+ /* (head/bhed/SING) are missing */
+ /* */
+ static FT_Error
+ check_table_dir( SFNT_Header sfnt,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_UShort nn, valid_entries = 0;
+ FT_UInt has_head = 0, has_sing = 0, has_meta = 0;
+ FT_ULong offset = sfnt->offset + 12;
+
+ static const FT_Frame_Field table_dir_entry_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_TableRec
+
+ FT_FRAME_START( 16 ),
+ FT_FRAME_ULONG( Tag ),
+ FT_FRAME_ULONG( CheckSum ),
+ FT_FRAME_ULONG( Offset ),
+ FT_FRAME_ULONG( Length ),
+ FT_FRAME_END
+ };
+
+
+ if ( FT_STREAM_SEEK( offset ) )
+ goto Exit;
+
+ for ( nn = 0; nn < sfnt->num_tables; nn++ )
+ {
+ TT_TableRec table;
+
+
+ if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
+ {
+ nn--;
+ FT_TRACE2(( "check_table_dir:"
+ " can read only %d table%s in font (instead of %d)\n",
+ nn, nn == 1 ? "" : "s", sfnt->num_tables ));
+ sfnt->num_tables = nn;
+ break;
+ }
+
+ /* we ignore invalid tables */
+ if ( table.Offset + table.Length > stream->size )
+ {
+ //BUGID: 53876, the cmap table is invalid, the font file couldn't be used.
+ if (table.Tag == TTAG_cmap) break;
+ FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
+ continue;
+ }
+ else
+ valid_entries++;
+
+ if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
+ {
+ FT_UInt32 magic;
+
+
+#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+ if ( table.Tag == TTAG_head )
+#endif
+ has_head = 1;
+
+ /*
+ * The table length should be 0x36, but certain font tools make it
+ * 0x38, so we will just check that it is greater.
+ *
+ * Note that according to the specification, the table must be
+ * padded to 32-bit lengths, but this doesn't apply to the value of
+ * its `Length' field!
+ *
+ */
+ if ( table.Length < 0x36 )
+ {
+ FT_TRACE2(( "check_table_dir: `head' table too small\n" ));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
+ FT_READ_ULONG( magic ) )
+ goto Exit;
+
+ if ( magic != 0x5F0F3CF5UL )
+ {
+ FT_TRACE2(( "check_table_dir:"
+ " no magic number found in `head' table\n"));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
+ goto Exit;
+ }
+ else if ( table.Tag == TTAG_SING )
+ has_sing = 1;
+ else if ( table.Tag == TTAG_META )
+ has_meta = 1;
+ }
+
+ sfnt->num_tables = valid_entries;
+
+ if ( sfnt->num_tables == 0 )
+ {
+ FT_TRACE2(( "check_table_dir: no tables found\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* if `sing' and `meta' tables are present, there is no `head' table */
+ if ( has_head || ( has_sing && has_meta ) )
+ {
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+ else
+ {
+ FT_TRACE2(( "check_table_dir:" ));
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+ FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
+#else
+ FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
+#endif
+ error = FT_THROW( Table_Missing );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_font_dir */
+ /* */
+ /* <Description> */
+ /* Loads the header of a SFNT font file. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Output> */
+ /* sfnt :: The SFNT header. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the beginning of the font directory. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_font_dir( TT_Face face,
+ FT_Stream stream )
+ {
+ SFNT_HeaderRec sfnt;
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ TT_TableRec* entry;
+ FT_Int nn;
+
+ static const FT_Frame_Field offset_table_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE SFNT_HeaderRec
+
+ FT_FRAME_START( 8 ),
+ FT_FRAME_USHORT( num_tables ),
+ FT_FRAME_USHORT( search_range ),
+ FT_FRAME_USHORT( entry_selector ),
+ FT_FRAME_USHORT( range_shift ),
+ FT_FRAME_END
+ };
+
+
+ FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
+
+ /* read the offset table */
+
+ sfnt.offset = FT_STREAM_POS();
+
+ if ( FT_READ_ULONG( sfnt.format_tag ) ||
+ FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
+ goto Exit;
+
+ /* many fonts don't have these fields set correctly */
+#if 0
+ if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) ||
+ sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
+ return FT_THROW( Unknown_File_Format );
+#endif
+
+ /* load the table directory */
+
+ FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables ));
+ FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag ));
+
+ if ( sfnt.format_tag != TTAG_OTTO )
+ {
+ /* check first */
+ error = check_table_dir( &sfnt, stream );
+ if ( error )
+ {
+ FT_TRACE2(( "tt_face_load_font_dir:"
+ " invalid table directory for TrueType\n" ));
+
+ goto Exit;
+ }
+ }
+
+ face->num_tables = sfnt.num_tables;
+ face->format_tag = sfnt.format_tag;
+
+ if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( sfnt.offset + 12 ) ||
+ FT_FRAME_ENTER( face->num_tables * 16L ) )
+ goto Exit;
+
+ entry = face->dir_tables;
+
+ FT_TRACE2(( "\n"
+ " tag offset length checksum\n"
+ " ----------------------------------\n" ));
+
+ for ( nn = 0; nn < sfnt.num_tables; nn++ )
+ {
+ entry->Tag = FT_GET_TAG4();
+ entry->CheckSum = FT_GET_ULONG();
+ entry->Offset = FT_GET_LONG();
+ entry->Length = FT_GET_LONG();
+
+ /* ignore invalid tables */
+ if ( entry->Offset + entry->Length > stream->size )
+ continue;
+ else
+ {
+ FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx\n",
+ (FT_Char)( entry->Tag >> 24 ),
+ (FT_Char)( entry->Tag >> 16 ),
+ (FT_Char)( entry->Tag >> 8 ),
+ (FT_Char)( entry->Tag ),
+ entry->Offset,
+ entry->Length,
+ entry->CheckSum ));
+ entry++;
+ }
+ }
+
+ FT_FRAME_EXIT();
+
+ FT_TRACE2(( "table directory loaded\n\n" ));
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_any */
+ /* */
+ /* <Description> */
+ /* Loads any font table into client memory. */
+ /* */
+ /* <Input> */
+ /* face :: The face object to look for. */
+ /* */
+ /* tag :: The tag of table to load. Use the value 0 if you want */
+ /* to access the whole font file, else set this parameter */
+ /* to a valid TrueType table tag that you can forge with */
+ /* the MAKE_TT_TAG macro. */
+ /* */
+ /* offset :: The starting offset in the table (or the file if */
+ /* tag == 0). */
+ /* */
+ /* length :: The address of the decision variable: */
+ /* */
+ /* If length == NULL: */
+ /* Loads the whole table. Returns an error if */
+ /* `offset' == 0! */
+ /* */
+ /* If *length == 0: */
+ /* Exits immediately; returning the length of the given */
+ /* table or of the font file, depending on the value of */
+ /* `tag'. */
+ /* */
+ /* If *length != 0: */
+ /* Loads the next `length' bytes of table or font, */
+ /* starting at offset `offset' (in table or font too). */
+ /* */
+ /* <Output> */
+ /* buffer :: The address of target buffer. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_any( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length )
+ {
+ FT_Error error;
+ FT_Stream stream;
+ TT_Table table;
+ FT_ULong size;
+
+
+ if ( tag != 0 )
+ {
+ /* look for tag in font directory */
+ table = tt_face_lookup_table( face, tag );
+ if ( !table )
+ {
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ offset += table->Offset;
+ size = table->Length;
+ }
+ else
+ /* tag == 0 -- the user wants to access the font file directly */
+ size = face->root.stream->size;
+
+ if ( length && *length == 0 )
+ {
+ *length = size;
+
+ return FT_Err_Ok;
+ }
+
+ if ( length )
+ size = *length;
+
+ stream = face->root.stream;
+ /* the `if' is syntactic sugar for picky compilers */
+ if ( FT_STREAM_READ_AT( offset, buffer, size ) )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_generic_header */
+ /* */
+ /* <Description> */
+ /* Loads the TrueType table `head' or `bhed'. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_face_load_generic_header( TT_Face face,
+ FT_Stream stream,
+ FT_ULong tag )
+ {
+ FT_Error error;
+ TT_Header* header;
+
+ static const FT_Frame_Field header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_Header
+
+ FT_FRAME_START( 54 ),
+ FT_FRAME_ULONG ( Table_Version ),
+ FT_FRAME_ULONG ( Font_Revision ),
+ FT_FRAME_LONG ( CheckSum_Adjust ),
+ FT_FRAME_LONG ( Magic_Number ),
+ FT_FRAME_USHORT( Flags ),
+ FT_FRAME_USHORT( Units_Per_EM ),
+ FT_FRAME_LONG ( Created[0] ),
+ FT_FRAME_LONG ( Created[1] ),
+ FT_FRAME_LONG ( Modified[0] ),
+ FT_FRAME_LONG ( Modified[1] ),
+ FT_FRAME_SHORT ( xMin ),
+ FT_FRAME_SHORT ( yMin ),
+ FT_FRAME_SHORT ( xMax ),
+ FT_FRAME_SHORT ( yMax ),
+ FT_FRAME_USHORT( Mac_Style ),
+ FT_FRAME_USHORT( Lowest_Rec_PPEM ),
+ FT_FRAME_SHORT ( Font_Direction ),
+ FT_FRAME_SHORT ( Index_To_Loc_Format ),
+ FT_FRAME_SHORT ( Glyph_Data_Format ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, tag, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ header = &face->header;
+
+ if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
+ goto Exit;
+
+ FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
+ FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format ));
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_head( TT_Face face,
+ FT_Stream stream )
+ {
+ return tt_face_load_generic_header( face, stream, TTAG_head );
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_bhed( TT_Face face,
+ FT_Stream stream )
+ {
+ return tt_face_load_generic_header( face, stream, TTAG_bhed );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_max_profile */
+ /* */
+ /* <Description> */
+ /* Loads the maximum profile into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_maxp( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_MaxProfile* maxProfile = &face->max_profile;
+
+ static const FT_Frame_Field maxp_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_MaxProfile
+
+ FT_FRAME_START( 6 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( numGlyphs ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field maxp_fields_extra[] =
+ {
+ FT_FRAME_START( 26 ),
+ FT_FRAME_USHORT( maxPoints ),
+ FT_FRAME_USHORT( maxContours ),
+ FT_FRAME_USHORT( maxCompositePoints ),
+ FT_FRAME_USHORT( maxCompositeContours ),
+ FT_FRAME_USHORT( maxZones ),
+ FT_FRAME_USHORT( maxTwilightPoints ),
+ FT_FRAME_USHORT( maxStorage ),
+ FT_FRAME_USHORT( maxFunctionDefs ),
+ FT_FRAME_USHORT( maxInstructionDefs ),
+ FT_FRAME_USHORT( maxStackElements ),
+ FT_FRAME_USHORT( maxSizeOfInstructions ),
+ FT_FRAME_USHORT( maxComponentElements ),
+ FT_FRAME_USHORT( maxComponentDepth ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, TTAG_maxp, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
+ goto Exit;
+
+ maxProfile->maxPoints = 0;
+ maxProfile->maxContours = 0;
+ maxProfile->maxCompositePoints = 0;
+ maxProfile->maxCompositeContours = 0;
+ maxProfile->maxZones = 0;
+ maxProfile->maxTwilightPoints = 0;
+ maxProfile->maxStorage = 0;
+ maxProfile->maxFunctionDefs = 0;
+ maxProfile->maxInstructionDefs = 0;
+ maxProfile->maxStackElements = 0;
+ maxProfile->maxSizeOfInstructions = 0;
+ maxProfile->maxComponentElements = 0;
+ maxProfile->maxComponentDepth = 0;
+
+ if ( maxProfile->version >= 0x10000L )
+ {
+ if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
+ goto Exit;
+
+ /* XXX: an adjustment that is necessary to load certain */
+ /* broken fonts like `Keystrokes MT' :-( */
+ /* */
+ /* We allocate 64 function entries by default when */
+ /* the maxFunctionDefs value is smaller. */
+
+ if ( maxProfile->maxFunctionDefs < 64 )
+ maxProfile->maxFunctionDefs = 64;
+
+ /* we add 4 phantom points later */
+ if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
+ {
+ FT_TRACE0(( "tt_face_load_maxp:"
+ " too much twilight points in `maxp' table;\n"
+ " "
+ " some glyphs might be rendered incorrectly\n" ));
+
+ maxProfile->maxTwilightPoints = 0xFFFFU - 4;
+ }
+
+ /* we arbitrarily limit recursion to avoid stack exhaustion */
+ if ( maxProfile->maxComponentDepth > 100 )
+ {
+ FT_TRACE0(( "tt_face_load_maxp:"
+ " abnormally large component depth (%d) set to 100\n",
+ maxProfile->maxComponentDepth ));
+ maxProfile->maxComponentDepth = 100;
+ }
+ }
+
+ FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_name */
+ /* */
+ /* <Description> */
+ /* Loads the name records. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_name( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_pos, table_len;
+ FT_ULong storage_start, storage_limit;
+ FT_UInt count;
+ TT_NameTable table;
+
+ static const FT_Frame_Field name_table_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_NameTableRec
+
+ FT_FRAME_START( 6 ),
+ FT_FRAME_USHORT( format ),
+ FT_FRAME_USHORT( numNameRecords ),
+ FT_FRAME_USHORT( storageOffset ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field name_record_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_NameEntryRec
+
+ /* no FT_FRAME_START */
+ FT_FRAME_USHORT( platformID ),
+ FT_FRAME_USHORT( encodingID ),
+ FT_FRAME_USHORT( languageID ),
+ FT_FRAME_USHORT( nameID ),
+ FT_FRAME_USHORT( stringLength ),
+ FT_FRAME_USHORT( stringOffset ),
+ FT_FRAME_END
+ };
+
+
+ table = &face->name_table;
+ table->stream = stream;
+
+ error = face->goto_table( face, TTAG_name, stream, &table_len );
+ if ( error )
+ goto Exit;
+
+ table_pos = FT_STREAM_POS();
+
+
+ if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
+ goto Exit;
+
+ /* Some popular Asian fonts have an invalid `storageOffset' value */
+ /* (it should be at least "6 + 12*num_names"). However, the string */
+ /* offsets, computed as "storageOffset + entry->stringOffset", are */
+ /* valid pointers within the name table... */
+ /* */
+ /* We thus can't check `storageOffset' right now. */
+ /* */
+ storage_start = table_pos + 6 + 12*table->numNameRecords;
+ storage_limit = table_pos + table_len;
+
+ if ( storage_start > storage_limit )
+ {
+ FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
+ error = FT_THROW( Name_Table_Missing );
+ goto Exit;
+ }
+
+ /* Allocate the array of name records. */
+ count = table->numNameRecords;
+ table->numNameRecords = 0;
+
+ if ( FT_NEW_ARRAY( table->names, count ) ||
+ FT_FRAME_ENTER( count * 12 ) )
+ goto Exit;
+
+ /* Load the name records and determine how much storage is needed */
+ /* to hold the strings themselves. */
+ {
+ TT_NameEntryRec* entry = table->names;
+
+
+ for ( ; count > 0; count-- )
+ {
+ if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
+ continue;
+
+ /* check that the name is not empty */
+ if ( entry->stringLength == 0 )
+ continue;
+
+ /* check that the name string is within the table */
+ entry->stringOffset += table_pos + table->storageOffset;
+ if ( entry->stringOffset < storage_start ||
+ entry->stringOffset + entry->stringLength > storage_limit )
+ {
+ /* invalid entry - ignore it */
+ entry->stringOffset = 0;
+ entry->stringLength = 0;
+ continue;
+ }
+
+ entry++;
+ }
+
+ table->numNameRecords = (FT_UInt)( entry - table->names );
+ }
+
+ FT_FRAME_EXIT();
+
+ /* everything went well, update face->num_names */
+ face->num_names = (FT_UShort) table->numNameRecords;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_free_names */
+ /* */
+ /* <Description> */
+ /* Frees the name records. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_face_free_name( TT_Face face )
+ {
+ FT_Memory memory = face->root.driver->root.memory;
+ TT_NameTable table = &face->name_table;
+ TT_NameEntry entry = table->names;
+ FT_UInt count = table->numNameRecords;
+
+
+ if ( table->names )
+ {
+ for ( ; count > 0; count--, entry++ )
+ {
+ FT_FREE( entry->string );
+ entry->stringLength = 0;
+ }
+
+ /* free strings table */
+ FT_FREE( table->names );
+ }
+
+ table->numNameRecords = 0;
+ table->format = 0;
+ table->storageOffset = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_cmap */
+ /* */
+ /* <Description> */
+ /* Loads the cmap directory in a face object. The cmaps themselves */
+ /* are loaded on demand in the `ttcmap.c' module. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_cmap( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+
+
+ error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
+ if ( error )
+ goto Exit;
+
+ if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
+ face->cmap_size = 0;
+
+ Exit:
+ return error;
+ }
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_os2 */
+ /* */
+ /* <Description> */
+ /* Loads the OS2 table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_os2( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_OS2* os2;
+
+ static const FT_Frame_Field os2_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_OS2
+
+ FT_FRAME_START( 78 ),
+ FT_FRAME_USHORT( version ),
+ FT_FRAME_SHORT ( xAvgCharWidth ),
+ FT_FRAME_USHORT( usWeightClass ),
+ FT_FRAME_USHORT( usWidthClass ),
+ FT_FRAME_SHORT ( fsType ),
+ FT_FRAME_SHORT ( ySubscriptXSize ),
+ FT_FRAME_SHORT ( ySubscriptYSize ),
+ FT_FRAME_SHORT ( ySubscriptXOffset ),
+ FT_FRAME_SHORT ( ySubscriptYOffset ),
+ FT_FRAME_SHORT ( ySuperscriptXSize ),
+ FT_FRAME_SHORT ( ySuperscriptYSize ),
+ FT_FRAME_SHORT ( ySuperscriptXOffset ),
+ FT_FRAME_SHORT ( ySuperscriptYOffset ),
+ FT_FRAME_SHORT ( yStrikeoutSize ),
+ FT_FRAME_SHORT ( yStrikeoutPosition ),
+ FT_FRAME_SHORT ( sFamilyClass ),
+ FT_FRAME_BYTE ( panose[0] ),
+ FT_FRAME_BYTE ( panose[1] ),
+ FT_FRAME_BYTE ( panose[2] ),
+ FT_FRAME_BYTE ( panose[3] ),
+ FT_FRAME_BYTE ( panose[4] ),
+ FT_FRAME_BYTE ( panose[5] ),
+ FT_FRAME_BYTE ( panose[6] ),
+ FT_FRAME_BYTE ( panose[7] ),
+ FT_FRAME_BYTE ( panose[8] ),
+ FT_FRAME_BYTE ( panose[9] ),
+ FT_FRAME_ULONG ( ulUnicodeRange1 ),
+ FT_FRAME_ULONG ( ulUnicodeRange2 ),
+ FT_FRAME_ULONG ( ulUnicodeRange3 ),
+ FT_FRAME_ULONG ( ulUnicodeRange4 ),
+ FT_FRAME_BYTE ( achVendID[0] ),
+ FT_FRAME_BYTE ( achVendID[1] ),
+ FT_FRAME_BYTE ( achVendID[2] ),
+ FT_FRAME_BYTE ( achVendID[3] ),
+
+ FT_FRAME_USHORT( fsSelection ),
+ FT_FRAME_USHORT( usFirstCharIndex ),
+ FT_FRAME_USHORT( usLastCharIndex ),
+ FT_FRAME_SHORT ( sTypoAscender ),
+ FT_FRAME_SHORT ( sTypoDescender ),
+ FT_FRAME_SHORT ( sTypoLineGap ),
+ FT_FRAME_USHORT( usWinAscent ),
+ FT_FRAME_USHORT( usWinDescent ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field os2_fields_extra[] =
+ {
+ FT_FRAME_START( 8 ),
+ FT_FRAME_ULONG( ulCodePageRange1 ),
+ FT_FRAME_ULONG( ulCodePageRange2 ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field os2_fields_extra2[] =
+ {
+ FT_FRAME_START( 10 ),
+ FT_FRAME_SHORT ( sxHeight ),
+ FT_FRAME_SHORT ( sCapHeight ),
+ FT_FRAME_USHORT( usDefaultChar ),
+ FT_FRAME_USHORT( usBreakChar ),
+ FT_FRAME_USHORT( usMaxContext ),
+ FT_FRAME_END
+ };
+
+
+ /* We now support old Mac fonts where the OS/2 table doesn't */
+ /* exist. Simply put, we set the `version' field to 0xFFFF */
+ /* and test this value each time we need to access the table. */
+ error = face->goto_table( face, TTAG_OS2, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ os2 = &face->os2;
+
+ if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
+ goto Exit;
+
+ os2->ulCodePageRange1 = 0;
+ os2->ulCodePageRange2 = 0;
+ os2->sxHeight = 0;
+ os2->sCapHeight = 0;
+ os2->usDefaultChar = 0;
+ os2->usBreakChar = 0;
+ os2->usMaxContext = 0;
+
+ if ( os2->version >= 0x0001 )
+ {
+ /* only version 1 tables */
+ if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )
+ goto Exit;
+
+ if ( os2->version >= 0x0002 )
+ {
+ /* only version 2 tables */
+ if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
+ goto Exit;
+ }
+ }
+
+ FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender ));
+ FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender ));
+ FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent ));
+ FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent ));
+ FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection ));
+
+ Exit:
+ /*return error;*/
+ return 0; /* XYQ 2007-11-23 We can't just quit if OS/2 table can't be loaded.
+ TESTDOC: Bug #3160 - MyDoc.pdf */
+
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_postscript */
+ /* */
+ /* <Description> */
+ /* Loads the Postscript table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_post( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_Postscript* post = &face->postscript;
+
+ static const FT_Frame_Field post_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_Postscript
+
+ FT_FRAME_START( 32 ),
+ FT_FRAME_ULONG( FormatType ),
+ FT_FRAME_ULONG( italicAngle ),
+ FT_FRAME_SHORT( underlinePosition ),
+ FT_FRAME_SHORT( underlineThickness ),
+ FT_FRAME_ULONG( isFixedPitch ),
+ FT_FRAME_ULONG( minMemType42 ),
+ FT_FRAME_ULONG( maxMemType42 ),
+ FT_FRAME_ULONG( minMemType1 ),
+ FT_FRAME_ULONG( maxMemType1 ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, TTAG_post, stream, 0 );
+ if ( error )
+ return error;
+
+ if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
+ return error;
+
+ /* we don't load the glyph names, we do that in another */
+ /* module (ttpost). */
+
+ FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType ));
+ FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch
+ ? " yes" : " no" ));
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_pclt */
+ /* */
+ /* <Description> */
+ /* Loads the PCL 5 Table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_pclt( TT_Face face,
+ FT_Stream stream )
+ {
+ static const FT_Frame_Field pclt_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_PCLT
+
+ FT_FRAME_START( 54 ),
+ FT_FRAME_ULONG ( Version ),
+ FT_FRAME_ULONG ( FontNumber ),
+ FT_FRAME_USHORT( Pitch ),
+ FT_FRAME_USHORT( xHeight ),
+ FT_FRAME_USHORT( Style ),
+ FT_FRAME_USHORT( TypeFamily ),
+ FT_FRAME_USHORT( CapHeight ),
+ FT_FRAME_BYTES ( TypeFace, 16 ),
+ FT_FRAME_BYTES ( CharacterComplement, 8 ),
+ FT_FRAME_BYTES ( FileName, 6 ),
+ FT_FRAME_CHAR ( StrokeWeight ),
+ FT_FRAME_CHAR ( WidthType ),
+ FT_FRAME_BYTE ( SerifStyle ),
+ FT_FRAME_BYTE ( Reserved ),
+ FT_FRAME_END
+ };
+
+ FT_Error error;
+ TT_PCLT* pclt = &face->pclt;
+
+
+ /* optional table */
+ error = face->goto_table( face, TTAG_PCLT, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_gasp */
+ /* */
+ /* <Description> */
+ /* Loads the `gasp' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_gasp( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+
+ FT_UInt j,num_ranges;
+ TT_GaspRange gaspranges = NULL;
+
+
+ /* the gasp table is optional */
+ error = face->goto_table( face, TTAG_gasp, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_FRAME_ENTER( 4L ) )
+ goto Exit;
+
+ face->gasp.version = FT_GET_USHORT();
+ face->gasp.numRanges = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+
+ /* only support versions 0 and 1 of the table */
+ if ( face->gasp.version >= 2 )
+ {
+ face->gasp.numRanges = 0;
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ num_ranges = face->gasp.numRanges;
+ FT_TRACE3(( "numRanges: %u\n", num_ranges ));
+
+ if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||
+ FT_FRAME_ENTER( num_ranges * 4L ) )
+ goto Exit;
+
+ gaspranges = face->gasp.gaspRanges;
+
+ for ( j = 0; j < num_ranges; j++ )
+ {
+ gaspranges[j].maxPPEM = FT_GET_USHORT();
+ gaspranges[j].gaspFlag = FT_GET_USHORT();
+
+ FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
+ j,
+ gaspranges[j].maxPPEM,
+ gaspranges[j].gaspFlag ));
+ }
+
+ FT_FRAME_EXIT();
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
new file mode 100644
index 0000000000..a07bf099cd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* ttload.h */
+/* */
+/* Load the basic TrueType tables, i.e., tables that can be either in */
+/* TTF or OTF fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTLOAD_H__
+#define __TTLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( TT_Table )
+ tt_face_lookup_table( TT_Face face,
+ FT_ULong tag );
+
+ FT_LOCAL( FT_Error )
+ tt_face_goto_table( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_font_dir( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_any( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_head( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_cmap( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_maxp( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_name( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_os2( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_post( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_pclt( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_free_name( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_gasp( TT_Face face,
+ FT_Stream stream );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_bhed( TT_Face face,
+ FT_Stream stream );
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+FT_END_HEADER
+
+#endif /* __TTLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
new file mode 100644
index 0000000000..9fe61fb356
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/* */
+/* ttmtx.c */
+/* */
+/* Load the metrics tables common to TTF and OTF fonts (body). */
+/* */
+/* Copyright 2006-2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttmtx.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttmtx
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hmtx */
+ /* */
+ /* <Description> */
+ /* Load the `hmtx' or `vmtx' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load `vmtx'. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hmtx( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical )
+ {
+ FT_Error error;
+ FT_ULong tag, table_size;
+ FT_ULong* ptable_offset;
+ FT_ULong* ptable_size;
+
+
+ if ( vertical )
+ {
+ tag = TTAG_vmtx;
+ ptable_offset = &face->vert_metrics_offset;
+ ptable_size = &face->vert_metrics_size;
+ }
+ else
+ {
+ tag = TTAG_hmtx;
+ ptable_offset = &face->horz_metrics_offset;
+ ptable_size = &face->horz_metrics_size;
+ }
+
+ error = face->goto_table( face, tag, stream, &table_size );
+#if 0
+ if ( error )
+ goto Fail;
+
+ *ptable_size = table_size;
+ *ptable_offset = FT_STREAM_POS();
+
+ Fail:
+ return error;
+#else
+ *ptable_size = error ? 0 : table_size;
+ *ptable_offset = FT_STREAM_POS();
+
+ return 0;
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hhea */
+ /* */
+ /* <Description> */
+ /* Load the `hhea' or 'vhea' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load `vhea'. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hhea( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical )
+ {
+ FT_Error error;
+ TT_HoriHeader* header;
+
+ static const FT_Frame_Field metrics_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_HoriHeader
+
+ FT_FRAME_START( 36 ),
+ FT_FRAME_ULONG ( Version ),
+ FT_FRAME_SHORT ( Ascender ),
+ FT_FRAME_SHORT ( Descender ),
+ FT_FRAME_SHORT ( Line_Gap ),
+ FT_FRAME_USHORT( advance_Width_Max ),
+ FT_FRAME_SHORT ( min_Left_Side_Bearing ),
+ FT_FRAME_SHORT ( min_Right_Side_Bearing ),
+ FT_FRAME_SHORT ( xMax_Extent ),
+ FT_FRAME_SHORT ( caret_Slope_Rise ),
+ FT_FRAME_SHORT ( caret_Slope_Run ),
+ FT_FRAME_SHORT ( caret_Offset ),
+ FT_FRAME_SHORT ( Reserved[0] ),
+ FT_FRAME_SHORT ( Reserved[1] ),
+ FT_FRAME_SHORT ( Reserved[2] ),
+ FT_FRAME_SHORT ( Reserved[3] ),
+ FT_FRAME_SHORT ( metric_Data_Format ),
+ FT_FRAME_USHORT( number_Of_HMetrics ),
+ FT_FRAME_END
+ };
+
+
+ if ( vertical )
+ {
+ void *v = &face->vertical;
+
+
+ error = face->goto_table( face, TTAG_vhea, stream, 0 );
+ if ( error )
+ goto Fail;
+
+ header = (TT_HoriHeader*)v;
+ }
+ else
+ {
+ error = face->goto_table( face, TTAG_hhea, stream, 0 );
+ if ( error )
+ goto Fail;
+
+ header = &face->horizontal;
+ }
+
+ if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
+ goto Fail;
+
+ FT_TRACE3(( "Ascender: %5d\n", header->Ascender ));
+ FT_TRACE3(( "Descender: %5d\n", header->Descender ));
+ FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
+
+ header->long_metrics = NULL;
+ header->short_metrics = NULL;
+
+ Fail:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_metrics */
+ /* */
+ /* <Description> */
+ /* Returns the horizontal or vertical metrics in font units for a */
+ /* given glyph. The metrics are the left side bearing (resp. top */
+ /* side bearing) and advance width (resp. advance height). */
+ /* */
+ /* <Input> */
+ /* header :: A pointer to either the horizontal or vertical metrics */
+ /* structure. */
+ /* */
+ /* idx :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* bearing :: The bearing, either left side or top side. */
+ /* */
+ /* advance :: The advance width resp. advance height. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_get_metrics( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short *abearing,
+ FT_UShort *aadvance )
+ {
+ FT_Error error;
+ FT_Stream stream = face->root.stream;
+ TT_HoriHeader* header;
+ FT_ULong table_pos, table_size, table_end;
+ FT_UShort k;
+
+
+ if ( vertical )
+ {
+ void* v = &face->vertical;
+
+
+ header = (TT_HoriHeader*)v;
+ table_pos = face->vert_metrics_offset;
+ table_size = face->vert_metrics_size;
+ }
+ else
+ {
+ header = &face->horizontal;
+ table_pos = face->horz_metrics_offset;
+ table_size = face->horz_metrics_size;
+ }
+
+ table_end = table_pos + table_size;
+
+ k = header->number_Of_HMetrics;
+
+ if ( k > 0 )
+ {
+ if ( gindex < (FT_UInt)k )
+ {
+ table_pos += 4 * gindex;
+ if ( table_pos + 4 > table_end )
+ goto NoData;
+
+ if ( FT_STREAM_SEEK( table_pos ) ||
+ FT_READ_USHORT( *aadvance ) ||
+ FT_READ_SHORT( *abearing ) )
+ goto NoData;
+ }
+ else
+ {
+ table_pos += 4 * ( k - 1 );
+ if ( table_pos + 4 > table_end )
+ goto NoData;
+
+ if ( FT_STREAM_SEEK( table_pos ) ||
+ FT_READ_USHORT( *aadvance ) )
+ goto NoData;
+
+ table_pos += 4 + 2 * ( gindex - k );
+ if ( table_pos + 2 > table_end )
+ *abearing = 0;
+ else
+ {
+ if ( !FT_STREAM_SEEK( table_pos ) )
+ (void)FT_READ_SHORT( *abearing );
+ }
+ }
+ }
+ else
+ {
+ NoData:
+ *abearing = 0;
+ *aadvance = 0;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
new file mode 100644
index 0000000000..78c0f06a7a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* ttmtx.h */
+/* */
+/* Load the metrics tables common to TTF and OTF fonts (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTMTX_H__
+#define __TTMTX_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hhea( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hmtx( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_get_metrics( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short* abearing,
+ FT_UShort* aadvance );
+
+FT_END_HEADER
+
+#endif /* __TTMTX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
new file mode 100644
index 0000000000..37688f22c5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
@@ -0,0 +1,563 @@
+/***************************************************************************/
+/* */
+/* ttpost.c */
+/* */
+/* Postcript name table processing for TrueType and OpenType fonts */
+/* (body). */
+/* */
+/* Copyright 1996-2003, 2006-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The post table is not completely loaded by the core engine. This */
+ /* file loads the missing PS glyph names and implements an API to access */
+ /* them. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttpost.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttpost
+
+
+ /* If this configuration macro is defined, we rely on the `PSNames' */
+ /* module to grab the glyph names. */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) )
+
+
+#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ /* Otherwise, we ignore the `PSNames' module, and provide our own */
+ /* table of Mac names. Thus, it is possible to build a version of */
+ /* FreeType without the Type 1 driver & PSNames module. */
+
+#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] )
+
+ /* the 258 default Mac PS glyph names */
+
+ static const FT_String* const tt_post_default_names[258] =
+ {
+ /* 0 */
+ ".notdef", ".null", "CR", "space", "exclam",
+ "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+ /* 10 */
+ "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash", "zero",
+ /* 20 */
+ "one", "two", "three", "four", "five",
+ "six", "seven", "eight", "nine", "colon",
+ /* 30 */
+ "semicolon", "less", "equal", "greater", "question",
+ "at", "A", "B", "C", "D",
+ /* 40 */
+ "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N",
+ /* 50 */
+ "O", "P", "Q", "R", "S",
+ "T", "U", "V", "W", "X",
+ /* 60 */
+ "Y", "Z", "bracketleft", "backslash", "bracketright",
+ "asciicircum", "underscore", "grave", "a", "b",
+ /* 70 */
+ "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l",
+ /* 80 */
+ "m", "n", "o", "p", "q",
+ "r", "s", "t", "u", "v",
+ /* 90 */
+ "w", "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+ /* 100 */
+ "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+ "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+ /* 110 */
+ "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+ "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+ /* 120 */
+ "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+ "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+ /* 130 */
+ "dagger", "degree", "cent", "sterling", "section",
+ "bullet", "paragraph", "germandbls", "registered", "copyright",
+ /* 140 */
+ "trademark", "acute", "dieresis", "notequal", "AE",
+ "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+ /* 150 */
+ "yen", "mu", "partialdiff", "summation", "product",
+ "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+ /* 160 */
+ "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+ "radical", "florin", "approxequal", "Delta", "guillemotleft",
+ /* 170 */
+ "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash", "emdash",
+ /* 180 */
+ "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+ "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+ /* 190 */
+ "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+ "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
+ /* 200 */
+ "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+ "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+ /* 210 */
+ "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron", "breve",
+ /* 220 */
+ "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+ "caron", "Lslash", "lslash", "Scaron", "scaron",
+ /* 230 */
+ "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+ "Yacute", "yacute", "Thorn", "thorn", "minus",
+ /* 240 */
+ "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+ "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+ /* 250 */
+ "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
+ "Ccaron", "ccaron", "dmacron",
+ };
+
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ static FT_Error
+ load_format_20( TT_Face face,
+ FT_Stream stream,
+ FT_Long post_limit )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+
+ FT_Int num_glyphs;
+ FT_UShort num_names;
+
+ FT_UShort* glyph_indices = 0;
+ FT_Char** name_strings = 0;
+
+
+ if ( FT_READ_USHORT( num_glyphs ) )
+ goto Exit;
+
+ /* UNDOCUMENTED! The number of glyphs in this table can be smaller */
+ /* than the value in the maxp table (cf. cyberbit.ttf). */
+
+ /* There already exist fonts which have more than 32768 glyph names */
+ /* in this table, so the test for this threshold has been dropped. */
+
+ if ( num_glyphs > face->max_profile.numGlyphs )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* load the indices */
+ {
+ FT_Int n;
+
+
+ if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||
+ FT_FRAME_ENTER( num_glyphs * 2L ) )
+ goto Fail;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ glyph_indices[n] = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+ }
+
+ /* compute number of names stored in table */
+ {
+ FT_Int n;
+
+
+ num_names = 0;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ FT_Int idx;
+
+
+ idx = glyph_indices[n];
+ if ( idx >= 258 )
+ {
+ idx -= 257;
+ if ( idx > num_names )
+ num_names = (FT_UShort)idx;
+ }
+ }
+ }
+
+ /* now load the name strings */
+ {
+ FT_UShort n;
+
+
+ if ( FT_NEW_ARRAY( name_strings, num_names ) )
+ goto Fail;
+
+ for ( n = 0; n < num_names; n++ )
+ {
+ FT_UInt len;
+
+
+ if ( FT_STREAM_POS() >= post_limit )
+ break;
+ else
+ {
+ FT_TRACE6(( "load_format_20: %d byte left in post table\n",
+ post_limit - FT_STREAM_POS() ));
+
+ if ( FT_READ_BYTE( len ) )
+ goto Fail1;
+ }
+
+ if ( (FT_Int)len > post_limit ||
+ FT_STREAM_POS() > post_limit - (FT_Int)len )
+ {
+ FT_ERROR(( "load_format_20:"
+ " exceeding string length (%d),"
+ " truncating at end of post table (%d byte left)\n",
+ len, post_limit - FT_STREAM_POS() ));
+ len = FT_MAX( 0, post_limit - FT_STREAM_POS() );
+ }
+
+ if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||
+ FT_STREAM_READ( name_strings[n], len ) )
+ goto Fail1;
+
+ name_strings[n][len] = '\0';
+ }
+
+ if ( n < num_names )
+ {
+ FT_ERROR(( "load_format_20:"
+ " all entries in post table are already parsed,"
+ " using NULL names for gid %d - %d\n",
+ n, num_names - 1 ));
+ for ( ; n < num_names; n++ )
+ if ( FT_NEW_ARRAY( name_strings[n], 1 ) )
+ goto Fail1;
+ else
+ name_strings[n][0] = '\0';
+ }
+ }
+
+ /* all right, set table fields and exit successfully */
+ {
+ TT_Post_20 table = &face->postscript_names.names.format_20;
+
+
+ table->num_glyphs = (FT_UShort)num_glyphs;
+ table->num_names = (FT_UShort)num_names;
+ table->glyph_indices = glyph_indices;
+ table->glyph_names = name_strings;
+ }
+ return FT_Err_Ok;
+
+ Fail1:
+ {
+ FT_UShort n;
+
+
+ for ( n = 0; n < num_names; n++ )
+ FT_FREE( name_strings[n] );
+ }
+
+ Fail:
+ FT_FREE( name_strings );
+ FT_FREE( glyph_indices );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_format_25( TT_Face face,
+ FT_Stream stream,
+ FT_Long post_limit )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+
+ FT_Int num_glyphs;
+ FT_Char* offset_table = 0;
+
+ FT_UNUSED( post_limit );
+
+
+ /* UNDOCUMENTED! This value appears only in the Apple TT specs. */
+ if ( FT_READ_USHORT( num_glyphs ) )
+ goto Exit;
+
+ /* check the number of glyphs */
+ if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_NEW_ARRAY( offset_table, num_glyphs ) ||
+ FT_STREAM_READ( offset_table, num_glyphs ) )
+ goto Fail;
+
+ /* now check the offset table */
+ {
+ FT_Int n;
+
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ FT_Long idx = (FT_Long)n + offset_table[n];
+
+
+ if ( idx < 0 || idx > num_glyphs )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+ }
+ }
+
+ /* OK, set table fields and exit successfully */
+ {
+ TT_Post_25 table = &face->postscript_names.names.format_25;
+
+
+ table->num_glyphs = (FT_UShort)num_glyphs;
+ table->offsets = offset_table;
+ }
+
+ return FT_Err_Ok;
+
+ Fail:
+ FT_FREE( offset_table );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_post_names( TT_Face face )
+ {
+ FT_Stream stream;
+ FT_Error error;
+ FT_Fixed format;
+ FT_ULong post_len;
+ FT_Long post_limit;
+
+
+ /* get a stream for the face's resource */
+ stream = face->root.stream;
+
+ /* seek to the beginning of the PS names table */
+ error = face->goto_table( face, TTAG_post, stream, &post_len );
+ if ( error )
+ goto Exit;
+
+ post_limit = FT_STREAM_POS() + post_len;
+
+ format = face->postscript.FormatType;
+
+ /* go to beginning of subtable */
+ if ( FT_STREAM_SKIP( 32 ) )
+ goto Exit;
+
+ /* now read postscript table */
+ if ( format == 0x00020000L )
+ error = load_format_20( face, stream, post_limit );
+ else if ( format == 0x00028000L )
+ error = load_format_25( face, stream, post_limit );
+ else
+ error = FT_THROW( Invalid_File_Format );
+
+ face->postscript_names.loaded = 1;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_ps_names( TT_Face face )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_Post_Names names = &face->postscript_names;
+ FT_Fixed format;
+
+
+ if ( names->loaded )
+ {
+ format = face->postscript.FormatType;
+
+ if ( format == 0x00020000L )
+ {
+ TT_Post_20 table = &names->names.format_20;
+ FT_UShort n;
+
+
+ FT_FREE( table->glyph_indices );
+ table->num_glyphs = 0;
+
+ for ( n = 0; n < table->num_names; n++ )
+ FT_FREE( table->glyph_names[n] );
+
+ FT_FREE( table->glyph_names );
+ table->num_names = 0;
+ }
+ else if ( format == 0x00028000L )
+ {
+ TT_Post_25 table = &names->names.format_25;
+
+
+ FT_FREE( table->offsets );
+ table->num_glyphs = 0;
+ }
+ }
+ names->loaded = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_ps_name */
+ /* */
+ /* <Description> */
+ /* Get the PostScript glyph name of a glyph. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the parent face. */
+ /* */
+ /* idx :: The glyph index. */
+ /* */
+ /* <InOut> */
+ /* PSname :: The address of a string pointer. Will be NULL in case */
+ /* of error, otherwise it is a pointer to the glyph name. */
+ /* */
+ /* You must not modify the returned string! */
+ /* */
+ /* <Output> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_get_ps_name( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname )
+ {
+ FT_Error error;
+ TT_Post_Names names;
+ FT_Fixed format;
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_Service_PsCMaps psnames;
+#endif
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
+ return FT_THROW( Invalid_Glyph_Index );
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ psnames = (FT_Service_PsCMaps)face->psnames;
+ if ( !psnames )
+ return FT_THROW( Unimplemented_Feature );
+#endif
+
+ names = &face->postscript_names;
+
+ /* `.notdef' by default */
+ *PSname = MAC_NAME( 0 );
+
+ format = face->postscript.FormatType;
+
+ if ( format == 0x00010000L )
+ {
+ if ( idx < 258 ) /* paranoid checking */
+ *PSname = MAC_NAME( idx );
+ }
+ else if ( format == 0x00020000L )
+ {
+ TT_Post_20 table = &names->names.format_20;
+
+
+ if ( !names->loaded )
+ {
+ error = load_post_names( face );
+ if ( error )
+ goto End;
+ }
+
+ if ( idx < (FT_UInt)table->num_glyphs )
+ {
+ FT_UShort name_index = table->glyph_indices[idx];
+
+
+ if ( name_index < 258 )
+ *PSname = MAC_NAME( name_index );
+ else
+ *PSname = (FT_String*)table->glyph_names[name_index - 258];
+ }
+ }
+ else if ( format == 0x00028000L )
+ {
+ TT_Post_25 table = &names->names.format_25;
+
+
+ if ( !names->loaded )
+ {
+ error = load_post_names( face );
+ if ( error )
+ goto End;
+ }
+
+ if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */
+ {
+ idx += table->offsets[idx];
+ *PSname = MAC_NAME( idx );
+ }
+ }
+
+ /* nothing to do for format == 0x00030000L */
+
+ End:
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
new file mode 100644
index 0000000000..0016c090d1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ttpost.h */
+/* */
+/* Postcript name table processing for TrueType and OpenType fonts */
+/* (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPOST_H__
+#define __TTPOST_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_get_ps_name( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname );
+
+ FT_LOCAL( void )
+ tt_face_free_ps_names( TT_Face face );
+
+
+FT_END_HEADER
+
+#endif /* __TTPOST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
new file mode 100644
index 0000000000..1f54e2c0ee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/* */
+/* ttsbit.c */
+/* */
+/* TrueType and OpenType embedded bitmap support (body). */
+/* */
+/* Copyright 2005-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Google Author(s): Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "ttsbit.h"
+
+#include "sferrors.h"
+
+#include "pngshim.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttsbit
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_eblc( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed version;
+ FT_ULong num_strikes, table_size;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_UInt count;
+
+
+ face->sbit_num_strikes = 0;
+
+ /* this table is optional */
+ error = face->goto_table( face, TTAG_CBLC, stream, &table_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_EBLC, stream, &table_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_bloc, stream, &table_size );
+ if ( error )
+ goto Exit;
+
+ if ( table_size < 8 )
+ {
+ FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )
+ goto Exit;
+
+ face->sbit_table_size = table_size;
+
+ p = face->sbit_table;
+ p_limit = p + table_size;
+
+ version = FT_NEXT_ULONG( p );
+ num_strikes = FT_NEXT_ULONG( p );
+
+ if ( version != 0x00020000UL || num_strikes >= 0x10000UL )
+ {
+ FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /*
+ * Count the number of strikes available in the table. We are a bit
+ * paranoid there and don't trust the data.
+ */
+ count = (FT_UInt)num_strikes;
+ if ( 8 + 48UL * count > table_size )
+ count = (FT_UInt)( ( p_limit - p ) / 48 );
+
+ face->sbit_num_strikes = count;
+
+ FT_TRACE3(( "sbit_num_strikes: %u\n", count ));
+ Exit:
+ return error;
+
+ Fail:
+ FT_FRAME_RELEASE( face->sbit_table );
+ face->sbit_table_size = 0;
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_eblc( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->sbit_table );
+ face->sbit_table_size = 0;
+ face->sbit_num_strikes = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_set_sbit_strike( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index )
+ {
+ return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_strike_metrics( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics )
+ {
+ FT_Byte* strike;
+
+
+ if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
+ return FT_THROW( Invalid_Argument );
+
+ strike = face->sbit_table + 8 + strike_index * 48;
+
+ metrics->x_ppem = (FT_UShort)strike[44];
+ metrics->y_ppem = (FT_UShort)strike[45];
+
+ metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */
+ metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */
+ metrics->height = metrics->ascender - metrics->descender;
+
+ /* XXX: Is this correct? */
+ metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */
+ strike[18] + /* max_width */
+ (FT_Char)strike[23] /* min_advance_SB */
+ ) << 6;
+
+ return FT_Err_Ok;
+ }
+
+
+ typedef struct TT_SBitDecoderRec_
+ {
+ TT_Face face;
+ FT_Stream stream;
+ FT_Bitmap* bitmap;
+ TT_SBit_Metrics metrics;
+ FT_Bool metrics_loaded;
+ FT_Bool bitmap_allocated;
+ FT_Byte bit_depth;
+
+ FT_ULong ebdt_start;
+ FT_ULong ebdt_size;
+
+ FT_ULong strike_index_array;
+ FT_ULong strike_index_count;
+ FT_Byte* eblc_base;
+ FT_Byte* eblc_limit;
+
+ } TT_SBitDecoderRec, *TT_SBitDecoder;
+
+
+ static FT_Error
+ tt_sbit_decoder_init( TT_SBitDecoder decoder,
+ TT_Face face,
+ FT_ULong strike_index,
+ TT_SBit_MetricsRec* metrics )
+ {
+ FT_Error error;
+ FT_Stream stream = face->root.stream;
+ FT_ULong ebdt_size;
+
+
+ error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
+ if ( error )
+ goto Exit;
+
+ decoder->face = face;
+ decoder->stream = stream;
+ decoder->bitmap = &face->root.glyph->bitmap;
+ decoder->metrics = metrics;
+
+ decoder->metrics_loaded = 0;
+ decoder->bitmap_allocated = 0;
+
+ decoder->ebdt_start = FT_STREAM_POS();
+ decoder->ebdt_size = ebdt_size;
+
+ decoder->eblc_base = face->sbit_table;
+ decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
+
+ /* now find the strike corresponding to the index */
+ {
+ FT_Byte* p;
+
+
+ if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ p = decoder->eblc_base + 8 + 48 * strike_index;
+
+ decoder->strike_index_array = FT_NEXT_ULONG( p );
+ p += 4;
+ decoder->strike_index_count = FT_NEXT_ULONG( p );
+ p += 34;
+ decoder->bit_depth = *p;
+
+ if ( decoder->strike_index_array > face->sbit_table_size ||
+ decoder->strike_index_array + 8 * decoder->strike_index_count >
+ face->sbit_table_size )
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ tt_sbit_decoder_done( TT_SBitDecoder decoder )
+ {
+ FT_UNUSED( decoder );
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder,
+ FT_UInt load_flags )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt width, height;
+ FT_Bitmap* map = decoder->bitmap;
+ FT_Long size;
+
+
+ if ( !decoder->metrics_loaded )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ map->width = (int)width;
+ map->rows = (int)height;
+
+ switch ( decoder->bit_depth )
+ {
+ case 1:
+ map->pixel_mode = FT_PIXEL_MODE_MONO;
+ map->pitch = ( map->width + 7 ) >> 3;
+ map->num_grays = 2;
+ break;
+
+ case 2:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY2;
+ map->pitch = ( map->width + 3 ) >> 2;
+ map->num_grays = 4;
+ break;
+
+ case 4:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY4;
+ map->pitch = ( map->width + 1 ) >> 1;
+ map->num_grays = 16;
+ break;
+
+ case 8:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY;
+ map->pitch = map->width;
+ map->num_grays = 256;
+ break;
+
+ case 32:
+ if ( load_flags & FT_LOAD_COLOR )
+ {
+ map->pixel_mode = FT_PIXEL_MODE_BGRA;
+ map->pitch = map->width * 4;
+ map->num_grays = 256;
+ }
+ else
+ {
+ map->pixel_mode = FT_PIXEL_MODE_GRAY;
+ map->pitch = map->width;
+ map->num_grays = 256;
+ }
+ break;
+
+ default:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ size = map->rows * map->pitch;
+
+ /* check that there is no empty image */
+ if ( size == 0 )
+ goto Exit; /* exit successfully! */
+
+ error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
+ if ( error )
+ goto Exit;
+
+ decoder->bitmap_allocated = 1;
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder,
+ FT_Byte* *pp,
+ FT_Byte* limit,
+ FT_Bool big )
+ {
+ FT_Byte* p = *pp;
+ TT_SBit_Metrics metrics = decoder->metrics;
+
+
+ if ( p + 5 > limit )
+ goto Fail;
+
+ metrics->height = p[0];
+ metrics->width = p[1];
+ metrics->horiBearingX = (FT_Char)p[2];
+ metrics->horiBearingY = (FT_Char)p[3];
+ metrics->horiAdvance = p[4];
+
+ p += 5;
+ if ( big )
+ {
+ if ( p + 3 > limit )
+ goto Fail;
+
+ metrics->vertBearingX = (FT_Char)p[0];
+ metrics->vertBearingY = (FT_Char)p[1];
+ metrics->vertAdvance = p[2];
+
+ p += 3;
+ }
+
+ decoder->metrics_loaded = 1;
+ *pp = p;
+ return FT_Err_Ok;
+
+ Fail:
+ FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* forward declaration */
+ static FT_Error
+ tt_sbit_decoder_load_image( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_index,
+ FT_Int x_pos,
+ FT_Int y_pos );
+
+ typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* plimit,
+ FT_Int x_pos,
+ FT_Int y_pos );
+
+
+ static FT_Error
+ tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* line;
+ FT_Int bit_height, bit_width, pitch, width, height, line_bits, h;
+ FT_Bitmap* bitmap;
+
+ FT_UNUSED( load_flags );
+
+
+ /* check that we can write the glyph into the bitmap */
+ bitmap = decoder->bitmap;
+ bit_width = bitmap->width;
+ bit_height = bitmap->rows;
+ pitch = bitmap->pitch;
+ line = bitmap->buffer;
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ line_bits = width * decoder->bit_depth;
+
+ if ( x_pos < 0 || x_pos + width > bit_width ||
+ y_pos < 0 || y_pos + height > bit_height )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:"
+ " invalid bitmap dimensions\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now do the blit */
+ line += y_pos * pitch + ( x_pos >> 3 );
+ x_pos &= 7;
+
+ if ( x_pos == 0 ) /* the easy one */
+ {
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w;
+
+
+ for ( w = line_bits; w >= 8; w -= 8 )
+ {
+ pwrite[0] = (FT_Byte)( pwrite[0] | *p++ );
+ pwrite += 1;
+ }
+
+ if ( w > 0 )
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) );
+ }
+ }
+ else /* x_pos > 0 */
+ {
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w;
+ FT_UInt wval = 0;
+
+
+ for ( w = line_bits; w >= 8; w -= 8 )
+ {
+ wval = (FT_UInt)( wval | *p++ );
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+ pwrite += 1;
+ wval <<= 8;
+ }
+
+ if ( w > 0 )
+ wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );
+
+ /* all bits read and there are `x_pos + w' bits to be written */
+
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+
+ if ( x_pos + w > 8 )
+ {
+ pwrite++;
+ wval <<= 8;
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+ }
+ }
+ }
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" ));
+ return error;
+ }
+
+
+ /*
+ * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap
+ * (with pointer `pwrite'). In the example below, the width is 3 pixel,
+ * and `x_pos' is 1 pixel.
+ *
+ * p p+1
+ * | | |
+ * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |...
+ * | | |
+ * +-------+ +-------+ +-------+ ...
+ * . . .
+ * . . .
+ * v . .
+ * +-------+ . .
+ * | | .
+ * | 7 6 5 4 3 2 1 0 | .
+ * | | .
+ * pwrite . .
+ * . .
+ * v .
+ * +-------+ .
+ * | |
+ * | 7 6 5 4 3 2 1 0 |
+ * | |
+ * pwrite+1 .
+ * .
+ * v
+ * +-------+
+ * | |
+ * | 7 6 5 4 3 2 1 0 |
+ * | |
+ * pwrite+2
+ *
+ */
+
+ static FT_Error
+ tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* line;
+ FT_Int bit_height, bit_width, pitch, width, height, line_bits, h, nbits;
+ FT_Bitmap* bitmap;
+ FT_UShort rval;
+
+ FT_UNUSED( load_flags );
+
+
+ /* check that we can write the glyph into the bitmap */
+ bitmap = decoder->bitmap;
+ bit_width = bitmap->width;
+ bit_height = bitmap->rows;
+ pitch = bitmap->pitch;
+ line = bitmap->buffer;
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ line_bits = width * decoder->bit_depth;
+
+ if ( x_pos < 0 || x_pos + width > bit_width ||
+ y_pos < 0 || y_pos + height > bit_height )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:"
+ " invalid bitmap dimensions\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now do the blit */
+
+ /* adjust `line' to point to the first byte of the bitmap */
+ line += y_pos * pitch + ( x_pos >> 3 );
+ x_pos &= 7;
+
+ /* the higher byte of `rval' is used as a buffer */
+ rval = 0;
+ nbits = 0;
+
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w = line_bits;
+
+
+ /* handle initial byte (in target bitmap) specially if necessary */
+ if ( x_pos )
+ {
+ w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;
+
+ if ( h == height )
+ {
+ rval = *p++;
+ nbits = x_pos;
+ }
+ else if ( nbits < w )
+ {
+ if ( p < limit )
+ rval |= *p++;
+ nbits += 8 - w;
+ }
+ else
+ {
+ rval >>= 8;
+ nbits -= w;
+ }
+
+ *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &
+ ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
+ rval <<= 8;
+
+ w = line_bits - w;
+ }
+
+ /* handle medial bytes */
+ for ( ; w >= 8; w -= 8 )
+ {
+ rval |= *p++;
+ *pwrite++ |= ( rval >> nbits ) & 0xFF;
+
+ rval <<= 8;
+ }
+
+ /* handle final byte if necessary */
+ if ( w > 0 )
+ {
+ if ( nbits < w )
+ {
+ if ( p < limit )
+ rval |= *p++;
+ *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+ nbits += 8 - w;
+
+ rval <<= 8;
+ }
+ else
+ {
+ *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+ nbits -= w;
+ }
+ }
+ }
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" ));
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_compound( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt num_components, nn;
+
+ FT_Char horiBearingX = decoder->metrics->horiBearingX;
+ FT_Char horiBearingY = decoder->metrics->horiBearingY;
+ FT_Byte horiAdvance = decoder->metrics->horiAdvance;
+ FT_Char vertBearingX = decoder->metrics->vertBearingX;
+ FT_Char vertBearingY = decoder->metrics->vertBearingY;
+ FT_Byte vertAdvance = decoder->metrics->vertAdvance;
+
+
+ if ( p + 2 > limit )
+ goto Fail;
+
+ num_components = FT_NEXT_USHORT( p );
+ if ( p + 4 * num_components > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" ));
+ goto Fail;
+ }
+
+ FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
+ num_components ));
+
+ for ( nn = 0; nn < num_components; nn++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+ FT_Byte dx = FT_NEXT_BYTE( p );
+ FT_Byte dy = FT_NEXT_BYTE( p );
+
+
+ /* NB: a recursive call */
+ error = tt_sbit_decoder_load_image( decoder, load_flags, gindex,
+ x_pos + dx, y_pos + dy );
+ if ( error )
+ break;
+ }
+
+ FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" ));
+
+ decoder->metrics->horiBearingX = horiBearingX;
+ decoder->metrics->horiBearingY = horiBearingY;
+ decoder->metrics->horiAdvance = horiAdvance;
+ decoder->metrics->vertBearingX = vertBearingX;
+ decoder->metrics->vertBearingY = vertBearingY;
+ decoder->metrics->vertAdvance = vertAdvance;
+ decoder->metrics->width = (FT_Byte)decoder->bitmap->width;
+ decoder->metrics->height = (FT_Byte)decoder->bitmap->rows;
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ static FT_Error
+ tt_sbit_decoder_load_png( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong png_len;
+
+ FT_UNUSED( load_flags );
+
+
+ if ( limit - p < 4 )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ png_len = FT_NEXT_ULONG( p );
+ if ( (FT_ULong)( limit - p ) < png_len )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ error = Load_SBit_Png( decoder->bitmap,
+ x_pos,
+ y_pos,
+ decoder->bit_depth,
+ decoder->metrics,
+ decoder->stream->memory,
+ p,
+ png_len );
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" ));
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+ static FT_Error
+ tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_format,
+ FT_ULong glyph_start,
+ FT_ULong glyph_size,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error;
+ FT_Stream stream = decoder->stream;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_Byte* data;
+
+
+ /* seek into the EBDT table now */
+ if ( glyph_start + glyph_size > decoder->ebdt_size )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||
+ FT_FRAME_EXTRACT( glyph_size, data ) )
+ goto Exit;
+
+ p = data;
+ p_limit = p + glyph_size;
+
+ /* read the data, depending on the glyph format */
+ switch ( glyph_format )
+ {
+ case 1:
+ case 2:
+ case 8:
+ case 17:
+ error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );
+ break;
+
+ case 6:
+ case 7:
+ case 9:
+ case 18:
+ error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );
+ break;
+
+ default:
+ error = FT_Err_Ok;
+ }
+
+ if ( error )
+ goto Fail;
+
+ {
+ TT_SBitDecoder_LoadFunc loader;
+
+
+ switch ( glyph_format )
+ {
+ case 1:
+ case 6:
+ loader = tt_sbit_decoder_load_byte_aligned;
+ break;
+
+ case 2:
+ case 5:
+ case 7:
+ loader = tt_sbit_decoder_load_bit_aligned;
+ break;
+
+ case 8:
+ if ( p + 1 > p_limit )
+ goto Fail;
+
+ p += 1; /* skip padding */
+ /* fall-through */
+
+ case 9:
+ loader = tt_sbit_decoder_load_compound;
+ break;
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+ case 17: /* small metrics, PNG image data */
+ case 18: /* big metrics, PNG image data */
+ case 19: /* metrics in EBLC, PNG image data */
+ loader = tt_sbit_decoder_load_png;
+ break;
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+ default:
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
+ if ( !decoder->bitmap_allocated )
+ {
+ error = tt_sbit_decoder_alloc_bitmap( decoder, load_flags );
+ if ( error )
+ goto Fail;
+ }
+
+ if ( decoder->bit_depth == 32 &&
+ decoder->bitmap->pixel_mode != FT_PIXEL_MODE_BGRA )
+ {
+ /* Flatten color bitmaps if color was not requested. */
+
+ FT_Library library = decoder->face->root.glyph->library;
+ FT_Memory memory = decoder->stream->memory;
+
+ FT_Bitmap color, *orig;
+
+
+ if ( decoder->bitmap->pixel_mode != FT_PIXEL_MODE_GRAY ||
+ x_pos != 0 || y_pos != 0 )
+ {
+ /* Shouldn't happen. */
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
+ FT_Bitmap_New( &color );
+
+ color.rows = decoder->bitmap->rows;
+ color.width = decoder->bitmap->width;
+ color.pitch = color.width * 4;
+ color.pixel_mode = FT_PIXEL_MODE_BGRA;
+
+ if ( FT_ALLOC( color.buffer, color.rows * color.pitch ) )
+ goto Fail;
+
+ orig = decoder->bitmap;
+ decoder->bitmap = &color;
+
+ error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+
+ decoder->bitmap = orig;
+
+ /* explicitly test against FT_Err_Ok to avoid compiler warnings */
+ /* (we do an assignment within a conditional) */
+ if ( error ||
+ ( error = FT_Bitmap_Convert( library,
+ &color,
+ decoder->bitmap,
+ 1 ) ) != FT_Err_Ok )
+ {
+ FT_Bitmap_Done( library, &color );
+ goto Fail;
+ }
+
+ FT_Bitmap_Done( library, &color );
+ }
+
+ else
+ error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+ }
+
+ Fail:
+ FT_FRAME_RELEASE( data );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_image( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_index,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ /*
+ * First, we find the correct strike range that applies to this
+ * glyph index.
+ */
+
+ FT_Byte* p = decoder->eblc_base + decoder->strike_index_array;
+ FT_Byte* p_limit = decoder->eblc_limit;
+ FT_ULong num_ranges = decoder->strike_index_count;
+ FT_UInt start, end, index_format, image_format;
+ FT_ULong image_start = 0, image_end = 0, image_offset;
+
+
+ for ( ; num_ranges > 0; num_ranges-- )
+ {
+ start = FT_NEXT_USHORT( p );
+ end = FT_NEXT_USHORT( p );
+
+ if ( glyph_index >= start && glyph_index <= end )
+ goto FoundRange;
+
+ p += 4; /* ignore index offset */
+ }
+ goto NoBitmap;
+
+ FoundRange:
+ image_offset = FT_NEXT_ULONG( p );
+
+ /* overflow check */
+ p = decoder->eblc_base + decoder->strike_index_array;
+ if ( image_offset > (FT_ULong)( p_limit - p ) )
+ goto Failure;
+
+ p += image_offset;
+ if ( p + 8 > p_limit )
+ goto NoBitmap;
+
+ /* now find the glyph's location and extend within the ebdt table */
+ index_format = FT_NEXT_USHORT( p );
+ image_format = FT_NEXT_USHORT( p );
+ image_offset = FT_NEXT_ULONG ( p );
+
+ switch ( index_format )
+ {
+ case 1: /* 4-byte offsets relative to `image_offset' */
+ {
+ p += 4 * ( glyph_index - start );
+ if ( p + 8 > p_limit )
+ goto NoBitmap;
+
+ image_start = FT_NEXT_ULONG( p );
+ image_end = FT_NEXT_ULONG( p );
+
+ if ( image_start == image_end ) /* missing glyph */
+ goto NoBitmap;
+ }
+ break;
+
+ case 2: /* big metrics, constant image size */
+ {
+ FT_ULong image_size;
+
+
+ if ( p + 12 > p_limit )
+ goto NoBitmap;
+
+ image_size = FT_NEXT_ULONG( p );
+
+ if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+ goto NoBitmap;
+
+ image_start = image_size * ( glyph_index - start );
+ image_end = image_start + image_size;
+ }
+ break;
+
+ case 3: /* 2-byte offsets relative to 'image_offset' */
+ {
+ p += 2 * ( glyph_index - start );
+ if ( p + 4 > p_limit )
+ goto NoBitmap;
+
+ image_start = FT_NEXT_USHORT( p );
+ image_end = FT_NEXT_USHORT( p );
+
+ if ( image_start == image_end ) /* missing glyph */
+ goto NoBitmap;
+ }
+ break;
+
+ case 4: /* sparse glyph array with (glyph,offset) pairs */
+ {
+ FT_ULong mm, num_glyphs;
+
+
+ if ( p + 4 > p_limit )
+ goto NoBitmap;
+
+ num_glyphs = FT_NEXT_ULONG( p );
+
+ /* overflow check for p + ( num_glyphs + 1 ) * 4 */
+ if ( num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )
+ goto NoBitmap;
+
+ for ( mm = 0; mm < num_glyphs; mm++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex == glyph_index )
+ {
+ image_start = FT_NEXT_USHORT( p );
+ p += 2;
+ image_end = FT_PEEK_USHORT( p );
+ break;
+ }
+ p += 2;
+ }
+
+ if ( mm >= num_glyphs )
+ goto NoBitmap;
+ }
+ break;
+
+ case 5: /* constant metrics with sparse glyph codes */
+ case 19:
+ {
+ FT_ULong image_size, mm, num_glyphs;
+
+
+ if ( p + 16 > p_limit )
+ goto NoBitmap;
+
+ image_size = FT_NEXT_ULONG( p );
+
+ if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+ goto NoBitmap;
+
+ num_glyphs = FT_NEXT_ULONG( p );
+
+ /* overflow check for p + 2 * num_glyphs */
+ if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )
+ goto NoBitmap;
+
+ for ( mm = 0; mm < num_glyphs; mm++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex == glyph_index )
+ break;
+ }
+
+ if ( mm >= num_glyphs )
+ goto NoBitmap;
+
+ image_start = image_size * mm;
+ image_end = image_start + image_size;
+ }
+ break;
+
+ default:
+ goto NoBitmap;
+ }
+
+ if ( image_start > image_end )
+ goto NoBitmap;
+
+ image_end -= image_start;
+ image_start = image_offset + image_start;
+
+ FT_TRACE3(( "tt_sbit_decoder_load_image:"
+ " found sbit (format %d) for glyph index %d\n",
+ image_format, glyph_index ));
+
+ return tt_sbit_decoder_load_bitmap( decoder,
+ load_flags,
+ image_format,
+ image_start,
+ image_end,
+ x_pos,
+ y_pos );
+
+ Failure:
+ return FT_THROW( Invalid_Table );
+
+ NoBitmap:
+ FT_TRACE4(( "tt_sbit_decoder_load_image:"
+ " no sbit found for glyph index %d\n", glyph_index ));
+
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_sbit_image( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *map,
+ TT_SBit_MetricsRec *metrics )
+ {
+ TT_SBitDecoderRec decoder[1];
+ FT_Error error;
+
+ FT_UNUSED( load_flags );
+ FT_UNUSED( stream );
+ FT_UNUSED( map );
+
+
+ error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
+ if ( !error )
+ {
+ error = tt_sbit_decoder_load_image( decoder,
+ load_flags,
+ glyph_index,
+ 0,
+ 0 );
+ tt_sbit_decoder_done( decoder );
+ }
+
+ return error;
+ }
+
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
new file mode 100644
index 0000000000..93096d8c1e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* ttsbit.h */
+/* */
+/* TrueType and OpenType embedded bitmap support (specification). */
+/* */
+/* Copyright 1996-2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTSBIT_H__
+#define __TTSBIT_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_eblc( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_free_eblc( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_set_sbit_strike( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_strike_metrics( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_sbit_image( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *map,
+ TT_SBit_MetricsRec *metrics );
+
+
+FT_END_HEADER
+
+#endif /* __TTSBIT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
new file mode 100644
index 0000000000..a8496aa2c2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/smooth Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) smooth ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftgrays ftsmooth ftspic ;
+ }
+ else
+ {
+ _sources = smooth ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/smooth Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
new file mode 100644
index 0000000000..3aafeed323
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
@@ -0,0 +1,2137 @@
+/***************************************************************************/
+/* */
+/* ftgrays.c */
+/* */
+/* A new `perfect' anti-aliasing renderer (body). */
+/* */
+/* Copyright 2000-2003, 2005-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file can be compiled without the rest of the FreeType engine, by */
+ /* defining the _STANDALONE_ macro when compiling it. You also need to */
+ /* put the files `ftgrays.h' and `ftimage.h' into the current */
+ /* compilation directory. Typically, you could do something like */
+ /* */
+ /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */
+ /* */
+ /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
+ /* same directory */
+ /* */
+ /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
+ /* */
+ /* cc -c -D_STANDALONE_ ftgrays.c */
+ /* */
+ /* The renderer can be initialized with a call to */
+ /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */
+ /* with a call to `ft_gray_raster.raster_render'. */
+ /* */
+ /* See the comments and documentation in the file `ftimage.h' for more */
+ /* details on how the raster works. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This is a new anti-aliasing scan-converter for FreeType 2. The */
+ /* algorithm used here is _very_ different from the one in the standard */
+ /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */
+ /* coverage of the outline on each pixel cell. */
+ /* */
+ /* It is based on ideas that I initially found in Raph Levien's */
+ /* excellent LibArt graphics library (see http://www.levien.com/libart */
+ /* for more information, though the web pages do not tell anything */
+ /* about the renderer; you'll have to dive into the source code to */
+ /* understand how it works). */
+ /* */
+ /* Note, however, that this is a _very_ different implementation */
+ /* compared to Raph's. Coverage information is stored in a very */
+ /* different way, and I don't use sorted vector paths. Also, it doesn't */
+ /* use floating point values. */
+ /* */
+ /* This renderer has the following advantages: */
+ /* */
+ /* - It doesn't need an intermediate bitmap. Instead, one can supply a */
+ /* callback function that will be called by the renderer to draw gray */
+ /* spans on any target surface. You can thus do direct composition on */
+ /* any kind of bitmap, provided that you give the renderer the right */
+ /* callback. */
+ /* */
+ /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */
+ /* each pixel cell. */
+ /* */
+ /* - It performs a single pass on the outline (the `standard' FT2 */
+ /* renderer makes two passes). */
+ /* */
+ /* - It can easily be modified to render to _any_ number of gray levels */
+ /* cheaply. */
+ /* */
+ /* - For small (< 20) pixel sizes, it is faster than the standard */
+ /* renderer. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_smooth
+
+
+#ifdef _STANDALONE_
+
+
+ /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+
+ /* define this to dump debugging information */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+#include <stdio.h>
+#include <stdarg.h>
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <setjmp.h>
+#include <limits.h>
+#define FT_UINT_MAX UINT_MAX
+#define FT_INT_MAX INT_MAX
+
+#define ft_memset memset
+
+#define ft_setjmp setjmp
+#define ft_longjmp longjmp
+#define ft_jmp_buf jmp_buf
+
+typedef ptrdiff_t FT_PtrDist;
+
+
+#define ErrRaster_Invalid_Mode -2
+#define ErrRaster_Invalid_Outline -1
+#define ErrRaster_Invalid_Argument -3
+#define ErrRaster_Memory_Overflow -4
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#include "ftimage.h"
+#include "ftgrays.h"
+
+
+ /* This macro is used to indicate that a function parameter is unused. */
+ /* Its purpose is simply to reduce compiler warnings. Note also that */
+ /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+ /* ANSI compilers (e.g. LCC). */
+#define FT_UNUSED( x ) (x) = (x)
+
+
+ /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ void
+ FT_Message( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+ }
+
+
+ /* empty function useful for setting a breakpoint to catch errors */
+ int
+ FT_Throw( int error,
+ int line,
+ const char* file )
+ {
+ FT_UNUSED( error );
+ FT_UNUSED( line );
+ FT_UNUSED( file );
+
+ return 0;
+ }
+
+
+ /* we don't handle tracing levels in stand-alone mode; */
+#ifndef FT_TRACE5
+#define FT_TRACE5( varformat ) FT_Message varformat
+#endif
+#ifndef FT_TRACE7
+#define FT_TRACE7( varformat ) FT_Message varformat
+#endif
+#ifndef FT_ERROR
+#define FT_ERROR( varformat ) FT_Message varformat
+#endif
+
+#define FT_THROW( e ) \
+ ( FT_Throw( FT_ERR_CAT( ErrRaster, e ), \
+ __LINE__, \
+ __FILE__ ) | \
+ FT_ERR_CAT( ErrRaster, e ) )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */
+#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */
+#define FT_THROW( e ) FT_ERR_CAT( ErrRaster_, e )
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#define FT_DEFINE_OUTLINE_FUNCS( class_, \
+ move_to_, line_to_, \
+ conic_to_, cubic_to_, \
+ shift_, delta_ ) \
+ static const FT_Outline_Funcs class_ = \
+ { \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ \
+ };
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \
+ raster_new_, raster_reset_, \
+ raster_set_mode_, raster_render_, \
+ raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/ft2build.h"
+#include "ftgrays.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "ftsmerrs.h"
+
+#include "ftspic.h"
+
+#define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
+#define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory
+#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+#endif
+
+ /* as usual, for the speed hungry :-) */
+
+#undef RAS_ARG
+#undef RAS_ARG_
+#undef RAS_VAR
+#undef RAS_VAR_
+
+#ifndef FT_STATIC_RASTER
+
+#define RAS_ARG gray_PWorker worker
+#define RAS_ARG_ gray_PWorker worker,
+
+#define RAS_VAR worker
+#define RAS_VAR_ worker,
+
+#else /* FT_STATIC_RASTER */
+
+#define RAS_ARG /* empty */
+#define RAS_ARG_ /* empty */
+#define RAS_VAR /* empty */
+#define RAS_VAR_ /* empty */
+
+#endif /* FT_STATIC_RASTER */
+
+
+ /* must be at least 6 bits! */
+#define PIXEL_BITS 8
+
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define ONE_PIXEL ( 1L << PIXEL_BITS )
+#define PIXEL_MASK ( -1L << PIXEL_BITS )
+#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
+#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
+#define FLOOR( x ) ( (x) & -ONE_PIXEL )
+#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
+#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
+
+#if PIXEL_BITS >= 6
+#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) )
+#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) )
+#else
+#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) )
+#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) )
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* TYPE DEFINITIONS */
+ /* */
+
+ /* don't change the following types to FT_Int or FT_Pos, since we might */
+ /* need to define them to "float" or "double" when experimenting with */
+ /* new algorithms */
+
+ typedef long TCoord; /* integer scanline/pixel coordinate */
+ typedef long TPos; /* sub-pixel coordinate */
+
+ /* determine the type used to store cell areas. This normally takes at */
+ /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */
+ /* `long' instead of `int', otherwise bad things happen */
+
+#if PIXEL_BITS <= 7
+
+ typedef int TArea;
+
+#else /* PIXEL_BITS >= 8 */
+
+ /* approximately determine the size of integers using an ANSI-C header */
+#if FT_UINT_MAX == 0xFFFFU
+ typedef long TArea;
+#else
+ typedef int TArea;
+#endif
+
+#endif /* PIXEL_BITS >= 8 */
+
+
+ /* maximum number of gray spans in a call to the span callback */
+#define FT_MAX_GRAY_SPANS 32
+
+
+ typedef struct TCell_* PCell;
+
+ typedef struct TCell_
+ {
+ TPos x; /* same with gray_TWorker.ex */
+ TCoord cover; /* same with gray_TWorker.cover */
+ TArea area;
+ PCell next;
+
+ } TCell;
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `structure was padded due to */
+ /* __declspec(align())' in order to compile cleanly with */
+ /* the maximum level of warnings. */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+ typedef struct gray_TWorker_
+ {
+ TCoord ex, ey;
+ TPos min_ex, max_ex;
+ TPos min_ey, max_ey;
+ TPos count_ex, count_ey;
+
+ TArea area;
+ TCoord cover;
+ int invalid;
+
+ PCell cells;
+ FT_PtrDist max_cells;
+ FT_PtrDist num_cells;
+
+ TCoord cx, cy;
+ TPos x, y;
+
+ TPos last_ey;
+
+ FT_Vector bez_stack[32 * 3 + 1];
+ int lev_stack[32];
+
+ FT_Outline outline;
+ FT_Bitmap target;
+ FT_BBox clip_box;
+
+ FT_Span gray_spans[FT_MAX_GRAY_SPANS];
+ int num_gray_spans;
+
+ FT_Raster_Span_Func render_span;
+ void* render_span_data;
+ int span_y;
+
+ int band_size;
+ int band_shoot;
+
+ ft_jmp_buf jump_buffer;
+
+ void* buffer;
+ long buffer_size;
+
+ PCell* ycells;
+ TPos ycount;
+
+ } gray_TWorker, *gray_PWorker;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+
+#ifndef FT_STATIC_RASTER
+#define ras (*worker)
+#else
+ static gray_TWorker ras;
+#endif
+
+
+ typedef struct gray_TRaster_
+ {
+ void* buffer;
+ long buffer_size;
+ int band_size;
+ void* memory;
+ gray_PWorker worker;
+
+ } gray_TRaster, *gray_PRaster;
+
+
+
+ /*************************************************************************/
+ /* */
+ /* Initialize the cells table. */
+ /* */
+ static void
+ gray_init_cells( RAS_ARG_ void* buffer,
+ long byte_size )
+ {
+ ras.buffer = buffer;
+ ras.buffer_size = byte_size;
+
+ ras.ycells = (PCell*) buffer;
+ ras.cells = NULL;
+ ras.max_cells = 0;
+ ras.num_cells = 0;
+ ras.area = 0;
+ ras.cover = 0;
+ ras.invalid = 1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Compute the outline bounding box. */
+ /* */
+ static void
+ gray_compute_cbox( RAS_ARG )
+ {
+ FT_Outline* outline = &ras.outline;
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = vec + outline->n_points;
+
+
+ if ( outline->n_points <= 0 )
+ {
+ ras.min_ex = ras.max_ex = 0;
+ ras.min_ey = ras.max_ey = 0;
+ return;
+ }
+
+ ras.min_ex = ras.max_ex = vec->x;
+ ras.min_ey = ras.max_ey = vec->y;
+
+ vec++;
+
+ for ( ; vec < limit; vec++ )
+ {
+ TPos x = vec->x;
+ TPos y = vec->y;
+
+
+ if ( x < ras.min_ex ) ras.min_ex = x;
+ if ( x > ras.max_ex ) ras.max_ex = x;
+ if ( y < ras.min_ey ) ras.min_ey = y;
+ if ( y > ras.max_ey ) ras.max_ey = y;
+ }
+
+ /* truncate the bounding box to integer pixels */
+ ras.min_ex = ras.min_ex >> 6;
+ ras.min_ey = ras.min_ey >> 6;
+ ras.max_ex = ( ras.max_ex + 63 ) >> 6;
+ ras.max_ey = ( ras.max_ey + 63 ) >> 6;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Record the current cell in the table. */
+ /* */
+ static PCell
+ gray_find_cell( RAS_ARG )
+ {
+ PCell *pcell, cell;
+ TPos x = ras.ex;
+
+
+ if ( x > ras.count_ex )
+ x = ras.count_ex;
+
+ pcell = &ras.ycells[ras.ey];
+ for (;;)
+ {
+ cell = *pcell;
+ if ( cell == NULL || cell->x > x )
+ break;
+
+ if ( cell->x == x )
+ goto Exit;
+
+ pcell = &cell->next;
+ }
+
+ if ( ras.num_cells >= ras.max_cells )
+ ft_longjmp( ras.jump_buffer, 1 );
+
+ cell = ras.cells + ras.num_cells++;
+ cell->x = x;
+ cell->area = 0;
+ cell->cover = 0;
+
+ cell->next = *pcell;
+ *pcell = cell;
+
+ Exit:
+ return cell;
+ }
+
+
+ static void
+ gray_record_cell( RAS_ARG )
+ {
+ if ( !ras.invalid && ( ras.area | ras.cover ) )
+ {
+ PCell cell = gray_find_cell( RAS_VAR );
+
+
+ cell->area += ras.area;
+ cell->cover += ras.cover;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Set the current cell to a new position. */
+ /* */
+ static void
+ gray_set_cell( RAS_ARG_ TCoord ex,
+ TCoord ey )
+ {
+ /* Move the cell pointer to a new position. We set the `invalid' */
+ /* flag to indicate that the cell isn't part of those we're interested */
+ /* in during the render phase. This means that: */
+ /* */
+ /* . the new vertical position must be within min_ey..max_ey-1. */
+ /* . the new horizontal position must be strictly less than max_ex */
+ /* */
+ /* Note that if a cell is to the left of the clipping region, it is */
+ /* actually set to the (min_ex-1) horizontal position. */
+
+ /* All cells that are on the left of the clipping region go to the */
+ /* min_ex - 1 horizontal position. */
+ ey -= ras.min_ey;
+
+ if ( ex > ras.max_ex )
+ ex = ras.max_ex;
+
+ ex -= ras.min_ex;
+ if ( ex < 0 )
+ ex = -1;
+
+ /* are we moving to a different cell ? */
+ if ( ex != ras.ex || ey != ras.ey )
+ {
+ /* record the current one if it is valid */
+ if ( !ras.invalid )
+ gray_record_cell( RAS_VAR );
+
+ ras.area = 0;
+ ras.cover = 0;
+ }
+
+ ras.ex = ex;
+ ras.ey = ey;
+ ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
+ ex >= ras.count_ex );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Start a new contour at a given cell. */
+ /* */
+ static void
+ gray_start_cell( RAS_ARG_ TCoord ex,
+ TCoord ey )
+ {
+ if ( ex > ras.max_ex )
+ ex = (TCoord)( ras.max_ex );
+
+ if ( ex < ras.min_ex )
+ ex = (TCoord)( ras.min_ex - 1 );
+
+ ras.area = 0;
+ ras.cover = 0;
+ ras.ex = ex - ras.min_ex;
+ ras.ey = ey - ras.min_ey;
+ ras.last_ey = SUBPIXELS( ey );
+ ras.invalid = 0;
+
+ gray_set_cell( RAS_VAR_ ex, ey );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Render a scanline as one or more cells. */
+ /* */
+ static void
+ gray_render_scanline( RAS_ARG_ TCoord ey,
+ TPos x1,
+ TCoord y1,
+ TPos x2,
+ TCoord y2 )
+ {
+ TCoord ex1, ex2, fx1, fx2, delta, mod;
+ long p, first, dx;
+ int incr;
+
+
+ dx = x2 - x1;
+
+ ex1 = TRUNC( x1 );
+ ex2 = TRUNC( x2 );
+ fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
+ fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
+
+ /* trivial case. Happens often */
+ if ( y1 == y2 )
+ {
+ gray_set_cell( RAS_VAR_ ex2, ey );
+ return;
+ }
+
+ /* everything is located in a single cell. That is easy! */
+ /* */
+ if ( ex1 == ex2 )
+ {
+ delta = y2 - y1;
+ ras.area += (TArea)(( fx1 + fx2 ) * delta);
+ ras.cover += delta;
+ return;
+ }
+
+ /* ok, we'll have to render a run of adjacent cells on the same */
+ /* scanline... */
+ /* */
+ p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
+ first = ONE_PIXEL;
+ incr = 1;
+
+ if ( dx < 0 )
+ {
+ p = fx1 * ( y2 - y1 );
+ first = 0;
+ incr = -1;
+ dx = -dx;
+ }
+
+ delta = (TCoord)( p / dx );
+ mod = (TCoord)( p % dx );
+ if ( mod < 0 )
+ {
+ delta--;
+ mod += (TCoord)dx;
+ }
+
+ ras.area += (TArea)(( fx1 + first ) * delta);
+ ras.cover += delta;
+
+ ex1 += incr;
+ gray_set_cell( RAS_VAR_ ex1, ey );
+ y1 += delta;
+
+ if ( ex1 != ex2 )
+ {
+ TCoord lift, rem;
+
+
+ p = ONE_PIXEL * ( y2 - y1 + delta );
+ lift = (TCoord)( p / dx );
+ rem = (TCoord)( p % dx );
+ if ( rem < 0 )
+ {
+ lift--;
+ rem += (TCoord)dx;
+ }
+
+ mod -= (int)dx;
+
+ while ( ex1 != ex2 )
+ {
+ delta = lift;
+ mod += rem;
+ if ( mod >= 0 )
+ {
+ mod -= (TCoord)dx;
+ delta++;
+ }
+
+ ras.area += (TArea)(ONE_PIXEL * delta);
+ ras.cover += delta;
+ y1 += delta;
+ ex1 += incr;
+ gray_set_cell( RAS_VAR_ ex1, ey );
+ }
+ }
+
+ delta = y2 - y1;
+ ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);
+ ras.cover += delta;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Render a given line as a series of scanlines. */
+ /* */
+ static void
+ gray_render_line( RAS_ARG_ TPos to_x,
+ TPos to_y )
+ {
+ TCoord ey1, ey2, fy1, fy2, mod;
+ TPos dx, dy, x, x2;
+ long p, first;
+ int delta, rem, lift, incr;
+
+
+ ey1 = TRUNC( ras.last_ey );
+ ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
+ fy1 = (TCoord)( ras.y - ras.last_ey );
+ fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
+
+ dx = to_x - ras.x;
+ dy = to_y - ras.y;
+
+ /* XXX: we should do something about the trivial case where dx == 0, */
+ /* as it happens very often! */
+
+ /* perform vertical clipping */
+ {
+ TCoord min, max;
+
+
+ min = ey1;
+ max = ey2;
+ if ( ey1 > ey2 )
+ {
+ min = ey2;
+ max = ey1;
+ }
+ if ( min >= ras.max_ey || max < ras.min_ey )
+ goto End;
+ }
+
+ /* everything is on a single scanline */
+ if ( ey1 == ey2 )
+ {
+ gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
+ goto End;
+ }
+
+ /* vertical line - avoid calling gray_render_scanline */
+ incr = 1;
+
+ if ( dx == 0 )
+ {
+ TCoord ex = TRUNC( ras.x );
+ TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
+ TArea area;
+
+
+ first = ONE_PIXEL;
+ if ( dy < 0 )
+ {
+ first = 0;
+ incr = -1;
+ }
+
+ delta = (int)( first - fy1 );
+ ras.area += (TArea)two_fx * delta;
+ ras.cover += delta;
+ ey1 += incr;
+
+ gray_set_cell( RAS_VAR_ ex, ey1 );
+
+ delta = (int)( first + first - ONE_PIXEL );
+ area = (TArea)two_fx * delta;
+ while ( ey1 != ey2 )
+ {
+ ras.area += area;
+ ras.cover += delta;
+ ey1 += incr;
+
+ gray_set_cell( RAS_VAR_ ex, ey1 );
+ }
+
+ delta = (int)( fy2 - ONE_PIXEL + first );
+ ras.area += (TArea)two_fx * delta;
+ ras.cover += delta;
+
+ goto End;
+ }
+
+ /* ok, we have to render several scanlines */
+ p = ( ONE_PIXEL - fy1 ) * dx;
+ first = ONE_PIXEL;
+ incr = 1;
+
+ if ( dy < 0 )
+ {
+ p = fy1 * dx;
+ first = 0;
+ incr = -1;
+ dy = -dy;
+ }
+
+ delta = (int)( p / dy );
+ mod = (int)( p % dy );
+ if ( mod < 0 )
+ {
+ delta--;
+ mod += (TCoord)dy;
+ }
+
+ x = ras.x + delta;
+ gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
+
+ ey1 += incr;
+ gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+
+ if ( ey1 != ey2 )
+ {
+ p = ONE_PIXEL * dx;
+ lift = (int)( p / dy );
+ rem = (int)( p % dy );
+ if ( rem < 0 )
+ {
+ lift--;
+ rem += (int)dy;
+ }
+ mod -= (int)dy;
+
+ while ( ey1 != ey2 )
+ {
+ delta = lift;
+ mod += rem;
+ if ( mod >= 0 )
+ {
+ mod -= (int)dy;
+ delta++;
+ }
+
+ x2 = x + delta;
+ gray_render_scanline( RAS_VAR_ ey1, x,
+ (TCoord)( ONE_PIXEL - first ), x2,
+ (TCoord)first );
+ x = x2;
+
+ ey1 += incr;
+ gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+ }
+ }
+
+ gray_render_scanline( RAS_VAR_ ey1, x,
+ (TCoord)( ONE_PIXEL - first ), to_x,
+ fy2 );
+
+ End:
+ ras.x = to_x;
+ ras.y = to_y;
+ ras.last_ey = SUBPIXELS( ey2 );
+ }
+
+
+ static void
+ gray_split_conic( FT_Vector* base )
+ {
+ TPos a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+ }
+
+
+ static void
+ gray_render_conic( RAS_ARG_ const FT_Vector* control,
+ const FT_Vector* to )
+ {
+ TPos dx, dy;
+ TPos min, max, y;
+ int top, level;
+ int* levels;
+ FT_Vector* arc;
+
+
+ levels = ras.lev_stack;
+
+ arc = ras.bez_stack;
+ arc[0].x = UPSCALE( to->x );
+ arc[0].y = UPSCALE( to->y );
+ arc[1].x = UPSCALE( control->x );
+ arc[1].y = UPSCALE( control->y );
+ arc[2].x = ras.x;
+ arc[2].y = ras.y;
+ top = 0;
+
+ dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );
+ dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );
+ if ( dx < dy )
+ dx = dy;
+
+ if ( dx < ONE_PIXEL / 4 )
+ goto Draw;
+
+ /* short-cut the arc that crosses the current band */
+ min = max = arc[0].y;
+
+ y = arc[1].y;
+ if ( y < min ) min = y;
+ if ( y > max ) max = y;
+
+ y = arc[2].y;
+ if ( y < min ) min = y;
+ if ( y > max ) max = y;
+
+ if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+ goto Draw;
+
+ level = 0;
+ do
+ {
+ dx >>= 2;
+ level++;
+ } while ( dx > ONE_PIXEL / 4 );
+
+ levels[0] = level;
+
+ do
+ {
+ level = levels[top];
+ if ( level > 0 )
+ {
+ gray_split_conic( arc );
+ arc += 2;
+ top++;
+ levels[top] = levels[top - 1] = level - 1;
+ continue;
+ }
+
+ Draw:
+ gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+ top--;
+ arc -= 2;
+
+ } while ( top >= 0 );
+ }
+
+
+ static void
+ gray_split_cubic( FT_Vector* base )
+ {
+ TPos a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c ) / 2;
+ base[5].x = b = ( base[3].x + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].x = a = ( a + c ) / 2;
+ base[4].x = b = ( b + c ) / 2;
+ base[3].x = ( a + b ) / 2;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c ) / 2;
+ base[5].y = b = ( base[3].y + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].y = a = ( a + c ) / 2;
+ base[4].y = b = ( b + c ) / 2;
+ base[3].y = ( a + b ) / 2;
+ }
+
+
+ static void
+ gray_render_cubic( RAS_ARG_ const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to )
+ {
+ FT_Vector* arc;
+ TPos min, max, y;
+
+
+ arc = ras.bez_stack;
+ arc[0].x = UPSCALE( to->x );
+ arc[0].y = UPSCALE( to->y );
+ arc[1].x = UPSCALE( control2->x );
+ arc[1].y = UPSCALE( control2->y );
+ arc[2].x = UPSCALE( control1->x );
+ arc[2].y = UPSCALE( control1->y );
+ arc[3].x = ras.x;
+ arc[3].y = ras.y;
+
+ /* Short-cut the arc that crosses the current band. */
+ min = max = arc[0].y;
+
+ y = arc[1].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ y = arc[2].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ y = arc[3].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+ goto Draw;
+
+ for (;;)
+ {
+ /* Decide whether to split or draw. See `Rapid Termination */
+ /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */
+ /* F. Hain, at */
+ /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
+
+ {
+ TPos dx, dy, dx_, dy_;
+ TPos dx1, dy1, dx2, dy2;
+ TPos L, s, s_limit;
+
+
+ /* dx and dy are x and y components of the P0-P3 chord vector. */
+ dx = arc[3].x - arc[0].x;
+ dy = arc[3].y - arc[0].y;
+
+ /* L is an (under)estimate of the Euclidean distance P0-P3. */
+ /* */
+ /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated */
+ /* with least maximum error by */
+ /* */
+ /* r_upperbound = dx + (sqrt(2) - 1) * dy , */
+ /* */
+ /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */
+ /* error of no more than 8.4%. */
+ /* */
+ /* Similarly, some elementary calculus shows that r can be */
+ /* underestimated with least maximum error by */
+ /* */
+ /* r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx */
+ /* + sqrt(2 - sqrt(2)) / 2 * dy . */
+ /* */
+ /* 236/256 and 97/256 are (under)estimates of the two algebraic */
+ /* numbers, giving an error of no more than 8.1%. */
+
+ dx_ = FT_ABS( dx );
+ dy_ = FT_ABS( dy );
+
+ /* This is the same as */
+ /* */
+ /* L = ( 236 * FT_MAX( dx_, dy_ ) */
+ /* + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */
+ L = ( dx_ > dy_ ? 236 * dx_ + 97 * dy_
+ : 97 * dx_ + 236 * dy_ ) >> 8;
+
+ /* Avoid possible arithmetic overflow below by splitting. */
+ if ( L > 32767 )
+ goto Split;
+
+ /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
+ s_limit = L * (TPos)( ONE_PIXEL / 6 );
+
+ /* s is L * the perpendicular distance from P1 to the line P0-P3. */
+ dx1 = arc[1].x - arc[0].x;
+ dy1 = arc[1].y - arc[0].y;
+ s = FT_ABS( dy * dx1 - dx * dy1 );
+
+ if ( s > s_limit )
+ goto Split;
+
+ /* s is L * the perpendicular distance from P2 to the line P0-P3. */
+ dx2 = arc[2].x - arc[0].x;
+ dy2 = arc[2].y - arc[0].y;
+ s = FT_ABS( dy * dx2 - dx * dy2 );
+
+ if ( s > s_limit )
+ goto Split;
+
+ /* Split super curvy segments where the off points are so far
+ from the chord that the angles P0-P1-P3 or P0-P2-P3 become
+ acute as detected by appropriate dot products. */
+ if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
+ dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
+ goto Split;
+
+ /* No reason to split. */
+ goto Draw;
+ }
+
+ Split:
+ gray_split_cubic( arc );
+ arc += 3;
+ continue;
+
+ Draw:
+ gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+
+ if ( arc == ras.bez_stack )
+ return;
+
+ arc -= 3;
+ }
+ }
+
+
+ static int
+ gray_move_to( const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ TPos x, y;
+
+
+ /* record current cell, if any */
+ gray_record_cell( RAS_VAR );
+
+ /* start to a new position */
+ x = UPSCALE( to->x );
+ y = UPSCALE( to->y );
+
+ gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
+
+ worker->x = x;
+ worker->y = y;
+ return 0;
+ }
+
+
+ static int
+ gray_line_to( const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
+ return 0;
+ }
+
+
+ static int
+ gray_conic_to( const FT_Vector* control,
+ const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_conic( RAS_VAR_ control, to );
+ return 0;
+ }
+
+
+ static int
+ gray_cubic_to( const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_cubic( RAS_VAR_ control1, control2, to );
+ return 0;
+ }
+
+
+ static void
+ gray_render_span( int y,
+ int count,
+ const FT_Span* spans,
+ gray_PWorker worker )
+ {
+ unsigned char* p;
+ FT_Bitmap* map = &worker->target;
+
+
+ /* first of all, compute the scanline offset */
+ p = (unsigned char*)map->buffer - y * map->pitch;
+ if ( map->pitch >= 0 )
+ p += (unsigned)( ( map->rows - 1 ) * map->pitch );
+
+ for ( ; count > 0; count--, spans++ )
+ {
+ unsigned char coverage = spans->coverage;
+
+
+ if ( coverage )
+ {
+ /* For small-spans it is faster to do it by ourselves than
+ * calling `memset'. This is mainly due to the cost of the
+ * function call.
+ */
+ if ( spans->len >= 8 )
+ FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
+ else
+ {
+ unsigned char* q = p + spans->x;
+
+
+ switch ( spans->len )
+ {
+ case 7: *q++ = (unsigned char)coverage;
+ case 6: *q++ = (unsigned char)coverage;
+ case 5: *q++ = (unsigned char)coverage;
+ case 4: *q++ = (unsigned char)coverage;
+ case 3: *q++ = (unsigned char)coverage;
+ case 2: *q++ = (unsigned char)coverage;
+ case 1: *q = (unsigned char)coverage;
+ default:
+ ;
+ }
+ }
+ }
+ }
+ }
+
+
+ static void
+ gray_hline( RAS_ARG_ TCoord x,
+ TCoord y,
+ TPos area,
+ TCoord acount )
+ {
+ int coverage;
+
+
+ /* compute the coverage line's coverage, depending on the */
+ /* outline fill rule */
+ /* */
+ /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
+ /* */
+ coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
+ /* use range 0..256 */
+ if ( coverage < 0 )
+ coverage = -coverage;
+
+ if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
+ {
+ coverage &= 511;
+
+ if ( coverage > 256 )
+ coverage = 512 - coverage;
+ else if ( coverage == 256 )
+ coverage = 255;
+ }
+ else
+ {
+ /* normal non-zero winding rule */
+ if ( coverage >= 256 )
+ coverage = 255;
+ }
+
+ y += (TCoord)ras.min_ey;
+ x += (TCoord)ras.min_ex;
+
+ /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
+ if ( x >= 32767 )
+ x = 32767;
+
+ /* FT_Span.y is an integer, so limit our coordinates appropriately */
+ if ( y >= FT_INT_MAX )
+ y = FT_INT_MAX;
+
+ if ( coverage )
+ {
+ FT_Span* span;
+ int count;
+
+
+ /* see whether we can add this span to the current list */
+ count = ras.num_gray_spans;
+ span = ras.gray_spans + count - 1;
+ if ( count > 0 &&
+ ras.span_y == y &&
+ (int)span->x + span->len == (int)x &&
+ span->coverage == coverage )
+ {
+ span->len = (unsigned short)( span->len + acount );
+ return;
+ }
+
+ if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
+ {
+ if ( ras.render_span && count > 0 )
+ ras.render_span( ras.span_y, count, ras.gray_spans,
+ ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( count > 0 )
+ {
+ int n;
+
+
+ FT_TRACE7(( "y = %3d ", ras.span_y ));
+ span = ras.gray_spans;
+ for ( n = 0; n < count; n++, span++ )
+ FT_TRACE7(( "[%d..%d]:%02x ",
+ span->x, span->x + span->len - 1, span->coverage ));
+ FT_TRACE7(( "\n" ));
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ ras.num_gray_spans = 0;
+ ras.span_y = (int)y;
+
+ count = 0;
+ span = ras.gray_spans;
+ }
+ else
+ span++;
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the value range of 'x', we have to crop it for avoid the overflow.
+ if (x < 32768) {
+ /* add a gray span to the current list */
+ span->x = (short)x;
+ span->len = (unsigned short)acount;
+ span->coverage = (unsigned char)coverage;
+
+ ras.num_gray_spans++;
+ }
+ }
+ }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ /* to be called while in the debugger -- */
+ /* this function causes a compiler warning since it is unused otherwise */
+ static void
+ gray_dump_cells( RAS_ARG )
+ {
+ int yindex;
+
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ {
+ PCell cell;
+
+
+ printf( "%3d:", yindex );
+
+ for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
+ printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area );
+ printf( "\n" );
+ }
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ static void
+ gray_sweep( RAS_ARG_ const FT_Bitmap* target )
+ {
+ int yindex;
+
+ FT_UNUSED( target );
+
+
+ if ( ras.num_cells == 0 )
+ return;
+
+ ras.num_gray_spans = 0;
+
+ FT_TRACE7(( "gray_sweep: start\n" ));
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ {
+ PCell cell = ras.ycells[yindex];
+ TCoord cover = 0;
+ TCoord x = 0;
+
+
+ for ( ; cell != NULL; cell = cell->next )
+ {
+ TPos area;
+
+
+ if ( cell->x > x && cover != 0 )
+ gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+ cell->x - x );
+
+ cover += cell->cover;
+ area = cover * ( ONE_PIXEL * 2 ) - cell->area;
+
+ if ( area != 0 && cell->x >= 0 )
+ gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
+
+ x = cell->x + 1;
+ }
+
+ if ( cover != 0 )
+ gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+ ras.count_ex - x );
+ }
+
+ if ( ras.render_span && ras.num_gray_spans > 0 )
+ ras.render_span( ras.span_y, ras.num_gray_spans,
+ ras.gray_spans, ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( ras.num_gray_spans > 0 )
+ {
+ FT_Span* span;
+ int n;
+
+
+ FT_TRACE7(( "y = %3d ", ras.span_y ));
+ span = ras.gray_spans;
+ for ( n = 0; n < ras.num_gray_spans; n++, span++ )
+ FT_TRACE7(( "[%d..%d]:%02x ",
+ span->x, span->x + span->len - 1, span->coverage ));
+ FT_TRACE7(( "\n" ));
+ }
+
+ FT_TRACE7(( "gray_sweep: end\n" ));
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ }
+
+
+#ifdef _STANDALONE_
+
+ /*************************************************************************/
+ /* */
+ /* The following function should only compile in stand-alone mode, */
+ /* i.e., when building this component without the rest of FreeType. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walk over an outline's structure to decompose it into individual */
+ /* segments and Bézier arcs. This function is also able to emit */
+ /* `move to' and `close to' operations to indicate the start and end */
+ /* of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* func_interface :: A table of `emitters', i.e., function pointers */
+ /* called during decomposition to indicate path */
+ /* operations. */
+ /* */
+ /* <InOut> */
+ /* user :: A typeless pointer which is passed to each */
+ /* emitter during the decomposition. It can be */
+ /* used to store the state during the */
+ /* decomposition. */
+ /* */
+ /* <Return> */
+ /* Error code. 0 means success. */
+ /* */
+ static int
+ FT_Outline_Decompose( const FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user )
+ {
+#undef SCALED
+#define SCALED( x ) ( ( (x) << shift ) - delta )
+
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ int error;
+
+ int n; /* index of contour in outline */
+ int first; /* index of first point in contour */
+ char tag; /* current point's state */
+
+ int shift;
+ TPos delta;
+
+
+ if ( !outline || !func_interface )
+ return FT_THROW( Invalid_Argument );
+
+ shift = func_interface->shift;
+ delta = func_interface->delta;
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ int last; /* index of last point in contour */
+
+
+ FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+ last = outline->contours[n];
+ if ( last < 0 )
+ goto Invalid_Outline;
+ limit = outline->points + last;
+
+ v_start = outline->points[first];
+ v_start.x = SCALED( v_start.x );
+ v_start.y = SCALED( v_start.y );
+
+ v_last = outline->points[last];
+ v_last.x = SCALED( v_last.x );
+ v_last.y = SCALED( v_last.y );
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ FT_TRACE5(( " move to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->move_to( &v_start, user );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0 ));
+ error = func_interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_middle.x / 64.0, v_middle.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1.x = SCALED( point[-2].x );
+ vec1.y = SCALED( point[-2].y );
+
+ vec2.x = SCALED( point[-1].x );
+ vec2.y = SCALED( point[-1].y );
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->line_to( &v_start, user );
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
+ }
+
+ FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+ return 0;
+
+ Exit:
+ FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+#endif /* _STANDALONE_ */
+
+
+ typedef struct gray_TBand_
+ {
+ TPos min, max;
+
+ } gray_TBand;
+
+ FT_DEFINE_OUTLINE_FUNCS(func_interface,
+ (FT_Outline_MoveTo_Func) gray_move_to,
+ (FT_Outline_LineTo_Func) gray_line_to,
+ (FT_Outline_ConicTo_Func)gray_conic_to,
+ (FT_Outline_CubicTo_Func)gray_cubic_to,
+ 0,
+ 0
+ )
+
+ static int
+ gray_convert_glyph_inner( RAS_ARG )
+ {
+
+ volatile int error = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Outline_Funcs func_interface;
+ Init_Class_func_interface(&func_interface);
+#endif
+#ifndef _FX_MANAGED_CODE_
+ if ( ft_setjmp( ras.jump_buffer ) == 0 )
+ {
+#endif
+ error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+ gray_record_cell( RAS_VAR );
+#ifndef _FX_MANAGED_CODE_
+ }
+ else
+ error = FT_THROW( Memory_Overflow );
+#endif
+ return error;
+ }
+
+
+ static int
+ gray_convert_glyph( RAS_ARG )
+ {
+ gray_TBand bands[40];
+ gray_TBand* volatile band;
+ int volatile n, num_bands;
+ TPos volatile min, max, max_y;
+ FT_BBox* clip;
+
+
+ /* Set up state in the raster object */
+ gray_compute_cbox( RAS_VAR );
+
+ /* clip to target bitmap, exit if nothing to do */
+ clip = &ras.clip_box;
+
+ if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
+ ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
+ return 0;
+
+ if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
+ if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
+
+ if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
+ if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
+
+ ras.count_ex = ras.max_ex - ras.min_ex;
+ ras.count_ey = ras.max_ey - ras.min_ey;
+
+ /* set up vertical bands */
+ num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
+ if ( num_bands == 0 )
+ num_bands = 1;
+ if ( num_bands >= 39 )
+ num_bands = 39;
+
+ ras.band_shoot = 0;
+
+ min = ras.min_ey;
+ max_y = ras.max_ey;
+
+ for ( n = 0; n < num_bands; n++, min = max )
+ {
+ max = min + ras.band_size;
+ if ( n == num_bands - 1 || max > max_y )
+ max = max_y;
+
+ bands[0].min = min;
+ bands[0].max = max;
+ band = bands;
+
+ while ( band >= bands )
+ {
+ TPos bottom, top, middle;
+ int error;
+
+ {
+ PCell cells_max;
+ int yindex;
+ long cell_start, cell_end, cell_mod;
+
+
+ ras.ycells = (PCell*)ras.buffer;
+ ras.ycount = band->max - band->min;
+
+ cell_start = sizeof ( PCell ) * ras.ycount;
+ cell_mod = cell_start % sizeof ( TCell );
+ if ( cell_mod > 0 )
+ cell_start += sizeof ( TCell ) - cell_mod;
+
+ cell_end = ras.buffer_size;
+ cell_end -= cell_end % sizeof ( TCell );
+
+ cells_max = (PCell)( (char*)ras.buffer + cell_end );
+ ras.cells = (PCell)( (char*)ras.buffer + cell_start );
+ if ( ras.cells >= cells_max )
+ goto ReduceBands;
+
+ ras.max_cells = cells_max - ras.cells;
+ if ( ras.max_cells < 2 )
+ goto ReduceBands;
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ ras.ycells[yindex] = NULL;
+ }
+
+ ras.num_cells = 0;
+ ras.invalid = 1;
+ ras.min_ey = band->min;
+ ras.max_ey = band->max;
+ ras.count_ey = band->max - band->min;
+
+ error = gray_convert_glyph_inner( RAS_VAR );
+
+ if ( !error )
+ {
+ gray_sweep( RAS_VAR_ &ras.target );
+ band--;
+ continue;
+ }
+ else if ( error != ErrRaster_Memory_Overflow )
+ return 1;
+
+ ReduceBands:
+ /* render pool overflow; we will reduce the render band by half */
+ bottom = band->min;
+ top = band->max;
+ middle = bottom + ( ( top - bottom ) >> 1 );
+
+ /* This is too complex for a single scanline; there must */
+ /* be some problems. */
+ if ( middle == bottom )
+ {
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
+#endif
+ return 1;
+ }
+
+ if ( bottom-top >= ras.band_size )
+ ras.band_shoot++;
+
+ band[1].min = bottom;
+ band[1].max = middle;
+ band[0].min = middle;
+ band[0].max = top;
+ band++;
+ }
+ }
+
+ if ( ras.band_shoot > 8 && ras.band_size > 16 )
+ ras.band_size = ras.band_size / 2;
+
+ return 0;
+ }
+
+
+ static int
+ gray_raster_render( gray_PRaster raster,
+ const FT_Raster_Params* params )
+ {
+ const FT_Outline* outline = (const FT_Outline*)params->source;
+ const FT_Bitmap* target_map = params->target;
+ gray_PWorker worker;
+
+
+ if ( !raster || !raster->buffer || !raster->buffer_size )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !outline )
+ return FT_THROW( Invalid_Outline );
+
+ /* return immediately if the outline is empty */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ return 0;
+
+ if ( !outline->contours || !outline->points )
+ return FT_THROW( Invalid_Outline );
+
+ if ( outline->n_points !=
+ outline->contours[outline->n_contours - 1] + 1 )
+ return FT_THROW( Invalid_Outline );
+
+ worker = raster->worker;
+
+ /* if direct mode is not set, we must have a target bitmap */
+ if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+ {
+ if ( !target_map )
+ return FT_THROW( Invalid_Argument );
+
+ /* nothing to do */
+ if ( !target_map->width || !target_map->rows )
+ return 0;
+
+ if ( !target_map->buffer )
+ return FT_THROW( Invalid_Argument );
+ }
+
+ /* this version does not support monochrome rendering */
+ if ( !( params->flags & FT_RASTER_FLAG_AA ) )
+ return FT_THROW( Invalid_Mode );
+
+ /* compute clipping box */
+ if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+ {
+ /* compute clip box from target pixmap */
+ ras.clip_box.xMin = 0;
+ ras.clip_box.yMin = 0;
+ ras.clip_box.xMax = target_map->width;
+ ras.clip_box.yMax = target_map->rows;
+ }
+ else if ( params->flags & FT_RASTER_FLAG_CLIP )
+ ras.clip_box = params->clip_box;
+ else
+ {
+ ras.clip_box.xMin = -32768L;
+ ras.clip_box.yMin = -32768L;
+ ras.clip_box.xMax = 32767L;
+ ras.clip_box.yMax = 32767L;
+ }
+
+ gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );
+
+ ras.outline = *outline;
+ ras.num_cells = 0;
+ ras.invalid = 1;
+ ras.band_size = raster->band_size;
+ ras.num_gray_spans = 0;
+
+ if ( params->flags & FT_RASTER_FLAG_DIRECT )
+ {
+ ras.render_span = (FT_Raster_Span_Func)params->gray_spans;
+ ras.render_span_data = params->user;
+ }
+ else
+ {
+ ras.target = *target_map;
+ ras.render_span = (FT_Raster_Span_Func)gray_render_span;
+ ras.render_span_data = &ras;
+ }
+
+ return gray_convert_glyph( RAS_VAR );
+ }
+
+
+ /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
+ /**** a static object. *****/
+
+#ifdef _STANDALONE_
+
+ static int
+ gray_raster_new( void* memory,
+ FT_Raster* araster )
+ {
+ static gray_TRaster the_raster;
+
+ FT_UNUSED( memory );
+
+
+ *araster = (FT_Raster)&the_raster;
+ FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+
+ return 0;
+ }
+
+
+ static void
+ gray_raster_done( FT_Raster raster )
+ {
+ /* nothing */
+ FT_UNUSED( raster );
+ }
+
+#else /* !_STANDALONE_ */
+
+ static int
+ gray_raster_new( FT_Memory memory,
+ FT_Raster* araster )
+ {
+ FT_Error error;
+ gray_PRaster raster = NULL;
+
+
+ *araster = 0;
+ if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )
+ {
+ raster->memory = memory;
+ *araster = (FT_Raster)raster;
+ }
+
+ return error;
+ }
+
+
+ static void
+ gray_raster_done( FT_Raster raster )
+ {
+ FT_Memory memory = (FT_Memory)((gray_PRaster)raster)->memory;
+
+
+ FT_FREE( raster );
+ }
+
+#endif /* !_STANDALONE_ */
+
+
+ static void
+ gray_raster_reset( FT_Raster raster,
+ char* pool_base,
+ long pool_size )
+ {
+ gray_PRaster rast = (gray_PRaster)raster;
+
+
+ if ( raster )
+ {
+ if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )
+ {
+ gray_PWorker worker = (gray_PWorker)pool_base;
+
+
+ rast->worker = worker;
+ rast->buffer = pool_base +
+ ( ( sizeof ( gray_TWorker ) +
+ sizeof ( TCell ) - 1 ) &
+ ~( sizeof ( TCell ) - 1 ) );
+ rast->buffer_size = (long)( ( pool_base + pool_size ) -
+ (char*)rast->buffer ) &
+ ~( sizeof ( TCell ) - 1 );
+ rast->band_size = (int)( rast->buffer_size /
+ ( sizeof ( TCell ) * 8 ) );
+ }
+ else
+ {
+ rast->buffer = NULL;
+ rast->buffer_size = 0;
+ rast->worker = NULL;
+ }
+ }
+ }
+
+
+ FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Raster_New_Func) gray_raster_new,
+ (FT_Raster_Reset_Func) gray_raster_reset,
+ (FT_Raster_Set_Mode_Func)0,
+ (FT_Raster_Render_Func) gray_raster_render,
+ (FT_Raster_Done_Func) gray_raster_done
+ )
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
new file mode 100644
index 0000000000..089db89085
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
@@ -0,0 +1,58 @@
+/***************************************************************************/
+/* */
+/* ftgrays.h */
+/* */
+/* FreeType smooth renderer declaration */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGRAYS_H__
+#define __FTGRAYS_H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+#ifdef _STANDALONE_
+#include "ftimage.h"
+#else
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h" /* for FT_CONFIG_OPTION_PIC */
+#include "../../include/freetype/ftimage.h"
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* To make ftgrays.h independent from configuration files we check */
+ /* whether FT_EXPORT_VAR has been defined already. */
+ /* */
+ /* On some systems and compilers (Win32 mostly), an extra keyword is */
+ /* necessary to compile the library as a DLL. */
+ /* */
+#ifndef FT_EXPORT_VAR
+#define FT_EXPORT_VAR( x ) extern x
+#endif
+
+ FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster;
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* __FTGRAYS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
new file mode 100644
index 0000000000..5f4f82435f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* ftsmerrs.h */
+/* */
+/* smooth renderer error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the smooth renderer error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __FTSMERRS_H__
+#define __FTSMERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX Smooth_Err_
+#define FT_ERR_BASE FT_Mod_Err_Smooth
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __FTSMERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
new file mode 100644
index 0000000000..375b27b3e5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
@@ -0,0 +1,534 @@
+/***************************************************************************/
+/* */
+/* ftsmooth.c */
+/* */
+/* Anti-aliasing renderer interface (body). */
+/* */
+/* Copyright 2000-2006, 2009-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftsmooth.h"
+#include "ftgrays.h"
+#include "ftspic.h"
+
+#include "ftsmerrs.h"
+
+
+ /* initialize renderer -- init its raster */
+ static FT_Error
+ ft_smooth_init( FT_Renderer render )
+ {
+ FT_Library library = FT_MODULE_LIBRARY( render );
+
+
+ render->clazz->raster_class->raster_reset( render->raster,
+ library->raster_pool,
+ library->raster_pool_size );
+
+ return 0;
+ }
+
+
+ /* sets render-specific mode */
+ static FT_Error
+ ft_smooth_set_mode( FT_Renderer render,
+ FT_ULong mode_tag,
+ FT_Pointer data )
+ {
+ /* we simply pass it to the raster */
+ return render->clazz->raster_class->raster_set_mode( render->raster,
+ mode_tag,
+ data );
+ }
+
+ /* transform a given glyph image */
+ static FT_Error
+ ft_smooth_transform( FT_Renderer render,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( matrix )
+ FT_Outline_Transform( &slot->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+ Exit:
+ return error;
+ }
+
+
+ /* return the glyph's control box */
+ static void
+ ft_smooth_get_cbox( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox )
+ {
+ FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+ if ( slot->format == render->glyph_format )
+ FT_Outline_Get_CBox( &slot->outline, cbox );
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_smooth_render_generic( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin,
+ FT_Render_Mode required_mode )
+ {
+ FT_Error error;
+ FT_Outline* outline = NULL;
+ FT_BBox cbox;
+ FT_Pos width, height, pitch;
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_Pos height_org, width_org;
+#endif
+ FT_Bitmap* bitmap = &slot->bitmap;
+ FT_Memory memory = render->root.memory;
+ FT_Int hmul = mode == FT_RENDER_MODE_LCD;
+ FT_Int vmul = mode == FT_RENDER_MODE_LCD_V;
+ FT_Pos x_shift = 0;
+ FT_Pos y_shift = 0;
+ FT_Pos x_left, y_top;
+
+ FT_Raster_Params params;
+
+ FT_Bool have_translated_origin = FALSE;
+ FT_Bool have_outline_shifted = FALSE;
+ FT_Bool have_buffer = FALSE;
+
+
+ /* check glyph image format */
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* check mode */
+ if ( mode != required_mode )
+ {
+ error = FT_THROW( Cannot_Render_Glyph );
+ goto Exit;
+ }
+
+ outline = &slot->outline;
+
+ /* translate the outline to the new origin if needed */
+ if ( origin )
+ {
+ FT_Outline_Translate( outline, origin->x, origin->y );
+ have_translated_origin = TRUE;
+ }
+
+ /* compute the control box, and grid fit it */
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+ cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+
+ if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+ " xMin = %d, xMax = %d\n",
+ cbox.xMin >> 6, cbox.xMax >> 6 ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+ else
+ width = ( cbox.xMax - cbox.xMin ) >> 6;
+
+ if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+ " yMin = %d, yMax = %d\n",
+ cbox.yMin >> 6, cbox.yMax >> 6 ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+ else
+ height = ( cbox.yMax - cbox.yMin ) >> 6;
+
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ width_org = width;
+ height_org = height;
+#endif
+
+ /* release old bitmap buffer */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ /* allocate new one */
+ pitch = width;
+ if ( hmul )
+ {
+ width = width * 3;
+ pitch = FT_PAD_CEIL( width, 4 );
+ }
+
+ if ( vmul )
+ height *= 3;
+
+ x_shift = (FT_Int) cbox.xMin;
+ y_shift = (FT_Int) cbox.yMin;
+ x_left = (FT_Int)( cbox.xMin >> 6 );
+ y_top = (FT_Int)( cbox.yMax >> 6 );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+ if ( slot->library->lcd_filter_func )
+ {
+ FT_Int extra = slot->library->lcd_extra;
+
+
+ if ( hmul )
+ {
+ x_shift -= 64 * ( extra >> 1 );
+ width += 3 * extra;
+ pitch = FT_PAD_CEIL( width, 4 );
+ x_left -= extra >> 1;
+ }
+
+ if ( vmul )
+ {
+ y_shift -= 64 * ( extra >> 1 );
+ height += 3 * extra;
+ y_top += extra >> 1;
+ }
+ }
+
+#endif
+
+#if FT_UINT_MAX > 0xFFFFU
+
+ /* Required check is (pitch * height < FT_ULONG_MAX), */
+ /* but we care realistic cases only. Always pitch <= width. */
+ if ( width > 0x7FFF || height > 0x7FFF )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
+ width, height ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+
+#endif
+
+ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+ bitmap->num_grays = 256;
+ bitmap->width = width;
+ bitmap->rows = height;
+ bitmap->pitch = pitch;
+
+ /* translate outline to render it into the bitmap */
+ FT_Outline_Translate( outline, -x_shift, -y_shift );
+ have_outline_shifted = TRUE;
+
+ if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
+ goto Exit;
+ else
+ have_buffer = TRUE;
+
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ /* set up parameters */
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+ /* implode outline if needed */
+ {
+ FT_Vector* points = outline->points;
+ FT_Vector* points_end = points + outline->n_points;
+ FT_Vector* vec;
+
+
+ if ( hmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->x *= 3;
+
+ if ( vmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->y *= 3;
+ }
+
+ /* render outline into the bitmap */
+ error = render->raster_render( render->raster, &params );
+
+ /* deflate outline if needed */
+ {
+ FT_Vector* points = outline->points;
+ FT_Vector* points_end = points + outline->n_points;
+ FT_Vector* vec;
+
+
+ if ( hmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->x /= 3;
+
+ if ( vmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->y /= 3;
+ }
+
+ if ( error )
+ goto Exit;
+
+ if ( slot->library->lcd_filter_func )
+ slot->library->lcd_filter_func( bitmap, mode, slot->library );
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ /* render outline into bitmap */
+ error = render->raster_render( render->raster, &params );
+ if ( error )
+ goto Exit;
+
+ /* expand it horizontally */
+ if ( hmul )
+ {
+ FT_Byte* line = bitmap->buffer;
+ FT_UInt hh;
+
+
+ for ( hh = height_org; hh > 0; hh--, line += pitch )
+ {
+ FT_UInt xx;
+ FT_Byte* end = line + width;
+
+
+ for ( xx = width_org; xx > 0; xx-- )
+ {
+ FT_UInt pixel = line[xx-1];
+
+
+ end[-3] = (FT_Byte)pixel;
+ end[-2] = (FT_Byte)pixel;
+ end[-1] = (FT_Byte)pixel;
+ end -= 3;
+ }
+ }
+ }
+
+ /* expand it vertically */
+ if ( vmul )
+ {
+ FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch;
+ FT_Byte* write = bitmap->buffer;
+ FT_UInt hh;
+
+
+ for ( hh = height_org; hh > 0; hh-- )
+ {
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+ read += pitch;
+ }
+ }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ /*
+ * XXX: on 16bit system, we return an error for huge bitmap
+ * to prevent an overflow.
+ */
+ if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
+ {
+ error = FT_THROW( Invalid_Pixel_Size );
+ goto Exit;
+ }
+
+ slot->format = FT_GLYPH_FORMAT_BITMAP;
+ slot->bitmap_left = (FT_Int)x_left;
+ slot->bitmap_top = (FT_Int)y_top;
+
+ /* everything is fine; don't deallocate buffer */
+ have_buffer = FALSE;
+
+ error = FT_Err_Ok;
+
+ Exit:
+ if ( have_outline_shifted )
+ FT_Outline_Translate( outline, x_shift, y_shift );
+ if ( have_translated_origin )
+ FT_Outline_Translate( outline, -origin->x, -origin->y );
+ if ( have_buffer )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ return error;
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_smooth_render( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ if ( mode == FT_RENDER_MODE_LIGHT )
+ mode = FT_RENDER_MODE_NORMAL;
+
+ return ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_NORMAL );
+ }
+
+
+ /* convert a slot's glyph image into a horizontal LCD bitmap */
+ static FT_Error
+ ft_smooth_render_lcd( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+
+ error = ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_LCD );
+ if ( !error )
+ slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
+
+ return error;
+ }
+
+
+ /* convert a slot's glyph image into a vertical LCD bitmap */
+ static FT_Error
+ ft_smooth_render_lcd_v( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+
+ error = ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_LCD_V );
+ if ( !error )
+ slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
+
+ return error;
+ }
+
+
+ FT_DEFINE_RENDERER( ft_smooth_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+
+ FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth-lcd",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render_lcd,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+ FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth-lcdv",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
new file mode 100644
index 0000000000..775b82d101
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
@@ -0,0 +1,49 @@
+/***************************************************************************/
+/* */
+/* ftsmooth.h */
+/* */
+/* Anti-aliasing renderer interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSMOOTH_H__
+#define __FTSMOOTH_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
+ FT_DECLARE_RENDERER( ft_std_renderer_class )
+#endif
+
+#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
+ FT_DECLARE_RENDERER( ft_smooth_renderer_class )
+
+ FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
+
+ FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
+#endif
+
+
+
+FT_END_HEADER
+
+#endif /* __FTSMOOTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
new file mode 100644
index 0000000000..42b9373bc3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
@@ -0,0 +1,118 @@
+/***************************************************************************/
+/* */
+/* ftspic.c */
+/* */
+/* The FreeType position independent code services for smooth module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ftspic.h"
+#include "ftsmerrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftgrays.c */
+ void
+ FT_Init_Class_ft_grays_raster( FT_Raster_Funcs* funcs );
+
+
+ void
+ ft_smooth_renderer_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->smooth )
+ {
+ SmoothPIC* container = (SmoothPIC*)pic_container->smooth;
+
+
+ if ( --container->ref_count )
+ return;
+
+ FT_FREE( container );
+ pic_container->smooth = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_smooth_renderer_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ SmoothPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* since this function also serve smooth_lcd and smooth_lcdv renderers,
+ it implements reference counting */
+ if ( pic_container->smooth )
+ {
+ ((SmoothPIC*)pic_container->smooth)->ref_count++;
+ return error;
+ }
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->smooth = container;
+
+ container->ref_count = 1;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
+
+ return error;
+ }
+
+
+ /* re-route these init and free functions to the above functions */
+ FT_Error
+ ft_smooth_lcd_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_smooth_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_smooth_lcd_renderer_class_pic_free( FT_Library library )
+ {
+ ft_smooth_renderer_class_pic_free( library );
+ }
+
+
+ FT_Error
+ ft_smooth_lcdv_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_smooth_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_smooth_lcdv_renderer_class_pic_free( FT_Library library )
+ {
+ ft_smooth_renderer_class_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
new file mode 100644
index 0000000000..5533967429
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/* */
+/* ftspic.h */
+/* */
+/* The FreeType position independent code services for smooth module. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSPIC_H__
+#define __FTSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_GRAYS_RASTER_GET ft_grays_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ typedef struct SmoothPIC_
+ {
+ int ref_count;
+ FT_Raster_Funcs ft_grays_raster;
+
+ } SmoothPIC;
+
+
+#define GET_PIC( lib ) \
+ ( (SmoothPIC*)( (lib)->pic_container.smooth ) )
+#define FT_GRAYS_RASTER_GET ( GET_PIC( library )->ft_grays_raster )
+
+
+ /* see ftspic.c for the implementation */
+ void
+ ft_smooth_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_smooth_lcd_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_smooth_lcdv_renderer_class_pic_free( FT_Library library );
+
+ FT_Error
+ ft_smooth_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_smooth_lcd_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_smooth_lcdv_renderer_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
new file mode 100644
index 0000000000..ad047ddc0a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
@@ -0,0 +1,31 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* smooth.c */
+/* */
+/* FreeType anti-aliasing rasterer module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ftspic.c"
+#include "ftgrays.c"
+#include "ftsmooth.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
new file mode 100644
index 0000000000..47f6c04076
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
@@ -0,0 +1,27 @@
+#
+# FreeType 2 smooth renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SMOOTH_RENDERER
+
+define SMOOTH_RENDERER
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
new file mode 100644
index 0000000000..88d0aa53ac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 smooth renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# smooth driver directory
+#
+SMOOTH_DIR := $(SRC_DIR)/smooth
+
+# compilation flags for the driver
+#
+SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR))
+
+
+# smooth driver sources (i.e., C files)
+#
+SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \
+ $(SMOOTH_DIR)/ftsmooth.c \
+ $(SMOOTH_DIR)/ftspic.c
+
+
+# smooth driver headers
+#
+SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \
+ $(SMOOTH_DIR)/ftsmerrs.h
+
+
+# smooth driver object(s)
+#
+# SMOOTH_DRV_OBJ_M is used during `multi' builds.
+# SMOOTH_DRV_OBJ_S is used during `single' builds.
+#
+SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O
+
+# smooth driver source file for single build
+#
+SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c
+
+
+# smooth driver - single object
+#
+$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \
+ $(FREETYPE_H) $(SMOOTH_DRV_H)
+ $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S))
+
+
+# smooth driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H)
+ $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S)
+DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
new file mode 100644
index 0000000000..a8cccfe137
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/truetype Jamfile
+#
+# Copyright 2001, 2004 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) truetype ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;
+ }
+ else
+ {
+ _sources = truetype ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/truetype Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
new file mode 100644
index 0000000000..5c793a4238
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
@@ -0,0 +1,42 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* truetype.c */
+/* */
+/* FreeType TrueType driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2004, 2006, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ttpic.c"
+#include "ttdriver.c" /* driver interface */
+#include "ttpload.c" /* tables loader */
+#include "ttgload.c" /* glyph loader */
+#include "ttobjs.c" /* object manager */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.c"
+#include "ttsubpix.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.c" /* gx distortable font */
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
new file mode 100644
index 0000000000..baee81a773
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 TrueType module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TRUETYPE_DRIVER
+
+define TRUETYPE_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
new file mode 100644
index 0000000000..d4b69f578b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
@@ -0,0 +1,74 @@
+#
+# FreeType 2 TrueType driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003-2004, 2011-2012 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# TrueType driver directory
+#
+TT_DIR := $(SRC_DIR)/truetype
+
+
+# compilation flags for the driver
+#
+TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR))
+
+
+# TrueType driver sources (i.e., C files)
+#
+TT_DRV_SRC := $(TT_DIR)/ttdriver.c \
+ $(TT_DIR)/ttgload.c \
+ $(TT_DIR)/ttgxvar.c \
+ $(TT_DIR)/ttinterp.c \
+ $(TT_DIR)/ttobjs.c \
+ $(TT_DIR)/ttpic.c \
+ $(TT_DIR)/ttpload.c \
+ $(TT_DIR)/ttsubpix.c
+
+# TrueType driver headers
+#
+TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \
+ $(TT_DIR)/tterrors.h
+
+
+# TrueType driver object(s)
+#
+# TT_DRV_OBJ_M is used during `multi' builds
+# TT_DRV_OBJ_S is used during `single' builds
+#
+TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O
+
+# TrueType driver source file for single build
+#
+TT_DRV_SRC_S := $(TT_DIR)/truetype.c
+
+
+# TrueType driver - single object
+#
+$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H)
+ $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S))
+
+
+# driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H)
+ $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(TT_DRV_OBJ_S)
+DRV_OBJS_M += $(TT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
new file mode 100644
index 0000000000..4576ad9b74
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
@@ -0,0 +1,572 @@
+/***************************************************************************/
+/* */
+/* ttdriver.c */
+/* */
+/* TrueType font driver implementation (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svtteng.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttdriver.h"
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+#include "ttpic.h"
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttdriver
+
+
+ /*
+ * PROPERTY SERVICE
+ *
+ */
+ static FT_Error
+ tt_property_set( FT_Module module, /* TT_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ TT_Driver driver = (TT_Driver)module;
+
+
+ if ( !ft_strcmp( property_name, "interpreter-version" ) )
+ {
+ FT_UInt* interpreter_version = (FT_UInt*)value;
+
+
+#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )
+ error = FT_ERR( Unimplemented_Feature );
+ else
+#endif
+ driver->interpreter_version = *interpreter_version;
+
+ return error;
+ }
+
+ FT_TRACE0(( "tt_property_set: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ static FT_Error
+ tt_property_get( FT_Module module, /* TT_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ TT_Driver driver = (TT_Driver)module;
+
+ FT_UInt interpreter_version = driver->interpreter_version;
+
+
+ if ( !ft_strcmp( property_name, "interpreter-version" ) )
+ {
+ FT_UInt* val = (FT_UInt*)value;
+
+
+ *val = interpreter_version;
+
+ return error;
+ }
+
+ FT_TRACE0(( "tt_property_get: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ FT_DEFINE_SERVICE_PROPERTIESREC(
+ tt_service_properties,
+ (FT_Properties_SetFunc)tt_property_set,
+ (FT_Properties_GetFunc)tt_property_get )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#undef PAIR_TAG
+#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \
+ (FT_ULong)right )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_get_kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings, are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ static FT_Error
+ tt_get_kerning( FT_Face ttface, /* TT_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ TT_Face face = (TT_Face)ttface;
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( sfnt )
+ kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+ return 0;
+ }
+
+
+#undef PAIR_TAG
+
+
+ static FT_Error
+ tt_get_advances( FT_Face ttface,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed *advances )
+ {
+ FT_UInt nn;
+ TT_Face face = (TT_Face) ttface;
+
+
+ /* XXX: TODO: check for sbits */
+
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_Short tsb;
+ FT_UShort ah;
+
+
+ TT_Get_VMetrics( face, start + nn, &tsb, &ah );
+ advances[nn] = ah;
+ }
+ }
+ else
+ {
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_Short lsb;
+ FT_UShort aw;
+
+
+ TT_Get_HMetrics( face, start + nn, &lsb, &aw );
+ advances[nn] = aw;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** S I Z E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ static FT_Error
+ tt_size_select( FT_Size size,
+ FT_ULong strike_index )
+ {
+ TT_Face ttface = (TT_Face)size->face;
+ TT_Size ttsize = (TT_Size)size;
+ FT_Error error = FT_Err_Ok;
+
+
+ ttsize->strike_index = strike_index;
+
+ if ( FT_IS_SCALABLE( size->face ) )
+ {
+ /* use the scaled metrics, even when tt_size_reset fails */
+ FT_Select_Metrics( size->face, strike_index );
+
+ tt_size_reset( ttsize );
+ }
+ else
+ {
+ SFNT_Service sfnt = (SFNT_Service) ttface->sfnt;
+ FT_Size_Metrics* metrics = &size->metrics;
+
+
+ error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
+ if ( error )
+ ttsize->strike_index = 0xFFFFFFFFUL;
+ }
+
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ static FT_Error
+ tt_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ TT_Size ttsize = (TT_Size)size;
+ FT_Error error = FT_Err_Ok;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ if ( FT_HAS_FIXED_SIZES( size->face ) )
+ {
+ TT_Face ttface = (TT_Face)size->face;
+ SFNT_Service sfnt = (SFNT_Service) ttface->sfnt;
+ FT_ULong strike_index;
+
+
+ error = sfnt->set_sbit_strike( ttface, req, &strike_index );
+
+ if ( error )
+ ttsize->strike_index = 0xFFFFFFFFUL;
+ else
+ return tt_size_select( size, strike_index );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ FT_Request_Metrics( size->face, req );
+
+ if ( FT_IS_SCALABLE( size->face ) )
+ {
+ error = tt_size_reset( ttsize );
+ ttsize->root.metrics = ttsize->metrics;
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyph_load */
+ /* */
+ /* <Description> */
+ /* A driver method used to load a glyph within a given glyph slot. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled, loaded, etc. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */
+ FT_Size ttsize, /* TT_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ TT_GlyphSlot slot = (TT_GlyphSlot)ttslot;
+ TT_Size size = (TT_Size)ttsize;
+ FT_Face face = ttslot->face;
+ FT_Error error;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ if ( !size )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_index >= (FT_UInt)face->num_glyphs &&
+ !face->internal->incremental_interface )
+#else
+ if ( glyph_index >= (FT_UInt)face->num_glyphs )
+#endif
+ return FT_THROW( Invalid_Argument );
+
+ if ( load_flags & FT_LOAD_NO_HINTING )
+ {
+ /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */
+ /* are necessary to disable hinting for tricky fonts */
+
+ if ( FT_IS_TRICKY( face ) )
+ load_flags &= ~FT_LOAD_NO_HINTING;
+
+ if ( load_flags & FT_LOAD_NO_AUTOHINT )
+ load_flags |= FT_LOAD_NO_HINTING;
+ }
+
+ if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
+ {
+ load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
+
+ if ( !FT_IS_TRICKY( face ) )
+ load_flags |= FT_LOAD_NO_HINTING;
+ }
+
+ /* now load the glyph outline if necessary */
+ error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
+
+ /* force drop-out mode to 2 - irrelevant now */
+ /* slot->outline.dropout_mode = 2; */
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** D R I V E R I N T E R F A C E ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_DEFINE_SERVICE_MULTIMASTERSREC(
+ tt_service_gx_multi_masters,
+ (FT_Get_MM_Func) NULL,
+ (FT_Set_MM_Design_Func) NULL,
+ (FT_Set_MM_Blend_Func) TT_Set_MM_Blend,
+ (FT_Get_MM_Var_Func) TT_Get_MM_Var,
+ (FT_Set_Var_Design_Func)TT_Set_Var_Design )
+#endif
+
+ static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine =
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
+#else
+ FT_TRUETYPE_ENGINE_TYPE_PATENTED
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_TRUETYPE_ENGINE_TYPE_NONE
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+ };
+
+ FT_DEFINE_SERVICE_TTGLYFREC(
+ tt_service_truetype_glyf,
+ (TT_Glyf_GetLocationFunc)tt_face_get_location )
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_DEFINE_SERVICEDESCREC5(
+ tt_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE,
+ FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET,
+ FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+ FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET,
+ FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET )
+#else
+ FT_DEFINE_SERVICEDESCREC4(
+ tt_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE,
+ FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+ FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET,
+ FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ tt_get_interface( FT_Module driver, /* TT_Driver */
+ const char* tt_interface )
+ {
+ FT_Library library;
+ FT_Module_Interface result;
+ FT_Module sfntd;
+ SFNT_Service sfnt;
+
+
+ /* TT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
+ if ( result != NULL )
+ return result;
+
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ /* only return the default interface from the SFNT module */
+ sfntd = FT_Get_Module( library, "sfnt" );
+ if ( sfntd )
+ {
+ sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
+ if ( sfnt )
+ return sfnt->get_interface( driver, tt_interface );
+ }
+
+ return 0;
+ }
+
+
+ /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER
+#else
+#define TT_HINTER_FLAG 0
+#endif
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define TT_SIZE_SELECT tt_size_select
+#else
+#define TT_SIZE_SELECT 0
+#endif
+
+ FT_DEFINE_DRIVER(
+ tt_driver_class,
+
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ TT_HINTER_FLAG,
+
+ sizeof ( TT_DriverRec ),
+
+ "truetype_xyq", /* driver name */
+ 0x10000L, /* driver version == 1.0 */
+ 0x20000L, /* driver requires FreeType 2.0 or above */
+
+ (void*)0, /* driver specific interface */
+
+ tt_driver_init,
+ tt_driver_done,
+ tt_get_interface,
+
+ sizeof ( TT_FaceRec ),
+ sizeof ( TT_SizeRec ),
+ sizeof ( FT_GlyphSlotRec ),
+
+ tt_face_init,
+ tt_face_done,
+ tt_size_init,
+ tt_size_done,
+ tt_slot_init,
+ 0, /* FT_Slot_DoneFunc */
+
+ tt_glyph_load,
+
+ tt_get_kerning,
+ 0, /* FT_Face_AttachFunc */
+ tt_get_advances,
+
+ tt_size_request,
+ TT_SIZE_SELECT
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
new file mode 100644
index 0000000000..80802c1de0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* ttdriver.h */
+/* */
+/* High-level TrueType driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTDRIVER_H__
+#define __TTDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_DRIVER( tt_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __TTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
new file mode 100644
index 0000000000..b6aaa9f53b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* tterrors.h */
+/* */
+/* TrueType error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the TrueType error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __TTERRORS_H__
+#define __TTERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX TT_Err_
+#define FT_ERR_BASE FT_Mod_Err_TrueType
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __TTERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
new file mode 100644
index 0000000000..c32419b77d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
@@ -0,0 +1,2337 @@
+/***************************************************************************/
+/* */
+/* ttgload.c */
+/* */
+/* TrueType Glyph Loader (body). */
+/* */
+/* Copyright 1996-2013 */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttgload
+
+
+ /*************************************************************************/
+ /* */
+ /* Composite glyph flags. */
+ /* */
+#define ARGS_ARE_WORDS 0x0001
+#define ARGS_ARE_XY_VALUES 0x0002
+#define ROUND_XY_TO_GRID 0x0004
+#define WE_HAVE_A_SCALE 0x0008
+/* reserved 0x0010 */
+#define MORE_COMPONENTS 0x0020
+#define WE_HAVE_AN_XY_SCALE 0x0040
+#define WE_HAVE_A_2X2 0x0080
+#define WE_HAVE_INSTR 0x0100
+#define USE_MY_METRICS 0x0200
+#define OVERLAP_COMPOUND 0x0400
+#define SCALED_COMPONENT_OFFSET 0x0800
+#define UNSCALED_COMPONENT_OFFSET 0x1000
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the horizontal metrics in font units for a given glyph. */
+ /* */
+ FT_LOCAL_DEF( void )
+ TT_Get_HMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* lsb,
+ FT_UShort* aw )
+ {
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
+
+ FT_TRACE5(( " advance width (font units): %d\n", *aw ));
+ FT_TRACE5(( " left side bearing (font units): %d\n", *lsb ));
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the vertical metrics in font units for a given glyph. */
+ /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */
+ /* table, typoAscender/Descender from the `OS/2' table would be used */
+ /* instead, and if there were no `OS/2' table, use ascender/descender */
+ /* from the `hhea' table. But that is not what Microsoft's rasterizer */
+ /* apparently does: It uses the ppem value as the advance height, and */
+ /* sets the top side bearing to be zero. */
+ /* */
+ FT_LOCAL_DEF( void )
+ TT_Get_VMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* tsb,
+ FT_UShort* ah )
+ {
+ if ( face->vertical_info )
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
+
+#if 1 /* Empirically determined, at variance with what MS said */
+
+ else
+ {
+ *tsb = 0;
+ *ah = face->root.units_per_EM;
+ }
+
+#else /* This is what MS said to do. It isn't what they do, however. */
+
+ else if ( face->os2.version != 0xFFFFU )
+ {
+ *tsb = face->os2.sTypoAscender;
+ *ah = face->os2.sTypoAscender - face->os2.sTypoDescender;
+ }
+ else
+ {
+ *tsb = face->horizontal.Ascender;
+ *ah = face->horizontal.Ascender - face->horizontal.Descender;
+ }
+
+#endif
+
+ FT_TRACE5(( " advance height (font units): %d\n", *ah ));
+ FT_TRACE5(( " top side bearing (font units): %d\n", *tsb ));
+ }
+
+
+ static void
+ tt_get_metrics( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ FT_Short left_bearing = 0, top_bearing = 0;
+ FT_UShort advance_width = 0, advance_height = 0;
+
+
+ TT_Get_HMetrics( face, glyph_index,
+ &left_bearing,
+ &advance_width );
+ TT_Get_VMetrics( face, glyph_index,
+ &top_bearing,
+ &advance_height );
+
+ loader->left_bearing = left_bearing;
+ loader->advance = advance_width;
+ loader->top_bearing = top_bearing;
+ loader->vadvance = advance_height;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ if ( loader->exec )
+ loader->exec->sph_tweak_flags = 0;
+
+ /* this may not be the right place for this, but it works */
+ if ( loader->exec && loader->exec->ignore_x_mode )
+ sph_set_tweaks( loader, glyph_index );
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( !loader->linear_def )
+ {
+ loader->linear_def = 1;
+ loader->linear = advance_width;
+ }
+ }
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ static void
+ tt_get_metrics_incr_overrides( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+
+ FT_Short left_bearing = 0, top_bearing = 0;
+ FT_UShort advance_width = 0, advance_height = 0;
+
+
+ /* If this is an incrementally loaded font check whether there are */
+ /* overriding metrics for this glyph. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+ FT_Error error;
+
+
+ metrics.bearing_x = loader->left_bearing;
+ metrics.bearing_y = 0;
+ metrics.advance = loader->advance;
+ metrics.advance_v = 0;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, FALSE, &metrics );
+ if ( error )
+ goto Exit;
+
+ left_bearing = (FT_Short)metrics.bearing_x;
+ advance_width = (FT_UShort)metrics.advance;
+
+#if 0
+
+ /* GWW: Do I do the same for vertical metrics? */
+ metrics.bearing_x = 0;
+ metrics.bearing_y = loader->top_bearing;
+ metrics.advance = loader->vadvance;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, TRUE, &metrics );
+ if ( error )
+ goto Exit;
+
+ top_bearing = (FT_Short)metrics.bearing_y;
+ advance_height = (FT_UShort)metrics.advance;
+
+#endif /* 0 */
+
+ loader->left_bearing = left_bearing;
+ loader->advance = advance_width;
+ loader->top_bearing = top_bearing;
+ loader->vadvance = advance_height;
+
+ if ( !loader->linear_def )
+ {
+ loader->linear_def = 1;
+ loader->linear = advance_width;
+ }
+ }
+
+ Exit:
+ return;
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+
+ /*************************************************************************/
+ /* */
+ /* Translates an array of coordinates. */
+ /* */
+ static void
+ translate_array( FT_UInt n,
+ FT_Vector* coords,
+ FT_Pos delta_x,
+ FT_Pos delta_y )
+ {
+ FT_UInt k;
+
+
+ if ( delta_x )
+ for ( k = 0; k < n; k++ )
+ coords[k].x += delta_x;
+
+ if ( delta_y )
+ for ( k = 0; k < n; k++ )
+ coords[k].y += delta_y;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions are used by default with TrueType fonts. */
+ /* However, they can be replaced by alternatives if we need to support */
+ /* TrueType-compressed formats (like MicroType) in the future. */
+ /* */
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Access_Glyph_Frame( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_ULong offset,
+ FT_UInt byte_count )
+ {
+ FT_Error error;
+ FT_Stream stream = loader->stream;
+
+ /* for non-debug mode */
+ FT_UNUSED( glyph_index );
+
+
+ FT_TRACE4(( "Glyph %ld\n", glyph_index ));
+
+ /* the following line sets the `error' variable through macros! */
+ if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
+ return error;
+
+ loader->cursor = stream->cursor;
+ loader->limit = stream->limit;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ TT_Forget_Glyph_Frame( TT_Loader loader )
+ {
+ FT_Stream stream = loader->stream;
+
+
+ FT_FRAME_EXIT();
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Glyph_Header( TT_Loader loader )
+ {
+ FT_Byte* p = loader->cursor;
+ FT_Byte* limit = loader->limit;
+
+
+ if ( p + 10 > limit )
+ return FT_THROW( Invalid_Outline );
+
+ loader->n_contours = FT_NEXT_SHORT( p );
+
+ loader->bbox.xMin = FT_NEXT_SHORT( p );
+ loader->bbox.yMin = FT_NEXT_SHORT( p );
+ loader->bbox.xMax = FT_NEXT_SHORT( p );
+ loader->bbox.yMax = FT_NEXT_SHORT( p );
+
+ FT_TRACE5(( " # of contours: %d\n", loader->n_contours ));
+ FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin,
+ loader->bbox.xMax ));
+ FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin,
+ loader->bbox.yMax ));
+ loader->cursor = p;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Simple_Glyph( TT_Loader load )
+ {
+ FT_Error error;
+ FT_Byte* p = load->cursor;
+ FT_Byte* limit = load->limit;
+ FT_GlyphLoader gloader = load->gloader;
+ FT_Int n_contours = load->n_contours;
+ FT_Outline* outline;
+ TT_Face face = (TT_Face)load->face;
+ FT_UShort n_ins;
+ FT_Int n_points;
+
+ FT_Byte *flag, *flag_limit;
+ FT_Byte c, count;
+ FT_Vector *vec, *vec_limit;
+ FT_Pos x;
+ FT_Short *cont, *cont_limit, prev_cont;
+ FT_Int xy_size = 0;
+
+
+ /* check that we can add the contours to the glyph */
+ error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
+ if ( error )
+ goto Fail;
+
+ /* reading the contours' endpoints & number of points */
+ cont = gloader->current.outline.contours;
+ cont_limit = cont + n_contours;
+
+ /* check space for contours array + instructions count */
+ if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
+ goto Invalid_Outline;
+
+ prev_cont = FT_NEXT_SHORT( p );
+
+ if ( n_contours > 0 )
+ cont[0] = prev_cont;
+
+ if ( prev_cont < 0 )
+ goto Invalid_Outline;
+
+ for ( cont++; cont < cont_limit; cont++ )
+ {
+ cont[0] = FT_NEXT_SHORT( p );
+ if ( cont[0] <= prev_cont )
+ {
+ /* unordered contours: this is invalid */
+ goto Invalid_Outline;
+ }
+ prev_cont = cont[0];
+ }
+
+ n_points = 0;
+ if ( n_contours > 0 )
+ {
+ n_points = cont[-1] + 1;
+ if ( n_points < 0 )
+ goto Invalid_Outline;
+ }
+
+ /* note that we will add four phantom points later */
+ error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
+ if ( error )
+ goto Fail;
+
+ /* reading the bytecode instructions */
+ load->glyph->control_len = 0;
+ load->glyph->control_data = 0;
+
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ n_ins = FT_NEXT_USHORT( p );
+
+ FT_TRACE5(( " Instructions size: %u\n", n_ins ));
+
+ if ( n_ins > face->max_profile.maxSizeOfInstructions )
+ {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
+ n_ins ));
+ error = FT_THROW( Too_Many_Hints );
+ goto Fail;
+ }
+
+ if ( ( limit - p ) < n_ins )
+ {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
+ error = FT_THROW( Too_Many_Hints );
+ goto Fail;
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( IS_HINTED( load->load_flags ) )
+ {
+ load->glyph->control_len = n_ins;
+ load->glyph->control_data = load->exec->glyphIns;
+
+ FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ p += n_ins;
+
+ outline = &gloader->current.outline;
+ if (outline->tags == NULL) {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: Outline->tags = NULL!\n" ));
+ goto Invalid_Outline;
+ }
+
+ /* reading the point tags */
+ flag = (FT_Byte*)outline->tags;
+ flag_limit = flag + n_points;
+
+ //FT_ASSERT( flag != NULL );
+
+ while ( flag < flag_limit )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ *flag++ = c = FT_NEXT_BYTE( p );
+ if ( c & 8 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ count = FT_NEXT_BYTE( p );
+ if ( flag + (FT_Int)count > flag_limit )
+ goto Invalid_Outline;
+
+ for ( ; count > 0; count-- )
+ *flag++ = c;
+ }
+ }
+
+ /* reading the X coordinates */
+
+ vec = outline->points;
+ vec_limit = vec + n_points;
+ flag = (FT_Byte*)outline->tags;
+ x = 0;
+
+ if ( p + xy_size > limit )
+ goto Invalid_Outline;
+
+ for ( ; vec < vec_limit; vec++, flag++ )
+ {
+ FT_Pos y = 0;
+ FT_Byte f = *flag;
+
+
+ if ( f & 2 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_BYTE( p );
+ if ( ( f & 16 ) == 0 )
+ y = -y;
+ }
+ else if ( ( f & 16 ) == 0 )
+ {
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_SHORT( p );
+ }
+
+ x += y;
+ vec->x = x;
+ /* the cast is for stupid compilers */
+ *flag = (FT_Byte)( f & ~( 2 | 16 ) );
+ }
+
+ /* reading the Y coordinates */
+
+ vec = gloader->current.outline.points;
+ vec_limit = vec + n_points;
+ flag = (FT_Byte*)outline->tags;
+ x = 0;
+
+ for ( ; vec < vec_limit; vec++, flag++ )
+ {
+ FT_Pos y = 0;
+ FT_Byte f = *flag;
+
+
+ if ( f & 4 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_BYTE( p );
+ if ( ( f & 32 ) == 0 )
+ y = -y;
+ }
+ else if ( ( f & 32 ) == 0 )
+ {
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_SHORT( p );
+ }
+
+ x += y;
+ vec->y = x;
+ /* the cast is for stupid compilers */
+ *flag = (FT_Byte)( f & FT_CURVE_TAG_ON );
+ }
+
+ outline->n_points = (FT_UShort)n_points;
+ outline->n_contours = (FT_Short) n_contours;
+
+ load->cursor = p;
+
+ Fail:
+ return error;
+
+ Invalid_Outline:
+ error = FT_THROW( Invalid_Outline );
+ goto Fail;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Composite_Glyph( TT_Loader loader )
+ {
+ FT_Error error;
+ FT_Byte* p = loader->cursor;
+ FT_Byte* limit = loader->limit;
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_SubGlyph subglyph;
+ FT_UInt num_subglyphs;
+
+
+ num_subglyphs = 0;
+
+ do
+ {
+ FT_Fixed xx, xy, yy, yx;
+ FT_UInt count;
+
+
+ /* check that we can load a new subglyph */
+ error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
+ if ( error )
+ goto Fail;
+
+ /* check space */
+ if ( p + 4 > limit )
+ goto Invalid_Composite;
+
+ subglyph = gloader->current.subglyphs + num_subglyphs;
+
+ subglyph->arg1 = subglyph->arg2 = 0;
+
+ subglyph->flags = FT_NEXT_USHORT( p );
+ subglyph->index = FT_NEXT_USHORT( p );
+
+ /* check space */
+ count = 2;
+ if ( subglyph->flags & ARGS_ARE_WORDS )
+ count += 2;
+ if ( subglyph->flags & WE_HAVE_A_SCALE )
+ count += 2;
+ else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+ count += 4;
+ else if ( subglyph->flags & WE_HAVE_A_2X2 )
+ count += 8;
+
+ if ( p + count > limit )
+ goto Invalid_Composite;
+
+ /* read arguments */
+ if ( subglyph->flags & ARGS_ARE_WORDS )
+ {
+ subglyph->arg1 = FT_NEXT_SHORT( p );
+ subglyph->arg2 = FT_NEXT_SHORT( p );
+ }
+ else
+ {
+ subglyph->arg1 = FT_NEXT_CHAR( p );
+ subglyph->arg2 = FT_NEXT_CHAR( p );
+ }
+
+ /* read transform */
+ xx = yy = 0x10000L;
+ xy = yx = 0;
+
+ if ( subglyph->flags & WE_HAVE_A_SCALE )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = xx;
+ }
+ else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ }
+ else if ( subglyph->flags & WE_HAVE_A_2X2 )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ }
+
+ subglyph->transform.xx = xx;
+ subglyph->transform.xy = xy;
+ subglyph->transform.yx = yx;
+ subglyph->transform.yy = yy;
+
+ num_subglyphs++;
+
+ } while ( subglyph->flags & MORE_COMPONENTS );
+
+ gloader->current.num_subglyphs = num_subglyphs;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ {
+ FT_Stream stream = loader->stream;
+
+
+ /* we must undo the FT_FRAME_ENTER in order to point */
+ /* to the composite instructions, if we find some. */
+ /* We will process them later. */
+ /* */
+ loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
+ p - limit );
+ }
+
+#endif
+
+ loader->cursor = p;
+
+ Fail:
+ return error;
+
+ Invalid_Composite:
+ error = FT_THROW( Invalid_Composite );
+ goto Fail;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ TT_Init_Glyph_Loading( TT_Face face )
+ {
+ face->access_glyph_frame = TT_Access_Glyph_Frame;
+ face->read_glyph_header = TT_Load_Glyph_Header;
+ face->read_simple_glyph = TT_Load_Simple_Glyph;
+ face->read_composite_glyph = TT_Load_Composite_Glyph;
+ face->forget_glyph_frame = TT_Forget_Glyph_Frame;
+ }
+
+
+ static void
+ tt_prepare_zone( TT_GlyphZone zone,
+ FT_GlyphLoad load,
+ FT_UInt start_point,
+ FT_UInt start_contour )
+ {
+ zone->n_points = (FT_UShort)( load->outline.n_points - start_point );
+ zone->n_contours = (FT_Short) ( load->outline.n_contours -
+ start_contour );
+ zone->org = load->extra_points + start_point;
+ zone->cur = load->outline.points + start_point;
+ zone->orus = load->extra_points2 + start_point;
+ zone->tags = (FT_Byte*)load->outline.tags + start_point;
+ zone->contours = (FT_UShort*)load->outline.contours + start_contour;
+ zone->first_point = (FT_UShort)start_point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Hint_Glyph */
+ /* */
+ /* <Description> */
+ /* Hint the glyph using the zone prepared by the caller. Note that */
+ /* the zone is supposed to include four phantom points. */
+ /* */
+ static FT_Error
+ TT_Hint_Glyph( TT_Loader loader,
+ FT_Bool is_composite )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Face face = (TT_Face)loader->face;
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ TT_GlyphZone zone = &loader->zone;
+ FT_Pos origin;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_UInt n_ins;
+#else
+ FT_UNUSED( is_composite );
+#endif
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ if ( loader->glyph->control_len > 0xFFFFL )
+ {
+ FT_TRACE1(( "TT_Hint_Glyph: too long instructions " ));
+ FT_TRACE1(( "(0x%lx byte) is truncated\n",
+ loader->glyph->control_len ));
+ }
+ n_ins = (FT_UInt)( loader->glyph->control_len );
+#endif
+
+ origin = zone->cur[zone->n_points - 4].x;
+ origin = FT_PIX_ROUND( origin ) - origin;
+ if ( origin )
+ translate_array( zone->n_points, zone->cur, origin, 0 );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ /* save original point position in org */
+ if ( n_ins > 0 )
+ FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
+
+ /* Reset graphics state. */
+ loader->exec->GS = ((TT_Size)loader->size)->GS;
+
+ /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
+ /* completely refer to the (already) hinted subglyphs. */
+ if ( is_composite )
+ {
+ loader->exec->metrics.x_scale = 1 << 16;
+ loader->exec->metrics.y_scale = 1 << 16;
+
+ FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
+ }
+ else
+ {
+ loader->exec->metrics.x_scale =
+ ((TT_Size)loader->size)->metrics.x_scale;
+ loader->exec->metrics.y_scale =
+ ((TT_Size)loader->size)->metrics.y_scale;
+ }
+#endif
+
+ /* round pp2 and pp4 */
+ zone->cur[zone->n_points - 3].x =
+ FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
+ zone->cur[zone->n_points - 1].y =
+ FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( n_ins > 0 )
+ {
+ FT_Bool debug;
+ FT_Error error;
+
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Outline current_outline = gloader->current.outline;
+
+
+ error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
+ loader->exec->glyphIns, n_ins );
+ if ( error )
+ return error;
+
+ loader->exec->is_composite = is_composite;
+ loader->exec->pts = *zone;
+
+ debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
+ ((TT_Size)loader->size)->debug );
+
+ error = TT_Run_Context( loader->exec, debug );
+ if ( error && loader->exec->pedantic_hinting )
+ return error;
+
+ /* store drop-out mode in bits 5-7; set bit 2 also as a marker */
+ current_outline.tags[0] |=
+ ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
+ }
+
+#endif
+
+ /* save glyph phantom points */
+ if ( !loader->preserve_pps )
+ {
+ loader->pp1 = zone->cur[zone->n_points - 4];
+ loader->pp2 = zone->cur[zone->n_points - 3];
+ loader->pp3 = zone->cur[zone->n_points - 2];
+ loader->pp4 = zone->cur[zone->n_points - 1];
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
+ FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
+
+ else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
+ FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Simple_Glyph */
+ /* */
+ /* <Description> */
+ /* Once a simple glyph has been loaded, it needs to be processed. */
+ /* Usually, this means scaling and hinting through bytecode */
+ /* interpretation. */
+ /* */
+ static FT_Error
+ TT_Process_Simple_Glyph( TT_Loader loader )
+ {
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Error error = FT_Err_Ok;
+ FT_Outline* outline;
+ FT_Int n_points;
+
+
+ outline = &gloader->current.outline;
+ n_points = outline->n_points;
+
+ /* set phantom points */
+
+ outline->points[n_points ] = loader->pp1;
+ outline->points[n_points + 1] = loader->pp2;
+ outline->points[n_points + 2] = loader->pp3;
+ outline->points[n_points + 3] = loader->pp4;
+
+ outline->tags[n_points ] = 0;
+ outline->tags[n_points + 1] = 0;
+ outline->tags[n_points + 2] = 0;
+ outline->tags[n_points + 3] = 0;
+
+ n_points += 4;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( ((TT_Face)loader->face)->doblend )
+ {
+ /* Deltas apply to the unscaled data. */
+ FT_Vector* deltas;
+ FT_Memory memory = loader->face->memory;
+ FT_Int i;
+
+
+ error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+ loader->glyph_index,
+ &deltas,
+ n_points );
+ if ( error )
+ return error;
+
+ for ( i = 0; i < n_points; ++i )
+ {
+ outline->points[i].x += deltas[i].x;
+ outline->points[i].y += deltas[i].y;
+ }
+
+ FT_FREE( deltas );
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
+
+ FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
+ loader->zone.n_points + 4 );
+ }
+
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Face face = (TT_Face)loader->face;
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+ FT_String* family = face->root.family_name;
+ FT_Int ppem = loader->size->metrics.x_ppem;
+ FT_String* style = face->root.style_name;
+ FT_Int x_scale_factor = 1000;
+#endif
+
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = outline->points + n_points;
+
+ FT_Fixed x_scale = 0; /* pacify compiler */
+ FT_Fixed y_scale = 0;
+
+ FT_Bool do_scale = FALSE;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ /* scale, but only if enabled and only if TT hinting is being used */
+ if ( IS_HINTED( loader->load_flags ) )
+ x_scale_factor = sph_test_tweak_x_scaling( face,
+ family,
+ ppem,
+ style,
+ loader->glyph_index );
+ /* scale the glyph */
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
+ x_scale_factor != 1000 )
+ {
+ x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,
+ x_scale_factor, 1000 );
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+ /* compensate for any scaling by de/emboldening; */
+ /* the amount was determined via experimentation */
+ if ( x_scale_factor != 1000 && ppem > 11 )
+ FT_Outline_EmboldenXY( outline,
+ FT_MulFix( 1280 * ppem,
+ 1000 - x_scale_factor ),
+ 0 );
+ do_scale = TRUE;
+ }
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ /* scale the glyph */
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+ do_scale = TRUE;
+ }
+ }
+
+ if ( do_scale )
+ {
+ for ( ; vec < limit; vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ loader->pp1 = outline->points[n_points - 4];
+ loader->pp2 = outline->points[n_points - 3];
+ loader->pp3 = outline->points[n_points - 2];
+ loader->pp4 = outline->points[n_points - 1];
+ }
+ }
+
+ /**We Disable HINT except tricky font, seem it looks better, #Testdoc:0000584_Open_CAC5U7WH.pdf,
+ 0000879_Image_MSFNUnattendedPDF.pdf,0005480_sample-barcodes print.pdf.
+ */
+
+ if ( IS_HINTED( loader->load_flags ) && (loader->face->face_flags&FT_FACE_FLAG_TRICKY))
+ {
+ loader->zone.n_points += 4;
+
+ error = TT_Hint_Glyph( loader, 0 );
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Composite_Component */
+ /* */
+ /* <Description> */
+ /* Once a composite component has been loaded, it needs to be */
+ /* processed. Usually, this means transforming and translating. */
+ /* */
+ static FT_Error
+ TT_Process_Composite_Component( TT_Loader loader,
+ FT_SubGlyph subglyph,
+ FT_UInt start_point,
+ FT_UInt num_base_points )
+ {
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Vector* base_vec = gloader->base.outline.points;
+ FT_UInt num_points = gloader->base.outline.n_points;
+ FT_Bool have_scale;
+ FT_Pos x, y;
+
+
+ have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE |
+ WE_HAVE_AN_XY_SCALE |
+ WE_HAVE_A_2X2 ) );
+
+ /* perform the transform required for this subglyph */
+ if ( have_scale )
+ {
+ FT_UInt i;
+
+
+ for ( i = num_base_points; i < num_points; i++ )
+ FT_Vector_Transform( base_vec + i, &subglyph->transform );
+ }
+
+ /* get offset */
+ if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
+ {
+ FT_UInt k = subglyph->arg1;
+ FT_UInt l = subglyph->arg2;
+ FT_Vector* p1;
+ FT_Vector* p2;
+
+
+ /* match l-th point of the newly loaded component to the k-th point */
+ /* of the previously loaded components. */
+
+ /* change to the point numbers used by our outline */
+ k += start_point;
+ l += num_base_points;
+ if ( k >= num_base_points ||
+ l >= num_points )
+ return FT_THROW( Invalid_Composite );
+
+ p1 = gloader->base.outline.points + k;
+ p2 = gloader->base.outline.points + l;
+
+ x = p1->x - p2->x;
+ y = p1->y - p2->y;
+ }
+ else
+ {
+ x = subglyph->arg1;
+ y = subglyph->arg2;
+
+ if ( !x && !y )
+ return FT_Err_Ok;
+
+ /* Use a default value dependent on */
+ /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */
+ /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */
+
+ if ( have_scale &&
+#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+ !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
+#else
+ ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
+#endif
+ {
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* This algorithm is what Apple documents. But it doesn't work. */
+ /* */
+ int a = subglyph->transform.xx > 0 ? subglyph->transform.xx
+ : -subglyph->transform.xx;
+ int b = subglyph->transform.yx > 0 ? subglyph->transform.yx
+ : -subglyph->transform.yx;
+ int c = subglyph->transform.xy > 0 ? subglyph->transform.xy
+ : -subglyph->transform.xy;
+ int d = subglyph->transform.yy > 0 ? subglyph->transform.yy
+ : -subglyph->transform.yy;
+ int m = a > b ? a : b;
+ int n = c > d ? c : d;
+
+
+ if ( a - b <= 33 && a - b >= -33 )
+ m *= 2;
+ if ( c - d <= 33 && c - d >= -33 )
+ n *= 2;
+ x = FT_MulFix( x, m );
+ y = FT_MulFix( y, n );
+
+#else /* 0 */
+
+ /*************************************************************************/
+ /* */
+ /* This algorithm is a guess and works much better than the above. */
+ /* */
+ FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx,
+ subglyph->transform.xy );
+ FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy,
+ subglyph->transform.yx );
+
+
+ x = FT_MulFix( x, mac_xscale );
+ y = FT_MulFix( y, mac_yscale );
+
+#endif /* 0 */
+
+ }
+
+ if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+ {
+ FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+
+ x = FT_MulFix( x, x_scale );
+ y = FT_MulFix( y, y_scale );
+
+ if ( subglyph->flags & ROUND_XY_TO_GRID )
+ {
+ x = FT_PIX_ROUND( x );
+ y = FT_PIX_ROUND( y );
+ }
+ }
+ }
+
+ if ( x || y )
+ translate_array( num_points - num_base_points,
+ base_vec + num_base_points,
+ x, y );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Composite_Glyph */
+ /* */
+ /* <Description> */
+ /* This is slightly different from TT_Process_Simple_Glyph, in that */
+ /* its sole purpose is to hint the glyph. Thus this function is */
+ /* only available when bytecode interpreter is enabled. */
+ /* */
+ static FT_Error
+ TT_Process_Composite_Glyph( TT_Loader loader,
+ FT_UInt start_point,
+ FT_UInt start_contour )
+ {
+ FT_Error error;
+ FT_Outline* outline;
+ FT_UInt i;
+
+
+ outline = &loader->gloader->base.outline;
+
+ /* make room for phantom points */
+ error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
+ outline->n_points + 4,
+ 0 );
+ if ( error )
+ return error;
+
+ outline->points[outline->n_points ] = loader->pp1;
+ outline->points[outline->n_points + 1] = loader->pp2;
+ outline->points[outline->n_points + 2] = loader->pp3;
+ outline->points[outline->n_points + 3] = loader->pp4;
+
+ outline->tags[outline->n_points ] = 0;
+ outline->tags[outline->n_points + 1] = 0;
+ outline->tags[outline->n_points + 2] = 0;
+ outline->tags[outline->n_points + 3] = 0;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ {
+ FT_Stream stream = loader->stream;
+ FT_UShort n_ins, max_ins;
+ FT_ULong tmp;
+
+
+ /* TT_Load_Composite_Glyph only gives us the offset of instructions */
+ /* so we read them here */
+ if ( FT_STREAM_SEEK( loader->ins_pos ) ||
+ FT_READ_USHORT( n_ins ) )
+ return error;
+
+ FT_TRACE5(( " Instructions size = %d\n", n_ins ));
+
+ /* check it */
+ max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
+ if ( n_ins > max_ins )
+ {
+ /* acroread ignores this field, so we only do a rough safety check */
+ if ( (FT_Int)n_ins > loader->byte_len )
+ {
+ FT_TRACE1(( "TT_Process_Composite_Glyph: "
+ "too many instructions (%d) for glyph with length %d\n",
+ n_ins, loader->byte_len ));
+ return FT_THROW( Too_Many_Hints );
+ }
+
+ tmp = loader->exec->glyphSize;
+ error = Update_Max( loader->exec->memory,
+ &tmp,
+ sizeof ( FT_Byte ),
+ (void*)&loader->exec->glyphIns,
+ n_ins );
+ loader->exec->glyphSize = (FT_UShort)tmp;
+ if ( error )
+ return error;
+ }
+ else if ( n_ins == 0 )
+ return FT_Err_Ok;
+
+ if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
+ return error;
+
+ loader->glyph->control_data = loader->exec->glyphIns;
+ loader->glyph->control_len = n_ins;
+ }
+
+#endif
+
+ tt_prepare_zone( &loader->zone, &loader->gloader->base,
+ start_point, start_contour );
+
+ /* Some points are likely touched during execution of */
+ /* instructions on components. So let's untouch them. */
+ for ( i = start_point; i < loader->zone.n_points; i++ )
+ loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
+
+ loader->zone.n_points += 4;
+
+ return TT_Hint_Glyph( loader, 1 );
+ }
+
+
+ /* Calculate the four phantom points. */
+ /* The first two stand for horizontal origin and advance. */
+ /* The last two stand for vertical origin and advance. */
+#define TT_LOADER_SET_PP( loader ) \
+ do { \
+ (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
+ (loader)->pp1.y = 0; \
+ (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \
+ (loader)->pp2.y = 0; \
+ (loader)->pp3.x = 0; \
+ (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \
+ (loader)->pp4.x = 0; \
+ (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \
+ } while ( 0 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* load_truetype_glyph */
+ /* */
+ /* <Description> */
+ /* Loads a given truetype glyph. Handles composites and uses a */
+ /* TT_Loader object. */
+ /* */
+ static FT_Error
+ load_truetype_glyph( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_UInt recurse_count,
+ FT_Bool header_only )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed x_scale, y_scale;
+ FT_ULong offset;
+ TT_Face face = (TT_Face)loader->face;
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Bool opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Vector* deltas = NULL;
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_StreamRec inc_stream;
+ FT_Data glyph_data;
+ FT_Bool glyph_data_loaded = 0;
+#endif
+
+
+ /* some fonts have an incorrect value of `maxComponentDepth', */
+ /* thus we allow depth 1 to catch the majority of them */
+ if ( recurse_count > 1 &&
+ recurse_count > face->max_profile.maxComponentDepth )
+ {
+ error = FT_THROW( Invalid_Composite );
+ goto Exit;
+ }
+
+ /* check glyph index */
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+ {
+ error = FT_THROW( Invalid_Glyph_Index );
+ goto Exit;
+ }
+
+ loader->glyph_index = glyph_index;
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+ }
+ else
+ {
+ x_scale = 0x10000L;
+ y_scale = 0x10000L;
+ }
+
+ tt_get_metrics( loader, glyph_index );
+
+ /* Set `offset' to the start of the glyph relative to the start of */
+ /* the `glyf' table, and `byte_len' to the length of the glyph in */
+ /* bytes. */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* If we are loading glyph data via the incremental interface, set */
+ /* the loader stream to a memory stream reading the data returned */
+ /* by the interface. */
+ if ( face->root.internal->incremental_interface )
+ {
+ error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+ face->root.internal->incremental_interface->object,
+ glyph_index, &glyph_data );
+ if ( error )
+ goto Exit;
+
+ glyph_data_loaded = 1;
+ offset = 0;
+ loader->byte_len = glyph_data.length;
+
+ FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
+ FT_Stream_OpenMemory( &inc_stream,
+ glyph_data.pointer, glyph_data.length );
+
+ loader->stream = &inc_stream;
+ }
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ offset = tt_face_get_location( face, glyph_index,
+ (FT_UInt*)&loader->byte_len );
+
+ if ( loader->byte_len > 0 )
+ {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* for the incremental interface, `glyf_offset' is always zero */
+ if ( !loader->glyf_offset &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( !loader->glyf_offset )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ error = face->access_glyph_frame( loader, glyph_index,
+ loader->glyf_offset + offset,
+ loader->byte_len );
+ if ( error )
+ goto Exit;
+
+ opened_frame = 1;
+
+ /* read glyph header first */
+ error = face->read_glyph_header( loader );
+ if ( error || header_only )
+ goto Exit;
+ }
+
+ if ( loader->byte_len == 0 || loader->n_contours == 0 )
+ {
+ loader->bbox.xMin = 0;
+ loader->bbox.xMax = 0;
+ loader->bbox.yMin = 0;
+ loader->bbox.yMax = 0;
+
+ if ( header_only )
+ goto Exit;
+
+ /* must initialize points before (possibly) overriding */
+ /* glyph metrics from the incremental interface */
+ TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( ((TT_Face)(loader->face))->doblend )
+ {
+ /* this must be done before scaling */
+ FT_Memory memory = loader->face->memory;
+
+
+ error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+ glyph_index, &deltas, 4 );
+ if ( error )
+ goto Exit;
+
+ loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;
+ loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;
+ loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;
+ loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;
+
+ FT_FREE( deltas );
+ }
+
+#endif
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+ loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+ loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+ loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+ }
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ /* must initialize points before (possibly) overriding */
+ /* glyph metrics from the incremental interface */
+ TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ /* if it is a simple glyph, load it */
+
+ if ( loader->n_contours > 0 )
+ {
+ error = face->read_simple_glyph( loader );
+ if ( error )
+ goto Exit;
+
+ /* all data have been read */
+ face->forget_glyph_frame( loader );
+ opened_frame = 0;
+
+ error = TT_Process_Simple_Glyph( loader );
+ if ( error )
+ goto Exit;
+
+ FT_GlyphLoader_Add( gloader );
+ }
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ /* otherwise, load a composite! */
+ else if ( loader->n_contours == -1 )
+ {
+ FT_UInt start_point;
+ FT_UInt start_contour;
+ FT_ULong ins_pos; /* position of composite instructions, if any */
+
+
+ start_point = gloader->base.outline.n_points;
+ start_contour = gloader->base.outline.n_contours;
+
+ /* for each subglyph, read composite header */
+ error = face->read_composite_glyph( loader );
+ if ( error )
+ goto Exit;
+
+ /* store the offset of instructions */
+ ins_pos = loader->ins_pos;
+
+ /* all data we need are read */
+ face->forget_glyph_frame( loader );
+ opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( face->doblend )
+ {
+ FT_Int i, limit;
+ FT_SubGlyph subglyph;
+ FT_Memory memory = face->root.memory;
+
+
+ /* this provides additional offsets */
+ /* for each component's translation */
+
+ if ( ( error = TT_Vary_Get_Glyph_Deltas(
+ face,
+ glyph_index,
+ &deltas,
+ gloader->current.num_subglyphs + 4 )) != 0 )
+ goto Exit;
+
+ subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+ limit = gloader->current.num_subglyphs;
+
+ for ( i = 0; i < limit; ++i, ++subglyph )
+ {
+ if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+ {
+ /* XXX: overflow check for subglyph->{arg1,arg2}. */
+ /* deltas[i].{x,y} must be within signed 16-bit, */
+ /* but the restriction of summed delta is not clear */
+ subglyph->arg1 += (FT_Int16)deltas[i].x;
+ subglyph->arg2 += (FT_Int16)deltas[i].y;
+ }
+ }
+
+ loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;
+ loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;
+ loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;
+ loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;
+
+ FT_FREE( deltas );
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+ loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+ loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+ loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+ }
+
+ /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
+ /* `as is' in the glyph slot (the client application will be */
+ /* responsible for interpreting these data)... */
+ if ( loader->load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_GlyphLoader_Add( gloader );
+ loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ goto Exit;
+ }
+
+ /*********************************************************************/
+ /*********************************************************************/
+ /*********************************************************************/
+
+ {
+ FT_UInt n, num_base_points;
+ FT_SubGlyph subglyph = 0;
+
+ FT_UInt num_points = start_point;
+ FT_UInt num_subglyphs = gloader->current.num_subglyphs;
+ FT_UInt num_base_subgs = gloader->base.num_subglyphs;
+
+ FT_Stream old_stream = loader->stream;
+ FT_Int old_byte_len = loader->byte_len;
+
+
+ FT_GlyphLoader_Add( gloader );
+
+ /* read each subglyph independently */
+ for ( n = 0; n < num_subglyphs; n++ )
+ {
+ FT_Vector pp[4];
+
+
+ /* Each time we call load_truetype_glyph in this loop, the */
+ /* value of `gloader.base.subglyphs' can change due to table */
+ /* reallocations. We thus need to recompute the subglyph */
+ /* pointer on each iteration. */
+ subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+ pp[0] = loader->pp1;
+ pp[1] = loader->pp2;
+ pp[2] = loader->pp3;
+ pp[3] = loader->pp4;
+
+ num_base_points = gloader->base.outline.n_points;
+
+ error = load_truetype_glyph( loader, subglyph->index,
+ recurse_count + 1, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* restore subglyph pointer */
+ subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+ if ( !( subglyph->flags & USE_MY_METRICS ) )
+ {
+ loader->pp1 = pp[0];
+ loader->pp2 = pp[1];
+ loader->pp3 = pp[2];
+ loader->pp4 = pp[3];
+ }
+
+ num_points = gloader->base.outline.n_points;
+
+ if ( num_points == num_base_points )
+ continue;
+
+ /* gloader->base.outline consists of three parts: */
+ /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
+ /* */
+ /* (1): exists from the beginning */
+ /* (2): components that have been loaded so far */
+ /* (3): the newly loaded component */
+ TT_Process_Composite_Component( loader, subglyph, start_point,
+ num_base_points );
+ }
+
+ loader->stream = old_stream;
+ loader->byte_len = old_byte_len;
+
+ /* process the glyph */
+ loader->ins_pos = ins_pos;
+ if ( IS_HINTED( loader->load_flags ) &&
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ subglyph->flags & WE_HAVE_INSTR &&
+
+#endif
+
+ num_points > start_point )
+ TT_Process_Composite_Glyph( loader, start_point, start_contour );
+
+ }
+ }
+ else
+ {
+ /* invalid composite count (negative but not -1) */
+ error = FT_THROW( Invalid_Outline );
+ goto Exit;
+ }
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ Exit:
+
+ if ( opened_frame )
+ face->forget_glyph_frame( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( glyph_data_loaded )
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+
+#endif
+
+ return error;
+ }
+
+
+ static FT_Error
+ compute_glyph_metrics( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ FT_BBox bbox;
+ FT_Fixed y_scale;
+ TT_GlyphSlot glyph = loader->glyph;
+ TT_Size size = (TT_Size)loader->size;
+
+
+ y_scale = 0x10000L;
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ y_scale = size->root.metrics.y_scale;
+
+ if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
+ FT_Outline_Get_CBox( &glyph->outline, &bbox );
+ else
+ bbox = loader->bbox;
+
+ /* get the device-independent horizontal advance; it is scaled later */
+ /* by the base layer. */
+ glyph->linearHoriAdvance = loader->linear;
+
+ glyph->metrics.horiBearingX = bbox.xMin;
+ glyph->metrics.horiBearingY = bbox.yMax;
+ glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
+
+ /* adjust advance width to the value contained in the hdmx table */
+ if ( !face->postscript.isFixedPitch &&
+ IS_HINTED( loader->load_flags ) )
+ {
+ FT_Byte* widthp;
+
+
+ widthp = tt_face_get_device_metrics( face,
+ size->root.metrics.x_ppem,
+ glyph_index );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ FT_Bool ignore_x_mode;
+
+
+ ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=
+ FT_RENDER_MODE_MONO );
+
+ if ( widthp &&
+ ( ( ignore_x_mode && loader->exec->compatible_widths ) ||
+ !ignore_x_mode ||
+ SPH_OPTION_BITMAP_WIDTHS ) )
+ glyph->metrics.horiAdvance = *widthp << 6;
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ if ( widthp )
+ glyph->metrics.horiAdvance = *widthp << 6;
+ }
+ }
+
+ /* set glyph dimensions */
+ glyph->metrics.width = bbox.xMax - bbox.xMin;
+ glyph->metrics.height = bbox.yMax - bbox.yMin;
+
+ /* Now take care of vertical metrics. In the case where there is */
+ /* no vertical information within the font (relatively common), */
+ /* create some metrics manually */
+ {
+ FT_Pos top; /* scaled vertical top side bearing */
+ FT_Pos advance; /* scaled vertical advance height */
+
+
+ /* Get the unscaled top bearing and advance height. */
+ if ( face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 )
+ {
+ top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
+ y_scale );
+
+ if ( loader->pp3.y <= loader->pp4.y )
+ advance = 0;
+ else
+ advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
+ y_scale );
+ }
+ else
+ {
+ FT_Pos height;
+
+
+ /* XXX Compute top side bearing and advance height in */
+ /* Get_VMetrics instead of here. */
+
+ /* NOTE: The OS/2 values are the only `portable' ones, */
+ /* which is why we use them, if there is an OS/2 */
+ /* table in the font. Otherwise, we use the */
+ /* values defined in the horizontal header. */
+
+ height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+ y_scale );
+ if ( face->os2.version != 0xFFFFU )
+ advance = (FT_Pos)( face->os2.sTypoAscender -
+ face->os2.sTypoDescender );
+ else
+ advance = (FT_Pos)( face->horizontal.Ascender -
+ face->horizontal.Descender );
+
+ top = ( advance - height ) / 2;
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ {
+ FT_Incremental_InterfaceRec* incr;
+ FT_Incremental_MetricsRec metrics;
+ FT_Error error;
+
+
+ incr = face->root.internal->incremental_interface;
+
+ /* If this is an incrementally loaded font see if there are */
+ /* overriding metrics for this glyph. */
+ if ( incr && incr->funcs->get_glyph_metrics )
+ {
+ metrics.bearing_x = 0;
+ metrics.bearing_y = top;
+ metrics.advance = advance;
+
+ error = incr->funcs->get_glyph_metrics( incr->object,
+ glyph_index,
+ TRUE,
+ &metrics );
+ if ( error )
+ return error;
+
+ top = metrics.bearing_y;
+ advance = metrics.advance;
+ }
+ }
+
+ /* GWW: Do vertical metrics get loaded incrementally too? */
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ glyph->linearVertAdvance = advance;
+
+ /* scale the metrics */
+ if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+ {
+ top = FT_MulFix( top, y_scale );
+ advance = FT_MulFix( advance, y_scale );
+ }
+
+ /* XXX: for now, we have no better algorithm for the lsb, but it */
+ /* should work fine. */
+ /* */
+ glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
+ glyph->metrics.horiAdvance / 2;
+ glyph->metrics.vertBearingY = top;
+ glyph->metrics.vertAdvance = advance;
+ }
+
+ return 0;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ static FT_Error
+ load_sbit_image( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ TT_Face face;
+ SFNT_Service sfnt;
+ FT_Stream stream;
+ FT_Error error;
+ TT_SBit_MetricsRec metrics;
+
+
+ face = (TT_Face)glyph->face;
+ sfnt = (SFNT_Service)face->sfnt;
+ stream = face->root.stream;
+
+ error = sfnt->load_sbit_image( face,
+ size->strike_index,
+ glyph_index,
+ (FT_Int)load_flags,
+ stream,
+ &glyph->bitmap,
+ &metrics );
+ if ( !error )
+ {
+ glyph->outline.n_points = 0;
+ glyph->outline.n_contours = 0;
+
+ glyph->metrics.width = (FT_Pos)metrics.width << 6;
+ glyph->metrics.height = (FT_Pos)metrics.height << 6;
+
+ glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+ glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+ glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
+
+ glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+ glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+ glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
+
+ glyph->format = FT_GLYPH_FORMAT_BITMAP;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ glyph->bitmap_left = metrics.vertBearingX;
+ glyph->bitmap_top = metrics.vertBearingY;
+ }
+ else
+ {
+ glyph->bitmap_left = metrics.horiBearingX;
+ glyph->bitmap_top = metrics.horiBearingY;
+ }
+ }
+
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ static FT_Error
+ tt_loader_init( TT_Loader loader,
+ TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_Int32 load_flags,
+ FT_Bool glyf_table_only )
+ {
+ TT_Face face;
+ FT_Stream stream;
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+#endif
+
+
+ face = (TT_Face)glyph->face;
+ stream = face->root.stream;
+
+ FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /* load execution context */
+ if ( IS_HINTED( load_flags ) && !glyf_table_only )
+ {
+ TT_ExecContext exec;
+ FT_Bool grayscale;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+ FT_Bool subpixel_hinting = FALSE;
+ FT_Bool grayscale_hinting = TRUE;
+
+#if 0
+ /* not used yet */
+ FT_Bool compatible_widths;
+ FT_Bool symmetrical_smoothing;
+ FT_Bool bgr;
+ FT_Bool subpixel_positioned;
+#endif
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ FT_Bool reexecute = FALSE;
+
+
+ if ( !size->cvt_ready )
+ {
+ FT_Error error = tt_size_ready_bytecode( size, pedantic );
+
+
+ if ( error )
+ return error;
+ }
+
+ /* query new execution context */
+ exec = size->debug ? size->context
+ : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )
+ != FT_RENDER_MODE_MONO ) &&
+ SPH_OPTION_SET_SUBPIXEL );
+
+ if ( subpixel_hinting )
+ grayscale = grayscale_hinting = FALSE;
+ else if ( SPH_OPTION_SET_GRAYSCALE )
+ {
+ grayscale = grayscale_hinting = TRUE;
+ subpixel_hinting = FALSE;
+ }
+ else
+ grayscale = grayscale_hinting = FALSE;
+
+ if ( FT_IS_TRICKY( glyph->face ) )
+ subpixel_hinting = grayscale_hinting = FALSE;
+
+ exec->ignore_x_mode = subpixel_hinting || grayscale_hinting;
+ exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+ exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+
+#if 1
+ exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
+ exec->symmetrical_smoothing = FALSE;
+ exec->bgr = FALSE;
+ exec->subpixel_positioned = TRUE;
+#else /* 0 */
+ exec->compatible_widths =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_COMPATIBLE_WIDTHS );
+ exec->symmetrical_smoothing =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_SYMMETRICAL_SMOOTHING );
+ exec->bgr =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_BGR );
+ exec->subpixel_positioned =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_SUBPIXEL_POSITIONED );
+#endif /* 0 */
+
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ FT_RENDER_MODE_MONO );
+ }
+
+ TT_Load_Context( exec, face, size );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ /* a change from mono to subpixel rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( subpixel_hinting != exec->subpixel_hinting )
+ {
+ FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
+ " re-executing `prep' table\n" ));
+
+ exec->subpixel_hinting = subpixel_hinting;
+ reexecute = TRUE;
+ }
+
+ /* a change from mono to grayscale rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( grayscale != exec->grayscale_hinting )
+ {
+ FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
+ " re-executing `prep' table\n" ));
+
+ exec->grayscale_hinting = grayscale_hinting;
+ reexecute = TRUE;
+ }
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ /* a change from mono to grayscale rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( grayscale != exec->grayscale )
+ {
+ FT_TRACE4(( "tt_loader_init: grayscale change,"
+ " re-executing `prep' table\n" ));
+
+ exec->grayscale = grayscale;
+ reexecute = TRUE;
+ }
+ }
+
+ if ( reexecute )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0; i < size->cvt_size; i++ )
+ size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+ tt_size_run_prep( size, pedantic );
+ }
+
+ /* see whether the cvt program has disabled hinting */
+ if ( exec->GS.instruct_control & 1 )
+ load_flags |= FT_LOAD_NO_HINTING;
+
+ /* load default graphics state -- if needed */
+ if ( exec->GS.instruct_control & 2 )
+ exec->GS = tt_default_graphics_state;
+
+ exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+ loader->exec = exec;
+ loader->instructions = exec->glyphIns;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ /* seek to the beginning of the glyph table -- for Type 42 fonts */
+ /* the table might be accessed from a Postscript stream or something */
+ /* else... */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( face->root.internal->incremental_interface )
+ loader->glyf_offset = 0;
+ else
+
+#endif
+
+ {
+ FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 );
+
+
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ loader->glyf_offset = 0;
+ else if ( error )
+ {
+ FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
+ return error;
+ }
+ else
+ loader->glyf_offset = FT_STREAM_POS();
+ }
+
+ /* get face's glyph loader */
+ if ( !glyf_table_only )
+ {
+ FT_GlyphLoader gloader = glyph->internal->loader;
+
+
+ FT_GlyphLoader_Rewind( gloader );
+ loader->gloader = gloader;
+ }
+
+ loader->load_flags = load_flags;
+
+ loader->face = (FT_Face)face;
+ loader->size = (FT_Size)size;
+ loader->glyph = (FT_GlyphSlot)glyph;
+ loader->stream = stream;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Load_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph within a given glyph slot, */
+ /* for a given size. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to a target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled/loaded. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Load_Glyph( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ TT_LoaderRec loader;
+
+
+ error = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /* try to load embedded bitmap if any */
+ /* */
+ /* XXX: The convention should be emphasized in */
+ /* the documents because it can be confusing. */
+ if ( size->strike_index != 0xFFFFFFFFUL &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ error = load_sbit_image( size, glyph, glyph_index, load_flags );
+ if ( !error )
+ {
+ if ( FT_IS_SCALABLE( glyph->face ) )
+ {
+ /* for the bbox we need the header only */
+ (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
+ (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
+ glyph->linearHoriAdvance = loader.linear;
+ glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
+ loader.vadvance;
+
+ /* sanity check: if `horiAdvance' in the sbit metric */
+ /* structure isn't set, use `linearHoriAdvance' */
+ if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )
+ glyph->metrics.horiAdvance =
+ FT_MulFix( glyph->linearHoriAdvance,
+ size->root.metrics.x_scale );
+ }
+
+ return FT_Err_Ok;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( load_flags & FT_LOAD_SBITS_ONLY )
+ return FT_THROW( Invalid_Argument );
+
+ error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
+ if ( error )
+ return error;
+
+ glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+ glyph->num_subglyphs = 0;
+ glyph->outline.flags = 0;
+
+ /* main loading loop */
+ error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
+ if ( !error )
+ {
+ if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
+ {
+ glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
+ glyph->subglyphs = loader.gloader->base.subglyphs;
+ }
+ else
+ {
+ glyph->outline = loader.gloader->base.outline;
+ glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
+
+ /* Translate array so that (0,0) is the glyph's origin. Note */
+ /* that this behaviour is independent on the value of bit 1 of */
+ /* the `flags' field in the `head' table -- at least major */
+ /* applications like Acroread indicate that. */
+ if ( loader.pp1.x )
+ FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( IS_HINTED( load_flags ) )
+ {
+ if ( loader.exec->GS.scan_control )
+ {
+ /* convert scan conversion mode to FT_OUTLINE_XXX flags */
+ switch ( loader.exec->GS.scan_type )
+ {
+ case 0: /* simple drop-outs including stubs */
+ glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
+ break;
+ case 1: /* simple drop-outs excluding stubs */
+ /* nothing; it's the default rendering mode */
+ break;
+ case 4: /* smart drop-outs including stubs */
+ glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
+ FT_OUTLINE_INCLUDE_STUBS;
+ break;
+ case 5: /* smart drop-outs excluding stubs */
+ glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
+ break;
+
+ default: /* no drop-out control */
+ glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+ break;
+ }
+ }
+ else
+ glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ compute_glyph_metrics( &loader, glyph_index );
+ }
+
+ /* Set the `high precision' bit flag. */
+ /* This is _critical_ to get correct output for monochrome */
+ /* TrueType glyphs at all sizes using the bytecode interpreter. */
+ /* */
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+ size->root.metrics.y_ppem < 24 )
+ glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
new file mode 100644
index 0000000000..aea68f8ce7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/* */
+/* ttgload.h */
+/* */
+/* TrueType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTGLOAD_H__
+#define __TTGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ TT_Init_Glyph_Loading( TT_Face face );
+
+ FT_LOCAL( void )
+ TT_Get_HMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* lsb,
+ FT_UShort* aw );
+
+ FT_LOCAL( void )
+ TT_Get_VMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* tsb,
+ FT_UShort* ah );
+
+ FT_LOCAL( FT_Error )
+ TT_Load_Glyph( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __TTGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
new file mode 100644
index 0000000000..559e63237a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
@@ -0,0 +1,1532 @@
+/***************************************************************************/
+/* */
+/* ttgxvar.c */
+/* */
+/* TrueType GX Font Variation loader */
+/* */
+/* Copyright 2004-2013 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */
+ /* */
+ /* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */
+ /* */
+ /* The documentation for `fvar' is inconsistent. At one point it says */
+ /* that `countSizePairs' should be 3, at another point 2. It should */
+ /* be 2. */
+ /* */
+ /* The documentation for `gvar' is not intelligible; `cvar' refers you */
+ /* to `gvar' and is thus also incomprehensible. */
+ /* */
+ /* The documentation for `avar' appears correct, but Apple has no fonts */
+ /* with an `avar' table, so it is hard to test. */
+ /* */
+ /* Many thanks to John Jenkins (at Apple) in figuring this out. */
+ /* */
+ /* */
+ /* Apple's `kern' table has some references to tuple indices, but as */
+ /* there is no indication where these indices are defined, nor how to */
+ /* interpolate the kerning values (different tuples have different */
+ /* classes) this issue is ignored. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "ttpload.h"
+#include "ttgxvar.h"
+
+#include "tterrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+#define FT_Stream_FTell( stream ) \
+ (FT_ULong)( (stream)->cursor - (stream)->base )
+#define FT_Stream_SeekSet( stream, off ) \
+ ( (stream)->cursor = (stream)->base + (off) )
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttgxvar
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** Internal Routines *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */
+ /* indicates that there is a delta for every point without needing to */
+ /* enumerate all of them. */
+ /* */
+
+ /* ensure that value `0' has the same width as a pointer */
+#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0
+
+
+#define GX_PT_POINTS_ARE_WORDS 0x80
+#define GX_PT_POINT_RUN_COUNT_MASK 0x7F
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_readpackedpoints */
+ /* */
+ /* <Description> */
+ /* Read a set of points to which the following deltas will apply. */
+ /* Points are packed with a run length encoding. */
+ /* */
+ /* <Input> */
+ /* stream :: The data stream. */
+ /* */
+ /* <Output> */
+ /* point_cnt :: The number of points read. A zero value means that */
+ /* all points in the glyph will be affected, without */
+ /* enumerating them individually. */
+ /* */
+ /* <Return> */
+ /* An array of FT_UShort containing the affected points or the */
+ /* special value ALL_POINTS. */
+ /* */
+ static FT_UShort*
+ ft_var_readpackedpoints( FT_Stream stream,
+ FT_UInt *point_cnt )
+ {
+ FT_UShort *points = NULL;
+ FT_Int n;
+ FT_Int runcnt;
+ FT_Int i;
+ FT_Int j;
+ FT_Int first;
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ *point_cnt = n = FT_GET_BYTE();
+ if ( n == 0 )
+ return ALL_POINTS;
+
+ if ( n & GX_PT_POINTS_ARE_WORDS )
+ n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );
+
+ if ( FT_NEW_ARRAY( points, n ) )
+ return NULL;
+
+ i = 0;
+ while ( i < n )
+ {
+ runcnt = FT_GET_BYTE();
+ if ( runcnt & GX_PT_POINTS_ARE_WORDS )
+ {
+ runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;
+ first = points[i++] = FT_GET_USHORT();
+
+ if ( runcnt < 1 || i + runcnt >= n )
+ goto Exit;
+
+ /* first point not included in runcount */
+ for ( j = 0; j < runcnt; ++j )
+ points[i++] = (FT_UShort)( first += FT_GET_USHORT() );
+ }
+ else
+ {
+ first = points[i++] = FT_GET_BYTE();
+
+ if ( runcnt < 1 || i + runcnt >= n )
+ goto Exit;
+
+ for ( j = 0; j < runcnt; ++j )
+ points[i++] = (FT_UShort)( first += FT_GET_BYTE() );
+ }
+ }
+
+ Exit:
+ return points;
+ }
+
+
+ enum
+ {
+ GX_DT_DELTAS_ARE_ZERO = 0x80,
+ GX_DT_DELTAS_ARE_WORDS = 0x40,
+ GX_DT_DELTA_RUN_COUNT_MASK = 0x3F
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_readpackeddeltas */
+ /* */
+ /* <Description> */
+ /* Read a set of deltas. These are packed slightly differently than */
+ /* points. In particular there is no overall count. */
+ /* */
+ /* <Input> */
+ /* stream :: The data stream. */
+ /* */
+ /* delta_cnt :: The number of to be read. */
+ /* */
+ /* <Return> */
+ /* An array of FT_Short containing the deltas for the affected */
+ /* points. (This only gets the deltas for one dimension. It will */
+ /* generally be called twice, once for x, once for y. When used in */
+ /* cvt table, it will only be called once.) */
+ /* */
+ static FT_Short*
+ ft_var_readpackeddeltas( FT_Stream stream,
+ FT_Offset delta_cnt )
+ {
+ FT_Short *deltas = NULL;
+ FT_UInt runcnt;
+ FT_Offset i;
+ FT_UInt j;
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
+ return NULL;
+
+ i = 0;
+ while ( i < delta_cnt )
+ {
+ runcnt = FT_GET_BYTE();
+ if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
+ {
+ /* runcnt zeroes get added */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = 0;
+ }
+ else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
+ {
+ /* runcnt shorts from the stack */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = FT_GET_SHORT();
+ }
+ else
+ {
+ /* runcnt signed bytes from the stack */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = FT_GET_CHAR();
+ }
+
+ if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )
+ {
+ /* Bad format */
+ FT_FREE( deltas );
+ return NULL;
+ }
+ }
+
+ return deltas;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_load_avar */
+ /* */
+ /* <Description> */
+ /* Parse the `avar' table if present. It need not be, so we return */
+ /* nothing. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* */
+ static void
+ ft_var_load_avar( TT_Face face )
+ {
+ FT_Stream stream = FT_FACE_STREAM(face);
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ GX_AVarSegment segment;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong version;
+ FT_Long axisCount;
+ FT_Int i, j;
+ FT_ULong table_len;
+
+ FT_UNUSED( error );
+
+
+ blend->avar_checked = TRUE;
+ if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )
+ return;
+
+ if ( FT_FRAME_ENTER( table_len ) )
+ return;
+
+ version = FT_GET_LONG();
+ axisCount = FT_GET_LONG();
+
+ if ( version != 0x00010000L ||
+ axisCount != (FT_Long)blend->mmvar->num_axis )
+ goto Exit;
+
+ if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )
+ goto Exit;
+
+ segment = &blend->avar_segment[0];
+ for ( i = 0; i < axisCount; ++i, ++segment )
+ {
+ segment->pairCount = FT_GET_USHORT();
+ if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
+ {
+ /* Failure. Free everything we have done so far. We must do */
+ /* it right now since loading the `avar' table is optional. */
+
+ for ( j = i - 1; j >= 0; --j )
+ FT_FREE( blend->avar_segment[j].correspondence );
+
+ FT_FREE( blend->avar_segment );
+ blend->avar_segment = NULL;
+ goto Exit;
+ }
+
+ for ( j = 0; j < segment->pairCount; ++j )
+ {
+ segment->correspondence[j].fromCoord =
+ FT_GET_SHORT() << 2; /* convert to Fixed */
+ segment->correspondence[j].toCoord =
+ FT_GET_SHORT()<<2; /* convert to Fixed */
+ }
+ }
+
+ Exit:
+ FT_FRAME_EXIT();
+ }
+
+
+ typedef struct GX_GVar_Head_
+ {
+ FT_Long version;
+ FT_UShort axisCount;
+ FT_UShort globalCoordCount;
+ FT_ULong offsetToCoord;
+ FT_UShort glyphCount;
+ FT_UShort flags;
+ FT_ULong offsetToData;
+
+ } GX_GVar_Head;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_load_gvar */
+ /* */
+ /* <Description> */
+ /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */
+ /* had better be there too. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ ft_var_load_gvar( TT_Face face )
+ {
+ FT_Stream stream = FT_FACE_STREAM(face);
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt i, j;
+ FT_ULong table_len;
+ FT_ULong gvar_start;
+ FT_ULong offsetToData;
+ GX_GVar_Head gvar_head;
+
+ static const FT_Frame_Field gvar_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_GVar_Head
+
+ FT_FRAME_START( 20 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( axisCount ),
+ FT_FRAME_USHORT( globalCoordCount ),
+ FT_FRAME_ULONG ( offsetToCoord ),
+ FT_FRAME_USHORT( glyphCount ),
+ FT_FRAME_USHORT( flags ),
+ FT_FRAME_ULONG ( offsetToData ),
+ FT_FRAME_END
+ };
+
+ if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )
+ goto Exit;
+
+ gvar_start = FT_STREAM_POS( );
+ if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
+ goto Exit;
+
+ blend->tuplecount = gvar_head.globalCoordCount;
+ blend->gv_glyphcnt = gvar_head.glyphCount;
+ offsetToData = gvar_start + gvar_head.offsetToData;
+
+ if ( gvar_head.version != (FT_Long)0x00010000L ||
+ gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
+ goto Exit;
+
+ if ( gvar_head.flags & 1 )
+ {
+ /* long offsets (one more offset than glyphs, to mark size of last) */
+ if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )
+ goto Exit;
+
+ for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+ blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();
+
+ FT_FRAME_EXIT();
+ }
+ else
+ {
+ /* short offsets (one more offset than glyphs, to mark size of last) */
+ if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )
+ goto Exit;
+
+ for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+ blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+ /* XXX: Undocumented: `*2'! */
+
+ FT_FRAME_EXIT();
+ }
+
+ if ( blend->tuplecount != 0 )
+ {
+ if ( FT_NEW_ARRAY( blend->tuplecoords,
+ gvar_head.axisCount * blend->tuplecount ) )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) ||
+ FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) )
+ goto Exit;
+
+ for ( i = 0; i < blend->tuplecount; ++i )
+ for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )
+ blend->tuplecoords[i * gvar_head.axisCount + j] =
+ FT_GET_SHORT() << 2; /* convert to FT_Fixed */
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_apply_tuple */
+ /* */
+ /* <Description> */
+ /* Figure out whether a given tuple (design) applies to the current */
+ /* blend, and if so, what is the scaling factor. */
+ /* */
+ /* <Input> */
+ /* blend :: The current blend of the font. */
+ /* */
+ /* tupleIndex :: A flag saying whether this is an intermediate */
+ /* tuple or not. */
+ /* */
+ /* tuple_coords :: The coordinates of the tuple in normalized axis */
+ /* units. */
+ /* */
+ /* im_start_coords :: The initial coordinates where this tuple starts */
+ /* to apply (for intermediate coordinates). */
+ /* */
+ /* im_end_coords :: The final coordinates after which this tuple no */
+ /* longer applies (for intermediate coordinates). */
+ /* */
+ /* <Return> */
+ /* An FT_Fixed value containing the scaling factor. */
+ /* */
+ static FT_Fixed
+ ft_var_apply_tuple( GX_Blend blend,
+ FT_UShort tupleIndex,
+ FT_Fixed* tuple_coords,
+ FT_Fixed* im_start_coords,
+ FT_Fixed* im_end_coords )
+ {
+ FT_UInt i;
+ FT_Fixed apply = 0x10000L;
+
+
+ for ( i = 0; i < blend->num_axis; ++i )
+ {
+ if ( tuple_coords[i] == 0 )
+ /* It's not clear why (for intermediate tuples) we don't need */
+ /* to check against start/end -- the documentation says we don't. */
+ /* Similarly, it's unclear why we don't need to scale along the */
+ /* axis. */
+ continue;
+
+ else if ( blend->normalizedcoords[i] == 0 ||
+ ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
+ ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
+ {
+ apply = 0;
+ break;
+ }
+
+ else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+ /* not an intermediate tuple */
+ apply = FT_MulFix( apply,
+ blend->normalizedcoords[i] > 0
+ ? blend->normalizedcoords[i]
+ : -blend->normalizedcoords[i] );
+
+ else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||
+ blend->normalizedcoords[i] >= im_end_coords[i] )
+ {
+ apply = 0;
+ break;
+ }
+
+ else if ( blend->normalizedcoords[i] < tuple_coords[i] )
+ apply = FT_MulDiv( apply,
+ blend->normalizedcoords[i] - im_start_coords[i],
+ tuple_coords[i] - im_start_coords[i] );
+
+ else
+ apply = FT_MulDiv( apply,
+ im_end_coords[i] - blend->normalizedcoords[i],
+ im_end_coords[i] - tuple_coords[i] );
+ }
+
+ return apply;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct GX_FVar_Head_
+ {
+ FT_Long version;
+ FT_UShort offsetToData;
+ FT_UShort countSizePairs;
+ FT_UShort axisCount;
+ FT_UShort axisSize;
+ FT_UShort instanceCount;
+ FT_UShort instanceSize;
+
+ } GX_FVar_Head;
+
+
+ typedef struct fvar_axis_
+ {
+ FT_ULong axisTag;
+ FT_ULong minValue;
+ FT_ULong defaultValue;
+ FT_ULong maxValue;
+ FT_UShort flags;
+ FT_UShort nameID;
+
+ } GX_FVar_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Get_MM_Var */
+ /* */
+ /* <Description> */
+ /* Check that the font's `fvar' table is valid, parse it, and return */
+ /* those data. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* TT_Get_MM_Var initializes the blend structure. */
+ /* */
+ /* <Output> */
+ /* master :: The `fvar' data (must be freed by caller). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Get_MM_Var( TT_Face face,
+ FT_MM_Var* *master )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = face->root.memory;
+ FT_ULong table_len;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong fvar_start;
+ FT_Int i, j;
+ FT_MM_Var* mmvar = NULL;
+ FT_Fixed* next_coords;
+ FT_String* next_name;
+ FT_Var_Axis* a;
+ FT_Var_Named_Style* ns;
+ GX_FVar_Head fvar_head;
+
+ static const FT_Frame_Field fvar_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_FVar_Head
+
+ FT_FRAME_START( 16 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( offsetToData ),
+ FT_FRAME_USHORT( countSizePairs ),
+ FT_FRAME_USHORT( axisCount ),
+ FT_FRAME_USHORT( axisSize ),
+ FT_FRAME_USHORT( instanceCount ),
+ FT_FRAME_USHORT( instanceSize ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field fvaraxis_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_FVar_Axis
+
+ FT_FRAME_START( 20 ),
+ FT_FRAME_ULONG ( axisTag ),
+ FT_FRAME_ULONG ( minValue ),
+ FT_FRAME_ULONG ( defaultValue ),
+ FT_FRAME_ULONG ( maxValue ),
+ FT_FRAME_USHORT( flags ),
+ FT_FRAME_USHORT( nameID ),
+ FT_FRAME_END
+ };
+
+
+ if ( face->blend == NULL )
+ {
+ /* both `fvar' and `gvar' must be present */
+ if ( (error = face->goto_table( face, TTAG_gvar,
+ stream, &table_len )) != 0 )
+ goto Exit;
+
+ if ( (error = face->goto_table( face, TTAG_fvar,
+ stream, &table_len )) != 0 )
+ goto Exit;
+
+ fvar_start = FT_STREAM_POS( );
+
+ if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
+ goto Exit;
+
+ if ( fvar_head.version != (FT_Long)0x00010000L ||
+ fvar_head.countSizePairs != 2 ||
+ fvar_head.axisSize != 20 ||
+ /* axisCount limit implied by 16-bit instanceSize */
+ fvar_head.axisCount > 0x3FFE ||
+ fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount ||
+ /* instanceCount limit implied by limited range of name IDs */
+ fvar_head.instanceCount > 0x7EFF ||
+ fvar_head.offsetToData + fvar_head.axisCount * 20U +
+ fvar_head.instanceCount * fvar_head.instanceSize > table_len )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ if ( FT_NEW( face->blend ) )
+ goto Exit;
+
+ /* cannot overflow 32-bit arithmetic because of limits above */
+ face->blend->mmvar_len =
+ sizeof ( FT_MM_Var ) +
+ fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
+ fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
+ fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
+ 5 * fvar_head.axisCount;
+
+ if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+ goto Exit;
+ face->blend->mmvar = mmvar;
+
+ mmvar->num_axis =
+ fvar_head.axisCount;
+ mmvar->num_designs =
+ ~0U; /* meaningless in this context; each glyph */
+ /* may have a different number of designs */
+ /* (or tuples, as called by Apple) */
+ mmvar->num_namedstyles =
+ fvar_head.instanceCount;
+ mmvar->axis =
+ (FT_Var_Axis*)&(mmvar[1]);
+ mmvar->namedstyle =
+ (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);
+
+ next_coords =
+ (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);
+ for ( i = 0; i < fvar_head.instanceCount; ++i )
+ {
+ mmvar->namedstyle[i].coords = next_coords;
+ next_coords += fvar_head.axisCount;
+ }
+
+ next_name = (FT_String*)next_coords;
+ for ( i = 0; i < fvar_head.axisCount; ++i )
+ {
+ mmvar->axis[i].name = next_name;
+ next_name += 5;
+ }
+
+ if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )
+ goto Exit;
+
+ a = mmvar->axis;
+ for ( i = 0; i < fvar_head.axisCount; ++i )
+ {
+ GX_FVar_Axis axis_rec;
+
+
+ if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
+ goto Exit;
+ a->tag = axis_rec.axisTag;
+ a->minimum = axis_rec.minValue; /* A Fixed */
+ a->def = axis_rec.defaultValue; /* A Fixed */
+ a->maximum = axis_rec.maxValue; /* A Fixed */
+ a->strid = axis_rec.nameID;
+
+ a->name[0] = (FT_String)( a->tag >> 24 );
+ a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );
+ a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF );
+ a->name[3] = (FT_String)( ( a->tag ) & 0xFF );
+ a->name[4] = 0;
+
+ ++a;
+ }
+
+ ns = mmvar->namedstyle;
+ for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )
+ {
+ if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
+ goto Exit;
+
+ ns->strid = FT_GET_USHORT();
+ (void) /* flags = */ FT_GET_USHORT();
+
+ for ( j = 0; j < fvar_head.axisCount; ++j )
+ ns->coords[j] = FT_GET_ULONG(); /* A Fixed */
+
+ FT_FRAME_EXIT();
+ }
+ }
+
+ if ( master != NULL )
+ {
+ FT_UInt n;
+
+
+ if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+ goto Exit;
+ FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
+
+ mmvar->axis =
+ (FT_Var_Axis*)&(mmvar[1]);
+ mmvar->namedstyle =
+ (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);
+ next_coords =
+ (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);
+
+ for ( n = 0; n < mmvar->num_namedstyles; ++n )
+ {
+ mmvar->namedstyle[n].coords = next_coords;
+ next_coords += mmvar->num_axis;
+ }
+
+ a = mmvar->axis;
+ next_name = (FT_String*)next_coords;
+ for ( n = 0; n < mmvar->num_axis; ++n )
+ {
+ a->name = next_name;
+
+ /* standard PostScript names for some standard apple tags */
+ if ( a->tag == TTAG_wght )
+ a->name = (char *)"Weight";
+ else if ( a->tag == TTAG_wdth )
+ a->name = (char *)"Width";
+ else if ( a->tag == TTAG_opsz )
+ a->name = (char *)"OpticalSize";
+ else if ( a->tag == TTAG_slnt )
+ a->name = (char *)"Slant";
+
+ next_name += 5;
+ ++a;
+ }
+
+ *master = mmvar;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_MM_Blend */
+ /* */
+ /* <Description> */
+ /* Set the blend (normalized) coordinates for this instance of the */
+ /* font. Check that the `gvar' table is reasonable and does some */
+ /* initial preparation. */
+ /* */
+ /* <InOut> */
+ /* face :: The font. */
+ /* Initialize the blend structure with `gvar' data. */
+ /* */
+ /* <Input> */
+ /* num_coords :: Must be the axis count of the font. */
+ /* */
+ /* coords :: An array of num_coords, each between [-1,1]. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_MM_Blend( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error = FT_Err_Ok;
+ GX_Blend blend;
+ FT_MM_Var* mmvar;
+ FT_UInt i;
+ FT_Memory memory = face->root.memory;
+
+ enum
+ {
+ mcvt_retain,
+ mcvt_modify,
+ mcvt_load
+
+ } manageCvt;
+
+
+ face->doblend = FALSE;
+
+ if ( face->blend == NULL )
+ {
+ if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )
+ goto Exit;
+ }
+
+ blend = face->blend;
+ mmvar = blend->mmvar;
+
+ if ( num_coords != mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ for ( i = 0; i < num_coords; ++i )
+ if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( blend->glyphoffsets == NULL )
+ if ( (error = ft_var_load_gvar( face )) != 0 )
+ goto Exit;
+
+ if ( blend->normalizedcoords == NULL )
+ {
+ if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )
+ goto Exit;
+
+ manageCvt = mcvt_modify;
+
+ /* If we have not set the blend coordinates before this, then the */
+ /* cvt table will still be what we read from the `cvt ' table and */
+ /* we don't need to reload it. We may need to change it though... */
+ }
+ else
+ {
+ manageCvt = mcvt_retain;
+ for ( i = 0; i < num_coords; ++i )
+ {
+ if ( blend->normalizedcoords[i] != coords[i] )
+ {
+ manageCvt = mcvt_load;
+ break;
+ }
+ }
+
+ /* If we don't change the blend coords then we don't need to do */
+ /* anything to the cvt table. It will be correct. Otherwise we */
+ /* no longer have the original cvt (it was modified when we set */
+ /* the blend last time), so we must reload and then modify it. */
+ }
+
+ blend->num_axis = num_coords;
+ FT_MEM_COPY( blend->normalizedcoords,
+ coords,
+ num_coords * sizeof ( FT_Fixed ) );
+
+ face->doblend = TRUE;
+
+ if ( face->cvt != NULL )
+ {
+ switch ( manageCvt )
+ {
+ case mcvt_load:
+ /* The cvt table has been loaded already; every time we change the */
+ /* blend we may need to reload and remodify the cvt table. */
+ FT_FREE( face->cvt );
+ face->cvt = NULL;
+
+ tt_face_load_cvt( face, face->root.stream );
+ break;
+
+ case mcvt_modify:
+ /* The original cvt table is in memory. All we need to do is */
+ /* apply the `cvar' table (if any). */
+ tt_face_vary_cvt( face, face->root.stream );
+ break;
+
+ case mcvt_retain:
+ /* The cvt table is correct for this set of coordinates. */
+ break;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_Var_Design */
+ /* */
+ /* <Description> */
+ /* Set the coordinates for the instance, measured in the user */
+ /* coordinate system. Parse the `avar' table (if present) to convert */
+ /* from user to normalized coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* Initialize the blend struct with `gvar' data. */
+ /* */
+ /* <Input> */
+ /* num_coords :: This must be the axis count of the font. */
+ /* */
+ /* coords :: A coordinate array with `num_coords' elements. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_Var_Design( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed* normalized = NULL;
+ GX_Blend blend;
+ FT_MM_Var* mmvar;
+ FT_UInt i, j;
+ FT_Var_Axis* a;
+ GX_AVarSegment av;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( face->blend == NULL )
+ {
+ if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )
+ goto Exit;
+ }
+
+ blend = face->blend;
+ mmvar = blend->mmvar;
+
+ if ( num_coords != mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* Axis normalization is a two stage process. First we normalize */
+ /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+ /* Then, if there's an `avar' table, we renormalize this range. */
+
+ if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+ goto Exit;
+
+ a = mmvar->axis;
+ for ( i = 0; i < mmvar->num_axis; ++i, ++a )
+ {
+ if ( coords[i] > a->maximum || coords[i] < a->minimum )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( coords[i] < a->def )
+ normalized[i] = -FT_DivFix( coords[i] - a->def, a->minimum - a->def );
+ else if ( a->maximum == a->def )
+ normalized[i] = 0;
+ else
+ normalized[i] = FT_DivFix( coords[i] - a->def, a->maximum - a->def );
+ }
+
+ if ( !blend->avar_checked )
+ ft_var_load_avar( face );
+
+ if ( blend->avar_segment != NULL )
+ {
+ av = blend->avar_segment;
+ for ( i = 0; i < mmvar->num_axis; ++i, ++av )
+ {
+ for ( j = 1; j < (FT_UInt)av->pairCount; ++j )
+ if ( normalized[i] < av->correspondence[j].fromCoord )
+ {
+ normalized[i] =
+ FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
+ av->correspondence[j].toCoord -
+ av->correspondence[j - 1].toCoord,
+ av->correspondence[j].fromCoord -
+ av->correspondence[j - 1].fromCoord ) +
+ av->correspondence[j - 1].toCoord;
+ break;
+ }
+ }
+ }
+
+ error = TT_Set_MM_Blend( face, num_coords, normalized );
+
+ Exit:
+ FT_FREE( normalized );
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GX VAR PARSING ROUTINES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_vary_cvt */
+ /* */
+ /* <Description> */
+ /* Modify the loaded cvt table according to the `cvar' table and the */
+ /* font's blend. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* Most errors are ignored. It is perfectly valid not to have a */
+ /* `cvar' table even if there is a `gvar' and `fvar' table. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_vary_cvt( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_start;
+ FT_ULong table_len;
+ FT_UInt tupleCount;
+ FT_ULong offsetToData;
+ FT_ULong here;
+ FT_UInt i, j;
+ FT_Fixed* tuple_coords = NULL;
+ FT_Fixed* im_start_coords = NULL;
+ FT_Fixed* im_end_coords = NULL;
+ GX_Blend blend = face->blend;
+ FT_UInt point_count;
+ FT_UShort* localpoints;
+ FT_Short* deltas;
+
+
+ FT_TRACE2(( "CVAR " ));
+
+ if ( blend == NULL )
+ {
+ FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ if ( face->cvt == NULL )
+ {
+ FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ error = face->goto_table( face, TTAG_cvar, stream, &table_len );
+ if ( error )
+ {
+ FT_TRACE2(( "is missing\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ if ( FT_FRAME_ENTER( table_len ) )
+ {
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ table_start = FT_Stream_FTell( stream );
+ if ( FT_GET_LONG() != 0x00010000L )
+ {
+ FT_TRACE2(( "bad table version\n" ));
+
+ error = FT_Err_Ok;
+ goto FExit;
+ }
+
+ if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_end_coords, blend->num_axis ) )
+ goto FExit;
+
+ tupleCount = FT_GET_USHORT();
+ offsetToData = table_start + FT_GET_USHORT();
+
+ /* The documentation implies there are flags packed into the */
+ /* tuplecount, but John Jenkins says that shared points don't apply */
+ /* to `cvar', and no other flags are defined. */
+
+ for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )
+ {
+ FT_UInt tupleDataSize;
+ FT_UInt tupleIndex;
+ FT_Fixed apply;
+
+
+ tupleDataSize = FT_GET_USHORT();
+ tupleIndex = FT_GET_USHORT();
+
+ /* There is no provision here for a global tuple coordinate section, */
+ /* so John says. There are no tuple indices, just embedded tuples. */
+
+ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */
+ /* short frac to fixed */
+ }
+ else
+ {
+ /* skip this tuple; it makes no sense */
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ for ( j = 0; j < 2 * blend->num_axis; ++j )
+ (void)FT_GET_SHORT();
+
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_start_coords[j] = FT_GET_SHORT() << 2;
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_end_coords[j] = FT_GET_SHORT() << 2;
+ }
+
+ apply = ft_var_apply_tuple( blend,
+ (FT_UShort)tupleIndex,
+ tuple_coords,
+ im_start_coords,
+ im_end_coords );
+ if ( /* tuple isn't active for our blend */
+ apply == 0 ||
+ /* global points not allowed, */
+ /* if they aren't local, makes no sense */
+ !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
+ {
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ here = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ localpoints = ft_var_readpackedpoints( stream, &point_count );
+ deltas = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? face->cvt_size
+ : point_count );
+ if ( localpoints == NULL || deltas == NULL )
+ /* failure, ignore it */;
+
+ else if ( localpoints == ALL_POINTS )
+ {
+ /* this means that there are deltas for every entry in cvt */
+ for ( j = 0; j < face->cvt_size; ++j )
+ face->cvt[j] = (FT_Short)( face->cvt[j] +
+ FT_MulFix( deltas[j], apply ) );
+ }
+
+ else
+ {
+ for ( j = 0; j < point_count; ++j )
+ {
+ int pindex = localpoints[j];
+
+ face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +
+ FT_MulFix( deltas[j], apply ) );
+ }
+ }
+
+ if ( localpoints != ALL_POINTS )
+ FT_FREE( localpoints );
+ FT_FREE( deltas );
+
+ offsetToData += tupleDataSize;
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ FExit:
+ FT_FRAME_EXIT();
+
+ Exit:
+ FT_FREE( tuple_coords );
+ FT_FREE( im_start_coords );
+ FT_FREE( im_end_coords );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Vary_Get_Glyph_Deltas */
+ /* */
+ /* <Description> */
+ /* Load the appropriate deltas for the current glyph. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* glyph_index :: The index of the glyph being modified. */
+ /* */
+ /* n_points :: The number of the points in the glyph, including */
+ /* phantom points. */
+ /* */
+ /* <Output> */
+ /* deltas :: The array of points to change. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Vary_Get_Glyph_Deltas( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Vector* *deltas,
+ FT_UInt n_points )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ FT_Vector* delta_xy = NULL;
+
+ FT_Error error;
+ FT_ULong glyph_start;
+ FT_UInt tupleCount;
+ FT_ULong offsetToData;
+ FT_ULong here;
+ FT_UInt i, j;
+ FT_Fixed* tuple_coords = NULL;
+ FT_Fixed* im_start_coords = NULL;
+ FT_Fixed* im_end_coords = NULL;
+ FT_UInt point_count, spoint_count = 0;
+ FT_UShort* sharedpoints = NULL;
+ FT_UShort* localpoints = NULL;
+ FT_UShort* points;
+ FT_Short *deltas_x, *deltas_y;
+
+
+ if ( !face->doblend || blend == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ /* to be freed by the caller */
+ if ( FT_NEW_ARRAY( delta_xy, n_points ) )
+ goto Exit;
+ *deltas = delta_xy;
+
+ if ( glyph_index >= blend->gv_glyphcnt ||
+ blend->glyphoffsets[glyph_index] ==
+ blend->glyphoffsets[glyph_index + 1] )
+ return FT_Err_Ok; /* no variation data for this glyph */
+
+ if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) ||
+ FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -
+ blend->glyphoffsets[glyph_index] ) )
+ goto Fail1;
+
+ glyph_start = FT_Stream_FTell( stream );
+
+ /* each set of glyph variation data is formatted similarly to `cvar' */
+ /* (except we get shared points and global tuples) */
+
+ if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_end_coords, blend->num_axis ) )
+ goto Fail2;
+
+ tupleCount = FT_GET_USHORT();
+ offsetToData = glyph_start + FT_GET_USHORT();
+
+ if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+ {
+ here = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
+ offsetToData = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )
+ {
+ FT_UInt tupleDataSize;
+ FT_UInt tupleIndex;
+ FT_Fixed apply;
+
+
+ tupleDataSize = FT_GET_USHORT();
+ tupleIndex = FT_GET_USHORT();
+
+ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */
+ /* short frac to fixed */
+ }
+ else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Fail3;
+ }
+ else
+ {
+ FT_MEM_COPY(
+ tuple_coords,
+ &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],
+ blend->num_axis * sizeof ( FT_Fixed ) );
+ }
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_start_coords[j] = FT_GET_SHORT() << 2;
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_end_coords[j] = FT_GET_SHORT() << 2;
+ }
+
+ apply = ft_var_apply_tuple( blend,
+ (FT_UShort)tupleIndex,
+ tuple_coords,
+ im_start_coords,
+ im_end_coords );
+
+ if ( apply == 0 ) /* tuple isn't active for our blend */
+ {
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ here = FT_Stream_FTell( stream );
+
+ if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+ {
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ localpoints = ft_var_readpackedpoints( stream, &point_count );
+ points = localpoints;
+ }
+ else
+ {
+ points = sharedpoints;
+ point_count = spoint_count;
+ }
+
+ deltas_x = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? n_points
+ : point_count );
+ deltas_y = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? n_points
+ : point_count );
+
+ if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
+ ; /* failure, ignore it */
+
+ else if ( points == ALL_POINTS )
+ {
+ /* this means that there are deltas for every point in the glyph */
+ for ( j = 0; j < n_points; ++j )
+ {
+ delta_xy[j].x += FT_MulFix( deltas_x[j], apply );
+ delta_xy[j].y += FT_MulFix( deltas_y[j], apply );
+ }
+ }
+
+ else
+ {
+ for ( j = 0; j < point_count; ++j )
+ {
+ if ( localpoints[j] >= n_points )
+ continue;
+
+ delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );
+ delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );
+ }
+ }
+
+ if ( localpoints != ALL_POINTS )
+ FT_FREE( localpoints );
+ FT_FREE( deltas_x );
+ FT_FREE( deltas_y );
+
+ offsetToData += tupleDataSize;
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ Fail3:
+ FT_FREE( tuple_coords );
+ FT_FREE( im_start_coords );
+ FT_FREE( im_end_coords );
+
+ Fail2:
+ FT_FRAME_EXIT();
+
+ Fail1:
+ if ( error )
+ {
+ FT_FREE( delta_xy );
+ *deltas = NULL;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_done_blend */
+ /* */
+ /* <Description> */
+ /* Frees the blend internal data structure. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_done_blend( FT_Memory memory,
+ GX_Blend blend )
+ {
+ if ( blend != NULL )
+ {
+ FT_UInt i;
+
+
+ FT_FREE( blend->normalizedcoords );
+ FT_FREE( blend->mmvar );
+
+ if ( blend->avar_segment != NULL )
+ {
+ for ( i = 0; i < blend->num_axis; ++i )
+ FT_FREE( blend->avar_segment[i].correspondence );
+ FT_FREE( blend->avar_segment );
+ }
+
+ FT_FREE( blend->tuplecoords );
+ FT_FREE( blend->glyphoffsets );
+ FT_FREE( blend );
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
new file mode 100644
index 0000000000..72fe953e93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/* */
+/* ttgxvar.h */
+/* */
+/* TrueType GX Font Variation loader (specification) */
+/* */
+/* Copyright 2004 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTGXVAR_H__
+#define __TTGXVAR_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_AVarCorrespondenceRec */
+ /* */
+ /* <Description> */
+ /* A data structure representing `shortFracCorrespondence' in `avar' */
+ /* table according to the specifications from Apple. */
+ /* */
+ typedef struct GX_AVarCorrespondenceRec_
+ {
+ FT_Fixed fromCoord;
+ FT_Fixed toCoord;
+
+ } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_AVarRec */
+ /* */
+ /* <Description> */
+ /* Data from the segment field of `avar' table. */
+ /* There is one of these for each axis. */
+ /* */
+ typedef struct GX_AVarSegmentRec_
+ {
+ FT_UShort pairCount;
+ GX_AVarCorrespondence correspondence; /* array with pairCount entries */
+
+ } GX_AVarSegmentRec, *GX_AVarSegment;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_BlendRec */
+ /* */
+ /* <Description> */
+ /* Data for interpolating a font from a distortable font specified */
+ /* by the GX *var tables ([fgca]var). */
+ /* */
+ /* <Fields> */
+ /* num_axis :: The number of axes along which interpolation */
+ /* may happen */
+ /* */
+ /* normalizedcoords :: A normalized value (between [-1,1]) indicating */
+ /* the contribution along each axis to the final */
+ /* interpolated font. */
+ /* */
+ typedef struct GX_BlendRec_
+ {
+ FT_UInt num_axis;
+ FT_Fixed* normalizedcoords;
+
+ FT_MM_Var* mmvar;
+ FT_Offset mmvar_len;
+
+ FT_Bool avar_checked;
+ GX_AVarSegment avar_segment;
+
+ FT_UInt tuplecount; /* shared tuples in `gvar' */
+ FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */
+
+ FT_UInt gv_glyphcnt;
+ FT_ULong* glyphoffsets;
+
+ } GX_BlendRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <enum> */
+ /* GX_TupleCountFlags */
+ /* */
+ /* <Description> */
+ /* Flags used within the `TupleCount' field of the `gvar' table. */
+ /* */
+ typedef enum GX_TupleCountFlags_
+ {
+ GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
+ GX_TC_RESERVED_TUPLE_FLAGS = 0x7000,
+ GX_TC_TUPLE_COUNT_MASK = 0x0FFF
+
+ } GX_TupleCountFlags;
+
+
+ /*************************************************************************/
+ /* */
+ /* <enum> */
+ /* GX_TupleIndexFlags */
+ /* */
+ /* <Description> */
+ /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */
+ /* tables. */
+ /* */
+ typedef enum GX_TupleIndexFlags_
+ {
+ GX_TI_EMBEDDED_TUPLE_COORD = 0x8000,
+ GX_TI_INTERMEDIATE_TUPLE = 0x4000,
+ GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
+ GX_TI_RESERVED_TUPLE_FLAG = 0x1000,
+ GX_TI_TUPLE_INDEX_MASK = 0x0FFF
+
+ } GX_TupleIndexFlags;
+
+
+#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' )
+#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' )
+#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' )
+#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' )
+
+
+ FT_LOCAL( FT_Error )
+ TT_Set_MM_Blend( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ TT_Set_Var_Design( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ TT_Get_MM_Var( TT_Face face,
+ FT_MM_Var* *master );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_vary_cvt( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ TT_Vary_Get_Glyph_Deltas( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Vector* *deltas,
+ FT_UInt n_points );
+
+
+ FT_LOCAL( void )
+ tt_done_blend( FT_Memory memory,
+ GX_Blend blend );
+
+
+FT_END_HEADER
+
+
+#endif /* __TTGXVAR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
new file mode 100644
index 0000000000..b7d2b62b3d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
@@ -0,0 +1,8952 @@
+/***************************************************************************/
+/* */
+/* ttinterp.c */
+/* */
+/* TrueType bytecode interpreter (body). */
+/* */
+/* Copyright 1996-2013 */
+/* by David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
+/* issues; many thanks! */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttinterp.h"
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttinterp
+
+ /*************************************************************************/
+ /* */
+ /* In order to detect infinite loops in the code, we set up a counter */
+ /* within the run loop. A single stroke of interpretation is now */
+ /* limited to a maximum number of opcodes defined below. */
+ /* */
+#define MAX_RUNNABLE_OPCODES 1000000L
+
+
+ /*************************************************************************/
+ /* */
+ /* There are two kinds of implementations: */
+ /* */
+ /* a. static implementation */
+ /* */
+ /* The current execution context is a static variable, which fields */
+ /* are accessed directly by the interpreter during execution. The */
+ /* context is named `cur'. */
+ /* */
+ /* This version is non-reentrant, of course. */
+ /* */
+ /* b. indirect implementation */
+ /* */
+ /* The current execution context is passed to _each_ function as its */
+ /* first argument, and each field is thus accessed indirectly. */
+ /* */
+ /* This version is fully re-entrant. */
+ /* */
+ /* The idea is that an indirect implementation may be slower to execute */
+ /* on low-end processors that are used in some systems (like 386s or */
+ /* even 486s). */
+ /* */
+ /* As a consequence, the indirect implementation is now the default, as */
+ /* its performance costs can be considered negligible in our context. */
+ /* Note, however, that we kept the same source with macros because: */
+ /* */
+ /* - The code is kept very close in design to the Pascal code used for */
+ /* development. */
+ /* */
+ /* - It's much more readable that way! */
+ /* */
+ /* - It's still open to experimentation and tuning. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define CUR (*exc) /* see ttobjs.h */
+
+ /*************************************************************************/
+ /* */
+ /* This macro is used whenever `exec' is unused in a function, to avoid */
+ /* stupid warnings from pedantic compilers. */
+ /* */
+#define FT_UNUSED_EXEC FT_UNUSED( exc )
+
+#else /* static implementation */
+
+#define CUR cur
+
+#define FT_UNUSED_EXEC int __dummy = __dummy
+
+ static
+ TT_ExecContextRec cur; /* static exec. context variable */
+
+ /* apparently, we have a _lot_ of direct indexing when accessing */
+ /* the static `cur', which makes the code bigger (due to all the */
+ /* four bytes addresses). */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* The instruction argument stack. */
+ /* */
+#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */
+
+
+ /*************************************************************************/
+ /* */
+ /* This macro is used whenever `args' is unused in a function, to avoid */
+ /* stupid warnings from pedantic compilers. */
+ /* */
+#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args )
+
+
+#define SUBPIXEL_HINTING \
+ ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \
+ TT_INTERPRETER_VERSION_38 )
+
+
+ /*************************************************************************/
+ /* */
+ /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */
+ /* increase readability of the code. */
+ /* */
+ /*************************************************************************/
+
+
+#define SKIP_Code() \
+ SkipCode( EXEC_ARG )
+
+#define GET_ShortIns() \
+ GetShortIns( EXEC_ARG )
+
+#define NORMalize( x, y, v ) \
+ Normalize( EXEC_ARG_ x, y, v )
+
+#define SET_SuperRound( scale, flags ) \
+ SetSuperRound( EXEC_ARG_ scale, flags )
+
+#define ROUND_None( d, c ) \
+ Round_None( EXEC_ARG_ d, c )
+
+#define INS_Goto_CodeRange( range, ip ) \
+ Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
+
+#define CUR_Func_move( z, p, d ) \
+ CUR.func_move( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_move_orig( z, p, d ) \
+ CUR.func_move_orig( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_round( d, c ) \
+ CUR.func_round( EXEC_ARG_ d, c )
+
+#define CUR_Func_read_cvt( index ) \
+ CUR.func_read_cvt( EXEC_ARG_ index )
+
+#define CUR_Func_write_cvt( index, val ) \
+ CUR.func_write_cvt( EXEC_ARG_ index, val )
+
+#define CUR_Func_move_cvt( index, val ) \
+ CUR.func_move_cvt( EXEC_ARG_ index, val )
+
+#define CURRENT_Ratio() \
+ Current_Ratio( EXEC_ARG )
+
+#define CURRENT_Ppem() \
+ Current_Ppem( EXEC_ARG )
+
+#define CUR_Ppem() \
+ Cur_PPEM( EXEC_ARG )
+
+#define INS_SxVTL( a, b, c, d ) \
+ Ins_SxVTL( EXEC_ARG_ a, b, c, d )
+
+#define COMPUTE_Funcs() \
+ Compute_Funcs( EXEC_ARG )
+
+#define COMPUTE_Round( a ) \
+ Compute_Round( EXEC_ARG_ a )
+
+#define COMPUTE_Point_Displacement( a, b, c, d ) \
+ Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
+
+#define MOVE_Zp2_Point( a, b, c, t ) \
+ Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
+
+
+#define CUR_Func_project( v1, v2 ) \
+ CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_Func_dualproj( v1, v2 ) \
+ CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_fast_project( v ) \
+ CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
+
+#define CUR_fast_dualproj( v ) \
+ CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
+
+
+ /*************************************************************************/
+ /* */
+ /* Instruction dispatch function, as used by the interpreter. */
+ /* */
+ typedef void (*TInstruction_Function)( INS_ARG );
+
+
+ /*************************************************************************/
+ /* */
+ /* Two simple bounds-checking macros. */
+ /* */
+#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) )
+#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) )
+
+ /*************************************************************************/
+ /* */
+ /* This macro computes (a*2^14)/b and complements TT_MulFix14. */
+ /* */
+#define TT_DivFix14( a, b ) \
+ FT_DivFix( a, (b) << 2 )
+
+
+#undef SUCCESS
+#define SUCCESS 0
+
+#undef FAILURE
+#define FAILURE 1
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define GUESS_VECTOR( V ) \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
+ CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
+ }
+#else
+#define GUESS_VECTOR( V )
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* CODERANGE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Goto_CodeRange */
+ /* */
+ /* <Description> */
+ /* Switches to a new code range (updates the code related elements in */
+ /* `exec', and `IP'). */
+ /* */
+ /* <Input> */
+ /* range :: The new execution code range. */
+ /* */
+ /* IP :: The new IP in the new code range. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Goto_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ FT_Long IP )
+ {
+ TT_CodeRange* coderange;
+
+
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ coderange = &exec->codeRangeTable[range - 1];
+
+ FT_ASSERT( coderange->base != NULL );
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for IP <= Size instead of IP < Size. */
+ /* */
+ FT_ASSERT( (FT_ULong)IP <= coderange->size );
+
+ exec->code = coderange->base;
+ exec->codeSize = coderange->size;
+ exec->IP = IP;
+ exec->curRange = range;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_CodeRange */
+ /* */
+ /* <Description> */
+ /* Sets a code range. */
+ /* */
+ /* <Input> */
+ /* range :: The code range index. */
+ /* */
+ /* base :: The new code base. */
+ /* */
+ /* length :: The range size in bytes. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ void* base,
+ FT_Long length )
+ {
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+ exec->codeRangeTable[range - 1].size = length;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Clear_CodeRange */
+ /* */
+ /* <Description> */
+ /* Clears a code range. */
+ /* */
+ /* <Input> */
+ /* range :: The code range index. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Does not set the Error variable. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Clear_CodeRange( TT_ExecContext exec,
+ FT_Int range )
+ {
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ exec->codeRangeTable[range - 1].base = NULL;
+ exec->codeRangeTable[range - 1].size = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EXECUTION CONTEXT ROUTINES */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Done_Context */
+ /* */
+ /* <Description> */
+ /* Destroys a given context. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Done_Context( TT_ExecContext exec )
+ {
+ FT_Memory memory = exec->memory;
+
+
+ /* points zone */
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ /* free stack */
+ FT_FREE( exec->stack );
+ exec->stackSize = 0;
+
+ /* free call stack */
+ FT_FREE( exec->callStack );
+ exec->callSize = 0;
+ exec->callTop = 0;
+
+ /* free glyph code range */
+ FT_FREE( exec->glyphIns );
+ exec->glyphSize = 0;
+
+ exec->size = NULL;
+ exec->face = NULL;
+
+ FT_FREE( exec );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Init_Context */
+ /* */
+ /* <Description> */
+ /* Initializes a context object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* <InOut> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ Init_Context( TT_ExecContext exec,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
+
+ exec->memory = memory;
+ exec->callSize = 32;
+
+ if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
+ goto Fail_Memory;
+
+ /* all values in the context are set to 0 already, but this is */
+ /* here as a remainder */
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ exec->stackSize = 0;
+ exec->glyphSize = 0;
+
+ exec->stack = NULL;
+ exec->glyphIns = NULL;
+
+ exec->face = NULL;
+ exec->size = NULL;
+
+ return FT_Err_Ok;
+
+ Fail_Memory:
+ FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
+ TT_Done_Context( exec );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Update_Max */
+ /* */
+ /* <Description> */
+ /* Checks the size of a buffer and reallocates it if necessary. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* multiplier :: The size in bytes of each element in the buffer. */
+ /* */
+ /* new_max :: The new capacity (size) of the buffer. */
+ /* */
+ /* <InOut> */
+ /* size :: The address of the buffer's current size expressed */
+ /* in elements. */
+ /* */
+ /* buff :: The address of the buffer base pointer. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Update_Max( FT_Memory memory,
+ FT_ULong* size,
+ FT_Long multiplier,
+ void* _pbuff,
+ FT_ULong new_max )
+ {
+ FT_Error error;
+ void** pbuff = (void**)_pbuff;
+
+
+ if ( *size < new_max )
+ {
+ if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
+ return error;
+ *size = new_max;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Load_Context */
+ /* */
+ /* <Description> */
+ /* Prepare an execution context for glyph hinting. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* size :: A handle to the source size object. */
+ /* */
+ /* <InOut> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Load_Context( TT_ExecContext exec,
+ TT_Face face,
+ TT_Size size )
+ {
+ FT_Int i;
+ FT_ULong tmp;
+ TT_MaxProfile* maxp;
+ FT_Error error;
+
+
+ exec->face = face;
+ maxp = &face->max_profile;
+ exec->size = size;
+
+ if ( size )
+ {
+ exec->numFDefs = size->num_function_defs;
+ exec->maxFDefs = size->max_function_defs;
+ exec->numIDefs = size->num_instruction_defs;
+ exec->maxIDefs = size->max_instruction_defs;
+ exec->FDefs = size->function_defs;
+ exec->IDefs = size->instruction_defs;
+ exec->tt_metrics = size->ttmetrics;
+ exec->metrics = size->metrics;
+
+ exec->maxFunc = size->max_func;
+ exec->maxIns = size->max_ins;
+
+ for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+ exec->codeRangeTable[i] = size->codeRangeTable[i];
+
+ /* set graphics state */
+ exec->GS = size->GS;
+
+ exec->cvtSize = size->cvt_size;
+ exec->cvt = size->cvt;
+
+ exec->storeSize = size->storage_size;
+ exec->storage = size->storage;
+
+ exec->twilight = size->twilight;
+
+ /* In case of multi-threading it can happen that the old size object */
+ /* no longer exists, thus we must clear all glyph zone references. */
+ ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
+ exec->zp1 = exec->zp0;
+ exec->zp2 = exec->zp0;
+ }
+
+ /* XXX: We reserve a little more elements on the stack to deal safely */
+ /* with broken fonts like arialbs, courbs, timesbs, etc. */
+ tmp = exec->stackSize;
+ error = Update_Max( exec->memory,
+ &tmp,
+ sizeof ( FT_F26Dot6 ),
+ (void*)&exec->stack,
+ maxp->maxStackElements + 32 );
+ exec->stackSize = (FT_UInt)tmp;
+ if ( error )
+ return error;
+
+ tmp = exec->glyphSize;
+ error = Update_Max( exec->memory,
+ &tmp,
+ sizeof ( FT_Byte ),
+ (void*)&exec->glyphIns,
+ maxp->maxSizeOfInstructions );
+ exec->glyphSize = (FT_UShort)tmp;
+ if ( error )
+ return error;
+
+ exec->pts.n_points = 0;
+ exec->pts.n_contours = 0;
+
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+ exec->zp0 = exec->pts;
+
+ exec->instruction_trap = FALSE;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Save_Context */
+ /* */
+ /* <Description> */
+ /* Saves the code ranges in a `size' object. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the source execution context. */
+ /* */
+ /* <InOut> */
+ /* size :: A handle to the target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Save_Context( TT_ExecContext exec,
+ TT_Size size )
+ {
+ FT_Int i;
+
+
+ /* XXX: Will probably disappear soon with all the code range */
+ /* management, which is now rather obsolete. */
+ /* */
+ size->num_function_defs = exec->numFDefs;
+ size->num_instruction_defs = exec->numIDefs;
+
+ size->max_func = exec->maxFunc;
+ size->max_ins = exec->maxIns;
+
+ for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+ size->codeRangeTable[i] = exec->codeRangeTable[i];
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Run_Context */
+ /* */
+ /* <Description> */
+ /* Executes one or more instructions in the execution context. */
+ /* */
+ /* <Input> */
+ /* debug :: A Boolean flag. If set, the function sets some internal */
+ /* variables and returns immediately, otherwise TT_RunIns() */
+ /* is called. */
+ /* */
+ /* This is commented out currently. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* TrueType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Run_Context( TT_ExecContext exec,
+ FT_Bool debug )
+ {
+ FT_Error error;
+
+
+ if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
+ != FT_Err_Ok )
+ return error;
+
+ exec->zp0 = exec->pts;
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+
+ exec->GS.gep0 = 1;
+ exec->GS.gep1 = 1;
+ exec->GS.gep2 = 1;
+
+ exec->GS.projVector.x = 0x4000;
+ exec->GS.projVector.y = 0x0000;
+
+ exec->GS.freeVector = exec->GS.projVector;
+ exec->GS.dualVector = exec->GS.projVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ exec->GS.both_x_axis = TRUE;
+#endif
+
+ exec->GS.round_state = 1;
+ exec->GS.loop = 1;
+
+ /* some glyphs leave something on the stack. so we clean it */
+ /* before a new execution. */
+ exec->top = 0;
+ exec->callTop = 0;
+
+#if 1
+ FT_UNUSED( debug );
+
+ return exec->face->interpreter( exec );
+#else
+ if ( !debug )
+ return TT_RunIns( exec );
+ else
+ return FT_Err_Ok;
+#endif
+ }
+
+
+ /* The default value for `scan_control' is documented as FALSE in the */
+ /* TrueType specification. This is confusing since it implies a */
+ /* Boolean value. However, this is not the case, thus both the */
+ /* default values of our `scan_type' and `scan_control' fields (which */
+ /* the documentation's `scan_control' variable is split into) are */
+ /* zero. */
+
+ const TT_GraphicsState tt_default_graphics_state =
+ {
+ 0, 0, 0,
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ TRUE,
+#endif
+
+ 1, 64, 1,
+ TRUE, 68, 0, 0, 9, 3,
+ 0, FALSE, 0, 1, 1, 1
+ };
+
+
+ /* documentation is in ttinterp.h */
+
+ FT_EXPORT_DEF( TT_ExecContext )
+ TT_New_Context( TT_Driver driver )
+ {
+ TT_ExecContext exec;
+ FT_Memory memory;
+
+
+ memory = driver->root.root.memory;
+ exec = driver->context;
+
+ if ( !driver->context )
+ {
+ FT_Error error;
+
+
+ /* allocate object */
+ if ( FT_NEW( exec ) )
+ goto Fail;
+
+ /* initialize it; in case of error this deallocates `exec' too */
+ error = Init_Context( exec, memory );
+ if ( error )
+ goto Fail;
+
+ /* store it into the driver */
+ driver->context = exec;
+ }
+
+ return driver->context;
+
+ Fail:
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Before an opcode is executed, the interpreter verifies that there are */
+ /* enough arguments on the stack, with the help of the `Pop_Push_Count' */
+ /* table. */
+ /* */
+ /* For each opcode, the first column gives the number of arguments that */
+ /* are popped from the stack; the second one gives the number of those */
+ /* that are pushed in result. */
+ /* */
+ /* Opcodes which have a varying number of parameters in the data stream */
+ /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
+ /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */
+ /* to zero. */
+ /* */
+ /*************************************************************************/
+
+
+#undef PACK
+#define PACK( x, y ) ( ( x << 4 ) | y )
+
+
+ static
+ const FT_Byte Pop_Push_Count[256] =
+ {
+ /* opcodes are gathered in groups of 16 */
+ /* please keep the spaces as they are */
+
+ /* SVTCA y */ PACK( 0, 0 ),
+ /* SVTCA x */ PACK( 0, 0 ),
+ /* SPvTCA y */ PACK( 0, 0 ),
+ /* SPvTCA x */ PACK( 0, 0 ),
+ /* SFvTCA y */ PACK( 0, 0 ),
+ /* SFvTCA x */ PACK( 0, 0 ),
+ /* SPvTL // */ PACK( 2, 0 ),
+ /* SPvTL + */ PACK( 2, 0 ),
+ /* SFvTL // */ PACK( 2, 0 ),
+ /* SFvTL + */ PACK( 2, 0 ),
+ /* SPvFS */ PACK( 2, 0 ),
+ /* SFvFS */ PACK( 2, 0 ),
+ /* GPV */ PACK( 0, 2 ),
+ /* GFV */ PACK( 0, 2 ),
+ /* SFvTPv */ PACK( 0, 0 ),
+ /* ISECT */ PACK( 5, 0 ),
+
+ /* SRP0 */ PACK( 1, 0 ),
+ /* SRP1 */ PACK( 1, 0 ),
+ /* SRP2 */ PACK( 1, 0 ),
+ /* SZP0 */ PACK( 1, 0 ),
+ /* SZP1 */ PACK( 1, 0 ),
+ /* SZP2 */ PACK( 1, 0 ),
+ /* SZPS */ PACK( 1, 0 ),
+ /* SLOOP */ PACK( 1, 0 ),
+ /* RTG */ PACK( 0, 0 ),
+ /* RTHG */ PACK( 0, 0 ),
+ /* SMD */ PACK( 1, 0 ),
+ /* ELSE */ PACK( 0, 0 ),
+ /* JMPR */ PACK( 1, 0 ),
+ /* SCvTCi */ PACK( 1, 0 ),
+ /* SSwCi */ PACK( 1, 0 ),
+ /* SSW */ PACK( 1, 0 ),
+
+ /* DUP */ PACK( 1, 2 ),
+ /* POP */ PACK( 1, 0 ),
+ /* CLEAR */ PACK( 0, 0 ),
+ /* SWAP */ PACK( 2, 2 ),
+ /* DEPTH */ PACK( 0, 1 ),
+ /* CINDEX */ PACK( 1, 1 ),
+ /* MINDEX */ PACK( 1, 0 ),
+ /* AlignPTS */ PACK( 2, 0 ),
+ /* INS_$28 */ PACK( 0, 0 ),
+ /* UTP */ PACK( 1, 0 ),
+ /* LOOPCALL */ PACK( 2, 0 ),
+ /* CALL */ PACK( 1, 0 ),
+ /* FDEF */ PACK( 1, 0 ),
+ /* ENDF */ PACK( 0, 0 ),
+ /* MDAP[0] */ PACK( 1, 0 ),
+ /* MDAP[1] */ PACK( 1, 0 ),
+
+ /* IUP[0] */ PACK( 0, 0 ),
+ /* IUP[1] */ PACK( 0, 0 ),
+ /* SHP[0] */ PACK( 0, 0 ),
+ /* SHP[1] */ PACK( 0, 0 ),
+ /* SHC[0] */ PACK( 1, 0 ),
+ /* SHC[1] */ PACK( 1, 0 ),
+ /* SHZ[0] */ PACK( 1, 0 ),
+ /* SHZ[1] */ PACK( 1, 0 ),
+ /* SHPIX */ PACK( 1, 0 ),
+ /* IP */ PACK( 0, 0 ),
+ /* MSIRP[0] */ PACK( 2, 0 ),
+ /* MSIRP[1] */ PACK( 2, 0 ),
+ /* AlignRP */ PACK( 0, 0 ),
+ /* RTDG */ PACK( 0, 0 ),
+ /* MIAP[0] */ PACK( 2, 0 ),
+ /* MIAP[1] */ PACK( 2, 0 ),
+
+ /* NPushB */ PACK( 0, 0 ),
+ /* NPushW */ PACK( 0, 0 ),
+ /* WS */ PACK( 2, 0 ),
+ /* RS */ PACK( 1, 1 ),
+ /* WCvtP */ PACK( 2, 0 ),
+ /* RCvt */ PACK( 1, 1 ),
+ /* GC[0] */ PACK( 1, 1 ),
+ /* GC[1] */ PACK( 1, 1 ),
+ /* SCFS */ PACK( 2, 0 ),
+ /* MD[0] */ PACK( 2, 1 ),
+ /* MD[1] */ PACK( 2, 1 ),
+ /* MPPEM */ PACK( 0, 1 ),
+ /* MPS */ PACK( 0, 1 ),
+ /* FlipON */ PACK( 0, 0 ),
+ /* FlipOFF */ PACK( 0, 0 ),
+ /* DEBUG */ PACK( 1, 0 ),
+
+ /* LT */ PACK( 2, 1 ),
+ /* LTEQ */ PACK( 2, 1 ),
+ /* GT */ PACK( 2, 1 ),
+ /* GTEQ */ PACK( 2, 1 ),
+ /* EQ */ PACK( 2, 1 ),
+ /* NEQ */ PACK( 2, 1 ),
+ /* ODD */ PACK( 1, 1 ),
+ /* EVEN */ PACK( 1, 1 ),
+ /* IF */ PACK( 1, 0 ),
+ /* EIF */ PACK( 0, 0 ),
+ /* AND */ PACK( 2, 1 ),
+ /* OR */ PACK( 2, 1 ),
+ /* NOT */ PACK( 1, 1 ),
+ /* DeltaP1 */ PACK( 1, 0 ),
+ /* SDB */ PACK( 1, 0 ),
+ /* SDS */ PACK( 1, 0 ),
+
+ /* ADD */ PACK( 2, 1 ),
+ /* SUB */ PACK( 2, 1 ),
+ /* DIV */ PACK( 2, 1 ),
+ /* MUL */ PACK( 2, 1 ),
+ /* ABS */ PACK( 1, 1 ),
+ /* NEG */ PACK( 1, 1 ),
+ /* FLOOR */ PACK( 1, 1 ),
+ /* CEILING */ PACK( 1, 1 ),
+ /* ROUND[0] */ PACK( 1, 1 ),
+ /* ROUND[1] */ PACK( 1, 1 ),
+ /* ROUND[2] */ PACK( 1, 1 ),
+ /* ROUND[3] */ PACK( 1, 1 ),
+ /* NROUND[0] */ PACK( 1, 1 ),
+ /* NROUND[1] */ PACK( 1, 1 ),
+ /* NROUND[2] */ PACK( 1, 1 ),
+ /* NROUND[3] */ PACK( 1, 1 ),
+
+ /* WCvtF */ PACK( 2, 0 ),
+ /* DeltaP2 */ PACK( 1, 0 ),
+ /* DeltaP3 */ PACK( 1, 0 ),
+ /* DeltaCn[0] */ PACK( 1, 0 ),
+ /* DeltaCn[1] */ PACK( 1, 0 ),
+ /* DeltaCn[2] */ PACK( 1, 0 ),
+ /* SROUND */ PACK( 1, 0 ),
+ /* S45Round */ PACK( 1, 0 ),
+ /* JROT */ PACK( 2, 0 ),
+ /* JROF */ PACK( 2, 0 ),
+ /* ROFF */ PACK( 0, 0 ),
+ /* INS_$7B */ PACK( 0, 0 ),
+ /* RUTG */ PACK( 0, 0 ),
+ /* RDTG */ PACK( 0, 0 ),
+ /* SANGW */ PACK( 1, 0 ),
+ /* AA */ PACK( 1, 0 ),
+
+ /* FlipPT */ PACK( 0, 0 ),
+ /* FlipRgON */ PACK( 2, 0 ),
+ /* FlipRgOFF */ PACK( 2, 0 ),
+ /* INS_$83 */ PACK( 0, 0 ),
+ /* INS_$84 */ PACK( 0, 0 ),
+ /* ScanCTRL */ PACK( 1, 0 ),
+ /* SDPVTL[0] */ PACK( 2, 0 ),
+ /* SDPVTL[1] */ PACK( 2, 0 ),
+ /* GetINFO */ PACK( 1, 1 ),
+ /* IDEF */ PACK( 1, 0 ),
+ /* ROLL */ PACK( 3, 3 ),
+ /* MAX */ PACK( 2, 1 ),
+ /* MIN */ PACK( 2, 1 ),
+ /* ScanTYPE */ PACK( 1, 0 ),
+ /* InstCTRL */ PACK( 2, 0 ),
+ /* INS_$8F */ PACK( 0, 0 ),
+
+ /* INS_$90 */ PACK( 0, 0 ),
+ /* INS_$91 */ PACK( 0, 0 ),
+ /* INS_$92 */ PACK( 0, 0 ),
+ /* INS_$93 */ PACK( 0, 0 ),
+ /* INS_$94 */ PACK( 0, 0 ),
+ /* INS_$95 */ PACK( 0, 0 ),
+ /* INS_$96 */ PACK( 0, 0 ),
+ /* INS_$97 */ PACK( 0, 0 ),
+ /* INS_$98 */ PACK( 0, 0 ),
+ /* INS_$99 */ PACK( 0, 0 ),
+ /* INS_$9A */ PACK( 0, 0 ),
+ /* INS_$9B */ PACK( 0, 0 ),
+ /* INS_$9C */ PACK( 0, 0 ),
+ /* INS_$9D */ PACK( 0, 0 ),
+ /* INS_$9E */ PACK( 0, 0 ),
+ /* INS_$9F */ PACK( 0, 0 ),
+
+ /* INS_$A0 */ PACK( 0, 0 ),
+ /* INS_$A1 */ PACK( 0, 0 ),
+ /* INS_$A2 */ PACK( 0, 0 ),
+ /* INS_$A3 */ PACK( 0, 0 ),
+ /* INS_$A4 */ PACK( 0, 0 ),
+ /* INS_$A5 */ PACK( 0, 0 ),
+ /* INS_$A6 */ PACK( 0, 0 ),
+ /* INS_$A7 */ PACK( 0, 0 ),
+ /* INS_$A8 */ PACK( 0, 0 ),
+ /* INS_$A9 */ PACK( 0, 0 ),
+ /* INS_$AA */ PACK( 0, 0 ),
+ /* INS_$AB */ PACK( 0, 0 ),
+ /* INS_$AC */ PACK( 0, 0 ),
+ /* INS_$AD */ PACK( 0, 0 ),
+ /* INS_$AE */ PACK( 0, 0 ),
+ /* INS_$AF */ PACK( 0, 0 ),
+
+ /* PushB[0] */ PACK( 0, 1 ),
+ /* PushB[1] */ PACK( 0, 2 ),
+ /* PushB[2] */ PACK( 0, 3 ),
+ /* PushB[3] */ PACK( 0, 4 ),
+ /* PushB[4] */ PACK( 0, 5 ),
+ /* PushB[5] */ PACK( 0, 6 ),
+ /* PushB[6] */ PACK( 0, 7 ),
+ /* PushB[7] */ PACK( 0, 8 ),
+ /* PushW[0] */ PACK( 0, 1 ),
+ /* PushW[1] */ PACK( 0, 2 ),
+ /* PushW[2] */ PACK( 0, 3 ),
+ /* PushW[3] */ PACK( 0, 4 ),
+ /* PushW[4] */ PACK( 0, 5 ),
+ /* PushW[5] */ PACK( 0, 6 ),
+ /* PushW[6] */ PACK( 0, 7 ),
+ /* PushW[7] */ PACK( 0, 8 ),
+
+ /* MDRP[00] */ PACK( 1, 0 ),
+ /* MDRP[01] */ PACK( 1, 0 ),
+ /* MDRP[02] */ PACK( 1, 0 ),
+ /* MDRP[03] */ PACK( 1, 0 ),
+ /* MDRP[04] */ PACK( 1, 0 ),
+ /* MDRP[05] */ PACK( 1, 0 ),
+ /* MDRP[06] */ PACK( 1, 0 ),
+ /* MDRP[07] */ PACK( 1, 0 ),
+ /* MDRP[08] */ PACK( 1, 0 ),
+ /* MDRP[09] */ PACK( 1, 0 ),
+ /* MDRP[10] */ PACK( 1, 0 ),
+ /* MDRP[11] */ PACK( 1, 0 ),
+ /* MDRP[12] */ PACK( 1, 0 ),
+ /* MDRP[13] */ PACK( 1, 0 ),
+ /* MDRP[14] */ PACK( 1, 0 ),
+ /* MDRP[15] */ PACK( 1, 0 ),
+
+ /* MDRP[16] */ PACK( 1, 0 ),
+ /* MDRP[17] */ PACK( 1, 0 ),
+ /* MDRP[18] */ PACK( 1, 0 ),
+ /* MDRP[19] */ PACK( 1, 0 ),
+ /* MDRP[20] */ PACK( 1, 0 ),
+ /* MDRP[21] */ PACK( 1, 0 ),
+ /* MDRP[22] */ PACK( 1, 0 ),
+ /* MDRP[23] */ PACK( 1, 0 ),
+ /* MDRP[24] */ PACK( 1, 0 ),
+ /* MDRP[25] */ PACK( 1, 0 ),
+ /* MDRP[26] */ PACK( 1, 0 ),
+ /* MDRP[27] */ PACK( 1, 0 ),
+ /* MDRP[28] */ PACK( 1, 0 ),
+ /* MDRP[29] */ PACK( 1, 0 ),
+ /* MDRP[30] */ PACK( 1, 0 ),
+ /* MDRP[31] */ PACK( 1, 0 ),
+
+ /* MIRP[00] */ PACK( 2, 0 ),
+ /* MIRP[01] */ PACK( 2, 0 ),
+ /* MIRP[02] */ PACK( 2, 0 ),
+ /* MIRP[03] */ PACK( 2, 0 ),
+ /* MIRP[04] */ PACK( 2, 0 ),
+ /* MIRP[05] */ PACK( 2, 0 ),
+ /* MIRP[06] */ PACK( 2, 0 ),
+ /* MIRP[07] */ PACK( 2, 0 ),
+ /* MIRP[08] */ PACK( 2, 0 ),
+ /* MIRP[09] */ PACK( 2, 0 ),
+ /* MIRP[10] */ PACK( 2, 0 ),
+ /* MIRP[11] */ PACK( 2, 0 ),
+ /* MIRP[12] */ PACK( 2, 0 ),
+ /* MIRP[13] */ PACK( 2, 0 ),
+ /* MIRP[14] */ PACK( 2, 0 ),
+ /* MIRP[15] */ PACK( 2, 0 ),
+
+ /* MIRP[16] */ PACK( 2, 0 ),
+ /* MIRP[17] */ PACK( 2, 0 ),
+ /* MIRP[18] */ PACK( 2, 0 ),
+ /* MIRP[19] */ PACK( 2, 0 ),
+ /* MIRP[20] */ PACK( 2, 0 ),
+ /* MIRP[21] */ PACK( 2, 0 ),
+ /* MIRP[22] */ PACK( 2, 0 ),
+ /* MIRP[23] */ PACK( 2, 0 ),
+ /* MIRP[24] */ PACK( 2, 0 ),
+ /* MIRP[25] */ PACK( 2, 0 ),
+ /* MIRP[26] */ PACK( 2, 0 ),
+ /* MIRP[27] */ PACK( 2, 0 ),
+ /* MIRP[28] */ PACK( 2, 0 ),
+ /* MIRP[29] */ PACK( 2, 0 ),
+ /* MIRP[30] */ PACK( 2, 0 ),
+ /* MIRP[31] */ PACK( 2, 0 )
+ };
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ static
+ const char* const opcode_name[256] =
+ {
+ "SVTCA y",
+ "SVTCA x",
+ "SPvTCA y",
+ "SPvTCA x",
+ "SFvTCA y",
+ "SFvTCA x",
+ "SPvTL ||",
+ "SPvTL +",
+ "SFvTL ||",
+ "SFvTL +",
+ "SPvFS",
+ "SFvFS",
+ "GPV",
+ "GFV",
+ "SFvTPv",
+ "ISECT",
+
+ "SRP0",
+ "SRP1",
+ "SRP2",
+ "SZP0",
+ "SZP1",
+ "SZP2",
+ "SZPS",
+ "SLOOP",
+ "RTG",
+ "RTHG",
+ "SMD",
+ "ELSE",
+ "JMPR",
+ "SCvTCi",
+ "SSwCi",
+ "SSW",
+
+ "DUP",
+ "POP",
+ "CLEAR",
+ "SWAP",
+ "DEPTH",
+ "CINDEX",
+ "MINDEX",
+ "AlignPTS",
+ "INS_$28",
+ "UTP",
+ "LOOPCALL",
+ "CALL",
+ "FDEF",
+ "ENDF",
+ "MDAP[0]",
+ "MDAP[1]",
+
+ "IUP[0]",
+ "IUP[1]",
+ "SHP[0]",
+ "SHP[1]",
+ "SHC[0]",
+ "SHC[1]",
+ "SHZ[0]",
+ "SHZ[1]",
+ "SHPIX",
+ "IP",
+ "MSIRP[0]",
+ "MSIRP[1]",
+ "AlignRP",
+ "RTDG",
+ "MIAP[0]",
+ "MIAP[1]",
+
+ "NPushB",
+ "NPushW",
+ "WS",
+ "RS",
+ "WCvtP",
+ "RCvt",
+ "GC[0]",
+ "GC[1]",
+ "SCFS",
+ "MD[0]",
+ "MD[1]",
+ "MPPEM",
+ "MPS",
+ "FlipON",
+ "FlipOFF",
+ "DEBUG",
+
+ "LT",
+ "LTEQ",
+ "GT",
+ "GTEQ",
+ "EQ",
+ "NEQ",
+ "ODD",
+ "EVEN",
+ "IF",
+ "EIF",
+ "AND",
+ "OR",
+ "NOT",
+ "DeltaP1",
+ "SDB",
+ "SDS",
+
+ "ADD",
+ "SUB",
+ "DIV",
+ "MUL",
+ "ABS",
+ "NEG",
+ "FLOOR",
+ "CEILING",
+ "ROUND[0]",
+ "ROUND[1]",
+ "ROUND[2]",
+ "ROUND[3]",
+ "NROUND[0]",
+ "NROUND[1]",
+ "NROUND[2]",
+ "NROUND[3]",
+
+ "WCvtF",
+ "DeltaP2",
+ "DeltaP3",
+ "DeltaCn[0]",
+ "DeltaCn[1]",
+ "DeltaCn[2]",
+ "SROUND",
+ "S45Round",
+ "JROT",
+ "JROF",
+ "ROFF",
+ "INS_$7B",
+ "RUTG",
+ "RDTG",
+ "SANGW",
+ "AA",
+
+ "FlipPT",
+ "FlipRgON",
+ "FlipRgOFF",
+ "INS_$83",
+ "INS_$84",
+ "ScanCTRL",
+ "SDVPTL[0]",
+ "SDVPTL[1]",
+ "GetINFO",
+ "IDEF",
+ "ROLL",
+ "MAX",
+ "MIN",
+ "ScanTYPE",
+ "InstCTRL",
+ "INS_$8F",
+
+ "INS_$90",
+ "INS_$91",
+ "INS_$92",
+ "INS_$93",
+ "INS_$94",
+ "INS_$95",
+ "INS_$96",
+ "INS_$97",
+ "INS_$98",
+ "INS_$99",
+ "INS_$9A",
+ "INS_$9B",
+ "INS_$9C",
+ "INS_$9D",
+ "INS_$9E",
+ "INS_$9F",
+
+ "INS_$A0",
+ "INS_$A1",
+ "INS_$A2",
+ "INS_$A3",
+ "INS_$A4",
+ "INS_$A5",
+ "INS_$A6",
+ "INS_$A7",
+ "INS_$A8",
+ "INS_$A9",
+ "INS_$AA",
+ "INS_$AB",
+ "INS_$AC",
+ "INS_$AD",
+ "INS_$AE",
+ "INS_$AF",
+
+ "PushB[0]",
+ "PushB[1]",
+ "PushB[2]",
+ "PushB[3]",
+ "PushB[4]",
+ "PushB[5]",
+ "PushB[6]",
+ "PushB[7]",
+ "PushW[0]",
+ "PushW[1]",
+ "PushW[2]",
+ "PushW[3]",
+ "PushW[4]",
+ "PushW[5]",
+ "PushW[6]",
+ "PushW[7]",
+
+ "MDRP[00]",
+ "MDRP[01]",
+ "MDRP[02]",
+ "MDRP[03]",
+ "MDRP[04]",
+ "MDRP[05]",
+ "MDRP[06]",
+ "MDRP[07]",
+ "MDRP[08]",
+ "MDRP[09]",
+ "MDRP[10]",
+ "MDRP[11]",
+ "MDRP[12]",
+ "MDRP[13]",
+ "MDRP[14]",
+ "MDRP[15]",
+
+ "MDRP[16]",
+ "MDRP[17]",
+ "MDRP[18]",
+ "MDRP[19]",
+ "MDRP[20]",
+ "MDRP[21]",
+ "MDRP[22]",
+ "MDRP[23]",
+ "MDRP[24]",
+ "MDRP[25]",
+ "MDRP[26]",
+ "MDRP[27]",
+ "MDRP[28]",
+ "MDRP[29]",
+ "MDRP[30]",
+ "MDRP[31]",
+
+ "MIRP[00]",
+ "MIRP[01]",
+ "MIRP[02]",
+ "MIRP[03]",
+ "MIRP[04]",
+ "MIRP[05]",
+ "MIRP[06]",
+ "MIRP[07]",
+ "MIRP[08]",
+ "MIRP[09]",
+ "MIRP[10]",
+ "MIRP[11]",
+ "MIRP[12]",
+ "MIRP[13]",
+ "MIRP[14]",
+ "MIRP[15]",
+
+ "MIRP[16]",
+ "MIRP[17]",
+ "MIRP[18]",
+ "MIRP[19]",
+ "MIRP[20]",
+ "MIRP[21]",
+ "MIRP[22]",
+ "MIRP[23]",
+ "MIRP[24]",
+ "MIRP[25]",
+ "MIRP[26]",
+ "MIRP[27]",
+ "MIRP[28]",
+ "MIRP[29]",
+ "MIRP[30]",
+ "MIRP[31]"
+ };
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ static
+ const FT_Char opcode_length[256] =
+ {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+ };
+
+#undef PACK
+
+#if 1
+
+ static FT_Int32
+ TT_MulFix14( FT_Int32 a,
+ FT_Int b )
+ {
+ FT_Int32 sign;
+ FT_UInt32 ah, al, mid, lo, hi;
+
+
+ sign = a ^ b;
+
+ if ( a < 0 )
+ a = -a;
+ if ( b < 0 )
+ b = -b;
+
+ ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
+ al = (FT_UInt32)( a & 0xFFFFU );
+
+ lo = al * b;
+ mid = ah * b;
+ hi = mid >> 16;
+ mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
+ lo += mid;
+ if ( lo < mid )
+ hi += 1;
+
+ mid = ( lo >> 14 ) | ( hi << 18 );
+
+ return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+ }
+
+#else
+
+ /* compute (a*b)/2^14 with maximum accuracy and rounding */
+ static FT_Int32
+ TT_MulFix14( FT_Int32 a,
+ FT_Int b )
+ {
+ FT_Int32 m, s, hi;
+ FT_UInt32 l, lo;
+
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+ m = ( a >> 16 ) * b;
+
+ lo = l + ( (FT_UInt32)m << 16 );
+ hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
+
+ /* divide the result by 2^14 with rounding */
+ s = hi >> 31;
+ l = lo + (FT_UInt32)s;
+ hi += s + ( l < lo );
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += l < lo;
+
+ return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+ }
+#endif
+
+
+ /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
+ static FT_Int32
+ TT_DotFix14( FT_Int32 ax,
+ FT_Int32 ay,
+ FT_Int bx,
+ FT_Int by )
+ {
+ FT_Int32 m, s, hi1, hi2, hi;
+ FT_UInt32 l, lo1, lo2, lo;
+
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
+ m = ( ax >> 16 ) * bx;
+
+ lo1 = l + ( (FT_UInt32)m << 16 );
+ hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
+
+ /* compute ay*by as 64-bit value */
+ l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
+ m = ( ay >> 16 ) * by;
+
+ lo2 = l + ( (FT_UInt32)m << 16 );
+ hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
+
+ /* add them */
+ lo = lo1 + lo2;
+ hi = hi1 + hi2 + ( lo < lo1 );
+
+ /* divide the result by 2^14 with rounding */
+ s = hi >> 31;
+ l = lo + (FT_UInt32)s;
+ hi += s + ( l < lo );
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += ( l < lo );
+
+ return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Current_Ratio */
+ /* */
+ /* <Description> */
+ /* Returns the current aspect ratio scaling factor depending on the */
+ /* projection vector's state and device resolutions. */
+ /* */
+ /* <Return> */
+ /* The aspect ratio in 16.16 format, always <= 1.0 . */
+ /* */
+ static FT_Long
+ Current_Ratio( EXEC_OP )
+ {
+ if ( !CUR.tt_metrics.ratio )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+ else
+ CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+ }
+ else
+#endif
+ {
+ if ( CUR.GS.projVector.y == 0 )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+
+ else if ( CUR.GS.projVector.x == 0 )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+
+ else
+ {
+ FT_F26Dot6 x, y;
+
+
+ x = TT_MulFix14( CUR.tt_metrics.x_ratio,
+ CUR.GS.projVector.x );
+ y = TT_MulFix14( CUR.tt_metrics.y_ratio,
+ CUR.GS.projVector.y );
+ CUR.tt_metrics.ratio = FT_Hypot( x, y );
+ }
+ }
+ }
+ return CUR.tt_metrics.ratio;
+ }
+
+
+ static FT_Long
+ Current_Ppem( EXEC_OP )
+ {
+ return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Functions related to the control value table (CVT). */
+ /* */
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_F26Dot6 )
+ Read_CVT( EXEC_OP_ FT_ULong idx )
+ {
+ return CUR.cvt[idx];
+ }
+
+
+ FT_CALLBACK_DEF( FT_F26Dot6 )
+ Read_CVT_Stretched( EXEC_OP_ FT_ULong idx )
+ {
+ return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Write_CVT( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] = value;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Write_CVT_Stretched( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Move_CVT( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] += value;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Move_CVT_Stretched( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* GetShortIns */
+ /* */
+ /* <Description> */
+ /* Returns a short integer taken from the instruction stream at */
+ /* address IP. */
+ /* */
+ /* <Return> */
+ /* Short read at code[IP]. */
+ /* */
+ /* <Note> */
+ /* This one could become a macro. */
+ /* */
+ static FT_Short
+ GetShortIns( EXEC_OP )
+ {
+ /* Reading a byte stream so there is no endianess (DaveP) */
+ CUR.IP += 2;
+ return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
+ CUR.code[CUR.IP - 1] );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Ins_Goto_CodeRange */
+ /* */
+ /* <Description> */
+ /* Goes to a certain code range in the instruction stream. */
+ /* */
+ /* <Input> */
+ /* aRange :: The index of the code range. */
+ /* */
+ /* aIP :: The new IP address in the code range. */
+ /* */
+ /* <Return> */
+ /* SUCCESS or FAILURE. */
+ /* */
+ static FT_Bool
+ Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange,
+ FT_ULong aIP )
+ {
+ TT_CodeRange* range;
+
+
+ if ( aRange < 1 || aRange > 3 )
+ {
+ CUR.error = FT_THROW( Bad_Argument );
+ return FAILURE;
+ }
+
+ range = &CUR.codeRangeTable[aRange - 1];
+
+ if ( range->base == NULL ) /* invalid coderange */
+ {
+ CUR.error = FT_THROW( Invalid_CodeRange );
+ return FAILURE;
+ }
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for aIP <= Size, instead of aIP < Size. */
+
+ if ( aIP > range->size )
+ {
+ CUR.error = FT_THROW( Code_Overflow );
+ return FAILURE;
+ }
+
+ CUR.code = range->base;
+ CUR.codeSize = range->size;
+ CUR.IP = aIP;
+ CUR.curRange = aRange;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Direct_Move */
+ /* */
+ /* <Description> */
+ /* Moves a point by a given distance along the freedom vector. The */
+ /* point will be `touched'. */
+ /* */
+ /* <Input> */
+ /* point :: The index of the point to move. */
+ /* */
+ /* distance :: The distance to apply. */
+ /* */
+ /* <InOut> */
+ /* zone :: The affected glyph zone. */
+ /* */
+ static void
+ Direct_Move( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_F26Dot6 v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ v = CUR.GS.freeVector.x;
+
+ if ( v != 0 )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( !SUBPIXEL_HINTING ||
+ ( !CUR.ignore_x_mode ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+ v = CUR.GS.freeVector.y;
+
+ if ( v != 0 )
+ {
+ zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Direct_Move_Orig */
+ /* */
+ /* <Description> */
+ /* Moves the *original* position of a point by a given distance along */
+ /* the freedom vector. Obviously, the point will not be `touched'. */
+ /* */
+ /* <Input> */
+ /* point :: The index of the point to move. */
+ /* */
+ /* distance :: The distance to apply. */
+ /* */
+ /* <InOut> */
+ /* zone :: The affected glyph zone. */
+ /* */
+ static void
+ Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_F26Dot6 v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ v = CUR.GS.freeVector.x;
+
+ if ( v != 0 )
+ zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ v = CUR.GS.freeVector.y;
+
+ if ( v != 0 )
+ zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Special versions of Direct_Move() */
+ /* */
+ /* The following versions are used whenever both vectors are both */
+ /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+ /* */
+ /*************************************************************************/
+
+
+ static void
+ Direct_Move_X( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( !SUBPIXEL_HINTING ||
+ !CUR.ignore_x_mode )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ zone->cur[point].x += distance;
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+
+ static void
+ Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->cur[point].y += distance;
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Special versions of Direct_Move_Orig() */
+ /* */
+ /* The following versions are used whenever both vectors are both */
+ /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+ /* */
+ /*************************************************************************/
+
+
+ static void
+ Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->org[point].x += distance;
+ }
+
+
+ static void
+ Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->org[point].y += distance;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_None */
+ /* */
+ /* <Description> */
+ /* Does not round, but adds engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance (not) to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* The compensated distance. */
+ /* */
+ /* <Note> */
+ /* The TrueType specification says very few about the relationship */
+ /* between rounding and engine compensation. However, it seems from */
+ /* the description of super round that we should add the compensation */
+ /* before rounding. */
+ /* */
+ static FT_F26Dot6
+ Round_None( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( distance && val < 0 )
+ val = 0;
+ }
+ else
+ {
+ val = distance - compensation;
+ if ( val > 0 )
+ val = 0;
+ }
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 32;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PIX_ROUND( compensation - distance );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Half_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to half grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = FT_PIX_FLOOR( distance + compensation ) + 32;
+ if ( distance && val < 0 )
+ val = 0;
+ }
+ else
+ {
+ val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Down_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value down to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( ( compensation - distance ) & -64 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Up_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value up to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 63;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PIX_CEIL( compensation - distance );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Double_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to double grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 16;
+ if ( distance && val > 0 )
+ val &= ~31;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PAD_ROUND( compensation - distance, 32 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Super */
+ /* */
+ /* <Description> */
+ /* Super-rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ /* <Note> */
+ /* The TrueType specification says very few about the relationship */
+ /* between rounding and engine compensation. However, it seems from */
+ /* the description of super round that we should add the compensation */
+ /* before rounding. */
+ /* */
+ static FT_F26Dot6
+ Round_Super( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ( distance - CUR.phase + CUR.threshold + compensation ) &
+ -CUR.period;
+ if ( distance && val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
+ -CUR.period );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Super_45 */
+ /* */
+ /* <Description> */
+ /* Super-rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ /* <Note> */
+ /* There is a separate function for Round_Super_45() as we may need */
+ /* greater precision. */
+ /* */
+ static FT_F26Dot6
+ Round_Super_45( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
+ CUR.period ) * CUR.period;
+ if ( distance && val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
+ CUR.period ) * CUR.period );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Compute_Round */
+ /* */
+ /* <Description> */
+ /* Sets the rounding mode. */
+ /* */
+ /* <Input> */
+ /* round_mode :: The rounding mode to be used. */
+ /* */
+ static void
+ Compute_Round( EXEC_OP_ FT_Byte round_mode )
+ {
+ switch ( round_mode )
+ {
+ case TT_Round_Off:
+ CUR.func_round = (TT_Round_Func)Round_None;
+ break;
+
+ case TT_Round_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Grid;
+ break;
+
+ case TT_Round_Up_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+ break;
+
+ case TT_Round_Down_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+ break;
+
+ case TT_Round_To_Half_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+ break;
+
+ case TT_Round_To_Double_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+ break;
+
+ case TT_Round_Super:
+ CUR.func_round = (TT_Round_Func)Round_Super;
+ break;
+
+ case TT_Round_Super_45:
+ CUR.func_round = (TT_Round_Func)Round_Super_45;
+ break;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* SetSuperRound */
+ /* */
+ /* <Description> */
+ /* Sets Super Round parameters. */
+ /* */
+ /* <Input> */
+ /* GridPeriod :: The grid period. */
+ /* */
+ /* selector :: The SROUND opcode. */
+ /* */
+ static void
+ SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod,
+ FT_Long selector )
+ {
+ switch ( (FT_Int)( selector & 0xC0 ) )
+ {
+ case 0:
+ CUR.period = GridPeriod / 2;
+ break;
+
+ case 0x40:
+ CUR.period = GridPeriod;
+ break;
+
+ case 0x80:
+ CUR.period = GridPeriod * 2;
+ break;
+
+ /* This opcode is reserved, but... */
+
+ case 0xC0:
+ CUR.period = GridPeriod;
+ break;
+ }
+
+ switch ( (FT_Int)( selector & 0x30 ) )
+ {
+ case 0:
+ CUR.phase = 0;
+ break;
+
+ case 0x10:
+ CUR.phase = CUR.period / 4;
+ break;
+
+ case 0x20:
+ CUR.phase = CUR.period / 2;
+ break;
+
+ case 0x30:
+ CUR.phase = CUR.period * 3 / 4;
+ break;
+ }
+
+ if ( ( selector & 0x0F ) == 0 )
+ CUR.threshold = CUR.period - 1;
+ else
+ CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
+
+ CUR.period /= 256;
+ CUR.phase /= 256;
+ CUR.threshold /= 256;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project */
+ /* */
+ /* <Description> */
+ /* Computes the projection of vector given by (v2-v1) along the */
+ /* current projection vector. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+ CUR.GS.projVector.x,
+ CUR.GS.projVector.y );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Dual_Project */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* current dual vector. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Dual_Project( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+ CUR.GS.dualVector.x,
+ CUR.GS.dualVector.y );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project_x */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* horizontal axis. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project_x( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_UNUSED_EXEC;
+ FT_UNUSED( dy );
+
+ return dx;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project_y */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* vertical axis. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project_y( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_UNUSED_EXEC;
+ FT_UNUSED( dx );
+
+ return dy;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Compute_Funcs */
+ /* */
+ /* <Description> */
+ /* Computes the projection and movement function pointers according */
+ /* to the current graphics state. */
+ /* */
+ static void
+ Compute_Funcs( EXEC_OP )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ /* If both vectors point rightwards along the x axis, set */
+ /* `both-x-axis' true, otherwise set it false. The x values only */
+ /* need be tested because the vector has been normalised to a unit */
+ /* vector of length 0x4000 = unity. */
+ CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
+ CUR.GS.freeVector.x == 0x4000 );
+
+ /* Throw away projection and freedom vector information */
+ /* because the patents don't allow them to be stored. */
+ /* The relevant US Patents are 5155805 and 5325479. */
+ CUR.GS.projVector.x = 0;
+ CUR.GS.projVector.y = 0;
+ CUR.GS.freeVector.x = 0;
+ CUR.GS.freeVector.y = 0;
+
+ if ( CUR.GS.both_x_axis )
+ {
+ CUR.func_project = Project_x;
+ CUR.func_move = Direct_Move_X;
+ CUR.func_move_orig = Direct_Move_Orig_X;
+ }
+ else
+ {
+ CUR.func_project = Project_y;
+ CUR.func_move = Direct_Move_Y;
+ CUR.func_move_orig = Direct_Move_Orig_Y;
+ }
+
+ if ( CUR.GS.dualVector.x == 0x4000 )
+ CUR.func_dualproj = Project_x;
+ else if ( CUR.GS.dualVector.y == 0x4000 )
+ CUR.func_dualproj = Project_y;
+ else
+ CUR.func_dualproj = Dual_Project;
+
+ /* Force recalculation of cached aspect ratio */
+ CUR.tt_metrics.ratio = 0;
+
+ return;
+ }
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ CUR.F_dot_P = CUR.GS.projVector.x;
+ else if ( CUR.GS.freeVector.y == 0x4000 )
+ CUR.F_dot_P = CUR.GS.projVector.y;
+ else
+ CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +
+ (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>
+ 14;
+
+ if ( CUR.GS.projVector.x == 0x4000 )
+ CUR.func_project = (TT_Project_Func)Project_x;
+ else if ( CUR.GS.projVector.y == 0x4000 )
+ CUR.func_project = (TT_Project_Func)Project_y;
+ else
+ CUR.func_project = (TT_Project_Func)Project;
+
+ if ( CUR.GS.dualVector.x == 0x4000 )
+ CUR.func_dualproj = (TT_Project_Func)Project_x;
+ else if ( CUR.GS.dualVector.y == 0x4000 )
+ CUR.func_dualproj = (TT_Project_Func)Project_y;
+ else
+ CUR.func_dualproj = (TT_Project_Func)Dual_Project;
+
+ CUR.func_move = (TT_Move_Func)Direct_Move;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+
+ if ( CUR.F_dot_P == 0x4000L )
+ {
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ {
+ CUR.func_move = (TT_Move_Func)Direct_Move_X;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+ }
+ else if ( CUR.GS.freeVector.y == 0x4000 )
+ {
+ CUR.func_move = (TT_Move_Func)Direct_Move_Y;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+ }
+ }
+
+ /* at small sizes, F_dot_P can become too small, resulting */
+ /* in overflows and `spikes' in a number of glyphs like `w'. */
+
+ if ( FT_ABS( CUR.F_dot_P ) < 0x400L )
+ CUR.F_dot_P = 0x4000L;
+
+ /* Disable cached aspect ratio */
+ CUR.tt_metrics.ratio = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Normalize */
+ /* */
+ /* <Description> */
+ /* Norms a vector. */
+ /* */
+ /* <Input> */
+ /* Vx :: The horizontal input vector coordinate. */
+ /* Vy :: The vertical input vector coordinate. */
+ /* */
+ /* <Output> */
+ /* R :: The normed unit vector. */
+ /* */
+ /* <Return> */
+ /* Returns FAILURE if a vector parameter is zero. */
+ /* */
+ /* <Note> */
+ /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */
+ /* R is undefined. */
+ /* */
+ static FT_Bool
+ Normalize( EXEC_OP_ FT_F26Dot6 Vx,
+ FT_F26Dot6 Vy,
+ FT_UnitVector* R )
+ {
+ FT_F26Dot6 W;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
+ {
+ if ( Vx == 0 && Vy == 0 )
+ {
+ /* XXX: UNDOCUMENTED! It seems that it is possible to try */
+ /* to normalize the vector (0,0). Return immediately. */
+ return SUCCESS;
+ }
+
+ Vx *= 0x4000;
+ Vy *= 0x4000;
+ }
+
+ W = FT_Hypot( Vx, Vy );
+
+ R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
+ R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Here we start with the implementation of the various opcodes. */
+ /* */
+ /*************************************************************************/
+
+
+ static FT_Bool
+ Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1,
+ FT_UShort aIdx2,
+ FT_Int aOpc,
+ FT_UnitVector* Vec )
+ {
+ FT_Long A, B, C;
+ FT_Vector* p1;
+ FT_Vector* p2;
+
+
+ if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
+ BOUNDS( aIdx2, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return FAILURE;
+ }
+
+ p1 = CUR.zp1.cur + aIdx2;
+ p2 = CUR.zp2.cur + aIdx1;
+
+ A = p1->x - p2->x;
+ B = p1->y - p2->y;
+
+ /* If p1 == p2, SPVTL and SFVTL behave the same as */
+ /* SPVTCA[X] and SFVTCA[X], respectively. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, Vec );
+
+ return SUCCESS;
+ }
+
+
+ /* When not using the big switch statements, the interpreter uses a */
+ /* call table defined later below in this source. Each opcode must */
+ /* thus have a corresponding function, even trivial ones. */
+ /* */
+ /* They are all defined there. */
+
+#define DO_SVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.freeVector.y = B; \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ GUESS_VECTOR( freeVector ); \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.freeVector.y = B; \
+ \
+ GUESS_VECTOR( projVector ); \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTL \
+ if ( INS_SxVTL( (FT_UShort)args[1], \
+ (FT_UShort)args[0], \
+ CUR.opcode, \
+ &CUR.GS.projVector ) == SUCCESS ) \
+ { \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ GUESS_VECTOR( freeVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTL \
+ if ( INS_SxVTL( (FT_UShort)args[1], \
+ (FT_UShort)args[0], \
+ CUR.opcode, \
+ &CUR.GS.freeVector ) == SUCCESS ) \
+ { \
+ GUESS_VECTOR( projVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTPV \
+ GUESS_VECTOR( projVector ); \
+ CUR.GS.freeVector = CUR.GS.projVector; \
+ COMPUTE_Funcs();
+
+
+#define DO_SPVFS \
+ { \
+ FT_Short S; \
+ FT_Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (FT_Short)args[1]; \
+ Y = (FT_Long)S; \
+ S = (FT_Short)args[0]; \
+ X = (FT_Long)S; \
+ \
+ NORMalize( X, Y, &CUR.GS.projVector ); \
+ \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ GUESS_VECTOR( freeVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVFS \
+ { \
+ FT_Short S; \
+ FT_Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (FT_Short)args[1]; \
+ Y = (FT_Long)S; \
+ S = (FT_Short)args[0]; \
+ X = S; \
+ \
+ NORMalize( X, Y, &CUR.GS.freeVector ); \
+ GUESS_VECTOR( projVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GPV \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+ args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+ } \
+ else \
+ { \
+ args[0] = CUR.GS.projVector.x; \
+ args[1] = CUR.GS.projVector.y; \
+ }
+#else
+#define DO_GPV \
+ args[0] = CUR.GS.projVector.x; \
+ args[1] = CUR.GS.projVector.y;
+#endif
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GFV \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+ args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+ } \
+ else \
+ { \
+ args[0] = CUR.GS.freeVector.x; \
+ args[1] = CUR.GS.freeVector.y; \
+ }
+#else
+#define DO_GFV \
+ args[0] = CUR.GS.freeVector.x; \
+ args[1] = CUR.GS.freeVector.y;
+#endif
+
+
+#define DO_SRP0 \
+ CUR.GS.rp0 = (FT_UShort)args[0];
+
+
+#define DO_SRP1 \
+ CUR.GS.rp1 = (FT_UShort)args[0];
+
+
+#define DO_SRP2 \
+ CUR.GS.rp2 = (FT_UShort)args[0];
+
+
+#define DO_RTHG \
+ CUR.GS.round_state = TT_Round_To_Half_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+
+
+#define DO_RTG \
+ CUR.GS.round_state = TT_Round_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Grid;
+
+
+#define DO_RTDG \
+ CUR.GS.round_state = TT_Round_To_Double_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+
+
+#define DO_RUTG \
+ CUR.GS.round_state = TT_Round_Up_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+
+
+#define DO_RDTG \
+ CUR.GS.round_state = TT_Round_Down_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+
+
+#define DO_ROFF \
+ CUR.GS.round_state = TT_Round_Off; \
+ CUR.func_round = (TT_Round_Func)Round_None;
+
+
+#define DO_SROUND \
+ SET_SuperRound( 0x4000, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super; \
+ CUR.func_round = (TT_Round_Func)Round_Super;
+
+
+#define DO_S45ROUND \
+ SET_SuperRound( 0x2D41, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super_45; \
+ CUR.func_round = (TT_Round_Func)Round_Super_45;
+
+
+#define DO_SLOOP \
+ if ( args[0] < 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ else \
+ CUR.GS.loop = args[0];
+
+
+#define DO_SMD \
+ CUR.GS.minimum_distance = args[0];
+
+
+#define DO_SCVTCI \
+ CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSWCI \
+ CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSW \
+ CUR.GS.single_width_value = FT_MulFix( args[0], \
+ CUR.tt_metrics.scale );
+
+
+#define DO_FLIPON \
+ CUR.GS.auto_flip = TRUE;
+
+
+#define DO_FLIPOFF \
+ CUR.GS.auto_flip = FALSE;
+
+
+#define DO_SDB \
+ CUR.GS.delta_base = (FT_Short)args[0];
+
+
+#define DO_SDS \
+ CUR.GS.delta_shift = (FT_Short)args[0];
+
+
+#define DO_MD /* nothing */
+
+
+#define DO_MPPEM \
+ args[0] = CURRENT_Ppem();
+
+
+ /* Note: The pointSize should be irrelevant in a given font program; */
+ /* we thus decide to return only the ppem. */
+#if 0
+
+#define DO_MPS \
+ args[0] = CUR.metrics.pointSize;
+
+#else
+
+#define DO_MPS \
+ args[0] = CURRENT_Ppem();
+
+#endif /* 0 */
+
+
+#define DO_DUP \
+ args[1] = args[0];
+
+
+#define DO_CLEAR \
+ CUR.new_top = 0;
+
+
+#define DO_SWAP \
+ { \
+ FT_Long L; \
+ \
+ \
+ L = args[0]; \
+ args[0] = args[1]; \
+ args[1] = L; \
+ }
+
+
+#define DO_DEPTH \
+ args[0] = CUR.top;
+
+
+#define DO_CINDEX \
+ { \
+ FT_Long L; \
+ \
+ \
+ L = args[0]; \
+ \
+ if ( L <= 0 || L > CUR.args ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ CUR.error = FT_THROW( Invalid_Reference ); \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR.stack[CUR.args - L]; \
+ }
+
+
+#define DO_JROT \
+ if ( args[1] != 0 ) \
+ { \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_JMPR \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE;
+
+
+#define DO_JROF \
+ if ( args[1] == 0 ) \
+ { \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_LT \
+ args[0] = ( args[0] < args[1] );
+
+
+#define DO_LTEQ \
+ args[0] = ( args[0] <= args[1] );
+
+
+#define DO_GT \
+ args[0] = ( args[0] > args[1] );
+
+
+#define DO_GTEQ \
+ args[0] = ( args[0] >= args[1] );
+
+
+#define DO_EQ \
+ args[0] = ( args[0] == args[1] );
+
+
+#define DO_NEQ \
+ args[0] = ( args[0] != args[1] );
+
+
+#define DO_ODD \
+ args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
+
+
+#define DO_EVEN \
+ args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
+
+
+#define DO_AND \
+ args[0] = ( args[0] && args[1] );
+
+
+#define DO_OR \
+ args[0] = ( args[0] || args[1] );
+
+
+#define DO_NOT \
+ args[0] = !args[0];
+
+
+#define DO_ADD \
+ args[0] += args[1];
+
+
+#define DO_SUB \
+ args[0] -= args[1];
+
+
+#define DO_DIV \
+ if ( args[1] == 0 ) \
+ CUR.error = FT_THROW( Divide_By_Zero ); \
+ else \
+ args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
+
+
+#define DO_MUL \
+ args[0] = FT_MulDiv( args[0], args[1], 64L );
+
+
+#define DO_ABS \
+ args[0] = FT_ABS( args[0] );
+
+
+#define DO_NEG \
+ args[0] = -args[0];
+
+
+#define DO_FLOOR \
+ args[0] = FT_PIX_FLOOR( args[0] );
+
+
+#define DO_CEILING \
+ args[0] = FT_PIX_CEIL( args[0] );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+#define DO_RS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ ARRAY_BOUND_ERROR; \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ { \
+ /* subpixel hinting - avoid Typeman Dstroke and */ \
+ /* IStroke and Vacuform rounds */ \
+ \
+ if ( SUBPIXEL_HINTING && \
+ CUR.ignore_x_mode && \
+ ( ( I == 24 && \
+ ( CUR.face->sph_found_func_flags & \
+ ( SPH_FDEF_SPACING_1 | \
+ SPH_FDEF_SPACING_2 ) ) ) || \
+ ( I == 22 && \
+ ( CUR.sph_in_func_flags & \
+ SPH_FDEF_TYPEMAN_STROKES ) ) || \
+ ( I == 8 && \
+ ( CUR.face->sph_found_func_flags & \
+ SPH_FDEF_VACUFORM_ROUND_1 ) && \
+ CUR.iup_called ) ) ) \
+ args[0] = 0; \
+ else \
+ args[0] = CUR.storage[I]; \
+ } \
+ }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#define DO_RS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR.storage[I]; \
+ }
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#define DO_WS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR.storage[I] = args[1]; \
+ }
+
+
+#define DO_RCVT \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR_Func_read_cvt( I ); \
+ }
+
+
+#define DO_WCVTP \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR_Func_write_cvt( I, args[1] ); \
+ }
+
+
+#define DO_WCVTF \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \
+ }
+
+
+#define DO_DEBUG \
+ CUR.error = FT_THROW( Debug_OpCode );
+
+
+#define DO_ROUND \
+ args[0] = CUR_Func_round( \
+ args[0], \
+ CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
+
+
+#define DO_NROUND \
+ args[0] = ROUND_None( args[0], \
+ CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
+
+
+#define DO_MAX \
+ if ( args[1] > args[0] ) \
+ args[0] = args[1];
+
+
+#define DO_MIN \
+ if ( args[1] < args[0] ) \
+ args[0] = args[1];
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+#undef ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR \
+ { \
+ CUR.error = FT_THROW( Invalid_Reference ); \
+ return; \
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */
+ /* Opcode range: 0x00-0x01 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SVTCA( INS_ARG )
+ {
+ DO_SVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVTCA[a]: Set PVector to Coordinate Axis */
+ /* Opcode range: 0x02-0x03 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SPVTCA( INS_ARG )
+ {
+ DO_SPVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTCA[a]: Set FVector to Coordinate Axis */
+ /* Opcode range: 0x04-0x05 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SFVTCA( INS_ARG )
+ {
+ DO_SFVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVTL[a]: Set PVector To Line */
+ /* Opcode range: 0x06-0x07 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SPVTL( INS_ARG )
+ {
+ DO_SPVTL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTL[a]: Set FVector To Line */
+ /* Opcode range: 0x08-0x09 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SFVTL( INS_ARG )
+ {
+ DO_SFVTL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTPV[]: Set FVector To PVector */
+ /* Opcode range: 0x0E */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SFVTPV( INS_ARG )
+ {
+ DO_SFVTPV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVFS[]: Set PVector From Stack */
+ /* Opcode range: 0x0A */
+ /* Stack: f2.14 f2.14 --> */
+ /* */
+ static void
+ Ins_SPVFS( INS_ARG )
+ {
+ DO_SPVFS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVFS[]: Set FVector From Stack */
+ /* Opcode range: 0x0B */
+ /* Stack: f2.14 f2.14 --> */
+ /* */
+ static void
+ Ins_SFVFS( INS_ARG )
+ {
+ DO_SFVFS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GPV[]: Get Projection Vector */
+ /* Opcode range: 0x0C */
+ /* Stack: ef2.14 --> ef2.14 */
+ /* */
+ static void
+ Ins_GPV( INS_ARG )
+ {
+ DO_GPV
+ }
+
+
+ /*************************************************************************/
+ /* GFV[]: Get Freedom Vector */
+ /* Opcode range: 0x0D */
+ /* Stack: ef2.14 --> ef2.14 */
+ /* */
+ static void
+ Ins_GFV( INS_ARG )
+ {
+ DO_GFV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP0[]: Set Reference Point 0 */
+ /* Opcode range: 0x10 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP0( INS_ARG )
+ {
+ DO_SRP0
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP1[]: Set Reference Point 1 */
+ /* Opcode range: 0x11 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP1( INS_ARG )
+ {
+ DO_SRP1
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP2[]: Set Reference Point 2 */
+ /* Opcode range: 0x12 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP2( INS_ARG )
+ {
+ DO_SRP2
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RTHG[]: Round To Half Grid */
+ /* Opcode range: 0x19 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTHG( INS_ARG )
+ {
+ DO_RTHG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RTG[]: Round To Grid */
+ /* Opcode range: 0x18 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTG( INS_ARG )
+ {
+ DO_RTG
+ }
+
+
+ /*************************************************************************/
+ /* RTDG[]: Round To Double Grid */
+ /* Opcode range: 0x3D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTDG( INS_ARG )
+ {
+ DO_RTDG
+ }
+
+
+ /*************************************************************************/
+ /* RUTG[]: Round Up To Grid */
+ /* Opcode range: 0x7C */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RUTG( INS_ARG )
+ {
+ DO_RUTG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RDTG[]: Round Down To Grid */
+ /* Opcode range: 0x7D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RDTG( INS_ARG )
+ {
+ DO_RDTG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROFF[]: Round OFF */
+ /* Opcode range: 0x7A */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ROFF( INS_ARG )
+ {
+ DO_ROFF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SROUND[]: Super ROUND */
+ /* Opcode range: 0x76 */
+ /* Stack: Eint8 --> */
+ /* */
+ static void
+ Ins_SROUND( INS_ARG )
+ {
+ DO_SROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* S45ROUND[]: Super ROUND 45 degrees */
+ /* Opcode range: 0x77 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_S45ROUND( INS_ARG )
+ {
+ DO_S45ROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOOP[]: Set LOOP variable */
+ /* Opcode range: 0x17 */
+ /* Stack: int32? --> */
+ /* */
+ static void
+ Ins_SLOOP( INS_ARG )
+ {
+ DO_SLOOP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SMD[]: Set Minimum Distance */
+ /* Opcode range: 0x1A */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SMD( INS_ARG )
+ {
+ DO_SMD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCVTCI[]: Set Control Value Table Cut In */
+ /* Opcode range: 0x1D */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SCVTCI( INS_ARG )
+ {
+ DO_SCVTCI
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SSWCI[]: Set Single Width Cut In */
+ /* Opcode range: 0x1E */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SSWCI( INS_ARG )
+ {
+ DO_SSWCI
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SSW[]: Set Single Width */
+ /* Opcode range: 0x1F */
+ /* Stack: int32? --> */
+ /* */
+ static void
+ Ins_SSW( INS_ARG )
+ {
+ DO_SSW
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPON[]: Set auto-FLIP to ON */
+ /* Opcode range: 0x4D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_FLIPON( INS_ARG )
+ {
+ DO_FLIPON
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPOFF[]: Set auto-FLIP to OFF */
+ /* Opcode range: 0x4E */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_FLIPOFF( INS_ARG )
+ {
+ DO_FLIPOFF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SANGW[]: Set ANGle Weight */
+ /* Opcode range: 0x7E */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SANGW( INS_ARG )
+ {
+ /* instruction not supported anymore */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDB[]: Set Delta Base */
+ /* Opcode range: 0x5E */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SDB( INS_ARG )
+ {
+ DO_SDB
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDS[]: Set Delta Shift */
+ /* Opcode range: 0x5F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SDS( INS_ARG )
+ {
+ DO_SDS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MPPEM[]: Measure Pixel Per EM */
+ /* Opcode range: 0x4B */
+ /* Stack: --> Euint16 */
+ /* */
+ static void
+ Ins_MPPEM( INS_ARG )
+ {
+ DO_MPPEM
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MPS[]: Measure Point Size */
+ /* Opcode range: 0x4C */
+ /* Stack: --> Euint16 */
+ /* */
+ static void
+ Ins_MPS( INS_ARG )
+ {
+ DO_MPS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DUP[]: DUPlicate the top stack's element */
+ /* Opcode range: 0x20 */
+ /* Stack: StkElt --> StkElt StkElt */
+ /* */
+ static void
+ Ins_DUP( INS_ARG )
+ {
+ DO_DUP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* POP[]: POP the stack's top element */
+ /* Opcode range: 0x21 */
+ /* Stack: StkElt --> */
+ /* */
+ static void
+ Ins_POP( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CLEAR[]: CLEAR the entire stack */
+ /* Opcode range: 0x22 */
+ /* Stack: StkElt... --> */
+ /* */
+ static void
+ Ins_CLEAR( INS_ARG )
+ {
+ DO_CLEAR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SWAP[]: SWAP the stack's top two elements */
+ /* Opcode range: 0x23 */
+ /* Stack: 2 * StkElt --> 2 * StkElt */
+ /* */
+ static void
+ Ins_SWAP( INS_ARG )
+ {
+ DO_SWAP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEPTH[]: return the stack DEPTH */
+ /* Opcode range: 0x24 */
+ /* Stack: --> uint32 */
+ /* */
+ static void
+ Ins_DEPTH( INS_ARG )
+ {
+ DO_DEPTH
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CINDEX[]: Copy INDEXed element */
+ /* Opcode range: 0x25 */
+ /* Stack: int32 --> StkElt */
+ /* */
+ static void
+ Ins_CINDEX( INS_ARG )
+ {
+ DO_CINDEX
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EIF[]: End IF */
+ /* Opcode range: 0x59 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_EIF( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JROT[]: Jump Relative On True */
+ /* Opcode range: 0x78 */
+ /* Stack: StkElt int32 --> */
+ /* */
+ static void
+ Ins_JROT( INS_ARG )
+ {
+ DO_JROT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JMPR[]: JuMP Relative */
+ /* Opcode range: 0x1C */
+ /* Stack: int32 --> */
+ /* */
+ static void
+ Ins_JMPR( INS_ARG )
+ {
+ DO_JMPR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JROF[]: Jump Relative On False */
+ /* Opcode range: 0x79 */
+ /* Stack: StkElt int32 --> */
+ /* */
+ static void
+ Ins_JROF( INS_ARG )
+ {
+ DO_JROF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LT[]: Less Than */
+ /* Opcode range: 0x50 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_LT( INS_ARG )
+ {
+ DO_LT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LTEQ[]: Less Than or EQual */
+ /* Opcode range: 0x51 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_LTEQ( INS_ARG )
+ {
+ DO_LTEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GT[]: Greater Than */
+ /* Opcode range: 0x52 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_GT( INS_ARG )
+ {
+ DO_GT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GTEQ[]: Greater Than or EQual */
+ /* Opcode range: 0x53 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_GTEQ( INS_ARG )
+ {
+ DO_GTEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EQ[]: EQual */
+ /* Opcode range: 0x54 */
+ /* Stack: StkElt StkElt --> bool */
+ /* */
+ static void
+ Ins_EQ( INS_ARG )
+ {
+ DO_EQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NEQ[]: Not EQual */
+ /* Opcode range: 0x55 */
+ /* Stack: StkElt StkElt --> bool */
+ /* */
+ static void
+ Ins_NEQ( INS_ARG )
+ {
+ DO_NEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ODD[]: Is ODD */
+ /* Opcode range: 0x56 */
+ /* Stack: f26.6 --> bool */
+ /* */
+ static void
+ Ins_ODD( INS_ARG )
+ {
+ DO_ODD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EVEN[]: Is EVEN */
+ /* Opcode range: 0x57 */
+ /* Stack: f26.6 --> bool */
+ /* */
+ static void
+ Ins_EVEN( INS_ARG )
+ {
+ DO_EVEN
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AND[]: logical AND */
+ /* Opcode range: 0x5A */
+ /* Stack: uint32 uint32 --> uint32 */
+ /* */
+ static void
+ Ins_AND( INS_ARG )
+ {
+ DO_AND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* OR[]: logical OR */
+ /* Opcode range: 0x5B */
+ /* Stack: uint32 uint32 --> uint32 */
+ /* */
+ static void
+ Ins_OR( INS_ARG )
+ {
+ DO_OR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NOT[]: logical NOT */
+ /* Opcode range: 0x5C */
+ /* Stack: StkElt --> uint32 */
+ /* */
+ static void
+ Ins_NOT( INS_ARG )
+ {
+ DO_NOT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ADD[]: ADD */
+ /* Opcode range: 0x60 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ADD( INS_ARG )
+ {
+ DO_ADD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SUB[]: SUBtract */
+ /* Opcode range: 0x61 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_SUB( INS_ARG )
+ {
+ DO_SUB
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DIV[]: DIVide */
+ /* Opcode range: 0x62 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_DIV( INS_ARG )
+ {
+ DO_DIV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MUL[]: MULtiply */
+ /* Opcode range: 0x63 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_MUL( INS_ARG )
+ {
+ DO_MUL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ABS[]: ABSolute value */
+ /* Opcode range: 0x64 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ABS( INS_ARG )
+ {
+ DO_ABS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NEG[]: NEGate */
+ /* Opcode range: 0x65 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_NEG( INS_ARG )
+ {
+ DO_NEG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLOOR[]: FLOOR */
+ /* Opcode range: 0x66 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_FLOOR( INS_ARG )
+ {
+ DO_FLOOR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CEILING[]: CEILING */
+ /* Opcode range: 0x67 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_CEILING( INS_ARG )
+ {
+ DO_CEILING
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RS[]: Read Store */
+ /* Opcode range: 0x43 */
+ /* Stack: uint32 --> uint32 */
+ /* */
+ static void
+ Ins_RS( INS_ARG )
+ {
+ DO_RS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WS[]: Write Store */
+ /* Opcode range: 0x42 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_WS( INS_ARG )
+ {
+ DO_WS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WCVTP[]: Write CVT in Pixel units */
+ /* Opcode range: 0x44 */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ static void
+ Ins_WCVTP( INS_ARG )
+ {
+ DO_WCVTP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WCVTF[]: Write CVT in Funits */
+ /* Opcode range: 0x70 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_WCVTF( INS_ARG )
+ {
+ DO_WCVTF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RCVT[]: Read CVT */
+ /* Opcode range: 0x45 */
+ /* Stack: uint32 --> f26.6 */
+ /* */
+ static void
+ Ins_RCVT( INS_ARG )
+ {
+ DO_RCVT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AA[]: Adjust Angle */
+ /* Opcode range: 0x7F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_AA( INS_ARG )
+ {
+ /* intentionally no longer supported */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEBUG[]: DEBUG. Unsupported. */
+ /* Opcode range: 0x4F */
+ /* Stack: uint32 --> */
+ /* */
+ /* Note: The original instruction pops a value from the stack. */
+ /* */
+ static void
+ Ins_DEBUG( INS_ARG )
+ {
+ DO_DEBUG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROUND[ab]: ROUND value */
+ /* Opcode range: 0x68-0x6B */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ROUND( INS_ARG )
+ {
+ DO_ROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NROUND[ab]: No ROUNDing of value */
+ /* Opcode range: 0x6C-0x6F */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_NROUND( INS_ARG )
+ {
+ DO_NROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MAX[]: MAXimum */
+ /* Opcode range: 0x68 */
+ /* Stack: int32? int32? --> int32 */
+ /* */
+ static void
+ Ins_MAX( INS_ARG )
+ {
+ DO_MAX
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIN[]: MINimum */
+ /* Opcode range: 0x69 */
+ /* Stack: int32? int32? --> int32 */
+ /* */
+ static void
+ Ins_MIN( INS_ARG )
+ {
+ DO_MIN
+ }
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions are called as is within the switch statement. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* MINDEX[]: Move INDEXed element */
+ /* Opcode range: 0x26 */
+ /* Stack: int32? --> StkElt */
+ /* */
+ static void
+ Ins_MINDEX( INS_ARG )
+ {
+ FT_Long L, K;
+
+
+ L = args[0];
+
+ if ( L <= 0 || L > CUR.args )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+ else
+ {
+ K = CUR.stack[CUR.args - L];
+
+ FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ],
+ &CUR.stack[CUR.args - L + 1],
+ ( L - 1 ) );
+
+ CUR.stack[CUR.args - 1] = K;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROLL[]: ROLL top three elements */
+ /* Opcode range: 0x8A */
+ /* Stack: 3 * StkElt --> 3 * StkElt */
+ /* */
+ static void
+ Ins_ROLL( INS_ARG )
+ {
+ FT_Long A, B, C;
+
+ FT_UNUSED_EXEC;
+
+
+ A = args[2];
+ B = args[1];
+ C = args[0];
+
+ args[2] = C;
+ args[1] = A;
+ args[0] = B;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING THE FLOW OF CONTROL */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ static FT_Bool
+ SkipCode( EXEC_OP )
+ {
+ CUR.IP += CUR.length;
+
+ if ( CUR.IP < CUR.codeSize )
+ {
+ CUR.opcode = CUR.code[CUR.IP];
+
+ CUR.length = opcode_length[CUR.opcode];
+ if ( CUR.length < 0 )
+ {
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ goto Fail_Overflow;
+ CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+ }
+
+ if ( CUR.IP + CUR.length <= CUR.codeSize )
+ return SUCCESS;
+ }
+
+ Fail_Overflow:
+ CUR.error = FT_THROW( Code_Overflow );
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IF[]: IF test */
+ /* Opcode range: 0x58 */
+ /* Stack: StkElt --> */
+ /* */
+ static void
+ Ins_IF( INS_ARG )
+ {
+ FT_Int nIfs;
+ FT_Bool Out;
+
+
+ if ( args[0] != 0 )
+ return;
+
+ nIfs = 1;
+ Out = 0;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x1B: /* ELSE */
+ Out = FT_BOOL( nIfs == 1 );
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ Out = FT_BOOL( nIfs == 0 );
+ break;
+ }
+ } while ( Out == 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ELSE[]: ELSE */
+ /* Opcode range: 0x1B */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ELSE( INS_ARG )
+ {
+ FT_Int nIfs;
+
+ FT_UNUSED_ARG;
+
+
+ nIfs = 1;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ break;
+ }
+ } while ( nIfs != 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* FDEF[]: Function DEFinition */
+ /* Opcode range: 0x2C */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_FDEF( INS_ARG )
+ {
+ FT_ULong n;
+ TT_DefRecord* rec;
+ TT_DefRecord* limit;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* arguments to opcodes are skipped by `SKIP_Code' */
+ FT_Byte opcode_pattern[9][12] = {
+ /* #0 inline delta function 1 */
+ {
+ 0x4B, /* PPEM */
+ 0x53, /* GTEQ */
+ 0x23, /* SWAP */
+ 0x4B, /* PPEM */
+ 0x51, /* LTEQ */
+ 0x5A, /* AND */
+ 0x58, /* IF */
+ 0x38, /* SHPIX */
+ 0x1B, /* ELSE */
+ 0x21, /* POP */
+ 0x21, /* POP */
+ 0x59 /* EIF */
+ },
+ /* #1 inline delta function 2 */
+ {
+ 0x4B, /* PPEM */
+ 0x54, /* EQ */
+ 0x58, /* IF */
+ 0x38, /* SHPIX */
+ 0x1B, /* ELSE */
+ 0x21, /* POP */
+ 0x21, /* POP */
+ 0x59 /* EIF */
+ },
+ /* #2 diagonal stroke function */
+ {
+ 0x20, /* DUP */
+ 0x20, /* DUP */
+ 0xB0, /* PUSHB_1 */
+ /* 1 */
+ 0x60, /* ADD */
+ 0x46, /* GC_cur */
+ 0xB0, /* PUSHB_1 */
+ /* 64 */
+ 0x23, /* SWAP */
+ 0x42 /* WS */
+ },
+ /* #3 VacuFormRound function */
+ {
+ 0x45, /* RCVT */
+ 0x23, /* SWAP */
+ 0x46, /* GC_cur */
+ 0x60, /* ADD */
+ 0x20, /* DUP */
+ 0xB0 /* PUSHB_1 */
+ /* 38 */
+ },
+ /* #4 TTFautohint bytecode (old) */
+ {
+ 0x20, /* DUP */
+ 0x64, /* ABS */
+ 0xB0, /* PUSHB_1 */
+ /* 32 */
+ 0x60, /* ADD */
+ 0x66, /* FLOOR */
+ 0x23, /* SWAP */
+ 0xB0 /* PUSHB_1 */
+ },
+ /* #5 spacing function 1 */
+ {
+ 0x01, /* SVTCA_x */
+ 0xB0, /* PUSHB_1 */
+ /* 24 */
+ 0x43, /* RS */
+ 0x58 /* IF */
+ },
+ /* #6 spacing function 2 */
+ {
+ 0x01, /* SVTCA_x */
+ 0x18, /* RTG */
+ 0xB0, /* PUSHB_1 */
+ /* 24 */
+ 0x43, /* RS */
+ 0x58 /* IF */
+ },
+ /* #7 TypeMan Talk DiagEndCtrl function */
+ {
+ 0x01, /* SVTCA_x */
+ 0x20, /* DUP */
+ 0xB0, /* PUSHB_1 */
+ /* 3 */
+ 0x25, /* CINDEX */
+ },
+ /* #8 TypeMan Talk Align */
+ {
+ 0x06, /* SPVTL */
+ 0x7D, /* RDTG */
+ },
+ };
+ FT_UShort opcode_patterns = 9;
+ FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
+ FT_UShort i;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /* some font programs are broken enough to redefine functions! */
+ /* We will then parse the current table. */
+
+ rec = CUR.FDefs;
+ limit = rec + CUR.numFDefs;
+ n = args[0];
+
+ for ( ; rec < limit; rec++ )
+ {
+ if ( rec->opc == n )
+ break;
+ }
+
+ if ( rec == limit )
+ {
+ /* check that there is enough room for new functions */
+ if ( CUR.numFDefs >= CUR.maxFDefs )
+ {
+ CUR.error = FT_THROW( Too_Many_Function_Defs );
+ return;
+ }
+ CUR.numFDefs++;
+ }
+
+ /* Although FDEF takes unsigned 32-bit integer, */
+ /* func # must be within unsigned 16-bit integer */
+ if ( n > 0xFFFFU )
+ {
+ CUR.error = FT_THROW( Too_Many_Function_Defs );
+ return;
+ }
+
+ rec->range = CUR.curRange;
+ rec->opc = (FT_UInt16)n;
+ rec->start = CUR.IP + 1;
+ rec->active = TRUE;
+ rec->inline_delta = FALSE;
+ rec->sph_fdef_flags = 0x0000;
+
+ if ( n > CUR.maxFunc )
+ CUR.maxFunc = (FT_UInt16)n;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* We don't know for sure these are typeman functions, */
+ /* however they are only active when RS 22 is called */
+ if ( n >= 64 && n <= 66 )
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
+#endif
+
+ /* Now skip the whole function definition. */
+ /* We don't allow nested IDEFS & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ for ( i = 0; i < opcode_patterns; i++ )
+ {
+ if ( opcode_pointer[i] < opcode_size[i] &&
+ CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+ {
+ opcode_pointer[i] += 1;
+
+ if ( opcode_pointer[i] == opcode_size[i] )
+ {
+ FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
+ i, n,
+ CUR.face->root.family_name,
+ CUR.face->root.style_name ));
+
+ switch ( i )
+ {
+ case 0:
+ rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
+ break;
+
+ case 1:
+ rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
+ break;
+
+ case 2:
+ switch ( n )
+ {
+ /* needs to be implemented still */
+ case 58:
+ rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
+ }
+ break;
+
+ case 3:
+ switch ( n )
+ {
+ case 0:
+ rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
+ }
+ break;
+
+ case 4:
+ /* probably not necessary to detect anymore */
+ rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
+ break;
+
+ case 5:
+ switch ( n )
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 7:
+ case 8:
+ rec->sph_fdef_flags |= SPH_FDEF_SPACING_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
+ }
+ break;
+
+ case 6:
+ switch ( n )
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 7:
+ case 8:
+ rec->sph_fdef_flags |= SPH_FDEF_SPACING_2;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
+ }
+ break;
+
+ case 7:
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ break;
+
+ case 8:
+#if 0
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+#endif
+ break;
+ }
+ opcode_pointer[i] = 0;
+ }
+ }
+
+ else
+ opcode_pointer[i] = 0;
+ }
+
+ /* Set sph_compatibility_mode only when deltas are detected */
+ CUR.face->sph_compatibility_mode =
+ ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
+ ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2C: /* FDEF */
+ CUR.error = FT_THROW( Nested_DEFS );
+ return;
+
+ case 0x2D: /* ENDF */
+ rec->end = CUR.IP;
+ return;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ENDF[]: END Function definition */
+ /* Opcode range: 0x2D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ENDF( INS_ARG )
+ {
+ TT_CallRec* pRec;
+
+ FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ CUR.sph_in_func_flags = 0x0000;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */
+ {
+ CUR.error = FT_THROW( ENDF_In_Exec_Stream );
+ return;
+ }
+
+ CUR.callTop--;
+
+ pRec = &CUR.callStack[CUR.callTop];
+
+ pRec->Cur_Count--;
+
+ CUR.step_ins = FALSE;
+
+ if ( pRec->Cur_Count > 0 )
+ {
+ CUR.callTop++;
+ CUR.IP = pRec->Cur_Restart;
+ }
+ else
+ /* Loop through the current function */
+ INS_Goto_CodeRange( pRec->Caller_Range,
+ pRec->Caller_IP );
+
+ /* Exit the current call frame. */
+
+ /* NOTE: If the last instruction of a program is a */
+ /* CALL or LOOPCALL, the return address is */
+ /* always out of the code range. This is a */
+ /* valid address, and it is why we do not test */
+ /* the result of Ins_Goto_CodeRange() here! */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CALL[]: CALL function */
+ /* Opcode range: 0x2B */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_CALL( INS_ARG )
+ {
+ FT_ULong F;
+ TT_CallRec* pCrec;
+ TT_DefRecord* def;
+
+
+ /* first of all, check the index */
+
+ F = args[0];
+ if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+ goto Fail;
+
+ /* Except for some old Apple fonts, all functions in a TrueType */
+ /* font are defined in increasing order, starting from 0. This */
+ /* means that we normally have */
+ /* */
+ /* CUR.maxFunc+1 == CUR.numFDefs */
+ /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */
+ /* */
+ /* If this isn't true, we need to look up the function table. */
+
+ def = CUR.FDefs + F;
+ if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+ {
+ /* look up the FDefs table */
+ TT_DefRecord* limit;
+
+
+ def = CUR.FDefs;
+ limit = def + CUR.numFDefs;
+
+ while ( def < limit && def->opc != F )
+ def++;
+
+ if ( def == limit )
+ goto Fail;
+ }
+
+ /* check that the function is active */
+ if ( !def->active )
+ goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( ( CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
+ ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) )
+ goto Fail;
+ else
+ CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* check the call stack */
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ pCrec = CUR.callStack + CUR.callTop;
+
+ pCrec->Caller_Range = CUR.curRange;
+ pCrec->Caller_IP = CUR.IP + 1;
+ pCrec->Cur_Count = 1;
+ pCrec->Cur_Restart = def->start;
+ pCrec->Cur_End = def->end;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( def->range,
+ def->start );
+
+ CUR.step_ins = FALSE;
+
+ return;
+
+ Fail:
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LOOPCALL[]: LOOP and CALL function */
+ /* Opcode range: 0x2A */
+ /* Stack: uint32? Eint16? --> */
+ /* */
+ static void
+ Ins_LOOPCALL( INS_ARG )
+ {
+ FT_ULong F;
+ TT_CallRec* pCrec;
+ TT_DefRecord* def;
+
+
+ /* first of all, check the index */
+ F = args[1];
+ if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+ goto Fail;
+
+ /* Except for some old Apple fonts, all functions in a TrueType */
+ /* font are defined in increasing order, starting from 0. This */
+ /* means that we normally have */
+ /* */
+ /* CUR.maxFunc+1 == CUR.numFDefs */
+ /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */
+ /* */
+ /* If this isn't true, we need to look up the function table. */
+
+ def = CUR.FDefs + F;
+ if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+ {
+ /* look up the FDefs table */
+ TT_DefRecord* limit;
+
+
+ def = CUR.FDefs;
+ limit = def + CUR.numFDefs;
+
+ while ( def < limit && def->opc != F )
+ def++;
+
+ if ( def == limit )
+ goto Fail;
+ }
+
+ /* check that the function is active */
+ if ( !def->active )
+ goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
+ goto Fail;
+ else
+ CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* check stack */
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ if ( args[0] > 0 )
+ {
+ pCrec = CUR.callStack + CUR.callTop;
+
+ pCrec->Caller_Range = CUR.curRange;
+ pCrec->Caller_IP = CUR.IP + 1;
+ pCrec->Cur_Count = (FT_Int)args[0];
+ pCrec->Cur_Restart = def->start;
+ pCrec->Cur_End = def->end;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( def->range, def->start );
+
+ CUR.step_ins = FALSE;
+ }
+
+ return;
+
+ Fail:
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IDEF[]: Instruction DEFinition */
+ /* Opcode range: 0x89 */
+ /* Stack: Eint8 --> */
+ /* */
+ static void
+ Ins_IDEF( INS_ARG )
+ {
+ TT_DefRecord* def;
+ TT_DefRecord* limit;
+
+
+ /* First of all, look for the same function in our table */
+
+ def = CUR.IDefs;
+ limit = def + CUR.numIDefs;
+
+ for ( ; def < limit; def++ )
+ if ( def->opc == (FT_ULong)args[0] )
+ break;
+
+ if ( def == limit )
+ {
+ /* check that there is enough room for a new instruction */
+ if ( CUR.numIDefs >= CUR.maxIDefs )
+ {
+ CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+ return;
+ }
+ CUR.numIDefs++;
+ }
+
+ /* opcode must be unsigned 8-bit integer */
+ if ( 0 > args[0] || args[0] > 0x00FF )
+ {
+ CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+ return;
+ }
+
+ def->opc = (FT_Byte)args[0];
+ def->start = CUR.IP + 1;
+ def->range = CUR.curRange;
+ def->active = TRUE;
+
+ if ( (FT_ULong)args[0] > CUR.maxIns )
+ CUR.maxIns = (FT_Byte)args[0];
+
+ /* Now skip the whole function definition. */
+ /* We don't allow nested IDEFs & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2C: /* FDEF */
+ CUR.error = FT_THROW( Nested_DEFS );
+ return;
+ case 0x2D: /* ENDF */
+ return;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHING DATA ONTO THE INTERPRETER STACK */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* NPUSHB[]: PUSH N Bytes */
+ /* Opcode range: 0x40 */
+ /* Stack: --> uint32... */
+ /* */
+ static void
+ Ins_NPUSHB( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K + 1];
+
+ CUR.new_top += L;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NPUSHW[]: PUSH N Words */
+ /* Opcode range: 0x41 */
+ /* Stack: --> int32... */
+ /* */
+ static void
+ Ins_NPUSHW( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ CUR.IP += 2;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ CUR.new_top += L;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHB[abc]: PUSH Bytes */
+ /* Opcode range: 0xB0-0xB7 */
+ /* Stack: --> uint32... */
+ /* */
+ static void
+ Ins_PUSHB( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHW[abc]: PUSH Words */
+ /* Opcode range: 0xB8-0xBF */
+ /* Stack: --> int32... */
+ /* */
+ static void
+ Ins_PUSHW( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ CUR.IP++;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING THE GRAPHICS STATE */
+ /* */
+ /* Instructions appear in the specs' order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* GC[a]: Get Coordinate projected onto */
+ /* Opcode range: 0x46-0x47 */
+ /* Stack: uint32 --> f26.6 */
+ /* */
+ /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken */
+ /* along the dual projection vector! */
+ /* */
+ static void
+ Ins_GC( INS_ARG )
+ {
+ FT_ULong L;
+ FT_F26Dot6 R;
+
+
+ L = (FT_ULong)args[0];
+
+ if ( BOUNDSL( L, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ R = 0;
+ }
+ else
+ {
+ if ( CUR.opcode & 1 )
+ R = CUR_fast_dualproj( &CUR.zp2.org[L] );
+ else
+ R = CUR_fast_project( &CUR.zp2.cur[L] );
+ }
+
+ args[0] = R;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCFS[]: Set Coordinate From Stack */
+ /* Opcode range: 0x48 */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ /* Formula: */
+ /* */
+ /* OA := OA + ( value - OA.p )/( f.p ) * f */
+ /* */
+ static void
+ Ins_SCFS( INS_ARG )
+ {
+ FT_Long K;
+ FT_UShort L;
+
+
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( L, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ K = CUR_fast_project( &CUR.zp2.cur[L] );
+
+ CUR_Func_move( &CUR.zp2, L, args[1] - K );
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep2 == 0 )
+ CUR.zp2.org[L] = CUR.zp2.cur[L];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MD[a]: Measure Distance */
+ /* Opcode range: 0x49-0x4A */
+ /* Stack: uint32 uint32 --> f26.6 */
+ /* */
+ /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along */
+ /* the dual projection vector. */
+ /* */
+ /* XXX: UNDOCUMENTED: Flag attributes are inverted! */
+ /* 0 => measure distance in original outline */
+ /* 1 => measure distance in grid-fitted outline */
+ /* */
+ /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! */
+ /* */
+ static void
+ Ins_MD( INS_ARG )
+ {
+ FT_UShort K, L;
+ FT_F26Dot6 D;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( L, CUR.zp0.n_points ) ||
+ BOUNDS( K, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ D = 0;
+ }
+ else
+ {
+ if ( CUR.opcode & 1 )
+ D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
+ else
+ {
+ /* XXX: UNDOCUMENTED: twilight zone special case */
+
+ if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+ {
+ FT_Vector* vec1 = CUR.zp0.org + L;
+ FT_Vector* vec2 = CUR.zp1.org + K;
+
+
+ D = CUR_Func_dualproj( vec1, vec2 );
+ }
+ else
+ {
+ FT_Vector* vec1 = CUR.zp0.orus + L;
+ FT_Vector* vec2 = CUR.zp1.orus + K;
+
+
+ if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ {
+ /* this should be faster */
+ D = CUR_Func_dualproj( vec1, vec2 );
+ D = FT_MulFix( D, CUR.metrics.x_scale );
+ }
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+ vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+ D = CUR_fast_dualproj( &vec );
+ }
+ }
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode && FT_ABS( D ) == 64 )
+ D += 1;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ args[0] = D;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDPVTL[a]: Set Dual PVector to Line */
+ /* Opcode range: 0x86-0x87 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SDPVTL( INS_ARG )
+ {
+ FT_Long A, B, C;
+ FT_UShort p1, p2; /* was FT_Int in pas type ERROR */
+ FT_Int aOpc = CUR.opcode;
+
+
+ p1 = (FT_UShort)args[1];
+ p2 = (FT_UShort)args[0];
+
+ if ( BOUNDS( p2, CUR.zp1.n_points ) ||
+ BOUNDS( p1, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ {
+ FT_Vector* v1 = CUR.zp1.org + p2;
+ FT_Vector* v2 = CUR.zp2.org + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+
+ /* If v1 == v2, SDPVTL behaves the same as */
+ /* SVTCA[X], respectively. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.dualVector );
+
+ {
+ FT_Vector* v1 = CUR.zp1.cur + p2;
+ FT_Vector* v2 = CUR.zp2.cur + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.projVector );
+
+ GUESS_VECTOR( freeVector );
+
+ COMPUTE_Funcs();
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP0[]: Set Zone Pointer 0 */
+ /* Opcode range: 0x13 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP0( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep0 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP1[]: Set Zone Pointer 1 */
+ /* Opcode range: 0x14 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP1( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp1 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp1 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep1 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP2[]: Set Zone Pointer 2 */
+ /* Opcode range: 0x15 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP2( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp2 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp2 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep2 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZPS[]: Set Zone PointerS */
+ /* Opcode range: 0x16 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZPS( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.zp1 = CUR.zp0;
+ CUR.zp2 = CUR.zp0;
+
+ CUR.GS.gep0 = (FT_UShort)args[0];
+ CUR.GS.gep1 = (FT_UShort)args[0];
+ CUR.GS.gep2 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* INSTCTRL[]: INSTruction ConTRoL */
+ /* Opcode range: 0x8e */
+ /* Stack: int32 int32 --> */
+ /* */
+ static void
+ Ins_INSTCTRL( INS_ARG )
+ {
+ FT_Long K, L;
+
+
+ K = args[1];
+ L = args[0];
+
+ if ( K < 1 || K > 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( L != 0 )
+ L = K;
+
+ CUR.GS.instruct_control = FT_BOOL(
+ ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCANCTRL[]: SCAN ConTRoL */
+ /* Opcode range: 0x85 */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_SCANCTRL( INS_ARG )
+ {
+ FT_Int A;
+
+
+ /* Get Threshold */
+ A = (FT_Int)( args[0] & 0xFF );
+
+ if ( A == 0xFF )
+ {
+ CUR.GS.scan_control = TRUE;
+ return;
+ }
+ else if ( A == 0 )
+ {
+ CUR.GS.scan_control = FALSE;
+ return;
+ }
+
+ if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
+ CUR.GS.scan_control = FALSE;
+
+ if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
+ CUR.GS.scan_control = FALSE;
+
+ if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
+ CUR.GS.scan_control = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCANTYPE[]: SCAN TYPE */
+ /* Opcode range: 0x8D */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_SCANTYPE( INS_ARG )
+ {
+ if ( args[0] >= 0 )
+ CUR.GS.scan_type = (FT_Int)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING OUTLINES */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPPT[]: FLIP PoinT */
+ /* Opcode range: 0x80 */
+ /* Stack: uint32... --> */
+ /* */
+ static void
+ Ins_FLIPPT( INS_ARG )
+ {
+ FT_UShort point;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ goto Fail;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPRGON[]: FLIP RanGe ON */
+ /* Opcode range: 0x81 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_FLIPRGON( INS_ARG )
+ {
+ FT_UShort I, K, L;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPRGOFF: FLIP RanGe OFF */
+ /* Opcode range: 0x82 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_FLIPRGOFF( INS_ARG )
+ {
+ FT_UShort I, K, L;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
+ }
+
+
+ static FT_Bool
+ Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x,
+ FT_F26Dot6* y,
+ TT_GlyphZone zone,
+ FT_UShort* refp )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort p;
+ FT_F26Dot6 d;
+
+
+ if ( CUR.opcode & 1 )
+ {
+ zp = CUR.zp0;
+ p = CUR.GS.rp1;
+ }
+ else
+ {
+ zp = CUR.zp1;
+ p = CUR.GS.rp2;
+ }
+
+ if ( BOUNDS( p, zp.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ *refp = 0;
+ return FAILURE;
+ }
+
+ *zone = zp;
+ *refp = p;
+
+ d = CUR_Func_project( zp.cur + p, zp.org + p );
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ *x = d;
+ *y = 0;
+ }
+ else
+ {
+ *x = 0;
+ *y = d;
+ }
+ }
+ else
+#endif
+ {
+ *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );
+ *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );
+ }
+
+ return SUCCESS;
+ }
+
+
+ static void
+ Move_Zp2_Point( EXEC_OP_ FT_UShort point,
+ FT_F26Dot6 dx,
+ FT_F26Dot6 dy,
+ FT_Bool touch )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ CUR.zp2.cur[point].x += dx;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+ else
+ {
+ CUR.zp2.cur[point].y += dy;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ return;
+ }
+#endif
+
+ if (CUR.zp2.cur == NULL) return; /* Security fix: Google Chris6 ufuzz109.pdf page #1 */
+ if ( CUR.GS.freeVector.x != 0 )
+ {
+ CUR.zp2.cur[point].x += dx;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ CUR.zp2.cur[point].y += dy;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHP[a]: SHift Point by the last point */
+ /* Opcode range: 0x32-0x33 */
+ /* Stack: uint32... --> */
+ /* */
+ static void
+ Ins_SHP( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+
+ FT_F26Dot6 dx,
+ dy;
+ FT_UShort point;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* doesn't follow Cleartype spec but produces better result */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ MOVE_Zp2_Point( point, 0, dy, TRUE );
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHC[a]: SHift Contour */
+ /* Opcode range: 0x34-35 */
+ /* Stack: uint32 --> */
+ /* */
+ /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) */
+ /* contour in the twilight zone, namely contour number */
+ /* zero which includes all points of it. */
+ /* */
+ static void
+ Ins_SHC( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+ FT_F26Dot6 dx, dy;
+
+ FT_Short contour, bounds;
+ FT_UShort start, limit, i;
+
+
+ contour = (FT_UShort)args[0];
+ bounds = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
+
+ if ( BOUNDS( contour, bounds ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ if ( contour == 0 )
+ start = 0;
+ else
+ start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
+ CUR.zp2.first_point );
+
+ /* we use the number of points if in the twilight zone */
+ if ( CUR.GS.gep2 == 0 )
+ limit = CUR.zp2.n_points;
+ else
+ limit = (FT_UShort)( CUR.zp2.contours[contour] -
+ CUR.zp2.first_point + 1 );
+
+ for ( i = start; i < limit; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, TRUE );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHZ[a]: SHift Zone */
+ /* Opcode range: 0x36-37 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SHZ( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+ FT_F26Dot6 dx,
+ dy;
+
+ FT_UShort limit, i;
+
+
+ if ( BOUNDS( args[0], 2 ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */
+ /* Twilight zone has no real contours, so use `n_points'. */
+ /* Normal zone's `n_points' includes phantoms, so must */
+ /* use end of last contour. */
+ if ( CUR.GS.gep2 == 0 )
+ limit = (FT_UShort)CUR.zp2.n_points;
+ else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) {
+ limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
+ if (limit >= CUR.zp2.n_points) /* XYQ 2010-10-01: security fix: validate last point index */
+ limit = CUR.zp2.n_points - 1;
+ }
+ else
+ limit = 0;
+
+ /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
+ for ( i = 0; i < limit; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, FALSE );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHPIX[]: SHift points by a PIXel amount */
+ /* Opcode range: 0x38 */
+ /* Stack: f26.6 uint32... --> */
+ /* */
+ static void
+ Ins_SHPIX( INS_ARG )
+ {
+ FT_F26Dot6 dx, dy;
+ FT_UShort point;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Int B1, B2;
+#endif
+
+
+ if ( CUR.top < CUR.GS.loop + 1 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ dx = (FT_UInt32)args[0];
+ dy = 0;
+ }
+ else
+ {
+ dx = 0;
+ dy = (FT_UInt32)args[0];
+ }
+ }
+ else
+#endif
+ {
+ dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
+ dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ {
+ /* If not using ignore_x_mode rendering, allow ZP2 move. */
+ /* If inline deltas aren't allowed, skip ZP2 move. */
+ /* If using ignore_x_mode rendering, allow ZP2 point move if: */
+ /* - freedom vector is y and sph_compatibility_mode is off */
+ /* - the glyph is composite and the move is in the Y direction */
+ /* - the glyph is specifically set to allow SHPIX moves */
+ /* - the move is on a previously Y-touched point */
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ {
+ /* save point for later comparison */
+ if ( CUR.GS.freeVector.y != 0 )
+ B1 = CUR.zp2.cur[point].y;
+ else
+ B1 = CUR.zp2.cur[point].x;
+
+ if ( !CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 )
+ {
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ /* save new point */
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ B2 = CUR.zp2.cur[point].y;
+
+ /* reverse any disallowed moves */
+ if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+ ( B1 & 63 ) != 0 &&
+ ( B2 & 63 ) != 0 &&
+ B1 != B2 )
+ MOVE_Zp2_Point( point, -dx, -dy, TRUE );
+ }
+ }
+ else if ( CUR.face->sph_compatibility_mode )
+ {
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+ {
+ dx = FT_PIX_ROUND( B1 + dx ) - B1;
+ dy = FT_PIX_ROUND( B1 + dy ) - B1;
+ }
+
+ /* skip post-iup deltas */
+ if ( CUR.iup_called &&
+ ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
+ ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
+ goto Skip;
+
+ if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
+ ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||
+ ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) )
+ MOVE_Zp2_Point( point, 0, dy, TRUE );
+
+ /* save new point */
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ B2 = CUR.zp2.cur[point].y;
+
+ /* reverse any disallowed moves */
+ if ( ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 &&
+ B1 != B2 )
+ MOVE_Zp2_Point( point, 0, -dy, TRUE );
+ }
+ }
+ else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+ }
+ else
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+ }
+
+ Skip:
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MSIRP[a]: Move Stack Indirect Relative Position */
+ /* Opcode range: 0x3A-0x3B */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ static void
+ Ins_MSIRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_F26Dot6 control_value_cutin = 0; /* pacify compiler */
+
+
+ if ( SUBPIXEL_HINTING )
+ {
+ control_value_cutin = CUR.GS.control_value_cutin;
+
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = 0;
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep1 == 0 )
+ {
+ CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+ CUR_Func_move_orig( &CUR.zp1, point, args[1] );
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* subpixel hinting - make MSIRP respect CVT cut-in; */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ FT_ABS( distance - args[1] ) >= control_value_cutin )
+ distance = args[1];
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp1, point, args[1] - distance );
+
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( ( CUR.opcode & 1 ) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MDAP[a]: Move Direct Absolute Point */
+ /* Opcode range: 0x2E-0x2F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_MDAP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 cur_dist;
+ FT_F26Dot6 distance;
+
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( ( CUR.opcode & 1 ) != 0 )
+ {
+ cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None(
+ cur_dist,
+ CUR.tt_metrics.compensations[0] ) - cur_dist;
+ else
+#endif
+ distance = CUR_Func_round(
+ cur_dist,
+ CUR.tt_metrics.compensations[0] ) - cur_dist;
+ }
+ else
+ distance = 0;
+
+ CUR_Func_move( &CUR.zp0, point, distance );
+
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIAP[a]: Move Indirect Absolute Point */
+ /* Opcode range: 0x3E-0x3F */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_MIAP( INS_ARG )
+ {
+ FT_ULong cvtEntry;
+ FT_UShort point;
+ FT_F26Dot6 distance;
+ FT_F26Dot6 org_dist;
+ FT_F26Dot6 control_value_cutin;
+
+
+ control_value_cutin = CUR.GS.control_value_cutin;
+ cvtEntry = (FT_ULong)args[1];
+ point = (FT_UShort)args[0];
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ CUR.GS.freeVector.y == 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) ||
+ BOUNDSL( cvtEntry, CUR.cvtSize ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /* UNDOCUMENTED! */
+ /* */
+ /* The behaviour of an MIAP instruction is quite different when used */
+ /* in the twilight zone. */
+ /* */
+ /* First, no control value cut-in test is performed as it would fail */
+ /* anyway. Second, the original point, i.e. (org_x,org_y) of */
+ /* zp0.point, is set to the absolute, unrounded distance found in the */
+ /* CVT. */
+ /* */
+ /* This is used in the CVT programs of the Microsoft fonts Arial, */
+ /* Times, etc., in order to re-adjust some key font heights. It */
+ /* allows the use of the IP instruction in the twilight zone, which */
+ /* otherwise would be invalid according to the specification. */
+ /* */
+ /* We implement it with a special sequence for the twilight zone. */
+ /* This is a bad hack, but it seems to work. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ distance = CUR_Func_read_cvt( cvtEntry );
+
+ if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
+ /* Determined via experimentation and may be incorrect... */
+ if ( !SUBPIXEL_HINTING ||
+ ( !CUR.ignore_x_mode ||
+ !CUR.face->sph_compatibility_mode ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
+ CUR.GS.freeVector.x );
+ CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
+ CUR.GS.freeVector.y ),
+ CUR.zp0.cur[point] = CUR.zp0.org[point];
+ }
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
+ distance > 0 &&
+ CUR.GS.freeVector.y != 0 )
+ distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+
+ if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cut-in flag */
+ {
+ if ( FT_ABS( distance - org_dist ) > control_value_cutin )
+ distance = org_dist;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None( distance,
+ CUR.tt_metrics.compensations[0] );
+ else
+#endif
+ distance = CUR_Func_round( distance,
+ CUR.tt_metrics.compensations[0] );
+ }
+
+ CUR_Func_move( &CUR.zp0, point, distance - org_dist );
+
+ Fail:
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MDRP[abcde]: Move Direct Relative Point */
+ /* Opcode range: 0xC0-0xDF */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_MDRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 org_dist, distance, minimum_distance;
+
+
+ minimum_distance = CUR.GS.minimum_distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /* XXX: Is there some undocumented feature while in the */
+ /* twilight zone? */
+
+ /* XXX: UNDOCUMENTED: twilight zone special case */
+
+ if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+ {
+ FT_Vector* vec1 = &CUR.zp1.org[point];
+ FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0];
+
+
+ org_dist = CUR_Func_dualproj( vec1, vec2 );
+ }
+ else
+ {
+ FT_Vector* vec1 = &CUR.zp1.orus[point];
+ FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0];
+
+
+ if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ {
+ /* this should be faster */
+ org_dist = CUR_Func_dualproj( vec1, vec2 );
+ org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );
+ }
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+ vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+ org_dist = CUR_fast_dualproj( &vec );
+ }
+ }
+
+ /* single width cut-in test */
+
+ if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
+ CUR.GS.single_width_cutin )
+ {
+ if ( org_dist >= 0 )
+ org_dist = CUR.GS.single_width_value;
+ else
+ org_dist = -CUR.GS.single_width_value;
+ }
+
+ /* round flag */
+
+ if ( ( CUR.opcode & 4 ) != 0 )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ else
+#endif
+ distance = CUR_Func_round(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+ else
+ distance = ROUND_None(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+
+ /* minimum distance flag */
+
+ if ( ( CUR.opcode & 8 ) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < minimum_distance )
+ distance = minimum_distance;
+ }
+ else
+ {
+ if ( distance > -minimum_distance )
+ distance = -minimum_distance;
+ }
+ }
+
+ /* now move the point */
+
+ org_dist = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, distance - org_dist );
+
+ Fail:
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( ( CUR.opcode & 16 ) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIRP[abcde]: Move Indirect Relative Point */
+ /* Opcode range: 0xE0-0xFF */
+ /* Stack: int32? uint32 --> */
+ /* */
+ static void
+ Ins_MIRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_ULong cvtEntry;
+
+ FT_F26Dot6 cvt_dist,
+ distance,
+ cur_dist,
+ org_dist,
+ control_value_cutin,
+ minimum_distance;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Int B1 = 0; /* pacify compiler */
+ FT_Int B2 = 0;
+ FT_Bool reverse_move = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ minimum_distance = CUR.GS.minimum_distance;
+ control_value_cutin = CUR.GS.control_value_cutin;
+ point = (FT_UShort)args[0];
+ cvtEntry = (FT_ULong)( args[1] + 1 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
+ /* Security fix: Google 07_oobread4.pdf page #1, cvtEntry > CUR.cvtSize + 1 will cause array index oob. */
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( cvtEntry, CUR.cvtSize + 1 ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( !cvtEntry )
+ cvt_dist = 0;
+ else
+ cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+
+ /* single width test */
+
+ if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
+ CUR.GS.single_width_cutin )
+ {
+ if ( cvt_dist >= 0 )
+ cvt_dist = CUR.GS.single_width_value;
+ else
+ cvt_dist = -CUR.GS.single_width_value;
+ }
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep1 == 0 )
+ {
+ CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
+ TT_MulFix14( (FT_UInt32)cvt_dist,
+ CUR.GS.freeVector.x );
+ CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
+ TT_MulFix14( (FT_UInt32)cvt_dist,
+ CUR.GS.freeVector.y );
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
+ &CUR.zp0.org[CUR.GS.rp0] );
+ cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
+ &CUR.zp0.cur[CUR.GS.rp0] );
+
+ /* auto-flip test */
+
+ if ( CUR.GS.auto_flip )
+ {
+ if ( ( org_dist ^ cvt_dist ) < 0 )
+ cvt_dist = -cvt_dist;
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
+ {
+ if ( cur_dist < -64 )
+ cvt_dist -= 16;
+ else if ( cur_dist > 64 && cur_dist < 84 )
+ cvt_dist += 32;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* control value cut-in and round */
+
+ if ( ( CUR.opcode & 4 ) != 0 )
+ {
+ /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */
+ /* refer to the same zone. */
+
+ if ( CUR.GS.gep0 == CUR.GS.gep1 )
+ {
+ /* XXX: According to Greg Hitchcock, the following wording is */
+ /* the right one: */
+ /* */
+ /* When the absolute difference between the value in */
+ /* the table [CVT] and the measurement directly from */
+ /* the outline is _greater_ than the cut_in value, the */
+ /* outline measurement is used. */
+ /* */
+ /* This is from `instgly.doc'. The description in */
+ /* `ttinst2.doc', version 1.66, is thus incorrect since */
+ /* it implies `>=' instead of `>'. */
+
+ if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+ cvt_dist = org_dist;
+ }
+
+ distance = CUR_Func_round(
+ cvt_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+ else
+ {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* do cvt cut-in always in MIRP for sph */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.gep0 == CUR.GS.gep1 )
+ {
+ if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+ cvt_dist = org_dist;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ distance = ROUND_None(
+ cvt_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+
+ /* minimum distance test */
+
+ if ( ( CUR.opcode & 8 ) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < minimum_distance )
+ distance = minimum_distance;
+ }
+ else
+ {
+ if ( distance > -minimum_distance )
+ distance = -minimum_distance;
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING )
+ {
+ B1 = CUR.zp1.cur[point].y;
+
+ /* Round moves if necessary */
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
+ distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
+
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.opcode & 16 ) == 0 &&
+ ( CUR.opcode & 8 ) == 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
+ distance += 64;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING )
+ {
+ B2 = CUR.zp1.cur[point].y;
+
+ /* Reverse move if necessary */
+ if ( CUR.ignore_x_mode )
+ {
+ if ( CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 )
+ reverse_move = TRUE;
+
+ if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+ CUR.GS.freeVector.y != 0 &&
+ ( B2 & 63 ) != 0 &&
+ ( B1 & 63 ) != 0 )
+ reverse_move = TRUE;
+ }
+
+ if ( reverse_move )
+ CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ Fail:
+ CUR.GS.rp1 = CUR.GS.rp0;
+
+ if ( ( CUR.opcode & 16 ) != 0 )
+ CUR.GS.rp0 = point;
+
+ CUR.GS.rp2 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ALIGNRP[]: ALIGN Relative Point */
+ /* Opcode range: 0x3C */
+ /* Stack: uint32 uint32... --> */
+ /* */
+ static void
+ Ins_ALIGNRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 distance;
+
+ FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( CUR.top < CUR.GS.loop ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ {
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, -distance );
+ }
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ISECT[]: moves point to InterSECTion */
+ /* Opcode range: 0x0F */
+ /* Stack: 5 * uint32 --> */
+ /* */
+ static void
+ Ins_ISECT( INS_ARG )
+ {
+ FT_UShort point,
+ a0, a1,
+ b0, b1;
+
+ FT_F26Dot6 discriminant, dotproduct;
+
+ FT_F26Dot6 dx, dy,
+ dax, day,
+ dbx, dby;
+
+ FT_F26Dot6 val;
+
+ FT_Vector R;
+
+
+ point = (FT_UShort)args[0];
+
+ a0 = (FT_UShort)args[1];
+ a1 = (FT_UShort)args[2];
+ b0 = (FT_UShort)args[3];
+ b1 = (FT_UShort)args[4];
+
+ if ( BOUNDS( b0, CUR.zp0.n_points ) ||
+ BOUNDS( b1, CUR.zp0.n_points ) ||
+ BOUNDS( a0, CUR.zp1.n_points ) ||
+ BOUNDS( a1, CUR.zp1.n_points ) ||
+ BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ /* Cramer's rule */
+
+ dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
+ dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
+
+ dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
+ day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
+
+ dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
+ dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
+
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
+
+ discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
+ FT_MulDiv( day, dbx, 0x40 );
+ dotproduct = FT_MulDiv( dax, dbx, 0x40 ) +
+ FT_MulDiv( day, dby, 0x40 );
+
+ /* The discriminant above is actually a cross product of vectors */
+ /* da and db. Together with the dot product, they can be used as */
+ /* surrogates for sine and cosine of the angle between the vectors. */
+ /* Indeed, */
+ /* dotproduct = |da||db|cos(angle) */
+ /* discriminant = |da||db|sin(angle) . */
+ /* We use these equations to reject grazing intersections by */
+ /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
+ if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
+ {
+ val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
+
+ R.x = FT_MulDiv( val, dax, discriminant );
+ R.y = FT_MulDiv( val, day, discriminant );
+
+ CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
+ CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
+ }
+ else
+ {
+ /* else, take the middle of the middles of A and B */
+
+ CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
+ CUR.zp1.cur[a1].x +
+ CUR.zp0.cur[b0].x +
+ CUR.zp0.cur[b1].x ) / 4;
+ CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
+ CUR.zp1.cur[a1].y +
+ CUR.zp0.cur[b0].y +
+ CUR.zp0.cur[b1].y ) / 4;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ALIGNPTS[]: ALIGN PoinTS */
+ /* Opcode range: 0x27 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_ALIGNPTS( INS_ARG )
+ {
+ FT_UShort p1, p2;
+ FT_F26Dot6 distance;
+
+
+ p1 = (FT_UShort)args[0];
+ p2 = (FT_UShort)args[1];
+
+ if ( BOUNDS( p1, CUR.zp1.n_points ) ||
+ BOUNDS( p2, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ distance = CUR_Func_project( CUR.zp0.cur + p2,
+ CUR.zp1.cur + p1 ) / 2;
+
+ CUR_Func_move( &CUR.zp1, p1, distance );
+ CUR_Func_move( &CUR.zp0, p2, -distance );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IP[]: Interpolate Point */
+ /* Opcode range: 0x39 */
+ /* Stack: uint32... --> */
+ /* */
+
+ /* SOMETIMES, DUMBER CODE IS BETTER CODE */
+
+ static void
+ Ins_IP( INS_ARG )
+ {
+ FT_F26Dot6 old_range, cur_range;
+ FT_Vector* orus_base;
+ FT_Vector* cur_base;
+ FT_Int twilight;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /*
+ * We need to deal in a special way with the twilight zone.
+ * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
+ * for every n.
+ */
+ twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
+
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( twilight )
+ orus_base = &CUR.zp0.org[CUR.GS.rp1];
+ else
+ orus_base = &CUR.zp0.orus[CUR.GS.rp1];
+
+ cur_base = &CUR.zp0.cur[CUR.GS.rp1];
+
+ /* XXX: There are some glyphs in some braindead but popular */
+ /* fonts out there (e.g. [aeu]grave in monotype.ttf) */
+ /* calling IP[] with bad values of rp[12]. */
+ /* Do something sane when this odd thing happens. */
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
+ BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
+ {
+ old_range = 0;
+ cur_range = 0;
+ }
+ else
+ {
+ if ( twilight )
+ old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
+ orus_base );
+ else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
+ orus_base );
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
+ CUR.metrics.x_scale );
+ vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
+ CUR.metrics.y_scale );
+
+ old_range = CUR_fast_dualproj( &vec );
+ }
+
+ cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
+ }
+
+ for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
+ {
+ FT_UInt point = (FT_UInt)CUR.stack[--CUR.args];
+ FT_F26Dot6 org_dist, cur_dist, new_dist;
+
+
+ /* check point bounds */
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ continue;
+ }
+
+ if ( twilight )
+ org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
+ else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,
+ CUR.metrics.x_scale );
+ vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,
+ CUR.metrics.y_scale );
+
+ org_dist = CUR_fast_dualproj( &vec );
+ }
+
+ cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
+
+ if ( org_dist )
+ {
+ if ( old_range )
+ new_dist = FT_MulDiv( org_dist, cur_range, old_range );
+ else
+ {
+ /* This is the same as what MS does for the invalid case: */
+ /* */
+ /* delta = (Original_Pt - Original_RP1) - */
+ /* (Current_Pt - Current_RP1) */
+ /* */
+ /* In FreeType speak: */
+ /* */
+ /* new_dist = cur_dist - */
+ /* org_dist - cur_dist; */
+
+ new_dist = -org_dist;
+ }
+ }
+ else
+ new_dist = 0;
+
+ CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* UTP[a]: UnTouch Point */
+ /* Opcode range: 0x29 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_UTP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_Byte mask;
+
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ mask = 0xFF;
+
+ if ( CUR.GS.freeVector.x != 0 )
+ mask &= ~FT_CURVE_TAG_TOUCH_X;
+
+ if ( CUR.GS.freeVector.y != 0 )
+ mask &= ~FT_CURVE_TAG_TOUCH_Y;
+
+ CUR.zp0.tags[point] &= mask;
+ }
+
+
+ /* Local variables for Ins_IUP: */
+ typedef struct IUP_WorkerRec_
+ {
+ FT_Vector* orgs; /* original and current coordinate */
+ FT_Vector* curs; /* arrays */
+ FT_Vector* orus;
+ FT_UInt max_points;
+
+ } IUP_WorkerRec, *IUP_Worker;
+
+
+ static void
+ _iup_worker_shift( IUP_Worker worker,
+ FT_UInt p1,
+ FT_UInt p2,
+ FT_UInt p )
+ {
+ FT_UInt i;
+ FT_F26Dot6 dx;
+
+
+ dx = worker->curs[p].x - worker->orgs[p].x;
+ if ( dx != 0 )
+ {
+ for ( i = p1; i < p; i++ )
+ worker->curs[i].x += dx;
+
+ for ( i = p + 1; i <= p2; i++ )
+ worker->curs[i].x += dx;
+ }
+ }
+
+
+ static void
+ _iup_worker_interpolate( IUP_Worker worker,
+ FT_UInt p1,
+ FT_UInt p2,
+ FT_UInt ref1,
+ FT_UInt ref2 )
+ {
+ FT_UInt i;
+ FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2;
+
+
+ if ( p1 > p2 )
+ return;
+
+ if ( BOUNDS( ref1, worker->max_points ) ||
+ BOUNDS( ref2, worker->max_points ) )
+ return;
+
+ orus1 = worker->orus[ref1].x;
+ orus2 = worker->orus[ref2].x;
+
+ if ( orus1 > orus2 )
+ {
+ FT_F26Dot6 tmp_o;
+ FT_UInt tmp_r;
+
+
+ tmp_o = orus1;
+ orus1 = orus2;
+ orus2 = tmp_o;
+
+ tmp_r = ref1;
+ ref1 = ref2;
+ ref2 = tmp_r;
+ }
+
+ org1 = worker->orgs[ref1].x;
+ org2 = worker->orgs[ref2].x;
+ delta1 = worker->curs[ref1].x - org1;
+ delta2 = worker->curs[ref2].x - org2;
+
+ if ( orus1 == orus2 )
+ {
+ /* simple shift of untouched points */
+ for ( i = p1; i <= p2; i++ )
+ {
+ FT_F26Dot6 x = worker->orgs[i].x;
+
+
+ if ( x <= org1 )
+ x += delta1;
+ else
+ x += delta2;
+
+ worker->curs[i].x = x;
+ }
+ }
+ else
+ {
+ FT_Fixed scale = 0;
+ FT_Bool scale_valid = 0;
+
+
+ /* interpolation */
+ for ( i = p1; i <= p2; i++ )
+ {
+ FT_F26Dot6 x = worker->orgs[i].x;
+
+
+ if ( x <= org1 )
+ x += delta1;
+
+ else if ( x >= org2 )
+ x += delta2;
+
+ else
+ {
+ if ( !scale_valid )
+ {
+ scale_valid = 1;
+ scale = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),
+ orus2 - orus1 );
+ }
+
+ x = ( org1 + delta1 ) +
+ FT_MulFix( worker->orus[i].x - orus1, scale );
+ }
+ worker->curs[i].x = x;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IUP[a]: Interpolate Untouched Points */
+ /* Opcode range: 0x30-0x31 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_IUP( INS_ARG )
+ {
+ IUP_WorkerRec V;
+ FT_Byte mask;
+
+ FT_UInt first_point; /* first point of contour */
+ FT_UInt end_point; /* end point (last+1) of contour */
+
+ FT_UInt first_touched; /* first touched point in contour */
+ FT_UInt cur_touched; /* current touched point in contour */
+
+ FT_UInt point; /* current point */
+ FT_Short contour; /* current contour */
+
+ FT_UNUSED_ARG;
+
+
+ /* ignore empty outlines */
+ if ( CUR.pts.n_contours == 0 )
+ return;
+
+ if ( CUR.opcode & 1 )
+ {
+ mask = FT_CURVE_TAG_TOUCH_X;
+ V.orgs = CUR.pts.org;
+ V.curs = CUR.pts.cur;
+ V.orus = CUR.pts.orus;
+ }
+ else
+ {
+ mask = FT_CURVE_TAG_TOUCH_Y;
+ V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
+ V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
+ V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
+ }
+ V.max_points = CUR.pts.n_points;
+
+ contour = 0;
+ point = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ {
+ CUR.iup_called = TRUE;
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
+ return;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ do
+ {
+ end_point = CUR.pts.contours[contour] - CUR.pts.first_point;
+ first_point = point;
+
+ if ( BOUNDS ( end_point, CUR.pts.n_points ) )
+ end_point = CUR.pts.n_points - 1;
+
+ while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
+ point++;
+
+ if ( point <= end_point )
+ {
+ first_touched = point;
+ cur_touched = point;
+
+ point++;
+
+ while ( point <= end_point )
+ {
+ if ( ( CUR.pts.tags[point] & mask ) != 0 )
+ {
+ _iup_worker_interpolate( &V,
+ cur_touched + 1,
+ point - 1,
+ cur_touched,
+ point );
+ cur_touched = point;
+ }
+
+ point++;
+ }
+
+ if ( cur_touched == first_touched )
+ _iup_worker_shift( &V, first_point, end_point, cur_touched );
+ else
+ {
+ _iup_worker_interpolate( &V,
+ (FT_UShort)( cur_touched + 1 ),
+ end_point,
+ cur_touched,
+ first_touched );
+
+ if ( first_touched > 0 )
+ _iup_worker_interpolate( &V,
+ first_point,
+ first_touched - 1,
+ cur_touched,
+ first_touched );
+ }
+ }
+ contour++;
+ } while ( contour < CUR.pts.n_contours );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DELTAPn[]: DELTA exceptions P1, P2, P3 */
+ /* Opcode range: 0x5D,0x71,0x72 */
+ /* Stack: uint32 (2 * uint32)... --> */
+ /* */
+ static void
+ Ins_DELTAP( INS_ARG )
+ {
+ FT_ULong k, nump;
+ FT_UShort A;
+ FT_ULong C;
+ FT_Long B;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_UShort B1, B2;
+
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
+ goto Fail;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Delta hinting is covered by US Patent 5159668. */
+ if ( CUR.face->unpatented_hinting )
+ {
+ FT_Long n = args[0] * 2;
+
+
+ if ( CUR.args < n )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ n = CUR.args;
+ }
+
+ CUR.args -= n;
+ CUR.new_top = CUR.args;
+ return;
+ }
+#endif
+
+ nump = (FT_ULong)args[0]; /* some points theoretically may occur more
+ than once, thus UShort isn't enough */
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ CUR.args = 0;
+ goto Fail;
+ }
+
+ CUR.args -= 2;
+
+ A = (FT_UShort)CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ /* XXX: Because some popular fonts contain some invalid DeltaP */
+ /* instructions, we simply ignore them when the stacked */
+ /* point reference is off limit, rather than returning an */
+ /* error. As a delta instruction doesn't change a glyph */
+ /* in great ways, this shouldn't be a problem. */
+
+ if ( !BOUNDS( A, CUR.zp0.n_points ) )
+ {
+ C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x5D:
+ break;
+
+ case 0x71:
+ C += 16;
+ break;
+
+ case 0x72:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == (FT_Long)C )
+ {
+ B = ( (FT_ULong)B & 0xF ) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ /*
+ * Allow delta move if
+ *
+ * - not using ignore_x_mode rendering
+ * - glyph is specifically set to allow it
+ * - glyph is composite and freedom vector is not subpixel
+ * vector
+ */
+ if ( !CUR.ignore_x_mode ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
+ ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) )
+ CUR_Func_move( &CUR.zp0, A, B );
+
+ /* Otherwise apply subpixel hinting and */
+ /* compatibility mode rules */
+ else if ( CUR.ignore_x_mode )
+ {
+ if ( CUR.GS.freeVector.y != 0 )
+ B1 = CUR.zp0.cur[A].y;
+ else
+ B1 = CUR.zp0.cur[A].x;
+
+#if 0
+ /* Standard Subpixel Hinting: Allow y move. */
+ /* This messes up dejavu and may not be needed... */
+ if ( !CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 )
+ CUR_Func_move( &CUR.zp0, A, B );
+ else
+#endif /* 0 */
+
+ /* Compatibility Mode: Allow x or y move if point touched in */
+ /* Y direction. */
+ if ( CUR.face->sph_compatibility_mode &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
+ {
+ /* save the y value of the point now; compare after move */
+ B1 = CUR.zp0.cur[A].y;
+
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+ B = FT_PIX_ROUND( B1 + B ) - B1;
+
+ /* Allow delta move if using sph_compatibility_mode, */
+ /* IUP has not been called, and point is touched on Y. */
+ if ( !CUR.iup_called &&
+ ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
+ CUR_Func_move( &CUR.zp0, A, B );
+ }
+
+ B2 = CUR.zp0.cur[A].y;
+
+ /* Reverse this move if it results in a disallowed move */
+ if ( CUR.GS.freeVector.y != 0 &&
+ ( ( CUR.face->sph_compatibility_mode &&
+ ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 ) ||
+ ( ( CUR.sph_tweak_flags &
+ SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
+ ( B1 & 63 ) != 0 &&
+ ( B2 & 63 ) != 0 ) ) )
+ CUR_Func_move( &CUR.zp0, A, -B );
+ }
+ }
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp0, A, B );
+ }
+ }
+ else
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+ Fail:
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DELTACn[]: DELTA exceptions C1, C2, C3 */
+ /* Opcode range: 0x73,0x74,0x75 */
+ /* Stack: uint32 (2 * uint32)... --> */
+ /* */
+ static void
+ Ins_DELTAC( INS_ARG )
+ {
+ FT_ULong nump, k;
+ FT_ULong A, C;
+ FT_Long B;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Delta hinting is covered by US Patent 5159668. */
+ if ( CUR.face->unpatented_hinting )
+ {
+ FT_Long n = args[0] * 2;
+
+
+ if ( CUR.args < n )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ n = CUR.args;
+ }
+
+ CUR.args -= n;
+ CUR.new_top = CUR.args;
+ return;
+ }
+#endif
+
+ nump = (FT_ULong)args[0];
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ CUR.args = 0;
+ goto Fail;
+ }
+
+ CUR.args -= 2;
+
+ A = (FT_ULong)CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ if ( BOUNDSL( A, CUR.cvtSize ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ {
+ C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x73:
+ break;
+
+ case 0x74:
+ C += 16;
+ break;
+
+ case 0x75:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == (FT_Long)C )
+ {
+ B = ( (FT_ULong)B & 0xF ) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+ CUR_Func_move_cvt( A, B );
+ }
+ }
+ }
+
+ Fail:
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MISC. INSTRUCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* GETINFO[]: GET INFOrmation */
+ /* Opcode range: 0x88 */
+ /* Stack: uint32 --> uint32 */
+ /* */
+ static void
+ Ins_GETINFO( INS_ARG )
+ {
+ FT_Long K;
+
+
+ K = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /********************************/
+ /* RASTERIZER VERSION */
+ /* Selector Bit: 0 */
+ /* Return Bit(s): 0-7 */
+ /* */
+ if ( SUBPIXEL_HINTING &&
+ ( args[0] & 1 ) != 0 &&
+ CUR.ignore_x_mode )
+ {
+ K = CUR.rasterizer_version;
+ FT_TRACE7(( "Setting rasterizer version %d\n",
+ CUR.rasterizer_version ));
+ }
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ if ( ( args[0] & 1 ) != 0 )
+ K = TT_INTERPRETER_VERSION_35;
+
+ /********************************/
+ /* GLYPH ROTATED */
+ /* Selector Bit: 1 */
+ /* Return Bit(s): 8 */
+ /* */
+ if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
+ K |= 0x80;
+
+ /********************************/
+ /* GLYPH STRETCHED */
+ /* Selector Bit: 2 */
+ /* Return Bit(s): 9 */
+ /* */
+ if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
+ K |= 1 << 8;
+
+ /********************************/
+ /* HINTING FOR GRAYSCALE */
+ /* Selector Bit: 5 */
+ /* Return Bit(s): 12 */
+ /* */
+ if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
+ K |= 1 << 12;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )
+ {
+ /********************************/
+ /* HINTING FOR GRAYSCALE */
+ /* Selector Bit: 5 */
+ /* Return Bit(s): 12 */
+ /* */
+ if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )
+ K |= 1 << 12;
+
+ /********************************/
+ /* HINTING FOR SUBPIXEL */
+ /* Selector Bit: 6 */
+ /* Return Bit(s): 13 */
+ /* */
+ if ( ( args[0] & 64 ) != 0 &&
+ CUR.subpixel_hinting &&
+ CUR.rasterizer_version >= 37 )
+ {
+ K |= 1 << 13;
+
+ /* the stuff below is irrelevant if subpixel_hinting is not set */
+
+ /********************************/
+ /* COMPATIBLE WIDTHS ENABLED */
+ /* Selector Bit: 7 */
+ /* Return Bit(s): 14 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )
+ K |= 1 << 14;
+
+ /********************************/
+ /* SYMMETRICAL SMOOTHING */
+ /* Selector Bit: 8 */
+ /* Return Bit(s): 15 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )
+ K |= 1 << 15;
+
+ /********************************/
+ /* HINTING FOR BGR? */
+ /* Selector Bit: 9 */
+ /* Return Bit(s): 16 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 512 ) != 0 && CUR.bgr )
+ K |= 1 << 16;
+
+ if ( CUR.rasterizer_version >= 38 )
+ {
+ /********************************/
+ /* SUBPIXEL POSITIONED? */
+ /* Selector Bit: 10 */
+ /* Return Bit(s): 17 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )
+ K |= 1 << 17;
+ }
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ args[0] = K;
+ }
+
+
+ static void
+ Ins_UNKNOWN( INS_ARG )
+ {
+ TT_DefRecord* def = CUR.IDefs;
+ TT_DefRecord* limit = def + CUR.numIDefs;
+
+ FT_UNUSED_ARG;
+
+
+ for ( ; def < limit; def++ )
+ {
+ if ( (FT_Byte)def->opc == CUR.opcode && def->active )
+ {
+ TT_CallRec* call;
+
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ call = CUR.callStack + CUR.callTop++;
+
+ call->Caller_Range = CUR.curRange;
+ call->Caller_IP = CUR.IP + 1;
+ call->Cur_Count = 1;
+ call->Cur_Restart = def->start;
+ call->Cur_End = def->end;
+
+ INS_Goto_CodeRange( def->range, def->start );
+
+ CUR.step_ins = FALSE;
+ return;
+ }
+ }
+
+ CUR.error = FT_THROW( Invalid_Opcode );
+ }
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+ static
+ TInstruction_Function Instruct_Dispatch[256] =
+ {
+ /* Opcodes are gathered in groups of 16. */
+ /* Please keep the spaces as they are. */
+
+ /* SVTCA y */ Ins_SVTCA,
+ /* SVTCA x */ Ins_SVTCA,
+ /* SPvTCA y */ Ins_SPVTCA,
+ /* SPvTCA x */ Ins_SPVTCA,
+ /* SFvTCA y */ Ins_SFVTCA,
+ /* SFvTCA x */ Ins_SFVTCA,
+ /* SPvTL // */ Ins_SPVTL,
+ /* SPvTL + */ Ins_SPVTL,
+ /* SFvTL // */ Ins_SFVTL,
+ /* SFvTL + */ Ins_SFVTL,
+ /* SPvFS */ Ins_SPVFS,
+ /* SFvFS */ Ins_SFVFS,
+ /* GPV */ Ins_GPV,
+ /* GFV */ Ins_GFV,
+ /* SFvTPv */ Ins_SFVTPV,
+ /* ISECT */ Ins_ISECT,
+
+ /* SRP0 */ Ins_SRP0,
+ /* SRP1 */ Ins_SRP1,
+ /* SRP2 */ Ins_SRP2,
+ /* SZP0 */ Ins_SZP0,
+ /* SZP1 */ Ins_SZP1,
+ /* SZP2 */ Ins_SZP2,
+ /* SZPS */ Ins_SZPS,
+ /* SLOOP */ Ins_SLOOP,
+ /* RTG */ Ins_RTG,
+ /* RTHG */ Ins_RTHG,
+ /* SMD */ Ins_SMD,
+ /* ELSE */ Ins_ELSE,
+ /* JMPR */ Ins_JMPR,
+ /* SCvTCi */ Ins_SCVTCI,
+ /* SSwCi */ Ins_SSWCI,
+ /* SSW */ Ins_SSW,
+
+ /* DUP */ Ins_DUP,
+ /* POP */ Ins_POP,
+ /* CLEAR */ Ins_CLEAR,
+ /* SWAP */ Ins_SWAP,
+ /* DEPTH */ Ins_DEPTH,
+ /* CINDEX */ Ins_CINDEX,
+ /* MINDEX */ Ins_MINDEX,
+ /* AlignPTS */ Ins_ALIGNPTS,
+ /* INS_0x28 */ Ins_UNKNOWN,
+ /* UTP */ Ins_UTP,
+ /* LOOPCALL */ Ins_LOOPCALL,
+ /* CALL */ Ins_CALL,
+ /* FDEF */ Ins_FDEF,
+ /* ENDF */ Ins_ENDF,
+ /* MDAP[0] */ Ins_MDAP,
+ /* MDAP[1] */ Ins_MDAP,
+
+ /* IUP[0] */ Ins_IUP,
+ /* IUP[1] */ Ins_IUP,
+ /* SHP[0] */ Ins_SHP,
+ /* SHP[1] */ Ins_SHP,
+ /* SHC[0] */ Ins_SHC,
+ /* SHC[1] */ Ins_SHC,
+ /* SHZ[0] */ Ins_SHZ,
+ /* SHZ[1] */ Ins_SHZ,
+ /* SHPIX */ Ins_SHPIX,
+ /* IP */ Ins_IP,
+ /* MSIRP[0] */ Ins_MSIRP,
+ /* MSIRP[1] */ Ins_MSIRP,
+ /* AlignRP */ Ins_ALIGNRP,
+ /* RTDG */ Ins_RTDG,
+ /* MIAP[0] */ Ins_MIAP,
+ /* MIAP[1] */ Ins_MIAP,
+
+ /* NPushB */ Ins_NPUSHB,
+ /* NPushW */ Ins_NPUSHW,
+ /* WS */ Ins_WS,
+ /* RS */ Ins_RS,
+ /* WCvtP */ Ins_WCVTP,
+ /* RCvt */ Ins_RCVT,
+ /* GC[0] */ Ins_GC,
+ /* GC[1] */ Ins_GC,
+ /* SCFS */ Ins_SCFS,
+ /* MD[0] */ Ins_MD,
+ /* MD[1] */ Ins_MD,
+ /* MPPEM */ Ins_MPPEM,
+ /* MPS */ Ins_MPS,
+ /* FlipON */ Ins_FLIPON,
+ /* FlipOFF */ Ins_FLIPOFF,
+ /* DEBUG */ Ins_DEBUG,
+
+ /* LT */ Ins_LT,
+ /* LTEQ */ Ins_LTEQ,
+ /* GT */ Ins_GT,
+ /* GTEQ */ Ins_GTEQ,
+ /* EQ */ Ins_EQ,
+ /* NEQ */ Ins_NEQ,
+ /* ODD */ Ins_ODD,
+ /* EVEN */ Ins_EVEN,
+ /* IF */ Ins_IF,
+ /* EIF */ Ins_EIF,
+ /* AND */ Ins_AND,
+ /* OR */ Ins_OR,
+ /* NOT */ Ins_NOT,
+ /* DeltaP1 */ Ins_DELTAP,
+ /* SDB */ Ins_SDB,
+ /* SDS */ Ins_SDS,
+
+ /* ADD */ Ins_ADD,
+ /* SUB */ Ins_SUB,
+ /* DIV */ Ins_DIV,
+ /* MUL */ Ins_MUL,
+ /* ABS */ Ins_ABS,
+ /* NEG */ Ins_NEG,
+ /* FLOOR */ Ins_FLOOR,
+ /* CEILING */ Ins_CEILING,
+ /* ROUND[0] */ Ins_ROUND,
+ /* ROUND[1] */ Ins_ROUND,
+ /* ROUND[2] */ Ins_ROUND,
+ /* ROUND[3] */ Ins_ROUND,
+ /* NROUND[0] */ Ins_NROUND,
+ /* NROUND[1] */ Ins_NROUND,
+ /* NROUND[2] */ Ins_NROUND,
+ /* NROUND[3] */ Ins_NROUND,
+
+ /* WCvtF */ Ins_WCVTF,
+ /* DeltaP2 */ Ins_DELTAP,
+ /* DeltaP3 */ Ins_DELTAP,
+ /* DeltaCn[0] */ Ins_DELTAC,
+ /* DeltaCn[1] */ Ins_DELTAC,
+ /* DeltaCn[2] */ Ins_DELTAC,
+ /* SROUND */ Ins_SROUND,
+ /* S45Round */ Ins_S45ROUND,
+ /* JROT */ Ins_JROT,
+ /* JROF */ Ins_JROF,
+ /* ROFF */ Ins_ROFF,
+ /* INS_0x7B */ Ins_UNKNOWN,
+ /* RUTG */ Ins_RUTG,
+ /* RDTG */ Ins_RDTG,
+ /* SANGW */ Ins_SANGW,
+ /* AA */ Ins_AA,
+
+ /* FlipPT */ Ins_FLIPPT,
+ /* FlipRgON */ Ins_FLIPRGON,
+ /* FlipRgOFF */ Ins_FLIPRGOFF,
+ /* INS_0x83 */ Ins_UNKNOWN,
+ /* INS_0x84 */ Ins_UNKNOWN,
+ /* ScanCTRL */ Ins_SCANCTRL,
+ /* SDPVTL[0] */ Ins_SDPVTL,
+ /* SDPVTL[1] */ Ins_SDPVTL,
+ /* GetINFO */ Ins_GETINFO,
+ /* IDEF */ Ins_IDEF,
+ /* ROLL */ Ins_ROLL,
+ /* MAX */ Ins_MAX,
+ /* MIN */ Ins_MIN,
+ /* ScanTYPE */ Ins_SCANTYPE,
+ /* InstCTRL */ Ins_INSTCTRL,
+ /* INS_0x8F */ Ins_UNKNOWN,
+
+ /* INS_0x90 */ Ins_UNKNOWN,
+ /* INS_0x91 */ Ins_UNKNOWN,
+ /* INS_0x92 */ Ins_UNKNOWN,
+ /* INS_0x93 */ Ins_UNKNOWN,
+ /* INS_0x94 */ Ins_UNKNOWN,
+ /* INS_0x95 */ Ins_UNKNOWN,
+ /* INS_0x96 */ Ins_UNKNOWN,
+ /* INS_0x97 */ Ins_UNKNOWN,
+ /* INS_0x98 */ Ins_UNKNOWN,
+ /* INS_0x99 */ Ins_UNKNOWN,
+ /* INS_0x9A */ Ins_UNKNOWN,
+ /* INS_0x9B */ Ins_UNKNOWN,
+ /* INS_0x9C */ Ins_UNKNOWN,
+ /* INS_0x9D */ Ins_UNKNOWN,
+ /* INS_0x9E */ Ins_UNKNOWN,
+ /* INS_0x9F */ Ins_UNKNOWN,
+
+ /* INS_0xA0 */ Ins_UNKNOWN,
+ /* INS_0xA1 */ Ins_UNKNOWN,
+ /* INS_0xA2 */ Ins_UNKNOWN,
+ /* INS_0xA3 */ Ins_UNKNOWN,
+ /* INS_0xA4 */ Ins_UNKNOWN,
+ /* INS_0xA5 */ Ins_UNKNOWN,
+ /* INS_0xA6 */ Ins_UNKNOWN,
+ /* INS_0xA7 */ Ins_UNKNOWN,
+ /* INS_0xA8 */ Ins_UNKNOWN,
+ /* INS_0xA9 */ Ins_UNKNOWN,
+ /* INS_0xAA */ Ins_UNKNOWN,
+ /* INS_0xAB */ Ins_UNKNOWN,
+ /* INS_0xAC */ Ins_UNKNOWN,
+ /* INS_0xAD */ Ins_UNKNOWN,
+ /* INS_0xAE */ Ins_UNKNOWN,
+ /* INS_0xAF */ Ins_UNKNOWN,
+
+ /* PushB[0] */ Ins_PUSHB,
+ /* PushB[1] */ Ins_PUSHB,
+ /* PushB[2] */ Ins_PUSHB,
+ /* PushB[3] */ Ins_PUSHB,
+ /* PushB[4] */ Ins_PUSHB,
+ /* PushB[5] */ Ins_PUSHB,
+ /* PushB[6] */ Ins_PUSHB,
+ /* PushB[7] */ Ins_PUSHB,
+ /* PushW[0] */ Ins_PUSHW,
+ /* PushW[1] */ Ins_PUSHW,
+ /* PushW[2] */ Ins_PUSHW,
+ /* PushW[3] */ Ins_PUSHW,
+ /* PushW[4] */ Ins_PUSHW,
+ /* PushW[5] */ Ins_PUSHW,
+ /* PushW[6] */ Ins_PUSHW,
+ /* PushW[7] */ Ins_PUSHW,
+
+ /* MDRP[00] */ Ins_MDRP,
+ /* MDRP[01] */ Ins_MDRP,
+ /* MDRP[02] */ Ins_MDRP,
+ /* MDRP[03] */ Ins_MDRP,
+ /* MDRP[04] */ Ins_MDRP,
+ /* MDRP[05] */ Ins_MDRP,
+ /* MDRP[06] */ Ins_MDRP,
+ /* MDRP[07] */ Ins_MDRP,
+ /* MDRP[08] */ Ins_MDRP,
+ /* MDRP[09] */ Ins_MDRP,
+ /* MDRP[10] */ Ins_MDRP,
+ /* MDRP[11] */ Ins_MDRP,
+ /* MDRP[12] */ Ins_MDRP,
+ /* MDRP[13] */ Ins_MDRP,
+ /* MDRP[14] */ Ins_MDRP,
+ /* MDRP[15] */ Ins_MDRP,
+
+ /* MDRP[16] */ Ins_MDRP,
+ /* MDRP[17] */ Ins_MDRP,
+ /* MDRP[18] */ Ins_MDRP,
+ /* MDRP[19] */ Ins_MDRP,
+ /* MDRP[20] */ Ins_MDRP,
+ /* MDRP[21] */ Ins_MDRP,
+ /* MDRP[22] */ Ins_MDRP,
+ /* MDRP[23] */ Ins_MDRP,
+ /* MDRP[24] */ Ins_MDRP,
+ /* MDRP[25] */ Ins_MDRP,
+ /* MDRP[26] */ Ins_MDRP,
+ /* MDRP[27] */ Ins_MDRP,
+ /* MDRP[28] */ Ins_MDRP,
+ /* MDRP[29] */ Ins_MDRP,
+ /* MDRP[30] */ Ins_MDRP,
+ /* MDRP[31] */ Ins_MDRP,
+
+ /* MIRP[00] */ Ins_MIRP,
+ /* MIRP[01] */ Ins_MIRP,
+ /* MIRP[02] */ Ins_MIRP,
+ /* MIRP[03] */ Ins_MIRP,
+ /* MIRP[04] */ Ins_MIRP,
+ /* MIRP[05] */ Ins_MIRP,
+ /* MIRP[06] */ Ins_MIRP,
+ /* MIRP[07] */ Ins_MIRP,
+ /* MIRP[08] */ Ins_MIRP,
+ /* MIRP[09] */ Ins_MIRP,
+ /* MIRP[10] */ Ins_MIRP,
+ /* MIRP[11] */ Ins_MIRP,
+ /* MIRP[12] */ Ins_MIRP,
+ /* MIRP[13] */ Ins_MIRP,
+ /* MIRP[14] */ Ins_MIRP,
+ /* MIRP[15] */ Ins_MIRP,
+
+ /* MIRP[16] */ Ins_MIRP,
+ /* MIRP[17] */ Ins_MIRP,
+ /* MIRP[18] */ Ins_MIRP,
+ /* MIRP[19] */ Ins_MIRP,
+ /* MIRP[20] */ Ins_MIRP,
+ /* MIRP[21] */ Ins_MIRP,
+ /* MIRP[22] */ Ins_MIRP,
+ /* MIRP[23] */ Ins_MIRP,
+ /* MIRP[24] */ Ins_MIRP,
+ /* MIRP[25] */ Ins_MIRP,
+ /* MIRP[26] */ Ins_MIRP,
+ /* MIRP[27] */ Ins_MIRP,
+ /* MIRP[28] */ Ins_MIRP,
+ /* MIRP[29] */ Ins_MIRP,
+ /* MIRP[30] */ Ins_MIRP,
+ /* MIRP[31] */ Ins_MIRP
+ };
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+ /*************************************************************************/
+ /* */
+ /* RUN */
+ /* */
+ /* This function executes a run of opcodes. It will exit in the */
+ /* following cases: */
+ /* */
+ /* - Errors (in which case it returns FALSE). */
+ /* */
+ /* - Reaching the end of the main code range (returns TRUE). */
+ /* Reaching the end of a code range within a function call is an */
+ /* error. */
+ /* */
+ /* - After executing one single opcode, if the flag `Instruction_Trap' */
+ /* is set to TRUE (returns TRUE). */
+ /* */
+ /* On exit with TRUE, test IP < CodeSize to know whether it comes from */
+ /* an instruction trap or a normal termination. */
+ /* */
+ /* */
+ /* Note: The documented DEBUG opcode pops a value from the stack. This */
+ /* behaviour is unsupported; here a DEBUG opcode is always an */
+ /* error. */
+ /* */
+ /* */
+ /* THIS IS THE INTERPRETER'S MAIN LOOP. */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /* documentation is in ttinterp.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ TT_RunIns( TT_ExecContext exc )
+ {
+ FT_Long ins_counter = 0; /* executed instructions counter */
+ FT_UShort i;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Byte opcode_pattern[1][2] = {
+ /* #8 TypeMan Talk Align */
+ {
+ 0x06, /* SPVTL */
+ 0x7D, /* RDTG */
+ },
+ };
+ FT_UShort opcode_patterns = 1;
+ FT_UShort opcode_pointer[1] = { 0 };
+ FT_UShort opcode_size[1] = { 1 };
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ cur = *exc;
+#endif
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ CUR.iup_called = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* set CVT functions */
+ CUR.tt_metrics.ratio = 0;
+ if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
+ {
+ /* non-square pixels, use the stretched routines */
+ CUR.func_read_cvt = Read_CVT_Stretched;
+ CUR.func_write_cvt = Write_CVT_Stretched;
+ CUR.func_move_cvt = Move_CVT_Stretched;
+ }
+ else
+ {
+ /* square pixels, use normal routines */
+ CUR.func_read_cvt = Read_CVT;
+ CUR.func_write_cvt = Write_CVT;
+ CUR.func_move_cvt = Move_CVT;
+ }
+
+ COMPUTE_Funcs();
+ COMPUTE_Round( (FT_Byte)exc->GS.round_state );
+
+ do
+ {
+ CUR.opcode = CUR.code[CUR.IP];
+
+ FT_TRACE7(( " " ));
+ FT_TRACE7(( opcode_name[CUR.opcode] ));
+ FT_TRACE7(( "\n" ));
+
+ if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
+ {
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ goto LErrorCodeOverflow_;
+
+ CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+ }
+
+ if ( CUR.IP + CUR.length > CUR.codeSize )
+ goto LErrorCodeOverflow_;
+
+ /* First, let's check for empty stack and overflow */
+ CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
+
+ /* `args' is the top of the stack once arguments have been popped. */
+ /* One can also interpret it as the index of the last argument. */
+ if ( CUR.args < 0 )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ goto LErrorLabel_;
+ }
+
+ /* push zeroes onto the stack */
+ for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
+ CUR.stack[i] = 0;
+ CUR.args = 0;
+ }
+
+ CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
+
+ /* `new_top' is the new top of the stack, after the instruction's */
+ /* execution. `top' will be set to `new_top' after the `switch' */
+ /* statement. */
+ if ( CUR.new_top > CUR.stackSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ goto LErrorLabel_;
+ }
+
+ CUR.step_ins = TRUE;
+ CUR.error = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ for ( i = 0; i < opcode_patterns; i++ )
+ {
+ if ( opcode_pointer[i] < opcode_size[i] &&
+ CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+ {
+ opcode_pointer[i] += 1;
+
+ if ( opcode_pointer[i] == opcode_size[i] )
+ {
+ FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n",
+ i,
+ CUR.face->root.family_name,
+ CUR.face->root.style_name ));
+
+ switch ( i )
+ {
+ case 0:
+ break;
+ }
+ opcode_pointer[i] = 0;
+ }
+ }
+ else
+ opcode_pointer[i] = 0;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+ {
+ FT_Long* args = CUR.stack + CUR.args;
+ FT_Byte opcode = CUR.opcode;
+
+
+#undef ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref
+
+
+ switch ( opcode )
+ {
+ case 0x00: /* SVTCA y */
+ case 0x01: /* SVTCA x */
+ case 0x02: /* SPvTCA y */
+ case 0x03: /* SPvTCA x */
+ case 0x04: /* SFvTCA y */
+ case 0x05: /* SFvTCA x */
+ {
+ FT_Short AA, BB;
+
+
+ AA = (FT_Short)( ( opcode & 1 ) << 14 );
+ BB = (FT_Short)( AA ^ 0x4000 );
+
+ if ( opcode < 4 )
+ {
+ CUR.GS.projVector.x = AA;
+ CUR.GS.projVector.y = BB;
+
+ CUR.GS.dualVector.x = AA;
+ CUR.GS.dualVector.y = BB;
+ }
+ else
+ {
+ GUESS_VECTOR( projVector );
+ }
+
+ if ( ( opcode & 2 ) == 0 )
+ {
+ CUR.GS.freeVector.x = AA;
+ CUR.GS.freeVector.y = BB;
+ }
+ else
+ {
+ GUESS_VECTOR( freeVector );
+ }
+
+ COMPUTE_Funcs();
+ }
+ break;
+
+ case 0x06: /* SPvTL // */
+ case 0x07: /* SPvTL + */
+ DO_SPVTL
+ break;
+
+ case 0x08: /* SFvTL // */
+ case 0x09: /* SFvTL + */
+ DO_SFVTL
+ break;
+
+ case 0x0A: /* SPvFS */
+ DO_SPVFS
+ break;
+
+ case 0x0B: /* SFvFS */
+ DO_SFVFS
+ break;
+
+ case 0x0C: /* GPV */
+ DO_GPV
+ break;
+
+ case 0x0D: /* GFV */
+ DO_GFV
+ break;
+
+ case 0x0E: /* SFvTPv */
+ DO_SFVTPV
+ break;
+
+ case 0x0F: /* ISECT */
+ Ins_ISECT( EXEC_ARG_ args );
+ break;
+
+ case 0x10: /* SRP0 */
+ DO_SRP0
+ break;
+
+ case 0x11: /* SRP1 */
+ DO_SRP1
+ break;
+
+ case 0x12: /* SRP2 */
+ DO_SRP2
+ break;
+
+ case 0x13: /* SZP0 */
+ Ins_SZP0( EXEC_ARG_ args );
+ break;
+
+ case 0x14: /* SZP1 */
+ Ins_SZP1( EXEC_ARG_ args );
+ break;
+
+ case 0x15: /* SZP2 */
+ Ins_SZP2( EXEC_ARG_ args );
+ break;
+
+ case 0x16: /* SZPS */
+ Ins_SZPS( EXEC_ARG_ args );
+ break;
+
+ case 0x17: /* SLOOP */
+ DO_SLOOP
+ break;
+
+ case 0x18: /* RTG */
+ DO_RTG
+ break;
+
+ case 0x19: /* RTHG */
+ DO_RTHG
+ break;
+
+ case 0x1A: /* SMD */
+ DO_SMD
+ break;
+
+ case 0x1B: /* ELSE */
+ Ins_ELSE( EXEC_ARG_ args );
+ break;
+
+ case 0x1C: /* JMPR */
+ DO_JMPR
+ break;
+
+ case 0x1D: /* SCVTCI */
+ DO_SCVTCI
+ break;
+
+ case 0x1E: /* SSWCI */
+ DO_SSWCI
+ break;
+
+ case 0x1F: /* SSW */
+ DO_SSW
+ break;
+
+ case 0x20: /* DUP */
+ DO_DUP
+ break;
+
+ case 0x21: /* POP */
+ /* nothing :-) */
+ break;
+
+ case 0x22: /* CLEAR */
+ DO_CLEAR
+ break;
+
+ case 0x23: /* SWAP */
+ DO_SWAP
+ break;
+
+ case 0x24: /* DEPTH */
+ DO_DEPTH
+ break;
+
+ case 0x25: /* CINDEX */
+ DO_CINDEX
+ break;
+
+ case 0x26: /* MINDEX */
+ Ins_MINDEX( EXEC_ARG_ args );
+ break;
+
+ case 0x27: /* ALIGNPTS */
+ Ins_ALIGNPTS( EXEC_ARG_ args );
+ break;
+
+ case 0x28: /* ???? */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x29: /* UTP */
+ Ins_UTP( EXEC_ARG_ args );
+ break;
+
+ case 0x2A: /* LOOPCALL */
+ Ins_LOOPCALL( EXEC_ARG_ args );
+ break;
+
+ case 0x2B: /* CALL */
+ Ins_CALL( EXEC_ARG_ args );
+ break;
+
+ case 0x2C: /* FDEF */
+ Ins_FDEF( EXEC_ARG_ args );
+ break;
+
+ case 0x2D: /* ENDF */
+ Ins_ENDF( EXEC_ARG_ args );
+ break;
+
+ case 0x2E: /* MDAP */
+ case 0x2F: /* MDAP */
+ Ins_MDAP( EXEC_ARG_ args );
+ break;
+
+ case 0x30: /* IUP */
+ case 0x31: /* IUP */
+ Ins_IUP( EXEC_ARG_ args );
+ break;
+
+ case 0x32: /* SHP */
+ case 0x33: /* SHP */
+ Ins_SHP( EXEC_ARG_ args );
+ break;
+
+ case 0x34: /* SHC */
+ case 0x35: /* SHC */
+ Ins_SHC( EXEC_ARG_ args );
+ break;
+
+ case 0x36: /* SHZ */
+ case 0x37: /* SHZ */
+ Ins_SHZ( EXEC_ARG_ args );
+ break;
+
+ case 0x38: /* SHPIX */
+ Ins_SHPIX( EXEC_ARG_ args );
+ break;
+
+ case 0x39: /* IP */
+ Ins_IP( EXEC_ARG_ args );
+ break;
+
+ case 0x3A: /* MSIRP */
+ case 0x3B: /* MSIRP */
+ Ins_MSIRP( EXEC_ARG_ args );
+ break;
+
+ case 0x3C: /* AlignRP */
+ Ins_ALIGNRP( EXEC_ARG_ args );
+ break;
+
+ case 0x3D: /* RTDG */
+ DO_RTDG
+ break;
+
+ case 0x3E: /* MIAP */
+ case 0x3F: /* MIAP */
+ Ins_MIAP( EXEC_ARG_ args );
+ break;
+
+ case 0x40: /* NPUSHB */
+ Ins_NPUSHB( EXEC_ARG_ args );
+ break;
+
+ case 0x41: /* NPUSHW */
+ Ins_NPUSHW( EXEC_ARG_ args );
+ break;
+
+ case 0x42: /* WS */
+ DO_WS
+ break;
+
+ Set_Invalid_Ref:
+ CUR.error = FT_THROW( Invalid_Reference );
+ break;
+
+ case 0x43: /* RS */
+ DO_RS
+ break;
+
+ case 0x44: /* WCVTP */
+ DO_WCVTP
+ break;
+
+ case 0x45: /* RCVT */
+ DO_RCVT
+ break;
+
+ case 0x46: /* GC */
+ case 0x47: /* GC */
+ Ins_GC( EXEC_ARG_ args );
+ break;
+
+ case 0x48: /* SCFS */
+ Ins_SCFS( EXEC_ARG_ args );
+ break;
+
+ case 0x49: /* MD */
+ case 0x4A: /* MD */
+ Ins_MD( EXEC_ARG_ args );
+ break;
+
+ case 0x4B: /* MPPEM */
+ DO_MPPEM
+ break;
+
+ case 0x4C: /* MPS */
+ DO_MPS
+ break;
+
+ case 0x4D: /* FLIPON */
+ DO_FLIPON
+ break;
+
+ case 0x4E: /* FLIPOFF */
+ DO_FLIPOFF
+ break;
+
+ case 0x4F: /* DEBUG */
+ DO_DEBUG
+ break;
+
+ case 0x50: /* LT */
+ DO_LT
+ break;
+
+ case 0x51: /* LTEQ */
+ DO_LTEQ
+ break;
+
+ case 0x52: /* GT */
+ DO_GT
+ break;
+
+ case 0x53: /* GTEQ */
+ DO_GTEQ
+ break;
+
+ case 0x54: /* EQ */
+ DO_EQ
+ break;
+
+ case 0x55: /* NEQ */
+ DO_NEQ
+ break;
+
+ case 0x56: /* ODD */
+ DO_ODD
+ break;
+
+ case 0x57: /* EVEN */
+ DO_EVEN
+ break;
+
+ case 0x58: /* IF */
+ Ins_IF( EXEC_ARG_ args );
+ break;
+
+ case 0x59: /* EIF */
+ /* do nothing */
+ break;
+
+ case 0x5A: /* AND */
+ DO_AND
+ break;
+
+ case 0x5B: /* OR */
+ DO_OR
+ break;
+
+ case 0x5C: /* NOT */
+ DO_NOT
+ break;
+
+ case 0x5D: /* DELTAP1 */
+ Ins_DELTAP( EXEC_ARG_ args );
+ break;
+
+ case 0x5E: /* SDB */
+ DO_SDB
+ break;
+
+ case 0x5F: /* SDS */
+ DO_SDS
+ break;
+
+ case 0x60: /* ADD */
+ DO_ADD
+ break;
+
+ case 0x61: /* SUB */
+ DO_SUB
+ break;
+
+ case 0x62: /* DIV */
+ DO_DIV
+ break;
+
+ case 0x63: /* MUL */
+ DO_MUL
+ break;
+
+ case 0x64: /* ABS */
+ DO_ABS
+ break;
+
+ case 0x65: /* NEG */
+ DO_NEG
+ break;
+
+ case 0x66: /* FLOOR */
+ DO_FLOOR
+ break;
+
+ case 0x67: /* CEILING */
+ DO_CEILING
+ break;
+
+ case 0x68: /* ROUND */
+ case 0x69: /* ROUND */
+ case 0x6A: /* ROUND */
+ case 0x6B: /* ROUND */
+ DO_ROUND
+ break;
+
+ case 0x6C: /* NROUND */
+ case 0x6D: /* NROUND */
+ case 0x6E: /* NRRUND */
+ case 0x6F: /* NROUND */
+ DO_NROUND
+ break;
+
+ case 0x70: /* WCVTF */
+ DO_WCVTF
+ break;
+
+ case 0x71: /* DELTAP2 */
+ case 0x72: /* DELTAP3 */
+ Ins_DELTAP( EXEC_ARG_ args );
+ break;
+
+ case 0x73: /* DELTAC0 */
+ case 0x74: /* DELTAC1 */
+ case 0x75: /* DELTAC2 */
+ Ins_DELTAC( EXEC_ARG_ args );
+ break;
+
+ case 0x76: /* SROUND */
+ DO_SROUND
+ break;
+
+ case 0x77: /* S45Round */
+ DO_S45ROUND
+ break;
+
+ case 0x78: /* JROT */
+ DO_JROT
+ break;
+
+ case 0x79: /* JROF */
+ DO_JROF
+ break;
+
+ case 0x7A: /* ROFF */
+ DO_ROFF
+ break;
+
+ case 0x7B: /* ???? */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x7C: /* RUTG */
+ DO_RUTG
+ break;
+
+ case 0x7D: /* RDTG */
+ DO_RDTG
+ break;
+
+ case 0x7E: /* SANGW */
+ case 0x7F: /* AA */
+ /* nothing - obsolete */
+ break;
+
+ case 0x80: /* FLIPPT */
+ Ins_FLIPPT( EXEC_ARG_ args );
+ break;
+
+ case 0x81: /* FLIPRGON */
+ Ins_FLIPRGON( EXEC_ARG_ args );
+ break;
+
+ case 0x82: /* FLIPRGOFF */
+ Ins_FLIPRGOFF( EXEC_ARG_ args );
+ break;
+
+ case 0x83: /* UNKNOWN */
+ case 0x84: /* UNKNOWN */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x85: /* SCANCTRL */
+ Ins_SCANCTRL( EXEC_ARG_ args );
+ break;
+
+ case 0x86: /* SDPVTL */
+ case 0x87: /* SDPVTL */
+ Ins_SDPVTL( EXEC_ARG_ args );
+ break;
+
+ case 0x88: /* GETINFO */
+ Ins_GETINFO( EXEC_ARG_ args );
+ break;
+
+ case 0x89: /* IDEF */
+ Ins_IDEF( EXEC_ARG_ args );
+ break;
+
+ case 0x8A: /* ROLL */
+ Ins_ROLL( EXEC_ARG_ args );
+ break;
+
+ case 0x8B: /* MAX */
+ DO_MAX
+ break;
+
+ case 0x8C: /* MIN */
+ DO_MIN
+ break;
+
+ case 0x8D: /* SCANTYPE */
+ Ins_SCANTYPE( EXEC_ARG_ args );
+ break;
+
+ case 0x8E: /* INSTCTRL */
+ Ins_INSTCTRL( EXEC_ARG_ args );
+ break;
+
+ case 0x8F:
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ default:
+ if ( opcode >= 0xE0 )
+ Ins_MIRP( EXEC_ARG_ args );
+ else if ( opcode >= 0xC0 )
+ Ins_MDRP( EXEC_ARG_ args );
+ else if ( opcode >= 0xB8 )
+ Ins_PUSHW( EXEC_ARG_ args );
+ else if ( opcode >= 0xB0 )
+ Ins_PUSHB( EXEC_ARG_ args );
+ else
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ }
+
+ }
+
+#else
+
+ Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
+
+#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+ if ( CUR.error )
+ {
+ switch ( CUR.error )
+ {
+ /* looking for redefined instructions */
+ case FT_ERR( Invalid_Opcode ):
+ {
+ TT_DefRecord* def = CUR.IDefs;
+ TT_DefRecord* limit = def + CUR.numIDefs;
+
+
+ for ( ; def < limit; def++ )
+ {
+ if ( def->active && CUR.opcode == (FT_Byte)def->opc )
+ {
+ TT_CallRec* callrec;
+
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto LErrorLabel_;
+ }
+
+ callrec = &CUR.callStack[CUR.callTop];
+
+ callrec->Caller_Range = CUR.curRange;
+ callrec->Caller_IP = CUR.IP + 1;
+ callrec->Cur_Count = 1;
+ callrec->Cur_Restart = def->start;
+ callrec->Cur_End = def->end;
+
+ if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
+ goto LErrorLabel_;
+
+ goto LSuiteLabel_;
+ }
+ }
+ }
+
+ CUR.error = FT_THROW( Invalid_Opcode );
+ goto LErrorLabel_;
+
+#if 0
+ break; /* Unreachable code warning suppression. */
+ /* Leave to remind in case a later change the editor */
+ /* to consider break; */
+#endif
+
+ default:
+ goto LErrorLabel_;
+
+#if 0
+ break;
+#endif
+ }
+ }
+
+ CUR.top = CUR.new_top;
+
+ if ( CUR.step_ins )
+ CUR.IP += CUR.length;
+
+ /* increment instruction counter and check if we didn't */
+ /* run this program for too long (e.g. infinite loops). */
+ if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+ return FT_THROW( Execution_Too_Long );
+
+ LSuiteLabel_:
+ if ( CUR.IP >= CUR.codeSize )
+ {
+ if ( CUR.callTop > 0 )
+ {
+ CUR.error = FT_THROW( Code_Overflow );
+ goto LErrorLabel_;
+ }
+ else
+ goto LNo_Error_;
+ }
+ } while ( !CUR.instruction_trap );
+
+ LNo_Error_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ *exc = cur;
+#endif
+
+ return FT_Err_Ok;
+
+ LErrorCodeOverflow_:
+ CUR.error = FT_THROW( Code_Overflow );
+
+ LErrorLabel_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ *exc = cur;
+#endif
+
+ /* If any errors have occurred, function tables may be broken. */
+ /* Force a re-execution of `prep' and `fpgm' tables if no */
+ /* bytecode debugger is run. */
+ if ( CUR.error && !CUR.instruction_trap )
+ {
+ FT_TRACE1(( " The interpreter returned error 0x%x\n", CUR.error ));
+ exc->size->cvt_ready = FALSE;
+ }
+
+ return CUR.error;
+ }
+
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
new file mode 100644
index 0000000000..3acfade64a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
@@ -0,0 +1,397 @@
+/***************************************************************************/
+/* */
+/* ttinterp.h */
+/* */
+/* TrueType bytecode interpreter (specification). */
+/* */
+/* Copyright 1996-2007, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTINTERP_H__
+#define __TTINTERP_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define EXEC_OP_ TT_ExecContext exc,
+#define EXEC_OP TT_ExecContext exc
+#define EXEC_ARG_ exc,
+#define EXEC_ARG exc
+
+#else /* static implementation */
+
+#define EXEC_OP_ /* void */
+#define EXEC_OP /* void */
+#define EXEC_ARG_ /* void */
+#define EXEC_ARG /* void */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* Rounding mode constants. */
+ /* */
+#define TT_Round_Off 5
+#define TT_Round_To_Half_Grid 0
+#define TT_Round_To_Grid 1
+#define TT_Round_To_Double_Grid 2
+#define TT_Round_Up_To_Grid 4
+#define TT_Round_Down_To_Grid 3
+#define TT_Round_Super 6
+#define TT_Round_Super_45 7
+
+
+ /*************************************************************************/
+ /* */
+ /* Function types used by the interpreter, depending on various modes */
+ /* (e.g. the rounding mode, whether to render a vertical or horizontal */
+ /* line etc). */
+ /* */
+ /*************************************************************************/
+
+ /* Rounding function */
+ typedef FT_F26Dot6
+ (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation );
+
+ /* Point displacement along the freedom vector routine */
+ typedef void
+ (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance );
+
+ /* Distance projection along one of the projection vectors */
+ typedef FT_F26Dot6
+ (*TT_Project_Func)( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy );
+
+ /* reading a cvt value. Take care of non-square pixels if necessary */
+ typedef FT_F26Dot6
+ (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx );
+
+ /* setting or moving a cvt value. Take care of non-square pixels */
+ /* if necessary */
+ typedef void
+ (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value );
+
+
+ /*************************************************************************/
+ /* */
+ /* This structure defines a call record, used to manage function calls. */
+ /* */
+ typedef struct TT_CallRec_
+ {
+ FT_Int Caller_Range;
+ FT_Long Caller_IP;
+ FT_Long Cur_Count;
+ FT_Long Cur_Restart;
+ FT_Long Cur_End;
+
+ } TT_CallRec, *TT_CallStack;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* These structures define rules used to tweak subpixel hinting for */
+ /* various fonts. "", 0, "", NULL value indicates to match any value. */
+ /* */
+
+#define SPH_MAX_NAME_SIZE 32
+#define SPH_MAX_CLASS_MEMBERS 100
+
+ typedef struct SPH_TweakRule_
+ {
+ const char family[SPH_MAX_NAME_SIZE];
+ const FT_UInt ppem;
+ const char style[SPH_MAX_NAME_SIZE];
+ const FT_ULong glyph;
+
+ } SPH_TweakRule;
+
+
+ typedef struct SPH_ScaleRule_
+ {
+ const char family[SPH_MAX_NAME_SIZE];
+ const FT_UInt ppem;
+ const char style[SPH_MAX_NAME_SIZE];
+ const FT_ULong glyph;
+ const FT_ULong scale;
+
+ } SPH_ScaleRule;
+
+
+ typedef struct SPH_Font_Class_
+ {
+ const char name[SPH_MAX_NAME_SIZE];
+ const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];
+
+ } SPH_Font_Class;
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* The main structure for the interpreter which collects all necessary */
+ /* variables and states. */
+ /* */
+ typedef struct TT_ExecContextRec_
+ {
+ TT_Face face;
+ TT_Size size;
+ FT_Memory memory;
+
+ /* instructions state */
+
+ FT_Error error; /* last execution error */
+
+ FT_Long top; /* top of exec. stack */
+
+ FT_UInt stackSize; /* size of exec. stack */
+ FT_Long* stack; /* current exec. stack */
+
+ FT_Long args;
+ FT_UInt new_top; /* new top after exec. */
+
+ TT_GlyphZoneRec zp0, /* zone records */
+ zp1,
+ zp2,
+ pts,
+ twilight;
+
+ FT_Size_Metrics metrics;
+ TT_Size_Metrics tt_metrics; /* size metrics */
+
+ TT_GraphicsState GS; /* current graphics state */
+
+ FT_Int curRange; /* current code range number */
+ FT_Byte* code; /* current code range */
+ FT_Long IP; /* current instruction pointer */
+ FT_Long codeSize; /* size of current range */
+
+ FT_Byte opcode; /* current opcode */
+ FT_Int length; /* length of current opcode */
+
+ FT_Bool step_ins; /* true if the interpreter must */
+ /* increment IP after ins. exec */
+ FT_ULong cvtSize;
+ FT_Long* cvt;
+
+ FT_UInt glyphSize; /* glyph instructions buffer size */
+ FT_Byte* glyphIns; /* glyph instructions buffer */
+
+ FT_UInt numFDefs; /* number of function defs */
+ FT_UInt maxFDefs; /* maximum number of function defs */
+ TT_DefArray FDefs; /* table of FDefs entries */
+
+ FT_UInt numIDefs; /* number of instruction defs */
+ FT_UInt maxIDefs; /* maximum number of ins defs */
+ TT_DefArray IDefs; /* table of IDefs entries */
+
+ FT_UInt maxFunc; /* maximum function index */
+ FT_UInt maxIns; /* maximum instruction index */
+
+ FT_Int callTop, /* top of call stack during execution */
+ callSize; /* size of call stack */
+ TT_CallStack callStack; /* call stack */
+
+ FT_UShort maxPoints; /* capacity of this context's `pts' */
+ FT_Short maxContours; /* record, expressed in points and */
+ /* contours. */
+
+ TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */
+ /* useful for the debugger */
+
+ FT_UShort storeSize; /* size of current storage */
+ FT_Long* storage; /* storage area */
+
+ FT_F26Dot6 period; /* values used for the */
+ FT_F26Dot6 phase; /* `SuperRounding' */
+ FT_F26Dot6 threshold;
+
+#if 0
+ /* this seems to be unused */
+ FT_Int cur_ppem; /* ppem along the current proj vector */
+#endif
+
+ FT_Bool instruction_trap; /* If `True', the interpreter will */
+ /* exit after each instruction */
+
+ TT_GraphicsState default_GS; /* graphics state resulting from */
+ /* the prep program */
+ FT_Bool is_composite; /* true if the glyph is composite */
+ FT_Bool pedantic_hinting; /* true if pedantic interpretation */
+
+ /* latest interpreter additions */
+
+ FT_Long F_dot_P; /* dot product of freedom and projection */
+ /* vectors */
+ TT_Round_Func func_round; /* current rounding function */
+
+ TT_Project_Func func_project, /* current projection function */
+ func_dualproj, /* current dual proj. function */
+ func_freeProj; /* current freedom proj. func */
+
+ TT_Move_Func func_move; /* current point move function */
+ TT_Move_Func func_move_orig; /* move original position function */
+
+ TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */
+ TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */
+ TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */
+
+ FT_Bool grayscale; /* are we hinting for grayscale? */
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Round_Func func_round_sphn; /* subpixel rounding function */
+
+ FT_Bool grayscale_hinting; /* Using grayscale hinting? */
+ FT_Bool subpixel_hinting; /* Using subpixel hinting? */
+ FT_Bool native_hinting; /* Using native hinting? */
+ FT_Bool ignore_x_mode; /* Standard rendering mode for */
+ /* subpixel hinting. On if gray */
+ /* or subpixel hinting is on ) */
+
+ /* The following 4 aren't fully implemented but here for MS rasterizer */
+ /* compatibility. */
+ FT_Bool compatible_widths; /* compatible widths? */
+ FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */
+ FT_Bool bgr; /* bgr instead of rgb? */
+ FT_Bool subpixel_positioned; /* subpixel positioned */
+ /* (DirectWrite ClearType)? */
+
+ FT_Int rasterizer_version; /* MS rasterizer version */
+
+ FT_Bool iup_called; /* IUP called for glyph? */
+
+ FT_ULong sph_tweak_flags; /* flags to control */
+ /* hint tweaks */
+
+ FT_ULong sph_in_func_flags; /* flags to indicate if in */
+ /* special functions */
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ } TT_ExecContextRec;
+
+
+ extern const TT_GraphicsState tt_default_graphics_state;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_LOCAL( FT_Error )
+ TT_Goto_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ FT_Long IP );
+
+ FT_LOCAL( FT_Error )
+ TT_Set_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ void* base,
+ FT_Long length );
+
+ FT_LOCAL( FT_Error )
+ TT_Clear_CodeRange( TT_ExecContext exec,
+ FT_Int range );
+
+
+ FT_LOCAL( FT_Error )
+ Update_Max( FT_Memory memory,
+ FT_ULong* size,
+ FT_Long multiplier,
+ void* _pbuff,
+ FT_ULong new_max );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_New_Context */
+ /* */
+ /* <Description> */
+ /* Queries the face context for a given font. Note that there is */
+ /* now a _single_ execution context in the TrueType driver which is */
+ /* shared among faces. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A handle to the execution context. Initialized for `face'. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_EXPORT( TT_ExecContext )
+ TT_New_Context( TT_Driver driver );
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_LOCAL( FT_Error )
+ TT_Done_Context( TT_ExecContext exec );
+
+ FT_LOCAL( FT_Error )
+ TT_Load_Context( TT_ExecContext exec,
+ TT_Face face,
+ TT_Size size );
+
+ FT_LOCAL( FT_Error )
+ TT_Save_Context( TT_ExecContext exec,
+ TT_Size ins );
+
+ FT_LOCAL( FT_Error )
+ TT_Run_Context( TT_ExecContext exec,
+ FT_Bool debug );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_RunIns */
+ /* */
+ /* <Description> */
+ /* Executes one or more instruction in the execution context. This */
+ /* is the main function of the TrueType opcode interpreter. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the object manager and debugger should call this function. */
+ /* */
+ /* This function is publicly exported because it is directly */
+ /* invoked by the TrueType debugger. */
+ /* */
+ FT_EXPORT( FT_Error )
+ TT_RunIns( TT_ExecContext exec );
+
+
+FT_END_HEADER
+
+#endif /* __TTINTERP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
new file mode 100644
index 0000000000..4a6a7c1eee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
@@ -0,0 +1,1346 @@
+/***************************************************************************/
+/* */
+/* ttobjs.c */
+/* */
+/* Objects manager (body). */
+/* */
+/* Copyright 1996-2013 */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#include "tterrors.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#include "../../include/freetype/ttunpat.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttobjs
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /*************************************************************************/
+ /* */
+ /* GLYPH ZONE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyphzone_done */
+ /* */
+ /* <Description> */
+ /* Deallocate a glyph zone. */
+ /* */
+ /* <Input> */
+ /* zone :: A pointer to the target glyph zone. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_glyphzone_done( TT_GlyphZone zone )
+ {
+ FT_Memory memory = zone->memory;
+
+
+ if ( memory )
+ {
+ FT_FREE( zone->contours );
+ FT_FREE( zone->tags );
+ FT_FREE( zone->cur );
+ FT_FREE( zone->org );
+ FT_FREE( zone->orus );
+
+ zone->max_points = zone->n_points = 0;
+ zone->max_contours = zone->n_contours = 0;
+ zone->memory = NULL;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyphzone_new */
+ /* */
+ /* <Description> */
+ /* Allocate a new glyph zone. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the current memory object. */
+ /* */
+ /* maxPoints :: The capacity of glyph zone in points. */
+ /* */
+ /* maxContours :: The capacity of glyph zone in contours. */
+ /* */
+ /* <Output> */
+ /* zone :: A pointer to the target glyph zone record. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_glyphzone_new( FT_Memory memory,
+ FT_UShort maxPoints,
+ FT_Short maxContours,
+ TT_GlyphZone zone )
+ {
+ FT_Error error;
+
+
+ FT_MEM_ZERO( zone, sizeof ( *zone ) );
+ zone->memory = memory;
+
+ if ( FT_NEW_ARRAY( zone->org, maxPoints ) ||
+ FT_NEW_ARRAY( zone->cur, maxPoints ) ||
+ FT_NEW_ARRAY( zone->orus, maxPoints ) ||
+ FT_NEW_ARRAY( zone->tags, maxPoints ) ||
+ FT_NEW_ARRAY( zone->contours, maxContours ) )
+ {
+ tt_glyphzone_done( zone );
+ }
+ else
+ {
+ zone->max_points = maxPoints;
+ zone->max_contours = maxContours;
+ }
+
+ return error;
+ }
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /* Compare the face with a list of well-known `tricky' fonts. */
+ /* This list shall be expanded as we find more of them. */
+
+ static FT_Bool
+ tt_check_trickyness_family( FT_String* name )
+ {
+
+#define TRICK_NAMES_MAX_CHARACTERS 16
+#define TRICK_NAMES_COUNT 8
+
+ static const char trick_names[TRICK_NAMES_COUNT]
+ [TRICK_NAMES_MAX_CHARACTERS + 1] =
+ {
+ "DFKaiSho-SB", /* dfkaisb.ttf */
+ "DFKaiShu",
+ "DFKai-SB", /* kaiu.ttf */
+ "HuaTianKaiTi?", /* htkt2.ttf */
+ "HuaTianSongTi?", /* htst3.ttf */
+ "MingLiU", /* mingliu.ttf & mingliu.ttc */
+ "PMingLiU", /* mingliu.ttc */
+ "MingLi43", /* mingli.ttf */
+ };
+
+ int nn;
+
+
+ for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
+ if ( ft_strstr( name, trick_names[nn] ) )
+ return TRUE;
+
+ return FALSE;
+ }
+
+
+ /* XXX: This function should be in the `sfnt' module. */
+
+ /* Some PDF generators clear the checksums in the TrueType header table. */
+ /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */
+ /* Printer clears the entries for subsetted subtables. We thus have to */
+ /* recalculate the checksums where necessary. */
+
+ static FT_UInt32
+ tt_synth_sfnt_checksum( FT_Stream stream,
+ FT_ULong length )
+ {
+ FT_Error error;
+ FT_UInt32 checksum = 0;
+ int i;
+
+
+ if ( FT_FRAME_ENTER( length ) )
+ return 0;
+
+ for ( ; length > 3; length -= 4 )
+ checksum += (FT_UInt32)FT_GET_ULONG();
+
+ for ( i = 3; length > 0; length --, i-- )
+ checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );
+
+ FT_FRAME_EXIT();
+
+ return checksum;
+ }
+
+
+ /* XXX: This function should be in the `sfnt' module. */
+
+ static FT_ULong
+ tt_get_sfnt_checksum( TT_Face face,
+ FT_UShort i )
+ {
+#if 0 /* if we believe the written value, use following part. */
+ if ( face->dir_tables[i].CheckSum )
+ return face->dir_tables[i].CheckSum;
+#endif
+
+ if ( !face->goto_table )
+ return 0;
+
+ if ( face->goto_table( face,
+ face->dir_tables[i].Tag,
+ face->root.stream,
+ NULL ) )
+ return 0;
+
+ return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
+ face->dir_tables[i].Length );
+ }
+
+
+ typedef struct tt_sfnt_id_rec_
+ {
+ FT_ULong CheckSum;
+ FT_ULong Length;
+
+ } tt_sfnt_id_rec;
+
+
+ static FT_Bool
+ tt_check_trickyness_sfnt_ids( TT_Face face )
+ {
+#define TRICK_SFNT_IDS_PER_FACE 3
+#define TRICK_SFNT_IDS_NUM_FACES 17
+
+ static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
+ [TRICK_SFNT_IDS_PER_FACE] = {
+
+#define TRICK_SFNT_ID_cvt 0
+#define TRICK_SFNT_ID_fpgm 1
+#define TRICK_SFNT_ID_prep 2
+
+ { /* MingLiU 1995 */
+ { 0x05bcf058, 0x000002e4 }, /* cvt */
+ { 0x28233bf1, 0x000087c4 }, /* fpgm */
+ { 0xa344a1ea, 0x000001e1 } /* prep */
+ },
+ { /* MingLiU 1996- */
+ { 0x05bcf058, 0x000002e4 }, /* cvt */
+ { 0x28233bf1, 0x000087c4 }, /* fpgm */
+ { 0xa344a1eb, 0x000001e1 } /* prep */
+ },
+ { /* DFKaiShu */
+ { 0x11e5ead4, 0x00000350 }, /* cvt */
+ { 0x5a30ca3b, 0x00009063 }, /* fpgm */
+ { 0x13a42602, 0x0000007e } /* prep */
+ },
+ { /* HuaTianKaiTi */
+ { 0xfffbfffc, 0x00000008 }, /* cvt */
+ { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */
+ { 0x70020112, 0x00000008 } /* prep */
+ },
+ { /* HuaTianSongTi */
+ { 0xfffbfffc, 0x00000008 }, /* cvt */
+ { 0x0a5a0483, 0x00017c39 }, /* fpgm */
+ { 0x70020112, 0x00000008 } /* prep */
+ },
+ { /* NEC fadpop7.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40c92555, 0x000000e5 }, /* fpgm */
+ { 0xa39b58e3, 0x0000117c } /* prep */
+ },
+ { /* NEC fadrei5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x33c41652, 0x000000e5 }, /* fpgm */
+ { 0x26d6c52a, 0x00000f6a } /* prep */
+ },
+ { /* NEC fangot7.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x6db1651d, 0x0000019d }, /* fpgm */
+ { 0x6c6e4b03, 0x00002492 } /* prep */
+ },
+ { /* NEC fangyo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40c92555, 0x000000e5 }, /* fpgm */
+ { 0xde51fad0, 0x0000117c } /* prep */
+ },
+ { /* NEC fankyo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x85e47664, 0x000000e5 }, /* fpgm */
+ { 0xa6c62831, 0x00001caa } /* prep */
+ },
+ { /* NEC fanrgo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x2d891cfd, 0x0000019d }, /* fpgm */
+ { 0xa0604633, 0x00001de8 } /* prep */
+ },
+ { /* NEC fangot5.ttc */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40aa774c, 0x000001cb }, /* fpgm */
+ { 0x9b5caa96, 0x00001f9a } /* prep */
+ },
+ { /* NEC fanmin3.ttc */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x0d3de9cb, 0x00000141 }, /* fpgm */
+ { 0xd4127766, 0x00002280 } /* prep */
+ },
+ { /* NEC FA-Gothic, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x4a692698, 0x000001f0 }, /* fpgm */
+ { 0x340d4346, 0x00001fca } /* prep */
+ },
+ { /* NEC FA-Minchou, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0xcd34c604, 0x00000166 }, /* fpgm */
+ { 0x6cf31046, 0x000022b0 } /* prep */
+ },
+ { /* NEC FA-RoundGothicB, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x5da75315, 0x0000019d }, /* fpgm */
+ { 0x40745a5f, 0x000022e0 } /* prep */
+ },
+ { /* NEC FA-RoundGothicM, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0xf055fc48, 0x000001c2 }, /* fpgm */
+ { 0x3900ded3, 0x00001e18 } /* prep */
+ }
+ };
+
+ FT_ULong checksum;
+ int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
+ FT_Bool has_cvt, has_fpgm, has_prep;
+ FT_UShort i;
+ int j, k;
+
+
+ FT_MEM_SET( num_matched_ids, 0,
+ sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+ has_cvt = FALSE;
+ has_fpgm = FALSE;
+ has_prep = FALSE;
+
+ for ( i = 0; i < face->num_tables; i++ )
+ {
+ checksum = 0;
+
+ switch( face->dir_tables[i].Tag )
+ {
+ case TTAG_cvt:
+ k = TRICK_SFNT_ID_cvt;
+ has_cvt = TRUE;
+ break;
+
+ case TTAG_fpgm:
+ k = TRICK_SFNT_ID_fpgm;
+ has_fpgm = TRUE;
+ break;
+
+ case TTAG_prep:
+ k = TRICK_SFNT_ID_prep;
+ has_prep = TRUE;
+ break;
+
+ default:
+ continue;
+ }
+
+ for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+ if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
+ {
+ if ( !checksum )
+ checksum = tt_get_sfnt_checksum( face, i );
+
+ if ( sfnt_id[j][k].CheckSum == checksum )
+ num_matched_ids[j]++;
+
+ if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+ return TRUE;
+ }
+ }
+
+ for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+ {
+ if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
+ num_matched_ids[j] ++;
+ if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
+ num_matched_ids[j] ++;
+ if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
+ num_matched_ids[j] ++;
+ if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_Bool
+ tt_check_trickyness( FT_Face face )
+ {
+ if ( !face )
+ return FALSE;
+
+ /* For first, check the face name for quick check. */
+ if ( face->family_name &&
+ tt_check_trickyness_family( face->family_name ) )
+ return TRUE;
+
+ /* Type42 fonts may lack `name' tables, we thus try to identify */
+ /* tricky fonts by checking the checksums of Type42-persistent */
+ /* sfnt tables (`cvt', `fpgm', and `prep'). */
+ if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
+ return TRUE;
+
+ return FALSE;
+ }
+
+
+ /* Check whether `.notdef' is the only glyph in the `loca' table. */
+ static FT_Bool
+ tt_check_single_notdef( FT_Face ttface )
+ {
+ FT_Bool result = FALSE;
+
+ TT_Face face = (TT_Face)ttface;
+ FT_UInt asize;
+ FT_ULong i;
+ FT_ULong glyph_index = 0;
+ FT_UInt count = 0;
+
+
+ for( i = 0; i < face->num_locations; i++ )
+ {
+ tt_face_get_location( face, i, &asize );
+ if ( asize > 0 )
+ {
+ count += 1;
+ if ( count > 1 )
+ break;
+ glyph_index = i;
+ }
+ }
+
+ /* Only have a single outline. */
+ if ( count == 1 )
+ {
+ if ( glyph_index == 0 )
+ result = TRUE;
+ else
+ {
+ /* FIXME: Need to test glyphname == .notdef ? */
+ FT_Error error;
+ char buf[8];
+
+
+ error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
+ if ( !error &&
+ buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
+ result = TRUE;
+ }
+ }
+
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_init */
+ /* */
+ /* <Description> */
+ /* Initialize a given TrueType face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The source font stream. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The newly built face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_init( FT_Stream stream,
+ FT_Face ttface, /* TT_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+ FT_Library library;
+ SFNT_Service sfnt;
+ TT_Face face = (TT_Face)ttface;
+
+
+ FT_TRACE2(( "TTF driver\n" ));
+
+ library = ttface->driver->root.library;
+
+ sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ /* create input stream from resource */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ /* check that we have a valid TrueType file */
+ error = sfnt->init_face( stream, face, face_index, num_params, params );
+ if ( error )
+ goto Exit;
+
+ /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
+ /* The 0x00020000 tag is completely undocumented; some fonts from */
+ /* Arphic made for Chinese Windows 3.1 have this. */
+ if ( face->format_tag != 0x00010000L && /* MS fonts */
+ face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */
+ face->format_tag != TTAG_true ) /* Mac fonts */
+ {
+ FT_TRACE2(( " not a TTF font\n" ));
+ goto Bad_Format;
+ }
+ else
+ {
+ FT_ULong table_len;
+ if (face->goto_table( face, TTAG_CFF, stream, &table_len) != TT_Err_Table_Missing &&
+ face->goto_table( face, TTAG_loca, stream, &table_len) == TT_Err_Table_Missing)
+ {
+ FT_TRACE2(( "[not a valid TTF font]\n" ));
+ goto Bad_Format;
+ }
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ ttface->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+ /* If we are performing a simple font format check, exit immediately. */
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+
+ /* Load font directory */
+ error = sfnt->load_face( stream, face, face_index, num_params, params );
+ if ( error )
+ goto Exit;
+
+ if ( tt_check_trickyness( ttface ) )
+ ttface->face_flags |= FT_FACE_FLAG_TRICKY;
+
+ error = tt_face_load_hdmx( face, stream );
+ if ( error )
+ goto Exit;
+
+ if ( FT_IS_SCALABLE( ttface ) )
+ {
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( !ttface->internal->incremental_interface )
+ error = tt_face_load_loca( face, stream );
+ if ( !error )
+ error = tt_face_load_cvt( face, stream );
+ if ( !error )
+ error = tt_face_load_fpgm( face, stream );
+ if ( !error )
+ error = tt_face_load_prep( face, stream );
+
+ /* Check the scalable flag based on `loca'. */
+ if ( !ttface->internal->incremental_interface &&
+ ttface->num_fixed_sizes &&
+ face->glyph_locations &&
+ tt_check_single_notdef( ttface ) )
+ {
+ FT_TRACE5(( "tt_face_init:"
+ " Only the `.notdef' glyph has an outline.\n"
+ " "
+ " Resetting scalable flag to FALSE.\n" ));
+
+ ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+ }
+
+#else
+
+ if ( !error )
+ error = tt_face_load_loca( face, stream );
+ if ( !error )
+ error = tt_face_load_cvt( face, stream );
+ if ( !error )
+ error = tt_face_load_fpgm( face, stream );
+ if ( !error )
+ error = tt_face_load_prep( face, stream );
+
+ /* Check the scalable flag based on `loca'. */
+ if ( ttface->num_fixed_sizes &&
+ face->glyph_locations &&
+ tt_check_single_notdef( ttface ) )
+ {
+ FT_TRACE5(( "tt_face_init:"
+ " Only the `.notdef' glyph has an outline.\n"
+ " "
+ " Resetting scalable flag to FALSE.\n" ));
+
+ ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+ }
+
+#endif
+
+ }
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+ !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+
+ {
+ FT_Bool unpatented_hinting;
+ int i;
+
+
+ /* Determine whether unpatented hinting is to be used for this face. */
+ unpatented_hinting = FT_BOOL
+ ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );
+
+ for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
+ if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
+ unpatented_hinting = TRUE;
+
+ if ( !unpatented_hinting )
+ ttface->internal->ignore_unpatented_hinter = TRUE;
+ }
+
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&
+ !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+
+ /* initialize standard glyph loading routines */
+ TT_Init_Glyph_Loading( face );
+
+ Exit:
+ return error;
+
+ Bad_Format:
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_done */
+ /* */
+ /* <Description> */
+ /* Finalize a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_face_done( FT_Face ttface ) /* TT_Face */
+ {
+ TT_Face face = (TT_Face)ttface;
+ FT_Memory memory;
+ FT_Stream stream;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = ttface->memory;
+ stream = ttface->stream;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ /* for `extended TrueType formats' (i.e. compressed versions) */
+ if ( face->extra.finalizer )
+ face->extra.finalizer( face->extra.data );
+
+ if ( sfnt )
+ sfnt->done_face( face );
+
+ /* freeing the locations table */
+ tt_face_done_loca( face );
+
+ tt_face_free_hdmx( face );
+
+ /* freeing the CVT */
+ FT_FREE( face->cvt );
+ face->cvt_size = 0;
+
+ /* freeing the programs */
+ FT_FRAME_RELEASE( face->font_program );
+ FT_FRAME_RELEASE( face->cvt_program );
+ face->font_program_size = 0;
+ face->cvt_program_size = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ tt_done_blend( memory, face->blend );
+ face->blend = NULL;
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_run_fpgm */
+ /* */
+ /* <Description> */
+ /* Run the font program. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* pedantic :: Set if bytecode execution should be pedantic. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_run_fpgm( TT_Size size,
+ FT_Bool pedantic )
+ {
+ TT_Face face = (TT_Face)size->root.face;
+ TT_ExecContext exec;
+ FT_Error error;
+
+
+ /* debugging instances have their own context */
+ if ( size->debug )
+ exec = size->context;
+ else
+ exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+ TT_Load_Context( exec, face, size );
+
+ exec->callTop = 0;
+ exec->top = 0;
+
+ exec->period = 64;
+ exec->phase = 0;
+ exec->threshold = 0;
+
+ exec->instruction_trap = FALSE;
+ exec->F_dot_P = 0x4000L;
+
+ exec->pedantic_hinting = pedantic;
+
+ {
+ FT_Size_Metrics* metrics = &exec->metrics;
+ TT_Size_Metrics* tt_metrics = &exec->tt_metrics;
+
+
+ metrics->x_ppem = 0;
+ metrics->y_ppem = 0;
+ metrics->x_scale = 0;
+ metrics->y_scale = 0;
+
+ tt_metrics->ppem = 0;
+ tt_metrics->scale = 0;
+ tt_metrics->ratio = 0x10000L;
+ }
+
+ /* allow font program execution */
+ TT_Set_CodeRange( exec,
+ tt_coderange_font,
+ face->font_program,
+ face->font_program_size );
+
+ /* disable CVT and glyph programs coderange */
+ TT_Clear_CodeRange( exec, tt_coderange_cvt );
+ TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+ if ( face->font_program_size > 0 )
+ {
+ error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+
+ if ( !error )
+ {
+ FT_TRACE4(( "Executing `fpgm' table.\n" ));
+
+ error = face->interpreter( exec );
+ }
+ }
+ else
+ error = FT_Err_Ok;
+
+ if ( !error )
+ TT_Save_Context( exec, size );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_run_prep */
+ /* */
+ /* <Description> */
+ /* Run the control value program. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* pedantic :: Set if bytecode execution should be pedantic. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_run_prep( TT_Size size,
+ FT_Bool pedantic )
+ {
+ TT_Face face = (TT_Face)size->root.face;
+ TT_ExecContext exec;
+ FT_Error error;
+
+
+ /* debugging instances have their own context */
+ if ( size->debug )
+ exec = size->context;
+ else
+ exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+ TT_Load_Context( exec, face, size );
+
+ exec->callTop = 0;
+ exec->top = 0;
+
+ exec->instruction_trap = FALSE;
+
+ exec->pedantic_hinting = pedantic;
+
+ TT_Set_CodeRange( exec,
+ tt_coderange_cvt,
+ face->cvt_program,
+ face->cvt_program_size );
+
+ TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+ if ( face->cvt_program_size > 0 )
+ {
+ error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+
+ if ( !error && !size->debug )
+ {
+ FT_TRACE4(( "Executing `prep' table.\n" ));
+
+ error = face->interpreter( exec );
+ }
+ }
+ else
+ error = FT_Err_Ok;
+
+ /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */
+ /* graphics state variables to be modified by the CVT program. */
+
+ exec->GS.dualVector.x = 0x4000;
+ exec->GS.dualVector.y = 0;
+ exec->GS.projVector.x = 0x4000;
+ exec->GS.projVector.y = 0x0;
+ exec->GS.freeVector.x = 0x4000;
+ exec->GS.freeVector.y = 0x0;
+
+ exec->GS.rp0 = 0;
+ exec->GS.rp1 = 0;
+ exec->GS.rp2 = 0;
+
+ exec->GS.gep0 = 1;
+ exec->GS.gep1 = 1;
+ exec->GS.gep2 = 1;
+
+ exec->GS.loop = 1;
+
+ /* save as default graphics state */
+ size->GS = exec->GS;
+
+ TT_Save_Context( exec, size );
+
+ return error;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ static void
+ tt_size_done_bytecode( FT_Size ftsize )
+ {
+ TT_Size size = (TT_Size)ftsize;
+ TT_Face face = (TT_Face)ftsize->face;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( size->debug )
+ {
+ /* the debug context must be deleted by the debugger itself */
+ size->context = NULL;
+ size->debug = FALSE;
+ }
+
+ FT_FREE( size->cvt );
+ size->cvt_size = 0;
+
+ /* free storage area */
+ FT_FREE( size->storage );
+ size->storage_size = 0;
+
+ /* twilight zone */
+ tt_glyphzone_done( &size->twilight );
+
+ FT_FREE( size->function_defs );
+ FT_FREE( size->instruction_defs );
+
+ size->num_function_defs = 0;
+ size->max_function_defs = 0;
+ size->num_instruction_defs = 0;
+ size->max_instruction_defs = 0;
+
+ size->max_func = 0;
+ size->max_ins = 0;
+
+ size->bytecode_ready = 0;
+ size->cvt_ready = 0;
+ }
+
+
+ /* Initialize bytecode-related fields in the size object. */
+ /* We do this only if bytecode interpretation is really needed. */
+ static FT_Error
+ tt_size_init_bytecode( FT_Size ftsize,
+ FT_Bool pedantic )
+ {
+ FT_Error error;
+ TT_Size size = (TT_Size)ftsize;
+ TT_Face face = (TT_Face)ftsize->face;
+ FT_Memory memory = face->root.memory;
+ FT_Int i;
+
+ FT_UShort n_twilight;
+ TT_MaxProfile* maxp = &face->max_profile;
+
+
+ size->bytecode_ready = 1;
+ size->cvt_ready = 0;
+
+ size->max_function_defs = maxp->maxFunctionDefs;
+ size->max_instruction_defs = maxp->maxInstructionDefs;
+
+ size->num_function_defs = 0;
+ size->num_instruction_defs = 0;
+
+ size->max_func = 0;
+ size->max_ins = 0;
+
+ size->cvt_size = face->cvt_size;
+ size->storage_size = maxp->maxStorage;
+
+ /* Set default metrics */
+ {
+ TT_Size_Metrics* metrics = &size->ttmetrics;
+
+
+ metrics->rotated = FALSE;
+ metrics->stretched = FALSE;
+
+ /* set default compensation (all 0) */
+ for ( i = 0; i < 4; i++ )
+ metrics->compensations[i] = 0;
+ }
+
+ /* allocate function defs, instruction defs, cvt, and storage area */
+ if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) ||
+ FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
+ FT_NEW_ARRAY( size->cvt, size->cvt_size ) ||
+ FT_NEW_ARRAY( size->storage, size->storage_size ) )
+ goto Exit;
+
+ /* reserve twilight zone */
+ n_twilight = maxp->maxTwilightPoints;
+
+ /* there are 4 phantom points (do we need this?) */
+ n_twilight += 4;
+
+ error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
+ if ( error )
+ goto Exit;
+
+ size->twilight.n_points = n_twilight;
+
+ size->GS = tt_default_graphics_state;
+
+ /* set `face->interpreter' according to the debug hook present */
+ {
+ FT_Library library = face->root.driver->root.library;
+
+
+ face->interpreter = (TT_Interpreter)
+ library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+ if ( !face->interpreter )
+ face->interpreter = (TT_Interpreter)TT_RunIns;
+ }
+
+ /* Fine, now run the font program! */
+ error = tt_size_run_fpgm( size, pedantic );
+ /* It seems fpgm proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #12690 - Restaurantkarte_Oktober09+Wild.pdf*/
+ if ( error )
+ tt_size_done_bytecode( ftsize );
+ return TT_Err_Ok;
+
+ Exit:
+ if ( error )
+ tt_size_done_bytecode( ftsize );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_ready_bytecode( TT_Size size,
+ FT_Bool pedantic )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !size->bytecode_ready )
+ {
+ error = tt_size_init_bytecode( (FT_Size)size, pedantic );
+ if ( error )
+ goto Exit;
+ }
+
+ /* rescale CVT when needed */
+ if ( !size->cvt_ready )
+ {
+ FT_UInt i;
+ TT_Face face = (TT_Face)size->root.face;
+
+
+ /* Scale the cvt values to the new ppem. */
+ /* We use by default the y ppem to scale the CVT. */
+ for ( i = 0; i < size->cvt_size; i++ )
+ size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+
+ /* all twilight points are originally zero */
+ for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
+ {
+ size->twilight.org[i].x = 0;
+ size->twilight.org[i].y = 0;
+ size->twilight.cur[i].x = 0;
+ size->twilight.cur[i].y = 0;
+ }
+
+ /* clear storage area */
+ for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
+ size->storage[i] = 0;
+
+ size->GS = tt_default_graphics_state;
+
+ tt_size_run_prep( size, pedantic );/* It seems prep proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #5025 - naredba-rd-16-296.pdf */
+ /* However we can't disable the prep. TESTDOC: Bug #0063 - 050826_differ_table.pdf, page #4 */
+ if ( !error )
+ size->cvt_ready = 1;
+ }
+
+ Exit:
+ return error;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_init */
+ /* */
+ /* <Description> */
+ /* Initialize a new TrueType size object. */
+ /* */
+ /* <InOut> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_init( FT_Size ttsize ) /* TT_Size */
+ {
+ TT_Size size = (TT_Size)ttsize;
+ FT_Error error = FT_Err_Ok;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ size->bytecode_ready = 0;
+ size->cvt_ready = 0;
+#endif
+
+ size->ttmetrics.valid = FALSE;
+ size->strike_index = 0xFFFFFFFFUL;
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_done */
+ /* */
+ /* <Description> */
+ /* The TrueType size object finalizer. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the target size object. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_size_done( FT_Size ttsize ) /* TT_Size */
+ {
+ TT_Size size = (TT_Size)ttsize;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ if ( size->bytecode_ready )
+ tt_size_done_bytecode( ttsize );
+#endif
+
+ size->ttmetrics.valid = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_reset */
+ /* */
+ /* <Description> */
+ /* Reset a TrueType size when resolutions and character dimensions */
+ /* have been changed. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the target size object. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_reset( TT_Size size )
+ {
+ TT_Face face;
+ FT_Error error = FT_Err_Ok;
+ FT_Size_Metrics* metrics;
+
+
+ size->ttmetrics.valid = FALSE;
+
+ face = (TT_Face)size->root.face;
+
+ metrics = &size->metrics;
+
+ /* copy the result from base layer */
+ *metrics = size->root.metrics;
+
+ if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
+ return FT_THROW( Invalid_PPem );
+
+ /* This bit flag, if set, indicates that the ppems must be */
+ /* rounded to integers. Nearly all TrueType fonts have this bit */
+ /* set, as hinting won't work really well otherwise. */
+ /* */
+ if ( face->header.Flags & 8 )
+ {
+ metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,
+ face->root.units_per_EM );
+ metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,
+ face->root.units_per_EM );
+
+ metrics->ascender =
+ FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
+ metrics->descender =
+ FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
+ metrics->height =
+ FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
+ metrics->max_advance =
+ FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
+ metrics->x_scale ) );
+ }
+
+ /* compute new transformation */
+ if ( metrics->x_ppem >= metrics->y_ppem )
+ {
+ size->ttmetrics.scale = metrics->x_scale;
+ size->ttmetrics.ppem = metrics->x_ppem;
+ size->ttmetrics.x_ratio = 0x10000L;
+ size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,
+ metrics->x_ppem );
+ }
+ else
+ {
+ size->ttmetrics.scale = metrics->y_scale;
+ size->ttmetrics.ppem = metrics->y_ppem;
+ size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,
+ metrics->y_ppem );
+ size->ttmetrics.y_ratio = 0x10000L;
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ size->cvt_ready = 0;
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ if ( !error )
+ size->ttmetrics.valid = TRUE;
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_driver_init */
+ /* */
+ /* <Description> */
+ /* Initialize a given TrueType driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_driver_init( FT_Module ttdriver ) /* TT_Driver */
+ {
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ TT_Driver driver = (TT_Driver)ttdriver;
+
+
+ if ( !TT_New_Context( driver ) )
+ return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ driver->interpreter_version = TT_INTERPRETER_VERSION_38;
+#else
+ driver->interpreter_version = TT_INTERPRETER_VERSION_35;
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( ttdriver );
+
+#endif /* !TT_USE_BYTECODE_INTERPRETER */
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_driver_done */
+ /* */
+ /* <Description> */
+ /* Finalize a given TrueType driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target TrueType driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_driver_done( FT_Module ttdriver ) /* TT_Driver */
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ TT_Driver driver = (TT_Driver)ttdriver;
+
+
+ /* destroy the execution context */
+ if ( driver->context )
+ {
+ TT_Done_Context( driver->context );
+ driver->context = NULL;
+ }
+#else
+ FT_UNUSED( ttdriver );
+#endif
+
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_slot_init */
+ /* */
+ /* <Description> */
+ /* Initialize a new slot object. */
+ /* */
+ /* <InOut> */
+ /* slot :: A handle to the slot object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_slot_init( FT_GlyphSlot slot )
+ {
+ return FT_GlyphLoader_CreateExtra( slot->internal->loader );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
new file mode 100644
index 0000000000..21dfb7ac45
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/* */
+/* ttobjs.h */
+/* */
+/* Objects manager (specification). */
+/* */
+/* Copyright 1996-2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTOBJS_H__
+#define __TTOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType driver object. */
+ /* */
+ typedef struct TT_DriverRec_* TT_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Instance */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType size object. */
+ /* */
+ typedef struct TT_SizeRec_* TT_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType glyph slot object. */
+ /* */
+ /* <Note> */
+ /* This is a direct typedef of FT_GlyphSlot, as there is nothing */
+ /* specific about the TrueType glyph slot. */
+ /* */
+ typedef FT_GlyphSlot TT_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GraphicsState */
+ /* */
+ /* <Description> */
+ /* The TrueType graphics state used during bytecode interpretation. */
+ /* */
+ typedef struct TT_GraphicsState_
+ {
+ FT_UShort rp0;
+ FT_UShort rp1;
+ FT_UShort rp2;
+
+ FT_UnitVector dualVector;
+ FT_UnitVector projVector;
+ FT_UnitVector freeVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_Bool both_x_axis;
+#endif
+
+ FT_Long loop;
+ FT_F26Dot6 minimum_distance;
+ FT_Int round_state;
+
+ FT_Bool auto_flip;
+ FT_F26Dot6 control_value_cutin;
+ FT_F26Dot6 single_width_cutin;
+ FT_F26Dot6 single_width_value;
+ FT_Short delta_base;
+ FT_Short delta_shift;
+
+ FT_Byte instruct_control;
+ /* According to Greg Hitchcock from Microsoft, the `scan_control' */
+ /* variable as documented in the TrueType specification is a 32-bit */
+ /* integer; the high-word part holds the SCANTYPE value, the low-word */
+ /* part the SCANCTRL value. We separate it into two fields. */
+ FT_Bool scan_control;
+ FT_Int scan_type;
+
+ FT_UShort gep0;
+ FT_UShort gep1;
+ FT_UShort gep2;
+
+ } TT_GraphicsState;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_LOCAL( void )
+ tt_glyphzone_done( TT_GlyphZone zone );
+
+ FT_LOCAL( FT_Error )
+ tt_glyphzone_new( FT_Memory memory,
+ FT_UShort maxPoints,
+ FT_Short maxContours,
+ TT_GlyphZone zone );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+
+ /*************************************************************************/
+ /* */
+ /* EXECUTION SUBTABLES */
+ /* */
+ /* These sub-tables relate to instruction execution. */
+ /* */
+ /*************************************************************************/
+
+
+#define TT_MAX_CODE_RANGES 3
+
+
+ /*************************************************************************/
+ /* */
+ /* There can only be 3 active code ranges at once: */
+ /* - the Font Program */
+ /* - the CVT Program */
+ /* - a glyph's instructions set */
+ /* */
+ typedef enum TT_CodeRange_Tag_
+ {
+ tt_coderange_none = 0,
+ tt_coderange_font,
+ tt_coderange_cvt,
+ tt_coderange_glyph
+
+ } TT_CodeRange_Tag;
+
+
+ typedef struct TT_CodeRange_
+ {
+ FT_Byte* base;
+ FT_ULong size;
+
+ } TT_CodeRange;
+
+ typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+ /*************************************************************************/
+ /* */
+ /* Defines a function/instruction definition record. */
+ /* */
+ typedef struct TT_DefRecord_
+ {
+ FT_Int range; /* in which code range is it located? */
+ FT_Long start; /* where does it start? */
+ FT_Long end; /* where does it end? */
+ FT_UInt opc; /* function #, or instruction code */
+ FT_Bool active; /* is it active? */
+ FT_Bool inline_delta; /* is function that defines inline delta? */
+ FT_ULong sph_fdef_flags; /* flags to identify special functions */
+
+ } TT_DefRecord, *TT_DefArray;
+
+
+ /*************************************************************************/
+ /* */
+ /* Subglyph transformation record. */
+ /* */
+ typedef struct TT_Transform_
+ {
+ FT_Fixed xx, xy; /* transformation matrix coefficients */
+ FT_Fixed yx, yy;
+ FT_F26Dot6 ox, oy; /* offsets */
+
+ } TT_Transform;
+
+
+ /*************************************************************************/
+ /* */
+ /* A note regarding non-squared pixels: */
+ /* */
+ /* (This text will probably go into some docs at some time; for now, it */
+ /* is kept here to explain some definitions in the TT_Size_Metrics */
+ /* record). */
+ /* */
+ /* The CVT is a one-dimensional array containing values that control */
+ /* certain important characteristics in a font, like the height of all */
+ /* capitals, all lowercase letter, default spacing or stem width/height. */
+ /* */
+ /* These values are found in FUnits in the font file, and must be scaled */
+ /* to pixel coordinates before being used by the CVT and glyph programs. */
+ /* Unfortunately, when using distinct x and y resolutions (or distinct x */
+ /* and y pointsizes), there are two possible scalings. */
+ /* */
+ /* A first try was to implement a `lazy' scheme where all values were */
+ /* scaled when first used. However, while some values are always used */
+ /* in the same direction, some others are used under many different */
+ /* circumstances and orientations. */
+ /* */
+ /* I have found a simpler way to do the same, and it even seems to work */
+ /* in most of the cases: */
+ /* */
+ /* - All CVT values are scaled to the maximum ppem size. */
+ /* */
+ /* - When performing a read or write in the CVT, a ratio factor is used */
+ /* to perform adequate scaling. Example: */
+ /* */
+ /* x_ppem = 14 */
+ /* y_ppem = 10 */
+ /* */
+ /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */
+ /* entries are scaled to it. */
+ /* */
+ /* x_ratio = 1.0 */
+ /* y_ratio = y_ppem/ppem (< 1.0) */
+ /* */
+ /* We compute the current ratio like: */
+ /* */
+ /* - If projVector is horizontal, */
+ /* ratio = x_ratio = 1.0 */
+ /* */
+ /* - if projVector is vertical, */
+ /* ratio = y_ratio */
+ /* */
+ /* - else, */
+ /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
+ /* */
+ /* Reading a cvt value returns */
+ /* ratio * cvt[index] */
+ /* */
+ /* Writing a cvt value in pixels: */
+ /* cvt[index] / ratio */
+ /* */
+ /* The current ppem is simply */
+ /* ratio * ppem */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Metrics used by the TrueType size and context objects. */
+ /* */
+ typedef struct TT_Size_Metrics_
+ {
+ /* for non-square pixels */
+ FT_Long x_ratio;
+ FT_Long y_ratio;
+
+ FT_UShort ppem; /* maximum ppem size */
+ FT_Long ratio; /* current ratio */
+ FT_Fixed scale;
+
+ FT_F26Dot6 compensations[4]; /* device-specific compensations */
+
+ FT_Bool valid;
+
+ FT_Bool rotated; /* `is the glyph rotated?'-flag */
+ FT_Bool stretched; /* `is the glyph stretched?'-flag */
+
+ } TT_Size_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType size class. */
+ /* */
+ typedef struct TT_SizeRec_
+ {
+ FT_SizeRec root;
+
+ /* we have our own copy of metrics so that we can modify */
+ /* it without affecting auto-hinting (when used) */
+ FT_Size_Metrics metrics;
+
+ TT_Size_Metrics ttmetrics;
+
+ FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_UInt num_function_defs; /* number of function definitions */
+ FT_UInt max_function_defs;
+ TT_DefArray function_defs; /* table of function definitions */
+
+ FT_UInt num_instruction_defs; /* number of ins. definitions */
+ FT_UInt max_instruction_defs;
+ TT_DefArray instruction_defs; /* table of ins. definitions */
+
+ FT_UInt max_func;
+ FT_UInt max_ins;
+
+ TT_CodeRangeTable codeRangeTable;
+
+ TT_GraphicsState GS;
+
+ FT_ULong cvt_size; /* the scaled control value table */
+ FT_Long* cvt;
+
+ FT_UShort storage_size; /* The storage area is now part of */
+ FT_Long* storage; /* the instance */
+
+ TT_GlyphZoneRec twilight; /* The instance's twilight zone */
+
+ /* debugging variables */
+
+ /* When using the debugger, we must keep the */
+ /* execution context tied to the instance */
+ /* object rather than asking it on demand. */
+
+ FT_Bool debug;
+ TT_ExecContext context;
+
+ FT_Bool bytecode_ready;
+ FT_Bool cvt_ready;
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ } TT_SizeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType driver class. */
+ /* */
+ typedef struct TT_DriverRec_
+ {
+ FT_DriverRec root;
+
+ TT_ExecContext context; /* execution context */
+ TT_GlyphZoneRec zone; /* glyph loader points zone */
+
+ FT_UInt interpreter_version;
+
+ } TT_DriverRec;
+
+
+ /* Note: All of the functions below (except tt_size_reset()) are used */
+ /* as function pointers in a FT_Driver_ClassRec. Therefore their */
+ /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */
+ /* TT_Size, etc., so that the compiler can confirm that the types and */
+ /* number of parameters are correct. In all cases the FT_xxx types are */
+ /* cast to their TT_xxx counterparts inside the functions since FreeType */
+ /* will always use the TT driver to create them. */
+
+
+ /*************************************************************************/
+ /* */
+ /* Face functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_face_init( FT_Stream stream,
+ FT_Face ttface, /* TT_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ tt_face_done( FT_Face ttface ); /* TT_Face */
+
+
+ /*************************************************************************/
+ /* */
+ /* Size functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_size_init( FT_Size ttsize ); /* TT_Size */
+
+ FT_LOCAL( void )
+ tt_size_done( FT_Size ttsize ); /* TT_Size */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_LOCAL( FT_Error )
+ tt_size_run_fpgm( TT_Size size,
+ FT_Bool pedantic );
+
+ FT_LOCAL( FT_Error )
+ tt_size_run_prep( TT_Size size,
+ FT_Bool pedantic );
+
+ FT_LOCAL( FT_Error )
+ tt_size_ready_bytecode( TT_Size size,
+ FT_Bool pedantic );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ FT_LOCAL( FT_Error )
+ tt_size_reset( TT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* Driver functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_driver_init( FT_Module ttdriver ); /* TT_Driver */
+
+ FT_LOCAL( void )
+ tt_driver_done( FT_Module ttdriver ); /* TT_Driver */
+
+
+ /*************************************************************************/
+ /* */
+ /* Slot functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_slot_init( FT_GlyphSlot slot );
+
+
+ /* auxiliary */
+#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
new file mode 100644
index 0000000000..ea38fd8e8c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
@@ -0,0 +1,101 @@
+/***************************************************************************/
+/* */
+/* ttpic.c */
+/* */
+/* The FreeType position independent code services for truetype module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ttpic.h"
+#include "tterrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ttdriver.c */
+ FT_Error
+ FT_Create_Class_tt_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_tt_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_tt_service_gx_multi_masters(
+ FT_Service_MultiMastersRec* sv_mm );
+ void
+ FT_Init_Class_tt_service_truetype_glyf(
+ FT_Service_TTGlyfRec* sv_ttglyf );
+
+
+ void
+ tt_driver_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->truetype )
+ {
+ TTModulePIC* container = (TTModulePIC*)pic_container->truetype;
+
+
+ if ( container->tt_services )
+ FT_Destroy_Class_tt_services( library, container->tt_services );
+ container->tt_services = NULL;
+ FT_FREE( container );
+ pic_container->truetype = NULL;
+ }
+ }
+
+
+ FT_Error
+ tt_driver_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ TTModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->truetype = container;
+
+ /* initialize pointer table - this is how the module usually */
+ /* expects this data */
+ error = FT_Create_Class_tt_services( library,
+ &container->tt_services );
+ if ( error )
+ goto Exit;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Init_Class_tt_service_gx_multi_masters(
+ &container->tt_service_gx_multi_masters );
+#endif
+ FT_Init_Class_tt_service_truetype_glyf(
+ &container->tt_service_truetype_glyf );
+
+ Exit:
+ if ( error )
+ tt_driver_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
new file mode 100644
index 0000000000..36cb357a9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* ttpic.h */
+/* */
+/* The FreeType position independent code services for truetype module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPIC_H__
+#define __TTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define TT_SERVICES_GET tt_services
+#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters
+#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf
+#define TT_SERVICE_PROPERTIES_GET tt_service_properties
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+ typedef struct TTModulePIC_
+ {
+ FT_ServiceDescRec* tt_services;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Service_MultiMastersRec tt_service_gx_multi_masters;
+#endif
+ FT_Service_TTGlyfRec tt_service_truetype_glyf;
+ FT_Service_PropertiesRec tt_service_properties;
+
+ } TTModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (TTModulePIC*)((lib)->pic_container.truetype) )
+#define TT_SERVICES_GET \
+ ( GET_PIC( library )->tt_services )
+#define TT_SERVICE_GX_MULTI_MASTERS_GET \
+ ( GET_PIC( library )->tt_service_gx_multi_masters )
+#define TT_SERVICE_TRUETYPE_GLYF_GET \
+ ( GET_PIC( library )->tt_service_truetype_glyf )
+#define TT_SERVICE_PROPERTIES_GET \
+ ( GET_PIC( library )->tt_service_properties )
+
+
+ /* see ttpic.c for the implementation */
+ void
+ tt_driver_class_pic_free( FT_Library library );
+
+ FT_Error
+ tt_driver_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
new file mode 100644
index 0000000000..283d07d82f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
@@ -0,0 +1,601 @@
+/***************************************************************************/
+/* */
+/* ttpload.c */
+/* */
+/* TrueType-specific tables loader (body). */
+/* */
+/* Copyright 1996-2002, 2004-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttpload
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_loca */
+ /* */
+ /* <Description> */
+ /* Load the locations table. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_loca( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_ULong table_len;
+ FT_Int shift;
+
+
+ /* we need the size of the `glyf' table for malformed `loca' tables */
+ error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
+
+ /* it is possible that a font doesn't have a glyf table at all */
+ /* or its size is zero */
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ face->glyf_len = 0;
+ else if ( error )
+ goto Exit;
+
+ FT_TRACE2(( "Locations " ));
+ error = face->goto_table( face, TTAG_loca, stream, &table_len );
+ if ( error )
+ {
+ error = FT_THROW( Locations_Missing );
+ goto Exit;
+ }
+
+ if ( face->header.Index_To_Loc_Format != 0 )
+ {
+ shift = 2;
+
+ if ( table_len >= 0x40000L )
+ {
+ FT_TRACE2(( "table too large\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+ face->num_locations = table_len >> shift;
+ }
+ else
+ {
+ shift = 1;
+
+ if ( table_len >= 0x20000L )
+ {
+ FT_TRACE2(( "table too large\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+ face->num_locations = table_len >> shift;
+ }
+ /* Sunliang.Liu 20101013, We ignore the 242 new added code which cause some font load failed.
+ TESTDOC: Bug #4502 - PM2-beheerdershandleiding.pdf*/
+ /*if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
+ {
+ FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n",
+ face->num_locations - 1, face->root.num_glyphs ));
+
+ // we only handle the case where `maxp' gives a larger value
+ if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )
+ {
+ FT_Long new_loca_len =
+ ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;
+
+ TT_Table entry = face->dir_tables;
+ TT_Table limit = entry + face->num_tables;
+
+ FT_Long pos = FT_Stream_Pos( stream );
+ FT_Long dist = 0x7FFFFFFFL;
+
+
+ // compute the distance to next table in font file
+ for ( ; entry < limit; entry++ )
+ {
+ FT_Long diff = entry->Offset - pos;
+
+
+ if ( diff > 0 && diff < dist )
+ dist = diff;
+ }
+
+ if ( entry == limit )
+ {
+ // `loca' is the last table
+ dist = stream->size - pos;
+ }
+
+ if ( new_loca_len <= dist )
+ {
+ face->num_locations = face->root.num_glyphs + 1;
+ table_len = new_loca_len;
+
+ FT_TRACE2(( "adjusting num_locations to %d\n",
+ face->num_locations ));
+ }
+ }
+ }*/
+
+ /*
+ * Extract the frame. We don't need to decompress it since
+ * we are able to parse it directly.
+ */
+ if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded\n" ));
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_ULong )
+ tt_face_get_location( TT_Face face,
+ FT_UInt gindex,
+ FT_UInt *asize )
+ {
+ FT_ULong pos1, pos2;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+
+
+ pos1 = pos2 = 0;
+
+
+ if (gindex < face->num_locations)/* gindex < face->num_locations */ /* XYQ 2008-11-03 Some ill TT has wrong glyf table size. It seems Adobe ignore the limit. TESTDOC: Bug #6248 - F-2008-18.pdf */
+ {
+ if ( face->header.Index_To_Loc_Format != 0 )
+ {
+ p = face->glyph_locations + gindex * 4;
+ p_limit = face->glyph_locations + face->num_locations * 4;
+
+ pos1 = FT_NEXT_ULONG( p );
+ pos2 = pos1;
+
+ if (1)/* p + 4 <= p_limit ) */
+ pos2 = FT_NEXT_ULONG( p );
+ }
+ else
+ {
+ p = face->glyph_locations + gindex * 2;
+ p_limit = face->glyph_locations + face->num_locations * 2;
+
+ pos1 = FT_NEXT_USHORT( p );
+ pos2 = pos1;
+
+ if (1) /* p + 2 <= p_limit ) */
+ pos2 = FT_NEXT_USHORT( p );
+
+ pos1 <<= 1;
+ pos2 <<= 1;
+ }
+ }
+
+ /* Check broken location data */
+ if ( pos1 > face->glyf_len )
+ {
+ FT_TRACE1(( "tt_face_get_location:"
+ " too large offset=0x%08lx found for gid=0x%04lx,"
+ " exceeding the end of glyf table (0x%08lx)\n",
+ pos1, gindex, face->glyf_len ));
+ *asize = 0;
+ return 0;
+ }
+
+ if ( pos2 > face->glyf_len )
+ {
+ FT_TRACE1(( "tt_face_get_location:"
+ " too large offset=0x%08lx found for gid=0x%04lx,"
+ " truncate at the end of glyf table (0x%08lx)\n",
+ pos2, gindex + 1, face->glyf_len ));
+ pos2 = face->glyf_len;
+ }
+
+ /* The `loca' table must be ordered; it refers to the length of */
+ /* an entry as the difference between the current and the next */
+ /* position. However, there do exist (malformed) fonts which */
+ /* don't obey this rule, so we are only able to provide an */
+ /* upper bound for the size. */
+ /* */
+ /* We get (intentionally) a wrong, non-zero result in case the */
+ /* `glyf' table is missing. */
+ if ( pos2 >= pos1 )
+ *asize = (FT_UInt)( pos2 - pos1 );
+ else
+ *asize = (FT_UInt)( face->glyf_len - pos1 );
+
+ return pos1;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_done_loca( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->glyph_locations );
+ face->num_locations = 0;
+ }
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_cvt */
+ /* */
+ /* <Description> */
+ /* Load the control value table into a face object. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_cvt( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "CVT " ));
+
+ error = face->goto_table( face, TTAG_cvt, stream, &table_len );
+ if ( error )
+ {
+ FT_TRACE2(( "is missing\n" ));
+
+ face->cvt_size = 0;
+ face->cvt = NULL;
+ error = FT_Err_Ok;
+
+ goto Exit;
+ }
+
+ face->cvt_size = table_len / 2;
+
+ if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
+ goto Exit;
+
+ if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
+ goto Exit;
+
+ {
+ FT_Short* cur = face->cvt;
+ FT_Short* limit = cur + face->cvt_size;
+
+
+ for ( ; cur < limit; cur++ )
+ *cur = FT_GET_SHORT();
+ }
+
+ FT_FRAME_EXIT();
+ FT_TRACE2(( "loaded\n" ));
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ if ( face->doblend )
+ error = tt_face_vary_cvt( face, stream );
+#endif
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_fpgm */
+ /* */
+ /* <Description> */
+ /* Load the font program. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_fpgm( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "Font program " ));
+
+ /* The font program is optional */
+ error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
+ if ( error )
+ {
+ face->font_program = NULL;
+ face->font_program_size = 0;
+ error = FT_Err_Ok;
+
+ FT_TRACE2(( "is missing\n" ));
+ }
+ else
+ {
+ face->font_program_size = table_len;
+ if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
+ }
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_prep */
+ /* */
+ /* <Description> */
+ /* Load the cvt program. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_prep( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "Prep program " ));
+
+ error = face->goto_table( face, TTAG_prep, stream, &table_len );
+ if ( error )
+ {
+ face->cvt_program = NULL;
+ face->cvt_program_size = 0;
+ error = FT_Err_Ok;
+
+ FT_TRACE2(( "is missing\n" ));
+ }
+ else
+ {
+ face->cvt_program_size = table_len;
+ if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
+ }
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hdmx */
+ /* */
+ /* <Description> */
+ /* Load the `hdmx' table into the face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hdmx( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_UInt version, nn, num_records;
+ FT_ULong table_size, record_size;
+ FT_Byte* p;
+ FT_Byte* limit;
+
+
+ /* this table is optional */
+ error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
+ if ( error || table_size < 8 )
+ return FT_Err_Ok;
+
+ if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
+ goto Exit;
+
+ p = face->hdmx_table;
+ limit = p + table_size;
+
+ version = FT_NEXT_USHORT( p );
+ num_records = FT_NEXT_USHORT( p );
+ record_size = FT_NEXT_ULONG( p );
+
+ /* The maximum number of bytes in an hdmx device record is the */
+ /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */
+ /* the reason why `record_size' is a long (which we read as */
+ /* unsigned long for convenience). In practice, two bytes */
+ /* sufficient to hold the size value. */
+ /* */
+ /* There are at least two fonts, HANNOM-A and HANNOM-B version */
+ /* 2.0 (2005), which get this wrong: The upper two bytes of */
+ /* the size value are set to 0xFF instead of 0x00. We catch */
+ /* and fix this. */
+
+ if ( record_size >= 0xFFFF0000UL )
+ record_size &= 0xFFFFU;
+
+ /* The limit for `num_records' is a heuristic value. */
+
+ if ( version != 0 || num_records > 255 || record_size > 0x10001L )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )
+ goto Fail;
+
+ for ( nn = 0; nn < num_records; nn++ )
+ {
+ if ( p + record_size > limit )
+ break;
+
+ face->hdmx_record_sizes[nn] = p[0];
+ p += record_size;
+ }
+
+ face->hdmx_record_count = nn;
+ face->hdmx_table_size = table_size;
+ face->hdmx_record_size = record_size;
+
+ Exit:
+ return error;
+
+ Fail:
+ FT_FRAME_RELEASE( face->hdmx_table );
+ face->hdmx_table_size = 0;
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_hdmx( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = stream->memory;
+
+
+ FT_FREE( face->hdmx_record_sizes );
+ FT_FRAME_RELEASE( face->hdmx_table );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the advance width table for a given pixel size if it is found */
+ /* in the font's `hdmx' table (if any). */
+ /* */
+ FT_LOCAL_DEF( FT_Byte* )
+ tt_face_get_device_metrics( TT_Face face,
+ FT_UInt ppem,
+ FT_UInt gindex )
+ {
+ FT_UInt nn;
+ FT_Byte* result = NULL;
+ FT_ULong record_size = face->hdmx_record_size;
+ FT_Byte* record = face->hdmx_table + 8;
+
+
+ for ( nn = 0; nn < face->hdmx_record_count; nn++ )
+ if ( face->hdmx_record_sizes[nn] == ppem )
+ {
+ gindex += 2;
+ if ( gindex < record_size )
+ result = record + nn * record_size + gindex;
+ break;
+ }
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
new file mode 100644
index 0000000000..4535880265
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
@@ -0,0 +1,75 @@
+/***************************************************************************/
+/* */
+/* ttpload.h */
+/* */
+/* TrueType-specific tables loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPLOAD_H__
+#define __TTPLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_loca( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( FT_ULong )
+ tt_face_get_location( TT_Face face,
+ FT_UInt gindex,
+ FT_UInt *asize );
+
+ FT_LOCAL( void )
+ tt_face_done_loca( TT_Face face );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_cvt( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_fpgm( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_prep( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hdmx( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( void )
+ tt_face_free_hdmx( TT_Face face );
+
+
+ FT_LOCAL( FT_Byte* )
+ tt_face_get_device_metrics( TT_Face face,
+ FT_UInt ppem,
+ FT_UInt gindex );
+
+FT_END_HEADER
+
+#endif /* __TTPLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
new file mode 100644
index 0000000000..1bff6f968a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
@@ -0,0 +1,1011 @@
+/***************************************************************************/
+/* */
+/* ttsubpix.c */
+/* */
+/* TrueType Subpixel Hinting. */
+/* */
+/* Copyright 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttsubpix.h"
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* These rules affect how the TT Interpreter does hinting, with the */
+ /* goal of doing subpixel hinting by (in general) ignoring x moves. */
+ /* Some of these rules are fixes that go above and beyond the */
+ /* stated techniques in the MS whitepaper on Cleartype, due to */
+ /* artifacts in many glyphs. So, these rules make some glyphs render */
+ /* better than they do in the MS rasterizer. */
+ /* */
+ /* "" string or 0 int/char indicates to apply to all glyphs. */
+ /* "-" used as dummy placeholders, but any non-matching string works. */
+ /* */
+ /* Some of this could arguably be implemented in fontconfig, however: */
+ /* */
+ /* - Fontconfig can't set things on a glyph-by-glyph basis. */
+ /* - The tweaks that happen here are very low-level, from an average */
+ /* user's point of view and are best implemented in the hinter. */
+ /* */
+ /* The goal is to make the subpixel hinting techniques as generalized */
+ /* as possible across all fonts to prevent the need for extra rules such */
+ /* as these. */
+ /* */
+ /* The rule structure is designed so that entirely new rules can easily */
+ /* be added when a new compatibility feature is discovered. */
+ /* */
+ /* The rule structures could also use some enhancement to handle ranges. */
+ /* */
+ /* ****************** WORK IN PROGRESS ******************* */
+ /* */
+
+ /* These are `classes' of fonts that can be grouped together and used in */
+ /* rules below. A blank entry "" is required at the end of these! */
+#define FAMILY_CLASS_RULES_SIZE 7
+
+ static const SPH_Font_Class FAMILY_CLASS_Rules
+ [FAMILY_CLASS_RULES_SIZE] =
+ {
+ { "MS Legacy Fonts",
+ { "Aharoni",
+ "Andale Mono",
+ "Andalus",
+ "Angsana New",
+ "AngsanaUPC",
+ "Arabic Transparent",
+ "Arial Black",
+ "Arial Narrow",
+ "Arial Unicode MS",
+ "Arial",
+ "Batang",
+ "Browallia New",
+ "BrowalliaUPC",
+ "Comic Sans MS",
+ "Cordia New",
+ "CordiaUPC",
+ "Courier New",
+ "DFKai-SB",
+ "David Transparent",
+ "David",
+ "DilleniaUPC",
+ "Estrangelo Edessa",
+ "EucrosiaUPC",
+ "FangSong_GB2312",
+ "Fixed Miriam Transparent",
+ "FrankRuehl",
+ "Franklin Gothic Medium",
+ "FreesiaUPC",
+ "Garamond",
+ "Gautami",
+ "Georgia",
+ "Gulim",
+ "Impact",
+ "IrisUPC",
+ "JasmineUPC",
+ "KaiTi_GB2312",
+ "KodchiangUPC",
+ "Latha",
+ "Levenim MT",
+ "LilyUPC",
+ "Lucida Console",
+ "Lucida Sans Unicode",
+ "MS Gothic",
+ "MS Mincho",
+ "MV Boli",
+ "Mangal",
+ "Marlett",
+ "Microsoft Sans Serif",
+ "Mingliu",
+ "Miriam Fixed",
+ "Miriam Transparent",
+ "Miriam",
+ "Narkisim",
+ "Palatino Linotype",
+ "Raavi",
+ "Rod Transparent",
+ "Rod",
+ "Shruti",
+ "SimHei",
+ "Simplified Arabic Fixed",
+ "Simplified Arabic",
+ "Simsun",
+ "Sylfaen",
+ "Symbol",
+ "Tahoma",
+ "Times New Roman",
+ "Traditional Arabic",
+ "Trebuchet MS",
+ "Tunga",
+ "Verdana",
+ "Webdings",
+ "Wingdings",
+ "",
+ },
+ },
+ { "Core MS Legacy Fonts",
+ { "Arial Black",
+ "Arial Narrow",
+ "Arial Unicode MS",
+ "Arial",
+ "Comic Sans MS",
+ "Courier New",
+ "Garamond",
+ "Georgia",
+ "Impact",
+ "Lucida Console",
+ "Lucida Sans Unicode",
+ "Microsoft Sans Serif",
+ "Palatino Linotype",
+ "Tahoma",
+ "Times New Roman",
+ "Trebuchet MS",
+ "Verdana",
+ "",
+ },
+ },
+ { "Apple Legacy Fonts",
+ { "Geneva",
+ "Times",
+ "Monaco",
+ "Century",
+ "Chalkboard",
+ "Lobster",
+ "Century Gothic",
+ "Optima",
+ "Lucida Grande",
+ "Gill Sans",
+ "Baskerville",
+ "Helvetica",
+ "Helvetica Neue",
+ "",
+ },
+ },
+ { "Legacy Sans Fonts",
+ { "Andale Mono",
+ "Arial Unicode MS",
+ "Arial",
+ "Century Gothic",
+ "Comic Sans MS",
+ "Franklin Gothic Medium",
+ "Geneva",
+ "Lucida Console",
+ "Lucida Grande",
+ "Lucida Sans Unicode",
+ "Lucida Sans Typewriter",
+ "Microsoft Sans Serif",
+ "Monaco",
+ "Tahoma",
+ "Trebuchet MS",
+ "Verdana",
+ "",
+ },
+ },
+
+ { "Misc Legacy Fonts",
+ { "Dark Courier", "", }, },
+ { "Verdana Clones",
+ { "DejaVu Sans",
+ "Bitstream Vera Sans", "", }, },
+ { "Verdana and Clones",
+ { "DejaVu Sans",
+ "Bitstream Vera Sans",
+ "Verdana", "", }, },
+ };
+
+
+ /* Define this to force natural (i.e. not bitmap-compatible) widths. */
+ /* The default leans strongly towards natural widths except for a few */
+ /* legacy fonts where a selective combination produces nicer results. */
+/* #define FORCE_NATURAL_WIDTHS */
+
+
+ /* Define `classes' of styles that can be grouped together and used in */
+ /* rules below. A blank entry "" is required at the end of these! */
+#define STYLE_CLASS_RULES_SIZE 5
+
+ const SPH_Font_Class STYLE_CLASS_Rules
+ [STYLE_CLASS_RULES_SIZE] =
+ {
+ { "Regular Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Roman",
+ "Normal",
+ "",
+ },
+ },
+ { "Regular/Italic Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Italic",
+ "Oblique",
+ "Roman",
+ "Normal",
+ "",
+ },
+ },
+ { "Bold/BoldItalic Class",
+ { "Bold",
+ "Bold Italic",
+ "Black",
+ "",
+ },
+ },
+ { "Bold/Italic/BoldItalic Class",
+ { "Bold",
+ "Bold Italic",
+ "Black",
+ "Italic",
+ "Oblique",
+ "",
+ },
+ },
+ { "Regular/Bold Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Normal",
+ "Roman",
+ "Bold",
+ "Black",
+ "",
+ },
+ },
+ };
+
+
+ /* Force special legacy fixes for fonts. */
+#define COMPATIBILITY_MODE_RULES_SIZE 1
+
+ const SPH_TweakRule COMPATIBILITY_MODE_Rules
+ [COMPATIBILITY_MODE_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */
+#define PIXEL_HINTING_RULES_SIZE 2
+
+ const SPH_TweakRule PIXEL_HINTING_Rules
+ [PIXEL_HINTING_RULES_SIZE] =
+ {
+ /* these characters are almost always safe */
+ { "Courier New", 12, "Italic", 'z' },
+ { "Courier New", 11, "Italic", 'z' },
+ };
+
+
+ /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */
+#define DO_SHPIX_RULES_SIZE 1
+
+ const SPH_TweakRule DO_SHPIX_Rules
+ [DO_SHPIX_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Skip Y moves that start with a point that is not on a Y pixel */
+ /* boundary and don't move that point to a Y pixel boundary. */
+#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules
+ [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ /* fix vwxyz thinness*/
+ { "Consolas", 0, "", 0 },
+ /* Fix thin middle stems */
+ { "Core MS Legacy Fonts", 0, "Regular", 0 },
+ /* Cyrillic small letter I */
+ { "Legacy Sans Fonts", 0, "", 0 },
+ /* Fix artifacts with some Regular & Bold */
+ { "Verdana Clones", 0, "", 0 },
+ };
+
+
+#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
+ [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ /* Fixes < and > */
+ { "Courier New", 0, "Regular", 0 },
+ };
+
+
+ /* Skip Y moves that start with a point that is not on a Y pixel */
+ /* boundary and don't move that point to a Y pixel boundary. */
+#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
+ [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
+ {
+ /* Maintain thickness of diagonal in 'N' */
+ { "Times New Roman", 0, "Regular/Bold Class", 'N' },
+ { "Georgia", 0, "Regular/Bold Class", 'N' },
+ };
+
+
+ /* Skip Y moves that move a point off a Y pixel boundary. */
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1
+
+ const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules
+ [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
+ [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Round moves that don't move a point to a Y pixel boundary. */
+#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2
+
+ const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules
+ [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ /* Droid font instructions don't snap Y to pixels */
+ { "Droid Sans", 0, "Regular/Italic Class", 0 },
+ { "Droid Sans Mono", 0, "", 0 },
+ };
+
+
+#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
+ [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Allow a Direct_Move along X freedom vector if matched. */
+#define ALLOW_X_DMOVE_RULES_SIZE 1
+
+ const SPH_TweakRule ALLOW_X_DMOVE_Rules
+ [ALLOW_X_DMOVE_RULES_SIZE] =
+ {
+ /* Fixes vanishing diagonal in 4 */
+ { "Verdana", 0, "Regular", '4' },
+ };
+
+
+ /* Return MS rasterizer version 35 if matched. */
+#define RASTERIZER_35_RULES_SIZE 8
+
+ const SPH_TweakRule RASTERIZER_35_Rules
+ [RASTERIZER_35_RULES_SIZE] =
+ {
+ /* This seems to be the only way to make these look good */
+ { "Times New Roman", 0, "Regular", 'i' },
+ { "Times New Roman", 0, "Regular", 'j' },
+ { "Times New Roman", 0, "Regular", 'm' },
+ { "Times New Roman", 0, "Regular", 'r' },
+ { "Times New Roman", 0, "Regular", 'a' },
+ { "Times New Roman", 0, "Regular", 'n' },
+ { "Times New Roman", 0, "Regular", 'p' },
+ { "Times", 0, "", 0 },
+ };
+
+
+ /* Don't round to the subpixel grid. Round to pixel grid. */
+#define NORMAL_ROUND_RULES_SIZE 1
+
+ const SPH_TweakRule NORMAL_ROUND_Rules
+ [NORMAL_ROUND_RULES_SIZE] =
+ {
+ /* Fix serif thickness for certain ppems */
+ /* Can probably be generalized somehow */
+ { "Courier New", 0, "", 0 },
+ };
+
+
+ /* Skip IUP instructions if matched. */
+#define SKIP_IUP_RULES_SIZE 1
+
+ const SPH_TweakRule SKIP_IUP_Rules
+ [SKIP_IUP_RULES_SIZE] =
+ {
+ { "Arial", 13, "Regular", 'a' },
+ };
+
+
+ /* Skip MIAP Twilight hack if matched. */
+#define MIAP_HACK_RULES_SIZE 1
+
+ const SPH_TweakRule MIAP_HACK_Rules
+ [MIAP_HACK_RULES_SIZE] =
+ {
+ { "Geneva", 12, "", 0 },
+ };
+
+
+ /* Skip DELTAP instructions if matched. */
+#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23
+
+ const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules
+ [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
+ {
+ { "Georgia", 0, "Regular", 'k' },
+ /* fix various problems with e in different versions */
+ { "Trebuchet MS", 14, "Regular", 'e' },
+ { "Trebuchet MS", 13, "Regular", 'e' },
+ { "Trebuchet MS", 15, "Regular", 'e' },
+ { "Trebuchet MS", 0, "Italic", 'v' },
+ { "Trebuchet MS", 0, "Italic", 'w' },
+ { "Trebuchet MS", 0, "Regular", 'Y' },
+ { "Arial", 11, "Regular", 's' },
+ /* prevent problems with '3' and others */
+ { "Verdana", 10, "Regular", 0 },
+ { "Verdana", 9, "Regular", 0 },
+ /* Cyrillic small letter short I */
+ { "Legacy Sans Fonts", 0, "", 0x438 },
+ { "Legacy Sans Fonts", 0, "", 0x439 },
+ { "Arial", 10, "Regular", '6' },
+ { "Arial", 0, "Bold/BoldItalic Class", 'a' },
+ /* Make horizontal stems consistent with the rest */
+ { "Arial", 24, "Bold", 'a' },
+ { "Arial", 25, "Bold", 'a' },
+ { "Arial", 24, "Bold", 's' },
+ { "Arial", 25, "Bold", 's' },
+ { "Arial", 34, "Bold", 's' },
+ { "Arial", 35, "Bold", 's' },
+ { "Arial", 36, "Bold", 's' },
+ { "Arial", 25, "Regular", 's' },
+ { "Arial", 26, "Regular", 's' },
+ };
+
+
+ /* Always do DELTAP instructions if matched. */
+#define ALWAYS_DO_DELTAP_RULES_SIZE 1
+
+ const SPH_TweakRule ALWAYS_DO_DELTAP_Rules
+ [ALWAYS_DO_DELTAP_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow ALIGNRP after IUP. */
+#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules
+ [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
+ {
+ /* Prevent creation of dents in outline */
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow DELTAP after IUP. */
+#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules
+ [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow CALL after IUP. */
+#define NO_CALL_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules
+ [NO_CALL_AFTER_IUP_RULES_SIZE] =
+ {
+ /* Prevent creation of dents in outline */
+ { "-", 0, "", 0 },
+ };
+
+
+ /* De-embolden these glyphs slightly. */
+#define DEEMBOLDEN_RULES_SIZE 9
+
+ static const SPH_TweakRule DEEMBOLDEN_Rules
+ [DEEMBOLDEN_RULES_SIZE] =
+ {
+ { "Courier New", 0, "Bold", 'A' },
+ { "Courier New", 0, "Bold", 'W' },
+ { "Courier New", 0, "Bold", 'w' },
+ { "Courier New", 0, "Bold", 'M' },
+ { "Courier New", 0, "Bold", 'X' },
+ { "Courier New", 0, "Bold", 'K' },
+ { "Courier New", 0, "Bold", 'x' },
+ { "Courier New", 0, "Bold", 'z' },
+ { "Courier New", 0, "Bold", 'v' },
+ };
+
+
+ /* Embolden these glyphs slightly. */
+#define EMBOLDEN_RULES_SIZE 2
+
+ static const SPH_TweakRule EMBOLDEN_Rules
+ [EMBOLDEN_RULES_SIZE] =
+ {
+ { "Courier New", 0, "Regular", 0 },
+ { "Courier New", 0, "Italic", 0 },
+ };
+
+
+ /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */
+ /* similar to Windows XP. */
+#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12
+
+ static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules
+ [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
+ {
+ { "Times New Roman", 16, "Italic", '2' },
+ { "Times New Roman", 16, "Italic", '5' },
+ { "Times New Roman", 16, "Italic", '7' },
+ { "Times New Roman", 16, "Regular", '2' },
+ { "Times New Roman", 16, "Regular", '5' },
+ { "Times New Roman", 16, "Regular", '7' },
+ { "Times New Roman", 17, "Italic", '2' },
+ { "Times New Roman", 17, "Italic", '5' },
+ { "Times New Roman", 17, "Italic", '7' },
+ { "Times New Roman", 17, "Regular", '2' },
+ { "Times New Roman", 17, "Regular", '5' },
+ { "Times New Roman", 17, "Regular", '7' },
+ };
+
+
+ /* This fudges distance on 2 to get rid of the vanishing stem issue. */
+ /* A real solution to this is certainly welcome. */
+#define COURIER_NEW_2_HACK_RULES_SIZE 15
+
+ static const SPH_TweakRule COURIER_NEW_2_HACK_Rules
+ [COURIER_NEW_2_HACK_RULES_SIZE] =
+ {
+ { "Courier New", 10, "Regular", '2' },
+ { "Courier New", 11, "Regular", '2' },
+ { "Courier New", 12, "Regular", '2' },
+ { "Courier New", 13, "Regular", '2' },
+ { "Courier New", 14, "Regular", '2' },
+ { "Courier New", 15, "Regular", '2' },
+ { "Courier New", 16, "Regular", '2' },
+ { "Courier New", 17, "Regular", '2' },
+ { "Courier New", 18, "Regular", '2' },
+ { "Courier New", 19, "Regular", '2' },
+ { "Courier New", 20, "Regular", '2' },
+ { "Courier New", 21, "Regular", '2' },
+ { "Courier New", 22, "Regular", '2' },
+ { "Courier New", 23, "Regular", '2' },
+ { "Courier New", 24, "Regular", '2' },
+ };
+
+
+#ifndef FORCE_NATURAL_WIDTHS
+
+ /* Use compatible widths with these glyphs. Compatible widths is always */
+ /* on when doing B/W TrueType instructing, but is used selectively here, */
+ /* typically on glyphs with 3 or more vertical stems. */
+#define COMPATIBLE_WIDTHS_RULES_SIZE 38
+
+ static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
+ [COMPATIBLE_WIDTHS_RULES_SIZE] =
+ {
+ { "Arial Unicode MS", 12, "Regular Class", 'm' },
+ { "Arial Unicode MS", 14, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 10, "Regular Class", 0x448 },
+ { "Arial", 11, "Regular Class", 'm' },
+ { "Arial", 12, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 12, "Regular Class", 0x448 },
+ { "Arial", 13, "Regular Class", 0x448 },
+ { "Arial", 14, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 14, "Regular Class", 0x448 },
+ { "Arial", 15, "Regular Class", 0x448 },
+ { "Arial", 17, "Regular Class", 'm' },
+ { "DejaVu Sans", 15, "Regular Class", 0 },
+ { "Microsoft Sans Serif", 11, "Regular Class", 0 },
+ { "Microsoft Sans Serif", 12, "Regular Class", 0 },
+ { "Segoe UI", 11, "Regular Class", 0 },
+ { "Monaco", 0, "Regular Class", 0 },
+ { "Segoe UI", 12, "Regular Class", 'm' },
+ { "Segoe UI", 14, "Regular Class", 'm' },
+ { "Tahoma", 11, "Regular Class", 0 },
+ { "Times New Roman", 16, "Regular Class", 'c' },
+ { "Times New Roman", 16, "Regular Class", 'm' },
+ { "Times New Roman", 16, "Regular Class", 'o' },
+ { "Times New Roman", 16, "Regular Class", 'w' },
+ { "Trebuchet MS", 11, "Regular Class", 0 },
+ { "Trebuchet MS", 12, "Regular Class", 0 },
+ { "Trebuchet MS", 14, "Regular Class", 0 },
+ { "Trebuchet MS", 15, "Regular Class", 0 },
+ { "Ubuntu", 12, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Verdana", 10, "Regular Class", 0x448 },
+ { "Verdana", 11, "Regular Class", 0x448 },
+ { "Verdana and Clones", 12, "Regular Class", 'i' },
+ { "Verdana and Clones", 12, "Regular Class", 'j' },
+ { "Verdana and Clones", 12, "Regular Class", 'l' },
+ { "Verdana and Clones", 12, "Regular Class", 'm' },
+ { "Verdana and Clones", 13, "Regular Class", 'i' },
+ { "Verdana and Clones", 13, "Regular Class", 'j' },
+ { "Verdana and Clones", 13, "Regular Class", 'l' },
+ { "Verdana and Clones", 14, "Regular Class", 'm' },
+ };
+
+
+ /* Scaling slightly in the x-direction prior to hinting results in */
+ /* more visually pleasing glyphs in certain cases. */
+ /* This sometimes needs to be coordinated with compatible width rules. */
+ /* A value of 1000 corresponds to a scaled value of 1.0. */
+
+#define X_SCALING_RULES_SIZE 50
+
+ static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] =
+ {
+ { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
+ { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
+ { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
+ { "Arial", 11, "Regular Class", 'm', 975 },
+ { "Arial", 12, "Regular Class", 'm', 1050 },
+ /* Cyrillic small letter el */
+ { "Arial", 13, "Regular Class", 0x43B, 950 },
+ { "Arial", 13, "Regular Class", 'o', 950 },
+ { "Arial", 13, "Regular Class", 'e', 950 },
+ { "Arial", 14, "Regular Class", 'm', 950 },
+ /* Cyrillic small letter el */
+ { "Arial", 15, "Regular Class", 0x43B, 925 },
+ { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
+ { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
+ { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
+ { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
+ { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
+ { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
+ { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
+ { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
+ { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
+ { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
+ { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
+ { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
+ { "Georgia", 10, "", 0, 1050 },
+ { "Georgia", 11, "", 0, 1100 },
+ { "Georgia", 12, "", 0, 1025 },
+ { "Georgia", 13, "", 0, 1050 },
+ { "Georgia", 16, "", 0, 1050 },
+ { "Georgia", 17, "", 0, 1030 },
+ { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
+ { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
+ { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
+ { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
+ { "Segoe UI", 12, "Regular Class", 'H', 1050 },
+ { "Segoe UI", 12, "Regular Class", 'm', 1050 },
+ { "Segoe UI", 14, "Regular Class", 'm', 1050 },
+ { "Tahoma", 11, "Regular Class", 'i', 975 },
+ { "Tahoma", 11, "Regular Class", 'l', 975 },
+ { "Tahoma", 11, "Regular Class", 'j', 900 },
+ { "Tahoma", 11, "Regular Class", 'm', 918 },
+ { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
+ { "Verdana", 12, "Regular Class", 'm', 975 },
+ { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
+ { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
+ { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
+ { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
+ { "Verdana", 16, "Regular Class", 0, 1050 },
+ { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
+ { "Times New Roman", 16, "Regular Class", 'm', 918 },
+ { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
+ { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
+ };
+
+#else
+
+#define COMPATIBLE_WIDTHS_RULES_SIZE 1
+
+ static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
+ [COMPATIBLE_WIDTHS_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+#define X_SCALING_RULES_SIZE 1
+
+ static const SPH_ScaleRule X_SCALING_Rules
+ [X_SCALING_RULES_SIZE] =
+ {
+ { "-", 0, "", 0, 1000 },
+ };
+
+#endif /* FORCE_NATURAL_WIDTHS */
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ is_member_of_family_class( const FT_String* detected_font_name,
+ const FT_String* rule_font_name )
+ {
+ FT_UInt i, j;
+
+
+ /* Does font name match rule family? */
+ if ( strcmp( detected_font_name, rule_font_name ) == 0 )
+ return TRUE;
+
+ /* Is font name a wildcard ""? */
+ if ( strcmp( rule_font_name, "" ) == 0 )
+ return TRUE;
+
+ /* Is font name contained in a class list? */
+ for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
+ {
+ if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
+ {
+ for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+ {
+ if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
+ continue;
+ if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
+ detected_font_name ) == 0 )
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ is_member_of_style_class( const FT_String* detected_font_style,
+ const FT_String* rule_font_style )
+ {
+ FT_UInt i, j;
+
+
+ /* Does font style match rule style? */
+ if ( strcmp( detected_font_style, rule_font_style ) == 0 )
+ return TRUE;
+
+ /* Is font style a wildcard ""? */
+ if ( strcmp( rule_font_style, "" ) == 0 )
+ return TRUE;
+
+ /* Is font style contained in a class list? */
+ for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
+ {
+ if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
+ {
+ for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+ {
+ if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
+ continue;
+ if ( strcmp( STYLE_CLASS_Rules[i].member[j],
+ detected_font_style ) == 0 )
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ sph_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_TweakRule* rule,
+ FT_UInt num_rules )
+ {
+ FT_UInt i;
+
+
+ /* rule checks may be able to be optimized further */
+ for ( i = 0; i < num_rules; i++ )
+ {
+ if ( family &&
+ ( is_member_of_family_class ( family, rule[i].family ) ) )
+ if ( rule[i].ppem == 0 ||
+ rule[i].ppem == ppem )
+ if ( style &&
+ is_member_of_style_class ( style, rule[i].style ) )
+ if ( rule[i].glyph == 0 ||
+ FT_Get_Char_Index( (FT_Face)face,
+ rule[i].glyph ) == glyph_index )
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_UInt
+ scale_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_ScaleRule* rule,
+ FT_UInt num_rules )
+ {
+ FT_UInt i;
+
+
+ /* rule checks may be able to be optimized further */
+ for ( i = 0; i < num_rules; i++ )
+ {
+ if ( family &&
+ ( is_member_of_family_class ( family, rule[i].family ) ) )
+ if ( rule[i].ppem == 0 ||
+ rule[i].ppem == ppem )
+ if ( style &&
+ is_member_of_style_class( style, rule[i].style ) )
+ if ( rule[i].glyph == 0 ||
+ FT_Get_Char_Index( (FT_Face)face,
+ rule[i].glyph ) == glyph_index )
+ return rule[i].scale;
+ }
+
+ return 1000;
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ sph_test_tweak_x_scaling( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index )
+ {
+ return scale_test_tweak( face, family, ppem, style, glyph_index,
+ X_SCALING_Rules, X_SCALING_RULES_SIZE );
+ }
+
+
+#define TWEAK_RULES( x ) \
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
+ x##_Rules, x##_RULES_SIZE ) ) \
+ loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;
+
+#define TWEAK_RULES_EXCEPTIONS( x ) \
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
+ x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
+ loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;
+
+
+ FT_LOCAL_DEF( void )
+ sph_set_tweaks( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+ FT_String* family = face->root.family_name;
+ int ppem = loader->size->metrics.x_ppem;
+ FT_String* style = face->root.style_name;
+
+
+ /* don't apply rules if style isn't set */
+ if ( !face->root.style_name )
+ return;
+
+#ifdef SPH_DEBUG_MORE_VERBOSE
+ printf( "%s,%d,%s,%c=%d ",
+ family, ppem, style, glyph_index, glyph_index );
+#endif
+
+ TWEAK_RULES( PIXEL_HINTING );
+
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
+ {
+ loader->exec->ignore_x_mode = FALSE;
+ return;
+ }
+
+ TWEAK_RULES( ALLOW_X_DMOVE );
+ TWEAK_RULES( ALWAYS_DO_DELTAP );
+ TWEAK_RULES( ALWAYS_SKIP_DELTAP );
+ TWEAK_RULES( DEEMBOLDEN );
+ TWEAK_RULES( DO_SHPIX );
+ TWEAK_RULES( EMBOLDEN );
+ TWEAK_RULES( MIAP_HACK );
+ TWEAK_RULES( NORMAL_ROUND );
+ TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
+ TWEAK_RULES( NO_CALL_AFTER_IUP );
+ TWEAK_RULES( NO_DELTAP_AFTER_IUP );
+ TWEAK_RULES( RASTERIZER_35 );
+ TWEAK_RULES( SKIP_IUP );
+
+ TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
+
+ TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
+
+ TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
+
+ TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
+
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+ {
+ if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
+ {
+ loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+ loader->exec->size->cvt_ready = FALSE;
+
+ tt_size_ready_bytecode(
+ loader->exec->size,
+ FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+ }
+ else
+ loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+ }
+ else
+ {
+ if ( loader->exec->rasterizer_version !=
+ SPH_OPTION_SET_RASTERIZER_VERSION )
+ {
+ loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ loader->exec->size->cvt_ready = FALSE;
+
+ tt_size_ready_bytecode(
+ loader->exec->size,
+ FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+ }
+ else
+ loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ }
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
+ TWEAK_RULES( COURIER_NEW_2_HACK );
+ }
+
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+ COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
+ loader->exec->face->sph_compatibility_mode = TRUE;
+
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+ COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
+ loader->exec->compatible_widths |= TRUE;
+ }
+ }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* ANSI C doesn't like empty source files */
+ typedef int _tt_subpix_dummy;
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
new file mode 100644
index 0000000000..b536c98ac9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
@@ -0,0 +1,110 @@
+/***************************************************************************/
+/* */
+/* ttsubpix.h */
+/* */
+/* TrueType Subpixel Hinting. */
+/* */
+/* Copyright 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTSUBPIX_H__
+#define __TTSUBPIX_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+#include "ttinterp.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* ID flags to identify special functions at FDEF and runtime. */
+ /* */
+ /* */
+#define SPH_FDEF_INLINE_DELTA_1 0x0000001
+#define SPH_FDEF_INLINE_DELTA_2 0x0000002
+#define SPH_FDEF_DIAGONAL_STROKE 0x0000004
+#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008
+#define SPH_FDEF_TTFAUTOHINT_1 0x0000010
+#define SPH_FDEF_SPACING_1 0x0000020
+#define SPH_FDEF_SPACING_2 0x0000040
+#define SPH_FDEF_TYPEMAN_STROKES 0x0000080
+#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100
+
+
+ /*************************************************************************/
+ /* */
+ /* Tweak flags that are set for each glyph by the below rules. */
+ /* */
+ /* */
+#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001
+#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002
+#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004
+#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008
+#define SPH_TWEAK_DEEMBOLDEN 0x0000010
+#define SPH_TWEAK_DO_SHPIX 0x0000020
+#define SPH_TWEAK_EMBOLDEN 0x0000040
+#define SPH_TWEAK_MIAP_HACK 0x0000080
+#define SPH_TWEAK_NORMAL_ROUND 0x0000100
+#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200
+#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400
+#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800
+#define SPH_TWEAK_PIXEL_HINTING 0x0001000
+#define SPH_TWEAK_RASTERIZER_35 0x0002000
+#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000
+#define SPH_TWEAK_SKIP_IUP 0x0008000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000
+#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000
+#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000
+
+
+ FT_LOCAL( FT_Bool )
+ sph_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_TweakRule* rule,
+ FT_UInt num_rules );
+
+ FT_LOCAL( FT_UInt )
+ sph_test_tweak_x_scaling( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index );
+
+ FT_LOCAL( void )
+ sph_set_tweaks( TT_Loader loader,
+ FT_UInt glyph_index );
+
+
+ /* These macros are defined absent a method for setting them */
+#define SPH_OPTION_BITMAP_WIDTHS FALSE
+#define SPH_OPTION_SET_SUBPIXEL TRUE
+#define SPH_OPTION_SET_GRAYSCALE FALSE
+#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE
+#define SPH_OPTION_SET_RASTERIZER_VERSION 38
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+FT_END_HEADER
+
+#endif /* __TTSUBPIX_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
new file mode 100644
index 0000000000..8e366baae5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/type1 Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) type1 ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = t1afm t1driver t1objs t1load t1gload t1parse ;
+ }
+ else
+ {
+ _sources = type1 ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/type1 Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
new file mode 100644
index 0000000000..00c85e1dfc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
@@ -0,0 +1,37 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* type1.c */
+/* */
+/* FreeType Type 1 driver component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "t1parse.c"
+#include "t1load.c"
+#include "t1objs.c"
+#include "t1driver.c"
+#include "t1gload.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.c"
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
new file mode 100644
index 0000000000..ade0210d76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Type1 module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1_DRIVER
+
+define TYPE1_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
new file mode 100644
index 0000000000..15087b0304
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 Type1 driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# Type1 driver directory
+#
+T1_DIR := $(SRC_DIR)/type1
+
+
+# compilation flags for the driver
+#
+T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))
+
+
+# Type1 driver sources (i.e., C files)
+#
+T1_DRV_SRC := $(T1_DIR)/t1parse.c \
+ $(T1_DIR)/t1load.c \
+ $(T1_DIR)/t1driver.c \
+ $(T1_DIR)/t1afm.c \
+ $(T1_DIR)/t1gload.c \
+ $(T1_DIR)/t1objs.c
+
+# Type1 driver headers
+#
+T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \
+ $(T1_DIR)/t1tokens.h \
+ $(T1_DIR)/t1errors.h
+
+
+# Type1 driver object(s)
+#
+# T1_DRV_OBJ_M is used during `multi' builds
+# T1_DRV_OBJ_S is used during `single' builds
+#
+T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O
+
+# Type1 driver source file for single build
+#
+T1_DRV_SRC_S := $(T1_DIR)/type1.c
+
+
+# Type1 driver - single object
+#
+$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)
+ $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))
+
+
+# Type1 driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)
+ $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(T1_DRV_OBJ_S)
+DRV_OBJS_M += $(T1_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
new file mode 100644
index 0000000000..b59225508e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
@@ -0,0 +1,396 @@
+/***************************************************************************/
+/* */
+/* t1afm.c */
+/* */
+/* AFM support for Type 1 fonts (body). */
+/* */
+/* Copyright 1996-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1afm.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1afm
+
+
+ FT_LOCAL_DEF( void )
+ T1_Done_Metrics( FT_Memory memory,
+ AFM_FontInfo fi )
+ {
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+
+ FT_FREE( fi->TrackKerns );
+ fi->NumTrackKern = 0;
+
+ FT_FREE( fi );
+ }
+
+
+ /* read a glyph name and return the equivalent glyph index */
+ static FT_Int
+ t1_get_index( const char* name,
+ FT_Offset len,
+ void* user_data )
+ {
+ T1_Font type1 = (T1_Font)user_data;
+ FT_Int n;
+
+
+ /* PS string/name length must be < 16-bit */
+ if ( len > 0xFFFFU )
+ return 0;
+
+ for ( n = 0; n < type1->num_glyphs; n++ )
+ {
+ char* gname = (char*)type1->glyph_names[n];
+
+
+ if ( gname && gname[0] == name[0] &&
+ ft_strlen( gname ) == len &&
+ ft_strncmp( gname, name, len ) == 0 )
+ return n;
+ }
+
+ return 0;
+ }
+
+
+#undef KERN_INDEX
+#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+ /* compare two kerning pairs */
+ FT_CALLBACK_DEF( int )
+ compare_kern_pairs( const void* a,
+ const void* b )
+ {
+ AFM_KernPair pair1 = (AFM_KernPair)a;
+ AFM_KernPair pair2 = (AFM_KernPair)b;
+
+ FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 );
+ FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 );
+
+
+ if ( index1 > index2 )
+ return 1;
+ else if ( index1 < index2 )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ /* parse a PFM file -- for now, only read the kerning pairs */
+ static FT_Error
+ T1_Read_PFM( FT_Face t1_face,
+ FT_Stream stream,
+ AFM_FontInfo fi )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = stream->memory;
+ FT_Byte* start;
+ FT_Byte* limit;
+ FT_Byte* p;
+ AFM_KernPair kp;
+ FT_Int width_table_length;
+ FT_CharMap oldcharmap;
+ FT_CharMap charmap;
+ FT_Int n;
+
+
+ start = (FT_Byte*)stream->cursor;
+ limit = (FT_Byte*)stream->limit;
+
+ /* Figure out how long the width table is. */
+ /* This info is a little-endian short at offset 99. */
+ p = start + 99;
+ if ( p + 2 > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+ width_table_length = FT_PEEK_USHORT_LE( p );
+
+ p += 18 + width_table_length;
+ if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )
+ /* extension table is probably optional */
+ goto Exit;
+
+ /* Kerning offset is 14 bytes from start of extensions table. */
+ p += 14;
+ p = start + FT_PEEK_ULONG_LE( p );
+
+ if ( p == start )
+ /* zero offset means no table */
+ goto Exit;
+
+ if ( p + 2 > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ fi->NumKernPair = FT_PEEK_USHORT_LE( p );
+ p += 2;
+ if ( p + 4 * fi->NumKernPair > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* Actually, kerning pairs are simply optional! */
+ if ( fi->NumKernPair == 0 )
+ goto Exit;
+
+ /* allocate the pairs */
+ if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+ goto Exit;
+
+ /* now, read each kern pair */
+ kp = fi->KernPairs;
+ limit = p + 4 * fi->NumKernPair;
+
+ /* PFM kerning data are stored by encoding rather than glyph index, */
+ /* so find the PostScript charmap of this font and install it */
+ /* temporarily. If we find no PostScript charmap, then just use */
+ /* the default and hope it is the right one. */
+ oldcharmap = t1_face->charmap;
+ charmap = NULL;
+
+ for ( n = 0; n < t1_face->num_charmaps; n++ )
+ {
+ charmap = t1_face->charmaps[n];
+ /* check against PostScript pseudo platform */
+ if ( charmap->platform_id == 7 )
+ {
+ error = FT_Set_Charmap( t1_face, charmap );
+ if ( error )
+ goto Exit;
+ break;
+ }
+ }
+
+ /* Kerning info is stored as: */
+ /* */
+ /* encoding of first glyph (1 byte) */
+ /* encoding of second glyph (1 byte) */
+ /* offset (little-endian short) */
+ for ( ; p < limit ; p += 4 )
+ {
+ kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
+ kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
+
+ kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
+ kp->y = 0;
+
+ kp++;
+ }
+
+ if ( oldcharmap != NULL )
+ error = FT_Set_Charmap( t1_face, oldcharmap );
+ if ( error )
+ goto Exit;
+
+ /* now, sort the kern pairs according to their glyph indices */
+ ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),
+ compare_kern_pairs );
+
+ Exit:
+ if ( error )
+ {
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+ }
+
+ return error;
+ }
+
+
+ /* parse a metrics file -- either AFM or PFM depending on what */
+ /* it turns out to be */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Read_Metrics( FT_Face t1_face,
+ FT_Stream stream )
+ {
+ PSAux_Service psaux;
+ FT_Memory memory = stream->memory;
+ AFM_ParserRec parser;
+ AFM_FontInfo fi = NULL;
+ FT_Error error = FT_ERR( Unknown_File_Format );
+ T1_Font t1_font = &( (T1_Face)t1_face )->type1;
+
+
+ if ( FT_NEW( fi ) ||
+ FT_FRAME_ENTER( stream->size ) )
+ goto Exit;
+
+ fi->FontBBox = t1_font->font_bbox;
+ fi->Ascender = t1_font->font_bbox.yMax;
+ fi->Descender = t1_font->font_bbox.yMin;
+
+ psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;
+ if ( psaux->afm_parser_funcs )
+ {
+ error = psaux->afm_parser_funcs->init( &parser,
+ stream->memory,
+ stream->cursor,
+ stream->limit );
+
+ if ( !error )
+ {
+ parser.FontInfo = fi;
+ parser.get_index = t1_get_index;
+ parser.user_data = t1_font;
+
+ error = psaux->afm_parser_funcs->parse( &parser );
+ psaux->afm_parser_funcs->done( &parser );
+ }
+ }
+
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+ FT_Byte* start = stream->cursor;
+
+
+ /* MS Windows allows versions up to 0x3FF without complaining */
+ if ( stream->size > 6 &&
+ start[1] < 4 &&
+ FT_PEEK_ULONG_LE( start + 2 ) == stream->size )
+ error = T1_Read_PFM( t1_face, stream, fi );
+ }
+
+ if ( !error )
+ {
+ t1_font->font_bbox = fi->FontBBox;
+
+ t1_face->bbox.xMin = fi->FontBBox.xMin >> 16;
+ t1_face->bbox.yMin = fi->FontBBox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;
+ t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;
+
+ /* no `U' suffix here to 0x8000! */
+ t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 );
+ t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );
+
+ if ( fi->NumKernPair )
+ {
+ t1_face->face_flags |= FT_FACE_FLAG_KERNING;
+ ( (T1_Face)t1_face )->afm_data = fi;
+ fi = NULL;
+ }
+ }
+
+ FT_FRAME_EXIT();
+
+ Exit:
+ if ( fi != NULL )
+ T1_Done_Metrics( memory, fi );
+
+ return error;
+ }
+
+
+ /* find the kerning for a given glyph pair */
+ FT_LOCAL_DEF( void )
+ T1_Get_Kerning( AFM_FontInfo fi,
+ FT_UInt glyph1,
+ FT_UInt glyph2,
+ FT_Vector* kerning )
+ {
+ AFM_KernPair min, mid, max;
+ FT_ULong idx = KERN_INDEX( glyph1, glyph2 );
+
+
+ /* simple binary search */
+ min = fi->KernPairs;
+ max = min + fi->NumKernPair - 1;
+
+ while ( min <= max )
+ {
+ FT_ULong midi;
+
+
+ mid = min + ( max - min ) / 2;
+ midi = KERN_INDEX( mid->index1, mid->index2 );
+
+ if ( midi == idx )
+ {
+ kerning->x = mid->x;
+ kerning->y = mid->y;
+
+ return;
+ }
+
+ if ( midi < idx )
+ min = mid + 1;
+ else
+ max = mid - 1;
+ }
+
+ kerning->x = 0;
+ kerning->y = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Track_Kerning( FT_Face face,
+ FT_Fixed ptsize,
+ FT_Int degree,
+ FT_Fixed* kerning )
+ {
+ AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
+ FT_Int i;
+
+
+ if ( !fi )
+ return FT_THROW( Invalid_Argument );
+
+ for ( i = 0; i < fi->NumTrackKern; i++ )
+ {
+ AFM_TrackKern tk = fi->TrackKerns + i;
+
+
+ if ( tk->degree != degree )
+ continue;
+
+ if ( ptsize < tk->min_ptsize )
+ *kerning = tk->min_kern;
+ else if ( ptsize > tk->max_ptsize )
+ *kerning = tk->max_kern;
+ else
+ {
+ *kerning = FT_MulDiv( ptsize - tk->min_ptsize,
+ tk->max_kern - tk->min_kern,
+ tk->max_ptsize - tk->min_ptsize ) +
+ tk->min_kern;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
new file mode 100644
index 0000000000..60c3aa4cdc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/* */
+/* t1afm.h */
+/* */
+/* AFM support for Type 1 fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1AFM_H__
+#define __T1AFM_H__
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ T1_Read_Metrics( FT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ T1_Done_Metrics( FT_Memory memory,
+ AFM_FontInfo fi );
+
+ FT_LOCAL( void )
+ T1_Get_Kerning( AFM_FontInfo fi,
+ FT_UInt glyph1,
+ FT_UInt glyph2,
+ FT_Vector* kerning );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Track_Kerning( FT_Face face,
+ FT_Fixed ptsize,
+ FT_Int degree,
+ FT_Fixed* kerning );
+
+FT_END_HEADER
+
+#endif /* __T1AFM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
new file mode 100644
index 0000000000..8885862716
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
@@ -0,0 +1,726 @@
+/***************************************************************************/
+/* */
+/* t1driver.c */
+/* */
+/* Type 1 driver interface (body). */
+/* */
+/* Copyright 1996-2004, 2006, 2007, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1driver.h"
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svkern.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1driver
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ t1_get_glyph_name( T1_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_UInt
+ t1_get_name_index( T1_Face face,
+ FT_String* glyph_name )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < face->type1.num_glyphs; i++ )
+ {
+ FT_String* gname = face->type1.glyph_names[i];
+
+
+ if ( !ft_strcmp( glyph_name, gname ) )
+ return (FT_UInt)i;
+ }
+
+ return 0;
+ }
+
+
+ static const FT_Service_GlyphDictRec t1_service_glyph_dict =
+ {
+ (FT_GlyphDict_GetNameFunc) t1_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+ };
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ t1_get_ps_name( T1_Face face )
+ {
+ return (const char*) face->type1.font_name;
+ }
+
+
+ static const FT_Service_PsFontNameRec t1_service_ps_name =
+ {
+ (FT_PsName_GetFunc)t1_get_ps_name
+ };
+
+
+ /*
+ * MULTIPLE MASTERS SERVICE
+ *
+ */
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ static const FT_Service_MultiMastersRec t1_service_multi_masters =
+ {
+ (FT_Get_MM_Func) T1_Get_Multi_Master,
+ (FT_Set_MM_Design_Func) T1_Set_MM_Design,
+ (FT_Set_MM_Blend_Func) T1_Set_MM_Blend,
+ (FT_Get_MM_Var_Func) T1_Get_MM_Var,
+ (FT_Set_Var_Design_Func)T1_Set_Var_Design
+ };
+#endif
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Error
+ t1_ps_get_font_info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ *afont_info = ((T1_Face)face)->type1.font_info;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ t1_ps_get_font_extra( FT_Face face,
+ PS_FontExtraRec* afont_extra )
+ {
+ *afont_extra = ((T1_Face)face)->type1.font_extra;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Int
+ t1_ps_has_glyph_names( FT_Face face )
+ {
+ FT_UNUSED( face );
+
+ return 1;
+ }
+
+
+ static FT_Error
+ t1_ps_get_font_private( FT_Face face,
+ PS_PrivateRec* afont_private )
+ {
+ *afont_private = ((T1_Face)face)->type1.private_dict;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Long
+ t1_ps_get_font_value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len )
+ {
+ FT_Long retval = -1;
+ T1_Face t1face = (T1_Face)face;
+ T1_Font type1 = &t1face->type1;
+
+
+ switch ( key )
+ {
+ case PS_DICT_FONT_TYPE:
+ retval = sizeof ( type1->font_type );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->font_type;
+ break;
+
+ case PS_DICT_FONT_MATRIX:
+ if ( idx < sizeof ( type1->font_matrix ) /
+ sizeof ( type1->font_matrix.xx ) )
+ {
+ FT_Fixed val = 0;
+
+
+ retval = sizeof ( val );
+ if ( value && value_len >= retval )
+ {
+ switch ( idx )
+ {
+ case 0:
+ val = type1->font_matrix.xx;
+ break;
+ case 1:
+ val = type1->font_matrix.xy;
+ break;
+ case 2:
+ val = type1->font_matrix.yx;
+ break;
+ case 3:
+ val = type1->font_matrix.yy;
+ break;
+ }
+ *((FT_Fixed *)value) = val;
+ }
+ }
+ break;
+
+ case PS_DICT_FONT_BBOX:
+ if ( idx < sizeof ( type1->font_bbox ) /
+ sizeof ( type1->font_bbox.xMin ) )
+ {
+ FT_Fixed val = 0;
+
+
+ retval = sizeof ( val );
+ if ( value && value_len >= retval )
+ {
+ switch ( idx )
+ {
+ case 0:
+ val = type1->font_bbox.xMin;
+ break;
+ case 1:
+ val = type1->font_bbox.yMin;
+ break;
+ case 2:
+ val = type1->font_bbox.xMax;
+ break;
+ case 3:
+ val = type1->font_bbox.yMax;
+ break;
+ }
+ *((FT_Fixed *)value) = val;
+ }
+ }
+ break;
+
+ case PS_DICT_PAINT_TYPE:
+ retval = sizeof ( type1->paint_type );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->paint_type;
+ break;
+
+ case PS_DICT_FONT_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_name ), retval );
+ break;
+
+ case PS_DICT_UNIQUE_ID:
+ retval = sizeof ( type1->private_dict.unique_id );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.unique_id;
+ break;
+
+ case PS_DICT_NUM_CHAR_STRINGS:
+ retval = sizeof ( type1->num_glyphs );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->num_glyphs;
+ break;
+
+ case PS_DICT_CHAR_STRING_KEY:
+ if ( idx < (FT_UInt)type1->num_glyphs )
+ {
+ retval = (FT_Long)( ft_strlen( type1->glyph_names[idx] ) + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_CHAR_STRING:
+ if ( idx < (FT_UInt)type1->num_glyphs )
+ {
+ retval = (FT_Long)( type1->charstrings_len[idx] + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->charstrings[idx] ),
+ retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_ENCODING_TYPE:
+ retval = sizeof ( type1->encoding_type );
+ if ( value && value_len >= retval )
+ *((T1_EncodingType *)value) = type1->encoding_type;
+ break;
+
+ case PS_DICT_ENCODING_ENTRY:
+ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
+ idx < (FT_UInt)type1->encoding.num_chars )
+ {
+ retval = (FT_Long)( ft_strlen( type1->encoding.char_name[idx] ) + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
+ retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_NUM_SUBRS:
+ retval = sizeof ( type1->num_subrs );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->num_subrs;
+ break;
+
+ case PS_DICT_SUBR:
+ if ( idx < (FT_UInt)type1->num_subrs )
+ {
+ retval = (FT_Long)( type1->subrs_len[idx] + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_STD_HW:
+ retval = sizeof ( type1->private_dict.standard_width[0] );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->private_dict.standard_width[0];
+ break;
+
+ case PS_DICT_STD_VW:
+ retval = sizeof ( type1->private_dict.standard_height[0] );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->private_dict.standard_height[0];
+ break;
+
+ case PS_DICT_NUM_BLUE_VALUES:
+ retval = sizeof ( type1->private_dict.num_blue_values );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_blue_values;
+ break;
+
+ case PS_DICT_BLUE_VALUE:
+ if ( idx < type1->private_dict.num_blue_values )
+ {
+ retval = sizeof ( type1->private_dict.blue_values[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.blue_values[idx];
+ }
+ break;
+
+ case PS_DICT_BLUE_SCALE:
+ retval = sizeof ( type1->private_dict.blue_scale );
+ if ( value && value_len >= retval )
+ *((FT_Fixed *)value) = type1->private_dict.blue_scale;
+ break;
+
+ case PS_DICT_BLUE_FUZZ:
+ retval = sizeof ( type1->private_dict.blue_fuzz );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.blue_fuzz;
+ break;
+
+ case PS_DICT_BLUE_SHIFT:
+ retval = sizeof ( type1->private_dict.blue_shift );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.blue_shift;
+ break;
+
+ case PS_DICT_NUM_OTHER_BLUES:
+ retval = sizeof ( type1->private_dict.num_other_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_other_blues;
+ break;
+
+ case PS_DICT_OTHER_BLUE:
+ if ( idx < type1->private_dict.num_other_blues )
+ {
+ retval = sizeof ( type1->private_dict.other_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.other_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_FAMILY_BLUES:
+ retval = sizeof ( type1->private_dict.num_family_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_family_blues;
+ break;
+
+ case PS_DICT_FAMILY_BLUE:
+ if ( idx < type1->private_dict.num_family_blues )
+ {
+ retval = sizeof ( type1->private_dict.family_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.family_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_FAMILY_OTHER_BLUES:
+ retval = sizeof ( type1->private_dict.num_family_other_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
+ break;
+
+ case PS_DICT_FAMILY_OTHER_BLUE:
+ if ( idx < type1->private_dict.num_family_other_blues )
+ {
+ retval = sizeof ( type1->private_dict.family_other_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_STEM_SNAP_H:
+ retval = sizeof ( type1->private_dict.num_snap_widths );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
+ break;
+
+ case PS_DICT_STEM_SNAP_H:
+ if ( idx < type1->private_dict.num_snap_widths )
+ {
+ retval = sizeof ( type1->private_dict.snap_widths[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_STEM_SNAP_V:
+ retval = sizeof ( type1->private_dict.num_snap_heights );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
+ break;
+
+ case PS_DICT_STEM_SNAP_V:
+ if ( idx < type1->private_dict.num_snap_heights )
+ {
+ retval = sizeof ( type1->private_dict.snap_heights[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
+ }
+ break;
+
+ case PS_DICT_RND_STEM_UP:
+ retval = sizeof ( type1->private_dict.round_stem_up );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->private_dict.round_stem_up;
+ break;
+
+ case PS_DICT_FORCE_BOLD:
+ retval = sizeof ( type1->private_dict.force_bold );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->private_dict.force_bold;
+ break;
+
+ case PS_DICT_MIN_FEATURE:
+ if ( idx < sizeof ( type1->private_dict.min_feature ) /
+ sizeof ( type1->private_dict.min_feature[0] ) )
+ {
+ retval = sizeof ( type1->private_dict.min_feature[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.min_feature[idx];
+ }
+ break;
+
+ case PS_DICT_LEN_IV:
+ retval = sizeof ( type1->private_dict.lenIV );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.lenIV;
+ break;
+
+ case PS_DICT_PASSWORD:
+ retval = sizeof ( type1->private_dict.password );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->private_dict.password;
+ break;
+
+ case PS_DICT_LANGUAGE_GROUP:
+ retval = sizeof ( type1->private_dict.language_group );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->private_dict.language_group;
+ break;
+
+ case PS_DICT_IS_FIXED_PITCH:
+ retval = sizeof ( type1->font_info.is_fixed_pitch );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
+ break;
+
+ case PS_DICT_UNDERLINE_POSITION:
+ retval = sizeof ( type1->font_info.underline_position );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->font_info.underline_position;
+ break;
+
+ case PS_DICT_UNDERLINE_THICKNESS:
+ retval = sizeof ( type1->font_info.underline_thickness );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->font_info.underline_thickness;
+ break;
+
+ case PS_DICT_FS_TYPE:
+ retval = sizeof ( type1->font_extra.fs_type );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->font_extra.fs_type;
+ break;
+
+ case PS_DICT_VERSION:
+ retval = (FT_Long)( ft_strlen( type1->font_info.version ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.version ), retval );
+ break;
+
+ case PS_DICT_NOTICE:
+ retval = (FT_Long)( ft_strlen( type1->font_info.notice ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
+ break;
+
+ case PS_DICT_FULL_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_info.full_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
+ break;
+
+ case PS_DICT_FAMILY_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_info.family_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
+ break;
+
+ case PS_DICT_WEIGHT:
+ retval = (FT_Long)( ft_strlen( type1->font_info.weight ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
+ break;
+
+ case PS_DICT_ITALIC_ANGLE:
+ retval = sizeof ( type1->font_info.italic_angle );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->font_info.italic_angle;
+ break;
+
+ default:
+ break;
+ }
+
+ return retval;
+ }
+
+
+ static const FT_Service_PsInfoRec t1_service_ps_info =
+ {
+ (PS_GetFontInfoFunc) t1_ps_get_font_info,
+ (PS_GetFontExtraFunc) t1_ps_get_font_extra,
+ (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
+ (PS_GetFontPrivateFunc)t1_ps_get_font_private,
+ (PS_GetFontValueFunc) t1_ps_get_font_value,
+ };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ static const FT_Service_KerningRec t1_service_kerning =
+ {
+ T1_Get_Track_Kerning,
+ };
+#endif
+
+
+ /*
+ * SERVICE LIST
+ *
+ */
+
+ static const FT_ServiceDescRec t1_services[] =
+ {
+ { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
+ { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict },
+ { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 },
+ { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info },
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ { FT_SERVICE_ID_KERNING, &t1_service_kerning },
+#endif
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters },
+#endif
+ { NULL, NULL }
+ };
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ Get_Interface( FT_Module module,
+ const FT_String* t1_interface )
+ {
+ FT_UNUSED( module );
+
+ return ft_service_list_lookup( t1_services, t1_interface );
+ }
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Get_Kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ static FT_Error
+ Get_Kerning( FT_Face t1face, /* T1_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ T1_Face face = (T1_Face)t1face;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( face->afm_data )
+ T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
+ left_glyph,
+ right_glyph,
+ kerning );
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Driver_ClassRec t1_driver_class =
+ {
+ {
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( FT_DriverRec ),
+
+ "type1",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* format interface */
+
+ T1_Driver_Init,
+ T1_Driver_Done,
+ Get_Interface,
+ },
+
+ sizeof ( T1_FaceRec ),
+ sizeof ( T1_SizeRec ),
+ sizeof ( T1_GlyphSlotRec ),
+
+ T1_Face_Init,
+ T1_Face_Done,
+ T1_Size_Init,
+ T1_Size_Done,
+ T1_GlyphSlot_Init,
+ T1_GlyphSlot_Done,
+
+ T1_Load_Glyph,
+
+#ifdef T1_CONFIG_OPTION_NO_AFM
+ 0, /* FT_Face_GetKerningFunc */
+ 0, /* FT_Face_AttachFunc */
+#else
+ Get_Kerning,
+ T1_Read_Metrics,
+#endif
+ T1_Get_Advances,
+ T1_Size_Request,
+ 0 /* FT_Size_SelectFunc */
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
new file mode 100644
index 0000000000..feff60dc3f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* t1driver.h */
+/* */
+/* High-level Type 1 driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1DRIVER_H__
+#define __T1DRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __T1DRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
new file mode 100644
index 0000000000..69584ba6b6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* t1errors.h */
+/* */
+/* Type 1 error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the Type 1 error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __T1ERRORS_H__
+#define __T1ERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX T1_Err_
+#define FT_ERR_BASE FT_Mod_Err_Type1
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __T1ERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
new file mode 100644
index 0000000000..6fc908b658
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
@@ -0,0 +1,517 @@
+/***************************************************************************/
+/* */
+/* t1gload.c */
+/* */
+/* Type 1 Glyph Loader (body). */
+/* */
+/* Copyright 1996-2006, 2008-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1gload.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1gload
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder,
+ FT_UInt glyph_index,
+ FT_Data* char_string )
+ {
+ T1_Face face = (T1_Face)decoder->builder.face;
+ T1_Font type1 = &face->type1;
+ FT_Error error = FT_Err_Ok;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec *inc =
+ face->root.internal->incremental_interface;
+#endif
+
+
+ decoder->font_matrix = type1->font_matrix;
+ decoder->font_offset = type1->font_offset;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( inc )
+ error = inc->funcs->get_glyph_data( inc->object,
+ glyph_index, char_string );
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* For ordinary fonts get the character data stored in the face record. */
+ {
+ char_string->pointer = type1->charstrings[glyph_index];
+ char_string->length = (FT_Int)type1->charstrings_len[glyph_index];
+ }
+
+ if ( !error )
+ error = decoder->funcs.parse_charstrings(
+ decoder, (FT_Byte*)char_string->pointer,
+ char_string->length );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error && inc && inc->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+ metrics.bearing_y = 0;
+ metrics.advance = FIXED_TO_INT( decoder->builder.advance.x );
+ metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+ error = inc->funcs->get_glyph_metrics( inc->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+ decoder->builder.advance.x = INT_TO_FIXED( metrics.advance );
+ decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ T1_Parse_Glyph( T1_Decoder decoder,
+ FT_UInt glyph_index )
+ {
+ FT_Data glyph_data;
+ FT_Error error = T1_Parse_Glyph_And_Get_Char_String(
+ decoder, glyph_index, &glyph_data );
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( !error )
+ {
+ T1_Face face = (T1_Face)decoder->builder.face;
+
+
+ if ( face->root.internal->incremental_interface )
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Compute_Max_Advance( T1_Face face,
+ FT_Pos* max_advance )
+ {
+ FT_Error error;
+ T1_DecoderRec decoder;
+ FT_Int glyph_index;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ *max_advance = 0;
+
+ /* initialize load decoder */
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ 0,
+ FT_RENDER_MODE_NORMAL,
+ T1_Parse_Glyph );
+ if ( error )
+ return error;
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ *max_advance = 0;
+
+ /* for each glyph, parse the glyph charstring and extract */
+ /* the advance width */
+ for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
+ {
+ /* now get load the unscaled outline */
+ error = T1_Parse_Glyph( &decoder, glyph_index );
+ if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
+ *max_advance = decoder.builder.advance.x;
+
+ /* ignore the error if one occurred - skip to next glyph */
+ }
+
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Advances( FT_Face t1face, /* T1_Face */
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed* advances )
+ {
+ T1_Face face = (T1_Face)t1face;
+ T1_DecoderRec decoder;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ FT_UInt nn;
+ FT_Error error;
+
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ for ( nn = 0; nn < count; nn++ )
+ advances[nn] = 0;
+
+ return FT_Err_Ok;
+ }
+
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ 0,
+ FT_RENDER_MODE_NORMAL,
+ T1_Parse_Glyph );
+ if ( error )
+ return error;
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = T1_Parse_Glyph( &decoder, first + nn );
+ if ( !error )
+ advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
+ else
+ advances[nn] = 0;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Load_Glyph( FT_GlyphSlot t1glyph, /* T1_GlyphSlot */
+ FT_Size t1size, /* T1_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ T1_GlyphSlot glyph = (T1_GlyphSlot)t1glyph;
+ FT_Error error;
+ T1_DecoderRec decoder;
+ T1_Face face = (T1_Face)t1glyph->face;
+ FT_Bool hinting;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs;
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+ FT_Data glyph_data;
+ FT_Bool must_finish_decoder = FALSE;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Bool glyph_data_loaded = 0;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ if ( t1size )
+ {
+ glyph->x_scale = t1size->metrics.x_scale;
+ glyph->y_scale = t1size->metrics.y_scale;
+ }
+ else
+ {
+ glyph->x_scale = 0x10000L;
+ glyph->y_scale = 0x10000L;
+ }
+
+ t1glyph->outline.n_points = 0;
+ t1glyph->outline.n_contours = 0;
+
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 &&
+ ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+ t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ error = decoder_funcs->init( &decoder,
+ t1glyph->face,
+ t1size,
+ t1glyph,
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ FT_BOOL( hinting ),
+ FT_LOAD_TARGET_MODE( load_flags ),
+ T1_Parse_Glyph );
+ if ( error )
+ goto Exit;
+
+ must_finish_decoder = TRUE;
+
+ decoder.builder.no_recurse = FT_BOOL(
+ ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ /* now load the unscaled outline */
+ error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
+ &glyph_data );
+ if ( error )
+ goto Exit;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ glyph_data_loaded = 1;
+#endif
+
+ font_matrix = decoder.font_matrix;
+ font_offset = decoder.font_offset;
+
+ /* save new glyph tables */
+ decoder_funcs->done( &decoder );
+
+ must_finish_decoder = FALSE;
+
+ /* now, set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax */
+ if ( !error )
+ {
+ t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+ t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ /* for composite glyphs, return only left side bearing and */
+ /* advance width */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = t1glyph->internal;
+
+
+ t1glyph->metrics.horiBearingX =
+ FIXED_TO_INT( decoder.builder.left_bearing.x );
+ t1glyph->metrics.horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &t1glyph->metrics;
+ FT_Vector advance;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ t1glyph->linearHoriAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ t1glyph->internal->glyph_transformed = 0;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ metrics->vertAdvance = ( face->type1.font_bbox.yMax -
+ face->type1.font_bbox.yMin ) >> 16;
+ t1glyph->linearVertAdvance = metrics->vertAdvance;
+ }
+ else
+ {
+ metrics->vertAdvance =
+ FIXED_TO_INT( decoder.builder.advance.y );
+ t1glyph->linearVertAdvance =
+ FIXED_TO_INT( decoder.builder.advance.y );
+ }
+
+ t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ if ( t1size && t1size->metrics.y_ppem < 24 )
+ t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+#if 1
+ /* apply the font matrix, if any */
+ if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||
+ font_matrix.xy != 0 || font_matrix.yx != 0 )
+ FT_Outline_Transform( &t1glyph->outline, &font_matrix );
+
+ if ( font_offset.x || font_offset.y )
+ FT_Outline_Translate( &t1glyph->outline,
+ font_offset.x,
+ font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+#endif
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = decoder.builder.base;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points, if we are not hinting */
+ if ( !hinting || ! decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &t1glyph->outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+
+ /* Set control data to the glyph charstrings. Note that this is */
+ /* _not_ zero-terminated. */
+ t1glyph->control_data = (FT_Byte*)glyph_data.pointer;
+ t1glyph->control_len = glyph_data.length;
+ }
+
+
+ Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_data_loaded && face->root.internal->incremental_interface )
+ {
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+
+ /* Set the control data to null - it is no longer available if */
+ /* loaded incrementally. */
+ t1glyph->control_data = 0;
+ t1glyph->control_len = 0;
+ }
+#endif
+
+ if ( must_finish_decoder )
+ decoder_funcs->done( &decoder );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
new file mode 100644
index 0000000000..b8f4cfac9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* t1gload.h */
+/* */
+/* Type 1 Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1GLOAD_H__
+#define __T1GLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ T1_Compute_Max_Advance( T1_Face face,
+ FT_Pos* max_advance );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Advances( FT_Face face,
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed* advances );
+
+ FT_LOCAL( FT_Error )
+ T1_Load_Glyph( FT_GlyphSlot glyph,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __T1GLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
new file mode 100644
index 0000000000..76e36f82e7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
@@ -0,0 +1,2272 @@
+/***************************************************************************/
+/* */
+/* t1load.c */
+/* */
+/* Type 1 font loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This is the new and improved Type 1 data loader for FreeType 2. The */
+ /* old loader has several problems: it is slow, complex, difficult to */
+ /* maintain, and contains incredible hacks to make it accept some */
+ /* ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of */
+ /* the Type 1 fonts on my machine still aren't loaded correctly by it. */
+ /* */
+ /* This version is much simpler, much faster and also easier to read and */
+ /* maintain by a great order of magnitude. The idea behind it is to */
+ /* _not_ try to read the Type 1 token stream with a state machine (i.e. */
+ /* a Postscript-like interpreter) but rather to perform simple pattern */
+ /* matching. */
+ /* */
+ /* Indeed, nearly all data definitions follow a simple pattern like */
+ /* */
+ /* ... /Field <data> ... */
+ /* */
+ /* where <data> can be a number, a boolean, a string, or an array of */
+ /* numbers. There are a few exceptions, namely the encoding, font name, */
+ /* charstrings, and subrs; they are handled with a special pattern */
+ /* matching routine. */
+ /* */
+ /* All other common cases are handled very simply. The matching rules */
+ /* are defined in the file `t1tokens.h' through the use of several */
+ /* macros calls PARSE_XXX. This file is included twice here; the first */
+ /* time to generate parsing callback functions, the second time to */
+ /* generate a table of keywords (with pointers to the associated */
+ /* callback functions). */
+ /* */
+ /* The function `parse_dict' simply scans *linearly* a given dictionary */
+ /* (either the top-level or private one) and calls the appropriate */
+ /* callback when it encounters an immediate keyword. */
+ /* */
+ /* This is by far the fastest way one can find to parse and read all */
+ /* data. */
+ /* */
+ /* This led to tremendous code size reduction. Note that later, the */
+ /* glyph loader will also be _greatly_ simplified, and the automatic */
+ /* hinter will replace the clumsy `t1hinter'. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "t1load.h"
+#include "t1errors.h"
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#define IS_INCREMENTAL (FT_Bool)( face->root.internal->incremental_interface != 0 )
+#else
+#define IS_INCREMENTAL 0
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1load
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** MULTIPLE MASTERS SUPPORT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ t1_allocate_blend( T1_Face face,
+ FT_UInt num_designs,
+ FT_UInt num_axis )
+ {
+ PS_Blend blend;
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+
+
+ blend = face->blend;
+ if ( !blend )
+ {
+ if ( FT_NEW( blend ) )
+ goto Exit;
+
+ blend->num_default_design_vector = 0;
+
+ face->blend = blend;
+ }
+
+ /* allocate design data if needed */
+ if ( num_designs > 0 )
+ {
+ if ( blend->num_designs == 0 )
+ {
+ FT_UInt nn;
+
+
+ /* allocate the blend `private' and `font_info' dictionaries */
+ if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) ||
+ FT_NEW_ARRAY( blend->privates [1], num_designs ) ||
+ FT_NEW_ARRAY( blend->bboxes [1], num_designs ) ||
+ FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )
+ goto Exit;
+
+ blend->default_weight_vector = blend->weight_vector + num_designs;
+
+ blend->font_infos[0] = &face->type1.font_info;
+ blend->privates [0] = &face->type1.private_dict;
+ blend->bboxes [0] = &face->type1.font_bbox;
+
+ for ( nn = 2; nn <= num_designs; nn++ )
+ {
+ blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;
+ blend->privates [nn] = blend->privates [nn - 1] + 1;
+ blend->bboxes [nn] = blend->bboxes [nn - 1] + 1;
+ }
+
+ blend->num_designs = num_designs;
+ }
+ else if ( blend->num_designs != num_designs )
+ goto Fail;
+ }
+
+ /* allocate axis data if needed */
+ if ( num_axis > 0 )
+ {
+ if ( blend->num_axis != 0 && blend->num_axis != num_axis )
+ goto Fail;
+
+ blend->num_axis = num_axis;
+ }
+
+ /* allocate the blend design pos table if needed */
+ num_designs = blend->num_designs;
+ num_axis = blend->num_axis;
+ if ( num_designs && num_axis && blend->design_pos[0] == 0 )
+ {
+ FT_UInt n;
+
+
+ if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )
+ goto Exit;
+
+ for ( n = 1; n < num_designs; n++ )
+ blend->design_pos[n] = blend->design_pos[0] + num_axis * n;
+ }
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Multi_Master( T1_Face face,
+ FT_Multi_Master* master )
+ {
+ PS_Blend blend = face->blend;
+ FT_UInt n;
+ FT_Error error;
+
+
+ error = FT_THROW( Invalid_Argument );
+
+ if ( blend )
+ {
+ master->num_axis = blend->num_axis;
+ master->num_designs = blend->num_designs;
+
+ for ( n = 0; n < blend->num_axis; n++ )
+ {
+ FT_MM_Axis* axis = master->axis + n;
+ PS_DesignMap map = blend->design_map + n;
+
+
+ axis->name = blend->axis_names[n];
+ axis->minimum = map->design_points[0];
+ axis->maximum = map->design_points[map->num_points - 1];
+ }
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Given a normalized (blend) coordinate, figure out the design */
+ /* coordinate appropriate for that value. */
+ /* */
+ FT_LOCAL_DEF( FT_Fixed )
+ mm_axis_unmap( PS_DesignMap axismap,
+ FT_Fixed ncv )
+ {
+ int j;
+
+
+ if ( ncv <= axismap->blend_points[0] )
+ return INT_TO_FIXED( axismap->design_points[0] );
+
+ for ( j = 1; j < axismap->num_points; ++j )
+ {
+ if ( ncv <= axismap->blend_points[j] )
+ return INT_TO_FIXED( axismap->design_points[j - 1] ) +
+ ( axismap->design_points[j] - axismap->design_points[j - 1] ) *
+ FT_DivFix( ncv - axismap->blend_points[j - 1],
+ axismap->blend_points[j] -
+ axismap->blend_points[j - 1] );
+ }
+
+ return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Given a vector of weights, one for each design, figure out the */
+ /* normalized axis coordinates which gave rise to those weights. */
+ /* */
+ FT_LOCAL_DEF( void )
+ mm_weights_unmap( FT_Fixed* weights,
+ FT_Fixed* axiscoords,
+ FT_UInt axis_count )
+ {
+ FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
+
+ if ( axis_count == 1 )
+ axiscoords[0] = weights[1];
+
+ else if ( axis_count == 2 )
+ {
+ axiscoords[0] = weights[3] + weights[1];
+ axiscoords[1] = weights[3] + weights[2];
+ }
+
+ else if ( axis_count == 3 )
+ {
+ axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];
+ axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];
+ axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];
+ }
+
+ else
+ {
+ axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +
+ weights[7] + weights[5] + weights[3] + weights[1];
+ axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +
+ weights[7] + weights[6] + weights[3] + weights[2];
+ axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +
+ weights[7] + weights[6] + weights[5] + weights[4];
+ axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +
+ weights[11] + weights[10] + weights[9] + weights[8];
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Just a wrapper around T1_Get_Multi_Master to support the different */
+ /* arguments needed by the GX var distortable fonts. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_MM_Var( T1_Face face,
+ FT_MM_Var* *master )
+ {
+ FT_Memory memory = face->root.memory;
+ FT_MM_Var *mmvar = NULL;
+ FT_Multi_Master mmaster;
+ FT_Error error;
+ FT_UInt i;
+ FT_Fixed axiscoords[T1_MAX_MM_AXIS];
+ PS_Blend blend = face->blend;
+
+
+ error = T1_Get_Multi_Master( face, &mmaster );
+ if ( error )
+ goto Exit;
+ if ( FT_ALLOC( mmvar,
+ sizeof ( FT_MM_Var ) +
+ mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )
+ goto Exit;
+
+ mmvar->num_axis = mmaster.num_axis;
+ mmvar->num_designs = mmaster.num_designs;
+ mmvar->num_namedstyles = ~0U; /* Does not apply */
+ mmvar->axis = (FT_Var_Axis*)&mmvar[1];
+ /* Point to axes after MM_Var struct */
+ mmvar->namedstyle = NULL;
+
+ for ( i = 0 ; i < mmaster.num_axis; ++i )
+ {
+ mmvar->axis[i].name = mmaster.axis[i].name;
+ mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);
+ mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);
+ mmvar->axis[i].def = ( mmvar->axis[i].minimum +
+ mmvar->axis[i].maximum ) / 2;
+ /* Does not apply. But this value is in range */
+ mmvar->axis[i].strid = ~0U; /* Does not apply */
+ mmvar->axis[i].tag = ~0U; /* Does not apply */
+
+ if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );
+ else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );
+ else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );
+ }
+
+ if ( blend->num_designs == ( 1U << blend->num_axis ) )
+ {
+ mm_weights_unmap( blend->default_weight_vector,
+ axiscoords,
+ blend->num_axis );
+
+ for ( i = 0; i < mmaster.num_axis; ++i )
+ mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
+ axiscoords[i] );
+ }
+
+ *master = mmvar;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_MM_Blend( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ PS_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt n, m;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( blend && blend->num_axis == num_coords )
+ {
+ /* recompute the weight vector from the blend coordinates */
+ error = FT_Err_Ok;
+
+ for ( n = 0; n < blend->num_designs; n++ )
+ {
+ FT_Fixed result = 0x10000L; /* 1.0 fixed */
+
+
+ for ( m = 0; m < blend->num_axis; m++ )
+ {
+ FT_Fixed factor;
+
+
+ /* get current blend axis position */
+ factor = coords[m];
+ if ( factor < 0 )
+ factor = 0;
+ if ( factor > 0x10000L )
+ factor = 0x10000L;
+
+ if ( ( n & ( 1 << m ) ) == 0 )
+ factor = 0x10000L - factor;
+
+ result = FT_MulFix( result, factor );
+ }
+ blend->weight_vector[n] = result;
+ }
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_MM_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords )
+ {
+ PS_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt n, p;
+
+
+ error = FT_ERR( Invalid_Argument );
+ if ( blend && blend->num_axis == num_coords )
+ {
+ /* compute the blend coordinates through the blend design map */
+ FT_Fixed final_blends[T1_MAX_MM_DESIGNS];
+
+
+ for ( n = 0; n < blend->num_axis; n++ )
+ {
+ FT_Long design = coords[n];
+ FT_Fixed the_blend;
+ PS_DesignMap map = blend->design_map + n;
+ FT_Long* designs = map->design_points;
+ FT_Fixed* blends = map->blend_points;
+ FT_Int before = -1, after = -1;
+
+
+ for ( p = 0; p < (FT_UInt)map->num_points; p++ )
+ {
+ FT_Long p_design = designs[p];
+
+
+ /* exact match? */
+ if ( design == p_design )
+ {
+ the_blend = blends[p];
+ goto Found;
+ }
+
+ if ( design < p_design )
+ {
+ after = p;
+ break;
+ }
+
+ before = p;
+ }
+
+ /* now interpolate if necessary */
+ if ( before < 0 )
+ the_blend = blends[0];
+
+ else if ( after < 0 )
+ the_blend = blends[map->num_points - 1];
+
+ else
+ the_blend = FT_MulDiv( design - designs[before],
+ blends [after] - blends [before],
+ designs[after] - designs[before] );
+
+ Found:
+ final_blends[n] = the_blend;
+ }
+
+ error = T1_Set_MM_Blend( face, num_coords, final_blends );
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Just a wrapper around T1_Set_MM_Design to support the different */
+ /* arguments needed by the GX var distortable fonts. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_Var_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Long lcoords[4]; /* maximum axis count is 4 */
+ FT_UInt i;
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+ if ( num_coords <= 4 && num_coords > 0 )
+ {
+ for ( i = 0; i < num_coords; ++i )
+ lcoords[i] = FIXED_TO_INT( coords[i] );
+ error = T1_Set_MM_Design( face, num_coords, lcoords );
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Done_Blend( T1_Face face )
+ {
+ FT_Memory memory = face->root.memory;
+ PS_Blend blend = face->blend;
+
+
+ if ( blend )
+ {
+ FT_UInt num_designs = blend->num_designs;
+ FT_UInt num_axis = blend->num_axis;
+ FT_UInt n;
+
+
+ /* release design pos table */
+ FT_FREE( blend->design_pos[0] );
+ for ( n = 1; n < num_designs; n++ )
+ blend->design_pos[n] = NULL;
+
+ /* release blend `private' and `font info' dictionaries */
+ FT_FREE( blend->privates[1] );
+ FT_FREE( blend->font_infos[1] );
+ FT_FREE( blend->bboxes[1] );
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ blend->privates [n] = NULL;
+ blend->font_infos[n] = NULL;
+ blend->bboxes [n] = NULL;
+ }
+
+ /* release weight vectors */
+ FT_FREE( blend->weight_vector );
+ blend->default_weight_vector = NULL;
+
+ /* release axis names */
+ for ( n = 0; n < num_axis; n++ )
+ FT_FREE( blend->axis_names[n] );
+
+ /* release design map */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ PS_DesignMap dmap = blend->design_map + n;
+
+
+ FT_FREE( dmap->design_points );
+ dmap->num_points = 0;
+ }
+
+ FT_FREE( face->blend );
+ }
+ }
+
+
+ static void
+ parse_blend_axis_types( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ FT_Int n, num_axis;
+ FT_Error error = FT_Err_Ok;
+ PS_Blend blend;
+ FT_Memory memory;
+
+
+ /* take an array of objects */
+ T1_ToTokenArray( &loader->parser, axis_tokens,
+ T1_MAX_MM_AXIS, &num_axis );
+ if ( num_axis < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n",
+ num_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* allocate blend if necessary */
+ error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
+ if ( error )
+ goto Exit;
+
+ blend = face->blend;
+ memory = face->root.memory;
+
+ /* each token is an immediate containing the name of the axis */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ T1_Token token = axis_tokens + n;
+ FT_Byte* name;
+ FT_PtrDist len;
+
+
+ /* skip first slash, if any */
+ if ( token->start[0] == '/' )
+ token->start++;
+
+ len = token->limit - token->start;
+ if ( len == 0 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) )
+ goto Exit;
+
+ name = (FT_Byte*)blend->axis_names[n];
+ FT_MEM_COPY( name, token->start, len );
+ name[len] = '\0';
+ }
+
+ Exit:
+ loader->parser.root.error = error;
+ }
+
+
+ static void
+ parse_blend_design_positions( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS];
+ FT_Int num_designs;
+ FT_Int num_axis;
+ T1_Parser parser = &loader->parser;
+
+ FT_Error error = FT_Err_Ok;
+ PS_Blend blend;
+
+
+ /* get the array of design tokens -- compute number of designs */
+ T1_ToTokenArray( parser, design_tokens,
+ T1_MAX_MM_DESIGNS, &num_designs );
+ if ( num_designs < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+ {
+ FT_ERROR(( "parse_blend_design_positions:"
+ " incorrect number of designs: %d\n",
+ num_designs ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ {
+ FT_Byte* old_cursor = parser->root.cursor;
+ FT_Byte* old_limit = parser->root.limit;
+ FT_Int n;
+
+
+ blend = face->blend;
+ num_axis = 0; /* make compiler happy */
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ T1_Token token;
+ FT_Int axis, n_axis;
+
+
+ /* read axis/coordinates tokens */
+ token = design_tokens + n;
+ parser->root.cursor = token->start;
+ parser->root.limit = token->limit;
+ T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );
+
+ if ( n == 0 )
+ {
+ if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_design_positions:"
+ " invalid number of axes: %d\n",
+ n_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ num_axis = n_axis;
+ error = t1_allocate_blend( face, num_designs, num_axis );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+ }
+ else if ( n_axis != num_axis )
+ {
+ FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now read each axis token into the design position */
+ for ( axis = 0; axis < n_axis; axis++ )
+ {
+ T1_Token token2 = axis_tokens + axis;
+
+
+ parser->root.cursor = token2->start;
+ parser->root.limit = token2->limit;
+ blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
+ }
+ }
+
+ loader->parser.root.cursor = old_cursor;
+ loader->parser.root.limit = old_limit;
+ }
+
+ Exit:
+ loader->parser.root.error = error;
+ }
+
+
+ static void
+ parse_blend_design_map( T1_Face face,
+ T1_Loader loader )
+ {
+ FT_Error error = FT_Err_Ok;
+ T1_Parser parser = &loader->parser;
+ PS_Blend blend;
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ FT_Int n, num_axis;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+ FT_Memory memory = face->root.memory;
+
+
+ T1_ToTokenArray( parser, axis_tokens,
+ T1_MAX_MM_AXIS, &num_axis );
+ if ( num_axis < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
+ num_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ old_cursor = parser->root.cursor;
+ old_limit = parser->root.limit;
+
+ error = t1_allocate_blend( face, 0, num_axis );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+
+ /* now read each axis design map */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ PS_DesignMap map = blend->design_map + n;
+ T1_Token axis_token;
+ T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS];
+ FT_Int p, num_points;
+
+
+ axis_token = axis_tokens + n;
+
+ parser->root.cursor = axis_token->start;
+ parser->root.limit = axis_token->limit;
+ T1_ToTokenArray( parser, point_tokens,
+ T1_MAX_MM_MAP_POINTS, &num_points );
+
+ if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
+ {
+ FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* allocate design map data */
+ if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
+ goto Exit;
+ map->blend_points = map->design_points + num_points;
+ map->num_points = (FT_Byte)num_points;
+
+ for ( p = 0; p < num_points; p++ )
+ {
+ T1_Token point_token;
+
+
+ point_token = point_tokens + p;
+
+ /* don't include delimiting brackets */
+ parser->root.cursor = point_token->start + 1;
+ parser->root.limit = point_token->limit - 1;
+
+ map->design_points[p] = T1_ToInt( parser );
+ map->blend_points [p] = T1_ToFixed( parser, 0 );
+ }
+ }
+
+ parser->root.cursor = old_cursor;
+ parser->root.limit = old_limit;
+
+ Exit:
+ parser->root.error = error;
+ }
+
+
+ static void
+ parse_weight_vector( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS];
+ FT_Int num_designs;
+ FT_Error error = FT_Err_Ok;
+ T1_Parser parser = &loader->parser;
+ PS_Blend blend = face->blend;
+ T1_Token token;
+ FT_Int n;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+
+
+ T1_ToTokenArray( parser, design_tokens,
+ T1_MAX_MM_DESIGNS, &num_designs );
+ if ( num_designs < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+ {
+ FT_ERROR(( "parse_weight_vector:"
+ " incorrect number of designs: %d\n",
+ num_designs ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( !blend || !blend->num_designs )
+ {
+ error = t1_allocate_blend( face, num_designs, 0 );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+ }
+ else if ( blend->num_designs != (FT_UInt)num_designs )
+ {
+ FT_ERROR(( "parse_weight_vector:"
+ " /BlendDesignPosition and /WeightVector have\n"
+ " "
+ " different number of elements\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ old_cursor = parser->root.cursor;
+ old_limit = parser->root.limit;
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ token = design_tokens + n;
+ parser->root.cursor = token->start;
+ parser->root.limit = token->limit;
+
+ blend->default_weight_vector[n] =
+ blend->weight_vector[n] = T1_ToFixed( parser, 0 );
+ }
+
+ parser->root.cursor = old_cursor;
+ parser->root.limit = old_limit;
+
+ Exit:
+ parser->root.error = error;
+ }
+
+
+ /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */
+ /* we're only interested in the number of array elements */
+ static void
+ parse_buildchar( T1_Face face,
+ T1_Loader loader )
+ {
+ face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );
+
+ return;
+ }
+
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 SYMBOL PARSING *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ t1_load_keyword( T1_Face face,
+ T1_Loader loader,
+ const T1_Field field )
+ {
+ FT_Error error;
+ void* dummy_object;
+ void** objects;
+ FT_UInt max_objects;
+ PS_Blend blend = face->blend;
+
+
+ if ( blend && blend->num_designs == 0 )
+ blend = NULL;
+
+ /* if the keyword has a dedicated callback, call it */
+ if ( field->type == T1_FIELD_TYPE_CALLBACK )
+ {
+ field->reader( (FT_Face)face, loader );
+ error = loader->parser.root.error;
+ goto Exit;
+ }
+
+ /* now, the keyword is either a simple field, or a table of fields; */
+ /* we are now going to take care of it */
+ switch ( field->location )
+ {
+ case T1_FIELD_LOCATION_FONT_INFO:
+ dummy_object = &face->type1.font_info;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->font_infos;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_FONT_EXTRA:
+ dummy_object = &face->type1.font_extra;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+ case T1_FIELD_LOCATION_PRIVATE:
+ dummy_object = &face->type1.private_dict;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->privates;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_BBOX:
+ dummy_object = &face->type1.font_bbox;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->bboxes;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_LOADER:
+ dummy_object = loader;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+ case T1_FIELD_LOCATION_FACE:
+ dummy_object = face;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ case T1_FIELD_LOCATION_BLEND:
+ dummy_object = face->blend;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+#endif
+
+ default:
+ dummy_object = &face->type1;
+ objects = &dummy_object;
+ max_objects = 0;
+ }
+
+ if ( *objects )
+ {
+ if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+ field->type == T1_FIELD_TYPE_FIXED_ARRAY )
+ error = T1_Load_Field_Table( &loader->parser, field,
+ objects, max_objects, 0 );
+ else
+ error = T1_Load_Field( &loader->parser, field,
+ objects, max_objects, 0 );
+ }
+ else
+ {
+ FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'"
+ " which is not valid at this point\n"
+ " (probably due to missing keywords)\n",
+ field->ident ));
+ error = FT_Err_Ok;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ parse_private( T1_Face face,
+ T1_Loader loader )
+ {
+ FT_UNUSED( face );
+
+ loader->keywords_encountered |= T1_PRIVATE;
+ }
+
+
+ static int
+ read_binary_data( T1_Parser parser,
+ FT_Long* size,
+ FT_Byte** base,
+ FT_Bool incremental )
+ {
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+
+
+ /* the binary data has one of the following formats */
+ /* */
+ /* `size' [white*] RD white ....... ND */
+ /* `size' [white*] -| white ....... |- */
+ /* */
+
+ T1_Skip_Spaces( parser );
+
+ cur = parser->root.cursor;
+
+ if ( cur < limit && ft_isdigit( *cur ) )
+ {
+ FT_Long s = T1_ToInt( parser );
+
+
+ T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */
+
+ /* there is only one whitespace char after the */
+ /* `RD' or `-|' token */
+ *base = parser->root.cursor + 1;
+
+ if ( s >= 0 && s < limit - *base )
+ {
+ parser->root.cursor += s + 1;
+ *size = s;
+ return !parser->root.error;
+ }
+ }
+
+ if( !incremental )
+ {
+ FT_ERROR(( "read_binary_data: invalid size field\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ }
+
+ return 0;
+ }
+
+
+ /* We now define the routines to handle the `/Encoding', `/Subrs', */
+ /* and `/CharStrings' dictionaries. */
+
+ static void
+ t1_parse_font_matrix( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Matrix* matrix = &face->type1.font_matrix;
+ FT_Vector* offset = &face->type1.font_offset;
+ FT_Face root = (FT_Face)&face->root;
+ FT_Fixed temp[6];
+ FT_Fixed temp_scale;
+ FT_Int result;
+
+
+ result = T1_ToFixedArray( parser, 6, temp, 3 );
+
+ if ( result < 0 )
+ {
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ temp_scale = FT_ABS( temp[3] );
+
+ if ( temp_scale == 0 )
+ {
+ FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ /* Set Units per EM based on FontMatrix values. We set the value to */
+ /* 1000 / temp_scale, because temp_scale was already multiplied by */
+ /* 1000 (in t1_tofixed, from psobjs.c). */
+
+ root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+ /* we need to scale the values by 1.0/temp_scale */
+ if ( temp_scale != 0x10000L )
+ {
+ temp[0] = FT_DivFix( temp[0], temp_scale );
+ temp[1] = FT_DivFix( temp[1], temp_scale );
+ temp[2] = FT_DivFix( temp[2], temp_scale );
+ temp[4] = FT_DivFix( temp[4], temp_scale );
+ temp[5] = FT_DivFix( temp[5], temp_scale );
+ temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
+ }
+
+ matrix->xx = temp[0];
+ matrix->yx = temp[1];
+ matrix->xy = temp[2];
+ matrix->yy = temp[3];
+
+ /* note that the offsets must be expressed in integer font units */
+ offset->x = temp[4] >> 16;
+ offset->y = temp[5] >> 16;
+ }
+
+
+ static void
+ parse_encoding( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ T1_Skip_Spaces( parser );
+ cur = parser->root.cursor;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "parse_encoding: out of bounds\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ /* if we have a number or `[', the encoding is an array, */
+ /* and we must load it now */
+ if ( ft_isdigit( *cur ) || *cur == '[' )
+ {
+ T1_Encoding encode = &face->type1.encoding;
+ FT_Int count, n;
+ PS_Table char_table = &loader->encoding_table;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+ FT_Bool only_immediates = 0;
+
+
+ /* read the number of entries in the encoding; should be 256 */
+ if ( *cur == '[' )
+ {
+ count = 256;
+ only_immediates = 1;
+ parser->root.cursor++;
+ }
+ else
+ count = (FT_Int)T1_ToInt( parser );
+
+ T1_Skip_Spaces( parser );
+ if ( parser->root.cursor >= limit )
+ return;
+
+ /* we use a T1_Table to store our charnames */
+ loader->num_chars = encode->num_chars = count;
+ if ( FT_NEW_ARRAY( encode->char_index, count ) ||
+ FT_NEW_ARRAY( encode->char_name, count ) ||
+ FT_SET_ERROR( psaux->ps_table_funcs->init(
+ char_table, count, memory ) ) )
+ {
+ parser->root.error = error;
+ return;
+ }
+
+ /* We need to `zero' out encoding_table.elements */
+ for ( n = 0; n < count; n++ )
+ {
+ char* notdef = (char *)".notdef";
+
+
+ T1_Add_Table( char_table, n, notdef, 8 );
+ }
+
+ /* Now we need to read records of the form */
+ /* */
+ /* ... charcode /charname ... */
+ /* */
+ /* for each entry in our table. */
+ /* */
+ /* We simply look for a number followed by an immediate */
+ /* name. Note that this ignores correctly the sequence */
+ /* that is often seen in type1 fonts: */
+ /* */
+ /* 0 1 255 { 1 index exch /.notdef put } for dup */
+ /* */
+ /* used to clean the encoding array before anything else. */
+ /* */
+ /* Alternatively, if the array is directly given as */
+ /* */
+ /* /Encoding [ ... ] */
+ /* */
+ /* we only read immediates. */
+
+ n = 0;
+ T1_Skip_Spaces( parser );
+
+ while ( parser->root.cursor < limit )
+ {
+ cur = parser->root.cursor;
+
+ /* we stop when we encounter a `def' or `]' */
+ if ( *cur == 'd' && cur + 3 < limit )
+ {
+ if ( cur[1] == 'e' &&
+ cur[2] == 'f' &&
+ IS_PS_DELIM( cur[3] ) )
+ {
+ FT_TRACE6(( "encoding end\n" ));
+ cur += 3;
+ break;
+ }
+ }
+ if ( *cur == ']' )
+ {
+ FT_TRACE6(( "encoding end\n" ));
+ cur++;
+ break;
+ }
+
+ /* check whether we've found an entry */
+ if ( ft_isdigit( *cur ) || only_immediates )
+ {
+ FT_Int charcode;
+
+
+ if ( only_immediates )
+ charcode = n;
+ else
+ {
+ charcode = (FT_Int)T1_ToInt( parser );
+ T1_Skip_Spaces( parser );
+ }
+
+ cur = parser->root.cursor;
+
+ if ( cur + 2 < limit && *cur == '/' && n < count )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+
+ parser->root.cursor = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.cursor >= limit )
+ return;
+ if ( parser->root.error )
+ return;
+
+ len = parser->root.cursor - cur;
+
+ parser->root.error = T1_Add_Table( char_table, charcode,
+ cur, len + 1 );
+ if ( parser->root.error )
+ return;
+ char_table->elements[charcode][len] = '\0';
+
+ n++;
+ }
+ else if ( only_immediates )
+ {
+ /* Since the current position is not updated for */
+ /* immediates-only mode we would get an infinite loop if */
+ /* we don't do anything here. */
+ /* */
+ /* This encoding array is not valid according to the type1 */
+ /* specification (it might be an encoding for a CID type1 */
+ /* font, however), so we conclude that this font is NOT a */
+ /* type1 font. */
+ parser->root.error = FT_THROW( Unknown_File_Format );
+ return;
+ }
+ }
+ else
+ {
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ return;
+ }
+
+ T1_Skip_Spaces( parser );
+ }
+
+ face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
+ parser->root.cursor = cur;
+ }
+
+ /* Otherwise, we should have either `StandardEncoding', */
+ /* `ExpertEncoding', or `ISOLatin1Encoding' */
+ else
+ {
+ if ( cur + 17 < limit &&
+ ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
+
+ else if ( cur + 15 < limit &&
+ ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
+
+ else if ( cur + 18 < limit &&
+ ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
+
+ else
+ parser->root.error = FT_ERR( Ignore );
+ }
+ }
+
+
+ static void
+ parse_subrs( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ PS_Table table = &loader->subrs;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+ FT_Int num_subrs;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ T1_Skip_Spaces( parser );
+
+ /* test for empty array */
+ if ( parser->root.cursor < parser->root.limit &&
+ *parser->root.cursor == '[' )
+ {
+ T1_Skip_PS_Token( parser );
+ T1_Skip_Spaces ( parser );
+ if ( parser->root.cursor >= parser->root.limit ||
+ *parser->root.cursor != ']' )
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ num_subrs = (FT_Int)T1_ToInt( parser );
+
+ /* position the parser right before the `dup' of the first subr */
+ T1_Skip_PS_Token( parser ); /* `array' */
+ if ( parser->root.error )
+ return;
+ T1_Skip_Spaces( parser );
+
+ /* initialize subrs array -- with synthetic fonts it is possible */
+ /* we get here twice */
+ if ( !loader->num_subrs )
+ {
+ error = psaux->ps_table_funcs->init( table, num_subrs, memory );
+ if ( error )
+ goto Fail;
+ }
+
+ /* the format is simple: */
+ /* */
+ /* `index' + binary data */
+ /* */
+ for (;;)
+ {
+ FT_Long idx, size;
+ FT_Byte* base;
+
+
+ /* If we are out of data, or if the next token isn't `dup', */
+ /* we are done. */
+ if ( parser->root.cursor + 4 >= parser->root.limit ||
+ ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
+ break;
+
+ T1_Skip_PS_Token( parser ); /* `dup' */
+
+ idx = T1_ToInt( parser );
+
+ if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+ return;
+
+ /* The binary string is followed by one token, e.g. `NP' */
+ /* (bound to `noaccess put') or by two separate tokens: */
+ /* `noaccess' & `put'. We position the parser right */
+ /* before the next `dup', if any. */
+ T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */
+ if ( parser->root.error )
+ return;
+ T1_Skip_Spaces ( parser );
+
+ if ( parser->root.cursor + 4 < parser->root.limit &&
+ ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
+ {
+ T1_Skip_PS_Token( parser ); /* skip `put' */
+ T1_Skip_Spaces ( parser );
+ }
+
+ /* with synthetic fonts it is possible we get here twice */
+ if ( loader->num_subrs )
+ continue;
+
+ /* some fonts use a value of -1 for lenIV to indicate that */
+ /* the charstrings are unencoded */
+ /* */
+ /* thanks to Tom Kacvinsky for pointing this out */
+ /* */
+ if ( face->type1.private_dict.lenIV >= 0 )
+ {
+ FT_Byte* temp;
+
+
+ /* some fonts define empty subr records -- this is not totally */
+ /* compliant to the specification (which says they should at */
+ /* least contain a `return'), but we support them anyway */
+ if ( size < face->type1.private_dict.lenIV )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* t1_decrypt() shouldn't write to base -- make temporary copy */
+ if ( FT_ALLOC( temp, size ) )
+ goto Fail;
+ FT_MEM_COPY( temp, base, size );
+ psaux->t1_decrypt( temp, size, 4330 );
+ size -= face->type1.private_dict.lenIV;
+ error = T1_Add_Table( table, (FT_Int)idx,
+ temp + face->type1.private_dict.lenIV, size );
+ FT_FREE( temp );
+ }
+ else
+ error = T1_Add_Table( table, (FT_Int)idx, base, size );
+ if ( error )
+ goto Fail;
+ }
+
+ if ( !loader->num_subrs )
+ loader->num_subrs = num_subrs;
+
+ return;
+
+ Fail:
+ parser->root.error = error;
+ }
+
+
+#define TABLE_EXTEND 5
+
+
+ static void
+ parse_charstrings( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ PS_Table code_table = &loader->charstrings;
+ PS_Table name_table = &loader->glyph_names;
+ PS_Table swap_table = &loader->swap_table;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+ FT_Int n, num_glyphs;
+ FT_UInt notdef_index = 0;
+ FT_Byte notdef_found = 0;
+
+
+ num_glyphs = (FT_Int)T1_ToInt( parser );
+ if ( num_glyphs < 0 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* some fonts like Optima-Oblique not only define the /CharStrings */
+ /* array but access it also */
+ if ( num_glyphs == 0 || parser->root.error )
+ return;
+
+ /* initialize tables, leaving space for addition of .notdef, */
+ /* if necessary, and a few other glyphs to handle buggy */
+ /* fonts which have more glyphs than specified. */
+
+ /* for some non-standard fonts like `Optima' which provides */
+ /* different outlines depending on the resolution it is */
+ /* possible to get here twice */
+ if ( !loader->num_glyphs )
+ {
+ error = psaux->ps_table_funcs->init(
+ code_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+ if ( error )
+ goto Fail;
+
+ error = psaux->ps_table_funcs->init(
+ name_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+ if ( error )
+ goto Fail;
+
+ /* Initialize table for swapping index notdef_index and */
+ /* index 0 names and codes (if necessary). */
+
+ error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+ if ( error )
+ goto Fail;
+ }
+
+ n = 0;
+
+ for (;;)
+ {
+ FT_Long size;
+ FT_Byte* base;
+
+
+ /* the format is simple: */
+ /* `/glyphname' + binary data */
+
+ T1_Skip_Spaces( parser );
+
+ cur = parser->root.cursor;
+ if ( cur >= limit )
+ break;
+
+ /* we stop when we find a `def' or `end' keyword */
+ if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )
+ {
+ if ( cur[0] == 'd' &&
+ cur[1] == 'e' &&
+ cur[2] == 'f' )
+ {
+ /* There are fonts which have this: */
+ /* */
+ /* /CharStrings 118 dict def */
+ /* Private begin */
+ /* CharStrings begin */
+ /* ... */
+ /* */
+ /* To catch this we ignore `def' if */
+ /* no charstring has actually been */
+ /* seen. */
+ if ( n )
+ break;
+ }
+
+ if ( cur[0] == 'e' &&
+ cur[1] == 'n' &&
+ cur[2] == 'd' )
+ break;
+ }
+
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ return;
+
+ if ( *cur == '/' )
+ {
+ FT_PtrDist len;
+
+
+ if ( cur + 1 >= limit )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ cur++; /* skip `/' */
+ len = parser->root.cursor - cur;
+
+ if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+ return;
+ /* xhl: Add boundary check here. Fix the bug reported by ifilter. */
+ /* TESTDOC: bug# 0018509, 45.pdf. */
+ if (base + size >= limit) {
+ error = T1_Err_Invalid_File_Format;
+ goto Fail;
+ }
+ /* for some non-standard fonts like `Optima' which provides */
+ /* different outlines depending on the resolution it is */
+ /* possible to get here twice */
+ if ( loader->num_glyphs )
+ continue;
+
+ error = T1_Add_Table( name_table, n, cur, len + 1 );
+ if ( error )
+ goto Fail;
+
+ /* add a trailing zero to the name table */
+ name_table->elements[n][len] = '\0';
+
+ /* record index of /.notdef */
+ if ( *cur == '.' &&
+ ft_strcmp( ".notdef",
+ (const char*)(name_table->elements[n]) ) == 0 )
+ {
+ notdef_index = n;
+ notdef_found = 1;
+ }
+
+ if ( face->type1.private_dict.lenIV >= 0 &&
+ n < num_glyphs + TABLE_EXTEND )
+ {
+ FT_Byte* temp;
+
+
+ if ( size <= face->type1.private_dict.lenIV )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* t1_decrypt() shouldn't write to base -- make temporary copy */
+ if ( FT_ALLOC( temp, size ) )
+ goto Fail;
+ FT_MEM_COPY( temp, base, size );
+ psaux->t1_decrypt( temp, size, 4330 );
+ size -= face->type1.private_dict.lenIV;
+ error = T1_Add_Table( code_table, n,
+ temp + face->type1.private_dict.lenIV, size );
+ FT_FREE( temp );
+ }
+ else
+ error = T1_Add_Table( code_table, n, base, size );
+ if ( error )
+ goto Fail;
+
+ n++;
+ }
+ }
+
+ loader->num_glyphs = n;
+
+ /* if /.notdef is found but does not occupy index 0, do our magic. */
+ if ( notdef_found &&
+ ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) )
+ {
+ /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */
+ /* name and code entries to swap_table. Then place notdef_index */
+ /* name and code entries into swap_table. Then swap name and code */
+ /* entries at indices notdef_index and 0 using values stored in */
+ /* swap_table. */
+
+ /* Index 0 name */
+ error = T1_Add_Table( swap_table, 0,
+ name_table->elements[0],
+ name_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ /* Index 0 code */
+ error = T1_Add_Table( swap_table, 1,
+ code_table->elements[0],
+ code_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ /* Index notdef_index name */
+ error = T1_Add_Table( swap_table, 2,
+ name_table->elements[notdef_index],
+ name_table->lengths [notdef_index] );
+ if ( error )
+ goto Fail;
+
+ /* Index notdef_index code */
+ error = T1_Add_Table( swap_table, 3,
+ code_table->elements[notdef_index],
+ code_table->lengths [notdef_index] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, notdef_index,
+ swap_table->elements[0],
+ swap_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, notdef_index,
+ swap_table->elements[1],
+ swap_table->lengths [1] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, 0,
+ swap_table->elements[2],
+ swap_table->lengths [2] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, 0,
+ swap_table->elements[3],
+ swap_table->lengths [3] );
+ if ( error )
+ goto Fail;
+
+ }
+ else if ( !notdef_found )
+ {
+ /* notdef_index is already 0, or /.notdef is undefined in */
+ /* charstrings dictionary. Worry about /.notdef undefined. */
+ /* We take index 0 and add it to the end of the table(s) */
+ /* and add our own /.notdef glyph to index 0. */
+
+ /* 0 333 hsbw endchar */
+ FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };
+ char* notdef_name = (char *)".notdef";
+
+
+ error = T1_Add_Table( swap_table, 0,
+ name_table->elements[0],
+ name_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( swap_table, 1,
+ code_table->elements[0],
+ code_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, 0, notdef_name, 8 );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );
+
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, n,
+ swap_table->elements[0],
+ swap_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, n,
+ swap_table->elements[1],
+ swap_table->lengths [1] );
+ if ( error )
+ goto Fail;
+
+ /* we added a glyph. */
+ loader->num_glyphs += 1;
+ }
+
+ return;
+
+ Fail:
+ parser->root.error = error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the token field static variables. This is a set of */
+ /* T1_FieldRec variables. */
+ /* */
+ /*************************************************************************/
+
+
+ static
+ const T1_FieldRec t1_keywords[] =
+ {
+
+#include "t1tokens.h"
+
+ /* now add the special functions... */
+ T1_FIELD_CALLBACK( "FontMatrix", t1_parse_font_matrix,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "Encoding", parse_encoding,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "Subrs", parse_subrs,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_CALLBACK( "CharStrings", parse_charstrings,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_CALLBACK( "Private", parse_private,
+ T1_FIELD_DICT_FONTDICT )
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar,
+ T1_FIELD_DICT_PRIVATE )
+#endif
+
+ { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#define T1_FIELD_COUNT \
+ ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
+
+
+ static FT_Error
+ parse_dict( T1_Face face,
+ T1_Loader loader,
+ FT_Byte* base,
+ FT_Long size )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Byte *limit, *start_binary = NULL;
+ FT_Bool have_integer = 0;
+
+
+ parser->root.cursor = base;
+ parser->root.limit = base + size;
+ parser->root.error = FT_Err_Ok;
+
+ limit = parser->root.limit;
+
+ T1_Skip_Spaces( parser );
+
+ while ( parser->root.cursor < limit )
+ {
+ FT_Byte* cur;
+
+
+ cur = parser->root.cursor;
+
+ /* look for `eexec' */
+ if ( IS_PS_TOKEN( cur, limit, "eexec" ) )
+ break;
+
+ /* look for `closefile' which ends the eexec section */
+ else if ( IS_PS_TOKEN( cur, limit, "closefile" ) )
+ break;
+
+ /* in a synthetic font the base font starts after a */
+ /* `FontDictionary' token that is placed after a Private dict */
+ else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) )
+ {
+ if ( loader->keywords_encountered & T1_PRIVATE )
+ loader->keywords_encountered |=
+ T1_FONTDIR_AFTER_PRIVATE;
+ parser->root.cursor += 13;
+ }
+
+ /* check whether we have an integer */
+ else if ( ft_isdigit( *cur ) )
+ {
+ start_binary = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+ have_integer = 1;
+ }
+
+ /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
+ /* since those tokens are handled by parse_subrs and */
+ /* parse_charstrings */
+ else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
+ have_integer )
+ {
+ FT_Long s;
+ FT_Byte* b;
+
+
+ parser->root.cursor = start_binary;
+ if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+ return FT_THROW( Invalid_File_Format );
+ have_integer = 0;
+ }
+
+ else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
+ have_integer )
+ {
+ FT_Long s;
+ FT_Byte* b;
+
+
+ parser->root.cursor = start_binary;
+ if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+ return FT_THROW( Invalid_File_Format );
+ have_integer = 0;
+ }
+
+ /* look for immediates */
+ else if ( *cur == '/' && cur + 2 < limit )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+
+ parser->root.cursor = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+
+ len = parser->root.cursor - cur;
+
+ if ( len > 0 && len < 22 && parser->root.cursor < limit )
+ {
+ /* now compare the immediate name to the keyword table */
+ T1_Field keyword = (T1_Field)t1_keywords;
+
+
+ for (;;)
+ {
+ FT_Byte* name;
+
+
+ name = (FT_Byte*)keyword->ident;
+ if ( !name )
+ break;
+
+ if ( cur[0] == name[0] &&
+ len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
+ ft_memcmp( cur, name, len ) == 0 )
+ {
+ /* We found it -- run the parsing callback! */
+ /* We record every instance of every field */
+ /* (until we reach the base font of a */
+ /* synthetic font) to deal adequately with */
+ /* multiple master fonts; this is also */
+ /* necessary because later PostScript */
+ /* definitions override earlier ones. */
+
+ /* Once we encounter `FontDirectory' after */
+ /* `/Private', we know that this is a synthetic */
+ /* font; except for `/CharStrings' we are not */
+ /* interested in anything that follows this */
+ /* `FontDirectory'. */
+
+ /* MM fonts have more than one /Private token at */
+ /* the top level; let's hope that all the junk */
+ /* that follows the first /Private token is not */
+ /* interesting to us. */
+
+ /* According to Adobe Tech Note #5175 (CID-Keyed */
+ /* Font Installation for ATM Software) a `begin' */
+ /* must be followed by exactly one `end', and */
+ /* `begin' -- `end' pairs must be accurately */
+ /* paired. We could use this to distinguish */
+ /* between the global Private and the Private */
+ /* dict that is a member of the Blend dict. */
+
+ const FT_UInt dict =
+ ( loader->keywords_encountered & T1_PRIVATE )
+ ? T1_FIELD_DICT_PRIVATE
+ : T1_FIELD_DICT_FONTDICT;
+
+ if ( !( dict & keyword->dict ) )
+ {
+ FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
+ " since it is in the wrong dictionary\n",
+ keyword->ident ));
+ break;
+ }
+
+ if ( !( loader->keywords_encountered &
+ T1_FONTDIR_AFTER_PRIVATE ) ||
+ ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
+ {
+ parser->root.error = t1_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error != FT_Err_Ok )
+ {
+ if ( FT_ERR_EQ( parser->root.error, Ignore ) )
+ parser->root.error = FT_Err_Ok;
+ else
+ return parser->root.error;
+ }
+ }
+ break;
+ }
+
+ keyword++;
+ }
+ }
+
+ have_integer = 0;
+ }
+ else
+ {
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+ have_integer = 0;
+ }
+
+ T1_Skip_Spaces( parser );
+ }
+
+ Exit:
+ return parser->root.error;
+ }
+
+
+ static void
+ t1_init_loader( T1_Loader loader,
+ T1_Face face )
+ {
+ FT_UNUSED( face );
+
+ FT_MEM_ZERO( loader, sizeof ( *loader ) );
+ loader->num_glyphs = 0;
+ loader->num_chars = 0;
+
+ /* initialize the tables -- simply set their `init' field to 0 */
+ loader->encoding_table.init = 0;
+ loader->charstrings.init = 0;
+ loader->glyph_names.init = 0;
+ loader->subrs.init = 0;
+ loader->swap_table.init = 0;
+ loader->fontdata = 0;
+ loader->keywords_encountered = 0;
+ }
+
+
+ static void
+ t1_done_loader( T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+
+
+ /* finalize tables */
+ T1_Release_Table( &loader->encoding_table );
+ T1_Release_Table( &loader->charstrings );
+ T1_Release_Table( &loader->glyph_names );
+ T1_Release_Table( &loader->swap_table );
+ T1_Release_Table( &loader->subrs );
+
+ /* finalize parser */
+ T1_Finalize_Parser( parser );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Open_Face( T1_Face face )
+ {
+ T1_LoaderRec loader;
+ T1_Parser parser;
+ T1_Font type1 = &face->type1;
+ PS_Private priv = &type1->private_dict;
+ FT_Error error;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ t1_init_loader( &loader, face );
+
+ /* default values */
+ face->ndv_idx = -1;
+ face->cdv_idx = -1;
+ face->len_buildchar = 0;
+
+ priv->blue_shift = 7;
+ priv->blue_fuzz = 1;
+ priv->lenIV = 4;
+ priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+ priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+ parser = &loader.parser;
+ error = T1_New_Parser( parser,
+ face->root.stream,
+ face->root.memory,
+ psaux );
+ if ( error )
+ goto Exit;
+
+ error = parse_dict( face, &loader,
+ parser->base_dict, parser->base_len );
+ if ( error )
+ goto Exit;
+
+ error = T1_Get_Private_Dict( parser, psaux );
+ if ( error )
+ goto Exit;
+
+ error = parse_dict( face, &loader,
+ parser->private_dict, parser->private_len );
+ if ( error )
+ goto Exit;
+
+ /* ensure even-ness of `num_blue_values' */
+ priv->num_blue_values &= ~1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+ if ( face->blend &&
+ face->blend->num_default_design_vector != 0 &&
+ face->blend->num_default_design_vector != face->blend->num_axis )
+ {
+ /* we don't use it currently so just warn, reset, and ignore */
+ FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries "
+ "while there are %u axes.\n",
+ face->blend->num_default_design_vector,
+ face->blend->num_axis ));
+
+ face->blend->num_default_design_vector = 0;
+ }
+
+ /* the following can happen for MM instances; we then treat the */
+ /* font as a normal PS font */
+ if ( face->blend &&
+ ( !face->blend->num_designs || !face->blend->num_axis ) )
+ T1_Done_Blend( face );
+
+ /* another safety check */
+ if ( face->blend )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0; i < face->blend->num_axis; i++ )
+ if ( !face->blend->design_map[i].num_points )
+ {
+ T1_Done_Blend( face );
+ break;
+ }
+ }
+
+ if ( face->blend )
+ {
+ if ( face->len_buildchar > 0 )
+ {
+ FT_Memory memory = face->root.memory;
+
+
+ if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )
+ {
+ FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" ));
+ face->len_buildchar = 0;
+ goto Exit;
+ }
+ }
+ }
+ else
+ face->len_buildchar = 0;
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+ /* now, propagate the subrs, charstrings, and glyphnames tables */
+ /* to the Type1 data */
+ type1->num_glyphs = loader.num_glyphs;
+
+ if ( loader.subrs.init )
+ {
+ loader.subrs.init = 0;
+ type1->num_subrs = loader.num_subrs;
+ type1->subrs_block = loader.subrs.block;
+ type1->subrs = loader.subrs.elements;
+ type1->subrs_len = loader.subrs.lengths;
+ }
+
+ if ( !IS_INCREMENTAL )
+ if ( !loader.charstrings.init )
+ {
+ FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ loader.charstrings.init = 0;
+ type1->charstrings_block = loader.charstrings.block;
+ type1->charstrings = loader.charstrings.elements;
+ type1->charstrings_len = loader.charstrings.lengths;
+
+ /* we copy the glyph names `block' and `elements' fields; */
+ /* the `lengths' field must be released later */
+ type1->glyph_names_block = loader.glyph_names.block;
+ type1->glyph_names = (FT_String**)loader.glyph_names.elements;
+ loader.glyph_names.block = 0;
+ loader.glyph_names.elements = 0;
+
+ /* we must now build type1.encoding when we have a custom array */
+ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
+ {
+ FT_Int charcode, idx, min_char, max_char;
+ FT_Byte* char_name;
+ FT_Byte* glyph_name;
+
+
+ /* OK, we do the following: for each element in the encoding */
+ /* table, look up the index of the glyph having the same name */
+ /* the index is then stored in type1.encoding.char_index, and */
+ /* the name to type1.encoding.char_name */
+
+ min_char = 0;
+ max_char = 0;
+
+ charcode = 0;
+ for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
+ {
+ type1->encoding.char_index[charcode] = 0;
+ type1->encoding.char_name [charcode] = (char *)".notdef";
+
+ char_name = loader.encoding_table.elements[charcode];
+ if ( char_name )
+ for ( idx = 0; idx < type1->num_glyphs; idx++ )
+ {
+ glyph_name = (FT_Byte*)type1->glyph_names[idx];
+ if ( ft_strcmp( (const char*)char_name,
+ (const char*)glyph_name ) == 0 )
+ {
+ type1->encoding.char_index[charcode] = (FT_UShort)idx;
+ type1->encoding.char_name [charcode] = (char*)glyph_name;
+
+ /* Change min/max encoded char only if glyph name is */
+ /* not /.notdef */
+ if ( ft_strcmp( (const char*)".notdef",
+ (const char*)glyph_name ) != 0 )
+ {
+ if ( charcode < min_char )
+ min_char = charcode;
+ if ( charcode >= max_char )
+ max_char = charcode + 1;
+ }
+ break;
+ }
+ }
+ }
+
+ type1->encoding.code_first = min_char;
+ type1->encoding.code_last = max_char;
+ type1->encoding.num_chars = loader.num_chars;
+ }
+
+ Exit:
+ t1_done_loader( &loader );
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
new file mode 100644
index 0000000000..d01744c4cb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* t1load.h */
+/* */
+/* Type 1 font loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1LOAD_H__
+#define __T1LOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "t1parse.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct T1_Loader_
+ {
+ T1_ParserRec parser; /* parser used to read the stream */
+
+ FT_Int num_chars; /* number of characters in encoding */
+ PS_TableRec encoding_table; /* PS_Table used to store the */
+ /* encoding character names */
+
+ FT_Int num_glyphs;
+ PS_TableRec glyph_names;
+ PS_TableRec charstrings;
+ PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */
+
+ FT_Int num_subrs;
+ PS_TableRec subrs;
+ FT_Bool fontdata;
+
+ FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
+
+ } T1_LoaderRec, *T1_Loader;
+
+
+ /* treatment of some keywords differs depending on whether */
+ /* they precede or follow certain other keywords */
+
+#define T1_PRIVATE ( 1 << 0 )
+#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 )
+
+
+ FT_LOCAL( FT_Error )
+ T1_Open_Face( T1_Face face );
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Multi_Master( T1_Face face,
+ FT_Multi_Master* master );
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_MM_Var( T1_Face face,
+ FT_MM_Var* *master );
+
+ FT_LOCAL( FT_Error )
+ T1_Set_MM_Blend( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ T1_Set_MM_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_Var_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( void )
+ T1_Done_Blend( T1_Face face );
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+FT_END_HEADER
+
+#endif /* __T1LOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
new file mode 100644
index 0000000000..81b230381c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
@@ -0,0 +1,616 @@
+/***************************************************************************/
+/* */
+/* t1objs.c */
+/* */
+/* Type 1 objects manager (body). */
+/* */
+/* Copyright 1996-2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1objs
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /* note that we store the global hints in the size's "internal" root */
+ /* field */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ T1_Size_Get_Globals_Funcs( T1_Size size )
+ {
+ T1_Face face = (T1_Face)size->root.face;
+ PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0 ;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Size_Done( FT_Size t1size ) /* T1_Size */
+ {
+ T1_Size size = (T1_Size)t1size;
+
+
+ if ( size->root.internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = T1_Size_Get_Globals_Funcs( size );
+ if ( funcs )
+ funcs->destroy( (PSH_Globals)size->root.internal );
+
+ size->root.internal = 0;
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Size_Init( FT_Size t1size ) /* T1_Size */
+ {
+ T1_Size size = (T1_Size)t1size;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+ if ( funcs )
+ {
+ PSH_Globals globals;
+ T1_Face face = (T1_Face)size->root.face;
+
+
+ error = funcs->create( size->root.face->memory,
+ &face->type1.private_dict, &globals );
+ if ( !error )
+ size->root.internal = (FT_Size_Internal)(void*)globals;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Size_Request( FT_Size t1size, /* T1_Size */
+ FT_Size_Request req )
+ {
+ T1_Size size = (T1_Size)t1size;
+ PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+ FT_Request_Metrics( size->root.face, req );
+
+ if ( funcs )
+ funcs->set_scale( (PSH_Globals)size->root.internal,
+ size->root.metrics.x_scale,
+ size->root.metrics.y_scale,
+ 0, 0 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ T1_GlyphSlot_Done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_GlyphSlot_Init( FT_GlyphSlot slot )
+ {
+ T1_Face face;
+ PSHinter_Service pshinter;
+
+
+ face = (T1_Face)slot->face;
+ pshinter = (PSHinter_Service)face->pshinter;
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T1_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t1_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Face_Done */
+ /* */
+ /* <Description> */
+ /* The face object destructor. */
+ /* */
+ /* <Input> */
+ /* face :: A typeless pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ T1_Face_Done( FT_Face t1face ) /* T1_Face */
+ {
+ T1_Face face = (T1_Face)t1face;
+ FT_Memory memory;
+ T1_Font type1;
+
+
+ if ( !face )
+ return;
+
+ memory = face->root.memory;
+ type1 = &face->type1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ /* release multiple masters information */
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ if ( face->buildchar )
+ {
+ FT_FREE( face->buildchar );
+
+ face->buildchar = NULL;
+ face->len_buildchar = 0;
+ }
+
+ T1_Done_Blend( face );
+ face->blend = 0;
+#endif
+
+ /* release font info strings */
+ {
+ PS_FontInfo info = &type1->font_info;
+
+
+ FT_FREE( info->version );
+ FT_FREE( info->notice );
+ FT_FREE( info->full_name );
+ FT_FREE( info->family_name );
+ FT_FREE( info->weight );
+ }
+
+ /* release top dictionary */
+ FT_FREE( type1->charstrings_len );
+ FT_FREE( type1->charstrings );
+ FT_FREE( type1->glyph_names );
+
+ FT_FREE( type1->subrs );
+ FT_FREE( type1->subrs_len );
+
+ FT_FREE( type1->subrs_block );
+ FT_FREE( type1->charstrings_block );
+ FT_FREE( type1->glyph_names_block );
+
+ FT_FREE( type1->encoding.char_index );
+ FT_FREE( type1->encoding.char_name );
+ FT_FREE( type1->font_name );
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ /* release afm data if present */
+ if ( face->afm_data )
+ T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
+#endif
+
+ /* release unicode map, if any */
+#if 0
+ FT_FREE( face->unicode_map_rec.maps );
+ face->unicode_map_rec.num_maps = 0;
+ face->unicode_map = NULL;
+#endif
+
+ face->root.family_name = NULL;
+ face->root.style_name = NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Face_Init */
+ /* */
+ /* <Description> */
+ /* The face object constructor. */
+ /* */
+ /* <Input> */
+ /* stream :: input stream where to load font data. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The face record to build. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Face_Init( FT_Stream stream,
+ FT_Face t1face, /* T1_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ T1_Face face = (T1_Face)t1face;
+ FT_Error error;
+ FT_Service_PsCMaps psnames;
+ PSAux_Service psaux;
+ T1_Font type1 = &face->type1;
+ PS_FontInfo info = &type1->font_info;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+ FT_UNUSED( stream );
+
+
+ face->root.num_faces = 1;
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ face->psnames = psnames;
+
+ face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+ "psaux" );
+ psaux = (PSAux_Service)face->psaux;
+ if ( !psaux )
+ {
+ FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+ "pshinter" );
+
+ FT_TRACE2(( "Type 1 driver\n" ));
+
+ /* open the tokenizer; this will also check the font format */
+ error = T1_Open_Face( face );
+ if ( error )
+ goto Exit;
+
+ /* if we just wanted to check the format, leave successfully now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* check the face index */
+ if ( face_index > 0 )
+ {
+ FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* now load the font program into the face object */
+
+ /* initialize the face object fields */
+
+ /* set up root face fields */
+ {
+ FT_Face root = (FT_Face)&face->root;
+
+
+ root->num_glyphs = type1->num_glyphs;
+ root->face_index = 0;
+
+ root->face_flags = FT_FACE_FLAG_SCALABLE |
+ FT_FACE_FLAG_HORIZONTAL |
+ FT_FACE_FLAG_GLYPH_NAMES |
+ FT_FACE_FLAG_HINTER;
+
+ if ( info->is_fixed_pitch )
+ root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ if ( face->blend )
+ root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+
+ /* XXX: TODO -- add kerning with .afm support */
+
+
+ /* The following code to extract the family and the style is very */
+ /* simplistic and might get some things wrong. For a full-featured */
+ /* algorithm you might have a look at the whitepaper given at */
+ /* */
+ /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
+
+ /* get style name -- be careful, some broken fonts only */
+ /* have a `/FontName' dictionary entry! */
+ root->family_name = info->family_name;
+ root->style_name = NULL;
+
+ if ( root->family_name )
+ {
+ char* full = info->full_name;
+ char* family = root->family_name;
+
+
+ if ( full )
+ {
+ FT_Bool the_same = TRUE;
+
+
+ while ( *full )
+ {
+ if ( *full == *family )
+ {
+ family++;
+ full++;
+ }
+ else
+ {
+ if ( *full == ' ' || *full == '-' )
+ full++;
+ else if ( *family == ' ' || *family == '-' )
+ family++;
+ else
+ {
+ the_same = FALSE;
+
+ if ( !*family )
+ root->style_name = full;
+ break;
+ }
+ }
+ }
+
+ if ( the_same )
+ root->style_name = (char *)"Regular";
+ }
+ }
+ else
+ {
+ /* do we have a `/FontName'? */
+ if ( type1->font_name )
+ root->family_name = type1->font_name;
+ }
+
+ if ( !root->style_name )
+ {
+ if ( info->weight )
+ root->style_name = info->weight;
+ else
+ /* assume `Regular' style because we don't know better */
+ root->style_name = (char *)"Regular";
+ }
+
+ /* compute style flags */
+ root->style_flags = 0;
+ if ( info->italic_angle )
+ root->style_flags |= FT_STYLE_FLAG_ITALIC;
+ if ( info->weight )
+ {
+ if ( !ft_strcmp( info->weight, "Bold" ) ||
+ !ft_strcmp( info->weight, "Black" ) )
+ root->style_flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* no embedded bitmap support */
+ root->num_fixed_sizes = 0;
+ root->available_sizes = 0;
+
+ root->bbox.xMin = type1->font_bbox.xMin >> 16;
+ root->bbox.yMin = type1->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;
+ root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */
+ if ( !root->units_per_EM )
+ root->units_per_EM = 1000;
+
+ root->ascender = (FT_Short)( root->bbox.yMax );
+ root->descender = (FT_Short)( root->bbox.yMin );
+
+ root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
+ if ( root->height < root->ascender - root->descender )
+ root->height = (FT_Short)( root->ascender - root->descender );
+
+ /* now compute the maximum advance width */
+ root->max_advance_width =
+ (FT_Short)( root->bbox.xMax );
+ {
+ FT_Pos max_advance;
+
+
+ error = T1_Compute_Max_Advance( face, &max_advance );
+
+ /* in case of error, keep the standard width */
+ if ( !error )
+ root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );
+ else
+ error = FT_Err_Ok; /* clear error */
+ }
+
+ root->max_advance_height = root->height;
+
+ root->underline_position = (FT_Short)info->underline_position;
+ root->underline_thickness = (FT_Short)info->underline_thickness;
+ }
+
+ {
+ FT_Face root = &face->root;
+
+
+ if ( psnames )
+ {
+ FT_CharMapRec charmap;
+ T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes;
+ FT_CMap_Class clazz;
+
+
+ charmap.face = root;
+
+ /* first of all, try to synthesize a Unicode charmap */
+ charmap.platform_id = TT_PLATFORM_MICROSOFT;
+ charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+ charmap.encoding = FT_ENCODING_UNICODE;
+
+ error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
+ if ( error &&
+ FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+ goto Exit;
+ error = FT_Err_Ok;
+
+ /* now, generate an Adobe Standard encoding when appropriate */
+ charmap.platform_id = TT_PLATFORM_ADOBE;
+ clazz = NULL;
+
+ switch ( type1->encoding_type )
+ {
+ case T1_ENCODING_TYPE_STANDARD:
+ charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
+ charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+ clazz = cmap_classes->standard;
+ break;
+
+ case T1_ENCODING_TYPE_EXPERT:
+ charmap.encoding = FT_ENCODING_ADOBE_EXPERT;
+ charmap.encoding_id = TT_ADOBE_ID_EXPERT;
+ clazz = cmap_classes->expert;
+ break;
+
+ case T1_ENCODING_TYPE_ARRAY:
+ charmap.encoding = FT_ENCODING_ADOBE_CUSTOM;
+ charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
+ clazz = cmap_classes->custom;
+ break;
+
+ case T1_ENCODING_TYPE_ISOLATIN1:
+ charmap.encoding = FT_ENCODING_ADOBE_LATIN_1;
+ charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
+ clazz = cmap_classes->unicode;
+ break;
+
+ default:
+ ;
+ }
+
+ if ( clazz )
+ error = FT_CMap_New( clazz, NULL, &charmap, NULL );
+
+#if 0
+ /* Select default charmap */
+ if (root->num_charmaps)
+ root->charmap = root->charmaps[0];
+#endif
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Driver_Init */
+ /* */
+ /* <Description> */
+ /* Initializes a given Type 1 driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Driver_Init( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Driver_Done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given Type 1 driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target Type 1 driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ T1_Driver_Done( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
new file mode 100644
index 0000000000..338cfc257f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/* */
+/* t1objs.h */
+/* */
+/* Type 1 objects manager (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2006, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1OBJS_H__
+#define __T1OBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* The following structures must be defined by the hinter */
+ typedef struct T1_Size_Hints_ T1_Size_Hints;
+ typedef struct T1_Glyph_Hints_ T1_Glyph_Hints;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_Size */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 size object. */
+ /* */
+ typedef struct T1_SizeRec_* T1_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 glyph slot object. */
+ /* */
+ typedef struct T1_GlyphSlotRec_* T1_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 character mapping object. */
+ /* */
+ /* <Note> */
+ /* The Type 1 format doesn't use a charmap but an encoding table. */
+ /* The driver is responsible for making up charmap objects */
+ /* corresponding to these tables. */
+ /* */
+ typedef struct T1_CharMapRec_* T1_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* HERE BEGINS THE TYPE1 SPECIFIC STUFF */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_SizeRec */
+ /* */
+ /* <Description> */
+ /* Type 1 size record. */
+ /* */
+ typedef struct T1_SizeRec_
+ {
+ FT_SizeRec root;
+
+ } T1_SizeRec;
+
+
+ FT_LOCAL( void )
+ T1_Size_Done( FT_Size size );
+
+ FT_LOCAL( FT_Error )
+ T1_Size_Request( FT_Size size,
+ FT_Size_Request req );
+
+ FT_LOCAL( FT_Error )
+ T1_Size_Init( FT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_GlyphSlotRec */
+ /* */
+ /* <Description> */
+ /* Type 1 glyph slot record. */
+ /* */
+ typedef struct T1_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Int max_points;
+ FT_Int max_contours;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } T1_GlyphSlotRec;
+
+
+ FT_LOCAL( FT_Error )
+ T1_Face_Init( FT_Stream stream,
+ FT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ T1_Face_Done( FT_Face face );
+
+ FT_LOCAL( FT_Error )
+ T1_GlyphSlot_Init( FT_GlyphSlot slot );
+
+ FT_LOCAL( void )
+ T1_GlyphSlot_Done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ T1_Driver_Init( FT_Module driver );
+
+ FT_LOCAL( void )
+ T1_Driver_Done( FT_Module driver );
+
+
+FT_END_HEADER
+
+#endif /* __T1OBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
new file mode 100644
index 0000000000..293d69abc8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
@@ -0,0 +1,497 @@
+/***************************************************************************/
+/* */
+/* t1parse.c */
+/* */
+/* Type 1 parser (body). */
+/* */
+/* Copyright 1996-2005, 2008, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The Type 1 parser is in charge of the following: */
+ /* */
+ /* - provide an implementation of a growing sequence of objects called */
+ /* a `T1_Table' (used to build various tables needed by the loader). */
+ /* */
+ /* - opening .pfb and .pfa files to extract their top-level and private */
+ /* dictionaries. */
+ /* */
+ /* - read numbers, arrays & strings from any dictionary. */
+ /* */
+ /* See `t1load.c' to see how data is loaded from the font file. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1parse.h"
+
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1parse
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INPUT STREAM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* see Adobe Technical Note 5040.Download_Fonts.pdf */
+
+ static FT_Error
+ read_pfb_tag( FT_Stream stream,
+ FT_UShort *atag,
+ FT_ULong *asize )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong size;
+
+
+ *atag = 0;
+ *asize = 0;
+
+ if ( !FT_READ_USHORT( tag ) )
+ {
+ if ( tag == 0x8001U || tag == 0x8002U )
+ {
+ if ( !FT_READ_ULONG_LE( size ) )
+ *asize = size;
+ }
+
+ *atag = tag;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ check_type1_format( FT_Stream stream,
+ const char* header_string,
+ size_t header_length )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong dummy;
+
+
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ error = read_pfb_tag( stream, &tag, &dummy );
+ if ( error )
+ goto Exit;
+
+ /* We assume that the first segment in a PFB is always encoded as */
+ /* text. This might be wrong (and the specification doesn't insist */
+ /* on that), but we have never seen a counterexample. */
+ if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ if ( !FT_FRAME_ENTER( header_length ) )
+ {
+ error = FT_Err_Ok;
+
+ if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )
+ error = FT_THROW( Unknown_File_Format );
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_New_Parser( T1_Parser parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong size;
+
+
+ psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+ parser->stream = stream;
+ parser->base_len = 0;
+ parser->base_dict = 0;
+ parser->private_len = 0;
+ parser->private_dict = 0;
+ parser->in_pfb = 0;
+ parser->in_memory = 0;
+ parser->single_block = 0;
+
+ /* check the header format */
+ error = check_type1_format( stream, "%!PS-AdobeFont", 14 );
+ if ( error )
+ {
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Exit;
+
+ error = check_type1_format( stream, "%!FontType", 10 );
+ if ( error )
+ {
+ FT_TRACE2(( " not a Type 1 font\n" ));
+ goto Exit;
+ }
+ }
+
+ /******************************************************************/
+ /* */
+ /* Here a short summary of what is going on: */
+ /* */
+ /* When creating a new Type 1 parser, we try to locate and load */
+ /* the base dictionary if this is possible (i.e., for PFB */
+ /* files). Otherwise, we load the whole font into memory. */
+ /* */
+ /* When `loading' the base dictionary, we only setup pointers */
+ /* in the case of a memory-based stream. Otherwise, we */
+ /* allocate and load the base dictionary in it. */
+ /* */
+ /* parser->in_pfb is set if we are in a binary (`.pfb') font. */
+ /* parser->in_memory is set if we have a memory stream. */
+ /* */
+
+ /* try to compute the size of the base dictionary; */
+ /* look for a Postscript binary file tag, i.e., 0x8001 */
+ if ( FT_STREAM_SEEK( 0L ) )
+ goto Exit;
+
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error )
+ goto Exit;
+
+ if ( tag != 0x8001U )
+ {
+ /* assume that this is a PFA file for now; an error will */
+ /* be produced later when more things are checked */
+ if ( FT_STREAM_SEEK( 0L ) )
+ goto Exit;
+ size = stream->size;
+ }
+ else
+ parser->in_pfb = 1;
+
+ /* now, try to load `size' bytes of the `base' dictionary we */
+ /* found previously */
+
+ /* if it is a memory-based resource, set up pointers */
+ if ( !stream->read )
+ {
+ parser->base_dict = (FT_Byte*)stream->base + stream->pos;
+ parser->base_len = size;
+ parser->in_memory = 1;
+
+ /* check that the `size' field is valid */
+ if ( FT_STREAM_SKIP( size ) )
+ goto Exit;
+ }
+ else
+ {
+ /* read segment in memory -- this is clumsy, but so does the format */
+ if ( FT_ALLOC( parser->base_dict, size ) ||
+ FT_STREAM_READ( parser->base_dict, size ) )
+ goto Exit;
+ parser->base_len = size;
+ }
+
+ parser->root.base = parser->base_dict;
+ parser->root.cursor = parser->base_dict;
+ parser->root.limit = parser->root.cursor + parser->base_len;
+
+ Exit:
+ if ( error && !parser->in_memory )
+ FT_FREE( parser->base_dict );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Finalize_Parser( T1_Parser parser )
+ {
+ FT_Memory memory = parser->root.memory;
+
+
+ /* always free the private dictionary */
+ FT_FREE( parser->private_dict );
+
+ /* free the base dictionary only when we have a disk stream */
+ if ( !parser->in_memory )
+ FT_FREE( parser->base_dict );
+
+ parser->root.funcs.done( &parser->root );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Private_Dict( T1_Parser parser,
+ PSAux_Service psaux )
+ {
+ FT_Stream stream = parser->stream;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong size;
+
+
+ if ( parser->in_pfb )
+ {
+ /* in the case of the PFB format, the private dictionary can be */
+ /* made of several segments. We thus first read the number of */
+ /* segments to compute the total size of the private dictionary */
+ /* then re-read them into memory. */
+ FT_Long start_pos = FT_STREAM_POS();
+ FT_UShort tag;
+
+
+ parser->private_len = 0;
+ for (;;)
+ {
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error )
+ goto Fail;
+
+ if ( tag != 0x8002U )
+ break;
+
+ parser->private_len += size;
+
+ if ( FT_STREAM_SKIP( size ) )
+ goto Fail;
+ }
+
+ /* Check that we have a private dictionary there */
+ /* and allocate private dictionary buffer */
+ if ( parser->private_len == 0 )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " invalid private dictionary section\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ if ( FT_STREAM_SEEK( start_pos ) ||
+ FT_ALLOC( parser->private_dict, parser->private_len ) )
+ goto Fail;
+
+ parser->private_len = 0;
+ for (;;)
+ {
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error || tag != 0x8002U )
+ {
+ error = FT_Err_Ok;
+ break;
+ }
+
+ if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
+ size ) )
+ goto Fail;
+
+ parser->private_len += size;
+ }
+ }
+ else
+ {
+ /* We have already `loaded' the whole PFA font file into memory; */
+ /* if this is a memory resource, allocate a new block to hold */
+ /* the private dict. Otherwise, simply overwrite into the base */
+ /* dictionary block in the heap. */
+
+ /* first of all, look at the `eexec' keyword */
+ FT_Byte* cur = parser->base_dict;
+ FT_Byte* limit = cur + parser->base_len;
+ FT_Byte c;
+
+
+ Again:
+ for (;;)
+ {
+ c = cur[0];
+ if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */
+ /* whitespace + 4 chars */
+ {
+ if ( cur[1] == 'e' &&
+ cur[2] == 'x' &&
+ cur[3] == 'e' &&
+ cur[4] == 'c' )
+ break;
+ }
+ cur++;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " could not find `eexec' keyword\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* check whether `eexec' was real -- it could be in a comment */
+ /* or string (as e.g. in u003043t.gsf from ghostscript) */
+
+ parser->root.cursor = parser->base_dict;
+ /* set limit to `eexec' + whitespace + 4 characters */
+ parser->root.limit = cur + 10;
+
+ cur = parser->root.cursor;
+ limit = parser->root.limit;
+
+ while ( cur < limit )
+ {
+ if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
+ goto Found;
+
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ break;
+ T1_Skip_Spaces ( parser );
+ cur = parser->root.cursor;
+ }
+
+ /* we haven't found the correct `eexec'; go back and continue */
+ /* searching */
+
+ cur = limit;
+ limit = parser->base_dict + parser->base_len;
+ goto Again;
+
+ /* now determine where to write the _encrypted_ binary private */
+ /* dictionary. We overwrite the base dictionary for disk-based */
+ /* resources and allocate a new block otherwise */
+
+ Found:
+ parser->root.limit = parser->base_dict + parser->base_len;
+
+ T1_Skip_PS_Token( parser );
+ cur = parser->root.cursor;
+ limit = parser->root.limit;
+
+ /* according to the Type1 spec, the first cipher byte must not be */
+ /* an ASCII whitespace character code (blank, tab, carriage return */
+ /* or line feed). We have seen Type 1 fonts with two line feed */
+ /* characters... So skip now all whitespace character codes. */
+ while ( cur < limit &&
+ ( *cur == ' ' ||
+ *cur == '\t' ||
+ *cur == '\r' ||
+ *cur == '\n' ) )
+ ++cur;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " `eexec' not properly terminated\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ size = (FT_ULong)( parser->base_len - ( cur - parser->base_dict ) );
+
+ if ( parser->in_memory )
+ {
+ /* note that we allocate one more byte to put a terminating `0' */
+ if ( FT_ALLOC( parser->private_dict, size + 1 ) )
+ goto Fail;
+ parser->private_len = size;
+ }
+ else
+ {
+ parser->single_block = 1;
+ parser->private_dict = parser->base_dict;
+ parser->private_len = size;
+ parser->base_dict = 0;
+ parser->base_len = 0;
+ }
+
+ /* now determine whether the private dictionary is encoded in binary */
+ /* or hexadecimal ASCII format -- decode it accordingly */
+
+ /* we need to access the next 4 bytes (after the final whitespace */
+ /* following the `eexec' keyword); if they all are hexadecimal */
+ /* digits, then we have a case of ASCII storage */
+
+ if ( cur + 3 < limit &&
+ ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
+ ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
+ {
+ /* ASCII hexadecimal encoding */
+ FT_Long len;
+
+
+ parser->root.cursor = cur;
+ (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
+ parser->private_dict,
+ parser->private_len,
+ &len,
+ 0 );
+ parser->private_len = len;
+
+ /* put a safeguard */
+ parser->private_dict[len] = '\0';
+ }
+ else
+ /* binary encoding -- copy the private dict */
+ FT_MEM_MOVE( parser->private_dict, cur, size );
+ }
+
+ /* we now decrypt the encoded binary private dictionary */
+ psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
+
+ if ( parser->private_len < 4 )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " invalid private dictionary section\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* replace the four random bytes at the beginning with whitespace */
+ parser->private_dict[0] = ' ';
+ parser->private_dict[1] = ' ';
+ parser->private_dict[2] = ' ';
+ parser->private_dict[3] = ' ';
+
+ parser->root.base = parser->private_dict;
+ parser->root.cursor = parser->private_dict;
+ parser->root.limit = parser->root.cursor + parser->private_len;
+
+ Fail:
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
new file mode 100644
index 0000000000..8bb6c43b2a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
@@ -0,0 +1,135 @@
+/***************************************************************************/
+/* */
+/* t1parse.h */
+/* */
+/* Type 1 parser (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1PARSE_H__
+#define __T1PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_ParserRec */
+ /* */
+ /* <Description> */
+ /* A PS_ParserRec is an object used to parse a Type 1 fonts very */
+ /* quickly. */
+ /* */
+ /* <Fields> */
+ /* root :: The root parser. */
+ /* */
+ /* stream :: The current input stream. */
+ /* */
+ /* base_dict :: A pointer to the top-level dictionary. */
+ /* */
+ /* base_len :: The length in bytes of the top dictionary. */
+ /* */
+ /* private_dict :: A pointer to the private dictionary. */
+ /* */
+ /* private_len :: The length in bytes of the private dictionary. */
+ /* */
+ /* in_pfb :: A boolean. Indicates that we are handling a PFB */
+ /* file. */
+ /* */
+ /* in_memory :: A boolean. Indicates a memory-based stream. */
+ /* */
+ /* single_block :: A boolean. Indicates that the private dictionary */
+ /* is stored in lieu of the base dictionary. */
+ /* */
+ typedef struct T1_ParserRec_
+ {
+ PS_ParserRec root;
+ FT_Stream stream;
+
+ FT_Byte* base_dict;
+ FT_ULong base_len;
+
+ FT_Byte* private_dict;
+ FT_ULong private_len;
+
+ FT_Bool in_pfb;
+ FT_Bool in_memory;
+ FT_Bool single_block;
+
+ } T1_ParserRec, *T1_Parser;
+
+
+#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l )
+#define T1_Done_Table( p ) \
+ do \
+ { \
+ if ( (p)->funcs.done ) \
+ (p)->funcs.done( p ); \
+ } while ( 0 )
+#define T1_Release_Table( p ) \
+ do \
+ { \
+ if ( (p)->funcs.release ) \
+ (p)->funcs.release( p ); \
+ } while ( 0 )
+
+
+#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root )
+#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define T1_ToCoordArray( p, m, c ) \
+ (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define T1_ToFixedArray( p, m, f, t ) \
+ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define T1_ToToken( p, t ) \
+ (p)->root.funcs.to_token( &(p)->root, t )
+#define T1_ToTokenArray( p, t, m, c ) \
+ (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define T1_Load_Field( p, f, o, m, pf ) \
+ (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
+
+#define T1_Load_Field_Table( p, f, o, m, pf ) \
+ (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
+
+
+ FT_LOCAL( FT_Error )
+ T1_New_Parser( T1_Parser parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Private_Dict( T1_Parser parser,
+ PSAux_Service psaux );
+
+ FT_LOCAL( void )
+ T1_Finalize_Parser( T1_Parser parser );
+
+
+FT_END_HEADER
+
+#endif /* __T1PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
new file mode 100644
index 0000000000..e37276b908
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/* */
+/* t1tokens.h */
+/* */
+/* Type 1 tokenizer (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_INFO
+
+ T1_FIELD_STRING( "version", version,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "Notice", notice,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "FullName", full_name,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "FamilyName", family_name,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "Weight", weight,
+ T1_FIELD_DICT_FONTDICT )
+
+ /* we use pointers to detect modifications made by synthetic fonts */
+ T1_FIELD_NUM ( "ItalicAngle", italic_angle,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "UnderlinePosition", underline_position,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "UnderlineThickness", underline_thickness,
+ T1_FIELD_DICT_FONTDICT )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontExtraRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA
+
+ T1_FIELD_NUM ( "FSType", fs_type,
+ T1_FIELD_DICT_FONTDICT )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_PrivateRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_PRIVATE
+
+ T1_FIELD_NUM ( "UniqueID", unique_id,
+ T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "lenIV", lenIV,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "LanguageGroup", language_group,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "password", password,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_FIXED_1000( "BlueScale", blue_scale,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "BlueShift", blue_shift,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "BlueFuzz", blue_fuzz,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_BOOL ( "ForceBold", force_bold,
+ T1_FIELD_DICT_PRIVATE )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE T1_FontRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+
+ T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE FT_BBox
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BBOX
+
+ T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE T1_FaceRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FACE
+
+ T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_BlendRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BLEND
+
+ T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector,
+ T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
+
+
+#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/include/fxft_cffobjs.h b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
new file mode 100644
index 0000000000..c15e0755b3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_CFFOBJS_H_
+#define _FXFT_CFFOBJS_H_
+#include "../fxft2.5.01/src/cff/cffobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_cfftypes.h b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
new file mode 100644
index 0000000000..9fbb7a31f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/src/cff/cfftypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_freetype.h b/core/src/fxge/fx_freetype/include/fxft_freetype.h
new file mode 100644
index 0000000000..92ffde0d79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_freetype.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/include/freetype/freetype.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ft2build.h b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
new file mode 100644
index 0000000000..f3438d4b24
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FT2BUILD_H_
+#define _FXFT_FT2BUILD_H_
+#include "../fxft2.5.01/include/ft2build.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftmm.h b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
new file mode 100644
index 0000000000..4b36ef7058
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTMM_H_
+#define _FXFT_FTMM_H_
+#include "../fxft2.5.01/include/freetype/ftmm.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftobjs.h b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
new file mode 100644
index 0000000000..40d7eaaccd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOBJS_H_
+#define _FXFT_FTOBJS_H_
+#include "../fxft2.5.01/include/freetype/internal/ftobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftotval.h b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
new file mode 100644
index 0000000000..f613aa7454
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOTVAL_H_
+#define _FXFT_FTOTVAL_H_
+#include "../fxft2.5.01/include/freetype/ftotval.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftoutln.h b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
new file mode 100644
index 0000000000..14396d8404
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOUTLN_H_
+#define _FXFT_FTOUTLN_H_
+#include "../fxft2.5.01/include/freetype/ftoutln.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftstream.h b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
new file mode 100644
index 0000000000..ff6a4220fa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTSTREAM_H_
+#define _FXFT_FTSTREAM_H_
+#include "../fxft2.5.01/include/freetype/internal/ftstream.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttables.h b/core/src/fxge/fx_freetype/include/fxft_tttables.h
new file mode 100644
index 0000000000..3b44fff44c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttables.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTABLES_H_
+#define _FXFT_TTTABLES_H_
+#include "../fxft2.5.01/include/freetype/tttables.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttypes.h b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
new file mode 100644
index 0000000000..06128debdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTYPES_H_
+#define _FXFT_TTTYPES_H_
+#include "../fxft2.5.01/include/freetype/internal/tttypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/src/fxft_cff.c b/core/src/fxge/fx_freetype/src/fxft_cff.c
new file mode 100644
index 0000000000..e877b7d945
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_cff.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cff/fxft_cff.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbase.c b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
new file mode 100644
index 0000000000..d769aca860
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbase.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
new file mode 100644
index 0000000000..2edbc830cc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbitmap.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftglyph.c b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
new file mode 100644
index 0000000000..85855acf60
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftglyph.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftinit.c b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
new file mode 100644
index 0000000000..2be4b7fc79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftinit.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
new file mode 100644
index 0000000000..8225ea0d0e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftlcdfil.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftmm.c b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
new file mode 100644
index 0000000000..85064469e0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftmm.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftsystem.c b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
new file mode 100644
index 0000000000..36182a38dd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftsystem.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psaux.c b/core/src/fxge/fx_freetype/src/fxft_psaux.c
new file mode 100644
index 0000000000..0c6d0cb9f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psaux.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psaux/fxft_psaux.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_pshinter.c b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
new file mode 100644
index 0000000000..02c5d41d48
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/pshinter/fxft_pshinter.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psmodule.c b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
new file mode 100644
index 0000000000..9495886a56
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psnames/fxft_psmodule.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_raster.c b/core/src/fxge/fx_freetype/src/fxft_raster.c
new file mode 100644
index 0000000000..a616016f9e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_raster.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/raster/fxft_raster.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_sfnt.c b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
new file mode 100644
index 0000000000..6fa2b57e41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/sfnt/fxft_sfnt.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_smooth.c b/core/src/fxge/fx_freetype/src/fxft_smooth.c
new file mode 100644
index 0000000000..2cbfa01154
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_smooth.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/smooth/fxft_smooth.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_truetype.c b/core/src/fxge/fx_freetype/src/fxft_truetype.c
new file mode 100644
index 0000000000..6ed54960f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_truetype.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/truetype/fxft_truetype.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1.c b/core/src/fxge/fx_freetype/src/fxft_type1.c
new file mode 100644
index 0000000000..d784e0a1f9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/type1/fxft_type1.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1cid.c b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
new file mode 100644
index 0000000000..b6319f6202
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cid/fxft_type1cid.c"
diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp
new file mode 100644
index 0000000000..df200d5b48
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge.cpp
@@ -0,0 +1,79 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "text_int.h"
+static CFX_GEModule* g_pGEModule = NULL;
+CFX_GEModule::CFX_GEModule()
+{
+ m_pFontCache = NULL;
+ m_pFontMgr = NULL;
+ m_FTLibrary = NULL;
+ m_pCodecModule = NULL;
+ m_pPlatformData = NULL;
+}
+CFX_GEModule::~CFX_GEModule()
+{
+ if (m_pFontCache) {
+ delete m_pFontCache;
+ }
+ m_pFontCache = NULL;
+ if (m_pFontMgr) {
+ delete m_pFontMgr;
+ }
+ m_pFontMgr = NULL;
+ DestroyPlatform();
+}
+CFX_GEModule* CFX_GEModule::Get()
+{
+ return g_pGEModule;
+}
+void CFX_GEModule::Create()
+{
+ g_pGEModule = FX_NEW CFX_GEModule;
+ if (!g_pGEModule) {
+ return;
+ }
+ g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;
+ g_pGEModule->InitPlatform();
+ g_pGEModule->SetTextGamma(2.2f);
+}
+void CFX_GEModule::Use(CFX_GEModule* pModule)
+{
+ g_pGEModule = pModule;
+}
+void CFX_GEModule::Destroy()
+{
+ if (g_pGEModule) {
+ delete g_pGEModule;
+ }
+ g_pGEModule = NULL;
+}
+CFX_FontCache* CFX_GEModule::GetFontCache()
+{
+ if (m_pFontCache == NULL) {
+ m_pFontCache = FX_NEW CFX_FontCache();
+ }
+ return m_pFontCache;
+}
+void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)
+{
+ gammaValue /= 2.2f;
+ int i = 0;
+ while (i < 256) {
+ m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);
+ i++;
+ }
+}
+FX_LPCBYTE CFX_GEModule::GetTextGammaTable()
+{
+ return m_GammaValue;
+}
+void CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)
+{
+ GetFontMgr()->m_pExtMapper = pFontMapper;
+ pFontMapper->m_pFontMgr = m_pFontMgr;
+}
diff --git a/core/src/fxge/ge/fx_ge_device.cpp b/core/src/fxge/ge/fx_ge_device.cpp
new file mode 100644
index 0000000000..8f7ccdb7d9
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_device.cpp
@@ -0,0 +1,405 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+CFX_RenderDevice::CFX_RenderDevice()
+{
+ m_pDeviceDriver = NULL;
+ m_pBitmap = NULL;
+}
+CFX_RenderDevice::~CFX_RenderDevice()
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+}
+void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+ m_pDeviceDriver = pDriver;
+ InitDeviceInfo();
+}
+void CFX_RenderDevice::InitDeviceInfo()
+{
+ ASSERT(m_pDeviceDriver != NULL);
+ m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
+ m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+ m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);
+ m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);
+ m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);
+ if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+ }
+}
+FX_BOOL CFX_RenderDevice::StartRendering()
+{
+ return m_pDeviceDriver->StartRendering();
+}
+void CFX_RenderDevice::EndRendering()
+{
+ m_pDeviceDriver->EndRendering();
+}
+void CFX_RenderDevice::SaveState()
+{
+ m_pDeviceDriver->SaveState();
+}
+void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_pDeviceDriver->RestoreState(bKeepSaved);
+ UpdateClipBox();
+}
+int CFX_RenderDevice::GetDeviceCaps(int caps_id) const
+{
+ return m_pDeviceDriver->GetDeviceCaps(caps_id);
+}
+CFX_Matrix CFX_RenderDevice::GetCTM() const
+{
+ return m_pDeviceDriver->GetCTM();
+}
+FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const
+{
+ if (m_RenderCaps & FXRC_CMYK_OUTPUT) {
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);
+ } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {
+ return pDIB->Create(width, height, FXDIB_8bppMask);
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);
+#else
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
+#endif
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)
+{
+ CFX_PathData path;
+ path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));
+ if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+void CFX_RenderDevice::UpdateClipBox()
+{
+ if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ return;
+ }
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+}
+FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_BYTE fill_alpha, stroke_alpha;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);
+ stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ } else {
+ fill_alpha = FXARGB_A(fill_color);
+ stroke_alpha = FXARGB_A(stroke_color);
+ }
+ if ((fill_mode & 3) == 0) {
+ fill_alpha = 0;
+ }
+ if (pGraphState == NULL) {
+ stroke_alpha = 0;
+ }
+ if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ FX_FLOAT x1, x2, y1, y2;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);
+ pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);
+ } else {
+ x1 = pPoints[0].m_PointX;
+ y1 = pPoints[0].m_PointY;
+ x2 = pPoints[1].m_PointX;
+ y2 = pPoints[1].m_PointY;
+ }
+ DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+ return TRUE;
+ }
+ if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {
+ CFX_FloatRect rect_f;
+ if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {
+ FX_RECT rect_i = rect_f.GetOutterRect();
+ int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);
+ if (width < 1) {
+ width = 1;
+ if (rect_i.left == rect_i.right) {
+ rect_i.right ++;
+ }
+ }
+ int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);
+ if (height < 1) {
+ height = 1;
+ if (rect_i.bottom == rect_i.top) {
+ rect_i.bottom ++;
+ }
+ }
+ if (rect_i.Width() >= width + 1) {
+ if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {
+ rect_i.left ++;
+ } else {
+ rect_i.right --;
+ }
+ }
+ if (rect_i.Height() >= height + 1) {
+ if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {
+ rect_i.top ++;
+ } else {
+ rect_i.bottom --;
+ }
+ }
+ if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ }
+ }
+ if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {
+ CFX_PathData newPath;
+ FX_BOOL bThin = FALSE;
+ if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {
+ CFX_GraphStateData graphState;
+ graphState.m_LineWidth = 0.0f;
+ FX_DWORD strokecolor = fill_color;
+ if (bThin) {
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);
+ } else {
+ strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
+ }
+ }
+ CFX_AffineMatrix* pMatrix = NULL;
+ if (pObject2Device && !pObject2Device->IsIdentity()) {
+ pMatrix = (CFX_AffineMatrix*)pObject2Device;
+ }
+ int smooth_path = FX_ZEROAREA_FILL;
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ smooth_path |= FXFILL_NOPATHSMOOTH;
+ }
+ m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);
+ }
+ }
+ if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_FloatRect bbox;
+ if (pGraphState) {
+ bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ } else {
+ bbox = pPathData->GetBoundingBox();
+ }
+ if (pObject2Device) {
+ bbox.Transform(pObject2Device);
+ }
+ CFX_Matrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT rect = bbox.GetOutterRect();
+ CFX_DIBitmap bitmap, Backdrop;
+ if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {
+ return FALSE;
+ }
+ if (bitmap.HasAlpha()) {
+ bitmap.Clear(0);
+ Backdrop.Copy(&bitmap);
+ } else {
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {
+ return FALSE;
+ }
+ Backdrop.Copy(&bitmap);
+ }
+ CFX_FxgeDevice bitmap_device;
+ bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);
+ CFX_AffineMatrix matrix;
+ if (pObject2Device) {
+ matrix = *pObject2Device;
+ }
+ matrix.TranslateI(-rect.left, -rect.top);
+ matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
+ if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));
+ return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ FX_RECT rect(x, y, x + 1, y + 1);
+ return FillRect(&rect, color, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_DIBitmap bitmap;
+ if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {
+ return FALSE;
+ }
+ if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());
+ m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (((m_RenderCaps & FXRC_ALPHA_PATH) &&
+ (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||
+ color >= 0xff000000)
+ if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ CFX_GraphStateData graph_state;
+ CFX_PathData path;
+ path.SetPointCount(2);
+ path.SetPoint(0, x1, y1, FXPT_MOVETO);
+ path.SetPoint(1, x2, y2, FXPT_LINETO);
+ return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)
+{
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);
+}
+CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()
+{
+ return m_pDeviceDriver->GetBackDrop();
+}
+FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,
+ void* pIccTransform)
+{
+ ASSERT(!pBitmap->IsAlphaMask());
+ CFX_AffineMatrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));
+ dest_rect.Intersect(m_ClipBox);
+ if (dest_rect.IsEmpty()) {
+ return TRUE;
+ }
+ FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,
+ dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());
+ src_rect.left = FXSYS_round(src_rect.left * fScaleX);
+ src_rect.top = FXSYS_round(src_rect.top * fScaleY);
+ src_rect.right = FXSYS_round(src_rect.right * fScaleX);
+ src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);
+ if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||
+ (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);
+ int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);
+ CFX_DIBitmap background;
+ if (!background.Create(bg_pixel_width, bg_pixel_height,
+ (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {
+ return FALSE;
+ }
+ if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,
+ pBitmap, src_rect.left, src_rect.top,
+ blend_mode, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);
+ return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform, int blend_mode)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ if (clip_box.IsEmpty()) {
+ return TRUE;
+ }
+ return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_mode)
+{
+ return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+{
+ return m_pDeviceDriver->ContinueDIBits(handle, pPause);
+}
+void CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)
+{
+ m_pDeviceDriver->CancelDIBits(handle);
+}
diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
new file mode 100644
index 0000000000..e047d2ecb0
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -0,0 +1,458 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)
+extern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);
+CFX_Font::CFX_Font()
+{
+ m_pSubstFont = NULL;
+ m_Face = NULL;
+ m_bEmbedded = FALSE;
+ m_bVertical = FALSE;
+ m_pFontData = NULL;
+ m_pFontDataAllocation = NULL;
+ m_dwSize = 0;
+ m_pOwnedStream = NULL;
+ m_pGsubData = NULL;
+ m_pPlatformFont = NULL;
+ m_pPlatformFontCollection = NULL;
+ m_pDwFont = NULL;
+ m_hHandle = NULL;
+ m_bDwLoaded = FALSE;
+}
+CFX_Font::~CFX_Font()
+{
+ if (m_pSubstFont) {
+ delete m_pSubstFont;
+ m_pSubstFont = NULL;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ if (m_pFontDataAllocation) {
+ FX_Free(m_pFontDataAllocation);
+ m_pFontDataAllocation = NULL;
+ }
+#endif
+ if (m_Face) {
+#ifdef FOXIT_CHROME_BUILD
+ FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);
+ if (FXFT_Get_Face_External_Stream(m_Face)) {
+ FXFT_Clear_Face_External_Stream(m_Face);
+ }
+#endif
+ if(m_bEmbedded) {
+ DeleteFace();
+ } else {
+ CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
+ }
+ }
+ if (m_pOwnedStream) {
+ FX_Free(m_pOwnedStream);
+ m_pOwnedStream = NULL;
+ }
+ if (m_pGsubData) {
+ FX_Free(m_pGsubData);
+ m_pGsubData = NULL;
+ }
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+ ReleasePlatformResource();
+#endif
+}
+void CFX_Font::DeleteFace()
+{
+ FXFT_Done_Face(m_Face);
+ m_Face = NULL;
+}
+FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)
+{
+ m_bEmbedded = FALSE;
+ m_bVertical = bVertical;
+ m_pSubstFont = FX_NEW CFX_SubstFont;
+ if (!m_pSubstFont) {
+ return FALSE;
+ }
+ m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, m_pSubstFont);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if(m_pSubstFont->m_ExtHandle) {
+ m_pPlatformFont = m_pSubstFont->m_ExtHandle;
+ m_pSubstFont->m_ExtHandle = NULL;
+ }
+#endif
+ if (m_Face) {
+ m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);
+ m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);
+ }
+ return TRUE;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count)
+ {
+ if (count == 0) {
+ return 0;
+ }
+ IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
+ int res = pFile->ReadBlock(buffer, offset, count);
+ if (res) {
+ return count;
+ }
+ return 0;
+ }
+ void _FTStreamClose(FXFT_Stream stream)
+ {
+ }
+};
+FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)
+{
+ FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));
+ if (!stream1) {
+ return FALSE;
+ }
+ stream1->base = NULL;
+ stream1->size = (unsigned long)pFile->GetSize();
+ stream1->pos = 0;
+ stream1->descriptor.pointer = pFile;
+ stream1->close = _FTStreamClose;
+ stream1->read = _FTStreamRead;
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_STREAM;
+ args.stream = stream1;
+ if (FXFT_Open_Face(library, &args, 0, Face)) {
+ FX_Free(stream1);
+ return FALSE;
+ }
+ if (stream) {
+ *stream = stream1;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)
+{
+ m_bEmbedded = FALSE;
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Stream stream = NULL;
+ if (!_LoadFile(library, &m_Face, pFile, &stream)) {
+ return FALSE;
+ }
+ m_pOwnedStream = stream;
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return TRUE;
+}
+int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)
+{
+ if (!m_Face) {
+ return 0;
+ }
+ if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {
+ AdjustMMParams(glyph_index, 0, 0);
+ }
+ int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+ return width;
+}
+static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)
+{
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Face face;
+ int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);
+ if (error) {
+ return NULL;
+ }
+ error = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (error) {
+ return NULL;
+ }
+ return face;
+}
+FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)
+{
+#ifdef FOXIT_CHROME_BUILD
+ m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);
+ if (!m_pFontDataAllocation) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pFontDataAllocation, data, size);
+ m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);
+ m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;
+#else
+ m_Face = FT_LoadFont((FX_LPBYTE)data, size);
+ m_pFontData = (FX_LPBYTE)data;
+#endif
+ m_bEmbedded = TRUE;
+ m_dwSize = size;
+ return m_Face != NULL;
+}
+FX_BOOL CFX_Font::IsTTFont()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
+}
+int CFX_Font::GetAscent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+ return ascent;
+}
+int CFX_Font::GetDescent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+ return descent;
+}
+FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ if (FXFT_Is_Face_Tricky(m_Face)) {
+ int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_BBox cbox;
+ FT_Glyph glyph;
+ error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,
+ pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;
+ if (pixel_size_x == 0 || pixel_size_y == 0) {
+ bbox.left = cbox.xMin;
+ bbox.right = cbox.xMax;
+ bbox.top = cbox.yMax;
+ bbox.bottom = cbox.yMin;
+ } else {
+ bbox.left = cbox.xMin * 1000 / pixel_size_x;
+ bbox.right = cbox.xMax * 1000 / pixel_size_x;
+ bbox.top = cbox.yMax * 1000 / pixel_size_y;
+ bbox.bottom = cbox.yMin * 1000 / pixel_size_y;
+ }
+ if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {
+ bbox.top = FXFT_Get_Face_Ascender(m_Face);
+ }
+ if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {
+ bbox.bottom = FXFT_Get_Face_Descender(m_Face);
+ }
+ FT_Done_Glyph(glyph);
+ return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);
+ bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);
+ bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);
+ bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;
+ bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;
+ bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;
+ bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::IsItalic()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;
+ if (!ret) {
+ CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));
+ str.MakeLower();
+ if (str.Find("italic") != -1) {
+ ret = TRUE;
+ }
+ }
+ return ret;
+}
+FX_BOOL CFX_Font::IsBold()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;
+}
+FX_BOOL CFX_Font::IsFixedWidth()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_fixedwidth(m_Face);
+}
+CFX_WideString CFX_Font::GetPsName() const
+{
+ if (m_Face == NULL) {
+ return CFX_WideString();
+ }
+ CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+ if (psName.IsEmpty()) {
+ psName = CFX_WideString::FromLocal("Untitled");
+ }
+ return psName;
+}
+CFX_ByteString CFX_Font::GetFamilyName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+CFX_ByteString CFX_Font::GetFaceName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ CFX_ByteString facename;
+ CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));
+ facename = GetFamilyName();
+ if (facename.IsEmpty()) {
+ facename = "Untitled";
+ }
+ if (!style.IsEmpty() && style != "Regular") {
+ facename += " " + style;
+ }
+ return facename;
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+FX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Face_xMin(m_Face);
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face);
+ bbox.top = FXFT_Get_Face_yMin(m_Face);
+ bbox.right = FXFT_Get_Face_xMax(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;
+ bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;
+ bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;
+ }
+ return TRUE;
+}
+int CFX_Font::GetHeight()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+ return height;
+}
+int CFX_Font::GetMaxAdvanceWidth()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));
+ return width;
+}
+int CFX_Font::GetULPos()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));
+ return pos;
+}
+int CFX_Font::GetULthickness()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));
+ return thickness;
+}
+CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)
+{
+ m_pFont = pFont;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {
+ FX_DWORD index = 0;
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {
+ index = FXFT_Get_Char_Index(face, charcode);
+ }
+ if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ }
+ return charcode;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (encoding == ENCODING_UNICODE) {
+ return GlyphFromCharCode(charcode);
+ } else {
+ int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);
+ int i = 0;
+ while (i < nmaps) {
+ int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);
+ if (encoding != FXFT_ENCODING_UNICODE) {
+ FXFT_Select_Charmap(face, encoding);
+ break;
+ }
+ }
+ }
+ return FXFT_Get_Char_Index(face, charcode);
+}
+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)
+{
+ CFX_UnicodeEncoding* pEncoding = NULL;
+ pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);
+ return pEncoding;
+}
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
new file mode 100644
index 0000000000..6549e8e531
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -0,0 +1,1558 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1])
+#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])
+CFX_SubstFont::CFX_SubstFont()
+{
+ m_ExtHandle = NULL;
+ m_Charset = 0;
+ m_SubstFlags = 0;
+ m_Weight = 0;
+ m_ItalicAngle = 0;
+ m_bSubstOfCJK = FALSE;
+ m_WeightCJK = 0;
+ m_bItlicCJK = FALSE;
+}
+CTTFontDesc::~CTTFontDesc()
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace) {
+ FXFT_Done_Face(m_SingleFace.m_pFace);
+ }
+ } else if (m_Type == 2) {
+ for (int i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i]) {
+ FXFT_Done_Face(m_TTCFace.m_pFaces[i]);
+ }
+ }
+ if (m_pFontData) {
+ FX_Free(m_pFontData);
+ }
+}
+FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace != face) {
+ return FALSE;
+ }
+ } else if (m_Type == 2) {
+ int i;
+ for (i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i] == face) {
+ break;
+ }
+ if (i == 16) {
+ return FALSE;
+ }
+ }
+ m_RefCount --;
+ if (m_RefCount) {
+ return FALSE;
+ }
+ delete this;
+ return TRUE;
+}
+CFX_FontMgr::CFX_FontMgr()
+{
+ m_pBuiltinMapper = FX_NEW CFX_FontMapper;
+ if (!m_pBuiltinMapper) {
+ return;
+ }
+ m_pBuiltinMapper->m_pFontMgr = this;
+ m_pExtMapper = NULL;
+ m_FTLibrary = NULL;
+ FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);
+}
+CFX_FontMgr::~CFX_FontMgr()
+{
+ if (m_pBuiltinMapper) {
+ delete m_pBuiltinMapper;
+ }
+ FreeCache();
+ if (m_FTLibrary) {
+ FXFT_Done_FreeType(m_FTLibrary);
+ }
+}
+void CFX_FontMgr::InitFTLibrary()
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+}
+void CFX_FontMgr::FreeCache()
+{
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* face;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);
+ delete face;
+ }
+ m_FaceMap.RemoveAll();
+}
+void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
+}
+FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,
+ FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ if (m_pExtMapper) {
+ FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+ if (face) {
+ return face;
+ }
+ }
+ return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+}
+FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if(pFontDesc) {
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ return pFontDesc->m_SingleFace.m_pFace;
+ }
+ return NULL;
+}
+FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)
+{
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 1;
+ pFontDesc->m_SingleFace.m_pFace = NULL;
+ pFontDesc->m_SingleFace.m_bBold = weight;
+ pFontDesc->m_SingleFace.m_bItalic = bItalic;
+ pFontDesc->m_pFontData = pData;
+ pFontDesc->m_RefCount = 1;
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ m_FaceMap.SetAt(key, pFontDesc);
+ return pFontDesc->m_SingleFace.m_pFace;
+}
+const FX_LPCSTR g_Base14FontNames[14] = {
+ "Courier",
+ "Courier-Bold",
+ "Courier-BoldOblique",
+ "Courier-Oblique",
+ "Helvetica",
+ "Helvetica-Bold",
+ "Helvetica-BoldOblique",
+ "Helvetica-Oblique",
+ "Times-Roman",
+ "Times-Bold",
+ "Times-BoldItalic",
+ "Times-Italic",
+ "Symbol",
+ "ZapfDingbats",
+};
+const struct _AltFontName {
+ const FX_CHAR* m_pName;
+ int m_Index;
+}
+g_AltFontNames[] = {
+ {"Arial", 4},
+ {"Arial,Bold", 5},
+ {"Arial,BoldItalic", 6},
+ {"Arial,Italic", 7},
+ {"Arial-Bold", 5},
+ {"Arial-BoldItalic", 6},
+ {"Arial-BoldItalicMT", 6},
+ {"Arial-BoldMT", 5},
+ {"Arial-Italic", 7},
+ {"Arial-ItalicMT", 7},
+ {"ArialBold", 5},
+ {"ArialBoldItalic", 6},
+ {"ArialItalic", 7},
+ {"ArialMT", 4},
+ {"ArialMT,Bold", 5},
+ {"ArialMT,BoldItalic", 6},
+ {"ArialMT,Italic", 7},
+ {"ArialRoundedMTBold", 5},
+ {"Courier", 0},
+ {"Courier,Bold", 1},
+ {"Courier,BoldItalic", 2},
+ {"Courier,Italic", 3},
+ {"Courier-Bold", 1},
+ {"Courier-BoldOblique", 2},
+ {"Courier-Oblique", 3},
+ {"CourierBold", 1},
+ {"CourierBoldItalic", 2},
+ {"CourierItalic", 3},
+ {"CourierNew", 0},
+ {"CourierNew,Bold", 1},
+ {"CourierNew,BoldItalic", 2},
+ {"CourierNew,Italic", 3},
+ {"CourierNew-Bold", 1},
+ {"CourierNew-BoldItalic", 2},
+ {"CourierNew-Italic", 3},
+ {"CourierNewBold", 1},
+ {"CourierNewBoldItalic", 2},
+ {"CourierNewItalic", 3},
+ {"CourierNewPS-BoldItalicMT", 2},
+ {"CourierNewPS-BoldMT", 1},
+ {"CourierNewPS-ItalicMT", 3},
+ {"CourierNewPSMT", 0},
+ {"CourierStd", 0},
+ {"CourierStd-Bold", 1},
+ {"CourierStd-BoldOblique", 2},
+ {"CourierStd-Oblique", 3},
+ {"Helvetica", 4},
+ {"Helvetica,Bold", 5},
+ {"Helvetica,BoldItalic", 6},
+ {"Helvetica,Italic", 7},
+ {"Helvetica-Bold", 5},
+ {"Helvetica-BoldItalic", 6},
+ {"Helvetica-BoldOblique", 6},
+ {"Helvetica-Italic", 7},
+ {"Helvetica-Oblique", 7},
+ {"HelveticaBold", 5},
+ {"HelveticaBoldItalic", 6},
+ {"HelveticaItalic", 7},
+ {"Symbol", 12},
+ {"SymbolMT", 12},
+ {"Times-Bold", 9},
+ {"Times-BoldItalic", 10},
+ {"Times-Italic", 11},
+ {"Times-Roman", 8},
+ {"TimesBold", 9},
+ {"TimesBoldItalic", 10},
+ {"TimesItalic", 11},
+ {"TimesNewRoman", 8},
+ {"TimesNewRoman,Bold", 9},
+ {"TimesNewRoman,BoldItalic", 10},
+ {"TimesNewRoman,Italic", 11},
+ {"TimesNewRoman-Bold", 9},
+ {"TimesNewRoman-BoldItalic", 10},
+ {"TimesNewRoman-Italic", 11},
+ {"TimesNewRomanBold", 9},
+ {"TimesNewRomanBoldItalic", 10},
+ {"TimesNewRomanItalic", 11},
+ {"TimesNewRomanPS", 8},
+ {"TimesNewRomanPS-Bold", 9},
+ {"TimesNewRomanPS-BoldItalic", 10},
+ {"TimesNewRomanPS-BoldItalicMT", 10},
+ {"TimesNewRomanPS-BoldMT", 9},
+ {"TimesNewRomanPS-Italic", 11},
+ {"TimesNewRomanPS-ItalicMT", 11},
+ {"TimesNewRomanPSMT", 8},
+ {"TimesNewRomanPSMT,Bold", 9},
+ {"TimesNewRomanPSMT,BoldItalic", 10},
+ {"TimesNewRomanPSMT,Italic", 11},
+ {"ZapfDingbats", 13},
+};
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);
+ }
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name)
+{
+ _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,
+ sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);
+ if (found == NULL) {
+ return -1;
+ }
+ name = g_Base14FontNames[found->m_Index];
+ return found->m_Index;
+}
+int GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)
+{
+ int face_index = 0;
+ FX_LPCBYTE p = pFontData + 8;
+ FX_DWORD nfont = GET_TT_LONG(p);
+ FX_DWORD index;
+ for (index = 0; index < nfont; index ++) {
+ p = pFontData + 12 + index * 4;
+ if (GET_TT_LONG(p) == font_offset) {
+ break;
+ }
+ }
+ if(index >= nfont) {
+ face_index = 0;
+ } else {
+ face_index = index;
+ }
+ return face_index;
+}
+FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ int font_offset, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if (pFontDesc == NULL) {
+ return NULL;
+ }
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ }
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ FX_LPBYTE pData, FX_DWORD size, int font_offset)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 2;
+ pFontDesc->m_pFontData = pData;
+ for (int i = 0; i < 16; i ++) {
+ pFontDesc->m_TTCFace.m_pFaces[i] = NULL;
+ }
+ pFontDesc->m_RefCount ++;
+ key.Format("%d:%d", ttc_size, checksum);
+ m_FaceMap.SetAt(key, pFontDesc);
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Face(library, filename, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+void CFX_FontMgr::ReleaseFace(FXFT_Face face)
+{
+ if (face == NULL) {
+ return;
+ }
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* ttface;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);
+ if (ttface->ReleaseFace(face)) {
+ m_FaceMap.RemoveKey(Key);
+ }
+ }
+}
+extern "C" {
+ extern const unsigned char g_FoxitFixedItalicFontData [18746];
+ extern const unsigned char g_FoxitFixedFontData [17597];
+ extern const unsigned char g_FoxitSansItalicFontData [16339];
+ extern const unsigned char g_FoxitSansFontData [15025];
+ extern const unsigned char g_FoxitSerifItalicFontData [21227];
+ extern const unsigned char g_FoxitSerifFontData [19469];
+ extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];
+ extern const unsigned char g_FoxitFixedBoldFontData [18055];
+ extern const unsigned char g_FoxitSansBoldItalicFontData [16418];
+ extern const unsigned char g_FoxitSansBoldFontData [16344];
+ extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];
+ extern const unsigned char g_FoxitSerifBoldFontData [19395];
+ extern const unsigned char g_FoxitSymbolFontData[16729];
+ extern const unsigned char g_FoxitDingbatsFontData[29513];
+ extern const unsigned char g_FoxitSerifMMFontData[113417];
+ extern const unsigned char g_FoxitSansMMFontData[66919];
+};
+const FoxitFonts g_FoxitFonts[14] = {
+ {g_FoxitFixedFontData, 17597},
+ {g_FoxitFixedBoldFontData, 18055},
+ {g_FoxitFixedBoldItalicFontData, 19151},
+ {g_FoxitFixedItalicFontData, 18746},
+ {g_FoxitSansFontData, 15025},
+ {g_FoxitSansBoldFontData, 16344},
+ {g_FoxitSansBoldItalicFontData, 16418},
+ {g_FoxitSansItalicFontData, 16339},
+ {g_FoxitSerifFontData, 19469},
+ {g_FoxitSerifBoldFontData, 19395},
+ {g_FoxitSerifBoldItalicFontData, 20733},
+ {g_FoxitSerifItalicFontData, 21227},
+ {g_FoxitSymbolFontData, 16729},
+ {g_FoxitDingbatsFontData, 29513},
+};
+void _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)
+{
+ CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);
+}
+FX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)
+{
+ if (index > 15 || index < 0) {
+ return FALSE;
+ }
+ {
+ if (index >= 14) {
+ if (index == 14) {
+ pFontData = g_FoxitSerifMMFontData;
+ size = 113417;
+ } else {
+ pFontData = g_FoxitSansMMFontData;
+ size = 66919;
+ }
+ } else {
+ pFontData = g_FoxitFonts[index].m_pFontData;
+ size = g_FoxitFonts[index].m_dwSize;
+ }
+ }
+ return TRUE;
+}
+CFX_FontMapper::CFX_FontMapper()
+{
+ FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);
+ m_MMFaces[0] = m_MMFaces[1] = NULL;
+ m_pFontInfo = NULL;
+ m_bListLoaded = FALSE;
+ m_pFontEnumerator = NULL;
+}
+CFX_FontMapper::~CFX_FontMapper()
+{
+ for (int i = 0; i < 14; i ++)
+ if (m_FoxitFaces[i]) {
+ FXFT_Done_Face(m_FoxitFaces[i]);
+ }
+ if (m_MMFaces[0]) {
+ FXFT_Done_Face(m_MMFaces[0]);
+ }
+ if (m_MMFaces[1]) {
+ FXFT_Done_Face(m_MMFaces[1]);
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+}
+void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ if (pFontInfo == NULL) {
+ return;
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+ m_pFontInfo = pFontInfo;
+}
+static CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)
+{
+ CFX_ByteString norm(family, -1);
+ norm.Remove(' ');
+ norm.Remove('-');
+ norm.Remove(',');
+ int pos = norm.Find('+');
+ if (pos > 0) {
+ norm = norm.Left(pos);
+ }
+ norm.MakeLower();
+ return norm;
+}
+CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)
+{
+ FX_LPCBYTE ptr = name_table + 2;
+ int name_count = GET_TT_SHORT(ptr);
+ int string_offset = GET_TT_SHORT(ptr + 2);
+ FX_LPCBYTE string_ptr = name_table + string_offset;
+ ptr += 4;
+ for (int i = 0; i < name_count; i ++) {
+ if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {
+ return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));
+ }
+ ptr += 12;
+ }
+ return CFX_ByteString();
+}
+static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+static CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ return _FPDF_ReadStringFromFile(pFile, size);
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)
+{
+ if (m_pFontInfo == NULL) {
+ CFX_ByteString();
+ }
+ CFX_ByteString result;
+ FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);
+ if (size) {
+ FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);
+ if (!buffer) {
+ return result;
+ }
+ m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);
+ result = _FPDF_GetNameFromTT(buffer, 6);
+ FX_Free(buffer);
+ }
+ return result;
+}
+void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {
+ m_CharsetArray.Add((FX_DWORD)charset);
+ m_FaceArray.Add(name);
+ }
+ if (name == m_LastFamily) {
+ return;
+ }
+ FX_LPCBYTE ptr = name;
+ FX_BOOL bLocalized = FALSE;
+ for (int i = 0; i < name.GetLength(); i ++)
+ if (ptr[i] > 0x80) {
+ bLocalized = TRUE;
+ break;
+ }
+ if (bLocalized) {
+ void* hFont = m_pFontInfo->GetFont(name);
+ if (hFont == NULL) {
+ FX_BOOL bExact;
+ hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);
+ if (hFont == NULL) {
+ return;
+ }
+ }
+ CFX_ByteString new_name = GetPSNameFromTT(hFont);
+ if (!new_name.IsEmpty()) {
+ new_name.Insert(0, ' ');
+ m_InstalledTTFonts.Add(new_name);
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ }
+ m_InstalledTTFonts.Add(name);
+ m_LastFamily = name;
+}
+void CFX_FontMapper::LoadInstalledFonts()
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ m_pFontInfo->EnumFontList(this);
+ m_bListLoaded = TRUE;
+}
+CFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)
+{
+ LoadInstalledFonts();
+ int i;
+ for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {
+ CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);
+ if (norm1 == norm_name) {
+ break;
+ }
+ }
+ if (i < 0) {
+ return CFX_ByteString();
+ }
+ CFX_ByteString match = m_InstalledTTFonts[i];
+ if (match[0] == ' ') {
+ match = m_InstalledTTFonts[i + 1];
+ }
+ return match;
+}
+typedef struct _CHARSET_MAP_ {
+ FX_BYTE charset;
+ FX_WORD codepage;
+} CHARSET_MAP;
+static const CHARSET_MAP g_Codepage2CharsetTable[] = {
+ { 1 , 0 },
+ { 2 , 42 },
+ { 254, 437 },
+ { 255, 850 },
+ { 222, 874 },
+ { 128, 932 },
+ { 134, 936 },
+ { 129, 949 },
+ { 136, 950 },
+ { 238, 1250 },
+ { 204, 1251 },
+ { 0, 1252 },
+ { 161, 1253 },
+ { 162, 1254 },
+ { 177, 1255 },
+ { 178, 1256 },
+ { 186, 1257 },
+ { 163, 1258 },
+ { 130, 1361 },
+ { 77, 10000 },
+ { 78, 10001 },
+ { 79, 10003 },
+ { 80, 10008 },
+ { 81, 10002 },
+ { 83, 10005 },
+ { 84, 10004 },
+ { 85, 10006 },
+ { 86, 10081 },
+ { 87, 10021 },
+ { 88, 10029 },
+ { 89, 10007 },
+};
+FX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)
+{
+ FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;
+ FXSYS_assert(iEnd >= 0);
+ FX_INT32 iStart = 0, iMid;
+ do {
+ iMid = (iStart + iEnd) / 2;
+ const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];
+ if (codepage == cp.codepage) {
+ return cp.charset;
+ } else if (codepage < cp.codepage) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ } while (iStart <= iEnd);
+ return 1;
+}
+FX_DWORD _GetCodePageRangeFromCharset(int charset)
+{
+ if (charset == FXFONT_EASTEUROPE_CHARSET) {
+ return 1 << 1;
+ }
+ if (charset == FXFONT_GREEK_CHARSET) {
+ return 1 << 3;
+ }
+ if (charset == FXFONT_TURKISH_CHARSET) {
+ return 1 << 4;
+ }
+ if (charset == FXFONT_HEBREW_CHARSET) {
+ return 1 << 5;
+ }
+ if (charset == FXFONT_ARABIC_CHARSET) {
+ return 1 << 6;
+ }
+ if (charset == FXFONT_BALTIC_CHARSET) {
+ return 1 << 7;
+ }
+ if (charset == FXFONT_THAI_CHARSET) {
+ return 1 << 16;
+ }
+ if (charset == FXFONT_SHIFTJIS_CHARSET) {
+ return 1 << 17;
+ }
+ if (charset == FXFONT_GB2312_CHARSET) {
+ return 1 << 18;
+ }
+ if (charset == FXFONT_CHINESEBIG5_CHARSET) {
+ return 1 << 20;
+ }
+ if (charset == FXFONT_HANGEUL_CHARSET) {
+ return 1 << 19;
+ }
+ if (charset == FXFONT_SYMBOL_CHARSET) {
+ return 1 << 31;
+ }
+ return 1 << 21;
+}
+static int CP2CharSet(int cp)
+{
+ if(cp == 932) {
+ return FXFONT_SHIFTJIS_CHARSET;
+ } else if(cp == 936) {
+ return FXFONT_GB2312_CHARSET;
+ } else if(cp == 949) {
+ return FXFONT_HANGEUL_CHARSET;
+ } else if(cp == 950) {
+ return FXFONT_CHINESEBIG5_CHARSET;
+ }
+ return FXFONT_DEFAULT_CHARSET;
+}
+FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)
+{
+ if (iBaseFont < 12) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[iBaseFont];
+ }
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;
+ pSubstFont->m_ItalicAngle = italic_angle;
+ if (weight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (picthfamily & FXFONT_FF_ROMAN) {
+ pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;
+ pSubstFont->m_Family = "Chrome Serif";
+ if (m_MMFaces[1]) {
+ return m_MMFaces[1];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size;
+ m_pFontMgr->GetStandardFont(pFontData, size, 14);
+ m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[1];
+ }
+ pSubstFont->m_Family = "Chrome Sans";
+ if (m_MMFaces[0]) {
+ return m_MMFaces[0];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 15);
+ m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[0];
+}
+const struct _AltFontFamily {
+ FX_LPCSTR m_pFontName;
+ FX_LPCSTR m_pFontFamily;
+}
+g_AltFontFamilies[] = {
+ {"AGaramondPro", "Adobe Garamond Pro"},
+ {"BankGothicBT-Medium", "BankGothic Md BT"},
+ {"ForteMT", "Forte"},
+};
+extern "C" {
+ static int compareFontFamilyString(const void* key, const void* element)
+ {
+ CFX_ByteString str_key((FX_LPCSTR)key);
+ if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {
+ return 0;
+ }
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);
+ }
+}
+#define FX_FONT_STYLE_None 0x00
+#define FX_FONT_STYLE_Bold 0x01
+#define FX_FONT_STYLE_Italic 0x02
+#define FX_FONT_STYLE_BoldBold 0x04
+static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)
+{
+ if (fontName.Find("Script") >= 0) {
+ if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {
+ fontName = "ScriptMTBold";
+ } else if (fontName.Find("Palace") >= 0) {
+ fontName = "PalaceScriptMT";
+ } else if (fontName.Find("French") >= 0) {
+ fontName = "FrenchScriptMT";
+ } else if (fontName.Find("FreeStyle") >= 0) {
+ fontName = "FreeStyleScript";
+ }
+ return fontName;
+ }
+ _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,
+ sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);
+ if (found == NULL) {
+ return fontName;
+ }
+ return found->m_pFontFamily;
+};
+typedef struct _FX_FontStyle {
+ FX_LPCSTR style;
+ FX_INT32 len;
+} FX_FontStyle;
+const FX_FontStyle g_FontStyles[] = {
+ "Bold", 4,
+ "Italic", 6,
+ "BoldItalic", 10,
+ "Reg", 3,
+ "Regular", 7,
+};
+CFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)
+{
+ CFX_ByteTextBuf buf;
+ if (!iLen || iLen <= iIndex) {
+ return buf.GetByteString();
+ }
+ while (iIndex < iLen) {
+ if (pStyle[iIndex] == ',') {
+ break;
+ }
+ buf.AppendChar(pStyle[iIndex]);
+ ++iIndex;
+ }
+ return buf.GetByteString();
+}
+FX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)
+{
+ FX_INT32 iLen = bsStyle.GetLength();
+ if (!iLen) {
+ return -1;
+ }
+ int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
+ const FX_FontStyle *pStyle = NULL;
+ for (int i = iSize - 1; i >= 0; --i) {
+ pStyle = g_FontStyles + i;
+ if (!pStyle || pStyle->len > iLen) {
+ continue;
+ }
+ if (!bRevert) {
+ if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ } else {
+ if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)
+{
+ if (name == FX_BSTRC("MyriadPro")) {
+ PitchFamily &= ~FXFONT_FF_ROMAN;
+ return TRUE;
+ }
+ return FALSE;
+}
+FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)
+{
+ if (!(flags & FXFONT_USEEXTERNATTR)) {
+ weight = FXFONT_FW_NORMAL;
+ italic_angle = 0;
+ }
+ CFX_ByteString SubstName = name;
+ SubstName.Remove(0x20);
+ if (bTrueType) {
+ if (name[0] == '@') {
+ SubstName = name.Mid(1);
+ }
+ }
+ _PDF_GetStandardFontName(SubstName);
+ if (SubstName == FX_BSTRC("Symbol") && !bTrueType) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ }
+ if (SubstName == FX_BSTRC("ZapfDingbats")) {
+ pSubstFont->m_Family = "Chrome Dingbats";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[13]) {
+ return m_FoxitFaces[13];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 13);
+ m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[13];
+ }
+ int iBaseFont = 0;
+ CFX_ByteString family, style;
+ FX_BOOL bHasComma = FALSE;
+ FX_BOOL bHasHypen = FALSE;
+ int find = SubstName.Find(FX_BSTRC(","), 0);
+ if (find >= 0) {
+ family = SubstName.Left(find);
+ _PDF_GetStandardFontName(family);
+ style = SubstName.Mid(find + 1);
+ bHasComma = TRUE;
+ } else {
+ family = SubstName;
+ }
+ for (; iBaseFont < 12; iBaseFont ++)
+ if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {
+ break;
+ }
+ int PitchFamily = 0;
+ FX_BOOL bItalic = FALSE;
+ FX_DWORD nStyle = 0;
+ FX_BOOL bStyleAvail = FALSE;
+ FX_BOOL bFamilyStyleIsWhole = FALSE;
+ FX_BOOL bNextF = FALSE;
+ if (iBaseFont < 12) {
+ family = g_Base14FontNames[iBaseFont];
+ if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if ((iBaseFont % 4) / 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (iBaseFont < 4) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ if (iBaseFont >= 8) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ } else {
+ if (!bHasComma) {
+ find = family.ReverseFind('-');
+ if (find >= 0) {
+ style = family.Mid(find + 1);
+ family = family.Left(find);
+ bHasHypen = TRUE;
+ }
+ }
+ if (!bHasHypen) {
+ int nLen = family.GetLength();
+ FX_INT32 nRet = GetStyleType(family, TRUE);
+ if (nRet > -1) {
+ family = family.Left(nLen - g_FontStyles[nRet].len);
+ if (nRet == 0) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if (nRet == 1) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (nRet == 2) {
+ nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
+ }
+ }
+ }
+ if (flags & FXFONT_SERIF) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ if (flags & FXFONT_SCRIPT) {
+ PitchFamily |= FXFONT_FF_SCRIPT;
+ }
+ if (flags & FXFONT_FIXED_PITCH) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ }
+ if (!style.IsEmpty()) {
+ int nLen = style.GetLength();
+ FX_LPCSTR pStyle = style;
+ int i = 0;
+ FX_BOOL bFirstItem = TRUE;
+ CFX_ByteString buf;
+ while (i < nLen) {
+ buf = ParseStyle(pStyle, nLen, i);
+ FX_INT32 nRet = GetStyleType(buf, FALSE);
+ if ((i && !bStyleAvail) || (!i && nRet < 0)) {
+ family = SubstName;
+ iBaseFont = 12;
+ break;
+ } else if (nRet >= 0) {
+ bStyleAvail = TRUE;
+ }
+ if (nRet == 0) {
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ if (nRet == 1) {
+ if (bFirstItem) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ } else {
+ family = SubstName;
+ iBaseFont = 12;
+ }
+ break;
+ }
+ if (nRet == 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ i += buf.GetLength() + 1;
+ }
+ }
+ weight = weight ? weight : FXFONT_FW_NORMAL;
+ int old_weight = weight;
+ if (nStyle) {
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ bItalic = TRUE;
+ }
+ FX_BOOL bCJK = FALSE;
+ FX_BOOL bExact = FALSE;
+ int Charset = FXFONT_ANSI_CHARSET;
+ if (WindowCP) {
+ Charset = _GetCharsetFromCodePage(WindowCP);
+ } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {
+ Charset = FXFONT_SYMBOL_CHARSET;
+ }
+ if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
+ Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {
+ bCJK = TRUE;
+ }
+ if (m_pFontInfo == NULL) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ family = _GetFontFamily(family, nStyle);
+ CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));
+ if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {
+ match = MatchInstalledFonts(_TT_NormalizeName(SubstName));
+ }
+ if (match.IsEmpty() && iBaseFont >= 12) {
+ if (!bCJK) {
+ if (!CheckSupportThirdPartFont(family, PitchFamily)) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ } else {
+ pSubstFont->m_bSubstOfCJK = TRUE;
+ if (nStyle) {
+ pSubstFont->m_WeightCJK = weight;
+ } else {
+ pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ pSubstFont->m_bItlicCJK = TRUE;
+ }
+ }
+ } else {
+ italic_angle = 0;
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (!match.IsEmpty() || iBaseFont < 12) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ if (!match.IsEmpty()) {
+ family = match;
+ }
+ if (iBaseFont < 12) {
+ if (nStyle && !(iBaseFont % 4)) {
+ if ((nStyle & 0x3) == 1) {
+ iBaseFont += 1;
+ }
+ if ((nStyle & 0x3) == 2) {
+ iBaseFont += 3;
+ }
+ if ((nStyle & 0x3) == 3) {
+ iBaseFont += 2;
+ }
+ }
+ if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
+ m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ } else {
+ family = g_Base14FontNames[iBaseFont];
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ }
+ } else {
+ if (flags & FXFONT_ITALIC) {
+ bItalic = TRUE;
+ }
+ }
+ bExact = !match.IsEmpty();
+ void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);
+ if (bExact) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ }
+ if (hFont == NULL) {
+ if (bCJK) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ if (!match.IsEmpty()) {
+ hFont = m_pFontInfo->GetFont(match);
+ if (hFont == NULL) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ } else {
+ if (Charset == FXFONT_SYMBOL_CHARSET) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+ if (SubstName == FX_BSTRC("Symbol")) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ } else {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+ }
+#else
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+#endif
+ }
+ if (Charset == FXFONT_ANSI_CHARSET) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ int index = m_CharsetArray.Find(Charset);
+ if (index < 0) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ } else {
+ hFont = m_pFontInfo->GetFont(m_FaceArray[index]);
+ }
+ }
+ }
+ pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);
+ if (hFont == NULL) {
+ return NULL;
+ }
+ m_pFontInfo->GetFaceName(hFont, SubstName);
+ if (Charset == FXFONT_DEFAULT_CHARSET) {
+ m_pFontInfo->GetFontCharset(hFont, Charset);
+ }
+ FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);
+ FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);
+ if(font_size == 0 && ttc_size == 0) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ FXFT_Face face = NULL;
+ if (ttc_size) {
+ FX_BYTE temp[1024];
+ m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
+ FX_DWORD checksum = 0;
+ for (int i = 0; i < 256; i ++) {
+ checksum += ((FX_DWORD*)temp)[i];
+ }
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, ttc_size);
+ if (pFontData) {
+ m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
+ face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,
+ ttc_size - font_size);
+ }
+ }
+ } else {
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, font_size);
+ if (!pFontData) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
+ face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));
+ }
+ }
+ if (face == NULL) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ pSubstFont->m_Family = SubstName;
+ pSubstFont->m_Charset = Charset;
+ FX_BOOL bNeedUpdateWeight = FALSE;
+ if (FXFT_Is_Face_Bold(face)) {
+ if (weight == FXFONT_FW_BOLD) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ } else {
+ if (weight == FXFONT_FW_NORMAL) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ }
+ if (bNeedUpdateWeight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (bItalic && !FXFT_Is_Face_Italic(face)) {
+ if (italic_angle == 0) {
+ italic_angle = -12;
+ } else if (FXSYS_abs(italic_angle) < 5) {
+ italic_angle = 0;
+ }
+ pSubstFont->m_ItalicAngle = italic_angle;
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ return face;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count);
+ void _FTStreamClose(FXFT_Stream stream);
+};
+CFontFileFaceInfo::CFontFileFaceInfo()
+{
+ m_pFile = NULL;
+ m_Face = NULL;
+ m_Charsets = 0;
+ m_FileSize = 0;
+ m_FontOffset = 0;
+ m_Weight = 0;
+ m_bItalic = FALSE;
+ m_PitchFamily = 0;
+}
+CFontFileFaceInfo::~CFontFileFaceInfo()
+{
+ if (m_Face) {
+ FXFT_Done_Face(m_Face);
+ }
+ m_Face = NULL;
+}
+extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);
+#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return NULL;
+}
+#endif
+#if !defined(_FPDFAPI_MINI_)
+CFX_FolderFontInfo::CFX_FolderFontInfo()
+{
+}
+CFX_FolderFontInfo::~CFX_FolderFontInfo()
+{
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ FX_LPVOID value;
+ m_FontList.GetNextAssoc(pos, key, value);
+ delete (CFontFaceInfo*)value;
+ }
+}
+void CFX_FolderFontInfo::AddPath(FX_BSTR path)
+{
+ m_PathList.Add(path);
+}
+void CFX_FolderFontInfo::Release()
+{
+ delete this;
+}
+FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ for (int i = 0; i < m_PathList.GetSize(); i ++) {
+ ScanPath(m_PathList[i]);
+ }
+ return TRUE;
+}
+void CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)
+{
+ void* handle = FX_OpenFolder(path);
+ if (handle == NULL) {
+ return;
+ }
+ CFX_ByteString filename;
+ FX_BOOL bFolder;
+ while (FX_GetNextFile(handle, filename, bFolder)) {
+ if (bFolder) {
+ if (filename == "." || filename == "..") {
+ continue;
+ }
+ } else {
+ CFX_ByteString ext = filename.Right(4);
+ ext.MakeUpper();
+ if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") {
+ continue;
+ }
+ }
+ CFX_ByteString fullpath = path;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ fullpath += "\\";
+#else
+ fullpath += "/";
+#endif
+ fullpath += filename;
+ if (bFolder) {
+ ScanPath(fullpath);
+ } else {
+ ScanFile(fullpath);
+ }
+ }
+ FX_CloseFolder(handle);
+}
+void CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)
+{
+ FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");
+ if (pFile == NULL) {
+ return;
+ }
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);
+ FX_DWORD filesize = FXSYS_ftell(pFile);
+ FX_BYTE buffer[16];
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);
+ if (GET_TT_LONG(buffer) == 0x74746366) {
+ FX_DWORD nFaces = GET_TT_LONG(buffer + 8);
+ FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);
+ if (!offsets) {
+ FXSYS_fclose(pFile);
+ return;
+ }
+ readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);
+ for (FX_DWORD i = 0; i < nFaces; i ++) {
+ FX_LPBYTE p = offsets + i * 4;
+ ReportFace(path, pFile, filesize, GET_TT_LONG(p));
+ }
+ FX_Free(offsets);
+ } else {
+ ReportFace(path, pFile, filesize, 0);
+ }
+ FXSYS_fclose(pFile);
+}
+void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)
+{
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ char buffer[16];
+ if (!FXSYS_fread(buffer, 12, 1, pFile)) {
+ return;
+ }
+ FX_DWORD nTables = GET_TT_SHORT(buffer + 4);
+ CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);
+ CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
+ CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);
+ CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);
+ if (style != "Regular") {
+ facename += " " + style;
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(facename, p)) {
+ return;
+ }
+ CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;
+ if (!pInfo) {
+ return;
+ }
+ pInfo->m_FilePath = path;
+ pInfo->m_FaceName = facename;
+ pInfo->m_FontTables = tables;
+ pInfo->m_FontOffset = offset;
+ pInfo->m_FileSize = filesize;
+ pInfo->m_Charsets = 0;
+ CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
+ if (os2.GetLength() >= 86) {
+ FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;
+ FX_DWORD codepages = GET_TT_LONG(p);
+ if (codepages & (1 << 17)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;
+ }
+ if (codepages & (1 << 18)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_GB;
+ }
+ if (codepages & (1 << 20)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_BIG5;
+ }
+ if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;
+ }
+ if (codepages & (1 << 31)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;
+ }
+ }
+ m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_ANSI;
+ pInfo->m_Styles = 0;
+ if (style.Find(FX_BSTRC("Bold")) > -1) {
+ pInfo->m_Styles |= FXFONT_BOLD;
+ }
+ if (style.Find(FX_BSTRC("Italic")) > -1 || style.Find(FX_BSTRC("Oblique")) > -1) {
+ pInfo->m_Styles |= FXFONT_ITALIC;
+ }
+ if (facename.Find(FX_BSTRC("Serif")) > -1) {
+ pInfo->m_Styles |= FXFONT_SERIF;
+ }
+ m_FontList.SetAt(facename, pInfo);
+}
+void* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)
+{
+ return NULL;
+}
+void* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)
+{
+ FX_LPVOID p;
+ if (!m_FontList.Lookup(face, p)) {
+ return NULL;
+ }
+ return p;
+}
+FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ if (hFont == NULL) {
+ return 0;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ FXSYS_FILE* pFile = NULL;
+ if (size > 0) {
+ pFile = FXSYS_fopen(pFont->m_FilePath, "rb");
+ if (pFile == NULL) {
+ return 0;
+ }
+ }
+ FX_DWORD datasize = 0;
+ FX_DWORD offset;
+ if (table == 0) {
+ datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;
+ offset = 0;
+ } else if (table == 0x74746366) {
+ datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;
+ offset = 0;
+ } else {
+ FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;
+ if (GET_TT_LONG(p) == table) {
+ offset = GET_TT_LONG(p + 8);
+ datasize = GET_TT_LONG(p + 12);
+ }
+ }
+ }
+ if (datasize && size >= datasize && pFile) {
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);
+ }
+ if (pFile) {
+ FXSYS_fclose(pFile);
+ }
+ return datasize;
+}
+void CFX_FolderFontInfo::DeleteFont(void* hFont)
+{
+}
+FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ if (hFont == NULL) {
+ return FALSE;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ name = pFont->m_FaceName;
+ return TRUE;
+}
+FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ return FALSE;
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
new file mode 100644
index 0000000000..33cfcfe722
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_linux.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "text_int.h"
+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+void CFX_FaceCache::InitPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD argb)
+{
+ return FALSE;
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias)
+{
+ return NULL;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+}
+#endif
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+class CFX_LinuxFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+ FX_BOOL ParseFontCfg();
+ void* FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);
+};
+#define LINUX_GPNAMESIZE 6
+static const struct {
+ FX_LPCSTR NameArr[LINUX_GPNAMESIZE];
+}
+LinuxGpFontList[] = {
+ {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},
+ {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},
+ {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+ {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+};
+static const FX_LPCSTR g_LinuxGbFontList[] = {
+ "AR PL UMing CN Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai CN",
+};
+static const FX_LPCSTR g_LinuxB5FontList[] = {
+ "AR PL UMing TW Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai TW",
+};
+static const FX_LPCSTR g_LinuxHGFontList[] = {
+ "UnDotum",
+};
+static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)
+{
+ CFX_ByteString face = facearr;
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ return 2;
+ } else {
+ return 3;
+ }
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ return 0;
+ }
+ return 2;
+}
+void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p = NULL;
+ FX_BOOL bCJK = TRUE;
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET: {
+ FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);
+ if (index < 0) {
+ break;
+ }
+ for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)
+ if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_GB2312_CHARSET: {
+ static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_gbCount; i++)
+ if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET: {
+ static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_b5Count; i++)
+ if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_HANGEUL_CHARSET: {
+ static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_hgCount; i++)
+ if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ default:
+ bCJK = FALSE;
+ break;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
+}
+static FX_DWORD _LinuxGetCharset(int charset)
+{
+ switch(charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ return CHARSET_FLAG_SHIFTJIS;
+ case FXFONT_GB2312_CHARSET:
+ return CHARSET_FLAG_GB;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ return CHARSET_FLAG_BIG5;
+ case FXFONT_HANGEUL_CHARSET:
+ return CHARSET_FLAG_KOREAN;
+ case FXFONT_SYMBOL_CHARSET:
+ return CHARSET_FLAG_SYMBOL;
+ case FXFONT_ANSI_CHARSET:
+ return CHARSET_FLAG_ANSI;
+ default:
+ break;
+ }
+ return 0;
+}
+static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)
+{
+ FX_INT32 iSimilarValue = 0;
+ if ((style & FXFONT_BOLD) == (weight > 400)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_ITALIC) == bItalic) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
+ iSimilarValue += 8;
+ }
+ if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ iSimilarValue += 8;
+ }
+ return iSimilarValue;
+}
+void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)
+{
+ CFontFaceInfo* pFind = NULL;
+ FX_DWORD charset_flag = _LinuxGetCharset(charset);
+ FX_INT32 iBestSimilar = 0;
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString bsName;
+ CFontFaceInfo* pFont = NULL;
+ m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);
+ if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {
+ continue;
+ }
+ FX_INT32 iSimilarValue = 0;
+ FX_INT32 index = bsName.Find(family);
+ if (bMatchName && index < 0) {
+ continue;
+ }
+ if (!bMatchName && index > 0) {
+ iSimilarValue += 64;
+ }
+ iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
+ if (iSimilarValue > iBestSimilar) {
+ iBestSimilar = iSimilarValue;
+ pFind = pFont;
+ }
+ }
+ return pFind;
+}
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ if (!pInfo->ParseFontCfg()) {
+ pInfo->AddPath("/usr/share/fonts");
+ pInfo->AddPath("/usr/share/X11/fonts/Type1");
+ pInfo->AddPath("/usr/share/X11/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return pInfo;
+}
+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()
+{
+ return FALSE;
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_path.cpp b/core/src/fxge/ge/fx_ge_path.cpp
new file mode 100644
index 0000000000..fc6ee52f1f
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_path.cpp
@@ -0,0 +1,654 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fxge/fx_ge.h"
+CFX_ClipRgn::CFX_ClipRgn(int width, int height)
+{
+ m_Type = RectI;
+ m_Box.left = m_Box.top = 0;
+ m_Box.right = width;
+ m_Box.bottom = height;
+}
+CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+}
+CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)
+{
+ m_Type = src.m_Type;
+ m_Box = src.m_Box;
+ m_Mask = src.m_Mask;
+}
+CFX_ClipRgn::~CFX_ClipRgn()
+{
+}
+void CFX_ClipRgn::Reset(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+ m_Mask.SetNull();
+}
+void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)
+{
+ if (m_Type == RectI) {
+ m_Box.Intersect(rect);
+ return;
+ }
+ if (m_Type == MaskF) {
+ IntersectMaskRect(rect, m_Box, m_Mask);
+ return;
+ }
+}
+void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ m_Type = MaskF;
+ m_Box = rect;
+ m_Box.Intersect(mask_rect);
+ if (m_Box.IsEmpty()) {
+ m_Type = RectI;
+ return;
+ } else if (m_Box == mask_rect) {
+ m_Mask = Mask;
+ return;
+ }
+ CFX_DIBitmap* new_dib = m_Mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
+ for (int row = m_Box.top; row < m_Box.bottom; row ++) {
+ FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);
+ FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);
+ for (int col = m_Box.left; col < m_Box.right; col ++) {
+ dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];
+ }
+ }
+}
+void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
+ FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());
+ if (m_Type == RectI) {
+ IntersectMaskRect(m_Box, mask_box, Mask);
+ return;
+ }
+ if (m_Type == MaskF) {
+ FX_RECT new_box = m_Box;
+ new_box.Intersect(mask_box);
+ if (new_box.IsEmpty()) {
+ m_Type = RectI;
+ m_Mask.SetNull();
+ m_Box = new_box;
+ return;
+ }
+ CFX_DIBitmapRef new_mask;
+ CFX_DIBitmap* new_dib = new_mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
+ const CFX_DIBitmap* old_dib = m_Mask;
+ for (int row = new_box.top; row < new_box.bottom; row ++) {
+ FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();
+ FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();
+ FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();
+ for (int col = new_box.left; col < new_box.right; col ++) {
+ new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;
+ }
+ }
+ m_Box = new_box;
+ m_Mask = new_mask;
+ return;
+ }
+ ASSERT(FALSE);
+}
+CFX_PathData::CFX_PathData()
+{
+ m_PointCount = m_AllocCount = 0;
+ m_pPoints = NULL;
+}
+CFX_PathData::~CFX_PathData()
+{
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+}
+FX_BOOL CFX_PathData::SetPointCount(int nPoints)
+{
+ m_PointCount = nPoints;
+ if (m_AllocCount < nPoints) {
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ m_pPoints = NULL;
+ }
+ m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!m_pPoints) {
+ return FALSE;
+ }
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::AllocPointCount(int nPoints)
+{
+ if (m_AllocCount < nPoints) {
+ FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!pNewBuf) {
+ return FALSE;
+ }
+ if (m_PointCount) {
+ FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));
+ }
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+ m_pPoints = pNewBuf;
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+CFX_PathData::CFX_PathData(const CFX_PathData& src)
+{
+ m_pPoints = NULL;
+ m_PointCount = m_AllocCount = src.m_PointCount;
+ m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
+ if (!m_pPoints) {
+ return;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+}
+void CFX_PathData::TrimPoints(int nPoints)
+{
+ if (m_PointCount <= nPoints) {
+ return;
+ }
+ SetPointCount(nPoints);
+}
+FX_BOOL CFX_PathData::AddPointCount(int addPoints)
+{
+ int new_count = m_PointCount + addPoints;
+ if (!AllocPointCount(new_count)) {
+ return FALSE;
+ }
+ m_PointCount = new_count;
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(pSrc->m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));
+ if (pMatrix == NULL) {
+ return TRUE;
+ }
+ for (int i = 0; i < pSrc->m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);
+ }
+ return TRUE;
+}
+void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)
+{
+ ASSERT(index < m_PointCount);
+ m_pPoints[index].m_PointX = x;
+ m_pPoints[index].m_PointY = y;
+ m_pPoints[index].m_Flag = flag;
+}
+FX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(5)) {
+ return FALSE;
+ }
+ FX_PATHPOINT* pPoints = m_pPoints + old_count;
+ pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;
+ pPoints[2].m_PointX = pPoints[3].m_PointX = right;
+ pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;
+ pPoints[1].m_PointY = pPoints[2].m_PointY = top;
+ pPoints[0].m_Flag = FXPT_MOVETO;
+ pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
+ pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
+ return TRUE;
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox() const
+{
+ CFX_FloatRect rect;
+ if (m_PointCount) {
+ rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);
+ for (int i = 1; i < m_PointCount; i ++) {
+ rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+ }
+ return rect;
+}
+static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT hw)
+{
+ if (start_x == end_x) {
+ if (start_y == end_y) {
+ rect.UpdateRect(end_x + hw, end_y + hw);
+ rect.UpdateRect(end_x - hw, end_y - hw);
+ return;
+ }
+ FX_FLOAT point_y;
+ if (end_y < start_y) {
+ point_y = end_y - hw;
+ } else {
+ point_y = end_y + hw;
+ }
+ rect.UpdateRect(end_x + hw, point_y);
+ rect.UpdateRect(end_x - hw, point_y);
+ return;
+ } else if (start_y == end_y) {
+ FX_FLOAT point_x;
+ if (end_x < start_x) {
+ point_x = end_x - hw;
+ } else {
+ point_x = end_x + hw;
+ }
+ rect.UpdateRect(point_x, end_y + hw);
+ rect.UpdateRect(point_x, end_y - hw);
+ return;
+ }
+ FX_FLOAT dx = end_x - start_x;
+ FX_FLOAT dy = end_y - start_y;
+ FX_FLOAT ll = FXSYS_sqrt2(dx, dy);
+ FX_FLOAT mx = end_x + hw * dx / ll;
+ FX_FLOAT my = end_y + hw * dy / ll;
+ FX_FLOAT dx1 = hw * dy / ll;
+ FX_FLOAT dy1 = hw * dx / ll;
+ rect.UpdateRect(mx - dx1, my + dy1);
+ rect.UpdateRect(mx + dx1, my - dy1);
+}
+static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,
+ FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT half_width, FX_FLOAT miter_limit)
+{
+ FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;
+ FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;
+ FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;
+ if (bStartVert && bEndVert) {
+ int start_dir = middle_y > start_y ? 1 : -1;
+ FX_FLOAT point_y = middle_y + half_width * start_dir;
+ rect.UpdateRect(middle_x + half_width, point_y);
+ rect.UpdateRect(middle_x - half_width, point_y);
+ return;
+ }
+ if (!bStartVert) {
+ start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);
+ start_c = middle_y - FXSYS_Mul(start_k, middle_x);
+ start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);
+ start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));
+ }
+ if (!bEndVert) {
+ end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);
+ end_c = middle_y - FXSYS_Mul(end_k, middle_x);
+ end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);
+ end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));
+ }
+ if (bStartVert) {
+ FX_FLOAT outside_x = start_x;
+ if (end_x < start_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;
+ } else {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (bEndVert) {
+ FX_FLOAT outside_x = end_x;
+ if (start_x < end_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;
+ } else {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {
+ int start_dir = middle_x > start_x ? 1 : -1;
+ int end_dir = end_x > middle_x ? 1 : -1;
+ if (start_dir == end_dir) {
+ _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);
+ }
+ return;
+ }
+ FX_FLOAT start_outside_c = start_c;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ start_outside_c += start_dc;
+ } else {
+ start_outside_c -= start_dc;
+ }
+ FX_FLOAT end_outside_c = end_c;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ end_outside_c += end_dc;
+ } else {
+ end_outside_c -= end_dc;
+ }
+ FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);
+ FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;
+ rect.UpdateRect(join_x, join_y);
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
+{
+ CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);
+ int iPoint = 0;
+ FX_FLOAT half_width = line_width;
+ int iStartPoint, iEndPoint, iMiddlePoint;
+ FX_BOOL bJoin;
+ while (iPoint < m_PointCount) {
+ if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint + 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {
+ rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);
+ rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);
+ iPoint += 2;
+ }
+ if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint - 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ iStartPoint = iPoint - 1;
+ iMiddlePoint = iPoint;
+ iEndPoint = iPoint + 1;
+ bJoin = TRUE;
+ }
+ }
+ FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;
+ FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;
+ FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;
+ FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;
+ if (bJoin) {
+ FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;
+ FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;
+ _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);
+ }
+ iPoint ++;
+ }
+ return rect;
+}
+void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)
+{
+ if (pMatrix == NULL) {
+ return;
+ }
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+}
+const int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const
+{
+ if (m_PointCount < 3) {
+ return FALSE;
+ }
+ if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&
+ (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO
+ && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {
+ NewPath.AddPointCount(2);
+ if (bAdjust) {
+ if (pMatrix) {
+ FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ pMatrix->SetIdentity();
+ } else {
+ FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ }
+ } else {
+ NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {
+ bThin = TRUE;
+ }
+ return TRUE;
+ }
+ if (((m_PointCount > 3) && (m_PointCount % 2))) {
+ int mid = m_PointCount / 2;
+ FX_BOOL bZeroArea = FALSE;
+ CFX_PathData t_path;
+ for (int i = 0; i < mid; i++) {
+ if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX
+ && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&
+ ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {
+ bZeroArea = TRUE;
+ break;
+ }
+ int new_count = t_path.GetPointCount();
+ t_path.AddPointCount(2);
+ t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);
+ t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);
+ }
+ if (!bZeroArea) {
+ NewPath.Append(&t_path, NULL);
+ bThin = TRUE;
+ return TRUE;
+ }
+ }
+ int stratPoint = 0;
+ int next = 0, i;
+ for (i = 0; i < m_PointCount; i++) {
+ int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO) {
+ stratPoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;
+ if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {
+ if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)
+ && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)
+ < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)
+ && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)
+ < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&
+ m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY
+ && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);
+ bThin = TRUE;
+ }
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ i += 2;
+ continue;
+ }
+ }
+ if (m_PointCount > 3 && NewPath.GetPointCount()) {
+ bThin = TRUE;
+ }
+ if (NewPath.GetPointCount() == 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::IsRect() const
+{
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
+ m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ for (int i = 1; i < 4; i ++) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {
+ return FALSE;
+ }
+ }
+ return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
+}
+FX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const
+{
+ if (pMatrix == NULL) {
+ if (!IsRect()) {
+ return FALSE;
+ }
+ if (pRect) {
+ pRect->left = m_pPoints[0].m_PointX;
+ pRect->right = m_pPoints[2].m_PointX;
+ pRect->bottom = m_pPoints[0].m_PointY;
+ pRect->top = m_pPoints[2].m_PointY;
+ pRect->Normalize();
+ }
+ return TRUE;
+ }
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ FX_FLOAT x[5], y[5];
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);
+ if (i) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
+ return FALSE;
+ }
+ }
+ }
+ if (pRect) {
+ pRect->left = x[0];
+ pRect->right = x[2];
+ pRect->bottom = y[0];
+ pRect->top = y[2];
+ pRect->Normalize();
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Copy(const CFX_PathData &src)
+{
+ if (!SetPointCount(src.m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+ return TRUE;
+}
+CFX_GraphStateData::CFX_GraphStateData()
+{
+ m_LineCap = LineCapButt;
+ m_DashCount = 0;
+ m_DashArray = NULL;
+ m_DashPhase = 0;
+ m_LineJoin = LineJoinMiter;
+ m_MiterLimit = 10 * 1.0f;
+ m_LineWidth = 1.0f;
+}
+CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)
+{
+ m_DashArray = NULL;
+ Copy(src);
+}
+void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)
+{
+ m_LineCap = src.m_LineCap;
+ m_DashCount = src.m_DashCount;
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashPhase = src.m_DashPhase;
+ m_LineJoin = src.m_LineJoin;
+ m_MiterLimit = src.m_MiterLimit;
+ m_LineWidth = src.m_LineWidth;
+ if (m_DashCount) {
+ m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);
+ if (!m_DashArray) {
+ return;
+ }
+ FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
+ }
+}
+CFX_GraphStateData::~CFX_GraphStateData()
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+}
+void CFX_GraphStateData::SetDashCount(int count)
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashCount = count;
+ if (count == 0) {
+ return;
+ }
+ m_DashArray = FX_Alloc(FX_FLOAT, count);
+}
diff --git a/core/src/fxge/ge/fx_ge_ps.cpp b/core/src/fxge/ge/fx_ge_ps.cpp
new file mode 100644
index 0000000000..a39ab2dee0
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_ps.cpp
@@ -0,0 +1,657 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+struct PSGlyph {
+ CFX_Font* m_pFont;
+ FX_DWORD m_GlyphIndex;
+ FX_BOOL m_bGlyphAdjust;
+ FX_FLOAT m_AdjustMatrix[4];
+};
+class CPSFont : public CFX_Object
+{
+public:
+ PSGlyph m_Glyphs[256];
+ int m_nGlyphs;
+};
+CFX_PSRenderer::CFX_PSRenderer()
+{
+ m_pOutput = NULL;
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_bInited = FALSE;
+}
+CFX_PSRenderer::~CFX_PSRenderer()
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pFont = m_PSFontList[i];
+ delete pFont;
+ }
+}
+#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)
+void CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)
+{
+ m_PSLevel = pslevel;
+ m_pOutput = pOutput;
+ m_ClipBox.left = m_ClipBox.top = 0;
+ m_ClipBox.right = width;
+ m_ClipBox.bottom = height;
+ m_bCmykOutput = bCmykOutput;
+}
+FX_BOOL CFX_PSRenderer::StartRendering()
+{
+ if (m_bInited) {
+ return TRUE;
+ }
+ static const char init_str[] = "\nsave\n/im/initmatrix load def\n"
+ "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\n"
+ "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\n"
+ "/rg/setrgbcolor load def/k/setcmykcolor load def\n"
+ "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\n"
+ "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"
+ "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\n"
+ "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\n"
+ ;
+ OUTPUT_PS(init_str);
+ m_bInited = TRUE;
+ return TRUE;
+}
+void CFX_PSRenderer::EndRendering()
+{
+ if (m_bInited) {
+ OUTPUT_PS("\nrestore\n");
+ }
+ m_bInited = FALSE;
+}
+void CFX_PSRenderer::SaveState()
+{
+ StartRendering();
+ OUTPUT_PS("q\n");
+ m_ClipBoxStack.Add(m_ClipBox);
+}
+void CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)
+{
+ StartRendering();
+ if (bKeepSaved) {
+ OUTPUT_PS("Q\nq\n");
+ } else {
+ OUTPUT_PS("Q\n");
+ }
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);
+ if (!bKeepSaved) {
+ m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);
+ }
+}
+void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+ int nPoints = pPathData->GetPointCount();
+ CFX_ByteTextBuf buf;
+ buf.EstimateSize(nPoints * 10);
+ for (int i = 0; i < nPoints; i ++) {
+ FX_BYTE flag = pPathData->GetFlag(i);
+ FX_FLOAT x = pPathData->GetPointX(i);
+ FX_FLOAT y = pPathData->GetPointY(i);
+ if (pObject2Device) {
+ pObject2Device->Transform(x, y);
+ }
+ buf << x << FX_BSTRC(" ") << y;
+ switch (flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ buf << FX_BSTRC(" m ");
+ break;
+ case FXPT_LINETO:
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" l h ");
+ } else {
+ buf << FX_BSTRC(" l ");
+ }
+ break;
+ case FXPT_BEZIERTO: {
+ FX_FLOAT x1 = pPathData->GetPointX(i + 1);
+ FX_FLOAT x2 = pPathData->GetPointX(i + 2);
+ FX_FLOAT y1 = pPathData->GetPointY(i + 1);
+ FX_FLOAT y2 = pPathData->GetPointY(i + 2);
+ if (pObject2Device) {
+ pObject2Device->Transform(x1, y1);
+ pObject2Device->Transform(x2, y2);
+ }
+ buf << FX_BSTRC(" ") << x1 << FX_BSTRC(" ") << y1 << FX_BSTRC(" ") << x2 << FX_BSTRC(" ") << y2;
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" c h\n");
+ } else {
+ buf << FX_BSTRC(" c\n");
+ }
+ i += 2;
+ break;
+ }
+ }
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ StartRendering();
+ OutputPath(pPathData, pObject2Device);
+ CFX_FloatRect rect = pPathData->GetBoundingBox();
+ if (pObject2Device) {
+ rect.Transform(pObject2Device);
+ }
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ OUTPUT_PS("W n\n");
+ } else {
+ OUTPUT_PS("W* n\n");
+ }
+}
+void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ StartRendering();
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ OutputPath(pPathData, NULL);
+ CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ rect.Transform(pObject2Device);
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if (pObject2Device) {
+ OUTPUT_PS("strokepath W n sm\n");
+ } else {
+ OUTPUT_PS("strokepath W n\n");
+ }
+}
+FX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform
+ )
+{
+ StartRendering();
+ int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+ if (fill_alpha && fill_alpha < 255) {
+ return FALSE;
+ }
+ if (stroke_alpha && stroke_alpha < 255) {
+ return FALSE;
+ }
+ if (fill_alpha == 0 && stroke_alpha == 0) {
+ return FALSE;
+ }
+ if (stroke_alpha) {
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ }
+ OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);
+ if (fill_mode && fill_alpha) {
+ SetColor(fill_color, alpha_flag, pIccTransform);
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q f Q ");
+ } else {
+ OUTPUT_PS("f");
+ }
+ } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q F Q ");
+ } else {
+ OUTPUT_PS("F");
+ }
+ }
+ }
+ if (stroke_alpha) {
+ SetColor(stroke_color, alpha_flag, pIccTransform);
+ if (pObject2Device) {
+ OUTPUT_PS("s sm");
+ } else {
+ OUTPUT_PS("s");
+ }
+ }
+ OUTPUT_PS("\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)
+{
+ CFX_ByteTextBuf buf;
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {
+ buf << pGraphState->m_LineCap << FX_BSTRC(" J\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||
+ FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {
+ buf << FX_BSTRC("[");
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ buf << pGraphState->m_DashArray[i] << FX_BSTRC(" ");
+ }
+ buf << FX_BSTRC("]") << pGraphState->m_DashPhase << FX_BSTRC(" d\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {
+ buf << pGraphState->m_LineJoin << FX_BSTRC(" j\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {
+ buf << pGraphState->m_LineWidth << FX_BSTRC(" w\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {
+ buf << pGraphState->m_MiterLimit << FX_BSTRC(" M\n");
+ }
+ m_CurGraphState.Copy(*pGraphState);
+ m_bGraphStateSet = TRUE;
+ if (buf.GetSize()) {
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+static void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {
+ FX_Free(src_buf);
+ } else {
+ dest_buf = src_buf;
+ dest_size = (width + 7) / 8 * height;
+ }
+}
+static void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)
+{
+ output_buf = src_buf;
+ output_size = src_size;
+ filter = "";
+ if (src_size < 1024) {
+ return;
+ }
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ FX_LPBYTE dest_buf = NULL;
+ FX_DWORD dest_size = src_size;
+ if (PSLevel >= 3) {
+ if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/FlateDecode filter ";
+ }
+ } else {
+ if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/RunLengthDecode filter ";
+ }
+ }
+ if (dest_size < src_size) {
+ output_buf = dest_buf;
+ output_size = dest_size;
+ } else {
+ filter = NULL;
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ }
+}
+FX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),
+ (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));
+ return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),
+ (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));
+ return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {
+ return TRUE;
+ }
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);
+ if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {
+ return FALSE;
+ }
+ OUTPUT_PS("q\n");
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("[") << pMatrix->a << FX_BSTRC(" ") << pMatrix->b << FX_BSTRC(" ") <<
+ pMatrix->c << FX_BSTRC(" ") << pMatrix->d << FX_BSTRC(" ") << pMatrix->e <<
+ FX_BSTRC(" ") << pMatrix->f << FX_BSTRC("]cm ");
+ int width = pSource->GetWidth();
+ int height = pSource->GetHeight();
+ buf << width << FX_BSTRC(" ") << height;
+ if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {
+ int pitch = (width + 7) / 8;
+ FX_DWORD src_size = height * pitch;
+ FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
+ if (!src_buf) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pSource->GetScanline(row);
+ FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);
+ }
+ FX_LPBYTE output_buf;
+ FX_DWORD output_size;
+ FaxCompressData(src_buf, width, height, output_buf, output_size);
+ if (pSource->IsAlphaMask()) {
+ SetColor(color, alpha_flag, pIccTransform);
+ m_bColorSet = FALSE;
+ buf << FX_BSTRC(" true[");
+ } else {
+ buf << FX_BSTRC(" 1[");
+ }
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height <<
+ FX_BSTRC("]currentfile/ASCII85Decode filter ");
+ if (output_buf != src_buf)
+ buf << FX_BSTRC("<</K -1/EndOfBlock false/Columns ") << width << FX_BSTRC("/Rows ") << height <<
+ FX_BSTRC(">>/CCITTFaxDecode filter ");
+ if (pSource->IsAlphaMask()) {
+ buf << FX_BSTRC("iM\n");
+ } else {
+ buf << FX_BSTRC("false 1 colorimage\n");
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ } else {
+ CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;
+ if (pIccTransform) {
+ FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;
+ pConverted = pSource->CloneConvert(format, NULL, pIccTransform);
+ } else {
+ switch (pSource->GetFormat()) {
+ case FXDIB_1bppRgb:
+ case FXDIB_Rgb32:
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ break;
+ case FXDIB_8bppRgb:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ }
+ break;
+ case FXDIB_1bppCmyk:
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ break;
+ case FXDIB_8bppCmyk:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (pConverted == NULL) {
+ OUTPUT_PS("\nQ\n");
+ return FALSE;
+ }
+ int Bpp = pConverted->GetBPP() / 8;
+ FX_LPBYTE output_buf = NULL;
+ FX_STRSIZE output_size = 0;
+ FX_LPCSTR filter = NULL;
+ if (flags & FXRENDER_IMAGE_LOSSY) {
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {
+ filter = "/DCTDecode filter ";
+ }
+ }
+ if (filter == NULL) {
+ int src_pitch = width * Bpp;
+ output_size = height * src_pitch;
+ output_buf = FX_Alloc(FX_BYTE, output_size);
+ if (!output_buf) {
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pConverted->GetScanline(row);
+ FX_LPBYTE dest_scan = output_buf + row * src_pitch;
+ if (Bpp == 3) {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = *src_scan;
+ src_scan += 3;
+ }
+ } else {
+ FXSYS_memcpy32(dest_scan, src_scan, src_pitch);
+ }
+ }
+ FX_LPBYTE compressed_buf;
+ FX_DWORD compressed_size;
+ PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);
+ if (output_buf != compressed_buf) {
+ FX_Free(output_buf);
+ }
+ output_buf = compressed_buf;
+ output_size = compressed_size;
+ }
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ buf << FX_BSTRC(" 8[");
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height << FX_BSTRC("]");
+ buf << FX_BSTRC("currentfile/ASCII85Decode filter ");
+ if (filter) {
+ buf << filter;
+ }
+ buf << FX_BSTRC("false ") << Bpp;
+ buf << FX_BSTRC(" colorimage\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ }
+ OUTPUT_PS("\nQ\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BOOL bCMYK = FALSE;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ FX_LPBYTE pColor = (FX_LPBYTE)&color;
+ pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);
+ color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ bCMYK = m_bCmykOutput;
+ } else {
+ bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ }
+ if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {
+ CFX_ByteTextBuf buf;
+ if (bCMYK) {
+ buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(" ")
+ << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(" k\n");
+ } else {
+ buf << FXARGB_R(color) / 255.0 << FX_BSTRC(" ") << FXARGB_G(color) / 255.0 << FX_BSTRC(" ")
+ << FXARGB_B(color) / 255.0 << FX_BSTRC(" rg\n");
+ }
+ if (bCMYK == m_bCmykOutput) {
+ m_bColorSet = TRUE;
+ m_LastColor = color;
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,
+ int& ps_fontnum, int &ps_glyphindex)
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pPSFont = m_PSFontList[i];
+ for (int j = 0; j < pPSFont->m_nGlyphs; j ++)
+ if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {
+ if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||
+ (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&
+ (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {
+ ps_fontnum = i;
+ ps_glyphindex = j;
+ return;
+ }
+ }
+ }
+ if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {
+ CPSFont* pPSFont = FX_NEW CPSFont;
+ if (!pPSFont) {
+ return;
+ }
+ pPSFont->m_nGlyphs = 0;
+ m_PSFontList.Add(pPSFont);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n"
+ "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\n"
+ "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n"
+ "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\n"
+ "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\n"
+ "currentdict end\n");
+ buf << FX_BSTRC("/X") << m_PSFontList.GetSize() - 1 << FX_BSTRC(" exch definefont pop\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ buf.Clear();
+ }
+ ps_fontnum = m_PSFontList.GetSize() - 1;
+ CPSFont* pPSFont = m_PSFontList[ps_fontnum];
+ ps_glyphindex = pPSFont->m_nGlyphs;
+ pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;
+ pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;
+ pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;
+ if (charpos.m_bGlyphAdjust) {
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];
+ }
+ pPSFont->m_nGlyphs ++;
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);
+ const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPathData == NULL) {
+ return;
+ }
+ CFX_PathData TransformedPath(*pPathData);
+ if (charpos.m_bGlyphAdjust) {
+ TransformedPath.Transform(&matrix);
+ }
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/CharProcs get begin/")
+ << ps_glyphindex << FX_BSTRC("{");
+ buf << FX_BSTRC("n ");
+ for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {
+ FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);
+ switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {
+ case FXPT_MOVETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" m\n");
+ break;
+ }
+ case FXPT_LINETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" l\n");
+ break;
+ }
+ case FXPT_BEZIERTO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 2) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 2) << FX_BSTRC(" c\n");
+ p += 2;
+ break;
+ }
+ }
+ }
+ buf << FX_BSTRC("f");
+ buf << FX_BSTRC("}bind def end\n");
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/Encoding get ") << ps_glyphindex
+ << FX_BSTRC("/") << ps_glyphindex << FX_BSTRC(" put\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+FX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {
+ return TRUE;
+ }
+ SetColor(color, alpha_flag, pIccTransform);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("q[") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ")
+ << pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d;
+ buf << FX_BSTRC(" ") << pObject2Device->e << FX_BSTRC(" ") << pObject2Device->f << "]cm\n";
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ int last_fontnum = -1;
+ for (int i = 0; i < nChars; i ++) {
+ int ps_fontnum, ps_glyphindex;
+ FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);
+ if (last_fontnum != ps_fontnum) {
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff ") << font_size
+ << FX_BSTRC(" Fs Sf ");
+ last_fontnum = ps_fontnum;
+ }
+ buf << pCharPos[i].m_OriginX << FX_BSTRC(" ")
+ << pCharPos[i].m_OriginY << FX_BSTRC(" m");
+ CFX_ByteString hex;
+ hex.Format("<%02X>", ps_glyphindex);
+ buf << hex << FX_BSTRC("Tj\n");
+ }
+ buf << FX_BSTRC("Q\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ return TRUE;
+}
+void CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)
+{
+ FX_LPBYTE dest_buf;
+ FX_DWORD dest_size;
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {
+ m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);
+ FX_Free(dest_buf);
+ } else {
+ m_pOutput->OutputPS((FX_LPCSTR)data, len);
+ }
+}
diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp
new file mode 100644
index 0000000000..3c08cd62d4
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_text.cpp
@@ -0,0 +1,1774 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+#undef FX_GAMMA
+#undef FX_GAMMA_INVERSE
+#define FX_GAMMA(value) (value)
+#define FX_GAMMA_INVERSE(value) (value)
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ FX_RECT rect(0, 0, 0, 0);
+ FX_BOOL bStarted = FALSE;
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;
+ if (pGlyph == NULL) {
+ continue;
+ }
+ int char_left = glyph.m_OriginX + pGlyph->m_Left;
+ int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ char_width /= 3;
+ }
+ int char_right = char_left + char_width;
+ int char_top = glyph.m_OriginY - pGlyph->m_Top;
+ int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);
+ if (!bStarted) {
+ rect.left = char_left;
+ rect.right = char_right;
+ rect.top = char_top;
+ rect.bottom = char_bottom;
+ bStarted = TRUE;
+ } else {
+ if (rect.left > char_left) {
+ rect.left = char_left;
+ }
+ if (rect.right < char_right) {
+ rect.right = char_right;
+ }
+ if (rect.top > char_top) {
+ rect.top = char_top;
+ }
+ if (rect.bottom < char_bottom) {
+ rect.bottom = char_bottom;
+ }
+ }
+ }
+ return rect;
+}
+static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)
+{
+ ASSERT(nChars > 1);
+ FX_BOOL bVertical = FALSE;
+ if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {
+ bVertical = TRUE;
+ } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {
+ return;
+ }
+ int i = nChars - 1;
+ int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ for (i --; i > 0; i --) {
+ int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ int space = (*next_origin) - (*this_origin);
+ FX_FLOAT space_f = next_origin_f - this_origin_f;
+ FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));
+ if (error > 0.5f) {
+ *this_origin += space > 0 ? -1 : 1;
+ }
+ next_origin = this_origin;
+ next_origin_f = this_origin_f;
+ }
+}
+static const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};
+static const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};
+static const FX_BYTE g_GdipGammaAdjust_47[48] = {
+ 0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,
+ 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,
+ 46, 46, 46, 46, 46, 46, 46, 47
+};
+static const FX_BYTE g_GdipGammaAdjust_75[76] = {
+ 0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,
+ 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,
+ 70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
+ 73, 74, 74, 74, 74, 74, 74, 74, 74, 75
+};
+static const FX_BYTE g_GdipGammaAdjust_81[82] = {
+ 0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,
+ 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,
+ 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,
+ 80, 80, 80, 80, 80, 80, 80, 81
+};
+static void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)
+{
+}
+static const FX_BYTE g_TextGammaAdjust[256] = {
+ 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,
+ 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
+ 121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135,
+ 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
+ 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+ 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
+ 227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,
+ 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,
+};
+#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \
+ src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {
+ argb = color;
+ return;
+ }
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BYTE bgra[4];
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);
+ bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :
+ FXARGB_A(color);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+ return;
+ }
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),
+ FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ bgra[2], bgra[1], bgra[0]);
+ bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+}
+FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_DWORD fill_color, FX_DWORD text_flags,
+ int alpha_flag, void* pIccTransform)
+{
+ int nativetext_flags = text_flags;
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT))
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ CFX_AffineMatrix char2device, deviceCtm, text2Device;
+ if (pText2Device) {
+ char2device = *pText2Device;
+ text2Device = *pText2Device;
+ }
+ char2device.Scale(font_size, -font_size);
+ if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
+ ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())
+ && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
+ if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
+ return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);
+ }
+ }
+ int anti_alias = FXFT_RENDER_MODE_MONO;
+ FX_BOOL bNormal = FALSE;
+ if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
+ if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
+ FX_BOOL bClearType;
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
+ bClearType = FALSE;
+ } else {
+ bClearType = text_flags & FXTEXT_CLEARTYPE;
+ }
+ if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else if (m_bpp < 16) {
+ anti_alias = FXFT_RENDER_MODE_NORMAL;
+ } else {
+ if (bClearType == FALSE) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ }
+ }
+ }
+ }
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);
+ if (!pGlyphAndPos) {
+ return FALSE;
+ }
+ int iChar;
+ deviceCtm = char2device;
+ CFX_AffineMatrix matrixCTM = GetCTM();
+ FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
+ FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
+ deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ glyph.m_fOriginX = charpos.m_OriginX;
+ glyph.m_fOriginY = charpos.m_OriginY;
+ text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
+ if (anti_alias < FXFT_RENDER_MODE_LCD) {
+ glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
+ } else {
+ glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
+ }
+ glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
+ if (charpos.m_bGlyphAdjust) {
+ CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ new_matrix.Concat(deviceCtm);
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ } else
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ }
+ if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {
+ _AdjustGlyphSpace(pGlyphAndPos, nChars);
+ }
+ FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);
+ if (scale_x > 1 && scale_y > 1) {
+ bmp_rect1.left--;
+ bmp_rect1.top --;
+ bmp_rect1.right ++;
+ bmp_rect1.bottom ++;
+ }
+ FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),
+ FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));
+ bmp_rect.Intersect(m_ClipBox);
+ if (bmp_rect.IsEmpty()) {
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+ }
+ int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);
+ int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);
+ int pixel_left = FXSYS_round(bmp_rect.left * scale_x);
+ int pixel_top = FXSYS_round(bmp_rect.top * scale_y);
+ if (anti_alias == FXFT_RENDER_MODE_MONO) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ bitmap.Clear(0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,
+ glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,
+ pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);
+ }
+ FX_Free(pGlyphAndPos);
+ return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
+ }
+ CFX_DIBitmap bitmap;
+ if (m_bpp == 8) {
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ }
+ if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {
+ bitmap.Clear(0xFFFFFFFF);
+ if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ bitmap.Clear(0);
+ if (bitmap.m_pAlphaMask) {
+ bitmap.m_pAlphaMask->Clear(0);
+ }
+ }
+ int dest_width = pixel_width;
+ FX_LPBYTE dest_buf = bitmap.GetBuffer();
+ int dest_pitch = bitmap.GetPitch();
+ int Bpp = bitmap.GetBPP() / 8;
+ int a, r, g, b;
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ ArgbDecode(fill_color, a, r, g, b);
+ r = FX_GAMMA(r);
+ g = FX_GAMMA(g);
+ b = FX_GAMMA(b);
+ }
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;
+ int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;
+ int ncols = pGlyph->GetWidth();
+ int nrows = pGlyph->GetHeight();
+ if (anti_alias == FXFT_RENDER_MODE_NORMAL) {
+ if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,
+ 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ continue;
+ }
+ FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;
+ ncols /= 3;
+ int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;
+ FX_LPBYTE src_buf = pGlyph->GetBuffer();
+ int src_pitch = pGlyph->GetPitch();
+ int start_col = left;
+ if (start_col < 0) {
+ start_col = 0;
+ }
+ int end_col = left + ncols;
+ if (end_col > dest_width) {
+ end_col = dest_width;
+ }
+ if (start_col >= end_col) {
+ continue;
+ }
+ if (bitmap.GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ } else {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (bitmap.IsAlphaMask()) {
+ SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);
+ } else {
+ SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
+ }
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
+ const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
+ const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPath == NULL) {
+ continue;
+ }
+ matrix.Concat(*pText2User);
+ CFX_PathData TransformedPath(*pPath);
+ TransformedPath.Transform(&matrix);
+ FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :
+ (fill_color || stroke_color);
+ if (bHasAlpha) {
+ int fill_mode = nFlag;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ } else {
+ if (fill_color) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ }
+ fill_mode |= FX_FILL_TEXT_MODE;
+ if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ }
+ if (pClippingPath) {
+ pClippingPath->Append(&TransformedPath, pUser2Device);
+ }
+ }
+ return TRUE;
+}
+CFX_FontCache::~CFX_FontCache()
+{
+ FreeCache(TRUE);
+}
+CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ counted_face_cache->m_nCount++;
+ return counted_face_cache->m_Obj;
+ }
+ CFX_FaceCache* face_cache = NULL;
+ face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);
+ if (face_cache == NULL) {
+ return NULL;
+ }
+ counted_face_cache = FX_NEW CFX_CountedFaceCache;
+ if (!counted_face_cache) {
+ if (face_cache) {
+ delete face_cache;
+ face_cache = NULL;
+ }
+ return NULL;
+ }
+ counted_face_cache->m_nCount = 2;
+ counted_face_cache->m_Obj = face_cache;
+ map.SetAt((FXFT_Face)face, counted_face_cache);
+ return face_cache;
+}
+void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ return;
+ }
+ if (counted_face_cache->m_nCount > 1) {
+ counted_face_cache->m_nCount--;
+ }
+}
+void CFX_FontCache::FreeCache(FX_BOOL bRelease)
+{
+ {
+ FX_POSITION pos;
+ pos = m_FTFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_FTFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_FTFaceMap.RemoveKey(face);
+ }
+ }
+ pos = m_ExtFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_ExtFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_ExtFaceMap.RemoveKey(face);
+ }
+ }
+ }
+}
+CFX_FaceCache::CFX_FaceCache(FXFT_Face face)
+{
+ m_Face = face;
+ m_pBitmap = NULL;
+}
+CFX_FaceCache::~CFX_FaceCache()
+{
+ FX_POSITION pos = m_SizeMap.GetStartPosition();
+ CFX_ByteString Key;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ while(pos) {
+ m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);
+ delete pSizeCache;
+ }
+ m_SizeMap.RemoveAll();
+ pos = m_PathMap.GetStartPosition();
+ FX_LPVOID key1;
+ CFX_PathData* pPath;
+ while (pos) {
+ m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);
+ delete pPath;
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_PathMap.RemoveAll();
+}
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_FaceCache::InitPlatform()
+{
+}
+#endif
+CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,
+ CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ int dest_width, int anti_alias)
+{
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ }
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap == NULL) {
+ return NULL;
+ }
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+}
+const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias, int& text_flags)
+{
+ if (glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ _CFX_UniqueKeyGen keygen;
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ } else {
+ if (pFont->GetSubstFont())
+ keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);
+ else
+ keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);
+ }
+#endif
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ } else {
+ CFX_GlyphBitmap* pGlyphBitmap;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ } else {
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ }
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+ text_flags |= FXTEXT_NO_NATIVETEXT;
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ }
+#endif
+}
+CFX_SizeGlyphCache::~CFX_SizeGlyphCache()
+{
+ FX_POSITION pos = m_GlyphMap.GetStartPosition();
+ FX_LPVOID Key;
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ while(pos) {
+ m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
+ delete pGlyphBitmap;
+ }
+ m_GlyphMap.RemoveAll();
+}
+#if defined(_FPDFAPI_MINI_)
+#define CONTRAST_RAMP_STEP 16
+#else
+#define CONTRAST_RAMP_STEP 1
+#endif
+static const FX_BYTE g_adjust_contrast11[256] = {
+ 0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,
+ 32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,
+ 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,
+ 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,
+ 128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,
+ 153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,
+ 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,
+ 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,
+ 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
+ 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static const FX_BYTE g_adjust_contrast15[256] = {
+ 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,
+ 52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,
+ 88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,
+ 120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,
+ 149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,
+ 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,
+ 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
+ 221, 222, 223, 224, 225, 226, 227, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,
+ 237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,
+ 248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static void _CalcContrastRamp(FX_LPBYTE ramp, int level)
+{
+ int contrast_min = 0, contrast_max = 255 - level, i;
+ for (i = 0; i < contrast_min; i ++) {
+ ramp[i] = 0;
+ }
+ for (i = contrast_min; i < contrast_max; i ++) {
+ ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);
+ }
+ for (i = contrast_max; i < 256; i ++) {
+ ramp[i] = 255;
+ }
+}
+void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
+{
+ FXFT_MM_Var pMasters = NULL;
+ FXFT_Get_MM_Var(m_Face, &pMasters);
+ if (pMasters == NULL) {
+ return;
+ }
+ long coords[2];
+ if (weight == 0) {
+ coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
+ } else {
+ coords[0] = weight;
+ }
+ if (dest_width == 0) {
+ coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ } else {
+ int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ coords[1] = min_param;
+ int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ coords[1] = max_param;
+ error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (max_width == min_width) {
+ return;
+ }
+ int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);
+ coords[1] = param;
+ }
+ FXFT_Free(m_Face, pMasters);
+ FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+}
+extern const char g_AngleSkew[30] = {
+ 0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
+ 18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
+ 36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
+};
+static const FX_BYTE g_WeightPow[100] = {
+ 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
+ 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
+ 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
+ 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
+ 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
+};
+extern const FX_BYTE g_WeightPow_11[100] = {
+ 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
+ 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
+ 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
+ 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
+ 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
+};
+extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {
+ 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
+ 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
+ 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
+ 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,
+ 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
+};
+static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)
+{
+ int count = nHei * src_pitch;
+ for(int i = 0; i < count; i++) {
+ pData[i] = gammaTable[pData[i]];
+ }
+}
+static void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)
+{
+ int col, row, temp;
+ int max = 0, min = 255;
+ FX_FLOAT rate;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;
+ for (col = 0; col < nWid; col++) {
+ temp = *pRow ++;
+ if (temp > max) {
+ max = temp;
+ }
+ if (temp < min) {
+ min = temp;
+ }
+ }
+ }
+ temp = max - min;
+ if (0 == temp || 255 == temp) {
+ int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);
+ for (row = 0; row < nHei; row ++) {
+ FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);
+ }
+ return;
+ }
+ rate = 255.f / temp;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;
+ FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;
+ for (col = 0; col < nWid; col ++) {
+ temp = (int)((*(pSrcRow++) - min) * rate + 0.5);
+ if (temp > 255) {
+ temp = 255;
+ } else if (temp < 0) {
+ temp = 0;
+ }
+ *pDstRow ++ = (FX_BYTE)temp;
+ }
+ }
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
+ FX_BOOL bUseCJKSubFont = FALSE;
+ const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
+ if (pSubstFont) {
+ bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
+ int skew = 0;
+ if (bUseCJKSubFont) {
+ skew = pSubstFont->m_bItlicCJK ? -15 : 0;
+ } else {
+ skew = pSubstFont->m_ItalicAngle;
+ }
+ if (skew) {
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (pFont->IsVertical()) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int weight = 0;
+ if (bUseCJKSubFont) {
+ weight = pSubstFont->m_WeightCJK;
+ } else {
+ weight = pSubstFont ? pSubstFont->m_Weight : 0;
+ }
+ if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
+ int index = (weight - 400) / 10;
+ if (index >= 100) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int level = 0;
+ if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;
+ } else {
+ level = g_WeightPow_11[index] * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);
+ error = FXFT_Render_Glyph(m_Face, anti_alias);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (bmwidth > 2048 || bmheight > 2048) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int dib_width = bmwidth;
+ CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;
+ if (!pGlyphBitmap) {
+ return NULL;
+ }
+ pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,
+ anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);
+ pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);
+ pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);
+ int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));
+ FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();
+ FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;
+ for(int i = 0; i < bmheight; i++)
+ for(int n = 0; n < bmwidth; n++) {
+ FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;
+ for (int b = 0; b < bytes; b ++) {
+ pDestBuf[i * dest_pitch + n * bytes + b] = data;
+ }
+ }
+ } else {
+ FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);
+ if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);
+ for (int row = 0; row < bmheight; row ++) {
+ FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
+ }
+ } else {
+ _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);
+ _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());
+ }
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pGlyphBitmap;
+}
+FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,
+ int glyph_index, FX_ARGB argb)
+{
+ CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;
+ FXFT_Face face = pFont->GetFace();
+ int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);
+ if (error) {
+ return FALSE;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));
+ int left = FXFT_Get_Glyph_BitmapLeft(face);
+ int top = FXFT_Get_Glyph_BitmapTop(face);
+ FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));
+ CFX_DIBitmap mask;
+ mask.Create(bmwidth, bmheight, FXDIB_8bppMask);
+ FX_LPBYTE dest_buf = mask.GetBuffer();
+ int dest_pitch = mask.GetPitch();
+ for (int row = 0; row < bmheight; row ++) {
+ FX_LPCBYTE src_scan = src_buf + row * src_pitch;
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ }
+ pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);
+ return TRUE;
+}
+FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FXFT_Face face = pFont->GetFace();
+ FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ if (pText_matrix) {
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);
+ ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);
+ ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);
+ ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);
+ FXFT_Set_Transform(face, &ft_matrix, 0);
+ }
+ FX_FLOAT x_pos = 0;
+ for (; *text != 0; text ++) {
+ FX_WCHAR unicode = *text;
+ int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);
+ if (glyph_index <= 0) {
+ continue;
+ }
+ int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ continue;
+ }
+ int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);
+ int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);
+ FX_FLOAT x1, y1;
+ pText_matrix->Transform(x_pos, 0, x1, y1);
+ _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,
+ glyph_index, argb);
+ x_pos += (FX_FLOAT)w / em;
+ }
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return TRUE;
+}
+FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)
+{
+ FXFT_Matrix ft_matrix;
+ if (pMatrix) {
+ ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);
+ } else {
+ ft_matrix.xx = (signed long)(font_size / 64 * 65536);
+ ft_matrix.xy = ft_matrix.yx = 0;
+ ft_matrix.yy = (signed long)(font_size / 64 * 65536);
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);
+ FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,
+ glyph_index, argb);
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return ret;
+}
+const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ CFX_PathData* pGlyphPath = NULL;
+ FX_LPVOID key;
+ if (pFont->GetSubstFont())
+ key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +
+ ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +
+ (pFont->IsVertical() << 31));
+ else {
+ key = (FX_LPVOID)(FX_UINTPTR)glyph_index;
+ }
+ if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {
+ return pGlyphPath;
+ }
+ pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
+ m_PathMap.SetAt(key, pGlyphPath);
+ return pGlyphPath;
+}
+typedef struct {
+ FX_BOOL m_bCount;
+ int m_PointCount;
+ FX_PATHPOINT* m_pPoints;
+ int m_CurX;
+ int m_CurY;
+ FX_FLOAT m_CoordUnit;
+} OUTLINE_PARAMS;
+void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)
+{
+ if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {
+ param->m_PointCount -= 2;
+ }
+ if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {
+ param->m_PointCount -= 4;
+ }
+}
+extern "C" {
+ static int _Outline_MoveTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ _Outline_CheckEmptyContour(param);
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ if (param->m_PointCount) {
+ param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_LineTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
+ if (m_pSubstFont) {
+ if (m_pSubstFont->m_ItalicAngle) {
+ int skew = m_pSubstFont->m_ItalicAngle;
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (m_bVertical) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {
+ int level = 0;
+ if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;
+ } else {
+ level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Outline_Funcs funcs;
+ funcs.move_to = _Outline_MoveTo;
+ funcs.line_to = _Outline_LineTo;
+ funcs.conic_to = _Outline_ConicTo;
+ funcs.cubic_to = _Outline_CubicTo;
+ funcs.shift = 0;
+ funcs.delta = 0;
+ OUTLINE_PARAMS params;
+ params.m_bCount = TRUE;
+ params.m_PointCount = 0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ if (params.m_PointCount == 0) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ CFX_PathData* pPath = FX_NEW CFX_PathData;
+ if (!pPath) {
+ return NULL;
+ }
+ pPath->SetPointCount(params.m_PointCount);
+ params.m_bCount = FALSE;
+ params.m_PointCount = 0;
+ params.m_pPoints = pPath->GetPoints();
+ params.m_CurX = params.m_CurY = 0;
+ params.m_CoordUnit = 64 * 64.0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ _Outline_CheckEmptyContour(&params);
+ pPath->TrimPoints(params.m_PointCount);
+ if (params.m_PointCount) {
+ pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pPath;
+}
+void _CFX_UniqueKeyGen::Generate(int count, ...)
+{
+ va_list argList;
+ va_start(argList, count);
+ for (int i = 0; i < count; i ++) {
+ int p = va_arg(argList, int);
+ ((FX_DWORD*)m_Key)[i] = p;
+ }
+ va_end(argList);
+ m_KeyLen = count * sizeof(FX_DWORD);
+}
diff --git a/core/src/fxge/ge/text_int.h b/core/src/fxge/ge/text_int.h
new file mode 100644
index 0000000000..7608f8a2ed
--- /dev/null
+++ b/core/src/fxge/ge/text_int.h
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct _CFX_UniqueKeyGen {
+ void Generate(int count, ...);
+ FX_CHAR m_Key[128];
+ int m_KeyLen;
+};
+class CFX_SizeGlyphCache : public CFX_Object
+{
+public:
+ CFX_SizeGlyphCache()
+ {
+ m_GlyphMap.InitHashTable(253);
+ }
+ ~CFX_SizeGlyphCache();
+ CFX_MapPtrToPtr m_GlyphMap;
+};
+class CTTFontDesc : public CFX_Object
+{
+public:
+ CTTFontDesc()
+ {
+ m_Type = 0;
+ m_pFontData = NULL;
+ m_RefCount = 0;
+ }
+ ~CTTFontDesc();
+ FX_BOOL ReleaseFace(FXFT_Face face);
+ int m_Type;
+ union {
+ struct {
+ FX_BOOL m_bItalic;
+ FX_BOOL m_bBold;
+ FXFT_Face m_pFace;
+ } m_SingleFace;
+ struct {
+ FXFT_Face m_pFaces[16];
+ } m_TTCFace;
+ };
+ FX_BYTE* m_pFontData;
+ int m_RefCount;
+};
+class CFX_UnicodeEncoding : public IFX_FontEncoding
+{
+public:
+ CFX_UnicodeEncoding(CFX_Font* pFont);
+ virtual FX_DWORD GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);
+private:
+ CFX_Font* m_pFont;
+ virtual FX_DWORD GlyphFromCharCode(FX_DWORD charcode);
+ virtual CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const
+ {
+ return CFX_WideString((FX_WCHAR)charcode);
+ }
+ virtual FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const
+ {
+ return Unicode;
+ }
+ virtual FX_BOOL IsUnicodeCompatible() const
+ {
+ return TRUE;
+ }
+};
+#define CHARSET_FLAG_ANSI 1
+#define CHARSET_FLAG_SYMBOL 2
+#define CHARSET_FLAG_SHIFTJIS 4
+#define CHARSET_FLAG_BIG5 8
+#define CHARSET_FLAG_GB 16
+#define CHARSET_FLAG_KOREAN 32
+class CFontFaceInfo : public CFX_Object
+{
+public:
+ CFX_ByteString m_FilePath;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Styles;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FontOffset;
+ FX_DWORD m_FileSize;
+ CFX_ByteString m_FontTables;
+};
+class CFontFileFaceInfo : public CFX_Object
+{
+public:
+ CFontFileFaceInfo();
+ ~CFontFileFaceInfo();
+ IFX_FileStream* m_pFile;
+ FXFT_Face m_Face;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FileSize;
+ FX_DWORD m_FontOffset;
+ int m_Weight;
+ FX_BOOL m_bItalic;
+ int m_PitchFamily;
+ CFX_ByteString m_FontTables;
+};
diff --git a/core/src/fxge/win32/dwrite_int.h b/core/src/fxge/win32/dwrite_int.h
new file mode 100644
index 0000000000..1f0770d0bf
--- /dev/null
+++ b/core/src/fxge/win32/dwrite_int.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_DIRECT_WRITE_
+#define _FX_DIRECT_WRITE_
+#ifndef DECLSPEC_UUID
+#if (_MSC_VER >= 1100) && defined (__cplusplus)
+#define DECLSPEC_UUID(x) __declspec(uuid(x))
+#else
+#define DECLSPEC_UUID(x)
+#endif
+#endif
+#ifndef DECLSPEC_NOVTABLE
+#if (_MSC_VER >= 1100) && defined(__cplusplus)
+#define DECLSPEC_NOVTABLE __declspec(novtable)
+#else
+#define DECLSPEC_NOVTABLE
+#endif
+#endif
+#if(WINVER < 0x0500)
+#ifndef _MAC
+DECLARE_HANDLE(HMONITOR);
+#endif
+#endif
+class CDWriteExt
+{
+public:
+ CDWriteExt();
+ ~CDWriteExt();
+
+ void Load();
+ void Unload();
+
+ FX_BOOL IsAvailable()
+ {
+ return m_pDWriteFactory != NULL;
+ }
+
+ void* DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);
+ FX_BOOL DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);
+ void DwDeleteRenderingTarget(void* renderTarget);
+ FX_BOOL DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances);
+ void DwDeleteFont(void* pFont);
+
+protected:
+ void* m_hModule;
+ void* m_pDWriteFactory;
+ void* m_pDwFontContext;
+ void* m_pDwTextRenderer;
+};
+#endif
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
new file mode 100644
index 0000000000..e3f5ae0609
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -0,0 +1,1200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include <crtdbg.h>
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "dwrite_int.h"
+#include "win32_int.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+class CWin32FontInfo : public IFX_SystemFontInfo
+{
+public:
+ CWin32FontInfo();
+ ~CWin32FontInfo();
+ virtual void Release();
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+ virtual void* GetFont(FX_LPCSTR face)
+ {
+ return NULL;
+ }
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual void DeleteFont(void* hFont);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+ FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf);
+ FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf);
+ void AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);
+ void GetGBPreference(CFX_ByteString& face, int weight, int picth_family);
+ void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);
+ CFX_ByteString FindFont(const CFX_ByteString& name);
+ HDC m_hDC;
+ CFX_FontMapper* m_pMapper;
+ CFX_ByteString m_LastFamily;
+ CFX_ByteString m_KaiTi, m_FangSong;
+};
+CWin32FontInfo::CWin32FontInfo()
+{
+ m_hDC = CreateCompatibleDC(NULL);
+}
+CWin32FontInfo::~CWin32FontInfo()
+{
+ m_pMapper = NULL;
+}
+void CWin32FontInfo::Release()
+{
+ DeleteDC(m_hDC);
+ delete this;
+}
+#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)
+FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||
+ (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)
+{
+ CFX_ByteString name(plf->lfFaceName, -1);
+ if (name[0] == '@') {
+ return;
+ }
+ if (name == m_LastFamily) {
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE)) {
+ if (!IsSupportFontFormDiv(plf)) {
+ return;
+ }
+ }
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ m_LastFamily = name;
+}
+static int CALLBACK FontEnumProc(
+ const LOGFONTA *plf,
+ const TEXTMETRICA *lpntme,
+ FX_DWORD FontType,
+ LPARAM lParam
+)
+{
+ CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;
+ if (pFontInfo->m_pMapper->GetFontEnumerator()) {
+ pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();
+ }
+ pFontInfo->AddInstalledFont(plf, FontType);
+ return 1;
+}
+FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ LOGFONTA lf;
+ FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lf.lfFaceName[0] = 0;
+ lf.lfPitchAndFamily = 0;
+ EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);
+ if (pMapper->GetFontEnumerator()) {
+ pMapper->GetFontEnumerator()->Finish();
+ }
+ return TRUE;
+}
+static const struct {
+ FX_LPCSTR m_pFaceName;
+ FX_LPCSTR m_pVariantName;
+}
+VariantNames[] = {
+ {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"},
+};
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pWinName;
+ FX_BOOL m_bBold;
+ FX_BOOL m_bItalic;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New", FALSE, FALSE},
+ {"Courier-Bold", "Courier New", TRUE, FALSE},
+ {"Courier-BoldOblique", "Courier New", TRUE, TRUE},
+ {"Courier-Oblique", "Courier New", FALSE, TRUE},
+ {"Helvetica", "Arial", FALSE, FALSE},
+ {"Helvetica-Bold", "Arial", TRUE, FALSE},
+ {"Helvetica-BoldOblique", "Arial", TRUE, TRUE},
+ {"Helvetica-Oblique", "Arial", FALSE, TRUE},
+ {"Times-Roman", "Times New Roman", FALSE, FALSE},
+ {"Times-Bold", "Times New Roman", TRUE, FALSE},
+ {"Times-BoldItalic", "Times New Roman", TRUE, TRUE},
+ {"Times-Italic", "Times New Roman", FALSE, TRUE},
+};
+CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)
+{
+ if (m_pMapper == NULL) {
+ return name;
+ }
+ int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();
+ for (int i = 0; i < nFonts; i ++) {
+ CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];
+ if (thisname[0] == ' ') {
+ if (thisname.Mid(1, name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i + 1];
+ }
+ } else if (thisname.Left(name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i];
+ }
+ }
+ return CFX_ByteString();
+}
+struct _FontNameMap {
+ FX_LPCSTR m_pSubFontName;
+ FX_LPCSTR m_pSrcFontName;
+};
+const _FontNameMap g_JpFontNameMap[] = {
+ {"MS Mincho", "Heiseimin-W3"},
+ {"MS Gothic", "Jun101-Light"},
+};
+const _FontNameMap g_GbFontNameMap[1];
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);
+ }
+}
+FX_BOOL _GetSubFontName(CFX_ByteString& name, int lang)
+{
+ int size = sizeof g_JpFontNameMap;
+ void* pFontnameMap = (void*)g_JpFontNameMap;
+ if (lang == 1) {
+ size = sizeof g_GbFontNameMap;
+ pFontnameMap = (void*)g_GbFontNameMap;
+ } else if (lang == 2) {
+ size = 0;
+ }
+ _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,
+ size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);
+ if (found == NULL) {
+ return FALSE;
+ }
+ name = found->m_pSubFontName;
+ return TRUE;
+}
+void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) {
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = FindFont("KaiTi");
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = "SimSun";
+ }
+ }
+ face = m_KaiTi;
+ } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) {
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = FindFont("FangSong");
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = "SimSun";
+ }
+ }
+ face = m_FangSong;
+ } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) {
+ face = "SimSun";
+ } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) {
+ face = "SimHei";
+ } else if (!(picth_family & FF_ROMAN) && weight > 550) {
+ face = "SimHei";
+ } else {
+ face = "SimSun";
+ }
+}
+void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ face = "MS PGothic";
+ } else if (face.Find("UI Gothic") >= 0) {
+ face = "MS UI Gothic";
+ } else {
+ if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) {
+ face = "MS PGothic";
+ } else {
+ face = "MS Gothic";
+ }
+ }
+ return;
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ face = "MS PMincho";
+ } else {
+ face = "MS Mincho";
+ }
+ return;
+ }
+ if (_GetSubFontName(face, 0)) {
+ return;
+ }
+ if (!(picth_family & FF_ROMAN) && weight > 400) {
+ face = "MS PGothic";
+ } else {
+ face = "MS PMincho";
+ }
+}
+void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pWinName;
+ weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;
+ bItalic = Base14Substs[iBaseFont].m_bItalic;
+ bExact = TRUE;
+ break;
+ }
+ if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {
+ charset = DEFAULT_CHARSET;
+ }
+ int subst_pitch_family = pitch_family;
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ subst_pitch_family = FF_ROMAN;
+ break;
+ case CHINESEBIG5_CHARSET:
+ case HANGUL_CHARSET:
+ case GB2312_CHARSET:
+ subst_pitch_family = 0;
+ break;
+ }
+ HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (face.EqualNoCase(facebuf)) {
+ return hFont;
+ }
+ int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);
+ for (int i = 0; i < iCount; ++i) {
+ if (face == VariantNames[i].m_pFaceName) {
+ CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);
+ CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName);
+ if (wsFace == wsName) {
+ return hFont;
+ }
+ }
+ }
+ ::DeleteObject(hFont);
+ if (charset == DEFAULT_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case GB2312_CHARSET:
+ GetGBPreference(face, weight, pitch_family);
+ break;
+ case HANGUL_CHARSET:
+ face = "Gulim";
+ break;
+ case CHINESEBIG5_CHARSET:
+ if (face.Find("MSung") >= 0) {
+ face = "MingLiU";
+ } else {
+ face = "PMingLiU";
+ }
+ break;
+ }
+ hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ return hFont;
+}
+void CWin32FontInfo::DeleteFont(void* hFont)
+{
+ ::DeleteObject(hFont);
+}
+FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ table = FXDWORD_FROM_MSBFIRST(table);
+ size = ::GetFontData(m_hDC, table, 0, buffer, size);
+ ::SelectObject(m_hDC, hOldFont);
+ if (size == GDI_ERROR) {
+ return 0;
+ }
+ return size;
+}
+FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (ret == 0) {
+ return FALSE;
+ }
+ name = facebuf;
+ return TRUE;
+}
+FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ TEXTMETRIC tm;
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ ::GetTextMetrics(m_hDC, &tm);
+ ::SelectObject(m_hDC, hOldFont);
+ charset = tm.tmCharSet;
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return FX_NEW CWin32FontInfo;
+}
+#endif
+void CFX_GEModule::InitPlatform()
+{
+ CWin32Platform* pPlatformData = FX_NEW CWin32Platform;
+ if (!pPlatformData) {
+ return;
+ }
+ OSVERSIONINFO ver;
+ ver.dwOSVersionInfoSize = sizeof(ver);
+ GetVersionEx(&ver);
+ pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;
+ pPlatformData->m_GdiplusExt.Load();
+ m_pPlatformData = pPlatformData;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CWin32Platform*)m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)
+{
+ m_hDC = hDC;
+ m_DeviceClass = device_class;
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);
+ if (GetObjectType(m_hDC) == OBJ_MEMDC) {
+ HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ m_nBitsPerPixel = bitmap.bmBitsPixel;
+ m_Width = bitmap.bmWidth;
+ m_Height = abs(bitmap.bmHeight);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ DeleteObject(hBitmap);
+ } else {
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ }
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ m_RenderCaps = FXRC_BIT_MASK;
+ } else {
+ m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;
+ }
+}
+int CGdiDeviceDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return m_DeviceClass;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_RenderCaps;
+ }
+ return 0;
+}
+FX_LPVOID CGdiDeviceDriver::GetClipRgn()
+{
+ HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);
+ if (::GetClipRgn(m_hDC, hClipRgn) == 0) {
+ DeleteObject(hClipRgn);
+ hClipRgn = NULL;
+ }
+ return (FX_LPVOID)hClipRgn;
+}
+FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)
+{
+ if (m_DeviceClass == FXDC_PRINTER) {
+ CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;
+ FX_RECT dst_rect(0, 0, width, height);
+ dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ int dst_width = dst_rect.Width();
+ int dst_height = dst_rect.Height();
+ ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,
+ 0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);
+ delete pBitmap;
+ } else {
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,
+ 0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (pBitmap != pBitmap1) {
+ delete pBitmap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||
+ (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ } else {
+ SetStretchBltMode(m_hDC, COLORONCOLOR);
+ }
+ CFX_DIBitmap* pToStrechBitmap = pBitmap;
+ bool del = false;
+ if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {
+ pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);
+ del = true;
+ }
+ CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),
+ (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
+ if (del) {
+ delete pToStrechBitmap;
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);
+ int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();
+ struct {
+ BITMAPINFOHEADER bmiHeader;
+ FX_DWORD bmiColors[2];
+ } bmi;
+ FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biBitCount = 1;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (m_nBitsPerPixel != 1) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ }
+ bmi.bmiColors[0] = 0xffffff;
+ bmi.bmiColors[1] = 0;
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);
+ return TRUE;
+}
+BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+ return ::GetClipBox(m_hDC, (RECT*)pRect);
+}
+FX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)
+{
+ ::SelectClipRgn(m_hDC, (HRGN)hRgn);
+ return TRUE;
+}
+static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)
+{
+ FX_FLOAT width;
+ FX_FLOAT scale = 1.f;
+ if (pMatrix)
+ scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?
+ FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);
+ if (pGraphState) {
+ width = scale * pGraphState->m_LineWidth;
+ } else {
+ width = 1.0f;
+ }
+ FX_DWORD PenStyle = PS_GEOMETRIC;
+ if (width < 1) {
+ width = 1;
+ }
+ if(pGraphState->m_DashCount) {
+ PenStyle |= PS_USERSTYLE;
+ } else {
+ PenStyle |= PS_SOLID;
+ }
+ switch(pGraphState->m_LineCap) {
+ case 0:
+ PenStyle |= PS_ENDCAP_FLAT;
+ break;
+ case 1:
+ PenStyle |= PS_ENDCAP_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_ENDCAP_SQUARE;
+ break;
+ }
+ switch(pGraphState->m_LineJoin) {
+ case 0:
+ PenStyle |= PS_JOIN_MITER;
+ break;
+ case 1:
+ PenStyle |= PS_JOIN_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_JOIN_BEVEL;
+ break;
+ }
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ LOGBRUSH lb;
+ lb.lbColor = rgb;
+ lb.lbStyle = BS_SOLID;
+ lb.lbHatch = 0;
+ FX_DWORD* pDash = NULL;
+ if (pGraphState->m_DashCount) {
+ pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);
+ if (!pDash) {
+ return NULL;
+ }
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);
+ if (pDash[i] < 1) {
+ pDash[i] = 1;
+ }
+ }
+ }
+ HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);
+ if (pDash) {
+ FX_Free(pDash);
+ }
+ return hPen;
+}
+static HBRUSH _CreateBrush(FX_DWORD argb)
+{
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ return CreateSolidBrush(rgb);
+}
+static void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)
+{
+ BeginPath(hDC);
+ int nPoints = pPathData->GetPointCount();
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ for(int i = 0; i < nPoints; i++) {
+ FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == PT_MOVETO) {
+ MoveToEx(hDC, screen_x, screen_y, NULL);
+ } else if(point_type == PT_LINETO) {
+ if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {
+ screen_x ++;
+ }
+ LineTo(hDC, screen_x, screen_y);
+ } else if(point_type == PT_BEZIERTO) {
+ POINT lppt[3];
+ lppt[0].x = screen_x;
+ lppt[0].y = screen_y;
+ posx = pPoints[i + 1].m_PointX;
+ posy = pPoints[i + 1].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[1].x = FXSYS_round(posx);
+ lppt[1].y = FXSYS_round(posy);
+ posx = pPoints[i + 2].m_PointX;
+ posy = pPoints[i + 2].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[2].x = FXSYS_round(posx);
+ lppt[2].y = FXSYS_round(posy);
+ PolyBezierTo(hDC, lppt, 3);
+ i += 2;
+ }
+ if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {
+ CloseFigure(hDC);
+ }
+ }
+ EndPath(hDC);
+}
+void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+ int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);
+ int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);
+ if (flag1 & flag2) {
+ return;
+ }
+ if (flag1 || flag2) {
+ agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));
+ FX_FLOAT x[2], y[2];
+ int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);
+ if (np == 0) {
+ return;
+ }
+ if (np == 1) {
+ x2 = x[0];
+ y2 = y[0];
+ } else {
+ x1 = x[0];
+ y1 = y[0];
+ x2 = x[np - 1];
+ y2 = y[np - 1];
+ }
+ }
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+}
+static FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)
+{
+ return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;
+}
+FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {
+ CFX_FloatRect bbox_f = pPathData->GetBoundingBox();
+ if (pMatrix) {
+ bbox_f.Transform(pMatrix);
+ }
+ FX_RECT bbox = bbox_f.GetInnerRect();
+ if (bbox.Width() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else if (bbox.Height() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ }
+ int fill_alpha = FXARGB_A(fill_color);
+ int stroke_alpha = FXARGB_A(stroke_color);
+ FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);
+ if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {
+ return FALSE;
+ }
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {
+ if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&
+ pGraphState && pGraphState->m_LineWidth == 1.f &&
+ (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&
+ pPathData->IsRect()) ) {
+ if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ int old_fill_mode = fill_mode;
+ fill_mode &= 3;
+ HPEN hPen = NULL;
+ HBRUSH hBrush = NULL;
+ if (pGraphState && stroke_alpha) {
+ SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);
+ hPen = _CreatePen(pGraphState, pMatrix, stroke_color);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ }
+ if (fill_mode && fill_alpha) {
+ SetPolyFillMode(m_hDC, fill_mode);
+ hBrush = _CreateBrush(fill_color);
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ }
+ if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {
+ FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ }
+ FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);
+ if (pMatrix) {
+ pMatrix->Transform(x2, y2);
+ }
+ DrawLine(x1, y1, x2, y2);
+ } else {
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ if (pGraphState && stroke_alpha) {
+ if (fill_mode && fill_alpha) {
+ if (old_fill_mode & FX_FILL_TEXT_MODE) {
+ StrokeAndFillPath(m_hDC);
+ } else {
+ FillPath(m_hDC);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ StrokePath(m_hDC);
+ }
+ } else {
+ StrokePath(m_hDC);
+ }
+ } else if (fill_mode && fill_alpha) {
+ FillPath(m_hDC);
+ }
+ }
+ if (hPen) {
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ }
+ if (hBrush) {
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ DeleteObject(hBrush);
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ int alpha;
+ FX_COLORREF rgb;
+ ArgbDecode(fill_color, alpha, rgb);
+ if (alpha == 0) {
+ return TRUE;
+ }
+ if (alpha < 255) {
+ return FALSE;
+ }
+ HBRUSH hBrush = CreateSolidBrush(rgb);
+ ::FillRect(m_hDC, (RECT*)pRect, hBrush);
+ DeleteObject(hBrush);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ int fill_mode
+ )
+{
+ if (pPathData->GetPointCount() == 5) {
+ CFX_FloatRect rectf;
+ if (pPathData->IsRect(pMatrix, &rectf)) {
+ FX_RECT rect = rectf.GetOutterRect();
+ IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);
+ return TRUE;
+ }
+ }
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ SetPolyFillMode(m_hDC, fill_mode & 3);
+ SelectClipPath(m_hDC, RGN_AND);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ WidenPath(m_hDC);
+ SetPolyFillMode(m_hDC, WINDING);
+ FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return ret;
+}
+FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(color, a, rgb);
+ if (a == 0) {
+ return TRUE;
+ }
+ HPEN hPen = CreatePen(PS_SOLID, 1, rgb);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)
+{
+ DeleteObject((HGDIOBJ)pRgn);
+ return TRUE;
+}
+CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;
+ }
+}
+FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+ FX_BOOL ret = FALSE;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);
+ HDC hDCMemory = CreateCompatibleDC(m_hDC);
+ HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp);
+ BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);
+ SelectObject(hDCMemory, holdbmp);
+ BITMAPINFO bmi;
+ FXSYS_memset32(&bmi, 0, sizeof bmi);
+ bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
+ bmi.bmiHeader.biBitCount = pBitmap->GetBPP();
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {
+ ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;
+ } else {
+ CFX_DIBitmap bitmap;
+ if (bitmap.Create(width, height, FXDIB_Rgb)) {
+ bmi.bmiHeader.biBitCount = 24;
+ ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);
+ ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);
+ } else {
+ ret = FALSE;
+ }
+ }
+#ifndef _FPDFAPI_MINI_
+ if (pBitmap->HasAlpha() && ret) {
+ pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
+ }
+#endif
+ DeleteObject(hbmp);
+ DeleteObject(hDCMemory);
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->IsAlphaMask()) {
+ int width = pSource->GetWidth(), height = pSource->GetHeight();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;
+ if (!bGDI) {
+ CFX_DIBitmap background;
+ if (!background.Create(width, height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, left, top, NULL) ||
+ !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else {
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ if (pSource->HasAlpha()) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(width, height, FXDIB_Rgb) ||
+ !GetDIBits(&bitmap, left, top, NULL) ||
+ !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_RECT bitmap_clip = *pClipRect;
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ bitmap_clip.Offset(-dest_left, -dest_top);
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());
+ FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+ delete pStretched;
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ ASSERT(pSource != NULL && pClipRect != NULL);
+ if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ if (pSource->IsAlphaMask()) {
+ FX_RECT image_rect;
+ image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;
+ image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;
+ image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;
+ image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;
+ FX_RECT clip_rect = image_rect;
+ clip_rect.Intersect(*pClipRect);
+ clip_rect.Offset(-image_rect.left, -image_rect.top);
+ int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ CFX_DIBitmap background;
+ if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||
+ !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ delete pStretched;
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, clip_width, clip_height);
+ FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);
+ delete pStretched;
+ return ret;
+ } else {
+ if (pSource->HasAlpha()) {
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);
+ }
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+#define GET_PS_FEATURESETTING 4121
+#define FEATURESETTING_PSLEVEL 2
+int GetPSLevel(HDC hDC)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ if (device_type != DT_RASPRINTER) {
+ return 0;
+ }
+ FX_DWORD esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ esc = POSTSCRIPT_IDENTIFY;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {
+ esc = POSTSCRIPT_DATA;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ return 2;
+ }
+ return 0;
+ }
+ esc = PSIDENT_GDICENTRIC;
+ if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {
+ return 2;
+ }
+ esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ return 2;
+}
+int CFX_WindowsDevice::m_psLevel = 2;
+CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)
+{
+ m_bForcePSOutput = bForcePSOutput;
+ m_psLevel = psLevel;
+ if (bForcePSOutput) {
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;
+ if (!pDriver) {
+ return;
+ }
+ ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);
+ SetDeviceDriver(pDriver);
+ return;
+ }
+ SetDeviceDriver(CreateDriver(hDC, bCmykOutput));
+}
+HDC CFX_WindowsDevice::GetDC() const
+{
+ IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();
+ if (!pRDD) {
+ return NULL;
+ }
+ return (HDC)pRDD->GetPlatformSurface();
+}
+IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ int obj_type = ::GetObjectType(hDC);
+ int device_class;
+ if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {
+ device_class = FXDC_PRINTER;
+ } else {
+ device_class = FXDC_DISPLAY;
+ }
+ return FX_NEW CGdiDisplayDriver(hDC);
+}
+CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
+{
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));
+ bmih.biSize = sizeof(BITMAPINFOHEADER);
+ bmih.biBitCount = format & 0xff;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ FX_LPBYTE pBuffer;
+ m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);
+ if (m_hBitmap == NULL) {
+ return;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return;
+ }
+ pBitmap->Create(width, height, format, pBuffer);
+ SetBitmap(pBitmap);
+ m_hDC = ::CreateCompatibleDC(NULL);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);
+ if (!pDriver) {
+ return;
+ }
+ SetDeviceDriver(pDriver);
+}
+CFX_WinBitmapDevice::~CFX_WinBitmapDevice()
+{
+ if (m_hDC) {
+ SelectObject(m_hDC, m_hOldBitmap);
+ DeleteDC(m_hDC);
+ }
+ if (m_hBitmap) {
+ DeleteObject(m_hBitmap);
+ }
+ delete GetBitmap();
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dib.cpp b/core/src/fxge/win32/fx_win32_dib.cpp
new file mode 100644
index 0000000000..a9cf78eac3
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dib.cpp
@@ -0,0 +1,310 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
+{
+ CFX_ByteString result;
+ int len = sizeof (BITMAPINFOHEADER);
+ if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
+ len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->biBitCount = pBitmap->GetBPP();
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)pBitmap->GetHeight();
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = pBitmap->GetWidth();
+ if (pBitmap->GetBPP() == 8) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = i * 0x010101;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = pBitmap->GetPalette()[i];
+ }
+ }
+ }
+ if (pBitmap->GetBPP() == 1) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ pPalette[0] = 0;
+ pPalette[1] = 0xffffff;
+ } else {
+ pPalette[0] = pBitmap->GetPalette()[0];
+ pPalette[1] = pBitmap->GetPalette()[1];
+ }
+ }
+ result.ReleaseBuffer(len);
+ return result;
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)
+{
+ int width = pbmi->bmiHeader.biWidth;
+ int height = pbmi->bmiHeader.biHeight;
+ BOOL bBottomUp = TRUE;
+ if (height < 0) {
+ height = -height;
+ bBottomUp = FALSE;
+ }
+ int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return NULL;
+ }
+ FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
+ FX_BOOL ret = pBitmap->Create(width, height, format);
+ if (!ret) {
+ delete pBitmap;
+ return NULL;
+ }
+ FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);
+ if (bBottomUp) {
+ FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);
+ if (!temp_buf) {
+ if (pBitmap) {
+ delete pBitmap;
+ }
+ return NULL;
+ }
+ int top = 0, bottom = height - 1;
+ while (top < bottom) {
+ FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
+ top ++;
+ bottom --;
+ }
+ FX_Free(temp_buf);
+ temp_buf = NULL;
+ }
+ if (pbmi->bmiHeader.biBitCount == 1) {
+ for (int i = 0; i < 2; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ } else if (pbmi->bmiHeader.biBitCount == 8) {
+ for (int i = 0; i < 256; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ }
+ return pBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)
+{
+ return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
+}
+HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)
+{
+ CFX_ByteString info = GetBitmapInfo(pBitmap);
+ HBITMAP hBitmap = NULL;
+ hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,
+ pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ return hBitmap;
+}
+void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)
+{
+ BITMAP bmp;
+ GetObject(hBitmap, sizeof bmp, &bmp);
+ w = bmp.bmWidth;
+ h = bmp.bmHeight;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ WINDIB_Open_Args_ args;
+ args.flags = WINDIB_OPEN_PATHNAME;
+ args.path_name = filename;
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ } else if (args.flags == WINDIB_OPEN_MEMORY) {
+ return NULL;
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)
+{
+ FX_BOOL bCreatedDC = hDC == NULL;
+ if (hDC == NULL) {
+ hDC = CreateCompatibleDC(NULL);
+ }
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ int width = bmih.biWidth;
+ int height = abs(bmih.biHeight);
+ bmih.biHeight = -height;
+ bmih.biCompression = BI_RGB;
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ return NULL;
+ }
+ int ret = 0;
+ if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
+ int size = sizeof (BITMAPINFOHEADER) + 8;
+ if (bmih.biBitCount == 8) {
+ size += sizeof (FX_DWORD) * 254;
+ }
+ BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);
+ if (!pbmih) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->bmiHeader.biBitCount = bmih.biBitCount;
+ pbmih->bmiHeader.biCompression = BI_RGB;
+ pbmih->bmiHeader.biHeight = -height;
+ pbmih->bmiHeader.biPlanes = 1;
+ pbmih->bmiHeader.biWidth = bmih.biWidth;
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {
+ delete pDIBitmap;
+ FX_Free(pbmih);
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
+ FX_Free(pbmih);
+ pbmih = NULL;
+ pDIBitmap->CopyPalette(pPalette, palsize);
+ } else {
+ if (bmih.biBitCount <= 24) {
+ bmih.biBitCount = 24;
+ } else {
+ bmih.biBitCount = 32;
+ }
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ if (ret != 0 && bmih.biBitCount == 32) {
+ int pitch = pDIBitmap->GetPitch();
+ for (int row = 0; row < height; row ++) {
+ FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);
+ for (int col = 0; col < width; col++) {
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ if (ret == 0) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return pDIBitmap;
+}
+CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
+{
+ Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ bmih.biBitCount = 24;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
+ m_hMemDC = CreateCompatibleDC(hDC);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
+}
+CFX_WindowsDIB::~CFX_WindowsDIB()
+{
+ SelectObject(m_hMemDC, m_hOldBitmap);
+ DeleteDC(m_hMemDC);
+ DeleteObject(m_hBitmap);
+}
+void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
+}
+void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dwrite.cpp b/core/src/fxge/win32/fx_win32_dwrite.cpp
new file mode 100644
index 0000000000..d4c962036e
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dwrite.cpp
@@ -0,0 +1,480 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "dwrite_int.h"
+#include "../Microsoft SDK/include/DWrite.h"
+typedef HRESULT (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);
+template <typename InterfaceType>
+inline void SafeRelease(InterfaceType** currentObject)
+{
+ if (*currentObject != NULL) {
+ (*currentObject)->Release();
+ *currentObject = NULL;
+ }
+}
+template <typename InterfaceType>
+inline InterfaceType* SafeAcquire(InterfaceType* newObject)
+{
+ if (newObject != NULL) {
+ newObject->AddRef();
+ }
+ return newObject;
+}
+class CDwFontFileStream : public IDWriteFontFileStream, public CFX_Object
+{
+public:
+ explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);
+ virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
+ virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
+ virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
+ bool IsInitialized()
+ {
+ return resourcePtr_ != NULL;
+ }
+private:
+ ULONG refCount_;
+ void const* resourcePtr_;
+ DWORD resourceSize_;
+};
+class CDwFontFileLoader : public IDWriteFontFileLoader, public CFX_Object
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);
+
+ static IDWriteFontFileLoader* GetLoader()
+ {
+ if (instance_ == NULL) {
+ instance_ = FX_NEW CDwFontFileLoader();
+ return instance_;
+ }
+ return instance_;
+ }
+ static bool IsLoaderInitialized()
+ {
+ return instance_ != NULL;
+ }
+private:
+ CDwFontFileLoader();
+ ULONG refCount_;
+ static IDWriteFontFileLoader* instance_;
+};
+class CDwFontContext : public CFX_Object
+{
+public:
+ CDwFontContext(IDWriteFactory* dwriteFactory);
+ ~CDwFontContext();
+ HRESULT Initialize();
+private:
+ CDwFontContext(CDwFontContext const&);
+ void operator=(CDwFontContext const&);
+ HRESULT hr_;
+ IDWriteFactory* dwriteFactory_;
+};
+class CDwGdiTextRenderer : public CFX_Object
+{
+public:
+ CDwGdiTextRenderer(
+ CFX_DIBitmap* pBitmap,
+ IDWriteBitmapRenderTarget* bitmapRenderTarget,
+ IDWriteRenderingParams* renderingParams
+ );
+ CDwGdiTextRenderer::~CDwGdiTextRenderer();
+ HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+ );
+private:
+ CFX_DIBitmap* pBitmap_;
+ IDWriteBitmapRenderTarget* pRenderTarget_;
+ IDWriteRenderingParams* pRenderingParams_;
+};
+CDWriteExt::CDWriteExt()
+{
+ m_hModule = NULL;
+ m_pDWriteFactory = NULL;
+ m_pDwFontContext = NULL;
+ m_pDwTextRenderer = NULL;
+}
+void CDWriteExt::Load()
+{
+}
+void CDWriteExt::Unload()
+{
+ if (m_pDwFontContext) {
+ delete (CDwFontContext*)m_pDwFontContext;
+ m_pDwFontContext = NULL;
+ }
+ SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
+}
+CDWriteExt::~CDWriteExt()
+{
+ Unload();
+}
+LPVOID CDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)
+{
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteFontFile* pDwFontFile = NULL;
+ IDWriteFontFace* pDwFontFace = NULL;
+ BOOL isSupportedFontType = FALSE;
+ DWRITE_FONT_FILE_TYPE fontFileType;
+ DWRITE_FONT_FACE_TYPE fontFaceType;
+ UINT32 numberOfFaces;
+ DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);
+ HRESULT hr = S_OK;
+ hr = pDwFactory->CreateCustomFontFileReference(
+ (void const*)pData,
+ (UINT32)size,
+ CDwFontFileLoader::GetLoader(),
+ &pDwFontFile
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFontFile->Analyze(
+ &isSupportedFontType,
+ &fontFileType,
+ &fontFaceType,
+ &numberOfFaces
+ );
+ if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateFontFace(
+ fontFaceType,
+ 1,
+ &pDwFontFile,
+ 0,
+ fontStyle,
+ &pDwFontFace
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ SafeRelease(&pDwFontFile);
+ return pDwFontFace;
+failed:
+ SafeRelease(&pDwFontFile);
+ return NULL;
+}
+FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)
+{
+ if (pBitmap->GetFormat() > FXDIB_Argb) {
+ return FALSE;
+ }
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteGdiInterop* pGdiInterop = NULL;
+ IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
+ IDWriteRenderingParams* pRenderingParams = NULL;
+ HRESULT hr = S_OK;
+ hr = pDwFactory->GetGdiInterop(&pGdiInterop);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),
+ &pBitmapRenderTarget);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateCustomRenderingParams(
+ 1.0f,
+ 0.0f,
+ 1.0f,
+ DWRITE_PIXEL_GEOMETRY_RGB,
+ DWRITE_RENDERING_MODE_DEFAULT,
+ &pRenderingParams
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);
+ if (*(CDwGdiTextRenderer**)renderTarget == NULL) {
+ goto failed;
+ }
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return TRUE;
+failed:
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return FALSE;
+}
+FX_BOOL CDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances)
+{
+ if (renderTarget == NULL) {
+ return TRUE;
+ }
+ CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;
+ DWRITE_MATRIX transform;
+ DWRITE_GLYPH_RUN glyphRun;
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ transform.m11 = pMatrix->a;
+ transform.m12 = pMatrix->b;
+ transform.m21 = pMatrix->c;
+ transform.m22 = pMatrix->d;
+ transform.dx = pMatrix->e;
+ transform.dy = pMatrix->f;
+ }
+ glyphRun.fontFace = (IDWriteFontFace*)font;
+ glyphRun.fontEmSize = font_size;
+ glyphRun.glyphCount = glyph_count;
+ glyphRun.glyphIndices = glyph_indices;
+ glyphRun.glyphAdvances = glyph_advances;
+ glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;
+ glyphRun.isSideways = FALSE;
+ glyphRun.bidiLevel = 0;
+ hr = pTextRenderer->DrawGlyphRun(
+ stringRect,
+ pClipRgn,
+ pMatrix ? &transform : NULL,
+ baselineOriginX, baselineOriginY,
+ DWRITE_MEASURING_MODE_NATURAL,
+ &glyphRun,
+ RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))
+ );
+ return SUCCEEDED(hr) ? TRUE : FALSE;
+}
+void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)
+{
+ if (renderTarget) {
+ delete (CDwGdiTextRenderer*)renderTarget;
+ }
+}
+void CDWriteExt::DwDeleteFont(void* pFont)
+{
+ if (pFont) {
+ SafeRelease((IDWriteFontFace**)&pFont);
+ }
+}
+CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)
+{
+ refCount_ = 0;
+ resourcePtr_ = fontFileReferenceKey;
+ resourceSize_ = fontFileReferenceKeySize;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(
+ void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void** fragmentContext
+)
+{
+ if (fileOffset <= resourceSize_ &&
+ fragmentSize <= resourceSize_ - fileOffset) {
+ *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);
+ *fragmentContext = NULL;
+ return S_OK;
+ } else {
+ *fragmentStart = NULL;
+ *fragmentContext = NULL;
+ return E_FAIL;
+ }
+}
+void STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)
+{
+ *fileSize = resourceSize_;
+ return S_OK;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)
+{
+ *lastWriteTime = 0;
+ return E_NOTIMPL;
+}
+IDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;
+CDwFontFileLoader::CDwFontFileLoader() :
+ refCount_(0)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ instance_ = NULL;
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
+ void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream** fontFileStream
+)
+{
+ *fontFileStream = NULL;
+ CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);
+ if (stream == NULL) {
+ return E_OUTOFMEMORY;
+ }
+ if (!stream->IsInitialized()) {
+ delete stream;
+ return E_FAIL;
+ }
+ *fontFileStream = SafeAcquire(stream);
+ return S_OK;
+}
+CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :
+ hr_(S_FALSE),
+ dwriteFactory_(SafeAcquire(dwriteFactory))
+{
+}
+CDwFontContext::~CDwFontContext()
+{
+ if(dwriteFactory_ && hr_ == S_OK) {
+ dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ SafeRelease(&dwriteFactory_);
+}
+HRESULT CDwFontContext::Initialize()
+{
+ if (hr_ == S_FALSE) {
+ return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ return hr_;
+}
+CDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):
+ pBitmap_(pBitmap),
+ pRenderTarget_(SafeAcquire(bitmapRenderTarget)),
+ pRenderingParams_(SafeAcquire(renderingParams))
+{
+}
+CDwGdiTextRenderer::~CDwGdiTextRenderer()
+{
+ SafeRelease(&pRenderTarget_);
+ SafeRelease(&pRenderingParams_);
+}
+STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+)
+{
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ hr = pRenderTarget_->SetCurrentTransform(pMatrix);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+ HDC hDC = pRenderTarget_->GetMemoryDC();
+ HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ CFX_DIBitmap dib;
+ dib.Create(
+ bitmap.bmWidth,
+ bitmap.bmHeight,
+ bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,
+ (FX_LPBYTE)bitmap.bmBits
+ );
+ dib.CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ pBitmap_,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ NULL
+ );
+ hr = pRenderTarget_->DrawGlyphRun(
+ baselineOriginX,
+ baselineOriginY,
+ measuringMode,
+ glyphRun,
+ pRenderingParams_,
+ textColor
+ );
+ if (FAILED(hr)) {
+ return hr;
+ }
+ pBitmap_->CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ &dib,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ pClipRgn
+ );
+ return hr;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_gdipext.cpp b/core/src/fxge/win32/fx_win32_gdipext.cpp
new file mode 100644
index 0000000000..7f9240629c
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_gdipext.cpp
@@ -0,0 +1,1286 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../Microsoft SDK/include/GdiPlus.h"
+using namespace Gdiplus;
+using namespace Gdiplus::DllExports;
+#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
+static CombineMode GdiCombineMode2Gdip(int mode)
+{
+ switch (mode) {
+ case RGN_AND:
+ return CombineModeIntersect;
+ }
+ return CombineModeIntersect;
+}
+enum {
+ FuncId_GdipCreatePath2,
+ FuncId_GdipSetPenDashStyle,
+ FuncId_GdipSetPenDashArray,
+ FuncId_GdipSetPenDashCap197819,
+ FuncId_GdipSetPenLineJoin,
+ FuncId_GdipSetPenWidth,
+ FuncId_GdipCreateFromHDC,
+ FuncId_GdipSetPageUnit,
+ FuncId_GdipSetSmoothingMode,
+ FuncId_GdipCreateSolidFill,
+ FuncId_GdipFillPath,
+ FuncId_GdipDeleteBrush,
+ FuncId_GdipCreatePen1,
+ FuncId_GdipSetPenMiterLimit,
+ FuncId_GdipDrawPath,
+ FuncId_GdipDeletePen,
+ FuncId_GdipDeletePath,
+ FuncId_GdipDeleteGraphics,
+ FuncId_GdipCreateBitmapFromFileICM,
+ FuncId_GdipCreateBitmapFromStreamICM,
+ FuncId_GdipGetImageHeight,
+ FuncId_GdipGetImageWidth,
+ FuncId_GdipGetImagePixelFormat,
+ FuncId_GdipBitmapLockBits,
+ FuncId_GdipGetImagePaletteSize,
+ FuncId_GdipGetImagePalette,
+ FuncId_GdipBitmapUnlockBits,
+ FuncId_GdipDisposeImage,
+ FuncId_GdipFillRectangle,
+ FuncId_GdipCreateBitmapFromScan0,
+ FuncId_GdipSetImagePalette,
+ FuncId_GdipSetInterpolationMode,
+ FuncId_GdipDrawImagePointsI,
+ FuncId_GdipCreateBitmapFromGdiDib,
+ FuncId_GdiplusStartup,
+ FuncId_GdipDrawLineI,
+ FuncId_GdipResetClip,
+ FuncId_GdipCreatePath,
+ FuncId_GdipAddPathPath,
+ FuncId_GdipSetPathFillMode,
+ FuncId_GdipSetClipPath,
+ FuncId_GdipGetClip,
+ FuncId_GdipCreateRegion,
+ FuncId_GdipGetClipBoundsI,
+ FuncId_GdipSetClipRegion,
+ FuncId_GdipWidenPath,
+ FuncId_GdipAddPathLine,
+ FuncId_GdipAddPathRectangle,
+ FuncId_GdipDeleteRegion,
+ FuncId_GdipGetDC,
+ FuncId_GdipReleaseDC,
+ FuncId_GdipSetPenLineCap197819,
+ FuncId_GdipSetPenDashOffset,
+ FuncId_GdipResetPath,
+ FuncId_GdipCreateRegionPath,
+ FuncId_GdipCreateFont,
+ FuncId_GdipGetFontSize,
+ FuncId_GdipCreateFontFamilyFromName,
+ FuncId_GdipSetTextRenderingHint,
+ FuncId_GdipDrawDriverString,
+ FuncId_GdipCreateMatrix2,
+ FuncId_GdipDeleteMatrix,
+ FuncId_GdipSetWorldTransform,
+ FuncId_GdipResetWorldTransform,
+ FuncId_GdipDeleteFontFamily,
+ FuncId_GdipDeleteFont,
+ FuncId_GdipNewPrivateFontCollection,
+ FuncId_GdipDeletePrivateFontCollection,
+ FuncId_GdipPrivateAddMemoryFont,
+ FuncId_GdipGetFontCollectionFamilyList,
+ FuncId_GdipGetFontCollectionFamilyCount,
+ FuncId_GdipSetTextContrast,
+ FuncId_GdipSetPixelOffsetMode,
+ FuncId_GdipGetImageGraphicsContext,
+ FuncId_GdipDrawImageI,
+ FuncId_GdipDrawImageRectI,
+ FuncId_GdipDrawString,
+ FuncId_GdipSetPenTransform,
+};
+static LPCSTR g_GdipFuncNames[] = {
+ "GdipCreatePath2",
+ "GdipSetPenDashStyle",
+ "GdipSetPenDashArray",
+ "GdipSetPenDashCap197819",
+ "GdipSetPenLineJoin",
+ "GdipSetPenWidth",
+ "GdipCreateFromHDC",
+ "GdipSetPageUnit",
+ "GdipSetSmoothingMode",
+ "GdipCreateSolidFill",
+ "GdipFillPath",
+ "GdipDeleteBrush",
+ "GdipCreatePen1",
+ "GdipSetPenMiterLimit",
+ "GdipDrawPath",
+ "GdipDeletePen",
+ "GdipDeletePath",
+ "GdipDeleteGraphics",
+ "GdipCreateBitmapFromFileICM",
+ "GdipCreateBitmapFromStreamICM",
+ "GdipGetImageHeight",
+ "GdipGetImageWidth",
+ "GdipGetImagePixelFormat",
+ "GdipBitmapLockBits",
+ "GdipGetImagePaletteSize",
+ "GdipGetImagePalette",
+ "GdipBitmapUnlockBits",
+ "GdipDisposeImage",
+ "GdipFillRectangle",
+ "GdipCreateBitmapFromScan0",
+ "GdipSetImagePalette",
+ "GdipSetInterpolationMode",
+ "GdipDrawImagePointsI",
+ "GdipCreateBitmapFromGdiDib",
+ "GdiplusStartup",
+ "GdipDrawLineI",
+ "GdipResetClip",
+ "GdipCreatePath",
+ "GdipAddPathPath",
+ "GdipSetPathFillMode",
+ "GdipSetClipPath",
+ "GdipGetClip",
+ "GdipCreateRegion",
+ "GdipGetClipBoundsI",
+ "GdipSetClipRegion",
+ "GdipWidenPath",
+ "GdipAddPathLine",
+ "GdipAddPathRectangle",
+ "GdipDeleteRegion",
+ "GdipGetDC",
+ "GdipReleaseDC",
+ "GdipSetPenLineCap197819",
+ "GdipSetPenDashOffset",
+ "GdipResetPath",
+ "GdipCreateRegionPath",
+ "GdipCreateFont",
+ "GdipGetFontSize",
+ "GdipCreateFontFamilyFromName",
+ "GdipSetTextRenderingHint",
+ "GdipDrawDriverString",
+ "GdipCreateMatrix2",
+ "GdipDeleteMatrix",
+ "GdipSetWorldTransform",
+ "GdipResetWorldTransform",
+ "GdipDeleteFontFamily",
+ "GdipDeleteFont",
+ "GdipNewPrivateFontCollection",
+ "GdipDeletePrivateFontCollection",
+ "GdipPrivateAddMemoryFont",
+ "GdipGetFontCollectionFamilyList",
+ "GdipGetFontCollectionFamilyCount",
+ "GdipSetTextContrast",
+ "GdipSetPixelOffsetMode",
+ "GdipGetImageGraphicsContext",
+ "GdipDrawImageI",
+ "GdipDrawImageRectI",
+ "GdipDrawString",
+ "GdipSetPenTransform",
+};
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);
+typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);
+#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
+typedef HANDLE (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);
+typedef BOOL (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
+void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)
+{
+ if (m_pGdiAddFontMemResourceEx) {
+ return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
+ }
+ return NULL;
+}
+FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)
+{
+ if (m_pGdiRemoveFontMemResourseEx) {
+ return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);
+ }
+ return FALSE;
+}
+static GpBrush* _GdipCreateBrush(DWORD argb)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpSolidFill* solidBrush = NULL;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ return solidBrush;
+}
+static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,
+ const CFX_DIBitmap* pSource, FX_RECT* pClipRect)
+{
+ FX_BOOL bFlipX = dest_width < 0;
+ if (bFlipX) {
+ dest_width = -dest_width;
+ }
+ FX_BOOL bFlipY = dest_height < 0;
+ if (bFlipY) {
+ dest_height = -dest_height;
+ }
+ int result_width = pClipRect->Width();
+ int result_height = pClipRect->Height();
+ int result_pitch = (result_width + 3) / 4 * 4;
+ CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;
+ if (!pStretched) {
+ return NULL;
+ }
+ if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
+ delete pStretched;
+ return NULL;
+ }
+ LPBYTE dest_buf = pStretched->GetBuffer();
+ int src_width = pSource->GetWidth();
+ int src_height = pSource->GetHeight();
+ int src_count = src_width * src_height;
+ int dest_count = dest_width * dest_height;
+ int ratio = 255 * dest_count / src_count;
+ int y_unit = src_height / dest_height;
+ int x_unit = src_width / dest_width;
+ int area_unit = y_unit * x_unit;
+ LPBYTE src_buf = pSource->GetBuffer();
+ int src_pitch = pSource->GetPitch();
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
+ int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);
+ src_y_start = src_y_start * src_height / dest_height;
+ LPBYTE src_scan = src_buf + src_y_start * src_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int sum = 0;
+ int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);
+ src_x_start = src_x_start * src_width / dest_width;
+ int src_x_end = src_x_start + x_unit;
+ LPBYTE src_line = src_scan;
+ for (int src_y = 0; src_y < y_unit; src_y ++) {
+ for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {
+ if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ sum += 255;
+ }
+ }
+ src_line += src_pitch;
+ }
+ dest_scan[dest_x] = 255 - sum / area_unit;
+ }
+ }
+ return pStretched;
+}
+static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer();
+ if (src_width == 1 && src_height == 1) {
+ if ((scan0[0] & 0x80) == 0) {
+ return;
+ }
+ GpSolidFill* solidBrush;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ if (dest_width < 0) {
+ dest_width = -dest_width;
+ dest_left -= dest_width;
+ }
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,
+ (float)dest_width, (float)dest_height);
+ CallFunc(GdipDeleteBrush)(solidBrush);
+ return;
+ }
+ if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {
+ FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+ image_rect.Normalize();
+ FX_RECT image_clip = image_rect;
+ image_clip.Intersect(*pClipRect);
+ if (image_clip.IsEmpty()) {
+ return;
+ }
+ image_clip.Offset(-image_rect.left, -image_rect.top);
+ CFX_DIBitmap* pStretched = NULL;
+ if (src_width * src_height > 10000) {
+ pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
+ } else {
+ pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
+ (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);
+ int a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,
+ image_rect.top + image_clip.top);
+ CallFunc(GdipDisposeImage)(bitmap);
+ delete pStretched;
+ return;
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);
+ UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int dest_width, int dest_height)
+{
+ int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
+ FX_RECT new_rect(0, 0, src_width, src_height);
+ CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
+ if (!pCloned) {
+ return;
+ }
+ OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);
+ delete pCloned;
+ return;
+ }
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;
+ GpBitmap* bitmap = NULL;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Argb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppARGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb32:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat24bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_8bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat8bppIndexed, scan0, &bitmap);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = pBitmap->GetPaletteEntry(i);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ break;
+ }
+ case FXDIB_1bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat1bppIndexed, scan0, &bitmap);
+ break;
+ }
+ }
+ if (dest_height < 0) {
+ dest_height --;
+ }
+ if (dest_width < 0) {
+ dest_width --;
+ }
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+CGdiplusExt::CGdiplusExt()
+{
+ m_hModule = NULL;
+ m_GdiModule = NULL;
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = NULL;
+ }
+ m_pGdiAddFontMemResourceEx = NULL;
+ m_pGdiRemoveFontMemResourseEx = NULL;
+}
+void CGdiplusExt::Load()
+{
+ CFX_ByteString strPlusPath = "";
+ FX_CHAR buf[MAX_PATH];
+ GetSystemDirectoryA(buf, MAX_PATH);
+ strPlusPath += buf;
+ strPlusPath += "\\";
+ strPlusPath += "GDIPLUS.DLL";
+ m_hModule = LoadLibraryA(strPlusPath);
+ if (m_hModule == NULL) {
+ return;
+ }
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
+ if (m_Functions[i] == NULL) {
+ m_hModule = NULL;
+ return;
+ }
+ }
+ FX_UINTPTR gdiplusToken;
+ GdiplusStartupInput gdiplusStartupInput;
+ ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);
+ m_GdiModule = LoadLibraryA("GDI32.DLL");
+ if (m_GdiModule == NULL) {
+ return;
+ }
+ m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
+ m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
+}
+CGdiplusExt::~CGdiplusExt()
+{
+}
+LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)
+{
+ GpFontCollection* pCollection = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipNewPrivateFontCollection)(&pCollection);
+ GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
+ if (status == Ok) {
+ return pCollection;
+ }
+ CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
+ return NULL;
+}
+void CGdiplusExt::DeleteMemFont(LPVOID pCollection)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
+}
+FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ PixelFormat format;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb:
+ format = PixelFormat24bppRGB;
+ break;
+ case FXDIB_Rgb32:
+ format = PixelFormat32bppRGB;
+ break;
+ case FXDIB_Argb:
+ format = PixelFormat32bppARGB;
+ break;
+ default:
+ return FALSE;
+ }
+ GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),
+ pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)
+{
+ REAL get_size;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);
+ if (status == Ok) {
+ *size = (FX_FLOAT)get_size;
+ } else {
+ *size = 0;
+ }
+}
+void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);
+}
+void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
+}
+FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics, unsigned short *text, int length,
+ void *font, void* brush, void *positions, int flags, const void *matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,
+ (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
+}
+void CGdiplusExt::GdipDeleteBrush(void* pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
+}
+void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int numFamilies = 0;
+ GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFontFamily* family_list[1];
+ status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFont* pFont = NULL;
+ status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);
+ if (status != Ok) {
+ return NULL;
+ }
+ return pFont;
+}
+void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
+}
+void CGdiplusExt::GdipDeleteMatrix(void* matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
+}
+void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
+}
+void CGdiplusExt::GdipDeleteFont(void* pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFont)((GpFont*)pFont);
+}
+void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
+}
+void CGdiplusExt::GdipDisposeImage(void* bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
+}
+void CGdiplusExt::GdipDeleteGraphics(void* graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
+}
+FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpGraphics* pGraphics = NULL;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ }
+ OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)
+{
+ GpGraphics* pGraphics;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
+ }
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
+ if (!bTextMode) {
+ FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
+ if (width < unit) {
+ width = unit;
+ }
+ }
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
+ LineCap lineCap;
+ DashCap dashCap = DashCapFlat;
+ FX_BOOL bDashExtend = FALSE;
+ switch(pGraphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapButt:
+ lineCap = LineCapFlat;
+ break;
+ case CFX_GraphStateData::LineCapRound:
+ lineCap = LineCapRound;
+ dashCap = DashCapRound;
+ bDashExtend = TRUE;
+ break;
+ case CFX_GraphStateData::LineCapSquare:
+ lineCap = LineCapSquare;
+ bDashExtend = TRUE;
+ break;
+ }
+ CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
+ LineJoin lineJoin;
+ switch(pGraphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinMiter:
+ lineJoin = LineJoinMiterClipped;
+ break;
+ case CFX_GraphStateData::LineJoinRound:
+ lineJoin = LineJoinRound;
+ break;
+ case CFX_GraphStateData::LineJoinBevel:
+ lineJoin = LineJoinBevel;
+ break;
+ }
+ CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
+ if(pGraphState->m_DashCount) {
+ FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
+ if (!pDashArray) {
+ return NULL;
+ }
+ int nCount = 0;
+ FX_FLOAT on_leftover = 0, off_leftover = 0;
+ for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
+ FX_FLOAT on_phase = pGraphState->m_DashArray[i];
+ FX_FLOAT off_phase;
+ if (i == pGraphState->m_DashCount - 1) {
+ off_phase = on_phase;
+ } else {
+ off_phase = pGraphState->m_DashArray[i + 1];
+ }
+ on_phase /= width;
+ off_phase /= width;
+ if (on_phase + off_phase <= 0.00002f) {
+ on_phase = 1.0f / 10;
+ off_phase = 1.0f / 10;
+ }
+ if (bDashExtend) {
+ if (off_phase < 1) {
+ off_phase = 0;
+ } else {
+ off_phase -= 1;
+ }
+ on_phase += 1;
+ }
+ if (on_phase == 0 || off_phase == 0) {
+ if (nCount == 0) {
+ on_leftover += on_phase;
+ off_leftover += off_phase;
+ } else {
+ pDashArray[nCount - 2] += on_phase;
+ pDashArray[nCount - 1] += off_phase;
+ }
+ } else {
+ pDashArray[nCount++] = on_phase + on_leftover;
+ on_leftover = 0;
+ pDashArray[nCount++] = off_phase + off_leftover;
+ off_leftover = 0;
+ }
+ }
+ CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
+ FX_FLOAT phase = pGraphState->m_DashPhase;
+ if (bDashExtend)
+ if (phase < 0.5f) {
+ phase = 0;
+ } else {
+ phase -= 0.5f;
+ }
+ CallFunc(GdipSetPenDashOffset)(pPen, phase);
+ FX_Free(pDashArray);
+ pDashArray = NULL;
+ }
+ CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
+ return pPen;
+}
+static BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)
+{
+ int pairs[] = {1, 2, 0, 2, 0, 1};
+ for (int i = 0; i < 3; i ++) {
+ int pair1 = pairs[i * 2];
+ int pair2 = pairs[i * 2 + 1];
+ FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
+ FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ pMatrix->Transform(x2, y2);
+ }
+ FX_FLOAT dx = x1 - x2;
+ FX_FLOAT dy = y1 - y2;
+ FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
+ if (distance_square < (1.0f * 2 + 1.0f / 4)) {
+ v1 = i;
+ v2 = pair1;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ )
+{
+ int nPoints = pPathData->GetPointCount();
+ if (nPoints == 0) {
+ return TRUE;
+ }
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ GpGraphics* pGraphics = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
+ GpMatrix* pMatrix = NULL;
+ if (pObject2Device) {
+ CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);
+ CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
+ }
+ PointF *points = FX_Alloc(PointF, nPoints);
+ if (!points) {
+ return FALSE;
+ }
+ BYTE * types = FX_Alloc(BYTE, nPoints);
+ if (!types) {
+ FX_Free(points);
+ return FALSE;
+ }
+ int nSubPathes = 0;
+ FX_BOOL bSubClose = FALSE;
+ int pos_subclose = 0;
+ FX_BOOL bSmooth = FALSE;
+ int startpoint = 0;
+ for(int i = 0; i < nPoints; i++) {
+ points[i].X = pPoints[i].m_PointX;
+ points[i].Y = pPoints[i].m_PointY;
+ FX_FLOAT x, y;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
+ } else {
+ x = pPoints[i].m_PointX;
+ y = pPoints[i].m_PointY;
+ }
+ if (x > 50000 * 1.0f) {
+ points[i].X = 50000 * 1.0f;
+ }
+ if (x < -50000 * 1.0f) {
+ points[i].X = -50000 * 1.0f;
+ }
+ if (y > 50000 * 1.0f) {
+ points[i].Y = 50000 * 1.0f;
+ }
+ if (y < -50000 * 1.0f) {
+ points[i].Y = -50000 * 1.0f;
+ }
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == FXPT_MOVETO) {
+ types[i] = PathPointTypeStart;
+ nSubPathes ++;
+ bSubClose = FALSE;
+ startpoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ types[i] = PathPointTypeLine;
+ if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+ points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
+ points[i].X += 0.01f;
+ continue;
+ }
+ if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {
+ bSmooth = TRUE;
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ types[i] = PathPointTypeBezier;
+ bSmooth = TRUE;
+ }
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+ if (bSubClose) {
+ types[pos_subclose] &= ~PathPointTypeCloseSubpath;
+ } else {
+ bSubClose = TRUE;
+ }
+ pos_subclose = i;
+ types[i] |= PathPointTypeCloseSubpath;
+ if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {
+ bSmooth = TRUE;
+ }
+ }
+ }
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ bSmooth = FALSE;
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
+ } else if (!(fill_mode & FXFILL_FULLCOVER)) {
+ if (!bSmooth && (fill_mode & 3)) {
+ bSmooth = TRUE;
+ }
+ if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
+ }
+ }
+ int new_fill_mode = fill_mode & 3;
+ if (nPoints == 4 && pGraphState == NULL) {
+ int v1, v2;
+ if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
+ CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
+ FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
+ CallFunc(GdipDeletePen)(pPen);
+ return TRUE;
+ }
+ }
+ GpPath* pGpPath = NULL;
+ CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);
+ if (!pGpPath) {
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return FALSE;
+ }
+ if (new_fill_mode) {
+ GpBrush* pBrush = _GdipCreateBrush(fill_argb);
+ CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
+ CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
+ CallFunc(GdipDeleteBrush)(pBrush);
+ }
+ if (pGraphState && stroke_argb) {
+ GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);
+ if (nSubPathes == 1) {
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
+ } else {
+ int iStart = 0;
+ for (int i = 0; i < nPoints; i ++) {
+ if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
+ GpPath* pSubPath;
+ CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);
+ iStart = i + 1;
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
+ CallFunc(GdipDeletePath)(pSubPath);
+ }
+ }
+ }
+ CallFunc(GdipDeletePen)(pPen);
+ }
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeletePath)(pGpPath);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+class GpStream : public IStream, public CFX_Object
+{
+ LONG m_RefCount;
+ int m_ReadPos;
+ CFX_ByteTextBuf m_InterStream;
+public:
+ GpStream()
+ {
+ m_RefCount = 1;
+ m_ReadPos = 0;
+ }
+ virtual HRESULT STDMETHODCALLTYPE
+ QueryInterface(REFIID iid, void ** ppvObject)
+ {
+ if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
+ iid == __uuidof(ISequentialStream)) {
+ *ppvObject = static_cast<IStream*>(this);
+ AddRef();
+ return S_OK;
+ } else {
+ return E_NOINTERFACE;
+ }
+ }
+ virtual ULONG STDMETHODCALLTYPE AddRef(void)
+ {
+ return (ULONG)InterlockedIncrement(&m_RefCount);
+ }
+ virtual ULONG STDMETHODCALLTYPE Release(void)
+ {
+ ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);
+ if (res == 0) {
+ delete this;
+ }
+ return res;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)
+ {
+ size_t bytes_left;
+ size_t bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = 0;
+ }
+ if (m_ReadPos == m_InterStream.GetLength()) {
+ return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
+ }
+ bytes_left = m_InterStream.GetLength() - m_ReadPos;
+ bytes_out = FX_MIN(cb, bytes_left);
+ FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
+ m_ReadPos += (FX_INT32)bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = (ULONG)bytes_out;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)
+ {
+ if (cb <= 0) {
+ if (pcbWritten != NULL) {
+ *pcbWritten = 0;
+ }
+ return S_OK;
+ }
+ m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
+ if (pcbWritten != NULL) {
+ *pcbWritten = cb;
+ }
+ return S_OK;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Revert(void)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)
+ {
+ long start = 0;
+ long new_read_position;
+ switch(dwOrigin) {
+ case STREAM_SEEK_SET:
+ start = 0;
+ break;
+ case STREAM_SEEK_CUR:
+ start = m_ReadPos;
+ break;
+ case STREAM_SEEK_END:
+ start = m_InterStream.GetLength();
+ break;
+ default:
+ return STG_E_INVALIDFUNCTION;
+ break;
+ }
+ new_read_position = start + (long)liDistanceToMove.QuadPart;
+ if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {
+ return STG_E_SEEKERROR;
+ }
+ m_ReadPos = new_read_position;
+ if (lpNewFilePointer != NULL) {
+ lpNewFilePointer->QuadPart = m_ReadPos;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)
+ {
+ if (pStatstg == NULL) {
+ return STG_E_INVALIDFUNCTION;
+ }
+ ZeroMemory(pStatstg, sizeof(STATSTG));
+ pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
+ return S_OK;
+ }
+};
+typedef struct {
+ BITMAPINFO* pbmi;
+ int Stride;
+ LPBYTE pScan0;
+ GpBitmap* pBitmap;
+ BitmapData* pBitmapData;
+ GpStream* pStream;
+} PREVIEW3_DIBITMAP;
+static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ GpBitmap* pBitmap;
+ GpStream* pStream = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ Status status = Ok;
+ if (args.flags == WINDIB_OPEN_PATHNAME) {
+ status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);
+ } else {
+ if (args.memory_size == 0 || !args.memory_base) {
+ return NULL;
+ }
+ pStream = FX_NEW GpStream;
+ if (!pStream) {
+ return NULL;
+ }
+ pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
+ status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
+ }
+ if (status != Ok) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ UINT height, width;
+ CallFunc(GdipGetImageHeight)(pBitmap, &height);
+ CallFunc(GdipGetImageWidth)(pBitmap, &width);
+ PixelFormat pixel_format;
+ CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
+ int info_size = sizeof(BITMAPINFOHEADER);
+ int bpp = 24;
+ int dest_pixel_format = PixelFormat24bppRGB;
+ if (pixel_format == PixelFormat1bppIndexed) {
+ info_size += 8;
+ bpp = 1;
+ dest_pixel_format = PixelFormat1bppIndexed;
+ } else if (pixel_format == PixelFormat8bppIndexed) {
+ info_size += 1024;
+ bpp = 8;
+ dest_pixel_format = PixelFormat8bppIndexed;
+ } else if (pixel_format == PixelFormat32bppARGB) {
+ bpp = 32;
+ dest_pixel_format = PixelFormat32bppARGB;
+ }
+ LPBYTE buf = FX_Alloc(BYTE, info_size);
+ if (!buf) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
+ FXSYS_memset32(buf, 0, info_size);
+ pbmih->biBitCount = bpp;
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)height;
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = width;
+ Rect rect(0, 0, width, height);
+ BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
+ if (!pBitmapData) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
+ dest_pixel_format, pBitmapData);
+ if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {
+ DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
+ struct {
+ UINT flags;
+ UINT Count;
+ DWORD Entries[256];
+ } pal;
+ int size = 0;
+ CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
+ CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
+ int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
+ for (int i = 0; i < entries; i ++) {
+ ppal[i] = pal.Entries[i] & 0x00ffffff;
+ }
+ }
+ PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
+ if (!pInfo) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ pInfo->pbmi = (BITMAPINFO*)buf;
+ pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
+ pInfo->Stride = pBitmapData->Stride;
+ pInfo->pBitmap = pBitmap;
+ pInfo->pBitmapData = pBitmapData;
+ pInfo->pStream = pStream;
+ return pInfo;
+}
+static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
+ CallFunc(GdipDisposeImage)(pInfo->pBitmap);
+ FX_Free(pInfo->pBitmapData);
+ FX_Free((LPBYTE)pInfo->pbmi);
+ if (pInfo->pStream) {
+ pInfo->pStream->Release();
+ }
+ FX_Free(pInfo);
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);
+CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
+ if (pInfo == NULL) {
+ return NULL;
+ }
+ int height = abs(pInfo->pbmi->bmiHeader.biHeight);
+ int width = pInfo->pbmi->bmiHeader.biWidth;
+ int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);
+ if (pData == NULL) {
+ FreeDIBitmap(pInfo);
+ return NULL;
+ }
+ if (dest_pitch == pInfo->Stride) {
+ FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);
+ } else for (int i = 0; i < height; i ++) {
+ FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);
+ }
+ CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
+ FX_Free(pData);
+ FreeDIBitmap(pInfo);
+ return pDIBitmap;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_print.cpp b/core/src/fxge/win32/fx_win32_print.cpp
new file mode 100644
index 0000000000..c08c8e7bb6
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_print.cpp
@@ -0,0 +1,426 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#define SIZETHRESHOLD 1000
+#define OUTPUTPSLEN 4096
+CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)
+{
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_bSupportROP = TRUE;
+}
+int CGdiPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ if (caps_id == FXDC_HORZ_SIZE) {
+ return m_HorzSize;
+ }
+ if (caps_id == FXDC_VERT_SIZE) {
+ return m_VertSize;
+ }
+ return CGdiDeviceDriver::GetDeviceCaps(caps_id);
+}
+FX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (pSource->IsAlphaMask()) {
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+}
+FX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pSource->IsAlphaMask()) {
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);
+ } else {
+ ASSERT(pSource != NULL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+}
+static CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)
+{
+ ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ int full_left = full_rect.left;
+ int full_top = full_rect.top;
+ CFX_DIBExtractor src_bitmap(pSrc);
+ CFX_DIBitmap* pSrcBitmap = src_bitmap;
+ if (pSrcBitmap == NULL) {
+ return NULL;
+ }
+ int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();
+ FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();
+ FX_DWORD src_pitch = pSrcBitmap->GetPitch();
+ FX_FLOAT dest_area = pDestMatrix->GetUnitArea();
+ FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);
+ FX_FLOAT size_scale = FXSYS_sqrt(area_scale);
+ CFX_AffineMatrix adjusted_matrix(*pDestMatrix);
+ adjusted_matrix.Scale(size_scale, size_scale);
+ CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();
+ FX_RECT result_rect = result_rect_f.GetOutterRect();
+ CFX_AffineMatrix src2result;
+ src2result.e = adjusted_matrix.c + adjusted_matrix.e;
+ src2result.f = adjusted_matrix.d + adjusted_matrix.f;
+ src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();
+ src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();
+ src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();
+ src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();
+ src2result.TranslateI(-result_rect.left, -result_rect.top);
+ CFX_AffineMatrix result2src;
+ result2src.SetReverse(src2result);
+ CPDF_FixedMatrix result2src_fix(result2src, 8);
+ int result_width = result_rect.Width();
+ int result_height = result_rect.Height();
+ CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTempBitmap) {
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {
+ delete pTempBitmap;
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ pTempBitmap->CopyPalette(pSrc->GetPalette());
+ FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();
+ int dest_pitch = pTempBitmap->GetPitch();
+ FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);
+ if (pSrcBitmap->IsAlphaMask()) {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);
+ }
+ }
+ } else {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));
+ }
+ }
+ }
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return pTempBitmap;
+}
+FX_BOOL CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {
+ return FALSE;
+ }
+ CFX_FloatRect unit_rect = pMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {
+ FX_BOOL bFlipX = pMatrix->a < 0;
+ FX_BOOL bFlipY = pMatrix->d > 0;
+ return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,
+ bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ }
+ if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {
+ CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);
+ if (pTransformed == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ delete pTransformed;
+ return ret;
+ }
+ if (pSource->GetBPP() == 1) {
+ CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);
+ if (pIccTransform == NULL) {
+ return FALSE;
+ }
+ SaveState();
+ CFX_PathData path;
+ path.AppendRect(0, 0, 1.0f, 1.0f);
+ SetClip_PathFill(&path, pMatrix, WINDING);
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ RestoreState();
+ delete pTransformed;
+ handle = NULL;
+ return ret;
+ }
+ return FALSE;
+}
+CPSOutput::CPSOutput(HDC hDC)
+{
+ m_hDC = hDC;
+ m_pBuf = NULL;
+}
+CPSOutput::~CPSOutput()
+{
+ if (m_pBuf) {
+ FX_Free(m_pBuf);
+ }
+}
+void CPSOutput::Init()
+{
+ m_pBuf = FX_Alloc(FX_CHAR, 1026);
+}
+void CPSOutput::OutputPS(FX_LPCSTR string, int len)
+{
+ if (len < 0) {
+ len = (int)FXSYS_strlen(string);
+ }
+ int sent_len = 0;
+ while (len > 0) {
+ int send_len = len > 1024 ? 1024 : len;
+ *(FX_WORD*)m_pBuf = send_len;
+ FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);
+ int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);
+ sent_len += send_len;
+ len -= send_len;
+ }
+}
+CPSPrinterDriver::CPSPrinterDriver()
+{
+ m_pPSOutput = NULL;
+ m_bCmykOutput = FALSE;
+}
+CPSPrinterDriver::~CPSPrinterDriver()
+{
+ EndRendering();
+ if (m_pPSOutput) {
+ delete m_pPSOutput;
+ }
+}
+FX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)
+{
+ m_hDC = hDC;
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_pPSOutput = FX_NEW CPSOutput(hDC);
+ if (!m_pPSOutput) {
+ return FALSE;
+ }
+ ((CPSOutput*)m_pPSOutput)->Init();
+ m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);
+ m_bCmykOutput = bCmykOutput;
+ HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);
+ int ret = ::GetClipRgn(hDC, hRgn);
+ if (ret == 1) {
+ ret = ::GetRegionData(hRgn, 0, NULL);
+ if (ret) {
+ RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);
+ if (!pData) {
+ return FALSE;
+ }
+ ret = ::GetRegionData(hRgn, ret, pData);
+ if (ret) {
+ CFX_PathData path;
+ path.AllocPointCount(pData->rdh.nCount * 5);
+ for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {
+ RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);
+ path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);
+ }
+ m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);
+ }
+ FX_Free(pData);
+ }
+ }
+ ::DeleteObject(hRgn);
+ return TRUE;
+}
+int CPSPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return FXDC_PRINTER;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;
+ case FXDC_HORZ_SIZE:
+ return m_HorzSize;
+ case FXDC_VERT_SIZE:
+ return m_VertSize;
+ }
+ return 0;
+}
+FX_BOOL CPSPrinterDriver::StartRendering()
+{
+ return m_PSRenderer.StartRendering();
+}
+void CPSPrinterDriver::EndRendering()
+{
+ m_PSRenderer.EndRendering();
+}
+void CPSPrinterDriver::SaveState()
+{
+ m_PSRenderer.SaveState();
+}
+void CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_PSRenderer.RestoreState(bKeepSaved);
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,
+ int fill_mode)
+{
+ m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState)
+{
+ m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)
+{
+ *pRect = m_PSRenderer.GetClipBox();
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (bitmap_alpha < 255) {
+ return FALSE;
+ }
+ handle = NULL;
+ return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+}
+#endif
diff --git a/core/src/fxge/win32/win32_int.h b/core/src/fxge/win32/win32_int.h
new file mode 100644
index 0000000000..3f940eda1e
--- /dev/null
+++ b/core/src/fxge/win32/win32_int.h
@@ -0,0 +1,238 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct WINDIB_Open_Args_;
+class CGdiplusExt
+{
+public:
+ CGdiplusExt();
+ ~CGdiplusExt();
+ void Load();
+ FX_BOOL IsAvailable()
+ {
+ return m_hModule != NULL;
+ }
+ FX_BOOL StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);
+ FX_BOOL StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);
+ FX_BOOL DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ );
+
+ void* LoadMemFont(FX_BYTE* pData, FX_DWORD size);
+ void DeleteMemFont(void* pFontCollection);
+ FX_BOOL GdipCreateFromImage(void* bitmap, void** graphics);
+ void GdipDeleteGraphics(void* graphics);
+ void GdipSetTextRenderingHint(void* graphics, int mode);
+ void GdipSetPageUnit(void* graphics, FX_DWORD unit);
+ void GdipSetWorldTransform(void* graphics, void* pMatrix);
+ FX_BOOL GdipDrawDriverString(void *graphics, unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);
+ void GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);
+ void GdipDeleteBrush(void* pBrush);
+ void GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);
+ void GdipDeleteMatrix(void* matrix);
+ FX_BOOL GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);
+ void GdipDeleteFontFamily(void* pFamily);
+ FX_BOOL GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);
+ void* GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);
+ void GdipDeleteFont(void* pFont);
+ FX_BOOL GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);
+ void GdipDisposeImage(void* bitmap);
+ void GdipGetFontSize(void *pFont, FX_FLOAT *size);
+ void* GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);
+ FX_BOOL GdiRemoveFontMemResourceEx(void* handle);
+ void* m_Functions[100];
+ void* m_pGdiAddFontMemResourceEx;
+ void* m_pGdiRemoveFontMemResourseEx;
+ CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
+protected:
+ HMODULE m_hModule;
+ HMODULE m_GdiModule;
+};
+#include "dwrite_int.h"
+class CWin32Platform : public CFX_Object
+{
+public:
+ FX_BOOL m_bHalfTone;
+ CGdiplusExt m_GdiplusExt;
+ CDWriteExt m_DWriteExt;
+};
+class CGdiDeviceDriver : public IFX_RenderDeviceDriver
+{
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual void SaveState()
+ {
+ SaveDC(m_hDC);
+ }
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE)
+ {
+ RestoreDC(m_hDC, -1);
+ if (bKeepSaved) {
+ SaveDC(m_hDC);
+ }
+ }
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ FX_DWORD fill_color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_LPVOID GetClipRgn() ;
+ virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);
+ virtual void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ FX_BOOL GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform);
+ HDC m_hDC;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_DeviceClass, m_RenderCaps;
+ CGdiDeviceDriver(HDC hDC, int device_class);
+ ~CGdiDeviceDriver() {}
+};
+class CGdiDisplayDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiDisplayDriver(HDC hDC);
+protected:
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+ {
+ return FALSE;
+ }
+ FX_BOOL UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+};
+class CGdiPrinterDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiPrinterDriver(HDC hDC);
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ int m_HorzSize, m_VertSize;
+ FX_BOOL m_bSupportROP;
+};
+class CPSOutput : public IFX_PSOutput, public CFX_Object
+{
+public:
+ CPSOutput(HDC hDC);
+ virtual ~CPSOutput();
+ virtual void Release()
+ {
+ delete this;
+ }
+ void Init();
+ virtual void OutputPS(FX_LPCSTR string, int len);
+ HDC m_hDC;
+ FX_LPSTR m_pBuf;
+};
+class CPSPrinterDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CPSPrinterDriver();
+ FX_BOOL Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);
+ ~CPSPrinterDriver();
+protected:
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return TRUE;
+ }
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL StartRendering();
+ virtual void EndRendering();
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ HDC m_hDC;
+ FX_BOOL m_bCmykOutput;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_HorzSize, m_VertSize;
+ CPSOutput* m_pPSOutput;
+ CFX_PSRenderer m_PSRenderer;
+};
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);
diff --git a/core/src/reflow/autoreflow.cpp b/core/src/reflow/autoreflow.cpp
new file mode 100644
index 0000000000..8c37960932
--- /dev/null
+++ b/core/src/reflow/autoreflow.cpp
@@ -0,0 +1,781 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "autoreflow.h"
+#define approachto(a,b,c) (FXSYS_fabs((float)((a)-(b)))>(c) ? 0 : 1)
+int FPDF_ProcessInterObj(const CPDF_PageObject* pPrevObj, const CPDF_PageObject* pObj)
+{
+ CFX_AffineMatrix matrix;
+ FX_RECT PreRect = pPrevObj->GetBBox(&matrix);
+ FX_RECT rect = pObj->GetBBox(&matrix);
+ int flag = 0;
+ if(PreRect.top > rect.bottom) {
+ flag = 0;
+ } else if(rect.top > PreRect.bottom) {
+ flag = 1;
+ } else if(PreRect.right < rect.left) {
+ flag = 0;
+ } else if(PreRect.left > rect.right) {
+ flag = 1;
+ } else if(pObj->m_Type != PDFPAGE_TEXT) {
+ flag = 1;
+ } else if(pPrevObj->m_Type != PDFPAGE_TEXT) {
+ flag = 0;
+ } else {
+ if((PreRect.top < rect.top && PreRect.bottom > rect.bottom) ||
+ (PreRect.top > rect.top && PreRect.bottom < rect.bottom)) {
+ if(PreRect.left > rect.left) {
+ flag = 1;
+ } else {
+ flag = 0;
+ }
+ } else {
+ CPDF_TextObject* pPrevTextObj = (CPDF_TextObject* )pPrevObj;
+ CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+ CPDF_TextObjectItem item, prevItem;
+ pPrevTextObj->GetItemInfo(0, &prevItem);
+ pTextObj->GetItemInfo(0, &item);
+ CFX_AffineMatrix TextMatrix;
+ pTextObj->GetTextMatrix(&TextMatrix);
+ FX_FLOAT originX, originY, prevOriginX, preOriginY;
+ TextMatrix.Transform(item.m_OriginX, item.m_OriginY, originX, originY);
+ pPrevTextObj->GetTextMatrix(&TextMatrix);
+ TextMatrix.Transform(prevItem.m_OriginX, prevItem.m_OriginY, prevOriginX, preOriginY);
+ if(preOriginY > originY) {
+ flag = 0;
+ } else {
+ flag = 1;
+ }
+ }
+ }
+ return flag;
+}
+void CPDF_AutoReflowLayoutProvider::Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs)
+{
+ FX_POSITION pos = pStreamOrderObjs->GetFirstObjectPosition();
+ CFX_AffineMatrix matrix;
+ while(pos) {
+ CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
+ CFX_AffineMatrix matrix;
+ if(pObj->m_Type != PDFPAGE_TEXT) {
+ continue;
+ }
+ FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
+ while(pos1) {
+ CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
+ if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
+ if(!pos1) {
+ pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
+ } else {
+ pAppraceOrderObjs->GetNextObject(pos1);
+ }
+ break;
+ }
+ }
+ pAppraceOrderObjs->InsertObject(pos1, pObj);
+ }
+ pos = pStreamOrderObjs->GetFirstObjectPosition();
+ while(pos) {
+ CPDF_PageObject* pObj = pStreamOrderObjs->GetNextObject(pos);
+ if(pObj->m_Type != PDFPAGE_IMAGE) {
+ continue;
+ }
+ FX_POSITION pos1 = pAppraceOrderObjs->GetLastObjectPosition();
+ while(pos1) {
+ CPDF_PageObject* pTempObj = pAppraceOrderObjs->GetPrevObject(pos1);
+ if(FPDF_ProcessInterObj(pObj, pTempObj) == 1) {
+ if(!pos1) {
+ pos1 = pAppraceOrderObjs->GetFirstObjectPosition();
+ } else {
+ pAppraceOrderObjs->GetNextObject(pos1);
+ }
+ break;
+ }
+ }
+ pAppraceOrderObjs->InsertObject(pos1, pObj);
+ }
+}
+IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
+{
+ return FX_NEW CPDF_AutoReflowLayoutProvider(pPage, bReadOrder);
+}
+CPDF_AutoReflowElement::CPDF_AutoReflowElement(LayoutType layoutType , CPDF_AutoReflowElement* pParent)
+{
+ m_ElmType = layoutType;
+ m_pParentElm = pParent;
+ if(pParent) {
+ pParent->m_ChildArray.Add(this);
+ }
+ m_SpaceBefore = 0;
+}
+CPDF_AutoReflowElement::~CPDF_AutoReflowElement()
+{
+ m_ChildArray.RemoveAll();
+ m_ObjArray.RemoveAll();
+}
+int CPDF_AutoReflowElement::CountAttrValues(LayoutAttr attr_type)
+{
+ return 1;
+}
+LayoutEnum CPDF_AutoReflowElement::GetEnumAttr(LayoutAttr attr_type, int index )
+{
+ return LayoutInvalid;
+}
+FX_FLOAT CPDF_AutoReflowElement::GetNumberAttr(LayoutAttr attr_type, int index )
+{
+ switch (attr_type) {
+ case LayoutSpaceBefore:
+ return m_SpaceBefore;
+ default:
+ return 0;
+ }
+}
+FX_COLORREF CPDF_AutoReflowElement::GetColorAttr(LayoutAttr attr_type, int index )
+{
+ return 0;
+}
+#define WritingMode_UNKNOW 0
+#define WritingMode_LRTB 1
+#define WritingMode_RLTB 2
+#define WritingMode_TBRL 3
+CPDF_AutoReflowLayoutProvider::CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder)
+{
+ m_pPDFPage = (CPDF_Page*)pPage;
+ FX_FLOAT width = m_pPDFPage->GetPageWidth();
+ FX_FLOAT height = m_pPDFPage->GetPageHeight();
+ m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);
+ m_bReadOrder = bReadOrder;
+ m_Status = LayoutReady;
+ m_pRoot = NULL;
+ m_pCurrElm = NULL;
+ m_pPreObj = NULL;
+ m_Step = 0;
+ m_WritingMode = WritingMode_UNKNOW;
+}
+CPDF_AutoReflowLayoutProvider::~CPDF_AutoReflowLayoutProvider()
+{
+ m_pPDFPage = NULL;
+ ReleaseElm(m_pRoot);
+}
+void CPDF_AutoReflowLayoutProvider::ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren)
+{
+ if(bReleaseChildren) {
+ int count = pElm->CountChildren();
+ for(int i = 0; i < count; i++) {
+ CPDF_AutoReflowElement* pChild = (CPDF_AutoReflowElement*)pElm->GetChild(i);
+ ReleaseElm(pChild);
+ }
+ }
+ delete pElm;
+ pElm = NULL;
+}
+void CPDF_AutoReflowLayoutProvider::AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList)
+{
+ if(!pElm) {
+ return;
+ }
+ FX_POSITION pos = ObjList.GetHeadPosition();
+ while (pos) {
+ pElm->m_ObjArray.Add((CPDF_PageObject*)ObjList.GetNext(pos));
+ }
+}
+void CPDF_AutoReflowLayoutProvider::GenerateStructTree()
+{
+ if (m_Step < AUTOREFLOW_STEP_GENERATELINE) {
+ GenerateLine(m_cellArray);
+ if(m_cellArray.GetSize() == 0) {
+ m_Status = LayoutError;
+ return;
+ }
+ if(m_pPause && m_pPause->NeedToPauseNow()) {
+ m_Step = AUTOREFLOW_STEP_GENERATELINE;
+ m_Status = LayoutToBeContinued;
+ return;
+ }
+ }
+ if (m_Step < AUTOREFLOW_STEP_GENERATEParagraph) {
+ GenerateParagraph(m_cellArray);
+ if(m_pPause && m_pPause->NeedToPauseNow()) {
+ m_Step = AUTOREFLOW_STEP_GENERATEParagraph;
+ m_Status = LayoutToBeContinued;
+ return;
+ }
+ }
+ if (m_Step < AUTOREFLOW_STEP_CREATEELEMENT) {
+ CreateElement();
+ if(m_pPause && m_pPause->NeedToPauseNow()) {
+ m_Step = AUTOREFLOW_STEP_CREATEELEMENT;
+ m_Status = LayoutToBeContinued;
+ return;
+ }
+ }
+ if (m_Step < AUTOREFLOW_STEP_REMOVEDATA) {
+ int count = m_cellArray.GetSize();
+ for(int i = 0; i < count; i++) {
+ CRF_CELL* pCell = (CRF_CELL*)m_cellArray.GetAt(i);
+ if(pCell) {
+ pCell->m_ObjList.RemoveAll();
+ delete pCell;
+ }
+ }
+ m_cellArray.RemoveAll();
+ if(m_pPause && m_pPause->NeedToPauseNow()) {
+ m_Step = AUTOREFLOW_STEP_REMOVEDATA;
+ m_Status = LayoutToBeContinued;
+ return;
+ }
+ }
+ m_Step = AUTOREFLOW_STEP_REMOVEDATA;
+ m_Status = LayoutFinished;
+ return;
+}
+void CPDF_AutoReflowLayoutProvider::CreateElement()
+{
+ int count = m_cellArray.GetSize();
+ CRF_CELL* plastCell = NULL;
+ CRF_CELL* pCell = NULL;
+ CRF_CELL* pNextCell = NULL;
+ CPDF_AutoReflowElement* pParent = m_pRoot;
+ CPDF_AutoReflowElement* pCurrElm = NULL;
+ int i;
+ for(i = 0; i < count; i++) {
+ pCell = (CRF_CELL*)m_cellArray.GetAt(i);
+ if(!pCell) {
+ continue;
+ }
+ if(i < count - 1) {
+ pNextCell = (CRF_CELL*)m_cellArray.GetAt(i + 1);
+ } else {
+ pNextCell = NULL;
+ }
+ pCurrElm = NULL;
+ pCurrElm = FX_NEW CPDF_AutoReflowElement(LayoutParagraph, pParent);
+ if(pCurrElm->GetType() == LayoutParagraph && plastCell) {
+ int SpaceBefore = 0;
+ if(pCell->m_CellWritingMode != plastCell->m_CellWritingMode ) {
+ SpaceBefore = 20;
+ } else if(pCell->m_CellWritingMode == WritingMode_LRTB) {
+ SpaceBefore = plastCell->m_BBox.bottom - pCell->m_BBox.top;
+ } else if(pCell->m_CellWritingMode == WritingMode_TBRL) {
+ SpaceBefore = plastCell->m_BBox.left - pCell->m_BBox.right;
+ }
+ if(SpaceBefore > 0) {
+ pCurrElm->m_SpaceBefore = SpaceBefore > 50 ? 50.0f : SpaceBefore;
+ }
+ }
+ AddObjectArray(pCurrElm, pCell->m_ObjList);
+ plastCell = pCell;
+ }
+}
+void CPDF_AutoReflowLayoutProvider::GenerateParagraph(CFX_PtrArray& cellArray)
+{
+ int count = cellArray.GetSize();
+ if(count <= 1) {
+ return;
+ }
+ CRF_CELL* plastCell = (CRF_CELL*)cellArray.GetAt(0);
+ if(plastCell->m_BBox.Height() > plastCell->m_BBox.Width()) {
+ m_WritingMode = WritingMode_TBRL;
+ } else {
+ m_WritingMode = WritingMode_LRTB;
+ }
+ FX_BOOL bEnforce = FALSE;
+ int i = 0;
+ for(i = 1; i < count; i++) {
+ CRF_CELL* pCell = (CRF_CELL*)cellArray.GetAt(i);
+ if(!pCell) {
+ continue;
+ }
+ int c = pCell->m_ObjList.GetCount();
+ FX_BOOL bMerge = FALSE;
+ FX_POSITION pos1 = plastCell->m_ObjList.GetTailPosition();
+ CPDF_PageObject* pLastObj = (CPDF_PageObject*)plastCell->m_ObjList.GetPrev(pos1);
+ pos1 = pCell->m_ObjList.GetHeadPosition();
+ CPDF_PageObject* pCurObj = (CPDF_PageObject*)pCell->m_ObjList.GetNext(pos1);
+ int WritingMode = GetRectEnd(pCell->m_BBox);
+ if(pCell->m_CellWritingMode == WritingMode_UNKNOW) {
+ if(pCell->m_BBox.Height() > pCell->m_BBox.Width()) {
+ pCell->m_CellWritingMode = WritingMode_TBRL;
+ } else {
+ pCell->m_CellWritingMode = WritingMode_LRTB;
+ }
+ }
+ WritingMode = pCell->m_CellWritingMode;
+ if(WritingMode == WritingMode_LRTB && (m_Style.m_Language & LP_Lang_ChinesePRC || m_Style.m_Language & LP_Lang_ChineseTaiwan
+ || m_Style.m_Language & LP_Lang_Japanese || m_Style.m_Language & LP_Lang_Korean)) {
+ if(pCurObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText;
+ pText = (CPDF_TextObject*)pCurObj;
+ if(pText->CountItems()) {
+ CPDF_TextObjectItem item;
+ pText->GetItemInfo(0, &item);
+ CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR unicode = str.GetAt(0);
+ if(unicode == 32) {
+ plastCell = pCell;
+ bMerge = FALSE;
+ bEnforce = FALSE;
+ continue;
+ }
+ }
+ }
+ }
+ if(m_WritingMode == WritingMode) {
+ if(bEnforce) {
+ bMerge = FALSE;
+ bEnforce = FALSE;
+ if(pCurObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText;
+ pText = (CPDF_TextObject*)pCurObj;
+ if(pText->CountItems()) {
+ CPDF_TextObjectItem item;
+ pText->GetItemInfo(0, &item);
+ CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR unicode = str.GetAt(0);
+ if(unicode > 96 && unicode < 123) {
+ bMerge = TRUE;
+ }
+ }
+ } else {
+ CPDF_ImageObject* pImage = (CPDF_ImageObject*)pCurObj;
+ FX_RECT imageBBox = pImage->GetBBox(&m_PDFDisplayMatrix);
+ if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) < GetRectWidth(imageBBox)) {
+ bMerge = TRUE;
+ }
+ }
+ } else {
+ if(!approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
+ if(approachto(GetRectStart(plastCell->m_BBox), GetRectStart(pCell->m_BBox), GetRectHeight(pCell->m_BBox) * 2.3) &&
+ GetRectStart(plastCell->m_BBox) - GetRectStart(pCell->m_BBox) > 0) {
+ if(pCurObj->m_Type == PDFPAGE_TEXT || pLastObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText;
+ if(pCurObj->m_Type == PDFPAGE_TEXT) {
+ pText = (CPDF_TextObject*)pCurObj;
+ } else {
+ pText = (CPDF_TextObject*)pLastObj;
+ }
+ CPDF_TextObjectItem item;
+ pText->GetItemInfo(0, &item);
+ CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR unicode = str.GetAt(0);
+ if(unicode > 255) {
+ bMerge = TRUE;
+ }
+ }
+ }
+ } else if(!approachto(GetRectEnd(pCell->m_BBox), GetRectEnd(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) * 3)) {
+ FX_RECT rect = pLastObj->GetBBox(&m_PDFDisplayMatrix);
+ if(approachto(GetRectStart(pCell->m_BBox), GetRectStart(plastCell->m_BBox), GetRectHeight(pCell->m_BBox) / 4)) {
+ if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > 0) {
+ bMerge = TRUE;
+ bEnforce = TRUE;
+ } else if(GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) <= 0 &&
+ GetRectEnd(rect) - GetRectEnd(pCell->m_BBox) > GetRectHeight(pCell->m_BBox) * -3) {
+ if(pCurObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)pCurObj;
+ CPDF_TextObjectItem item;
+ pText->GetItemInfo(0, &item);
+ CFX_WideString str = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR unicode = str.GetAt(0);
+ if(unicode > 96 && unicode < 123) {
+ bMerge = TRUE;
+ }
+ }
+ }
+ }
+ } else {
+ bMerge = TRUE;
+ }
+ }
+ } else {
+ m_WritingMode = WritingMode;
+ bEnforce = FALSE;
+ }
+ if(bMerge) {
+ if(GetRectEnd(plastCell->m_BBox) - GetRectEnd(pCell->m_BBox) > 30) {
+ bEnforce = TRUE;
+ }
+ FX_POSITION pos = pCell->m_ObjList.GetHeadPosition();
+ while(pos) {
+ plastCell->m_ObjList.AddTail(pCell->m_ObjList.GetNext(pos));
+ }
+ plastCell->m_BBox.Union(pCell->m_BBox);
+ pCell->m_ObjList.RemoveAll();
+ delete pCell;
+ cellArray.RemoveAt(i);
+ i--;
+ count--;
+ } else {
+ plastCell = pCell;
+ }
+ }
+}
+void CPDF_AutoReflowLayoutProvider::ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix)
+{
+}
+FX_INT32 CPDF_AutoReflowLayoutProvider::LogicPreObj(CPDF_PageObject* pObj)
+{
+ CPDF_PageObject* pPreObj = m_pPreObj;
+ m_pPreObj = pObj;
+ if(!pPreObj) {
+ return 0;
+ }
+ if(pPreObj->m_Type != pObj->m_Type) {
+ return 0;
+ }
+ CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);
+ if(pObj->m_Type == PDFPAGE_IMAGE) {
+ if(rcPreObj.Contains(rcCurObj)) {
+ return 2;
+ }
+ if(rcCurObj.Contains(rcPreObj)) {
+ return 2;
+ }
+ return 0;
+ }
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {
+ FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());
+ if((rcCurObj.left - rcPreObj.right) > height / 3) {
+ return 3;
+ }
+ }
+ if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {
+ return 0;
+ }
+ CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;
+ CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;
+ int nPreCount = pPreTextObj->CountItems();
+ int nCurCount = pCurTextObj->CountItems();
+ if (nPreCount != nCurCount) {
+ return 0;
+ }
+ FX_BOOL bSame = TRUE;
+ for (int i = 0; i < nPreCount; i++) {
+ CPDF_TextObjectItem itemPer, itemCur;
+ pPreTextObj->GetItemInfo(i, &itemPer);
+ pCurTextObj->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return 0;
+ }
+ if (itemCur.m_OriginX != itemPer.m_OriginX) {
+ bSame = FALSE;
+ }
+ if (itemCur.m_OriginY != itemPer.m_OriginY) {
+ bSame = FALSE;
+ }
+ }
+ if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {
+ return 1;
+ }
+ if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3
+ && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {
+ return 2;
+ }
+ }
+ return 0;
+}
+void CPDF_AutoReflowLayoutProvider::GenerateLine(CFX_PtrArray& cellArray)
+{
+ CRF_CELL* pCell = NULL;
+ CFX_AffineMatrix matrix;
+ FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition();
+ if(!pos) {
+ return;
+ }
+ FX_FLOAT PDFWidth = m_pPDFPage->GetPageWidth();
+ FX_FLOAT PDFHeight = m_pPDFPage->GetPageHeight();
+ m_pPDFPage->GetDisplayMatrix(m_PDFDisplayMatrix, 0, 0, (int)PDFWidth, (int)PDFHeight, 0);
+ CPDF_PageObject* pPerObj = NULL;
+ int a = 0;
+ CFX_FloatRect pageBBox = m_pPDFPage->m_BBox;
+ FX_FLOAT PrevX = 0 , PrevY = 0, PosX, PosY;
+ while(pos) {
+ CPDF_PageObject* pObj = m_pPDFPage->GetNextObject(pos);
+ if(!pObj || pObj->m_Type == PDFPAGE_PATH) {
+ continue;
+ }
+ int logic = LogicPreObj(pObj);
+ if(logic == 2) {
+ if(pCell) {
+ pCell->m_ObjList.SetAt(pCell->m_ObjList.GetTailPosition(), pObj);
+ }
+ continue;
+ }
+ if (pObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pTextObj = (CPDF_TextObject*)pObj;
+ int textmode = pTextObj->m_TextState.GetObject()->m_TextMode;
+ if(m_Style.m_bIgnoreInvisibleText && pTextObj->m_TextState.GetObject()->m_TextMode == 3) {
+ continue;
+ }
+ PosX = pTextObj->GetPosX();
+ PosY = pTextObj->GetPosY();
+ m_PDFDisplayMatrix.Transform(PosX, PosY);
+ } else {
+ PosX = 0;
+ PosY = 0;
+ }
+ FX_BOOL bNewLine = TRUE;
+ FX_RECT ObjBBox = pObj->GetBBox(&m_PDFDisplayMatrix);
+ if(ObjBBox.left > PDFWidth || ObjBBox.right < 0 ||
+ ObjBBox.bottom < 0 || ObjBBox.top > PDFHeight) {
+ continue;
+ }
+ if(ObjBBox.IsEmpty()) {
+ continue;
+ }
+ a++;
+ if(!pCell) {
+ bNewLine = TRUE;
+ m_WritingMode = GetWritingMode(NULL, pObj);
+ } else {
+ int WritingMode = GetWritingMode(pPerObj, pObj);
+ if(m_WritingMode == WritingMode || m_WritingMode == WritingMode_UNKNOW || WritingMode == WritingMode_UNKNOW) {
+ if(WritingMode != WritingMode_UNKNOW) {
+ m_WritingMode = WritingMode;
+ }
+ if(m_WritingMode == WritingMode_TBRL) {
+ if(!(GetRectBottom(ObjBBox) > GetRectTop(pCell->m_BBox) ||
+ GetRectTop(ObjBBox) < GetRectBottom(pCell->m_BBox))) {
+ bNewLine = FALSE;
+ }
+ } else {
+ if(!(GetRectBottom(ObjBBox) < GetRectTop(pCell->m_BBox) ||
+ GetRectTop(ObjBBox) > GetRectBottom(pCell->m_BBox))) {
+ bNewLine = FALSE;
+ }
+ if (pObj->m_Type == PDFPAGE_TEXT) {
+ if(FXSYS_fabs(PrevY - PosY) < 1 ) {
+ bNewLine = FALSE;
+ }
+ }
+ }
+ } else {
+ m_WritingMode = WritingMode;
+ }
+ }
+ pPerObj = pObj;
+ if(bNewLine) {
+ int c = pCell ? pCell->m_ObjList.GetCount() : 0;
+ pCell = FX_NEW CRF_CELL;
+ pCell->m_CellWritingMode = m_WritingMode;
+ pCell->m_BBox = ObjBBox;
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ FX_FLOAT x = ((CPDF_TextObject*)pObj)->GetPosX(), y = ((CPDF_TextObject*)pObj)->GetPosY();
+ m_PDFDisplayMatrix.Transform(x, y);
+ if(x < ObjBBox.left) {
+ pCell->m_BBox.left = (int)x;
+ }
+ }
+ pCell->m_ObjList.AddTail(pObj);
+ cellArray.Add(pCell);
+ } else {
+ pCell->m_ObjList.AddTail(pObj);
+ pCell->m_BBox.Union(ObjBBox);
+ }
+ PrevX = PosX;
+ PrevY = PosY;
+ }
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderHeight(CPDF_PageObject* pCurObj)
+{
+ CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+ if (m_WritingMode == WritingMode_TBRL) {
+ return rcCurObj.Width();
+ }
+ return rcCurObj.Height();
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetLayoutOrderWidth(CPDF_PageObject* pCurObj)
+{
+ CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+ if (m_WritingMode == WritingMode_TBRL) {
+ return rcCurObj.Height();
+ }
+ return rcCurObj.Width();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectWidth(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.Height();
+ }
+ return rect.Width();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectHeight(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.Width();
+ }
+ return rect.Height();
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectStart(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.top;
+ }
+ return rect.left;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectEnd(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.bottom;
+ }
+ return rect.right;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectTop(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.right;
+ }
+ return rect.top;
+}
+int CPDF_AutoReflowLayoutProvider:: GetRectBottom(FX_RECT rect)
+{
+ if(m_WritingMode == WritingMode_TBRL) {
+ return rect.left;
+ }
+ return rect.bottom;
+}
+int CPDF_AutoReflowLayoutProvider::GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj)
+{
+ CFX_FloatRect rcCurObj(pCurObj->m_Left, pCurObj->m_Bottom, pCurObj->m_Right, pCurObj->m_Top);
+ if(pCurObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
+ int count = ptextObj->CountItems();
+ if(count > 1) {
+ CPDF_TextObjectItem Item1, Item2;
+ ptextObj->GetItemInfo(0, &Item1);
+ ptextObj->GetItemInfo(count - 1, &Item2);
+ if(Item2.m_CharCode == -1 && count > 2) {
+ ptextObj->GetItemInfo(2, &Item2);
+ }
+ CFX_AffineMatrix textMatrix;
+ ptextObj->GetTextMatrix(&textMatrix);
+ textMatrix.Transform(Item1.m_OriginX, Item1.m_OriginY);
+ textMatrix.Transform(Item2.m_OriginX, Item2.m_OriginY);
+ FX_FLOAT dx = FXSYS_fabs(Item1.m_OriginX - Item2.m_OriginX);
+ FX_FLOAT dy = FXSYS_fabs(Item1.m_OriginY - Item2.m_OriginY);
+ return dx >= dy ? WritingMode_LRTB : WritingMode_TBRL;
+ } else {
+ if(m_WritingMode != WritingMode_UNKNOW) {
+ return m_WritingMode;
+ }
+ }
+ }
+ if(pPreObj) {
+ FX_FLOAT threshold = rcCurObj.Width() / 4;
+ if(m_WritingMode == WritingMode_LRTB) {
+ if(FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2
+ && FXSYS_fabs(pPreObj->m_Top - pCurObj->m_Top) < threshold * 2) {
+ return m_WritingMode;
+ }
+ FX_FLOAT mid = (pCurObj->m_Bottom + pCurObj->m_Top) / 2;
+ if(mid > pPreObj->m_Bottom && mid < pPreObj->m_Top && pCurObj->m_Right > pPreObj->m_Right) {
+ return m_WritingMode;
+ }
+ } else if(m_WritingMode == WritingMode_TBRL) {
+ if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold * 2
+ && FXSYS_fabs(pPreObj->m_Right - pCurObj->m_Right) < threshold * 2) {
+ return m_WritingMode;
+ }
+ FX_FLOAT mid = (pCurObj->m_Right + pCurObj->m_Left) / 2;
+ if(mid > pPreObj->m_Left && mid < pPreObj->m_Right && pCurObj->m_Bottom < pPreObj->m_Bottom) {
+ return m_WritingMode;
+ }
+ }
+ if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) < threshold &&
+ FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) > threshold * 2) {
+ return WritingMode_TBRL;
+ }
+ if(FXSYS_fabs(pPreObj->m_Left - pCurObj->m_Left) > threshold &&
+ FXSYS_fabs(pPreObj->m_Bottom - pCurObj->m_Bottom) < threshold * 2) {
+ return WritingMode_LRTB;
+ }
+ int count = 0;
+ if(pPreObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* ptextObj = (CPDF_TextObject* )pCurObj;
+ count = ptextObj->CountItems();
+ }
+ if(pPreObj->m_Type != PDFPAGE_TEXT || count == 1) {
+ if(pCurObj->m_Left > pPreObj->m_Right) {
+ FX_FLOAT mid = (pCurObj->m_Top + pCurObj->m_Bottom) / 2;
+ if(mid < pPreObj->m_Top && mid > pPreObj->m_Bottom) {
+ return WritingMode_LRTB;
+ }
+ }
+ if(pCurObj->m_Top < pPreObj->m_Bottom) {
+ FX_FLOAT mid = (pCurObj->m_Left + pCurObj->m_Right) / 2;
+ if(mid < pPreObj->m_Right && mid > pPreObj->m_Left) {
+ return WritingMode_TBRL;
+ }
+ }
+ }
+ }
+ return WritingMode_UNKNOW;
+}
+LayoutStatus CPDF_AutoReflowLayoutProvider::StartLoad(IFX_Pause* pPause)
+{
+ m_pPause = pPause;
+ m_pRoot = FX_NEW CPDF_AutoReflowElement(LayoutDocument);
+ if(!m_pRoot) {
+ return LayoutError;
+ }
+ m_Step = 0;
+ return Continue();
+}
+LayoutStatus CPDF_AutoReflowLayoutProvider::Continue()
+{
+ GenerateStructTree();
+ return m_Status;
+}
+int CPDF_AutoReflowLayoutProvider::GetPosition()
+{
+ if(m_Step == 0) {
+ return 0;
+ } else {
+ return m_Step * 100 / AUTOREFLOW_STEP_REMOVEDATA;
+ }
+}
+FX_FLOAT CPDF_AutoReflowLayoutProvider::GetObjMinCell(CPDF_PageObject* pObj)
+{
+ if(!pObj) {
+ return 0;
+ }
+ if(pObj->m_Type != PDFPAGE_TEXT) {
+ CFX_AffineMatrix matrix;
+ FX_RECT rect = pObj->GetBBox(&matrix);
+ return (FX_FLOAT)(rect.Width());
+ }
+ CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+ int count = pTextObj->CountItems();
+ for(int i = 0; i < count; i++) {
+ CPDF_TextObjectItem Item;
+ pTextObj->GetItemInfo(i, &Item);
+ if(Item.m_CharCode == -1) {
+ continue;
+ }
+ if((Item.m_CharCode > 47 && Item.m_CharCode < 58) || (Item.m_CharCode > 64 && Item.m_CharCode < 91)
+ || (Item.m_CharCode > 96 && Item.m_CharCode < 123)) {
+ continue;
+ }
+ if(Item.m_CharCode > 127 || (Item.m_CharCode > 32 && Item.m_CharCode < 35) || Item.m_CharCode == 37 ||
+ (Item.m_CharCode > 38 && Item.m_CharCode < 42) || Item.m_CharCode == 44 || Item.m_CharCode == 46 ||
+ Item.m_CharCode == 58 || Item.m_CharCode == 59 || Item.m_CharCode == 63 || Item.m_CharCode == 93) {
+ if(i == count - 1) {
+ CFX_AffineMatrix matrix;
+ FX_RECT rect = pObj->GetBBox(&matrix);
+ return (FX_FLOAT)(rect.Width());
+ } else {
+ pTextObj->GetItemInfo(i + 1, &Item);
+ return Item.m_OriginX;
+ }
+ }
+ return Item.m_OriginX;
+ }
+ CFX_AffineMatrix matrix;
+ FX_RECT rect = pObj->GetBBox(&matrix);
+ return (FX_FLOAT)(rect.Width());
+}
diff --git a/core/src/reflow/autoreflow.h b/core/src/reflow/autoreflow.h
new file mode 100644
index 0000000000..d98f33bf4e
--- /dev/null
+++ b/core/src/reflow/autoreflow.h
@@ -0,0 +1,122 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _AUTOREFLOW_H
+#define _AUTOREFLOW_H
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+class CPDF_AutoReflowElement;
+class CPDF_AutoReflowLayoutProvider;
+typedef CFX_ArrayTemplate<CPDF_AutoReflowElement*> CAR_ElmPtrArray;
+typedef CFX_ArrayTemplate<CPDF_PageObject*> CAR_ObjPtrArray;
+class CRF_CELL : public CFX_Object
+{
+public:
+ CRF_CELL() { };
+ ~CRF_CELL() { };
+ CFX_PtrList m_ObjList;
+ int m_CellWritingMode;
+ FX_RECT m_BBox;
+};
+class CPDF_AutoReflowElement : public IPDF_LayoutElement, public CFX_Object
+{
+public:
+ CPDF_AutoReflowElement(LayoutType layoutType = LayoutUnknown , CPDF_AutoReflowElement* pParent = NULL) ;
+ ~CPDF_AutoReflowElement();
+ LayoutType GetType()
+ {
+ return m_ElmType;
+ }
+ void GetRect(CFX_FloatRect& rcRect) {};
+
+ int CountAttrValues(LayoutAttr attr_type);
+ LayoutEnum GetEnumAttr(LayoutAttr attr_type, int index);
+ FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index);
+ FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index);
+
+ int CountChildren()
+ {
+ return m_ChildArray.GetSize();
+ }
+ IPDF_LayoutElement* GetChild(int index)
+ {
+ return m_ChildArray.GetAt(index);
+ }
+
+ IPDF_LayoutElement* GetParent()
+ {
+ return m_pParentElm;
+ }
+ int CountObjects()
+ {
+ return m_ObjArray.GetSize();
+ }
+ CPDF_PageObject* GetObject(int index)
+ {
+ return m_ObjArray.GetAt(index);
+ }
+ CPDF_AutoReflowElement* m_pParentElm;
+ LayoutType m_ElmType;
+ CAR_ElmPtrArray m_ChildArray;
+ CAR_ObjPtrArray m_ObjArray;
+ FX_FLOAT m_SpaceBefore;
+};
+#define AUTOREFLOW_STEP_GENERATELINE 1
+#define AUTOREFLOW_STEP_GENERATEParagraph 2
+#define AUTOREFLOW_STEP_CREATEELEMENT 3
+#define AUTOREFLOW_STEP_REMOVEDATA 4
+class CPDF_AutoReflowLayoutProvider : public IPDF_LayoutProvider, public CFX_Object
+{
+public:
+ CPDF_AutoReflowLayoutProvider(CPDF_PageObjects* pPage, FX_BOOL bReadOrder);
+ ~CPDF_AutoReflowLayoutProvider();
+ void SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE Style)
+ {
+ m_Style = Style;
+ }
+ LayoutStatus StartLoad(IFX_Pause* pPause = NULL);
+ LayoutStatus Continue();
+ int GetPosition();
+ IPDF_LayoutElement* GetRoot()
+ {
+ return m_pRoot;
+ }
+ FX_FLOAT GetObjMinCell(CPDF_PageObject* pObj);
+ void Conver2AppreceOrder(const CPDF_PageObjects* pStreamOrderObjs, CPDF_PageObjects* pAppraceOrderObjs);
+ void ReleaseElm(CPDF_AutoReflowElement*& pElm, FX_BOOL bReleaseChildren = TRUE);
+ void GenerateCell();
+ void GenerateStructTree();
+ void GenerateLine(CFX_PtrArray& cellArray);
+ void GenerateParagraph(CFX_PtrArray& cellArray);
+ void CreateElement();
+ void AddObjectArray(CPDF_AutoReflowElement* pElm, CFX_PtrList& ObjList);
+ FX_FLOAT GetLayoutOrderHeight(CPDF_PageObject* pCurObj);
+ FX_FLOAT GetLayoutOrderWidth(CPDF_PageObject* pCurObj);
+ int GetWritingMode(CPDF_PageObject* pPreObj, CPDF_PageObject* pCurObj);
+ int GetRectStart(FX_RECT rect);
+ int GetRectEnd(FX_RECT rect);
+ int GetRectTop(FX_RECT rect);
+ int GetRectBottom(FX_RECT rect);
+ int GetRectHeight(FX_RECT rect);
+ int GetRectWidth(FX_RECT rect);
+ void ProcessObj(CFX_PtrArray& cellArray, CPDF_PageObject* pObj, CFX_AffineMatrix matrix);
+ FX_INT32 LogicPreObj(CPDF_PageObject* pObj);
+
+ CPDF_AutoReflowElement* m_pRoot;
+ CPDF_AutoReflowElement* m_pCurrElm;
+ CPDF_Page* m_pPDFPage;
+ IFX_Pause* m_pPause;
+ CFX_AffineMatrix m_PDFDisplayMatrix;
+ CPDF_PageObject* m_pPreObj;
+ LayoutStatus m_Status;
+ int m_WritingMode;
+ CFX_PtrArray m_CellArray;
+ FX_BOOL m_bReadOrder;
+ LAYOUTPROVIDER_STYLE m_Style;
+ CFX_PtrArray m_cellArray;
+ int m_Step;
+};
+#endif
diff --git a/core/src/reflow/layoutprocessor_reflow.cpp b/core/src/reflow/layoutprocessor_reflow.cpp
new file mode 100644
index 0000000000..d2fa7e9371
--- /dev/null
+++ b/core/src/reflow/layoutprocessor_reflow.cpp
@@ -0,0 +1,1560 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+#include "layoutprovider_taggedpdf.h"
+IPDF_LayoutProcessor* IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace )
+{
+ if(pReflowedPage == NULL || fWidth <= 20) {
+ return NULL;
+ }
+ CPDF_LayoutProcessor_Reflow* pReflowEngine = FX_NEW CPDF_LayoutProcessor_Reflow();
+ if (NULL == pReflowEngine) {
+ return NULL;
+ }
+ pReflowEngine->Init(TopIndent, fWidth, fHeight, (CPDF_ReflowedPage*)pReflowedPage, flags, lineSpace);
+ return pReflowEngine;
+}
+CPDF_LayoutProcessor_Reflow::CPDF_LayoutProcessor_Reflow()
+{
+ m_pPause = NULL;
+ m_pLayoutElement = NULL;
+ m_fRefWidth = 0;
+ m_fRefWidth = 0;
+ m_fCurrLineWidth = 0;
+ m_fCurrLineHeight = 0;
+ m_bIllustration = FALSE;
+ m_pPreObj = NULL;
+ m_pCurrLine = FX_NEW CRF_DataPtrArray(50);
+ m_pTempLine = FX_NEW CRF_DataPtrArray(50);
+ m_StartIndent = 0;
+ m_PausePosition = 0;
+}
+CPDF_LayoutProcessor_Reflow::~CPDF_LayoutProcessor_Reflow()
+{
+ if (m_pCurrLine) {
+ m_pCurrLine->RemoveAll();
+ delete m_pCurrLine;
+ }
+ m_pCurrLine = NULL;
+ if (m_pTempLine) {
+ m_pTempLine->RemoveAll();
+ delete m_pTempLine;
+ }
+ m_pTempLine = NULL;
+}
+void CPDF_LayoutProcessor_Reflow::Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace)
+{
+ m_pLayoutElement = NULL;
+ m_TopIndent = TopIndent;
+ m_Status = LayoutReady;
+ m_flags = flags;
+ m_pReflowedPage = pReflowedPage;
+ m_fScreenHeight = fHeight;
+ m_fRefWidth = fWidth;
+ m_fCurrLineHeight = 0;
+ m_fCurrLineWidth = 0;
+ m_fLineSpace = lineSpace;
+ pReflowedPage->m_PageWidth = fWidth;
+ pReflowedPage->m_PageHeight = TopIndent;
+}
+void CPDF_LayoutProcessor_Reflow::FitPageMode()
+{
+ if(m_flags & RF_PARSER_PAGEMODE && m_fScreenHeight > 20) {
+ float fitPageHeight = m_fScreenHeight;
+ CPDF_ReflowedPage* pRFPage = m_pReflowedPage;
+ int count = pRFPage->m_pReflowed->GetSize();
+ CFX_WordArray dy;
+ dy.Add(0);
+ int pos = 0;
+ int screenCount = 1;
+ FX_FLOAT h = pRFPage->GetPageHeight();
+ while (h > screenCount * fitPageHeight) {
+ FX_FLOAT tempPageHeight = screenCount * fitPageHeight;
+ int j = 0;
+ FX_FLOAT tempDy = 0;
+ for(int i = 0; i < count; i++) {
+ CRF_Data* pData = (*pRFPage->m_pReflowed)[i];
+ FX_FLOAT posY;
+ posY = pData->m_PosY;
+ if(FXSYS_fabs(posY) > tempPageHeight &&
+ FXSYS_fabs(posY + pData->m_Height) < tempPageHeight) {
+ if(j == 0) {
+ j = i;
+ }
+ if(pData->m_Height > fitPageHeight) {
+ FX_FLOAT zoom;
+ FX_FLOAT spaceh = screenCount * fitPageHeight + posY + pData->m_Height;
+ if(spaceh < fitPageHeight / 3 * 2) {
+ spaceh = fitPageHeight;
+ }
+ zoom = spaceh / pData->m_Height;
+ tempDy = spaceh - pData->m_Height;
+ pData->m_Height = spaceh;
+ pData->m_Width *= zoom;
+ break;
+ }
+ FX_FLOAT dy = pData->m_PosY + pData->m_Height + tempPageHeight;
+ if(dy > tempDy) {
+ tempDy = dy;
+ }
+ } else if(FXSYS_fabs(posY + pData->m_Height) > tempPageHeight) {
+ break;
+ }
+ }
+ for(; j < count; j++) {
+ CRF_Data* pData = (*pRFPage->m_pReflowed)[j];
+ FX_FLOAT posY;
+ posY = pData->m_PosY;
+ if(FXSYS_fabs(posY) > tempPageHeight ) {
+ pData->m_PosY -= tempDy;
+ }
+ if(pData->m_Height >= fitPageHeight) {
+ pData->m_Height = fitPageHeight - 1;
+ if(pData->GetType() == CRF_Data::Text) {
+ CRF_CharData* pCharData = (CRF_CharData*)pData;
+ pCharData->m_pCharState->m_fFontSize = pData->m_Height;
+ }
+ }
+ }
+ pRFPage->m_PageHeight += tempDy;
+ h += tempDy;
+ screenCount++;
+ }
+ }
+}
+LayoutStatus CPDF_LayoutProcessor_Reflow::StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix)
+{
+ if(!pElement) {
+ return LayoutError;
+ }
+ m_pPause = pPause;
+ m_PDFMatrix = *pPDFMatrix;
+ m_pRootElement = pElement;
+ ProcessElement(m_pRootElement, m_fRefWidth);
+ if(m_Status == LayoutToBeContinued) {
+ return LayoutToBeContinued;
+ }
+ m_Status = LayoutFinished;
+ FitPageMode();
+ return LayoutFinished;
+}
+LayoutStatus CPDF_LayoutProcessor_Reflow::Continue()
+{
+ int size = m_pReflowedPage->m_pReflowed->GetSize();
+ ProcessElement(m_pRootElement, m_CurrRefWidth);
+ size = m_pReflowedPage->m_pReflowed->GetSize();
+ if(m_Status == LayoutReady) {
+ m_Status = LayoutFinished;
+ FitPageMode();
+ }
+ return m_Status;
+}
+int CPDF_LayoutProcessor_Reflow::GetPosition()
+{
+ return m_PausePosition;
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakAfter(FX_DWORD unicode)
+{
+ if(unicode == -1) {
+ return FALSE;
+ }
+ switch(unicode) {
+ case 40:
+ case 91:
+ case 123:
+ return FALSE;
+ }
+ if(unicode >= 256) {
+ return TRUE;
+ } else if(unicode >= 48 && unicode <= 57) {
+ return FALSE;
+ } else if(unicode >= 64 && unicode <= 90) {
+ return FALSE;
+ } else if(unicode >= 97 && unicode <= 122) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakBefore(FX_DWORD unicode)
+{
+ if(unicode == -1) {
+ return FALSE;
+ }
+ switch(unicode) {
+ case 33:
+ case 41:
+ case 44:
+ case 46:
+ case 59:
+ case 63:
+ case 93:
+ case 125:
+ return FALSE;
+ }
+ if(unicode >= 256) {
+ return TRUE;
+ } else if(unicode >= 48 && unicode <= 57) {
+ return FALSE;
+ } else if(unicode >= 64 && unicode <= 90) {
+ return FALSE;
+ } else if(unicode >= 97 && unicode <= 122) {
+ return FALSE;
+ }
+ return TRUE;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessTable(FX_FLOAT dx)
+{
+ if(m_pReflowedPage->m_pReflowed->GetSize() == 0) {
+ return;
+ }
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ int rowCount = pTable->m_nCell.GetSize();
+ int n = 0;
+ FX_FLOAT* dyRow = FX_Alloc(FX_FLOAT, rowCount + 1);
+ FXSYS_memset32(dyRow, 0, sizeof(FX_FLOAT) * (rowCount + 1));
+ dyRow[0] = 0 ;
+ dyRow[0] = - pTable->m_ReflowPageHeight;
+ int tableColCount = 0;
+ int i;
+ for(i = 0; i < rowCount; i++) {
+ int colCount = pTable->m_nCell.GetAt(i);
+ if(colCount > tableColCount) {
+ tableColCount = colCount;
+ }
+ }
+ int cellCount = tableColCount * rowCount;
+ RF_TableCell** pVirtualTable = FX_Alloc(RF_TableCell*, cellCount);
+ FXSYS_memset32(pVirtualTable, 0, sizeof(RF_TableCell*) * cellCount);
+ for(i = 0; i < rowCount; i++) {
+ int colCount = pTable->m_nCell.GetAt(i);
+ FX_FLOAT rowWidth = 0;
+ int j = 0;
+ int s = pTable->m_pCellArray.GetSize();
+ for(j = 0; j < colCount; j++) {
+ RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);
+ if(pCell->m_EndPos < pCell->m_BeginPos) {
+ continue;
+ }
+ int pos = i * tableColCount;
+ while(pos < cellCount && pVirtualTable[pos] != NULL) {
+ pos++;
+ }
+ if(pos >= (i + 1) * tableColCount) {
+ pos = i * tableColCount + j;
+ }
+ int RowSpan = pCell->m_RowSpan;
+ int ColSpan = pCell->m_ColSpan;
+ if(RowSpan + i > rowCount) {
+ RowSpan = rowCount - i;
+ }
+ if(ColSpan + j > colCount) {
+ ColSpan = colCount - j;
+ }
+ for(int m = 0; m < RowSpan; m++) {
+ for(int nn = 0; nn < ColSpan; nn++) {
+ if(pos + nn >= cellCount) {
+ break;
+ }
+ pVirtualTable[pos + nn] = pCell;
+ }
+ pos += tableColCount;
+ }
+ FX_FLOAT dxCell = dx;
+ for(pos = i * tableColCount; pVirtualTable[pos] != pCell && pos < cellCount; pos++) {
+ dxCell += (pVirtualTable[pos])->m_MaxWidth;
+ }
+ CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];
+ FX_FLOAT dy = dyRow[i] - pData->m_Height - pData->m_PosY;
+ CFX_AffineMatrix matrix(1, 0, 0, 1, dxCell, dy);
+ Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+ if(pCell->m_RowSpan + i <= rowCount) {
+ if(FXSYS_fabs(dyRow[pCell->m_RowSpan + i]) < FXSYS_fabs(dyRow[i] - pCell->m_CellHeight)) {
+ dyRow[pCell->m_RowSpan + i] = dyRow[i] - pCell->m_CellHeight;
+ }
+ }
+ }
+ }
+ n = 0;
+ for(i = 0; i < rowCount; i++) {
+ int colCount = pTable->m_nCell.GetAt(i);
+ for(int j = 0; j < colCount; j++) {
+ RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++);
+ switch(pCell->m_BlockAlign) {
+ case LayoutAfter: {
+ FX_FLOAT dy = dyRow[i + pCell->m_RowSpan] - pCell->m_CellHeight - dyRow[i];
+ CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);
+ Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+ }
+ break;
+ case LayoutMiddle:
+ case LayoutJustify: {
+ FX_FLOAT dy = (dyRow[i + pCell->m_RowSpan] + pCell->m_CellHeight - dyRow[i]) / 2;
+ CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy);
+ Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[m_pReflowedPage->m_pReflowed->GetSize() - 1];
+ m_pReflowedPage->m_PageHeight = - dyRow[rowCount] + pData->m_Height;
+ FX_Free(pVirtualTable);
+ FX_Free(dyRow);
+ int size = pTable->m_pCellArray.GetSize();
+ for(i = 0; i < size; i++) {
+ RF_TableCell* pCell = pTable->m_pCellArray.GetAt(i);
+ FX_Free(pCell);
+ }
+ pTable->m_pCellArray.RemoveAll();
+ pTable->m_nCell.RemoveAll();
+ int s = sizeof(CRF_Table);
+ delete pTable;
+ m_TableArray.RemoveAt(m_TableArray.GetSize() - 1);
+}
+CFX_FloatRect CPDF_LayoutProcessor_Reflow::GetElmBBox(IPDF_LayoutElement* pElement)
+{
+ CFX_FloatRect rect;
+ int objCount = pElement->CountObjects();
+ int count = pElement->CountChildren();
+ if(objCount == 0 && count == 0) {
+ return rect;
+ }
+ CFX_AffineMatrix matrix;
+ int i;
+ for(i = 0; i < objCount; i++) {
+ CPDF_PageObject* pObj = pElement->GetObject(0);
+ if(!pObj) {
+ continue;
+ }
+ if( rect.Height() == 0 ) {
+ rect = pObj->GetBBox(&matrix);
+ } else {
+ rect.Union(pObj->GetBBox(&matrix));
+ }
+ }
+ for(i = 0; i < count; i++) {
+ IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+ if( rect.Height() == 0 ) {
+ rect = GetElmBBox(pChildElement);
+ } else {
+ rect.Union(GetElmBBox(pChildElement));
+ }
+ }
+ return rect;
+}
+FX_FLOAT CPDF_LayoutProcessor_Reflow::GetElmWidth(IPDF_LayoutElement* pElement)
+{
+ if(!pElement) {
+ return 0;
+ }
+ LayoutType layoutType = pElement->GetType();
+ FX_FLOAT width = 0;
+ if(layoutType == LayoutTable || layoutType == LayoutTableDataCell || layoutType == LayoutTableHeaderCell) {
+ width = pElement->GetNumberAttr(LayoutWidth);
+ if(width > 0) {
+ return width;
+ }
+ } else if( layoutType == LayoutTableRow) {
+ int count = pElement->CountChildren();
+ for(int i = 0; i < count; i++) {
+ IPDF_LayoutElement* pElm = pElement->GetChild(i);
+ width += pElm->GetNumberAttr(LayoutWidth);
+ }
+ if(width > 0) {
+ return width;
+ }
+ }
+ CFX_FloatRect rect = GetElmBBox(pElement);
+ return rect.Width();
+}
+FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+ FX_FLOAT& interlow, FX_FLOAT& interhigh);
+FX_BOOL IsSameLine(FX_BOOL bHorizontal, CFX_FloatRect Rect1, CFX_FloatRect Rect2)
+{
+ if(bHorizontal) {
+ FX_FLOAT inter_top, inter_bottom;
+ if (!GetIntersection(Rect1.bottom, Rect1.top, Rect2.bottom, Rect2.top,
+ inter_bottom, inter_top)) {
+ return FALSE;
+ }
+ FX_FLOAT lineHeight = Rect1.top - Rect1.bottom;
+ if(lineHeight > 20 && lineHeight > Rect2.Height() * 2) {
+ return FALSE;
+ }
+ if(lineHeight > 5 && Rect2.Height() / 2 > lineHeight) {
+ return FALSE;
+ }
+ FX_FLOAT inter_h = inter_top - inter_bottom;
+ if (inter_h < (lineHeight) / 2 && inter_h < Rect2.Height() / 2) {
+ return FALSE;
+ }
+ } else {
+ FX_FLOAT inter_left, inter_right;
+ if(!GetIntersection(Rect1.left, Rect1.right, Rect2.left, Rect2.right, inter_left, inter_right)) {
+ return FALSE;
+ }
+ FX_FLOAT inter_w = inter_right - inter_left;
+ if (inter_w < (Rect1.right - Rect1.left) / 2 && inter_w < (Rect2.right - Rect2.left) / 2) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_INT32 IsCanMergeParagraph(IPDF_LayoutElement* pPrevElement, IPDF_LayoutElement* pNextElement)
+{
+ FX_INT32 analogial = 100;
+ FX_INT32 nPrevObj = pPrevElement->CountObjects(), i;
+ CPDF_PageObject* pPrevObj = NULL;
+ CFX_FloatRect prevRect, rect;
+ CFX_PtrArray prevLine, line;
+ FX_BOOL bParagraphStart = FALSE;
+ for(i = 0; i < nPrevObj; i++) {
+ CPDF_PageObject* pObj = pPrevElement->GetObject(i);
+ if(!pPrevObj) {
+ pPrevObj = pObj;
+ rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ line.Add(pObj);
+ continue;
+ }
+ CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if(IsSameLine(TRUE, rect, objRect)) {
+ line.Add(pObj);
+ rect.Union(objRect);
+ } else {
+ prevLine.RemoveAll();
+ prevLine.Append(line);
+ prevRect = rect;
+ line.RemoveAll();
+ line.Add(pObj);
+ rect = objRect;
+ if(!bParagraphStart) {
+ if (prevRect.left > rect.left + rect.Height() * 1.5) {
+ bParagraphStart = TRUE;
+ }
+ }
+ }
+ }
+ if(prevLine.GetSize()) {
+ if(FXSYS_fabs(rect.right - prevRect.right) > rect.Height()) {
+ analogial -= 50;
+ }
+ }
+ CPDF_PageObject* pObj = pPrevElement->GetObject(nPrevObj - 1);
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pText = (CPDF_TextObject*)pObj;
+ FX_INT32 nItem = pText->CountItems();
+ CPDF_TextObjectItem item;
+ pText->GetItemInfo(nItem - 1, &item);
+ CFX_WideString wStr = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ if(wStr.IsEmpty()) {
+ wStr = (FX_WCHAR)item.m_CharCode;
+ }
+ FX_WCHAR wch = wStr.GetAt(wStr.GetLength() - 1);
+ switch(wch) {
+ case '.':
+ case 12290:
+ case 65311:
+ case 63:
+ case 33:
+ case 65281:
+ analogial -= 50;
+ break;
+ }
+ }
+ prevLine.RemoveAll();
+ prevLine.Append(line);
+ line.RemoveAll();
+ FX_INT32 nNextObj = pNextElement->CountObjects();
+ pPrevObj = NULL;
+ FX_BOOL bFirst = TRUE;
+ for(i = 0; i < nNextObj; i++) {
+ CPDF_PageObject* pObj = pNextElement->GetObject(i);
+ if(!pPrevObj) {
+ pPrevObj = pObj;
+ rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ line.Add(pObj);
+ continue;
+ }
+ CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ if(IsSameLine(TRUE, rect, objRect)) {
+ line.Add(pObj);
+ rect.Union(objRect);
+ } else {
+ if(FXSYS_fabs(rect.right - prevRect.right) < rect.Height() && FXSYS_fabs(rect.left - prevRect.left) < rect.Height()) {
+ analogial += 50;
+ }
+ prevLine.RemoveAll();
+ prevLine.Append(line);
+ prevRect = rect;
+ line.RemoveAll();
+ line.Add(pObj);
+ rect = objRect;
+ if(!bFirst) {
+ break;
+ }
+ bFirst = FALSE;
+ }
+ }
+ if(prevLine.GetSize()) {
+ if(bParagraphStart) {
+ if(prevRect.left - rect.left > rect.Height() && prevRect.left - rect.left < rect.Height() * 3) {
+ analogial -= 50;
+ }
+ } else {
+ if(FXSYS_fabs(prevRect.left - rect.left) < rect.Height()) {
+ analogial -= 50;
+ }
+ }
+ }
+ return analogial;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)
+{
+ if(pElement == NULL) {
+ return;
+ }
+ if(m_Status == LayoutReady) {
+ LayoutType layoutType = pElement->GetType();
+ FX_INT32 ElementType = GetElementTypes(layoutType);
+ switch(ElementType) {
+ case SST_IE:
+ m_bIllustration = TRUE;
+ break;
+ case SST_BLSE:
+ FinishedCurrLine();
+ FX_FLOAT StartIndent = 0;
+ if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+ StartIndent = pParent->GetNumberAttr(LayoutStartIndent);
+ }
+ FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);
+ m_StartIndent = ConverWidth(currStartIndent);
+ FX_FLOAT width = reflowWidth;
+ if(StartIndent != currStartIndent) {
+ reflowWidth -= m_StartIndent;
+ }
+ FX_FLOAT spaceBefore = pElement->GetNumberAttr(LayoutSpaceBefore);
+ m_pReflowedPage->m_PageHeight += spaceBefore;
+ m_TextAlign = pElement->GetEnumAttr(LayoutTextAlign);
+ if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+ StartIndent = pParent->GetNumberAttr(LayoutEndIndent);
+ FX_FLOAT currEndIndent = pElement->GetNumberAttr(LayoutEndIndent);
+ if(StartIndent != currStartIndent) {
+ reflowWidth -= ConverWidth(currEndIndent);
+ }
+ }
+ if(reflowWidth * 2 < width) {
+ reflowWidth = width;
+ m_StartIndent = 0;
+ }
+ break;
+ }
+ switch(layoutType) {
+ case LayoutTable: {
+ CRF_Table* pTable = FX_NEW CRF_Table;
+ if (NULL == pTable) {
+ break;
+ }
+ m_TableArray.Add(pTable);
+ pTable->m_ReflowPageHeight = m_pReflowedPage->m_PageHeight;
+ pTable->m_TableWidth = GetElmWidth(pElement);
+ break;
+ }
+ case LayoutTableRow: {
+ if(!m_TableArray.GetSize()) {
+ break;
+ }
+ int count = pElement->CountChildren();
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ int f = 0;
+ for(int i = 0; i < count; i++) {
+ IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+ LayoutType type = pChildElement->GetType();
+ if(type == LayoutTableDataCell || type == LayoutTableHeaderCell) {
+ f++;
+ }
+ }
+ pTable->m_nCell.Add(f);
+ break;
+ }
+ case LayoutTableDataCell:
+ case LayoutTableHeaderCell: {
+ if(!m_TableArray.GetSize()) {
+ break;
+ }
+ RF_TableCell* pCell = FX_Alloc(RF_TableCell, 1);
+ FXSYS_memset32(pCell, 0 , sizeof(RF_TableCell));
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ int pos = pTable->m_nCell.GetSize() - 1;
+ pCell->m_BeginPos = m_pReflowedPage->m_pReflowed->GetSize();
+ FX_FLOAT cellWidth = pElement->GetNumberAttr(LayoutWidth);
+ if(cellWidth == 0 || pCell->m_MaxWidth > pTable->m_TableWidth) {
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ pCell->m_MaxWidth = reflowWidth / pTable->m_nCell.GetAt(pTable->m_nCell.GetSize() - 1);
+ } else {
+ pCell->m_MaxWidth = pElement->GetNumberAttr(LayoutWidth) * reflowWidth / pTable->m_TableWidth;
+ }
+ pCell->m_ColSpan = (int)(pElement->GetNumberAttr(LayoutColSpan));
+ pCell->m_RowSpan = (int)(pElement->GetNumberAttr(LayoutRowSpan));
+ if(!pCell->m_ColSpan) {
+ pCell->m_ColSpan = 1;
+ }
+ if(!pCell->m_RowSpan ) {
+ pCell->m_RowSpan = 1;
+ }
+ pCell->m_BlockAlign = pElement->GetEnumAttr(LayoutBlockAlign);
+ m_TextAlign = pElement->GetEnumAttr(LayoutInlineAlign);
+ pCell->m_PosX = 0;
+ pCell->m_PosY = 0;
+ reflowWidth = pCell->m_MaxWidth;
+ pTable->m_pCellArray.Add(pCell);
+ break;
+ }
+ default:
+ break;
+ }
+ m_fLineHeight = pElement->GetNumberAttr(LayoutLineHeight);
+ int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();
+ if(pElement->CountObjects()) {
+ ProcessObjs(pElement, reflowWidth);
+ }
+ }
+ int count = pElement->CountChildren();
+ for(int i = 0; i < count; i++) {
+ IPDF_LayoutElement* pChildElement = pElement->GetChild(i);
+ ProcessElement(pChildElement, reflowWidth);
+ if(m_pPause && m_pRootElement == pElement && m_Status != LayoutToBeContinued ) {
+ if(m_pPause->NeedToPauseNow()) {
+ m_pLayoutElement = pChildElement;
+ m_Status = LayoutToBeContinued;
+ m_CurrRefWidth = reflowWidth;
+ m_PausePosition = (i + 1) * 100 / (count + 1);
+ return ;
+ }
+ }
+ if(m_Status == LayoutToBeContinued && m_pLayoutElement == pChildElement) {
+ m_Status = LayoutReady;
+ }
+ }
+ if(m_Status == LayoutReady) {
+ FX_FLOAT dx = 0;
+ LayoutType layoutType = pElement->GetType();
+ FX_INT32 ElementType = GetElementTypes(layoutType);
+ switch(ElementType) {
+ case SST_IE:
+ m_bIllustration = FALSE;
+ FinishedCurrLine();
+ break;
+ case SST_BLSE:
+ FinishedCurrLine();
+ FX_FLOAT StartIndent = 0;
+ if(IPDF_LayoutElement* pParent = pElement->GetParent()) {
+ StartIndent = pParent->GetNumberAttr(LayoutStartIndent);
+ }
+ FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent);
+ if(StartIndent != currStartIndent) {
+ reflowWidth += ConverWidth(currStartIndent);
+ dx += ConverWidth(currStartIndent);
+ }
+ FX_FLOAT spaceAfter = pElement->GetNumberAttr(LayoutSpaceAfter);
+ m_pReflowedPage->m_PageHeight += spaceAfter;
+ break;
+ }
+ switch(layoutType) {
+ case LayoutTableDataCell:
+ case LayoutTableHeaderCell: {
+ if(!m_TableArray.GetSize()) {
+ break;
+ }
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ RF_TableCell* pCell = pTable->m_pCellArray.GetAt(pTable->m_pCellArray.GetSize() - 1);
+ pCell->m_EndPos = m_pReflowedPage->m_pReflowed->GetSize() - 1;
+ if(pCell->m_EndPos < pCell->m_BeginPos) {
+ pCell->m_CellHeight = 0;
+ } else {
+ CRF_Data* pBeginData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos];
+ CRF_Data* pEndData = (*m_pReflowedPage->m_pReflowed)[pCell->m_EndPos];
+ pCell->m_CellHeight = pBeginData->m_Height > pEndData->m_Height ? pBeginData->m_Height : pEndData->m_Height;
+ pCell->m_CellHeight -= pEndData->m_PosY - pBeginData->m_PosY;
+ }
+ break;
+ }
+ case LayoutTableRow: {
+ if(!m_TableArray.GetSize()) {
+ break;
+ }
+ CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1);
+ if(pTable->m_nCol == 0) {
+ pTable->m_nCol = pTable->m_pCellArray.GetSize();
+ }
+ break;
+ }
+ case LayoutTable: {
+ ProcessTable(dx);
+ break;
+ }
+ default:
+ if(dx) {
+ CFX_AffineMatrix matrix(1, 0, 0, 1, dx, 0);
+ int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize();
+ Transform(&matrix, m_pReflowedPage->m_pReflowed, ReflowedSize, m_pReflowedPage->m_pReflowed->GetSize() - ReflowedSize);
+ }
+ }
+ }
+ if(m_pRootElement == pElement) {
+ m_PausePosition = 100;
+ }
+}
+FX_INT32 CPDF_LayoutProcessor_Reflow::GetElementTypes(LayoutType layoutType)
+{
+ switch(layoutType) {
+ case LayoutParagraph:
+ case LayoutHeading:
+ case LayoutHeading1:
+ case LayoutHeading2:
+ case LayoutHeading3:
+ case LayoutHeading4:
+ case LayoutHeading5:
+ case LayoutHeading6:
+ case LayoutList:
+ case LayoutListItem:
+ case LayoutListLabel:
+ case LayoutListBody:
+ case LayoutTable:
+ case LayoutTableHeaderCell:
+ case LayoutTableDataCell:
+ case LayoutTableRow:
+ case LayoutTableHeaderGroup:
+ case LayoutTableBodyGroup:
+ case LayoutTableFootGroup:
+ case LayoutTOCI:
+ case LayoutCaption:
+ return SST_BLSE;
+ case LayoutFigure:
+ case LayoutFormula:
+ case LayoutForm:
+ return SST_IE;
+ case LayoutSpan:
+ case LayoutQuote:
+ case LayoutNote:
+ case LayoutReference:
+ case LayoutBibEntry:
+ case LayoutCode:
+ case LayoutLink:
+ case LayoutAnnot:
+ case LayoutRuby:
+ case LayoutWarichu:
+ return SST_ILSE;
+ default:
+ return SST_GE;
+ }
+ return FALSE;
+}
+FX_FLOAT CPDF_LayoutProcessor_Reflow::ConverWidth(FX_FLOAT width)
+{
+ return width;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+ if(!pObj) {
+ return;
+ }
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ ProcessTextObject( (CPDF_TextObject *)pObj, reflowWidth, objMatrix);
+ } else if(pObj->m_Type == PDFPAGE_IMAGE) {
+ if(!(m_flags & RF_PARSER_IMAGE)) {
+ return;
+ }
+ CPDF_PageObjects* pObjs = FX_NEW CPDF_PageObjects(FALSE);
+ if (NULL == pObjs) {
+ return;
+ }
+ FX_POSITION pos = pObjs->GetLastObjectPosition();
+ pos = pObjs->InsertObject(pos, pObj);
+ CFX_AffineMatrix matrix;
+ FX_RECT rect = pObj->GetBBox(&matrix);
+ CPDF_ImageObject* ImageObj = (CPDF_ImageObject*)pObj;
+ ProcessUnitaryObjs(pObjs, reflowWidth, objMatrix);
+ delete pObjs;
+ } else if(pObj->m_Type == PDFPAGE_PATH) {
+ } else if(pObj->m_Type == PDFPAGE_FORM) {
+ CPDF_FormObject* pForm = (CPDF_FormObject*)pObj;
+ FX_POSITION pos = pForm->m_pForm->GetFirstObjectPosition();
+ objMatrix.Concat(pForm->m_FormMatrix);
+ while (pos) {
+ CPDF_PageObject* pObj1 = pForm->m_pForm->GetNextObject(pos);
+ ProcessObject(pObj1, reflowWidth, objMatrix);
+ }
+ }
+}
+void CPDF_LayoutProcessor_Reflow::ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth)
+{
+ m_fCurrMaxWidth = reflowWidth;
+ int ObjCount = pElement->CountObjects();
+ for(int i = 0; i < ObjCount; i++) {
+ CPDF_PageObject* pObj = pElement->GetObject(i);
+ ProcessObject(pObj, reflowWidth, m_PDFMatrix);
+ continue;
+ }
+}
+void CPDF_LayoutProcessor_Reflow::AddTemp2CurrLine(int begin, int count)
+{
+ if(begin < 0 || count <= 0 || !m_pReflowedPage || !m_pReflowedPage->m_pReflowed || !m_pTempLine) {
+ return;
+ } else {
+ count += begin;
+ }
+ int size = m_pReflowedPage->m_pReflowed->GetSize();
+ int temps = m_pTempLine->GetSize();
+ for(int i = begin; i < count; i++) {
+ CRF_Data* pData = (*m_pTempLine)[i];
+ AddData2CurrLine(pData);
+ }
+}
+void CPDF_LayoutProcessor_Reflow::AddData2CurrLine(CRF_Data* pData)
+{
+ if(pData == NULL || m_pCurrLine == NULL) {
+ return;
+ }
+ m_pCurrLine->Add(pData);
+ m_fCurrLineWidth = pData->m_PosX + pData->m_Width;
+ if(pData->m_Height > m_fCurrLineHeight) {
+ m_fCurrLineHeight = pData->m_Height;
+ }
+}
+void CPDF_LayoutProcessor_Reflow::UpdateCurrLine()
+{
+}
+void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count)
+{
+ if (!pDataArray) {
+ return;
+ }
+ if(count == 0) {
+ count = pDataArray->GetSize();
+ } else {
+ count += beginPos;
+ }
+ for(int i = beginPos; i < count; i++) {
+ CRF_Data* pData = (*pDataArray)[i];
+ Transform(pMatrix, pData);
+ }
+}
+void CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData)
+{
+ if(pData->GetType() == CRF_Data::Path) {
+ CRF_PathData* pPathData = (CRF_PathData*)pData;
+ pPathData->m_pPath2Device.Concat(*pMatrix);
+ }
+ pMatrix->Transform(pData->m_PosX, pData->m_PosY, pData->m_PosX, pData->m_PosY);
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::FinishedCurrLine()
+{
+ if (NULL == m_pCurrLine) {
+ return FALSE;
+ }
+ int count = m_pCurrLine->GetSize();
+ if(count == 0) {
+ return FALSE;
+ }
+ if(m_fLineHeight > m_fCurrLineHeight) {
+ m_fCurrLineHeight = m_fLineHeight;
+ } else {
+ m_fCurrLineHeight += 2;
+ }
+ if(m_pReflowedPage->m_pReflowed->GetSize() > 0) {
+ m_fCurrLineHeight += m_fLineSpace;
+ }
+ FX_FLOAT height = m_pReflowedPage->m_PageHeight + m_fCurrLineHeight;
+ FX_FLOAT lineHeight = m_fLineHeight;
+ if(lineHeight == 0) {
+ lineHeight = m_fCurrLineHeight;
+ }
+ FX_FLOAT dx = 0;
+ switch(m_TextAlign) {
+ case LayoutCenter:
+ dx = (m_fCurrMaxWidth - m_fCurrLineWidth) / 2;
+ break;
+ case LayoutEnd:
+ dx = m_fCurrMaxWidth - m_fCurrLineWidth;
+ break;
+ case LayoutJustify:
+ break;
+ default:
+ break;
+ }
+ FX_FLOAT dy = - height;
+ int refedSize = m_pReflowedPage->m_pReflowed->GetSize();
+ if(count == 13) {
+ int a = 0;
+ }
+ for(int i = 0; i < count; i++) {
+ CRF_Data* pData = (*m_pCurrLine)[i];
+ m_pReflowedPage->m_pReflowed->Add(pData);
+ FX_FLOAT x = m_StartIndent + dx * (m_TextAlign == LayoutJustify ? i + 1 : 1);
+ CFX_AffineMatrix matrix(1, 0, 0, 1, x, dy);
+ Transform(&matrix, pData);
+ }
+ m_pCurrLine->RemoveAll();
+ m_fCurrLineWidth = 0;
+ m_pReflowedPage->m_PageHeight += m_fCurrLineHeight;
+ m_fCurrLineHeight = 0;
+ return TRUE;
+}
+CRF_CharState* CPDF_LayoutProcessor_Reflow::GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color)
+{
+ if (NULL == m_pReflowedPage->m_pCharState) {
+ return NULL;
+ }
+ int count = m_pReflowedPage->m_pCharState->GetSize();
+ for(int i = count - 1; i >= 0; i--) {
+ CRF_CharState* pState = (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(i);
+ if(pState->m_Color == color && pState->m_fFontSize == fHeight && pState->m_pFont == pFont && pState->m_pTextObj == pObj) {
+ return pState;
+ }
+ }
+ CRF_CharState pState;
+ pState.m_pTextObj = pObj;
+ pState.m_Color = color;
+ pState.m_pFont = pFont;
+ pState.m_fFontSize = fHeight;
+ int ascent = pFont->GetTypeAscent();
+ int descent = pFont->GetTypeDescent();
+ pState.m_fAscent = ascent * fHeight / (ascent - descent);
+ if(descent == 0) {
+ pState.m_fDescent = 0;
+ } else {
+ pState.m_fDescent = descent * fHeight / (ascent - descent);
+ }
+ pState.m_bVert = FALSE;
+ CPDF_CIDFont *pCIDFont = pFont->GetCIDFont();
+ if(pCIDFont) {
+ pState.m_bVert = pCIDFont->IsVertWriting();
+ }
+ m_pReflowedPage->m_pCharState->Add(pState);
+ return (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(count);
+}
+int CPDF_LayoutProcessor_Reflow::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const
+{
+ if(charCode == -1) {
+ return 0;
+ }
+ int w = pFont->GetCharWidthF(charCode);
+ if(w == 0) {
+ CFX_ByteString str;
+ pFont->AppendChar(str, charCode);
+ w = pFont->GetStringWidth(str, 1);
+ if(w == 0) {
+ FX_RECT BBox;
+ pFont->GetCharBBox(charCode, BBox);
+ w = BBox.right - BBox.left;
+ }
+ }
+ return w;
+}
+void CPDF_LayoutProcessor_Reflow::CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pObjMatrix)
+{
+ if (NULL == m_pReflowedPage->m_pMemoryPool) {
+ return;
+ }
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj;
+ int count = pTextObj->CountItems();
+ if(!count) {
+ return;
+ }
+ if(count == 1) {
+ CPDF_TextObjectItem Item;
+ pTextObj->GetItemInfo(0, &Item);
+ if(Item.m_CharCode == 49) {
+ int a = 0;
+ }
+ }
+ CPDF_Font * pFont = pTextObj->GetFont();
+ FX_FLOAT fs = pTextObj->GetFontSize();
+ FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();
+ FX_FLOAT matrix1 = pmatrix[1];
+ if(pmatrix[2] == 0) {
+ matrix1 = 0;
+ }
+ CFX_AffineMatrix textMatrix(pmatrix[0], matrix1, pmatrix[2], pmatrix[3], 0, 0);
+ FX_FLOAT height = FXSYS_fabs(textMatrix.TransformDistance(fs));
+ if(pObjMatrix) {
+ height = FXSYS_fabs(pObjMatrix->TransformDistance(height));
+ }
+ int r = 0, g = 0, b = 0;
+ pTextObj->m_ColorState.GetFillColor()->GetRGB(r, g, b);
+ FX_ARGB col = r * 0x10000;
+ col += g * 0x100;
+ col += b;
+ CRF_CharState* pState = GetCharState(pTextObj, pFont, height, col);
+ FX_FLOAT dx = 0, dy = 0;
+ FX_RECT ObjBBox;
+ if(pObjMatrix) {
+ ObjBBox = pTextObj->GetBBox(pObjMatrix);
+ dx = (float)ObjBBox.left;
+ dy = (float)ObjBBox.bottom;
+ } else {
+ CFX_AffineMatrix matrix;
+ ObjBBox = pTextObj->GetBBox(&matrix);
+ }
+ FX_FLOAT objWidth = 0;
+ CFX_ByteString str;
+ FX_BOOL bOrder = TRUE;
+ CFX_PtrArray tempArray;
+ int i = 0;
+ CPDF_TextObjectItem Item;
+ pTextObj->GetItemInfo(i, &Item);
+ dx = Item.m_OriginX;
+ dy = Item.m_OriginY;
+ textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, dx, dy);
+ CRF_CharData* pLastData = NULL;
+ FX_FLOAT horzScale = pTextObj->m_TextState.GetFontSizeV() / pTextObj->m_TextState.GetFontSizeH();
+ while(i < count) {
+ pTextObj->GetItemInfo(i, &Item);
+ if(Item.m_CharCode == -1) {
+ i++;
+ continue;
+ }
+ FX_FLOAT OriginX, OriginY;
+ textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, OriginX, OriginY);
+ CRF_CharData* pData = (CRF_CharData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_CharData));
+ if (NULL == pData) {
+ continue;
+ }
+ pData->m_Type = CRF_Data::Text;
+ if(FXSYS_fabs(OriginY - dy) > FXSYS_fabs(OriginX - dx)) {
+ pData->m_PosY = dy;
+ pData->m_PosX = pLastData->m_PosX + pLastData->m_Width + textMatrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace);
+ } else {
+ pData->m_PosY = OriginY;
+ pData->m_PosX = OriginX;
+ }
+ int size = tempArray.GetSize();
+ if(size && pData->m_PosX < pLastData->m_PosX ) {
+ for (int j = 0; j < size; j++) {
+ CRF_CharData* pData1 = (CRF_CharData*)tempArray.GetAt(j);
+ if(pData1->m_PosX > pData->m_PosX) {
+ tempArray.InsertAt(j, pData);
+ break;
+ }
+ }
+ } else {
+ tempArray.Add(pData);
+ }
+ pLastData = pData;
+ pData->m_CharCode = Item.m_CharCode;
+ pData->m_Height = FXSYS_fabs(height);
+ int w = GetCharWidth(Item.m_CharCode, pFont);
+ pData->m_Width = FXSYS_fabs(fs * textMatrix.TransformDistance((FX_FLOAT)w) / 1000);
+ if(horzScale) {
+ pData->m_Width /= horzScale;
+ }
+ pData->m_pCharState = pState;
+ i++;
+ }
+ count = tempArray.GetSize();
+ for (int j = 0; j < count; j++) {
+ CRF_CharData* pData = (CRF_CharData*)tempArray.GetAt(j);
+ if (m_pTempLine) {
+ m_pTempLine->Add(pData);
+ }
+ }
+ tempArray.RemoveAll();
+ } else if(pObj->m_Type == PDFPAGE_IMAGE) {
+ CPDF_ImageObject* pImageObj = (CPDF_ImageObject* )pObj;
+ CRF_ImageData* pRFImage = (CRF_ImageData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_ImageData));
+ if (NULL == pRFImage) {
+ return;
+ }
+ pRFImage->m_pBitmap = NULL;
+ pRFImage->m_Type = CRF_Data::Image;
+ if (m_pTempLine) {
+ m_pTempLine->Add(pRFImage);
+ }
+ CPDF_Image *pImage = pImageObj->m_pImage;
+ if (!pImage->m_pDIBSource || !pImage->m_pMask) {
+ if(pImage->StartLoadDIBSource(m_pReflowedPage->GetFormResDict(pImageObj), m_pReflowedPage->m_pPDFPage->m_pResources, 0, 0, TRUE)) {
+ pImage->Continue(NULL);
+ }
+ }
+ CFX_DIBSource* pDibSource = pImage->DetachBitmap();
+ if (pDibSource) {
+ pRFImage->m_pBitmap = pDibSource->Clone();
+ delete pDibSource;
+ }
+ CFX_DIBSource* pMask = pImage->DetachMask();
+ if (pMask) {
+ if (!pMask->IsAlphaMask()) {
+ CFX_DIBitmap* pMaskBmp = pMask->Clone();
+ pMaskBmp->ConvertFormat(FXDIB_8bppMask);
+ pRFImage->m_pBitmap->MultiplyAlpha(pMaskBmp);
+ delete pMaskBmp;
+ } else {
+ pRFImage->m_pBitmap->MultiplyAlpha(pMask);
+ }
+ delete pMask;
+ }
+ CFX_FloatRect ObjBBox;
+ if(pObjMatrix) {
+ ObjBBox = pImageObj->GetBBox(pObjMatrix);
+ } else {
+ CFX_AffineMatrix matrix;
+ ObjBBox = pImageObj->GetBBox(&matrix);
+ }
+ pRFImage->m_Width = ObjBBox.Width();
+ pRFImage->m_Height = ObjBBox.Height();
+ pRFImage->m_PosX = 0;
+ pRFImage->m_PosY = 0;
+ CFX_AffineMatrix matrix(1, 0, 0, -1, 0, 0);
+ matrix.Concat(pImageObj->m_Matrix);
+ matrix.Concat(*pObjMatrix);
+ pRFImage->m_Matrix.Set(matrix.a == 0 ? 0 : matrix.a / FXSYS_fabs(matrix.a),
+ matrix.b == 0 ? 0 : matrix.b / FXSYS_fabs(matrix.b),
+ matrix.c == 0 ? 0 : matrix.c / FXSYS_fabs(matrix.c),
+ matrix.d == 0 ? 0 : matrix.d / FXSYS_fabs(matrix.d), 0, 0);
+ } else if(pObj->m_Type == PDFPAGE_PATH) {
+ }
+}
+FX_FLOAT CPDF_LayoutProcessor_Reflow:: GetDatasWidth(int beginPos, int endpos)
+{
+ if(endpos < beginPos || !m_pTempLine) {
+ return 0;
+ }
+ if(endpos > m_pTempLine->GetSize() - 1) {
+ endpos = m_pTempLine->GetSize() - 1;
+ }
+ CRF_Data* pBeginData = (*m_pTempLine)[beginPos];
+ CRF_Data* pEndData = (*m_pTempLine)[endpos];
+ return pEndData->m_PosX - pBeginData->m_PosX + pEndData->m_Width;
+}
+FX_WCHAR CPDF_LayoutProcessor_Reflow::GetPreChar()
+{
+ if (NULL == m_pCurrLine) {
+ return -1;
+ }
+ int index = m_pCurrLine->GetSize() - 1;
+ CRF_CharData* pCharData = NULL;
+ while (index >= 0 && !pCharData) {
+ CRF_Data* pData = (*m_pCurrLine)[index];
+ if(pData->GetType() == CRF_Data::Text) {
+ pCharData = (CRF_CharData*)pData;
+ } else {
+ return -1;
+ }
+ index --;
+ }
+ if(m_pReflowedPage) {
+ index = m_pReflowedPage->m_pReflowed->GetSize() - 1;
+ }
+ while(!pCharData && index >= 0) {
+ CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[index];
+ if(pData->GetType() == CRF_Data::Text) {
+ pCharData = (CRF_CharData*)pData;
+ } else {
+ return -1;
+ }
+ index --;
+ }
+ if(pCharData) {
+ CFX_WideString str = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);
+ return str.GetAt(0);
+ }
+ return -1;
+}
+int CPDF_LayoutProcessor_Reflow::ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix)
+{
+ if(!pObj || !m_pPreObj || !m_pCurrLine) {
+ return 0;
+ }
+ if(m_pCurrLine->GetSize() == 0) {
+ return 0;
+ }
+ CPDF_TextObjectItem item;
+ int nItem = m_pPreObj->CountItems();
+ m_pPreObj->GetItemInfo(nItem - 1, &item);
+ FX_FLOAT last_pos = item.m_OriginX;
+ FX_FLOAT last_width = GetCharWidth(item.m_CharCode, m_pPreObj->GetFont()) * m_pPreObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ pObj->GetItemInfo(0, &item);
+ FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pObj->GetFont()) * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ m_pPreObj->GetTextMatrix(&prev_matrix);
+ prev_matrix.Concat(m_perMatrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+ formMatrix.Transform(x, y);
+ prev_reverse.Transform(x, y);
+ FX_WCHAR preChar = GetPreChar();
+ CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if (FXSYS_fabs(y) > threshold * 2) {
+ if (preChar == L'-') {
+ return 3;
+ }
+ if (preChar != L' ') {
+ return 1;
+ }
+ return 2;
+ }
+ if ((x - last_pos - last_width) > threshold && curChar != L' ' && preChar != L' ') {
+ return 1;
+ }
+ return 0;
+}
+FX_INT32 CPDF_LayoutProcessor_Reflow::LogicPreObj(CPDF_TextObject* pObj)
+{
+ CPDF_TextObject* pPreObj = m_pPreObj;
+ m_pPreObj = pObj;
+ if(!pObj || !pPreObj) {
+ return 0;
+ }
+ CPDF_TextObjectItem item;
+ pPreObj->GetItemInfo(pPreObj->CountItems() - 1, &item);
+ FX_FLOAT last_pos = item.m_OriginX;
+ FX_FLOAT last_width = pPreObj->GetFont()->GetCharWidthF(item.m_CharCode) * pPreObj->GetFontSize() / 1000;
+ last_width = FXSYS_fabs(last_width);
+ pObj->GetItemInfo(0, &item);
+ FX_FLOAT this_width = pObj->GetFont()->GetCharWidthF(item.m_CharCode) * pObj->GetFontSize() / 1000;
+ this_width = FXSYS_fabs(this_width);
+ FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4;
+ CFX_AffineMatrix prev_matrix, prev_reverse;
+ pPreObj->GetTextMatrix(&prev_matrix);
+ prev_reverse.SetReverse(prev_matrix);
+ FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY();
+ prev_reverse.Transform(x, y);
+ CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode);
+ FX_WCHAR curChar = wstrItem.GetAt(0);
+ if (FXSYS_fabs(y) > threshold * 2) {
+ return 2;
+ }
+ FX_WCHAR preChar = 0;
+ if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ') {
+ return 1;
+ }
+ return 0;
+ m_pPreObj = pObj;
+ if(!pPreObj) {
+ return 0;
+ }
+ if(pPreObj->m_Type != pObj->m_Type) {
+ return 0;
+ }
+ CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top);
+ CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top);
+ if(pObj->m_Type == PDFPAGE_IMAGE) {
+ if(rcPreObj.Contains(rcCurObj)) {
+ return 2;
+ }
+ if(rcCurObj.Contains(rcPreObj)) {
+ return 2;
+ }
+ return 0;
+ }
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) {
+ FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height());
+ if((rcCurObj.left - rcPreObj.right) > height / 3) {
+ return 3;
+ }
+ }
+ if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) {
+ return 0;
+ }
+ CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj;
+ CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj;
+ int nPreCount = pPreTextObj->CountItems();
+ int nCurCount = pCurTextObj->CountItems();
+ if (nPreCount != nCurCount) {
+ return 0;
+ }
+ FX_BOOL bSame = TRUE;
+ for (int i = 0; i < nPreCount; i++) {
+ CPDF_TextObjectItem itemPer, itemCur;
+ pPreTextObj->GetItemInfo(i, &itemPer);
+ pCurTextObj->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return 0;
+ }
+ if (itemCur.m_OriginX != itemPer.m_OriginX) {
+ bSame = FALSE;
+ }
+ if (itemCur.m_OriginY != itemPer.m_OriginY) {
+ bSame = FALSE;
+ }
+ }
+ if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) {
+ return 1;
+ }
+ if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3
+ && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) {
+ return 2;
+ }
+ }
+ return 0;
+}
+FX_BOOL CPDF_LayoutProcessor_Reflow::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2)
+{
+ if (!pTextObj1 || !pTextObj2) {
+ return FALSE;
+ }
+ CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top);
+ CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top);
+ if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) {
+ rcPreObj.Intersect(rcCurObj);
+ if (rcPreObj.IsEmpty()) {
+ return FALSE;
+ }
+ if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) {
+ return FALSE;
+ }
+ if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) {
+ return FALSE;
+ }
+ }
+ int nPreCount = pTextObj2->CountItems();
+ int nCurCount = pTextObj1->CountItems();
+ if (nPreCount != nCurCount) {
+ return FALSE;
+ }
+ for (int i = 0; i < nPreCount; i++) {
+ CPDF_TextObjectItem itemPer, itemCur;
+ pTextObj2->GetItemInfo(i, &itemPer);
+ pTextObj1->GetItemInfo(i, &itemCur);
+ if (itemCur.m_CharCode != itemPer.m_CharCode) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessTextObject(CPDF_TextObject *pTextObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+ if(reflowWidth < 0 || !m_pCurrLine || !m_pTempLine) {
+ return;
+ }
+ if(IsSameTextObject(pTextObj, m_pPreObj)) {
+ return;
+ }
+ CPDF_PageObject* pPreObj = m_pPreObj;
+ FX_INT32 logic = ProcessInsertObject(pTextObj, objMatrix);
+ m_pPreObj = pTextObj;
+ m_perMatrix.Copy(objMatrix);
+ int size = m_pTempLine->GetSize();
+ int curs = m_pCurrLine->GetSize();
+ CreateRFData(pTextObj);
+ size = m_pTempLine->GetSize();
+ int reds = m_pReflowedPage->m_pReflowed->GetSize();
+ if(size == 0) {
+ return;
+ }
+ if(logic == 1) {
+ m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;
+ } else if(logic == 3 && curs) {
+ m_fCurrLineWidth -= (*m_pCurrLine)[curs - 1]->m_Width;
+ m_pCurrLine->Delete(curs - 1);
+ }
+ int beginPos = 0, endPos = m_pTempLine->GetSize() - 1;
+ while(beginPos <= endPos) {
+ int tempBeginPos = beginPos;
+ int tempEndPos = endPos;
+ FX_FLOAT all_width = GetDatasWidth( beginPos, endPos);
+ if(all_width < reflowWidth - m_fCurrLineWidth) {
+ CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+ CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);
+ Transform(&matrix, m_pTempLine, beginPos, endPos - beginPos + 1);
+ AddTemp2CurrLine(beginPos, endPos - beginPos + 1);
+ m_pTempLine->RemoveAll();
+ return;
+ }
+ int midPos ;
+ if(tempBeginPos >= tempEndPos && tempEndPos != 0) {
+ midPos = tempEndPos;
+ } else {
+ while (tempBeginPos < tempEndPos ) {
+ midPos = (tempEndPos - tempBeginPos) / 2 + tempBeginPos;
+ if(midPos == tempBeginPos || midPos == tempEndPos) {
+ break;
+ }
+ FX_FLOAT w = GetDatasWidth( beginPos, midPos);
+ if(w < reflowWidth - m_fCurrLineWidth) {
+ tempBeginPos = midPos;
+ } else {
+ tempEndPos = midPos;
+ }
+ }
+ midPos = tempBeginPos;
+ if(midPos == 0) {
+ FX_FLOAT w = GetDatasWidth( beginPos, 1);
+ if(w > reflowWidth - m_fCurrLineWidth) {
+ midPos = -1;
+ }
+ }
+ }
+ if(midPos == -1) {
+ int count = m_pCurrLine->GetSize();
+ if(count == 0) {
+ midPos = 0;
+ }
+ }
+ int f = -1;
+ int i = 0;
+ for(i = midPos; i >= beginPos; i--) {
+ CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[i];
+ CFX_WideString Wstr = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);
+ FX_WCHAR cha = Wstr.GetAt(0);
+ if(i < m_pTempLine->GetSize() - 1) {
+ CRF_CharData* pNextData = (CRF_CharData*)(*m_pTempLine)[i + 1];
+ if(pNextData->m_PosX - (pData->m_PosX + pData->m_Width) >= pData->m_Height / 4) {
+ f = i;
+ i++;
+ }
+ }
+ if(f == -1) {
+ if(IsCanBreakAfter((FX_DWORD)cha)) {
+ f = i;
+ i++;
+ } else if(IsCanBreakBefore((FX_DWORD)cha)) {
+ f = i - 1;
+ if(f < beginPos) {
+ f = -1;
+ }
+ }
+ }
+ if(f != -1) {
+ CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+ CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY);
+ Transform(&matrix, m_pTempLine, beginPos, f - beginPos + 1);
+ CRF_Data* pData = (*m_pTempLine)[0];
+ AddTemp2CurrLine(beginPos, f - beginPos + 1);
+ beginPos = i;
+ FinishedCurrLine();
+ f = 1;
+ break;
+ }
+ }
+ if(f == -1 && i < beginPos) {
+ if( m_pCurrLine->GetSize()) {
+ int count = m_pCurrLine->GetSize();
+ f = -1;
+ for(int i = count - 1; i >= 0; i--) {
+ CRF_Data* pData = (*m_pCurrLine)[i];
+ if(pData->GetType() != CRF_Data::Text) {
+ f = i + 1;
+ } else {
+ CRF_CharData* pCharData = (CRF_CharData*)pData;
+ CFX_WideString Wstr = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode);
+ FX_WCHAR cha = Wstr.GetAt(0);
+ if(IsCanBreakAfter(cha)) {
+ f = i + 1;
+ i++;
+ } else if(IsCanBreakBefore(cha)) {
+ f = i;
+ }
+ if(f == 0) {
+ f = -1;
+ }
+ }
+ if(f != -1) {
+ FinishedCurrLine();
+ if(f < count) {
+ int reflowdCount = m_pReflowedPage->m_pReflowed->GetSize();
+ int pos = reflowdCount + f - count;
+ CRF_CharData* pData = (CRF_CharData*)(*m_pReflowedPage->m_pReflowed)[pos];
+ CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);
+ Transform(&matrix, m_pReflowedPage->m_pReflowed, pos, reflowdCount - pos);
+ for(int j = pos; j < reflowdCount; j++) {
+ AddData2CurrLine((*m_pReflowedPage->m_pReflowed)[j]);
+ }
+ m_pReflowedPage->m_pReflowed->Delete(pos, count - f);
+ if(logic == 3) {
+ m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3;
+ }
+ }
+ break;
+ }
+ }
+ }
+ if(f == -1) {
+ CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[beginPos];
+ CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY);
+ if(beginPos == midPos) {
+ Transform(&matrix, pData);
+ FX_RECT rect;
+ pData->m_pCharState->m_pFont->GetFontBBox(rect);
+ FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix();
+ CFX_AffineMatrix textMatrix(pmatrix[0], pmatrix[1], pmatrix[2], pmatrix[3], 0, 0);
+ FX_FLOAT width = pData->m_Height * (rect.right - rect.left) / 1000;
+ FX_FLOAT f = (reflowWidth - m_fCurrLineWidth) / width;
+ pData->m_PosY *= f;
+ pData->m_Width *= f;
+ pData->m_Height *= f;
+ pData->m_pCharState = GetCharState(pData->m_pCharState->m_pTextObj, pData->m_pCharState->m_pFont, pData->m_Height, pData->m_pCharState->m_Color);
+ AddData2CurrLine(pData);
+ } else {
+ for(int m = beginPos; m <= midPos; m++) {
+ CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[m];
+ Transform(&matrix, pData);
+ AddData2CurrLine(pData);
+ }
+ }
+ FinishedCurrLine();
+ beginPos = midPos + 1;
+ }
+ }
+ }
+ m_pTempLine->RemoveAll();
+ return;
+}
+void CPDF_LayoutProcessor_Reflow::ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix)
+{
+ if(!pObjs) {
+ return;
+ }
+ CFX_FloatRect ObjBBox = pObjs->CalcBoundingBox();
+ objMatrix.TransformRect(ObjBBox);
+ FX_FLOAT ObjWidth = ObjBBox.Width();
+ FX_FLOAT ObjHeight = ObjBBox.Height();
+ CFX_AffineMatrix matrix;
+ if(ObjWidth <= reflowWidth - m_fCurrLineWidth) {
+ matrix.Set(1, 0, 0, 1, m_fCurrLineWidth , 0);
+ } else if(ObjWidth <= reflowWidth) {
+ FinishedCurrLine();
+ matrix.Set(1, 0, 0, 1, 0, 0);
+ } else {
+ FinishedCurrLine();
+ FX_FLOAT f = reflowWidth / ObjWidth ;
+ matrix.Set(f, 0, 0, f, 0, 0);
+ }
+ CFX_AffineMatrix tempMatrix = matrix;
+ matrix.Concat(objMatrix);
+ FX_POSITION pos = pObjs->GetFirstObjectPosition();
+ while(pos) {
+ CPDF_PageObject* pObj = pObjs->GetNextObject(pos);
+ if(pObj->m_Type == PDFPAGE_TEXT) {
+ FX_INT32 ret = LogicPreObj((CPDF_TextObject*)pObj);
+ if(ret == 1 || ret == 2) {
+ continue;
+ }
+ }
+ CreateRFData(pObj, &matrix);
+ }
+ if (m_pTempLine) {
+ Transform(&tempMatrix, m_pTempLine, 0, m_pTempLine->GetSize());
+ AddTemp2CurrLine(0, m_pTempLine->GetSize());
+ m_pTempLine->RemoveAll();
+ }
+}
+void CPDF_LayoutProcessor_Reflow::ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth)
+{
+}
diff --git a/core/src/reflow/layoutprovider_taggedpdf.cpp b/core/src/reflow/layoutprovider_taggedpdf.cpp
new file mode 100644
index 0000000000..c40c1cdb64
--- /dev/null
+++ b/core/src/reflow/layoutprovider_taggedpdf.cpp
@@ -0,0 +1,780 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "layoutprovider_taggedpdf.h"
+CPDF_LayoutElement::CPDF_LayoutElement()
+{
+ m_pTaggedElement = NULL;
+ m_pParentElement = NULL;
+}
+CPDF_LayoutElement::~CPDF_LayoutElement()
+{
+ m_ObjArray.RemoveAll();
+ int size = m_ChildArray.GetSize();
+ for(int i = 0; i < size; i++) {
+ CPDF_LayoutElement* pChild = (CPDF_LayoutElement*)m_ChildArray.GetAt(i);
+ delete pChild;
+ pChild = NULL;
+ }
+ m_ChildArray.RemoveAll();
+}
+LayoutType CPDF_LayoutElement::ConvertLayoutType(FX_BSTR name)
+{
+ if(name == (const char*)("Document")) {
+ return LayoutDocument;
+ } else if(name == (const char*)("Part")) {
+ return LayoutPart;
+ } else if(name == (const char*)("Art")) {
+ return LayoutArt;
+ } else if(name == (const char*)("Sect")) {
+ return LayoutSect;
+ } else if(name == (const char*)("Div")) {
+ return LayoutDiv;
+ } else if(name == (const char*)("BlockQuote")) {
+ return LayoutBlockQuote;
+ } else if(name == (const char*)("Caption")) {
+ return LayoutCaption;
+ } else if(name == (const char*)("TOC")) {
+ return LayoutTOC;
+ } else if(name == (const char*)("TOCI")) {
+ return LayoutTOCI;
+ } else if(name == (const char*)("Index")) {
+ return LayoutIndex;
+ } else if(name == (const char*)("NonStruct")) {
+ return LayoutNonStruct;
+ } else if(name == (const char*)("Private")) {
+ return LayoutPrivate;
+ } else if(name == (const char*)("P")) {
+ return LayoutParagraph;
+ } else if(name == (const char*)("H")) {
+ return LayoutHeading;
+ } else if(name == (const char*)("H1")) {
+ return LayoutHeading1;
+ } else if(name == (const char*)("H2")) {
+ return LayoutHeading2;
+ } else if(name == (const char*)("H3")) {
+ return LayoutHeading3;
+ } else if(name == (const char*)("H4")) {
+ return LayoutHeading4;
+ } else if(name == (const char*)("H5")) {
+ return LayoutHeading5;
+ } else if(name == (const char*)("H6")) {
+ return LayoutHeading6;
+ } else if(name == (const char*)("L")) {
+ return LayoutList;
+ } else if(name == (const char*)("LI")) {
+ return LayoutListItem;
+ } else if(name == (const char*)("Lbl")) {
+ return LayoutListLabel;
+ } else if(name == (const char*)("LBody")) {
+ return LayoutListBody;
+ } else if(name == (const char*)("Table")) {
+ return LayoutTable;
+ } else if(name == (const char*)("TR")) {
+ return LayoutTableRow;
+ } else if(name == (const char*)("TH")) {
+ return LayoutTableHeaderCell;
+ } else if(name == (const char*)("TD")) {
+ return LayoutTableDataCell;
+ } else if(name == (const char*)("THead")) {
+ return LayoutTableHeaderGroup;
+ } else if(name == (const char*)("TBody")) {
+ return LayoutTableBodyGroup;
+ } else if(name == (const char*)("TFoot")) {
+ return LayoutTableFootGroup;
+ } else if(name == (const char*)("Span")) {
+ return LayoutSpan;
+ } else if(name == (const char*)("Quote")) {
+ return LayoutQuote;
+ } else if(name == (const char*)("Note")) {
+ return LayoutNote;
+ } else if(name == (const char*)("Reference")) {
+ return LayoutReference;
+ } else if(name == (const char*)("BibEntry")) {
+ return LayoutBibEntry;
+ } else if(name == (const char*)("Code")) {
+ return LayoutCode;
+ } else if(name == (const char*)("Link")) {
+ return LayoutLink;
+ } else if(name == (const char*)("Annot")) {
+ return LayoutAnnot;
+ } else if(name == (const char*)("Ruby")) {
+ return LayoutRuby;
+ } else if(name == (const char*)("RB")) {
+ return LayoutRubyBase;
+ } else if(name == (const char*)("RT")) {
+ return LayoutRubyAnnot;
+ } else if(name == (const char*)("RP")) {
+ return LayoutRubyPunc;
+ } else if(name == (const char*)("Warichu")) {
+ return LayoutWarichu;
+ } else if(name == (const char*)("WT")) {
+ return LayoutWarichuText;
+ } else if(name == (const char*)("WP")) {
+ return LayoutWarichuPunc;
+ } else if(name == (const char*)("Figure")) {
+ return LayoutFigure;
+ } else if(name == (const char*)("Formula")) {
+ return LayoutFormula;
+ } else if(name == (const char*)("Form")) {
+ return LayoutForm;
+ } else {
+ return LayoutUnknown;
+ }
+}
+CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutType(LayoutType type)
+{
+ FX_BSTR name = "";
+ if(type == LayoutArifact) {
+ return "Arifact";
+ } else if( type == LayoutDocument) {
+ return "Document";
+ } else if( type == LayoutPart) {
+ return "Part";
+ } else if( type == LayoutArt) {
+ return "Art";
+ } else if( type == LayoutSect) {
+ return "Sect";
+ } else if( type == LayoutDiv) {
+ return "Div";
+ } else if( type == LayoutBlockQuote) {
+ return "BlockQuote";
+ } else if( type == LayoutCaption) {
+ return "Caption";
+ } else if( type == LayoutTOC) {
+ return "TOC";
+ } else if( type == LayoutTOCI) {
+ return "TOCI";
+ } else if( type == LayoutIndex) {
+ return "Index";
+ } else if( type == LayoutNonStruct) {
+ return "NonStruct";
+ } else if( type == LayoutPrivate) {
+ return "Private";
+ } else if( type == LayoutParagraph) {
+ return "P";
+ } else if( type == LayoutHeading) {
+ return "H";
+ } else if( type == LayoutHeading1) {
+ return "H1";
+ } else if( type == LayoutHeading2) {
+ return "H2";
+ } else if( type == LayoutHeading3) {
+ return "H3";
+ } else if( type == LayoutHeading4) {
+ return "H4";
+ } else if( type == LayoutHeading5) {
+ return "H5";
+ } else if( type == LayoutHeading6) {
+ return "H6";
+ } else if( type == LayoutList) {
+ return "L";
+ } else if( type == LayoutListItem) {
+ return "LI";
+ } else if( type == LayoutListLabel) {
+ return "Lbl";
+ } else if( type == LayoutListBody) {
+ return "LBody";
+ } else if( type == LayoutTable) {
+ return "Table";
+ } else if( type == LayoutTableRow) {
+ return "TR";
+ } else if( type == LayoutTableHeaderCell) {
+ return "TH";
+ } else if( type == LayoutTableDataCell) {
+ return "TD";
+ } else if( type == LayoutTableHeaderGroup) {
+ return "THead";
+ } else if( type == LayoutTableBodyGroup) {
+ return "TBody";
+ } else if( type == LayoutTableFootGroup) {
+ return "TFoot";
+ } else if( type == LayoutSpan) {
+ return "Span";
+ } else if( type == LayoutQuote) {
+ return "Quote";
+ } else if( type == LayoutNote) {
+ return "Note";
+ } else if( type == LayoutReference) {
+ return "Reference";
+ } else if( type == LayoutBibEntry) {
+ return "BibEntry";
+ } else if( type == LayoutCode) {
+ return "Code";
+ } else if( type == LayoutLink) {
+ return "Link";
+ } else if( type == LayoutAnnot) {
+ return "Annot";
+ } else if( type == LayoutRuby) {
+ return "Ruby";
+ } else if( type == LayoutRubyBase) {
+ return "RB";
+ } else if( type == LayoutRubyAnnot) {
+ return "RT";
+ } else if( type == LayoutRubyPunc) {
+ return "RP";
+ } else if( type == LayoutWarichu) {
+ return "Warichu";
+ } else if( type == LayoutWarichuText) {
+ return "WT";
+ } else if( type == LayoutWarichuPunc) {
+ return "WP";
+ } else if( type == LayoutFigure) {
+ return "Figure";
+ } else if( type == LayoutFormula) {
+ return "Formula";
+ } else if( type == LayoutForm) {
+ return "Form";
+ }
+ return name;
+}
+CFX_ByteStringC CPDF_LayoutElement::ConvertLayoutAttr(LayoutAttr attr)
+{
+ switch(attr) {
+ case LayoutArtifactType:
+ return "Type";
+ case LayoutArtifactAttached:
+ return "Attached";
+ case LayoutArtifactSubType:
+ return "Subtype";
+ case LayoutPlacement:
+ return "Placement";
+ case LayoutWritingMode:
+ return "WritingMode";
+ case LayoutBackgroundColor:
+ return "BackgroundColor";
+ case LayoutBorderColor:
+ return "BorderColor";
+ case LayoutBorderStyle:
+ return "BorderStyle";
+ case LayoutBorderThickness:
+ return "BorderThickness";
+ case LayoutPadding:
+ return "Padding";
+ case LayoutColor:
+ return "Color";
+ case LayoutSpaceBefore:
+ return "SpaceBefore";
+ case LayoutSpaceAfter:
+ return "SpaceAfter";
+ case LayoutStartIndent:
+ return "StartIndent";
+ case LayoutEndIndent:
+ return "EndIndent";
+ case LayoutTextIndent:
+ return "TextIndent";
+ case LayoutTextAlign:
+ return "TextAlign";
+ case LayoutBBox:
+ return "BBox";
+ case LayoutWidth:
+ return "Width";
+ case LayoutHeight:
+ return "Height";
+ case LayoutBlockAlign:
+ return "BlockAlign";
+ case LayoutInlineAlign:
+ return "InlineAlign";
+ case LayoutTBorderStyle:
+ return "TBorderStyle";
+ case LayoutTPadding:
+ return "TPadding";
+ case LayoutBaselineShift:
+ return "BaselineShift";
+ case LayoutLineHeight:
+ return "LineHeight";
+ case LayoutTextDecorationColor:
+ return "TextDecorationColor";
+ case LayoutTextDecorationThickness:
+ return "TextDecorationThickness";
+ case LayoutTextDecorationType:
+ return "TextDecorationType";
+ case LayoutRubyAlign:
+ return "RubyAlign";
+ case LayoutRubyPosition:
+ return "RubyPosition";
+ case LayoutGlyphOrientationVertical:
+ return "GlyphOrientationVertical";
+ case LayoutColumnCount:
+ return "ColumnCount";
+ case LayoutColumnGap:
+ return "ColumnGap";
+ case LayoutColumnWidths:
+ return "ColumnWidths";
+ case LayoutListNumbering:
+ return "ListNumbering";
+ case LayoutFieldRole:
+ return "Role";
+ case LayoutFieldChecked:
+ return "checked";
+ case LayoutFieldDesc:
+ return "Desc";
+ case LayoutRowSpan:
+ return "RowSpan";
+ case LayoutColSpan:
+ return "ColSpan";
+ case LayoutTableHeaders:
+ return "Headers";
+ case LayoutTableHeaderScope:
+ return "Scope";
+ case LayoutTableSummary:
+ return "Summary";
+ default:
+ return "";
+ }
+}
+LayoutEnum CPDF_LayoutElement::ConvertLayoutEnum(CFX_ByteStringC Enum)
+{
+ if(Enum == "Block") {
+ return LayoutBlock;
+ } else if (Enum == "Inline") {
+ return LayoutInline;
+ } else if (Enum == "Before") {
+ return LayoutBefore;
+ } else if (Enum == "Start") {
+ return LayoutStart;
+ } else if (Enum == "End") {
+ return LayoutEnd;
+ } else if (Enum == "LrTb") {
+ return LayoutLrTb;
+ } else if (Enum == "RlTb") {
+ return LayoutRlTb;
+ } else if (Enum == "TbRl") {
+ return LayoutTbRl;
+ } else if (Enum == "None") {
+ return LayoutNone;
+ } else if (Enum == "Hidden") {
+ return LayoutHidden;
+ } else if (Enum == "Dotted") {
+ return LayoutDotted;
+ } else if (Enum == "Dashed") {
+ return LayoutDashed;
+ } else if (Enum == "Solid") {
+ return LayoutSolid;
+ } else if (Enum == "Double") {
+ return LayoutDouble;
+ } else if (Enum == "Groove") {
+ return LayoutGroove;
+ } else if (Enum == "Ridge") {
+ return LayoutRidge;
+ } else if (Enum == "Inset") {
+ return LayoutInset;
+ } else if (Enum == "Outset") {
+ return LayoutOutset;
+ } else if (Enum == "Normal") {
+ return LayoutNormal;
+ } else if (Enum == "Auto") {
+ return LayoutAuto;
+ } else if (Enum == "Center") {
+ return LayoutCenter;
+ } else if (Enum == "Justify") {
+ return LayoutJustify;
+ } else if (Enum == "Middle") {
+ return LayoutMiddle;
+ } else if (Enum == "Underline") {
+ return LayoutUnderline;
+ } else if (Enum == "Overline") {
+ return LayoutOverline;
+ } else if (Enum == "LineThrough") {
+ return LayoutLineThrough;
+ } else if (Enum == "Distribute") {
+ return LayoutDistribute;
+ } else if (Enum == "Disc") {
+ return LayoutDisc;
+ } else if (Enum == "Circle") {
+ return LayoutCircle;
+ } else if (Enum == "Square") {
+ return LayoutSquare;
+ } else if (Enum == "Decimal") {
+ return LayoutDecimal;
+ } else if (Enum == "UpperRoman") {
+ return LayoutUpperRoman;
+ } else if (Enum == "LowerRoman") {
+ return LayoutLowerRoman;
+ } else if (Enum == "UpperAlpha") {
+ return LayoutUpperAlpha;
+ } else if (Enum == "LowerAlpha") {
+ return LayoutLowerAlpha;
+ } else if (Enum == "rb") {
+ return LayoutRB;
+ } else if (Enum == "cb") {
+ return LayoutCB;
+ } else if (Enum == "pb") {
+ return LayoutPB;
+ } else if (Enum == "tv") {
+ return LayoutTV;
+ } else if (Enum == "on") {
+ return LayoutOn;
+ } else if (Enum == "off") {
+ return LayoutOff;
+ } else if (Enum == "neutral") {
+ return LayoutNeutral;
+ } else if (Enum == "Row") {
+ return LayoutRow;
+ } else if (Enum == "Column") {
+ return LayoutColumn;
+ } else if (Enum == "Both") {
+ return LayoutBoth;
+ } else if (Enum == "Left") {
+ return LayoutLeft;
+ } else if (Enum == "Top") {
+ return LayoutTop;
+ } else if (Enum == "Bottom") {
+ return LayoutBottom;
+ } else if (Enum == "Right") {
+ return LayoutRight;
+ } else if (Enum == "Pagination") {
+ return LayoutPagination;
+ } else if (Enum == "Layout") {
+ return LayoutLayout;
+ } else if (Enum == "Page") {
+ return LayoutPage;
+ } else if (Enum == "Background") {
+ return LayoutBackground;
+ } else if (Enum == "Header") {
+ return LayoutHeader;
+ } else if (Enum == "Footer") {
+ return LayoutFooter;
+ } else if (Enum == "Watermark") {
+ return LayoutWatermark;
+ } else {
+ return LayoutInvalid;
+ }
+}
+LayoutType CPDF_LayoutElement::GetType()
+{
+ if(!m_pTaggedElement) {
+ return LayoutUnknown;
+ }
+ CFX_ByteString name = m_pTaggedElement->GetType();
+ return this->ConvertLayoutType(name);
+}
+int CPDF_LayoutElement::CountAttrValues(LayoutAttr attr_type)
+{
+ if(!m_pTaggedElement) {
+ return 0;
+ }
+ CPDF_Object* pObj = m_pTaggedElement->GetAttr(GetAttrOwner(attr_type), ConvertLayoutAttr(attr_type), IsInheritable(attr_type));
+ if(pObj) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+LayoutEnum CPDF_LayoutElement::GetEnumAttr(LayoutAttr attr_type, int index)
+{
+ if(!m_pTaggedElement) {
+ return LayoutInvalid;
+ }
+ CFX_ByteStringC owner = GetAttrOwner(attr_type);
+ CFX_ByteStringC default_value = GetDefaultNameValue(attr_type);
+ CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+ CFX_ByteString AttrValue = m_pTaggedElement->GetName(owner, AttrName, default_value, IsInheritable(attr_type), index);
+ return ConvertLayoutEnum(AttrValue);
+}
+CFX_ByteStringC CPDF_LayoutElement::GetAttrOwner(LayoutAttr attr_type)
+{
+ switch(attr_type) {
+ case LayoutListNumbering:
+ return "List";
+ case LayoutFieldRole:
+ case LayoutFieldChecked :
+ case LayoutFieldDesc:
+ return "PrintField";
+ case LayoutRowSpan:
+ case LayoutColSpan:
+ case LayoutTableHeaders:
+ case LayoutTableHeaderScope:
+ case LayoutTableSummary:
+ return "Table";
+ default:
+ return "Layout";
+ }
+}
+FX_FLOAT CPDF_LayoutElement::GetNumberAttr(LayoutAttr attr_type, int index)
+{
+ if(!m_pTaggedElement) {
+ return 0;
+ }
+ CFX_ByteStringC owner = GetAttrOwner(attr_type);
+ FX_FLOAT default_value = GetDefaultFloatValue(attr_type);
+ CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+ FX_FLOAT f = m_pTaggedElement->GetNumber(owner, AttrName, default_value, IsInheritable(attr_type), index);
+ if(attr_type == LayoutWidth && !f) {
+ f = m_pTaggedElement->GetNumber("Table", AttrName, default_value, IsInheritable(attr_type), index);
+ }
+ return f;
+}
+FX_COLORREF CPDF_LayoutElement::GetColorAttr(LayoutAttr attr_type, int index)
+{
+ if(!m_pTaggedElement) {
+ return 0;
+ }
+ CFX_ByteStringC owner = GetAttrOwner(attr_type);
+ FX_COLORREF default_value = GetDefaultColorValue(attr_type);
+ CFX_ByteStringC AttrName = ConvertLayoutAttr(attr_type);
+ FX_ARGB f = m_pTaggedElement->GetColor(owner, AttrName, default_value, IsInheritable(attr_type), index);
+ return f;
+}
+FX_FLOAT CPDF_LayoutElement::GetDefaultFloatValue(LayoutAttr attr_type)
+{
+ switch(attr_type) {
+ case LayoutColumnCount:
+ return 1;
+ case LayoutRowSpan:
+ return 1;
+ case LayoutColSpan:
+ return 1;
+ default:
+ return 0;
+ }
+}
+FX_COLORREF CPDF_LayoutElement::GetDefaultColorValue(LayoutAttr attr_type)
+{
+ return -1;
+}
+CFX_ByteStringC CPDF_LayoutElement::GetDefaultNameValue(LayoutAttr attr_type)
+{
+ switch(attr_type) {
+ case LayoutPlacement:
+ return "Inline";
+ case LayoutWritingMode:
+ return "LrTb";
+ case LayoutBorderStyle:
+ return "None";
+ case LayoutTextAlign:
+ return "Start";
+ case LayoutBlockAlign:
+ return "Before";
+ case LayoutInlineAlign:
+ return "Start";
+ case LayoutTBorderStyle:
+ return "None";
+ case LayoutTextDecorationType:
+ return "None";
+ case LayoutRubyAlign:
+ return "Distribute";
+ case LayoutRubyPosition:
+ return "Before";
+ case LayoutGlyphOrientationVertical:
+ return "Auto";
+ case LayoutListNumbering:
+ return "None";
+ case LayoutFieldRole:
+ return "None";
+ default:
+ return "";
+ }
+}
+FX_BOOL CPDF_LayoutElement::IsInheritable(LayoutAttr type)
+{
+ switch(type) {
+ case LayoutWritingMode:
+ case LayoutTextAlign:
+ case LayoutBlockAlign:
+ case LayoutInlineAlign:
+ case LayoutLineHeight:
+ case LayoutGlyphOrientationVertical:
+ case LayoutRubyAlign:
+ case LayoutRubyPosition:
+ case LayoutBorderThickness:
+ case LayoutStartIndent:
+ case LayoutEndIndent:
+ case LayoutTextIndent:
+ case LayoutTPadding:
+ case LayoutTextDecorationThickness:
+ case LayoutBorderColor:
+ case LayoutColor:
+ case LayoutTextDecorationColor:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+int CPDF_LayoutElement::CountChildren()
+{
+ return m_ChildArray.GetSize();
+}
+IPDF_LayoutElement* CPDF_LayoutElement::GetChild(int index)
+{
+ return (IPDF_LayoutElement*)m_ChildArray.GetAt(index);
+}
+IPDF_LayoutElement* CPDF_LayoutElement::GetParent()
+{
+ return m_pParentElement;
+}
+int CPDF_LayoutElement::CountObjects()
+{
+ if(m_pTaggedElement == NULL) {
+ return 0;
+ }
+ CFX_PtrArray* pObj = &m_ObjArray;
+ int size = pObj->GetSize();
+ return size;
+}
+CPDF_PageObject* CPDF_LayoutElement::GetObject(int index)
+{
+ if(m_pTaggedElement == NULL) {
+ return NULL;
+ }
+ CFX_PtrArray *pObj = &m_ObjArray;
+ int size = pObj->GetSize();
+ if(index < size) {
+ return (CPDF_PageObject*)pObj->GetAt(index);
+ }
+ return NULL;
+}
+FX_BOOL CPDF_LayoutElement::AddObject(CPDF_PageObject* pObj)
+{
+ return m_ObjArray.Add(pObj);
+}
+IPDF_LayoutProvider* IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(CPDF_PageObjects* pPage)
+{
+ if(pPage == NULL) {
+ return NULL;
+ }
+ CPDF_LayoutProvider_TaggedPDF* pProvider = FX_NEW CPDF_LayoutProvider_TaggedPDF;
+ if (!pProvider) {
+ return NULL;
+ }
+ pProvider->Init(pPage);
+ return pProvider;
+}
+CPDF_LayoutProvider_TaggedPDF::CPDF_LayoutProvider_TaggedPDF()
+{
+ m_pPause = NULL;
+ m_pRoot = NULL;
+ m_pPageTree = NULL;
+ m_pCurTaggedElement = NULL;
+}
+CPDF_LayoutProvider_TaggedPDF::~CPDF_LayoutProvider_TaggedPDF()
+{
+ m_pCurTaggedElement = NULL;
+ m_pPause = NULL;
+ if(m_pRoot) {
+ delete m_pRoot;
+ }
+ m_pRoot = NULL;
+ if(m_pPageTree) {
+ delete m_pPageTree;
+ }
+ m_pPageTree = NULL;
+}
+void CPDF_LayoutProvider_TaggedPDF::ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement)
+{
+ if(!pTaggedElement) {
+ return;
+ }
+ if(!pParent) {
+ m_Status = LayoutError;
+ return;
+ }
+ CPDF_LayoutElement* pElement = FX_NEW CPDF_LayoutElement;
+ if (!pElement) {
+ m_Status = LayoutError;
+ return;
+ }
+ pElement->m_pParentElement = pParent;
+ pElement->m_pTaggedElement = pTaggedElement;
+ pParent->m_ChildArray.Add(pElement);
+ int count = pTaggedElement->CountKids();
+ for(int i = 0; i < count; i++) {
+ CPDF_StructKid Kid = pTaggedElement->GetKid(i);
+ switch(Kid.m_Type) {
+ case CPDF_StructKid::Element: {
+ ProcessElement(pElement, Kid.m_Element.m_pElement);
+ if(m_Status != LayoutReady) {
+ return ;
+ }
+ }
+ break;
+ case CPDF_StructKid::PageContent: {
+ int count = m_pPage->CountObjects();
+ FX_POSITION pos = m_pPage->GetFirstObjectPosition();
+ if(!pos) {
+ m_Status = LayoutError;
+ return ;
+ }
+ while (pos) {
+ CPDF_PageObject* pObj = m_pPage->GetNextObject(pos);
+ int pbjMCID = pObj->m_ContentMark.GetMCID();
+ if((FX_DWORD)(pObj->m_ContentMark.GetMCID()) == Kid.m_PageContent.m_ContentId) {
+ pElement->AddObject(pObj);
+ }
+ }
+ }
+ break;
+ case CPDF_StructKid::StreamContent:
+ case CPDF_StructKid::Object:
+ default:
+ break;
+ }
+ }
+}
+LayoutStatus CPDF_LayoutProvider_TaggedPDF::StartLoad(IFX_Pause* pPause)
+{
+ m_pPause = pPause;
+ if(m_pPage->m_pDocument && m_pPage->m_pFormDict) {
+ m_pPageTree = CPDF_StructTree::LoadPage(m_pPage->m_pDocument, m_pPage->m_pFormDict);
+ }
+ if(!m_pPageTree) {
+ m_Status = LayoutError;
+ return LayoutError;
+ }
+ int count = m_pPageTree->CountTopElements();
+ if(count == 0) {
+ m_Status = LayoutError;
+ return LayoutError;
+ }
+ m_pRoot = FX_NEW CPDF_LayoutElement;
+ if (!m_pRoot) {
+ m_Status = LayoutError;
+ return LayoutError;
+ }
+ for(int i = 0; i < count; i++) {
+ CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);
+ if(pElement) {
+ ProcessElement(m_pRoot, pElement);
+ if(m_Status != LayoutReady) {
+ return m_Status;
+ }
+ }
+ }
+ m_pCurTaggedElement = NULL;
+ m_Status = LayoutFinished;
+ return LayoutFinished;
+}
+LayoutStatus CPDF_LayoutProvider_TaggedPDF::Continue()
+{
+ if(!m_pCurTaggedElement) {
+ return LayoutError;
+ }
+ if(m_Status != LayoutToBeContinued) {
+ return LayoutError;
+ }
+ m_Status = LayoutReady;
+ int count = m_pPageTree->CountTopElements();
+ for(int i = 0; i < count; i++) {
+ CPDF_StructElement* pElement = m_pPageTree->GetTopElement(i);
+ if(pElement) {
+ ProcessElement(m_pRoot, pElement);
+ if(m_Status != LayoutReady) {
+ return m_Status;
+ }
+ }
+ }
+ m_pCurTaggedElement = NULL;
+ m_Status = LayoutFinished;
+ return LayoutFinished;
+}
+int CPDF_LayoutProvider_TaggedPDF::GetPosition()
+{
+ if(m_TopElementIndex == 0) {
+ return 0;
+ }
+ int count = m_pPageTree->CountTopElements();
+ return m_TopElementIndex / count * 100;
+}
diff --git a/core/src/reflow/layoutprovider_taggedpdf.h b/core/src/reflow/layoutprovider_taggedpdf.h
new file mode 100644
index 0000000000..b2c8947a82
--- /dev/null
+++ b/core/src/reflow/layoutprovider_taggedpdf.h
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef LayoutProvider_TaggedPDF_H
+#define LayoutProvider_TaggedPDF_H
+#include "../../include/reflow/reflowengine.h"
+class CPDF_LayoutElement : public IPDF_LayoutElement, public CFX_Object
+{
+public:
+ CPDF_LayoutElement();
+ ~CPDF_LayoutElement();
+
+ LayoutType GetType();
+ void GetRect(CFX_FloatRect& rcRect) {};
+
+ int CountAttrValues(LayoutAttr attr_type);
+
+ LayoutEnum GetEnumAttr(LayoutAttr attr_type, int index);
+ FX_FLOAT GetNumberAttr(LayoutAttr attr_type, int index);
+ FX_COLORREF GetColorAttr(LayoutAttr attr_type, int index);
+
+ int CountChildren();
+
+ IPDF_LayoutElement* GetChild(int index);
+
+ IPDF_LayoutElement* GetParent();
+
+ int CountObjects();
+ CPDF_PageObject* GetObject(int index);
+ FX_BOOL AddObject(CPDF_PageObject* pObj);
+ CPDF_StructElement* m_pTaggedElement;
+ CPDF_LayoutElement* m_pParentElement;
+ CFX_PtrArray m_ChildArray;
+ LayoutType ConvertLayoutType(FX_BSTR name);
+ CFX_ByteStringC ConvertLayoutType(LayoutType type);
+ CFX_ByteStringC ConvertLayoutAttr(LayoutAttr attr);
+ LayoutEnum ConvertLayoutEnum(CFX_ByteStringC Enum);
+
+protected:
+ FX_BOOL IsInheritable(LayoutAttr attr_type);
+ CFX_ByteStringC GetAttrOwner(LayoutAttr attr_type);
+ CFX_ByteStringC GetDefaultNameValue(LayoutAttr attr_type);
+ FX_FLOAT GetDefaultFloatValue(LayoutAttr attr_type);
+ FX_COLORREF GetDefaultColorValue(LayoutAttr attr_type);
+ CFX_PtrArray m_ObjArray;
+};
+class CPDF_LayoutProvider_TaggedPDF : public IPDF_LayoutProvider, public CFX_Object
+{
+public:
+ CPDF_LayoutProvider_TaggedPDF();
+ ~CPDF_LayoutProvider_TaggedPDF();
+ void SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE style) {};
+
+ void Init(CPDF_PageObjects* pPage)
+ {
+ m_pPage = pPage;
+ m_Status = LayoutReady;
+ };
+
+ LayoutStatus StartLoad(IFX_Pause* pPause = NULL);
+ LayoutStatus Continue();
+ int GetPosition();
+
+ IPDF_LayoutElement* GetRoot()
+ {
+ return m_pRoot;
+ };
+
+protected:
+ void ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement);
+ LayoutStatus m_Status;
+ CPDF_StructElement* m_pCurTaggedElement;
+ CPDF_LayoutElement* m_pRoot;
+ IFX_Pause* m_pPause;
+ CPDF_PageObjects* m_pPage;
+ CPDF_StructTree* m_pPageTree;
+ int m_TopElementIndex;
+};
+#endif
diff --git a/core/src/reflow/reflowedpage.cpp b/core/src/reflow/reflowedpage.cpp
new file mode 100644
index 0000000000..11baef8718
--- /dev/null
+++ b/core/src/reflow/reflowedpage.cpp
@@ -0,0 +1,622 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+CPDF_ProgressiveReflowPageParser::CPDF_ProgressiveReflowPageParser()
+{
+ m_nObjProcessed = 0;
+ m_pReflowEngine = NULL;
+ m_pProvider = NULL;
+}
+CPDF_ProgressiveReflowPageParser::~CPDF_ProgressiveReflowPageParser()
+{
+ if(m_pProvider) {
+ delete m_pProvider;
+ }
+ m_pProvider = NULL;
+ if(m_pReflowEngine) {
+ delete m_pReflowEngine;
+ }
+ m_pReflowEngine = NULL;
+}
+void CPDF_ProgressiveReflowPageParser::Init()
+{
+ m_Status = Ready;
+}
+CPDF_ReflowedPage::CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool)
+{
+ m_PageWidth = 0;
+ m_PageHeight = 0;
+ m_bWaiting = TRUE;
+ if(pMemoryPool) {
+ m_pMemoryPool = pMemoryPool;
+ m_bCreateMemoryPool = FALSE;
+ } else {
+ m_pMemoryPool = FX_NEW CFX_GrowOnlyPool;
+ m_bCreateMemoryPool = TRUE;
+ }
+ m_pCharState = FX_NEW CRF_CharStateArray(10);
+ m_pReflowed = FX_NEW CRF_DataPtrArray(500);
+ m_pPageInfos = NULL;
+}
+CPDF_ReflowedPage::~CPDF_ReflowedPage()
+{
+ if (m_pReflowed) {
+ for(int i = 0; i < m_pReflowed->GetSize(); i++) {
+ CRF_Data* pData = (*m_pReflowed)[i];
+ if(pData->m_Type == CRF_Data::Image) {
+ delete ((CRF_ImageData*)pData)->m_pBitmap;
+ }
+ }
+ m_pReflowed->RemoveAll();
+ delete m_pReflowed;
+ }
+ m_pReflowed = NULL;
+ if (m_pCharState) {
+ m_pCharState->RemoveAll();
+ delete m_pCharState;
+ }
+ m_pCharState = NULL;
+ if(m_bCreateMemoryPool && m_pMemoryPool) {
+ m_pMemoryPool->FreeAll();
+ }
+ if (m_pMemoryPool) {
+ delete m_pMemoryPool;
+ }
+ m_pMemoryPool = NULL;
+ m_pPDFPage = NULL;
+ if (m_pPageInfos) {
+ ReleasePageObjsMemberShip();
+ }
+}
+FX_BOOL CPDF_ReflowedPage::RetainPageObjsMemberShip()
+{
+ if (NULL == m_pPDFPage) {
+ return FALSE;
+ }
+ if (NULL == m_pPageInfos) {
+ m_pPageInfos = FX_NEW CFX_MapPtrToPtr();
+ } else {
+ return TRUE;
+ }
+ FX_POSITION pos = m_pPDFPage->GetFirstObjectPosition();
+ if (!pos) {
+ return FALSE;
+ }
+ CPDF_PageObject* pPageObj = NULL;
+ while (pos) {
+ pPageObj = m_pPDFPage->GetNextObject(pos);
+ MarkPageObjMemberShip(pPageObj, NULL);
+ pPageObj = NULL;
+ }
+ return TRUE;
+}
+void CPDF_ReflowedPage::MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent)
+{
+ if (NULL == m_pPageInfos) {
+ return;
+ }
+ CRF_PageInfo* pPageInfo = FX_NEW CRF_PageInfo(pObj, pParent);
+ if (NULL == pPageInfo) {
+ return;
+ }
+ m_pPageInfos->SetAt(pObj, pPageInfo);
+ if (PDFPAGE_FORM != pObj->m_Type) {
+ return;
+ }
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj;
+ FX_POSITION pos;
+ pos = pFormObj->m_pForm->GetFirstObjectPosition();
+ if (!pos) {
+ return;
+ }
+ CPDF_PageObject* pPageObj = NULL;
+ while (pos) {
+ pPageObj = pFormObj->m_pForm->GetNextObject(pos);
+ MarkPageObjMemberShip(pPageObj, pPageInfo);
+ pPageObj = NULL;
+ }
+}
+void CPDF_ReflowedPage::ReleasePageObjsMemberShip()
+{
+ if (NULL == m_pPageInfos) {
+ return;
+ }
+ CPDF_PageObject* pPageObj = NULL;
+ CRF_PageInfo* pPageInfo = NULL;
+ FX_POSITION pos = m_pPageInfos->GetStartPosition();
+ while (pos) {
+ m_pPageInfos->GetNextAssoc(pos, (void*&)pPageObj, (void*&)pPageInfo);
+ delete pPageInfo;
+ }
+ m_pPageInfos->RemoveAll();
+ delete m_pPageInfos;
+ m_pPageInfos = NULL;
+}
+CPDF_Dictionary* CPDF_ReflowedPage::GetFormResDict(CPDF_PageObject* pObj)
+{
+ if (NULL == m_pPageInfos) {
+ return NULL;
+ }
+ if (FALSE == RetainPageObjsMemberShip()) {
+ return NULL;
+ }
+ CRF_PageInfo* pPageInfo = (CRF_PageInfo*)m_pPageInfos->GetValueAt(pObj);
+ if (NULL == pPageInfo) {
+ return NULL;
+ }
+ return pPageInfo->GetFormDict();
+}
+void CPDF_ReflowedPage::GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix)
+{
+ CFX_AffineMatrix display_matrix;
+ if(m_PageHeight == 0) {
+ matrix.Set(1, 0, 0, -1, 0, 0);
+ return;
+ }
+ FX_INT32 x0, y0, x1, y1, x2, y2;
+ iRotate %= 4;
+ switch (iRotate) {
+ case 0:
+ x0 = xPos;
+ y0 = yPos;
+ x1 = xPos;
+ y1 = yPos + ySize;
+ x2 = xPos + xSize;
+ y2 = yPos;
+ break;
+ case 3:
+ x0 = xPos;
+ y0 = ySize + yPos;
+ x1 = xPos + xSize;
+ y1 = yPos + ySize;
+ x2 = xPos;
+ y2 = yPos;
+ break;
+ case 2:
+ x0 = xSize + xPos;
+ y0 = ySize + yPos;
+ x1 = xSize + xPos ;
+ y1 = yPos;
+ x2 = xPos;
+ y2 = ySize + yPos;
+ break;
+ case 1:
+ x0 = xPos + xSize;
+ y0 = yPos;
+ x1 = xPos;
+ y1 = yPos;
+ x2 = xPos + xSize;
+ y2 = yPos + ySize;
+ break;
+ }
+ display_matrix.Set(FXSYS_Div((FX_FLOAT)(x2 - x0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(y2 - y0), m_PageWidth),
+ FXSYS_Div((FX_FLOAT)(x1 - x0), m_PageHeight),
+ FXSYS_Div((FX_FLOAT)(y1 - y0), m_PageHeight),
+ (FX_FLOAT)(x0), (FX_FLOAT)(y0));
+ matrix.Set(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
+ matrix.Concat(display_matrix);
+ return;
+}
+FX_FLOAT CPDF_ReflowedPage::GetPageHeight()
+{
+ return m_PageHeight;
+}
+void CPDF_ReflowedPage::FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str)
+{
+ if (NULL == m_pReflowed) {
+ return;
+ }
+ CFX_AffineMatrix revMatrix;
+ revMatrix.SetReverse(matrix);
+ FX_FLOAT x1, y1;
+ revMatrix.Transform((float)x, (float)y, x1, y1);
+ int count = m_pReflowed->GetSize();
+ FX_FLOAT dx = 1000, dy = 1000;
+ FX_INT32 pos = 0;
+ FX_INT32 i;
+ for(i = 0; i < count; i++) {
+ CRF_Data* pData = (*m_pReflowed)[i];
+ FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);
+ if(FXSYS_fabs(tempdy - dy) < 1) {
+ continue;
+ }
+ CFX_FloatRect rect (0, pData->m_PosY + pData->m_Height, this->m_PageWidth, pData->m_PosY);
+ if(rect.Contains(x1, y1)) {
+ pos = i;
+ dx = 0;
+ dy = 0;
+ break;
+ } else if(tempdy < dy) {
+ dy = tempdy;
+ dx = FXSYS_fabs(pData->m_PosX - x1);
+ pos = i;
+ } else if (tempdy == dy) {
+ FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);
+ if(tempdx < dx) {
+ dx = tempdx;
+ pos = i;
+ }
+ } else if (tempdy > dy) {
+ break;
+ }
+ }
+ if(dx != 0 || dy != 0) {
+ count = count < (pos + 10) ? count : (pos + 10);
+ for(i = 0 > (pos - 10) ? 0 : (pos - 10); i < count; i++) {
+ CRF_Data* pData = (*m_pReflowed)[i];
+ FX_FLOAT tempdy = FXSYS_fabs(pData->m_PosY - y1);
+ if(tempdy < dy) {
+ dy = tempdy;
+ dx = FXSYS_fabs(pData->m_PosX - x1);
+ pos = i;
+ } else if (tempdy == dy) {
+ FX_FLOAT tempdx = FXSYS_fabs(pData->m_PosX - x1);
+ if(tempdx < dx) {
+ dx = tempdx;
+ pos = i;
+ }
+ }
+ }
+ }
+ str.Format("%d", pos);
+}
+FX_BOOL CPDF_ReflowedPage::FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y)
+{
+ if (NULL == m_pReflowed) {
+ return FALSE;
+ }
+ FX_INT32 pos = FXSYS_atoi(str);
+ if(pos < 0 || pos >= m_pReflowed->GetSize()) {
+ return FALSE;
+ }
+ CRF_Data* pData = (*m_pReflowed)[pos];
+ FX_FLOAT x1, y1;
+ matrix.Transform(pData->m_PosX, pData->m_PosY + pData->m_Height, x1, y1);
+ x = (int)x1;
+ y = (int)y1;
+ return TRUE;
+}
+int CPDF_ProgressiveReflowPageParser::GetPosition()
+{
+ if(!m_pProvider) {
+ return 0;
+ }
+ if(!m_pReflowEngine) {
+ return m_pProvider->GetPosition() / 2;
+ }
+ return m_pProvider->GetPosition() / 2 + m_pReflowEngine->GetPosition() / 2;
+}
+void CPDF_ProgressiveReflowPageParser::Continue(IFX_Pause* pPause)
+{
+ if (NULL == m_pReflowPage) {
+ return;
+ }
+ if(m_Status != ToBeContinued) {
+ return;
+ }
+ m_pPause = pPause;
+ if(m_pReflowEngine) {
+ if(m_pReflowEngine->Continue() != LayoutToBeContinued) {
+ m_Status = Done;
+ }
+ } else {
+ if(m_pProvider->Continue() == LayoutFinished) {
+ m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(m_TopIndent, m_ReflowedWidth, m_fScreenHeight, m_pReflowPage, m_flags, m_ParseStyle.m_LineSpace);
+ CFX_AffineMatrix matrix;
+ m_pPDFPage->GetDisplayMatrix(matrix, 0, 0, (int)(m_pPDFPage->GetPageWidth()), (int)(m_pPDFPage->GetPageHeight()), 0);
+ if(m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), m_pPause, &matrix) != LayoutToBeContinued) {
+ m_Status = Done;
+ }
+ }
+ }
+ if(m_TopIndent && m_Status == Done) {
+ m_pReflowPage->m_PageHeight -= m_TopIndent;
+ }
+}
+void CPDF_ProgressiveReflowPageParser::Clear()
+{
+ this->Init();
+ return;
+}
+FX_BOOL IPDF_ProgressiveReflowPageParser::IsTaggedPage(CPDF_PageObjects*pPage)
+{
+ if(!pPage) {
+ return FALSE;
+ }
+ CPDF_StructTree* pPageTree = CPDF_StructTree::LoadPage(pPage->m_pDocument, pPage->m_pFormDict);
+ if(pPageTree) {
+ int count = pPageTree->CountTopElements();
+ if(count) {
+ for(int i = 0; i < count; i++) {
+ CPDF_StructElement* pElm = pPageTree->GetTopElement(i);
+ if(pElm) {
+ delete pPageTree;
+ pPageTree = NULL;
+ return TRUE;
+ }
+ }
+ }
+ delete pPageTree;
+ pPageTree = NULL;
+ return FALSE;
+ }
+ return FALSE;
+}
+void CPDF_ProgressiveReflowPageParser::Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT topIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags)
+{
+ if (NULL == pReflowPage) {
+ m_Status = Failed;
+ return;
+ }
+ m_flags = flags;
+ m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;
+ m_pReflowPage->m_pPDFPage = pPage;
+ m_pReflowPage->ReleasePageObjsMemberShip();
+ m_pPDFPage = pPage;
+ m_TopIndent = topIndent;
+ m_pPause = pPause;
+ m_fScreenHeight = fHeight;
+ m_ReflowedWidth = fWidth;
+ m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_TaggedPDF(m_pPDFPage);
+ LayoutStatus status = m_pProvider->StartLoad(pPause);
+ if(status == LayoutError) {
+ delete m_pProvider;
+ m_pProvider = IPDF_LayoutProvider::Create_LayoutProvider_AutoReflow(m_pPDFPage, m_flags & RF_PARSER_READERORDER);
+ if (NULL == m_pProvider) {
+ m_Status = Failed;
+ return;
+ }
+ status = m_pProvider->StartLoad(pPause);
+ }
+ if(status == LayoutError) {
+ delete m_pProvider;
+ m_pProvider = NULL;
+ m_Status = Failed;
+ return;
+ }
+ if(status == LayoutToBeContinued) {
+ m_Status = ToBeContinued;
+ } else if (status == LayoutFinished) {
+ m_pReflowEngine = IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(topIndent, fWidth, fHeight, pReflowPage, m_flags, m_ParseStyle.m_LineSpace);
+ if(NULL == m_pReflowEngine) {
+ delete m_pProvider;
+ m_pProvider = NULL;
+ m_Status = Failed;
+ return;
+ }
+ CFX_AffineMatrix matrix;
+ pPage->GetDisplayMatrix(matrix, 0, 0, (int)(pPage->GetPageWidth()), (int)(pPage->GetPageHeight()), 0);
+ CFX_AffineMatrix matrix1 = pPage->GetPageMatrix();
+ if((status = m_pReflowEngine->StartProcess(m_pProvider->GetRoot(), pPause, &matrix)) != LayoutToBeContinued) {
+ delete m_pReflowEngine;
+ m_pReflowEngine = NULL;
+ m_Status = Done;
+ } else {
+ m_Status = ToBeContinued;
+ }
+ }
+ if(status != LayoutToBeContinued) {
+ delete m_pProvider;
+ m_pProvider = NULL;
+ }
+ if(m_TopIndent && m_Status == Done) {
+ m_pReflowPage->m_PageHeight -= m_TopIndent;
+ }
+ return;
+}
+CPDF_ProgressiveReflowPageRender::~CPDF_ProgressiveReflowPageRender()
+{
+ if(m_pDisplayMatrix) {
+ delete m_pDisplayMatrix;
+ }
+ m_pDisplayMatrix = NULL;
+}
+CPDF_ProgressiveReflowPageRender::CPDF_ProgressiveReflowPageRender()
+{
+ m_Status = Ready;
+ m_pReflowPage = NULL;
+ m_pDisplayMatrix = NULL;
+ m_CurrNum = 0;
+ m_pFontEncoding = NULL;
+ m_DisplayColor = -1;
+}
+static FX_FLOAT _CIDTransformToFloat(FX_BYTE ch)
+{
+ if (ch < 128) {
+ return ch * 1.0f / 127;
+ }
+ return (-255 + ch) * 1.0f / 127;
+}
+int CPDF_ProgressiveReflowPageRender::GetPosition()
+{
+ if(m_CurrNum == 0 || NULL == m_pReflowPage) {
+ return 0;
+ }
+ int size = m_pReflowPage->m_pReflowed->GetSize();
+ if(size == 0 || m_CurrNum >= size) {
+ return 100;
+ }
+ return (int)(m_CurrNum * 100 / size);
+}
+void CPDF_ProgressiveReflowPageRender::Display(IFX_Pause* pPause)
+{
+ if (NULL == m_pReflowPage) {
+ m_Status = Done;
+ return;
+ }
+ FX_RECT clipBox = m_pFXDevice->GetClipBox();
+ int size = m_pReflowPage->m_pReflowed->GetSize();
+ if (size < 1 || NULL == m_pDisplayMatrix) {
+ m_Status = Done;
+ return;
+ }
+ for(int i = m_CurrNum; i < size; i++) {
+ CRF_Data* pData = (*m_pReflowPage->m_pReflowed)[i];
+ if(!pData) {
+ continue;
+ }
+ CFX_FloatRect rect (pData->m_PosX, pData->m_PosY + pData->m_Height, pData->m_PosX + pData->m_Width, pData->m_PosY);
+ m_pDisplayMatrix->TransformRect(rect);
+ if(rect.left > clipBox.right || rect.right < clipBox.left || rect.bottom > clipBox.bottom || rect.top < clipBox.top) {
+ continue;
+ }
+ if(pData->GetType() == CRF_Data::Text) {
+ CRF_CharData* pCharData = (CRF_CharData*)pData;
+ CPDF_Font* pPDFFont = pCharData->m_pCharState->m_pFont;
+ if(pPDFFont->GetFontType() == PDFFONT_TYPE3) {
+ continue;
+ }
+ FX_FLOAT x = pData->m_PosX, y = pData->m_PosY - pCharData->m_pCharState->m_fDescent;
+ FXTEXT_CHARPOS charpos ;
+ charpos.m_GlyphIndex = pPDFFont->GlyphFromCharCode(pCharData->m_CharCode);
+ charpos.m_FontCharWidth = pPDFFont->m_Font.GetGlyphWidth(charpos.m_GlyphIndex);
+ charpos.m_OriginX = x;
+ charpos.m_OriginY = y;
+ FX_FLOAT charW = pData->m_Width * 1000 / pData->m_Height;
+ if(charW != charpos.m_FontCharWidth) {
+ charpos.m_bGlyphAdjust = TRUE;
+ charpos.m_AdjustMatrix[0] = charW / charpos.m_FontCharWidth;
+ charpos.m_AdjustMatrix[1] = 0;
+ charpos.m_AdjustMatrix[2] = 0;
+ charpos.m_AdjustMatrix[3] = 1;
+ } else {
+ charpos.m_bGlyphAdjust = FALSE;
+ }
+ FX_BOOL bRet = FALSE;
+ if(m_DisplayColor == -1)
+ bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),
+ NULL, pCharData->m_pCharState->m_fFontSize,
+ m_pDisplayMatrix, pCharData->m_pCharState->m_Color + 0xff000000, FXTEXT_CLEARTYPE);
+ else
+ bRet = m_pFXDevice->DrawNormalText(1, &charpos, &(pPDFFont->m_Font),
+ NULL, pCharData->m_pCharState->m_fFontSize, m_pDisplayMatrix, m_DisplayColor, FXTEXT_CLEARTYPE);
+ } else if(pData->GetType() == CRF_Data::Image) {
+ CRF_ImageData* pImageData = (CRF_ImageData*)pData;
+ if(!pImageData->m_pBitmap) {
+ continue;
+ }
+ int left = 0, top = 0;
+ CFX_DIBitmap* pDiBmp = NULL;
+ CFX_DIBSource* pDispSource = pImageData->m_pBitmap;
+ if(pImageData->m_Matrix.d < 0) {
+ CFX_AffineMatrix matrix(pImageData->m_Matrix.a, 0, 0, -pImageData->m_Matrix.d, 0, 0);
+ int left, top;
+ pDiBmp = pImageData->m_pBitmap->TransformTo(&matrix, left, top);
+ pDispSource = pDiBmp;
+ }
+ if (NULL == pDispSource) {
+ continue;
+ }
+ if (pDispSource->GetFormat() == FXDIB_1bppMask || pDispSource->GetFormat() == FXDIB_8bppMask) {
+ m_pFXDevice->StretchBitMask(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5), 0xff000000);
+ } else {
+ m_pFXDevice->StretchDIBits(pDispSource, (int)(rect.left + 0.5), (int)(rect.bottom + 0.5), (int)(rect.Width() + 0.5), (int)(rect.Height() + 0.5));
+ }
+ if(m_pFXDevice->GetBitmap() && m_pFXDevice->GetBitmap()->GetFormat() == FXDIB_8bppRgb &&
+ m_pFXDevice->GetBitmap()->GetPalette() == NULL) {
+ int nPalette = 0;
+ switch(m_DitherBits) {
+ case 0:
+ nPalette = 0;
+ break;
+ case 1:
+ nPalette = 2;
+ break;
+ case 2:
+ nPalette = 4;
+ break;
+ case 3:
+ nPalette = 8;
+ break;
+ case 4:
+ nPalette = 16;
+ break;
+ case 5:
+ nPalette = 32;
+ break;
+ case 6:
+ nPalette = 64;
+ break;
+ case 7:
+ nPalette = 128;
+ break;
+ default:
+ nPalette = 256;
+ break;
+ }
+ if(nPalette >= 2) {
+ FX_ARGB * palette = FX_Alloc(FX_ARGB, nPalette);
+ nPalette --;
+ palette[0] = 0;
+ palette[nPalette] = 255;
+ FX_FLOAT Dither = (FX_FLOAT)255 / (nPalette);
+ for(int i = 1; i < nPalette; i++) {
+ palette[i] = (FX_ARGB)(Dither * i + 0.5);
+ }
+ FX_RECT tmpRect = rect.GetOutterRect();
+ m_pFXDevice->GetBitmap()->DitherFS(palette, nPalette + 1, &tmpRect);
+ FX_Free (palette);
+ }
+ }
+ if(pDiBmp) {
+ delete pDiBmp;
+ }
+ } else if(pData->GetType() == CRF_Data::Path) {
+ }
+ if(!(i % 10)) {
+ if(pPause && pPause->NeedToPauseNow()) {
+ i++;
+ m_CurrNum = i;
+ m_Status = ToBeContinued;
+ return;
+ }
+ }
+ }
+ m_CurrNum = size;
+ m_Status = Done;
+}
+void CPDF_ProgressiveReflowPageRender::Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits)
+{
+ if(!pReflowPage || !pDevice || !pMatrix) {
+ m_Status = Failed;
+ return;
+ }
+ m_DitherBits = DitherBits;
+ m_Status = Ready;
+ m_CurrNum = 0;
+ m_pReflowPage = (CPDF_ReflowedPage*)pReflowPage;
+ m_pFXDevice = pDevice;
+ if(NULL == m_pDisplayMatrix) {
+ m_pDisplayMatrix = FX_NEW CFX_AffineMatrix;
+ }
+ if (m_pDisplayMatrix) {
+ m_pDisplayMatrix->Copy(*pMatrix);
+ }
+ m_Status = ToBeContinued;
+ Display(pPause);
+}
+void CPDF_ProgressiveReflowPageRender::Continue(IFX_Pause* pPause)
+{
+ Display(pPause);
+}
+void CPDF_ProgressiveReflowPageRender::SetDisplayColor(FX_COLORREF color)
+{
+ m_DisplayColor = color;
+}
+void CPDF_ProgressiveReflowPageRender::Clear()
+{
+ if (m_pDisplayMatrix) {
+ delete m_pDisplayMatrix;
+ }
+ m_pDisplayMatrix = NULL;
+ m_pReflowPage = NULL;
+ m_pFXDevice = NULL;
+ m_CurrNum = 0;
+ m_Status = Ready;
+}
diff --git a/core/src/reflow/reflowedpage.h b/core/src/reflow/reflowedpage.h
new file mode 100644
index 0000000000..b76834132e
--- /dev/null
+++ b/core/src/reflow/reflowedpage.h
@@ -0,0 +1,372 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOWED_PAGE_H
+#define _REFLOWED_PAGE_H
+#include "../../include/reflow/reflowengine.h"
+#define GET_SIGNED(a) ( (a)>0 ? a/a : (a==0 ? 0 : -a/a) )
+class CRF_Data;
+class CRF_LineData;
+class CRF_CharData;
+class CRF_PathData;
+class CRF_ImageData;
+class CRF_Table;
+class CRF_AttrOperation;
+class CRF_OperationDate;
+class CPDF_ReflowedPage;
+class CPDF_Rect;
+class CFX_Object;
+typedef CFX_SegmentedArray<CRF_Data*> CRF_DataPtrArray;
+class CRF_CharState;
+typedef CFX_SegmentedArray<CRF_CharState> CRF_CharStateArray;
+#define SST_GE 1
+#define SST_BLSE 2
+#define SST_ILSE 3
+#define SST_IE 4
+class CPDF_LayoutProcessor_Reflow : public IPDF_LayoutProcessor, public CFX_Object
+{
+public:
+ CPDF_LayoutProcessor_Reflow();
+ ~CPDF_LayoutProcessor_Reflow();
+ void Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace);
+
+ LayoutStatus StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix = NULL);
+ LayoutStatus Continue();
+ int GetPosition();
+protected:
+ void FitPageMode();
+ void ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);
+ FX_FLOAT GetElmWidth(IPDF_LayoutElement* pElement);
+ CFX_FloatRect GetElmBBox(IPDF_LayoutElement* pElement);
+ void ProcessTable(FX_FLOAT dx);
+ void ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth);
+ void ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+ void ProcessTextObject(CPDF_TextObject *pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+ void ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth);
+ void ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix);
+ FX_INT32 LogicPreObj(CPDF_TextObject* pObj);
+ int ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix);
+ FX_WCHAR GetPreChar();
+ FX_BOOL IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
+ int GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const;
+ FX_BOOL IsCanBreakAfter(FX_DWORD unicode);
+ FX_BOOL IsCanBreakBefore(FX_DWORD unicode);
+ FX_INT32 GetElementTypes(LayoutType layoutType);
+ void CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pMatrix = NULL);
+ CRF_CharState* GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color);
+ FX_FLOAT ConverWidth(FX_FLOAT width);
+ void AddData2CurrLine(CRF_Data* pData);
+ void AddTemp2CurrLine(int begin, int count );
+ void Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData);
+ void Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count = 0);
+ FX_FLOAT GetDatasWidth( int beginPos, int endpos);
+ void UpdateCurrLine();
+ FX_BOOL FinishedCurrLine();
+ int m_flags;
+ CFX_AffineMatrix m_PDFMatrix;
+ LayoutStatus m_Status;
+ CPDF_TextObject* m_pPreObj;
+ CFX_AffineMatrix m_perMatrix;
+ IPDF_LayoutElement* m_pLayoutElement;
+ IPDF_LayoutElement* m_pRootElement;
+ FX_FLOAT m_CurrRefWidth;
+ IFX_Pause* m_pPause;
+ LayoutEnum m_CurrWritingMode;
+ CPDF_ReflowedPage* m_pReflowedPage;
+ FX_FLOAT m_fRefWidth;
+ FX_FLOAT m_TopIndent;
+ FX_FLOAT m_fLineSpace;
+ FX_FLOAT m_fScreenHeight;
+ FX_FLOAT m_fCurrMaxWidth;
+ FX_FLOAT m_fCurrLineWidth;
+ FX_FLOAT m_fCurrLineHeight;
+ CRF_DataPtrArray* m_pCurrLine;
+ CRF_DataPtrArray* m_pTempLine;
+ FX_BOOL m_bIllustration;
+ FX_FLOAT m_fLineHeight;
+ LayoutEnum m_TextAlign;
+ FX_FLOAT m_StartIndent;
+ CFX_ArrayTemplate<CRF_Table*> m_TableArray;
+ int m_PausePosition;
+};
+struct RF_TableCell {
+ int m_BeginPos;
+ int m_EndPos;
+ FX_FLOAT m_MaxWidth;
+ FX_FLOAT m_PosX;
+ FX_FLOAT m_PosY;
+ FX_FLOAT m_CellWidth;
+ FX_FLOAT m_CellHeight;
+ int m_RowSpan;
+ int m_ColSpan;
+ LayoutEnum m_BlockAlign;
+ LayoutEnum m_InlineAlign;
+};
+typedef CFX_ArrayTemplate<RF_TableCell*> CRF_TableCellArray;
+class CRF_Table : public CFX_Object
+{
+public:
+ CRF_Table()
+ {
+ m_TableWidth = 0;
+ m_nCol = 0;
+ }
+ CRF_TableCellArray m_pCellArray;
+ CFX_WordArray m_nCell;
+ int m_nCol;
+ FX_FLOAT m_TableWidth;
+ FX_FLOAT m_ReflowPageHeight;
+};
+class CRF_CharState : public CFX_Object
+{
+public:
+ CPDF_Font* m_pFont;
+ FX_ARGB m_Color;
+ FX_BOOL m_bVert;
+ FX_FLOAT m_fFontSize;
+ FX_FLOAT m_fAscent;
+ FX_FLOAT m_fDescent;
+
+ CPDF_TextObject* m_pTextObj;
+};
+class CRF_PageInfo : public CFX_Object
+{
+public:
+ CRF_PageInfo(CPDF_PageObject* pPageObj, CRF_PageInfo* pParent = NULL)
+ : m_pPageObj(pPageObj) , m_pParent(pParent)
+ {
+ }
+ CPDF_PageObject* GetPageObj()
+ {
+ return m_pPageObj;
+ }
+ CPDF_Dictionary* GetFormDict()
+ {
+ if (NULL == m_pParent) {
+ return NULL;
+ }
+ CPDF_PageObject* pParentObj = m_pParent->GetPageObj();
+ if (NULL == pParentObj || PDFPAGE_FORM != pParentObj->m_Type) {
+ return NULL;
+ }
+ return ((CPDF_FormObject*)pParentObj)->m_pForm->m_pResources;
+ }
+protected:
+ CPDF_PageObject* m_pPageObj;
+ CRF_PageInfo* m_pParent;
+};
+class CPDF_ReflowedPage : public IPDF_ReflowedPage, public CFX_PrivateData, public CFX_Object
+{
+public:
+
+ CPDF_ReflowedPage(CFX_GrowOnlyPool* pMemoryPool);
+ ~CPDF_ReflowedPage();
+ CFX_PrivateData* GetPrivateDataCtrl()
+ {
+ return this;
+ };
+ void GetDisplayMatrix(CFX_AffineMatrix& matrix, FX_INT32 xPos, FX_INT32 yPos, FX_INT32 xSize, FX_INT32 ySize, FX_INT32 iRotate, const CFX_AffineMatrix* pPageMatrix);
+
+ FX_FLOAT GetPageHeight() ;
+ FX_FLOAT GetPageWidth()
+ {
+ return m_PageWidth;
+ };
+ void FocusGetData(const CFX_AffineMatrix matrix, FX_INT32 x, FX_INT32 y, CFX_ByteString& str);
+ FX_BOOL FocusGetPosition(const CFX_AffineMatrix matrix, CFX_ByteString str, FX_INT32& x, FX_INT32& y);
+ CRF_DataPtrArray* m_pReflowed;
+ FX_FLOAT m_PageWidth;
+ FX_FLOAT m_PageHeight;
+ FX_BOOL m_bWaiting;
+ CRF_CharStateArray* m_pCharState;
+ CFX_GrowOnlyPool* m_pMemoryPool;
+ FX_BOOL m_bCreateMemoryPool;
+ CPDF_Page* m_pPDFPage;
+ FX_BOOL RetainPageObjsMemberShip();
+ void MarkPageObjMemberShip(CPDF_PageObject* pObj, CRF_PageInfo* pParent);
+ void ReleasePageObjsMemberShip();
+ CPDF_Dictionary* GetFormResDict(CPDF_PageObject* pObj);
+
+ CFX_MapPtrToPtr* m_pPageInfos;
+};
+class CPDF_ProgressiveReflowPageParser : public IPDF_ProgressiveReflowPageParser, public CFX_Object
+{
+public:
+ CPDF_ProgressiveReflowPageParser();
+ ~CPDF_ProgressiveReflowPageParser() ;
+ void Init();
+
+ ParseStatus GetStatus()
+ {
+ return m_Status;
+ };
+
+ void SetParserStyle(RF_ParseStyle style)
+ {
+ m_ParseStyle = style;
+ };
+ void Start(IPDF_ReflowedPage* pReflowPage, CPDF_Page* pPage, FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, IFX_Pause* pPause, int flags);
+ void Continue(IFX_Pause* pPause);
+ int GetPosition() ;
+
+ void Clear();
+ ParseStatus m_Status;
+protected:
+ RF_ParseStyle m_ParseStyle;
+ CPDF_Page* m_pPDFPage;
+ IFX_Pause* m_pPause;
+ CPDF_ReflowedPage* m_pReflowPage;
+ FX_FLOAT m_TopIndent;
+ FX_FLOAT m_ReflowedWidth;
+ FX_FLOAT m_fScreenHeight;
+ IPDF_LayoutProvider* m_pProvider;
+ IPDF_LayoutProcessor* m_pReflowEngine;
+ int m_nObjProcessed;
+ int m_flags;
+};
+class CPDF_ProgressiveReflowPageRender : public IPDF_ProgressiveReflowPageRender, public CFX_Object
+{
+public:
+ CPDF_ProgressiveReflowPageRender();
+ ~CPDF_ProgressiveReflowPageRender() ;
+
+ RenderStatus GetStatus()
+ {
+ return m_Status;
+ };
+
+
+ void SetDisplayColor(FX_COLORREF color);
+ void Start(IPDF_ReflowedPage* pReflowPage, CFX_RenderDevice* pDevice, const CFX_AffineMatrix* pMatrix, IFX_Pause* pPause, int DitherBits);
+ void Continue(IFX_Pause* pPause);
+ int GetPosition();
+
+
+ void Clear();
+protected:
+ void Display(IFX_Pause* pPause);
+ RenderStatus m_Status;
+ CPDF_ReflowedPage* m_pReflowPage;
+ CFX_AffineMatrix* m_pDisplayMatrix;
+ int m_CurrNum;
+ IFX_FontEncoding* m_pFontEncoding;
+ CFX_RenderDevice* m_pFXDevice;
+ int m_DitherBits;
+ FX_COLORREF m_DisplayColor;
+ typedef struct CRF_TextDataAtt {
+ CRF_TextDataAtt()
+ {
+ pFont = NULL;
+ fFontSize = 0.0f;
+ Color = 0;
+ }
+ CRF_TextDataAtt(CPDF_Font* font, FX_FLOAT fontSize, FX_ARGB color)
+ {
+ pFont = font;
+ fFontSize = fontSize;
+ Color = color;
+ }
+ CPDF_Font* pFont;
+ FX_FLOAT fFontSize;
+ FX_ARGB Color;
+ } CRF_TEXTDATAATT;
+ inline bool isTextDataAttSame(CRF_TEXTDATAATT data1, CRF_TEXTDATAATT data2)
+ {
+ if (data1.pFont != data2.pFont) {
+ return false;
+ }
+ if (data1.Color != data2.Color) {
+ return false;
+ }
+ if (fabs(data1.fFontSize - data2.fFontSize) > 0.0f) {
+ return false;
+ }
+ return true;
+ };
+};
+#define TYPE_UNKNOW 0
+#define TYPE_TEXT 1
+#define TYPE_PATH 2
+#define TYPE_IMAGE 3
+#define TYPE_LINE 4
+class CRF_Data : public CFX_Object
+{
+public:
+ typedef enum {Unknow, Text, Image, Path, Line, paragraph} RF_DataType;
+ CRF_Data()
+ {
+ m_Type = Unknow;
+ m_Width = 0;
+ m_PosY = 0;
+ m_PosX = 0;
+ m_Height = 0;
+ }
+ RF_DataType GetType()
+ {
+ return m_Type;
+ }
+ virtual ~CRF_Data() {}
+ RF_DataType m_Type;
+ FX_FLOAT m_PosX;
+ FX_FLOAT m_PosY;
+ FX_FLOAT m_Width;
+ FX_FLOAT m_Height;
+};
+class CRF_LineData : public CRF_Data
+{
+public:
+ CRF_LineData()
+ {
+ m_Type = Line;
+ }
+};
+class CRF_CharData : public CRF_Data
+{
+public:
+ CRF_CharData()
+ {
+ m_Type = Text;
+ m_CharCode = -1;
+ }
+ CRF_CharState* m_pCharState;
+ FX_DWORD m_CharCode;
+};
+class CRF_ImageData : public CRF_Data
+{
+public:
+ CRF_ImageData()
+ {
+ m_Type = Image;
+ m_pBitmap = NULL;
+ }
+ ~CRF_ImageData()
+ {
+ if(m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_pBitmap = NULL;
+ }
+ CFX_AffineMatrix m_Matrix;
+ CFX_DIBitmap* m_pBitmap;
+};
+class CRF_PathData : public CRF_Data
+{
+public:
+ CRF_PathData()
+ {
+ m_Type = Path;
+ m_bDecoration = FALSE;
+ }
+ ~CRF_PathData() {};
+ FX_BOOL m_bDecoration;
+ CPDF_Path m_pPathData;
+ CFX_AffineMatrix m_pPath2Device;
+ CPDF_GraphState m_pGraphState;
+ FX_ARGB m_fill_argb;
+ FX_ARGB m_stroke_argb;
+ int m_fill_mode;
+};
+#endif
diff --git a/core/src/reflow/reflowedtextpage.cpp b/core/src/reflow/reflowedtextpage.cpp
new file mode 100644
index 0000000000..a5ad0be948
--- /dev/null
+++ b/core/src/reflow/reflowedtextpage.cpp
@@ -0,0 +1,402 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "reflowedtextpage.h"
+IPDF_TextPage* IPDF_TextPage::CreateReflowTextPage(IPDF_ReflowedPage* pRefPage)
+{
+ return FX_NEW CRF_TextPage(pRefPage);
+}
+CRF_TextPage::CRF_TextPage(IPDF_ReflowedPage* pRefPage)
+{
+ m_pRefPage = (CPDF_ReflowedPage*)(pRefPage);
+ m_pDataList = NULL;
+ m_CountBSArray = NULL;
+}
+CRF_TextPage::~CRF_TextPage()
+{
+ if(m_pDataList) {
+ delete m_pDataList;
+ m_pDataList = NULL;
+ }
+ if(m_CountBSArray) {
+ delete m_CountBSArray;
+ m_CountBSArray = NULL;
+ }
+}
+FX_BOOL CRF_TextPage::ParseTextPage()
+{
+ if(!m_pRefPage) {
+ return FALSE;
+ }
+ int count = m_pRefPage->m_pReflowed->GetSize();
+ if(count < 500) {
+ m_pDataList = FX_NEW CRF_CharDataPtrArray(count);
+ } else {
+ m_pDataList = FX_NEW CRF_CharDataPtrArray(500);
+ }
+ if (NULL == m_pDataList) {
+ return FALSE;
+ }
+ for(int i = 0; i < count; i++) {
+ CRF_Data* pData = (*(m_pRefPage->m_pReflowed))[i];
+ if(pData->GetType() == CRF_Data::Text) {
+ m_pDataList->Add((CRF_CharData*)pData);
+ }
+ }
+ m_CountBSArray = FX_NEW CFX_CountBSINT32Array(20);
+ if(NULL == m_CountBSArray) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CRF_TextPage::IsParsered() const
+{
+ if(m_pDataList) {
+ return TRUE;
+ }
+ return FALSE;
+}
+int CRF_TextPage::CharIndexFromTextIndex(int TextIndex) const
+{
+ return TextIndex;
+}
+int CRF_TextPage::TextIndexFromCharIndex(int CharIndex) const
+{
+ return CharIndex;
+}
+
+int CRF_TextPage::CountChars() const
+{
+ if (NULL == m_pDataList) {
+ return -1;
+ }
+ return m_pDataList->GetSize();
+}
+void CRF_TextPage::GetCharInfo(int index, FPDF_CHAR_INFO & info) const
+{
+ if(index >= CountChars() || index < 0 || !m_pDataList) {
+ return;
+ }
+ CRF_CharData* pData = (*m_pDataList)[index];
+ FX_FLOAT ReltiveCorddDs = pData->m_pCharState->m_fDescent;
+ FX_FLOAT ReltiveCorddAs = pData->m_pCharState->m_fAscent;
+ info.m_Flag = CHAR_NORMAL;
+ info.m_pTextObj = pData->m_pCharState->m_pTextObj;
+ info.m_OriginX = pData->m_PosX;
+ info.m_OriginY = pData->m_PosY - ReltiveCorddDs;
+ info.m_FontSize = pData->m_pCharState->m_fFontSize;
+ CFX_FloatRect FloatRectTmp(pData->m_PosX, pData->m_PosY, pData->m_PosX + pData->m_Width, pData->m_PosY + ReltiveCorddAs - ReltiveCorddDs);
+ info.m_CharBox = FloatRectTmp;
+ CFX_WideString str = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode);
+ if(!str.IsEmpty()) {
+ info.m_Unicode = str.GetAt(0);
+ } else {
+ info.m_Unicode = -1;
+ }
+ info.m_Charcode = (FX_WCHAR)pData->m_CharCode;
+ info.m_Matrix = CFX_Matrix(1, 0, 0, 1, 0, 0);
+}
+extern FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, FX_FLOAT& interlow, FX_FLOAT& interhigh);
+inline FX_BOOL _IsInsameline(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
+{
+ if((rectA.top >= rectB.bottom && rectB.top >= rectA.bottom)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+inline FX_BOOL _IsIntersect(const CFX_FloatRect& rectA, const CFX_FloatRect& rectB)
+{
+ FX_FLOAT interlow = .0f, interhigh = .0f;
+ if(GetIntersection(rectA.bottom, rectA.top, rectB.bottom, rectB.top, interlow, interhigh)) {
+ if(GetIntersection(rectA.left, rectA.right, rectB.left, rectB.right, interlow, interhigh)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+void CRF_TextPage::GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const
+{
+ int indexlen = start + nCount;
+ FPDF_CHAR_INFO info;
+ FX_BOOL bstart = TRUE;
+ CFX_FloatRect recttmp;
+ int i;
+ for(i = start; i < indexlen; i++) {
+ GetCharInfo(i, info);
+ if(bstart) {
+ recttmp = info.m_CharBox;
+ bstart = FALSE;
+ } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+ recttmp.right = info.m_CharBox.right;
+ if(info.m_CharBox.top > recttmp.top) {
+ recttmp.top = info.m_CharBox.top;
+ }
+ if(info.m_CharBox.bottom < recttmp.bottom) {
+ recttmp.bottom = info.m_CharBox.bottom;
+ }
+ } else {
+ rectArray.Add(recttmp);
+ recttmp = info.m_CharBox;
+ }
+ }
+ rectArray.Add(recttmp);
+}
+inline FX_FLOAT _GetDistance(CFX_FloatRect floatRect, CPDF_Point point)
+{
+ if(floatRect.right < point.x && floatRect.bottom > point.y) {
+ return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(floatRect.bottom - point.y, 2));
+ }
+ if (floatRect.right < point.x && floatRect.top < point.y) {
+ return FXSYS_sqrt(FXSYS_pow(point.x - floatRect.right, 2) + FXSYS_pow(point.y - floatRect.top, 2));
+ }
+ if(floatRect.left > point.x && floatRect.bottom > point.y) {
+ return FXSYS_sqrt(FXSYS_pow(floatRect.bottom - point.y, 2) + FXSYS_pow(floatRect.left - point.x, 2));
+ }
+ if((floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) &&
+ (floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) && floatRect.bottom > point.y) {
+ return FXSYS_fabs(floatRect.bottom - point.y);
+ }
+ if(floatRect.left > point.x && (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f) &&
+ (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f)) {
+ return FXSYS_fabs(floatRect.left - point.x);
+ }
+ if(floatRect.left > point.x && floatRect.top < point.y) {
+ return FXSYS_sqrt(FXSYS_pow(floatRect.left - point.x, 2) + FXSYS_pow(point.y - floatRect.top, 2));
+ }
+ if ((floatRect.left < point.x || FXSYS_fabs(floatRect.left - point.x) <= 0.0001f) &&
+ (floatRect.right > point.x || FXSYS_fabs(floatRect.right - point.x) <= 0.0001f) && floatRect.top < point.y) {
+ return FXSYS_fabs(point.y - floatRect.top);
+ }
+ if(floatRect.right < point.x && (floatRect.top > point.y || FXSYS_fabs(floatRect.top - point.y) <= 0.0001f) &&
+ (floatRect.bottom < point.y || FXSYS_fabs(floatRect.bottom - point.y) <= 0.0001f)) {
+ return point.x - floatRect.right;
+ }
+ return .0f;
+}
+int CRF_TextPage::GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ int index = -1, i = 0, j = 0;
+ FPDF_CHAR_INFO info;
+ CFX_FloatRect rectTmp;
+ FX_FLOAT MinDistance = 1000, DistanceTmp = 0;
+ FX_FLOAT rect_bottom = point.x - xTorelance;
+ CFX_FloatRect TorelanceRect(rect_bottom <= 0 ? 0 : rect_bottom, point.y - yTorelance, point.x + xTorelance, point.y + yTorelance);
+ int count = CountChars();
+ for(i = 0; i < count; i++) {
+ GetCharInfo(i, info);
+ rectTmp = info.m_CharBox;
+ if(rectTmp.Contains(point.x, point.y)) {
+ index = i;
+ break;
+ } else if(_IsIntersect(rectTmp, TorelanceRect)) {
+ DistanceTmp = _GetDistance(rectTmp, point);
+ if(DistanceTmp < MinDistance) {
+ MinDistance = DistanceTmp;
+ index = i;
+ }
+ }
+ }
+ return index;
+}
+int CRF_TextPage::GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const
+{
+ int index = 0;
+ CPDF_Point point(x, y);
+ if((index = GetIndexAtPos(point, xTorelance, yTorelance)) < 0) {
+ return -1;
+ } else {
+ return index;
+ }
+}
+int CRF_TextPage::GetOrderByDirection(int index, int direction) const
+{
+ return -1;
+}
+CFX_WideString CRF_TextPage::GetTextByRect(CFX_FloatRect rect) const
+{
+ int count;
+ FPDF_CHAR_INFO info;
+ CFX_WideString str;
+ CFX_FloatRect Recttmp;
+ FX_BOOL bstart = TRUE;
+ count = CountChars();
+ if(rect.IsEmpty()) {
+ return L"";
+ }
+ for(int i = 0; i < count; i++) {
+ GetCharInfo(i, info);
+ if(_IsIntersect(rect, info.m_CharBox)) {
+ if(bstart) {
+ Recttmp = info.m_CharBox;
+ str += info.m_Unicode;
+ bstart = FALSE;
+ } else if(_IsInsameline(Recttmp, info.m_CharBox)) {
+ str += info.m_Unicode;
+ } else {
+ str += L"\r\n";
+ Recttmp = info.m_CharBox;
+ str += info.m_Unicode;
+ }
+ }
+ }
+ if(str.IsEmpty()) {
+ return L"";
+ } else {
+ return str;
+ }
+}
+void CRF_TextPage::GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const
+{
+ int count, i;
+ FX_BOOL bstart = TRUE;
+ FPDF_CHAR_INFO info;
+ CFX_FloatRect recttmp;
+ count = CountChars();
+ for(i = 0; i < count; i++) {
+ GetCharInfo(i, info);
+ if(_IsIntersect(rect, info.m_CharBox)) {
+ if(bstart) {
+ recttmp = info.m_CharBox;
+ bstart = FALSE;
+ } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+ recttmp.right = info.m_CharBox.right;
+ if(info.m_CharBox.top > recttmp.top) {
+ recttmp.top = info.m_CharBox.top;
+ }
+ if(info.m_CharBox.bottom < recttmp.bottom) {
+ recttmp.bottom = info.m_CharBox.bottom;
+ }
+ } else {
+ resRectArray.Add(recttmp);
+ recttmp = info.m_CharBox;
+ }
+ }
+ }
+ resRectArray.Add(recttmp);
+}
+int CRF_TextPage::CountRects(int start, int nCount)
+{
+ m_rectArray.RemoveAll();
+ GetRectArray(start, nCount, m_rectArray);
+ return m_rectArray.GetSize();
+}
+void CRF_TextPage::GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const
+{
+ if(m_rectArray.GetSize() <= rectIndex) {
+ return;
+ }
+ left = m_rectArray[rectIndex].left;
+ top = m_rectArray[rectIndex].top;
+ right = m_rectArray[rectIndex].right;
+ bottom = m_rectArray[rectIndex].bottom;
+}
+FX_BOOL CRF_TextPage::GetBaselineRotate(int rectIndex, int& Rotate)
+{
+ Rotate = 0;
+ return TRUE;
+}
+FX_BOOL CRF_TextPage::GetBaselineRotate(CFX_FloatRect rect, int& Rotate)
+{
+ Rotate = 0;
+ return TRUE;
+}
+int CRF_TextPage::CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains)
+{
+ if (!m_CountBSArray) {
+ return -1;
+ }
+ m_CountBSArray->RemoveAll();
+ CFX_FloatRect floatrect(left, bottom, right, top);
+ int totalcount, i, j = 0, counttmp = 0;
+ FX_BOOL bstart = TRUE;
+ FPDF_CHAR_INFO info;
+ CFX_FloatRect recttmp;
+ totalcount = CountChars();
+ for(i = 0; i < totalcount; i++) {
+ GetCharInfo(i, info);
+ if(_IsIntersect(floatrect, info.m_CharBox)) {
+ if(bstart) {
+ m_CountBSArray->Add(i);
+ counttmp = 1;
+ recttmp = info.m_CharBox;
+ bstart = FALSE;
+ } else if(_IsInsameline(recttmp, info.m_CharBox)) {
+ recttmp.right = info.m_CharBox.right;
+ if(info.m_CharBox.top > recttmp.top) {
+ recttmp.top = info.m_CharBox.top;
+ }
+ if(info.m_CharBox.bottom < recttmp.bottom) {
+ recttmp.bottom = info.m_CharBox.bottom;
+ }
+ counttmp ++;
+ } else {
+ m_CountBSArray->Add(counttmp);
+ m_CountBSArray->Add(i);
+ counttmp = 1;
+ j++;
+ recttmp = info.m_CharBox;
+ }
+ }
+ }
+ m_CountBSArray->Add(counttmp);
+ j++;
+ return j;
+}
+void CRF_TextPage::GetBoundedSegment(int index, int& start, int& count) const
+{
+ if (!m_CountBSArray) {
+ return;
+ }
+ if(m_CountBSArray->GetSize() <= index * 2) {
+ start = 0;
+ count = 0;
+ return;
+ }
+ start = *(int *)m_CountBSArray->GetAt(index * 2);
+ count = *(int *)m_CountBSArray->GetAt(index * 2 + 1);
+}
+
+int CRF_TextPage::GetWordBreak(int index, int direction) const
+{
+ return -1;
+}
+CFX_WideString CRF_TextPage::GetPageText(int start, int nCount ) const
+{
+ if(nCount == -1) {
+ nCount = CountChars();
+ start = 0;
+ } else if(nCount < 1) {
+ return L"";
+ } else if(start >= CountChars()) {
+ return L"";
+ }
+ int i, index = start + nCount;
+ FPDF_CHAR_INFO info;
+ CFX_WideString str;
+ CFX_FloatRect recttmp;
+ FX_BOOL bstart = TRUE;
+ for(i = start; i < index; i++) {
+ GetCharInfo(i, info);
+ if(bstart) {
+ recttmp = info.m_CharBox;
+ str += info.m_Unicode;
+ bstart = FALSE;
+ } else if (_IsInsameline(recttmp, info.m_CharBox)) {
+ str += info.m_Unicode;
+ } else {
+ str += L"\r\n";
+ recttmp = info.m_CharBox;
+ str += info.m_Unicode;
+ }
+ }
+ if(str.IsEmpty()) {
+ return L"";
+ }
+ return str;
+}
diff --git a/core/src/reflow/reflowedtextpage.h b/core/src/reflow/reflowedtextpage.h
new file mode 100644
index 0000000000..397428d178
--- /dev/null
+++ b/core/src/reflow/reflowedtextpage.h
@@ -0,0 +1,71 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REFLOWED_TEXT_PAGE_H
+#define _REFLOWED_TEXT_PAGE_H
+#include "../../include/reflow/reflowengine.h"
+#include "../../src/reflow/reflowedpage.h"
+typedef CFX_SegmentedArray<CRF_CharData*> CRF_CharDataPtrArray;
+typedef CFX_SegmentedArray<FX_INT32> CFX_CountBSINT32Array;
+class CRF_TextPage : public IPDF_TextPage
+{
+public:
+ CRF_TextPage(IPDF_ReflowedPage* pRefPage);
+
+ virtual ~CRF_TextPage() ;
+ FX_BOOL ParseTextPage();
+ void NormalizeObjects(FX_BOOL bNormalize)
+ {
+ return;
+ };
+
+ FX_BOOL IsParsered() const;
+public:
+
+ int CharIndexFromTextIndex(int TextIndex) const;
+
+ int TextIndexFromCharIndex(int CharIndex) const;
+
+
+ int CountChars() const;
+
+ virtual void GetCharInfo(int index, FPDF_CHAR_INFO & info) const;
+
+ void GetRectArray(int start, int nCount, CFX_RectArray& rectArray) const;
+
+
+ int GetIndexAtPos(CPDF_Point point, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+
+ int GetIndexAtPos(FX_FLOAT x, FX_FLOAT y, FX_FLOAT xTorelance, FX_FLOAT yTorelance) const;
+
+ virtual int GetOrderByDirection(int index, int direction) const;
+
+ CFX_WideString GetTextByRect(CFX_FloatRect rect) const;
+
+ void GetRectsArrayByRect(CFX_FloatRect rect, CFX_RectArray& resRectArray) const;
+
+
+ int CountRects(int start, int nCount);
+
+ virtual void GetRect(int rectIndex, FX_FLOAT& left, FX_FLOAT& top, FX_FLOAT& right, FX_FLOAT &bottom) const;
+ virtual FX_BOOL GetBaselineRotate(int rectIndex, int& Rotate);
+ virtual FX_BOOL GetBaselineRotate(CFX_FloatRect rect, int& Rotate);
+
+ virtual int CountBoundedSegments(FX_FLOAT left, FX_FLOAT top, FX_FLOAT right, FX_FLOAT bottom, FX_BOOL bContains = FALSE);
+
+ virtual void GetBoundedSegment(int index, int& start, int& count) const;
+
+
+ int GetWordBreak(int index, int direction) const;
+
+ CFX_WideString GetPageText(int start, int nCount = -1 ) const;
+private:
+ CPDF_ReflowedPage* m_pRefPage;
+ CRF_CharDataPtrArray* m_pDataList;
+ CFX_RectArray m_rectArray;
+ CFX_CountBSINT32Array* m_CountBSArray;
+};
+#endif
diff --git a/core/src/reflow/reflowengine.cpp b/core/src/reflow/reflowengine.cpp
new file mode 100644
index 0000000000..11007c904b
--- /dev/null
+++ b/core/src/reflow/reflowengine.cpp
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/reflow/reflowengine.h"
+#include "reflowedpage.h"
+IPDF_ReflowedPage* IPDF_ReflowedPage::Create()
+{
+ CPDF_ReflowedPage* pRefPage = FX_NEW CPDF_ReflowedPage(NULL);
+ return pRefPage;
+}
+IPDF_ReflowedPage* Create_ReflowPage()
+{
+ return IPDF_ReflowedPage::Create();
+}
+IPDF_ProgressiveReflowPageParser* Create_ReflowPageParser()
+{
+ return IPDF_ProgressiveReflowPageParser::Create();
+}
+IPDF_ProgressiveReflowPageParser* IPDF_ProgressiveReflowPageParser::Create()
+{
+ CPDF_ProgressiveReflowPageParser* pParser = FX_NEW CPDF_ProgressiveReflowPageParser;
+ if (NULL == pParser) {
+ return NULL;
+ }
+ pParser->Init();
+ return pParser;
+}
+IPDF_ProgressiveReflowPageRender* Create_ReflowPageRender()
+{
+ return IPDF_ProgressiveReflowPageRender::Create();
+}
+IPDF_ProgressiveReflowPageRender* IPDF_ProgressiveReflowPageRender::Create()
+{
+ return FX_NEW CPDF_ProgressiveReflowPageRender;
+}
diff --git a/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h b/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h
new file mode 100644
index 0000000000..7624596788
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h
@@ -0,0 +1,51 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _RAO_FONTMAP_H_
+#define _RAO_FONTMAP_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+class CPDFSDK_Annot;
+
+class CBA_FontMap : public CPWL_FontMap
+{
+public:
+ CBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler);
+ CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict, IFX_SystemHandler* pSystemHandler);
+
+ virtual ~CBA_FontMap();
+
+ virtual void Initial(FX_LPCSTR fontname = NULL);
+
+public:
+ void SetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName);
+
+ void Reset();
+ void SetAPType(const CFX_ByteString& sAPType);
+
+protected:
+ virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);
+ virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
+ virtual CPDF_Document* GetDocument();
+private:
+ CPDF_Font* FindResFontSameCharset(CPDF_Dictionary* pResDict, CFX_ByteString& sFontAlias,
+ FX_INT32 nCharset);
+ CPDF_Font* GetAnnotDefaultFont(CFX_ByteString &csNameTag);
+ void AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias);
+
+private:
+ CPDF_Document* m_pDocument;
+ CPDF_Dictionary* m_pAnnotDict;
+ CPDF_Font* m_pDefaultFont;
+ CFX_ByteString m_sDefaultFontName;
+
+ CFX_ByteString m_sAPType;
+};
+
+#endif // _RAO_FONTMAP_H_
diff --git a/fpdfsdk/include/formfiller/FFL_CheckBox.h b/fpdfsdk/include/formfiller/FFL_CheckBox.h
new file mode 100644
index 0000000000..f8ee370519
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_CheckBox.h
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_CHECKBOX_H_
+#define _FFL_CHECKBOX_H_
+
+class CFFL_CheckBox : public CFFL_Button
+{
+public:
+ CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget);
+ virtual ~CFFL_CheckBox();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+};
+
+#endif //_FFL_CHECKBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_ComboBox.h b/fpdfsdk/include/formfiller/FFL_ComboBox.h
new file mode 100644
index 0000000000..f116acffd9
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_ComboBox.h
@@ -0,0 +1,69 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_COMBOBOX_H_
+ #define _FFL_COMBOBOX_H_
+
+struct FFL_ComboBoxState
+{
+ int nIndex;
+ int nStart;
+ int nEnd;
+ CFX_WideString sValue;
+};
+class CBA_FontMap;
+
+class CFFL_ComboBox : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify
+{
+public:
+ CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_ComboBox();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld, const PDFSDK_FieldAction& faNew);
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+ virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag);
+
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd);
+ virtual void OnKillFocus(CPWL_Wnd* pWnd);
+
+public:
+ virtual void OnAddUndo(CPWL_Edit* pEdit);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+private:
+ CFX_WideString GetSelectExportText();
+
+private:
+ CBA_FontMap* m_pFontMap;
+ FFL_ComboBoxState m_State;
+ //CFFL_IM_BOX m_IMBox;
+};
+
+#endif //_FFL_COMBOBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_FormFiller.h b/fpdfsdk/include/formfiller/FFL_FormFiller.h
new file mode 100644
index 0000000000..eb81675fa4
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_FormFiller.h
@@ -0,0 +1,178 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_FORMFILLER_H_
+#define _FFL_FORMFILLER_H_
+
+#include "FFL_IFormFiller.h"
+#include "FFL_CBA_Fontmap.h"
+
+class CPDFSDK_Annot;
+class CFFL_FormFiller;
+class CFFL_Notify;
+class CPDFDoc_Environment;
+class CPDFSDK_PageView;
+class CPDFSDK_Document;
+class CPDFSDK_Widget;
+
+
+#define CFFL_PageView2PDFWindow CFX_MapPtrTemplate<CPDFSDK_PageView*, CPWL_Wnd*>
+
+struct FFL_KeyStrokeData
+{
+ CFX_WideString swValue;
+ FX_BOOL bFull;
+ int nSelStart;
+ int nSelEnd;
+};
+
+
+
+class CFFL_FormFiller : /*public IBA_AnnotFiller,*/ public IPWL_Provider, public CPWL_TimerHandler
+{
+public:
+ CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_FormFiller();
+
+ virtual FX_RECT GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+ virtual void OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot);
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot);
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot);
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+public: //CPWL_TimerHandler
+ virtual void TimerProc();
+ virtual IFX_SystemHandler* GetSystemHandler() const;
+
+public:
+ virtual CPDF_Matrix GetWindowMatrix(void* pAttachedData);
+ virtual CFX_WideString LoadPopupMenuString(int nIndex);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew);
+
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+
+ virtual void OnKeyStroke(FX_BOOL bKeyDown);
+
+ CPDF_Matrix GetCurMatrix();
+
+ CPDF_Rect FFLtoPWL(const CPDF_Rect& rect);
+ CPDF_Rect PWLtoFFL(const CPDF_Rect& rect);
+ CPDF_Point FFLtoPWL(const CPDF_Point& point);
+ CPDF_Point PWLtoFFL(const CPDF_Point& point);
+
+ CPDF_Point WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt);
+ CPDF_Rect FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect& rect);
+
+ void SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow);
+ CPDF_Rect GetWindowRect(CPDFSDK_PageView* pPageView);
+
+ static void FFL_FreeData(void* pData);
+
+ FX_BOOL CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag);
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data);
+
+public:
+ CPWL_Wnd* GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew);
+ void DestroyPDFWindow(CPDFSDK_PageView* pPageView);
+ void EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow);
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView) = 0;
+ virtual CPDF_Rect GetFocusBox(CPDFSDK_PageView* pPageView);
+
+public:
+ FX_BOOL IsValid() const;
+ CPDF_Rect GetPDFWindowRect() const;
+
+ CPDFSDK_PageView* GetCurPageView();
+ void SetChangeMark();
+
+ virtual void InvalidateRect(double left, double top, double right, double bottom);
+ CPDFDoc_Environment* GetApp(){return m_pApp;}
+ CPDFSDK_Annot* GetSDKAnnot() {return m_pAnnot;}
+protected:
+ CPDFDoc_Environment* m_pApp;
+ CPDFSDK_Widget* m_pWidget;
+ CPDFSDK_Annot* m_pAnnot;
+
+ FX_BOOL m_bValid;
+ CFFL_PageView2PDFWindow m_Maps;
+ CPDF_Point m_ptOldPos;
+};
+
+class CFFL_Button : public CFFL_FormFiller
+{
+public:
+ CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_Button();
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView/*, HDC hDC*/, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags);
+
+ virtual void OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags);
+protected:
+ FX_BOOL m_bMouseIn;
+ FX_BOOL m_bMouseDown;
+};
+
+//#define CFFL_IM_BOX CFX_ArrayTemplate<CBA_EditInput*>
+
+#endif
diff --git a/fpdfsdk/include/formfiller/FFL_IFormFiller.h b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
new file mode 100644
index 0000000000..79b4b8e6d7
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_IFormFiller.h
@@ -0,0 +1,144 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_IFORMFILLER_H_
+#define _FFL_IFORMFILLER_H_
+
+#include "FormFiller.h"
+class CFFL_FormFiller;
+class CFFL_PrivateData;
+
+#define CFFL_Widget2Filler CFX_MapPtrTemplate<CPDFSDK_Annot*, CFFL_FormFiller*>
+
+// #define IsALTpressed() (GetKeyState(VK_MENU) < 0)
+// #define IsCTRLpressed() (GetKeyState(VK_CONTROL) < 0)
+// #define IsSHIFTpressed() (GetKeyState(VK_SHIFT)&0x8000)
+// #define IsINSERTpressed() (GetKeyState(VK_INSERT) & 0x01)
+// #define VK_SHIFT 0x10
+// #define VK_CONTROL 0x11
+// #define VK_MENU 0x12
+// #define VK_RETURN 0x0D
+// #define VK_SPACE 0x20
+// #define VK_ESCAPE 0x1B
+
+
+
+class CFFL_IFormFiller :/* public IBA_AnnotFiller, */public IPWL_Filler_Notify//,
+// public IUndo_EventHandler, public IClipboard_Handler
+{
+public:
+ CFFL_IFormFiller(CPDFDoc_Environment* pApp);
+ virtual ~CFFL_IFormFiller();
+
+ virtual FX_BOOL Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point);
+ virtual FX_RECT GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags);
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot);
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot);
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot);
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot);
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
+
+public:
+ virtual void QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet);
+ virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag);
+ virtual void OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) ;
+
+ virtual void OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow);
+ virtual void OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit);
+
+public:
+ virtual void BeforeUndo(CPDFSDK_Document* pDocument);
+ virtual void BeforeRedo(CPDFSDK_Document* pDocument);
+ virtual void AfterUndo(CPDFSDK_Document* pDocument);
+ virtual void AfterRedo(CPDFSDK_Document* pDocument);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+public:
+ CFFL_FormFiller* GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister);
+ void RemoveFormFiller(CPDFSDK_Annot* pAnnot);
+
+ static FX_BOOL IsVisible(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsReadOnly(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsFillingAllowed(CPDFSDK_Widget* pWidget);
+ static FX_BOOL IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
+
+ void OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag);
+
+ void OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag);
+ void OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag);
+// static LRESULT CALLBACK FFL_WndProc(
+// int code, // hook code
+// WPARAM wParam, // virtual-key code
+// LPARAM lParam // keystroke-message information
+// );
+// static MSG GetLastMessage();
+ static int GetCommitKey();
+ static FX_BOOL GetKeyDown();
+
+
+public:
+// static MSG g_Msg;
+// static HHOOK m_hookSheet;
+
+private:
+ void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot);
+ void SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext);
+
+private:
+ CPDFDoc_Environment* m_pApp;
+ CFFL_Widget2Filler m_Maps;
+ FX_BOOL m_bNotifying;
+};
+
+class CFFL_PrivateData
+{
+public:
+ CPDFSDK_Widget* pWidget;
+ CPDFSDK_PageView* pPageView;
+ int nWidgetAge;
+ int nValueAge;
+};
+
+#endif //_FFL_IFORMFILLER_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_ListBox.h b/fpdfsdk/include/formfiller/FFL_ListBox.h
new file mode 100644
index 0000000000..899c44da2d
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_ListBox.h
@@ -0,0 +1,44 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_LISTBOX_H_
+#define _FFL_LISTBOX_H_
+
+class CBA_FontMap;
+class CFFL_ListBox : public CFFL_FormFiller
+{
+public:
+ CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
+ virtual ~CFFL_ListBox();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+ virtual void OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag);
+
+private:
+ CBA_FontMap* m_pFontMap;
+ CFX_MapPtrTemplate<int, void*> m_OriginSelections;
+ CFX_ArrayTemplate<int> m_State;
+};
+
+
+#endif //_FFL_LISTBOX_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_Notify.h b/fpdfsdk/include/formfiller/FFL_Notify.h
new file mode 100644
index 0000000000..8a0b7a3fa3
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_Notify.h
@@ -0,0 +1,54 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#if !defined(_FFL_NOTIFY_H_)
+#define _FFL_NOTIFY_H_
+
+class CFFL_FormFiller;
+
+class CFFL_Notify
+{
+public:
+ CFFL_Notify(CFFL_FormFiller * pFormFiller);
+ virtual ~CFFL_Notify();
+
+public:
+ FX_BOOL OnSetFocus(FX_BOOL & bExit);
+ FX_BOOL OnMouseEnter(FX_BOOL & bExit);
+ FX_BOOL OnMouseDown(FX_BOOL & bExit);
+ FX_BOOL OnMouseUp(FX_BOOL & bExit);
+ FX_BOOL OnMouseExit(FX_BOOL & bExit);
+ FX_BOOL OnKillFocus(FX_BOOL & bExit);
+
+ FX_BOOL OnCalculate();
+ FX_BOOL OnFormat(int iCommitKey);
+ FX_BOOL OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL & bRC);
+ FX_BOOL OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull,
+ int& nSelStart, int& nSelEnd, FX_BOOL& bRC);
+
+ void BeforeNotify();
+ void AfterNotify();
+ FX_BOOL IsNotifying() const {return m_nNotifyFlag > 0;}
+
+private:
+// CReader_InterForm * GetReaderInterForm();
+ FX_BOOL DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit);
+ FX_BOOL FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action);
+ FX_BOOL FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action);
+ FX_BOOL ExecuteActionTree(CPDF_AAction::AActionType eAAT, CPDF_Action & action, FX_BOOL& bExit);
+ FX_BOOL ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit);
+
+ CFFL_FormFiller * m_pFormFiller;
+ FX_BOOL m_bDoActioning;
+ FX_INT32 m_nNotifyFlag;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/formfiller/FFL_PushButton.h b/fpdfsdk/include/formfiller/FFL_PushButton.h
new file mode 100644
index 0000000000..4dcff145ae
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_PushButton.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_PUSHBUTTON_H_
+#define _FFL_PUSHBUTTON_H_
+
+class CFFL_PushButton : public CFFL_Button
+{
+public:
+ CFFL_PushButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_PushButton();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags);
+};
+
+#endif //_FFL_PUSHBUTTON_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_RadioButton.h b/fpdfsdk/include/formfiller/FFL_RadioButton.h
new file mode 100644
index 0000000000..bab8584db9
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_RadioButton.h
@@ -0,0 +1,25 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FFL_RADIOBUTTON_H_
+#define _FFL_RADIOBUTTON_H_
+
+class CFFL_RadioButton : public CFFL_Button
+{
+public:
+ CFFL_RadioButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_RadioButton();
+
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags);
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point);
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+};
+
+#endif //_FFL_RADIOBUTTON_H_
+
diff --git a/fpdfsdk/include/formfiller/FFL_TextField.h b/fpdfsdk/include/formfiller/FFL_TextField.h
new file mode 100644
index 0000000000..2b6f069af2
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_TextField.h
@@ -0,0 +1,89 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#if !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)
+#define AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_
+
+#include "FFL_FormFiller.h"
+
+#define BF_ALIGN_LEFT 0
+#define BF_ALIGN_MIDDLE 1
+#define BF_ALIGN_RIGHT 2
+
+class CBA_FontMap;
+
+class CFFL_EditUndoItem //: public IUndoItem
+{
+public:
+ CFFL_EditUndoItem(CPWL_Edit* pEdit);
+ virtual ~CFFL_EditUndoItem();
+
+ virtual void Undo();
+ virtual void Redo();
+ virtual CFX_WideString GetDescr();
+ virtual void Release();
+
+private:
+ CPWL_Edit* m_pEdit;
+};
+
+struct FFL_TextFieldState
+{
+ int nStart;
+ int nEnd;
+ CFX_WideString sValue;
+};
+
+class CFFL_TextField : public CFFL_FormFiller, public IPWL_FocusHandler, public IPWL_Edit_Notify
+{
+public:
+ CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
+ virtual ~CFFL_TextField();
+
+ virtual PWL_CREATEPARAM GetCreateParam();
+ virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView);
+
+
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
+
+ virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
+ virtual void SaveData(CPDFSDK_PageView* pPageView);
+
+ virtual void GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa);
+ virtual void SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa);
+ virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew);
+ virtual void SaveState(CPDFSDK_PageView* pPageView);
+ virtual void RestoreState(CPDFSDK_PageView* pPageView);
+
+ virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue);
+
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd);
+ virtual void OnKillFocus(CPWL_Wnd* pWnd);
+
+public:
+ virtual void OnAddUndo(CPWL_Edit* pEdit);
+
+public:
+ virtual FX_BOOL CanCopy(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanCut(CPDFSDK_Document* pDocument);
+ virtual FX_BOOL CanPaste(CPDFSDK_Document* pDocument);
+
+ virtual void DoCopy(CPDFSDK_Document* pDocument);
+ virtual void DoCut(CPDFSDK_Document* pDocument);
+ virtual void DoPaste(CPDFSDK_Document* pDocument);
+
+private:
+ CBA_FontMap* m_pFontMap;
+// CBA_SpellCheck* m_pSpellCheck;
+ FFL_TextFieldState m_State;
+// CFFL_IM_BOX m_IMBox;
+};
+
+#endif // !defined(AFX_FFL_EDIT_H__8E0C9456_CBA2_4EFB_9F31_53C6D8C1A8AC__INCLUDED_)
diff --git a/fpdfsdk/include/formfiller/FFL_Utils.h b/fpdfsdk/include/formfiller/FFL_Utils.h
new file mode 100644
index 0000000000..07f2bee761
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FFL_Utils.h
@@ -0,0 +1,20 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#define FFL_BASE_USERUNIT 1.0f / 72.0f
+
+template<class T> T FFL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T FFL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+class CFFL_Utils
+{
+public:
+ static CPDF_Rect MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);
+ static CPDF_Rect InflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);
+ static CPDF_Rect DeflateRect(const CPDF_Rect & crRect, const FX_FLOAT & fSize);
+ static FX_BOOL TraceObject(CPDF_Object* pObj);
+};
+
diff --git a/fpdfsdk/include/formfiller/FormFiller.h b/fpdfsdk/include/formfiller/FormFiller.h
new file mode 100644
index 0000000000..e7a22a0101
--- /dev/null
+++ b/fpdfsdk/include/formfiller/FormFiller.h
@@ -0,0 +1,30 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FORMFILLER_H_
+#define _FORMFILLER_H_
+
+
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+
+#endif
+
+#include "../fsdk_mgr.h"
+
+#include "../fxedit/fx_edit.h"
+#include "../pdfwindow/IPDFWindow.h"
+
+
+
+#endif //_FORMFILLER_H_
+
diff --git a/fpdfsdk/include/fpdf_dataavail.h b/fpdfsdk/include/fpdf_dataavail.h
new file mode 100644
index 0000000000..9d373fc959
--- /dev/null
+++ b/fpdfsdk/include/fpdf_dataavail.h
@@ -0,0 +1,222 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_DATAAVAIL_H_
+#define _FPDF_DATAAVAIL_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+
+/** The result of the process which check linearized PDF. */
+#define FSDK_IS_LINEARIZED 1
+#define FSDK_NOT_LINEARIZED 0
+#define FSDK_UNKNOW_LINEARIZED -1
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Interface: FX_FILEAVAIL
+ * Interface for checking whether the section of the file is available.
+ */
+typedef struct _FX_FILEAVAIL {
+ /**
+ * Version number of the interface. Currently must be 1.
+ */
+ int version;
+
+ /**
+ * Method: IsDataAvail
+ * Report whether the specified data section is available. A section is available only if all bytes in the section is available.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * offset - The offset of the data section in the file.
+ * size - The size of the data section
+ * Return Value:
+ * true means the specified data section is available.
+ * Comments:
+ * Called by Foxit SDK to check whether the data section is ready.
+ */
+ bool (*IsDataAvail)(struct _FX_FILEAVAIL* pThis, size_t offset, size_t size);
+} FX_FILEAVAIL;
+
+typedef void* FPDF_AVAIL;
+
+/**
+* Function: FPDFAvail_Create
+* Create a document availability provider.
+*
+* Parameters:
+* file_avail - Pointer to file availability interface to check availability of file data.
+* file - Pointer to a file access interface for reading data from file.
+* Return value:
+* A handle to the document availability provider. NULL for error.
+* Comments:
+* Application must call FPDFAvail_Destroy when done with the availability provider.
+*/
+DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file);
+
+/**
+* Function: FPDFAvail_Destroy
+* Destroy a document availibity provider.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* Return Value:
+* None.
+*/
+DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail);
+
+/**
+ * Interface: FX_DOWNLOADHINTS
+ * Download hints interface. Used to receive hints for further downloading.
+ */
+typedef struct _FX_DOWNLOADHINTS {
+ /**
+ * Version number of the interface. Currently must be 1.
+ */
+ int version;
+
+ /**
+ * Method: AddSegment
+ * Add a section to be downloaded.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * offset - The offset of the hint reported to be downloaded.
+ * size - The size of the hint reported to be downloaded.
+ * Return Value:
+ * None.
+ * Comments:
+ * Called by Foxit SDK to report some downloading hints for download manager.
+ * The position and size of section may be not accurate, part of the section might be already available.
+ * The download manager must deal with that to maximize download efficiency.
+ */
+ void (*AddSegment)(struct _FX_DOWNLOADHINTS* pThis, size_t offset, size_t size);
+} FX_DOWNLOADHINTS;
+
+/**
+* Function: FPDFAvail_IsDocAvail
+* Check whether the document is ready for loading, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for page is fully available, 0 for page not yet available.
+* Comments:
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can call FPDFAvail_GetDocument() to get a document handle.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_GetDocument
+* Get document from the availability provider.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* password - Optional password for decrypting the PDF file.
+* Return value:
+* Handle to the document.
+* Comments:
+* After FPDFAvail_IsDocAvail() returns TRUE, the application should call this function to
+* get the document handle. To close the document, use FPDF_CloseDocument function.
+*/
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail,
+ FPDF_BYTESTRING password);
+
+/**
+* Function: FPDFAvail_GetFirstPageNum
+* Get page number for the first available page in a linearized PDF
+*
+* Parameters:
+* doc - A document handle returned by FPDFAvail_GetDocument
+* Return Value:
+* Zero-based index for the first available page.
+* Comments:
+* For most linearized PDFs, the first available page would be just the first page, however,
+* some PDFs might make other page to be the first available page.
+* For non-linearized PDF, this function will always return zero.
+*/
+DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc);
+
+/**
+* Function: FPDFAvail_IsPageAvail
+* Check whether a page is ready for loading, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* page_index - Index number of the page. 0 for the first page.
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for page is fully available, 0 for page not yet available.
+* Comments:
+* This function call be called only after FPDFAvail_GetDocument if called.
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can perform page loading.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_ISFormAvail
+* Check whether Form data is ready for init, if not, get download hints.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* hints - Pointer to a download hints interface, receiving generated hints
+* Return value:
+* Non-zero for Form data is fully available, 0 for Form data not yet available.
+* Details: -1 - error, the input parameter not correct, such as hints is null.
+* 0 - data not available
+* 1 - data available
+* 2 - no form data.
+* Comments:
+* This function call be called only after FPDFAvail_GetDocument if called.
+* The application should call this function whenever new data arrived, and process all the
+* generated download hints if any, until the function returns non-zero value. Then the
+* application can perform page loading. Recommend to call FPDFDOC_InitFormFillEnviroument
+* after the function returns non-zero value.
+*/
+DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints);
+
+/**
+* Function: FPDFAvail_IsLinearized
+* To check whether a document is Linearized PDF file.
+*
+* Parameters:
+* avail - Handle to document availability provider returned by FPDFAvail_Create
+* Return value:
+* return TRUE means the document is linearized PDF else not.
+* FSDK_IS_LINEARIZED is a linearize file.
+* FSDK_NOT_LINEARIZED is not a linearize file.
+* FSDK_UNKNOW_LINEARIZED don't know whether the file is a linearize file.
+* Comments:
+* It return TRUE/FALSE as soon as we have first 1K data. If the file's size less than
+* 1K,we don't known whether the PDF is a linearized file.
+*
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/fpdfsdk/include/fpdf_ext.h b/fpdfsdk/include/fpdf_ext.h
new file mode 100644
index 0000000000..a8f268a4a0
--- /dev/null
+++ b/fpdfsdk/include/fpdf_ext.h
@@ -0,0 +1,108 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_EXT_H_
+#define _FPDF_EXT_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//flags for type of unsupport object.
+#define FPDF_UNSP_DOC_XFAFORM 1
+#define FPDF_UNSP_DOC_PORTABLECOLLECTION 2
+#define FPDF_UNSP_DOC_ATTACHMENT 3
+#define FPDF_UNSP_DOC_SECURITY 4
+#define FPDF_UNSP_DOC_SHAREDREVIEW 5
+#define FPDF_UNSP_DOC_SHAREDFORM_ACROBAT 6
+#define FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM 7
+#define FPDF_UNSP_DOC_SHAREDFORM_EMAIL 8
+#define FPDF_UNSP_ANNOT_3DANNOT 11
+#define FPDF_UNSP_ANNOT_MOVIE 12
+#define FPDF_UNSP_ANNOT_SOUND 13
+#define FPDF_UNSP_ANNOT_SCREEN_MEDIA 14
+#define FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA 15
+#define FPDF_UNSP_ANNOT_ATTACHMENT 16
+#define FPDF_UNSP_ANNOT_SIG 17
+
+typedef struct _UNSUPPORT_INFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: FSDK_UnSupport_Handler
+ * UnSupport Object process handling function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nType - The type of unsupportObject
+ * Return value:
+ * None.
+ * */
+
+ void(*FSDK_UnSupport_Handler)(_UNSUPPORT_INFO* pThis,int nType);
+}UNSUPPORT_INFO;
+
+
+/**
+ * Function: FSDK_SetUnSpObjProcessHandler
+ * Setup A UnSupport Object process handler for foxit sdk.
+ * Parameters:
+ * unsp_info - Pointer to a UNSUPPORT_INFO structure.
+ * Return Value:
+ * TRUE means successful. FALSE means fails.
+ **/
+
+DLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info);
+
+//flags for page mode.
+
+//Unknown value
+#define PAGEMODE_UNKONOWN -1
+
+//Neither document outline nor thumbnail images visible
+#define PAGEMODE_USENONE 0
+
+//Document outline visible
+#define PAGEMODE_USEOUTLINES 1
+
+//Thumbnial images visible
+#define PAGEMODE_USETHUMBS 2
+
+//Full-screen mode, with no menu bar, window controls, or any other window visible
+#define PAGEMODE_FULLSCREEN 3
+
+//Optional content group panel visible
+#define PAGEMODE_USEOC 4
+
+//Attachments panel visible
+#define PAGEMODE_USEATTACHMENTS 5
+
+
+/**
+ * Function: FPDFDoc_GetPageMode
+ * Get the document's PageMode(How the document should be displayed when opened)
+ * Parameters:
+ * doc - Handle to document. Returned by FPDF_LoadDocument function.
+ * Return Value:
+ * The flags for page mode.
+ **/
+DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document);
+
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/fpdfsdk/include/fpdf_flatten.h b/fpdfsdk/include/fpdf_flatten.h
new file mode 100644
index 0000000000..26e324df73
--- /dev/null
+++ b/fpdfsdk/include/fpdf_flatten.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_FLATTEN_H_
+#define _FPDF_FLATTEN_H_
+
+#include "fpdfview.h"
+
+#define FLATTEN_FAIL 0 // Flatten operation failed.
+#define FLATTEN_SUCCESS 1 // Flatten operation succeed.
+#define FLATTEN_NOTINGTODO 2 // There is nothing can be flatten.
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define FLAT_NORMALDISPLAY 0
+#define FLAT_PRINT 1
+ //Function: FPDFPage_Flatten
+
+ // Flat a pdf page,annotations or form fields will become part of the page contents.
+ //Parameters:
+
+ // page - Handle to the page. Returned by FPDF_LoadPage function.
+ // nFlag - the flag for the use of flatten result. Zero for normal display, 1 for print.
+ //Return value:
+ // The result flag of the function, See flags above ( FLATTEN_FAIL, FLATTEN_SUCCESS, FLATTEN_NOTINGTODO ).
+ //
+ // Comments: Current version all fails return zero. If necessary we will assign different value
+ // to indicate different fail reason.
+ //
+ DLLEXPORT int STDCALL FPDFPage_Flatten( FPDF_PAGE page, int nFlag);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDF_FLATTEN_H_
diff --git a/fpdfsdk/include/fpdf_fwlevent.h b/fpdfsdk/include/fpdf_fwlevent.h
new file mode 100644
index 0000000000..cf34c2103f
--- /dev/null
+++ b/fpdfsdk/include/fpdf_fwlevent.h
@@ -0,0 +1,286 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FWL_EVENT_H
+#define _FWL_EVENT_H
+
+#include "fpdfview.h"
+
+typedef int FPDF_INT32;
+typedef unsigned int FPDF_UINT32;
+typedef float FPDF_FLOAT;
+//event type
+typedef enum
+{
+ FWL_EVENTTYPE_Mouse = 0 ,
+ FWL_EVENTTYPE_MouseWheel,
+ FWL_EVENTTYPE_Key ,
+} FWL_EVENTTYPE;
+
+//key flag
+typedef enum
+{
+ FWL_EVENTFLAG_ShiftKey = 1 << 0,
+ FWL_EVENTFLAG_ControlKey = 1 << 1,
+ FWL_EVENTFLAG_AltKey = 1 << 2,
+ FWL_EVENTFLAG_MetaKey = 1 << 3,
+ FWL_EVENTFLAG_KeyPad = 1 << 4,
+ FWL_EVENTFLAG_AutoRepeat = 1 << 5,
+ FWL_EVENTFLAG_LeftButtonDown = 1 << 6,
+ FWL_EVENTFLAG_MiddleButtonDown = 1 << 7,
+ FWL_EVENTFLAG_RightButtonDown = 1 << 8,
+} FWL_EVENTFLAG;
+
+// Mouse message command
+typedef enum
+{
+ FWL_EVENTMOUSECMD_LButtonDown = 1 ,
+ FWL_EVENTMOUSECMD_LButtonUp ,
+ FWL_EVENTMOUSECMD_LButtonDblClk ,
+ FWL_EVENTMOUSECMD_RButtonDown ,
+ FWL_EVENTMOUSECMD_RButtonUp ,
+ FWL_EVENTMOUSECMD_RButtonDblClk ,
+ FWL_EVENTMOUSECMD_MButtonDown ,
+ FWL_EVENTMOUSECMD_MButtonUp ,
+ FWL_EVENTMOUSECMD_MButtonDblClk ,
+ FWL_EVENTMOUSECMD_MouseMove ,
+ FWL_EVENTMOUSECMD_MouseEnter ,
+ FWL_EVENTMOUSECMD_MouseHover ,
+ FWL_EVENTMOUSECMD_MouseLeave ,
+} FWL_EVENT_MOUSECMD;
+
+//mouse event
+struct FWL_EVENT_MOUSE
+{
+ FPDF_UINT32 command;
+ FPDF_DWORD flag;
+ FPDF_FLOAT x;
+ FPDF_FLOAT y;
+};
+
+//mouse wheel
+struct FWL_EVENT_MOUSEWHEEL
+{
+ FPDF_DWORD flag;
+ FPDF_FLOAT x;
+ FPDF_FLOAT y;
+ FPDF_FLOAT deltaX;
+ FPDF_FLOAT deltaY;
+};
+
+//virtual keycode
+typedef enum
+{
+ FWL_VKEY_Back = 0x08,
+ FWL_VKEY_Tab = 0x09,
+ FWL_VKEY_Clear = 0x0C,
+ FWL_VKEY_Return = 0x0D,
+ FWL_VKEY_Shift = 0x10,
+ FWL_VKEY_Control = 0x11,
+ FWL_VKEY_Menu = 0x12,
+ FWL_VKEY_Pause = 0x13,
+ FWL_VKEY_Capital = 0x14,
+ FWL_VKEY_Kana = 0x15,
+ FWL_VKEY_Hangul = 0x15,
+ FWL_VKEY_Junja = 0x17,
+ FWL_VKEY_Final = 0x18,
+ FWL_VKEY_Hanja = 0x19,
+ FWL_VKEY_Kanji = 0x19,
+ FWL_VKEY_Escape = 0x1B,
+ FWL_VKEY_Convert = 0x1C,
+ FWL_VKEY_NonConvert = 0x1D,
+ FWL_VKEY_Accept = 0x1E,
+ FWL_VKEY_ModeChange = 0x1F,
+ FWL_VKEY_Space = 0x20,
+ FWL_VKEY_Prior = 0x21,
+ FWL_VKEY_Next = 0x22,
+ FWL_VKEY_End = 0x23,
+ FWL_VKEY_Home = 0x24,
+ FWL_VKEY_Left = 0x25,
+ FWL_VKEY_Up = 0x26,
+ FWL_VKEY_Right = 0x27,
+ FWL_VKEY_Down = 0x28,
+ FWL_VKEY_Select = 0x29,
+ FWL_VKEY_Print = 0x2A,
+ FWL_VKEY_Execute = 0x2B,
+ FWL_VKEY_Snapshot = 0x2C,
+ FWL_VKEY_Insert = 0x2D,
+ FWL_VKEY_Delete = 0x2E,
+ FWL_VKEY_Help = 0x2F,
+ FWL_VKEY_0 = 0x30,
+ FWL_VKEY_1 = 0x31,
+ FWL_VKEY_2 = 0x32,
+ FWL_VKEY_3 = 0x33,
+ FWL_VKEY_4 = 0x34,
+ FWL_VKEY_5 = 0x35,
+ FWL_VKEY_6 = 0x36,
+ FWL_VKEY_7 = 0x37,
+ FWL_VKEY_8 = 0x38,
+ FWL_VKEY_9 = 0x39,
+ FWL_VKEY_A = 0x41,
+ FWL_VKEY_B = 0x42,
+ FWL_VKEY_C = 0x43,
+ FWL_VKEY_D = 0x44,
+ FWL_VKEY_E = 0x45,
+ FWL_VKEY_F = 0x46,
+ FWL_VKEY_G = 0x47,
+ FWL_VKEY_H = 0x48,
+ FWL_VKEY_I = 0x49,
+ FWL_VKEY_J = 0x4A,
+ FWL_VKEY_K = 0x4B,
+ FWL_VKEY_L = 0x4C,
+ FWL_VKEY_M = 0x4D,
+ FWL_VKEY_N = 0x4E,
+ FWL_VKEY_O = 0x4F,
+ FWL_VKEY_P = 0x50,
+ FWL_VKEY_Q = 0x51,
+ FWL_VKEY_R = 0x52,
+ FWL_VKEY_S = 0x53,
+ FWL_VKEY_T = 0x54,
+ FWL_VKEY_U = 0x55,
+ FWL_VKEY_V = 0x56,
+ FWL_VKEY_W = 0x57,
+ FWL_VKEY_X = 0x58,
+ FWL_VKEY_Y = 0x59,
+ FWL_VKEY_Z = 0x5A,
+ FWL_VKEY_LWin = 0x5B,
+ FWL_VKEY_Command = 0x5B,
+ FWL_VKEY_RWin = 0x5C,
+ FWL_VKEY_Apps = 0x5D,
+ FWL_VKEY_Sleep = 0x5F,
+ FWL_VKEY_NumPad0 = 0x60,
+ FWL_VKEY_NumPad1 = 0x61,
+ FWL_VKEY_NumPad2 = 0x62,
+ FWL_VKEY_NumPad3 = 0x63,
+ FWL_VKEY_NumPad4 = 0x64,
+ FWL_VKEY_NumPad5 = 0x65,
+ FWL_VKEY_NumPad6 = 0x66,
+ FWL_VKEY_NumPad7 = 0x67,
+ FWL_VKEY_NumPad8 = 0x68,
+ FWL_VKEY_NumPad9 = 0x69,
+ FWL_VKEY_Multiply = 0x6A,
+ FWL_VKEY_Add = 0x6B,
+ FWL_VKEY_Separator = 0x6C,
+ FWL_VKEY_Subtract = 0x6D,
+ FWL_VKEY_Decimal = 0x6E,
+ FWL_VKEY_Divide = 0x6F,
+ FWL_VKEY_F1 = 0x70,
+ FWL_VKEY_F2 = 0x71,
+ FWL_VKEY_F3 = 0x72,
+ FWL_VKEY_F4 = 0x73,
+ FWL_VKEY_F5 = 0x74,
+ FWL_VKEY_F6 = 0x75,
+ FWL_VKEY_F7 = 0x76,
+ FWL_VKEY_F8 = 0x77,
+ FWL_VKEY_F9 = 0x78,
+ FWL_VKEY_F10 = 0x79,
+ FWL_VKEY_F11 = 0x7A,
+ FWL_VKEY_F12 = 0x7B,
+ FWL_VKEY_F13 = 0x7C,
+ FWL_VKEY_F14 = 0x7D,
+ FWL_VKEY_F15 = 0x7E,
+ FWL_VKEY_F16 = 0x7F,
+ FWL_VKEY_F17 = 0x80,
+ FWL_VKEY_F18 = 0x81,
+ FWL_VKEY_F19 = 0x82,
+ FWL_VKEY_F20 = 0x83,
+ FWL_VKEY_F21 = 0x84,
+ FWL_VKEY_F22 = 0x85,
+ FWL_VKEY_F23 = 0x86,
+ FWL_VKEY_F24 = 0x87,
+ FWL_VKEY_NunLock = 0x90,
+ FWL_VKEY_Scroll = 0x91,
+ FWL_VKEY_LShift = 0xA0,
+ FWL_VKEY_RShift = 0xA1,
+ FWL_VKEY_LControl = 0xA2,
+ FWL_VKEY_RControl = 0xA3,
+ FWL_VKEY_LMenu = 0xA4,
+ FWL_VKEY_RMenu = 0xA5,
+ FWL_VKEY_BROWSER_Back = 0xA6,
+ FWL_VKEY_BROWSER_Forward = 0xA7,
+ FWL_VKEY_BROWSER_Refresh = 0xA8,
+ FWL_VKEY_BROWSER_Stop = 0xA9,
+ FWL_VKEY_BROWSER_Search = 0xAA,
+ FWL_VKEY_BROWSER_Favorites = 0xAB,
+ FWL_VKEY_BROWSER_Home = 0xAC,
+ FWL_VKEY_VOLUME_Mute = 0xAD,
+ FWL_VKEY_VOLUME_Down = 0xAE,
+ FWL_VKEY_VOLUME_Up = 0xAF,
+ FWL_VKEY_MEDIA_NEXT_Track = 0xB0,
+ FWL_VKEY_MEDIA_PREV_Track = 0xB1,
+ FWL_VKEY_MEDIA_Stop = 0xB2,
+ FWL_VKEY_MEDIA_PLAY_Pause = 0xB3,
+ FWL_VKEY_MEDIA_LAUNCH_Mail = 0xB4,
+ FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select = 0xB5,
+ FWL_VKEY_MEDIA_LAUNCH_APP1 = 0xB6,
+ FWL_VKEY_MEDIA_LAUNCH_APP2 = 0xB7,
+ FWL_VKEY_OEM_1 = 0xBA,
+ FWL_VKEY_OEM_Plus = 0xBB,
+ FWL_VKEY_OEM_Comma = 0xBC,
+ FWL_VKEY_OEM_Minus = 0xBD,
+ FWL_VKEY_OEM_Period = 0xBE,
+ FWL_VKEY_OEM_2 = 0xBF,
+ FWL_VKEY_OEM_3 = 0xC0,
+ FWL_VKEY_OEM_4 = 0xDB,
+ FWL_VKEY_OEM_5 = 0xDC,
+ FWL_VKEY_OEM_6 = 0xDD,
+ FWL_VKEY_OEM_7 = 0xDE,
+ FWL_VKEY_OEM_8 = 0xDF,
+ FWL_VKEY_OEM_102 = 0xE2,
+ FWL_VKEY_ProcessKey = 0xE5,
+ FWL_VKEY_Packet = 0xE7,
+ FWL_VKEY_Attn = 0xF6,
+ FWL_VKEY_Crsel = 0xF7,
+ FWL_VKEY_Exsel = 0xF8,
+ FWL_VKEY_Ereof = 0xF9,
+ FWL_VKEY_Play = 0xFA,
+ FWL_VKEY_Zoom = 0xFB,
+ FWL_VKEY_NoName = 0xFC,
+ FWL_VKEY_PA1 = 0xFD,
+ FWL_VKEY_OEM_Clear = 0xFE,
+ FWL_VKEY_Unknown = 0,
+} FWL_VKEYCODE;
+
+//key event command
+typedef enum
+{
+ FWL_EVENTKEYCMD_KeyDown = 1 ,
+ FWL_EVENTKEYCMD_KeyUp ,
+ FWL_EVENTKEYCMD_Char ,
+} FWL_EVENTKEYCMD;
+
+//key event
+struct FWL_EVENT_KEY
+{
+ FPDF_UINT32 command;
+ FPDF_DWORD flag;
+ union
+ {
+ //Virtual key code.
+ FPDF_UINT32 vkcode;
+ //Character code.
+ FPDF_DWORD charcode;
+ }code;
+};
+
+//event type
+struct FWL_EVENT
+{
+ //structure size.
+ FPDF_UINT32 size;
+ //FWL_EVENTTYPE.
+ FPDF_UINT32 type;
+ union
+ {
+ struct FWL_EVENT_MOUSE mouse;
+ struct FWL_EVENT_MOUSEWHEEL wheel;
+ struct FWL_EVENT_KEY key;
+ }s;
+};
+
+#endif //_FWL_EVENT_H
+
+
diff --git a/fpdfsdk/include/fpdf_progressive.h b/fpdfsdk/include/fpdf_progressive.h
new file mode 100644
index 0000000000..d590f78817
--- /dev/null
+++ b/fpdfsdk/include/fpdf_progressive.h
@@ -0,0 +1,94 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_PROGRESSIVE_H_
+#define _FPDF_PROGRESSIVE_H_
+
+#include "fpdfview.h"
+
+//Flags for progressive process status.
+#define FPDF_RENDER_READER 0
+#define FPDF_RENDER_TOBECOUNTINUED 1
+#define FPDF_RENDER_DONE 2
+#define FPDF_RENDER_FAILED 3
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+//IFPDF_RENDERINFO interface.
+typedef struct _IFSDK_PAUSE
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /*
+ * Method: NeedToPauseNow
+ * Check if we need to pause a progressive process now.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Return Value:
+ * Non-zero for pause now, 0 for continue.
+ *
+ */
+ FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
+
+ //A user defined data pointer, used by user's application. Can be NULL.
+ void* user;
+} IFSDK_PAUSE;
+
+// Function: FPDF_RenderPageBitmap_Start
+// Start to render page contents to a device independent bitmap progressively.
+// Parameters:
+// bitmap - Handle to the device independent bitmap (as the output buffer).
+// Bitmap handle can be created by FPDFBitmap_Create function.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the bitmap coordinate.
+// start_y - Top pixel position of the display area in the bitmap coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// pause - The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
+// Return value:
+// Rendering Status. See flags for progressive process status for the details.
+//
+DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y, int size_x,
+ int size_y, int rotate, int flags,IFSDK_PAUSE * pause);
+
+// Function: FPDF_RenderPage_Continue
+// Continue rendering a PDF page.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// pause - The IFSDK_PAUSE interface.A callback mechanism allowing the page rendering process
+// to be paused before it's finished. This can be NULL if you don't want to pause.
+// Return value:
+// The rendering status. See flags for progressive process status for the details.
+DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause);
+
+// Function: FPDF_RenderPage_Close
+// Release the resource allocate during page rendering. Need to be called after finishing rendering or
+// cancel the rendering.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// NULL
+DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_FPDF_PROGRESSIVE_H_
diff --git a/fpdfsdk/include/fpdf_searchex.h b/fpdfsdk/include/fpdf_searchex.h
new file mode 100644
index 0000000000..c291c0c280
--- /dev/null
+++ b/fpdfsdk/include/fpdf_searchex.h
@@ -0,0 +1,33 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_SEARCH_EX_H
+#define _FPDF_SEARCH_EX_H
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFText_GetCharIndexFromTextIndex
+// Get the actually char index in text_page's internal char list.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// nTextIndex - The index of the text in the string get from FPDFText_GetText.
+// Return value:
+// The index of the character in internal charlist. -1 for error.
+DLLEXPORT int STDCALL FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex);
+
+#ifdef __cplusplus
+};
+#endif
+
+
+#endif
+
diff --git a/fpdfsdk/include/fpdf_sysfontinfo.h b/fpdfsdk/include/fpdf_sysfontinfo.h
new file mode 100644
index 0000000000..00c9fab0e6
--- /dev/null
+++ b/fpdfsdk/include/fpdf_sysfontinfo.h
@@ -0,0 +1,241 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDF_SYSFONTINFO_H
+#define _FPDF_SYSFONTINFO_H
+
+#include "fpdfview.h"
+
+/* Character sets for the font */
+#define FXFONT_ANSI_CHARSET 0
+#define FXFONT_DEFAULT_CHARSET 1
+#define FXFONT_SYMBOL_CHARSET 2
+#define FXFONT_SHIFTJIS_CHARSET 128
+#define FXFONT_HANGEUL_CHARSET 129
+#define FXFONT_GB2312_CHARSET 134
+#define FXFONT_CHINESEBIG5_CHARSET 136
+
+/* Font pitch and family flags */
+#define FXFONT_FF_FIXEDPITCH 1
+#define FXFONT_FF_ROMAN (1<<4)
+#define FXFONT_FF_SCRIPT (4<<4)
+
+/* Typical weight values */
+#define FXFONT_FW_NORMAL 400
+#define FXFONT_FW_BOLD 700
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Interface: FPDF_SYSFONTINFO
+ * Interface for getting system font information and font mapping
+ */
+typedef struct _FPDF_SYSFONTINFO {
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: Release
+ * Give implementation a chance to release any data after the interface is no longer used
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Comments:
+ * Called by Foxit SDK during the final cleanup process.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Return Value:
+ * None
+ */
+ void (*Release)(struct _FPDF_SYSFONTINFO* pThis);
+
+ /**
+ * Method: EnumFonts
+ * Enumerate all fonts installed on the system
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Comments:
+ * Implementation should call FPDF_AddIntalledFont() function for each font found.
+ * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * pMapper - An opaque pointer to internal font mapper, used when calling FPDF_AddInstalledFont
+ * Return Value:
+ * None
+ */
+ void (*EnumFonts)(struct _FPDF_SYSFONTINFO* pThis, void* pMapper);
+
+ /**
+ * Method: MapFont
+ * Use the system font mapper to get a font handle from requested parameters
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes only if GetFont method is not implemented.
+ * Comments:
+ * If the system supports native font mapper (like Windows), implementation can implement this method to get a font handle.
+ * Otherwise, Foxit SDK will do the mapping and then call GetFont method.
+ * Only TrueType/OpenType and Type1 fonts are accepted by Foxit SDK.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * weight - Weight of the requested font. 400 is normal and 700 is bold.
+ * bItalic - Italic option of the requested font, TRUE or FALSE.
+ * charset - Character set identifier for the requested font. See above defined constants.
+ * pitch_family - A combination of flags. See above defined constants.
+ * face - Typeface name. Currently use system local encoding only.
+ * bExact - Pointer to an boolean value receiving the indicator whether mapper found the exact match.
+ * If mapper is not sure whether it's exact match, ignore this paramter.
+ * Return Value:
+ * An opaque pointer for font handle, or NULL if system mapping is not supported.
+ **/
+ void* (*MapFont)(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family,
+ const char* face, int* bExact);
+
+ /**
+ * Method: GetFont
+ * Get a handle to a particular font by its internal ID
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes only if MapFont method is not implemented.
+ * Comments:
+ * If the system mapping not supported, Foxit SDK will do the font mapping and use this method to get a font handle.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * face - Typeface name. Currently use system local encoding only.
+ * Return Value:
+ * An opaque pointer for font handle.
+ **/
+ void* (*GetFont)(struct _FPDF_SYSFONTINFO* pThis, const char* face);
+
+ /**
+ * Method: GetFontData
+ * Get font data from a font
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Comments:
+ * Can read either full font file, or a particular TrueType/OpenType table
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * hFont - Font handle returned by MapFont or GetFont method
+ * table - TrueType/OpenType table identifier (refer to TrueType specification).
+ * 0 for the whole font file.
+ * buffer - The buffer receiving the font data. Can be NULL if not provided
+ * buf_size - Buffer size, can be zero if not provided
+ * Return Value:
+ * Number of bytes needed, if buffer not provided or not large enough,
+ * or number of bytes written into buffer otherwise.
+ **/
+ unsigned long (*GetFontData)(struct _FPDF_SYSFONTINFO* pThis, void* hFont,
+ unsigned int table, unsigned char* buffer, unsigned long buf_size);
+
+ /**
+ * Method: GetFaceName
+ * Get face name from a font handle
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * hFont - Font handle returned by MapFont or GetFont method
+ * buffer - The buffer receiving the face name. Can be NULL if not provided
+ * buf_size - Buffer size, can be zero if not provided
+ * Return Value:
+ * Number of bytes needed, if buffer not provided or not large enough,
+ * or number of bytes written into buffer otherwise.
+ **/
+ unsigned long (*GetFaceName)(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size);
+
+ /**
+ * Method: GetFontCharset
+ * Get character set information for a font handle
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * hFont - Font handle returned by MapFont or GetFont method
+ * Return Value:
+ * Character set identifier. See defined constants above.
+ **/
+ int (*GetFontCharset)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);
+
+ /**
+ * Method: DeleteFont
+ * Delete a font handle
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * hFont - Font handle returned by MapFont or GetFont method
+ * Return Value:
+ * None
+ **/
+ void (*DeleteFont)(struct _FPDF_SYSFONTINFO* pThis, void* hFont);
+} FPDF_SYSFONTINFO;
+
+/**
+ * Function: FPDF_AddInstalledFont
+ * Add a system font to the list in Foxit SDK.
+ * Comments:
+ * This function is only called during the system font list building process.
+ * Parameters:
+ * mapper - Opaque pointer to Foxit font mapper
+ * face - The font face name
+ * charset - Font character set. See above defined constants.
+ * Return Value:
+ * None.
+ **/
+DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* face, int charset);
+
+/**
+ * Function: FPDF_SetSystemFontInfo
+ * Set the system font info interface into Foxit SDK
+ * Comments:
+ * Platform support implementation should implement required methods of FFDF_SYSFONTINFO interface,
+ * then call this function during SDK initialization process.
+ * Parameters:
+ * pFontInfo - Pointer to a FPDF_SYSFONTINFO structure
+ * Return Value:
+ * None
+ **/
+DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfo);
+
+/**
+ * Function: FPDF_GetDefaultSystemFontInfo
+ * Get default system font info interface for current platform
+ * Comments:
+ * For some platforms Foxit SDK implement a default version of system font info interface.
+ * The default implementation can be used in FPDF_SetSystemFontInfo function.
+ * Parameters:
+ * None
+ * Return Value:
+ * Pointer to a FPDF_SYSFONTINFO structure describing the default interface.
+ * Or NULL if the platform doesn't have a default interface.
+ * Application should call FPDF_FreeMemory to free the returned pointer.
+ **/
+DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo();
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // _FPDF_SYSFONTINFO_H
diff --git a/fpdfsdk/include/fpdf_transformpage.h b/fpdfsdk/include/fpdf_transformpage.h
new file mode 100644
index 0000000000..caafeda0e4
--- /dev/null
+++ b/fpdfsdk/include/fpdf_transformpage.h
@@ -0,0 +1,113 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _TRANSFORMPAGE_H_
+#define _TRANSFORMPAGE_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+typedef void* FPDF_PAGEARCSAVER;
+typedef void* FPDF_PAGEARCLOADER;
+/**
+* Set "MediaBox" entry to the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - The left of the rectangle.
+* @param[in] bottom - The bottom of the rectangle.
+* @param[in] right - The right of the rectangle.
+* @param[in] top - The top of the rectangle.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top);
+
+/**
+* Set "CropBox" entry to the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - The left of the rectangle.
+* @param[in] bottom - The bottom of the rectangle.
+* @param[in] right - The right of the rectangle.
+* @param[in] top - The top of the rectangle.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top);
+
+
+/** Get "MediaBox" entry from the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - Pointer to a double value receiving the left of the rectangle.
+* @param[in] bottom - Pointer to a double value receiving the bottom of the rectangle.
+* @param[in] right - Pointer to a double value receiving the right of the rectangle.
+* @param[in] top - Pointer to a double value receiving the top of the rectangle.
+* @retval True if success,else fail.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);
+
+/** Get "CropBox" entry from the page dictionary.
+* @param[in] page - Handle to a page.
+* @param[in] left - Pointer to a double value receiving the left of the rectangle.
+* @param[in] bottom - Pointer to a double value receiving the bottom of the rectangle.
+* @param[in] right - Pointer to a double value receiving the right of the rectangle.
+* @param[in] top - Pointer to a double value receiving the top of the rectangle.
+* @retval True if success,else fail.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top);
+
+/**
+* Transform the whole page with a specified matrix, then clip the page content region.
+*
+* @param[in] page - A page handle.
+* @param[in] matrix - The transform matrix.
+* @param[in] clipRect - A rectangle page area to be clipped.
+* @Note. This function will transform the whole page, and would take effect to all the objects in the page.
+*/
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect);
+
+/**
+* Transform (scale, rotate, shear, move) the clip path of page object.
+* @param[in] page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.
+* @param[in] a - The coefficient "a" of the matrix.
+* @param[in] b - The coefficient "b" of the matrix.
+* @param[in] c - The coefficient "c" of the matrix.
+* @param[in] d - The coefficient "d" of the matrix.
+* @param[in] e - The coefficient "e" of the matrix.
+* @param[in] f - The coefficient "f" of the matrix.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f);
+
+/**
+* Create a new clip path, with a rectangle inserted.
+*
+* @param[in] left - The left of the clip box.
+* @param[in] bottom - The bottom of the clip box.
+* @param[in] right - The right of the clip box.
+* @param[in] top - The top of the clip box.
+* @retval a handle to the clip path.
+*/
+DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top);
+
+/**
+* Destroy the clip path.
+*
+* @param[in] clipPath - A handle to the clip path.
+* Destroy the clip path.
+* @retval None.
+*/
+DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath);
+
+/**
+* Clip the page content, the page content that outside the clipping region become invisible.
+*
+* @param[in] page - A page handle.
+* @param[in] clipPath - A handle to the clip path.
+* @Note. A clip path will be inserted before the page content stream or content array. In this way, the page content will be clipped
+* by this clip path.
+*/
+DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath);
+
+#endif
+
diff --git a/fpdfsdk/include/fpdfdoc.h b/fpdfsdk/include/fpdfdoc.h
new file mode 100644
index 0000000000..35c2c9674c
--- /dev/null
+++ b/fpdfsdk/include/fpdfdoc.h
@@ -0,0 +1,230 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFDOC_H_
+#define _FPDFDOC_H_
+
+#include "fpdfview.h"
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFBookmark_Find
+// Find a bookmark in the document, using the bookmark title.
+// Parameters:
+// document - Handle to the document. Returned by FPDF_LoadDocument or FPDF_LoadMemDocument.
+// title - The UTF-16LE encoded Unicode string for the bookmark title to be searched. Can't be NULL.
+// Return value:
+// Handle to the found bookmark item. NULL if the title can't be found.
+// Comments:
+// It always returns the first found bookmark if more than one bookmarks have the same title.
+//
+DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title);
+
+// Function: FPDFBookmark_GetDest
+// Get the destination associated with a bookmark item.
+// Parameters:
+// document - Handle to the document.
+// bookmark - Handle to the bookmark.
+// Return value:
+// Handle to the destination data. NULL if no destination is associated with this bookmark.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark);
+
+// Function: FPDFBookmark_GetAction
+// Get the action associated with a bookmark item.
+// Parameters:
+// bookmark - Handle to the bookmark.
+// Return value:
+// Handle to the action data. NULL if no action is associated with this bookmark. In this case, the
+// application should try FPDFBookmark_GetDest.
+//
+DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark);
+
+#define PDFACTION_UNSUPPORTED 0 // Unsupported action type.
+#define PDFACTION_GOTO 1 // Go to a destination within current document.
+#define PDFACTION_REMOTEGOTO 2 // Go to a destination within another document.
+#define PDFACTION_URI 3 // Universal Resource Identifier, including web pages and
+ // other Internet based resources.
+#define PDFACTION_LAUNCH 4 // Launch an application or open a file.
+
+// Function: FPDFAction_GetType
+// Get type of an action.
+// Parameters:
+// action - Handle to the action.
+// Return value:
+// A type number as defined above.
+//
+DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action);
+
+// Function: FPDFAction_GetDest
+// Get destination of an action.
+// Parameters:
+// document - Handle to the document.
+// action - Handle to the action. It must be a GOTO or REMOTEGOTO action.
+// Return value:
+// Handle to the destination data.
+// Comments:
+// In case of remote goto action, the application should first use FPDFAction_GetFilePath to
+// get file path, then load that particular document, and use its document handle to call this
+// function.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action);
+
+// Function: FPDFAction_GetURIPath
+// Get URI path of a URI action.
+// Parameters:
+// document - Handle to the document.
+// action - Handle to the action. Must be a URI action.
+// buffer - A buffer for output the path string. Can be NULL.
+// buflen - The length of the buffer, number of bytes. Can be 0.
+// Return value:
+// Number of bytes the URI path consumes, including trailing zeros.
+// Comments:
+// The URI path is always encoded in 7-bit ASCII.
+//
+// The return value always indicated number of bytes required for the buffer, even when there is
+// no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+// be modified.
+//
+DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action,
+ void* buffer, unsigned long buflen);
+
+// Function: FPDFDest_GetPageIndex
+// Get page index of a destination.
+// Parameters:
+// document - Handle to the document.
+// dest - Handle to the destination.
+// Return value:
+// The page index. Starting from 0 for the first page.
+//
+DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest);
+
+// Function: FPDFLink_GetLinkAtPoint
+// Find a link at specified point on a document page.
+// Parameters:
+// page - Handle to the document page.
+// x - The x coordinate of the point, specified in page coordinate system.
+// y - The y coordinate of the point, specified in page coordinate system.
+// Return value:
+// Handle to the link. NULL if no link found at that point.
+// Comments:
+// The point coordinates are specified in page coordinate system. You can convert coordinates
+// from screen system to page system using FPDF_DeviceToPage functions.
+//
+DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y);
+
+// Function: FPDFLink_GetDest
+// Get destination info of a link.
+// Parameters:
+// document - Handle to the document.
+// link - Handle to the link. Returned by FPDFLink_GetLinkAtPoint.
+// Return value:
+// Handle to the destination. NULL if there is no destination associated with the link, in this case
+// the application should try FPDFLink_GetAction.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link);
+
+// Function: FPDFLink_GetAction
+// Get action info of a link.
+// Parameters:
+// link - Handle to the link.
+// Return value:
+// Handle to the action. NULL if there is no action associated with the link.
+//
+DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link);
+
+// Function: FPDFLink_Enumerate
+// This function would enumerate all the link annotations in a single PDF page.
+// Parameters:
+// page[in] - Handle to the page.
+// startPos[in,out] - The start position to enumerate the link annotations, which should be specified to start from
+// - 0 for the first call, and would receive the next position for enumerating to start from.
+// linkAnnot[out] - Receive the link handle.
+// Return value:
+// TRUE if succceed, else False;
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot);
+
+// Function: FPDFLink_GetAnnotRect
+// Get the annotation rectangle. (Specified by the ¡°Rect¡± entry of annotation dictionary).
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// rect[out] - The annotation rect.
+// Return value:
+// TRUE if succceed, else False;
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect);
+
+// Function: FPDFLink_CountQuadPoints
+// Get the count of quadrilateral points to the link annotation.
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// Return value:
+// The count of quadrilateral points.
+//
+DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot);
+
+/* _FS_DEF_STRUCTURE_QUADPOINTSF_ */
+#ifndef _FS_DEF_STRUCTURE_QUADPOINTSF_
+#define _FS_DEF_STRUCTURE_QUADPOINTSF_
+typedef struct _FS_QUADPOINTSF
+{
+ FS_FLOAT x1;
+ FS_FLOAT y1;
+ FS_FLOAT x2;
+ FS_FLOAT y2;
+ FS_FLOAT x3;
+ FS_FLOAT y3;
+ FS_FLOAT x4;
+ FS_FLOAT y4;
+} FS_QUADPOINTSF;
+#endif /* _FS_DEF_STRUCTURE_QUADPOINTSF_ */
+
+// Function: FPDFLink_GetQuadPoints
+// Get the quadrilateral points for the specified index in the link annotation.
+// Parameters:
+// linkAnnot[in] - Handle to the link annotation.
+// quadIndex[in] - The specified quad points index.
+// quadPoints[out] - Receive the quadrilateral points.
+// Return value:
+// True if succeed, else False.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints);
+
+// Function: FPDF_GetMetaText
+// Get a text from meta data of the document. Result is encoded in UTF-16LE.
+// Parameters:
+// doc - Handle to a document
+// tag - The tag for the meta data. Currently, It can be "Title", "Author",
+// "Subject", "Keywords", "Creator", "Producer", "CreationDate", or "ModDate".
+// For detailed explanation of these tags and their respective values,
+// please refer to PDF Reference 1.6, section 10.2.1, "Document Information Dictionary".
+// buffer - A buffer for output the title. Can be NULL.
+// buflen - The length of the buffer, number of bytes. Can be 0.
+// Return value:
+// Number of bytes the title consumes, including trailing zeros.
+// Comments:
+// No matter on what platform, the title is always output in UTF-16LE encoding, which means the buffer
+// can be regarded as an array of WORD (on Intel and compatible CPUs), each WORD represent the Unicode of
+// a character (some special Unicode may take 2 WORDs). The string is followed by two bytes of zero
+// indicating end of the string.
+//
+// The return value always indicated number of bytes required for the buffer, even when there is
+// no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+// be modified.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,
+ void* buffer, unsigned long buflen);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // _FPDFDOC_H_
diff --git a/fpdfsdk/include/fpdfedit.h b/fpdfsdk/include/fpdfedit.h
new file mode 100644
index 0000000000..52fb1484a5
--- /dev/null
+++ b/fpdfsdk/include/fpdfedit.h
@@ -0,0 +1,235 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFEDIT_H_
+#define _FPDFEDIT_H_
+
+#include "fpdfview.h"
+
+// Define all types used in the SDK. Note they can be simply regarded as opaque pointers
+// or long integer numbers.
+
+#define FPDF_ARGB(a,r,g,b) ((((FX_DWORD)(((FX_BYTE)(b)|((FX_WORD)((FX_BYTE)(g))<<8))|(((FX_DWORD)(FX_BYTE)(r))<<16)))) | (((FX_DWORD)(FX_BYTE)(a))<<24))
+#define FPDF_GetBValue(argb) ((FX_BYTE)(argb))
+#define FPDF_GetGValue(argb) ((FX_BYTE)(((FX_WORD)(argb)) >> 8))
+#define FPDF_GetRValue(argb) ((FX_BYTE)((argb)>>16))
+#define FPDF_GetAValue(argb) ((FX_BYTE)((argb)>>24))
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//////////////////////////////////////////////////////////////////////
+//
+// Document functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDF_CreateNewDocument
+// Create a new PDF document.
+// Parameters:
+// None.
+// Return value:
+// A handle to a document. If failed, NULL is returned.
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument();
+
+//////////////////////////////////////////////////////////////////////
+//
+// Page functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPage_New
+// Construct an empty page.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// page_index - The index of a page.
+// width - The page width.
+// height - The page height.
+// Return value:
+// The handle to the page.
+// Comments:
+// Loaded page can be deleted by FPDFPage_Delete.
+DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height);
+
+// Function: FPDFPage_Delete
+// Delete a PDF page.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// page_index - The index of a page.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index);
+
+// Function: FPDFPage_GetRotation
+// Get the page rotation. One of following values will be returned: 0(0), 1(90), 2(180), 3(270).
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// The PDF page rotation.
+// Comment:
+// The PDF page rotation is rotated clockwise.
+DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page);
+
+// Function: FPDFPage_InsertObject
+// Insert an object to the page. The page object is automatically freed.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// page_obj - Handle to a page object. Returned by FPDFPageObj_NewTextObj,FPDFPageObj_NewTextObjEx and
+// FPDFPageObj_NewPathObj.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj);
+
+// Function: FPDFPage_CountObject
+// Get number of page objects inside the page.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// The number of the page object.
+DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page);
+
+// Function: FPDFPage_GetObject
+// Get page object by index.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// index - The index of a page object.
+// Return value:
+// The handle of the page object. Null for failed.
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index);
+
+// Function: FPDFPage_HasTransparency
+// Check that whether the content of specified PDF page contains transparency.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New or FPDF_LoadPage.
+// Return value:
+// TRUE means that the PDF page does contains transparency.
+// Otherwise, returns FALSE.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page);
+
+// Function: FPDFPage_GenerateContent
+// Generate PDF Page content.
+// Parameters:
+// page - Handle to a page. Returned by FPDFPage_New.
+// Return value:
+// True if successful, false otherwise.
+// Comment:
+// Before you save the page to a file, or reload the page, you must call the FPDFPage_GenerateContent function.
+// Or the changed information will be lost.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page);
+
+//////////////////////////////////////////////////////////////////////
+//
+// Page Object functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPageObj_HasTransparency
+// Check that whether the specified PDF page object contains transparency.
+// Parameters:
+// pageObject - Handle to a page object.
+// Return value:
+// TRUE means that the PDF page object does contains transparency.
+// Otherwise, returns FALSE.
+DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject);
+
+// Function: FPDFPageObj_Transform
+// Transform (scale, rotate, shear, move) page object.
+// Parameters:
+// page_object - Handle to a page object. Returned by FPDFPageObj_NewImageObj.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
+ double a, double b, double c, double d, double e, double f);
+
+// Function: FPDFPage_TransformAnnots
+// Transform (scale, rotate, shear, move) all annots in a page.
+// Parameters:
+// page - Handle to a page.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
+ double a, double b, double c, double d, double e, double f);
+
+// The page object constants.
+#define FPDF_PAGEOBJ_TEXT 1
+#define FPDF_PAGEOBJ_PATH 2
+#define FPDF_PAGEOBJ_IMAGE 3
+#define FPDF_PAGEOBJ_SHADING 4
+#define FPDF_PAGEOBJ_FORM 5
+
+//////////////////////////////////////////////////////////////////////
+//
+// Image functions
+//
+//////////////////////////////////////////////////////////////////////
+
+// Function: FPDFPageObj_NewImgeObj
+// Create a new Image Object.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument or FPDF_CreateNewDocument function.
+// Return Value:
+// Handle of image object.
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document);
+
+
+// Function: FPDFImageObj_LoadJpegFile
+// Load Image from a JPEG image file and then set it to an image object.
+// Parameters:
+// pages - Pointers to the start of all loaded pages, could be NULL.
+// nCount - Number of pages, could be 0.
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// fileAccess - The custom file access handler, which specifies the JPEG image file.
+// Return Value:
+// TRUE if successful, FALSE otherwise.
+// Note:
+// The image object might already has an associated image, which is shared and cached by the loaded pages, In this case, we need to clear the cache of image for all the loaded pages.
+// Pass pages and count to this API to clear the image cache.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess);
+
+
+// Function: FPDFImageObj_SetMatrix
+// Set the matrix of an image object.
+// Parameters:
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// a - The coefficient "a" of the matrix.
+// b - The coefficient "b" of the matrix.
+// c - The coefficient "c" of the matrix.
+// d - The coefficient "d" of the matrix.
+// e - The coefficient "e" of the matrix.
+// f - The coefficient "f" of the matrix.
+// Return value:
+// TRUE if successful, FALSE otherwise.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix(FPDF_PAGEOBJECT image_object,
+ double a, double b, double c, double d, double e, double f);
+
+// Function: FPDFImageObj_SetBitmap
+// Set the bitmap to an image object.
+// Parameters:
+// pages - Pointer's to the start of all loaded pages.
+// nCount - Number of pages.
+// image_object - Handle of image object returned by FPDFPageObj_NewImgeObj.
+// bitmap - The handle of the bitmap which you want to set it to the image object.
+// Return value:
+// TRUE if successful, FALSE otherwise.
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object, FPDF_BITMAP bitmap);
+
+#ifdef __cplusplus
+}
+#endif
+#endif // _FPDFEDIT_H_
diff --git a/fpdfsdk/include/fpdfformfill.h b/fpdfsdk/include/fpdfformfill.h
new file mode 100644
index 0000000000..0e7556e0a8
--- /dev/null
+++ b/fpdfsdk/include/fpdfformfill.h
@@ -0,0 +1,841 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+
+#ifndef _FPDFORMFILL_H
+#define _FPDFORMFILL_H
+#include "fpdfview.h"
+
+typedef void* FPDF_FORMHANDLE;
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _IPDF_JsPlatform
+{
+/**
+* Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: app_alert
+ * pop up a dialog to show warning or hint.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Msg - A string containing the message to be displayed.
+ * Title - The title of the dialog.
+ * Type - The stype of button group.
+ * 0-OK(default);
+ * 1-OK,Cancel;
+ * 2-Yes,NO;
+ * 3-Yes, NO, Cancel.
+ * nIcon - The Icon type.
+ * 0-Error(default);
+ * 1-Warning;
+ * 2-Question;
+ * 3-Status.
+ * Return Value:
+ * The return value could be the folowing type:
+ * 1-OK;
+ * 2-Cancel;
+ * 3-NO;
+ * 4-Yes;
+ */
+ int (*app_alert)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Msg, FPDF_WIDESTRING Title, int Type, int Icon);
+
+ /**
+ * Method: app_beep
+ * Causes the system to play a sound.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * nType - The sound type.
+ * 0 - Error
+ * 1 - Warning
+ * 2 - Question
+ * 3 - Status
+ * 4 - Default (default value)
+ * Return Value:
+ * None
+ */
+ void (*app_beep)(struct _IPDF_JsPlatform* pThis, int nType);
+
+
+ /**
+ * Method: app_response
+ * Displays a dialog box containing a question and an entry field for the user to reply to the question.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Question - The question to be posed to the user.
+ * Title - The title of the dialog box.
+ * Default - A default value for the answer to the question. If not specified, no default value is presented.
+ * cLabel - A short string to appear in front of and on the same line as the edit text field.
+ * bPassword - If true, indicates that the user's response should show as asterisks (*) or bullets (?) to mask the response, which might be sensitive information. The default is false.
+ * response - A string buffer allocated by SDK, to receive the user's response.
+ * length - The length of the buffer, number of bytes. Currently, It's always be 2048.
+ * Return Value:
+ * Number of bytes the user input text consumes, not including trailing zeros. If the text exceed 2048 bytes,
+ * the exceeded part will be ignored.
+ * Comments:
+ * No matter on what platform, the response should be always input in UTF-16LE encoding.
+ * The return value always indicated number of bytes required for the buffer, even when there is
+ * no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+ * be modified.
+ */
+ int (*app_response)(struct _IPDF_JsPlatform* pThis, FPDF_WIDESTRING Question, FPDF_WIDESTRING Title, FPDF_WIDESTRING Default, FPDF_WIDESTRING cLabel, FPDF_BOOL bPassword, void* response, int length);
+
+
+
+ /*
+ * Method: Doc_getFilePath
+ * Get the file path of the current document.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * filePath - The string buffer to receive the file path. Can be NULL.
+ * length - The length of the buffer, number of bytes. Can be 0.
+ * Return Value:
+ * Number of bytes the filePath consumes, including trailing zeros.
+ * Comments:
+ * The filePath should be always input in local encoding.
+ *
+ * The return value always indicated number of bytes required for the buffer, even when there is
+ * no buffer specified, or the buffer size is less then required. In this case, the buffer will not
+ * be modified.
+ */
+ int (*Doc_getFilePath)(struct _IPDF_JsPlatform* pThis, void* filePath, int length);
+
+
+ /*
+ * Method: Doc_mail
+ * Mails the data buffer as an attachment to all recipients, with or without user interaction.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * mailData - Pointer to the data buffer to be sent.Can be NULL.
+ * length - The size,in bytes, of the buffer pointed by mailData parameter.Can be 0.
+ * bUI - If true, the rest of the parameters are used in a compose-new-message window that is displayed to the user. If false, the cTo parameter is required and all others are optional.
+ * To - A semicolon-delimited list of recipients for the message.
+ * Subject - The subject of the message. The length limit is 64 KB.
+ * CC - A semicolon-delimited list of CC recipients for the message.
+ * BCC - A semicolon-delimited list of BCC recipients for the message.
+ * Msg - The content of the message. The length limit is 64 KB.
+ * Return Value:
+ * None.
+ * Comments:
+ * If the parameter mailData is NULL or length is 0, the current document will be mailed as an attachment to all recipients.
+ */
+ void (*Doc_mail)(struct _IPDF_JsPlatform* pThis,void* mailData, int length,FPDF_BOOL bUI, FPDF_WIDESTRING To, FPDF_WIDESTRING Subject, FPDF_WIDESTRING CC, FPDF_WIDESTRING BCC, FPDF_WIDESTRING Msg);
+
+
+ /*
+ * Method: Doc_print
+ * Prints all or a specific number of pages of the document.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * bUI - If true, will cause a UI to be presented to the user to obtain printing information and confirm the action.
+ * nStart - A 0-based index that defines the start of an inclusive range of pages.
+ * nEnd - A 0-based index that defines the end of an inclusive page range.
+ * bSilent - If true, suppresses the cancel dialog box while the document is printing. The default is false.
+ * bShrinkToFit - If true, the page is shrunk (if necessary) to fit within the imageable area of the printed page.
+ * bPrintAsImage - If true, print pages as an image.
+ * bReverse - If true, print from nEnd to nStart.
+ * bAnnotations - If true (the default), annotations are printed.
+ */
+ void (*Doc_print)(struct _IPDF_JsPlatform* pThis, FPDF_BOOL bUI, int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations);
+
+ /*
+ * Method: Doc_submitForm
+ * Send the form data to a specified URL.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * formData - Pointer to the data buffer to be sent.
+ * length - The size,in bytes, of the buffer pointed by formData parameter.
+ * URL - The URL to send to.
+ * Return Value:
+ * None.
+ *
+ */
+ void (*Doc_submitForm)(struct _IPDF_JsPlatform* pThis,void* formData, int length, FPDF_WIDESTRING URL);
+
+ /*
+ * Method: Doc_gotoPage
+ * Jump to a specified page.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * nPageNum - The specified page number, zero for the first page.
+ * Return Value:
+ * None.
+ *
+ */
+ void (*Doc_gotoPage)(struct _IPDF_JsPlatform* pThis, int nPageNum);
+ /*
+ * Method: Field_browse
+ * Show a file selection dialog, and return the selected file path.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * filePath - Pointer to the data buffer to receive the file path.Can be NULL.
+ * length - The length of the buffer, number of bytes. Can be 0.
+ * Return Value:
+ * Number of bytes the filePath consumes, including trailing zeros.
+ * Comments:
+ * The filePath shoule be always input in local encoding.
+ */
+ int (*Field_browse)(struct _IPDF_JsPlatform* pThis,void* filePath, int length);
+
+ /**
+ * pointer to FPDF_FORMFILLINFO interface.
+ **/
+ void* m_pFormfillinfo;
+} IPDF_JSPLATFORM;
+
+// Flags for Cursor type
+#define FXCT_ARROW 0
+#define FXCT_NESW 1
+#define FXCT_NWSE 2
+#define FXCT_VBEAM 3
+#define FXCT_HBEAM 4
+#define FXCT_HAND 5
+
+/**
+ * Declares of a pointer type to the callback function for the FFI_SetTimer method.
+ * Parameters:
+ * idEvent - Identifier of the timer.
+ * Return value:
+ * None.
+ **/
+typedef void (*TimerCallback)(int idEvent);
+
+/**
+ * Declares of a struct type to the local system time.
+**/
+typedef struct _FPDF_SYSTEMTIME
+{
+ unsigned short wYear; /* years since 1900 */
+ unsigned short wMonth; /* months since January - [0,11] */
+ unsigned short wDayOfWeek; /* days since Sunday - [0,6] */
+ unsigned short wDay; /* day of the month - [1,31] */
+ unsigned short wHour; /* hours since midnight - [0,23] */
+ unsigned short wMinute; /* minutes after the hour - [0,59] */
+ unsigned short wSecond; /* seconds after the minute - [0,59] */
+ unsigned short wMilliseconds; /* milliseconds after the second - [0,999] */
+}FPDF_SYSTEMTIME;
+
+
+typedef struct _FPDF_FORMFILLINFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: Release
+ * Give implementation a chance to release any data after the interface is no longer used
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Comments:
+ * Called by Foxit SDK during the final cleanup process.
+ * Parameters:
+ * pThis - Pointer to the interface structure itself
+ * Return Value:
+ * None
+ */
+
+ void (*Release)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_Invalidate
+ * Invalidate the client area within the specified rectangle.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * left - Left position of the client area in PDF page coordinate.
+ * top - Top position of the client area in PDF page coordinate.
+ * right - Right position of the client area in PDF page coordinate.
+ * bottom - Bottom position of the client area in PDF page coordinate.
+ * Return Value:
+ * None.
+ *
+ *comments:
+ * All positions are measured in PDF "user space".
+ * Implementation should call FPDF_RenderPageBitmap() function for repainting a specified page area.
+ */
+ void (*FFI_Invalidate)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);
+
+ /**
+ * Method: FFI_OutputSelectedRect
+ * When user is taking the mouse to select texts on a form field, this callback function will keep
+ * returning the selected areas to the implementation.
+ *
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * left - Left position of the client area in PDF page coordinate.
+ * top - Top position of the client area in PDF page coordinate.
+ * right - Right position of the client area in PDF page coordinate.
+ * bottom - Bottom position of the client area in PDF page coordinate.
+ * Return Value:
+ * None.
+ *
+ * comments:
+ * This CALLBACK function is useful for implementing special text selection effect. Implementation should
+ * first records the returned rectangles, then draw them one by one at the painting period, last,remove all
+ * the recorded rectangles when finish painting.
+ */
+ void (*FFI_OutputSelectedRect)(struct _FPDF_FORMFILLINFO* pThis,FPDF_PAGE page, double left, double top, double right, double bottom);
+
+ /**
+ * Method: FFI_SetCursor
+ * Set the Cursor shape.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nCursorType - Cursor type. see Flags for Cursor type for the details.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_SetCursor)(struct _FPDF_FORMFILLINFO* pThis, int nCursorType);
+
+ /**
+ * Method: FFI_SetTimer
+ * This method installs a system timer. A time-out value is specified,
+ * and every time a time-out occurs, the system passes a message to
+ * the TimerProc callback function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * uElapse - Specifies the time-out value, in milliseconds.
+ * lpTimerFunc - A pointer to the callback function-TimerCallback.
+ * Return value:
+ * The timer identifier of the new timer if the function is successful.
+ * An application passes this value to the FFI_KillTimer method to kill
+ * the timer. Nonzero if it is successful; otherwise, it is zero.
+ * */
+ int (*FFI_SetTimer)(struct _FPDF_FORMFILLINFO* pThis, int uElapse, TimerCallback lpTimerFunc);
+
+ /**
+ * Method: FFI_KillTimer
+ * This method kills the timer event identified by nIDEvent, set by an earlier call to FFI_SetTimer.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nTimerID - The timer ID return by FFI_SetTimer function.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_KillTimer)(struct _FPDF_FORMFILLINFO* pThis, int nTimerID);
+
+
+ /**
+ * Method: FFI_GetLocalTime
+ * This method receives the current local time on the system.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+ FPDF_SYSTEMTIME (*FFI_GetLocalTime)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_OnChange
+ * This method will be invoked to notify implementation when the value of any FormField on the document had been changed.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * no
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+ void (*FFI_OnChange)(struct _FPDF_FORMFILLINFO* pThis);
+
+ /**
+ * Method: FFI_GetPage
+ * This method receives the page pointer associated with a specified page index.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * nPageIndex - Index number of the page. 0 for the first page.
+ * Return value:
+ * Handle to the page. Returned by FPDF_LoadPage function.
+ * Comments:
+ * In some cases, the document-level JavaScript action may refer to a page which hadn't been loaded yet.
+ * To successfully run the javascript action, implementation need to load the page for SDK.
+ * */
+ FPDF_PAGE (*FFI_GetPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document, int nPageIndex);
+
+ /**
+ * Method: FFI_GetCurrentPage
+ * This method receives the current page pointer.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * Return value:
+ * Handle to the page. Returned by FPDF_LoadPage function.
+ * */
+ FPDF_PAGE (*FFI_GetCurrentPage)(struct _FPDF_FORMFILLINFO* pThis, FPDF_DOCUMENT document);
+
+ /**
+ * Method: FFI_GetRotation
+ * This method receives currently rotation of the page view.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * page - Handle to page. Returned by FPDF_LoadPage function.
+ * Return value:
+ * The page rotation. Should be 0(0 degree),1(90 degree),2(180 degree),3(270 degree), in a clockwise direction.
+ * */
+ int (*FFI_GetRotation)(struct _FPDF_FORMFILLINFO* pThis, FPDF_PAGE page);
+
+ /**
+ * Method: FFI_ExecuteNamedAction
+ * This method will execute an named action.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * namedAction - A byte string which indicates the named action, terminated by 0.
+ * Return value:
+ * None.
+ * Comments:
+ * See the named actions description of <<PDF Reference, version 1.7>> for more details.
+ * */
+ void (*FFI_ExecuteNamedAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING namedAction);
+ /**
+ * @brief This method will be called when a text field is getting or losing a focus.
+ *
+ * @param[in] pThis Pointer to the interface structure itself.
+ * @param[in] value The string value of the form field, in UTF-16LE format.
+ * @param[in] valueLen The length of the string value, number of characters (not bytes).
+ * @param[in] is_focus True if the form field is getting a focus, False for losing a focus.
+ *
+ * @return None.
+ *
+ * @note Currently,only support text field and combobox field.
+ * */
+ void (*FFI_SetTextFieldFocus)(struct _FPDF_FORMFILLINFO* pThis, FPDF_WIDESTRING value, FPDF_DWORD valueLen, FPDF_BOOL is_focus);
+
+
+ /**
+ * Method: FFI_DoURIAction
+ * This action resolves to a uniform resource identifier.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * bsURI - A byte string which indicates the uniform resource identifier, terminated by 0.
+ * Return value:
+ * None.
+ * Comments:
+ * See the URI actions description of <<PDF Reference, version 1.7>> for more details.
+ * */
+ void (*FFI_DoURIAction)(struct _FPDF_FORMFILLINFO* pThis, FPDF_BYTESTRING bsURI);
+
+ /**
+ * Method: FFI_DoGoToAction
+ * This action changes the view to a specified destination.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * No
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * nPageIndex - The index of the PDF page.
+ * zoomMode - The zoom mode for viewing page.See Macros "PDFZOOM_XXX" defined in "fpdfdoc.h".
+ * fPosArray - The float array which carries the position info.
+ * sizeofArray - The size of float array.
+ * Return value:
+ * None.
+ * Comments:
+ * See the Destinations description of <<PDF Reference, version 1.7>> in 8.2.1 for more details.
+ **/
+ void (*FFI_DoGoToAction)(struct _FPDF_FORMFILLINFO* pThis, int nPageIndex, int zoomMode, float* fPosArray, int sizeofArray);
+ /**
+ * pointer to IPDF_JSPLATFORM interface
+ **/
+ IPDF_JSPLATFORM* m_pJsPlatform;
+
+} FPDF_FORMFILLINFO;
+
+
+
+/**
+ * Function: FPDFDOC_InitFormFillEnviroument
+ * Init form fill environment.
+ * Comments:
+ * This function should be called before any form fill operation.
+ * Parameters:
+ * document - Handle to document. Returned by FPDF_LoadDocument function.
+ * pFormFillInfo - Pointer to a FPDF_FORMFILLINFO structure.
+ * Return Value:
+ * Return handler to the form fill module. NULL means fails.
+ **/
+DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo);
+
+/**
+ * Function: FPDFDOC_ExitFormFillEnviroument
+ * Exit form fill environment.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NULL.
+ **/
+DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle);
+
+/**
+ * Function: FORM_OnAfterLoadPage
+ * This method is required for implementing all the form related functions. Should be invoked after user
+ * successfully loaded a PDF page, and method FPDFDOC_InitFormFillEnviroument had been invoked.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);
+
+/**
+ * Function: FORM_OnBeforeClosePage
+ * This method is required for implementing all the form related functions. Should be invoked before user
+ * close the PDF page.
+ * Parameters:
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle);
+
+/**
+* Function: FORM_DoDocumentJSAction
+* This method is required for performing Document-level JavaScript action. It should be invoked after the PDF document
+* had been loaded.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* Return Value:
+* NONE
+* Comments:
+* If there is Document-level JavaScript action embedded in the document, this method will execute the javascript action;
+* otherwise, the method will do nothing.
+**/
+DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle);
+
+
+/**
+* Function: FORM_DoDocumentOpenAction
+* This method is required for performing open-action when the document is opened.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if there is no open-actions embedded in the document.
+**/
+DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle);
+
+
+// additional actions type of document.
+#define FPDFDOC_AACTION_WC 0x10 //WC, before closing document, JavaScript action.
+#define FPDFDOC_AACTION_WS 0x11 //WS, before saving document, JavaScript action.
+#define FPDFDOC_AACTION_DS 0x12 //DS, after saving document, JavaScript action.
+#define FPDFDOC_AACTION_WP 0x13 //WP, before printing document, JavaScript action.
+#define FPDFDOC_AACTION_DP 0x14 //DP, after printing document, JavaScript action.
+/**
+* Function: FORM_DoDocumentAAction
+* This method is required for performing the document's additional-action.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* aaType - The type of the additional-actions which defined above.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if there is no document additional-action corresponding to the specified aaType.
+**/
+
+DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType);
+
+// Additional-action types of page object
+#define FPDFPAGE_AACTION_OPEN 0 // /O -- An action to be performed when the page is opened
+#define FPDFPAGE_AACTION_CLOSE 1 // /C -- An action to be performed when the page is closed
+
+/**
+* Function: FORM_DoPageAAction
+* This method is required for performing the page object's additional-action when opened or closed.
+* Parameters:
+* page - Handle to the page. Returned by FPDF_LoadPage function.
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* aaType - The type of the page object's additional-actions which defined above.
+* Return Value:
+* NONE
+* Comments:
+* This method will do nothing if no additional-action corresponding to the specified aaType exists.
+**/
+DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType);
+
+/**
+ * Function: FORM_OnMouseMove
+ * You can call this member function when the mouse cursor moves.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in PDF user space.
+ * page_y - Specifies the y-coordinate of the cursor in PDF user space.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnLButtonDown
+ * You can call this member function when the user presses the left mouse button.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in PDF user space.
+ * page_y - Specifies the y-coordinate of the cursor in PDF user space.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnLButtonUp
+ * You can call this member function when the user releases the left mouse button.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * modifier - Indicates whether various virtual keys are down.
+ * page_x - Specifies the x-coordinate of the cursor in device.
+ * page_y - Specifies the y-coordinate of the cursor in device.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int modifier, double page_x, double page_y);
+
+/**
+ * Function: FORM_OnKeyDown
+ * You can call this member function when a nonsystem key is pressed.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nKeyCode - Indicates whether various virtual keys are down.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);
+
+/**
+ * Function: FORM_OnKeyUp
+ * You can call this member function when a nonsystem key is released.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nKeyCode - The virtual-key code of the given key.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nKeyCode, int modifier);
+
+/**
+ * Function: FORM_OnChar
+ * You can call this member function when a keystroke translates to a nonsystem character.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * nChar - The character code value of the key.
+ * modifier - Contains the scan code, key-transition code, previous key state, and context code.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle,FPDF_PAGE page, int nChar, int modifier);
+
+/**
+ * Function: FORM_ForceToKillFocus.
+ * You can call this member function to force to kill the focus of the form field which got focus.
+ * It would kill the focus on the form field, save the value of form field if it's changed by user.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * TRUE indicates success; otherwise false.
+ **/
+DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle);
+
+// Field Types
+#define FPDF_FORMFIELD_UNKNOWN 0 // Unknown.
+#define FPDF_FORMFIELD_PUSHBUTTON 1 // push button type.
+#define FPDF_FORMFIELD_CHECKBOX 2 // check box type.
+#define FPDF_FORMFIELD_RADIOBUTTON 3 // radio button type.
+#define FPDF_FORMFIELD_COMBOBOX 4 // combo box type.
+#define FPDF_FORMFIELD_LISTBOX 5 // list box type.
+#define FPDF_FORMFIELD_TEXTFIELD 6 // text field type.
+
+/**
+ * Function: FPDPage_HasFormFieldAtPoint
+ * Check the form filed position by point.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * page - Handle to the page. Returned by FPDF_LoadPage function.
+ * page_x - X position in PDF "user space".
+ * page_y - Y position in PDF "user space".
+ * Return Value:
+ * Return the type of the formfiled; -1 indicates no fields.
+ **/
+DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle,FPDF_PAGE page,double page_x, double page_y);
+
+/**
+ * Function: FPDF_SetFormFieldHighlightColor
+ * Set the highlight color of specified or all the form fields in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * doc - Handle to the document. Returned by FPDF_LoadDocument function.
+ * fieldType - A 32-bit integer indicating the type of a form field(defined above).
+ * color - The highlight color of the form field.Constructed by 0xxxrrggbb.
+ * Return Value:
+ * NONE.
+ * Comments:
+ * When the parameter fieldType is set to zero, the highlight color will be applied to all the form fields in the
+ * document.
+ * Please refresh the client window to show the highlight immediately if necessary.
+ **/
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color);
+
+/**
+ * Function: FPDF_SetFormFieldHighlightAlpha
+ * Set the transparency of the form field highlight color in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * doc - Handle to the document. Returned by FPDF_LoadDocument function.
+ * alpha - The transparency of the form field highlight color. between 0-255.
+ * Return Value:
+ * NONE.
+ **/
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha);
+
+
+/**
+ * Function: FPDF_RemoveFormFieldHighlight
+ * Remove the form field highlight color in the document.
+ * Parameters:
+ * hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+ * Return Value:
+ * NONE.
+ * Comments:
+ * Please refresh the client window to remove the highlight immediately if necessary.
+ **/
+DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle);
+
+/**
+* Function: FPDF_FFLDraw
+* Render FormFeilds on a page to a device independent bitmap.
+* Parameters:
+* hHandle - Handle to the form fill module. Returned by FPDFDOC_InitFormFillEnviroument.
+* bitmap - Handle to the device independent bitmap (as the output buffer).
+* Bitmap handle can be created by FPDFBitmap_Create function.
+* page - Handle to the page. Returned by FPDF_LoadPage function.
+* start_x - Left pixel position of the display area in the device coordinate.
+* start_y - Top pixel position of the display area in the device coordinate.
+* size_x - Horizontal size (in pixels) for displaying the page.
+* size_y - Vertical size (in pixels) for displaying the page.
+* rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+* 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+* flags - 0 for normal display, or combination of flags defined above.
+* Return Value:
+* None.
+* Comments:
+* This method is designed to only render annotations and FormFields on the page.
+* Without FPDF_ANNOT specified for flags, Rendering functions such as FPDF_RenderPageBitmap or FPDF_RenderPageBitmap_Start will only render page contents(without annotations) to a bitmap.
+* In order to implement the FormFill functions,Implementation should call this method after rendering functions finish rendering the page contents.
+**/
+DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle,FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
+ int size_x, int size_y, int rotate, int flags);
+
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDFORMFILL_H
+
diff --git a/fpdfsdk/include/fpdfoom.h b/fpdfsdk/include/fpdfoom.h
new file mode 100644
index 0000000000..638b012b74
--- /dev/null
+++ b/fpdfsdk/include/fpdfoom.h
@@ -0,0 +1,61 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFOOM_H_
+#define _FPDFOOM_H_
+
+#ifndef _FPDFVIEW_H_
+#include "fpdfview.h"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _OOM_INFO
+{
+ /**
+ * Version number of the interface. Currently must be 1.
+ **/
+ int version;
+
+ /**
+ * Method: FSDK_OOM_Handler
+ * Out-Of-Memory handling function.
+ * Interface Version:
+ * 1
+ * Implementation Required:
+ * Yes
+ * Parameters:
+ * pThis - Pointer to the interface structure itself.
+ * Return value:
+ * None.
+ * */
+
+ void(*FSDK_OOM_Handler)(_OOM_INFO* pThis);
+}OOM_INFO;
+
+
+/**
+ * Function: FSDK_SetOOMHandler
+ * Setup A Out-Of-Memory handler for foxit sdk.
+ * Parameters:
+ * oomInfo - Pointer to a OOM_INFO structure.
+ * Return Value:
+ * TRUE means successful. FALSE means fails.
+ **/
+
+DLLEXPORT FPDF_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+
+
+
+#endif
diff --git a/fpdfsdk/include/fpdfppo.h b/fpdfsdk/include/fpdfppo.h
new file mode 100644
index 0000000000..5f77b5bf8d
--- /dev/null
+++ b/fpdfsdk/include/fpdfppo.h
@@ -0,0 +1,34 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFPPO_H_
+#define _FPDFPPO_H_
+
+#include "fpdfview.h"
+
+// Function: FPDF_ImportPages
+// Import some pages to a PDF document.
+// Parameters:
+// dest_doc - The destination document which add the pages.
+// src_doc - A document to be imported.
+// pagerange - A page range string, Such as "1,3,5-7".
+// If this parameter is NULL, it would import all pages in src_doc.
+// index - The page index wanted to insert from.
+// Return value:
+// TRUE for succeed, FALSE for Failed.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc, FPDF_BYTESTRING pagerange, int index);
+
+
+// Function: FPDF_CopyViewerPreferences
+// Copy the viewer preferences from one PDF document to another.#endif
+// Parameters:
+// dest_doc - Handle to document to write the viewer preferences to.
+// src_doc - Handle to document with the viewer preferences.
+// Return value:
+// TRUE for success, FALSE for failure.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc);
+#endif
+
diff --git a/fpdfsdk/include/fpdfsave.h b/fpdfsdk/include/fpdfsave.h
new file mode 100644
index 0000000000..be340f44a1
--- /dev/null
+++ b/fpdfsdk/include/fpdfsave.h
@@ -0,0 +1,81 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFSAVE_H_
+#define _FPDFSAVE_H_
+
+#include "fpdfview.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+// Structure for custom file write
+struct FPDF_FILEWRITE{
+
+ //
+ //Version number of the interface. Currently must be 1.
+ //
+ int version;
+
+ //
+ // Method: WriteBlock
+ // Output a block of data in your custom way.
+ // Interface Version:
+ // 1
+ // Implementation Required:
+ // Yes
+ // Comments:
+ // Called by function FPDF_SaveDocument
+ // Parameters:
+ // pThis - Pointer to the structure itself
+ // pData - Pointer to a buffer to output
+ // size - The size of the buffer.
+ // Return value:
+ // Should be non-zero if successful, zero for error.
+ //
+ int (*WriteBlock)( FPDF_FILEWRITE* pThis, const void* pData, unsigned long size);
+
+};
+
+
+/** @brief Incremental. */
+#define FPDF_INCREMENTAL 1
+/** @brief No Incremental. */
+#define FPDF_NO_INCREMENTAL 2
+
+
+// Function: FPDF_SaveAsCopy
+// Saves the copy of specified document in custom way.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument and FPDF_CreateNewDocument.
+// pFileWrite - A pointer to a custom file write structure.
+// flags - The creating flags.
+// Return value:
+// TRUE for succeed, FALSE for failed.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy( FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags );
+
+// Function: FPDF_SaveWithVersion
+// Same as function ::FPDF_SaveAsCopy, except the file version of the saved document could be specified by user.
+// Parameters:
+// document - Handle to document.
+// pFileWrite - A pointer to a custom file write structure.
+// flags - The creating flags.
+// fileVersion - The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
+// Return value:
+// TRUE if succeed, FALSE if failed.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags, int fileVersion);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif //_FPDFSAVE_H_
diff --git a/fpdfsdk/include/fpdftext.h b/fpdfsdk/include/fpdftext.h
new file mode 100644
index 0000000000..f862db4cbe
--- /dev/null
+++ b/fpdfsdk/include/fpdftext.h
@@ -0,0 +1,316 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFTEXT_H_
+#define _FPDFTEXT_H_
+
+#include "fpdfview.h"
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDFText_LoadPage
+// Prepare information about all characters in a page.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function (in FPDFVIEW module).
+// Return value:
+// A handle to the text page information structure.
+// NULL if something goes wrong.
+// Comments:
+// Application must call FPDFText_ClosePage to release the text page information.
+// If you don't purchase Text Module , this function will return NULL.
+//
+DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page);
+
+// Function: FPDFText_ClosePage
+// Release all resources allocated for a text page information structure.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFText_CountChars
+// Get number of characters in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return value:
+// Number of characters in the page. Return -1 for error.
+// Generated characters, like additional space characters, new line characters, are also counted.
+// Comments:
+// Characters in a page form a "stream", inside the stream, each character has an index.
+// We will use the index parameters in many of FPDFTEXT functions. The first character in the page
+// has an index value of zero.
+//
+DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFText_GetUnicode
+// Get Unicode of a character in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// Return value:
+// The Unicode of the particular character.
+// If a character is not encoded in Unicode and Foxit engine can't convert to Unicode,
+// the return value will be zero.
+//
+DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index);
+
+// Function: FPDFText_GetFontSize
+// Get the font size of a particular character.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// Return value:
+// The font size of the particular character, measured in points (about 1/72 inch).
+// This is the typographic size of the font (so called "em size").
+//
+DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index);
+
+// Function: FPDFText_GetCharBox
+// Get bounding box of a particular character.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// index - Zero-based index of the character.
+// left - Pointer to a double number receiving left position of the character box.
+// right - Pointer to a double number receiving right position of the character box.
+// bottom - Pointer to a double number receiving bottom position of the character box.
+// top - Pointer to a double number receiving top position of the character box.
+// Return Value:
+// None.
+// Comments:
+// All positions are measured in PDF "user space".
+//
+DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index, double* left,
+ double* right, double* bottom, double* top);
+
+// Function: FPDFText_GetCharIndexAtPos
+// Get the index of a character at or nearby a certain position on the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// x - X position in PDF "user space".
+// y - Y position in PDF "user space".
+// xTolerance - An x-axis tolerance value for character hit detection, in point unit.
+// yTolerance - A y-axis tolerance value for character hit detection, in point unit.
+// Return Value:
+// The zero-based index of the character at, or nearby the point (x,y).
+// If there is no character at or nearby the point, return value will be -1.
+// If an error occurs, -3 will be returned.
+//
+DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,
+ double x, double y, double xTorelance, double yTolerance);
+
+// Function: FPDFText_GetText
+// Extract unicode text string from the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// start_index - Index for the start characters.
+// count - Number of characters to be extracted.
+// result - A buffer (allocated by application) receiving the extracted unicodes.
+// The size of the buffer must be able to hold the number of characters plus a terminator.
+// Return Value:
+// Number of characters written into the result buffer, including the trailing terminator.
+// Comments:
+// This function ignores characters without unicode information.
+//
+DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page, int start_index, int count, unsigned short* result);
+
+// Function: FPDFText_CountRects
+// Count number of rectangular areas occupied by a segment of texts.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// start_index - Index for the start characters.
+// count - Number of characters.
+// Return value:
+// Number of rectangles. Zero for error.
+// Comments:
+// This function, along with FPDFText_GetRect can be used by applications to detect the position
+// on the page for a text segment, so proper areas can be highlighted or something.
+// FPDFTEXT will automatically merge small character boxes into bigger one if those characters
+// are on the same line and use same font settings.
+//
+DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page, int start_index, int count);
+
+// Function: FPDFText_GetRect
+// Get a rectangular area from the result generated by FPDFText_CountRects.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// rect_index - Zero-based index for the rectangle.
+// left - Pointer to a double value receiving the rectangle left boundary.
+// top - Pointer to a double value receiving the rectangle top boundary.
+// right - Pointer to a double value receiving the rectangle right boundary.
+// bottom - Pointer to a double value receiving the rectangle bottom boundary.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page, int rect_index, double* left, double* top,
+ double* right, double* bottom);
+
+// Function: FPDFText_GetBoundedText
+// Extract unicode text within a rectangular boundary on the page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// left - Left boundary.
+// top - Top boundary.
+// right - Right boundary.
+// bottom - Bottom boundary.
+// buffer - A unicode buffer.
+// buflen - Number of characters (not bytes) for the buffer, excluding an additional terminator.
+// Return Value:
+// If buffer is NULL or buflen is zero, return number of characters (not bytes) needed,
+// otherwise, return number of characters copied into the buffer.
+//
+DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top,
+ double right, double bottom,unsigned short* buffer,int buflen);
+
+
+// Flags used by FPDFText_FindStart function.
+#define FPDF_MATCHCASE 0x00000001 //If not set, it will not match case by default.
+#define FPDF_MATCHWHOLEWORD 0x00000002 //If not set, it will not match the whole word by default.
+
+// Function: FPDFText_FindStart
+// Start a search.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// findwhat - A unicode match pattern.
+// flags - Option flags.
+// start_index - Start from this character. -1 for end of the page.
+// Return Value:
+// A handle for the search context. FPDFText_FindClose must be called to release this handle.
+//
+DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page, FPDF_WIDESTRING findwhat,
+ unsigned long flags, int start_index);
+
+// Function: FPDFText_FindNext
+// Search in the direction from page start to end.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Whether a match is found.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_FindPrev
+// Search in the direction from page end to start.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Whether a match is found.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_GetSchResultIndex
+// Get the starting character index of the search result.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Index for the starting character.
+//
+DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_GetSchCount
+// Get the number of matched characters in the search result.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// Number of matched characters.
+//
+DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle);
+
+// Function: FPDFText_FindClose
+// Release a search context.
+// Parameters:
+// handle - A search context handle returned by FPDFText_FindStart.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle);
+
+// Function: FPDFLink_LoadWebLinks
+// Prepare information about weblinks in a page.
+// Parameters:
+// text_page - Handle to a text page information structure. Returned by FPDFText_LoadPage function.
+// Return Value:
+// A handle to the page's links information structure.
+// NULL if something goes wrong.
+// Comments:
+// Weblinks are those links implicitly embedded in PDF pages. PDF also has a type of
+// annotation called "link", FPDFTEXT doesn't deal with that kind of link.
+// FPDFTEXT weblink feature is useful for automatically detecting links in the page
+// contents. For example, things like "http://www.foxitsoftware.com" will be detected,
+// so applications can allow user to click on those characters to activate the link,
+// even the PDF doesn't come with link annotations.
+//
+// FPDFLink_CloseWebLinks must be called to release resources.
+//
+DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page);
+
+// Function: FPDFLink_CountWebLinks
+// Count number of detected web links.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// Return Value:
+// Number of detected web links.
+//
+DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page);
+
+// Function: FPDFLink_GetURL
+// Fetch the URL information for a detected web link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// buffer - A unicode buffer.
+// buflen - Number of characters (not bytes) for the buffer, including an additional terminator.
+// Return Value:
+// If buffer is NULL or buflen is zero, return number of characters (not bytes and an additional terminator is also counted) needed,
+// otherwise, return number of characters copied into the buffer.
+//
+DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page, int link_index, unsigned short* buffer,int buflen);
+
+// Function: FPDFLink_CountRects
+// Count number of rectangular areas for the link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// Return Value:
+// Number of rectangular areas for the link.
+//
+DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page, int link_index);
+
+// Function: FPDFLink_GetRect
+// Fetch the boundaries of a rectangle for a link.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// link_index - Zero-based index for the link.
+// rect_index - Zero-based index for a rectangle.
+// left - Pointer to a double value receiving the rectangle left boundary.
+// top - Pointer to a double value receiving the rectangle top boundary.
+// right - Pointer to a double value receiving the rectangle right boundary.
+// bottom - Pointer to a double value receiving the rectangle bottom boundary.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page, int link_index, int rect_index,
+ double* left, double* top,double* right, double* bottom);
+
+// Function: FPDFLink_CloseWebLinks
+// Release resources used by weblink feature.
+// Parameters:
+// link_page - Handle returned by FPDFLink_LoadWebLinks.
+// Return Value:
+// None.
+//
+DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif//_FPDFTEXT_H_
diff --git a/fpdfsdk/include/fpdfview.h b/fpdfsdk/include/fpdfview.h
new file mode 100644
index 0000000000..182d3cfdbd
--- /dev/null
+++ b/fpdfsdk/include/fpdfview.h
@@ -0,0 +1,578 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+
+#ifndef _FPDFVIEW_H_
+#define _FPDFVIEW_H_
+
+#if defined(_WIN32) && !defined(__WINDOWS__)
+#include <windows.h>
+#endif
+
+// Data types
+typedef void* FPDF_MODULEMGR;
+
+// PDF types
+typedef void* FPDF_DOCUMENT;
+typedef void* FPDF_PAGE;
+typedef void* FPDF_PAGEOBJECT; // Page object(text, path, etc)
+typedef void* FPDF_PATH;
+typedef void* FPDF_CLIPPATH;
+typedef void* FPDF_BITMAP;
+typedef void* FPDF_FONT;
+
+typedef void* FPDF_TEXTPAGE;
+typedef void* FPDF_SCHHANDLE;
+typedef void* FPDF_PAGELINK;
+typedef void* FPDF_HMODULE;
+typedef void* FPDF_DOCSCHHANDLE;
+
+typedef void* FPDF_BOOKMARK;
+typedef void* FPDF_DEST;
+typedef void* FPDF_ACTION;
+typedef void* FPDF_LINK;
+
+// Basic data types
+typedef int FPDF_BOOL;
+typedef int FPDF_ERROR;
+typedef unsigned long FPDF_DWORD;
+
+typedef float FS_FLOAT;
+
+// String types
+typedef unsigned short FPDF_WCHAR;
+typedef unsigned char const* FPDF_LPCBYTE;
+
+// FPDFSDK may use three types of strings: byte string, wide string (UTF-16LE encoded), and platform dependent string
+typedef const char* FPDF_BYTESTRING;
+
+typedef const unsigned short* FPDF_WIDESTRING; // Foxit PDF SDK always use UTF-16LE encoding wide string,
+ // each character use 2 bytes (except surrogation), with low byte first.
+
+// For Windows programmers: for most case it's OK to treat FPDF_WIDESTRING as Windows unicode string,
+// however, special care needs to be taken if you expect to process Unicode larger than 0xffff.
+// For Linux/Unix programmers: most compiler/library environment uses 4 bytes for a Unicode character,
+// you have to convert between FPDF_WIDESTRING and system wide string by yourself.
+
+#ifdef _WIN32_WCE
+typedef const unsigned short* FPDF_STRING;
+#else
+typedef const char* FPDF_STRING;
+#endif
+
+#ifndef _FS_DEF_MATRIX_
+#define _FS_DEF_MATRIX_
+/** @brief Matrix for transformation. */
+typedef struct _FS_MATRIX_
+{
+ float a; /**< @brief Coefficient a.*/
+ float b; /**< @brief Coefficient b.*/
+ float c; /**< @brief Coefficient c.*/
+ float d; /**< @brief Coefficient d.*/
+ float e; /**< @brief Coefficient e.*/
+ float f; /**< @brief Coefficient f.*/
+} FS_MATRIX;
+#endif
+
+#ifndef _FS_DEF_RECTF_
+#define _FS_DEF_RECTF_
+/** @brief Rectangle area(float) in device or page coordination system. */
+typedef struct _FS_RECTF_
+{
+ /**@{*/
+ /** @brief The x-coordinate of the left-top corner. */
+ float left;
+ /** @brief The y-coordinate of the left-top corner. */
+ float top;
+ /** @brief The x-coordinate of the right-bottom corner. */
+ float right;
+ /** @brief The y-coordinate of the right-bottom corner. */
+ float bottom;
+ /**@}*/
+}* FS_LPRECTF, FS_RECTF;
+/** @brief Const Pointer to ::FS_RECTF structure.*/
+typedef const FS_RECTF* FS_LPCRECTF;
+#endif
+
+#if defined(_WIN32) && defined(FPDFSDK_EXPORTS)
+// On Windows system, functions are exported in a DLL
+#define DLLEXPORT __declspec( dllexport )
+#define STDCALL __stdcall
+#else
+#define DLLEXPORT
+#define STDCALL
+#endif
+
+extern const char g_ExpireDate[];
+extern const char g_ModuleCodes[];
+
+// Exported Functions
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Function: FPDF_InitLibrary
+// Initialize the FPDFSDK library
+// Parameters:
+// hInstance - For WIN32 system only: the instance of the executable or DLL module.
+// Return value:
+// None.
+// Comments:
+// You have to call this function before you can call any PDF processing functions.
+
+DLLEXPORT void STDCALL FPDF_InitLibrary(void* hInstance);
+
+
+// Function: FPDF_DestroyLibary
+// Release all resources allocated by the FPDFSDK library.
+// Parameters:
+// None.
+// Return value:
+// None.
+// Comments:
+// You can call this function to release all memory blocks allocated by the library.
+// After this function called, you should not call any PDF processing functions.
+DLLEXPORT void STDCALL FPDF_DestroyLibrary();
+
+//Policy for accessing the local machine time.
+#define FPDF_POLICY_MACHINETIME_ACCESS 0
+
+// Function: FPDF_SetSandBoxPolicy
+// Set the policy for the sandbox environment.
+// Parameters:
+// policy - The specified policy for setting, for example:FPDF_POLICY_MACHINETIME_ACCESS.
+// enable - True for enable, False for disable the policy.
+// Return value:
+// None.
+DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);
+
+/**
+* Open and load a PDF document.
+* @param[in] file_path - Path to the PDF file (including extension).
+* @param[in] password - A string used as the password for PDF file.
+* If no password needed, empty or NULL can be used.
+* @note Loaded document can be closed by FPDF_CloseDocument.
+* If this function fails, you can use FPDF_GetLastError() to retrieve
+* the reason why it fails.
+* @retval A handle to the loaded document. If failed, NULL is returned.
+*/
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path,
+ FPDF_BYTESTRING password);
+
+// Function: FPDF_LoadMemDocument
+// Open and load a PDF document from memory.
+// Parameters:
+// data_buf - Pointer to a buffer containing the PDF document.
+// size - Number of bytes in the PDF document.
+// password - A string used as the password for PDF file.
+// If no password needed, empty or NULL can be used.
+// Return value:
+// A handle to the loaded document. If failed, NULL is returned.
+// Comments:
+// The memory buffer must remain valid when the document is open.
+// Loaded document can be closed by FPDF_CloseDocument.
+// If this function fails, you can use FPDF_GetLastError() to retrieve
+// the reason why it fails.
+//
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf,
+ int size, FPDF_BYTESTRING password);
+
+// Structure for custom file access.
+typedef struct {
+ // File length, in bytes.
+ unsigned long m_FileLen;
+
+ // A function pointer for getting a block of data from specific position.
+ // Position is specified by byte offset from beginning of the file.
+ // The position and size will never go out range of file length.
+ // It may be possible for FPDFSDK to call this function multiple times for same position.
+ // Return value: should be non-zero if successful, zero for error.
+ int (*m_GetBlock)(void* param, unsigned long position, unsigned char* pBuf, unsigned long size);
+
+ // A custom pointer for all implementation specific data.
+ // This pointer will be used as the first parameter to m_GetBlock callback.
+ void* m_Param;
+} FPDF_FILEACCESS;
+
+// Function: FPDF_LoadCustomDocument
+// Load PDF document from a custom access descriptor.
+// Parameters:
+// pFileAccess - A structure for access the file.
+// password - Optional password for decrypting the PDF file.
+// Return value:
+// A handle to the loaded document. If failed, NULL is returned.
+// Comments:
+// The application should maintain the file resources being valid until the PDF document close.
+// Loaded document can be closed by FPDF_CloseDocument.
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess,
+ FPDF_BYTESTRING password);
+
+// Function: FPDF_GetFileVersion
+// Get the file version of the specific PDF document.
+// Parameters:
+// doc - Handle to document.
+// fileVersion - The PDF file version. File version: 14 for 1.4, 15 for 1.5, ...
+// Return value:
+// TRUE if this call succeed, If failed, FALSE is returned.
+// Comments:
+// If the document is created by function ::FPDF_CreateNewDocument, then this function would always fail.
+DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion);
+
+#define FPDF_ERR_SUCCESS 0 // No error.
+#define FPDF_ERR_UNKNOWN 1 // Unknown error.
+#define FPDF_ERR_FILE 2 // File not found or could not be opened.
+#define FPDF_ERR_FORMAT 3 // File not in PDF format or corrupted.
+#define FPDF_ERR_PASSWORD 4 // Password required or incorrect password.
+#define FPDF_ERR_SECURITY 5 // Unsupported security scheme.
+#define FPDF_ERR_PAGE 6 // Page not found or content error.
+
+// Function: FPDF_GetLastError
+// Get last error code when an SDK function failed.
+// Parameters:
+// None.
+// Return value:
+// A 32-bit integer indicating error codes (defined above).
+// Comments:
+// If the previous SDK call succeeded, the return value of this function
+// is not defined.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetLastError();
+
+// Function: FPDF_GetDocPermission
+// Get file permission flags of the document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// Return value:
+// A 32-bit integer indicating permission flags. Please refer to PDF Reference for
+// detailed description. If the document is not protected, 0xffffffff will be returned.
+//
+DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document);
+
+// Function: FPDF_GetPageCount
+// Get total number of pages in a document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// Return value:
+// Total number of pages in the document.
+//
+DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document);
+
+// Function: FPDF_LoadPage
+// Load a page inside a document.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// page_index - Index number of the page. 0 for the first page.
+// Return value:
+// A handle to the loaded page. If failed, NULL is returned.
+// Comments:
+// Loaded page can be rendered to devices using FPDF_RenderPage function.
+// Loaded page can be closed by FPDF_ClosePage.
+//
+DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index);
+
+// Function: FPDF_GetPageWidth
+// Get page width.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// Page width (excluding non-displayable area) measured in points.
+// One point is 1/72 inch (around 0.3528 mm).
+//
+DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page);
+
+// Function: FPDF_GetPageHeight
+// Get page height.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// Return value:
+// Page height (excluding non-displayable area) measured in points.
+// One point is 1/72 inch (around 0.3528 mm)
+//
+DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page);
+
+// Function: FPDF_GetPageSizeByIndex
+// Get the size of a page by index.
+// Parameters:
+// document - Handle to document. Returned by FPDF_LoadDocument function.
+// page_index - Page index, zero for the first page.
+// width - Pointer to a double value receiving the page width (in points).
+// height - Pointer to a double value receiving the page height (in points).
+// Return value:
+// Non-zero for success. 0 for error (document or page not found).
+//
+DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height);
+
+
+// Page rendering flags. They can be combined with bit OR.
+#define FPDF_ANNOT 0x01 // Set if annotations are to be rendered.
+#define FPDF_LCD_TEXT 0x02 // Set if using text rendering optimized for LCD display.
+#define FPDF_NO_NATIVETEXT 0x04 // Don't use the native text output available on some platforms
+#define FPDF_GRAYSCALE 0x08 // Grayscale output.
+#define FPDF_DEBUG_INFO 0x80 // Set if you want to get some debug info.
+ // Please discuss with Foxit first if you need to collect debug info.
+#define FPDF_NO_CATCH 0x100 // Set if you don't want to catch exception.
+#define FPDF_RENDER_LIMITEDIMAGECACHE 0x200 // Limit image cache size.
+#define FPDF_RENDER_FORCEHALFTONE 0x400 // Always use halftone for image stretching.
+#define FPDF_PRINTING 0x800 // Render for printing.
+#define FPDF_REVERSE_BYTE_ORDER 0x10 //set whether render in a reverse Byte order, this flag only
+ //enable when render to a bitmap.
+#ifdef _WIN32
+// Function: FPDF_RenderPage
+// Render contents in a page to a device (screen, bitmap, or printer).
+// This function is only supported on Windows system.
+// Parameters:
+// dc - Handle to device context.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags);
+#endif
+
+// Function: FPDF_RenderPageBitmap
+// Render contents in a page to a device independent bitmap
+// Parameters:
+// bitmap - Handle to the device independent bitmap (as the output buffer).
+// Bitmap handle can be created by FPDFBitmap_Create function.
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the bitmap coordinate.
+// start_y - Top pixel position of the display area in the bitmap coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// flags - 0 for normal display, or combination of flags defined above.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
+ int size_x, int size_y, int rotate, int flags);
+
+// Function: FPDF_ClosePage
+// Close a loaded PDF page.
+// Parameters:
+// page - Handle to the loaded page.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page);
+
+// Function: FPDF_CloseDocument
+// Close a loaded PDF document.
+// Parameters:
+// document - Handle to the loaded document.
+// Return value:
+// None.
+//
+DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document);
+
+// Function: FPDF_DeviceToPage
+// Convert the screen coordinate of a point to page coordinate.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// device_x - X value in device coordinate, for the point to be converted.
+// device_y - Y value in device coordinate, for the point to be converted.
+// page_x - A Pointer to a double receiving the converted X value in page coordinate.
+// page_y - A Pointer to a double receiving the converted Y value in page coordinate.
+// Return value:
+// None.
+// Comments:
+// The page coordinate system has its origin at left-bottom corner of the page, with X axis goes along
+// the bottom side to the right, and Y axis goes along the left side upward. NOTE: this coordinate system
+// can be altered when you zoom, scroll, or rotate a page, however, a point on the page should always have
+// the same coordinate values in the page coordinate system.
+//
+// The device coordinate system is device dependent. For screen device, its origin is at left-top
+// corner of the window. However this origin can be altered by Windows coordinate transformation
+// utilities. You must make sure the start_x, start_y, size_x, size_y and rotate parameters have exactly
+// same values as you used in FPDF_RenderPage() function call.
+//
+DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int device_x, int device_y, double* page_x, double* page_y);
+
+// Function: FPDF_PageToDevice
+// Convert the page coordinate of a point to screen coordinate.
+// Parameters:
+// page - Handle to the page. Returned by FPDF_LoadPage function.
+// start_x - Left pixel position of the display area in the device coordinate.
+// start_y - Top pixel position of the display area in the device coordinate.
+// size_x - Horizontal size (in pixels) for displaying the page.
+// size_y - Vertical size (in pixels) for displaying the page.
+// rotate - Page orientation: 0 (normal), 1 (rotated 90 degrees clockwise),
+// 2 (rotated 180 degrees), 3 (rotated 90 degrees counter-clockwise).
+// page_x - X value in page coordinate, for the point to be converted.
+// page_y - Y value in page coordinate, for the point to be converted.
+// device_x - A pointer to an integer receiving the result X value in device coordinate.
+// device_y - A pointer to an integer receiving the result Y value in device coordinate.
+// Return value:
+// None.
+// Comments:
+// See comments of FPDF_DeviceToPage() function.
+//
+DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, double page_x, double page_y, int* device_x, int* device_y);
+
+// Function: FPDFBitmap_Create
+// Create a Foxit Device Independent Bitmap (FXDIB).
+// Parameters:
+// width - Number of pixels in a horizontal line of the bitmap. Must be greater than 0.
+// height - Number of pixels in a vertical line of the bitmap. Must be greater than 0.
+// alpha - A flag indicating whether alpha channel is used. Non-zero for using alpha, zero for not using.
+// Return value:
+// The created bitmap handle, or NULL if parameter error or out of memory.
+// Comments:
+// An FXDIB always use 4 byte per pixel. The first byte of a pixel is always double word aligned.
+// Each pixel contains red (R), green (G), blue (B) and optionally alpha (A) values.
+// The byte order is BGRx (the last byte unused if no alpha channel) or BGRA.
+//
+// The pixels in a horizontal line (also called scan line) are stored side by side, with left most
+// pixel stored first (with lower memory address). Each scan line uses width*4 bytes.
+//
+// Scan lines are stored one after another, with top most scan line stored first. There is no gap
+// between adjacent scan lines.
+//
+// This function allocates enough memory for holding all pixels in the bitmap, but it doesn't
+// initialize the buffer. Applications can use FPDFBitmap_FillRect to fill the bitmap using any color.
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha);
+
+// More DIB formats
+#define FPDFBitmap_Gray 1 // Gray scale bitmap, one byte per pixel.
+#define FPDFBitmap_BGR 2 // 3 bytes per pixel, byte order: blue, green, red.
+#define FPDFBitmap_BGRx 3 // 4 bytes per pixel, byte order: blue, green, red, unused.
+#define FPDFBitmap_BGRA 4 // 4 bytes per pixel, byte order: blue, green, red, alpha.
+
+// Function: FPDFBitmap_CreateEx
+// Create a Foxit Device Independent Bitmap (FXDIB)
+// Parameters:
+// width - Number of pixels in a horizontal line of the bitmap. Must be greater than 0.
+// height - Number of pixels in a vertical line of the bitmap. Must be greater than 0.
+// format - A number indicating for bitmap format, as defined above.
+// first_scan - A pointer to the first byte of first scan line, for external buffer
+// only. If this parameter is NULL, then the SDK will create its own buffer.
+// stride - Number of bytes for each scan line, for external buffer only..
+// Return value:
+// The created bitmap handle, or NULL if parameter error or out of memory.
+// Comments:
+// Similar to FPDFBitmap_Create function, with more formats and external buffer supported.
+// Bitmap created by this function can be used in any place that a FPDF_BITMAP handle is
+// required.
+//
+// If external scanline buffer is used, then the application should destroy the buffer
+// by itself. FPDFBitmap_Destroy function will not destroy the buffer.
+//
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride);
+
+// Function: FPDFBitmap_FillRect
+// Fill a rectangle area in an FXDIB.
+// Parameters:
+// bitmap - The handle to the bitmap. Returned by FPDFBitmap_Create function.
+// left - The left side position. Starting from 0 at the left-most pixel.
+// top - The top side position. Starting from 0 at the top-most scan line.
+// width - Number of pixels to be filled in each scan line.
+// height - Number of scan lines to be filled.
+// red - A number from 0 to 255, identifying the red intensity.
+// green - A number from 0 to 255, identifying the green intensity.
+// blue - A number from 0 to 255, identifying the blue intensity.
+// alpha - (Only if the alpha channeled is used when bitmap created) A number from 0 to 255,
+// identifying the alpha value.
+// Return value:
+// None.
+// Comments:
+// This function set the color and (optionally) alpha value in specified region of the bitmap.
+// NOTE: If alpha channel is used, this function does NOT composite the background with the source color,
+// instead the background will be replaced by the source color and alpha.
+// If alpha channel is not used, the "alpha" parameter is ignored.
+//
+DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height,
+ int red, int green, int blue, int alpha);
+
+// Function: FPDFBitmap_GetBuffer
+// Get data buffer of an FXDIB
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The pointer to the first byte of the bitmap buffer.
+// Comments:
+// The stride may be more than width * number of bytes per pixel
+// Applications can use this function to get the bitmap buffer pointer, then manipulate any color
+// and/or alpha values for any pixels in the bitmap.
+DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetWidth
+// Get width of an FXDIB.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of pixels in a horizontal line of the bitmap.
+DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetHeight
+// Get height of an FXDIB.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of pixels in a vertical line of the bitmap.
+DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_GetStride
+// Get number of bytes for each scan line in the bitmap buffer.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// The number of bytes for each scan line in the bitmap buffer.
+// Comments:
+// The stride may be more than width * number of bytes per pixel
+DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap);
+
+// Function: FPDFBitmap_Destroy
+// Destroy an FXDIB and release all related buffers.
+// Parameters:
+// bitmap - Handle to the bitmap. Returned by FPDFBitmap_Create function.
+// Return value:
+// None.
+// Comments:
+// This function will not destroy any external buffer.
+//
+DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap);
+
+// Function: FPDF_VIEWERREF_GetPrintScaling
+// Whether the PDF document prefers to be scaled or not.
+// Parameters:
+// document - Handle to the loaded document.
+// Return value:
+// None.
+//
+DLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document);
+
+// Function: FPDF_GetNamedDestByName
+// get a special dest handle by the index.
+// Parameters:
+// document - Handle to the loaded document.
+// name - The name of a special named dest.
+// Return value:
+// The handle of the dest.
+//
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // _FPDFVIEW_H_
diff --git a/fpdfsdk/include/fsdk_actionhandler.h b/fpdfsdk/include/fsdk_actionhandler.h
new file mode 100644
index 0000000000..c93e679e79
--- /dev/null
+++ b/fpdfsdk/include/fsdk_actionhandler.h
@@ -0,0 +1,82 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FSDK_ACTIONHANDLER_H_
+#define _FSDK_ACTIONHANDLER_H_
+
+
+class CPDFDoc_Environment;
+class IFXJS_Runtime;
+
+class CPDFSDK_FormActionHandler
+{
+public:
+ FX_BOOL DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+};
+
+class CPDFSDK_MediaActionHandler
+{
+public:
+ FX_BOOL DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+ FX_BOOL DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument);
+};
+
+class CPDFSDK_ActionHandler /*: public CReader_ActionHandler*/
+{
+public:
+ CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi);
+ virtual ~CPDFSDK_ActionHandler();
+
+ virtual void Destroy();
+ virtual FX_BOOL DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CPDFSDK_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen);
+ virtual FX_BOOL DoAction_Link(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/);
+ virtual FX_BOOL DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data);
+ virtual FX_BOOL DoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, PDFSDK_FieldAction& data);
+public:
+ void SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler);
+ void SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler);
+
+private:
+ FX_BOOL ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);
+ FX_BOOL ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ CFX_PtrList& list);
+ FX_BOOL ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_FormField* pFormField, PDFSDK_FieldAction& data, CFX_PtrList& list);
+ FX_BOOL ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list);
+ FX_BOOL ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list);
+ FX_BOOL ExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ CFX_PtrList& list);
+
+ void DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);
+ void RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script);
+ void RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script);
+ void RunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, const CFX_WideString& script);
+
+private:
+ FX_BOOL IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict);
+ FX_BOOL IsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/);
+
+ void DoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView *pDocView,*/ const CPDF_Action& action);
+ void DoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action);
+ void DoAction_SetOCGState(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/ const CPDF_Action& action);
+
+private:
+ CPDFDoc_Environment* m_pEvi;
+ CPDFSDK_FormActionHandler* m_pFormActionHandler;
+ CPDFSDK_MediaActionHandler* m_pMediaActionHandler;
+};
+
+#endif //_BA_ACTIONHANDLER_H_
+
diff --git a/fpdfsdk/include/fsdk_annothandler.h b/fpdfsdk/include/fsdk_annothandler.h
new file mode 100644
index 0000000000..dc2e40a9c7
--- /dev/null
+++ b/fpdfsdk/include/fsdk_annothandler.h
@@ -0,0 +1,248 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FSDK_ANNOTHANDLER_H_
+#define _FSDK_ANNOTHANDLER_H_
+
+
+class CPDFDoc_Environment;
+class CFFL_IFormFiller;
+class CPDFSDK_PageView;
+class IPDFSDK_AnnotHandler
+{
+
+public:
+ virtual ~IPDFSDK_AnnotHandler() {};
+
+ virtual CFX_ByteString GetType() = 0;
+
+ virtual CFX_ByteString GetName() = 0;
+
+ virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) = 0;
+
+ virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) = 0;
+
+
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags) = 0;
+
+ virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect& rcWindow, FX_DWORD dwFlags) = 0;
+
+
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual void OnRelease(CPDFSDK_Annot* pAnnot) = 0;
+
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0;
+//by wjm.
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) = 0;
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0;
+ virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) =0 ;
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) = 0;
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot) = 0;
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0;
+
+};
+
+
+class CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler
+{
+public:
+ CPDFSDK_BFAnnotHandler(CPDFDoc_Environment* pApp):m_pFormFiller(NULL),m_pApp(pApp) {}
+ virtual ~CPDFSDK_BFAnnotHandler() {}
+public:
+
+ virtual CFX_ByteString GetType() {return CFX_ByteString("Widget");}
+
+ virtual CFX_ByteString GetName() {return CFX_ByteString("WidgetHandler");}
+
+ virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot);
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage);
+
+ virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) {}
+
+
+ virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) ;
+
+ virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
+
+
+ virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags) ;
+
+ virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect& rcWindow, FX_DWORD dwFlags) {}
+
+
+ virtual void OnCreate(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void OnLoad(CPDFSDK_Annot* pAnnot) ;
+
+ virtual void OnDelete(CPDFSDK_Annot* pAnnot) {}
+
+ virtual void OnRelease(CPDFSDK_Annot* pAnnot) {}
+
+
+ virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
+ virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ;
+
+
+ virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ;
+ virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) {return FALSE;}
+
+//by wjm.
+ virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
+ virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+ virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+
+ virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) {}
+ virtual void OnSelected(CPDFSDK_Annot* pAnnot) {}
+
+ virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+ virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+
+ void SetFormFiller(CFFL_IFormFiller* pFiller){m_pFormFiller = pFiller;}
+ CFFL_IFormFiller* GetFormFiller() {return m_pFormFiller;}
+private:
+
+ CPDFDoc_Environment* m_pApp;
+ CFFL_IFormFiller* m_pFormFiller;
+};
+
+#define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*>
+class CPDFSDK_AnnotHandlerMgr
+{
+public:
+ // Destroy the handler
+ CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp);
+ virtual ~CPDFSDK_AnnotHandlerMgr() ;
+
+public:
+ void RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
+ void UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler);
+
+ virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView);
+ virtual void ReleaseAnnot(CPDFSDK_Annot * pAnnot);
+
+ virtual void Annot_OnCreate(CPDFSDK_Annot* pAnnot);
+ virtual void Annot_OnLoad(CPDFSDK_Annot* pAnnot);
+public:
+ IPDFSDK_AnnotHandler* GetAnnotHandler(CPDFSDK_Annot* pAnnot) const;
+ virtual void Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags);
+
+ virtual void Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
+ virtual void Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags);
+
+ virtual FX_BOOL Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+
+ virtual FX_BOOL Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+ virtual FX_BOOL Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point);
+
+
+ virtual FX_BOOL Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags);
+ virtual FX_BOOL Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+ virtual FX_BOOL Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag);
+
+ virtual FX_BOOL Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+ virtual FX_BOOL Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag);
+
+ virtual CPDF_Rect Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot);
+ virtual FX_BOOL Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point);
+
+private:
+ IPDFSDK_AnnotHandler* GetAnnotHandler(const CFX_ByteString& sType) const;
+ CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext);
+private:
+ CBA_AnnotHandlerArray m_Handlers;
+ CFX_MapByteStringToPtr m_mapType2Handler;
+ CPDFDoc_Environment* m_pApp;
+};
+
+//#define CBF_Page2Accessible CFX_MapPtrTemplate<CPDFSDK_PageView*, IAccessible*>
+
+typedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+
+class CPDFSDK_AnnotIterator
+{
+protected:
+ CPDFSDK_Annot* NextAnnot (const CPDFSDK_Annot* pCurrent) ;
+ CPDFSDK_Annot* PrevAnnot (const CPDFSDK_Annot* pCurrent) ;
+ CPDFSDK_Annot* NextAnnot(int& index ) ;
+ CPDFSDK_Annot* PrevAnnot(int& index ) ;
+public:
+ CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView, FX_BOOL bReverse,
+ FX_BOOL bIgnoreTopmost=FALSE,FX_BOOL bCircle=FALSE,CFX_PtrArray* pList=NULL);
+ virtual CPDFSDK_Annot* Next (const CPDFSDK_Annot* pCurrent) ;
+ virtual CPDFSDK_Annot* Prev (const CPDFSDK_Annot* pCurrent) ;
+ virtual CPDFSDK_Annot* Next(int& index ) ;
+ virtual CPDFSDK_Annot* Prev(int& index ) ;
+ virtual int Count(){return m_pIteratorAnnotList.GetSize();}
+
+ virtual FX_BOOL InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray* pList=NULL);
+
+ void InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare);
+protected:
+ // CFX_PtrList m_pIteratorAnnotList;
+ CFX_PtrArray m_pIteratorAnnotList;
+ FX_BOOL m_bReverse;
+ FX_BOOL m_bIgnoreTopmost;
+ FX_BOOL m_bCircle;
+};
+
+
+
+#endif
+
diff --git a/fpdfsdk/include/fsdk_baseannot.h b/fpdfsdk/include/fsdk_baseannot.h
new file mode 100644
index 0000000000..b6cadb7e5d
--- /dev/null
+++ b/fpdfsdk/include/fsdk_baseannot.h
@@ -0,0 +1,186 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FSDK_BASEANNOT_H_
+#define _FSDK_BASEANNOT_H_
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CPDFSDK_PageView;
+#define CFX_IntArray CFX_ArrayTemplate<int>
+
+class CPDFSDK_DateTime : public CFX_Object
+{
+public:
+ CPDFSDK_DateTime();
+ CPDFSDK_DateTime(const CFX_ByteString& dtStr);
+ CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime);
+ CPDFSDK_DateTime(const FX_SYSTEMTIME& st);
+
+
+ CPDFSDK_DateTime& operator = (const CPDFSDK_DateTime& datetime);
+ CPDFSDK_DateTime& operator = (const FX_SYSTEMTIME& st);
+ FX_BOOL operator == (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator != (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator > (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator >= (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator < (CPDFSDK_DateTime& datetime);
+ FX_BOOL operator <= (CPDFSDK_DateTime& datetime);
+ operator time_t();
+
+ CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr);
+ CFX_ByteString ToCommonDateTimeString();
+ CFX_ByteString ToPDFDateTimeString();
+ void ToSystemTime(FX_SYSTEMTIME& st);
+ CPDFSDK_DateTime ToGMT();
+ CPDFSDK_DateTime& AddDays(short days);
+ CPDFSDK_DateTime& AddSeconds(int seconds);
+
+ void ResetDateTime();
+
+ struct FX_DATETIME
+ {
+ FX_SHORT year;
+ FX_BYTE month;
+ FX_BYTE day;
+ FX_BYTE hour;
+ FX_BYTE minute;
+ FX_BYTE second;
+ FX_CHAR tzHour;
+ FX_BYTE tzMinute;
+ }dt;
+};
+
+class CPDFSDK_Annot
+{
+public:
+ CPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView);
+ virtual ~CPDFSDK_Annot();
+public:
+ virtual FX_FLOAT GetMinWidth() const;
+ virtual FX_FLOAT GetMinHeight() const;
+ //define layout order to 5.
+ virtual int GetLayoutOrder() const { return 5; }
+
+public:
+ CPDF_Annot* GetPDFAnnot();
+
+ void SetPage(CPDFSDK_PageView* pPageView);
+ CPDFSDK_PageView* GetPageView();
+ FX_DWORD GetFlags();
+
+ // Tab Order
+ int GetTabOrder();
+ void SetTabOrder(int iTabOrder);
+
+ // Selection
+ FX_BOOL IsSelected();
+ void SetSelected(FX_BOOL bSelected);
+
+ CFX_ByteString GetType() const;
+ virtual CFX_ByteString GetSubType() const;
+
+ CPDF_Page* GetPDFPage();
+
+public:
+ CPDF_Dictionary* GetAnnotDict() const;
+
+ void SetRect(const CPDF_Rect& rect);
+ CPDF_Rect GetRect() const;
+
+ void SetContents(const CFX_WideString& sContents);
+ CFX_WideString GetContents() const;
+
+ void SetAnnotName(const CFX_WideString& sName);
+ CFX_WideString GetAnnotName() const;
+
+ void SetModifiedDate(const FX_SYSTEMTIME& st);
+ FX_SYSTEMTIME GetModifiedDate() const;
+
+ void SetFlags(int nFlags);
+ int GetFlags() const;
+
+ void SetAppState(const CFX_ByteString& str);
+ CFX_ByteString GetAppState() const;
+
+ void SetStructParent(int key);
+ int GetStructParent() const;
+
+ //border
+ void SetBorderWidth(int nWidth);
+ int GetBorderWidth() const;
+
+ //BBS_SOLID
+ //BBS_DASH
+ //BBS_BEVELED
+ //BBS_INSET
+ //BBS_UNDERLINE
+
+ void SetBorderStyle(int nStyle);
+ int GetBorderStyle() const;
+
+ void SetBorderDash(const CFX_IntArray& array);
+ void GetBorderDash(CFX_IntArray& array) const;
+
+ //The background of the annotation's icon when closed
+ //The title bar of the annotation's pop-up window
+ //The border of a link annotation
+
+ void SetColor(FX_COLORREF color);
+ void RemoveColor();
+ FX_BOOL GetColor(FX_COLORREF& color) const;
+
+ FX_BOOL IsVisible() const;
+ //action
+
+ CPDF_Action GetAction() const;
+ void SetAction(const CPDF_Action& a);
+ void RemoveAction();
+
+ CPDF_AAction GetAAction() const;
+ void SetAAction(const CPDF_AAction& aa);
+ void RemoveAAction();
+
+ virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT);
+
+public:
+ FX_BOOL IsAppearanceValid();
+ FX_BOOL IsAppearanceValid(CPDF_Annot::AppearanceMode mode);
+ void DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+ void DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ const CPDF_RenderOptions* pOptions);
+
+ void ClearCachedAP();
+
+ virtual void ResetAppearance();
+ void WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox,
+ const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
+ const CFX_ByteString& sAPState = "");
+
+public:
+ virtual void Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions);
+public:
+
+
+private:
+ FX_BOOL CreateFormFiller();
+protected:
+ CPDF_Annot* m_pAnnot;
+ CPDFSDK_PageView* m_pPageView;
+ FX_BOOL m_bSelected;
+ int m_nTabOrder;
+
+};
+
+
+
+#endif
+
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h
new file mode 100644
index 0000000000..baa1c28485
--- /dev/null
+++ b/fpdfsdk/include/fsdk_baseform.h
@@ -0,0 +1,292 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FSDK_BASEFORM_H_
+#define _FSDK_BASEFORM_H_
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CPDFSDK_Document;
+class CPDFSDK_DateTime;
+struct CPWL_Color;
+class CFFL_FormFiller;
+class CPDFSDK_PageView;
+class CPDFSDK_InterForm;
+
+
+typedef struct _PDFSDK_FieldAction
+{
+ _PDFSDK_FieldAction()
+ {
+ bModifier = FALSE;
+ bShift = FALSE;
+ nCommitKey = 0;
+ bKeyDown = FALSE;
+ nSelEnd = nSelStart = 0;
+ bWillCommit = FALSE;
+ bFieldFull = FALSE;
+ bRC = TRUE;
+ }
+
+ FX_BOOL bModifier; //in
+ FX_BOOL bShift; //in
+ int nCommitKey; //in
+ CFX_WideString sChange; //in[out]
+ CFX_WideString sChangeEx; //in
+ FX_BOOL bKeyDown; //in
+ int nSelEnd; //in[out]
+ int nSelStart; //in[out]
+ CFX_WideString sValue; //in[out]
+ FX_BOOL bWillCommit; //in
+ FX_BOOL bFieldFull; //in
+ FX_BOOL bRC; //in[out]
+}PDFSDK_FieldAction;
+class CPDFSDK_Widget:public CPDFSDK_Annot
+{
+public:
+ CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm);
+ virtual ~CPDFSDK_Widget();
+
+ virtual CFX_ByteString GetSubType() const;
+
+ virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT);
+
+ int GetFieldType() const;
+ //define layout order to 2.
+ virtual int GetLayoutOrder() {return 2;}
+ /*
+ FIELDFLAG_READONLY
+ FIELDFLAG_REQUIRED
+ FIELDFLAG_NOEXPORT
+ */
+
+ int GetFieldFlags() const;
+ int GetRotate() const;
+
+ FX_BOOL GetFillColor(FX_COLORREF& color) const;
+ FX_BOOL GetBorderColor(FX_COLORREF& color) const;
+ FX_BOOL GetTextColor(FX_COLORREF& color) const;
+ FX_FLOAT GetFontSize() const;
+
+ int GetSelectedIndex(int nIndex) const;
+ CFX_WideString GetValue() const;
+ CFX_WideString GetDefaultValue() const;
+ CFX_WideString GetOptionLabel(int nIndex) const;
+ int CountOptions() const;
+ FX_BOOL IsOptionSelected(int nIndex) const;
+ int GetTopVisibleIndex() const;
+ FX_BOOL IsChecked() const;
+ /*
+ BF_ALIGN_LEFT
+ BF_ALIGN_MIDDL
+ BF_ALIGN_RIGHT
+ */
+ int GetAlignment() const;
+ int GetMaxLen() const;
+ CFX_WideString GetAlternateName() const;
+
+//Set Properties.
+ void SetCheck(FX_BOOL bChecked, FX_BOOL bNotify);
+ void SetValue(const CFX_WideString& sValue, FX_BOOL bNotify);
+ void SetDefaultValue(const CFX_WideString& sValue);
+ void SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify);
+ void ClearSelection(FX_BOOL bNotify);
+ void SetTopVisibleIndex(int index);
+
+ void ResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged);
+ void ResetFieldAppearance(FX_BOOL bValueChanged);
+ void UpdateField();
+ CFX_WideString OnFormat(int nCommitKey, FX_BOOL& bFormated);
+
+//Message.
+ FX_BOOL OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data,
+ CPDFSDK_PageView* pPageView);
+
+ CPDFSDK_InterForm* GetInterForm() const {return m_pInterForm;}
+ CPDF_FormField* GetFormField() const;
+ CPDF_FormControl* GetFormControl() const;
+ static CPDF_FormControl* GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict);
+
+ void DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView);
+
+ void SetAppModified();
+ void ClearAppModified();
+ FX_BOOL IsAppModified() const;
+
+ FX_INT32 GetAppearanceAge() const;
+ FX_INT32 GetValueAge() const;
+
+private:
+ void ResetAppearance_PushButton();
+ void ResetAppearance_CheckBox();
+ void ResetAppearance_RadioButton();
+ void ResetAppearance_ComboBox(FX_LPCWSTR sValue);
+ void ResetAppearance_ListBox();
+ void ResetAppearance_TextField(FX_LPCWSTR sValue);
+
+ CPDF_Rect GetClientRect() const;
+ CPDF_Rect GetRotatedRect() const;
+
+ CFX_ByteString GetBackgroundAppStream() const;
+ CFX_ByteString GetBorderAppStream() const;
+ CPDF_Matrix GetMatrix() const;
+
+ CPWL_Color GetTextPWLColor() const;
+ CPWL_Color GetBorderPWLColor() const;
+ CPWL_Color GetFillPWLColor() const;
+
+ void AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage);
+ void RemoveAppearance(const CFX_ByteString& sAPType);
+public:
+ FX_BOOL IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode);
+ void DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions);
+public:
+ FX_BOOL HitTest(FX_FLOAT pageX, FX_FLOAT pageY);
+private:
+ CPDFSDK_InterForm* m_pInterForm;
+ FX_BOOL m_bAppModified;
+ FX_INT32 m_nAppAge;
+ FX_INT32 m_nValueAge;
+};
+
+#define CPDFSDK_WidgetMap CFX_MapPtrTemplate<CPDF_FormControl*, CPDFSDK_Widget*>
+
+class CPDFSDK_InterForm : public CPDF_FormNotify
+{
+public:
+ CPDFSDK_InterForm(CPDFSDK_Document* pDocument);
+ virtual ~CPDFSDK_InterForm();
+
+public:
+ virtual void Destroy();
+ virtual CPDF_InterForm* GetInterForm();
+
+ CPDFSDK_Document* GetDocument();
+ FX_BOOL HighlightWidgets();
+
+ CPDFSDK_Widget* GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const;
+ CPDFSDK_Widget* GetWidget(CPDF_FormControl* pControl) const;
+ void GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets);
+ void GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets);
+
+ void AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget);
+ void RemoveMap(CPDF_FormControl* pControl);
+
+ void EnableCalculate(FX_BOOL bEnabled);
+ FX_BOOL IsCalculateEnabled() const;
+
+#ifdef _WIN32
+ CPDF_Stream* LoadImageFromFile(const CFX_WideString& sFile);
+#endif
+
+ void OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);
+ void OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC);
+ void OnCalculate(CPDF_FormField* pFormField = NULL);
+ CFX_WideString OnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated);
+
+ void ResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged);
+ void UpdateField(CPDF_FormField* pFormField);
+
+public:
+ FX_BOOL DoAction_Hide(const CPDF_Action& action);
+ FX_BOOL DoAction_SubmitForm(const CPDF_Action& action);
+ FX_BOOL DoAction_ResetForm(const CPDF_Action& action);
+ FX_BOOL DoAction_ImportData(const CPDF_Action& action);
+
+ void GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields);
+ FX_BOOL IsValidField(CPDF_Dictionary* pFieldDict);
+ FX_BOOL SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded);
+ FX_BOOL SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded);
+ FX_BOOL ImportFormFromFDFFile(const CFX_WideString& csFDFFileName, FX_BOOL bNotify);
+ FX_BOOL ExportFormToFDFFile(const CFX_WideString& sFDFFileName);
+ FX_BOOL ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf);
+ FX_BOOL ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude);
+ FX_BOOL ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf);
+ FX_BOOL ExportFormToTxtFile(const CFX_WideString& sTxtFileName);
+ FX_BOOL ImportFormFromTxtFile(const CFX_WideString& sTxtFileName);
+ CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
+
+private:
+ virtual int BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue);
+ virtual int AfterValueChange(const CPDF_FormField* pField);
+ virtual int BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue);
+ virtual int AfterSelectionChange(const CPDF_FormField* pField);
+ virtual int AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray);
+ virtual int BeforeFormReset(const CPDF_InterForm* pForm);
+ virtual int AfterFormReset(const CPDF_InterForm* pForm);
+ virtual int BeforeFormImportData(const CPDF_InterForm* pForm);
+ virtual int AfterFormImportData(const CPDF_InterForm* pForm);
+
+private:
+ FX_BOOL FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile);
+ FX_BOOL FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize);
+ int GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const;
+ void DoFDFBuffer(CFX_ByteString sBuffer);
+
+private:
+ CPDFSDK_Document* m_pDocument;
+ CPDF_InterForm* m_pInterForm;
+ CPDFSDK_WidgetMap m_Map;
+ FX_BOOL m_bCalculate;
+ FX_BOOL m_bBusy;
+
+public:
+ FX_BOOL IsNeedHighLight(int nFieldType);
+ void RemoveAllHighLight();
+ void SetHighlightAlpha(FX_BYTE alpha) {m_iHighlightAlpha = alpha;}
+ FX_BYTE GetHighlightAlpha() {return m_iHighlightAlpha;}
+ void SetHighlightColor(FX_COLORREF clr, int nFieldType);
+ FX_COLORREF GetHighlightColor(int nFieldType);
+private:
+ FX_COLORREF m_aHighlightColor[6];
+ FX_BYTE m_iHighlightAlpha;
+ FX_BOOL m_bNeedHightlight[6];
+};
+
+#define BAI_STRUCTURE 0
+#define BAI_ROW 1
+#define BAI_COLUMN 2
+
+#define CPDFSDK_Annots CFX_ArrayTemplate<CPDFSDK_Annot*>
+#define CPDFSDK_SortAnnots CGW_ArrayTemplate<CPDFSDK_Annot*>
+class CBA_AnnotIterator
+{
+public:
+ CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType);
+ virtual ~CBA_AnnotIterator();
+
+ virtual CPDFSDK_Annot* GetFirstAnnot();
+ virtual CPDFSDK_Annot* GetLastAnnot();
+ virtual CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pAnnot);
+ virtual CPDFSDK_Annot* GetPrevAnnot(CPDFSDK_Annot* pAnnot);
+
+ virtual void Release(){delete this;}
+
+private:
+ void GenerateResults();
+ static int CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+ static int CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2);
+
+ static CPDF_Rect GetAnnotRect(CPDFSDK_Annot* pAnnot);
+
+private:
+ CPDFSDK_PageView* m_pPageView;
+ CFX_ByteString m_sType;
+ CFX_ByteString m_sSubType;
+ int m_nTabs;
+
+ CPDFSDK_Annots m_Annots;
+};
+
+#endif //#define _FSDK_BASEFORM_H_
+
diff --git a/fpdfsdk/include/fsdk_common.h b/fpdfsdk/include/fsdk_common.h
new file mode 100644
index 0000000000..b49c1d1690
--- /dev/null
+++ b/fpdfsdk/include/fsdk_common.h
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FSDK_COMMON_H_
+#define _FSDK_COMMON_H_
+
+#define BFFT_SIGNATURE "Signature"
+
+//for all fields
+#define FIELDFLAG_READONLY 1
+#define FIELDFLAG_REQUIRED 2
+#define FIELDFLAG_NOEXPORT 4
+//for text fields
+#define FIELDFLAG_MULTILINE (1<<12)
+#define FIELDFLAG_PASSWORD (1<<13)
+#define FIELDFLAG_FILESELECT (1<<20)
+#define FIELDFLAG_DONOTSPELLCHECK (1<<22)
+#define FIELDFLAG_DONOTSCROLL (1<<23)
+#define FIELDFLAG_COMB (1<<24)
+#define FIELDFLAG_RICHTEXT (1<<25)
+//for button fileds
+#define FIELDFLAG_NOTOGGLETOOFF (1<<14)
+#define FIELDFLAG_RADIO (1<<15)
+#define FIELDFLAG_PUSHBUTTON (1<<16)
+#define FIELDFLAG_RADIOSINUNISON (1<<25)
+//for choice fields
+#define FIELDFLAG_COMBO (1<<17)
+#define FIELDFLAG_EDIT (1<<18)
+#define FIELDFLAG_SORT (1<<19)
+#define FIELDFLAG_MULTISELECT (1<<21)
+#ifndef FIELDFLAG_DONOTSPELLCHECK
+#define FIELDFLAG_DONOTSPELLCHECK (1<<22)
+#endif
+#define FIELDFLAG_COMMITONSELCHANGE (1<<26)
+
+#define BBS_SOLID 0
+#define BBS_DASH 1
+#define BBS_BEVELED 2
+#define BBS_INSET 3
+#define BBS_UNDERLINE 4
+
+
+#endif
diff --git a/fpdfsdk/include/fsdk_define.h b/fpdfsdk/include/fsdk_define.h
new file mode 100644
index 0000000000..5f9cde3858
--- /dev/null
+++ b/fpdfsdk/include/fsdk_define.h
@@ -0,0 +1,128 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFSDK_DEFINE_H
+#define _FPDFSDK_DEFINE_H
+
+#ifdef _WIN32
+#include <tchar.h>
+#include <math.h>
+#endif
+
+//#define API5
+#define API6
+#define _FPDFAPI_ASYNC_PARSING_
+#define _FXSDK_OPENSOURCE_
+
+#ifdef _FPDFEMB_WCE_
+ #include "../../core/include/fpdfapi/fpdfapi.h"
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../core/include/fpdfapi/fpdf_render.h"
+ #include "../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../core/include/fpdfapi/fpdf_serial.h"
+
+ #include "../../core/include/fpdftext/fpdf_text.h"
+
+ #include "../../core/include/fxge/fx_ge_win32.h"
+ #include "../../core/include/fxge/fx_ge.h"
+
+ #include "../../core/include/fxcodec/fx_codec.h"
+
+ #include "../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../core/include/fpdfdoc/fpdf_vt.h"
+
+ #include "../../core/include/fxcrt/fx_xml.h"
+ #include "../../core/include/fxcrt/fx_crypt.h"
+
+#else
+ #ifdef API6
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdfapi.h"
+ #include "../../core/include/fpdfapi/fpdf_parser.h"
+ #include "../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../core/include/fpdfapi/fpdf_render.h"
+ #include "../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../core/include/fpdfapi/fpdf_serial.h"
+
+ #include "../../core/include/fpdftext/fpdf_text.h"
+
+ #include "../../core/include/fxge/fx_ge_win32.h"
+ #include "../../core/include/fxge/fx_ge.h"
+
+ #include "../../core/include/fxcodec/fx_codec.h"
+
+ #include "../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../core/include/fpdfdoc/fpdf_vt.h"
+
+ #include "../../core/include/fxcrt/fx_xml.h"
+ // #include "../../core/include/fdrm/fx_crypt.h"
+ #ifdef _LICENSED_BUILD_
+ #include "../../cryptopp/Cryptlib.h"
+ #endif
+ #endif
+#endif
+
+
+#ifndef FX_GetAValue
+/** @brief It retrieves an intensity value for the alpha component of a #FX_ARGB value. */
+#define FX_GetAValue(argb) ((argb & 0xFF000000) >> 24)
+#endif
+
+#ifndef FX_GetRValue
+/** @brief It retrieves an intensity value for the red component of a #FX_ARGB value. */
+#define FX_GetRValue(argb) ((argb & 0x00FF0000) >> 16)
+#endif
+
+#ifndef FX_GetGValue
+/** @brief It retrieves an intensity value for the green component of a #FX_ARGB value. */
+#define FX_GetGValue(argb) ((argb & 0x0000FF00) >> 8)
+#endif
+
+#ifndef FX_GetBValue
+/** @brief It retrieves an intensity value for the blue component of a #FX_ARGB value. */
+#define FX_GetBValue(argb) (argb & 0x000000FF)
+#endif
+
+#ifndef FX_ARGBTOCOLORREF
+/** @brief Convert a #FX_ARGB to a #FX_COLORREF. */
+#define FX_ARGBTOCOLORREF(argb) ((((FX_DWORD)argb & 0x00FF0000) >> 16)|((FX_DWORD)argb & 0x0000FF00)|(((FX_DWORD)argb & 0x000000FF) << 16))
+#endif
+
+#ifndef FX_COLORREFTOARGB
+/** @brief Convert a #FX_COLORREF to a #FX_ARGB. */
+#define FX_COLORREFTOARGB(rgb) ((FX_DWORD)0xFF000000|(((FX_DWORD)rgb & 0x000000FF) << 16)|((FX_DWORD)rgb & 0x0000FF00)|(((FX_DWORD)rgb & 0x00FF0000) >> 16))
+#endif
+
+typedef unsigned int FX_UINT;
+
+#include "fpdfview.h"
+
+class CPDF_CustomAccess : public IFX_FileRead, public CFX_Object
+{
+public:
+ CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess);
+ ~CPDF_CustomAccess() {}
+
+ virtual CFX_ByteString GetFullPath() { return ""; }
+ virtual FX_FILESIZE GetSize() { return m_FileAccess.m_FileLen; }
+
+ virtual FX_BOOL GetByte(FX_DWORD pos, FX_BYTE& ch);
+ virtual FX_BOOL GetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size);
+ virtual void Release() { delete this; }
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ FPDF_FILEACCESS m_FileAccess;
+ FX_BYTE m_Buffer[512];
+ FX_DWORD m_BufferOffset;
+};
+
+void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);
+FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy);
+
+
+#endif//_FPDFSDK_DEFINE_H
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h
new file mode 100644
index 0000000000..9933c41974
--- /dev/null
+++ b/fpdfsdk/include/fsdk_mgr.h
@@ -0,0 +1,615 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPDFSDK_MGR_H
+#define _FPDFSDK_MGR_H
+
+#include "fsdk_common.h"
+#include "fsdk_define.h"
+#include "fx_systemhandler.h"
+#include "fsdk_baseannot.h"
+#include "fsdk_baseform.h"
+#include "fpdfformfill.h"
+#include "fsdk_annothandler.h"
+#include "fsdk_actionhandler.h"
+
+//cross platform keycode and events define.
+#include "fpdf_fwlevent.h"
+
+
+class CPDFSDK_Document;
+class CPDFSDK_PageView;
+class CPDFSDK_Annot;
+class CFFL_IFormFiller;
+class CPDFSDK_Widget;
+class IFX_SystemHandler;
+class CPDFSDK_ActionHandler;
+class CJS_RuntimeFactory;
+
+#include "javascript/IJavaScript.h"
+
+class CPDFDoc_Environment
+{
+public:
+ CPDFDoc_Environment(CPDF_Document * pDoc);
+ ~CPDFDoc_Environment();
+
+ int RegAppHandle(FPDF_FORMFILLINFO* pFFinfo);//{ m_pInfo = pFFinfo; return TRUE;}
+
+ virtual void Release()
+ {
+ if (m_pInfo && m_pInfo->Release)
+ m_pInfo->Release(m_pInfo);
+ delete this;
+ }
+
+ virtual void FFI_Invalidate(FPDF_PAGE page, double left, double top, double right, double bottom)
+ {
+ if (m_pInfo && m_pInfo->FFI_Invalidate)
+ {
+ m_pInfo->FFI_Invalidate(m_pInfo, page, left, top, right, bottom);
+ }
+ }
+ virtual void FFI_OutputSelectedRect(FPDF_PAGE page, double left, double top, double right, double bottom)
+ {
+ if (m_pInfo && m_pInfo->FFI_OutputSelectedRect)
+ {
+ m_pInfo->FFI_OutputSelectedRect(m_pInfo, page, left, top, right, bottom);
+ }
+ }
+
+ virtual void FFI_SetCursor(int nCursorType)
+ {
+ if (m_pInfo && m_pInfo->FFI_SetCursor)
+ {
+ m_pInfo->FFI_SetCursor(m_pInfo, nCursorType);
+ }
+ }
+
+ virtual int FFI_SetTimer(int uElapse, TimerCallback lpTimerFunc)
+ {
+ if (m_pInfo && m_pInfo->FFI_SetTimer)
+ {
+ return m_pInfo->FFI_SetTimer(m_pInfo, uElapse, lpTimerFunc);
+ }
+ return -1;
+ }
+
+ virtual void FFI_KillTimer(int nTimerID)
+ {
+ if (m_pInfo && m_pInfo->FFI_KillTimer)
+ {
+ m_pInfo->FFI_KillTimer(m_pInfo, nTimerID);
+ }
+ }
+ FX_SYSTEMTIME FFI_GetLocalTime()
+ {
+ FX_SYSTEMTIME fxtime;
+ if(m_pInfo && m_pInfo->FFI_GetLocalTime)
+ {
+ FPDF_SYSTEMTIME systime = m_pInfo->FFI_GetLocalTime(m_pInfo);
+ fxtime.wDay = systime.wDay;
+ fxtime.wDayOfWeek = systime.wDayOfWeek;
+ fxtime.wHour = systime.wHour;
+ fxtime.wMilliseconds = systime.wMilliseconds;
+ fxtime.wMinute = systime.wMinute;
+ fxtime.wMonth = systime.wMonth;
+ fxtime.wSecond = systime.wSecond;
+ fxtime.wYear = systime.wYear;
+ }
+ return fxtime;
+ }
+
+ virtual void FFI_OnChange()
+ {
+ if(m_pInfo && m_pInfo->FFI_OnChange)
+ {
+ m_pInfo->FFI_OnChange(m_pInfo);
+ }
+ }
+
+ virtual FX_BOOL FFI_IsSHIFTKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_ShiftKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsCTRLKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_ControlKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsALTKeyDown(FX_DWORD nFlag)
+ {
+
+ return (nFlag & FWL_EVENTFLAG_AltKey) != 0;
+ }
+ virtual FX_BOOL FFI_IsINSERTKeyDown(FX_DWORD nFlag)
+ {
+ return FALSE;
+ }
+
+ virtual int JS_appAlert(FX_LPCWSTR Msg, FX_LPCWSTR Title, FX_UINT Type, FX_UINT Icon)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_alert)
+ {
+ CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+ CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+ FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
+ FPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());
+ int ret = m_pInfo->m_pJsPlatform->app_alert(m_pInfo->m_pJsPlatform, pMsg, pTitle, Type, Icon);
+ bsMsg.ReleaseBuffer();
+ bsTitle.ReleaseBuffer();
+ return ret;
+ }
+ return -1;
+ }
+
+ virtual int JS_appResponse(FX_LPCWSTR Question, FX_LPCWSTR Title, FX_LPCWSTR Default, FX_LPCWSTR cLabel, FPDF_BOOL bPassword, void* response, int length)
+ {
+ if (m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_response)
+ {
+ CFX_ByteString bsQuestion = CFX_WideString(Question).UTF16LE_Encode();
+ CFX_ByteString bsTitle = CFX_WideString(Title).UTF16LE_Encode();
+ CFX_ByteString bsDefault = CFX_WideString(Default).UTF16LE_Encode();
+ CFX_ByteString bsLabel = CFX_WideString(cLabel).UTF16LE_Encode();
+ FPDF_WIDESTRING pQuestion = (FPDF_WIDESTRING)bsQuestion.GetBuffer(bsQuestion.GetLength());
+ FPDF_WIDESTRING pTitle = (FPDF_WIDESTRING)bsTitle.GetBuffer(bsTitle.GetLength());
+ FPDF_WIDESTRING pDefault = (FPDF_WIDESTRING)bsDefault.GetBuffer(bsDefault.GetLength());
+ FPDF_WIDESTRING pLabel = (FPDF_WIDESTRING)bsLabel.GetBuffer(bsLabel.GetLength());
+ int ret = m_pInfo->m_pJsPlatform->app_response(m_pInfo->m_pJsPlatform, pQuestion, pTitle,
+ pDefault, pLabel, bPassword, response, length);
+ bsQuestion.ReleaseBuffer();
+ bsTitle.ReleaseBuffer();
+ bsDefault.ReleaseBuffer();
+ bsLabel.ReleaseBuffer();
+ return ret;
+ }
+ return -1;
+ }
+
+ virtual void JS_appBeep(int nType)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_beep)
+ {
+ m_pInfo->m_pJsPlatform->app_beep(m_pInfo->m_pJsPlatform, nType);
+ }
+ }
+
+ virtual CFX_WideString JS_fieldBrowse()
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Field_browse)
+ {
+ int nLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, NULL, 0);
+ if(nLen <= 0)
+ return L"";
+ char* pbuff = new char[nLen];
+ if(pbuff)
+ memset(pbuff, 0, nLen);
+ else
+ return L"";
+ nLen = m_pInfo->m_pJsPlatform->Field_browse(m_pInfo->m_pJsPlatform, pbuff, nLen);
+ CFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);
+ CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);
+ delete[] pbuff;
+ return wsRet;
+ }
+ return L"";
+ }
+
+ CFX_WideString JS_docGetFilePath()
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_getFilePath)
+ {
+ int nLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, NULL, 0);
+ if(nLen <= 0)
+ return L"";
+ char* pbuff = new char[nLen];
+ if(pbuff)
+ memset(pbuff, 0, nLen);
+ else
+ return L"";
+ nLen = m_pInfo->m_pJsPlatform->Doc_getFilePath(m_pInfo->m_pJsPlatform, pbuff, nLen);
+ CFX_ByteString bsRet = CFX_ByteString(pbuff, nLen);
+ CFX_WideString wsRet = CFX_WideString::FromLocal(bsRet);
+ delete[] pbuff;
+ return wsRet;
+ }
+ return L"";
+ }
+
+ void JS_docSubmitForm(void* formData, int length, FX_LPCWSTR URL)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_submitForm)
+ {
+ CFX_ByteString bsDestination = CFX_WideString(URL).UTF16LE_Encode();
+ FPDF_WIDESTRING pDestination = (FPDF_WIDESTRING)bsDestination.GetBuffer(bsDestination.GetLength());
+ m_pInfo->m_pJsPlatform->Doc_submitForm(m_pInfo->m_pJsPlatform, formData, length, pDestination);
+ bsDestination.ReleaseBuffer();
+ }
+ }
+
+ void JS_docmailForm(void* mailData, int length, FPDF_BOOL bUI,FX_LPCWSTR To, FX_LPCWSTR Subject, FX_LPCWSTR CC, FX_LPCWSTR BCC, FX_LPCWSTR Msg)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_mail)
+ {
+ CFX_ByteString bsTo = CFX_WideString(To).UTF16LE_Encode();
+ CFX_ByteString bsCC = CFX_WideString(Subject).UTF16LE_Encode();
+ CFX_ByteString bsBcc = CFX_WideString(BCC).UTF16LE_Encode();
+ CFX_ByteString bsSubject = CFX_WideString(Subject).UTF16LE_Encode();
+ CFX_ByteString bsMsg = CFX_WideString(Msg).UTF16LE_Encode();
+ FPDF_WIDESTRING pTo = (FPDF_WIDESTRING)bsTo.GetBuffer(bsTo.GetLength());
+ FPDF_WIDESTRING pCC = (FPDF_WIDESTRING)bsCC.GetBuffer(bsCC.GetLength());
+ FPDF_WIDESTRING pBcc = (FPDF_WIDESTRING)bsBcc.GetBuffer(bsBcc.GetLength());
+ FPDF_WIDESTRING pSubject = (FPDF_WIDESTRING)bsSubject.GetBuffer(bsSubject.GetLength());
+ FPDF_WIDESTRING pMsg = (FPDF_WIDESTRING)bsMsg.GetBuffer(bsMsg.GetLength());
+ m_pInfo->m_pJsPlatform->Doc_mail(m_pInfo->m_pJsPlatform, mailData, length, bUI, pTo, pSubject,
+ pCC, pBcc, pMsg);
+ bsTo.ReleaseBuffer();
+ bsCC.ReleaseBuffer();
+ bsBcc.ReleaseBuffer();
+ bsSubject.ReleaseBuffer();
+ bsMsg.ReleaseBuffer();
+ }
+ }
+ CFX_WideString JS_appbrowseForDoc(FPDF_BOOL bSave, FX_LPCWSTR cFilenameInit)
+ {
+ //to do....
+ return L"";
+// if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->app_browseForDoc)
+// {
+// CFX_ByteString bsFilenameInit = CFX_WideString(cFilenameInit).UTF16LE_Encode();
+// FPDF_WIDESTRING pFileNameInit = (FPDF_WIDESTRING)bsFilenameInit.GetBuffer(bsFilenameInit.GetLength());
+//
+// m_pInfo->m_pJsPlatform->app_browseForDoc(m_pInfo->m_pJsPlatform, pFileNameInit);
+// bsFilenameInit.ReleaseBuffer();
+// }
+ }
+
+ void JS_docprint(FPDF_BOOL bUI , int nStart, int nEnd, FPDF_BOOL bSilent ,FPDF_BOOL bShrinkToFit,FPDF_BOOL bPrintAsImage ,FPDF_BOOL bReverse ,FPDF_BOOL bAnnotations)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_print)
+ {
+ m_pInfo->m_pJsPlatform->Doc_print(m_pInfo->m_pJsPlatform, bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
+ }
+ }
+ void JS_docgotoPage(int nPageNum)
+ {
+ if(m_pInfo && m_pInfo->m_pJsPlatform && m_pInfo->m_pJsPlatform->Doc_gotoPage)
+ {
+ m_pInfo->m_pJsPlatform->Doc_gotoPage(m_pInfo->m_pJsPlatform, nPageNum);
+ }
+ }
+
+ virtual FPDF_PAGE FFI_GetPage(FPDF_DOCUMENT document,int nPageIndex)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetPage)
+ {
+ return m_pInfo->FFI_GetPage(m_pInfo, document, nPageIndex);
+ }
+ return NULL;
+ }
+
+ virtual FPDF_PAGE FFI_GetCurrentPage(FPDF_DOCUMENT document)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetCurrentPage)
+ {
+ return m_pInfo->FFI_GetCurrentPage(m_pInfo, document);
+ }
+ return NULL;
+ }
+
+ int FFI_GetRotation(FPDF_PAGE page)
+ {
+ if(m_pInfo && m_pInfo->FFI_GetRotation)
+ {
+ return m_pInfo->FFI_GetRotation(m_pInfo, page);
+ }
+ return 0;
+ }
+ void FFI_ExecuteNamedAction(FX_LPCSTR namedAction)
+ {
+ if(m_pInfo && m_pInfo->FFI_ExecuteNamedAction)
+ {
+ m_pInfo->FFI_ExecuteNamedAction(m_pInfo, namedAction);
+ }
+ }
+ void FFI_OnSetFieldInputFocus(void* field,FPDF_WIDESTRING focusText, FPDF_DWORD nTextLen, FX_BOOL bFocus)
+ {
+ if(m_pInfo && m_pInfo->FFI_SetTextFieldFocus)
+ {
+ m_pInfo->FFI_SetTextFieldFocus(m_pInfo, focusText, nTextLen, bFocus);
+ }
+ }
+
+ void FFI_DoURIAction(FX_LPCSTR bsURI)
+ {
+ if(m_pInfo && m_pInfo->FFI_DoURIAction)
+ {
+ m_pInfo->FFI_DoURIAction(m_pInfo, bsURI);
+ }
+ }
+
+ void FFI_DoGoToAction(int nPageIndex, int zoomMode, float* fPosArray, int sizeOfArray)
+ {
+ if(m_pInfo && m_pInfo->FFI_DoGoToAction)
+ {
+ m_pInfo->FFI_DoGoToAction(m_pInfo, nPageIndex, zoomMode, fPosArray, sizeOfArray);
+ }
+ }
+
+public:
+ FX_BOOL IsJSInitiated();
+
+public:
+ void SetCurrentDoc(CPDFSDK_Document* pFXDoc) {m_pSDKDoc = pFXDoc;}
+ CPDFSDK_Document* GetCurrentDoc();
+ CPDF_Document* GetPDFDocument() {return m_pPDFDoc;}
+// CPDFSDK_Document* GetDocument(int nIndex);
+// int CountDocuments() {return m_docMap.GetCount();}
+
+ CPDFSDK_Document* OpenDocument(CFX_WideString &fileName);
+ CPDFSDK_Document* OpenMemPDFDoc(CPDF_Document* pNewDoc, CFX_WideString &fileName);
+ FX_BOOL OpenURL(CFX_WideString &filePath);
+
+
+ CFX_ByteString GetAppName() {return "";}
+
+ CFFL_IFormFiller* GetIFormFiller();
+ IFX_SystemHandler* GetSysHandler() {return m_pSysHandler;}
+
+public:
+ CPDFSDK_AnnotHandlerMgr* GetAnnotHandlerMgr();
+ IFXJS_Runtime* GetJSRuntime();
+ CPDFSDK_ActionHandler* GetActionHander();
+private:
+ CPDFSDK_AnnotHandlerMgr* m_pAnnotHandlerMgr;
+ CPDFSDK_ActionHandler* m_pActionHandler;
+ IFXJS_Runtime* m_pJSRuntime;
+public:
+ FPDF_FORMFILLINFO* GetFormFillInfo() {return m_pInfo;}
+private:
+ FPDF_FORMFILLINFO* m_pInfo;
+// CFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docMap;
+ CPDFSDK_Document* m_pSDKDoc;
+ CPDF_Document* m_pPDFDoc;
+
+ CFFL_IFormFiller* m_pIFormFiller;
+ IFX_SystemHandler* m_pSysHandler;
+
+public:
+ CJS_RuntimeFactory* m_pJSRuntimeFactory;
+};
+
+
+
+// class CFX_App
+// {
+// public:
+// CFX_App():m_pCurDoc(NULL) {}
+// void SetAt(CPDF_Document* pPDFDoc, CPDFSDK_Document* pFXDoc);
+// CPDFSDK_Document* GetAt(CPDF_Document* pPDFDoc);
+// public:
+// void SetCurrentDocument(CPDFSDK_Document* pFXDoc) {m_pCurDoc = pFXDoc;}
+// CPDFSDK_Document* GetCurrentDocument() {return m_pCurDoc;}
+// private:
+// CFX_MapPtrTemplate<CPDF_Document*, CPDFSDK_Document*> m_docArray;
+// CPDFSDK_Document* m_pCurDoc;
+// };
+class CPDFSDK_InterForm;
+class CPDFSDK_Document
+{
+public:
+ CPDFSDK_Document(CPDF_Document* pDoc, CPDFDoc_Environment* pEnv);
+ ~CPDFSDK_Document();
+public:
+ CPDFSDK_InterForm* GetInterForm() ;
+ CPDF_Document* GetDocument() {return m_pDoc;}
+
+public:
+ void InitPageView();
+ void AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView);
+ CPDFSDK_PageView* GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew = TRUE);
+ CPDFSDK_PageView* GetPageView(int nIndex);
+ CPDFSDK_PageView* GetCurrentView();
+ void ReMovePageView(CPDF_Page* pPDFPage);
+ void UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot);
+
+ CPDFSDK_Annot* GetFocusAnnot();//{return NULL;}
+
+ IFXJS_Runtime * GetJsRuntime();
+
+ FX_BOOL SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag = 0);//{return FALSE;}
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0);
+
+ FX_BOOL ExtractPages(const CFX_WordArray &arrExtraPages, CPDF_Document* pDstDoc);
+ FX_BOOL InsertPages(int nInsertAt, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
+ FX_BOOL DeletePages(int nStart, int nCount);
+ FX_BOOL ReplacePages(int nPage, const CPDF_Document* pSrcDoc, const CFX_WordArray &arrSrcPages);
+
+ void OnCloseDocument();
+
+ int GetPageCount() {return m_pDoc->GetPageCount();}
+ FX_BOOL GetPermissions(int nFlag);
+ FX_BOOL GetChangeMark() {return m_bChangeMask;}
+ void SetChangeMark() {m_bChangeMask = TRUE;}
+ void ClearChangeMark() {m_bChangeMask= FALSE;}
+// FX_BOOL GetChangeMark(){return FALSE;}//IsAnnotModified()||IsFormModified() || IsWidgetModified()|| m_nChangeMark>0 ;}
+// void ClearChangeMark(){}
+ CFX_WideString GetPath() ;
+ CPDF_Page* GetPage(int nIndex);
+ CPDFDoc_Environment * GetEnv() {return m_pEnv; }
+ void ProcJavascriptFun();
+ FX_BOOL ProcOpenAction();
+ CPDF_OCContext* GetOCContext();
+private:
+ //CFX_ArrayTemplate<CPDFSDK_PageView*> m_pageArray;
+ CFX_MapPtrTemplate<CPDF_Page*, CPDFSDK_PageView*> m_pageMap;
+ CPDF_Document* m_pDoc;
+
+ CPDFSDK_InterForm* m_pInterForm;
+ CPDFSDK_Annot* m_pFocusAnnot;
+ CPDFDoc_Environment * m_pEnv;
+ CPDF_OCContext * m_pOccontent;
+ FX_BOOL m_bChangeMask;
+};
+
+class CPDFSDK_PageView
+{
+public:
+ CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page);
+ ~CPDFSDK_PageView();
+public:
+ virtual void PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions) ;
+public:
+ CPDF_Annot* GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDF_Annot* GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY);
+ CPDFSDK_Annot* GetFocusAnnot() ;
+ void SetFocusAnnot(CPDFSDK_Annot* pSDKAnnot,FX_UINT nFlag = 0) {m_pSDKDoc->SetFocusAnnot(pSDKAnnot, nFlag);}
+ FX_BOOL KillFocusAnnot(FX_UINT nFlag = 0) {return m_pSDKDoc->KillFocusAnnot(nFlag);}
+ FX_BOOL Annot_HasAppearance(CPDF_Annot* pAnnot);
+
+ CPDFSDK_Annot* AddAnnot(CPDF_Dictionary * pDict);
+ CPDFSDK_Annot* AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict);
+ CPDFSDK_Annot* AddAnnot(CPDF_Annot * pPDFAnnot);
+ FX_BOOL DeleteAnnot(CPDFSDK_Annot* pAnnot);
+
+ int CountAnnots();
+ CPDFSDK_Annot* GetAnnot(int nIndex);
+ CPDFSDK_Annot* GetAnnotByDict(CPDF_Dictionary * pDict);
+ CPDF_Page* GetPDFPage(){return m_page;}
+ CPDF_Document* GetPDFDocument();
+ CPDFSDK_Document* GetSDKDocument() {return m_pSDKDoc;}
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag);
+ virtual FX_BOOL OnChar(int nChar, FX_UINT nFlag);
+ virtual FX_BOOL OnKeyDown(int nKeyCode, int nFlag);
+ virtual FX_BOOL OnKeyUp(int nKeyCode, int nFlag);
+
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, int nFlag);
+ virtual FX_BOOL OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag);
+ virtual FX_BOOL IsValidAnnot(FX_LPVOID p);
+public:
+ virtual void GetCurrentMatrix(CPDF_Matrix& matrix) {matrix = m_curMatrix;}
+ virtual void UpdateRects(CFX_RectArray& rects);
+ void UpdateView(CPDFSDK_Annot* pAnnot);
+ CFX_PtrArray* GetAnnotList(){ return &m_fxAnnotArray; }
+
+public:
+ virtual int GetPageIndex();
+ void LoadFXAnnots();
+private:
+ CPDF_Matrix m_curMatrix;
+
+private:
+ void PageView_OnHighlightFormFields(CFX_RenderDevice* pDevice, CPDFSDK_Widget* pWidget);
+
+private:
+ CPDF_Page* m_page;
+ CPDF_AnnotList* m_pAnnotList;
+
+ //CPDFSDK_Annot* m_pFocusAnnot;
+ CFX_PtrArray m_fxAnnotArray;
+
+ CPDFSDK_Document* m_pSDKDoc;
+private:
+ CPDFSDK_Widget* m_CaptureWidget;
+ FX_BOOL m_bEnterWidget;
+ FX_BOOL m_bExitWidget;
+ FX_BOOL m_bOnWidget;
+public:
+ void SetValid(FX_BOOL bValid) {m_bValid = bValid;}
+ FX_BOOL IsValid() {return m_bValid;}
+private:
+ FX_BOOL m_bValid;
+};
+
+
+template<class TYPE>
+class CGW_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ CGW_ArrayTemplate(){}
+ virtual ~CGW_ArrayTemplate(){}
+
+ typedef int (*LP_COMPARE)(TYPE p1, TYPE p2);
+
+ void Sort(LP_COMPARE pCompare, FX_BOOL bAscent = TRUE)
+ {
+ int nSize = this->GetSize();
+ QuickSort(0, nSize -1, bAscent, pCompare);
+ }
+
+private:
+ void QuickSort(FX_UINT nStartPos, FX_UINT nStopPos, FX_BOOL bAscend, LP_COMPARE pCompare)
+ {
+ if (nStartPos >= nStopPos) return;
+
+ if ((nStopPos - nStartPos) == 1)
+ {
+ TYPE Value1 = this->GetAt(nStartPos);
+ TYPE Value2 = this->GetAt(nStopPos);
+
+ int iGreate = (*pCompare)(Value1, Value2);
+ if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
+ {
+ this->SetAt(nStartPos, Value2);
+ this->SetAt(nStopPos, Value1);
+ }
+ return;
+ }
+
+ FX_UINT m = (nStartPos + nStopPos) / 2;
+ FX_UINT i = nStartPos;
+
+ TYPE Value = this->GetAt(m);
+
+ while (i < m)
+ {
+ TYPE temp = this->GetAt(i);
+
+ int iGreate = (*pCompare)(temp, Value);
+ if ((bAscend && iGreate > 0) || (!bAscend && iGreate < 0))
+ {
+ this->InsertAt(m+1, temp);
+ this->RemoveAt(i);
+ m--;
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ FX_UINT j = nStopPos;
+
+ while (j > m)
+ {
+ TYPE temp = this->GetAt(j);
+
+ int iGreate = (*pCompare)(temp, Value);
+ if ((bAscend && iGreate < 0) || (!bAscend && iGreate > 0))
+ {
+ this->RemoveAt(j);
+ this->InsertAt(m, temp);
+ m++;
+ }
+ else
+ {
+ j--;
+ }
+ }
+
+ if (nStartPos < m) QuickSort(nStartPos, m, bAscend, pCompare);
+ if (nStopPos > m) QuickSort(m, nStopPos, bAscend, pCompare);
+ }
+};
+
+
+#endif //_FPDFSDK_MGR_H
+
diff --git a/fpdfsdk/include/fsdk_rendercontext.h b/fpdfsdk/include/fsdk_rendercontext.h
new file mode 100644
index 0000000000..c33dfddfa5
--- /dev/null
+++ b/fpdfsdk/include/fsdk_rendercontext.h
@@ -0,0 +1,41 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _RENDERCONTENT_H_
+#define _RENDERCONTENT_H_
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_progressive.h"
+
+// Everything about rendering is put here: for OOM recovery
+class CRenderContext : public CFX_Object
+{
+public:
+ CRenderContext() { Clear(); }
+ ~CRenderContext();
+
+ void Clear();
+
+ CFX_RenderDevice* m_pDevice;
+ CPDF_RenderContext* m_pContext;
+ CPDF_ProgressiveRenderer* m_pRenderer;
+ CPDF_AnnotList* m_pAnnots;
+ CPDF_RenderOptions* m_pOptions;
+#ifdef _WIN32_WCE
+ CFX_DIBitmap* m_pBitmap;
+ HBITMAP m_hBitmap;
+#endif
+};
+
+class IFSDK_PAUSE_Adapter : public IFX_Pause
+{
+public:
+ IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause );
+ FX_BOOL NeedToPauseNow();
+
+private:
+ IFSDK_PAUSE* m_IPause;
+};
+#endif
diff --git a/fpdfsdk/include/fx_systemhandler.h b/fpdfsdk/include/fx_systemhandler.h
new file mode 100644
index 0000000000..c760377194
--- /dev/null
+++ b/fpdfsdk/include/fx_systemhandler.h
@@ -0,0 +1,85 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SYSTEMHANDLER_H_
+#define _FX_SYSTEMHANDLER_H_
+
+typedef FX_LPVOID FX_HWND;
+typedef FX_LPVOID FX_HMENU;
+typedef void (*TimerCallback)(FX_INT32 idEvent);
+
+typedef struct _FX_SYSTEMTIME
+{
+ FX_WORD wYear;
+ FX_WORD wMonth;
+ FX_WORD wDayOfWeek;
+ FX_WORD wDay;
+ FX_WORD wHour;
+ FX_WORD wMinute;
+ FX_WORD wSecond;
+ FX_WORD wMilliseconds;
+}FX_SYSTEMTIME;
+
+//cursor style
+#define FXCT_ARROW 0
+#define FXCT_NESW 1
+#define FXCT_NWSE 2
+#define FXCT_VBEAM 3
+#define FXCT_HBEAM 4
+#define FXCT_HAND 5
+
+class IFX_SystemHandler
+{
+public:
+ virtual ~IFX_SystemHandler() {}
+ virtual void InvalidateRect(FX_HWND hWnd, FX_RECT rect) = 0;
+ virtual void OutputSelectedRect(void* pFormFiller, CPDF_Rect&rect) = 0;
+
+ virtual FX_BOOL IsSelectionImplemented() = 0;
+
+ virtual CFX_WideString GetClipboardText(FX_HWND hWnd) = 0;
+ virtual FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString string) = 0;
+
+ virtual void ClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;
+ virtual void ScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) = 0;
+
+ /*cursor style
+ FXCT_ARROW
+ FXCT_NESW
+ FXCT_NWSE
+ FXCT_VBEAM
+ FXCT_HBEAM
+ FXCT_HAND
+ */
+ virtual void SetCursor(FX_INT32 nCursorType) = 0;
+
+ virtual FX_HMENU CreatePopupMenu() = 0;
+ virtual FX_BOOL AppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) = 0;
+ virtual FX_BOOL EnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) = 0;
+ virtual FX_INT32 TrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) = 0;
+ virtual void DestroyMenu(FX_HMENU hMenu) = 0;
+
+ virtual CFX_ByteString GetNativeTrueTypeFont(FX_INT32 nCharset) = 0;
+ virtual FX_BOOL FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName) = 0;
+ virtual CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset) = 0;
+
+ virtual FX_INT32 SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) = 0;
+ virtual void KillTimer(FX_INT32 nID) = 0;
+
+
+ virtual FX_BOOL IsSHIFTKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsCTRLKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsALTKeyDown(FX_DWORD nFlag) = 0;
+ virtual FX_BOOL IsINSERTKeyDown(FX_DWORD nFlag) = 0;
+
+ virtual FX_SYSTEMTIME GetLocalTime() = 0;
+
+ virtual FX_INT32 GetCharSet() = 0;
+ virtual void SetCharSet(FX_INT32 nCharSet) = 0;
+};
+
+#endif //_FX_SYSTEMHANDLER_H_
+
diff --git a/fpdfsdk/include/fxedit/fx_edit.h b/fpdfsdk/include/fxedit/fx_edit.h
new file mode 100644
index 0000000000..2b73e61bc4
--- /dev/null
+++ b/fpdfsdk/include/fxedit/fx_edit.h
@@ -0,0 +1,471 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_EDIT_H_
+#define _FX_EDIT_H_
+
+#define PVTWORD_STYLE_NORMAL 0x0000L
+#define PVTWORD_STYLE_HIGHLIGHT 0x0001L
+#define PVTWORD_STYLE_UNDERLINE 0x0002L
+#define PVTWORD_STYLE_CROSSOUT 0x0004L
+#define PVTWORD_STYLE_SQUIGGLY 0x0008L
+#define PVTWORD_STYLE_DUALCROSSOUT 0x0010L
+#define PVTWORD_STYLE_BOLD 0x0020L
+#define PVTWORD_STYLE_ITALIC 0x0040L
+
+#define FX_EDIT_ISLATINWORD(u) (u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))
+
+#ifdef FX_READER_DLL
+ #ifdef FXET_EXPORT
+ #define FXET_CLASS __declspec(dllexport)
+ #else
+ #define FXET_CLASS
+ #endif
+#else
+ #define FXET_CLASS
+#endif
+
+#ifndef DEFAULT_CHARSET
+#define DEFAULT_CHARSET 1
+#endif
+
+class IFX_Edit_FontMap;
+class IFX_Edit_Notify;
+class IFX_Edit_Iterator;
+class IFX_Edit_UndoItem;
+class IFX_Edit;
+class IFX_List_Notify;
+class IFX_List;
+class IFX_SystemHandler;
+
+class IFX_Edit_FontMap
+{
+public:
+ //map a fontindex to pdf font.
+ virtual CPDF_Font * GetPDFFont(FX_INT32 nFontIndex) = 0;
+ //get the alias of a pdf font.
+ virtual CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex) = 0;
+ //get the index of a font that can show a word.
+ virtual FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex) = 0;
+ //get the charcode of word from unicode
+ virtual FX_INT32 CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) = 0;
+ //get the charset of unicode
+ virtual FX_INT32 CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) = 0;
+};
+
+class IFX_Edit_Notify
+{
+ //this class is implemented by user
+public:
+ //set the horizontal scrollbar information.
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the vertical scrollbar information.
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the position of horizontal scrollbar.
+ virtual void IOnSetScrollPosX(FX_FLOAT fx) = 0;
+ //set the position of vertical scrollbar.
+ virtual void IOnSetScrollPosY(FX_FLOAT fy) = 0;
+ //set the caret information.
+ virtual void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place) = 0;
+ //if the caret position is changed ,send the information of current postion to user.
+ virtual void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps) = 0;
+ //if the text area is changed, send the information to user.
+ virtual void IOnContentChange(const CPDF_Rect& rcContent) = 0;
+ //Invalidate the rectangle relative to the bounding box of edit.
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect) = 0;
+};
+
+class IFX_Edit_OprNotify
+{
+ //this class is implemented by user
+public:
+ //OprType: 0
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 1
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 2
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 3
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 4
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 5
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //OprType: 6
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace) = 0;
+ //
+ virtual void OnAddUndo(IFX_Edit_UndoItem* pUndoItem) = 0;
+};
+
+class IFX_Edit_Iterator
+{
+public:
+ virtual ~IFX_Edit_Iterator() {}
+public:
+ //move the current position to the next word.
+ virtual FX_BOOL NextWord() = 0;
+ //move the current position to the next line.
+ virtual FX_BOOL NextLine() = 0;
+ //move the current position to the next section.
+ virtual FX_BOOL NextSection() = 0;
+
+ //move the current position to the previous word.
+ virtual FX_BOOL PrevWord() = 0;
+ //move the current position to the previous line.
+ virtual FX_BOOL PrevLine() = 0;
+ //move the current position to the previous section.
+ virtual FX_BOOL PrevSection() = 0;
+
+ //get the information of the current word.
+ virtual FX_BOOL GetWord(CPVT_Word & word) const = 0;
+ //get the information of the current line.
+ virtual FX_BOOL GetLine(CPVT_Line & line) const = 0;
+ //get the information of the current section.
+ virtual FX_BOOL GetSection(CPVT_Section & section) const = 0;
+ //set the current position.
+ virtual void SetAt(FX_INT32 nWordIndex) = 0;
+ //set the current position.
+ virtual void SetAt(const CPVT_WordPlace & place) = 0;
+ //get the current position.
+ virtual const CPVT_WordPlace & GetAt() const = 0;
+
+ //get the edit which this iterator belongs to
+ virtual IFX_Edit* GetEdit() const = 0;
+};
+
+class IFX_Edit_UndoItem
+{
+public:
+ virtual void Undo() = 0;
+ virtual void Redo() = 0;
+ virtual CFX_WideString GetUndoTitle() = 0;
+ virtual void Release() = 0;
+};
+
+class FXET_CLASS IFX_Edit
+{
+public:
+ static IFX_Edit* NewEdit();
+ static void DelEdit(IFX_Edit* pEdit);
+
+public:
+ //set a IFX_Edit_FontMap pointer implemented by user.
+ virtual void SetFontMap(IFX_Edit_FontMap* pFontMap) = 0;
+ //if user don't like to use FontMap, implement VTProvider and set it directly.
+ virtual void SetVTProvider(IPDF_VariableText_Provider* pProvider) = 0;
+ //set a IFX_Edit_Notify pointer implemented by user.
+ virtual void SetNotify(IFX_Edit_Notify * pNotify) = 0;
+ virtual void SetOprNotify(IFX_Edit_OprNotify* pOprNotify) = 0;
+ //get a pointer allocated by CPDF_Edit, by this pointer, user can iterate the contents of edit, but don't need to release.
+ virtual IFX_Edit_Iterator* GetIterator() = 0;
+ //get a VT pointer relative to this edit.
+ virtual IPDF_VariableText* GetVariableText() = 0;
+ //get the IFX_Edit_FontMap pointer set by user.
+ virtual IFX_Edit_FontMap* GetFontMap() = 0;
+
+ //initialize the edit.
+ virtual void Initialize() = 0;
+
+ //set the bounding box of the text area.
+ virtual void SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE) = 0;
+ //set the scroll origin
+ virtual void SetScrollPos(const CPDF_Point & point) = 0;
+
+ //set the horizontal text alignment in text box, nFormat (0:left 1:middle 2:right).
+ virtual void SetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
+ //set the vertical text alignment in text box, nFormat (0:top 1:center 2:bottom).
+ virtual void SetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE) = 0;
+ //if the text is shown in secret , set a character for substitute.
+ virtual void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE) = 0;
+ //set the maximal count of words of the text.
+ virtual void SetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE) = 0;
+ //if set the count of charArray , then all words is shown in equal space.
+ virtual void SetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE) = 0;
+ //set the space of two characters.
+ virtual void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE) = 0;
+ //set the horizontal scale of all characters.
+ virtual void SetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE) = 0;
+ //set the leading of all lines
+ virtual void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE) = 0;
+ //if set, CRLF is allowed.
+ virtual void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //if set, all words auto fit the width of the bounding box.
+ virtual void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //if set, a font size is calculated to full fit the bounding box.
+ virtual void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //is set, the text is allowed to scroll.
+ virtual void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //set the font size of all words.
+ virtual void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE) = 0;
+ //the text is allowed to auto-scroll, allow the text overflow?
+ virtual void SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE) = 0;
+
+ //query if the edit is richedit.
+ virtual FX_BOOL IsRichText() const = 0;
+ //set the edit is richedit.
+ virtual void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE) = 0;
+ //set the fontsize of selected text.
+ virtual FX_BOOL SetRichFontSize(FX_FLOAT fFontSize) = 0;
+ //set the fontindex of selected text, user can change the font of selected text.
+ virtual FX_BOOL SetRichFontIndex(FX_INT32 nFontIndex) = 0;
+ //set the textcolor of selected text.
+ virtual FX_BOOL SetRichTextColor(FX_COLORREF dwColor) = 0;
+ //set the text script type of selected text. (0:normal 1:superscript 2:subscript)
+ virtual FX_BOOL SetRichTextScript(FX_INT32 nScriptType) = 0;
+ //set the bold font style of selected text.
+ virtual FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE) = 0;
+ //set the italic font style of selected text.
+ virtual FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE) = 0;
+ //set the underline style of selected text.
+ virtual FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE) = 0;
+ //set the crossout style of selected text.
+ virtual FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE) = 0;
+ //set the charspace of selected text, in user coordinate.
+ virtual FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace) = 0;
+ //set the horizontal scale of selected text, default value is 100.
+ virtual FX_BOOL SetRichTextHorzScale(FX_INT32 nHorzScale = 100) = 0;
+ //set the leading of selected section, in user coordinate.
+ virtual FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading) = 0;
+ //set the indent of selected section, in user coordinate.
+ virtual FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent) = 0;
+ //set the alignment of selected section, nAlignment(0:left 1:middle 2:right)
+ virtual FX_BOOL SetRichTextAlignment(FX_INT32 nAlignment) = 0;
+
+ //set the selected range of text.
+ //if nStartChar == 0 and nEndChar == -1, select all the text.
+ virtual void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar) = 0;
+ //get the selected range of text.
+ virtual void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const = 0;
+ //select all the text.
+ virtual void SelectAll() = 0;
+ //set text is not selected.
+ virtual void SelectNone() = 0;
+ //get the caret position.
+ virtual FX_INT32 GetCaret() const = 0;
+ virtual CPVT_WordPlace GetCaretWordPlace() const = 0;
+ //get the string of selected text.
+ virtual CFX_WideString GetSelText() const = 0;
+ //get the text conent
+ virtual CFX_WideString GetText() const = 0;
+ //query if any text is selected.
+ virtual FX_BOOL IsSelected() const = 0;
+ //get the scroll origin
+ virtual CPDF_Point GetScrollPos() const = 0;
+ //get the bounding box of the text area.
+ virtual CPDF_Rect GetPlateRect() const = 0;
+ //get the fact area of the text.
+ virtual CPDF_Rect GetContentRect() const = 0;
+ //get the visible word range
+ virtual CPVT_WordRange GetVisibleWordRange() const = 0;
+ //get the whole word range
+ virtual CPVT_WordRange GetWholeWordRange() const = 0;
+ //get the word range of select text
+ virtual CPVT_WordRange GetSelectWordRange() const = 0;
+
+ //send the mousedown message to edit for response.
+ //if Shift key is hold, bShift is TRUE, is Ctrl key is hold, bCtrl is TRUE.
+ virtual void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the mousemove message to edit when mouse down is TRUE.
+ virtual void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the UP key message to edit.
+ virtual void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the DOWN key message to edit.
+ virtual void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the LEFT key message to edit.
+ virtual void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the RIGHT key message to edit.
+ virtual void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the HOME key message to edit.
+ virtual void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ //send the END key message to edit.
+ virtual void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+
+ //put text into edit.
+ virtual void SetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert a word into the edit.
+ virtual FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert a return into the edit.
+ virtual FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //insert text into the edit.
+ virtual FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL) = 0;
+ //do backspace operation.
+ virtual FX_BOOL Backspace() = 0;
+ //do delete operation.
+ virtual FX_BOOL Delete() = 0;
+ //delete the selected text.
+ virtual FX_BOOL Clear() = 0;
+
+ //do Redo operation.
+ virtual FX_BOOL Redo() = 0;
+ //do Undo operation.
+ virtual FX_BOOL Undo() = 0;
+ //move caret
+ virtual void SetCaret(FX_INT32 nPos) = 0;
+
+ //arrange all words over again
+ virtual void Paint() = 0;
+
+ //allow to refresh screen?
+ virtual void EnableRefresh(FX_BOOL bRefresh) = 0;
+
+ virtual void RefreshWordRange(const CPVT_WordRange& wr) = 0;
+
+ //allow undo/redo?
+ virtual void EnableUndo(FX_BOOL bUndo) = 0;
+
+ //allow notify?
+ virtual void EnableNotify(FX_BOOL bNotify) = 0;
+
+ //allow opr notify?
+ virtual void EnableOprNotify(FX_BOOL bNotify) = 0;
+
+ //map word place to word index.
+ virtual FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const = 0;
+ //map word index to word place.
+ virtual CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const = 0;
+
+ //get the beginning position of a line
+ virtual CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the ending position of a line
+ virtual CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the beginning position of a section
+ virtual CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const = 0;
+
+ //get the ending position of a section
+ virtual CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const = 0;
+
+ //search a wordplace form point
+ virtual CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const = 0;
+
+ //get the font size of non_rich text or default font size of richtext.
+ virtual FX_FLOAT GetFontSize() const = 0;
+ //get the mask character.
+ virtual FX_WORD GetPasswordChar() const = 0;
+ //get the count of charArray
+ virtual FX_INT32 GetCharArray() const = 0;
+ //get the horizontal scale of all characters
+ virtual FX_INT32 GetHorzScale() const = 0;
+ //get the space of two characters
+ virtual FX_FLOAT GetCharSpace() const = 0;
+ //get the latin words of specified range
+ virtual CFX_WideString GetRangeText(const CPVT_WordRange & range) const = 0;
+ //is the text full in bounding box
+ virtual FX_BOOL IsTextFull() const = 0;
+ virtual FX_BOOL CanUndo() const = 0;
+ virtual FX_BOOL CanRedo() const = 0;
+ //if the content is changed after settext?
+ virtual FX_BOOL IsModified() const = 0;
+ //get the total words in edit
+ virtual FX_INT32 GetTotalWords() const = 0;
+
+ virtual void AddUndoItem(IFX_Edit_UndoItem* pUndoItem) = 0;
+
+public:
+ static CFX_ByteString GetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange* pRange = NULL,
+ FX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);
+ static CFX_ByteString GetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange* pRange = NULL);
+ static void DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData);
+ static void DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
+ static void DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange);
+ static void GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ static void GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ static void GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color);
+};
+
+class IFX_List_Notify
+{
+ //this class is implemented by user
+public:
+ //set the horizontal scrollbar information.
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the vertical scrollbar information.
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep) = 0;
+ //set the position of horizontal scrollbar.
+ virtual void IOnSetScrollPosX(FX_FLOAT fx) = 0;
+ //set the position of vertical scrollbar.
+ virtual void IOnSetScrollPosY(FX_FLOAT fy) = 0;
+ //Invalidate the rectangle relative to the bounding box of edit.
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect) = 0;
+};
+
+class FXET_CLASS IFX_List
+{
+public:
+ static IFX_List* NewList();
+ static void DelList(IFX_List* pList);
+
+public:
+ virtual void SetFontMap(IFX_Edit_FontMap * pFontMap) = 0;
+ virtual void SetNotify(IFX_List_Notify * pNotify) = 0;
+
+ virtual void SetPlateRect(const CPDF_Rect & rect) = 0;
+ virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
+
+ virtual CPDF_Rect GetPlateRect() const = 0;
+ virtual CPDF_Rect GetContentRect() const = 0;
+
+ virtual FX_FLOAT GetFontSize() const = 0;
+ virtual IFX_Edit* GetItemEdit(FX_INT32 nIndex) const = 0;
+ virtual FX_INT32 GetCount() const = 0;
+ virtual FX_BOOL IsItemSelected(FX_INT32 nIndex) const = 0;
+ virtual FX_FLOAT GetFirstHeight() const = 0;
+
+ virtual void SetMultipleSel(FX_BOOL bMultiple) = 0;
+ virtual FX_BOOL IsMultipleSel() const = 0;
+ virtual FX_BOOL IsValid(FX_INT32 nItemIndex) const = 0;
+ virtual FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const = 0;
+
+ virtual void SetScrollPos(const CPDF_Point & point) = 0;
+ virtual void ScrollToListItem(FX_INT32 nItemIndex) = 0;
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const = 0;
+ virtual FX_INT32 GetCaret() const = 0;
+ virtual FX_INT32 GetSelect() const = 0;
+ virtual FX_INT32 GetTopItem() const = 0;
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const = 0;
+ virtual FX_INT32 GetFirstSelected() const = 0;
+
+ virtual void AddString(FX_LPCWSTR string) = 0;
+ virtual void SetTopItem(FX_INT32 nIndex) = 0;
+ virtual void Select(FX_INT32 nItemIndex) = 0;
+ virtual void SetCaret(FX_INT32 nItemIndex) = 0;
+ virtual void Empty() = 0;
+ virtual void Cancel() = 0;
+ virtual CFX_WideString GetText() const = 0;
+
+
+ virtual void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual void OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+ virtual FX_BOOL OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) = 0;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/fxedit/fxet_edit.h b/fpdfsdk/include/fxedit/fxet_edit.h
new file mode 100644
index 0000000000..72b780956d
--- /dev/null
+++ b/fpdfsdk/include/fxedit/fxet_edit.h
@@ -0,0 +1,823 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXET_EDIT_H_
+#define _FXET_EDIT_H_
+
+#include "fx_edit.h"
+
+class CFX_Edit_Page;
+struct CFX_Edit_LineRect;
+class CFX_Edit_LineRectArray;
+class CFX_Edit_RectArray;
+class CFX_Edit_Refresh;
+class CFX_Edit_Select;
+class CFX_Edit;
+class CFX_Edit_Iterator;
+class CFX_Edit_Refresh;
+class CFX_Edit_UndoItem;
+class CFX_Edit_Undo;
+class CFX_Edit_Provider;
+
+#define FX_EDIT_IsFloatZero(f) (f < 0.0001 && f > -0.0001)
+#define FX_EDIT_IsFloatEqual(fa,fb) FX_EDIT_IsFloatZero(fa - fb)
+#define FX_EDIT_IsFloatBigger(fa,fb) (fa > fb && !FX_EDIT_IsFloatEqual(fa,fb))
+#define FX_EDIT_IsFloatSmaller(fa,fb) (fa < fb && !FX_EDIT_IsFloatEqual(fa,fb))
+
+template<class T> T FX_EDIT_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T FX_EDIT_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+#define FX_EDIT_PI 3.14159265358979f
+#define FX_EDIT_ITALIC_ANGEL 10 * FX_EDIT_PI / 180.0f
+
+
+/* ------------------------- CFX_Edit_Refresh ---------------------------- */
+
+enum REFRESH_PLAN_E
+{
+ RP_ANALYSE,
+ RP_NOANALYSE,
+ RP_OPTIONAL
+};
+
+enum EDIT_PROPS_E
+{
+ EP_LINELEADING,
+ EP_LINEINDENT,
+ EP_ALIGNMENT,
+ EP_FONTINDEX,
+ EP_FONTSIZE,
+ EP_WORDCOLOR,
+ EP_SCRIPTTYPE,
+ EP_UNDERLINE,
+ EP_CROSSOUT,
+ EP_CHARSPACE,
+ EP_HORZSCALE,
+ EP_BOLD,
+ EP_ITALIC
+};
+
+struct CFX_Edit_LineRect
+{
+ CFX_Edit_LineRect(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine) :
+ m_wrLine(wrLine), m_rcLine(rcLine)
+ {
+ }
+
+ FX_BOOL operator != (const CFX_Edit_LineRect & linerect) const
+ {
+ return FXSYS_memcmp(this, &linerect, sizeof(CFX_Edit_LineRect)) != 0;
+ }
+
+ FX_BOOL IsSameHeight(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero((m_rcLine.top - m_rcLine.bottom) - (linerect.m_rcLine.top -linerect.m_rcLine.bottom));
+ }
+
+ FX_BOOL IsSameTop(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.top - linerect.m_rcLine.top);
+ }
+
+ FX_BOOL IsSameLeft(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.left - linerect.m_rcLine.left);
+ }
+
+ FX_BOOL IsSameRight(const CFX_Edit_LineRect & linerect) const
+ {
+ return FX_EDIT_IsFloatZero(m_rcLine.right - linerect.m_rcLine.right);
+ }
+
+ CPVT_WordRange m_wrLine;
+ CPDF_Rect m_rcLine;
+};
+
+class CFX_Edit_LineRectArray
+{
+public:
+ CFX_Edit_LineRectArray()
+ {
+ }
+
+ virtual ~CFX_Edit_LineRectArray()
+ {
+ Empty();
+ }
+
+ void Empty()
+ {
+ for (FX_INT32 i = 0, sz = m_LineRects.GetSize(); i < sz; i++)
+ delete m_LineRects.GetAt(i);
+
+ m_LineRects.RemoveAll();
+ }
+
+ void RemoveAll()
+ {
+ m_LineRects.RemoveAll();
+ }
+
+ void operator = (CFX_Edit_LineRectArray & rects)
+ {
+ Empty();
+ for (FX_INT32 i = 0, sz = rects.GetSize(); i < sz; i++)
+ m_LineRects.Add(rects.GetAt(i));
+
+ rects.RemoveAll();
+ }
+
+ void Add(const CPVT_WordRange & wrLine,const CPDF_Rect & rcLine)
+ {
+ if (CFX_Edit_LineRect * pRect = new CFX_Edit_LineRect(wrLine,rcLine))
+ m_LineRects.Add(pRect);
+ }
+
+ FX_INT32 GetSize() const
+ {
+ return m_LineRects.GetSize();
+ }
+
+ CFX_Edit_LineRect * GetAt(FX_INT32 nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_LineRects.GetSize())
+ return NULL;
+
+ return m_LineRects.GetAt(nIndex);
+ }
+
+ CFX_ArrayTemplate<CFX_Edit_LineRect*> m_LineRects;
+};
+
+class CFX_Edit_RectArray
+{
+public:
+ CFX_Edit_RectArray()
+ {
+ }
+
+ virtual ~CFX_Edit_RectArray()
+ {
+ this->Empty();
+ }
+
+ void Empty()
+ {
+ for (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)
+ delete m_Rects.GetAt(i);
+
+ this->m_Rects.RemoveAll();
+ }
+
+ void Add(const CPDF_Rect & rect)
+ {
+ //check for overlaped area
+ for (FX_INT32 i = 0, sz = m_Rects.GetSize(); i < sz; i++)
+ if (CPDF_Rect * pRect = m_Rects.GetAt(i))
+ if (pRect->Contains(rect))return;
+
+ if (CPDF_Rect * pNewRect = new CPDF_Rect(rect))
+ m_Rects.Add(pNewRect);
+ }
+
+ FX_INT32 GetSize() const
+ {
+ return m_Rects.GetSize();
+ }
+
+ CPDF_Rect * GetAt(FX_INT32 nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_Rects.GetSize())
+ return NULL;
+
+ return m_Rects.GetAt(nIndex);
+ }
+
+ CFX_ArrayTemplate<CPDF_Rect*> m_Rects;
+};
+
+class CFX_Edit_Refresh
+{
+public:
+ CFX_Edit_Refresh();
+ virtual ~CFX_Edit_Refresh();
+
+ void BeginRefresh();
+ void Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect);
+ void NoAnalyse();
+ void Analyse(FX_INT32 nAlignment);
+ void AddRefresh(const CPDF_Rect & rect);
+ const CFX_Edit_RectArray * GetRefreshRects() const;
+ void EndRefresh();
+
+private:
+ CFX_Edit_LineRectArray m_NewLineRects;
+ CFX_Edit_LineRectArray m_OldLineRects;
+ CFX_Edit_RectArray m_RefreshRects;
+};
+
+
+/* ------------------------- CFX_Edit_Select ---------------------------- */
+
+class CFX_Edit_Select
+{
+public:
+ CFX_Edit_Select()
+ {
+ }
+
+ CFX_Edit_Select(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
+ {
+ Set(begin,end);
+ }
+
+ CFX_Edit_Select(const CPVT_WordRange & range)
+ {
+ Set(range.BeginPos,range.EndPos);
+ }
+
+ CPVT_WordRange ConvertToWordRange() const
+ {
+ return CPVT_WordRange(this->BeginPos,this->EndPos);
+ }
+
+ void Default()
+ {
+ BeginPos.Default();
+ EndPos.Default();
+ }
+
+ void Set(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
+ {
+ this->BeginPos = begin;
+ this->EndPos = end;
+ }
+
+ void SetBeginPos(const CPVT_WordPlace & begin)
+ {
+ this->BeginPos = begin;
+ }
+
+ void SetEndPos(const CPVT_WordPlace & end)
+ {
+ this->EndPos = end;
+ }
+
+ FX_BOOL IsExist() const
+ {
+ return this->BeginPos != this->EndPos;
+ }
+
+ FX_BOOL operator != (const CPVT_WordRange & wr) const
+ {
+ return wr.BeginPos != this->BeginPos || wr.EndPos != this->EndPos;
+ }
+
+ CPVT_WordPlace BeginPos,EndPos;
+};
+
+/* ------------------------- CFX_Edit_Undo ---------------------------- */
+
+class CFX_Edit_Undo
+{
+public:
+ CFX_Edit_Undo(FX_INT32 nBufsize = 10000);
+ virtual ~CFX_Edit_Undo();
+
+ void Undo();
+ void Redo();
+
+ void AddItem(IFX_Edit_UndoItem* pItem);
+
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ FX_BOOL IsModified() const;
+ FX_BOOL IsWorking() const;
+
+ void Reset();
+
+ IFX_Edit_UndoItem* GetItem(FX_INT32 nIndex);
+ FX_INT32 GetItemCount(){return m_UndoItemStack.GetSize();}
+ FX_INT32 GetCurUndoPos(){return m_nCurUndoPos;}
+
+private:
+ void SetBufSize(FX_INT32 nSize){m_nBufSize = nSize;}
+ FX_INT32 GetBufSize(){return m_nBufSize;}
+
+ void RemoveHeads();
+ void RemoveTails();
+
+private:
+ CFX_ArrayTemplate<IFX_Edit_UndoItem*> m_UndoItemStack;
+
+ FX_INT32 m_nCurUndoPos;
+ FX_INT32 m_nBufSize;
+ FX_BOOL m_bModified;
+ FX_BOOL m_bVirgin;
+ FX_BOOL m_bWorking;
+};
+
+class CFX_Edit_UndoItem : public IFX_Edit_UndoItem
+{
+public:
+ CFX_Edit_UndoItem() : m_bFirst(TRUE), m_bLast(TRUE) {}
+ virtual ~CFX_Edit_UndoItem(){}
+
+ virtual CFX_WideString GetUndoTitle() {return L"";}
+ virtual void Release(){delete this;}
+
+public:
+ void SetFirst(FX_BOOL bFirst){m_bFirst = bFirst;}
+ FX_BOOL IsFirst(){return m_bFirst;}
+ void SetLast(FX_BOOL bLast){m_bLast = bLast;}
+ FX_BOOL IsLast(){return m_bLast;}
+
+private:
+ FX_BOOL m_bFirst;
+ FX_BOOL m_bLast;
+};
+
+class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem
+{
+public:
+ CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
+ virtual ~CFX_Edit_GroupUndoItem();
+
+ void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
+ void UpdateItems();
+
+public:
+ virtual void Undo();
+ virtual void Redo();
+ virtual CFX_WideString GetUndoTitle();
+ virtual void Release();
+
+private:
+ CFX_WideString m_sTitle;
+ CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
+};
+
+/* ------------------------- CFX_Edit_UndoItem derived classes ---------------------------- */
+
+class CFXEU_InsertWord : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertWord();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit* m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_InsertReturn : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertReturn();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_Backspace : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);
+ virtual ~CFXEU_Backspace();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_Delete : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd);
+ virtual ~CFXEU_Delete();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+ FX_BOOL m_bSecEnd;
+};
+
+class CFXEU_Clear : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText);
+ virtual ~CFXEU_Clear();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit* m_pEdit;
+
+ CPVT_WordRange m_wrSel;
+ CFX_WideString m_swText;
+};
+
+class CFXEU_ClearRich : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_WordRange & wrSel,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps);
+ virtual ~CFXEU_ClearRich();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CPVT_WordRange m_wrSel;
+ FX_WORD m_Word;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_InsertText : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CFX_WideString & swText, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ virtual ~CFXEU_InsertText();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+
+ CPVT_WordPlace m_wpOld;
+ CPVT_WordPlace m_wpNew;
+ CFX_WideString m_swText;
+ FX_INT32 m_nCharset;
+ CPVT_SecProps m_SecProps;
+ CPVT_WordProps m_WordProps;
+};
+
+class CFXEU_SetSecProps : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
+ const CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops,
+ const CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range);
+ virtual ~CFXEU_SetSecProps();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+ CPVT_WordPlace m_wpPlace;
+ CPVT_WordRange m_wrPlace;
+ EDIT_PROPS_E m_eProps;
+
+ CPVT_SecProps m_OldSecProps;
+ CPVT_SecProps m_NewSecProps;
+ CPVT_WordProps m_OldWordProps;
+ CPVT_WordProps m_NewWordProps;
+};
+
+class CFXEU_SetWordProps : public CFX_Edit_UndoItem
+{
+public:
+ CFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
+ const CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range);
+ virtual ~CFXEU_SetWordProps();
+
+ void Redo();
+ void Undo();
+
+private:
+ CFX_Edit * m_pEdit;
+ CPVT_WordPlace m_wpPlace;
+ CPVT_WordRange m_wrPlace;
+ EDIT_PROPS_E m_eProps;
+
+ CPVT_WordProps m_OldWordProps;
+ CPVT_WordProps m_NewWordProps;
+};
+
+/* ------------------------- CFX_Edit ---------------------------- */
+
+class CFX_Edit : public IFX_Edit
+{
+ friend class CFX_Edit_Iterator;
+ friend class CFXEU_InsertWord;
+ friend class CFXEU_InsertReturn;
+ friend class CFXEU_Backspace;
+ friend class CFXEU_Delete;
+ friend class CFXEU_Clear;
+ friend class CFXEU_ClearRich;
+ friend class CFXEU_SetSecProps;
+ friend class CFXEU_SetWordProps;
+ friend class CFXEU_InsertText;
+
+public:
+ CFX_Edit(IPDF_VariableText * pVT);
+ virtual ~CFX_Edit();
+
+ void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ void SetVTProvider(IPDF_VariableText_Provider* pProvider);
+ void SetNotify(IFX_Edit_Notify * pNotify);
+ void SetOprNotify(IFX_Edit_OprNotify* pOprNotify);
+ IFX_Edit_Iterator* GetIterator();
+ IPDF_VariableText * GetVariableText();
+ IFX_Edit_FontMap* GetFontMap();
+
+ void Initialize();
+ void SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint = TRUE);
+ void SetScrollPos(const CPDF_Point & point);
+
+ void SetAlignmentH(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);
+ void SetAlignmentV(FX_INT32 nFormat = 0, FX_BOOL bPaint = TRUE);
+ void SetPasswordChar(FX_WORD wSubWord = '*', FX_BOOL bPaint = TRUE);
+ void SetLimitChar(FX_INT32 nLimitChar = 0, FX_BOOL bPaint = TRUE);
+ void SetCharArray(FX_INT32 nCharArray = 0, FX_BOOL bPaint = TRUE);
+ void SetCharSpace(FX_FLOAT fCharSpace = 0.0f, FX_BOOL bPaint = TRUE);
+ void SetHorzScale(FX_INT32 nHorzScale = 100, FX_BOOL bPaint = TRUE);
+ void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
+ void SetMultiLine(FX_BOOL bMultiLine = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoReturn(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoFontSize(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetAutoScroll(FX_BOOL bAuto = TRUE, FX_BOOL bPaint = TRUE);
+ void SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint = TRUE);
+ void SetTextOverflow(FX_BOOL bAllowed = FALSE, FX_BOOL bPaint = TRUE);
+
+ FX_BOOL IsRichText() const;
+ void SetRichText(FX_BOOL bRichText = TRUE, FX_BOOL bPaint = TRUE);
+ FX_BOOL SetRichFontSize(FX_FLOAT fFontSize);
+ FX_BOOL SetRichFontIndex(FX_INT32 nFontIndex);
+ FX_BOOL SetRichTextColor(FX_COLORREF dwColor);
+ FX_BOOL SetRichTextScript(FX_INT32 nScriptType);
+ FX_BOOL SetRichTextBold(FX_BOOL bBold = TRUE);
+ FX_BOOL SetRichTextItalic(FX_BOOL bItalic = TRUE);
+ FX_BOOL SetRichTextUnderline(FX_BOOL bUnderline = TRUE);
+ FX_BOOL SetRichTextCrossout(FX_BOOL bCrossout = TRUE);
+ FX_BOOL SetRichTextCharSpace(FX_FLOAT fCharSpace);
+ FX_BOOL SetRichTextHorzScale(FX_INT32 nHorzScale = 100);
+ FX_BOOL SetRichTextLineLeading(FX_FLOAT fLineLeading);
+ FX_BOOL SetRichTextLineIndent(FX_FLOAT fLineIndent);
+ FX_BOOL SetRichTextAlignment(FX_INT32 nAlignment);
+
+ void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);
+
+ void SetText(FX_LPCWSTR text,FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset = DEFAULT_CHARSET, const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL Backspace();
+ FX_BOOL Delete();
+ FX_BOOL Clear();
+ FX_BOOL Empty();
+ FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset = DEFAULT_CHARSET,
+ const CPVT_SecProps * pSecProps = NULL,const CPVT_WordProps * pWordProps = NULL);
+ FX_BOOL Redo();
+ FX_BOOL Undo();
+ CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ FX_INT32 GetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);
+
+ FX_INT32 WordPlaceToWordIndex(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace WordIndexToWordPlace(FX_INT32 index) const;
+
+ CPVT_WordPlace GetLineBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionBeginPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace GetSectionEndPlace(const CPVT_WordPlace & place) const;
+ CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const;
+
+ FX_INT32 GetCaret() const;
+ CPVT_WordPlace GetCaretWordPlace() const;
+ CFX_WideString GetSelText() const;
+ CFX_WideString GetText() const;
+ FX_FLOAT GetFontSize() const;
+ FX_WORD GetPasswordChar() const;
+ CPDF_Point GetScrollPos() const;
+ FX_INT32 GetCharArray() const;
+ CPDF_Rect GetPlateRect() const;
+ CPDF_Rect GetContentRect() const;
+ CFX_WideString GetRangeText(const CPVT_WordRange & range) const;
+ FX_INT32 GetHorzScale() const;
+ FX_FLOAT GetCharSpace() const;
+ FX_INT32 GetTotalWords() const;
+ FX_INT32 GetTotalLines() const;
+
+ void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+
+private:
+ void SelectAll();
+ void SelectNone();
+ void SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end);
+ FX_BOOL IsSelected() const;
+
+ void RearrangeAll();
+ void RearrangePart(const CPVT_WordRange & range);
+ void Paint();
+ void ScrollToCaret();
+ void SetScrollInfo();
+ void SetScrollPosX(FX_FLOAT fx);
+ void SetScrollPosY(FX_FLOAT fy);
+ void SetScrollLimit();
+ void SetContentChanged();
+ void EnableNotify(FX_BOOL bNotify);
+
+ void SetText(FX_LPCWSTR text,FX_INT32 charset,
+ const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertWord(FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Delete(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL Clear(FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL InsertText(FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,FX_BOOL bAddUndo, FX_BOOL bPaint);
+ FX_BOOL SetRichTextProps(EDIT_PROPS_E eProps,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps);
+ FX_BOOL SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);
+ FX_BOOL SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo);
+ void PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr);
+ void PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew);
+
+ inline CPDF_Point VTToEdit(const CPDF_Point & point) const;
+ inline CPDF_Point EditToVT(const CPDF_Point & point) const;
+ inline CPDF_Rect VTToEdit(const CPDF_Rect & rect) const;
+ inline CPDF_Rect EditToVT(const CPDF_Rect & rect) const;
+
+ void EnableRefresh(FX_BOOL bRefresh);
+ void Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1 = NULL,const CPVT_WordRange * pRange2 = NULL);
+ void RefreshPushLineRects(const CPVT_WordRange & wr);
+ void RefreshPushRandomRects(const CPVT_WordRange & wr);
+ void RefreshWordRange(const CPVT_WordRange& wr);
+
+ void SetCaret(FX_INT32 nPos);
+ void SetCaret(const CPVT_WordPlace & place);
+ void SetCaretInfo();
+ void SetCaretOrigin();
+ void SetCaretChange();
+
+ CPVT_WordRange GetWholeWordRange() const;
+ CPVT_WordRange GetVisibleWordRange() const;
+ CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange CombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2);
+ CPVT_WordRange GetSelectWordRange() const;
+
+ void EnableUndo(FX_BOOL bUndo);
+ void EnableOprNotify(FX_BOOL bNotify);
+
+ FX_BOOL IsTextFull() const;
+ FX_BOOL IsTextOverflow() const;
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ FX_BOOL IsModified() const;
+
+ void BeginGroupUndo(const CFX_WideString& sTitle);
+ void EndGroupUndo();
+ void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
+ void AddUndoItem(IFX_Edit_UndoItem* pUndoItem);
+
+ void SetPageInfo(const CPVT_WordPlace& place);
+ CPVT_WordPlace SearchPageEndPlace(const CPVT_WordPlace& wpPageBegin, const CPDF_Point& point) const;
+ FX_FLOAT GetLineTop(const CPVT_WordPlace& place) const;
+ FX_FLOAT GetLineBottom(const CPVT_WordPlace& place) const;
+
+private:
+ IPDF_VariableText* m_pVT;
+ IFX_Edit_Notify* m_pNotify;
+ IFX_Edit_OprNotify* m_pOprNotify;
+ CFX_Edit_Provider* m_pVTProvide;
+
+ CPVT_WordPlace m_wpCaret;
+ CPVT_WordPlace m_wpOldCaret;
+ CFX_Edit_Select m_SelState;
+
+ CPDF_Point m_ptScrollPos;
+ CPDF_Point m_ptRefreshScrollPos;
+ FX_BOOL m_bEnableScroll;
+ IFX_Edit_Iterator * m_pIterator;
+ CFX_Edit_Refresh m_Refresh;
+ CPDF_Point m_ptCaret;
+ CFX_Edit_Undo m_Undo;
+ FX_INT32 m_nAlignment;
+ FX_BOOL m_bNotifyFlag;
+ FX_BOOL m_bTextFullFlag;
+ FX_BOOL m_bEnableOverflow;
+ FX_BOOL m_bEnableRefresh;
+ CPDF_Rect m_rcOldContent;
+ FX_BOOL m_bEnableUndo;
+ FX_BOOL m_bNotify;
+ FX_BOOL m_bOprNotify;
+ CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
+};
+
+/* ------------------------- CFX_Edit_Iterator ---------------------------- */
+
+class CFX_Edit_Iterator : public IFX_Edit_Iterator
+{
+public:
+ CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator);
+ virtual ~CFX_Edit_Iterator();
+
+ FX_BOOL NextWord();
+ FX_BOOL NextLine();
+ FX_BOOL NextSection();
+ FX_BOOL PrevWord();
+ FX_BOOL PrevLine();
+ FX_BOOL PrevSection();
+
+ FX_BOOL GetWord(CPVT_Word & word) const;
+ FX_BOOL GetLine(CPVT_Line & line) const;
+ FX_BOOL GetSection(CPVT_Section & section) const;
+ void SetAt(FX_INT32 nWordIndex);
+ void SetAt(const CPVT_WordPlace & place);
+ const CPVT_WordPlace & GetAt() const;
+ IFX_Edit* GetEdit() const;
+
+private:
+ CFX_Edit * m_pEdit;
+ IPDF_VariableText_Iterator* m_pVTIterator;
+};
+
+class CFX_Edit_Provider : public IPDF_VariableText_Provider
+{
+public:
+ CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap);
+ virtual ~CFX_Edit_Provider();
+
+ IFX_Edit_FontMap* GetFontMap();
+
+ FX_INT32 GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle);
+ FX_INT32 GetTypeAscent(FX_INT32 nFontIndex);
+ FX_INT32 GetTypeDescent(FX_INT32 nFontIndex);
+ FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex);
+ FX_INT32 GetDefaultFontIndex();
+ FX_BOOL IsLatinWord(FX_WORD word);
+
+private:
+ IFX_Edit_FontMap* m_pFontMap;
+};
+
+#endif //_FXET_EDIT_H_
+
diff --git a/fpdfsdk/include/fxedit/fxet_list.h b/fpdfsdk/include/fxedit/fxet_list.h
new file mode 100644
index 0000000000..d77be86be4
--- /dev/null
+++ b/fpdfsdk/include/fxedit/fxet_list.h
@@ -0,0 +1,363 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXET_LIST_H_
+#define _FXET_LIST_H_
+
+#include "fx_edit.h"
+
+class IFX_Edit;
+
+class CLST_Size
+{
+public:
+ CLST_Size() : x(0.0f), y(0.0f)
+ {
+ }
+
+ CLST_Size(FX_FLOAT x,FX_FLOAT y)
+ {
+ this->x = x;
+ this->y = y;
+ }
+
+ void Default()
+ {
+ x = 0.0f;
+ y = 0.0f;
+ }
+
+ FX_BOOL operator != (const CLST_Size & size) const
+ {
+ return FXSYS_memcmp(this, &size, sizeof(CLST_Size)) != 0;
+ }
+
+ FX_FLOAT x,y;
+};
+
+class CLST_Rect : public CPDF_Rect
+{
+public:
+ CLST_Rect()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+
+ CLST_Rect(FX_FLOAT left,FX_FLOAT top,
+ FX_FLOAT right,FX_FLOAT bottom)
+ {
+ this->left = left;
+ this->top = top;
+ this->right = right;
+ this->bottom = bottom;
+ }
+
+ CLST_Rect(const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+ }
+
+ void Default()
+ {
+ left = top = right = bottom = 0.0f;
+ }
+
+ const CLST_Rect operator = (const CPDF_Rect & rect)
+ {
+ this->left = rect.left;
+ this->top = rect.top;
+ this->right = rect.right;
+ this->bottom = rect.bottom;
+
+ return *this;
+ }
+
+ FX_BOOL operator == (const CLST_Rect & rect) const
+ {
+ return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) == 0;
+ }
+
+ FX_BOOL operator != (const CLST_Rect & rect) const
+ {
+ return FXSYS_memcmp(this, &rect, sizeof(CLST_Rect)) != 0;
+ }
+
+ FX_FLOAT Width() const
+ {
+ return this->right - this->left;
+ }
+
+ FX_FLOAT Height() const
+ {
+ if (this->top > this->bottom)
+ return this->top - this->bottom;
+ else
+ return this->bottom - this->top;
+ }
+
+ CPDF_Point LeftTop() const
+ {
+ return CPDF_Point(left,top);
+ }
+
+ CPDF_Point RightBottom() const
+ {
+ return CPDF_Point(right,bottom);
+ }
+
+ const CLST_Rect operator += (const CPDF_Point & point)
+ {
+ this->left += point.x;
+ this->right += point.x;
+ this->top += point.y;
+ this->bottom += point.y;
+
+ return *this;
+ }
+
+ const CLST_Rect operator -= (const CPDF_Point & point)
+ {
+ this->left -= point.x;
+ this->right -= point.x;
+ this->top -= point.y;
+ this->bottom -= point.y;
+
+ return *this;
+ }
+
+ CLST_Rect operator + (const CPDF_Point & point) const
+ {
+ return CLST_Rect(left + point.x,
+ top + point.y,
+ right + point.x,
+ bottom + point.y);
+ }
+
+ CLST_Rect operator - (const CPDF_Point & point) const
+ {
+ return CLST_Rect(left - point.x,
+ top - point.y,
+ right - point.x,
+ bottom - point.y);
+ }
+};
+
+class CFX_ListItem
+{
+public:
+ CFX_ListItem();
+ virtual ~CFX_ListItem();
+
+ void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ IFX_Edit_Iterator* GetIterator() const;
+ IFX_Edit* GetEdit() const;
+
+public:
+ void SetRect(const CLST_Rect & rect);
+ void SetSelect(FX_BOOL bSelected);
+ void SetCaret(FX_BOOL bCaret);
+ void SetText(FX_LPCWSTR text);
+ void SetFontSize(FX_FLOAT fFontSize);
+ CFX_WideString GetText() const;
+
+ CLST_Rect GetRect() const;
+ FX_BOOL IsSelected() const;
+ FX_BOOL IsCaret() const;
+ FX_FLOAT GetItemHeight() const;
+ FX_WORD GetFirstChar() const;
+
+private:
+ IFX_Edit* m_pEdit;
+ FX_BOOL m_bSelected; //ÊÇ·ñÑ¡ÖÐ
+ FX_BOOL m_bCaret; //ÊÇ·ñΪ½¹µã£¬¶àѡʱÓÃ
+ CLST_Rect m_rcListItem; //ÄÚ²¿×ø±ê
+};
+
+class CFX_ListContainer
+{
+public:
+ CFX_ListContainer() : m_rcPlate(0.0f,0.0f,0.0f,0.0f), m_rcContent(0.0f,0.0f,0.0f,0.0f){}
+ virtual ~CFX_ListContainer(){}
+ virtual void SetPlateRect(const CPDF_Rect & rect){m_rcPlate = rect;}
+ CPDF_Rect GetPlateRect() const{return m_rcPlate;}
+ void SetContentRect(const CLST_Rect & rect){m_rcContent = rect;}
+ CLST_Rect GetContentRect() const{return m_rcContent;}
+ CPDF_Point GetBTPoint() const{return CPDF_Point(m_rcPlate.left,m_rcPlate.top);}
+ CPDF_Point GetETPoint() const{return CPDF_Point(m_rcPlate.right,m_rcPlate.bottom);}
+public:
+ CPDF_Point InnerToOuter(const CPDF_Point & point) const{return CPDF_Point(point.x + GetBTPoint().x,GetBTPoint().y - point.y);}
+ CPDF_Point OuterToInner(const CPDF_Point & point) const{return CPDF_Point(point.x - GetBTPoint().x,GetBTPoint().y - point.y);}
+ CPDF_Rect InnerToOuter(const CLST_Rect & rect) const{CPDF_Point ptLeftTop = InnerToOuter(CPDF_Point(rect.left,rect.top));
+ CPDF_Point ptRightBottom = InnerToOuter(CPDF_Point(rect.right,rect.bottom));
+ return CPDF_Rect(ptLeftTop.x,ptRightBottom.y,ptRightBottom.x,ptLeftTop.y);}
+ CLST_Rect OuterToInner(const CPDF_Rect & rect) const{CPDF_Point ptLeftTop = OuterToInner(CPDF_Point(rect.left,rect.top));
+ CPDF_Point ptRightBottom = OuterToInner(CPDF_Point(rect.right,rect.bottom));
+ return CLST_Rect(ptLeftTop.x,ptLeftTop.y,ptRightBottom.x,ptRightBottom.y);}
+private:
+ CPDF_Rect m_rcPlate;
+ CLST_Rect m_rcContent; //positive forever!
+};
+
+template<class TYPE> class CLST_ArrayTemplate : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ FX_BOOL IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }
+ TYPE GetAt(FX_INT32 nIndex) const { if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) return CFX_ArrayTemplate<TYPE>::GetAt(nIndex); return NULL;}
+ void RemoveAt(FX_INT32 nIndex){if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize()) CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);}
+};
+
+class CFX_List : protected CFX_ListContainer , public IFX_List
+{
+public:
+ CFX_List();
+ virtual ~CFX_List();
+
+public:
+ virtual void SetFontMap(IFX_Edit_FontMap * pFontMap);
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+
+ virtual CPDF_Rect GetPlateRect() const;
+ virtual CPDF_Rect GetContentRect() const;
+
+ virtual FX_FLOAT GetFontSize() const;
+ virtual IFX_Edit* GetItemEdit(FX_INT32 nIndex) const;
+ virtual FX_INT32 GetCount() const;
+ virtual FX_BOOL IsItemSelected(FX_INT32 nIndex) const;
+ virtual FX_FLOAT GetFirstHeight() const;
+
+ virtual void SetMultipleSel(FX_BOOL bMultiple);
+ virtual FX_BOOL IsMultipleSel() const;
+ virtual FX_BOOL IsValid(FX_INT32 nItemIndex) const;
+ virtual FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;
+
+protected:
+ virtual void Empty();
+
+ void AddItem(FX_LPCWSTR str);
+ virtual void ReArrange(FX_INT32 nItemIndex);
+
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const;
+ CFX_WideString GetItemText(FX_INT32 nIndex) const;
+
+ void SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);
+ void SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret);
+
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const;
+ FX_INT32 GetFirstSelected() const;
+ FX_INT32 GetLastSelected() const;
+ FX_WCHAR Toupper(FX_WCHAR c) const;
+
+private:
+ CLST_ArrayTemplate<CFX_ListItem*> m_aListItems;
+ FX_FLOAT m_fFontSize;
+ IFX_Edit_FontMap* m_pFontMap;
+ FX_BOOL m_bMultiple;
+};
+
+struct CPLST_Select_Item
+{
+ CPLST_Select_Item(FX_INT32 nItemIndex,FX_INT32 nState)
+ {
+ this->nItemIndex = nItemIndex;
+ this->nState = nState;
+ }
+
+ FX_INT32 nItemIndex;
+ FX_INT32 nState; //0:normal select -1:to deselect 1: to select
+};
+
+class CPLST_Select
+{
+public:
+ CPLST_Select();
+ virtual ~CPLST_Select();
+
+public:
+ void Add(FX_INT32 nItemIndex);
+ void Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+ void Sub(FX_INT32 nItemIndex);
+ void Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex);
+ FX_BOOL IsExist(FX_INT32 nItemIndex) const;
+ FX_INT32 Find(FX_INT32 nItemIndex) const;
+ FX_INT32 GetCount() const;
+ FX_INT32 GetItemIndex(FX_INT32 nIndex) const;
+ FX_INT32 GetState(FX_INT32 nIndex) const;
+ void Done();
+ void DeselectAll();
+
+private:
+ CFX_ArrayTemplate<CPLST_Select_Item*> m_aItems;
+};
+
+class CFX_ListCtrl : public CFX_List
+{
+public:
+ CFX_ListCtrl();
+ virtual ~CFX_ListCtrl();
+
+public:
+ void SetNotify(IFX_List_Notify * pNotify);
+
+ void OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl);
+ void OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl);
+ FX_BOOL OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl);
+
+ virtual CPDF_Point InToOut(const CPDF_Point & point) const;
+ virtual CPDF_Point OutToIn(const CPDF_Point & point) const;
+ virtual CPDF_Rect InToOut(const CPDF_Rect & rect) const;
+ virtual CPDF_Rect OutToIn(const CPDF_Rect & rect) const;
+
+ virtual void SetPlateRect(const CPDF_Rect & rect);
+ void SetScrollPos(const CPDF_Point & point);
+ void ScrollToListItem(FX_INT32 nItemIndex);
+ virtual CPDF_Rect GetItemRect(FX_INT32 nIndex) const;
+ FX_INT32 GetCaret() const {return m_nCaretIndex;}
+ FX_INT32 GetSelect() const {return m_nSelItem;}
+ FX_INT32 GetTopItem() const;
+ virtual CPDF_Rect GetContentRect() const;
+ virtual FX_INT32 GetItemIndex(const CPDF_Point & point) const;
+
+ void AddString(FX_LPCWSTR string);
+ void SetTopItem(FX_INT32 nIndex);
+ void Select(FX_INT32 nItemIndex);
+ virtual void SetCaret(FX_INT32 nItemIndex);
+ virtual void Empty();
+ virtual void Cancel();
+ CFX_WideString GetText() const;
+
+private:
+ void SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected);
+ void SetSingleSelect(FX_INT32 nItemIndex);
+ void InvalidateItem(FX_INT32 nItemIndex);
+ void SelectItems();
+ FX_BOOL IsItemVisible(FX_INT32 nItemIndex) const;
+ void SetScrollInfo();
+ void SetScrollPosY(FX_FLOAT fy);
+ virtual void ReArrange(FX_INT32 nItemIndex);
+
+private:
+ IFX_List_Notify* m_pNotify;
+ FX_BOOL m_bNotifyFlag;
+ CPDF_Point m_ptScrollPos;
+ CPLST_Select m_aSelItems; //for multiple
+ FX_INT32 m_nSelItem; //for single
+ FX_INT32 m_nFootIndex; //for multiple
+ FX_BOOL m_bCtrlSel; //for multiple
+ FX_INT32 m_nCaretIndex; //for multiple
+};
+
+#endif
+
diff --git a/fpdfsdk/include/fxedit/fxet_stub.h b/fpdfsdk/include/fxedit/fxet_stub.h
new file mode 100644
index 0000000000..aa50cd59a0
--- /dev/null
+++ b/fpdfsdk/include/fxedit/fxet_stub.h
@@ -0,0 +1,26 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXET_STUB_H_
+#define _FXET_STUB_H_
+
+#include "../../../core/include/fpdfapi/fpdf_module.h"
+#include "../../../core/include/fpdfapi/fpdf_render.h"
+#include "../../../core/include/fpdfapi/fpdf_pageobj.h"
+#include "../../../core/include/fpdfdoc/fpdf_vt.h"
+#include "../fx_systemhandler.h"
+#ifdef FX_READER_DLL
+ #ifdef _DEBUG
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/dbg_w32_vc6/fxcoredll[dbg,w32,vc6].lib")
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/dbg_w32_vc6/fpdfdocdll[dbg,w32,vc6].lib")
+ #else
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/rel_w32_vc6/fxcoredll[rel,w32,vc6].lib")
+ #pragma comment(lib, "X:/pdf/fxcore/Lib/rel_w32_vc6/fpdfdocdll[rel,w32,vc6].lib")
+ #endif
+#endif
+
+#endif
+
diff --git a/fpdfsdk/include/javascript/Consts.h b/fpdfsdk/include/javascript/Consts.h
new file mode 100644
index 0000000000..32b0217502
--- /dev/null
+++ b/fpdfsdk/include/javascript/Consts.h
@@ -0,0 +1,126 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _CONSTS_H_
+#define _CONSTS_H_
+
+/* ------------------------------ border ------------------------------ */
+
+class CJS_Border : public CJS_Object
+{
+public:
+ CJS_Border(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Border(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ display ------------------------------ */
+
+class CJS_Display : public CJS_Object
+{
+public:
+ CJS_Display(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Display(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ font ------------------------------ */
+
+class CJS_Font : public CJS_Object
+{
+public:
+ CJS_Font(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Font(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ highlight ------------------------------ */
+
+class CJS_Highlight : public CJS_Object
+{
+public:
+ CJS_Highlight(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Highlight(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ position ------------------------------ */
+
+class CJS_Position : public CJS_Object
+{
+public:
+ CJS_Position(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Position(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ scaleHow ------------------------------ */
+
+class CJS_ScaleHow : public CJS_Object
+{
+public:
+ CJS_ScaleHow(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_ScaleHow(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ scaleWhen ------------------------------ */
+
+class CJS_ScaleWhen : public CJS_Object
+{
+public:
+ CJS_ScaleWhen(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_ScaleWhen(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ style ------------------------------ */
+
+class CJS_Style : public CJS_Object
+{
+public:
+ CJS_Style(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Style(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ zoomtype ------------------------------ */
+
+class CJS_Zoomtype : public CJS_Object
+{
+public:
+ CJS_Zoomtype(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Zoomtype(void){};
+
+ DECLARE_JS_CLASS_CONST();
+};
+
+/* ------------------------------ CJS_GlobalConsts ------------------------------ */
+
+class CJS_GlobalConsts : public CJS_Object
+{
+public:
+ static int Init(IJS_Runtime* pRuntime);
+};
+
+/* ------------------------------ CJS_GlobalArrays ------------------------------ */
+
+class CJS_GlobalArrays : public CJS_Object
+{
+public:
+ static int Init(IJS_Runtime* pRuntime);
+};
+
+#endif //_CONSTS_H_
+
diff --git a/fpdfsdk/include/javascript/Document.h b/fpdfsdk/include/javascript/Document.h
new file mode 100644
index 0000000000..3e9669b8ef
--- /dev/null
+++ b/fpdfsdk/include/javascript/Document.h
@@ -0,0 +1,282 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _DOCUMENT_H_
+#define _DOCUMENT_H_
+
+
+
+class PrintParamsObj : public CJS_EmbedObj
+{
+public:
+ PrintParamsObj(CJS_Object* pJSObject);
+ virtual ~PrintParamsObj(){}
+
+public:
+ FX_BOOL bUI;
+ int nStart;
+ int nEnd;
+ FX_BOOL bSilent;
+ FX_BOOL bShrinkToFit;
+ FX_BOOL bPrintAsImage;
+ FX_BOOL bReverse;
+ FX_BOOL bAnnotations;
+};
+
+class CJS_PrintParamsObj : public CJS_Object
+{
+public:
+ CJS_PrintParamsObj(JSFXObject pObject) : CJS_Object(pObject) {}
+ virtual ~CJS_PrintParamsObj(){}
+
+ DECLARE_JS_CLASS(CJS_PrintParamsObj);
+};
+
+
+class Icon;
+class Field;
+
+struct IconElement
+{
+ IconElement() : IconName(L""), IconStream(NULL), NextIcon(NULL){}
+ virtual ~IconElement()
+ {
+ }
+ CFX_WideString IconName;
+ IconElement* NextIcon;
+ Icon* IconStream;
+};
+
+class IconTree
+{
+public:
+ IconTree():m_pHead(NULL), m_pEnd(NULL), m_iLength(0)
+ {
+
+ }
+
+ virtual ~IconTree()
+ {
+ }
+
+public:
+ void InsertIconElement(IconElement* pNewIcon);
+ void DeleteIconElement(CFX_WideString swIconName);
+ void DeleteIconTree();
+ int GetLength();
+ IconElement* operator[](int iIndex);
+
+private:
+ IconElement* m_pHead;
+ IconElement* m_pEnd;
+ int m_iLength;
+};
+
+struct CJS_DelayData;
+struct CJS_DelayAnnot;
+struct CJS_AnnotObj;
+
+class Document : public CJS_EmbedObj
+{
+public:
+ Document(CJS_Object* pJSObject);
+ virtual ~Document();
+
+public:
+ FX_BOOL ADBE(OBJ_PROP_PARAMS);
+ FX_BOOL author(OBJ_PROP_PARAMS);
+ FX_BOOL baseURL(OBJ_PROP_PARAMS);
+ FX_BOOL bookmarkRoot(OBJ_PROP_PARAMS);
+ FX_BOOL calculate(OBJ_PROP_PARAMS);
+ FX_BOOL Collab(OBJ_PROP_PARAMS);
+ FX_BOOL creationDate(OBJ_PROP_PARAMS);
+ FX_BOOL creator(OBJ_PROP_PARAMS);
+ FX_BOOL delay(OBJ_PROP_PARAMS);
+ FX_BOOL dirty(OBJ_PROP_PARAMS);
+ FX_BOOL documentFileName(OBJ_PROP_PARAMS);
+ FX_BOOL external(OBJ_PROP_PARAMS);
+ FX_BOOL filesize(OBJ_PROP_PARAMS);
+ FX_BOOL icons(OBJ_PROP_PARAMS);
+ FX_BOOL info(OBJ_PROP_PARAMS);
+ FX_BOOL keywords(OBJ_PROP_PARAMS);
+ FX_BOOL layout(OBJ_PROP_PARAMS);
+ FX_BOOL media(OBJ_PROP_PARAMS);
+ FX_BOOL modDate(OBJ_PROP_PARAMS);
+ FX_BOOL mouseX(OBJ_PROP_PARAMS);
+ FX_BOOL mouseY(OBJ_PROP_PARAMS);
+ FX_BOOL numFields(OBJ_PROP_PARAMS);
+ FX_BOOL numPages(OBJ_PROP_PARAMS);
+ FX_BOOL pageNum(OBJ_PROP_PARAMS);
+ FX_BOOL pageWindowRect(OBJ_PROP_PARAMS);
+ FX_BOOL path(OBJ_PROP_PARAMS);
+ FX_BOOL producer(OBJ_PROP_PARAMS);
+ FX_BOOL subject(OBJ_PROP_PARAMS);
+ FX_BOOL title(OBJ_PROP_PARAMS);
+ FX_BOOL zoom(OBJ_PROP_PARAMS);
+ FX_BOOL zoomType(OBJ_PROP_PARAMS);
+
+ FX_BOOL addAnnot(OBJ_METHOD_PARAMS);
+ FX_BOOL addField(OBJ_METHOD_PARAMS);
+ FX_BOOL addLink(OBJ_METHOD_PARAMS);
+ FX_BOOL addIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL calculateNow(OBJ_METHOD_PARAMS);
+ FX_BOOL closeDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL createDataObject(OBJ_METHOD_PARAMS);
+ FX_BOOL deletePages(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsText(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL exportAsXFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL extractPages(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnot(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnots(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnot3D(OBJ_METHOD_PARAMS);
+ FX_BOOL getAnnots3D(OBJ_METHOD_PARAMS);
+ FX_BOOL getField(OBJ_METHOD_PARAMS);
+ FX_BOOL getIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL getLinks(OBJ_METHOD_PARAMS);
+ FX_BOOL getNthFieldName(OBJ_METHOD_PARAMS);
+ FX_BOOL getOCGs(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageBox(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNthWord(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNthWordQuads(OBJ_METHOD_PARAMS);
+ FX_BOOL getPageNumWords(OBJ_METHOD_PARAMS);
+ FX_BOOL getPrintParams(OBJ_METHOD_PARAMS);
+ FX_BOOL getURL(OBJ_METHOD_PARAMS);
+ FX_BOOL importAnFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL importAnXFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL importTextData(OBJ_METHOD_PARAMS);
+ FX_BOOL insertPages(OBJ_METHOD_PARAMS);
+ FX_BOOL mailForm(OBJ_METHOD_PARAMS);
+ FX_BOOL print(OBJ_METHOD_PARAMS);
+ FX_BOOL removeField(OBJ_METHOD_PARAMS);
+ FX_BOOL replacePages(OBJ_METHOD_PARAMS);
+ FX_BOOL resetForm(OBJ_METHOD_PARAMS);
+ FX_BOOL saveAs(OBJ_METHOD_PARAMS);
+ FX_BOOL submitForm(OBJ_METHOD_PARAMS);
+ FX_BOOL mailDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL removeIcon(OBJ_METHOD_PARAMS);
+
+public:
+ void AttachDoc(CPDFSDK_Document* pDoc);
+ CPDFSDK_Document* GetReaderDoc();
+
+ static FX_BOOL ExtractFileName(CPDFSDK_Document* pDoc, CFX_ByteString& strFileName);
+ static FX_BOOL ExtractFolderName(CPDFSDK_Document* pDoc, CFX_ByteString& strFolderName);
+
+public:
+ void AddDelayData(CJS_DelayData* pData);
+ void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex);
+
+ void AddDelayAnnotData(CJS_AnnotObj *pData);
+ void DoAnnotDelay();
+ void SetIsolate(v8::Isolate* isolate) {m_isolate = isolate;}
+
+private:
+ CFX_WideString ReversalStr(CFX_WideString cbFrom);
+ CFX_WideString CutString(CFX_WideString cbFrom);
+ bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);
+ int CountWords(CPDF_TextObject* pTextObj);
+ CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
+
+ FX_BOOL ParserParams(JSObject *pObj,CJS_AnnotObj& annotobj);
+
+private:
+ v8::Isolate* m_isolate;
+ IconTree* m_pIconTree;
+ CPDFSDK_Document* m_pDocument;
+ CFX_WideString m_cwBaseURL;
+
+ FX_BOOL m_bDelay;
+ CFX_ArrayTemplate<CJS_DelayData*> m_DelayData;
+ CFX_ArrayTemplate<CJS_AnnotObj*> m_DelayAnnotData;
+};
+
+class CJS_Document : public CJS_Object
+{
+public:
+ CJS_Document(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Document(){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_JS_CLASS(CJS_Document);
+
+ JS_STATIC_PROP(ADBE, Document);
+ JS_STATIC_PROP(author, Document);
+ JS_STATIC_PROP(baseURL, Document);
+ JS_STATIC_PROP(bookmarkRoot, Document);
+ JS_STATIC_PROP(calculate, Document);
+ JS_STATIC_PROP(Collab, Document);
+ JS_STATIC_PROP(creationDate, Document);
+ JS_STATIC_PROP(creator, Document);
+ JS_STATIC_PROP(delay, Document);
+ JS_STATIC_PROP(dirty, Document);
+ JS_STATIC_PROP(documentFileName, Document);
+ JS_STATIC_PROP(external, Document);
+ JS_STATIC_PROP(filesize, Document);
+ JS_STATIC_PROP(icons, Document);
+ JS_STATIC_PROP(info, Document);
+ JS_STATIC_PROP(keywords, Document);
+ JS_STATIC_PROP(layout, Document);
+ JS_STATIC_PROP(media, Document);
+ JS_STATIC_PROP(modDate, Document);
+ JS_STATIC_PROP(mouseX, Document);
+ JS_STATIC_PROP(mouseY, Document);
+ JS_STATIC_PROP(numFields, Document);
+ JS_STATIC_PROP(numPages, Document);
+ JS_STATIC_PROP(pageNum, Document);
+ JS_STATIC_PROP(pageWindowRect, Document);
+ JS_STATIC_PROP(path, Document);
+ JS_STATIC_PROP(producer, Document);
+ JS_STATIC_PROP(subject, Document);
+ JS_STATIC_PROP(title, Document);
+ JS_STATIC_PROP(zoom, Document);
+ JS_STATIC_PROP(zoomType, Document);
+
+ JS_STATIC_METHOD(addAnnot,Document);
+ JS_STATIC_METHOD(addField, Document);
+ JS_STATIC_METHOD(addLink, Document);
+ JS_STATIC_METHOD(addIcon, Document);
+ JS_STATIC_METHOD(calculateNow, Document);
+ JS_STATIC_METHOD(closeDoc, Document);
+ JS_STATIC_METHOD(createDataObject, Document);
+ JS_STATIC_METHOD(deletePages, Document);
+ JS_STATIC_METHOD(exportAsText, Document);
+ JS_STATIC_METHOD(exportAsFDF, Document);
+ JS_STATIC_METHOD(exportAsXFDF, Document);
+ JS_STATIC_METHOD(extractPages, Document);
+ JS_STATIC_METHOD(getAnnot, Document);
+ JS_STATIC_METHOD(getAnnots, Document);
+ JS_STATIC_METHOD(getAnnot3D, Document);
+ JS_STATIC_METHOD(getAnnots3D, Document);
+ JS_STATIC_METHOD(getField, Document);
+ JS_STATIC_METHOD(getIcon, Document);
+ JS_STATIC_METHOD(getLinks, Document);
+ JS_STATIC_METHOD(getNthFieldName, Document);
+ JS_STATIC_METHOD(getOCGs, Document);
+ JS_STATIC_METHOD(getPageBox, Document);
+ JS_STATIC_METHOD(getPageNthWord, Document);
+ JS_STATIC_METHOD(getPageNthWordQuads, Document);
+ JS_STATIC_METHOD(getPageNumWords, Document);
+ JS_STATIC_METHOD(getPrintParams, Document);
+ JS_STATIC_METHOD(getURL, Document);
+ JS_STATIC_METHOD(importAnFDF, Document);
+ JS_STATIC_METHOD(importAnXFDF, Document);
+ JS_STATIC_METHOD(importTextData, Document);
+ JS_STATIC_METHOD(insertPages, Document);
+ JS_STATIC_METHOD(mailForm, Document);
+ JS_STATIC_METHOD(print, Document);
+ JS_STATIC_METHOD(removeField, Document);
+ JS_STATIC_METHOD(replacePages, Document);
+ JS_STATIC_METHOD(removeIcon, Document);
+ JS_STATIC_METHOD(resetForm, Document);
+ JS_STATIC_METHOD(saveAs, Document);
+ JS_STATIC_METHOD(submitForm, Document);
+ JS_STATIC_METHOD(mailDoc, Document);
+};
+
+#endif//_DOCUMENT_H_
+
diff --git a/fpdfsdk/include/javascript/Field.h b/fpdfsdk/include/javascript/Field.h
new file mode 100644
index 0000000000..1b0bb05a12
--- /dev/null
+++ b/fpdfsdk/include/javascript/Field.h
@@ -0,0 +1,355 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FIELD_H_
+#define _FIELD_H_
+
+class Document;
+
+enum FIELD_PROP
+{
+ FP_ALIGNMENT,
+ FP_BORDERSTYLE,
+ FP_BUTTONALIGNX,
+ FP_BUTTONALIGNY,
+ FP_BUTTONFITBOUNDS,
+ FP_BUTTONPOSITION,
+ FP_BUTTONSCALEHOW,
+ FP_BUTTONSCALEWHEN,
+ FP_CALCORDERINDEX,
+ FP_CHARLIMIT,
+ FP_COMB,
+ FP_COMMITONSELCHANGE,
+ FP_CURRENTVALUEINDICES,
+ FP_DEFAULTVALUE,
+ FP_DONOTSCROLL,
+ FP_DISPLAY,
+ FP_FILLCOLOR,
+ FP_HIDDEN,
+ FP_HIGHLIGHT,
+ FP_LINEWIDTH,
+ FP_MULTILINE,
+ FP_MULTIPLESELECTION,
+ FP_PASSWORD,
+ FP_RECT,
+ FP_RICHTEXT,
+ FP_RICHVALUE,
+ FP_ROTATION,
+ FP_STROKECOLOR,
+ FP_STYLE,
+ FP_TEXTCOLOR,
+ FP_TEXTFONT,
+ FP_TEXTSIZE,
+ FP_USERNAME,
+ FP_VALUE
+};
+
+class CJS_WideStringArray
+{
+public:
+ CJS_WideStringArray(){}
+ virtual ~CJS_WideStringArray()
+ {
+ for (int i=0,sz=m_Data.GetSize(); i<sz; i++)
+ delete m_Data.GetAt(i);
+ m_Data.RemoveAll();
+ }
+
+ void Add(const CFX_WideString& string)
+ {
+ m_Data.Add(new CFX_WideString(string));
+ }
+
+ int GetSize() const
+ {
+ return m_Data.GetSize();
+ }
+
+ CFX_WideString GetAt(int i) const
+ {
+ return *m_Data.GetAt(i);
+ }
+
+private:
+ CFX_ArrayTemplate<CFX_WideString*> m_Data;
+};
+
+struct CJS_DelayData
+{
+ CFX_WideString sFieldName;
+ int nControlIndex;
+ enum FIELD_PROP eProp;
+ FX_INT32 num;
+ bool b;
+ CFX_ByteString string;
+ CFX_WideString widestring;
+ CPDF_Rect rect;
+ CPWL_Color color;
+ CFX_DWordArray wordarray;
+ CJS_WideStringArray widestringarray;
+};
+
+class Field : public CJS_EmbedObj
+{
+public:
+ Field(CJS_Object* pJSObject);
+ virtual ~Field(void);
+
+ FX_BOOL alignment(OBJ_PROP_PARAMS);
+ FX_BOOL borderStyle(OBJ_PROP_PARAMS);
+ FX_BOOL buttonAlignX(OBJ_PROP_PARAMS);
+ FX_BOOL buttonAlignY(OBJ_PROP_PARAMS);
+ FX_BOOL buttonFitBounds(OBJ_PROP_PARAMS);
+ FX_BOOL buttonPosition(OBJ_PROP_PARAMS);
+ FX_BOOL buttonScaleHow(OBJ_PROP_PARAMS);
+ FX_BOOL buttonScaleWhen(OBJ_PROP_PARAMS);
+ FX_BOOL calcOrderIndex(OBJ_PROP_PARAMS);
+ FX_BOOL charLimit(OBJ_PROP_PARAMS);
+ FX_BOOL comb(OBJ_PROP_PARAMS);
+ FX_BOOL commitOnSelChange(OBJ_PROP_PARAMS);
+ FX_BOOL currentValueIndices(OBJ_PROP_PARAMS);
+ FX_BOOL defaultStyle(OBJ_PROP_PARAMS);
+ FX_BOOL defaultValue(OBJ_PROP_PARAMS);
+ FX_BOOL doNotScroll(OBJ_PROP_PARAMS);
+ FX_BOOL doNotSpellCheck(OBJ_PROP_PARAMS);
+ FX_BOOL delay(OBJ_PROP_PARAMS);
+ FX_BOOL display(OBJ_PROP_PARAMS);
+ FX_BOOL doc(OBJ_PROP_PARAMS);
+ FX_BOOL editable(OBJ_PROP_PARAMS);
+ FX_BOOL exportValues(OBJ_PROP_PARAMS);
+ FX_BOOL fileSelect(OBJ_PROP_PARAMS);
+ FX_BOOL fillColor(OBJ_PROP_PARAMS);
+ FX_BOOL hidden(OBJ_PROP_PARAMS);
+ FX_BOOL highlight(OBJ_PROP_PARAMS);
+ FX_BOOL lineWidth(OBJ_PROP_PARAMS);
+ FX_BOOL multiline(OBJ_PROP_PARAMS);
+ FX_BOOL multipleSelection(OBJ_PROP_PARAMS);
+ FX_BOOL name(OBJ_PROP_PARAMS);
+ FX_BOOL numItems(OBJ_PROP_PARAMS);
+ FX_BOOL page(OBJ_PROP_PARAMS);
+ FX_BOOL password(OBJ_PROP_PARAMS);
+ FX_BOOL print(OBJ_PROP_PARAMS);
+ FX_BOOL radiosInUnison(OBJ_PROP_PARAMS);
+ FX_BOOL readonly(OBJ_PROP_PARAMS);
+ FX_BOOL rect(OBJ_PROP_PARAMS);
+ FX_BOOL required(OBJ_PROP_PARAMS);
+ FX_BOOL richText(OBJ_PROP_PARAMS);
+ FX_BOOL richValue(OBJ_PROP_PARAMS);
+ FX_BOOL rotation(OBJ_PROP_PARAMS);
+ FX_BOOL strokeColor(OBJ_PROP_PARAMS);
+ FX_BOOL style(OBJ_PROP_PARAMS);
+ FX_BOOL submitName(OBJ_PROP_PARAMS);
+ FX_BOOL textColor(OBJ_PROP_PARAMS);
+ FX_BOOL textFont(OBJ_PROP_PARAMS);
+ FX_BOOL textSize(OBJ_PROP_PARAMS);
+ FX_BOOL type(OBJ_PROP_PARAMS);
+ FX_BOOL userName(OBJ_PROP_PARAMS);
+ FX_BOOL value(OBJ_PROP_PARAMS);
+ FX_BOOL valueAsString(OBJ_PROP_PARAMS);
+ FX_BOOL source(OBJ_PROP_PARAMS);
+
+ FX_BOOL browseForFileToSubmit(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonGetCaption(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonGetIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonImportIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonSetCaption(OBJ_METHOD_PARAMS);
+ FX_BOOL buttonSetIcon(OBJ_METHOD_PARAMS);
+ FX_BOOL checkThisBox(OBJ_METHOD_PARAMS);
+ FX_BOOL clearItems(OBJ_METHOD_PARAMS);
+ FX_BOOL defaultIsChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL deleteItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL getArray(OBJ_METHOD_PARAMS);
+ FX_BOOL getItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL getLock(OBJ_METHOD_PARAMS);
+ FX_BOOL insertItemAt(OBJ_METHOD_PARAMS);
+ FX_BOOL isBoxChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL isDefaultChecked(OBJ_METHOD_PARAMS);
+ FX_BOOL setAction(OBJ_METHOD_PARAMS);
+ FX_BOOL setFocus(OBJ_METHOD_PARAMS);
+ FX_BOOL setItems(OBJ_METHOD_PARAMS);
+ FX_BOOL setLock(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureGetModifications(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureGetSeedValue(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureInfo(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureSetSeedValue(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureSign(OBJ_METHOD_PARAMS);
+ FX_BOOL signatureValidate(OBJ_METHOD_PARAMS);
+
+public:
+ static void SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);
+ static void SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);
+ static void SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_DWordArray& array);
+ static void SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex);
+ static void SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string);
+ static void SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);
+ static void SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);
+ static void SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect);
+ static void SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b);
+ static void SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex);
+ static void SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);
+ static void SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);
+ static void SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color);
+ static void SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string);
+ static void SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number);
+ static void SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string);
+ static void SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CJS_WideStringArray& strArray);
+
+public:
+ static void AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
+ const CFX_WideString& sName, const CPDF_Rect& rcCoords);
+public:
+ static void UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh);
+ static void UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh);
+
+ static CPDFSDK_Widget* GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl);
+ static void GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);
+
+ static void DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData);
+
+public:
+ FX_BOOL AttachField(Document* pDocument, const CFX_WideString& csFieldName);
+ void SetDelay(FX_BOOL bDelay);
+ void SetIsolate(v8::Isolate* isolate) {m_isolate = isolate;}
+protected:
+ void ParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo);
+ void GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldsArray);
+ CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField);
+ FX_BOOL ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel);
+
+ void AddDelay_Int(enum FIELD_PROP prop, FX_INT32 n);
+ void AddDelay_Bool(enum FIELD_PROP prop,bool b);
+ void AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string);
+ void AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string);
+ void AddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect);
+ void AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color);
+ void AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array);
+ void AddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array);
+
+ void DoDelay();
+public:
+ Document* m_pJSDoc;
+ CPDFSDK_Document* m_pDocument;
+ CFX_WideString m_FieldName;
+ int m_nFormControlIndex;
+ FX_BOOL m_bCanSet;
+
+ FX_BOOL m_bDelay;
+ v8::Isolate* m_isolate;
+};
+
+class CJS_Field : public CJS_Object
+{
+public:
+ CJS_Field(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Field(void){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_JS_CLASS(CJS_Field);
+
+ JS_STATIC_PROP(alignment, Field);
+ JS_STATIC_PROP(borderStyle, Field);
+ JS_STATIC_PROP(buttonAlignX, Field);
+ JS_STATIC_PROP(buttonAlignY, Field);
+ JS_STATIC_PROP(buttonFitBounds, Field);
+ JS_STATIC_PROP(buttonPosition, Field);
+ JS_STATIC_PROP(buttonScaleHow, Field);
+ JS_STATIC_PROP(buttonScaleWhen, Field);
+ JS_STATIC_PROP(calcOrderIndex, Field);
+ JS_STATIC_PROP(charLimit, Field);
+ JS_STATIC_PROP(comb, Field);
+ JS_STATIC_PROP(commitOnSelChange, Field);
+ JS_STATIC_PROP(currentValueIndices, Field);
+ JS_STATIC_PROP(defaultStyle, Field);
+ JS_STATIC_PROP(defaultValue, Field);
+ JS_STATIC_PROP(doNotScroll, Field);
+ JS_STATIC_PROP(doNotSpellCheck, Field);
+ JS_STATIC_PROP(delay, Field);
+ JS_STATIC_PROP(display, Field);
+ JS_STATIC_PROP(doc, Field);
+ JS_STATIC_PROP(editable, Field);
+ JS_STATIC_PROP(exportValues, Field);
+ JS_STATIC_PROP(fileSelect, Field);
+ JS_STATIC_PROP(fillColor, Field);
+ JS_STATIC_PROP(hidden, Field);
+ JS_STATIC_PROP(highlight, Field);
+ JS_STATIC_PROP(lineWidth, Field);
+ JS_STATIC_PROP(multiline, Field);
+ JS_STATIC_PROP(multipleSelection, Field);
+ JS_STATIC_PROP(name, Field);
+ JS_STATIC_PROP(numItems, Field);
+ JS_STATIC_PROP(page, Field);
+ JS_STATIC_PROP(password, Field);
+ JS_STATIC_PROP(print, Field);
+ JS_STATIC_PROP(radiosInUnison, Field);
+ JS_STATIC_PROP(readonly, Field);
+ JS_STATIC_PROP(rect, Field);
+ JS_STATIC_PROP(required, Field);
+ JS_STATIC_PROP(richText, Field);
+ JS_STATIC_PROP(richValue, Field);
+ JS_STATIC_PROP(rotation, Field);
+ JS_STATIC_PROP(strokeColor, Field);
+ JS_STATIC_PROP(style, Field);
+ JS_STATIC_PROP(submitName, Field);
+ JS_STATIC_PROP(textColor, Field);
+ JS_STATIC_PROP(textFont, Field);
+ JS_STATIC_PROP(textSize, Field);
+ JS_STATIC_PROP(type, Field);
+ JS_STATIC_PROP(userName, Field);
+ JS_STATIC_PROP(value, Field);
+ JS_STATIC_PROP(valueAsString, Field);
+ JS_STATIC_PROP(source, Field);
+
+ JS_STATIC_METHOD(browseForFileToSubmit, Field);
+ JS_STATIC_METHOD(buttonGetCaption, Field);
+ JS_STATIC_METHOD(buttonGetIcon, Field);
+ JS_STATIC_METHOD(buttonImportIcon, Field);
+ JS_STATIC_METHOD(buttonSetCaption, Field);
+ JS_STATIC_METHOD(buttonSetIcon, Field);
+ JS_STATIC_METHOD(checkThisBox, Field);
+ JS_STATIC_METHOD(clearItems, Field);
+ JS_STATIC_METHOD(defaultIsChecked, Field);
+ JS_STATIC_METHOD(deleteItemAt, Field);
+ JS_STATIC_METHOD(getArray, Field);
+ JS_STATIC_METHOD(getItemAt, Field);
+ JS_STATIC_METHOD(getLock, Field);
+ JS_STATIC_METHOD(insertItemAt, Field);
+ JS_STATIC_METHOD(isBoxChecked, Field);
+ JS_STATIC_METHOD(isDefaultChecked, Field);
+ JS_STATIC_METHOD(setAction, Field);
+ JS_STATIC_METHOD(setFocus, Field);
+ JS_STATIC_METHOD(setItems, Field);
+ JS_STATIC_METHOD(setLock, Field);
+ JS_STATIC_METHOD(signatureGetModifications, Field);
+ JS_STATIC_METHOD(signatureGetSeedValue, Field);
+ JS_STATIC_METHOD(signatureInfo, Field);
+ JS_STATIC_METHOD(signatureSetSeedValue, Field);
+ JS_STATIC_METHOD(signatureSign, Field);
+ JS_STATIC_METHOD(signatureValidate, Field);
+};
+
+#endif //_FIELD_H_
+
diff --git a/fpdfsdk/include/javascript/IJavaScript.h b/fpdfsdk/include/javascript/IJavaScript.h
new file mode 100644
index 0000000000..567ee82651
--- /dev/null
+++ b/fpdfsdk/include/javascript/IJavaScript.h
@@ -0,0 +1,112 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _IJAVASCRIPT_H_
+#define _IJAVASCRIPT_H_
+
+class IFXJS_Context
+{
+public:
+ virtual FX_BOOL Compile(const CFX_WideString& script, CFX_WideString& info) = 0;
+ virtual FX_BOOL RunScript(const CFX_WideString& script, CFX_WideString& info) = 0;
+
+public:
+ virtual void OnApp_Init() = 0;
+
+ virtual void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName) = 0;
+ virtual void OnDoc_WillPrint(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_DidPrint(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_WillSave(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_DidSave(CPDFSDK_Document* pDoc) = 0;
+ virtual void OnDoc_WillClose(CPDFSDK_Document* pDoc) = 0;
+
+ virtual void OnPage_Open(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_Close(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_InView(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnPage_OutView(CPDFSDK_Document* pTarget) = 0;
+
+ virtual void OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget) = 0;
+ virtual void OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;
+ virtual void OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value) = 0;
+
+ virtual void OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc) = 0;
+ virtual void OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit) = 0;
+ virtual void OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,
+ FX_BOOL KeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,
+ CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit,
+ FX_BOOL bFieldFull, FX_BOOL &bRc) = 0;
+ virtual void OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
+ FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc) = 0;
+
+ virtual void OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+ virtual void OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen) = 0;
+
+ virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) = 0;
+ virtual void OnLink_MouseUp(CPDFSDK_Document* pTarget) = 0;
+
+ virtual void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString &) = 0;
+ virtual void OnBatchExec(CPDFSDK_Document* pTarget) = 0;
+ virtual void OnConsole_Exec() = 0;
+ virtual void OnExternal_Exec() = 0;
+
+ virtual void EnableMessageBox(FX_BOOL bEnable) = 0;
+};
+
+class IFXJS_Runtime
+{
+public:
+ virtual IFXJS_Context* NewContext() = 0;
+ virtual void ReleaseContext(IFXJS_Context * pContext) = 0;
+ virtual IFXJS_Context* GetCurrentContext() = 0;
+
+ virtual void SetReaderDocument(CPDFSDK_Document* pReaderDoc) = 0;
+ virtual CPDFSDK_Document* GetReaderDocument() = 0;
+
+ virtual void GetObjectNames(CFX_WideStringArray& array) = 0;
+ virtual void GetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+ virtual void GetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+ virtual void GetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array) = 0;
+
+ virtual void Exit() = 0;
+ virtual void Enter() = 0;
+ virtual FX_BOOL IsEntered() = 0;
+};
+
+class CPDFDoc_Environment;
+class CJS_GlobalData;
+
+class CJS_RuntimeFactory
+{
+public:
+ CJS_RuntimeFactory():m_bInit(FALSE),m_nRef(0),m_pGlobalData(NULL),m_nGlobalDataCount(0) {}
+ ~CJS_RuntimeFactory();
+ IFXJS_Runtime* NewJSRuntime(CPDFDoc_Environment* pApp);
+ void DeleteJSRuntime(IFXJS_Runtime* pRuntime);
+ void AddRef();
+ void Release();
+
+ CJS_GlobalData* NewGlobalData(CPDFDoc_Environment* pApp);
+ void ReleaseGlobalData();
+private:
+ FX_BOOL m_bInit;
+ int m_nRef;
+ CJS_GlobalData* m_pGlobalData;
+ FX_INT32 m_nGlobalDataCount;
+};
+
+#endif //_IJAVASCRIPT_H_
+
diff --git a/fpdfsdk/include/javascript/Icon.h b/fpdfsdk/include/javascript/Icon.h
new file mode 100644
index 0000000000..26fec2ddfd
--- /dev/null
+++ b/fpdfsdk/include/javascript/Icon.h
@@ -0,0 +1,42 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _ICON_H_
+#define _ICON_H_
+
+class Icon : public CJS_EmbedObj
+{
+public:
+ Icon(CJS_Object* pJSObject);
+ virtual ~Icon();
+
+public:
+ FX_BOOL name(OBJ_PROP_PARAMS);
+
+public:
+ void SetStream(CPDF_Stream* pIconStream);
+ CPDF_Stream* GetStream();
+ void SetIconName(CFX_WideString name);
+ CFX_WideString GetIconName();
+private:
+ CPDF_Stream* m_pIconStream;
+ CFX_WideString m_swIconName;
+};
+
+class CJS_Icon : public CJS_Object
+{
+public:
+ CJS_Icon(JSFXObject pObject) : CJS_Object(pObject){};
+ virtual ~CJS_Icon(){};
+
+public:
+ DECLARE_JS_CLASS(CJS_Icon);
+
+ JS_STATIC_PROP(name, Icon);
+};
+
+#endif //_ICON_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Console.h b/fpdfsdk/include/javascript/JS_Console.h
new file mode 100644
index 0000000000..da842bdde7
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Console.h
@@ -0,0 +1,239 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_CONSOLE_H_
+#define _JS_CONSOLE_H_
+
+#include "../res/resource.h"
+
+#define WST_NONE 0x00 // No size changed
+#define WST_LEFT 0x01 // size to left
+#define WST_TOP 0x02 // size to top
+#define WST_RIGHT 0x04 // size to right
+#define WST_BOTTOM 0x08 // size to bottom
+#define WST_TOPLEFT (WST_TOP|WST_LEFT) // size to top & left
+#define WST_TOPRIGHT (WST_TOP|WST_RIGHT) // size to top & right
+#define WST_BOTTOMRIGHT (WST_BOTTOM|WST_RIGHT) // size to bottom & right
+#define WST_BOTTOMLEFT (WST_BOTTOM|WST_LEFT) // size to bottom & right
+
+#ifndef IDC_DLGSIZEBOX
+#define IDC_DLGSIZEBOX 50
+#endif /* IDC_DLGSIZEBOX */
+
+enum { m_idSizeIcon = IDC_DLGSIZEBOX };
+enum { // possible Control reSize Type
+ CST_NONE = 0,
+ CST_RESIZE, // NOMOVE + SIZE, add all delta-size of dlg to control
+ CST_REPOS, // MOVE(absolutely) + NOSIZE, move control's pos by delta-size
+ CST_RELATIVE, // MOVE(proportional) + NOSIZE, keep control always at a relative pos
+ CST_ZOOM, // MOVE + SIZE (both are automatically proportional)
+ CST_DELTA_ZOOM // MOVE(proportional, set manually) + SIZE(proportional, set manuall)
+};
+
+// contained class to hold item state
+//
+class CJS_ItemCtrl
+{
+public:
+ UINT m_nID;
+ UINT m_stxLeft : 4; // when left resizing ...
+ UINT m_stxRight : 4; // when right resizing ...
+ UINT m_styTop : 4; // when top resizing ...
+ UINT m_styBottom : 4; // when bottom resizing ...
+ UINT m_bFlickerFree : 1;
+ UINT m_bInvalidate : 1; // Invalidate ctrl's rect(eg. no-automatical update for static when resize+move)
+ UINT m_r0 : 14;
+ CRect m_wRect;
+ double m_xRatio, m_cxRatio;
+ double m_yRatio, m_cyRatio;
+
+protected:
+ void Assign(const CJS_ItemCtrl& src);
+
+public:
+ CJS_ItemCtrl();
+ CJS_ItemCtrl(const CJS_ItemCtrl& src);
+
+ HDWP OnSize(HDWP hdwp, int sizeType, CRect *pnCltRect, CRect *poCltRect, CRect *pR0, CWnd *pDlg);
+
+ CJS_ItemCtrl& operator=(const CJS_ItemCtrl& src);
+};
+
+class CJS_ResizeDlg : public CDialog
+{
+// DECLARE_DYNAMIC(CJS_ResizeDlg)
+public:
+ CJS_ResizeDlg(UINT nID,CWnd *pParentWnd = NULL);
+ virtual ~CJS_ResizeDlg();
+
+
+public:
+ std::vector<CJS_ItemCtrl> m_Items; // array of controlled items
+ CRect m_cltRect, m_cltR0;
+ int m_xMin, m_yMin;
+ int m_xSt, m_ySt; //step?
+ UINT m_nDelaySide; //drag side of window
+ CStatic m_wndSizeIcon; // size icon window
+
+protected:
+ void AddControl( UINT nID, int xl, int xr, int yt, int yb, int bFlickerFree = 0,
+ double xRatio = -1.0, double cxRatio = -1.0,
+ double yRatio = -1.0, double cyRatio = -1.0 );
+ void AllowSizing(int xst, int yst);
+ void HideSizeIcon(void);
+ virtual BOOL OnInitDialog();
+
+ void OnSizing(UINT nSide, LPRECT lpRect);
+ void OnSize(UINT nType, int cx, int cy);
+ void OnGetMinMaxInfo(MINMAXINFO *pmmi);
+ BOOL OnEraseBkgnd(CDC* pDC);
+
+public:
+ int UpdateControlRect(UINT nID, CRect *pnr);
+};
+
+
+//------------------------CIconListBox for CWndElementList-------------------------------------
+
+class CIconListBox : public CListBox
+{
+public:
+ CIconListBox();
+ virtual ~CIconListBox();
+
+public:
+ int InsertString(int nIndex, LPCWSTR lpszItem , int nImage);
+ virtual void ResetContent();
+ virtual void GetText(int nIndex, CString& rString);
+
+ virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
+ void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
+ int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CIconListBox)
+ afx_msg void OnMouseMove(UINT nFlags, CPoint point);
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+protected:
+ struct ItemDatas
+ {
+ CString csText;
+ int nImage;
+ };
+};
+//----------------------------------CWndElementList--------------------------------------------
+#define IDC_LIST_JS_ELEMENT 10070
+
+#define ELEMENT_LIST_WIDTH 140
+#define ELEMENT_LIST_HEIGHT 180
+#define ELEMENT_LIST_TOP_OFFSET 13
+
+#define ELEMENT_TYPE_NAME 0
+#define ELEMENT_TYPE_CONST 1
+#define ELEMENT_TYPE_FUN 2
+#define ELEMENT_TYPE_PRO 3
+
+class CWndElementList : public CWnd
+{
+public:
+ CWndElementList();
+ virtual ~CWndElementList();
+
+public:
+ virtual void OnSize(UINT nType, int cx, int cy);
+ virtual BOOL Create(CWnd* pParentWnd);
+ virtual BOOL ShowWindow(int nCmdShow);
+ void RemoveAllElement();
+ void SetElementList(LPCWSTR* pElement, int* pType , int iCount);
+ void AddElement(CFX_WideString csValue , int nType);
+ BOOL GetElementSel(CString &csElement);
+ BOOL SelectNext();
+ BOOL SelectPrevious();
+ BOOL SelectFirst();
+ BOOL SelectLast();
+ BOOL SelectNextPage();
+ BOOL SelectPreviousPage();
+ int GetListHeight();
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CWndElementList)
+ afx_msg void OnPaint();
+ afx_msg BOOL OnNcActivate(BOOL bActive);
+ afx_msg void OnSelJSElement();
+ afx_msg void OnDblclkJSElement();
+ afx_msg void OnDestroy();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+protected:
+ CIconListBox m_ListBox;
+ BOOL m_bBlock;
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// CJS_ConsoleDlg ¶Ô»°¿ò
+class CJS_ConsoleDlg : public CJS_ResizeDlg
+{
+ DECLARE_DYNAMIC(CJS_ConsoleDlg)
+
+public:
+ CJS_ConsoleDlg(CReader_App* pApp, CWnd* pParent);
+ virtual ~CJS_ConsoleDlg();
+
+ enum { IDD = IDD_JS_CONSOLE };
+
+ void Create();
+
+ void AppendConsoleText(const CFX_WideString& swText);
+ void SetConsoleText(const CFX_WideString& swText);
+ CFX_WideString GetConsoleText() const;
+ CFX_WideString GetScriptText() const;
+
+ BOOL ResetElementList(LPCWSTR lpstrRef);
+ IFXJS_Runtime* GetJSRuntime();
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö
+
+protected:
+ virtual BOOL OnInitDialog();
+ virtual void OnCancel();
+
+ virtual BOOL PreTranslateMessage(MSG* pMsg);
+
+protected:
+ // Generated message map functions
+ //{{AFX_MSG(CJS_ConsoleDlg)
+ afx_msg void OnBnClickedClear();
+ afx_msg void OnBnClickedOk();
+ afx_msg void OnBnClickTips();
+ afx_msg void OnSizing(UINT nSide, LPRECT lpRect);
+ afx_msg void OnSize(UINT nType, int cx, int cy);
+ afx_msg void OnGetMinMaxInfo(MINMAXINFO *pmmi);
+ afx_msg BOOL OnEraseBkgnd(CDC* pDC);
+ afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
+
+ afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
+ afx_msg void OnChangeScriptEdit(WPARAM wParam , LPARAM lParam);
+ afx_msg void OnMove(int x , int y);
+ public:
+ virtual int DoModal();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+
+public:
+ CGW_LineNumberEdit m_edtSC;
+ BOOL m_bTips;
+ const UINT m_uTextlimited;
+ FX_HGLOBAL m_hGlobal;
+ CReader_App * m_pApp;
+ CWndElementList m_WndElementList;
+};
+
+#endif //_JS_CONSOLE_H_ \ No newline at end of file
diff --git a/fpdfsdk/include/javascript/JS_Context.h b/fpdfsdk/include/javascript/JS_Context.h
new file mode 100644
index 0000000000..0e79169d53
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Context.h
@@ -0,0 +1,101 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_CONTEXT_H_
+#define _JS_CONTEXT_H_
+
+class CJS_EventHandler;
+class CJS_Runtime;
+
+class CJS_Context : public IFXJS_Context
+{
+public:
+ CJS_Context(CJS_Runtime* pRuntime);
+ virtual ~CJS_Context();
+
+public:
+ virtual FX_BOOL Compile(const CFX_WideString& script, CFX_WideString& info);
+ virtual FX_BOOL RunScript(const CFX_WideString& script, CFX_WideString& info);
+
+public:
+ virtual void OnApp_Init();
+
+ virtual void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);
+ virtual void OnDoc_WillPrint(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_DidPrint(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_WillSave(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_DidSave(CPDFSDK_Document* pDoc);
+ virtual void OnDoc_WillClose(CPDFSDK_Document* pDoc);
+
+ virtual void OnPage_Open(CPDFSDK_Document* pTarget);
+ virtual void OnPage_Close(CPDFSDK_Document* pTarget);
+ virtual void OnPage_InView(CPDFSDK_Document* pTarget);
+ virtual void OnPage_OutView(CPDFSDK_Document* pTarget);
+
+ virtual void OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ virtual void OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+ virtual void OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+
+ virtual void OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);
+ virtual void OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);
+ virtual void OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,
+ FX_BOOL bKeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,
+ CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit,
+ FX_BOOL bFieldFull, FX_BOOL &bRc);
+ virtual void OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
+ FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);
+
+ virtual void OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ virtual void OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+
+ virtual void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark);
+ virtual void OnLink_MouseUp(CPDFSDK_Document* pTarget);
+
+ virtual void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);
+ virtual void OnBatchExec(CPDFSDK_Document* pTarget);
+ virtual void OnConsole_Exec();
+ virtual void OnExternal_Exec();
+
+ virtual void EnableMessageBox(FX_BOOL bEnable) {m_bMsgBoxEnable = bEnable;}
+ FX_BOOL IsMsgBoxEnabled() const {return m_bMsgBoxEnable;}
+
+public:
+ CPDFDoc_Environment* GetReaderApp();
+ CJS_Runtime* GetJSRuntime(){return m_pRuntime;}
+
+ FX_BOOL DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info);
+
+ CJS_EventHandler* GetEventHandler(){return m_pEventHandler;};
+ CPDFSDK_Document* GetReaderDocument();
+
+private:
+ CJS_Runtime* m_pRuntime;
+ CJS_EventHandler* m_pEventHandler;
+
+ FX_BOOL m_bBusy;
+ FX_BOOL m_bMsgBoxEnable;
+};
+
+// static CFX_WideString JSGetStringFromID(CJS_Context* pContext, UINT ID)
+// {
+// ASSERT(pContext != NULL);
+//
+// return JS_LoadString(pContext->GetReaderApp(), ID);
+// }
+
+#endif //_JS_CONTEXT_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Define.h b/fpdfsdk/include/javascript/JS_Define.h
new file mode 100644
index 0000000000..c86289e640
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Define.h
@@ -0,0 +1,785 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_DEFINE_H_
+#define _JS_DEFINE_H_
+
+typedef v8::Value JSValue;
+typedef v8::Handle<v8::Object> JSObject;
+typedef v8::Handle<v8::Object> JSFXObject;
+typedef unsigned JSBool;
+
+struct JSConstSpec
+{
+ const wchar_t* pName;
+ double number;
+ const wchar_t* string;
+ FX_BYTE t; //0:double 1:str
+};
+
+struct JSPropertySpec
+{
+ const wchar_t* pName;
+ AccessorGetterCallback pPropGet;
+ AccessorSetterCallback pPropPut;
+};
+
+struct JSMethodSpec
+{
+ const wchar_t* pName;
+ FunctionCallback pMethodCall;
+ unsigned nParamNum;
+};
+
+typedef CFX_WideString JS_ErrorString;
+
+#define JS_TRUE (unsigned)1
+#define JS_FALSE (unsigned)0
+
+
+#define CJS_PointsArray CFX_ArrayTemplate<float>
+#define CJS_IntArray CFX_ArrayTemplate<int>
+
+/* ====================================== PUBLIC DEFINE SPEC ============================================== */
+#ifndef __GNUC__
+#define JS_WIDESTRING(widestring) L#widestring
+#else
+#define JS_WIDESTRING(widestring) L""#widestring
+#endif
+
+#define OBJ_PROP_PARAMS IFXJS_Context* cc, CJS_PropValue& vp, JS_ErrorString& sError
+#define OBJ_METHOD_PARAMS IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, JS_ErrorString& sError
+#define BEGIN_JS_STATIC_CONST(js_class_name) JSConstSpec js_class_name::JS_Class_Consts[] = {
+#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) {JS_WIDESTRING(const_name), pValue, L"", 0},
+#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) {JS_WIDESTRING(const_name), 0, JS_WIDESTRING(pValue), 1},
+#define END_JS_STATIC_CONST() {0, 0, 0, 0}};
+
+#define BEGIN_JS_STATIC_PROP(js_class_name) JSPropertySpec js_class_name::JS_Class_Properties[] = {
+#define JS_STATIC_PROP_ENTRY(prop_name) {JS_WIDESTRING(prop_name), get_##prop_name##_static, set_##prop_name##_static},
+#define END_JS_STATIC_PROP() {0, 0, 0}};
+
+#define BEGIN_JS_STATIC_METHOD(js_class_name) JSMethodSpec js_class_name::JS_Class_Methods[] = {
+#define JS_STATIC_METHOD_ENTRY(method_name, nargs) {JS_WIDESTRING(method_name), method_name##_static, nargs},
+#define END_JS_STATIC_METHOD() {0, 0, 0}};
+#define MEMLEAKCHECK_1() ((void)0)
+#define MEMLEAKCHECK_2(main_name, sub_name) ((void)0)
+
+
+/*
+#ifdef _DEBUG
+#define MEMLEAKCHECK_1() \
+ _CrtMemState state1;\
+ _CrtMemCheckpoint(&state1);
+
+#define MEMLEAKCHECK_2(main_name,sub_name) \
+ _CrtMemState state2;\
+ _CrtMemCheckpoint(&state2);\
+ _CrtMemState diff;\
+ _CrtMemDifference(&diff,&state1,&state2);\
+ if (diff.lSizes[_NORMAL_BLOCK] > 0)\
+ {\
+ TRACE("Detected normal block memory leaks in JS Module! [%s.%s]\n",#main_name,#sub_name);\
+ _CrtMemDumpStatistics(&diff);\
+ }
+#else
+ #define MEMLEAKCHECK_1() ((void)0)
+ #define MEMLEAKCHECK_2(main_name,sub_name) ((void)0)
+#endif
+*/
+
+/* ======================================== PROP CALLBACK ============================================ */
+
+#define JS_STATIC_PROP_GET(prop_name, class_name)\
+ static void get_##prop_name##_static(JS_PROPGET_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_PropValue value(isolate);\
+ value.StartGetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->prop_name(cc, value, sError);\
+ MEMLEAKCHECK_2(class_name, prop_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+#define JS_STATIC_PROP_SET(prop_name, class_name)\
+ static void set_##prop_name##_static(JS_PROPPUT_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_PropValue propValue(CJS_Value(isolate,value,VT_unknown));\
+ propValue.StartSetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->prop_name(cc, propValue, sError);\
+ MEMLEAKCHECK_2(class_name, prop_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #prop_name);\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+#define JS_STATIC_PROP(prop_name, class_name)\
+JS_STATIC_PROP_GET(prop_name, class_name);\
+JS_STATIC_PROP_SET(prop_name, class_name)
+
+/* ========================================= METHOD CALLBACK =========================================== */
+
+#define JS_STATIC_METHOD(method_name, class_name)\
+ static void method_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_name* pObj = (class_name*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->method_name(cc, parameters, valueRes, sError);\
+ MEMLEAKCHECK_2(class_name, method_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+}
+
+/* ===================================== JS CLASS =============================================== */
+
+#define DECLARE_JS_CLASS(js_class_name) \
+ static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global);\
+ static JSBool JSDestructor(JSFXObject obj);\
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
+ static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static JSPropertySpec JS_Class_Properties[];\
+ static JSMethodSpec JS_Class_Methods[];\
+ static const wchar_t* m_pClassName
+
+#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \
+const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+JSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global)\
+{\
+ CJS_Object* pObj = FX_NEW js_class_name(obj);\
+ pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
+ JS_SetPrivate(NULL,obj,(void*)pObj); \
+ pObj->InitInstance(cc);\
+ return JS_TRUE;\
+}\
+\
+JSBool js_class_name::JSDestructor(JSFXObject obj) \
+{\
+ js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
+ ASSERT(pObj != NULL);\
+ pObj->ExitInstance();\
+ delete pObj;\
+ return JS_TRUE;\
+}\
+\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
+ if (nObjDefnID >= 0)\
+ {\
+ for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
+ {\
+ if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet, JS_Class_Properties[j].pPropPut) < 0) return -1;\
+ }\
+ for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
+ {\
+ if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName, JS_Class_Methods[k].pMethodCall, JS_Class_Methods[k].nParamNum) < 0) return -1;\
+ }\
+ return nObjDefnID;\
+ }\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts) / sizeof(JSConstSpec) - 1;\
+}\
+void js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
+{\
+ pProperties = JS_Class_Properties;\
+ nSize = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1;\
+}\
+void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
+{\
+ pMethods = JS_Class_Methods;\
+ nSize = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;\
+}
+
+#define IMPLEMENT_JS_CLASS(js_class_name, class_name) IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)
+
+/* ======================================== CONST CLASS ============================================ */
+
+#define DECLARE_JS_CLASS_CONST() \
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static const wchar_t* m_pClassName
+
+#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \
+const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, NULL, NULL, 0);\
+ if (nObjDefnID >=0)\
+ {\
+ for (int i=0, sz=sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1; i<sz; i++)\
+ {\
+ if (JS_Class_Consts[i].t == 0)\
+ {\
+ if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewNumber(pRuntime,JS_Class_Consts[i].number)) < 0) return -1;\
+ }\
+ else\
+ {\
+ if (JS_DefineObjConst(pRuntime, nObjDefnID, JS_Class_Consts[i].pName, JS_NewString(pRuntime,JS_Class_Consts[i].string)) < 0) return -1;\
+ }\
+ }\
+ return nObjDefnID;\
+ }\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
+}
+
+/* ===================================== SPECIAL JS CLASS =============================================== */
+
+#define DECLARE_SPECIAL_JS_CLASS(js_class_name) \
+ static JSBool JSConstructor(IFXJS_Context* cc, JSFXObject obj, JSFXObject global);\
+ static JSBool JSDestructor(JSFXObject obj);\
+ static void GetConsts(JSConstSpec*& pConsts, int& nSize);\
+ static void GetProperties(JSPropertySpec*& pProperties, int& nSize);\
+ static void GetMethods(JSMethodSpec*& pMethods, int& nSize);\
+ static JSConstSpec JS_Class_Consts[];\
+ static JSPropertySpec JS_Class_Properties[];\
+ static JSMethodSpec JS_Class_Methods[];\
+ static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);\
+ static const wchar_t* m_pClassName;\
+ static void queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS);\
+ static void getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS);\
+ static void putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS);\
+ static void delprop_##js_class_name##_static(JS_PROPDEL_ARGS)
+
+#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \
+const wchar_t * js_class_name::m_pClassName = JS_WIDESTRING(class_name);\
+ void js_class_name::queryprop_##js_class_name##_static(JS_PROPQUERY_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->QueryProperty((FX_LPCWSTR)propname);\
+ MEMLEAKCHECK_2(class_name, (FX_LPCWSTR)prop_name);\
+ }\
+ catch (...)\
+ {\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(0x004);\
+ return ;\
+ }\
+ else\
+ {\
+ info.GetReturnValue().Set(0);\
+ return ;\
+ }\
+ return ;\
+}\
+ void js_class_name::getprop_##js_class_name##_static(JS_NAMED_PROPGET_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_PropValue value(isolate);\
+ value.StartGetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, value, sError);\
+ MEMLEAKCHECK_2(class_name, L"GetProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, L"GetProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set((v8::Handle<v8::Value>)value);\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, L"GetProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL,L"GetProperty", L"Embeded object not found!");\
+ return ;\
+}\
+ void js_class_name::putprop_##js_class_name##_static(JS_NAMED_PROPPUT_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_PropValue PropValue(CJS_Value(isolate,value,VT_unknown));\
+ PropValue.StartSetting();\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ if(!pJSObj) return;\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DoProperty(cc, (FX_LPCWSTR)propname, PropValue, sError);\
+ MEMLEAKCHECK_2(class_name,L"PutProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "PutProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "PutProperty");\
+ JS_Error(NULL,CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL,L"PutProperty", L"Embeded object not found!");\
+ return ;\
+}\
+ void js_class_name::delprop_##js_class_name##_static(JS_PROPDEL_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ v8::String::Utf8Value utf8_value(property);\
+ CFX_WideString propname = CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());\
+ CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate,info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->DelProperty(cc, (FX_LPCWSTR)propname, sError);\
+ MEMLEAKCHECK_2(class_name,L"DelProperty");\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "DelProperty");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, "DelProperty");\
+ return ;\
+ }\
+ return ;\
+}\
+JSBool js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj,JSFXObject global)\
+{\
+ CJS_Object* pObj = FX_NEW js_class_name(obj);\
+ pObj->SetEmbedObject(FX_NEW class_alternate(pObj));\
+ JS_SetPrivate(NULL,obj, (void*)pObj); \
+ pObj->InitInstance(cc);\
+ return JS_TRUE;\
+}\
+\
+JSBool js_class_name::JSDestructor(JSFXObject obj) \
+{\
+ js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL,obj);\
+ ASSERT(pObj != NULL);\
+ pObj->ExitInstance();\
+ delete pObj;\
+ return JS_TRUE;\
+}\
+\
+int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType)\
+{\
+\
+ int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName, eObjType, JSConstructor, JSDestructor, 0);\
+\
+ if (nObjDefnID >= 0)\
+ {\
+ for (int j=0, szj=sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1; j<szj; j++)\
+ {\
+ if (JS_DefineObjProperty(pRuntime, nObjDefnID, JS_Class_Properties[j].pName, JS_Class_Properties[j].pPropGet,JS_Class_Properties[j].pPropPut)<0)return -1;\
+ }\
+\
+ for (int k=0, szk=sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1; k<szk; k++)\
+ {\
+ if (JS_DefineObjMethod(pRuntime, nObjDefnID,JS_Class_Methods[k].pName,JS_Class_Methods[k].pMethodCall,JS_Class_Methods[k].nParamNum)<0)return -1;\
+ }\
+ if (JS_DefineObjAllProperties(pRuntime, nObjDefnID, js_class_name::queryprop_##js_class_name##_static, js_class_name::getprop_##js_class_name##_static,js_class_name::putprop_##js_class_name##_static,js_class_name::delprop_##js_class_name##_static)<0) return -1;\
+\
+ return nObjDefnID;\
+ }\
+\
+ return -1;\
+}\
+void js_class_name::GetConsts(JSConstSpec*& pConsts, int& nSize)\
+{\
+ pConsts = JS_Class_Consts;\
+ nSize = sizeof(JS_Class_Consts)/sizeof(JSConstSpec)-1;\
+}\
+void js_class_name::GetProperties(JSPropertySpec*& pProperties, int& nSize)\
+{\
+ pProperties = JS_Class_Properties;\
+ nSize = sizeof(JS_Class_Properties)/sizeof(JSPropertySpec)-1;\
+}\
+void js_class_name::GetMethods(JSMethodSpec*& pMethods, int& nSize)\
+{\
+ pMethods = JS_Class_Methods;\
+ nSize = sizeof(JS_Class_Methods)/sizeof(JSMethodSpec)-1;\
+}
+
+#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name)\
+ static void method_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ CJS_Object* pJSObj = (CJS_Object *)JS_GetPrivate(isolate, info.Holder());\
+ ASSERT(pJSObj != NULL);\
+ class_alternate* pObj = (class_alternate*)pJSObj->GetEmbedObject();\
+ ASSERT(pObj != NULL);\
+ JS_ErrorString sError;\
+ FX_BOOL bRet = FALSE;\
+ try\
+ {\
+ MEMLEAKCHECK_1();\
+ bRet = pObj->method_name(cc, parameters, valueRes, sError);\
+ MEMLEAKCHECK_2(class_name, method_name);\
+ }\
+ catch (...)\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), L"Unknown error is catched!");\
+ return ;\
+ }\
+ if (bRet)\
+ {\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+ }\
+ else\
+ {\
+ CFX_ByteString cbName;\
+ cbName.Format("%s.%s", #class_name, #method_name);\
+ JS_Error(NULL, CFX_WideString::FromLocal(cbName), sError);\
+ return ;\
+ }\
+ JS_Error(NULL, JS_WIDESTRING(method_name), L"Embeded object not found!");\
+ return ;\
+}
+
+/* ======================================== GLOBAL METHODS ============================================ */
+#define JS_STATIC_GLOBAL_FUN(fun_name) \
+static void fun_name##_static(JS_METHOD_ARGS)\
+{\
+ v8::Isolate* isolate = info.GetIsolate();\
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();\
+ v8::Local<v8::Value> v = context->GetEmbedderData(1);\
+ ASSERT(!v.IsEmpty());\
+ if(v.IsEmpty()) return;\
+ v8::Handle<External> field = v8::Handle<External>::Cast(v);\
+ IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value();\
+ IFXJS_Context* cc = pRuntime->GetCurrentContext();\
+ CJS_Parameters parameters;\
+ for (unsigned int i = 0; i<(unsigned int)info.Length(); i++)\
+ {\
+ parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));\
+ }\
+ CJS_Value valueRes(isolate);\
+ JS_ErrorString sError;\
+ if (!fun_name(cc, parameters, valueRes, sError))\
+ {\
+ JS_Error(NULL, JS_WIDESTRING(fun_name), sError);\
+ return ;\
+ }\
+ info.GetReturnValue().Set(valueRes.ToJSValue());\
+ return ;\
+}
+
+#define JS_STATIC_DECLARE_GLOBAL_FUN() \
+static JSMethodSpec global_methods[]; \
+static int Init(IJS_Runtime* pRuntime)
+
+#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
+JSMethodSpec js_class_name::global_methods[] = {
+
+#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name,nargs) JS_STATIC_METHOD_ENTRY(method_name,nargs)
+
+#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()
+
+#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \
+int js_class_name::Init(IJS_Runtime* pRuntime)\
+{\
+ for (int i=0, sz=sizeof(js_class_name::global_methods)/sizeof(JSMethodSpec)-1; i<sz; i++)\
+ {\
+ if (JS_DefineGlobalMethod(pRuntime,\
+ js_class_name::global_methods[i].pName,\
+ js_class_name::global_methods[i].pMethodCall,\
+ js_class_name::global_methods[i].nParamNum\
+ ) < 0\
+ )return -1;\
+ }\
+ return 0;\
+}
+
+/* ======================================== GLOBAL CONSTS ============================================ */
+#define DEFINE_GLOBAL_CONST(pRuntime, const_name , const_value)\
+if (JS_DefineGlobalConst(pRuntime,JS_WIDESTRING(const_name),JS_NewString(pRuntime,JS_WIDESTRING(const_value)))) return -1
+
+/* ======================================== GLOBAL ARRAYS ============================================ */
+
+#define DEFINE_GLOBAL_ARRAY(pRuntime)\
+int size = sizeof(ArrayContent) / sizeof(FX_LPCWSTR);\
+\
+CJS_Array array(pRuntime);\
+for (int i=0; i<size; i++) array.SetElement(i,CJS_Value(pRuntime,(FX_LPCWSTR)ArrayContent[i]));\
+\
+CJS_PropValue prop(pRuntime);\
+prop << array;\
+if (JS_DefineGlobalConst(pRuntime, (const wchar_t*)ArrayName, prop.ToJSValue()) < 0)\
+ return -1
+
+/* ============================================================ */
+
+#define VALUE_NAME_STRING L"string"
+#define VALUE_NAME_NUMBER L"number"
+#define VALUE_NAME_BOOLEAN L"boolean"
+#define VALUE_NAME_DATE L"date"
+#define VALUE_NAME_OBJECT L"object"
+#define VALUE_NAME_FXOBJ L"fxobj"
+#define VALUE_NAME_NULL L"null"
+#define VALUE_NAME_UNDEFINED L"undefined"
+
+#define CLASSNAME_ARRAY L"Array"
+#define CLASSNAME_DATE L"Date"
+#define CLASSNAME_STRING L"v8::String"
+
+const unsigned int JSCONST_nStringHash = JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING));
+const unsigned int JSCONST_nNumberHash = JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER));
+const unsigned int JSCONST_nBoolHash = JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN));
+const unsigned int JSCONST_nDateHash = JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE));
+const unsigned int JSCONST_nObjectHash = JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT));
+const unsigned int JSCONST_nFXobjHash = JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ));
+const unsigned int JSCONST_nNullHash = JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL));
+const unsigned int JSCONST_nUndefHash = JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED));
+
+static FXJSVALUETYPE GET_VALUE_TYPE(v8::Handle<v8::Value> p)
+{
+
+ const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p));
+
+ if (nHash == JSCONST_nUndefHash)
+ return VT_undefined;
+ else if (nHash == JSCONST_nNullHash)
+ return VT_null;
+ else if (nHash == JSCONST_nStringHash)
+ return VT_string;
+ else if (nHash == JSCONST_nNumberHash)
+ return VT_number;
+ else if (nHash == JSCONST_nBoolHash)
+ return VT_boolean;
+ else if (nHash == JSCONST_nDateHash)
+ return VT_date;
+ else if (nHash == JSCONST_nObjectHash)
+ return VT_object;
+ else if (nHash == JSCONST_nFXobjHash)
+ return VT_fxobject;
+
+ /*
+ const char * sType = p->getTypeof()->toDchars();
+ if (strcmp(sType,VALUE_NAME_STRING) == 0)
+ return VT_string;
+ else if (strcmp(sType,VALUE_NAME_NUMBER) == 0)
+ return VT_number;
+ else if (strcmp(sType,VALUE_NAME_BOOLEAN) == 0)
+ return VT_boolean;
+ else if (strcmp(sType,VALUE_NAME_DATE) == 0)
+ return VT_date;
+ else if (strcmp(sType,VALUE_NAME_OBJECT) == 0)
+ return VT_object;
+ else if (strcmp(sType,VALUE_NAME_FXOBJ) == 0)
+ return VT_object;
+ else if (strcmp(sType,VALUE_NAME_NULL) == 0)
+ return VT_null;
+ else if (strcmp(sType,VALUE_NAME_UNDEFINED) == 0)
+ return VT_undefined;
+ */
+
+ return VT_unknown;
+}
+
+#endif //_JS_DEFINE_H_
diff --git a/fpdfsdk/include/javascript/JS_EventHandler.h b/fpdfsdk/include/javascript/JS_EventHandler.h
new file mode 100644
index 0000000000..d88c50c06b
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_EventHandler.h
@@ -0,0 +1,167 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_EVENTHANDLER_H_
+#define _JS_EVENTHANDLER_H_
+
+class CJS_Context;
+class Field;
+
+enum JS_EVENT_T
+{
+ JET_UNKNOWN,
+ JET_APP_INIT,
+ JET_DOC_OPEN,
+ JET_DOC_WILLPRINT,
+ JET_DOC_DIDPRINT,
+ JET_DOC_WILLSAVE,
+ JET_DOC_DIDSAVE,
+ JET_DOC_WILLCLOSE,
+ JET_PAGE_OPEN,
+ JET_PAGE_CLOSE,
+ JET_PAGE_INVIEW,
+ JET_PAGE_OUTVIEW,
+ JET_FIELD_MOUSEDOWN,
+ JET_FIELD_MOUSEUP,
+ JET_FIELD_MOUSEENTER,
+ JET_FIELD_MOUSEEXIT,
+ JET_FIELD_FOCUS,
+ JET_FIELD_BLUR,
+ JET_FIELD_KEYSTROKE,
+ JET_FIELD_VALIDATE,
+ JET_FIELD_CALCULATE,
+ JET_FIELD_FORMAT,
+ JET_SCREEN_FOCUS,
+ JET_SCREEN_BLUR,
+ JET_SCREEN_OPEN,
+ JET_SCREEN_CLOSE,
+ JET_SCREEN_MOUSEDOWN,
+ JET_SCREEN_MOUSEUP,
+ JET_SCREEN_MOUSEENTER,
+ JET_SCREEN_MOUSEEXIT,
+ JET_SCREEN_INVIEW,
+ JET_SCREEN_OUTVIEW,
+ JET_BATCH_EXEC,
+ JET_MENU_EXEC,
+ JET_CONSOLE_EXEC,
+ JET_EXTERNAL_EXEC,
+ JET_BOOKMARK_MOUSEUP,
+ JET_LINK_MOUSEUP
+};
+
+class CJS_EventHandler
+{
+public:
+ CJS_EventHandler(CJS_Context * pContext);
+ virtual ~CJS_EventHandler();
+
+ void OnApp_Init();
+
+ void OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName);
+ void OnDoc_WillPrint(CPDFSDK_Document* pDoc);
+ void OnDoc_DidPrint(CPDFSDK_Document* pDoc);
+ void OnDoc_WillSave(CPDFSDK_Document* pDoc);
+ void OnDoc_DidSave(CPDFSDK_Document* pDoc);
+ void OnDoc_WillClose(CPDFSDK_Document* pDoc);
+
+ void OnPage_Open(CPDFSDK_Document* pDoc);
+ void OnPage_Close(CPDFSDK_Document* pDoc);
+ void OnPage_InView(CPDFSDK_Document* pTarget);
+ void OnPage_OutView(CPDFSDK_Document* pTarget);
+
+ void OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);
+ void OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit);
+ void OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,
+ FX_BOOL KeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart, FX_BOOL bShift,
+ CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit,
+ FX_BOOL bFieldFull, FX_BOOL &bRc);
+ void OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
+ FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc);
+
+ void OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ void OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ void OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ void OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget);
+ void OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+ void OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value);
+
+ void OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+ void OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen);
+
+ void OnBookmark_MouseUp(CPDF_Bookmark* pBookMark);
+ void OnLink_MouseUp(CPDFSDK_Document* pTarget);
+
+ void OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName);
+ void OnBatchExec(CPDFSDK_Document *pTarget);
+ void OnConsole_Exec();
+ void OnExternal_Exec();
+
+public:
+ void Initial(JS_EVENT_T type);
+ void Destroy();
+ FX_BOOL IsValid();
+
+
+ CFX_WideString& Change();
+ CFX_WideString ChangeEx();
+ int CommitKey();
+ FX_BOOL FieldFull();
+ FX_BOOL KeyDown();
+ FX_BOOL Modifier();
+ FX_LPCWSTR Name();
+ FX_LPCWSTR Type();
+ FX_BOOL& Rc();
+ int& SelEnd();
+ int& SelStart();
+ FX_BOOL Shift();
+ Field* Source();
+ Field* Target_Field();
+ CFX_WideString& Value();
+ FX_BOOL WillCommit();
+ CFX_WideString TargetName();
+
+ JS_EVENT_T EventType() {return m_eEventType;};
+
+public:
+ CJS_Context* m_pJSContext;
+ JS_EVENT_T m_eEventType;
+ FX_BOOL m_bValid;
+
+ CFX_WideString m_strTargetName;
+ CFX_WideString m_strSourceName;
+ CFX_WideString* m_pWideStrChange;
+ CFX_WideString m_WideStrChangeDu;
+ CFX_WideString m_WideStrChangeEx;
+ int m_nCommitKey;
+ FX_BOOL m_bKeyDown;
+ FX_BOOL m_bModifier;
+ FX_BOOL m_bShift;
+ int* m_pISelEnd;
+ int m_nSelEndDu;
+ int* m_pISelStart;
+ int m_nSelStartDu;
+ FX_BOOL m_bWillCommit;
+ CFX_WideString* m_pValue;
+ FX_BOOL m_bFieldFull;
+ FX_BOOL* m_pbRc;
+ FX_BOOL m_bRcDu;
+
+ CPDFSDK_Document* m_pSourceDoc;
+ CPDF_Bookmark* m_pTargetBookMark;
+ CPDFSDK_Document* m_pTargetDoc;
+ CPDFSDK_Annot* m_pTargetAnnot;
+};
+
+#endif //_JS_EVENTHANDLER_H_
+
diff --git a/fpdfsdk/include/javascript/JS_GlobalData.h b/fpdfsdk/include/javascript/JS_GlobalData.h
new file mode 100644
index 0000000000..97a54024d0
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_GlobalData.h
@@ -0,0 +1,97 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_GLOBALDATA_H_
+#define _JS_GLOBALDATA_H_
+
+#define JS_GLOBALDATA_TYPE_NUMBER 0
+#define JS_GLOBALDATA_TYPE_BOOLEAN 1
+#define JS_GLOBALDATA_TYPE_STRING 2
+#define JS_GLOBALDATA_TYPE_OBJECT 3
+#define JS_GLOBALDATA_TYPE_NULL 4
+
+class CJS_KeyValue;
+class CJS_GlobalVariableArray;
+class CJS_GlobalData_Element;
+
+class CJS_GlobalVariableArray
+{
+public:
+ CJS_GlobalVariableArray();
+ virtual ~CJS_GlobalVariableArray();
+
+ void Add(CJS_KeyValue* p);
+ int Count() const;
+ CJS_KeyValue* GetAt(int index) const;
+ void Copy(const CJS_GlobalVariableArray& array);
+
+ void Empty();
+
+private:
+ CFX_ArrayTemplate<CJS_KeyValue*> array;
+};
+
+class CJS_KeyValue
+{
+public:
+ CJS_KeyValue(){}
+ virtual ~CJS_KeyValue(){}
+
+ CFX_ByteString sKey;
+ int nType; //0:int 1:bool 2:string 3:obj
+ double dData;
+ bool bData;
+ CFX_ByteString sData;
+ CJS_GlobalVariableArray objData;
+};
+
+class CJS_GlobalData_Element
+{
+public:
+ CJS_GlobalData_Element(){}
+ virtual ~CJS_GlobalData_Element(){}
+
+ CJS_KeyValue data;
+ FX_BOOL bPersistent;
+};
+
+class CJS_GlobalData
+{
+public:
+ CJS_GlobalData(CPDFDoc_Environment* pApp);
+ virtual ~CJS_GlobalData();
+
+public:
+ void SetGlobalVariableNumber(FX_LPCSTR propname, double dData);
+ void SetGlobalVariableBoolean(FX_LPCSTR propname, bool bData);
+ void SetGlobalVariableString(FX_LPCSTR propname, const CFX_ByteString& sData);
+ void SetGlobalVariableObject(FX_LPCSTR propname, const CJS_GlobalVariableArray& array);
+ void SetGlobalVariableNull(FX_LPCSTR propname);
+
+ FX_BOOL SetGlobalVariablePersistent(FX_LPCSTR propname, FX_BOOL bPersistent);
+ FX_BOOL DeleteGlobalVariable(FX_LPCSTR propname);
+
+ FX_INT32 GetSize() const;
+ CJS_GlobalData_Element* GetAt(int index) const;
+
+private:
+ void LoadGlobalPersistentVariables();
+ void SaveGlobalPersisitentVariables();
+
+ CJS_GlobalData_Element* GetGlobalVariable(FX_LPCSTR propname);
+ int FindGlobalVariable(FX_LPCSTR propname);
+
+ void LoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength);
+ void WriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength);
+ void MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData);
+
+private:
+ CFX_ArrayTemplate<CJS_GlobalData_Element*> m_arrayGlobalData;
+ CFX_WideString m_sFilePath;
+ CPDFDoc_Environment* m_pApp;
+};
+
+#endif //_JS_GLOBALDATA_H_
diff --git a/fpdfsdk/include/javascript/JS_Module.h b/fpdfsdk/include/javascript/JS_Module.h
new file mode 100644
index 0000000000..d725f6bc17
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Module.h
@@ -0,0 +1,47 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_MODULE_H_
+#define _JS_MODULE_H_
+
+class CJS_GlobalData;
+class CJS_ConsoleDlg;
+
+class CJS_Module : public IReader_Module
+{
+public:
+ CJS_Module(HMODULE hModule, CReader_App* pApp);
+ virtual ~CJS_Module();
+
+ virtual void Destroy(){delete this;}
+ virtual CFX_ByteString GetModuleName();
+
+public:
+ static CJS_Module* GetModule(CReader_App* pApp);
+
+ IFXJS_Runtime* NewJSRuntime();
+ CJS_GlobalData* NewGlobalData();
+ void ReleaseGlobalData();
+
+public:
+ //console
+ void ShowConsole();
+ void HideConsole();
+ void ClearConsole();
+ void PrintLineConsole(FX_LPCWSTR string);
+
+private:
+ HMODULE m_hModule;
+ CReader_App* m_pApp;
+
+ FX_BOOL m_bInitial;
+ CJS_GlobalData* m_pGlobalData;
+ FX_INT32 m_nGlobalDataCount;
+
+ CJS_ConsoleDlg* m_pConsole;
+};
+
+#endif //_JS_MODULE_H_ \ No newline at end of file
diff --git a/fpdfsdk/include/javascript/JS_Object.h b/fpdfsdk/include/javascript/JS_Object.h
new file mode 100644
index 0000000000..8b91f8cd0d
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Object.h
@@ -0,0 +1,288 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_OBJECT_H_
+#define _JS_OBJECT_H_
+
+class CJS_Object;
+class CJS_Timer;
+class CJS_Context;
+
+class CJS_EmbedObj : public CFX_Object
+{
+public:
+ CJS_EmbedObj(CJS_Object* pJSObject);
+ virtual ~CJS_EmbedObj();
+
+ virtual void TimerProc(CJS_Timer* pTimer){};
+
+ CJS_Timer* BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);
+ void EndTimer(CJS_Timer* pTimer);
+
+ CJS_Object* GetJSObject(){return m_pJSObject;};
+ operator CJS_Object* (){return m_pJSObject;};
+
+ CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc);
+ int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);
+ void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);
+ FX_BOOL IsSafeMode(IFXJS_Context* cc);
+
+protected:
+
+ CJS_Object* m_pJSObject;
+};
+
+class CJS_Object : public CFX_Object
+{
+public:
+ CJS_Object(JSFXObject pObject);
+ virtual ~CJS_Object(void);
+
+ void MakeWeak();
+
+ virtual FX_BOOL IsType(FX_LPCSTR sClassName){return TRUE;};
+ virtual CFX_ByteString GetClassName(){return "";};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc){return TRUE;};
+ virtual FX_BOOL ExitInstance(){return TRUE;};
+
+ operator JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}
+ operator CJS_EmbedObj* (){return m_pEmbedObj;};
+
+ void SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};
+ CJS_EmbedObj * GetEmbedObject(){return m_pEmbedObj;};
+
+ static CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc);
+ static int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);
+ static void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);
+
+ v8::Isolate* GetIsolate() {return m_pIsolate;}
+protected:
+ CJS_EmbedObj * m_pEmbedObj;
+ v8::Persistent<v8::Object> m_pObject;
+ v8::Isolate* m_pIsolate;
+};
+
+struct JS_TIMER_MAP
+{
+ FX_UINT nID;
+ CJS_Timer * pTimer;
+};
+
+typedef CFX_ArrayTemplate<JS_TIMER_MAP*> CTimerMapArray;
+
+struct JS_TIMER_MAPARRAY
+{
+public:
+ JS_TIMER_MAPARRAY()
+ {
+ }
+
+ ~JS_TIMER_MAPARRAY()
+ {
+ Reset();
+ }
+
+ void Reset()
+ {
+ for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+ delete m_Array.GetAt(i);
+
+ m_Array.RemoveAll();
+ }
+
+ void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ pMap->pTimer = pTimer;
+ }
+ else
+ {
+ if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)
+ {
+ pMap->nID = nIndex;
+ pMap->pTimer = pTimer;
+ m_Array.Add(pMap);
+ }
+ }
+ }
+
+ CJS_Timer * GetAt(FX_UINT nIndex)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ return pMap->pTimer;
+ }
+ return NULL;
+ }
+
+ void RemoveAt(FX_UINT nIndex)
+ {
+ int i = Find(nIndex);
+
+ if (i>=0)
+ {
+ delete m_Array.GetAt(i);
+ m_Array.RemoveAt(i);
+ }
+ //To prevent potential fake memory leak reported by vc6.
+ if(m_Array.GetSize() == 0)
+ m_Array.RemoveAll();
+ }
+
+ int Find(FX_UINT nIndex)
+ {
+ for (int i=0,sz=m_Array.GetSize(); i<sz; i++)
+ {
+ if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
+ {
+ if (pMap->nID == nIndex)
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ CTimerMapArray m_Array;
+};
+
+static JS_TIMER_MAPARRAY m_sTimeMap;
+
+class CJS_Runtime;
+
+class CJS_Timer
+{
+public:
+ CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj),
+ m_nTimerID(0),
+ m_bProcessing(FALSE),
+ m_dwStartTime(0),
+ m_dwTimeOut(0),
+ m_dwElapse(0),
+ m_pRuntime(NULL),
+ m_nType(0),
+ m_pApp(pApp)
+ {
+ }
+
+ virtual ~CJS_Timer()
+ {
+ KillJSTimer();
+ }
+
+public:
+ FX_UINT SetJSTimer(FX_UINT nElapse)
+ {
+ if (m_nTimerID)KillJSTimer();
+ IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+ m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);
+ m_sTimeMap.SetAt(m_nTimerID,this);
+ m_dwElapse = nElapse;
+ return m_nTimerID;
+ };
+
+ void KillJSTimer()
+ {
+ if (m_nTimerID)
+ {
+ IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+ pHandler->KillTimer(m_nTimerID);
+ m_sTimeMap.RemoveAt(m_nTimerID);
+ m_nTimerID = 0;
+ }
+ };
+
+ void SetType(int nType)
+ {
+ m_nType = nType;
+ }
+
+ int GetType() const
+ {
+ return m_nType;
+ }
+
+ void SetStartTime(FX_DWORD dwStartTime)
+ {
+ m_dwStartTime = dwStartTime;
+ }
+
+ FX_DWORD GetStartTime() const
+ {
+ return m_dwStartTime;
+ }
+
+ void SetTimeOut(FX_DWORD dwTimeOut)
+ {
+ m_dwTimeOut = dwTimeOut;
+ }
+
+ FX_DWORD GetTimeOut() const
+ {
+ return m_dwTimeOut;
+ }
+
+ void SetRuntime(CJS_Runtime* pRuntime)
+ {
+ m_pRuntime = pRuntime;
+ }
+
+ CJS_Runtime* GetRuntime() const
+ {
+ return m_pRuntime;
+ }
+
+ void SetJScript(const CFX_WideString& script)
+ {
+ m_swJScript = script;
+ }
+
+ CFX_WideString GetJScript() const
+ {
+ return m_swJScript;
+ }
+
+ static void TimerProc(int idEvent)
+ {
+ if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))
+ {
+ if (!pTimer->m_bProcessing)
+ {
+ pTimer->m_bProcessing = TRUE;
+ if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);
+ pTimer->m_bProcessing = FALSE;
+ }
+ else
+ {
+ // TRACE(L"BUSY!\n");
+ }
+ }
+ };
+
+private:
+ FX_UINT m_nTimerID;
+ CJS_EmbedObj* m_pEmbedObj;
+ FX_BOOL m_bProcessing;
+
+ //data
+ FX_DWORD m_dwStartTime;
+ FX_DWORD m_dwTimeOut;
+ FX_DWORD m_dwElapse;
+ CJS_Runtime* m_pRuntime;
+ CFX_WideString m_swJScript;
+ int m_nType; //0:Interval; 1:TimeOut
+
+ CPDFDoc_Environment* m_pApp;
+};
+#endif //_JS_OBJECT_H_
diff --git a/fpdfsdk/include/javascript/JS_Runtime.h b/fpdfsdk/include/javascript/JS_Runtime.h
new file mode 100644
index 0000000000..32f845755f
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Runtime.h
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_RUNTIME_H_
+#define _JS_RUNTIME_H_
+
+class CJS_FieldEvent
+{
+public:
+ CFX_WideString sTargetName;
+ JS_EVENT_T eEventType;
+ CJS_FieldEvent* pNext;
+};
+
+class CJS_Runtime : public IFXJS_Runtime
+{
+public:
+ CJS_Runtime(CPDFDoc_Environment * pApp);
+ virtual ~CJS_Runtime();
+
+ virtual IFXJS_Context * NewContext();
+ virtual void ReleaseContext(IFXJS_Context * pContext);
+ virtual IFXJS_Context* GetCurrentContext();
+
+ virtual void SetReaderDocument(CPDFSDK_Document *pReaderDoc);
+ virtual CPDFSDK_Document * GetReaderDocument(){return m_pDocument;}
+
+ virtual void GetObjectNames(CFX_WideStringArray& array);
+ virtual void GetObjectConsts(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+ virtual void GetObjectProps(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+ virtual void GetObjectMethods(const CFX_WideString& swObjName, CFX_WideStringArray& array);
+
+ virtual void Exit();
+ virtual void Enter();
+ virtual FX_BOOL IsEntered();
+
+ CPDFDoc_Environment * GetReaderApp(){return m_pApp;}
+
+ FX_BOOL InitJSObjects();
+
+ FX_BOOL AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);
+ void RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType);
+ void RemoveEventsInLoop(CJS_FieldEvent* pStart);
+
+ void BeginBlock(){m_bBlocking = TRUE;}
+ void EndBlock(){m_bBlocking = FALSE;}
+ FX_BOOL IsBlocking(){return m_bBlocking;}
+
+ operator IJS_Runtime*() {return (IJS_Runtime*)m_isolate;}
+ v8::Isolate* GetIsolate(){return m_isolate;};
+ void SetIsolate(v8::Isolate* isolate){m_isolate = isolate;}
+
+ v8::Handle<v8::Context> NewJSContext();
+protected:
+ CFX_ArrayTemplate<CJS_Context *> m_ContextArray;
+ CPDFDoc_Environment * m_pApp;
+ CPDFSDK_Document * m_pDocument;
+ FX_BOOL m_bBlocking;
+ CJS_FieldEvent* m_pFieldEventPath;
+
+ v8::Isolate* m_isolate;
+ v8::Persistent<v8::Context> m_context;
+ FX_BOOL m_bRegistered;
+};
+
+#endif //_JS_RUNTIME_H_
+
diff --git a/fpdfsdk/include/javascript/JS_Value.h b/fpdfsdk/include/javascript/JS_Value.h
new file mode 100644
index 0000000000..f87f9e1d43
--- /dev/null
+++ b/fpdfsdk/include/javascript/JS_Value.h
@@ -0,0 +1,186 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JS_VALUE_H_
+#define _JS_VALUE_H_
+
+class CJS_Array;
+class CJS_Date;
+
+class CJS_Value
+{
+public:
+ CJS_Value(v8::Isolate* isolate);
+ CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
+ CJS_Value(v8::Isolate* isolate, const int &iValue);
+ CJS_Value(v8::Isolate* isolate, const double &dValue);
+ CJS_Value(v8::Isolate* isolate, const float &fValue);
+ CJS_Value(v8::Isolate* isolate, const bool &bValue);
+ CJS_Value(v8::Isolate* isolate, JSFXObject);
+ CJS_Value(v8::Isolate* isolate, CJS_Object *);
+ CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr);
+ CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr);
+ CJS_Value(v8::Isolate* isolate, CJS_Array& array);
+
+ ~CJS_Value();
+
+ void SetNull();
+ void Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t);
+ void Attach(CJS_Value *pValue);
+ void Detach();
+
+
+ operator int() const;
+ operator bool() const;
+ operator double() const;
+ operator float() const;
+ operator CJS_Object *() const;
+ //operator JSFXObject *() const;
+ operator v8::Handle<v8::Object>() const;
+ operator v8::Handle<v8::Array>() const;
+ operator CFX_WideString() const;
+ //operator FX_WCHAR *() const;
+ operator CFX_ByteString() const;
+ v8::Handle<v8::Value> ToJSValue();
+
+ void operator = (int iValue);
+ void operator = (bool bValue);
+ void operator = (double);
+ void operator = (float);
+ void operator = (CJS_Object *);
+ void operator = (v8::Handle<v8::Object>);
+// void operator = (JSObject *);
+ void operator = (CJS_Array &);
+ void operator = (CJS_Date &);
+ void operator = (FX_LPCWSTR pWstr);
+ void operator = (FX_LPCSTR pStr);
+ void operator = (CJS_Value value);
+
+ FX_BOOL IsArrayObject() const;
+ FX_BOOL IsDateObject() const;
+ FXJSVALUETYPE GetType() const;
+
+ FX_BOOL ConvertToArray(CJS_Array &) const;
+ FX_BOOL ConvertToDate(CJS_Date &) const;
+
+ v8::Isolate* GetIsolate() {return m_isolate;}
+protected:
+ v8::Handle<v8::Value> m_pValue;
+ FXJSVALUETYPE m_eType;
+ v8::Isolate* m_isolate;
+};
+
+template<class TYPE> class CJS_ParametersTmpl : public CFX_ArrayTemplate<TYPE>
+{
+public:
+ void push_back(TYPE newElement){CFX_ArrayTemplate<TYPE>::Add(newElement);}
+ int size() const{return CFX_ArrayTemplate<TYPE>::GetSize();}
+};
+typedef CJS_ParametersTmpl<CJS_Value> CJS_Parameters;
+
+class CJS_PropValue: public CJS_Value
+{
+public:
+ CJS_PropValue(const CJS_Value &);
+ CJS_PropValue(v8::Isolate* isolate);
+ ~CJS_PropValue();
+public:
+ FX_BOOL IsSetting();
+ FX_BOOL IsGetting();
+ void operator<<(int );
+ void operator>>(int &) const;
+ void operator<<(bool);
+ void operator>>(bool &) const;
+ void operator<<(double );
+ void operator>>(double &) const;
+ void operator<<(CJS_Object *pObj);
+ void operator>>(CJS_Object *&ppObj) const;
+ void operator<<(CFX_ByteString);
+ void operator>>(CFX_ByteString &) const;
+ void operator<<(CFX_WideString);
+ void operator>>(CFX_WideString &) const;
+ void operator<<(FX_LPCWSTR c_string);
+
+ void operator<<(JSFXObject);
+ void operator>>(JSFXObject &) const;
+
+ void operator>>(CJS_Array &array) const;
+ void operator<<(CJS_Array &array);
+
+ void operator<<(CJS_Date &date);
+ void operator>>(CJS_Date &date) const;
+
+ operator v8::Handle<v8::Value>() const;
+
+ void StartSetting();
+ void StartGetting();
+private:
+ FX_BOOL m_bIsSetting;
+};
+
+class CJS_Array
+{
+public:
+ CJS_Array(v8::Isolate* isolate);
+ virtual ~CJS_Array();
+
+ void Attach(v8::Handle<v8::Array> pArray);
+ void GetElement(unsigned index,CJS_Value &value);
+ void SetElement(unsigned index,CJS_Value value);
+ int GetLength();
+ FX_BOOL IsAttached();
+ operator v8::Handle<v8::Array>();
+
+ v8::Isolate* GetIsolate() {return m_isolate;}
+private:
+ v8::Handle<v8::Array> m_pArray;
+ v8::Isolate* m_isolate;
+};
+
+class CJS_Date
+{
+friend class CJS_Value;
+public:
+ CJS_Date(v8::Isolate* isolate);
+ CJS_Date(v8::Isolate* isolate,double dMsec_time);
+ CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec);
+ virtual ~CJS_Date();
+ void Attach(v8::Handle<v8::Value> pDate);
+
+ int GetYear();
+ void SetYear(int iYear);
+
+ int GetMonth();
+ void SetMonth(int iMonth);
+
+ int GetDay();
+ void SetDay(int iDay);
+
+ int GetHours();
+ void SetHours(int iHours);
+
+ int GetMinutes();
+ void SetMinutes(int minutes);
+
+ int GetSeconds();
+ void SetSeconds(int seconds);
+
+ operator v8::Handle<v8::Value>();
+ operator double() const;
+
+ CFX_WideString ToString() const;
+
+ static double MakeDate(int year, int mon, int mday,int hour, int min, int sec,int ms);
+
+ FX_BOOL IsValidDate();
+
+protected:
+ v8::Handle<v8::Value> m_pDate;
+ v8::Isolate* m_isolate;
+};
+
+#endif //_JS_VALUE_H_
+
diff --git a/fpdfsdk/include/javascript/JavaScript.h b/fpdfsdk/include/javascript/JavaScript.h
new file mode 100644
index 0000000000..d1375cc2f4
--- /dev/null
+++ b/fpdfsdk/include/javascript/JavaScript.h
@@ -0,0 +1,39 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _JAVASCRIPT_H_
+#define _JAVASCRIPT_H_
+
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+ #include "../../../core/include/fdrm/fx_crypt.h"
+ #include "../../../core/include/fpdfapi/fpdf_pageobj.h"
+ #include "../../../core/include/fpdfapi/fpdf_serial.h"
+
+
+ #include "../../include/fx_systemhandler.h"
+#endif
+
+
+#include "../jsapi/fxjs_v8.h"
+#include "../fxedit/fx_edit.h"
+#include "../pdfwindow/IPDFWindow.h"
+#include "../fsdk_mgr.h"
+
+
+#include <string>
+//#pragma warning( disable : 4786)
+#include <vector>
+
+
+#endif //_JAVASCRIPT_H_
+
diff --git a/fpdfsdk/include/javascript/PublicMethods.h b/fpdfsdk/include/javascript/PublicMethods.h
new file mode 100644
index 0000000000..a485a9a31a
--- /dev/null
+++ b/fpdfsdk/include/javascript/PublicMethods.h
@@ -0,0 +1,101 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PUBLICMETHODS_H_
+#define _PUBLICMETHODS_H_
+
+class CJS_PublicMethods : public CJS_Object
+{
+public:
+ CJS_PublicMethods(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_PublicMethods(void){};
+
+public:
+ static FX_BOOL AFNumber_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFNumber_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFPercent_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFPercent_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_FormatEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_KeystrokeEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFDate_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_FormatEx(OBJ_METHOD_PARAMS); //
+ static FX_BOOL AFTime_KeystrokeEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFTime_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_Format(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_Keystroke(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS);//
+ static FX_BOOL AFSimple(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFMakeNumber(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFSimple_Calculate(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFRange_Validate(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFMergeChange(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFParseDateEx(OBJ_METHOD_PARAMS);
+ static FX_BOOL AFExtractNums(OBJ_METHOD_PARAMS);
+
+public:
+ JS_STATIC_GLOBAL_FUN(AFNumber_Format);
+ JS_STATIC_GLOBAL_FUN(AFNumber_Keystroke);
+ JS_STATIC_GLOBAL_FUN(AFPercent_Format);
+ JS_STATIC_GLOBAL_FUN(AFPercent_Keystroke);
+ JS_STATIC_GLOBAL_FUN(AFDate_FormatEx);
+ JS_STATIC_GLOBAL_FUN(AFDate_KeystrokeEx);
+ JS_STATIC_GLOBAL_FUN(AFDate_Format);
+ JS_STATIC_GLOBAL_FUN(AFDate_Keystroke);
+ JS_STATIC_GLOBAL_FUN(AFTime_FormatEx);
+ JS_STATIC_GLOBAL_FUN(AFTime_KeystrokeEx);
+ JS_STATIC_GLOBAL_FUN(AFTime_Format);
+ JS_STATIC_GLOBAL_FUN(AFTime_Keystroke);
+ JS_STATIC_GLOBAL_FUN(AFSpecial_Format);
+ JS_STATIC_GLOBAL_FUN(AFSpecial_Keystroke);
+ JS_STATIC_GLOBAL_FUN(AFSpecial_KeystrokeEx);
+ JS_STATIC_GLOBAL_FUN(AFSimple);
+ JS_STATIC_GLOBAL_FUN(AFMakeNumber);
+ JS_STATIC_GLOBAL_FUN(AFSimple_Calculate);
+ JS_STATIC_GLOBAL_FUN(AFRange_Validate);
+ JS_STATIC_GLOBAL_FUN(AFMergeChange);
+ JS_STATIC_GLOBAL_FUN(AFParseDateEx);
+ JS_STATIC_GLOBAL_FUN(AFExtractNums);
+
+ JS_STATIC_DECLARE_GLOBAL_FUN();
+
+public:
+ static int ParseStringInteger(const CFX_WideString & string,int nStart,int & nSkip, int nMaxStep);
+ static CFX_WideString ParseStringString(const CFX_WideString& string, int nStart, int& nSkip);
+ static double MakeRegularDate(const CFX_WideString & value,const CFX_WideString & format, FX_BOOL& bWrongFormat);
+ static CFX_WideString MakeFormatDate(double dDate,const CFX_WideString & format);
+ static FX_BOOL ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot);
+ static double ParseStringToNumber(FX_LPCWSTR swSource);
+ static double ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat);
+ static double MakeInterDate(CFX_WideString strValue);
+ static double ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS);
+
+public:
+ static CFX_WideString StrLTrim(FX_LPCWSTR pStr);
+ static CFX_WideString StrRTrim(FX_LPCWSTR pStr);
+ static CFX_WideString StrTrim(FX_LPCWSTR pStr);
+
+ static CFX_ByteString StrLTrim(FX_LPCSTR pStr);
+ static CFX_ByteString StrRTrim(FX_LPCSTR pStr);
+ static CFX_ByteString StrTrim(FX_LPCSTR pStr);
+
+ static FX_BOOL IsNumber(FX_LPCSTR string);
+ static FX_BOOL IsNumber(FX_LPCWSTR string);
+
+ static FX_BOOL IsDigit(char ch);
+ static FX_BOOL IsDigit(wchar_t ch);
+ static FX_BOOL IsAlphabetic(wchar_t ch);
+ static FX_BOOL IsAlphaNumeric(wchar_t ch);
+
+ static FX_BOOL maskSatisfied(wchar_t c_Change,wchar_t c_Mask);
+ static FX_BOOL isReservedMaskChar(wchar_t ch);
+
+ static double AF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2);
+ static CJS_Array AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val);
+};
+
+#endif //_PUBLICMETHODS_H_
diff --git a/fpdfsdk/include/javascript/app.h b/fpdfsdk/include/javascript/app.h
new file mode 100644
index 0000000000..35ee401058
--- /dev/null
+++ b/fpdfsdk/include/javascript/app.h
@@ -0,0 +1,225 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _APP_H_
+#define _APP_H_
+
+class CJS_Runtime;
+
+/* ---------------------------- TimerObj ---------------------------- */
+
+class CJS_Timer;
+
+class TimerObj : public CJS_EmbedObj
+{
+public:
+ TimerObj(CJS_Object* pJSObject);
+ virtual ~TimerObj();
+
+public:
+ void SetTimer(CJS_Timer* pTimer);
+ CJS_Timer* GetTimer() const;
+
+private:
+ CJS_Timer* m_pTimer;
+};
+
+class CJS_TimerObj : public CJS_Object
+{
+public:
+ CJS_TimerObj(JSFXObject pObject) : CJS_Object(pObject) {}
+ virtual ~CJS_TimerObj(){}
+
+ DECLARE_JS_CLASS(CJS_TimerObj);
+};
+
+
+// struct APP_MENUITEM_ARRAY;
+//
+// struct APP_MENUITEM
+// {
+// APP_MENUITEM() : oSubMenu(NULL), cName(L""), cReturn(L""), bMarked(false), bEnabled(true)
+// {
+// }
+// CFX_WideString cName;
+// CFX_WideString cReturn;
+// APP_MENUITEM_ARRAY* oSubMenu;
+// bool bMarked;
+// bool bEnabled;
+// };
+
+// struct APP_MENUITEM_ARRAY
+// {
+// APP_MENUITEM_ARRAY() : m_hMenu(NULL), pContents(NULL), nSize(0)
+// {
+//
+// }
+// APP_MENUITEM * pContents;
+// HMENU m_hMenu;
+// int nSize;
+// };
+
+// struct APP_MENU;
+// struct APP_MENU_ARRAY
+// {
+// APP_MENU_ARRAY():
+// pContent(NULL)
+// {
+// }
+//
+// APP_MENU* pContent;
+// };
+
+// struct APP_MENU
+// {
+// APP_MENU():bSubMenu(false),
+// SubMenuItems(NULL),
+// cwMenuItemName(L""),
+// hMenu(NULL),
+// iSize(0)
+// {
+//
+// }
+//
+// APP_MENU(CFX_WideString &cwName):
+// cwMenuItemName(cwName),
+// bSubMenu(false),
+// SubMenuItems(NULL),
+// hMenu(NULL),
+// iSize(0)
+// {
+//
+// }
+//
+// CFX_WideString cwMenuItemName;
+// bool bSubMenu;
+// APP_MENU_ARRAY* SubMenuItems;
+// int iSize;
+// HMENU hMenu;
+// };
+
+class app : public CJS_EmbedObj
+{
+public:
+ app(CJS_Object * pJSObject);
+ virtual ~app();
+
+public:
+ FX_BOOL activeDocs(OBJ_PROP_PARAMS);
+ FX_BOOL calculate(OBJ_PROP_PARAMS);
+ FX_BOOL formsVersion(OBJ_PROP_PARAMS);
+ FX_BOOL fs(OBJ_PROP_PARAMS);
+ FX_BOOL fullscreen(OBJ_PROP_PARAMS);
+ FX_BOOL language(OBJ_PROP_PARAMS);
+ FX_BOOL media(OBJ_PROP_PARAMS);
+ FX_BOOL platform(OBJ_PROP_PARAMS);
+ FX_BOOL runtimeHighlight(OBJ_PROP_PARAMS);
+ FX_BOOL viewerType(OBJ_PROP_PARAMS);
+ FX_BOOL viewerVariation(OBJ_PROP_PARAMS);
+ FX_BOOL viewerVersion(OBJ_PROP_PARAMS);
+
+
+ FX_BOOL alert(OBJ_METHOD_PARAMS);
+ FX_BOOL beep(OBJ_METHOD_PARAMS);
+ FX_BOOL browseForDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL clearInterval(OBJ_METHOD_PARAMS);
+ FX_BOOL clearTimeOut(OBJ_METHOD_PARAMS);
+ FX_BOOL execDialog(OBJ_METHOD_PARAMS);
+ FX_BOOL execMenuItem(OBJ_METHOD_PARAMS);
+ FX_BOOL findComponent(OBJ_METHOD_PARAMS);
+ FX_BOOL goBack(OBJ_METHOD_PARAMS);
+ FX_BOOL goForward(OBJ_METHOD_PARAMS);
+ FX_BOOL launchURL(OBJ_METHOD_PARAMS);
+ FX_BOOL mailMsg(OBJ_METHOD_PARAMS);
+ FX_BOOL newFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL newDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL openDoc(OBJ_METHOD_PARAMS);
+ FX_BOOL openFDF(OBJ_METHOD_PARAMS);
+ FX_BOOL popUpMenuEx(OBJ_METHOD_PARAMS);
+ FX_BOOL popUpMenu(OBJ_METHOD_PARAMS);
+ FX_BOOL response(OBJ_METHOD_PARAMS);
+ FX_BOOL setInterval(OBJ_METHOD_PARAMS);
+ FX_BOOL setTimeOut(OBJ_METHOD_PARAMS);
+
+private:
+// FX_DWORD AppGetTickCount();
+ void TimerProc(CJS_Timer* pTimer);
+ void RunJsScript(CJS_Runtime * pRuntime,const CFX_WideString & wsScript);
+// void ParsePopupMenuObj(APP_MENUITEM * ppMenuItem,JSObject * pObj);
+// void DeleteMenuItems(APP_MENUITEM_ARRAY * pMenuItems);
+// void AddMenuItem(APP_MENUITEM_ARRAY * pMenuItems, HMENU hMenu, MENUITEMINFO MenuItemInfo);
+// void InitMenuItemInfo(MENUITEMINFO& MenuItemInfo);
+// void DestroyPopUpMenu();
+
+// void ParserMenuItem(APP_MENU* pHead, const CJS_Parameters&params);
+// void AddItemToMenu(APP_MENU* pHead, HMENU hMenu, MENUITEMINFO MenuItemInfo);
+// void DestroyMenuItems(APP_MENU* pHead);
+
+public:
+ static CFX_WideString SysPathToPDFPath(const CFX_WideString& sOldPath);
+ static CFX_WideString PDFPathToSysPath(const CFX_WideString& sOldPath);
+ static CFX_WideString RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath);
+
+
+private:
+
+ bool m_bCalculate;
+ CJS_Runtime* m_pRuntime;
+ bool m_bRuntimeHighLight;
+
+ CFX_ArrayTemplate<CJS_Timer*> m_aTimer;
+// APP_MENU* m_pMenuHead;
+
+public:
+// static CReader_App* s_App;
+};
+
+class CJS_App : public CJS_Object
+{
+public:
+ CJS_App(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_App(void){};
+
+ DECLARE_JS_CLASS(CJS_App);
+
+ JS_STATIC_PROP(activeDocs, app);
+ JS_STATIC_PROP(calculate, app);
+ JS_STATIC_PROP(formsVersion, app);
+ JS_STATIC_PROP(fs, app);
+ JS_STATIC_PROP(fullscreen, app);
+ JS_STATIC_PROP(language, app);
+ JS_STATIC_PROP(media, app);
+ JS_STATIC_PROP(platform, app);
+ JS_STATIC_PROP(runtimeHighlight, app);
+ JS_STATIC_PROP(viewerType, app);
+ JS_STATIC_PROP(viewerVariation, app);
+ JS_STATIC_PROP(viewerVersion, app);
+
+ JS_STATIC_METHOD(alert, app);
+ JS_STATIC_METHOD(beep, app);
+ JS_STATIC_METHOD(browseForDoc, app);
+ JS_STATIC_METHOD(clearInterval, app);
+ JS_STATIC_METHOD(clearTimeOut, app);
+ JS_STATIC_METHOD(execDialog, app);
+ JS_STATIC_METHOD(execMenuItem, app);
+ JS_STATIC_METHOD(findComponent, app);
+ JS_STATIC_METHOD(goBack, app);
+ JS_STATIC_METHOD(goForward, app);
+ JS_STATIC_METHOD(launchURL, app);
+ JS_STATIC_METHOD(mailMsg, app);
+ JS_STATIC_METHOD(newFDF, app);
+ JS_STATIC_METHOD(newDoc, app);
+ JS_STATIC_METHOD(openDoc, app);
+ JS_STATIC_METHOD(openFDF, app);
+ JS_STATIC_METHOD(popUpMenuEx, app);
+ JS_STATIC_METHOD(popUpMenu, app);
+ JS_STATIC_METHOD(response, app);
+ JS_STATIC_METHOD(setInterval, app);
+ JS_STATIC_METHOD(setTimeOut, app);
+
+};
+
+#endif //_APP_H_
diff --git a/fpdfsdk/include/javascript/color.h b/fpdfsdk/include/javascript/color.h
new file mode 100644
index 0000000000..1910e16955
--- /dev/null
+++ b/fpdfsdk/include/javascript/color.h
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _COLOR_H_
+#define _COLOR_H_
+
+class color : public CJS_EmbedObj
+{
+public:
+ color(CJS_Object* pJSObject);
+ virtual ~color(void);
+
+ FX_BOOL black(OBJ_PROP_PARAMS);
+ FX_BOOL blue(OBJ_PROP_PARAMS);
+ FX_BOOL cyan(OBJ_PROP_PARAMS);
+ FX_BOOL dkGray(OBJ_PROP_PARAMS);
+ FX_BOOL gray(OBJ_PROP_PARAMS);
+ FX_BOOL green(OBJ_PROP_PARAMS);
+ FX_BOOL ltGray(OBJ_PROP_PARAMS);
+ FX_BOOL magenta(OBJ_PROP_PARAMS);
+ FX_BOOL red(OBJ_PROP_PARAMS);
+ FX_BOOL transparent(OBJ_PROP_PARAMS);
+ FX_BOOL white(OBJ_PROP_PARAMS);
+ FX_BOOL yellow(OBJ_PROP_PARAMS);
+
+ FX_BOOL convert(OBJ_METHOD_PARAMS);
+ FX_BOOL equal(OBJ_METHOD_PARAMS);
+
+public:
+ static void ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array);
+ static void ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color);
+
+private:
+ CPWL_Color m_crTransparent;
+ CPWL_Color m_crBlack;
+ CPWL_Color m_crWhite;
+ CPWL_Color m_crRed;
+ CPWL_Color m_crGreen;
+ CPWL_Color m_crBlue;
+ CPWL_Color m_crCyan;
+ CPWL_Color m_crMagenta;
+ CPWL_Color m_crYellow;
+ CPWL_Color m_crDKGray;
+ CPWL_Color m_crGray;
+ CPWL_Color m_crLTGray;
+};
+
+class CJS_Color : public CJS_Object
+{
+public:
+ CJS_Color(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Color(void){};
+
+ DECLARE_JS_CLASS(CJS_Color);
+
+ JS_STATIC_PROP(black, color);
+ JS_STATIC_PROP(blue, color);
+ JS_STATIC_PROP(cyan, color);
+ JS_STATIC_PROP(dkGray, color);
+ JS_STATIC_PROP(gray, color);
+ JS_STATIC_PROP(green, color);
+ JS_STATIC_PROP(ltGray, color);
+ JS_STATIC_PROP(magenta, color);
+ JS_STATIC_PROP(red, color);
+ JS_STATIC_PROP(transparent, color);
+ JS_STATIC_PROP(white, color);
+ JS_STATIC_PROP(yellow, color);
+
+ JS_STATIC_METHOD(convert,color);
+ JS_STATIC_METHOD(equal,color);
+
+};
+
+#endif //_COLOR_H_
+
diff --git a/fpdfsdk/include/javascript/console.h b/fpdfsdk/include/javascript/console.h
new file mode 100644
index 0000000000..98a329367e
--- /dev/null
+++ b/fpdfsdk/include/javascript/console.h
@@ -0,0 +1,38 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _CONSOLE_H_
+#define _CONSOLE_H_
+
+class console : public CJS_EmbedObj
+{
+public:
+ console(CJS_Object* pJSObject);
+ virtual ~console(void);
+
+public:
+ FX_BOOL clear(OBJ_METHOD_PARAMS);
+ FX_BOOL hide(OBJ_METHOD_PARAMS);
+ FX_BOOL println(OBJ_METHOD_PARAMS);
+ FX_BOOL show(OBJ_METHOD_PARAMS);
+};
+
+class CJS_Console : public CJS_Object
+{
+public:
+ CJS_Console(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Console(void){};
+
+ DECLARE_JS_CLASS(CJS_Console);
+
+ JS_STATIC_METHOD(clear, console);
+ JS_STATIC_METHOD(hide, console);
+ JS_STATIC_METHOD(println, console);
+ JS_STATIC_METHOD(show, console);
+};
+
+#endif //_CONSOLE_H_
+
diff --git a/fpdfsdk/include/javascript/event.h b/fpdfsdk/include/javascript/event.h
new file mode 100644
index 0000000000..91f2c65a21
--- /dev/null
+++ b/fpdfsdk/include/javascript/event.h
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _EVENT_H_
+#define _EVENT_H_
+
+class event : public CJS_EmbedObj
+{
+public:
+ event(CJS_Object * pJSObject);
+ virtual ~event(void);
+
+public:
+ FX_BOOL change(OBJ_PROP_PARAMS);
+ FX_BOOL changeEx(OBJ_PROP_PARAMS);
+ FX_BOOL commitKey(OBJ_PROP_PARAMS);
+ FX_BOOL fieldFull(OBJ_PROP_PARAMS);
+ FX_BOOL keyDown(OBJ_PROP_PARAMS);
+ FX_BOOL modifier(OBJ_PROP_PARAMS);
+ FX_BOOL name(OBJ_PROP_PARAMS);
+ FX_BOOL rc(OBJ_PROP_PARAMS);
+ FX_BOOL richChange(OBJ_PROP_PARAMS);
+ FX_BOOL richChangeEx(OBJ_PROP_PARAMS);
+ FX_BOOL richValue(OBJ_PROP_PARAMS);
+ FX_BOOL selEnd(OBJ_PROP_PARAMS);
+ FX_BOOL selStart(OBJ_PROP_PARAMS);
+ FX_BOOL shift(OBJ_PROP_PARAMS);
+ FX_BOOL source(OBJ_PROP_PARAMS);
+ FX_BOOL target(OBJ_PROP_PARAMS);
+ FX_BOOL targetName(OBJ_PROP_PARAMS);
+ FX_BOOL type(OBJ_PROP_PARAMS);
+ FX_BOOL value(OBJ_PROP_PARAMS);
+ FX_BOOL willCommit(OBJ_PROP_PARAMS);
+
+};
+
+class CJS_Event : public CJS_Object
+{
+public:
+ CJS_Event(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Event(void){};
+
+ DECLARE_JS_CLASS(CJS_Event);
+
+ JS_STATIC_PROP(change, event);
+ JS_STATIC_PROP(changeEx, event);
+ JS_STATIC_PROP(commitKey, event);
+ JS_STATIC_PROP(fieldFull, event);
+ JS_STATIC_PROP(keyDown, event);
+ JS_STATIC_PROP(modifier, event);
+ JS_STATIC_PROP(name, event);
+ JS_STATIC_PROP(rc, event);
+ JS_STATIC_PROP(richChange, event);
+ JS_STATIC_PROP(richChangeEx, event);
+ JS_STATIC_PROP(richValue, event);
+ JS_STATIC_PROP(selEnd, event);
+ JS_STATIC_PROP(selStart, event);
+ JS_STATIC_PROP(shift, event);
+ JS_STATIC_PROP(source, event);
+ JS_STATIC_PROP(target, event);
+ JS_STATIC_PROP(targetName, event);
+ JS_STATIC_PROP(type, event);
+ JS_STATIC_PROP(value, event);
+ JS_STATIC_PROP(willCommit, event);
+};
+
+#endif //_EVENT_H_
diff --git a/fpdfsdk/include/javascript/global.h b/fpdfsdk/include/javascript/global.h
new file mode 100644
index 0000000000..7effd574a0
--- /dev/null
+++ b/fpdfsdk/include/javascript/global.h
@@ -0,0 +1,85 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _GLOBAL_H_
+#define _GLOBAL_H_
+
+class CJS_GlobalData;
+
+struct js_global_data
+{
+ js_global_data()
+ {
+ nType = 0;
+ dData = 0;
+ bData = FALSE;
+ sData = "";
+ bPersistent = FALSE;
+ bDeleted = FALSE;
+ }
+
+ ~js_global_data()
+ {
+ pData.Reset();
+ }
+ int nType; //0:int 1:bool 2:string 3:obj
+ double dData;
+ bool bData;
+ CFX_ByteString sData;
+ v8::Persistent<v8::Object> pData;
+ bool bPersistent;
+ bool bDeleted;
+};
+
+class global_alternate : public CJS_EmbedObj
+{
+public:
+ global_alternate(CJS_Object* pJSObject);
+ virtual ~global_alternate();
+
+public:
+ FX_BOOL setPersistent(OBJ_METHOD_PARAMS);
+
+public:
+ FX_BOOL QueryProperty(FX_LPCWSTR propname);
+ FX_BOOL DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue & vp, JS_ErrorString & sError);
+ FX_BOOL DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString & sError);
+
+ void Initial(CPDFDoc_Environment* pApp);
+
+private:
+ void UpdateGlobalPersistentVariables();
+ void CommitGlobalPersisitentVariables();
+ void DestroyGlobalPersisitentVariables();
+ FX_BOOL SetGlobalVariables(FX_LPCSTR propname, int nType,
+ double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent);
+
+ void ObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array);
+ void PutObjectProperty(v8::Handle<v8::Object> obj, CJS_KeyValue* pData);
+
+private:
+ CFX_MapByteStringToPtr m_mapGlobal;
+ CFX_WideString m_sFilePath;
+ CJS_GlobalData* m_pGlobalData;
+ CPDFDoc_Environment* m_pApp;
+};
+
+
+class CJS_Global : public CJS_Object
+{
+public:
+ CJS_Global(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Global(void){};
+
+ virtual FX_BOOL InitInstance(IFXJS_Context* cc);
+
+ DECLARE_SPECIAL_JS_CLASS(CJS_Global);
+
+ JS_SPECIAL_STATIC_METHOD(setPersistent, global_alternate, global);
+
+};
+
+#endif //_GLOBAL_H_
diff --git a/fpdfsdk/include/javascript/report.h b/fpdfsdk/include/javascript/report.h
new file mode 100644
index 0000000000..8a4084dac1
--- /dev/null
+++ b/fpdfsdk/include/javascript/report.h
@@ -0,0 +1,35 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _REPORT_H_
+#define _REPORT_H_
+
+class Report : public CJS_EmbedObj
+{
+public:
+ Report(CJS_Object * pJSObject);
+ virtual ~Report();
+
+public:
+ FX_BOOL save(OBJ_METHOD_PARAMS);
+ FX_BOOL writeText(OBJ_METHOD_PARAMS);
+};
+
+class CJS_Report : public CJS_Object
+{
+public:
+ CJS_Report(JSFXObject pObject) : CJS_Object(pObject){};
+ virtual ~CJS_Report(){};
+
+public:
+ DECLARE_JS_CLASS(CJS_Report);
+
+ JS_STATIC_METHOD(save, Report)
+ JS_STATIC_METHOD(writeText, Report);
+};
+
+#endif //_REPORT_H_
+
diff --git a/fpdfsdk/include/javascript/resource.h b/fpdfsdk/include/javascript/resource.h
new file mode 100644
index 0000000000..0b7668e908
--- /dev/null
+++ b/fpdfsdk/include/javascript/resource.h
@@ -0,0 +1,110 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#define IDD_JS_MSGBOX 25600
+#define IDD_RESPONSE 25601
+#define IDC_JS_MSG_TEXT 25602
+#define ID_JS_MSG_OK 25603
+#define ID_JS_MSG_CANCEL 25604
+#define IDC_JS_MSG_ICON 25605
+#define ID_JS_MSG_YES 25606
+#define ID_JS_MSG_NO 25607
+#define IDC_JS_QUESTION 25608
+#define ID_JS_OK 25609
+#define ID_JS_CANCEL 25610
+#define IDC_JS_ANSWER 25611
+#define IDC_JS_EDIT 25612
+#define IDS_STRING_JSALERT 25613
+#define IDS_STRING_JSPARAMERROR 25614
+#define IDS_STRING_JSAFNUMBER_KEYSTROKE 25615
+#define IDS_STRING_JSINPUTERROR 25616
+#define IDS_STRING_JSPARAM_TOOLONG 25617
+#define IDS_STRING_JSPARSEDATE 25618
+#define IDS_STRING_JSRANGE1 25619
+#define IDS_STRING_JSRANGE2 25620
+#define IDS_STRING_JSRANGE3 25621
+#define IDS_STRING_JSRANGE4 25622
+#define IDS_STRING_FILEOPENFAIL 25623
+#define IDS_STRING_JSATTENTION 25624
+#define IDS_STRING_JSSUBMITS 25625
+#define IDS_STRING_JSSUBMITF 25626
+#define IDS_STRING_NOTSUPPORT 25627
+#define IDS_STRING_JSBUSY 25628
+#define IDS_STRING_JSEVENT 25629
+#define IDS_STRING_RUN 25630
+#define IDS_STRING_UNHANDLED 25631
+#define IDS_STRING_JSPRINT1 25632
+#define IDS_STRING_JSPRINT2 25633
+#define IDS_STRING_LAUNCHURL 25634
+#define IDS_JSPARAM_INCORRECT 25635
+#define IDD_JS_CONSOLE 25636
+#define IDS_STRING_SAFEMODEL 25636
+#define IDC_EDTSCRIPT 25637
+#define IDC_BTNCLEAR 25638
+#define IDC_EDTOUTPUT 25639
+#define IDC_CHECK_TIPS 25640
+#define IDC_BTNRUN 25641
+
+
+
+static CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT ID)
+{
+ switch(ID)
+ {
+ case IDS_STRING_JSALERT:
+ return L"Alert";
+ case IDS_STRING_JSPARAMERROR:
+ return L"The amount of parameters is not correct !";
+ case IDS_STRING_JSAFNUMBER_KEYSTROKE:
+ return L"The input value is invalid.";
+ case IDS_STRING_JSINPUTERROR:
+ return L"Input error !";
+ case IDS_STRING_JSPARAM_TOOLONG:
+ return L"The value you are going to input is too long.";
+ case IDS_STRING_JSPARSEDATE:
+ return L"The input string can't be parsed to a valid date time (%s).";
+ case IDS_STRING_JSRANGE1:
+ return L"Invalid value: must be greater or equal to %s and less than or equal to %s.";
+ case IDS_STRING_JSRANGE2:
+ return L"Invalid value: must be greater or equal to %s.";
+ case IDS_STRING_JSRANGE3:
+ return L"Invalid value: must be less than or equal to %s.";
+ case IDS_STRING_JSRANGE4:
+ return L"Range Error";
+ case IDS_STRING_FILEOPENFAIL:
+ return L"Opening file failed.";
+ case IDS_STRING_JSATTENTION:
+ return L"Attention";
+ case IDS_STRING_JSSUBMITS:
+ return L"Submit form successfully!";
+ case IDS_STRING_JSSUBMITF:
+ return L"Submit form failed!";
+ case IDS_STRING_NOTSUPPORT:
+ return L"Not supported.";
+ case IDS_STRING_JSBUSY:
+ return L"System is busy!";
+ case IDS_STRING_JSEVENT:
+ return L"The event of the formfield exists!";
+ case IDS_STRING_RUN:
+ return L"It runs successfully.";
+ case IDS_STRING_UNHANDLED:
+ return L"An unhandled error!";
+ case IDS_STRING_JSPRINT1:
+ return L"The second parameter can't convert to Date!";
+ case IDS_STRING_JSPRINT2:
+ return L"The second parameter isn't a valid Date!";
+ case IDS_STRING_LAUNCHURL:
+ return L"The Document is trying to connect to \r\n%s\r\nIf you trust the site, choose OK. If you don't trust the site, choose Cancel.";
+ case IDS_JSPARAM_INCORRECT:
+ return L"The parameter you inputted is incorrect!";
+ case IDS_STRING_SAFEMODEL:
+ return L"Secure reading mode";
+ default:
+ return L"";
+
+ }
+}
+
diff --git a/fpdfsdk/include/javascript/util.h b/fpdfsdk/include/javascript/util.h
new file mode 100644
index 0000000000..9f4efc3525
--- /dev/null
+++ b/fpdfsdk/include/javascript/util.h
@@ -0,0 +1,45 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _UTIL_H_
+#define _UTIL_H_
+
+class util : public CJS_EmbedObj
+{
+public:
+ util(CJS_Object * pJSObject);
+ virtual ~util(void);
+
+public:
+ FX_BOOL printd(OBJ_METHOD_PARAMS);
+ FX_BOOL printf(OBJ_METHOD_PARAMS);
+ FX_BOOL printx(OBJ_METHOD_PARAMS);
+ FX_BOOL scand(OBJ_METHOD_PARAMS);
+ FX_BOOL byteToChar(OBJ_METHOD_PARAMS);
+
+public:
+ static void printd(const std::wstring &cFormat,CJS_Date Date,bool bXFAPicture, std::wstring &cPurpose);
+ static void printx(const std::string &cFormat,const std::string &cSource, std::string &cPurpose);
+ static int ParstDataType(std::wstring* sFormat);
+};
+
+class CJS_Util : public CJS_Object
+{
+public:
+ CJS_Util(JSFXObject pObject) : CJS_Object(pObject) {};
+ virtual ~CJS_Util(void){};
+
+ DECLARE_JS_CLASS(CJS_Util);
+
+ JS_STATIC_METHOD(printd, util);
+ JS_STATIC_METHOD(printf, util);
+ JS_STATIC_METHOD(printx, util);
+ JS_STATIC_METHOD(scand, util);
+ JS_STATIC_METHOD(byteToChar, util);
+};
+
+FX_INT64 FX_atoi64(const char *nptr);
+#endif //_UTIL_H_
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
new file mode 100644
index 0000000000..7e8e655a6e
--- /dev/null
+++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -0,0 +1,148 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXJSAPI_H
+#define FXJSAPI_H
+
+#include <v8.h>
+using namespace v8;
+
+enum FXJSOBJTYPE
+{
+ JS_DYNAMIC = 0,
+ JS_STATIC = 1,
+};
+
+enum FXJSVALUETYPE
+{
+ VT_unknown,
+ VT_string,
+ VT_number,
+ VT_boolean,
+ VT_date,
+ VT_object,
+ VT_fxobject,
+ VT_null,
+ VT_undefined
+};
+
+struct FXJSErr
+{
+ const wchar_t* message;
+ const wchar_t* srcline;
+ unsigned linnum;
+};
+
+/* --------------------------------------------- API --------------------------------------------- */
+
+typedef v8::Isolate IJS_Runtime;
+class IFXJS_Context;
+class IFXJS_Runtime;
+
+
+#ifndef JSCRIPT_ARGS
+#define JSCRIPT_ARGS
+
+#define JS_PROPGET_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Value>& info
+#define JS_PROPPUT_ARGS v8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<void>& info
+#define JS_METHOD_ARGS const v8::FunctionCallbackInfo<v8::Value>& info
+#define JS_CONSTRUCTOR_ARGS IFXJS_Context* cc, v8::Handle<v8::Object> obj, v8::Handle<v8::Object> global
+#define JS_DESTRUCTOR_ARGS v8::Handle<v8::Object> obj
+
+#define JS_PROPQUERY_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Integer>& info
+#define JS_NAMED_PROPGET_ARGS JS_PROPGET_ARGS
+#define JS_NAMED_PROPPUT_ARGS v8::Local<v8::String> property,v8::Local<v8::Value> value,const v8::PropertyCallbackInfo<v8::Value>& info
+#define JS_PROPDEL_ARGS v8::Local<v8::String> property,const v8::PropertyCallbackInfo<v8::Boolean>& info
+
+typedef unsigned (*LP_CONSTRUCTOR)(JS_CONSTRUCTOR_ARGS);
+typedef unsigned (*LP_DESTRUCTOR)(JS_DESTRUCTOR_ARGS);
+
+#endif
+
+int JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew);
+int JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum);
+int JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, AccessorGetterCallback pPropGet, AccessorSetterCallback pPropPut);
+int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, NamedPropertyQueryCallback pPropQurey, NamedPropertyGetterCallback pPropGet, NamedPropertySetterCallback pPropPut, NamedPropertyDeleterCallback pPropDel);
+int JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault);
+int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum);
+int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault);
+
+void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext);
+void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext);
+void JS_Initial();
+void JS_Release();
+int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
+int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
+v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID);
+v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID);
+void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID);
+v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime);
+int JS_GetObjDefnID(v8::Handle<v8::Object> pObj);
+IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj);
+int JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName);
+void JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub);
+unsigned JS_CalcHash(const wchar_t* main, unsigned nLen);
+unsigned JS_CalcHash(const wchar_t* main);
+const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj);
+const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj);
+void JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p);
+void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj);
+void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p);
+void* JS_GetPrivate(v8::Handle<v8::Object> pObj);
+void JS_FreePrivate(v8::Handle<v8::Object> pObj);
+v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj);
+v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName);
+v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj);
+void JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue);
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue);
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue);
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue);
+void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue);
+void JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut);
+void JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName);
+unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType);
+v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index);
+unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray);
+v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index);
+
+
+v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime);
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number);
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number);
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number);
+v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b);
+v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj);
+v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj);
+v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string);
+v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen);
+v8::Handle<v8::Value> JS_NewNull();
+v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d);
+v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime);
+
+
+int JS_ToInt32(v8::Handle<v8::Value> pValue);
+bool JS_ToBoolean(v8::Handle<v8::Value> pValue);
+double JS_ToNumber(v8::Handle<v8::Value> pValue);
+v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue);
+CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue);
+v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue);
+void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom);
+
+double JS_GetDateTime();
+int JS_GetYearFromTime(double dt);
+int JS_GetMonthFromTime(double dt);
+int JS_GetDayFromTime(double dt);
+int JS_GetHourFromTime(double dt);
+int JS_GetMinFromTime(double dt);
+int JS_GetSecFromTime(double dt);
+double JS_DateParse(const wchar_t* string);
+double JS_MakeDay(int nYear, int nMonth, int nDay);
+double JS_MakeTime(int nHour, int nMin, int nSec, int nMs);
+double JS_MakeDate(double day, double time);
+bool JS_PortIsNan(double d);
+double JS_LocalTime(double d);
+
+#endif //FXJSAPI_H
diff --git a/fpdfsdk/include/pdfwindow/IPDFWindow.h b/fpdfsdk/include/pdfwindow/IPDFWindow.h
new file mode 100644
index 0000000000..53b96a64fd
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/IPDFWindow.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _IPDFWINDOW_H_
+#define _IPDFWINDOW_H_
+
+#include "PWL_Wnd.h"
+#include "PWL_EditCtrl.h"
+#include "PWL_Edit.h"
+#include "PWL_ListBox.h"
+#include "PWL_ComboBox.h"
+#include "PWL_Button.h"
+#include "PWL_SpecialButton.h"
+#include "PWL_Icon.h"
+#include "PWL_Label.h"
+#include "PWL_ListCtrl.h"
+#include "PWL_Caret.h"
+#include "PWL_ScrollBar.h"
+#include "PWL_Note.h"
+#include "PWL_IconList.h"
+#include "PWL_FontMap.h"
+#include "PWL_Signature.h"
+#include "PWL_Utils.h"
+
+#endif //_IPDFWINDOW_H_
diff --git a/fpdfsdk/include/pdfwindow/PDFWindow.h b/fpdfsdk/include/pdfwindow/PDFWindow.h
new file mode 100644
index 0000000000..22703e1f01
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PDFWindow.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PDFWINDOW_H_
+#define _PDFWINDOW_H_
+
+// #define VC_EXTRALEAN
+// #include <afxext.h>
+// #include <afxcmn.h>
+
+#ifndef _INC_PDFAPI
+ #define _INC_PDFAPI
+
+ #include "../../../core/include/fpdfapi/fpdf_module.h"
+ #include "../../../core/include/fpdfdoc/fpdf_doc.h"
+ #include "../../../core/include/fpdfdoc/fpdf_vt.h"
+ #include "../../../core/include/fxcrt/fx_xml.h"
+
+ #include "../fpdf_fwlevent.h"
+ #include "../fx_systemhandler.h"
+#endif
+
+#include "../fxedit/fx_edit.h"
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Button.h b/fpdfsdk/include/pdfwindow/PWL_Button.h
new file mode 100644
index 0000000000..202a0d1152
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Button.h
@@ -0,0 +1,28 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_BUTTON_H_
+#define _PWL_BUTTON_H_
+
+class PWL_CLASS CPWL_Button : public CPWL_Wnd
+{
+public:
+ CPWL_Button();
+ virtual ~CPWL_Button();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ FX_BOOL m_bMouseDown;
+};
+
+#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Caret.h b/fpdfsdk/include/pdfwindow/PWL_Caret.h
new file mode 100644
index 0000000000..4586d471ad
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Caret.h
@@ -0,0 +1,58 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_CARET_H_
+#define _PWL_CARET_H_
+
+struct PWL_CARET_INFO
+{
+public:
+ PWL_CARET_INFO() : bVisible(FALSE), ptHead(0,0), ptFoot(0,0)
+ {
+ }
+
+ FX_BOOL bVisible;
+ CPDF_Point ptHead;
+ CPDF_Point ptFoot;
+};
+
+
+class CPWL_Caret : public CPWL_Wnd
+{
+public:
+ CPWL_Caret();
+ virtual ~CPWL_Caret();
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void InvalidateRect(CPDF_Rect * pRect = NULL);
+
+ virtual void SetVisible(FX_BOOL bVisible) {}
+
+ virtual void TimerProc();
+
+ void SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);
+ CFX_ByteString GetCaretAppearanceStream(const CPDF_Point & ptOffset);
+
+private:
+ void GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset);
+ CPDF_Rect GetCaretRect() const;
+
+ FX_BOOL m_bFlash;
+ CPDF_Point m_ptHead;
+ CPDF_Point m_ptFoot;
+ FX_FLOAT m_fWidth;
+ FX_INT32 m_nDelay;
+
+public:
+ void SetInvalidRect(CPDF_Rect rc) {m_rcInvalid = rc;}
+private:
+ CPDF_Rect m_rcInvalid;
+};
+
+#endif // !defined(AFX_PWL_CARET_H__6A729612_4173_4B65_BCAB_7C6C850ECA47__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ComboBox.h b/fpdfsdk/include/pdfwindow/PWL_ComboBox.h
new file mode 100644
index 0000000000..f64b636c44
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_ComboBox.h
@@ -0,0 +1,115 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_COMBOBOX_H_
+#define _PWL_COMBOBOX_H_
+
+class CPWL_CBEdit : public CPWL_Edit
+{
+public:
+ CPWL_CBEdit(){};
+ virtual ~CPWL_CBEdit(){};
+};
+
+class PWL_CLASS CPWL_CBListBox : public CPWL_ListBox
+{
+public:
+ CPWL_CBListBox(){};
+ virtual ~CPWL_CBListBox(){};
+
+public:
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag);
+};
+
+#define PWL_COMBOBOX_BUTTON_WIDTH 13
+
+class CPWL_CBButton : public CPWL_Wnd
+{
+public:
+ CPWL_CBButton(){};
+ virtual ~CPWL_CBButton(){};
+
+public:
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+};
+
+class PWL_CLASS CPWL_ComboBox : public CPWL_Wnd
+{
+public:
+ CPWL_ComboBox();
+ operator CPWL_Edit* () {return m_pEdit;}
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+
+ virtual CPDF_Rect GetFocusRect() const;
+
+ virtual void SetFocus();
+ virtual void KillFocus();
+
+ FX_BOOL IsModified() const;
+
+public:
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify);
+
+ CFX_WideString GetText() const;
+ void SetText(FX_LPCWSTR text);
+
+ void AddString(FX_LPCWSTR string);
+ FX_INT32 GetSelect() const;
+ void SetSelect(FX_INT32 nItemIndex);
+
+ void SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
+ void Clear();
+ void SelectAll();
+ FX_BOOL IsPopup() const;
+
+ void SetSelectText();
+
+private:
+ void CreateEdit(const PWL_CREATEPARAM & cp);
+ void CreateButton(const PWL_CREATEPARAM & cp);
+ void CreateListBox(const PWL_CREATEPARAM & cp);
+
+ void SetPopup(FX_BOOL bPopup);
+
+private:
+ CPWL_CBEdit* m_pEdit;
+ CPWL_CBButton* m_pButton;
+ CPWL_CBListBox* m_pList;
+
+ FX_BOOL m_bPopup;
+ CPDF_Rect m_rcOldWindow;
+ FX_INT32 m_nPopupWhere;
+ FX_INT32 m_nSelectItem;
+ IPWL_Filler_Notify* m_pFillerNotify;
+
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif // !defined(AFX_PWL_COMBOBOX_H__9D6645F8_64AA_4806_94E8_95FDEDD39C17__INCLUDED_)
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Edit.h b/fpdfsdk/include/pdfwindow/PWL_Edit.h
new file mode 100644
index 0000000000..71f675600d
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Edit.h
@@ -0,0 +1,138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_EDIT_H_
+#define _PWL_EDIT_H_
+
+class IPWL_Filler_Notify;
+class CPWL_Edit;
+class IPWL_SpellCheck;
+
+class IPWL_Filler_Notify
+{
+public:
+ virtual void QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax,
+ FX_INT32 & nRet, FX_FLOAT & fPopupRet) = 0; //nRet: (0:bottom 1:top)
+ virtual void OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag) = 0;
+ virtual void OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit, FX_DWORD nFlag) = 0;
+};
+
+class PWL_CLASS CPWL_Edit : public CPWL_EditCtrl, public IFX_Edit_OprNotify
+{
+public:
+ CPWL_Edit();
+ virtual ~CPWL_Edit();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnDestroy();
+ virtual void OnCreated();
+ virtual void RePosChildWnd();
+ virtual CPDF_Rect GetClientRect() const;
+
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+
+ virtual CPDF_Rect GetFocusRect() const;
+
+public:
+ void SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat = PEAH_LEFT, FX_BOOL bPaint = TRUE); //0:left 1:right 2:middle
+ void SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat = PEAV_TOP, FX_BOOL bPaint = TRUE); //0:top 1:bottom 2:center
+
+ void SetCharArray(FX_INT32 nCharArray);
+ void SetLimitChar(FX_INT32 nLimitChar);
+
+ void SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint = TRUE);
+ void SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint = TRUE);
+
+ void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
+
+ void EnableSpellCheck(FX_BOOL bEnabled);
+
+ FX_BOOL CanSelectAll() const;
+ FX_BOOL CanClear() const;
+ FX_BOOL CanCopy() const;
+ FX_BOOL CanCut() const;
+ FX_BOOL CanPaste() const;
+
+ virtual void CopyText();
+ virtual void PasteText();
+ virtual void CutText();
+
+ virtual void SetText(FX_LPCWSTR csText);
+ void ReplaceSel(FX_LPCWSTR csText);
+
+ CFX_ByteString GetTextAppearanceStream(const CPDF_Point & ptOffset) const;
+ CFX_ByteString GetCaretAppearanceStream(const CPDF_Point & ptOffset) const;
+ CFX_ByteString GetSelectAppearanceStream(const CPDF_Point & ptOffset) const;
+
+ FX_BOOL IsTextFull() const;
+
+ static FX_FLOAT GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray);
+
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}
+
+ void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
+ void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset);
+
+protected:
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+protected:
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace);
+ virtual void OnAddUndo(IFX_Edit_UndoItem* pUndoItem);
+
+private:
+ CPVT_WordRange GetSelectWordRange() const;
+ virtual void ShowVScrollBar(FX_BOOL bShow);
+ FX_BOOL IsVScrollBarVisible() const;
+ void SetParamByFlag();
+
+ FX_FLOAT GetCharArrayAutoFontSize(FX_INT32 nCharArray);
+ CPDF_Point GetWordRightBottomPoint(const CPVT_WordPlace& wpWord);
+
+ CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);
+ CPVT_WordRange GetLatinWordsRange(const CPDF_Point & point) const;
+ CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange GetArabicWordsRange(const CPVT_WordPlace & place) const;
+ CPVT_WordRange GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const;
+
+ void AjustArabicWords(const CPVT_WordRange& wr);
+public:
+ FX_BOOL IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag);
+private:
+ IPWL_Filler_Notify* m_pFillerNotify;
+ IPWL_SpellCheck* m_pSpellCheck;
+ FX_BOOL m_bFocus;
+ CPDF_Rect m_rcOldWindow;
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h b/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h
new file mode 100644
index 0000000000..3df0f4c23f
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_EditCtrl.h
@@ -0,0 +1,171 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_EDITCTRL_H_
+#define _PWL_EDITCTRL_H_
+
+enum PWL_EDIT_ALIGNFORMAT_H
+{
+ PEAH_LEFT = 0,
+ PEAH_MIDDLE,
+ PEAH_RIGHT
+};
+
+enum PWL_EDIT_ALIGNFORMAT_V
+{
+ PEAV_TOP = 0,
+ PEAV_CENTER,
+ PEAV_BOTTOM
+};
+
+class IPWL_Edit_Notify;
+class CPWL_EditCtrl;
+class CPWL_Caret;
+class IFX_Edit;
+class CPWL_Edit;
+
+class IPWL_Edit_Notify
+{
+public:
+ //when the position of caret is changed in edit
+ virtual void OnCaretMove(FX_INT32 x1, FX_INT32 y1, FX_INT32 x2, FX_INT32 y2) {}
+ virtual void OnContentChange(const CPDF_Rect& rcContent){}
+ //OprType: 0 InsertWord
+ //1 InsertReturn
+ //2 BackSpace
+ //3 Delete
+ //4 Clear
+ //5 InsertText
+ //6 SetText
+ virtual void OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
+ virtual void OnAddUndo(CPWL_Edit* pEdit) {}
+};
+
+class PWL_CLASS CPWL_EditCtrl : public CPWL_Wnd, public IFX_Edit_Notify
+{
+ friend class CPWL_Edit_Notify;
+
+public:
+ CPWL_EditCtrl();
+ virtual ~CPWL_EditCtrl();
+
+public:
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void OnCreated();
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+public:
+ virtual void SetText(FX_LPCWSTR csText);
+
+ virtual void CopyText();
+ virtual void PasteText();
+ virtual void CutText();
+
+ CPDF_Rect GetContentRect() const;
+ void GetCaretPos(FX_INT32& x, FX_INT32& y) const;
+ FX_BOOL IsModified() const;
+
+ CFX_WideString GetText() const;
+ void SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
+ void GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
+ void GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+ CFX_WideString GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
+ void Clear();
+ void SelectAll();
+
+ FX_INT32 GetCaret() const;
+ void SetCaret(FX_INT32 nPos);
+ FX_INT32 GetTotalWords() const;
+
+ void Paint();
+
+ void EnableRefresh(FX_BOOL bRefresh);
+ CPDF_Point GetScrollPos() const;
+ void SetScrollPos(const CPDF_Point& point);
+
+ void SetEditNotify(IPWL_Edit_Notify* pNotify) {m_pEditNotify = pNotify;}
+
+ void SetCharSet(FX_BYTE nCharSet){m_nCharSet = nCharSet;}
+ FX_INT32 GetCharSet() const;
+
+ void SetCodePage(FX_INT32 nCodePage){m_nCodePage = nCodePage;}
+ FX_INT32 GetCodePage() const {return m_nCodePage;}
+
+ CPDF_Font * GetCaretFont() const;
+ FX_FLOAT GetCaretFontSize() const;
+
+ FX_BOOL CanUndo() const;
+ FX_BOOL CanRedo() const;
+ void Redo();
+ void Undo();
+
+ void SetReadyToInput();
+protected:
+ virtual void ShowVScrollBar(FX_BOOL bShow);
+
+ virtual void InsertWord(FX_WORD word, FX_INT32 nCharset);
+ virtual void InsertReturn();
+ virtual void InsertText(FX_LPCWSTR csText);
+
+ virtual void SetCursor();
+ FX_BOOL IsWndHorV();
+
+ void Delete();
+ void Backspace();
+
+protected:
+ void GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const;
+ void SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);
+
+ void SetEditCaret(FX_BOOL bVisible);
+
+protected:
+ virtual void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep){}
+ virtual void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep);
+ virtual void IOnSetScrollPosX(FX_FLOAT fx){}
+ virtual void IOnSetScrollPosY(FX_FLOAT fy);
+ virtual void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);
+ virtual void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);
+ virtual void IOnContentChange(const CPDF_Rect& rcContent);
+ virtual void IOnInvalidateRect(CPDF_Rect * pRect);
+
+private:
+ void CreateEditCaret(const PWL_CREATEPARAM & cp);
+
+protected:
+ IFX_Edit* m_pEdit;
+ CPWL_Caret* m_pEditCaret;
+ FX_BOOL m_bMouseDown;
+ IPWL_Edit_Notify* m_pEditNotify;
+
+private:
+ FX_INT32 m_nCharSet;
+ FX_INT32 m_nCodePage;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_FontMap.h b/fpdfsdk/include/pdfwindow/PWL_FontMap.h
new file mode 100644
index 0000000000..858bb2a398
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_FontMap.h
@@ -0,0 +1,137 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_FONTMAP_H_
+#define _PWL_FONTMAP_H_
+
+struct CPWL_FontMap_Data
+{
+ CPDF_Font* pFont;
+ FX_INT32 nCharset;
+ CFX_ByteString sFontName;
+};
+
+struct CPWL_FontMap_Native
+{
+ FX_INT32 nCharset;
+ CFX_ByteString sFontName;
+};
+
+#ifndef ANSI_CHARSET
+
+#define ANSI_CHARSET 0
+#define DEFAULT_CHARSET 1
+#define SYMBOL_CHARSET 2
+#define SHIFTJIS_CHARSET 128
+#define HANGEUL_CHARSET 129
+#define HANGUL_CHARSET 129
+#define GB2312_CHARSET 134
+#define CHINESEBIG5_CHARSET 136
+#define OEM_CHARSET 255
+#define JOHAB_CHARSET 130
+#define HEBREW_CHARSET 177
+#define ARABIC_CHARSET 178
+#define GREEK_CHARSET 161
+#define TURKISH_CHARSET 162
+#define VIETNAMESE_CHARSET 163
+#define THAI_CHARSET 222
+#define EASTEUROPE_CHARSET 238
+#define RUSSIAN_CHARSET 204
+#define BALTIC_CHARSET 186
+
+#endif
+
+#ifndef PWL_CLASS
+
+ #ifdef FX_READER_DLL
+ #define PWL_CLASS __declspec(dllexport)
+ #else
+ #define PWL_CLASS
+ #endif
+#endif
+
+class IFX_SystemHandler;
+class PWL_CLASS CPWL_FontMap : public IFX_Edit_FontMap
+{
+public:
+ CPWL_FontMap(IFX_SystemHandler* pSystemHandler);
+ virtual ~CPWL_FontMap();
+
+ virtual CPDF_Font* GetPDFFont(FX_INT32 nFontIndex);
+ virtual CFX_ByteString GetPDFFontAlias(FX_INT32 nFontIndex);
+ virtual FX_INT32 GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex);
+ virtual FX_INT32 CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word);
+ virtual FX_INT32 CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset);
+
+public:
+ virtual void Initial(FX_LPCSTR fontname = NULL);
+ void SetSystemHandler(IFX_SystemHandler* pSystemHandler);
+
+ FX_INT32 GetFontMapCount() const;
+ const CPWL_FontMap_Data* GetFontMapData(FX_INT32 nIndex) const;
+
+public:
+ static FX_INT32 GetNativeCharset();
+ CFX_ByteString GetNativeFontName(FX_INT32 nCharset);
+
+ static CFX_ByteString GetDefaultFontByCharset(FX_INT32 nCharset);
+
+ CPDF_Font* AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset);
+ static FX_BOOL IsStandardFont(const CFX_ByteString& sFontName);
+ CPDF_Font* AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName);
+ CPDF_Font* AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName,
+ FX_BYTE nCharset);
+
+protected:
+ virtual CPDF_Font* FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset);
+ virtual void AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias);
+ FX_BOOL KnowWord(FX_INT32 nFontIndex, FX_WORD word);
+
+ virtual CPDF_Document* GetDocument();
+
+ void Empty();
+ FX_INT32 GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind);
+ FX_INT32 GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset);
+ FX_INT32 AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset = DEFAULT_CHARSET);
+
+ CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset);
+ CFX_ByteString EncodeFontAlias(const CFX_ByteString& sFontName);
+
+private:
+ CFX_ByteString GetFontName(FX_INT32 nFontIndex);
+ FX_INT32 FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset = DEFAULT_CHARSET);
+
+ CFX_ByteString GetNativeFont(FX_INT32 nCharset);
+
+public:
+ struct CharsetFontMap {
+ FX_INT32 charset;
+ const char* fontname;
+ };
+ static const CharsetFontMap defaultTTFMap[];
+
+protected:
+ CFX_ArrayTemplate<CPWL_FontMap_Data*> m_aData;
+ CFX_ArrayTemplate<CPWL_FontMap_Native*> m_aNativeFont;
+
+private:
+ CPDF_Document* m_pPDFDoc;
+ IFX_SystemHandler* m_pSystemHandler;
+};
+
+class PWL_CLASS CPWL_DocFontMap : public CPWL_FontMap
+{
+public:
+ CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc);
+ virtual ~CPWL_DocFontMap();
+
+ virtual CPDF_Document* GetDocument();
+
+private:
+ CPDF_Document* m_pAttachedDoc;
+};
+
+#endif
diff --git a/fpdfsdk/include/pdfwindow/PWL_Icon.h b/fpdfsdk/include/pdfwindow/PWL_Icon.h
new file mode 100644
index 0000000000..d6b121e800
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Icon.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_ICON_H_
+#define _PWL_ICON_H_
+
+class PWL_CLASS CPWL_Image : public CPWL_Wnd
+{
+public:
+ CPWL_Image();
+ virtual ~CPWL_Image();
+
+ virtual CFX_ByteString GetImageAppStream();
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+ virtual void GetImageOffset(FX_FLOAT & x,FX_FLOAT & y);
+ virtual CPDF_Stream * GetPDFStream();
+
+public:
+ void SetPDFStream(CPDF_Stream* pStream);
+ void GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight);
+ CPDF_Matrix GetImageMatrix();
+ CFX_ByteString GetImageAlias();
+ void SetImageAlias(FX_LPCSTR sImageAlias);
+
+protected:
+ CPDF_Stream* m_pPDFStream;
+ CFX_ByteString m_sImageAlias;
+};
+
+class PWL_CLASS CPWL_Icon : public CPWL_Image
+{
+public:
+ CPWL_Icon();
+ virtual ~CPWL_Icon();
+
+ virtual CPDF_IconFit * GetIconFit(){return m_pIconFit;};
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+ virtual void GetImageOffset(FX_FLOAT & x,FX_FLOAT & y);
+
+ FX_INT32 GetScaleMethod();
+ FX_BOOL IsProportionalScale();
+ void GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom);
+ FX_BOOL GetFittingBounds();
+
+ void SetIconFit(CPDF_IconFit * pIconFit){m_pIconFit = pIconFit;};
+
+private:
+ CPDF_IconFit * m_pIconFit;
+};
+
+
+#endif // !defined(AFX_PWL_BUTTON_H__5A6080AA_33C5_4FC9_91FC_D9644C41120A__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_IconList.h b/fpdfsdk/include/pdfwindow/PWL_IconList.h
new file mode 100644
index 0000000000..e5192901e8
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_IconList.h
@@ -0,0 +1,125 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_IconList_H_
+#define _PWL_IconList_H_
+
+class IPWL_IconList_Notify;
+class CPWL_IconList_Item;
+class CPWL_IconList_Content;
+class CPWL_IconList;
+class CPWL_Label;
+
+class IPWL_IconList_Notify
+{
+public:
+ virtual void OnNoteListSelChanged(FX_INT32 nItemIndex) = 0;
+};
+
+class CPWL_IconList_Item : public CPWL_Wnd
+{
+public:
+ CPWL_IconList_Item();
+ virtual ~CPWL_IconList_Item();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+
+ void SetSelect(FX_BOOL bSelected);
+ FX_BOOL IsSelected() const;
+ void SetData(void* pData);
+ void SetIcon(FX_INT32 nIconIndex);
+ void SetText(const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetText() const;
+
+protected:
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual void OnEnabled();
+ virtual void OnDisabled();
+
+private:
+ FX_INT32 m_nIconIndex;
+ void* m_pData;
+ FX_BOOL m_bSelected;
+ CPWL_Label* m_pText;
+ CPWL_Color m_crIcon;
+};
+
+class CPWL_IconList_Content : public CPWL_ListCtrl
+{
+public:
+ CPWL_IconList_Content(FX_INT32 nListCount);
+ virtual ~CPWL_IconList_Content();
+
+ void SetSelect(FX_INT32 nIndex);
+ FX_INT32 GetSelect() const;
+ void SetNotify(IPWL_IconList_Notify* pNotify);
+ void EnableNotify(FX_BOOL bNotify);
+ void SetListData(FX_INT32 nItemIndex, void* pData);
+ void SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);
+ void SetListString(FX_INT32 nItemIndex, const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetListString(FX_INT32 nItemIndex) const;
+ IPWL_IconList_Notify* GetNotify() const;
+ void ScrollToItem(FX_INT32 nItemIndex);
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point);
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar);
+
+private:
+ CPWL_IconList_Item* GetListItem(FX_INT32 nItemIndex) const;
+ void SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect);
+ FX_INT32 FindItemIndex(const CPDF_Point& point);
+
+ FX_BOOL m_nSelectIndex;
+ IPWL_IconList_Notify* m_pNotify;
+ FX_BOOL m_bEnableNotify;
+ FX_BOOL m_bMouseDown;
+ FX_INT32 m_nListCount;
+};
+
+class PWL_CLASS CPWL_IconList : public CPWL_Wnd
+{
+public:
+ CPWL_IconList(FX_INT32 nListCount);
+ virtual ~CPWL_IconList();
+
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point);
+
+ void SetSelect(FX_INT32 nIndex);
+ void SetTopItem(FX_INT32 nIndex);
+ FX_INT32 GetSelect() const;
+ void SetNotify(IPWL_IconList_Notify* pNotify);
+ void EnableNotify(FX_BOOL bNotify);
+ void SetListData(FX_INT32 nItemIndex, void* pData);
+ void SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex);
+ void SetListString(FX_INT32 nItemIndex, const CFX_WideString& str);
+ void SetIconFillColor(const CPWL_Color& color);
+ CFX_WideString GetListString(FX_INT32 nItemIndex) const;
+
+protected:
+ virtual void OnCreated();
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+private:
+ CPWL_IconList_Content* m_pListContent;
+ FX_INT32 m_nListCount;
+};
+
+#endif //_PWL_IconList_H_
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Label.h b/fpdfsdk/include/pdfwindow/PWL_Label.h
new file mode 100644
index 0000000000..16bd1ae39a
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Label.h
@@ -0,0 +1,51 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_LABEL_H_
+#define _PWL_LABEL_H_
+
+class IFX_Edit;
+
+class PWL_CLASS CPWL_Label : public CPWL_Wnd
+{
+public:
+ CPWL_Label();
+ virtual ~CPWL_Label();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+public:
+ void SetText(FX_LPCWSTR csText);
+ CFX_WideString GetText() const;
+
+ void SetLimitChar(FX_INT32 nLimitChar);
+ void SetHorzScale(FX_INT32 nHorzScale);
+ void SetCharSpace(FX_FLOAT fCharSpace);
+
+ CPDF_Rect GetContentRect() const;
+ FX_INT32 GetTotalWords();
+
+ CFX_ByteString GetTextAppearanceStream(const CPDF_Point & ptOffset) const;
+
+protected:
+ virtual void OnCreated();
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void RePosChildWnd();
+
+private:
+ void SetParamByFlag();
+
+private:
+ IFX_Edit* m_pEdit;
+};
+
+#endif
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ListBox.h b/fpdfsdk/include/pdfwindow/PWL_ListBox.h
new file mode 100644
index 0000000000..6ef82c82c6
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_ListBox.h
@@ -0,0 +1,103 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_LISTBOX_H_
+#define _PWL_LISTBOX_H_
+
+class CPDF_ListCtrl;
+class CPWL_List_Notify;
+class CPWL_ListBox;
+class IPWL_Filler_Notify;
+
+class CPWL_List_Notify : public IFX_List_Notify
+{
+public:
+ CPWL_List_Notify(CPWL_ListBox * pList);
+ virtual ~CPWL_List_Notify();
+
+ void IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep){}
+ void IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep);
+ void IOnSetScrollPosX(FX_FLOAT fx){}
+ void IOnSetScrollPosY(FX_FLOAT fy);
+ void IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);
+ void IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);
+ void IOnInvalidateRect(CPDF_Rect * pRect);
+
+private:
+ CPWL_ListBox* m_pList;
+};
+
+class PWL_CLASS CPWL_ListBox : public CPWL_Wnd
+{
+public:
+ CPWL_ListBox();
+ virtual ~CPWL_ListBox();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreated();
+ virtual void OnDestroy();
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void KillFocus();
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void RePosChildWnd();
+ virtual void SetText(FX_LPCWSTR csText,FX_BOOL bRefresh = TRUE);
+ virtual CFX_WideString GetText() const;
+ virtual CPDF_Rect GetFocusRect() const;
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+ virtual FX_FLOAT GetFontSize() const;
+
+ void OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit , FX_DWORD nFlag);
+
+ void AddString(FX_LPCWSTR string);
+ void SetTopVisibleIndex(FX_INT32 nItemIndex);
+ void ScrollToListItem(FX_INT32 nItemIndex);
+ void ResetContent();
+ void Reset();
+ void Select(FX_INT32 nItemIndex);
+ void SetCaret(FX_INT32 nItemIndex);
+ void SetHoverSel(FX_BOOL bHoverSel);
+
+ FX_INT32 GetCount() const;
+ FX_BOOL IsMultipleSel() const;
+ FX_INT32 GetCaretIndex() const;
+ FX_INT32 GetCurSel() const;
+ FX_BOOL IsItemSelected(FX_INT32 nItemIndex) const;
+ FX_INT32 GetTopVisibleIndex() const;
+ FX_INT32 FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const;
+ CPDF_Rect GetContentRect() const;
+ FX_FLOAT GetFirstHeight() const;
+ CPDF_Rect GetListRect() const;
+
+ void SetFillerNotify(IPWL_Filler_Notify* pNotify) {m_pFillerNotify = pNotify;}
+
+protected:
+ IFX_List* m_pList;
+ CPWL_List_Notify* m_pListNotify;
+ FX_BOOL m_bMouseDown;
+ FX_BOOL m_bHoverSel;
+ IPWL_Filler_Notify* m_pFillerNotify;
+public:
+ void AttachFFLData(void* pData) {m_pFormFiller = pData;}
+private:
+ void* m_pFormFiller;
+};
+
+#endif // !defined(AFX_PWL_LISTBOX_H__F8C0DD72_CC3C_4806_86FB_E9D02B04A34B__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h b/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h
new file mode 100644
index 0000000000..3a3b922e68
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_ListCtrl.h
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_LISTCTRL_H_
+#define _PWL_LISTCTRL_H_
+
+class CPWL_ListCtrl;
+
+class CPWL_ListCtrl : public CPWL_Wnd
+{
+public:
+ CPWL_ListCtrl();
+ virtual ~CPWL_ListCtrl();
+
+public:
+ void SetScrollPos(const CPDF_Point& point);
+ CPDF_Point GetScrollPos() const;
+ CPDF_Rect GetScrollArea() const;
+
+ void SetItemSpace(FX_FLOAT fSpace);
+ void SetTopSpace(FX_FLOAT fSpace);
+ void SetBottomSpace(FX_FLOAT fSpace);
+ void ResetFace();
+ void ResetContent(FX_INT32 nStart);
+ FX_INT32 GetItemIndex(CPWL_Wnd* pItem);
+ FX_FLOAT GetContentsHeight(FX_FLOAT fLimitWidth);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+public:
+ CPDF_Point InToOut(const CPDF_Point& point) const;
+ CPDF_Point OutToIn(const CPDF_Point& point) const;
+ CPDF_Rect InToOut(const CPDF_Rect& rect) const;
+ CPDF_Rect OutToIn(const CPDF_Rect& rect) const;
+
+private:
+ void ResetAll(FX_BOOL bMove,FX_INT32 nStart);
+
+private:
+ CPDF_Rect m_rcContent;
+ CPDF_Point m_ptScroll;
+ FX_FLOAT m_fItemSpace;
+ FX_FLOAT m_fTopSpace;
+ FX_FLOAT m_fBottomSpace;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Note.h b/fpdfsdk/include/pdfwindow/PWL_Note.h
new file mode 100644
index 0000000000..89308e63e4
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Note.h
@@ -0,0 +1,355 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_NOTE_H_
+#define _PWL_NOTE_H_
+
+class IPWL_NoteNotify;
+class IPWL_NoteHandler;
+class IPWL_NoteItem;
+class CPWL_NoteItem;
+class CPWL_Note;
+class CPWL_Label;
+class CPWL_Edit;
+class CPWL_Note_Icon;
+class CPWL_Note_CloseBox;
+class CPWL_Note_LBBox;
+class CPWL_Note_RBBox;
+class CPWL_Note_Edit;
+class CPWL_Note_Options;
+class CPWL_Note_Contents;
+class IPopup_Note;
+
+
+class IPWL_NoteNotify
+{
+public:
+ virtual void OnNoteMove(const FX_RECT& rtWin) = 0;
+ virtual void OnNoteShow(FX_BOOL bShow) = 0;
+ virtual void OnNoteActivate(FX_BOOL bActive) = 0;
+ virtual void OnNoteClose() = 0;
+ virtual void OnItemCreate(IPWL_NoteItem* pItem) = 0;
+ virtual void OnItemDelete(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetAuthorName(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetBkColor(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetContents(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetDateTime(IPWL_NoteItem* pItem) = 0;
+ virtual void OnSetSubjectName(IPWL_NoteItem* pItem) = 0;
+ virtual void OnPopupMenu(FX_INT32 x, FX_INT32 y) = 0;
+ virtual void OnPopupMenu(IPWL_NoteItem* pItem, FX_INT32 x, FX_INT32 y) = 0;
+};
+
+class IPWL_NoteHandler
+{
+public:
+ virtual void OnNoteColorChanged(const CPWL_Color& color) = 0;
+};
+
+class IPWL_NoteItem
+{
+public:
+ virtual void SetPrivateData(void* pData) = 0;
+ virtual void SetBkColor(const CPWL_Color& color) = 0;
+ virtual void SetSubjectName(const CFX_WideString& sName) = 0;
+ virtual void SetAuthorName(const CFX_WideString& sName) = 0;
+ virtual void SetDateTime(FX_SYSTEMTIME time) = 0;
+ virtual void SetContents(const CFX_WideString& sContents) = 0;
+
+ virtual IPWL_NoteItem* CreateSubItem() = 0;
+ virtual FX_INT32 CountSubItems() const = 0;
+ virtual IPWL_NoteItem* GetSubItems(FX_INT32 index) const = 0;
+ virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem) = 0;
+ virtual void SetFocus() = 0;
+
+ virtual IPWL_NoteItem* GetParentItem() const = 0;
+ virtual void* GetPrivateData() const = 0;
+ virtual CFX_WideString GetAuthorName() const = 0;
+ virtual CPWL_Color GetBkColor() const = 0;
+ virtual CFX_WideString GetContents() const = 0;
+ virtual FX_SYSTEMTIME GetDateTime() const = 0;
+ virtual CFX_WideString GetSubjectName() const = 0;
+
+ virtual CPWL_Edit* GetEdit() const = 0;
+};
+
+class PWL_CLASS CPWL_Note_Icon : public CPWL_Wnd
+{
+public:
+ CPWL_Note_Icon();
+ virtual ~CPWL_Note_Icon();
+
+ void SetIconType(FX_INT32 nType);
+
+public:
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+private:
+ FX_INT32 m_nType;
+};
+
+class CPWL_Note_CloseBox : public CPWL_Button
+{
+public:
+ CPWL_Note_CloseBox();
+ virtual ~CPWL_Note_CloseBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+
+private:
+ FX_BOOL m_bMouseDown;
+};
+
+class CPWL_Note_LBBox : public CPWL_Wnd
+{
+public:
+ CPWL_Note_LBBox();
+ virtual ~CPWL_Note_LBBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+};
+
+class CPWL_Note_RBBox : public CPWL_Wnd
+{
+public:
+ CPWL_Note_RBBox();
+ virtual ~CPWL_Note_RBBox();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+};
+
+class CPWL_Note_Edit : public CPWL_Edit
+{
+public:
+ CPWL_Note_Edit();
+ virtual ~CPWL_Note_Edit();
+
+ void EnableNotify(FX_BOOL bEnable) {m_bEnableNotify = bEnable;}
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ FX_FLOAT GetItemLeftMargin();
+ FX_FLOAT GetItemRightMargin();
+
+ virtual void SetText(FX_LPCWSTR csText);
+
+protected:
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void RePosChildWnd();
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+private:
+ FX_BOOL m_bEnableNotify;
+ FX_FLOAT m_fOldItemHeight;
+ FX_BOOL m_bSizeChanged;
+ FX_FLOAT m_fOldMin;
+ FX_FLOAT m_fOldMax;
+};
+
+class CPWL_Note_Options : public CPWL_Wnd
+{
+public:
+ CPWL_Note_Options();
+ virtual ~CPWL_Note_Options();
+
+ CPDF_Rect GetContentRect() const;
+ virtual void SetTextColor(const CPWL_Color & color);
+ void SetText(const CFX_WideString& sText);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+private:
+ CPWL_Label* m_pText;
+};
+
+class CPWL_Note_Contents : public CPWL_ListCtrl
+{
+public:
+ CPWL_Note_Contents();
+ virtual ~CPWL_Note_Contents();
+
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);
+
+ void SetEditFocus(FX_BOOL bLast);
+ CPWL_Edit* GetEdit() const;
+
+public:
+ void SetText(const CFX_WideString& sText);
+ CFX_WideString GetText() const;
+
+ CPWL_NoteItem* CreateSubItem();
+ void DeleteSubItem(IPWL_NoteItem* pNoteItem);
+ FX_INT32 CountSubItems() const;
+ IPWL_NoteItem* GetSubItems(FX_INT32 index) const;
+
+ virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+private:
+ CPWL_Note_Edit* m_pEdit;
+};
+
+class PWL_CLASS CPWL_NoteItem : public CPWL_Wnd, public IPWL_NoteItem
+{
+public:
+ CPWL_NoteItem();
+ virtual ~CPWL_NoteItem();
+
+public:
+ virtual void SetPrivateData(void* pData);
+ virtual void SetBkColor(const CPWL_Color& color);
+ virtual void SetSubjectName(const CFX_WideString& sName);
+ virtual void SetAuthorName(const CFX_WideString& sName);
+ virtual void SetDateTime(FX_SYSTEMTIME time);
+ virtual void SetContents(const CFX_WideString& sContents);
+
+ virtual IPWL_NoteItem* CreateSubItem();
+ virtual FX_INT32 CountSubItems() const;
+ virtual IPWL_NoteItem* GetSubItems(FX_INT32 index) const;
+ virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem);
+ virtual void SetFocus(){SetNoteFocus(FALSE);}
+
+ virtual IPWL_NoteItem* GetParentItem() const;
+ virtual void* GetPrivateData() const;
+ virtual CFX_WideString GetAuthorName() const;
+ virtual CPWL_Color GetBkColor() const;
+ virtual CFX_WideString GetContents() const;
+ virtual FX_SYSTEMTIME GetDateTime() const;
+ virtual CFX_WideString GetSubjectName() const;
+ virtual FX_BOOL IsTopItem() const { return FALSE;}
+ virtual CPWL_Edit* GetEdit() const;
+
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual CFX_ByteString GetClassName() const;
+ virtual IPWL_NoteItem* GetHitNoteItem(const CPDF_Point& point);
+ virtual IPWL_NoteItem* GetFocusedNoteItem() const;
+
+ virtual void ResetSubjectName(FX_INT32 nItemIndex);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+public:
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth);
+ virtual FX_FLOAT GetItemLeftMargin();
+ virtual FX_FLOAT GetItemRightMargin();
+ CPWL_NoteItem* CreateNoteItem();
+ CPWL_NoteItem* GetParentNoteItem() const;
+
+ void SetNoteFocus(FX_BOOL bLast);
+ void OnContentsValidate();
+
+ void OnCreateNoteItem();
+
+protected:
+ void PopupNoteItemMenu(const CPDF_Point& point);
+
+ virtual const CPWL_Note* GetNote() const;
+ virtual IPWL_NoteNotify* GetNoteNotify() const;
+
+protected:
+ CPWL_Label* m_pSubject;
+ CPWL_Label* m_pDateTime;
+ CPWL_Note_Contents* m_pContents;
+
+private:
+ void* m_pPrivateData;
+ FX_SYSTEMTIME m_dtNote;
+ CFX_WideString m_sAuthor;
+
+ FX_FLOAT m_fOldItemHeight;
+ FX_BOOL m_bSizeChanged;
+ FX_BOOL m_bAllowModify;
+};
+
+class PWL_CLASS CPWL_Note : public CPWL_NoteItem
+{
+public:
+ CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler);
+ virtual ~CPWL_Note();
+
+public:
+ virtual void SetSubjectName(const CFX_WideString& sName);
+ virtual void SetAuthorName(const CFX_WideString& sName);
+ virtual CFX_WideString GetAuthorName() const;
+ virtual void SetBkColor(const CPWL_Color& color);
+ virtual void ResetSubjectName(FX_INT32 nItemIndex){}
+ virtual FX_BOOL IsTopItem() const {return TRUE;}
+ virtual const CPWL_Note* GetNote() const;
+ virtual IPWL_NoteNotify* GetNoteNotify() const;
+
+public:
+ IPWL_NoteItem* Reply();
+ void EnableNotify(FX_BOOL bEnabled);
+ void SetIconType(FX_INT32 nType);
+ void SetOptionsText(const CFX_WideString& sText);
+ void EnableRead(FX_BOOL bEnabled);
+ void EnableModify(FX_BOOL bEnabled);
+
+ CFX_WideString GetReplyString() const;
+ void SetReplyString(const CFX_WideString& string);
+
+ //0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options
+ FX_INT32 NoteHitTest(const CPDF_Point& point) const;
+ CPDF_Rect GetCaptionRect() const {return m_rcCaption;}
+ IPopup_Note* GetPopupNote() const {return m_pPopupNote;}
+
+public:
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ FX_BOOL ResetScrollBar();
+ void RePosNoteChildren();
+ FX_BOOL ScrollBarShouldVisible();
+
+private:
+ CPWL_Label* m_pAuthor;
+ CPWL_Note_Icon* m_pIcon;
+ CPWL_Note_CloseBox* m_pCloseBox;
+ CPWL_Note_LBBox* m_pLBBox;
+ CPWL_Note_RBBox* m_pRBBox;
+ CPWL_ScrollBar* m_pContentsBar;
+ CPWL_Note_Options* m_pOptions;
+ IPWL_NoteNotify* m_pNoteNotify;
+ FX_BOOL m_bResizing;
+ PWL_SCROLL_INFO m_OldScrollInfo;
+ CPDF_Rect m_rcCaption;
+ FX_BOOL m_bEnalbleNotify;
+ IPopup_Note* m_pPopupNote;
+ IPWL_NoteHandler* m_pNoteHandler;
+ CFX_WideString m_sReplyString;
+};
+
+#endif
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h b/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h
new file mode 100644
index 0000000000..3196b2209e
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_ScrollBar.h
@@ -0,0 +1,166 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_SCROLLBAR_H_
+#define _PWL_SCROLLBAR_H_
+
+class CPWL_SBButton;
+class CPWL_ScrollBar;
+
+struct PWL_SCROLL_INFO
+{
+public:
+ PWL_SCROLL_INFO() : fContentMin(0.0f), fContentMax(0.0f), fPlateWidth(0.0f), fBigStep(0.0f), fSmallStep(0.0f)
+ {
+ }
+ FX_FLOAT fContentMin;
+ FX_FLOAT fContentMax;
+ FX_FLOAT fPlateWidth;
+ FX_FLOAT fBigStep;
+ FX_FLOAT fSmallStep;
+};
+
+enum PWL_SCROLLBAR_TYPE
+{
+ SBT_HSCROLL,
+ SBT_VSCROLL
+};
+
+enum PWL_SBBUTTON_TYPE
+{
+ PSBT_MIN,
+ PSBT_MAX,
+ PSBT_POS
+};
+
+class CPWL_SBButton : public CPWL_Wnd
+{
+public:
+ CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType);
+ virtual ~CPWL_SBButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+
+protected:
+ PWL_SCROLLBAR_TYPE m_eScrollBarType;
+ PWL_SBBUTTON_TYPE m_eSBButtonType;
+
+ FX_BOOL m_bMouseDown;
+};
+
+struct PWL_FLOATRANGE
+{
+public:
+ PWL_FLOATRANGE();
+ PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max);
+ void Default();
+ void Set(FX_FLOAT min,FX_FLOAT max);
+ FX_BOOL In(FX_FLOAT x) const;
+ FX_FLOAT GetWidth() const;
+
+ FX_FLOAT fMin,fMax;
+};
+
+struct PWL_SCROLL_PRIVATEDATA
+{
+public:
+ PWL_SCROLL_PRIVATEDATA();
+
+ void Default();
+ void SetScrollRange(FX_FLOAT min,FX_FLOAT max);
+ void SetClientWidth(FX_FLOAT width);
+ void SetSmallStep(FX_FLOAT step);
+ void SetBigStep(FX_FLOAT step);
+ FX_BOOL SetPos(FX_FLOAT pos);
+
+ void AddSmall();
+ void SubSmall();
+ void AddBig();
+ void SubBig();
+
+ PWL_FLOATRANGE ScrollRange;
+ FX_FLOAT fClientWidth;
+ FX_FLOAT fScrollPos;
+ FX_FLOAT fBigStep;
+ FX_FLOAT fSmallStep;
+};
+
+class CPWL_ScrollBar : public CPWL_Wnd
+{
+public:
+ CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType = SBT_HSCROLL);
+ virtual ~CPWL_ScrollBar();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ FX_FLOAT GetScrollBarWidth() const;
+ PWL_SCROLLBAR_TYPE GetScrollBarType() const {return m_sbType;};
+
+ void SetNotifyForever(FX_BOOL bForever) {m_bNotifyForever = bForever;}
+
+protected:
+ void SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth);
+ void SetScrollPos(FX_FLOAT fPos);
+ void MovePosButton(FX_BOOL bRefresh);
+ void SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep);
+ void NotifyScrollWindow();
+ CPDF_Rect GetScrollArea() const;
+
+private:
+ void CreateButtons(const PWL_CREATEPARAM & cp);
+
+ void OnMinButtonLBDown(const CPDF_Point & point);
+ void OnMinButtonLBUp(const CPDF_Point & point);
+ void OnMinButtonMouseMove(const CPDF_Point & point);
+
+ void OnMaxButtonLBDown(const CPDF_Point & point);
+ void OnMaxButtonLBUp(const CPDF_Point & point);
+ void OnMaxButtonMouseMove(const CPDF_Point & point);
+
+ void OnPosButtonLBDown(const CPDF_Point & point);
+ void OnPosButtonLBUp(const CPDF_Point & point);
+ void OnPosButtonMouseMove(const CPDF_Point & point);
+
+ FX_FLOAT TrueToFace(FX_FLOAT);
+ FX_FLOAT FaceToTrue(FX_FLOAT);
+
+ virtual void TimerProc();
+
+private:
+ PWL_SCROLLBAR_TYPE m_sbType;
+ PWL_SCROLL_INFO m_OriginInfo;
+ CPWL_SBButton* m_pMinButton;
+ CPWL_SBButton* m_pMaxButton;
+ CPWL_SBButton* m_pPosButton;
+ PWL_SCROLL_PRIVATEDATA m_sData;
+ FX_BOOL m_bMouseDown;
+ FX_BOOL m_bMinOrMax;
+ FX_BOOL m_bNotifyForever;
+ FX_FLOAT m_nOldPos;
+ FX_FLOAT m_fOldPosButton;
+};
+
+#endif // !defined(AFX_PWL_SCROLLBAR_H__DCFEC082_2651_48A4_B8F3_63F1B3CC5E10__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Signature.h b/fpdfsdk/include/pdfwindow/PWL_Signature.h
new file mode 100644
index 0000000000..712f7408ea
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Signature.h
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_SIGNATURE_H_
+#define _PWL_SIGNATURE_H_
+
+class CPWL_Signature;
+class CPWL_Label;
+class CPWL_Signature_Image;
+
+class CPWL_Signature_Image : public CPWL_Image
+{
+public:
+ CPWL_Signature_Image();
+ virtual ~CPWL_Signature_Image();
+
+ void SetImage(CFX_DIBSource* pImage);
+ CFX_DIBSource* GetImage();
+
+protected:
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+ virtual void GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale);
+
+private:
+ CFX_DIBSource* m_pImage;
+};
+
+class PWL_CLASS CPWL_Signature : public CPWL_Wnd
+{
+public:
+ CPWL_Signature();
+ virtual ~CPWL_Signature();
+
+ void SetText(FX_LPCWSTR sText);
+ void SetDescription(FX_LPCWSTR string);
+ void SetImage(CFX_DIBSource* pImage);
+ void SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias);
+
+ void SetTextFlag(FX_BOOL bTextExist);
+ void SetImageFlag(FX_BOOL bImageExist);
+ void SetFoxitFlag(FX_BOOL bFlagExist);
+
+protected:
+ virtual void RePosChildWnd();
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+private:
+ CPWL_Label* m_pText;
+ CPWL_Label* m_pDescription;
+ CPWL_Signature_Image* m_pImage;
+
+ FX_BOOL m_bTextExist;
+ FX_BOOL m_bImageExist;
+ FX_BOOL m_bFlagExist;
+};
+
+#endif // _PWL_SIGNATURE_H_
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h b/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h
new file mode 100644
index 0000000000..55613014a0
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_SpecialButton.h
@@ -0,0 +1,63 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_SPECIALBUTTON_H_
+#define _PWL_SPECIALBUTTON_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+class PWL_CLASS CPWL_PushButton : public CPWL_Button
+{
+public:
+ CPWL_PushButton();
+ virtual ~CPWL_PushButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual CPDF_Rect GetFocusRect() const;
+};
+
+class PWL_CLASS CPWL_CheckBox : public CPWL_Button
+{
+public:
+ CPWL_CheckBox();
+ virtual ~CPWL_CheckBox();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnChar(FX_WORD nChar);
+
+ void SetCheck(FX_BOOL bCheck);
+ FX_BOOL IsChecked() const;
+
+private:
+ FX_BOOL m_bChecked;
+};
+
+class PWL_CLASS CPWL_RadioButton : public CPWL_Button
+{
+public:
+ CPWL_RadioButton();
+ virtual ~CPWL_RadioButton();
+
+public:
+ virtual CFX_ByteString GetClassName() const;
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point);
+ virtual FX_BOOL OnChar(FX_WORD nChar);
+
+ void SetCheck(FX_BOOL bCheck);
+ FX_BOOL IsChecked() const;
+
+private:
+ FX_BOOL m_bChecked;
+};
+
+#endif
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Utils.h b/fpdfsdk/include/pdfwindow/PWL_Utils.h
new file mode 100644
index 0000000000..2eccc363fd
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Utils.h
@@ -0,0 +1,237 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_UTILS_H_
+#define _PWL_UTILS_H_
+
+template<class T> T PWL_MIN (const T & i, const T & j) { return ((i < j) ? i : j); }
+template<class T> T PWL_MAX (const T & i, const T & j) { return ((i > j) ? i : j); }
+
+#define PWL_PDF2WIN(color) (FX_BYTE(color*255))
+#define PWL_WIN2PDF(color) ((FX_FLOAT)((FX_FLOAT)color/255.0f))
+
+#define PWL_MAKEDWORD(low,high) ((FX_DWORD)((FX_WORD)(low) | (FX_DWORD)(((FX_WORD)(high))<<16)))
+#define PWL_GETLOWWORD(dword) ((FX_WORD)(dword))
+#define PWL_GETHIGHWORD(dword) ((FX_WORD)(dword>>16))
+
+#define PWL_ICONTYPE_CHECKMARK 0
+#define PWL_ICONTYPE_CIRCLE 1
+#define PWL_ICONTYPE_COMMENT 2
+#define PWL_ICONTYPE_CROSS 3
+#define PWL_ICONTYPE_HELP 4
+#define PWL_ICONTYPE_INSERTTEXT 5
+#define PWL_ICONTYPE_KEY 6
+#define PWL_ICONTYPE_NEWPARAGRAPH 7
+#define PWL_ICONTYPE_TEXTNOTE 8
+#define PWL_ICONTYPE_PARAGRAPH 9
+#define PWL_ICONTYPE_RIGHTARROW 10
+#define PWL_ICONTYPE_RIGHTPOINTER 11
+#define PWL_ICONTYPE_STAR 12
+#define PWL_ICONTYPE_UPARROW 13
+#define PWL_ICONTYPE_UPLEFTARROW 14
+
+#define PWL_ICONTYPE_GRAPH 15
+#define PWL_ICONTYPE_PAPERCLIP 16
+#define PWL_ICONTYPE_ATTACHMENT 17
+#define PWL_ICONTYPE_TAG 18
+
+#define PWL_ICONTYPE_FOXIT 19
+
+#define PWL_ICONTYPE_UNKNOWN -1
+
+//checkbox & radiobutton style
+#define PCS_CHECK 0
+#define PCS_CIRCLE 1
+#define PCS_CROSS 2
+#define PCS_DIAMOND 3
+#define PCS_SQUARE 4
+#define PCS_STAR 5
+
+#define PWL_PI 3.14159265358979f
+#define PWL_BEZIER 0.5522847498308f
+
+//pushbutton layout style
+#define PPBL_LABEL 0
+#define PPBL_ICON 1
+#define PPBL_ICONTOPLABELBOTTOM 2
+#define PPBL_LABELTOPICONBOTTOM 3
+#define PPBL_ICONLEFTLABELRIGHT 4
+#define PPBL_LABELLEFTICONRIGHT 5
+#define PPBL_LABELOVERICON 6
+
+class CPWL_Point : public CPDF_Point
+{
+public:
+ CPWL_Point() : CPDF_Point(0.0f,0.0f){}
+ CPWL_Point(FX_FLOAT fx, FX_FLOAT fy) : CPDF_Point(fx,fy) {}
+ CPWL_Point(const CPWL_Point& point) : CPDF_Point(point.x, point.y) {}
+};
+
+enum PWL_PATHDATA_TYPE
+{
+ PWLPT_MOVETO,
+ PWLPT_LINETO,
+ PWLPT_BEZIERTO,
+ PWLPT_UNKNOWN
+};
+
+enum PWL_PATH_TYPE
+{
+ PWLPT_PATHDATA,
+ PWLPT_STREAM
+};
+
+class CPWL_PathData
+{
+public:
+ CPWL_PathData() : point(), type(PWLPT_UNKNOWN){}
+ CPWL_PathData(const CPWL_Point& pt, PWL_PATHDATA_TYPE tp) : point(pt), type(tp) {}
+
+ CPWL_Point point;
+ PWL_PATHDATA_TYPE type;
+};
+
+class IPWL_SpellCheck;
+
+class PWL_CLASS CPWL_Utils
+{
+public:
+ static CPDF_Rect InflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
+ static CPDF_Rect DeflateRect(const CPDF_Rect& rcRect, FX_FLOAT fSize);
+ static FX_BOOL IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2);
+ static FX_BOOL ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild);
+ static CPDF_Rect ScaleRect(const CPDF_Rect& rcRect,FX_FLOAT fScale);
+ static CPVT_WordRange OverlapWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2);
+ static CPDF_Rect GetCenterSquare(const CPDF_Rect & rect);
+ static CPWL_Color SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub);
+ static CPWL_Color DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide);
+ static CPDF_Rect MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2);
+ static CPDF_Rect OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y);
+ static CPDF_Point OffsetPoint(const CPDF_Point & point,FX_FLOAT x,FX_FLOAT y);
+ static FX_COLORREF PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy = 255);
+ static FX_BOOL IsBlackOrWhite(const CPWL_Color& color);
+ static CPWL_Color GetReverseColor(const CPWL_Color& color);
+
+ static CFX_ByteString GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke = TRUE);
+ static CFX_ByteString GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash);
+ static CFX_ByteString GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash);
+ static CFX_ByteString GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);
+ static CFX_ByteString GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color);
+
+ static CFX_ByteString GetPushButtonAppStream(const CPDF_Rect & rcBBox,
+ IFX_Edit_FontMap * pFontMap,
+ CPDF_Stream * pIconStream,
+ CPDF_IconFit & IconFit,
+ const CFX_WideString & sLabel,
+ const CPWL_Color & crText,
+ FX_FLOAT fFontSize,
+ FX_INT32 nLayOut);
+ static CFX_ByteString GetCheckBoxAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText);
+ static CFX_ByteString GetRadioButtonAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText);
+
+ static CFX_ByteString GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange = NULL,
+ FX_BOOL bContinuous = TRUE, FX_WORD SubWord = 0);
+ static CFX_ByteString GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange = NULL);
+ static CFX_ByteString GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck,
+ const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange = NULL);
+ static CFX_ByteString GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
+ const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,
+ FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText);
+ static CFX_ByteString GetDropButtonAppStream(const CPDF_Rect & rcBBox);
+
+ static void DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const CPWL_Color & color, FX_INT32 nTransparancy);
+ static void DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect,const FX_COLORREF & color);
+ static void DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color, FX_FLOAT fWidth);
+ static void DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth);
+ static void DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy);
+ static void DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color);
+ static void DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
+ FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray);
+ static void DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
+ IPWL_SpellCheck* pSpellCheck);
+public:
+ static void ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);
+ static void ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);
+
+ static void ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray);
+ static void ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB);
+
+ static void ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray);
+ static void ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK);
+
+ static void PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue);
+
+public:
+ static CFX_ByteString GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill,
+ const CPWL_Color& crStroke = PWL_DEFAULT_BLACKCOLOR);
+ static void DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill,
+ const CPWL_Color& crStroke, const FX_INT32 nTransparancy);
+
+private:
+ static CFX_ByteString GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount);
+ static void GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount);
+
+ static CFX_ByteString GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+ static CFX_ByteString GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText);
+
+ static CFX_ByteString GetAP_Check(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Circle(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Cross(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Diamond(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Square(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_Star(const CPDF_Rect & crBBox);
+ static CFX_ByteString GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate);
+
+ static void GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+ static void GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type);
+};
+
+#endif // !defined(AFX_PWL_UTILS_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)
+
+
diff --git a/fpdfsdk/include/pdfwindow/PWL_Wnd.h b/fpdfsdk/include/pdfwindow/PWL_Wnd.h
new file mode 100644
index 0000000000..7e9e25d07a
--- /dev/null
+++ b/fpdfsdk/include/pdfwindow/PWL_Wnd.h
@@ -0,0 +1,493 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _PWL_WND_H_
+#define _PWL_WND_H_
+
+class IPWL_Provider;
+class CPWL_Wnd;
+class CPWL_MsgControl;
+class CPWL_Wnd;
+class CPWL_ScrollBar;
+class CPWL_Timer;
+class CPWL_TimerHandler;
+class IPWL_SpellCheck;
+class IFX_SystemHandler;
+
+#ifdef FX_READER_DLL
+ #ifdef PWL_EXPORT
+ #define PWL_CLASS __declspec(dllexport)
+ #define PWL_FUNCTION PWL_CLASS
+ #else
+ #define PWL_CLASS
+ #define PWL_FUNCTION
+ #endif
+#else
+ #define PWL_CLASS
+ #define PWL_FUNCTION
+#endif
+
+//window styles
+#define PWS_CHILD 0x80000000L
+#define PWS_BORDER 0x40000000L
+#define PWS_BACKGROUND 0x20000000L
+#define PWS_HSCROLL 0x10000000L
+#define PWS_VSCROLL 0x08000000L
+#define PWS_VISIBLE 0x04000000L
+#define PWS_DISABLE 0x02000000L
+#define PWS_READONLY 0x01000000L
+#define PWS_AUTOFONTSIZE 0x00800000L
+#define PWS_AUTOTRANSPARENT 0x00400000L
+#define PWS_NOREFRESHCLIP 0x00200000L
+
+//edit and label styles
+#define PES_MULTILINE 0x0001L
+#define PES_PASSWORD 0x0002L
+#define PES_LEFT 0x0004L
+#define PES_RIGHT 0x0008L
+#define PES_MIDDLE 0x0010L
+#define PES_TOP 0x0020L
+#define PES_BOTTOM 0x0040L
+#define PES_CENTER 0x0080L
+#define PES_CHARARRAY 0x0100L
+#define PES_AUTOSCROLL 0x0200L
+#define PES_AUTORETURN 0x0400L
+#define PES_UNDO 0x0800L
+#define PES_RICH 0x1000L
+#define PES_SPELLCHECK 0x2000L
+#define PES_TEXTOVERFLOW 0x4000L
+#define PES_NOREAD 0x8000L
+
+//listbox styles
+#define PLBS_MULTIPLESEL 0x0001L
+#define PLBS_HOVERSEL 0x0008L
+
+//combobox styles
+#define PCBS_ALLOWCUSTOMTEXT 0x0001L
+
+//richedit styles
+#define PRES_MULTILINE 0x0001L
+#define PRES_AUTORETURN 0x0002L
+#define PRES_AUTOSCROLL 0x0004L
+#define PRES_SPELLCHECK 0x0008L
+#define PRES_UNDO 0x0100L
+#define PRES_MULTIPAGES 0x0200L
+#define PRES_TEXTOVERFLOW 0x0400L
+
+//border style
+#define PBS_SOLID 0
+#define PBS_DASH 1
+#define PBS_BEVELED 2
+#define PBS_INSET 3
+#define PBS_UNDERLINED 4
+#define PBS_SHADOW 5
+
+//notification messages
+#define PNM_ADDCHILD 0x00000000L
+#define PNM_REMOVECHILD 0x00000001L
+#define PNM_SETSCROLLINFO 0x00000002L
+#define PNM_SETSCROLLPOS 0x00000003L
+#define PNM_SCROLLWINDOW 0x00000004L
+#define PNM_LBUTTONDOWN 0x00000005L
+#define PNM_LBUTTONUP 0x00000006L
+#define PNM_MOUSEMOVE 0x00000007L
+#define PNM_NOTERESET 0x00000008L
+#define PNM_SETCARETINFO 0x00000009L
+#define PNM_SELCHANGED 0x0000000AL
+#define PNM_NOTEEDITCHANGED 0x0000000BL
+
+#define PWL_CLASSNAME_EDIT "CPWL_Edit"
+
+struct CPWL_Dash
+{
+ CPWL_Dash(FX_INT32 dash, FX_INT32 gap, FX_INT32 phase) : nDash(dash), nGap(gap), nPhase(phase)
+ {}
+
+ FX_INT32 nDash;
+ FX_INT32 nGap;
+ FX_INT32 nPhase;
+};
+
+struct PWL_CLASS CPWL_Color
+{
+ CPWL_Color(FX_INT32 type = COLORTYPE_TRANSPARENT, FX_FLOAT color1 = 0.0f, FX_FLOAT color2 = 0.0f, FX_FLOAT color3 = 0.0f, FX_FLOAT color4 = 0.0f)
+ : nColorType(type), fColor1(color1), fColor2(color2), fColor3(color3), fColor4(color4)
+ {}
+
+ CPWL_Color(FX_INT32 r, FX_INT32 g, FX_INT32 b) :
+ nColorType(COLORTYPE_RGB), fColor1(r/255.0f), fColor2(g/255.0f), fColor3(b/255.0f), fColor4(0)
+ {}
+
+ void ConvertColorType(FX_INT32 nColorType);
+
+ /*
+ COLORTYPE_TRANSPARENT
+ COLORTYPE_RGB
+ COLORTYPE_CMYK
+ COLORTYPE_GRAY
+ */
+ FX_INT32 nColorType;
+ FX_FLOAT fColor1,fColor2,fColor3,fColor4;
+};
+
+inline FX_BOOL operator == (const CPWL_Color &c1, const CPWL_Color &c2)
+{
+ return c1.nColorType == c2.nColorType &&
+ c1.fColor1 - c2.fColor1 < 0.0001 && c1.fColor1 - c2.fColor1 > -0.0001 &&
+ c1.fColor2 - c2.fColor2 < 0.0001 && c1.fColor2 - c2.fColor2 > -0.0001 &&
+ c1.fColor3 - c2.fColor3 < 0.0001 && c1.fColor3 - c2.fColor3 > -0.0001 &&
+ c1.fColor4 - c2.fColor4 < 0.0001 && c1.fColor4 - c2.fColor4 > -0.0001;
+}
+
+inline FX_BOOL operator != (const CPWL_Color &c1, const CPWL_Color &c2)
+{
+ return !operator == (c1, c2);
+}
+
+#define PWL_SCROLLBAR_WIDTH 12.0f
+#define PWL_SCROLLBAR_BUTTON_WIDTH 9.0f
+#define PWL_SCROLLBAR_POSBUTTON_MINWIDTH 2.0f
+#define PWL_SCROLLBAR_TRANSPARANCY 150
+#define PWL_SCROLLBAR_BKCOLOR CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f)
+#define PWL_DEFAULT_SELTEXTCOLOR CPWL_Color(COLORTYPE_RGB,1,1,1)
+#define PWL_DEFAULT_SELBACKCOLOR CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f)
+#define PWL_DEFAULT_BACKCOLOR PWL_DEFAULT_SELTEXTCOLOR
+#define PWL_DEFAULT_TEXTCOLOR CPWL_Color(COLORTYPE_RGB,0,0,0)
+#define PWL_DEFAULT_FONTSIZE 9.0f
+#define PWL_DEFAULT_BLACKCOLOR CPWL_Color(COLORTYPE_GRAY,0)
+#define PWL_DEFAULT_WHITECOLOR CPWL_Color(COLORTYPE_GRAY,1)
+#define PWL_DEFAULT_HEAVYGRAYCOLOR CPWL_Color(COLORTYPE_GRAY,0.50)
+#define PWL_DEFAULT_LIGHTGRAYCOLOR CPWL_Color(COLORTYPE_GRAY,0.75)
+#define PWL_TRIANGLE_HALFLEN 2.0f
+#define PWL_CBBUTTON_TRIANGLE_HALFLEN 3.0f
+#define PWL_INVALIDATE_INFLATE 2
+
+class IPWL_SpellCheck
+{
+public:
+ virtual FX_BOOL CheckWord(FX_LPCSTR sWord) = 0;
+ virtual void SuggestWords(FX_LPCSTR sWord, CFX_ByteStringArray & sSuggest) = 0;
+};
+
+class IPWL_Provider
+{
+public:
+ //get a matrix which map user space to CWnd client space
+ virtual CPDF_Matrix GetWindowMatrix(void* pAttachedData) = 0;
+
+ /*
+ 0 L"&Undo\tCtrl+Z"
+ 1 L"&Redo\tCtrl+Shift+Z"
+ 2 L"Cu&t\tCtrl+X"
+ 3 L"&Copy\tCtrl+C"
+ 4 L"&Paste\tCtrl+V"
+ 5 L"&Delete"
+ 6 L"&Select All\tCtrl+A"
+ */
+ virtual CFX_WideString LoadPopupMenuString(FX_INT32 nIndex) = 0;
+};
+
+class IPWL_FocusHandler
+{
+public:
+ virtual void OnSetFocus(CPWL_Wnd* pWnd) = 0;
+ virtual void OnKillFocus(CPWL_Wnd* pWnd) = 0;
+};
+
+struct PWL_CREATEPARAM
+{
+public:
+ PWL_CREATEPARAM() : rcRectWnd(0,0,0,0),
+ pSystemHandler(NULL),
+ pFontMap(NULL),
+ pProvider(NULL),
+ pFocusHandler(NULL),
+ dwFlags(0),
+ sBackgroundColor(),
+ hAttachedWnd(NULL),
+ pSpellCheck(NULL),
+ nBorderStyle(PBS_SOLID),
+ dwBorderWidth(1),
+ sBorderColor(),
+ sTextColor(),
+ sTextStrokeColor(),
+ nTransparency(255),
+ fFontSize(PWL_DEFAULT_FONTSIZE),
+ sDash(3,0,0),
+ pAttachedData(NULL),
+ pParentWnd(NULL),
+ pMsgControl(NULL),
+ eCursorType(FXCT_ARROW),
+ mtChild(1,0,0,1,0,0)
+ {
+ }
+
+ CPDF_Rect rcRectWnd; //required
+ IFX_SystemHandler* pSystemHandler; //required
+ IFX_Edit_FontMap* pFontMap; //required for text window
+ IPWL_Provider* pProvider; //required for self coordinate
+ IPWL_FocusHandler* pFocusHandler; //optional
+ FX_DWORD dwFlags; //optional
+ CPWL_Color sBackgroundColor; //optional
+ FX_HWND hAttachedWnd; //required for no-reader framework
+ IPWL_SpellCheck* pSpellCheck; //required for spellchecking
+ FX_INT32 nBorderStyle; //optional
+ FX_INT32 dwBorderWidth; //optional
+ CPWL_Color sBorderColor; //optional
+ CPWL_Color sTextColor; //optional
+ CPWL_Color sTextStrokeColor; //optional
+ FX_INT32 nTransparency; //optional
+ FX_FLOAT fFontSize; //optional
+ CPWL_Dash sDash; //optional
+ void* pAttachedData; //optional
+ CPWL_Wnd* pParentWnd; //ignore
+ CPWL_MsgControl* pMsgControl; //ignore
+ FX_INT32 eCursorType; //ignore
+ CPDF_Matrix mtChild; //ignore
+};
+
+class CPWL_Timer
+{
+public:
+ CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler);
+ virtual ~CPWL_Timer();
+
+ FX_INT32 SetPWLTimer(FX_INT32 nElapse);
+ void KillPWLTimer();
+ static void TimerProc(FX_INT32 idEvent);
+
+private:
+ FX_INT32 m_nTimerID;
+ CPWL_TimerHandler* m_pAttached;
+ IFX_SystemHandler* m_pSystemHandler;
+};
+
+class PWL_CLASS CPWL_TimerHandler
+{
+public:
+ CPWL_TimerHandler();
+ virtual ~CPWL_TimerHandler();
+
+ void BeginTimer(FX_INT32 nElapse);
+ void EndTimer();
+ virtual void TimerProc();
+ virtual IFX_SystemHandler* GetSystemHandler() const = 0;
+
+private:
+ CPWL_Timer* m_pTimer;
+};
+
+class PWL_CLASS CPWL_Wnd : public CPWL_TimerHandler
+{
+ friend class CPWL_MsgControl;
+public:
+ CPWL_Wnd();
+ virtual ~CPWL_Wnd();
+
+ void Create(const PWL_CREATEPARAM & cp);
+ virtual CFX_ByteString GetClassName() const;
+ void Destroy();
+ void Move(const CPDF_Rect & rcNew,FX_BOOL bReset,FX_BOOL bRefresh);
+ virtual void InvalidateRect(CPDF_Rect* pRect = NULL);
+
+ void GetAppearanceStream(CFX_ByteString & sAppStream);
+ void DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnKeyUp(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
+ virtual FX_BOOL OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag);
+
+ virtual void SetFocus();
+ virtual void KillFocus();
+ void SetCapture();
+ void ReleaseCapture();
+
+ virtual void OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
+ virtual void SetTextColor(const CPWL_Color & color);
+ virtual void SetTextStrokeColor(const CPWL_Color & color);
+ virtual void SetVisible(FX_BOOL bVisible);
+
+ virtual CPDF_Rect GetFocusRect() const;
+ virtual CPWL_Color GetBackgroundColor() const;
+ virtual CPWL_Color GetBorderColor() const;
+ virtual CPWL_Color GetTextColor() const;
+ virtual CPWL_Color GetTextStrokeColor() const;
+ virtual FX_FLOAT GetFontSize() const;
+ virtual FX_INT32 GetInnerBorderWidth() const;
+ virtual CPWL_Color GetBorderLeftTopColor(FX_INT32 nBorderStyle) const;
+ virtual CPWL_Color GetBorderRightBottomColor(FX_INT32 nBorderStyle) const;
+
+ virtual FX_BOOL IsModified() const {return FALSE;}
+
+ virtual void SetFontSize(FX_FLOAT fFontSize);
+
+ void SetBackgroundColor(const CPWL_Color & color);
+ void SetBorderColor(const CPWL_Color & color);
+ void SetBorderWidth(FX_INT32 nBorderWidth);
+ void SetClipRect(const CPDF_Rect & rect);
+ void SetBorderStyle(FX_INT32 eBorderStyle);
+ void SetBorderDash(const CPWL_Dash & sDash);
+
+ CPDF_Rect GetOriginWindowRect() const;
+ virtual CPDF_Rect GetWindowRect() const;
+ virtual CPDF_Rect GetClientRect() const;
+ CPDF_Point GetCenterPoint() const;
+ CPDF_Rect GetClientCenterSquare() const;
+ CPDF_Rect GetWindowCenterSquare() const;
+ FX_INT32 GetBorderWidth() const;
+ FX_BOOL IsVisible() const {return m_bVisible;}
+ FX_BOOL HasFlag(FX_DWORD dwFlags) const;
+ void AddFlag(FX_DWORD dwFlags);
+ void RemoveFlag(FX_DWORD dwFlags);
+ CPDF_Rect GetClipRect() const;
+ CPWL_Wnd* GetParentWindow() const;
+ FX_INT32 GetBorderStyle() const;
+ CPWL_Dash GetBorderDash() const;
+ void* GetAttachedData() const;
+
+ FX_BOOL WndHitTest(const CPDF_Point & point) const;
+ FX_BOOL ClientHitTest(const CPDF_Point & point) const;
+ FX_BOOL IsCaptureMouse() const;
+
+ const CPWL_Wnd* GetFocused() const;
+ FX_BOOL IsFocused() const;
+ FX_BOOL IsReadOnly() const;
+ CPWL_ScrollBar* GetVScrollBar() const;
+
+ IFX_Edit_FontMap* GetFontMap() const;
+ IPWL_Provider* GetProvider() const;
+ virtual IFX_SystemHandler* GetSystemHandler() const;
+ IPWL_FocusHandler* GetFocusHandler() const;
+
+ FX_INT32 GetTransparency();
+ void SetTransparency(FX_INT32 nTransparency);
+
+ CPDF_Matrix GetChildToRoot() const;
+ CPDF_Matrix GetChildMatrix() const;
+ void SetChildMatrix(const CPDF_Matrix& mt);
+ CPDF_Matrix GetWindowMatrix() const;
+
+ virtual CPDF_Point ChildToParent(const CPDF_Point& point) const;
+ virtual CPDF_Rect ChildToParent(const CPDF_Rect& rect) const;
+ virtual CPDF_Point ParentToChild(const CPDF_Point& point) const;
+ virtual CPDF_Rect ParentToChild(const CPDF_Rect& rect) const;
+
+ //those methods only implemented by listctrl item
+ virtual FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth) {return 0;}
+ virtual FX_FLOAT GetItemLeftMargin() {return 0;}
+ virtual FX_FLOAT GetItemRightMargin() {return 0;}
+
+ void EnableWindow(FX_BOOL bEnable);
+ FX_BOOL IsEnabled();
+ virtual void SetCursor();
+
+protected:
+ virtual void CreateChildWnd(const PWL_CREATEPARAM & cp);
+ virtual void RePosChildWnd();
+ void GetAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream);
+ virtual void GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream);
+
+ virtual void DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+ virtual void DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device);
+
+ virtual void OnCreate(PWL_CREATEPARAM & cp);
+ virtual void OnCreated();
+ virtual void OnDestroy();
+
+ virtual void OnSetFocus();
+ virtual void OnKillFocus();
+
+ virtual void OnEnabled();
+ virtual void OnDisabled();
+
+ void SetNotifyFlag(FX_BOOL bNotifying = TRUE){m_bNotifying = bNotifying;};
+
+ FX_BOOL IsValid() const;
+ PWL_CREATEPARAM GetCreationParam() const;
+ FX_BOOL IsNotifying() const {return m_bNotifying;}
+
+ void InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew);
+
+ void PWLtoWnd(const CPDF_Point & point, FX_INT32& x, FX_INT32& y) const;
+ FX_RECT PWLtoWnd(const CPDF_Rect & rect) const;
+ FX_HWND GetAttachedHWnd() const;
+
+ FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const;
+ FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const;
+ const CPWL_Wnd* GetRootWnd() const;
+
+ FX_BOOL IsCTRLpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsSHIFTpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsALTpressed(FX_DWORD nFlag) const;
+ FX_BOOL IsINSERTpressed(FX_DWORD nFlag) const;
+
+private:
+ void AddChild(CPWL_Wnd * pWnd);
+ void RemoveChild(CPWL_Wnd * pWnd);
+
+ void CreateScrollBar(const PWL_CREATEPARAM & cp);
+ void CreateVScrollBar(const PWL_CREATEPARAM & cp);
+
+ void AjustStyle();
+ void CreateMsgControl();
+ void DestroyMsgControl();
+
+ CPWL_MsgControl* GetMsgControl() const;
+
+protected:
+ CFX_ArrayTemplate<CPWL_Wnd*> m_aChildren;
+
+private:
+ PWL_CREATEPARAM m_sPrivateParam;
+
+ CPWL_ScrollBar* m_pVScrollBar;
+
+ CPDF_Rect m_rcWindow;
+ CPDF_Rect m_rcClip;
+
+ FX_BOOL m_bCreated;
+ FX_BOOL m_bVisible;
+ FX_BOOL m_bNotifying;
+ FX_BOOL m_bEnabled;
+};
+
+// #ifndef VK_END
+//
+// #define VK_END 0x23
+// #define VK_HOME 0x24
+// #define VK_LEFT 0x25
+// #define VK_UP 0x26
+// #define VK_RIGHT 0x27
+// #define VK_DOWN 0x28
+// #define VK_INSERT 0x2D
+// #define VK_DELETE 0x2E
+//
+// #define VK_BACK 0x08
+// #define VK_TAB 0x09
+//
+// #define VK_CLEAR 0x0C
+// #define VK_RETURN 0x0D
+// #define VK_ESCAPE 0x1B
+// #define VK_SPACE 0x20
+// #endif
+//
+// #define VK_NONE 0
+
+#endif // !defined(AFX_PWL_WND_H__D32812AD_A875_4E08_9D3C_0A57020987C6__INCLUDED_)
+
+
diff --git a/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
new file mode 100644
index 0000000000..59617ac09a
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp
@@ -0,0 +1,300 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+
+CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, IFX_SystemHandler* pSystemHandler) :
+ CPWL_FontMap(pSystemHandler),
+ m_pDocument(NULL),
+ m_pAnnotDict(NULL),
+ m_pDefaultFont(NULL),
+ m_sAPType("N")
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Page* pPage = pAnnot->GetPDFPage();
+
+ m_pDocument = pPage->m_pDocument;
+ m_pAnnotDict = pAnnot->GetPDFAnnot()->m_pAnnotDict;
+}
+
+CBA_FontMap::CBA_FontMap(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict,
+ IFX_SystemHandler* pSystemHandler) :
+ CPWL_FontMap(pSystemHandler),
+ m_pDocument(pDocument),
+ m_pAnnotDict(pAnnotDict),
+ m_pDefaultFont(NULL),
+ m_sAPType("N")
+{
+}
+
+CBA_FontMap::~CBA_FontMap()
+{
+}
+
+void CBA_FontMap::Reset()
+{
+ Empty();
+ m_pDefaultFont = NULL;
+ m_sDefaultFontName = "";
+}
+
+void CBA_FontMap::Initial(FX_LPCSTR fontname)
+{
+ FX_INT32 nCharset = DEFAULT_CHARSET;
+
+ if (!m_pDefaultFont)
+ {
+ m_pDefaultFont = GetAnnotDefaultFont(m_sDefaultFontName);
+ if (m_pDefaultFont)
+ {
+ if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont())
+ nCharset = pSubstFont->m_Charset;
+ else
+ {
+ if (m_sDefaultFontName == "Wingdings" || m_sDefaultFontName == "Wingdings2" ||
+ m_sDefaultFontName == "Wingdings3" || m_sDefaultFontName == "Webdings")
+ nCharset = SYMBOL_CHARSET;
+ else
+ nCharset = ANSI_CHARSET;
+ }
+ AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset);
+ AddFontToAnnotDict(m_pDefaultFont, m_sDefaultFontName);
+ }
+ }
+
+ if (nCharset != ANSI_CHARSET)
+ CPWL_FontMap::Initial(fontname);
+}
+
+void CBA_FontMap::SetDefaultFont(CPDF_Font * pFont, const CFX_ByteString & sFontName)
+{
+ ASSERT(pFont != NULL);
+
+ if (m_pDefaultFont) return;
+
+ m_pDefaultFont = pFont;
+ m_sDefaultFontName = sFontName;
+
+// if (m_sDefaultFontName.IsEmpty())
+// m_sDefaultFontName = pFont->GetFontTypeName();
+
+ FX_INT32 nCharset = DEFAULT_CHARSET;
+ if (const CFX_SubstFont* pSubstFont = m_pDefaultFont->GetSubstFont())
+ nCharset = pSubstFont->m_Charset;
+ AddFontData(m_pDefaultFont, m_sDefaultFontName, nCharset);
+}
+
+CPDF_Font* CBA_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)
+{
+ ASSERT(m_pAnnotDict != NULL);
+
+ if (m_pAnnotDict->GetString("Subtype") == "Widget")
+ {
+ CPDF_Document* pDocument = GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Dictionary * pRootDict = pDocument->GetRoot();
+ if (!pRootDict) return NULL;
+
+ CPDF_Dictionary* pAcroFormDict = pRootDict->GetDict("AcroForm");
+ if (!pAcroFormDict) return NULL;
+
+ CPDF_Dictionary * pDRDict = pAcroFormDict->GetDict("DR");
+ if (!pDRDict) return NULL;
+
+ return FindResFontSameCharset(pDRDict, sFontAlias, nCharset);
+ }
+
+ return NULL;
+}
+
+CPDF_Document* CBA_FontMap::GetDocument()
+{
+ return m_pDocument;
+}
+
+CPDF_Font* CBA_FontMap::FindResFontSameCharset(CPDF_Dictionary* pResDict, CFX_ByteString& sFontAlias,
+ FX_INT32 nCharset)
+{
+ if (!pResDict) return NULL;
+
+ CPDF_Document* pDocument = GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Dictionary* pFonts = pResDict->GetDict("Font");
+ if (pFonts == NULL) return NULL;
+
+ CPDF_Font* pFind = NULL;
+
+ FX_POSITION pos = pFonts->GetStartPos();
+ while (pos)
+ {
+ CPDF_Object* pObj = NULL;
+ CFX_ByteString csKey;
+ pObj = pFonts->GetNextElement(pos, csKey);
+ if (pObj == NULL) continue;
+
+ CPDF_Object* pDirect = pObj->GetDirect();
+ if (pDirect == NULL || pDirect->GetType() != PDFOBJ_DICTIONARY) continue;
+
+ CPDF_Dictionary* pElement = (CPDF_Dictionary*)pDirect;
+ if (pElement->GetString("Type") != "Font") continue;
+
+ CPDF_Font* pFont = pDocument->LoadFont(pElement);
+ if (pFont == NULL) continue;
+ const CFX_SubstFont* pSubst = pFont->GetSubstFont();
+ if (pSubst == NULL) continue;
+ if (pSubst->m_Charset == nCharset)
+ {
+ sFontAlias = csKey;
+ pFind = pFont;
+ }
+ }
+ return pFind;
+}
+
+void CBA_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)
+{
+ AddFontToAnnotDict(pFont, sFontAlias);
+}
+
+void CBA_FontMap::AddFontToAnnotDict(CPDF_Font* pFont, const CFX_ByteString& sAlias)
+{
+ if (!pFont) return;
+
+ ASSERT(m_pAnnotDict != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict("AP");
+
+ if (pAPDict == NULL)
+ {
+ pAPDict = FX_NEW CPDF_Dictionary;
+ m_pAnnotDict->SetAt("AP", pAPDict);
+ }
+
+ //to avoid checkbox and radiobutton
+ CPDF_Object* pObject = pAPDict->GetElement(m_sAPType);
+ if (pObject && pObject->GetType() == PDFOBJ_DICTIONARY)
+ return;
+
+ CPDF_Stream* pStream = pAPDict->GetStream(m_sAPType);
+ if (pStream == NULL)
+ {
+ pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ FX_INT32 objnum = m_pDocument->AddIndirectObject(pStream);
+ pAPDict->SetAtReference(m_sAPType, m_pDocument, objnum);
+ }
+
+ CPDF_Dictionary * pStreamDict = pStream->GetDict();
+
+ if (!pStreamDict)
+ {
+ pStreamDict = FX_NEW CPDF_Dictionary;
+ pStream->InitStream(NULL, 0, pStreamDict);
+ }
+
+ if (pStreamDict)
+ {
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (!pStreamResList)
+ {
+ pStreamResList = FX_NEW CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pStreamResList);
+ }
+
+ if (pStreamResList)
+ {
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
+ if (!pStreamResFontList)
+ {
+ pStreamResFontList = FX_NEW CPDF_Dictionary;
+ FX_INT32 objnum = m_pDocument->AddIndirectObject(pStreamResFontList);
+ pStreamResList->SetAtReference("Font", m_pDocument, objnum);
+ }
+ if (!pStreamResFontList->KeyExist(sAlias))
+ pStreamResFontList->SetAtReference(sAlias, m_pDocument, pFont->GetFontDict());
+ }
+ }
+}
+
+CPDF_Font* CBA_FontMap::GetAnnotDefaultFont(CFX_ByteString &sAlias)
+{
+ ASSERT(m_pAnnotDict != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pAcroFormDict = NULL;
+
+ FX_BOOL bWidget = (m_pAnnotDict->GetString("Subtype") == "Widget");
+
+ if (bWidget)
+ {
+ if (CPDF_Dictionary * pRootDict = m_pDocument->GetRoot())
+ pAcroFormDict = pRootDict->GetDict("AcroForm");
+ }
+
+ CFX_ByteString sDA;
+
+ sDA = FPDF_GetFieldAttr(m_pAnnotDict, "DA")->GetString();
+
+ if (bWidget)
+ {
+ if (sDA.IsEmpty())
+ {
+ sDA = FPDF_GetFieldAttr(pAcroFormDict, "DA")->GetString();
+ }
+ }
+
+ CPDF_Dictionary * pFontDict = NULL;
+
+ if (!sDA.IsEmpty())
+ {
+ CPDF_SimpleParser syntax(sDA);
+ syntax.FindTagParam("Tf", 2);
+ CFX_ByteString sFontName = syntax.GetWord();
+ sAlias = PDF_NameDecode(sFontName).Mid(1);
+
+ if (CPDF_Dictionary * pDRDict = m_pAnnotDict->GetDict("DR"))
+ if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font"))
+ pFontDict = pDRFontDict->GetDict(sAlias);
+
+ if (!pFontDict)
+ if (CPDF_Dictionary* pAPDict = m_pAnnotDict->GetDict("AP"))
+ if (CPDF_Dictionary* pNormalDict = pAPDict->GetDict("N"))
+ if (CPDF_Dictionary* pNormalResDict = pNormalDict->GetDict("Resources"))
+ if (CPDF_Dictionary* pResFontDict = pNormalResDict->GetDict("Font"))
+ pFontDict = pResFontDict->GetDict(sAlias);
+
+ if (bWidget)
+ {
+ if (!pFontDict)
+ {
+ if (pAcroFormDict)
+ {
+ if (CPDF_Dictionary * pDRDict = pAcroFormDict->GetDict("DR"))
+ if (CPDF_Dictionary* pDRFontDict = pDRDict->GetDict("Font"))
+ pFontDict = pDRFontDict->GetDict(sAlias);
+ }
+ }
+ }
+ }
+
+ if (pFontDict)
+ return m_pDocument->LoadFont(pFontDict);
+ else
+ return NULL;
+}
+
+void CBA_FontMap::SetAPType(const CFX_ByteString& sAPType)
+{
+ m_sAPType = sAPType;
+
+ Reset();
+ Initial();
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_CheckBox.cpp b/fpdfsdk/src/formfiller/FFL_CheckBox.cpp
new file mode 100644
index 0000000000..db79926733
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_CheckBox.cpp
@@ -0,0 +1,144 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_CheckBox.h"
+
+
+/* ------------------------------- CFFL_CheckBox ------------------------------- */
+
+CFFL_CheckBox::CFFL_CheckBox(CPDFDoc_Environment* pApp, CPDFSDK_Widget* pWidget) :
+ CFFL_Button(pApp, pWidget)
+{
+}
+
+CFFL_CheckBox::~CFFL_CheckBox()
+{
+}
+
+CPWL_Wnd* CFFL_CheckBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_CheckBox* pWnd = new CPWL_CheckBox();
+ pWnd->Create(cp);
+
+ ASSERT(m_pWidget != NULL);
+ pWnd->SetCheck(m_pWidget->IsChecked());
+
+ return pWnd;
+}
+
+FX_BOOL CFFL_CheckBox::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+{
+ switch (nKeyCode)
+ {
+ case FWL_VKEY_Return:
+ case FWL_VKEY_Space:
+ return TRUE;
+ default:
+ return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags);
+ }
+}
+FX_BOOL CFFL_CheckBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ switch (nChar)
+ {
+ case FWL_VKEY_Return:
+ case FWL_VKEY_Space:
+ {
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ ASSERT(pIFormFiller != NULL);
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ FX_BOOL bReset = FALSE;
+ FX_BOOL bExit = FALSE;
+
+ pIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit,nFlags);
+
+ if (bReset) return TRUE;
+ if (bExit) return TRUE;
+
+ CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+
+ if (CPWL_CheckBox * pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE))
+ pWnd->SetCheck(!pWnd->IsChecked());
+
+ CommitData(pPageView,nFlags);
+ return TRUE;
+ }
+ default:
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+ }
+}
+
+FX_BOOL CFFL_CheckBox::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point);
+
+ if (IsValid())
+ {
+ if (CPWL_CheckBox * pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, TRUE))
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ pWnd->SetCheck(!pWidget->IsChecked());
+ // pWnd->SetCheck(!pWnd->IsChecked());
+ }
+
+ if (!CommitData(pPageView, nFlags)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_CheckBox::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->IsChecked() != m_pWidget->IsChecked();
+ }
+
+ return FALSE;
+}
+
+void CFFL_CheckBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_CheckBox* pWnd = (CPWL_CheckBox*)GetPDFWindow(pPageView, FALSE))
+ {
+
+ FX_BOOL bNewChecked = pWnd->IsChecked();
+
+
+ if (bNewChecked)
+ {
+ CPDF_FormField* pField = m_pWidget->GetFormField();
+ ASSERT(pField != NULL);
+
+ for (FX_INT32 i=0,sz=pField->CountControls(); i<sz; i++)
+ {
+ if (CPDF_FormControl* pCtrl = pField->GetControl(i))
+ {
+ if (pCtrl->IsChecked())
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ m_pWidget->SetCheck(bNewChecked, FALSE);
+ m_pWidget->UpdateField();
+ SetChangeMark();
+ }
+
+}
diff --git a/fpdfsdk/src/formfiller/FFL_ComboBox.cpp b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
new file mode 100644
index 0000000000..3f2c453e5d
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_ComboBox.cpp
@@ -0,0 +1,442 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+#include "../../include/formfiller/FFL_ComboBox.h"
+
+
+/* ------------------------------- CFFL_ComboBox ------------------------------- */
+
+CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
+ CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
+{
+ //m_pFontMap = new CBA_FontMap( pAnnot, GetSystemHandler() );
+ m_State.nIndex = 0;
+ m_State.nStart = 0;
+ m_State.nEnd = 0;
+}
+
+CFFL_ComboBox::~CFFL_ComboBox()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+
+// for (int i=0,sz=m_IMBox.GetSize(); i<sz; i++)
+// {
+// delete m_IMBox.GetAt(i);
+// }
+//
+// m_IMBox.RemoveAll();
+}
+
+PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_EDIT)
+ {
+ cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
+ }
+
+ /*
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ m_bCommitOnSelectChange = TRUE;
+ }
+ */
+
+ if (!m_pFontMap)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
+ m_pFontMap->Initial();
+ }
+
+ cp.pFontMap = m_pFontMap;
+ cp.pFocusHandler = this;
+
+ return cp;
+}
+
+CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_ComboBox * pWnd = new CPWL_ComboBox();
+ pWnd->AttachFFLData(this);
+ pWnd->Create(cp);
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);
+
+ CFX_WideString swText;
+
+ if (nCurSel < 0)
+ swText = m_pWidget->GetValue();
+ else
+ swText = m_pWidget->GetOptionLabel(nCurSel);
+
+ for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ {
+ pWnd->AddString(m_pWidget->GetOptionLabel(i));
+ }
+
+ pWnd->SetSelect(nCurSel);
+ pWnd->SetText(swText);
+
+ return pWnd;
+}
+
+
+FX_BOOL CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+}
+
+FX_BOOL CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_ComboBox * pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ FX_INT32 nCurSel = pWnd->GetSelect();
+
+ ASSERT(m_pWidget != NULL);
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
+ {
+ if (nCurSel >= 0)
+ {
+ return nCurSel != m_pWidget->GetSelectedIndex(0);
+ }
+ else
+ {
+ return pWnd->GetText() != m_pWidget->GetValue();
+ }
+ }
+ else
+ {
+ return nCurSel != m_pWidget->GetSelectedIndex(0);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ CFX_WideString swText = pWnd->GetText();
+ FX_INT32 nCurSel = pWnd->GetSelect();
+
+ //mantis:0004157
+ FX_BOOL bSetValue = TRUE;
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
+ {
+ if (nCurSel >= 0)
+ {
+ if (swText != m_pWidget->GetOptionLabel(nCurSel))
+ bSetValue = TRUE;
+ else
+ bSetValue = FALSE;
+ }
+ else
+ bSetValue = TRUE;
+ }
+ else
+ bSetValue = FALSE;
+
+ CFX_WideString sOldValue;
+
+
+ if (bSetValue)
+ {
+ sOldValue = m_pWidget->GetValue();
+ m_pWidget->SetValue(swText, FALSE);
+ }
+ else
+ {
+ m_pWidget->GetSelectedIndex(0);
+ m_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE);
+ }
+
+ m_pWidget->ResetFieldAppearance(TRUE);
+ m_pWidget->UpdateField();
+ SetChangeMark();
+
+ m_pWidget->GetPDFPage();
+
+
+ }
+}
+
+ void CFFL_ComboBox::GetActionData( CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ fa.bFieldFull = pEdit->IsTextFull();
+ int nSelStart = 0;
+ int nSelEnd = 0;
+ pEdit->GetSel(nSelStart, nSelEnd);
+ fa.nSelEnd = nSelEnd;
+ fa.nSelStart = nSelStart;
+ fa.sValue = pEdit->GetText();
+ fa.sChangeEx = GetSelectExportText();
+
+ if (fa.bFieldFull)
+ {
+ fa.sChange = L"";
+ fa.sChangeEx = L"";
+ }
+ }
+ }
+ break;
+ case CPDF_AAction::Validate:
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ fa.sValue = pEdit->GetText();
+ }
+ }
+ break;
+ case CPDF_AAction::LoseFocus:
+ case CPDF_AAction::GetFocus:
+ ASSERT(m_pWidget != NULL);
+ fa.sValue = m_pWidget->GetValue();
+ break;
+ default:
+ break;
+ }
+}
+
+
+
+void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
+ pEdit->ReplaceSel(fa.sChange);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
+ faOld.sChange != faNew.sChange;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ m_State.nIndex = pComboBox->GetSelect();
+
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->GetSel(m_State.nStart, m_State.nEnd);
+ m_State.sValue = pEdit->GetText();
+ }
+ }
+}
+
+void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))
+ {
+ if (m_State.nIndex >= 0)
+ pComboBox->SetSelect(m_State.nIndex);
+ else
+ {
+ if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
+ {
+ pEdit->SetText(m_State.sValue);
+ pEdit->SetSel(m_State.nStart, m_State.nEnd);
+ }
+ }
+ }
+}
+
+CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
+{
+ if (bRestoreValue)
+ SaveState(pPageView);
+
+ DestroyPDFWindow(pPageView);
+
+ CPWL_Wnd* pRet = NULL;
+
+ if (bRestoreValue)
+ {
+ RestoreState(pPageView);
+ pRet = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag)
+{
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ if (m_bValid)
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CommitData(pPageView, nFlag))
+ {
+ DestroyPDFWindow(pPageView);
+ m_bValid = FALSE;
+ }
+ }
+ }
+}
+
+void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+
+ ASSERT(pWnd != NULL);
+
+ if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
+ {
+ CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+ pEdit->SetCharSet(134);
+ pEdit->SetCodePage(936);
+
+ pEdit->SetReadyToInput();
+ CFX_WideString wsText = pEdit->GetText();
+ int nCharacters = wsText.GetLength();
+ CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
+ unsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;
+ m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+
+ pEdit->SetEditNotify(this);
+ }
+}
+
+void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+}
+
+FX_BOOL CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ return FALSE;
+}
+
+void CFFL_ComboBox::DoCopy(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::DoCut(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::DoPaste(CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+}
+
+void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)
+{
+ ASSERT(pEdit != NULL);
+}
+
+CFX_WideString CFFL_ComboBox::GetSelectExportText()
+{
+ CFX_WideString swRet;
+
+ int nExport = -1;
+ CPDFSDK_PageView *pPageView = GetCurPageView();
+ if (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ nExport = pComboBox->GetSelect();
+ }
+
+ if (nExport >= 0)
+ {
+ if (CPDF_FormField * pFormField = m_pWidget->GetFormField())
+ {
+ swRet = pFormField->GetOptionValue(nExport);
+ if (swRet.IsEmpty())
+ swRet = pFormField->GetOptionLabel(nExport);
+ }
+ }
+
+ return swRet;
+}
diff --git a/fpdfsdk/src/formfiller/FFL_FormFiller.cpp b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
new file mode 100644
index 0000000000..f514bf29d5
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_FormFiller.cpp
@@ -0,0 +1,925 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_Notify.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+
+#define GetRed(rgb) ((FX_BYTE)(rgb))
+#define GetGreen(rgb) ((FX_BYTE)(((FX_WORD)(rgb)) >> 8))
+#define GetBlue(rgb) ((FX_BYTE)((rgb)>>16))
+
+#define FFL_HINT_ELAPSE 800
+
+/* ------------------------- CFFL_FormFiller ------------------------- */
+
+CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
+ :m_pApp(pApp),
+ m_pAnnot(pAnnot),
+ m_bValid(FALSE),
+ m_ptOldPos(0,0)
+{
+ m_pWidget = (CPDFSDK_Widget*) pAnnot;
+}
+
+CFFL_FormFiller::~CFFL_FormFiller()
+{
+ FX_POSITION pos = m_Maps.GetStartPosition();
+ while (pos)
+ {
+ CPDFSDK_PageView * pPageView = NULL;
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.GetNextAssoc(pos, pPageView, pWnd);
+
+ if (pWnd)
+ {
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ pWnd->Destroy();
+ delete pWnd;
+ delete pData;
+ }
+ }
+ m_Maps.RemoveAll();
+
+}
+
+void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow)
+{
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
+ }
+}
+
+CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->GetWindowRect();
+ }
+
+ return CPDF_Rect(0,0,0,0);
+}
+
+FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = m_pWidget->GetRect();
+
+ if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Rect rcWindow = pWnd->GetWindowRect();
+ rcAnnot = PWLtoFFL(rcWindow);
+ }
+
+ CPDF_Rect rcWin = rcAnnot;
+// pPageView->DocToWindow(rcAnnot, rcWin);
+
+ CPDF_Rect rcFocus = this->GetFocusBox(pPageView);
+ if (!rcFocus.IsEmpty())
+ rcWin.Union(rcFocus);
+
+ CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);
+
+ return rect.GetOutterRect();
+}
+
+void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Matrix mt = this->GetCurMatrix();
+ mt.Concat(*pUser2Device);
+ pWnd->DrawAppearance(pDevice,&mt);
+ }
+ else
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (CFFL_IFormFiller::IsVisible(pWidget))
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+}
+
+void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+}
+
+
+void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
+{
+}
+
+void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
+{
+}
+
+void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
+{
+}
+
+void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+}
+
+void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ EndTimer();
+ ASSERT(m_pWidget != NULL);
+}
+
+FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
+ {
+ m_bValid = TRUE;
+ FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+
+ if(!rect.Contains((int)point.x, (int)point.y))
+ return FALSE;
+
+ return pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ FX_RECT rcFFL = this->GetViewBBox(pPageView, pAnnot);
+ this->InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
+ pWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y))
+ {
+ m_ptOldPos = point;
+ }
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
+{
+ if (!IsValid()) return FALSE;
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
+ {
+ return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
+ {
+ pWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->OnRButtonDblClk(WndtoPWL(pPageView, point),nFlags);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+{
+ if (IsValid())
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->OnKeyDown(nKeyCode,nFlags);
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ if (IsValid())
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->OnChar(nChar,nFlags);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(FALSE);
+}
+
+void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(FALSE);
+}
+
+FX_BOOL CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ CPDF_Page * pPage = pWidget->GetPDFPage();
+ CPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc();
+ CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
+ ASSERT(pPageView != NULL);
+
+
+
+ CPWL_Wnd * pWnd = NULL;
+ if ( (pWnd = GetPDFWindow(pPageView, TRUE)))
+ {
+ pWnd->SetFocus();
+ }
+
+ m_bValid = TRUE;
+
+
+
+
+ m_bValid = TRUE;
+ FX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ if (IsValid())
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ CommitData(pPageView, nFlag);
+
+ if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->KillFocus();
+ }
+
+ switch (m_pWidget->GetFieldType())
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ EscapeFiller(pPageView, TRUE);
+ break;
+ default:
+ EscapeFiller(pPageView, FALSE);
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_FormFiller::IsValid() const
+{
+ return m_bValid;
+}
+
+PWL_CREATEPARAM CFFL_FormFiller::GetCreateParam()
+{
+ ASSERT(m_pApp != NULL);
+
+ PWL_CREATEPARAM cp;
+
+ cp.pParentWnd = NULL;
+ cp.pProvider = this;
+ cp.rcRectWnd = GetPDFWindowRect();
+
+ FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
+
+ ASSERT(m_pWidget != NULL);
+
+
+ FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
+
+ if (dwFieldFlag & FIELDFLAG_READONLY)
+ {
+ dwCreateFlags |= PWS_READONLY;
+ }
+
+ FX_COLORREF color;
+ if (m_pWidget->GetFillColor(color))
+ {
+ cp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
+ }
+
+ if (m_pWidget->GetBorderColor(color))
+ {
+ cp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
+ }
+
+ cp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0);
+
+ if (m_pWidget->GetTextColor(color))
+ {
+ cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
+ }
+
+ cp.fFontSize = m_pWidget->GetFontSize();
+ cp.dwBorderWidth = m_pWidget->GetBorderWidth();
+
+ int nBorderStyle = m_pWidget->GetBorderStyle();
+
+ switch (nBorderStyle)
+ {
+ case BBS_SOLID:
+ cp.nBorderStyle = PBS_SOLID;
+ break;
+ case BBS_DASH:
+ cp.nBorderStyle = PBS_DASH;
+ cp.sDash = CPWL_Dash(3,3,0);
+ break;
+ case BBS_BEVELED:
+ cp.nBorderStyle = PBS_BEVELED;
+ cp.dwBorderWidth *= 2;
+ break;
+ case BBS_INSET:
+ cp.nBorderStyle = PBS_INSET;
+ cp.dwBorderWidth *= 2;
+ break;
+ case BBS_UNDERLINE:
+ cp.nBorderStyle = PBS_UNDERLINED;
+ break;
+ }
+
+ if (cp.fFontSize <= 0)
+ {
+ dwCreateFlags |= PWS_AUTOFONTSIZE;
+ }
+
+ cp.dwFlags = dwCreateFlags;
+ cp.pSystemHandler = m_pApp->GetSysHandler();
+ return cp;
+}
+
+CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew)
+{
+ ASSERT(pPageView != NULL);
+ ASSERT(m_pWidget != NULL);
+
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.Lookup(pPageView, pWnd);
+
+ if (bNew)
+ {
+ if (pWnd)
+ {
+ CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ ASSERT(pPrivateData != NULL);
+
+ if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge())
+ {
+ return this->ResetPDFWindow(pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);
+ }
+ }
+ else
+ {
+ PWL_CREATEPARAM cp = GetCreateParam();
+ cp.hAttachedWnd = (FX_HWND)m_pWidget;
+
+ CFFL_PrivateData* pPrivateData = new CFFL_PrivateData;
+ pPrivateData->pWidget = m_pWidget;
+ pPrivateData->pPageView = pPageView;
+ pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();
+ pPrivateData->nValueAge = 0;
+
+ cp.pAttachedData = pPrivateData;
+
+ pWnd = NewPDFWindow(cp, pPageView);
+
+ if (pWnd)
+ {
+ m_Maps.SetAt(pPageView, pWnd);
+ }
+ }
+ }
+
+ return pWnd;
+}
+
+void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)
+{
+ CPWL_Wnd* pWnd = NULL;
+ m_Maps.Lookup(pPageView, pWnd);
+
+ if (pWnd)
+ {
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ pData->pPageView = NULL;
+ pWnd->Destroy();
+ delete pWnd;
+ delete pData;
+ }
+
+ m_Maps.RemoveKey(pPageView);
+}
+
+CPDF_Matrix CFFL_FormFiller::GetWindowMatrix(void* pAttachedData)
+{
+ if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData)
+ {
+ if (pPrivateData->pPageView)
+ {
+ CPDF_Matrix mtPageView;
+ pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
+ CPDF_Matrix mt = GetCurMatrix();
+ mt.Concat(mtPageView);
+
+ return mt;
+ }
+ }
+ return CPDF_Matrix(1,0,0,1,0,0);
+}
+
+CPDF_Matrix CFFL_FormFiller::GetCurMatrix()
+{
+ CPDF_Matrix mt;
+
+ ASSERT(m_pWidget != NULL);
+
+ CPDF_Rect rcDA ;
+ m_pWidget->GetPDFAnnot()->GetRect(rcDA);
+
+
+ switch (m_pWidget->GetRotate())
+ {
+ default:
+ case 0:
+ mt = CPDF_Matrix(1,0,0,1,0,0);
+ break;
+ case 90:
+ mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0);
+ break;
+ case 180:
+ mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom);
+ break;
+ case 270:
+ mt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom);
+ break;
+ }
+ mt.e += rcDA.left;
+ mt.f += rcDA.bottom;
+
+ return mt;
+}
+
+CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)
+{
+ ASSERT(m_pApp != NULL);
+
+ return L"";
+}
+
+CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const
+{
+ ASSERT(m_pWidget != NULL);
+
+ CPDF_Rect rectAnnot;
+ m_pWidget->GetPDFAnnot()->GetRect(rectAnnot);
+
+ FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
+ FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
+
+
+ if ((m_pWidget->GetRotate() / 90) & 0x01)
+ return CPDF_Rect(0,0,fHeight,fWidth);
+ else
+ return CPDF_Rect(0,0,fWidth,fHeight);
+}
+
+CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()
+{
+
+ CPDF_Page* pPage = m_pAnnot->GetPDFPage();
+ CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ return pSDKDoc->GetPageView(pPage);
+ }
+ return NULL;
+}
+
+CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
+ {
+ CPDF_Rect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
+ ASSERT(pPageView);
+ CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
+ if(rcPage.Contains(rcFocus))
+ return rcFocus;
+ else
+ return CPDF_Rect(0,0,0,0);
+ }
+ return CPDF_Rect(0,0,0,0);
+}
+
+CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)
+{
+ CPDF_Matrix mt;
+ mt.SetReverse(GetCurMatrix());
+
+ CPDF_Rect temp = rect;
+ mt.TransformRect(temp);
+
+ return temp;
+}
+
+CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)
+{
+ CPDF_Matrix mt = GetCurMatrix();
+
+ CPDF_Rect temp = rect;
+ mt.TransformRect(temp);
+
+ return temp;
+}
+
+CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point)
+{
+ CPDF_Matrix mt;
+ mt.SetReverse(GetCurMatrix());
+
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+
+ return pt;
+}
+
+CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point)
+{
+ CPDF_Matrix mt = GetCurMatrix();
+
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+
+ return pt;
+}
+
+CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt)
+{
+// ASSERT(pPageView != NULL);
+//
+// CPDF_Point point(0.0f, 0.0f);
+// pPageView->WindowToDoc(pt.x, pt.y, point.x, point.y);
+//
+ return FFLtoPWL(pt);
+// return CPDF_Point(0, 0);
+}
+
+CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect)
+{
+// FX_RECT rcRet(0,0,0,0);
+//
+// ASSERT(pPageView != NULL);
+// pPageView->DocToWindow(rect, rcRet);
+//
+ return rect;
+
+}
+
+void CFFL_FormFiller::FFL_FreeData(void* pData)
+{
+ ASSERT(pData != NULL);
+
+ delete (CFFL_PrivateData*)pData;
+}
+
+FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
+{
+ if (IsDataChanged(pPageView))
+ {
+ //CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL;
+ ASSERT(pIFormFiller != NULL);
+
+ FX_BOOL bRC = TRUE;
+ FX_BOOL bExit = FALSE;
+
+ pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);
+ if (bExit) return TRUE;
+ if (!bRC)
+ {
+ this->ResetPDFWindow(pPageView, FALSE);
+ return TRUE;
+ }
+
+ pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
+ if (bExit) return TRUE;
+ if (!bRC)
+ {
+ this->ResetPDFWindow(pPageView, FALSE);
+ return TRUE;
+ }
+
+ SaveData(pPageView);
+
+ pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag);
+ if (bExit) return TRUE;
+
+ pIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag);
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ return FALSE;
+}
+
+void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)
+{
+}
+
+void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
+{
+}
+
+void CFFL_FormFiller::SetChangeMark()
+{
+ m_pApp->FFI_OnChange();
+}
+
+void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa)
+{
+ fa.sValue = m_pWidget->GetValue();
+}
+
+void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa)
+{
+}
+
+FX_BOOL CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew)
+{
+ return FALSE;
+}
+
+void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
+{
+}
+
+void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
+{
+}
+
+CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
+{
+ return GetPDFWindow(pPageView, FALSE);
+}
+
+void CFFL_FormFiller::TimerProc()
+{
+
+}
+
+IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
+{
+ return m_pApp->GetSysHandler();
+// return NULL;
+}
+
+void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
+{
+}
+
+void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)
+{
+ m_bValid = FALSE;
+
+ FX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget);
+ this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
+
+ if(bDestroyPDFWindow)
+ DestroyPDFWindow(pPageView);
+}
+
+FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)
+{
+ CPDF_Page * pPage = m_pWidget->GetPDFPage();
+ m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
+}
+
+/* ------------------------- CFFL_Button ------------------------- */
+
+CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
+ CFFL_FormFiller(pApp, pWidget),
+ m_bMouseIn(FALSE),
+ m_bMouseDown(FALSE)
+{
+}
+
+CFFL_Button::~CFFL_Button()
+{
+}
+
+void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ m_bMouseIn = TRUE;
+ FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+}
+
+void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ m_bMouseIn = FALSE;
+
+ FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ EndTimer();
+ ASSERT(m_pWidget != NULL);
+// m_pWidget->HideHint();
+}
+
+FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ if(!rcAnnot.Contains(point.x, point.y))
+ return FALSE;
+
+ m_bMouseDown = TRUE;
+ m_bValid = TRUE;
+ FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ return TRUE;
+}
+
+FX_BOOL CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ if(!rcAnnot.Contains(point.x, point.y))
+ return FALSE;
+
+ m_bMouseDown = FALSE;
+ m_pWidget->GetPDFPage();
+
+
+ FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
+ this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
+// ::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
+ return TRUE;
+}
+
+FX_BOOL CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(m_pApp != NULL);
+
+ return TRUE;
+}
+
+void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ CPDF_FormControl* pCtrl = pWidget->GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
+
+ if (eHM == CPDF_FormControl::Push)
+ {
+ if (m_bMouseDown)
+ {
+ if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
+ else
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+ else if (m_bMouseIn)
+ {
+ if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL);
+ else
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+ else
+ {
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+ }
+ else
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+}
+
+
+void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow, */FX_DWORD dwFlags)
+{
+ OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+}
diff --git a/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
new file mode 100644
index 0000000000..686b38c557
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_IFormFiller.cpp
@@ -0,0 +1,1197 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+#include "../../include/formfiller/FFL_CheckBox.h"
+#include "../../include/formfiller/FFL_ComboBox.h"
+#include "../../include/formfiller/FFL_ListBox.h"
+#include "../../include/formfiller/FFL_PushButton.h"
+#include "../../include/formfiller/FFL_RadioButton.h"
+#include "../../include/formfiller/FFL_TextField.h"
+
+#define FFL_MAXLISTBOXHEIGHT 140.0f
+
+// HHOOK CFFL_IFormFiller::m_hookSheet = NULL;
+// MSG CFFL_IFormFiller::g_Msg;
+
+/* ----------------------------- CFFL_IFormFiller ----------------------------- */
+
+CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
+ m_pApp(pApp),
+ m_bNotifying(FALSE)
+{
+}
+
+CFFL_IFormFiller::~CFFL_IFormFiller()
+{
+ FX_POSITION pos = m_Maps.GetStartPosition();
+ while (pos)
+ {
+ CPDFSDK_Annot * pAnnot = NULL;
+ CFFL_FormFiller * pFormFiller = NULL;
+ m_Maps.GetNextAssoc(pos,pAnnot,pFormFiller);
+ delete pFormFiller;
+ }
+ m_Maps.RemoveAll();
+}
+
+FX_BOOL CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
+{
+ CPDF_Rect rc = pAnnot->GetRect();
+ if(rc.Contains(point.x, point.y))
+ return TRUE;
+ return FALSE;
+}
+
+FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
+{
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->GetViewBBox(pPageView, pAnnot);
+ }
+ else
+ {
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ CPDF_Rect rcAnnot;
+ pPDFAnnot->GetRect(rcAnnot);
+
+// CRect rcWin;
+// pPageView->DocToWindow(rcAnnot, rcWin);
+ CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);
+// rcWin.InflateRect(1, 1);
+
+ return rcWin.GetOutterRect();
+ }
+}
+
+void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ /*const CRect& rcWindow,*/ FX_DWORD dwFlags)
+{
+ ASSERT(pPageView != NULL);
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ if (IsVisible(pWidget))
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ if (pFormFiller->IsValid())
+ {
+ pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+
+ pAnnot->GetPDFPage();
+
+
+ CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
+ ASSERT(pDocument != NULL);
+
+ if (pDocument->GetFocusAnnot() == pAnnot)
+ {
+ CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);
+ if (!rcFocus.IsEmpty())
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(5);
+ path.SetPoint(0, rcFocus.left, rcFocus.top, FXPT_MOVETO);
+ path.SetPoint(1, rcFocus.left, rcFocus.bottom, FXPT_LINETO);
+ path.SetPoint(2, rcFocus.right, rcFocus.bottom, FXPT_LINETO);
+ path.SetPoint(3, rcFocus.right, rcFocus.top, FXPT_LINETO);
+ path.SetPoint(4, rcFocus.left, rcFocus.top, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.SetDashCount(1);
+ gsd.m_DashArray[0] = 1.0f;
+ gsd.m_DashPhase = 0;
+
+ gsd.m_LineWidth = 1.0f;
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
+
+ // ::DrawFocusRect(hDC, &rcFocus);
+ }
+ }
+
+ return;
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+ else
+ pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+
+ if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))
+ {
+ pWidget->DrawShadow(pDevice, pPageView);
+ }
+
+ }
+}
+
+void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
+{
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnCreate(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
+{
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnLoad(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
+{
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnDelete(pAnnot);
+ }
+
+ UnRegisterFormFiller(pAnnot);
+}
+
+void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
+ {
+ m_bNotifying = TRUE;
+
+ int nValueAge = pWidget->GetValueAge();
+
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );
+ m_bNotifying = FALSE;
+
+ //if ( !IsValidAnnot(pPageView, pAnnot) ) return;
+
+ if (pWidget->IsAppModified())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);
+ }
+ }
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+ {
+ pFormFiller->OnMouseEnter(pPageView, pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::CursorExit))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+
+ pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);
+ m_bNotifying = FALSE;
+
+ //if (!IsValidAnnot(pPageView, pAnnot)) return;
+
+ if (pWidget->IsAppModified())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+ }
+ }
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnMouseExit(pPageView, pAnnot);
+ }
+}
+
+FX_BOOL CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);
+ pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);
+ m_bNotifying = FALSE;
+
+ if (!IsValidAnnot(pPageView, pAnnot)) return TRUE;
+
+ if (pWidget->IsAppModified())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+ }
+ }
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ // CReader_Page* pPage = pAnnot->GetPage();
+ // ASSERT(pPage != NULL);
+ CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
+ ASSERT(pDocument != NULL);
+
+ switch (pWidget->GetFieldType())
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))
+ {
+ pDocument->SetFocusAnnot(pAnnot);
+ }
+ break;
+ default:
+ pDocument->SetFocusAnnot(pAnnot);
+ break;
+ }
+
+ FX_BOOL bRet = FALSE;
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+
+ if (pDocument->GetFocusAnnot() == pAnnot)
+ {
+ FX_BOOL bExit = FALSE;
+ FX_BOOL bReset = FALSE;
+ OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);
+ if (bExit) return TRUE;
+ }
+ return bRet;
+}
+
+void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)
+{
+ ASSERT(pWidget != NULL);
+
+ if (!m_bNotifying)
+ {
+ if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
+ {
+ m_bNotifying = TRUE;
+ int nAge = pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+
+ pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);
+ m_bNotifying = FALSE;
+
+ if (!IsValidAnnot(pPageView, pWidget))
+ {
+ bExit = TRUE;
+ return;
+ }
+
+ if (nAge != pWidget->GetAppearanceAge())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+ }
+
+ bReset = TRUE;
+ }
+ }
+ }
+}
+
+FX_BOOL CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ //change cursor
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+ {
+ return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (nChar == FWL_VKEY_Tab) return TRUE;
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ return pFormFiller->OnChar(pAnnot, nChar, nFlags);
+ }
+
+ return FALSE;
+}
+
+void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnDeSelected(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ pFormFiller->OnSelected(pAnnot);
+ }
+}
+
+FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
+{
+ if(!pAnnot) return FALSE;
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::GetFocus))
+ {
+ m_bNotifying = TRUE;
+ pWidget->GetAppearanceAge();
+ int nValueAge = pWidget->GetValueAge();
+ pWidget->ClearAppModified();
+
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);
+ if(!pFormFiller) return FALSE;
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);
+
+ pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);
+ m_bNotifying = FALSE;
+
+ // if (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;
+
+ if (pWidget->IsAppModified())
+ {
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
+ {
+ pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
+ }
+ }
+ }
+ }
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
+ {
+ if (pFormFiller->OnSetFocus(pAnnot, nFlag))
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
+{
+ if(!pAnnot) return FALSE;
+ ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
+ {
+ if (pFormFiller->OnKillFocus(pAnnot, nFlag))
+ {
+ if (!m_bNotifying)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
+
+ pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
+ m_bNotifying = FALSE;
+
+ }
+ }
+ }
+ else
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
+{
+ return pWidget->IsVisible();
+}
+
+FX_BOOL CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
+{
+ ASSERT(pWidget != NULL);
+
+ int nFieldFlags = pWidget->GetFieldFlags();
+
+ return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
+}
+
+FX_BOOL CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
+{
+ ASSERT(pWidget != NULL);
+
+ if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return TRUE;
+ else
+ {
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ CPDF_Document* pDocument = pPage->m_pDocument;
+ ASSERT(pDocument != NULL);
+
+ FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+ return (dwPermissions&FPDFPERM_FILL_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM) ||
+ (dwPermissions&FPDFPERM_MODIFY);
+ }
+ return TRUE;
+}
+
+CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)
+{
+// ASSERT(pAnnot != NULL);
+// ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
+
+ CFFL_FormFiller * pFormFiller = NULL;
+ m_Maps.Lookup(pAnnot, pFormFiller);
+
+ if (pFormFiller)
+ return pFormFiller;
+
+ if (bRegister)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ int nFieldType = pWidget->GetFieldType();
+ switch(nFieldType)
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ pFormFiller = new CFFL_PushButton(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_CHECKBOX:
+ pFormFiller = new CFFL_CheckBox(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_RADIOBUTTON:
+ pFormFiller = new CFFL_RadioButton(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_TEXTFIELD:
+ pFormFiller = new CFFL_TextField(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_LISTBOX:
+ pFormFiller = new CFFL_ListBox(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_COMBOBOX:
+ pFormFiller = new CFFL_ComboBox(m_pApp, pWidget);
+ break;
+ case FIELDTYPE_UNKNOWN:
+ default:
+ pFormFiller = NULL;
+ break;
+ }
+
+ if (pFormFiller)
+ {
+ m_Maps.SetAt(pAnnot, pFormFiller);
+ }
+ }
+
+ return pFormFiller;
+}
+
+void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
+{
+ if ( pAnnot != NULL )
+ {
+ UnRegisterFormFiller( pAnnot );
+ }
+}
+
+void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)
+{
+ CFFL_FormFiller * pFormFiller = NULL;
+
+ if (m_Maps.Lookup(pAnnot,pFormFiller))
+ {
+ if (pFormFiller)
+ delete pFormFiller;
+ m_Maps.RemoveKey(pAnnot);
+ }
+}
+
+void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)
+{
+
+}
+
+void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet)
+{
+ ASSERT(pPrivateData != NULL);
+
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+
+
+
+
+ CPDF_Rect rcPageView(0,0,0,0);
+ rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
+ rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
+ rcPageView.Normalize();
+
+
+ ASSERT(pData->pWidget != NULL);
+ CPDF_Rect rcAnnot = pData->pWidget->GetRect();
+
+ FX_FLOAT fTop = 0.0f;
+ FX_FLOAT fBottom = 0.0f;
+
+ CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;
+ switch (pWidget->GetRotate() / 90)
+ {
+ default:
+ case 0:
+ fTop = rcPageView.top - rcAnnot.top;
+ fBottom = rcAnnot.bottom - rcPageView.bottom;
+ break;
+ case 1:
+ fTop = rcAnnot.left - rcPageView.left;
+ fBottom = rcPageView.right - rcAnnot.right;
+ break;
+ case 2:
+ fTop = rcAnnot.bottom - rcPageView.bottom;
+ fBottom = rcPageView.top - rcAnnot.top;
+ break;
+ case 3:
+ fTop = rcPageView.right - rcAnnot.right;
+ fBottom = rcAnnot.left - rcPageView.left;
+ break;
+ }
+
+ FX_FLOAT fFactHeight = 0;
+ FX_BOOL bBottom = TRUE;
+ FX_FLOAT fMaxListBoxHeight = 0;
+ if (fPopupMax > FFL_MAXLISTBOXHEIGHT)
+ {
+ if (fPopupMin > FFL_MAXLISTBOXHEIGHT)
+ {
+ fMaxListBoxHeight = fPopupMin;
+ }
+ else
+ {
+ fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;
+ }
+ }
+ else
+ fMaxListBoxHeight = fPopupMax;
+
+ if (fBottom > fMaxListBoxHeight)
+ {
+ fFactHeight = fMaxListBoxHeight;
+ bBottom = TRUE;
+ }
+ else
+ {
+ if (fTop > fMaxListBoxHeight)
+ {
+ fFactHeight = fMaxListBoxHeight;
+ bBottom = FALSE;
+ }
+ else
+ {
+ if (fTop > fBottom)
+ {
+ fFactHeight = fTop;
+ bBottom = FALSE;
+ }
+ else
+ {
+ fFactHeight = fBottom;
+ bBottom = TRUE;
+ }
+ }
+ }
+
+ nRet = bBottom ? 0 : 1;
+ fPopupRet = fFactHeight;
+}
+
+void CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)
+{
+ ASSERT(pPrivateData != NULL);
+
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+
+ if (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE))
+ {
+
+ CPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView));
+ CPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow);
+ pFormFiller->SetWindowRect(pData->pPageView, rcWindow);
+
+ CPDF_Rect unRect = rcOld;
+ unRect.Union(rcNew);
+ //FX_RECT rcRect = unRect.GetOutterRect();
+ unRect.left = (FX_FLOAT)(unRect.left - 0.5);
+ unRect.right = (FX_FLOAT)(unRect.right + 0.5);
+ unRect.top = (FX_FLOAT)(unRect.top + 0.5);
+ unRect.bottom = (FX_FLOAT)(unRect.bottom -0.5);
+ m_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom);
+ }
+}
+
+void CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
+ FX_BOOL & bRC, FX_BOOL & bExit)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->OnKeyStroke(bKeyDown);
+}
+
+void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ fa.bWillCommit = TRUE;
+ fa.nCommitKey = GetCommitKey();
+ fa.bKeyDown = GetKeyDown();
+ fa.bRC = TRUE;
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
+ pFormFiller->SaveState(pPageView);
+
+ PDFSDK_FieldAction faOld = fa;
+ pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
+
+ bRC = fa.bRC;
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ m_bNotifying = FALSE;
+ }
+ }
+}
+
+void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ if (pWidget->GetAAction(CPDF_AAction::Validate))
+ {
+ m_bNotifying = TRUE;
+ pWidget->ClearAppModified();
+
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+
+
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ fa.bKeyDown = GetKeyDown();
+ fa.bRC = TRUE;
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
+ pFormFiller->SaveState(pPageView);
+
+ PDFSDK_FieldAction faOld = fa;
+ pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
+
+ bRC = fa.bRC;
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ m_bNotifying = FALSE;
+ }
+ }
+}
+
+void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ pInterForm->OnCalculate(pWidget->GetFormField());
+
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ m_bNotifying = FALSE;
+ }
+}
+
+void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
+{
+ if (!m_bNotifying)
+ {
+ ASSERT(pWidget != NULL);
+ ASSERT(pPageView != NULL);
+// CReader_DocView* pDocView = pPageView->GetDocView();
+// ASSERT(pDocView != NULL);
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated);
+
+// bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
+
+ if (bExit) return;
+
+ if (bFormated)
+ {
+ pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, TRUE);
+ pInterForm->UpdateField(pWidget->GetFormField());
+ }
+
+ m_bNotifying = FALSE;
+ }
+}
+
+// LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc(
+// int code, // hook code
+// WPARAM wParam, // virtual-key code
+// LPARAM lParam // keystroke-message information
+// )
+// {
+// if (code != HC_ACTION)
+// {
+// return CallNextHookEx (m_hookSheet, code, wParam, lParam);
+// }
+//
+// FXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG));
+//
+// return 0;
+// }
+
+// MSG CFFL_IFormFiller::GetLastMessage()
+// {
+// return g_Msg;
+// }
+
+int CFFL_IFormFiller::GetCommitKey()
+{
+// MSG msg = CFFL_IFormFiller::GetLastMessage();
+
+ int nCommitKey = 0;
+// switch (msg.message)
+// {
+// case WM_LBUTTONDOWN:
+// case WM_LBUTTONUP:
+// nCommitKey = 1;
+// break;
+// case WM_KEYDOWN:
+// switch (msg.wParam)
+// {
+// case VK_RETURN:
+// nCommitKey = 2;
+// break;
+// case VK_TAB:
+// nCommitKey = 3;
+// break;
+// }
+// break;
+// }
+
+ return nCommitKey;
+}
+
+FX_BOOL CFFL_IFormFiller::GetKeyDown()
+{
+ return TRUE;
+// MSG msg = CFFL_IFormFiller::GetLastMessage();
+//
+// return msg.message == WM_KEYDOWN || msg.message == WM_CHAR;
+}
+
+FX_BOOL CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
+{
+
+ ASSERT(pPageView != NULL);
+ ASSERT(pAnnot != NULL);
+
+ if(pPageView)
+ return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
+ else
+ return FALSE;
+}
+
+void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)
+{
+ BeforeUndo(pDocument);
+}
+
+void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)
+{
+}
+
+FX_BOOL CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+FX_BOOL CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)
+{
+
+ return FALSE;
+}
+
+void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)
+{
+
+}
+void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
+ CFX_WideString & strChange, const CFX_WideString& strChangeEx,
+ int nSelStart, int nSelEnd,
+ FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ if (!m_bNotifying)
+ {
+ if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke))
+ {
+ m_bNotifying = TRUE;
+ int nAge = pData->pWidget->GetAppearanceAge();
+ int nValueAge = pData->pWidget->GetValueAge();
+
+ ASSERT(pData->pPageView != NULL);
+ CPDFSDK_Document* pDocument = pData->pPageView->GetSDKDocument();
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
+ fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
+ fa.sChange = strChange;
+ fa.sChangeEx = strChangeEx;
+ fa.bKeyDown = bKeyDown;
+ fa.bWillCommit = FALSE;
+ fa.bRC = TRUE;
+ fa.nSelStart = nSelStart;
+ fa.nSelEnd = nSelEnd;
+
+
+ pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
+ pFormFiller->SaveState(pData->pPageView);
+
+ if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pData->pPageView))
+ {
+ if (!IsValidAnnot(pData->pPageView, pData->pWidget))
+ {
+ bExit = TRUE;
+ m_bNotifying = FALSE;
+ return;
+ }
+
+ if (nAge != pData->pWidget->GetAppearanceAge())
+ {
+ CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow(pData->pPageView, nValueAge == pData->pWidget->GetValueAge());
+ pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
+ bExit = TRUE;
+ }
+
+ if (fa.bRC)
+ {
+ pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
+ bRC = FALSE;
+ }
+ else
+ {
+ pFormFiller->RestoreState(pData->pPageView);
+ bRC = FALSE;
+ }
+
+ if (pDocument->GetFocusAnnot() != pData->pWidget)
+ {
+ pFormFiller->CommitData(pData->pPageView,nFlag);
+ bExit = TRUE;
+ }
+ }
+ else
+ {
+ if (!IsValidAnnot(pData->pPageView, pData->pWidget))
+ {
+ bExit = TRUE;
+ m_bNotifying = FALSE;
+ return;
+ }
+ }
+
+ m_bNotifying = FALSE;
+ }
+ }
+}
+
+void CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag)
+{
+ ASSERT(pPrivateData != NULL);
+ CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
+ ASSERT(pData->pWidget != NULL);
+
+ CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
+ ASSERT(pFormFiller != NULL);
+
+ if (!bEditOrList)
+ pFormFiller->OnKeyStroke(bExit);
+}
diff --git a/fpdfsdk/src/formfiller/FFL_ListBox.cpp b/fpdfsdk/src/formfiller/FFL_ListBox.cpp
new file mode 100644
index 0000000000..9ddb6a00d9
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_ListBox.cpp
@@ -0,0 +1,319 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_ListBox.h"
+//#include "../../include/formfiller/FFL_Module.h"
+#include "../../include/formfiller/FFL_IFormFiller.h"
+//#include "../../include/formfiller/FFL_Undo.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+
+
+#define FFL_DEFAULTLISTBOXFONTSIZE 12.0f
+
+
+/* ------------------------------- CFFL_ListBox ------------------------------- */
+
+CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
+ CFFL_FormFiller(pApp, pWidget),
+ m_pFontMap(NULL)
+{
+}
+
+CFFL_ListBox::~CFFL_ListBox()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+}
+
+PWL_CREATEPARAM CFFL_ListBox::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+ FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
+
+ if (dwFieldFlag & FIELDFLAG_MULTISELECT)
+ {
+ cp.dwFlags |= PLBS_MULTIPLESEL;
+ }
+
+ if (dwFieldFlag & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ //cp.dwFlags |= PLBS_COMMITSELECTEDVALUE;
+ }
+
+ cp.dwFlags |= PWS_VSCROLL;
+
+ if (cp.dwFlags & PWS_AUTOFONTSIZE)
+ cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE;
+
+ if (!m_pFontMap)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget,m_pApp->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pApp));
+ m_pFontMap->Initial();
+ }
+ cp.pFontMap = m_pFontMap;
+
+ return cp;
+}
+
+CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_ListBox* pWnd = new CPWL_ListBox();
+ pWnd->AttachFFLData(this);
+ pWnd->Create(cp);
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pIFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+
+ for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ pWnd->AddString(m_pWidget->GetOptionLabel(i));
+
+ if (pWnd->HasFlag(PLBS_MULTIPLESEL))
+ {
+ m_OriginSelections.RemoveAll();
+
+ FX_BOOL bSetCaret = FALSE;
+ for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ {
+ if (m_pWidget->IsOptionSelected(i))
+ {
+ if (!bSetCaret)
+ {
+ pWnd->SetCaret(i);
+ bSetCaret = TRUE;
+ }
+ pWnd->Select(i);
+ m_OriginSelections.SetAt(i, NULL);
+ }
+ }
+ }
+ else
+ {
+ for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ {
+ if (m_pWidget->IsOptionSelected(i))
+ {
+ pWnd->Select(i);
+ break;
+ }
+ }
+ }
+
+ pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex());
+
+ return pWnd;
+}
+
+
+FX_BOOL CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+}
+
+FX_BOOL CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ int nSelCount = 0;
+ for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
+ {
+ if (pListBox->IsItemSelected(i))
+ {
+ void* p = NULL;
+ if (!m_OriginSelections.Lookup(i, p))
+ return TRUE;
+
+ nSelCount++;
+ }
+ }
+
+ return nSelCount != m_OriginSelections.GetCount();
+ }
+ else
+ {
+ return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0);
+ }
+ }
+
+ return FALSE;
+}
+
+void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ CFX_IntArray aOldSelect, aNewSelect;
+
+ {
+ for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
+ {
+ if (m_pWidget->IsOptionSelected(i))
+ {
+ aOldSelect.Add(i);
+ }
+ }
+ }
+
+
+ FX_INT32 nNewTopIndex = pListBox->GetTopVisibleIndex();
+
+ m_pWidget->ClearSelection(FALSE);
+
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
+ {
+ if (pListBox->IsItemSelected(i))
+ {
+ m_pWidget->SetOptionSelection(i, TRUE, FALSE);
+ aNewSelect.Add(i);
+ }
+ }
+ }
+ else
+ {
+ m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE);
+ aNewSelect.Add(pListBox->GetCurSel());
+ }
+
+ m_pWidget->SetTopVisibleIndex(nNewTopIndex);
+ m_pWidget->ResetFieldAppearance(TRUE);
+ m_pWidget->UpdateField();
+ SetChangeMark();
+ }
+}
+
+void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa)
+{
+ switch (type)
+ {
+ case CPDF_AAction::Validate:
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ fa.sValue = L"";
+ }
+ else
+ {
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 nCurSel = pListBox->GetCurSel();
+ if (nCurSel >= 0)
+ fa.sValue = m_pWidget->GetOptionLabel(nCurSel);
+ }
+ }
+ break;
+ case CPDF_AAction::LoseFocus:
+ case CPDF_AAction::GetFocus:
+ if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ {
+ fa.sValue = L"";
+ }
+ else
+ {
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);
+ if (nCurSel >= 0)
+ fa.sValue = m_pWidget->GetOptionLabel(nCurSel);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
+void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa)
+{
+}
+
+void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
+ {
+ if (pListBox->IsItemSelected(i))
+ {
+ m_State.Add(i);
+ }
+ }
+ }
+}
+
+void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView)
+{
+ if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
+ {
+ for (int i=0,sz=m_State.GetSize(); i<sz; i++)
+ pListBox->Select(m_State[i]);
+ }
+}
+
+CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
+{
+ if (bRestoreValue)
+ SaveState(pPageView);
+
+ DestroyPDFWindow(pPageView);
+
+ CPWL_Wnd* pRet = NULL;
+
+ if (bRestoreValue)
+ {
+ RestoreState(pPageView);
+ pRet = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag)
+{
+ ASSERT(m_pWidget != NULL);
+
+ int nFlags = m_pWidget->GetFieldFlags();
+
+ if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
+ {
+ if (m_bValid)
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+
+ if (CommitData(pPageView, nFlag))
+ {
+ DestroyPDFWindow(pPageView);
+ m_bValid = FALSE;
+ }
+ }
+ }
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_Notify.cpp b/fpdfsdk/src/formfiller/FFL_Notify.cpp
new file mode 100644
index 0000000000..f18ed51875
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_Notify.cpp
@@ -0,0 +1,172 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+// #include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_Notify.h"
+// #include "../../include/formfiller/FFL_ComboBox.h"
+// #include "../../include/formfiller/FFL_Module.h"
+
+/* -------------------------------- CFFL_Notify ------------------------------ */
+
+//#pragma warning(disable: 4800)
+
+CFFL_Notify::CFFL_Notify(CFFL_FormFiller * pFormFiller) :
+ m_pFormFiller(pFormFiller),
+ m_bDoActioning(FALSE),
+ m_nNotifyFlag(0)
+{
+ ASSERT(m_pFormFiller != NULL);
+}
+
+CFFL_Notify::~CFFL_Notify()
+{
+}
+
+void CFFL_Notify::BeforeNotify()
+{
+ m_nNotifyFlag ++;
+}
+
+
+void CFFL_Notify::AfterNotify()
+{
+ m_nNotifyFlag --;
+}
+
+FX_BOOL CFFL_Notify::OnMouseUp(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonUp, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseDown(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::ButtonDown, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseEnter(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorEnter, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnMouseExit(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::CursorExit, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnSetFocus(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::GetFocus, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnKillFocus(FX_BOOL & bExit)
+{
+ BeforeNotify();
+ FX_BOOL bRet = FALSE;//DoAAction(CPDF_AAction::AActionType::LoseFocus, bExit);
+ AfterNotify();
+ return bRet;
+}
+
+FX_BOOL CFFL_Notify::OnCalculate()
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnFormat(int iCommitKey)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnKeyStroke(CPDF_FormField* pFormField, int nCommitKey, CFX_WideString& strValue, CFX_WideString& strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL bWillCommit, FX_BOOL bFieldFull,
+ int& nSelStart, int& nSelEnd, FX_BOOL& bRC)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::OnValidate(CPDF_FormField* pFormField, CFX_WideString& strValue, CFX_WideString & strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL bKeyDown, FX_BOOL bModifier,
+ FX_BOOL bShift, FX_BOOL & bRC)
+{
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::DoAAction(CPDF_AAction::AActionType eAAT, FX_BOOL & bExit)
+{
+ if (this->m_bDoActioning) return FALSE;
+
+ CPDF_Action action;
+ if (!FindAAction(eAAT,action)) return FALSE;
+
+ this->m_bDoActioning = TRUE;
+ ExecuteActionTree(eAAT,action,bExit);
+ this->m_bDoActioning = FALSE;
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::ExecuteActionTree(CPDF_AAction::AActionType eAAT,CPDF_Action & action, FX_BOOL& bExit)
+{
+ if (!ExecuteAction(eAAT,action,bExit)) return FALSE;
+ if (bExit) return TRUE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteActionTree(eAAT,subaction,bExit)) return FALSE;
+ if (bExit) break;
+ }
+
+ return TRUE;
+}
+
+
+FX_BOOL CFFL_Notify::FindAAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_Notify::FindAAction(CPDF_AAction aaction,CPDF_AAction::AActionType eAAT,CPDF_Action & action)
+{
+ CPDF_Action MyAction;
+
+ if (aaction.ActionExist(eAAT))
+ {
+ MyAction = aaction.GetAction(eAAT);
+ }
+ else
+ return FALSE;
+
+
+ if (MyAction.GetType() == CPDF_Action::Unknown)
+ return FALSE;
+
+ action = MyAction;
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_Notify::ExecuteAction(CPDF_AAction::AActionType eAAT,CPDF_Action & action,FX_BOOL& bExit)
+{
+ return FALSE;
+}
+//#pragma warning(default: 4800)
+
diff --git a/fpdfsdk/src/formfiller/FFL_PushButton.cpp b/fpdfsdk/src/formfiller/FFL_PushButton.cpp
new file mode 100644
index 0000000000..1afbe8b84e
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_PushButton.cpp
@@ -0,0 +1,43 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_PushButton.h"
+
+/* ------------------------------- CFFL_PushButton ------------------------------- */
+
+CFFL_PushButton::CFFL_PushButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot):
+ CFFL_Button( pApp, pAnnot)
+{
+}
+
+CFFL_PushButton::~CFFL_PushButton()
+{
+}
+
+CPWL_Wnd* CFFL_PushButton::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_PushButton* pWnd = new CPWL_PushButton();
+ pWnd->Create(cp);
+
+ return pWnd;
+}
+
+
+FX_BOOL CFFL_PushButton::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+}
+
+void CFFL_PushButton::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot,
+ CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_DWORD dwFlags)
+{
+ CFFL_Button::OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+}
+
+
diff --git a/fpdfsdk/src/formfiller/FFL_RadioButton.cpp b/fpdfsdk/src/formfiller/FFL_RadioButton.cpp
new file mode 100644
index 0000000000..462c05ede2
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_RadioButton.cpp
@@ -0,0 +1,137 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_RadioButton.h"
+//#include "../include/FFL_Undo.h"
+
+/* ------------------------------- CFFL_RadioButton ------------------------------- */
+
+CFFL_RadioButton::CFFL_RadioButton(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
+ CFFL_Button(pApp, pWidget)
+{
+}
+
+CFFL_RadioButton::~CFFL_RadioButton()
+{
+}
+
+CPWL_Wnd* CFFL_RadioButton::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_RadioButton* pWnd = new CPWL_RadioButton();
+ pWnd->Create(cp);
+
+ ASSERT(m_pWidget != NULL);
+ pWnd->SetCheck(m_pWidget->IsChecked());
+
+ return pWnd;
+}
+
+FX_BOOL CFFL_RadioButton::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
+{
+ switch (nKeyCode)
+ {
+ case FWL_VKEY_Return:
+ case FWL_VKEY_Space:
+ return TRUE;
+ default:
+ return CFFL_FormFiller::OnKeyDown(pAnnot, nKeyCode, nFlags);
+ }
+}
+
+FX_BOOL CFFL_RadioButton::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ switch (nChar)
+ {
+ case FWL_VKEY_Return:
+ case FWL_VKEY_Space:
+ {
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ ASSERT(pIFormFiller != NULL);
+
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ FX_BOOL bReset = FALSE;
+ FX_BOOL bExit = FALSE;
+
+ pIFormFiller->OnButtonUp(m_pWidget, pPageView, bReset, bExit,nFlags);
+
+ if (bReset) return TRUE;
+ if (bExit) return TRUE;
+
+ CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+
+ if (CPWL_RadioButton * pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE))
+ pWnd->SetCheck(TRUE);
+ CommitData(pPageView,nFlags);
+ return TRUE;
+ }
+ default:
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+ }
+}
+
+FX_BOOL CFFL_RadioButton::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
+{
+ CFFL_Button::OnLButtonUp(pPageView, pAnnot, nFlags, point);
+
+ if (IsValid())
+ {
+ if (CPWL_RadioButton * pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, TRUE))
+ pWnd->SetCheck(TRUE);
+
+ if (!CommitData(pPageView,nFlags)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CFFL_RadioButton::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))
+ {
+ return pWnd->IsChecked() != m_pWidget->IsChecked();
+ }
+
+ return FALSE;
+}
+
+void CFFL_RadioButton::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_RadioButton* pWnd = (CPWL_RadioButton*)GetPDFWindow(pPageView, FALSE))
+ {
+
+ FX_BOOL bNewChecked = pWnd->IsChecked();
+
+ if (bNewChecked)
+ {
+ CPDF_FormField* pField = m_pWidget->GetFormField();
+ ASSERT(pField != NULL);
+
+ for (FX_INT32 i=0,sz=pField->CountControls(); i<sz; i++)
+ {
+ if (CPDF_FormControl* pCtrl = pField->GetControl(i))
+ {
+ if (pCtrl->IsChecked())
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ m_pWidget->SetCheck(bNewChecked, FALSE);
+ m_pWidget->UpdateField();
+ SetChangeMark();
+ }
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_TextField.cpp b/fpdfsdk/src/formfiller/FFL_TextField.cpp
new file mode 100644
index 0000000000..7644d4bc60
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_TextField.cpp
@@ -0,0 +1,412 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+//#include "../include/FormFiller.h"
+//#include "../include/FFL_FormFiller.h"
+#include "../../include/formfiller/FFL_TextField.h"
+#include "../../include/formfiller/FFL_CBA_Fontmap.h"
+//#include "../include/FFL_Notify.h"
+
+CFFL_EditUndoItem::CFFL_EditUndoItem(CPWL_Edit* pEdit) : m_pEdit(pEdit)
+{
+}
+
+CFFL_EditUndoItem::~CFFL_EditUndoItem()
+{
+}
+
+void CFFL_EditUndoItem::Undo()
+{
+}
+
+void CFFL_EditUndoItem::Redo()
+{
+}
+
+CFX_WideString CFFL_EditUndoItem::GetDescr()
+{
+ return L"Input";
+}
+
+void CFFL_EditUndoItem::Release()
+{
+ delete this;
+}
+
+/* ------------------------------- CFFL_TextField ------------------------------- */
+
+CFFL_TextField::CFFL_TextField(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
+ CFFL_FormFiller(pApp, pAnnot),
+ m_pFontMap(NULL)//,
+ //m_pSpellCheck(NULL)
+{
+ m_State.nStart = m_State.nEnd = 0;
+}
+
+CFFL_TextField::~CFFL_TextField()
+{
+ if (m_pFontMap)
+ {
+ delete m_pFontMap;
+ m_pFontMap = NULL;
+ }
+
+}
+
+PWL_CREATEPARAM CFFL_TextField::GetCreateParam()
+{
+ PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
+
+ ASSERT(m_pWidget != NULL);
+ int nFlags = m_pWidget->GetFieldFlags();
+
+
+ if (nFlags & FIELDFLAG_PASSWORD)
+ {
+ cp.dwFlags |= PES_PASSWORD;
+ }
+
+ if (!(nFlags & FIELDFLAG_DONOTSPELLCHECK))
+ {
+ }
+
+ if (nFlags & FIELDFLAG_MULTILINE)
+ {
+ cp.dwFlags |= PES_MULTILINE | PES_AUTORETURN | PES_TOP;
+
+ if (!(nFlags & FIELDFLAG_DONOTSCROLL))
+ {
+ cp.dwFlags |= PWS_VSCROLL | PES_AUTOSCROLL;
+ }
+ }
+ else
+ {
+ cp.dwFlags |= PES_CENTER;
+
+ if (!(nFlags & FIELDFLAG_DONOTSCROLL))
+ {
+ cp.dwFlags |= PES_AUTOSCROLL;
+ }
+ }
+
+ if (nFlags & FIELDFLAG_COMB)
+ {
+ cp.dwFlags |= PES_CHARARRAY;
+ }
+
+ if (nFlags & FIELDFLAG_RICHTEXT)
+ {
+ cp.dwFlags |= PES_RICH;
+ }
+
+ cp.dwFlags |= PES_UNDO;
+
+ switch (m_pWidget->GetAlignment())
+ {
+ default:
+ case BF_ALIGN_LEFT:
+ cp.dwFlags |= PES_LEFT;
+ break;
+ case BF_ALIGN_MIDDLE:
+ cp.dwFlags |= PES_MIDDLE;
+ break;
+ case BF_ALIGN_RIGHT:
+ cp.dwFlags |= PES_RIGHT;
+ break;
+ }
+
+ if (!m_pFontMap)
+ {
+ ASSERT(this->m_pApp != NULL);
+ m_pFontMap = new CBA_FontMap(m_pWidget, /*ISystemHandle::GetSystemHandler(m_pApp)*/m_pApp->GetSysHandler());
+ m_pFontMap->Initial();
+ }
+ cp.pFontMap = m_pFontMap;
+ cp.pFocusHandler = this;
+
+ return cp;
+}
+
+CPWL_Wnd* CFFL_TextField::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
+{
+ CPWL_Edit * pWnd = new CPWL_Edit();
+ pWnd->AttachFFLData(this);
+ pWnd->Create(cp);
+
+
+
+ ASSERT(m_pApp != NULL);
+ CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
+ pWnd->SetFillerNotify(pIFormFiller);
+
+ ASSERT(m_pWidget != NULL);
+ FX_INT32 nMaxLen = m_pWidget->GetMaxLen();
+ CFX_WideString swValue = m_pWidget->GetValue();
+
+ if (nMaxLen > 0)
+ {
+ if (pWnd->HasFlag(PES_CHARARRAY))
+ {
+ pWnd->SetCharArray(nMaxLen);
+ pWnd->SetAlignFormatV(PEAV_CENTER);
+ }
+ else
+ {
+ pWnd->SetLimitChar(nMaxLen);
+ }
+ }
+
+ pWnd->SetText(swValue);
+
+ return pWnd;
+}
+
+
+FX_BOOL CFFL_TextField::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
+{
+ switch (nChar)
+ {
+ case FWL_VKEY_Return:
+ if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_MULTILINE))
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+ m_bValid = !m_bValid;
+ CPDF_Rect rcAnnot = pAnnot->GetRect();
+ m_pApp->FFI_Invalidate(pAnnot->GetPDFPage(), rcAnnot.left, rcAnnot.top, rcAnnot.right, rcAnnot.bottom);
+
+ if (m_bValid)
+ {
+ if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, TRUE))
+ pWnd->SetFocus();
+ }
+ else
+ {
+ if (CommitData(pPageView, nFlags))
+ {
+ DestroyPDFWindow(pPageView);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ }
+ break;
+ case FWL_VKEY_Escape:
+ {
+ CPDFSDK_PageView* pPageView = this->GetCurPageView();
+ ASSERT(pPageView != NULL);
+ EscapeFiller(pPageView,TRUE);
+ return TRUE;
+ }
+ }
+
+ return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
+}
+
+FX_BOOL CFFL_TextField::IsDataChanged(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ return pEdit->GetText() != m_pWidget->GetValue();
+
+ return FALSE;
+}
+
+void CFFL_TextField::SaveData(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pWidget != NULL);
+
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ {
+ CFX_WideString sOldValue = m_pWidget->GetValue();
+ CFX_WideString sNewValue = pWnd->GetText();
+
+ m_pWidget->SetValue(sNewValue, FALSE);
+ m_pWidget->ResetFieldAppearance(TRUE);
+ m_pWidget->UpdateField();
+ SetChangeMark();
+ }
+}
+
+void CFFL_TextField::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& fa)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ {
+ fa.bFieldFull = pWnd->IsTextFull();
+
+ fa.sValue = pWnd->GetText();
+
+ if (fa.bFieldFull)
+ {
+ fa.sChange = L"";
+ fa.sChangeEx = L"";
+ }
+ }
+ break;
+ case CPDF_AAction::Validate:
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ {
+ fa.sValue = pWnd->GetText();
+ }
+ break;
+ case CPDF_AAction::LoseFocus:
+ case CPDF_AAction::GetFocus:
+ ASSERT(m_pWidget != NULL);
+ fa.sValue = m_pWidget->GetValue();
+ break;
+ default:
+ break;
+ }
+}
+
+void CFFL_TextField::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
+ const PDFSDK_FieldAction& fa)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ if (CPWL_Edit * pEdit = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ {
+ pEdit->SetFocus();
+ pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
+ pEdit->ReplaceSel(fa.sChange);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
+FX_BOOL CFFL_TextField::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
+ const PDFSDK_FieldAction& faNew)
+{
+ switch (type)
+ {
+ case CPDF_AAction::KeyStroke:
+ return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
+ faOld.sChange != faNew.sChange;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+void CFFL_TextField::SaveState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, FALSE))
+ {
+ pWnd->GetSel(m_State.nStart, m_State.nEnd);
+ m_State.sValue = pWnd->GetText();
+ }
+}
+
+void CFFL_TextField::RestoreState(CPDFSDK_PageView* pPageView)
+{
+ ASSERT(pPageView != NULL);
+
+ if (CPWL_Edit* pWnd = (CPWL_Edit*)GetPDFWindow(pPageView, TRUE))
+ {
+ pWnd->SetText(m_State.sValue);
+ pWnd->SetSel(m_State.nStart, m_State.nEnd);
+ }
+}
+
+CPWL_Wnd* CFFL_TextField::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
+{
+ if (bRestoreValue)
+ SaveState(pPageView);
+
+ DestroyPDFWindow(pPageView);
+
+ CPWL_Wnd* pRet = NULL;
+
+ if (bRestoreValue)
+ {
+ RestoreState(pPageView);
+ pRet = this->GetPDFWindow(pPageView, FALSE);
+ }
+ else
+ pRet = this->GetPDFWindow(pPageView, TRUE);
+
+ m_pWidget->UpdateField();
+
+ return pRet;
+}
+
+void CFFL_TextField::OnSetFocus(CPWL_Wnd* pWnd)
+{
+ ASSERT(m_pApp != NULL);
+
+ ASSERT(pWnd != NULL);
+
+ if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
+ {
+ CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+ pEdit->SetCharSet(134);
+ pEdit->SetCodePage(936);
+
+ pEdit->SetReadyToInput();
+ CFX_WideString wsText = pEdit->GetText();
+ int nCharacters = wsText.GetLength();
+ CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
+ unsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;
+ m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
+
+ pEdit->SetEditNotify(this);
+ //pUndo->BeginEdit(pDocument);
+ }
+}
+
+void CFFL_TextField::OnKillFocus(CPWL_Wnd* pWnd)
+{
+
+}
+
+FX_BOOL CFFL_TextField::CanCopy(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_TextField::CanCut(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CFFL_TextField::CanPaste(CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+void CFFL_TextField::DoCopy(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_TextField::DoCut(CPDFSDK_Document* pDocument)
+{
+}
+
+void CFFL_TextField::DoPaste(CPDFSDK_Document* pDocument)
+{
+
+}
+
+void CFFL_TextField::OnAddUndo(CPWL_Edit* pEdit)
+{
+}
+
diff --git a/fpdfsdk/src/formfiller/FFL_Utils.cpp b/fpdfsdk/src/formfiller/FFL_Utils.cpp
new file mode 100644
index 0000000000..2e908108b8
--- /dev/null
+++ b/fpdfsdk/src/formfiller/FFL_Utils.cpp
@@ -0,0 +1,133 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/formfiller/FormFiller.h"
+#include "../../include/formfiller/FFL_Utils.h"
+
+CPDF_Rect CFFL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
+{
+ CPDF_Rect rcRet;
+
+ rcRet.left = FFL_MIN(rect1.left,rect2.left);
+ rcRet.bottom = FFL_MIN(rect1.bottom,rect2.bottom);
+ rcRet.right = FFL_MAX(rect1.right,rect2.right);
+ rcRet.top = FFL_MAX(rect1.top,rect2.top);
+
+ return rcRet;
+}
+
+CPDF_Rect CFFL_Utils::InflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
+{
+ CPDF_Rect crNew(crRect.left - fSize,
+ crRect.bottom - fSize,
+ crRect.right + fSize,
+ crRect.top + fSize);
+ crNew.Normalize();
+ return crNew;
+}
+
+CPDF_Rect CFFL_Utils::DeflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
+{
+ CPDF_Rect crNew(crRect.left + fSize,
+ crRect.bottom + fSize,
+ crRect.right - fSize,
+ crRect.top - fSize);
+ crNew.Normalize();
+ return crNew;
+}
+
+/*
+FX_BOOL CFFL_Utils::RectContainsRect(const CPDF_Rect & father,const CPDF_Rect & son)
+{
+ return (father.left <= son.left && father.right >= son.right &&
+ father.bottom <= son.bottom && father.top >= son.top);
+
+}
+
+FX_BOOL CFFL_Utils::RectContainsPoint(const CPDF_Rect & father,const CPDF_Point & son)
+{
+ return (father.left <= son.x && father.right >= son.x &&
+ father.bottom <= son.y && father.top >= son.y);
+}
+
+FX_BOOL CFFL_Utils::RectContainsXY(const CPDF_Rect & father,FX_FLOAT x,FX_FLOAT y)
+{
+ return (father.left <= x && father.right >= x &&
+ father.bottom <= y && father.top >= y);
+}
+*/
+
+FX_BOOL CFFL_Utils::TraceObject(CPDF_Object* pObj)
+{
+ if (!pObj) return FALSE;
+
+ FX_DWORD dwObjNum = pObj->GetObjNum();
+ switch (pObj->GetType())
+ {
+ case PDFOBJ_ARRAY:
+ {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
+ {
+ CPDF_Object* pElement = pArray->GetElementValue(i);
+ TraceObject(pElement);
+ }
+ }
+ break;
+
+ case PDFOBJ_DICTIONARY:
+ {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+
+ FX_POSITION fPos = pDict->GetStartPos();
+ CFX_ByteString csKey;
+ do
+ {
+ CPDF_Object* pElement = pDict->GetNextElement(fPos, csKey);
+ //TRACE(csKey + "\n");
+ if (!pElement) break;
+ TraceObject(pElement);
+ }while (TRUE);
+ }
+ break;
+
+ case PDFOBJ_STREAM:
+ {
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ TraceObject(pDict);
+ }
+ break;
+
+ case PDFOBJ_REFERENCE:
+ {
+ CPDF_Object* pDirectObj = pObj->GetDirect();
+ TraceObject(pDirectObj);
+ }
+ break;
+
+ case PDFOBJ_BOOLEAN:
+ break;
+ case PDFOBJ_NUMBER:
+ //TRACE("%d\n",(FX_INT32)pObj);
+ break;
+ case PDFOBJ_STRING:
+ //TRACE(((CPDF_String*)pObj)->GetString() + "\n");
+ break;
+ case PDFOBJ_NAME:
+ //TRACE(((CPDF_Name*)pObj)->GetString() + "\n");
+ break;
+ case PDFOBJ_NULL:
+// case PDFOBJ_KEYWORD:
+// case PDFOBJ_EOF:
+ default:
+ break;
+ }
+ if (dwObjNum == 0) return FALSE;
+
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fpdf_dataavail.cpp b/fpdfsdk/src/fpdf_dataavail.cpp
new file mode 100644
index 0000000000..9e56c2e0c8
--- /dev/null
+++ b/fpdfsdk/src/fpdf_dataavail.cpp
@@ -0,0 +1,165 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_dataavail.h"
+
+extern void ProcessParseError(FX_DWORD err_code);
+class CFPDF_FileAvailWrap : public IFX_FileAvail
+{
+public:
+ CFPDF_FileAvailWrap()
+ {
+ m_pfileAvail = NULL;
+ }
+
+ void Set(FX_FILEAVAIL* pfileAvail)
+ {
+ m_pfileAvail = pfileAvail;
+ }
+
+ virtual FX_BOOL IsDataAvail( FX_FILESIZE offset, FX_DWORD size)
+ {
+ return m_pfileAvail->IsDataAvail(m_pfileAvail, offset, size);
+ }
+
+private:
+ FX_FILEAVAIL* m_pfileAvail;
+};
+
+class CFPDF_FileAccessWrap : public IFX_FileRead
+{
+public:
+ CFPDF_FileAccessWrap()
+ {
+ m_pFileAccess = NULL;
+ }
+
+ void Set(FPDF_FILEACCESS* pFile)
+ {
+ m_pFileAccess = pFile;
+ }
+
+ virtual FX_FILESIZE GetSize()
+ {
+ return m_pFileAccess->m_FileLen;
+ }
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ return m_pFileAccess->m_GetBlock(m_pFileAccess->m_Param, offset, (FX_LPBYTE)buffer, size);
+ }
+
+ virtual void Release()
+ {
+ }
+
+private:
+ FPDF_FILEACCESS* m_pFileAccess;
+};
+
+class CFPDF_DownloadHintsWrap : public IFX_DownloadHints
+{
+public:
+ CFPDF_DownloadHintsWrap(FX_DOWNLOADHINTS* pDownloadHints)
+ {
+ m_pDownloadHints = pDownloadHints;
+ }
+public:
+ virtual void AddSegment(FX_FILESIZE offset, FX_DWORD size)
+ {
+ m_pDownloadHints->AddSegment(m_pDownloadHints, offset, size);
+ }
+private:
+ FX_DOWNLOADHINTS* m_pDownloadHints;
+};
+
+class CFPDF_DataAvail : public CFX_Object
+{
+public:
+ CFPDF_DataAvail()
+ {
+ m_pDataAvail = NULL;
+ }
+
+ ~CFPDF_DataAvail()
+ {
+ if (m_pDataAvail) delete m_pDataAvail;
+ }
+
+ CPDF_DataAvail* m_pDataAvail;
+ CFPDF_FileAvailWrap m_FileAvail;
+ CFPDF_FileAccessWrap m_FileRead;
+};
+
+DLLEXPORT FPDF_AVAIL STDCALL FPDFAvail_Create(FX_FILEAVAIL* file_avail, FPDF_FILEACCESS* file)
+{
+ CFPDF_DataAvail* pAvail = FX_NEW CFPDF_DataAvail;
+ pAvail->m_FileAvail.Set(file_avail);
+ pAvail->m_FileRead.Set(file);
+ pAvail->m_pDataAvail = FX_NEW CPDF_DataAvail(&pAvail->m_FileAvail, &pAvail->m_FileRead);
+ return pAvail;
+}
+
+DLLEXPORT void STDCALL FPDFAvail_Destroy(FPDF_AVAIL avail)
+{
+ if (avail == NULL) return;
+ delete (CFPDF_DataAvail*)avail;
+}
+
+DLLEXPORT int STDCALL FPDFAvail_IsDocAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
+{
+ if (avail == NULL || hints == NULL) return 0;
+ CFPDF_DownloadHintsWrap hints_wrap(hints);
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsDocAvail(&hints_wrap);
+}
+
+extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDFAvail_GetDocument(FPDF_AVAIL avail, FPDF_BYTESTRING password)
+{
+ if (avail == NULL) return NULL;
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+
+ FX_DWORD err_code = pParser->StartAsynParse(((CFPDF_DataAvail*)avail)->m_pDataAvail->GetFileRead());
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ ((CFPDF_DataAvail*)avail)->m_pDataAvail->SetDocument(pParser->GetDocument());
+ CheckUnSupportError(pParser->GetDocument(), FPDF_ERR_SUCCESS);
+ return pParser->GetDocument();
+}
+
+DLLEXPORT int STDCALL FPDFAvail_GetFirstPageNum(FPDF_DOCUMENT doc)
+{
+ if (doc == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ return ((CPDF_Parser*)pDoc->GetParser())->GetFirstPageNo();
+}
+
+DLLEXPORT int STDCALL FPDFAvail_IsPageAvail(FPDF_AVAIL avail, int page_index, FX_DOWNLOADHINTS* hints)
+{
+ if (avail == NULL || hints == NULL) return 0;
+ CFPDF_DownloadHintsWrap hints_wrap(hints);
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsPageAvail(page_index, &hints_wrap);
+}
+
+DLLEXPORT int STDCALL FPDFAvail_IsFormAvail(FPDF_AVAIL avail, FX_DOWNLOADHINTS* hints)
+{
+ if (avail == NULL || hints == NULL) return -1;
+ CFPDF_DownloadHintsWrap hints_wrap(hints);
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsFormAvail(&hints_wrap);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFAvail_IsLinearized(FPDF_AVAIL avail)
+{
+ if (avail == NULL) return -1;
+ return ((CFPDF_DataAvail*)avail)->m_pDataAvail->IsLinearizedPDF();
+
+}
diff --git a/fpdfsdk/src/fpdf_ext.cpp b/fpdfsdk/src/fpdf_ext.cpp
new file mode 100644
index 0000000000..e2e2d84995
--- /dev/null
+++ b/fpdfsdk/src/fpdf_ext.cpp
@@ -0,0 +1,245 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_ext.h"
+
+#define FPDFSDK_UNSUPPORT_CALL 100
+
+class CFSDK_UnsupportInfo_Adapter
+{
+public:
+ CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info){ m_unsp_info = unsp_info;}
+// FX_BOOL NeedToPauseNow();
+ void ReportError(int nErrorType);
+
+private:
+ UNSUPPORT_INFO* m_unsp_info;
+};
+
+void CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType)
+{
+ if(m_unsp_info && m_unsp_info->FSDK_UnSupport_Handler)
+ {
+ m_unsp_info->FSDK_UnSupport_Handler(m_unsp_info,nErrorType);
+ }
+}
+
+void FreeUnsupportInfo(FX_LPVOID pData)
+{
+ CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)pData;
+ delete pAdapter;
+}
+
+FX_BOOL FPDF_UnSupportError(int nError)
+{
+ CFSDK_UnsupportInfo_Adapter * pAdapter = (CFSDK_UnsupportInfo_Adapter *)CPDF_ModuleMgr::Get()->GetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL);
+
+ if(!pAdapter)
+ return FALSE;
+ pAdapter->ReportError(nError);
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FSDK_SetUnSpObjProcessHandler(UNSUPPORT_INFO* unsp_info)
+{
+ if (!unsp_info || unsp_info->version!=1)
+ return FALSE;
+ CFSDK_UnsupportInfo_Adapter * pAdapter = new CFSDK_UnsupportInfo_Adapter(unsp_info);
+
+ CPDF_ModuleMgr::Get()->SetPrivateData((void *)FPDFSDK_UNSUPPORT_CALL,pAdapter, &FreeUnsupportInfo);
+
+ return TRUE;
+}
+
+void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot)
+{
+ CFX_ByteString cbSubType = pPDFAnnot->GetSubType();
+ if(cbSubType.Compare("3D") == 0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_3DANNOT);
+ }
+ else if(cbSubType.Compare("Screen") ==0)
+ {
+ CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+ CFX_ByteString cbString;
+ if(pAnnotDict->KeyExist("IT"))
+ cbString = pAnnotDict->GetString("IT");
+ if(cbString.Compare("Img") != 0)
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_MEDIA);
+ }
+ else if(cbSubType.Compare("Movie") ==0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_MOVIE);
+ }
+ else if(cbSubType.Compare("Sound") ==0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_SOUND);
+ }
+ else if(cbSubType.Compare("RichMedia") ==0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA);
+ }
+ else if(cbSubType.Compare("FileAttachment") ==0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_ATTACHMENT);
+ }
+ else if(cbSubType.Compare("Widget") ==0)
+ {
+ CPDF_Dictionary* pAnnotDict = pPDFAnnot->m_pAnnotDict;
+ CFX_ByteString cbString;
+ if(pAnnotDict->KeyExist("FT"))
+ {
+ cbString = pAnnotDict->GetString("FT");
+ }
+ if(cbString.Compare("Sig") == 0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_ANNOT_SIG);
+ }
+ }
+
+}
+
+FX_BOOL CheckSharedForm(CXML_Element * pElement, CFX_ByteString cbName)
+{
+ int count = pElement->CountAttrs();
+ int i=0;
+ for (i = 0; i < count; i++)
+ {
+ CFX_ByteString space, name;
+ CFX_WideString value;
+ pElement->GetAttrByIndex(i, space, name, value);
+ if (space == FX_BSTRC("xmlns") && name == FX_BSTRC("adhocwf") && value == L"http://ns.adobe.com/AcrobatAdhocWorkflow/1.0/")
+ {
+ CXML_Element *pVersion = pElement->GetElement("adhocwf",cbName);
+ if (!pVersion)
+ continue;
+ CFX_WideString wsContent = pVersion->GetContent(0); // == 1.1
+ int nType = wsContent.GetInteger();
+ switch(nType)
+ {
+ case 1:
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_ACROBAT);
+ break;
+ case 2:
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_FILESYSTEM);
+ break;
+ case 0:
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDFORM_EMAIL);
+ break;
+ }
+ }
+ }
+
+ FX_DWORD nCount = pElement->CountChildren();
+ for(i=0; i<(int)nCount; i++)
+ {
+ CXML_Element::ChildType childType = pElement->GetChildType(i);
+ if(childType == CXML_Element::Element)
+ {
+ CXML_Element * pChild = pElement->GetElement(i);
+ if(CheckSharedForm(pChild, cbName))
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code)
+{
+ // Security
+ if(err_code == FPDF_ERR_SECURITY)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SECURITY);
+ return ;
+ }
+ if(!pDoc)
+ return ;
+
+ // Portfolios and Packages
+ CPDF_Dictionary * pRootDict = pDoc->GetRoot();
+ if(pRootDict)
+ {
+ CFX_ByteString cbString;
+ if(pRootDict->KeyExist("Collection"))
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_PORTABLECOLLECTION);
+ return ;
+ }
+ if(pRootDict->KeyExist("Names"))
+ {
+ CPDF_Dictionary* pNameDict = pRootDict->GetDict("Names");
+ if(pNameDict->KeyExist("EmbeddedFiles"))
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_ATTACHMENT);
+ return;
+ }
+ else if(pNameDict->KeyExist("JavaScript"))
+ {
+ CPDF_Dictionary* pJSDict = pNameDict->GetDict("JavaScript");
+ CPDF_Array * pArray = pJSDict->GetArray("Names");
+ if (pArray) {
+ int nCount = pArray->GetCount();
+ for(int i=0; i<nCount; i++)
+ {
+ CFX_ByteString cbStr = pArray->GetString(i);
+ if(cbStr.Compare("com.adobe.acrobat.SharedReview.Register") == 0)
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_SHAREDREVIEW);
+ return;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // SharedForm
+ CPDF_Metadata metaData;
+ metaData.LoadDoc(pDoc);
+ CXML_Element * pElement = metaData.GetRoot();
+ if(pElement)
+ CheckSharedForm(pElement, "workflowType");
+
+
+ // XFA Forms
+ CPDF_InterForm * pInterForm = FX_NEW CPDF_InterForm(pDoc,FALSE);
+ if (pInterForm)
+ {
+ if(pInterForm->HasXFAForm())
+ {
+ FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM);
+ }
+ delete pInterForm;
+ }
+}
+
+DLLEXPORT int FPDFDoc_GetPageMode(FPDF_DOCUMENT document)
+{
+ if (!document) return PAGEMODE_UNKONOWN;
+ CPDF_Dictionary *pRoot = ((CPDF_Document*)document)->GetRoot();
+ if (!pRoot)
+ return PAGEMODE_UNKONOWN;
+ CPDF_Object* pName = pRoot->GetElement("PageMode");
+ if (!pName)
+ return PAGEMODE_USENONE;
+ CFX_ByteString strPageMode = pName->GetString();
+
+ if (strPageMode.IsEmpty()||strPageMode.EqualNoCase(FX_BSTR("UseNone")))
+ return PAGEMODE_USENONE;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseOutlines")))
+ return PAGEMODE_USEOUTLINES;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseThumbs")))
+ return PAGEMODE_USETHUMBS;
+ else if (strPageMode.EqualNoCase(FX_BSTR("FullScreen")))
+ return PAGEMODE_FULLSCREEN;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseOC")))
+ return PAGEMODE_USEOC;
+ else if (strPageMode.EqualNoCase(FX_BSTR("UseAttachments")))
+ return PAGEMODE_USEATTACHMENTS;
+
+ return PAGEMODE_UNKONOWN;
+}
diff --git a/fpdfsdk/src/fpdf_flatten.cpp b/fpdfsdk/src/fpdf_flatten.cpp
new file mode 100644
index 0000000000..f04100f95a
--- /dev/null
+++ b/fpdfsdk/src/fpdf_flatten.cpp
@@ -0,0 +1,561 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_flatten.h"
+
+typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray;
+typedef CFX_ArrayTemplate<CPDF_Rect> CPDF_RectArray;
+
+enum FPDF_TYPE { MAX, MIN };
+enum FPDF_VALUE { TOP, LEFT, RIGHT, BOTTOM };
+
+FX_BOOL IsValiableRect(CPDF_Rect rect, CPDF_Rect rcPage)
+{
+ if ( rect.left - rect.right > 0.000001f ||
+ rect.bottom - rect.top > 0.000001f)
+ return FALSE;
+
+ if (rect.left == 0.0f &&
+ rect.top == 0.0f &&
+ rect.right == 0.0f &&
+ rect.bottom == 0.0f)
+ return FALSE;
+
+ if (!rcPage.IsEmpty())
+ {
+ if (rect.left - rcPage.left < -10.000001f ||
+ rect.right - rcPage.right > 10.000001f ||
+ rect.top - rcPage.top > 10.000001f ||
+ rect.bottom - rcPage.bottom < -10.000001f)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+FX_BOOL GetContentsRect( CPDF_Document * pDoc, CPDF_Dictionary* pDict, CPDF_RectArray * pRectArray )
+{
+ CPDF_Page* pPDFPage = FX_NEW CPDF_Page;
+ pPDFPage->Load( pDoc, pDict, FALSE );
+ pPDFPage->ParseContent();
+
+ FX_POSITION pos = pPDFPage->GetFirstObjectPosition();
+
+ while (pos)
+ {
+ CPDF_PageObject* pPageObject = pPDFPage->GetNextObject(pos);
+ if (!pPageObject)continue;
+
+ CPDF_Rect rc;
+ rc.left = pPageObject->m_Left;
+ rc.right = pPageObject->m_Right;
+ rc.bottom = pPageObject->m_Bottom;
+ rc.top = pPageObject->m_Top;
+
+ if (IsValiableRect(rc, pDict->GetRect("MediaBox")))
+ {
+ pRectArray->Add(rc);
+ }
+ }
+
+ delete pPDFPage;
+ return TRUE;
+}
+
+
+void ParserStream( CPDF_Dictionary * pPageDic, CPDF_Dictionary* pStream, CPDF_RectArray * pRectArray, CPDF_ObjectArray * pObjectArray )
+{
+ if (!pStream)return;
+ CPDF_Rect rect;
+ if (pStream->KeyExist("Rect"))
+ rect = pStream->GetRect("Rect");
+ else if (pStream->KeyExist("BBox"))
+ rect = pStream->GetRect("BBox");
+
+ if (IsValiableRect(rect, pPageDic->GetRect("MediaBox")))
+ pRectArray->Add(rect);
+
+ pObjectArray->Add(pStream);
+}
+
+
+int ParserAnnots( CPDF_Document* pSourceDoc, CPDF_Dictionary * pPageDic, CPDF_RectArray * pRectArray, CPDF_ObjectArray * pObjectArray, int nUsage)
+{
+ if (!pSourceDoc || !pPageDic) return FLATTEN_FAIL;
+
+ GetContentsRect( pSourceDoc, pPageDic, pRectArray );
+ CPDF_Array* pAnnots = pPageDic->GetArray("Annots");
+ if (pAnnots)
+ {
+ FX_DWORD dwSize = pAnnots->GetCount();
+
+ for (int i = 0; i < (int)dwSize; i++)
+ {
+ CPDF_Object* pObj = pAnnots->GetElementValue(i);
+
+ if (!pObj)continue;
+
+ if (pObj->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pAnnotDic = (CPDF_Dictionary*)pObj;
+ CFX_ByteString sSubtype = pAnnotDic->GetString("Subtype");
+ if (sSubtype == "Popup")continue;
+
+ int nAnnotFlag = pAnnotDic->GetInteger("F");
+
+ if(nAnnotFlag & ANNOTFLAG_HIDDEN)
+ continue;
+ if(nUsage == FLAT_NORMALDISPLAY)
+ {
+ if(nAnnotFlag & ANNOTFLAG_INVISIBLE)
+ continue;
+ ParserStream( pPageDic, pAnnotDic, pRectArray, pObjectArray );
+ }
+ else
+ {
+ if(nAnnotFlag & ANNOTFLAG_PRINT)
+ ParserStream( pPageDic, pAnnotDic, pRectArray, pObjectArray );
+ }
+ }
+ }
+ return FLATTEN_SUCCESS;
+ }else{
+ return FLATTEN_NOTINGTODO;
+ }
+}
+
+
+FX_FLOAT GetMinMaxValue( CPDF_RectArray& array, FPDF_TYPE type, FPDF_VALUE value)
+{
+ int nRects = array.GetSize();
+ FX_FLOAT fRet = 0.0f;
+
+ if (nRects <= 0)return 0.0f;
+
+ FX_FLOAT* pArray = new FX_FLOAT[nRects];
+ switch(value)
+ {
+ case LEFT:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).left;
+
+ break;
+ }
+ case TOP:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).top;
+
+ break;
+ }
+ case RIGHT:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).right;
+
+ break;
+ }
+ case BOTTOM:
+ {
+ for (int i = 0; i < nRects; i++)
+ pArray[i] = CPDF_Rect(array.GetAt(i)).bottom;
+
+ break;
+ }
+ default:
+ break;
+ }
+ fRet = pArray[0];
+ if (type == MAX)
+ {
+ for (int i = 1; i < nRects; i++)
+ if (fRet <= pArray[i])
+ fRet = pArray[i];
+ }
+ else
+ {
+ for (int i = 1; i < nRects; i++)
+ if (fRet >= pArray[i])
+ fRet = pArray[i];
+ }
+ delete[] pArray;
+ return fRet;
+}
+
+CPDF_Rect CalculateRect( CPDF_RectArray * pRectArray )
+{
+
+ CPDF_Rect rcRet;
+
+ rcRet.left = GetMinMaxValue(*pRectArray, MIN, LEFT);
+ rcRet.top = GetMinMaxValue(*pRectArray, MAX, TOP);
+ rcRet.right = GetMinMaxValue(*pRectArray, MAX, RIGHT);
+ rcRet.bottom = GetMinMaxValue(*pRectArray, MIN, BOTTOM);
+
+ return rcRet;
+}
+
+
+void SetPageContents(CFX_ByteString key, CPDF_Dictionary* pPage, CPDF_Document* pDocument)
+{
+ CPDF_Object* pContentsObj = pPage->GetStream("Contents");
+ if (!pContentsObj)
+ {
+ pContentsObj = pPage->GetArray("Contents");
+ }
+
+ if (!pContentsObj)
+ {
+ //Create a new contents dictionary
+ if (!key.IsEmpty())
+ {
+ CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);
+ if (!pNewContents)return;
+ pPage->SetAtReference("Contents", pDocument, pDocument->AddIndirectObject(pNewContents));
+
+ CFX_ByteString sStream;
+ sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", (FX_LPCSTR)key);
+ pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ }
+ return;
+ }
+
+ int iType = pContentsObj->GetType();
+ CPDF_Array* pContentsArray = NULL;
+
+ switch(iType)
+ {
+ case PDFOBJ_STREAM:
+ {
+ pContentsArray = FX_NEW CPDF_Array;
+ CPDF_Stream* pContents = (CPDF_Stream*)pContentsObj;
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContents);
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pContents);
+ CFX_ByteString sStream = "q\n";
+ CFX_ByteString sBody = CFX_ByteString((FX_LPCSTR)acc.GetData(), acc.GetSize());
+ sStream = sStream + sBody + "\nQ";
+ pContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ pContentsArray->AddReference(pDocument, dwObjNum);
+ break;
+ }
+
+ case PDFOBJ_ARRAY:
+ {
+ pContentsArray = (CPDF_Array*)pContentsObj;
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (!pContentsArray)return;
+
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pContentsArray);
+ pPage->SetAtReference("Contents", pDocument, dwObjNum);
+
+ if (!key.IsEmpty())
+ {
+ CPDF_Stream* pNewContents = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);
+ dwObjNum = pDocument->AddIndirectObject(pNewContents);
+ pContentsArray->AddReference(pDocument, dwObjNum);
+
+ CFX_ByteString sStream;
+ sStream.Format("q 1 0 0 1 0 0 cm /%s Do Q", (FX_LPCSTR)key);
+ pNewContents->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ }
+}
+
+CFX_AffineMatrix GetMatrix(CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix matrix)
+{
+ if(rcStream.IsEmpty())
+ return CFX_AffineMatrix();
+
+ matrix.TransformRect(rcStream);
+ rcStream.Normalize();
+
+ FX_FLOAT a = rcAnnot.Width()/rcStream.Width();
+ FX_FLOAT d = rcAnnot.Height()/rcStream.Height();
+
+ FX_FLOAT e = rcAnnot.left - rcStream.left * a;
+ FX_FLOAT f = rcAnnot.bottom - rcStream.bottom * d;
+ return CFX_AffineMatrix(a, 0, 0, d, e, f);
+}
+
+void GetOffset(FX_FLOAT& fa, FX_FLOAT& fd, FX_FLOAT& fe, FX_FLOAT& ff, CPDF_Rect rcAnnot, CPDF_Rect rcStream, CFX_AffineMatrix matrix)
+{
+ FX_FLOAT fStreamWidth = 0.0f;
+ FX_FLOAT fStreamHeight = 0.0f;
+
+
+
+ if (matrix.a != 0 && matrix.d != 0)
+ {
+ fStreamWidth = rcStream.right - rcStream.left;
+ fStreamHeight = rcStream.top - rcStream.bottom;
+ }
+ else
+ {
+ fStreamWidth = rcStream.top - rcStream.bottom;
+ fStreamHeight = rcStream.right - rcStream.left;
+ }
+
+ FX_FLOAT x1 = matrix.a * rcStream.left + matrix.c * rcStream.bottom + matrix.e;
+ FX_FLOAT y1 = matrix.b * rcStream.left + matrix.d * rcStream.bottom + matrix.f;
+ FX_FLOAT x2 = matrix.a * rcStream.left + matrix.c * rcStream.top + matrix.e;
+ FX_FLOAT y2 = matrix.b * rcStream.left + matrix.d * rcStream.top + matrix.f;
+ FX_FLOAT x3 = matrix.a * rcStream.right + matrix.c * rcStream.bottom + matrix.e;
+ FX_FLOAT y3 = matrix.b * rcStream.right + matrix.d * rcStream.bottom + matrix.f;
+ FX_FLOAT x4 = matrix.a * rcStream.right + matrix.c * rcStream.top + matrix.e;
+ FX_FLOAT y4 = matrix.b * rcStream.right + matrix.d * rcStream.top + matrix.f;
+
+ FX_FLOAT left = FX_MIN(FX_MIN(x1, x2), FX_MIN(x3, x4));
+ FX_FLOAT bottom = FX_MIN(FX_MIN(y1, y2), FX_MIN(y3, y4));
+
+ fa = (rcAnnot.right - rcAnnot.left)/fStreamWidth;
+ fd = (rcAnnot.top - rcAnnot.bottom)/fStreamHeight;
+ fe = rcAnnot.left - left * fa;
+ ff = rcAnnot.bottom - bottom * fd;
+}
+
+
+DLLEXPORT int STDCALL FPDFPage_Flatten( FPDF_PAGE page, int nFlag)
+{
+ if (!page)
+ {
+ return FLATTEN_FAIL;
+ }
+
+ CPDF_Page * pPage = (CPDF_Page*)( page );
+ CPDF_Document * pDocument = pPage->m_pDocument;
+ CPDF_Dictionary * pPageDict = pPage->m_pFormDict;
+
+ if ( !pDocument || !pPageDict )
+ {
+ return FLATTEN_FAIL;
+ }
+
+ CPDF_ObjectArray ObjectArray;
+ CPDF_RectArray RectArray;
+
+ int iRet = FLATTEN_FAIL;
+ iRet = ParserAnnots( pDocument, pPageDict, &RectArray, &ObjectArray, nFlag);
+ if (iRet == FLATTEN_NOTINGTODO)
+ {
+ return FLATTEN_NOTINGTODO;
+ }else if (iRet == FLATTEN_FAIL)
+ {
+ return FLATTEN_FAIL;
+ }
+
+ CPDF_Rect rcOriginalCB;
+ CPDF_Rect rcMerger = CalculateRect( &RectArray );
+ CPDF_Rect rcOriginalMB = pPageDict->GetRect("MediaBox");
+
+ if (pPageDict->KeyExist("CropBox"))
+ rcOriginalMB = pPageDict->GetRect("CropBox");
+
+ if (rcOriginalMB.IsEmpty())
+ {
+ rcOriginalMB = CPDF_Rect(0.0f, 0.0f, 612.0f, 792.0f);
+ }
+
+ rcMerger.left = rcMerger.left < rcOriginalMB.left? rcOriginalMB.left : rcMerger.left;
+ rcMerger.right = rcMerger.right > rcOriginalMB.right? rcOriginalMB.right : rcMerger.right;
+ rcMerger.top = rcMerger.top > rcOriginalMB.top? rcOriginalMB.top : rcMerger.top;
+ rcMerger.bottom = rcMerger.bottom < rcOriginalMB.bottom? rcOriginalMB.bottom : rcMerger.bottom;
+
+ if (pPageDict->KeyExist("ArtBox"))
+ rcOriginalCB = pPageDict->GetRect("ArtBox");
+ else
+ rcOriginalCB = rcOriginalMB;
+
+ if (!rcOriginalMB.IsEmpty())
+ {
+ CPDF_Array* pMediaBox = FX_NEW CPDF_Array();
+
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.left));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.bottom));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.right));
+ pMediaBox->Add(FX_NEW CPDF_Number(rcOriginalMB.top));
+
+ pPageDict->SetAt("MediaBox",pMediaBox);
+ }
+
+ if (!rcOriginalCB.IsEmpty())
+ {
+ CPDF_Array* pCropBox = FX_NEW CPDF_Array();
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.left));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.bottom));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.right));
+ pCropBox->Add(FX_NEW CPDF_Number(rcOriginalCB.top));
+ pPageDict->SetAt("ArtBox", pCropBox);
+ }
+
+ CPDF_Dictionary* pRes = NULL;
+ pRes = pPageDict->GetDict("Resources");
+ if (!pRes)
+ {
+ pRes = FX_NEW CPDF_Dictionary;
+ pPageDict->SetAt( "Resources", pRes );
+ }
+
+ CPDF_Stream* pNewXObject = FX_NEW CPDF_Stream(NULL, 0, FX_NEW CPDF_Dictionary);
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pNewXObject);
+ CPDF_Dictionary* pPageXObject = pRes->GetDict("XObject");
+ if (!pPageXObject)
+ {
+ pPageXObject = FX_NEW CPDF_Dictionary;
+ pRes->SetAt("XObject", pPageXObject);
+ }
+
+ CFX_ByteString key = "";
+ int nStreams = ObjectArray.GetSize();
+
+ if (nStreams > 0)
+ {
+ for (int iKey = 0; /*iKey < 100*/; iKey++)
+ {
+ char sExtend[5] = {0};
+ FXSYS_itoa(iKey, sExtend, 10);
+ key = CFX_ByteString("FFT") + CFX_ByteString(sExtend);
+
+ if (!pPageXObject->KeyExist(key))
+ break;
+ }
+ }
+
+ SetPageContents(key, pPageDict, pDocument);
+
+ CPDF_Dictionary* pNewXORes = NULL;
+
+ if (!key.IsEmpty())
+ {
+ pPageXObject->SetAtReference(key, pDocument, dwObjNum);
+ CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict();
+ pNewXORes = FX_NEW CPDF_Dictionary;
+ pNewOXbjectDic->SetAt("Resources", pNewXORes);
+ pNewOXbjectDic->SetAtName("Type", "XObject");
+ pNewOXbjectDic->SetAtName("Subtype", "Form");
+ pNewOXbjectDic->SetAtInteger("FormType", 1);
+ pNewOXbjectDic->SetAtName("Name", "FRM");
+ CPDF_Rect rcBBox = pPageDict->GetRect("ArtBox");
+ pNewOXbjectDic->SetAtRect("BBox", rcBBox);
+ }
+
+ for (int i = 0; i < nStreams; i++)
+ {
+ CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i);
+ if (!pAnnotDic)continue;
+
+ CPDF_Rect rcAnnot = pAnnotDic->GetRect("Rect");
+ rcAnnot.Normalize();
+
+ CFX_ByteString sAnnotState = pAnnotDic->GetString("AS");
+ CPDF_Dictionary* pAnnotAP = pAnnotDic->GetDict("AP");
+ if (!pAnnotAP)continue;
+
+ CPDF_Stream* pAPStream = pAnnotAP->GetStream("N");
+ if (!pAPStream)
+ {
+ CPDF_Dictionary* pAPDic = pAnnotAP->GetDict("N");
+ if (!pAPDic)continue;
+
+ if (!sAnnotState.IsEmpty())
+ {
+ pAPStream = pAPDic->GetStream(sAnnotState);
+ }
+ else
+ {
+ FX_POSITION pos = pAPDic->GetStartPos();
+ if (pos)
+ {
+ CFX_ByteString sKey;
+ CPDF_Object* pFirstObj = pAPDic->GetNextElement(pos, sKey);
+ if (pFirstObj)
+ {
+ if (pFirstObj->GetType() == PDFOBJ_REFERENCE)
+ pFirstObj = pFirstObj->GetDirect();
+
+ if (pFirstObj->GetType() != PDFOBJ_STREAM)
+ continue;
+
+ pAPStream = (CPDF_Stream*)pFirstObj;
+ }
+ }
+ }
+ }
+
+ if (!pAPStream)continue;
+
+ CPDF_Dictionary* pAPDic = pAPStream->GetDict();
+ CFX_AffineMatrix matrix = pAPDic->GetMatrix("Matrix");
+
+ CPDF_Rect rcStream;
+ if (pAPDic->KeyExist("Rect"))
+ rcStream = pAPDic->GetRect("Rect");
+ else if (pAPDic->KeyExist("BBox"))
+ rcStream = pAPDic->GetRect("BBox");
+
+ if (rcStream.IsEmpty())continue;
+
+ CPDF_Object* pObj = pAPStream;
+
+ if (pObj)
+ {
+ CPDF_Dictionary* pObjDic = pObj->GetDict();
+ if (pObjDic)
+ {
+ pObjDic->SetAtName("Type", "XObject");
+ pObjDic->SetAtName("Subtype", "Form");
+ }
+ }
+
+ CPDF_Dictionary* pXObject = pNewXORes->GetDict("XObject");
+ if (!pXObject)
+ {
+ pXObject = FX_NEW CPDF_Dictionary;
+ pNewXORes->SetAt("XObject", pXObject);
+ }
+
+ CFX_ByteString sFormName;
+ sFormName.Format("F%d", i);
+ FX_DWORD dwObjNum = pDocument->AddIndirectObject(pObj);
+ pXObject->SetAtReference(sFormName, pDocument, dwObjNum);
+
+ CPDF_StreamAcc acc;
+ acc.LoadAllData(pNewXObject);
+
+ FX_LPCBYTE pData = acc.GetData();
+ CFX_ByteString sStream(pData, acc.GetSize());
+ CFX_ByteString sTemp;
+
+ if (matrix.IsIdentity())
+ {
+ matrix.a = 1.0f;
+ matrix.b = 0.0f;
+ matrix.c = 0.0f;
+ matrix.d = 1.0f;
+ matrix.e = 0.0f;
+ matrix.f = 0.0f;
+ }
+
+ CFX_AffineMatrix m = GetMatrix(rcAnnot, rcStream, matrix);
+ sTemp.Format("q %f 0 0 %f %f %f cm /%s Do Q\n", m.a, m.d, m.e, m.f, (FX_LPCSTR)sFormName);
+ sStream += sTemp;
+
+ pNewXObject->SetData((FX_LPCBYTE)sStream, sStream.GetLength(), FALSE, FALSE);
+ }
+ pPageDict->RemoveAt( "Annots" );
+
+ ObjectArray.RemoveAll();
+ RectArray.RemoveAll();
+
+ return FLATTEN_SUCCESS;
+}
diff --git a/fpdfsdk/src/fpdf_progressive.cpp b/fpdfsdk/src/fpdf_progressive.cpp
new file mode 100644
index 0000000000..29496e05dc
--- /dev/null
+++ b/fpdfsdk/src/fpdf_progressive.cpp
@@ -0,0 +1,114 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fpdf_progressive.h"
+#include "../include/fsdk_define.h"
+#include "../include/fpdfview.h"
+#include "../include/fsdk_rendercontext.h"
+
+extern void (*Func_RenderPage)( CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause );
+
+extern void DropContext(void* data);
+
+DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start( FPDF_BITMAP bitmap, FPDF_PAGE page,
+ int start_x, int start_y, int size_x,
+ int size_y, int rotate, int flags,
+ IFSDK_PAUSE * pause )
+{
+ if (bitmap == NULL || page == NULL)
+ return FPDF_RENDER_FAILED;
+
+ if (!pause)
+ return FPDF_RENDER_FAILED;
+
+ if (pause->version !=1)
+ return FPDF_RENDER_FAILED;
+
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext );
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
+ if (flags & FPDF_REVERSE_BYTE_ORDER)
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+ else
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+#else
+ pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
+ if (flags & FPDF_REVERSE_BYTE_ORDER)
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+ else
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+#endif
+ IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,FALSE, &IPauseAdapter);
+ }
+ catch (...){}
+ }
+
+ if ( pContext->m_pRenderer )
+ {
+ CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
+ status = pContext->m_pRenderer->GetStatus();
+ return status;
+ }
+ return FPDF_RENDER_FAILED;
+}
+
+DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,IFSDK_PAUSE * pause)
+{
+ if (page == NULL)
+ return FPDF_RENDER_FAILED;
+
+ if (!pause)
+ return FPDF_RENDER_FAILED;
+
+ if (pause->version !=1)
+ return FPDF_RENDER_FAILED;
+
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+ if (pContext && pContext->m_pRenderer)
+ {
+ IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+ pContext->m_pRenderer->Continue(&IPauseAdapter);
+
+ CPDF_ProgressiveRenderer::RenderStatus status = CPDF_ProgressiveRenderer::Failed;
+ status = pContext->m_pRenderer->GetStatus();
+ return status;
+ }
+ return FPDF_RENDER_FAILED;
+}
+
+
+DLLEXPORT void STDCALL FPDF_RenderPage_Close(FPDF_PAGE page)
+{
+ if (page == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+// FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CRenderContext * pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+ if (pContext)
+ {
+ pContext->m_pDevice->RestoreState();
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+ }
+}
+
diff --git a/fpdfsdk/src/fpdf_searchex.cpp b/fpdfsdk/src/fpdf_searchex.cpp
new file mode 100644
index 0000000000..540cd552fa
--- /dev/null
+++ b/fpdfsdk/src/fpdf_searchex.cpp
@@ -0,0 +1,15 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_searchex.h"
+
+
+DLLEXPORT int STDCALL FPDFText_GetCharIndexFromTextIndex(FPDF_TEXTPAGE text_page, int nTextIndex)
+{
+ if(!text_page) return -1;
+ return ((IPDF_TextPage*)text_page)->CharIndexFromTextIndex(nTextIndex);
+}
diff --git a/fpdfsdk/src/fpdf_sysfontinfo.cpp b/fpdfsdk/src/fpdf_sysfontinfo.cpp
new file mode 100644
index 0000000000..4c6b784981
--- /dev/null
+++ b/fpdfsdk/src/fpdf_sysfontinfo.cpp
@@ -0,0 +1,163 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_sysfontinfo.h"
+
+class CSysFontInfo_Ext : public IFX_SystemFontInfo
+{
+public:
+ FPDF_SYSFONTINFO* m_pInfo;
+
+ virtual void Release()
+ {
+ if (m_pInfo->Release)
+ m_pInfo->Release(m_pInfo);
+ delete this;
+ }
+
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper)
+ {
+ if (m_pInfo->EnumFonts) {
+ m_pInfo->EnumFonts(m_pInfo, pMapper);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)
+ {
+ if (m_pInfo->MapFont)
+ return m_pInfo->MapFont(m_pInfo, weight, bItalic, charset, pitch_family, family, &bExact);
+ return NULL;
+ }
+
+ virtual void* GetFont(FX_LPCSTR family)
+ {
+ if (m_pInfo->GetFont)
+ return m_pInfo->GetFont(m_pInfo, family);
+ return NULL;
+ }
+
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+ {
+ if (m_pInfo->GetFontData)
+ return m_pInfo->GetFontData(m_pInfo, hFont, table, buffer, size);
+ return 0;
+ }
+
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name)
+ {
+ if (m_pInfo->GetFaceName == NULL) return FALSE;
+ FX_DWORD size = m_pInfo->GetFaceName(m_pInfo, hFont, NULL, 0);
+ if (size == 0) return FALSE;
+ char* buffer = FX_Alloc(char, size);
+ size = m_pInfo->GetFaceName(m_pInfo, hFont, buffer, size);
+ name = CFX_ByteString(buffer, size);
+ FX_Free(buffer);
+ return TRUE;
+ }
+
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset)
+ {
+ if (m_pInfo->GetFontCharset) {
+ charset = m_pInfo->GetFontCharset(m_pInfo, hFont);
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ virtual void DeleteFont(void* hFont)
+ {
+ if (m_pInfo->DeleteFont)
+ m_pInfo->DeleteFont(m_pInfo, hFont);
+ }
+};
+
+DLLEXPORT void STDCALL FPDF_AddInstalledFont(void* mapper, const char* name, int charset)
+{
+ ((CFX_FontMapper*)mapper)->AddInstalledFont(name, charset);
+}
+
+DLLEXPORT void STDCALL FPDF_SetSystemFontInfo(FPDF_SYSFONTINFO* pFontInfoExt)
+{
+ if (pFontInfoExt->version != 1) return;
+
+ CSysFontInfo_Ext* pFontInfo = FX_NEW CSysFontInfo_Ext;
+ pFontInfo->m_pInfo = pFontInfoExt;
+ CFX_GEModule::Get()->GetFontMgr()->SetSystemFontInfo(pFontInfo);
+}
+
+struct FPDF_SYSFONTINFO_DEFAULT : public FPDF_SYSFONTINFO
+{
+ IFX_SystemFontInfo* m_pFontInfo;
+};
+
+static void DefaultRelease(struct _FPDF_SYSFONTINFO* pThis)
+{
+ ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->Release();
+}
+
+static void DefaultEnumFonts(struct _FPDF_SYSFONTINFO* pThis, void* pMapper)
+{
+ ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->EnumFontList((CFX_FontMapper*)pMapper);
+}
+
+static void* DefaultMapFont(struct _FPDF_SYSFONTINFO* pThis, int weight, int bItalic, int charset, int pitch_family, const char* family, int* bExact)
+{
+ return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->MapFont(weight, bItalic, charset, pitch_family, family, *bExact);
+}
+
+void* DefaultGetFont(struct _FPDF_SYSFONTINFO* pThis, const char* family)
+{
+ return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFont(family);
+}
+
+static unsigned long DefaultGetFontData(struct _FPDF_SYSFONTINFO* pThis, void* hFont,
+ unsigned int table, unsigned char* buffer, unsigned long buf_size)
+{
+ return ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontData(hFont, table, buffer, buf_size);
+}
+
+static unsigned long DefaultGetFaceName(struct _FPDF_SYSFONTINFO* pThis, void* hFont, char* buffer, unsigned long buf_size)
+{
+ CFX_ByteString name;
+ if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFaceName(hFont, name)) return 0;
+ if (name.GetLength() >= (long)buf_size) return name.GetLength() + 1;
+ FXSYS_strcpy(buffer, name);
+ return name.GetLength() + 1;
+}
+
+static int DefaultGetFontCharset(struct _FPDF_SYSFONTINFO* pThis, void* hFont)
+{
+ int charset;
+ if (!((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->GetFontCharset(hFont, charset)) return 0;
+ return charset;
+}
+
+static void DefaultDeleteFont(struct _FPDF_SYSFONTINFO* pThis, void* hFont)
+{
+ ((FPDF_SYSFONTINFO_DEFAULT*)pThis)->m_pFontInfo->DeleteFont(hFont);
+}
+
+DLLEXPORT FPDF_SYSFONTINFO* STDCALL FPDF_GetDefaultSystemFontInfo()
+{
+ IFX_SystemFontInfo* pFontInfo = IFX_SystemFontInfo::CreateDefault();
+ if (pFontInfo == NULL) return NULL;
+
+ FPDF_SYSFONTINFO_DEFAULT* pFontInfoExt = FX_Alloc(FPDF_SYSFONTINFO_DEFAULT, 1);
+ pFontInfoExt->DeleteFont = DefaultDeleteFont;
+ pFontInfoExt->EnumFonts = DefaultEnumFonts;
+ pFontInfoExt->GetFaceName = DefaultGetFaceName;
+ pFontInfoExt->GetFont = DefaultGetFont;
+ pFontInfoExt->GetFontCharset = DefaultGetFontCharset;
+ pFontInfoExt->GetFontData = DefaultGetFontData;
+ pFontInfoExt->MapFont = DefaultMapFont;
+ pFontInfoExt->Release = DefaultRelease;
+ pFontInfoExt->version = 1;
+ pFontInfoExt->m_pFontInfo = pFontInfo;
+ return pFontInfoExt;
+}
diff --git a/fpdfsdk/src/fpdf_transformpage.cpp b/fpdfsdk/src/fpdf_transformpage.cpp
new file mode 100644
index 0000000000..f171c5e526
--- /dev/null
+++ b/fpdfsdk/src/fpdf_transformpage.cpp
@@ -0,0 +1,325 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdf_transformpage.h"
+
+DLLEXPORT void STDCALL FPDFPage_SetMediaBox(FPDF_PAGE page, float left, float bottom, float right, float top)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(left));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(bottom));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
+
+ pPageDict->SetAt("MediaBox", pMediaBoxArray);
+}
+
+
+DLLEXPORT void STDCALL FPDFPage_SetCropBox(FPDF_PAGE page, float left, float bottom, float right, float top)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pCropBoxArray = FX_NEW CPDF_Array;
+ pCropBoxArray->Add(FX_NEW CPDF_Number(left));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(bottom));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(right)));
+ pCropBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(top)));
+
+
+ pPageDict->SetAt("CropBox", pCropBoxArray);
+}
+
+
+DLLEXPORT FX_BOOL STDCALL FPDFPage_GetMediaBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)
+{
+ if(!page)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pArray = pPageDict->GetArray("MediaBox");
+ if(pArray)
+ {
+ *left = pArray->GetFloat(0);
+ *bottom = pArray->GetFloat(1);
+ *right = pArray->GetFloat(2);
+ *top = pArray->GetFloat(3);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GetCropBox(FPDF_PAGE page, float* left, float* bottom, float* right, float* top)
+{
+ if(!page)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
+ CPDF_Array* pArray = pPageDict->GetArray("CropBox");
+ if(pArray)
+ {
+ *left = pArray->GetFloat(0);
+ *bottom = pArray->GetFloat(1);
+ *right = pArray->GetFloat(2);
+ *top = pArray->GetFloat(3);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_TransFormWithClip(FPDF_PAGE page, FS_MATRIX* matrix, FS_RECTF* clipRect)
+{
+ if(!page)
+ return FALSE;
+
+ CFX_ByteTextBuf textBuf;
+ textBuf<<"q ";
+ CFX_FloatRect rect(clipRect->left, clipRect->bottom, clipRect->right, clipRect->top);
+ rect.Normalize();
+ CFX_ByteString bsClipping;
+ bsClipping.Format("%f %f %f %f re W* n ", rect.left, rect.bottom, rect.Width(), rect.Height());
+ textBuf<<bsClipping;
+
+ CFX_ByteString bsMatix;
+ bsMatix.Format("%f %f %f %f %f %f cm ", matrix->a, matrix->b,matrix->c,matrix->d,matrix->e,matrix->f);
+ textBuf<<bsMatix;
+
+
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
+ CPDF_Object* pContentObj = pPageDic->GetElement("Contents");
+ if(!pContentObj)
+ pContentObj = pPageDic->GetArray("Contents");
+ if(!pContentObj)
+ return FALSE;
+
+ CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic);
+ pStream->SetData(textBuf.GetBuffer(), textBuf.GetSize(), FALSE, FALSE);
+ CPDF_Document* pDoc = pPage->m_pDocument;
+ if(!pDoc)
+ return FALSE;
+ pDoc->AddIndirectObject(pStream);
+
+ pDic = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pEndStream = FX_NEW CPDF_Stream(NULL,0, pDic);
+ pEndStream->SetData((FX_LPCBYTE)" Q", 2, FALSE, FALSE);
+ pDoc->AddIndirectObject(pEndStream);
+
+ CPDF_Array* pContentArray = NULL;
+ if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pContentObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+ pContentArray->AddReference(pDoc,pEndStream);
+
+ }
+ else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
+ CPDF_Object* pDirectObj = pReference->GetDirect();
+ if(pDirectObj != NULL)
+ {
+ if(pDirectObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pDirectObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+ pContentArray->AddReference(pDoc,pEndStream);
+
+ }
+ else if(pDirectObj->GetType() == PDFOBJ_STREAM)
+ {
+ pContentArray = FX_NEW CPDF_Array();
+ pContentArray->AddReference(pDoc,pStream->GetObjNum());
+ pContentArray->AddReference(pDoc,pDirectObj->GetObjNum());
+ pContentArray->AddReference(pDoc, pEndStream);
+ pPageDic->SetAtReference("Contents", pDoc, pDoc->AddIndirectObject(pContentArray));
+ }
+ }
+ }
+
+ //Need to transform the patterns as well.
+ CPDF_Dictionary* pRes = pPageDic->GetDict(FX_BSTRC("Resources"));
+ if(pRes)
+ {
+ CPDF_Dictionary* pPattenDict = pRes->GetDict(FX_BSTRC("Pattern"));
+ if(pPattenDict)
+ {
+ FX_POSITION pos = pPattenDict->GetStartPos();
+ while(pos)
+ {
+ CPDF_Dictionary* pDict = NULL;
+ CFX_ByteString key;
+ CPDF_Object* pObj = pPattenDict->GetNextElement(pos, key);
+ if(pObj->GetType() == PDFOBJ_REFERENCE)
+ pObj = pObj->GetDirect();
+ if(pObj->GetType() == PDFOBJ_DICTIONARY)
+ {
+ pDict = (CPDF_Dictionary*)pObj;
+ }
+ else if(pObj->GetType() == PDFOBJ_STREAM)
+ {
+ pDict = ((CPDF_Stream*)pObj)->GetDict();
+ }
+ else
+ continue;
+
+ CFX_AffineMatrix m = pDict->GetMatrix(FX_BSTRC("Matrix"));
+ CFX_AffineMatrix t = *(CFX_AffineMatrix*)matrix;
+ m.Concat(t);
+ pDict->SetAtMatrix(FX_BSTRC("Matrix"), m);
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+DLLEXPORT void STDCALL FPDFPageObj_TransformClipPath(FPDF_PAGEOBJECT page_object,double a, double b, double c, double d, double e, double f)
+{
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
+ if(pPageObj == NULL)
+ return;
+ CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
+
+ //Special treatment to shading object, because the ClipPath for shading object is already transformed.
+ if(pPageObj->m_Type != PDFPAGE_SHADING)
+ pPageObj->TransformClipPath(matrix);
+ pPageObj->TransformGeneralState(matrix);
+}
+
+
+DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left, float bottom, float right, float top)
+{
+ CPDF_ClipPath* pNewClipPath = FX_NEW CPDF_ClipPath();
+ pNewClipPath->GetModify();
+ CPDF_Path Path;
+ Path.GetModify();
+ Path.AppendRect(left, bottom, right, top);
+ pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);
+ return pNewClipPath;
+}
+
+DLLEXPORT void STDCALL FPDF_DestroyClipPath(FPDF_CLIPPATH clipPath)
+{
+ if(clipPath)
+ delete (CPDF_ClipPath*)clipPath;
+}
+
+void OutputPath(CFX_ByteTextBuf& buf, CPDF_Path path)
+{
+ const CFX_PathData* pPathData = path;
+ if (pPathData == NULL) return;
+
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+
+ if (path.IsRect()) {
+ buf << (pPoints[0].m_PointX) << " " << (pPoints[0].m_PointY) << " "
+ << (pPoints[2].m_PointX - pPoints[0].m_PointX) << " "
+ << (pPoints[2].m_PointY - pPoints[0].m_PointY) << " re\n";
+ return;
+ }
+
+ CFX_ByteString temp;
+ for (int i = 0; i < pPathData->GetPointCount(); i ++) {
+ buf << (pPoints[i].m_PointX) << " " << (pPoints[i].m_PointY);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO)
+ buf << " m\n";
+ else if (point_type == FXPT_BEZIERTO) {
+ buf << " " << (pPoints[i+1].m_PointX) << " " << (pPoints[i+1].m_PointY) << " " <<
+ (pPoints[i+2].m_PointX) << " " << (pPoints[i+2].m_PointY);
+ if (pPoints[i+2].m_Flag & FXPT_CLOSEFIGURE)
+ buf << " c h\n";
+ else
+ buf << " c\n";
+ i += 2;
+ } else if (point_type == FXPT_LINETO) {
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE)
+ buf << " l h\n";
+ else
+ buf << " l\n";
+ }
+ }
+}
+
+DLLEXPORT void STDCALL FPDFPage_InsertClipPath(FPDF_PAGE page,FPDF_CLIPPATH clipPath)
+{
+ if(!page)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_Dictionary* pPageDic = pPage->m_pFormDict;
+ CPDF_Object* pContentObj = pPageDic->GetElement("Contents");
+ if(!pContentObj)
+ pContentObj = pPageDic->GetArray("Contents");
+ if(!pContentObj)
+ return;
+
+ CFX_ByteTextBuf strClip;
+ CPDF_ClipPath* pClipPath = (CPDF_ClipPath*)clipPath;
+ FX_DWORD i;
+ for (i = 0; i < pClipPath->GetPathCount(); i ++) {
+ CPDF_Path path = pClipPath->GetPath(i);
+ int iClipType = pClipPath->GetClipType(i);
+ if (path.GetPointCount() == 0) {
+ // Empty clipping (totally clipped out)
+ strClip << "0 0 m W n ";
+ } else {
+ OutputPath(strClip, path);
+ if (iClipType == FXFILL_WINDING)
+ strClip << "W n\n";
+ else
+ strClip << "W* n\n";
+ }
+ }
+ CPDF_Dictionary* pDic = FX_NEW CPDF_Dictionary;
+ CPDF_Stream* pStream = FX_NEW CPDF_Stream(NULL,0, pDic);
+ pStream->SetData(strClip.GetBuffer(), strClip.GetSize(), FALSE, FALSE);
+ CPDF_Document* pDoc = pPage->m_pDocument;
+ if(!pDoc)
+ return;
+ pDoc->AddIndirectObject(pStream);
+
+ CPDF_Array* pContentArray = NULL;
+ if (pContentObj && pContentObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pContentObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+
+ }
+ else if(pContentObj && pContentObj->GetType() == PDFOBJ_REFERENCE)
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pContentObj;
+ CPDF_Object* pDirectObj = pReference->GetDirect();
+ if(pDirectObj != NULL)
+ {
+ if(pDirectObj->GetType() == PDFOBJ_ARRAY)
+ {
+ pContentArray = (CPDF_Array*)pDirectObj;
+ CPDF_Reference* pRef = FX_NEW CPDF_Reference(pDoc, pStream->GetObjNum());
+ pContentArray->InsertAt(0, pRef);
+
+ }
+ else if(pDirectObj->GetType() == PDFOBJ_STREAM)
+ {
+ pContentArray = FX_NEW CPDF_Array();
+ pContentArray->AddReference(pDoc,pStream->GetObjNum());
+ pContentArray->AddReference(pDoc,pDirectObj->GetObjNum());
+ pPageDic->SetAtReference("Contents", pDoc, pDoc->AddIndirectObject(pContentArray));
+ }
+ }
+ }
+}
+
diff --git a/fpdfsdk/src/fpdfdoc.cpp b/fpdfsdk/src/fpdfdoc.cpp
new file mode 100644
index 0000000000..d5d9000bd2
--- /dev/null
+++ b/fpdfsdk/src/fpdfdoc.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdfdoc.h"
+
+static int this_module = 0;
+
+static CPDF_Bookmark FindBookmark(CPDF_BookmarkTree& tree, CPDF_Bookmark This, const CFX_WideString& title)
+{
+ if (This != NULL) {
+ // First check this item
+ CFX_WideString this_title = This.GetTitle();
+ if (this_title.CompareNoCase(title) == 0)
+ return This;
+ }
+ // go into children items
+ CPDF_Bookmark Child = tree.GetFirstChild(This);
+ while (Child != NULL) {
+ // check if this item
+ CPDF_Bookmark Found = FindBookmark(tree, Child, title);
+ if (Found) return Found;
+ Child = tree.GetNextSibling(Child);
+ }
+ return NULL;
+}
+
+DLLEXPORT FPDF_BOOKMARK STDCALL FPDFBookmark_Find(FPDF_DOCUMENT document, FPDF_WIDESTRING title)
+{
+ if (document == NULL) return NULL;
+ if (title == NULL || title[0] == 0) return NULL;
+
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_BookmarkTree tree(pDoc);
+
+ CFX_WideString wstr = CFX_WideString::FromUTF16LE(title);
+ return FindBookmark(tree, NULL, wstr);
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFBookmark_GetDest(FPDF_DOCUMENT document, FPDF_BOOKMARK bookmark)
+{
+ if (document == NULL) return NULL;
+ if (bookmark == NULL) return NULL;
+
+ CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Dest dest = Bookmark.GetDest(pDoc);
+ if (dest != NULL) return dest;
+
+ // If this bookmark is not directly associated with a dest, we try to get action
+ CPDF_Action Action = Bookmark.GetAction();
+ if (Action == NULL) return NULL;
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT FPDF_ACTION STDCALL FPDFBookmark_GetAction(FPDF_BOOKMARK bookmark)
+{
+ if (bookmark == NULL) return NULL;
+
+ CPDF_Bookmark Bookmark = (CPDF_Dictionary*)bookmark;
+ return Bookmark.GetAction();
+}
+
+DLLEXPORT unsigned long STDCALL FPDFAction_GetType(FPDF_ACTION action)
+{
+ if (action == NULL) return 0;
+
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+ CPDF_Action::ActionType type = Action.GetType();
+ switch (type) {
+ case CPDF_Action::GoTo:
+ return PDFACTION_GOTO;
+ case CPDF_Action::GoToR:
+ return PDFACTION_REMOTEGOTO;
+ case CPDF_Action::URI:
+ return PDFACTION_URI;
+ case CPDF_Action::Launch:
+ return PDFACTION_LAUNCH;
+ default:
+ return PDFACTION_UNSUPPORTED;
+ }
+ return PDFACTION_UNSUPPORTED;
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFAction_GetDest(FPDF_DOCUMENT document, FPDF_ACTION action)
+{
+ if (document == NULL) return NULL;
+ if (action == NULL) return NULL;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT unsigned long STDCALL FPDFAction_GetURIPath(FPDF_DOCUMENT document, FPDF_ACTION action,
+ void* buffer, unsigned long buflen)
+{
+ if (document == NULL) return 0;
+ if (action == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Action Action = (CPDF_Dictionary*)action;
+
+ CFX_ByteString path = Action.GetURI(pDoc);
+ unsigned long len = path.GetLength() + 1;
+ if (buffer != NULL && buflen >= len)
+ FXSYS_memcpy(buffer, (FX_LPCSTR)path, len);
+ return len;
+}
+
+DLLEXPORT unsigned long STDCALL FPDFDest_GetPageIndex(FPDF_DOCUMENT document, FPDF_DEST dest)
+{
+ if (document == NULL) return 0;
+ if (dest == NULL) return 0;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Dest Dest = (CPDF_Array*)dest;
+
+ return Dest.GetPageIndex(pDoc);
+}
+
+static void ReleaseLinkList(FX_LPVOID data)
+{
+ delete (CPDF_LinkList*)data;
+}
+
+DLLEXPORT FPDF_LINK STDCALL FPDFLink_GetLinkAtPoint(FPDF_PAGE page, double x, double y)
+{
+ if (page == NULL) return NULL;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ // Link list is stored with the document
+ CPDF_Document* pDoc = pPage->m_pDocument;
+ CPDF_LinkList* pLinkList = (CPDF_LinkList*)pDoc->GetPrivateData(&this_module);
+ if (pLinkList == NULL) {
+ pLinkList = FX_NEW CPDF_LinkList(pDoc);
+ pDoc->SetPrivateData(&this_module, pLinkList, ReleaseLinkList);
+ }
+
+ return pLinkList->GetLinkAtPoint(pPage, (FX_FLOAT)x, (FX_FLOAT)y);
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDFLink_GetDest(FPDF_DOCUMENT document, FPDF_LINK link)
+{
+ if (document == NULL) return NULL;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (link == NULL) return NULL;
+ CPDF_Link Link = (CPDF_Dictionary*)link;
+
+ FPDF_DEST dest = Link.GetDest(pDoc);
+ if (dest) return dest;
+
+ // If this link is not directly associated with a dest, we try to get action
+ CPDF_Action Action = Link.GetAction();
+ if (Action == NULL) return NULL;
+ return Action.GetDest(pDoc);
+}
+
+DLLEXPORT FPDF_ACTION STDCALL FPDFLink_GetAction(FPDF_LINK link)
+{
+ if (link == NULL) return NULL;
+ CPDF_Link Link = (CPDF_Dictionary*)link;
+
+ return Link.GetAction();
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_Enumerate(FPDF_PAGE page, int* startPos, FPDF_LINK* linkAnnot)
+{
+ if(!page || !startPos || !linkAnnot)
+ return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if(!pPage->m_pFormDict) return FALSE;
+ CPDF_Array* pAnnots = pPage->m_pFormDict->GetArray("Annots");
+ if(!pAnnots) return FALSE;
+ for (int i = *startPos; i < (int)pAnnots->GetCount(); i ++) {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pAnnots->GetElementValue(i);
+ if (pDict == NULL || pDict->GetType() != PDFOBJ_DICTIONARY) continue;
+ if(pDict->GetString(FX_BSTRC("Subtype")).Equal(FX_BSTRC("Link")))
+ {
+ *startPos = i+1;
+ *linkAnnot = (FPDF_LINK)pDict;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetAnnotRect(FPDF_LINK linkAnnot, FS_RECTF* rect)
+{
+ if(!linkAnnot || !rect)
+ return FALSE;
+ CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Rect rt = pAnnotDict->GetRect(FX_BSTRC("Rect"));
+ rect->left = rt.left;
+ rect->bottom = rt.bottom;
+ rect->right = rt.right;
+ rect->top = rt.top;
+ return TRUE;
+}
+
+DLLEXPORT int STDCALL FPDFLink_CountQuadPoints(FPDF_LINK linkAnnot)
+{
+ if(!linkAnnot)
+ return 0;
+ CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+ if (pArray == NULL)
+ return 0;
+ else
+ return pArray->GetCount() / 8;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFLink_GetQuadPoints(FPDF_LINK linkAnnot, int quadIndex, FS_QUADPOINTSF* quadPoints)
+{
+ if(!linkAnnot || !quadPoints)
+ return FALSE;
+ CPDF_Dictionary* pAnnotDict = (CPDF_Dictionary*)linkAnnot;
+ CPDF_Array* pArray = pAnnotDict->GetArray(FX_BSTRC("QuadPoints"));
+ if (pArray) {
+ if (0 > quadIndex || quadIndex >= (int)pArray->GetCount()/8 ||
+ ((quadIndex*8+7) >= (int)pArray->GetCount())) return FALSE;
+ quadPoints->x1 = pArray->GetNumber(quadIndex*8);
+ quadPoints->y1 = pArray->GetNumber(quadIndex*8+1);
+ quadPoints->x2 = pArray->GetNumber(quadIndex*8+2);
+ quadPoints->y2 = pArray->GetNumber(quadIndex*8+3);
+ quadPoints->x3 = pArray->GetNumber(quadIndex*8+4);
+ quadPoints->y3 = pArray->GetNumber(quadIndex*8+5);
+ quadPoints->x4 = pArray->GetNumber(quadIndex*8+6);
+ quadPoints->y4 = pArray->GetNumber(quadIndex*8+7);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+DLLEXPORT unsigned long STDCALL FPDF_GetMetaText(FPDF_DOCUMENT doc, FPDF_BYTESTRING tag,
+ void* buffer, unsigned long buflen)
+{
+ if (doc == NULL || tag == NULL) return 0;
+
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ // Get info dictionary
+ CPDF_Dictionary* pInfo = pDoc->GetInfo();
+ if (pInfo == NULL) return 0;
+
+ CFX_WideString text = pInfo->GetUnicodeText(tag);
+
+ // Use UTF-16LE encoding
+ CFX_ByteString bstr = text.UTF16LE_Encode();
+ unsigned long len = bstr.GetLength();
+ if (buffer != NULL || buflen >= len+2) {
+ FXSYS_memcpy(buffer, (FX_LPCSTR)bstr, len);
+ // use double zero as trailer
+ ((FX_BYTE*)buffer)[len] = ((FX_BYTE*)buffer)[len+1] = 0;
+ }
+ return len+2;
+}
+
diff --git a/fpdfsdk/src/fpdfeditimg.cpp b/fpdfsdk/src/fpdfeditimg.cpp
new file mode 100644
index 0000000000..ea81203cad
--- /dev/null
+++ b/fpdfsdk/src/fpdfeditimg.cpp
@@ -0,0 +1,74 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdfedit.h"
+
+
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_NewImgeObj(FPDF_DOCUMENT document)
+{
+ if (!document)
+ return NULL;
+ CPDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ CPDF_Image* pImg = FX_NEW CPDF_Image((CPDF_Document *)document);
+ pImageObj->m_pImage = pImg;
+ return pImageObj;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_LoadJpegFile(FPDF_PAGE* pages, int nCount,FPDF_PAGEOBJECT image_object, FPDF_FILEACCESS* fileAccess)
+{
+ if (!image_object || !fileAccess)
+ return FALSE;
+
+ IFX_FileRead* pFile = FX_NEW CPDF_CustomAccess(fileAccess);
+
+ CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
+ pImgObj->m_GeneralState.GetModify();
+ for (int index=0;index<nCount;index++)
+ {
+ CPDF_Page* pPage = (CPDF_Page*)pages[index];
+ pImgObj->m_pImage->ResetCache(pPage,NULL);
+ }
+ pImgObj->m_pImage->SetJpegImage(pFile);
+
+ return TRUE;
+}
+
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetMatrix (FPDF_PAGEOBJECT image_object,
+ double a, double b, double c, double d, double e, double f)
+{
+ if (!image_object)
+ return FALSE;
+ CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
+ pImgObj->m_Matrix.a = (FX_FLOAT)a;
+ pImgObj->m_Matrix.b = (FX_FLOAT)b;
+ pImgObj->m_Matrix.c = (FX_FLOAT)c;
+ pImgObj->m_Matrix.d = (FX_FLOAT)d;
+ pImgObj->m_Matrix.e = (FX_FLOAT)e;
+ pImgObj->m_Matrix.f = (FX_FLOAT)f;
+ pImgObj->CalcBoundingBox();
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFImageObj_SetBitmap(FPDF_PAGE* pages,int nCount,FPDF_PAGEOBJECT image_object,FPDF_BITMAP bitmap)
+{
+ if (!image_object || !bitmap)
+ return FALSE;
+ CFX_DIBitmap* pBmp = NULL;
+ pBmp = (CFX_DIBitmap*)bitmap;
+ CPDF_ImageObject* pImgObj = (CPDF_ImageObject*)image_object;
+ pImgObj->m_GeneralState.GetModify();
+ for (int index=0;index<nCount;index++)
+ {
+ CPDF_Page* pPage = (CPDF_Page*)pages[index];
+ pImgObj->m_pImage->ResetCache(pPage,NULL);
+ }
+ pImgObj->m_pImage->SetImage(pBmp,FALSE);
+ pImgObj->CalcBoundingBox();
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
new file mode 100644
index 0000000000..d9cbbe4733
--- /dev/null
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -0,0 +1,316 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+// #include "x:/pdf/fpdfapi5/include/fpdfapi.h"
+#include "../include/fsdk_define.h"
+#include "../include/fpdfedit.h"
+
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_CreateNewDocument()
+{
+ CPDF_Document* pDoc = FX_NEW CPDF_Document;
+ if (!pDoc)
+ return NULL;
+ pDoc->CreateNewDoc();
+ time_t currentTime;
+
+ CFX_ByteString DateStr;
+
+ if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
+ {
+ if ( -1 != time( &currentTime ) )
+ {
+ tm * pTM = localtime( &currentTime );
+ if ( pTM )
+ {
+ DateStr.Format( "D:%04d%02d%02d%02d%02d%02d", pTM->tm_year+1900, pTM->tm_mon+1,
+ pTM->tm_mday, pTM->tm_hour, pTM->tm_min, pTM->tm_sec );
+ }
+ }
+ }
+
+ CPDF_Dictionary* pInfoDict = NULL;
+ pInfoDict = pDoc->GetInfo();
+ if (pInfoDict)
+ {
+ if(FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
+ pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
+#ifdef FOXIT_CHROME_BUILD
+ pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Google"));
+#else
+ pInfoDict->SetAt("Creator",FX_NEW CPDF_String(L"Foxit PDF SDK DLL 2.0 - Foxit Software"));
+#endif
+ }
+
+ return pDoc;
+}
+
+DLLEXPORT void STDCALL FPDFPage_Delete(FPDF_DOCUMENT document, int page_index)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (pDoc == NULL)
+ return;
+ if (page_index < 0 || page_index >= pDoc->GetPageCount())
+ return;
+
+ pDoc->DeletePage(page_index);
+}
+
+DLLEXPORT FPDF_PAGE STDCALL FPDFPage_New(FPDF_DOCUMENT document, int page_index, double width, double height)
+{
+ if (!document)
+ return NULL;
+
+// CPDF_Parser* pParser = (CPDF_Parser*)document;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if(page_index < 0)
+ page_index = 0;
+ if(pDoc->GetPageCount()<page_index)
+ page_index = pDoc->GetPageCount();
+// if (page_index < 0 || page_index >= pDoc->GetPageCount())
+// return NULL;
+
+ CPDF_Dictionary* pPageDict = pDoc->CreateNewPage(page_index);
+ if(!pPageDict)
+ return NULL;
+ CPDF_Array* pMediaBoxArray = FX_NEW CPDF_Array;
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(0));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(width)));
+ pMediaBoxArray->Add(FX_NEW CPDF_Number(FX_FLOAT(height)));
+
+ pPageDict->SetAt("MediaBox", pMediaBoxArray);
+ pPageDict->SetAt("Rotate", FX_NEW CPDF_Number(0));
+ pPageDict->SetAt("Resources", FX_NEW CPDF_Dictionary);
+
+ CPDF_Page* pPage = FX_NEW CPDF_Page;
+ pPage->Load(pDoc,pPageDict);
+ pPage->ParseContent();
+
+ return pPage;
+}
+
+DLLEXPORT int STDCALL FPDFPage_GetRotation(FPDF_PAGE page)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return -1;
+ }
+ CPDF_Dictionary* pDict = pPage->m_pFormDict;
+
+ int rotate = 0;
+ if(pDict != NULL)
+ {
+ if(pDict->KeyExist("Rotate"))
+ rotate = pDict->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
+ else
+ {
+ if(pDict->KeyExist("Parent"))
+ {
+ CPDF_Dictionary* pPages = (CPDF_Dictionary*)pDict->GetElement("Parent")->GetDirect();
+ while(pPages)
+ {
+ if(pPages->KeyExist("Rotate"))
+ {
+ rotate = pPages->GetElement("Rotate")->GetDirect()->GetInteger() / 90;
+ break;
+ }
+ else if(pPages->KeyExist("Parent"))
+ pPages = (CPDF_Dictionary*)pPages->GetElement("Parent")->GetDirect();
+ else break;
+ }
+ }
+ }
+ }
+ else
+ {
+ return -1;
+ }
+
+ return rotate;
+}
+
+DLLEXPORT void STDCALL FPDFPage_InsertObject(FPDF_PAGE page, FPDF_PAGEOBJECT page_obj)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return;
+ }
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_obj;
+ if(pPageObj == NULL)
+ return;
+ FX_POSITION LastPersition = pPage->GetLastObjectPosition();
+
+ pPage->InsertObject(LastPersition, pPageObj);
+ switch(pPageObj->m_Type)
+ {
+ case FPDF_PAGEOBJ_PATH:
+ {
+ CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
+ pPathObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_TEXT:
+ {
+ // CPDF_PathObject* pPathObj = (CPDF_PathObject*)pPageObj;
+ // pPathObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_IMAGE:
+ {
+ CPDF_ImageObject* pImageObj = (CPDF_ImageObject*)pPageObj;
+ pImageObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_SHADING:
+ {
+ CPDF_ShadingObject* pShadingObj = (CPDF_ShadingObject*)pPageObj;
+ pShadingObj->CalcBoundingBox();
+ break;
+ }
+ case FPDF_PAGEOBJ_FORM:
+ {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ pFormObj->CalcBoundingBox();
+ break;
+ }
+ default:
+ break;
+ }
+
+ // pPage->ParseContent();
+ //pPage->GenerateContent();
+
+}
+
+DLLEXPORT int STDCALL FPDFPage_CountObject(FPDF_PAGE page)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return -1;
+ }
+ return pPage->CountObjects();
+// return 0;
+}
+
+DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPage_GetObject(FPDF_PAGE page, int index)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return NULL;
+ }
+ return pPage->GetObjectByIndex(index);
+// return NULL;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_HasTransparency(FPDF_PAGE page)
+{
+ if(!page) return FALSE;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ return pPage->BackgroundAlphaNeeded();
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPageObj_HasTransparency(FPDF_PAGEOBJECT pageObject)
+{
+ if(!pageObject) return FALSE;
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)pageObject;
+
+ const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
+ int blend_type = pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
+ if (blend_type != FXDIB_BLEND_NORMAL) return TRUE;
+
+ CPDF_Dictionary* pSMaskDict = pGeneralState ? (CPDF_Dictionary*)pGeneralState->m_pSoftMask : NULL;
+ if(pSMaskDict) return TRUE;
+
+ if(pGeneralState && pGeneralState->m_FillAlpha != 1.0f)
+ return TRUE;
+
+ if(pPageObj->m_Type == PDFPAGE_PATH)
+ {
+ if(pGeneralState && pGeneralState->m_StrokeAlpha != 1.0f)
+ return TRUE;
+ }
+
+ if(pPageObj->m_Type == PDFPAGE_FORM)
+ {
+ CPDF_FormObject* pFormObj = (CPDF_FormObject*)pPageObj;
+ if(pFormObj->m_pForm && (pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED))
+ return TRUE;
+ if(pFormObj->m_pForm && (!(pFormObj->m_pForm->m_Transparency & PDFTRANS_ISOLATED) && (pFormObj->m_pForm->m_Transparency & PDFTRANS_GROUP)))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDFPage_GenerateContent(FPDF_PAGE page)
+{
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (!pPage || !pPage->m_pFormDict || !pPage->m_pFormDict->KeyExist("Type")
+ || pPage->m_pFormDict->GetElement("Type")->GetDirect()->GetString().Compare("Page"))
+ {
+ return FALSE;
+ }
+ CPDF_PageContentGenerate CG(pPage);
+ CG.GenerateContent();
+
+ return TRUE;
+}
+
+DLLEXPORT void STDCALL FPDFPageObj_Transform(FPDF_PAGEOBJECT page_object,
+ double a, double b, double c, double d, double e, double f)
+{
+ CPDF_PageObject* pPageObj = (CPDF_PageObject*)page_object;
+ if(pPageObj == NULL)
+ return;
+//PDF_ImageObject* pImageObj = FX_NEW CPDF_ImageObject;
+ CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
+ pPageObj->Transform(matrix);
+}
+DLLEXPORT void STDCALL FPDFPage_TransformAnnots(FPDF_PAGE page,
+ double a, double b, double c, double d, double e, double f)
+{
+ if(page == NULL)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDF_AnnotList AnnotList(pPage);
+ for (int i=0; i<AnnotList.Count();i++)
+ {
+ CPDF_Annot* pAnnot = AnnotList.GetAt(i);
+ // transformAnnots Rectangle
+ CPDF_Rect rect;
+ pAnnot->GetRect(rect);
+ CFX_AffineMatrix matrix((FX_FLOAT)a,(FX_FLOAT)b,(FX_FLOAT)c,(FX_FLOAT)d,(FX_FLOAT)e,(FX_FLOAT)f);
+ rect.Transform(&matrix);
+ CPDF_Array *pRectArray = NULL;
+ pRectArray = pAnnot->m_pAnnotDict->GetArray("Rect");
+ if (!pRectArray) pRectArray=CPDF_Array::Create();
+ pRectArray->SetAt(0,FX_NEW CPDF_Number(rect.left));
+ pRectArray->SetAt(1,FX_NEW CPDF_Number(rect.bottom));
+ pRectArray->SetAt(2,FX_NEW CPDF_Number(rect.right));
+ pRectArray->SetAt(3,FX_NEW CPDF_Number(rect.top));
+ pAnnot->m_pAnnotDict->SetAt("Rect",pRectArray);
+
+ //Transform AP's rectangle
+ //To Do
+
+ }
+
+}
diff --git a/fpdfsdk/src/fpdfformfill.cpp b/fpdfsdk/src/fpdfformfill.cpp
new file mode 100644
index 0000000000..101146b099
--- /dev/null
+++ b/fpdfsdk/src/fpdfformfill.cpp
@@ -0,0 +1,441 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fpdfview.h"
+#include "../include/fpdfformfill.h"
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+
+
+#include "../include/javascript/IJavaScript.h"
+
+
+DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, FPDF_PAGE page,double page_x, double page_y)
+{
+ if(!page || !hHandle)
+ return -1;
+ CPDF_Page * pPage = (CPDF_Page*) page;
+
+ CPDF_InterForm * pInterForm = NULL;
+ pInterForm = new CPDF_InterForm(pPage->m_pDocument,FALSE);
+ if (!pInterForm)
+ return -1;
+ CPDF_FormControl* pFormCtrl = pInterForm->GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ if(!pFormCtrl)
+ {
+ delete pInterForm;
+ return -1;
+ }
+ CPDF_FormField* pFormField = pFormCtrl->GetField();
+ if(!pFormField)
+ {
+ delete pInterForm;
+ return -1;
+ }
+
+ int nType = pFormField->GetFieldType();
+ delete pInterForm;
+ return nType;
+}
+
+DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnviroument(FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo)
+{
+ if(!document || !formInfo || formInfo->version!=1)
+ return NULL;
+ CPDF_Document * pDocument = (CPDF_Document*) document;
+ CPDFDoc_Environment * pEnv = NULL;
+ pEnv = new CPDFDoc_Environment(pDocument);
+ if (!pEnv)
+ return NULL;
+ pEnv->RegAppHandle(formInfo);
+
+ if(pEnv->GetPDFDocument())
+ {
+ CPDFSDK_Document* pSDKDoc = new CPDFSDK_Document(pEnv->GetPDFDocument(), pEnv);
+ if(pSDKDoc)
+ pEnv->SetCurrentDoc(pSDKDoc);
+ }
+ return pEnv;
+}
+
+DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnviroument(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ ((CPDFDoc_Environment*)hHandle)->SetCurrentDoc(NULL);
+ delete pSDKDoc;
+ }
+ delete (CPDFDoc_Environment*)hHandle;
+ hHandle = NULL;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)
+{
+ if (!hHandle || !page)
+ return FALSE;
+// CPDF_Page * pPage = (CPDF_Page*) page;
+// CPDF_Document * pDoc = pPage->m_pDocument;
+// CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ return pPageView->OnMouseMove(pt, modifier);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ return pPageView->OnLButtonDown(pt, modifier);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int modifier, double page_x, double page_y)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+// double page_x = 0;
+// double page_y = 0;
+// pEnv->FFI_DeviceToPage(page, point_x, point_y, &page_x, &page_y);
+ CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y);
+ return pPageView->OnLButtonUp(pt, modifier);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nKeyCode, int modifier)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+
+
+ return pPageView->OnKeyDown(nKeyCode, modifier);
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nKeyCode, int modifier)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+
+
+ return pPageView->OnKeyUp(nKeyCode, modifier);
+}
+
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int nChar, int modifier)
+{
+ if (!hHandle || !page)
+ return FALSE;
+ CPDFSDK_Document* pFXDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pFXDoc)
+ return FALSE;
+ CPDFSDK_PageView* pPageView = pFXDoc->GetPageView((CPDF_Page*)page);
+ if(!pPageView)
+ return FALSE;
+ return pPageView->OnChar(nChar, modifier);
+
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return FALSE;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pSDKDoc)
+ return FALSE;
+ //Kill the current focus.
+ return pSDKDoc->KillFocusAnnot(0);
+}
+
+DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
+ int size_x, int size_y, int rotate, int flags)
+{
+ if (!hHandle || !page)
+ return ;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CPDF_RenderOptions options;
+ if (flags & FPDF_LCD_TEXT)
+ options.m_Flags |= RENDER_CLEARTYPE;
+ else
+ options.m_Flags &= ~RENDER_CLEARTYPE;
+
+ //Grayscale output
+ if (flags & FPDF_GRAYSCALE)
+ {
+ options.m_ColorMode = RENDER_COLOR_GRAY;
+ options.m_ForeColor = 0;
+ options.m_BackColor = 0xffffff;
+ }
+
+ options.m_AddFlags = flags >> 8;
+
+ options.m_pOCContext = FX_NEW CPDF_OCContext(pPage->m_pDocument);
+
+ //FXMT_CSLOCK_OBJ(&pPage->m_PageLock);
+
+ CFX_AffineMatrix matrix;
+ pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
+
+ FX_RECT clip;
+ clip.left = start_x;
+ clip.right = start_x + size_x;
+ clip.top = start_y;
+ clip.bottom = start_y + size_y;
+
+#ifdef _SKIA_SUPPORT_
+ CFX_SkiaDevice* pDevice = FX_NEW CFX_SkiaDevice;
+#else
+ CFX_FxgeDevice* pDevice = NULL;
+ pDevice = FX_NEW CFX_FxgeDevice;
+#endif
+
+ if (!pDevice)
+ return;
+ pDevice->Attach((CFX_DIBitmap*)bitmap);
+ pDevice->SaveState();
+ pDevice->SetClip_Rect(&clip);
+
+
+ CPDF_RenderContext* pContext = NULL;
+ pContext = FX_NEW CPDF_RenderContext;
+ if (!pContext)
+ {
+ delete pDevice;
+ pDevice = NULL;
+ return;
+ }
+
+
+// CPDF_Document* pDoc = pPage->m_pDocument;
+ CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle;
+ CPDFSDK_Document* pFXDoc = pEnv->GetCurrentDoc();
+ if(!pFXDoc)
+ {
+ delete pContext;
+ delete pDevice;
+ pContext = NULL;
+ pDevice = NULL;
+ return;
+ }
+ if(CPDFSDK_PageView* pPageView = pFXDoc->GetPageView(pPage))
+ {
+ pPageView->PageView_OnDraw(pDevice, &matrix, &options);
+ }
+ pDevice->RestoreState();
+
+ if(options.m_pOCContext)
+ {
+ delete options.m_pOCContext;
+ options.m_pOCContext = NULL;
+ }
+ if(pContext)
+ {
+ delete pContext;
+ pContext = NULL;
+ }
+ if(pDevice)
+ {
+ delete pDevice;
+ pDevice = NULL;
+ }
+
+}
+
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, int fieldType, unsigned long color)
+{
+ if (!hHandle)
+ return;
+// CPDFDoc_Environment* pEnv = (CPDFDoc_Environment* )hHandle;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ {
+ pInterForm->SetHighlightColor(color, fieldType);
+ }
+
+ }
+
+}
+
+DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, unsigned char alpha)
+{
+ if (!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ pInterForm->SetHighlightAlpha(alpha);
+ }
+}
+
+DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle)
+{
+ if (!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ if(CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm())
+ pInterForm->RemoveAllHighLight();
+ }
+}
+
+DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(!pSDKDoc)
+ return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, TRUE);
+ if(pPageView)
+ {
+ pPageView->SetValid(TRUE);
+ }
+}
+
+DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE);
+ if(pPageView)
+ {
+ pPageView->SetValid(FALSE);
+ // ReMovePageView() takes care of the delete for us.
+ pSDKDoc->ReMovePageView(pPage);
+ }
+}
+DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return;
+ if( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())
+ {
+ pSDKDoc->InitPageView();
+ if(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())
+ pSDKDoc->ProcJavascriptFun();
+ }
+}
+
+DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle)
+{
+ if(!hHandle)
+ return;
+ if( CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc())
+ {
+ if(((CPDFDoc_Environment*)hHandle)->IsJSInitiated())
+ pSDKDoc->ProcOpenAction();
+ }
+}
+DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaType)
+{
+ if(!hHandle)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ if(pSDKDoc)
+ {
+ CPDF_Document* pDoc = pSDKDoc->GetDocument();
+ CPDF_Dictionary* pDic = pDoc->GetRoot();
+ if (!pDic)
+ return;
+ CPDF_AAction aa = pDic->GetDict(FX_BSTRC("AA"));
+
+ if(aa.ActionExist((CPDF_AAction::AActionType)aaType))
+ {
+ CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType);
+ CPDFSDK_ActionHandler *pActionHandler = ((CPDFDoc_Environment*)hHandle)->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+ pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, pSDKDoc);
+ }
+ }
+}
+DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandle, int aaType)
+{
+ if(!hHandle || !page)
+ return;
+ CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetCurrentDoc();
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE);
+ if(pPageView)
+ {
+ CPDFDoc_Environment *pEnv = pSDKDoc->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler *pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ CPDF_Dictionary *pPageDict = pPage->m_pFormDict;
+ ASSERT(pPageDict != NULL);
+
+ CPDF_AAction aa = pPageDict->GetDict(FX_BSTRC("AA"));
+
+ FX_BOOL bExistOAAction = FALSE;
+ FX_BOOL bExistCAAction = FALSE;
+ if (FPDFPAGE_AACTION_OPEN == aaType)
+ {
+ bExistOAAction = aa.ActionExist(CPDF_AAction::OpenPage);
+ if (bExistOAAction)
+ {
+ CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage);
+ pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc);
+ }
+ }
+ else
+ {
+ bExistCAAction = aa.ActionExist(CPDF_AAction::ClosePage);
+ if (bExistCAAction)
+ {
+ CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage);
+ pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc);
+ }
+ }
+ }
+}
+
+
diff --git a/fpdfsdk/src/fpdfoom.cpp b/fpdfsdk/src/fpdfoom.cpp
new file mode 100644
index 0000000000..fb67a5a1fe
--- /dev/null
+++ b/fpdfsdk/src/fpdfoom.cpp
@@ -0,0 +1,27 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdfoom.h"
+
+void OOM_Handler(FXMEM_FoxitMgr* pFoxitMgr, void* param)
+{
+ if (!param) return;
+ ((OOM_INFO*)param)->FSDK_OOM_Handler((OOM_INFO*)param);
+}
+
+
+DLLEXPORT FX_BOOL STDCALL FSDK_SetOOMHandler(OOM_INFO* oomInfo)
+{
+#ifndef _FXSDK_OPENSOURCE_
+ if (!oomInfo || oomInfo->version!=1)
+ return FALSE;
+ FXMEM_SetOOMHandler(FXMEM_GetDefaultMgr(),OOM_Handler,oomInfo);
+ return TRUE;
+#else
+ return TRUE;
+#endif
+}
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp
new file mode 100644
index 0000000000..e605484cb3
--- /dev/null
+++ b/fpdfsdk/src/fpdfppo.cpp
@@ -0,0 +1,460 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fpdfppo.h"
+#include "../include/fsdk_define.h"
+
+class CPDF_PageOrganizer
+{
+public:
+ CPDF_PageOrganizer();
+ ~CPDF_PageOrganizer();
+
+public:
+ FX_BOOL PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc);
+ FX_BOOL ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum, CPDF_Document *pDestPDFDoc, int nIndex);
+ CPDF_Object* PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag);
+ FX_BOOL UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr);
+ int GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr, CPDF_Reference *pRef);
+
+};
+
+
+CPDF_PageOrganizer::CPDF_PageOrganizer()
+{
+
+}
+
+CPDF_PageOrganizer::~CPDF_PageOrganizer()
+{
+
+}
+
+FX_BOOL CPDF_PageOrganizer::PDFDocInit(CPDF_Document *pDestPDFDoc, CPDF_Document *pSrcPDFDoc)
+{
+ if(!pDestPDFDoc || !pSrcPDFDoc)
+ return false;
+
+ CPDF_Dictionary* pNewRoot = pDestPDFDoc->GetRoot();
+ if(!pNewRoot) return FALSE;
+
+ //Set the document information////////////////////////////////////////////
+
+ CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();
+
+ if(!DInfoDict)
+ return FALSE;
+
+ CFX_ByteString producerstr;
+
+#ifdef FOXIT_CHROME_BUILD
+ producerstr.Format("Google");
+#else
+ producerstr.Format("Foxit PDF SDK %s - Foxit Corporation", "2.0");
+#endif
+ DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
+
+ //Set type////////////////////////////////////////////////////////////////
+ CFX_ByteString cbRootType = pNewRoot->GetString("Type","");
+ if( cbRootType.Equal("") )
+ {
+ pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
+ }
+
+ CPDF_Dictionary* pNewPages = (CPDF_Dictionary*)pNewRoot->GetElement("Pages")->GetDirect();
+ if(!pNewPages)
+ {
+ pNewPages = new CPDF_Dictionary;
+ FX_DWORD NewPagesON = pDestPDFDoc->AddIndirectObject(pNewPages);
+ pNewRoot->SetAt("Pages", new CPDF_Reference(pDestPDFDoc, NewPagesON));
+ }
+
+ CFX_ByteString cbPageType = pNewPages->GetString("Type","");
+ if(cbPageType.Equal(""))
+ {
+ pNewPages->SetAt("Type", new CPDF_Name("Pages"));
+ }
+
+ CPDF_Array* pKeysArray = pNewPages->GetArray("Kids");
+ if(pKeysArray == NULL)
+ {
+ CPDF_Array* pNewKids = new CPDF_Array;
+ FX_DWORD Kidsobjnum = -1;
+ Kidsobjnum = pDestPDFDoc->AddIndirectObject(pNewKids);//, Kidsobjnum, Kidsgennum);
+
+ pNewPages->SetAt("Kids", new CPDF_Reference(pDestPDFDoc, Kidsobjnum));//, Kidsgennum));
+ pNewPages->SetAt("Count", new CPDF_Number(0));
+ }
+
+ return true;
+}
+
+FX_BOOL CPDF_PageOrganizer::ExportPage(CPDF_Document *pSrcPDFDoc, CFX_WordArray* nPageNum,
+ CPDF_Document *pDestPDFDoc,int nIndex)
+{
+ int curpage =nIndex;
+
+ CFX_MapPtrToPtr* pMapPtrToPtr = new CFX_MapPtrToPtr;
+ pMapPtrToPtr->InitHashTable(1001);
+
+ for(int i=0; i<nPageNum->GetSize(); i++)
+ {
+
+ CPDF_Dictionary* pCurPageDict = pDestPDFDoc->CreateNewPage(curpage);
+ CPDF_Dictionary* pSrcPageDict = pSrcPDFDoc->GetPage(nPageNum->GetAt(i)-1);
+ if(!pSrcPageDict || !pCurPageDict)
+ {
+ delete pMapPtrToPtr;
+ return FALSE;
+ }
+
+ // Clone the page dictionary///////////
+ FX_POSITION SrcPos = pSrcPageDict->GetStartPos();
+ while (SrcPos)
+ {
+ CFX_ByteString cbSrcKeyStr;
+ CPDF_Object* pObj = pSrcPageDict->GetNextElement(SrcPos, cbSrcKeyStr);
+ if(cbSrcKeyStr.Compare(("Type")) && cbSrcKeyStr.Compare(("Parent")))
+ {
+ if(pCurPageDict->KeyExist(cbSrcKeyStr))
+ pCurPageDict->RemoveAt(cbSrcKeyStr);
+ pCurPageDict->SetAt(cbSrcKeyStr, pObj->Clone());
+ }
+ }
+
+ //inheritable item///////////////////////
+ CPDF_Object* pInheritable = NULL;
+ //1 MediaBox //required
+ if(!pCurPageDict->KeyExist("MediaBox"))
+ {
+
+ pInheritable = PageDictGetInheritableTag(pSrcPageDict, "MediaBox");
+ if(!pInheritable)
+ {
+ //Search the "CropBox" from source page dictionary, if not exists,we take the letter size.
+ pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
+ if(pInheritable)
+ pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
+ else
+ {
+ //Make the default size to be letter size (8.5'x11')
+ CPDF_Array* pArray = new CPDF_Array;
+ pArray->AddNumber(0);
+ pArray->AddNumber(0);
+ pArray->AddNumber(612);
+ pArray->AddNumber(792);
+ pCurPageDict->SetAt("MediaBox", pArray);
+ }
+ }
+ else
+ pCurPageDict->SetAt("MediaBox", pInheritable->Clone());
+ }
+ //2 Resources //required
+ if(!pCurPageDict->KeyExist("Resources"))
+ {
+ pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Resources");
+ if(!pInheritable)
+ {
+ delete pMapPtrToPtr;
+ return FALSE;
+ }
+ pCurPageDict->SetAt("Resources", pInheritable->Clone());
+ }
+ //3 CropBox //Optional
+ if(!pCurPageDict->KeyExist("CropBox"))
+ {
+ pInheritable = PageDictGetInheritableTag(pSrcPageDict, "CropBox");
+ if(pInheritable)
+ pCurPageDict->SetAt("CropBox", pInheritable->Clone());
+ }
+ //4 Rotate //Optional
+ if(!pCurPageDict->KeyExist("Rotate"))
+ {
+ pInheritable = PageDictGetInheritableTag(pSrcPageDict, "Rotate");
+ if(pInheritable)
+ pCurPageDict->SetAt("Rotate", pInheritable->Clone());
+ }
+
+ /////////////////////////////////////////////
+ //Update the reference
+ FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();
+ FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();
+
+ pMapPtrToPtr->SetAt((FX_LPVOID)(FX_UINTPTR)dwOldPageObj, (FX_LPVOID)(FX_UINTPTR)dwNewPageObj);
+
+ this->UpdateReference(pCurPageDict, pDestPDFDoc, pMapPtrToPtr);
+ curpage++;
+ }
+
+ delete pMapPtrToPtr;
+ return TRUE;
+}
+
+CPDF_Object* CPDF_PageOrganizer::PageDictGetInheritableTag(CPDF_Dictionary *pDict, CFX_ByteString nSrctag)
+{
+ if(!pDict || !pDict->KeyExist("Type") || nSrctag.IsEmpty())
+ return NULL;
+
+ CPDF_Object* pType = pDict->GetElement("Type")->GetDirect();
+ if(!pType || pType->GetType() != PDFOBJ_NAME) return NULL;
+
+ if(pType->GetString().Compare("Page")) return NULL;
+
+ if(!pDict->KeyExist("Parent")) return NULL;
+ CPDF_Object* pParent = pDict->GetElement("Parent")->GetDirect();
+ if(!pParent || pParent->GetType() != PDFOBJ_DICTIONARY) return NULL;
+
+ CPDF_Dictionary* pp = (CPDF_Dictionary*)pParent;
+
+ if(pDict->KeyExist((const char*)nSrctag))
+ return pDict->GetElement((const char*)nSrctag);
+ while (pp)
+ {
+ if(pp->KeyExist((const char*)nSrctag))
+ return pp->GetElement((const char*)nSrctag);
+ else if(pp->KeyExist("Parent"))
+ pp = (CPDF_Dictionary*)pp->GetElement("Parent")->GetDirect();
+ else break;
+ }
+
+ return NULL;
+}
+
+FX_BOOL CPDF_PageOrganizer::UpdateReference(CPDF_Object *pObj, CPDF_Document *pDoc,
+ CFX_MapPtrToPtr* pMapPtrToPtr)
+{
+ switch (pObj->GetType())
+ {
+ case PDFOBJ_REFERENCE:
+ {
+ CPDF_Reference* pReference = (CPDF_Reference*)pObj;
+ int newobjnum = GetNewObjId(pDoc, pMapPtrToPtr, pReference);
+ if (newobjnum == 0) return FALSE;
+ pReference->SetRef(pDoc, newobjnum);//, 0);
+ break;
+ }
+ case PDFOBJ_DICTIONARY:
+ {
+ CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
+
+ FX_POSITION pos = pDict->GetStartPos();
+ while(pos)
+ {
+ CFX_ByteString key("");
+ CPDF_Object* pNextObj = pDict->GetNextElement(pos, key);
+ if (!FXSYS_strcmp(key, "Parent") || !FXSYS_strcmp(key, "Prev") || !FXSYS_strcmp(key, "First"))
+ continue;
+ if(pNextObj)
+ {
+ if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+ pDict->RemoveAt(key);
+ }
+ else
+ return FALSE;
+ }
+ break;
+ }
+ case PDFOBJ_ARRAY:
+ {
+ CPDF_Array* pArray = (CPDF_Array*)pObj;
+ FX_DWORD count = pArray->GetCount();
+ for(FX_DWORD i = 0; i < count; i ++)
+ {
+ CPDF_Object* pNextObj = pArray->GetElement(i);
+ if(pNextObj)
+ {
+ if(!UpdateReference(pNextObj, pDoc, pMapPtrToPtr))
+ return FALSE;
+ }
+ else
+ return FALSE;
+ }
+ break;
+ }
+ case PDFOBJ_STREAM:
+ {
+ CPDF_Stream* pStream = (CPDF_Stream*)pObj;
+ CPDF_Dictionary* pDict = pStream->GetDict();
+ if(pDict)
+ {
+ if(!UpdateReference(pDict, pDoc, pMapPtrToPtr))
+ return FALSE;
+ }
+ else
+ return FALSE;
+ break;
+ }
+ default: break;
+ }
+
+ return TRUE;
+}
+
+int CPDF_PageOrganizer::GetNewObjId(CPDF_Document *pDoc, CFX_MapPtrToPtr* pMapPtrToPtr,
+ CPDF_Reference *pRef)
+{
+ size_t dwObjnum = 0;
+ if(!pRef)
+ return 0;
+ dwObjnum = pRef->GetRefObjNum();
+
+ size_t dwNewObjNum = 0;
+
+ pMapPtrToPtr->Lookup((FX_LPVOID)dwObjnum, (FX_LPVOID&)dwNewObjNum);
+ if(dwNewObjNum)
+ {
+ return (int)dwNewObjNum;
+ }
+ else
+ {
+ CPDF_Object* pClone = pRef->GetDirect()->Clone();
+ if(!pClone) return 0;
+
+ if(pClone->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pDictClone = (CPDF_Dictionary*)pClone;
+ if(pDictClone->KeyExist("Type"))
+ {
+ CFX_ByteString strType = pDictClone->GetString("Type");
+ if(!FXSYS_stricmp(strType, "Pages"))
+ {
+ pDictClone->Release();
+ return 4;
+ }
+ else if(!FXSYS_stricmp(strType, "Page"))
+ {
+ pDictClone->Release();
+ return 0;
+ }
+ }
+ }
+ dwNewObjNum = pDoc->AddIndirectObject(pClone);//, onum, gnum);
+ pMapPtrToPtr->SetAt((FX_LPVOID)dwObjnum, (FX_LPVOID)dwNewObjNum);
+
+ if(!UpdateReference(pClone, pDoc, pMapPtrToPtr))
+ {
+ pClone->Release();
+ return 0;
+ }
+ return (int)dwNewObjNum;
+ }
+ return 0;
+}
+
+FPDF_BOOL ParserPageRangeString(CFX_ByteString rangstring, CFX_WordArray* pageArray,int nCount)
+{
+
+ if(rangstring.GetLength() != 0)
+ {
+ rangstring.Remove(' ');
+ int nLength = rangstring.GetLength();
+ CFX_ByteString cbCompareString("0123456789-,");
+ for(int i=0; i<nLength; i++)
+ {
+ if(cbCompareString.Find(rangstring[i]) == -1)
+ return FALSE;
+ }
+ CFX_ByteString cbMidRange;
+ int nStringFrom = 0;
+ int nStringTo=0;
+ while(nStringTo < nLength)
+ {
+ nStringTo = rangstring.Find(',',nStringFrom);
+ if(nStringTo == -1)
+ {
+ nStringTo = nLength;
+ }
+ cbMidRange = rangstring.Mid(nStringFrom,nStringTo-nStringFrom);
+
+ int nMid = cbMidRange.Find('-');
+ if(nMid == -1)
+ {
+ long lPageNum = atol(cbMidRange);
+ if(lPageNum <= 0 || lPageNum > nCount)
+ return FALSE;
+ pageArray->Add((FX_WORD)lPageNum);
+ }
+ else
+ {
+ int nStartPageNum = atol(cbMidRange.Mid(0,nMid));
+ if (nStartPageNum ==0)
+ {
+ return FALSE;
+ }
+
+
+ nMid = nMid+1;
+ int nEnd = cbMidRange.GetLength()-nMid;
+
+ if(nEnd ==0)return FALSE;
+
+ // int nEndPageNum = (nEnd == 0)?nCount:atol(cbMidRange.Mid(nMid,nEnd));
+ int nEndPageNum = atol(cbMidRange.Mid(nMid,nEnd));
+
+ if(nStartPageNum < 0 ||nStartPageNum >nEndPageNum|| nEndPageNum > nCount)
+ {
+ return FALSE;
+ }
+ else
+ {
+ for(int nIndex=nStartPageNum; nIndex <= nEndPageNum; nIndex ++)
+ pageArray->Add(nIndex);
+ }
+ }
+ nStringFrom = nStringTo +1;
+ }
+ }
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_ImportPages(FPDF_DOCUMENT dest_doc,FPDF_DOCUMENT src_doc,
+ FPDF_BYTESTRING pagerange, int index)
+{
+ if(dest_doc == NULL || src_doc == NULL )
+ return FALSE;
+ CFX_WordArray pageArray;
+ CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;
+ int nCount = pSrcDoc->GetPageCount();
+ if(pagerange)
+ {
+ if(ParserPageRangeString(pagerange,&pageArray,nCount) == FALSE)
+ return FALSE;
+ }
+ else
+ {
+ for(int i=1; i<=nCount; i++)
+ {
+ pageArray.Add(i);
+ }
+ }
+
+ CPDF_Document* pDestDoc = (CPDF_Document*)dest_doc;
+ CPDF_PageOrganizer pageOrg;
+
+ pageOrg.PDFDocInit(pDestDoc,pSrcDoc);
+
+ if(pageOrg.ExportPage(pSrcDoc,&pageArray,pDestDoc,index))
+ return TRUE;
+ return FALSE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_CopyViewerPreferences(FPDF_DOCUMENT dest_doc, FPDF_DOCUMENT src_doc)
+{
+ if(src_doc == NULL || dest_doc == NULL)
+ return false;
+ CPDF_Document* pSrcDoc = (CPDF_Document*)src_doc;
+ CPDF_Dictionary* pSrcDict = pSrcDoc->GetRoot();
+ pSrcDict = pSrcDict->GetDict(FX_BSTRC("ViewerPreferences"));;
+ if(!pSrcDict)
+ return FALSE;
+ CPDF_Document* pDstDoc = (CPDF_Document*)dest_doc;
+ CPDF_Dictionary* pDstDict = pDstDoc->GetRoot();
+ if(!pDstDict)
+ return FALSE;
+ pDstDict->SetAt(FX_BSTRC("ViewerPreferences"), pSrcDict->Clone(TRUE));
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fpdfsave.cpp b/fpdfsdk/src/fpdfsave.cpp
new file mode 100644
index 0000000000..8272eb0fee
--- /dev/null
+++ b/fpdfsdk/src/fpdfsave.cpp
@@ -0,0 +1,91 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdfsave.h"
+#include "../include/fpdfedit.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+class CFX_IFileWrite:public IFX_StreamWrite
+{
+
+public:
+ CFX_IFileWrite();
+ FX_BOOL Init( FPDF_FILEWRITE * pFileWriteStruct );
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size);
+ virtual void Release(){};
+
+protected:
+ FPDF_FILEWRITE* m_pFileWriteStruct;
+};
+
+CFX_IFileWrite::CFX_IFileWrite()
+{
+ m_pFileWriteStruct = NULL;
+}
+
+FX_BOOL CFX_IFileWrite::Init( FPDF_FILEWRITE * pFileWriteStruct )
+{
+ if (!pFileWriteStruct)
+ return FALSE;
+ else
+ {
+ m_pFileWriteStruct = pFileWriteStruct;
+ }
+ return TRUE;
+}
+
+FX_BOOL CFX_IFileWrite::WriteBlock(const void* pData, size_t size)
+{
+ if (m_pFileWriteStruct)
+ {
+ m_pFileWriteStruct->WriteBlock( m_pFileWriteStruct, pData, size );
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+FPDF_BOOL _FPDF_Doc_Save(FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,FPDF_DWORD flags, FPDF_BOOL bSetVersion,
+ int fileVerion)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (!pDoc)
+ return 0;
+
+ if ( flags < 1 || flags > 2 )
+ {
+ flags = 0;
+ }
+
+ CPDF_Creator FileMaker(pDoc);
+ if(bSetVersion)
+ FileMaker.SetFileVersion(fileVerion);
+ CFX_IFileWrite* pStreamWrite = NULL;
+ FX_BOOL bRet;
+ pStreamWrite = new CFX_IFileWrite;
+ pStreamWrite->Init( pFileWrite );
+ bRet = FileMaker.Create(pStreamWrite, flags);
+ delete pStreamWrite;
+ return bRet;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveAsCopy( FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags )
+{
+ return _FPDF_Doc_Save(document, pFileWrite, flags, FALSE , 0);
+}
+
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_SaveWithVersion( FPDF_DOCUMENT document,FPDF_FILEWRITE * pFileWrite,
+ FPDF_DWORD flags, int fileVersion)
+{
+ return _FPDF_Doc_Save(document, pFileWrite, flags, TRUE , fileVersion);
+}
diff --git a/fpdfsdk/src/fpdfsdkdll.rc b/fpdfsdk/src/fpdfsdkdll.rc
new file mode 100644
index 0000000000..ee12049847
--- /dev/null
+++ b/fpdfsdk/src/fpdfsdkdll.rc
@@ -0,0 +1,109 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Chinese (P.R.C.) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+#ifdef _WIN32
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+#endif //_WIN32
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 2,0,0,1705
+ PRODUCTVERSION 2,0,0,1705
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "080904b0"
+ BEGIN
+ VALUE "Comments", "Foxit Corporation\0"
+ VALUE "CompanyName", "Foxit Corporation\0"
+ VALUE "FileDescription", "fpdfsdk\0"
+ VALUE "FileVersion", "2, 0, 0, 1705\0"
+ VALUE "InternalName", "fpdfsdk\0"
+ VALUE "LegalCopyright", "Copyright (C) 2004-2009 Foxit Corporation\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "fpdfsdk.dll\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "Foxit PDF SDK DLL\0"
+ VALUE "ProductVersion", "2, 0, 0, 1705\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x809, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // Chinese (P.R.C.) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/fpdfsdk/src/fpdftext.cpp b/fpdfsdk/src/fpdftext.cpp
new file mode 100644
index 0000000000..6042fcc7b1
--- /dev/null
+++ b/fpdfsdk/src/fpdftext.cpp
@@ -0,0 +1,278 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdftext.h"
+
+#ifdef _WIN32
+#include <tchar.h>
+#endif
+
+ // jabdelmalek: commented out to build on Linux. Not used.
+ // extern HANDLE g_hModule;
+
+DLLEXPORT FPDF_TEXTPAGE STDCALL FPDFText_LoadPage(FPDF_PAGE page)
+{
+ if (!page) return NULL;
+ IPDF_TextPage* textpage=NULL;
+ try
+ {
+ CPDF_ViewerPreferences viewRef(((CPDF_Page*)page)->m_pDocument);
+ textpage=IPDF_TextPage::CreateTextPage((CPDF_Page*)page,viewRef.IsDirectionR2L());
+ textpage->ParseTextPage();
+ }
+ catch (...)
+ {
+ if (textpage)
+ delete textpage;
+ return NULL;
+ }
+ return textpage;
+}
+DLLEXPORT void STDCALL FPDFText_ClosePage(FPDF_TEXTPAGE text_page)
+{
+ if (text_page){
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ delete textpage;
+ text_page=NULL;
+ }
+}
+DLLEXPORT int STDCALL FPDFText_CountChars(FPDF_TEXTPAGE text_page)
+{
+ if (!text_page) return -1;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->CountChars();
+}
+DLLEXPORT unsigned int STDCALL FPDFText_GetUnicode(FPDF_TEXTPAGE text_page, int index)
+{
+ if (!text_page) return -1;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return 0;
+
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ return charinfo.m_Unicode;
+}
+DLLEXPORT double STDCALL FPDFText_GetFontSize(FPDF_TEXTPAGE text_page, int index)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return 0;
+
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ return charinfo.m_FontSize;
+}
+
+DLLEXPORT void STDCALL FPDFText_GetCharBox(FPDF_TEXTPAGE text_page, int index,double* left,
+ double* right, double* bottom, double* top)
+{
+ if (!text_page) return;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (index<0 || index>=textpage->CountChars()) return ;
+ FPDF_CHAR_INFO charinfo;
+ textpage->GetCharInfo(index,charinfo);
+ *left=charinfo.m_CharBox.left;
+ *right=charinfo.m_CharBox.right;
+ *bottom=charinfo.m_CharBox.bottom;
+ *top=charinfo.m_CharBox.top;
+}
+
+//select
+DLLEXPORT int STDCALL FPDFText_GetCharIndexAtPos(FPDF_TEXTPAGE text_page,double x,double y,double xTorelance,double yTorelance)
+{
+ if (!text_page) return -3;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->GetIndexAtPos((FX_FLOAT)x,(FX_FLOAT)y,(FX_FLOAT)xTorelance,(FX_FLOAT)yTorelance);
+}
+
+DLLEXPORT int STDCALL FPDFText_GetText(FPDF_TEXTPAGE text_page,int start,int count,unsigned short* result)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+
+ if (start>=textpage->CountChars()) return 0;
+
+ CFX_WideString str=textpage->GetPageText(start,count);
+ if(str.GetLength()>count)
+ str = str.Left(count);
+
+ CFX_ByteString cbUTF16str = str.UTF16LE_Encode();
+ FXSYS_memcpy(result,cbUTF16str.GetBuffer(cbUTF16str.GetLength()),cbUTF16str.GetLength());
+ cbUTF16str.ReleaseBuffer(cbUTF16str.GetLength());
+
+ return cbUTF16str.GetLength()/sizeof(unsigned short);
+}
+
+DLLEXPORT int STDCALL FPDFText_CountRects(FPDF_TEXTPAGE text_page,int start,int count)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ return textpage->CountRects(start,count);
+
+}
+DLLEXPORT void STDCALL FPDFText_GetRect(FPDF_TEXTPAGE text_page,int rect_index, double* left,double* top,
+ double* right, double* bottom)
+{
+ if (!text_page) return;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ CFX_FloatRect rect;
+ textpage->GetRect(rect_index,rect.left,rect.top,rect.right,rect.bottom);
+ *left=rect.left;
+ *top=rect.top;
+ *right=rect.right;
+ *bottom=rect.bottom;
+}
+
+DLLEXPORT int STDCALL FPDFText_GetBoundedText(FPDF_TEXTPAGE text_page,double left, double top,
+ double right, double bottom,unsigned short* buffer,int buflen)
+{
+ if (!text_page) return 0;
+ IPDF_TextPage* textpage=(IPDF_TextPage*)text_page;
+ CFX_FloatRect rect((FX_FLOAT)left,(FX_FLOAT)bottom,(FX_FLOAT)right,(FX_FLOAT)top);
+ CFX_WideString str=textpage->GetTextByRect(rect);
+
+ if (buflen<=0 || buffer==NULL)
+ {
+ return str.GetLength();
+ }
+
+ CFX_ByteString cbUTF16Str = str.UTF16LE_Encode();
+ int len = cbUTF16Str.GetLength()/sizeof(unsigned short);
+ int size = buflen > len ? len : buflen;
+ FXSYS_memcpy(buffer,cbUTF16Str.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
+ cbUTF16Str.ReleaseBuffer(size*sizeof(unsigned short));
+
+ return size;
+
+}
+
+//Search
+//-1 for end
+DLLEXPORT FPDF_SCHHANDLE STDCALL FPDFText_FindStart(FPDF_TEXTPAGE text_page,FPDF_WIDESTRING findwhat,unsigned long flags,int start_index)
+{
+ if (!text_page) return NULL;
+ IPDF_TextPageFind* textpageFind=NULL;
+ try
+ {
+ textpageFind=IPDF_TextPageFind::CreatePageFind((IPDF_TextPage*)text_page);
+ textpageFind->FindFirst(CFX_WideString::FromUTF16LE(findwhat),flags,start_index);
+ }
+ catch (...)
+ {
+ if (textpageFind)
+ delete textpageFind;
+ return NULL;
+ }
+ return textpageFind;
+}
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindNext(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return FALSE;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->FindNext();
+}
+DLLEXPORT FPDF_BOOL STDCALL FPDFText_FindPrev(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return FALSE;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->FindPrev();
+}
+DLLEXPORT int STDCALL FPDFText_GetSchResultIndex(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return 0;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->GetCurOrder();
+}
+DLLEXPORT int STDCALL FPDFText_GetSchCount(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return 0;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ return textpageFind->GetMatchedCount();
+}
+DLLEXPORT void STDCALL FPDFText_FindClose(FPDF_SCHHANDLE handle)
+{
+ if (!handle) return;
+ IPDF_TextPageFind* textpageFind=(IPDF_TextPageFind*)handle;
+ delete textpageFind;
+ handle=NULL;
+}
+
+//web link
+DLLEXPORT FPDF_PAGELINK STDCALL FPDFLink_LoadWebLinks(FPDF_TEXTPAGE text_page)
+{
+ if (!text_page) return NULL;
+ IPDF_LinkExtract* pageLink=NULL;
+ try
+ {
+ pageLink=IPDF_LinkExtract::CreateLinkExtract();
+ pageLink->ExtractLinks((IPDF_TextPage*)text_page);
+ }
+ catch (...)
+ {
+ if (pageLink)
+ delete pageLink;
+ return NULL;
+ }
+ return pageLink;
+}
+DLLEXPORT int STDCALL FPDFLink_CountWebLinks(FPDF_PAGELINK link_page)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ return pageLink->CountLinks();
+}
+DLLEXPORT int STDCALL FPDFLink_GetURL(FPDF_PAGELINK link_page,int link_index, unsigned short* buffer,int buflen)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_WideString url=pageLink->GetURL(link_index);
+
+ CFX_ByteString cbUTF16URL = url.UTF16LE_Encode();
+ int len= cbUTF16URL.GetLength()/sizeof(unsigned short);
+ if (buffer==NULL || buflen<=0)
+ return len;
+ int size=len<buflen ? len :buflen;
+ if (size>0)
+ {
+ FXSYS_memcpy(buffer,cbUTF16URL.GetBuffer(size*sizeof(unsigned short)),size*sizeof(unsigned short));
+ cbUTF16URL.ReleaseBuffer(size*sizeof(unsigned short));
+ }
+ return size;
+}
+DLLEXPORT int STDCALL FPDFLink_CountRects(FPDF_PAGELINK link_page,int link_index)
+{
+ if (!link_page) return 0;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_RectArray rectArray;
+ pageLink->GetRects(link_index,rectArray);
+ return rectArray.GetSize();
+}
+DLLEXPORT void STDCALL FPDFLink_GetRect(FPDF_PAGELINK link_page,int link_index, int rect_index, double* left,
+ double* top,double* right, double* bottom)
+{
+ if (!link_page) return;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ CFX_RectArray rectArray;
+ pageLink->GetRects(link_index,rectArray);
+ CFX_FloatRect rect;
+ rect=rectArray.GetAt(rect_index);
+ *left=rect.left;
+ *right=rect.right;
+ *top=rect.top;
+ *bottom=rect.bottom;
+}
+DLLEXPORT void STDCALL FPDFLink_CloseWebLinks(FPDF_PAGELINK link_page)
+{
+ if (!link_page) return;
+ IPDF_LinkExtract* pageLink=(IPDF_LinkExtract*)link_page;
+ delete pageLink;
+ pageLink =NULL;
+}
+
diff --git a/fpdfsdk/src/fpdfview.cpp b/fpdfsdk/src/fpdfview.cpp
new file mode 100644
index 0000000000..453b006893
--- /dev/null
+++ b/fpdfsdk/src/fpdfview.cpp
@@ -0,0 +1,879 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fpdfview.h"
+#include "../include/fsdk_rendercontext.h"
+#include "../include/fpdf_progressive.h"
+#include "../include/fpdf_ext.h"
+
+
+CPDF_CustomAccess::CPDF_CustomAccess(FPDF_FILEACCESS* pFileAccess)
+{
+ m_FileAccess = *pFileAccess;
+ m_BufferOffset = (FX_DWORD)-1;
+}
+
+FX_BOOL CPDF_CustomAccess::GetByte(FX_DWORD pos, FX_BYTE& ch)
+{
+ if (pos >= m_FileAccess.m_FileLen) return FALSE;
+ if (m_BufferOffset == (FX_DWORD)-1 || pos < m_BufferOffset || pos >= m_BufferOffset + 512) {
+ // Need to read from file access
+ m_BufferOffset = pos;
+ int size = 512;
+ if (pos + 512 > m_FileAccess.m_FileLen)
+ size = m_FileAccess.m_FileLen - pos;
+ if (!m_FileAccess.m_GetBlock(m_FileAccess.m_Param, m_BufferOffset, m_Buffer, size))
+ return FALSE;
+ }
+ ch = m_Buffer[pos - m_BufferOffset];
+ return TRUE;
+}
+
+FX_BOOL CPDF_CustomAccess::GetBlock(FX_DWORD pos, FX_LPBYTE pBuf, FX_DWORD size)
+{
+ if (pos + size > m_FileAccess.m_FileLen) return FALSE;
+ return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, pos, pBuf, size);
+}
+
+FX_BOOL CPDF_CustomAccess::ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+{
+ // m_FileAccess = *pFileAccess;
+ // m_BufferOffset = (FX_DWORD)-1;
+ if (offset + size > m_FileAccess.m_FileLen) return FALSE;
+ return m_FileAccess.m_GetBlock(m_FileAccess.m_Param, offset,(FX_LPBYTE) buffer, size);
+
+ // return FALSE;
+}
+
+//0 bit: FPDF_POLICY_MACHINETIME_ACCESS
+static FX_DWORD foxit_sandbox_policy = 0xFFFFFFFF;
+
+void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
+{
+ switch(policy)
+ {
+ case FPDF_POLICY_MACHINETIME_ACCESS:
+ {
+ if(enable)
+ foxit_sandbox_policy |= 0x01;
+ else
+ foxit_sandbox_policy &= 0xFFFFFFFE;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy)
+{
+ switch(policy)
+ {
+ case FPDF_POLICY_MACHINETIME_ACCESS:
+ {
+ if(foxit_sandbox_policy&0x01)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+
+#ifndef _T
+#define _T(x) x
+#endif
+
+#ifdef API5
+ CPDF_ModuleMgr* g_pModuleMgr = NULL;
+#else
+ CCodec_ModuleMgr* g_pCodecModule = NULL;
+#ifdef _FXSDK_OPENSOURCE_
+ FXMEM_FoxitMgr* g_pFoxitMgr = NULL;
+#endif
+#endif
+
+//extern CPDFSDK_FormFillApp* g_pFormFillApp;
+
+#if _FX_OS_ == _FX_LINUX_EMBEDDED_
+class CFontMapper : public IPDF_FontMapper
+{
+public:
+ CFontMapper();
+ virtual ~CFontMapper();
+
+ virtual FT_Face FindSubstFont(
+ CPDF_Document* pDoc, // [IN] The PDF document
+ const CFX_ByteString& face_name, // [IN] Original name
+ FX_BOOL bTrueType, // [IN] TrueType or Type1
+ FX_DWORD flags, // [IN] PDF font flags (see PDF Reference section 5.7.1)
+ int font_weight, // [IN] original font weight. 0 for not specified
+ int CharsetCP, // [IN] code page for charset (see Win32 GetACP())
+ FX_BOOL bVertical,
+ CPDF_SubstFont* pSubstFont // [OUT] Subst font data
+ );
+
+ FT_Face m_SysFace;
+};
+
+CFontMapper* g_pFontMapper = NULL;
+#endif // #if _FX_OS_ == _FX_LINUX_EMBEDDED_
+
+DLLEXPORT void STDCALL FPDF_InitLibrary(FX_LPVOID hInstance)
+{
+#ifdef API5
+ CPDF_ModuleMgr::Create();
+ g_pModuleMgr = CPDF_ModuleMgr::Get();
+ #if _FX_OS_ == _FX_WIN32_MOBILE_ || _FX_OS_ == _FX_LINUX_EMBEDDED_
+ g_pModuleMgr->InitEmbedded();
+ #ifdef _GB1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedGB1CMaps();
+ #endif
+ #ifdef _GB1_CMAPS_4_
+ g_pModuleMgr->LoadEmbeddedGB1CMaps_4();
+ #endif
+ #ifdef _CNS1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedCNS1CMaps();
+ #endif
+ #ifdef _JAPAN1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedJapan1CMaps();
+ #endif
+ #ifdef _JAPAN1_CMAPS_6_
+ g_pModuleMgr->LoadEmbeddedJapan1CMaps_6();
+ #endif
+ #ifdef _KOREA1_CMAPS_
+ g_pModuleMgr->LoadEmbeddedKorea1CMaps();
+ #endif
+ #ifdef _JPX_DECODER_
+ g_pModuleMgr->InitJpxModule();
+ g_pModuleMgr->InitJbig2Module();
+ // g_pModuleMgr->InitIccModule();
+ #endif
+ #else
+ g_pModuleMgr->InitDesktop();
+ #endif
+#else
+#ifdef _FXSDK_OPENSOURCE_
+ g_pFoxitMgr = FXMEM_CreateMemoryMgr(1024 * 1024 * 32, TRUE);
+#endif
+ g_pCodecModule = CCodec_ModuleMgr::Create();
+
+ CFX_GEModule::Create();
+ CFX_GEModule::Get()->SetCodecModule(g_pCodecModule);
+
+ CPDF_ModuleMgr::Create();
+ CPDF_ModuleMgr::Get()->SetCodecModule(g_pCodecModule);
+ CPDF_ModuleMgr::Get()->InitPageModule();
+ CPDF_ModuleMgr::Get()->InitRenderModule();
+#ifdef FOXIT_CHROME_BUILD
+ CPDF_ModuleMgr * pModuleMgr = CPDF_ModuleMgr::Get();
+ if ( pModuleMgr )
+ {
+ pModuleMgr->LoadEmbeddedGB1CMaps();
+ pModuleMgr->LoadEmbeddedJapan1CMaps();
+ pModuleMgr->LoadEmbeddedCNS1CMaps();
+ pModuleMgr->LoadEmbeddedKorea1CMaps();
+ }
+#endif
+#endif
+
+#ifdef _WIN32
+ // Get module path
+ TCHAR app_path[MAX_PATH];
+ ::GetModuleFileName((HINSTANCE)hInstance, app_path, MAX_PATH);
+ size_t len = _tcslen(app_path);
+ for (size_t i = len; i >= 0; i --)
+ if (app_path[i] == '\\') {
+ app_path[i] = 0;
+ break;
+ }
+
+#ifdef _UNICODE
+ #ifndef _FXSDK_OPENSOURCE_
+ CPDF_ModuleMgr::Get()->SetModulePath(NULL, CFX_ByteString::FromUnicode(app_path));
+ #endif
+#else
+#ifndef _FXSDK_OPENSOURCE_
+ CPDF_ModuleMgr::Get()->SetModulePath(NULL, app_path);
+#endif
+#endif
+#endif
+}
+
+
+DLLEXPORT void STDCALL FPDF_DestroyLibrary()
+{
+
+#if _FX_OS_ == _FX_LINUX_EMBEDDED_
+ if (g_pFontMapper) delete g_pFontMapper;
+#endif
+#ifdef API5
+ g_pModuleMgr->Destroy();
+#else
+ CPDF_ModuleMgr::Destroy();
+ CFX_GEModule::Destroy();
+ g_pCodecModule->Destroy();
+#endif
+#ifndef _FXSDK_OPENSOURCE_
+ FXMEM_CollectAll(FXMEM_GetDefaultMgr());
+#else
+ FXMEM_DestroyFoxitMgr(g_pFoxitMgr);
+#endif
+}
+
+#ifndef _WIN32
+int g_LastError;
+void SetLastError(int err)
+{
+ g_LastError = err;
+}
+
+int GetLastError()
+{
+ return g_LastError;
+}
+#endif
+
+void ProcessParseError(FX_DWORD err_code)
+{
+ // Translate FPDFAPI error code to FPDFVIEW error code
+ switch (err_code) {
+ case PDFPARSE_ERROR_FILE:
+ err_code = FPDF_ERR_FILE;
+ break;
+ case PDFPARSE_ERROR_FORMAT:
+ err_code = FPDF_ERR_FORMAT;
+ break;
+ case PDFPARSE_ERROR_PASSWORD:
+ err_code = FPDF_ERR_PASSWORD;
+ break;
+ case PDFPARSE_ERROR_HANDLER:
+ err_code = FPDF_ERR_SECURITY;
+ break;
+ }
+ SetLastError(err_code);
+}
+
+DLLEXPORT void STDCALL FPDF_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable)
+{
+ return FSDK_SetSandBoxPolicy(policy, enable);
+}
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadDocument(FPDF_STRING file_path, FPDF_BYTESTRING password)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ try {
+ FX_DWORD err_code = pParser->StartParse((FX_LPCSTR)file_path);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+extern void CheckUnSupportError(CPDF_Document * pDoc, FX_DWORD err_code);
+
+class CMemFile: public IFX_FileRead, public CFX_Object
+{
+public:
+ CMemFile(FX_BYTE* pBuf, FX_FILESIZE size):m_pBuf(pBuf),m_size(size) {}
+
+ virtual void Release() {delete this;}
+ virtual FX_FILESIZE GetSize() {return m_size;}
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size)
+ {
+ if(offset+size > (FX_DWORD)m_size) return FALSE;
+ FXSYS_memcpy(buffer, m_pBuf+offset, size);
+ return TRUE;
+ }
+private:
+ FX_BYTE* m_pBuf;
+ FX_FILESIZE m_size;
+};
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadMemDocument(const void* data_buf, int size, FPDF_BYTESTRING password)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ try {
+ CMemFile* pMemFile = FX_NEW CMemFile((FX_BYTE*)data_buf, size);
+ FX_DWORD err_code = pParser->StartParse(pMemFile);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ CPDF_Document * pDoc = NULL;
+ pDoc = pParser?pParser->GetDocument():NULL;
+ CheckUnSupportError(pDoc, err_code);
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+DLLEXPORT FPDF_DOCUMENT STDCALL FPDF_LoadCustomDocument(FPDF_FILEACCESS* pFileAccess, FPDF_BYTESTRING password)
+{
+ CPDF_Parser* pParser = FX_NEW CPDF_Parser;
+ pParser->SetPassword(password);
+ CPDF_CustomAccess* pFile = FX_NEW CPDF_CustomAccess(pFileAccess);
+ try {
+ FX_DWORD err_code = pParser->StartParse(pFile);
+ if (err_code) {
+ delete pParser;
+ ProcessParseError(err_code);
+ return NULL;
+ }
+ CPDF_Document * pDoc = NULL;
+ pDoc = pParser?pParser->GetDocument():NULL;
+ CheckUnSupportError(pDoc, err_code);
+ }
+ catch (...) {
+ delete pParser;
+ SetLastError(FPDF_ERR_UNKNOWN);
+ return NULL;
+ }
+ return pParser->GetDocument();
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_GetFileVersion(FPDF_DOCUMENT doc, int* fileVersion)
+{
+ if(!doc||!fileVersion) return FALSE;
+ *fileVersion = 0;
+ CPDF_Document* pDoc = (CPDF_Document*)doc;
+ CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+ if(!pParser)
+ return FALSE;
+ *fileVersion = pParser->GetFileVersion();
+ return TRUE;
+}
+
+// jabdelmalek: changed return type from FX_DWORD to build on Linux (and match header).
+DLLEXPORT unsigned long STDCALL FPDF_GetDocPermissions(FPDF_DOCUMENT document)
+{
+ if (document == NULL) return 0;
+ CPDF_Document*pDoc = (CPDF_Document*)document;
+ CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+ CPDF_Dictionary* pDict = pParser->GetEncryptDict();
+ if (pDict == NULL) return (FX_DWORD)-1;
+
+ return pDict->GetInteger("P");
+}
+
+DLLEXPORT int STDCALL FPDF_GetPageCount(FPDF_DOCUMENT document)
+{
+ if (document == NULL) return 0;
+ return ((CPDF_Document*)document)->GetPageCount();
+}
+
+DLLEXPORT FPDF_PAGE STDCALL FPDF_LoadPage(FPDF_DOCUMENT document, int page_index)
+{
+ if (document == NULL) return NULL;
+ if (page_index < 0 || page_index >= FPDF_GetPageCount(document)) return NULL;
+// CPDF_Parser* pParser = (CPDF_Parser*)document;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (pDoc == NULL) return NULL;
+ CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+ if (pDict == NULL) return NULL;
+ CPDF_Page* pPage = FX_NEW CPDF_Page;
+ pPage->Load(pDoc, pDict);
+ try {
+ pPage->ParseContent();
+ }
+ catch (...) {
+ delete pPage;
+ return NULL;
+ }
+
+// CheckUnSupportError(pDoc, 0);
+
+ return pPage;
+}
+
+DLLEXPORT double STDCALL FPDF_GetPageWidth(FPDF_PAGE page)
+{
+ if (!page)
+ return 0.0;
+ return ((CPDF_Page*)page)->GetPageWidth();
+}
+
+DLLEXPORT double STDCALL FPDF_GetPageHeight(FPDF_PAGE page)
+{
+ if (!page) return 0.0;
+ return ((CPDF_Page*)page)->GetPageHeight();
+}
+
+void DropContext(void* data)
+{
+ delete (CRenderContext*)data;
+}
+
+void FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause );
+void (*Func_RenderPage)(CRenderContext*, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause ) = FPDF_RenderPage_Retail;
+
+#if defined(_DEBUG) || defined(DEBUG)
+#define DEBUG_TRACE
+#endif
+
+#if defined(_WIN32)
+DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags)
+{
+ if (page==NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext);
+
+#ifndef _WIN32_WCE
+ CFX_DIBitmap* pBitmap = NULL;
+ FX_BOOL bBackgroundAlphaNeeded=FALSE;
+ bBackgroundAlphaNeeded = pPage->BackgroundAlphaNeeded();
+ if (bBackgroundAlphaNeeded)
+ {
+
+ pBitmap = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(size_x, size_y, FXDIB_Argb);
+ pBitmap->Clear(0x00ffffff);
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+#else
+ pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)pBitmap);
+#endif
+ }
+ else
+ pContext->m_pDevice = FX_NEW CFX_WindowsDevice(dc);
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ } catch (...) {
+ }
+ }
+ if (bBackgroundAlphaNeeded)
+ {
+ if (pBitmap)
+ {
+ CFX_WindowsDevice WinDC(dc);
+
+ if (WinDC.GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER)
+ {
+ CFX_DIBitmap* pDst = FX_NEW CFX_DIBitmap;
+ pDst->Create(pBitmap->GetWidth(), pBitmap->GetHeight(),FXDIB_Rgb32);
+ FXSYS_memcpy(pDst->GetBuffer(), pBitmap->GetBuffer(), pBitmap->GetPitch()*pBitmap->GetHeight());
+// WinDC.SetDIBits(pDst,0,0);
+ WinDC.StretchDIBits(pDst,0,0,size_x*2,size_y*2);
+ delete pDst;
+ }
+ else
+ WinDC.SetDIBits(pBitmap,0,0);
+
+ }
+ }
+#else
+ // get clip region
+ RECT rect, cliprect;
+ rect.left = start_x;
+ rect.top = start_y;
+ rect.right = start_x + size_x;
+ rect.bottom = start_y + size_y;
+ GetClipBox(dc, &cliprect);
+ IntersectRect(&rect, &rect, &cliprect);
+ int width = rect.right - rect.left;
+ int height = rect.bottom - rect.top;
+
+#ifdef DEBUG_TRACE
+ {
+ char str[128];
+ sprintf(str, "Rendering DIB %d x %d", width, height);
+ CPDF_ModuleMgr::Get()->ReportError(999, str);
+ }
+#endif
+
+ // Create a DIB section
+ LPVOID pBuffer;
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ bmih.biBitCount = 24;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ pContext->m_hBitmap = CreateDIBSection(dc, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, &pBuffer, NULL, 0);
+ if (pContext->m_hBitmap == NULL) {
+#if defined(DEBUG) || defined(_DEBUG)
+ char str[128];
+ sprintf(str, "Error CreateDIBSection: %d x %d, error code = %d", width, height, GetLastError());
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+#else
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+#endif
+ }
+ FXSYS_memset(pBuffer, 0xff, height*((width*3+3)/4*4));
+
+#ifdef DEBUG_TRACE
+ {
+ CPDF_ModuleMgr::Get()->ReportError(999, "DIBSection created");
+ }
+#endif
+
+ // Create a device with this external buffer
+ pContext->m_pBitmap = FX_NEW CFX_DIBitmap;
+ pContext->m_pBitmap->Create(width, height, FXDIB_Rgb, (FX_LPBYTE)pBuffer);
+ pContext->m_pDevice = FX_NEW CPDF_FxgeDevice;
+ ((CPDF_FxgeDevice*)pContext->m_pDevice)->Attach(pContext->m_pBitmap);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Ready for PDF rendering");
+#endif
+
+ // output to bitmap device
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x - rect.left, start_y - rect.top, size_x, size_y, rotate, flags);
+ } catch (...) {
+ }
+ }
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Finished PDF rendering");
+#endif
+
+ // Now output to real device
+ HDC hMemDC = CreateCompatibleDC(dc);
+ if (hMemDC == NULL) {
+#if defined(DEBUG) || defined(_DEBUG)
+ char str[128];
+ sprintf(str, "Error CreateCompatibleDC. Error code = %d", GetLastError());
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, str);
+#else
+ CPDF_ModuleMgr::Get()->ReportError(FPDFERR_OUT_OF_MEMORY, NULL);
+#endif
+ }
+
+ HGDIOBJ hOldBitmap = SelectObject(hMemDC, pContext->m_hBitmap);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Ready for screen rendering");
+#endif
+
+ BitBlt(dc, rect.left, rect.top, width, height, hMemDC, 0, 0, SRCCOPY);
+ SelectObject(hMemDC, hOldBitmap);
+ DeleteDC(hMemDC);
+
+#ifdef DEBUG_TRACE
+ CPDF_ModuleMgr::Get()->ReportError(999, "Finished screen rendering");
+#endif
+
+#endif
+ if (bBackgroundAlphaNeeded)
+ {
+ if (pBitmap)
+ delete pBitmap;
+ pBitmap = NULL;
+ }
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+}
+#endif
+
+DLLEXPORT void STDCALL FPDF_RenderPageBitmap(FPDF_BITMAP bitmap, FPDF_PAGE page, int start_x, int start_y,
+ int size_x, int size_y, int rotate, int flags)
+{
+ if (bitmap == NULL || page == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+
+ CRenderContext* pContext = FX_NEW CRenderContext;
+ pPage->SetPrivateData((void*)1, pContext, DropContext);
+#ifdef _SKIA_SUPPORT_
+ pContext->m_pDevice = FX_NEW CFX_SkiaDevice;
+
+ if (flags & FPDF_REVERSE_BYTE_ORDER)
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+ else
+ ((CFX_SkiaDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+#else
+ pContext->m_pDevice = FX_NEW CFX_FxgeDevice;
+
+ if (flags & FPDF_REVERSE_BYTE_ORDER)
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap,0,TRUE);
+ else
+ ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+#endif
+ if (flags & FPDF_NO_CATCH)
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ else {
+ try {
+ Func_RenderPage(pContext, page, start_x, start_y, size_x, size_y, rotate, flags,TRUE,NULL);
+ } catch (...) {
+ }
+ }
+
+ delete pContext;
+ pPage->RemovePrivateData((void*)1);
+}
+
+DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page)
+{
+ if (!page) return;
+ delete (CPDF_Page*)page;
+
+}
+
+DLLEXPORT void STDCALL FPDF_CloseDocument(FPDF_DOCUMENT document)
+{
+ if (!document)
+ return;
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_Parser* pParser = (CPDF_Parser*)pDoc->GetParser();
+ if (pParser == NULL)
+ {
+ delete pDoc;
+ return;
+ }
+ delete pParser;
+// delete pDoc;
+}
+
+DLLEXPORT unsigned long STDCALL FPDF_GetLastError()
+{
+ return GetLastError();
+}
+
+DLLEXPORT void STDCALL FPDF_DeviceToPage(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int device_x, int device_y, double* page_x, double* page_y)
+{
+ if (page == NULL || page_x == NULL || page_y == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CPDF_Matrix page2device;
+ pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+ CPDF_Matrix device2page;
+ device2page.SetReverse(page2device);
+
+ FX_FLOAT page_x_f, page_y_f;
+ device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);
+
+ *page_x = (page_x_f);
+ *page_y = (page_y_f);
+}
+
+DLLEXPORT void STDCALL FPDF_PageToDevice(FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, double page_x, double page_y, int* device_x, int* device_y)
+{
+ if (page == NULL || device_x == NULL || device_y == NULL) return;
+ CPDF_Page* pPage = (CPDF_Page*)page;
+
+ CPDF_Matrix page2device;
+ pPage->GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);
+
+ FX_FLOAT device_x_f, device_y_f;
+ page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);
+
+ *device_x = FXSYS_round(device_x_f);
+ *device_y = FXSYS_round(device_y_f);
+}
+
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_Create(int width, int height, int alpha)
+{
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(width, height, alpha ? FXDIB_Argb : FXDIB_Rgb32);
+ return pBitmap;
+}
+
+DLLEXPORT FPDF_BITMAP STDCALL FPDFBitmap_CreateEx(int width, int height, int format, void* first_scan, int stride)
+{
+ FXDIB_Format fx_format;
+ switch (format) {
+ case FPDFBitmap_Gray:
+ fx_format = FXDIB_8bppRgb;
+ break;
+ case FPDFBitmap_BGR:
+ fx_format = FXDIB_Rgb;
+ break;
+ case FPDFBitmap_BGRx:
+ fx_format = FXDIB_Rgb32;
+ break;
+ case FPDFBitmap_BGRA:
+ fx_format = FXDIB_Argb;
+ break;
+ default:
+ return NULL;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ pBitmap->Create(width, height, fx_format, (FX_LPBYTE)first_scan, stride);
+ return pBitmap;
+}
+
+DLLEXPORT void STDCALL FPDFBitmap_FillRect(FPDF_BITMAP bitmap, int left, int top, int width, int height,
+ int red, int green, int blue, int alpha)
+{
+ if (bitmap == NULL) return;
+#ifdef _SKIA_SUPPORT_
+ CFX_SkiaDevice device;
+#else
+ CFX_FxgeDevice device;
+#endif
+ device.Attach((CFX_DIBitmap*)bitmap);
+ if (!((CFX_DIBitmap*)bitmap)->HasAlpha()) alpha = 255;
+ FX_RECT rect(left, top, left+width, top+height);
+ device.FillRect(&rect, FXARGB_MAKE(alpha, red, green, blue));
+}
+
+DLLEXPORT void* STDCALL FPDFBitmap_GetBuffer(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return NULL;
+ return ((CFX_DIBitmap*)bitmap)->GetBuffer();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetWidth(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetWidth();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetHeight(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetHeight();
+}
+
+DLLEXPORT int STDCALL FPDFBitmap_GetStride(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return 0;
+ return ((CFX_DIBitmap*)bitmap)->GetPitch();
+}
+
+DLLEXPORT void STDCALL FPDFBitmap_Destroy(FPDF_BITMAP bitmap)
+{
+ if (bitmap == NULL) return;
+ delete (CFX_DIBitmap*)bitmap;
+}
+
+void FPDF_RenderPage_Retail(CRenderContext* pContext, FPDF_PAGE page, int start_x, int start_y, int size_x, int size_y,
+ int rotate, int flags,FX_BOOL bNeedToRestore, IFSDK_PAUSE_Adapter * pause )
+{
+//#ifdef _LICENSED_BUILD_
+ CPDF_Page* pPage = (CPDF_Page*)page;
+ if (pPage == NULL) return;
+
+ if (!pContext->m_pOptions)
+ pContext->m_pOptions = new CPDF_RenderOptions;
+// CPDF_RenderOptions options;
+ if (flags & FPDF_LCD_TEXT)
+ pContext->m_pOptions->m_Flags |= RENDER_CLEARTYPE;
+ else
+ pContext->m_pOptions->m_Flags &= ~RENDER_CLEARTYPE;
+ if (flags & FPDF_NO_NATIVETEXT)
+ pContext->m_pOptions->m_Flags |= RENDER_NO_NATIVETEXT;
+ if (flags & FPDF_RENDER_LIMITEDIMAGECACHE)
+ pContext->m_pOptions->m_Flags |= RENDER_LIMITEDIMAGECACHE;
+ if (flags & FPDF_RENDER_FORCEHALFTONE)
+ pContext->m_pOptions->m_Flags |= RENDER_FORCE_HALFTONE;
+ //Grayscale output
+ if (flags & FPDF_GRAYSCALE)
+ {
+ pContext->m_pOptions->m_ColorMode = RENDER_COLOR_GRAY;
+ pContext->m_pOptions->m_ForeColor = 0;
+ pContext->m_pOptions->m_BackColor = 0xffffff;
+ }
+ const CPDF_OCContext::UsageType usage = (flags & FPDF_PRINTING) ? CPDF_OCContext::Print : CPDF_OCContext::View;
+
+ pContext->m_pOptions->m_AddFlags = flags >> 8;
+
+ pContext->m_pOptions->m_pOCContext = new CPDF_OCContext(pPage->m_pDocument, usage);
+
+
+ CFX_AffineMatrix matrix;
+ pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate);
+
+ FX_RECT clip;
+ clip.left = start_x;
+ clip.right = start_x + size_x;
+ clip.top = start_y;
+ clip.bottom = start_y + size_y;
+ pContext->m_pDevice->SaveState();
+ pContext->m_pDevice->SetClip_Rect(&clip);
+
+ pContext->m_pContext = FX_NEW CPDF_RenderContext;
+ pContext->m_pContext->Create(pPage);
+ pContext->m_pContext->AppendObjectList(pPage, &matrix);
+
+ if (flags & FPDF_ANNOT) {
+ pContext->m_pAnnots = FX_NEW CPDF_AnnotList(pPage);
+ FX_BOOL bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
+ pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext, bPrinting, &matrix, TRUE, NULL);
+ }
+
+ pContext->m_pRenderer = FX_NEW CPDF_ProgressiveRenderer;
+ pContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions, pause);
+ if (bNeedToRestore)
+ {
+ pContext->m_pDevice->RestoreState();
+ }
+
+//#endif
+}
+
+DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document, int page_index, double* width, double* height)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if(pDoc == NULL)
+ return FALSE;
+
+ CPDF_Dictionary* pDict = pDoc->GetPage(page_index);
+ if (pDict == NULL) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDoc, pDict);
+ *width = page.GetPageWidth();
+ *height = page.GetPageHeight();
+
+ return TRUE;
+}
+
+DLLEXPORT FPDF_BOOL STDCALL FPDF_VIEWERREF_GetPrintScaling(FPDF_DOCUMENT document)
+{
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ if (!pDoc) return TRUE;
+ CPDF_ViewerPreferences viewRef(pDoc);
+ return viewRef.PrintScaling();
+}
+
+DLLEXPORT FPDF_DEST STDCALL FPDF_GetNamedDestByName(FPDF_DOCUMENT document,FPDF_BYTESTRING name)
+{
+ if (document == NULL)
+ return NULL;
+ if (name == NULL || name[0] == 0)
+ return NULL;
+
+ CPDF_Document* pDoc = (CPDF_Document*)document;
+ CPDF_NameTree name_tree(pDoc, FX_BSTRC("Dests"));
+ return name_tree.LookupNamedDest(pDoc, name);
+} \ No newline at end of file
diff --git a/fpdfsdk/src/fsdk_actionhandler.cpp b/fpdfsdk/src/fsdk_actionhandler.cpp
new file mode 100644
index 0000000000..2a3898cd9b
--- /dev/null
+++ b/fpdfsdk/src/fsdk_actionhandler.cpp
@@ -0,0 +1,850 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_actionhandler.h"
+#include "../include/javascript/IJavaScript.h"
+
+/* -------------------------- CBA_ActionHandler -------------------------- */
+
+CPDFSDK_ActionHandler::CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi) :
+ m_pEvi(pEvi),
+ m_pFormActionHandler(NULL),
+ m_pMediaActionHandler(NULL)
+{
+ m_pFormActionHandler = new CPDFSDK_FormActionHandler;
+}
+
+CPDFSDK_ActionHandler::~CPDFSDK_ActionHandler()
+{
+ if(m_pFormActionHandler)
+ {
+ delete m_pFormActionHandler;
+ m_pFormActionHandler = NULL;
+ }
+}
+
+void CPDFSDK_ActionHandler::SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler)
+{
+ ASSERT(pHandler != NULL);
+ ASSERT(m_pFormActionHandler == NULL);
+ m_pFormActionHandler = pHandler;
+}
+
+void CPDFSDK_ActionHandler::SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler)
+{
+ ASSERT(pHandler != NULL);
+ ASSERT(m_pMediaActionHandler == NULL);
+ m_pMediaActionHandler = pHandler;
+}
+
+void CPDFSDK_ActionHandler::Destroy()
+{
+ delete this;
+}
+
+//document open
+FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument
+ /*CReader_Document* pDocument, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentOpenAction(action, pDocument, /*pDocView, */list);
+}
+
+//document open
+FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ if (JsAction.GetType() == CPDF_Action::JavaScript)
+ {
+ CFX_WideString swJS = JsAction.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ RunDocumentOpenJavaScript(pDocument, csJSName, swJS);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
+ PDFSDK_FieldAction& data)
+{
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript)
+ {
+ CFX_WideString swJS = JsAction.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteDocumentPageAction(action, eType, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return this->ExecuteBookMark(action, pDocument,/* pDocView,*/ pBookMark, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/ CPDFSDK_Annot* pScreen)
+{
+ CFX_PtrList list;
+ return this->ExecuteScreenAction(action, type, pDocument,/* pDocView,*/ pScreen, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
+ CPDFSDK_Document* pDocument/*, CReader_DocView *pDocView*/)
+{
+ CFX_PtrList list;
+ return ExecuteLinkAction(action, pDocument,/* pDocView,*/ list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView *pDocView,*/
+ CPDF_FormField* pFormField, PDFSDK_FieldAction& data)
+{
+ CFX_PtrList list;
+ return ExecuteFieldAction(action, type, pDocument,/* pDocView,*/ pFormField, data, list);
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView *pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ RunDocumentOpenJavaScript(pDocument, L"", swJS);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteDocumentOpenAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView* pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime(); //????
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnLink_MouseUp(pDocument);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteLinkAction(subaction, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ RunDocumentPageJavaScript(pDocument, type, swJS);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+ if (!IsValidDocView(pDocument/*, pDocView*/))
+ return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteDocumentPageAction(subaction, type, pDocument,/* pDocView,*/ list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict)
+{
+ ASSERT(m_pEvi != NULL);
+ ASSERT(pDocument != NULL);
+ ASSERT(pFieldDict != NULL);
+
+ if (1/*m_pApp->IsValidDocument(pDocument)*/)
+ {
+ CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDF_FormField* pFormField,
+ PDFSDK_FieldAction& data, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
+ if (!IsValidField(pDocument, pFormField->GetFieldDict()))
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+ }
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteFieldAction(subaction, type, pDocument,/* pDocView,*/ pFormField, data, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
+ CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ CPDFSDK_Annot* pScreen, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ // switch (type)
+ // {
+ // case CPDF_AAction::CursorEnter:
+ // pContext->OnScreen_MouseEnter(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::CursorExit:
+ // pContext->OnScreen_MouseExit(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::ButtonDown:
+ // pContext->OnScreen_MouseDown(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::ButtonUp:
+ // pContext->OnScreen_MouseUp(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::GetFocus:
+ // pContext->OnScreen_Focus(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::LoseFocus:
+ // pContext->OnScreen_Blur(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageOpen:
+ // pContext->OnScreen_Open(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageClose:
+ // pContext->OnScreen_Close(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageVisible:
+ // pContext->OnScreen_InView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // case CPDF_AAction::PageInvisible:
+ // pContext->OnScreen_OutView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
+ // break;
+ // default:
+ // ASSERT(FALSE);
+ // break;
+ // }
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteScreenAction(subaction, type, pDocument,/* pDocView,*/ pScreen, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument,
+ /*CReader_DocView* pDocView,*/ CPDF_Bookmark* pBookmark, CFX_PtrList& list)
+{
+ ASSERT(pDocument != NULL);
+
+ if (list.Find((CPDF_Dictionary*)action))
+ return FALSE;
+ list.AddTail((CPDF_Dictionary*)action);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv);
+ if (action.GetType() == CPDF_Action::JavaScript)
+ {
+ if(pEnv->IsJSInitiated())
+ {
+ CFX_WideString swJS = action.GetJavaScript();
+ if (!swJS.IsEmpty())
+ {
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnBookmark_MouseUp(pBookmark);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+ }
+ }
+ }
+ else
+ {
+ DoAction_NoJs(action, pDocument/*, pDocView*/);
+ }
+
+// if (!IsValidDocView(pDocument, pDocView))
+// return FALSE;
+
+ for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
+ {
+ CPDF_Action subaction = action.GetSubAction(i);
+ if (!ExecuteBookMark(subaction, pDocument,/* pDocView,*/ pBookmark, list)) return FALSE;
+ }
+
+ return TRUE;
+}
+
+void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)
+{
+ ASSERT(pDocument != NULL);
+
+ switch (action.GetType())
+ {
+ case CPDF_Action::GoTo:
+ DoAction_GoTo(pDocument,/* pDocView,*/ action);
+ break;
+ case CPDF_Action::GoToR:
+ DoAction_GoToR(pDocument, action);
+ break;
+ case CPDF_Action::GoToE:
+ break;
+ case CPDF_Action::Launch:
+ DoAction_Launch(pDocument, action);
+ break;
+ case CPDF_Action::Thread:
+ break;
+ case CPDF_Action::URI:
+ DoAction_URI(pDocument, action);
+ break;
+ case CPDF_Action::Sound:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Sound(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::Movie:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Movie(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::Hide:
+ if (m_pFormActionHandler)
+ {
+ m_pFormActionHandler->DoAction_Hide(action, pDocument);
+ }
+ break;
+ case CPDF_Action::Named:
+ DoAction_Named(pDocument, action);
+ break;
+ case CPDF_Action::SubmitForm:
+ if (m_pFormActionHandler)
+ {
+ m_pFormActionHandler->DoAction_SubmitForm(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::ResetForm:
+ if (m_pFormActionHandler)
+ {
+ m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
+ }
+ break;
+ case CPDF_Action::ImportData:
+ if (m_pFormActionHandler)
+ {
+ m_pFormActionHandler->DoAction_ImportData(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::JavaScript:
+ ASSERT(FALSE);
+ break;
+ case CPDF_Action::SetOCGState:
+ DoAction_SetOCGState(pDocument, /*pDocView,*/ action);
+ break;
+ case CPDF_Action::Rendition:
+ if (m_pMediaActionHandler)
+ {
+ m_pMediaActionHandler->DoAction_Rendition(action, pDocument/*, pDocView*/);
+ }
+ break;
+ case CPDF_Action::Trans:
+ break;
+ case CPDF_Action::GoTo3DView:
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument/*, CReader_DocView* pDocView*/)
+{
+ ASSERT(pDocument != NULL);
+ //ASSERT(pDocView != NULL);
+
+ //return pDocument->IsValidDocView(pDocView);
+ return TRUE;
+}
+
+void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument, /*CReader_DocView* pDocView,*/
+ const CPDF_Action& action)
+{
+ ASSERT(pDocument != NULL);
+// ASSERT(pDocView != NULL);
+ ASSERT(action != NULL);
+
+ CPDF_Document* pPDFDocument = pDocument->GetDocument();
+ ASSERT(pPDFDocument != NULL);
+ CPDFDoc_Environment* pApp = pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ CPDF_Dest MyDest = action.GetDest(pPDFDocument);
+ int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
+ int nFitType = MyDest.GetZoomMode();
+ const CPDF_Array * pMyArray = (CPDF_Array*)MyDest.m_pObj;
+ float* pPosAry = NULL;
+ int sizeOfAry = 0;
+ if (pMyArray != NULL)
+ {
+ pPosAry = new float[pMyArray->GetCount()];
+ int j = 0;
+ for (int i = 2; i < (int)pMyArray->GetCount(); i++)
+ {
+ pPosAry[j++] = pMyArray->GetFloat(i);
+ }
+ sizeOfAry = j;
+ }
+ pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
+ if(pPosAry)
+ delete[] pPosAry;
+}
+
+void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action)
+{
+
+}
+
+void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action)
+{
+
+}
+
+void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(action != NULL);
+
+ CPDFDoc_Environment* pApp = pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ CFX_ByteString sURI = action.GetURI(pDocument->GetDocument());
+ pApp->FFI_DoURIAction(FX_LPCSTR(sURI));
+}
+
+void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(action != NULL);
+
+ CFX_ByteString csName = action.GetNamedAction();
+ pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
+}
+
+
+void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,/* CReader_DocView* pDocView,*/ const CPDF_Action& action)
+{
+}
+
+void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type,
+ PDFSDK_FieldAction& data, const CFX_WideString& script)
+{
+ ASSERT(type != CPDF_AAction::Calculate);
+ ASSERT(type != CPDF_AAction::Format);
+
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ switch (type)
+ {
+ case CPDF_AAction::CursorEnter:
+ pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
+ break;
+ case CPDF_AAction::CursorExit:
+ pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
+ break;
+ case CPDF_AAction::ButtonDown:
+ pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
+ break;
+ case CPDF_AAction::ButtonUp:
+ pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
+ break;
+ case CPDF_AAction::GetFocus:
+ pContext->OnField_Focus(data.bModifier, data.bShift, pFormField, data.sValue);
+ break;
+ case CPDF_AAction::LoseFocus:
+ pContext->OnField_Blur(data.bModifier, data.bShift, pFormField, data.sValue);
+ break;
+ case CPDF_AAction::KeyStroke:
+ pContext->OnField_Keystroke(data.nCommitKey, data.sChange, data.sChangeEx, data.bKeyDown,
+ data.bModifier, data.nSelEnd, data.nSelStart, data.bShift, pFormField, data.sValue,
+ data.bWillCommit, data.bFieldFull, data.bRC);
+ break;
+ case CPDF_AAction::Validate:
+ pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown, data.bModifier,
+ data.bShift, pFormField, data.sValue, data.bRC);
+ break;
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(script, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script)
+{
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnDoc_Open(pDocument, sScriptName);
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(script, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script)
+{
+ ASSERT(pDocument != NULL);
+
+ IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(pDocument);
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ switch (type)
+ {
+ case CPDF_AAction::OpenPage:
+ pContext->OnPage_Open(pDocument);
+ break;
+ case CPDF_AAction::ClosePage:
+ pContext->OnPage_Close(pDocument);
+ break;
+ case CPDF_AAction::CloseDocument:
+ pContext->OnDoc_WillClose(pDocument);
+ break;
+ case CPDF_AAction::SaveDocument:
+ pContext->OnDoc_WillSave(pDocument);
+ break;
+ case CPDF_AAction::DocumentSaved:
+ pContext->OnDoc_DidSave(pDocument);
+ break;
+ case CPDF_AAction::PrintDocument:
+ pContext->OnDoc_WillPrint(pDocument);
+ break;
+ case CPDF_AAction::DocumentPrinted:
+ pContext->OnDoc_DidPrint(pDocument);
+ break;
+ case CPDF_AAction::PageVisible:
+ pContext->OnPage_InView(pDocument);
+ break;
+ case CPDF_AAction::PageInvisible:
+ pContext->OnPage_OutView(pDocument);
+ break;
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+
+ CFX_WideString csInfo;
+ FX_BOOL bRet = pContext->RunScript(script, csInfo);
+ if (!bRet)
+ {
+ //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
+ }
+
+ pRuntime->ReleaseContext(pContext);
+}
+
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_Hide(action))
+ {
+ pDocument->SetChangeMark();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ return pInterForm->DoAction_SubmitForm(action);
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_ResetForm(action))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (pInterForm->DoAction_ImportData(action))
+ {
+ pDocument->SetChangeMark();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument)
+{
+ return FALSE;
+}
+
diff --git a/fpdfsdk/src/fsdk_annothandler.cpp b/fpdfsdk/src/fsdk_annothandler.cpp
new file mode 100644
index 0000000000..b2a24a8dde
--- /dev/null
+++ b/fpdfsdk/src/fsdk_annothandler.cpp
@@ -0,0 +1,945 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/fsdk_annothandler.h"
+
+
+CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp)
+{
+ m_pApp = pApp;
+
+ CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp);
+ pHandler->SetFormFiller(m_pApp->GetIFormFiller());
+ RegisterAnnotHandler(pHandler);
+}
+
+CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr()
+{
+ for(int i=0; i<m_Handlers.GetSize(); i++)
+ {
+ IPDFSDK_AnnotHandler* pHandler = m_Handlers.GetAt(i);
+ delete pHandler;
+ }
+ m_Handlers.RemoveAll();
+ m_mapType2Handler.RemoveAll();
+}
+
+void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
+{
+ ASSERT(pAnnotHandler != NULL);
+
+ ASSERT(GetAnnotHandler(pAnnotHandler->GetType()) == NULL);
+
+ m_Handlers.Add(pAnnotHandler);
+ m_mapType2Handler.SetAt(pAnnotHandler->GetType(), (void*)pAnnotHandler);
+}
+
+void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
+{
+ ASSERT(pAnnotHandler != NULL);
+
+ m_mapType2Handler.RemoveKey(pAnnotHandler->GetType());
+
+ for (int i=0, sz=m_Handlers.GetSize(); i<sz; i++)
+ {
+ if (m_Handlers.GetAt(i) == pAnnotHandler)
+ {
+ m_Handlers.RemoveAt(i);
+ break;
+ }
+ }
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView)
+{
+ ASSERT(pAnnot != NULL);
+ ASSERT(pPageView != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot->GetSubType()))
+ {
+ return pAnnotHandler->NewAnnot(pAnnot, pPageView);
+ }
+
+ return new CPDFSDK_Annot(pAnnot, pPageView);
+}
+
+void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ pAnnot->GetPDFPage();
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnRelease(pAnnot);
+ pAnnotHandler->ReleaseAnnot(pAnnot);
+ }
+ else
+ {
+ delete (CPDFSDK_Annot*)pAnnot;
+ }
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+ ASSERT(pPDFAnnot->m_pAnnotDict != NULL);
+
+ CPDFSDK_DateTime curTime;
+ pPDFAnnot->m_pAnnotDict->SetAtString("M", curTime.ToPDFDateTimeString());
+ pPDFAnnot->m_pAnnotDict->SetAtNumber("F", (int)0);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnCreate(pAnnot);
+ }
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnLoad(pAnnot);
+ }
+}
+
+IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(CPDFSDK_Annot* pAnnot) const
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ return GetAnnotHandler(pPDFAnnot->GetSubType());
+}
+
+IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(const CFX_ByteString& sType) const
+{
+ void* pRet = NULL;
+ m_mapType2Handler.Lookup(sType, pRet);
+ return (IPDFSDK_AnnotHandler*)pRet;
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+ }
+ else
+ {
+ pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+}
+
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+ {
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+ }
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnMouseWheel(pPageView, pAnnot,nFlags,zDelta, point);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+ return FALSE;
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);
+ }
+ return ;
+}
+
+void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);
+ }
+ return;
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)
+{
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnChar(pAnnot,nChar, nFlags);
+ }
+ return FALSE;
+
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
+{
+
+ if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag))
+ {
+ CPDFSDK_PageView* pPage = pAnnot->GetPageView();
+ CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
+ if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab))
+ {
+ CPDFSDK_Annot* pNext = GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));
+
+ if(pNext && pNext != pFocusAnnot)
+ {
+ CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
+ pDocument->SetFocusAnnot(pNext);
+ return TRUE;
+ }
+ }
+ }
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->OnKeyDown(pAnnot,nKeyCode, nFlag);
+ }
+ return FALSE;
+}
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
+{
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ if (pAnnotHandler->OnSetFocus(pAnnot, nFlag))
+ {
+ CPDFSDK_PageView* pPage = pAnnot->GetPageView();
+ ASSERT(pPage != NULL);
+
+ pPage->GetSDKDocument();
+ // pDocument->SetTopmostAnnot(pAnnot);
+
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ if (pAnnotHandler->OnKillFocus(pAnnot, nFlag))
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+
+ return FALSE;
+}
+
+CPDF_Rect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot);
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ return pAnnotHandler->GetViewBBox(pPageView, pAnnot);
+ }
+ return pAnnot->GetRect();
+}
+
+FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
+{
+ ASSERT(pAnnot);
+ if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
+ {
+ if(pAnnotHandler->CanAnswer(pAnnot))
+ return pAnnotHandler->HitTest(pPageView, pAnnot, point);
+ }
+ return FALSE;
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext)
+{
+ CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", "");
+
+ CPDFSDK_Annot* pNext = bNext ?
+ ai.GetNextAnnot(pSDKAnnot) :
+ ai.GetPrevAnnot(pSDKAnnot);
+
+ return pNext;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot);
+ ASSERT(pAnnot->GetType() == "Widget");
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ if (!pWidget->IsVisible()) return FALSE;
+
+ int nFieldFlags = pWidget->GetFieldFlags();
+ if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) return FALSE;
+ if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return TRUE;
+ else
+ {
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ CPDF_Document* pDocument = pPage->m_pDocument;
+ ASSERT(pDocument != NULL);
+
+ FX_DWORD dwPermissions = pDocument->GetUserPermissions();
+ return (dwPermissions&FPDFPERM_FILL_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM) ||
+ (dwPermissions&FPDFPERM_ANNOT_FORM);
+ }
+ }
+
+ return FALSE;
+}
+
+CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage)
+{
+ ASSERT(pPage != NULL);
+ pPage->GetPDFDocument();
+
+ CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
+ ASSERT(pSDKDoc);
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = NULL;
+ if (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->m_pAnnotDict))
+ {
+ pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);
+ pInterForm->AddMap(pCtrl, pWidget);
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ if(pPDFInterForm && pPDFInterForm->NeedConstructAP())
+ pWidget->ResetAppearance(NULL,FALSE);
+ }
+
+ return pWidget;
+}
+
+void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ if (m_pFormFiller)
+ m_pFormFiller->OnDelete(pAnnot);
+
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+ CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_FormControl* pCtrol = pWidget->GetFormControl();
+ pInterForm->RemoveMap(pCtrol);
+
+
+ delete pWidget;
+}
+
+
+void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, FX_DWORD dwFlags)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+ }
+ else
+ {
+ if (m_pFormFiller)
+ {
+ m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
+ }
+ }
+}
+
+void CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
+ }
+
+
+}
+void CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
+ }
+
+}
+FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+
+}
+
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnChar(pAnnot,nChar, nFlags);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnKeyDown(pAnnot,nKeyCode, nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
+{
+
+ return FALSE;
+}
+void CPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ m_pFormFiller->OnCreate(pAnnot);
+ }
+}
+
+void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
+
+ if (!pWidget->IsAppearanceValid())
+ pWidget->ResetAppearance(NULL, FALSE);
+
+ int nFieldType = pWidget->GetFieldType();
+
+ if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX)
+ {
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
+
+ if (bFormated && nFieldType == FIELDTYPE_COMBOBOX)
+ {
+ pWidget->ResetAppearance(sValue, FALSE);
+ }
+ }
+
+
+ if (m_pFormFiller)
+ m_pFormFiller->OnLoad(pAnnot);
+
+ }
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnSetFocus(pAnnot,nFlag);
+ }
+
+ return TRUE;
+}
+FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->OnKillFocus(pAnnot,nFlag);
+ }
+
+ return TRUE;
+}
+
+CPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+ CFX_ByteString sSubType = pAnnot->GetSubType();
+
+ if (sSubType == BFFT_SIGNATURE)
+ {
+ }
+ else
+ {
+ if (m_pFormFiller)
+ return m_pFormFiller->GetViewBBox(pPageView, pAnnot);
+
+ }
+
+ return CPDF_Rect(0,0,0,0);
+}
+
+FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
+{
+ ASSERT(pPageView);
+ ASSERT(pAnnot);
+
+ CPDF_Rect rect = GetViewBBox(pPageView, pAnnot);
+ return rect.Contains(point.x, point.y);
+}
+
+//CReader_AnnotIteratorEx
+
+CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,
+ FX_BOOL bIgnoreTopmost/*=FALSE*/,
+ FX_BOOL bCircle/*=FALSE*/,
+ CFX_PtrArray *pList/*=NULL*/)
+{
+ ASSERT(pPageView);
+ m_bReverse=bReverse;
+ m_bIgnoreTopmost= bIgnoreTopmost;
+ m_bCircle=bCircle;
+ m_pIteratorAnnotList.RemoveAll();
+ InitIteratorAnnotList(pPageView,pList);
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (const CPDFSDK_Annot* pCurrent)
+{
+
+ int index=-1;
+ int nCount=this->m_pIteratorAnnotList.GetSize();
+ if(pCurrent){
+ for(int i=0;i<nCount;i++){
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot *)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot ==pCurrent){
+ index=i;
+ break;
+ }
+ }
+ }
+ return NextAnnot(index);
+}
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (const CPDFSDK_Annot*pCurrent)
+{
+
+ int index=-1;
+ int nCount=this->m_pIteratorAnnotList.GetSize();
+ if(pCurrent){
+ for(int i=0;i<nCount;i++){
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot ==pCurrent){
+ index=i;
+ break;
+ }
+ }
+ }
+ return PrevAnnot(index);
+}
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (int& index)
+{
+
+ int nCount=m_pIteratorAnnotList.GetSize();
+ if(nCount<=0) index=-1;
+ else{
+ if(index<0){
+ index=0;
+ }
+ else{
+ if(m_bCircle){
+ index=( index <nCount-1) ? (index+1) :0;
+ }
+ else{
+ index=( index <nCount-1) ? (index+1) :-1;
+ }
+
+ }
+ }
+ return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
+}
+
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (int& index)
+{
+
+ int nCount=m_pIteratorAnnotList.GetSize();
+ if(nCount<=0) index=-1;
+ else{
+ if(index<0){
+ index=nCount-1;
+ }
+ else{
+ if(m_bCircle){
+ index = ( index >0) ? (index-1) :nCount-1;
+ }
+ else{
+ index = ( index >0) ? (index-1) :-1;
+ }
+ }
+ }
+ return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
+}
+
+
+CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent)
+{
+
+ return (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);
+
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent)
+{
+
+ return (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);
+}
+
+CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )
+{
+
+ return (m_bReverse) ? PrevAnnot(index):NextAnnot(index);
+
+}
+
+CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(int& index )
+{
+
+ return (m_bReverse) ? NextAnnot(index):PrevAnnot(index);
+}
+
+
+void CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare)
+{
+ for (int i = 1; i < arrayList.GetSize(); i++)
+ {
+ if (pCompare((CPDFSDK_Annot*)(arrayList[i]) , (CPDFSDK_Annot*)(arrayList[i-1])) < 0)
+ {
+ int j = i-1;
+ CPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i];
+
+ do
+ {
+ arrayList[j + 1] = arrayList[j];
+ } while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0);
+
+ arrayList[j+1] = pTemp;
+ }
+ }
+}
+
+int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ if(p1->GetLayoutOrder() < p2->GetLayoutOrder())
+ return -1;
+ else if (p1->GetLayoutOrder() == p2->GetLayoutOrder())
+ return 0;
+ else
+ return 1;
+}
+
+FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)
+{
+ ASSERT(pPageView);
+
+
+
+ if(pAnnotList==NULL){
+ pAnnotList=pPageView->GetAnnotList();
+ }
+
+ this->m_pIteratorAnnotList.RemoveAll();
+ if(!pAnnotList) return FALSE;
+
+ CPDFSDK_Annot * pTopMostAnnot= (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot();
+
+
+ int nCount =pAnnotList->GetSize();
+
+ for(int i = nCount- 1 ;i >= 0;i--)
+ {
+ CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)pAnnotList->GetAt(i);
+ m_pIteratorAnnotList.Add(pReaderAnnot);
+ }
+
+ InsertSort(m_pIteratorAnnotList,&LyOrderCompare);
+
+ if(pTopMostAnnot)
+ {
+ for(int i=0 ;i<nCount;i++)
+ {
+ CPDFSDK_Annot * pReaderAnnot = (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
+ if(pReaderAnnot == pTopMostAnnot)
+ {
+ m_pIteratorAnnotList.RemoveAt(i);
+ m_pIteratorAnnotList.InsertAt(0, pReaderAnnot);
+ break;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp
new file mode 100644
index 0000000000..ac36e3c3a6
--- /dev/null
+++ b/fpdfsdk/src/fsdk_baseannot.cpp
@@ -0,0 +1,1187 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_baseannot.h"
+
+
+//---------------------------------------------------------------------------
+// CPDFSDK_DateTime
+//---------------------------------------------------------------------------
+int _gAfxGetTimeZoneInSeconds(FX_CHAR tzhour, FX_BYTE tzminute)
+{
+ return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60);
+}
+
+FX_BOOL _gAfxIsLeapYear(FX_SHORT year)
+{
+ return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)));
+}
+
+FX_WORD _gAfxGetYearDays(FX_SHORT year)
+{
+ return (_gAfxIsLeapYear(year) == TRUE ? 366 : 365);
+}
+
+FX_BYTE _gAfxGetMonthDays(FX_SHORT year, FX_BYTE month)
+{
+ FX_BYTE mDays;
+ switch (month)
+ {
+ case 1:
+ case 3:
+ case 5:
+ case 7:
+ case 8:
+ case 10:
+ case 12:
+ mDays = 31;
+ break;
+
+ case 4:
+ case 6:
+ case 9:
+ case 11:
+ mDays = 30;
+ break;
+
+ case 2:
+ if (_gAfxIsLeapYear(year) == TRUE)
+ mDays = 29;
+ else
+ mDays = 28;
+ break;
+
+ default:
+ mDays = 0;
+ break;
+ }
+
+ return mDays;
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime()
+{
+ ResetDateTime();
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr)
+{
+ ResetDateTime();
+
+ FromPDFDateTimeString(dtStr);
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime)
+{
+ operator = (datetime);
+}
+
+CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st)
+{
+ operator = (st) ;
+}
+
+
+void CPDFSDK_DateTime::ResetDateTime()
+{
+ tzset();
+
+ time_t curTime;
+ time(&curTime);
+ struct tm* newtime;
+ //newtime = gmtime(&curTime);
+ newtime = localtime(&curTime);
+
+ dt.year = newtime->tm_year + 1900;
+ dt.month = newtime->tm_mon + 1;
+ dt.day = newtime->tm_mday;
+ dt.hour = newtime->tm_hour;
+ dt.minute = newtime->tm_min;
+ dt.second = newtime->tm_sec;
+// dt.tzHour = _timezone / 3600 * -1;
+// dt.tzMinute = (abs(_timezone) % 3600) / 60;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const CPDFSDK_DateTime& datetime)
+{
+ FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME));
+ return *this;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::operator = (const FX_SYSTEMTIME& st)
+{
+ tzset();
+
+ dt.year = (FX_SHORT)st.wYear;
+ dt.month = (FX_BYTE)st.wMonth;
+ dt.day = (FX_BYTE)st.wDay;
+ dt.hour = (FX_BYTE)st.wHour;
+ dt.minute = (FX_BYTE)st.wMinute;
+ dt.second = (FX_BYTE)st.wSecond;
+// dt.tzHour = _timezone / 3600 * -1;
+// dt.tzMinute = (abs(_timezone) % 3600) / 60;
+ return *this;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator == (CPDFSDK_DateTime& datetime)
+{
+ return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0);
+}
+
+FX_BOOL CPDFSDK_DateTime::operator != (CPDFSDK_DateTime& datetime)
+{
+ return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) != 0);
+}
+
+FX_BOOL CPDFSDK_DateTime::operator > (CPDFSDK_DateTime& datetime)
+{
+ CPDFSDK_DateTime dt1 = ToGMT();
+ CPDFSDK_DateTime dt2 = datetime.ToGMT();
+ int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+ int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+ int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+ int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+
+ if (d1 > d3) return TRUE;
+ if (d2 > d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator >= (CPDFSDK_DateTime& datetime)
+{
+ CPDFSDK_DateTime dt1 = ToGMT();
+ CPDFSDK_DateTime dt2 = datetime.ToGMT();
+ int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+ int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+ int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+ int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+
+ if (d1 >= d3) return TRUE;
+ if (d2 >= d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator < (CPDFSDK_DateTime& datetime)
+{
+ CPDFSDK_DateTime dt1 = ToGMT();
+ CPDFSDK_DateTime dt2 = datetime.ToGMT();
+ int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+ int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+ int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+ int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+
+ if (d1 < d3) return TRUE;
+ if (d2 < d4) return TRUE;
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_DateTime::operator <= (CPDFSDK_DateTime& datetime)
+{
+ CPDFSDK_DateTime dt1 = ToGMT();
+ CPDFSDK_DateTime dt2 = datetime.ToGMT();
+ int d1 = (((int)dt1.dt.year) << 16) | (((int)dt1.dt.month) << 8) | (int)dt1.dt.day;
+ int d2 = (((int)dt1.dt.hour) << 16) | (((int)dt1.dt.minute) << 8) | (int)dt1.dt.second;
+ int d3 = (((int)dt2.dt.year) << 16) | (((int)dt2.dt.month) << 8) | (int)dt2.dt.day;
+ int d4 = (((int)dt2.dt.hour) << 16) | (((int)dt2.dt.minute) << 8) | (int)dt2.dt.second;
+
+ if (d1 <= d3) return TRUE;
+ if (d2 <= d4) return TRUE;
+ return FALSE;
+}
+
+CPDFSDK_DateTime::operator time_t()
+{
+ struct tm newtime;
+
+ newtime.tm_year = dt.year - 1900;
+ newtime.tm_mon = dt.month - 1;
+ newtime.tm_mday = dt.day;
+ newtime.tm_hour = dt.hour;
+ newtime.tm_min = dt.minute;
+ newtime.tm_sec = dt.second;
+
+ return mktime(&newtime);
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString(const CFX_ByteString& dtStr)
+{
+ int strLength = dtStr.GetLength();
+ if (strLength > 0)
+ {
+ int i = 0;
+ int j, k;
+ FX_CHAR ch;
+ while (i < strLength)
+ {
+ ch = dtStr[i];
+ if (ch >= '0' && ch <= '9') break;
+ i ++;
+ }
+ if (i >= strLength) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 4)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.year = (FX_SHORT)k;
+ if (i >= strLength || j < 4) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.month = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.day = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.hour = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.minute = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.second = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+
+ ch = dtStr[i ++];
+ if (ch != '-' && ch != '+') return *this;
+ if (ch == '-')
+ dt.tzHour = -1;
+ else
+ dt.tzHour = 1;
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.tzHour *= (FX_CHAR)k;
+ if (i >= strLength || j < 2) return *this;
+
+ ch = dtStr[i ++];
+ if (ch != '\'') return *this;
+ j = 0;
+ k = 0;
+ while (i < strLength && j < 2)
+ {
+ ch = dtStr[i];
+ k = k * 10 + ch - '0';
+ j ++;
+ if (ch < '0' || ch > '9') break;
+ i ++;
+ }
+ dt.tzMinute = (FX_BYTE)k;
+ if (i >= strLength || j < 2) return *this;
+ }
+
+ return *this;
+}
+
+CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString()
+{
+ CFX_ByteString str1;
+ str1.Format("%04d-%02d-%02d %02d:%02d:%02d ", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
+ if (dt.tzHour < 0)
+ str1 += "-";
+ else
+ str1 += "+";
+ CFX_ByteString str2;
+ str2.Format("%02d:%02d", abs(dt.tzHour), dt.tzMinute);
+ return str1 + str2;
+}
+
+CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString()
+{
+ CFX_ByteString dtStr;
+ char tempStr[32];
+ sprintf(tempStr, "D:%04d%02d%02d%02d%02d%02d", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second);
+ dtStr = CFX_ByteString(tempStr);
+ if (dt.tzHour < 0)
+ dtStr += CFX_ByteString("-");
+ else
+ dtStr += CFX_ByteString("+");
+ sprintf(tempStr, "%02d'%02d'", abs(dt.tzHour), dt.tzMinute);
+ dtStr += CFX_ByteString(tempStr);
+ return dtStr;
+}
+
+void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st)
+{
+ CPDFSDK_DateTime dt = *this;
+ time_t t = (time_t)dt;
+ struct tm* pTime = localtime(&t);
+ if(pTime){
+ st.wYear = (FX_WORD)pTime->tm_year + 1900;
+ st.wMonth = (FX_WORD)pTime->tm_mon + 1;
+ st.wDay = (FX_WORD)pTime->tm_mday;
+ st.wDayOfWeek = (FX_WORD)pTime->tm_wday;
+ st.wHour = (FX_WORD)pTime->tm_hour;
+ st.wMinute = (FX_WORD)pTime->tm_min;
+ st.wSecond = (FX_WORD)pTime->tm_sec;
+ st.wMilliseconds = 0;
+ }
+}
+
+CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT()
+{
+ CPDFSDK_DateTime dt = *this;
+ dt.AddSeconds(-_gAfxGetTimeZoneInSeconds(dt.dt.tzHour, dt.dt.tzMinute));
+ dt.dt.tzHour = 0;
+ dt.dt.tzMinute = 0;
+ return dt;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days)
+{
+ if (days == 0) return *this;
+
+ FX_SHORT y = dt.year, yy;
+ FX_BYTE m = dt.month;
+ FX_BYTE d = dt.day;
+ int mdays, ydays, ldays;
+
+ ldays = days;
+ if (ldays > 0)
+ {
+ yy = y;
+ if (((FX_WORD)m * 100 + d) > 300) yy ++;
+ ydays = _gAfxGetYearDays(yy);
+ while (ldays >= ydays)
+ {
+ y ++;
+ ldays -= ydays;
+ yy ++;
+ mdays = _gAfxGetMonthDays(y, m);
+ if (d > mdays)
+ {
+ m ++;
+ d -= mdays;
+ }
+ ydays = _gAfxGetYearDays(yy);
+ }
+ mdays = _gAfxGetMonthDays(y, m) - d + 1;
+ while (ldays >= mdays)
+ {
+ ldays -= mdays;
+ m ++;
+ d = 1;
+ mdays = _gAfxGetMonthDays(y, m);
+ }
+ d += ldays;
+ }
+ else
+ {
+ ldays *= -1;
+ yy = y;
+ if (((FX_WORD)m * 100 + d) < 300) yy --;
+ ydays = _gAfxGetYearDays(yy);
+ while (ldays >= ydays)
+ {
+ y --;
+ ldays -= ydays;
+ yy --;
+ mdays = _gAfxGetMonthDays(y, m);
+ if (d > mdays)
+ {
+ m ++;
+ d -= mdays;
+ }
+ ydays = _gAfxGetYearDays(yy);
+ }
+ while (ldays >= d)
+ {
+ ldays -= d;
+ m --;
+ mdays = _gAfxGetMonthDays(y, m);
+ d = mdays;
+ }
+ d -= ldays;
+ }
+
+ dt.year = y;
+ dt.month = m;
+ dt.day = d;
+
+ return *this;
+}
+
+CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds)
+{
+ if (seconds == 0) return *this;
+
+ int n;
+ int days;
+
+ n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds;
+ if (n < 0)
+ {
+ days = (n - 86399) / 86400;
+ n -= days * 86400;
+ }
+ else
+ {
+ days = n / 86400;
+ n %= 86400;
+ }
+ dt.hour = (FX_BYTE)(n / 3600);
+ dt.hour %= 24;
+ n %= 3600;
+ dt.minute = (FX_BYTE)(n / 60);
+ dt.second = (FX_BYTE)(n % 60);
+ if (days != 0) AddDays(days);
+
+ return *this;
+}
+
+
+//---------------------------------------------------------------------------
+// CPDFSDK_Annot
+//---------------------------------------------------------------------------
+CPDFSDK_Annot::CPDFSDK_Annot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView) :
+m_pAnnot(pAnnot),
+m_pPageView(pPageView),
+m_bSelected(FALSE),
+m_nTabOrder(-1)
+{
+}
+
+CPDFSDK_Annot::~CPDFSDK_Annot()
+{
+ m_pAnnot = NULL;
+ m_pPageView = NULL;
+}
+
+CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot()
+{
+ return m_pAnnot;
+}
+
+FX_DWORD CPDFSDK_Annot::GetFlags()
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->GetFlags();
+}
+
+void CPDFSDK_Annot::SetPage(CPDFSDK_PageView* pPageView)
+{
+ m_pPageView = pPageView;
+}
+
+CPDFSDK_PageView* CPDFSDK_Annot::GetPageView()
+{
+ return m_pPageView;
+}
+
+FX_BOOL CPDFSDK_Annot::IsSelected()
+{
+ return m_bSelected;
+}
+
+void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected)
+{
+ m_bSelected = bSelected;
+}
+
+// Tab Order
+int CPDFSDK_Annot::GetTabOrder()
+{
+ return m_nTabOrder;
+}
+
+void CPDFSDK_Annot::SetTabOrder(int iTabOrder)
+{
+ m_nTabOrder = iTabOrder;
+}
+
+CPDF_Dictionary* CPDFSDK_Annot::GetAnnotDict() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->m_pAnnotDict;
+}
+
+void CPDFSDK_Annot::SetRect(const CPDF_Rect& rect)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+ ASSERT(rect.right - rect.left >= GetMinWidth());
+ ASSERT(rect.top - rect.bottom >= GetMinHeight());
+
+ m_pAnnot->m_pAnnotDict->SetAtRect("Rect", rect);
+}
+
+CPDF_Rect CPDFSDK_Annot::GetRect() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ CPDF_Rect rect;
+ m_pAnnot->GetRect(rect);
+
+ return rect;
+}
+
+CFX_ByteString CPDFSDK_Annot::GetType() const
+{
+ ASSERT(m_pAnnot != NULL);
+
+ return m_pAnnot->GetSubType();
+}
+
+CFX_ByteString CPDFSDK_Annot::GetSubType() const
+{
+ return "";
+}
+
+void CPDFSDK_Annot::ResetAppearance()
+{
+ ASSERT(FALSE);
+}
+
+void CPDFSDK_Annot::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ ASSERT(m_pPageView != NULL);
+ ASSERT(m_pAnnot != NULL);
+
+ m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, mode, pOptions);
+}
+
+FX_BOOL CPDFSDK_Annot::IsAppearanceValid()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("AP") != NULL;
+}
+
+FX_BOOL CPDFSDK_Annot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ if (pAP == NULL) return FALSE;
+
+ // Choose the right sub-ap
+ const FX_CHAR* ap_entry = "N";
+ if (mode == CPDF_Annot::Down)
+ ap_entry = "D";
+ else if (mode == CPDF_Annot::Rollover)
+ ap_entry = "R";
+ if (!pAP->KeyExist(ap_entry))
+ ap_entry = "N";
+
+ // Get the AP stream or subdirectory
+ CPDF_Object* psub = pAP->GetElementValue(ap_entry);
+ if (psub == NULL) return FALSE;
+
+ return TRUE;
+}
+
+void CPDFSDK_Annot::DrawBorder(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ const CPDF_RenderOptions* pOptions)
+{
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions);
+}
+
+void CPDFSDK_Annot::ClearCachedAP()
+{
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->ClearCachedAP();
+}
+
+void CPDFSDK_Annot::SetContents(const CFX_WideString& sContents)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (sContents.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("Contents");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("Contents", PDF_EncodeText(sContents));
+}
+
+CFX_WideString CPDFSDK_Annot::GetContents() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetUnicodeText("Contents");
+}
+
+void CPDFSDK_Annot::SetAnnotName(const CFX_WideString& sName)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (sName.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("NM");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("NM", PDF_EncodeText(sName));
+}
+
+CFX_WideString CPDFSDK_Annot::GetAnnotName() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetUnicodeText("NM");
+}
+
+void CPDFSDK_Annot::SetModifiedDate(const FX_SYSTEMTIME& st)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDFSDK_DateTime dt(st);
+ CFX_ByteString str = dt.ToPDFDateTimeString();
+
+ if (str.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("M");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("M", str);
+}
+
+FX_SYSTEMTIME CPDFSDK_Annot::GetModifiedDate() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ FX_SYSTEMTIME systime;
+ CFX_ByteString str = m_pAnnot->m_pAnnotDict->GetString("M");
+
+ CPDFSDK_DateTime dt(str);
+ dt.ToSystemTime(systime);
+
+ return systime;
+}
+
+void CPDFSDK_Annot::SetFlags(int nFlags)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->SetAtInteger("F", nFlags);
+}
+
+int CPDFSDK_Annot::GetFlags() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetInteger("F");
+}
+
+void CPDFSDK_Annot::SetAppState(const CFX_ByteString& str)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (str.IsEmpty())
+ m_pAnnot->m_pAnnotDict->RemoveAt("AS");
+ else
+ m_pAnnot->m_pAnnotDict->SetAtString("AS", str);
+}
+
+CFX_ByteString CPDFSDK_Annot::GetAppState() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetString("AS");
+}
+
+void CPDFSDK_Annot::SetStructParent(int key)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->SetAtInteger("StructParent", key);
+}
+
+int CPDFSDK_Annot::GetStructParent() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetInteger("StructParent");
+}
+
+//border
+void CPDFSDK_Annot::SetBorderWidth(int nWidth)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+
+ if (pBorder)
+ {
+ pBorder->SetAt(2, FX_NEW CPDF_Number(nWidth));
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+ }
+
+ pBSDict->SetAtInteger("W", nWidth);
+ }
+}
+
+int CPDFSDK_Annot::GetBorderWidth() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+
+ if (pBorder)
+ {
+ return pBorder->GetInteger(2);
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+
+ if (pBSDict)
+ {
+ return pBSDict->GetInteger("W", 1);
+ }
+ }
+ return 1;
+}
+
+void CPDFSDK_Annot::SetBorderStyle(int nStyle)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+ }
+
+ switch (nStyle)
+ {
+ case BBS_SOLID:
+ pBSDict->SetAtName("S", "S");
+ break;
+ case BBS_DASH:
+ pBSDict->SetAtName("S", "D");
+ break;
+ case BBS_BEVELED:
+ pBSDict->SetAtName("S", "B");
+ break;
+ case BBS_INSET:
+ pBSDict->SetAtName("S", "I");
+ break;
+ case BBS_UNDERLINE:
+ pBSDict->SetAtName("S", "U");
+ break;
+ }
+}
+
+int CPDFSDK_Annot::GetBorderStyle() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (pBSDict)
+ {
+ CFX_ByteString sBorderStyle = pBSDict->GetString("S", "S");
+ if (sBorderStyle == "S") return BBS_SOLID;
+ if (sBorderStyle == "D") return BBS_DASH;
+ if (sBorderStyle == "B") return BBS_BEVELED;
+ if (sBorderStyle == "I") return BBS_INSET;
+ if (sBorderStyle == "U") return BBS_UNDERLINE;
+ }
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+ if (pBorder)
+ {
+ if (pBorder->GetCount() >= 4)
+ {
+ CPDF_Array *pDP = pBorder->GetArray(3);
+ if (pDP && pDP->GetCount() > 0)
+ return BBS_DASH;
+ }
+ }
+
+ return BBS_SOLID;
+}
+
+void CPDFSDK_Annot::SetBorderDash(const CFX_IntArray& array)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (!pBSDict)
+ {
+ pBSDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("BS", pBSDict);
+ }
+
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ {
+ pArray->AddInteger(array[i]);
+ }
+
+ pBSDict->SetAt("D", pArray);
+}
+
+void CPDFSDK_Annot::GetBorderDash(CFX_IntArray& array) const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pDash = NULL;
+
+ CPDF_Array* pBorder = m_pAnnot->m_pAnnotDict->GetArray("Border");
+ if (pBorder)
+ {
+ pDash = pBorder->GetArray(3);
+ }
+ else
+ {
+ CPDF_Dictionary* pBSDict = m_pAnnot->m_pAnnotDict->GetDict("BS");
+ if (pBSDict)
+ {
+ pDash = pBSDict->GetArray("D");
+ }
+ }
+
+ if (pDash)
+ {
+ for (int i=0,sz=pDash->GetCount(); i<sz; i++)
+ {
+ array.Add(pDash->GetInteger(i));
+ }
+ }
+}
+
+void CPDFSDK_Annot::SetColor(FX_COLORREF color)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Array* pArray = FX_NEW CPDF_Array;
+ pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f);
+ pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f);
+ pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f);
+ m_pAnnot->m_pAnnotDict->SetAt("C", pArray);
+}
+
+void CPDFSDK_Annot::RemoveColor()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("C") ;
+}
+
+FX_BOOL CPDFSDK_Annot::GetColor(FX_COLORREF& color) const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (CPDF_Array* pEntry = m_pAnnot->m_pAnnotDict->GetArray("C"))
+ {
+ int nCount = pEntry->GetCount();
+ if (nCount == 1)
+ {
+ FX_FLOAT g = pEntry->GetNumber(0) * 255;
+
+ color = FXSYS_RGB((int)g, (int)g, (int)g);
+
+ return TRUE;
+ }
+ else if (nCount == 3)
+ {
+ FX_FLOAT r = pEntry->GetNumber(0) * 255;
+ FX_FLOAT g = pEntry->GetNumber(1) * 255;
+ FX_FLOAT b = pEntry->GetNumber(2) * 255;
+
+ color = FXSYS_RGB((int)r, (int)g, (int)b);
+
+ return TRUE;
+ }
+ else if (nCount == 4)
+ {
+ FX_FLOAT c = pEntry->GetNumber(0);
+ FX_FLOAT m = pEntry->GetNumber(1);
+ FX_FLOAT y = pEntry->GetNumber(2);
+ FX_FLOAT k = pEntry->GetNumber(3);
+
+ FX_FLOAT r = 1.0f - FX_MIN(1.0f, c + k);
+ FX_FLOAT g = 1.0f - FX_MIN(1.0f, m + k);
+ FX_FLOAT b = 1.0f - FX_MIN(1.0f, y + k);
+
+ color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255));
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+
+void CPDFSDK_Annot::WriteAppearance(const CFX_ByteString& sAPType, const CPDF_Rect& rcBBox,
+ const CPDF_Matrix& matrix, const CFX_ByteString& sContents,
+ const CFX_ByteString& sAPState)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+
+ if (!pAPDict)
+ {
+ pAPDict = FX_NEW CPDF_Dictionary;
+ m_pAnnot->m_pAnnotDict->SetAt("AP", pAPDict);
+ }
+
+ CPDF_Stream* pStream = NULL;
+ CPDF_Dictionary* pParentDict = NULL;
+
+ if (sAPState.IsEmpty())
+ {
+ pParentDict = pAPDict;
+ pStream = pAPDict->GetStream(sAPType);
+ }
+ else
+ {
+ CPDF_Dictionary* pAPTypeDict = pAPDict->GetDict(sAPType);
+ if (!pAPTypeDict)
+ {
+ pAPTypeDict = FX_NEW CPDF_Dictionary;
+ pAPDict->SetAt(sAPType, pAPTypeDict);
+ }
+
+ pParentDict = pAPTypeDict;
+ pStream = pAPTypeDict->GetStream(sAPState);
+ }
+
+ if (!pStream)
+ {
+ ASSERT(m_pPageView != NULL);
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+ ASSERT(pDoc != NULL);
+
+ pStream = FX_NEW CPDF_Stream(NULL, 0, NULL);
+ FX_INT32 objnum = pDoc->AddIndirectObject(pStream);
+ //pAPDict->SetAtReference(sAPType, pDoc, objnum);
+ ASSERT(pParentDict != NULL);
+ pParentDict->SetAtReference(sAPType, pDoc, objnum);
+ }
+
+ CPDF_Dictionary * pStreamDict = pStream->GetDict();
+
+ if (!pStreamDict)
+ {
+ pStreamDict = FX_NEW CPDF_Dictionary;
+ pStreamDict->SetAtName("Type", "XObject");
+ pStreamDict->SetAtName("Subtype", "Form");
+ pStreamDict->SetAtInteger("FormType", 1);
+ pStream->InitStream(NULL,0,pStreamDict);
+ }
+
+ if (pStreamDict)
+ {
+ pStreamDict->SetAtMatrix("Matrix",matrix);
+ pStreamDict->SetAtRect("BBox", rcBBox);
+ }
+
+ pStream->SetData((FX_BYTE*)(FX_LPCSTR)sContents, sContents.GetLength(), FALSE, FALSE);
+}
+
+#define BA_ANNOT_MINWIDTH 1
+#define BA_ANNOT_MINHEIGHT 1
+
+FX_FLOAT CPDFSDK_Annot::GetMinWidth() const
+{
+ return BA_ANNOT_MINWIDTH;
+}
+
+FX_FLOAT CPDFSDK_Annot::GetMinHeight() const
+{
+ return BA_ANNOT_MINHEIGHT;
+}
+
+FX_BOOL CPDFSDK_Annot::CreateFormFiller()
+{
+ return TRUE;
+}
+FX_BOOL CPDFSDK_Annot::IsVisible() const
+{
+ int nFlags = GetFlags();
+ return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || (nFlags & ANNOTFLAG_NOVIEW));
+}
+
+CPDF_Action CPDFSDK_Annot::GetAction() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("A");
+}
+
+void CPDFSDK_Annot::SetAction(const CPDF_Action& action)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ ASSERT(action != NULL);
+
+ if ((CPDF_Action&)action != m_pAnnot->m_pAnnotDict->GetDict("A"))
+ {
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
+ ASSERT(pDoc != NULL);
+
+ if (action.m_pDict && (action.m_pDict->GetObjNum() == 0))
+ pDoc->AddIndirectObject(action.m_pDict);
+ m_pAnnot->m_pAnnotDict->SetAtReference("A", pDoc, action.m_pDict->GetObjNum());
+ }
+}
+
+void CPDFSDK_Annot::RemoveAction()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("A");
+}
+
+CPDF_AAction CPDFSDK_Annot::GetAAction() const
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ return m_pAnnot->m_pAnnotDict->GetDict("AA");
+}
+
+void CPDFSDK_Annot::SetAAction(const CPDF_AAction& aa)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+ ASSERT(aa != NULL);
+
+ if ((CPDF_AAction&)aa != m_pAnnot->m_pAnnotDict->GetDict("AA"))
+ m_pAnnot->m_pAnnotDict->SetAt("AA", (CPDF_AAction&)aa);
+}
+
+void CPDFSDK_Annot::RemoveAAction()
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ m_pAnnot->m_pAnnotDict->RemoveAt("AA");
+}
+
+CPDF_Action CPDFSDK_Annot::GetAAction(CPDF_AAction::AActionType eAAT)
+{
+ CPDF_AAction AAction = GetAAction();
+
+ if (AAction.ActionExist(eAAT))
+ {
+ return AAction.GetAction(eAAT);
+ }
+ else if (eAAT == CPDF_AAction::ButtonUp)
+ {
+ return GetAction();
+ }
+
+ return NULL;
+}
+
+void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, CPDF_RenderOptions* pOptions)
+{
+
+ m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal);
+ m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
+
+ return ;
+}
+
+CPDF_Page* CPDFSDK_Annot::GetPDFPage()
+{
+ if(m_pPageView)
+ return m_pPageView->GetPDFPage();
+ return NULL;
+}
+
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
new file mode 100644
index 0000000000..23d9ec9c47
--- /dev/null
+++ b/fpdfsdk/src/fsdk_baseform.cpp
@@ -0,0 +1,3111 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fsdk_baseannot.h"
+#include "../include/fsdk_baseform.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/fsdk_actionhandler.h"
+
+#include "../include/javascript/IJavaScript.h"
+
+//------------------------------------------------------------------------------------
+//* CPDFSDK_Widget
+//------------------------------------------------------------------------------------
+
+#define IsFloatZero(f) ((f) < 0.01 && (f) > -0.01)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView, CPDFSDK_InterForm* pInterForm) :
+ CPDFSDK_Annot(pAnnot, pPageView),
+ m_pInterForm(pInterForm),
+ m_nAppAge(0),
+ m_nValueAge(0)
+{
+ ASSERT(m_pInterForm != NULL);
+}
+
+CPDFSDK_Widget::~CPDFSDK_Widget()
+{
+
+}
+
+FX_BOOL CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Dictionary* pAP = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ if (pAP == NULL) return FALSE;
+
+ // Choose the right sub-ap
+ const FX_CHAR* ap_entry = "N";
+ if (mode == CPDF_Annot::Down)
+ ap_entry = "D";
+ else if (mode == CPDF_Annot::Rollover)
+ ap_entry = "R";
+ if (!pAP->KeyExist(ap_entry))
+ ap_entry = "N";
+
+ // Get the AP stream or subdirectory
+ CPDF_Object* psub = pAP->GetElementValue(ap_entry);
+ if (psub == NULL) return FALSE;
+
+ int nFieldType = GetFieldType();
+ switch (nFieldType)
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ case FIELDTYPE_COMBOBOX:
+ case FIELDTYPE_LISTBOX:
+ case FIELDTYPE_TEXTFIELD:
+ case FIELDTYPE_SIGNATURE:
+ return psub->GetType() == PDFOBJ_STREAM;
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ if (psub->GetType() == PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary* pSubDict = (CPDF_Dictionary*)psub;
+
+ return pSubDict->GetStream(this->GetAppState()) != NULL;
+ }
+ else
+ return FALSE;
+ break;
+ }
+
+ return TRUE;
+}
+
+int CPDFSDK_Widget::GetFieldType() const
+{
+ CPDF_FormField* pField = GetFormField();
+ ASSERT(pField != NULL);
+
+ return pField->GetFieldType();
+}
+
+int CPDFSDK_Widget::GetFieldFlags() const
+{
+ CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ CPDF_FormControl* pFormControl = pPDFInterForm->GetControlByDict(m_pAnnot->m_pAnnotDict);
+ CPDF_FormField* pFormField = pFormControl->GetField();
+ return pFormField->GetFieldFlags();
+}
+
+CFX_ByteString CPDFSDK_Widget::GetSubType() const
+{
+ int nType = GetFieldType();
+
+ if (nType == FIELDTYPE_SIGNATURE)
+ return BFFT_SIGNATURE;
+ return CPDFSDK_Annot::GetSubType();
+}
+
+CPDF_FormField* CPDFSDK_Widget::GetFormField() const
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CPDF_FormControl* pCtrl = GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ return pCtrl->GetField();
+}
+
+CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ return pPDFInterForm->GetControlByDict(GetAnnotDict());
+}
+static CPDF_Dictionary* BF_GetField(CPDF_Dictionary* pFieldDict, const FX_CHAR* name)
+{
+ if (pFieldDict == NULL) return NULL;
+ // First check the dictionary itself
+ CPDF_Object* pAttr = pFieldDict->GetElementValue(name);
+ if (pAttr) return pFieldDict;
+
+ // Now we need to search from parents
+ CPDF_Dictionary* pParent = pFieldDict->GetDict("Parent");
+ if (pParent == NULL) return NULL;
+
+ return BF_GetField(pParent, name);
+}
+
+CPDF_FormControl* CPDFSDK_Widget::GetFormControl(CPDF_InterForm* pInterForm, CPDF_Dictionary* pAnnotDict)
+{
+ ASSERT(pInterForm != NULL);
+ ASSERT(pAnnotDict != NULL);
+
+ CPDF_FormControl* pControl = pInterForm->GetControlByDict(pAnnotDict);
+
+ return pControl;
+}
+
+int CPDFSDK_Widget::GetRotate() const
+{
+ CPDF_FormControl* pCtrl = this->GetFormControl();
+ ASSERT(pCtrl != NULL);
+
+ return pCtrl->GetRotation() % 360;
+}
+
+FX_BOOL CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ int iColorType = 0;
+ color = FX_ARGBTOCOLORREF(pFormCtrl->GetBackgroundColor(iColorType));
+
+ return iColorType != COLORTYPE_TRANSPARENT;
+}
+
+FX_BOOL CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ int iColorType = 0;
+ color = FX_ARGBTOCOLORREF(pFormCtrl->GetBorderColor(iColorType));
+
+ return iColorType != COLORTYPE_TRANSPARENT;
+}
+
+FX_BOOL CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ FX_ARGB argb;
+ int iColorType = COLORTYPE_TRANSPARENT;
+ da.GetColor(argb, iColorType);
+ color = FX_ARGBTOCOLORREF(argb);
+
+ return iColorType != COLORTYPE_TRANSPARENT;
+ }
+
+ return FALSE;
+}
+
+FX_FLOAT CPDFSDK_Widget::GetFontSize() const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance();
+ CFX_ByteString csFont = "";
+ FX_FLOAT fFontSize = 0.0f;
+ pDa.GetFont(csFont, fFontSize);
+
+ return fFontSize;
+}
+
+int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetSelectedIndex(nIndex);
+}
+
+CFX_WideString CPDFSDK_Widget::GetValue() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetValue();
+}
+
+CFX_WideString CPDFSDK_Widget::GetDefaultValue() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetDefaultValue();
+}
+
+CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetOptionLabel(nIndex);
+}
+
+int CPDFSDK_Widget::CountOptions() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->CountOptions();
+}
+
+FX_BOOL CPDFSDK_Widget::IsOptionSelected(int nIndex) const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->IsItemSelected(nIndex);
+}
+
+int CPDFSDK_Widget::GetTopVisibleIndex() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetTopVisibleIndex();
+}
+
+FX_BOOL CPDFSDK_Widget::IsChecked() const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ return pFormCtrl->IsChecked();
+}
+
+int CPDFSDK_Widget::GetAlignment() const
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ return pFormCtrl->GetControlAlignment();
+}
+
+int CPDFSDK_Widget::GetMaxLen() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetMaxLen();
+}
+
+void CPDFSDK_Widget::SetCheck(FX_BOOL bChecked, FX_BOOL bNotify)
+{
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_FormField* pFormField = pFormCtrl->GetField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked, bNotify);
+}
+
+void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->SetValue(sValue, bNotify);
+}
+
+void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue)
+{
+}
+void CPDFSDK_Widget::SetOptionSelection(int index, FX_BOOL bSelected, FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->SetItemSelection(index, bSelected, bNotify);
+}
+
+void CPDFSDK_Widget::ClearSelection(FX_BOOL bNotify)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ pFormField->ClearSelection(bNotify);
+}
+
+void CPDFSDK_Widget::SetTopVisibleIndex(int index)
+{
+}
+
+void CPDFSDK_Widget::SetAppModified()
+{
+ m_bAppModified = TRUE;
+}
+
+void CPDFSDK_Widget::ClearAppModified()
+{
+ m_bAppModified = FALSE;
+}
+
+FX_BOOL CPDFSDK_Widget::IsAppModified() const
+{
+ return m_bAppModified;
+}
+
+void CPDFSDK_Widget::ResetAppearance(FX_LPCWSTR sValue, FX_BOOL bValueChanged)
+{
+ SetAppModified();
+
+ m_nAppAge++;
+ if (m_nAppAge > 999999)
+ m_nAppAge = 0;
+ if (bValueChanged)
+ m_nValueAge++;
+
+ int nFieldType = GetFieldType();
+
+ switch (nFieldType)
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ ResetAppearance_PushButton();
+ break;
+ case FIELDTYPE_CHECKBOX:
+ ResetAppearance_CheckBox();
+ break;
+ case FIELDTYPE_RADIOBUTTON:
+ ResetAppearance_RadioButton();
+ break;
+ case FIELDTYPE_COMBOBOX:
+ ResetAppearance_ComboBox(sValue);
+ break;
+ case FIELDTYPE_LISTBOX:
+ ResetAppearance_ListBox();
+ break;
+ case FIELDTYPE_TEXTFIELD:
+ ResetAppearance_TextField(sValue);
+ break;
+ }
+
+ ASSERT(m_pAnnot != NULL);
+ m_pAnnot->ClearCachedAP();
+}
+
+CFX_WideString CPDFSDK_Widget::OnFormat(int nCommitKey, FX_BOOL& bFormated)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+
+ return m_pInterForm->OnFormat(pFormField, nCommitKey, bFormated);
+
+}
+
+void CPDFSDK_Widget::ResetFieldAppearance(FX_BOOL bValueChanged)
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+
+ m_pInterForm->ResetFieldAppearance(pFormField, NULL, bValueChanged);
+}
+
+void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice, const CPDF_Matrix* pUser2Device,
+ CPDF_Annot::AppearanceMode mode, const CPDF_RenderOptions* pOptions)
+{
+ int nFieldType = GetFieldType();
+
+ if ((nFieldType == FIELDTYPE_CHECKBOX || nFieldType == FIELDTYPE_RADIOBUTTON) &&
+ mode == CPDF_Annot::Normal &&
+ !this->IsWidgetAppearanceValid(CPDF_Annot::Normal))
+ {
+ CFX_PathData pathData;
+
+ CPDF_Rect rcAnnot = this->GetRect();
+
+ pathData.AppendRect(rcAnnot.left, rcAnnot.bottom,
+ rcAnnot.right, rcAnnot.top);
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 0.0f;
+
+ pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA, FXFILL_ALTERNATE);
+ }
+ else
+ {
+ CPDFSDK_Annot::DrawAppearance(pDevice, pUser2Device, mode, pOptions);
+ }
+}
+
+void CPDFSDK_Widget::UpdateField()
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+ m_pInterForm->UpdateField(pFormField);
+}
+
+void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice, CPDFSDK_PageView* pPageView)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ int nFieldType = GetFieldType();
+ if (m_pInterForm->IsNeedHighLight(nFieldType))
+ {
+
+// if (nFieldType != FIELDTYPE_PUSHBUTTON)
+// {
+ CPDF_Rect rc = GetRect();
+ FX_COLORREF color = m_pInterForm->GetHighlightColor(nFieldType);
+ FX_BYTE alpha = m_pInterForm->GetHighlightAlpha();
+
+ CFX_FloatRect rcDevice;
+ ASSERT(m_pInterForm->GetDocument());
+ CPDFDoc_Environment* pEnv = m_pInterForm->GetDocument()->GetEnv();
+ if(!pEnv)
+ return;
+ CFX_AffineMatrix page2device;
+ pPageView->GetCurrentMatrix(page2device);
+ page2device.Transform(((FX_FLOAT)rc.left), ((FX_FLOAT)rc.bottom), rcDevice.left, rcDevice.bottom);
+// pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.left, rc.bottom, &rcDevice.left, &rcDevice.bottom);
+// pEnv->FFI_PageToDevice(m_pPageView->GetPDFPage(), rc.right, rc.top, &rcDevice.right, &rcDevice.top);
+ page2device.Transform(((FX_FLOAT)rc.right), ((FX_FLOAT)rc.top), rcDevice.right, rcDevice.top);
+
+ rcDevice.Normalize();
+
+ FX_ARGB argb = ArgbEncode((int)alpha, color);
+ FX_RECT rcDev((int)rcDevice.left,(int)rcDevice.top,(int)rcDevice.right,(int)rcDevice.bottom);
+ pDevice->FillRect(&rcDev, argb);
+ /* }*/
+ }
+}
+
+void CPDFSDK_Widget::ResetAppearance_PushButton()
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+
+ FX_INT32 nLayout = 0;
+
+ switch (pControl->GetTextPosition())
+ {
+ case TEXTPOS_ICON:
+ nLayout = PPBL_ICON;
+ break;
+ case TEXTPOS_BELOW:
+ nLayout = PPBL_ICONTOPLABELBOTTOM;
+ break;
+ case TEXTPOS_ABOVE:
+ nLayout = PPBL_LABELTOPICONBOTTOM;
+ break;
+ case TEXTPOS_RIGHT:
+ nLayout = PPBL_ICONLEFTLABELRIGHT;
+ break;
+ case TEXTPOS_LEFT:
+ nLayout = PPBL_LABELLEFTICONRIGHT;
+ break;
+ case TEXTPOS_OVERLAID:
+ nLayout = PPBL_LABELOVERICON;
+ break;
+ default:
+ nLayout = PPBL_LABEL;
+ break;
+ }
+
+ CPWL_Color crBackground, crBorder;
+
+ int iColorType;
+ FX_FLOAT fc[4];
+
+ pControl->GetOriginalBackgroundColor(iColorType, fc);
+ if (iColorType > 0)
+ crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ pControl->GetOriginalBorderColor(iColorType, fc);
+ if (iColorType > 0)
+ crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ FX_INT32 nBorderStyle = 0;
+ CPWL_Dash dsBorder(3,0,0);
+ CPWL_Color crLeftTop,crRightBottom;
+
+ switch (GetBorderStyle())
+ {
+ case BBS_DASH:
+ nBorderStyle = PBS_DASH;
+ dsBorder = CPWL_Dash(3, 3, 0);
+ break;
+ case BBS_BEVELED:
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+ crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+ break;
+ case BBS_INSET:
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+ break;
+ case BBS_UNDERLINE:
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ default:
+ nBorderStyle = PBS_SOLID;
+ break;
+ }
+
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
+
+ CPWL_Color crText(COLORTYPE_GRAY,0);
+
+ FX_FLOAT fFontSize = 12.0f;
+ CFX_ByteString csNameTag;
+
+ CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ da.GetColor(iColorType, fc);
+ crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+ }
+
+ if (da.HasFont())
+ da.GetFont(csNameTag, fFontSize);
+
+ CFX_WideString csWCaption;
+ CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;
+
+ if (pControl->HasMKEntry("CA"))
+ {
+ csNormalCaption = pControl->GetNormalCaption();
+ }
+ if (pControl->HasMKEntry("RC"))
+ {
+ csRolloverCaption = pControl->GetRolloverCaption();
+ }
+ if (pControl->HasMKEntry("AC"))
+ {
+ csDownCaption = pControl->GetDownCaption();
+ }
+
+ CPDF_Stream* pNormalIcon = NULL;
+ CPDF_Stream* pRolloverIcon = NULL;
+ CPDF_Stream* pDownIcon = NULL;
+
+ if (pControl->HasMKEntry("I"))
+ {
+ pNormalIcon = pControl->GetNormalIcon();
+ }
+ if (pControl->HasMKEntry("RI"))
+ {
+ pRolloverIcon = pControl->GetRolloverIcon();
+ }
+ if (pControl->HasMKEntry("IX"))
+ {
+ pDownIcon = pControl->GetDownIcon();
+ }
+
+ if (pNormalIcon)
+ {
+ if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict())
+ {
+ if (pImageDict->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgA");
+ }
+ }
+
+ if (pRolloverIcon)
+ {
+ if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict())
+ {
+ if (pImageDict->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgB");
+ }
+ }
+
+ if (pDownIcon)
+ {
+ if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict())
+ {
+ if (pImageDict->GetString("Name").IsEmpty())
+ pImageDict->SetAtString("Name", "ImgC");
+ }
+ }
+
+ CPDF_IconFit iconFit = pControl->GetIconFit();
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
+ FontMap.Initial();
+
+ FontMap.SetAPType("N");
+
+ CFX_ByteString csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
+ CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+ CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);
+
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP);
+ if (pNormalIcon)
+ AddImageToAppearance("N", pNormalIcon);
+
+ CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();
+ if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle)
+ {
+ if (csRolloverCaption.IsEmpty() && !pRolloverIcon)
+ {
+ csRolloverCaption = csNormalCaption;
+ pRolloverIcon = pNormalIcon;
+ }
+
+ FontMap.SetAPType("R");
+
+ csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
+ CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+ CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize, nLayout);
+
+ WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP);
+ if (pRolloverIcon)
+ AddImageToAppearance("R", pRolloverIcon);
+
+ if (csDownCaption.IsEmpty() && !pDownIcon)
+ {
+ csDownCaption = csNormalCaption;
+ pDownIcon = pNormalIcon;
+ }
+
+ switch (nBorderStyle)
+ {
+ case PBS_BEVELED:
+ {
+ CPWL_Color crTemp = crLeftTop;
+ crLeftTop = crRightBottom;
+ crRightBottom = crTemp;
+ }
+ break;
+ case PBS_INSET:
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+ break;
+ }
+
+ FontMap.SetAPType("D");
+
+ csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+ CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder) +
+ CPWL_Utils::GetPushButtonAppStream(iconFit.GetFittingBounds() ? rcWindow : rcClient, &FontMap, pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);
+
+ WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP);
+ if (pDownIcon)
+ AddImageToAppearance("D", pDownIcon);
+ }
+ else
+ {
+ RemoveAppearance("D");
+ RemoveAppearance("R");
+ }
+}
+
+void CPDFSDK_Widget::ResetAppearance_CheckBox()
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+
+
+ CPWL_Color crBackground, crBorder, crText;
+
+ int iColorType;
+ FX_FLOAT fc[4];
+
+ pControl->GetOriginalBackgroundColor(iColorType, fc);
+ if (iColorType > 0)
+ crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ pControl->GetOriginalBorderColor(iColorType, fc);
+ if (iColorType > 0)
+ crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ FX_INT32 nBorderStyle = 0;
+ CPWL_Dash dsBorder(3,0,0);
+ CPWL_Color crLeftTop,crRightBottom;
+
+ switch (GetBorderStyle())
+ {
+ case BBS_DASH:
+ nBorderStyle = PBS_DASH;
+ dsBorder = CPWL_Dash(3, 3, 0);
+ break;
+ case BBS_BEVELED:
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+ crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+ break;
+ case BBS_INSET:
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+ break;
+ case BBS_UNDERLINE:
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ default:
+ nBorderStyle = PBS_SOLID;
+ break;
+ }
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,fBorderWidth);
+
+ CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ da.GetColor(iColorType, fc);
+ crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+ }
+
+ FX_INT32 nStyle = 0;
+
+ CFX_WideString csWCaption = pControl->GetNormalCaption();
+ if (csWCaption.GetLength() > 0)
+ {
+ switch (csWCaption[0])
+ {
+ case L'l':
+ nStyle = PCS_CIRCLE;
+ break;
+ case L'8':
+ nStyle = PCS_CROSS;
+ break;
+ case L'u':
+ nStyle = PCS_DIAMOND;
+ break;
+ case L'n':
+ nStyle = PCS_SQUARE;
+ break;
+ case L'H':
+ nStyle = PCS_STAR;
+ break;
+ default: //L'4'
+ nStyle = PCS_CHECK;
+ break;
+ }
+ }
+ else
+ {
+ nStyle = PCS_CHECK;
+ }
+
+ CFX_ByteString csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
+ CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+
+ CFX_ByteString csAP_N_OFF = csAP_N_ON;
+
+ switch (nBorderStyle)
+ {
+ case PBS_BEVELED:
+ {
+ CPWL_Color crTemp = crLeftTop;
+ crLeftTop = crRightBottom;
+ crRightBottom = crTemp;
+ }
+ break;
+ case PBS_INSET:
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+ break;
+ }
+
+ CFX_ByteString csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+ CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+
+ CFX_ByteString csAP_D_OFF = csAP_D_ON;
+
+ csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
+ csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient,nStyle,crText);
+
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
+
+ WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
+ WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
+
+ CFX_ByteString csAS = GetAppState();
+ if (csAS.IsEmpty())
+ SetAppState("Off");
+}
+
+void CPDFSDK_Widget::ResetAppearance_RadioButton()
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+
+
+ CPWL_Color crBackground, crBorder, crText;
+
+ int iColorType;
+ FX_FLOAT fc[4];
+
+ pControl->GetOriginalBackgroundColor(iColorType, fc);
+ if (iColorType > 0)
+ crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ pControl->GetOriginalBorderColor(iColorType, fc);
+ if (iColorType > 0)
+ crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ FX_INT32 nBorderStyle = 0;
+ CPWL_Dash dsBorder(3,0,0);
+ CPWL_Color crLeftTop,crRightBottom;
+
+ switch (GetBorderStyle())
+ {
+ case BBS_DASH:
+ nBorderStyle = PBS_DASH;
+ dsBorder = CPWL_Dash(3, 3, 0);
+ break;
+ case BBS_BEVELED:
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,1);
+ crRightBottom = CPWL_Utils::DevideColor(crBackground,2);
+ break;
+ case BBS_INSET:
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75);
+ break;
+ case BBS_UNDERLINE:
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ default:
+ nBorderStyle = PBS_SOLID;
+ break;
+ }
+
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
+
+ CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ da.GetColor(iColorType, fc);
+ crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+ }
+
+ FX_INT32 nStyle = 0;
+
+ CFX_WideString csWCaption = pControl->GetNormalCaption();
+ if (csWCaption.GetLength() > 0)
+ {
+ switch (csWCaption[0])
+ {
+ default: //L'l':
+ nStyle = PCS_CIRCLE;
+ break;
+ case L'8':
+ nStyle = PCS_CROSS;
+ break;
+ case L'u':
+ nStyle = PCS_DIAMOND;
+ break;
+ case L'n':
+ nStyle = PCS_SQUARE;
+ break;
+ case L'H':
+ nStyle = PCS_STAR;
+ break;
+ case L'4':
+ nStyle = PCS_CHECK;
+ break;
+ }
+ }
+ else
+ {
+ nStyle = PCS_CIRCLE;
+ }
+
+ CFX_ByteString csAP_N_ON;
+
+ CPDF_Rect rcCenter = CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);
+
+ if (nStyle == PCS_CIRCLE)
+ {
+ if (nBorderStyle == PBS_BEVELED)
+ {
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
+ crRightBottom = CPWL_Utils::SubstractColor(crBackground,0.25f);
+ }
+ else if (nBorderStyle == PBS_INSET)
+ {
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0.5f);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,0.75f);
+ }
+
+ csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBackground) +
+ CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+ }
+ else
+ {
+ csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,crBackground) +
+ CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+ }
+
+ CFX_ByteString csAP_N_OFF = csAP_N_ON;
+
+ switch (nBorderStyle)
+ {
+ case PBS_BEVELED:
+ {
+ CPWL_Color crTemp = crLeftTop;
+ crLeftTop = crRightBottom;
+ crRightBottom = crTemp;
+ }
+ break;
+ case PBS_INSET:
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+ break;
+ }
+
+ CFX_ByteString csAP_D_ON;
+
+ if (nStyle == PCS_CIRCLE)
+ {
+ CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground,0.25f);
+ if (nBorderStyle == PBS_BEVELED)
+ {
+ crLeftTop = CPWL_Utils::SubstractColor(crBackground,0.25f);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
+ crBK = crBackground;
+ }
+ else if (nBorderStyle == PBS_INSET)
+ {
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY,0);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY,1);
+ }
+
+ csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter,crBK)
+ + CPWL_Utils::GetCircleBorderAppStream(rcCenter,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+ }
+ else
+ {
+ csAP_D_ON = CPWL_Utils::GetRectFillAppStream(rcWindow,CPWL_Utils::SubstractColor(crBackground,0.25f)) +
+ CPWL_Utils::GetBorderAppStream(rcWindow,fBorderWidth,crBorder,crLeftTop,crRightBottom,nBorderStyle,dsBorder);
+ }
+
+ CFX_ByteString csAP_D_OFF = csAP_D_ON;
+
+ csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
+ csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient,nStyle,crText);
+
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON, pControl->GetCheckedAPState());
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
+
+ WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON, pControl->GetCheckedAPState());
+ WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
+
+ CFX_ByteString csAS = GetAppState();
+ if (csAS.IsEmpty())
+ SetAppState("Off");
+}
+
+void CPDFSDK_Widget::ResetAppearance_ComboBox(FX_LPCWSTR sValue)
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcButton = rcClient;
+ rcButton.left = rcButton.right - 13;
+ rcButton.Normalize();
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ CPDF_Rect rcEdit = rcClient;
+ rcEdit.right = rcButton.left;
+ rcEdit.Normalize();
+
+ pEdit->SetPlateRect(rcEdit);
+ pEdit->SetAlignmentV(1);
+
+ FX_FLOAT fFontSize = this->GetFontSize();
+ if (IsFloatZero(fFontSize))
+ pEdit->SetAutoFontSize(TRUE);
+ else
+ pEdit->SetFontSize(fFontSize);
+
+ pEdit->Initialize();
+
+ if (sValue)
+ pEdit->SetText(sValue);
+ else
+ {
+ FX_INT32 nCurSel = pField->GetSelectedIndex(0);
+
+ if (nCurSel < 0)
+ pEdit->SetText((FX_LPCWSTR)pField->GetValue());
+ else
+ pEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(nCurSel));
+ }
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
+ if (sEdit.GetLength() > 0)
+ {
+ sBody << "/Tx BMC\n" << "q\n";
+ if (rcContent.Width() > rcEdit.Width() ||
+ rcContent.Height() > rcEdit.Height())
+ {
+ sBody << rcEdit.left << " " << rcEdit.bottom << " "
+ << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n";
+ }
+
+ CPWL_Color crText = GetTextPWLColor();
+ sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" << "Q\nEMC\n";
+ }
+
+ IFX_Edit::DelEdit(pEdit);
+ }
+
+ sBody << CPWL_Utils::GetDropButtonAppStream(rcButton);
+
+ CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
+
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
+}
+
+void CPDFSDK_Widget::ResetAppearance_ListBox()
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ pEdit->SetPlateRect(CPDF_Rect(rcClient.left,0.0f,rcClient.right,0.0f));
+
+ FX_FLOAT fFontSize = GetFontSize();
+
+ if (IsFloatZero(fFontSize))
+ pEdit->SetFontSize(12.0f);
+ else
+ pEdit->SetFontSize(fFontSize);
+
+ pEdit->Initialize();
+
+ CFX_ByteTextBuf sList;
+ FX_FLOAT fy = rcClient.top;
+
+ FX_INT32 nTop = pField->GetTopVisibleIndex();
+ FX_INT32 nCount = pField->CountOptions();
+ FX_INT32 nSelCount = pField->CountSelectedItems();
+
+ for (FX_INT32 i=nTop; i<nCount; i++)
+ {
+ FX_BOOL bSelected = FALSE;
+ for (FX_INT32 j=0; j<nSelCount; j++)
+ {
+ if (pField->GetSelectedIndex(j) == i)
+ {
+ bSelected = TRUE;
+ break;
+ }
+ }
+
+ pEdit->SetText((FX_LPCWSTR)pField->GetOptionLabel(i));
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+ FX_FLOAT fItemHeight = rcContent.Height();
+
+ if (bSelected)
+ {
+ CPDF_Rect rcItem = CPDF_Rect(rcClient.left,fy-fItemHeight,rcClient.right,fy);
+ sList << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,0,51.0f/255.0f,113.0f/255.0f),TRUE)
+ << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n";
+
+ sList << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1),TRUE) <<
+ CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
+ }
+ else
+ {
+ CPWL_Color crText = GetTextPWLColor();
+ sList << "BT\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) <<
+ CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,fy)) << "ET\n";
+ }
+
+ fy -= fItemHeight;
+ }
+
+ if (sList.GetSize() > 0)
+ {
+ sBody << "/Tx BMC\n" << "q\n" << rcClient.left << " " << rcClient.bottom << " "
+ << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
+ sBody << sList << "Q\nEMC\n";
+ }
+
+ IFX_Edit::DelEdit(pEdit);
+ }
+
+ CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
+
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
+}
+
+void CPDFSDK_Widget::ResetAppearance_TextField(FX_LPCWSTR sValue)
+{
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+ CPDF_FormField* pField = pControl->GetField();
+ ASSERT(pField != NULL);
+
+ CFX_ByteTextBuf sBody, sLines;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->EnableRefresh(FALSE);
+
+// ASSERT(this->m_pBaseForm != NULL);
+ ASSERT(this->m_pInterForm != NULL);
+ CPDFSDK_Document* pDoc = m_pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ CPDFDoc_Environment* pEnv = pDoc->GetEnv();
+
+ CBA_FontMap FontMap(this,pEnv->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pBaseForm->GetEnv()));
+ FontMap.Initial();
+ pEdit->SetFontMap(&FontMap);
+
+ CPDF_Rect rcClient = GetClientRect();
+ pEdit->SetPlateRect(rcClient);
+ pEdit->SetAlignmentH(pControl->GetControlAlignment());
+
+ FX_DWORD dwFieldFlags = pField->GetFieldFlags();
+ FX_BOOL bMultiLine = (dwFieldFlags >> 12) & 1;
+
+ if (bMultiLine)
+ {
+ pEdit->SetMultiLine(TRUE);
+ pEdit->SetAutoReturn(TRUE);
+ }
+ else
+ {
+ pEdit->SetAlignmentV(1);
+ }
+
+ FX_WORD subWord = 0;
+ if ((dwFieldFlags >> 13) & 1)
+ {
+ subWord = '*';
+ pEdit->SetPasswordChar(subWord);
+ }
+
+ int nMaxLen = pField->GetMaxLen();
+ FX_BOOL bCharArray = (dwFieldFlags >> 24) & 1;
+ FX_FLOAT fFontSize = GetFontSize();
+
+ if (nMaxLen > 0)
+ {
+ if (bCharArray)
+ {
+ pEdit->SetCharArray(nMaxLen);
+
+ if (IsFloatZero(fFontSize))
+ {
+ fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(FontMap.GetPDFFont(0),rcClient,nMaxLen);
+ }
+ }
+ else
+ {
+ if (sValue)
+ nMaxLen = wcslen((const wchar_t*)sValue);
+ pEdit->SetLimitChar(nMaxLen);
+ }
+ }
+
+ if (IsFloatZero(fFontSize))
+ pEdit->SetAutoFontSize(TRUE);
+ else
+ pEdit->SetFontSize(fFontSize);
+
+ pEdit->Initialize();
+
+ if (sValue)
+ pEdit->SetText(sValue);
+ else
+ pEdit->SetText((FX_LPCWSTR)pField->GetValue());
+
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f),
+ NULL,!bCharArray,subWord);
+
+ if (sEdit.GetLength() > 0)
+ {
+ sBody << "/Tx BMC\n" << "q\n";
+ if (rcContent.Width() > rcClient.Width() ||
+ rcContent.Height() > rcClient.Height())
+ {
+ sBody << rcClient.left << " " << rcClient.bottom << " "
+ << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
+ }
+ CPWL_Color crText = GetTextPWLColor();
+ sBody << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n" << "Q\nEMC\n";
+ }
+
+ if (bCharArray)
+ {
+ switch (GetBorderStyle())
+ {
+ case BBS_SOLID:
+ {
+ CFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sLines << "q\n" << GetBorderWidth() << " w\n"
+ << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE) << " 2 J 0 j\n";
+
+ for (FX_INT32 i=1;i<nMaxLen;i++)
+ {
+ sLines << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << " "
+ << rcClient.bottom << " m\n"
+ << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << " "
+ << rcClient.top << " l S\n";
+ }
+
+ sLines << "Q\n";
+ }
+ }
+ break;
+ case BBS_DASH:
+ {
+ CFX_ByteString sColor = CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0);
+
+ sLines << "q\n" << GetBorderWidth() << " w\n"
+ << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(),FALSE)
+ << "[" << dsBorder.nDash << " "
+ << dsBorder.nGap << "] "
+ << dsBorder.nPhase << " d\n";
+
+ for (FX_INT32 i=1;i<nMaxLen;i++)
+ {
+ sLines << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << " "
+ << rcClient.bottom << " m\n"
+ << rcClient.left + ((rcClient.right - rcClient.left)/nMaxLen)*i << " "
+ << rcClient.top << " l S\n";
+ }
+
+ sLines << "Q\n";
+ }
+ }
+ break;
+ }
+ }
+
+ IFX_Edit::DelEdit(pEdit);
+ }
+
+ CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() + sLines.GetByteString() + sBody.GetByteString();
+ WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
+}
+
+CPDF_Rect CPDFSDK_Widget::GetClientRect() const
+{
+ CPDF_Rect rcWindow = GetRotatedRect();
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ switch (GetBorderStyle())
+ {
+ case BBS_BEVELED:
+ case BBS_INSET:
+ fBorderWidth *= 2.0f;
+ break;
+ }
+
+ return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
+}
+
+CPDF_Rect CPDFSDK_Widget::GetRotatedRect() const
+{
+ CPDF_Rect rectAnnot = GetRect();
+ FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
+ FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
+
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+ CPDF_Rect rcPDFWindow;
+ switch(abs(pControl->GetRotation() % 360))
+ {
+ case 0:
+ case 180:
+ default:
+ rcPDFWindow = CPDF_Rect(0, 0, fWidth, fHeight);
+ break;
+ case 90:
+ case 270:
+ rcPDFWindow = CPDF_Rect(0, 0, fHeight, fWidth);
+ break;
+ }
+
+ return rcPDFWindow;
+}
+
+CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const
+{
+ CPWL_Color crBackground = GetFillPWLColor();
+ if (crBackground.nColorType != COLORTYPE_TRANSPARENT)
+ return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);
+ else
+ return "";
+}
+
+CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const
+{
+ CPDF_Rect rcWindow = GetRotatedRect();
+ CPWL_Color crBorder = GetBorderPWLColor();
+ CPWL_Color crBackground = GetFillPWLColor();
+ CPWL_Color crLeftTop, crRightBottom;
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+ FX_INT32 nBorderStyle = 0;
+ CPWL_Dash dsBorder(3,0,0);
+
+ switch (GetBorderStyle())
+ {
+ case BBS_DASH:
+ nBorderStyle = PBS_DASH;
+ dsBorder = CPWL_Dash(3, 3, 0);
+ break;
+ case BBS_BEVELED:
+ nBorderStyle = PBS_BEVELED;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
+ crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
+ break;
+ case BBS_INSET:
+ nBorderStyle = PBS_INSET;
+ fBorderWidth *= 2;
+ crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
+ crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
+ break;
+ case BBS_UNDERLINE:
+ nBorderStyle = PBS_UNDERLINED;
+ break;
+ default:
+ nBorderStyle = PBS_SOLID;
+ break;
+ }
+
+ return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder, crLeftTop,
+ crRightBottom, nBorderStyle, dsBorder);
+}
+
+CPDF_Matrix CPDFSDK_Widget::GetMatrix() const
+{
+ CPDF_Matrix mt;
+ CPDF_FormControl* pControl = GetFormControl();
+ ASSERT(pControl != NULL);
+
+ CPDF_Rect rcAnnot = GetRect();
+ FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;
+ FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;
+
+
+
+ switch (abs(pControl->GetRotation() % 360))
+ {
+ case 0:
+ default:
+ mt = CPDF_Matrix(1, 0, 0, 1, 0, 0);
+ break;
+ case 90:
+ mt = CPDF_Matrix(0, 1, -1, 0, fWidth, 0);
+ break;
+ case 180:
+ mt = CPDF_Matrix(-1, 0, 0, -1, fWidth, fHeight);
+ break;
+ case 270:
+ mt = CPDF_Matrix(0, -1, 1, 0, 0, fHeight);
+ break;
+ }
+
+ return mt;
+}
+
+CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const
+{
+ CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);
+
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
+ if (da.HasColor())
+ {
+ FX_INT32 iColorType;
+ FX_FLOAT fc[4];
+ da.GetColor(iColorType, fc);
+ crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+ }
+
+ return crText;
+}
+
+CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const
+{
+ CPWL_Color crBorder;
+
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ FX_INT32 iColorType;
+ FX_FLOAT fc[4];
+ pFormCtrl->GetOriginalBorderColor(iColorType, fc);
+ if (iColorType > 0)
+ crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ return crBorder;
+}
+
+CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const
+{
+ CPWL_Color crFill;
+
+ CPDF_FormControl* pFormCtrl = GetFormControl();
+ ASSERT(pFormCtrl != NULL);
+
+ FX_INT32 iColorType;
+ FX_FLOAT fc[4];
+ pFormCtrl->GetOriginalBackgroundColor(iColorType, fc);
+ if (iColorType > 0)
+ crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
+
+ return crFill;
+}
+
+void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType, CPDF_Stream* pImage)
+{
+ ASSERT(pImage != NULL);
+
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ CPDF_Document* pDoc = m_pPageView->GetPDFDocument();//pDocument->GetDocument();
+ ASSERT(pDoc != NULL);
+
+ CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP");
+ ASSERT(pAPDict != NULL);
+
+ CPDF_Stream* pStream = pAPDict->GetStream(sAPType);
+ ASSERT(pStream != NULL);
+
+ CPDF_Dictionary* pStreamDict = pStream->GetDict();
+ ASSERT(pStreamDict != NULL);
+
+ CFX_ByteString sImageAlias = "IMG";
+
+ if (CPDF_Dictionary* pImageDict = pImage->GetDict())
+ {
+ sImageAlias = pImageDict->GetString("Name");
+ if (sImageAlias.IsEmpty())
+ sImageAlias = "IMG";
+ }
+
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources");
+ if (!pStreamResList)
+ {
+ pStreamResList = FX_NEW CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pStreamResList);
+ }
+
+ if (pStreamResList)
+ {
+ CPDF_Dictionary* pXObject = FX_NEW CPDF_Dictionary;
+ pXObject->SetAtReference(sImageAlias, pDoc, pImage);
+ pStreamResList->SetAt("XObject", pXObject);
+ }
+}
+
+void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType)
+{
+ ASSERT(m_pAnnot != NULL);
+ ASSERT(m_pAnnot->m_pAnnotDict != NULL);
+
+ if (CPDF_Dictionary* pAPDict = m_pAnnot->m_pAnnotDict->GetDict("AP"))
+ {
+ pAPDict->RemoveAt(sAPType);
+ }
+}
+
+FX_BOOL CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type, PDFSDK_FieldAction& data, CPDFSDK_PageView* pPageView)
+{
+ CPDF_Action action = GetAAction(type);
+
+ if (action && action.GetType() != CPDF_Action::Unknown)
+ {
+ CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDFDoc_Environment* pEnv = pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();/*(CPDFSDK_ActionHandler*)pApp->GetActionHandler();*/
+ ASSERT(pActionHandler != NULL);
+
+ return pActionHandler->DoAction_Field(action, type, pDocument, GetFormField(), data);
+ }
+
+ return FALSE;
+}
+
+CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT)
+{
+ switch (eAAT)
+ {
+ case CPDF_AAction::CursorEnter:
+ case CPDF_AAction::CursorExit:
+ case CPDF_AAction::ButtonDown:
+ case CPDF_AAction::ButtonUp:
+ case CPDF_AAction::GetFocus:
+ case CPDF_AAction::LoseFocus:
+ case CPDF_AAction::PageOpen:
+ case CPDF_AAction::PageClose:
+ case CPDF_AAction::PageVisible:
+ case CPDF_AAction::PageInvisible:
+ return CPDFSDK_Annot::GetAAction(eAAT);
+ case CPDF_AAction::KeyStroke:
+ case CPDF_AAction::Format:
+ case CPDF_AAction::Validate:
+ case CPDF_AAction::Calculate:
+ {
+ CPDF_FormField* pField = this->GetFormField();
+ ASSERT(pField != NULL);
+
+ if (CPDF_AAction aa = pField->GetAdditionalAction())
+ return aa.GetAction(eAAT);
+ else
+ return CPDFSDK_Annot::GetAAction(eAAT);
+ }
+ default:
+ return NULL;
+ }
+
+ return NULL;
+}
+
+
+CFX_WideString CPDFSDK_Widget::GetAlternateName() const
+{
+ CPDF_FormField* pFormField = GetFormField();
+ ASSERT(pFormField != NULL);
+
+ return pFormField->GetAlternateName();
+}
+
+FX_INT32 CPDFSDK_Widget::GetAppearanceAge() const
+{
+ return m_nAppAge;
+}
+
+FX_INT32 CPDFSDK_Widget::GetValueAge() const
+{
+ return m_nValueAge;
+}
+
+
+FX_BOOL CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+ CPDF_Annot* pAnnot = GetPDFAnnot();
+ CFX_FloatRect annotRect;
+ pAnnot->GetRect(annotRect);
+ if(annotRect.Contains(pageX, pageY))
+ {
+ if (!IsVisible()) return FALSE;
+
+ int nFieldFlags = GetFieldFlags();
+ if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
+ return FALSE;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument)
+ :m_pDocument(pDocument),
+ m_pInterForm(NULL),
+ m_bCalculate(TRUE),
+ m_bBusy(FALSE)
+{
+ ASSERT(m_pDocument != NULL);
+ m_pInterForm = new CPDF_InterForm(m_pDocument->GetDocument(), FALSE);
+ ASSERT(m_pInterForm != NULL);
+ m_pInterForm->SetFormNotify(this);
+
+ for(int i=0; i<6; i++)
+ m_bNeedHightlight[i] = FALSE;
+ m_iHighlightAlpha = 0;
+}
+
+CPDFSDK_InterForm::~CPDFSDK_InterForm()
+{
+ ASSERT(m_pInterForm != NULL);
+ delete m_pInterForm;
+ m_pInterForm = NULL;
+
+ m_Map.RemoveAll();
+}
+
+void CPDFSDK_InterForm::Destroy()
+{
+ delete this;
+}
+
+CPDF_InterForm* CPDFSDK_InterForm::GetInterForm()
+{
+ return m_pInterForm;
+}
+
+CPDFSDK_Document* CPDFSDK_InterForm::GetDocument()
+{
+ return m_pDocument;
+}
+
+FX_BOOL CPDFSDK_InterForm::HighlightWidgets()
+{
+ return FALSE;
+}
+
+CPDFSDK_Widget* CPDFSDK_InterForm::GetSibling(CPDFSDK_Widget* pWidget, FX_BOOL bNext) const
+{
+ ASSERT(pWidget != NULL);
+
+ CBA_AnnotIterator* pIterator = new CBA_AnnotIterator(pWidget->GetPageView(), "Widget", "");
+ ASSERT(pIterator != NULL);
+
+ CPDFSDK_Widget* pRet = NULL;
+
+ if (bNext)
+ pRet = (CPDFSDK_Widget*)pIterator->GetNextAnnot(pWidget);
+ else
+ pRet = (CPDFSDK_Widget*)pIterator->GetPrevAnnot(pWidget);
+
+ pIterator->Release();
+
+ return pRet;
+
+}
+
+CPDFSDK_Widget* CPDFSDK_InterForm::GetWidget(CPDF_FormControl* pControl) const
+{
+ if(!pControl || !m_pInterForm) return NULL;
+
+ CPDFSDK_Widget* pWidget = NULL;
+ m_Map.Lookup(pControl, pWidget);
+
+ if (pWidget) return pWidget;
+
+ CPDF_Dictionary* pControlDict = pControl->GetWidget();
+ ASSERT(pControlDict != NULL);
+
+ ASSERT(m_pDocument != NULL);
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+
+ CPDFSDK_PageView* pPage = NULL;
+
+ if (CPDF_Dictionary* pPageDict = pControlDict->GetDict("P"))
+ {
+ int nPageIndex = pDocument->GetPageIndex(pPageDict->GetObjNum());
+ if (nPageIndex >= 0)
+ {
+ pPage = m_pDocument->GetPageView(nPageIndex);
+ }
+ }
+
+ if (!pPage)
+ {
+ int nPageIndex = GetPageIndexByAnnotDict(pDocument, pControlDict);
+ if (nPageIndex >= 0)
+ {
+ pPage = m_pDocument->GetPageView(nPageIndex);
+ }
+ }
+
+ if (pPage)
+ return (CPDFSDK_Widget*)pPage->GetAnnotByDict(pControlDict);
+
+ return NULL;
+}
+
+void CPDFSDK_InterForm::GetWidgets(const CFX_WideString& sFieldName, CFX_PtrArray& widgets)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ for (int i=0,sz=m_pInterForm->CountFields(sFieldName); i<sz; i++)
+ {
+ CPDF_FormField* pFormField = m_pInterForm->GetField(i, sFieldName);
+ ASSERT(pFormField != NULL);
+
+ GetWidgets(pFormField, widgets);
+ }
+}
+
+void CPDFSDK_InterForm::GetWidgets(CPDF_FormField* pField, CFX_PtrArray& widgets)
+{
+ ASSERT(pField != NULL);
+
+ for (int i=0,isz=pField->CountControls(); i<isz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl);
+
+ if (pWidget)
+ widgets.Add(pWidget);
+ }
+}
+
+int CPDFSDK_InterForm::GetPageIndexByAnnotDict(CPDF_Document* pDocument, CPDF_Dictionary* pAnnotDict) const
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pAnnotDict != NULL);
+
+ for (int i=0,sz=pDocument->GetPageCount(); i<sz; i++)
+ {
+ if (CPDF_Dictionary* pPageDict = pDocument->GetPage(i))
+ {
+ if (CPDF_Array* pAnnots = pPageDict->GetArray("Annots"))
+ {
+ for (int j=0,jsz=pAnnots->GetCount(); j<jsz; j++)
+ {
+ CPDF_Object* pDict = pAnnots->GetElementValue(j);
+ if (pAnnotDict == pDict)
+ {
+ return i;
+ }
+ }
+ }
+ }
+ }
+
+ return -1;
+}
+
+void CPDFSDK_InterForm::AddMap(CPDF_FormControl* pControl, CPDFSDK_Widget* pWidget)
+{
+ m_Map.SetAt(pControl, pWidget);
+}
+
+void CPDFSDK_InterForm::RemoveMap(CPDF_FormControl* pControl)
+{
+ m_Map.RemoveKey(pControl);
+}
+
+void CPDFSDK_InterForm::EnableCalculate(FX_BOOL bEnabled)
+{
+ m_bCalculate = bEnabled;
+}
+
+FX_BOOL CPDFSDK_InterForm::IsCalculateEnabled() const
+{
+ return m_bCalculate;
+}
+
+#ifdef _WIN32
+CPDF_Stream* CPDFSDK_InterForm::LoadImageFromFile(const CFX_WideString& sFile)
+{
+ ASSERT(m_pDocument != NULL);
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ ASSERT(pDocument != NULL);
+
+ CPDF_Stream* pRetStream = NULL;
+
+ if (CFX_DIBitmap* pBmp = CFX_WindowsDIB::LoadFromFile(sFile))
+ {
+ int nWidth = pBmp->GetWidth();
+ int nHeight = pBmp->GetHeight();
+
+ CPDF_Image Image(pDocument);
+ Image.SetImage(pBmp, FALSE);
+ CPDF_Stream* pImageStream = Image.GetStream();
+ if (pImageStream)
+ {
+ if (pImageStream->GetObjNum() == 0)
+ pDocument->AddIndirectObject(pImageStream);
+
+ CPDF_Dictionary* pStreamDict = new CPDF_Dictionary();
+ pStreamDict->SetAtName("Subtype", "Form");
+ pStreamDict->SetAtName("Name", "IMG");
+ CPDF_Array* pMatrix = new CPDF_Array();
+ pStreamDict->SetAt("Matrix", pMatrix);
+ pMatrix->AddInteger(1);
+ pMatrix->AddInteger(0);
+ pMatrix->AddInteger(0);
+ pMatrix->AddInteger(1);
+ pMatrix->AddInteger(-nWidth / 2);
+ pMatrix->AddInteger(-nHeight / 2);
+ CPDF_Dictionary* pResource = new CPDF_Dictionary();
+ pStreamDict->SetAt("Resources", pResource);
+ CPDF_Dictionary* pXObject = new CPDF_Dictionary();
+ pResource->SetAt("XObject", pXObject);
+ pXObject->SetAtReference("Img", pDocument, pImageStream);
+ CPDF_Array* pProcSet = new CPDF_Array();
+ pResource->SetAt("ProcSet", pProcSet);
+ pProcSet->AddName("PDF");
+ pProcSet->AddName("ImageC");
+ pStreamDict->SetAtName("Type", "XObject");
+ CPDF_Array* pBBox = new CPDF_Array();
+ pStreamDict->SetAt("BBox", pBBox);
+ pBBox->AddInteger(0);
+ pBBox->AddInteger(0);
+ pBBox->AddInteger(nWidth);
+ pBBox->AddInteger(nHeight);
+ pStreamDict->SetAtInteger("FormType", 1);
+
+ pRetStream = new CPDF_Stream(NULL, 0, NULL);
+ CFX_ByteString csStream;
+ csStream.Format("q\n%d 0 0 %d 0 0 cm\n/Img Do\nQ", nWidth, nHeight);
+ pRetStream->InitStream((FX_BYTE*)(FX_LPCSTR)csStream, csStream.GetLength(), pStreamDict);
+ pDocument->AddIndirectObject(pRetStream);
+ }
+
+ delete pBmp;
+ }
+
+ return pRetStream;
+}
+#endif
+
+void CPDFSDK_InterForm::OnCalculate(CPDF_FormField* pFormField)
+{
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ if(!pEnv->IsJSInitiated())
+ return;
+
+ if (m_bBusy) return;
+
+ m_bBusy = TRUE;
+
+ if (this->IsCalculateEnabled())
+ {
+ IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(m_pDocument);
+
+ int nSize = m_pInterForm->CountFieldsInCalculationOrder();
+ for (int i=0; i<nSize; i++)
+ {
+ if(CPDF_FormField* pField = m_pInterForm->GetFieldInCalculationOrder(i))
+ {
+// ASSERT(pField != NULL);
+ int nType = pField->GetFieldType();
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ CPDF_AAction aAction = pField->GetAdditionalAction();
+ if (aAction && aAction.ActionExist(CPDF_AAction::Calculate))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Calculate);
+ if (action)
+ {
+ CFX_WideString csJS = action.GetJavaScript();
+ if (!csJS.IsEmpty())
+ {
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ CFX_WideString sOldValue = pField->GetValue();
+ CFX_WideString sValue = sOldValue;
+ FX_BOOL bRC = TRUE;
+ pContext->OnField_Calculate(pFormField, pField, sValue, bRC);
+
+ CFX_WideString sInfo;
+ FX_BOOL bRet = pContext->RunScript(csJS, sInfo);
+ pRuntime->ReleaseContext(pContext);
+
+ if (bRet)
+ {
+ if (bRC)
+ {
+ if (sValue.Compare(sOldValue) != 0)
+ pField->SetValue(sValue, TRUE);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ }
+
+ m_bBusy = FALSE;
+}
+
+CFX_WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField, int nCommitKey, FX_BOOL& bFormated)
+{
+ ASSERT(m_pDocument != NULL);
+ ASSERT(pFormField != NULL);
+
+ CFX_WideString sValue = pFormField->GetValue();
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ if(!pEnv->IsJSInitiated())
+ {
+ bFormated = FALSE;
+ return sValue;
+ }
+
+ IFXJS_Runtime* pRuntime = m_pDocument->GetJsRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->SetReaderDocument(m_pDocument);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)
+ {
+ if (pFormField->CountSelectedItems() > 0)
+ {
+ int index = pFormField->GetSelectedIndex(0);
+ if (index >= 0)
+ sValue = pFormField->GetOptionLabel(index);
+ }
+ }
+
+ bFormated = FALSE;
+
+ CPDF_AAction aAction = pFormField->GetAdditionalAction();
+ if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Format))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
+ if (action)
+ {
+ CFX_WideString script = action.GetJavaScript();
+ if (!script.IsEmpty())
+ {
+ CFX_WideString Value = sValue;
+
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+
+ pContext->OnField_Format(nCommitKey, pFormField, Value, TRUE);
+
+ CFX_WideString sInfo;
+ FX_BOOL bRet = pContext->RunScript(script, sInfo);
+ pRuntime->ReleaseContext(pContext);
+
+ if (bRet)
+ {
+ sValue = Value;
+ bFormated = TRUE;
+ }
+ }
+ }
+ }
+
+ return sValue;
+}
+
+void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField, FX_LPCWSTR sValue, FX_BOOL bValueChanged)
+{
+ ASSERT(pFormField != NULL);
+
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ ASSERT(m_pInterForm != NULL);
+ if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+ pWidget->ResetAppearance(sValue, bValueChanged);
+ }
+}
+
+void CPDFSDK_InterForm::UpdateField(CPDF_FormField* pFormField)
+{
+ ASSERT(pFormField != NULL);
+
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
+ ASSERT(pFormCtrl != NULL);
+
+ if(CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
+ {
+ CPDFDoc_Environment * pEnv = m_pDocument->GetEnv();
+ CFFL_IFormFiller* pIFormFiller = pEnv->GetIFormFiller();
+
+ CPDF_Page * pPage = pWidget->GetPDFPage();
+ CPDFSDK_PageView * pPageView = m_pDocument->GetPageView(pPage,FALSE);
+
+ FX_RECT rcBBox = pIFormFiller->GetViewBBox(pPageView, pWidget);
+
+ pEnv->FFI_Invalidate(pPage,rcBBox.left, rcBBox.top, rcBBox.right, rcBBox.bottom);
+ }
+ }
+}
+
+void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
+{
+ ASSERT(pFormField != NULL);
+
+ CPDF_AAction aAction = pFormField->GetAdditionalAction();
+ if (aAction != NULL && aAction.ActionExist(CPDF_AAction::KeyStroke))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
+ if (action)
+ {
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+ fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+ fa.sValue = csValue;
+
+ pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
+ m_pDocument, pFormField, fa);
+ bRC = fa.bRC;
+ }
+ }
+}
+
+void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField, CFX_WideString& csValue, FX_BOOL& bRC)
+{
+ ASSERT(pFormField != NULL);
+
+ CPDF_AAction aAction = pFormField->GetAdditionalAction();
+ if (aAction != NULL && aAction.ActionExist(CPDF_AAction::Validate))
+ {
+ CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
+ if (action)
+ {
+ ASSERT(m_pDocument != NULL);
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+ ASSERT(pActionHandler != NULL);
+
+ PDFSDK_FieldAction fa;
+ fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+ fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+ fa.sValue = csValue;
+
+ pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate, m_pDocument, pFormField, fa);
+ bRC = fa.bRC;
+
+ }
+ }
+}
+
+/* ----------------------------- action ----------------------------- */
+
+FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CPDF_ActionFields af = action.GetWidgets();
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray widgetArray;
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ FX_BOOL bHide = action.GetHideStatus();
+
+ FX_BOOL bChanged = FALSE;
+
+ for (int i=0, sz=fields.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pField = (CPDF_FormField*)fields[i];
+ ASSERT(pField != NULL);
+
+
+ for (int j=0,jsz=pField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pControl = pField->GetControl(j);
+ ASSERT(pControl != NULL);
+
+ if (CPDFSDK_Widget* pWidget = GetWidget(pControl))
+ {
+ int nFlags = pWidget->GetFlags();
+ if (bHide)
+ {
+ nFlags &= (~ANNOTFLAG_INVISIBLE);
+ nFlags &= (~ANNOTFLAG_NOVIEW);
+ nFlags |= (ANNOTFLAG_HIDDEN);
+ }
+ else
+ {
+ nFlags &= (~ANNOTFLAG_INVISIBLE);
+ nFlags &= (~ANNOTFLAG_HIDDEN);
+ nFlags &= (~ANNOTFLAG_NOVIEW);
+ }
+ pWidget->SetFlags(nFlags);
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ ASSERT(pPageView != NULL);
+
+ pPageView->UpdateView(pWidget);
+
+ bChanged = TRUE;
+ }
+ }
+ }
+
+ return bChanged;
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_SubmitForm(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFX_WideString sDestination = action.GetFilePath();
+ if (sDestination.IsEmpty()) return FALSE;
+
+ CPDF_Dictionary* pActionDict = action;
+ if (pActionDict->KeyExist("Fields"))
+ {
+ CPDF_ActionFields af = action.GetWidgets();
+ FX_DWORD dwFlags = action.GetFlags();
+
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ if (fields.GetSize() != 0)
+ {
+ FX_BOOL bIncludeOrExclude = !(dwFlags & 0x01);
+ if (m_pInterForm->CheckRequiredFields(&fields, bIncludeOrExclude))
+ {
+ return FALSE;
+ }
+ return SubmitFields(sDestination, fields, bIncludeOrExclude, FALSE);
+ }
+ else
+ {
+ if ( m_pInterForm->CheckRequiredFields())
+ {
+ return FALSE;
+ }
+
+ return SubmitForm(sDestination, FALSE);
+ }
+ }
+ else
+ {
+ if ( m_pInterForm->CheckRequiredFields())
+ {
+ return FALSE;
+ }
+
+ return SubmitForm(sDestination, FALSE);
+ }
+}
+
+FX_BOOL CPDFSDK_InterForm::SubmitFields(const CFX_WideString& csDestination, const CFX_PtrArray& fields,
+ FX_BOOL bIncludeOrExclude, FX_BOOL bUrlEncoded)
+{
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ CFX_ByteTextBuf textBuf;
+ ExportFieldsToFDFTextBuf(fields, bIncludeOrExclude, textBuf);
+
+ FX_LPBYTE pBuffer = textBuf.GetBuffer();
+ FX_STRSIZE nBufSize = textBuf.GetLength();
+
+ if (bUrlEncoded)
+ {
+ if(!FDFToURLEncodedData(pBuffer, nBufSize))
+ return FALSE;
+ }
+
+ pEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)csDestination);
+
+ if (bUrlEncoded && pBuffer)
+ {
+ FX_Free(pBuffer);
+ pBuffer = NULL;
+ }
+
+ return TRUE;
+}
+
+void CPDFSDK_InterForm::DoFDFBuffer(CFX_ByteString sBuffer)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (CFDF_Document *pFDFDocument = CFDF_Document::ParseMemory((const unsigned char *)sBuffer.GetBuffer(sBuffer.GetLength()), sBuffer.GetLength()))
+ {
+ CPDF_Dictionary* pRootDic = pFDFDocument->GetRoot();
+ if(pRootDic)
+ {
+ CPDF_Dictionary * pFDFDict=pRootDic->GetDict("FDF");
+ if(pFDFDict)
+ {
+ CPDF_Dictionary * pJSDict = pFDFDict->GetDict("JavaScript");
+ if(pJSDict)
+ {
+ CFX_WideString csJS;
+
+ CPDF_Object* pJS = pJSDict->GetElementValue("Before");
+ if (pJS != NULL)
+ {
+ int iType = pJS->GetType();
+ if (iType == PDFOBJ_STRING)
+ csJS = pJSDict->GetUnicodeText("Before");
+ else if (iType == PDFOBJ_STREAM)
+ csJS = pJS->GetUnicodeText();
+ }
+
+ }
+ }
+ }
+ delete pFDFDocument;
+ }
+
+ sBuffer.ReleaseBuffer();
+}
+
+FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(CFX_WideString csFDFFile, CFX_WideString csTxtFile)
+{
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::FDFToURLEncodedData(FX_LPBYTE& pBuf, FX_STRSIZE& nBufSize)
+{
+ CFDF_Document* pFDF = CFDF_Document::ParseMemory(pBuf, nBufSize);
+ if (pFDF)
+ {
+ CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDict("FDF");
+ if (pMainDict == NULL) return FALSE;
+
+ // Get fields
+ CPDF_Array* pFields = pMainDict->GetArray("Fields");
+ if (pFields == NULL) return FALSE;
+
+ CFX_ByteTextBuf fdfEncodedData;
+
+ for (FX_DWORD i = 0; i < pFields->GetCount(); i ++)
+ {
+ CPDF_Dictionary* pField = pFields->GetDict(i);
+ if (pField == NULL) continue;
+ CFX_WideString name;
+ name = pField->GetUnicodeText("T");
+ CFX_ByteString name_b = CFX_ByteString::FromUnicode(name);
+ CFX_ByteString csBValue = pField->GetString("V");
+ CFX_WideString csWValue = PDF_DecodeText(csBValue);
+ CFX_ByteString csValue_b = CFX_ByteString::FromUnicode(csWValue);
+
+ fdfEncodedData = fdfEncodedData<<name_b.GetBuffer(name_b.GetLength());
+ name_b.ReleaseBuffer();
+ fdfEncodedData = fdfEncodedData<<"=";
+ fdfEncodedData = fdfEncodedData<<csValue_b.GetBuffer(csValue_b.GetLength());
+ csValue_b.ReleaseBuffer();
+ if(i != pFields->GetCount()-1)
+ fdfEncodedData = fdfEncodedData<<"&";
+ }
+
+ nBufSize = fdfEncodedData.GetLength();
+ pBuf = FX_Alloc(FX_BYTE, nBufSize);
+ if(!pBuf)
+ return FALSE;
+ FXSYS_memcpy(pBuf, fdfEncodedData.GetBuffer(), nBufSize);
+
+ }
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFFile(const CFX_WideString& sFDFFileName,
+ const CFX_PtrArray& fields, FX_BOOL bIncludeOrExclude)
+{
+ if (sFDFFileName.IsEmpty()) return FALSE;
+ ASSERT(m_pDocument != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
+ if (!pFDF) return FALSE;
+ FX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode()); // = FALSE;//
+ delete pFDF;
+
+ return bRet;
+}
+FX_BOOL CPDFSDK_InterForm::ExportFieldsToFDFTextBuf(const CFX_PtrArray& fields,FX_BOOL bIncludeOrExclude, CFX_ByteTextBuf& textBuf)
+{
+ ASSERT(m_pDocument != NULL);
+ ASSERT(m_pInterForm != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath(),(CFX_PtrArray&)fields, bIncludeOrExclude);
+ if (!pFDF) return FALSE;
+ FX_BOOL bRet = pFDF->WriteBuf(textBuf); // = FALSE;//
+ delete pFDF;
+
+ return bRet;
+}
+
+CFX_WideString CPDFSDK_InterForm::GetTemporaryFileName(const CFX_WideString& sFileExt)
+{
+ CFX_WideString sFileName;
+ return L"";
+}
+
+FX_BOOL CPDFSDK_InterForm::SubmitForm(const CFX_WideString& sDestination, FX_BOOL bUrlEncoded)
+{
+ if (sDestination.IsEmpty()) return FALSE;
+
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv != NULL);
+
+ if(NULL == m_pDocument) return FALSE;
+ CFX_WideString wsPDFFilePath = m_pDocument->GetPath();
+
+ if(NULL == m_pInterForm) return FALSE;
+ CFDF_Document* pFDFDoc = m_pInterForm->ExportToFDF(wsPDFFilePath);
+ if (NULL == pFDFDoc) return FALSE;
+
+ CFX_ByteTextBuf FdfBuffer;
+ FX_BOOL bRet = pFDFDoc->WriteBuf(FdfBuffer);
+ delete pFDFDoc;
+ if (!bRet) return FALSE;
+
+ FX_LPBYTE pBuffer = FdfBuffer.GetBuffer();
+ FX_STRSIZE nBufSize = FdfBuffer.GetLength();
+
+ if (bUrlEncoded)
+ {
+ if(!FDFToURLEncodedData(pBuffer, nBufSize))
+ return FALSE;
+ }
+
+ pEnv->JS_docSubmitForm(pBuffer, nBufSize, (FX_LPCWSTR)sDestination);
+
+ if (bUrlEncoded && pBuffer)
+ {
+ FX_Free(pBuffer);
+ pBuffer = NULL;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFormToFDFFile(const CFX_WideString& sFDFFileName)
+{
+ if (sFDFFileName.IsEmpty()) return FALSE;
+
+ ASSERT(m_pInterForm != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());
+ if (!pFDF) return FALSE;
+
+ FX_BOOL bRet = pFDF->WriteFile(sFDFFileName.UTF8Encode());
+ delete pFDF;
+
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFormToFDFTextBuf(CFX_ByteTextBuf& textBuf)
+{
+
+ ASSERT(m_pInterForm != NULL);
+ ASSERT(m_pDocument != NULL);
+
+ CFDF_Document* pFDF = m_pInterForm->ExportToFDF(m_pDocument->GetPath());
+ if (!pFDF) return FALSE;
+
+ FX_BOOL bRet = pFDF->WriteBuf(textBuf);
+ delete pFDF;
+
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_InterForm::ExportFormToTxtFile(const CFX_WideString& sTxtFileName)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ CFX_WideString sFieldNames;
+ CFX_WideString sFieldValues;
+
+ int nSize = m_pInterForm->CountFields();
+
+ if (nSize > 0)
+ {
+ for (int i=0; i<nSize; i++)
+ {
+ CPDF_FormField* pField = m_pInterForm->GetField(i);
+ ASSERT(pField != NULL);
+
+ if (i != 0)
+ {
+ sFieldNames += L"\t";
+ sFieldValues += L"\t";
+ }
+ sFieldNames += pField->GetFullName();
+ sFieldValues += pField->GetValue();
+ }
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ImportFormFromTxtFile(const CFX_WideString& sTxtFileName)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_ResetForm(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CPDF_Dictionary* pActionDict = action;
+
+ if (pActionDict->KeyExist("Fields"))
+ {
+ CPDF_ActionFields af = action.GetWidgets();
+ FX_DWORD dwFlags = action.GetFlags();
+
+ CFX_PtrArray fieldObjects;
+ af.GetAllFields(fieldObjects);
+ CFX_PtrArray fields;
+ GetFieldFromObjects(fieldObjects, fields);
+
+ ASSERT(m_pInterForm != NULL);
+
+ return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), TRUE);
+ }
+ else
+ {
+ ASSERT(m_pInterForm != NULL);
+ return m_pInterForm->ResetForm(TRUE);
+ }
+}
+
+FX_BOOL CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action)
+{
+ ASSERT(action != NULL);
+
+ CFX_WideString sFilePath = action.GetFilePath();
+ if (sFilePath.IsEmpty())
+ return FALSE;
+
+ if (!ImportFormFromFDFFile(sFilePath, TRUE))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPDFSDK_InterForm::ImportFormFromFDFFile(const CFX_WideString& csFDFFileName,
+ FX_BOOL bNotify)
+{
+ return FALSE;
+}
+
+void CPDFSDK_InterForm::GetFieldFromObjects(const CFX_PtrArray& objects, CFX_PtrArray& fields)
+{
+ ASSERT(m_pInterForm != NULL);
+
+ int iCount = objects.GetSize();
+ for (int i = 0; i < iCount; i ++)
+ {
+ CPDF_Object* pObject = (CPDF_Object*)objects[i];
+ if (pObject == NULL) continue;
+
+ int iType = pObject->GetType();
+ if (iType == PDFOBJ_STRING)
+ {
+ CFX_WideString csName = pObject->GetUnicodeText();
+ CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
+ if (pField != NULL)
+ fields.Add(pField);
+ }
+ else if (iType == PDFOBJ_DICTIONARY)
+ {
+ if (m_pInterForm->IsValidFormField(pObject))
+ fields.Add(pObject);
+ }
+ }
+}
+
+/* ----------------------------- CPDF_FormNotify ----------------------------- */
+
+int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+
+ int nType = pFormField->GetFieldType();
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ FX_BOOL bRC = TRUE;
+ OnKeyStrokeCommit(pFormField, csValue, bRC);
+ if (bRC)
+ {
+ OnValidate(pFormField, csValue, bRC);
+ if (bRC)
+ return 1;
+ else
+ return -1;
+ }
+ else
+ return -1;
+ }
+ else
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD)
+ {
+ this->OnCalculate(pFormField);
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = this->OnFormat(pFormField, 0, bFormated);
+ if (bFormated)
+ this->ResetFieldAppearance(pFormField, sValue, TRUE);
+ else
+ this->ResetFieldAppearance(pFormField, NULL, TRUE);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField, CFX_WideString& csValue)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+
+ int nType = pFormField->GetFieldType();
+ if (nType == FIELDTYPE_LISTBOX)
+ {
+ FX_BOOL bRC = TRUE;
+ OnKeyStrokeCommit(pFormField, csValue, bRC);
+ if (bRC)
+ {
+ OnValidate(pFormField, csValue, bRC);
+ if (bRC)
+ return 1;
+ else
+ return -1;
+ }
+ else
+ return -1;
+ }
+ else
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_LISTBOX)
+ {
+ this->OnCalculate(pFormField);
+ this->ResetFieldAppearance(pFormField, NULL, TRUE);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterCheckedStatusChange(const CPDF_FormField* pField, const CFX_ByteArray& statusArray)
+{
+ ASSERT(pField != NULL);
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)pField;
+ int nType = pFormField->GetFieldType();
+
+ if (nType == FIELDTYPE_CHECKBOX || nType == FIELDTYPE_RADIOBUTTON)
+ {
+ this->OnCalculate(pFormField);
+ //this->ResetFieldAppearance(pFormField, NULL);
+ this->UpdateField(pFormField);
+ }
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm)
+{
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm)
+{
+ this->OnCalculate(NULL);
+
+ return 0;
+}
+
+int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm)
+{
+ return 0;
+}
+
+int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm)
+{
+ this->OnCalculate(NULL);
+
+ return 0;
+}
+
+FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType)
+{
+ if(nFieldType <1 || nFieldType > 6)
+ return FALSE;
+ return m_bNeedHightlight[nFieldType-1];
+}
+
+void CPDFSDK_InterForm::RemoveAllHighLight()
+{
+ memset((void*)m_bNeedHightlight, 0, 6*sizeof(FX_BOOL));
+}
+void CPDFSDK_InterForm::SetHighlightColor(FX_COLORREF clr, int nFieldType)
+{
+ if(nFieldType <0 || nFieldType > 6) return;
+ switch(nFieldType)
+ {
+ case 0:
+ {
+ for(int i=0; i<6; i++)
+ {
+ m_aHighlightColor[i] = clr;
+ m_bNeedHightlight[i] = TRUE;
+ }
+ break;
+ }
+ default:
+ {
+ m_aHighlightColor[nFieldType-1] = clr;
+ m_bNeedHightlight[nFieldType-1] = TRUE;
+ break;
+ }
+ }
+
+}
+
+FX_COLORREF CPDFSDK_InterForm::GetHighlightColor(int nFieldType)
+{
+ if(nFieldType <0 || nFieldType >6) return FXSYS_RGB(255,255,255);
+ if(nFieldType == 0)
+ return m_aHighlightColor[0];
+ else
+ return m_aHighlightColor[nFieldType-1];
+}
+
+/* ------------------------- CBA_AnnotIterator ------------------------- */
+
+CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, const CFX_ByteString& sType, const CFX_ByteString& sSubType)
+ :m_pPageView(pPageView),
+ m_sType(sType),
+ m_sSubType(sSubType),
+ m_nTabs(BAI_STRUCTURE)
+{
+ ASSERT(m_pPageView != NULL);
+
+ CPDF_Page* pPDFPage = m_pPageView->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+ ASSERT(pPDFPage->m_pFormDict != NULL);
+
+ CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetString("Tabs");
+
+ if (sTabs == "R")
+ {
+ m_nTabs = BAI_ROW;
+ }
+ else if (sTabs == "C")
+ {
+ m_nTabs = BAI_COLUMN;
+ }
+ else
+ {
+ m_nTabs = BAI_STRUCTURE;
+ }
+
+ GenerateResults();
+}
+
+CBA_AnnotIterator::~CBA_AnnotIterator()
+{
+ m_Annots.RemoveAll();
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot()
+{
+ if (m_Annots.GetSize() > 0)
+ return m_Annots[0];
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot()
+{
+ if (m_Annots.GetSize() > 0)
+ return m_Annots[m_Annots.GetSize() - 1];
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot)
+{
+ for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
+ {
+ if (m_Annots[i] == pAnnot)
+ {
+ if (i+1 < sz)
+ return m_Annots[i+1];
+ else
+ return m_Annots[0];
+ }
+ }
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot)
+{
+ for (int i=0,sz=m_Annots.GetSize(); i<sz; i++)
+ {
+ if (m_Annots[i] == pAnnot)
+ {
+ if (i-1 >= 0)
+ return m_Annots[i-1];
+ else
+ return m_Annots[sz-1];
+ }
+ }
+
+ return NULL;
+}
+
+int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ ASSERT(p1 != NULL);
+ ASSERT(p2 != NULL);
+
+ CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+ CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+
+ if (rcAnnot1.left < rcAnnot2.left)
+ return -1;
+ if (rcAnnot1.left > rcAnnot2.left)
+ return 1;
+ return 0;
+}
+
+
+int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
+{
+ ASSERT(p1 != NULL);
+ ASSERT(p2 != NULL);
+
+ CPDF_Rect rcAnnot1 = GetAnnotRect(p1);
+ CPDF_Rect rcAnnot2 = GetAnnotRect(p2);
+
+ if (rcAnnot1.top < rcAnnot2.top)
+ return -1;
+ if (rcAnnot1.top > rcAnnot2.top)
+ return 1;
+ return 0;
+}
+
+void CBA_AnnotIterator::GenerateResults()
+{
+ ASSERT(m_pPageView != NULL);
+
+ switch (m_nTabs)
+ {
+ case BAI_STRUCTURE:
+ {
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ m_Annots.Add(pAnnot);
+ }
+ }
+ break;
+ case BAI_ROW:
+ {
+ CPDFSDK_SortAnnots sa;
+
+ {
+
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ sa.Add(pAnnot);
+ }
+ }
+
+ if (sa.GetSize() > 0)
+ {
+ sa.Sort(CBA_AnnotIterator::CompareByLeft);
+ }
+
+ while (sa.GetSize() > 0)
+ {
+ int nLeftTopIndex = -1;
+
+ {
+ FX_FLOAT fTop = 0.0f;
+
+ for (int i=sa.GetSize()-1; i>=0; i--)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ if (rcAnnot.top > fTop)
+ {
+ nLeftTopIndex = i;
+ fTop = rcAnnot.top;
+ }
+ }
+ }
+
+ if (nLeftTopIndex >= 0)
+ {
+ CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
+ ASSERT(pLeftTopAnnot != NULL);
+
+ CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+
+ m_Annots.Add(pLeftTopAnnot);
+ sa.RemoveAt(nLeftTopIndex);
+
+ CFX_ArrayTemplate<int> aSelect;
+
+ {
+ for (int i=0,sz=sa.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f;
+
+ if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top)
+ aSelect.Add(i);
+ }
+ }
+
+ {
+ for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+ {
+ m_Annots.Add(sa[aSelect[i]]);
+ }
+ }
+
+ {
+ for (int i=aSelect.GetSize()-1; i>=0; i--)
+ {
+ sa.RemoveAt(aSelect[i]);
+ }
+ }
+
+ aSelect.RemoveAll();
+ }
+ }
+ sa.RemoveAll();
+ }
+ break;
+ case BAI_COLUMN:
+ {
+ CPDFSDK_SortAnnots sa;
+
+ {
+ for (int i=0,sz=m_pPageView->CountAnnots(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i);
+ ASSERT(pAnnot != NULL);
+
+ if (pAnnot->GetType() == m_sType
+ && pAnnot->GetSubType() == m_sSubType)
+ sa.Add(pAnnot);
+ }
+ }
+
+ if (sa.GetSize() > 0)
+ {
+ sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE);
+ }
+
+ while (sa.GetSize() > 0)
+ {
+ int nLeftTopIndex = -1;
+
+ {
+ FX_FLOAT fLeft = -1.0f;
+
+ for (int i=sa.GetSize()-1; i>=0; i--)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ if (fLeft < 0)
+ {
+ nLeftTopIndex = 0;
+ fLeft = rcAnnot.left;
+ }
+ else if (rcAnnot.left < fLeft)
+ {
+ nLeftTopIndex = i;
+ fLeft = rcAnnot.left;
+ }
+ }
+ }
+
+ if (nLeftTopIndex >= 0)
+ {
+ CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex);
+ ASSERT(pLeftTopAnnot != NULL);
+
+ CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot);
+
+ m_Annots.Add(pLeftTopAnnot);
+ sa.RemoveAt(nLeftTopIndex);
+
+ CFX_ArrayTemplate<int> aSelect;
+
+ {
+ for (int i=0,sz=sa.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Annot* pAnnot = sa.GetAt(i);
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Rect rcAnnot = GetAnnotRect(pAnnot);
+
+ FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f;
+
+ if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right)
+ aSelect.Add(i);
+ }
+ }
+
+ {
+ for (int i=0,sz=aSelect.GetSize(); i<sz; i++)
+ {
+ m_Annots.Add(sa[aSelect[i]]);
+ }
+ }
+
+ {
+ for (int i=aSelect.GetSize()-1; i>=0; i--)
+ {
+ sa.RemoveAt(aSelect[i]);
+ }
+ }
+
+ aSelect.RemoveAll();
+ }
+ }
+ sa.RemoveAll();
+ }
+ break;
+ }
+}
+
+CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot)
+{
+ ASSERT(pAnnot != NULL);
+
+ CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
+ ASSERT(pPDFAnnot != NULL);
+
+ CPDF_Rect rcAnnot;
+ pPDFAnnot->GetRect(rcAnnot);
+
+ return rcAnnot;
+}
+
diff --git a/fpdfsdk/src/fsdk_mgr.cpp b/fpdfsdk/src/fsdk_mgr.cpp
new file mode 100644
index 0000000000..9a11927fab
--- /dev/null
+++ b/fpdfsdk/src/fsdk_mgr.cpp
@@ -0,0 +1,1055 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_define.h"
+#include "../include/fsdk_mgr.h"
+#include "../include/fpdf_ext.h"
+#include "../include/formfiller/FFL_FormFiller.h"
+#include "../include/javascript/IJavaScript.h"
+
+#if _FX_OS_ == _FX_ANDROID_
+#include "time.h"
+#else
+#include <ctime>
+#endif
+
+//extern CPDFDoc_Environment* g_pFormFillApp;
+class CFX_SystemHandler:public IFX_SystemHandler
+{
+public:
+ CFX_SystemHandler(CPDFDoc_Environment* pEnv):m_pEnv(pEnv),m_nCharSet(-1) {}
+public:
+ virtual void InvalidateRect(FX_HWND hWnd, FX_RECT rect) ;
+ virtual void OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect);
+
+ virtual FX_BOOL IsSelectionImplemented();
+
+ virtual CFX_WideString GetClipboardText(FX_HWND hWnd){return L"";}
+ virtual FX_BOOL SetClipboardText(FX_HWND hWnd, CFX_WideString string) {return FALSE;}
+
+ virtual void ClientToScreen(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}
+ virtual void ScreenToClient(FX_HWND hWnd, FX_INT32& x, FX_INT32& y) {}
+
+ /*cursor style
+ FXCT_ARROW
+ FXCT_NESW
+ FXCT_NWSE
+ FXCT_VBEAM
+ FXCT_HBEAM
+ FXCT_HAND
+ */
+ virtual void SetCursor(FX_INT32 nCursorType);
+
+ virtual FX_HMENU CreatePopupMenu() {return NULL;}
+ virtual FX_BOOL AppendMenuItem(FX_HMENU hMenu, FX_INT32 nIDNewItem, CFX_WideString string) {return FALSE;}
+ virtual FX_BOOL EnableMenuItem(FX_HMENU hMenu, FX_INT32 nIDItem, FX_BOOL bEnabled) {return FALSE;}
+ virtual FX_INT32 TrackPopupMenu(FX_HMENU hMenu, FX_INT32 x, FX_INT32 y, FX_HWND hParent) {return -1;}
+ virtual void DestroyMenu(FX_HMENU hMenu) {}
+
+ virtual CFX_ByteString GetNativeTrueTypeFont(FX_INT32 nCharset);
+ virtual FX_BOOL FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName);
+ virtual CPDF_Font* AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName, FX_BYTE nCharset);
+
+ virtual FX_INT32 SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc) ;
+ virtual void KillTimer(FX_INT32 nID) ;
+
+
+ virtual FX_BOOL IsSHIFTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsSHIFTKeyDown(nFlag);}
+ virtual FX_BOOL IsCTRLKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsCTRLKeyDown(nFlag);}
+ virtual FX_BOOL IsALTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsALTKeyDown(nFlag);}
+ virtual FX_BOOL IsINSERTKeyDown(FX_DWORD nFlag) {return m_pEnv->FFI_IsINSERTKeyDown(nFlag);}
+
+ virtual FX_SYSTEMTIME GetLocalTime();
+
+ virtual FX_INT32 GetCharSet() {return m_nCharSet;}
+ virtual void SetCharSet(FX_INT32 nCharSet) {m_nCharSet = nCharSet;}
+private:
+ CPDFDoc_Environment* m_pEnv;
+ int m_nCharSet;
+};
+
+void CFX_SystemHandler::SetCursor(FX_INT32 nCursorType)
+{
+
+ m_pEnv->FFI_SetCursor(nCursorType);
+}
+
+void CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect)
+{
+ //g_pFormFillApp->FFI_Invalidate();
+ CPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd;
+ CPDF_Page* pPage = NULL;
+ CPDFSDK_PageView* pPageView = NULL;
+ pPageView = pSDKAnnot->GetPageView();
+ pPage = pSDKAnnot->GetPDFPage();
+ if(!pPage || !pPageView)
+ return;
+ CPDF_Matrix page2device;
+ pPageView->GetCurrentMatrix(page2device);
+ CPDF_Matrix device2page;
+ device2page.SetReverse(page2device);
+ FX_FLOAT left, top, right,bottom;
+ device2page.Transform((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, left, top);
+ device2page.Transform((FX_FLOAT)rect.right, (FX_FLOAT)rect.bottom, right, bottom);
+// m_pEnv->FFI_DeviceToPage(pPage, rect.left, rect.top, (double*)&left, (double*)&top);
+// m_pEnv->FFI_DeviceToPage(pPage, rect.right, rect.bottom, (double*)&right, (double*)&bottom);
+ CPDF_Rect rcPDF(left, bottom, right, top);
+ rcPDF.Normalize();
+
+ m_pEnv->FFI_Invalidate(pPage, rcPDF.left, rcPDF.top, rcPDF.right, rcPDF.bottom);
+}
+void CFX_SystemHandler::OutputSelectedRect(void* pFormFiller, CPDF_Rect& rect)
+{
+ CFFL_FormFiller* pFFL = (CFFL_FormFiller*)pFormFiller;
+ if(pFFL)
+ {
+ CPDF_Point leftbottom = CPDF_Point(rect.left, rect.bottom);
+ CPDF_Point righttop = CPDF_Point(rect.right, rect.top);
+ CPDF_Point ptA = pFFL->PWLtoFFL(leftbottom);
+ CPDF_Point ptB = pFFL->PWLtoFFL(righttop);
+
+
+ CPDFSDK_Annot* pAnnot = pFFL->GetSDKAnnot();
+ ASSERT(pAnnot);
+ CPDF_Page* pPage = pAnnot->GetPDFPage();
+ ASSERT(pPage);
+ m_pEnv->FFI_OutputSelectedRect(pPage, ptA.x, ptB.y, ptB.x, ptA.y);
+ }
+
+}
+
+FX_BOOL CFX_SystemHandler::IsSelectionImplemented()
+{
+ if(m_pEnv)
+ {
+ FPDF_FORMFILLINFO* pInfo = m_pEnv->GetFormFillInfo();
+ if(pInfo && pInfo->FFI_OutputSelectedRect)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+CFX_ByteString CFX_SystemHandler::GetNativeTrueTypeFont(FX_INT32 nCharset)
+{
+ return "";
+}
+
+FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont(FX_INT32 nCharset, CFX_ByteString sFontFaceName)
+{
+ CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
+// FXFT_Face nFace = pFontMgr->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
+// FXFT_Face nFace = pFontMgr->m_pBuiltinMapper->FindSubstFont(sFontFaceName,TRUE,0,0,0,0,NULL);
+
+ if(pFontMgr)
+ {
+ CFX_FontMapper* pFontMapper = pFontMgr->m_pBuiltinMapper;
+ if(pFontMapper)
+ {
+ int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+ if(nSize ==0)
+ {
+ pFontMapper->LoadInstalledFonts();
+ nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+ }
+
+ for(int i=0; i<nSize; i++)
+ {
+ if(pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
+ return TRUE;
+ }
+ }
+
+ }
+
+ return FALSE;
+// pFontMgr->m_FaceMap.Lookup(sFontFaceName,pFont);
+// return (pFont!=NULL);
+}
+
+static int CharSet2CP(int charset)
+{
+ if(charset == 128)
+ return 932;
+ else if(charset == 134)
+ return 936;
+ else if(charset == 129)
+ return 949;
+ else if(charset == 136)
+ return 950;
+ return 0;
+}
+CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(CPDF_Document* pDoc, CFX_ByteString sFontFaceName,
+ FX_BYTE nCharset)
+{
+ if(pDoc)
+ {
+ CFX_Font* pFXFont = new CFX_Font();
+ pFXFont->LoadSubst(sFontFaceName,TRUE,0,0,0,CharSet2CP(nCharset),FALSE);
+ CPDF_Font* pFont = pDoc->AddFont(pFXFont,nCharset,FALSE);
+ delete pFXFont;
+ return pFont;
+ }
+
+ return NULL;
+}
+
+
+FX_INT32 CFX_SystemHandler::SetTimer(FX_INT32 uElapse, TimerCallback lpTimerFunc)
+{
+ return m_pEnv->FFI_SetTimer(uElapse, lpTimerFunc);
+}
+void CFX_SystemHandler::KillTimer(FX_INT32 nID)
+{
+ m_pEnv->FFI_KillTimer(nID);
+}
+
+FX_SYSTEMTIME CFX_SystemHandler::GetLocalTime()
+{
+ return m_pEnv->FFI_GetLocalTime();
+}
+
+
+CJS_RuntimeFactory* GetJSRuntimeFactory()
+{
+ static CJS_RuntimeFactory s_JSRuntimeFactory;
+ return &s_JSRuntimeFactory;
+}
+
+CPDFDoc_Environment::CPDFDoc_Environment(CPDF_Document * pDoc):m_pInfo(NULL),m_pIFormFiller(NULL),
+ m_pAnnotHandlerMgr(NULL),m_pActionHandler(NULL),m_pJSRuntime(NULL),
+ m_pSDKDoc(NULL), m_pPDFDoc(pDoc)
+{
+
+ m_pSysHandler = NULL;
+ m_pSysHandler = new CFX_SystemHandler(this);
+
+
+ m_pJSRuntimeFactory = NULL;
+ m_pJSRuntimeFactory = GetJSRuntimeFactory();
+ m_pJSRuntimeFactory->AddRef();
+}
+
+CPDFDoc_Environment::~CPDFDoc_Environment()
+{
+
+ if ( m_pIFormFiller )
+ {
+ delete m_pIFormFiller;
+ m_pIFormFiller = NULL;
+ }
+ if(m_pJSRuntime && m_pJSRuntimeFactory)
+ m_pJSRuntimeFactory->DeleteJSRuntime(m_pJSRuntime);
+ m_pJSRuntimeFactory->Release();
+
+ if(m_pSysHandler)
+ {
+ delete m_pSysHandler;
+ m_pSysHandler = NULL;
+ }
+
+ if(m_pAnnotHandlerMgr)
+ {
+ delete m_pAnnotHandlerMgr;
+ m_pAnnotHandlerMgr = NULL;
+ }
+ if(m_pActionHandler)
+ {
+ delete m_pActionHandler;
+ m_pActionHandler = NULL;
+ }
+
+
+}
+
+
+IFXJS_Runtime* CPDFDoc_Environment::GetJSRuntime()
+{
+ if(!IsJSInitiated())
+ return NULL;
+ assert(m_pJSRuntimeFactory);
+ if(!m_pJSRuntime)
+ m_pJSRuntime = m_pJSRuntimeFactory->NewJSRuntime(this);
+ return m_pJSRuntime;
+}
+
+CPDFSDK_AnnotHandlerMgr* CPDFDoc_Environment::GetAnnotHandlerMgr()
+{
+ if(!m_pAnnotHandlerMgr)
+ m_pAnnotHandlerMgr = new CPDFSDK_AnnotHandlerMgr(this);
+ return m_pAnnotHandlerMgr;
+}
+
+CPDFSDK_ActionHandler* CPDFDoc_Environment::GetActionHander()
+{
+ if(!m_pActionHandler)
+ m_pActionHandler = new CPDFSDK_ActionHandler(this);
+ return m_pActionHandler;
+}
+
+int CPDFDoc_Environment::RegAppHandle(FPDF_FORMFILLINFO* pFFinfo)
+{
+ m_pInfo = pFFinfo;
+ return TRUE;
+}
+
+CPDFSDK_Document* CPDFDoc_Environment::GetCurrentDoc()
+{
+ return m_pSDKDoc;
+}
+
+CFFL_IFormFiller* CPDFDoc_Environment::GetIFormFiller()
+{
+ if(!m_pIFormFiller)
+ m_pIFormFiller = new CFFL_IFormFiller(this);
+ return m_pIFormFiller;
+}
+
+FX_BOOL CPDFDoc_Environment::IsJSInitiated()
+{
+ if(m_pInfo)
+ {
+ if(m_pInfo->m_pJsPlatform)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ return FALSE;
+}
+
+CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,CPDFDoc_Environment* pEnv):m_pDoc(pDoc),
+ m_pInterForm(NULL),m_pEnv(pEnv),m_pOccontent(NULL),m_bChangeMask(FALSE)
+{
+ m_pFocusAnnot = NULL;
+}
+
+CPDFSDK_Document::~CPDFSDK_Document()
+{
+ m_pageMap.RemoveAll();
+ if(m_pInterForm)
+ {
+ m_pInterForm->Destroy();
+ m_pInterForm = NULL;
+ }
+ if(m_pOccontent)
+ {
+ delete m_pOccontent;
+ m_pOccontent = NULL;
+ }
+}
+
+void CPDFSDK_Document::InitPageView()
+{
+ int nCount = m_pDoc->GetPageCount();
+ for(int i=0; i<nCount; i++)
+ {
+ // To do
+// CPDF_Dictionary* pDic = m_pDoc->GetPage(i);
+// m_pageMap.SetAt(pDic, pPageView);
+ }
+}
+
+void CPDFSDK_Document::AddPageView(CPDF_Page* pPDFPage, CPDFSDK_PageView* pPageView)
+{
+ m_pageMap.SetAt(pPDFPage, pPageView);
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(CPDF_Page* pPDFPage, FX_BOOL ReNew)
+{
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
+ if(pPageView != NULL)
+ return pPageView;
+ if(ReNew)
+ {
+ pPageView = new CPDFSDK_PageView(this,pPDFPage);
+ m_pageMap.SetAt(pPDFPage, pPageView);
+ //Delay to load all the annotations, to avoid endless loop.
+ pPageView->LoadFXAnnots();
+ }
+ return pPageView;
+
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetCurrentView()
+{
+ CPDF_Page * pPage = (CPDF_Page *)m_pEnv->FFI_GetCurrentPage(m_pDoc);
+ if(pPage)
+ return this->GetPageView(pPage, TRUE);
+ return NULL;
+}
+
+CPDFSDK_PageView* CPDFSDK_Document::GetPageView(int nIndex)
+{
+ CPDFSDK_PageView * pTempPageView = NULL;
+ CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ if(!pTempPage)
+ return NULL;
+
+ m_pageMap.Lookup(pTempPage, pTempPageView);
+
+ ASSERT(pTempPageView != NULL);
+
+ return pTempPageView;
+}
+
+void CPDFSDK_Document:: ProcJavascriptFun()
+{
+ CPDF_Document* pPDFDoc = this->GetDocument();
+ CPDF_DocJSActions docJS(pPDFDoc);
+ int iCount = docJS.CountJSActions();
+ if (iCount < 1) return;
+ for (int i = 0; i < iCount; i ++)
+ {
+ CFX_ByteString csJSName;
+ CPDF_Action jsAction = docJS.GetJSAction(i, csJSName);
+ if(m_pEnv->GetActionHander())
+ m_pEnv->GetActionHander()->DoAction_JavaScript(jsAction,CFX_WideString::FromLocal(csJSName),this);
+ }
+
+}
+
+FX_BOOL CPDFSDK_Document::ProcOpenAction()
+{
+ if(!m_pDoc) return FALSE;
+
+ CPDF_Dictionary* pRoot = m_pDoc->GetRoot();
+ if (!pRoot) return FALSE;
+ CPDF_Object* pOpenAction = pRoot->GetDict("OpenAction");//
+ if(!pOpenAction) pOpenAction = pRoot->GetArray("OpenAction");//
+ if(!pOpenAction) return FALSE;
+
+ if(pOpenAction->GetType()==PDFOBJ_ARRAY)
+ {
+ }
+ else if(pOpenAction->GetType()==PDFOBJ_DICTIONARY)
+ {
+ CPDF_Dictionary * pDict=(CPDF_Dictionary*)pOpenAction;
+ CPDF_Action Action = pDict;
+
+ if(m_pEnv->GetActionHander())
+ m_pEnv->GetActionHander()->DoAction_DocOpen(Action,this);
+ }
+ else
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+CPDF_OCContext* CPDFSDK_Document::GetOCContext()
+{
+ if(!m_pOccontent)
+ m_pOccontent = new CPDF_OCContext(m_pDoc);
+ return m_pOccontent;
+}
+
+void CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage)
+{
+ CPDFSDK_PageView* pPageView = (CPDFSDK_PageView*)m_pageMap.GetValueAt(pPDFPage);
+ if(pPageView)
+ {
+ delete pPageView;
+ m_pageMap.RemoveKey(pPDFPage);
+ }
+}
+
+CPDF_Page * CPDFSDK_Document::GetPage(int nIndex)
+{
+ CPDF_Page * pTempPage = (CPDF_Page*)m_pEnv->FFI_GetPage(m_pDoc,nIndex);
+ if(!pTempPage)
+ return NULL;
+ return pTempPage;
+}
+
+CPDFSDK_InterForm* CPDFSDK_Document::GetInterForm()
+{
+ if(!m_pInterForm)
+ m_pInterForm = new CPDFSDK_InterForm(this);
+ return m_pInterForm;
+}
+
+void CPDFSDK_Document::UpdateAllViews(CPDFSDK_PageView* pSender, CPDFSDK_Annot* pAnnot)
+{
+
+ FX_POSITION pos = m_pageMap.GetStartPosition();
+ CPDF_Page * pPage = NULL;
+ CPDFSDK_PageView * pPageView = NULL;
+ while(pos)
+ {
+ m_pageMap.GetNextAssoc(pos, pPage, pPageView);
+
+ if(pPageView != pSender)
+ {
+ pPageView->UpdateView(pAnnot);
+ }
+ }
+}
+
+CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot()
+{
+ return this->m_pFocusAnnot;
+}
+
+FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
+{
+
+ if(m_pFocusAnnot==pAnnot) return TRUE;
+
+ if(m_pFocusAnnot)
+ {
+ if(!this->KillFocusAnnot(nFlag) ) return FALSE;
+ }
+ CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
+ if(pAnnot && pPageView->IsValid())
+ {
+ CPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();
+
+ if(pAnnotHandler&&!m_pFocusAnnot)
+ {
+ if (!pAnnotHandler->Annot_OnSetFocus(pAnnot,nFlag))
+ return FALSE;
+ if(!m_pFocusAnnot)
+ {
+ this->m_pFocusAnnot=pAnnot;
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag)
+{
+ if(m_pFocusAnnot)
+ {
+ CPDFSDK_AnnotHandlerMgr *pAnnotHandler=m_pEnv->GetAnnotHandlerMgr();
+ if(pAnnotHandler)
+ {
+ CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
+ m_pFocusAnnot = NULL;
+ if(pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag))
+ {
+
+ if(pFocusAnnot->GetType() == FX_BSTRC("Widget"))
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
+ int nFieldType = pWidget->GetFieldType();
+ if(FIELDTYPE_TEXTFIELD == nFieldType || FIELDTYPE_COMBOBOX == nFieldType)
+ m_pEnv->FFI_OnSetFieldInputFocus(NULL, NULL, 0, FALSE);
+ }
+
+ if(!m_pFocusAnnot)
+ return TRUE;
+ }
+ else
+ {
+ m_pFocusAnnot = pFocusAnnot;
+ }
+ }
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_Document::DeletePages(int nStart, int nCount)
+{
+ if ( nStart < 0 || nStart >= GetPageCount() || nCount <= 0 )
+ {
+ return FALSE;
+ }
+
+ CPDF_Page * pTempPage = NULL;
+ for ( int i = nCount-1; i >= 0; i-- )
+ {
+ pTempPage = GetPage(nStart+i);
+ if ( pTempPage != NULL )
+ {
+ ReMovePageView(pTempPage);
+ }
+ }
+ return TRUE;
+}
+
+void CPDFSDK_Document::OnCloseDocument()
+{
+ KillFocusAnnot();
+}
+
+FX_BOOL CPDFSDK_Document::GetPermissions(int nFlag)
+{
+ FX_DWORD dwPermissions = m_pDoc->GetUserPermissions();
+ return dwPermissions&nFlag;
+}
+
+IFXJS_Runtime * CPDFSDK_Document::GetJsRuntime()
+{
+ ASSERT(m_pEnv!=NULL);
+ return m_pEnv->GetJSRuntime();
+}
+
+CFX_WideString CPDFSDK_Document::GetPath()
+{
+ ASSERT(m_pEnv != NULL);
+ return m_pEnv->JS_docGetFilePath();
+}
+
+
+CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc,CPDF_Page* page):m_pSDKDoc(pSDKDoc),m_page(page)
+{
+ CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
+ if(pInterForm)
+ {
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ pPDFInterForm->FixPageFields(page);
+ }
+
+ m_fxAnnotArray.RemoveAll();
+
+ m_bEnterWidget = FALSE;
+ m_bExitWidget = FALSE;
+ m_bOnWidget = FALSE;
+ m_CaptureWidget = NULL;
+ m_bValid = FALSE;
+}
+
+CPDFSDK_PageView::~CPDFSDK_PageView()
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ int nAnnotCount = m_fxAnnotArray.GetSize();
+ for (int i=0; i<nAnnotCount; i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ //if there is a focused annot on the page, we should kill the focus first.
+ if(pAnnot == m_pSDKDoc->GetFocusAnnot())
+ KillFocusAnnot();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
+ }
+ m_fxAnnotArray.RemoveAll();
+ if(m_pAnnotList)
+ {
+ delete m_pAnnotList;
+ m_pAnnotList = NULL;
+ }
+}
+
+void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,CPDF_RenderOptions* pOptions)
+{
+ m_curMatrix = *pUser2Device;
+
+ // m_pAnnotList->DisplayAnnots(m_page, pDevice, pUser2Device, FALSE, pOptions);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotIterator annotIterator(this, TRUE);
+ CPDFSDK_Annot * pSDKAnnot=NULL;
+ int index=-1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0);
+ }
+
+}
+
+CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ int nCount = m_pAnnotList->Count();
+ for(int i = 0 ; i<nCount; i++)
+ {
+ CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
+ CFX_FloatRect annotRect;
+ pAnnot->GetRect(annotRect);
+ if(annotRect.Contains(pageX, pageY))
+ return pAnnot;
+ }
+ return NULL;
+}
+
+CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ int nCount = m_pAnnotList->Count();
+ for(int i = 0 ; i<nCount; i++)
+ {
+ CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
+ if(pAnnot->GetSubType() == "Widget")
+ {
+ CFX_FloatRect annotRect;
+ pAnnot->GetRect(annotRect);
+ if(annotRect.Contains(pageX, pageY))
+ return pAnnot;
+ }
+ }
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ CPDFSDK_AnnotIterator annotIterator(this, FALSE);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pSDKAnnot = NULL;
+ int index = -1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ CPDF_Rect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ if(rc.Contains(pageX, pageY))
+ return pSDKAnnot;
+ }
+
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX, FX_FLOAT pageY)
+{
+
+ CPDFSDK_AnnotIterator annotIterator(this, FALSE);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
+ CPDFSDK_Annot* pSDKAnnot = NULL;
+ int index = -1;
+ while((pSDKAnnot = annotIterator.Next(index)))
+ {
+ if(pSDKAnnot->GetType() == "Widget")
+ {
+ pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
+ CPDF_Point point(pageX, pageY);
+ if (pAnnotMgr->Annot_OnHitTest(this, pSDKAnnot, point))
+// if(rc.Contains(pageX, pageY))
+ return pSDKAnnot;
+ }
+ }
+
+ return NULL;
+}
+
+
+FX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot)
+{
+ CPDF_Dictionary* pAnnotDic = pAnnot->m_pAnnotDict;
+ if(pAnnotDic)
+ return pAnnotDic->KeyExist("AS");
+ return FALSE;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot * pPDFAnnot)
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr * pAnnotHandler= pEnv->GetAnnotHandlerMgr();
+
+ CPDFSDK_Annot* pSDKAnnot =NULL;
+
+ if(pAnnotHandler)
+ {
+ pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
+ }
+ if(!pSDKAnnot)
+ return NULL;
+
+ m_fxAnnotArray.Add(pSDKAnnot);
+
+ if(pAnnotHandler)
+ {
+ pAnnotHandler->Annot_OnCreate(pSDKAnnot);
+
+ }
+
+ return pSDKAnnot;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Dictionary * pDict)
+{
+ if(pDict)
+ return this->AddAnnot(pDict->GetString("Subtype"),pDict);
+ return NULL;
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(FX_LPCSTR lpSubType,CPDF_Dictionary * pDict)
+{
+ return NULL;
+}
+
+FX_BOOL CPDFSDK_PageView::DeleteAnnot(CPDFSDK_Annot* pAnnot)
+{
+ return FALSE;
+}
+
+CPDF_Document* CPDFSDK_PageView::GetPDFDocument()
+{
+ if(m_page)
+ {
+ return m_page->m_pDocument;
+ }
+ return NULL;
+}
+
+int CPDFSDK_PageView::CountAnnots()
+{
+ return m_pAnnotList->Count();
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(int nIndex)
+{
+ int nCount = m_fxAnnotArray.GetSize();
+ if ( nIndex < 0 || nIndex >= nCount )
+ {
+ return NULL;
+ }
+
+ return (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(nIndex);
+}
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary * pDict)
+{
+ int nCount = m_fxAnnotArray.GetSize();
+ for(int i=0; i<nCount; i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ if(pDict==pAnnot->GetPDFAnnot()->m_pAnnotDict)
+ return pAnnot;
+ }
+ return NULL;
+}
+
+FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point & point, FX_UINT nFlag)
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+ if(!pFXAnnot)
+ {
+ KillFocusAnnot(nFlag);
+ }
+ else
+ {
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+
+ FX_BOOL bRet = pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag,point);
+ if(bRet)
+ {
+ SetFocusAnnot(pFXAnnot);
+ }
+ return bRet;
+ }
+ return FALSE;
+}
+
+
+FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CPDF_Point & point, FX_UINT nFlag)
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ ASSERT(pEnv);
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
+ CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
+ FX_BOOL bRet = FALSE;
+ if(pFocusAnnot && pFocusAnnot != pFXAnnot)
+ {
+ //Last focus Annot gets a chance to handle the event.
+ bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag,point);
+ }
+ if(pFXAnnot && !bRet)
+ {
+ bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag,point);
+ return bRet;
+ }
+ return bRet;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseMove(const CPDF_Point & point, int nFlag)
+{
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ if(CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y))
+ {
+ if(m_CaptureWidget && m_CaptureWidget != pFXAnnot)
+ {
+ m_bExitWidget = TRUE;
+ m_bEnterWidget = FALSE;
+ pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+ }
+ m_CaptureWidget = (CPDFSDK_Widget*)pFXAnnot;
+ m_bOnWidget = TRUE;
+ if(!m_bEnterWidget)
+ {
+ m_bEnterWidget = TRUE;
+ m_bExitWidget = FALSE;
+ pAnnotHandlerMgr->Annot_OnMouseEnter(this, pFXAnnot,nFlag);
+ }
+ pAnnotHandlerMgr->Annot_OnMouseMove(this, pFXAnnot, nFlag, point);
+ return TRUE;
+ }
+ else
+ {
+ if(m_bOnWidget)
+ {
+ m_bOnWidget = FALSE;
+ m_bExitWidget = TRUE;
+ m_bEnterWidget = FALSE;
+ if(m_CaptureWidget)
+ {
+ pAnnotHandlerMgr->Annot_OnMouseExit(this, m_CaptureWidget, nFlag);
+ m_CaptureWidget = NULL;
+ }
+ }
+ return FALSE;
+ }
+
+ return FALSE;;
+}
+
+FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX, double deltaY,const CPDF_Point& point, int nFlag)
+{
+ if(CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y))
+ {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag, (int)deltaY, point);
+ }
+ return FALSE;
+
+}
+
+FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag)
+{
+ if(CPDFSDK_Annot* pAnnot = GetFocusAnnot())
+ {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag)
+{
+ if(CPDFSDK_Annot* pAnnot = GetFocusAnnot())
+ {
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr);
+ return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
+ }
+ return FALSE;
+}
+
+FX_BOOL CPDFSDK_PageView::OnKeyUp(int nKeyCode, int nFlag)
+{
+// if(CPDFSDK_Annot* pAnnot = GetFocusAnnot())
+// {
+// CFFL_IFormFiller* pIFormFiller = g_pFormFillApp->GetIFormFiller();
+// return pIFormFiller->OnKeyUp(pAnnot, nKeyCode, nFlag);
+// }
+ return FALSE;
+}
+
+extern void CheckUnSupportAnnot(CPDF_Document * pDoc, CPDF_Annot* pPDFAnnot);
+
+void CPDFSDK_PageView::LoadFXAnnots()
+{
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+
+ FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled();
+ //Disable the default AP construction.
+ CPDF_InterForm::EnableUpdateAP(FALSE);
+ m_pAnnotList = new CPDF_AnnotList(m_page);
+ CPDF_InterForm::EnableUpdateAP(enableAPUpdate);
+ int nCount = m_pAnnotList->Count();
+ for(int i=0; i<nCount; i++)
+ {
+ CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
+ CPDF_Document * pDoc = this->GetPDFDocument();
+
+ CheckUnSupportAnnot(pDoc, pPDFAnnot);
+
+ CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+ ASSERT(pAnnotHandlerMgr != NULL);
+ if(pAnnotHandlerMgr)
+ {
+ CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
+ if(!pAnnot)
+ continue;
+ m_fxAnnotArray.Add(pAnnot);
+
+ pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
+ }
+
+ }
+}
+
+void CPDFSDK_PageView::UpdateRects(CFX_RectArray& rects)
+{
+ for(int i=0; i<rects.GetSize(); i++)
+ {
+ CPDF_Rect rc = rects.GetAt(i);
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+ pEnv->FFI_Invalidate(m_page, rc.left, rc.top, rc.right, rc.bottom);
+ }
+}
+
+void CPDFSDK_PageView::UpdateView(CPDFSDK_Annot* pAnnot)
+{
+ CPDF_Rect rcWindow;
+
+ CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
+// CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
+
+ rcWindow = pAnnot->GetRect();//pAnnotHandler->Annot_OnGetViewBBox(this,pAnnot);
+ pEnv->FFI_Invalidate(m_page, rcWindow.left, rcWindow.top, rcWindow.right, rcWindow.bottom);
+
+}
+
+int CPDFSDK_PageView::GetPageIndex()
+{
+ if(m_page)
+ {
+ CPDF_Dictionary* pDic = m_page->m_pFormDict;
+ CPDF_Document* pDoc = m_pSDKDoc->GetDocument();
+ if(pDoc && pDic)
+ {
+ return pDoc->GetPageIndex(pDic->GetObjNum());
+ }
+ }
+ return -1;
+}
+
+FX_BOOL CPDFSDK_PageView::IsValidAnnot(FX_LPVOID p)
+{
+ if (p == NULL) return FALSE;
+ int iCount = m_pAnnotList->Count();
+ for (int i = 0; i < iCount; i++)
+ {
+ if (m_pAnnotList->GetAt(i) == p)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot()
+{
+ CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
+ if(!pFocusAnnot)
+ return NULL;
+
+ for(int i=0; i<m_fxAnnotArray.GetSize(); i++)
+ {
+ CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+ if(pAnnot == pFocusAnnot)
+ return pAnnot;
+ }
+ return NULL;
+}
+
diff --git a/fpdfsdk/src/fsdk_rendercontext.cpp b/fpdfsdk/src/fsdk_rendercontext.cpp
new file mode 100644
index 0000000000..55382e160e
--- /dev/null
+++ b/fpdfsdk/src/fsdk_rendercontext.cpp
@@ -0,0 +1,49 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../include/fsdk_rendercontext.h"
+
+void CRenderContext::Clear()
+{
+ m_pDevice = NULL;
+ m_pContext = NULL;
+ m_pRenderer = NULL;
+ m_pAnnots = NULL;
+ m_pOptions = NULL;
+#ifdef _WIN32_WCE
+ m_pBitmap = NULL;
+ m_hBitmap = NULL;
+#endif
+}
+
+CRenderContext::~CRenderContext()
+{
+ if (m_pRenderer) delete m_pRenderer;
+ if (m_pContext) delete m_pContext;
+ if (m_pDevice) delete m_pDevice;
+ if (m_pAnnots) delete m_pAnnots;
+ if (m_pOptions->m_pOCContext) delete m_pOptions->m_pOCContext;
+ if (m_pOptions) delete m_pOptions;
+#ifdef _WIN32_WCE
+ if (m_pBitmap) delete m_pBitmap;
+ if (m_hBitmap) DeleteObject(m_hBitmap);
+#endif
+}
+
+IFSDK_PAUSE_Adapter::IFSDK_PAUSE_Adapter(IFSDK_PAUSE* IPause )
+{
+ m_IPause = IPause;
+}
+
+FX_BOOL IFSDK_PAUSE_Adapter::NeedToPauseNow()
+{
+ if (m_IPause->NeedToPauseNow)
+ {
+ return m_IPause->NeedToPauseNow(m_IPause);
+ }else{
+ return FALSE;
+ }
+}
diff --git a/fpdfsdk/src/fxedit/fxet_ap.cpp b/fpdfsdk/src/fxedit/fxet_ap.cpp
new file mode 100644
index 0000000000..9730d37a45
--- /dev/null
+++ b/fpdfsdk/src/fxedit/fxet_ap.cpp
@@ -0,0 +1,225 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fx_edit.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord)
+{
+ ASSERT (pFontMap != NULL);
+
+ CFX_ByteString sWord;
+
+ if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex))
+ {
+ if (SubWord > 0)
+ {
+ Word = SubWord;
+ }
+ else
+ {
+ FX_DWORD dwCharCode = -1;
+
+ if (pPDFFont->IsUnicodeCompatible())
+ dwCharCode = pPDFFont->CharCodeFromUnicode(Word);
+ else
+ dwCharCode = pFontMap->CharCodeFromUnicode(nFontIndex, Word);
+
+ if (dwCharCode > 0 )
+ {
+ pPDFFont->AppendChar(sWord, dwCharCode);
+ return sWord;
+ }
+ }
+
+ pPDFFont->AppendChar(sWord, Word);
+ }
+
+ return sWord;
+}
+
+static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords)
+{
+ if (strWords.GetLength() > 0)
+ return PDF_EncodeString(strWords) + " Tj\n";
+
+ return "";
+}
+
+static CFX_ByteString GetFontSetString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_FLOAT fFontSize)
+{
+ CFX_ByteTextBuf sRet;
+
+ if (pFontMap)
+ {
+ CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
+
+ if (sFontAlias.GetLength() > 0 && fFontSize > 0 )
+ sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_ByteString IFX_Edit::GetEditAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange /* = NULL*/, FX_BOOL bContinuous/* = TRUE*/, FX_WORD SubWord/* = 0*/)
+{
+ CFX_ByteTextBuf sEditStream, sWords;
+
+ CPDF_Point ptOld(0.0f,0.0f),ptNew(0.0f,0.0f);
+ FX_INT32 nCurFontIndex = -1;
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ if (bContinuous)
+ {
+ if (place.LineCmp(oldplace) != 0)
+ {
+ if (sWords.GetSize() > 0)
+ {
+ sEditStream << GetWordRenderString(sWords.GetByteString());
+ sWords.Clear();
+ }
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+ }
+ else
+ {
+ CPVT_Line line;
+ pIterator->GetLine(line);
+ ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y);
+ }
+
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y)
+ {
+ sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+
+ ptOld = ptNew;
+ }
+ }
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ if (word.nFontIndex != nCurFontIndex)
+ {
+ if (sWords.GetSize() > 0)
+ {
+ sEditStream << GetWordRenderString(sWords.GetByteString());
+ sWords.Clear();
+ }
+ sEditStream << GetFontSetString(pEdit->GetFontMap(),word.nFontIndex,word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+
+ sWords << GetPDFWordString(pEdit->GetFontMap(),nCurFontIndex,word.Word,SubWord);
+ }
+
+ oldplace = place;
+ }
+ else
+ {
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y);
+
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y)
+ {
+ sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n";
+ ptOld = ptNew;
+ }
+
+ if (word.nFontIndex != nCurFontIndex)
+ {
+ sEditStream << GetFontSetString(pEdit->GetFontMap(),word.nFontIndex,word.fFontSize);
+ nCurFontIndex = word.nFontIndex;
+ }
+
+ sEditStream << GetWordRenderString(GetPDFWordString(pEdit->GetFontMap(),nCurFontIndex,word.Word,SubWord));
+ }
+ }
+ }
+
+ if (sWords.GetSize() > 0)
+ {
+ sEditStream << GetWordRenderString(sWords.GetByteString());
+ sWords.Clear();
+ }
+ }
+
+ CFX_ByteTextBuf sAppStream;
+ if (sEditStream.GetSize() > 0)
+ {
+ FX_INT32 nHorzScale = pEdit->GetHorzScale();
+ if (nHorzScale != 100)
+ {
+ sAppStream << nHorzScale << " Tz\n";
+ }
+
+ FX_FLOAT fCharSpace = pEdit->GetCharSpace();
+ if (!FX_EDIT_IsFloatZero(fCharSpace))
+ {
+ sAppStream << fCharSpace << " Tc\n";
+ }
+
+ sAppStream << sEditStream;
+ }
+
+ return sAppStream.GetByteString();
+}
+
+CFX_ByteString IFX_Edit::GetSelectAppearanceStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange /*= NULL*/)
+{
+ CFX_ByteTextBuf sRet;
+
+ if (pRange && pRange->IsExist())
+ {
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ pIterator->SetAt(pRange->BeginPos);
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ CPVT_Line line;
+ if (pIterator->GetWord(word) && pIterator->GetLine(line))
+ {
+ //CPDF_Rect rcWordSel = CPDF_Rect(word.ptWord.x,line.ptLine.y + line.fLineDescent,
+ // word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
+
+ sRet << word.ptWord.x + ptOffset.x << " " << line.ptLine.y + line.fLineDescent
+ << " " << word.fWidth << " " << line.fLineAscent - line.fLineDescent << " re\nf\n";
+ }
+ }
+ }
+ }
+
+ return sRet.GetByteString();
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_edit.cpp b/fpdfsdk/src/fxedit/fxet_edit.cpp
new file mode 100644
index 0000000000..5a6d4d804e
--- /dev/null
+++ b/fpdfsdk/src/fxedit/fxet_edit.cpp
@@ -0,0 +1,3610 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+#define FX_EDIT_UNDO_MAXITEM 10000
+
+/* ---------------------------- CFX_Edit_Iterator ---------------------------- */
+
+CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator) :
+ m_pEdit(pEdit),
+ m_pVTIterator(pVTIterator)
+{
+}
+
+CFX_Edit_Iterator::~CFX_Edit_Iterator()
+{
+}
+
+FX_BOOL CFX_Edit_Iterator::NextWord()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextWord();
+}
+
+FX_BOOL CFX_Edit_Iterator::NextLine()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextLine();
+}
+
+FX_BOOL CFX_Edit_Iterator::NextSection()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->NextSection();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevWord()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevWord();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevLine()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevLine();
+}
+
+FX_BOOL CFX_Edit_Iterator::PrevSection()
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->PrevSection();
+}
+
+FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word & word) const
+{
+ ASSERT(m_pEdit != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ if (m_pVTIterator->GetWord(word))
+ {
+ word.ptWord = m_pEdit->VTToEdit(word.ptWord);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line & line) const
+{
+ ASSERT(m_pEdit != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ if (m_pVTIterator->GetLine(line))
+ {
+ line.ptLine = m_pEdit->VTToEdit(line.ptLine);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section & section) const
+{
+ ASSERT(m_pEdit != NULL);
+ ASSERT(m_pVTIterator != NULL);
+
+ if (m_pVTIterator->GetSection(section))
+ {
+ section.rcSection = m_pEdit->VTToEdit(section.rcSection);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void CFX_Edit_Iterator::SetAt(FX_INT32 nWordIndex)
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ m_pVTIterator->SetAt(nWordIndex);
+}
+
+void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace & place)
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ m_pVTIterator->SetAt(place);
+}
+
+const CPVT_WordPlace & CFX_Edit_Iterator::GetAt() const
+{
+ ASSERT(m_pVTIterator != NULL);
+
+ return m_pVTIterator->GetAt();
+}
+
+IFX_Edit* CFX_Edit_Iterator::GetEdit() const
+{
+ return m_pEdit;
+}
+
+/* --------------------------- CFX_Edit_Provider ------------------------------- */
+
+CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap * pFontMap) : m_pFontMap(pFontMap)
+{
+ ASSERT(m_pFontMap != NULL);
+}
+
+CFX_Edit_Provider::~CFX_Edit_Provider()
+{
+}
+
+IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap()
+{
+ return m_pFontMap;
+}
+
+FX_INT32 CFX_Edit_Provider::GetCharWidth(FX_INT32 nFontIndex, FX_WORD word, FX_INT32 nWordStyle)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+ {
+ FX_DWORD charcode = word;
+
+ if (pPDFFont->IsUnicodeCompatible())
+ charcode = pPDFFont->CharCodeFromUnicode(word);
+ else
+ charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word);
+
+ if (charcode != -1)
+ return pPDFFont->GetCharWidthF(charcode);
+ }
+
+ return 0;
+}
+
+FX_INT32 CFX_Edit_Provider::GetTypeAscent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+ return pPDFFont->GetTypeAscent();
+
+ return 0;
+}
+
+FX_INT32 CFX_Edit_Provider::GetTypeDescent(FX_INT32 nFontIndex)
+{
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
+ return pPDFFont->GetTypeDescent();
+
+ return 0;
+}
+
+FX_INT32 CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, FX_INT32 charset, FX_INT32 nFontIndex)
+{
+ return m_pFontMap->GetWordFontIndex(word,charset,nFontIndex);
+}
+
+FX_INT32 CFX_Edit_Provider::GetDefaultFontIndex()
+{
+ return 0;
+}
+
+FX_BOOL CFX_Edit_Provider::IsLatinWord(FX_WORD word)
+{
+ return FX_EDIT_ISLATINWORD(word);
+}
+
+/* --------------------------------- CFX_Edit_Refresh --------------------------------- */
+
+CFX_Edit_Refresh::CFX_Edit_Refresh()
+{
+}
+
+CFX_Edit_Refresh::~CFX_Edit_Refresh()
+{
+}
+
+void CFX_Edit_Refresh::BeginRefresh()
+{
+ m_RefreshRects.Empty();
+ m_OldLineRects = m_NewLineRects;
+}
+
+void CFX_Edit_Refresh::Push(const CPVT_WordRange & linerange,const CPDF_Rect & rect)
+{
+ m_NewLineRects.Add(linerange,rect);
+}
+
+void CFX_Edit_Refresh::NoAnalyse()
+{
+ {
+ for (FX_INT32 i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++)
+ if (CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i))
+ m_RefreshRects.Add(pOldRect->m_rcLine);
+ }
+
+ {
+ for (FX_INT32 i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++)
+ if (CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i))
+ m_RefreshRects.Add(pNewRect->m_rcLine);
+ }
+}
+
+void CFX_Edit_Refresh::Analyse(FX_INT32 nAlignment)
+{
+ FX_BOOL bLineTopChanged = FALSE;
+ CPDF_Rect rcResult;
+ FX_FLOAT fWidthDiff;
+
+ FX_INT32 szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize());
+ FX_INT32 i = 0;
+
+ while (i < szMax)
+ {
+ CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i);
+ CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i);
+
+ if (pOldRect)
+ {
+ if (pNewRect)
+ {
+ if (bLineTopChanged)
+ {
+ rcResult = pOldRect->m_rcLine;
+ rcResult.Union(pNewRect->m_rcLine);
+ m_RefreshRects.Add(rcResult);
+ }
+ else
+ {
+ if (*pNewRect != *pOldRect)
+ {
+ if (!pNewRect->IsSameTop(*pOldRect) || !pNewRect->IsSameHeight(*pOldRect))
+ {
+ bLineTopChanged = TRUE;
+ continue;
+ }
+
+ if (nAlignment == 0)
+ {
+ if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos)
+ {
+ rcResult = pOldRect->m_rcLine;
+ rcResult.Union(pNewRect->m_rcLine);
+ m_RefreshRects.Add(rcResult);
+ }
+ else
+ {
+ if (!pNewRect->IsSameLeft(*pOldRect))
+ {
+ rcResult = pOldRect->m_rcLine;
+ rcResult.Union(pNewRect->m_rcLine);
+ }
+ else
+ {
+ fWidthDiff = pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width();
+ rcResult = pNewRect->m_rcLine;
+ if (fWidthDiff > 0.0f)
+ rcResult.left = rcResult.right - fWidthDiff;
+ else
+ {
+ rcResult.left = rcResult.right;
+ rcResult.right += (-fWidthDiff);
+ }
+ }
+ m_RefreshRects.Add(rcResult);
+ }
+ }
+ else
+ {
+ rcResult = pOldRect->m_rcLine;
+ rcResult.Union(pNewRect->m_rcLine);
+ m_RefreshRects.Add(rcResult);
+ }
+ }
+ else
+ {
+ //don't need to do anything
+ }
+ }
+ }
+ else
+ {
+ m_RefreshRects.Add(pOldRect->m_rcLine);
+ }
+ }
+ else
+ {
+ if (pNewRect)
+ {
+ m_RefreshRects.Add(pNewRect->m_rcLine);
+ }
+ else
+ {
+ //error
+ }
+ }
+ i++;
+ }
+}
+
+void CFX_Edit_Refresh::AddRefresh(const CPDF_Rect & rect)
+{
+ m_RefreshRects.Add(rect);
+}
+
+const CFX_Edit_RectArray * CFX_Edit_Refresh::GetRefreshRects() const
+{
+ return &m_RefreshRects;
+}
+
+void CFX_Edit_Refresh::EndRefresh()
+{
+ m_RefreshRects.Empty();
+}
+
+/* ------------------------------------- CFX_Edit_Undo ------------------------------------- */
+
+CFX_Edit_Undo::CFX_Edit_Undo(FX_INT32 nBufsize) : m_nCurUndoPos(0),
+ m_nBufSize(nBufsize),
+ m_bModified(FALSE),
+ m_bVirgin(TRUE),
+ m_bWorking(FALSE)
+{
+}
+
+CFX_Edit_Undo::~CFX_Edit_Undo()
+{
+ Reset();
+}
+
+FX_BOOL CFX_Edit_Undo::CanUndo() const
+{
+ return m_nCurUndoPos > 0;
+}
+
+void CFX_Edit_Undo::Undo()
+{
+ m_bWorking = TRUE;
+
+ if (m_nCurUndoPos > 0)
+ {
+ IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos-1);
+ ASSERT(pItem != NULL);
+
+ pItem->Undo();
+
+ m_nCurUndoPos--;
+ m_bModified = (m_nCurUndoPos != 0);
+ }
+
+ m_bWorking = FALSE;
+}
+
+FX_BOOL CFX_Edit_Undo::CanRedo() const
+{
+ return m_nCurUndoPos < m_UndoItemStack.GetSize();
+}
+
+void CFX_Edit_Undo::Redo()
+{
+ m_bWorking = TRUE;
+
+ FX_INT32 nStackSize = m_UndoItemStack.GetSize();
+
+ if (m_nCurUndoPos < nStackSize)
+ {
+ IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
+ ASSERT(pItem != NULL);
+
+ pItem->Redo();
+
+ m_nCurUndoPos++;
+ m_bModified = (m_nCurUndoPos != 0);
+ }
+
+ m_bWorking = FALSE;
+}
+
+FX_BOOL CFX_Edit_Undo::IsWorking() const
+{
+ return m_bWorking;
+}
+
+void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem)
+{
+ ASSERT(!m_bWorking);
+ ASSERT(pItem != NULL);
+ ASSERT(m_nBufSize > 1);
+
+ if (m_nCurUndoPos < m_UndoItemStack.GetSize())
+ RemoveTails();
+
+ if (m_UndoItemStack.GetSize() >= m_nBufSize)
+ {
+ RemoveHeads();
+ m_bVirgin = FALSE;
+ }
+
+ m_UndoItemStack.Add(pItem);
+ m_nCurUndoPos = m_UndoItemStack.GetSize();
+
+ m_bModified = (m_nCurUndoPos != 0);
+}
+
+FX_BOOL CFX_Edit_Undo::IsModified() const
+{
+ if (m_bVirgin)
+ return m_bModified;
+ else
+ return TRUE;
+}
+
+IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(FX_INT32 nIndex)
+{
+ if (nIndex>=0 && nIndex < m_UndoItemStack.GetSize())
+ return m_UndoItemStack.GetAt(nIndex);
+
+ return NULL;
+}
+
+void CFX_Edit_Undo::RemoveHeads()
+{
+ ASSERT(m_UndoItemStack.GetSize() > 1);
+
+ IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(0);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ m_UndoItemStack.RemoveAt(0);
+}
+
+void CFX_Edit_Undo::RemoveTails()
+{
+ for (FX_INT32 i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)
+ {
+ IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(i);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ m_UndoItemStack.RemoveAt(i);
+ }
+}
+
+void CFX_Edit_Undo::Reset()
+{
+ for (FX_INT32 i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)
+ {
+ IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(i);
+ ASSERT(pItem != NULL);
+
+ pItem->Release();
+ }
+ m_nCurUndoPos = 0;
+ m_UndoItemStack.RemoveAll();
+}
+
+/* -------------------------------- CFX_Edit_GroupUndoItem -------------------------------- */
+
+CFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle) : m_sTitle(sTitle)
+{
+}
+
+CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem()
+{
+ for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
+ {
+ CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->Release();
+ }
+
+ m_Items.RemoveAll();
+}
+
+void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem)
+{
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->SetFirst(FALSE);
+ pUndoItem->SetLast(FALSE);
+
+ m_Items.Add(pUndoItem);
+
+ if (m_sTitle.IsEmpty())
+ m_sTitle = pUndoItem->GetUndoTitle();
+}
+
+void CFX_Edit_GroupUndoItem::UpdateItems()
+{
+ if (m_Items.GetSize() > 0)
+ {
+ CFX_Edit_UndoItem* pFirstItem = m_Items[0];
+ ASSERT(pFirstItem != NULL);
+ pFirstItem->SetFirst(TRUE);
+
+ CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
+ ASSERT(pLastItem != NULL);
+ pLastItem->SetLast(TRUE);
+ }
+}
+
+void CFX_Edit_GroupUndoItem::Undo()
+{
+ for (int i=m_Items.GetSize()-1; i>=0; i--)
+ {
+ CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->Undo();
+ }
+}
+
+void CFX_Edit_GroupUndoItem::Redo()
+{
+ for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
+ {
+ CFX_Edit_UndoItem* pUndoItem = m_Items[i];
+ ASSERT(pUndoItem != NULL);
+
+ pUndoItem->Redo();
+ }
+}
+
+CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle()
+{
+ return m_sTitle;
+}
+
+void CFX_Edit_GroupUndoItem::Release()
+{
+ delete this;
+}
+
+/* ------------------------------------- CFX_Edit_UndoItem derived classes ------------------------------------- */
+
+CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps)
+ : m_pEdit(pEdit), m_wpOld(wpOldPlace), m_wpNew(wpNewPlace), m_Word(word), m_nCharset(charset), m_WordProps()
+{
+ if (pWordProps)
+ m_WordProps = *pWordProps;
+}
+
+CFXEU_InsertWord::~CFXEU_InsertWord()
+{
+}
+
+void CFXEU_InsertWord::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+ }
+}
+
+void CFXEU_InsertWord::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpNew);
+ m_pEdit->Backspace(FALSE,TRUE);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
+ m_pEdit(pEdit),
+ m_wpOld(wpOldPlace),
+ m_wpNew(wpNewPlace),
+ m_SecProps(),
+ m_WordProps()
+{
+ if (pSecProps)
+ m_SecProps = *pSecProps;
+ if (pWordProps)
+ m_WordProps = *pWordProps;
+}
+
+CFXEU_InsertReturn::~CFXEU_InsertReturn()
+{
+}
+
+void CFXEU_InsertReturn::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+ }
+}
+
+void CFXEU_InsertReturn::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpNew);
+ m_pEdit->Backspace(FALSE,TRUE);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+//CFXEU_Backspace
+
+CFXEU_Backspace::CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
+ m_pEdit(pEdit),
+ m_wpOld(wpOldPlace),
+ m_wpNew(wpNewPlace),
+ m_Word(word),
+ m_nCharset(charset),
+ m_SecProps(SecProps),
+ m_WordProps(WordProps)
+{
+}
+
+CFXEU_Backspace::~CFXEU_Backspace()
+{
+}
+
+void CFXEU_Backspace::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ m_pEdit->Backspace(FALSE,TRUE);
+ }
+}
+
+void CFXEU_Backspace::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpNew);
+ if (m_wpNew.SecCmp(m_wpOld) != 0)
+ {
+ m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+ }
+ else
+ {
+ m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+ }
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+//CFXEU_Delete
+
+CFXEU_Delete::CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps, FX_BOOL bSecEnd) :
+ m_pEdit(pEdit),
+ m_wpOld(wpOldPlace),
+ m_wpNew(wpNewPlace),
+ m_Word(word),
+ m_nCharset(charset),
+ m_SecProps(SecProps),
+ m_WordProps(WordProps),
+ m_bSecEnd(bSecEnd)
+{
+}
+
+CFXEU_Delete::~CFXEU_Delete()
+{
+}
+
+void CFXEU_Delete::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ m_pEdit->Delete(FALSE,TRUE);
+ }
+}
+
+void CFXEU_Delete::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpNew);
+ if (m_bSecEnd)
+ {
+ m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
+ }
+ else
+ {
+ m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
+ }
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+//CFXEU_Clear
+
+CFXEU_Clear::CFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText) :
+ m_pEdit(pEdit),
+ m_wrSel(wrSel),
+ m_swText(swText)
+{
+}
+
+CFXEU_Clear::~CFXEU_Clear()
+{
+}
+
+void CFXEU_Clear::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+ m_pEdit->Clear(FALSE,TRUE);
+ }
+}
+
+void CFXEU_Clear::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wrSel.BeginPos);
+ m_pEdit->InsertText(m_swText, DEFAULT_CHARSET, NULL,NULL,FALSE,TRUE);
+ m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+//CFXEU_ClearRich
+
+CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CPVT_WordRange & wrSel, FX_WORD word, FX_INT32 charset,
+ const CPVT_SecProps & SecProps, const CPVT_WordProps & WordProps) :
+ m_pEdit(pEdit),
+ m_wpOld(wpOldPlace),
+ m_wpNew(wpNewPlace),
+ m_wrSel(wrSel),
+ m_Word(word),
+ m_nCharset(charset),
+ m_SecProps(SecProps),
+ m_WordProps(WordProps)
+{
+}
+
+CFXEU_ClearRich::~CFXEU_ClearRich()
+{
+}
+
+void CFXEU_ClearRich::Redo()
+{
+ if (m_pEdit && IsLast())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+ m_pEdit->Clear(FALSE,TRUE);
+ }
+}
+
+void CFXEU_ClearRich::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ if (m_wpNew.SecCmp(m_wpOld) != 0)
+ {
+ m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,FALSE);
+ }
+ else
+ {
+ m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,FALSE);
+ }
+
+ if (IsFirst())
+ {
+ m_pEdit->PaintInsertText(m_wrSel.BeginPos,m_wrSel.EndPos);
+ m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos);
+ }
+ }
+}
+/* -------------------------------------------------------------------------- */
+//CFXEU_InsertText
+
+CFXEU_InsertText::CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
+ const CFX_WideString & swText, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
+ m_pEdit(pEdit),
+ m_wpOld(wpOldPlace),
+ m_wpNew(wpNewPlace),
+ m_swText(swText),
+ m_nCharset(charset),
+ m_SecProps(),
+ m_WordProps()
+{
+ if (pSecProps)
+ m_SecProps = *pSecProps;
+ if (pWordProps)
+ m_WordProps = *pWordProps;
+}
+
+CFXEU_InsertText::~CFXEU_InsertText()
+{
+}
+
+void CFXEU_InsertText::Redo()
+{
+ if (m_pEdit && IsLast())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetCaret(m_wpOld);
+ m_pEdit->InsertText(m_swText, m_nCharset,&m_SecProps, &m_WordProps,FALSE,TRUE);
+ }
+}
+
+void CFXEU_InsertText::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->SetSel(m_wpOld,m_wpNew);
+ m_pEdit->Clear(FALSE,TRUE);
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+CFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
+ const CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops,
+ const CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range)
+ : m_pEdit(pEdit),
+ m_wpPlace(place),
+ m_eProps(ep),
+ m_OldSecProps(oldsecprops),
+ m_NewSecProps(newsecprops),
+ m_OldWordProps(oldwordprops),
+ m_NewWordProps(newwordprops),
+ m_wrPlace(range)
+{
+}
+
+CFXEU_SetSecProps::~CFXEU_SetSecProps()
+{
+}
+
+void CFXEU_SetSecProps::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_NewSecProps,&m_NewWordProps,m_wrPlace,FALSE);
+ if (IsLast())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+ m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+ }
+ }
+}
+
+void CFXEU_SetSecProps::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_OldSecProps,&m_OldWordProps,m_wrPlace,FALSE);
+ if (IsFirst())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+ m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+ }
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+CFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
+ const CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range)
+ : m_pEdit(pEdit),
+ m_wpPlace(place),
+ m_eProps(ep),
+ m_OldWordProps(oldprops),
+ m_NewWordProps(newprops),
+ m_wrPlace(range)
+{
+}
+
+CFXEU_SetWordProps::~CFXEU_SetWordProps()
+{
+}
+
+void CFXEU_SetWordProps::Redo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_NewWordProps,m_wrPlace,FALSE);
+ if (IsLast())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+ m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+ }
+ }
+}
+
+void CFXEU_SetWordProps::Undo()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_OldWordProps,m_wrPlace,FALSE);
+ if (IsFirst())
+ {
+ m_pEdit->SelectNone();
+ m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
+ m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
+ }
+ }
+}
+
+/* ------------------------------------- CFX_Edit ------------------------------------- */
+
+CFX_Edit::CFX_Edit(IPDF_VariableText * pVT) :
+ m_pVT(pVT),
+ m_pNotify(NULL),
+ m_pOprNotify(NULL),
+ m_wpCaret(-1,-1,-1),
+ m_wpOldCaret(-1,-1,-1),
+ m_ptScrollPos(0,0),
+ m_ptRefreshScrollPos(0,0),
+ m_bEnableScroll(FALSE),
+ m_bEnableOverflow(FALSE),
+ m_pVTProvide(NULL),
+ m_pIterator(NULL),
+ m_SelState(),
+ m_ptCaret(0.0f,0.0f),
+ m_Undo(FX_EDIT_UNDO_MAXITEM),
+ m_nAlignment(0),
+ m_bNotifyFlag(FALSE),
+ m_bEnableRefresh(TRUE),
+ m_rcOldContent(0.0f,0.0f,0.0f,0.0f),
+ m_bEnableUndo(TRUE),
+ m_bNotify(TRUE),
+ m_bOprNotify(FALSE),
+ m_pGroupUndoItem(NULL)
+{
+ ASSERT(pVT != NULL);
+}
+
+CFX_Edit::~CFX_Edit()
+{
+ if (m_pVTProvide)
+ {
+ delete m_pVTProvide;
+ m_pVTProvide = NULL;
+ }
+
+ if (m_pIterator)
+ {
+ delete m_pIterator;
+ m_pIterator = NULL;
+ }
+
+ ASSERT(m_pGroupUndoItem == NULL);
+}
+
+// public methods
+
+void CFX_Edit::Initialize()
+{
+ m_pVT->Initialize();
+ SetCaret(m_pVT->GetBeginWordPlace());
+ SetCaretOrigin();
+}
+
+void CFX_Edit::SetFontMap(IFX_Edit_FontMap * pFontMap)
+{
+ if (m_pVTProvide)
+ delete m_pVTProvide;
+
+ m_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap));
+}
+
+void CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider)
+{
+ m_pVT->SetProvider(pProvider);
+}
+
+void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify)
+{
+ m_pNotify = pNotify;
+}
+
+void CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify)
+{
+ m_pOprNotify = pOprNotify;
+}
+
+IFX_Edit_Iterator * CFX_Edit::GetIterator()
+{
+ if (!m_pIterator)
+ m_pIterator = new CFX_Edit_Iterator(this,m_pVT->GetIterator());
+
+ return m_pIterator;
+}
+
+IPDF_VariableText * CFX_Edit::GetVariableText()
+{
+ return m_pVT;
+}
+
+IFX_Edit_FontMap* CFX_Edit::GetFontMap()
+{
+ if (m_pVTProvide)
+ return m_pVTProvide->GetFontMap();
+
+ return NULL;
+}
+
+void CFX_Edit::SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetPlateRect(rect);
+ m_ptScrollPos = CPDF_Point(rect.left,rect.top);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAlignmentH(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAlignment(nFormat);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAlignmentV(FX_INT32 nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_nAlignment = nFormat;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetPasswordChar(FX_WORD wSubWord/* ='*' */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetPasswordChar(wSubWord);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetLimitChar(FX_INT32 nLimitChar/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetLimitChar(nLimitChar);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetCharArray(FX_INT32 nCharArray/* =0 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetCharArray(nCharArray);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace/* =0.0f */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetCharSpace(fCharSpace);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetHorzScale(FX_INT32 nHorzScale/* =100 */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetHorzScale(nHorzScale);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetMultiLine(bMultiLine);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoReturn(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAutoReturn(bAuto);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetLineLeading(fLineLeading);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetAutoFontSize(bAuto);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetFontSize(fFontSize);
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetAutoScroll(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_bEnableScroll = bAuto;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_bEnableOverflow = bAllowed;
+ if (bPaint) Paint();
+}
+
+void CFX_Edit::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ if (m_pVT->IsValid())
+ {
+ if (nStartChar == 0 && nEndChar < 0)
+ {
+ SelectAll();
+ }
+ else if (nStartChar < 0)
+ {
+ this->SelectNone();
+ }
+ else
+ {
+ if (nStartChar < nEndChar)
+ {
+ SetSel(m_pVT->WordIndexToWordPlace(nStartChar),m_pVT->WordIndexToWordPlace(nEndChar));
+ }
+ else
+ {
+ SetSel(m_pVT->WordIndexToWordPlace(nEndChar),m_pVT->WordIndexToWordPlace(nStartChar));
+ }
+ }
+ }
+}
+
+void CFX_Edit::SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
+{
+ if (m_pVT->IsValid())
+ {
+ SelectNone();
+
+ m_SelState.Set(begin,end);
+
+ SetCaret(m_SelState.EndPos);
+
+ if (m_SelState.IsExist())
+ {
+ ScrollToCaret();
+ CPVT_WordRange wr(m_SelState.BeginPos,m_SelState.EndPos);
+ Refresh(RP_OPTIONAL,&wr);
+ SetCaretInfo();
+ }
+ else
+ {
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ }
+}
+
+void CFX_Edit::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
+{
+ nStartChar = -1;
+ nEndChar = -1;
+
+ if (m_pVT->IsValid())
+ {
+ if (m_SelState.IsExist())
+ {
+ if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+ {
+ nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
+ nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
+ }
+ else
+ {
+ nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
+ nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
+ }
+ }
+ else
+ {
+ nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
+ nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
+ }
+ }
+}
+
+FX_INT32 CFX_Edit::GetCaret() const
+{
+ if (m_pVT->IsValid())
+ return m_pVT->WordPlaceToWordIndex(m_wpCaret);
+
+ return -1;
+}
+
+CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const
+{
+ return m_wpCaret;
+}
+
+CFX_WideString CFX_Edit::GetText() const
+{
+ CFX_WideString swRet;
+
+ if (m_pVT->IsValid())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ FX_BOOL bRich = m_pVT->IsRichText();
+
+ pIterator->SetAt(0);
+
+ CPVT_Word wordinfo;
+ CPVT_WordPlace oldplace = pIterator->GetAt();
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+
+ if (pIterator->GetWord(wordinfo))
+ {
+ if (bRich)
+ {
+ swRet += wordinfo.Word;
+ }
+ else
+ {
+ swRet += wordinfo.Word;
+ }
+ }
+
+ if (oldplace.SecCmp(place) != 0)
+ {
+ swRet += 0x0D;
+ swRet += 0x0A;
+ }
+
+ oldplace = place;
+ }
+ }
+ }
+
+ return swRet;
+}
+
+CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange & range) const
+{
+ CFX_WideString swRet;
+
+ if (m_pVT->IsValid())
+ {
+ FX_BOOL bRich = m_pVT->IsRichText();
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordRange wrTemp = range;
+ m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+ m_pVT->UpdateWordPlace(wrTemp.EndPos);
+ pIterator->SetAt(wrTemp.BeginPos);
+
+ CPVT_Word wordinfo;
+ CPVT_WordPlace oldplace = wrTemp.BeginPos;
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (place.WordCmp(wrTemp.EndPos) > 0)break;
+
+ if (pIterator->GetWord(wordinfo))
+ {
+ if (bRich)
+ {
+ swRet += wordinfo.Word;
+ }
+ else
+ {
+ swRet += wordinfo.Word;
+ }
+ }
+
+ if (oldplace.SecCmp(place) != 0)
+ {
+ swRet += 0x0D;
+ swRet += 0x0A;
+ }
+
+ oldplace = place;
+ }
+ }
+ }
+
+ return swRet;
+}
+
+CFX_WideString CFX_Edit::GetSelText() const
+{
+ return GetRangeText(m_SelState.ConvertToWordRange());
+}
+
+FX_INT32 CFX_Edit::GetTotalWords() const
+{
+ return m_pVT->GetTotalWords();
+}
+
+FX_INT32 CFX_Edit::GetTotalLines() const
+{
+ FX_INT32 nLines = 0;
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(0);
+ while (pIterator->NextLine())
+ nLines++;
+ }
+
+ return nLines+1;
+}
+
+CPVT_WordRange CFX_Edit::GetSelectWordRange() const
+{
+ return m_SelState.ConvertToWordRange();
+}
+
+CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)
+{
+ CPVT_WordRange wrRet;
+
+ if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
+ {
+ wrRet.BeginPos = wr1.BeginPos;
+ }
+ else
+ {
+ wrRet.BeginPos = wr2.BeginPos;
+ }
+
+ if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
+ {
+ wrRet.EndPos = wr2.EndPos;
+ }
+ else
+ {
+ wrRet.EndPos = wr1.EndPos;
+ }
+
+ return wrRet;
+}
+
+FX_BOOL CFX_Edit::IsRichText() const
+{
+ return m_pVT->IsRichText();
+}
+
+void CFX_Edit::SetRichText(FX_BOOL bRichText/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pVT->SetRichText(bRichText);
+ if (bPaint) Paint();
+}
+
+FX_BOOL CFX_Edit::SetRichFontIndex(FX_INT32 nFontIndex)
+{
+ CPVT_WordProps WordProps;
+ WordProps.nFontIndex = nFontIndex;
+ return SetRichTextProps(EP_FONTINDEX,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize)
+{
+ CPVT_WordProps WordProps;
+ WordProps.fFontSize = fFontSize;
+ return SetRichTextProps(EP_FONTSIZE,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor)
+{
+ CPVT_WordProps WordProps;
+ WordProps.dwWordColor = dwColor;
+ return SetRichTextProps(EP_WORDCOLOR,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextScript(FX_INT32 nScriptType)
+{
+ CPVT_WordProps WordProps;
+ WordProps.nScriptType = nScriptType;
+ return SetRichTextProps(EP_SCRIPTTYPE,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold)
+{
+ CPVT_WordProps WordProps;
+ if (bBold)
+ WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+ return SetRichTextProps(EP_BOLD,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic)
+{
+ CPVT_WordProps WordProps;
+ if (bItalic)
+ WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+ return SetRichTextProps(EP_ITALIC,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline)
+{
+ CPVT_WordProps WordProps;
+ if (bUnderline)
+ WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+ return SetRichTextProps(EP_UNDERLINE,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout)
+{
+ CPVT_WordProps WordProps;
+ if (bCrossout)
+ WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+ return SetRichTextProps(EP_CROSSOUT,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace)
+{
+ CPVT_WordProps WordProps;
+ WordProps.fCharSpace = fCharSpace;
+ return SetRichTextProps(EP_CHARSPACE,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextHorzScale(FX_INT32 nHorzScale /*= 100*/)
+{
+ CPVT_WordProps WordProps;
+ WordProps.nHorzScale = nHorzScale;
+ return SetRichTextProps(EP_HORZSCALE,NULL,&WordProps);
+}
+
+FX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading)
+{
+ CPVT_SecProps SecProps;
+ SecProps.fLineLeading = fLineLeading;
+ return SetRichTextProps(EP_LINELEADING,&SecProps,NULL);
+}
+
+FX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent)
+{
+ CPVT_SecProps SecProps;
+ SecProps.fLineIndent = fLineIndent;
+ return SetRichTextProps(EP_LINEINDENT,&SecProps,NULL);
+}
+
+FX_BOOL CFX_Edit::SetRichTextAlignment(FX_INT32 nAlignment)
+{
+ CPVT_SecProps SecProps;
+ SecProps.nAlignment = nAlignment;
+ return SetRichTextProps(EP_ALIGNMENT,&SecProps,NULL);
+}
+
+FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps, const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
+{
+ FX_BOOL bSet = FALSE;
+ FX_BOOL bSet1,bSet2;
+ if (m_pVT->IsValid() && m_pVT->IsRichText())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
+
+ m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+ m_pVT->UpdateWordPlace(wrTemp.EndPos);
+ pIterator->SetAt(wrTemp.BeginPos);
+
+ BeginGroupUndo(L"");;
+
+ bSet = SetSecProps(eProps,wrTemp.BeginPos,pSecProps,pWordProps,wrTemp,TRUE);
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (place.WordCmp(wrTemp.EndPos) > 0) break;
+ bSet1 = SetSecProps(eProps,place,pSecProps,pWordProps,wrTemp,TRUE);
+ bSet2 = SetWordProps(eProps,place,pWordProps,wrTemp,TRUE);
+
+ if (!bSet)
+ bSet = (bSet1 || bSet2);
+ }
+
+ EndGroupUndo();
+
+ if (bSet)
+ {
+ PaintSetProps(eProps,wrTemp);
+ }
+ }
+ }
+
+ return bSet;
+}
+
+void CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr)
+{
+ switch(eProps)
+ {
+ case EP_LINELEADING:
+ case EP_LINEINDENT:
+ case EP_ALIGNMENT:
+ RearrangePart(wr);
+ ScrollToCaret();
+ Refresh(RP_ANALYSE);
+ SetCaretOrigin();
+ SetCaretInfo();
+ break;
+ case EP_WORDCOLOR:
+ case EP_UNDERLINE:
+ case EP_CROSSOUT:
+ Refresh(RP_OPTIONAL,&wr);
+ break;
+ case EP_FONTINDEX:
+ case EP_FONTSIZE:
+ case EP_SCRIPTTYPE:
+ case EP_CHARSPACE:
+ case EP_HORZSCALE:
+ case EP_BOLD:
+ case EP_ITALIC:
+ RearrangePart(wr);
+ ScrollToCaret();
+
+ CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos),
+ m_pVT->GetSectionEndPlace(wr.EndPos));
+ Refresh(RP_ANALYSE,&wrRefresh);
+
+ SetCaretOrigin();
+ SetCaretInfo();
+ break;
+ }
+}
+
+FX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps,
+ const CPVT_WordRange & wr, FX_BOOL bAddUndo)
+{
+ if (m_pVT->IsValid() && m_pVT->IsRichText())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ FX_BOOL bSet = FALSE;
+ CPVT_Section secinfo;
+ CPVT_Section OldSecinfo;
+
+ CPVT_WordPlace oldplace = pIterator->GetAt();
+
+ if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || eProps == EP_ALIGNMENT)
+ {
+ if (pSecProps)
+ {
+ pIterator->SetAt(place);
+ if (pIterator->GetSection(secinfo))
+ {
+ if (bAddUndo) OldSecinfo = secinfo;
+
+ switch(eProps)
+ {
+ case EP_LINELEADING:
+ if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,pSecProps->fLineLeading))
+ {
+ secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
+ bSet = TRUE;
+ }
+ break;
+ case EP_LINEINDENT:
+ if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,pSecProps->fLineIndent))
+ {
+ secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
+ bSet = TRUE;
+ }
+ break;
+ case EP_ALIGNMENT:
+ if (secinfo.SecProps.nAlignment != pSecProps->nAlignment)
+ {
+ secinfo.SecProps.nAlignment = pSecProps->nAlignment;
+ bSet = TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (pWordProps && place == m_pVT->GetSectionBeginPlace(place))
+ {
+ pIterator->SetAt(place);
+ if (pIterator->GetSection(secinfo))
+ {
+ if (bAddUndo) OldSecinfo = secinfo;
+
+ switch(eProps)
+ {
+ case EP_FONTINDEX:
+ if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
+ {
+ secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
+ bSet = TRUE;
+ }
+ break;
+ case EP_FONTSIZE:
+ if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,pWordProps->fFontSize))
+ {
+ secinfo.WordProps.fFontSize = pWordProps->fFontSize;
+ bSet = TRUE;
+ }
+ break;
+ case EP_WORDCOLOR:
+ if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
+ {
+ secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+ bSet = TRUE;
+ }
+ break;
+ case EP_SCRIPTTYPE:
+ if (secinfo.WordProps.nScriptType != pWordProps->nScriptType)
+ {
+ secinfo.WordProps.nScriptType = pWordProps->nScriptType;
+ bSet = TRUE;
+ }
+ break;
+ case EP_CHARSPACE:
+ if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
+ {
+ secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+ bSet = TRUE;
+ }
+ break;
+ case EP_HORZSCALE:
+ if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
+ {
+ secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+ bSet = TRUE;
+ }
+ break;
+ case EP_UNDERLINE:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
+ {
+ secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
+ {
+ secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_CROSSOUT:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
+ {
+ secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
+ {
+ secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_BOLD:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
+ {
+ secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
+ {
+ secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_ITALIC:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
+ {
+ secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
+ {
+ secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+ bSet = TRUE;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+
+ if (bSet)
+ {
+ pIterator->SetSection(secinfo);
+
+ if (bAddUndo && m_bEnableUndo)
+ {
+ AddEditUndoItem(new CFXEU_SetSecProps
+ (this,place,eProps,OldSecinfo.SecProps,OldSecinfo.WordProps,secinfo.SecProps,secinfo.WordProps,wr));
+ }
+ }
+
+ pIterator->SetAt(oldplace);
+
+ return bSet;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place,
+ const CPVT_WordProps * pWordProps, const CPVT_WordRange & wr, FX_BOOL bAddUndo)
+{
+ if (m_pVT->IsValid() && m_pVT->IsRichText())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ FX_BOOL bSet = FALSE;
+ CPVT_Word wordinfo;
+ CPVT_Word OldWordinfo;
+
+ CPVT_WordPlace oldplace = pIterator->GetAt();
+
+ if (pWordProps)
+ {
+ pIterator->SetAt(place);
+ if (pIterator->GetWord(wordinfo))
+ {
+ if (bAddUndo) OldWordinfo = wordinfo;
+
+ switch(eProps)
+ {
+ case EP_FONTINDEX:
+ if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex)
+ {
+ if (IFX_Edit_FontMap* pFontMap = this->GetFontMap())
+ {
+ wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(wordinfo.Word,wordinfo.nCharset,pWordProps->nFontIndex);
+ }
+ bSet = TRUE;
+ }
+ break;
+ case EP_FONTSIZE:
+ if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,pWordProps->fFontSize))
+ {
+ wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
+ bSet = TRUE;
+ }
+ break;
+ case EP_WORDCOLOR:
+ if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor)
+ {
+ wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
+ bSet = TRUE;
+ }
+ break;
+ case EP_SCRIPTTYPE:
+ if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType)
+ {
+ wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
+ bSet = TRUE;
+ }
+ break;
+ case EP_CHARSPACE:
+ if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,pWordProps->fCharSpace))
+ {
+ wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
+ bSet = TRUE;
+ }
+ break;
+ case EP_HORZSCALE:
+ if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale)
+ {
+ wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
+ bSet = TRUE;
+ }
+ break;
+ case EP_UNDERLINE:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) == 0)
+ {
+ wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) != 0)
+ {
+ wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_CROSSOUT:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) == 0)
+ {
+ wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) != 0)
+ {
+ wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_BOLD:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0)
+ {
+ wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0)
+ {
+ wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
+ bSet = TRUE;
+ }
+ }
+ break;
+ case EP_ITALIC:
+ if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) == 0)
+ {
+ wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
+ bSet = TRUE;
+ }
+ }
+ else
+ {
+ if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) != 0)
+ {
+ wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
+ bSet = TRUE;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (bSet)
+ {
+ pIterator->SetWord(wordinfo);
+
+ if (bAddUndo && m_bEnableUndo)
+ {
+ AddEditUndoItem(new CFXEU_SetWordProps
+ (this,place,eProps,OldWordinfo.WordProps,wordinfo.WordProps,wr));
+ }
+ }
+
+ pIterator->SetAt(oldplace);
+ return bSet;
+ }
+ }
+
+ return FALSE;
+}
+
+void CFX_Edit::SetText(FX_LPCWSTR text,FX_INT32 charset /*= DEFAULT_CHARSET*/,
+ const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ SetText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 charset /*= DEFAULT_CHARSET*/, const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ return InsertWord(word,charset,pWordProps,TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ return InsertReturn(pSecProps,pWordProps,TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::Backspace()
+{
+ return Backspace(TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::Delete()
+{
+ return Delete(TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::Clear()
+{
+ return Clear(TRUE,TRUE);
+}
+
+FX_BOOL CFX_Edit::InsertText(FX_LPCWSTR text, FX_INT32 charset /*= DEFAULT_CHARSET*/,
+ const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/)
+{
+ return InsertText(text,charset,pSecProps,pWordProps,TRUE,TRUE);
+}
+
+FX_FLOAT CFX_Edit::GetFontSize() const
+{
+ return m_pVT->GetFontSize();
+}
+
+FX_WORD CFX_Edit::GetPasswordChar() const
+{
+ return m_pVT->GetPasswordChar();
+}
+
+FX_INT32 CFX_Edit::GetCharArray() const
+{
+ return m_pVT->GetCharArray();
+}
+
+CPDF_Rect CFX_Edit::GetPlateRect() const
+{
+ return m_pVT->GetPlateRect();
+}
+
+CPDF_Rect CFX_Edit::GetContentRect() const
+{
+ return VTToEdit(m_pVT->GetContentRect());
+}
+
+FX_INT32 CFX_Edit::GetHorzScale() const
+{
+ return m_pVT->GetHorzScale();
+}
+
+FX_FLOAT CFX_Edit::GetCharSpace() const
+{
+ return m_pVT->GetCharSpace();
+}
+
+// inner methods
+
+CPVT_WordRange CFX_Edit::GetWholeWordRange() const
+{
+ if (m_pVT->IsValid())
+ return CPVT_WordRange(m_pVT->GetBeginWordPlace(),m_pVT->GetEndWordPlace());
+
+ return CPVT_WordRange();
+}
+
+CPVT_WordRange CFX_Edit::GetVisibleWordRange() const
+{
+ if (m_bEnableOverflow) return GetWholeWordRange();
+
+ if (m_pVT->IsValid())
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ CPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left,rcPlate.top)));
+ CPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.right,rcPlate.bottom)));
+
+ return CPVT_WordRange(place1,place2);
+ }
+
+ return CPVT_WordRange();
+}
+
+CPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& point) const
+{
+ if (m_pVT->IsValid())
+ {
+ return m_pVT->SearchWordPlace(EditToVT(point));
+ }
+
+ return CPVT_WordPlace();
+}
+
+void CFX_Edit::Paint()
+{
+ if (m_pVT->IsValid())
+ {
+ RearrangeAll();
+ ScrollToCaret();
+ Refresh(RP_NOANALYSE);
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+}
+
+void CFX_Edit::RearrangeAll()
+{
+ if (m_pVT->IsValid())
+ {
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ m_pVT->RearrangeAll();
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ SetScrollInfo();
+ SetContentChanged();
+ }
+}
+
+void CFX_Edit::RearrangePart(const CPVT_WordRange & range)
+{
+ if (m_pVT->IsValid())
+ {
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ m_pVT->RearrangePart(range);
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ SetScrollInfo();
+ SetContentChanged();
+ }
+}
+
+void CFX_Edit::SetContentChanged()
+{
+ if (m_bNotify && m_pNotify)
+ {
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ if (rcContent.Width() != m_rcOldContent.Width() ||
+ rcContent.Height() != m_rcOldContent.Height())
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnContentChange(rcContent);
+ m_bNotifyFlag = FALSE;
+ }
+ m_rcOldContent = rcContent;
+ }
+ }
+}
+
+void CFX_Edit::SelectAll()
+{
+ if (m_pVT->IsValid())
+ {
+ m_SelState = GetWholeWordRange();
+ SetCaret(m_SelState.EndPos);
+
+ ScrollToCaret();
+ CPVT_WordRange wrVisible = GetVisibleWordRange();
+ Refresh(RP_OPTIONAL,&wrVisible);
+ SetCaretInfo();
+ }
+}
+
+void CFX_Edit::SelectNone()
+{
+ if (m_pVT->IsValid())
+ {
+ if (m_SelState.IsExist())
+ {
+ CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
+ m_SelState.Default();
+ Refresh(RP_OPTIONAL,&wrTemp);
+ }
+ }
+}
+
+FX_BOOL CFX_Edit::IsSelected() const
+{
+ return m_SelState.IsExist();
+}
+
+CPDF_Point CFX_Edit::VTToEdit(const CPDF_Point & point) const
+{
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ FX_FLOAT fPadding = 0.0f;
+
+ switch (m_nAlignment)
+ {
+ case 0:
+ fPadding = 0.0f;
+ break;
+ case 1:
+ fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
+ break;
+ case 2:
+ fPadding = rcPlate.Height() - rcContent.Height();
+ break;
+ }
+
+ return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+ point.y - (m_ptScrollPos.y + fPadding - rcPlate.top));
+}
+
+CPDF_Point CFX_Edit::EditToVT(const CPDF_Point & point) const
+{
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ FX_FLOAT fPadding = 0.0f;
+
+ switch (m_nAlignment)
+ {
+ case 0:
+ fPadding = 0.0f;
+ break;
+ case 1:
+ fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
+ break;
+ case 2:
+ fPadding = rcPlate.Height() - rcContent.Height();
+ break;
+ }
+
+ return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
+ point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
+}
+
+CPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+CPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+void CFX_Edit::SetScrollInfo()
+{
+ if (m_bNotify && m_pNotify)
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right,
+ rcContent.left, rcContent.right, rcPlate.Width() / 3, rcPlate.Width());
+
+ m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
+ rcContent.bottom, rcContent.top, rcPlate.Height() / 3, rcPlate.Height());
+ m_bNotifyFlag = FALSE;
+ }
+ }
+}
+
+void CFX_Edit::SetScrollPosX(FX_FLOAT fx)
+{
+ if (!m_bEnableScroll) return;
+
+ if (m_pVT->IsValid())
+ {
+ if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x,fx))
+ {
+ m_ptScrollPos.x = fx;
+ Refresh(RP_NOANALYSE);
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetScrollPosX(fx);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+ }
+}
+
+void CFX_Edit::SetScrollPosY(FX_FLOAT fy)
+{
+ if (!m_bEnableScroll) return;
+
+ if (m_pVT->IsValid())
+ {
+ if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))
+ {
+ m_ptScrollPos.y = fy;
+ Refresh(RP_NOANALYSE);
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetScrollPosY(fy);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+ }
+}
+
+void CFX_Edit::SetScrollPos(const CPDF_Point & point)
+{
+ SetScrollPosX(point.x);
+ SetScrollPosY(point.y);
+ SetScrollLimit();
+ SetCaretInfo();
+}
+
+CPDF_Point CFX_Edit::GetScrollPos() const
+{
+ return m_ptScrollPos;
+}
+
+void CFX_Edit::SetScrollLimit()
+{
+ if (m_pVT->IsValid())
+ {
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ if (rcPlate.Width() > rcContent.Width())
+ {
+ SetScrollPosX(rcPlate.left);
+ }
+ else
+ {
+ if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left))
+ {
+ SetScrollPosX(rcContent.left);
+ }
+ else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, rcContent.right - rcPlate.Width()))
+ {
+ SetScrollPosX(rcContent.right - rcPlate.Width());
+ }
+ }
+
+ if (rcPlate.Height() > rcContent.Height())
+ {
+ SetScrollPosY(rcPlate.top);
+ }
+ else
+ {
+ if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, rcContent.bottom + rcPlate.Height()))
+ {
+ SetScrollPosY(rcContent.bottom + rcPlate.Height());
+ }
+ else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top))
+ {
+ SetScrollPosY(rcContent.top);
+ }
+ }
+ }
+}
+
+void CFX_Edit::ScrollToCaret()
+{
+ SetScrollLimit();
+
+ if (m_pVT->IsValid())
+ {
+ CPDF_Point ptHead(0,0);
+ CPDF_Point ptFoot(0,0);
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_wpCaret);
+
+ CPVT_Word word;
+ CPVT_Line line;
+ if (pIterator->GetWord(word))
+ {
+ ptHead.x = word.ptWord.x + word.fWidth;
+ ptHead.y = word.ptWord.y + word.fAscent;
+ ptFoot.x = word.ptWord.x + word.fWidth;
+ ptFoot.y = word.ptWord.y + word.fDescent;
+ }
+ else if (pIterator->GetLine(line))
+ {
+ ptHead.x = line.ptLine.x;
+ ptHead.y = line.ptLine.y + line.fLineAscent;
+ ptFoot.x = line.ptLine.x;
+ ptFoot.y = line.ptLine.y + line.fLineDescent;
+ }
+ }
+
+ CPDF_Point ptHeadEdit = VTToEdit(ptHead);
+ CPDF_Point ptFootEdit = VTToEdit(ptFoot);
+
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+
+ if (!FX_EDIT_IsFloatEqual(rcPlate.left,rcPlate.right))
+ {
+ if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
+ FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left))
+ {
+ SetScrollPosX(ptHead.x);
+ }
+ else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right))
+ {
+ SetScrollPosX(ptHead.x - rcPlate.Width());
+ }
+ }
+
+ if (!FX_EDIT_IsFloatEqual(rcPlate.top,rcPlate.bottom))
+ {
+ if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
+ FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom))
+ {
+ if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top))
+ {
+ SetScrollPosY(ptFoot.y + rcPlate.Height());
+ }
+ }
+ else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top))
+ {
+ if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom))
+ {
+ SetScrollPosY(ptHead.y);
+ }
+ }
+ }
+ }
+}
+
+void CFX_Edit::Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1,const CPVT_WordRange * pRange2)
+{
+ if (m_bEnableRefresh && m_pVT->IsValid())
+ {
+ m_Refresh.BeginRefresh();
+ RefreshPushLineRects(GetVisibleWordRange());
+
+// if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
+// !FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
+// {
+ m_Refresh.NoAnalyse();
+ m_ptRefreshScrollPos = m_ptScrollPos;
+// }
+// else
+// {
+// switch (ePlan)
+// {
+// case RP_ANALYSE:
+// m_Refresh.Analyse(m_pVT->GetAlignment());
+//
+// if (pRange1) RefreshPushRandomRects(*pRange1);
+// if (pRange2) RefreshPushRandomRects(*pRange2);
+// break;
+// case RP_NOANALYSE:
+// m_Refresh.NoAnalyse();
+// break;
+// case RP_OPTIONAL:
+// if (pRange1) RefreshPushRandomRects(*pRange1);
+// if (pRange2) RefreshPushRandomRects(*pRange2);
+// break;
+// }
+// }
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ if (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRects())
+ {
+ for (FX_INT32 i = 0, sz = pRects->GetSize(); i < sz; i++)
+ m_pNotify->IOnInvalidateRect(pRects->GetAt(i));
+ }
+ m_bNotifyFlag = FALSE;
+ }
+ }
+
+ m_Refresh.EndRefresh();
+ }
+}
+
+void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange & wr)
+{
+ if (m_pVT->IsValid())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordPlace wpBegin = wr.BeginPos;
+ m_pVT->UpdateWordPlace(wpBegin);
+ CPVT_WordPlace wpEnd = wr.EndPos;
+ m_pVT->UpdateWordPlace(wpEnd);
+ pIterator->SetAt(wpBegin);
+
+ CPVT_Line lineinfo;
+ do
+ {
+ if (!pIterator->GetLine(lineinfo))break;
+ if (lineinfo.lineplace.LineCmp(wpEnd) > 0)break;
+
+ CPDF_Rect rcLine(lineinfo.ptLine.x,
+ lineinfo.ptLine.y + lineinfo.fLineDescent,
+ lineinfo.ptLine.x + lineinfo.fLineWidth,
+ lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+ m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace,lineinfo.lineEnd),VTToEdit(rcLine));
+
+ }while (pIterator->NextLine());
+ }
+ }
+}
+
+void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange & wr)
+{
+ if (m_pVT->IsValid())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordRange wrTemp = wr;
+
+ m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+ m_pVT->UpdateWordPlace(wrTemp.EndPos);
+ pIterator->SetAt(wrTemp.BeginPos);
+
+ CPVT_Word wordinfo;
+ CPVT_Line lineinfo;
+ CPVT_WordPlace place;
+
+ while (pIterator->NextWord())
+ {
+ place = pIterator->GetAt();
+ if (place.WordCmp(wrTemp.EndPos) > 0) break;
+
+ pIterator->GetWord(wordinfo);
+ pIterator->GetLine(lineinfo);
+
+ if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
+ {
+ CPDF_Rect rcWord(wordinfo.ptWord.x,
+ lineinfo.ptLine.y + lineinfo.fLineDescent,
+ wordinfo.ptWord.x + wordinfo.fWidth,
+ lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+ m_Refresh.AddRefresh(VTToEdit(rcWord));
+ }
+ else
+ {
+ CPDF_Rect rcLine(lineinfo.ptLine.x,
+ lineinfo.ptLine.y + lineinfo.fLineDescent,
+ lineinfo.ptLine.x + lineinfo.fLineWidth,
+ lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+ m_Refresh.AddRefresh(VTToEdit(rcLine));
+
+ pIterator->NextLine();
+ }
+ }
+ }
+ }
+}
+
+void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr)
+{
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordRange wrTemp = wr;
+
+ m_pVT->UpdateWordPlace(wrTemp.BeginPos);
+ m_pVT->UpdateWordPlace(wrTemp.EndPos);
+ pIterator->SetAt(wrTemp.BeginPos);
+
+ CPVT_Word wordinfo;
+ CPVT_Line lineinfo;
+ CPVT_WordPlace place;
+
+ while (pIterator->NextWord())
+ {
+ place = pIterator->GetAt();
+ if (place.WordCmp(wrTemp.EndPos) > 0) break;
+
+ pIterator->GetWord(wordinfo);
+ pIterator->GetLine(lineinfo);
+
+ if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndPos) == 0)
+ {
+ CPDF_Rect rcWord(wordinfo.ptWord.x,
+ lineinfo.ptLine.y + lineinfo.fLineDescent,
+ wordinfo.ptWord.x + wordinfo.fWidth,
+ lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect rcRefresh = VTToEdit(rcWord);
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+ else
+ {
+ CPDF_Rect rcLine(lineinfo.ptLine.x,
+ lineinfo.ptLine.y + lineinfo.fLineDescent,
+ lineinfo.ptLine.x + lineinfo.fLineWidth,
+ lineinfo.ptLine.y + lineinfo.fLineAscent);
+
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect rcRefresh = VTToEdit(rcLine);
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+
+ pIterator->NextLine();
+ }
+ }
+ }
+}
+
+void CFX_Edit::SetCaret(const CPVT_WordPlace & place)
+{
+ m_wpOldCaret = m_wpCaret;
+ m_wpCaret = place;
+}
+
+void CFX_Edit::SetCaretInfo()
+{
+ if (m_bNotify && m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ CPDF_Point ptHead(0.0f,0.0f),ptFoot(0.0f,0.0f);
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_wpCaret);
+ CPVT_Word word;
+ CPVT_Line line;
+ if (pIterator->GetWord(word))
+ {
+ ptHead.x = word.ptWord.x + word.fWidth;
+ ptHead.y = word.ptWord.y + word.fAscent;
+ ptFoot.x = word.ptWord.x + word.fWidth;
+ ptFoot.y = word.ptWord.y + word.fDescent;
+ }
+ else if (pIterator->GetLine(line))
+ {
+ ptHead.x = line.ptLine.x;
+ ptHead.y = line.ptLine.y + line.fLineAscent;
+ ptFoot.x = line.ptLine.x;
+ ptFoot.y = line.ptLine.y + line.fLineDescent;
+ }
+ }
+
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetCaret(!m_SelState.IsExist(),VTToEdit(ptHead),VTToEdit(ptFoot), m_wpCaret);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+
+ SetCaretChange();
+}
+
+void CFX_Edit::SetCaretChange()
+{
+ if (this->m_wpCaret == this->m_wpOldCaret) return;
+
+ if (m_bNotify && m_pVT->IsRichText() && m_pNotify)
+ {
+ CPVT_SecProps SecProps;
+ CPVT_WordProps WordProps;
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_wpCaret);
+ CPVT_Word word;
+ CPVT_Section section;
+
+ if (pIterator->GetSection(section))
+ {
+ SecProps = section.SecProps;
+ WordProps = section.WordProps;
+ }
+
+ if (pIterator->GetWord(word))
+ {
+ WordProps = word.WordProps;
+ }
+ }
+
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnCaretChange(SecProps,WordProps);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+}
+
+void CFX_Edit::SetCaret(FX_INT32 nPos)
+{
+ if (m_pVT->IsValid())
+ {
+ SelectNone();
+ SetCaret(m_pVT->WordIndexToWordPlace(nPos));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+}
+
+void CFX_Edit::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ SelectNone();
+ SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+}
+
+void CFX_Edit::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
+
+ if (m_wpCaret != m_wpOldCaret)
+ {
+ m_SelState.SetEndPos(m_wpCaret);
+
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+ Refresh(RP_OPTIONAL,&wr);
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+ }
+}
+
+void CFX_Edit::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ SetCaret(m_pVT->GetUpWordPlace(m_wpCaret,m_ptCaret));
+
+ if (bShift)
+ {
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret,m_wpCaret);
+
+ if (m_wpOldCaret != m_wpCaret)
+ {
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+ Refresh(RP_OPTIONAL, &wr);
+ SetCaretInfo();
+ }
+ }
+ else
+ {
+ SelectNone();
+
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ }
+}
+
+void CFX_Edit::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ SetCaret(m_pVT->GetDownWordPlace(m_wpCaret,m_ptCaret));
+
+ if (bShift)
+ {
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret,m_wpCaret);
+
+ if (m_wpOldCaret != m_wpCaret)
+ {
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+ Refresh(RP_OPTIONAL, &wr);
+ SetCaretInfo();
+ }
+ }
+ else
+ {
+ SelectNone();
+
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ }
+}
+
+void CFX_Edit::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ if (bShift)
+ {
+ if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
+ m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
+ SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+
+ SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret, m_wpCaret);
+
+ if (m_wpOldCaret != m_wpCaret)
+ {
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+ Refresh(RP_OPTIONAL,&wr);
+ SetCaretInfo();
+ }
+ }
+ else
+ {
+ if (m_SelState.IsExist())
+ {
+ if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+ SetCaret(m_SelState.BeginPos);
+ else
+ SetCaret(m_SelState.EndPos);
+
+ SelectNone();
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ else
+ {
+ if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
+ m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
+ SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+
+ SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+ }
+ }
+}
+
+void CFX_Edit::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ if (bShift)
+ {
+ SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+
+ if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
+ m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
+ SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret,m_wpCaret);
+
+ if (m_wpOldCaret != m_wpCaret)
+ {
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
+ Refresh(RP_OPTIONAL,&wr);
+ SetCaretInfo();
+ }
+ }
+ else
+ {
+ if (m_SelState.IsExist())
+ {
+ if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
+ SetCaret(m_SelState.BeginPos);
+ else
+ SetCaret(m_SelState.EndPos);
+
+ SelectNone();
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ else
+ {
+ SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+
+ if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
+ m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
+ SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+ }
+ }
+}
+
+void CFX_Edit::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ if (bShift)
+ {
+ if (bCtrl)
+ SetCaret(m_pVT->GetBeginWordPlace());
+ else
+ SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
+
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret,m_wpCaret);
+
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+ Refresh(RP_OPTIONAL, &wr);
+ SetCaretInfo();
+ }
+ else
+ {
+ if (m_SelState.IsExist())
+ {
+ if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
+ SetCaret(m_SelState.BeginPos);
+ else
+ SetCaret(m_SelState.EndPos);
+
+ SelectNone();
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ else
+ {
+ if (bCtrl)
+ SetCaret(m_pVT->GetBeginWordPlace());
+ else
+ SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+ }
+ }
+}
+
+void CFX_Edit::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (m_pVT->IsValid())
+ {
+ if (bShift)
+ {
+ if (bCtrl)
+ SetCaret(m_pVT->GetEndWordPlace());
+ else
+ SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
+
+ if (m_SelState.IsExist())
+ m_SelState.SetEndPos(m_wpCaret);
+ else
+ m_SelState.Set(m_wpOldCaret, m_wpCaret);
+
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
+ Refresh(RP_OPTIONAL, &wr);
+ SetCaretInfo();
+ }
+ else
+ {
+ if (m_SelState.IsExist())
+ {
+ if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
+ SetCaret(m_SelState.BeginPos);
+ else
+ SetCaret(m_SelState.EndPos);
+
+ SelectNone();
+ ScrollToCaret();
+ SetCaretInfo();
+ }
+ else
+ {
+ if (bCtrl)
+ SetCaret(m_pVT->GetEndWordPlace());
+ else
+ SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
+
+ ScrollToCaret();
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+ }
+ }
+}
+
+void CFX_Edit::SetText(FX_LPCWSTR text,FX_INT32 charset,
+ const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ Empty();
+ DoInsertText(CPVT_WordPlace(0,0,-1), text, charset, pSecProps, pWordProps);
+ if (bPaint) Paint();
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);
+ //if (bAddUndo)
+}
+
+FX_BOOL CFX_Edit::InsertWord(FX_WORD word, FX_INT32 charset, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (IsTextOverflow()) return FALSE;
+
+ if (m_pVT->IsValid())
+ {
+ m_pVT->UpdateWordPlace(m_wpCaret);
+
+ SetCaret(m_pVT->InsertWord(m_wpCaret,word,GetCharSetFromUnicode(word, charset),pWordProps));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (m_wpCaret != m_wpOldCaret)
+ {
+ if (bAddUndo && m_bEnableUndo)
+ {
+ AddEditUndoItem(new CFXEU_InsertWord(this,m_wpOldCaret,m_wpCaret,word,charset,pWordProps));
+ }
+
+ if (bPaint)
+ PaintInsertText(m_wpOldCaret, m_wpCaret);
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordProps * pWordProps,
+ FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (IsTextOverflow()) return FALSE;
+
+ if (m_pVT->IsValid())
+ {
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ SetCaret(m_pVT->InsertSection(m_wpCaret,pSecProps,pWordProps));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (m_wpCaret != m_wpOldCaret)
+ {
+ if (bAddUndo && m_bEnableUndo)
+ {
+ AddEditUndoItem(new CFXEU_InsertReturn(this,m_wpOldCaret,m_wpCaret,pSecProps,pWordProps));
+ }
+
+ if (bPaint)
+ {
+ RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));
+ ScrollToCaret();
+ CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
+ Refresh(RP_ANALYSE, &wr);
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (m_pVT->IsValid())
+ {
+ if (m_wpCaret == m_pVT->GetBeginWordPlace()) return FALSE;
+
+ CPVT_Section section;
+ CPVT_Word word;
+
+ if (bAddUndo)
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_wpCaret);
+ pIterator->GetSection(section);
+ pIterator->GetWord(word);
+ }
+ }
+
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ SetCaret(m_pVT->BackSpaceWord(m_wpCaret));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (m_wpCaret != m_wpOldCaret)
+ {
+ if (bAddUndo && m_bEnableUndo)
+ {
+ if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
+ AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+ section.SecProps,section.WordProps));
+ else
+ AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+ section.SecProps,word.WordProps));
+ }
+
+ if (bPaint)
+ {
+ RearrangePart(CPVT_WordRange(m_wpCaret,m_wpOldCaret));
+ ScrollToCaret();
+
+ CPVT_WordRange wr;
+ if (m_wpCaret.SecCmp(m_wpOldCaret) !=0)
+ wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),GetVisibleWordRange().EndPos);
+ else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
+ wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+ else
+ wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+
+ Refresh(RP_ANALYSE, &wr);
+
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (m_pVT->IsValid())
+ {
+ if (m_wpCaret == m_pVT->GetEndWordPlace()) return FALSE;
+
+ CPVT_Section section;
+ CPVT_Word word;
+
+ if (bAddUndo)
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
+ pIterator->GetSection(section);
+ pIterator->GetWord(word);
+ }
+ }
+
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));
+
+ SetCaret(m_pVT->DeleteWord(m_wpCaret));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (bAddUndo && m_bEnableUndo)
+ {
+ if (bSecEnd)
+ AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+ section.SecProps,section.WordProps,bSecEnd));
+ else
+ AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,word.Word,word.nCharset,
+ section.SecProps,word.WordProps,bSecEnd));
+ }
+
+ if (bPaint)
+ {
+ RearrangePart(CPVT_WordRange(m_wpOldCaret,m_wpCaret));
+ ScrollToCaret();
+
+ CPVT_WordRange wr;
+ if (bSecEnd)
+ wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),GetVisibleWordRange().EndPos);
+ else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
+ wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+ else
+ wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),m_pVT->GetSectionEndPlace(m_wpCaret));
+
+ Refresh(RP_ANALYSE, &wr);
+
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::Empty()
+{
+ if (m_pVT->IsValid())
+ {
+ m_pVT->DeleteWords(GetWholeWordRange());
+ SetCaret(m_pVT->GetBeginWordPlace());
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (m_pVT->IsValid())
+ {
+ if (m_SelState.IsExist())
+ {
+ CPVT_WordRange range = m_SelState.ConvertToWordRange();
+
+ if (bAddUndo && m_bEnableUndo)
+ {
+ if (m_pVT->IsRichText())
+ {
+ BeginGroupUndo(L"");
+
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(range.EndPos);
+
+ CPVT_Word wordinfo;
+ CPVT_Section secinfo;
+ do
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (place.WordCmp(range.BeginPos) <= 0)break;
+
+ CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
+
+ if (oldplace.SecCmp(place) != 0)
+ {
+ if (pIterator->GetSection(secinfo))
+ {
+ AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
+ wordinfo.nCharset,secinfo.SecProps,secinfo.WordProps));
+ }
+ }
+ else
+ {
+ if (pIterator->GetWord(wordinfo))
+ {
+ oldplace = m_pVT->AjustLineHeader(oldplace,TRUE);
+ place = m_pVT->AjustLineHeader(place,TRUE);
+
+ AddEditUndoItem(new CFXEU_ClearRich(this,oldplace,place,range,wordinfo.Word,
+ wordinfo.nCharset,secinfo.SecProps,wordinfo.WordProps));
+ }
+ }
+ }while (pIterator->PrevWord());
+ }
+ EndGroupUndo();
+ }
+ else
+ {
+ AddEditUndoItem(new CFXEU_Clear(this,range,GetSelText()));
+ }
+ }
+
+ SelectNone();
+ SetCaret(m_pVT->DeleteWords(range));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (bPaint)
+ {
+ RearrangePart(range);
+ ScrollToCaret();
+
+ CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
+ Refresh(RP_ANALYSE, &wr);
+
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::InsertText(FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
+{
+ if (IsTextOverflow()) return FALSE;
+
+ m_pVT->UpdateWordPlace(m_wpCaret);
+ SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps));
+ m_SelState.Set(m_wpCaret,m_wpCaret);
+
+ if (m_wpCaret != m_wpOldCaret)
+ {
+ if (bAddUndo && m_bEnableUndo)
+ {
+ AddEditUndoItem(new CFXEU_InsertText(this,m_wpOldCaret,m_wpCaret,text,charset,pSecProps,pWordProps));
+ }
+
+ if (bPaint)
+ PaintInsertText(m_wpOldCaret, m_wpCaret);
+
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void CFX_Edit::PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlace & wpNew)
+{
+ if (m_pVT->IsValid())
+ {
+ RearrangePart(CPVT_WordRange(wpOld,wpNew));
+ ScrollToCaret();
+
+ CPVT_WordRange wr;
+ if (m_wpCaret.LineCmp(wpOld) !=0)
+ wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),m_pVT->GetSectionEndPlace(wpNew));
+ else
+ wr = CPVT_WordRange(wpOld,m_pVT->GetSectionEndPlace(wpNew));
+ Refresh(RP_ANALYSE, &wr);
+ SetCaretOrigin();
+ SetCaretInfo();
+ }
+}
+
+FX_BOOL CFX_Edit::Redo()
+{
+ if (m_bEnableUndo)
+ {
+ if (m_Undo.CanRedo())
+ {
+ m_Undo.Redo();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::Undo()
+{
+ if (m_bEnableUndo)
+ {
+ if (m_Undo.CanUndo())
+ {
+ m_Undo.Undo();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void CFX_Edit::SetCaretOrigin()
+{
+ if (m_pVT->IsValid())
+ {
+ if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
+ {
+ pIterator->SetAt(m_wpCaret);
+ CPVT_Word word;
+ CPVT_Line line;
+ if (pIterator->GetWord(word))
+ {
+ m_ptCaret.x = word.ptWord.x + word.fWidth;
+ m_ptCaret.y = word.ptWord.y;
+ }
+ else if (pIterator->GetLine(line))
+ {
+ m_ptCaret.x = line.ptLine.x;
+ m_ptCaret.y = line.ptLine.y;
+ }
+ }
+ }
+}
+
+FX_INT32 CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
+{
+ if (m_pVT->IsValid())
+ return m_pVT->WordPlaceToWordIndex(place);
+
+ return -1;
+}
+
+CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(FX_INT32 index) const
+{
+ if (m_pVT->IsValid())
+ return m_pVT->WordIndexToWordPlace(index);
+
+ return CPVT_WordPlace();
+}
+
+FX_BOOL CFX_Edit::IsTextFull() const
+{
+ FX_INT32 nTotalWords = m_pVT->GetTotalWords();
+ FX_INT32 nLimitChar = m_pVT->GetLimitChar();
+ FX_INT32 nCharArray = m_pVT->GetCharArray();
+
+ return IsTextOverflow() || (nLimitChar>0 && nTotalWords >= nLimitChar)
+ || (nCharArray>0 && nTotalWords >= nCharArray);
+}
+
+FX_BOOL CFX_Edit::IsTextOverflow() const
+{
+ if (!m_bEnableScroll && !m_bEnableOverflow)
+ {
+ CPDF_Rect rcPlate = m_pVT->GetPlateRect();
+ CPDF_Rect rcContent = m_pVT->GetContentRect();
+
+ if (m_pVT->IsMultiLine() && GetTotalLines() > 1)
+ {
+ if (FX_EDIT_IsFloatBigger(rcContent.Height(),rcPlate.Height())) return TRUE;
+ }
+
+ if (FX_EDIT_IsFloatBigger(rcContent.Width(),rcPlate.Width())) return TRUE;
+ }
+
+ return FALSE;
+}
+
+CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace & place) const
+{
+ return m_pVT->GetLineBeginPlace(place);
+}
+
+CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace & place) const
+{
+ return m_pVT->GetLineEndPlace(place);
+}
+
+CPVT_WordPlace CFX_Edit::GetSectionBeginPlace(const CPVT_WordPlace & place) const
+{
+ return m_pVT->GetSectionBeginPlace(place);
+}
+
+CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace & place) const
+{
+ return m_pVT->GetSectionEndPlace(place);
+}
+
+FX_BOOL CFX_Edit::CanUndo() const
+{
+ if (m_bEnableUndo)
+ {
+ return m_Undo.CanUndo();
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::CanRedo() const
+{
+ if (m_bEnableUndo)
+ {
+ return m_Undo.CanRedo();
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CFX_Edit::IsModified() const
+{
+ if (m_bEnableUndo)
+ {
+ return m_Undo.IsModified();
+ }
+
+ return FALSE;
+}
+
+void CFX_Edit::EnableRefresh(FX_BOOL bRefresh)
+{
+ m_bEnableRefresh = bRefresh;
+}
+
+void CFX_Edit::EnableUndo(FX_BOOL bUndo)
+{
+ this->m_bEnableUndo = bUndo;
+}
+
+void CFX_Edit::EnableNotify(FX_BOOL bNotify)
+{
+ this->m_bNotify = bNotify;
+}
+
+void CFX_Edit::EnableOprNotify(FX_BOOL bNotify)
+{
+ this->m_bOprNotify = bNotify;
+}
+
+FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const
+{
+ if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordPlace wpOld = pIterator->GetAt();
+
+ pIterator->SetAt(place);
+ CPVT_Line line;
+ pIterator->GetLine(line);
+
+ pIterator->SetAt(wpOld);
+
+ return line.ptLine.y + line.fLineAscent;
+ }
+
+ return 0.0f;
+}
+
+FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const
+{
+ if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
+ {
+ CPVT_WordPlace wpOld = pIterator->GetAt();
+
+ pIterator->SetAt(place);
+ CPVT_Line line;
+ pIterator->GetLine(line);
+
+ pIterator->SetAt(wpOld);
+
+ return line.ptLine.y + line.fLineDescent;
+ }
+
+ return 0.0f;
+}
+
+CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, FX_LPCWSTR text, FX_INT32 charset,
+ const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps)
+{
+ CPVT_WordPlace wp = place;
+
+ if (m_pVT->IsValid())
+ {
+ CFX_WideString sText = text;
+
+ for (FX_INT32 i = 0, sz = sText.GetLength(); i < sz; i++)
+ {
+ FX_WORD word = sText[i];
+ switch (word)
+ {
+ case 0x0D:
+ wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
+ if (sText[i+1] == 0x0A)
+ i++;
+ break;
+ case 0x0A:
+ wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
+ if (sText[i+1] == 0x0D)
+ i++;
+ break;
+ case 0x09:
+ word = 0x20;
+ default:
+ wp = m_pVT->InsertWord(wp,word,GetCharSetFromUnicode(word, charset),pWordProps);
+ break;
+ }
+ }
+ }
+
+ return wp;
+}
+
+FX_INT32 CFX_Edit::GetCharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)
+{
+ if (IFX_Edit_FontMap* pFontMap = this->GetFontMap())
+ return pFontMap->CharSetFromUnicode(word, nOldCharset);
+ else
+ return nOldCharset;
+}
+
+void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle)
+{
+ ASSERT(m_pGroupUndoItem == NULL);
+
+ m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
+}
+
+void CFX_Edit::EndGroupUndo()
+{
+ ASSERT(m_pGroupUndoItem != NULL);
+
+ m_pGroupUndoItem->UpdateItems();
+ m_Undo.AddItem(m_pGroupUndoItem);
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnAddUndo(m_pGroupUndoItem);
+ m_pGroupUndoItem = NULL;
+}
+
+void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem)
+{
+ if (m_pGroupUndoItem)
+ m_pGroupUndoItem->AddUndoItem(pEditUndoItem);
+ else
+ {
+ m_Undo.AddItem(pEditUndoItem);
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnAddUndo(pEditUndoItem);
+ }
+}
+
+void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem)
+{
+ m_Undo.AddItem(pUndoItem);
+ if (m_bOprNotify && m_pOprNotify)
+ m_pOprNotify->OnAddUndo(pUndoItem);
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_list.cpp b/fpdfsdk/src/fxedit/fxet_list.cpp
new file mode 100644
index 0000000000..dd70e0c7d4
--- /dev/null
+++ b/fpdfsdk/src/fxedit/fxet_list.cpp
@@ -0,0 +1,1012 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+#include "../../include/fxedit/fxet_list.h"
+
+/* ------------------------------- CFX_ListItem ---------------------------------- */
+
+CFX_ListItem::CFX_ListItem() : m_pEdit(NULL),
+ m_bSelected(FALSE),
+ m_bCaret(FALSE),
+ m_rcListItem(0.0f,0.0f,0.0f,0.0f)
+{
+ m_pEdit = IFX_Edit::NewEdit();
+ ASSERT(m_pEdit != NULL);
+
+ m_pEdit->SetAlignmentV(1);
+ m_pEdit->Initialize();
+}
+
+CFX_ListItem::~CFX_ListItem()
+{
+ IFX_Edit::DelEdit(m_pEdit);
+}
+
+void CFX_ListItem::SetFontMap(IFX_Edit_FontMap * pFontMap)
+{
+ if (m_pEdit)
+ m_pEdit->SetFontMap(pFontMap);
+}
+
+IFX_Edit* CFX_ListItem::GetEdit() const
+{
+ return m_pEdit;
+}
+
+IFX_Edit_Iterator* CFX_ListItem::GetIterator() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetIterator();
+
+ return NULL;
+}
+
+void CFX_ListItem::SetRect(const CLST_Rect & rect)
+{
+ m_rcListItem = rect;
+}
+
+CLST_Rect CFX_ListItem::GetRect() const
+{
+ return m_rcListItem;
+}
+
+FX_BOOL CFX_ListItem::IsSelected() const
+{
+ return m_bSelected;
+}
+
+void CFX_ListItem::SetSelect(FX_BOOL bSelected)
+{
+ m_bSelected = bSelected;
+}
+
+FX_BOOL CFX_ListItem::IsCaret() const
+{
+ return m_bCaret;
+}
+
+void CFX_ListItem::SetCaret(FX_BOOL bCaret)
+{
+ m_bCaret = bCaret;
+}
+
+void CFX_ListItem::SetText(FX_LPCWSTR text)
+{
+ if (m_pEdit)
+ m_pEdit->SetText(text);
+}
+
+void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize)
+{
+ if (m_pEdit)
+ m_pEdit->SetFontSize(fFontSize);
+}
+
+FX_FLOAT CFX_ListItem::GetItemHeight() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetContentRect().Height();
+
+ return 0.0f;
+}
+
+FX_WORD CFX_ListItem::GetFirstChar() const
+{
+ CPVT_Word word;
+
+ if (IFX_Edit_Iterator* pIterator = GetIterator())
+ {
+ pIterator->SetAt(1);
+ pIterator->GetWord(word);
+ }
+
+ return word.Word;
+}
+
+CFX_WideString CFX_ListItem::GetText() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetText();
+
+ return L"";
+}
+
+/* ------------------------------------ CFX_List --------------------------------- */
+
+CFX_List::CFX_List() : m_pFontMap(NULL), m_fFontSize(0.0f), m_bMultiple(FALSE)
+{
+}
+
+CFX_List::~CFX_List()
+{
+ Empty();
+}
+
+void CFX_List::Empty()
+{
+ for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)
+ delete m_aListItems.GetAt(i);
+
+ m_aListItems.RemoveAll();
+}
+
+void CFX_List::SetFontMap(IFX_Edit_FontMap * pFontMap)
+{
+ m_pFontMap = pFontMap;
+}
+
+void CFX_List::SetFontSize(FX_FLOAT fFontSize)
+{
+ m_fFontSize = fFontSize;
+}
+
+void CFX_List::AddItem(FX_LPCWSTR str)
+{
+ if (CFX_ListItem * pListItem = new CFX_ListItem())
+ {
+ pListItem->SetFontMap(m_pFontMap);
+ pListItem->SetFontSize(m_fFontSize);
+ pListItem->SetText(str);
+ m_aListItems.Add(pListItem);
+ }
+}
+
+void CFX_List::ReArrange(FX_INT32 nItemIndex)
+{
+ FX_FLOAT fPosY = 0.0f;
+
+ if (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1))
+ fPosY = pPrevItem->GetRect().bottom;
+
+ for (FX_INT32 i=nItemIndex,sz=m_aListItems.GetSize(); i<sz; i++)
+ {
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(i))
+ {
+ FX_FLOAT fListItemHeight = pListItem->GetItemHeight();
+ pListItem->SetRect(CLST_Rect(0.0f,fPosY,0.0f,fPosY + fListItemHeight));
+ fPosY += fListItemHeight;
+ }
+ }
+
+ SetContentRect(CLST_Rect(0.0f,0.0f,0.0f,fPosY));
+}
+
+IFX_Edit * CFX_List::GetItemEdit(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->GetEdit();
+ }
+
+ return NULL;
+}
+
+FX_INT32 CFX_List::GetCount() const
+{
+ return m_aListItems.GetSize();
+}
+
+CPDF_Rect CFX_List::GetPlateRect() const
+{
+ return CFX_ListContainer::GetPlateRect();
+}
+
+CPDF_Rect CFX_List::GetContentRect() const
+{
+ return InnerToOuter(CFX_ListContainer::GetContentRect());
+}
+
+FX_FLOAT CFX_List::GetFontSize() const
+{
+ return m_fFontSize;
+}
+
+FX_INT32 CFX_List::GetItemIndex(const CPDF_Point & point) const
+{
+ CPDF_Point pt = OuterToInner(point);
+
+ FX_BOOL bFirst = TRUE;
+ FX_BOOL bLast = TRUE;
+
+ for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)
+ {
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(i))
+ {
+ CLST_Rect rcListItem = pListItem->GetRect();
+
+ if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top))
+ {
+ bFirst = FALSE;
+ }
+
+ if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom))
+ {
+ bLast = FALSE;
+ }
+
+ if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom)
+ {
+ return i;
+ }
+ }
+ }
+
+ if (bFirst) return 0;
+ if (bLast) return m_aListItems.GetSize()-1;
+
+ return -1;
+}
+
+FX_FLOAT CFX_List::GetFirstHeight() const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(0))
+ {
+ return pListItem->GetItemHeight();
+ }
+
+ return 1.0f;
+}
+
+FX_INT32 CFX_List::GetFirstSelected() const
+{
+ for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)
+ {
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(i))
+ {
+ if (pListItem->IsSelected())
+ return i;
+ }
+ }
+ return -1;
+}
+
+FX_INT32 CFX_List::GetLastSelected() const
+{
+ for (FX_INT32 i=m_aListItems.GetSize()-1; i>=0; i--)
+ {
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(i))
+ {
+ if (pListItem->IsSelected())
+ return i;
+ }
+ }
+ return -1;
+}
+
+FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const
+{
+ if ( (c >= 'a') && (c <= 'z') )
+ c = c - ('a' - 'A');
+ return c;
+}
+
+FX_INT32 CFX_List::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
+{
+ FX_INT32 nCircleIndex = nIndex;
+
+ for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++)
+ {
+ nCircleIndex ++;
+ if (nCircleIndex >= sz) nCircleIndex = 0;
+
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nCircleIndex))
+ {
+ if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar))
+ return nCircleIndex;
+ }
+ }
+
+ return nCircleIndex;
+}
+
+CPDF_Rect CFX_List::GetItemRect(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ CPDF_Rect rcItem = pListItem->GetRect();
+ rcItem.left = 0.0f;
+ rcItem.right = GetPlateRect().Width();
+ return InnerToOuter(rcItem);
+ }
+
+ return CPDF_Rect();
+}
+
+FX_BOOL CFX_List::IsItemSelected(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->IsSelected();
+ }
+
+ return FALSE;
+}
+
+void CFX_List::SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))
+ {
+ pListItem->SetSelect(bSelected);
+ }
+}
+
+void CFX_List::SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret)
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))
+ {
+ pListItem->SetCaret(bCaret);
+ }
+}
+
+void CFX_List::SetMultipleSel(FX_BOOL bMultiple)
+{
+ m_bMultiple = bMultiple;
+}
+
+FX_BOOL CFX_List::IsMultipleSel() const
+{
+ return m_bMultiple;
+}
+
+FX_BOOL CFX_List::IsValid(FX_INT32 nItemIndex) const
+{
+ return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
+}
+
+CFX_WideString CFX_List::GetItemText(FX_INT32 nIndex) const
+{
+ if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
+ {
+ return pListItem->GetText();
+ }
+
+ return L"";
+}
+
+/* ------------------------------------ CPLST_Select ---------------------------------- */
+
+CPLST_Select::CPLST_Select()
+{
+}
+
+CPLST_Select::~CPLST_Select()
+{
+ for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)
+ delete m_aItems.GetAt(i);
+
+ m_aItems.RemoveAll();
+}
+
+void CPLST_Select::Add(FX_INT32 nItemIndex)
+{
+ FX_INT32 nIndex = Find(nItemIndex);
+
+ if (nIndex < 0)
+ m_aItems.Add(new CPLST_Select_Item(nItemIndex,1));
+ else
+ {
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))
+ {
+ pItem->nState = 1;
+ }
+ }
+}
+
+void CPLST_Select::Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ if (nBeginIndex > nEndIndex)
+ {
+ FX_INT32 nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
+
+ for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Add(i);
+}
+
+void CPLST_Select::Sub(FX_INT32 nItemIndex)
+{
+ for (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--)
+ {
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(i))
+ if (pItem->nItemIndex == nItemIndex)
+ pItem->nState = -1;
+ }
+}
+
+void CPLST_Select::Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex)
+{
+ if (nBeginIndex > nEndIndex)
+ {
+ FX_INT32 nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
+
+ for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Sub(i);
+}
+
+FX_INT32 CPLST_Select::Find(FX_INT32 nItemIndex) const
+{
+ for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)
+ {
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(i))
+ {
+ if (pItem->nItemIndex == nItemIndex)
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+FX_BOOL CPLST_Select::IsExist(FX_INT32 nItemIndex) const
+{
+ return Find(nItemIndex) >= 0;
+}
+
+FX_INT32 CPLST_Select::GetCount() const
+{
+ return m_aItems.GetSize();
+}
+
+FX_INT32 CPLST_Select::GetItemIndex(FX_INT32 nIndex) const
+{
+ if (nIndex >= 0 && nIndex < m_aItems.GetSize())
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))
+ return pItem->nItemIndex;
+
+ return -1;
+}
+
+FX_INT32 CPLST_Select::GetState(FX_INT32 nIndex) const
+{
+ if (nIndex >= 0 && nIndex < m_aItems.GetSize())
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))
+ return pItem->nState;
+
+ return 0;
+}
+
+void CPLST_Select::DeselectAll()
+{
+ for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++)
+ {
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(i))
+ {
+ pItem->nState = -1;
+ }
+ }
+}
+
+void CPLST_Select::Done()
+{
+ for (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--)
+ {
+ if (CPLST_Select_Item * pItem = m_aItems.GetAt(i))
+ {
+ if (pItem->nState == -1)
+ {
+ delete pItem;
+ m_aItems.RemoveAt(i);
+ }
+ else
+ {
+ pItem->nState = 0;
+ }
+ }
+ }
+}
+
+/* ------------------------------------ CFX_ListCtrl --------------------------------- */
+
+CFX_ListCtrl::CFX_ListCtrl() : m_pNotify(NULL),
+ m_ptScrollPos(0.0f,0.0f),
+ m_nSelItem(-1),
+ m_nFootIndex(-1),
+ m_bCtrlSel(FALSE),
+ m_nCaretIndex(-1),
+ m_bNotifyFlag(FALSE)
+{
+}
+
+CFX_ListCtrl::~CFX_ListCtrl()
+{
+}
+
+void CFX_ListCtrl::SetNotify(IFX_List_Notify * pNotify)
+{
+ m_pNotify = pNotify;
+}
+
+CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point & point) const
+{
+ CPDF_Rect rcPlate = GetPlateRect();
+
+ return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+ point.y - (m_ptScrollPos.y - rcPlate.top));
+}
+
+CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point & point) const
+{
+ CPDF_Rect rcPlate = GetPlateRect();
+
+ return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
+ point.y + (m_ptScrollPos.y - rcPlate.top));
+}
+
+CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect & rect) const
+{
+ CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left,rect.bottom));
+ CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right,rect.top));
+
+ return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
+}
+
+void CFX_ListCtrl::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ FX_INT32 nHitIndex = this->GetItemIndex(point);
+
+ if (IsMultipleSel())
+ {
+ if (bCtrl)
+ {
+ if (IsItemSelected(nHitIndex))
+ {
+ m_aSelItems.Sub(nHitIndex);
+ SelectItems();
+ m_bCtrlSel = FALSE;
+ }
+ else
+ {
+ m_aSelItems.Add(nHitIndex);
+ SelectItems();
+ m_bCtrlSel = TRUE;
+ }
+
+ m_nFootIndex = nHitIndex;
+ }
+ else if (bShift)
+ {
+ m_aSelItems.DeselectAll();
+ m_aSelItems.Add(m_nFootIndex,nHitIndex);
+ SelectItems();
+ }
+ else
+ {
+ m_aSelItems.DeselectAll();
+ m_aSelItems.Add(nHitIndex);
+ SelectItems();
+
+ m_nFootIndex = nHitIndex;
+ }
+
+ SetCaret(nHitIndex);
+ }
+ else
+ {
+ SetSingleSelect(nHitIndex);
+ }
+
+ if (!this->IsItemVisible(nHitIndex))
+ this->ScrollToListItem(nHitIndex);
+}
+
+void CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ FX_INT32 nHitIndex = this->GetItemIndex(point);
+
+ if (IsMultipleSel())
+ {
+ if (bCtrl)
+ {
+ if (m_bCtrlSel)
+ m_aSelItems.Add(m_nFootIndex,nHitIndex);
+ else
+ m_aSelItems.Sub(m_nFootIndex,nHitIndex);
+
+ SelectItems();
+ }
+ else
+ {
+ m_aSelItems.DeselectAll();
+ m_aSelItems.Add(m_nFootIndex,nHitIndex);
+ SelectItems();
+ }
+
+ SetCaret(nHitIndex);
+ }
+ else
+ {
+ SetSingleSelect(nHitIndex);
+ }
+
+ if (!this->IsItemVisible(nHitIndex))
+ this->ScrollToListItem(nHitIndex);
+}
+
+void CFX_ListCtrl::OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ if (IsMultipleSel())
+ {
+ if (nItemIndex >= 0 && nItemIndex < GetCount())
+ {
+ if (bCtrl)
+ {
+ }
+ else if (bShift)
+ {
+ m_aSelItems.DeselectAll();
+ m_aSelItems.Add(m_nFootIndex,nItemIndex);
+ SelectItems();
+ }
+ else
+ {
+ m_aSelItems.DeselectAll();
+ m_aSelItems.Add(nItemIndex);
+ SelectItems();
+ m_nFootIndex = nItemIndex;
+ }
+
+ SetCaret(nItemIndex);
+ }
+ }
+ else
+ {
+ SetSingleSelect(nItemIndex);
+ }
+
+ if (!this->IsItemVisible(nItemIndex))
+ this->ScrollToListItem(nItemIndex);
+}
+
+void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(IsMultipleSel() ? GetCaret()-1 : GetSelect()-1, bShift, bCtrl);
+}
+
+void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(IsMultipleSel() ? GetCaret()+1 : GetSelect()+1, bShift, bCtrl);
+}
+
+void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(0, bShift, bCtrl);
+}
+
+void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(GetCount()-1, bShift, bCtrl);
+}
+
+void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(0, bShift, bCtrl);
+}
+
+void CFX_ListCtrl::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ OnVK(GetCount()-1, bShift, bCtrl);
+}
+
+FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl)
+{
+ FX_INT32 nIndex = GetLastSelected();
+ FX_INT32 nFindIndex = FindNext(nIndex,nChar);
+
+ if (nFindIndex != nIndex)
+ {
+ OnVK(nFindIndex, bShift, bCtrl);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* -------- inner methods ------- */
+
+void CFX_ListCtrl::SetPlateRect(const CPDF_Rect & rect)
+{
+ CFX_ListContainer::SetPlateRect(rect);
+ m_ptScrollPos.x = rect.left;
+ SetScrollPos(CPDF_Point(rect.left,rect.top));
+ ReArrange(0);
+ InvalidateItem(-1);
+}
+
+CPDF_Rect CFX_ListCtrl::GetItemRect(FX_INT32 nIndex) const
+{
+ return InToOut(CFX_List::GetItemRect(nIndex));
+}
+
+void CFX_ListCtrl::AddString(FX_LPCWSTR string)
+{
+ AddItem(string);
+ ReArrange(GetCount() - 1);
+}
+
+void CFX_ListCtrl::SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (bSelected != this->IsItemSelected(nItemIndex))
+ {
+ if (bSelected)
+ {
+ SetItemSelect(nItemIndex,TRUE);
+ InvalidateItem(nItemIndex);
+ }
+ else
+ {
+ SetItemSelect(nItemIndex,FALSE);
+ InvalidateItem(nItemIndex);
+ }
+ }
+}
+
+void CFX_ListCtrl::SetSingleSelect(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (m_nSelItem != nItemIndex)
+ {
+ if (m_nSelItem >= 0)
+ {
+ SetItemSelect(m_nSelItem,FALSE);
+ InvalidateItem(m_nSelItem);
+ }
+
+ SetItemSelect(nItemIndex,TRUE);
+ InvalidateItem(nItemIndex);
+ m_nSelItem = nItemIndex;
+ }
+}
+
+void CFX_ListCtrl::SetCaret(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (this->IsMultipleSel())
+ {
+ FX_INT32 nOldIndex = m_nCaretIndex;
+
+ if (nOldIndex != nItemIndex)
+ {
+ m_nCaretIndex = nItemIndex;
+
+ SetItemCaret(nOldIndex, FALSE);
+ SetItemCaret(nItemIndex,TRUE);
+
+ InvalidateItem(nOldIndex);
+ InvalidateItem(nItemIndex);
+ }
+ }
+}
+
+void CFX_ListCtrl::InvalidateItem(FX_INT32 nItemIndex)
+{
+ if (m_pNotify)
+ {
+ if (nItemIndex == -1)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect rcRefresh = GetPlateRect();
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ else
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ CPDF_Rect rcRefresh = GetItemRect(nItemIndex);
+ rcRefresh.left -= 1.0f;
+ rcRefresh.right += 1.0f;
+ rcRefresh.bottom -= 1.0f;
+ rcRefresh.top += 1.0f;
+
+ m_pNotify->IOnInvalidateRect(&rcRefresh);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+}
+
+void CFX_ListCtrl::SelectItems()
+{
+ for (FX_INT32 i=0,sz=m_aSelItems.GetCount(); i<sz; i++)
+ {
+ FX_INT32 nItemIndex = m_aSelItems.GetItemIndex(i);
+ FX_INT32 nState = m_aSelItems.GetState(i);
+
+ switch(nState)
+ {
+ case 1:
+ SetMultipleSelect(nItemIndex, TRUE);
+ break;
+ case -1:
+ SetMultipleSelect(nItemIndex, FALSE);
+ break;
+ }
+ }
+
+ m_aSelItems.Done();
+}
+
+void CFX_ListCtrl::Select(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ if (this->IsMultipleSel())
+ {
+ m_aSelItems.Add(nItemIndex);
+ SelectItems();
+ }
+ else
+ SetSingleSelect(nItemIndex);
+}
+
+FX_BOOL CFX_ListCtrl::IsItemVisible(FX_INT32 nItemIndex) const
+{
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect rcItem = this->GetItemRect(nItemIndex);
+
+ return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top;
+}
+
+void CFX_ListCtrl::ScrollToListItem(FX_INT32 nItemIndex)
+{
+ if (!IsValid(nItemIndex)) return;
+
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex);
+ CPDF_Rect rcItemCtrl = GetItemRect(nItemIndex);
+
+ if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom))
+ {
+ if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top))
+ {
+ SetScrollPosY(rcItem.bottom + rcPlate.Height());
+ }
+ }
+ else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top))
+ {
+ if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom))
+ {
+ SetScrollPosY(rcItem.top);
+ }
+ }
+}
+
+void CFX_ListCtrl::SetScrollInfo()
+{
+ if (m_pNotify)
+ {
+ CPDF_Rect rcPlate = GetPlateRect();
+ CPDF_Rect rcContent = CFX_List::GetContentRect();
+
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
+ rcContent.bottom, rcContent.top, GetFirstHeight(), rcPlate.Height());
+ m_bNotifyFlag = FALSE;
+ }
+ }
+}
+
+void CFX_ListCtrl::SetScrollPos(const CPDF_Point & point)
+{
+ SetScrollPosY(point.y);
+}
+
+void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy)
+{
+ if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy))
+ {
+ CPDF_Rect rcPlate = this->GetPlateRect();
+ CPDF_Rect rcContent = CFX_List::GetContentRect();
+
+ if (rcPlate.Height() > rcContent.Height())
+ {
+ fy = rcPlate.top;
+ }
+ else
+ {
+ if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom))
+ {
+ fy = rcContent.bottom + rcPlate.Height();
+ }
+ else if (FX_EDIT_IsFloatBigger(fy, rcContent.top))
+ {
+ fy = rcContent.top;
+ }
+ }
+
+ m_ptScrollPos.y = fy;
+ InvalidateItem(-1);
+
+ if (m_pNotify)
+ {
+ if (!m_bNotifyFlag)
+ {
+ m_bNotifyFlag = TRUE;
+ m_pNotify->IOnSetScrollPosY(fy);
+ m_bNotifyFlag = FALSE;
+ }
+ }
+ }
+}
+
+CPDF_Rect CFX_ListCtrl::GetContentRect() const
+{
+ return InToOut(CFX_List::GetContentRect());
+}
+
+void CFX_ListCtrl::ReArrange(FX_INT32 nItemIndex)
+{
+ CFX_List::ReArrange(nItemIndex);
+ SetScrollInfo();
+}
+
+void CFX_ListCtrl::SetTopItem(FX_INT32 nIndex)
+{
+ if (IsValid(nIndex))
+ {
+ this->GetPlateRect();
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex);
+ SetScrollPosY(rcItem.top);
+ }
+}
+
+FX_INT32 CFX_ListCtrl::GetTopItem() const
+{
+ FX_INT32 nItemIndex = this->GetItemIndex(this->GetBTPoint());
+
+ if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1))
+ nItemIndex += 1;
+
+ return nItemIndex;
+}
+
+void CFX_ListCtrl::Empty()
+{
+ CFX_List::Empty();
+ InvalidateItem(-1);
+}
+
+void CFX_ListCtrl::Cancel()
+{
+ m_aSelItems.DeselectAll();
+}
+
+FX_INT32 CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const
+{
+ return CFX_List::GetItemIndex(OutToIn(point));
+}
+
+CFX_WideString CFX_ListCtrl::GetText() const
+{
+ if (this->IsMultipleSel())
+ return this->GetItemText(this->m_nCaretIndex);
+ else
+ return this->GetItemText(this->m_nSelItem);
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_module.cpp b/fpdfsdk/src/fxedit/fxet_module.cpp
new file mode 100644
index 0000000000..b13af89833
--- /dev/null
+++ b/fpdfsdk/src/fxedit/fxet_module.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fxet_edit.h"
+#include "../../include/fxedit/fxet_list.h"
+
+/* ---------------------- IFX_Edit ---------------------- */
+
+IFX_Edit* IFX_Edit::NewEdit()
+{
+ if (IPDF_VariableText * pVT = IPDF_VariableText::NewVariableText())
+ {
+ return new CFX_Edit(pVT);
+ }
+
+ return NULL;
+}
+
+void IFX_Edit::DelEdit(IFX_Edit* pEdit)
+{
+ ASSERT(pEdit != NULL);
+
+ IPDF_VariableText::DelVariableText(pEdit->GetVariableText());
+
+ delete (CFX_Edit*)pEdit;
+}
+
+
+/* ---------------------- IFX_List ---------------------- */
+
+IFX_List* IFX_List::NewList()
+{
+ return new CFX_ListCtrl();
+}
+
+void IFX_List::DelList(IFX_List* pList)
+{
+ ASSERT(pList != NULL);
+
+ delete (CFX_ListCtrl*)pList;
+}
+
diff --git a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp
new file mode 100644
index 0000000000..99520619ad
--- /dev/null
+++ b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp
@@ -0,0 +1,687 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/fxedit/fxet_stub.h"
+#include "../../include/fxedit/fx_edit.h"
+#include "../../include/fxedit/fxet_edit.h"
+
+#define FX_EDIT_UNDERLINEHALFWIDTH 0.5f
+#define FX_EDIT_CROSSOUTHALFWIDTH 0.5f
+
+extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFontIndex, FX_WORD Word, FX_WORD SubWord);
+
+CPDF_Rect GetUnderLineRect(const CPVT_Word& word)
+{
+ return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
+ word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.25f);
+}
+
+CPDF_Rect GetCrossoutRect(const CPVT_Word& word)
+{
+ return CPDF_Rect(word.ptWord.x, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + word.fDescent * 0.25f,
+ word.ptWord.x + word.fWidth, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);
+}
+
+static void DrawTextString(CFX_RenderDevice* pDevice, const CPDF_Point& pt, CPDF_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device,
+ const CFX_ByteString& str, FX_ARGB crTextFill, FX_ARGB crTextStroke, FX_INT32 nHorzScale)
+{
+ FX_FLOAT x = pt.x, y = pt.y;
+ pUser2Device->Transform(x, y);
+
+ if (pFont)
+ {
+ if (nHorzScale != 100)
+ {
+ CPDF_Matrix mt(nHorzScale/100.0f,0,0,1,0,0);
+ mt.Concat(*pUser2Device);
+
+ CPDF_RenderOptions ro;
+ ro.m_Flags = RENDER_CLEARTYPE;
+ ro.m_ColorMode = RENDER_COLOR_NORMAL;
+
+ if (crTextStroke != 0)
+ {
+ CPDF_Point pt1(0,0), pt2(1,0);
+ pUser2Device->Transform(pt1.x, pt1.y);
+ pUser2Device->Transform(pt2.x, pt2.y);
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
+
+ CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, crTextStroke, &gsd, &ro);
+ }
+ else
+ CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, 0, NULL, &ro);
+ }
+ else
+ {
+ CPDF_RenderOptions ro;
+ ro.m_Flags = RENDER_CLEARTYPE;
+ ro.m_ColorMode = RENDER_COLOR_NORMAL;
+
+ if (crTextStroke != 0)
+ {
+ CPDF_Point pt1(0,0), pt2(1,0);
+ pUser2Device->Transform(pt1.x, pt1.y);
+ pUser2Device->Transform(pt2.x, pt2.y);
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
+
+ CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, crTextStroke, &gsd, &ro);
+ }
+ else
+ CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, 0, NULL, &ro);
+ }
+ }
+}
+
+void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
+{
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ CFX_PathData pathUnderline;
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ rcUnderline.left += ptOffset.x;
+ rcUnderline.right += ptOffset.x;
+ rcUnderline.top += ptOffset.y;
+ rcUnderline.bottom += ptOffset.y;
+ pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
+
+ pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0, FXFILL_WINDING);
+ }
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData)
+{
+
+ FX_BOOL bContinuous = pEdit->GetCharArray() == 0;
+ if (pEdit->GetCharSpace() > 0.0f)
+ bContinuous = FALSE;
+
+ FX_WORD SubWord = pEdit->GetPasswordChar();
+ FX_FLOAT fFontSize = pEdit->GetFontSize();
+ CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
+ FX_INT32 nHorzScale = pEdit->GetHorzScale();
+
+ FX_COLORREF crCurFill = crTextFill;
+ FX_COLORREF crOldFill = crCurFill;
+
+ FX_BOOL bSelect = FALSE;
+ const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
+ const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
+
+ CFX_ByteTextBuf sTextBuf;
+ FX_INT32 nFontIndex = -1;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ if (wrSelect.IsExist())
+ {
+ bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
+ if (bSelect)
+ {
+ crCurFill = crWhite;
+ }
+ else
+ {
+ crCurFill = crTextFill;
+ }
+ }
+ if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
+ {
+ crCurFill = crTextFill;
+ crOldFill = crCurFill;
+ }
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+
+ if (bSelect)
+ {
+
+ CPVT_Line line;
+ pIterator->GetLine(line);
+
+ if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
+ {
+ CPDF_Rect rc(word.ptWord.x,line.ptLine.y + line.fLineDescent,
+ word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
+ rc.Intersect(rcClip);
+ //CFX_Edit* pEt = (CFX_Edit*)pEdit;
+ //CPDF_Rect rcEdit = pEt->VTToEdit(rc);
+ pSystemHandler->OutputSelectedRect(pFFLData,rc);
+ }
+ else
+ {
+ CFX_PathData pathSelBK;
+ pathSelBK.AppendRect(word.ptWord.x,line.ptLine.y + line.fLineDescent,
+ word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
+
+ pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
+ }
+ }
+
+ if (bContinuous)
+ {
+ if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
+ crOldFill != crCurFill)
+ {
+ if (sTextBuf.GetLength() > 0)
+ {
+ DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
+ fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
+
+ sTextBuf.Clear();
+ }
+ nFontIndex = word.nFontIndex;
+ ptBT = word.ptWord;
+ crOldFill = crCurFill;
+ }
+
+ sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord);
+ }
+ else
+ {
+ DrawTextString(pDevice,CPDF_Point(word.ptWord.x+ptOffset.x, word.ptWord.y+ptOffset.y), pFontMap->GetPDFFont(word.nFontIndex),
+ fFontSize, pUser2Device, GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), crCurFill, crTextStroke, nHorzScale);
+
+ }
+ oldplace = place;
+
+
+ }
+ }
+
+ if (sTextBuf.GetLength() > 0)
+ {
+ DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
+ fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
+{
+ //FX_FLOAT fFontSize = pEdit->GetFontSize();
+ CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
+
+ FX_COLORREF crCurText = ArgbEncode(255, 0,0,0);
+ FX_COLORREF crOld = crCurText;
+ FX_BOOL bSelect = FALSE;
+ const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
+ const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
+
+ CFX_ByteTextBuf sTextBuf;
+ CPVT_WordProps wp;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ word.WordProps.fFontSize = word.fFontSize;
+
+ crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
+
+ if (wrSelect.IsExist())
+ {
+ bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
+ if (bSelect)
+ {
+ crCurText = crWhite;
+ }
+ }
+
+ if (bSelect)
+ {
+ CPVT_Line line;
+ pIterator->GetLine(line);
+
+ CFX_PathData pathSelBK;
+ pathSelBK.AppendRect(word.ptWord.x + ptOffset.x,
+ line.ptLine.y + line.fLineDescent + ptOffset.y,
+ word.ptWord.x+word.fWidth + ptOffset.x,
+ line.ptLine.y + line.fLineAscent + ptOffset.y);
+
+ pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
+ }
+
+ if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
+ FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
+ crOld != crCurText)
+ {
+ if (sTextBuf.GetLength() > 0)
+ {
+ DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
+ wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
+
+ sTextBuf.Clear();
+ }
+ wp = word.WordProps;
+ ptBT = word.ptWord;
+ crOld = crCurText;
+ }
+
+ sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
+
+ if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
+ {
+ CFX_PathData pathUnderline;
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
+
+ pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
+ }
+
+ if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
+ {
+ CFX_PathData pathCrossout;
+ CPDF_Rect rcCrossout = GetCrossoutRect(word);
+ pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom, rcCrossout.right, rcCrossout.top);
+
+ pDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
+ }
+
+ oldplace = place;
+ }
+ }
+
+ if (sTextBuf.GetLength() > 0)
+ {
+ DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
+ wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+static void AddLineToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crStroke,
+ const CPDF_Point& pt1, const CPDF_Point& pt2)
+{
+ CPDF_PathObject* pPathObj = new CPDF_PathObject;
+ CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
+
+ pPathData->SetPointCount(2);
+ pPathData->SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ pPathData->SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+
+ FX_FLOAT rgb[3];
+ rgb[0] = FXARGB_R(crStroke) / 255.0f;
+ rgb[1] = FXARGB_G(crStroke) / 255.0f;
+ rgb[2] = FXARGB_B(crStroke) / 255.0f;
+ pPathObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
+
+ CFX_GraphStateData* pData = pPathObj->m_GraphState.GetModify();
+ pData->m_LineWidth = 1;
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
+}
+
+static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill, const CPDF_Rect& rcFill)
+{
+ CPDF_PathObject* pPathObj = new CPDF_PathObject;
+ CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
+ pPathData->AppendRect(rcFill.left,rcFill.bottom,rcFill.right,rcFill.top);
+
+ FX_FLOAT rgb[3];
+ rgb[0] = FXARGB_R(crFill) / 255.0f ;
+ rgb[1] = FXARGB_G(crFill) / 255.0f;
+ rgb[2] = FXARGB_B(crFill) / 255.0f;
+ pPathObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
+
+ pPathObj->m_FillType = FXFILL_ALTERNATE;
+ pPathObj->m_bStroke = FALSE;
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
+}
+
+static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crText,
+ CPDF_Font* pFont, FX_FLOAT fFontSize, FX_FLOAT fCharSpace, FX_INT32 nHorzScale,
+ const CPDF_Point& point, const CFX_ByteString& text)
+{
+ CPDF_TextObject* pTxtObj = new CPDF_TextObject;
+
+ CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();
+ pTextStateData->m_pFont = pFont;
+ pTextStateData->m_FontSize = fFontSize;
+ pTextStateData->m_CharSpace = fCharSpace;
+ pTextStateData->m_WordSpace = 0;
+ pTextStateData->m_TextMode = 0;
+ pTextStateData->m_Matrix[0] = nHorzScale / 100.0f;
+ pTextStateData->m_Matrix[1] = 0;
+ pTextStateData->m_Matrix[2] = 0;
+ pTextStateData->m_Matrix[3] = 1;
+
+ FX_FLOAT rgb[3];
+ rgb[0] = FXARGB_R(crText) / 255.0f ;
+ rgb[1] = FXARGB_G(crText) / 255.0f;
+ rgb[2] = FXARGB_B(crText) / 255.0f;
+ pTxtObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
+ pTxtObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
+
+ pTxtObj->SetPosition(point.x,point.y);
+ pTxtObj->SetText(text);
+
+ pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj);
+
+ return pTxtObj;
+}
+
+/*
+List of currently supported standard fonts:
+Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
+Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
+Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
+Symbol, ZapfDingbats
+*/
+
+const char* g_sFXEDITStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
+ "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
+ "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
+ "Symbol", "ZapfDingbats"};
+
+static FX_BOOL FX_EDIT_IsStandardFont(const CFX_ByteString& sFontName)
+{
+ for (FX_INT32 i=0; i<14; i++)
+ {
+ if (sFontName == g_sFXEDITStandardFontName[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
+{
+ FX_FLOAT fFontSize = pEdit->GetFontSize();
+
+ FX_INT32 nOldFontIndex = -1;
+
+ CFX_ByteTextBuf sTextBuf;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ ObjArray.RemoveAll();
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ if (place.LineCmp(oldplace) != 0 || nOldFontIndex != word.nFontIndex)
+ {
+ if (sTextBuf.GetLength() > 0)
+ {
+ ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+
+ sTextBuf.Clear();
+ }
+
+ ptBT = word.ptWord;
+ nOldFontIndex = word.nFontIndex;
+ }
+
+ sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0);
+ oldplace = place;
+ }
+ }
+
+ if (sTextBuf.GetLength() > 0)
+ {
+ ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+ }
+ }
+ }
+}
+
+void IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
+{
+
+
+ FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
+ FX_COLORREF crOld = crCurText;
+
+
+ CFX_ByteTextBuf sTextBuf;
+ CPVT_WordProps wp;
+ CPDF_Point ptBT(0.0f,0.0f);
+
+ ObjArray.RemoveAll();
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ word.WordProps.fFontSize = word.fFontSize;
+
+ crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
+
+ if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
+ FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
+ crOld != crCurText)
+ {
+ if (sTextBuf.GetLength() > 0)
+ {
+ ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+
+ sTextBuf.Clear();
+ }
+
+ wp = word.WordProps;
+ ptBT = word.ptWord;
+ crOld = crCurText;
+
+ }
+
+ sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
+
+ if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
+ {/*
+ AddLineToPageObjects(pPageObjects, crCurText,
+ CPDF_Point(word.ptWord.x, word.ptWord.y + word.fDescent * 0.4f),
+ CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.4f));
+*/
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ rcUnderline.left += ptOffset.x;
+ rcUnderline.right += ptOffset.x;
+ rcUnderline.top += ptOffset.y;
+ rcUnderline.bottom += ptOffset.y;
+
+ AddRectToPageObjects(pPageObjects, crCurText, rcUnderline);
+ }
+
+ if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
+ {
+ CPDF_Rect rcCrossout = GetCrossoutRect(word);
+ rcCrossout.left += ptOffset.x;
+ rcCrossout.right += ptOffset.x;
+ rcCrossout.top += ptOffset.y;
+ rcCrossout.bottom += ptOffset.y;
+
+ AddRectToPageObjects(pPageObjects, crCurText, rcCrossout);
+ }
+
+ oldplace = place;
+ }
+ }
+
+ if (sTextBuf.GetLength() > 0)
+ {
+ ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
+ CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
+ }
+ }
+ }
+}
+
+void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
+ const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color)
+{
+
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ CPDF_Rect rcUnderline = GetUnderLineRect(word);
+ rcUnderline.left += ptOffset.x;
+ rcUnderline.right += ptOffset.x;
+ rcUnderline.top += ptOffset.y;
+ rcUnderline.bottom += ptOffset.y;
+ AddRectToPageObjects(pPageObjects, color, rcUnderline);
+ }
+ }
+ }
+ }
+}
+
diff --git a/fpdfsdk/src/javascript/Consts.cpp b/fpdfsdk/src/javascript/Consts.cpp
new file mode 100644
index 0000000000..09b8f8e1a0
--- /dev/null
+++ b/fpdfsdk/src/javascript/Consts.cpp
@@ -0,0 +1,247 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Consts.h"
+
+/* ------------------------------ border ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Border)
+ JS_STATIC_CONST_ENTRY_STRING(s, solid)
+ JS_STATIC_CONST_ENTRY_STRING(b, beveled)
+ JS_STATIC_CONST_ENTRY_STRING(d, dashed)
+ JS_STATIC_CONST_ENTRY_STRING(i, inset)
+ JS_STATIC_CONST_ENTRY_STRING(u, underline)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Border,border)
+
+/* ------------------------------ display ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Display)
+ JS_STATIC_CONST_ENTRY_NUMBER(visible, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(hidden, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(noPrint, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(noView, 3)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Display,display)
+
+/* ------------------------------ font ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Font)
+ JS_STATIC_CONST_ENTRY_STRING(Times, Times-Roman)
+ JS_STATIC_CONST_ENTRY_STRING(TimesB, Times-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(TimesI, Times-Italic)
+ JS_STATIC_CONST_ENTRY_STRING(TimesBI, Times-BoldItalic)
+ JS_STATIC_CONST_ENTRY_STRING(Helv, Helvetica)
+ JS_STATIC_CONST_ENTRY_STRING(HelvB, Helvetica-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(HelvI, Helvetica-Oblique)
+ JS_STATIC_CONST_ENTRY_STRING(HelvBI, Helvetica-BoldOblique)
+ JS_STATIC_CONST_ENTRY_STRING(Cour, Courier)
+ JS_STATIC_CONST_ENTRY_STRING(CourB, Courier-Bold)
+ JS_STATIC_CONST_ENTRY_STRING(CourI, Courier-Oblique)
+ JS_STATIC_CONST_ENTRY_STRING(CourBI, Courier-BoldOblique)
+ JS_STATIC_CONST_ENTRY_STRING(Symbol, Symbol)
+ JS_STATIC_CONST_ENTRY_STRING(ZapfD, ZapfDingbats)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Font,font)
+
+/* ------------------------------ highlight ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Highlight)
+ JS_STATIC_CONST_ENTRY_STRING(n, none)
+ JS_STATIC_CONST_ENTRY_STRING(i, invert)
+ JS_STATIC_CONST_ENTRY_STRING(p, push)
+ JS_STATIC_CONST_ENTRY_STRING(o, outline)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Highlight,highlight)
+
+/* ------------------------------ position ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Position)
+ JS_STATIC_CONST_ENTRY_NUMBER(textOnly, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconOnly, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconTextV, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(textIconV, 3)
+ JS_STATIC_CONST_ENTRY_NUMBER(iconTextH, 4)
+ JS_STATIC_CONST_ENTRY_NUMBER(textIconH, 5)
+ JS_STATIC_CONST_ENTRY_NUMBER(overlay, 6)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Position,position)
+
+/* ------------------------------ scaleHow ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_ScaleHow)
+ JS_STATIC_CONST_ENTRY_NUMBER(proportional, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(anamorphic, 1)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_ScaleHow,scaleHow)
+
+/* ------------------------------ scaleWhen ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_ScaleWhen)
+ JS_STATIC_CONST_ENTRY_NUMBER(always, 0)
+ JS_STATIC_CONST_ENTRY_NUMBER(never, 1)
+ JS_STATIC_CONST_ENTRY_NUMBER(tooBig, 2)
+ JS_STATIC_CONST_ENTRY_NUMBER(tooSmall, 3)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_ScaleWhen,scaleWhen)
+
+/* ------------------------------ style ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Style)
+ JS_STATIC_CONST_ENTRY_STRING(ch, check)
+ JS_STATIC_CONST_ENTRY_STRING(cr, cross)
+ JS_STATIC_CONST_ENTRY_STRING(di, diamond)
+ JS_STATIC_CONST_ENTRY_STRING(ci, circle)
+ JS_STATIC_CONST_ENTRY_STRING(st, star)
+ JS_STATIC_CONST_ENTRY_STRING(sq, square)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Style,style)
+
+
+/* ------------------------------ zoomtype ------------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Zoomtype)
+ JS_STATIC_CONST_ENTRY_STRING(none, NoVary)
+ JS_STATIC_CONST_ENTRY_STRING(fitP, FitPage)
+ JS_STATIC_CONST_ENTRY_STRING(fitW, FitWidth)
+ JS_STATIC_CONST_ENTRY_STRING(fitH, FitHeight)
+ JS_STATIC_CONST_ENTRY_STRING(fitV, FitVisibleWidth)
+ JS_STATIC_CONST_ENTRY_STRING(pref, Preferred)
+ JS_STATIC_CONST_ENTRY_STRING(refW, ReflowWidth)
+END_JS_STATIC_CONST()
+
+IMPLEMENT_JS_CLASS_CONST(CJS_Zoomtype,zoomtype)
+
+/* ------------------------------ CJS_GlobalConsts ------------------------------ */
+
+int CJS_GlobalConsts::Init(IJS_Runtime* pRuntime)
+{
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_GREATER_THAN , Invalid value: must be greater than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_GT_AND_LT,Invalid value: must be greater than or equal to %s and less than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_LESS_THAN,Invalid value: must be less than or equal to %s.);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_MONTH,** Invalid **);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_DATE,Invalid date/time: please ensure that the date/time exists. Field);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_INVALID_VALUE,The value entered does not match the format of the field);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_AM,am);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_PM,pm);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_MONTH_INFO,January[1]February[2]March[3]April[4]May[5]June[6]July[7]August[8]September[9]October[10]November[11]December[12]Sept[9]Jan[1]Feb[2]Mar[3]Apr[4]Jun[6]Jul[7]Aug[8]Sep[9]Oct[10]Nov[11]Dec[12]);
+ DEFINE_GLOBAL_CONST(pRuntime, IDS_STARTUP_CONSOLE_MSG, ** ^_^ **);
+
+ return 0;
+}
+
+/* ------------------------------ CJS_GlobalArrays ------------------------------ */
+
+int CJS_GlobalArrays::Init(IJS_Runtime* pRuntime)
+{
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_ENTRY_DOT_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d*\\.?\\d*"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_COMMIT_DOT_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d+(\\.\\d+)?", /* -1.0 or -1 */
+ (FX_LPCWSTR)L"[+-]?\\.\\d+", /* -.1 */
+ (FX_LPCWSTR)L"[+-]?\\d+\\." /* -1. */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_ENTRY_COMMA_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d*,?\\d*"};
+
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_NUMBER_COMMIT_COMMA_SEP";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"[+-]?\\d+([.,]\\d+)?", /* -1,0 or -1 */
+ (FX_LPCWSTR)L"[+-]?[.,]\\d+", /* -,1 */
+ (FX_LPCWSTR)L"[+-]?\\d+[.,]" /* -1, */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,5}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{5}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP4_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,5}(\\.|[- ])?\\d{0,4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_ZIP4_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{5}(\\.|[- ])?\\d{4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_PHONE_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {
+ (FX_LPCWSTR)L"\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* 555-1234 or 408 555-1234 */
+ (FX_LPCWSTR)L"\\(\\d{0,3}", /* (408 */
+ (FX_LPCWSTR)L"\\(\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* (408) 555-1234 */
+ /* (allow the addition of parens as an afterthought) */
+ (FX_LPCWSTR)L"\\(\\d{0,3}(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* (408 555-1234 */
+ (FX_LPCWSTR)L"\\d{0,3}\\)(\\.|[- ])?\\d{0,3}(\\.|[- ])?\\d{0,4}", /* 408) 555-1234 */
+ (FX_LPCWSTR)L"011(\\.|[- \\d])*" /* international */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_PHONE_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {
+ (FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{4}", /* 555-1234 */
+ (FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", /* 408 555-1234 */
+ (FX_LPCWSTR)L"\\(\\d{3}\\)(\\.|[- ])?\\d{3}(\\.|[- ])?\\d{4}", /* (408) 555-1234 */
+ (FX_LPCWSTR)L"011(\\.|[- \\d])*" /* international */
+ };
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_SSN_ENTRY";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{0,3}(\\.|[- ])?\\d{0,2}(\\.|[- ])?\\d{0,4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ {
+ FX_LPCWSTR ArrayName = (FX_LPCWSTR)L"RE_SSN_COMMIT";
+ FX_LPCWSTR ArrayContent[] = {(FX_LPCWSTR)L"\\d{3}(\\.|[- ])?\\d{2}(\\.|[- ])?\\d{4}"};
+ DEFINE_GLOBAL_ARRAY(pRuntime);
+ }
+
+ return 0;
+}
+
diff --git a/fpdfsdk/src/javascript/Document.cpp b/fpdfsdk/src/javascript/Document.cpp
new file mode 100644
index 0000000000..ec930b810d
--- /dev/null
+++ b/fpdfsdk/src/javascript/Document.cpp
@@ -0,0 +1,2527 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/Icon.h"
+#include "../../include/javascript/Field.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+BEGIN_JS_STATIC_CONST(CJS_PrintParamsObj)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_PrintParamsObj)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_PrintParamsObj)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj)
+
+PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
+: CJS_EmbedObj(pJSObject)
+{
+ bUI = TRUE;
+ nStart = 0;
+ nEnd = 0;
+ bSilent = FALSE;
+ bShrinkToFit = FALSE;
+ bPrintAsImage = FALSE;
+ bReverse = FALSE;
+ bAnnotations = TRUE;
+}
+
+/* ---------------------- Document ---------------------- */
+
+#define MINWIDTH 5.0f
+#define MINHEIGHT 5.0f
+
+BEGIN_JS_STATIC_CONST(CJS_Document)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Document)
+ JS_STATIC_PROP_ENTRY(ADBE)
+ JS_STATIC_PROP_ENTRY(author)
+ JS_STATIC_PROP_ENTRY(baseURL)
+ JS_STATIC_PROP_ENTRY(bookmarkRoot)
+ JS_STATIC_PROP_ENTRY(calculate)
+ JS_STATIC_PROP_ENTRY(Collab)
+ JS_STATIC_PROP_ENTRY(creationDate)
+ JS_STATIC_PROP_ENTRY(creator)
+ JS_STATIC_PROP_ENTRY(delay)
+ JS_STATIC_PROP_ENTRY(dirty)
+ JS_STATIC_PROP_ENTRY(documentFileName)
+ JS_STATIC_PROP_ENTRY(external)
+ JS_STATIC_PROP_ENTRY(filesize)
+ JS_STATIC_PROP_ENTRY(icons)
+ JS_STATIC_PROP_ENTRY(info)
+ JS_STATIC_PROP_ENTRY(keywords)
+ JS_STATIC_PROP_ENTRY(layout)
+ JS_STATIC_PROP_ENTRY(media)
+ JS_STATIC_PROP_ENTRY(modDate)
+ JS_STATIC_PROP_ENTRY(mouseX)
+ JS_STATIC_PROP_ENTRY(mouseY)
+ JS_STATIC_PROP_ENTRY(numFields)
+ JS_STATIC_PROP_ENTRY(numPages)
+ JS_STATIC_PROP_ENTRY(pageNum)
+ JS_STATIC_PROP_ENTRY(pageWindowRect)
+ JS_STATIC_PROP_ENTRY(path)
+ JS_STATIC_PROP_ENTRY(producer)
+ JS_STATIC_PROP_ENTRY(subject)
+ JS_STATIC_PROP_ENTRY(title)
+ JS_STATIC_PROP_ENTRY(zoom)
+ JS_STATIC_PROP_ENTRY(zoomType)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Document)
+ JS_STATIC_METHOD_ENTRY(addAnnot,0)
+ JS_STATIC_METHOD_ENTRY(addField, 4)
+ JS_STATIC_METHOD_ENTRY(addLink, 0)
+ JS_STATIC_METHOD_ENTRY(addIcon, 0)
+ JS_STATIC_METHOD_ENTRY(calculateNow, 0)
+ JS_STATIC_METHOD_ENTRY(closeDoc, 0)
+ JS_STATIC_METHOD_ENTRY(createDataObject, 0)
+ JS_STATIC_METHOD_ENTRY(deletePages, 2)
+ JS_STATIC_METHOD_ENTRY(exportAsText, 3)
+ JS_STATIC_METHOD_ENTRY(exportAsFDF, 6)
+ JS_STATIC_METHOD_ENTRY(exportAsXFDF, 5)
+ JS_STATIC_METHOD_ENTRY(extractPages, 3)
+ JS_STATIC_METHOD_ENTRY(getAnnot, 0)
+ JS_STATIC_METHOD_ENTRY(getAnnots, 2)
+ JS_STATIC_METHOD_ENTRY(getAnnot3D, 2)
+ JS_STATIC_METHOD_ENTRY(getAnnots3D, 1)
+ JS_STATIC_METHOD_ENTRY(getField, 1)
+ JS_STATIC_METHOD_ENTRY(getIcon, 0)
+ JS_STATIC_METHOD_ENTRY(getLinks, 0)
+ JS_STATIC_METHOD_ENTRY(getNthFieldName, 1)
+ JS_STATIC_METHOD_ENTRY(getOCGs, 0)
+ JS_STATIC_METHOD_ENTRY(getPageBox, 0)
+ JS_STATIC_METHOD_ENTRY(getPageNthWord, 3)
+ JS_STATIC_METHOD_ENTRY(getPageNthWordQuads, 2)
+ JS_STATIC_METHOD_ENTRY(getPageNumWords, 1)
+ JS_STATIC_METHOD_ENTRY(getPrintParams, 0)
+ JS_STATIC_METHOD_ENTRY(getURL, 2)
+ JS_STATIC_METHOD_ENTRY(importAnFDF, 1)
+ JS_STATIC_METHOD_ENTRY(importAnXFDF, 1)
+ JS_STATIC_METHOD_ENTRY(importTextData, 2)
+ JS_STATIC_METHOD_ENTRY(insertPages, 4)
+ JS_STATIC_METHOD_ENTRY(mailForm, 6)
+ JS_STATIC_METHOD_ENTRY(print, 9)
+ JS_STATIC_METHOD_ENTRY(removeField, 1)
+ JS_STATIC_METHOD_ENTRY(replacePages, 4)
+ JS_STATIC_METHOD_ENTRY(resetForm, 1)
+ JS_STATIC_METHOD_ENTRY(removeIcon, 0)
+ JS_STATIC_METHOD_ENTRY(saveAs, 5)
+ JS_STATIC_METHOD_ENTRY(submitForm, 23)
+ JS_STATIC_METHOD_ENTRY(mailDoc, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Document, Document)
+
+FX_BOOL CJS_Document::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ Document* pDoc = (Document*)GetEmbedObject();
+ ASSERT(pDoc != NULL);
+
+ pDoc->AttachDoc(pContext->GetReaderDocument());
+ pDoc->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+ return TRUE;
+};
+
+/* --------------------------------- Document --------------------------------- */
+
+Document::Document(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
+ m_cwBaseURL(L""),
+ m_pIconTree(NULL),
+ m_pDocument(NULL),
+ m_bDelay(FALSE),
+ m_isolate(NULL)
+{
+}
+
+Document::~Document()
+{
+ if (m_pIconTree)
+ {
+ m_pIconTree->DeleteIconTree();
+ delete m_pIconTree;
+ m_pIconTree = NULL;
+ }
+ for (int i=0; i<m_DelayData.GetSize(); i++)
+ {
+ if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+ {
+ delete pData;
+ pData = NULL;
+ m_DelayData.SetAt(i, NULL);
+
+ }
+ }
+
+ m_DelayData.RemoveAll();
+ m_DelayAnnotData.RemoveAll();
+}
+
+//the total number of fileds in document.
+FX_BOOL Document::numFields(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm *pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm *pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ vp << (int)pPDFForm->CountFields();
+
+ return TRUE;
+}
+
+FX_BOOL Document::dirty(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsGetting())
+ {
+ if (m_pDocument->GetChangeMark())
+ vp << true;
+ else
+ vp << false;
+ }
+ else
+ {
+ bool bChanged = false;
+
+ vp >> bChanged;
+
+ if (bChanged)
+ m_pDocument->SetChangeMark();
+ else
+ m_pDocument->ClearChangeMark();
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::ADBE(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsGetting())
+ {
+ vp.SetNull();
+ }
+ else
+ {
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::pageNum(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsGetting())
+ {
+ if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView())
+ {
+ vp << pPageView->GetPageIndex();
+ }
+ }
+ else
+ {
+ int iPageCount = m_pDocument->GetPageCount();
+
+ int iPageNum = 0;
+ vp >> iPageNum;
+
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ if(!pEnv)
+ return FALSE;
+
+ if (iPageNum >= 0 && iPageNum < iPageCount)
+ {
+ pEnv->JS_docgotoPage(iPageNum);
+ }
+ else if (iPageNum >= iPageCount)
+ {
+ pEnv->JS_docgotoPage(iPageCount-1);
+ }
+ else if (iPageNum < 0)
+ {
+ pEnv->JS_docgotoPage(0);
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::ParserParams(JSObject* pObj,CJS_AnnotObj& annotobj)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addAnnot(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addField(OBJ_METHOD_PARAMS)
+{
+ //Doesn't support.
+ return TRUE;
+}
+
+//exports form fields as a tab-delimited text file to a local hard disk.
+//comment: need reader support
+//note : watch the third parameter:cPath, for what case it can be safely saved?
+//int CPDFSDK_InterForm::ExportAsText(FX_BOOL bNoPassword,StringArray aFields,String cPath);
+//return value, int the index of the parameters illegal, the index is based on 1.
+
+FX_BOOL Document::exportAsText(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
+//exports form fields as a fdf file to the local hard drive
+//comment: need reader supports
+//note:the last parameter hasn't been confirmed.because the previous one blocks the way.
+//int CPDFSDK_Document::ExportAsFDF(FX_BOOL bAllFields,BOOL bNoPassword,StringArray aFields,FX_BOOL bFlags,String cPath,FX_BOOL bAnnotations);
+
+FX_BOOL Document::exportAsFDF(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ FX_BOOL bAllFields = params.size() > 0 ? (FX_BOOL)params[0] : FALSE;
+ FX_BOOL bNoPassWord = params.size() > 1 ? (FX_BOOL)params[1] : TRUE;
+ FX_BOOL bWhole = params.size() > 2 ? (params[2].GetType() == VT_null) : TRUE;
+ CJS_Array arrayFileds(isolate);
+ if (!bWhole)
+ arrayFileds.Attach(params[2]);
+ //FX_BOOL bFlags = params.size() > 3 ? (FX_BOOL)params[3] : FALSE;
+ CFX_WideString swFilePath = params.size() > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
+
+ if (swFilePath.IsEmpty())
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ swFilePath = pEnv->JS_fieldBrowse();
+ if(swFilePath.IsEmpty())
+ return TRUE;
+ }
+ else
+ {
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+ }
+
+ m_pDocument->SetFocusAnnot(NULL);
+
+ CPDFSDK_InterForm* pInterForm= (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ CFX_PtrArray aFields;
+
+ if (bWhole)
+ {
+ for (int j=0,jsz=pPDFForm->CountFields(); j<jsz; j++)
+ {
+ aFields.Add(pPDFForm->GetField(j));
+ }
+ }
+ else
+ {
+ for (int i=0,isz=arrayFileds.GetLength(); i<isz; i++)
+ {
+ CJS_Value valName(isolate);
+ arrayFileds.GetElement(i,valName);
+ CFX_WideString swName = valName.operator CFX_WideString();
+
+ for (int j=0, jsz=pPDFForm->CountFields(swName); j<jsz; j++)
+ {
+ aFields.Add(pPDFForm->GetField(j, swName));
+ }
+ }
+ }
+
+ CFX_PtrArray fields;
+
+ for (int i=0,sz=aFields.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pField = (CPDF_FormField*)aFields[i];
+
+ if (!bAllFields)
+ if (pField->GetValue() == L"")
+ continue;
+
+ if (bNoPassWord)
+ if (pField->GetFieldFlags() & 0x2000)
+ continue;
+
+ fields.Add((void*)pField);
+ }
+
+ return pInterForm->ExportFieldsToFDFFile(swFilePath, fields, TRUE);
+}
+
+//exports form fields an XFDF file to the local hard drive
+//comment: need reder supports
+//note:the last parameter can't be test
+//int CPDFSDK_Document::ExportAsXFDF(FX_BOOL bAllFields,FX_BOOL bNoPassWord,StringArray aFields,String cPath,FX_BOOL bAnnoatations);
+
+FX_BOOL Document::exportAsXFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ return TRUE;
+}
+
+//Maps a field object in PDF document to a JavaScript variable
+//comment:
+//note: the paremter cName, this is clue how to treat if the cName is not a valiable filed name in this document
+
+FX_BOOL Document::getField(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ ASSERT(m_pDocument != NULL);
+
+ if (params.size() < 1) return FALSE;
+
+ CFX_WideString wideName = params[0].operator CFX_WideString();
+
+ CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ if (pPDFForm->CountFields(wideName) <= 0)
+ {
+ vRet.SetNull();
+ return TRUE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+
+ CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(isolate,pFieldObj);
+ ASSERT(pJSField != NULL);
+
+ Field * pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->AttachField(this, wideName);
+ vRet = pJSField;
+
+ return TRUE;
+}
+
+//Gets the name of the nth field in the document
+//comment:
+//note: the parameter nIndex, if it is not available
+
+FX_BOOL Document::getNthFieldName(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = params.size() > 0 ? (int)params[0] : -1;
+ if (nIndex == -1) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ CPDF_FormField* pField = pPDFForm->GetField(nIndex);
+ if (!pField)
+ return FALSE;
+
+ vRet = pField->GetFullName();
+ return TRUE;
+}
+
+//imports the specified fdf file.
+//comments: need reader suppport
+//note:once the cpath is illigl then a file dialog box pops up in order to ask user to chooose the file
+//int CPDFSDK_Document::importAnFDF(String cPath);
+
+FX_BOOL Document::importAnFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+
+ CFX_WideString swPath;
+
+ if (params.size() > 0)
+ swPath = params[0];
+
+ if (swPath.IsEmpty())
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ swPath = pEnv->JS_fieldBrowse();
+ if(swPath.IsEmpty())
+ return TRUE;
+ }
+ else
+ {
+ swPath = app::PDFPathToSysPath(swPath);
+ }
+
+ m_pDocument->SetFocusAnnot(NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (!pInterForm->ImportFormFromFDFFile(swPath, TRUE))
+ return FALSE;
+
+ m_pDocument->SetChangeMark();
+// CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+// ASSERT(pEnv != NULL);
+// IUndo* pUndo = IUndo::GetUndo(pEnv);
+// ASSERT(pUndo != NULL);
+// pUndo->Reset(m_pDocument);
+
+ return TRUE;
+}
+
+//imports and specified XFDF file containing XML form data
+//comment: need reader supports
+//note: same as up
+//int CPDFSDK_Document::importAnFDF(String cPath)
+
+FX_BOOL Document::importAnXFDF(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ return TRUE;
+}
+
+//imports and specified text file
+//commnet: need reader supports
+//note: same as up,when nRow is not rational,adobe is dumb for it.
+//int CPDFSDK_Document::importTextData(String cPath,int nRow);
+
+FX_BOOL Document::importTextData(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ return TRUE;
+}
+
+//exports the form data and mails the resulting fdf file as an attachment to all recipients.
+//comment: need reader supports
+//note:
+//int CPDFSDK_Document::mailForm(FX_BOOL bUI,String cto,string ccc,string cbcc,string cSubject,string cms);
+
+FX_BOOL Document::mailForm(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int iLength = params.size();
+
+ FX_BOOL bUI = iLength > 0 ? (FX_BOOL)params[0] : TRUE;
+ CFX_WideString cTo = iLength > 1 ? (FX_LPCWSTR)params[1].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cCc = iLength > 2 ? (FX_LPCWSTR)params[2].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cBcc = iLength > 3 ? (FX_LPCWSTR)params[3].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cSubject = iLength > 4 ? (FX_LPCWSTR)params[4].operator CFX_WideString() : (FX_LPCWSTR)L"";
+ CFX_WideString cMsg = iLength > 5 ? (FX_LPCWSTR)params[5].operator CFX_WideString() : (FX_LPCWSTR)L"";
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_ByteTextBuf textBuf;
+ if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
+ return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
+ ASSERT(pEnv != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+ pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ pRuntime->EndBlock();
+ return TRUE;
+}
+
+FX_BOOL Document::print(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ FX_BOOL bUI = TRUE;
+ int nStart = 0;
+ int nEnd = 0;
+ FX_BOOL bSilent = FALSE;
+ FX_BOOL bShrinkToFit = FALSE;
+ FX_BOOL bPrintAsImage = FALSE;
+ FX_BOOL bReverse = FALSE;
+ FX_BOOL bAnnotations = FALSE;
+
+ int nlength = params.size();
+ if(nlength ==9)
+ {
+ if (params[8].GetType() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[8];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[8])
+ {
+ if (PrintParamsObj* pprintparamsObj = (PrintParamsObj*)pJSObj->GetEmbedObject())
+ {
+ bUI = pprintparamsObj->bUI;
+ nStart = pprintparamsObj->nStart;
+ nEnd = pprintparamsObj->nEnd;
+ bSilent = pprintparamsObj->bSilent;
+ bShrinkToFit = pprintparamsObj->bShrinkToFit;
+ bPrintAsImage = pprintparamsObj->bPrintAsImage;
+ bReverse = pprintparamsObj->bReverse;
+ bAnnotations = pprintparamsObj->bAnnotations;
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if(nlength >= 1)
+ bUI = params[0];
+ if(nlength >= 2)
+ nStart = (int)params[1];
+ if(nlength >= 3)
+ nEnd = (int)params[2];
+ if(nlength >= 4)
+ bSilent = params[3];
+ if(nlength >= 5)
+ bShrinkToFit = params[4];
+ if(nlength >= 6)
+ bPrintAsImage = params[5];
+ if(nlength >= 7)
+ bReverse = params[6];
+ if(nlength >= 8)
+ bAnnotations = params[7];
+ }
+
+ ASSERT(m_pDocument != NULL);
+
+ if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv())
+ {
+ pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage, bReverse, bAnnotations);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//removes the specified field from the document.
+//comment:
+//note: if the filed name is not retional, adobe is dumb for it.
+
+FX_BOOL Document::removeField(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) return FALSE;
+
+ if (params.size() < 1)
+ return TRUE;
+
+ CFX_WideString sFieldName = params[0].operator CFX_WideString();
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgets;
+ pInterForm->GetWidgets(sFieldName, widgets);
+
+ int nSize = widgets.GetSize();
+
+ if (nSize > 0)
+ {
+ for (int i=0; i<nSize; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets[i];
+ ASSERT(pWidget != NULL);
+
+ CPDF_Rect rcAnnot = pWidget->GetRect();
+ rcAnnot.left -= 1;
+ rcAnnot.bottom -= 1;
+ rcAnnot.right += 1;
+ rcAnnot.top += 1;
+
+ CFX_RectArray aRefresh;
+ aRefresh.Add(rcAnnot);
+
+ CPDF_Page* pPage = pWidget->GetPDFPage();
+ ASSERT(pPage != NULL);
+
+ CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);
+ pPageView->DeleteAnnot(pWidget);
+
+ pPageView->UpdateRects(aRefresh);
+ }
+ m_pDocument->SetChangeMark();
+ }
+
+ return TRUE;
+}
+
+//reset filed values within a document.
+//comment:
+//note: if the fields names r not rational, aodbe is dumb for it.
+
+FX_BOOL Document::resetForm(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ v8::Isolate* isolate = GetIsolate(cc);
+ CJS_Array aName(isolate);
+
+ if (params.size() > 0)
+ {
+ switch (params[0].GetType())
+ {
+ default:
+ aName.Attach(params[0]);
+ break;
+ case VT_string:
+ aName.SetElement(0,params[0]);
+ break;
+ }
+
+ CFX_PtrArray aFields;
+
+ for (int i=0,isz=aName.GetLength(); i<isz; i++)
+ {
+ CJS_Value valElement(isolate);
+ aName.GetElement(i,valElement);
+ CFX_WideString swVal = valElement.operator CFX_WideString();
+
+ for (int j=0,jsz=pPDFForm->CountFields(swVal); j<jsz; j++)
+ {
+ aFields.Add((void*)pPDFForm->GetField(j,swVal));
+ }
+ }
+
+ if (aFields.GetSize() > 0)
+ {
+ pPDFForm->ResetForm(aFields, TRUE, TRUE);
+ m_pDocument->SetChangeMark();
+
+ }
+ }
+ else
+ {
+ pPDFForm->ResetForm(TRUE);
+ m_pDocument->SetChangeMark();
+
+ }
+
+ return TRUE;
+}
+
+
+FX_BOOL Document::saveAs(OBJ_METHOD_PARAMS)
+{
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+// m_pDocument->DoSaveAs();
+
+ return TRUE;
+}
+
+
+FX_BOOL Document::submitForm(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+// if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nSize = params.size();
+ if (nSize < 1) return FALSE;
+
+ CFX_WideString strURL;
+ FX_BOOL bFDF = TRUE;
+ FX_BOOL bEmpty = FALSE;
+ v8::Isolate* isolate = GetIsolate(cc);
+ CJS_Array aFields(isolate);
+
+ CJS_Value v = params[0];
+ if (v.GetType() == VT_string)
+ {
+ strURL = params[0].operator CFX_WideString();
+ if (nSize > 1)
+ bFDF = params[1];
+ if (nSize > 2)
+ bEmpty = params[2];
+ if (nSize > 3)
+ aFields.Attach(params[3]);
+ }
+ else if (v.GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject)params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"cURL");
+ if (!pValue.IsEmpty())
+ strURL = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj, L"bFDF");
+ bFDF = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj, L"bEmpty");
+ bEmpty = CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue));
+ pValue = JS_GetObjectElement(isolate,pObj,L"aFields");
+ aFields.Attach(CJS_Value(isolate,pValue, GET_VALUE_TYPE(pValue)));
+ }
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+ CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
+ ASSERT(pPDFInterForm != NULL);
+
+ FX_BOOL bAll = (aFields.GetLength() == 0);
+
+ if (bAll && bEmpty)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+
+ if (pPDFInterForm->CheckRequiredFields())
+ {
+ pRuntime->BeginBlock();
+ pInterForm->SubmitForm(strURL, FALSE);
+ pRuntime->EndBlock();
+ }
+
+ return TRUE;
+ }
+ else
+ {
+ CFX_PtrArray fieldObjects;
+
+ for (int i=0,sz=aFields.GetLength(); i<sz; i++)
+ {
+ CJS_Value valName(isolate);
+ aFields.GetElement(i, valName);
+ CFX_WideString sName = valName.operator CFX_WideString();
+
+ CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
+ ASSERT(pPDFForm != NULL);
+
+ for (int j=0, jsz=pPDFForm->CountFields(sName); j<jsz; j++)
+ {
+ CPDF_FormField* pField = pPDFForm->GetField(j, sName);
+ if (!bEmpty && pField->GetValue().IsEmpty())
+ continue;
+
+ fieldObjects.Add(pField);
+ }
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+
+ if (pPDFInterForm->CheckRequiredFields(&fieldObjects, TRUE))
+ {
+ pRuntime->BeginBlock();
+ pInterForm->SubmitFields(strURL, fieldObjects, TRUE, !bFDF);
+ pRuntime->EndBlock();
+ }
+
+ return TRUE;
+ }
+
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+void Document::AttachDoc(CPDFSDK_Document *pDoc)
+{
+ m_pDocument = pDoc;
+}
+
+CPDFSDK_Document * Document::GetReaderDoc()
+{
+ return m_pDocument;
+}
+
+FX_BOOL Document::ExtractFileName(CPDFSDK_Document *pDoc,CFX_ByteString &strFileName)
+{
+ return FALSE;
+}
+
+FX_BOOL Document::ExtractFolderName(CPDFSDK_Document *pDoc,CFX_ByteString &strFolderName)
+{
+ return FALSE;
+}
+
+FX_BOOL Document::bookmarkRoot(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::mailDoc(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ FX_BOOL bUI = TRUE;
+ CFX_WideString cTo = L"";
+ CFX_WideString cCc = L"";
+ CFX_WideString cBcc = L"";
+ CFX_WideString cSubject = L"";
+ CFX_WideString cMsg = L"";
+
+
+ bUI = params.size()>=1?static_cast<FX_BOOL>(params[0]):TRUE;
+ cTo = params.size()>=2?(const wchar_t*)params[1].operator CFX_WideString():L"";
+ cCc = params.size()>=3?(const wchar_t*)params[2].operator CFX_WideString():L"";
+ cBcc = params.size()>=4?(const wchar_t*)params[3].operator CFX_WideString():L"";
+ cSubject = params.size()>=5?(const wchar_t*)params[4].operator CFX_WideString():L"";
+ cMsg = params.size()>=6?(const wchar_t*)params[5].operator CFX_WideString():L"";
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if(params.size()>=1 && params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
+ bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cTo");
+ cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
+ cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
+ cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
+ cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
+ cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+ CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
+ pEnv->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ pRuntime->EndBlock();
+
+ return TRUE;
+}
+
+FX_BOOL Document::author(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Author");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csAuthor;
+ vp >> csAuthor;
+ pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::info(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ CFX_WideString cwAuthor = pDictionary->GetUnicodeText("Author");
+ CFX_WideString cwTitle = pDictionary->GetUnicodeText("Title");
+ CFX_WideString cwSubject = pDictionary->GetUnicodeText("Subject");
+ CFX_WideString cwKeywords = pDictionary->GetUnicodeText("Keywords");
+ CFX_WideString cwCreator = pDictionary->GetUnicodeText("Creator");
+ CFX_WideString cwProducer = pDictionary->GetUnicodeText("Producer");
+ CFX_WideString cwCreationDate = pDictionary->GetUnicodeText("CreationDate");
+ CFX_WideString cwModDate = pDictionary->GetUnicodeText("ModDate");
+ CFX_WideString cwTrapped = pDictionary->GetUnicodeText("Trapped");
+
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (!vp.IsSetting())
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
+
+ JS_PutObjectString(isolate,pObj, L"Author", cwAuthor);
+ JS_PutObjectString(isolate,pObj, L"Title", cwTitle);
+ JS_PutObjectString(isolate,pObj, L"Subject", cwSubject);
+ JS_PutObjectString(isolate,pObj, L"Keywords", cwKeywords);
+ JS_PutObjectString(isolate,pObj, L"Creator", cwCreator);
+ JS_PutObjectString(isolate,pObj, L"Producer", cwProducer);
+ JS_PutObjectString(isolate,pObj, L"CreationDate", cwCreationDate);
+ JS_PutObjectString(isolate,pObj, L"ModDate", cwModDate);
+ JS_PutObjectString(isolate,pObj, L"Trapped", cwTrapped);
+
+// It's to be compatible to non-standard info dictionary.
+ FX_POSITION pos = pDictionary->GetStartPos();
+ while(pos)
+ {
+ CFX_ByteString bsKey;
+ CPDF_Object* pValueObj = pDictionary->GetNextElement(pos, bsKey);
+ CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey);
+ if((pValueObj->GetType()==PDFOBJ_STRING) || (pValueObj->GetType()==PDFOBJ_NAME) )
+ JS_PutObjectString(isolate,pObj, wsKey, pValueObj->GetUnicodeText());
+ if(pValueObj->GetType()==PDFOBJ_NUMBER)
+ JS_PutObjectNumber(isolate,pObj, wsKey, (float)pValueObj->GetNumber());
+ if(pValueObj->GetType()==PDFOBJ_BOOLEAN)
+ JS_PutObjectBoolean(isolate,pObj, wsKey, (bool)pValueObj->GetInteger());
+ }
+
+ vp << pObj;
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::creationDate(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("CreationDate");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csCreationDate;
+ vp >> csCreationDate;
+ pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
+ m_pDocument->SetChangeMark();
+
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::creator(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Creator");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csCreator;
+ vp >> csCreator;
+ pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::delay(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << m_bDelay;
+ return TRUE;
+ }
+ else
+ {
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ bool b;
+ vp >> b;
+
+ m_bDelay = b;
+
+ if (m_bDelay)
+ {
+ for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
+ delete m_DelayData.GetAt(i);
+
+ m_DelayData.RemoveAll();
+ }
+ else
+ {
+ for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
+ {
+ if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+ {
+ Field::DoDelay(m_pDocument, pData);
+ delete m_DelayData.GetAt(i);
+ }
+ }
+ m_DelayData.RemoveAll();
+ }
+
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::keywords(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Keywords");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csKeywords;
+ vp >> csKeywords;
+ pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::modDate(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("ModDate");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csmodDate;
+ vp >> csmodDate;
+ pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::producer(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Producer");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString csproducer;
+ vp >> csproducer;
+ pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::subject(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Subject");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString cssubject;
+ vp >> cssubject;
+ pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::title(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (m_pDocument == NULL || m_pDocument->GetDocument() == NULL)
+ return FALSE;
+
+ CPDF_Dictionary* pDictionary = m_pDocument->GetDocument()->GetInfo();
+ if (!pDictionary)return FALSE;
+
+ if (vp.IsGetting())
+ {
+ vp << pDictionary->GetUnicodeText("Title");
+ return TRUE;
+ }
+ else
+ {
+ if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY)) return FALSE;
+
+ CFX_WideString cstitle;
+ vp >> cstitle;
+ pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
+ m_pDocument->SetChangeMark();
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::numPages(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ ASSERT(m_pDocument != NULL);
+ vp << m_pDocument->GetPageCount();
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+FX_BOOL Document::external(OBJ_PROP_PARAMS)
+{
+ //In Chrome case,should always return true.
+ vp << TRUE;
+ return TRUE;
+}
+
+FX_BOOL Document::filesize(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+// CFile file(m_pDocument->GetPath(), CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);
+// vp << (double)file.GetLength();
+// file.Close();
+
+ if ( m_pDocument->GetPath().IsEmpty() == FALSE)
+ {
+ CFX_ByteString bsStr = CFX_ByteString::FromUnicode( m_pDocument->GetPath() );
+ FILE * pFile = NULL;
+ pFile = fopen( bsStr.GetBuffer( bsStr.GetLength() ), "rb" );
+ if ( pFile )
+ {
+ fseek( pFile, 0, SEEK_END );
+ long lSize = ftell( pFile );
+ fclose( pFile );
+ pFile = NULL;
+
+ vp << (FX_INT32)(lSize);
+ return TRUE;
+ }
+ }
+
+ vp << 0;
+ return TRUE;
+}
+
+FX_BOOL Document::mouseX(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::mouseY(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::baseURL(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << m_cwBaseURL;
+ return TRUE;
+ }
+ else
+ {
+ vp >> m_cwBaseURL;
+ return TRUE;
+ }
+}
+
+FX_BOOL Document::calculate(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if (vp.IsGetting())
+ {
+ if (pInterForm->IsCalculateEnabled())
+ vp << true;
+ else
+ vp << false;
+ }
+ else
+ {
+ bool bCalculate;
+ vp >> bCalculate;
+
+ pInterForm->EnableCalculate(bCalculate);
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::documentFileName(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())
+ return FALSE;
+
+ CFX_WideString wsFilePath = m_pDocument->GetPath();
+
+ FX_INT32 i = wsFilePath.GetLength() - 1;
+ for ( ; i >= 0; i-- )
+ {
+ if ( wsFilePath.GetAt( i ) == L'\\' || wsFilePath.GetAt( i ) == L'/' )
+ break;
+ }
+ if ( i >= 0 && i < wsFilePath.GetLength() - 1 )
+ {
+ vp << ( wsFilePath.GetBuffer( wsFilePath.GetLength() ) + i + 1 );
+ }else{
+ vp << L"";
+ }
+ return TRUE;
+}
+
+CFX_WideString Document::ReversalStr(CFX_WideString cbFrom)
+{
+ wchar_t* pFrom = NULL;
+ int iLenth = cbFrom.GetLength();
+ wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
+ memset(pResult, 0, (iLenth+1));
+ pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
+
+ for (int i = 0; i < iLenth; i++)
+ {
+ pResult[i] = *(pFrom + iLenth - i - 1);
+ }
+
+ cbFrom.ReleaseBuffer();
+ CFX_WideString cbRet = CFX_WideString(pResult);
+ free(pResult);
+ pResult = NULL;
+ return cbRet;
+}
+
+CFX_WideString Document::CutString(CFX_WideString cbFrom)
+{
+ wchar_t* pFrom = NULL;
+ int iLenth = cbFrom.GetLength();
+ wchar_t* pResult = (wchar_t*)malloc((iLenth+1) * sizeof(wchar_t));
+ memset(pResult, 0, (iLenth+1));
+ pFrom = (wchar_t*)cbFrom.GetBuffer(iLenth);
+
+ for (int i = 0; i < iLenth; i++)
+ {
+ if (pFrom[i] == L'\\' || pFrom[i] == L'/')
+ break;
+ pResult[i] = pFrom[i];
+ }
+
+ cbFrom.ReleaseBuffer();
+ CFX_WideString cbRet = CFX_WideString(pResult);
+ free(pResult);
+ pResult = NULL;
+ return cbRet;
+}
+
+FX_BOOL Document::path(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ vp << app::SysPathToPDFPath(m_pDocument->GetPath());
+
+ return TRUE;
+}
+
+FX_BOOL Document::pageWindowRect(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::layout(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::addLink(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::closeDoc(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL Document::getPageBox(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+
+FX_BOOL Document::getAnnot(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnots(OBJ_METHOD_PARAMS)
+{
+ vRet.SetNull();
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnot3D(OBJ_METHOD_PARAMS)
+{
+ vRet.SetNull();
+ return TRUE;
+}
+
+FX_BOOL Document::getAnnots3D(OBJ_METHOD_PARAMS)
+{
+ vRet = VT_undefined;
+ return TRUE;
+}
+
+FX_BOOL Document::getOCGs(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getLinks(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect)
+{
+ if (rect.left <= LinkRect.left
+ && rect.top <= LinkRect.top
+ && rect.right >= LinkRect.right
+ && rect.bottom >= LinkRect.bottom)
+ return true;
+ else
+ return false;
+}
+
+void IconTree::InsertIconElement(IconElement* pNewIcon)
+{
+ if (!pNewIcon)return;
+
+ if (m_pHead == NULL && m_pEnd == NULL)
+ {
+ m_pHead = m_pEnd = pNewIcon;
+ m_iLength++;
+ }
+ else
+ {
+ m_pEnd->NextIcon = pNewIcon;
+ m_pEnd = pNewIcon;
+ m_iLength++;
+ }
+}
+
+void IconTree::DeleteIconTree()
+{
+ if (!m_pHead || !m_pEnd)return;
+
+ IconElement* pTemp = NULL;
+ while(m_pEnd != m_pHead)
+ {
+ pTemp = m_pHead;
+ m_pHead = m_pHead->NextIcon;
+ delete pTemp;
+ }
+
+ delete m_pEnd;
+ m_pHead = NULL;
+ m_pEnd = NULL;
+}
+
+int IconTree::GetLength()
+{
+ return m_iLength;
+}
+
+IconElement* IconTree::operator [](int iIndex)
+{
+ if (iIndex >= 0 && iIndex <= m_iLength)
+ {
+ IconElement* pTemp = m_pHead;
+ for (int i = 0; i < iIndex; i++)
+ {
+ pTemp = pTemp->NextIcon;
+ }
+ return pTemp;
+ }
+ else
+ return NULL;
+}
+
+void IconTree::DeleteIconElement(CFX_WideString swIconName)
+{
+ IconElement* pTemp = m_pHead;
+ int iLoopCount = m_iLength;
+ for (int i = 0; i < iLoopCount - 1; i++)
+ {
+ if (pTemp == m_pEnd)
+ break;
+
+ if (m_pHead->IconName == swIconName)
+ {
+ m_pHead = m_pHead->NextIcon;
+ delete pTemp;
+ m_iLength--;
+ pTemp = m_pHead;
+ }
+ if (pTemp->NextIcon->IconName == swIconName)
+ {
+ if (pTemp->NextIcon == m_pEnd)
+ {
+ m_pEnd = pTemp;
+ delete pTemp->NextIcon;
+ m_iLength--;
+ pTemp->NextIcon = NULL;
+ }
+ else
+ {
+ IconElement* pElement = pTemp->NextIcon;
+ pTemp->NextIcon = pTemp->NextIcon->NextIcon;
+ delete pElement;
+ m_iLength--;
+ pElement = NULL;
+ }
+
+ continue;
+ }
+
+ pTemp = pTemp->NextIcon;
+ }
+}
+
+FX_BOOL Document::addIcon(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 2)return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+
+ JSFXObject pJSIcon = (JSFXObject)params[1];
+ if (JS_GetObjDefnID(pJSIcon) != JS_GetObjDefnID(*pRuntime, L"Icon")) return FALSE;
+
+ CJS_EmbedObj* pEmbedObj = ((CJS_Object*)params[1])->GetEmbedObject();
+ if (!pEmbedObj)return FALSE;
+ Icon* pIcon = (Icon*)pEmbedObj;
+
+ if (!m_pIconTree)
+ m_pIconTree = new IconTree();
+
+ IconElement* pNewIcon = new IconElement();
+ pNewIcon->IconName = swIconName;
+ pNewIcon->NextIcon = NULL;
+ pNewIcon->IconStream = pIcon;
+ m_pIconTree->InsertIconElement(pNewIcon);
+ return TRUE;
+}
+
+FX_BOOL Document::icons(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ return FALSE;
+
+ if (!m_pIconTree)
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+
+ CJS_Array Icons(m_isolate);
+ IconElement* pIconElement = NULL;
+ int iIconTreeLength = m_pIconTree->GetLength();
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ for (int i = 0; i < iIconTreeLength; i++)
+ {
+ pIconElement = (*m_pIconTree)[i];
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ if (pObj.IsEmpty()) return FALSE;
+
+ CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
+ if (!pJS_Icon) return FALSE;
+
+ Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+ if (!pIcon)return FALSE;
+
+ pIcon->SetStream(pIconElement->IconStream->GetStream());
+ pIcon->SetIconName(pIconElement->IconName);
+ Icons.SetElement(i, CJS_Value(m_isolate,pJS_Icon));
+ }
+
+ vp << Icons;
+ return TRUE;
+}
+
+FX_BOOL Document::getIcon(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)return FALSE;
+ if(!m_pIconTree)
+ return FALSE;
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+ int iIconCounts = m_pIconTree->GetLength();
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+
+ for (int i = 0; i < iIconCounts; i++)
+ {
+ if ((*m_pIconTree)[i]->IconName == swIconName)
+ {
+ Icon* pRetIcon = (*m_pIconTree)[i]->IconStream;
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ if (pObj.IsEmpty()) return FALSE;
+
+ CJS_Icon * pJS_Icon = (CJS_Icon *)JS_GetPrivate(pObj);
+ if (!pJS_Icon) return FALSE;
+
+ Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+ if (!pIcon)return FALSE;
+
+ pIcon->SetIconName(swIconName);
+ pIcon->SetStream(pRetIcon->GetStream());
+ vRet = pJS_Icon;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL Document::removeIcon(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)return FALSE;
+ if(!m_pIconTree)
+ return FALSE;
+ CFX_WideString swIconName = params[0].operator CFX_WideString();
+#ifndef FOXIT_CHROME_BUILD
+ m_pIconTree->DeleteIconElement(swIconName);
+#endif
+ return TRUE;
+}
+
+FX_BOOL Document::createDataObject(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ ASSERT(m_pDocument != NULL);
+
+ CFX_WideString swName = L"";
+ CFX_ByteString sbName = "";
+ CFX_WideString swValue = L"";
+ CFX_WideString swMIMEType = L"";
+ CFX_WideString swCryptFilter = L"";
+ CFX_ByteString sbFileValue = "";
+
+ int iParamSize = params.size();
+ for (int i = 0; i < iParamSize; i++)
+ {
+ if (i == 0)
+ swName = params[0];
+ if (i == 1)
+ swValue = params[1];
+ if (i == 2)
+ swMIMEType = params[2];
+ if (i == 3)
+ swCryptFilter = params[4];
+ }
+
+ FILE* pFile = NULL;
+
+ //CFileStatus fileStatus;
+ const int BUFSIZE = 17;
+ FX_BYTE buf[BUFSIZE];
+ FX_BYTE *pBuffer = NULL;
+ char* pBuf = NULL;
+ int nFileSize = 0;
+ sbFileValue = CFX_ByteString::FromUnicode(swValue);
+ sbName = CFX_ByteString::FromUnicode(swName);
+ int iBufLength = sbFileValue.GetLength();
+ pBuf = (char*)malloc(sizeof(char) * iBufLength);
+ pBuf = sbFileValue.GetBuffer(iBufLength);
+
+ if ( NULL == (pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "wb+" )) )
+ {
+ return FALSE;
+ }
+
+ fwrite( pBuf, sizeof(char), iBufLength, pFile );
+ fclose( pFile );
+ pFile = NULL;
+
+ pFile = FXSYS_fopen( sbName.GetBuffer(sbName.GetLength()), "rb+" );
+ fseek( pFile, 0, SEEK_END );
+ nFileSize = ftell( pFile );
+
+ pBuffer = new FX_BYTE[nFileSize];
+ fseek( pFile, 0, SEEK_SET );
+ size_t s = fread( pBuffer, sizeof(char), nFileSize, pFile );
+ if(s == 0)
+ {
+ delete[] pBuffer;
+ return FALSE;
+ }
+
+ CRYPT_MD5Generate(pBuffer, nFileSize, buf);
+ buf[BUFSIZE - 1] = 0;
+ CFX_WideString csCheckSum((FX_LPCWSTR)buf, 16);
+ delete[] pBuffer;
+
+ return TRUE;
+}
+
+FX_BOOL Document::media(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::calculateNow(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_FILL_FORM))) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+ pInterForm->OnCalculate();
+ return TRUE;
+}
+
+FX_BOOL Document::Collab(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::getPageNthWord(OBJ_METHOD_PARAMS)
+{
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
+ int nWordNo = params.GetSize() > 1 ? (int)params[1] : 0;
+ bool bStrip = params.GetSize() > 2 ? (bool)params[2] : true;
+
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ if (!pDocument) return FALSE;
+
+ if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+ if (!pPageDict) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDocument, pPageDict);
+ page.StartParse();
+ page.ParseContent();
+
+ FX_POSITION pos = page.GetFirstObjectPosition();
+
+ int nWords = 0;
+
+ CFX_WideString swRet;
+
+ while (pos)
+ {
+ if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+ {
+ if (pPageObj->m_Type == PDFPAGE_TEXT)
+ {
+ int nObjWords = CountWords((CPDF_TextObject*)pPageObj);
+
+ if (nWords + nObjWords >= nWordNo)
+ {
+ swRet = GetObjWordStr((CPDF_TextObject*)pPageObj, nWordNo - nWords);
+ break;
+ }
+
+ nWords += nObjWords;
+ }
+ }
+ }
+
+ if (bStrip)
+ {
+ swRet.TrimLeft();
+ swRet.TrimRight();
+ }
+
+ vRet = swRet;
+ return TRUE;
+}
+
+FX_BOOL Document::getPageNthWordQuads(OBJ_METHOD_PARAMS)
+{
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ return FALSE;
+}
+
+FX_BOOL Document::getPageNumWords(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) return FALSE;
+
+ int nPageNo = params.GetSize() > 0 ? (int)params[0] : 0;
+
+ CPDF_Document* pDocument = m_pDocument->GetDocument();
+ ASSERT(pDocument != NULL);
+
+ if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount())
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
+ if (!pPageDict) return FALSE;
+
+ CPDF_Page page;
+ page.Load(pDocument, pPageDict);
+ page.StartParse();
+ page.ParseContent();
+
+ FX_POSITION pos = page.GetFirstObjectPosition();
+
+ int nWords = 0;
+
+ while (pos)
+ {
+ if (CPDF_PageObject* pPageObj = page.GetNextObject(pos))
+ {
+ if (pPageObj->m_Type == PDFPAGE_TEXT)
+ {
+ CPDF_TextObject* pTextObj = (CPDF_TextObject*)pPageObj;
+ nWords += CountWords(pTextObj);
+ }
+ }
+ }
+
+ vRet = nWords;
+
+ return TRUE;
+}
+
+FX_BOOL Document::getPrintParams(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"PrintParamsObj"));
+ //not implemented yet.
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
+
+int Document::CountWords(CPDF_TextObject* pTextObj)
+{
+ if (!pTextObj) return 0;
+
+ int nWords = 0;
+
+ CPDF_Font* pFont = pTextObj->GetFont();
+ if (!pFont) return 0;
+
+ FX_BOOL bIsLatin = FALSE;
+
+ for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
+ {
+ FX_DWORD charcode = -1;
+ FX_FLOAT kerning;
+
+ pTextObj->GetCharInfo(i, charcode, kerning);
+ CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
+
+ FX_WORD unicode = 0;
+ if (swUnicode.GetLength() > 0)
+ unicode = swUnicode[0];
+
+ if (ISLATINWORD(unicode) && bIsLatin)
+ continue;
+
+ bIsLatin = ISLATINWORD(unicode);
+ if (unicode != 0x20)
+ nWords++;
+ }
+
+ return nWords;
+}
+
+CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex)
+{
+ ASSERT(pTextObj != NULL);
+
+ CFX_WideString swRet;
+
+ CPDF_Font* pFont = pTextObj->GetFont();
+ if (!pFont) return L"";
+
+ int nWords = 0;
+ FX_BOOL bIsLatin = FALSE;
+
+ for (int i=0, sz=pTextObj->CountChars(); i<sz; i++)
+ {
+ FX_DWORD charcode = -1;
+ FX_FLOAT kerning;
+
+ pTextObj->GetCharInfo(i, charcode, kerning);
+ CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
+
+ FX_WORD unicode = 0;
+ if (swUnicode.GetLength() > 0)
+ unicode = swUnicode[0];
+
+ if (ISLATINWORD(unicode) && bIsLatin)
+ {
+ }
+ else
+ {
+ bIsLatin = ISLATINWORD(unicode);
+ if (unicode != 0x20)
+ nWords++;
+ }
+
+ if (nWords-1 == nWordIndex)
+ swRet += unicode;
+ }
+
+ return swRet;
+}
+
+FX_BOOL Document::zoom(OBJ_PROP_PARAMS)
+{
+
+ return TRUE;
+}
+
+/**
+(none, NoVary)
+(fitP, FitPage)
+(fitW, FitWidth)
+(fitH, FitHeight)
+(fitV, FitVisibleWidth)
+(pref, Preferred)
+(refW, ReflowWidth)
+*/
+
+FX_BOOL Document::zoomType(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Document::deletePages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+// if (pEnv->GetAppName().Compare(PHANTOM) != 0)
+// return TRUE;
+
+ //if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = 0;
+ int nEnd = 0;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nStart = (int)params[0];
+ }
+ }
+ else
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ }
+
+ int nTotal = m_pDocument->GetPageCount();
+
+ if (nStart < 0) nStart = 0;
+ if (nStart >= nTotal) nStart = nTotal - 1;
+
+ if (nEnd < 0) nEnd = 0;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+
+
+
+#ifndef FOXIT_CHROME_BUILD
+ return m_pDocument->DeletePages(nStart, nEnd - nStart + 1);
+#else
+ return TRUE;
+#endif
+}
+
+FX_BOOL Document::extractPages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT)) return FALSE;
+
+ int iSize = params.size();
+
+ int nTotal = m_pDocument->GetPageCount();
+ int nStart = 0;
+ int nEnd = nTotal - 1;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+ }
+ else
+ {
+ nStart = (int)params[0];
+ }
+ }
+ else if (iSize == 2)
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ }
+ else
+ {
+ nStart = (int)params[0];
+ nEnd = (int)params[1];
+ swFilePath = params[2].operator CFX_WideString();
+ }
+
+ if (nEnd < nStart)
+ nEnd = nStart;
+
+ CPDF_Document *pNewDoc = new CPDF_Document;
+ pNewDoc->CreateNewDoc();
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->ExtractPages(array, pNewDoc);
+
+ if (swFilePath.IsEmpty())
+ {
+
+ }
+ else
+ {
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+ CPDF_Creator PDFCreater(pNewDoc);
+ PDFCreater.Create(swFilePath);
+ delete pNewDoc;
+// pEnv->OpenDocument(swFilePath);
+ vRet.SetNull();
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Document::insertPages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = 0;
+ int nEnd = 0;
+ int nPage = 0;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
+ nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nPage = (int)params[0];
+ }
+ }
+ else
+ {
+ nPage = (int)params[0];
+
+ if (iSize >= 2)
+ swFilePath = params[1].operator CFX_WideString();
+
+ if (iSize >= 3)
+ nStart = (int)params[2];
+
+ if (iSize >= 4)
+ nEnd = (int)params[3];
+ }
+
+ nPage++;
+
+ if (nPage < 0)
+ nPage = 0;
+
+ if (nPage > m_pDocument->GetPageCount())
+ nPage = m_pDocument->GetPageCount();
+
+ if (swFilePath.IsEmpty()) return FALSE;
+
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+
+ CPDF_Parser pdfParser;
+ pdfParser.StartParse(swFilePath, FALSE);
+ CPDF_Document* pSrcDoc = pdfParser.GetDocument();
+
+ if (!pSrcDoc)
+ {
+ pdfParser.CloseParser();
+ return FALSE;
+ }
+
+ int nTotal = pSrcDoc->GetPageCount();
+
+ if (nStart < 0) nStart = 0;
+ if (nStart >= nTotal) nStart = nTotal - 1;
+
+ if (nEnd < 0) nEnd = 0;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->InsertPages(nPage, pSrcDoc, array);
+
+ pdfParser.CloseParser();
+
+ return TRUE;
+}
+
+FX_BOOL Document::replacePages(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (IsSafeMode(cc)) return TRUE;
+
+ ASSERT(m_pDocument != NULL);
+
+ if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
+ m_pDocument->GetPermissions(FPDFPERM_ASSEMBLE))) return FALSE;
+
+ int iSize = params.size();
+
+ int nStart = -1;
+ int nEnd = -1;
+ int nPage = 0;
+
+ CFX_WideString swFilePath;
+
+ if (iSize < 1)
+ {
+ }
+ else if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"nPage");
+ nPage = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cPath");
+ swFilePath = CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nStart");
+ nStart = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"nEnd");
+ nEnd = (int)CJS_Value(m_isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ nPage = (int)params[0];
+ }
+ }
+ else
+ {
+ nPage = (int)params[0];
+
+ if (iSize >= 2)
+ swFilePath = params[1].operator CFX_WideString();
+
+ if (iSize >= 3)
+ nStart = (int)params[2];
+
+ if (iSize >= 4)
+ nEnd = (int)params[3];
+ }
+
+ if (nPage < 0)
+ nPage = 0;
+
+ if (nPage >= m_pDocument->GetPageCount())
+ nPage = m_pDocument->GetPageCount() - 1;
+
+ if (swFilePath.IsEmpty()) return FALSE;
+
+ swFilePath = app::PDFPathToSysPath(swFilePath);
+
+ CPDF_Parser pdfParser;
+ pdfParser.StartParse(swFilePath, FALSE);
+ CPDF_Document* pSrcDoc = pdfParser.GetDocument();
+
+ if (!pSrcDoc)
+ {
+ pdfParser.CloseParser();
+ return FALSE;
+ }
+
+ int nTotal = pSrcDoc->GetPageCount();
+
+ if (nStart < 0)
+ {
+ if (nEnd < 0)
+ {
+ nStart = 0;
+ nEnd = nTotal - 1;
+ }
+ else
+ {
+ nStart = 0;
+ }
+ }
+ else
+ {
+ if (nEnd < 0)
+ {
+ nEnd = nStart;
+ }
+ else
+ {
+ if (nStart >= nTotal) nStart = nTotal - 1;
+ if (nEnd >= nTotal) nEnd = nTotal - 1;
+
+ if (nEnd < nStart) nEnd = nStart;
+ }
+ }
+
+ CFX_WordArray array;
+ for (int i=nStart; i<=nEnd; i++)
+ array.Add(i);
+
+// m_pDocument->ReplacePages(nPage, pSrcDoc, array);
+
+ pdfParser.CloseParser();
+
+ return TRUE;
+}
+
+FX_BOOL Document::getURL(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+
+ return TRUE;
+}
+
+void Document::AddDelayData(CJS_DelayData* pData)
+{
+ m_DelayData.Add(pData);
+}
+
+void Document::DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex)
+{
+ CFX_DWordArray DelArray;
+
+ for (int i=0,sz=m_DelayData.GetSize(); i<sz; i++)
+ {
+ if (CJS_DelayData* pData = m_DelayData.GetAt(i))
+ {
+ if (pData->sFieldName == sFieldName && pData->nControlIndex == nControlIndex)
+ {
+ Field::DoDelay(m_pDocument, pData);
+ delete pData;
+ m_DelayData.SetAt(i, NULL);
+ DelArray.Add(i);
+ }
+ }
+ }
+
+ for (int j=DelArray.GetSize()-1; j>=0; j--)
+ {
+ m_DelayData.RemoveAt(DelArray[j]);
+ }
+}
+
+void Document::AddDelayAnnotData(CJS_AnnotObj *pData)
+{
+ m_DelayAnnotData.Add(pData);
+}
+
+void Document::DoAnnotDelay()
+{
+ CFX_DWordArray DelArray;
+
+ for (int j=DelArray.GetSize()-1; j>=0; j--)
+ {
+ m_DelayData.RemoveAt(DelArray[j]);
+ }
+}
diff --git a/fpdfsdk/src/javascript/Field.cpp b/fpdfsdk/src/javascript/Field.cpp
new file mode 100644
index 0000000000..44a744f1d1
--- /dev/null
+++ b/fpdfsdk/src/javascript/Field.cpp
@@ -0,0 +1,4128 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../include/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/Icon.h"
+
+
+/* ---------------------- Field ---------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Field)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Field)
+ JS_STATIC_PROP_ENTRY(alignment)
+ JS_STATIC_PROP_ENTRY(borderStyle)
+ JS_STATIC_PROP_ENTRY(buttonAlignX)
+ JS_STATIC_PROP_ENTRY(buttonAlignY)
+ JS_STATIC_PROP_ENTRY(buttonFitBounds)
+ JS_STATIC_PROP_ENTRY(buttonPosition)
+ JS_STATIC_PROP_ENTRY(buttonScaleHow)
+ JS_STATIC_PROP_ENTRY(buttonScaleWhen)
+ JS_STATIC_PROP_ENTRY(calcOrderIndex)
+ JS_STATIC_PROP_ENTRY(charLimit)
+ JS_STATIC_PROP_ENTRY(comb)
+ JS_STATIC_PROP_ENTRY(commitOnSelChange)
+ JS_STATIC_PROP_ENTRY(currentValueIndices)
+ JS_STATIC_PROP_ENTRY(defaultStyle)
+ JS_STATIC_PROP_ENTRY(defaultValue)
+ JS_STATIC_PROP_ENTRY(doNotScroll)
+ JS_STATIC_PROP_ENTRY(doNotSpellCheck)
+ JS_STATIC_PROP_ENTRY(delay)
+ JS_STATIC_PROP_ENTRY(display)
+ JS_STATIC_PROP_ENTRY(doc)
+ JS_STATIC_PROP_ENTRY(editable)
+ JS_STATIC_PROP_ENTRY(exportValues)
+ JS_STATIC_PROP_ENTRY(hidden)
+ JS_STATIC_PROP_ENTRY(fileSelect)
+ JS_STATIC_PROP_ENTRY(fillColor)
+ JS_STATIC_PROP_ENTRY(lineWidth)
+ JS_STATIC_PROP_ENTRY(highlight)
+ JS_STATIC_PROP_ENTRY(multiline)
+ JS_STATIC_PROP_ENTRY(multipleSelection)
+ JS_STATIC_PROP_ENTRY(name)
+ JS_STATIC_PROP_ENTRY(numItems)
+ JS_STATIC_PROP_ENTRY(page)
+ JS_STATIC_PROP_ENTRY(password)
+ JS_STATIC_PROP_ENTRY(print)
+ JS_STATIC_PROP_ENTRY(radiosInUnison)
+ JS_STATIC_PROP_ENTRY(readonly)
+ JS_STATIC_PROP_ENTRY(rect)
+ JS_STATIC_PROP_ENTRY(required)
+ JS_STATIC_PROP_ENTRY(richText)
+ JS_STATIC_PROP_ENTRY(richValue)
+ JS_STATIC_PROP_ENTRY(rotation)
+ JS_STATIC_PROP_ENTRY(strokeColor)
+ JS_STATIC_PROP_ENTRY(style)
+ JS_STATIC_PROP_ENTRY(submitName)
+ JS_STATIC_PROP_ENTRY(textColor)
+ JS_STATIC_PROP_ENTRY(textFont)
+ JS_STATIC_PROP_ENTRY(textSize)
+ JS_STATIC_PROP_ENTRY(type)
+ JS_STATIC_PROP_ENTRY(userName)
+ JS_STATIC_PROP_ENTRY(value)
+ JS_STATIC_PROP_ENTRY(valueAsString)
+ JS_STATIC_PROP_ENTRY(source)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Field)
+ JS_STATIC_METHOD_ENTRY(browseForFileToSubmit, 0)
+ JS_STATIC_METHOD_ENTRY(buttonGetCaption, 1)
+ JS_STATIC_METHOD_ENTRY(buttonGetIcon, 1)
+ JS_STATIC_METHOD_ENTRY(buttonImportIcon, 0)
+ JS_STATIC_METHOD_ENTRY(buttonSetCaption, 2)
+ JS_STATIC_METHOD_ENTRY(buttonSetIcon, 2)
+ JS_STATIC_METHOD_ENTRY(checkThisBox, 2)
+ JS_STATIC_METHOD_ENTRY(clearItems, 0)
+ JS_STATIC_METHOD_ENTRY(defaultIsChecked, 2)
+ JS_STATIC_METHOD_ENTRY(deleteItemAt, 1)
+ JS_STATIC_METHOD_ENTRY(getArray , 0)
+ JS_STATIC_METHOD_ENTRY(getItemAt, 0)
+ JS_STATIC_METHOD_ENTRY(getLock, 0)
+ JS_STATIC_METHOD_ENTRY(insertItemAt, 0)
+ JS_STATIC_METHOD_ENTRY(isBoxChecked, 1)
+ JS_STATIC_METHOD_ENTRY(isDefaultChecked, 1)
+ JS_STATIC_METHOD_ENTRY(setAction, 2)
+ JS_STATIC_METHOD_ENTRY(setFocus, 0)
+ JS_STATIC_METHOD_ENTRY(setItems, 1)
+ JS_STATIC_METHOD_ENTRY(setLock, 0)
+ JS_STATIC_METHOD_ENTRY(signatureGetModifications, 0)
+ JS_STATIC_METHOD_ENTRY(signatureGetSeedValue, 0)
+ JS_STATIC_METHOD_ENTRY(signatureInfo, 0)
+ JS_STATIC_METHOD_ENTRY(signatureSetSeedValue, 0)
+ JS_STATIC_METHOD_ENTRY(signatureSign, 0)
+ JS_STATIC_METHOD_ENTRY(signatureValidate, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Field, Field)
+
+FX_BOOL CJS_Field::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ Field* pField = (Field*)GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
+
+ return TRUE;
+};
+
+Field::Field(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject),
+ m_pJSDoc(NULL),
+ m_pDocument(NULL),
+ m_nFormControlIndex(-1),
+ m_bCanSet(FALSE),
+ m_bDelay(FALSE),
+ m_isolate(NULL)
+{
+}
+
+Field::~Field()
+{
+}
+
+//note: iControlNo = -1, means not a widget.
+void Field::ParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo)
+{
+ int iStart = strFieldNameParsed.find_last_of(L'.');
+ if (iStart == -1)
+ {
+ strFieldName = strFieldNameParsed;
+ iControlNo = -1;
+ return;
+ }
+ std::wstring suffixal = strFieldNameParsed.substr(iStart+1);
+ iControlNo = FXSYS_wtoi((FX_LPCWSTR)suffixal.c_str());
+ if (iControlNo == 0)
+ {
+ int iStart;
+ while((iStart = suffixal.find_last_of(L" ")) != -1)
+ {
+ suffixal.erase(iStart,1);
+ }
+
+ if (suffixal.compare(L"0") != 0)
+ {
+ strFieldName = strFieldNameParsed;
+ iControlNo = -1;
+ return;
+ }
+
+ }
+ strFieldName = strFieldNameParsed.substr(0,iStart);
+}
+
+FX_BOOL Field::AttachField(Document* pDocument, const CFX_WideString& csFieldName)
+{
+ ASSERT(pDocument != NULL);
+ m_pJSDoc = pDocument;
+
+ m_pDocument = pDocument->GetReaderDoc();
+ ASSERT(m_pDocument != NULL);
+
+ m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+ m_pDocument->GetPermissions(FPDFPERM_MODIFY);
+
+ CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+ ASSERT(pRDInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_WideString swFieldNameTemp = csFieldName;
+ swFieldNameTemp.Replace((FX_LPCWSTR)L"..", (FX_LPCWSTR)L".");
+
+ if (pInterForm->CountFields(swFieldNameTemp) <= 0)
+ {
+ std::wstring strFieldName;
+ int iControlNo = -1;
+ ParseFieldName((wchar_t*)(FX_LPCWSTR)swFieldNameTemp, strFieldName, iControlNo);
+ if (iControlNo == -1) return FALSE;
+
+ m_FieldName = strFieldName.c_str();
+ m_nFormControlIndex = iControlNo;
+ return TRUE;
+ }
+
+ m_FieldName = swFieldNameTemp;
+ m_nFormControlIndex = -1;
+
+ return TRUE;
+}
+
+void Field::GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
+ ASSERT(pReaderInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ ASSERT(FieldArray.GetSize() == 0);
+
+ for (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)
+ {
+ if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
+ FieldArray.Add((void*)pFormField);
+ }
+}
+
+void Field::GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
+{
+ ASSERT(m_pDocument != NULL);
+
+ Field::GetFormFields(m_pDocument, csFieldName, FieldArray);
+}
+
+void Field::UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgets;
+ pInterForm->GetWidgets(pFormField, widgets);
+
+ if (bResetAP)
+ {
+ int nFieldType = pFormField->GetFieldType();
+ if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
+ if (bFormated)
+ pWidget->ResetAppearance(sValue, FALSE);
+ else
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+ else
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+ }
+
+ if (bRefresh)
+ {
+ for (int i=0,sz=widgets.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+ CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+// CReader_Page* pPage = pWidget->GetPage();
+ ASSERT(pDoc != NULL);
+ pDoc->UpdateAllViews(NULL, pWidget);
+ }
+ }
+
+ if (bChangeMark)
+ pDocument->SetChangeMark();
+}
+
+void Field::UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl,
+ FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormControl != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
+
+ if (pWidget)
+ {
+ if (bResetAP)
+ {
+ int nFieldType = pWidget->GetFieldType();
+ if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
+ {
+ FX_BOOL bFormated = FALSE;
+ CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
+ if (bFormated)
+ pWidget->ResetAppearance(sValue, FALSE);
+ else
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ else
+ {
+ pWidget->ResetAppearance(NULL, FALSE);
+ }
+ }
+
+ if (bRefresh)
+ {
+ CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
+ CPDFSDK_Document* pDoc = pInterForm->GetDocument();
+ ASSERT(pDoc != NULL);
+ pDoc->UpdateAllViews(NULL, pWidget);
+ }
+
+ }
+
+ if (bChangeMark)
+ pDocument->SetChangeMark();
+}
+
+CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pFormControl != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ return pInterForm->GetWidget(pFormControl);
+}
+
+FX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel)
+{
+ ASSERT(pFormField != NULL);
+
+ for (int i=0,sz = pFormField->CountOptions(); i < sz; i++)
+ {
+ if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField)
+{
+ ASSERT(pFormField != NULL);
+ if(!pFormField->CountControls() || m_nFormControlIndex>=pFormField->CountControls()) return NULL;
+
+ if (m_nFormControlIndex<0)
+ return pFormField->GetControl(0);
+ else
+ return pFormField->GetControl(m_nFormControlIndex);
+}
+
+/* ---------------------------------------- property ---------------------------------------- */
+
+FX_BOOL Field::alignment(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_ByteString alignStr;
+ vp >> alignStr;
+
+ if (m_bDelay)
+ {
+ AddDelay_String(FP_ALIGNMENT, alignStr);
+ }
+ else
+ {
+ Field::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, alignStr);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ switch (pFormControl->GetControlAlignment())
+ {
+ case 1:
+ vp << (FX_LPCWSTR)L"center";
+ break;
+ case 0:
+ vp << (FX_LPCWSTR)L"left";
+ break;
+ case 2:
+ vp << (FX_LPCWSTR)L"right";
+ break;
+ default:
+ vp << (FX_LPCWSTR)L"";
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_ByteString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::borderStyle(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_ByteString strType = "";
+ vp >> strType;
+
+ if (m_bDelay)
+ {
+ AddDelay_String(FP_BORDERSTYLE, strType);
+ }
+ else
+ {
+ Field::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, strType);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ if (!pFormField) return FALSE;
+
+ CPDFSDK_Widget* pWidget = GetWidget(m_pDocument, GetSmartFieldControl(pFormField));
+ if (!pWidget) return FALSE;
+
+ int nBorderstyle = pWidget->GetBorderStyle();
+
+ switch (nBorderstyle)
+ {
+ case BBS_SOLID:
+ vp << (FX_LPCWSTR)L"solid";
+ break;
+ case BBS_DASH:
+ vp << (FX_LPCWSTR)L"dashed";
+ break;
+ case BBS_BEVELED:
+ vp << (FX_LPCWSTR)L"beveled";
+ break;
+ case BBS_INSET:
+ vp << (FX_LPCWSTR)L"inset";
+ break;
+ case BBS_UNDERLINE:
+ vp << (FX_LPCWSTR)L"underline";
+ break;
+ default:
+ vp << (FX_LPCWSTR)L"";
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_ByteString& string)
+{
+ ASSERT(pDocument != NULL);
+
+ int nBorderStyle = 0;
+
+ if (string == "solid")
+ nBorderStyle = BBS_SOLID;
+ else if (string == "beveled")
+ nBorderStyle = BBS_BEVELED;
+ else if (string == "dashed")
+ nBorderStyle = BBS_DASH;
+ else if (string == "inset")
+ nBorderStyle = BBS_INSET;
+ else if (string == "underline")
+ nBorderStyle = BBS_UNDERLINE;
+ else return;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))
+ {
+ if (pWidget->GetBorderStyle() != nBorderStyle)
+ {
+ pWidget->SetBorderStyle(nBorderStyle);
+ bSet = TRUE;
+ }
+ }
+ }
+ if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ else
+ {
+ if(nControlIndex >= pFormField->CountControls()) return;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl))
+ {
+ if (pWidget->GetBorderStyle() != nBorderStyle)
+ {
+ pWidget->SetBorderStyle(nBorderStyle);
+ UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+ }
+ }
+ }
+ }
+ }
+}
+
+FX_BOOL Field::buttonAlignX(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_BUTTONALIGNX, nVP);
+ }
+ else
+ {
+ Field::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CPDF_IconFit IconFit = pFormControl->GetIconFit();
+
+ FX_FLOAT fLeft,fBottom;
+ IconFit.GetIconPosition(fLeft,fBottom);
+
+ vp << (FX_INT32)fLeft;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonAlignY(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_BUTTONALIGNY, nVP);
+ }
+ else
+ {
+ Field::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CPDF_IconFit IconFit = pFormControl->GetIconFit();
+
+ FX_FLOAT fLeft,fBottom;
+ IconFit.GetIconPosition(fLeft,fBottom);
+
+ vp << (FX_INT32)fBottom;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonFitBounds(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
+ }
+ else
+ {
+ Field::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CPDF_IconFit IconFit = pFormControl->GetIconFit();
+ vp << IconFit.GetFittingBounds();
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonPosition(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_BUTTONPOSITION, nVP);
+ }
+ else
+ {
+ Field::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ vp << pFormControl->GetTextPosition();
+ }
+ return TRUE;
+}
+
+void Field::SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonScaleHow(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
+ }
+ else
+ {
+ Field::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CPDF_IconFit IconFit = pFormControl->GetIconFit();
+ if (IconFit.IsProportionalScale())
+ vp << (FX_INT32)0;
+ else
+ vp << (FX_INT32)1;
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::buttonScaleWhen(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
+ }
+ else
+ {
+ Field::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl) return FALSE;
+
+ CPDF_IconFit IconFit = pFormControl->GetIconFit();
+ int ScaleM = IconFit.GetScaleMethod();
+ switch (ScaleM)
+ {
+ case CPDF_IconFit::Always :
+ vp << (FX_INT32) CPDF_IconFit::Always;
+ break;
+ case CPDF_IconFit::Bigger :
+ vp << (FX_INT32) CPDF_IconFit::Bigger;
+ break;
+ case CPDF_IconFit::Never :
+ vp << (FX_INT32) CPDF_IconFit::Never;
+ break;
+ case CPDF_IconFit::Smaller :
+ vp << (FX_INT32) CPDF_IconFit::Smaller;
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::calcOrderIndex(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_CALCORDERINDEX, nVP);
+ }
+ else
+ {
+ Field::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+ ASSERT(pRDInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ vp << (FX_INT32)pInterForm->FindFieldInCalculationOrder(pFormField);
+ }
+
+ return TRUE;
+}
+
+void Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::charLimit(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_CHARLIMIT, nVP);
+ }
+ else
+ {
+ Field::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ vp << (FX_INT32)pFormField->GetMaxLen();
+ }
+ return TRUE;
+}
+
+void Field::SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::comb(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_COMB, bVP);
+ }
+ else
+ {
+ Field::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_COMB)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::commitOnSelChange(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
+ }
+ else
+ {
+ Field::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::currentValueIndices(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_DWordArray array;
+
+ if (vp.GetType() == VT_number)
+ {
+ int iSelecting = 0;
+ vp >> iSelecting;
+ array.Add(iSelecting);
+ }
+ else if (vp.IsArrayObject())
+ {
+ CJS_Array SelArray(m_isolate);
+ CJS_Value SelValue(m_isolate);
+ int iSelecting;
+ vp >> SelArray;
+ for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
+ {
+ SelArray.GetElement(i,SelValue);
+ iSelecting = (FX_INT32)SelValue;
+ array.Add(iSelecting);
+ }
+ }
+
+ if (m_bDelay)
+ {
+ AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
+ }
+ else
+ {
+ Field::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+ return FALSE;
+
+ if (pFormField->CountSelectedItems() == 1)
+ vp << pFormField->GetSelectedIndex(0);
+ else if (pFormField->CountSelectedItems() > 1)
+ {
+ CJS_Array SelArray(m_isolate);
+ for (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)
+ {
+ SelArray.SetElement(i, CJS_Value(m_isolate,pFormField->GetSelectedIndex(i)));
+ }
+ vp << SelArray;
+ }
+ else
+ vp << -1;
+ }
+
+ return TRUE;
+}
+
+void Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_DWordArray& array)
+{
+ ASSERT(pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ int nFieldType = pFormField->GetFieldType();
+ if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX)
+ {
+ FX_DWORD dwFieldFlags = pFormField->GetFieldFlags();
+ pFormField->ClearSelection(TRUE);
+
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ {
+ if (i>0 && !(dwFieldFlags & (1<<21)))
+ {
+ break;
+ }
+
+ int iSelecting = (FX_INT32)array.GetAt(i);
+ if (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))
+ pFormField->SetItemSelection(iSelecting, TRUE);
+
+ }
+ UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ }
+}
+
+FX_BOOL Field::defaultStyle(OBJ_PROP_PARAMS)
+{
+ // MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);
+ return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ ;
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+void Field::SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::defaultValue(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_WideString WideStr;
+ vp >> WideStr;
+
+ if (m_bDelay)
+ {
+ AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
+ }
+ else
+ {
+ Field::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, WideStr);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON ||
+ pFormField->GetFieldType() == FIELDTYPE_SIGNATURE)
+ return FALSE;
+
+ vp << pFormField->GetDefaultValue();
+ }
+ return TRUE;
+}
+
+void Field::SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_WideString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::doNotScroll(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_DONOTSCROLL, bVP);
+ }
+ else
+ {
+ Field::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::doNotSpellCheck(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD &&
+ pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetDelay(FX_BOOL bDelay)
+{
+ m_bDelay = bDelay;
+
+ if (!m_bDelay)
+ {
+ if (m_pJSDoc)
+ m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
+ }
+}
+
+FX_BOOL Field::delay(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ SetDelay(bVP);
+ }
+ else
+ {
+ vp << m_bDelay;
+ }
+ return TRUE;
+}
+
+FX_BOOL Field::display(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_DISPLAY, nVP);
+ }
+ else
+ {
+ Field::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget)return FALSE;
+
+ FX_DWORD dwFlag = pWidget->GetFlags();
+
+ if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
+ {
+ vp << (FX_INT32)1;
+ }
+ else
+ {
+ if (ANNOTFLAG_PRINT & dwFlag)
+ {
+ if (ANNOTFLAG_NOVIEW & dwFlag)
+ {
+ vp << (FX_INT32)3;
+ }
+ else
+ {
+ vp << (FX_INT32)0;
+ }
+ }
+ else
+ {
+ vp << (FX_INT32)2;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+ ASSERT(pFormControl != NULL);
+
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ FX_DWORD dwFlag = pWidget->GetFlags();
+ switch (number)
+ {
+ case 0:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ dwFlag |= ANNOTFLAG_PRINT;
+ break;
+ case 1:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+ break;
+ case 2:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_PRINT);
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ break;
+ case 3:
+ dwFlag |= ANNOTFLAG_NOVIEW;
+ dwFlag |= ANNOTFLAG_PRINT;
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ break;
+ }
+
+ if (dwFlag != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlag);
+ bSet = TRUE;
+ }
+ }
+ }
+
+ if (bSet) UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ else
+ {
+ if(nControlIndex >= pFormField->CountControls()) return;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+
+ FX_DWORD dwFlag = pWidget->GetFlags();
+ switch (number)
+ {
+ case 0:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ dwFlag |= ANNOTFLAG_PRINT;
+ break;
+ case 1:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+ break;
+ case 2:
+ dwFlag &= (~ANNOTFLAG_INVISIBLE);
+ dwFlag &= (~ANNOTFLAG_PRINT);
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ dwFlag &= (~ANNOTFLAG_NOVIEW);
+ break;
+ case 3:
+ dwFlag |= ANNOTFLAG_NOVIEW;
+ dwFlag |= ANNOTFLAG_PRINT;
+ dwFlag &= (~ANNOTFLAG_HIDDEN);
+ break;
+ }
+ if (dwFlag != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlag);
+ UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
+ }
+ }
+ }
+ }
+ }
+}
+
+FX_BOOL Field::doc(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ if (!vp.IsGetting())return FALSE;
+
+ vp << (CJS_Object*)(*m_pJSDoc);
+
+ return TRUE;
+}
+
+FX_BOOL Field::editable(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::exportValues(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
+ pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+ return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ if (!vp.IsArrayObject())return FALSE;
+ }
+ else
+ {
+ CJS_Array ExportValusArray(m_isolate);
+
+ if (m_nFormControlIndex < 0)
+ {
+ for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(i);
+ ASSERT(pFormControl != NULL);
+
+ ExportValusArray.SetElement(i, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));
+ }
+ }
+ else
+ {
+ if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
+ CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);
+ if (!pFormControl) return FALSE;
+
+ ExportValusArray.SetElement(0, CJS_Value(m_isolate,(FX_LPCWSTR)pFormControl->GetExportValue()));
+ }
+
+ vp << ExportValusArray;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::fileSelect(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ if (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::fillColor(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CJS_Array crArray(m_isolate);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ if (!vp.IsArrayObject()) return FALSE;
+
+ vp >> crArray;
+
+ CPWL_Color color;
+ color::ConvertArrayToPWLColor(crArray, color);
+
+ if (m_bDelay)
+ {
+ AddDelay_Color(FP_FILLCOLOR, color);
+ }
+ else
+ {
+ Field::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+ }
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ int iColorType;
+ pFormControl->GetBackgroundColor(iColorType);
+
+ CPWL_Color color;
+
+ if (iColorType == COLORTYPE_TRANSPARENT)
+ {
+ color = CPWL_Color(COLORTYPE_TRANSPARENT);
+ }
+ else if (iColorType == COLORTYPE_GRAY)
+ {
+ color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));
+ }
+ else if (iColorType == COLORTYPE_RGB)
+ {
+ color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),
+ pFormControl->GetOriginalBackgroundColor(1),
+ pFormControl->GetOriginalBackgroundColor(2));
+ }
+ else if (iColorType == COLORTYPE_CMYK)
+ {
+ color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),
+ pFormControl->GetOriginalBackgroundColor(1),
+ pFormControl->GetOriginalBackgroundColor(2),
+ pFormControl->GetOriginalBackgroundColor(3));
+ }
+ else
+ return FALSE;
+
+ color::ConvertPWLColorToArray(color, crArray);
+ vp << crArray;
+ }
+
+ return TRUE;
+}
+
+void Field::SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::hidden(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_HIDDEN, bVP);
+ }
+ else
+ {
+ Field::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget) return FALSE;
+
+ FX_DWORD dwFlags = pWidget->GetFlags();
+
+ if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags)
+ {
+ vp << true;
+ }
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+ {
+ FX_DWORD dwFlags = pWidget->GetFlags();
+
+ if (b)
+ {
+ dwFlags &= (~ANNOTFLAG_INVISIBLE);
+ dwFlags &= (~ANNOTFLAG_NOVIEW);
+ dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+ }
+ else
+ {
+ dwFlags &= (~ANNOTFLAG_INVISIBLE);
+ dwFlags &= (~ANNOTFLAG_HIDDEN);
+ dwFlags &= (~ANNOTFLAG_NOVIEW);
+ dwFlags |= ANNOTFLAG_PRINT;
+ }
+
+ if (dwFlags != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlags);
+ bSet = TRUE;
+ }
+ }
+ }
+
+ if (bSet)
+ UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ else
+ {
+ if(nControlIndex >= pFormField->CountControls()) return;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ FX_DWORD dwFlags = pWidget->GetFlags();
+
+ if (b)
+ {
+ dwFlags &= (~ANNOTFLAG_INVISIBLE);
+ dwFlags &= (~ANNOTFLAG_NOVIEW);
+ dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
+ }
+ else
+ {
+ dwFlags &= (~ANNOTFLAG_INVISIBLE);
+ dwFlags &= (~ANNOTFLAG_HIDDEN);
+ dwFlags &= (~ANNOTFLAG_NOVIEW);
+ dwFlags |= ANNOTFLAG_PRINT;
+ }
+
+ if (dwFlags != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlags);
+ UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
+ }
+ }
+ }
+ }
+ }
+}
+
+FX_BOOL Field::highlight(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_ByteString strMode;
+ vp >> strMode;
+
+ if (m_bDelay)
+ {
+ AddDelay_String(FP_HIGHLIGHT, strMode);
+ }
+ else
+ {
+ Field::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, strMode);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl) return FALSE;
+
+ int eHM = pFormControl->GetHighlightingMode();
+ switch (eHM)
+ {
+ case CPDF_FormControl::None:
+ vp << (FX_LPCWSTR)L"none";
+ break;
+ case CPDF_FormControl::Push:
+ vp << (FX_LPCWSTR)L"push";
+ break;
+ case CPDF_FormControl::Invert:
+ vp << (FX_LPCWSTR)L"invert";
+ break;
+ case CPDF_FormControl::Outline:
+ vp << (FX_LPCWSTR)L"outline";
+ break;
+ case CPDF_FormControl::Toggle:
+ vp << (FX_LPCWSTR)L"toggle";
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::lineWidth(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int iWidth;
+ vp >> iWidth;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_LINEWIDTH, iWidth);
+ }
+ else
+ {
+ Field::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, iWidth);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ if(!pFormField->CountControls()) return FALSE;
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
+ if (!pWidget) return FALSE;
+
+ vp << (FX_INT32)pWidget->GetBorderWidth();
+ }
+
+ return TRUE;
+}
+
+void Field::SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(j);
+ ASSERT(pFormControl != NULL);
+
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ if (number != pWidget->GetBorderWidth())
+ {
+ pWidget->SetBorderWidth(number);
+ bSet = TRUE;
+ }
+ }
+ }
+ if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ else
+ {
+ if(nControlIndex >= pFormField->CountControls()) return;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ if (number != pWidget->GetBorderWidth())
+ {
+ pWidget->SetBorderWidth(number);
+ UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+ }
+ }
+ }
+ }
+ }
+}
+
+FX_BOOL Field::multiline(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_MULTILINE, bVP);
+ }
+ else
+ {
+ Field::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::multipleSelection(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
+ }
+ else
+ {
+ Field::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::name(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ vp << m_FieldName;
+
+ return TRUE;
+}
+
+FX_BOOL Field::numItems(OBJ_PROP_PARAMS)
+{
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
+ pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+ return FALSE;
+
+ if (!vp.IsGetting()) return FALSE;
+
+ vp << (FX_INT32)pFormField->CountOptions();
+
+ return TRUE;
+}
+
+FX_BOOL Field::page(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ if (!pFormField) return FALSE;
+
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray widgetArray;
+ pInterForm->GetWidgets(pFormField, widgetArray);
+
+ if (widgetArray.GetSize() > 0)
+ {
+ CJS_Array PageArray(m_isolate);
+
+ for (int i=0,sz=widgetArray.GetSize(); i<sz; i++)
+ {
+ CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);
+ ASSERT(pWidget != NULL);
+
+ CPDFSDK_PageView* pPageView = pWidget->GetPageView();
+ if(!pPageView)
+ return FALSE;
+
+ PageArray.SetElement(i, CJS_Value(m_isolate,(FX_INT32)pPageView->GetPageIndex()));
+ }
+
+ vp << PageArray;
+ }
+ else
+ {
+ vp << (FX_INT32) -1;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::password(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_PASSWORD, bVP);
+ }
+ else
+ {
+ Field::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::print(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (m_nFormControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
+ {
+ FX_DWORD dwFlags = pWidget->GetFlags();
+ if (bVP)
+ dwFlags |= ANNOTFLAG_PRINT;
+ else
+ dwFlags &= ~ANNOTFLAG_PRINT;
+
+ if (dwFlags != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlags);
+ bSet = TRUE;
+ }
+ }
+ }
+
+ if (bSet)
+ UpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ else
+ {
+ if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ FX_DWORD dwFlags = pWidget->GetFlags();
+ if (bVP)
+ dwFlags |= ANNOTFLAG_PRINT;
+ else
+ dwFlags &= ~ANNOTFLAG_PRINT;
+
+ if (dwFlags != pWidget->GetFlags())
+ {
+ pWidget->SetFlags(dwFlags);
+ UpdateFormControl(m_pDocument, pFormField->GetControl(m_nFormControlIndex), TRUE, FALSE, TRUE);
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget) return FALSE;
+
+ if (pWidget->GetFlags() & ANNOTFLAG_PRINT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::radiosInUnison(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::readonly(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::rect(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ if (!vp.IsArrayObject())return FALSE;
+
+ CJS_Array rcArray(m_isolate);
+ vp >> rcArray;
+ CJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);
+ rcArray.GetElement(0, Upper_Leftx);
+ rcArray.GetElement(1, Upper_Lefty);
+ rcArray.GetElement(2, Lower_Rightx);
+ rcArray.GetElement(3, Lower_Righty);
+
+ FX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};
+ pArray[0] = (FX_FLOAT)(FX_INT32)Upper_Leftx;
+ pArray[1] = (FX_FLOAT)(FX_INT32)Lower_Righty;
+ pArray[2] = (FX_FLOAT)(FX_INT32)Lower_Rightx;
+ pArray[3] = (FX_FLOAT)(FX_INT32)Upper_Lefty;
+
+ CPDF_Rect crRect(pArray);
+
+ if (m_bDelay)
+ {
+ AddDelay_Rect(FP_RECT, crRect);
+ }
+ else
+ {
+ Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+ if (!pWidget) return FALSE;
+
+ CFX_FloatRect crRect = pWidget->GetRect();
+ CJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);
+ Upper_Leftx = (FX_INT32)crRect.left;
+ Upper_Lefty = (FX_INT32)crRect.top;
+ Lower_Rightx = (FX_INT32)crRect.right;
+ Lower_Righty = (FX_INT32)crRect.bottom;
+
+ CJS_Array rcArray(m_isolate);
+ rcArray.SetElement(0,Upper_Leftx);
+ rcArray.SetElement(1,Upper_Lefty);
+ rcArray.SetElement(2,Lower_Rightx);
+ rcArray.SetElement(3,Lower_Righty);
+
+ vp << rcArray;
+ }
+
+ return TRUE;
+}
+
+void Field::SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect)
+{
+ ASSERT(pDocument != NULL);
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (nControlIndex < 0)
+ {
+ FX_BOOL bSet = FALSE;
+ for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
+ {
+ CPDF_FormControl* pFormControl = pFormField->GetControl(i);
+ ASSERT(pFormControl != NULL);
+
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ CPDF_Rect crRect = rect;
+
+ CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+
+// CPDF_Page* pPDFPage = pPage->GetPage();
+// ASSERT(pPDFPage != NULL);
+
+ crRect.Intersect(pPDFPage->GetPageBBox());
+
+ if (!crRect.IsEmpty())
+ {
+ CPDF_Rect rcOld = pWidget->GetRect();
+ if (crRect.left != rcOld.left ||
+ crRect.right != rcOld.right ||
+ crRect.top != rcOld.top ||
+ crRect.bottom != rcOld.bottom)
+ {
+ pWidget->SetRect(crRect);
+ bSet = TRUE;
+ }
+ }
+ }
+ }
+
+ if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ else
+ {
+ if(nControlIndex >= pFormField->CountControls()) return;
+ if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
+ {
+ if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
+ {
+ CPDF_Rect crRect = rect;
+
+ CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+ ASSERT(pPDFPage != NULL);
+
+// CPDF_Page* pPDFPage = pPage->GetPage();
+// ASSERT(pPDFPage != NULL);
+
+ crRect.Intersect(pPDFPage->GetPageBBox());
+
+ if (!crRect.IsEmpty())
+ {
+ CPDF_Rect rcOld = pWidget->GetRect();
+ if (crRect.left != rcOld.left ||
+ crRect.right != rcOld.right ||
+ crRect.top != rcOld.top ||
+ crRect.bottom != rcOld.bottom)
+ {
+ pWidget->SetRect(crRect);
+ UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+FX_BOOL Field::required(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+
+ bool bVP;
+ vp >> bVP;
+
+ }
+ else
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::richText(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ bool bVP;
+ vp >> bVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Bool(FP_RICHTEXT, bVP);
+ }
+ else
+ {
+ Field::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+ return FALSE;
+
+ if (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)
+ vp << true;
+ else
+ vp << false;
+ }
+
+ return TRUE;
+}
+
+void Field::SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::richValue(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+ ;
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+void Field::SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::rotation(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_ROTATION, nVP);
+ }
+ else
+ {
+ Field::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ vp << (FX_INT32)pFormControl->GetRotation();
+ }
+
+ return TRUE;
+}
+
+void Field::SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::strokeColor(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ if (!vp.IsArrayObject())return FALSE;
+
+ CJS_Array crArray(m_isolate);
+ vp >> crArray;
+
+ CPWL_Color color;
+ color::ConvertArrayToPWLColor(crArray, color);
+
+ if (m_bDelay)
+ {
+ AddDelay_Color(FP_STROKECOLOR, color);
+ }
+ else
+ {
+ Field::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ int iColorType;
+ pFormControl->GetBorderColor(iColorType);
+
+ CPWL_Color color;
+
+ if (iColorType == COLORTYPE_TRANSPARENT)
+ {
+ color = CPWL_Color(COLORTYPE_TRANSPARENT);
+ }
+ else if (iColorType == COLORTYPE_GRAY)
+ {
+ color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));
+ }
+ else if (iColorType == COLORTYPE_RGB)
+ {
+ color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),
+ pFormControl->GetOriginalBorderColor(1),
+ pFormControl->GetOriginalBorderColor(2));
+ }
+ else if (iColorType == COLORTYPE_CMYK)
+ {
+ color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),
+ pFormControl->GetOriginalBorderColor(1),
+ pFormControl->GetOriginalBorderColor(2),
+ pFormControl->GetOriginalBorderColor(3));
+ }
+ else
+ return FALSE;
+
+ CJS_Array crArray(m_isolate);
+ color::ConvertPWLColorToArray(color, crArray);
+ vp << crArray;
+ }
+
+ return TRUE;
+}
+
+void Field::SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::style(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_ByteString csBCaption;
+ vp >> csBCaption;
+
+ if (m_bDelay)
+ {
+ AddDelay_String(FP_STYLE, csBCaption);
+ }
+ else
+ {
+ Field::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, csBCaption);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON &&
+ pFormField->GetFieldType() != FIELDTYPE_CHECKBOX)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl) return FALSE;
+
+ CFX_WideString csWCaption = pFormControl->GetNormalCaption();
+ CFX_ByteString csBCaption;
+
+ switch (csWCaption[0])
+ {
+ case L'l':
+ csBCaption = "circle";
+ break;
+ case L'8':
+ csBCaption = "cross";
+ break;
+ case L'u':
+ csBCaption = "diamond";
+ break;
+ case L'n':
+ csBCaption = "square";
+ break;
+ case L'H':
+ csBCaption = "star";
+ break;
+ default: //L'4'
+ csBCaption = "check";
+ break;
+ }
+ vp << csBCaption;
+ }
+
+ return TRUE;
+}
+
+void Field::SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
+ const CFX_ByteString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::submitName(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::textColor(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CJS_Array crArray(m_isolate);
+ if (!vp.IsArrayObject())return FALSE;
+ vp >> crArray;
+
+ CPWL_Color color;
+ color::ConvertArrayToPWLColor(crArray, color);
+
+ if (m_bDelay)
+ {
+ AddDelay_Color(FP_TEXTCOLOR, color);
+ }
+ else
+ {
+ Field::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ int iColorType;
+ FX_ARGB color;
+ CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
+ FieldAppearance.GetColor(color, iColorType);
+ FX_INT32 a,r,g,b;
+ ArgbDecode(color, a, r, g, b);
+
+ CPWL_Color crRet = CPWL_Color(COLORTYPE_RGB, r / 255.0f,
+ g / 255.0f,
+ b / 255.0f);
+
+ if (iColorType == COLORTYPE_TRANSPARENT)
+ crRet = CPWL_Color(COLORTYPE_TRANSPARENT);
+
+ CJS_Array crArray(m_isolate);
+ color::ConvertPWLColorToArray(crRet, crArray);
+ vp << crArray;
+ }
+
+ return TRUE;
+}
+
+void Field::SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::textFont(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_ByteString csFontName;
+ vp >> csFontName;
+ if (csFontName.IsEmpty()) return FALSE;
+
+ if (m_bDelay)
+ {
+ AddDelay_String(FP_TEXTFONT, csFontName);
+ }
+ else
+ {
+ Field::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, csFontName);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ int nFieldType = pFormField->GetFieldType();
+
+ if (nFieldType == FIELDTYPE_PUSHBUTTON ||
+ nFieldType == FIELDTYPE_COMBOBOX ||
+ nFieldType == FIELDTYPE_LISTBOX ||
+ nFieldType == FIELDTYPE_TEXTFIELD)
+ {
+ CPDF_Font * pFont = pFormControl->GetDefaultControlFont();
+ if (!pFont) return FALSE;
+
+ vp << pFont->GetBaseFont();
+ }
+ else
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void Field::SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::textSize(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ int nVP;
+ vp >> nVP;
+
+ if (m_bDelay)
+ {
+ AddDelay_Int(FP_TEXTSIZE, nVP);
+ }
+ else
+ {
+ Field::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
+
+ CFX_ByteString csFontNameTag;
+ FX_FLOAT fFontSize;
+ FieldAppearance.GetFont(csFontNameTag,fFontSize);
+
+ vp << (int)fFontSize;
+ }
+
+ return TRUE;
+}
+
+void Field::SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::type(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_UNKNOWN:
+ vp << (FX_LPCWSTR)L"unknown";
+ break;
+ case FIELDTYPE_PUSHBUTTON:
+ vp << (FX_LPCWSTR)L"button";
+ break;
+ case FIELDTYPE_CHECKBOX:
+ vp << (FX_LPCWSTR)L"checkbox";
+ break;
+ case FIELDTYPE_RADIOBUTTON:
+ vp << (FX_LPCWSTR)L"radiobutton";
+ break;
+ case FIELDTYPE_COMBOBOX:
+ vp << (FX_LPCWSTR)L"combobox";
+ break;
+ case FIELDTYPE_LISTBOX:
+ vp << (FX_LPCWSTR)L"listbox";
+ break;
+ case FIELDTYPE_TEXTFIELD:
+ vp << (FX_LPCWSTR)L"text";
+ break;
+ case FIELDTYPE_SIGNATURE:
+ vp << (FX_LPCWSTR)L"signature";
+ break;
+ default :
+ vp << (FX_LPCWSTR)L"unknown";
+ break;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::userName(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CFX_WideString swName;
+ vp >> swName;
+
+ if (m_bDelay)
+ {
+ AddDelay_WideString(FP_USERNAME, swName);
+ }
+ else
+ {
+ Field::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ vp << (CFX_WideString)pFormField->GetAlternateName();
+ }
+
+ return TRUE;
+}
+
+void Field::SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string)
+{
+ //Not supported.
+}
+
+FX_BOOL Field::value(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (vp.IsSetting())
+ {
+ if (!m_bCanSet) return FALSE;
+
+ CJS_WideStringArray strArray;
+
+ if (vp.IsArrayObject())
+ {
+ CJS_Array ValueArray(m_isolate);
+ vp.ConvertToArray(ValueArray);
+ for (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)
+ {
+ CJS_Value ElementValue(m_isolate);
+ ValueArray.GetElement(i, ElementValue);
+ strArray.Add(ElementValue.operator CFX_WideString());
+ }
+ }
+ else
+ {
+ CFX_WideString swValue;
+ vp >> swValue;
+
+ strArray.Add(swValue);
+ }
+
+ if (m_bDelay)
+ {
+ AddDelay_WideStringArray(FP_VALUE, strArray);
+ }
+ else
+ {
+ Field::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray);
+ }
+ }
+ else
+ {
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_PUSHBUTTON:
+ return FALSE;
+ case FIELDTYPE_COMBOBOX:
+ case FIELDTYPE_TEXTFIELD:
+ {
+ CFX_WideString swValue = pFormField->GetValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+ }
+ break;
+ case FIELDTYPE_LISTBOX:
+ {
+ if (pFormField->CountSelectedItems() > 1)
+ {
+ CJS_Array ValueArray(m_isolate);
+ CJS_Value ElementValue(m_isolate);
+ int iIndex;
+ for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)
+ {
+ iIndex = pFormField->GetSelectedIndex(i);
+ ElementValue = pFormField->GetOptionValue(iIndex);
+ if (FXSYS_wcslen((FX_LPCWSTR)ElementValue.operator CFX_WideString()) == 0)
+ ElementValue = pFormField->GetOptionLabel(iIndex);
+ ValueArray.SetElement(i, ElementValue);
+ }
+ vp << ValueArray;
+ }
+ else
+ {
+ CFX_WideString swValue = pFormField->GetValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+ }
+ }
+ break;
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ {
+ FX_BOOL bFind = FALSE;
+ for (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)
+ {
+ if (pFormField->GetControl(i)->IsChecked())
+ {
+ CFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();
+
+ double dRet;
+ FX_BOOL bDot;
+ if (CJS_PublicMethods::ConvertStringToNumber(swValue,dRet,bDot))
+ {
+ if (bDot)
+ vp << dRet;
+ else
+ vp << dRet;
+ }
+ else
+ vp << swValue;
+
+ bFind = TRUE;
+ break;
+ }
+ else
+ continue;
+ }
+ if (!bFind)
+ vp << (FX_LPCWSTR)L"Off";
+ }
+ break;
+ default:
+ vp << pFormField->GetValue();
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+void Field::SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName,
+ int nControlIndex, const CJS_WideStringArray& strArray)
+{
+ ASSERT(pDocument != NULL);
+
+ if (strArray.GetSize() < 1) return;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(pDocument, swFieldName, FieldArray);
+
+ for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFullName().Compare(swFieldName) != 0)
+ continue;
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_TEXTFIELD:
+ case FIELDTYPE_COMBOBOX:
+ if (pFormField->GetValue() != strArray.GetAt(0))
+ {
+ CFX_WideString WideString = strArray.GetAt(0);
+ pFormField->SetValue(strArray.GetAt(0), TRUE);
+ UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ break;
+ case FIELDTYPE_CHECKBOX: //mantis: 0004493
+ case FIELDTYPE_RADIOBUTTON:
+ {
+ if (pFormField->GetValue() != strArray.GetAt(0))
+ {
+ pFormField->SetValue(strArray.GetAt(0), TRUE);
+ UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ }
+ break;
+ case FIELDTYPE_LISTBOX:
+ {
+ FX_BOOL bModified = FALSE;
+
+ for (int i=0,sz=strArray.GetSize(); i<sz; i++)
+ {
+ int iIndex = pFormField->FindOption(strArray.GetAt(i));
+
+ if (!pFormField->IsItemSelected(iIndex))
+ {
+ bModified = TRUE;
+ break;
+ }
+ }
+
+ if (bModified)
+ {
+ pFormField->ClearSelection(TRUE);
+ for (int i=0,sz=strArray.GetSize(); i<sz; i++)
+ {
+ int iIndex = pFormField->FindOption(strArray.GetAt(i));
+ pFormField->SetItemSelection(iIndex, TRUE, TRUE);
+ }
+
+ UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+FX_BOOL Field::valueAsString(OBJ_PROP_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!vp.IsGetting()) return FALSE;
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ {
+ if(!pFormField->CountControls()) return FALSE;
+
+ if (pFormField->GetControl(0)->IsChecked())
+ vp << (FX_LPCWSTR)L"Yes";
+ else
+ vp << (FX_LPCWSTR)L"Off";
+ }
+ else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON))
+ {
+ for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
+ {
+ if (pFormField->GetControl(i)->IsChecked())
+ {
+ vp << (FX_LPCWSTR)pFormField->GetControl(i)->GetExportValue();
+ break;
+ }
+ else
+ vp << (FX_LPCWSTR)L"Off";
+ }
+ }
+ else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))
+ {
+ vp << (FX_LPCWSTR)L"";
+ }
+ else
+ vp << (FX_LPCWSTR)pFormField->GetValue();
+
+ return TRUE;
+}
+
+/* --------------------------------- methods --------------------------------- */
+
+FX_BOOL Field::browseForFileToSubmit(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName, FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
+ ASSERT(pApp != NULL);
+
+ if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
+ (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD))
+ {
+ CFX_WideString wsFileName = pApp->JS_fieldBrowse();
+ if(!wsFileName.IsEmpty())
+ {
+ pFormField->SetValue(wsFileName);
+ UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
+ }
+ }
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+
+FX_BOOL Field::buttonGetCaption(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nface = 0;
+ int iSize = params.size();
+ if ( iSize >= 1)
+ nface = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ if (nface == 0)
+ vRet = pFormControl->GetNormalCaption();
+ else if (nface == 1)
+ vRet = pFormControl->GetDownCaption();
+ else if (nface == 2)
+ vRet = pFormControl->GetRolloverCaption();
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+//#pragma warning(disable: 4800)
+
+FX_BOOL Field::buttonGetIcon(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nface = 0;
+ int iSize = params.size();
+ if ( iSize >= 1)
+ nface = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+ return FALSE;
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
+ ASSERT(pObj.IsEmpty() == FALSE);
+
+ CJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);
+ ASSERT(pJS_Icon != NULL);
+
+ Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
+ ASSERT(pIcon != NULL);
+
+ CPDF_Stream* pIconStream = NULL;
+ if (nface == 0)
+ pIconStream = pFormControl->GetNormalIcon();
+ else if (nface == 1)
+ pIconStream = pFormControl->GetDownIcon();
+ else if (nface == 2)
+ pIconStream = pFormControl->GetRolloverIcon();
+ else
+ return FALSE;
+
+ pIcon->SetStream(pIconStream);
+ vRet = pJS_Icon;
+
+ return TRUE;
+}
+
+//#pragma warning(default: 4800)
+
+FX_BOOL Field::buttonImportIcon(OBJ_METHOD_PARAMS)
+{
+#if 0
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ if (!pFormField)return FALSE;
+
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+
+ CFX_WideString sIconFileName = pEnv->JS_fieldBrowse();
+ if (sIconFileName.IsEmpty())
+ {
+ vRet = 1;
+ return TRUE;
+ }
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);
+ if (!pStream)
+ {
+ vRet = -1;
+ return TRUE;
+ }
+
+ CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+ if (!pFormControl)return FALSE;
+
+ pFormControl->SetNormalIcon(pStream);
+ UpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);
+
+ vRet = 0;
+#endif // 0
+ return TRUE;
+}
+
+FX_BOOL Field::buttonSetCaption(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::buttonSetIcon(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::checkThisBox(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_bCanSet) return FALSE;
+
+ int iSize = params.size();
+ int nWidget = -1;
+ if ( iSize >= 1)
+ nWidget= (FX_INT32) params[0];
+ else
+ return FALSE;
+ FX_BOOL bCheckit = TRUE;
+ if ( iSize >= 2)
+ bCheckit = params[1];
+
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
+ return FALSE;
+ if(nWidget <0 || nWidget >= pFormField->CountControls())
+ return FALSE;
+ if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
+ pFormField->CheckControl(nWidget, bCheckit, TRUE);
+ else
+ pFormField->CheckControl(nWidget, bCheckit, TRUE);
+
+ UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
+
+ return TRUE;
+}
+
+FX_BOOL Field::clearItems(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::defaultIsChecked(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ if (!m_bCanSet) return FALSE;
+
+ int iSize = params.size();
+ int nWidget = -1;
+ if ( iSize >= 1)
+ nWidget= (FX_INT32) params[0];
+ else
+ return FALSE;
+ //FX_BOOL bIsDefaultChecked = TRUE;
+ //if ( iSize >= 2)
+ // bIsDefaultChecked = params[1];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if(nWidget <0 || nWidget >= pFormField->CountControls())
+ {
+ vRet = FALSE;
+ return FALSE;
+ }
+ if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+ {
+
+ vRet = TRUE;
+ }
+ else
+ vRet = FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::deleteItemAt(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+int JS_COMPARESTRING(CFX_WideString* ps1, CFX_WideString* ps2)
+{
+ ASSERT(ps1 != NULL);
+ ASSERT(ps2 != NULL);
+
+ return ps1->Compare(*ps2);
+}
+
+
+FX_BOOL Field::getArray(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CGW_ArrayTemplate<CFX_WideString*> swSort;
+
+ for (int i=0,sz=FieldArray.GetSize(); i<sz; i++)
+ {
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
+ ASSERT(pFormField != NULL);
+
+ swSort.Add(new CFX_WideString(pFormField->GetFullName()));
+
+ }
+ swSort.Sort(JS_COMPARESTRING);
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CJS_Array FormFieldArray(m_isolate);
+ for (int j=0,jsz = swSort.GetSize(); j<jsz; j++)
+ {
+ CFX_WideString* pStr = swSort.GetAt(j);
+
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pObj.IsEmpty() == FALSE);
+
+ CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);
+ ASSERT(pJSField != NULL);
+
+ Field* pField = (Field*)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->AttachField(this->m_pJSDoc, *pStr);
+
+ CJS_Value FormFieldValue(m_isolate);
+ FormFieldValue = pJSField;
+ FormFieldArray.SetElement(j, FormFieldValue);
+
+ delete pStr;
+ }
+
+ vRet = FormFieldArray;
+ swSort.RemoveAll();
+ return TRUE;
+}
+
+FX_BOOL Field::getItemAt(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIdx = -1;
+ if (params.size() >=1)
+ nIdx = (FX_INT32) params[0];
+ FX_BOOL bExport = TRUE;
+ int iSize = params.size();
+ if ( iSize >= 2)
+ {
+ bExport =(FX_BOOL) params[1];
+ }
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX)
+ || (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX))
+ {
+ if (nIdx == -1 || nIdx > pFormField->CountOptions())
+ nIdx = pFormField->CountOptions() -1;
+ if (bExport)
+ {
+ CFX_WideString strval = pFormField->GetOptionValue(nIdx);
+ if (strval.IsEmpty())
+ vRet = pFormField->GetOptionLabel(nIdx);
+ else
+ vRet = strval;
+ }
+ else
+ vRet = pFormField->GetOptionLabel(nIdx);
+ }
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::getLock(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::insertItemAt(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::isBoxChecked(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = -1;
+ if (params.size() >=1)
+ nIndex = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if(nIndex <0 || nIndex >= pFormField->CountControls())
+ {
+ vRet = FALSE;
+ return FALSE;
+ }
+
+ if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+ {
+ if (pFormField->GetControl(nIndex)->IsChecked() !=0 )
+ vRet = TRUE;
+ else
+ vRet = FALSE;
+ }
+ else
+ vRet = FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::isDefaultChecked(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ int nIndex = -1;
+ if (params.size() >=1)
+ nIndex = (FX_INT32) params[0];
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ if(nIndex <0 || nIndex >= pFormField->CountControls())
+ {
+ vRet = FALSE;
+ return FALSE;
+ }
+ if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
+ || (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
+ {
+ if (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)
+ vRet = TRUE;
+ else
+ vRet = FALSE;
+ }
+ else
+ vRet = FALSE;
+
+ return TRUE;
+}
+
+FX_BOOL Field::setAction(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::setFocus(OBJ_METHOD_PARAMS)
+{
+ ASSERT(m_pDocument != NULL);
+
+ CFX_PtrArray FieldArray;
+ GetFormFields(m_FieldName,FieldArray);
+ if (FieldArray.GetSize() <= 0) return FALSE;
+
+ CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
+ ASSERT(pFormField != NULL);
+
+ FX_INT32 nCount = pFormField->CountControls();
+
+ if (nCount < 1) return FALSE;
+
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ CPDFSDK_Widget* pWidget = NULL;
+ if (nCount == 1)
+ {
+ pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
+ }
+ else
+ {
+ CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+ ASSERT(pEnv);
+ CPDF_Page* pPage = (CPDF_Page*)pEnv->FFI_GetCurrentPage(m_pDocument->GetDocument());
+ if(!pPage)
+ return FALSE;
+ if (CPDFSDK_PageView* pCurPageView = m_pDocument->GetPageView(pPage))
+ {
+ for (FX_INT32 i=0; i<nCount; i++)
+ {
+ if (CPDFSDK_Widget* pTempWidget = pInterForm->GetWidget(pFormField->GetControl(i)))
+ {
+ if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage())
+ {
+ pWidget = pTempWidget;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (pWidget)
+ {
+ m_pDocument->SetFocusAnnot(pWidget);
+ }
+
+ return TRUE;
+}
+
+FX_BOOL Field::setItems(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL Field::setLock(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureGetModifications(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureGetSeedValue(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureInfo(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureSetSeedValue(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureSign(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::signatureValidate(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL Field::source(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << (CJS_Object*)NULL;
+ }
+
+ return TRUE;
+}
+
+/////////////////////////////////////////// delay /////////////////////////////////////////////
+
+void Field::AddDelay_Int(enum FIELD_PROP prop, FX_INT32 n)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->num = n;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_Bool(enum FIELD_PROP prop,bool b)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->b = b;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->string = string;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->widestring = string;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->rect = rect;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ pNewData->color = color;
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ pNewData->wordarray.Add(array.GetAt(i));
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::AddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array)
+{
+ ASSERT(m_pJSDoc != NULL);
+
+ CJS_DelayData* pNewData = new CJS_DelayData;
+ pNewData->sFieldName = m_FieldName;
+ pNewData->nControlIndex = m_nFormControlIndex;
+ pNewData->eProp = prop;
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ pNewData->widestringarray.Add(array.GetAt(i));
+
+ m_pJSDoc->AddDelayData(pNewData);
+}
+
+void Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData)
+{
+ ASSERT(pDocument != NULL);
+ ASSERT(pData != NULL);
+
+ switch (pData->eProp)
+ {
+ case FP_ALIGNMENT:
+ Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+ break;
+ case FP_BORDERSTYLE:
+ Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+ break;
+ case FP_BUTTONALIGNX:
+ Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_BUTTONALIGNY:
+ Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_BUTTONFITBOUNDS:
+ Field::SetButtonFitBounds(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_BUTTONPOSITION:
+ Field::SetButtonPosition(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_BUTTONSCALEHOW:
+ Field::SetButtonScaleHow(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_BUTTONSCALEWHEN:
+ Field::SetButtonScaleWhen(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_CALCORDERINDEX:
+ Field::SetCalcOrderIndex(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_CHARLIMIT:
+ Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_COMB:
+ Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_COMMITONSELCHANGE:
+ Field::SetCommitOnSelChange(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_CURRENTVALUEINDICES:
+ Field::SetCurrentValueIndices(pDocument, pData->sFieldName, pData->nControlIndex, pData->wordarray);
+ break;
+ case FP_DEFAULTVALUE:
+ Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
+ break;
+ case FP_DONOTSCROLL:
+ Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_DISPLAY:
+ Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_FILLCOLOR:
+ Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+ break;
+ case FP_HIDDEN:
+ Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_HIGHLIGHT:
+ Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+ break;
+ case FP_LINEWIDTH:
+ Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_MULTILINE:
+ Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_MULTIPLESELECTION:
+ Field::SetMultipleSelection(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_PASSWORD:
+ Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_RECT:
+ Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, pData->rect);
+ break;
+ case FP_RICHTEXT:
+ Field::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
+ break;
+ case FP_RICHVALUE:
+ break;
+ case FP_ROTATION:
+ Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_STROKECOLOR:
+ Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+ break;
+ case FP_STYLE:
+ Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+ break;
+ case FP_TEXTCOLOR:
+ Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
+ break;
+ case FP_TEXTFONT:
+ Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
+ break;
+ case FP_TEXTSIZE:
+ Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
+ break;
+ case FP_USERNAME:
+ Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
+ break;
+ case FP_VALUE:
+ Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestringarray);
+ break;
+ }
+}
+
+#define JS_FIELD_MINWIDTH 1
+#define JS_FIELD_MINHEIGHT 1
+
+void Field::AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
+ const CFX_WideString& sName, const CPDF_Rect& rcCoords)
+{
+ //Not supported.
+}
+
diff --git a/fpdfsdk/src/javascript/Icon.cpp b/fpdfsdk/src/javascript/Icon.cpp
new file mode 100644
index 0000000000..418fcd53d5
--- /dev/null
+++ b/fpdfsdk/src/javascript/Icon.cpp
@@ -0,0 +1,67 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Icon.h"
+
+/* ---------------------- Icon ---------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Icon)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Icon)
+ JS_STATIC_PROP_ENTRY(name)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Icon)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Icon,Icon)
+
+Icon::Icon(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject),
+ m_pIconStream(NULL),
+ m_swIconName(L"")
+{
+}
+
+Icon::~Icon()
+{
+
+}
+
+void Icon::SetStream(CPDF_Stream* pIconStream)
+{
+ if(pIconStream)
+ m_pIconStream = pIconStream;
+}
+
+CPDF_Stream* Icon::GetStream()
+{
+ return m_pIconStream;
+}
+
+void Icon::SetIconName(CFX_WideString name)
+{
+ m_swIconName = name;
+}
+
+CFX_WideString Icon::GetIconName()
+{
+ return m_swIconName;
+}
+
+FX_BOOL Icon::name(OBJ_PROP_PARAMS)
+{
+ if(!vp.IsGetting())return FALSE;
+
+ vp << m_swIconName;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/JS_Context.cpp b/fpdfsdk/src/javascript/JS_Context.cpp
new file mode 100644
index 0000000000..21acf59180
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_Context.cpp
@@ -0,0 +1,364 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/resource.h"
+
+/* -------------------------- CJS_Context -------------------------- */
+
+CJS_Context::CJS_Context(CJS_Runtime* pRuntime) :
+ m_pRuntime(pRuntime),
+ m_bBusy(FALSE),
+ m_bMsgBoxEnable(TRUE)
+{
+ m_pEventHandler = new CJS_EventHandler(this);
+}
+
+CJS_Context::~CJS_Context(void)
+{
+ if (m_pEventHandler)
+ {
+ delete m_pEventHandler;
+ m_pEventHandler = NULL;
+ }
+}
+
+CPDFSDK_Document* CJS_Context::GetReaderDocument()
+{
+ ASSERT(m_pRuntime != NULL);
+
+ return m_pRuntime->GetReaderDocument();
+}
+
+CPDFDoc_Environment* CJS_Context::GetReaderApp()
+{
+ ASSERT(m_pRuntime != NULL);
+
+ return m_pRuntime->GetReaderApp();
+}
+
+FX_BOOL CJS_Context::DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info)
+{
+ if (m_bBusy)
+ {
+ info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
+ return FALSE;
+ }
+
+ m_bBusy = TRUE;
+
+ ASSERT(m_pRuntime != NULL);
+ ASSERT(m_pEventHandler != NULL);
+ ASSERT(m_pEventHandler->IsValid());
+
+ if (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType()))
+ {
+ info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
+ return FALSE;
+ }
+
+ FXJSErr error ={NULL,NULL, 0};
+ int nRet = 0;
+
+ try
+ {
+ if (script.GetLength() > 0)
+ {
+ if (nMode == 0)
+ {
+ nRet = JS_Execute(*m_pRuntime, this, script, script.GetLength(), &error);
+ }
+ else
+ {
+ nRet = JS_Parse(*m_pRuntime, this, script, script.GetLength(), &error);
+ }
+ }
+
+ if (nRet < 0)
+ {
+ CFX_WideString sLine;
+ sLine.Format((FX_LPCWSTR)L"[ Line: %05d { %s } ] : %s",error.linnum-1,error.srcline,error.message);
+
+// TRACE(L"/* -------------- JS Error -------------- */\n");
+// TRACE(sLine);
+// TRACE(L"\n");
+ //CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);
+ info += sLine;
+ }
+ else
+ {
+ info = JSGetStringFromID(this, IDS_STRING_RUN);
+ }
+
+ }
+ catch (...)
+ {
+ info = JSGetStringFromID(this, IDS_STRING_UNHANDLED);
+ nRet = -1;
+ }
+
+ m_pRuntime->RemoveEventInLoop(m_pEventHandler->TargetName(), m_pEventHandler->EventType());
+
+ m_pEventHandler->Destroy();
+ m_bBusy = FALSE;
+
+ return nRet >= 0;
+}
+
+FX_BOOL CJS_Context::RunScript(const CFX_WideString& script, CFX_WideString& info)
+{
+ v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
+ HandleScope handle_scope(m_pRuntime->GetIsolate());
+ v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
+ v8::Context::Scope context_scope(context);
+
+ return DoJob(0, script, info);
+}
+
+FX_BOOL CJS_Context::Compile(const CFX_WideString& script, CFX_WideString& info)
+{
+ v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
+ HandleScope handle_scope(m_pRuntime->GetIsolate());
+ v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
+ v8::Context::Scope context_scope(context);
+
+ return DoJob(1, script, info);
+}
+
+void CJS_Context::OnApp_Init()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnApp_Init();
+}
+
+void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString &strTargetName)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_Open(pDoc,strTargetName);
+}
+
+void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillPrint(pDoc);
+}
+
+void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_DidPrint(pDoc);
+}
+
+void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillSave(pDoc);
+}
+
+void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_DidSave(pDoc);
+}
+
+void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnDoc_WillClose(pDoc);
+}
+
+void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_Open(pTarget);
+}
+
+void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_Close(pTarget);
+}
+
+void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_InView(pTarget);
+}
+
+void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnPage_OutView(pTarget);
+}
+
+void CJS_Context::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField *pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
+}
+
+void CJS_Context::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
+}
+
+void CJS_Context::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget, const CFX_WideString& Value)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
+}
+
+void CJS_Context::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
+}
+
+void CJS_Context::OnField_Format(int nCommitKey, CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL bWillCommit)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Format(nCommitKey, pTarget, Value, bWillCommit);
+}
+
+
+void CJS_Context::OnField_Keystroke(int nCommitKey, CFX_WideString& strChange, const CFX_WideString& strChangeEx,
+ FX_BOOL bKeyDown, FX_BOOL bModifier, int &nSelEnd,int &nSelStart,
+ FX_BOOL bShift, CPDF_FormField* pTarget, CFX_WideString& Value,
+ FX_BOOL bWillCommit, FX_BOOL bFieldFull, FX_BOOL& bRc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Keystroke(nCommitKey, strChange, strChangeEx, bKeyDown,
+ bModifier, nSelEnd, nSelStart, bShift, pTarget, Value, bWillCommit, bFieldFull, bRc);
+}
+
+void CJS_Context::OnField_Validate(CFX_WideString& strChange,const CFX_WideString& strChangeEx,
+ FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
+ CFX_WideString& Value, FX_BOOL& bRc)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier, bShift, pTarget, Value, bRc);
+}
+
+void CJS_Context::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
+}
+
+void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnBookmark_MouseUp(pBookMark);
+}
+
+void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnLink_MouseUp(pTarget);
+}
+
+void CJS_Context::OnConsole_Exec()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnConsole_Exec();
+}
+
+void CJS_Context::OnExternal_Exec()
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnExternal_Exec();
+}
+
+void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnBatchExec(pTarget);
+}
+
+void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,const CFX_WideString& strTargetName)
+{
+ ASSERT(m_pEventHandler != NULL);
+ m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
+}
+
diff --git a/fpdfsdk/src/javascript/JS_EventHandler.cpp b/fpdfsdk/src/javascript/JS_EventHandler.cpp
new file mode 100644
index 0000000000..ce69e6b9d2
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_EventHandler.cpp
@@ -0,0 +1,676 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/Field.h"
+
+/* ---------------------------- CJS_EventHandler ---------------------------- */
+
+CJS_EventHandler::CJS_EventHandler(CJS_Context * pContext) :
+ m_pJSContext(pContext),
+ m_eEventType(JET_UNKNOWN),
+ m_bValid(FALSE),
+ m_pWideStrChange(NULL),
+ m_nCommitKey(-1),
+ m_bKeyDown(FALSE),
+ m_bModifier(FALSE),
+ m_bShift(FALSE),
+ m_pISelEnd(NULL),
+ m_nSelEndDu(0),
+ m_pISelStart(NULL),
+ m_nSelStartDu(0),
+ m_bWillCommit(FALSE),
+ m_pValue(NULL),
+ m_bFieldFull(FALSE),
+ m_pbRc(NULL),
+ m_bRcDu(FALSE),
+ m_pSourceDoc(NULL),
+ m_pTargetBookMark(NULL),
+ m_pTargetDoc(NULL),
+ m_pTargetAnnot(NULL)
+{
+}
+
+CJS_EventHandler::~CJS_EventHandler()
+{
+}
+
+void CJS_EventHandler::OnApp_Init()
+{
+ Initial(JET_APP_INIT);
+}
+
+void CJS_EventHandler::OnDoc_Open(CPDFSDK_Document* pDoc, const CFX_WideString& strTargetName)
+{
+ Initial(JET_DOC_OPEN);
+
+ m_pTargetDoc = pDoc;
+ m_strTargetName = strTargetName;
+}
+
+void CJS_EventHandler::OnDoc_WillPrint(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_DOC_WILLPRINT);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnDoc_DidPrint(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_DOC_DIDPRINT);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnDoc_WillSave(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_DOC_WILLSAVE);
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnDoc_DidSave(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_DOC_DIDSAVE);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnDoc_WillClose(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_DOC_WILLCLOSE);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnPage_Open(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_PAGE_OPEN);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnPage_Close(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_PAGE_CLOSE);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnPage_InView(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_PAGE_INVIEW);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnPage_OutView(CPDFSDK_Document* pDoc)
+{
+ Initial(JET_PAGE_OUTVIEW);
+
+ m_pTargetDoc = pDoc;
+}
+
+void CJS_EventHandler::OnField_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
+{
+ Initial(JET_FIELD_MOUSEENTER);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+}
+
+void CJS_EventHandler::OnField_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
+{
+ Initial(JET_FIELD_MOUSEEXIT);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+}
+
+void CJS_EventHandler::OnField_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
+{
+ Initial(JET_FIELD_MOUSEDOWN);
+ m_eEventType = JET_FIELD_MOUSEDOWN;
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+}
+
+void CJS_EventHandler::OnField_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget)
+{
+ Initial(JET_FIELD_MOUSEUP);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+}
+
+void CJS_EventHandler::OnField_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
+ const CFX_WideString& Value)
+{
+ Initial(JET_FIELD_FOCUS);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = (CFX_WideString*)&Value;
+}
+
+void CJS_EventHandler::OnField_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDF_FormField* pTarget,
+ const CFX_WideString& Value)
+{
+ Initial(JET_FIELD_BLUR);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = (CFX_WideString*)&Value;
+}
+
+void CJS_EventHandler::OnField_Keystroke(int nCommitKey, CFX_WideString &strChange,
+ const CFX_WideString& strChangeEx, FX_BOOL KeyDown,
+ FX_BOOL bModifier, int& nSelEnd, int& nSelStart,
+ FX_BOOL bShift, CPDF_FormField* pTarget,
+ CFX_WideString& Value, FX_BOOL bWillCommit,
+ FX_BOOL bFieldFull, FX_BOOL& bRc)
+{
+ Initial(JET_FIELD_KEYSTROKE);
+
+ m_nCommitKey = nCommitKey;
+ m_pWideStrChange = &strChange;
+ m_WideStrChangeEx = strChangeEx;
+ m_bKeyDown = KeyDown;
+ m_bModifier = bModifier;
+ m_pISelEnd = &nSelEnd;
+ m_pISelStart = &nSelStart;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = &Value;
+ m_bWillCommit = bWillCommit;
+ m_pbRc = &bRc;
+ m_bFieldFull = bFieldFull;
+}
+
+void CJS_EventHandler::OnField_Validate(CFX_WideString& strChange, const CFX_WideString& strChangeEx,
+ FX_BOOL bKeyDown, FX_BOOL bModifier, FX_BOOL bShift,
+ CPDF_FormField* pTarget, CFX_WideString& Value, FX_BOOL& bRc)
+{
+ Initial(JET_FIELD_VALIDATE);
+
+ m_pWideStrChange = &strChange;
+ m_WideStrChangeEx = strChangeEx;
+ m_bKeyDown = bKeyDown;
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = &Value;
+ m_pbRc = &bRc;
+}
+
+void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, CPDF_FormField* pTarget,
+ CFX_WideString& Value, FX_BOOL& bRc)
+{
+ Initial(JET_FIELD_CALCULATE);
+
+ if (pSource)
+ m_strSourceName = pSource->GetFullName();
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = &Value;
+ m_pbRc = &bRc;
+}
+
+void CJS_EventHandler::OnField_Format(int nCommitKey, CPDF_FormField* pTarget,
+ CFX_WideString& Value, FX_BOOL bWillCommit)
+{
+ Initial(JET_FIELD_FORMAT);
+
+ m_nCommitKey = nCommitKey;
+ ASSERT(pTarget != NULL);
+ m_strTargetName = pTarget->GetFullName();
+ m_pValue = &Value;
+ m_bWillCommit = bWillCommit;
+}
+
+void CJS_EventHandler::OnScreen_Focus(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_FOCUS);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_Blur(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_BLUR);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_Open(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_OPEN);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_Close(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_CLOSE);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_MouseDown(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_MOUSEDOWN);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_MouseUp(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_MOUSEUP);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_MouseEnter(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_MOUSEENTER);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_MouseExit(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_MOUSEEXIT);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_InView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_INVIEW);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnScreen_OutView(FX_BOOL bModifier, FX_BOOL bShift, CPDFSDK_Annot* pScreen)
+{
+ Initial(JET_SCREEN_OUTVIEW);
+
+ m_bModifier = bModifier;
+ m_bShift = bShift;
+ m_pTargetAnnot = pScreen;
+}
+
+void CJS_EventHandler::OnLink_MouseUp(CPDFSDK_Document* pTarget)
+{
+ Initial(JET_LINK_MOUSEUP);
+
+ m_pTargetDoc = pTarget;
+}
+
+void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark)
+{
+ Initial(JET_BOOKMARK_MOUSEUP);
+
+ m_pTargetBookMark = pBookMark;
+}
+
+void CJS_EventHandler::OnMenu_Exec(CPDFSDK_Document* pTarget, const CFX_WideString& strTargetName)
+{
+ Initial(JET_MENU_EXEC);
+
+ m_pTargetDoc = pTarget;
+ m_strTargetName = strTargetName;
+}
+
+void CJS_EventHandler::OnExternal_Exec()
+{
+ Initial(JET_EXTERNAL_EXEC);
+}
+
+void CJS_EventHandler::OnBatchExec(CPDFSDK_Document* pTarget)
+{
+ Initial(JET_BATCH_EXEC);
+
+ m_pTargetDoc = pTarget;
+}
+
+void CJS_EventHandler::OnConsole_Exec()
+{
+ Initial(JET_CONSOLE_EXEC);
+}
+
+
+void CJS_EventHandler::Initial(JS_EVENT_T type)
+{
+ m_eEventType = type;
+
+ m_strTargetName = L"";
+ m_strSourceName = L"";
+ m_pWideStrChange = NULL;
+ m_WideStrChangeDu = L"";
+ m_WideStrChangeEx = L"";
+ m_nCommitKey = -1;
+ m_bKeyDown = FALSE;
+ m_bModifier = FALSE;
+ m_bShift = FALSE;
+ m_pISelEnd = NULL;
+ m_nSelEndDu = 0;
+ m_pISelStart = NULL;
+ m_nSelStartDu = 0;
+ m_bWillCommit = FALSE;
+ m_pValue = NULL;
+ m_bFieldFull = FALSE;
+ m_pbRc = NULL;
+ m_bRcDu = FALSE;
+
+ m_pSourceDoc = NULL;
+ m_pTargetBookMark = NULL;
+ m_pTargetDoc = NULL;
+ m_pTargetAnnot = NULL;
+
+ m_bValid = TRUE;
+}
+
+void CJS_EventHandler::Destroy()
+{
+ m_bValid = FALSE;
+}
+
+FX_BOOL CJS_EventHandler::IsValid()
+{
+ return m_bValid;
+}
+
+CFX_WideString & CJS_EventHandler::Change()
+{
+ if (m_pWideStrChange != NULL)
+ return *m_pWideStrChange;
+ else
+ {
+ return m_WideStrChangeDu;
+ }
+}
+
+CFX_WideString CJS_EventHandler::ChangeEx()
+{
+ return m_WideStrChangeEx;
+}
+
+int CJS_EventHandler::CommitKey()
+{
+ return m_nCommitKey;
+}
+
+FX_BOOL CJS_EventHandler::FieldFull()
+{
+ return m_bFieldFull;
+}
+
+FX_BOOL CJS_EventHandler::KeyDown()
+{
+ return m_bKeyDown;
+}
+
+FX_BOOL CJS_EventHandler::Modifier()
+{
+ return m_bModifier;
+}
+
+FX_LPCWSTR CJS_EventHandler::Name()
+{
+ switch (m_eEventType)
+ {
+ case JET_APP_INIT: return (FX_LPCWSTR)L"Init";
+ case JET_BATCH_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_BOOKMARK_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_CONSOLE_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_DOC_DIDPRINT: return (FX_LPCWSTR)L"DidPrint";
+ case JET_DOC_DIDSAVE: return (FX_LPCWSTR)L"DidSave";
+ case JET_DOC_OPEN: return (FX_LPCWSTR)L"Open";
+ case JET_DOC_WILLCLOSE: return (FX_LPCWSTR)L"WillClose";
+ case JET_DOC_WILLPRINT: return (FX_LPCWSTR)L"WillPrint";
+ case JET_DOC_WILLSAVE: return (FX_LPCWSTR)L"WillSave";
+ case JET_EXTERNAL_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_FIELD_FOCUS:
+ case JET_SCREEN_FOCUS: return (FX_LPCWSTR)L"Focus";
+ case JET_FIELD_BLUR:
+ case JET_SCREEN_BLUR: return (FX_LPCWSTR)L"Blur";
+ case JET_FIELD_MOUSEDOWN:
+ case JET_SCREEN_MOUSEDOWN: return (FX_LPCWSTR)L"Mouse Down";
+ case JET_FIELD_MOUSEUP:
+ case JET_SCREEN_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_FIELD_MOUSEENTER:
+ case JET_SCREEN_MOUSEENTER: return (FX_LPCWSTR)L"Mouse Enter";
+ case JET_FIELD_MOUSEEXIT:
+ case JET_SCREEN_MOUSEEXIT: return (FX_LPCWSTR)L"Mouse Exit";
+ case JET_FIELD_CALCULATE: return (FX_LPCWSTR)L"Calculate";
+ case JET_FIELD_FORMAT: return (FX_LPCWSTR)L"Format";
+ case JET_FIELD_KEYSTROKE: return (FX_LPCWSTR)L"Keystroke";
+ case JET_FIELD_VALIDATE: return (FX_LPCWSTR)L"Validate";
+ case JET_LINK_MOUSEUP: return (FX_LPCWSTR)L"Mouse Up";
+ case JET_MENU_EXEC: return (FX_LPCWSTR)L"Exec";
+ case JET_PAGE_OPEN:
+ case JET_SCREEN_OPEN: return (FX_LPCWSTR)L"Open";
+ case JET_PAGE_CLOSE:
+ case JET_SCREEN_CLOSE: return (FX_LPCWSTR)L"Close";
+ case JET_SCREEN_INVIEW:
+ case JET_PAGE_INVIEW: return (FX_LPCWSTR)L"InView";
+ case JET_PAGE_OUTVIEW:
+ case JET_SCREEN_OUTVIEW: return (FX_LPCWSTR)L"OutView";
+ default:
+ return (FX_LPCWSTR)L"";
+ }
+
+ return (FX_LPCWSTR)L"";
+}
+
+FX_LPCWSTR CJS_EventHandler::Type()
+{
+ switch (m_eEventType)
+ {
+ case JET_APP_INIT: return (FX_LPCWSTR)L"App";
+ case JET_BATCH_EXEC: return (FX_LPCWSTR)L"Batch";
+ case JET_BOOKMARK_MOUSEUP: return (FX_LPCWSTR)L"BookMark";
+ case JET_CONSOLE_EXEC: return (FX_LPCWSTR)L"Console";
+ case JET_DOC_DIDPRINT:
+ case JET_DOC_DIDSAVE:
+ case JET_DOC_OPEN:
+ case JET_DOC_WILLCLOSE:
+ case JET_DOC_WILLPRINT:
+ case JET_DOC_WILLSAVE: return (FX_LPCWSTR)L"Doc";
+ case JET_EXTERNAL_EXEC: return (FX_LPCWSTR)L"External";
+ case JET_FIELD_BLUR:
+ case JET_FIELD_FOCUS:
+ case JET_FIELD_MOUSEDOWN:
+ case JET_FIELD_MOUSEENTER:
+ case JET_FIELD_MOUSEEXIT:
+ case JET_FIELD_MOUSEUP:
+ case JET_FIELD_CALCULATE:
+ case JET_FIELD_FORMAT:
+ case JET_FIELD_KEYSTROKE:
+ case JET_FIELD_VALIDATE: return (FX_LPCWSTR)L"Field";
+ case JET_SCREEN_FOCUS:
+ case JET_SCREEN_BLUR:
+ case JET_SCREEN_OPEN:
+ case JET_SCREEN_CLOSE:
+ case JET_SCREEN_MOUSEDOWN:
+ case JET_SCREEN_MOUSEUP:
+ case JET_SCREEN_MOUSEENTER:
+ case JET_SCREEN_MOUSEEXIT:
+ case JET_SCREEN_INVIEW:
+ case JET_SCREEN_OUTVIEW: return (FX_LPCWSTR)L"Screen";
+ case JET_LINK_MOUSEUP: return (FX_LPCWSTR)L"Link";
+ case JET_MENU_EXEC: return (FX_LPCWSTR)L"Menu";
+ case JET_PAGE_OPEN:
+ case JET_PAGE_CLOSE:
+ case JET_PAGE_INVIEW:
+ case JET_PAGE_OUTVIEW:return (FX_LPCWSTR)L"Page";
+ default:
+ return (FX_LPCWSTR)L"";
+ }
+
+ return (FX_LPCWSTR)L"";
+}
+
+FX_BOOL& CJS_EventHandler::Rc()
+{
+ if (m_pbRc != NULL)
+ return *m_pbRc;
+ else
+ {
+ return m_bRcDu;
+ }
+}
+
+int & CJS_EventHandler::SelEnd()
+{
+ if (m_pISelEnd != NULL)
+ {
+ return *m_pISelEnd;
+ }
+ else
+ {
+ return m_nSelEndDu;
+ }
+}
+
+int & CJS_EventHandler::SelStart()
+{
+ if (m_pISelStart != NULL)
+ return * m_pISelStart;
+ else
+ {
+ return m_nSelStartDu;
+ }
+}
+
+FX_BOOL CJS_EventHandler::Shift()
+{
+ return m_bShift;
+}
+
+Field* CJS_EventHandler::Source()
+{
+ ASSERT(m_pJSContext != NULL);
+
+ CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+
+ JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+ ASSERT(pDocObj.IsEmpty() == FALSE);
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pFieldObj.IsEmpty() == FALSE);
+
+ CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+ ASSERT(pJSDocument != NULL);
+ Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+ ASSERT(pDocument != NULL);
+ if (m_pTargetDoc != NULL)
+ pDocument->AttachDoc(m_pTargetDoc);
+ else
+ pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+
+ //if (m_pSourceField == NULL)
+ // return NULL;
+ //CRAO_Widget *pWidget = IBCL_Widget::GetWidget(m_pSourceField);
+ //CPDF_FormField* pFormField = pWidget->GetFormField();
+ //ASSERT(pFormField);
+ //CFX_WideString csFieldName = pFormField->GetFullName();
+ CJS_Field * pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+ ASSERT(pJSField != NULL);
+ Field * pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+ pField->AttachField(pDocument, m_strSourceName);
+ return pField;
+}
+
+Field* CJS_EventHandler::Target_Field()
+{
+ ASSERT(m_pJSContext != NULL);
+
+ CJS_Runtime* pRuntime = m_pJSContext->GetJSRuntime();
+
+ JSFXObject pDocObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Document"));
+ ASSERT(pDocObj.IsEmpty() == FALSE);
+ JSFXObject pFieldObj = JS_NewFxDynamicObj(*pRuntime, m_pJSContext, JS_GetObjDefnID(*pRuntime, L"Field"));
+ ASSERT(pFieldObj.IsEmpty() == FALSE);
+
+ CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pDocObj);
+ ASSERT(pJSDocument != NULL);
+ Document* pDocument = (Document*)pJSDocument->GetEmbedObject();
+ ASSERT(pDocument != NULL);
+ if (m_pTargetDoc != NULL)
+ pDocument->AttachDoc(m_pTargetDoc);
+ else
+ pDocument->AttachDoc(m_pJSContext->GetReaderDocument());
+
+ CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pFieldObj);
+ ASSERT(pJSField != NULL);
+
+ Field* pField = (Field *)pJSField->GetEmbedObject();
+ ASSERT(pField != NULL);
+
+ pField->AttachField(pDocument, m_strTargetName);
+ return pField;
+}
+
+CFX_WideString& CJS_EventHandler::Value()
+{
+ return *m_pValue;
+}
+
+FX_BOOL CJS_EventHandler::WillCommit()
+{
+ return m_bWillCommit;
+}
+
+CFX_WideString CJS_EventHandler::TargetName()
+{
+ return m_strTargetName;
+}
+
+
diff --git a/fpdfsdk/src/javascript/JS_GlobalData.cpp b/fpdfsdk/src/javascript/JS_GlobalData.cpp
new file mode 100644
index 0000000000..97bba8d243
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_GlobalData.cpp
@@ -0,0 +1,581 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_GlobalData.h"
+
+#define JS_MAXGLOBALDATA (1024 * 4 - 8)
+
+/* --------------------- CJS_GlobalVariableArray --------------------- */
+
+CJS_GlobalVariableArray::CJS_GlobalVariableArray()
+{
+}
+
+CJS_GlobalVariableArray::~CJS_GlobalVariableArray()
+{
+ Empty();
+}
+
+void CJS_GlobalVariableArray::Copy(const CJS_GlobalVariableArray& array)
+{
+ Empty();
+ for (int i=0,sz=array.Count(); i<sz; i++)
+ {
+ CJS_KeyValue* pOldObjData = array.GetAt(i);
+ ASSERT(pOldObjData != NULL);
+
+ switch (pOldObjData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ pNewObjData->dData = pOldObjData->dData;
+ Add(pNewObjData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ pNewObjData->bData = pOldObjData->bData;
+ Add(pNewObjData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ pNewObjData->sData = pOldObjData->sData;
+ Add(pNewObjData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ pNewObjData->objData.Copy(pOldObjData->objData);
+ Add(pNewObjData);
+ }
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ CJS_KeyValue* pNewObjData = new CJS_KeyValue;
+ pNewObjData->sKey = pOldObjData->sKey;
+ pNewObjData->nType = pOldObjData->nType;
+ Add(pNewObjData);
+ }
+ }
+ }
+}
+
+void CJS_GlobalVariableArray::Add(CJS_KeyValue* p)
+{
+ array.Add(p);
+}
+
+int CJS_GlobalVariableArray::Count() const
+{
+ return array.GetSize();
+}
+
+CJS_KeyValue* CJS_GlobalVariableArray::GetAt(int index) const
+{
+ return array.GetAt(index);
+}
+
+void CJS_GlobalVariableArray::Empty()
+{
+ for (int i=0,sz=array.GetSize(); i<sz; i++)
+ delete array.GetAt(i);
+ array.RemoveAll();
+}
+
+/* -------------------------- CJS_GlobalData -------------------------- */
+
+#define READER_JS_GLOBALDATA_FILENAME L"Reader_JsGlobal.Data"
+#define PHANTOM_JS_GLOBALDATA_FILENAME L"Phantom_JsGlobal.Data"
+#define SDK_JS_GLOBALDATA_FILENAME L"SDK_JsGlobal.Data"
+
+static const FX_BYTE JS_RC4KEY[] = {0x19,0xa8,0xe8,0x01,0xf6,0xa8,0xb6,0x4d,0x82,0x04,
+ 0x45,0x6d,0xb4,0xcf,0xd7,0x77,0x67,0xf9,0x75,0x9f,
+ 0xf0,0xe0,0x1e,0x51,0xee,0x46,0xfd,0x0b,0xc9,0x93,
+ 0x25,0x55,0x4a,0xee,0xe0,0x16,0xd0,0xdf,0x8c,0xfa,
+ 0x2a,0xa9,0x49,0xfd,0x97,0x1c,0x0e,0x22,0x13,0x28,
+ 0x7c,0xaf,0xc4,0xfc,0x9c,0x12,0x65,0x8c,0x4e,0x5b,
+ 0x04,0x75,0x89,0xc9,0xb1,0xed,0x50,0xca,0x96,0x6f,
+ 0x1a,0x7a,0xfe,0x58,0x5d,0xec,0x19,0x4a,0xf6,0x35,
+ 0x6a,0x97,0x14,0x00,0x0e,0xd0,0x6b,0xbb,0xd5,0x75,
+ 0x55,0x8b,0x6e,0x6b,0x19,0xa0,0xf8,0x77,0xd5,0xa3
+ };
+
+CJS_GlobalData::CJS_GlobalData(CPDFDoc_Environment* pApp) : m_pApp(pApp)
+{
+// IBaseAnnot* pBaseAnnot = IBaseAnnot::GetBaseAnnot(m_pApp);
+// ASSERT(pBaseAnnot != NULL);
+//
+// m_sFilePath = pBaseAnnot->GetUserPath();
+ m_sFilePath += SDK_JS_GLOBALDATA_FILENAME;
+
+ LoadGlobalPersistentVariables();
+}
+
+CJS_GlobalData::~CJS_GlobalData()
+{
+ SaveGlobalPersisitentVariables();
+
+ for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+ delete m_arrayGlobalData.GetAt(i);
+
+ m_arrayGlobalData.RemoveAll();
+}
+
+int CJS_GlobalData::FindGlobalVariable(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+
+ int nRet = -1;
+
+ for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+ {
+ CJS_GlobalData_Element* pTemp = m_arrayGlobalData.GetAt(i);
+ if (pTemp->data.sKey[0] == *propname && pTemp->data.sKey == propname)
+ {
+ nRet = i;
+ break;
+ }
+ }
+
+ return nRet;
+}
+
+CJS_GlobalData_Element* CJS_GlobalData::GetGlobalVariable(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+
+ int nFind = FindGlobalVariable(propname);
+
+ if (nFind >= 0)
+ return m_arrayGlobalData.GetAt(nFind);
+ else
+ return NULL;
+}
+
+void CJS_GlobalData::SetGlobalVariableNumber(FX_LPCSTR propname, double dData)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pData->data.dData = dData;
+ }
+ else
+ {
+ CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pNewData->data.dData = dData;
+
+ m_arrayGlobalData.Add(pNewData);
+ }
+}
+
+void CJS_GlobalData::SetGlobalVariableBoolean(FX_LPCSTR propname, bool bData)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pData->data.bData = bData;
+ }
+ else
+ {
+ CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pNewData->data.bData = bData;
+
+ m_arrayGlobalData.Add(pNewData);
+ }
+}
+
+void CJS_GlobalData::SetGlobalVariableString(FX_LPCSTR propname, const CFX_ByteString& sData)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->data.nType = JS_GLOBALDATA_TYPE_STRING;
+ pData->data.sData = sData;
+ }
+ else
+ {
+ CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_STRING;
+ pNewData->data.sData = sData;
+
+ m_arrayGlobalData.Add(pNewData);
+ }
+}
+
+void CJS_GlobalData::SetGlobalVariableObject(FX_LPCSTR propname, const CJS_GlobalVariableArray& array)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pData->data.objData.Copy(array);
+ }
+ else
+ {
+ CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pNewData->data.objData.Copy(array);
+
+ m_arrayGlobalData.Add(pNewData);
+ }
+}
+
+void CJS_GlobalData::SetGlobalVariableNull(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->data.nType = JS_GLOBALDATA_TYPE_NULL;
+ }
+ else
+ {
+ CJS_GlobalData_Element* pNewData = new CJS_GlobalData_Element;
+ pNewData->data.sKey = sPropName;
+ pNewData->data.nType = JS_GLOBALDATA_TYPE_NULL;
+
+ m_arrayGlobalData.Add(pNewData);
+ }
+}
+
+FX_BOOL CJS_GlobalData::SetGlobalVariablePersistent(FX_LPCSTR propname, FX_BOOL bPersistent)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return FALSE;
+
+ if (CJS_GlobalData_Element* pData = GetGlobalVariable(sPropName))
+ {
+ pData->bPersistent = bPersistent;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CJS_GlobalData::DeleteGlobalVariable(FX_LPCSTR propname)
+{
+ ASSERT(propname != NULL);
+ CFX_ByteString sPropName = propname;
+
+ sPropName.TrimLeft();
+ sPropName.TrimRight();
+
+ if (sPropName.GetLength() == 0) return FALSE;
+
+ int nFind = FindGlobalVariable(sPropName);
+
+ if (nFind >= 0)
+ {
+ delete m_arrayGlobalData.GetAt(nFind);
+ m_arrayGlobalData.RemoveAt(nFind);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CJS_GlobalData::GetSize() const
+{
+ return m_arrayGlobalData.GetSize();
+}
+
+CJS_GlobalData_Element* CJS_GlobalData::GetAt(int index) const
+{
+ return m_arrayGlobalData.GetAt(index);
+}
+
+void CJS_GlobalData::LoadGlobalPersistentVariables()
+{
+ FX_LPBYTE pBuffer = NULL;
+ FX_INT32 nLength = 0;
+
+ LoadFileBuffer(m_sFilePath, pBuffer, nLength);
+
+ CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY));
+
+ if (pBuffer)
+ {
+ FX_LPBYTE p = pBuffer;
+ FX_WORD wType = *((FX_WORD*)p);
+ p += sizeof(FX_WORD);
+
+ //FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F');
+
+ if (wType == (FX_WORD)(('X' << 8) | 'F'))
+ {
+ FX_WORD wVersion = *((FX_WORD*)p);
+ p += sizeof(FX_WORD);
+
+ ASSERT(wVersion <= 2);
+
+ FX_DWORD dwCount = *((FX_DWORD*)p);
+ p += sizeof(FX_DWORD);
+
+ FX_DWORD dwSize = *((FX_DWORD*)p);
+ p += sizeof(FX_DWORD);
+
+ if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD)* 2)
+ {
+ for (FX_INT32 i=0,sz=dwCount; i<sz; i++)
+ {
+ if (p > pBuffer + nLength)
+ break;
+
+ FX_DWORD dwNameLen = *((FX_DWORD*)p);
+ p += sizeof(FX_DWORD);
+
+ if (p + dwNameLen > pBuffer + nLength)
+ break;
+
+ CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen);
+ p += sizeof(char) * dwNameLen;
+
+ FX_WORD wDataType = *((FX_WORD*)p);
+ p += sizeof(FX_WORD);
+
+ switch (wDataType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ double dData = 0;
+ switch (wVersion)
+ {
+ case 1:
+ {
+ FX_DWORD dwData = *((FX_DWORD*)p);
+ p += sizeof(FX_DWORD);
+ dData = dwData;
+ }
+ break;
+ case 2:
+ {
+ dData = *((double*)p);
+ p += sizeof(double);
+ }
+ break;
+ }
+ SetGlobalVariableNumber(sEntry, dData);
+ SetGlobalVariablePersistent(sEntry, TRUE);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ FX_WORD wData = *((FX_WORD*)p);
+ p += sizeof(FX_WORD);
+ SetGlobalVariableBoolean(sEntry, (bool)(wData == 1));
+ SetGlobalVariablePersistent(sEntry, TRUE);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ FX_DWORD dwLength = *((FX_DWORD*)p);
+ p += sizeof(FX_DWORD);
+
+ if (p + dwLength > pBuffer + nLength)
+ break;
+
+ SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength));
+ SetGlobalVariablePersistent(sEntry, TRUE);
+ p += sizeof(char) * dwLength;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ SetGlobalVariableNull(sEntry);
+ SetGlobalVariablePersistent(sEntry, TRUE);
+ }
+ }
+ }
+ }
+ }
+ FX_Free(pBuffer);
+ }
+}
+
+/*
+struct js_global_datafile_header
+{
+ FX_WORD type; //FX ('X' << 8) | 'F'
+ FX_WORD version; //1.0
+ FX_DWORD datacount;
+};
+struct js_global_datafile_data
+{
+ FX_WORD type;
+ FX_DWORD nData;
+ FX_WORD bData;
+ FX_DWORD nStrLen;
+ char* pStr;
+};
+*/
+
+void CJS_GlobalData::SaveGlobalPersisitentVariables()
+{
+ FX_DWORD nCount = 0;
+ CFX_BinaryBuf sData;
+
+ for (int i=0,sz=m_arrayGlobalData.GetSize(); i<sz; i++)
+ {
+ CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i);
+ ASSERT(pElement != NULL);
+
+ if (pElement->bPersistent)
+ {
+ CFX_BinaryBuf sElement;
+ MakeByteString(pElement->data.sKey, &pElement->data, sElement);
+
+ if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA)
+ break;
+
+ sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize());
+ nCount++;
+ }
+ }
+
+ CFX_BinaryBuf sFile;
+
+ FX_WORD wType = (FX_WORD)(('X' << 8) | 'F');
+ sFile.AppendBlock(&wType, sizeof(FX_WORD));
+ FX_WORD wVersion = 2;
+ sFile.AppendBlock(&wVersion, sizeof(FX_WORD));
+ sFile.AppendBlock(&nCount, sizeof(FX_DWORD));
+ FX_DWORD dwSize = sData.GetSize();
+ sFile.AppendBlock(&dwSize, sizeof(FX_DWORD));
+
+ sFile.AppendBlock(sData.GetBuffer(), sData.GetSize());
+
+ CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY));
+ WriteFileBuffer(m_sFilePath, (FX_LPCSTR)sFile.GetBuffer(), sFile.GetSize());
+}
+
+void CJS_GlobalData::LoadFileBuffer(FX_LPCWSTR sFilePath, FX_LPBYTE& pBuffer, FX_INT32& nLength)
+{
+//UnSupport.
+}
+
+void CJS_GlobalData::WriteFileBuffer(FX_LPCWSTR sFilePath, FX_LPCSTR pBuffer, FX_INT32 nLength)
+{
+//UnSupport.
+}
+
+void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData)
+{
+ ASSERT(pData != NULL);
+
+ FX_WORD wType = (FX_WORD)pData->nType;
+
+ switch (wType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+ sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+ sData.AppendString(name);
+
+ sData.AppendBlock(&wType, sizeof(FX_WORD));
+ double dData = pData->dData;
+ sData.AppendBlock(&dData, sizeof(double));
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+ sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+ sData.AppendString(name);
+
+ sData.AppendBlock(&wType, sizeof(FX_WORD));
+ FX_WORD wData = (FX_WORD)pData->bData;
+ sData.AppendBlock(&wData, sizeof(FX_WORD));
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+ sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+ sData.AppendString(name);
+
+ sData.AppendBlock(&wType, sizeof(FX_WORD));
+
+ FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength();
+ sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD));
+ sData.AppendString(pData->sData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ FX_DWORD dwNameLen = (FX_DWORD)name.GetLength();
+ sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD));
+ sData.AppendString(name);
+
+ sData.AppendBlock(&wType, sizeof(FX_DWORD));
+ }
+ break;
+ default:
+ break;
+ }
+}
+
diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp
new file mode 100644
index 0000000000..07c5df2525
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_Object.cpp
@@ -0,0 +1,145 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+// #include "../../include/javascript/JS_MsgBox.h"
+// #include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+
+int FXJS_MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
+{
+ int nRet = 0;
+
+ if(pApp)
+ {
+ CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
+ if(pDoc)
+ pDoc->KillFocusAnnot();
+ nRet = pApp->JS_appAlert(swMsg, swTitle, nType, nIcon);
+ }
+
+ return nRet;
+}
+
+CPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc)
+{
+ if (CJS_Context* pContext = (CJS_Context *)cc)
+ {
+ if (pContext->GetReaderDocument())
+ return NULL;
+ }
+ return NULL;
+}
+
+/* --------------------------------- CJS_EmbedObj --------------------------------- */
+
+CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) :
+ m_pJSObject(pJSObject)
+{
+}
+
+CJS_EmbedObj::~CJS_EmbedObj()
+{
+ m_pJSObject = NULL;
+
+}
+
+CPDFSDK_PageView* CJS_EmbedObj::JSGetPageView(IFXJS_Context* cc)
+{
+ return FXJS_GetPageView(cc);
+}
+
+int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView,FX_LPCWSTR swMsg,FX_LPCWSTR swTitle,FX_UINT nType,FX_UINT nIcon)
+{
+ return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
+}
+
+void CJS_EmbedObj::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)
+{
+ CJS_Object::Alert(pContext, swMsg);
+}
+
+CJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment * pApp,FX_UINT nElapse)
+{
+ CJS_Timer* pTimer = new CJS_Timer(this,pApp);
+ pTimer->SetJSTimer(nElapse);
+
+ return pTimer;
+}
+
+void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer)
+{
+ ASSERT(pTimer != NULL);
+ pTimer->KillJSTimer();
+ delete pTimer;
+}
+
+FX_BOOL CJS_EmbedObj::IsSafeMode(IFXJS_Context* cc)
+{
+ ASSERT(cc != NULL);
+
+ return TRUE;
+}
+
+/* --------------------------------- CJS_Object --------------------------------- */
+void FreeObject(const WeakCallbackData<v8::Object, CJS_Object>& data)
+{
+ CJS_Object* pJSObj = data.GetParameter();
+ if(pJSObj)
+ {
+ pJSObj->ExitInstance();
+ delete pJSObj;
+ }
+ v8::Local<v8::Object> obj = data.GetValue();
+ JS_FreePrivate(obj);
+}
+
+CJS_Object::CJS_Object(JSFXObject pObject) :m_pEmbedObj(NULL)
+{
+ v8::Local<v8::Context> context = pObject->CreationContext();
+ m_pIsolate = context->GetIsolate();
+ m_pObject.Reset(m_pIsolate, pObject);
+};
+
+CJS_Object::~CJS_Object(void)
+{
+ delete m_pEmbedObj;
+ m_pEmbedObj = NULL;
+
+ m_pObject.Reset();
+};
+
+void CJS_Object::MakeWeak()
+{
+ m_pObject.SetWeak(this, FreeObject);
+}
+
+CPDFSDK_PageView* CJS_Object::JSGetPageView(IFXJS_Context* cc)
+{
+ return FXJS_GetPageView(cc);
+}
+
+int CJS_Object::MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
+{
+ return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
+}
+
+void CJS_Object::Alert(CJS_Context* pContext, FX_LPCWSTR swMsg)
+{
+ ASSERT(pContext != NULL);
+
+ if (pContext->IsMsgBoxEnabled())
+ {
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ if(pApp)
+ pApp->JS_appAlert(swMsg, NULL, 0, 3);
+ }
+}
+
+
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp
new file mode 100644
index 0000000000..dc95d530f9
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_Runtime.cpp
@@ -0,0 +1,470 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/Consts.h"
+#include "../../include/javascript/Document.h"
+#include "../../include/javascript/event.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/Icon.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/report.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/JS_GlobalData.h"
+#include "../../include/javascript/global.h"
+#include "../../include/javascript/console.h"
+
+CJS_RuntimeFactory::~CJS_RuntimeFactory()
+{
+}
+
+IFXJS_Runtime* CJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp)
+{
+ if (!m_bInit)
+ {
+ JS_Initial();
+
+ m_bInit = TRUE;
+ }
+ return new CJS_Runtime(pApp);
+}
+void CJS_RuntimeFactory::AddRef()
+{
+ //to do.Should be implemented as atom manipulation.
+ m_nRef++;
+}
+void CJS_RuntimeFactory::Release()
+{
+ if(m_bInit)
+ {
+ //to do.Should be implemented as atom manipulation.
+ if (--m_nRef == 0)
+ {
+ JS_Release();
+ ReleaseGlobalData();
+ m_bInit = FALSE;
+ }
+ }
+}
+
+void CJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime)
+{
+ if(pRuntime)
+ delete (CJS_Runtime*)pRuntime;
+}
+
+CJS_GlobalData* CJS_RuntimeFactory::NewGlobalData(CPDFDoc_Environment* pApp)
+{
+ if (m_pGlobalData)
+ {
+ m_nGlobalDataCount++;
+ return m_pGlobalData;
+ }
+ else
+ {
+ m_nGlobalDataCount = 1;
+ m_pGlobalData = new CJS_GlobalData(pApp);
+ return m_pGlobalData;
+ }
+}
+
+void CJS_RuntimeFactory::ReleaseGlobalData()
+{
+ m_nGlobalDataCount--;
+
+ if (m_nGlobalDataCount <= 0)
+ {
+ delete m_pGlobalData;
+ m_pGlobalData = NULL;
+ }
+}
+
+/* ------------------------------ CJS_Runtime ------------------------------ */
+
+CJS_Runtime::CJS_Runtime(CPDFDoc_Environment * pApp) :
+ m_pApp(pApp),
+ m_pDocument(NULL),
+ m_pFieldEventPath(NULL),
+ m_bBlocking(FALSE),
+ m_bRegistered(FALSE)
+{
+ m_isolate = v8::Isolate::New();
+ //m_isolate->Enter();
+
+ InitJSObjects();
+
+ CJS_Context * pContext = (CJS_Context*)NewContext();
+ JS_InitialRuntime(*this, this, pContext, m_context);
+ ReleaseContext(pContext);
+}
+
+CJS_Runtime::~CJS_Runtime()
+{
+ for (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)
+ delete m_ContextArray.GetAt(i);
+
+ m_ContextArray.RemoveAll();
+
+ JS_ReleaseRuntime(*this, m_context);
+
+ RemoveEventsInLoop(m_pFieldEventPath);
+
+ m_pApp = NULL;
+ m_pDocument = NULL;
+ m_pFieldEventPath = NULL;
+ m_context.Reset();
+
+ //m_isolate->Exit();
+ m_isolate->Dispose();
+}
+
+FX_BOOL CJS_Runtime::InitJSObjects()
+{
+ v8::Isolate::Scope isolate_scope(GetIsolate());
+ HandleScope handle_scope(GetIsolate());
+ v8::Handle<v8::Context> context = v8::Context::New(GetIsolate());
+ v8::Context::Scope context_scope(context);
+ //0 - 8
+ if (CJS_Border::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Display::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Font::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Highlight::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Position::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_ScaleHow::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_ScaleWhen::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Style::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Zoomtype::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ //9 - 11
+ if (CJS_App::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Color::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Console::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ //12 - 14
+ if (CJS_Document::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_Event::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Field::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+
+ //15 - 17
+ if (CJS_Global::Init(*this, JS_STATIC) < 0) return FALSE;
+ if (CJS_Icon::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_Util::Init(*this, JS_STATIC) < 0) return FALSE;
+
+ if (CJS_PublicMethods::Init(*this) < 0) return FALSE;
+ if (CJS_GlobalConsts::Init(*this) < 0) return FALSE;
+ if (CJS_GlobalArrays::Init(*this) < 0) return FALSE;
+
+ if (CJS_TimerObj::Init(*this, JS_DYNAMIC) < 0) return FALSE;
+ if (CJS_PrintParamsObj::Init(*this, JS_DYNAMIC) <0) return FALSE;
+
+ return TRUE;
+}
+
+IFXJS_Context* CJS_Runtime::NewContext()
+{
+ CJS_Context * p = new CJS_Context(this);
+ m_ContextArray.Add(p);
+ return p;
+}
+
+void CJS_Runtime::ReleaseContext(IFXJS_Context * pContext)
+{
+ CJS_Context* pJSContext = (CJS_Context*)pContext;
+
+ for (int i=0, sz=m_ContextArray.GetSize(); i<sz; i++)
+ {
+ if (pJSContext == m_ContextArray.GetAt(i))
+ {
+ delete pJSContext;
+ m_ContextArray.RemoveAt(i);
+ break;
+ }
+ }
+}
+
+IFXJS_Context* CJS_Runtime::GetCurrentContext()
+{
+ if(!m_ContextArray.GetSize())
+ return NULL;
+ return m_ContextArray.GetAt(m_ContextArray.GetSize()-1);
+}
+
+void CJS_Runtime::SetReaderDocument(CPDFSDK_Document* pReaderDoc)
+{
+ if (m_pDocument != pReaderDoc)
+ {
+ v8::Isolate::Scope isolate_scope(m_isolate);
+ HandleScope handle_scope(m_isolate);
+ v8::Local<v8::Context> context =v8::Local<v8::Context>::New(m_isolate, m_context);
+ v8::Context::Scope context_scope(context);
+
+ m_pDocument = pReaderDoc;
+
+ if (pReaderDoc)
+ {
+ JSObject pThis = JS_GetThisObj(*this);
+ if(!pThis.IsEmpty())
+ {
+ if (JS_GetObjDefnID(pThis) == JS_GetObjDefnID(*this, L"Document"))
+ {
+ if (CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pThis))
+ {
+ if (Document * pDocument = (Document*)pJSDocument->GetEmbedObject())
+ pDocument->AttachDoc(pReaderDoc);
+ }
+ }
+ }
+ JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"Document"));
+ }
+ else
+ {
+ JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"app"));
+ }
+ }
+}
+
+FX_BOOL CJS_Runtime::AddEventToLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
+{
+ if (m_pFieldEventPath == NULL)
+ {
+ m_pFieldEventPath = new CJS_FieldEvent;
+ m_pFieldEventPath->sTargetName = sTargetName;
+ m_pFieldEventPath->eEventType = eEventType;
+ m_pFieldEventPath->pNext = NULL;
+
+ return TRUE;
+ }
+
+ //to search
+ CJS_FieldEvent* p = m_pFieldEventPath;
+ CJS_FieldEvent* pLast = m_pFieldEventPath;
+ while (p)
+ {
+ if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+ return FALSE;
+
+ pLast = p;
+ p = p->pNext;
+ }
+
+ //to add
+ CJS_FieldEvent* pNew = new CJS_FieldEvent;
+ pNew->sTargetName = sTargetName;
+ pNew->eEventType = eEventType;
+ pNew->pNext = NULL;
+
+ pLast->pNext = pNew;
+
+ return TRUE;
+}
+
+void CJS_Runtime::RemoveEventInLoop(const CFX_WideString& sTargetName, JS_EVENT_T eEventType)
+{
+ FX_BOOL bFind = FALSE;
+
+ CJS_FieldEvent* p = m_pFieldEventPath;
+ CJS_FieldEvent* pLast = NULL;
+ while (p)
+ {
+ if (p->eEventType == eEventType && p->sTargetName == sTargetName)
+ {
+ bFind = TRUE;
+ break;
+ }
+
+ pLast = p;
+ p = p->pNext;
+ }
+
+ if (bFind)
+ {
+ RemoveEventsInLoop(p);
+
+ if (p == m_pFieldEventPath)
+ m_pFieldEventPath = NULL;
+
+ if (pLast)
+ pLast->pNext = NULL;
+ }
+}
+
+void CJS_Runtime::RemoveEventsInLoop(CJS_FieldEvent* pStart)
+{
+ CJS_FieldEvent* p = pStart;
+
+ while (p)
+ {
+ CJS_FieldEvent* pOld = p;
+ p = pOld->pNext;
+
+ delete pOld;
+ }
+}
+
+v8::Handle<v8::Context> CJS_Runtime::NewJSContext()
+{
+ return v8::Local<v8::Context>::New(m_isolate, m_context);
+}
+
+CFX_WideString ChangeObjName(const CFX_WideString& str)
+{
+ CFX_WideString sRet = str;
+ sRet.Replace((FX_LPCWSTR)L"_", (FX_LPCWSTR)L".");
+ return sRet;
+}
+
+void CJS_Runtime::GetObjectNames(CFX_WideStringArray& array)
+{
+ array.RemoveAll();
+
+ array.Add(CJS_Border::m_pClassName);
+ array.Add(CJS_Display::m_pClassName);
+ array.Add(CJS_Font::m_pClassName);
+ array.Add(CJS_Highlight::m_pClassName);
+ array.Add(CJS_Position::m_pClassName);
+ array.Add(CJS_ScaleHow::m_pClassName);
+ array.Add(CJS_ScaleWhen::m_pClassName);
+ array.Add(CJS_Style::m_pClassName);
+ array.Add(CJS_Zoomtype::m_pClassName);
+
+ array.Add(CJS_App::m_pClassName);
+ array.Add((FX_LPCWSTR)"this");
+ array.Add(CJS_Event::m_pClassName);
+
+ array.Add(CJS_Global::m_pClassName);
+ array.Add(CJS_Util::m_pClassName);
+}
+
+void CJS_Runtime::GetObjectConsts(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSConstSpec* pConsts = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_Border::m_pClassName)
+ CJS_Border::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Display::m_pClassName)
+ CJS_Display::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Font::m_pClassName)
+ CJS_Font::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Highlight::m_pClassName)
+ CJS_Highlight::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Position::m_pClassName)
+ CJS_Position::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_ScaleHow::m_pClassName)
+ CJS_ScaleHow::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_ScaleWhen::m_pClassName)
+ CJS_ScaleWhen::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Style::m_pClassName)
+ CJS_Style::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Zoomtype::m_pClassName)
+ CJS_Zoomtype::GetConsts(pConsts, nSize);
+
+ else if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetConsts(pConsts, nSize);
+
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetConsts(pConsts, nSize);
+ else
+ CJS_App::GetConsts(pConsts, nSize);
+ }
+
+ if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetConsts(pConsts, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetConsts(pConsts, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pConsts[i].pName);
+}
+
+void CJS_Runtime::GetObjectProps(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSPropertySpec* pProperties = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetProperties(pProperties, nSize);
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetProperties(pProperties, nSize);
+ else
+ CJS_App::GetProperties(pProperties, nSize);
+ }
+ else if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetProperties(pProperties, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetProperties(pProperties, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pProperties[i].pName);
+}
+
+void CJS_Runtime::GetObjectMethods(const CFX_WideString& sObjName, CFX_WideStringArray& array)
+{
+ JSMethodSpec* pMethods = NULL;
+ int nSize = 0;
+
+ if (sObjName == CJS_App::m_pClassName)
+ CJS_App::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Color::m_pClassName)
+ CJS_Color::GetMethods(pMethods, nSize);
+ else if (sObjName == L"this")
+ {
+ if (GetReaderDocument())
+ CJS_Document::GetMethods(pMethods, nSize);
+ else
+ CJS_App::GetMethods(pMethods, nSize);
+ }
+ else if (sObjName == CJS_Event::m_pClassName)
+ CJS_Event::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Field::m_pClassName)
+ CJS_Field::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Global::m_pClassName)
+ CJS_Global::GetMethods(pMethods, nSize);
+ else if (sObjName == CJS_Util::m_pClassName)
+ CJS_Util::GetMethods(pMethods, nSize);
+
+ for (int i=0; i<nSize; i++)
+ array.Add(pMethods[i].pName);
+}
+
+FX_BOOL CJS_Runtime::IsEntered()
+{
+ return v8::Isolate::GetCurrent() == m_isolate;
+}
+void CJS_Runtime::Exit()
+{
+ if(m_isolate) m_isolate->Exit();
+}
+void CJS_Runtime::Enter()
+{
+ if(m_isolate) m_isolate->Enter();
+} \ No newline at end of file
diff --git a/fpdfsdk/src/javascript/JS_Value.cpp b/fpdfsdk/src/javascript/JS_Value.cpp
new file mode 100644
index 0000000000..037f6184ed
--- /dev/null
+++ b/fpdfsdk/src/javascript/JS_Value.cpp
@@ -0,0 +1,643 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+
+/* ---------------------------- CJS_Value ---------------------------- */
+
+CJS_Value::CJS_Value(v8::Isolate* isolate) : m_isolate(isolate),m_eType(VT_unknown)
+{
+}
+CJS_Value::CJS_Value(v8::Isolate* isolate, v8::Handle<v8::Value> pValue,FXJSVALUETYPE t) :m_isolate(isolate), m_pValue(pValue) , m_eType(t)
+{
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const int &iValue):m_isolate(isolate)
+{
+ operator =(iValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const bool &bValue):m_isolate(isolate)
+{
+ operator =(bValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const float &fValue):m_isolate(isolate)
+{
+ operator =(fValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, const double &dValue):m_isolate(isolate)
+{
+ operator =(dValue);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, JSFXObject pJsObj):m_isolate(isolate)
+{
+ operator =(pJsObj);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Object * pJsObj):m_isolate(isolate)
+{
+ operator =(pJsObj);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCWSTR pWstr):m_isolate(isolate)
+{
+ operator =(pWstr);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, FX_LPCSTR pStr):m_isolate(isolate)
+{
+ operator = (pStr);
+}
+
+CJS_Value::CJS_Value(v8::Isolate* isolate, CJS_Array& array):m_isolate(isolate)
+{
+ operator = (array);
+}
+
+CJS_Value::~CJS_Value()
+{
+}
+
+void CJS_Value::Attach(v8::Handle<v8::Value> pValue,FXJSVALUETYPE t)
+{
+ m_pValue = pValue;
+ m_eType = t;
+}
+
+void CJS_Value::Attach(CJS_Value *pValue)
+{
+ if (pValue)
+ Attach(pValue->ToJSValue(),pValue->GetType());
+}
+
+void CJS_Value::Detach()
+{
+ m_pValue = v8::Handle<v8::Value>();
+ m_eType = VT_unknown;
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+CJS_Value::operator int() const
+{
+
+ return JS_ToInt32(m_pValue);
+
+}
+
+CJS_Value::operator bool() const
+{
+
+ return JS_ToBoolean(m_pValue);
+
+}
+
+CJS_Value::operator double() const
+{
+
+ return JS_ToNumber(m_pValue);
+
+}
+
+CJS_Value::operator float() const
+{
+
+ return (float)JS_ToNumber(m_pValue);
+
+}
+
+CJS_Value::operator CJS_Object *() const
+{
+
+ v8::Handle<v8::Object> pObj = JS_ToObject(m_pValue);
+ return (CJS_Object*)JS_GetPrivate(m_isolate, pObj);
+}
+
+CJS_Value::operator v8::Handle<v8::Object>() const
+{
+ return JS_ToObject(m_pValue);
+}
+
+CJS_Value::operator CFX_WideString() const
+{
+ return JS_ToString(m_pValue);
+}
+
+CJS_Value::operator CFX_ByteString() const
+{
+ return CFX_ByteString::FromUnicode(operator CFX_WideString());
+}
+
+v8::Handle<v8::Value> CJS_Value::ToJSValue()
+{
+ return m_pValue;
+}
+
+
+CJS_Value::operator v8::Handle<v8::Array>() const
+{
+ if (IsArrayObject())
+ return v8::Handle<v8::Array>::Cast(JS_ToObject(m_pValue));
+ return v8::Handle<v8::Array>();
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+void CJS_Value::operator =(int iValue)
+{
+ m_pValue = JS_NewNumber(m_isolate, iValue);
+
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator =(bool bValue)
+{
+ m_pValue = JS_NewBoolean(m_isolate, bValue);
+
+ m_eType = VT_boolean;
+}
+
+void CJS_Value::operator =(double dValue)
+{
+ m_pValue = JS_NewNumber(m_isolate,dValue);
+
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator = (float fValue)
+{
+ m_pValue = JS_NewNumber(m_isolate,fValue);
+ m_eType = VT_number;
+}
+
+void CJS_Value::operator =(v8::Handle<v8::Object> pObj)
+{
+
+ m_pValue = JS_NewObject(m_isolate,pObj);
+
+ m_eType = VT_fxobject;
+}
+
+void CJS_Value::operator =(CJS_Object * pObj)
+{
+ if (pObj)
+ operator = ((JSFXObject)*pObj);
+}
+
+void CJS_Value::operator =(FX_LPCWSTR pWstr)
+{
+ m_pValue = JS_NewString(m_isolate,(wchar_t *)pWstr);
+
+ m_eType = VT_string;
+}
+
+void CJS_Value::SetNull()
+{
+ m_pValue = JS_NewNull();
+
+ m_eType = VT_null;
+}
+
+void CJS_Value::operator = (FX_LPCSTR pStr)
+{
+ operator = (CFX_WideString::FromLocal(pStr));
+}
+
+void CJS_Value::operator = (CJS_Array & array)
+{
+ m_pValue = JS_NewObject2(m_isolate,(v8::Handle<v8::Array>)array);
+
+ m_eType = VT_object;
+}
+
+void CJS_Value::operator = (CJS_Date & date)
+{
+ m_pValue = JS_NewDate(m_isolate, (double)date);
+
+ m_eType = VT_date;
+}
+
+void CJS_Value::operator = (CJS_Value value)
+{
+ m_pValue = value.ToJSValue();
+
+ m_eType = value.m_eType;
+}
+
+/* ---------------------------------------------------------------------------------------- */
+
+FXJSVALUETYPE CJS_Value::GetType() const
+{
+ if(m_pValue.IsEmpty()) return VT_unknown;
+ if(m_pValue->IsString()) return VT_string;
+ if(m_pValue->IsNumber()) return VT_number;
+ if(m_pValue->IsBoolean()) return VT_boolean;
+ if(m_pValue->IsDate()) return VT_date;
+ if(m_pValue->IsObject()) return VT_object;
+ if(m_pValue->IsNull()) return VT_null;
+ if(m_pValue->IsUndefined()) return VT_undefined;
+ return VT_unknown;
+}
+
+FX_BOOL CJS_Value::IsArrayObject() const
+{
+ if(m_pValue.IsEmpty()) return FALSE;
+ return m_pValue->IsArray();
+}
+
+FX_BOOL CJS_Value::IsDateObject() const
+{
+ if(m_pValue.IsEmpty()) return FALSE;
+ return m_pValue->IsDate();
+}
+
+//CJS_Value::operator CJS_Array()
+FX_BOOL CJS_Value::ConvertToArray(CJS_Array &array) const
+{
+ if (IsArrayObject())
+ {
+ array.Attach(JS_ToArray(m_pValue));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CJS_Value::ConvertToDate(CJS_Date &date) const
+{
+// if (GetType() == VT_date)
+// {
+// date = (double)(*this);
+// return TRUE;
+// }
+
+ if (IsDateObject())
+ {
+ date.Attach(m_pValue);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* ---------------------------- CJS_PropValue ---------------------------- */
+
+CJS_PropValue::CJS_PropValue(const CJS_Value &value) :
+ CJS_Value(value),
+ m_bIsSetting(0)
+{
+}
+
+CJS_PropValue::CJS_PropValue(v8::Isolate* isolate) : CJS_Value(isolate),
+ m_bIsSetting(0)
+{
+}
+
+CJS_PropValue::~CJS_PropValue()
+{
+}
+
+FX_BOOL CJS_PropValue::IsSetting()
+{
+ return m_bIsSetting;
+}
+
+FX_BOOL CJS_PropValue::IsGetting()
+{
+ return !m_bIsSetting;
+}
+
+void CJS_PropValue::operator <<(int iValue)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =(iValue);
+}
+
+void CJS_PropValue::operator >>(int & iValue) const
+{
+ ASSERT(m_bIsSetting);
+ iValue = CJS_Value::operator int();
+}
+
+
+void CJS_PropValue::operator <<(bool bValue)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =(bValue);
+}
+
+void CJS_PropValue::operator >>(bool &bValue) const
+{
+ ASSERT(m_bIsSetting);
+ bValue = CJS_Value::operator bool();
+
+}
+
+void CJS_PropValue::operator <<(double dValue)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =(dValue);
+}
+
+void CJS_PropValue::operator >>(double &dValue) const
+{
+ ASSERT(m_bIsSetting);
+ dValue = CJS_Value::operator double();
+}
+
+void CJS_PropValue::operator <<(CJS_Object *pObj)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator = (pObj);
+}
+
+void CJS_PropValue::operator >>(CJS_Object *&ppObj) const
+{
+ ASSERT(m_bIsSetting);
+ ppObj = CJS_Value::operator CJS_Object *();
+}
+
+void CJS_PropValue::operator<<(JSFXObject pObj)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator = (pObj);
+}
+
+void CJS_PropValue::operator>>(JSFXObject &ppObj) const
+{
+ ASSERT(m_bIsSetting);
+ ppObj = CJS_Value::operator JSFXObject ();
+}
+
+
+void CJS_PropValue::StartSetting()
+{
+ m_bIsSetting = 1;
+}
+
+void CJS_PropValue::StartGetting()
+{
+ m_bIsSetting = 0;
+}
+void CJS_PropValue::operator <<(CFX_ByteString string)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =((FX_LPCSTR)string);
+}
+
+void CJS_PropValue::operator >>(CFX_ByteString &string) const
+{
+ ASSERT(m_bIsSetting);
+ string = CJS_Value::operator CFX_ByteString();
+}
+
+void CJS_PropValue::operator <<(FX_LPCWSTR c_string)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator =(c_string);
+}
+
+void CJS_PropValue::operator >>(CFX_WideString &wide_string) const
+{
+ ASSERT(m_bIsSetting);
+ wide_string = CJS_Value::operator CFX_WideString();
+}
+
+void CJS_PropValue::operator <<(CFX_WideString wide_string)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator = (wide_string);
+}
+
+void CJS_PropValue::operator >>(CJS_Array &array) const
+{
+ ASSERT(m_bIsSetting);
+ ConvertToArray(array);
+}
+
+void CJS_PropValue::operator <<(CJS_Array &array)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator=(array);
+}
+
+void CJS_PropValue::operator>>(CJS_Date &date) const
+{
+ ASSERT(m_bIsSetting);
+ ConvertToDate(date);
+}
+
+void CJS_PropValue::operator<<(CJS_Date &date)
+{
+ ASSERT(!m_bIsSetting);
+ CJS_Value::operator=(date);
+}
+
+CJS_PropValue::operator v8::Handle<v8::Value>() const
+{
+ return m_pValue;
+}
+
+/* ======================================== CJS_Array ========================================= */
+CJS_Array::CJS_Array(v8::Isolate* isolate):m_isolate(isolate)
+{
+}
+
+CJS_Array::~CJS_Array()
+{
+}
+
+void CJS_Array::Attach(v8::Handle<v8::Array> pArray)
+{
+ m_pArray = pArray;
+}
+
+FX_BOOL CJS_Array::IsAttached()
+{
+ return FALSE;
+}
+
+void CJS_Array::GetElement(unsigned index,CJS_Value &value)
+{
+ if (m_pArray.IsEmpty())
+ return;
+ v8::Handle<v8::Value> p = JS_GetArrayElemnet(m_pArray,index);
+ value.Attach(p,VT_object);
+}
+
+void CJS_Array::SetElement(unsigned index,CJS_Value value)
+{
+ if (m_pArray.IsEmpty())
+ m_pArray = JS_NewArray(m_isolate);
+
+ JS_PutArrayElement(m_pArray,index,value.ToJSValue(),value.GetType());
+}
+
+int CJS_Array::GetLength()
+{
+ if (m_pArray.IsEmpty())
+ return 0;
+ return JS_GetArrayLength(m_pArray);
+}
+
+CJS_Array:: operator v8::Handle<v8::Array>()
+{
+ if (m_pArray.IsEmpty())
+ m_pArray = JS_NewArray(m_isolate);
+
+ return m_pArray;
+}
+
+/* ======================================== CJS_Date ========================================= */
+
+CJS_Date::CJS_Date(v8::Isolate* isolate) :m_isolate(isolate)
+{
+}
+
+CJS_Date::CJS_Date(v8::Isolate* isolate,double dMsec_time)
+{
+ m_isolate = isolate;
+ m_pDate = JS_NewDate(isolate,dMsec_time);
+}
+
+CJS_Date::CJS_Date(v8::Isolate* isolate,int year, int mon, int day,int hour, int min, int sec)
+{
+ m_isolate = isolate;
+ m_pDate = JS_NewDate(isolate,MakeDate(year,mon,day,hour,min,sec,0));
+}
+
+double CJS_Date::MakeDate(int year, int mon, int day,int hour, int min, int sec,int ms)
+{
+ return JS_MakeDate(JS_MakeDay(year,mon,day), JS_MakeTime(hour,min,sec,ms));
+}
+
+CJS_Date::~CJS_Date()
+{
+}
+
+FX_BOOL CJS_Date::IsValidDate()
+{
+ if(m_pDate.IsEmpty()) return FALSE;
+ return !JS_PortIsNan(JS_ToNumber(m_pDate));
+}
+
+void CJS_Date::Attach(v8::Handle<v8::Value> pDate)
+{
+ m_pDate = pDate;
+}
+
+int CJS_Date::GetYear()
+{
+ if (IsValidDate())
+ return JS_GetYearFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetYear(int iYear)
+{
+ double date = MakeDate(iYear,GetMonth(),GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetMonth()
+{
+ if (IsValidDate())
+ return JS_GetMonthFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetMonth(int iMonth)
+{
+
+ double date = MakeDate(GetYear(),iMonth,GetDay(),GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate, JS_NewDate(m_isolate,date));
+
+}
+
+int CJS_Date::GetDay()
+{
+ if (IsValidDate())
+ return JS_GetDayFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetDay(int iDay)
+{
+
+ double date = MakeDate(GetYear(),GetMonth(),iDay,GetHours(),GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+
+}
+
+int CJS_Date::GetHours()
+{
+ if (IsValidDate())
+ return JS_GetHourFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetHours(int iHours)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),iHours,GetMinutes(),GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetMinutes()
+{
+ if (IsValidDate())
+ return JS_GetMinFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetMinutes(int minutes)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),minutes,GetSeconds(),0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+int CJS_Date::GetSeconds()
+{
+ if (IsValidDate())
+ return JS_GetSecFromTime(JS_LocalTime(JS_ToNumber(m_pDate)));
+
+ return 0;
+}
+
+void CJS_Date::SetSeconds(int seconds)
+{
+ double date = MakeDate(GetYear(),GetMonth(),GetDay(),GetHours(),GetMinutes(),seconds,0);
+ JS_ValueCopy(m_pDate,JS_NewDate(m_isolate,date));
+}
+
+CJS_Date::operator v8::Handle<v8::Value>()
+{
+ return m_pDate;
+}
+
+CJS_Date::operator double() const
+{
+ if(m_pDate.IsEmpty())
+ return 0.0;
+ return JS_ToNumber(m_pDate);
+}
+
+CFX_WideString CJS_Date::ToString() const
+{
+ if(m_pDate.IsEmpty())
+ return L"";
+ return JS_ToString(m_pDate);
+}
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp
new file mode 100644
index 0000000000..c39c8a00dd
--- /dev/null
+++ b/fpdfsdk/src/javascript/PublicMethods.cpp
@@ -0,0 +1,2335 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/Field.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+
+/* -------------------------------- CJS_PublicMethods -------------------------------- */
+
+#define DOUBLE_CORRECT 0.000000000000001
+
+BEGIN_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Format,6)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFNumber_Keystroke,6)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Format,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFPercent_Keystroke,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_FormatEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFDate_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_FormatEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFTime_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Format,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_Keystroke,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSpecial_KeystrokeEx,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple,3)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFMakeNumber,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFSimple_Calculate,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFRange_Validate,4)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFMergeChange,1)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFParseDateEx,2)
+ JS_STATIC_GLOBAL_FUN_ENTRY(AFExtractNums,1)
+END_JS_STATIC_GLOBAL_FUN()
+
+IMPLEMENT_JS_STATIC_GLOBAL_FUN(CJS_PublicMethods)
+
+struct stru_TbConvert
+{
+ FX_LPCSTR lpszJSMark;
+ FX_LPCSTR lpszCppMark;
+};
+
+static const stru_TbConvert fcTable[] = {"mmmm","%B",
+ "mmm", "%b",
+ "mm", "%m",
+ //"m"
+ "dddd","%A",
+ "ddd", "%a",
+ "dd", "%d",
+ //"d", "%w",
+ "yyyy","%Y",
+ "yy", "%y",
+ "HH", "%H",
+ //"H"
+ "hh", "%I",
+ //"h"
+ "MM", "%M",
+ //"M"
+ "ss", "%S",
+ //"s
+ "tt", "%p"
+ //"t"
+};
+
+static FX_LPCWSTR months[] =
+{
+ (FX_LPCWSTR)L"Jan", (FX_LPCWSTR)L"Feb", (FX_LPCWSTR)L"Mar", (FX_LPCWSTR)L"Apr", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"Jun", (FX_LPCWSTR)L"Jul", (FX_LPCWSTR)L"Aug", (FX_LPCWSTR)L"Sep", (FX_LPCWSTR)L"Oct", (FX_LPCWSTR)L"Nov", (FX_LPCWSTR)L"Dec"
+};
+
+static FX_LPCWSTR fullmonths[] =
+{
+ (FX_LPCWSTR)L"January", (FX_LPCWSTR)L"February", (FX_LPCWSTR)L"March", (FX_LPCWSTR)L"April", (FX_LPCWSTR)L"May", (FX_LPCWSTR)L"June", (FX_LPCWSTR)L"July", (FX_LPCWSTR)L"August", (FX_LPCWSTR)L"September", (FX_LPCWSTR)L"October", (FX_LPCWSTR)L"November", (FX_LPCWSTR)L"December"
+};
+
+FX_BOOL CJS_PublicMethods::IsNumber(FX_LPCWSTR string)
+{
+ CFX_WideString sTrim = StrTrim(string);
+ FX_LPCWSTR pTrim = sTrim;
+ FX_LPCWSTR p = pTrim;
+
+
+ FX_BOOL bDot = FALSE;
+ FX_BOOL bKXJS = FALSE;
+
+ wchar_t c;
+ while ((c = *p))
+ {
+ if (c == '.' || c == ',')
+ {
+ if (bDot) return FALSE;
+ bDot = TRUE;
+ }
+ else if (c == '-' || c == '+')
+ {
+ if (p != pTrim)
+ return FALSE;
+ }
+ else if (c == 'e' || c == 'E')
+ {
+ if (bKXJS) return FALSE;
+
+ p++;
+ c = *p;
+ if (c == '+' || c == '-')
+ {
+ bKXJS = TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ else if (!IsDigit(c))
+ {
+ return FALSE;
+ }
+ p++;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::IsDigit(wchar_t ch)
+{
+ return (ch >= L'0' && ch <= L'9');
+}
+
+FX_BOOL CJS_PublicMethods::IsDigit(char ch)
+{
+ return (ch >= '0' && ch <= '9');
+}
+
+FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch)
+{
+ return ((ch >= L'a' && ch <= L'z') || (ch >= L'A' && ch <= L'Z'));
+}
+
+FX_BOOL CJS_PublicMethods::IsAlphaNumeric(wchar_t ch)
+{
+ return (IsDigit(ch) || IsAlphabetic(ch));
+}
+
+FX_BOOL CJS_PublicMethods::maskSatisfied(wchar_t c_Change,wchar_t c_Mask)
+{
+ switch (c_Mask)
+ {
+ case L'9':
+ return IsDigit(c_Change);
+ case L'A':
+ return IsAlphabetic(c_Change);
+ case L'O':
+ return IsAlphaNumeric(c_Change);
+ case L'X':
+ return TRUE;
+ default:
+ return (c_Change == c_Mask);
+ }
+}
+
+FX_BOOL CJS_PublicMethods::isReservedMaskChar(wchar_t ch)
+{
+ return ch == L'9' || ch == L'A' || ch == L'O' || ch == L'X';
+}
+
+double CJS_PublicMethods::AF_Simple(FX_LPCWSTR sFuction, double dValue1, double dValue2)
+{
+ if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"AVG") == 0 || FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"SUM") == 0)
+ {
+ return dValue1 + dValue2;
+ }
+ else if (FXSYS_wcsicmp(sFuction, (FX_LPCWSTR)L"PRD") == 0)
+ {
+ return dValue1 * dValue2;
+ }
+ else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MIN") == 0)
+ {
+ return FX_MIN(dValue1, dValue2);
+ }
+ else if (FXSYS_wcsicmp(sFuction,(FX_LPCWSTR)L"MAX") == 0)
+ {
+ return FX_MAX(dValue1, dValue2);
+ }
+
+ return dValue1;
+}
+
+CFX_WideString CJS_PublicMethods::StrLTrim(FX_LPCWSTR pStr)
+{
+ while (*pStr && *pStr == L' ') pStr++;
+
+ return pStr;
+}
+
+CFX_WideString CJS_PublicMethods::StrRTrim(FX_LPCWSTR pStr)
+{
+ FX_LPCWSTR p = pStr;
+
+ while (*p) p++;
+ p--;
+ if (p >= pStr)
+ {
+ while (*p && *p == L' ') p--;
+ p++;
+ return CFX_WideString(pStr,p-pStr);
+ }
+ return L"";
+}
+
+CFX_WideString CJS_PublicMethods::StrTrim(FX_LPCWSTR pStr)
+{
+ return StrRTrim(StrLTrim(pStr));
+}
+
+CFX_ByteString CJS_PublicMethods::StrLTrim(FX_LPCSTR pStr)
+{
+ while (*pStr && *pStr == ' ') pStr++;
+
+ return pStr;
+}
+
+CFX_ByteString CJS_PublicMethods::StrRTrim(FX_LPCSTR pStr)
+{
+ FX_LPCSTR p = pStr;
+
+ while (*p) p++;
+ p--;
+ if (p >= pStr)
+ {
+ while (*p && *p == ' ') p--;
+ p++;
+ return CFX_ByteString(pStr,p-pStr);
+ }
+ return "";
+}
+
+CFX_ByteString CJS_PublicMethods::StrTrim(FX_LPCSTR pStr)
+{
+ return StrRTrim(StrLTrim(pStr));
+}
+
+double CJS_PublicMethods::ParseNumber(FX_LPCWSTR swSource, FX_BOOL& bAllDigits, FX_BOOL& bDot, FX_BOOL& bSign, FX_BOOL& bKXJS)
+{
+ bDot = FALSE;
+ bSign = FALSE;
+ bKXJS = FALSE;
+
+ FX_BOOL bDigitExist = FALSE;
+
+ FX_LPCWSTR p = swSource;
+ wchar_t c;
+
+ FX_LPCWSTR pStart = NULL;
+ FX_LPCWSTR pEnd = NULL;
+
+ while ((c = *p))
+ {
+ if (!pStart && c != L' ')
+ {
+ pStart = p;
+ }
+
+ pEnd = p;
+ p++;
+ }
+
+ if (!pStart)
+ {
+ bAllDigits = FALSE;
+ return 0;
+ }
+
+ while (pEnd != pStart)
+ {
+ if (*pEnd == L' ')
+ pEnd --;
+ else
+ break;
+ }
+
+ double dRet = 0;
+ p = pStart;
+ bAllDigits = TRUE;
+ CFX_WideString swDigits;
+
+ while (p <= pEnd)
+ {
+ c = *p;
+
+ if (IsDigit(c))
+ {
+ swDigits += c;
+ bDigitExist = TRUE;
+ }
+ else
+ {
+ switch (c)
+ {
+ case L' ':
+ bAllDigits = FALSE;
+ break;
+ case L'.':
+ case L',':
+ if (!bDot)
+ {
+ if (bDigitExist)
+ {
+ swDigits += L'.';
+ }
+ else
+ {
+ swDigits += L'0';
+ swDigits += L'.';
+ bDigitExist = TRUE;
+ }
+
+ bDot = TRUE;
+ break;
+ }
+ case 'e':
+ case 'E':
+ if (!bKXJS)
+ {
+ p++;
+ c = *p;
+ if (c == '+' || c == '-')
+ {
+ bKXJS = TRUE;
+ swDigits += 'e';
+ swDigits += c;
+ }
+ break;
+ }
+ case L'-':
+ if (!bDigitExist && !bSign)
+ {
+ swDigits += c;
+ bSign = TRUE;
+ break;
+ }
+ default:
+ bAllDigits = FALSE;
+
+ if (p != pStart && !bDot && bDigitExist)
+ {
+ swDigits += L'.';
+ bDot = TRUE;
+ }
+ else
+ {
+ bDot = FALSE;
+ bDigitExist = FALSE;
+ swDigits = L"";
+ }
+ break;
+ }
+ }
+
+ p++;
+ }
+
+ if (swDigits.GetLength() > 0 && swDigits.GetLength() < 17)
+ {
+ CFX_ByteString sDigits = swDigits.UTF8Encode();
+
+ if (bKXJS)
+ {
+ dRet = atof(sDigits);
+ }
+ else
+ {
+ if (bDot)
+ {
+ char* pStopString;
+ dRet = ::strtod(sDigits, &pStopString);
+ }
+ else
+ {
+ dRet = atol(sDigits);
+ }
+ }
+
+ }
+
+ return dRet;
+}
+
+double CJS_PublicMethods::ParseStringToNumber(FX_LPCWSTR swSource)
+{
+ FX_BOOL bAllDigits = FALSE;
+ FX_BOOL bDot = FALSE;
+ FX_BOOL bSign = FALSE;
+ FX_BOOL bKXJS = FALSE;
+
+ return ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+}
+
+FX_BOOL CJS_PublicMethods::ConvertStringToNumber(FX_LPCWSTR swSource, double & dRet, FX_BOOL & bDot)
+{
+ FX_BOOL bAllDigits = FALSE;
+ FX_BOOL bSign = FALSE;
+ FX_BOOL bKXJS = FALSE;
+
+ dRet = ParseNumber(swSource, bAllDigits, bDot, bSign, bKXJS);
+
+ return bAllDigits;
+}
+
+CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(v8::Isolate* isolate, CJS_Value val)
+{
+ CJS_Array StrArray(isolate);
+ if(val.IsArrayObject())
+ {
+ val.ConvertToArray(StrArray);
+ return StrArray;
+ }
+ CFX_WideString wsStr = val.operator CFX_WideString();
+ CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
+ const char * p = (const char *)t;
+
+
+ int ch = ',' ;
+ int nIndex = 0;
+
+ while (*p)
+ {
+ const char * pTemp = strchr(p, ch);
+ if (pTemp == NULL)
+ {
+ StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(p)));
+ break;
+ }
+ else
+ {
+ char * pSub = new char[pTemp - p + 1];
+ strncpy(pSub, p, pTemp - p);
+ *(pSub + (pTemp - p)) = '\0';
+
+ StrArray.SetElement(nIndex, CJS_Value(isolate,(FX_LPCSTR)StrTrim(pSub)));
+ delete []pSub;
+
+ nIndex ++;
+ p = ++pTemp;
+ }
+
+ }
+ return StrArray;
+}
+
+int CJS_PublicMethods::ParseStringInteger(const CFX_WideString& string,int nStart,int& nSkip, int nMaxStep)
+{
+ int nRet = 0;
+ nSkip = 0;
+ for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+ {
+ if (i-nStart > 10)
+ break;
+
+ FX_WCHAR c = string.GetAt(i);
+ if (IsDigit((wchar_t)c))
+ {
+ nRet = nRet * 10 + (c - '0');
+ nSkip = i - nStart + 1;
+ if (nSkip >= nMaxStep)
+ break;
+ }
+ else
+ break;
+ }
+
+ return nRet;
+}
+
+CFX_WideString CJS_PublicMethods::ParseStringString(const CFX_WideString& string, int nStart, int& nSkip)
+{
+ CFX_WideString swRet;
+ nSkip = 0;
+ for (int i=nStart, sz=string.GetLength(); i < sz; i++)
+ {
+ FX_WCHAR c = string.GetAt(i);
+ if ((c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z'))
+ {
+ swRet += c;
+ nSkip = i - nStart + 1;
+ }
+ else
+ break;
+ }
+
+ return swRet;
+}
+
+double CJS_PublicMethods::ParseNormalDate(const CFX_WideString & value, FX_BOOL& bWrongFormat)
+{
+ double dt = JS_GetDateTime();
+
+ int nYear = JS_GetYearFromTime(dt);
+ int nMonth = JS_GetMonthFromTime(dt) + 1;
+ int nDay = JS_GetDayFromTime(dt);
+ int nHour = JS_GetHourFromTime(dt);
+ int nMin = JS_GetMinFromTime(dt);
+ int nSec = JS_GetSecFromTime(dt);
+
+ int number[3];
+
+ int nSkip = 0;
+ int nLen = value.GetLength();
+ int nIndex = 0;
+ int i = 0;
+ while (i < nLen)
+ {
+ if (nIndex > 2) break;
+
+ FX_WCHAR c = value.GetAt(i);
+ if (IsDigit((wchar_t)c))
+ {
+ number[nIndex++] = ParseStringInteger(value, i, nSkip, 4);
+ i += nSkip;
+ }
+ else
+ {
+ i ++;
+ }
+ }
+
+ if (nIndex == 2)
+ {
+ // case2: month/day
+ // case3: day/month
+ if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31))
+ {
+ nMonth = number[0];
+ nDay = number[1];
+ }
+ else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12))
+ {
+ nDay = number[0];
+ nMonth = number[1];
+ }
+
+ bWrongFormat = FALSE;
+ }
+ else if (nIndex == 3)
+ {
+ // case1: year/month/day
+ // case2: month/day/year
+ // case3: day/month/year
+
+ if (number[0] > 12 && (number[1] >= 1 && number[1] <= 12) && (number[2] >= 1 && number[2] <= 31))
+ {
+ nYear = number[0];
+ nMonth = number[1];
+ nDay = number[2];
+ }
+ else if ((number[0] >= 1 && number[0] <= 12) && (number[1] >= 1 && number[1] <= 31) && number[2] > 31)
+ {
+ nMonth = number[0];
+ nDay = number[1];
+ nYear = number[2];
+ }
+ else if ((number[0] >= 1 && number[0] <= 31) && (number[1] >= 1 && number[1] <= 12) && number[2] > 31)
+ {
+ nDay = number[0];
+ nMonth = number[1];
+ nYear = number[2];
+ }
+
+ bWrongFormat = FALSE;
+ }
+ else
+ {
+ bWrongFormat = TRUE;
+ return dt;
+ }
+
+ CFX_WideString swTemp;
+ swTemp.Format((FX_LPCWSTR)L"%d/%d/%d %d:%d:%d",nMonth,nDay,nYear,nHour,nMin,nSec);
+ return JS_DateParse(swTemp);
+}
+
+double CJS_PublicMethods::MakeRegularDate(const CFX_WideString & value, const CFX_WideString & format, FX_BOOL& bWrongFormat)
+{
+ double dt = JS_GetDateTime();
+
+ if (format.IsEmpty() || value.IsEmpty())
+ return dt;
+
+ int nYear = JS_GetYearFromTime(dt);
+ int nMonth = JS_GetMonthFromTime(dt) + 1;
+ int nDay = JS_GetDayFromTime(dt);
+ int nHour = JS_GetHourFromTime(dt);
+ int nMin = JS_GetMinFromTime(dt);
+ int nSec = JS_GetSecFromTime(dt);
+
+ int nYearSub = 99; //nYear - 2000;
+
+ FX_BOOL bPm = FALSE;
+ FX_BOOL bExit = FALSE;
+ bWrongFormat = FALSE;
+
+ int i=0;
+ int j=0;
+
+ while (i < format.GetLength())
+ {
+ if (bExit) break;
+
+ FX_WCHAR c = format.GetAt(i);
+ switch (c)
+ {
+ case ':':
+ case '.':
+ case '-':
+ case '\\':
+ case '/':
+ i++;
+ j++;
+ break;
+
+ case 'y':
+ case 'm':
+ case 'd':
+ case 'H':
+ case 'h':
+ case 'M':
+ case 's':
+ case 't':
+ {
+ int oldj = j;
+ int nSkip = 0;
+
+ if (format.GetAt(i+1) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ i++;
+ j++;
+ break;
+ case 'm':
+ nMonth = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 'd':
+ nDay = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 'H':
+ nHour = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 'h':
+ nHour = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 'M':
+ nMin = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 's':
+ nSec = ParseStringInteger(value, j, nSkip, 2);
+ i++;
+ j += nSkip;
+ break;
+ case 't':
+ bPm = value.GetAt(i) == 'p';
+ i++;
+ j++;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ nYear = ParseStringInteger(value, j, nSkip, 4);
+ i += 2;
+ j += nSkip;
+ break;
+ case 'm':
+ nMonth = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 'd':
+ nDay = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 'H':
+ nHour = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 'h':
+ nHour = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 'M':
+ nMin = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 's':
+ nSec = ParseStringInteger(value, j, nSkip, 2);
+ i += 2;
+ j += nSkip;
+ break;
+ case 't':
+ bPm = (value.GetAt(j) == 'p' && value.GetAt(j+1) == 'm');
+ i += 2;
+ j += 2;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) != c)
+ {
+ switch (c)
+ {
+ case 'm':
+ {
+ CFX_WideString sMonth = ParseStringString(value, j, nSkip);
+ FX_BOOL bFind = FALSE;
+ for (int m = 0; m < 12; m++)
+ {
+ if (sMonth.CompareNoCase(months[m]) == 0)
+ {
+ nMonth = m + 1;
+ i+=3;
+ j+=nSkip;
+ bFind = TRUE;
+ break;
+ }
+ }
+
+ if (!bFind)
+ {
+ nMonth = ParseStringInteger(value, j, nSkip, 3);
+ i+=3;
+ j += nSkip;
+ }
+ }
+ break;
+ case 'y':
+ break;
+ default:
+ i+=3;
+ j+=3;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c)
+ {
+ switch (c)
+ {
+
+
+ case 'y':
+ nYear = ParseStringInteger(value, j, nSkip, 4);
+ j += nSkip;
+ i += 4;
+ break;
+ case 'm':
+ {
+ FX_BOOL bFind = FALSE;
+
+ CFX_WideString sMonth = ParseStringString(value, j, nSkip);
+ sMonth.MakeLower();
+
+ for (int m = 0; m < 12; m++)
+ {
+ CFX_WideString sFullMonths = fullmonths[m];
+ sFullMonths.MakeLower();
+
+ if (sFullMonths.Find(sMonth, 0) != -1)
+ {
+ nMonth = m + 1;
+ i += 4;
+ j += nSkip;
+ bFind = TRUE;
+ break;
+ }
+ }
+
+ if (!bFind)
+ {
+ nMonth = ParseStringInteger(value, j, nSkip, 4);
+ i+=4;
+ j += nSkip;
+ }
+ }
+ break;
+ default:
+ i += 4;
+ j += 4;
+ break;
+ }
+ }
+ else
+ {
+ if (format.GetAt(i) != value.GetAt(j))
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+ i++;
+ j++;
+ }
+
+ if (oldj == j)
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+ }
+
+ break;
+ default:
+ if (value.GetLength() <= j)
+ {
+ bExit = TRUE;
+ }
+ else if (format.GetAt(i) != value.GetAt(j))
+ {
+ bWrongFormat = TRUE;
+ bExit = TRUE;
+ }
+
+ i++;
+ j++;
+ break;
+ }
+ }
+
+ if (bPm) nHour += 12;
+
+ if (nYear >= 0 && nYear <= nYearSub)
+ nYear += 2000;
+
+ if (nMonth < 1 || nMonth > 12)
+ bWrongFormat = TRUE;
+
+ if (nDay < 1 || nDay > 31)
+ bWrongFormat = TRUE;
+
+ if (nHour < 0 || nHour > 24)
+ bWrongFormat = TRUE;
+
+ if (nMin < 0 || nMin > 60)
+ bWrongFormat = TRUE;
+
+ if (nSec < 0 || nSec > 60)
+ bWrongFormat = TRUE;
+
+ double dRet = 0;
+
+ if (bWrongFormat)
+ {
+ dRet = ParseNormalDate(value, bWrongFormat);
+ }
+ else
+ {
+ dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
+
+ if (JS_PortIsNan(dRet))
+ {
+ dRet = JS_DateParse(value);
+ }
+ }
+
+ if (JS_PortIsNan(dRet))
+ {
+ dRet = ParseNormalDate(value, bWrongFormat);
+ }
+
+ return dRet;
+
+}
+
+CFX_WideString CJS_PublicMethods::MakeFormatDate(double dDate, const CFX_WideString & format)
+{
+ CFX_WideString sRet = L"",sPart = L"";
+
+ int nYear = JS_GetYearFromTime(dDate);
+ int nMonth = JS_GetMonthFromTime(dDate) + 1;
+ int nDay = JS_GetDayFromTime(dDate);
+ int nHour = JS_GetHourFromTime(dDate);
+ int nMin = JS_GetMinFromTime(dDate);
+ int nSec = JS_GetSecFromTime(dDate);
+
+ int i = 0;
+ FX_WCHAR c;
+ while (i < format.GetLength())
+ {
+ c = format.GetAt(i);
+ sPart = L"";
+ switch (c)
+ {
+ case 'y':
+ case 'm':
+ case 'd':
+ case 'H':
+ case 'h':
+ case 'M':
+ case 's':
+ case 't':
+ if (format.GetAt(i+1) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart += c;
+ break;
+ case 'm':
+ sPart.Format((FX_LPCWSTR)L"%d",nMonth);
+ break;
+ case 'd':
+ sPart.Format((FX_LPCWSTR)L"%d",nDay);
+ break;
+ case 'H':
+ sPart.Format((FX_LPCWSTR)L"%d",nHour);
+ break;
+ case 'h':
+ sPart.Format((FX_LPCWSTR)L"%d",nHour>12?nHour - 12:nHour);
+ break;
+ case 'M':
+ sPart.Format((FX_LPCWSTR)L"%d",nMin);
+ break;
+ case 's':
+ sPart.Format((FX_LPCWSTR)L"%d",nSec);
+ break;
+ case 't':
+ sPart += nHour>12?'p':'a';
+ break;
+ }
+ i++;
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart.Format((FX_LPCWSTR)L"%02d",nYear - (nYear / 100) * 100);
+ break;
+ case 'm':
+ sPart.Format((FX_LPCWSTR)L"%02d",nMonth);
+ break;
+ case 'd':
+ sPart.Format((FX_LPCWSTR)L"%02d",nDay);
+ break;
+ case 'H':
+ sPart.Format((FX_LPCWSTR)L"%02d",nHour);
+ break;
+ case 'h':
+ sPart.Format((FX_LPCWSTR)L"%02d",nHour>12?nHour - 12:nHour);
+ break;
+ case 'M':
+ sPart.Format((FX_LPCWSTR)L"%02d",nMin);
+ break;
+ case 's':
+ sPart.Format((FX_LPCWSTR)L"%02d",nSec);
+ break;
+ case 't':
+ sPart = nHour>12? (FX_LPCWSTR)L"pm": (FX_LPCWSTR)L"am";
+ break;
+ }
+ i+=2;
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) != c)
+ {
+ switch (c)
+ {
+ case 'm':
+ i+=3;
+ if (nMonth > 0&&nMonth <= 12)
+ sPart += months[nMonth - 1];
+ break;
+ default:
+ i+=3;
+ sPart += c;
+ sPart += c;
+ sPart += c;
+ break;
+ }
+ }
+ else if (format.GetAt(i+1) == c && format.GetAt(i+2) == c && format.GetAt(i+3) == c && format.GetAt(i+4) != c)
+ {
+ switch (c)
+ {
+ case 'y':
+ sPart.Format((FX_LPCWSTR)L"%04d",nYear);
+ i += 4;
+ break;
+ case 'm':
+ i+=4;
+ if (nMonth > 0&&nMonth <= 12)
+ sPart += fullmonths[nMonth - 1];
+ break;
+ default:
+ i += 4;
+ sPart += c;
+ sPart += c;
+ sPart += c;
+ sPart += c;
+ break;
+ }
+ }
+ else
+ {
+ i++;
+ sPart += c;
+ }
+ break;
+ default:
+ i++;
+ sPart += c;
+ break;
+ }
+
+ sRet += sPart;
+ }
+
+ return sRet;
+}
+
+/* -------------------------------------------------------------------------- */
+
+//function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
+FX_BOOL CJS_PublicMethods::AFNumber_Format(OBJ_METHOD_PARAMS)
+{
+#if _FX_OS_ != _FX_ANDROID_
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 6)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& Value = pEvent->Value();
+ CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
+
+ if (strValue.IsEmpty()) return TRUE;
+
+ int iDec = params[0];
+ int iSepStyle = params[1];
+ int iNegStyle = params[2];
+ int icurrStyle = params[3]; //it's no use!
+ std::wstring wstrCurrency(params[4].operator CFX_WideString());
+ FX_BOOL bCurrencyPrepend = params[5];
+
+ if (iDec < 0) iDec = -iDec;
+
+ if (iSepStyle < 0 || iSepStyle > 3)
+ iSepStyle = 0;
+
+ if (iNegStyle < 0 || iNegStyle > 3)
+ iNegStyle = 0;
+
+
+ //////////////////////////////////////////////////////
+ //for processing decimal places
+ strValue.Replace(",", ".");
+ double dValue = atof(strValue);
+ if (iDec > 0)
+ dValue += DOUBLE_CORRECT;//
+
+ int iDec2;
+ FX_BOOL bNagative = FALSE;
+
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ if (strValue.IsEmpty())
+ {
+ dValue = 0;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ if (strValue.IsEmpty())
+ {
+ strValue = "0";
+ iDec2 = 1;
+ }
+
+ }
+
+ if (iDec2 < 0)
+ {
+ for (int iNum = 0;iNum < abs(iDec2);iNum++)
+ {
+ strValue = "0" + strValue;
+ }
+ iDec2 = 0;
+
+ }
+ int iMax = strValue.GetLength();
+ if (iDec2 > iMax)
+ {
+ for (int iNum = 0;iNum <= iDec2 - iMax ;iNum++)
+ {
+ strValue += "0";
+ }
+ iMax = iDec2+1;
+ }
+ ///////////////////////////////////////////////////////
+ //for processing seperator style
+ if (iDec2 < iMax)
+ {
+ if (iSepStyle == 0 || iSepStyle == 1)
+ {
+ strValue.Insert(iDec2, '.');
+ iMax++;
+ }
+ else if (iSepStyle == 2 || iSepStyle == 3)
+ {
+ strValue.Insert(iDec2, ',');
+ iMax++;
+ }
+
+ if (iDec2 == 0)
+ strValue.Insert(iDec2, '0');
+ }
+ if (iSepStyle == 0 || iSepStyle == 2)
+ {
+ char cSeperator;
+ if (iSepStyle == 0)
+ cSeperator = ',';
+ else
+ cSeperator = '.';
+
+ int iDecPositive,iDecNagative;
+ iDecPositive = iDec2;
+ iDecNagative = iDec2;
+
+ for (iDecPositive = iDec2 -3; iDecPositive > 0;iDecPositive -= 3)
+ {
+ strValue.Insert(iDecPositive, cSeperator);
+ iMax++;
+ }
+ }
+
+ //////////////////////////////////////////////////////////////////////
+ //for processing currency string
+
+ Value = CFX_WideString::FromLocal(strValue);
+
+ std::wstring strValue2(Value);
+
+ if (bCurrencyPrepend)
+ strValue2 = wstrCurrency + strValue2;
+ else
+ strValue2 = strValue2 + wstrCurrency;
+
+
+
+ /////////////////////////////////////////////////////////////////////////
+ //for processing negative style
+ if (bNagative)
+ {
+ if (iNegStyle == 0)
+ {
+ strValue2.insert(0,L"-");
+ }
+ if (iNegStyle == 2 || iNegStyle == 3)
+ {
+ strValue2.insert(0,L"(");
+ strValue2.insert(strValue2.length(),L")");
+ }
+ if (iNegStyle == 1 || iNegStyle == 3)
+ {
+ if (Field * fTarget = pEvent->Target_Field())
+ {
+ CJS_Array arColor(isolate);
+ CJS_Value vColElm(isolate);
+ vColElm = L"RGB";
+ arColor.SetElement(0,vColElm);
+ vColElm = 1;
+ arColor.SetElement(1,vColElm);
+ vColElm = 0;
+ arColor.SetElement(2,vColElm);
+
+ arColor.SetElement(3,vColElm);
+
+ CJS_PropValue vProp(isolate);
+ vProp.StartGetting();
+ vProp<<arColor;
+ vProp.StartSetting();
+ fTarget->textColor(cc,vProp,sError);// red
+ }
+ }
+ }
+ else
+ {
+ if (iNegStyle == 1 || iNegStyle == 3)
+ {
+ if (Field *fTarget = pEvent->Target_Field())
+ {
+ CJS_Array arColor(isolate);
+ CJS_Value vColElm(isolate);
+ vColElm = L"RGB";
+ arColor.SetElement(0,vColElm);
+ vColElm = 0;
+ arColor.SetElement(1,vColElm);
+ arColor.SetElement(2,vColElm);
+ arColor.SetElement(3,vColElm);
+
+ CJS_PropValue vProp(isolate);
+ vProp.StartGetting();
+ fTarget->textColor(cc,vProp,sError);
+
+ CJS_Array aProp(isolate);
+ vProp.ConvertToArray(aProp);
+
+ CPWL_Color crProp;
+ CPWL_Color crColor;
+ color::ConvertArrayToPWLColor(aProp, crProp);
+ color::ConvertArrayToPWLColor(arColor, crColor);
+
+ if (crColor != crProp)
+ {
+ CJS_PropValue vProp2(isolate);
+ vProp2.StartGetting();
+ vProp2<<arColor;
+ vProp2.StartSetting();
+ fTarget->textColor(cc,vProp2,sError);
+ }
+ }
+ }
+ }
+ Value = strValue2.c_str();
+#endif
+ return TRUE;
+}
+
+//function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
+FX_BOOL CJS_PublicMethods::AFNumber_Keystroke(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if(params.size() < 2)
+ return FALSE;
+ int iSepStyle = params[1];
+
+ if (iSepStyle < 0 || iSepStyle > 3)
+ iSepStyle = 0;
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString & val = pEvent->Value();
+ CFX_WideString & w_strChange = pEvent->Change();
+ CFX_WideString w_strValue = val;
+
+ if (pEvent->WillCommit())
+ {
+ CFX_WideString wstrChange = w_strChange;
+ CFX_WideString wstrValue = StrLTrim(w_strValue);
+ if (wstrValue.IsEmpty())
+ return TRUE;
+
+ CFX_WideString swTemp = wstrValue;
+ swTemp.Replace((FX_LPCWSTR)L",", (FX_LPCWSTR)L".");
+ if (!IsNumber(swTemp)) //!(IsNumber(wstrChange) &&
+ {
+ pEvent->Rc() = FALSE;
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ Alert(pContext, sError);
+ return TRUE;
+ }
+ return TRUE; // it happens after the last keystroke and before validating,
+ }
+
+ std::wstring w_strValue2 (w_strValue);
+ std::wstring w_strChange2(w_strChange);
+
+ std::wstring w_strSelected;
+ if(-1 != pEvent->SelStart())
+ w_strSelected = w_strValue2.substr(pEvent->SelStart(),(pEvent->SelEnd() - pEvent->SelStart()));
+ FX_BOOL bHasSign = (w_strValue2.find('-') != -1) && (w_strSelected.find('-') == -1);
+ if (bHasSign)
+ {
+ //can't insert "change" in front to sign postion.
+ if (pEvent->SelStart() == 0)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ }
+
+ char cSep = L'.';
+
+ switch (iSepStyle)
+ {
+ case 0:
+ case 1:
+ cSep = L'.';
+ break;
+ case 2:
+ case 3:
+ cSep = L',';
+ break;
+ }
+
+ FX_BOOL bHasSep = (w_strValue2.find(cSep) != -1);
+ for (std::wstring::iterator it = w_strChange2.begin(); it != w_strChange2.end(); it++)
+ {
+ if (*it == cSep)
+ {
+ if (bHasSep)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ else
+ {
+ bHasSep = TRUE;
+ continue;
+ }
+ }
+ if (*it == L'-')
+ {
+ if (bHasSign)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ else if (it != w_strChange2.begin()) //sign's position is not correct
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ else if (pEvent->SelStart() != 0)
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ bHasSign = TRUE;
+ continue;
+ }
+
+ if (!IsDigit(*it))
+ {
+ FX_BOOL &bRc = pEvent->Rc();
+ bRc = FALSE;
+ return TRUE;
+ }
+ }
+
+
+ std::wstring w_prefix = w_strValue2.substr(0,pEvent->SelStart());
+ std::wstring w_postfix;
+ if (pEvent->SelEnd()<(int)w_strValue2.length())
+ w_postfix = w_strValue2.substr(pEvent->SelEnd());
+ w_strValue2 = w_prefix + w_strChange2 + w_postfix;
+ w_strValue = w_strValue2.c_str();
+ val = w_strValue;
+ return TRUE;
+
+}
+
+//function AFPercent_Format(nDec, sepStyle)
+FX_BOOL CJS_PublicMethods::AFPercent_Format(OBJ_METHOD_PARAMS)
+{
+#if _FX_OS_ != _FX_ANDROID_
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& Value = pEvent->Value();
+
+// HWND hMainFrame = NULL;
+//
+// CPDFSDK_FormFillApp *pApp = pContext->GetReaderApp();
+// ASSERT(pApp);
+// hMainFrame = pApp->GetMainFrameWnd();
+
+ CFX_ByteString strValue = StrTrim(CFX_ByteString::FromUnicode(Value));
+
+ if (strValue.IsEmpty())
+ return TRUE;
+
+ int iDec = params[0];
+ int iSepStyle = params[1];
+
+ //ASSERT(iDec > 0);
+ if (iDec < 0)
+ iDec = -iDec;
+
+ if (iSepStyle < 0 || iSepStyle > 3)
+ iSepStyle = 0;
+
+
+ //////////////////////////////////////////////////////
+ //for processing decimal places
+ double dValue = atof(strValue);
+ dValue *= 100;
+ if (iDec > 0)
+ dValue += DOUBLE_CORRECT;//УÕý
+
+ int iDec2;
+ FX_BOOL bNagative = FALSE;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ if (strValue.IsEmpty())
+ {
+ dValue = 0;
+ strValue = fcvt(dValue,iDec,&iDec2,&bNagative);
+ }
+
+ if (iDec2 < 0)
+ {
+ for (int iNum = 0; iNum < abs(iDec2); iNum++)
+ {
+ strValue = "0" + strValue;
+ }
+ iDec2 = 0;
+
+ }
+ int iMax = strValue.GetLength();
+ if (iDec2 > iMax)
+ {
+ for (int iNum = 0; iNum <= iDec2 - iMax; iNum++)
+ {
+ strValue += "0";
+ }
+ iMax = iDec2+1;
+ }
+ ///////////////////////////////////////////////////////
+ //for processing seperator style
+ if (iDec2 < iMax)
+ {
+ if (iSepStyle == 0 || iSepStyle == 1)
+ {
+ strValue.Insert(iDec2, '.');
+ iMax++;
+ }
+ else if (iSepStyle == 2 || iSepStyle == 3)
+ {
+ strValue.Insert(iDec2, ',');
+ iMax++;
+ }
+
+ if (iDec2 == 0)
+ strValue.Insert(iDec2, '0');
+ }
+ if (iSepStyle == 0 || iSepStyle == 2)
+ {
+ char cSeperator;
+ if (iSepStyle == 0)
+ cSeperator = ',';
+ else
+ cSeperator = '.';
+
+ int iDecPositive,iDecNagative;
+ iDecPositive = iDec2;
+ iDecNagative = iDec2;
+
+ for (iDecPositive = iDec2 -3; iDecPositive > 0; iDecPositive -= 3)
+ {
+ strValue.Insert(iDecPositive,cSeperator);
+ iMax++;
+ }
+ }
+ ////////////////////////////////////////////////////////////////////
+ //nagative mark
+ if(bNagative)
+ strValue = "-" + strValue;
+ strValue += "%";
+ Value = CFX_WideString::FromLocal(strValue);
+#endif
+ return TRUE;
+}
+//AFPercent_Keystroke(nDec, sepStyle)
+FX_BOOL CJS_PublicMethods::AFPercent_Keystroke(OBJ_METHOD_PARAMS)
+{
+ return AFNumber_Keystroke(cc,params,vRet,sError);
+}
+
+//function AFDate_FormatEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_FormatEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& val = pEvent->Value();
+
+ CFX_WideString strValue = val;
+ if (strValue.IsEmpty()) return TRUE;
+
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ double dDate = 0.0f;
+
+ if(strValue.Find(L"GMT") != -1)
+ {
+ //for GMT format time
+ //such as "Tue Aug 11 14:24:16 GMT+08002009"
+ dDate = MakeInterDate(strValue);
+ }
+ else
+ {
+ dDate = MakeRegularDate(strValue,sFormat,bWrongFormat);
+ }
+
+ if (JS_PortIsNan(dDate))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert(pContext, swMsg);
+ return FALSE;
+ }
+
+ val = MakeFormatDate(dDate,sFormat);
+
+ return TRUE;
+}
+
+double CJS_PublicMethods::MakeInterDate(CFX_WideString strValue)
+{
+ int nHour;
+ int nMin;
+ int nSec;
+ int nYear;
+ int nMonth;
+ int nDay;
+
+ CFX_WideStringArray wsArray;
+ CFX_WideString sMonth = L"";
+ CFX_WideString sTemp = L"";
+ int nSize = strValue.GetLength();
+
+ for(int i = 0; i < nSize; i++)
+ {
+ FX_WCHAR c = strValue.GetAt(i);
+ if(c == L' ' || c == L':')
+ {
+ wsArray.Add(sTemp);
+ sTemp = L"";
+ continue;
+ }
+
+ sTemp += c;
+ }
+
+ wsArray.Add(sTemp);
+ if(wsArray.GetSize() != 8)return 0;
+
+ sTemp = wsArray[1];
+ if(sTemp.Compare(L"Jan") == 0) nMonth = 1;
+ if(sTemp.Compare(L"Feb") == 0) nMonth = 2;
+ if(sTemp.Compare(L"Mar") == 0) nMonth = 3;
+ if(sTemp.Compare(L"Apr") == 0) nMonth = 4;
+ if(sTemp.Compare(L"May") == 0) nMonth = 5;
+ if(sTemp.Compare(L"Jun") == 0) nMonth = 6;
+ if(sTemp.Compare(L"Jul") == 0) nMonth = 7;
+ if(sTemp.Compare(L"Aug") == 0) nMonth = 8;
+ if(sTemp.Compare(L"Sep") == 0) nMonth = 9;
+ if(sTemp.Compare(L"Oct") == 0) nMonth = 10;
+ if(sTemp.Compare(L"Nov") == 0) nMonth = 11;
+ if(sTemp.Compare(L"Dec") == 0) nMonth = 12;
+
+ nDay = (int)ParseStringToNumber(wsArray[2]);
+ nHour = (int)ParseStringToNumber(wsArray[3]);
+ nMin = (int)ParseStringToNumber(wsArray[4]);
+ nSec = (int)ParseStringToNumber(wsArray[5]);
+ nYear = (int)ParseStringToNumber(wsArray[7]);
+
+ double dRet = JS_MakeDate(JS_MakeDay(nYear,nMonth - 1,nDay),JS_MakeTime(nHour, nMin, nSec, 0));
+
+ if (JS_PortIsNan(dRet))
+ {
+ dRet = JS_DateParse(strValue);
+ }
+
+ return dRet;
+}
+
+//AFDate_KeystrokeEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_KeystrokeEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
+ return FALSE;
+ }
+
+ if (pEvent->WillCommit())
+ {
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString strValue = pEvent->Value();
+ if (strValue.IsEmpty()) return TRUE;
+
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ double dRet = MakeRegularDate(strValue,sFormat,bWrongFormat);
+ if (bWrongFormat || JS_PortIsNan(dRet))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert(pContext, swMsg);
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+ }
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFDate_Format(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
+ (FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
+ (FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
+
+ ASSERT(iIndex < sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_FormatEx(cc,newParams,vRet,sError);
+}
+
+//AFDate_KeystrokeEx(cFormat)
+FX_BOOL CJS_PublicMethods::AFDate_Keystroke(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"m/d", (FX_LPCWSTR)L"m/d/yy", (FX_LPCWSTR)L"mm/dd/yy", (FX_LPCWSTR)L"mm/yy", (FX_LPCWSTR)L"d-mmm", (FX_LPCWSTR)L"d-mmm-yy", (FX_LPCWSTR)L"dd-mmm-yy",
+ (FX_LPCWSTR)L"yy-mm-dd", (FX_LPCWSTR)L"mmm-yy", (FX_LPCWSTR)L"mmmm-yy", (FX_LPCWSTR)L"mmm d, yyyy", (FX_LPCWSTR)L"mmmm d, yyyy",
+ (FX_LPCWSTR)L"m/d/yy h:MM tt", (FX_LPCWSTR)L"m/d/yy HH:MM" };
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+}
+
+//function AFTime_Format(ptf)
+FX_BOOL CJS_PublicMethods::AFTime_Format(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_FormatEx(cc,newParams,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_Keystroke(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ int iIndex = params[0];
+ FX_LPCWSTR cFormats[] = {(FX_LPCWSTR)L"HH:MM", (FX_LPCWSTR)L"h:MM tt", (FX_LPCWSTR)L"HH:MM:ss", (FX_LPCWSTR)L"h:MM:ss tt"};
+
+ ASSERT(iIndex<sizeof(cFormats)/sizeof(FX_LPCWSTR));
+
+ if (iIndex < 0)
+ iIndex = 0;
+ if (iIndex >= sizeof(cFormats)/sizeof(FX_LPCWSTR))
+ iIndex = 0;
+ CJS_Parameters newParams;
+ CJS_Value val(isolate,cFormats[iIndex]);
+ newParams.push_back(val);
+ return AFDate_KeystrokeEx(cc,newParams,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_FormatEx(OBJ_METHOD_PARAMS)
+{
+ return AFDate_FormatEx(cc,params,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFTime_KeystrokeEx(OBJ_METHOD_PARAMS)
+{
+ return AFDate_KeystrokeEx(cc,params,vRet,sError);
+}
+
+//function AFSpecial_Format(psf)
+FX_BOOL CJS_PublicMethods::AFSpecial_Format(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ std::string cFormat;
+ int iIndex = params[0];
+
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& Value = pEvent->Value();
+ std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(Value);
+
+ switch (iIndex)
+ {
+ case 0:
+ cFormat = "99999";
+ break;
+ case 1:
+ cFormat = "99999-9999";
+ break;
+ case 2:
+ {
+ std::string NumberStr;
+ util::printx("9999999999", strSrc,NumberStr);
+ if (NumberStr.length() >= 10 )
+ cFormat = "(999) 999-9999";
+ else
+ cFormat = "999-9999";
+ break;
+ }
+ case 3:
+ cFormat = "999-99-9999";
+ break;
+ }
+
+ std::string strDes;
+ util::printx(cFormat,strSrc,strDes);
+ Value = CFX_WideString::FromLocal(strDes.c_str());
+ return TRUE;
+}
+
+
+//function AFSpecial_KeystrokeEx(mask)
+FX_BOOL CJS_PublicMethods::AFSpecial_KeystrokeEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+
+ ASSERT(pEvent != NULL);
+
+ if (params.size() < 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString& valEvent = pEvent->Value();
+
+ CFX_WideString wstrMask = params[0].operator CFX_WideString();
+ if (wstrMask.IsEmpty()) return TRUE;
+
+ std::wstring wstrValue(valEvent);
+
+ if (pEvent->WillCommit())
+ {
+ if (wstrValue.empty())
+ return TRUE;
+ int iIndexMask = 0;
+ for (std::wstring::iterator it = wstrValue.begin(); it != wstrValue.end(); it++)
+ {
+ wchar_t w_Value = *it;
+ if (!maskSatisfied(w_Value,wstrMask[iIndexMask]))
+ break;
+ iIndexMask++;
+ }
+
+ if (iIndexMask != wstrMask.GetLength() || (iIndexMask != wstrValue.size() && wstrMask.GetLength() != 0))
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE));
+ pEvent->Rc() = FALSE;
+ }
+ return TRUE;
+ }
+
+
+ CFX_WideString &wideChange = pEvent->Change();
+ std::wstring wChange(wideChange);
+
+ if (wChange.empty())
+ return TRUE;
+ int iIndexMask = pEvent->SelStart();
+ //iIndexMask++;
+
+
+ if (wstrValue.length() - (pEvent->SelEnd()-pEvent->SelStart()) + wChange.length() > (FX_DWORD)wstrMask.GetLength())
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+
+
+ if (iIndexMask >= wstrMask.GetLength() && (!wChange.empty()))
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+
+ for (std::wstring::iterator it = wChange.begin(); it != wChange.end(); it++)
+ {
+ if (iIndexMask >= wstrMask.GetLength())
+ {
+ Alert(pContext, JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG));
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+ wchar_t w_Mask = wstrMask[iIndexMask];
+ if (!isReservedMaskChar(w_Mask))
+ {
+ //wChange.insert(it,w_Mask);
+ *it = w_Mask;
+ }
+ wchar_t w_Change = *it;
+
+ if (!maskSatisfied(w_Change,w_Mask))
+ {
+ pEvent->Rc() = FALSE;
+ return TRUE;
+ }
+ iIndexMask++;
+ }
+
+ wideChange = wChange.c_str();
+
+ return TRUE;
+}
+
+
+//function AFSpecial_Keystroke(psf)
+FX_BOOL CJS_PublicMethods::AFSpecial_Keystroke(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ std::string cFormat;
+ int iIndex = (int)params[0];
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ //CJS_Value val = pEvent->Value();
+ CFX_WideString& val = pEvent->Value();
+ std::string strSrc = (FX_LPCSTR)CFX_ByteString::FromUnicode(val);
+ std::wstring wstrChange(pEvent->Change());
+
+ switch (iIndex)
+ {
+ case 0:
+ cFormat = "99999";
+ break;
+ case 1:
+ //cFormat = "99999-9999";
+ cFormat = "999999999";
+ break;
+ case 2:
+ {
+ std::string NumberStr;
+ util::printx("9999999999", strSrc,NumberStr);
+ if (strSrc.length() + wstrChange.length() > 7 )
+ //cFormat = "(999) 999-9999";
+ cFormat = "9999999999";
+ else
+ //cFormat = "999-9999";
+ cFormat = "9999999";
+ break;
+ }
+ case 3:
+ //cFormat = "999-99-9999";
+ cFormat = "999999999";
+ break;
+ }
+
+ CJS_Parameters params2;
+ CJS_Value vMask(isolate, cFormat.c_str());
+ params2.push_back(vMask);
+
+ return AFSpecial_KeystrokeEx(cc,params2,vRet,sError);
+}
+
+FX_BOOL CJS_PublicMethods::AFMergeChange(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
+ ASSERT(pEventHandler != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_WideString swValue;
+ if (pEventHandler->m_pValue != NULL)
+ swValue = pEventHandler->Value();
+
+ if (pEventHandler->WillCommit())
+ {
+ vRet = swValue;
+ return TRUE;
+ }
+
+ CFX_WideString prefix,postfix;
+
+ if (pEventHandler->SelStart() >= 0)
+ prefix = swValue.Mid(0,pEventHandler->SelStart());
+ else
+ prefix = L"";
+
+
+ if (pEventHandler->SelEnd() >= 0 && pEventHandler->SelEnd() <= swValue.GetLength())
+ postfix = swValue.Mid(pEventHandler->SelEnd(), swValue.GetLength() - pEventHandler->SelEnd());
+ else postfix = L"";
+
+ vRet = prefix + pEventHandler->Change() + postfix;
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFParseDateEx(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_WideString sValue = params[0].operator CFX_WideString();
+ CFX_WideString sFormat = params[1].operator CFX_WideString();
+
+ FX_BOOL bWrongFormat = FALSE;
+ double dDate = MakeRegularDate(sValue,sFormat,bWrongFormat);
+
+ if (JS_PortIsNan(dDate))
+ {
+ CFX_WideString swMsg;
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE), (FX_LPCWSTR)sFormat);
+ Alert((CJS_Context *)cc, swMsg);
+ return FALSE;
+ }
+
+ vRet = dDate;
+
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFSimple(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 3)
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ vRet = (double)AF_Simple(params[0].operator CFX_WideString(), (double)params[1], (double)params[2]);
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFMakeNumber(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 1)
+ {
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+ vRet = ParseStringToNumber(params[0].operator CFX_WideString());
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFSimple_Calculate(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 2)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Value params1 = params[1];
+
+ if (!params1.IsArrayObject() && params1.GetType() != VT_string)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
+ ASSERT(pReaderDoc != NULL);
+
+ CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
+ ASSERT(pReaderInterForm != NULL);
+
+ CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
+ ASSERT(pInterForm != NULL);
+
+ double dValue;
+ CFX_WideString sFunction = params[0].operator CFX_WideString();
+ if (wcscmp(sFunction, L"PRD") == 0)
+ dValue = 1.0;
+ else
+ dValue = 0.0;
+
+ CJS_Array FieldNameArray = AF_MakeArrayFromList(isolate,params1);
+
+ int nFieldsCount = 0;
+
+ for (int i=0,isz=FieldNameArray.GetLength(); i<isz; i++)
+ {
+ CJS_Value jsValue(isolate);
+ FieldNameArray.GetElement(i,jsValue);
+ CFX_WideString wsFieldName = jsValue.operator CFX_WideString();
+
+ for (int j=0,jsz=pInterForm->CountFields(wsFieldName); j<jsz; j++)
+ {
+ if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName))
+ {
+ double dTemp = 0.0;
+
+ switch (pFormField->GetFieldType())
+ {
+ case FIELDTYPE_TEXTFIELD:
+ case FIELDTYPE_COMBOBOX:
+ {
+ dTemp = ParseStringToNumber(pFormField->GetValue());
+ break;
+ }
+ case FIELDTYPE_PUSHBUTTON:
+ {
+ dTemp = 0.0;
+ break;
+ }
+ case FIELDTYPE_CHECKBOX:
+ case FIELDTYPE_RADIOBUTTON:
+ {
+ dTemp = 0.0;
+ for (int c=0,csz=pFormField->CountControls(); c<csz; c++)
+ {
+ if (CPDF_FormControl* pFormCtrl = pFormField->GetControl(c))
+ {
+ if (pFormCtrl->IsChecked())
+ {
+ dTemp += ParseStringToNumber(pFormCtrl->GetExportValue());
+ break;
+ }
+ else
+ continue;
+ }
+ }
+ break;
+ }
+ case FIELDTYPE_LISTBOX:
+ {
+ dTemp = 0.0;
+ if (pFormField->CountSelectedItems() > 1)
+ break;
+ else
+ {
+ dTemp = ParseStringToNumber(pFormField->GetValue());
+ break;
+ }
+ }
+ default:
+ break;
+ }
+
+ if (i == 0 && j == 0 && (wcscmp(sFunction,L"MIN") == 0 || wcscmp(sFunction, L"MAX") == 0))
+ dValue = dTemp;
+
+ dValue = AF_Simple(sFunction, dValue, dTemp);
+
+ nFieldsCount++;
+ }
+ }
+ }
+
+ if (wcscmp(sFunction, L"AVG") == 0 && nFieldsCount > 0)
+ dValue /= nFieldsCount;
+
+ dValue = (double)floor(dValue * FXSYS_pow((double)10,(double)6) + 0.49) / FXSYS_pow((double)10,(double)6);
+ CJS_Value jsValue(isolate,dValue);
+ if((CJS_EventHandler*)pContext->GetEventHandler()->m_pValue)
+ ((CJS_EventHandler*)pContext->GetEventHandler())->Value() = jsValue;
+
+ return TRUE;
+}
+
+/* This function validates the current event to ensure that its value is
+** within the specified range. */
+
+FX_BOOL CJS_PublicMethods::AFRange_Validate(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (params.size() != 4)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if(!pEvent->m_pValue)
+ return FALSE;
+ if (pEvent->Value().IsEmpty() )
+ return TRUE;
+ double dEentValue = atof(CFX_ByteString::FromUnicode(pEvent->Value()));
+ FX_BOOL bGreaterThan, bLessThan;
+ double dGreaterThan, dLessThan;
+ bGreaterThan = (FX_BOOL)params[0];
+ CFX_WideString swMsg;
+ dGreaterThan = (double)params[1];
+ bLessThan = (FX_BOOL)params[2];
+ dLessThan = (double)params[3];
+
+ if (bGreaterThan && bLessThan)
+ {
+ if (dEentValue < dGreaterThan || dEentValue > dLessThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1),(FX_LPCWSTR)params[1].operator CFX_WideString(), (FX_LPCWSTR)params[3].operator CFX_WideString());
+ }
+ else if (bGreaterThan)
+ {
+ if (dEentValue < dGreaterThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2), (FX_LPCWSTR)params[1].operator CFX_WideString());
+ }
+ else if (bLessThan)
+ {
+ if (dEentValue > dLessThan)
+ swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3), (FX_LPCWSTR)params[3].operator CFX_WideString());
+ }
+
+ if (!swMsg.IsEmpty())
+ {
+ Alert(pContext, swMsg);
+ pEvent->Rc() = FALSE;
+ }
+ return TRUE;
+}
+
+FX_BOOL CJS_PublicMethods::AFExtractNums(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = ::GetIsolate(cc);
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Array nums(isolate);
+
+ CFX_WideString str = params[0].operator CFX_WideString();
+ CFX_WideString sPart;
+
+ if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
+ str = L"0" + str;
+
+ int nIndex = 0;
+ for (int i=0, sz=str.GetLength(); i<sz; i++)
+ {
+ FX_WCHAR wc = str.GetAt(i);
+ if (IsDigit((wchar_t)wc))
+ {
+ sPart += wc;
+ }
+ else
+ {
+ if (sPart.GetLength() > 0)
+ {
+ nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
+ sPart = L"";
+ nIndex ++;
+ }
+ }
+ }
+
+ if (sPart.GetLength() > 0)
+ {
+ nums.SetElement(nIndex,CJS_Value(isolate,(FX_LPCWSTR)sPart));
+ }
+
+ if (nums.GetLength() > 0)
+ vRet = nums;
+ else
+ vRet.SetNull();
+
+ return TRUE;
+}
diff --git a/fpdfsdk/src/javascript/app.cpp b/fpdfsdk/src/javascript/app.cpp
new file mode 100644
index 0000000000..c1ef76c3b8
--- /dev/null
+++ b/fpdfsdk/src/javascript/app.cpp
@@ -0,0 +1,1134 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/app.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/Document.h"
+
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+/* ---------------------------- TimerObj ---------------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_TimerObj)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_TimerObj)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_TimerObj)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj)
+
+TimerObj::TimerObj(CJS_Object* pJSObject)
+: CJS_EmbedObj(pJSObject),
+m_pTimer(NULL)
+{
+
+}
+
+TimerObj::~TimerObj()
+{
+}
+
+void TimerObj::SetTimer(CJS_Timer* pTimer)
+{
+ m_pTimer = pTimer;
+}
+
+CJS_Timer* TimerObj::GetTimer() const
+{
+ return m_pTimer;
+}
+
+#define JS_STR_VIEWERTYPE_READER L"Reader"
+#define JS_STR_VIEWERTYPE_STANDARD L"Exchange"
+#define JS_STR_VIEWERVARIATION L"Full"
+#define JS_STR_PLATFORM L"WIN"
+#define JS_STR_LANGUANGE L"ENU"
+#define JS_STR_VIEWERVERSION 8
+#define JS_NUM_FORMSVERSION 7
+
+#define JS_FILEPATH_MAXLEN 2000
+
+/* ---------------------------- app ---------------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_App)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_App)
+ JS_STATIC_PROP_ENTRY(activeDocs)
+ JS_STATIC_PROP_ENTRY(calculate)
+ JS_STATIC_PROP_ENTRY(formsVersion)
+ JS_STATIC_PROP_ENTRY(fs)
+ JS_STATIC_PROP_ENTRY(fullscreen)
+ JS_STATIC_PROP_ENTRY(language)
+ JS_STATIC_PROP_ENTRY(media)
+ JS_STATIC_PROP_ENTRY(platform)
+ JS_STATIC_PROP_ENTRY(runtimeHighlight)
+ JS_STATIC_PROP_ENTRY(viewerType)
+ JS_STATIC_PROP_ENTRY(viewerVariation)
+ JS_STATIC_PROP_ENTRY(viewerVersion)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_App)
+ JS_STATIC_METHOD_ENTRY(alert, 6)
+ JS_STATIC_METHOD_ENTRY(beep, 1)
+ JS_STATIC_METHOD_ENTRY(browseForDoc, 0)
+ JS_STATIC_METHOD_ENTRY(clearInterval, 1)
+ JS_STATIC_METHOD_ENTRY(clearTimeOut, 1)
+ JS_STATIC_METHOD_ENTRY(execDialog, 3)
+ JS_STATIC_METHOD_ENTRY(execMenuItem, 1)
+ JS_STATIC_METHOD_ENTRY(findComponent, 1)
+ JS_STATIC_METHOD_ENTRY(goBack, 0)
+ JS_STATIC_METHOD_ENTRY(goForward, 0)
+ JS_STATIC_METHOD_ENTRY(launchURL, 0)
+ JS_STATIC_METHOD_ENTRY(mailMsg, 0)
+ JS_STATIC_METHOD_ENTRY(newFDF, 0)
+ JS_STATIC_METHOD_ENTRY(newDoc, 0)
+ JS_STATIC_METHOD_ENTRY(openDoc, 0)
+ JS_STATIC_METHOD_ENTRY(openFDF, 5)
+ JS_STATIC_METHOD_ENTRY(popUpMenuEx, 0)
+ JS_STATIC_METHOD_ENTRY(popUpMenu, 0)
+ JS_STATIC_METHOD_ENTRY(response, 0)
+ JS_STATIC_METHOD_ENTRY(setInterval, 2)
+ JS_STATIC_METHOD_ENTRY(setTimeOut, 2)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_App,app)
+
+app::app(CJS_Object * pJSObject) : CJS_EmbedObj(pJSObject) ,
+ m_bCalculate(true),
+ m_pRuntime(NULL),
+ m_bRuntimeHighLight(false)
+// m_pMenuHead(NULL)
+{
+}
+
+app::~app(void)
+{
+ for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
+ delete m_aTimer[i];
+
+ m_aTimer.RemoveAll();
+}
+
+FX_BOOL app::activeDocs(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
+
+ CJS_Array aDocs(pRuntime->GetIsolate());
+// int iNumDocs = pApp->CountDocuments();
+
+// for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
+// {
+ CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
+ if (pDoc)
+ {
+ CJS_Document * pJSDocument = NULL;
+
+ if (pDoc == pCurDoc)
+ {
+ JSFXObject pObj = JS_GetThisObj(*pRuntime);
+
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document"))
+ {
+ pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
+ }
+ }
+ else
+ {
+ JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document"));
+ pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
+ ASSERT(pJSDocument != NULL);
+
+
+ // pDocument->AttachDoc(pDoc);
+ }
+
+ aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));
+ }
+ // }
+
+ if (aDocs.GetLength() > 0)
+ vp << aDocs;
+ else
+ vp.SetNull();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+FX_BOOL app::calculate(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ bool bVP;
+ vp >> bVP;
+ m_bCalculate = (FX_BOOL)bVP;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CJS_Array aDocs(pRuntime->GetIsolate());
+// int iNumDocs = pApp->CountDocuments();
+//
+// for (int iIndex = 0;iIndex < iNumDocs; iIndex++)
+// {
+ if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())
+ {
+ CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();
+ ASSERT(pInterForm != NULL);
+ pInterForm->EnableCalculate((FX_BOOL)m_bCalculate);
+ }
+// }
+ }
+ else
+ {
+ vp << (bool)m_bCalculate;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::formsVersion(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_NUM_FORMSVERSION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerType(OBJ_PROP_PARAMS)
+{
+
+
+
+
+
+
+ if (vp.IsGetting())
+ {
+// if (pApp->GetAppName() == PHANTOM)
+// vp << JS_STR_VIEWERTYPE_STANDARD;
+// else
+// vp << JS_STR_VIEWERTYPE_READER;
+ vp << L"unknown";
+
+ //vp << pApp->GetAppTitle();
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerVariation(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_VIEWERVARIATION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::viewerVersion(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_VIEWERVERSION;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::platform(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_PLATFORM;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL app::language(OBJ_PROP_PARAMS)
+{
+ if (vp.IsGetting())
+ {
+ vp << JS_STR_LANGUANGE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+//creates a new fdf object that contains no data
+//comment: need reader support
+//note:
+//CFDF_Document * CPDFDoc_Environment::NewFDF();
+FX_BOOL app::newFDF(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+//opens a specified pdf document and returns its document object
+//comment:need reader support
+//note: as defined in js reference, the proto of this function's fourth parmeters, how old an fdf document while do not show it.
+//CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);
+
+FX_BOOL app::openFDF(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL app::alert(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize < 1)
+ return FALSE;
+
+ CFX_WideString swMsg = L"";
+ CFX_WideString swTitle = L"";
+ int iIcon = 0;
+ int iType = 0;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ if (iSize == 1)
+ {
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = params[0];
+ {
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
+ swMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
+ swTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"nIcon");
+ iIcon = (int)CJS_Value(isolate,pValue,VT_unknown);
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"nType");
+ iType = (int)CJS_Value(isolate,pValue,VT_unknown);
+ }
+
+ if (swMsg == L"")
+ {
+ CJS_Array carray(isolate);
+ if (params[0].ConvertToArray(carray))
+ {
+ int iLenth = carray.GetLength();
+ CJS_Value* pValue = new CJS_Value(isolate);
+// if (iLenth == 1)
+// pValue = new CJS_Value(isolate);
+// else if (iLenth > 1)
+// pValue = new CJS_Value[iLenth];
+
+ for(int i = 0; i < iLenth; i++)
+ {
+ carray.GetElement(i, *pValue);
+ swMsg += (*pValue).operator CFX_WideString();
+ if (i < iLenth - 1)
+ swMsg += L", ";
+ }
+
+ if(pValue) delete pValue;
+// if ((iLenth > 1) && pValue)
+// {
+// delete[]pValue;
+// pValue = NULL;
+// }
+// else if ((iLenth == 1) && pValue)
+// {
+// delete pValue;
+// pValue = NULL;
+// }
+ }
+ }
+
+ if (swTitle == L"")
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ else if (params[0].GetType() == VT_boolean)
+ {
+ FX_BOOL bGet = (FX_BOOL)params[0];
+ if (bGet)
+ swMsg = L"true";
+ else
+ swMsg = L"false";
+
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ else
+ {
+ swMsg = params[0];
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+ }
+ }
+ else
+ {
+ if (params[0].GetType() == VT_boolean)
+ {
+ FX_BOOL bGet = (FX_BOOL)params[0];
+ if (bGet)
+ swMsg = L"true";
+ else
+ swMsg = L"false";
+ }
+ else
+ {
+ swMsg = params[0];
+ }
+ swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
+
+ for(int i = 1;i<iSize;i++)
+ {
+ if (i == 1)
+ iIcon = int(params[i]);
+ if (i == 2)
+ iType = int(params[i]);
+ if (i == 3)
+ swTitle = params[i];
+ }
+ }
+
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+ pRuntime->BeginBlock();
+ vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon);
+ pRuntime->EndBlock();
+
+ return TRUE;
+}
+
+
+FX_BOOL app::beep(OBJ_METHOD_PARAMS)
+{
+ if (params.size() == 1)
+ {
+ CJS_Context* pContext = (CJS_Context*)cc;
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();
+ pEnv->JS_appBeep((int)params[0]);
+
+ return TRUE;
+ }
+ else
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+}
+
+FX_BOOL app::findComponent(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+FX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::fs(OBJ_PROP_PARAMS)
+{
+#ifdef FOXIT_CHROME_BUILD
+ return FALSE;
+#else
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (vp.IsGetting())
+ {
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+#endif
+}
+
+FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
+{
+ if (params.size() > 2 || params.size() == 0)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
+ if (script.IsEmpty())
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ return TRUE;
+ }
+
+ FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;
+
+ CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
+ ASSERT(pApp);
+ CJS_Timer* pTimer = new CJS_Timer(this, pApp);
+ m_aTimer.Add(pTimer);
+
+ pTimer->SetType(0);
+ pTimer->SetRuntime(pRuntime);
+ pTimer->SetJScript(script);
+ pTimer->SetTimeOut(0);
+// pTimer->SetStartTime(GetTickCount());
+ pTimer->SetJSTimer(dwInterval);
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
+
+ CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
+ ASSERT(pJS_TimerObj != NULL);
+
+ TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
+ ASSERT(pTimerObj != NULL);
+
+ pTimerObj->SetTimer(pTimer);
+
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)
+{
+ if (params.size() > 2 || params.size() == 0)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
+ if (script.IsEmpty())
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+ return TRUE;
+ }
+
+ FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;
+
+ CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
+ ASSERT(pApp);
+ CJS_Timer* pTimer = new CJS_Timer(this, pApp);
+ m_aTimer.Add(pTimer);
+
+ pTimer->SetType(1);
+ pTimer->SetRuntime(pRuntime);
+ pTimer->SetJScript(script);
+ pTimer->SetTimeOut(dwTimeOut);
+// pTimer->SetStartTime(GetTickCount());
+// pTimer->SetJSTimer(1000);
+ pTimer->SetJSTimer(dwTimeOut);
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
+// ASSERT(pRetObj != NULL);
+
+ CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
+ ASSERT(pJS_TimerObj != NULL);
+
+ TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
+ ASSERT(pTimerObj != NULL);
+
+ pTimerObj->SetTimer(pTimer);
+
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if (params[0].GetType() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[0];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+ {
+ if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
+ {
+ if (CJS_Timer* pTimer = pTimerObj->GetTimer())
+ {
+ pTimer->KillJSTimer();
+
+ for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
+ {
+ if (m_aTimer[i] == pTimer)
+ {
+ m_aTimer.RemoveAt(i);
+ break;
+ }
+ }
+
+ delete pTimer;
+ pTimerObj->SetTimer(NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ if (params.size() != 1)
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ if (params[0].GetType() == VT_fxobject)
+ {
+ JSFXObject pObj = (JSFXObject)params[0];
+ {
+ if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
+ {
+ if (CJS_Object* pJSObj = (CJS_Object*)params[0])
+ {
+ if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
+ {
+ if (CJS_Timer* pTimer = pTimerObj->GetTimer())
+ {
+ pTimer->KillJSTimer();
+
+ for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
+ {
+ if (m_aTimer[i] == pTimer)
+ {
+ m_aTimer.RemoveAt(i);
+ break;
+ }
+ }
+
+ delete pTimer;
+ pTimerObj->SetTimer(NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::execMenuItem(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+void app::TimerProc(CJS_Timer* pTimer)
+{
+ ASSERT(pTimer != NULL);
+
+ switch (pTimer->GetType())
+ {
+ case 0: //interval
+ RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
+ break;
+ case 1:
+ if (pTimer->GetTimeOut() > 0)
+ {
+ RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
+ pTimer->KillJSTimer();
+ }
+ break;
+ }
+
+}
+
+void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
+{
+ ASSERT(pRuntime != NULL);
+
+ if (!pRuntime->IsBlocking())
+ {
+ IFXJS_Context* pContext = pRuntime->NewContext();
+ ASSERT(pContext != NULL);
+ pContext->OnExternal_Exec();
+ CFX_WideString wtInfo;
+ pContext->RunScript(wsScript,wtInfo);
+ pRuntime->ReleaseContext(pContext);
+ }
+}
+
+FX_BOOL app::goBack(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL app::goForward(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ FX_BOOL bUI = TRUE;
+ CFX_WideString cTo = L"";
+ CFX_WideString cCc = L"";
+ CFX_WideString cBcc = L"";
+ CFX_WideString cSubject = L"";
+ CFX_WideString cMsg = L"";
+ if(params.size() < 2)
+ return FALSE;
+
+ bUI = params.size()>=1?(int)params[0]:TRUE;
+ cTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L"";
+ cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L"";
+ cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L"";
+ cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L"";
+ cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
+
+
+ if (params[0].GetType() == VT_object)
+ {
+ JSObject pObj = (JSObject)params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
+ bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate, pObj, L"cTo");
+ cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
+ cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
+ cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
+ cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
+ cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+ }
+
+
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ pRuntime->BeginBlock();
+ pApp->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ pRuntime->EndBlock();
+
+ //return bRet;
+ return FALSE;
+}
+
+FX_BOOL app::launchURL(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+
+
+
+ CFX_WideString swURL = params[0].operator CFX_WideString();
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ pRuntime->BeginBlock();
+// FX_BOOL bRet = pApp->OpenURL(swURL);
+ pRuntime->EndBlock();
+
+// return bRet;
+ return FALSE;
+}
+
+FX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS)
+{
+ if (vp.IsSetting())
+ {
+ vp>>m_bRuntimeHighLight;
+ }
+ else
+ {
+ vp<<m_bRuntimeHighLight;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL app::fullscreen(OBJ_PROP_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+
+FX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS)
+{
+ //This method may trigger a "file save" dialog,while enable user to save contents of the document.
+ //Such action is considered to be unsafe.
+ if (IsSafeMode(cc)) return TRUE;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ bool bSave = false;
+ CFX_ByteString cFilenameInit = CFX_ByteString();
+ CFX_ByteString cFSInit = CFX_ByteString();
+
+ if(params.size()>0 && (params[0].GetType() == VT_object))
+ {
+ JSObject pObj = (JSObject )params[0];
+
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"bSave");
+ bSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+
+ pValue = JS_GetObjectElement(isolate, pObj,L"cFilenameInit");
+ {
+ CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
+ cFilenameInit = t.operator CFX_ByteString();
+ }
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cFSInit");
+ {
+ CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
+ cFSInit = t.operator CFX_ByteString();
+ }
+ }
+ else
+ {
+ if(params.size() >= 1)
+ {
+ bSave = (bool)params[0];
+ }
+ if(params.size() >= 2)
+ {
+ CJS_Value t = params[1];
+ cFilenameInit = t.operator CFX_ByteString();
+ }
+ if(params.size() >= 3)
+ {
+ CJS_Value t = params[2];
+ cFSInit = t.operator CFX_ByteString();
+ }
+ }
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ CFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit);
+ CFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit);
+ CFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit);
+ if(wsFilePath.IsEmpty())
+ return FALSE;
+
+ JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
+
+ JS_PutObjectString(isolate,pRetObj, L"cPath", SysPathToPDFPath(wsFilePath));
+ JS_PutObjectString(isolate,pRetObj, L"cURL", SysPathToPDFPath(wsFilePath));
+
+ if (!cFSInit.IsEmpty())
+ {
+ JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength())));
+ }
+ else
+ {
+ JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal("DOS"));
+ }
+
+ vRet = pRetObj;
+
+ return TRUE;
+}
+
+CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)
+{
+ CFX_WideString sRet = L"/";
+
+ for (int i=0,sz=sOldPath.GetLength(); i<sz; i++)
+ {
+ wchar_t c = sOldPath.GetAt(i);
+ if (c == L':')
+ {
+ }
+ else
+ {
+ if (c == L'\\')
+ {
+ sRet += L"/";
+ }
+ else
+ {
+ sRet += c;
+ }
+ }
+ }
+
+ return sRet;
+}
+
+CFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath)
+{
+ //strLPath = "D:\temporay.fdf";
+ CFX_WideString strOPath = sOldPath;
+ strOPath.TrimLeft();
+ strOPath.TrimRight();
+
+ if (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/')
+ {
+ wchar_t c_Drive = strOPath.GetAt(1);
+ if ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z'))
+ {
+ strOPath.Replace((FX_LPCWSTR)L"/",(FX_LPCWSTR)L"\\");
+ //strOPath.SetAt(0,'');
+ strOPath.Insert(2,':');
+ strOPath.Delete(0);
+ }
+ }
+
+ return strOPath;
+}
+
+CFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath)
+{
+// if (!PathIsRelative(sOldPath)) return sOldPath;
+
+ int nSplit = 0;
+ for (int i=sFilePath.GetLength()-1; i>=0; i--)
+ {
+ if (sFilePath[i] == '\\' || sFilePath[i] == '/')
+ {
+ nSplit = i;
+ break;
+ }
+ }
+
+ return sFilePath.Left(nSplit+1) + sOldPath;
+}
+
+FX_BOOL app::newDoc(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::openDoc(OBJ_METHOD_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::response(OBJ_METHOD_PARAMS)
+{
+ CFX_WideString swQuestion = L"";
+ CFX_WideString swLabel = L"";
+#ifndef FOXIT_CHROME_BUILD
+ CFX_WideString swTitle = L"Foxit";
+#else
+ CFX_WideString swTitle = L"PDF";
+#endif
+ CFX_WideString swDefault = L"";
+ CFX_WideString swResponse = L"";
+ bool bPassWord = false;
+
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ int iLength = params.size();
+ if (iLength > 0 && params[0].GetType() == VT_object)
+ {
+
+ JSObject pObj = (JSObject )params[0];
+ v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion");
+ swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
+ swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cDefault");
+ swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"cLabel");
+ swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
+
+ pValue = JS_GetObjectElement(isolate,pObj,L"bPassword");
+ bPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
+ }
+ else
+ {
+ switch(iLength)
+ {
+ case 1:
+ swQuestion = params[0];
+ break;
+ case 2:
+ swQuestion = params[0];
+ swTitle = params[1];
+ break;
+ case 3:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ break;
+ case 4:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ bPassWord = params[3];
+ break;
+ case 5:
+ swQuestion = params[0];
+ swTitle = params[1];
+ swDefault = params[2];
+ bPassWord = params[3];
+ swLabel = params[4];
+ break;
+ default:
+ break;
+ }
+ }
+
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CPDFDoc_Environment* pApp = pContext->GetReaderApp();
+ ASSERT(pApp != NULL);
+ int nLength = 2048;
+ char* pBuff = new char[nLength];
+ nLength = pApp->JS_appResponse(swQuestion, swTitle, swDefault, swLabel, bPassWord, pBuff, nLength);
+ if(nLength<=0)
+ {
+ vRet.SetNull();
+ return FALSE;
+ }
+ else
+ {
+ nLength = nLength>2046?2046:nLength;
+ pBuff[nLength] = 0;
+ pBuff[nLength+1] = 0;
+ swResponse = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLength);
+ vRet = swResponse;
+ }
+ delete[] pBuff;
+
+ return TRUE;
+}
+
+FX_BOOL app::media(OBJ_PROP_PARAMS)
+{
+ return FALSE;
+}
+
+FX_BOOL app::execDialog(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/color.cpp b/fpdfsdk/src/javascript/color.cpp
new file mode 100644
index 0000000000..de5a53fc5f
--- /dev/null
+++ b/fpdfsdk/src/javascript/color.cpp
@@ -0,0 +1,253 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/color.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+/* -------------------------- color -------------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Color)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Color)
+ JS_STATIC_PROP_ENTRY(black)
+ JS_STATIC_PROP_ENTRY(blue)
+ JS_STATIC_PROP_ENTRY(cyan)
+ JS_STATIC_PROP_ENTRY(dkGray)
+ JS_STATIC_PROP_ENTRY(gray)
+ JS_STATIC_PROP_ENTRY(green)
+ JS_STATIC_PROP_ENTRY(ltGray)
+ JS_STATIC_PROP_ENTRY(magenta)
+ JS_STATIC_PROP_ENTRY(red)
+ JS_STATIC_PROP_ENTRY(transparent)
+ JS_STATIC_PROP_ENTRY(white)
+ JS_STATIC_PROP_ENTRY(yellow)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Color)
+ JS_STATIC_METHOD_ENTRY(convert, 2)
+ JS_STATIC_METHOD_ENTRY(equal, 2)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Color,color)
+
+color::color(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)
+{
+ m_crTransparent = CPWL_Color(COLORTYPE_TRANSPARENT);
+ m_crBlack = CPWL_Color(COLORTYPE_GRAY, 0);
+ m_crWhite = CPWL_Color(COLORTYPE_GRAY, 1);
+ m_crRed = CPWL_Color(COLORTYPE_RGB, 1, 0 ,0);
+ m_crGreen = CPWL_Color(COLORTYPE_RGB, 0, 1 ,0);
+ m_crBlue = CPWL_Color(COLORTYPE_RGB, 0, 0 ,1);
+ m_crCyan = CPWL_Color(COLORTYPE_CMYK, 1, 0 ,0, 0);
+ m_crMagenta = CPWL_Color(COLORTYPE_CMYK, 0, 1 ,0, 0);
+ m_crYellow = CPWL_Color(COLORTYPE_CMYK, 0, 0 ,1, 0);
+ m_crDKGray = CPWL_Color(COLORTYPE_GRAY, 0.25);
+ m_crGray = CPWL_Color(COLORTYPE_GRAY, 0.5);
+ m_crLTGray = CPWL_Color(COLORTYPE_GRAY, 0.75);
+}
+
+color::~color(void)
+{
+}
+
+void color::ConvertPWLColorToArray(const CPWL_Color& color, CJS_Array& array)
+{
+ switch (color.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ array.SetElement(0, CJS_Value(array.GetIsolate(), "T"));
+ break;
+ case COLORTYPE_GRAY:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"G"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ break;
+ case COLORTYPE_RGB:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"RGB"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ array.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));
+ array.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));
+ break;
+ case COLORTYPE_CMYK:
+ array.SetElement(0, CJS_Value(array.GetIsolate(),"CMYK"));
+ array.SetElement(1, CJS_Value(array.GetIsolate(),color.fColor1));
+ array.SetElement(2, CJS_Value(array.GetIsolate(),color.fColor2));
+ array.SetElement(3, CJS_Value(array.GetIsolate(),color.fColor3));
+ array.SetElement(4, CJS_Value(array.GetIsolate(),color.fColor4));
+ break;
+ }
+}
+
+void color::ConvertArrayToPWLColor(CJS_Array& array, CPWL_Color& color)
+{
+ int nArrayLen = array.GetLength();
+ if (nArrayLen < 1) return;
+
+ CJS_Value value(array.GetIsolate());
+ CFX_ByteString sSpace;
+ array.GetElement(0, value);
+ sSpace = value;
+
+ double d1 = 0;
+ double d2 = 0;
+ double d3 = 0;
+ double d4 = 0;
+
+ if (nArrayLen > 1)
+ {
+ array.GetElement(1, value);
+ d1 = value;
+ }
+
+ if (nArrayLen > 2)
+ {
+ array.GetElement(2, value);
+ d2 = value;
+ }
+
+ if (nArrayLen > 3)
+ {
+ array.GetElement(3, value);
+ d3 = value;
+ }
+
+ if (nArrayLen > 4)
+ {
+ array.GetElement(4, value);
+ d4 = value;
+ }
+
+ if (sSpace == "T")
+ {
+ color = CPWL_Color(COLORTYPE_TRANSPARENT);
+ }
+ else if (sSpace == "G")
+ {
+ color = CPWL_Color(COLORTYPE_GRAY, (FX_FLOAT)d1);
+ }
+ else if (sSpace == "RGB")
+ {
+ color = CPWL_Color(COLORTYPE_RGB, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3);
+ }
+ else if (sSpace == "CMYK")
+ {
+ color = CPWL_Color(COLORTYPE_CMYK, (FX_FLOAT)d1, (FX_FLOAT)d2, (FX_FLOAT)d3, (FX_FLOAT)d4);
+ }
+}
+
+#define JS_IMPLEMENT_COLORPROP(prop, var)\
+FX_BOOL color::prop(OBJ_PROP_PARAMS)\
+{\
+ CJS_Context* pContext = (CJS_Context*)cc;\
+ v8::Isolate* isolate = pContext->GetJSRuntime()->GetIsolate();\
+ if (vp.IsGetting())\
+ {\
+ CJS_Array array(isolate);\
+ ConvertPWLColorToArray(var, array);\
+ vp << array;\
+ }\
+ else\
+ {\
+ CJS_Array array(isolate);\
+ if (!vp.ConvertToArray(array)) return FALSE;\
+ ConvertArrayToPWLColor(array, var);\
+ }\
+ return TRUE;\
+}
+
+JS_IMPLEMENT_COLORPROP(transparent, m_crTransparent)
+JS_IMPLEMENT_COLORPROP(black, m_crBlack)
+JS_IMPLEMENT_COLORPROP(white, m_crWhite)
+JS_IMPLEMENT_COLORPROP(red, m_crRed)
+JS_IMPLEMENT_COLORPROP(green, m_crGreen)
+JS_IMPLEMENT_COLORPROP(blue, m_crBlue)
+JS_IMPLEMENT_COLORPROP(cyan, m_crCyan)
+JS_IMPLEMENT_COLORPROP(magenta, m_crMagenta)
+JS_IMPLEMENT_COLORPROP(yellow, m_crYellow)
+JS_IMPLEMENT_COLORPROP(dkGray, m_crDKGray)
+JS_IMPLEMENT_COLORPROP(gray, m_crGray)
+JS_IMPLEMENT_COLORPROP(ltGray, m_crLTGray)
+
+FX_BOOL color::convert(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ int iSize = params.size();
+ if (iSize < 2) return FALSE;
+ CJS_Array aSource(isolate);
+ if (!params[0].ConvertToArray(aSource)) return FALSE;
+
+ CPWL_Color crSource;
+ ConvertArrayToPWLColor(aSource, crSource);
+
+ CFX_ByteString sDestSpace = params[1];
+
+ int nColorType = COLORTYPE_TRANSPARENT;
+
+ if (sDestSpace == "T")
+ {
+ nColorType = COLORTYPE_TRANSPARENT;
+ }
+ else if (sDestSpace == "G")
+ {
+ nColorType = COLORTYPE_GRAY;
+ }
+ else if (sDestSpace == "RGB")
+ {
+ nColorType = COLORTYPE_RGB;
+ }
+ else if (sDestSpace == "CMYK")
+ {
+ nColorType = COLORTYPE_CMYK;
+ }
+
+ CJS_Array aDest(isolate);
+ CPWL_Color crDest = crSource;
+ crDest.ConvertColorType(nColorType);
+ ConvertPWLColorToArray(crDest, aDest);
+ vRet = aDest;
+
+ return TRUE;
+}
+
+FX_BOOL color::equal(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ if (params.size() < 2) return FALSE;
+
+ CJS_Array array1(isolate), array2(isolate);
+
+ if (!params[0].ConvertToArray(array1)) return FALSE;
+ if (!params[1].ConvertToArray(array2)) return FALSE;
+
+ CPWL_Color color1;
+ CPWL_Color color2;
+
+ ConvertArrayToPWLColor(array1, color1);
+ ConvertArrayToPWLColor(array2, color2);
+
+ color1.ConvertColorType(color2.nColorType);
+
+ vRet = color1 == color2;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/console.cpp b/fpdfsdk/src/javascript/console.cpp
new file mode 100644
index 0000000000..25e5559a06
--- /dev/null
+++ b/fpdfsdk/src/javascript/console.cpp
@@ -0,0 +1,78 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/console.h"
+//#include "../../include/javascript/JS_Module.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../../include/javascript/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+
+/* ------------------------ console ------------------------ */
+
+BEGIN_JS_STATIC_CONST(CJS_Console)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Console)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Console)
+ JS_STATIC_METHOD_ENTRY(clear, 0)
+ JS_STATIC_METHOD_ENTRY(hide, 0)
+ JS_STATIC_METHOD_ENTRY(println, 1)
+ JS_STATIC_METHOD_ENTRY(show, 0)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Console,console)
+
+#define MAXCONSOLECONTENTS 10000
+
+console::console(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject)
+{
+}
+
+console::~console()
+{
+}
+
+FX_BOOL console::clear(OBJ_METHOD_PARAMS)
+{
+
+
+
+ return TRUE;
+}
+
+FX_BOOL console::hide(OBJ_METHOD_PARAMS)
+{
+
+
+
+
+ return TRUE;
+}
+
+FX_BOOL console::println(OBJ_METHOD_PARAMS)
+{
+ if (params.size() < 1)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL console::show(OBJ_METHOD_PARAMS)
+{
+ return TRUE;
+}
+
+
+
diff --git a/fpdfsdk/src/javascript/event.cpp b/fpdfsdk/src/javascript/event.cpp
new file mode 100644
index 0000000000..9168a2e0cf
--- /dev/null
+++ b/fpdfsdk/src/javascript/event.cpp
@@ -0,0 +1,379 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/JS_EventHandler.h"
+//#include "../include/JS_ResMgr.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/event.h"
+#include "../../include/javascript/Field.h"
+
+/* -------------------------- event -------------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Event)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Event)
+ JS_STATIC_PROP_ENTRY(change)
+ JS_STATIC_PROP_ENTRY(changeEx)
+ JS_STATIC_PROP_ENTRY(commitKey)
+ JS_STATIC_PROP_ENTRY(fieldFull)
+ JS_STATIC_PROP_ENTRY(keyDown)
+ JS_STATIC_PROP_ENTRY(modifier)
+ JS_STATIC_PROP_ENTRY(name)
+ JS_STATIC_PROP_ENTRY(rc)
+ JS_STATIC_PROP_ENTRY(richChange)
+ JS_STATIC_PROP_ENTRY(richChangeEx)
+ JS_STATIC_PROP_ENTRY(richValue)
+ JS_STATIC_PROP_ENTRY(selEnd)
+ JS_STATIC_PROP_ENTRY(selStart)
+ JS_STATIC_PROP_ENTRY(shift)
+ JS_STATIC_PROP_ENTRY(source)
+ JS_STATIC_PROP_ENTRY(target)
+ JS_STATIC_PROP_ENTRY(targetName)
+ JS_STATIC_PROP_ENTRY(type)
+ JS_STATIC_PROP_ENTRY(value)
+ JS_STATIC_PROP_ENTRY(willCommit)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Event)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Event,event)
+
+event::event(CJS_Object * pJsObject) : CJS_EmbedObj(pJsObject)
+{
+}
+
+event::~event(void)
+{
+}
+
+FX_BOOL event::change(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ CFX_WideString &wChange = pEvent->Change();
+ if (vp.IsSetting())
+ {
+ if (vp.GetType() == VT_string)
+ vp >> wChange;
+ }
+ else
+ {
+ vp << wChange;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::changeEx(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->ChangeEx();
+ return TRUE;
+}
+
+FX_BOOL event::commitKey(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->CommitKey();
+ return TRUE;
+}
+
+FX_BOOL event::fieldFull(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (!vp.IsGetting() && wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
+ return FALSE;
+
+ if (pEvent->FieldFull())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::keyDown(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->KeyDown())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::modifier(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->Modifier())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::name(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Name();
+ return TRUE;
+}
+
+FX_BOOL event::rc(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ FX_BOOL &bRc = pEvent->Rc();
+ if (vp.IsSetting())
+ {
+ vp>>bRc;
+ }
+ else
+ {
+ vp<<bRc;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::richChange(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::richChangeEx(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+
+FX_BOOL event::richValue(OBJ_PROP_PARAMS)
+{
+ return TRUE;
+ if (vp.IsSetting())
+ {
+ }
+ else
+ {
+ ;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::selEnd(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
+ {
+ return TRUE;
+ }
+
+ int &iSelEnd = pEvent->SelEnd();
+ if (vp.IsSetting())
+ {
+ vp >> iSelEnd;
+ }
+ else
+ {
+ vp << iSelEnd;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::selStart(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
+ {
+ return TRUE;
+ }
+ int &iSelStart = pEvent->SelStart();
+ if (vp.IsSetting())
+ {
+ vp >> iSelStart;
+ }
+ else
+ {
+ vp << iSelStart;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::shift(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->Shift())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
+FX_BOOL event::source(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Source()->GetJSObject();
+ return TRUE;
+}
+
+FX_BOOL event::target(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp<<pEvent->Target_Field()->GetJSObject();
+ return TRUE;
+}
+
+FX_BOOL event::targetName(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->TargetName();
+ return TRUE;
+}
+
+FX_BOOL event::type(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ vp << pEvent->Type();
+ return TRUE;
+}
+
+FX_BOOL event::value(OBJ_PROP_PARAMS)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (wcscmp((const wchar_t*)pEvent->Type(),L"Field") != 0)
+ return FALSE;
+ if(!pEvent->m_pValue)
+ return FALSE;
+ CFX_WideString & val = pEvent->Value();
+ if (vp.IsSetting())
+ {
+ val = vp;
+ }
+ else
+ {
+ vp << val;
+ }
+ return TRUE;
+}
+
+FX_BOOL event::willCommit(OBJ_PROP_PARAMS)
+{
+ if (!vp.IsGetting())return FALSE;
+
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+ CJS_EventHandler* pEvent = pContext->GetEventHandler();
+ ASSERT(pEvent != NULL);
+
+ if (pEvent->WillCommit())
+ vp << TRUE;
+ else
+ vp << FALSE;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/global.cpp b/fpdfsdk/src/javascript/global.cpp
new file mode 100644
index 0000000000..984ba55cb4
--- /dev/null
+++ b/fpdfsdk/src/javascript/global.cpp
@@ -0,0 +1,550 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/JS_GlobalData.h"
+#include "../../include/javascript/global.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Context.h"
+
+/* ---------------------------- global ---------------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Global)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Global)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Global)
+ JS_STATIC_METHOD_ENTRY(setPersistent, 2)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global);
+
+FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context*)cc;
+ ASSERT(pContext != NULL);
+
+ global_alternate* pGlobal = (global_alternate*)GetEmbedObject();
+ ASSERT(pGlobal != NULL);
+
+ pGlobal->Initial(pContext->GetReaderApp());
+
+ return TRUE;
+};
+
+global_alternate::global_alternate(CJS_Object* pJSObject)
+ : CJS_EmbedObj(pJSObject),
+ m_pApp(NULL)
+{
+}
+
+global_alternate::~global_alternate(void)
+{
+ ASSERT(m_pApp != NULL);
+
+// CommitGlobalPersisitentVariables();
+ DestroyGlobalPersisitentVariables();
+
+ CJS_RuntimeFactory* pFactory = m_pApp->m_pJSRuntimeFactory;
+ ASSERT(pFactory);
+
+ pFactory->ReleaseGlobalData();
+}
+
+void global_alternate::Initial(CPDFDoc_Environment* pApp)
+{
+ m_pApp = pApp;
+
+ CJS_RuntimeFactory* pFactory = pApp->m_pJSRuntimeFactory;
+ ASSERT(pFactory);
+ m_pGlobalData = pFactory->NewGlobalData(pApp);
+ UpdateGlobalPersistentVariables();
+}
+
+FX_BOOL global_alternate::QueryProperty(FX_LPCWSTR propname)
+{
+ return CFX_WideString(propname) != L"setPersistent";
+}
+
+FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, JS_ErrorString& sError)
+{
+ js_global_data* pData = NULL;
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+
+ if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))
+ {
+ pData->bDeleted = TRUE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue& vp, JS_ErrorString& sError)
+{
+ if (vp.IsSetting())
+ {
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+ switch (vp.GetType())
+ {
+ case VT_number:
+ {
+ double dData;
+ vp >> dData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_boolean:
+ {
+ bool bData;
+ vp >> bData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)vp, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_string:
+ {
+ CFX_ByteString sData;
+ vp >> sData;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_object:
+ {
+ JSObject pData = (JSObject)vp;
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
+// else
+// {
+// if (vp.IsArrayObject())
+// {
+// CJS_Array array;
+// vp.ConvertToArray(array);
+// return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
+// (Dobject*)(Darray*)array, FALSE);
+// }
+// else
+// return FALSE;
+// }
+ }
+ case VT_null:
+ {
+ return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Handle<v8::Object>(), FALSE);
+ }
+ case VT_undefined:
+ {
+ DelProperty(cc, propname, sError);
+ return TRUE;
+ }
+ default:
+ return FALSE;
+ }
+ }
+ else
+ {
+ js_global_data* pData = NULL;
+ CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
+
+ if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData))
+ {
+ if (pData)
+ {
+ if (!pData->bDeleted)
+ {
+ switch (pData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ vp << pData->dData;
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ vp << pData->bData;
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ vp << pData->sData;
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);
+ vp << obj;
+ break;
+ }
+ case JS_GLOBALDATA_TYPE_NULL:
+ vp.SetNull();
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+ }
+ else
+ {
+ return TRUE;
+ }
+ }
+ else
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+ }
+ else
+ {
+ vp.SetNull();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_BOOL global_alternate::setPersistent(OBJ_METHOD_PARAMS)
+{
+ if (params.size() != 2)
+ {
+ //sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+ return FALSE;
+ }
+
+ CFX_ByteString sName = params[0];
+
+ js_global_data* pData = NULL;
+ if (m_mapGlobal.Lookup(sName, (FX_LPVOID&)pData))
+ {
+ if (pData && !pData->bDeleted)
+ {
+ pData->bPersistent = (bool)params[1];
+ return TRUE;
+ }
+ }
+
+ //sError = JSGetStringFromID(IDS_JSPARAM_INCORRECT);
+ return FALSE;
+}
+
+void global_alternate::UpdateGlobalPersistentVariables()
+{
+ ASSERT(m_pGlobalData != NULL);
+
+ for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)
+ {
+ CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
+ ASSERT(pData != NULL);
+
+ switch (pData->data.nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), pData->data.dData);
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), (bool)(pData->data.bData == 1));
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectString(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(),
+ pData->data.sData.UTF8Decode());
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+ v8::Handle<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+
+ PutObjectProperty(pObj, &pData->data);
+
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
+ (JSObject)pObj, pData->bPersistent == 1);
+ JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode(), (JSObject)pObj);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Handle<v8::Object>(), pData->bPersistent == 1);
+ JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),
+ pData->data.sKey.UTF8Decode());
+ break;
+ }
+ }
+}
+
+void global_alternate::CommitGlobalPersisitentVariables()
+{
+ ASSERT(m_pGlobalData != NULL);
+
+ FX_POSITION pos = m_mapGlobal.GetStartPosition();
+ while (pos)
+ {
+ CFX_ByteString name;
+ js_global_data* pData = NULL;
+ m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);
+
+ if (pData)
+ {
+ if (pData->bDeleted)
+ {
+ m_pGlobalData->DeleteGlobalVariable(name);
+ }
+ else
+ {
+ switch (pData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
+ m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
+ m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ m_pGlobalData->SetGlobalVariableString(name, pData->sData);
+ m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ //if (pData->pData)
+ {
+ CJS_GlobalVariableArray array;
+ v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);
+ ObjectToArray(obj, array);
+ m_pGlobalData->SetGlobalVariableObject(name, array);
+ m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ m_pGlobalData->SetGlobalVariableNull(name);
+ m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
+ break;
+ }
+ }
+ }
+ }
+}
+
+void global_alternate::ObjectToArray(v8::Handle<v8::Object> pObj, CJS_GlobalVariableArray& array)
+{
+ v8::Handle<v8::Array> pKeyList = JS_GetObjectElementNames(pObj);
+ int nObjElements = pKeyList->Length();
+
+ v8::Local<v8::Context> context = pObj->CreationContext();
+ v8::Isolate* isolate = context->GetIsolate();
+
+ for (int i=0; i<nObjElements; i++)
+ {
+
+ CFX_WideString ws = JS_ToString(JS_GetArrayElemnet(pKeyList, i));
+ CFX_ByteString sKey = ws.UTF8Encode();
+
+ v8::Handle<v8::Value> v = JS_GetObjectElement(isolate, pObj, (const wchar_t*)(FX_LPCWSTR)ws);
+ FXJSVALUETYPE vt = GET_VALUE_TYPE(v);
+ switch (vt)
+ {
+ case VT_number:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pObjElement->sKey = sKey;
+ pObjElement->dData = JS_ToNumber(v);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_boolean:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pObjElement->sKey = sKey;
+ pObjElement->dData = JS_ToBoolean(v);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_string:
+ {
+ CFX_ByteString sValue = CJS_Value(isolate, v, VT_string);
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_STRING;
+ pObjElement->sKey = sKey;
+ pObjElement->sData = sValue;
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_object:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pObjElement->sKey = sKey;
+ ObjectToArray(JS_ToObject(v), pObjElement->objData);
+ array.Add(pObjElement);
+ }
+ break;
+ case VT_null:
+ {
+ CJS_KeyValue* pObjElement = new CJS_KeyValue;
+ pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
+ pObjElement->sKey = sKey;
+ array.Add(pObjElement);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void global_alternate::PutObjectProperty(v8::Handle<v8::Object> pObj, CJS_KeyValue* pData)
+{
+ ASSERT(pData != NULL);
+
+ for (int i=0,sz=pData->objData.Count(); i<sz; i++)
+ {
+ CJS_KeyValue* pObjData = pData->objData.GetAt(i);
+ ASSERT(pObjData != NULL);
+
+ switch (pObjData->nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->dData);
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), (bool)(pObjData->bData == 1));
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode(), pObjData->sData.UTF8Decode());
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
+ v8::Handle<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
+ PutObjectProperty(pNewObj, pObjData);
+ JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode(), (JSObject)pNewObj);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode());
+ break;
+ }
+ }
+}
+
+void global_alternate::DestroyGlobalPersisitentVariables()
+{
+ FX_POSITION pos = m_mapGlobal.GetStartPosition();
+ while (pos)
+ {
+ CFX_ByteString name;
+ js_global_data* pData = NULL;
+ m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData);
+ delete pData;
+ }
+
+ m_mapGlobal.RemoveAll();
+}
+
+
+FX_BOOL global_alternate::SetGlobalVariables(FX_LPCSTR propname, int nType,
+ double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)
+{
+ if (propname == NULL) return FALSE;
+
+ js_global_data* pTemp = NULL;
+ m_mapGlobal.Lookup(propname, (FX_LPVOID&)pTemp);
+
+ if (pTemp)
+ {
+ if (pTemp->bDeleted || pTemp->nType != nType)
+ {
+ pTemp->dData = 0;
+ pTemp->bData = 0;
+ pTemp->sData = "";
+ pTemp->nType = nType;
+ }
+
+ pTemp->bDeleted = FALSE;
+
+ switch (nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ pTemp->dData = dData;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ pTemp->bData = bData;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ pTemp->sData = sData;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ pTemp->pData.Reset(JS_GetRuntime(pData), pData);
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ break;
+ default:
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ js_global_data* pNewData = NULL;
+
+ switch (nType)
+ {
+ case JS_GLOBALDATA_TYPE_NUMBER:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
+ pNewData->dData = dData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_BOOLEAN:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
+ pNewData->bData = bData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_STRING:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
+ pNewData->sData = sData;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_OBJECT:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
+ pNewData->pData.Reset(JS_GetRuntime(pData), pData);
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ case JS_GLOBALDATA_TYPE_NULL:
+ {
+ pNewData = new js_global_data;
+ pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
+ pNewData->bPersistent = bDefaultPersistent;
+ }
+ break;
+ default:
+ return FALSE;
+ }
+
+ m_mapGlobal.SetAt(propname, (FX_LPVOID)pNewData);
+
+ return TRUE;
+}
diff --git a/fpdfsdk/src/javascript/report.cpp b/fpdfsdk/src/javascript/report.cpp
new file mode 100644
index 0000000000..5063c68e4c
--- /dev/null
+++ b/fpdfsdk/src/javascript/report.cpp
@@ -0,0 +1,50 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/report.h"
+
+/* ---------------------- report ---------------------- */
+
+BEGIN_JS_STATIC_CONST(CJS_Report)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Report)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Report)
+ JS_STATIC_METHOD_ENTRY(save, 1)
+ JS_STATIC_METHOD_ENTRY(writeText,1)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Report, Report)
+
+Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject)
+{
+
+}
+
+Report::~Report()
+{
+
+}
+
+FX_BOOL Report::writeText(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
+FX_BOOL Report::save(OBJ_METHOD_PARAMS)
+{
+ if (IsSafeMode(cc)) return TRUE;
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp
new file mode 100644
index 0000000000..b7303a7578
--- /dev/null
+++ b/fpdfsdk/src/javascript/util.cpp
@@ -0,0 +1,649 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/javascript/JavaScript.h"
+#include "../../include/javascript/IJavaScript.h"
+#include "../../include/javascript/JS_Define.h"
+#include "../../include/javascript/JS_Object.h"
+#include "../../include/javascript/JS_Value.h"
+#include "../../include/javascript/util.h"
+#include "../../include/javascript/PublicMethods.h"
+#include "../../include/javascript/resource.h"
+#include "../../include/javascript/JS_Context.h"
+#include "../../include/javascript/JS_EventHandler.h"
+#include "../../include/javascript/JS_Runtime.h"
+
+#if _FX_OS_ == _FX_ANDROID_
+#include <ctype.h>
+#endif
+
+static v8::Isolate* GetIsolate(IFXJS_Context* cc)
+{
+ CJS_Context* pContext = (CJS_Context *)cc;
+ ASSERT(pContext != NULL);
+
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+ ASSERT(pRuntime != NULL);
+
+ return pRuntime->GetIsolate();
+}
+
+BEGIN_JS_STATIC_CONST(CJS_Util)
+END_JS_STATIC_CONST()
+
+BEGIN_JS_STATIC_PROP(CJS_Util)
+END_JS_STATIC_PROP()
+
+BEGIN_JS_STATIC_METHOD(CJS_Util)
+ JS_STATIC_METHOD_ENTRY(printd, 3)
+ JS_STATIC_METHOD_ENTRY(printf, 20)
+ JS_STATIC_METHOD_ENTRY(printx, 2)
+ JS_STATIC_METHOD_ENTRY(scand, 2)
+ JS_STATIC_METHOD_ENTRY(byteToChar, 1)
+END_JS_STATIC_METHOD()
+
+IMPLEMENT_JS_CLASS(CJS_Util,util)
+
+util::util(CJS_Object *pJSObject) : CJS_EmbedObj(pJSObject)
+{
+}
+
+util::~util(void)
+{
+}
+
+
+struct stru_TbConvert
+{
+ FX_LPCWSTR lpszJSMark;
+ FX_LPCWSTR lpszCppMark;
+};
+
+const stru_TbConvert fcTable[] = {
+ (FX_LPCWSTR)L"mmmm", (FX_LPCWSTR)L"%B",
+ (FX_LPCWSTR)L"mmm", (FX_LPCWSTR)L"%b",
+ (FX_LPCWSTR)L"mm", (FX_LPCWSTR)L"%m",
+ //"m"
+ (FX_LPCWSTR)L"dddd", (FX_LPCWSTR)L"%A",
+ (FX_LPCWSTR)L"ddd", (FX_LPCWSTR)L"%a",
+ (FX_LPCWSTR)L"dd", (FX_LPCWSTR)L"%d",
+ //"d", "%w",
+ (FX_LPCWSTR)L"yyyy", (FX_LPCWSTR)L"%Y",
+ (FX_LPCWSTR)L"yy", (FX_LPCWSTR)L"%y",
+ (FX_LPCWSTR)L"HH", (FX_LPCWSTR)L"%H",
+ //"H"
+ (FX_LPCWSTR)L"hh", (FX_LPCWSTR)L"%I",
+ //"h"
+ (FX_LPCWSTR)L"MM", (FX_LPCWSTR)L"%M",
+ //"M"
+ (FX_LPCWSTR)L"ss", (FX_LPCWSTR)L"%S",
+ //"s
+ (FX_LPCWSTR)L"TT", (FX_LPCWSTR)L"%p",
+ //"t"
+#if defined(_WIN32)
+ (FX_LPCWSTR)L"tt", (FX_LPCWSTR)L"%p",
+ (FX_LPCWSTR)L"h", (FX_LPCWSTR)L"%#I",
+#else
+ (FX_LPCWSTR)L"tt", (FX_LPCWSTR)L"%P",
+ (FX_LPCWSTR)L"h", (FX_LPCWSTR)L"%l",
+#endif
+};
+
+#define UTIL_INT 0
+#define UTIL_DOUBLE 1
+#define UTIL_STRING 2
+
+int util::ParstDataType(std::wstring* sFormat)
+{
+ size_t i = 0;
+ bool bPercent = FALSE;
+ for (i=0; i<sFormat->length(); ++i)
+ {
+ wchar_t c = (*sFormat)[i];
+ if (c == L'%')
+ {
+ bPercent = true;
+ continue;
+ }
+
+ if (bPercent)
+ {
+ if (c == L'c' || c == L'C' || c == L'd' || c == L'i' || c == L'o' || c == L'u' || c == L'x' || c == L'X')
+ {
+ return UTIL_INT;
+ }
+ else if (c == L'e' || c == L'E' || c == L'f' || c == L'g' || c == L'G')
+ {
+ return UTIL_DOUBLE;
+ }
+ else if (c == L's' || c == L'S')
+ {
+ // Map s to S since we always deal internally
+ // with wchar_t strings.
+ (*sFormat)[i] = L'S';
+ return UTIL_STRING;
+ }
+ else if (c == L'.' || c == L'+' || c == L'-' || c == L'#' || c == L' ' || CJS_PublicMethods::IsDigit(c))
+ {
+ continue;
+ }
+ else break;
+ }
+ }
+
+ return -1;
+}
+
+FX_BOOL util::printf(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize < 1)
+ return FALSE;
+ std::wstring c_ConvChar((const wchar_t*)(FX_LPCWSTR)params[0].operator CFX_WideString());
+ std::vector<std::wstring> c_strConvers;
+ int iOffset = 0;
+ int iOffend = 0;
+ c_ConvChar.insert(c_ConvChar.begin(),L'S');
+ while(iOffset != -1)
+ {
+ iOffend = c_ConvChar.find(L"%",iOffset+1);
+ std::wstring strSub;
+ if (iOffend == -1)
+ strSub = c_ConvChar.substr(iOffset);
+ else
+ strSub = c_ConvChar.substr(iOffset ,iOffend - iOffset);
+ c_strConvers.push_back(strSub);
+ iOffset = iOffend ;
+ }
+
+ std::wstring c_strResult;
+
+ //for(int iIndex = 1;iIndex < params.size();iIndex++)
+ std::wstring c_strFormat;
+ for(int iIndex = 0;iIndex < (int)c_strConvers.size();iIndex++)
+ {
+ c_strFormat = c_strConvers[iIndex];
+ if (iIndex == 0)
+ {
+ c_strResult = c_strFormat;
+ continue;
+ }
+
+
+ CFX_WideString strSegment;
+ if (iIndex >= iSize) {
+ c_strResult += c_strFormat;
+ continue;
+ }
+
+ switch (ParstDataType(&c_strFormat))
+ {
+ case UTIL_INT:
+ strSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(int)params[iIndex]);
+ break;
+ case UTIL_DOUBLE:
+ strSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(double)params[iIndex]);
+ break;
+ case UTIL_STRING:
+ strSegment.Format((FX_LPCWSTR)c_strFormat.c_str(),(FX_LPCWSTR)params[iIndex].operator CFX_WideString());
+ break;
+ default:
+ strSegment.Format((FX_LPCWSTR)L"%S", (FX_LPCWSTR)c_strFormat.c_str());
+ break;
+ }
+ c_strResult += (wchar_t*)strSegment.GetBuffer(strSegment.GetLength()+1);
+ }
+
+ c_strResult.erase(c_strResult.begin());
+ vRet = (FX_LPCWSTR)c_strResult.c_str();
+ return TRUE;
+}
+
+FX_BOOL util::printd(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+
+ int iSize = params.size();
+ if (iSize < 2)
+ return FALSE;
+
+ CJS_Value p1(isolate);
+ p1 = params[0];
+
+ CJS_Value p2 = params[1];
+ CJS_Date jsDate(isolate);
+ if (!p2.ConvertToDate(jsDate))
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
+ return FALSE;
+ }
+
+ if (!jsDate.IsValidDate())
+ {
+ sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
+ return FALSE;
+ }
+
+ if (p1.GetType() == VT_number)
+ {
+ int nFormat = p1;
+
+ CFX_WideString swResult;
+
+ switch (nFormat)
+ {
+ case 0:
+ swResult.Format((FX_LPCWSTR)L"D:%04d%02d%02d%02d%02d%02d",
+ jsDate.GetYear(),
+ jsDate.GetMonth() + 1,
+ jsDate.GetDay(),
+ jsDate.GetHours(),
+ jsDate.GetMinutes(),
+ jsDate.GetSeconds());
+ break;
+ case 1:
+ swResult.Format((FX_LPCWSTR)L"%04d.%02d.%02d %02d:%02d:%02d",
+ jsDate.GetYear(),
+ jsDate.GetMonth() + 1,
+ jsDate.GetDay(),
+ jsDate.GetHours(),
+ jsDate.GetMinutes(),
+ jsDate.GetSeconds());
+ break;
+ case 2:
+ swResult.Format((FX_LPCWSTR)L"%04d/%02d/%02d %02d:%02d:%02d",
+ jsDate.GetYear(),
+ jsDate.GetMonth() + 1,
+ jsDate.GetDay(),
+ jsDate.GetHours(),
+ jsDate.GetMinutes(),
+ jsDate.GetSeconds());
+ break;
+ default:
+ return FALSE;
+ }
+
+ vRet = swResult;
+ return TRUE;
+ }
+ else if (p1.GetType() == VT_string)
+ {
+ std::basic_string<wchar_t> cFormat = (wchar_t*)(FX_LPCWSTR)p1.operator CFX_WideString();
+
+ bool bXFAPicture = false;
+ if (iSize > 2)
+ {
+ //CJS_Value value;
+ bXFAPicture = params[2];
+ }
+
+ if (bXFAPicture)
+ {
+ return FALSE; //currently, it doesn't support XFAPicture.
+ }
+
+ int iIndex;
+ for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+ {
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark, iStart)) != -1)
+ {
+ cFormat.replace(iEnd, FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].lpszCppMark);
+ iStart = iEnd;
+ }
+ }
+
+ int iYear,iMonth,iDay,iHour,iMin,iSec;
+ iYear = jsDate.GetYear();
+ iMonth = jsDate.GetMonth();
+ iDay = jsDate.GetDay();
+ iHour = jsDate.GetHours();
+ iMin = jsDate.GetMinutes();
+ iSec = jsDate.GetSeconds();
+
+ struct tm time = {0};
+ time.tm_year = iYear-1900;
+ time.tm_mon = iMonth;
+ time.tm_mday = iDay;
+ time.tm_hour = iHour;
+ time.tm_min = iMin;
+ time.tm_sec = iSec;
+ //COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
+ //CString strFormat = cppTm.Format(cFormat.c_str());
+
+ struct stru_TbConvertAd
+ {
+ FX_LPCWSTR lpszJSMark;
+ int iValue;
+ };
+
+ stru_TbConvertAd cTableAd[] ={
+ (FX_LPCWSTR)L"m", iMonth+1,
+ (FX_LPCWSTR)L"d", iDay,
+ (FX_LPCWSTR)L"H", iHour,
+ (FX_LPCWSTR)L"h", iHour>12?iHour-12:iHour,
+ (FX_LPCWSTR)L"M", iMin,
+ (FX_LPCWSTR)L"s", iSec
+ };
+
+ //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+ for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+ {
+ wchar_t tszValue[10];
+ //_itot(cTableAd[iIndex].iValue,tszValue,10);
+ CFX_WideString sValue;
+ sValue.Format((FX_LPCWSTR)L"%d",cTableAd[iIndex].iValue);
+ memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),
+ (sValue.GetLength()+1)*sizeof(wchar_t));
+
+ //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+ //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ if (iEnd > 0)
+ {
+ if (cFormat[iEnd-1] == L'%')
+ {
+ iStart = iEnd+1;
+ continue;
+ }
+ }
+ cFormat.replace(iEnd, FXSYS_wcslen(cTableAd[iIndex].lpszJSMark), tszValue);
+ iStart = iEnd;
+ }
+ }
+
+ CFX_WideString strFormat;
+// strFormat.Format((FX_LPCWSTR)L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
+// CString strFormat = cppTm.Format(cFormat.c_str());
+ wchar_t buf[64] = {0};
+ strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+ cFormat = buf;
+ vRet = (FX_LPCWSTR)cFormat.c_str();
+ //rtRet = strFormat.GetBuffer(strFormat.GetLength()+1);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void util::printd(const std::wstring &cFormat2, CJS_Date jsDate, bool bXFAPicture, std::wstring &cPurpose)
+{
+ std::wstring cFormat = cFormat2;
+
+ if (bXFAPicture)
+ {
+ return ; //currently, it doesn't support XFAPicture.
+ }
+
+ int iIndex;
+ for(iIndex = 0;iIndex<sizeof(fcTable)/sizeof(stru_TbConvert);iIndex++)
+ {
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)fcTable[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ cFormat.replace(iEnd,FXSYS_wcslen(fcTable[iIndex].lpszJSMark), (CFX_WideString)fcTable[iIndex].lpszCppMark);
+ iStart = iEnd;
+ }
+ }
+
+ int iYear,iMonth,iDay,iHour,iMin,iSec;
+ iYear = jsDate.GetYear();
+ iMonth = jsDate.GetMonth();
+ iDay = jsDate.GetDay();
+ iHour = jsDate.GetHours();
+ iMin = jsDate.GetMinutes();
+ iSec = jsDate.GetSeconds();
+
+ struct tm time = {0};
+ time.tm_year = iYear-1900;
+ time.tm_mon = iMonth;
+ time.tm_mday = iDay;
+ time.tm_hour = iHour;
+ time.tm_min = iMin;
+ time.tm_sec = iSec;
+// COleDateTime cppTm(iYear,iMonth+1,iDay,iHour,iMin,iSec);
+ //CString strFormat = cppTm.Format(cFormat.c_str());
+
+ struct stru_TbConvertAd
+ {
+ FX_LPCWSTR lpszJSMark;
+ int iValue;
+ };
+
+ stru_TbConvertAd cTableAd[] ={
+ (FX_LPCWSTR)L"m", iMonth+1,
+ (FX_LPCWSTR)L"d", iDay,
+ (FX_LPCWSTR)L"H", iHour,
+ (FX_LPCWSTR)L"h", iHour>12?iHour-12:iHour,
+ (FX_LPCWSTR)L"M", iMin,
+ (FX_LPCWSTR)L"s", iSec
+ };
+
+ //cFormat = strFormat.GetBuffer(strFormat.GetLength()+1);
+ for(iIndex = 0;iIndex<sizeof(cTableAd)/sizeof(stru_TbConvertAd);iIndex++)
+ {
+ wchar_t tszValue[10];
+ //_itot(cTableAd[iIndex].iValue,tszValue,10);
+ CFX_WideString sValue;
+ sValue.Format((FX_LPCWSTR)L"%d",cTableAd[iIndex].iValue);
+ memcpy(tszValue, (wchar_t *)sValue.GetBuffer(sValue.GetLength()+1),sValue.GetLength()*sizeof(wchar_t));
+
+
+ //strFormat.Replace(cTableAd[iIndex].lpszJSMark,"%d");
+ //strFormat.Format(strFormat,cTableAd[iIndex].iValue);
+ int iStart = 0;
+ int iEnd;
+ while((iEnd = cFormat.find((CFX_WideString)cTableAd[iIndex].lpszJSMark,iStart)) != -1)
+ {
+ if (iEnd > 0)
+ {
+ if (cFormat[iEnd-1] == L'%')
+ {
+ iStart = iEnd+1;
+ continue;
+ }
+ }
+ cFormat.replace(iEnd,FXSYS_wcslen(cTableAd[iIndex].lpszJSMark),tszValue);
+ iStart = iEnd;
+ }
+ }
+
+ CFX_WideString strFormat;
+// strFormat.Format((FX_LPCWSTR)L"%d,%d,%d,%d,%d,%d",iYear, iMonth, iDay, iHour, iMin, iSec);
+// CString strFormat = cppTm.Format(cFormat.c_str());
+ wchar_t buf[64] = {0};
+ strFormat = wcsftime(buf, 64, cFormat.c_str(), &time);
+ cFormat = buf;
+ cPurpose = cFormat;
+}
+
+FX_BOOL util::printx(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize<2)
+ return FALSE;
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+ CFX_WideString sSource = params[1].operator CFX_WideString();
+ std::string cFormat = (FX_LPCSTR)CFX_ByteString::FromUnicode(sFormat);
+ std::string cSource = (FX_LPCSTR)CFX_ByteString::FromUnicode(sSource);
+ std::string cDest;
+ printx(cFormat,cSource,cDest);
+ vRet = cDest.c_str();
+ return TRUE;
+}
+
+void util::printx(const std::string &cFormat,const std::string &cSource2,std::string &cPurpose)
+{
+ std::string cSource(cSource2);
+ if (!cPurpose.empty())
+ //cPurpose.clear();
+ cPurpose.erase();
+ int itSource = 0;
+ int iSize = cSource.size();
+ for(int iIndex = 0; iIndex < (int)cFormat.size() && itSource<iSize; iIndex++)
+ {
+ char letter = cFormat[iIndex];
+ switch(letter)
+ {
+ case '?':
+ //cPurpose.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ case 'X':
+ {
+ while(itSource < iSize)
+ {
+ if ((cSource[itSource]>='0'&&cSource[itSource]<='9') || (cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+ {
+ //cPurpose.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ }
+ itSource++;
+ }
+ break;
+ }
+ break;
+ case 'A':
+ {
+ while(itSource < iSize)
+ {
+ if ((cSource[itSource]>='a' && cSource[itSource]<='z') || (cSource[itSource]>='A' && cSource[itSource]<='Z'))
+ {
+ //cPurpose.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ }
+ itSource++;
+ }
+ break;
+ }
+ break;
+ case '9':
+ {
+ while(itSource < iSize)
+ {
+ if (cSource[itSource]>='0'&&cSource[itSource]<='9')
+ {
+ //cPurpose.push_back(cSource[itSource]);
+ cPurpose += cSource[itSource];
+ itSource++;
+ break;
+ }
+ itSource++;
+ }
+ break;
+ }
+ case '*':
+ {
+ cPurpose.append(cSource,itSource,iSize-itSource);
+ itSource = iSize-1;
+ break;
+ }
+ case '\\':
+ break;
+ case '>':
+ {
+ for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+ {
+ *it = toupper(*it);
+ }
+ break;
+ }
+ case '<':
+ {
+ for(std::string::iterator it = cSource.begin();it != cSource.end(); it++)
+ {
+ *it = tolower(*it);
+ }
+ break;
+ }
+ case '=':
+ break;
+ default:
+ //cPurpose.push_back(letter);
+ cPurpose += letter;
+ break;
+ }
+ }
+}
+
+FX_BOOL util::scand(OBJ_METHOD_PARAMS)
+{
+ v8::Isolate* isolate = GetIsolate(cc);
+ int iSize = params.size();
+ if (iSize < 2)
+ return FALSE;
+ CFX_WideString sFormat = params[0].operator CFX_WideString();
+ CFX_WideString sDate = params[1].operator CFX_WideString();
+
+ double dDate = JS_GetDateTime();
+ if (sDate.GetLength() > 0)
+ {
+ FX_BOOL bWrongFormat = FALSE;
+ dDate = CJS_PublicMethods::MakeRegularDate(sDate,sFormat,bWrongFormat);
+ }
+
+ if (!JS_PortIsNan(dDate))
+ {
+ CJS_Date date(isolate,dDate);
+ vRet = date;
+ }
+ else
+ {
+ vRet.SetNull();
+ }
+
+ return TRUE;
+}
+
+FX_INT64 FX_atoi64(const char *nptr)
+{
+ int c; /* current char */
+ FX_INT64 total; /* current total */
+ int sign; /* if '-', then negative, otherwise positive */
+
+ /* skip whitespace */
+ while ( isspace((int)(unsigned char)*nptr) )
+ ++nptr;
+
+ c = (int)(unsigned char)*nptr++;
+ sign = c; /* save sign indication */
+ if (c == '-' || c == '+')
+ c = (int)(unsigned char)*nptr++; /* skip sign */
+
+ total = 0;
+
+ while (isdigit(c)) {
+ total = 10 * total + (c - '0'); /* accumulate digit */
+ c = (int)(unsigned char)*nptr++; /* get next char */
+ }
+
+ if (sign == '-')
+ return -total;
+ else
+ return total; /* return result, negated if necessary */
+}
+
+FX_BOOL util::byteToChar(OBJ_METHOD_PARAMS)
+{
+ int iSize = params.size();
+ if (iSize == 0)
+ return FALSE;
+ int nByte = (int)params[0];
+ unsigned char cByte = (unsigned char)nByte;
+ CFX_WideString csValue;
+ csValue.Format((FX_LPCWSTR)L"%c", cByte);
+ vRet = csValue;
+ return TRUE;
+}
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
new file mode 100644
index 0000000000..bbf9eec67d
--- /dev/null
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -0,0 +1,1043 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../core/include/fxcrt/fx_basic.h"
+#include "../../../core/include/fxcrt/fx_ext.h"
+#include "../../include/jsapi/fxjs_v8.h"
+#include "../../include/fsdk_define.h"
+#include "time.h"
+#include <cmath>
+#include <limits>
+
+#define VALUE_NAME_STRING L"string"
+#define VALUE_NAME_NUMBER L"number"
+#define VALUE_NAME_BOOLEAN L"boolean"
+#define VALUE_NAME_DATE L"date"
+#define VALUE_NAME_OBJECT L"object"
+#define VALUE_NAME_FXOBJ L"fxobj"
+#define VALUE_NAME_NULL L"null"
+#define VALUE_NAME_UNDEFINED L"undefined"
+
+static FX_DWORD g_nan[2] = {0,0x7FF80000 };
+double g_NaN = (*(double *)g_nan);
+
+
+class CJS_PrivateData: public CFX_Object
+{
+public:
+ CJS_PrivateData():ObjDefID(-1), pPrivate(NULL) {}
+ int ObjDefID;
+ FX_LPVOID pPrivate;
+};
+
+
+class CJS_ObjDefintion: public CFX_Object
+{
+public:
+ CJS_ObjDefintion(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew):
+ objName(sObjName), objType(eObjType), m_pConstructor(pConstructor), m_pDestructor(pDestructor),m_bApplyNew(bApplyNew),m_bSetAsGlobalObject(FALSE)
+ {
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ v8::Handle<ObjectTemplate> objTemplate = ObjectTemplate::New(isolate);
+ objTemplate->SetInternalFieldCount(1);
+ m_objTemplate.Reset(isolate, objTemplate);
+
+ //Document as the global object.
+ if(FXSYS_wcscmp(sObjName, L"Document") == 0)
+ {
+ m_bSetAsGlobalObject = TRUE;
+ }
+
+ }
+ ~CJS_ObjDefintion()
+ {
+ m_objTemplate.Reset();
+ m_StaticObj.Reset();
+ }
+public:
+ const wchar_t* objName;
+ FXJSOBJTYPE objType;
+ LP_CONSTRUCTOR m_pConstructor;
+ LP_DESTRUCTOR m_pDestructor;
+ unsigned m_bApplyNew;
+ FX_BOOL m_bSetAsGlobalObject;
+
+ v8::Persistent<ObjectTemplate> m_objTemplate;
+ v8::Persistent<v8::Object> m_StaticObj;
+};
+
+int JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApplyNew)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray)
+ {
+ pArray = FX_NEW CFX_PtrArray();
+ isolate->SetData(0, pArray);
+ }
+ CJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);
+ pArray->Add(pObjDef);
+ return pArray->GetSize()-1;
+}
+
+int JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
+ CFX_ByteString bsMethodName = ws.UTF8Encode();
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return 0;
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+ v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
+ objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), FunctionTemplate::New(isolate, pMethodCall), ReadOnly);
+ pObjDef->m_objTemplate.Reset(isolate,objTemp);
+ return 0;
+}
+
+int JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, AccessorGetterCallback pPropGet, AccessorSetterCallback pPropPut)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName);
+ CFX_ByteString bsPropertyName = ws.UTF8Encode();
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return 0;
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+ v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
+ objTemp->SetAccessor(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsPropertyName)), pPropGet, pPropPut);
+ pObjDef->m_objTemplate.Reset(isolate,objTemp);
+ return 0;
+}
+
+int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, NamedPropertyQueryCallback pPropQurey, NamedPropertyGetterCallback pPropGet, NamedPropertySetterCallback pPropPut, NamedPropertyDeleterCallback pPropDel)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return 0;
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+ v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
+ objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);
+ pObjDef->m_objTemplate.Reset(isolate,objTemp);
+ return 0;
+}
+
+int JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return 0;
+
+ CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
+ CFX_ByteString bsConstName = ws.UTF8Encode();
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0;
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+ v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
+ objTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault);
+ pObjDef->m_objTemplate.Reset(isolate,objTemp);
+ return 0;
+}
+
+static v8::Persistent<ObjectTemplate>& _getGlobalObjectTemplate(IJS_Runtime* pJSRuntime)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ ASSERT(pArray != NULL);
+ for(int i=0; i<pArray->GetSize(); i++)
+ {
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
+ if(pObjDef->m_bSetAsGlobalObject)
+ return pObjDef->m_objTemplate;
+ }
+ static v8::Persistent<ObjectTemplate> gloabalObjectTemplate;
+ return gloabalObjectTemplate;
+}
+
+int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, FunctionCallback pMethodCall, unsigned nParamNum)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
+ CFX_ByteString bsMethodName = ws.UTF8Encode();
+
+ v8::Local<FunctionTemplate> funTempl = FunctionTemplate::New(isolate, pMethodCall);
+ v8::Local<ObjectTemplate> objTemp;
+
+ v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
+ if(globalObjTemp.IsEmpty())
+ objTemp = ObjectTemplate::New(isolate);
+ else
+ objTemp = v8::Local<ObjectTemplate>::New(isolate, globalObjTemp);
+ objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), funTempl, ReadOnly);
+
+ globalObjTemp.Reset(isolate,objTemp);
+
+ return 0;
+}
+
+int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8::Handle<v8::Value> pDefault)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
+ CFX_ByteString bsConst= ws.UTF8Encode();
+
+ v8::Local<ObjectTemplate> objTemp;
+
+ v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
+ if(globalObjTemp.IsEmpty())
+ objTemp = ObjectTemplate::New(isolate);
+ else
+ objTemp = v8::Local<ObjectTemplate>::New(isolate, globalObjTemp);
+ objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)), pDefault, ReadOnly);
+
+ globalObjTemp.Reset(isolate,objTemp);
+
+ return 0;
+}
+
+
+void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Persistent<v8::Context>& v8PersistentContext)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+
+ v8::Persistent<ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pJSRuntime);
+ v8::Handle<v8::Context> v8Context = v8::Context::New(isolate, NULL, v8::Local<ObjectTemplate>::New(isolate, globalObjTemp));
+ v8::Context::Scope context_scope(v8Context);
+
+ v8::Handle<External> ptr = External::New(isolate, pFXRuntime);
+ v8Context->SetEmbedderData(1, ptr);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return;
+
+ for(int i=0; i<pArray->GetSize(); i++)
+ {
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
+ CFX_WideString ws = CFX_WideString(pObjDef->objName);
+ CFX_ByteString bs = ws.UTF8Encode();
+ v8::Handle<v8::String> objName = v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength());
+
+
+ if(pObjDef->objType == JS_DYNAMIC)
+ {
+ //Document is set as global object, need to construct it first.
+ if(ws.Equal(L"Document"))
+ {
+
+ CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
+ pPrivateData->ObjDefID = i;
+ v8::Handle<External> ptr = External::New(isolate, pPrivateData);
+
+ v8Context->Global()->GetPrototype()->ToObject()->SetInternalField(0, ptr);
+
+ if(pObjDef->m_pConstructor)
+ pObjDef->m_pConstructor(context, v8Context->Global()->GetPrototype()->ToObject(), v8Context->Global()->GetPrototype()->ToObject());
+ }
+ }
+ else
+ {
+ v8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRuntime, context, i);
+ v8Context->Global()->Set(objName, obj);
+ pObjDef->m_StaticObj.Reset(isolate, obj);
+ }
+ }
+ v8PersistentContext.Reset(isolate, v8Context);
+}
+
+void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ HandleScope handle_scope(isolate);
+ v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext);
+ v8::Context::Scope context_scope(context);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return ;
+
+ for(int i=0; i<pArray->GetSize(); i++)
+ {
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
+ if(!pObjDef->m_StaticObj.IsEmpty())
+ {
+ v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj);
+ if(pObjDef->m_pDestructor)
+ pObjDef->m_pDestructor(pObj);
+ JS_FreePrivate(pObj);
+ }
+ delete pObjDef;
+ }
+ delete pArray;
+ isolate->SetData(0,NULL);
+}
+
+void JS_Initial()
+{
+#ifndef FOXIT_CHROME_BUILD
+ v8::V8::InitializeICU();
+#endif
+}
+void JS_Release()
+{
+
+}
+int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ TryCatch try_catch;
+
+ CFX_WideString wsScript(script);
+ CFX_ByteString bsScript = wsScript.UTF8Encode();
+
+
+ v8::Handle<Script> compiled_script = Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));
+ if (compiled_script.IsEmpty()) {
+ v8::String::Utf8Value error(try_catch.Exception());
+ return -1;
+ }
+ return 0;
+}
+
+int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ TryCatch try_catch;
+
+ CFX_WideString wsScript(script);
+ CFX_ByteString bsScript = wsScript.UTF8Encode();
+
+ v8::Handle<Script> compiled_script = Script::Compile(v8::String::NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.GetLength()));
+ if (compiled_script.IsEmpty()) {
+ v8::String::Utf8Value error(try_catch.Exception());
+ return -1;
+ }
+
+ v8::Handle<v8::Value> result = compiled_script->Run();
+ if (result.IsEmpty()) {
+ v8::String::Utf8Value error(try_catch.Exception());
+ return -1;
+ }
+ return 0;
+}
+
+v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+ if(-1 == nObjDefnID)
+ {
+ v8::Local<ObjectTemplate> objTempl = ObjectTemplate::New(isolate);
+ return objTempl->NewInstance();
+ }
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return v8::Handle<v8::Object>();
+
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();
+ v8::Local<ObjectTemplate> objTemp = v8::Local<ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
+
+ v8::Local<v8::Object> obj = objTemp->NewInstance();
+
+ CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
+ pPrivateData->ObjDefID = nObjDefnID;
+ v8::Handle<External> ptr = External::New(isolate, pPrivateData);
+ obj->SetInternalField(0, ptr);
+
+ if(pObjDef->m_pConstructor)
+ pObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetPrototype()->ToObject());
+
+ return obj;
+}
+
+v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return v8::Handle<v8::Object>();
+
+ if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>();
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
+ v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate,pObjDef->m_StaticObj);
+ return obj;
+}
+
+void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID)
+{
+ //Do nothing.
+}
+v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime)
+{
+ //Return the global object.
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return v8::Handle<v8::Object>();
+
+ v8::Local<v8::Context> context = isolate->GetCurrentContext();
+ return context->Global()->GetPrototype()->ToObject();
+}
+
+int JS_GetObjDefnID(v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return -1;
+ v8::Handle<External> field = v8::Handle<External>::Cast(pObj->GetInternalField(0));
+ CJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value();
+ if(pPrivateData)
+ return pPrivateData->ObjDefID;
+ return -1;
+}
+
+IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty()) return NULL;
+ v8::Local<v8::Context> context = pObj->CreationContext();
+ if(context.IsEmpty()) return NULL;
+ return context->GetIsolate();
+}
+
+int JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName)
+{
+ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
+ v8::Isolate::Scope isolate_scope(isolate);
+
+ CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
+ if(!pArray) return -1;
+
+ for(int i=0; i<pArray->GetSize(); i++)
+ {
+ CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
+ if(FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)
+ return i;
+ }
+ return -1;
+}
+
+void JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub)
+{
+
+}
+
+unsigned JS_CalcHash(const wchar_t* main, unsigned nLen)
+{
+ return (unsigned)FX_HashCode_String_GetW(main, nLen);
+}
+
+unsigned JS_CalcHash(const wchar_t* main)
+{
+ return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main));
+}
+const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj)
+{
+ if(pObj.IsEmpty()) return NULL;
+ if(pObj->IsString())
+ return VALUE_NAME_STRING;
+ if(pObj->IsNumber())
+ return VALUE_NAME_NUMBER;
+ if(pObj->IsBoolean())
+ return VALUE_NAME_BOOLEAN;
+ if(pObj->IsDate())
+ return VALUE_NAME_DATE;
+ if(pObj->IsObject())
+ return VALUE_NAME_OBJECT;
+ if(pObj->IsNull())
+ return VALUE_NAME_NULL;
+ if(pObj->IsUndefined())
+ return VALUE_NAME_UNDEFINED;
+ return NULL;
+
+}
+const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj)
+{
+ return NULL;
+}
+
+void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p)
+{
+ JS_SetPrivate(NULL, pObj, p);
+}
+
+void* JS_GetPrivate(v8::Handle<v8::Object> pObj)
+{
+ return JS_GetPrivate(NULL,pObj);
+}
+
+void JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p)
+{
+ if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;
+ v8::Handle<External> ptr = v8::Handle<External>::Cast(pObj->GetInternalField(0));
+ CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value();
+ if(!pPrivateData) return;
+ pPrivateData->pPrivate = p;
+}
+
+void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty()) return NULL;
+ v8::Local<v8::Value> value;
+ if(pObj->InternalFieldCount())
+ value = pObj->GetInternalField(0);
+ else
+ {
+ //It could be a global proxy object.
+ v8::Local<v8::Value> v = pObj->GetPrototype();
+ if(v->IsObject())
+ value = v->ToObject()->GetInternalField(0);
+ }
+ if(value.IsEmpty() || value->IsUndefined()) return NULL;
+ v8::Handle<External> ptr = v8::Handle<External>::Cast(value);
+ CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value();
+ if(!pPrivateData) return NULL;
+ return pPrivateData->pPrivate;
+}
+
+void JS_FreePrivate(v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return;
+ v8::Handle<External> ptr = v8::Handle<External>::Cast(pObj->GetInternalField(0));
+ delete (CJS_PrivateData*)ptr->Value();
+ v8::Local<v8::Context> context = pObj->CreationContext();
+
+ pObj->SetInternalField(0, External::New(context->GetIsolate(), NULL));
+}
+
+
+v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj)
+{
+ return pObj;
+}
+
+v8::Handle<String> WSToJSString(IJS_Runtime* pJSRuntime, const wchar_t* PropertyName, int Len = -1)
+{
+ CFX_WideString ws = CFX_WideString(PropertyName,Len);
+ CFX_ByteString bs = ws.UTF8Encode();
+ if(!pJSRuntime) pJSRuntime = v8::Isolate::GetCurrent();
+ return v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs);
+}
+
+v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj,const wchar_t* PropertyName)
+{
+ if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
+ return pObj->Get(WSToJSString(pJSRuntime,PropertyName));
+}
+
+v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty()) return v8::Handle<v8::Array>();
+ return pObj->GetPropertyNames();
+}
+
+void JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, const wchar_t* sValue) //VT_string
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime, PropertyName), WSToJSString(pJSRuntime, sValue));
+}
+
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, int nValue)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),Int32::New(pJSRuntime, nValue));
+}
+
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, float fValue)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),Number::New(pJSRuntime, (double)fValue));
+}
+
+void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, double dValue)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),Number::New(pJSRuntime, (double)dValue));
+}
+
+void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, bool bValue)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Boolean::New(pJSRuntime, bValue));
+}
+
+void JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName, v8::Handle<v8::Object> pPut)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),pPut);
+}
+
+void JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName)
+{
+ if(pObj.IsEmpty()) return;
+ pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Handle<v8::Object>());
+}
+
+v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime)
+{
+ return v8::Array::New(pJSRuntime);
+}
+
+unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Handle<v8::Value> pValue,FXJSVALUETYPE eType)
+{
+ if(pArray.IsEmpty()) return 0;
+ pArray->Set(index, pValue);
+ return 1;
+}
+
+v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned index)
+{
+ if(pArray.IsEmpty()) return v8::Handle<v8::Value>();
+ return pArray->Get(index);
+}
+
+unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray)
+{
+ if(pArray.IsEmpty()) return 0;
+ return pArray->Length();
+}
+
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number)
+{
+ return Int32::New(pJSRuntime, number);
+}
+
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number)
+{
+ return Number::New(pJSRuntime, number);
+}
+
+v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number)
+{
+ return Number::New(pJSRuntime, (float)number);
+}
+
+v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b)
+{
+ return v8::Boolean::New(pJSRuntime, b);
+}
+
+v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj)
+{
+ if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
+ return pObj->Clone();
+}
+
+v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array> pObj)
+{
+ if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
+ return pObj->Clone();
+}
+
+
+v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string)
+{
+ return WSToJSString(pJSRuntime, string);
+}
+
+v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string, unsigned nLen)
+{
+ return WSToJSString(pJSRuntime, string, nLen);
+}
+
+v8::Handle<v8::Value> JS_NewNull()
+{
+ return v8::Handle<v8::Value>();
+}
+
+v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d)
+{
+ return Date::New(pJSRuntime, d);
+}
+
+v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime)
+{
+ return v8::Handle<v8::Value>();
+}
+
+v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index)
+{
+
+ if(!pList.IsEmpty() && pList->IsObject())
+ {
+ v8::Local<v8::Object> obj = pList->ToObject();
+ return obj->Get(index);
+ }
+ return v8::Handle<v8::Value>();
+}
+
+int JS_ToInt32(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return 0;
+ return pValue->ToInt32()->Value();
+}
+
+bool JS_ToBoolean(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return false;
+ return pValue->ToBoolean()->Value();
+}
+
+double JS_ToNumber(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return 0.0;
+ return pValue->ToNumber()->Value();
+}
+
+v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return v8::Handle<v8::Object>();
+ return pValue->ToObject();
+}
+
+CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return L"";
+ v8::String::Utf8Value s(pValue->ToString());
+ return CFX_WideString::FromUTF8(*s);
+}
+
+v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue)
+{
+ if(pValue.IsEmpty()) return v8::Handle<v8::Array>();
+ return v8::Handle<v8::Array>::Cast(pValue->ToObject());
+}
+
+void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom)
+{
+ pTo = pFrom;
+}
+
+
+//JavaScript time implement begin.
+
+double _getLocalTZA()
+{
+ if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
+ return 0;
+ time_t t = 0;
+ time(&t);
+ localtime(&t);
+ return (double)(-(timezone * 1000));
+}
+
+int _getDaylightSavingTA(double d)
+{
+ if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
+ return 0;
+ time_t t = (time_t)(d/1000);
+ struct tm * tmp = localtime(&t);
+ if (tmp == NULL)
+ return 0;
+ if (tmp->tm_isdst > 0)
+ //One hour.
+ return (int)60*60*1000;
+ return 0;
+}
+
+double _Mod(double x, double y)
+{
+ double r = fmod(x, y);
+ if (r < 0) r += y;
+ return r;
+}
+
+int _isfinite(double v)
+{
+#if _MSC_VER
+ return ::_finite(v);
+#else
+ return std::fabs(v) < std::numeric_limits<double>::max();
+#endif
+}
+
+double _toInteger(double n)
+{
+ return (n >= 0)? FXSYS_floor(n): -FXSYS_floor(-n);
+}
+
+bool _isLeapYear(int year)
+{
+ return (year%4==0)&&((year%100!=0)||(year%400!=0));
+}
+
+int _DayFromYear(int y)
+{
+ return (int)(365*(y - 1970.0) + FXSYS_floor((y - 1969.0)/4) - FXSYS_floor((y - 1901.0)/100)+FXSYS_floor((y - 1601.0)/400));
+}
+
+double _TimeFromYear(int y)
+{
+ return ((double)86400000) * _DayFromYear(y);
+}
+
+double _TimeFromYearMonth(int y, int m)
+{
+ static int daysMonth[12] ={ 0,31,59,90,120,151,181,212,243,273,304,334};
+ static int leapDaysMonth[12] = { 0,31,60,91,121,152,182,213,244,274,305,335};
+ int* pMonth = daysMonth;
+ if(_isLeapYear(y))
+ pMonth = leapDaysMonth;
+ return _TimeFromYear(y) + ((double)pMonth[m])*86400000;
+}
+
+int _Day(double t)
+{
+ return (int)FXSYS_floor(t / 86400000);
+}
+
+int _YearFromTime(double t)
+{
+ //estimate the time.
+ int y = 1970 +(int)(t/(365.0*86400000));
+ if (_TimeFromYear(y) <= t)
+ {
+ while(_TimeFromYear(y+1) <= t) y++;
+ }
+ else
+ while(_TimeFromYear(y-1) > t) y--;
+ return y;
+}
+
+int _DayWithinYear(double t)
+{
+ int year = _YearFromTime(t);
+ int day = _Day(t);
+ return day-_DayFromYear(year);
+}
+
+int _MonthFromTime(double t)
+{
+ int day = _DayWithinYear(t);
+ int year = _YearFromTime(t);
+ if(0<=day && day <31)
+ return 0;
+ if(31<=day && day< 59+_isLeapYear(year))
+ return 1;
+ if((59+_isLeapYear(year))<=day && day<(90+_isLeapYear(year)))
+ return 2;
+ if((90+_isLeapYear(year))<=day && day<(120+_isLeapYear(year)))
+ return 3;
+ if((120+_isLeapYear(year))<=day && day<(151+_isLeapYear(year)))
+ return 4;
+ if((151+_isLeapYear(year))<=day && day<(181+_isLeapYear(year)))
+ return 5;
+ if((181+_isLeapYear(year))<=day && day<(212+_isLeapYear(year)))
+ return 6;
+ if((212+_isLeapYear(year))<=day && day<(243+_isLeapYear(year)))
+ return 7;
+ if((243+_isLeapYear(year))<=day && day<(273+_isLeapYear(year)))
+ return 8;
+ if((273+_isLeapYear(year))<=day && day<(304+_isLeapYear(year)))
+ return 9;
+ if((304+_isLeapYear(year))<=day && day<(334+_isLeapYear(year)))
+ return 10;
+ if((334+_isLeapYear(year))<=day && day<(365+_isLeapYear(year)))
+ return 11;
+
+ return -1;
+}
+
+int _DateFromTime(double t)
+{
+ int day = _DayWithinYear(t);
+ int year = _YearFromTime(t);
+ bool leap = _isLeapYear(year);
+ int month = _MonthFromTime(t);
+ switch (month)
+ {
+ case 0:
+ return day+1;
+ case 1:
+ return day-30;
+ case 2:
+ return day-58-leap;
+ case 3:
+ return day-89-leap;
+ case 4:
+ return day-119-leap;
+ case 5:
+ return day-150-leap;
+ case 6:
+ return day-180-leap;
+ case 7:
+ return day-211-leap;
+ case 8:
+ return day-242-leap;
+ case 9:
+ return day-272-leap;
+ case 10:
+ return day-303-leap;
+ case 11:
+ return day-333-leap;
+ default:
+ return 0;
+ }
+}
+
+double JS_GetDateTime()
+{
+ if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
+ return 0;
+ time_t t = time(NULL);
+ struct tm* pTm = localtime(&t);
+
+ int year = pTm->tm_year+1900;
+ double t1 = _TimeFromYear(year);
+
+ return t1 + pTm->tm_yday*86400000.0 + pTm->tm_hour*3600000.0+pTm->tm_min*60000.0+pTm->tm_sec*1000.0;
+}
+
+int JS_GetYearFromTime(double dt)
+{
+ return _YearFromTime(dt);
+}
+
+int JS_GetMonthFromTime(double dt)
+{
+ return _MonthFromTime(dt);
+}
+
+int JS_GetDayFromTime(double dt)
+{
+ return _DateFromTime(dt);
+}
+
+int JS_GetHourFromTime(double dt)
+{
+ return (int)_Mod(FXSYS_floor((double)(dt/(60*60*1000))), 24);
+}
+
+int JS_GetMinFromTime(double dt)
+{
+ return (int)_Mod(FXSYS_floor((double)(dt/(60*1000))), 60);
+}
+
+int JS_GetSecFromTime(double dt)
+{
+ return (int)_Mod(FXSYS_floor((double)(dt/1000)), 60);
+}
+
+double JS_DateParse(const wchar_t* string)
+{
+ v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
+ v8::Isolate::Scope isolate_scope(pIsolate);
+ HandleScope scope(pIsolate);
+
+ v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
+
+ //Use the built-in object method.
+ v8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Date"));
+ if(v->IsObject())
+ {
+ v8::Local<v8::Object> o = v->ToObject();
+ v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse"));
+ if(v->IsFunction())
+ {
+ v8::Local<Function> funC = v8::Handle<Function>::Cast(v);
+
+ const int argc = 1;
+ v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string);
+ v8::Handle<v8::Value> argv[argc] = {timeStr};
+ v = funC->Call(context->Global(), argc, argv);
+ if(v->IsNumber())
+ {
+ double date = v->ToNumber()->Value();
+ if(!_isfinite(date)) return date;
+ return date + _getLocalTZA() + _getDaylightSavingTA(date);
+ }
+
+ }
+ }
+ return 0;
+}
+
+double JS_MakeDay(int nYear, int nMonth, int nDate)
+{
+ if (!_isfinite(nYear) || !_isfinite(nMonth) ||!_isfinite(nDate))
+ return g_NaN;
+ double y = _toInteger(nYear);
+ double m = _toInteger(nMonth);
+ double dt = _toInteger(nDate);
+ double ym = y + FXSYS_floor((double)m/12);
+ double mn = _Mod(m ,12);
+
+ double t = _TimeFromYearMonth((int)ym,(int)mn);
+
+ if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn ||_DateFromTime(t) != 1)
+ return g_NaN;
+ return _Day(t)+dt-1;
+}
+
+double JS_MakeTime(int nHour, int nMin, int nSec, int nMs)
+{
+ if (!_isfinite(nHour) ||!_isfinite(nMin) ||!_isfinite(nSec) ||!_isfinite(nMs))
+ return g_NaN;
+
+ double h = _toInteger(nHour);
+ double m = _toInteger(nMin);
+ double s = _toInteger(nSec);
+ double milli = _toInteger(nMs);
+
+ return h * 3600000 + m * 60000 + s * 1000 + milli;
+}
+
+double JS_MakeDate(double day, double time)
+{
+ if (!_isfinite(day) ||!_isfinite(time))
+ return g_NaN;
+
+ return day * 86400000 + time;
+}
+
+bool JS_PortIsNan(double d)
+{
+ return d != d;
+}
+
+double JS_LocalTime(double d)
+{
+ return JS_GetDateTime() + _getDaylightSavingTA(d);
+}
+
+//JavaScript time implement End. \ No newline at end of file
diff --git a/fpdfsdk/src/pdfwindow/PWL_Button.cpp b/fpdfsdk/src/pdfwindow/PWL_Button.cpp
new file mode 100644
index 0000000000..c71e5cc8b4
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Button.cpp
@@ -0,0 +1,53 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ------------------------------- CPWL_Button ---------------------------------- */
+
+CPWL_Button::CPWL_Button() :
+ m_bMouseDown(FALSE)
+{
+}
+
+CPWL_Button::~CPWL_Button()
+{
+// PWL_TRACE("~CPWL_Button\n");
+}
+
+CFX_ByteString CPWL_Button::GetClassName() const
+{
+ return "CPWL_Button";
+}
+
+void CPWL_Button::OnCreate(PWL_CREATEPARAM & cp)
+{
+ cp.eCursorType = FXCT_HAND;
+}
+
+FX_BOOL CPWL_Button::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point, nFlag);
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_Button::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point, nFlag);
+
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Caret.cpp b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp
new file mode 100644
index 0000000000..e54538ea73
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Caret.cpp
@@ -0,0 +1,197 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+#define PWL_CARET_FLASHINTERVAL 500
+
+//////////////////////////////////////////////////////////////////////
+// Construction/Destruction
+//////////////////////////////////////////////////////////////////////
+
+CPWL_Caret::CPWL_Caret() :
+ m_bFlash(FALSE),
+ m_ptHead(0,0),
+ m_ptFoot(0,0),
+ m_fWidth(0.4f),
+ m_nDelay(0)
+{
+}
+
+CPWL_Caret::~CPWL_Caret()
+{
+}
+
+CFX_ByteString CPWL_Caret::GetClassName() const
+{
+ return "CPWL_Caret";
+}
+
+void CPWL_Caret::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ GetCaretApp(sAppStream,CPDF_Point(0.0f,0.0f));
+}
+
+void CPWL_Caret::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ if (IsVisible() && m_bFlash)
+ {
+ CPDF_Rect rcRect = GetCaretRect();
+ CPDF_Rect rcClip = GetClipRect();
+
+ CFX_PathData path;
+
+ path.SetPointCount(2);
+
+ FX_FLOAT fCaretX = rcRect.left + m_fWidth * 0.5f;
+ FX_FLOAT fCaretTop = rcRect.top;
+ FX_FLOAT fCaretBottom = rcRect.bottom;
+
+ if (!rcClip.IsEmpty())
+ {
+ rcRect.Intersect(rcClip);
+ if (!rcRect.IsEmpty())
+ {
+ fCaretTop = rcRect.top;
+ fCaretBottom = rcRect.bottom;
+ path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);
+ path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);
+ }
+ else
+ {
+ return;
+ }
+ }
+ else
+ {
+ path.SetPoint(0, fCaretX, fCaretBottom, FXPT_MOVETO);
+ path.SetPoint(1, fCaretX, fCaretTop, FXPT_LINETO);
+ }
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = m_fWidth;
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd,0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
+ }
+}
+
+void CPWL_Caret::GetCaretApp(CFX_ByteTextBuf & sAppStream,const CPDF_Point & ptOffset)
+{
+ if (IsVisible() && m_bFlash)
+ {
+ CFX_ByteTextBuf sCaret;
+
+ CPDF_Rect rcRect = GetCaretRect();
+ CPDF_Rect rcClip = GetClipRect();
+
+ rcRect = CPWL_Utils::OffsetRect(rcRect,ptOffset.x,ptOffset.y);
+ rcClip = CPWL_Utils::OffsetRect(rcClip,ptOffset.x,ptOffset.y);
+
+ sCaret << "q\n";
+ if (!rcClip.IsEmpty())
+ {
+ sCaret << rcClip.left << " " << rcClip.bottom + 2.5f << " "
+ << rcClip.right - rcClip.left << " " << rcClip.top - rcClip.bottom - 4.5f << " re W n\n";
+ }
+ sCaret << m_fWidth << " w\n0 G\n";
+ sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.bottom << " m\n";
+ sCaret << rcRect.left + m_fWidth/2 << " " << rcRect.top << " l S\nQ\n";
+
+ sAppStream << sCaret;
+ }
+}
+
+CFX_ByteString CPWL_Caret::GetCaretAppearanceStream(const CPDF_Point & ptOffset)
+{
+ CFX_ByteTextBuf sCaret;
+ GetCaretApp(sCaret,ptOffset);
+ return sCaret.GetByteString();
+}
+
+void CPWL_Caret::TimerProc()
+{
+ if (m_nDelay > 0)
+ {
+ m_nDelay--;
+ }
+ else
+ {
+ m_bFlash = !m_bFlash;
+ InvalidateRect();
+ }
+}
+
+CPDF_Rect CPWL_Caret::GetCaretRect() const
+{
+ return CPDF_Rect(m_ptFoot.x,
+ m_ptFoot.y,
+ m_ptHead.x + this->m_fWidth,
+ m_ptHead.y);
+}
+
+void CPWL_Caret::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
+{
+ if (bVisible)
+ {
+ if (IsVisible())
+ {
+ if (m_ptHead.x != ptHead.x || m_ptHead.y != ptHead.y ||
+ m_ptFoot.x != ptFoot.x || m_ptFoot.y != ptFoot.y)
+ {
+ this->m_ptHead = ptHead;
+ this->m_ptFoot = ptFoot;
+
+ m_bFlash = TRUE;
+ //Move(GetCaretRect(),FALSE,TRUE);
+ Move(m_rcInvalid, FALSE, TRUE);
+ }
+ }
+ else
+ {
+ this->m_ptHead = ptHead;
+ this->m_ptFoot = ptFoot;
+
+ EndTimer();
+ BeginTimer(PWL_CARET_FLASHINTERVAL);
+
+ CPWL_Wnd::SetVisible(TRUE);
+ m_bFlash = TRUE;
+
+ //Move(GetCaretRect(),FALSE,TRUE);
+ Move(m_rcInvalid, FALSE, TRUE);
+ }
+ }
+ else
+ {
+ this->m_ptHead = CPDF_Point(0,0);
+ this->m_ptFoot = CPDF_Point(0,0);
+
+ m_bFlash = FALSE;
+ if (IsVisible())
+ {
+ EndTimer();
+ CPWL_Wnd::SetVisible(FALSE);
+ }
+ }
+}
+
+void CPWL_Caret::InvalidateRect(CPDF_Rect * pRect)
+{
+ if (pRect)
+ {
+ CPDF_Rect rcRefresh = CPWL_Utils::InflateRect(*pRect,0.5f);
+ rcRefresh.top += 1;
+ rcRefresh.bottom -= 1;
+
+ CPWL_Wnd::InvalidateRect(&rcRefresh);
+ }
+ else
+ CPWL_Wnd::InvalidateRect(pRect);
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp
new file mode 100644
index 0000000000..7650a23e5b
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp
@@ -0,0 +1,662 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ListBox.h"
+#include "../../include/pdfwindow/PWL_ComboBox.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+#define PWLCB_DEFAULTFONTSIZE 12.0f
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+
+/* ---------------------------- CPWL_CBListBox ---------------------------- */
+
+FX_BOOL CPWL_CBListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (m_bMouseDown)
+ {
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+
+ if (this->ClientHitTest(point))
+ {
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ {
+ pParent->OnNotify(this,PNM_LBUTTONUP,0,PWL_MAKEDWORD(point.x,point.y));
+ }
+
+ FX_BOOL bExit = FALSE;
+ OnNotifySelChanged(FALSE,bExit, nFlag);
+ if (bExit) return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_CBListBox::OnKeyDown(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
+{
+ if (!m_pList) return FALSE;
+
+ switch (nChar)
+ {
+ default:
+ return FALSE;
+ case FWL_VKEY_Up:
+ case FWL_VKEY_Down:
+ case FWL_VKEY_Home:
+ case FWL_VKEY_Left:
+ case FWL_VKEY_End:
+ case FWL_VKEY_Right:
+ break;
+ }
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Up:
+ m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Down:
+ m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Home:
+ m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Left:
+ m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_End:
+ m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Right:
+ m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Delete:
+ break;
+ }
+
+ OnNotifySelChanged(TRUE,bExit, nFlag);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_CBListBox::OnChar(FX_WORD nChar, FX_BOOL & bExit, FX_DWORD nFlag)
+{
+ if (!m_pList) return FALSE;
+
+ if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
+
+ if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetParentWindow())
+ {
+ pComboBox->SetSelectText();
+ }
+
+ OnNotifySelChanged(TRUE,bExit,nFlag);
+
+ return TRUE;
+}
+
+/* ---------------------------- CPWL_CBButton ---------------------------- */
+
+void CPWL_CBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CFX_ByteTextBuf sButton;
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+
+ if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
+ &&
+ IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
+ )
+ {
+ sButton << "0 g\n";
+ sButton << pt1.x << " " << pt1.y << " m\n";
+ sButton << pt2.x << " " << pt2.y << " l\n";
+ sButton << pt3.x << " " << pt3.y << " l\n";
+ sButton << pt1.x << " " << pt1.y << " l f\n";
+
+ sAppStream << "q\n" << sButton << "Q\n";
+ }
+ }
+}
+
+void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ CPDF_Rect rectWnd = CPWL_Wnd::GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ CPDF_Point pt1(ptCenter.x - PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_CBBUTTON_TRIANGLE_HALFLEN,ptCenter.y + PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_CBBUTTON_TRIANGLE_HALFLEN * 0.5f);
+
+ if (IsFloatBigger(rectWnd.right - rectWnd.left,PWL_CBBUTTON_TRIANGLE_HALFLEN * 2)
+ &&
+ IsFloatBigger(rectWnd.top - rectWnd.bottom,PWL_CBBUTTON_TRIANGLE_HALFLEN)
+ )
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(4);
+ path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+ path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
+ path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
+
+ pDevice->DrawPath(&path, pUser2Device, NULL,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,GetTransparency()),
+ 0, FXFILL_ALTERNATE);
+ }
+ }
+}
+
+FX_BOOL CPWL_CBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ SetCapture();
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ {
+ pParent->OnNotify(this,PNM_LBUTTONDOWN,0,PWL_MAKEDWORD(point.x,point.y));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_CBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point, nFlag);
+
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+/* ---------------------------- CPWL_ComboBox ---------------------------- */
+
+CPWL_ComboBox::CPWL_ComboBox() : m_pEdit(NULL),
+ m_pButton(NULL),
+ m_pList(NULL),
+ m_bPopup(FALSE),
+ m_nPopupWhere(0),
+ m_nSelectItem(-1),
+ m_pFillerNotify(NULL)
+{
+}
+
+CFX_ByteString CPWL_ComboBox::GetClassName() const
+{
+ return "CPWL_ComboBox";
+}
+
+void CPWL_ComboBox::OnCreate(PWL_CREATEPARAM & cp)
+{
+ cp.dwFlags &= ~PWS_HSCROLL;
+ cp.dwFlags &= ~PWS_VSCROLL;
+}
+
+void CPWL_ComboBox::SetFocus()
+{
+ if (m_pEdit)
+ m_pEdit->SetFocus();
+}
+
+void CPWL_ComboBox::KillFocus()
+{
+ SetPopup(FALSE);
+ CPWL_Wnd::KillFocus();
+}
+
+CFX_WideString CPWL_ComboBox::GetText() const
+{
+ if (m_pEdit)
+ {
+ return m_pEdit->GetText();
+ }
+ return CFX_WideString();
+}
+
+void CPWL_ComboBox::SetText(FX_LPCWSTR text)
+{
+ if (m_pEdit)
+ m_pEdit->SetText(text);
+}
+
+void CPWL_ComboBox::AddString(FX_LPCWSTR string)
+{
+ if (m_pList)
+ m_pList->AddString(string);
+}
+
+FX_INT32 CPWL_ComboBox::GetSelect() const
+{
+ return m_nSelectItem;
+}
+
+void CPWL_ComboBox::SetSelect(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->Select(nItemIndex);
+
+ m_pEdit->SetText(m_pList->GetText());
+
+ m_nSelectItem = nItemIndex;
+}
+
+void CPWL_ComboBox::SetEditSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ if (m_pEdit)
+ {
+ m_pEdit->SetSel(nStartChar,nEndChar);
+ }
+}
+
+void CPWL_ComboBox::GetEditSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
+{
+ nStartChar = -1;
+ nEndChar = -1;
+
+ if (m_pEdit)
+ {
+ m_pEdit->GetSel(nStartChar,nEndChar);
+ }
+}
+
+void CPWL_ComboBox::Clear()
+{
+ if (m_pEdit)
+ {
+ m_pEdit->Clear();
+ }
+}
+
+void CPWL_ComboBox::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ CreateEdit(cp);
+ CreateButton(cp);
+ CreateListBox(cp);
+}
+
+void CPWL_ComboBox::CreateEdit(const PWL_CREATEPARAM & cp)
+{
+ if (!m_pEdit)
+ {
+ m_pEdit = new CPWL_CBEdit;
+ m_pEdit->AttachFFLData(m_pFormFiller);
+
+ PWL_CREATEPARAM ecp = cp;
+ ecp.pParentWnd = this;
+ ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PES_CENTER | PES_AUTOSCROLL | PES_UNDO;
+
+ if (HasFlag(PWS_AUTOFONTSIZE))
+ ecp.dwFlags |= PWS_AUTOFONTSIZE;
+
+ if (!HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ ecp.dwFlags |= PWS_READONLY;
+
+ ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
+ ecp.dwBorderWidth = 0;
+ ecp.nBorderStyle = PBS_SOLID;
+
+ m_pEdit->Create(ecp);
+ }
+}
+
+void CPWL_ComboBox::CreateButton(const PWL_CREATEPARAM & cp)
+{
+ if (!m_pButton)
+ {
+ m_pButton = new CPWL_CBButton;
+
+ PWL_CREATEPARAM bcp = cp;
+ bcp.pParentWnd = this;
+ bcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND;
+ bcp.sBackgroundColor = PWL_SCROLLBAR_BKCOLOR;
+ bcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
+ bcp.dwBorderWidth = 2;
+ bcp.nBorderStyle = PBS_BEVELED;
+ bcp.eCursorType = FXCT_ARROW;
+
+ m_pButton->Create(bcp);
+ }
+}
+
+void CPWL_ComboBox::CreateListBox(const PWL_CREATEPARAM & cp)
+{
+ if (!m_pList)
+ {
+ m_pList = new CPWL_CBListBox;
+ m_pList->AttachFFLData(m_pFormFiller);
+ PWL_CREATEPARAM lcp = cp;
+ lcp.pParentWnd = this;
+ lcp.dwFlags = PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PLBS_HOVERSEL | PWS_VSCROLL;
+ lcp.nBorderStyle = PBS_SOLID;
+ lcp.dwBorderWidth = 1;
+ lcp.eCursorType = FXCT_ARROW;
+ lcp.rcRectWnd = CPDF_Rect(0,0,0,0);
+
+ if (cp.dwFlags & PWS_AUTOFONTSIZE)
+ lcp.fFontSize = PWLCB_DEFAULTFONTSIZE;
+ else
+ lcp.fFontSize = cp.fFontSize;
+
+ if (cp.sBorderColor.nColorType == COLORTYPE_TRANSPARENT)
+ lcp.sBorderColor = PWL_DEFAULT_BLACKCOLOR;
+
+ if (cp.sBackgroundColor.nColorType == COLORTYPE_TRANSPARENT)
+ lcp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
+
+ m_pList->Create(lcp);
+ }
+}
+
+void CPWL_ComboBox::RePosChildWnd()
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (m_bPopup)
+ {
+ CPDF_Rect rclient = GetClientRect();
+ CPDF_Rect rcButton = rclient;
+ CPDF_Rect rcEdit = rcClient;
+ CPDF_Rect rcList = CPWL_Wnd::GetWindowRect();
+
+ FX_FLOAT fOldWindowHeight = m_rcOldWindow.Height();
+ FX_FLOAT fOldClientHeight = fOldWindowHeight - GetBorderWidth() * 2;
+
+ switch (m_nPopupWhere)
+ {
+ case 0:
+ rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+
+ if (rcButton.left < rclient.left)
+ rcButton.left = rclient.left;
+
+ rcButton.bottom = rcButton.top - fOldClientHeight;
+
+ rcEdit.right = rcButton.left - 1.0f;
+
+ if (rcEdit.left < rclient.left)
+ rcEdit.left = rclient.left;
+
+ if (rcEdit.right < rcEdit.left)
+ rcEdit.right = rcEdit.left;
+
+ rcEdit.bottom = rcEdit.top - fOldClientHeight;
+
+ rcList.top -= fOldWindowHeight;
+
+ break;
+ case 1:
+ rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+
+ if (rcButton.left < rclient.left)
+ rcButton.left = rclient.left;
+
+ rcButton.top = rcButton.bottom + fOldClientHeight;
+
+ rcEdit.right = rcButton.left - 1.0f;
+
+ if (rcEdit.left < rclient.left)
+ rcEdit.left = rclient.left;
+
+ if (rcEdit.right < rcEdit.left)
+ rcEdit.right = rcEdit.left;
+
+ rcEdit.top = rcEdit.bottom + fOldClientHeight;
+
+ rcList.bottom += fOldWindowHeight;
+
+ break;
+ }
+
+ if (m_pButton)
+ m_pButton->Move(rcButton,TRUE,FALSE);
+
+ if (m_pEdit)
+ m_pEdit->Move(rcEdit,TRUE,FALSE);
+
+ if (m_pList)
+ {
+ m_pList->SetVisible(TRUE);
+ m_pList->Move(rcList,TRUE,FALSE);
+ m_pList->ScrollToListItem(m_nSelectItem);
+ }
+ }
+ else
+ {
+ CPDF_Rect rcButton = rcClient;
+
+ rcButton.left = rcButton.right - PWL_COMBOBOX_BUTTON_WIDTH;
+
+ if (rcButton.left < rcClient.left)
+ rcButton.left = rcClient.left;
+
+ if (m_pButton)
+ m_pButton->Move(rcButton,TRUE,FALSE);
+
+ CPDF_Rect rcEdit = rcClient;
+ rcEdit.right = rcButton.left - 1.0f;
+
+ if (rcEdit.left < rcClient.left)
+ rcEdit.left = rcClient.left;
+
+ if (rcEdit.right < rcEdit.left)
+ rcEdit.right = rcEdit.left;
+
+ if (m_pEdit)
+ m_pEdit->Move(rcEdit,TRUE,FALSE);
+
+ if (m_pList)
+ m_pList->SetVisible(FALSE);
+ }
+}
+
+void CPWL_ComboBox::SelectAll()
+{
+ if (m_pEdit && HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ m_pEdit->SelectAll();
+}
+
+CPDF_Rect CPWL_ComboBox::GetFocusRect() const
+{
+ return CPDF_Rect();
+}
+
+void CPWL_ComboBox::SetPopup(FX_BOOL bPopup)
+{
+ if (!m_pList) return;
+ if (bPopup == m_bPopup) return;
+ FX_FLOAT fListHeight = m_pList->GetContentRect().Height();
+ if (!IsFloatBigger(fListHeight,0.0f)) return;
+
+ if (bPopup)
+ {
+ if (m_pFillerNotify)
+ {
+ FX_INT32 nWhere = 0;
+ FX_FLOAT fPopupRet = 0.0f;
+ FX_FLOAT fPopupMin = 0.0f;
+ if (m_pList->GetCount() > 3)
+ fPopupMin = m_pList->GetFirstHeight() * 3 + m_pList->GetBorderWidth() * 2;
+ FX_FLOAT fPopupMax = fListHeight + m_pList->GetBorderWidth() * 2;
+ m_pFillerNotify->QueryWherePopup(GetAttachedData(), fPopupMin,fPopupMax,nWhere,fPopupRet);
+
+ if (IsFloatBigger(fPopupRet,0.0f))
+ {
+ m_bPopup = bPopup;
+
+ CPDF_Rect rcWindow = CPWL_Wnd::GetWindowRect();
+ m_rcOldWindow = rcWindow;
+ switch (nWhere)
+ {
+ default:
+ case 0:
+ rcWindow.bottom -= fPopupRet;
+ break;
+ case 1:
+ rcWindow.top += fPopupRet;
+ break;
+ }
+
+ m_nPopupWhere = nWhere;
+ Move(rcWindow, TRUE, TRUE);
+ }
+ }
+ }
+ else
+ {
+ m_bPopup = bPopup;
+ Move(m_rcOldWindow, TRUE, TRUE);
+ }
+}
+
+FX_BOOL CPWL_ComboBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (!m_pList) return FALSE;
+ if (!m_pEdit) return FALSE;
+
+ m_nSelectItem = -1;
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Up:
+ if (m_pList->GetCurSel() > 0)
+ {
+ FX_BOOL bExit = FALSE;
+ if (m_pList->OnKeyDown(nChar,bExit,nFlag))
+ {
+ if (bExit) return FALSE;
+ SetSelectText();
+ }
+ }
+ return TRUE;
+ case FWL_VKEY_Down:
+ if (m_pList->GetCurSel() < m_pList->GetCount() - 1)
+ {
+ FX_BOOL bExit = FALSE;
+ if (m_pList->OnKeyDown(nChar,bExit,nFlag))
+ {
+ if (bExit) return FALSE;
+ SetSelectText();
+ }
+ }
+ return TRUE;
+ }
+
+ if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ return m_pEdit->OnKeyDown(nChar,nFlag);
+ else
+ return FALSE;
+}
+
+FX_BOOL CPWL_ComboBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (!m_pList) return FALSE;
+ if (!m_pEdit) return FALSE;
+
+ m_nSelectItem = -1;
+ FX_BOOL bExit = FALSE;
+
+ if (HasFlag(PCBS_ALLOWCUSTOMTEXT))
+ {
+ return m_pEdit->OnChar(nChar,nFlag);
+ }
+ else
+ {
+ if (m_pList->OnChar(nChar,bExit,nFlag))
+ {
+ return bExit;
+ }
+ else
+ return FALSE;
+ }
+}
+
+void CPWL_ComboBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_LBUTTONDOWN:
+ if (pWnd == m_pButton)
+ {
+ SetPopup(!m_bPopup);
+ return;
+ }
+ break;
+ case PNM_LBUTTONUP:
+ if (m_pEdit && m_pList)
+ {
+ if (pWnd == m_pList)
+ {
+ SetSelectText();
+ SelectAll();
+ m_pEdit->SetFocus();
+ SetPopup(FALSE);
+ return;
+ }
+ }
+ }
+
+ CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+}
+
+FX_BOOL CPWL_ComboBox::IsPopup() const
+{
+ return m_bPopup;
+}
+
+void CPWL_ComboBox::SetSelectText()
+{
+ CFX_WideString swText = m_pList->GetText();
+ m_pEdit->SelectAll();
+ m_pEdit->ReplaceSel(m_pList->GetText());
+ m_pEdit->SelectAll();
+
+ m_nSelectItem = m_pList->GetCurSel();
+}
+
+FX_BOOL CPWL_ComboBox::IsModified() const
+{
+ return m_pEdit->IsModified();
+}
+
+void CPWL_ComboBox::SetFillerNotify(IPWL_Filler_Notify* pNotify)
+{
+ m_pFillerNotify = pNotify;
+
+ if (m_pEdit)
+ m_pEdit->SetFillerNotify(pNotify);
+
+ if (m_pList)
+ m_pList->SetFillerNotify(pNotify);
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Edit.cpp b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp
new file mode 100644
index 0000000000..87ddd87fb0
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Edit.cpp
@@ -0,0 +1,1316 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_FontMap.h"
+
+/* ---------------------------- CPWL_Edit ------------------------------ */
+
+CPWL_Edit::CPWL_Edit() : m_pFillerNotify(NULL),
+ m_pSpellCheck(NULL),
+ m_bFocus(FALSE)
+{
+ m_pFormFiller = NULL;
+}
+
+CPWL_Edit::~CPWL_Edit()
+{
+ ASSERT(m_bFocus == FALSE);
+}
+
+CFX_ByteString CPWL_Edit::GetClassName() const
+{
+ return PWL_CLASSNAME_EDIT;
+}
+
+void CPWL_Edit::OnDestroy()
+{
+}
+
+void CPWL_Edit::SetText(FX_LPCWSTR csText)
+{
+ CFX_WideString swText = csText;
+
+ if (HasFlag(PES_RICH))
+ {
+ CFX_ByteString sValue = CFX_ByteString::FromUnicode(swText);
+
+ if (CXML_Element * pXML = CXML_Element::Parse((FX_LPCSTR)sValue,sValue.GetLength()))
+ {
+ FX_INT32 nCount = pXML->CountChildren();
+ FX_BOOL bFirst = TRUE;
+
+ swText.Empty();
+
+ for (FX_INT32 i=0; i<nCount; i++)
+ {
+ if (CXML_Element * pSubElement = pXML->GetElement(i))
+ {
+ CFX_ByteString tag=pSubElement->GetTagName();
+ if (tag.EqualNoCase("p"))
+ {
+ int nChild = pSubElement->CountChildren();
+ CFX_WideString swSection;
+ for(FX_INT32 j=0; j<nChild; j++)
+ {
+ swSection += pSubElement->GetContent(j);
+ }
+
+ if (bFirst)bFirst = FALSE;
+ else
+ swText += FWL_VKEY_Return;
+ swText += swSection;
+ }
+ }
+ }
+
+ delete pXML;
+ }
+ }
+
+ m_pEdit->SetText(swText);
+}
+
+void CPWL_Edit::RePosChildWnd()
+{
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ {
+ //if (pVSB->IsVisible())
+ {
+ CPDF_Rect rcWindow = m_rcOldWindow;
+ CPDF_Rect rcVScroll = CPDF_Rect(rcWindow.right,
+ rcWindow.bottom,
+ rcWindow.right + PWL_SCROLLBAR_WIDTH,
+ rcWindow.top);
+ pVSB->Move(rcVScroll, TRUE, FALSE);
+ }
+ }
+
+ if (m_pEditCaret && !HasFlag(PES_TEXTOVERFLOW))
+ m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border
+
+ CPWL_EditCtrl::RePosChildWnd();
+}
+
+CPDF_Rect CPWL_Edit::GetClientRect() const
+{
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ {
+ if (pVSB->IsVisible())
+ {
+ rcClient.right -= PWL_SCROLLBAR_WIDTH;
+ }
+ }
+
+ return rcClient;
+}
+
+void CPWL_Edit::SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetAlignmentH((FX_INT32)nFormat, bPaint);
+}
+
+void CPWL_Edit::SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetAlignmentV((FX_INT32)nFormat, bPaint);
+}
+
+FX_BOOL CPWL_Edit::CanSelectAll() const
+{
+ return GetSelectWordRange() != m_pEdit->GetWholeWordRange();
+}
+
+FX_BOOL CPWL_Edit::CanClear() const
+{
+ return !IsReadOnly() && m_pEdit->IsSelected();
+}
+
+FX_BOOL CPWL_Edit::CanCopy() const
+{
+ return !HasFlag(PES_PASSWORD) && !HasFlag(PES_NOREAD) && m_pEdit->IsSelected();
+}
+
+FX_BOOL CPWL_Edit::CanCut() const
+{
+ return CanCopy() && !IsReadOnly();
+}
+
+FX_BOOL CPWL_Edit::CanPaste() const
+{
+ if (IsReadOnly()) return FALSE;
+
+ CFX_WideString swClipboard;
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ swClipboard = pSH->GetClipboardText(GetAttachedHWnd());
+
+ return !swClipboard.IsEmpty();
+}
+
+void CPWL_Edit::CopyText()
+{
+ if (!CanCopy()) return;
+
+ CFX_WideString str = m_pEdit->GetSelText();
+
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ pSH->SetClipboardText(GetAttachedHWnd(), str);
+}
+
+void CPWL_Edit::PasteText()
+{
+ if (!CanPaste()) return;
+
+ CFX_WideString swClipboard;
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ swClipboard = pSH->GetClipboardText(GetAttachedHWnd());
+
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bRC = TRUE;
+ FX_BOOL bExit = FALSE;
+ CFX_WideString strChangeEx;
+ int nSelStart = 0;
+ int nSelEnd = 0;
+ GetSel(nSelStart, nSelEnd);
+ m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), 0 , swClipboard, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, 0);
+ if (!bRC) return;
+ if (bExit) return;
+ }
+
+ if (swClipboard.GetLength() > 0)
+ {
+ Clear();
+ InsertText(swClipboard);
+ }
+
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bExit = FALSE;
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,0);
+ if (bExit) return;
+ }
+}
+
+void CPWL_Edit::CutText()
+{
+ if (!CanCut()) return;
+
+ CFX_WideString str = m_pEdit->GetSelText();
+
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ pSH->SetClipboardText(GetAttachedHWnd(), str);
+
+ m_pEdit->Clear();
+}
+
+void CPWL_Edit::OnCreated()
+{
+ CPWL_EditCtrl::OnCreated();
+
+ if (CPWL_ScrollBar * pScroll = GetVScrollBar())
+ {
+ pScroll->RemoveFlag(PWS_AUTOTRANSPARENT);
+ pScroll->SetTransparency(255);
+ }
+
+ SetParamByFlag();
+
+ m_rcOldWindow = GetWindowRect();
+
+ m_pEdit->SetOprNotify(this);
+ m_pEdit->EnableOprNotify(TRUE);
+}
+
+void CPWL_Edit::SetParamByFlag()
+{
+ if (HasFlag(PES_RIGHT))
+ {
+ m_pEdit->SetAlignmentH(2, FALSE);
+ }
+ else if (HasFlag(PES_MIDDLE))
+ {
+ m_pEdit->SetAlignmentH(1, FALSE);
+ }
+ else
+ {
+ m_pEdit->SetAlignmentH(0, FALSE);
+ }
+
+ if (HasFlag(PES_BOTTOM))
+ {
+ m_pEdit->SetAlignmentV(2, FALSE);
+ }
+ else if (HasFlag(PES_CENTER))
+ {
+ m_pEdit->SetAlignmentV(1, FALSE);
+ }
+ else
+ {
+ m_pEdit->SetAlignmentV(0, FALSE);
+ }
+
+ if (HasFlag(PES_PASSWORD))
+ {
+ m_pEdit->SetPasswordChar('*', FALSE);
+ }
+
+ m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE), FALSE);
+ m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN), FALSE);
+ m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE), FALSE);
+ m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL), FALSE);
+ m_pEdit->EnableUndo(HasFlag(PES_UNDO));
+
+ if (HasFlag(PES_TEXTOVERFLOW))
+ {
+ SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
+ m_pEdit->SetTextOverflow(TRUE, FALSE);
+ }
+ else
+ {
+ if (m_pEditCaret)
+ {
+ m_pEditCaret->SetClipRect(CPWL_Utils::InflateRect(GetClientRect(),1.0f)); //+1 for caret beside border
+ }
+ }
+
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pSpellCheck = GetCreationParam().pSpellCheck;
+ }
+}
+
+void CPWL_Edit::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ CPDF_Rect rcClient = GetClientRect();
+ CFX_ByteTextBuf sLine;
+
+ FX_INT32 nCharArray = m_pEdit->GetCharArray();
+
+ if (nCharArray > 0)
+ {
+ switch (GetBorderStyle())
+ {
+ case PBS_SOLID:
+ {
+ sLine << "q\n" << GetBorderWidth() << " w\n"
+ << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n";
+
+ for (FX_INT32 i=1;i<nCharArray;i++)
+ {
+ sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
+ << rcClient.bottom << " m\n"
+ << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
+ << rcClient.top << " l S\n";
+ }
+
+ sLine << "Q\n";
+ }
+ break;
+ case PBS_DASH:
+ {
+ sLine << "q\n" << GetBorderWidth() << " w\n"
+ << CPWL_Utils::GetColorAppStream(GetBorderColor(),FALSE) << " 2 J 0 j\n"
+ << "[" << GetBorderDash().nDash << " "
+ << GetBorderDash().nGap << "] "
+ << GetBorderDash().nPhase << " d\n";
+
+ for (FX_INT32 i=1;i<nCharArray;i++)
+ {
+ sLine << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
+ << rcClient.bottom << " m\n"
+ << rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*i << " "
+ << rcClient.top << " l S\n";
+ }
+
+ sLine << "Q\n";
+ }
+ break;
+ }
+ }
+
+ sAppStream << sLine;
+
+ CFX_ByteTextBuf sText;
+
+ CPDF_Point ptOffset = CPDF_Point(0.0f,0.0f);
+
+ CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange();
+ CPVT_WordRange wrSelect = GetSelectWordRange();
+ CPVT_WordRange wrVisible = (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange());
+ CPVT_WordRange wrSelBefore(wrWhole.BeginPos,wrSelect.BeginPos);
+ CPVT_WordRange wrSelAfter(wrSelect.EndPos,wrWhole.EndPos);
+
+ CPVT_WordRange wrTemp = CPWL_Utils::OverlapWordRange(GetSelectWordRange(),wrVisible);
+ CFX_ByteString sEditSel = CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset,
+ &wrTemp);
+
+ if (sEditSel.GetLength() > 0)
+ sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR) << sEditSel ;
+
+ wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelBefore);
+ CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
+ &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
+
+ if (sEditBefore.GetLength() > 0)
+ sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditBefore << "ET\n";
+
+ wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelect);
+ CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
+ &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
+
+ if (sEditMid.GetLength() > 0)
+ sText << "BT\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY,1)) << sEditMid << "ET\n";
+
+ wrTemp = CPWL_Utils::OverlapWordRange(wrVisible,wrSelAfter);
+ CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset,
+ &wrTemp, !HasFlag(PES_CHARARRAY), m_pEdit->GetPasswordChar());
+
+ if (sEditAfter.GetLength() > 0)
+ sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEditAfter<< "ET\n";
+
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ CFX_ByteString sSpellCheck = CPWL_Utils::GetSpellCheckAppStream(m_pEdit, m_pSpellCheck, ptOffset, &wrVisible);
+ if (sSpellCheck.GetLength() > 0)
+ sText << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,1,0,0),FALSE) << sSpellCheck;
+ }
+
+ if (sText.GetLength() > 0)
+ {
+ CPDF_Rect rcClient = this->GetClientRect();
+ sAppStream << "q\n/Tx BMC\n";
+
+ if (!HasFlag(PES_TEXTOVERFLOW))
+ sAppStream << rcClient.left << " " << rcClient.bottom << " "
+ << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n";
+
+ sAppStream << sText;
+
+ sAppStream << "EMC\nQ\n";
+ }
+}
+
+void CPWL_Edit::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ CPDF_Rect rcClient = GetClientRect();
+ CFX_ByteTextBuf sLine;
+
+ FX_INT32 nCharArray = m_pEdit->GetCharArray();
+
+ if (nCharArray > 0)
+ {
+ switch (GetBorderStyle())
+ {
+ case PBS_SOLID:
+ {
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();
+
+ CFX_PathData path;
+ path.SetPointCount((nCharArray-1)*2);
+
+ for (FX_INT32 i=0; i<nCharArray-1; i++)
+ {
+ path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
+ rcClient.bottom, FXPT_MOVETO);
+ path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
+ rcClient.top, FXPT_LINETO);
+ }
+ if (path.GetPointCount() > 0)
+ pDevice->DrawPath(&path, pUser2Device, &gsd,0,
+ CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);
+ }
+ break;
+ case PBS_DASH:
+ {
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = (FX_FLOAT)GetBorderWidth();
+
+ gsd.SetDashCount(2);
+ gsd.m_DashArray[0] = (FX_FLOAT)GetBorderDash().nDash;
+ gsd.m_DashArray[1] = (FX_FLOAT)GetBorderDash().nGap;
+ gsd.m_DashPhase = (FX_FLOAT)GetBorderDash().nPhase;
+
+ CFX_PathData path;
+ path.SetPointCount((nCharArray-1)*2);
+
+ for (FX_INT32 i=0; i<nCharArray-1; i++)
+ {
+ path.SetPoint(i*2, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
+ rcClient.bottom, FXPT_MOVETO);
+ path.SetPoint(i*2+1, rcClient.left + ((rcClient.right - rcClient.left)/nCharArray)*(i+1),
+ rcClient.top, FXPT_LINETO);
+ }
+ if (path.GetPointCount() > 0)
+ pDevice->DrawPath(&path, pUser2Device, &gsd,0,
+ CPWL_Utils::PWLColorToFXColor(GetBorderColor(),255), FXFILL_ALTERNATE);
+ }
+ break;
+ }
+ }
+
+ CPDF_Rect rcClip;
+ CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
+ CPVT_WordRange* pRange = NULL;
+
+ if (!HasFlag(PES_TEXTOVERFLOW))
+ {
+ rcClip = GetClientRect();
+ pRange = &wrRange;
+ }
+IFX_SystemHandler* pSysHandler = GetSystemHandler();
+ IFX_Edit::DrawEdit(pDevice,pUser2Device,m_pEdit,
+ CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()),
+ CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(),this->GetTransparency()),
+ rcClip,CPDF_Point(0.0f,0.0f),pRange, pSysHandler, m_pFormFiller);
+
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ CPWL_Utils::DrawEditSpellCheck(pDevice,pUser2Device,m_pEdit,rcClip,
+ CPDF_Point(0.0f,0.0f),pRange, this->GetCreationParam().pSpellCheck);
+ }
+}
+
+FX_BOOL CPWL_Edit::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
+ {
+ if (m_bMouseDown)
+ this->InvalidateRect();
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_Edit::OnLButtonDblClk(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDblClk(point, nFlag);
+
+ if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point))
+ {
+ m_pEdit->SelectAll();
+ }
+
+ return TRUE;
+}
+
+#define WM_PWLEDIT_UNDO 0x01
+#define WM_PWLEDIT_REDO 0x02
+#define WM_PWLEDIT_CUT 0x03
+#define WM_PWLEDIT_COPY 0x04
+#define WM_PWLEDIT_PASTE 0x05
+#define WM_PWLEDIT_DELETE 0x06
+#define WM_PWLEDIT_SELECTALL 0x07
+#define WM_PWLEDIT_SUGGEST 0x08
+
+FX_BOOL CPWL_Edit::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (m_bMouseDown) return FALSE;
+
+ CPWL_Wnd::OnRButtonUp(point, nFlag);
+
+ if (!HasFlag(PES_TEXTOVERFLOW) && !ClientHitTest(point)) return TRUE;
+
+ IFX_SystemHandler* pSH = GetSystemHandler();
+ if (!pSH) return FALSE;
+
+ this->SetFocus();
+
+ CPVT_WordRange wrLatin = GetLatinWordsRange(point);
+ CFX_WideString swLatin = m_pEdit->GetRangeText(wrLatin);
+
+ FX_HMENU hPopup = pSH->CreatePopupMenu();
+ if (!hPopup) return FALSE;
+
+ CFX_ByteStringArray sSuggestWords;
+ CPDF_Point ptPopup = point;
+
+ if (!IsReadOnly())
+ {
+ if (HasFlag(PES_SPELLCHECK) && !swLatin.IsEmpty())
+ {
+ if (m_pSpellCheck)
+ {
+ CFX_ByteString sLatin = CFX_ByteString::FromUnicode(swLatin);
+
+ if (!m_pSpellCheck->CheckWord(sLatin))
+ {
+ m_pSpellCheck->SuggestWords(sLatin,sSuggestWords);
+
+ FX_INT32 nSuggest = sSuggestWords.GetSize();
+
+ for (FX_INT32 nWord=0; nWord<nSuggest; nWord++)
+ {
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SUGGEST+nWord, sSuggestWords[nWord].UTF8Decode());
+ }
+
+ if (nSuggest > 0)
+ pSH->AppendMenuItem(hPopup, 0, L"");
+
+ ptPopup = GetWordRightBottomPoint(wrLatin.EndPos);
+ }
+ }
+ }
+ }
+
+ IPWL_Provider* pProvider = this->GetProvider();
+
+ if (HasFlag(PES_UNDO))
+ {
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_UNDO,
+ pProvider ? pProvider->LoadPopupMenuString(0) : L"&Undo");
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_REDO,
+ pProvider ? pProvider->LoadPopupMenuString(1) : L"&Redo");
+ pSH->AppendMenuItem(hPopup, 0, L"");
+
+ if (!m_pEdit->CanUndo())
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_UNDO, FALSE);
+ if (!m_pEdit->CanRedo())
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_REDO, FALSE);
+ }
+
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_CUT,
+ pProvider ? pProvider->LoadPopupMenuString(2) : L"Cu&t");
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_COPY,
+ pProvider ? pProvider->LoadPopupMenuString(3) : L"&Copy");
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_PASTE,
+ pProvider ? pProvider->LoadPopupMenuString(4) : L"&Paste");
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_DELETE,
+ pProvider ? pProvider->LoadPopupMenuString(5) : L"&Delete");
+
+ CFX_WideString swText = pSH->GetClipboardText(this->GetAttachedHWnd());
+ if (swText.IsEmpty())
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);
+
+ if (!m_pEdit->IsSelected())
+ {
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);
+ }
+
+ if (IsReadOnly())
+ {
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_DELETE, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_PASTE, FALSE);
+ }
+
+ if (HasFlag(PES_PASSWORD))
+ {
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
+ }
+
+ if (HasFlag(PES_NOREAD))
+ {
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_CUT, FALSE);
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_COPY, FALSE);
+ }
+
+ pSH->AppendMenuItem(hPopup, 0, L"");
+ pSH->AppendMenuItem(hPopup, WM_PWLEDIT_SELECTALL,
+ pProvider ? pProvider->LoadPopupMenuString(6) : L"&Select All");
+
+ if (m_pEdit->GetTotalWords() == 0)
+ {
+ pSH->EnableMenuItem(hPopup, WM_PWLEDIT_SELECTALL, FALSE);
+ }
+
+ FX_INT32 x, y;
+ PWLtoWnd(ptPopup, x, y);
+ pSH->ClientToScreen(GetAttachedHWnd(), x, y);
+ pSH->SetCursor(FXCT_ARROW);
+ FX_INT32 nCmd = pSH->TrackPopupMenu(hPopup,
+ x,
+ y,
+ GetAttachedHWnd());
+
+
+ switch (nCmd)
+ {
+ case WM_PWLEDIT_UNDO:
+ Undo();
+ break;
+ case WM_PWLEDIT_REDO:
+ Redo();
+ break;
+ case WM_PWLEDIT_CUT:
+ this->CutText();
+ break;
+ case WM_PWLEDIT_COPY:
+ this->CopyText();
+ break;
+ case WM_PWLEDIT_PASTE:
+ this->PasteText();
+ break;
+ case WM_PWLEDIT_DELETE:
+ this->Clear();
+ break;
+ case WM_PWLEDIT_SELECTALL:
+ this->SelectAll();
+ break;
+ case WM_PWLEDIT_SUGGEST + 0:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[0].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 1:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[1].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 2:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[2].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 3:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[3].UTF8Decode());
+ break;
+ case WM_PWLEDIT_SUGGEST + 4:
+ SetSel(m_pEdit->WordPlaceToWordIndex(wrLatin.BeginPos),m_pEdit->WordPlaceToWordIndex(wrLatin.EndPos));
+ ReplaceSel(sSuggestWords[4].UTF8Decode());
+ break;
+ default:
+ break;
+ }
+
+ pSH->DestroyMenu(hPopup);
+
+ return TRUE;
+}
+
+void CPWL_Edit::OnSetFocus()
+{
+ SetEditCaret(TRUE);
+
+ if (!IsReadOnly())
+ {
+ if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
+ pFocusHandler->OnSetFocus(this);
+ }
+
+ m_bFocus = TRUE;
+}
+
+void CPWL_Edit::OnKillFocus()
+{
+ ShowVScrollBar(FALSE);
+
+ m_pEdit->SelectNone();
+ SetCaret(FALSE, CPDF_Point(0.0f,0.0f), CPDF_Point(0.0f,0.0f));
+
+ SetCharSet(0);
+
+ if (!IsReadOnly())
+ {
+ if (IPWL_FocusHandler* pFocusHandler = GetFocusHandler())
+ pFocusHandler->OnKillFocus(this);
+ }
+
+ m_bFocus = FALSE;
+}
+
+void CPWL_Edit::SetHorzScale(FX_INT32 nHorzScale, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetHorzScale(nHorzScale, bPaint);
+}
+
+void CPWL_Edit::SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetCharSpace(fCharSpace, bPaint);
+}
+
+void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint/* = TRUE*/)
+{
+ m_pEdit->SetLineLeading(fLineLeading, bPaint);
+}
+
+CFX_ByteString CPWL_Edit::GetSelectAppearanceStream(const CPDF_Point & ptOffset) const
+{
+ CPVT_WordRange wr = GetSelectWordRange();
+ return CPWL_Utils::GetEditSelAppStream(m_pEdit,ptOffset,&wr);
+}
+
+CPVT_WordRange CPWL_Edit::GetSelectWordRange() const
+{
+ if (m_pEdit->IsSelected())
+ {
+ FX_INT32 nStart = -1;
+ FX_INT32 nEnd = -1;
+
+ m_pEdit->GetSel(nStart, nEnd);
+
+ CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart);
+ CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd);
+
+ return CPVT_WordRange(wpStart,wpEnd);
+ }
+
+ return CPVT_WordRange();
+}
+
+CFX_ByteString CPWL_Edit::GetTextAppearanceStream(const CPDF_Point & ptOffset) const
+{
+ CFX_ByteTextBuf sRet;
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);
+
+ if (sEdit.GetLength() > 0)
+ {
+ sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n";
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_ByteString CPWL_Edit::GetCaretAppearanceStream(const CPDF_Point & ptOffset) const
+{
+ if (m_pEditCaret)
+ return m_pEditCaret->GetCaretAppearanceStream(ptOffset);
+
+ return CFX_ByteString();
+}
+
+CPDF_Point CPWL_Edit::GetWordRightBottomPoint(const CPVT_WordPlace& wpWord)
+{
+ CPDF_Point pt(0.0f, 0.0f);
+
+ if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+ {
+ CPVT_WordPlace wpOld = pIterator->GetAt();
+ pIterator->SetAt(wpWord);
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ pt = CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent);
+ }
+
+ pIterator->SetAt(wpOld);
+ }
+
+ return pt;
+}
+
+FX_BOOL CPWL_Edit::IsTextFull() const
+{
+ return m_pEdit->IsTextFull();
+}
+
+FX_FLOAT CPWL_Edit::GetCharArrayAutoFontSize(CPDF_Font* pFont, const CPDF_Rect& rcPlate, FX_INT32 nCharArray)
+{
+ if (pFont && !pFont->IsStandardFont())
+ {
+ FX_RECT rcBBox;
+ pFont->GetFontBBox(rcBBox);
+
+ CPDF_Rect rcCell = rcPlate;
+ FX_FLOAT xdiv = rcCell.Width() / nCharArray * 1000.0f / rcBBox.Width();
+ FX_FLOAT ydiv = - rcCell.Height() * 1000.0f / rcBBox.Height();
+
+ return xdiv < ydiv ? xdiv : ydiv;
+ }
+
+ return 0.0f;
+}
+
+void CPWL_Edit::SetCharArray(FX_INT32 nCharArray)
+{
+ if (HasFlag(PES_CHARARRAY) && nCharArray > 0)
+ {
+ m_pEdit->SetCharArray(nCharArray);
+ m_pEdit->SetTextOverflow(TRUE);
+
+ if (HasFlag(PWS_AUTOFONTSIZE))
+ {
+ if (IFX_Edit_FontMap* pFontMap = this->GetFontMap())
+ {
+ FX_FLOAT fFontSize = GetCharArrayAutoFontSize(pFontMap->GetPDFFont(0), GetClientRect(), nCharArray);
+ if (fFontSize > 0.0f)
+ {
+ m_pEdit->SetAutoFontSize(FALSE);
+ m_pEdit->SetFontSize(fFontSize);
+ }
+ }
+ }
+ }
+}
+
+void CPWL_Edit::SetLimitChar(FX_INT32 nLimitChar)
+{
+ m_pEdit->SetLimitChar(nLimitChar);
+}
+
+void CPWL_Edit::ReplaceSel(FX_LPCWSTR csText)
+{
+ m_pEdit->Clear();
+ m_pEdit->InsertText(csText);
+}
+
+CPDF_Rect CPWL_Edit::GetFocusRect() const
+{
+ return CPDF_Rect();
+}
+
+void CPWL_Edit::ShowVScrollBar(FX_BOOL bShow)
+{
+ if (CPWL_ScrollBar * pScroll = GetVScrollBar())
+ {
+ if (bShow)
+ {
+ if (!pScroll->IsVisible())
+ {
+ pScroll->SetVisible(TRUE);
+ CPDF_Rect rcWindow = GetWindowRect();
+ m_rcOldWindow = rcWindow;
+ rcWindow.right += PWL_SCROLLBAR_WIDTH;
+ Move(rcWindow, TRUE, TRUE);
+ }
+ }
+ else
+ {
+ if (pScroll->IsVisible())
+ {
+ pScroll->SetVisible(FALSE);
+ Move(m_rcOldWindow, TRUE, TRUE);
+ }
+ }
+ }
+}
+
+FX_BOOL CPWL_Edit::IsVScrollBarVisible() const
+{
+ if (CPWL_ScrollBar * pScroll = GetVScrollBar())
+ {
+ return pScroll->IsVisible();
+ }
+
+ return FALSE;
+}
+
+void CPWL_Edit::EnableSpellCheck(FX_BOOL bEnabled)
+{
+ if (bEnabled)
+ AddFlag(PES_SPELLCHECK);
+ else
+ RemoveFlag(PES_SPELLCHECK);
+}
+
+FX_BOOL CPWL_Edit::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (m_bMouseDown) return TRUE;
+
+ if (nChar == FWL_VKEY_Delete)
+ {
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bRC = TRUE;
+ FX_BOOL bExit = FALSE;
+ CFX_WideString strChange;
+ CFX_WideString strChangeEx;
+
+ int nSelStart = 0;
+ int nSelEnd = 0;
+ GetSel(nSelStart, nSelEnd);
+
+ if (nSelStart == nSelEnd)
+ nSelEnd = nSelStart + 1;
+ m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), FWL_VKEY_Delete, strChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
+ if (!bRC) return FALSE;
+ if (bExit) return FALSE;
+ }
+ }
+
+ FX_BOOL bRet = CPWL_EditCtrl::OnKeyDown(nChar, nFlag);
+
+ if (nChar == FWL_VKEY_Delete)
+ {
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bExit = FALSE;
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
+ if (bExit) return FALSE;
+ }
+ }
+
+ //In case of implementation swallow the OnKeyDown event.
+ if(IsProceedtoOnChar(nChar, nFlag))
+ return TRUE;
+
+ return bRet;
+}
+
+/**
+*In case of implementation swallow the OnKeyDown event.
+*If the event is swallowed, implementation may do other unexpected things, which is not the control means to do.
+*/
+FX_BOOL CPWL_Edit::IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag)
+{
+
+ FX_BOOL bCtrl = IsCTRLpressed(nFlag);
+ FX_BOOL bAlt = IsALTpressed(nFlag);
+ if(bCtrl && !bAlt)
+ {
+ //hot keys for edit control.
+ switch(nKeyCode)
+ {
+ case 'C':
+ case 'V':
+ case 'X':
+ case 'A':
+ case 'Z':
+ return TRUE;
+ default:
+ break;
+ }
+ }
+ //control characters.
+ switch(nKeyCode)
+ {
+ case FWL_VKEY_Escape:
+ case FWL_VKEY_Back:
+ case FWL_VKEY_Return:
+ case FWL_VKEY_Space:
+ return TRUE;
+ default:
+ break;
+ }
+ return FALSE;
+
+}
+
+FX_BOOL CPWL_Edit::OnChar(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (m_bMouseDown) return TRUE;
+
+ FX_BOOL bRC = TRUE;
+ FX_BOOL bExit = FALSE;
+
+ FX_BOOL bCtrl = IsCTRLpressed(nFlag);
+ if (!bCtrl)
+ {
+ if (m_pFillerNotify)
+ {
+ CFX_WideString swChange;
+ FX_INT32 nKeyCode;
+
+ int nSelStart = 0;
+ int nSelEnd = 0;
+ GetSel(nSelStart, nSelEnd);
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Back:
+ nKeyCode = nChar;
+ if (nSelStart == nSelEnd)
+ nSelStart = nSelEnd - 1;
+ break;
+ case FWL_VKEY_Return:
+ nKeyCode = nChar;
+ break;
+ default:
+ nKeyCode = 0;
+ swChange += nChar;
+ break;
+ }
+
+ CFX_WideString strChangeEx;
+ m_pFillerNotify->OnBeforeKeyStroke(TRUE, GetAttachedData(), nKeyCode, swChange, strChangeEx, nSelStart, nSelEnd, TRUE, bRC, bExit, nFlag);
+ }
+ }
+
+ if (!bRC) return TRUE;
+ if (bExit) return FALSE;
+
+ if (IFX_Edit_FontMap * pFontMap = GetFontMap())
+ {
+ FX_INT32 nOldCharSet = GetCharSet();
+ FX_INT32 nNewCharSet = pFontMap->CharSetFromUnicode(nChar, DEFAULT_CHARSET);
+ if(nOldCharSet != nNewCharSet)
+ {
+ SetCharSet(nNewCharSet);
+ }
+ }
+ FX_BOOL bRet = CPWL_EditCtrl::OnChar(nChar,nFlag);
+
+ if (!bCtrl)
+ {
+ if (m_pFillerNotify)
+ {
+ m_pFillerNotify->OnAfterKeyStroke(TRUE, GetAttachedData(), bExit,nFlag);
+ if (bExit) return FALSE;
+ }
+ }
+
+ return bRet;
+}
+
+FX_BOOL CPWL_Edit::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (HasFlag(PES_MULTILINE))
+ {
+ CPDF_Point ptScroll = GetScrollPos();
+
+ if (zDelta > 0)
+ {
+ ptScroll.y += this->GetFontSize();
+ }
+ else
+ {
+ ptScroll.y -= this->GetFontSize();
+ }
+ this->SetScrollPos(ptScroll);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void CPWL_Edit::OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnInsertReturn(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnBackSpace(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnDelete(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnClear(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnInsertWord(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+}
+
+void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace)
+{
+ if (HasFlag(PES_SPELLCHECK))
+ {
+ m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace),GetLatinWordsRange(place)));
+ }
+
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnInsertText(place, oldplace);
+ }
+}
+
+void CPWL_Edit::OnAddUndo(IFX_Edit_UndoItem* pUndoItem)
+{
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnAddUndo(this);
+ }
+}
+
+CPVT_WordRange CPWL_Edit::CombineWordRange(const CPVT_WordRange& wr1, const CPVT_WordRange& wr2)
+{
+ CPVT_WordRange wrRet;
+
+ if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
+ {
+ wrRet.BeginPos = wr1.BeginPos;
+ }
+ else
+ {
+ wrRet.BeginPos = wr2.BeginPos;
+ }
+
+ if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
+ {
+ wrRet.EndPos = wr2.EndPos;
+ }
+ else
+ {
+ wrRet.EndPos = wr1.EndPos;
+ }
+
+ return wrRet;
+}
+
+CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPDF_Point& point) const
+{
+ return GetSameWordsRange(m_pEdit->SearchWordPlace(point), TRUE, FALSE);
+}
+
+CPVT_WordRange CPWL_Edit::GetLatinWordsRange(const CPVT_WordPlace & place) const
+{
+ return GetSameWordsRange(place, TRUE, FALSE);
+}
+
+CPVT_WordRange CPWL_Edit::GetArabicWordsRange(const CPVT_WordPlace & place) const
+{
+ return GetSameWordsRange(place, FALSE, TRUE);
+}
+
+#define PWL_ISARABICWORD(word) ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC))
+
+CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace & place, FX_BOOL bLatin, FX_BOOL bArabic) const
+{
+ CPVT_WordRange range;
+
+ if (IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator())
+ {
+ CPVT_Word wordinfo;
+ CPVT_WordPlace wpStart(place),wpEnd(place);
+ pIterator->SetAt(place);
+
+ if (bLatin)
+ {
+ while (pIterator->NextWord())
+ {
+ if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))
+ {
+ wpEnd = pIterator->GetAt();
+ continue;
+ }
+ else
+ break;
+ };
+ }
+ else if (bArabic)
+ {
+ while (pIterator->NextWord())
+ {
+ if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
+ {
+ wpEnd = pIterator->GetAt();
+ continue;
+ }
+ else
+ break;
+ };
+ }
+
+ pIterator->SetAt(place);
+
+ if (bLatin)
+ {
+ do
+ {
+ if (pIterator->GetWord(wordinfo) && FX_EDIT_ISLATINWORD(wordinfo.Word))
+ {
+ continue;
+ }
+ else
+ {
+ wpStart = pIterator->GetAt();
+ break;
+ }
+ }
+ while (pIterator->PrevWord());
+ }
+ else if (bArabic)
+ {
+ do
+ {
+ if (pIterator->GetWord(wordinfo) && PWL_ISARABICWORD(wordinfo.Word))
+ {
+ continue;
+ }
+ else
+ {
+ wpStart = pIterator->GetAt();
+ break;
+ }
+ }
+ while (pIterator->PrevWord());
+ }
+
+ range.Set(wpStart,wpEnd);
+ }
+
+ return range;
+}
+
+void CPWL_Edit::AjustArabicWords(const CPVT_WordRange& wr)
+{
+}
+
+void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
+{
+ IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);
+}
+
+void CPWL_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects,
+ const CPDF_Point& ptOffset)
+{
+ CFX_ArrayTemplate<CPDF_TextObject*> ObjArray;
+ IFX_Edit::GeneratePageObjects(pPageObjects, m_pEdit, ptOffset, NULL, CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()), ObjArray);
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp
new file mode 100644
index 0000000000..25628223ec
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp
@@ -0,0 +1,728 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+#include "../../include/pdfwindow/PWL_FontMap.h"
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+/* ---------------------------- CPWL_EditCtrl ------------------------------ */
+
+CPWL_EditCtrl::CPWL_EditCtrl() :
+ m_pEdit(NULL),
+ m_pEditCaret(NULL),
+ m_bMouseDown(FALSE),
+ m_pEditNotify(NULL),
+ m_nCharSet(DEFAULT_CHARSET),
+ m_nCodePage(0)
+{
+ m_pEdit = IFX_Edit::NewEdit();
+ ASSERT(m_pEdit != NULL);
+}
+
+CPWL_EditCtrl::~CPWL_EditCtrl()
+{
+ IFX_Edit::DelEdit(m_pEdit);
+}
+
+void CPWL_EditCtrl::OnCreate(PWL_CREATEPARAM & cp)
+{
+ cp.eCursorType = FXCT_VBEAM;
+}
+
+void CPWL_EditCtrl::OnCreated()
+{
+ SetFontSize(this->GetCreationParam().fFontSize);
+
+ m_pEdit->SetFontMap(this->GetFontMap());
+ m_pEdit->SetNotify(this);
+ m_pEdit->Initialize();
+}
+
+FX_BOOL CPWL_EditCtrl::IsWndHorV()
+{
+ CPDF_Matrix mt = GetWindowMatrix();
+ CPDF_Point point1(0,1);
+ CPDF_Point point2(1,1);
+
+ mt.Transform(point1.x, point1.y);
+ mt.Transform(point2.x, point2.y);
+
+ return point2.y == point1.y;
+}
+
+void CPWL_EditCtrl::SetCursor()
+{
+ if (IsValid())
+ {
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ {
+ if (IsWndHorV())
+ pSH->SetCursor(FXCT_VBEAM);
+ else
+ pSH->SetCursor(FXCT_HBEAM);
+ }
+ }
+}
+
+void CPWL_EditCtrl::RePosChildWnd()
+{
+ m_pEdit->SetPlateRect(GetClientRect());
+}
+
+void CPWL_EditCtrl::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+
+ switch (msg)
+ {
+ case PNM_SETSCROLLINFO:
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ if (CPWL_Wnd * pChild = GetVScrollBar())
+ {
+ pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
+ }
+ break;
+ }
+ break;
+ case PNM_SETSCROLLPOS:
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ if (CPWL_Wnd * pChild = GetVScrollBar())
+ {
+ pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+ }
+ break;
+ }
+ break;
+ case PNM_SCROLLWINDOW:
+ {
+ FX_FLOAT fPos = *(FX_FLOAT*)lParam;
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ m_pEdit->SetScrollPos(CPDF_Point(m_pEdit->GetScrollPos().x,fPos));
+ break;
+ }
+ }
+ break;
+ case PNM_SETCARETINFO:
+ {
+ if (PWL_CARET_INFO * pCaretInfo = (PWL_CARET_INFO *)wParam)
+ {
+ this->SetCaret(pCaretInfo->bVisible,
+ pCaretInfo->ptHead,
+ pCaretInfo->ptFoot);
+ }
+ }
+ break;
+ }
+}
+
+void CPWL_EditCtrl::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ if (!IsReadOnly())
+ CreateEditCaret(cp);
+}
+
+void CPWL_EditCtrl::CreateEditCaret(const PWL_CREATEPARAM & cp)
+{
+ if (!m_pEditCaret)
+ {
+ m_pEditCaret = new CPWL_Caret;
+ m_pEditCaret->SetInvalidRect(GetClientRect());
+
+ PWL_CREATEPARAM ecp = cp;
+ ecp.pParentWnd = this;
+ ecp.dwFlags = PWS_CHILD | PWS_NOREFRESHCLIP;
+ ecp.dwBorderWidth = 0;
+ ecp.nBorderStyle = PBS_SOLID;
+ ecp.rcRectWnd = CPDF_Rect(0,0,0,0);
+
+ m_pEditCaret->Create(ecp);
+ }
+}
+
+void CPWL_EditCtrl::SetFontSize(FX_FLOAT fFontSize)
+{
+ m_pEdit->SetFontSize(fFontSize);
+}
+
+FX_FLOAT CPWL_EditCtrl::GetFontSize() const
+{
+ return m_pEdit->GetFontSize();
+}
+
+FX_BOOL CPWL_EditCtrl::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (m_bMouseDown) return TRUE;
+
+ FX_BOOL bRet = CPWL_Wnd::OnKeyDown(nChar,nFlag);
+
+ //FILTER
+ switch (nChar)
+ {
+ default:
+ return FALSE;
+ case FWL_VKEY_Delete:
+ case FWL_VKEY_Up:
+ case FWL_VKEY_Down:
+ case FWL_VKEY_Left:
+ case FWL_VKEY_Right:
+ case FWL_VKEY_Home:
+ case FWL_VKEY_End:
+ case FWL_VKEY_Insert:
+ case 'C':
+ case 'V':
+ case 'X':
+ case 'A':
+ case 'Z':
+ case 'c':
+ case 'v':
+ case 'x':
+ case 'a':
+ case 'z':
+ break;
+ }
+
+ if (nChar == FWL_VKEY_Delete)
+ {
+ if (m_pEdit->IsSelected())
+ nChar = FWL_VKEY_Unknown;
+ }
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Delete:
+ Delete();
+ return TRUE;
+ case FWL_VKEY_Insert:
+ if (IsSHIFTpressed(nFlag))
+ PasteText();
+ return TRUE;
+ case FWL_VKEY_Up:
+ m_pEdit->OnVK_UP(IsSHIFTpressed(nFlag),FALSE);
+ return TRUE;
+ case FWL_VKEY_Down:
+ m_pEdit->OnVK_DOWN(IsSHIFTpressed(nFlag),FALSE);
+ return TRUE;
+ case FWL_VKEY_Left:
+ m_pEdit->OnVK_LEFT(IsSHIFTpressed(nFlag),FALSE);
+ return TRUE;
+ case FWL_VKEY_Right:
+ m_pEdit->OnVK_RIGHT(IsSHIFTpressed(nFlag),FALSE);
+ return TRUE;
+ case FWL_VKEY_Home:
+ m_pEdit->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ return TRUE;
+ case FWL_VKEY_End:
+ m_pEdit->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ return TRUE;
+ case FWL_VKEY_Unknown:
+ if (!IsSHIFTpressed(nFlag))
+ Clear();
+ else
+ CutText();
+ return TRUE;
+ default:
+ break;
+ }
+
+ return bRet;
+}
+
+FX_BOOL CPWL_EditCtrl::OnChar(FX_WORD nChar, FX_DWORD nFlag)
+{
+ if (m_bMouseDown) return TRUE;
+
+ CPWL_Wnd::OnChar(nChar,nFlag);
+
+ //FILTER
+ switch (nChar)
+ {
+ case 0x0A:
+ case 0x1B:
+ return FALSE;
+ default:
+ break;
+ }
+
+ FX_BOOL bCtrl = IsCTRLpressed(nFlag);
+ FX_BOOL bAlt = IsALTpressed(nFlag);
+ FX_BOOL bShift = IsSHIFTpressed(nFlag);
+
+ FX_WORD word = nChar;
+
+ if (bCtrl && !bAlt)
+ {
+ switch (nChar)
+ {
+ case 'C' - 'A' + 1:
+ this->CopyText();
+ return TRUE;
+ case 'V' - 'A' + 1:
+ this->PasteText();
+ return TRUE;
+ case 'X' - 'A' + 1:
+ this->CutText();
+ return TRUE;
+ case 'A' - 'A' + 1:
+ this->SelectAll();
+ return TRUE;
+ case 'Z' - 'A' + 1:
+ if (bShift)
+ Redo();
+ else
+ Undo();
+ return TRUE;
+ default:
+ if (nChar < 32)
+ return FALSE;
+ }
+ }
+
+ if (IsReadOnly()) return TRUE;
+
+ if (m_pEdit->IsSelected() && word == FWL_VKEY_Back)
+ word = FWL_VKEY_Unknown;
+
+ Clear();
+
+ switch (word)
+ {
+ case FWL_VKEY_Back:
+ Backspace();
+ break;
+ case FWL_VKEY_Return:
+ InsertReturn();
+ break;
+ case FWL_VKEY_Unknown:
+ break;
+ default:
+ if (IsINSERTpressed(nFlag))
+ Delete();
+ InsertWord(word, this->GetCharSet());
+ break;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (ClientHitTest(point))
+ {
+ if (m_bMouseDown)
+ this->InvalidateRect();
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ m_pEdit->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (m_bMouseDown)
+ {
+ //can receive keybord message
+ if (ClientHitTest(point) && !this->IsFocused())
+ SetFocus();
+
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_EditCtrl::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnMouseMove(point,nFlag);
+
+ if (m_bMouseDown)
+ m_pEdit->OnMouseMove(point,FALSE,FALSE);
+
+ return TRUE;
+}
+
+CPDF_Rect CPWL_EditCtrl::GetContentRect() const
+{
+ return m_pEdit->GetContentRect();
+}
+
+void CPWL_EditCtrl::SetEditCaret(FX_BOOL bVisible)
+{
+ CPDF_Point ptHead(0,0),ptFoot(0,0);
+
+ if (bVisible)
+ {
+ GetCaretInfo(ptHead,ptFoot);
+ }
+
+ CPVT_WordPlace wpTemp = m_pEdit->GetCaretWordPlace();
+ this->IOnSetCaret(bVisible,ptHead,ptFoot,wpTemp);
+}
+
+void CPWL_EditCtrl::GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const
+{
+ if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+ {
+ pIterator->SetAt(m_pEdit->GetCaret());
+ CPVT_Word word;
+ CPVT_Line line;
+ if (pIterator->GetWord(word))
+ {
+ ptHead.x = word.ptWord.x + word.fWidth;
+ ptHead.y = word.ptWord.y + word.fAscent;
+ ptFoot.x = word.ptWord.x + word.fWidth;
+ ptFoot.y = word.ptWord.y + word.fDescent;
+ }
+ else if (pIterator->GetLine(line))
+ {
+ ptHead.x = line.ptLine.x;
+ ptHead.y = line.ptLine.y + line.fLineAscent;
+ ptFoot.x = line.ptLine.x;
+ ptFoot.y = line.ptLine.y + line.fLineDescent;
+ }
+ }
+}
+
+void CPWL_EditCtrl::GetCaretPos(FX_INT32& x, FX_INT32& y) const
+{
+ CPDF_Point ptHead(0,0), ptFoot(0,0);
+
+ GetCaretInfo(ptHead,ptFoot);
+
+ PWLtoWnd(ptHead, x, y);
+}
+
+void CPWL_EditCtrl::SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot)
+{
+ if (m_pEditCaret)
+ {
+ if (!IsFocused() || m_pEdit->IsSelected())
+ bVisible = FALSE;
+
+ m_pEditCaret->SetCaret(bVisible, ptHead, ptFoot);
+ }
+}
+
+FX_BOOL CPWL_EditCtrl::IsModified() const
+{
+ return m_pEdit->IsModified();
+}
+
+CFX_WideString CPWL_EditCtrl::GetText() const
+{
+ return m_pEdit->GetText();
+}
+
+void CPWL_EditCtrl::SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar)
+{
+ m_pEdit->SetSel(nStartChar, nEndChar);
+}
+
+void CPWL_EditCtrl::GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const
+{
+ m_pEdit->GetSel(nStartChar, nEndChar);
+}
+
+void CPWL_EditCtrl::Clear()
+{
+ if (!IsReadOnly())
+ m_pEdit->Clear();
+}
+
+void CPWL_EditCtrl::SelectAll()
+{
+ m_pEdit->SelectAll();
+}
+
+void CPWL_EditCtrl::Paint()
+{
+ if (m_pEdit)
+ m_pEdit->Paint();
+}
+
+void CPWL_EditCtrl::EnableRefresh(FX_BOOL bRefresh)
+{
+ if (m_pEdit)
+ m_pEdit->EnableRefresh(bRefresh);
+}
+
+FX_INT32 CPWL_EditCtrl::GetCaret() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetCaret();
+
+ return -1;
+}
+
+void CPWL_EditCtrl::SetCaret(FX_INT32 nPos)
+{
+ if (m_pEdit)
+ m_pEdit->SetCaret(nPos);
+}
+
+FX_INT32 CPWL_EditCtrl::GetTotalWords() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetTotalWords();
+
+ return 0;
+}
+
+void CPWL_EditCtrl::SetScrollPos(const CPDF_Point& point)
+{
+ if (m_pEdit)
+ m_pEdit->SetScrollPos(point);
+}
+
+CPDF_Point CPWL_EditCtrl::GetScrollPos() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetScrollPos();
+
+ return CPDF_Point(0.0f, 0.0f);
+}
+
+CPDF_Font * CPWL_EditCtrl::GetCaretFont() const
+{
+ FX_INT32 nFontIndex = 0;
+
+ if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+ {
+ pIterator->SetAt(m_pEdit->GetCaret());
+ CPVT_Word word;
+ CPVT_Section section;
+ if (pIterator->GetWord(word))
+ {
+ nFontIndex = word.nFontIndex;
+ }
+ else if (HasFlag(PES_RICH))
+ {
+ if (pIterator->GetSection(section))
+ {
+ nFontIndex = section.WordProps.nFontIndex;
+ }
+ }
+ }
+
+ if (IFX_Edit_FontMap * pFontMap = GetFontMap())
+ return pFontMap->GetPDFFont(nFontIndex);
+ else
+ return NULL;
+}
+
+FX_FLOAT CPWL_EditCtrl::GetCaretFontSize() const
+{
+ FX_FLOAT fFontSize = GetFontSize();
+
+ if (IFX_Edit_Iterator * pIterator = m_pEdit->GetIterator())
+ {
+ pIterator->SetAt(m_pEdit->GetCaret());
+ CPVT_Word word;
+ CPVT_Section section;
+ if (pIterator->GetWord(word))
+ {
+ fFontSize = word.fFontSize;
+ }
+ else if (HasFlag(PES_RICH))
+ {
+ if (pIterator->GetSection(section))
+ {
+ fFontSize = section.WordProps.fFontSize;
+ }
+ }
+ }
+
+ return fFontSize;
+}
+
+void CPWL_EditCtrl::SetText(FX_LPCWSTR csText)
+{
+ m_pEdit->SetText(csText);
+}
+
+void CPWL_EditCtrl::CopyText()
+{
+}
+
+void CPWL_EditCtrl::PasteText()
+{
+}
+
+void CPWL_EditCtrl::CutText()
+{
+}
+
+void CPWL_EditCtrl::ShowVScrollBar(FX_BOOL bShow)
+{
+}
+
+void CPWL_EditCtrl::InsertText(FX_LPCWSTR csText)
+{
+ if (!IsReadOnly())
+ m_pEdit->InsertText(csText);
+}
+
+void CPWL_EditCtrl::InsertWord(FX_WORD word, FX_INT32 nCharset)
+{
+ if (!IsReadOnly())
+ m_pEdit->InsertWord(word, nCharset);
+}
+
+void CPWL_EditCtrl::InsertReturn()
+{
+ if (!IsReadOnly())
+ m_pEdit->InsertReturn();
+}
+
+void CPWL_EditCtrl::Delete()
+{
+ if (!IsReadOnly())
+ m_pEdit->Delete();
+}
+
+void CPWL_EditCtrl::Backspace()
+{
+ if (!IsReadOnly())
+ m_pEdit->Backspace();
+}
+
+FX_BOOL CPWL_EditCtrl::CanUndo() const
+{
+ return !IsReadOnly() && m_pEdit->CanUndo();
+}
+
+FX_BOOL CPWL_EditCtrl::CanRedo() const
+{
+ return !IsReadOnly() && m_pEdit->CanRedo();
+}
+
+void CPWL_EditCtrl::Redo()
+{
+ if (CanRedo())
+ m_pEdit->Redo();
+}
+
+void CPWL_EditCtrl::Undo()
+{
+ if (CanUndo())
+ m_pEdit->Undo();
+}
+
+void CPWL_EditCtrl::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
+{
+ PWL_SCROLL_INFO Info;
+
+ Info.fPlateWidth = fPlateMax - fPlateMin;
+ Info.fContentMin = fContentMin;
+ Info.fContentMax = fContentMax;
+ Info.fSmallStep = fSmallStep;
+ Info.fBigStep = fBigStep;
+
+ this->OnNotify(this,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
+
+// PWL_TRACE("set scroll info:%f\n",fContentMax - fContentMin);
+
+ if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
+ || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
+ {
+ this->ShowVScrollBar(FALSE);
+ }
+ else
+ {
+ this->ShowVScrollBar(TRUE);
+ }
+}
+
+void CPWL_EditCtrl::IOnSetScrollPosY(FX_FLOAT fy)
+{
+// PWL_TRACE("set scroll position:%f\n",fy);
+ this->OnNotify(this,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
+}
+
+void CPWL_EditCtrl::IOnSetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot, const CPVT_WordPlace& place)
+{
+ PWL_CARET_INFO cInfo;
+ cInfo.bVisible = bVisible;
+ cInfo.ptHead = ptHead;
+ cInfo.ptFoot = ptFoot;
+
+ this->OnNotify(this,PNM_SETCARETINFO,(FX_INTPTR)&cInfo,(FX_INTPTR)NULL);
+}
+
+void CPWL_EditCtrl::IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps)
+{
+}
+
+void CPWL_EditCtrl::IOnContentChange(const CPDF_Rect& rcContent)
+{
+ if (this->IsValid())
+ {
+ if (m_pEditNotify)
+ {
+ m_pEditNotify->OnContentChange(rcContent);
+ }
+ }
+}
+
+void CPWL_EditCtrl::IOnInvalidateRect(CPDF_Rect * pRect)
+{
+ this->InvalidateRect(pRect);
+}
+
+FX_INT32 CPWL_EditCtrl::GetCharSet() const
+{
+ if (m_nCharSet < 0)
+ return DEFAULT_CHARSET;
+ else
+ return m_nCharSet;
+}
+
+void CPWL_EditCtrl::GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
+{
+ nStartChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.left, rect.top)));
+ nEndChar = m_pEdit->WordPlaceToWordIndex(m_pEdit->SearchWordPlace(CPDF_Point(rect.right, rect.bottom)));
+}
+
+CFX_WideString CPWL_EditCtrl::GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const
+{
+ CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStartChar);
+ CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEndChar);
+ return m_pEdit->GetRangeText(CPVT_WordRange(wpStart, wpEnd));
+}
+
+void CPWL_EditCtrl::SetReadyToInput()
+{
+ if (m_bMouseDown)
+ {
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+ }
+}
diff --git a/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
new file mode 100644
index 0000000000..1e2259fe50
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_FontMap.cpp
@@ -0,0 +1,601 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_FontMap.h"
+
+#define DEFAULT_FONT_NAME "Helvetica"
+
+/* ------------------------------ CPWL_FontMap ------------------------------ */
+
+CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) :
+ m_pPDFDoc(NULL),
+ m_pSystemHandler(pSystemHandler)
+{
+ ASSERT(m_pSystemHandler != NULL);
+}
+
+CPWL_FontMap::~CPWL_FontMap()
+{
+ if (m_pPDFDoc)
+ {
+ delete m_pPDFDoc;
+ m_pPDFDoc = NULL;
+ }
+
+ Empty();
+}
+
+void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler)
+{
+ m_pSystemHandler = pSystemHandler;
+}
+
+CPDF_Document* CPWL_FontMap::GetDocument()
+{
+ if (!m_pPDFDoc)
+ {
+ if (CPDF_ModuleMgr::Get())
+ {
+ m_pPDFDoc = FX_NEW CPDF_Document;
+ m_pPDFDoc->CreateNewDoc();
+ }
+ }
+
+ return m_pPDFDoc;
+}
+
+CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex)
+{
+ if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+ {
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+ {
+ return pData->pFont;
+ }
+ }
+
+ return NULL;
+}
+
+CFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex)
+{
+ if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+ {
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+ {
+ return pData->sFontName;
+ }
+ }
+
+ return "";
+}
+
+FX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word)
+{
+ if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+ {
+ if (m_aData.GetAt(nFontIndex))
+ {
+ return CharCodeFromUnicode(nFontIndex, word) >= 0;
+ }
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT32 nFontIndex)
+{
+ if (nFontIndex > 0)
+ {
+ if (KnowWord(nFontIndex, word))
+ return nFontIndex;
+ }
+ else
+ {
+ if (const CPWL_FontMap_Data* pData = GetFontMapData(0))
+ {
+ if (nCharset == DEFAULT_CHARSET ||
+ pData->nCharset == SYMBOL_CHARSET ||
+ nCharset == pData->nCharset)
+ {
+ if (KnowWord(0, word))
+ {
+ return 0;
+ }
+ }
+ }
+ }
+
+ FX_INT32 nNewFontIndex = -1;
+
+ nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE);
+ if (nNewFontIndex >= 0)
+ {
+ if (KnowWord(nNewFontIndex, word))
+ return nNewFontIndex;
+ }
+
+ nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE);
+ if (nNewFontIndex >= 0)
+ {
+ if (KnowWord(nNewFontIndex, word))
+ return nNewFontIndex;
+ }
+
+ return -1;
+}
+
+FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word)
+{
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+ {
+ if (pData->pFont)
+ {
+ if (pData->pFont->IsUnicodeCompatible())
+ {
+ int nCharCode = pData->pFont->CharCodeFromUnicode(word);
+ pData->pFont->GlyphFromCharCode(nCharCode);
+ return nCharCode;
+ }
+ else
+ {
+ if (word < 0xFF)
+ return word;
+ }
+ }
+ }
+
+ return -1;
+}
+
+CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset)
+{
+ //searching native font is slow, so we must save time
+ for (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++)
+ {
+ if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i))
+ {
+ if (pData->nCharset == nCharset)
+ return pData->sFontName;
+ }
+ }
+
+ CFX_ByteString sNew = GetNativeFont(nCharset);
+
+ if (!sNew.IsEmpty())
+ {
+ CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native;
+ pNewData->nCharset = nCharset;
+ pNewData->sFontName = sNew;
+
+ m_aNativeFont.Add(pNewData);
+ }
+
+ return sNew;
+}
+
+void CPWL_FontMap::Empty()
+{
+ {
+ for (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++)
+ delete m_aData.GetAt(i);
+
+ m_aData.RemoveAll();
+ }
+ {
+ for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++)
+ delete m_aNativeFont.GetAt(i);
+
+ m_aNativeFont.RemoveAll();
+ }
+}
+
+void CPWL_FontMap::Initial(FX_LPCSTR fontname)
+{
+ CFX_ByteString sFontName = fontname;
+
+ if (sFontName.IsEmpty())
+ sFontName = DEFAULT_FONT_NAME;
+
+ GetFontIndex(sFontName, ANSI_CHARSET, FALSE);
+
+ //GetFontIndex(this->GetNativeFontName(nCharset), nCharset);
+}
+
+
+/*
+List of currently supported standard fonts:
+Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique
+Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique
+Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
+Symbol, ZapfDingbats
+*/
+
+const char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique",
+ "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique",
+ "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
+ "Symbol", "ZapfDingbats"};
+
+FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName)
+{
+ for (FX_INT32 i=0; i<14; i++)
+ {
+ if (sFontName == g_sDEStandardFontName[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nCharset)
+{
+ for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
+ {
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
+ {
+ if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset)
+ {
+ if (sFontName.IsEmpty() || pData->sFontName == sFontName)
+ return i;
+ }
+ }
+ }
+
+ return -1;
+}
+
+FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nCharset, FX_BOOL bFind)
+{
+ FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
+ if (nFontIndex >= 0) return nFontIndex;
+
+// nFontIndex = FindFont("", nCharset);
+// if (nFontIndex >= 0) return nFontIndex;
+
+ CFX_ByteString sAlias;
+ CPDF_Font* pFont = NULL;
+
+ if (bFind)
+ pFont = FindFontSameCharset(sAlias, nCharset);
+
+ if (!pFont)
+ {
+ CFX_ByteString sTemp = sFontName;
+ pFont = AddFontToDocument(GetDocument(), sTemp, nCharset);
+
+ /*
+ if (FindFont(sAlias))
+ {
+ sAlias = EncodeFontAlias(sTemp, nCharset);
+ }
+ else
+ */
+ {
+ sAlias = EncodeFontAlias(sTemp, nCharset);
+ }
+ }
+
+ AddedFont(pFont, sAlias);
+
+ return AddFontData(pFont, sAlias, nCharset);
+}
+
+FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset)
+{
+ FX_INT32 nFind = -1;
+
+ for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++)
+ {
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(i))
+ {
+ if (pData->nCharset == nCharset)
+ {
+ nFind = i;
+ break;
+ }
+ }
+ }
+
+ CPDF_Font* pNewFont = GetPDFFont(nFind);
+
+ if (!pNewFont) return -1;
+
+ /*
+ if (CPDF_Font* pFont = GetPDFFont(nFind))
+ {
+ PWLFont.AddWordToFontDict(pFontDict, word);
+ }
+ */
+
+#ifdef FOXIT_CHROME_BUILD
+ CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset);
+#else
+ CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset);
+#endif
+ AddedFont(pNewFont, sAlias);
+
+ return AddFontData(pNewFont, sAlias, nCharset);
+}
+
+CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT32 nCharset)
+{
+ return NULL;
+}
+
+FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFontAlias, FX_INT32 nCharset)
+{
+ CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data;
+ pNewData->pFont = pFont;
+ pNewData->sFontName = sFontAlias;
+ pNewData->nCharset = nCharset;
+
+ m_aData.Add(pNewData);
+
+ return m_aData.GetSize() -1;
+}
+
+void CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias)
+{
+}
+
+CFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex)
+{
+ if (nFontIndex >=0 && nFontIndex < m_aData.GetSize())
+ {
+ if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex))
+ {
+ return pData->sFontName;
+ }
+ }
+
+ return "";
+}
+
+CFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset)
+{
+ CFX_ByteString sFontName;
+
+ if (nCharset == DEFAULT_CHARSET)
+ nCharset = GetNativeCharset();
+
+ sFontName = GetDefaultFontByCharset(nCharset);
+
+ if (m_pSystemHandler)
+ {
+ if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName))
+ return sFontName;
+
+ sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset);
+ }
+
+ return sFontName;
+}
+
+CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
+{
+ if (IsStandardFont(sFontName))
+ return AddStandardFont(pDoc, sFontName);
+ else
+ return AddSystemFont(pDoc, sFontName, nCharset);
+}
+
+CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sFontName)
+{
+ if (!pDoc) return NULL;
+
+ CPDF_Font* pFont = NULL;
+
+ if (sFontName == "ZapfDingbats")
+ pFont = pDoc->AddStandardFont(sFontName, NULL);
+ else
+ {
+ CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI);
+ pFont = pDoc->AddStandardFont(sFontName, &fe);
+ }
+
+ return pFont;
+}
+
+CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFontName, FX_BYTE nCharset)
+{
+ if (!pDoc) return NULL;
+
+ if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset);
+ if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset();
+
+ if (m_pSystemHandler)
+ return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontName, nCharset);
+
+ return NULL;
+}
+
+CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX_INT32 nCharset)
+{
+ CFX_ByteString sPostfix;
+ sPostfix.Format("_%02X", nCharset);
+ return EncodeFontAlias(sFontName) + sPostfix;
+}
+
+CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName)
+{
+ CFX_ByteString sRet = sFontName;
+ sRet.Remove(' ');
+ return sRet;
+}
+
+FX_INT32 CPWL_FontMap::GetFontMapCount() const
+{
+ return m_aData.GetSize();
+}
+
+const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const
+{
+ if (nIndex >=0 && nIndex < m_aData.GetSize())
+ {
+ return m_aData.GetAt(nIndex);
+ }
+
+ return NULL;
+}
+
+FX_INT32 CPWL_FontMap::GetNativeCharset()
+{
+ FX_BYTE nCharset = ANSI_CHARSET;
+ FX_INT32 iCodePage = FXSYS_GetACP();
+ switch (iCodePage)
+ {
+ case 932://Japan
+ nCharset = SHIFTJIS_CHARSET;
+ break;
+ case 936://Chinese (PRC, Singapore)
+ nCharset = GB2312_CHARSET;
+ break;
+ case 950://Chinese (Taiwan; Hong Kong SAR, PRC)
+ nCharset = GB2312_CHARSET;
+ break;
+ case 1252://Windows 3.1 Latin 1 (US, Western Europe)
+ nCharset = ANSI_CHARSET;
+ break;
+ case 874://Thai
+ nCharset = THAI_CHARSET;
+ break;
+ case 949://Korean
+ nCharset = HANGUL_CHARSET;
+ break;
+ case 1200://Unicode (BMP of ISO 10646)
+ nCharset = ANSI_CHARSET;
+ break;
+ case 1250://Windows 3.1 Eastern European
+ nCharset = EASTEUROPE_CHARSET;
+ break;
+ case 1251://Windows 3.1 Cyrillic
+ nCharset = RUSSIAN_CHARSET;
+ break;
+ case 1253://Windows 3.1 Greek
+ nCharset = GREEK_CHARSET;
+ break;
+ case 1254://Windows 3.1 Turkish
+ nCharset = TURKISH_CHARSET;
+ break;
+ case 1255://Hebrew
+ nCharset = HEBREW_CHARSET;
+ break;
+ case 1256://Arabic
+ nCharset = ARABIC_CHARSET;
+ break;
+ case 1257://Baltic
+ nCharset = BALTIC_CHARSET;
+ break;
+ case 1258://Vietnamese
+ nCharset = VIETNAMESE_CHARSET;
+ break;
+ case 1361://Korean(Johab)
+ nCharset = JOHAB_CHARSET;
+ break;
+ }
+ return nCharset;
+}
+
+const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = {
+ { ANSI_CHARSET, "Helvetica" },
+ { GB2312_CHARSET, "SimSun" },
+ { CHINESEBIG5_CHARSET, "MingLiU" },
+ { SHIFTJIS_CHARSET, "MS Gothic" },
+ { HANGUL_CHARSET, "Batang" },
+ { RUSSIAN_CHARSET, "Arial" },
+ { EASTEUROPE_CHARSET, "Tahoma" },
+ { ARABIC_CHARSET, "Arial" },
+ { -1, NULL }
+};
+
+CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset)
+{
+ int i = 0;
+ while (defaultTTFMap[i].charset != -1) {
+ if (nCharset == defaultTTFMap[i].charset)
+ return defaultTTFMap[i].fontname;
+ ++i;
+ }
+ return "";
+}
+
+FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset)
+{
+ if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet()))
+ return m_pSystemHandler->GetCharSet();
+ //to avoid CJK Font to show ASCII
+ if (word < 0x7F) return ANSI_CHARSET;
+ //follow the old charset
+ if (nOldCharset != DEFAULT_CHARSET) return nOldCharset;
+
+ //find new charset
+ if ((word >= 0x4E00 && word <= 0x9FA5) ||
+ (word >= 0xE7C7 && word <= 0xE7F3) ||
+ (word >= 0x3000 && word <= 0x303F) || //£©"¡¶" "¡·" "¡£" "¡¢"
+ (word >= 0x2000 && word <= 0x206F))
+ {
+ return GB2312_CHARSET;
+ }
+
+ if (((word >= 0x3040) && (word <= 0x309F)) ||
+ ((word >= 0x30A0) && (word <= 0x30FF)) ||
+ ((word >= 0x31F0) && (word <= 0x31FF)) ||
+ ((word >= 0xFF00) && (word <= 0xFFEF)) )
+ {
+ return SHIFTJIS_CHARSET;
+ }
+
+ if (((word >= 0xAC00) && (word <= 0xD7AF)) ||
+ ((word >= 0x1100) && (word <= 0x11FF)) ||
+ ((word >= 0x3130) && (word <= 0x318F)))
+ {
+ return HANGUL_CHARSET;
+ }
+
+ if (word >= 0x0E00 && word <= 0x0E7F)
+ return THAI_CHARSET;
+
+ if ((word >= 0x0370 && word <= 0x03FF) ||
+ (word >= 0x1F00 && word <= 0x1FFF))
+ return GREEK_CHARSET;
+
+ if ((word >= 0x0600 && word <= 0x06FF) ||
+ (word >= 0xFB50 && word <= 0xFEFC))
+ return ARABIC_CHARSET;
+
+ if (word >= 0x0590 && word <= 0x05FF)
+ return HEBREW_CHARSET;
+
+ if (word >= 0x0400 && word <= 0x04FF)
+ return RUSSIAN_CHARSET;
+
+ if (word >= 0x0100 && word <= 0x024F)
+ return EASTEUROPE_CHARSET;
+
+ if (word >= 0x1E00 && word <= 0x1EFF)
+ return VIETNAMESE_CHARSET;
+
+ return ANSI_CHARSET;
+}
+
+/* ------------------------ CPWL_DocFontMap ------------------------ */
+
+CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Document* pAttachedDoc)
+ : CPWL_FontMap(pSystemHandler),
+ m_pAttachedDoc(pAttachedDoc)
+{
+}
+
+CPWL_DocFontMap::~CPWL_DocFontMap()
+{
+}
+
+CPDF_Document* CPWL_DocFontMap::GetDocument()
+{
+ return m_pAttachedDoc;
+}
diff --git a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp
new file mode 100644
index 0000000000..a859a52de7
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp
@@ -0,0 +1,272 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Icon.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ------------------------------- CPWL_Image ---------------------------------- */
+
+CPWL_Image::CPWL_Image() : m_pPDFStream(NULL)
+{
+}
+
+CPWL_Image::~CPWL_Image()
+{
+}
+
+CFX_ByteString CPWL_Image::GetImageAppStream()
+{
+ CFX_ByteTextBuf sAppStream;
+
+ CFX_ByteString sAlias = this->GetImageAlias();
+ CPDF_Rect rcPlate = GetClientRect();
+ CPDF_Matrix mt;
+ mt.SetReverse(GetImageMatrix());
+
+ FX_FLOAT fHScale = 1.0f;
+ FX_FLOAT fVScale = 1.0f;
+ GetScale(fHScale,fVScale);
+
+ FX_FLOAT fx = 0.0f;
+ FX_FLOAT fy = 0.0f;
+ GetImageOffset(fx,fy);
+
+ if (m_pPDFStream && sAlias.GetLength()>0)
+ {
+ sAppStream << "q\n";
+ sAppStream << rcPlate.left << " " << rcPlate.bottom << " "
+ << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom << " re W n\n";
+
+ sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " << rcPlate.bottom + fy << " cm\n";
+ sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n";
+
+ sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" << "Q\n";
+ }
+
+ return sAppStream.GetByteString();
+}
+
+void CPWL_Image::SetPDFStream(CPDF_Stream * pStream)
+{
+ m_pPDFStream = pStream;
+}
+
+CPDF_Stream * CPWL_Image::GetPDFStream()
+{
+ return this->m_pPDFStream;
+}
+
+void CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight)
+{
+ fWidth = 0.0f;
+ fHeight = 0.0f;
+
+ if (m_pPDFStream)
+ {
+ if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
+ {
+ CPDF_Rect rect = pDict->GetRect("BBox");
+
+ fWidth = rect.right - rect.left;
+ fHeight = rect.top - rect.bottom;
+ }
+ }
+}
+
+CPDF_Matrix CPWL_Image::GetImageMatrix()
+{
+ if (m_pPDFStream)
+ {
+ if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
+ {
+ return pDict->GetMatrix("Matrix");
+ }
+ }
+
+ return CPDF_Matrix();
+}
+
+CFX_ByteString CPWL_Image::GetImageAlias()
+{
+ if (m_sImageAlias.IsEmpty())
+ {
+ if (m_pPDFStream)
+ {
+ if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
+ {
+ return pDict->GetString("Name");
+ }
+ }
+ }
+ else
+ return m_sImageAlias;
+
+ return CFX_ByteString();
+}
+
+void CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias)
+{
+ m_sImageAlias = sImageAlias;
+}
+
+void CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
+{
+ fHScale = 1.0f;
+ fVScale = 1.0f;
+}
+
+
+void CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
+{
+ x = 0.0f;
+ y = 0.0f;
+}
+
+/* ------------------------------- CPWL_Icon ---------------------------------- */
+
+CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL)
+{
+}
+
+CPWL_Icon::~CPWL_Icon()
+{
+}
+
+FX_INT32 CPWL_Icon::GetScaleMethod()
+{
+ if (m_pIconFit)
+ return m_pIconFit->GetScaleMethod();
+
+ return 0;
+}
+
+FX_BOOL CPWL_Icon::IsProportionalScale()
+{
+ if (m_pIconFit)
+ return m_pIconFit->IsProportionalScale();
+
+ return FALSE;
+}
+
+void CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom)
+{
+ if (m_pIconFit)
+ {
+ //m_pIconFit->GetIconPosition(fLeft,fBottom);
+ fLeft = 0.0f;
+ fBottom = 0.0f;
+ CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A");
+ if (pA != NULL)
+ {
+ FX_DWORD dwCount = pA->GetCount();
+ if (dwCount > 0) fLeft = pA->GetNumber(0);
+ if (dwCount > 1) fBottom = pA->GetNumber(1);
+ }
+ }
+ else
+ {
+ fLeft = 0.0f;
+ fBottom = 0.0f;
+ }
+}
+
+FX_BOOL CPWL_Icon::GetFittingBounds()
+{
+ if (m_pIconFit)
+ return m_pIconFit->GetFittingBounds();
+
+ return FALSE;
+}
+
+void CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
+{
+ fHScale = 1.0f;
+ fVScale = 1.0f;
+
+ if (m_pPDFStream)
+ {
+ FX_FLOAT fImageWidth,fImageHeight;
+ FX_FLOAT fPlateWidth,fPlateHeight;
+
+ CPDF_Rect rcPlate = this->GetClientRect();
+ fPlateWidth = rcPlate.right - rcPlate.left;
+ fPlateHeight = rcPlate.top - rcPlate.bottom;
+
+ GetImageSize(fImageWidth,fImageHeight);
+
+ FX_INT32 nScaleMethod = this->GetScaleMethod();
+
+ /*
+ enum ScaleMethod
+ {
+ Always = 0, //A, Always scale
+ Bigger, //B, Scale only when the icon is bigger than the annotation rectangle
+ Smaller, //S, Scale only when the icon is smaller then the annotation rectangle
+ Never //N, Never scale
+ };
+ */
+
+ switch (nScaleMethod)
+ {
+ default:
+ case 0:
+ fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
+ fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
+ break;
+ case 1:
+ if (fPlateWidth < fImageWidth)
+ fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
+ if (fPlateHeight < fImageHeight)
+ fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
+ break;
+ case 2:
+ if (fPlateWidth > fImageWidth)
+ fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
+ if (fPlateHeight > fImageHeight)
+ fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
+ break;
+ case 3:
+ break;
+ }
+
+ FX_FLOAT fMinScale;
+ if (IsProportionalScale())
+ {
+ fMinScale = PWL_MIN(fHScale,fVScale);
+ fHScale = fMinScale;
+ fVScale = fMinScale;
+ }
+ }
+}
+
+void CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
+{
+ FX_FLOAT fLeft,fBottom;
+
+ this->GetIconPosition(fLeft,fBottom);
+ x = 0.0f;
+ y = 0.0f;
+
+ FX_FLOAT fImageWidth,fImageHeight;
+ GetImageSize(fImageWidth,fImageHeight);
+
+ FX_FLOAT fHScale,fVScale;
+ GetScale(fHScale,fVScale);
+
+ FX_FLOAT fImageFactWidth = fImageWidth * fHScale;
+ FX_FLOAT fImageFactHeight = fImageHeight * fVScale;
+
+ FX_FLOAT fPlateWidth,fPlateHeight;
+ CPDF_Rect rcPlate = this->GetClientRect();
+ fPlateWidth = rcPlate.right - rcPlate.left;
+ fPlateHeight = rcPlate.top - rcPlate.bottom;
+
+ x = (fPlateWidth - fImageFactWidth) * fLeft;
+ y = (fPlateHeight - fImageFactHeight) * fBottom;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_IconList.cpp b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp
new file mode 100644
index 0000000000..09b66786db
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_IconList.cpp
@@ -0,0 +1,592 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+#include "../../include/pdfwindow/PWL_IconList.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+
+#define PWL_IconList_ITEM_ICON_LEFTMARGIN 10.0f
+#define PWL_IconList_ITEM_WIDTH 20.0f
+#define PWL_IconList_ITEM_HEIGHT 20.0f
+#define PWL_IconList_ITEM_SPACE 4.0f
+
+/* ------------------ CPWL_IconList_Item ------------------- */
+
+CPWL_IconList_Item::CPWL_IconList_Item() :
+ m_nIconIndex(-1),
+ m_pData(NULL),
+ m_bSelected(FALSE),
+ m_pText(NULL)
+{
+}
+
+CPWL_IconList_Item::~CPWL_IconList_Item()
+{
+}
+
+CFX_ByteString CPWL_IconList_Item::GetClassName() const
+{
+ return "CPWL_IconList_Item";
+}
+
+FX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth)
+{
+ return PWL_IconList_ITEM_HEIGHT;
+}
+
+void CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (m_bSelected)
+ {
+ if (this->IsEnabled())
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,this->GetTransparency()));
+ }
+ else
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcClient,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,this->GetTransparency()));
+ }
+ }
+
+ CPDF_Rect rcIcon = rcClient;
+ rcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN;
+ rcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH;
+
+ CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon,
+ m_crIcon, m_pText->GetTextColor(), this->GetTransparency());
+}
+
+void CPWL_IconList_Item::SetSelect(FX_BOOL bSelected)
+{
+ m_bSelected = bSelected;
+
+ if (bSelected)
+ m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
+ else
+ m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
+
+}
+
+FX_BOOL CPWL_IconList_Item::IsSelected() const
+{
+ return m_bSelected;
+}
+
+void CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ m_pText = new CPWL_Label;
+
+ PWL_CREATEPARAM lcp = cp;
+ lcp.pParentWnd = this;
+ lcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER;
+ lcp.sTextColor = PWL_DEFAULT_BLACKCOLOR;
+ lcp.fFontSize = 12;
+ m_pText->Create(lcp);
+}
+
+void CPWL_IconList_Item::SetData(void* pData)
+{
+ m_pData = pData;
+}
+
+void CPWL_IconList_Item::SetIcon(FX_INT32 nIconIndex)
+{
+ m_nIconIndex = nIconIndex;
+}
+
+void CPWL_IconList_Item::SetText(const CFX_WideString& str)
+{
+ m_pText->SetText(str);
+}
+
+CFX_WideString CPWL_IconList_Item::GetText() const
+{
+ return m_pText->GetText();
+}
+
+void CPWL_IconList_Item::RePosChildWnd()
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ rcClient.left += (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH + PWL_IconList_ITEM_ICON_LEFTMARGIN);
+
+ m_pText->Move(rcClient, TRUE, FALSE);
+}
+
+void CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color)
+{
+ m_crIcon = color;
+}
+
+void CPWL_IconList_Item::OnEnabled()
+{
+ if (m_bSelected)
+ m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
+ else
+ m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
+
+ this->InvalidateRect();
+}
+
+void CPWL_IconList_Item::OnDisabled()
+{
+ m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR);
+
+ this->InvalidateRect();
+}
+
+/* ----------------- CPWL_IconList_Content ----------------- */
+
+CPWL_IconList_Content::CPWL_IconList_Content(FX_INT32 nListCount) :
+ m_nSelectIndex(-1),
+ m_pNotify(NULL),
+ m_bEnableNotify(TRUE),
+ m_bMouseDown(FALSE),
+ m_nListCount(nListCount)
+{
+}
+
+CPWL_IconList_Content::~CPWL_IconList_Content()
+{
+}
+
+void CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ for (FX_INT32 i=0; i<m_nListCount; i++)
+ {
+ CPWL_IconList_Item* pNewItem = new CPWL_IconList_Item();
+
+ PWL_CREATEPARAM icp = cp;
+ icp.pParentWnd = this;
+ icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP;
+ pNewItem->Create(icp);
+ }
+
+ this->SetItemSpace(PWL_IconList_ITEM_SPACE);
+ this->ResetContent(0);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ CPDF_Rect rcScroll = this->GetScrollArea();
+ this->GetScrollPos();
+
+ PWL_SCROLL_INFO sInfo;
+ sInfo.fContentMin = rcScroll.bottom;
+ sInfo.fContentMax = rcScroll.top;
+ sInfo.fPlateWidth = GetClientRect().Height();
+ sInfo.fSmallStep = 13.0f;
+ sInfo.fBigStep = sInfo.fPlateWidth;
+
+ pParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);
+ }
+}
+
+FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CPDF_Point & point)
+{
+ SetFocus();
+
+ SetCapture();
+ m_bMouseDown = TRUE;
+
+ FX_INT32 nItemIndex = FindItemIndex(point);
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CPDF_Point & point)
+{
+ m_bMouseDown = FALSE;
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnMouseMove(const CPDF_Point & point)
+{
+ if (m_bMouseDown)
+ {
+ FX_INT32 nItemIndex = FindItemIndex(point);
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_IconList_Content::OnKeyDown(FX_WORD nChar)
+{
+ switch (nChar)
+ {
+ case FWL_VKEY_Up:
+ if (m_nSelectIndex > 0)
+ {
+ FX_INT32 nItemIndex = m_nSelectIndex - 1;
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+ return TRUE;
+ case FWL_VKEY_Down:
+ if (m_nSelectIndex < m_nListCount-1)
+ {
+ FX_INT32 nItemIndex = m_nSelectIndex + 1;
+ SetSelect(nItemIndex);
+ ScrollToItem(nItemIndex);
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_IconList_Content::FindItemIndex(const CPDF_Point& point)
+{
+ FX_INT32 nIndex = 0;
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Rect rcWnd = pChild->ChildToParent(pChild->GetWindowRect());
+
+ if (point.y < rcWnd.top)
+ {
+ nIndex = i;
+ }
+ }
+ }
+
+ return nIndex;
+}
+
+void CPWL_IconList_Content::ScrollToItem(FX_INT32 nItemIndex)
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ {
+ CPDF_Rect rcOrigin = pItem->GetWindowRect();
+ CPDF_Rect rcWnd = pItem->ChildToParent(rcOrigin);
+
+ if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top))
+ {
+ CPDF_Point ptScroll = GetScrollPos();
+
+ if (rcWnd.top > rcClient.top)
+ {
+ ptScroll.y = rcOrigin.top;
+ }
+ else if (rcWnd.bottom < rcClient.bottom)
+ {
+ ptScroll.y = rcOrigin.bottom + rcClient.Height();
+ }
+
+ this->SetScrollPos(ptScroll);
+ this->ResetFace();
+ this->InvalidateRect();
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+ }
+ }
+ }
+}
+
+void CPWL_IconList_Content::SetSelect(FX_INT32 nIndex)
+{
+ if (m_nSelectIndex != nIndex)
+ {
+ SelectItem(m_nSelectIndex, FALSE);
+ SelectItem(nIndex, TRUE);
+ m_nSelectIndex = nIndex;
+
+ if (IPWL_IconList_Notify* pNotify = GetNotify())
+ pNotify->OnNoteListSelChanged(nIndex);
+ }
+}
+
+FX_INT32 CPWL_IconList_Content::GetSelect() const
+{
+ return m_nSelectIndex;
+}
+
+IPWL_IconList_Notify* CPWL_IconList_Content::GetNotify() const
+{
+ if (m_bEnableNotify)
+ return m_pNotify;
+ return NULL;
+}
+
+void CPWL_IconList_Content::SetNotify(IPWL_IconList_Notify* pNotify)
+{
+ m_pNotify = pNotify;
+}
+
+void CPWL_IconList_Content::EnableNotify(FX_BOOL bNotify)
+{
+ m_bEnableNotify = bNotify;
+}
+
+void CPWL_IconList_Content::SelectItem(FX_INT32 nItemIndex, FX_BOOL bSelect)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ {
+ pItem->SetSelect(bSelect);
+ pItem->InvalidateRect();
+ }
+}
+
+CPWL_IconList_Item* CPWL_IconList_Content::GetListItem(FX_INT32 nItemIndex) const
+{
+ if (nItemIndex >= 0 && nItemIndex<m_aChildren.GetSize())
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(nItemIndex))
+ {
+ if (pChild->GetClassName() == "CPWL_IconList_Item")
+ {
+ return (CPWL_IconList_Item*)pChild;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+void CPWL_IconList_Content::SetListData(FX_INT32 nItemIndex, void* pData)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetData(pData);
+}
+
+void CPWL_IconList_Content::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetIcon(nIconIndex);
+}
+
+void CPWL_IconList_Content::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ pItem->SetText(str);
+}
+
+CFX_WideString CPWL_IconList_Content::GetListString(FX_INT32 nItemIndex) const
+{
+ if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
+ return pItem->GetText();
+
+ return L"";
+}
+
+void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ if (pChild->GetClassName() == "CPWL_IconList_Item")
+ {
+ CPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild;
+ pItem->SetIconFillColor(color);
+ pItem->InvalidateRect();
+ }
+ }
+ }
+
+}
+
+/* -------------------- CPWL_IconList --------------------- */
+
+CPWL_IconList::CPWL_IconList(FX_INT32 nListCount) :
+ m_pListContent(NULL),
+ m_nListCount(nListCount)
+{
+}
+
+CPWL_IconList::~CPWL_IconList()
+{
+}
+
+void CPWL_IconList::RePosChildWnd()
+{
+ CPWL_Wnd::RePosChildWnd();
+
+ if (m_pListContent)
+ m_pListContent->Move(GetClientRect(), TRUE, FALSE);
+}
+
+void CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ m_pListContent = new CPWL_IconList_Content(m_nListCount);
+
+ PWL_CREATEPARAM ccp = cp;
+ ccp.pParentWnd = this;
+ ccp.dwFlags = PWS_CHILD | PWS_VISIBLE;
+ m_pListContent->Create(ccp);
+}
+
+void CPWL_IconList::OnCreated()
+{
+ if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
+ {
+ pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT);
+ pScrollBar->SetTransparency(255);
+ pScrollBar->SetNotifyForever(TRUE);
+ }
+}
+
+void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
+
+ if (wParam == SBT_VSCROLL)
+ {
+ switch (msg)
+ {
+ case PNM_SETSCROLLINFO:
+ if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)
+ {
+ if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
+ {
+ if (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth)
+ {
+ if (!pScrollBar->IsVisible())
+ {
+ pScrollBar->SetVisible(TRUE);
+ RePosChildWnd();
+ }
+ else
+ {
+ }
+ }
+ else
+ {
+ if (pScrollBar->IsVisible())
+ {
+ pScrollBar->SetVisible(FALSE);
+ RePosChildWnd();
+ }
+
+ if (m_pListContent)
+ m_pListContent->SetScrollPos(CPDF_Point(0.0f,0.0f));
+ }
+
+ pScrollBar->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
+ }
+ }
+ return;
+ case PNM_SCROLLWINDOW:
+ if (m_pListContent)
+ {
+ m_pListContent->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
+ m_pListContent->ResetFace();
+ m_pListContent->InvalidateRect(NULL);
+ }
+ return;
+ case PNM_SETSCROLLPOS:
+ if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
+ pScrollBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+ return;
+ }
+ }
+}
+
+void CPWL_IconList::SetSelect(FX_INT32 nIndex)
+{
+ m_pListContent->SetSelect(nIndex);
+}
+
+void CPWL_IconList::SetTopItem(FX_INT32 nIndex)
+{
+ m_pListContent->ScrollToItem(nIndex);
+}
+
+FX_INT32 CPWL_IconList::GetSelect() const
+{
+ return m_pListContent->GetSelect();
+}
+
+void CPWL_IconList::SetNotify(IPWL_IconList_Notify* pNotify)
+{
+ m_pListContent->SetNotify(pNotify);
+}
+
+void CPWL_IconList::EnableNotify(FX_BOOL bNotify)
+{
+ m_pListContent->EnableNotify(bNotify);
+}
+
+void CPWL_IconList::SetListData(FX_INT32 nItemIndex, void* pData)
+{
+ m_pListContent->SetListData(nItemIndex, pData);
+}
+
+void CPWL_IconList::SetListIcon(FX_INT32 nItemIndex, FX_INT32 nIconIndex)
+{
+ m_pListContent->SetListIcon(nItemIndex, nIconIndex);
+}
+
+void CPWL_IconList::SetListString(FX_INT32 nItemIndex, const CFX_WideString& str)
+{
+ m_pListContent->SetListString(nItemIndex, str);
+}
+
+CFX_WideString CPWL_IconList::GetListString(FX_INT32 nItemIndex) const
+{
+ return m_pListContent->GetListString(nItemIndex);
+}
+
+void CPWL_IconList::SetIconFillColor(const CPWL_Color& color)
+{
+ m_pListContent->SetIconFillColor(color);
+}
+
+FX_BOOL CPWL_IconList::OnMouseWheel(short zDelta, const CPDF_Point & point)
+{
+ CPDF_Point ptScroll = m_pListContent->GetScrollPos();
+ CPDF_Rect rcScroll = m_pListContent->GetScrollArea();
+ CPDF_Rect rcContents = m_pListContent->GetClientRect();
+
+ if (rcScroll.top - rcScroll.bottom > rcContents.Height())
+ {
+ CPDF_Point ptNew = ptScroll;
+
+ if (zDelta > 0)
+ ptNew.y += 30;
+ else
+ ptNew.y -= 30;
+
+ if (ptNew.y > rcScroll.top)
+ ptNew.y = rcScroll.top;
+ if (ptNew.y < rcScroll.bottom + rcContents.Height())
+ ptNew.y = rcScroll.bottom + rcContents.Height();
+ if (ptNew.y < rcScroll.bottom)
+ ptNew.y = rcScroll.bottom;
+
+ if (ptNew.y != ptScroll.y)
+ {
+ m_pListContent->SetScrollPos(ptNew);
+ m_pListContent->ResetFace();
+ m_pListContent->InvalidateRect(NULL);
+
+ if (CPWL_ScrollBar* pScrollBar = this->GetVScrollBar())
+ pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Label.cpp b/fpdfsdk/src/pdfwindow/PWL_Label.cpp
new file mode 100644
index 0000000000..e1b8522248
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Label.cpp
@@ -0,0 +1,187 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* ---------------------------- CPWL_Label ------------------------------ */
+
+CPWL_Label::CPWL_Label() : m_pEdit(NULL)
+{
+ m_pEdit = IFX_Edit::NewEdit();
+
+ ASSERT(m_pEdit != NULL);
+}
+
+CPWL_Label::~CPWL_Label()
+{
+ IFX_Edit::DelEdit(m_pEdit);
+}
+
+CFX_ByteString CPWL_Label::GetClassName() const
+{
+ return "CPWL_Label";
+}
+
+void CPWL_Label::OnCreated()
+{
+ SetParamByFlag();
+ SetFontSize(this->GetCreationParam().fFontSize);
+
+ m_pEdit->SetFontMap(this->GetFontMap());
+ m_pEdit->Initialize();
+
+ if (HasFlag(PES_TEXTOVERFLOW))
+ {
+ SetClipRect(CPDF_Rect(0.0f,0.0f,0.0f,0.0f));
+ m_pEdit->SetTextOverflow(TRUE);
+ }
+}
+
+void CPWL_Label::SetText(FX_LPCWSTR csText)
+{
+ m_pEdit->SetText(csText);
+}
+
+void CPWL_Label::RePosChildWnd()
+{
+ m_pEdit->SetPlateRect(GetClientRect());
+}
+
+void CPWL_Label::SetFontSize(FX_FLOAT fFontSize)
+{
+ m_pEdit->SetFontSize(fFontSize);
+}
+
+FX_FLOAT CPWL_Label::GetFontSize() const
+{
+ return m_pEdit->GetFontSize();
+}
+
+void CPWL_Label::SetParamByFlag()
+{
+ if (HasFlag(PES_LEFT))
+ {
+ m_pEdit->SetAlignmentH(0);
+ }
+ else if (HasFlag(PES_MIDDLE))
+ {
+ m_pEdit->SetAlignmentH(1);
+ }
+ else if (HasFlag(PES_RIGHT))
+ {
+ m_pEdit->SetAlignmentH(2);
+ }
+ else
+ {
+ m_pEdit->SetAlignmentH(0);
+ }
+
+ if (HasFlag(PES_TOP))
+ {
+ m_pEdit->SetAlignmentV(0);
+ }
+ else if (HasFlag(PES_CENTER))
+ {
+ m_pEdit->SetAlignmentV(1);
+ }
+ else if (HasFlag(PES_BOTTOM))
+ {
+ m_pEdit->SetAlignmentV(2);
+ }
+ else
+ {
+ m_pEdit->SetAlignmentV(0);
+ }
+
+ if (HasFlag(PES_PASSWORD))
+ {
+ m_pEdit->SetPasswordChar('*');
+ }
+
+ m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));
+ m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));
+ m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
+ m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
+}
+
+void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ GetClientRect();
+
+ CPDF_Rect rcClip;
+ CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
+ CPVT_WordRange* pRange = NULL;
+
+ if (!HasFlag(PES_TEXTOVERFLOW))
+ {
+ rcClip = GetClientRect();
+ pRange = &wrRange;
+ }
+IFX_SystemHandler* pSysHandler = GetSystemHandler();
+ IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pEdit,
+ CPWL_Utils::PWLColorToFXColor(GetTextColor(), this->GetTransparency()),
+ CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), this->GetTransparency()),
+ rcClip, CPDF_Point(0.0f,0.0f), pRange,pSysHandler, NULL);
+}
+
+void CPWL_Label::SetHorzScale(FX_INT32 nHorzScale)
+{
+ m_pEdit->SetHorzScale(nHorzScale);
+}
+
+void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace)
+{
+ m_pEdit->SetCharSpace(fCharSpace);
+}
+
+CPDF_Rect CPWL_Label::GetContentRect() const
+{
+ return m_pEdit->GetContentRect();
+}
+
+void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ sAppStream << GetTextAppearanceStream(CPDF_Point(0.0f, 0.0f));
+}
+
+CFX_ByteString CPWL_Label::GetTextAppearanceStream(const CPDF_Point & ptOffset) const
+{
+ CFX_ByteTextBuf sRet;
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit,ptOffset);
+
+ if (sEdit.GetLength() > 0)
+ {
+ sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sEdit << "ET\n";
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_WideString CPWL_Label::GetText() const
+{
+ return m_pEdit->GetText();
+}
+
+void CPWL_Label::SetLimitChar(FX_INT32 nLimitChar)
+{
+ m_pEdit->SetLimitChar(nLimitChar);
+}
+
+FX_INT32 CPWL_Label::GetTotalWords()
+{
+ if (m_pEdit)
+ return m_pEdit->GetTotalWords();
+
+ return 0;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp
new file mode 100644
index 0000000000..951ed93f79
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_ListBox.cpp
@@ -0,0 +1,632 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListBox.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+/* ------------------------ CPWL_List_Notify ----------------------- */
+
+CPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList)
+{
+ ASSERT(m_pList != NULL);
+}
+
+CPWL_List_Notify::~CPWL_List_Notify()
+{
+}
+
+void CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
+ FX_FLOAT fContentMin, FX_FLOAT fContentMax,
+ FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
+{
+ PWL_SCROLL_INFO Info;
+
+ Info.fPlateWidth = fPlateMax - fPlateMin;
+ Info.fContentMin = fContentMin;
+ Info.fContentMax = fContentMax;
+ Info.fSmallStep = fSmallStep;
+ Info.fBigStep = fBigStep;
+
+ m_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
+
+ if (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar())
+ {
+ if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
+ || IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
+ {
+ if (pScroll->IsVisible())
+ {
+ pScroll->SetVisible(FALSE);
+ m_pList->RePosChildWnd();
+ }
+ }
+ else
+ {
+ if (!pScroll->IsVisible())
+ {
+ pScroll->SetVisible(TRUE);
+ m_pList->RePosChildWnd();
+ }
+ }
+ }
+}
+
+void CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy)
+{
+ m_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
+}
+
+void CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect)
+{
+ m_pList->InvalidateRect(pRect);
+}
+
+/* --------------------------- CPWL_ListBox ---------------------------- */
+
+CPWL_ListBox::CPWL_ListBox() :
+ m_pList(NULL),
+ m_pListNotify(NULL),
+ m_bMouseDown(FALSE),
+ m_bHoverSel(FALSE),
+ m_pFillerNotify(NULL)
+{
+ m_pList = IFX_List::NewList();
+
+ ASSERT(m_pList != NULL);
+}
+
+CPWL_ListBox::~CPWL_ListBox()
+{
+ IFX_List::DelList(m_pList);
+
+ if (m_pListNotify)
+ {
+ delete m_pListNotify;
+ m_pListNotify = NULL;
+ }
+}
+
+CFX_ByteString CPWL_ListBox::GetClassName() const
+{
+ return "CPWL_ListBox";
+}
+
+void CPWL_ListBox::OnCreated()
+{
+ if (m_pList)
+ {
+ if (m_pListNotify) delete m_pListNotify;
+
+ m_pList->SetFontMap(GetFontMap());
+ m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this));
+
+ SetHoverSel(HasFlag(PLBS_HOVERSEL));
+ m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL));
+ m_pList->SetFontSize(this->GetCreationParam().fFontSize);
+
+ m_bHoverSel = HasFlag(PLBS_HOVERSEL);
+ }
+}
+
+void CPWL_ListBox::OnDestroy()
+{
+ if (m_pListNotify)
+ {
+ delete m_pListNotify;
+ m_pListNotify = NULL;
+ }
+}
+
+void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ CFX_ByteTextBuf sListItems;
+
+ if (m_pList)
+ {
+ CPDF_Rect rcPlate = m_pList->GetPlateRect();
+ for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
+ {
+ CPDF_Rect rcItem = m_pList->GetItemRect(i);
+
+ if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
+
+ CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
+ if (m_pList->IsItemSelected(i))
+ {
+ sListItems << CPWL_Utils::GetRectFillAppStream(rcItem,PWL_DEFAULT_SELBACKCOLOR);
+ CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
+ if (sItem.GetLength() > 0)
+ {
+ sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << "ET\n";
+ }
+ }
+ else
+ {
+ CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
+ if (sItem.GetLength() > 0)
+ {
+ sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sItem << "ET\n";
+ }
+ }
+ }
+ }
+
+ if (sListItems.GetLength() > 0)
+ {
+ CFX_ByteTextBuf sClip;
+ CPDF_Rect rcClient = this->GetClientRect();
+
+ sClip << "q\n";
+ sClip << rcClient.left << " " << rcClient.bottom << " "
+ << rcClient.right - rcClient.left << " " << rcClient.top - rcClient.bottom << " re W n\n";
+
+ sClip << sListItems << "Q\n";
+
+ sAppStream << "/Tx BMC\n" << sClip << "EMC\n";
+ }
+}
+
+void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ if (m_pList)
+ {
+ CPDF_Rect rcPlate = m_pList->GetPlateRect();
+ CPDF_Rect rcList = GetListRect();
+ CPDF_Rect rcClient = GetClientRect();
+
+ for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
+ {
+ CPDF_Rect rcItem = m_pList->GetItemRect(i);
+ if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
+
+ CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
+ if (IFX_Edit* pEdit = m_pList->GetItemEdit(i))
+ {
+ CPDF_Rect rcContent = pEdit->GetContentRect();
+ if (rcContent.Width() > rcClient.Width())
+ rcItem.Intersect(rcList);
+ else
+ rcItem.Intersect(rcClient);
+ }
+
+ if (m_pList->IsItemSelected(i))
+ {
+ // CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
+ IFX_SystemHandler* pSysHandler = GetSystemHandler();
+ if(pSysHandler && pSysHandler->IsSelectionImplemented())
+ {
+ IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
+ rcList, ptOffset, NULL,pSysHandler, m_pFormFiller);
+ pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem);
+ }
+ else
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
+ IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0,
+ rcList, ptOffset, NULL, pSysHandler, m_pFormFiller);
+ }
+ }
+ else
+ {
+ IFX_SystemHandler* pSysHandler = GetSystemHandler();
+ IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i),
+ CPWL_Utils::PWLColorToFXColor(GetTextColor()),
+ CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
+ rcList, ptOffset, NULL,pSysHandler, NULL);
+
+ }
+ }
+ }
+}
+
+FX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnKeyDown(nChar, nFlag);
+
+ if (!m_pList) return FALSE;
+
+ switch (nChar)
+ {
+ default:
+ return FALSE;
+ case FWL_VKEY_Up:
+ case FWL_VKEY_Down:
+ case FWL_VKEY_Home:
+ case FWL_VKEY_Left:
+ case FWL_VKEY_End:
+ case FWL_VKEY_Right:
+ break;
+ }
+
+ switch (nChar)
+ {
+ case FWL_VKEY_Up:
+ m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Down:
+ m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Home:
+ m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Left:
+ m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_End:
+ m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Right:
+ m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ break;
+ case FWL_VKEY_Delete:
+ break;
+ }
+
+ FX_BOOL bExit = FALSE;
+ OnNotifySelChanged(TRUE,bExit,nFlag);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnChar(nChar,nFlag);
+
+ if (!m_pList) return FALSE;
+
+ if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
+
+ FX_BOOL bExit = FALSE;
+ OnNotifySelChanged(TRUE,bExit, nFlag);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (ClientHitTest(point))
+ {
+ m_bMouseDown = TRUE;
+ SetFocus();
+ SetCapture();
+
+ if (m_pList)
+ m_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (m_bMouseDown)
+ {
+ ReleaseCapture();
+ m_bMouseDown = FALSE;
+ }
+
+ FX_BOOL bExit = FALSE;
+ OnNotifySelChanged(FALSE,bExit,nFlag);
+
+ return TRUE;
+}
+
+void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel)
+{
+ m_bHoverSel = bHoverSel;
+}
+
+FX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnMouseMove(point, nFlag);
+
+ if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point))
+ {
+ if (m_pList)
+ m_pList->Select(m_pList->GetItemIndex(point));
+ }
+
+ if (m_bMouseDown)
+ {
+ if (m_pList)
+ m_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ return TRUE;
+}
+
+void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+
+ FX_FLOAT fPos;
+
+ switch (msg)
+ {
+ case PNM_SETSCROLLINFO:
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ if (CPWL_Wnd * pChild = GetVScrollBar())
+ {
+ pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
+ }
+ break;
+ }
+ break;
+ case PNM_SETSCROLLPOS:
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ if (CPWL_Wnd * pChild = GetVScrollBar())
+ {
+ pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+ }
+ break;
+ }
+ break;
+ case PNM_SCROLLWINDOW:
+ fPos = *(FX_FLOAT*)lParam;
+ switch (wParam)
+ {
+ case SBT_VSCROLL:
+ if (m_pList)
+ m_pList->SetScrollPos(CPDF_Point(0,fPos));
+ break;
+ }
+ break;
+ }
+}
+
+void CPWL_ListBox::KillFocus()
+{
+ CPWL_Wnd::KillFocus();
+
+ /*
+ if (this->IsMultipleSel())
+ {
+ for(FX_INT32 i=0;i<this->GetCount();i++)
+ {
+ if (this->IsListItemSelected(i))
+ {
+ if (!IsListItemVisible(i))
+ this->ScrollToListItem(i);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!IsListItemVisible(this->GetCurSel()))
+ this->ScrollToListItem(this->GetCurSel());
+ }
+
+ SetListItemCaret(m_nCaretIndex,FALSE);
+ */
+}
+
+void CPWL_ListBox::RePosChildWnd()
+{
+ CPWL_Wnd::RePosChildWnd();
+
+ if (m_pList)
+ m_pList->SetPlateRect(GetListRect());
+}
+
+void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit, FX_DWORD nFlag)
+{
+ if (m_pFillerNotify)
+ {
+ FX_BOOL bRC = TRUE;
+ CFX_WideString swChange = GetText();
+ CFX_WideString strChangeEx;
+ int nSelStart = 0;
+ int nSelEnd = swChange.GetLength();
+ m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag);
+ if (bExit) return;
+
+ m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag);
+ }
+}
+
+CPDF_Rect CPWL_ListBox::GetFocusRect() const
+{
+ if (m_pList && m_pList->IsMultipleSel())
+ {
+ CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret());
+ rcCaret.Intersect(GetClientRect());
+ return rcCaret;
+ }
+
+ return CPWL_Wnd::GetFocusRect();
+}
+
+void CPWL_ListBox::AddString(FX_LPCWSTR string)
+{
+ if (m_pList)
+ {
+ m_pList->AddString(string);
+ }
+}
+
+void CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh)
+{
+ //return CPDF_List::SetText(csText,bRefresh);
+}
+
+CFX_WideString CPWL_ListBox::GetText() const
+{
+ if (m_pList)
+ return m_pList->GetText();
+
+ return L"";
+}
+
+void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize)
+{
+ if (m_pList)
+ m_pList->SetFontSize(fFontSize);
+}
+
+FX_FLOAT CPWL_ListBox::GetFontSize() const
+{
+ if (m_pList)
+ return m_pList->GetFontSize();
+ return 0.0f;
+}
+
+void CPWL_ListBox::Select(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->Select(nItemIndex);
+}
+
+void CPWL_ListBox::SetCaret(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->SetCaret(nItemIndex);
+}
+
+void CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->SetTopItem(nItemIndex);
+}
+
+void CPWL_ListBox::ScrollToListItem(FX_INT32 nItemIndex)
+{
+ if (m_pList)
+ m_pList->ScrollToListItem(nItemIndex);
+}
+
+void CPWL_ListBox::ResetContent()
+{
+ if (m_pList)
+ m_pList->Empty();
+}
+
+void CPWL_ListBox::Reset()
+{
+ if (m_pList)
+ m_pList->Cancel();
+}
+
+FX_BOOL CPWL_ListBox::IsMultipleSel() const
+{
+ if (m_pList)
+ return m_pList->IsMultipleSel();
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_ListBox::GetCaretIndex() const
+{
+ if (m_pList)
+ return m_pList->GetCaret();
+
+ return -1;
+}
+
+FX_INT32 CPWL_ListBox::GetCurSel() const
+{
+ if (m_pList)
+ return m_pList->GetSelect();
+
+ return -1;
+}
+
+FX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const
+{
+ if (m_pList)
+ return m_pList->IsItemSelected(nItemIndex);
+
+ return FALSE;
+}
+
+FX_INT32 CPWL_ListBox::GetTopVisibleIndex() const
+{
+ if (m_pList)
+ {
+ m_pList->ScrollToListItem(m_pList->GetFirstSelected());
+ return m_pList->GetTopItem();
+ }
+
+ return -1;
+}
+
+FX_INT32 CPWL_ListBox::GetCount() const
+{
+ if (m_pList)
+ return m_pList->GetCount();
+
+ return 0;
+}
+
+FX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
+{
+ if (m_pList)
+ return m_pList->FindNext(nIndex,nChar);
+
+ return nIndex;
+}
+
+CPDF_Rect CPWL_ListBox::GetContentRect() const
+{
+ if (m_pList)
+ return m_pList->GetContentRect();
+
+ return CPDF_Rect();
+}
+
+FX_FLOAT CPWL_ListBox::GetFirstHeight() const
+{
+ if (m_pList)
+ return m_pList->GetFirstHeight();
+
+ return 0.0f;
+}
+
+CPDF_Rect CPWL_ListBox::GetListRect() const
+{
+ return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+}
+
+FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (!m_pList) return FALSE;
+
+ if (zDelta < 0)
+ {
+ m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+ else
+ {
+ m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
+ }
+
+ FX_BOOL bExit = FALSE;
+ OnNotifySelChanged(FALSE,bExit, nFlag);
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp
new file mode 100644
index 0000000000..603bb4a139
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp
@@ -0,0 +1,245 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+
+/* ---------------------------- CPWL_ListCtrl ---------------------------- */
+
+CPWL_ListCtrl::CPWL_ListCtrl() :
+ m_rcContent(0,0,0,0),
+ m_ptScroll(0,0),
+ m_fItemSpace(0.0f),
+ m_fTopSpace(0.0f),
+ m_fBottomSpace(0.0f)
+{
+}
+
+CPWL_ListCtrl::~CPWL_ListCtrl()
+{
+}
+
+void CPWL_ListCtrl::SetScrollPos(const CPDF_Point& point)
+{
+ m_ptScroll = point;
+
+ if (m_ptScroll.x < m_rcContent.left)
+ m_ptScroll.x = m_rcContent.left;
+
+ if (m_ptScroll.x > m_rcContent.right)
+ m_ptScroll.x = m_rcContent.right;
+
+ if (m_ptScroll.y > m_rcContent.top)
+ m_ptScroll.y = m_rcContent.top;
+
+ if (m_ptScroll.y < m_rcContent.bottom)
+ m_ptScroll.y = m_rcContent.bottom;
+}
+
+CPDF_Point CPWL_ListCtrl::GetScrollPos() const
+{
+ return m_ptScroll;
+}
+
+CPDF_Rect CPWL_ListCtrl::GetScrollArea() const
+{
+ return m_rcContent;
+}
+
+void CPWL_ListCtrl::ResetFace()
+{
+ ResetAll(FALSE, 0);
+}
+
+void CPWL_ListCtrl::ResetContent(FX_INT32 nStart)
+{
+ if (nStart < 0)
+ nStart = 0;
+ if (nStart >= 0 && nStart < m_aChildren.GetSize())
+ ResetAll(TRUE, nStart);
+}
+
+FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth)
+{
+ FX_FLOAT fRet = m_fTopSpace;
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();
+
+ if (fLimitWidth > fBorderWidth* 2)
+ {
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ FX_FLOAT fLeft = pChild->GetItemLeftMargin();
+ FX_FLOAT fRight = pChild->GetItemRightMargin();
+
+ fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth* 2 - fLeft - fRight);
+ fRet += m_fItemSpace;
+ }
+ }
+
+ fRet -= m_fItemSpace;
+ }
+
+ fRet += m_fBottomSpace;
+
+ return fRet;
+}
+
+void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, FX_INT32 nStart)
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ FX_FLOAT fWidth = rcClient.Width();
+
+ FX_FLOAT fy = 0.0f - m_fTopSpace;
+
+ if (nStart-1 >= 0 && nStart-1 < m_aChildren.GetSize())
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart-1))
+ fy = pChild->GetWindowRect().bottom - m_fItemSpace;
+
+ for (FX_INT32 i=nStart,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ FX_FLOAT fLeft = pChild->GetItemLeftMargin();
+ FX_FLOAT fRight = pChild->GetItemRightMargin();
+
+ pChild->SetChildMatrix(
+ CPDF_Matrix(1,0,0,1,
+ rcClient.left - m_ptScroll.x,
+ rcClient.top - m_ptScroll.y)
+ );
+
+ if (bMove)
+ {
+ FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);
+ pChild->Move(CPDF_Rect(fLeft, fy-fItemHeight, fWidth - fRight, fy), TRUE, FALSE);
+ fy -= fItemHeight;
+ fy -= m_fItemSpace;
+ }
+ }
+ }
+
+ fy += m_fItemSpace;
+
+ fy -= m_fBottomSpace;
+
+ if (bMove)
+ {
+ m_rcContent.left = 0;
+ m_rcContent.top = 0;
+ m_rcContent.right = fWidth;
+ m_rcContent.bottom = fy;
+ }
+}
+
+void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace)
+{
+ m_fItemSpace = fSpace;
+}
+
+void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace)
+{
+ m_fTopSpace = fSpace;
+}
+
+void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace)
+{
+ m_fBottomSpace = fSpace;
+}
+
+void CPWL_ListCtrl::RePosChildWnd()
+{
+ ResetFace();
+}
+
+void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ pDevice->SaveState();
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcTemp = rcClient;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcClip((FX_INT32)rcTemp.left,
+ (FX_INT32)rcTemp.bottom,
+ (FX_INT32)rcTemp.right,
+ (FX_INT32)rcTemp.top);
+
+ pDevice->SetClip_Rect(&rcClip);
+
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
+ if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top))
+ {
+ CPDF_Matrix mt = pChild->GetChildMatrix();
+ if (mt.IsIdentity())
+ {
+ pChild->DrawAppearance(pDevice,pUser2Device);
+ }
+ else
+ {
+ mt.Concat(*pUser2Device);
+ pChild->DrawAppearance(pDevice,&mt);
+ }
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+FX_INT32 CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem)
+{
+ for (FX_INT32 i=0, sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (pItem == m_aChildren.GetAt(i))
+ return i;
+ }
+
+ return -1;
+}
+
+CPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point(point.x + rcClient.left - m_ptScroll.x,
+ point.y + rcClient.top - m_ptScroll.y);
+}
+
+CPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point(point.x - rcClient.left + m_ptScroll.x,
+ point.y - rcClient.top + m_ptScroll.y);
+}
+
+CPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Rect(rect.left + rcClient.left - m_ptScroll.x,
+ rect.bottom + rcClient.top - m_ptScroll.y,
+ rect.right + rcClient.left - m_ptScroll.x,
+ rect.top + rcClient.top - m_ptScroll.y);
+}
+
+CPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Rect(rect.left - rcClient.left + m_ptScroll.x,
+ rect.bottom - rcClient.top + m_ptScroll.y,
+ rect.right - rcClient.left + m_ptScroll.x,
+ rect.top - rcClient.top + m_ptScroll.y);
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Note.cpp b/fpdfsdk/src/pdfwindow/PWL_Note.cpp
new file mode 100644
index 0000000000..3c6d8661c6
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Note.cpp
@@ -0,0 +1,1779 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_EditCtrl.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ListCtrl.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Note.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Edit.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Caret.h"
+
+#define POPUP_ITEM_HEAD_BOTTOM 3.0f
+#define POPUP_ITEM_BOTTOMWIDTH 1.0f
+#define POPUP_ITEM_SIDEMARGIN 3.0f
+#define POPUP_ITEM_SPACE 4.0f
+#define POPUP_ITEM_TEXT_INDENT 2.0f
+#define POPUP_ITEM_BORDERCOLOR CPWL_Color(COLORTYPE_RGB, 80/255.0f, 80/255.0f, 80/255.0f)
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+
+/* ------------------------------- CPWL_Note_Options ------------------------------- */
+
+CPWL_Note_Options::CPWL_Note_Options() : m_pText(NULL)
+{
+}
+
+CPWL_Note_Options::~CPWL_Note_Options()
+{
+}
+
+void CPWL_Note_Options::SetTextColor(const CPWL_Color & color)
+{
+ CPWL_Wnd::SetTextColor(color);
+
+ if (m_pText)
+ m_pText->SetTextColor(color);
+}
+
+void CPWL_Note_Options::RePosChildWnd()
+{
+ if (this->IsValid())
+ {
+ ASSERT(m_pText != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ if (rcClient.Width() > 15.0f)
+ {
+ rcClient.right -= 15.0f;
+ m_pText->Move(rcClient, TRUE, FALSE);
+ m_pText->SetVisible(TRUE);
+ }
+ else
+ {
+ m_pText->Move(CPDF_Rect(0,0,0,0), TRUE, FALSE);
+ m_pText->SetVisible(FALSE);
+ }
+ }
+}
+
+void CPWL_Note_Options::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ m_pText = new CPWL_Label;
+ PWL_CREATEPARAM tcp = cp;
+ tcp.pParentWnd = this;
+ tcp.dwFlags = PWS_CHILD | PWS_VISIBLE;
+ m_pText->Create(tcp);
+}
+
+void CPWL_Note_Options::SetText(const CFX_WideString& sText)
+{
+ m_pText->SetText(sText);
+}
+
+void CPWL_Note_Options::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
+
+ CPDF_Rect rcClient = GetClientRect();
+ rcClient.left = rcClient.right - 15.0f;
+
+ CPDF_Point ptCenter = CPDF_Point((rcClient.left + rcClient.right) * 0.5f, (rcClient.top + rcClient.bottom) * 0.5f);
+
+ CPDF_Point pt1(ptCenter.x - 2.0f, ptCenter.y + 2.0f * 0.5f);
+ CPDF_Point pt2(ptCenter.x + 2.0f, ptCenter.y + 2.0f * 0.5f);
+ CPDF_Point pt3(ptCenter.x, ptCenter.y - 3.0f * 0.5f);
+
+ CFX_PathData path;
+
+ path.SetPointCount(4);
+ path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+ path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
+ path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
+
+ pDevice->DrawPath(&path, pUser2Device, NULL,
+ CPWL_Utils::PWLColorToFXColor(GetTextColor(),GetTransparency()),
+ 0, FXFILL_ALTERNATE);
+}
+
+CPDF_Rect CPWL_Note_Options::GetContentRect() const
+{
+ ASSERT(m_pText != NULL);
+
+ CPDF_Rect rcText = m_pText->GetContentRect();
+ rcText.right += 15.0f;
+ return rcText;
+}
+
+/* ------------------------------- CPWL_Note_Edit ------------------------------ */
+
+CPWL_Note_Edit::CPWL_Note_Edit() : m_bEnableNotify(TRUE),
+ m_fOldItemHeight(0.0f),
+ m_bSizeChanged(FALSE),
+ m_fOldMin(0.0f),
+ m_fOldMax(0.0f)
+{
+}
+
+CPWL_Note_Edit::~CPWL_Note_Edit()
+{
+}
+
+void CPWL_Note_Edit::RePosChildWnd()
+{
+ m_bEnableNotify = FALSE;
+ CPWL_Edit::RePosChildWnd();
+ m_bEnableNotify = TRUE;
+
+ m_fOldItemHeight = this->GetContentRect().Height();
+}
+
+void CPWL_Note_Edit::SetText(FX_LPCWSTR csText)
+{
+ m_bEnableNotify = FALSE;
+ CPWL_Edit::SetText(csText);
+ m_bEnableNotify = TRUE;
+ m_fOldItemHeight = this->GetContentRect().Height();
+}
+
+void CPWL_Note_Edit::OnSetFocus()
+{
+ m_bEnableNotify = FALSE;
+ CPWL_Edit::OnSetFocus();
+ m_bEnableNotify = TRUE;
+
+ this->EnableSpellCheck(TRUE);
+}
+
+void CPWL_Note_Edit::OnKillFocus()
+{
+ this->EnableSpellCheck(FALSE);
+
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
+ {
+ ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
+
+ CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand;
+
+ pNoteItem->OnContentsValidate();
+ }
+ }
+
+ CPWL_Edit::OnKillFocus();
+}
+
+void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ if (m_bEnableNotify)
+ {
+ if (wParam == SBT_VSCROLL)
+ {
+ switch (msg)
+ {
+ case PNM_SETSCROLLINFO:
+ if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam)
+ {
+ if (!IsFloatEqual(pInfo->fContentMax, m_fOldMax) ||
+ !IsFloatEqual(pInfo->fContentMin, m_fOldMin))
+ {
+ m_bSizeChanged = TRUE;
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+
+ m_fOldMax = pInfo->fContentMax;
+ m_fOldMin = pInfo->fContentMin;
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ CPWL_Edit::OnNotify(pWnd, msg, wParam, lParam);
+
+ if (m_bEnableNotify)
+ {
+ switch (msg)
+ {
+ case PNM_SETCARETINFO:
+ if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
+ {
+ PWL_CARET_INFO newInfo = *pInfo;
+ newInfo.bVisible = TRUE;
+ newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
+ }
+ }
+ break;
+ }
+ }
+}
+
+FX_FLOAT CPWL_Note_Edit::GetItemHeight(FX_FLOAT fLimitWidth)
+{
+ if (fLimitWidth > 0)
+ {
+ if (!m_bSizeChanged)
+ return m_fOldItemHeight;
+
+ m_bSizeChanged = FALSE;
+
+ this->EnableNotify(FALSE);
+ this->EnableRefresh(FALSE);
+ m_pEdit->EnableNotify(FALSE);
+
+ //CPDF_Rect rcOld = this->GetWindowRect();
+
+ this->Move(CPDF_Rect(0,0,fLimitWidth,0), TRUE, FALSE);
+ FX_FLOAT fRet = this->GetContentRect().Height();
+
+ //this->Move(rcOld, TRUE, FALSE);
+
+ m_pEdit->EnableNotify(TRUE);
+ this->EnableNotify(TRUE);
+ this->EnableRefresh(TRUE);
+
+ return fRet;
+ }
+
+ return 0;
+}
+
+FX_FLOAT CPWL_Note_Edit::GetItemLeftMargin()
+{
+ return POPUP_ITEM_TEXT_INDENT;
+}
+
+FX_FLOAT CPWL_Note_Edit::GetItemRightMargin()
+{
+ return POPUP_ITEM_TEXT_INDENT;
+}
+
+/* -------------------------------- CPWL_Note_LBBox --------------------------------*/
+
+CPWL_Note_LBBox::CPWL_Note_LBBox()
+{
+}
+
+CPWL_Note_LBBox::~CPWL_Note_LBBox()
+{
+}
+
+void CPWL_Note_LBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = this->GetClientRect();
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 1.0f;
+
+ CFX_PathData pathCross;
+
+ pathCross.SetPointCount(4);
+ pathCross.SetPoint(0, rcClient.left, rcClient.top, FXPT_MOVETO);
+ pathCross.SetPoint(1, rcClient.right, rcClient.bottom, FXPT_LINETO);
+ pathCross.SetPoint(2, rcClient.left, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);
+ pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);
+
+ pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
+ 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+/* -------------------------------- CPWL_Note_RBBox --------------------------------*/
+
+CPWL_Note_RBBox::CPWL_Note_RBBox()
+{
+}
+
+CPWL_Note_RBBox::~CPWL_Note_RBBox()
+{
+}
+
+void CPWL_Note_RBBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rcClient = this->GetClientRect();
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 1.0f;
+
+ CFX_PathData pathCross;
+
+ pathCross.SetPointCount(4);
+ pathCross.SetPoint(0, rcClient.right, rcClient.top, FXPT_MOVETO);
+ pathCross.SetPoint(1, rcClient.left, rcClient.bottom, FXPT_LINETO);
+ pathCross.SetPoint(2, rcClient.right, rcClient.bottom + rcClient.Height() * 0.5f, FXPT_MOVETO);
+ pathCross.SetPoint(3, rcClient.left + rcClient.Width() * 0.5f, rcClient.bottom, FXPT_LINETO);
+
+ pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
+ 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+/* --------------------------------- CPWL_Note_Icon ---------------------------------- */
+
+CPWL_Note_Icon::CPWL_Note_Icon() : m_nType(0)
+{
+}
+
+CPWL_Note_Icon::~CPWL_Note_Icon()
+{
+}
+
+void CPWL_Note_Icon::SetIconType(FX_INT32 nType)
+{
+ m_nType = nType;
+}
+
+void CPWL_Note_Icon::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nType, GetClientRect(),
+ this->GetBackgroundColor(), PWL_DEFAULT_BLACKCOLOR, this->GetTransparency());
+}
+
+/* --------------------------------- CPWL_Note_CloseBox ---------------------------------- */
+
+CPWL_Note_CloseBox::CPWL_Note_CloseBox() : m_bMouseDown(FALSE)
+{
+}
+
+CPWL_Note_CloseBox::~CPWL_Note_CloseBox()
+{
+}
+
+void CPWL_Note_CloseBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Button::DrawThisAppearance(pDevice, pUser2Device);
+
+ CPDF_Rect rcClient = this->GetClientRect();
+ rcClient = CPWL_Utils::DeflateRect(rcClient, 2.0f);
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 1.0f;
+
+ CFX_PathData pathCross;
+
+ if (m_bMouseDown)
+ {
+ rcClient.left += 0.5f;
+ rcClient.right += 0.5f;
+ rcClient.top -= 0.5f;
+ rcClient.bottom -= 0.5f;
+ }
+
+ pathCross.SetPointCount(4);
+ pathCross.SetPoint(0, rcClient.left, rcClient.bottom, FXPT_MOVETO);
+ pathCross.SetPoint(1, rcClient.right, rcClient.top, FXPT_LINETO);
+ pathCross.SetPoint(2, rcClient.left, rcClient.top, FXPT_MOVETO);
+ pathCross.SetPoint(3, rcClient.right, rcClient.bottom, FXPT_LINETO);
+
+ pDevice->DrawPath(&pathCross, pUser2Device, &gsd,
+ 0, CPWL_Utils::PWLColorToFXColor(GetTextColor(),this->GetTransparency()), FXFILL_ALTERNATE);
+}
+
+FX_BOOL CPWL_Note_CloseBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ SetBorderStyle(PBS_INSET);
+ InvalidateRect(NULL);
+
+ m_bMouseDown = TRUE;
+
+ return CPWL_Button::OnLButtonDown(point,nFlag);
+}
+
+FX_BOOL CPWL_Note_CloseBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ m_bMouseDown = FALSE;
+
+ SetBorderStyle(PBS_BEVELED);
+ InvalidateRect(NULL);
+
+ return CPWL_Button::OnLButtonUp(point,nFlag);
+}
+
+/* ------------------------------ CPWL_Note_Contents ------------------------------- */
+
+CPWL_Note_Contents::CPWL_Note_Contents() : m_pEdit(NULL)
+{
+}
+
+CPWL_Note_Contents::~CPWL_Note_Contents()
+{
+}
+
+CFX_ByteString CPWL_Note_Contents::GetClassName() const
+{
+ return "CPWL_Note_Contents";
+}
+
+void CPWL_Note_Contents::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ m_pEdit = new CPWL_Note_Edit;
+ PWL_CREATEPARAM ecp = cp;
+ ecp.pParentWnd = this;
+ ecp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_MULTILINE | PES_AUTORETURN | PES_TEXTOVERFLOW | PES_UNDO | PES_SPELLCHECK;
+
+ m_pEdit->EnableNotify(FALSE);
+ m_pEdit->Create(ecp);
+ m_pEdit->EnableNotify(TRUE);
+}
+
+void CPWL_Note_Contents::SetText(const CFX_WideString& sText)
+{
+ if (m_pEdit)
+ {
+ m_pEdit->EnableNotify(FALSE);
+ m_pEdit->SetText(sText);
+ m_pEdit->EnableNotify(TRUE);
+ OnNotify(m_pEdit, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+}
+
+CFX_WideString CPWL_Note_Contents::GetText() const
+{
+ if (m_pEdit)
+ return m_pEdit->GetText();
+
+ return L"";
+}
+
+CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem()
+{
+ CPWL_NoteItem* pNoteItem = new CPWL_NoteItem;
+ PWL_CREATEPARAM icp = this->GetCreationParam();
+ icp.pParentWnd = this;
+ icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
+ pNoteItem->Create(icp);
+
+ pNoteItem->OnCreateNoteItem();
+
+ pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1);
+
+ FX_SYSTEMTIME st;
+ if (IFX_SystemHandler* pSH = this->GetSystemHandler())
+ st = pSH->GetLocalTime();
+ pNoteItem->SetDateTime(st);
+
+ pNoteItem->SetContents(L"");
+
+ this->OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0);
+
+ return pNoteItem;
+}
+
+FX_INT32 CPWL_Note_Contents::CountSubItems() const
+{
+ return m_aChildren.GetSize() - 1;
+}
+
+IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(FX_INT32 index) const
+{
+ FX_INT32 nIndex = index + 1;
+
+ if (nIndex > 0 && nIndex < m_aChildren.GetSize())
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex))
+ {
+ ASSERT(pChild->GetClassName() == "CPWL_NoteItem");
+ CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;
+ return pItem;
+ }
+ return NULL;
+}
+
+void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem)
+{
+ FX_INT32 nIndex = this->GetItemIndex((CPWL_NoteItem*)pNoteItem);
+
+ if (nIndex > 0)
+ {
+ if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem)
+ {
+ pPWLNoteItem->KillFocus();
+ pPWLNoteItem->Destroy();
+ delete pPWLNoteItem;
+ }
+
+ for (FX_INT32 i=nIndex,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ ASSERT(pChild->GetClassName() == "CPWL_NoteItem");
+ CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;
+ pItem->ResetSubjectName(i);
+ }
+ }
+
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+}
+
+IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CPDF_Point& point)
+{
+ CPDF_Point pt = this->ParentToChild(point);
+
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ if (pChild->GetClassName() == "CPWL_NoteItem")
+ {
+ CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
+ if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt))
+ return pRet;
+ }
+ }
+ }
+ return NULL;
+}
+
+void CPWL_Note_Contents::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ {
+ FX_INT32 nIndex = this->GetItemIndex(pWnd);
+ if (nIndex < 0) nIndex = 0;
+
+ m_pEdit->EnableNotify(FALSE);
+ this->ResetContent(nIndex);
+ m_pEdit->EnableNotify(TRUE);
+
+ for (FX_INT32 i=nIndex+1, sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ pChild->OnNotify(this, PNM_NOTERESET, 0, 0);
+ }
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+ }
+ return;
+ case PNM_SCROLLWINDOW:
+ this->SetScrollPos(CPDF_Point(0.0f, *(FX_FLOAT*)lParam));
+ this->ResetFace();
+ InvalidateRect(NULL);
+ return;
+ case PNM_SETCARETINFO:
+ if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
+ {
+ PWL_CARET_INFO newInfo = *pInfo;
+ newInfo.bVisible = TRUE;
+ newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
+ }
+ }
+ return;
+ case PNM_NOTERESET:
+ {
+ m_pEdit->EnableNotify(FALSE);
+ this->ResetContent(0);
+ m_pEdit->EnableNotify(TRUE);
+
+ for (FX_INT32 i=1, sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ pChild->OnNotify(this, PNM_NOTERESET, 0, 0);
+ }
+
+ m_pEdit->EnableNotify(FALSE);
+ this->ResetContent(0);
+ m_pEdit->EnableNotify(TRUE);
+ }
+ return;
+ }
+
+ CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
+}
+
+FX_BOOL CPWL_Note_Contents::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (CPWL_Wnd::OnLButtonDown(point,nFlag)) return TRUE;
+
+ if (!m_pEdit->IsFocused())
+ {
+ m_pEdit->SetFocus();
+ }
+
+ return TRUE;
+}
+
+void CPWL_Note_Contents::SetEditFocus(FX_BOOL bLast)
+{
+ if (!m_pEdit->IsFocused())
+ {
+ m_pEdit->SetFocus();
+ m_pEdit->SetCaret(bLast ? m_pEdit->GetTotalWords() : 0);
+ }
+}
+
+CPWL_Edit* CPWL_Note_Contents::GetEdit() const
+{
+ return m_pEdit;
+}
+
+void CPWL_Note_Contents::EnableModify(FX_BOOL bEnabled)
+{
+ if (!bEnabled)
+ m_pEdit->AddFlag(PWS_READONLY);
+ else
+ m_pEdit->RemoveFlag(PWS_READONLY);
+
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ if (pChild->GetClassName() == "CPWL_NoteItem")
+ {
+ CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
+ pNoteItem->EnableModify(bEnabled);
+ }
+ }
+ }
+}
+
+void CPWL_Note_Contents::EnableRead(FX_BOOL bEnabled)
+{
+ if (!bEnabled)
+ m_pEdit->AddFlag(PES_NOREAD);
+ else
+ m_pEdit->RemoveFlag(PES_NOREAD);
+
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ if (pChild->GetClassName() == "CPWL_NoteItem")
+ {
+ CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild;
+ pNoteItem->EnableRead(bEnabled);
+ }
+ }
+ }
+}
+
+/* ---------------------------------- CPWL_NoteItem ---------------------------------- */
+
+CPWL_NoteItem::CPWL_NoteItem() :
+ m_pPrivateData(NULL),
+ m_pSubject(NULL),
+ m_pDateTime(NULL),
+ m_pContents(NULL),
+ m_sAuthor(L""),
+ m_fOldItemHeight(0.0f),
+ m_bSizeChanged(FALSE),
+ m_bAllowModify(TRUE)
+{
+}
+
+CPWL_NoteItem::~CPWL_NoteItem()
+{
+}
+
+CFX_ByteString CPWL_NoteItem::GetClassName() const
+{
+ return "CPWL_NoteItem";
+}
+
+void CPWL_NoteItem::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ CPWL_Color sTextColor;
+
+ if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))
+ sTextColor = PWL_DEFAULT_WHITECOLOR;
+ else
+ sTextColor = PWL_DEFAULT_BLACKCOLOR;
+
+ m_pSubject = new CPWL_Label;
+ PWL_CREATEPARAM scp = cp;
+ scp.pParentWnd = this;
+ scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;
+ scp.sTextColor = sTextColor;
+ m_pSubject->Create(scp);
+
+ m_pDateTime = new CPWL_Label;
+ PWL_CREATEPARAM dcp = cp;
+ dcp.pParentWnd = this;
+ dcp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_RIGHT | PES_TOP;
+ dcp.sTextColor = sTextColor;
+ m_pDateTime->Create(dcp);
+
+ m_pContents = new CPWL_Note_Contents;
+ PWL_CREATEPARAM ccp = cp;
+ ccp.pParentWnd = this;
+ //ccp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
+ ccp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);
+ ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BACKGROUND;
+ m_pContents->Create(ccp);
+ m_pContents->SetItemSpace(POPUP_ITEM_SPACE);
+ m_pContents->SetTopSpace(POPUP_ITEM_SPACE);
+ m_pContents->SetBottomSpace(POPUP_ITEM_SPACE);
+}
+
+void CPWL_NoteItem::RePosChildWnd()
+{
+ if (this->IsValid())
+ {
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect rcSubject = rcClient;
+ rcSubject.left += POPUP_ITEM_TEXT_INDENT;
+ rcSubject.top = rcClient.top;
+ rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcClient.right);
+ rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();
+ rcSubject.Normalize();
+ m_pSubject->Move(rcSubject, TRUE, FALSE);
+ m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));
+
+ CPDF_Rect rcDate = rcClient;
+ rcDate.right -= POPUP_ITEM_TEXT_INDENT;
+ rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcSubject.right);
+ rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();
+ rcDate.Normalize();
+ m_pDateTime->Move(rcDate, TRUE, FALSE);
+ m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));
+
+ CPDF_Rect rcContents = rcClient;
+ rcContents.left += 1.0f;
+ rcContents.right -= 1.0f;
+ rcContents.top = rcDate.bottom - POPUP_ITEM_HEAD_BOTTOM;
+ rcContents.bottom += POPUP_ITEM_BOTTOMWIDTH;
+ rcContents.Normalize();
+ m_pContents->Move(rcContents, TRUE, FALSE);
+ m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));
+ }
+
+ SetClipRect(CPWL_Utils::InflateRect(GetWindowRect(),1.0f));
+}
+
+void CPWL_NoteItem::SetPrivateData(void* pData)
+{
+ m_pPrivateData = pData;
+}
+
+void CPWL_NoteItem::SetBkColor(const CPWL_Color& color)
+{
+ CPWL_Color sBK = color;
+ this->SetBackgroundColor(sBK);
+
+ CPWL_Color sTextColor;
+
+ if (CPWL_Utils::IsBlackOrWhite(sBK))
+ sTextColor = PWL_DEFAULT_WHITECOLOR;
+ else
+ sTextColor = PWL_DEFAULT_BLACKCOLOR;
+
+ this->SetTextColor(sTextColor);
+ if (m_pSubject)
+ m_pSubject->SetTextColor(sTextColor);
+ if (m_pDateTime)
+ m_pDateTime->SetTextColor(sTextColor);
+
+ this->InvalidateRect(NULL);
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetBkColor(this);
+ }
+}
+
+void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName)
+{
+ if (m_pSubject)
+ {
+ m_pSubject->SetText(sName);
+ }
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetSubjectName(this);
+ }
+}
+
+void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName)
+{
+ m_sAuthor = sName;
+ ResetSubjectName(-1);
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetAuthorName(this);
+ }
+}
+
+void CPWL_NoteItem::ResetSubjectName(FX_INT32 nItemIndex)
+{
+ if (nItemIndex < 0)
+ {
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
+
+ CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent;
+ nItemIndex = pContents->GetItemIndex(this);
+ }
+ }
+
+ const CPWL_Note* pNote = GetNote();
+ ASSERT(pNote != NULL);
+
+ CFX_WideString sSubject;
+ sSubject.Format(pNote->GetReplyString(), nItemIndex);
+
+ if (!m_sAuthor.IsEmpty())
+ {
+
+ sSubject += L" - ";
+ sSubject += m_sAuthor;
+ }
+ this->SetSubjectName(sSubject);
+ this->RePosChildWnd();
+}
+
+void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time)
+{
+ m_dtNote = time;
+
+ CFX_WideString swTime;
+ swTime.Format((FX_LPCWSTR)L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
+ if (m_pDateTime)
+ {
+ m_pDateTime->SetText(swTime);
+ }
+
+ this->RePosChildWnd();
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetDateTime(this);
+ }
+}
+
+void CPWL_NoteItem::SetContents(const CFX_WideString& sContents)
+{
+ if (m_pContents)
+ {
+ m_pContents->SetText(sContents);
+ }
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetContents(this);
+ }
+}
+
+CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const
+{
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
+ {
+ ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
+ return (CPWL_NoteItem*)pGrand;
+ }
+ }
+
+ return NULL;
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetParentItem() const
+{
+ return GetParentNoteItem();
+}
+
+CPWL_Edit* CPWL_NoteItem::GetEdit() const
+{
+ if (m_pContents)
+ return m_pContents->GetEdit();
+ return NULL;
+}
+
+void* CPWL_NoteItem::GetPrivateData() const
+{
+ return m_pPrivateData;
+}
+
+CFX_WideString CPWL_NoteItem::GetAuthorName() const
+{
+ return m_sAuthor;
+}
+
+CPWL_Color CPWL_NoteItem::GetBkColor() const
+{
+ return this->GetBackgroundColor();
+}
+
+CFX_WideString CPWL_NoteItem::GetContents() const
+{
+ if (m_pContents)
+ return m_pContents->GetText();
+
+ return L"";
+}
+
+FX_SYSTEMTIME CPWL_NoteItem::GetDateTime() const
+{
+ return m_dtNote;
+}
+
+CFX_WideString CPWL_NoteItem::GetSubjectName() const
+{
+ if (m_pSubject)
+ return m_pSubject->GetText();
+
+ return L"";
+}
+
+CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem()
+{
+ if (m_pContents)
+ return m_pContents->CreateSubItem();
+
+ return NULL;
+}
+
+IPWL_NoteItem* CPWL_NoteItem::CreateSubItem()
+{
+ return CreateNoteItem();
+}
+
+FX_INT32 CPWL_NoteItem::CountSubItems() const
+{
+ if (m_pContents)
+ return m_pContents->CountSubItems();
+
+ return 0;
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetSubItems(FX_INT32 index) const
+{
+ if (m_pContents)
+ return m_pContents->GetSubItems(index);
+
+ return NULL;
+}
+
+void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem)
+{
+ this->KillFocus();
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnItemDelete(pNoteItem);
+ }
+
+ if (m_pContents)
+ m_pContents->DeleteSubItem(pNoteItem);
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CPDF_Point& point)
+{
+ CPDF_Point pt = this->ParentToChild(point);
+
+ if (this->WndHitTest(pt))
+ {
+ if (m_pContents)
+ {
+ if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt))
+ return pNoteItem;
+ }
+
+ return this;
+ }
+
+ return NULL;
+}
+
+IPWL_NoteItem* CPWL_NoteItem::GetFocusedNoteItem() const
+{
+ if (const CPWL_Wnd* pWnd = this->GetFocused())
+ {
+ if (pWnd->GetClassName() == "CPWL_Edit")
+ {
+ if (CPWL_Wnd* pParent = pWnd->GetParentWindow())
+ {
+ ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
+
+ if (CPWL_Wnd* pGrand = pParent->GetParentWindow())
+ {
+ ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
+ return (CPWL_NoteItem*)pGrand;
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+FX_FLOAT CPWL_NoteItem::GetItemHeight(FX_FLOAT fLimitWidth)
+{
+ if (fLimitWidth > 0)
+ {
+ if (!m_bSizeChanged)
+ return m_fOldItemHeight;
+
+ m_bSizeChanged = FALSE;
+
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+
+ FX_FLOAT fRet = m_pDateTime->GetContentRect().Height();
+ FX_FLOAT fBorderWidth = (FX_FLOAT)this->GetBorderWidth();
+ if (fLimitWidth > fBorderWidth * 2)
+ fRet += m_pContents->GetContentsHeight(fLimitWidth - fBorderWidth * 2);
+ fRet += POPUP_ITEM_HEAD_BOTTOM + POPUP_ITEM_BOTTOMWIDTH + fBorderWidth * 2;
+
+ return m_fOldItemHeight = fRet;
+ }
+
+ return 0;
+}
+
+FX_FLOAT CPWL_NoteItem::GetItemLeftMargin()
+{
+ return POPUP_ITEM_SIDEMARGIN;
+}
+
+FX_FLOAT CPWL_NoteItem::GetItemRightMargin()
+{
+ return POPUP_ITEM_SIDEMARGIN;
+}
+
+FX_BOOL CPWL_NoteItem::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)
+{
+ if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))
+ {
+ SetNoteFocus(FALSE);
+ }
+
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_NoteItem::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (!m_pContents->WndHitTest(m_pContents->ParentToChild(point)))
+ {
+ SetNoteFocus(FALSE);
+ PopupNoteItemMenu(point);
+
+ return TRUE;
+ }
+
+ return CPWL_Wnd::OnRButtonUp(point,nFlag);
+}
+
+void CPWL_NoteItem::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ m_bSizeChanged = TRUE;
+
+ if (CPWL_Wnd* pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ }
+ return;
+ case PNM_SETCARETINFO:
+ if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
+ {
+ PWL_CARET_INFO newInfo = *pInfo;
+ newInfo.bVisible = TRUE;
+ newInfo.ptHead = this->ChildToParent(pInfo->ptHead);
+ newInfo.ptFoot = this->ChildToParent(pInfo->ptFoot);
+
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ pParent->OnNotify(this, PNM_SETCARETINFO, (FX_INTPTR)&newInfo, 0);
+ }
+ }
+ return;
+ case PNM_NOTERESET:
+ m_bSizeChanged = TRUE;
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+
+ return;
+ }
+
+ CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
+}
+
+void CPWL_NoteItem::PopupNoteItemMenu(const CPDF_Point& point)
+{
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ FX_INT32 x,y;
+ PWLtoWnd(point, x, y);
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ pSH->ClientToScreen(GetAttachedHWnd(), x, y);
+ pNotify->OnPopupMenu(this, x, y);
+ }
+}
+
+const CPWL_Note* CPWL_NoteItem::GetNote() const
+{
+ if (const CPWL_Wnd* pRoot = this->GetRootWnd())
+ {
+ ASSERT(pRoot->GetClassName() == "CPWL_NoteItem");
+ CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot;
+ if (pNoteItem->IsTopItem())
+ {
+ return (CPWL_Note*)pNoteItem;
+ }
+ }
+
+ return NULL;
+}
+
+IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const
+{
+ if (const CPWL_Note* pNote = GetNote())
+ return pNote->GetNoteNotify();
+
+ return NULL;
+}
+
+void CPWL_NoteItem::OnCreateNoteItem()
+{
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnItemCreate(this);
+ }
+}
+
+void CPWL_NoteItem::OnContentsValidate()
+{
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetContents(this);
+ }
+}
+
+void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast)
+{
+ m_pContents->SetEditFocus(bLast);
+}
+
+void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled)
+{
+ m_pContents->EnableModify(bEnabled);
+ m_bAllowModify = bEnabled;
+}
+
+void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled)
+{
+ m_pContents->EnableRead(bEnabled);
+}
+
+/* ---------------------------------- CPWL_Note ---------------------------------- */
+
+CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, IPWL_NoteNotify* pNoteNotify, IPWL_NoteHandler* pNoteHandler) :
+ m_pAuthor(NULL),
+ m_pIcon(NULL),
+ m_pCloseBox(NULL),
+ m_pContentsBar(NULL),
+ m_pLBBox(NULL),
+ m_pRBBox(NULL),
+ m_pOptions(NULL),
+ m_bResizing(FALSE),
+ m_rcCaption(0,0,0,0),
+ m_pNoteNotify(pNoteNotify),
+ m_bEnalbleNotify(TRUE),
+ m_pPopupNote(pPopupNote),
+ m_pNoteHandler(pNoteHandler)
+{
+}
+
+CPWL_Note::~CPWL_Note()
+{
+}
+
+IPWL_NoteItem* CPWL_Note::Reply()
+{
+ return CreateNoteItem();
+}
+
+void CPWL_Note::EnableNotify(FX_BOOL bEnabled)
+{
+ m_bEnalbleNotify = bEnabled;
+}
+
+void CPWL_Note::RePosChildWnd()
+{
+ RePosNoteChildren();
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ ResetScrollBar();
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
+ //ͬ²½
+ if (const CPWL_Wnd* pWnd = this->GetFocused())
+ {
+ if (pWnd->GetClassName() == "CPWL_Edit")
+ {
+ CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
+ pEdit->SetCaret(pEdit->GetCaret());
+ }
+ }
+ //CPDF_Point ptNew = m_pContents->GetScrollPos();
+ //m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+}
+
+FX_BOOL CPWL_Note::ResetScrollBar()
+{
+ FX_BOOL bScrollChanged = FALSE;
+
+ if (ScrollBarShouldVisible())
+ {
+ if (!m_pContentsBar->IsVisible())
+ {
+ m_pContentsBar->SetVisible(TRUE);
+ if (m_pContentsBar->IsVisible())
+ {
+ m_pContentsBar->InvalidateRect(NULL);
+ bScrollChanged = TRUE;
+ }
+ }
+ }
+ else
+ {
+ if (m_pContentsBar->IsVisible())
+ {
+ m_pContentsBar->SetVisible(FALSE);
+ m_pContentsBar->InvalidateRect(NULL);
+
+ bScrollChanged = TRUE;
+ }
+ }
+
+ if (bScrollChanged)
+ {
+ CPDF_Rect rcNote = this->GetClientRect();
+ CPDF_Rect rcContents = m_pContents->GetWindowRect();
+ rcContents.right = rcNote.right - 3.0f;
+ if (m_pContentsBar->IsVisible())
+ rcContents.right -= PWL_SCROLLBAR_WIDTH;
+ m_pContents->Move(rcContents, TRUE, TRUE);
+ m_pContents->SetScrollPos(CPDF_Point(0.0f,0.0f));
+ m_pContents->InvalidateRect(NULL);
+ }
+
+ return bScrollChanged;
+}
+
+FX_BOOL CPWL_Note::ScrollBarShouldVisible()
+{
+ CPDF_Rect rcContentsFact = m_pContents->GetScrollArea();
+ CPDF_Rect rcContentsClient = m_pContents->GetClientRect();
+
+ return rcContentsFact.Height() > rcContentsClient.Height();
+}
+
+void CPWL_Note::SetOptionsText(const CFX_WideString& sText)
+{
+ if (m_pOptions)
+ m_pOptions->SetText(sText);
+
+ RePosNoteChildren();
+}
+
+void CPWL_Note::RePosNoteChildren()
+{
+ if (m_bResizing) return;
+
+ m_bResizing = TRUE;
+
+ if (this->IsValid())
+ {
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+ ASSERT(m_pAuthor != NULL);
+ ASSERT(m_pCloseBox != NULL);
+ ASSERT(m_pIcon != NULL);
+ ASSERT(m_pLBBox != NULL);
+ ASSERT(m_pRBBox != NULL);
+ ASSERT(m_pContentsBar != NULL);
+ ASSERT(m_pOptions != NULL);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect rcIcon = rcClient;
+ rcIcon.top -= 2.0f;
+ rcIcon.right = rcIcon.left + 14.0f;
+ rcIcon.bottom = rcIcon.top - 14.0f;
+ rcIcon.Normalize();
+ m_pIcon->Move(rcIcon, TRUE, FALSE);
+ m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon));
+
+ CPDF_Rect rcCloseBox = rcClient;
+ rcCloseBox.right -= 1.0f;
+ rcCloseBox.top -= 1.0f;
+ rcCloseBox.left = rcCloseBox.right - 14.0f;
+ rcCloseBox.bottom = rcCloseBox.top - 14.0f;
+ rcCloseBox.Normalize();
+ m_pCloseBox->Move(rcCloseBox, TRUE, FALSE);
+ m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox));
+
+ CPDF_Rect rcDate = rcClient;
+ rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT;
+ rcDate.left = PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, rcIcon.right + 1.0f);
+ rcDate.top = rcClient.top - 2.0f;
+ rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();
+ rcDate.Normalize();
+ m_pDateTime->Move(rcDate, TRUE, FALSE);
+ m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));
+
+ CPDF_Rect rcSubject = rcClient;
+ rcSubject.top = rcClient.top - 2.0f;
+ rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT;
+ rcSubject.right = PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, rcDate.left - 1.0f);
+ rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();
+ rcSubject.Normalize();
+ m_pSubject->Move(rcSubject, TRUE, FALSE);
+ m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));
+
+ CPDF_Rect rcOptions = rcClient;
+ rcOptions.left = PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), rcIcon.right + 1.0f);
+ rcOptions.top = rcSubject.bottom - 4.0f;
+ rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height();
+ rcOptions.Normalize();
+ m_pOptions->Move(rcOptions, TRUE, FALSE);
+ m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions));
+
+ CPDF_Rect rcAuthor = rcClient;
+ rcAuthor.top = rcSubject.bottom - 4.0f;
+ rcAuthor.left = rcSubject.left;
+ rcAuthor.right = PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, rcOptions.left - 1.0f);
+ rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height();
+ rcAuthor.Normalize();
+ m_pAuthor->Move(rcAuthor, TRUE, FALSE);
+ m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor));
+
+ CPDF_Rect rcLBBox = rcClient;
+ rcLBBox.top = rcLBBox.bottom + 7.0f;
+ rcLBBox.right = rcLBBox.left + 7.0f;
+ rcLBBox.Normalize();
+ m_pLBBox->Move(rcLBBox, TRUE, FALSE);
+ m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox));
+
+ CPDF_Rect rcRBBox = rcClient;
+ rcRBBox.top = rcRBBox.bottom + 7.0f;
+ rcRBBox.left = rcRBBox.right - 7.0f;
+ rcRBBox.Normalize();
+ m_pRBBox->Move(rcRBBox, TRUE, FALSE);
+ m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox));
+
+ CPDF_Rect rcContents = rcClient;
+ rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM;
+ rcContents.left += 3.0f;
+ rcContents.right -= 3.0f;
+ if (m_pContentsBar->IsVisible())
+ rcContents.right -= PWL_SCROLLBAR_WIDTH;
+ rcContents.bottom += 14.0f;
+ rcContents.Normalize();
+ m_pContents->Move(rcContents, FALSE, FALSE);
+ m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));
+
+ CPDF_Rect rcContentsBar = rcContents;
+ rcContentsBar.right = rcClient.right - 3.0f;
+ rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH;
+ rcContentsBar.Normalize();
+ m_pContentsBar->Move(rcContentsBar, TRUE, FALSE);
+
+ m_rcCaption = rcClient;
+ m_rcCaption.bottom = rcContents.top;
+ }
+
+ m_bResizing = FALSE;
+}
+
+//0-normal / 1-caption / 2-leftbottom corner / 3-rightbottom corner / 4-close / 5-options
+FX_INT32 CPWL_Note::NoteHitTest(const CPDF_Point& point) const
+{
+ ASSERT(m_pSubject != NULL);
+ ASSERT(m_pDateTime != NULL);
+ ASSERT(m_pContents != NULL);
+ ASSERT(m_pAuthor != NULL);
+ ASSERT(m_pIcon != NULL);
+ ASSERT(m_pContentsBar != NULL);
+
+ ASSERT(m_pCloseBox != NULL);
+ ASSERT(m_pLBBox != NULL);
+ ASSERT(m_pRBBox != NULL);
+ ASSERT(m_pOptions != NULL);
+
+ GetClientRect();
+
+ if (m_pSubject->WndHitTest(m_pSubject->ParentToChild(point))) return 1;
+ if (m_pDateTime->WndHitTest(m_pDateTime->ParentToChild(point))) return 1;
+ if (m_pAuthor->WndHitTest(m_pAuthor->ParentToChild(point))) return 1;
+ if (m_pIcon->WndHitTest(m_pIcon->ParentToChild(point))) return 1;
+
+ if (m_pContents->WndHitTest(m_pContents->ParentToChild(point))) return 0;
+ if (m_pContentsBar->WndHitTest(m_pContentsBar->ParentToChild(point))) return 0;
+
+ if (m_pCloseBox->WndHitTest(m_pCloseBox->ParentToChild(point))) return 4;
+ if (m_pLBBox->WndHitTest(m_pLBBox->ParentToChild(point))) return 2;
+ if (m_pRBBox->WndHitTest(m_pRBBox->ParentToChild(point))) return 3;
+ if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) return 5;
+
+ return 1;
+}
+
+void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ CPWL_NoteItem::CreateChildWnd(cp);
+
+ CPWL_Color sTextColor;
+
+ if (CPWL_Utils::IsBlackOrWhite(this->GetBackgroundColor()))
+ sTextColor = PWL_DEFAULT_WHITECOLOR;
+ else
+ sTextColor = PWL_DEFAULT_BLACKCOLOR;
+
+ m_pAuthor = new CPWL_Label;
+ PWL_CREATEPARAM acp = cp;
+ acp.pParentWnd = this;
+ acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;
+ acp.sTextColor = sTextColor;
+ m_pAuthor->Create(acp);
+
+ m_pCloseBox = new CPWL_Note_CloseBox;
+ PWL_CREATEPARAM ccp = cp;
+ ccp.pParentWnd = this;
+ ccp.dwBorderWidth = 2;
+ ccp.nBorderStyle = PBS_BEVELED;
+ ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER;
+ ccp.sTextColor = sTextColor;
+ m_pCloseBox->Create(ccp);
+
+ m_pIcon = new CPWL_Note_Icon;
+ PWL_CREATEPARAM icp = cp;
+ icp.pParentWnd = this;
+ icp.dwFlags = PWS_VISIBLE | PWS_CHILD;
+ m_pIcon->Create(icp);
+
+ m_pOptions = new CPWL_Note_Options;
+ PWL_CREATEPARAM ocp = cp;
+ ocp.pParentWnd = this;
+ ocp.dwFlags = PWS_CHILD | PWS_VISIBLE;
+ ocp.sTextColor = sTextColor;
+ m_pOptions->Create(ocp);
+
+ m_pLBBox = new CPWL_Note_LBBox;
+ PWL_CREATEPARAM lcp = cp;
+ lcp.pParentWnd = this;
+ lcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
+ lcp.eCursorType = FXCT_NESW;
+ lcp.sTextColor = sTextColor;
+ m_pLBBox->Create(lcp);
+
+ m_pRBBox = new CPWL_Note_RBBox;
+ PWL_CREATEPARAM rcp = cp;
+ rcp.pParentWnd = this;
+ rcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
+ rcp.eCursorType = FXCT_NWSE;
+ rcp.sTextColor = sTextColor;
+ m_pRBBox->Create(rcp);
+
+ m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL);
+ PWL_CREATEPARAM scp = cp;
+ scp.pParentWnd = this;
+ scp.sBackgroundColor = CPWL_Color(COLORTYPE_RGB, 240/255.0f, 240/255.0f, 240/255.0f);
+ scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
+ m_pContentsBar->Create(scp);
+ m_pContentsBar->SetNotifyForever(TRUE);
+}
+
+void CPWL_Note::SetSubjectName(const CFX_WideString& sName)
+{
+ CPWL_NoteItem::SetSubjectName(sName);
+ RePosChildWnd();
+}
+
+void CPWL_Note::SetAuthorName(const CFX_WideString& sName)
+{
+ if (m_pAuthor)
+ {
+ m_pAuthor->SetText(sName);
+ RePosChildWnd();
+ }
+
+ if (IPWL_NoteNotify* pNotify = GetNoteNotify())
+ {
+ pNotify->OnSetAuthorName(this);
+ }
+}
+
+CFX_WideString CPWL_Note::GetAuthorName() const
+{
+ if (m_pAuthor)
+ return m_pAuthor->GetText();
+
+ return L"";
+}
+
+FX_BOOL CPWL_Note::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ CPDF_Rect rcScroll = m_pContents->GetScrollArea();
+ CPDF_Rect rcContents = m_pContents->GetClientRect();
+
+ if (rcScroll.top - rcScroll.bottom > rcContents.Height())
+ {
+ CPDF_Point ptNew = ptScroll;
+
+ if (zDelta > 0)
+ ptNew.y += 30;
+ else
+ ptNew.y -= 30;
+
+ if (ptNew.y > rcScroll.top)
+ ptNew.y = rcScroll.top;
+ if (ptNew.y < rcScroll.bottom + rcContents.Height())
+ ptNew.y = rcScroll.bottom + rcContents.Height();
+ if (ptNew.y < rcScroll.bottom)
+ ptNew.y = rcScroll.bottom;
+
+ if (ptNew.y != ptScroll.y)
+ {
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptNew.y);
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_NOTEEDITCHANGED:
+ {
+ CPDF_Rect rcScroll = m_pContents->GetScrollArea();
+
+
+ PWL_SCROLL_INFO sInfo;
+ sInfo.fContentMin = rcScroll.bottom;
+ sInfo.fContentMax = rcScroll.top;
+ sInfo.fPlateWidth = m_pContents->GetClientRect().Height();
+ sInfo.fSmallStep = 13.0f;
+ sInfo.fBigStep = sInfo.fPlateWidth;
+
+ if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != 0)
+ {
+ FX_BOOL bScrollChanged = FALSE;
+
+ if (lParam < 3) //·ÀÖ¹ËÀÑ­»· mantis:15759
+ {
+ bScrollChanged = ResetScrollBar();
+ if (bScrollChanged)
+ {
+ lParam++;
+ m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
+ this->OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam);
+ }
+ }
+
+ if (!bScrollChanged)
+ {
+ if (m_pContentsBar->IsVisible())
+ {
+ m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, (FX_INTPTR)&sInfo);
+ m_OldScrollInfo = sInfo;
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ CPDF_Point ptOld = ptScroll;
+
+ if (ptScroll.y > sInfo.fContentMax)
+ ptScroll.y = sInfo.fContentMax;
+ if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth)
+ ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth;
+ if (ptScroll.y < sInfo.fContentMin)
+ ptScroll.y = sInfo.fContentMin;
+
+ if (ptOld.y != ptScroll.y)
+ {
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+ m_pContentsBar->InvalidateRect(NULL);
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+ }
+ }
+ }
+ }
+ }
+
+ m_pContents->InvalidateRect(NULL);
+
+ return;
+ case PNM_SCROLLWINDOW:
+ if (m_pContents)
+ m_pContents->OnNotify(pWnd, msg, wParam, lParam);
+ return;
+ case PNM_SETSCROLLPOS:
+ if (m_pContentsBar)
+ m_pContentsBar->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
+ return;
+ }
+
+ if (msg == PNM_SETCARETINFO && IsValid())
+ {
+ if (PWL_CARET_INFO * pInfo = (PWL_CARET_INFO*)wParam)
+ {
+ if (m_pContents)
+ {
+ CPDF_Rect rcClient = m_pContents->GetClientRect();
+ if (pInfo->ptHead.y > rcClient.top)
+ {
+ CPDF_Point pt = m_pContents->OutToIn(pInfo->ptHead);
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+
+ return;
+ }
+
+ if (pInfo->ptFoot.y < rcClient.bottom)
+ {
+ CPDF_Point pt = m_pContents->OutToIn(pInfo->ptFoot);
+ pt.y += rcClient.Height();
+ m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, (FX_INTPTR)&pt.y);
+
+ CPDF_Point ptScroll = m_pContents->GetScrollPos();
+ m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, (FX_INTPTR)&ptScroll.y);
+
+ return;
+ }
+ }
+ }
+ }
+
+ CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam);
+}
+
+void CPWL_Note::SetBkColor(const CPWL_Color& color)
+{
+ CPWL_NoteItem::SetBkColor(color);
+
+ CPWL_Color sBK = color;
+ CPWL_Color sTextColor;
+ if (CPWL_Utils::IsBlackOrWhite(sBK))
+ sTextColor = PWL_DEFAULT_WHITECOLOR;
+ else
+ sTextColor = PWL_DEFAULT_BLACKCOLOR;
+
+ if (m_pCloseBox)
+ m_pCloseBox->SetTextColor(sTextColor);
+ if (m_pAuthor)
+ m_pAuthor->SetTextColor(sTextColor);
+ if (m_pOptions)
+ m_pOptions->SetTextColor(sTextColor);
+ if (m_pLBBox)
+ m_pLBBox->SetTextColor(sTextColor);
+ if (m_pRBBox)
+ m_pRBBox->SetTextColor(sTextColor);
+}
+
+FX_BOOL CPWL_Note::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag)
+{
+ if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point)))
+ {
+ if (IPWL_NoteNotify* pNotify = this->GetNoteNotify())
+ {
+ FX_INT32 x, y;
+ PWLtoWnd(point, x, y);
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ pSH->ClientToScreen(GetAttachedHWnd(), x, y);
+ this->KillFocus();
+ pNotify->OnPopupMenu(x, y);
+
+ return TRUE;
+ }
+ }
+
+ return CPWL_Wnd::OnLButtonDown(point,nFlag);
+}
+
+FX_BOOL CPWL_Note::OnRButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ return CPWL_Wnd::OnRButtonUp(point,nFlag);
+}
+
+const CPWL_Note* CPWL_Note::GetNote() const
+{
+ return this;
+}
+
+IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const
+{
+ if (m_bEnalbleNotify)
+ return m_pNoteNotify;
+
+ return NULL;
+}
+
+void CPWL_Note::SetIconType(FX_INT32 nType)
+{
+ if (m_pIcon)
+ m_pIcon->SetIconType(nType);
+}
+
+void CPWL_Note::EnableModify(FX_BOOL bEnabled)
+{
+ m_pContents->EnableModify(bEnabled);
+}
+
+void CPWL_Note::EnableRead(FX_BOOL bEnabled)
+{
+ m_pContents->EnableRead(bEnabled);
+}
+
+CFX_WideString CPWL_Note::GetReplyString() const
+{
+ return m_sReplyString;
+}
+
+void CPWL_Note::SetReplyString(const CFX_WideString& string)
+{
+ m_sReplyString = string;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp
new file mode 100644
index 0000000000..d51de4db75
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp
@@ -0,0 +1,1353 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+
+/* ------------------------------- PWL_FLOATRANGE ------------------------------- */
+
+PWL_FLOATRANGE::PWL_FLOATRANGE()
+{
+ Default();
+}
+
+PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max)
+{
+ Set(min,max);
+}
+
+void PWL_FLOATRANGE::Default()
+{
+ fMin = 0;
+ fMax = 0;
+}
+
+void PWL_FLOATRANGE::Set(FX_FLOAT min,FX_FLOAT max)
+{
+ if (min > max)
+ {
+ fMin = max;
+ fMax = min;
+ }
+ else
+ {
+ fMin = min;
+ fMax = max;
+ }
+}
+
+FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const
+{
+ return (IsFloatBigger(x,fMin) || IsFloatEqual(x, fMin)) &&
+ (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));
+}
+
+FX_FLOAT PWL_FLOATRANGE::GetWidth() const
+{
+ return fMax - fMin;
+}
+
+/* ------------------------------- PWL_SCROLL_PRIVATEDATA ------------------------------- */
+
+PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA()
+{
+ Default();
+}
+
+void PWL_SCROLL_PRIVATEDATA::Default()
+{
+ ScrollRange.Default();
+ fScrollPos = ScrollRange.fMin;
+ fClientWidth = 0;
+ fBigStep = 10;
+ fSmallStep = 1;
+}
+
+void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min,FX_FLOAT max)
+{
+ ScrollRange.Set(min,max);
+
+ if (IsFloatSmaller(fScrollPos, ScrollRange.fMin))
+ fScrollPos = ScrollRange.fMin;
+ if (IsFloatBigger(fScrollPos, ScrollRange.fMax))
+ fScrollPos = ScrollRange.fMax;
+}
+
+void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width)
+{
+ fClientWidth = width;
+}
+
+void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step)
+{
+ fSmallStep = step;
+}
+
+void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step)
+{
+ fBigStep = step;
+}
+
+FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos)
+{
+ if (ScrollRange.In(pos))
+ {
+ fScrollPos = pos;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void PWL_SCROLL_PRIVATEDATA::AddSmall()
+{
+ if (!SetPos(fScrollPos + fSmallStep))
+ SetPos(ScrollRange.fMax);
+}
+
+void PWL_SCROLL_PRIVATEDATA::SubSmall()
+{
+ if (!SetPos(fScrollPos - fSmallStep))
+ SetPos(ScrollRange.fMin);
+}
+
+void PWL_SCROLL_PRIVATEDATA::AddBig()
+{
+ if (!SetPos(fScrollPos + fBigStep))
+ SetPos(ScrollRange.fMax);
+}
+
+void PWL_SCROLL_PRIVATEDATA::SubBig()
+{
+ if (!SetPos(fScrollPos - fBigStep))
+ SetPos(ScrollRange.fMin);
+}
+
+/* ------------------------------- CPWL_SBButton ------------------------------- */
+
+CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE eButtonType)
+{
+ m_eScrollBarType = eScrollBarType;
+ m_eSBButtonType = eButtonType;
+
+ m_bMouseDown = FALSE;
+}
+
+CPWL_SBButton::~CPWL_SBButton()
+{
+
+}
+
+CFX_ByteString CPWL_SBButton::GetClassName() const
+{
+ return "CPWL_SBButton";
+}
+
+void CPWL_SBButton::OnCreate(PWL_CREATEPARAM & cp)
+{
+ cp.eCursorType = FXCT_ARROW;
+}
+
+void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+
+ if (!IsVisible()) return;
+
+ CFX_ByteTextBuf sButton;
+
+ CPDF_Rect rectWnd = GetWindowRect();
+
+ if (rectWnd.IsEmpty()) return;
+
+ sAppStream << "q\n";
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+
+ switch (this->m_eScrollBarType)
+ {
+ case SBT_HSCROLL:
+ switch (this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ sButton << "0 g\n";
+ sButton << pt1.x << " " << pt1.y << " m\n";
+ sButton << pt2.x << " " << pt2.y << " l\n";
+ sButton << pt3.x << " " << pt3.y << " l\n";
+ sButton << pt1.x << " " << pt1.y << " l f\n";
+
+ sAppStream << sButton;
+ }
+ }
+ break;
+ case PSBT_MAX:
+ {
+ CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ sButton << "0 g\n";
+ sButton << pt1.x << " " << pt1.y << " m\n";
+ sButton << pt2.x << " " << pt2.y << " l\n";
+ sButton << pt3.x << " " << pt3.y << " l\n";
+ sButton << pt1.x << " " << pt1.y << " l f\n";
+
+ sAppStream << sButton;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case SBT_VSCROLL:
+ switch(this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt3(ptCenter.x,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ sButton << "0 g\n";
+ sButton << pt1.x << " " << pt1.y << " m\n";
+ sButton << pt2.x << " " << pt2.y << " l\n";
+ sButton << pt3.x << " " << pt3.y << " l\n";
+ sButton << pt1.x << " " << pt1.y << " l f\n";
+
+ sAppStream << sButton;
+ }
+ }
+ break;
+ case PSBT_MAX:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
+ CPDF_Point pt3(ptCenter.x,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ sButton << "0 g\n";
+ sButton << pt1.x << " " << pt1.y << " m\n";
+ sButton << pt2.x << " " << pt2.y << " l\n";
+ sButton << pt3.x << " " << pt3.y << " l\n";
+ sButton << pt1.x << " " << pt1.y << " l f\n";
+
+ sAppStream << sButton;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+
+ sAppStream << "Q\n";
+}
+
+void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ if (!IsVisible()) return;
+
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (rectWnd.IsEmpty()) return;
+
+ CPDF_Point ptCenter = this->GetCenterPoint();
+ FX_INT32 nTransparancy = this->GetTransparency();
+
+ switch (this->m_eScrollBarType)
+ {
+ case SBT_HSCROLL:
+ CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+ switch (this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(4);
+ path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+ path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
+ path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
+
+ pDevice->DrawPath(&path, pUser2Device, NULL,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy),
+ 0, FXFILL_ALTERNATE);
+ }
+ }
+ break;
+ case PSBT_MAX:
+ {
+ CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y);
+ CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN);
+ CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN);
+
+ if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
+ rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN )
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(4);
+ path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
+ path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
+ path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
+ path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
+
+ pDevice->DrawPath(&path, pUser2Device, NULL,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_BLACKCOLOR,nTransparancy),
+ 0, FXFILL_ALTERNATE);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ case SBT_VSCROLL:
+ switch(this->m_eSBButtonType)
+ {
+ case PSBT_MIN:
+ {
+ //draw border
+ CPDF_Rect rcDraw = rectWnd;
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,100,100,100),0.0f);
+
+ //draw inner border
+ rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,255,255,255),1.0f);
+
+ //draw background
+
+ rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);
+
+ if (this->IsEnabled())
+ CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);
+ else
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
+
+ //draw arrow
+
+ if (rectWnd.top - rectWnd.bottom > 6.0f )
+ {
+ FX_FLOAT fX = rectWnd.left + 1.5f;
+ FX_FLOAT fY = rectWnd.bottom;
+ CPDF_Point pts[7] = {
+ CPDF_Point(fX+2.5f, fY+4.0f),
+ CPDF_Point(fX+2.5f, fY+3.0f),
+ CPDF_Point(fX+4.5f, fY+5.0f),
+ CPDF_Point(fX+6.5f, fY+3.0f),
+ CPDF_Point(fX+6.5f, fY+4.0f),
+ CPDF_Point(fX+4.5f, fY+6.0f),
+ CPDF_Point(fX+2.5f, fY+4.0f)};
+
+
+ if (this->IsEnabled())
+ CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));
+ else
+ CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));
+ }
+ }
+ break;
+ case PSBT_MAX:
+ {
+ //draw border
+ CPDF_Rect rcDraw = rectWnd;
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,100,100,100),0.0f);
+
+ //draw inner border
+ rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,255,255,255),1.0f);
+
+ //draw background
+ rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f);
+ if (this->IsEnabled())
+ CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw, nTransparancy, 80, 220);
+ else
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
+
+ //draw arrow
+
+ if (rectWnd.top - rectWnd.bottom > 6.0f )
+ {
+ FX_FLOAT fX = rectWnd.left + 1.5f;
+ FX_FLOAT fY = rectWnd.bottom;
+
+ CPDF_Point pts[7] = {
+ CPDF_Point(fX+2.5f, fY+5.0f),
+ CPDF_Point(fX+2.5f, fY+6.0f),
+ CPDF_Point(fX+4.5f, fY+4.0f),
+ CPDF_Point(fX+6.5f, fY+6.0f),
+ CPDF_Point(fX+6.5f, fY+5.0f),
+ CPDF_Point(fX+4.5f, fY+3.0f),
+ CPDF_Point(fX+2.5f, fY+5.0f)};
+
+
+ if (this->IsEnabled())
+ CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255));
+ else
+ CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
+ CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255));
+ }
+ }
+ break;
+ case PSBT_POS:
+ {
+ //CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+
+ //draw border
+ CPDF_Rect rcDraw = rectWnd;
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,100,100,100),0.0f);
+
+ //draw inner border
+ rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f);
+ CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
+ ArgbEncode(nTransparancy,255,255,255),1.0f);
+
+ if (this->IsEnabled())
+ {
+ //draw shadow effect
+
+ CPDF_Point ptTop = CPDF_Point(rectWnd.left,rectWnd.top-1.0f);
+ CPDF_Point ptBottom = CPDF_Point(rectWnd.left,rectWnd.bottom+1.0f);
+
+ ptTop.x += 1.5f;
+ ptBottom.x += 1.5f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,210,210,210),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,220,220,220),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,240,240,240),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,240,240,240),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,210,210,210),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,180,180,180),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,150,150,150),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,150,150,150),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,180,180,180),1.0f);
+
+ ptTop.x += 1.0f;
+ ptBottom.x += 1.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
+ ArgbEncode(nTransparancy,210,210,210),1.0f);
+ }
+ else
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw, ArgbEncode(255,255,255,255));
+ }
+
+ //draw friction
+
+ if (rectWnd.Height() > 8.0f)
+ {
+ FX_COLORREF crStroke = ArgbEncode(nTransparancy,120,120,120);
+ if (!this->IsEnabled())
+ crStroke = CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255);
+
+ FX_FLOAT nFrictionWidth = 5.0f;
+ FX_FLOAT nFrictionHeight = 5.5f;
+
+ CPDF_Point ptLeft = CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
+ CPDF_Point ptRight = CPDF_Point(ptCenter.x + nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
+ crStroke,1.0f);
+
+ ptLeft.y += 2.0f;
+ ptRight.y += 2.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
+ crStroke,1.0f);
+
+ ptLeft.y += 2.0f;
+ ptRight.y += 2.0f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
+ crStroke,1.0f);
+
+ /*
+ ptLeft.y += 1.5f;
+ ptRight.y += 1.5f;
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
+ ArgbEncode(nTransparancy,150,150,150),1.0f);
+ */
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ pParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point);
+
+ m_bMouseDown = TRUE;
+ SetCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ pParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point);
+
+ m_bMouseDown = FALSE;
+ ReleaseCapture();
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnMouseMove(point,nFlag);
+
+ if (CPWL_Wnd * pParent = GetParentWindow())
+ {
+ pParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point);
+
+ /*
+ if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == PSBT_MAX))
+ {
+ if (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point))
+ return FALSE;
+ }
+ */
+ }
+
+ return TRUE;
+}
+
+/* ------------------------------- CPWL_ScrollBar ---------------------------------- */
+
+CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType):
+ m_sbType(sbType),
+ m_pMinButton(NULL),
+ m_pMaxButton(NULL),
+ m_pPosButton(NULL),
+ m_bMouseDown(FALSE),
+ m_bMinOrMax(FALSE),
+ m_bNotifyForever(TRUE)
+{
+}
+
+CPWL_ScrollBar::~CPWL_ScrollBar()
+{
+}
+
+CFX_ByteString CPWL_ScrollBar::GetClassName() const
+{
+ return "CPWL_ScrollBar";
+}
+
+void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM & cp)
+{
+ cp.eCursorType = FXCT_ARROW;
+}
+
+void CPWL_ScrollBar::RePosChildWnd()
+{
+ CPDF_Rect rcClient = this->GetClientRect();
+
+/*
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
+ rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
+ {
+ SetVisible(FALSE);
+ }
+ break;
+ case SBT_VSCROLL:
+ if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH ||
+ rcClient.top - rcClient.bottom < PWL_SCROLLBAR_WIDTH)
+ {
+ SetVisible(FALSE);
+ }
+ break;
+ }
+*/
+ CPDF_Rect rcMinButton,rcMaxButton;
+
+ FX_FLOAT fBWidth = 0;
+
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+ if (rcClient.right - rcClient.left > PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)
+ {
+ rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
+ rcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,
+ rcClient.right,rcClient.top);
+ }
+ else
+ {
+ fBWidth = (rcClient.right - rcClient.left - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;
+
+ if (fBWidth > 0)
+ {
+ rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.left + fBWidth,rcClient.top);
+ rcMaxButton = CPDF_Rect(rcClient.right - fBWidth,rcClient.bottom,
+ rcClient.right,rcClient.top);
+ }
+ else SetVisible(FALSE);
+ }
+ break;
+ case SBT_VSCROLL:
+ if (IsFloatBigger(rcClient.top - rcClient.bottom, PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2))
+ {
+ rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
+ rcClient.right,rcClient.top);
+ rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.right,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);
+ }
+ else
+ {
+ fBWidth = (rcClient.top - rcClient.bottom - PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / 2;
+
+ if (IsFloatBigger(fBWidth, 0))
+ {
+ rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - fBWidth,
+ rcClient.right,rcClient.top);
+ rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom,
+ rcClient.right,rcClient.bottom + fBWidth);
+ }
+ else SetVisible(FALSE);
+ }
+ break;
+ }
+
+// if (IsVisible())
+ {
+ if (m_pMinButton)
+ m_pMinButton->Move(rcMinButton,TRUE,FALSE);
+
+ if (m_pMaxButton)
+ m_pMaxButton->Move(rcMaxButton,TRUE,FALSE);
+
+ MovePosButton(FALSE);
+ }
+}
+
+void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPDF_Rect rectWnd = GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CFX_ByteTextBuf sButton;
+
+ sButton << "q\n";
+ sButton << "0 w\n" << CPWL_Utils::GetColorAppStream(GetBackgroundColor(),TRUE);
+ sButton << rectWnd.left << " " << rectWnd.bottom << " "
+ << rectWnd.right - rectWnd.left << " " << rectWnd.top - rectWnd.bottom << " re b Q\n";
+
+ sAppStream << sButton;
+ }
+}
+
+void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+// CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
+ CPDF_Rect rectWnd = GetWindowRect();
+
+ if (IsVisible() && !rectWnd.IsEmpty())
+ {
+ CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->GetBackgroundColor(), GetTransparency());
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
+ CPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.left+2.0f,rectWnd.bottom+2.0f),
+ ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
+
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device,
+ CPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Point(rectWnd.right-2.0f,rectWnd.bottom+2.0f),
+ ArgbEncode(this->GetTransparency(),100,100,100),1.0f);
+ }
+}
+
+FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonDown(point,nFlag);
+
+ //SetFocus();
+
+ if (HasFlag(PWS_AUTOTRANSPARENT))
+ {
+ if (GetTransparency() != 255)
+ {
+ SetTransparency(255);
+ InvalidateRect();
+ }
+ }
+
+ CPDF_Rect rcMinArea,rcMaxArea;
+
+ if (m_pPosButton && m_pPosButton->IsVisible())
+ {
+ CPDF_Rect rcClient = this->GetClientRect();
+ CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();
+
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+ rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.bottom,
+ rcPosButton.left,rcClient.top);
+ rcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom,
+ rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,rcClient.top);
+
+ break;
+ case SBT_VSCROLL:
+ rcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top,
+ rcClient.right,rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
+ rcMaxArea = CPDF_Rect(rcClient.left,rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,
+ rcClient.right,rcPosButton.bottom);
+ break;
+ }
+
+ rcMinArea.Normalize();
+ rcMaxArea.Normalize();
+
+ if (rcMinArea.Contains(point.x,point.y))
+ {
+ m_sData.SubBig();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+ }
+
+ if (rcMaxArea.Contains(point.x,point.y))
+ {
+ m_sData.AddBig();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+ }
+ }
+
+ return TRUE;
+}
+
+FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
+{
+ CPWL_Wnd::OnLButtonUp(point,nFlag);
+
+ if (HasFlag(PWS_AUTOTRANSPARENT))
+ {
+ if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)
+ {
+ SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
+ InvalidateRect();
+ }
+ }
+
+ EndTimer();
+ m_bMouseDown = FALSE;
+
+ return TRUE;
+}
+
+void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
+
+ switch (msg)
+ {
+ case PNM_LBUTTONDOWN:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonLBDown(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonLBDown(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonLBDown(*(CPDF_Point*)lParam);
+ }
+ break;
+ case PNM_LBUTTONUP:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonLBUp(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonLBUp(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonLBUp(*(CPDF_Point*)lParam);
+ }
+ break;
+ case PNM_MOUSEMOVE:
+ if (pWnd == m_pMinButton)
+ {
+ OnMinButtonMouseMove(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pMaxButton)
+ {
+ OnMaxButtonMouseMove(*(CPDF_Point*)lParam);
+ }
+
+ if (pWnd == m_pPosButton)
+ {
+ OnPosButtonMouseMove(*(CPDF_Point*)lParam);
+ }
+ break;
+ case PNM_SETSCROLLINFO:
+ {
+ if (PWL_SCROLL_INFO * pInfo = (PWL_SCROLL_INFO*)lParam)
+ {
+ if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0)
+ {
+ m_OriginInfo = *pInfo;
+ FX_FLOAT fMax = pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
+ fMax = fMax > 0.0f ? fMax : 0.0f;
+ this->SetScrollRange(0,fMax, pInfo->fPlateWidth);
+ this->SetScrollStep(pInfo->fBigStep,pInfo->fSmallStep);
+ }
+ }
+ }
+ break;
+ case PNM_SETSCROLLPOS:
+ {
+ FX_FLOAT fPos = *(FX_FLOAT*)lParam;
+ switch (this->m_sbType)
+ {
+ case SBT_HSCROLL:
+ fPos = fPos - m_OriginInfo.fContentMin;
+ break;
+ case SBT_VSCROLL:
+ fPos = m_OriginInfo.fContentMax - fPos;
+ break;
+ }
+ this->SetScrollPos(fPos);
+ }
+ break;
+ }
+}
+
+void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM & cp)
+{
+ PWL_CREATEPARAM scp = cp;
+ scp.pParentWnd = this;
+ scp.dwBorderWidth = 2;
+ scp.nBorderStyle = PBS_BEVELED;
+
+ scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;
+
+ if (!m_pMinButton)
+ {
+ m_pMinButton = new CPWL_SBButton(m_sbType,PSBT_MIN);
+ m_pMinButton->Create(scp);
+ }
+
+ if (!m_pMaxButton)
+ {
+ m_pMaxButton = new CPWL_SBButton(m_sbType,PSBT_MAX);
+ m_pMaxButton->Create(scp);
+ }
+
+ if (!m_pPosButton)
+ {
+ m_pPosButton = new CPWL_SBButton(m_sbType,PSBT_POS);
+ m_pPosButton->SetVisible(FALSE);
+ m_pPosButton->Create(scp);
+ }
+}
+
+FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const
+{
+ if (!IsVisible()) return 0;
+
+ return PWL_SCROLLBAR_WIDTH;
+}
+
+void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClientWidth)
+{
+ if (m_pPosButton)
+ {
+ m_sData.SetScrollRange(fMin,fMax);
+ m_sData.SetClientWidth(fClientWidth);
+
+ if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f))
+ {
+ m_pPosButton->SetVisible(FALSE);
+ }
+ else
+ {
+ m_pPosButton->SetVisible(TRUE);
+ MovePosButton(TRUE);
+ }
+ }
+}
+
+void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos)
+{
+ FX_FLOAT fOldPos = m_sData.fScrollPos;
+
+ m_sData.SetPos(fPos);
+
+ if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
+ MovePosButton(TRUE);
+}
+
+void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep)
+{
+ m_sData.SetBigStep(fBigStep);
+ m_sData.SetSmallStep(fSmallStep);
+}
+
+void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh)
+{
+ ASSERT (m_pPosButton != NULL);
+ ASSERT (m_pMinButton != NULL);
+ ASSERT (m_pMaxButton != NULL);
+
+ if (m_pPosButton->IsVisible())
+ {
+
+
+
+
+ CPDF_Rect rcClient;
+ CPDF_Rect rcPosArea,rcPosButton;
+
+ rcClient = this->GetClientRect();
+ rcPosArea = GetScrollArea();
+
+ FX_FLOAT fLeft,fRight,fTop,fBottom;
+
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+ fLeft = TrueToFace(m_sData.fScrollPos);
+ fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
+
+ if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)
+ fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
+
+ if (fRight > rcPosArea.right)
+ {
+ fRight = rcPosArea.right;
+ fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
+ }
+
+ rcPosButton = CPDF_Rect(fLeft ,
+ rcPosArea.bottom,
+ fRight ,
+ rcPosArea.top);
+
+ break;
+ case SBT_VSCROLL:
+ fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
+ fTop = TrueToFace(m_sData.fScrollPos);
+
+ if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))
+ fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
+
+ if (IsFloatSmaller(fBottom, rcPosArea.bottom))
+ {
+ fBottom = rcPosArea.bottom;
+ fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
+ }
+
+ rcPosButton = CPDF_Rect(rcPosArea.left,
+ fBottom,
+ rcPosArea.right,
+ fTop);
+
+ break;
+ }
+
+ m_pPosButton->Move(rcPosButton,TRUE,bRefresh);
+ }
+}
+
+void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point)
+{
+ m_sData.SubSmall();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+
+ m_bMinOrMax = TRUE;
+
+ EndTimer();
+ BeginTimer(100);
+}
+
+void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point)
+{
+ m_sData.AddSmall();
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+
+ m_bMinOrMax = FALSE;
+
+ EndTimer();
+ BeginTimer(100);
+}
+
+void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point)
+{
+}
+
+void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point)
+{
+ m_bMouseDown = TRUE;
+
+ if (m_pPosButton)
+ {
+ CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect();
+
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ m_nOldPos = point.x;
+ m_fOldPosButton = rcPosButton.left;
+ break;
+ case SBT_VSCROLL:
+ m_nOldPos = point.y;
+ m_fOldPosButton = rcPosButton.top;
+ break;
+ }
+ }
+}
+
+void CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point & point)
+{
+ if (m_bMouseDown)
+ {
+ if (!m_bNotifyForever)
+ NotifyScrollWindow();
+ }
+ m_bMouseDown = FALSE;
+}
+
+void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & point)
+{
+ FX_FLOAT fOldScrollPos = m_sData.fScrollPos;
+
+ FX_FLOAT fNewPos = 0;
+
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+ if (FXSYS_fabs(point.x - m_nOldPos) < 1) return;
+ fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);
+ break;
+ case SBT_VSCROLL:
+ if (FXSYS_fabs(point.y - m_nOldPos) < 1) return;
+ fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);
+ break;
+ }
+
+ if (m_bMouseDown)
+ {
+ switch (m_sbType)
+ {
+ case SBT_HSCROLL:
+
+ if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))
+ {
+ fNewPos = m_sData.ScrollRange.fMin;
+ }
+
+ if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))
+ {
+ fNewPos = m_sData.ScrollRange.fMax;
+ }
+
+ m_sData.SetPos(fNewPos);
+
+ break;
+ case SBT_VSCROLL:
+
+ if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin))
+ {
+ fNewPos = m_sData.ScrollRange.fMin;
+ }
+
+ if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax))
+ {
+ fNewPos = m_sData.ScrollRange.fMax;
+ }
+
+ m_sData.SetPos(fNewPos);
+
+ break;
+ }
+
+ if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos))
+ {
+ MovePosButton(TRUE);
+
+ if (m_bNotifyForever)
+ NotifyScrollWindow();
+ }
+ }
+}
+
+void CPWL_ScrollBar::NotifyScrollWindow()
+{
+ if (CPWL_Wnd * pParent = this->GetParentWindow())
+ {
+ FX_FLOAT fPos;
+ switch (this->m_sbType)
+ {
+ case SBT_HSCROLL:
+ fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;
+ break;
+ case SBT_VSCROLL:
+ fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;
+ break;
+ }
+ pParent->OnNotify(this,PNM_SCROLLWINDOW,(FX_INTPTR)m_sbType,(FX_INTPTR)&fPos);
+ }
+}
+
+CPDF_Rect CPWL_ScrollBar::GetScrollArea() const
+{
+ CPDF_Rect rcClient = GetClientRect();
+ CPDF_Rect rcArea;
+
+ if (!m_pMinButton || !m_pMaxButton)return rcClient;
+
+ CPDF_Rect rcMin = m_pMinButton->GetWindowRect();
+ CPDF_Rect rcMax = m_pMaxButton->GetWindowRect();
+
+ FX_FLOAT fMinWidth = rcMin.right - rcMin.left;
+ FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;
+ FX_FLOAT fMaxWidth = rcMax.right - rcMax.left;
+ FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;
+
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2)
+ {
+ rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,
+ rcClient.right - fMaxWidth - 1,rcClient.top);
+ }
+ else
+ {
+ rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClient.bottom,
+ rcClient.left + fMinWidth + 1,rcClient.top);
+ }
+ break;
+ case SBT_VSCROLL:
+ if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2)
+ {
+ rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,
+ rcClient.right,rcClient.top - fMaxHeight - 1);
+ }
+ else
+ {
+ rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinHeight + 1,
+ rcClient.right,rcClient.bottom + fMinHeight + 1);
+ }
+ break;
+ }
+
+ rcArea.Normalize();
+
+ return rcArea;
+}
+
+FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue)
+{
+ CPDF_Rect rcPosArea;
+ rcPosArea = GetScrollArea();
+
+ FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
+ fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
+
+ FX_FLOAT fFace = 0;
+
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ fFace = rcPosArea.left + fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;
+ break;
+ case SBT_VSCROLL:
+ fFace = rcPosArea.top - fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;
+ break;
+ }
+
+ return fFace;
+}
+
+FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace)
+{
+ CPDF_Rect rcPosArea;
+ rcPosArea = GetScrollArea();
+
+ FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
+ fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
+
+ FX_FLOAT fTrue = 0;
+
+ switch(m_sbType)
+ {
+ case SBT_HSCROLL:
+ fTrue = (fFace - rcPosArea.left) * fFactWidth / (rcPosArea.right - rcPosArea.left);
+ break;
+ case SBT_VSCROLL:
+ fTrue = (rcPosArea.top - fFace) * fFactWidth / (rcPosArea.top - rcPosArea.bottom);
+ break;
+ }
+
+ return fTrue;
+}
+
+void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ CreateButtons(cp);
+}
+
+void CPWL_ScrollBar::TimerProc()
+{
+ PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
+
+ if (m_bMinOrMax)m_sData.SubSmall();
+ else m_sData.AddSmall();
+
+ if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0)
+ {
+ MovePosButton(TRUE);
+ NotifyScrollWindow();
+ }
+}
+
+/*
+void CPWL_ScrollBar::OnSetFocus()
+{
+ if (GetTransparency() != 255)
+ {
+ SetTransparency(255);
+ InvalidateRect();
+ }
+}
+
+void CPWL_ScrollBar::OnKillFocus()
+{
+ if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY)
+ {
+ SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
+ InvalidateRect();
+ }
+}
+*/
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Signature.cpp b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp
new file mode 100644
index 0000000000..36297f3d92
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Signature.cpp
@@ -0,0 +1,220 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Icon.h"
+#include "../../include/pdfwindow/PWL_Signature.h"
+#include "../../include/pdfwindow/PWL_Label.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* --------------------------------- CPWL_Signature_Image --------------------------------- */
+
+CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(NULL)
+{
+}
+
+CPWL_Signature_Image::~CPWL_Signature_Image()
+{
+}
+
+void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage)
+{
+ m_pImage = pImage;
+}
+
+CFX_DIBSource* CPWL_Signature_Image::GetImage()
+{
+ return m_pImage;
+}
+
+void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
+
+ if (m_pImage)
+ {
+ CPDF_Rect rcClient = GetClientRect();
+
+ FX_FLOAT x, y;
+ pUser2Device->Transform(rcClient.left, rcClient.top, x, y);
+
+ pDevice->StretchDIBits(m_pImage, (FX_INT32)x, (FX_INT32)y,
+ (FX_INT32)rcClient.Width(), (FX_INT32)rcClient.Height());
+ }
+}
+
+void CPWL_Signature_Image::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ sAppStream << CPWL_Image::GetImageAppStream();
+}
+
+void CPWL_Signature_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
+{
+ FX_FLOAT fImageW, fImageH;
+
+ GetImageSize(fImageW, fImageH);
+
+ CPDF_Rect rcClient = GetClientRect();
+
+ fHScale = rcClient.Width() / fImageW;
+ fVScale = rcClient.Height() / fImageH;
+}
+
+/* --------------------------------- CPWL_Signature --------------------------------- */
+
+CPWL_Signature::CPWL_Signature() :
+ m_pText(NULL),
+ m_pDescription(NULL),
+ m_pImage(NULL),
+ m_bTextExist(TRUE),
+ m_bImageExist(FALSE),
+ m_bFlagExist(TRUE)
+{
+}
+
+CPWL_Signature::~CPWL_Signature()
+{
+}
+
+void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist)
+{
+ m_bTextExist = bTextExist;
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist)
+{
+ m_bImageExist = bImageExist;
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist)
+{
+ m_bFlagExist = bFlagExist;
+}
+
+void CPWL_Signature::SetText(FX_LPCWSTR sText)
+{
+ m_pText->SetText(sText);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetDescription(FX_LPCWSTR string)
+{
+ m_pDescription->SetText(string);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetImage(CFX_DIBSource* pImage)
+{
+ m_pImage->SetImage(pImage);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::SetImageStream(CPDF_Stream * pStream, FX_LPCSTR sImageAlias)
+{
+ m_pImage->SetPDFStream(pStream);
+ m_pImage->SetImageAlias(sImageAlias);
+
+ RePosChildWnd();
+}
+
+void CPWL_Signature::RePosChildWnd()
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ CPDF_Rect rcText = rcClient;
+ CPDF_Rect rcDescription = rcClient;
+
+ FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0;
+
+ if ((bTextVisible || m_bImageExist) &&
+ m_pDescription->GetText().GetLength() > 0)
+ {
+ if (rcClient.Width() >= rcClient.Height())
+ {
+ rcText.right = rcText.left + rcClient.Width() / 2.0f;
+ rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f;
+ }
+ else
+ {
+ rcText.bottom = rcText.top - rcClient.Height() / 2.0f;
+ rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f;
+ }
+ }
+
+ m_pText->SetVisible(bTextVisible);
+ m_pImage->SetVisible(m_bImageExist);
+
+ m_pText->Move(rcText, TRUE, FALSE);
+ m_pImage->Move(rcText, TRUE, FALSE);
+ m_pDescription->Move(rcDescription, TRUE, FALSE);
+}
+
+void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+ m_pImage = new CPWL_Signature_Image;
+ PWL_CREATEPARAM icp = cp;
+ icp.pParentWnd = this;
+ icp.dwFlags = PWS_CHILD | PWS_VISIBLE;
+ icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
+ m_pImage->Create(icp);
+
+ m_pText = new CPWL_Label;
+ PWL_CREATEPARAM acp = cp;
+ acp.pParentWnd = this;
+ acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_MIDDLE | PES_CENTER;
+ acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
+ m_pText->Create(acp);
+
+ m_pDescription = new CPWL_Label;
+ PWL_CREATEPARAM dcp = cp;
+ dcp.pParentWnd = this;
+ dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE | PES_AUTORETURN | PES_LEFT | PES_CENTER;
+ dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
+ m_pDescription->Create(dcp);
+}
+
+void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
+
+ if (m_bFlagExist)
+ CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, PWL_ICONTYPE_FOXIT, CPWL_Utils::GetCenterSquare(GetClientRect()),
+ CPWL_Color(COLORTYPE_RGB,0.91f,0.855f,0.92f), CPWL_Color(COLORTYPE_TRANSPARENT), 255);
+
+ /*
+ CPDF_Rect rcClient = GetClientRect();
+
+ CFX_PathData path;
+
+ path.SetPointCount(2);
+ path.SetPoint(0, rcClient.left, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_MOVETO);
+ path.SetPoint(1, rcClient.right, (rcClient.top + rcClient.bottom) * 0.5f, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.SetDashCount(2);
+ gsd.m_DashArray[0] = 6.0f;
+ gsd.m_DashArray[1] = 6.0f;
+ gsd.m_DashPhase = 0;
+
+ gsd.m_LineWidth = 10.0f;
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,255,0,0), FXFILL_ALTERNATE);
+ */
+}
+
+void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPWL_Wnd::GetThisAppearanceStream(sAppStream);
+}
+
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp
new file mode 100644
index 0000000000..aabf503f98
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp
@@ -0,0 +1,110 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Button.h"
+#include "../../include/pdfwindow/PWL_SpecialButton.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+
+/* --------------------------- CPWL_PushButton ---------------------------- */
+
+CPWL_PushButton::CPWL_PushButton()
+{
+}
+
+CPWL_PushButton::~CPWL_PushButton()
+{
+}
+
+CFX_ByteString CPWL_PushButton::GetClassName() const
+{
+ return "CPWL_PushButton";
+}
+
+CPDF_Rect CPWL_PushButton::GetFocusRect() const
+{
+ return CPWL_Utils::DeflateRect(this->GetWindowRect(),(FX_FLOAT)GetBorderWidth());
+}
+
+/* --------------------------- CPWL_CheckBox ---------------------------- */
+
+CPWL_CheckBox::CPWL_CheckBox() : m_bChecked(FALSE)
+{
+}
+
+CPWL_CheckBox::~CPWL_CheckBox()
+{
+}
+
+CFX_ByteString CPWL_CheckBox::GetClassName() const
+{
+ return "CPWL_CheckBox";
+}
+
+void CPWL_CheckBox::SetCheck(FX_BOOL bCheck)
+{
+ m_bChecked = bCheck;
+}
+
+FX_BOOL CPWL_CheckBox::IsChecked() const
+{
+ return m_bChecked;
+}
+
+FX_BOOL CPWL_CheckBox::OnLButtonUp(const CPDF_Point & point)
+{
+ if (IsReadOnly()) return FALSE;
+
+ SetCheck(!IsChecked());
+ return TRUE;
+}
+
+FX_BOOL CPWL_CheckBox::OnChar(FX_WORD nChar)
+{
+ SetCheck(!IsChecked());
+ return TRUE;
+}
+
+/* --------------------------- CPWL_RadioButton ---------------------------- */
+
+CPWL_RadioButton::CPWL_RadioButton() : m_bChecked(FALSE)
+{
+}
+
+CPWL_RadioButton::~CPWL_RadioButton()
+{
+}
+
+CFX_ByteString CPWL_RadioButton::GetClassName() const
+{
+ return "CPWL_RadioButton";
+}
+
+FX_BOOL CPWL_RadioButton::OnLButtonUp(const CPDF_Point & point)
+{
+ if (IsReadOnly()) return FALSE;
+
+ SetCheck(TRUE);
+ return TRUE;
+}
+
+void CPWL_RadioButton::SetCheck(FX_BOOL bCheck)
+{
+ m_bChecked = bCheck;
+}
+
+FX_BOOL CPWL_RadioButton::IsChecked() const
+{
+ return m_bChecked;
+}
+
+FX_BOOL CPWL_RadioButton::OnChar(FX_WORD nChar)
+{
+ SetCheck(TRUE);
+ return TRUE;
+}
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Utils.cpp b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp
new file mode 100644
index 0000000000..aec1d4db45
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Utils.cpp
@@ -0,0 +1,2844 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_Icon.h"
+
+#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
+#define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
+#define IsFloatEqual(fa,fb) IsFloatZero((fa)-(fb))
+
+/* ---------------------------- CPWL_Utils ------------------------------ */
+
+CFX_ByteString CPWL_Utils::GetAppStreamFromArray(const CPWL_PathData* pPathData, FX_INT32 nCount)
+{
+ CFX_ByteTextBuf csAP;
+
+ for (FX_INT32 i=0; i<nCount; i++)
+ {
+ switch (pPathData[i].type)
+ {
+ case PWLPT_MOVETO:
+ csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " m\n";
+ break;
+ case PWLPT_LINETO:
+ csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " l\n";
+ break;
+ case PWLPT_BEZIERTO:
+ csAP << pPathData[i].point.x << " " << pPathData[i].point.y << " "
+ << pPathData[i+1].point.x << " " << pPathData[i+1].point.y << " "
+ << pPathData[i+2].point.x << " " << pPathData[i+2].point.y << " c\n";
+
+ i += 2;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return csAP.GetByteString();
+}
+
+void CPWL_Utils::GetPathDataFromArray(CFX_PathData& path, const CPWL_PathData* pPathData, FX_INT32 nCount)
+{
+ path.SetPointCount(nCount);
+
+ for (FX_INT32 i=0; i<nCount; i++)
+ {
+ switch (pPathData[i].type)
+ {
+ case PWLPT_MOVETO:
+ path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_MOVETO);
+ break;
+ case PWLPT_LINETO:
+ path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_LINETO);
+ break;
+ case PWLPT_BEZIERTO:
+ path.SetPoint(i, pPathData[i].point.x, pPathData[i].point.y, FXPT_BEZIERTO);
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+
+CPDF_Rect CPWL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
+{
+ CPDF_Rect rcRet;
+
+ rcRet.left = PWL_MIN(rect1.left,rect2.left);
+ rcRet.bottom = PWL_MIN(rect1.bottom,rect2.bottom);
+ rcRet.right = PWL_MAX(rect1.right,rect2.right);
+ rcRet.top = PWL_MAX(rect1.top,rect2.top);
+
+ return rcRet;
+}
+
+CPDF_Rect CPWL_Utils::OffsetRect(const CPDF_Rect & rect,FX_FLOAT x,FX_FLOAT y)
+{
+ return CPDF_Rect(rect.left + x,rect.bottom + y,
+ rect.right + x,rect.top + y);
+}
+
+FX_BOOL CPWL_Utils::ContainsRect(const CPDF_Rect& rcParent, const CPDF_Rect& rcChild)
+{
+ return rcChild.left >= rcParent.left && rcChild.bottom >= rcParent.bottom &&
+ rcChild.right <= rcParent.right && rcChild.top <= rcParent.top;
+}
+
+FX_BOOL CPWL_Utils::IntersectRect(const CPDF_Rect& rect1, const CPDF_Rect& rect2)
+{
+ FX_FLOAT left = rect1.left > rect2.left ? rect1.left : rect2.left;
+ FX_FLOAT right = rect1.right < rect2.right ? rect1.right : rect2.right;
+ FX_FLOAT bottom = rect1.bottom > rect2.bottom ? rect1.bottom : rect2.bottom;
+ FX_FLOAT top = rect1.top < rect2.top ? rect1.top : rect2.top;
+
+ return left < right && bottom < top;
+}
+
+CPDF_Point CPWL_Utils::OffsetPoint(const CPDF_Point& point,FX_FLOAT x,FX_FLOAT y)
+{
+ return CPDF_Point(point.x + x,point.y + y);
+}
+
+CPVT_WordRange CPWL_Utils::OverlapWordRange(const CPVT_WordRange & wr1, const CPVT_WordRange & wr2)
+{
+ CPVT_WordRange wrRet;
+
+ if (wr2.EndPos.WordCmp(wr1.BeginPos) < 0 || wr2.BeginPos.WordCmp(wr1.EndPos) > 0) return wrRet;
+ if (wr1.EndPos.WordCmp(wr2.BeginPos) < 0 || wr1.BeginPos.WordCmp(wr2.EndPos) > 0) return wrRet;
+
+ if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
+ {
+ wrRet.BeginPos = wr2.BeginPos;
+ }
+ else
+ {
+ wrRet.BeginPos = wr1.BeginPos;
+ }
+
+ if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
+ {
+ wrRet.EndPos = wr1.EndPos;
+ }
+ else
+ {
+ wrRet.EndPos = wr2.EndPos;
+ }
+
+ return wrRet;
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Check(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ const FX_INT32 num = 8;
+
+ CPWL_Point pts[num*3] =
+ {
+ //1
+ CPWL_Point(0.28f, 0.52f),
+ CPWL_Point(0.27f, 0.48f),
+ CPWL_Point(0.29f, 0.40f),
+
+ //2
+ CPWL_Point(0.30f, 0.33f),
+ CPWL_Point(0.31f, 0.29f),
+ CPWL_Point(0.31f, 0.28f),
+
+ //3
+ CPWL_Point(0.39f, 0.28f),
+ CPWL_Point(0.49f, 0.29f),
+ CPWL_Point(0.77f, 0.67f),
+
+ //4
+ CPWL_Point(0.76f, 0.68f),
+ CPWL_Point(0.78f, 0.69f),
+ CPWL_Point(0.76f, 0.75f),
+
+ //5
+ CPWL_Point(0.76f, 0.75f),
+ CPWL_Point(0.73f, 0.80f),
+ CPWL_Point(0.68f, 0.75f),
+
+ //6
+ CPWL_Point(0.68f, 0.74f),
+ CPWL_Point(0.68f, 0.74f),
+ CPWL_Point(0.44f, 0.47f),
+
+ //7
+ CPWL_Point(0.43f, 0.47f),
+ CPWL_Point(0.40f, 0.47f),
+ CPWL_Point(0.41f, 0.58f),
+
+ //8
+ CPWL_Point(0.40f, 0.60f),
+ CPWL_Point(0.28f, 0.66f),
+ CPWL_Point(0.30f, 0.56f)
+ };
+
+ for (FX_INT32 j=0; j<num*3; j++)
+ {
+ pts[j].x *= fWidth;
+ pts[j].x += crBBox.left;
+
+ pts[j].y *= fHeight;
+ pts[j].y += crBBox.bottom;
+ }
+
+ csAP << pts[0].x << " " << pts[0].y << " m\n";
+
+ for (FX_INT32 i=0; i<num; i++)
+ {
+ FX_INT32 nCur = i*3;
+ FX_INT32 n1 = i*3 + 1;
+ FX_INT32 n2 = i*3 + 2;
+ FX_INT32 nNext = (i < num-1 ? (i+1)*3 : 0);
+
+ FX_FLOAT px1 = pts[n1].x - pts[nCur].x;
+ FX_FLOAT py1 = pts[n1].y - pts[nCur].y;
+ FX_FLOAT px2 = pts[n2].x - pts[nNext].x;
+ FX_FLOAT py2 = pts[n2].y - pts[nNext].y;
+
+ csAP << pts[nCur].x + px1 * PWL_BEZIER << " " << pts[nCur].y + py1 * PWL_BEZIER << " "
+ << pts[nNext].x + px2 * PWL_BEZIER << " " << pts[nNext].y + py2 * PWL_BEZIER << " "
+ << pts[nNext].x << " " << pts[nNext].y << " c\n";
+ }
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Circle(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
+ CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
+
+ csAP << pt1.x << " " << pt1.y << " m\n";
+
+ FX_FLOAT px = pt2.x - pt1.x;
+ FX_FLOAT py = pt2.y - pt1.y;
+
+ csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
+ << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
+ << pt2.x << " " << pt2.y << " c\n";
+
+ px = pt3.x - pt2.x;
+ py = pt2.y - pt3.y;
+
+ csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
+ << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
+ << pt3.x << " " << pt3.y << " c\n";
+
+ px = pt3.x - pt4.x;
+ py = pt3.y - pt4.y;
+
+ csAP << pt3.x << " " << pt3.y - py * PWL_BEZIER << " "
+ << pt4.x + px * PWL_BEZIER << " " << pt4.y << " "
+ << pt4.x << " " << pt4.y << " c\n";
+
+ px = pt4.x - pt1.x;
+ py = pt1.y - pt4.y;
+
+ csAP << pt4.x - px * PWL_BEZIER << " " << pt4.y << " "
+ << pt1.x << " " << pt1.y - py * PWL_BEZIER << " "
+ << pt1.x << " " << pt1.y << " c\n";
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Cross(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ csAP << crBBox.left << " " << crBBox.top << " m\n";
+ csAP << crBBox.right << " " << crBBox.bottom << " l\n";
+ csAP << crBBox.left << " " << crBBox.bottom << " m\n";
+ csAP << crBBox.right << " " << crBBox.top << " l\n";
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Diamond(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(crBBox.left,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt2(crBBox.left + fWidth / 2,crBBox.top);
+ CPDF_Point pt3(crBBox.right,crBBox.bottom + fHeight / 2);
+ CPDF_Point pt4(crBBox.left + fWidth / 2,crBBox.bottom);
+
+ csAP << pt1.x << " " << pt1.y << " m\n";
+ csAP << pt2.x << " " << pt2.y << " l\n";
+ csAP << pt3.x << " " << pt3.y << " l\n";
+ csAP << pt4.x << " " << pt4.y << " l\n";
+ csAP << pt1.x << " " << pt1.y << " l\n";
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Square(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ csAP << crBBox.left << " " << crBBox.top << " m\n";
+ csAP << crBBox.right << " " << crBBox.top << " l\n";
+ csAP << crBBox.right << " " << crBBox.bottom << " l\n";
+ csAP << crBBox.left << " " << crBBox.bottom << " l\n";
+ csAP << crBBox.left << " " << crBBox.top << " l\n";
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_Star(const CPDF_Rect & crBBox)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
+ CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
+
+ FX_FLOAT px[5],py[5];
+
+ FX_FLOAT fAngel = PWL_PI/10.0f;
+
+ for (FX_INT32 i=0; i<5; i++)
+ {
+ px[i] = ptCenter.x + fRadius * (FX_FLOAT)cos(fAngel);
+ py[i] = ptCenter.y + fRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_PI * 2 / 5.0f;
+ }
+
+ csAP << px[0] << " " << py[0] << " m\n";
+
+ FX_INT32 nNext = 0;
+ for (FX_INT32 j=0; j<5; j++)
+ {
+ nNext += 2;
+ if (nNext >= 5) nNext -= 5;
+ csAP << px[nNext] << " " << py[nNext] << " l\n";
+ }
+
+ return csAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAP_HalfCircle(const CPDF_Rect & crBBox,FX_FLOAT fRotate)
+{
+ CFX_ByteTextBuf csAP;
+
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Point pt1(-fWidth/2,0);
+ CPDF_Point pt2(0,fHeight/2);
+ CPDF_Point pt3(fWidth/2,0);
+
+ FX_FLOAT px,py;
+
+ csAP << cos(fRotate) << " " << sin(fRotate) << " " << -sin(fRotate) << " " << cos(fRotate) << " "
+ << crBBox.left + fWidth / 2 << " " << crBBox.bottom + fHeight / 2 << " cm\n";
+
+
+ csAP << pt1.x << " " << pt1.y << " m\n";
+
+ px = pt2.x - pt1.x;
+ py = pt2.y - pt1.y;
+
+ csAP << pt1.x << " " << pt1.y + py * PWL_BEZIER << " "
+ << pt2.x - px * PWL_BEZIER << " " << pt2.y << " "
+ << pt2.x << " " << pt2.y << " c\n";
+
+ px = pt3.x - pt2.x;
+ py = pt2.y - pt3.y;
+
+ csAP << pt2.x + px * PWL_BEZIER << " " << pt2.y << " "
+ << pt3.x << " " << pt3.y + py * PWL_BEZIER << " "
+ << pt3.x << " " << pt3.y << " c\n";
+
+ return csAP.GetByteString();
+}
+
+
+CPDF_Rect CPWL_Utils::InflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
+{
+ if (rcRect.IsEmpty()) return rcRect;
+
+ CPDF_Rect rcNew(rcRect.left - fSize,
+ rcRect.bottom - fSize,
+ rcRect.right + fSize,
+ rcRect.top + fSize);
+ rcNew.Normalize();
+ return rcNew;
+}
+
+CPDF_Rect CPWL_Utils::DeflateRect(const CPDF_Rect & rcRect, FX_FLOAT fSize)
+{
+ if (rcRect.IsEmpty()) return rcRect;
+
+ CPDF_Rect rcNew(rcRect.left + fSize,
+ rcRect.bottom + fSize,
+ rcRect.right - fSize,
+ rcRect.top - fSize);
+ rcNew.Normalize();
+ return rcNew;
+}
+
+CPDF_Rect CPWL_Utils::ScaleRect(const CPDF_Rect & rcRect,FX_FLOAT fScale)
+{
+ FX_FLOAT fHalfWidth = (rcRect.right - rcRect.left) / 2.0f;
+ FX_FLOAT fHalfHeight = (rcRect.top - rcRect.bottom) / 2.0f;
+
+ CPDF_Point ptCenter = CPDF_Point((rcRect.left + rcRect.right) / 2,(rcRect.top + rcRect.bottom) / 2);
+
+ return CPDF_Rect(ptCenter.x - fHalfWidth * fScale,
+ ptCenter.y - fHalfHeight * fScale,
+ ptCenter.x + fHalfWidth * fScale,
+ ptCenter.y + fHalfHeight * fScale);
+}
+
+CFX_ByteString CPWL_Utils::GetRectFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
+{
+ CFX_ByteTextBuf sAppStream;
+
+ CFX_ByteString sColor = GetColorAppStream(color,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << sColor;
+ sAppStream << rect.left << " " << rect.bottom << " "
+ << rect.right - rect.left << " " << rect.top - rect.bottom << " re f\nQ\n";
+ }
+
+ return sAppStream.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetCircleFillAppStream(const CPDF_Rect & rect,const CPWL_Color & color)
+{
+ CFX_ByteTextBuf sAppStream;
+
+ CFX_ByteString sColor = GetColorAppStream(color,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << sColor << CPWL_Utils::GetAP_Circle(rect) << "f\nQ\n";
+ }
+
+ return sAppStream.GetByteString();
+}
+
+CPDF_Rect CPWL_Utils::GetCenterSquare(const CPDF_Rect & rect)
+{
+ FX_FLOAT fWidth = rect.right - rect.left;
+ FX_FLOAT fHeight = rect.top - rect.bottom;
+
+ FX_FLOAT fCenterX = (rect.left + rect.right)/2.0f;
+ FX_FLOAT fCenterY = (rect.top + rect.bottom)/2.0f;
+
+ FX_FLOAT fRadius = (fWidth > fHeight) ? fHeight / 2 : fWidth / 2;
+
+ return CPDF_Rect(fCenterX - fRadius,fCenterY - fRadius,fCenterX + fRadius,fCenterY + fRadius);
+}
+
+CFX_ByteString CPWL_Utils::GetEditAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset, const CPVT_WordRange * pRange,
+ FX_BOOL bContinuous, FX_WORD SubWord)
+{
+ return IFX_Edit::GetEditAppearanceStream(pEdit,ptOffset,pRange,bContinuous,SubWord);
+}
+
+CFX_ByteString CPWL_Utils::GetEditSelAppStream(IFX_Edit* pEdit, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange)
+{
+ return IFX_Edit::GetSelectAppearanceStream(pEdit,ptOffset,pRange);
+}
+
+static CFX_ByteString GetSquigglyAppearanceStream(FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
+{
+ CFX_ByteTextBuf sRet;
+
+ sRet << "0 w\n" << fStartX << " " << fY << " m\n";
+
+ FX_FLOAT fx;
+ FX_INT32 i;
+
+ for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
+ {
+ sRet << fx << " " << fY + (i&1)*fStep << " l\n";
+ }
+
+ sRet << "S\n";
+
+ return sRet.GetByteString();
+}
+
+static CFX_ByteString GetWordSpellCheckAppearanceStream(IFX_Edit_Iterator* pIterator, const CPDF_Point & ptOffset,
+ const CPVT_WordRange & wrWord)
+{
+ CFX_ByteTextBuf sRet;
+
+ FX_FLOAT fStartX = 0.0f;
+ FX_FLOAT fEndX = 0.0f;
+ FX_FLOAT fY = 0.0f;
+ FX_FLOAT fStep = 0.0f;
+
+ FX_BOOL bBreak = FALSE;
+
+ if (pIterator)
+ {
+ pIterator->SetAt(wrWord.BeginPos);
+
+ do
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+
+ CPVT_Line line;
+ if (pIterator->GetLine(line))
+ {
+ fY = line.ptLine.y;
+ fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
+ }
+
+ if (place.LineCmp(wrWord.BeginPos) == 0)
+ {
+ pIterator->SetAt(wrWord.BeginPos);
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ fStartX = word.ptWord.x;
+ }
+ }
+ else
+ {
+ fStartX = line.ptLine.x;
+ }
+
+ if (place.LineCmp(wrWord.EndPos) == 0)
+ {
+ pIterator->SetAt(wrWord.EndPos);
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ fEndX = word.ptWord.x + word.fWidth;
+ }
+
+ bBreak = TRUE;
+ }
+ else
+ {
+ fEndX = line.ptLine.x + line.fLineWidth;
+ }
+
+ sRet << GetSquigglyAppearanceStream(fStartX + ptOffset.x, fEndX + ptOffset.x, fY + ptOffset.y,fStep);
+
+ if (bBreak) break;
+ }
+ while (pIterator->NextLine());
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetSpellCheckAppStream(IFX_Edit* pEdit, IPWL_SpellCheck* pSpellCheck, const CPDF_Point & ptOffset,
+ const CPVT_WordRange * pRange)
+{
+ ASSERT(pEdit != NULL);
+ ASSERT(pSpellCheck != NULL);
+
+ CFX_ByteTextBuf sRet;
+
+ if (pRange && pRange->IsExist())
+ {
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ pIterator->SetAt(pRange->BeginPos);
+
+ FX_BOOL bLatinWord = FALSE;
+ CPVT_WordPlace wpWordStart;
+ CFX_ByteString sWord;
+
+ CPVT_WordPlace oldplace;
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ if (FX_EDIT_ISLATINWORD(word.Word))
+ {
+ if (!bLatinWord)
+ {
+ wpWordStart = place;
+ bLatinWord = TRUE;
+ }
+
+ sWord += (char)word.Word;
+ oldplace = place;
+ }
+ else
+ {
+ if (bLatinWord)
+ {
+ if (!pSpellCheck->CheckWord(sWord))
+ {
+ sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
+ pIterator->SetAt(place);
+ }
+ bLatinWord = FALSE;
+ }
+
+ sWord.Empty();
+ }
+ }
+ else
+ {
+ if (bLatinWord)
+ {
+ if (!pSpellCheck->CheckWord(sWord))
+ sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
+ bLatinWord = FALSE;
+ sWord.Empty();
+ }
+ }
+ }
+
+ if (bLatinWord)
+ {
+ if (!pSpellCheck->CheckWord(sWord))
+ sRet << GetWordSpellCheckAppearanceStream(pIterator,ptOffset,CPVT_WordRange(wpWordStart,oldplace));
+
+ bLatinWord = FALSE;
+ sWord.Empty();
+ }
+ }
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetTextAppStream(const CPDF_Rect & rcBBox,IFX_Edit_FontMap * pFontMap,
+ const CFX_WideString & sText, FX_INT32 nAlignmentH, FX_INT32 nAlignmentV,
+ FX_FLOAT fFontSize, FX_BOOL bMultiLine, FX_BOOL bAutoReturn, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sRet;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->SetFontMap(pFontMap);
+
+ pEdit->SetPlateRect(rcBBox);
+ pEdit->SetAlignmentH(nAlignmentH);
+ pEdit->SetAlignmentV(nAlignmentV);
+ pEdit->SetMultiLine(bMultiLine);
+ pEdit->SetAutoReturn(bAutoReturn);
+ if (IsFloatZero(fFontSize))
+ pEdit->SetAutoFontSize(TRUE);
+ else
+ pEdit->SetFontSize(fFontSize);
+ pEdit->Initialize();
+
+ pEdit->SetText(sText);
+
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit, CPDF_Point(0.0f,0.0f));
+ if (sEdit.GetLength() > 0)
+ {
+ sRet << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
+ }
+
+ IFX_Edit::DelEdit(pEdit);
+ }
+
+ return sRet.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetPushButtonAppStream(const CPDF_Rect & rcBBox,
+ IFX_Edit_FontMap * pFontMap,
+ CPDF_Stream * pIconStream,
+ CPDF_IconFit & IconFit,
+ const CFX_WideString & sLabel,
+ const CPWL_Color & crText,
+ FX_FLOAT fFontSize,
+ FX_INT32 nLayOut)
+{
+ const FX_FLOAT fAutoFontScale = 1.0f / 3.0f;
+
+ if (IFX_Edit * pEdit = IFX_Edit::NewEdit())
+ {
+ pEdit->SetFontMap(pFontMap);
+
+ pEdit->SetAlignmentH(1);
+ pEdit->SetAlignmentV(1);
+ pEdit->SetMultiLine(FALSE);
+ pEdit->SetAutoReturn(FALSE);
+ if (IsFloatZero(fFontSize))
+ pEdit->SetAutoFontSize(TRUE);
+ else
+ pEdit->SetFontSize(fFontSize);
+ pEdit->Initialize();
+ pEdit->SetText(sLabel);
+
+ CPDF_Rect rcLabelContent = pEdit->GetContentRect();
+
+ CPWL_Icon Icon;
+ PWL_CREATEPARAM cp;
+ cp.dwFlags = PWS_VISIBLE;
+ Icon.Create(cp);
+ Icon.SetIconFit(&IconFit);
+ Icon.SetPDFStream(pIconStream);
+
+ CPDF_Rect rcLabel = CPDF_Rect(0,0,0,0);
+ CPDF_Rect rcIcon = CPDF_Rect(0,0,0,0);
+ FX_FLOAT fWidth = 0.0f;
+ FX_FLOAT fHeight = 0.0f;
+
+ switch (nLayOut)
+ {
+ case PPBL_LABEL:
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ break;
+ case PPBL_ICON:
+ rcIcon = rcBBox;
+ rcLabel = CPDF_Rect(0,0,0,0);
+ break;
+ case PPBL_ICONTOPLABELBOTTOM:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fHeight = rcBBox.top - rcBBox.bottom;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight * fAutoFontScale);
+ rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
+ }
+ else
+ {
+ fHeight = rcLabelContent.Height();
+
+ if (rcBBox.bottom + fHeight > rcBBox.top)
+ {
+ rcIcon = CPDF_Rect(0,0,0,0);
+ rcLabel = rcBBox;
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcBBox.bottom + fHeight);
+ rcIcon = CPDF_Rect(rcBBox.left,rcLabel.top,rcBBox.right,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_LABELTOPICONBOTTOM:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fHeight = rcBBox.top - rcBBox.bottom;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight * fAutoFontScale ,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
+ }
+ else
+ {
+ fHeight = rcLabelContent.Height();
+
+ if (rcBBox.bottom + fHeight > rcBBox.top)
+ {
+ rcIcon = CPDF_Rect(0,0,0,0);
+ rcLabel = rcBBox;
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.top - fHeight,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.right,rcLabel.bottom);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_ICONLEFTLABELRIGHT:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fWidth = rcBBox.right - rcBBox.left;
+ rcLabel = CPDF_Rect(rcBBox.right - fWidth * fAutoFontScale,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+
+ if (rcLabelContent.Width() < fWidth * fAutoFontScale)
+ {
+ }
+ else
+ {
+ if (rcLabelContent.Width() < fWidth)
+ {
+ rcLabel = CPDF_Rect(rcBBox.right - rcLabelContent.Width(),rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ }
+ }
+ else
+ {
+ fWidth = rcLabelContent.Width();
+
+ if (rcBBox.left + fWidth > rcBBox.right)
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.right - fWidth,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ rcIcon = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcLabel.left,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_LABELLEFTICONRIGHT:
+
+ if (pIconStream)
+ {
+ if (IsFloatZero(fFontSize))
+ {
+ fWidth = rcBBox.right - rcBBox.left;
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth * fAutoFontScale,rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+
+ if (rcLabelContent.Width() < fWidth * fAutoFontScale)
+ {
+ }
+ else
+ {
+ if (rcLabelContent.Width() < fWidth)
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + rcLabelContent.Width(),rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ }
+ }
+ else
+ {
+ fWidth = rcLabelContent.Width();
+
+ if (rcBBox.left + fWidth > rcBBox.right)
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+ else
+ {
+ rcLabel = CPDF_Rect(rcBBox.left,rcBBox.bottom,rcBBox.left + fWidth,rcBBox.top);
+ rcIcon = CPDF_Rect(rcLabel.right,rcBBox.bottom,rcBBox.right,rcBBox.top);
+ }
+ }
+ }
+ else
+ {
+ rcLabel = rcBBox;
+ rcIcon = CPDF_Rect(0,0,0,0);
+ }
+
+ break;
+ case PPBL_LABELOVERICON:
+ rcLabel = rcBBox;
+ rcIcon = rcBBox;
+ break;
+ }
+
+ CFX_ByteTextBuf sAppStream,sTemp;
+
+ if (!rcIcon.IsEmpty())
+ {
+ Icon.Move(rcIcon, FALSE, FALSE);
+ sTemp << Icon.GetImageAppStream();
+ }
+
+ Icon.Destroy();
+
+ if (!rcLabel.IsEmpty())
+ {
+ pEdit->SetPlateRect(rcLabel);
+ CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(pEdit,CPDF_Point(0.0f,0.0f));
+ if (sEdit.GetLength() > 0)
+ {
+ sTemp << "BT\n" << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n";
+ }
+ }
+
+ IFX_Edit::DelEdit(pEdit);
+
+ if (sTemp.GetSize() > 0)
+ {
+ sAppStream << "q\n" << rcBBox.left << " " << rcBBox.bottom << " "
+ << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re W n\n";
+ sAppStream << sTemp << "Q\n";
+ }
+
+ return sAppStream.GetByteString();
+ }
+
+ return "";
+}
+
+CFX_ByteString CPWL_Utils::GetColorAppStream(const CPWL_Color & color,const FX_BOOL & bFillOrStroke)
+{
+ CFX_ByteTextBuf sColorStream;
+
+ switch (color.nColorType)
+ {
+ case COLORTYPE_RGB:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " "
+ << (bFillOrStroke ? "rg" : "RG") << "\n";
+ break;
+ case COLORTYPE_GRAY:
+ sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n";
+ break;
+ case COLORTYPE_CMYK:
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " "
+ << (bFillOrStroke ? "k" : "K") << "\n";
+ break;
+ }
+
+ return sColorStream.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash)
+{
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sColor;
+
+ FX_FLOAT fLeft = rect.left;
+ FX_FLOAT fRight = rect.right;
+ FX_FLOAT fTop = rect.top;
+ FX_FLOAT fBottom = rect.bottom;
+
+ if (fWidth > 0.0f)
+ {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+
+ sAppStream << "q\n";
+
+ switch (nStyle)
+ {
+ default:
+ case PBS_SOLID:
+ sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " "
+ << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n";
+ sAppStream << "f*\n";
+ }
+ break;
+ case PBS_DASH:
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n";
+ sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n";
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ case PBS_BEVELED:
+ case PBS_INSET:
+ sColor = CPWL_Utils::GetColorAppStream(crLeftTop,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n";
+ sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(crRightBottom,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n";
+ sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n";
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n";
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(color,TRUE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n";
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " "
+ << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n";
+ }
+ break;
+ case PBS_UNDERLINED:
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << sColor;
+ sAppStream << fWidth << " w\n";
+ sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n";
+ sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n";
+ }
+ break;
+ }
+
+ sAppStream << "Q\n";
+ }
+
+ return sAppStream.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetCircleBorderAppStream(const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash)
+{
+ CFX_ByteTextBuf sAppStream;
+ CFX_ByteString sColor;
+
+
+
+
+
+
+ if (fWidth > 0.0f)
+ {
+ sAppStream << "q\n";
+
+ switch (nStyle)
+ {
+ default:
+ case PBS_SOLID:
+ case PBS_UNDERLINED:
+ {
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fWidth << " w\n" << sColor
+ << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
+ << " S\nQ\n";
+ }
+ }
+ break;
+ case PBS_DASH:
+ {
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fWidth << " w\n"
+ << "[" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"
+ << sColor << CPWL_Utils::GetAP_Circle(CPWL_Utils::DeflateRect(rect,fWidth / 2.0f))
+ << " S\nQ\n";
+ }
+ }
+ break;
+ case PBS_BEVELED:
+ {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_Circle(rect)
+ << " S\nQ\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
+ << " S\nQ\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
+ << " S\nQ\n";
+ }
+ }
+ break;
+ case PBS_INSET:
+ {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+
+ sColor = CPWL_Utils::GetColorAppStream(color,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_Circle(rect)
+ << " S\nQ\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(crLeftTop,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI/4.0f)
+ << " S\nQ\n";
+ }
+
+ sColor = CPWL_Utils::GetColorAppStream(crRightBottom,FALSE);
+ if (sColor.GetLength() > 0)
+ {
+ sAppStream << "q\n" << fHalfWidth << " w\n"
+ << sColor << CPWL_Utils::GetAP_HalfCircle(CPWL_Utils::DeflateRect(rect,fHalfWidth * 0.75f),PWL_PI*5/4.0f)
+ << " S\nQ\n";
+ }
+ }
+ break;
+ }
+
+ sAppStream << "Q\n";
+ }
+
+ return sAppStream.GetByteString();
+}
+
+CPWL_Color CPWL_Utils::SubstractColor(const CPWL_Color & sColor,FX_FLOAT fColorSub)
+{
+ CPWL_Color sRet;
+ sRet.nColorType = sColor.nColorType;
+
+ switch (sColor.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ sRet.nColorType = COLORTYPE_RGB;
+ sRet.fColor1 = PWL_MAX(1 - fColorSub,0.0f);
+ sRet.fColor2 = PWL_MAX(1 - fColorSub,0.0f);
+ sRet.fColor3 = PWL_MAX(1 - fColorSub,0.0f);
+ break;
+ case COLORTYPE_RGB:
+ case COLORTYPE_GRAY:
+ case COLORTYPE_CMYK:
+ sRet.fColor1 = PWL_MAX(sColor.fColor1 - fColorSub,0.0f);
+ sRet.fColor2 = PWL_MAX(sColor.fColor2 - fColorSub,0.0f);
+ sRet.fColor3 = PWL_MAX(sColor.fColor3 - fColorSub,0.0f);
+ sRet.fColor4 = PWL_MAX(sColor.fColor4 - fColorSub,0.0f);
+ break;
+ }
+
+ return sRet;
+}
+
+CPWL_Color CPWL_Utils::DevideColor(const CPWL_Color & sColor,FX_FLOAT fColorDevide)
+{
+ CPWL_Color sRet;
+ sRet.nColorType = sColor.nColorType;
+
+ switch (sColor.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ sRet.nColorType = COLORTYPE_RGB;
+ sRet.fColor1 = 1 / fColorDevide;
+ sRet.fColor2 = 1 / fColorDevide;
+ sRet.fColor3 = 1 / fColorDevide;
+ break;
+ case COLORTYPE_RGB:
+ case COLORTYPE_GRAY:
+ case COLORTYPE_CMYK:
+ sRet = sColor;
+ sRet.fColor1 /= fColorDevide;
+ sRet.fColor2 /= fColorDevide;
+ sRet.fColor3 /= fColorDevide;
+ sRet.fColor4 /= fColorDevide;
+ break;
+ }
+
+ return sRet;
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Check(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Check(rcBBox) << "f\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Circle(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Circle(rcBBox) << "f\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Cross(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,FALSE) << CPWL_Utils::GetAP_Cross(rcBBox) << "S\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Diamond(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n1 w\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Diamond(rcBBox) << "f\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Square(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Square(rcBBox) << "f\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetAppStream_Star(const CPDF_Rect & rcBBox, const CPWL_Color & crText)
+{
+ CFX_ByteTextBuf sAP;
+ sAP << "q\n" << CPWL_Utils::GetColorAppStream(crText,TRUE) << CPWL_Utils::GetAP_Star(rcBBox) << "f\nQ\n";
+ return sAP.GetByteString();
+}
+
+CFX_ByteString CPWL_Utils::GetCheckBoxAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText)
+{
+ CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
+ switch (nStyle)
+ {
+ default:
+ case PCS_CHECK:
+ return GetAppStream_Check(rcCenter,crText);
+ case PCS_CIRCLE:
+ return GetAppStream_Circle(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ case PCS_CROSS:
+ return GetAppStream_Cross(rcCenter,crText);
+ case PCS_DIAMOND:
+ return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ case PCS_SQUARE:
+ return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ case PCS_STAR:
+ return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ }
+}
+
+CFX_ByteString CPWL_Utils::GetRadioButtonAppStream(const CPDF_Rect & rcBBox,
+ FX_INT32 nStyle,
+ const CPWL_Color & crText)
+{
+ CPDF_Rect rcCenter = GetCenterSquare(rcBBox);
+ switch (nStyle)
+ {
+ default:
+ case PCS_CHECK:
+ return GetAppStream_Check(rcCenter,crText);
+ case PCS_CIRCLE:
+ return GetAppStream_Circle(ScaleRect(rcCenter,1.0f/2.0f),crText);
+ case PCS_CROSS:
+ return GetAppStream_Cross(rcCenter,crText);
+ case PCS_DIAMOND:
+ return GetAppStream_Diamond(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ case PCS_SQUARE:
+ return GetAppStream_Square(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ case PCS_STAR:
+ return GetAppStream_Star(ScaleRect(rcCenter,2.0f/3.0f),crText);
+ }
+}
+
+CFX_ByteString CPWL_Utils::GetDropButtonAppStream(const CPDF_Rect & rcBBox)
+{
+ CFX_ByteTextBuf sAppStream;
+
+ if (!rcBBox.IsEmpty())
+ {
+ sAppStream << "q\n" << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_RGB,220.0f/255.0f,220.0f/255.0f,220.0f/255.0f),TRUE);
+ sAppStream << rcBBox.left << " " << rcBBox.bottom << " "
+ << rcBBox.right - rcBBox.left << " " << rcBBox.top - rcBBox.bottom << " re f\n";
+ sAppStream << "Q\n";
+
+ sAppStream << "q\n" <<
+ CPWL_Utils::GetBorderAppStream(rcBBox,2,CPWL_Color(COLORTYPE_GRAY,0),CPWL_Color(COLORTYPE_GRAY,1),CPWL_Color(COLORTYPE_GRAY,0.5),PBS_BEVELED,CPWL_Dash(3,0,0))
+ << "Q\n";
+
+ CPDF_Point ptCenter = CPDF_Point((rcBBox.left + rcBBox.right)/2,(rcBBox.top + rcBBox.bottom)/2);
+ if (IsFloatBigger(rcBBox.right - rcBBox.left,6) && IsFloatBigger(rcBBox.top - rcBBox.bottom,6))
+ {
+ sAppStream << "q\n" << " 0 g\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n";
+ sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n";
+ sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n";
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n";
+ sAppStream << "Q\n";
+ }
+ }
+
+ return sAppStream.GetByteString();
+}
+
+void CPWL_Utils::ConvertCMYK2GRAY(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dGray)
+{
+ if (dC<0 || dC>1 || dM<0 || dM>1 || dY < 0 || dY >1 || dK < 0 || dK >1)
+ return;
+ dGray = 1.0f - FX_MIN(1.0f,0.3f*dC+0.59f * dM + 0.11f*dY+dK);
+}
+
+void CPWL_Utils::ConvertGRAY2CMYK(FX_FLOAT dGray,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
+{
+ if (dGray <0 || dGray >1)
+ return;
+ dC = 0.0f;
+ dM = 0.0f;
+ dY = 0.0f;
+ dK = 1.0f-dGray;
+}
+
+void CPWL_Utils::ConvertGRAY2RGB(FX_FLOAT dGray,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
+{
+ if (dGray <0 || dGray >1)
+ return;
+ dR = dGray;
+ dG = dGray;
+ dB = dGray;
+}
+
+void CPWL_Utils::ConvertRGB2GRAY(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dGray)
+{
+ if (dR<0 || dR>1 || dG<0 || dG > 0 || dB < 0 || dB >1)
+ return;
+ dGray = 0.3f*dR+0.59f*dG+0.11f*dB;
+}
+
+void CPWL_Utils::ConvertCMYK2RGB(FX_FLOAT dC,FX_FLOAT dM,FX_FLOAT dY,FX_FLOAT dK,FX_FLOAT &dR,FX_FLOAT &dG,FX_FLOAT &dB)
+{
+ if (dC <0 || dC>1 || dM < 0 || dM > 1 || dY < 0 || dY > 1 || dK < 0 || dK > 1 )
+ return;
+ dR = 1.0f - FX_MIN(1.0f, dC + dK);
+ dG = 1.0f - FX_MIN(1.0f, dM + dK);
+ dB = 1.0f - FX_MIN(1.0f, dY + dK);
+}
+
+void CPWL_Utils::ConvertRGB2CMYK(FX_FLOAT dR,FX_FLOAT dG,FX_FLOAT dB,FX_FLOAT &dC,FX_FLOAT &dM,FX_FLOAT &dY,FX_FLOAT &dK)
+{
+ if (dR<0 || dR>1 || dG<0 || dG>1 || dB<0 || dB>1)
+ return;
+
+ dC = 1.0f - dR;
+ dM = 1.0f - dG;
+ dY = 1.0f - dB;
+ dK = FX_MIN(dC, FX_MIN(dM, dY));
+}
+
+void CPWL_Utils::PWLColorToARGB(const CPWL_Color& color, FX_INT32& alpha, FX_FLOAT& red, FX_FLOAT& green, FX_FLOAT& blue)
+{
+ switch (color.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ {
+ alpha = 0;
+ }
+ break;
+ case COLORTYPE_GRAY:
+ {
+ ConvertGRAY2RGB(color.fColor1, red, green, blue);
+ }
+ break;
+ case COLORTYPE_RGB:
+ {
+ red = color.fColor1;
+ green = color.fColor2;
+ blue = color.fColor3;
+ }
+ break;
+ case COLORTYPE_CMYK:
+ {
+ ConvertCMYK2RGB(color.fColor1, color.fColor2, color.fColor3, color.fColor4,
+ red, green, blue);
+ }
+ break;
+ }
+}
+
+FX_COLORREF CPWL_Utils::PWLColorToFXColor(const CPWL_Color& color, FX_INT32 nTransparancy)
+{
+ FX_INT32 nAlpha = nTransparancy;
+ FX_FLOAT dRed = 0;
+ FX_FLOAT dGreen = 0;
+ FX_FLOAT dBlue = 0;
+
+ PWLColorToARGB(color, nAlpha, dRed, dGreen, dBlue);
+
+ return ArgbEncode(nAlpha, (FX_INT32)(dRed*255), (FX_INT32)(dGreen*255), (FX_INT32)(dBlue*255));
+}
+
+void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color)
+{
+ CFX_PathData path;
+ CPDF_Rect rcTemp(rect);
+ path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
+ pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_WINDING);
+}
+
+void CPWL_Utils::DrawFillArea(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point* pPts, FX_INT32 nCount, const FX_COLORREF& color)
+{
+ CFX_PathData path;
+ path.SetPointCount(nCount);
+
+ path.SetPoint(0, pPts[0].x, pPts[0].y, FXPT_MOVETO);
+ for (FX_INT32 i=1; i<nCount; i++)
+ path.SetPoint(i, pPts[i].x, pPts[i].y, FXPT_LINETO);
+
+ pDevice->DrawPath(&path, pUser2Device, NULL, color, 0, FXFILL_ALTERNATE);
+}
+
+void CPWL_Utils::DrawStrokeRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const FX_COLORREF & color, FX_FLOAT fWidth)
+{
+ CFX_PathData path;
+ CPDF_Rect rcTemp(rect);
+ path.AppendRect(rcTemp.left,rcTemp.bottom,rcTemp.right,rcTemp.top);
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = fWidth;
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
+}
+
+void CPWL_Utils::DrawStrokeLine(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Point & ptMoveTo, const CPDF_Point & ptLineTo, const FX_COLORREF & color, FX_FLOAT fWidth)
+{
+ CFX_PathData path;
+ path.SetPointCount(2);
+ path.SetPoint(0, ptMoveTo.x, ptMoveTo.y, FXPT_MOVETO);
+ path.SetPoint(1, ptLineTo.x, ptLineTo.y, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = fWidth;
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, color, FXFILL_ALTERNATE);
+}
+
+void CPWL_Utils::DrawFillRect(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,const CPDF_Rect & rect,
+ const CPWL_Color & color, FX_INT32 nTransparancy)
+{
+ CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rect,PWLColorToFXColor(color,nTransparancy));
+}
+
+void CPWL_Utils::DrawShadow(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_BOOL bVertical, FX_BOOL bHorizontal, CPDF_Rect rect,
+ FX_INT32 nTransparancy, FX_INT32 nStartGray, FX_INT32 nEndGray)
+{
+ FX_FLOAT fStepGray = 1.0f;
+
+ if (bVertical)
+ {
+ fStepGray = (nEndGray - nStartGray) / rect.Height();
+
+ for (FX_FLOAT fy=rect.bottom+0.5f; fy<=rect.top-0.5f; fy+=1.0f)
+ {
+ FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fy-rect.bottom));
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(rect.left, fy),
+ CPDF_Point(rect.right, fy), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
+ }
+ }
+
+ if (bHorizontal)
+ {
+ fStepGray = (nEndGray - nStartGray) / rect.Width();
+
+ for (FX_FLOAT fx=rect.left+0.5f; fx<=rect.right-0.5f; fx+=1.0f)
+ {
+ FX_INT32 nGray = nStartGray + (FX_INT32)(fStepGray * (fx-rect.left));
+ CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, CPDF_Point(fx, rect.bottom),
+ CPDF_Point(fx, rect.top), ArgbEncode(nTransparancy, nGray, nGray, nGray), 1.5f);
+ }
+ }
+}
+
+void CPWL_Utils::DrawBorder(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ const CPDF_Rect & rect, FX_FLOAT fWidth,
+ const CPWL_Color & color, const CPWL_Color & crLeftTop, const CPWL_Color & crRightBottom,
+ FX_INT32 nStyle, const CPWL_Dash & dash, FX_INT32 nTransparancy)
+{
+ FX_FLOAT fLeft = rect.left;
+ FX_FLOAT fRight = rect.right;
+ FX_FLOAT fTop = rect.top;
+ FX_FLOAT fBottom = rect.bottom;
+
+ if (fWidth > 0.0f)
+ {
+ FX_FLOAT fHalfWidth = fWidth / 2.0f;
+
+ switch (nStyle)
+ {
+ default:
+ case PBS_SOLID:
+ {
+ CFX_PathData path;
+ path.AppendRect(fLeft, fBottom, fRight, fTop);
+ path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
+ pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
+ }
+ break;
+ case PBS_DASH:
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(5);
+ path.SetPoint(0, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_MOVETO);
+ path.SetPoint(1, fLeft + fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
+ path.SetPoint(2, fRight - fWidth / 2.0f, fTop - fWidth / 2.0f, FXPT_LINETO);
+ path.SetPoint(3, fRight - fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
+ path.SetPoint(4, fLeft + fWidth / 2.0f, fBottom + fWidth / 2.0f, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.SetDashCount(2);
+ gsd.m_DashArray[0] = 3.0f;
+ gsd.m_DashArray[1] = 3.0f;
+ gsd.m_DashPhase = 0;
+
+ gsd.m_LineWidth = fWidth;
+ pDevice->DrawPath(&path, pUser2Device, &gsd, 0, PWLColorToFXColor(color,nTransparancy), FXFILL_WINDING);
+ }
+ break;
+ case PBS_BEVELED:
+ case PBS_INSET:
+ {
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = fHalfWidth;
+
+ CFX_PathData pathLT;
+
+ pathLT.SetPointCount(7);
+ pathLT.SetPoint(0, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_MOVETO);
+ pathLT.SetPoint(1, fLeft + fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
+ pathLT.SetPoint(2, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
+ pathLT.SetPoint(3, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
+ pathLT.SetPoint(4, fLeft + fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
+ pathLT.SetPoint(5, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
+ pathLT.SetPoint(6, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
+
+ pDevice->DrawPath(&pathLT, pUser2Device, &gsd, PWLColorToFXColor(crLeftTop,nTransparancy), 0, FXFILL_ALTERNATE);
+
+ CFX_PathData pathRB;
+
+ pathRB.SetPointCount(7);
+ pathRB.SetPoint(0, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_MOVETO);
+ pathRB.SetPoint(1, fRight - fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
+ pathRB.SetPoint(2, fLeft + fHalfWidth, fBottom + fHalfWidth, FXPT_LINETO);
+ pathRB.SetPoint(3, fLeft + fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
+ pathRB.SetPoint(4, fRight - fHalfWidth * 2, fBottom + fHalfWidth * 2, FXPT_LINETO);
+ pathRB.SetPoint(5, fRight - fHalfWidth * 2, fTop - fHalfWidth * 2, FXPT_LINETO);
+ pathRB.SetPoint(6, fRight - fHalfWidth, fTop - fHalfWidth, FXPT_LINETO);
+
+ pDevice->DrawPath(&pathRB, pUser2Device, &gsd, PWLColorToFXColor(crRightBottom,nTransparancy), 0, FXFILL_ALTERNATE);
+
+ CFX_PathData path;
+
+ path.AppendRect(fLeft, fBottom, fRight, fTop);
+ path.AppendRect(fLeft + fHalfWidth, fBottom + fHalfWidth, fRight - fHalfWidth, fTop - fHalfWidth);
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd, PWLColorToFXColor(color,nTransparancy), 0, FXFILL_ALTERNATE);
+ }
+ break;
+ case PBS_UNDERLINED:
+ {
+ CFX_PathData path;
+
+ path.SetPointCount(2);
+ path.SetPoint(0, fLeft, fBottom + fWidth / 2, FXPT_MOVETO);
+ path.SetPoint(1, fRight, fBottom + fWidth / 2, FXPT_LINETO);
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = fWidth;
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd,0, PWLColorToFXColor(color,nTransparancy), FXFILL_ALTERNATE);
+ }
+ break;
+ case PBS_SHADOW:
+ {
+ CFX_PathData path;
+ path.AppendRect(fLeft, fBottom, fRight, fTop);
+ path.AppendRect(fLeft + fWidth, fBottom + fWidth, fRight - fWidth, fTop - fWidth);
+ pDevice->DrawPath(&path, pUser2Device, NULL, PWLColorToFXColor(color,nTransparancy/2), 0, FXFILL_ALTERNATE);
+ }
+ break;
+ }
+ }
+}
+
+static void AddSquigglyPath(CFX_PathData & PathData, FX_FLOAT fStartX, FX_FLOAT fEndX, FX_FLOAT fY, FX_FLOAT fStep)
+{
+ PathData.AddPointCount(1);
+ PathData.SetPoint(PathData.GetPointCount() - 1, fStartX, fY, FXPT_MOVETO);
+
+ FX_FLOAT fx;
+ FX_INT32 i;
+
+ for (i=1,fx=fStartX+fStep; fx<fEndX; fx+=fStep,i++)
+ {
+ PathData.AddPointCount(1);
+ PathData.SetPoint(PathData.GetPointCount() - 1, fx, fY + (i&1)*fStep, FXPT_LINETO);
+ }
+}
+
+static void AddSpellCheckObj(CFX_PathData & PathData, IFX_Edit* pEdit, const CPVT_WordRange& wrWord)
+{
+ FX_FLOAT fStartX = 0.0f;
+ FX_FLOAT fEndX = 0.0f;
+ FX_FLOAT fY = 0.0f;
+ FX_FLOAT fStep = 0.0f;
+
+ FX_BOOL bBreak = FALSE;
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ pIterator->SetAt(wrWord.BeginPos);
+
+ do
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+
+ CPVT_Line line;
+ if (pIterator->GetLine(line))
+ {
+ fY = line.ptLine.y;
+ fStep = (line.fLineAscent - line.fLineDescent) / 16.0f;
+ }
+
+ if (place.LineCmp(wrWord.BeginPos) == 0)
+ {
+ pIterator->SetAt(wrWord.BeginPos);
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ fStartX = word.ptWord.x;
+ }
+ }
+ else
+ {
+ fStartX = line.ptLine.x;
+ }
+
+ if (place.LineCmp(wrWord.EndPos) == 0)
+ {
+ pIterator->SetAt(wrWord.EndPos);
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ fEndX = word.ptWord.x + word.fWidth;
+ }
+
+ bBreak = TRUE;
+ }
+ else
+ {
+ fEndX = line.ptLine.x + line.fLineWidth;
+ }
+
+ AddSquigglyPath(PathData, fStartX, fEndX, fY, fStep);
+
+ if (bBreak) break;
+ }
+ while (pIterator->NextLine());
+ }
+}
+
+void CPWL_Utils::DrawEditSpellCheck(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
+ const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange,
+ IPWL_SpellCheck * pSpellCheck)
+{
+ const FX_COLORREF crSpell = ArgbEncode(255,255,0,0);
+
+ //for spellcheck
+ FX_BOOL bLatinWord = FALSE;
+ CPVT_WordPlace wpWordStart;
+ CFX_ByteString sLatinWord;
+
+ CFX_PathData pathSpell;
+
+ pDevice->SaveState();
+
+ if (!rcClip.IsEmpty())
+ {
+ CPDF_Rect rcTemp = rcClip;
+ pUser2Device->TransformRect(rcTemp);
+ FX_RECT rcDevClip;
+ rcDevClip.left = (FX_INT32)rcTemp.left;
+ rcDevClip.right = (FX_INT32)rcTemp.right;
+ rcDevClip.top = (FX_INT32)rcTemp.top;
+ rcDevClip.bottom = (FX_INT32)rcTemp.bottom;
+ pDevice->SetClip_Rect(&rcDevClip);
+ }
+
+ if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
+ {
+ if (pEdit->GetFontMap())
+ {
+ if (pRange)
+ pIterator->SetAt(pRange->BeginPos);
+ else
+ pIterator->SetAt(0);
+
+ CPVT_WordPlace oldplace;
+
+ while (pIterator->NextWord())
+ {
+ CPVT_WordPlace place = pIterator->GetAt();
+ if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
+
+ CPVT_Word word;
+ if (pIterator->GetWord(word))
+ {
+ if (FX_EDIT_ISLATINWORD(word.Word))
+ {
+ if (!bLatinWord)
+ {
+ wpWordStart = place;
+ bLatinWord = TRUE;
+ }
+
+ sLatinWord += (char)word.Word;
+ }
+ else
+ {
+ if (bLatinWord)
+ {
+ if (!sLatinWord.IsEmpty())
+ {
+ if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
+ {
+ AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
+ pIterator->SetAt(place);
+ }
+ }
+ bLatinWord = FALSE;
+ }
+
+ sLatinWord.Empty();
+ }
+
+ oldplace = place;
+ }
+ else
+ {
+ if (bLatinWord)
+ {
+ if (!sLatinWord.IsEmpty())
+ {
+ if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
+ {
+ AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
+ pIterator->SetAt(place);
+ }
+ }
+ bLatinWord = FALSE;
+ }
+
+ sLatinWord.Empty();
+ }
+ }
+
+ if (!sLatinWord.IsEmpty())
+ {
+ if (pSpellCheck && !pSpellCheck->CheckWord(sLatinWord))
+ {
+ AddSpellCheckObj(pathSpell,pEdit,CPVT_WordRange(wpWordStart,oldplace));
+ }
+ }
+ }
+ }
+
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 0;
+ if (pathSpell.GetPointCount() > 0)
+ pDevice->DrawPath(&pathSpell, pUser2Device, &gsd, 0, crSpell, FXFILL_ALTERNATE);
+
+ pDevice->RestoreState();
+}
+
+FX_BOOL CPWL_Utils::IsBlackOrWhite(const CPWL_Color& color)
+{
+ switch (color.nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ return FALSE;
+ case COLORTYPE_GRAY:
+ return color.fColor1 < 0.5f;
+ case COLORTYPE_RGB:
+ return color.fColor1 + color.fColor2 + color.fColor3 < 1.5f;
+ case COLORTYPE_CMYK:
+ return color.fColor1 + color.fColor2 + color.fColor3 + color.fColor4 > 2.0f;
+ }
+
+ return TRUE;
+}
+
+CPWL_Color CPWL_Utils::GetReverseColor(const CPWL_Color& color)
+{
+ CPWL_Color crRet = color;
+
+ switch (color.nColorType)
+ {
+ case COLORTYPE_GRAY:
+ crRet.fColor1 = 1.0f - crRet.fColor1;
+ break;
+ case COLORTYPE_RGB:
+ crRet.fColor1 = 1.0f - crRet.fColor1;
+ crRet.fColor2 = 1.0f - crRet.fColor2;
+ crRet.fColor3 = 1.0f - crRet.fColor3;
+ break;
+ case COLORTYPE_CMYK:
+ crRet.fColor1 = 1.0f - crRet.fColor1;
+ crRet.fColor2 = 1.0f - crRet.fColor2;
+ crRet.fColor3 = 1.0f - crRet.fColor3;
+ crRet.fColor4 = 1.0f - crRet.fColor4;
+ break;
+ }
+
+ return crRet;
+}
+
+CFX_ByteString CPWL_Utils::GetIconAppStream(FX_INT32 nType, const CPDF_Rect& rect, const CPWL_Color& crFill,
+ const CPWL_Color& crStroke)
+{
+ CFX_ByteString sAppStream = CPWL_Utils::GetColorAppStream(crStroke, FALSE);
+ sAppStream += CPWL_Utils::GetColorAppStream(crFill, TRUE);
+
+ CFX_ByteString sPath;
+ CFX_PathData path;
+
+ switch (nType)
+ {
+ case PWL_ICONTYPE_CHECKMARK:
+ GetGraphics_Checkmark(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_CIRCLE:
+ GetGraphics_Circle(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_COMMENT:
+ GetGraphics_Comment(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_CROSS:
+ GetGraphics_Cross(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_HELP:
+ GetGraphics_Help(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_INSERTTEXT:
+ GetGraphics_InsertText(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_KEY:
+ GetGraphics_Key(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_NEWPARAGRAPH:
+ GetGraphics_NewParagraph(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_TEXTNOTE:
+ GetGraphics_TextNote(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_PARAGRAPH:
+ GetGraphics_Paragraph(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_RIGHTARROW:
+ GetGraphics_RightArrow(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_RIGHTPOINTER:
+ GetGraphics_RightPointer(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_STAR:
+ GetGraphics_Star(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_UPARROW:
+ GetGraphics_UpArrow(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_UPLEFTARROW:
+ GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_GRAPH:
+ GetGraphics_Graph(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_PAPERCLIP:
+ GetGraphics_Paperclip(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_ATTACHMENT:
+ GetGraphics_Attachment(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_TAG:
+ GetGraphics_Tag(sPath, path, rect, PWLPT_STREAM);
+ break;
+ case PWL_ICONTYPE_FOXIT:
+ GetGraphics_Foxit(sPath, path, rect, PWLPT_STREAM);
+ break;
+ }
+
+ sAppStream += sPath;
+ if (crStroke.nColorType != COLORTYPE_TRANSPARENT)
+ sAppStream += "B*\n";
+ else
+ sAppStream += "f*\n";
+
+ return sAppStream;
+}
+
+void CPWL_Utils::DrawIconAppStream(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
+ FX_INT32 nType, const CPDF_Rect & rect, const CPWL_Color& crFill, const CPWL_Color& crStroke, const FX_INT32 nTransparancy)
+{
+ CFX_GraphStateData gsd;
+ gsd.m_LineWidth = 1.0f;
+
+ CFX_ByteString sPath;
+ CFX_PathData path;
+
+ switch (nType)
+ {
+ case PWL_ICONTYPE_CHECKMARK:
+ GetGraphics_Checkmark(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_CIRCLE:
+ GetGraphics_Circle(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_COMMENT:
+ GetGraphics_Comment(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_CROSS:
+ GetGraphics_Cross(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_HELP:
+ GetGraphics_Help(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_INSERTTEXT:
+ GetGraphics_InsertText(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_KEY:
+ GetGraphics_Key(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_NEWPARAGRAPH:
+ GetGraphics_NewParagraph(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_TEXTNOTE:
+ GetGraphics_TextNote(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_PARAGRAPH:
+ GetGraphics_Paragraph(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_RIGHTARROW:
+ GetGraphics_RightArrow(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_RIGHTPOINTER:
+ GetGraphics_RightPointer(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_STAR:
+ GetGraphics_Star(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_UPARROW:
+ GetGraphics_UpArrow(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_UPLEFTARROW:
+ GetGraphics_UpLeftArrow(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_GRAPH:
+ GetGraphics_Graph(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_PAPERCLIP:
+ GetGraphics_Paperclip(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_ATTACHMENT:
+ GetGraphics_Attachment(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_TAG:
+ GetGraphics_Tag(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ case PWL_ICONTYPE_FOXIT:
+ GetGraphics_Foxit(sPath, path, rect, PWLPT_PATHDATA);
+ break;
+ default:
+ return;
+ }
+
+ pDevice->DrawPath(&path, pUser2Device, &gsd,
+ PWLColorToFXColor(crFill,nTransparancy), PWLColorToFXColor(crStroke,nTransparancy), FXFILL_ALTERNATE);
+}
+
+void CPWL_Utils::GetGraphics_Checkmark(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f, crBBox.bottom + fHeight * 2 / 5.0f),PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 7.0f - fWidth / 15.0f),
+ crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 2 / 7.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 5.0f - fWidth / 4.5f),
+ crBBox.bottom + fHeight / 16.0f + PWL_BEZIER*(fHeight / 5.0f - fHeight / 16.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f, crBBox.bottom + fHeight / 16.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 4.5f + PWL_BEZIER*(fWidth / 4.4f - fWidth / 4.5f),
+ crBBox.bottom + fHeight / 16.0f - PWL_BEZIER*fHeight / 16.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*(fWidth / 4.0f - fWidth / 3.0f),
+ crBBox.bottom), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f, crBBox.bottom), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.0f + PWL_BEZIER*fWidth*(1/7.0f + 2/15.0f),
+ crBBox.bottom + PWL_BEZIER*fHeight * 4 / 5.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*fWidth*(1/7.0f - 7/15.0f),
+ crBBox.bottom + fHeight * 15/16.0f + PWL_BEZIER*(fHeight * 4/5.0f - fHeight * 15/16.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f,crBBox.bottom + fHeight * 15 / 16.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth * 14 / 15.0f + PWL_BEZIER*(fWidth * 7 / 15.0f - fWidth * 14 / 15.0f),
+ crBBox.bottom + fHeight * 15 / 16.0f + PWL_BEZIER*(fHeight * 8 / 7.0f - fHeight * 15 / 16.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f + PWL_BEZIER*(fWidth / 3.4f - fWidth / 3.6f),
+ crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 3.5f - fHeight / 3.5f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,crBBox.bottom + fHeight / 3.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 3.6f,
+ crBBox.bottom + fHeight / 3.5f + PWL_BEZIER*(fHeight / 4.0f - fHeight / 3.5f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f + PWL_BEZIER*(fWidth / 3.5f - fWidth / 15.0f),
+ crBBox.bottom + fHeight * 2 / 5.0f + PWL_BEZIER*(fHeight * 3.5f / 5.0f - fHeight * 2 / 5.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth / 15.0f,crBBox.bottom + fHeight * 2 / 5.0f), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 16);
+ else
+ GetPathDataFromArray(path, PathArray, 16);
+}
+
+void CPWL_Utils::GetGraphics_Circle(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,
+ crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f,crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*14/15.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*14/15.0f - fWidth/2.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/15.0f), crBBox.bottom + fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight/2.0f - fHeight/15.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f,crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth*3/15.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.top - fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth*4/5.0f - fWidth/2.0f), crBBox.bottom + fHeight*3/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f - PWL_BEZIER*(fHeight*4/5.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*3/15.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 26);
+ else
+ GetPathDataFromArray(path, PathArray, 26);
+}
+
+void CPWL_Utils::GetGraphics_Comment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.top - fHeight/10.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6 + PWL_BEZIER*(fHeight/6.0f - fHeight/10.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f + PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f + PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f, crBBox.bottom + fHeight*2/15 + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*5/15.0f - PWL_BEZIER*fWidth*2/15.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*6/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f + PWL_BEZIER*fWidth/30.0f, crBBox.bottom + fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*2/15.0f + PWL_BEZIER*fHeight*2/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/30.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f - PWL_BEZIER*fWidth/15.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f - PWL_BEZIER*fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.bottom + fHeight/3.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/15.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*8/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15, crBBox.top - fHeight*25/60.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*2/15.0f, crBBox.top - fHeight*25/60.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*2/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*4/15.0f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 30);
+ else
+ GetPathDataFromArray(path, PathArray, 30);
+}
+
+void CPWL_Utils::GetGraphics_Cross(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+ //FX_FLOAT fcatercorner = (FX_FLOAT)sqrt(fWidth*fWidth + fHeight*fHeight);
+ CPWL_Point center_point(crBBox.left + fWidth/2, crBBox.bottom + fHeight/2);
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y + fHeight/10.0f + fWidth*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f, center_point.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x + fWidth/10.0f + fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x + fWidth*0.3f, center_point.y - fHeight/10.0f - fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x, center_point.y - fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y - fHeight/10 - fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x - fWidth/10.0f - fWidth*0.3f, center_point.y - fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x - fWidth/10, center_point.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x - fWidth/10 - fWidth*0.3f, center_point.y + fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x - fWidth*0.3f, center_point.y + fHeight/10.0f + fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(center_point.x, center_point.y + fHeight/10.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 13);
+ else
+ GetPathDataFromArray(path, PathArray, 13);
+}
+
+void CPWL_Utils::GetGraphics_Help(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*(fWidth/2.0f - fWidth/60.0f), crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.bottom + fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*(fHeight/60.0f - fHeight/2.0f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f - PWL_BEZIER*fWidth*29/60.0f, crBBox.top - fHeight/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f + PWL_BEZIER*fHeight*29/60.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60.0f, crBBox.bottom + fHeight/2.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.23f, crBBox.bottom + fHeight*0.87f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.23f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.27f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.15f*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.51f + fHeight*0.15f*0.2f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f, crBBox.top - fHeight*0.51f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.35f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.51f - fHeight*0.15f*0.3f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.5f, crBBox.top - fHeight*0.68f + fHeight*0.15f*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.68f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f - fWidth*0.1f*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.bottom + fHeight*0.30f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f, crBBox.top - fHeight*0.66f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.55f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.66f + fHeight*0.18f*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f - fWidth*0.1f*0.05f, crBBox.top - fHeight*0.48f - fHeight*0.18f*0.3f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f, crBBox.top - fHeight*0.48f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.45f + fWidth*0.08f*0.2f, crBBox.top - fHeight*0.48f + fHeight*0.18f*0.2f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f - fWidth*0.08f*0.2f, crBBox.top - fHeight*0.36f - fHeight*0.18f*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f + PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f - PWL_BEZIER*fWidth*0.13f, crBBox.bottom + fHeight*0.77f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f + PWL_BEZIER*fHeight*0.13f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.37f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f - fWidth*0.1f*0.6f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.27f, crBBox.top - fHeight*0.36f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.095f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.185f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f + PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.44f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f + PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.505f - PWL_BEZIER*fWidth*0.065f, crBBox.bottom + fHeight*0.075f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f - PWL_BEZIER*fHeight*0.055f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.56f, crBBox.bottom + fHeight*0.13f), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 59);
+ else
+ GetPathDataFromArray(path, PathArray, 59);
+}
+
+void CPWL_Utils::GetGraphics_InsertText(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2, crBBox.top - fHeight*2/15), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.bottom + fHeight/10), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 4);
+ else
+ GetPathDataFromArray(path, PathArray, 4);
+}
+
+void CPWL_Utils::GetGraphics_Key(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+ FX_FLOAT k = -fHeight/fWidth;
+ CPWL_Point tail;
+ CPWL_Point CicleCenter;
+ tail.x = crBBox.left + fWidth*0.9f;
+ tail.y = k*(tail.x - crBBox.right) + crBBox.bottom;
+ CicleCenter.x = crBBox.left + fWidth*0.15f;
+ CicleCenter.y = k*(CicleCenter.x - crBBox.right) + crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f, -fWidth/30.0f/k + tail.y), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30.0f - fWidth*0.18f, -k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f + fWidth*0.07f,
+ -fWidth*0.07f/k - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 + fWidth*0.07f,
+ -fWidth*0.07f/k - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20,
+ -k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15,
+ -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 + fWidth*0.07f,
+ -fWidth*0.07f/k - k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20 + fWidth*0.07f,
+ -fWidth*0.07f/k + -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.18f - fWidth/20 - fWidth/15 - fWidth/20,
+ -k*fWidth/20 + -k*fWidth/15 - k*fWidth/20 - k*fWidth*0.18f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f, -k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30 - fWidth*0.45f + fWidth*0.2f,
+ -fWidth*0.4f/k - k*fWidth*0.45f - fWidth/30/k + tail.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.2f, - fWidth*0.1f/k + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60.0f, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth/60, -k*fWidth/60 + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x, CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x - fWidth*0.22f, fWidth*0.35f/k + CicleCenter.y - fHeight*0.05f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(tail.x - fWidth/30 - fWidth*0.45f - fWidth*0.18f, fWidth*0.05f/k - k*fWidth*0.45f + fWidth/30/k + tail.y - fHeight*0.05f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f - fWidth*0.45f, -k*fWidth*0.45f + fWidth/30.0f/k + tail.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(tail.x - fWidth/30.0f, fWidth/30.0f/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/30, -fWidth/30/k + tail.y), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f + fWidth*0.1f, -fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f + fWidth*0.1f, k*fWidth*0.22f + CicleCenter.y - fWidth*0.1f/k), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f, k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.22f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.22f + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f - fWidth*0.1f, fWidth*0.1f/k + k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(CicleCenter.x + fWidth*0.08f, k*fWidth*0.08f + CicleCenter.y), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 28);
+ else
+ GetPathDataFromArray(path, PathArray, 28);
+}
+
+void CPWL_Utils::GetGraphics_NewParagraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/20.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f - fWidth*0.14f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.48f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.38f, crBBox.bottom + fWidth*0.24f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.22f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.12f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.bottom + fHeight/10.0f + fHeight/7.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.97f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*17/30.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/10.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.85f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*17/30.0f - fHeight*0.08f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/7 + fHeight*0.18f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 28);
+ else
+ GetPathDataFromArray(path, PathArray, 28);
+}
+
+void CPWL_Utils::GetGraphics_TextNote(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*7/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.bottom + fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*4/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/5.0f, crBBox.top - fHeight*7/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/5.0f, crBBox.top - fHeight*10/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*3/10.0f, crBBox.top - fHeight*10/15.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 17);
+ else
+ GetPathDataFromArray(path, PathArray, 17);
+}
+
+void CPWL_Utils::GetGraphics_Paragraph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.634f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.top - fHeight*2/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.566f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f - fHeight*0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.2f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 12);
+ else
+ GetPathDataFromArray(path, PathArray, 12);
+}
+
+void CPWL_Utils::GetGraphics_RightArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.bottom + fHeight/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f - fWidth/25.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f - fWidth*0.15f, crBBox.top - fHeight/2.0f + fWidth/25.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f + fWidth/8.0f, crBBox.top - fHeight/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 10);
+ else
+ GetPathDataFromArray(path, PathArray, 10);
+}
+
+void CPWL_Utils::GetGraphics_RightPointer(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.bottom + fHeight/6.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*4/15.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/30.0f, crBBox.top - fHeight/6.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30.0f, crBBox.top - fHeight/2.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 5);
+ else
+ GetPathDataFromArray(path, PathArray, 5);
+}
+
+void CPWL_Utils::GetGraphics_Star(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fLongRadius = (crBBox.top - crBBox.bottom)/(1+(FX_FLOAT)cos(PWL_PI/5.0f));
+ fLongRadius = fLongRadius * 0.7f;
+ FX_FLOAT fShortRadius = fLongRadius * 0.55f;
+ CPDF_Point ptCenter = CPDF_Point((crBBox.left + crBBox.right) / 2.0f,(crBBox.top + crBBox.bottom) / 2.0f);
+
+ FX_FLOAT px1[5], py1[5];
+ FX_FLOAT px2[5], py2[5];
+
+ FX_FLOAT fAngel = PWL_PI/10.0f;
+
+ for (FX_INT32 i=0; i<5; i++)
+ {
+ px1[i] = ptCenter.x + fLongRadius * (FX_FLOAT)cos(fAngel);
+ py1[i] = ptCenter.y + fLongRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_PI * 2 / 5.0f;
+ }
+
+ fAngel = PWL_PI/5.0f + PWL_PI/10.0f;
+
+ for (FX_INT32 j=0; j<5; j++)
+ {
+ px2[j] = ptCenter.x + fShortRadius * (FX_FLOAT)cos(fAngel);
+ py2[j] = ptCenter.y + fShortRadius * (FX_FLOAT)sin(fAngel);
+
+ fAngel += PWL_PI * 2 / 5.0f;
+ }
+
+ CPWL_PathData PathArray[11];
+ PathArray[0] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_MOVETO);
+ PathArray[1] = CPWL_PathData(CPWL_Point(px2[0], py2[0]), PWLPT_LINETO);
+
+ for(FX_INT32 k = 0; k < 4; k++)
+ {
+ PathArray[(k+1)*2] = CPWL_PathData(CPWL_Point(px1[k+1], py1[k+1]), PWLPT_LINETO);
+ PathArray[(k+1)*2 + 1] = CPWL_PathData(CPWL_Point(px2[k+1], py2[k+1]), PWLPT_LINETO);
+ }
+
+ PathArray[10] = CPWL_PathData(CPWL_Point(px1[0], py1[0]), PWLPT_LINETO);
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 11);
+ else
+ GetPathDataFromArray(path, PathArray, 11);
+}
+
+void CPWL_Utils::GetGraphics_UpArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/10.0f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.bottom + fHeight/15.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/10, crBBox.top - fWidth*3/5.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/2.0f, crBBox.top - fHeight/15.0f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 8);
+ else
+ GetPathDataFromArray(path, PathArray, 8);
+}
+
+void CPWL_Utils::GetGraphics_UpLeftArrow(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+ CPWL_Point leftup(crBBox.left, crBBox.top);
+ CPWL_Point rightdown(crBBox.right, crBBox.bottom);
+ FX_FLOAT k = -fHeight/fWidth;
+ CPWL_Point tail;
+ tail.x = crBBox.left + fWidth*4/5.0f;
+ tail.y = k*(tail.x - crBBox.right) + rightdown.y;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f + fWidth/5.0f,
+ -fWidth/5.0f/k + tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x + fWidth/10.0f,
+ tail.y - fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x + fWidth/10.0f, tail.y - fWidth/10.0f/k), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f, tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(fHeight*17/60.0f/k + tail.x - fWidth/10.0f - fWidth/5.0f,
+ fWidth/5.0f/k + tail.y + fWidth/10.0f/k + fHeight*17/60.0f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/20.0f, k*(crBBox.left + fWidth/20.0f - rightdown.x) + rightdown.y), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 8);
+ else
+ GetPathDataFromArray(path, PathArray, 8);
+}
+
+void CPWL_Utils::GetGraphics_Graph(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.15f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.05f, crBBox.top - fWidth*0.15f), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.475f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.275f, crBBox.top - fWidth*0.45f), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.7f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.05f), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.top - fWidth*0.35f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.925f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.bottom + fHeight*0.08f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.725f, crBBox.top - fWidth*0.35f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 20);
+ else
+ GetPathDataFromArray(path, PathArray, 20);
+}
+
+void CPWL_Utils::GetGraphics_Paperclip(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f - fWidth*57/60.0f*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f + fHeight/15*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/30 - fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f - (fWidth*57/60.0f - fWidth*0.24f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.bottom + fHeight*0.2f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60 + fWidth*0.12f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f + (fWidth*11/12.0f - fWidth*0.36f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.top - fHeight*0.2f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.24f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f - (fWidth*14/15.0f - fWidth*0.53f)*0.25f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.bottom + fHeight*0.25f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.29f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f + fWidth*0.12f*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.top - fHeight*0.33f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.17f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f - fWidth*(14/15.0f - 0.29f)*0.35f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.bottom + fHeight*0.3f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth/15 - fWidth*0.12f, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f + fWidth*0.35f*(11/12.0f - 0.12f)), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth/60, crBBox.top - fHeight*0.25f), PWLPT_BEZIERTO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 33);
+ else
+ GetPathDataFromArray(path, PathArray, 33);
+}
+
+void CPWL_Utils::GetGraphics_Attachment(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.25f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.23f), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f - fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.15f, crBBox.top - fHeight*0.65f + fHeight*0.15f*0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f + fWidth*0.25f*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.6f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f + fWidth*0.04f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.top - fHeight*0.65f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.5f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 24);
+ else
+ GetPathDataFromArray(path, PathArray, 24);
+}
+
+void CPWL_Utils::GetGraphics_Tag(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fHeight = crBBox.top - crBBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.1f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.3f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.bottom + fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.1f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.1f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.3f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.3f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.5f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.5f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left + fWidth*0.4f, crBBox.top - fHeight*0.7f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right - fWidth*0.2f, crBBox.top - fHeight*0.7f), PWLPT_LINETO)
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 12);
+ else
+ GetPathDataFromArray(path, PathArray, 12);
+}
+
+void CPWL_Utils::GetGraphics_Foxit(CFX_ByteString& sPathData, CFX_PathData& path, const CPDF_Rect& crBBox, const PWL_PATH_TYPE type)
+{
+ FX_FLOAT fOutWidth = crBBox.right - crBBox.left;
+ FX_FLOAT fOutHeight = crBBox.top - crBBox.bottom;
+
+ CPDF_Rect crInBox = crBBox;
+ crInBox.left = crBBox.left + fOutWidth*0.08f;
+ crInBox.right = crBBox.right - fOutWidth*0.08f;
+ crInBox.top = crBBox.top - fOutHeight*0.08f;
+ crInBox.bottom = crBBox.bottom + fOutHeight*0.08f;
+
+ FX_FLOAT fWidth = crInBox.right - crInBox.left;
+ FX_FLOAT fHeight = crInBox.top - crInBox.bottom;
+
+ CPWL_PathData PathArray[] =
+ {
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f, crInBox.top - PWL_BEZIER * fHeight * 0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.45f - PWL_BEZIER * fWidth * 0.45f, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.4f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.60f, crInBox.top), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f, crInBox.top - PWL_BEZIER * fHeight * 0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.75f - PWL_BEZIER * fWidth * 0.75f, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.7f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.55f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + PWL_BEZIER * fWidth*0.60f, crInBox.top - fHeight*0.55f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top - PWL_BEZIER * fHeight * 0.55f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth * 0.60f, crInBox.top), PWLPT_BEZIERTO),
+
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top - PWL_BEZIER * fHeight * 0.85f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f - PWL_BEZIER * fWidth * 0.90f, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.top - fHeight*0.85f), PWLPT_BEZIERTO),
+ CPWL_PathData(CPWL_Point(crInBox.left, crInBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.right, crInBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.right, crInBox.top), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crInBox.left + fWidth*0.90f, crInBox.top), PWLPT_LINETO),
+
+ /*
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right, crBBox.top), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right, crBBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.bottom), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left, crBBox.top), PWLPT_LINETO),
+
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_MOVETO),
+ CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.right-fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.bottom+fOutHeight*0.04f), PWLPT_LINETO),
+ CPWL_PathData(CPWL_Point(crBBox.left+fOutWidth*0.04f, crBBox.top-fOutHeight*0.04f), PWLPT_LINETO),
+ */
+ };
+
+ if(type == PWLPT_STREAM)
+ sPathData = GetAppStreamFromArray(PathArray, 23);
+ else
+ GetPathDataFromArray(path, PathArray, 23);
+}
+
+void CPWL_Color::ConvertColorType(FX_INT32 nColorType)
+{
+ switch (this->nColorType)
+ {
+ case COLORTYPE_TRANSPARENT:
+ break;
+ case COLORTYPE_GRAY:
+ switch (nColorType)
+ {
+ case COLORTYPE_RGB:
+ CPWL_Utils::ConvertGRAY2RGB(this->fColor1, this->fColor1, this->fColor2, this->fColor3);
+ break;
+ case COLORTYPE_CMYK:
+ CPWL_Utils::ConvertGRAY2CMYK(this->fColor1, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
+ break;
+ }
+ break;
+ case COLORTYPE_RGB:
+ switch (nColorType)
+ {
+ case COLORTYPE_GRAY:
+ CPWL_Utils::ConvertRGB2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor1);
+ break;
+ case COLORTYPE_CMYK:
+ CPWL_Utils::ConvertRGB2CMYK(this->fColor1, this->fColor2, this->fColor3, this->fColor1, this->fColor2, this->fColor3, this->fColor4);
+ break;
+ }
+ break;
+ case COLORTYPE_CMYK:
+ switch (nColorType)
+ {
+ case COLORTYPE_GRAY:
+ CPWL_Utils::ConvertCMYK2GRAY(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1);
+ break;
+ case COLORTYPE_RGB:
+ CPWL_Utils::ConvertCMYK2RGB(this->fColor1, this->fColor2, this->fColor3, this->fColor4, this->fColor1, this->fColor2, this->fColor3);
+ break;
+ }
+ break;
+ }
+ this->nColorType = nColorType;
+}
+
+
diff --git a/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp
new file mode 100644
index 0000000000..035ffbbf4d
--- /dev/null
+++ b/fpdfsdk/src/pdfwindow/PWL_Wnd.cpp
@@ -0,0 +1,1342 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../include/pdfwindow/PDFWindow.h"
+#include "../../include/pdfwindow/PWL_Wnd.h"
+#include "../../include/pdfwindow/PWL_Utils.h"
+#include "../../include/pdfwindow/PWL_ScrollBar.h"
+
+/* -------------------------- CPWL_Timer -------------------------- */
+
+static CFX_MapPtrTemplate<FX_INT32, CPWL_Timer*> g_TimeMap;
+
+CPWL_Timer::CPWL_Timer(CPWL_TimerHandler* pAttached, IFX_SystemHandler* pSystemHandler) :
+ m_pAttached(pAttached),
+ m_nTimerID(0),
+ m_pSystemHandler(pSystemHandler)
+{
+ ASSERT(m_pAttached != NULL);
+ ASSERT(m_pSystemHandler != NULL);
+}
+
+CPWL_Timer::~CPWL_Timer()
+{
+ KillPWLTimer();
+}
+
+FX_INT32 CPWL_Timer::SetPWLTimer(FX_INT32 nElapse)
+{
+ if (m_nTimerID != 0) KillPWLTimer();
+ m_nTimerID = m_pSystemHandler->SetTimer(nElapse, TimerProc);
+ g_TimeMap.SetAt(m_nTimerID, this);
+ return m_nTimerID;
+}
+
+void CPWL_Timer::KillPWLTimer()
+{
+ if (m_nTimerID != 0)
+ {
+ m_pSystemHandler->KillTimer(m_nTimerID);
+ g_TimeMap.RemoveKey(m_nTimerID);
+ m_nTimerID = 0;
+ }
+}
+
+void CPWL_Timer::TimerProc(FX_INT32 idEvent)
+{
+ CPWL_Timer* pTimer = NULL;
+ if (g_TimeMap.Lookup(idEvent, pTimer))
+ {
+ if (pTimer)
+ {
+ if (pTimer->m_pAttached)
+ pTimer->m_pAttached->TimerProc();
+ }
+ }
+}
+
+/* -------------------------- CPWL_TimerHandler -------------------------- */
+
+CPWL_TimerHandler::CPWL_TimerHandler() : m_pTimer(NULL)
+{
+}
+
+CPWL_TimerHandler::~CPWL_TimerHandler()
+{
+ if (m_pTimer) delete m_pTimer;
+}
+
+void CPWL_TimerHandler::BeginTimer(FX_INT32 nElapse)
+{
+ if (!m_pTimer)
+ m_pTimer = new CPWL_Timer(this, GetSystemHandler());
+
+ if (m_pTimer)
+ m_pTimer->SetPWLTimer(nElapse);
+}
+
+void CPWL_TimerHandler::EndTimer()
+{
+ if (m_pTimer)
+ m_pTimer->KillPWLTimer();
+}
+
+void CPWL_TimerHandler::TimerProc()
+{
+}
+
+/* --------------------------- CPWL_MsgControl ---------------------------- */
+
+class CPWL_MsgControl
+{
+ friend class CPWL_Wnd;
+
+public:
+ CPWL_MsgControl(CPWL_Wnd * pWnd)
+ {
+// PWL_TRACE("new CPWL_MsgControl\n");
+ m_pCreatedWnd = pWnd;
+ Default();
+ }
+
+ ~CPWL_MsgControl()
+ {
+// PWL_TRACE("~CPWL_MsgControl\n");
+ Default();
+ }
+
+ void Default()
+ {
+ m_aMousePath.RemoveAll();
+ m_aKeyboardPath.RemoveAll();
+ m_pMainMouseWnd = NULL;
+ m_pMainKeyboardWnd = NULL;
+ }
+
+ FX_BOOL IsWndCreated(const CPWL_Wnd * pWnd) const
+ {
+ return m_pCreatedWnd == pWnd;
+ }
+
+ FX_BOOL IsMainCaptureMouse(const CPWL_Wnd * pWnd) const
+ {
+ return pWnd == m_pMainMouseWnd;
+ }
+
+ FX_BOOL IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
+ {
+ if (pWnd)
+ for( FX_INT32 i=0,sz=m_aMousePath.GetSize(); i<sz; i++)
+ if (m_aMousePath.GetAt(i) == pWnd)
+ return TRUE;
+
+ return FALSE;
+ }
+
+ FX_BOOL IsMainCaptureKeyboard(const CPWL_Wnd * pWnd) const
+ {
+ return pWnd == m_pMainKeyboardWnd;
+ }
+
+
+ FX_BOOL IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
+ {
+ if (pWnd)
+ for( FX_INT32 i=0,sz=m_aKeyboardPath.GetSize(); i<sz; i++)
+ if (m_aKeyboardPath.GetAt(i) == pWnd)
+ return TRUE;
+
+ return FALSE;
+ }
+
+ void SetFocus(CPWL_Wnd * pWnd)
+ {
+ m_aKeyboardPath.RemoveAll();
+
+ if (pWnd)
+ {
+ m_pMainKeyboardWnd = pWnd;
+
+ CPWL_Wnd * pParent = pWnd;
+ while (pParent)
+ {
+ m_aKeyboardPath.Add(pParent);
+ pParent = pParent->GetParentWindow();
+ }
+
+ pWnd->OnSetFocus();
+ }
+ }
+
+ void KillFocus()
+ {
+ if (m_aKeyboardPath.GetSize() > 0)
+ if (CPWL_Wnd* pWnd = m_aKeyboardPath.GetAt(0))
+ pWnd->OnKillFocus();
+
+ m_pMainKeyboardWnd = NULL;
+ m_aKeyboardPath.RemoveAll();
+ }
+
+ void SetCapture(CPWL_Wnd * pWnd)
+ {
+ m_aMousePath.RemoveAll();
+
+ if (pWnd)
+ {
+ m_pMainMouseWnd = pWnd;
+
+ CPWL_Wnd * pParent = pWnd;
+ while (pParent)
+ {
+ m_aMousePath.Add(pParent);
+ pParent = pParent->GetParentWindow();
+ }
+ }
+ }
+
+ void ReleaseCapture()
+ {
+ m_pMainMouseWnd = NULL;
+ m_aMousePath.RemoveAll();
+ }
+
+private:
+ CFX_ArrayTemplate<CPWL_Wnd*> m_aMousePath;
+ CFX_ArrayTemplate<CPWL_Wnd*> m_aKeyboardPath;
+ CPWL_Wnd* m_pCreatedWnd;
+ CPWL_Wnd* m_pMainMouseWnd;
+ CPWL_Wnd* m_pMainKeyboardWnd;
+};
+
+/* --------------------------- CPWL_Wnd ---------------------------- */
+
+CPWL_Wnd::CPWL_Wnd() :
+ m_pVScrollBar(NULL),
+ m_rcWindow(),
+ m_rcClip(),
+ m_bCreated(FALSE),
+ m_bVisible(FALSE),
+ m_bNotifying(FALSE),
+ m_bEnabled(TRUE)
+{
+}
+
+CPWL_Wnd::~CPWL_Wnd()
+{
+ ASSERT(m_bCreated == FALSE);
+}
+
+CFX_ByteString CPWL_Wnd::GetClassName() const
+{
+ return "CPWL_Wnd";
+}
+
+void CPWL_Wnd::Create(const PWL_CREATEPARAM & cp)
+{
+ if (!IsValid())
+ {
+ m_sPrivateParam = cp;
+
+ OnCreate(m_sPrivateParam);
+
+ m_sPrivateParam.rcRectWnd.Normalize();
+ m_rcWindow = m_sPrivateParam.rcRectWnd;
+ m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f);
+
+ CreateMsgControl();
+
+ if (m_sPrivateParam.pParentWnd)
+ m_sPrivateParam.pParentWnd->OnNotify(this, PNM_ADDCHILD);
+
+ PWL_CREATEPARAM ccp = m_sPrivateParam;
+
+ ccp.dwFlags &= 0xFFFF0000L; //remove sub styles
+ ccp.mtChild = CPDF_Matrix(1,0,0,1,0,0);
+
+ CreateScrollBar(ccp);
+ CreateChildWnd(ccp);
+
+ m_bVisible = HasFlag(PWS_VISIBLE);
+
+ OnCreated();
+
+ RePosChildWnd();
+ m_bCreated = TRUE;
+ }
+}
+
+void CPWL_Wnd::OnCreate(PWL_CREATEPARAM & cp)
+{
+}
+
+void CPWL_Wnd::OnCreated()
+{
+}
+
+void CPWL_Wnd::OnDestroy()
+{
+}
+
+void CPWL_Wnd::Destroy()
+{
+ KillFocus();
+
+ OnDestroy();
+
+ if (m_bCreated)
+ {
+ for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren[i])
+ {
+ pChild->Destroy();
+ delete pChild;
+ pChild = NULL;
+ }
+ }
+
+ if (m_sPrivateParam.pParentWnd)
+ m_sPrivateParam.pParentWnd->OnNotify(this, PNM_REMOVECHILD);
+ m_bCreated = FALSE;
+ }
+
+ DestroyMsgControl();
+
+ FXSYS_memset(&m_sPrivateParam, 0, sizeof(PWL_CREATEPARAM));
+ m_aChildren.RemoveAll();
+ m_pVScrollBar = NULL;
+}
+
+void CPWL_Wnd::Move(const CPDF_Rect & rcNew, FX_BOOL bReset,FX_BOOL bRefresh)
+{
+ if (IsValid())
+ {
+ CPDF_Rect rcOld = this->GetWindowRect();
+
+ m_rcWindow = rcNew;
+ m_rcWindow.Normalize();
+ //m_rcClip = CPWL_Utils::InflateRect(m_rcWindow,1.0f); //for special caret
+
+ if (rcOld.left != rcNew.left || rcOld.right != rcNew.right ||
+ rcOld.top != rcNew.top || rcOld.bottom != rcNew.bottom)
+ {
+ if (bReset)
+ {
+ RePosChildWnd();
+ }
+
+ }
+ if (bRefresh)
+ {
+ InvalidateRectMove(rcOld,rcNew);
+ }
+
+ m_sPrivateParam.rcRectWnd = m_rcWindow;
+ }
+}
+
+void CPWL_Wnd::InvalidateRectMove(const CPDF_Rect & rcOld, const CPDF_Rect & rcNew)
+{
+ CPDF_Rect rcUnion = rcOld;
+ rcUnion.Union(rcNew);
+
+ InvalidateRect(&rcUnion);
+
+ /*
+ CPDF_Rect SubArray[4];
+
+ rcOld.Substract4(rcNew,SubArray);
+ for (FX_INT32 i=0;i<4;i++)
+ {
+ if (SubArray[i].left == 0 &&
+ SubArray[i].right == 0 &&
+ SubArray[i].top == 0 &&
+ SubArray[i].bottom == 0)continue;
+
+ InvalidateRect(&CPWL_Utils::InflateRect(SubArray[i],2));
+ }
+
+ rcNew.Substract4(rcOld,SubArray);
+ for (FX_INT32 j=0;j<4;j++)
+ {
+ if (SubArray[j].left == 0 &&
+ SubArray[j].right == 0 &&
+ SubArray[j].top == 0 &&
+ SubArray[j].bottom == 0)continue;
+
+ InvalidateRect(&CPWL_Utils::InflateRect(SubArray[j],2));
+ }
+ */
+}
+
+void CPWL_Wnd::GetAppearanceStream(CFX_ByteString & sAppStream)
+{
+ if (IsValid())
+ {
+ CFX_ByteTextBuf sTextBuf;
+ GetAppearanceStream(sTextBuf);
+ sAppStream += sTextBuf.GetByteString();
+ }
+}
+
+void CPWL_Wnd::GetAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ if (IsValid() && IsVisible())
+ {
+ GetThisAppearanceStream(sAppStream);
+ GetChildAppearanceStream(sAppStream);
+ }
+}
+
+//if don't set,Get default apperance stream
+void CPWL_Wnd::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (!rectWnd.IsEmpty())
+ {
+ CFX_ByteTextBuf sThis;
+
+ if (HasFlag(PWS_BACKGROUND))
+ sThis << CPWL_Utils::GetRectFillAppStream(rectWnd,this->GetBackgroundColor());
+
+ if (HasFlag(PWS_BORDER))
+ sThis << CPWL_Utils::GetBorderAppStream(rectWnd,
+ (FX_FLOAT)GetBorderWidth(),
+ GetBorderColor(),
+ this->GetBorderLeftTopColor(this->GetBorderStyle()),
+ this->GetBorderRightBottomColor(this->GetBorderStyle()),
+ this->GetBorderStyle(),
+ this->GetBorderDash());
+
+ sAppStream << sThis;
+ }
+}
+
+void CPWL_Wnd::GetChildAppearanceStream(CFX_ByteTextBuf & sAppStream)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ pChild->GetAppearanceStream(sAppStream);
+ }
+ }
+}
+
+void CPWL_Wnd::DrawAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ if (IsValid() && IsVisible())
+ {
+ DrawThisAppearance(pDevice,pUser2Device);
+ DrawChildAppearance(pDevice,pUser2Device);
+ }
+}
+
+void CPWL_Wnd::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ CPDF_Rect rectWnd = GetWindowRect();
+ if (!rectWnd.IsEmpty())
+ {
+ if (HasFlag(PWS_BACKGROUND))
+ {
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rectWnd,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+ CPWL_Utils::DrawFillRect(pDevice,pUser2Device,rcClient,this->GetBackgroundColor(),GetTransparency());
+ }
+
+ if (HasFlag(PWS_BORDER))
+ CPWL_Utils::DrawBorder(pDevice,
+ pUser2Device,
+ rectWnd,
+ (FX_FLOAT)GetBorderWidth(),
+ GetBorderColor(),
+ this->GetBorderLeftTopColor(this->GetBorderStyle()),
+ this->GetBorderRightBottomColor(this->GetBorderStyle()),
+ this->GetBorderStyle(),
+ this->GetBorderDash(),
+ GetTransparency());
+ }
+}
+
+void CPWL_Wnd::DrawChildAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ CPDF_Matrix mt = pChild->GetChildMatrix();
+ if (mt.IsIdentity())
+ {
+ pChild->DrawAppearance(pDevice,pUser2Device);
+ }
+ else
+ {
+ mt.Concat(*pUser2Device);
+ pChild->DrawAppearance(pDevice,&mt);
+ }
+ }
+ }
+}
+
+void CPWL_Wnd::InvalidateRect(CPDF_Rect* pRect)
+{
+ if (IsValid())
+ {
+ CPDF_Rect rcRefresh = pRect ? *pRect : GetWindowRect();
+
+ if (!HasFlag(PWS_NOREFRESHCLIP))
+ {
+ CPDF_Rect rcClip = GetClipRect();
+ if (!rcClip.IsEmpty())
+ {
+ rcRefresh.Intersect(rcClip);
+ }
+ }
+
+ FX_RECT rcWin = PWLtoWnd(rcRefresh);
+ rcWin.left -= PWL_INVALIDATE_INFLATE;
+ rcWin.top -= PWL_INVALIDATE_INFLATE;
+ rcWin.right += PWL_INVALIDATE_INFLATE;
+ rcWin.bottom += PWL_INVALIDATE_INFLATE;
+
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ {
+ if (FX_HWND hWnd = GetAttachedHWnd())
+ {
+ pSH->InvalidateRect(hWnd, rcWin);
+ }
+ }
+ }
+}
+
+#define PWL_IMPLEMENT_KEY_METHOD(key_method_name)\
+FX_BOOL CPWL_Wnd::key_method_name(FX_WORD nChar, FX_DWORD nFlag)\
+{\
+ if (IsValid() && IsVisible() && IsEnabled())\
+ {\
+ if (IsWndCaptureKeyboard(this))\
+ {\
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+ {\
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+ {\
+ if (IsWndCaptureKeyboard(pChild))\
+ {\
+ return pChild->key_method_name(nChar,nFlag);\
+ }\
+ }\
+ }\
+ }\
+ }\
+ return FALSE;\
+}
+
+#define PWL_IMPLEMENT_MOUSE_METHOD(mouse_method_name)\
+FX_BOOL CPWL_Wnd::mouse_method_name(const CPDF_Point & point, FX_DWORD nFlag)\
+{\
+ if (IsValid() && IsVisible() && IsEnabled())\
+ {\
+ if (IsWndCaptureMouse(this))\
+ {\
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+ {\
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+ {\
+ if (IsWndCaptureMouse(pChild))\
+ {\
+ return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
+ }\
+ }\
+ }\
+ SetCursor();\
+ }\
+ else\
+ {\
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)\
+ {\
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))\
+ {\
+ if (pChild->WndHitTest(pChild->ParentToChild(point)))\
+ {\
+ return pChild->mouse_method_name(pChild->ParentToChild(point),nFlag);\
+ }\
+ }\
+ }\
+ if (this->WndHitTest(point))\
+ SetCursor();\
+ }\
+ }\
+ return FALSE;\
+}
+
+PWL_IMPLEMENT_KEY_METHOD(OnKeyDown)
+PWL_IMPLEMENT_KEY_METHOD(OnKeyUp)
+PWL_IMPLEMENT_KEY_METHOD(OnChar)
+
+PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDblClk)
+PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonDown)
+PWL_IMPLEMENT_MOUSE_METHOD(OnLButtonUp)
+PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDblClk)
+PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonDown)
+PWL_IMPLEMENT_MOUSE_METHOD(OnMButtonUp)
+PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDblClk)
+PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonDown)
+PWL_IMPLEMENT_MOUSE_METHOD(OnRButtonUp)
+PWL_IMPLEMENT_MOUSE_METHOD(OnMouseMove)
+
+FX_BOOL CPWL_Wnd::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
+{
+ if (IsValid() && IsVisible() && IsEnabled())
+ {
+ SetCursor();
+ if (IsWndCaptureKeyboard(this))
+ {
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd * pChild = m_aChildren.GetAt(i))
+ {
+ if (IsWndCaptureKeyboard(pChild))
+ {
+ return pChild->OnMouseWheel(zDelta,pChild->ParentToChild(point), nFlag);
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+void CPWL_Wnd::AddChild(CPWL_Wnd * pWnd)
+{
+ m_aChildren.Add(pWnd);
+}
+
+void CPWL_Wnd::RemoveChild(CPWL_Wnd * pWnd)
+{
+ for (FX_INT32 i = m_aChildren.GetSize()-1; i >= 0; i --)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ if (pChild == pWnd)
+ {
+ m_aChildren.RemoveAt(i);
+ break;
+ }
+ }
+ }
+}
+
+void CPWL_Wnd::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
+{
+ switch (msg)
+ {
+ case PNM_ADDCHILD:
+ this->AddChild(pWnd);
+ break;
+ case PNM_REMOVECHILD:
+ this->RemoveChild(pWnd);
+ break;
+ default:
+ break;
+ }
+}
+
+FX_BOOL CPWL_Wnd::IsValid() const
+{
+ return m_bCreated;
+}
+
+PWL_CREATEPARAM CPWL_Wnd::GetCreationParam() const
+{
+ return m_sPrivateParam;
+}
+
+CPWL_Wnd* CPWL_Wnd::GetParentWindow() const
+{
+ return m_sPrivateParam.pParentWnd;
+}
+
+CPDF_Rect CPWL_Wnd::GetOriginWindowRect() const
+{
+ return m_sPrivateParam.rcRectWnd;
+}
+
+CPDF_Rect CPWL_Wnd::GetWindowRect() const
+{
+ return m_rcWindow;
+}
+
+CPDF_Rect CPWL_Wnd::GetClientRect() const
+{
+ CPDF_Rect rcWindow = GetWindowRect();
+ CPDF_Rect rcClient = CPWL_Utils::DeflateRect(rcWindow,(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ if (CPWL_ScrollBar * pVSB = this->GetVScrollBar())
+ rcClient.right -= pVSB->GetScrollBarWidth();
+
+ rcClient.Normalize();
+
+ if (rcWindow.Contains(rcClient))
+ return rcClient;
+ else
+ return CPDF_Rect();
+}
+
+CPDF_Point CPWL_Wnd::GetCenterPoint() const
+{
+ CPDF_Rect rcClient = GetClientRect();
+
+ return CPDF_Point((rcClient.left + rcClient.right) * 0.5f,
+ (rcClient.top + rcClient.bottom) * 0.5f);
+}
+
+CPDF_Rect CPWL_Wnd::GetClientCenterSquare() const
+{
+ return CPWL_Utils::GetCenterSquare(GetClientRect());
+}
+
+CPDF_Rect CPWL_Wnd::GetWindowCenterSquare() const
+{
+ return CPWL_Utils::GetCenterSquare(CPWL_Utils::DeflateRect(GetWindowRect(),0.1f));
+}
+
+FX_BOOL CPWL_Wnd::HasFlag(FX_DWORD dwFlags) const
+{
+ return (m_sPrivateParam.dwFlags & dwFlags) != 0;
+}
+
+void CPWL_Wnd::RemoveFlag(FX_DWORD dwFlags)
+{
+ m_sPrivateParam.dwFlags &= ~dwFlags;
+}
+
+void CPWL_Wnd::AddFlag(FX_DWORD dwFlags)
+{
+ m_sPrivateParam.dwFlags |= dwFlags;
+}
+
+CPWL_Color CPWL_Wnd::GetBackgroundColor() const
+{
+ return m_sPrivateParam.sBackgroundColor;
+}
+
+void CPWL_Wnd::SetBackgroundColor(const CPWL_Color & color)
+{
+ m_sPrivateParam.sBackgroundColor = color;
+}
+
+void CPWL_Wnd::SetTextColor(const CPWL_Color & color)
+{
+ m_sPrivateParam.sTextColor = color;
+}
+
+void CPWL_Wnd::SetTextStrokeColor(const CPWL_Color & color)
+{
+ m_sPrivateParam.sTextStrokeColor = color;
+}
+
+CPWL_Color CPWL_Wnd::GetTextColor() const
+{
+ return m_sPrivateParam.sTextColor;
+}
+
+CPWL_Color CPWL_Wnd::GetTextStrokeColor() const
+{
+ return m_sPrivateParam.sTextStrokeColor;
+}
+
+FX_INT32 CPWL_Wnd::GetBorderStyle() const
+{
+ return m_sPrivateParam.nBorderStyle;
+}
+
+void CPWL_Wnd::SetBorderStyle(FX_INT32 nBorderStyle)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.nBorderStyle = nBorderStyle;
+}
+
+FX_INT32 CPWL_Wnd::GetBorderWidth() const
+{
+ if (HasFlag(PWS_BORDER))
+ return m_sPrivateParam.dwBorderWidth;
+
+ return 0;
+}
+
+FX_INT32 CPWL_Wnd::GetInnerBorderWidth() const
+{
+ /*
+ switch (GetBorderStyle())
+ {
+ case PBS_BEVELED:
+ case PBS_INSET:
+ return GetBorderWidth() / 2;
+ }
+ */
+ return 0;
+}
+
+void CPWL_Wnd::SetBorderWidth(FX_INT32 nBorderWidth)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.dwBorderWidth = nBorderWidth;
+}
+
+CPWL_Color CPWL_Wnd::GetBorderColor() const
+{
+ if (HasFlag(PWS_BORDER))
+ return m_sPrivateParam.sBorderColor;
+
+ return CPWL_Color();
+}
+
+void CPWL_Wnd::SetBorderColor(const CPWL_Color & color)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.sBorderColor = color;
+}
+
+CPWL_Dash CPWL_Wnd::GetBorderDash() const
+{
+ return m_sPrivateParam.sDash;
+}
+
+void* CPWL_Wnd::GetAttachedData() const
+{
+ return m_sPrivateParam.pAttachedData;
+}
+
+void CPWL_Wnd::SetBorderDash(const CPWL_Dash & sDash)
+{
+ if (HasFlag(PWS_BORDER))
+ m_sPrivateParam.sDash = sDash;
+}
+
+CPWL_ScrollBar* CPWL_Wnd::GetVScrollBar() const
+{
+ if (HasFlag(PWS_VSCROLL))
+ return m_pVScrollBar;
+
+ return NULL;
+}
+
+void CPWL_Wnd::CreateScrollBar(const PWL_CREATEPARAM & cp)
+{
+ CreateVScrollBar(cp);
+}
+
+void CPWL_Wnd::CreateVScrollBar(const PWL_CREATEPARAM & cp)
+{
+ if (!m_pVScrollBar && HasFlag(PWS_VSCROLL))
+ {
+ PWL_CREATEPARAM scp = cp;
+
+ //flags
+ scp.dwFlags = PWS_CHILD| PWS_BACKGROUND | PWS_AUTOTRANSPARENT | PWS_NOREFRESHCLIP;
+
+ scp.pParentWnd = this;
+ scp.sBackgroundColor = PWL_DEFAULT_WHITECOLOR;
+ scp.eCursorType = FXCT_ARROW;
+ scp.nTransparency = PWL_SCROLLBAR_TRANSPARANCY;
+
+ if ((m_pVScrollBar = new CPWL_ScrollBar(SBT_VSCROLL)))
+ m_pVScrollBar->Create(scp);
+ }
+}
+
+void CPWL_Wnd::SetCapture()
+{
+ if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+ pMsgCtrl->SetCapture(this);
+}
+
+void CPWL_Wnd::ReleaseCapture()
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ pChild->ReleaseCapture();
+
+ if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+ pMsgCtrl->ReleaseCapture();
+}
+
+void CPWL_Wnd::SetFocus()
+{
+ if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+ {
+ if (!pMsgCtrl->IsMainCaptureKeyboard(this))
+ pMsgCtrl->KillFocus();
+ pMsgCtrl->SetFocus(this);
+ }
+}
+
+void CPWL_Wnd::KillFocus()
+{
+ if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+ {
+ if (pMsgCtrl->IsWndCaptureKeyboard(this))
+ pMsgCtrl->KillFocus();
+ }
+}
+
+void CPWL_Wnd::OnSetFocus()
+{
+}
+
+void CPWL_Wnd::OnKillFocus()
+{
+}
+
+FX_BOOL CPWL_Wnd::WndHitTest(const CPDF_Point & point) const
+{
+ return IsValid() && IsVisible() && GetWindowRect().Contains(point.x,point.y);
+}
+
+FX_BOOL CPWL_Wnd::ClientHitTest(const CPDF_Point & point) const
+{
+ return IsValid() && IsVisible() && GetClientRect().Contains(point.x,point.y);
+}
+
+const CPWL_Wnd * CPWL_Wnd::GetRootWnd() const
+{
+ if (m_sPrivateParam.pParentWnd)
+ return m_sPrivateParam.pParentWnd->GetRootWnd();
+ else
+ return this;
+}
+
+void CPWL_Wnd::SetVisible(FX_BOOL bVisible)
+{
+ if (IsValid())
+ {
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ pChild->SetVisible(bVisible);
+ }
+ }
+
+ if (bVisible != m_bVisible)
+ {
+ m_bVisible = bVisible;
+ RePosChildWnd();
+ InvalidateRect();
+ }
+ }
+}
+
+void CPWL_Wnd::SetClipRect(const CPDF_Rect & rect)
+{
+ m_rcClip = rect;
+ m_rcClip.Normalize();
+}
+
+CPDF_Rect CPWL_Wnd::GetClipRect() const
+{
+ return m_rcClip;
+}
+
+FX_BOOL CPWL_Wnd::IsReadOnly() const
+{
+ return HasFlag(PWS_READONLY);
+}
+
+void CPWL_Wnd::RePosChildWnd()
+{
+ CPDF_Rect rcContent = CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
+
+ CPWL_ScrollBar * pVSB = this->GetVScrollBar();
+
+ CPDF_Rect rcVScroll = CPDF_Rect(rcContent.right - PWL_SCROLLBAR_WIDTH,
+ rcContent.bottom,
+ rcContent.right-1.0f,
+ rcContent.top);
+
+ if (pVSB) pVSB->Move(rcVScroll,TRUE,FALSE);
+}
+
+void CPWL_Wnd::CreateChildWnd(const PWL_CREATEPARAM & cp)
+{
+}
+
+void CPWL_Wnd::SetCursor()
+{
+ if (IsValid())
+ {
+ if (IFX_SystemHandler* pSH = GetSystemHandler())
+ {
+ FX_INT32 nCursorType = this->GetCreationParam().eCursorType;
+ pSH->SetCursor(nCursorType);
+ }
+ }
+}
+
+void CPWL_Wnd::CreateMsgControl()
+{
+ if (!m_sPrivateParam.pMsgControl)
+ m_sPrivateParam.pMsgControl = new CPWL_MsgControl(this);
+}
+
+void CPWL_Wnd::DestroyMsgControl()
+{
+ if (CPWL_MsgControl* pMsgControl = GetMsgControl())
+ if (pMsgControl->IsWndCreated(this))
+ delete pMsgControl;
+}
+
+CPWL_MsgControl* CPWL_Wnd::GetMsgControl() const
+{
+ return m_sPrivateParam.pMsgControl;
+}
+
+FX_BOOL CPWL_Wnd::IsCaptureMouse() const
+{
+ return IsWndCaptureMouse(this);
+}
+
+FX_BOOL CPWL_Wnd::IsWndCaptureMouse(const CPWL_Wnd * pWnd) const
+{
+ if (CPWL_MsgControl * pCtrl = GetMsgControl())
+ return pCtrl->IsWndCaptureMouse(pWnd);
+
+ return FALSE;
+}
+
+FX_BOOL CPWL_Wnd::IsWndCaptureKeyboard(const CPWL_Wnd * pWnd) const
+{
+ if (CPWL_MsgControl * pCtrl = GetMsgControl())
+ return pCtrl->IsWndCaptureKeyboard(pWnd);
+
+ return FALSE;
+}
+
+FX_BOOL CPWL_Wnd::IsFocused() const
+{
+ if (CPWL_MsgControl * pCtrl = GetMsgControl())
+ return pCtrl->IsMainCaptureKeyboard(this);
+
+ return FALSE;
+}
+
+CPDF_Rect CPWL_Wnd::GetFocusRect() const
+{
+ return CPWL_Utils::InflateRect(this->GetWindowRect(),1);
+}
+
+FX_FLOAT CPWL_Wnd::GetFontSize() const
+{
+ return this->m_sPrivateParam.fFontSize;
+}
+
+void CPWL_Wnd::SetFontSize(FX_FLOAT fFontSize)
+{
+ this->m_sPrivateParam.fFontSize = fFontSize;
+}
+
+IFX_SystemHandler* CPWL_Wnd::GetSystemHandler() const
+{
+ return m_sPrivateParam.pSystemHandler;
+}
+
+IPWL_FocusHandler* CPWL_Wnd::GetFocusHandler() const
+{
+ return m_sPrivateParam.pFocusHandler;
+}
+
+IPWL_Provider* CPWL_Wnd::GetProvider() const
+{
+ return m_sPrivateParam.pProvider;
+}
+
+IFX_Edit_FontMap* CPWL_Wnd::GetFontMap() const
+{
+ return m_sPrivateParam.pFontMap;
+}
+
+CPWL_Color CPWL_Wnd::GetBorderLeftTopColor(FX_INT32 nBorderStyle) const
+{
+ CPWL_Color color;
+
+ switch (nBorderStyle)
+ {
+ case PBS_SOLID:
+ break;
+ case PBS_DASH:
+ break;
+ case PBS_BEVELED:
+ color = CPWL_Color(COLORTYPE_GRAY,1);
+ break;
+ case PBS_INSET:
+ color = CPWL_Color(COLORTYPE_GRAY,0.5f);
+ break;
+ case PBS_UNDERLINED:
+ break;
+ }
+
+ return color;
+}
+
+CPWL_Color CPWL_Wnd::GetBorderRightBottomColor(FX_INT32 nBorderStyle) const
+{
+ CPWL_Color color;
+
+ switch (nBorderStyle)
+ {
+ case PBS_SOLID:
+ break;
+ case PBS_DASH:
+ break;
+ case PBS_BEVELED:
+ color = CPWL_Utils::DevideColor(GetBackgroundColor(),2);
+ break;
+ case PBS_INSET:
+ color = CPWL_Color(COLORTYPE_GRAY,0.75f);
+ break;
+ case PBS_UNDERLINED:
+ break;
+ }
+
+ return color;
+}
+
+/* ----------------------------------------------------------------- */
+
+FX_INT32 CPWL_Wnd::GetTransparency()
+{
+ return m_sPrivateParam.nTransparency;
+}
+
+void CPWL_Wnd::SetTransparency(FX_INT32 nTransparency)
+{
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ pChild->SetTransparency(nTransparency);
+ }
+ }
+
+ m_sPrivateParam.nTransparency = nTransparency;
+}
+
+CPDF_Matrix CPWL_Wnd::GetWindowMatrix() const
+{
+ CPDF_Matrix mt = this->GetChildToRoot();
+
+ if (IPWL_Provider* pProvider = GetProvider())
+ {
+ mt.Concat(pProvider->GetWindowMatrix(GetAttachedData()));
+ return mt;
+ }
+
+/*
+ if (CReader_App* pApp = CPWL_Module::GetReaderApp())
+ if (CReader_Document* pDocument = pApp->GetCurrentDocument())
+ if (CReader_DocView* pDocView = pDocument->GetCurrentDocView())
+ {
+ CPDF_Matrix mtPageView;
+ pDocView->GetCurrentMatrix(mtPageView);
+ mt.Concat(mtPageView);
+ return mt;
+ }
+
+*/
+
+ return mt;
+}
+
+void CPWL_Wnd::PWLtoWnd(const CPDF_Point& point, FX_INT32& x, FX_INT32& y) const
+{
+ CPDF_Matrix mt = GetWindowMatrix();
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ x = (FX_INT32)(pt.x+0.5);
+ y = (FX_INT32)(pt.y+0.5);
+}
+
+FX_RECT CPWL_Wnd::PWLtoWnd(const CPDF_Rect & rect) const
+{
+ CPDF_Rect rcTemp = rect;
+ CPDF_Matrix mt = GetWindowMatrix();
+ mt.TransformRect(rcTemp);
+ return FX_RECT((FX_INT32)(rcTemp.left+0.5), (FX_INT32)(rcTemp.bottom+0.5), (FX_INT32)(rcTemp.right+0.5), (FX_INT32)(rcTemp.top+0.5));
+}
+
+FX_HWND CPWL_Wnd::GetAttachedHWnd() const
+{
+ return m_sPrivateParam.hAttachedWnd;
+}
+
+CPDF_Point CPWL_Wnd::ChildToParent(const CPDF_Point& point) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return point;
+ else
+ {
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ return pt;
+ }
+}
+
+CPDF_Rect CPWL_Wnd::ChildToParent(const CPDF_Rect& rect) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return rect;
+ else
+ {
+ CPDF_Rect rc = rect;
+ mt.TransformRect(rc);
+ return rc;
+ }
+}
+
+CPDF_Point CPWL_Wnd::ParentToChild(const CPDF_Point& point) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return point;
+ else
+ {
+ mt.SetReverse(mt);
+ CPDF_Point pt = point;
+ mt.Transform(pt.x,pt.y);
+ return pt;
+ }
+}
+
+CPDF_Rect CPWL_Wnd::ParentToChild(const CPDF_Rect& rect) const
+{
+ CPDF_Matrix mt = GetChildMatrix();
+ if (mt.IsIdentity())
+ return rect;
+ else
+ {
+ mt.SetReverse(mt);
+ CPDF_Rect rc = rect;
+ mt.TransformRect(rc);
+ return rc;
+ }
+}
+
+CPDF_Matrix CPWL_Wnd::GetChildToRoot() const
+{
+ CPDF_Matrix mt(1,0,0,1,0,0);
+
+ if (HasFlag(PWS_CHILD))
+ {
+ const CPWL_Wnd* pParent = this;
+ while (pParent)
+ {
+ mt.Concat(pParent->GetChildMatrix());
+ pParent = pParent->GetParentWindow();
+ }
+ }
+
+ return mt;
+}
+
+CPDF_Matrix CPWL_Wnd::GetChildMatrix() const
+{
+ if (HasFlag(PWS_CHILD))
+ return m_sPrivateParam.mtChild;
+
+ return CPDF_Matrix(1,0,0,1,0,0);
+}
+
+void CPWL_Wnd::SetChildMatrix(const CPDF_Matrix& mt)
+{
+ m_sPrivateParam.mtChild = mt;
+}
+
+const CPWL_Wnd* CPWL_Wnd::GetFocused() const
+{
+ if (CPWL_MsgControl * pMsgCtrl = GetMsgControl())
+ {
+ return pMsgCtrl->m_pMainKeyboardWnd;
+ }
+
+ return NULL;
+}
+
+void CPWL_Wnd::EnableWindow(FX_BOOL bEnable)
+{
+ if (m_bEnabled != bEnable)
+ {
+ for (FX_INT32 i=0,sz=m_aChildren.GetSize(); i<sz; i++)
+ {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i))
+ {
+ pChild->EnableWindow(bEnable);
+ }
+ }
+
+ this->m_bEnabled = bEnable;
+
+ if (bEnable)
+ this->OnEnabled();
+ else
+ this->OnDisabled();
+ }
+}
+
+FX_BOOL CPWL_Wnd::IsEnabled()
+{
+ return m_bEnabled;
+}
+
+void CPWL_Wnd::OnEnabled()
+{
+}
+
+void CPWL_Wnd::OnDisabled()
+{
+}
+
+FX_BOOL CPWL_Wnd::IsCTRLpressed(FX_DWORD nFlag) const
+{
+ if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+ {
+ return pSystemHandler->IsCTRLKeyDown(nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPWL_Wnd::IsSHIFTpressed(FX_DWORD nFlag) const
+{
+ if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+ {
+ return pSystemHandler->IsSHIFTKeyDown(nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPWL_Wnd::IsALTpressed(FX_DWORD nFlag) const
+{
+ if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+ {
+ return pSystemHandler->IsALTKeyDown(nFlag);
+ }
+
+ return FALSE;
+}
+
+FX_BOOL CPWL_Wnd::IsINSERTpressed(FX_DWORD nFlag) const
+{
+ if (IFX_SystemHandler* pSystemHandler = GetSystemHandler())
+ {
+ return pSystemHandler->IsINSERTKeyDown(nFlag);
+ }
+
+ return FALSE;
+}
+
diff --git a/fpdfsdk/src/resource.h b/fpdfsdk/src/resource.h
new file mode 100644
index 0000000000..e97d1d5451
--- /dev/null
+++ b/fpdfsdk/src/resource.h
@@ -0,0 +1,21 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by fpdfsdkdll.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 104
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/pdfium.gyp b/pdfium.gyp
new file mode 100644
index 0000000000..c5d01da45c
--- /dev/null
+++ b/pdfium.gyp
@@ -0,0 +1,850 @@
+{
+ 'variables': {
+ 'win_third_party_warn_as_error': 'false',
+ 'pdf_use_skia%': 0,
+ },
+ 'target_defaults': {
+ 'defines' : [
+ 'FOXIT_CHROME_BUILD',
+ '_FXFT_VERSION_=2501',
+ '_FPDFSDK_LIB',
+ '_NO_GDIPLUS_', # workaround text rendering issues on Windows
+ ],
+ 'conditions': [
+ ['pdf_use_skia==1', {
+ 'defines': ['_SKIA_SUPPORT_'],
+ }],
+ ['OS=="linux"', {
+ 'cflags!': [
+ '-fno-exceptions',
+ ],
+ 'conditions': [
+ ['target_arch=="x64"', {
+ 'defines' : [
+ '_FX_CPU_=_FX_X64_',
+ ],
+ 'cflags': [
+ '-fPIC',
+ ],
+ }],
+ ['target_arch=="ia32"', {
+ 'defines' : [
+ '_FX_CPU_=_FX_X86_',
+ ],
+ }],
+ ],
+ }],
+ ['OS=="mac"', {
+ 'xcode_settings': {
+ 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
+ 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO', # -Werror
+ },
+ }],
+ ['clang==1', {
+ 'cflags!': [
+ '-Werror',
+ ],
+ }],
+ ],
+ 'msvs_disabled_warnings': [
+ 4005, 4018, 4146, 4333, 4345
+ ],
+ },
+ 'targets': [
+ {
+ 'target_name': 'fpdfsdk',
+ 'type': 'static_library',
+ 'dependencies': [
+ 'fdrm',
+ 'fpdfdoc',
+ 'fpdfapi',
+ 'fpdftext',
+ 'formfiller',
+ 'fxcodec',
+ 'fxcrt',
+ 'fxedit',
+ 'fxge',
+ 'javascript',
+ 'jsapi',
+ 'pdfwindow',
+ ],
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/fpdfdoc.h',
+ 'fpdfsdk/include/fpdfedit.h',
+ 'fpdfsdk/include/fpdfformfill.h',
+ 'fpdfsdk/include/fpdfoom.h',
+ 'fpdfsdk/include/fpdftext.h',
+ 'fpdfsdk/include/fpdfview.h',
+ 'fpdfsdk/include/fpdf_dataavail.h',
+ 'fpdfsdk/include/fpdf_flatten.h',
+ 'fpdfsdk/include/fpdf_progressive.h',
+ 'fpdfsdk/include/fpdf_searchex.h',
+ 'fpdfsdk/include/fpdf_sysfontinfo.h',
+ 'fpdfsdk/include/fpdf_ext.h',
+ 'fpdfsdk/include/fpdf_sysfontinfo.h',
+ 'fpdfsdk/include/fsdk_actionhandler.h',
+ 'fpdfsdk/include/fsdk_annothandler.h',
+ 'fpdfsdk/include/fsdk_baseannot.h',
+ 'fpdfsdk/include/fsdk_baseform.h',
+ 'fpdfsdk/src/fpdfdoc.cpp',
+ 'fpdfsdk/src/fpdfeditimg.cpp',
+ 'fpdfsdk/src/fpdfeditpage.cpp',
+ 'fpdfsdk/src/fpdfformfill.cpp',
+ 'fpdfsdk/src/fpdfoom.cpp',
+ 'fpdfsdk/src/fpdfppo.cpp',
+ 'fpdfsdk/src/fpdfsave.cpp',
+ 'fpdfsdk/src/fpdftext.cpp',
+ 'fpdfsdk/src/fpdfview.cpp',
+ 'fpdfsdk/src/fpdf_dataavail.cpp',
+ 'fpdfsdk/src/fpdf_ext.cpp',
+ 'fpdfsdk/src/fpdf_flatten.cpp',
+ 'fpdfsdk/src/fpdf_progressive.cpp',
+ 'fpdfsdk/src/fpdf_searchex.cpp',
+ 'fpdfsdk/src/fpdf_sysfontinfo.cpp',
+ 'fpdfsdk/src/fsdk_actionhandler.cpp',
+ 'fpdfsdk/src/fsdk_annothandler.cpp',
+ 'fpdfsdk/src/fsdk_baseannot.cpp',
+ 'fpdfsdk/src/fsdk_baseform.cpp',
+ 'fpdfsdk/src/fsdk_mgr.cpp',
+ 'fpdfsdk/src/fsdk_rendercontext.cpp',
+ 'fpdfsdk/src/fpdfsdkdll.rc',
+ 'fpdfsdk/src/resource.h',
+ 'fpdfsdk/include/fpdf_transformpage.h',
+ 'fpdfsdk/src/fpdf_transformpage.cpp',
+ ],
+ 'conditions': [
+ ['OS!="win"', {
+ 'sources!': [
+ 'fpdfsdk/src/fpdfsdkdll.rc',
+ ],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'fdrm',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fdrm/fx_crypt.h',
+ 'core/src/fdrm/crypto/fx_crypt.cpp',
+ 'core/src/fdrm/crypto/fx_crypt_aes.cpp',
+ 'core/src/fdrm/crypto/fx_crypt_sha.cpp',
+ ],
+ },
+ {
+ 'target_name': 'fpdfdoc',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fpdfdoc/fpdf_ap.h',
+ 'core/include/fpdfdoc/fpdf_doc.h',
+ 'core/include/fpdfdoc/fpdf_tagged.h',
+ 'core/include/fpdfdoc/fpdf_vt.h',
+ 'core/src/fpdfdoc/doc_action.cpp',
+ 'core/src/fpdfdoc/doc_annot.cpp',
+ 'core/src/fpdfdoc/doc_ap.cpp',
+ 'core/src/fpdfdoc/doc_basic.cpp',
+ 'core/src/fpdfdoc/doc_bookmark.cpp',
+ 'core/src/fpdfdoc/doc_form.cpp',
+ 'core/src/fpdfdoc/doc_formcontrol.cpp',
+ 'core/src/fpdfdoc/doc_formfield.cpp',
+ 'core/src/fpdfdoc/doc_link.cpp',
+ 'core/src/fpdfdoc/doc_metadata.cpp',
+ 'core/src/fpdfdoc/doc_ocg.cpp',
+ 'core/src/fpdfdoc/doc_tagged.cpp',
+ 'core/src/fpdfdoc/doc_utils.cpp',
+ 'core/src/fpdfdoc/doc_viewerPreferences.cpp',
+ 'core/src/fpdfdoc/doc_vt.cpp',
+ 'core/src/fpdfdoc/doc_vtmodule.cpp',
+ 'core/src/fpdfdoc/pdf_vt.h',
+ 'core/src/fpdfdoc/tagged_int.h',
+ ],
+ },
+ {
+ 'target_name': 'fpdfapi',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fpdfapi/fpdfapi.h',
+ 'core/include/fpdfapi/fpdf_module.h',
+ 'core/include/fpdfapi/fpdf_objects.h',
+ 'core/include/fpdfapi/fpdf_page.h',
+ 'core/include/fpdfapi/fpdf_pageobj.h',
+ 'core/include/fpdfapi/fpdf_parser.h',
+ 'core/include/fpdfapi/fpdf_render.h',
+ 'core/include/fpdfapi/fpdf_resource.h',
+ 'core/include/fpdfapi/fpdf_serial.h',
+ 'core/src/fpdfapi/fpdf_basic_module.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/cmap_int.h',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/Adobe-CNS1-UCS2_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/B5pc-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/cmaps_cns1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/CNS-EUC-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/ETen-B5-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/ETenms-B5-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-H_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/HKscs-B5-V_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-H_3.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UCS2-V_3.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/CNS1/UniCNS-UTF16-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/Adobe-GB1-UCS2_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/cmaps_gb1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GB-EUC-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-H_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBK-EUC-V_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-H_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBK2K-V_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-H_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBKp-EUC-V_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/GBpc-EUC-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-H_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/GB1/UniGB-UCS2-V_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/83pv-RKSJ-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-H_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/90ms-RKSJ-V_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-H_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/90msp-RKSJ-V_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/90pv-RKSJ-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/Add-RKSJ-V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/Adobe-Japan1-UCS2_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/cmaps_japan1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/EUC-V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-H_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/Ext-RKSJ-V_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-H_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-HW-V_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-H_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UCS2-V_4.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-H_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/UniJIS-UTF16-V_5.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Japan1/V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/Adobe-Korea1-UCS2_2.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/cmaps_korea1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSC-EUC-V_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-HW-V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCms-UHC-V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/KSCpc-EUC-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-H_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UCS2-V_1.cpp',
+ 'core/src/fpdfapi/fpdf_cmaps/Korea1/UniKS-UTF16-H_0.cpp',
+ 'core/src/fpdfapi/fpdf_edit/editint.h',
+ 'core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp',
+ 'core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp',
+ 'core/src/fpdfapi/fpdf_edit/fpdf_edit_doc.cpp',
+ 'core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp',
+ 'core/src/fpdfapi/fpdf_font/common.h',
+ 'core/src/fpdfapi/fpdf_font/font_int.h',
+ 'core/src/fpdfapi/fpdf_font/fpdf_font.cpp',
+ 'core/src/fpdfapi/fpdf_font/fpdf_font_charset.cpp',
+ 'core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp',
+ 'core/src/fpdfapi/fpdf_font/fpdf_font_utility.cpp',
+ 'core/src/fpdfapi/fpdf_font/ttgsubtable.cpp',
+ 'core/src/fpdfapi/fpdf_font/ttgsubtable.h',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_func.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_graph_state.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_image.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_parser_new.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_path.cpp',
+ 'core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp',
+ 'core/src/fpdfapi/fpdf_page/pageint.h',
+ 'core/src/fpdfapi/fpdf_parser/filters_int.h',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_document.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_encrypt.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_fdf.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_filters.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp',
+ 'core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render_cache.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render_loadimage.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render_pattern.cpp',
+ 'core/src/fpdfapi/fpdf_render/fpdf_render_text.cpp',
+ 'core/src/fpdfapi/fpdf_render/render_int.h',
+ ],
+ },
+ {
+ 'target_name': 'fpdftext',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fpdftext/fpdf_text.h',
+ 'core/src/fpdftext/fpdf_text.cpp',
+ 'core/src/fpdftext/fpdf_text_int.cpp',
+ 'core/src/fpdftext/fpdf_text_search.cpp',
+ 'core/src/fpdftext/text_int.h',
+ 'core/src/fpdftext/txtproc.h',
+ 'core/src/fpdftext/unicodenormalization.cpp',
+ 'core/src/fpdftext/unicodenormalizationdata.cpp',
+ ],
+ },
+ {
+ 'target_name': 'fxcodec',
+ 'type': 'static_library',
+ 'include_dirs': [
+ ],
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fxcodec/fx_codec.h',
+ 'core/include/fxcodec/fx_codec_def.h',
+ 'core/include/fxcodec/fx_codec_provider.h',
+ 'core/src/fxcodec/codec/codec_int.h',
+ 'core/src/fxcodec/codec/fx_codec.cpp',
+ 'core/src/fxcodec/codec/fx_codec_fax.cpp',
+ 'core/src/fxcodec/codec/fx_codec_flate.cpp',
+ 'core/src/fxcodec/codec/fx_codec_icc.cpp',
+ 'core/src/fxcodec/codec/fx_codec_jbig.cpp',
+ 'core/src/fxcodec/codec/fx_codec_jbig_enc.cpp',
+ 'core/src/fxcodec/codec/fx_codec_jpeg.cpp',
+ 'core/src/fxcodec/codec/fx_codec_jpx_opj.cpp',
+ 'core/src/fxcodec/fx_libopenjpeg/include/fx_openjpeg.h',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_bio.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_cio.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_dwt.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_event.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_function_list.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_image.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_invert.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_j2k.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_j2k_lib.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_jpt.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_mct.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_mqc.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_openjpeg_jp2.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_opj_clock.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_pi.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_raw.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_t1.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_t1_generate_luts.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_t2.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_tcd.c',
+ 'core/src/fxcodec/fx_libopenjpeg/src/fx_tgt.c',
+ 'core/src/fxcodec/fx_zlib/include/fx_zlib.h',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_adler32.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_compress.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_crc32.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_deflate.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_gzclose.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_gzlib.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_gzread.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_gzwrite.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_infback.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_inffast.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_inflate.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_inftrees.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_trees.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_uncompr.c',
+ 'core/src/fxcodec/fx_zlib/src/fx_zlib_zutil.c',
+ 'core/src/fxcodec/jbig2/JBig2_ArithDecoder.h',
+ 'core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_ArithIntDecoder.h',
+ 'core/src/fxcodec/jbig2/JBig2_ArithQe.h',
+ 'core/src/fxcodec/jbig2/JBig2_BitStream.h',
+ 'core/src/fxcodec/jbig2/JBig2_Context.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_Context.h',
+ 'core/src/fxcodec/jbig2/JBig2_Define.h',
+ 'core/src/fxcodec/jbig2/JBig2_GeneralDecoder.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_GeneralDecoder.h',
+ 'core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_HuffmanDecoder.h',
+ 'core/src/fxcodec/jbig2/JBig2_HuffmanTable.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_HuffmanTable.h',
+ 'core/src/fxcodec/jbig2/JBig2_HuffmanTable_Standard.h',
+ 'core/src/fxcodec/jbig2/JBig2_Image.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_Image.h',
+ 'core/src/fxcodec/jbig2/JBig2_List.h',
+ 'core/src/fxcodec/jbig2/JBig2_Module.h',
+ 'core/src/fxcodec/jbig2/JBig2_Object.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_Object.h',
+ 'core/src/fxcodec/jbig2/JBig2_Page.h',
+ 'core/src/fxcodec/jbig2/JBig2_PatternDict.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_PatternDict.h',
+ 'core/src/fxcodec/jbig2/JBig2_Segment.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_Segment.h',
+ 'core/src/fxcodec/jbig2/JBig2_SymbolDict.cpp',
+ 'core/src/fxcodec/jbig2/JBig2_SymbolDict.h',
+ 'core/src/fxcodec/lcms2/src/fx_cmscam02.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmscgats.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmscnvrt.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmserr.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsgamma.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsgmt.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmshalf.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsintrp.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsio0.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsio1.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmslut.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsmd5.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsmtrx.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsnamed.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsopt.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmspack.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmspcs.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsplugin.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsps2.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmssamp.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmssm.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmstypes.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsvirt.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmswtpnt.c',
+ 'core/src/fxcodec/lcms2/src/fx_cmsxform.c',
+ 'core/src/fxcodec/libjpeg/cderror.h',
+ 'core/src/fxcodec/libjpeg/cdjpeg.h',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcapimin.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcapistd.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jccoefct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jccolor.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcdctmgr.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jchuff.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcinit.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcmainct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcmarker.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcmaster.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcomapi.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcparam.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcphuff.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcprepct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jcsample.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jctrans.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdapimin.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdapistd.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdcoefct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdcolor.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jddctmgr.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdhuff.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdinput.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdmainct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdmarker.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdmaster.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdmerge.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdphuff.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdpostct.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdsample.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jdtrans.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jerror.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jfdctfst.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jfdctint.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jidctfst.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jidctint.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jidctred.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jmemmgr.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jmemnobs.c',
+ 'core/src/fxcodec/libjpeg/fpdfapi_jutils.c',
+ 'core/src/fxcodec/libjpeg/jchuff.h',
+ 'core/src/fxcodec/libjpeg/jconfig.h',
+ 'core/src/fxcodec/libjpeg/jdct.h',
+ 'core/src/fxcodec/libjpeg/jdhuff.h',
+ 'core/src/fxcodec/libjpeg/jerror.h',
+ 'core/src/fxcodec/libjpeg/jinclude.h',
+ 'core/src/fxcodec/libjpeg/jmemsys.h',
+ 'core/src/fxcodec/libjpeg/jmorecfg.h',
+ 'core/src/fxcodec/libjpeg/jpegint.h',
+ 'core/src/fxcodec/libjpeg/jpeglib.h',
+ 'core/src/fxcodec/libjpeg/jversion.h',
+ 'core/src/fxcodec/libjpeg/makefile',
+ 'core/src/fxcodec/libjpeg/transupp.h',
+ ],
+ },
+ {
+ 'target_name': 'fxcrt',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fxcrt/fx_arb.h',
+ 'core/include/fxcrt/fx_basic.h',
+ 'core/include/fxcrt/fx_coordinates.h',
+ 'core/include/fxcrt/fx_ext.h',
+ 'core/include/fxcrt/fx_fix.h',
+ 'core/include/fxcrt/fx_memory.h',
+ 'core/include/fxcrt/fx_stream.h',
+ 'core/include/fxcrt/fx_string.h',
+ 'core/include/fxcrt/fx_system.h',
+ 'core/include/fxcrt/fx_ucd.h',
+ 'core/include/fxcrt/fx_xml.h',
+ 'core/src/fxcrt/extension.h',
+ 'core/src/fxcrt/fxcrt_platforms.cpp',
+ 'core/src/fxcrt/fxcrt_platforms.h',
+ 'core/src/fxcrt/fxcrt_posix.cpp',
+ 'core/src/fxcrt/fxcrt_posix.h',
+ 'core/src/fxcrt/fxcrt_windows.cpp',
+ 'core/src/fxcrt/fxcrt_windows.h',
+ 'core/src/fxcrt/fx_arabic.cpp',
+ 'core/src/fxcrt/fx_arabic.h',
+ 'core/src/fxcrt/fx_basic_array.cpp',
+ 'core/src/fxcrt/fx_basic_bstring.cpp',
+ 'core/src/fxcrt/fx_basic_buffer.cpp',
+ 'core/src/fxcrt/fx_basic_coords.cpp',
+ 'core/src/fxcrt/fx_basic_gcc.cpp',
+ 'core/src/fxcrt/fx_basic_list.cpp',
+ 'core/src/fxcrt/fx_basic_maps.cpp',
+ 'core/src/fxcrt/fx_basic_memmgr.cpp',
+ 'core/src/fxcrt/fx_basic_memmgr_mini.cpp',
+ 'core/src/fxcrt/fx_basic_plex.cpp',
+ 'core/src/fxcrt/fx_basic_utf.cpp',
+ 'core/src/fxcrt/fx_basic_util.cpp',
+ 'core/src/fxcrt/fx_basic_wstring.cpp',
+ 'core/src/fxcrt/fx_extension.cpp',
+ 'core/src/fxcrt/fx_ucddata.cpp',
+ 'core/src/fxcrt/fx_unicode.cpp',
+ 'core/src/fxcrt/fx_xml_composer.cpp',
+ 'core/src/fxcrt/fx_xml_parser.cpp',
+ 'core/src/fxcrt/mem_int.h',
+ 'core/src/fxcrt/plex.h',
+ 'core/src/fxcrt/xml_int.h',
+ ],
+ },
+ {
+ 'target_name': 'fxge',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'core/include/fxge/fpf.h',
+ 'core/include/fxge/fx_dib.h',
+ 'core/include/fxge/fx_font.h',
+ 'core/include/fxge/fx_freetype.h',
+ 'core/include/fxge/fx_ge.h',
+ 'core/include/fxge/fx_ge_apple.h',
+ 'core/include/fxge/fx_ge_win32.h',
+ 'core/src/fxge/agg/include/fxfx_agg_basics.h',
+ 'core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h',
+ 'core/src/fxge/agg/include/fxfx_agg_conv_dash.h',
+ 'core/src/fxge/agg/include/fxfx_agg_conv_stroke.h',
+ 'core/src/fxge/agg/include/fxfx_agg_curves.h',
+ 'core/src/fxge/agg/include/fxfx_agg_path_storage.h',
+ 'core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h',
+ 'core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h',
+ 'core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h',
+ 'core/src/fxge/agg/include/fxfx_agg_scanline_u.h',
+ 'core/src/fxge/agg/include/fx_agg_driver.h',
+ 'core/src/fxge/agg/src/fxfx_agg_curves.cpp',
+ 'core/src/fxge/agg/src/fxfx_agg_driver.cpp',
+ 'core/src/fxge/agg/src/fxfx_agg_path_storage.cpp',
+ 'core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp',
+ 'core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp',
+ 'core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp',
+ 'core/src/fxge/android/fpf_skiafont.cpp',
+ 'core/src/fxge/android/fpf_skiafont.h',
+ 'core/src/fxge/android/fpf_skiafontmgr.cpp',
+ 'core/src/fxge/android/fpf_skiafontmgr.h',
+ 'core/src/fxge/android/fpf_skiamodule.cpp',
+ 'core/src/fxge/android/fpf_skiamodule.h',
+ 'core/src/fxge/android/fx_android_font.cpp',
+ 'core/src/fxge/android/fx_android_font.h',
+ 'core/src/fxge/android/fx_android_imp.cpp',
+ 'core/src/fxge/android/fx_fpf.h',
+ 'core/src/fxge/apple/apple_int.h',
+ 'core/src/fxge/apple/fx_apple_platform.cpp',
+ 'core/src/fxge/apple/fx_mac_imp.cpp',
+ 'core/src/fxge/apple/fx_quartz_device.cpp',
+ 'core/src/fxge/dib/dib_int.h',
+ 'core/src/fxge/dib/fx_dib_composite.cpp',
+ 'core/src/fxge/dib/fx_dib_convert.cpp',
+ 'core/src/fxge/dib/fx_dib_engine.cpp',
+ 'core/src/fxge/dib/fx_dib_main.cpp',
+ 'core/src/fxge/dib/fx_dib_transform.cpp',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitFixed.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSans.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSerif.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c',
+ 'core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c',
+ 'core/src/fxge/fx_freetype/include/fxft_cffobjs.h',
+ 'core/src/fxge/fx_freetype/include/fxft_cfftypes.h',
+ 'core/src/fxge/fx_freetype/include/fxft_freetype.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ft2build.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ftmm.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ftobjs.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ftotval.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ftoutln.h',
+ 'core/src/fxge/fx_freetype/include/fxft_ftstream.h',
+ 'core/src/fxge/fx_freetype/include/fxft_tttables.h',
+ 'core/src/fxge/fx_freetype/include/fxft_tttypes.h',
+ 'core/src/fxge/fx_freetype/src/fxft_cff.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftbase.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftbitmap.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftglyph.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftinit.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftmm.c',
+ 'core/src/fxge/fx_freetype/src/fxft_ftsystem.c',
+ 'core/src/fxge/fx_freetype/src/fxft_psaux.c',
+ 'core/src/fxge/fx_freetype/src/fxft_pshinter.c',
+ 'core/src/fxge/fx_freetype/src/fxft_psmodule.c',
+ 'core/src/fxge/fx_freetype/src/fxft_raster.c',
+ 'core/src/fxge/fx_freetype/src/fxft_sfnt.c',
+ 'core/src/fxge/fx_freetype/src/fxft_smooth.c',
+ 'core/src/fxge/fx_freetype/src/fxft_truetype.c',
+ 'core/src/fxge/fx_freetype/src/fxft_type1.c',
+ 'core/src/fxge/fx_freetype/src/fxft_type1cid.c',
+ 'core/src/fxge/ge/fx_ge.cpp',
+ 'core/src/fxge/ge/fx_ge_device.cpp',
+ 'core/src/fxge/ge/fx_ge_font.cpp',
+ 'core/src/fxge/ge/fx_ge_fontmap.cpp',
+ 'core/src/fxge/ge/fx_ge_linux.cpp',
+ 'core/src/fxge/ge/fx_ge_path.cpp',
+ 'core/src/fxge/ge/fx_ge_ps.cpp',
+ 'core/src/fxge/ge/fx_ge_text.cpp',
+ 'core/src/fxge/ge/text_int.h',
+ ],
+ 'conditions': [
+ ['pdf_use_skia==1', {
+ 'sources': [
+ 'core/src/fxge/skia/fx_skia_blitter_new.cpp',
+ 'core/src/fxge/skia/fx_skia_device.cpp',
+ ],
+ 'dependencies': [
+ '<(DEPTH)/skia/skia.gyp:skia',
+ ],
+ 'include_dirs': [
+ '<(DEPTH)/third_party/skia/include/config',
+ '<(DEPTH)/third_party/skia/include/core',
+ '<(DEPTH)/third_party/skia/include/effects',
+ '<(DEPTH)/third_party/skia/include/images',
+ '<(DEPTH)/third_party/skia/include/lazy',
+ '<(DEPTH)/third_party/skia/include/pathops',
+ '<(DEPTH)/third_party/skia/include/utils',
+ '<(DEPTH)/third_party/skia/src/core',
+ ],
+ }],
+ ['OS=="win"', {
+ 'defines!': [
+ 'NOMINMAX',
+ 'WIN32_LEAN_AND_MEAN'
+ ],
+ 'sources': [
+ 'core/src/fxge/win32/dwrite_int.h',
+ 'core/src/fxge/win32/fx_win32_device.cpp',
+ 'core/src/fxge/win32/fx_win32_dib.cpp',
+ 'core/src/fxge/win32/fx_win32_dwrite.cpp',
+ 'core/src/fxge/win32/fx_win32_gdipext.cpp',
+ 'core/src/fxge/win32/fx_win32_print.cpp',
+ 'core/src/fxge/win32/win32_int.h',
+ ],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'fxedit',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/fxedit/fx_edit.h',
+ 'fpdfsdk/include/fxedit/fxet_edit.h',
+ 'fpdfsdk/include/fxedit/fxet_list.h',
+ 'fpdfsdk/include/fxedit/fxet_stub.h',
+ 'fpdfsdk/src/fxedit/fxet_ap.cpp',
+ 'fpdfsdk/src/fxedit/fxet_edit.cpp',
+ 'fpdfsdk/src/fxedit/fxet_list.cpp',
+ 'fpdfsdk/src/fxedit/fxet_module.cpp',
+ 'fpdfsdk/src/fxedit/fxet_pageobjs.cpp',
+ ],
+ },
+ {
+ 'target_name': 'pdfwindow',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/pdfwindow/IPDFWindow.h',
+ 'fpdfsdk/include/pdfwindow/PDFWindow.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Button.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Caret.h',
+ 'fpdfsdk/include/pdfwindow/PWL_ComboBox.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Edit.h',
+ 'fpdfsdk/include/pdfwindow/PWL_EditCtrl.h',
+ 'fpdfsdk/include/pdfwindow/PWL_FontMap.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Icon.h',
+ 'fpdfsdk/include/pdfwindow/PWL_IconList.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Label.h',
+ 'fpdfsdk/include/pdfwindow/PWL_ListBox.h',
+ 'fpdfsdk/include/pdfwindow/PWL_ListCtrl.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Note.h',
+ 'fpdfsdk/include/pdfwindow/PWL_ScrollBar.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Signature.h',
+ 'fpdfsdk/include/pdfwindow/PWL_SpecialButton.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Utils.h',
+ 'fpdfsdk/include/pdfwindow/PWL_Wnd.h',
+ 'fpdfsdk/src/pdfwindow/PWL_Button.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Caret.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_ComboBox.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Edit.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_EditCtrl.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_FontMap.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Icon.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_IconList.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Label.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_ListBox.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_ListCtrl.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Note.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_ScrollBar.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Signature.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_SpecialButton.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Utils.cpp',
+ 'fpdfsdk/src/pdfwindow/PWL_Wnd.cpp',
+ ],
+ },
+ {
+ 'target_name': 'javascript',
+ 'type': 'static_library',
+ 'include_dirs': [
+ '<(DEPTH)/v8/include',
+ ],
+ 'dependencies': [
+ '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',
+ ],
+ 'export_dependent_settings': [
+ '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',
+ ],
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/javascript/app.h',
+ 'fpdfsdk/include/javascript/color.h',
+ 'fpdfsdk/include/javascript/console.h',
+ 'fpdfsdk/include/javascript/Consts.h',
+ 'fpdfsdk/include/javascript/Document.h',
+ 'fpdfsdk/include/javascript/event.h',
+ 'fpdfsdk/include/javascript/Field.h',
+ 'fpdfsdk/include/javascript/global.h',
+ 'fpdfsdk/include/javascript/Icon.h',
+ 'fpdfsdk/include/javascript/IJavaScript.h',
+ 'fpdfsdk/include/javascript/JavaScript.h',
+ 'fpdfsdk/include/javascript/JS_Console.h',
+ 'fpdfsdk/include/javascript/JS_Context.h',
+ 'fpdfsdk/include/javascript/JS_Define.h',
+ 'fpdfsdk/include/javascript/JS_EventHandler.h',
+ 'fpdfsdk/include/javascript/JS_GlobalData.h',
+ 'fpdfsdk/include/javascript/JS_Module.h',
+ 'fpdfsdk/include/javascript/JS_Object.h',
+ 'fpdfsdk/include/javascript/JS_Runtime.h',
+ 'fpdfsdk/include/javascript/JS_Value.h',
+ 'fpdfsdk/include/javascript/PublicMethods.h',
+ 'fpdfsdk/include/javascript/report.h',
+ 'fpdfsdk/include/javascript/resource.h',
+ 'fpdfsdk/include/javascript/util.h',
+ 'fpdfsdk/src/javascript/app.cpp',
+ 'fpdfsdk/src/javascript/color.cpp',
+ 'fpdfsdk/src/javascript/console.cpp',
+ 'fpdfsdk/src/javascript/Consts.cpp',
+ 'fpdfsdk/src/javascript/Document.cpp',
+ 'fpdfsdk/src/javascript/event.cpp',
+ 'fpdfsdk/src/javascript/Field.cpp',
+ 'fpdfsdk/src/javascript/global.cpp',
+ 'fpdfsdk/src/javascript/Icon.cpp',
+ 'fpdfsdk/src/javascript/JS_Context.cpp',
+ 'fpdfsdk/src/javascript/JS_EventHandler.cpp',
+ 'fpdfsdk/src/javascript/JS_GlobalData.cpp',
+ 'fpdfsdk/src/javascript/JS_Object.cpp',
+ 'fpdfsdk/src/javascript/JS_Runtime.cpp',
+ 'fpdfsdk/src/javascript/JS_Value.cpp',
+ 'fpdfsdk/src/javascript/PublicMethods.cpp',
+ 'fpdfsdk/src/javascript/report.cpp',
+ 'fpdfsdk/src/javascript/util.cpp',
+ ],
+ },
+ {
+ 'target_name': 'jsapi',
+ 'type': 'static_library',
+ 'dependencies': [
+ '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',
+ ],
+ 'export_dependent_settings': [
+ '<(DEPTH)/v8/tools/gyp/v8.gyp:v8',
+ ],
+ 'include_dirs': [
+ '<(DEPTH)/v8/include',
+ ],
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/jsapi/fxjs_v8.h',
+ 'fpdfsdk/src/jsapi/fxjs_v8.cpp',
+ ],
+ },
+ {
+ 'target_name': 'formfiller',
+ 'type': 'static_library',
+ 'ldflags': [ '-L<(PRODUCT_DIR)',],
+ 'sources': [
+ 'fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h',
+ 'fpdfsdk/include/formfiller/FFL_CheckBox.h',
+ 'fpdfsdk/include/formfiller/FFL_ComboBox.h',
+ 'fpdfsdk/include/formfiller/FFL_FormFiller.h',
+ 'fpdfsdk/include/formfiller/FFL_IFormFiller.h',
+ 'fpdfsdk/include/formfiller/FFL_ListBox.h',
+ 'fpdfsdk/include/formfiller/FFL_Notify.h',
+ 'fpdfsdk/include/formfiller/FFL_PushButton.h',
+ 'fpdfsdk/include/formfiller/FFL_RadioButton.h',
+ 'fpdfsdk/include/formfiller/FFL_TextField.h',
+ 'fpdfsdk/include/formfiller/FFL_Utils.h',
+ 'fpdfsdk/include/formfiller/FormFiller.h',
+ 'fpdfsdk/src/formfiller/FFL_CBA_Fontmap.cpp',
+ 'fpdfsdk/src/formfiller/FFL_CheckBox.cpp',
+ 'fpdfsdk/src/formfiller/FFL_ComboBox.cpp',
+ 'fpdfsdk/src/formfiller/FFL_FormFiller.cpp',
+ 'fpdfsdk/src/formfiller/FFL_IFormFiller.cpp',
+ 'fpdfsdk/src/formfiller/FFL_ListBox.cpp',
+ 'fpdfsdk/src/formfiller/FFL_Notify.cpp',
+ 'fpdfsdk/src/formfiller/FFL_PushButton.cpp',
+ 'fpdfsdk/src/formfiller/FFL_RadioButton.cpp',
+ 'fpdfsdk/src/formfiller/FFL_TextField.cpp',
+ 'fpdfsdk/src/formfiller/FFL_Utils.cpp',
+ ],
+ },
+ ],
+ 'conditions': [
+ ['OS=="mac" or OS=="linux"', {
+ 'targets': [
+ {
+ 'target_name': 'gcctest',
+ 'type': 'executable',
+ 'dependencies': [
+ 'fpdfsdk',
+ ],
+ 'conditions': [
+ ['OS=="mac"', {
+ 'link_settings': {
+ 'libraries': [
+ '$(SDKROOT)/System/Library/Frameworks/Carbon.framework',
+ ],
+ },
+ }],
+ ],
+ 'sources': [
+ 'test/gcctest.cpp',
+ ],
+ }
+ ],
+ }],
+ ],
+}
+